mongo-c-driver-2.2.1/000077500000000000000000000000001511661753600143575ustar00rootroot00000000000000mongo-c-driver-2.2.1/.clang-format000066400000000000000000000224171511661753600167400ustar00rootroot00000000000000--- # Note: the "Language" option is omitted to apply this format style to all files # regardless of the detected language. AccessModifierOffset: -2 AlignAfterOpenBracket: Align AlignArrayOfStructures: None AlignConsecutiveAssignments: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: true AlignConsecutiveBitFields: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveDeclarations: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: true AlignFunctionPointers: false PadOperators: false AlignConsecutiveMacros: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveShortCaseStatements: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCaseArrows: false AlignCaseColons: false AlignConsecutiveTableGenBreakingDAGArgColons: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveTableGenCondOperatorColons: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignConsecutiveTableGenDefinitionColons: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionDeclarations: false AlignFunctionPointers: false PadOperators: false AlignEscapedNewlines: Left AlignOperands: Align AlignTrailingComments: Kind: Always OverEmptyLines: 0 AllowAllArgumentsOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true AllowBreakBeforeNoexceptSpecifier: Never AllowShortBlocksOnASingleLine: Never AllowShortCaseExpressionOnASingleLine: true AllowShortCaseLabelsOnASingleLine: false AllowShortCompoundRequirementOnASingleLine: true AllowShortEnumsOnASingleLine: true AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: Never AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: false AllowShortNamespacesOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakBeforeMultilineStrings: false AttributeMacros: - __capability - BSON_GNUC_WARN_UNUSED_RESULT - BSON_DEPRECATED - BSON_DEPRECATED_FOR BinPackArguments: false BinPackParameters: false BitFieldColonSpacing: Both BraceWrapping: AfterCaseLabel: false AfterClass: false AfterControlStatement: Never AfterEnum: false AfterExternBlock: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false BeforeCatch: false BeforeElse: false BeforeLambdaBody: false BeforeWhile: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakAdjacentStringLiterals: true BreakAfterAttributes: Never BreakAfterJavaFieldAnnotations: false BreakAfterReturnType: All BreakArrays: true BreakBeforeBinaryOperators: None BreakBeforeConceptDeclarations: Always BreakBeforeBraces: Linux BreakBeforeInlineASMColon: OnlyMultiline BreakBeforeTernaryOperators: true BreakBinaryOperations: Never BreakConstructorInitializers: BeforeColon BreakFunctionDefinitionParameters: false BreakInheritanceList: BeforeColon BreakStringLiterals: true BreakTemplateDeclarations: MultiLine ColumnLimit: 120 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 3 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false EmptyLineAfterAccessModifier: Never EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH - mlib_foreach_irange - mlib_foreach_urange - mlib_foreach - mlib_foreach_arr - mlib_vec_foreach IfMacros: - mlib_assert_aborts - KJ_IF_MAYBE IncludeBlocks: Regroup IncludeCategories: # The prelude header must always come first - Regex: '-prelude\.h>' Priority: 1 # Relative "in this directory" headers next - Regex: '"\./|"\.\./' Priority: 2 # Private API headers - Regex: '-private\.h>' Priority: 5 # All other `mongoc/` headers - Regex: '' Priority: 90 # Darwin platform headers - Regex: '<(Availability|AvailabilityMacros|TargetConditionals|CommonCrypto/.*|Security/.*|CoreFoundation/.*)\.h>' CaseSensitive: false Priority: 90 # Windows platform headers - Regex: '<(win(dows|sock2|error|trnl|error|crypt|ver|dns)|sspi|ws2tcpip|ntstatus|mstcpip|process)\.h>' CaseSensitive: false Priority: 90 # Standard library headers are near last - Regex: '<(assert|string|ctype|limits|time|math|errno|inttypes|signal).h>|' Priority: 100 # Other -I headers get sorted before platform headers - Regex: '<' Priority: 80 IncludeIsMainRegex: '(Test)?$' IncludeIsMainSourceRegex: '' IndentAccessModifiers: false IndentCaseBlocks: false IndentCaseLabels: false IndentExportBlock: true IndentExternBlock: AfterExternBlock IndentGotoLabels: true IndentPPDirectives: None IndentRequiresClause: true IndentWidth: 3 IndentWrappedFunctionNames: false InsertBraces: false InsertNewlineAtEOF: false InsertTrailingCommas: None IntegerLiteralSeparator: Binary: 0 BinaryMinDigits: 0 Decimal: 0 DecimalMinDigits: 0 Hex: 0 HexMinDigits: 0 JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLines: AtEndOfFile: false AtStartOfBlock: false AtStartOfFile: false KeepFormFeed: false LambdaBodyIndentation: Signature LineEnding: DeriveLF MacroBlockBegin: '' MacroBlockEnd: '' MainIncludeChar: AngleBracket MaxEmptyLinesToKeep: 2 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 2 ObjCBreakBeforeNestedBlockParam: true ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true PackConstructorInitializers: BinPack PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakBeforeMemberAccess: 150 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakOpenParenthesis: 0 PenaltyBreakScopeResolution: 500 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyIndentedWhitespace: 0 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Right PPIndentWidth: -1 QualifierAlignment: Leave ReferenceAlignment: Pointer ReflowComments: Always RemoveBracesLLVM: false RemoveEmptyLinesInUnwrappedLines: false RemoveParentheses: Leave RemoveSemicolon: false RequiresClausePosition: OwnLine RequiresExpressionIndentation: OuterScope SeparateDefinitionBlocks: Leave ShortNamespaceLines: 1 SkipMacroDefinitionBody: false SortIncludes: CaseSensitive SortJavaStaticImport: Before SortUsingDeclarations: LexicographicNumeric SpaceAfterCStyleCast: false SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: true SpaceAroundPointerQualifiers: Default SpaceBeforeAssignmentOperators: true SpaceBeforeCaseColon: false SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeJsonColon: false SpaceBeforeParens: Custom SpaceBeforeParensOptions: AfterControlStatements: true AfterForeachMacros: true AfterFunctionDefinitionName: false AfterFunctionDeclarationName: false AfterIfMacros: true AfterOverloadedOperator: false AfterPlacementOperator: false AfterRequiresInClause: false AfterRequiresInExpression: false BeforeNonEmptyParentheses: false SpaceBeforeRangeBasedForLoopColon: true SpaceBeforeSquareBrackets: false SpaceInEmptyBlock: false SpacesBeforeTrailingComments: 1 SpacesInAngles: Never SpacesInContainerLiterals: true SpacesInLineCommentPrefix: Minimum: 1 Maximum: -1 SpacesInParens: Never SpacesInParensOptions: ExceptDoubleParentheses: false InCStyleCasts: false InConditionalStatements: false InEmptyParentheses: false Other: false SpacesInSquareBrackets: false Standard: Cpp11 StatementAttributeLikeMacros: - Q_EMIT StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION TableGenBreakInsideDAGArg: DontBreak TabWidth: 3 UseTab: Never VerilogBreakBetweenInstancePorts: true WhitespaceSensitiveMacros: - BOOST_PP_STRINGIZE - CF_SWIFT_NAME - NS_SWIFT_NAME - PP_STRINGIZE - STRINGIZE WrapNamespaceBodyWithEmptyLines: Leave ... mongo-c-driver-2.2.1/.evergreen/000077500000000000000000000000001511661753600164175ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/.codecov.yml000066400000000000000000000001411511661753600206360ustar00rootroot00000000000000ignore: - "src/kms-message" - "src/zlib-*" - "src/libbson/tests" - "src/libmongoc/tests" mongo-c-driver-2.2.1/.evergreen/benchmark.yml000066400000000000000000000223121511661753600210740ustar00rootroot00000000000000####################################### # C Benchmark Tests # ####################################### ####################################### # Variables # ####################################### variables: ## Task list benchmark_compile: &benchmark_compile - name: "compile" benchmark_test_list: &benchmark_tests - name: "BenchMarkTests" ## Common download urls (merge in as hashes) mongo_download_url_prefixes: mongo_v60_perf: &mongo_v60_perf mongo_url: "https://downloads.mongodb.com/linux/mongodb-linux-x86_64-enterprise-rhel90-6.0.6.tgz" ## Common sets of CFLAGS cflags: standard: &cflags_64 cflags: "-m64 -march=x86-64" ## Scripts that are shared between buildvariants scripts: compile: unix: &compile_unix compile_script: | set -o errexit set -o verbose cmake -DENABLE_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=mongoc . && make -j8 && make install git clone https://github.com/mongodb/mongo-c-driver-performance.git cd mongo-c-driver-performance cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=../mongoc . && make -j8 mongodb: start_mongod_command: &start_mongod_command start_mongod: | set -o errexit set -o verbose mkdir db echo "Starting Mongodb" ./mongodb/bin/mongod --dbpath `pwd`/db --logpath `pwd`/db/db.log --fork benchmark_common: &benchmark_common <<: [ *compile_unix, *start_mongod_command ] ####################################### # Functions # ####################################### functions: "compile function" : command: shell.exec params: working_dir: "mongo-c-driver" script: | export PATH=${extra_path}:$PATH export CFLAGS="${cflags}" ${compile_script} "fetch source" : command: git.get_project params: directory: "mongo-c-driver" "fetch artifacts" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit rm -rf mongo-c-driver* curl --retry 5 http://s3.amazonaws.com/mciuploads/mongo-c-driver/${compile_variant}/${revision}/artifacts/${file}.tar.gz -o c-perf-binaries.tar.gz -sS --max-time 120 ${decompress} c-perf-binaries.tar.gz rm c-perf-binaries.tar.gz "fetch mongodb" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit curl --retry 5 -s ${mongo_url} --output mongo-archive.${ext|tgz} ${decompress} mongo-archive.${ext|tgz} mv mongodb* mongodb chmod +x ./mongodb/bin/mongod${extension} "fetch driver test data" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o verbose set -o errexit curl --retry 5 https://s3.amazonaws.com/boxes.10gen.com/build/driver-test-data.tar.gz -o driver-test-data.tar.gz -sS --max-time 120 ${decompress} driver-test-data.tar.gz "run benchmark tests" : command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o errexit set -o verbose result=-1 # Negative one. ulimit -c unlimited || true # Run this function on exit. done=false finish () { set +o errexit if [ "$done" = false ]; then # There was an error. echo "something went wrong, killing mongod and exiting" killall -9 mongod fi exit $result } trap finish EXIT echo "Starting mongod" ${start_mongod} sleep 15 echo "Running Benchmark tests " start_time=$(date +%s) # rhel90 installs into lib64 LD_LIBRARY_PATH=`pwd`/mongoc/lib64:$LD_LIBRARY_PATH ./mongo-c-driver-performance/mongo-c-performance ./data set +o errexit result=$? cat results.json result=$? end_time=$(date +%s) elapsed_secs=$((end_time-start_time)) if [ $result -eq 0 ]; then status='"pass"' failures=0 else status='"fail"' failures=1 fi echo "{\"failures\": $failures, \"results\": [{\"status\": $status, \"exit_code\": $result, \"test_file\": \"BenchMarkTests\", \"start\": $start_time, \"end\": $end_time, \"elapsed\": $elapsed_secs}]}" > report.json cat report.json set +o errexit killall -9 mongod done=true exit $result "attach benchmark test results" : command: attach.results params: file_location: mongo-c-driver/report.json "send dashboard data" : # Here we begin to generate the request to send the data to Signal Processing Service (SPS) - command: shell.exec params: script: | # We use the requester expansion to determine whether the data is from a mainline evergreen run or not if [ "${requester}" == "commit" ]; then echo "is_mainline: true" >> expansion.yml else echo "is_mainline: false" >> expansion.yml fi # We parse the username out of the order_id as patches append that in and SPS does not need that information echo "parsed_order_id: $(echo "${revision_order_id}" | awk -F'_' '{print $NF}')" >> expansion.yml - command: expansions.update params: file: expansion.yml - command: shell.exec params: script: | # Submit the performance data to the SPS endpoint response=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X 'POST' \ "https://performance-monitoring-api.corp.mongodb.com/raw_perf_results/cedar_report?project=${project_id}&version=${version_id}&variant=${build_variant}&order=${parsed_order_id}&task_name=${task_name}&task_id=${task_id}&execution=${execution}&mainline=${is_mainline}" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d @mongo-c-driver/results.json) http_status=$(echo "$response" | grep "HTTP_STATUS" | awk -F':' '{print $2}') response_body=$(echo "$response" | sed '/HTTP_STATUS/d') # We want to throw an error if the data was not successfully submitted if [ "$http_status" -ne 200 ]; then echo "Error: Received HTTP status $http_status" echo "Response Body: $response_body" exit 1 fi echo "Response Body: $response_body" echo "HTTP Status: $http_status" "backtrace": - command: shell.exec params: working_dir: "mongo-c-driver" script: | echo "Debugging core files" shopt -s nullglob for i in *core*; do echo $i echo "backtrace full" | gdb -q ./mongo-c-driver-performance/mongo-c-performance $i done pre: # Remove and recreate old directory - command: shell.exec params: script: | rm -rf mongo-c-driver mkdir mongo-c-driver post: - func: "backtrace" # Remove and recreate old directory - command: shell.exec params: script: | rm -rf mongo-c-driver mkdir mongo-c-driver ####################################### # Tasks # ####################################### tasks: - name: compile commands: - func: "fetch source" - command: git.apply_patch params: directory: "mongo-c-driver" - func: "compile function" - command: shell.exec params: working_dir: "mongo-c-driver" script: | set -o errexit set -o verbose tar czf ../mongo-c-driver.tar.gz . - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} local_file: mongo-c-driver.tar.gz remote_file: mongo-c-driver/${build_variant}/${revision}/artifacts/${file}.tar.gz bucket: mciuploads permissions: public-read content_type: ${content_type|application/x-gzip} - name: BenchMarkTests depends_on: - variant: c-driver-benchmark-compile name: compile commands: - func: "fetch artifacts" - func: "fetch mongodb" - func: "fetch driver test data" - func: "run benchmark tests" - func: "attach benchmark test results" - func: "send dashboard data" ####################################### # Buildvariants # ####################################### buildvariants: - name: c-driver-benchmark-compile display_name: "C Driver Benchmark Compile" expansions: <<: [ *cflags_64, *mongo_v60_perf, *benchmark_common ] file: c-binaries-rhel90 run_on: - rhel90-dbx-perf-large tasks: *benchmark_compile - name: c-driver-benchmark-mongo60_perf display_name: "C Driver Benchmark Mongo 6.0" expansions: <<: [ *cflags_64, *mongo_v60_perf, *benchmark_common ] file: c-binaries-rhel90 compile_variant: c-driver-benchmark-compile run_on: - rhel90-dbx-perf-large tasks: *benchmark_tests mongo-c-driver-2.2.1/.evergreen/config.yml000066400000000000000000000032131511661753600204060ustar00rootroot00000000000000# Default timeout for all tasks is 1 hour. # May be overridden by individual tasks. exec_timeout_secs: 3600 # Default command type is 'system' to indicate failures unrelated to tests or # their setup. Most commands should define their type as 'setup' or 'test'. # - setup: before test (lavendar). # - test: during test (red). # - system: after test (purple). command_type: system # Ensure Evergreen tests earlier commits when a task fails. stepback: true # Ensure failure in pre commands is also considered task failure. pre_error_fails_task: true # Too many post commands are not designed to handle errors. # TODO: set to true once failing post commands have been moved into # teardown_group commands of appropriate task groups. post_error_fails_task: false # TODO: move into timeout commands of appropriate task groups. timeout: - func: backtrace # Commands run before all tasks (excluding those in task groups). # Use sparingly and ensure they are error-proof. pre: - func: fetch-source # Commands run after all tasks (excluding those in task groups). # Use sparingly and ensure they are error-proof. # TODO: move into teardown_group commands of appropriate task groups. post: - func: backtrace - func: upload-mo-artifacts - func: upload-test-results - func: stop-mongo-orchestration - func: stop-load-balancer - func: restore-instance-profile include: - filename: .evergreen/generated_configs/legacy-config.yml - filename: .evergreen/generated_configs/functions.yml - filename: .evergreen/generated_configs/task_groups.yml - filename: .evergreen/generated_configs/tasks.yml - filename: .evergreen/generated_configs/variants.yml mongo-c-driver-2.2.1/.evergreen/config_generator/000077500000000000000000000000001511661753600217325ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/README.md000066400000000000000000000022141511661753600232100ustar00rootroot00000000000000# Generating the Evergreen Configuration Files The scripts in this directory are used to generate the Evergreen configuration files stored in `.evergreen/generated_configs/`. The easiest way to execute these scripts is to use [uv](https://docs.astral.sh/uv/) to run the scripts. **Note**: These scripts require Python 3.10 or newer. ## Setting Up `uv` is required to run Python scripts. See ["Installing uv"](https://docs.astral.sh/uv/getting-started/installation/) for instructions on how to obtain `uv`. ## Running the Generator The package provides the `mc-evg-generate` [entry point](https://packaging.python.org/en/latest/specifications/entry-points): ```sh uv run --frozen mc-evg-generate ``` This command will ready the generation files and generate a new set of Evergreen configs in `.evergreen/config_generator/generated_configs`. The `mc-evg-generate` command executes `main` function defined in `config_generator/generate.py`. ## Modifying the Configs To modify the Evergreen configuration, update the Python scripts within the `etc/`, `config_generator/`, and `legacy_config_generator/` directories, and execute `mc-evg-generate` again. mongo-c-driver-2.2.1/.evergreen/config_generator/components/000077500000000000000000000000001511661753600241175ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/components/abi_compliance_check.py000066400000000000000000000042541511661753600305600ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, s3_put from shrub.v3.evg_task import EvgTask from config_generator.components.funcs.set_cache_dir import SetCacheDir from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CheckABICompliance(Function): name = 'abi-compliance-check' commands = SetCacheDir.commands + [ bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', include_expansions_in_env=['MONGO_C_DRIVER_CACHE_DIR'], script='.evergreen/scripts/abi-compliance-check-setup.sh', ), bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', include_expansions_in_env=['MONGO_C_DRIVER_CACHE_DIR'], script='.evergreen/scripts/abi-compliance-check.sh', ), s3_put( command_type=EvgCommandType.SYSTEM, aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='ABI Compliance Check: ', local_files_include_filter='abi-compliance/compat_reports/**/compat_report.html', permissions='public-read', remote_file='${project}/${branch_name}/${revision}/${version_id}/${build_id}/${task_id}/${execution}/abi-compliance-check/', ), s3_put( command_type=EvgCommandType.SYSTEM, aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/plain', display_name='ABI Compliance Check: ', local_files_include_filter='abi-compliance/logs/**/log.txt', permissions='public-read', remote_file='${project}/${branch_name}/${revision}/${version_id}/${build_id}/${task_id}/${execution}/abi-compliance-check/', ), ] def functions(): return CheckABICompliance.defn() def tasks(): return [ EvgTask( name=CheckABICompliance.name, commands=[ CheckABICompliance.call(), ], ) ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/c_std_compile.py000066400000000000000000000070271511661753600273030ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.etc.distros import compiler_to_vars, find_large_distro, make_distro_str from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec TAG = 'std-matrix' # pylint: disable=line-too-long # fmt: off MATRIX = [ ('rhel80', 'clang', None, [99, 11, 17, ]), # Clang 7.0 ('rhel84', 'clang', None, [99, 11, 17, 23]), # Clang 11.0 (max: C2x) ('ubuntu2204', 'clang-12', None, [99, 11, 17, 23]), # Clang 12.0 (max: C2x) ('rhel90', 'clang', None, [99, 11, 17, 23]), # Clang 13.0 (max: C2x) ('rhel91', 'clang', None, [99, 11, 17, 23]), # Clang 14.0 (max: C2x) ('rhel92', 'clang', None, [99, 11, 17, 23]), # Clang 15.0 (max: C2x) ('rhel93', 'clang', None, [99, 11, 17, 23]), # Clang 16.0 (max: C2x) ('rhel94', 'clang', None, [99, 11, 17, 23]), # Clang 17.0 (max: C2x) ('rhel95', 'clang', None, [99, 11, 17, 23]), # Clang 18.0 (max: C23) ('rhel7-latest', 'gcc', None, [99, 11, ]), # GCC 4.8 (max: C11) ('rhel80', 'gcc', None, [99, 11, 17, ]), # GCC 8.2 (max: C17) ('rhel84', 'gcc', None, [99, 11, 17, ]), # GCC 8.4 (max: C17) ('debian11-latest', 'gcc-10', None, [99, 11, 17, 23]), # GCC 10.2 (max: C2x) ('rhel90', 'gcc', None, [99, 11, 17, 23]), # GCC 11.2 (max: C2x) ('rhel92', 'gcc', None, [99, 11, 17, 23]), # GCC 11.3 (max: C2x) ('rhel94', 'gcc', None, [99, 11, 17, 23]), # GCC 11.4 (max: C2x) ('rhel95', 'gcc', None, [99, 11, 17, 23]), # GCC 11.5 (max: C2x) ('ubuntu2404', 'gcc-13', None, [99, 11, 17, 23]), # GCC 13.3 (max: C2x) ('macos-14-arm64', 'clang', None, [99, 11, 17, 23]), # Apple Clang ('windows-vsCurrent', 'vs2017x64', None, [99, 11, ]), # Max: C11 ('windows-vsCurrent', 'vs2019x64', None, [99, 11, 17]), # Max: C17 ('windows-vsCurrent', 'vs2022x64', None, [99, 11, 17]), # Max: C17 ] # fmt: on # pylint: enable=line-too-long class StdCompile(Function): name = 'std-compile' commands = [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/compile-std.sh', ), ] def functions(): return StdCompile.defn() def tasks(): res = [] for distro_name, compiler, arch, stds in MATRIX: compiler_type = compiler.split('-')[0] tags = [TAG, distro_name, compiler_type, 'compile'] distro = find_large_distro(distro_name) compile_vars = None compile_vars = compiler_to_vars(compiler) if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) distro_str = make_distro_str(distro_name, compiler_type, arch) for std in stds: with_std = {'C_STD_VERSION': std} task_name = f'std-c{std}-{distro_str}-compile' res.append( EvgTask( name=task_name, run_on=distro.name, tags=tags + [f'std-c{std}'], commands=[StdCompile.call(vars=compile_vars | with_std)], ) ) return res def variants(): return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/check_mongoc_public_headers.py000066400000000000000000000015241511661753600321430ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CheckMongocPublicHeaders(Function): name = 'check-headers' commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/check-public-decls.sh', ), bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/check-preludes.py .', ), ] def functions(): return CheckMongocPublicHeaders.defn() def tasks(): return [ EvgTask( name=CheckMongocPublicHeaders.name, commands=[CheckMongocPublicHeaders.call()], ) ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/clang_format.py000066400000000000000000000020701511661753600271240ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.etc.distros import find_small_distro from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec TAG = 'clang-format' class ClangFormat(Function): name = TAG commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', env={ 'DRYRUN': '1', }, script='uv run --frozen --only-group=format tools/format.py --mode=check', ), ] def functions(): return ClangFormat.defn() def tasks(): yield EvgTask( name=TAG, tags=[TAG], commands=[ ClangFormat.call(), ], ) def variants(): return [ BuildVariant( name=TAG, display_name=TAG, run_on=[find_small_distro('ubuntu2204').name], tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/cse/000077500000000000000000000000001511661753600246715ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/components/cse/darwinssl.py000066400000000000000000000034561511661753600272610ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks SSL = 'darwinssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('macos-14-arm64', 'clang', None, ['cyrus']), ('macos-14', 'clang', None, ['cyrus']), ] # QE (subset of CSFLE) requires 7.0+ and are skipped by "server" tasks. TEST_MATRIX = [ # Prefer macos-14-arm64 which is less resource-limited than macos-14. Provides 6.0+. ('macos-14-arm64', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['6.0', '7.0', '8.0', 'latest']), # Pre-6.0 coverage. Resource-limited: use sparingly. ('macos-14', 'clang', None, 'cyrus', ['auth'], ['sharded'], ['4.2', '4.4', '5.0']), ] # fmt: on # pylint: enable=line-too-long class DarwinSSLCompileCommon(CompileCommon): ssl = 'DARWIN' class SaslCyrusDarwinSSLCompile(DarwinSSLCompileCommon): name = 'cse-sasl-cyrus-darwinssl-compile' commands = DarwinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return SaslCyrusDarwinSSLCompile.defn() def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusDarwinSSLCompile, } MORE_TAGS = ['cse'] res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/cse/openssl.py000066400000000000000000000065721511661753600267400ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks from config_generator.etc.function import merge_defns from config_generator.etc.utils import TaskRef SSL = 'openssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ # For test matrix. ('rhel8-latest', 'gcc', None, ['cyrus']), ('rhel8-arm64-latest', 'gcc', None, ['cyrus']), ('rhel8-zseries', 'gcc', None, ['cyrus']), # Big Endian. ('windows-vsCurrent', 'vs2022x64', None, ['cyrus']), # For compile only. ('debian11-latest', 'clang', None, ['cyrus']), ('debian11-latest', 'gcc', None, ['cyrus']), ('debian12-latest', 'clang', None, ['cyrus']), ('debian12-latest', 'gcc', None, ['cyrus']), ('rhel80', 'gcc', None, ['cyrus']), ('ubuntu2204', 'gcc', None, ['cyrus']), ('ubuntu2204', 'clang-12', None, ['cyrus']), ('ubuntu2404', 'gcc', None, ['cyrus']), ('ubuntu2404', 'clang-14', None, ['cyrus']), ] # QE (subset of CSFLE) requires 7.0+ and are skipped by "server" tasks. TEST_MATRIX = [ ('rhel8-latest', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), # rhel8-arm64 only provides 4.4+. ('rhel8-arm64-latest', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), # rhel8-zseries only provides 5.0+. Resource-limited: use sparingly. ('rhel8-zseries', 'gcc', None, 'cyrus', ['auth'], ['sharded'], ['5.0', 'latest']), ('windows-vsCurrent', 'vs2022x64', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class OpenSSLCompileCommon(CompileCommon): ssl = 'OPENSSL' class SaslCyrusOpenSSLCompile(OpenSSLCompileCommon): name = 'cse-sasl-cyrus-openssl-compile' commands = OpenSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusOpenSSLCompile.defn(), ) SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } MORE_TAGS = ['cse'] TASKS = [ *generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS), *generate_test_tasks(SSL, TAG, TEST_MATRIX), ] def tasks(): res = TASKS.copy() # PowerPC and zSeries are limited resources. for task in res: if any(pattern in task.run_on for pattern in ['power', 'zseries']): task.patchable = False return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', } tasks = [] # PowerPC and zSeries are limited resources. for task in TASKS: if any(pattern in task.run_on for pattern in ['power', 'zseries']): tasks.append( TaskRef( name=task.name, batchtime=1440, # 1 day ) ) else: tasks.append(task.get_task_ref()) tasks.sort(key=lambda t: t.name) return [ BuildVariant( name=TAG, display_name=TAG, tasks=tasks, expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/cse/winssl.py000066400000000000000000000030351511661753600265630ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.cse.compile import CompileCommon from config_generator.etc.cse.test import generate_test_tasks SSL = 'winssl' TAG = f'cse-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('windows-vsCurrent', 'vs2022x64', None, ['cyrus']), ] # QE (subset of CSFLE) requires 7.0+ and are skipped by "server" tasks. TEST_MATRIX = [ ('windows-vsCurrent', 'vs2022x64', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class WinSSLCompileCommon(CompileCommon): ssl = 'WINDOWS' class SaslCyrusWinSSLCompile(WinSSLCompileCommon): name = 'cse-sasl-cyrus-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return SaslCyrusWinSSLCompile.defn() def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusWinSSLCompile, } MORE_TAGS = ['cse'] res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = { 'CLIENT_SIDE_ENCRYPTION': 'on', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/earthly.py000066400000000000000000000247331511661753600261520ustar00rootroot00000000000000from __future__ import annotations import functools import re from typing import Iterable, Literal, Mapping, NamedTuple, TypeVar from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import ( BuiltInCommand, EvgCommandType, KeyValueParam, ec2_assume_role, expansions_update, subprocess_exec, ) from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.etc.function import Function from ..etc.utils import all_possible T = TypeVar('T') _ENV_PARAM_NAME = 'MONGOC_EARTHLY_ENV' _CC_PARAM_NAME = 'MONGOC_EARTHLY_C_COMPILER' 'The name of the EVG expansion for the Earthly c_compiler argument' EnvKey = Literal[ 'u20', 'u22', 'almalinux8', 'almalinux9', 'almalinux10', 'alpine3.19', 'alpine3.20', 'alpine3.21', 'alpine3.22', 'archlinux', 'centos9', 'centos10', ] "Identifiers for environments. These correspond to special 'env.*' targets in the Earthfile." CompilerName = Literal['gcc', 'clang'] 'The name of the compiler program that is used for the build. Passed via --c_compiler to Earthly.' # Other options: SSPI (Windows only), AUTO (not reliably test-able without more environments) SASLOption = Literal['Cyrus', 'off'] 'Valid options for the SASL configuration parameter' TLSOption = Literal['OpenSSL', 'off'] "Options for the TLS backend configuration parameter (AKA 'ENABLE_SSL')" CxxVersion = Literal['master', 'r4.1.0', 'none'] 'C++ driver refs that are under CI test' # A separator character, since we cannot use whitespace _SEPARATOR = '\N{NO-BREAK SPACE}\N{BULLET}\N{NO-BREAK SPACE}' def os_split(env: EnvKey) -> tuple[str, None | str]: """Convert the environment key into a pretty name+version pair""" match env: # Match 'alpine3.18' 'alpine53.123' etc. case alp if mat := re.match(r'alpine(\d+\.\d+)', alp): return ('Alpine', mat[1]) case 'archlinux': return 'ArchLinux', None # Match 'u22', 'u20', 'u71' etc. case ubu if mat := re.match(r'u(\d\d)', ubu): return 'Ubuntu', f'{mat[1]}.04' # Match 'centos9', 'centos10', etc. case cent if mat := re.match(r'centos(\d+)', cent): return 'CentOS', f'{mat[1]}' # Match 'almalinux8', 'almalinux10', etc. case alm if mat := re.match(r'almalinux(\d+)', alm): return 'AlmaLinux', f'{mat[1]}' case _: raise ValueError(f'Failed to split OS env key {env=} into a name+version pair (unrecognized)') class EarthlyVariant(NamedTuple): """ Define a "variant" that runs under a set of Earthly parameters. These are turned into real EVG variants later on. The Earthly arguments are passed via expansion parameters. """ env: EnvKey c_compiler: CompilerName @property def display_name(self) -> str: """The pretty name for this variant""" base: str match os_split(self.env): case name, None: base = name case name, version: base = f'{name} {version}' toolchain: str match self.c_compiler: case 'clang': toolchain = 'LLVM/Clang' case 'gcc': toolchain = 'GCC' return f'{base} ({toolchain})' @property def task_selector_tag(self) -> str: """ The task tag that is used to select the tasks that want to run on this variant. """ return f'{self.env}-{self.c_compiler}' @property def expansions(self) -> Mapping[str, str]: """ Expansion values that are defined for the build variant that is generated from this object. """ return { _CC_PARAM_NAME: self.c_compiler, _ENV_PARAM_NAME: self.env, } def as_evg_variant(self) -> BuildVariant: return BuildVariant( name=f'{self.task_selector_tag}', tasks=[EvgTaskRef(name=f'.{self.task_selector_tag}')], display_name=self.display_name, expansions=dict(self.expansions), ) class Configuration(NamedTuple): """ Represent a complete set of argument values to give to the Earthly task execution. Each field name matches the ARG in the Earthfile. Adding/removing fields will add/remove dimensions on the task matrix. Some Earthly parameters are not encoded here, but are rather part of the variant (EarthlyVariant). """ sasl: SASLOption tls: TLSOption test_mongocxx_ref: CxxVersion @property def suffix(self) -> str: return _SEPARATOR.join(f'{k}={v}' for k, v in self._asdict().items()) # Authenticate with DevProd-provided Amazon ECR instance to use as pull-through cache for DockerHub. class DockerLoginAmazonECR(Function): name = 'docker-login-amazon-ecr' commands = [ # Avoid inadvertently using a pre-existing and potentially conflicting Docker config. expansions_update(updates=[KeyValueParam(key='DOCKER_CONFIG', value='${workdir}/.docker')]), ec2_assume_role(role_arn='arn:aws:iam::901841024863:role/ecr-role-evergreen-ro'), subprocess_exec( binary='bash', command_type=EvgCommandType.SETUP, include_expansions_in_env=[ 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'DOCKER_CONFIG', ], args=[ '-c', 'aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 901841024863.dkr.ecr.us-east-1.amazonaws.com', ], ), ] def task_filter(env: EarthlyVariant, conf: Configuration) -> bool: """ Control which tasks are actually defined by matching on the platform and configuration values. """ match env, conf: # Anything else: Allow it to run: case _: return True def variants_for(config: Configuration) -> Iterable[EarthlyVariant]: """Get all Earthly variants that are not excluded for the given build configuration""" all_envs = all_possible(EarthlyVariant) allow_env_for_config = functools.partial(task_filter, conf=config) return filter(allow_env_for_config, all_envs) def earthly_exec( *, kind: Literal['test', 'setup', 'system'], target: str, secrets: Mapping[str, str] | None = None, args: Mapping[str, str] | None = None, ) -> BuiltInCommand: """Create a subprocess_exec command that runs Earthly with the given arguments""" env: dict[str, str] = {k: v for k, v in (secrets or {}).items()} return subprocess_exec( './tools/earthly.sh', args=[ # Use Amazon ECR as pull-through cache for DockerHub to avoid rate limits. '--buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3', *(f'--secret={k}' for k in (secrets or ())), f'+{target}', # Use Amazon ECR as pull-through cache for DockerHub to avoid rate limits. '--default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub', *(f'--{arg}={val}' for arg, val in (args or {}).items()), ], command_type=EvgCommandType(kind), include_expansions_in_env=['DOCKER_CONFIG'], env=env if env else None, working_dir='mongoc', ) def earthly_task( *, name: str, targets: Iterable[str], config: Configuration, ) -> EvgTask | None: """ Create an EVG task which executes earthly using the given parameters. If this function returns `None`, then the task configuration is excluded from executing and no task should be defined. """ # Attach tags to the task to allow build variants to select # these tasks by the environment of that variant. env_tags = sorted(e.task_selector_tag for e in sorted(variants_for(config))) if not env_tags: # All environments have been excluded for this configuration. This means # the task itself should not be run: return # Generate the build-arg arguments based on the configuration options. The # NamedTuple field names must match with the ARG keys in the Earthfile! earthly_args = config._asdict() earthly_args |= { # Add arguments that come from parameter expansions defined in the build variant 'env': f'${{{_ENV_PARAM_NAME}}}', 'c_compiler': f'${{{_CC_PARAM_NAME}}}', } return EvgTask( name=name, commands=[ DockerLoginAmazonECR.call(), # First, just build the "env-warmup" which will prepare the build environment. # This won't generate any output, but allows EVG to track it as a separate build step # for timing and logging purposes. The subequent build step will cache-hit the # warmed-up build environments. earthly_exec( kind='setup', target='env-warmup', args=earthly_args, ), # Now execute the main tasks: earthly_exec( kind='test', target='run', # The "targets" arg is for +run to specify which targets to run args={'targets': ' '.join(targets)} | earthly_args, ), ], # type: ignore (The type annots on `commands` is wrong) tags=['earthly', 'pr-merge-gate', *env_tags], run_on=CONTAINER_RUN_DISTROS, ) CONTAINER_RUN_DISTROS = [ 'amazon2', 'debian11-latest-large', 'debian12-latest-large', 'ubuntu2204-large', 'ubuntu2404-large', ] def functions(): return DockerLoginAmazonECR.defn() def tasks() -> Iterable[EvgTask]: for conf in all_possible(Configuration): # test-example is a target in all configurations targets = ['test-example'] # test-cxx-driver is only a target in configurations with specified mongocxx versions if conf.test_mongocxx_ref != 'none': targets.append('test-cxx-driver') task = earthly_task( name=f'check:{conf.suffix}', targets=targets, config=conf, ) if task is not None: yield task yield EvgTask( name='verify-headers', commands=[ DockerLoginAmazonECR.call(), earthly_exec(kind='test', target='verify-headers'), ], tags=['pr-merge-gate'], run_on=CONTAINER_RUN_DISTROS, ) def variants() -> Iterable[BuildVariant]: yield from (ev.as_evg_variant() for ev in all_possible(EarthlyVariant)) mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/000077500000000000000000000000001511661753600252355ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/backtrace.py000066400000000000000000000005371511661753600275330ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class Backtrace(Function): name = 'backtrace' commands = [ bash_exec( working_dir='mongoc', script='.evergreen/scripts/debug-core-evergreen.sh', ), ] def functions(): return Backtrace.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/bootstrap_mongo_orchestration.py000066400000000000000000000012451511661753600337710ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, expansions_update from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class BootstrapMongoOrchestration(Function): name = 'bootstrap-mongo-orchestration' command_type = EvgCommandType.SETUP commands = [ bash_exec( command_type=command_type, working_dir='mongoc', script='.evergreen/scripts/integration-tests.sh', add_expansions_to_env=True, ), expansions_update(command_type=command_type, file='mongoc/mo-expansion.yml'), ] def functions(): return BootstrapMongoOrchestration.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/fetch_build.py000066400000000000000000000025061511661753600300620ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, archive_targz_extract, s3_get from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchBuild(Function): name = 'fetch-build' command_type = EvgCommandType.SETUP commands = [ bash_exec(command_type=command_type, script='rm -rf mongoc'), s3_get( command_type=command_type, aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', local_file='build.tar.gz', remote_file='${project}/${build_variant}/${revision}/${BUILD_NAME}/${build_id}.tar.gz', ), archive_targz_extract(path='build.tar.gz', destination='mongoc'), # Scripts may not be executable on Windows. bash_exec( command_type=command_type, working_dir='mongoc', script="""\ for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done """, ), ] @classmethod def call(cls, build_name, vars=None, **kwargs): if vars is None: vars = {} vars.update({'BUILD_NAME': build_name}) return cls.default_call(vars=vars, **kwargs) def functions(): return FetchBuild.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/fetch_det.py000066400000000000000000000014621511661753600275370ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchDET(Function): name = 'fetch-det' commands = [ bash_exec( command_type=EvgCommandType.SETUP, script="""\ if [[ ! -d drivers-evergreen-tools ]]; then git clone --depth=1 https://github.com/mongodb-labs/drivers-evergreen-tools.git fi """, ), # Make shell scripts executable. bash_exec( command_type=EvgCommandType.SETUP, working_dir='drivers-evergreen-tools', script='find .evergreen -type f -name "*.sh" -exec chmod +rx "{}" \;', ), ] def functions(): return FetchDET.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/fetch_source.py000066400000000000000000000024521511661753600302630ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, expansions_update, git_get_project from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class FetchSource(Function): name = 'fetch-source' command_type = EvgCommandType.SETUP commands = [ git_get_project(command_type=command_type, directory='mongoc'), bash_exec( command_type=command_type, working_dir='mongoc', script="""\ set -o errexit set -o pipefail if [ -n "${github_pr_number}" -o "${is_patch}" = "true" ]; then VERSION=patch-${version_id} else VERSION=latest fi echo "CURRENT_VERSION: $VERSION" > expansion.yml """, ), expansions_update(command_type=command_type, file='mongoc/expansion.yml'), # Scripts may not be executable on Windows. bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', script="""\ for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done """, ), ] def functions(): return FetchSource.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/restore_instance_profile.py000066400000000000000000000024761511661753600327070ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RestoreInstanceProfile(Function): name = 'restore-instance-profile' commands = [ bash_exec( script="""\ # Restore the AWS Instance Profile that may have been removed in AWS tasks. if [[ ! -d drivers-evergreen-tools ]]; then echo "drivers-evergreen-tools not present ... skipping" exit 0 fi cd drivers-evergreen-tools/.evergreen/auth_aws if [[ ! -f aws_e2e_setup.json ]]; then echo "aws_e2e_setup.json not present ... skipping" exit 0 fi . ./activate-authawsvenv.sh echo "restoring instance profile ... " # Capture and hide logs on success. Logs may included expected `HTTP Error 404: Not Found` messages when checking for instance profile. if ! { python ./lib/aws_assign_instance_profile.py 2>&1 >|output.txt; }; then echo "restoring instance profile ... failed" cat output.txt 1>&2 exit 1 fi echo "restoring instance profile ... succeeded" """ ), ] def functions(): return RestoreInstanceProfile.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/run_mock_kms_servers.py000066400000000000000000000055411511661753600320540ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunMockKMSServers(Function): name = 'run-mock-kms-servers' command_type = EvgCommandType.SETUP commands = [ # This command ensures future invocations of activate-kmstlsvenv.sh conducted in # parallel do not race to setup a venv environment; it has already been prepared. # This primarily addresses the situation where the "run tests" and "run-mock-kms-servers" # functions invoke 'activate-kmstlsvenv.sh' simultaneously. # TODO: remove this function along with the "run-mock-kms-servers" function. bash_exec( command_type=command_type, working_dir='drivers-evergreen-tools/.evergreen/csfle', script="""\ set -o errexit echo "Preparing KMS TLS venv environment..." # TODO: remove this function along with the "run kms servers" function. if [[ "$OSTYPE" =~ cygwin && ! -d kmstlsvenv ]]; then # Avoid using Python 3.10 on Windows due to incompatible cipher suites. # See CDRIVER-4530. . ../venv-utils.sh venvcreate "C:/python/Python39/python.exe" kmstlsvenv || # windows-2017 venvcreate "C:/python/Python38/python.exe" kmstlsvenv # windows-2015 python -m pip install --upgrade boto3~=1.19 pykmip~=0.10.0 "sqlalchemy<2.0.0" deactivate else . ./activate-kmstlsvenv.sh deactivate fi echo "Preparing KMS TLS venv environment... done." """, ), bash_exec( command_type=command_type, background=True, working_dir='drivers-evergreen-tools/.evergreen/csfle', script="""\ set -o errexit echo "Starting mock KMS TLS servers..." . ./activate-kmstlsvenv.sh python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --require_client_cert --port 9002 & python -u kms_failpoint_server.py --port 9003 & python -u kms_kmip_server.py & deactivate echo "Starting mock KMS TLS servers... done." """, ), ] def functions(): return RunMockKMSServers.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/run_simple_http_server.py000066400000000000000000000013321511661753600324100ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunSimpleHTTPServer(Function): name = 'run-simple-http-server' command_type = EvgCommandType.SETUP commands = [ bash_exec( command_type=command_type, background=True, working_dir='mongoc', script="""\ set -o errexit echo "Starting simple HTTP server..." uvx python .evergreen/scripts/simple_http_server.py echo "Starting simple HTTP server... done." """, ), ] def functions(): return RunSimpleHTTPServer.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/run_tests.py000066400000000000000000000007311511661753600276360ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class RunTests(Function): name = 'run-tests' commands = [ bash_exec( command_type=EvgCommandType.TEST, script='.evergreen/scripts/run-tests.sh', working_dir='mongoc', add_expansions_to_env=True, ), ] def functions(): return RunTests.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/set_cache_dir.py000066400000000000000000000030521511661753600303630ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, expansions_update from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class SetCacheDir(Function): name = 'set-cache-dir' commands = [ bash_exec( command_type=EvgCommandType.SETUP, script="""\ if [[ -n "$XDG_CACHE_DIR" ]]; then cache_dir="$XDG_CACHE_DIR" # XDG Base Directory specification. elif [[ -n "$LOCALAPPDATA" ]]; then cache_dir="$LOCALAPPDATA" # Windows. elif [[ -n "$USERPROFILE" ]]; then cache_dir="$USERPROFILE/.cache" # Windows (fallback). elif [[ -d "$HOME/Library/Caches" ]]; then cache_dir="$HOME/Library/Caches" # MacOS. elif [[ -n "$HOME" ]]; then cache_dir="$HOME/.cache" # Linux-like. elif [[ -d ~/.cache ]]; then cache_dir="~/.cache" # Linux-like (fallback). else cache_dir="$(pwd)/.cache" # EVG task directory (fallback). fi mkdir -p "$cache_dir/mongo-c-driver" || exit cache_dir="$(cd "$cache_dir/mongo-c-driver" && pwd)" || exit printf "MONGO_C_DRIVER_CACHE_DIR: %s\\n" "$cache_dir" >|expansions.set-cache-dir.yml """, ), expansions_update(command_type=EvgCommandType.SETUP, file='expansions.set-cache-dir.yml'), ] def functions(): return SetCacheDir.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/stop_load_balancer.py000066400000000000000000000012731511661753600314250ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class StopLoadBalancer(Function): name = 'stop-load-balancer' commands = [ bash_exec( script="""\ # Only run if a load balancer was started. if [[ -z "${SINGLE_MONGOS_LB_URI}" ]]; then echo "OK - no load balancer running" exit fi if [[ -d drivers-evergreen-tools ]]; then cd drivers-evergreen-tools && .evergreen/run-load-balancer.sh stop fi """ ), ] def functions(): return StopLoadBalancer.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/stop_mongo_orchestration.py000066400000000000000000000006731511661753600327450ustar00rootroot00000000000000from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class StopMongoOrchestration(Function): name = 'stop-mongo-orchestration' commands = [ bash_exec( script="""\ if [[ -d MO ]]; then cd MO && mongo-orchestration stop fi """ ), ] def functions(): return StopMongoOrchestration.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/upload_build.py000066400000000000000000000013741511661753600302570ustar00rootroot00000000000000from shrub.v3.evg_command import archive_targz_pack, s3_put from config_generator.etc.function import Function class UploadBuild(Function): name = 'upload-build' commands = [ archive_targz_pack( target='${build_id}.tar.gz', source_dir='mongoc', include=['./**'], ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', remote_file='${project}/${build_variant}/${revision}/${task_name}/${build_id}.tar.gz', bucket='mciuploads', permissions='public-read', local_file='${build_id}.tar.gz', content_type='${content_type|application/x-gzip}', ), ] def functions(): return UploadBuild.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/upload_mo_artifacts.py000066400000000000000000000065471511661753600316420ustar00rootroot00000000000000from shrub.v3.evg_command import archive_targz_pack, s3_put from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class UploadMOArtifacts(Function): name = 'upload-mo-artifacts' commands = [ bash_exec( working_dir='mongoc', script="""\ set -o errexit declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi if [[ -d "$dir" ]]; then find "$dir" -name \\*.log | xargs tar czf mongodb-logs.tar.gz fi """, ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|application/x-gzip}', display_name='mongodb-logs.tar.gz', local_file='mongoc/mongodb-logs.tar.gz', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-mongodb-logs.tar.gz', ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|text/plain}', display_name='orchestration.log', local_file='mongoc/MO/server.log', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-orchestration.log', ), bash_exec( working_dir='mongoc', script="""\ set -o errexit # Find all core files from mongodb in orchestration and move to mongoc declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi declare mdmp_dir="$dir" if [[ -d "/cygdrive/c/mongodb" ]]; then mdmp_dir="/cygdrive/c/mongodb" fi for core_file in $(find -H "$dir" "$mdmp_dir" \\( -name "*.core" -o -name "*.mdmp" \\) 2> /dev/null); do declare base_name base_name="$(echo "$core_file" | sed "s/.*\\///")" # Move file if it does not already exist if [[ ! -f "$base_name" ]]; then mv "$core_file" . fi done """, ), archive_targz_pack( target='mongo-coredumps.tgz', source_dir='mongoc', include=[ './**.core', './**.mdmp', ], ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='${content_type|application/x-gzip}', display_name='Core Dumps - Execution ${execution}', local_file='mongo-coredumps.tgz', optional=True, permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-coredumps.log', ), ] def functions(): return UploadMOArtifacts.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/funcs/upload_test_results.py000066400000000000000000000011161511661753600317120ustar00rootroot00000000000000from shrub.v3.evg_command import attach_results from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class UploadTestResults(Function): name = 'upload-test-results' commands = [ # Ensure attach_results does not fail even if no tests results exist. bash_exec( script="""\ mkdir -p mongoc touch mongoc/test-results.json """ ), attach_results(file_location='mongoc/test-results.json'), ] def functions(): return UploadTestResults.defn() mongo-c-driver-2.2.1/.evergreen/config_generator/components/kms_divergence_check.py000066400000000000000000000012711511661753600306140ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class KmsDivergenceCheck(Function): name = 'kms-divergence-check' commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/kms-divergence-check.sh', ), ] def functions(): return KmsDivergenceCheck.defn() def tasks(): return [ EvgTask( name=KmsDivergenceCheck.name, commands=[ KmsDivergenceCheck.call(), ], ) ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/loadbalanced.py000066400000000000000000000106331511661753600270650ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType, FunctionCall, expansions_update from shrub.v3.evg_task import EvgTask, EvgTaskDependency, EvgTaskRef from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_tests import RunTests from config_generator.components.funcs.upload_build import UploadBuild from config_generator.etc.distros import find_large_distro, make_distro_str from config_generator.etc.utils import bash_exec # Use `rhel8-latest` distro. `rhel8-latest` distro includes necessary dependency: `haproxy`. _DISTRO_NAME = 'rhel8-latest' _COMPILER = 'gcc' def functions(): return { 'start-load-balancer': [ bash_exec( command_type=EvgCommandType.SETUP, script="""\ export DRIVERS_TOOLS=./drivers-evergreen-tools export MONGODB_URI="${MONGODB_URI}" export PATH="$(uv tool dir --bin):$PATH" # DEVPROD-19733 $DRIVERS_TOOLS/.evergreen/run-load-balancer.sh start """, ), expansions_update( command_type=EvgCommandType.SETUP, file='lb-expansion.yml', ), ] } def make_test_task(auth: bool, ssl: bool, server_version: str): auth_str = 'auth' if auth else 'noauth' ssl_str = 'openssl' if ssl else 'nossl' distro_str = make_distro_str(_DISTRO_NAME, _COMPILER, None) return EvgTask( name=f'loadbalanced-{distro_str}-test-{server_version}-{auth_str}-{ssl_str}', depends_on=[EvgTaskDependency(name=f'loadbalanced-{distro_str}-compile')], run_on=find_large_distro(_DISTRO_NAME).name, # DEVPROD-18763 tags=['loadbalanced', _DISTRO_NAME, _COMPILER, auth_str, ssl_str], commands=[ FetchBuild.call(build_name=f'loadbalanced-{distro_str}-compile'), FetchDET.call(), BootstrapMongoOrchestration().call( vars={ 'AUTH': auth_str, 'SSL': ssl_str, 'MONGODB_VERSION': server_version, 'TOPOLOGY': 'sharded_cluster', 'LOAD_BALANCER': 'on', } ), RunSimpleHTTPServer.call(), FunctionCall(func='start-load-balancer', vars={'MONGODB_URI': 'mongodb://localhost:27017,localhost:27018'}), RunTests().call( vars={ 'AUTH': auth_str, 'SSL': ssl_str, 'LOADBALANCED': 'loadbalanced', 'CC': _COMPILER, } ), ], ) def tasks(): distro_str = make_distro_str(_DISTRO_NAME, _COMPILER, None) yield EvgTask( name=f'loadbalanced-{distro_str}-compile', run_on=find_large_distro(_DISTRO_NAME).name, tags=['loadbalanced', _DISTRO_NAME, _COMPILER], commands=[ bash_exec( command_type=EvgCommandType.TEST, env={'CC': _COMPILER, 'CFLAGS': '-fno-omit-frame-pointer', 'SSL': 'OPENSSL'}, include_expansions_in_env=['distro_id'], working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), UploadBuild.call(), ], ) # Satisfy requirements specified in # https://github.com/mongodb/specifications/blob/master/source/load-balancers/tests/README.md#testing-requirements # # > For each server version that supports load balanced clusters, drivers # > MUST add two Evergreen tasks: one with a sharded cluster with both # > authentication and TLS enabled and one with a sharded cluster with # > authentication and TLS disabled. server_versions = ['5.0', '6.0', '7.0', '8.0', 'latest'] for server_version in server_versions: yield make_test_task(auth=False, ssl=False, server_version=server_version) yield make_test_task(auth=True, ssl=True, server_version=server_version) def variants(): return [ BuildVariant(name='loadbalanced', display_name='loadbalanced', tasks=[EvgTaskRef(name='.loadbalanced')]), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/make_docs.py000066400000000000000000000102311511661753600264130ustar00rootroot00000000000000from shrub.v3.evg_command import EvgCommandType, s3_put from shrub.v3.evg_task import EvgTask from config_generator.etc.function import Function, merge_defns from config_generator.etc.utils import bash_exec class MakeDocs(Function): name = 'make-docs' commands = [ bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', include_expansions_in_env=['distro_id'], script="""\ # See SphinxBuild.cmake for EVG_DOCS_BUILD reasoning uv run --frozen --only-group docs env EVG_DOCS_BUILD=1 .evergreen/scripts/build-docs.sh """, ), ] class UploadDocs(Function): name = 'upload-docs' commands = [ bash_exec( working_dir='mongoc/_build/for-docs/src/libbson', env={ 'AWS_ACCESS_KEY_ID': '${aws_key}', 'AWS_SECRET_ACCESS_KEY': '${aws_secret}', }, script='aws s3 cp doc/html s3://mciuploads/${project}/docs/libbson/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1', ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='libbson docs', local_file='mongoc/_build/for-docs/src/libbson/doc/html/index.html', permissions='public-read', remote_file='${project}/docs/libbson/${CURRENT_VERSION}/index.html', ), bash_exec( working_dir='mongoc/_build/for-docs/src/libmongoc', env={ 'AWS_ACCESS_KEY_ID': '${aws_key}', 'AWS_SECRET_ACCESS_KEY': '${aws_secret}', }, script='aws s3 cp doc/html s3://mciuploads/${project}/docs/libmongoc/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1', ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='libmongoc docs', local_file='mongoc/_build/for-docs/src/libmongoc/doc/html/index.html', permissions='public-read', remote_file='${project}/docs/libmongoc/${CURRENT_VERSION}/index.html', ), ] class UploadManPages(Function): name = 'upload-man-pages' commands = [ bash_exec( working_dir='mongoc', script="""\ set -o errexit # Get "aha", the ANSI HTML Adapter. git clone --depth 1 https://github.com/theZiz/aha.git aha-repo pushd aha-repo make popd # aha-repo mv aha-repo/aha . .evergreen/scripts/man-pages-to-html.sh libbson _build/for-docs/src/libbson/doc/man > bson-man-pages.html .evergreen/scripts/man-pages-to-html.sh libmongoc _build/for-docs/src/libmongoc/doc/man > mongoc-man-pages.html """, ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='libbson man pages', local_file='mongoc/bson-man-pages.html', permissions='public-read', remote_file='${project}/man-pages/libbson/${CURRENT_VERSION}/index.html', ), s3_put( aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='text/html', display_name='libmongoc man pages', local_file='mongoc/mongoc-man-pages.html', permissions='public-read', remote_file='${project}/man-pages/libmongoc/${CURRENT_VERSION}/index.html', ), ] def functions(): return merge_defns( MakeDocs.defn(), UploadDocs.defn(), UploadManPages.defn(), ) def tasks(): return [ EvgTask( name='make-docs', commands=[ MakeDocs.call(), UploadDocs.call(), UploadManPages.call(), ], ) ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/mock_server.py000066400000000000000000000025501511661753600270120ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.etc.utils import bash_exec def tasks(): return [ EvgTask( name='mock-server-test', run_on='ubuntu2204-small', commands=[ RunSimpleHTTPServer.call(), bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', script='.evergreen/scripts/run-mock-server-tests.sh', ), ], ) ] def variants(): return [ BuildVariant( name='mock-server-test', display_name='Mock Server Test', tasks=[EvgTaskRef(name='mock-server-test')], expansions={ 'CC': 'gcc', 'ASAN': 'on', 'CFLAGS': '-fno-omit-frame-pointer', 'SANITIZE': 'address,undefined', }, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/oidc.py000066400000000000000000000157121511661753600254150ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType, KeyValueParam, ec2_assume_role, expansions_update from shrub.v3.evg_task import EvgTask, EvgTaskRef from shrub.v3.evg_task_group import EvgTaskGroup from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.fetch_source import FetchSource from config_generator.components.funcs.run_tests import RunTests from config_generator.components.sasl.openssl import SaslCyrusOpenSSLCompile from config_generator.etc.distros import find_small_distro from config_generator.etc.utils import bash_exec def task_groups(): return [ EvgTaskGroup( name='test-oidc-task-group', tasks=['oidc-auth-test-task'], setup_group_can_fail_task=True, teardown_group_can_fail_task=True, teardown_group_timeout_secs=180, # 3 minutes setup_group=[ FetchDET.call(), ec2_assume_role(role_arn='${aws_test_secrets_role}'), bash_exec( command_type=EvgCommandType.SETUP, include_expansions_in_env=['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN'], script='./drivers-evergreen-tools/.evergreen/auth_oidc/setup.sh', ), ], teardown_group=[ bash_exec( command_type=EvgCommandType.SETUP, script='./drivers-evergreen-tools/.evergreen/auth_oidc/teardown.sh', ) ], ), EvgTaskGroup( name='test-oidc-azure-task-group', tasks=['oidc-azure-auth-test-task'], setup_group_can_fail_task=True, teardown_group_can_fail_task=True, teardown_group_timeout_secs=180, # 3 minutes setup_group=[ FetchDET.call(), ec2_assume_role(role_arn='${aws_test_secrets_role}'), bash_exec( command_type=EvgCommandType.SETUP, include_expansions_in_env=['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN'], env={'AZUREOIDC_VMNAME_PREFIX': 'CDRIVER'}, script='./drivers-evergreen-tools/.evergreen/auth_oidc/azure/create-and-setup-vm.sh', ), ], teardown_group=[ bash_exec( command_type=EvgCommandType.SETUP, script='./drivers-evergreen-tools/.evergreen/auth_oidc/azure/delete-vm.sh', ), ], ), EvgTaskGroup( name='test-oidc-gcp-task-group', tasks=['oidc-gcp-auth-test-task'], setup_group_can_fail_task=True, teardown_group_can_fail_task=True, teardown_group_timeout_secs=180, # 3 minutes setup_group=[ FetchDET.call(), ec2_assume_role(role_arn='${aws_test_secrets_role}'), bash_exec( command_type=EvgCommandType.SETUP, include_expansions_in_env=['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN'], env={'GCPOIDC_VMNAME_PREFIX': 'CDRIVER'}, script='./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/setup.sh', ), ], teardown_group=[ bash_exec( command_type=EvgCommandType.SETUP, script='./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/teardown.sh', ), ], ), ] def tasks(): return [ EvgTask( name='oidc-auth-test-task', run_on=[find_small_distro('ubuntu2404').name], commands=[ FetchSource.call(), SaslCyrusOpenSSLCompile.call(), expansions_update( updates=[ KeyValueParam(key='CC', value='clang'), # OIDC test servers support both OIDC and user/password. KeyValueParam(key='AUTH', value='auth'), # Use user/password for default test clients. KeyValueParam(key='OIDC', value='oidc'), # Enable OIDC tests. KeyValueParam(key='MONGODB_VERSION', value='latest'), KeyValueParam(key='TOPOLOGY', value='replica_set'), ] ), RunTests.call(), ], ), EvgTask( name='oidc-azure-auth-test-task', run_on=['debian11-small'], # TODO: switch to 'debian11-latest' after DEVPROD-23011 fixed. commands=[ FetchSource.call(), bash_exec( working_dir='mongoc', add_expansions_to_env=True, command_type=EvgCommandType.TEST, script='.evergreen/scripts/oidc-azure-compile.sh', ), expansions_update(file='mongoc/oidc-remote-test-expansion.yml'), bash_exec( add_expansions_to_env=True, command_type=EvgCommandType.TEST, env={ 'AZUREOIDC_DRIVERS_TAR_FILE': '${OIDC_TEST_TARBALL}', 'AZUREOIDC_TEST_CMD': 'source ./env.sh && ./.evergreen/scripts/oidc-azure-test.sh', }, script='./drivers-evergreen-tools/.evergreen/auth_oidc/azure/run-driver-test.sh', ), ], ), EvgTask( name='oidc-gcp-auth-test-task', run_on=['debian11-small'], # TODO: switch to 'debian11-latest' after DEVPROD-23011 fixed. commands=[ FetchSource.call(), bash_exec( working_dir='mongoc', add_expansions_to_env=True, command_type=EvgCommandType.TEST, script='.evergreen/scripts/oidc-gcp-compile.sh', ), expansions_update(file='mongoc/oidc-remote-test-expansion.yml'), bash_exec( add_expansions_to_env=True, command_type=EvgCommandType.TEST, env={ 'GCPOIDC_DRIVERS_TAR_FILE': '${OIDC_TEST_TARBALL}', 'GCPOIDC_TEST_CMD': 'source ./secrets-export.sh && ./.evergreen/scripts/oidc-gcp-test.sh', }, script='./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/run-driver-test.sh', ), ], ), ] def variants(): return [ BuildVariant( name='oidc', display_name='OIDC', tasks=[ EvgTaskRef(name='test-oidc-task-group'), EvgTaskRef(name='test-oidc-azure-task-group'), EvgTaskRef(name='test-oidc-gcp-task-group'), ], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/openssl_compat.py000066400000000000000000000071121511661753600275200ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType, FunctionCall from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.components.funcs.fetch_source import FetchSource from config_generator.etc.distros import find_large_distro, make_distro_str from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec TAG = 'openssl-compat' # pylint: disable=line-too-long # fmt: off OPENSSL_MATRIX = [ ('ubuntu2404', 'gcc', ['shared', 'static'], ['1.0.2', '1.1.1', '3.0.9', '3.1.2', '3.2.5', '3.3.4', '3.4.2', '3.5.1']), ] # fmt: on # pylint: disable=line-too-long # fmt: off OPENSSL_FIPS_MATRIX = [ # https://openssl-library.org/source/ # > The following OpenSSL version(s) are FIPS validated: # > - 3.1.2: FIPS 140-3 # > - 3.0.9: FIPS 140-2 # > - ... ('ubuntu2404', 'gcc', ['shared', 'static'], ['3.0.9', '3.1.2']), ] # fmt: on class OpenSSLSetup(Function): name = 'openssl-compat' commands = [ bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', include_expansions_in_env=[ 'OPENSSL_ENABLE_FIPS', 'OPENSSL_USE_STATIC_LIBS', 'OPENSSL_VERSION', ], script='.evergreen/scripts/openssl-compat-setup.sh', ), bash_exec( command_type=EvgCommandType.SETUP, working_dir='mongoc', include_expansions_in_env=[ 'OPENSSL_USE_STATIC_LIBS', 'OPENSSL_VERSION', ], script='.evergreen/scripts/openssl-compat-check.sh', ), ] def functions(): return OpenSSLSetup.defn() def tasks(): for distro_name, compiler, link_types, versions in OPENSSL_MATRIX: distro_str = make_distro_str(distro_name, compiler, None) for link_type, version in product(link_types, versions): vars = {'OPENSSL_VERSION': version} if link_type == 'static': vars |= {'OPENSSL_USE_STATIC_LIBS': 'ON'} yield EvgTask( name=f'{TAG}-{version}-{link_type}-{distro_str}', run_on=find_large_distro(distro_name).name, tags=[TAG, f'openssl-{version}', f'openssl-{link_type}', distro_name, compiler], commands=[ FetchSource.call(), OpenSSLSetup.call(vars=vars), FunctionCall(func='run auth tests'), ], ) for distro_name, compiler, link_types, versions in OPENSSL_FIPS_MATRIX: distro_str = make_distro_str(distro_name, compiler, None) for link_type, version in product(link_types, versions): vars = {'OPENSSL_VERSION': version, 'OPENSSL_ENABLE_FIPS': 'ON'} if link_type == 'static': vars |= {'OPENSSL_USE_STATIC_LIBS': 'ON'} yield EvgTask( name=f'{TAG}-fips-{version}-{link_type}-{distro_str}', run_on=find_large_distro(distro_name).name, tags=[TAG, f'openssl-fips-{version}', f'openssl-{link_type}', distro_name, compiler], commands=[ FetchSource.call(), OpenSSLSetup.call(vars=vars), FunctionCall(func='run auth tests'), ], ) def variants(): return [ BuildVariant( name=f'{TAG}-matrix', display_name='OpenSSL Compatibility Matrix', tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/000077500000000000000000000000001511661753600263125ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/asan.py000066400000000000000000000007531511661753600276130ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef TAG = 'sanitizers-matrix-asan' def variants(): expansions = { 'ASAN': 'on', 'CFLAGS': '-fno-omit-frame-pointer', 'CHECK_LOG': 'ON', 'SANITIZE': 'address,undefined', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/asan_cse.py000066400000000000000000000022311511661753600304360ustar00rootroot00000000000000from config_generator.components.cse.openssl import SaslCyrusOpenSSLCompile from config_generator.components.sanitizers.asan import TAG from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('rhel8-latest', 'clang', None, ['cyrus']), ] # CSFLE requires 4.2+. QE requires 7.0+ and are skipped on "server" tasks. TEST_MATRIX = [ # rhel8-latest provides 4.2 through latest. ('rhel8-latest', 'clang', None, 'cyrus', ['auth'], ['server', 'replica'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long MORE_TAGS = ['cse', 'asan'] def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS) res += generate_test_tasks(SSL, TAG, TEST_MATRIX, MORE_TAGS) res += generate_test_tasks( SSL, TAG, TEST_MATRIX, MORE_TAGS, MORE_TEST_TAGS=['with-mongocrypt'], MORE_VARS={'SKIP_CRYPT_SHARED_LIB': 'on'} ) return res mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/asan_sasl.py000066400000000000000000000016301511661753600306300ustar00rootroot00000000000000from config_generator.components.sanitizers.asan import TAG from config_generator.components.sasl.openssl import SaslCyrusOpenSSLCompile from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('rhel8-latest', 'clang', None, ['cyrus']), ] TEST_MATRIX = [ # rhel8-latest provides 4.2 through latest. ('rhel8-latest', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, ['asan']) res += generate_test_tasks(SSL, TAG, TEST_MATRIX, ['asan']) return res mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/tsan.py000066400000000000000000000010101511661753600276210ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef TAG = 'sanitizers-matrix-tsan' def variants(): expansions = { 'CFLAGS': '-fno-omit-frame-pointer', 'CHECK_LOG': 'ON', 'EXTRA_CONFIGURE_FLAGS': '-DENABLE_SHM_COUNTERS=OFF', 'SANITIZE': 'thread', } return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sanitizers/tsan_sasl.py000066400000000000000000000016611511661753600306570ustar00rootroot00000000000000from config_generator.components.sanitizers.tsan import TAG from config_generator.components.sasl.openssl import SaslCyrusOpenSSLCompile from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.sanitizers.test import generate_test_tasks # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('rhel8-latest', 'clang', None, ['cyrus']), ] TEST_OPENSSL_MATRIX = [ # rhel8-latest provides 4.2 through latest. ('rhel8-latest', 'clang', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long MORE_TAGS = ['tsan'] def tasks(): res = [] SSL = 'openssl' SASL_TO_FUNC = {'cyrus': SaslCyrusOpenSSLCompile} res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX, MORE_TAGS) res += generate_test_tasks(SSL, TAG, TEST_OPENSSL_MATRIX, MORE_TAGS) return res mongo-c-driver-2.2.1/.evergreen/config_generator/components/sasl/000077500000000000000000000000001511661753600250615ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/components/sasl/darwinssl.py000066400000000000000000000033201511661753600274370ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.function import merge_defns from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'darwinssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ ('macos-14-arm64', 'clang', None, ['cyrus']), ('macos-14', 'clang', None, ['cyrus']), ] TEST_MATRIX = [ # Prefer macos-14-arm64 which is less resource-limited than macos-14. Provides 6.0+. ('macos-14-arm64', 'clang', None, 'cyrus', ['auth'], ['replica'], ['6.0', '7.0', '8.0', 'latest']), # Pre-6.0 coverage. Resource-limited: use sparingly. ('macos-14', 'clang', None, 'cyrus', ['auth'], ['replica'], ['4.2', '4.4', '5.0']), ] # fmt: on # pylint: enable=line-too-long class DarwinSSLCompileCommon(CompileCommon): ssl = 'DARWIN' class SaslCyrusDarwinSSLCompile(DarwinSSLCompileCommon): name = 'sasl-cyrus-darwinssl-compile' commands = DarwinSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusDarwinSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'cyrus': SaslCyrusDarwinSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = {} return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sasl/nossl.py000066400000000000000000000031371511661753600265750ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.function import merge_defns from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'nossl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ # For test matrix. ('rhel8-latest', 'gcc', None, ['off']), # For compile only. ('ubuntu2204', 'gcc', None, ['off']), ('ubuntu2404', 'gcc', None, ['off']), ('windows-vsCurrent', 'vs2017x64', None, ['off']), ] TEST_MATRIX = [ ('rhel8-latest', 'gcc', None, 'off', ['noauth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ] # fmt: on # pylint: enable=line-too-long class NoSSLCompileCommon(CompileCommon): ssl = 'OFF' class SaslOffNoSSLCompile(NoSSLCompileCommon): name = 'sasl-off-nossl-compile' commands = NoSSLCompileCommon.compile_commands(sasl='OFF') def functions(): return merge_defns( SaslOffNoSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'off': SaslOffNoSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = {} return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sasl/openssl.py000066400000000000000000000065411511661753600271240ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.function import merge_defns from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks from config_generator.etc.utils import TaskRef SSL = 'openssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ # For test matrix. ('amazon2023-arm64-latest-large-m8g', 'gcc', None, ['cyrus']), ('rhel8-latest', 'gcc', None, ['cyrus']), ('rhel8-arm64-latest', 'gcc', None, ['cyrus']), ('rhel8-power', 'gcc', None, ['cyrus']), ('rhel8-zseries', 'gcc', None, ['cyrus']), ('windows-vsCurrent', 'vs2017x64', None, ['cyrus']), # For compile only. ('debian11-latest', 'gcc', None, ['cyrus']), ('debian12-latest', 'gcc', None, ['cyrus']), ('rhel80', 'gcc', None, ['cyrus']), ('ubuntu2204', 'gcc', None, ['cyrus']), ('ubuntu2204', 'clang-12', None, ['cyrus']), ('ubuntu2404', 'gcc', None, ['cyrus']), ('ubuntu2404', 'clang-14', None, ['cyrus']), ] TEST_MATRIX = [ ('rhel8-latest', 'gcc', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ('rhel8-arm64-latest', 'gcc', None, 'cyrus', ['auth'], ['server'], [ '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ('rhel8-power', 'gcc', None, 'cyrus', ['auth'], ['server'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), ('rhel8-zseries', 'gcc', None, 'cyrus', ['auth'], ['server'], [ '5.0', '6.0', '7.0', '8.0', 'latest']), ('windows-vsCurrent', 'vs2017x64', None, 'cyrus', ['auth'], ['server'], ['latest']), # Test with Graviton processor: ('amazon2023-arm64-latest-large-m8g', 'gcc', None, 'cyrus', ['auth'], ['server', 'replica', 'sharded'], ['latest']), ] # fmt: on # pylint: enable=line-too-long class OpenSSLCompileCommon(CompileCommon): ssl = 'OPENSSL' class SaslCyrusOpenSSLCompile(OpenSSLCompileCommon): name = 'sasl-cyrus-openssl-compile' commands = OpenSSLCompileCommon.compile_commands(sasl='CYRUS') def functions(): return merge_defns( SaslCyrusOpenSSLCompile.defn(), ) SASL_TO_FUNC = { 'cyrus': SaslCyrusOpenSSLCompile, } TASKS = [ *generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX), *generate_test_tasks(SSL, TAG, TEST_MATRIX), ] def tasks(): res = TASKS.copy() # PowerPC and zSeries are limited resources. for task in res: if any(pattern in task.run_on for pattern in ['power', 'zseries']): task.patchable = False return res def variants(): expansions = {} tasks = [] # PowerPC and zSeries are limited resources. for task in TASKS: if any(pattern in task.run_on for pattern in ['power', 'zseries']): tasks.append( TaskRef( name=task.name, batchtime=1440, # 1 day ) ) else: tasks.append(task.get_task_ref()) tasks.sort(key=lambda t: t.name) return [ BuildVariant( name=TAG, display_name=TAG, tasks=tasks, expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sasl/winssl.py000066400000000000000000000043071511661753600267560ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_task import EvgTaskRef from config_generator.etc.compile import generate_compile_tasks from config_generator.etc.function import merge_defns from config_generator.etc.sasl.compile import CompileCommon from config_generator.etc.sasl.test import generate_test_tasks SSL = 'winssl' TAG = f'sasl-matrix-{SSL}' # pylint: disable=line-too-long # fmt: off COMPILE_MATRIX = [ # For test matrix. ('windows-vsCurrent', 'mingw', None, [ 'sspi']), ('windows-vsCurrent', 'vs2022x64', None, ['off', 'sspi']), ('windows-vsCurrent', 'vs2022x86', None, ['off', 'sspi']), # For compile only. ('windows-vsCurrent', 'vs2017x64', None, ['off', 'sspi']), ('windows-vsCurrent', 'vs2019x64', None, ['off', 'sspi']), ] TEST_MATRIX = [ ('windows-vsCurrent', 'vs2022x64', None, 'sspi', ['auth'], ['server', 'replica', 'sharded'], ['4.2', '4.4', '5.0', '6.0', '7.0', '8.0', 'latest']), # sharded + min + latest only. ('windows-vsCurrent', 'mingw', None, 'sspi', ['auth'], ['sharded'], ['4.2', 'latest']), ('windows-vsCurrent', 'vs2022x86', None, 'sspi', ['auth'], ['sharded'], ['4.2', 'latest']), ] # fmt: on # pylint: enable=line-too-long class WinSSLCompileCommon(CompileCommon): ssl = 'WINDOWS' class SaslOffWinSSLCompile(WinSSLCompileCommon): name = 'sasl-off-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='OFF') class SaslSspiWinSSLCompile(WinSSLCompileCommon): name = 'sasl-sspi-winssl-compile' commands = WinSSLCompileCommon.compile_commands(sasl='SSPI') def functions(): return merge_defns( SaslOffWinSSLCompile.defn(), SaslSspiWinSSLCompile.defn(), ) def tasks(): res = [] SASL_TO_FUNC = { 'off': SaslOffWinSSLCompile, 'sspi': SaslSspiWinSSLCompile, } res += generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, COMPILE_MATRIX) res += generate_test_tasks(SSL, TAG, TEST_MATRIX) return res def variants(): expansions = {} return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], expansions=expansions, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/sbom.py000066400000000000000000000074051511661753600254370ustar00rootroot00000000000000from pydantic import ConfigDict from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import ( BuiltInCommand, EvgCommandType, KeyValueParam, ec2_assume_role, expansions_update, s3_put, ) from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.etc.distros import find_small_distro from config_generator.etc.function import Function, merge_defns from config_generator.etc.utils import bash_exec TAG = 'sbom' class CustomCommand(BuiltInCommand): command: str model_config = ConfigDict(arbitrary_types_allowed=True) class SBOM(Function): name = 'sbom' commands = [ # Authenticate with Kondukto. *[ ec2_assume_role( command_type=EvgCommandType.SETUP, role_arn='${kondukto_role_arn}', ), bash_exec( command_type=EvgCommandType.SETUP, include_expansions_in_env=[ 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', ], script="""\ set -o errexit set -o pipefail kondukto_token="$(aws secretsmanager get-secret-value --secret-id "kondukto-token" --region "us-east-1" --query 'SecretString' --output text)" printf "KONDUKTO_TOKEN: %s\\n" "$kondukto_token" >|expansions.kondukto.yml """, ), expansions_update( command_type=EvgCommandType.SETUP, file='expansions.kondukto.yml', ), ], # Authenticate with Amazon ECR. *[ # Avoid inadvertently using a pre-existing and potentially conflicting Podman config. # Note: podman understands and uses DOCKER_CONFIG despite the name. expansions_update(updates=[KeyValueParam(key='DOCKER_CONFIG', value='${workdir}/.docker')]), ec2_assume_role(role_arn='arn:aws:iam::901841024863:role/ecr-role-evergreen-ro'), bash_exec( command_type=EvgCommandType.SETUP, include_expansions_in_env=[ 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'DOCKER_CONFIG', ], script='aws ecr get-login-password --region us-east-1 | podman login --username AWS --password-stdin 901841024863.dkr.ecr.us-east-1.amazonaws.com', ), ], bash_exec( command_type=EvgCommandType.TEST, working_dir='mongoc', include_expansions_in_env=[ 'branch_name', 'DOCKER_CONFIG', 'KONDUKTO_TOKEN', ], script='.evergreen/scripts/sbom.sh', ), s3_put( command_type=EvgCommandType.TEST, aws_key='${aws_key}', aws_secret='${aws_secret}', bucket='mciuploads', content_type='application/json', display_name='Augmented SBOM', local_file='mongoc/augmented-sbom.json', permissions='public-read', remote_file='${project}/${build_variant}/${revision}/${version_id}/${build_id}/sbom/augmented-sbom.json', ), ] def functions(): return merge_defns( SBOM.defn(), ) def tasks(): distro_name = 'rhel80' distro = find_small_distro(distro_name) yield EvgTask( name='sbom', tags=[TAG, distro_name], run_on=distro.name, commands=[ SBOM.call(), ], ) def variants(): return [ BuildVariant( name=TAG, display_name='SBOM', tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/components/scan_build.py000066400000000000000000000037311511661753600266000ustar00rootroot00000000000000from shrub.v3.evg_build_variant import BuildVariant from shrub.v3.evg_command import EvgCommandType, FunctionCall from shrub.v3.evg_task import EvgTask, EvgTaskRef from config_generator.etc.distros import compiler_to_vars, find_large_distro, make_distro_str from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec TAG = 'scan-build-matrix' # pylint: disable=line-too-long # fmt: off MATRIX = [ ('macos-14-arm64', 'clang', None ), ('ubuntu2204-arm64', 'clang', None ), ('ubuntu2204', 'clang-12', 'i686'), ] # fmt: on # pylint: enable=line-too-long class ScanBuild(Function): name = 'scan-build' commands = [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, redirect_standard_error_to_output=True, working_dir='mongoc', script='.evergreen/scripts/compile-scan-build.sh', ), ] def functions(): return ScanBuild.defn() def tasks(): res = [] for distro_name, compiler, arch in MATRIX: tags = [TAG, distro_name, compiler] distro = find_large_distro(distro_name) compile_vars = None compile_vars = compiler_to_vars(compiler) if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) distro_str = make_distro_str(distro_name, compiler, arch) task_name = f'scan-build-{distro_str}' res.append( EvgTask( name=task_name, run_on=distro.name, tags=tags, commands=[ ScanBuild.call(vars=compile_vars if compile_vars else None), FunctionCall(func='upload scan artifacts'), ], ) ) return res def variants(): return [ BuildVariant( name=TAG, display_name=TAG, tasks=[EvgTaskRef(name=f'.{TAG}')], ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/etc/000077500000000000000000000000001511661753600225055ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/etc/compile.py000066400000000000000000000027021511661753600245100ustar00rootroot00000000000000from shrub.v3.evg_task import EvgTask from config_generator.components.funcs.upload_build import UploadBuild from config_generator.etc.distros import compiler_to_vars, find_large_distro, make_distro_str def generate_compile_tasks(SSL, TAG, SASL_TO_FUNC, MATRIX, MORE_TAGS=None, MORE_VARS=None): res = [] MORE_TAGS = MORE_TAGS if MORE_TAGS else [] MORE_VARS = MORE_VARS if MORE_VARS else {} for distro_name, compiler, arch, sasls in MATRIX: tags = [TAG, 'compile', distro_name, compiler] + MORE_TAGS distro = find_large_distro(distro_name) compile_vars = None compile_vars = compiler_to_vars(compiler) if arch: tags.append(arch) compile_vars.update({'MARCH': arch}) compile_vars.update(MORE_VARS) distro_str = make_distro_str(distro_name, compiler, arch) for sasl in sasls: task_name = f'sasl-{sasl}-{SSL}-{distro_str}-compile' for tag in MORE_TAGS: task_name = f'{tag}-{task_name}' commands = [] commands.append(SASL_TO_FUNC[sasl].call(vars=compile_vars if compile_vars else None)) commands.append(UploadBuild.call()) res.append( EvgTask( name=task_name, run_on=distro.name, tags=tags + [f'sasl-{sasl}'], commands=commands, ) ) return res mongo-c-driver-2.2.1/.evergreen/config_generator/etc/cse/000077500000000000000000000000001511661753600232575ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/etc/cse/compile.py000066400000000000000000000017741511661753600252720ustar00rootroot00000000000000from typing import ClassVar from shrub.v3.evg_command import EvgCommand, EvgCommandType, KeyValueParam, expansions_update from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CompileCommon(Function): ssl: ClassVar[str | None] @classmethod def compile_commands(cls, sasl=None) -> list[EvgCommand]: updates = [] if cls.ssl: updates.append(KeyValueParam(key='SSL', value=cls.ssl)) if sasl: updates.append(KeyValueParam(key='SASL', value=sasl)) return [ expansions_update(updates=updates), bash_exec( command_type=EvgCommandType.TEST, script='EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh', working_dir='mongoc', add_expansions_to_env=True, env={ 'COMPILE_LIBMONGOCRYPT': 'ON', }, ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/etc/cse/test.py000066400000000000000000000060631511661753600246150ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import KeyValueParam, expansions_update from shrub.v3.evg_task import EvgTask, EvgTaskDependency from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_mock_kms_servers import RunMockKMSServers from config_generator.components.funcs.run_tests import RunTests from config_generator.etc.distros import compiler_to_vars, find_large_distro, find_small_distro, make_distro_str def generate_test_tasks(SSL, TAG, MATRIX): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [TAG, 'test', distro_name, compiler, f'sasl-{sasl}', 'cse'] if distro_name == 'rhel8-latest': test_distro = find_large_distro(distro_name) # DEVPROD-18763 else: test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars = [KeyValueParam(key=key, value=value) for key, value in compiler_to_vars(compiler).items()] if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) compile_task_name = f'cse-sasl-{sasl}-{SSL}-{distro_str}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [auth, topology, server_ver] # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'cse-sasl-{sasl}-{SSL}-{distro_str}-test-{server_ver}-{topology}-{auth}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunMockKMSServers.call()) test_commands.append(RunTests.call()) res.append( EvgTask( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-2.2.1/.evergreen/config_generator/etc/distros.py000066400000000000000000000161411511661753600245510ustar00rootroot00000000000000from typing import Literal from packaging.version import Version from pydantic import BaseModel, validator class Distro(BaseModel): """ Defines common properties of a given Evergreen distro. * name: Name of the distro. * os: Name of the operating system. * os_type: One of Linux, MacOS, or Windows. * os_ver: Version of the operating system. * vs_ver: Version of Visual Studio available. * size: Size of tasks the distro is designed to handle. * arch: Target architecture. """ name: str os: str | None = None os_type: Literal['linux', 'macos', 'windows'] | None = None os_ver: str | None = None vs_ver: ( Literal[ '2017', '2019', '2022', 'vsCurrent', ] | None ) = None size: Literal['small', 'large'] | None = None arch: Literal['arm64', 'power', 'zseries'] | None = None @validator('os_ver') @classmethod def validate_os_ver(cls, value): return value == 'latest' or Version(value) def ls_distro(name, **kwargs): return [ Distro(name=f'{name}-large', size='large', **kwargs), Distro(name=f'{name}-small', size='small', **kwargs), ] DEBIAN_DISTROS = [ *ls_distro(name='debian11-latest', os='debian', os_type='linux', os_ver='11'), *ls_distro(name='debian12-latest', os='debian', os_type='linux', os_ver='12'), ] MACOS_DISTROS = [ Distro(name='macos-14', os='macos', os_type='macos', os_ver='14'), ] MACOS_ARM64_DISTROS = [ Distro(name='macos-14-arm64', os='macos', os_type='macos', os_ver='14', arch='arm64'), ] RHEL_DISTROS = [ *ls_distro(name='rhel7-latest', os='rhel', os_type='linux', os_ver='7'), *ls_distro(name='rhel8-latest', os='rhel', os_type='linux', os_ver='8'), *ls_distro(name='rhel80', os='rhel', os_type='linux', os_ver='8.0'), *ls_distro(name='rhel84', os='rhel', os_type='linux', os_ver='8.4'), *ls_distro(name='rhel90', os='rhel', os_type='linux', os_ver='9.0'), *ls_distro(name='rhel91', os='rhel', os_type='linux', os_ver='9.1'), *ls_distro(name='rhel92', os='rhel', os_type='linux', os_ver='9.2'), *ls_distro(name='rhel93', os='rhel', os_type='linux', os_ver='9.3'), *ls_distro(name='rhel94', os='rhel', os_type='linux', os_ver='9.4'), *ls_distro(name='rhel95', os='rhel', os_type='linux', os_ver='9.5'), # rhel9-latest ] RHEL_ARM64_DISTROS = [ *ls_distro(name='rhel8-arm64-latest', os='rhel', os_type='linux', os_ver='8', arch='arm64'), ] RHEL_POWER_DISTROS = [ *ls_distro(name='rhel8-power', os='rhel', os_type='linux', os_ver='8', arch='power'), ] RHEL_ZSERIES_DISTROS = [ *ls_distro(name='rhel8-zseries', os='rhel', os_type='linux', os_ver='8', arch='zseries'), ] UBUNTU_DISTROS = [ *ls_distro(name='ubuntu2004', os='ubuntu', os_type='linux', os_ver='20.04'), *ls_distro(name='ubuntu2204', os='ubuntu', os_type='linux', os_ver='22.04'), *ls_distro(name='ubuntu2404', os='ubuntu', os_type='linux', os_ver='24.04'), ] UBUNTU_ARM64_DISTROS = [ *ls_distro(name='ubuntu2204-arm64', os='ubuntu', os_type='linux', os_ver='22.04', arch='arm64'), ] WINDOWS_DISTROS = [ *ls_distro(name='windows-vsCurrent', os='windows', os_type='windows', vs_ver='vsCurrent'), # Windows Server 2019 ] GRAVITON_DISTROS = [ Distro(name='amazon2023-arm64-latest-large-m8g', os='amazon2023', os_type='linux', os_ver='2023', arch='arm64'), Distro(name='amazon2-arm64-latest-large-m8g', os='amazon2', os_type='linux', os_ver='2', arch='arm64'), ] # See: https://evergreen.mongodb.com/distros # Ensure no-arch distros are ordered before arch-specific distros. ALL_DISTROS = [ *DEBIAN_DISTROS, *GRAVITON_DISTROS, *MACOS_DISTROS, *MACOS_ARM64_DISTROS, *RHEL_DISTROS, *RHEL_ARM64_DISTROS, *RHEL_POWER_DISTROS, *RHEL_ZSERIES_DISTROS, *UBUNTU_DISTROS, *UBUNTU_ARM64_DISTROS, *WINDOWS_DISTROS, ] def find_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if name == d.name] if not candidates: raise ValueError(f'could not find a distro with the name {name}') return candidates[0] def find_large_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if f'{name}-large' == d.name] if candidates: return candidates[0] return find_distro(name) def find_small_distro(name) -> Distro: candidates = [d for d in ALL_DISTROS if f'{name}-small' == d.name] if candidates: return candidates[0] return find_distro(name) def make_distro_str(distro_name, compiler, arch) -> str: if distro_name.startswith('windows-vsCurrent'): # Rename `windows-vsCurrent-*` distros to `windows-` where`` # is the Windows Server version used by the distro, e.g.: # ('windows-vsCurrent-2022', 'vs2017x64', None) -> windows-2022-vs2017-x64 # ('windows-vsCurrent-2022', 'mingw', None) -> windows-2022-mingw # ('windows-vsCurrent', 'vs2017x64', None) -> windows-2019-vs2017-x64 # ('windows-vsCurrent', 'mingw', None) -> windows-2019-mingw maybe_arch = compiler[len('vs20XY') :] if maybe_arch in ('x86', 'x64'): compiler_str = compiler[: -len(maybe_arch)] + '-' + maybe_arch else: compiler_str = compiler if distro_name.startswith('windows-vsCurrent-'): distro_str = 'windows-' + distro_name[len('windows-vsCurrent-') :] + f'-{compiler_str}' else: distro_str = 'windows-2019-' + compiler_str else: distro_str = distro_name if compiler: distro_str += f'-{compiler}' if arch: distro_str += f'-{arch}' return distro_str def to_cc(compiler): return { 'vs2017x64': 'Visual Studio 15 2017', 'vs2017x86': 'Visual Studio 15 2017', 'vs2019x64': 'Visual Studio 16 2019', 'vs2019x86': 'Visual Studio 16 2019', 'vs2022x64': 'Visual Studio 17 2022', 'vs2022x86': 'Visual Studio 17 2022', }.get(compiler, compiler) def to_platform(compiler): return { 'vs2017x64': 'x64', 'vs2017x86': 'Win32', 'vs2019x64': 'x64', 'vs2019x86': 'Win32', 'vs2022x64': 'x64', 'vs2022x86': 'Win32', }.get(compiler, compiler) def compiler_to_vars(compiler): if compiler is None: return {} match compiler, compiler.split('-'): case _, ['gcc', *rest]: return { 'CC': '-'.join(['gcc'] + rest), 'CXX': '-'.join(['g++'] + rest), } case _, ['clang', *rest]: return { 'CC': '-'.join(['clang'] + rest), 'CXX': '-'.join(['clang++'] + rest), } case str(vs), _ if 'vs' in vs: return { 'CMAKE_GENERATOR': to_cc(vs), 'CMAKE_GENERATOR_PLATFORM': to_platform(vs), } case _, ['mingw', *rest]: return { 'CC': '-'.join(['gcc'] + rest), 'CXX': '-'.join(['g++'] + rest), } case compiler, _: return { 'CC': compiler, 'CXX': compiler, } mongo-c-driver-2.2.1/.evergreen/config_generator/etc/function.py000066400000000000000000000011351511661753600247040ustar00rootroot00000000000000from collections import ChainMap from typing import ClassVar, Mapping from shrub.v3.evg_command import EvgCommand, FunctionCall class Function: name: ClassVar[str] commands: ClassVar[list[EvgCommand]] @classmethod def defn(cls) -> Mapping[str, list[EvgCommand]]: return {cls.name: cls.commands} @classmethod def default_call(cls, **kwargs) -> FunctionCall: return FunctionCall(func=cls.name, **kwargs) @classmethod def call(cls, **kwargs) -> FunctionCall: return cls.default_call(**kwargs) def merge_defns(*args): return ChainMap(*args) mongo-c-driver-2.2.1/.evergreen/config_generator/etc/sanitizers/000077500000000000000000000000001511661753600247005ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/etc/sanitizers/test.py000066400000000000000000000077201511661753600262370ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import KeyValueParam, expansions_update from shrub.v3.evg_task import EvgTask, EvgTaskDependency from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_mock_kms_servers import RunMockKMSServers from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_tests import RunTests from config_generator.etc.distros import compiler_to_vars, find_large_distro, find_small_distro, make_distro_str def generate_test_tasks(SSL, TAG, MATRIX, MORE_COMPILE_TAGS=None, MORE_TEST_TAGS=None, MORE_VARS=None): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } MORE_COMPILE_TAGS = MORE_COMPILE_TAGS if MORE_COMPILE_TAGS else [] MORE_TEST_TAGS = MORE_TEST_TAGS if MORE_TEST_TAGS else [] MORE_VARS = MORE_VARS if MORE_VARS else {} for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [TAG, 'test', distro_name, compiler, f'sasl-{sasl}'] + MORE_COMPILE_TAGS if distro_name == 'rhel8-latest': test_distro = find_large_distro(distro_name) # DEVPROD-18763 else: test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars = [KeyValueParam(key=key, value=value) for key, value in compiler_to_vars(compiler).items()] if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) base_task_name = f'sasl-{sasl}-{SSL}-{distro_str}' for tag in MORE_COMPILE_TAGS: base_task_name = f'{tag}-{base_task_name}' compile_task_name = f'{base_task_name}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [auth, topology, server_ver] + MORE_TEST_TAGS # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'{base_task_name}-test-{server_ver}-{topology}-{auth}' for tag in MORE_TEST_TAGS: test_task_name += f'-{tag}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] if 'cse' in MORE_COMPILE_TAGS: updates.append(KeyValueParam(key='CLIENT_SIDE_ENCRYPTION', value='on')) for key, value in MORE_VARS.items(): updates.append(KeyValueParam(key=key, value=value)) test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunSimpleHTTPServer.call()) if 'cse' in MORE_COMPILE_TAGS: test_commands.append(RunMockKMSServers.call()) test_commands.append(RunTests.call()) res.append( EvgTask( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-2.2.1/.evergreen/config_generator/etc/sasl/000077500000000000000000000000001511661753600234475ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/etc/sasl/compile.py000066400000000000000000000013341511661753600254520ustar00rootroot00000000000000from typing import ClassVar from shrub.v3.evg_command import EvgCommand, EvgCommandType from config_generator.etc.function import Function from config_generator.etc.utils import bash_exec class CompileCommon(Function): ssl: ClassVar[str | None] @classmethod def compile_commands(cls, sasl=None) -> list[EvgCommand]: env = {} if cls.ssl: env['SSL'] = cls.ssl if sasl: env['SASL'] = sasl return [ bash_exec( command_type=EvgCommandType.TEST, add_expansions_to_env=True, env=env, working_dir='mongoc', script='.evergreen/scripts/compile.sh', ), ] mongo-c-driver-2.2.1/.evergreen/config_generator/etc/sasl/test.py000066400000000000000000000060531511661753600250040ustar00rootroot00000000000000from itertools import product from shrub.v3.evg_command import KeyValueParam, expansions_update from shrub.v3.evg_task import EvgTask, EvgTaskDependency from config_generator.components.funcs.bootstrap_mongo_orchestration import BootstrapMongoOrchestration from config_generator.components.funcs.fetch_build import FetchBuild from config_generator.components.funcs.fetch_det import FetchDET from config_generator.components.funcs.run_simple_http_server import RunSimpleHTTPServer from config_generator.components.funcs.run_tests import RunTests from config_generator.etc.distros import compiler_to_vars, find_large_distro, find_small_distro, make_distro_str def generate_test_tasks(SSL, TAG, MATRIX): res = [] TOPOLOGY_TO_STR = { 'server': 'server', 'replica': 'replica_set', 'sharded': 'sharded_cluster', } for distro_name, compiler, arch, sasl, auths, topologies, server_vers in MATRIX: tags = [TAG, 'test', distro_name, compiler] if distro_name == 'rhel8-latest': test_distro = find_large_distro(distro_name) # DEVPROD-18763 else: test_distro = find_small_distro(distro_name) compile_vars = [] compile_vars = [KeyValueParam(key=key, value=value) for key, value in compiler_to_vars(compiler).items()] if arch: tags.append(arch) compile_vars.append(KeyValueParam(key='MARCH', value=arch)) distro_str = make_distro_str(distro_name, compiler, arch) compile_task_name = f'sasl-{sasl}-{SSL}-{distro_str}-compile' for auth, topology, server_ver in product(auths, topologies, server_vers): test_tags = tags + [f'sasl-{sasl}', auth, topology, server_ver] # Do not add `nossl` tag to prevent being selected by legacy config variants. # Remove the `if` when CDRIVER-4571 is resolved. if SSL != 'nossl': test_tags += [SSL] test_task_name = f'sasl-{sasl}-{SSL}-{distro_str}-test-{server_ver}-{topology}-{auth}' test_commands = [] test_commands.append(FetchBuild.call(build_name=compile_task_name)) updates = compile_vars + [ KeyValueParam(key='AUTH', value=auth), KeyValueParam(key='MONGODB_VERSION', value=server_ver), KeyValueParam(key='TOPOLOGY', value=TOPOLOGY_TO_STR[topology]), KeyValueParam(key='SSL', value=SSL), ] test_commands.append(expansions_update(updates=updates)) test_commands.append(FetchDET.call()) test_commands.append(BootstrapMongoOrchestration.call()) test_commands.append(RunSimpleHTTPServer.call()) test_commands.append(RunTests.call()) res.append( EvgTask( name=test_task_name, run_on=test_distro.name, tags=test_tags, depends_on=[EvgTaskDependency(name=compile_task_name)], commands=test_commands, ) ) return res mongo-c-driver-2.2.1/.evergreen/config_generator/etc/utils.py000066400000000000000000000127761511661753600242340ustar00rootroot00000000000000import itertools from importlib import import_module from inspect import isclass from pathlib import Path from textwrap import dedent from typing import Any, Iterable, Literal, Mapping, Type, TypeVar, Union, cast import yaml from shrub.v3.evg_command import EvgCommandType, subprocess_exec from shrub.v3.evg_project import EvgProject from shrub.v3.evg_task import EvgTaskRef from shrub.v3.shrub_service import ConfigDumper from typing_extensions import get_args, get_origin, get_type_hints T = TypeVar('T') # Equivalent to EvgTaskRef but defines additional properties. class TaskRef(EvgTaskRef): """ An evergreen task reference model that also includes additional properties. (The shrub.py model is missing some properties) """ batchtime: int | None = None # Automatically formats the provided script and invokes it in Bash. def bash_exec( script, *, include_expansions_in_env: Iterable[str] | None = None, working_dir: str | None = None, command_type: EvgCommandType | None = None, retry_on_failure: bool | None = None, env: Mapping[str, str] | None = None, **kwargs, ): ret = subprocess_exec( binary='bash', args=['-c', dedent(script)], include_expansions_in_env=list(include_expansions_in_env) if include_expansions_in_env else None, working_dir=working_dir, command_type=command_type, env=dict(env) if env else None, **kwargs, ) if retry_on_failure is not None: ret.params |= {'retry_on_failure': retry_on_failure} return ret def all_components(): res = [] # .evergreen/config_generator/etc/utils.py -> .evergreen/config_generator/components components_dir = Path(__file__).parent.parent / 'components' all_paths = components_dir.glob('**/*.py') for path in sorted(all_paths): component_path = path.relative_to(components_dir) component_str = str(component_path.with_suffix('')) # Drop '.py'. component_str = component_str.replace('/', '.') # 'a/b' -> 'a.b' module_name = f'config_generator.components.{component_str}' res.append(import_module(module_name)) return res # Helper function to print component name for diagnostic purposes. def component_name(component): component_prefix = 'config_generator.components.' res = component.__name__[len(component_prefix) :] return res def write_to_file(yml, filename): # .evergreen/config_generator/etc/utils.py -> .evergreen evergreen_dir = Path(__file__).parent.parent.parent filename = evergreen_dir / 'generated_configs' / filename with open(filename.resolve(), 'w', encoding='utf-8') as file: file.write(yml) class Dumper(ConfigDumper): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # List all tags on a single line. self.FLOW_TAG_COUNT = float('inf') # Make an effort to order fields in a readable manner. # Ordering applies to *all* mappings regardless of the parent node. def represent_mapping(self, tag, mapping, flow_style=False): if len(mapping) == 2 and 'key' in mapping and 'value' in mapping: flow_style = True before = [ 'name', 'display_name', 'command', 'type', 'run_on', 'tags', 'depends_on', 'binary', 'working_dir', ] after = [ 'commands', 'args', ] ordered = {field: mapping.pop(field) for field in before if field in mapping} suffix = {field: mapping.pop(field) for field in after if field in mapping} ordered.update(sorted(mapping.items())) ordered.update(suffix) return self.represent_special_mapping(tag, ordered.items(), flow_style) def to_yaml(project: EvgProject) -> str: return yaml.dump( project.dict(exclude_none=True, exclude_unset=True, by_alias=True), Dumper=Dumper, default_flow_style=False, width=float('inf'), ) def all_possible(typ: Type[T]) -> Iterable[T]: """ Given a finite type, enumerate all possible values of that type. The following are "finite" types: - Literal[...] types - Union[...] of finite types - NamedTuple where each field is a finite type - None """ origin = get_origin(typ) if typ is type(None): yield cast(T, None) elif origin is Literal: # It is a literal type, so enumerate its literal operands yield from get_args(typ) return elif origin == Union: args = get_args(typ) yield from itertools.chain.from_iterable(map(all_possible, args)) elif isclass(typ) and issubclass(typ, tuple): # Iter each NamedTuple field: fields: Iterable[tuple[str, type]] = get_type_hints(typ).items() # Generate lists of pairs of field names and their possible values all_pairs: Iterable[Iterable[tuple[str, str]]] = ( # Generate a (key, opt) pair for each option for 'key' [(key, opt) for opt in all_possible(typ)] # Over each field and type thereof: for key, typ in fields ) # Now generate the cross product of all alternative for all fields: matrix: Iterable[dict[str, Any]] = map(dict, itertools.product(*all_pairs)) for items in matrix: # Reconstruct as a NamedTuple: yield typ(**items) # type: ignore else: raise TypeError(f'Do not know how to do "all_possible" of type {typ!r} ({origin=})') mongo-c-driver-2.2.1/.evergreen/config_generator/generate.py000066400000000000000000000011701511661753600240750ustar00rootroot00000000000000#!/usr/bin/env python3 # Generates *.yml files under .evergreen/generated_configs. import sys from importlib import import_module GENERATOR_NAMES = [ 'functions', 'tasks', 'task_groups', 'variants', 'legacy_config', ] def main(): # Requires Python 3.10 or newer. assert sys.version_info.major >= 3 assert sys.version_info.minor >= 10 for name in GENERATOR_NAMES: m = import_module(f'config_generator.generators.{name}') print(f'Running {name}.generate()...') m.generate() print(f'Running {name}.generate()... done.') if __name__ == '__main__': main() mongo-c-driver-2.2.1/.evergreen/config_generator/generators/000077500000000000000000000000001511661753600241035ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/config_generator/generators/functions.py000066400000000000000000000010061511661753600264620ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): functions = {} for component in utils.all_components(): if hasattr(component, 'functions'): component_name = utils.component_name(component) print(f' - {component_name}') functions.update(component.functions()) functions = dict(sorted(functions.items())) yml = utils.to_yaml(EvgProject(functions=functions)) utils.write_to_file(yml, 'functions.yml') mongo-c-driver-2.2.1/.evergreen/config_generator/generators/legacy_config.py000066400000000000000000000003421511661753600272450ustar00rootroot00000000000000import subprocess import sys def generate(): subprocess.run( args=[ sys.executable, '.evergreen/legacy_config_generator/generate-evergreen-config.py', ], check=True, ) mongo-c-driver-2.2.1/.evergreen/config_generator/generators/task_groups.py000066400000000000000000000010141511661753600270120ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): task_groups = [] for component in utils.all_components(): if hasattr(component, 'task_groups'): component_name = utils.component_name(component) print(f' - {component_name}') task_groups += component.task_groups() task_groups.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(task_groups=task_groups)) utils.write_to_file(yaml, 'task_groups.yml') mongo-c-driver-2.2.1/.evergreen/config_generator/generators/tasks.py000066400000000000000000000007341511661753600256060ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): tasks = [] for component in utils.all_components(): if hasattr(component, 'tasks'): component_name = utils.component_name(component) print(f' - {component_name}') tasks += component.tasks() tasks.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(tasks=tasks)) utils.write_to_file(yaml, 'tasks.yml') mongo-c-driver-2.2.1/.evergreen/config_generator/generators/variants.py000066400000000000000000000007711511661753600263110ustar00rootroot00000000000000from shrub.v3.evg_project import EvgProject from config_generator.etc import utils def generate(): variants = [] for component in utils.all_components(): if hasattr(component, 'variants'): component_name = utils.component_name(component) print(f' - {component_name}') variants += component.variants() variants.sort(key=lambda v: v.name) yaml = utils.to_yaml(EvgProject(buildvariants=variants)) utils.write_to_file(yaml, 'variants.yml') mongo-c-driver-2.2.1/.evergreen/etc/000077500000000000000000000000001511661753600171725ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/etc/ecs_hosted_test.js000066400000000000000000000026341511661753600227140ustar00rootroot00000000000000/** * This script is used to verify the AWS IAM ECS hosted auth works. * It is copied to a remote ECS cluster and run as a task. */ TestData = {}; (function() { "use strict"; // This varies based on hosting ECS task as the account id and role name can vary const AWS_ACCOUNT_ARN = "arn:aws:sts::557821124784:assumed-role/ecsTaskExecutionRole/*"; const conn = MongoRunner.runMongod({ setParameter: { "authenticationMechanisms": "MONGODB-AWS,SCRAM-SHA-256", }, auth: "", }); const external = conn.getDB("$external"); const admin = conn.getDB("admin"); assert.commandWorked(admin.runCommand({createUser: "admin", pwd: "pwd", roles: ['root']})); assert(admin.auth("admin", "pwd")); assert.commandWorked(external.runCommand({createUser: AWS_ACCOUNT_ARN, roles:[{role: 'read', db: "aws"}]})); const uri = "mongodb://127.0.0.1:20000/aws?authMechanism=MONGODB-AWS"; const program = "/root/mongoc/.evergreen/scripts/run-mongodb-aws-ecs-test.sh"; // Try the command line const smoke = runMongoProgram(program, uri); assert.eq(smoke, 0, "Could not auth"); // Try the auth function on a new client. (function () { const conn = Mongo("mongodb://127.0.0.1:20000"); const external = conn.getDB("$external"); assert(external.auth({mechanism: 'MONGODB-AWS'})); }()); MongoRunner.stopMongod(conn); }()); mongo-c-driver-2.2.1/.evergreen/etc/kerberos.realm000066400000000000000000000001461511661753600220310ustar00rootroot00000000000000[realms] LDAPTEST.10GEN.CC = { kdc = ldaptest.10gen.cc admin_server = ldaptest.10gen.cc } mongo-c-driver-2.2.1/.evergreen/etc/mongo-c-driver.spec000066400000000000000000000615221511661753600227040ustar00rootroot00000000000000# remirepo/fedora spec file for mongo-c-driver # # SPDX-FileCopyrightText: Copyright 2015-2025 Remi Collet # SPDX-License-Identifier: CECILL-2.1 # http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt # # Please, preserve the changelog entries # %global gh_owner mongodb %global gh_project mongo-c-driver %global libname libmongoc %global libver 1.0 %global up_version 1.30.2 #global up_prever rc0 # disabled as require a MongoDB server %bcond_with tests # disable for bootstrap (libmongocrypt needs libbson) %bcond_without libmongocrypt %if 0%{?rhel} == 8 %bcond_with libutf8proc %else %bcond_without libutf8proc %endif Name: mongo-c-driver Summary: Client library written in C for MongoDB Version: %{up_version}%{?up_prever:~%{up_prever}} Release: 1%{?dist} # See THIRD_PARTY_NOTICES License: Apache-2.0 AND ISC AND MIT AND Zlib URL: https://github.com/%{gh_owner}/%{gh_project} Source0: https://github.com/%{gh_owner}/%{gh_project}/archive/refs/tags/%{up_version}%{?up_prever:-%{up_prever}}.tar.gz BuildRequires: cmake >= 3.15 BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: make # pkg-config may pull compat-openssl10 BuildRequires: openssl-devel BuildRequires: pkgconfig(libsasl2) BuildRequires: pkgconfig(zlib) BuildRequires: pkgconfig(snappy) %if %{with libutf8proc} BuildRequires: pkgconfig(libutf8proc) %endif BuildRequires: pkgconfig(libzstd) >= 0.8.0 %if %{with tests} BuildRequires: mongodb-server BuildRequires: openssl %endif %if %{with libmongocrypt} # grep VERSION_LESS src/*/CMakeLists.txt BuildRequires: cmake(mongocrypt) >= 1.12.0 %endif BuildRequires: perl-interpreter # From man pages BuildRequires: python3 BuildRequires: python3-sphinx >= 5.0 Requires: %{name}-libs%{?_isa} = %{version}-%{release} # Sub package removed Obsoletes: %{name}-tools < 1.3.0 Provides: %{name}-tools = %{version} Provides: %{name}-tools%{?_isa} = %{version} %description %{name} is a client library written in C for MongoDB. %package libs Summary: Shared libraries for %{name} %if %{without libutf8proc} Provides: bundled(libutf8proc) = 2.8.0 %endif Provides: bundled(uthash) = 2.3.0 %description libs This package contains the shared libraries for %{name}. %package devel Summary: Header files and development libraries for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} Requires: pkgconfig Requires: cmake-filesystem Requires: pkgconfig(libzstd) %if %{with libmongocrypt} Requires: cmake(mongocrypt) %endif %description devel This package contains the header files and development libraries for %{name}. Documentation: http://mongoc.org/libmongoc/%{version}/ %package -n libbson Summary: Building, parsing, and iterating BSON documents # Modified (with bson allocator and some warning fixes and huge indentation # refactoring) jsonsl is bundled . # jsonsl upstream likes copylib approach and does not plan a release # . Provides: bundled(jsonsl) %description -n libbson This is a library providing useful routines related to building, parsing, and iterating BSON documents . %package -n libbson-devel Summary: Development files for %{name} Requires: libbson%{?_isa} = %{version}-%{release} Requires: pkgconfig Requires: cmake-filesystem %description -n libbson-devel This package contains libraries and header files needed for developing applications that use %{name}. Documentation: http://mongoc.org/libbson/%{version}/ %prep %setup -q -n %{gh_project}-%{up_version}%{?up_prever:-%{up_prever}} %build %cmake \ -DBUILD_VERSION=%{up_version}%{?up_prever:-%{up_prever}} \ -DENABLE_MONGOC:BOOL=ON \ -DENABLE_SHM_COUNTERS:BOOL=ON \ -DENABLE_SSL:STRING=OPENSSL \ -DENABLE_SASL:STRING=CYRUS \ -DENABLE_MONGODB_AWS_AUTH:STRING=ON \ -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF \ -DENABLE_CRYPTO_SYSTEM_PROFILE:BOOL=ON \ -DENABLE_MAN_PAGES:BOOL=ON \ -DENABLE_SHARED:BOOL=ON \ -DENABLE_STATIC:STRING=OFF \ -DENABLE_ZLIB:STRING=SYSTEM \ -DENABLE_ZSTD:STRING=ON \ -DENABLE_SNAPPY:STRING=ON \ %if %{with tests} -DENABLE_TESTS:BOOL=ON \ %else -DENABLE_TESTS:BOOL=OFF \ %endif -DENABLE_EXAMPLES:BOOL=OFF \ -DENABLE_UNINSTALL:BOOL=OFF \ %if %{with libmongocrypt} -DENABLE_CLIENT_SIDE_ENCRYPTION:BOOL=ON \ %else -DENABLE_CLIENT_SIDE_ENCRYPTION:BOOL=OFF \ %endif -DCMAKE_SKIP_RPATH:BOOL=ON \ %if %{with libutf8proc} -DUSE_BUNDLED_UTF8PROC:BOOL=OFF \ %else -DUSE_BUNDLED_UTF8PROC:BOOL=ON \ %endif -DENABLE_SRV:BOOL=ON \ -DENABLE_MONGODB_AWS_AUTH:STRING=ON \ -S . %if 0%{?cmake_build:1} %cmake_build %else make %{?_smp_mflags} %endif %install %if 0%{?cmake_install:1} %cmake_install %else make install DESTDIR=%{buildroot} %endif : Static library rm -f %{buildroot}%{_libdir}/*.a rm -rf %{buildroot}%{_libdir}/cmake/*static* rm -rf %{buildroot}%{_libdir}/pkgconfig/*static* : Documentation rm -rf %{buildroot}%{_datadir}/%{name} %check ret=0 %if %{with tests} : Run a server mkdir dbtest mongod \ --journal \ --ipv6 \ --unixSocketPrefix /tmp \ --logpath $PWD/server.log \ --pidfilepath $PWD/server.pid \ --dbpath $PWD/dbtest \ --fork : Run the test suite export MONGOC_TEST_OFFLINE=on export MONGOC_TEST_SKIP_MOCK=on #export MONGOC_TEST_SKIP_SLOW=on make check || ret=1 : Cleanup [ -s server.pid ] && kill $(cat server.pid) %endif if grep -r static %{buildroot}%{_libdir}/cmake; then : cmake configuration file contain reference to static library ret=1 fi exit $ret %files %{_bindir}/mongoc-stat %files libs %license COPYING %license THIRD_PARTY_NOTICES %{_libdir}/%{libname}-%{libver}.so.* %files devel %doc src/%{libname}/examples %doc NEWS %{_includedir}/%{libname}-%{libver} %{_libdir}/%{libname}-%{libver}.so %{_libdir}/pkgconfig/%{libname}-*.pc %{_libdir}/cmake/%{libname}-%{libver} %{_libdir}/cmake/mongoc-%{libver} %{_mandir}/man3/mongoc* %files -n libbson %license COPYING %license THIRD_PARTY_NOTICES %{_libdir}/libbson*.so.* %files -n libbson-devel %doc src/libbson/examples %doc src/libbson/NEWS %{_includedir}/libbson-%{libver} %{_libdir}/libbson*.so %{_libdir}/cmake/libbson-%{libver} %{_libdir}/cmake/bson-%{libver} %{_libdir}/pkgconfig/libbson-*.pc %{_mandir}/man3/bson* %{_mandir}/man3/libbson* %changelog * Wed Mar 5 2025 Remi Collet - 1.30.2-1 - update to 1.30.2 * Tue Feb 25 2025 Remi Collet - 1.30.1-1 - update to 1.30.1 * Tue Feb 18 2025 Remi Collet - 1.30.0-2 - add upstream patch for GCC 15 https://jira.mongodb.org/browse/CDRIVER-5889 * Thu Feb 6 2025 Remi Collet - 1.30.0-1 - update to 1.30.0 * Fri Jan 17 2025 Fedora Release Engineering - 1.29.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild * Tue Jan 7 2025 Remi Collet - 1.29.2-1 - update to 1.29.2 * Thu Dec 12 2024 Remi Collet - 1.29.1-1 - update to 1.29.1 - re-license spec file to CECILL-2.1 * Thu Nov 7 2024 Remi Collet - 1.29.0-1 - update to 1.29.0 - raise dependency to libmongocrypt 1.12.0 * Thu Oct 10 2024 Remi Collet - 1.28.1-1 - update to 1.28.1 * Mon Oct 7 2024 Remi Collet - 1.28.0-2 - rebuild for utf8proc #2316935 * Thu Sep 19 2024 Remi Collet - 1.28.0-1 - update to 1.28.0 - raise dependency to libmongocrypt 1.11.0 * Wed Sep 4 2024 Remi Collet - 1.27.6-1 - update to 1.27.6 * Wed Aug 7 2024 Remi Collet - 1.27.5-1 - update to 1.27.5 * Thu Jul 18 2024 Fedora Release Engineering - 1.27.4-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild * Wed Jul 3 2024 Remi Collet - 1.27.4-1 - update to 1.27.4 * Tue Jul 2 2024 Remi Collet - 1.27.3-1 - update to 1.27.3 * Wed Jun 5 2024 Remi Collet - 1.27.2-1 - update to 1.27.2 * Mon May 13 2024 Remi Collet - 1.27.1-1 - update to 1.27.1 * Thu May 2 2024 Remi Collet - 1.27.0-1 - update to 1.27.0 - raise dependency to libmongocrypt 1.10.0 * Wed Apr 3 2024 Remi Collet - 1.26.2-1 - update to 1.26.2 * Wed Mar 6 2024 Remi Collet - 1.26.1-1 - update to 1.26.1 * Fri Feb 16 2024 Remi Collet - 1.26.0-1 - update to 1.26.0 - raise dependency to libmongocrypt 1.8.0 * Thu Jan 25 2024 Fedora Release Engineering - 1.25.4-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild * Sun Jan 21 2024 Fedora Release Engineering - 1.25.4-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild * Wed Jan 3 2024 Remi Collet - 1.25.4-1 - update to 1.25.4 * Wed Dec 13 2023 Remi Collet - 1.25.3-1 - update to 1.25.3 * Wed Dec 6 2023 Remi Collet - 1.25.2-1 - update to 1.25.2 * Wed Nov 8 2023 Remi Collet - 1.25.1-1 - update to 1.25.1 * Mon Nov 6 2023 Remi Collet - 1.25.0-1 - update to 1.25.0 - drop dependency on libicu - add dependency on libutf8proc - open https://jira.mongodb.org/browse/CDRIVER-4767 unusable archive * Wed Sep 6 2023 Remi Collet - 1.24.4-1 - update to 1.24.4 (no change) * Thu Aug 17 2023 Remi Collet - 1.24.3-1 - update to 1.24.3 * Thu Jul 20 2023 Fedora Release Engineering - 1.24.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild * Thu Jul 13 2023 František Zatloukal - 1.24.2-2 - Rebuilt for ICU 73.2 * Thu Jul 13 2023 Remi Collet - 1.24.2-1 - update to 1.24.2 * Tue Jul 11 2023 František Zatloukal - 1.24.1-2 - Rebuilt for ICU 73.2 * Wed Jun 21 2023 Remi Collet - 1.24.1-1 - update to 1.24.1 * Wed Jun 21 2023 Remi Collet - 1.24.0-1 - update to 1.24.0 * Wed Jun 7 2023 Remi Collet - 1.23.5-1 - update to 1.23.5 * Tue May 9 2023 Remi Collet - 1.23.4-1 - update to 1.23.4 * Wed Apr 5 2023 Remi Collet - 1.23.3-1 - update to 1.23.3 * Thu Jan 19 2023 Fedora Release Engineering - 1.23.2-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild * Wed Jan 4 2023 Remi Collet - 1.23.2-1 - update to 1.23.2 - use SPDX license ID * Sat Dec 31 2022 Pete Walter - 1.23.1-3 - Rebuild for ICU 72 * Thu Oct 20 2022 Remi Collet - 1.23.1-2 - update to 1.23.1 * Thu Sep 8 2022 Remi Collet - 1.23.0-1 - update to 1.23.0 * Wed Aug 3 2022 Remi Collet - 1.22.1-1 - update to 1.22.1 - raise dependency to libmongocrypt 1.5.2 * Mon Aug 01 2022 Frantisek Zatloukal - 1.22.0-3 - Rebuilt for ICU 71.1 * Thu Jul 21 2022 Fedora Release Engineering - 1.22.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild * Mon Jul 18 2022 Remi Collet - 1.22.0-1 - update to 1.22.0 - raise dependency to libmongocrypt 1.5.0 * Wed Jun 8 2022 Remi Collet - 1.21.2-1 - update to 1.21.2 (no change) * Wed Mar 2 2022 Remi Collet - 1.21.1-1 - update to 1.21.1 * Wed Feb 2 2022 Remi Collet - 1.21.0-1 - update to 1.21.0 * Thu Jan 20 2022 Fedora Release Engineering - 1.20.1-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild * Thu Jan 6 2022 Remi Collet - 1.20.1-1 - update to 1.20.1 * Thu Nov 18 2021 Remi Collet - 1.20.0-1 - update to 1.20.0 * Thu Nov 4 2021 Remi Collet - 1.19.2-1 - update to 1.19.2 * Wed Oct 6 2021 Remi Collet - 1.19.1-1 - update to 1.19.1 * Tue Sep 14 2021 Sahana Prasad - 1.19.0-2 - Rebuilt with OpenSSL 3.0.0 * Fri Sep 3 2021 Remi Collet - 1.19.0-1 - update to 1.19.0 * Fri Jul 30 2021 Remi Collet - 1.18.0-3 - use better fix for invalid RPATH using upstream solution from https://jira.mongodb.org/browse/CDRIVER-4013 * Thu Jul 22 2021 Fedora Release Engineering - 1.18.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild * Wed Jul 14 2021 Remi Collet - 1.18.0-1 - update to 1.18.0 * Wed Jul 7 2021 Remi Collet - 1.17.7-1 - update to 1.17.7 * Thu Jun 3 2021 Remi Collet - 1.17.6-2 - update to 1.17.6 - fix invalid rpath * Thu May 20 2021 Pete Walter - 1.17.5-3 - Rebuild for ICU 69 * Wed May 19 2021 Pete Walter - 1.17.5-2 - Rebuild for ICU 69 * Fri Apr 9 2021 Remi Collet - 1.17.5-1 - update to 1.17.5 (no change) * Thu Feb 4 2021 Remi Collet - 1.17.4-1 - update to 1.17.4 * Tue Jan 26 2021 Fedora Release Engineering - 1.17.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild * Wed Dec 2 2020 Remi Collet - 1.17.3-1 - update to 1.17.3 * Wed Nov 4 2020 Remi Collet - 1.17.2-1 - update to 1.17.2 * Wed Oct 7 2020 Remi Collet - 1.17.1-1 - update to 1.17.1 * Fri Jul 31 2020 Remi Collet - 1.17.0-1 - update to 1.17.0 * Tue Jul 28 2020 Fedora Release Engineering - 1.17.0~rc0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild * Fri Jul 24 2020 Remi Collet - 1.17.0~rc0-2 - use more cmake macros - add upstream patch for latest sphinx * Fri Jul 17 2020 Remi Collet - 1.17.0~rc0-1 - update to 1.17.0-rc0 * Thu Jun 11 2020 Remi Collet - 1.17.0~beta2-2 - rebuild * Wed Jun 10 2020 Remi Collet - 1.17.0~beta2-1 - update to 1.17.0-beta2 - drop patch merged upstream * Fri May 15 2020 Pete Walter - 1.17.0~beta-2 - Rebuild for ICU 67 * Wed Apr 15 2020 Remi Collet - 1.17.0~beta-1 - update to 1.17.0-beta - fix cmake for static lilbraries using patch from https://github.com/mongodb/mongo-c-driver/pull/600 * Mon Mar 09 2020 Honza Horak - 1.16.2-2 - Add missing devel libraries to the mongo-c-driver devel sub-package, so depended packages find them * Tue Feb 25 2020 Remi Collet - 1.16.2-1 - update to 1.16.2 (no change) * Tue Feb 4 2020 Remi Collet - 1.16.1-1 - update to 1.16.1 * Wed Jan 29 2020 Fedora Release Engineering - 1.16.0-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild * Tue Jan 21 2020 Remi Collet - 1.16.0-3 - enable client side encryption - add dependency to libmongocrypt * Sat Jan 18 2020 Remi Collet - 1.16.0-2 - clean reference to static library in cmake files - see https://jira.mongodb.org/browse/CDRIVER-3495 * Fri Jan 17 2020 Remi Collet - 1.16.0-1 - update to 1.16.0 - disable client side encryption until #1792224 is approved * Wed Dec 18 2019 Remi Collet - 1.15.3-1 - update to 1.15.3 * Thu Nov 7 2019 Remi Collet - 1.15.2-1 - update to 1.15.2 - add zstd compression support on EL-8 * Fri Nov 01 2019 Pete Walter - 1.15.1-2 - Rebuild for ICU 65 * Mon Sep 2 2019 Remi Collet - 1.15.1-1 - update to 1.15.1 * Wed Aug 21 2019 Remi Collet - 1.15.0-1 - update to 1.15.0 - add zstd compression support on Fedora - use python3 during the build * Thu Jul 25 2019 Fedora Release Engineering - 1.14.0-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild * Mon Feb 25 2019 Remi Collet - 1.14.0-1 - update to 1.14.0 * Thu Jan 31 2019 Remi Collet - 1.13.1-1 - update to 1.13.1 - disable test suite, as MongoDB server is required * Wed Jan 23 2019 Pete Walter - 1.13.0-4 - Rebuild for ICU 63 * Wed Jan 23 2019 Björn Esser - 1.13.0-3 - Append curdir to CMake invokation. (#1668512) * Wed Sep 19 2018 Remi Collet - 1.13.0-2 - enable test suite on all 64-bit arches but skip tests relying on the mock server * Tue Sep 18 2018 Remi Collet - 1.13.0-1 - update to 1.13.0 - open https://jira.mongodb.org/browse/CDRIVER-2827 make install fails - open https://jira.mongodb.org/browse/CDRIVER-2828 test failures - disable test suite * Thu Jul 19 2018 Remi Collet - 1.12.0-1 - update to 1.12.0 * Fri Jul 13 2018 Fedora Release Engineering - 1.11.0-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild * Tue Jul 10 2018 Pete Walter - 1.11.0-2 - Rebuild for ICU 62 * Sat Jun 23 2018 Remi Collet - 1.11.0-1 - update to 1.11.0 - add dependency on libicu * Wed Jun 20 2018 Remi Collet - 1.10.3-1 - update to 1.10.3 * Fri Jun 8 2018 Remi Collet - 1.10.2-1 - update to 1.10.2 - soname switch back to 0 * Thu May 31 2018 Remi Collet - 1.10.1-1 - update to 1.10.1 * Mon May 28 2018 Remi Collet - 1.10.0-2 - add patch from https://github.com/mongodb/mongo-c-driver/pull/498 for https://jira.mongodb.org/browse/CDRIVER-2667 "mongoc-stat is not supported on your platform" - open https://jira.mongodb.org/browse/CDRIVER-2668 "mongoc-stat build but not installed" * Mon May 28 2018 Remi Collet - 1.10.0-1 - update to 1.10.0 - also build libbson and create new sub-packages - switch to cmake - soname bump to 1 * Wed May 2 2018 Remi Collet - 1.9.5-1 - update to 1.9.5 * Tue Apr 10 2018 Remi Collet - 1.9.4-1 - update to 1.9.4 - ensure all libraries referenced in pkgconfig file are required by devel reported as https://jira.mongodb.org/browse/CDRIVER-2603, #1560611 * Wed Mar 14 2018 Charalampos Stratakis - 1.9.3-2 - Fix docs build with Sphinx >= 1.7 * Thu Mar 1 2018 Remi Collet - 1.9.3-1 - update to 1.9.3 * Thu Feb 22 2018 Remi Collet - 1.9.2-5 - add workaround for https://jira.mongodb.org/browse/CDRIVER-2516 - enable test suite * Wed Feb 14 2018 Remi Collet - 1.9.2-4 - drop ldconfig scriptlets - disable again test suite * Thu Feb 08 2018 Fedora Release Engineering - 1.9.2-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild * Fri Jan 12 2018 Remi Collet - 1.9.2-2 - enable test suite on 64-bit * Fri Jan 12 2018 Remi Collet - 1.9.2-1 - update to 1.9.2 (no change) * Wed Jan 10 2018 Remi Collet - 1.9.1-1 - update to 1.9.1 * Fri Dec 22 2017 Remi Collet - 1.9.0-1 - update to 1.9.0 - raise dependency on libbson 1.9 * Fri Nov 17 2017 Remi Collet - 1.8.2-1 - update to 1.8.2 * Thu Oct 12 2017 Remi Collet - 1.8.1-1 - update to 1.8.1 * Fri Sep 15 2017 Remi Collet - 1.8.0-1 - update to 1.8.0 * Thu Aug 10 2017 Remi Collet - 1.7.0-1 - update to 1.7.0 - disable test suite in rawhide (mongodb-server is broken) * Tue Aug 8 2017 Remi Collet - 1.7.0-0.1.rc2 - update to 1.7.0-rc2 - add --with-snappy and --with-zlib build options * Thu Aug 03 2017 Fedora Release Engineering - 1.6.3-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild * Wed Jul 26 2017 Fedora Release Engineering - 1.6.3-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild * Wed May 24 2017 Remi Collet - 1.6.3-1 - update to 1.6.2 * Tue Mar 28 2017 Remi Collet - 1.6.2-1 - update to 1.6.2 * Wed Mar 8 2017 Remi Collet - 1.6.1-2 - rebuild with new upstream tarball - add examples in devel documentation - use patch instead of sed hacks for rpm specific changes * Tue Mar 7 2017 Remi Collet - 1.6.1-1 - update to 1.6.1 - open https://jira.mongodb.org/browse/CDRIVER-2078 can't build man pages * Thu Feb 9 2017 Remi Collet - 1.6.0-1 - update to 1.6.0 - add fix for https://jira.mongodb.org/browse/CDRIVER-2042 from https://github.com/mongodb/mongo-c-driver/pull/421 * Thu Jan 12 2017 Remi Collet - 1.5.3-1 - update to 1.5.3 * Wed Jan 11 2017 Remi Collet - 1.5.2-1 - update to 1.5.2 - run server on both IPv4 and IPv6 - open https://jira.mongodb.org/browse/CDRIVER-1988 - Failed test - revert IPv6 commit * Tue Dec 20 2016 Remi Collet - 1.5.1-1 - update to 1.5.1 * Mon Nov 28 2016 Remi Collet - 1.5.0-1 - update to 1.5.0 * Fri Nov 18 2016 Remi Collet - 1.5.0-0.5.rc6 - update to 1.5.0-rc6 * Fri Nov 4 2016 Remi Collet - 1.5.0-0.4.rc4 - update to 1.5.0-rc4 * Thu Oct 20 2016 Remi Collet - 1.5.0-0.3.rc3 - update to 1.5.0-rc3 - drop patches merged upstream * Fri Oct 14 2016 Remi Collet - 1.5.0-0.2.rc2 - open https://jira.mongodb.org/browse/CDRIVER-1703 missing files - open https://jira.mongodb.org/browse/CDRIVER-1702 broken test - enable test suite * Fri Oct 14 2016 Remi Collet - 1.5.0-0.1.rc2 - update to 1.5.0-rc2 - drop crypto patch merged upstream - drop the private library - disable test suite * Mon Aug 29 2016 Petr Pisar - 1.3.5-6 - Rebuild against libbson-1.4.0 (bug #1361166) * Tue Jul 26 2016 Remi Collet - 1.3.5-5 - add BR on perl, FTBFS from Koschei * Mon Jun 13 2016 Remi Collet - 1.3.5-4 - add workaround to abicheck failure see https://bugzilla.redhat.com/1345868 * Mon May 16 2016 Remi Collet - 1.3.5-2 - add patch to enforce system crypto policies * Thu Mar 31 2016 Remi Collet - 1.3.5-1 - update to 1.3.5 - use --disable-automatic-init-and-cleanup build option - ignore check for libbson version = libmongoc version * Sat Mar 19 2016 Remi Collet - 1.3.4-2 - build with MONGOC_NO_AUTOMATIC_GLOBALS * Tue Mar 15 2016 Remi Collet - 1.3.4-1 - update to 1.3.4 - drop patch merged upstream * Mon Feb 29 2016 Remi Collet - 1.3.3-2 - cleanup for review - move libraries in "libs" sub-package - add patch to skip online tests open https://github.com/mongodb/mongo-c-driver/pull/314 - temporarily disable test suite on arm (#1303864) - temporarily disable test suite on i686/F24+ (#1313018) * Sun Feb 7 2016 Remi Collet - 1.3.3-1 - Update to 1.3.3 * Tue Feb 2 2016 Remi Collet - 1.3.2-1 - Update to 1.3.2 * Thu Jan 21 2016 Remi Collet - 1.3.1-1 - Update to 1.3.1 * Wed Dec 16 2015 Remi Collet - 1.3.0-1 - Update to 1.3.0 - move tools in devel package * Tue Dec 8 2015 Remi Collet - 1.2.3-1 - Update to 1.2.3 * Tue Dec 8 2015 Remi Collet - 1.3.0-1 - Update to 1.3.0 - open https://jira.mongodb.org/browse/CDRIVER-1040 - ABI breaks * Wed Oct 14 2015 Remi Collet - 1.2.0-1 - Update to 1.2.0 * Sun Oct 4 2015 Remi Collet - 1.2.0-0.6.rc0 - Update to 1.2.0-rc0 * Fri Sep 11 2015 Remi Collet - 1.2.0-0.5.20150903git3eaf73e - add patch to export library verson in the API open https://github.com/mongodb/mongo-c-driver/pull/265 * Fri Sep 4 2015 Remi Collet - 1.2.0-0.4.20150903git3eaf73e - update to version 1.2.0beta1 from git snapshot - https://jira.mongodb.org/browse/CDRIVER-828 missing tests/json * Mon Aug 31 2015 Remi Collet - 1.2.0-0.3.beta - more upstream patch (for EL-6) * Mon Aug 31 2015 Remi Collet - 1.2.0-0.2.beta - Upstream version 1.2.0beta * Wed May 20 2015 Remi Collet - 1.1.6-1 - Upstream version 1.1.6 * Mon May 18 2015 Remi Collet - 1.1.5-1 - Upstream version 1.1.5 * Sat Apr 25 2015 Remi Collet - 1.1.4-3 - test build for upstream patch * Thu Apr 23 2015 Remi Collet - 1.1.4-2 - cleanup build dependencies and options * Wed Apr 22 2015 Remi Collet - 1.1.4-1 - Initial package - open https://jira.mongodb.org/browse/CDRIVER-624 - gcc 5 mongo-c-driver-2.2.1/.evergreen/etc/require-api-version.js000066400000000000000000000001001511661753600234250ustar00rootroot00000000000000db.adminCommand({ "setParameter": 1, "requireApiVersion": 1 }); mongo-c-driver-2.2.1/.evergreen/etc/skip-tests.txt000066400000000000000000000055411511661753600220460ustar00rootroot00000000000000# This file lists known failing or flaky tests that for some reason or another # cannot be fixed and rather should be skipped in Evergreen builds. Note that # listing a test in this file will result in the test being skipped on all # platforms, build variants, tasks, etc. # # The format of this file is as follows: # - one test per line, with an optional comment (total lines in file < 1,000) # - comments begin with a hash (#) character and continue to the end of the line # - lines starting with the comment character and blank lines are ignored # - specify test names as they are known to the test runner (e.g., /some/test) # - specify sub-tests of spec tests by an additional slash (/) and the quoted description # (e.g., /some/spec/test/"sub-test 1") # - placing a comment at the end of a line will cause the test runner to output # the comment text as the skip reason when the test is skipped # # Example entries: # /skip/entire/test # this will be output by the runner as the skip reason # /skip/part/of/spec/test/"sub-test description" # this will also be output /change_stream/live/track_resume_token # (CDRIVER-4344) Condition 'bson_compare (resume_token, &doc2_rt) == 0' failed /ClientPool/pop_timeout # (CDRIVER-4348) precondition failed: duration_usec / 1000 >= 1990 /change_streams/legacy/change-streams # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-resume-allowlist # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-resume-errorLabels # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /unified/entity-find-cursor # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] /change_streams/legacy/change-streams-errors # (CDRIVER-4350) Could not establish stream for node 127.0.0.1:8000: [TLS handshake failed: Connection timed out calling hello on '127.0.0.1:8000'] (on ASAN Tests Ubuntu 18.04 build variant) /transactions/legacy/mongos-recovery-token/"commitTransaction retry fails on new mongos" # fails with server selection timeout (CDRIVER-4268) /transactions/legacy/pin-mongos/"unpin after transient error within a transaction and commit" # (CDRIVER-4351) server selection timeout (on ASAN Tests Ubuntu 18.04 build variant) /client_side_encryption/bypass_spawning_mongocryptd/mongocryptdBypassSpawn # Fails if crypt_shared is visible /Stepdown/getmore/single # SPEC-1442: C Driver does not implement connection pools or CMAP. /Stepdown/getmore/pooled # SPEC-1442: C Driver does not implement connection pools or CMAP. mongo-c-driver-2.2.1/.evergreen/etc/spec.patch000066400000000000000000000012461511661753600211500ustar00rootroot00000000000000--- mongo-c-driver.spec.orig 2025-02-28 17:04:19.401176260 -0500 +++ mongo-c-driver.spec 2025-02-28 17:05:52.190076172 -0500 @@ -10,7 +10,7 @@ %global gh_project mongo-c-driver %global libname libmongoc %global libver 1.0 -%global up_version 1.30.2 +%global up_version 1.31.0 #global up_prever rc0 # disabled as require a MongoDB server %bcond_with tests @@ -26,7 +26,7 @@ Name: mongo-c-driver Summary: Client library written in C for MongoDB -Version: %{up_version}%{?up_prever:~%{up_prever}} +Version: %{up_version}%{?up_prever} Release: 1%{?dist} # See THIRD_PARTY_NOTICES License: Apache-2.0 AND ISC AND MIT AND Zlib mongo-c-driver-2.2.1/.evergreen/generated_configs/000077500000000000000000000000001511661753600220655ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/generated_configs/functions.yml000066400000000000000000000644231511661753600246310ustar00rootroot00000000000000functions: abi-compliance-check: - command: subprocess.exec type: setup params: binary: bash args: - -c - | if [[ -n "$XDG_CACHE_DIR" ]]; then cache_dir="$XDG_CACHE_DIR" # XDG Base Directory specification. elif [[ -n "$LOCALAPPDATA" ]]; then cache_dir="$LOCALAPPDATA" # Windows. elif [[ -n "$USERPROFILE" ]]; then cache_dir="$USERPROFILE/.cache" # Windows (fallback). elif [[ -d "$HOME/Library/Caches" ]]; then cache_dir="$HOME/Library/Caches" # MacOS. elif [[ -n "$HOME" ]]; then cache_dir="$HOME/.cache" # Linux-like. elif [[ -d ~/.cache ]]; then cache_dir="~/.cache" # Linux-like (fallback). else cache_dir="$(pwd)/.cache" # EVG task directory (fallback). fi mkdir -p "$cache_dir/mongo-c-driver" || exit cache_dir="$(cd "$cache_dir/mongo-c-driver" && pwd)" || exit printf "MONGO_C_DRIVER_CACHE_DIR: %s\n" "$cache_dir" >|expansions.set-cache-dir.yml - command: expansions.update type: setup params: file: expansions.set-cache-dir.yml - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc include_expansions_in_env: - MONGO_C_DRIVER_CACHE_DIR args: - -c - .evergreen/scripts/abi-compliance-check-setup.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true include_expansions_in_env: - MONGO_C_DRIVER_CACHE_DIR args: - -c - .evergreen/scripts/abi-compliance-check.sh - command: s3.put type: system params: display_name: "ABI Compliance Check: " aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_files_include_filter: abi-compliance/compat_reports/**/compat_report.html permissions: public-read remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${task_id}/${execution}/abi-compliance-check/ - command: s3.put type: system params: display_name: "ABI Compliance Check: " aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/plain local_files_include_filter: abi-compliance/logs/**/log.txt permissions: public-read remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${task_id}/${execution}/abi-compliance-check/ backtrace: - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/debug-core-evergreen.sh bootstrap-mongo-orchestration: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/integration-tests.sh - command: expansions.update type: setup params: file: mongoc/mo-expansion.yml check-headers: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/check-public-decls.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/check-preludes.py . clang-format: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc env: DRYRUN: "1" args: - -c - uv run --frozen --only-group=format tools/format.py --mode=check cse-sasl-cyrus-darwinssl-compile: - command: expansions.update params: updates: - { key: SSL, value: DARWIN } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh cse-sasl-cyrus-openssl-compile: - command: expansions.update params: updates: - { key: SSL, value: OPENSSL } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh cse-sasl-cyrus-winssl-compile: - command: expansions.update params: updates: - { key: SSL, value: WINDOWS } - { key: SASL, value: CYRUS } - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: COMPILE_LIBMONGOCRYPT: "ON" args: - -c - EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON ${EXTRA_CONFIGURE_FLAGS}" .evergreen/scripts/compile.sh docker-login-amazon-ecr: - command: expansions.update params: updates: - { key: DOCKER_CONFIG, value: "${workdir}/.docker" } - command: ec2.assume_role params: role_arn: arn:aws:iam::901841024863:role/ecr-role-evergreen-ro - command: subprocess.exec type: setup params: binary: bash include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN - DOCKER_CONFIG args: - -c - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 901841024863.dkr.ecr.us-east-1.amazonaws.com fetch-build: - command: subprocess.exec type: setup params: binary: bash args: - -c - rm -rf mongoc - command: s3.get type: setup params: aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads local_file: build.tar.gz remote_file: ${project}/${build_variant}/${revision}/${BUILD_NAME}/${build_id}.tar.gz - command: archive.targz_extract params: destination: mongoc path: build.tar.gz - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done fetch-det: - command: subprocess.exec type: setup params: binary: bash args: - -c - | if [[ ! -d drivers-evergreen-tools ]]; then git clone --depth=1 https://github.com/mongodb-labs/drivers-evergreen-tools.git fi - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools args: - -c - find .evergreen -type f -name "*.sh" -exec chmod +rx "{}" \; fetch-source: - command: git.get_project type: setup params: directory: mongoc - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | set -o errexit set -o pipefail if [ -n "${github_pr_number}" -o "${is_patch}" = "true" ]; then VERSION=patch-${version_id} else VERSION=latest fi echo "CURRENT_VERSION: $VERSION" > expansion.yml - command: expansions.update type: setup params: file: mongoc/expansion.yml - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc args: - -c - | for file in $(find .evergreen/scripts -type f); do chmod +rx "$file" || exit done kms-divergence-check: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/kms-divergence-check.sh make-docs: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc include_expansions_in_env: - distro_id args: - -c - | # See SphinxBuild.cmake for EVG_DOCS_BUILD reasoning uv run --frozen --only-group docs env EVG_DOCS_BUILD=1 .evergreen/scripts/build-docs.sh openssl-compat: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc include_expansions_in_env: - OPENSSL_ENABLE_FIPS - OPENSSL_USE_STATIC_LIBS - OPENSSL_VERSION args: - -c - .evergreen/scripts/openssl-compat-setup.sh - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc include_expansions_in_env: - OPENSSL_USE_STATIC_LIBS - OPENSSL_VERSION args: - -c - .evergreen/scripts/openssl-compat-check.sh restore-instance-profile: - command: subprocess.exec params: binary: bash args: - -c - | # Restore the AWS Instance Profile that may have been removed in AWS tasks. if [[ ! -d drivers-evergreen-tools ]]; then echo "drivers-evergreen-tools not present ... skipping" exit 0 fi cd drivers-evergreen-tools/.evergreen/auth_aws if [[ ! -f aws_e2e_setup.json ]]; then echo "aws_e2e_setup.json not present ... skipping" exit 0 fi . ./activate-authawsvenv.sh echo "restoring instance profile ... " # Capture and hide logs on success. Logs may included expected `HTTP Error 404: Not Found` messages when checking for instance profile. if ! { python ./lib/aws_assign_instance_profile.py 2>&1 >|output.txt; }; then echo "restoring instance profile ... failed" cat output.txt 1>&2 exit 1 fi echo "restoring instance profile ... succeeded" run-mock-kms-servers: - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools/.evergreen/csfle args: - -c - | set -o errexit echo "Preparing KMS TLS venv environment..." # TODO: remove this function along with the "run kms servers" function. if [[ "$OSTYPE" =~ cygwin && ! -d kmstlsvenv ]]; then # Avoid using Python 3.10 on Windows due to incompatible cipher suites. # See CDRIVER-4530. . ../venv-utils.sh venvcreate "C:/python/Python39/python.exe" kmstlsvenv || # windows-2017 venvcreate "C:/python/Python38/python.exe" kmstlsvenv # windows-2015 python -m pip install --upgrade boto3~=1.19 pykmip~=0.10.0 "sqlalchemy<2.0.0" deactivate else . ./activate-kmstlsvenv.sh deactivate fi echo "Preparing KMS TLS venv environment... done." - command: subprocess.exec type: setup params: binary: bash working_dir: drivers-evergreen-tools/.evergreen/csfle background: true args: - -c - | set -o errexit echo "Starting mock KMS TLS servers..." . ./activate-kmstlsvenv.sh python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 & python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --require_client_cert --port 9002 & python -u kms_failpoint_server.py --port 9003 & python -u kms_kmip_server.py & deactivate echo "Starting mock KMS TLS servers... done." run-simple-http-server: - command: subprocess.exec type: setup params: binary: bash working_dir: mongoc background: true args: - -c - | set -o errexit echo "Starting simple HTTP server..." uvx python .evergreen/scripts/simple_http_server.py echo "Starting simple HTTP server... done." run-tests: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/run-tests.sh sasl-cyrus-darwinssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: CYRUS SSL: DARWIN args: - -c - .evergreen/scripts/compile.sh sasl-cyrus-openssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: CYRUS SSL: OPENSSL args: - -c - .evergreen/scripts/compile.sh sasl-off-nossl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: "OFF" SSL: "OFF" args: - -c - .evergreen/scripts/compile.sh sasl-off-winssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: "OFF" SSL: WINDOWS args: - -c - .evergreen/scripts/compile.sh sasl-sspi-winssl-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true env: SASL: SSPI SSL: WINDOWS args: - -c - .evergreen/scripts/compile.sh sbom: - command: ec2.assume_role type: setup params: role_arn: ${kondukto_role_arn} - command: subprocess.exec type: setup params: binary: bash include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN args: - -c - | set -o errexit set -o pipefail kondukto_token="$(aws secretsmanager get-secret-value --secret-id "kondukto-token" --region "us-east-1" --query 'SecretString' --output text)" printf "KONDUKTO_TOKEN: %s\n" "$kondukto_token" >|expansions.kondukto.yml - command: expansions.update type: setup params: file: expansions.kondukto.yml - command: expansions.update params: updates: - { key: DOCKER_CONFIG, value: "${workdir}/.docker" } - command: ec2.assume_role params: role_arn: arn:aws:iam::901841024863:role/ecr-role-evergreen-ro - command: subprocess.exec type: setup params: binary: bash include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN - DOCKER_CONFIG args: - -c - aws ecr get-login-password --region us-east-1 | podman login --username AWS --password-stdin 901841024863.dkr.ecr.us-east-1.amazonaws.com - command: subprocess.exec type: test params: binary: bash working_dir: mongoc include_expansions_in_env: - branch_name - DOCKER_CONFIG - KONDUKTO_TOKEN args: - -c - .evergreen/scripts/sbom.sh - command: s3.put type: test params: display_name: Augmented SBOM aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: application/json local_file: mongoc/augmented-sbom.json permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/sbom/augmented-sbom.json scan-build: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true redirect_standard_error_to_output: true args: - -c - .evergreen/scripts/compile-scan-build.sh set-cache-dir: - command: subprocess.exec type: setup params: binary: bash args: - -c - | if [[ -n "$XDG_CACHE_DIR" ]]; then cache_dir="$XDG_CACHE_DIR" # XDG Base Directory specification. elif [[ -n "$LOCALAPPDATA" ]]; then cache_dir="$LOCALAPPDATA" # Windows. elif [[ -n "$USERPROFILE" ]]; then cache_dir="$USERPROFILE/.cache" # Windows (fallback). elif [[ -d "$HOME/Library/Caches" ]]; then cache_dir="$HOME/Library/Caches" # MacOS. elif [[ -n "$HOME" ]]; then cache_dir="$HOME/.cache" # Linux-like. elif [[ -d ~/.cache ]]; then cache_dir="~/.cache" # Linux-like (fallback). else cache_dir="$(pwd)/.cache" # EVG task directory (fallback). fi mkdir -p "$cache_dir/mongo-c-driver" || exit cache_dir="$(cd "$cache_dir/mongo-c-driver" && pwd)" || exit printf "MONGO_C_DRIVER_CACHE_DIR: %s\n" "$cache_dir" >|expansions.set-cache-dir.yml - command: expansions.update type: setup params: file: expansions.set-cache-dir.yml start-load-balancer: - command: subprocess.exec type: setup params: binary: bash args: - -c - | export DRIVERS_TOOLS=./drivers-evergreen-tools export MONGODB_URI="${MONGODB_URI}" export PATH="$(uv tool dir --bin):$PATH" # DEVPROD-19733 $DRIVERS_TOOLS/.evergreen/run-load-balancer.sh start - command: expansions.update type: setup params: file: lb-expansion.yml std-compile: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/compile-std.sh stop-load-balancer: - command: subprocess.exec params: binary: bash args: - -c - | # Only run if a load balancer was started. if [[ -z "${SINGLE_MONGOS_LB_URI}" ]]; then echo "OK - no load balancer running" exit fi if [[ -d drivers-evergreen-tools ]]; then cd drivers-evergreen-tools && .evergreen/run-load-balancer.sh stop fi stop-mongo-orchestration: - command: subprocess.exec params: binary: bash args: - -c - | if [[ -d MO ]]; then cd MO && mongo-orchestration stop fi upload-build: - command: archive.targz_pack params: include: - ./** source_dir: mongoc target: ${build_id}.tar.gz - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: ${build_id}.tar.gz permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${task_name}/${build_id}.tar.gz upload-docs: - command: subprocess.exec params: binary: bash working_dir: mongoc/_build/for-docs/src/libbson env: AWS_ACCESS_KEY_ID: ${aws_key} AWS_SECRET_ACCESS_KEY: ${aws_secret} args: - -c - aws s3 cp doc/html s3://mciuploads/${project}/docs/libbson/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1 - command: s3.put params: display_name: libbson docs aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/_build/for-docs/src/libbson/doc/html/index.html permissions: public-read remote_file: ${project}/docs/libbson/${CURRENT_VERSION}/index.html - command: subprocess.exec params: binary: bash working_dir: mongoc/_build/for-docs/src/libmongoc env: AWS_ACCESS_KEY_ID: ${aws_key} AWS_SECRET_ACCESS_KEY: ${aws_secret} args: - -c - aws s3 cp doc/html s3://mciuploads/${project}/docs/libmongoc/${CURRENT_VERSION} --quiet --recursive --acl public-read --region us-east-1 - command: s3.put params: display_name: libmongoc docs aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/_build/for-docs/src/libmongoc/doc/html/index.html permissions: public-read remote_file: ${project}/docs/libmongoc/${CURRENT_VERSION}/index.html upload-man-pages: - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - | set -o errexit # Get "aha", the ANSI HTML Adapter. git clone --depth 1 https://github.com/theZiz/aha.git aha-repo pushd aha-repo make popd # aha-repo mv aha-repo/aha . .evergreen/scripts/man-pages-to-html.sh libbson _build/for-docs/src/libbson/doc/man > bson-man-pages.html .evergreen/scripts/man-pages-to-html.sh libmongoc _build/for-docs/src/libmongoc/doc/man > mongoc-man-pages.html - command: s3.put params: display_name: libbson man pages aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/bson-man-pages.html permissions: public-read remote_file: ${project}/man-pages/libbson/${CURRENT_VERSION}/index.html - command: s3.put params: display_name: libmongoc man pages aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: text/html local_file: mongoc/mongoc-man-pages.html permissions: public-read remote_file: ${project}/man-pages/libmongoc/${CURRENT_VERSION}/index.html upload-mo-artifacts: - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - | set -o errexit declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi if [[ -d "$dir" ]]; then find "$dir" -name \*.log | xargs tar czf mongodb-logs.tar.gz fi - command: s3.put params: display_name: mongodb-logs.tar.gz aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: mongoc/mongodb-logs.tar.gz optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-mongodb-logs.tar.gz - command: s3.put params: display_name: orchestration.log aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|text/plain} local_file: mongoc/MO/server.log optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/logs/${task_id}-${execution}-orchestration.log - command: subprocess.exec params: binary: bash working_dir: mongoc args: - -c - | set -o errexit # Find all core files from mongodb in orchestration and move to mongoc declare dir="MO" if [[ -d "/cygdrive/c/data/mo" ]]; then dir="/cygdrive/c/data/mo" fi declare mdmp_dir="$dir" if [[ -d "/cygdrive/c/mongodb" ]]; then mdmp_dir="/cygdrive/c/mongodb" fi for core_file in $(find -H "$dir" "$mdmp_dir" \( -name "*.core" -o -name "*.mdmp" \) 2> /dev/null); do declare base_name base_name="$(echo "$core_file" | sed "s/.*\///")" # Move file if it does not already exist if [[ ! -f "$base_name" ]]; then mv "$core_file" . fi done - command: archive.targz_pack params: include: - ./**.core - ./**.mdmp source_dir: mongoc target: mongo-coredumps.tgz - command: s3.put params: display_name: Core Dumps - Execution ${execution} aws_key: ${aws_key} aws_secret: ${aws_secret} bucket: mciuploads content_type: ${content_type|application/x-gzip} local_file: mongo-coredumps.tgz optional: true permissions: public-read remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/coredumps/${task_id}-${execution}-coredumps.log upload-test-results: - command: subprocess.exec params: binary: bash args: - -c - | mkdir -p mongoc touch mongoc/test-results.json - command: attach.results params: file_location: mongoc/test-results.json mongo-c-driver-2.2.1/.evergreen/generated_configs/legacy-config.yml000066400000000000000000010411101511661753600253150ustar00rootroot00000000000000#################################### # Evergreen configuration # # Generated with evergreen_config_generator from # github.com/mongodb-labs/drivers-evergreen-tools # # DO NOT EDIT THIS FILE # #################################### functions: install ssl: - command: shell.exec params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit .evergreen/scripts/install-ssl.sh upload coverage: - command: shell.exec params: silent: true working_dir: mongoc shell: bash script: |- set -o errexit export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp coverage s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/coverage/ --recursive --acl public-read --region us-east-1 - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/coverage/index.html bucket: mciuploads permissions: public-read local_file: mongoc/coverage/index.html content_type: text/html display_name: Coverage Report upload scan artifacts: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit if find scan -name \*.html | grep -q html; then (cd scan && find . -name index.html -exec echo "
  • {}
  • " \;) >> scan.html else echo "No issues found" > scan.html fi - command: shell.exec params: silent: true working_dir: mongoc shell: bash script: |- set -o errexit export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp scan s3://mciuploads/${project}/${build_variant}/${revision}/${version_id}/${build_id}/scan/ --recursive --acl public-read --region us-east-1 - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${build_variant}/${revision}/${version_id}/${build_id}/scan/index.html bucket: mciuploads permissions: public-read local_file: mongoc/scan.html content_type: text/html display_name: Scan Build Report run auth tests: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit .evergreen/scripts/run-auth-tests.sh link sample program: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Compile a program that links dynamically or statically to libmongoc, # using variables from pkg-config or CMake's find_package command. export BUILD_SAMPLE_WITH_CMAKE=${BUILD_SAMPLE_WITH_CMAKE} export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= .evergreen/scripts/link-sample-program.sh LINK_STATIC=1 .evergreen/scripts/link-sample-program.sh link sample program bson: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit # Compile a program that links dynamically or statically to libbson, # using variables from pkg-config or from CMake's find_package command. BUILD_SAMPLE_WITH_CMAKE= LINK_STATIC= .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE= LINK_STATIC=1 .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 LINK_STATIC= .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 LINK_STATIC=1 .evergreen/scripts/link-sample-program-bson.sh link sample program MSVC: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd link sample program mingw: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. PATH="/cygdrive/c/ProgramData/chocolatey/lib/winlibs/tools/mingw64/bin:$PATH" # mingw-w64 GCC cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw.cmd link sample program MSVC bson: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd link sample program mingw bson: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. PATH="/cygdrive/c/ProgramData/chocolatey/lib/winlibs/tools/mingw64/bin:$PATH" # mingw-w64 GCC cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw-bson.cmd update codecov.io: - command: shell.exec params: working_dir: mongoc shell: bash script: |- set -o errexit # Note: coverage is currently only enabled on the ubuntu1804 distro. # This script does not support MacOS, Windows, or non-x86_64 distros. # Update accordingly if code coverage is expanded to other distros. curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov # -Z: Exit with a non-zero value if error. # -g: Run with gcov support. # -t: Codecov upload token. # perl: filter verbose "Found" list and "Processing" messages. ./codecov -Zgt "${codecov_token}" | perl -lne 'print if not m|^.*\.gcov(\.\.\.)?$|' compile coverage: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit COVERAGE=ON .evergreen/scripts/compile.sh run aws tests: - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN shell: bash script: |- set -o errexit pushd ../drivers-evergreen-tools/.evergreen/auth_aws ./setup_secrets.sh drivers/aws_auth popd # ../drivers-evergreen-tools/.evergreen/auth_aws - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - TESTCASE shell: bash script: |- set -o errexit pushd ../drivers-evergreen-tools/.evergreen/auth_aws . ./activate-authawsvenv.sh popd # ../drivers-evergreen-tools/.evergreen/auth_aws .evergreen/scripts/run-aws-tests.sh tasks: - name: hardened-compile tags: - hardened commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-fno-strict-overflow -D_FORTIFY_SOURCE=2 -fstack-protector-all -O" EXTRA_CONFIGURE_FLAGS="CMAKE_POSITION_INDEPENDENT_CODE=ON" LDFLAGS="-Wl,-z,relro -Wl,-z,now" SNAPPY="OFF" ZLIB="OFF" ZSTD="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-zlib tags: - compression - zlib commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SNAPPY="OFF" ZLIB="BUNDLED" ZSTD="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-snappy tags: - compression - snappy commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SNAPPY="ON" ZLIB="OFF" ZSTD="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-compression-zstd tags: - compression - zstd commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SNAPPY="OFF" ZLIB="OFF" ZSTD="ON" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-nossl tags: - debug-compile - nosasl - nossl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SSL="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-lto commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-flto" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-lto-thin commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-flto=thin" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-no-counters tags: - debug-compile - no-counters commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env ENABLE_SHM_COUNTERS="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: compile-tracing commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-Werror -Wno-cast-align" TRACING="ON" .evergreen/scripts/compile.sh - func: upload-build - name: release-compile commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env RELEASE="ON" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-openssl tags: - debug-compile - nosasl - openssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SSL="OPENSSL" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-darwinssl tags: - darwinssl - debug-compile - nosasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SSL="DARWIN" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosasl-winssl tags: - debug-compile - nosasl - winssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SSL="WINDOWS" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-openssl tags: - debug-compile - openssl - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SASL="AUTO" SSL="OPENSSL" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sasl-darwinssl tags: - darwinssl - debug-compile - sasl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SASL="AUTO" SSL="DARWIN" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-rdtscp commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env ENABLE_RDTSCP="ON" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-sspi-winssl tags: - debug-compile - sspi - winssl commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SASL="SSPI" SSL="WINDOWS" .evergreen/scripts/compile.sh - func: upload-build - name: debug-compile-nosrv tags: - debug-compile commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SRV="OFF" .evergreen/scripts/compile.sh - func: upload-build - name: link-with-cmake commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 - name: link-with-cmake-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 ENABLE_SSL: 1 - name: link-with-cmake-snappy commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 ENABLE_SNAPPY: 'ON' - name: link-with-cmake-mac commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: BUILD_SAMPLE_WITH_CMAKE: 1 - name: link-with-cmake-windows commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program MSVC - name: link-with-cmake-windows-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration vars: SSL: openssl - func: link sample program MSVC vars: ENABLE_SSL: 1 - name: link-with-cmake-windows-snappy commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program MSVC vars: ENABLE_SNAPPY: 'ON' - name: link-with-cmake-mingw commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program mingw - name: link-with-pkg-config commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program - name: link-with-pkg-config-mac commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program - name: link-with-pkg-config-ssl commands: - func: fetch-det - func: bootstrap-mongo-orchestration - func: link sample program vars: ENABLE_SSL: 1 - name: link-with-bson commands: - func: link sample program bson - name: link-with-bson-mac commands: - func: link sample program bson - name: link-with-bson-windows commands: - func: link sample program MSVC bson - name: link-with-bson-mingw commands: - func: link sample program mingw bson - name: debian-package-build commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit export IS_PATCH="${is_patch}" .evergreen/scripts/debian_package_build.sh - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-debian-packages-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: deb.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages.tar.gz bucket: mciuploads permissions: public-read local_file: deb.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-debian-packages-i386-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: deb-i386.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages-i386.tar.gz bucket: mciuploads permissions: public-read local_file: deb-i386.tar.gz content_type: ${content_type|application/x-gzip} - name: rpm-package-build commands: - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit export IS_PATCH="${is_patch}" .evergreen/scripts/check_rpm_spec.sh - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit .evergreen/scripts/build_snapshot_rpm.sh - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/mongo-c-driver-rpm-packages-${CURRENT_VERSION}.tar.gz bucket: mciuploads permissions: public-read local_file: rpm.tar.gz content_type: ${content_type|application/x-gzip} - command: s3.put params: aws_key: ${aws_key} aws_secret: ${aws_secret} remote_file: ${project}/${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-rpm-packages.tar.gz bucket: mciuploads permissions: public-read local_file: rpm.tar.gz content_type: ${content_type|application/x-gzip} - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit sudo rm -rf ../build ../mock-result ../rpm.tar.gz export MOCK_TARGET_CONFIG=rocky+epel-9-aarch64 .evergreen/scripts/build_snapshot_rpm.sh - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit sudo rm -rf ../build ../mock-result ../rpm.tar.gz export MOCK_TARGET_CONFIG=rocky+epel-8-aarch64 .evergreen/scripts/build_snapshot_rpm.sh - name: debug-compile-with-warnings commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env CFLAGS="-Werror -Wno-cast-align" .evergreen/scripts/compile.sh - func: upload-build - name: install-libmongoc-after-libbson commands: - command: shell.exec type: test params: working_dir: mongoc include_expansions_in_env: - distro_id shell: bash script: |- set -o errexit .evergreen/scripts/install-libmongoc-after-libbson.sh - name: test-coverage-latest-replica-set-auth-sasl-openssl tags: - latest - test-coverage commands: - func: compile coverage vars: SASL: AUTO SSL: OPENSSL - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest SSL: openssl TOPOLOGY: replica_set - func: run-simple-http-server - func: run-tests vars: AUTH: auth COVERAGE: 'ON' SSL: openssl - func: upload coverage - func: update codecov.io - name: test-coverage-latest-replica-set-auth-sasl-openssl-cse tags: - client-side-encryption - latest - test-coverage commands: - func: compile coverage vars: COMPILE_LIBMONGOCRYPT: 'ON' EXTRA_CONFIGURE_FLAGS: EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON" SASL: AUTO SSL: OPENSSL - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest SSL: openssl TOPOLOGY: replica_set - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests vars: AUTH: auth CLIENT_SIDE_ENCRYPTION: 'ON' COVERAGE: 'ON' SSL: openssl - func: upload coverage - func: update codecov.io - name: test-dns-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-darwinssl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: noauth DNS: 'on' SSL: ssl - name: test-dns-loadbalanced-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: 'on' SSL: ssl TOPOLOGY: sharded_cluster - func: fetch-det - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth DNS: loadbalanced SSL: ssl - name: test-dns-auth-openssl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-dns-auth-winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-dns-auth-darwinssl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth SSL: ssl TOPOLOGY: replica_set - func: run-tests vars: AUTH: auth DNS: dns-auth SSL: ssl - name: test-latest-server-compression-zlib tags: - compression - latest - zlib depends_on: name: debug-compile-compression-zlib commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-zlib - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: zlib SSL: nossl - name: test-latest-server-compression-snappy tags: - compression - latest - snappy depends_on: name: debug-compile-compression-snappy commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-snappy - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: snappy SSL: nossl - name: test-latest-server-compression-zstd tags: - compression - latest - zstd depends_on: name: debug-compile-compression-zstd commands: - func: fetch-build vars: BUILD_NAME: debug-compile-compression-zstd - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth SSL: nossl - func: run-simple-http-server - func: run-tests vars: AUTH: noauth COMPRESSORS: zstd SSL: nossl - name: retry-true-latest-server depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: URI: mongodb://localhost/?retryWrites=true - name: test-latest-server-hardened tags: - hardened - latest depends_on: name: hardened-compile commands: - func: fetch-build vars: BUILD_NAME: hardened-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: URI: null - name: authentication-tests-openssl tags: - authentication-tests - openssl - sasl depends_on: name: debug-compile-sasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-openssl - func: run auth tests - name: authentication-tests-darwinssl tags: - authentication-tests - darwinssl - sasl depends_on: name: debug-compile-sasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sasl-darwinssl - func: run auth tests - name: authentication-tests-winssl tags: - authentication-tests - sspi - winssl depends_on: name: debug-compile-sspi-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-sspi-winssl - func: run auth tests - name: authentication-tests-openssl-nosasl tags: - authentication-tests - nosasl - openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: run auth tests - name: authentication-tests-asan-memcheck tags: - asan - authentication-tests commands: - command: shell.exec type: test params: working_dir: mongoc add_expansions_to_env: true shell: bash script: |- set -o errexit env SANITIZE=address SASL=AUTO SSL=OPENSSL .evergreen/scripts/compile.sh - func: run auth tests vars: ASAN: 'on' - name: test-versioned-api-8.0 tags: - '8.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-8.0 tags: - '8.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: versioned-api-testing.json SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-versioned-api-7.0 tags: - '7.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-7.0 tags: - '7.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: versioned-api-testing.json SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-versioned-api-6.0 tags: - '6.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-6.0 tags: - '6.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: versioned-api-testing.json SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-versioned-api-5.0 tags: - '5.0' - versioned-api depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' REQUIRE_API_VERSION: 'true' SSL: ssl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: auth MONGODB_API_VERSION: 1 SSL: ssl - name: test-versioned-api-accept-version-two-5.0 tags: - '5.0' - versioned-api depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: versioned-api-testing.json SSL: nossl TOPOLOGY: server - func: run-simple-http-server - func: run-tests vars: AUTH: noauth MONGODB_API_VERSION: 1 SSL: nossl - name: test-latest-server-ipv6-client-ipv6-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests vars: URI: mongodb://[::1]/ - name: test-latest-server-ipv6-client-ipv4-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests vars: URI: mongodb://127.0.0.1/ - name: test-latest-server-ipv4-client-ipv4-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests vars: URI: mongodb://127.0.0.1/ - name: test-latest-server-ipv4-client-localhost-noauth-nosasl-nossl tags: - ipv4-ipv6 - latest - nosasl - nossl - server depends_on: name: debug-compile-nosasl-nossl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-nossl - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests vars: URI: mongodb://localhost/ - name: debug-compile-aws commands: - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true include_expansions_in_env: - CC shell: bash script: |- set -o errexit set -o errexit set -o pipefail # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true # Ubuntu 20.04 does not have uv. if ! command -v uv >/dev/null; then prefix="$(mktemp -d)" python3 -m pip install --prefix "$prefix" uv PATH="$prefix/bin:$PATH" fi # Compile test-awsauth. Disable unnecessary dependencies since test-awsauth is copied to a remote Ubuntu 20.04 ECS cluster for testing, which may not have all dependent libraries. uvx cmake -DENABLE_TRACING=ON -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF -S . -B cmake-build uvx cmake --build cmake-build --target test-awsauth - func: upload-build - name: test-aws-openssl-regular-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-regular-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: REGULAR - name: test-aws-openssl-ec2-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ec2-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: EC2 - name: test-aws-openssl-ecs-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-ecs-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ECS - name: test-aws-openssl-lambda-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-lambda-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: LAMBDA - name: test-aws-openssl-assume_role-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE - name: test-aws-openssl-assume_role_with_web_identity-latest tags: - latest - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: latest ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-8.0 tags: - '8.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '8.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-7.0 tags: - '7.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '7.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-6.0 tags: - '6.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '6.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-5.0 tags: - '5.0' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '5.0' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: test-aws-openssl-assume_role_with_web_identity-4.4 tags: - '4.4' - test-aws depends_on: name: debug-compile-aws commands: - func: fetch-build vars: BUILD_NAME: debug-compile-aws - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth MONGODB_VERSION: '4.4' ORCHESTRATION_FILE: auth-aws.json TOPOLOGY: server - func: run aws tests vars: TESTCASE: ASSUME_ROLE_WITH_WEB_IDENTITY - name: ocsp-openssl-test_1-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_3-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_3-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_3 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-8.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-delegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-8.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-test_4-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-test_4-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-soft_fail_test-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-soft_fail_test-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=SOFT_FAIL_TEST CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-8.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-delegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-delegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=ON .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-8.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-darwinssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-darwinssl depends_on: name: debug-compile-nosasl-darwinssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-darwinssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_1-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_1-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_1 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-latest tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-8.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-7.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-6.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-5.0 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-winssl-malicious_server_test_2-rsa-nodelegate-4.4 tags: - ocsp-winssl depends_on: name: debug-compile-nosasl-winssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-winssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=rsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-malicious_server_test_2-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-mustStaple-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit TEST_COLUMN=MALICIOUS_SERVER_TEST_2 CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-rsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=rsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: rsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=rsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-latest tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: latest OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-8.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '8.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-7.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '7.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-6.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '6.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-5.0 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '5.0' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: ocsp-openssl-cache-ecdsa-nodelegate-4.4 tags: - ocsp-openssl depends_on: name: debug-compile-nosasl-openssl commands: - func: fetch-build vars: BUILD_NAME: debug-compile-nosasl-openssl - func: fetch-det - command: shell.exec type: test params: working_dir: mongoc shell: bash script: |- set -o errexit TEST_COLUMN=TEST_4 CERT_TYPE=ecdsa USE_DELEGATE=OFF .evergreen/scripts/run-ocsp-responder.sh - func: bootstrap-mongo-orchestration vars: MONGODB_VERSION: '4.4' OCSP: 'on' ORCHESTRATION_FILE: ecdsa-basic-tls-ocsp-disableStapling.json SSL: ssl TOPOLOGY: server - command: shell.exec type: test params: working_dir: mongoc redirect_standard_error_to_output: true shell: bash script: |- set -o errexit CERT_TYPE=ecdsa .evergreen/scripts/run-ocsp-cache-test.sh patchable: false - name: testazurekms-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit echo "Building test-azurekms ... begin" pushd mongoc .evergreen/scripts/compile-test-azurekms.sh popd echo "Building test-azurekms ... end" echo "Copying files ... begin" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testazurekms cp ./mongoc/src/libmongoc/test-azurekms ./mongoc/install/lib/libmongocrypt.* testazurekms tar czf testazurekms.tgz testazurekms/* AZUREKMS_SRC="testazurekms.tgz" \ AZUREKMS_DST="./" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" AZUREKMS_CMD="tar xf testazurekms.tgz" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh echo "Untarring file ... end" - command: shell.exec type: test params: shell: bash script: |- set -o errexit export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools AZUREKMS_CMD="LD_LIBRARY_PATH=./testazurekms MONGODB_URI='mongodb://localhost:27017' KEY_NAME='${testazurekms_keyname}' KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' ./testazurekms/test-azurekms" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh - name: testazurekms-fail-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit pushd mongoc .evergreen/scripts/compile-test-azurekms.sh popd - command: shell.exec type: test params: shell: bash script: |- set -o errexit LD_LIBRARY_PATH=$PWD/install \ MONGODB_URI='mongodb://localhost:27017' \ KEY_NAME='${testazurekms_keyname}' \ KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' \ EXPECT_ERROR='Error from Azure IMDS server' \ ./mongoc/src/libmongoc/test-azurekms - name: testgcpkms-task commands: - func: fetch-source - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit echo "Building test-gcpkms ... begin" pushd mongoc .evergreen/scripts/compile-test-gcpkms.sh popd echo "Building test-gcpkms ... end" echo "Copying files ... begin" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testgcpkms cp ./mongoc/src/libmongoc/test-gcpkms ./mongoc/install/lib/libmongocrypt.* testgcpkms tar czf testgcpkms.tgz testgcpkms/* GCPKMS_SRC="testgcpkms.tgz" GCPKMS_DST=$GCPKMS_INSTANCENAME: $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" GCPKMS_CMD="tar xf testgcpkms.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh echo "Untarring file ... end" - command: shell.exec type: test params: shell: bash script: |- set -o errexit export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools GCPKMS_CMD="LD_LIBRARY_PATH=./testgcpkms MONGODB_URI='mongodb://localhost:27017' ./testgcpkms/test-gcpkms" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh - name: testgcpkms-fail-task commands: - command: shell.exec params: add_expansions_to_env: true shell: bash script: |- set -o errexit pushd mongoc .evergreen/scripts/compile-test-gcpkms.sh popd - command: shell.exec type: test params: shell: bash script: |- set -o errexit export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} LD_LIBRARY_PATH=$(pwd)/install MONGODB_URI='mongodb://localhost:27017' EXPECT_ERROR='Failed to connect to: metadata.google.internal' ./mongoc/src/libmongoc/test-gcpkms task_groups: - name: testazurekms_task_group setup_group: - func: fetch-det - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: shell.exec params: include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testazurekms_publickey}' > /tmp/testazurekms_publickey echo '${testazurekms_privatekey}' > /tmp/testazurekms_privatekey # Set 600 permissions on private key file. Otherwise ssh / scp may error with permissions "are too open". chmod 600 /tmp/testazurekms_privatekey export AZUREKMS_CLIENTID=${testazurekms_clientid} export AZUREKMS_TENANTID=${testazurekms_tenantid} export AZUREKMS_SECRET=${testazurekms_secret} export AZUREKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_PUBLICKEYPATH=/tmp/testazurekms_publickey export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey export AZUREKMS_SCOPE=${testazurekms_scope} export AZUREKMS_VMNAME_PREFIX=CDRIVER $DRIVERS_TOOLS/.evergreen/csfle/azurekms/create-and-setup-vm.sh - command: expansions.update params: file: testazurekms-expansions.yml teardown_group: - command: expansions.update params: file: testazurekms-expansions.yml - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} $DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete-vm.sh setup_group_can_fail_task: true setup_group_timeout_secs: 1800 tasks: - testazurekms-task - name: testgcpkms_task_group setup_group: - func: fetch-det - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testgcpkms_key_file}' > /tmp/testgcpkms_key_file.json export GCPKMS_KEYFILE=/tmp/testgcpkms_key_file.json export GCPKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export GCPKMS_SERVICEACCOUNT="${testgcpkms_service_account}" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/create-and-setup-instance.sh - command: expansions.update params: file: testgcpkms-expansions.yml teardown_group: - command: shell.exec params: shell: bash script: |- set -o errexit DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/delete-instance.sh setup_group_can_fail_task: true setup_group_timeout_secs: 1800 tasks: - testgcpkms-task buildvariants: - name: abi-compliance-check display_name: ABI Compliance Check run_on: - ubuntu2204-small - ubuntu2204-medium - ubuntu2204-large tasks: - abi-compliance-check - name: smoke display_name: Smoke Tests expansions: SKIP_LEGACY_SHELL: '1' run_on: ubuntu2204-small tasks: - make-docs - kms-divergence-check - release-compile - debug-compile-no-counters - compile-tracing - link-with-cmake - link-with-cmake-ssl - link-with-cmake-snappy - verify-headers - name: link-with-cmake-mac distros: - macos-14-arm64 - name: link-with-cmake-windows distros: - windows-vsCurrent-large - name: link-with-cmake-windows-ssl distros: - windows-vsCurrent-large - name: link-with-cmake-windows-snappy distros: - windows-vsCurrent-large - name: link-with-cmake-mingw distros: - windows-vsCurrent-large - name: link-with-pkg-config distros: - ubuntu2204-large - name: link-with-pkg-config-mac distros: - macos-14-arm64 - link-with-pkg-config-ssl - link-with-bson - name: link-with-bson-windows distros: - windows-vsCurrent-large - name: link-with-bson-mac distros: - macos-14-arm64 - name: link-with-bson-mingw distros: - windows-vsCurrent-large - check-headers - debug-compile-with-warnings - install-libmongoc-after-libbson tags: - pr-merge-gate - name: clang12-i686 display_name: Clang 12 (i686) (Ubuntu 22.04) expansions: CC: clang-12 MARCH: i686 run_on: ubuntu2204-large tasks: - release-compile - debug-compile-nosasl-nossl - .debug-compile !.sspi .nossl .nosasl - .latest .nossl .nosasl - name: gcc82rhel display_name: GCC 8.2 (RHEL 8.0) expansions: CC: gcc run_on: rhel80-test tasks: - .hardened - .compression !.snappy !.zstd - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl - name: gcc102 display_name: GCC 10.2 (Debian 11.0) expansions: CC: gcc run_on: debian11-latest-large tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl - name: gcc11-i686 display_name: GCC 11 (i686) (Ubuntu 22.04) expansions: CC: gcc MARCH: i686 run_on: ubuntu2204-large tasks: - release-compile - debug-compile-nosasl-nossl - .latest .nossl .nosasl - name: gcc13 display_name: GCC 13 (Ubuntu 24.04) expansions: CC: gcc run_on: ubuntu2404-large tasks: - .compression !.zstd - debug-compile-nosrv - release-compile - debug-compile-nosasl-nossl - debug-compile-sasl-openssl - debug-compile-nosasl-openssl - .authentication-tests .openssl - .authentication-tests .asan - .test-coverage - .latest .nossl - retry-true-latest-server - test-dns-openssl - test-dns-auth-openssl - test-dns-loadbalanced-openssl - name: darwin display_name: '*Darwin, macOS (Apple LLVM)' expansions: CC: clang run_on: macos-14-arm64 tasks: - .compression !.snappy - release-compile - debug-compile-nosasl-nossl - debug-compile-nosrv - debug-compile-sasl-darwinssl - debug-compile-nosasl-nossl - .authentication-tests .darwinssl - .latest .nossl - test-dns-darwinssl - test-dns-auth-darwinssl - debug-compile-lto - debug-compile-lto-thin - debug-compile-aws - test-aws-openssl-regular-latest - name: darwin-intel display_name: '*Darwin, Intel macOS (Apple LLVM)' expansions: CC: clang run_on: macos-14 tasks: - debug-compile-aws - debug-compile-rdtscp - test-aws-openssl-regular-4.4 - name: windows-2017-32 display_name: Windows (i686) (VS 2017) expansions: CC: Visual Studio 15 2017 run_on: windows-vsCurrent-large tasks: - debug-compile-nosasl-nossl - .latest .nossl .nosasl - name: windows-2017 display_name: Windows (VS 2017) expansions: CC: Visual Studio 15 2017 Win64 run_on: windows-vsCurrent-large tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sspi-winssl - debug-compile-nosrv - .latest .nossl - .nosasl .latest .nossl - .compression !.snappy !.zstd !.latest - test-dns-winssl - test-dns-auth-winssl - debug-compile-aws - test-aws-openssl-regular-4.4 - test-aws-openssl-regular-latest - .authentication-tests .openssl !.sasl - .authentication-tests .winssl - name: windows-2022 display_name: Windows (VS 2022) expansions: CC: Visual Studio 17 2022 Win64 run_on: windows-vsCurrent-large tasks: - debug-compile-sspi-winssl - .authentication-tests .winssl - name: mingw-windows2016 display_name: MinGW-W64 (Windows Server 2016) expansions: CC: gcc run_on: windows-vsCurrent-large tasks: - debug-compile-nosasl-nossl - .latest .nossl .nosasl .server - name: rhel8-power display_name: Power (ppc64le) (RHEL 8) expansions: CC: gcc run_on: rhel8-power-large tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-sasl-openssl - .latest .nossl - test-dns-openssl patchable: false batchtime: 1440 - name: arm-ubuntu2204 display_name: '*ARM (aarch64) (Ubuntu 22.04)' expansions: CC: gcc run_on: ubuntu2204-arm64-large tasks: - .compression !.snappy !.zstd - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl - test-dns-openssl batchtime: 1440 - name: zseries-rhel8 display_name: '*zSeries' expansions: CC: gcc run_on: rhel8-zseries-large tasks: - release-compile - debug-compile-nosasl-nossl - debug-compile-nosasl-openssl - debug-compile-sasl-openssl - .authentication-tests .openssl - .latest .nossl patchable: false batchtime: 1440 - name: aws-ubuntu2004 display_name: AWS Tests (Ubuntu 20.04) expansions: CC: clang run_on: ubuntu2004-small tasks: - debug-compile-aws - .test-aws .4.4 - .test-aws .5.0 - name: aws-ubuntu2204 display_name: AWS Tests (Ubuntu 22.04) expansions: CC: clang run_on: ubuntu2004-small tasks: - debug-compile-aws - .test-aws .6.0 - .test-aws .7.0 - .test-aws .8.0 - .test-aws .latest - name: ocsp display_name: OCSP tests run_on: ubuntu2204-small tasks: - name: debug-compile-nosasl-openssl - name: debug-compile-nosasl-darwinssl distros: - macos-14-arm64 - name: debug-compile-nosasl-winssl distros: - windows-vsCurrent-large - name: .ocsp-openssl - name: .ocsp-darwinssl distros: - macos-14-arm64 - name: .ocsp-winssl distros: - windows-vsCurrent-large batchtime: 10080 display_tasks: - execution_tasks: - .ocsp-openssl name: ocsp-openssl - execution_tasks: - .ocsp-darwinssl name: ocsp-darwinssl - execution_tasks: - .ocsp-winssl name: ocsp-winssl - name: packaging display_name: Linux Distro Packaging run_on: debian12-latest-small tasks: - debian-package-build - name: rpm-package-build distros: - rhel90-arm64-small tags: - pr-merge-gate - name: versioned-api display_name: Versioned API Tests run_on: rhel8-latest-large tasks: - debug-compile-nosasl-openssl - debug-compile-nosasl-nossl - .versioned-api .5.0 - .versioned-api .6.0 - .versioned-api .7.0 - .versioned-api .8.0 - name: testazurekms-variant display_name: Azure KMS run_on: debian11-small tasks: - testazurekms_task_group - testazurekms-fail-task batchtime: 20160 - name: testgcpkms-variant display_name: GCP KMS run_on: debian11-latest-small tasks: - testgcpkms_task_group - testgcpkms-fail-task batchtime: 20160 mongo-c-driver-2.2.1/.evergreen/generated_configs/task_groups.yml000066400000000000000000000051561511661753600251600ustar00rootroot00000000000000task_groups: - name: test-oidc-azure-task-group setup_group: - func: fetch-det - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: subprocess.exec type: setup params: binary: bash env: AZUREOIDC_VMNAME_PREFIX: CDRIVER include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/azure/create-and-setup-vm.sh setup_group_can_fail_task: true tasks: - oidc-azure-auth-test-task teardown_group: - command: subprocess.exec type: setup params: binary: bash args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/azure/delete-vm.sh teardown_group_timeout_secs: 180 - name: test-oidc-gcp-task-group setup_group: - func: fetch-det - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: subprocess.exec type: setup params: binary: bash env: GCPOIDC_VMNAME_PREFIX: CDRIVER include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/setup.sh setup_group_can_fail_task: true tasks: - oidc-gcp-auth-test-task teardown_group: - command: subprocess.exec type: setup params: binary: bash args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/teardown.sh teardown_group_timeout_secs: 180 - name: test-oidc-task-group setup_group: - func: fetch-det - command: ec2.assume_role params: role_arn: ${aws_test_secrets_role} - command: subprocess.exec type: setup params: binary: bash include_expansions_in_env: - AWS_ACCESS_KEY_ID - AWS_SECRET_ACCESS_KEY - AWS_SESSION_TOKEN args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/setup.sh setup_group_can_fail_task: true tasks: - oidc-auth-test-task teardown_group: - command: subprocess.exec type: setup params: binary: bash args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/teardown.sh teardown_group_timeout_secs: 180 mongo-c-driver-2.2.1/.evergreen/generated_configs/tasks.yml000066400000000000000000011324301511661753600237410ustar00rootroot00000000000000tasks: - name: abi-compliance-check commands: - func: abi-compliance-check - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, compile, rhel8-latest, clang, cse, asan, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "4.2", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "4.2", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "4.2", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "4.2", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "4.4", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "4.4", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "4.4", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "4.4", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "5.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "5.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "5.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "5.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "6.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "6.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "6.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "6.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "7.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "7.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "7.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "7.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "8.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, "8.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "8.0", openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, "8.0", with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, latest, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-replica-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, replica, latest, with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, latest, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-server-auth-with-mongocrypt run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, cse, asan, auth, server, latest, with-mongocrypt, openssl] depends_on: [{ name: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-cse-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - { key: CLIENT_SIDE_ENCRYPTION, value: "on" } - { key: SKIP_CRYPT_SHARED_LIB, value: "on" } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-mock-kms-servers - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, compile, rhel8-latest, clang, asan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "4.2", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "4.4", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "5.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "6.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "7.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, "8.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, "8.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, "8.0", openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, replica, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, server, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: asan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-asan, test, rhel8-latest, clang, sasl-cyrus, asan, auth, sharded, latest, openssl] depends_on: [{ name: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: asan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: check-headers commands: - func: check-headers - name: "check:sasl=Cyrus\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=master" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=Cyrus\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=none" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=Cyrus\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=r4.1.0" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=Cyrus - --tls=OpenSSL - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=Cyrus\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=master" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=Cyrus\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=none" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=Cyrus\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=r4.1.0" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=Cyrus - --tls=off - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=master" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=none" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=OpenSSL\_\u2022\_test_mongocxx_ref=r4.1.0" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=off - --tls=OpenSSL - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=master" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=off - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=off - --tls=off - --test_mongocxx_ref=master - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=none" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=off - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example - --sasl=off - --tls=off - --test_mongocxx_ref=none - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: "check:sasl=off\_\u2022\_tls=off\_\u2022\_test_mongocxx_ref=r4.1.0" run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [earthly, pr-merge-gate, almalinux10-clang, almalinux10-gcc, almalinux8-clang, almalinux8-gcc, almalinux9-clang, almalinux9-gcc, alpine3.19-clang, alpine3.19-gcc, alpine3.20-clang, alpine3.20-gcc, alpine3.21-clang, alpine3.21-gcc, alpine3.22-clang, alpine3.22-gcc, archlinux-clang, archlinux-gcc, centos10-clang, centos10-gcc, centos9-clang, centos9-gcc, u20-clang, u20-gcc, u22-clang, u22-gcc] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: setup params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +env-warmup - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --sasl=off - --tls=off - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +run - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub - --targets=test-example test-cxx-driver - --sasl=off - --tls=off - --test_mongocxx_ref=r4.1.0 - --env=${MONGOC_EARTHLY_ENV} - --c_compiler=${MONGOC_EARTHLY_C_COMPILER} - name: clang-format tags: [clang-format] commands: - func: clang-format - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, compile, macos-14-arm64, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-darwinssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-6.0-replica-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, replica, "6.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-6.0-server-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, server, "6.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-6.0-sharded-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, sharded, "6.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-7.0-replica-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, replica, "7.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-7.0-server-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, server, "7.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-7.0-sharded-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, sharded, "7.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-8.0-replica-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, replica, "8.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-8.0-server-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, server, "8.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-8.0-sharded-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, sharded, "8.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-latest-replica-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, replica, latest, darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-latest-server-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, server, latest, darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-test-latest-sharded-auth run_on: macos-14-arm64 tags: [cse-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, cse, auth, sharded, latest, darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-clang-compile run_on: macos-14 tags: [cse-matrix-darwinssl, compile, macos-14, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-darwinssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: cse-sasl-cyrus-darwinssl-macos-14-clang-test-4.2-sharded-auth run_on: macos-14 tags: [cse-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, cse, auth, sharded, "4.2", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-clang-test-4.4-sharded-auth run_on: macos-14 tags: [cse-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, cse, auth, sharded, "4.4", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-darwinssl-macos-14-clang-test-5.0-sharded-auth run_on: macos-14 tags: [cse-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, cse, auth, sharded, "5.0", darwinssl] depends_on: [{ name: cse-sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-debian11-latest-clang-compile run_on: debian11-latest-large tags: [cse-matrix-openssl, compile, debian11-latest, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: cse-sasl-cyrus-openssl-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [cse-matrix-openssl, compile, debian11-latest, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-debian12-latest-clang-compile run_on: debian12-latest-large tags: [cse-matrix-openssl, compile, debian12-latest, clang, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: cse-sasl-cyrus-openssl-debian12-latest-gcc-compile run_on: debian12-latest-large tags: [cse-matrix-openssl, compile, debian12-latest, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile run_on: rhel8-arm64-latest-large tags: [cse-matrix-openssl, compile, rhel8-arm64-latest, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-replica-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-server-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-sharded-auth run_on: rhel8-arm64-latest-small tags: [cse-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, cse, auth, sharded, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile run_on: rhel8-latest-large tags: [cse-matrix-openssl, compile, rhel8-latest, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-replica-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-server-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-sharded-auth run_on: rhel8-latest-large tags: [cse-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, cse, auth, sharded, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile run_on: rhel8-zseries-large tags: [cse-matrix-openssl, compile, rhel8-zseries, gcc, cse, sasl-cyrus] patchable: false commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-test-5.0-sharded-auth run_on: rhel8-zseries-small tags: [cse-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, cse, auth, sharded, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-test-latest-sharded-auth run_on: rhel8-zseries-small tags: [cse-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, cse, auth, sharded, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-rhel80-gcc-compile run_on: rhel80-large tags: [cse-matrix-openssl, compile, rhel80, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2204-clang-12-compile run_on: ubuntu2204-large tags: [cse-matrix-openssl, compile, ubuntu2204, clang-12, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang-12 CXX: clang++-12 - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2204-gcc-compile run_on: ubuntu2204-large tags: [cse-matrix-openssl, compile, ubuntu2204, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2404-clang-14-compile run_on: ubuntu2404-large tags: [cse-matrix-openssl, compile, ubuntu2404, clang-14, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: clang-14 CXX: clang++-14 - func: upload-build - name: cse-sasl-cyrus-openssl-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [cse-matrix-openssl, compile, ubuntu2404, gcc, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [cse-matrix-openssl, compile, windows-vsCurrent, vs2022x64, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-openssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "4.2", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "4.4", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "5.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "6.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "7.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "8.0", openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-openssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, latest, openssl] depends_on: [{ name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [cse-matrix-winssl, compile, windows-vsCurrent, vs2022x64, cse, sasl-cyrus] commands: - func: cse-sasl-cyrus-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.2-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "4.2", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "4.2", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.2-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "4.2", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.4-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "4.4", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "4.4", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-4.4-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "4.4", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-5.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "5.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "5.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-5.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "5.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-6.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "6.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "6.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-6.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "6.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-7.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "7.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "7.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-7.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "7.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-8.0-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, "8.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-8.0-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, "8.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-8.0-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, "8.0", winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-latest-replica-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, replica, latest, winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, server, latest, winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-test-latest-sharded-auth run_on: windows-vsCurrent-small tags: [cse-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-cyrus, cse, auth, sharded, latest, winssl] depends_on: [{ name: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: cse-sasl-cyrus-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-mock-kms-servers - func: run-tests - name: kms-divergence-check commands: - func: kms-divergence-check - name: loadbalanced-rhel8-latest-gcc-compile run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc] commands: - command: subprocess.exec type: test params: binary: bash working_dir: mongoc env: CC: gcc CFLAGS: -fno-omit-frame-pointer SSL: OPENSSL include_expansions_in_env: - distro_id args: - -c - .evergreen/scripts/compile.sh - func: upload-build - name: loadbalanced-rhel8-latest-gcc-test-5.0-auth-openssl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "5.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel8-latest-gcc-test-5.0-noauth-nossl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "5.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel8-latest-gcc-test-6.0-auth-openssl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "6.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel8-latest-gcc-test-6.0-noauth-nossl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "6.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel8-latest-gcc-test-7.0-auth-openssl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "7.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel8-latest-gcc-test-7.0-noauth-nossl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "7.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel8-latest-gcc-test-8.0-auth-openssl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: "8.0" SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel8-latest-gcc-test-8.0-noauth-nossl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: "8.0" SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: loadbalanced-rhel8-latest-gcc-test-latest-auth-openssl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, auth, openssl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: auth LOAD_BALANCER: "on" MONGODB_VERSION: latest SSL: openssl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: auth CC: gcc LOADBALANCED: loadbalanced SSL: openssl - name: loadbalanced-rhel8-latest-gcc-test-latest-noauth-nossl run_on: rhel8-latest-large tags: [loadbalanced, rhel8-latest, gcc, noauth, nossl] depends_on: [{ name: loadbalanced-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: loadbalanced-rhel8-latest-gcc-compile - func: fetch-det - func: bootstrap-mongo-orchestration vars: AUTH: noauth LOAD_BALANCER: "on" MONGODB_VERSION: latest SSL: nossl TOPOLOGY: sharded_cluster - func: run-simple-http-server - func: start-load-balancer vars: MONGODB_URI: mongodb://localhost:27017,localhost:27018 - func: run-tests vars: AUTH: noauth CC: gcc LOADBALANCED: loadbalanced SSL: nossl - name: make-docs commands: - func: make-docs - func: upload-docs - func: upload-man-pages - name: mock-server-test run_on: ubuntu2204-small commands: - func: run-simple-http-server - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/compile.sh - command: subprocess.exec type: test params: binary: bash working_dir: mongoc args: - -c - .evergreen/scripts/run-mock-server-tests.sh - name: oidc-auth-test-task run_on: - ubuntu2404-small commands: - func: fetch-source - func: sasl-cyrus-openssl-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: AUTH, value: auth } - { key: OIDC, value: oidc } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - func: run-tests - name: oidc-azure-auth-test-task run_on: - debian11-small commands: - func: fetch-source - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/oidc-azure-compile.sh - command: expansions.update params: file: mongoc/oidc-remote-test-expansion.yml - command: subprocess.exec type: test params: binary: bash add_expansions_to_env: true env: AZUREOIDC_DRIVERS_TAR_FILE: ${OIDC_TEST_TARBALL} AZUREOIDC_TEST_CMD: source ./env.sh && ./.evergreen/scripts/oidc-azure-test.sh args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/azure/run-driver-test.sh - name: oidc-gcp-auth-test-task run_on: - debian11-small commands: - func: fetch-source - command: subprocess.exec type: test params: binary: bash working_dir: mongoc add_expansions_to_env: true args: - -c - .evergreen/scripts/oidc-gcp-compile.sh - command: expansions.update params: file: mongoc/oidc-remote-test-expansion.yml - command: subprocess.exec type: test params: binary: bash add_expansions_to_env: true env: GCPOIDC_DRIVERS_TAR_FILE: ${OIDC_TEST_TARBALL} GCPOIDC_TEST_CMD: source ./secrets-export.sh && ./.evergreen/scripts/oidc-gcp-test.sh args: - -c - ./drivers-evergreen-tools/.evergreen/auth_oidc/gcp/run-driver-test.sh - name: openssl-compat-1.0.2-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-1.0.2, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 1.0.2 - func: run auth tests - name: openssl-compat-1.0.2-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-1.0.2, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 1.0.2 - func: run auth tests - name: openssl-compat-1.1.1-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-1.1.1, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 1.1.1 - func: run auth tests - name: openssl-compat-1.1.1-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-1.1.1, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 1.1.1 - func: run auth tests - name: openssl-compat-3.0.9-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.0.9, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.0.9 - func: run auth tests - name: openssl-compat-3.0.9-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.0.9, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.0.9 - func: run auth tests - name: openssl-compat-3.1.2-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.1.2, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.1.2 - func: run auth tests - name: openssl-compat-3.1.2-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.1.2, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.1.2 - func: run auth tests - name: openssl-compat-3.2.5-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.2.5, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.2.5 - func: run auth tests - name: openssl-compat-3.2.5-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.2.5, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.2.5 - func: run auth tests - name: openssl-compat-3.3.4-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.3.4, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.3.4 - func: run auth tests - name: openssl-compat-3.3.4-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.3.4, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.3.4 - func: run auth tests - name: openssl-compat-3.4.2-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.4.2, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.4.2 - func: run auth tests - name: openssl-compat-3.4.2-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.4.2, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.4.2 - func: run auth tests - name: openssl-compat-3.5.1-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.5.1, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_VERSION: 3.5.1 - func: run auth tests - name: openssl-compat-3.5.1-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-3.5.1, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.5.1 - func: run auth tests - name: openssl-compat-fips-3.0.9-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-fips-3.0.9, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_ENABLE_FIPS: "ON" OPENSSL_VERSION: 3.0.9 - func: run auth tests - name: openssl-compat-fips-3.0.9-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-fips-3.0.9, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_ENABLE_FIPS: "ON" OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.0.9 - func: run auth tests - name: openssl-compat-fips-3.1.2-shared-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-fips-3.1.2, openssl-shared, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_ENABLE_FIPS: "ON" OPENSSL_VERSION: 3.1.2 - func: run auth tests - name: openssl-compat-fips-3.1.2-static-ubuntu2404-gcc run_on: ubuntu2404-large tags: [openssl-compat, openssl-fips-3.1.2, openssl-static, ubuntu2404, gcc] commands: - func: fetch-source - func: openssl-compat vars: OPENSSL_ENABLE_FIPS: "ON" OPENSSL_USE_STATIC_LIBS: "ON" OPENSSL_VERSION: 3.1.2 - func: run auth tests - name: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [sasl-matrix-darwinssl, compile, macos-14-arm64, clang, sasl-cyrus] commands: - func: sasl-cyrus-darwinssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: sasl-cyrus-darwinssl-macos-14-arm64-clang-test-6.0-replica-auth run_on: macos-14-arm64 tags: [sasl-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, auth, replica, "6.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-arm64-clang-test-7.0-replica-auth run_on: macos-14-arm64 tags: [sasl-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, auth, replica, "7.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-arm64-clang-test-8.0-replica-auth run_on: macos-14-arm64 tags: [sasl-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, auth, replica, "8.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-arm64-clang-test-latest-replica-auth run_on: macos-14-arm64 tags: [sasl-matrix-darwinssl, test, macos-14-arm64, clang, sasl-cyrus, auth, replica, latest, darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-arm64-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-clang-compile run_on: macos-14 tags: [sasl-matrix-darwinssl, compile, macos-14, clang, sasl-cyrus] commands: - func: sasl-cyrus-darwinssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: sasl-cyrus-darwinssl-macos-14-clang-test-4.2-replica-auth run_on: macos-14 tags: [sasl-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, auth, replica, "4.2", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-clang-test-4.4-replica-auth run_on: macos-14 tags: [sasl-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, auth, replica, "4.4", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-darwinssl-macos-14-clang-test-5.0-replica-auth run_on: macos-14 tags: [sasl-matrix-darwinssl, test, macos-14, clang, sasl-cyrus, auth, replica, "5.0", darwinssl] depends_on: [{ name: sasl-cyrus-darwinssl-macos-14-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-darwinssl-macos-14-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: darwinssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile run_on: amazon2023-arm64-latest-large-m8g tags: [sasl-matrix-openssl, compile, amazon2023-arm64-latest-large-m8g, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-replica-auth run_on: amazon2023-arm64-latest-large-m8g tags: [sasl-matrix-openssl, test, amazon2023-arm64-latest-large-m8g, gcc, sasl-cyrus, auth, replica, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-server-auth run_on: amazon2023-arm64-latest-large-m8g tags: [sasl-matrix-openssl, test, amazon2023-arm64-latest-large-m8g, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-sharded-auth run_on: amazon2023-arm64-latest-large-m8g tags: [sasl-matrix-openssl, test, amazon2023-arm64-latest-large-m8g, gcc, sasl-cyrus, auth, sharded, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [sasl-matrix-openssl, compile, debian11-latest, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-debian12-latest-gcc-compile run_on: debian12-latest-large tags: [sasl-matrix-openssl, compile, debian12-latest, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile run_on: rhel8-arm64-latest-large tags: [sasl-matrix-openssl, compile, rhel8-arm64-latest, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, "8.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-server-auth run_on: rhel8-arm64-latest-small tags: [sasl-matrix-openssl, test, rhel8-arm64-latest, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-compile run_on: rhel8-latest-large tags: [sasl-matrix-openssl, compile, rhel8-latest, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, "8.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-server-auth run_on: rhel8-latest-large tags: [sasl-matrix-openssl, test, rhel8-latest, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-compile run_on: rhel8-power-large tags: [sasl-matrix-openssl, compile, rhel8-power, gcc, sasl-cyrus] patchable: false commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-rhel8-power-gcc-test-4.2-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "4.2", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-4.4-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "4.4", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-5.0-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-6.0-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-7.0-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-8.0-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, "8.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-power-gcc-test-latest-server-auth run_on: rhel8-power-small tags: [sasl-matrix-openssl, test, rhel8-power, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-power-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-power-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile run_on: rhel8-zseries-large tags: [sasl-matrix-openssl, compile, rhel8-zseries, gcc, sasl-cyrus] patchable: false commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-5.0-server-auth run_on: rhel8-zseries-small tags: [sasl-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, auth, server, "5.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-6.0-server-auth run_on: rhel8-zseries-small tags: [sasl-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, auth, server, "6.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-7.0-server-auth run_on: rhel8-zseries-small tags: [sasl-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, auth, server, "7.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-8.0-server-auth run_on: rhel8-zseries-small tags: [sasl-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, auth, server, "8.0", openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-latest-server-auth run_on: rhel8-zseries-small tags: [sasl-matrix-openssl, test, rhel8-zseries, gcc, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile }] patchable: false commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-rhel8-zseries-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-cyrus-openssl-rhel80-gcc-compile run_on: rhel80-large tags: [sasl-matrix-openssl, compile, rhel80, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-ubuntu2204-clang-12-compile run_on: ubuntu2204-large tags: [sasl-matrix-openssl, compile, ubuntu2204, clang-12, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang-12 CXX: clang++-12 - func: upload-build - name: sasl-cyrus-openssl-ubuntu2204-gcc-compile run_on: ubuntu2204-large tags: [sasl-matrix-openssl, compile, ubuntu2204, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-ubuntu2404-clang-14-compile run_on: ubuntu2404-large tags: [sasl-matrix-openssl, compile, ubuntu2404, clang-14, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang-14 CXX: clang++-14 - func: upload-build - name: sasl-cyrus-openssl-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [sasl-matrix-openssl, compile, ubuntu2404, gcc, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-openssl, compile, windows-vsCurrent, vs2017x64, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-openssl, test, windows-vsCurrent, vs2017x64, sasl-cyrus, auth, server, latest, openssl] depends_on: [{ name: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 15 2017 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-compile run_on: rhel8-latest-large tags: [sasl-matrix-nossl, compile, rhel8-latest, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-off-nossl-rhel8-latest-gcc-test-4.2-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "4.2"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-4.2-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "4.2"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-4.2-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "4.2"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-4.4-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "4.4"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-4.4-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "4.4"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-4.4-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "4.4"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-5.0-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "5.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-5.0-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "5.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-5.0-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "5.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-6.0-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "6.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-6.0-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "6.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-6.0-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "6.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-7.0-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "7.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-7.0-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "7.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-7.0-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "7.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-8.0-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, "8.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-8.0-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, "8.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-8.0-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, "8.0"] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-latest-replica-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, replica, latest] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-latest-server-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, server, latest] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-rhel8-latest-gcc-test-latest-sharded-noauth run_on: rhel8-latest-large tags: [sasl-matrix-nossl, test, rhel8-latest, gcc, sasl-off, noauth, sharded, latest] depends_on: [{ name: sasl-off-nossl-rhel8-latest-gcc-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-off-nossl-rhel8-latest-gcc-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: noauth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: nossl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-off-nossl-ubuntu2204-gcc-compile run_on: ubuntu2204-large tags: [sasl-matrix-nossl, compile, ubuntu2204, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-off-nossl-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [sasl-matrix-nossl, compile, ubuntu2404, gcc, sasl-off] commands: - func: sasl-off-nossl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-off-nossl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-nossl, compile, windows-vsCurrent, vs2017x64, sasl-off] commands: - func: sasl-off-nossl-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x64, sasl-off] commands: - func: sasl-off-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2019-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2019x64, sasl-off] commands: - func: sasl-off-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 16 2019 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2022x64, sasl-off] commands: - func: sasl-off-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-off-winssl-windows-2019-vs2022-x86-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2022x86, sasl-off] commands: - func: sasl-off-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: Win32 - func: upload-build - name: sasl-sspi-winssl-windows-2019-mingw-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, mingw, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CC: gcc CXX: g++ - func: upload-build - name: sasl-sspi-winssl-windows-2019-mingw-test-4.2-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, mingw, sasl-sspi, auth, sharded, "4.2", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-mingw-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-mingw-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-mingw-test-latest-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, mingw, sasl-sspi, auth, sharded, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-mingw-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-mingw-compile - command: expansions.update params: updates: - { key: CC, value: gcc } - { key: CXX, value: g++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2017x64, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2019-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2019x64, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 16 2019 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2022x64, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.2-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "4.2", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.2-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "4.2", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.2-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "4.2", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.4-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "4.4", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.4-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "4.4", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-4.4-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "4.4", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-5.0-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "5.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-5.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "5.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-5.0-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "5.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-6.0-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "6.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-6.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "6.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-6.0-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "6.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-7.0-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "7.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-7.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "7.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-7.0-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "7.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-8.0-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, "8.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-8.0-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, "8.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-8.0-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, "8.0", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-latest-replica-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, replica, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-latest-server-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, server, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x64-test-latest-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x64, sasl-sspi, auth, sharded, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x64-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x64-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: x64 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x86-compile run_on: windows-vsCurrent-large tags: [sasl-matrix-winssl, compile, windows-vsCurrent, vs2022x86, sasl-sspi] commands: - func: sasl-sspi-winssl-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: Win32 - func: upload-build - name: sasl-sspi-winssl-windows-2019-vs2022-x86-test-4.2-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x86, sasl-sspi, auth, sharded, "4.2", winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x86-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x86-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: Win32 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sasl-sspi-winssl-windows-2019-vs2022-x86-test-latest-sharded-auth run_on: windows-vsCurrent-small tags: [sasl-matrix-winssl, test, windows-vsCurrent, vs2022x86, sasl-sspi, auth, sharded, latest, winssl] depends_on: [{ name: sasl-sspi-winssl-windows-2019-vs2022-x86-compile }] commands: - func: fetch-build vars: BUILD_NAME: sasl-sspi-winssl-windows-2019-vs2022-x86-compile - command: expansions.update params: updates: - { key: CMAKE_GENERATOR, value: Visual Studio 17 2022 } - { key: CMAKE_GENERATOR_PLATFORM, value: Win32 } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: winssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: sbom run_on: rhel80-small tags: [sbom, rhel80] commands: - func: sbom - name: scan-build-macos-14-arm64-clang run_on: macos-14-arm64 tags: [scan-build-matrix, macos-14-arm64, clang] commands: - func: scan-build vars: CC: clang CXX: clang++ - func: upload scan artifacts - name: scan-build-ubuntu2204-arm64-clang run_on: ubuntu2204-arm64-large tags: [scan-build-matrix, ubuntu2204-arm64, clang] commands: - func: scan-build vars: CC: clang CXX: clang++ - func: upload scan artifacts - name: scan-build-ubuntu2204-clang-12-i686 run_on: ubuntu2204-large tags: [scan-build-matrix, ubuntu2204, clang-12, i686] commands: - func: scan-build vars: CC: clang-12 CXX: clang++-12 MARCH: i686 - func: upload scan artifacts - name: std-c11-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [std-matrix, debian11-latest, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc-10 CXX: g++-10 C_STD_VERSION: 11 - name: std-c11-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [std-matrix, macos-14-arm64, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel7-latest-gcc-compile run_on: rhel7-latest-large tags: [std-matrix, rhel7-latest, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel80-clang-compile run_on: rhel80-large tags: [std-matrix, rhel80, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel80-gcc-compile run_on: rhel80-large tags: [std-matrix, rhel80, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel84-clang-compile run_on: rhel84-large tags: [std-matrix, rhel84, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel84-gcc-compile run_on: rhel84-large tags: [std-matrix, rhel84, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel90-clang-compile run_on: rhel90-large tags: [std-matrix, rhel90, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel90-gcc-compile run_on: rhel90-large tags: [std-matrix, rhel90, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel91-clang-compile run_on: rhel91-large tags: [std-matrix, rhel91, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel92-clang-compile run_on: rhel92-large tags: [std-matrix, rhel92, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel92-gcc-compile run_on: rhel92-large tags: [std-matrix, rhel92, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel93-clang-compile run_on: rhel93-large tags: [std-matrix, rhel93, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel94-clang-compile run_on: rhel94-large tags: [std-matrix, rhel94, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel94-gcc-compile run_on: rhel94-large tags: [std-matrix, rhel94, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-rhel95-clang-compile run_on: rhel95-large tags: [std-matrix, rhel95, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 11 - name: std-c11-rhel95-gcc-compile run_on: rhel95-large tags: [std-matrix, rhel95, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 11 - name: std-c11-ubuntu2204-clang-compile run_on: ubuntu2204-large tags: [std-matrix, ubuntu2204, clang, compile, std-c11] commands: - func: std-compile vars: CC: clang-12 CXX: clang++-12 C_STD_VERSION: 11 - name: std-c11-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [std-matrix, ubuntu2404, gcc, compile, std-c11] commands: - func: std-compile vars: CC: gcc-13 CXX: g++-13 C_STD_VERSION: 11 - name: std-c11-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2017x64, compile, std-c11] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 11 - name: std-c11-windows-2019-vs2019-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2019x64, compile, std-c11] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 16 2019 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 11 - name: std-c11-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2022x64, compile, std-c11] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 11 - name: std-c17-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [std-matrix, debian11-latest, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc-10 CXX: g++-10 C_STD_VERSION: 17 - name: std-c17-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [std-matrix, macos-14-arm64, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel80-clang-compile run_on: rhel80-large tags: [std-matrix, rhel80, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel80-gcc-compile run_on: rhel80-large tags: [std-matrix, rhel80, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-rhel84-clang-compile run_on: rhel84-large tags: [std-matrix, rhel84, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel84-gcc-compile run_on: rhel84-large tags: [std-matrix, rhel84, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-rhel90-clang-compile run_on: rhel90-large tags: [std-matrix, rhel90, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel90-gcc-compile run_on: rhel90-large tags: [std-matrix, rhel90, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-rhel91-clang-compile run_on: rhel91-large tags: [std-matrix, rhel91, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel92-clang-compile run_on: rhel92-large tags: [std-matrix, rhel92, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel92-gcc-compile run_on: rhel92-large tags: [std-matrix, rhel92, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-rhel93-clang-compile run_on: rhel93-large tags: [std-matrix, rhel93, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel94-clang-compile run_on: rhel94-large tags: [std-matrix, rhel94, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel94-gcc-compile run_on: rhel94-large tags: [std-matrix, rhel94, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-rhel95-clang-compile run_on: rhel95-large tags: [std-matrix, rhel95, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 17 - name: std-c17-rhel95-gcc-compile run_on: rhel95-large tags: [std-matrix, rhel95, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 17 - name: std-c17-ubuntu2204-clang-compile run_on: ubuntu2204-large tags: [std-matrix, ubuntu2204, clang, compile, std-c17] commands: - func: std-compile vars: CC: clang-12 CXX: clang++-12 C_STD_VERSION: 17 - name: std-c17-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [std-matrix, ubuntu2404, gcc, compile, std-c17] commands: - func: std-compile vars: CC: gcc-13 CXX: g++-13 C_STD_VERSION: 17 - name: std-c17-windows-2019-vs2019-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2019x64, compile, std-c17] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 16 2019 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 17 - name: std-c17-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2022x64, compile, std-c17] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 17 - name: std-c23-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [std-matrix, debian11-latest, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc-10 CXX: g++-10 C_STD_VERSION: 23 - name: std-c23-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [std-matrix, macos-14-arm64, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel84-clang-compile run_on: rhel84-large tags: [std-matrix, rhel84, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel90-clang-compile run_on: rhel90-large tags: [std-matrix, rhel90, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel90-gcc-compile run_on: rhel90-large tags: [std-matrix, rhel90, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 23 - name: std-c23-rhel91-clang-compile run_on: rhel91-large tags: [std-matrix, rhel91, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel92-clang-compile run_on: rhel92-large tags: [std-matrix, rhel92, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel92-gcc-compile run_on: rhel92-large tags: [std-matrix, rhel92, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 23 - name: std-c23-rhel93-clang-compile run_on: rhel93-large tags: [std-matrix, rhel93, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel94-clang-compile run_on: rhel94-large tags: [std-matrix, rhel94, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel94-gcc-compile run_on: rhel94-large tags: [std-matrix, rhel94, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 23 - name: std-c23-rhel95-clang-compile run_on: rhel95-large tags: [std-matrix, rhel95, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 23 - name: std-c23-rhel95-gcc-compile run_on: rhel95-large tags: [std-matrix, rhel95, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 23 - name: std-c23-ubuntu2204-clang-compile run_on: ubuntu2204-large tags: [std-matrix, ubuntu2204, clang, compile, std-c23] commands: - func: std-compile vars: CC: clang-12 CXX: clang++-12 C_STD_VERSION: 23 - name: std-c23-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [std-matrix, ubuntu2404, gcc, compile, std-c23] commands: - func: std-compile vars: CC: gcc-13 CXX: g++-13 C_STD_VERSION: 23 - name: std-c99-debian11-latest-gcc-compile run_on: debian11-latest-large tags: [std-matrix, debian11-latest, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc-10 CXX: g++-10 C_STD_VERSION: 99 - name: std-c99-macos-14-arm64-clang-compile run_on: macos-14-arm64 tags: [std-matrix, macos-14-arm64, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel7-latest-gcc-compile run_on: rhel7-latest-large tags: [std-matrix, rhel7-latest, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel80-clang-compile run_on: rhel80-large tags: [std-matrix, rhel80, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel80-gcc-compile run_on: rhel80-large tags: [std-matrix, rhel80, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel84-clang-compile run_on: rhel84-large tags: [std-matrix, rhel84, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel84-gcc-compile run_on: rhel84-large tags: [std-matrix, rhel84, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel90-clang-compile run_on: rhel90-large tags: [std-matrix, rhel90, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel90-gcc-compile run_on: rhel90-large tags: [std-matrix, rhel90, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel91-clang-compile run_on: rhel91-large tags: [std-matrix, rhel91, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel92-clang-compile run_on: rhel92-large tags: [std-matrix, rhel92, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel92-gcc-compile run_on: rhel92-large tags: [std-matrix, rhel92, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel93-clang-compile run_on: rhel93-large tags: [std-matrix, rhel93, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel94-clang-compile run_on: rhel94-large tags: [std-matrix, rhel94, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel94-gcc-compile run_on: rhel94-large tags: [std-matrix, rhel94, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-rhel95-clang-compile run_on: rhel95-large tags: [std-matrix, rhel95, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang CXX: clang++ C_STD_VERSION: 99 - name: std-c99-rhel95-gcc-compile run_on: rhel95-large tags: [std-matrix, rhel95, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc CXX: g++ C_STD_VERSION: 99 - name: std-c99-ubuntu2204-clang-compile run_on: ubuntu2204-large tags: [std-matrix, ubuntu2204, clang, compile, std-c99] commands: - func: std-compile vars: CC: clang-12 CXX: clang++-12 C_STD_VERSION: 99 - name: std-c99-ubuntu2404-gcc-compile run_on: ubuntu2404-large tags: [std-matrix, ubuntu2404, gcc, compile, std-c99] commands: - func: std-compile vars: CC: gcc-13 CXX: g++-13 C_STD_VERSION: 99 - name: std-c99-windows-2019-vs2017-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2017x64, compile, std-c99] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 15 2017 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 99 - name: std-c99-windows-2019-vs2019-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2019x64, compile, std-c99] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 16 2019 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 99 - name: std-c99-windows-2019-vs2022-x64-compile run_on: windows-vsCurrent-large tags: [std-matrix, windows-vsCurrent, vs2022x64, compile, std-c99] commands: - func: std-compile vars: CMAKE_GENERATOR: Visual Studio 17 2022 CMAKE_GENERATOR_PLATFORM: x64 C_STD_VERSION: 99 - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, compile, rhel8-latest, clang, tsan, sasl-cyrus] commands: - func: sasl-cyrus-openssl-compile vars: CC: clang CXX: clang++ - func: upload-build - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.2-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "4.2", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.2" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-4.4-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "4.4", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "4.4" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-5.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "5.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "5.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-6.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "6.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "6.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-7.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "7.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "7.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, "8.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, "8.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-8.0-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, "8.0", openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: "8.0" } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-replica-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, replica, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: replica_set } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-server-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, server, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: server } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-test-latest-sharded-auth run_on: rhel8-latest-large tags: [sanitizers-matrix-tsan, test, rhel8-latest, clang, sasl-cyrus, tsan, auth, sharded, latest, openssl] depends_on: [{ name: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile }] commands: - func: fetch-build vars: BUILD_NAME: tsan-sasl-cyrus-openssl-rhel8-latest-clang-compile - command: expansions.update params: updates: - { key: CC, value: clang } - { key: CXX, value: clang++ } - { key: AUTH, value: auth } - { key: MONGODB_VERSION, value: latest } - { key: TOPOLOGY, value: sharded_cluster } - { key: SSL, value: openssl } - func: fetch-det - func: bootstrap-mongo-orchestration - func: run-simple-http-server - func: run-tests - name: verify-headers run_on: - amazon2 - debian11-latest-large - debian12-latest-large - ubuntu2204-large - ubuntu2404-large tags: [pr-merge-gate] commands: - func: docker-login-amazon-ecr - command: subprocess.exec type: test params: binary: ./tools/earthly.sh working_dir: mongoc include_expansions_in_env: - DOCKER_CONFIG args: - --buildkit-image=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub/earthly/buildkitd:v0.8.3 - +verify-headers - --default_search_registry=901841024863.dkr.ecr.us-east-1.amazonaws.com/dockerhub mongo-c-driver-2.2.1/.evergreen/generated_configs/variants.yml000066400000000000000000000377051511661753600244530ustar00rootroot00000000000000buildvariants: - name: almalinux10-clang display_name: AlmaLinux 10 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: almalinux10 tasks: - name: .almalinux10-clang - name: almalinux10-gcc display_name: AlmaLinux 10 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: almalinux10 tasks: - name: .almalinux10-gcc - name: almalinux8-clang display_name: AlmaLinux 8 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: almalinux8 tasks: - name: .almalinux8-clang - name: almalinux8-gcc display_name: AlmaLinux 8 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: almalinux8 tasks: - name: .almalinux8-gcc - name: almalinux9-clang display_name: AlmaLinux 9 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: almalinux9 tasks: - name: .almalinux9-clang - name: almalinux9-gcc display_name: AlmaLinux 9 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: almalinux9 tasks: - name: .almalinux9-gcc - name: alpine3.19-clang display_name: Alpine 3.19 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: alpine3.19 tasks: - name: .alpine3.19-clang - name: alpine3.19-gcc display_name: Alpine 3.19 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: alpine3.19 tasks: - name: .alpine3.19-gcc - name: alpine3.20-clang display_name: Alpine 3.20 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: alpine3.20 tasks: - name: .alpine3.20-clang - name: alpine3.20-gcc display_name: Alpine 3.20 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: alpine3.20 tasks: - name: .alpine3.20-gcc - name: alpine3.21-clang display_name: Alpine 3.21 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: alpine3.21 tasks: - name: .alpine3.21-clang - name: alpine3.21-gcc display_name: Alpine 3.21 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: alpine3.21 tasks: - name: .alpine3.21-gcc - name: alpine3.22-clang display_name: Alpine 3.22 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: alpine3.22 tasks: - name: .alpine3.22-clang - name: alpine3.22-gcc display_name: Alpine 3.22 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: alpine3.22 tasks: - name: .alpine3.22-gcc - name: archlinux-clang display_name: ArchLinux (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: archlinux tasks: - name: .archlinux-clang - name: archlinux-gcc display_name: ArchLinux (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: archlinux tasks: - name: .archlinux-gcc - name: centos10-clang display_name: CentOS 10 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: centos10 tasks: - name: .centos10-clang - name: centos10-gcc display_name: CentOS 10 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: centos10 tasks: - name: .centos10-gcc - name: centos9-clang display_name: CentOS 9 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: centos9 tasks: - name: .centos9-clang - name: centos9-gcc display_name: CentOS 9 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: centos9 tasks: - name: .centos9-gcc - name: clang-format display_name: clang-format run_on: - ubuntu2204-small tasks: - name: .clang-format - name: cse-matrix-darwinssl display_name: cse-matrix-darwinssl expansions: CLIENT_SIDE_ENCRYPTION: "on" tasks: - name: .cse-matrix-darwinssl - name: cse-matrix-openssl display_name: cse-matrix-openssl expansions: CLIENT_SIDE_ENCRYPTION: "on" tasks: - name: cse-sasl-cyrus-openssl-debian11-latest-clang-compile - name: cse-sasl-cyrus-openssl-debian11-latest-gcc-compile - name: cse-sasl-cyrus-openssl-debian12-latest-clang-compile - name: cse-sasl-cyrus-openssl-debian12-latest-gcc-compile - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-server-auth - name: cse-sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-compile - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-replica-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-server-auth - name: cse-sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-sharded-auth - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-compile batchtime: 1440 - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-test-5.0-sharded-auth batchtime: 1440 - name: cse-sasl-cyrus-openssl-rhel8-zseries-gcc-test-latest-sharded-auth batchtime: 1440 - name: cse-sasl-cyrus-openssl-rhel80-gcc-compile - name: cse-sasl-cyrus-openssl-ubuntu2204-clang-12-compile - name: cse-sasl-cyrus-openssl-ubuntu2204-gcc-compile - name: cse-sasl-cyrus-openssl-ubuntu2404-clang-14-compile - name: cse-sasl-cyrus-openssl-ubuntu2404-gcc-compile - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-compile - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.2-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-4.4-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-5.0-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-6.0-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-7.0-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-8.0-sharded-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-replica-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-server-auth - name: cse-sasl-cyrus-openssl-windows-2019-vs2022-x64-test-latest-sharded-auth - name: cse-matrix-winssl display_name: cse-matrix-winssl expansions: CLIENT_SIDE_ENCRYPTION: "on" tasks: - name: .cse-matrix-winssl - name: loadbalanced display_name: loadbalanced tasks: - name: .loadbalanced - name: mock-server-test display_name: Mock Server Test expansions: ASAN: "on" CC: gcc CFLAGS: -fno-omit-frame-pointer SANITIZE: address,undefined tasks: - name: mock-server-test - name: oidc display_name: OIDC tasks: - name: test-oidc-task-group - name: test-oidc-azure-task-group - name: test-oidc-gcp-task-group - name: openssl-compat-matrix display_name: OpenSSL Compatibility Matrix tasks: - name: .openssl-compat - name: sanitizers-matrix-asan display_name: sanitizers-matrix-asan expansions: ASAN: "on" CFLAGS: -fno-omit-frame-pointer CHECK_LOG: "ON" SANITIZE: address,undefined tasks: - name: .sanitizers-matrix-asan - name: sanitizers-matrix-tsan display_name: sanitizers-matrix-tsan expansions: CFLAGS: -fno-omit-frame-pointer CHECK_LOG: "ON" EXTRA_CONFIGURE_FLAGS: -DENABLE_SHM_COUNTERS=OFF SANITIZE: thread tasks: - name: .sanitizers-matrix-tsan - name: sasl-matrix-darwinssl display_name: sasl-matrix-darwinssl expansions: {} tasks: - name: .sasl-matrix-darwinssl - name: sasl-matrix-nossl display_name: sasl-matrix-nossl expansions: {} tasks: - name: .sasl-matrix-nossl - name: sasl-matrix-openssl display_name: sasl-matrix-openssl expansions: {} tasks: - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-compile - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-replica-auth - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-server-auth - name: sasl-cyrus-openssl-amazon2023-arm64-latest-large-m8g-gcc-test-latest-sharded-auth - name: sasl-cyrus-openssl-debian11-latest-gcc-compile - name: sasl-cyrus-openssl-debian12-latest-gcc-compile - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-compile - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-4.4-server-auth - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-5.0-server-auth - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-6.0-server-auth - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-7.0-server-auth - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-8.0-server-auth - name: sasl-cyrus-openssl-rhel8-arm64-latest-gcc-test-latest-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-compile - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-4.2-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-4.4-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-5.0-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-6.0-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-7.0-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-8.0-server-auth - name: sasl-cyrus-openssl-rhel8-latest-gcc-test-latest-server-auth - name: sasl-cyrus-openssl-rhel8-power-gcc-compile batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-4.2-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-4.4-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-5.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-6.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-7.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-8.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-power-gcc-test-latest-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-compile batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-5.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-6.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-7.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-8.0-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel8-zseries-gcc-test-latest-server-auth batchtime: 1440 - name: sasl-cyrus-openssl-rhel80-gcc-compile - name: sasl-cyrus-openssl-ubuntu2204-clang-12-compile - name: sasl-cyrus-openssl-ubuntu2204-gcc-compile - name: sasl-cyrus-openssl-ubuntu2404-clang-14-compile - name: sasl-cyrus-openssl-ubuntu2404-gcc-compile - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-compile - name: sasl-cyrus-openssl-windows-2019-vs2017-x64-test-latest-server-auth - name: sasl-matrix-winssl display_name: sasl-matrix-winssl expansions: {} tasks: - name: .sasl-matrix-winssl - name: sbom display_name: SBOM tasks: - name: .sbom - name: scan-build-matrix display_name: scan-build-matrix tasks: - name: .scan-build-matrix - name: std-matrix display_name: std-matrix tasks: - name: .std-matrix - name: u20-clang display_name: Ubuntu 20.04 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: u20 tasks: - name: .u20-clang - name: u20-gcc display_name: Ubuntu 20.04 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: u20 tasks: - name: .u20-gcc - name: u22-clang display_name: Ubuntu 22.04 (LLVM/Clang) expansions: MONGOC_EARTHLY_C_COMPILER: clang MONGOC_EARTHLY_ENV: u22 tasks: - name: .u22-clang - name: u22-gcc display_name: Ubuntu 22.04 (GCC) expansions: MONGOC_EARTHLY_C_COMPILER: gcc MONGOC_EARTHLY_ENV: u22 tasks: - name: .u22-gcc mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/000077500000000000000000000000001511661753600232565ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/000077500000000000000000000000001511661753600306335ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/__init__.py000066400000000000000000000066031511661753600327510ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from typing import Any, Iterable, Mapping, MutableMapping, MutableSequence, Sequence, Union import yaml import yamlloader Scalar = Union[str, bool, int, None, float] 'YAML simple schema scalar types' ValueSequence = Sequence['Value'] 'Sequence of YAML simple values' MutableValueArray = MutableSequence['Value'] 'A mutable sequence of JSON values' ValueMapping = Mapping[Scalar, 'Value'] 'A YAML mapping type (arbitrary scalars as keys)' MutableValueMapping = MutableMapping[Scalar, 'Value'] 'A mutable YAML mapping type' Value = Union[ValueSequence, ValueMapping, Scalar] 'Any YAML simple value' MutableValue = Union[MutableValueMapping, MutableValueArray, Scalar] 'Any YAML simple value, which may be a mutable sequence or map' ValueOrderedDict = OD[Scalar, Value] 'An OrderedDict of YAML values' class ConfigObject(object): @property def name(self) -> str: return 'UNSET' def to_dict(self) -> Value: return OD([('name', self.name)]) # We want legible YAML tasks: # # - name: debug-compile # tags: [zlib, snappy, compression, openssl] # commands: # - command: shell.exec # params: # script: |- # set -o errexit # ... # # Write values compactly except multiline strings, which use "|" style. Write # tag sets as lists. class _Dumper(yamlloader.ordereddict.Dumper): def __init__(self, *args: Value, **kwargs: Value): super().__init__(*args, **kwargs) # type: ignore self.add_representer(set, type(self).represent_set) # Use "multi_representer" to represent all subclasses of ConfigObject. self.add_multi_representer(ConfigObject, type(self).represent_config_object) def represent_scalar(self, tag: str, value: Value, style: str | None = None) -> yaml.ScalarNode: if isinstance(value, (str)) and '\n' in value: style = '|' return super().represent_scalar(tag, value, style) # type: ignore def represent_set(self, data: Iterable[Value]) -> yaml.MappingNode: return super().represent_list(sorted(set(data))) # type: ignore def represent_config_object(self, obj: ConfigObject) -> yaml.Node: d = obj.to_dict() return super().represent_data(d) # type: ignore def yaml_dump(obj: Any): return yaml.dump(obj, Dumper=_Dumper, default_flow_style=False) def generate(config: Any, path: str): """Dump config to a file as YAML. config is a dict, preferably an OrderedDict. path is a file path. """ f = open(path, 'w+') f.write( """#################################### # Evergreen configuration # # Generated with evergreen_config_generator from # github.com/mongodb-labs/drivers-evergreen-tools # # DO NOT EDIT THIS FILE # #################################### """ ) f.write(yaml_dump(config)) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/functions.py000066400000000000000000000072421511661753600332220ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from textwrap import dedent from typing import Iterable from evergreen_config_generator import ConfigObject from . import MutableValueMapping, Value, ValueMapping, ValueOrderedDict def func(func_name: str, **kwargs: Value) -> MutableValueMapping: od: MutableValueMapping = OD([('func', func_name)]) if kwargs: od['vars'] = OD(sorted(kwargs.items())) return od def s3_put(remote_file: str, project_path: bool = True, **kwargs: Value) -> ValueMapping: if project_path: remote_file = '${project}/' + remote_file return ValueOrderedDict( [ ('command', 's3.put'), ( 'params', ValueOrderedDict( ( ('aws_key', '${aws_key}'), ('aws_secret', '${aws_secret}'), ('remote_file', remote_file), ('bucket', 'mciuploads'), ('permissions', 'public-read'), *kwargs.items(), ) ), ), ] ) def strip_lines(s: str) -> str: return '\n'.join(line for line in s.split('\n') if line.strip()) def shell_exec( script: str, test: bool = True, errexit: bool = True, xtrace: bool = False, silent: bool = False, continue_on_err: bool = False, working_dir: str | None = None, background: bool = False, add_expansions_to_env: bool = False, redirect_standard_error_to_output: bool = False, include_expansions_in_env: Iterable[str] = (), ) -> ValueMapping: dedented = '' if errexit: dedented += 'set -o errexit\n' if xtrace: dedented += 'set -o xtrace\n' dedented += dedent(strip_lines(script)) command = ValueOrderedDict([('command', 'shell.exec')]) if test: command['type'] = 'test' command['params'] = OD() if silent: command['params']['silent'] = True if working_dir is not None: command['params']['working_dir'] = working_dir if continue_on_err: command['params']['continue_on_err'] = True if background: command['params']['background'] = True if add_expansions_to_env: command['params']['add_expansions_to_env'] = True if redirect_standard_error_to_output: command['params']['redirect_standard_error_to_output'] = True if include_expansions_in_env: command['params']['include_expansions_in_env'] = list(include_expansions_in_env) command['params']['shell'] = 'bash' command['params']['script'] = dedented return command def targz_pack(target: str, source_dir: str, *include: str) -> ValueMapping: return OD( [ ('command', 'archive.targz_pack'), ('params', OD([('target', target), ('source_dir', source_dir), ('include', list(include))])), ] ) class Function(ConfigObject): def __init__(self, *commands: Value): super(Function, self).__init__() self.commands = commands def to_dict(self) -> Value: return list(self.commands) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/taskgroups.py000066400000000000000000000040661511661753600334150ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import MutableMapping from evergreen_config_generator import ConfigObject from . import Value, ValueSequence class TaskGroup(ConfigObject): def __init__(self, name: str): self._task_group_name = name self.setup_group: ValueSequence | None = None self.teardown_group: ValueSequence | None = None self.setup_task: str | None = None self.teardown_task: str | None = None self.max_hosts: int | None = None self.timeout: int | None = None self.setup_group_can_fail_task: bool | None = None self.setup_group_timeout_secs: int | None = None self.share_processes: bool | None = None self.tasks: ValueSequence | None = None @property def name(self) -> str: return self._task_group_name def to_dict(self) -> Value: v = super().to_dict() assert isinstance(v, MutableMapping) # See possible TaskGroup attributes from the Evergreen wiki: # https://github.com/evergreen-ci/evergreen/wiki/Project-Configuration-Files#task-groups attrs = [ 'setup_group', 'teardown_group', 'setup_task', 'teardown_task', 'max_hosts', 'timeout', 'setup_group_can_fail_task', 'setup_group_timeout_secs', 'share_processes', 'tasks', ] for i in attrs: if getattr(self, i, None): v[i] = getattr(self, i) return v mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/tasks.py000066400000000000000000000156361511661753600323450ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import copy import itertools from collections import OrderedDict as OD from itertools import chain, product from typing import ClassVar, Iterable, Literal, Mapping, MutableMapping, Sequence, Union from evergreen_config_generator import ConfigObject from evergreen_config_generator.functions import func from . import MutableValueMapping, Value, ValueSequence DependencySpec = Union[str, Mapping[str, Value]] class Task(ConfigObject): def __init__( self, task_name: str | None = None, commands: Iterable[Value] = (), tags: Iterable[str] = (), depends_on: Iterable[DependencySpec] = (), exec_timeout_secs: int | None = None, ): self._name = task_name self._tags = list(tags) self.options: MutableValueMapping = OD() self.commands: ValueSequence = list(commands) self.exec_timeout_secs = exec_timeout_secs self._depends_on = list(map(self._normal_dep, depends_on)) if exec_timeout_secs is not None: self.options['exec_timeout_secs'] = exec_timeout_secs @property def dependencies(self) -> Sequence[Mapping[str, Value]]: main = list(self._depends_on) main.extend(map(self._normal_dep, self.additional_dependencies())) return tuple(main) def _normal_dep(self, spec: DependencySpec) -> Mapping[str, Value]: if isinstance(spec, str): return OD([('name', spec)]) return spec @property def tags(self) -> Sequence[str]: return tuple(sorted(chain(self.additional_tags(), self._tags))) def pre_commands(self) -> Iterable[Value]: return () def main_commands(self) -> Iterable[Value]: return () def post_commands(self) -> Iterable[Value]: return () def additional_dependencies(self) -> Iterable[DependencySpec]: return () @property def name(self) -> str: assert self._name is not None, f'Task {self} did not set a name, and did not override the "name" property' return self._name def additional_tags(self) -> Iterable[str]: return () def add_dependency(self, dependency: DependencySpec): if isinstance(dependency, str): dependency = OD([('name', dependency)]) self._depends_on.append(dependency) def to_dict(self): task: MutableValueMapping = super().to_dict() # type: ignore assert isinstance(task, MutableMapping) if self.tags: task['tags'] = list(self.tags) task.update(self.options) deps: Sequence[MutableValueMapping] = list(self.dependencies) # type: ignore if deps: if len(deps) == 1: task['depends_on'] = OD(deps[0]) else: task['depends_on'] = copy.deepcopy(deps) task['commands'] = list( itertools.chain( self.pre_commands(), self.main_commands(), self.commands, self.post_commands(), ) ) return task NamedTask = Task class FuncTask(NamedTask): def __init__( self, task_name: str, functions: Iterable[str], tags: Iterable[str] = (), depends_on: Iterable[DependencySpec] = (), exec_timeout_secs: int | None = None, ): commands = [func(func_name) for func_name in functions] super().__init__(task_name, commands, tags=tags, depends_on=depends_on, exec_timeout_secs=exec_timeout_secs) super(FuncTask, self).__init__(task_name, commands=commands) class Prohibited(Exception): pass def require(rule: bool) -> None: if not rule: raise Prohibited() def prohibit(rule: bool) -> None: if rule: raise Prohibited() def both_or_neither(rule0: bool, rule1: bool) -> None: if rule0: require(rule1) else: prohibit(rule1) class SettingsAccess: def __init__(self, inst: 'MatrixTask') -> None: self._task = inst def __getattr__(self, __setting: str) -> str | bool: return self._task.setting_value(__setting) class MatrixTask(Task): axes: ClassVar[Mapping[str, Sequence[str | bool]]] = OD() def __init__(self, settings: Mapping[str, str | bool]): super().__init__() self._settings = {k: v for k, v in settings.items()} for axis, options in type(self).axes.items(): if axis not in self._settings: self._settings[axis] = options[0] def display(self, axis_name: str) -> str: value = self.setting_value(axis_name) if value is False: # E.g., if self.auth is False, return 'noauth'. return f'no{axis_name}' elif value is True: return axis_name else: return value def on_off(self, key: str, val: str) -> Literal['on', 'off']: return 'on' if self.setting_value(key) == val else 'off' @property def name(self) -> str: return '-'.join(self.name_parts()) def name_parts(self) -> Iterable[str]: raise NotImplementedError @property def settings(self) -> SettingsAccess: return SettingsAccess(self) def setting_value(self, axis: str) -> str | bool: assert axis in type(self).axes.keys(), ( f'Attempted to inspect setting "{axis}", which is not defined for this task type' ) return self._settings[axis] def setting_eq(self, axis: str, val: str | bool) -> bool: current = self.setting_value(axis) options = type(self).axes[axis] assert val in options, ( f'Looking for value "{val}" on setting "{axis}", but that is not a supported option (Expects one of {options})' ) return current == val def is_valid_combination(self) -> bool: try: return self.do_is_valid_combination() except Prohibited: print(f'Ignoring invalid combination {self.name!r}') return False def do_is_valid_combination(self) -> bool: return True @classmethod def matrix(cls): for cell in product(*cls.axes.values()): axis_values = dict(zip(cls.axes, cell)) task = cls(settings=axis_values) if task.allowed: yield task @property def allowed(self): try: return self.do_is_valid_combination() except Prohibited: return False mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_generator/variants.py000066400000000000000000000036431511661753600330420ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Iterable, Mapping from evergreen_config_generator import ConfigObject from . import ValueMapping class Variant(ConfigObject): def __init__( self, name: str, display_name: str, run_on: list[str] | str, tasks: Iterable[str | ValueMapping], expansions: Mapping[str, str] | None = None, tags: Iterable[str] | None = None, patchable: bool | None = None, batchtime: int | None = None, display_tasks: Iterable[ValueMapping] = None, ): super(Variant, self).__init__() self._variant_name = name self.display_name = display_name self.run_on = run_on self.tasks = tasks self.expansions = expansions self.tags = tags self.patchable = patchable self.batchtime = batchtime self.display_tasks = display_tasks @property def name(self): return self._variant_name def to_dict(self): v = super(Variant, self).to_dict() for i in 'display_name', 'expansions', 'run_on', 'tasks', 'patchable', 'batchtime', 'tags', 'display_tasks': attr = getattr(self, i) # Allow `False`, but ignore empty lists and dicts. if isinstance(attr, None | list | dict) and not attr: continue v[i] = attr return v mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/000077500000000000000000000000001511661753600274135ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/__init__.py000066400000000000000000000026541511661753600315330ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Iterable from evergreen_config_generator.functions import shell_exec def shell_mongoc( script: str, test: bool = True, errexit: bool = True, xtrace: bool = False, silent: bool = False, continue_on_err: bool = False, background: bool = False, add_expansions_to_env: bool = False, redirect_standard_error_to_output: bool = False, include_expansions_in_env: Iterable[str] = (), ): return shell_exec( script, working_dir='mongoc', test=test, errexit=errexit, xtrace=xtrace, silent=silent, continue_on_err=continue_on_err, background=background, add_expansions_to_env=add_expansions_to_env, include_expansions_in_env=include_expansions_in_env, redirect_standard_error_to_output=redirect_standard_error_to_output, ) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/functions.py000066400000000000000000000237661511661753600320130ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from evergreen_config_generator.functions import Function, s3_put from evergreen_config_lib import shell_mongoc build_path = '${build_variant}/${revision}/${version_id}/${build_id}' all_functions = OD( [ ( 'install ssl', Function( shell_mongoc( '.evergreen/scripts/install-ssl.sh', test=False, add_expansions_to_env=True, ), ), ), ( 'upload coverage', Function( shell_mongoc( r""" export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp coverage s3://mciuploads/${project}/%s/coverage/ --recursive --acl public-read --region us-east-1 """ % (build_path,), test=False, silent=True, ), s3_put( build_path + '/coverage/index.html', aws_key='${aws_key}', aws_secret='${aws_secret}', local_file='mongoc/coverage/index.html', bucket='mciuploads', permissions='public-read', content_type='text/html', display_name='Coverage Report', ), ), ), ( 'upload scan artifacts', Function( shell_mongoc( r""" if find scan -name \*.html | grep -q html; then (cd scan && find . -name index.html -exec echo "
  • {}
  • " \;) >> scan.html else echo "No issues found" > scan.html fi """, ), shell_mongoc( r""" export AWS_ACCESS_KEY_ID=${aws_key} export AWS_SECRET_ACCESS_KEY=${aws_secret} aws s3 cp scan s3://mciuploads/${project}/%s/scan/ --recursive --acl public-read --region us-east-1 """ % (build_path,), test=False, silent=True, ), s3_put( build_path + '/scan/index.html', aws_key='${aws_key}', aws_secret='${aws_secret}', local_file='mongoc/scan.html', bucket='mciuploads', permissions='public-read', content_type='text/html', display_name='Scan Build Report', ), ), ), # Use "silent=True" to hide output since errors may contain credentials. ( 'run auth tests', Function( shell_mongoc( '.evergreen/scripts/run-auth-tests.sh', add_expansions_to_env=True, ), ), ), ( 'link sample program', Function( shell_mongoc( r""" # Compile a program that links dynamically or statically to libmongoc, # using variables from pkg-config or CMake's find_package command. export BUILD_SAMPLE_WITH_CMAKE=${BUILD_SAMPLE_WITH_CMAKE} export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= .evergreen/scripts/link-sample-program.sh LINK_STATIC=1 .evergreen/scripts/link-sample-program.sh """, include_expansions_in_env=['distro_id'], ), ), ), ( 'link sample program bson', Function( shell_mongoc( r""" # Compile a program that links dynamically or statically to libbson, # using variables from pkg-config or from CMake's find_package command. BUILD_SAMPLE_WITH_CMAKE= LINK_STATIC= .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE= LINK_STATIC=1 .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 LINK_STATIC= .evergreen/scripts/link-sample-program-bson.sh BUILD_SAMPLE_WITH_CMAKE=1 LINK_STATIC=1 .evergreen/scripts/link-sample-program-bson.sh """, include_expansions_in_env=['distro_id'], ), ), ), ( 'link sample program MSVC', Function( shell_mongoc( r""" # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc.cmd """, ) ), ), ( 'link sample program mingw', Function( shell_mongoc( r""" # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. PATH="/cygdrive/c/ProgramData/chocolatey/lib/winlibs/tools/mingw64/bin:$PATH" # mingw-w64 GCC cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw.cmd """, ) ), ), ( 'link sample program MSVC bson', Function( shell_mongoc( r""" # Build libmongoc with CMake and compile a program that links # dynamically or statically to it, using variables from CMake's # find_package command. export ENABLE_SSL=${ENABLE_SSL} export ENABLE_SNAPPY=${ENABLE_SNAPPY} LINK_STATIC= cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd LINK_STATIC=1 cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-msvc-bson.cmd """, ) ), ), ( 'link sample program mingw bson', Function( shell_mongoc( r""" # Build libmongoc with CMake and compile a program that links # dynamically to it, using variables from pkg-config.exe. PATH="/cygdrive/c/ProgramData/chocolatey/lib/winlibs/tools/mingw64/bin:$PATH" # mingw-w64 GCC cmd.exe /c .\\.evergreen\\scripts\\link-sample-program-mingw-bson.cmd """, ) ), ), ( 'update codecov.io', Function( shell_mongoc( r""" # Note: coverage is currently only enabled on the ubuntu1804 distro. # This script does not support MacOS, Windows, or non-x86_64 distros. # Update accordingly if code coverage is expanded to other distros. curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov # -Z: Exit with a non-zero value if error. # -g: Run with gcov support. # -t: Codecov upload token. # perl: filter verbose "Found" list and "Processing" messages. ./codecov -Zgt "${codecov_token}" | perl -lne 'print if not m|^.*\.gcov(\.\.\.)?$|' """, test=False, ), ), ), ( 'compile coverage', Function( shell_mongoc( 'COVERAGE=ON .evergreen/scripts/compile.sh', add_expansions_to_env=True, ), ), ), ( 'run aws tests', Function( # Assume role to get AWS secrets. {'command': 'ec2.assume_role', 'params': {'role_arn': '${aws_test_secrets_role}'}}, shell_mongoc( r""" pushd ../drivers-evergreen-tools/.evergreen/auth_aws ./setup_secrets.sh drivers/aws_auth popd # ../drivers-evergreen-tools/.evergreen/auth_aws """, include_expansions_in_env=['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN'], ), shell_mongoc( r""" pushd ../drivers-evergreen-tools/.evergreen/auth_aws . ./activate-authawsvenv.sh popd # ../drivers-evergreen-tools/.evergreen/auth_aws .evergreen/scripts/run-aws-tests.sh """, include_expansions_in_env=['TESTCASE'], ), ), ), ] ) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/taskgroups.py000066400000000000000000000013141511661753600321660ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from typing import Sequence from evergreen_config_generator.taskgroups import TaskGroup all_task_groups: Sequence[TaskGroup] = [] mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/tasks.py000066400000000000000000001013001511661753600311050ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from itertools import chain from typing import ClassVar, Iterable, Literal, Mapping, MutableSequence, Optional, Sequence from evergreen_config_generator import Value from evergreen_config_generator.functions import func, s3_put from evergreen_config_generator.tasks import ( DependencySpec, MatrixTask, NamedTask, both_or_neither, prohibit, require, ) from packaging.version import Version from evergreen_config_lib import shell_mongoc ToggleStr = Literal['OFF', 'ON'] OptToggleStr = Optional[ToggleStr] TopologyStr = Literal['server'] class CompileTask(NamedTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = {} cls_tags: ClassVar[Sequence[str]] = () cls_sanitize: ClassVar[Sequence[str]] = () def __init__( self, task_name: str, tags: Iterable[str] = (), config: str = 'debug', compression: str | None = 'default', suffix_commands: Iterable[Value] = (), depends_on: Iterable[DependencySpec] = (), prefix_commands: Iterable[Value] = (), sanitize: Iterable[Literal['undefined', 'address', 'thread']] = (), *, CFLAGS: str | None = None, LDFLAGS: str | None = None, EXTRA_CONFIGURE_FLAGS: str | None = None, SSL: Literal['WINDOWS', 'DARWIN', 'OPENSSL', 'OPENSSL_STATIC', 'OFF', None] = None, ENABLE_SHM_COUNTERS: OptToggleStr = None, CHECK_LOG: OptToggleStr = None, TRACING: OptToggleStr = None, SASL: Literal[None, 'OFF', 'AUTO', 'CYRUS', 'SSPI'] = None, ENABLE_RDTSCP: OptToggleStr = None, SRV: OptToggleStr = None, ): super(CompileTask, self).__init__(task_name=task_name, depends_on=depends_on, tags=tags) self.suffix_commands = list(suffix_commands) self.prefix_commands = list(prefix_commands) # Environment variables for .evergreen/scripts/compile.sh. self.compile_sh_opt: dict[str, str] = {} if config != 'debug': assert config == 'release' self.compile_sh_opt['RELEASE'] = 'ON' if CFLAGS: self.compile_sh_opt['CFLAGS'] = CFLAGS if LDFLAGS: self.compile_sh_opt['LDFLAGS'] = LDFLAGS if EXTRA_CONFIGURE_FLAGS: self.compile_sh_opt['EXTRA_CONFIGURE_FLAGS'] = EXTRA_CONFIGURE_FLAGS if SSL: self.compile_sh_opt['SSL'] = SSL if ENABLE_SHM_COUNTERS: self.compile_sh_opt['ENABLE_SHM_COUNTERS'] = ENABLE_SHM_COUNTERS if CHECK_LOG: self.compile_sh_opt['CHECK_LOG'] = CHECK_LOG if TRACING: self.compile_sh_opt['TRACING'] = TRACING if SASL: self.compile_sh_opt['SASL'] = SASL if ENABLE_RDTSCP: self.compile_sh_opt['ENABLE_RDTSCP'] = ENABLE_RDTSCP if SRV: self.compile_sh_opt['SRV'] = SRV if compression != 'default': self.compile_sh_opt['SNAPPY'] = 'ON' if compression in ('all', 'snappy') else 'OFF' self.compile_sh_opt['ZLIB'] = 'BUNDLED' if compression in ('all', 'zlib') else 'OFF' self.compile_sh_opt['ZSTD'] = 'ON' if compression in ('all', 'zstd') else 'OFF' if sanitize: self.compile_sh_opt['SANITIZE'] = ','.join(sanitize) self.compile_sh_opt.update(type(self).cls_compile_sh_env) def additional_script_env(self) -> Mapping[str, str]: return {} def to_dict(self): task = super(CompileTask, self).to_dict() commands = task['commands'] assert isinstance(commands, MutableSequence), task commands.extend(self.prefix_commands) script = 'env' for opt, value in sorted(self.compile_sh_opt.items()): script += ' %s="%s"' % (opt, value) script += ' .evergreen/scripts/compile.sh' commands.append(shell_mongoc(script, add_expansions_to_env=True)) commands.append(func('upload-build')) commands.extend(self.suffix_commands) return task def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield from self.cls_tags class SpecialTask(CompileTask): cls_tags: ClassVar[Sequence[str]] = ['special'] class CompileWithClientSideEncryption(CompileTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = dict( # Compiling with ClientSideEncryption support requires linking against the library libmongocrypt. COMPILE_LIBMONGOCRYPT='ON', EXTRA_CONFIGURE_FLAGS='-DENABLE_PIC=ON', ) cls_tags: ClassVar[Sequence[str]] = 'client-side-encryption', 'special' class CompileWithClientSideEncryptionAsan(CompileTask): cls_compile_sh_env: ClassVar[Mapping[str, str]] = dict( CFLAGS='-fno-omit-frame-pointer', COMPILE_LIBMONGOCRYPT='ON', CHECK_LOG='ON', PATH='/usr/lib/llvm-3.8/bin:$PATH', ) cls_tags: ClassVar[Sequence[str]] = ['client-side-encryption'] cls_sanitize: ClassVar[Sequence[str]] = ['address'] class LinkTask(NamedTask): def __init__( self, task_name: str, suffix_commands: Iterable[Value], orchestration: Literal[True, False, 'ssl'] = True ): if orchestration == 'ssl': # Actual value of SSL does not matter here so long as it is not 'nossl'. bootstrap_commands = [func('fetch-det'), func('bootstrap-mongo-orchestration', SSL='openssl')] elif orchestration: bootstrap_commands = [func('fetch-det'), func('bootstrap-mongo-orchestration')] else: bootstrap_commands = [] super().__init__( task_name=task_name, commands=bootstrap_commands + list(suffix_commands), ) all_tasks = [ CompileTask( 'hardened-compile', tags=['hardened'], compression=None, CFLAGS='-fno-strict-overflow -D_FORTIFY_SOURCE=2 -fstack-protector-all -O', LDFLAGS='-Wl,-z,relro -Wl,-z,now', EXTRA_CONFIGURE_FLAGS='CMAKE_POSITION_INDEPENDENT_CODE=ON', ), CompileTask('debug-compile-compression-zlib', tags=['zlib', 'compression'], compression='zlib'), CompileTask('debug-compile-compression-snappy', tags=['snappy', 'compression'], compression='snappy'), CompileTask('debug-compile-compression-zstd', tags=['zstd', 'compression'], compression='zstd'), CompileTask('debug-compile-nosasl-nossl', tags=['debug-compile', 'nosasl', 'nossl'], SSL='OFF'), CompileTask('debug-compile-lto', CFLAGS='-flto'), CompileTask('debug-compile-lto-thin', CFLAGS='-flto=thin'), CompileTask('debug-compile-no-counters', tags=['debug-compile', 'no-counters'], ENABLE_SHM_COUNTERS='OFF'), CompileTask('compile-tracing', TRACING='ON', CFLAGS='-Werror -Wno-cast-align'), CompileTask('release-compile', config='release'), CompileTask('debug-compile-nosasl-openssl', tags=['debug-compile', 'nosasl', 'openssl'], SSL='OPENSSL'), CompileTask('debug-compile-nosasl-darwinssl', tags=['debug-compile', 'nosasl', 'darwinssl'], SSL='DARWIN'), CompileTask('debug-compile-nosasl-winssl', tags=['debug-compile', 'nosasl', 'winssl'], SSL='WINDOWS'), CompileTask('debug-compile-sasl-openssl', tags=['debug-compile', 'sasl', 'openssl'], SASL='AUTO', SSL='OPENSSL'), CompileTask('debug-compile-sasl-darwinssl', tags=['debug-compile', 'sasl', 'darwinssl'], SASL='AUTO', SSL='DARWIN'), CompileTask('debug-compile-rdtscp', ENABLE_RDTSCP='ON'), CompileTask('debug-compile-sspi-winssl', tags=['debug-compile', 'sspi', 'winssl'], SASL='SSPI', SSL='WINDOWS'), CompileTask('debug-compile-nosrv', tags=['debug-compile'], SRV='OFF'), LinkTask('link-with-cmake', suffix_commands=[func('link sample program', BUILD_SAMPLE_WITH_CMAKE=1)]), LinkTask( 'link-with-cmake-ssl', suffix_commands=[func('link sample program', BUILD_SAMPLE_WITH_CMAKE=1, ENABLE_SSL=1)], ), LinkTask( 'link-with-cmake-snappy', suffix_commands=[func('link sample program', BUILD_SAMPLE_WITH_CMAKE=1, ENABLE_SNAPPY='ON')], ), LinkTask('link-with-cmake-mac', suffix_commands=[func('link sample program', BUILD_SAMPLE_WITH_CMAKE=1)]), LinkTask('link-with-cmake-windows', suffix_commands=[func('link sample program MSVC')]), LinkTask( 'link-with-cmake-windows-ssl', suffix_commands=[func('link sample program MSVC', ENABLE_SSL=1)], orchestration='ssl', ), LinkTask('link-with-cmake-windows-snappy', suffix_commands=[func('link sample program MSVC', ENABLE_SNAPPY='ON')]), LinkTask('link-with-cmake-mingw', suffix_commands=[func('link sample program mingw')]), LinkTask('link-with-pkg-config', suffix_commands=[func('link sample program')]), LinkTask('link-with-pkg-config-mac', suffix_commands=[func('link sample program')]), LinkTask('link-with-pkg-config-ssl', suffix_commands=[func('link sample program', ENABLE_SSL=1)]), LinkTask('link-with-bson', suffix_commands=[func('link sample program bson')], orchestration=False), LinkTask('link-with-bson-mac', suffix_commands=[func('link sample program bson')], orchestration=False), LinkTask('link-with-bson-windows', suffix_commands=[func('link sample program MSVC bson')], orchestration=False), LinkTask('link-with-bson-mingw', suffix_commands=[func('link sample program mingw bson')], orchestration=False), NamedTask( 'debian-package-build', commands=[ shell_mongoc('export IS_PATCH="${is_patch}"\n.evergreen/scripts/debian_package_build.sh'), s3_put( local_file='deb.tar.gz', remote_file='${branch_name}/mongo-c-driver-debian-packages-${CURRENT_VERSION}.tar.gz', content_type='${content_type|application/x-gzip}', ), s3_put( local_file='deb.tar.gz', remote_file='${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages.tar.gz', content_type='${content_type|application/x-gzip}', ), s3_put( local_file='deb-i386.tar.gz', remote_file='${branch_name}/mongo-c-driver-debian-packages-i386-${CURRENT_VERSION}.tar.gz', content_type='${content_type|application/x-gzip}', ), s3_put( local_file='deb-i386.tar.gz', remote_file='${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-debian-packages-i386.tar.gz', content_type='${content_type|application/x-gzip}', ), ], ), NamedTask( 'rpm-package-build', commands=[ shell_mongoc('export IS_PATCH="${is_patch}"\n.evergreen/scripts/check_rpm_spec.sh'), shell_mongoc('.evergreen/scripts/build_snapshot_rpm.sh'), s3_put( local_file='rpm.tar.gz', remote_file='${branch_name}/mongo-c-driver-rpm-packages-${CURRENT_VERSION}.tar.gz', content_type='${content_type|application/x-gzip}', ), s3_put( local_file='rpm.tar.gz', remote_file='${branch_name}/${revision}/${version_id}/${build_id}/${execution}/mongo-c-driver-rpm-packages.tar.gz', content_type='${content_type|application/x-gzip}', ), shell_mongoc( 'sudo rm -rf ../build ../mock-result ../rpm.tar.gz\n' 'export MOCK_TARGET_CONFIG=rocky+epel-9-aarch64\n' '.evergreen/scripts/build_snapshot_rpm.sh' ), shell_mongoc( 'sudo rm -rf ../build ../mock-result ../rpm.tar.gz\n' 'export MOCK_TARGET_CONFIG=rocky+epel-8-aarch64\n' '.evergreen/scripts/build_snapshot_rpm.sh' ), ], ), CompileTask('debug-compile-with-warnings', CFLAGS='-Werror -Wno-cast-align'), NamedTask( 'install-libmongoc-after-libbson', commands=[ shell_mongoc( '.evergreen/scripts/install-libmongoc-after-libbson.sh', include_expansions_in_env=['distro_id'], ), ], ), ] class CoverageTask(MatrixTask): axes = OD( [ ('version', ['latest']), ('topology', ['replica_set']), ('auth', [True]), ('sasl', ['sasl']), ('ssl', ['openssl']), ('cse', [False, True]), ] ) def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield 'test-coverage' yield str(self.settings.version) if self.cse: yield 'client-side-encryption' def name_parts(self) -> Iterable[str]: yield 'test-coverage' yield self.display('version') yield self.display('topology').replace('_', '-') yield from map(self.display, ('auth', 'sasl', 'ssl')) if self.settings.cse: yield 'cse' @property def cse(self) -> bool: return bool(self.settings.cse) def post_commands(self) -> Iterable[Value]: if self.cse: yield func( 'compile coverage', SASL='AUTO', SSL='OPENSSL', COMPILE_LIBMONGOCRYPT='ON', EXTRA_CONFIGURE_FLAGS='EXTRA_CONFIGURE_FLAGS="-DENABLE_PIC=ON"', ) else: yield func('compile coverage', SASL='AUTO', SSL='OPENSSL') yield func('fetch-det') yield func( 'bootstrap-mongo-orchestration', MONGODB_VERSION=self.settings.version, TOPOLOGY=self.settings.topology, AUTH=self.display('auth'), SSL=self.display('ssl'), ) yield func('run-simple-http-server') extra = {'COVERAGE': 'ON'} if self.cse: extra['CLIENT_SIDE_ENCRYPTION'] = 'ON' yield func('run-mock-kms-servers') yield func('run-tests', AUTH=self.display('auth'), SSL=self.display('ssl'), **extra) yield func('upload coverage') yield func('update codecov.io') def do_is_valid_combination(self) -> bool: # Limit coverage tests to test-coverage-latest-replica-set-auth-sasl-openssl (+ cse). require(self.setting_eq('topology', 'replica_set')) require(self.setting_eq('sasl', 'sasl')) require(self.setting_eq('ssl', 'openssl')) require(self.setting_eq('version', 'latest')) require(self.settings.auth is True) if not self.cse: # No further requirements return True # CSE has extra requirements if self.settings.version != 'latest': # We only work with 4.2 or newer for CSE require(Version(str(self.settings.version)) >= Version('4.2')) return True all_tasks = chain(all_tasks, CoverageTask.matrix()) class DNSTask(MatrixTask): axes = OD( [ ('auth', [False, True]), ('loadbalanced', [False, True]), ('ssl', ['openssl', 'winssl', 'darwinssl']), ] ) name_prefix = 'test-dns' def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def build_task_name(self) -> str: sasl = 'sspi' if self.settings.ssl == 'winssl' else 'sasl' return f'debug-compile-{sasl}-{self.display("ssl")}' def name_parts(self) -> Iterable[str]: yield 'test-dns' if self.settings.auth: yield 'auth' if self.settings.loadbalanced: yield 'loadbalanced' yield self.display('ssl') def post_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self.build_task_name) yield func('fetch-det') if self.settings.loadbalanced: orchestration = func( 'bootstrap-mongo-orchestration', TOPOLOGY='sharded_cluster', AUTH='auth' if self.settings.auth else 'noauth', SSL='ssl', LOAD_BALANCER='on', ) else: orchestration = func( 'bootstrap-mongo-orchestration', TOPOLOGY='replica_set', AUTH='auth' if self.settings.auth else 'noauth', SSL='ssl', ) yield orchestration dns = 'on' if self.settings.loadbalanced: dns = 'loadbalanced' yield func('fetch-det') yield func('start-load-balancer', MONGODB_URI='mongodb://localhost:27017,localhost:27018') elif self.settings.auth: dns = 'dns-auth' yield func('run-tests', SSL='ssl', AUTH=self.display('auth'), DNS=dns) def do_is_valid_combination(self) -> bool: prohibit(bool(self.settings.loadbalanced) and bool(self.settings.auth)) # Load balancer tests only run on some Linux hosts in Evergreen until CDRIVER-4041 is resolved. prohibit(bool(self.settings.loadbalanced) and self.settings.ssl in ['darwinssl', 'winssl']) return True all_tasks = chain(all_tasks, DNSTask.matrix()) class CompressionTask(MatrixTask): axes = OD([('compression', ['zlib', 'snappy', 'zstd'])]) name_prefix = 'test-latest-server' def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def build_task_name(self) -> str: return f'debug-compile-{self._compressor_suffix()}' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield 'compression' yield 'latest' yield from self._compressor_list() def name_parts(self) -> Iterable[str]: return [self.name_prefix, self._compressor_suffix()] def post_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self.build_task_name) yield func('fetch-det') yield func('bootstrap-mongo-orchestration', AUTH='noauth', SSL='nossl') yield func('run-simple-http-server') yield func('run-tests', AUTH='noauth', SSL='nossl', COMPRESSORS=','.join(self._compressor_list())) def _compressor_suffix(self): if self.settings.compression == 'zlib': return 'compression-zlib' elif self.settings.compression == 'snappy': return 'compression-snappy' elif self.settings.compression == 'zstd': return 'compression-zstd' else: return 'compression' def _compressor_list(self): if self.settings.compression == 'zlib': return ['zlib'] elif self.settings.compression == 'snappy': return ['snappy'] elif self.settings.compression == 'zstd': return ['zstd'] else: return ['snappy', 'zlib', 'zstd'] all_tasks = chain(all_tasks, CompressionTask.matrix()) class SpecialIntegrationTask(NamedTask): def __init__( self, task_name: str, main_dep: str = 'debug-compile-sasl-openssl', uri: str | None = None, tags: Iterable[str] = (), version: str = 'latest', topology: str = 'server', ): self._main_dep = main_dep super().__init__(task_name, depends_on=[self._main_dep], tags=tags) self._uri = uri self._version = version self._topo = topology def pre_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self._main_dep) yield func('fetch-det') yield func('bootstrap-mongo-orchestration', MONGODB_VERSION=self._version, TOPOLOGY=self._topo) yield func('run-simple-http-server') yield func('run-tests', URI=self._uri) all_tasks = chain( all_tasks, [ # Verify that retryWrites=true is ignored with standalone. SpecialIntegrationTask('retry-true-latest-server', uri='mongodb://localhost/?retryWrites=true'), SpecialIntegrationTask('test-latest-server-hardened', 'hardened-compile', tags=['hardened', 'latest']), ], ) class AuthTask(MatrixTask): axes = OD([('sasl', ['sasl', 'sspi', False]), ('ssl', ['openssl', 'darwinssl', 'winssl'])]) name_prefix = 'authentication-tests' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield 'authentication-tests' yield self.display('ssl') yield self.display('sasl') def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name def post_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self.build_task_name) yield func('run auth tests') @property def build_task_name(self) -> str: return f'debug-compile-{self.display("sasl")}-{self.display("ssl")}' def name_parts(self) -> Iterable[str]: yield self.name_prefix yield self.display('ssl') if not self.settings.sasl: yield 'nosasl' def do_is_valid_combination(self) -> bool: both_or_neither(self.settings.ssl == 'winssl', self.settings.sasl == 'sspi') if not self.settings.sasl: require(self.settings.ssl == 'openssl') return True all_tasks = chain(all_tasks, AuthTask.matrix()) class PostCompileTask(NamedTask): def __init__(self, name: str, tags: Iterable[str], get_build: str, commands: Iterable[Value]): super().__init__(name, commands=commands, tags=tags, depends_on=[get_build]) self._dep = get_build def pre_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self._dep) all_tasks = chain( all_tasks, [ NamedTask( 'authentication-tests-asan-memcheck', tags=['authentication-tests', 'asan'], commands=[ shell_mongoc( 'env SANITIZE=address SASL=AUTO SSL=OPENSSL .evergreen/scripts/compile.sh', add_expansions_to_env=True, ), func('run auth tests', ASAN='on'), ], ), ], ) # Add API version tasks. for server_version in ['8.0', '7.0', '6.0', '5.0']: all_tasks = chain( all_tasks, [ PostCompileTask( 'test-versioned-api-' + server_version, tags=['versioned-api', f'{server_version}'], get_build='debug-compile-nosasl-openssl', commands=[ func('fetch-det'), func( 'bootstrap-mongo-orchestration', TOPOLOGY='server', AUTH='auth', SSL='ssl', MONGODB_VERSION=server_version, REQUIRE_API_VERSION='true', ), func('run-simple-http-server'), func('run-tests', MONGODB_API_VERSION=1, AUTH='auth', SSL='ssl'), ], ), PostCompileTask( 'test-versioned-api-accept-version-two-' + server_version, tags=['versioned-api', f'{server_version}'], get_build='debug-compile-nosasl-nossl', commands=[ func('fetch-det'), func( 'bootstrap-mongo-orchestration', TOPOLOGY='server', AUTH='noauth', SSL='nossl', MONGODB_VERSION=server_version, ORCHESTRATION_FILE='versioned-api-testing.json', ), func('run-simple-http-server'), func('run-tests', MONGODB_API_VERSION=1, AUTH='noauth', SSL='nossl'), ], ), ], ) class IPTask(MatrixTask): axes = OD( [ ('client', ['ipv6', 'ipv4', 'localhost']), ('server', ['ipv6', 'ipv4']), ] ) name_prefix = 'test-latest' def additional_dependencies(self) -> Iterable[DependencySpec]: yield 'debug-compile-nosasl-nossl' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield from ('nossl', 'nosasl', 'server', 'ipv4-ipv6', 'latest') def post_commands(self) -> Iterable[Value]: return [ func('fetch-build', BUILD_NAME='debug-compile-nosasl-nossl'), func('fetch-det'), func('bootstrap-mongo-orchestration'), func('run-simple-http-server'), func( 'run-tests', URI={ 'ipv6': 'mongodb://[::1]/', 'ipv4': 'mongodb://127.0.0.1/', 'localhost': 'mongodb://localhost/', }[str(self.settings.client)], ), ] def name_parts(self) -> Iterable[str]: return ( self.name_prefix, f'server-{self.display("server")}', f'client-{self.display("client")}', 'noauth', 'nosasl', 'nossl', ) def do_is_valid_combination(self) -> bool: # This would fail by design. if self.settings.server == 'ipv4': prohibit(self.settings.client == 'ipv6') # Default configuration is tested in other variants. if self.settings.server == 'ipv6': prohibit(self.settings.client == 'localhost') return True all_tasks = chain(all_tasks, IPTask.matrix()) aws_compile_task = NamedTask( 'debug-compile-aws', commands=[ shell_mongoc( """ set -o errexit set -o pipefail # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true # Ubuntu 20.04 does not have uv. if ! command -v uv >/dev/null; then prefix="$(mktemp -d)" python3 -m pip install --prefix "$prefix" uv PATH="$prefix/bin:$PATH" fi # Compile test-awsauth. Disable unnecessary dependencies since test-awsauth is copied to a remote Ubuntu 20.04 ECS cluster for testing, which may not have all dependent libraries. uvx cmake -DENABLE_TRACING=ON -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF -S . -B cmake-build uvx cmake --build cmake-build --target test-awsauth """, include_expansions_in_env=['CC'], redirect_standard_error_to_output=True, ), func('upload-build'), ], ) all_tasks = chain(all_tasks, [aws_compile_task]) class AWSTestTask(MatrixTask): axes = OD( [ ('testcase', ['regular', 'ec2', 'ecs', 'lambda', 'assume_role', 'assume_role_with_web_identity']), ('version', ['latest', '8.0', '7.0', '6.0', '5.0', '4.4']), ] ) name_prefix = 'test-aws-openssl' def additional_dependencies(self) -> Iterable[DependencySpec]: yield 'debug-compile-aws' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield f'{self.settings.version}' yield 'test-aws' def post_commands(self) -> Iterable[Value]: return [ func('fetch-build', BUILD_NAME='debug-compile-aws'), func('fetch-det'), func( 'bootstrap-mongo-orchestration', AUTH='auth', ORCHESTRATION_FILE='auth-aws.json', MONGODB_VERSION=self.settings.version, TOPOLOGY='server', ), func('run aws tests', TESTCASE=str(self.settings.testcase).upper()), ] @property def name(self): return f'{self.name_prefix}-{self.settings.testcase}-{self.settings.version}' all_tasks = chain(all_tasks, AWSTestTask.matrix()) class OCSPTask(MatrixTask): axes = OD( [ ( 'test', [ 'test_1', 'test_2', 'test_3', 'test_4', 'soft_fail_test', 'malicious_server_test_1', 'malicious_server_test_2', 'cache', ], ), ('delegate', ['delegate', 'nodelegate']), ('cert', ['rsa', 'ecdsa']), ('ssl', ['openssl', 'darwinssl', 'winssl']), ('version', ['latest', '8.0', '7.0', '6.0', '5.0', '4.4']), ] ) name_prefix = 'test-ocsp' @property def build_task_name(self) -> str: return f'debug-compile-nosasl-{self.display("ssl")}' def additional_tags(self) -> Iterable[str]: yield from super().additional_tags() yield f'ocsp-{self.display("ssl")}' def additional_dependencies(self) -> Iterable[DependencySpec]: yield self.build_task_name @property def name(self): return f'ocsp-{self.settings.ssl}-{self.test}-{self.settings.cert}-{self.settings.delegate}-{self.settings.version}' @property def test(self) -> str: return str(self.settings.test) def post_commands(self) -> Iterable[Value]: yield func('fetch-build', BUILD_NAME=self.build_task_name) yield func('fetch-det') stapling = 'mustStaple' if self.test in ['test_3', 'test_4', 'soft_fail_test', 'cache']: stapling = 'disableStapling' if self.test in ['malicious_server_test_1', 'malicious_server_test_2']: stapling = 'mustStaple-disableStapling' orchestration = func( 'bootstrap-mongo-orchestration', MONGODB_VERSION=self.settings.version, TOPOLOGY='server', SSL='ssl', OCSP='on', ORCHESTRATION_FILE=f'{self.settings.cert}-basic-tls-ocsp-{stapling}.json', ) # The cache test expects a revoked response from an OCSP responder, exactly like TEST_4. test_column = 'TEST_4' if self.test == 'cache' else str(self.test).upper() use_delegate = 'ON' if self.settings.delegate == 'delegate' else 'OFF' yield ( shell_mongoc( f""" TEST_COLUMN={test_column} CERT_TYPE={self.settings.cert} USE_DELEGATE={use_delegate} .evergreen/scripts/run-ocsp-responder.sh """ ) ) yield (orchestration) if self.test == 'cache': yield ( shell_mongoc( f""" CERT_TYPE={self.settings.cert} .evergreen/scripts/run-ocsp-cache-test.sh """, redirect_standard_error_to_output=True, ) ) else: yield ( shell_mongoc( f""" TEST_COLUMN={self.test.upper()} CERT_TYPE={self.settings.cert} .evergreen/scripts/run-ocsp-test.sh """, redirect_standard_error_to_output=True, ) ) def to_dict(self): task = super(MatrixTask, self).to_dict() # OCSP tests should run with a batchtime of 14 days. Avoid running OCSP # tests in patch builds by default (only in commit builds). task['patchable'] = False return task # Testing in OCSP has a lot of exceptions. def do_is_valid_combination(self) -> bool: if self.settings.ssl == 'darwinssl': # Secure Transport quietly ignores a must-staple certificate with no stapled response. prohibit(self.test == 'malicious_server_test_2') # Why does this fail with Secure Transport (CSSMERR_TP_CERT_SUSPENDED)...? prohibit(self.test == 'test_3') # CDRIVER-3759: Secure Transport does not implement soft failure? prohibit(self.test == 'soft_fail_test') # Only Server 6.0+ are available on MacOS ARM64. if self.settings.version != 'latest': prohibit(Version(self.settings.version) < Version('6.0')) if self.settings.ssl == 'darwinssl' or self.settings.ssl == 'winssl': # ECDSA certs can't be loaded (in the PEM format they're stored) on Windows/macOS. Skip them. prohibit(self.settings.cert == 'ecdsa') # OCSP stapling is not supported on macOS or Windows. prohibit(self.test in ['test_1', 'test_2', 'cache']) if self.test == 'soft_fail_test' or self.test == 'malicious_server_test_2' or self.test == 'cache': prohibit(self.settings.delegate == 'delegate') return True all_tasks = chain(all_tasks, OCSPTask.matrix()) all_tasks = list(all_tasks) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/testazurekms.py000066400000000000000000000163171511661753600325360ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from typing import MutableSequence from evergreen_config_generator.functions import func, shell_exec from evergreen_config_generator.taskgroups import TaskGroup from evergreen_config_generator.tasks import NamedTask from evergreen_config_generator.variants import Variant def _create_tasks(): # passtask is expected to run on a remote Azure VM and succeed at obtaining credentials. passtask = NamedTask(task_name='testazurekms-task') passtask.commands = [ func('fetch-source'), shell_exec( r""" echo "Building test-azurekms ... begin" pushd mongoc .evergreen/scripts/compile-test-azurekms.sh popd echo "Building test-azurekms ... end" echo "Copying files ... begin" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testazurekms cp ./mongoc/src/libmongoc/test-azurekms ./mongoc/install/lib/libmongocrypt.* testazurekms tar czf testazurekms.tgz testazurekms/* AZUREKMS_SRC="testazurekms.tgz" \ AZUREKMS_DST="./" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" AZUREKMS_CMD="tar xf testazurekms.tgz" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh echo "Untarring file ... end" """, test=False, add_expansions_to_env=True, ), shell_exec( r""" export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools AZUREKMS_CMD="LD_LIBRARY_PATH=./testazurekms MONGODB_URI='mongodb://localhost:27017' KEY_NAME='${testazurekms_keyname}' KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' ./testazurekms/test-azurekms" \ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh """ ), ] failtask = NamedTask(task_name='testazurekms-fail-task') failtask.commands = [ func('fetch-source'), shell_exec( r""" pushd mongoc .evergreen/scripts/compile-test-azurekms.sh popd """, test=False, add_expansions_to_env=True, ), shell_exec( r""" LD_LIBRARY_PATH=$PWD/install \ MONGODB_URI='mongodb://localhost:27017' \ KEY_NAME='${testazurekms_keyname}' \ KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' \ EXPECT_ERROR='Error from Azure IMDS server' \ ./mongoc/src/libmongoc/test-azurekms """ ), ] return [passtask, failtask] def _create_variant(): return Variant( name='testazurekms-variant', display_name='Azure KMS', # Azure Virtual Machine created is Debian 11. run_on='debian11-small', # TODO: switch to 'debian11-latest-small' after DEVPROD-23011 fixed. tasks=['testazurekms_task_group', 'testazurekms-fail-task'], batchtime=20160, ) # Use a batchtime of 14 days as suggested by the CSFLE test README def _create_task_group(): task_group = TaskGroup(name='testazurekms_task_group') task_group.setup_group_can_fail_task = True task_group.setup_group_timeout_secs = 1800 # 30 minutes task_group.setup_group = [ func('fetch-det'), # Assume role to get AWS secrets. {'command': 'ec2.assume_role', 'params': {'role_arn': '${aws_test_secrets_role}'}}, shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testazurekms_publickey}' > /tmp/testazurekms_publickey echo '${testazurekms_privatekey}' > /tmp/testazurekms_privatekey # Set 600 permissions on private key file. Otherwise ssh / scp may error with permissions "are too open". chmod 600 /tmp/testazurekms_privatekey export AZUREKMS_CLIENTID=${testazurekms_clientid} export AZUREKMS_TENANTID=${testazurekms_tenantid} export AZUREKMS_SECRET=${testazurekms_secret} export AZUREKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} export AZUREKMS_PUBLICKEYPATH=/tmp/testazurekms_publickey export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey export AZUREKMS_SCOPE=${testazurekms_scope} export AZUREKMS_VMNAME_PREFIX=CDRIVER $DRIVERS_TOOLS/.evergreen/csfle/azurekms/create-and-setup-vm.sh """, test=False, include_expansions_in_env=['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN'], ), # Load the AZUREKMS_VMNAME expansion. OD( [ ('command', 'expansions.update'), ( 'params', OD( [ ('file', 'testazurekms-expansions.yml'), ] ), ), ] ), ] task_group.teardown_group = [ # Load expansions again. The setup task may have failed before running `expansions.update`. OD( [ ('command', 'expansions.update'), ( 'params', OD( [ ('file', 'testazurekms-expansions.yml'), ] ), ), ] ), shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export AZUREKMS_VMNAME=${AZUREKMS_VMNAME} export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup} $DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete-vm.sh """, test=False, ), ] task_group.tasks = ['testazurekms-task'] return task_group def testazurekms_generate( all_tasks: MutableSequence[NamedTask], all_variants: MutableSequence[Variant], all_task_groups: MutableSequence[TaskGroup], ): all_tasks.extend(_create_tasks()) all_variants.append(_create_variant()) all_task_groups.append(_create_task_group()) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/testgcpkms.py000066400000000000000000000132241511661753600321530ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0(the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http: // www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from typing import MutableSequence from evergreen_config_generator.functions import func, shell_exec from evergreen_config_generator.taskgroups import TaskGroup from evergreen_config_generator.tasks import NamedTask from evergreen_config_generator.variants import Variant def _create_tasks(): passtask = NamedTask( task_name='testgcpkms-task', commands=[ func('fetch-source'), shell_exec( r""" echo "Building test-gcpkms ... begin" pushd mongoc .evergreen/scripts/compile-test-gcpkms.sh popd echo "Building test-gcpkms ... end" echo "Copying files ... begin" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools mkdir testgcpkms cp ./mongoc/src/libmongoc/test-gcpkms ./mongoc/install/lib/libmongocrypt.* testgcpkms tar czf testgcpkms.tgz testgcpkms/* GCPKMS_SRC="testgcpkms.tgz" GCPKMS_DST=$GCPKMS_INSTANCENAME: $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/copy-file.sh echo "Copying files ... end" echo "Untarring file ... begin" GCPKMS_CMD="tar xf testgcpkms.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh echo "Untarring file ... end" """, test=False, add_expansions_to_env=True, ), shell_exec( r""" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools GCPKMS_CMD="LD_LIBRARY_PATH=./testgcpkms MONGODB_URI='mongodb://localhost:27017' ./testgcpkms/test-gcpkms" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh """ ), ], ) failtask = NamedTask( task_name='testgcpkms-fail-task', commands=[ shell_exec( r""" pushd mongoc .evergreen/scripts/compile-test-gcpkms.sh popd""", test=False, add_expansions_to_env=True, ), shell_exec( r""" export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} LD_LIBRARY_PATH=$(pwd)/install MONGODB_URI='mongodb://localhost:27017' EXPECT_ERROR='Failed to connect to: metadata.google.internal' ./mongoc/src/libmongoc/test-gcpkms""" ), ], ) return [passtask, failtask] def _create_variant(): return Variant( name='testgcpkms-variant', display_name='GCP KMS', run_on='debian11-latest-small', # GCP Virtual Machine is actually Debian 11. tasks=['testgcpkms_task_group', 'testgcpkms-fail-task'], batchtime=20160, ) # Use a batchtime of 14 days as suggested by the CSFLE test README def _create_task_group(): task_group = TaskGroup(name='testgcpkms_task_group') task_group.setup_group_can_fail_task = True task_group.setup_group_timeout_secs = 1800 # 30 minutes task_group.setup_group = [ func('fetch-det'), # Create and set up a GCE instance using driver tools script shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools echo '${testgcpkms_key_file}' > /tmp/testgcpkms_key_file.json export GCPKMS_KEYFILE=/tmp/testgcpkms_key_file.json export GCPKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS export GCPKMS_SERVICEACCOUNT="${testgcpkms_service_account}" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/create-and-setup-instance.sh""", test=False, ), # Load the GCPKMS_GCLOUD, GCPKMS_INSTANCE, GCPKMS_PROJECT, and GCPKMS_ZONE expansions. OD([('command', 'expansions.update'), ('params', OD([('file', 'testgcpkms-expansions.yml')]))]), ] task_group.teardown_group = [ shell_exec( r""" DRIVERS_TOOLS=$(pwd)/drivers-evergreen-tools export GCPKMS_GCLOUD=${GCPKMS_GCLOUD} export GCPKMS_PROJECT=${GCPKMS_PROJECT} export GCPKMS_ZONE=${GCPKMS_ZONE} export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME} $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/delete-instance.sh""", test=False, ) ] task_group.tasks = ['testgcpkms-task'] return task_group def testgcpkms_generate( all_tasks: MutableSequence[NamedTask], all_variants: MutableSequence[Variant], all_task_groups: MutableSequence[TaskGroup], ): all_tasks.extend(_create_tasks()) all_variants.append(_create_variant()) all_task_groups.append(_create_task_group()) mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/evergreen_config_lib/variants.py000066400000000000000000000257361511661753600316310ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict as OD from evergreen_config_generator.variants import Variant mobile_flags = ( ' -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY' ' -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY' ' -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER' ' -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY' ) def days(n: int) -> int: "Calculate the number of minutes in the given number of days" return n * 24 * 60 all_variants = [ Variant( 'abi-compliance-check', 'ABI Compliance Check', ['ubuntu2204-small', 'ubuntu2204-medium', 'ubuntu2204-large'], ['abi-compliance-check'], ), Variant( 'smoke', 'Smoke Tests', 'ubuntu2204-small', [ 'make-docs', 'kms-divergence-check', 'release-compile', 'debug-compile-no-counters', 'compile-tracing', 'link-with-cmake', 'link-with-cmake-ssl', 'link-with-cmake-snappy', 'verify-headers', OD([('name', 'link-with-cmake-mac'), ('distros', ['macos-14-arm64'])]), OD([('name', 'link-with-cmake-windows'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', 'link-with-cmake-windows-ssl'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', 'link-with-cmake-windows-snappy'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', 'link-with-cmake-mingw'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', 'link-with-pkg-config'), ('distros', ['ubuntu2204-large'])]), OD([('name', 'link-with-pkg-config-mac'), ('distros', ['macos-14-arm64'])]), 'link-with-pkg-config-ssl', 'link-with-bson', OD([('name', 'link-with-bson-windows'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', 'link-with-bson-mac'), ('distros', ['macos-14-arm64'])]), OD([('name', 'link-with-bson-mingw'), ('distros', ['windows-vsCurrent-large'])]), 'check-headers', 'debug-compile-with-warnings', 'install-libmongoc-after-libbson', ], { # Disable the MongoDB legacy shell download, which is not available in 5.0 for u22 'SKIP_LEGACY_SHELL': '1' }, tags=['pr-merge-gate'], ), Variant( 'clang12-i686', 'Clang 12 (i686) (Ubuntu 22.04)', 'ubuntu2204-large', [ 'release-compile', 'debug-compile-nosasl-nossl', '.debug-compile !.sspi .nossl .nosasl', '.latest .nossl .nosasl', ], {'CC': 'clang-12', 'MARCH': 'i686'}, ), Variant( 'gcc82rhel', 'GCC 8.2 (RHEL 8.0)', 'rhel80-test', [ '.hardened', '.compression !.snappy !.zstd', 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-nosasl-openssl', 'debug-compile-sasl-openssl', '.authentication-tests .openssl', '.latest .nossl', ], {'CC': 'gcc'}, ), Variant( 'gcc102', 'GCC 10.2 (Debian 11.0)', 'debian11-latest-large', ['release-compile', 'debug-compile-nosasl-nossl', '.latest .nossl'], {'CC': 'gcc'}, ), Variant( 'gcc11-i686', 'GCC 11 (i686) (Ubuntu 22.04)', 'ubuntu2204-large', ['release-compile', 'debug-compile-nosasl-nossl', '.latest .nossl .nosasl'], {'CC': 'gcc', 'MARCH': 'i686'}, ), Variant( 'gcc13', 'GCC 13 (Ubuntu 24.04)', 'ubuntu2404-large', [ '.compression !.zstd', 'debug-compile-nosrv', 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-sasl-openssl', 'debug-compile-nosasl-openssl', '.authentication-tests .openssl', '.authentication-tests .asan', '.test-coverage', '.latest .nossl', 'retry-true-latest-server', 'test-dns-openssl', 'test-dns-auth-openssl', 'test-dns-loadbalanced-openssl', ], {'CC': 'gcc'}, ), Variant( 'darwin', '*Darwin, macOS (Apple LLVM)', 'macos-14-arm64', [ '.compression !.snappy', 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-nosrv', 'debug-compile-sasl-darwinssl', 'debug-compile-nosasl-nossl', '.authentication-tests .darwinssl', '.latest .nossl', 'test-dns-darwinssl', 'test-dns-auth-darwinssl', 'debug-compile-lto', 'debug-compile-lto-thin', 'debug-compile-aws', 'test-aws-openssl-regular-latest', ], {'CC': 'clang'}, ), Variant( 'darwin-intel', '*Darwin, Intel macOS (Apple LLVM)', 'macos-14', [ 'debug-compile-aws', 'debug-compile-rdtscp', 'test-aws-openssl-regular-4.4', ], {'CC': 'clang'}, ), Variant( 'windows-2017-32', 'Windows (i686) (VS 2017)', 'windows-vsCurrent-large', ['debug-compile-nosasl-nossl', '.latest .nossl .nosasl'], {'CC': 'Visual Studio 15 2017'}, ), Variant( 'windows-2017', 'Windows (VS 2017)', 'windows-vsCurrent-large', [ 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-nosasl-openssl', 'debug-compile-sspi-winssl', 'debug-compile-nosrv', '.latest .nossl', '.nosasl .latest .nossl', '.compression !.snappy !.zstd !.latest', 'test-dns-winssl', 'test-dns-auth-winssl', 'debug-compile-aws', 'test-aws-openssl-regular-4.4', 'test-aws-openssl-regular-latest', # Authentication tests with OpenSSL on Windows are only run on the vs2017 variant. # Older vs variants fail to verify certificates against Atlas tests. '.authentication-tests .openssl !.sasl', '.authentication-tests .winssl', ], {'CC': 'Visual Studio 15 2017 Win64'}, ), Variant( 'windows-2022', 'Windows (VS 2022)', 'windows-vsCurrent-large', [ 'debug-compile-sspi-winssl', '.authentication-tests .winssl', ], {'CC': 'Visual Studio 17 2022 Win64'}, ), Variant( 'mingw-windows2016', 'MinGW-W64 (Windows Server 2016)', 'windows-vsCurrent-large', ['debug-compile-nosasl-nossl', '.latest .nossl .nosasl .server'], {'CC': 'gcc'}, ), Variant( 'rhel8-power', 'Power (ppc64le) (RHEL 8)', 'rhel8-power-large', [ 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-sasl-openssl', '.latest .nossl', 'test-dns-openssl', ], {'CC': 'gcc'}, patchable=False, batchtime=days(1), ), Variant( 'arm-ubuntu2204', '*ARM (aarch64) (Ubuntu 22.04)', 'ubuntu2204-arm64-large', [ '.compression !.snappy !.zstd', 'release-compile', 'debug-compile-nosasl-nossl', 'debug-compile-nosasl-openssl', 'debug-compile-sasl-openssl', '.authentication-tests .openssl', '.latest .nossl', 'test-dns-openssl', ], {'CC': 'gcc'}, batchtime=days(1), ), Variant( 'zseries-rhel8', '*zSeries', 'rhel8-zseries-large', [ 'release-compile', # '.compression', --> TODO: waiting on ticket CDRIVER-3258 'debug-compile-nosasl-nossl', 'debug-compile-nosasl-openssl', 'debug-compile-sasl-openssl', '.authentication-tests .openssl', '.latest .nossl', ], {'CC': 'gcc'}, patchable=False, batchtime=days(1), ), # Run AWS tests for MongoDB 4.4 and 5.0 on Ubuntu 20.04. AWS setup scripts # expect Ubuntu 20.04+. MongoDB 4.4 and 5.0 are not available on 22.04. Variant( 'aws-ubuntu2004', 'AWS Tests (Ubuntu 20.04)', 'ubuntu2004-small', [ 'debug-compile-aws', '.test-aws .4.4', '.test-aws .5.0', ], {'CC': 'clang'}, ), Variant( 'aws-ubuntu2204', 'AWS Tests (Ubuntu 22.04)', 'ubuntu2004-small', [ 'debug-compile-aws', '.test-aws .6.0', '.test-aws .7.0', '.test-aws .8.0', '.test-aws .latest', ], {'CC': 'clang'}, ), Variant( 'ocsp', 'OCSP tests', 'ubuntu2204-small', [ OD([('name', 'debug-compile-nosasl-openssl')]), OD([('name', 'debug-compile-nosasl-darwinssl'), ('distros', ['macos-14-arm64'])]), OD([('name', 'debug-compile-nosasl-winssl'), ('distros', ['windows-vsCurrent-large'])]), OD([('name', '.ocsp-openssl')]), OD([('name', '.ocsp-darwinssl'), ('distros', ['macos-14-arm64'])]), OD([('name', '.ocsp-winssl'), ('distros', ['windows-vsCurrent-large'])]), ], {}, batchtime=days(7), display_tasks=[ { 'name': 'ocsp-openssl', 'execution_tasks': ['.ocsp-openssl'], }, { 'name': 'ocsp-darwinssl', 'execution_tasks': ['.ocsp-darwinssl'], }, { 'name': 'ocsp-winssl', 'execution_tasks': ['.ocsp-winssl'], }, ], ), Variant( 'packaging', 'Linux Distro Packaging', 'debian12-latest-small', [ 'debian-package-build', OD([('name', 'rpm-package-build'), ('distros', ['rhel90-arm64-small'])]), ], {}, tags=['pr-merge-gate'], ), Variant( 'versioned-api', 'Versioned API Tests', 'rhel8-latest-large', [ 'debug-compile-nosasl-openssl', 'debug-compile-nosasl-nossl', '.versioned-api .5.0', '.versioned-api .6.0', '.versioned-api .7.0', '.versioned-api .8.0', ], {}, ), ] mongo-c-driver-2.2.1/.evergreen/legacy_config_generator/generate-evergreen-config.py000066400000000000000000000035341511661753600306520ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate C Driver's config.yml for Evergreen testing. We find that generating configuration from Python data structures is more legible than Evergreen's matrix syntax or a handwritten file. Requires the evergreen_config_generator package. """ from collections import OrderedDict as OD from os.path import dirname, normpath from os.path import join as joinpath from evergreen_config_generator import generate from evergreen_config_lib.functions import all_functions from evergreen_config_lib.taskgroups import all_task_groups from evergreen_config_lib.tasks import all_tasks from evergreen_config_lib.testazurekms import testazurekms_generate from evergreen_config_lib.testgcpkms import testgcpkms_generate from evergreen_config_lib.variants import all_variants task_groups = list(all_task_groups) testazurekms_generate(all_tasks, all_variants, task_groups) testgcpkms_generate(all_tasks, all_variants, task_groups) config = OD( [ ('functions', all_functions), ('tasks', all_tasks), ('task_groups', task_groups), ('buildvariants', all_variants), ] ) this_dir = dirname(__file__) generated_configs_dir = normpath(joinpath(this_dir, '../generated_configs')) generate(config, joinpath(generated_configs_dir, 'legacy-config.yml')) mongo-c-driver-2.2.1/.evergreen/ocsp/000077500000000000000000000000001511661753600173635ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/ocsp/README.md000066400000000000000000000031461511661753600206460ustar00rootroot00000000000000# Generating Test Certificates The test certificates here were generating using a fork of the server team's [`mkcert.py`](https://github.com/mongodb/mongo/blob/master/jstests/ssl/x509/mkcert.py) tool. In order to generate a fresh set of certificates, clone this branch of a fork of the [`mongo` repository](https://github.com/vincentkam/mongo/tree/mkcert-ecdsa) and run the following command from the root of the `mongo` repository: `python3 jstests/ssl/x509/mkcert.py --config ../drivers-evergreen-tools/.evergreen/ocsp/certs.yml` Passing a certificate ID as the final parameter will limit certificate generation to that certificate and all its leaves. Note: if regenerating ECDSA leaf certificates, ``ecsda/ca.pem`` will need to be temporarily renamed back to ``ecdsa-ca-ocsp.pem``. The ECDSA certificates will be output into the folder specified by the `global.output_path` option in the `certs.yml` file, which defaults to `ecsda` directory contained in this directory. The RSA certificate definitions override this value on a per certificate basis and are output into the `rsa` directory. The default configuration also assumes that the `mongo` repository and the `driver-evergreen-tools` repository have the same parent directory. After generating the RSA root certificate, one must manually split the `rsa/ca.pem` file, which contains both the private key and the public certificate, into two files. `rsa/ca.crt` should contain the public certificate, and `ras/ca.key` should contain the private certificate. When generating ECDSA certificates, one must normalize the ECDSA certificate names by running `ecdsa/rename.sh`. mongo-c-driver-2.2.1/.evergreen/ocsp/README.txt000066400000000000000000000000641511661753600210610ustar00rootroot00000000000000Copied from drivers-evergreen-tools/.evergreen/ocsp.mongo-c-driver-2.2.1/.evergreen/ocsp/certs.yml000066400000000000000000000060231511661753600212270ustar00rootroot00000000000000 global: # All subject names will have these elements automatically, # unless `explicit_subject: true` is specified. output_path: '../drivers-evergreen-tools/.evergreen/ocsp/ecdsa/' # See README.md if customizing this path Subject: C: 'US' ST: 'New York' L: 'New York City' O: 'MongoDB' OU: 'Kernel' certs: ### # OCSP Tree ### - name: 'ca.pem' description: >- Primary Root Certificate Authority Most Certificates are issued by this CA. Subject: {CN: 'Kernel Test CA'} Issuer: self include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: critical: true CA: true - name: 'server.pem' description: >- Certificate with OCSP for the mongodb server. Subject: CN: 'localhost' C: US ST: NY L: OCSP-1 Issuer: 'ca.pem' include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} subjectAltName: DNS: localhost IP: 127.0.0.1 authorityInfoAccess: 'OCSP;URI:http://localhost:9001/power/level,OCSP;URI:http://localhost:8100/status' subjectKeyIdentifier: hash keyUsage: [digitalSignature, keyEncipherment] extendedKeyUsage: [serverAuth, clientAuth] - name: 'server-mustStaple.pem' description: >- Certficiate with Must Staple OCSP for the mongodb server. Subject: CN: 'localhost' C: US ST: NY L: OCSP-1 Issuer: 'ca.pem' include_header: false output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} subjectAltName: DNS: localhost IP: 127.0.0.1 authorityInfoAccess: 'OCSP;URI:http://localhost:9001/power/level,OCSP;URI:http://localhost:8100/status' mustStaple: true subjectKeyIdentifier: hash keyUsage: [digitalSignature, keyEncipherment] extendedKeyUsage: [serverAuth, clientAuth] - name: 'ocsp-responder.crt' description: Certificate and key for the OCSP responder Subject: CN: 'localhost' C: US ST: NY L: OCSP-3 Issuer: 'ca.pem' include_header: false keyfile: 'ocsp-responder.key' output_path: '../drivers-evergreen-tools/.evergreen/ocsp/rsa' extensions: basicConstraints: {CA: false} keyUsage: [nonRepudiation, digitalSignature, keyEncipherment] extendedKeyUsage: [OCSPSigning] #noCheck: true ### # ECDSA tree ### # These are all special cases handled internally by mkcert.py # Do NOT change the names - name: 'ecdsa-ca-ocsp.pem' description: Root of ECDSA tree for OCSP testing Issuer: self tags: [ecdsa] - name: 'ecdsa-server-ocsp.pem' description: ECDSA server certificate w/OCSP Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp] - name: 'ecdsa-server-ocsp-mustStaple.pem' description: ECDSA server certificate w/OCSP + must-staple Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp, must-staple] - name: 'ecdsa-ocsp-responder.crt' description: ECDSA certificate and key for OCSP responder Issuer: 'ecdsa-ca-ocsp.pem' tags: [ecdsa, ocsp, responder ] mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/000077500000000000000000000000001511661753600204425ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/ca.crt000066400000000000000000000013451511661753600215420ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIB9jCCAZygAwIBAgIERIhZ3jAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NjU5WhcNNDAwMzEyMTk0NjU5WjB6MQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UE AwwUS2VybmVsIFRlc3QgRVNDREEgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AAT1rsrbhlZEQAubaPkS23tOfSEdWNd+u7N5kV4nxKQDNxPcScnSGrb41tBEINdG LQ/SopWZx9O8UJSrh8sqaV1AoxAwDjAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMC A0gAMEUCIDEvg1FnzNQNnLDxyOthbOqpX58A0YfLjgGb8xAvvdr4AiEAtvF2jMt6 /o4HVXXKdohjBJbETbr7XILEvnZ4Zt7QNl8= -----END CERTIFICATE----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/ca.key000066400000000000000000000003611511661753600215370ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMzE6ziHkSWt+sE2O RMFZ9wqjOg88cWTuMMYrKXXL1UWhRANCAAT1rsrbhlZEQAubaPkS23tOfSEdWNd+ u7N5kV4nxKQDNxPcScnSGrb41tBEINdGLQ/SopWZx9O8UJSrh8sqaV1A -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/ca.pem000066400000000000000000000017261511661753600215360ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIB9jCCAZygAwIBAgIERIhZ3jAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NjU5WhcNNDAwMzEyMTk0NjU5WjB6MQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UE AwwUS2VybmVsIFRlc3QgRVNDREEgQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC AAT1rsrbhlZEQAubaPkS23tOfSEdWNd+u7N5kV4nxKQDNxPcScnSGrb41tBEINdG LQ/SopWZx9O8UJSrh8sqaV1AoxAwDjAMBgNVHRMEBTADAQH/MAoGCCqGSM49BAMC A0gAMEUCIDEvg1FnzNQNnLDxyOthbOqpX58A0YfLjgGb8xAvvdr4AiEAtvF2jMt6 /o4HVXXKdohjBJbETbr7XILEvnZ4Zt7QNl8= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMzE6ziHkSWt+sE2O RMFZ9wqjOg88cWTuMMYrKXXL1UWhRANCAAT1rsrbhlZEQAubaPkS23tOfSEdWNd+ u7N5kV4nxKQDNxPcScnSGrb41tBEINdGLQ/SopWZx9O8UJSrh8sqaV1A -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/mock-delegate-revoked.sh000077500000000000000000000002771511661753600251450ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/mock-delegate-valid.sh000077500000000000000000000002531511661753600245770ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/mock-revoked.sh000077500000000000000000000003121511661753600233630ustar00rootroot00000000000000#!/usr/bin/env sh # Use the CA as the OCSP responder python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/mock-valid.sh000077500000000000000000000002231511661753600230240ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/ocsp-responder.crt000066400000000000000000000015471511661753600241260ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICVTCCAfygAwIBAgIEfpRhITAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzE3MTk0NzAwWhcNNDAwMzEyMTk0NzAwWjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERca9Bv0PDLkCULyx axwx8nyPqonFF88MQiZpY7wK7atBfWkpZ9B/ukq5p+xVDXxS49huEIQUWOZ5xosF frma96N+MHwwCQYDVR0TBAIwADAaBgNVHREEEzARgglsb2NhbGhvc3SHBH8AAAEw HQYDVR0OBBYEFNQUc8MKrQDR4wAFZZ2o9PNLAiUHMAsGA1UdDwQEAwIF4DAnBgNV HSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMJMAoGCCqGSM49BAMC A0cAMEQCIBQs56OofXC3Io6DjP4ccgpkX8cLHpMRb3jfZ6MxulniAiBVLoXo8K23 YmpwoWKLFBKBdtGU+WDdD01Mb8X4iQ1gYg== -----END CERTIFICATE----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/ocsp-responder.key000066400000000000000000000003611511661753600241170ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgxxFxGTsPETczP0SW 69vnqYXZIgk+qG61j6JKElHa6duhRANCAARFxr0G/Q8MuQJQvLFrHDHyfI+qicUX zwxCJmljvArtq0F9aSln0H+6Srmn7FUNfFLj2G4QhBRY5nnGiwV+uZr3 -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/rename.sh000077500000000000000000000010271511661753600222500ustar00rootroot00000000000000#!/usr/bin/env bash [ ! -f ecdsa-ca-ocsp.pem ] || mv ecdsa-ca-ocsp.pem ca.pem [ ! -f ecdsa-ca-ocsp.crt ] || mv ecdsa-ca-ocsp.crt ca.crt [ ! -f ecdsa-ca-ocsp.key ] || mv ecdsa-ca-ocsp.key ca.key [ ! -f ecdsa-server-ocsp.pem ] || mv ecdsa-server-ocsp.pem server.pem [ ! -f ecdsa-server-ocsp-mustStaple.pem ] || mv ecdsa-server-ocsp-mustStaple.pem server-mustStaple.pem [ ! -f ecdsa-ocsp-responder.crt ] || mv ecdsa-ocsp-responder.crt ocsp-responder.crt [ ! -f ecdsa-ocsp-responder.key ] || mv ecdsa-ocsp-responder.key ocsp-responder.key mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/server-mustStaple.pem000066400000000000000000000023661511661753600246210ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICyjCCAnCgAwIBAgIEA54uVTAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzI2MTU1NzU1WhcNNDAwMzIxMTU1NzU1WjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJjAN/Hd2R/RRBoAu YouPhTbS/y2DiD47YQaUu1TlnrvABcvIgkMKYfbeNIhBfu44KzF2sKsmKrG6T6rs NdJ3pqOB8TCB7jAJBgNVHRMEAjAAMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEfwAA ATAdBgNVHQ4EFgQUvHVMhH4zuedQN+9sQJ8LN7jvy3owCwYDVR0PBAQDAgWgMB0G A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBnBggrBgEFBQcBAQRbMFkwLQYI KwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAwMS9wb3dlci9sZXZlbDAoBggr BgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAwL3N0YXR1czARBggrBgEFBQcB GAQFMAMCAQUwCgYIKoZIzj0EAwIDSAAwRQIgDiL8zqWkCR5Rc/YoAgV81qryUMrK BQoP7fb1M0KKarECIQDPa5q1pFu+5UZ8gn7CP4/9xDcBiG6tQYK5N0FHAZXzEg== -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1IHezsqNUk0tfGOS E2RcM7R00ue1/E8/pBBUGSt7RW2hRANCAAQmMA38d3ZH9FEGgC5ii4+FNtL/LYOI PjthBpS7VOWeu8AFy8iCQwph9t40iEF+7jgrMXawqyYqsbpPquw10nem -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/ecdsa/server.pem000066400000000000000000000023321511661753600224530ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIICtzCCAl2gAwIBAgIEP6OYOTAKBggqhkjOPQQDAjB6MQswCQYDVQQGEwJVUzER MA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAOBgNV BAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEdMBsGA1UEAwwUS2VybmVsIFRl c3QgRVNDREEgQ0EwHhcNMjAwMzI2MTU1ODA2WhcNNDAwMzIxMTU1ODA2WjBsMQsw CQYDVQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3Jr IENpdHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEPMA0GA1UE AwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEK4FR+soHPeGhF5c+ bPBX9/+gm+RimTqlXQAkHQHopLETOVexyt0eAVJe/euPAdKx3JvQ2fx2YOaBZK2U D98UoKOB3jCB2zAJBgNVHRMEAjAAMBoGA1UdEQQTMBGCCWxvY2FsaG9zdIcEfwAA ATAdBgNVHQ4EFgQU2JCna5G/Yd+Hd9hkAoWXxSjQ7acwCwYDVR0PBAQDAgWgMB0G A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBnBggrBgEFBQcBAQRbMFkwLQYI KwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAwMS9wb3dlci9sZXZlbDAoBggr BgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAwL3N0YXR1czAKBggqhkjOPQQD AgNIADBFAiEA3F6MCGLS+gBDMl3+GTAVxYYuxLbhW92CQLwh/FbDozYCIHQzJ2G/ ht6PGW9nKueW0yDfppBVlxBmlKody9ugpcpO -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgp33qfUjflX1C7ROa e5F/RNyIhLE9hnxg4eFQQTqdxUqhRANCAAQrgVH6ygc94aEXlz5s8Ff3/6Cb5GKZ OqVdACQdAeiksRM5V7HK3R4BUl79648B0rHcm9DZ/HZg5oFkrZQP3xSg -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/mock_ocsp_responder.py000066400000000000000000000561471511661753600240100ustar00rootroot00000000000000# # This file has been modified in 2019 by MongoDB Inc. # # OCSPBuilder is derived from https://github.com/wbond/ocspbuilder # OCSPResponder is derived from https://github.com/threema-ch/ocspresponder # Copyright (c) 2015-2018 Will Bond # 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. # Copyright 2016 Threema GmbH # 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. from __future__ import absolute_import, division, print_function, unicode_literals import base64 import enum import inspect import logging import re import sys import textwrap from datetime import datetime, timedelta, timezone from asn1crypto import core, keys, ocsp, x509 from asn1crypto.ocsp import OCSPRequest, OCSPResponse from flask import Flask, Response, request from oscrypto import asymmetric __version__ = '0.10.2' __version_info__ = (0, 10, 2) logger = logging.getLogger(__name__) if sys.version_info < (3,): byte_cls = str else: byte_cls = bytes def _pretty_message(string, *params): """ Takes a multi-line string and does the following: - dedents - converts newlines with text before and after into a single line - strips leading and trailing whitespace :param string: The string to format :param *params: Params to interpolate into the string :return: The formatted string """ output = textwrap.dedent(string) # Unwrap lines, taking into account bulleted lists, ordered lists and # underlines consisting of = signs if output.find('\n') != -1: output = re.sub('(?<=\\S)\n(?=[^ \n\t\\d\\*\\-=])', ' ', output) if params: output = output % params output = output.strip() return output def _type_name(value): """ :param value: A value to get the object name of :return: A unicode string of the object name """ if inspect.isclass(value): cls = value else: cls = value.__class__ if cls.__module__ in set(['builtins', '__builtin__']): return cls.__name__ return '%s.%s' % (cls.__module__, cls.__name__) def _writer(func): """ Decorator for a custom writer, but a default reader """ name = func.__name__ return property(fget=lambda self: getattr(self, '_%s' % name), fset=func) class OCSPResponseBuilder(object): _response_status = None _certificate = None _certificate_status = None _revocation_date = None _certificate_issuer = None _hash_algo = None _key_hash_algo = None _nonce = None _this_update = None _next_update = None _response_data_extensions = None _single_response_extensions = None def __init__(self, response_status, certificate_status_list=[], revocation_date=None): """ Unless changed, responses will use SHA-256 for the signature, and will be valid from the moment created for one week. :param response_status: A unicode string of OCSP response type: - "successful" - when the response includes information about the certificate - "malformed_request" - when the request could not be understood - "internal_error" - when an internal error occured with the OCSP responder - "try_later" - when the OCSP responder is temporarily unavailable - "sign_required" - when the OCSP request must be signed - "unauthorized" - when the responder is not the correct responder for the certificate :param certificate_list: A list of tuples with certificate serial number and certificate status objects. certificate_status: A unicode string of the status of the certificate. Only required if the response_status is "successful". - "good" - when the certificate is in good standing - "revoked" - when the certificate is revoked without a reason code - "key_compromise" - when a private key is compromised - "ca_compromise" - when the CA issuing the certificate is compromised - "affiliation_changed" - when the certificate subject name changed - "superseded" - when the certificate was replaced with a new one - "cessation_of_operation" - when the certificate is no longer needed - "certificate_hold" - when the certificate is temporarily invalid - "remove_from_crl" - only delta CRLs - when temporary hold is removed - "privilege_withdrawn" - one of the usages for a certificate was removed - "unknown" - the responder doesn't know about the certificate being requested :param revocation_date: A datetime.datetime object of when the certificate was revoked, if the response_status is "successful" and the certificate status is not "good" or "unknown". """ self._response_status = response_status self._certificate_status_list = certificate_status_list self._revocation_date = revocation_date self._key_hash_algo = 'sha1' self._hash_algo = 'sha256' self._response_data_extensions = {} self._single_response_extensions = {} @_writer def nonce(self, value): """ The nonce that was provided during the request. """ if not isinstance(value, byte_cls): raise TypeError( _pretty_message( """ nonce must be a byte string, not %s """, _type_name(value), ) ) self._nonce = value @_writer def certificate_issuer(self, value): """ An asn1crypto.x509.Certificate object of the issuer of the certificate. This should only be set if the OCSP responder is not the issuer of the certificate, but instead a special certificate only for OCSP responses. """ if value is not None: is_oscrypto = isinstance(value, asymmetric.Certificate) if not is_oscrypto and not isinstance(value, x509.Certificate): raise TypeError( _pretty_message( """ certificate_issuer must be an instance of asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate, not %s """, _type_name(value), ) ) if is_oscrypto: value = value.asn1 self._certificate_issuer = value @_writer def next_update(self, value): """ A datetime.datetime object of when the response may next change. This should only be set if responses are cached. If responses are generated fresh on every request, this should not be set. """ if not isinstance(value, datetime): raise TypeError( _pretty_message( """ next_update must be an instance of datetime.datetime, not %s """, _type_name(value), ) ) self._next_update = value def build(self, responder_private_key=None, responder_certificate=None): """ Validates the request information, constructs the ASN.1 structure and signs it. The responder_private_key and responder_certificate parameters are onlystr required if the response_status is "successful". :param responder_private_key: An asn1crypto.keys.PrivateKeyInfo or oscrypto.asymmetric.PrivateKey object for the private key to sign the response with :param responder_certificate: An asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate object of the certificate associated with the private key :return: An asn1crypto.ocsp.OCSPResponse object of the response """ if self._response_status != 'successful': return ocsp.OCSPResponse({'response_status': self._response_status}) is_oscrypto = isinstance(responder_private_key, asymmetric.PrivateKey) if not isinstance(responder_private_key, keys.PrivateKeyInfo) and not is_oscrypto: raise TypeError( _pretty_message( """ responder_private_key must be an instance ofthe c asn1crypto.keys.PrivateKeyInfo or oscrypto.asymmetric.PrivateKey, not %s """, _type_name(responder_private_key), ) ) cert_is_oscrypto = isinstance(responder_certificate, asymmetric.Certificate) if not isinstance(responder_certificate, x509.Certificate) and not cert_is_oscrypto: raise TypeError( _pretty_message( """ responder_certificate must be an instance of asn1crypto.x509.Certificate or oscrypto.asymmetric.Certificate, not %s """, _type_name(responder_certificate), ) ) if cert_is_oscrypto: responder_certificate = responder_certificate.asn1 if self._certificate_status_list is None: raise ValueError( _pretty_message( """ certificate_status_list must be set if the response_status is "successful" """ ) ) def _make_extension(name, value): return {'extn_id': name, 'critical': False, 'extn_value': value} responses = [] for serial, status in self._certificate_status_list: response_data_extensions = [] single_response_extensions = [] for name, value in self._response_data_extensions.items(): response_data_extensions.append(_make_extension(name, value)) if self._nonce: response_data_extensions.append(_make_extension('nonce', self._nonce)) if not response_data_extensions: response_data_extensions = None for name, value in self._single_response_extensions.items(): single_response_extensions.append(_make_extension(name, value)) if self._certificate_issuer: single_response_extensions.append( _make_extension( 'certificate_issuer', [x509.GeneralName(name='directory_name', value=self._certificate_issuer.subject)], ) ) if not single_response_extensions: single_response_extensions = None responder_key_hash = getattr(responder_certificate.public_key, self._key_hash_algo) if status == 'good': cert_status = ocsp.CertStatus(name='good', value=core.Null()) elif status == 'unknown': cert_status = ocsp.CertStatus(name='unknown', value=core.Null()) else: reason = status if status != 'revoked' else 'unspecified' cert_status = ocsp.CertStatus( name='revoked', value={ 'revocation_time': self._revocation_date, 'revocation_reason': reason, }, ) issuer = self._certificate_issuer if self._certificate_issuer else responder_certificate produced_at = datetime.now(timezone.utc).replace(microsecond=0) if self._this_update is None: self._this_update = produced_at if self._next_update is None: self._next_update = (self._this_update + timedelta(days=7)).replace(microsecond=0) response = { 'cert_id': { 'hash_algorithm': {'algorithm': self._key_hash_algo}, 'issuer_name_hash': getattr(issuer.subject, self._key_hash_algo), 'issuer_key_hash': getattr(issuer.public_key, self._key_hash_algo), 'serial_number': serial, }, 'cert_status': cert_status, 'this_update': self._this_update, 'next_update': self._next_update, 'single_extensions': single_response_extensions, } responses.append(response) response_data = ocsp.ResponseData( { 'responder_id': ocsp.ResponderId(name='by_key', value=responder_key_hash), 'produced_at': produced_at, 'responses': responses, 'response_extensions': response_data_extensions, } ) signature_algo = responder_private_key.algorithm if signature_algo == 'ec': signature_algo = 'ecdsa' signature_algorithm_id = '%s_%s' % (self._hash_algo, signature_algo) if responder_private_key.algorithm == 'rsa': sign_func = asymmetric.rsa_pkcs1v15_sign elif responder_private_key.algorithm == 'dsa': sign_func = asymmetric.dsa_sign elif responder_private_key.algorithm == 'ec': sign_func = asymmetric.ecdsa_sign if not is_oscrypto: responder_private_key = asymmetric.load_private_key(responder_private_key) signature_bytes = sign_func(responder_private_key, response_data.dump(), self._hash_algo) certs = None if ( self._certificate_issuer and getattr(self._certificate_issuer.public_key, self._key_hash_algo) != responder_key_hash ): certs = [responder_certificate] return ocsp.OCSPResponse( { 'response_status': self._response_status, 'response_bytes': { 'response_type': 'basic_ocsp_response', 'response': { 'tbs_response_data': response_data, 'signature_algorithm': {'algorithm': signature_algorithm_id}, 'signature': signature_bytes, 'certs': certs, }, }, } ) # Enums class ResponseStatus(enum.Enum): successful = 'successful' malformed_request = 'malformed_request' internal_error = 'internal_error' try_later = 'try_later' sign_required = 'sign_required' unauthorized = 'unauthorized' class CertificateStatus(enum.Enum): good = 'good' revoked = 'revoked' key_compromise = 'key_compromise' ca_compromise = 'ca_compromise' affiliation_changed = 'affiliation_changed' superseded = 'superseded' cessation_of_operation = 'cessation_of_operation' certificate_hold = 'certificate_hold' remove_from_crl = 'remove_from_crl' privilege_withdrawn = 'privilege_withdrawn' unknown = 'unknown' # API endpoints FAULT_REVOKED = 'revoked' FAULT_UNKNOWN = 'unknown' app = Flask(__name__) class OCSPResponder: def __init__(self, issuer_cert: str, responder_cert: str, responder_key: str, fault: str, next_update_seconds: int): """ Create a new OCSPResponder instance. :param issuer_cert: Path to the issuer certificate. :param responder_cert: Path to the certificate of the OCSP responder with the `OCSP Signing` extension. :param responder_key: Path to the private key belonging to the responder cert. :param validate_func: A function that - given a certificate serial - will return the appropriate :class:`CertificateStatus` and - depending on the status - a revocation datetime. :param cert_retrieve_func: A function that - given a certificate serial - will return the corresponding certificate as a string. :param next_update_seconds: The ``nextUpdate`` value that will be written into the response. Default: 9 hours. """ # Certs and keys self._issuer_cert = asymmetric.load_certificate(issuer_cert) self._responder_cert = asymmetric.load_certificate(responder_cert) self._responder_key = asymmetric.load_private_key(responder_key) # Next update self._next_update_seconds = next_update_seconds self._fault = fault def _fail(self, status: ResponseStatus) -> OCSPResponse: builder = OCSPResponseBuilder(response_status=status.value) return builder.build() def parse_ocsp_request(self, request_der: bytes) -> OCSPRequest: """ Parse the request bytes, return an ``OCSPRequest`` instance. """ return OCSPRequest.load(request_der) def validate(self): time = datetime(2018, 1, 1, 1, 00, 00, 00, timezone.utc) if self._fault == FAULT_REVOKED: return (CertificateStatus.revoked, time) elif self._fault == FAULT_UNKNOWN: return (CertificateStatus.unknown, None) elif self._fault is not None: raise NotImplementedError('Fault type could not be found') return (CertificateStatus.good, time) def _build_ocsp_response(self, ocsp_request: OCSPRequest) -> OCSPResponse: """ Create and return an OCSP response from an OCSP request. """ # Get the certificate serial tbs_request = ocsp_request['tbs_request'] request_list = tbs_request['request_list'] if len(request_list) < 1: logger.warning('Received OCSP request with no requests') raise NotImplementedError('Empty requests not supported') single_request = request_list[0] # TODO: Support more than one request req_cert = single_request['req_cert'] serial = req_cert['serial_number'].native # Check certificate status try: certificate_status, revocation_date = self.validate() except Exception as e: logger.exception('Could not determine certificate status: %s', e) return self._fail(ResponseStatus.internal_error) certificate_status_list = [(serial, certificate_status.value)] # Build the response builder = OCSPResponseBuilder( **{ 'response_status': ResponseStatus.successful.value, 'certificate_status_list': certificate_status_list, 'revocation_date': revocation_date, } ) # Parse extensions for extension in tbs_request['request_extensions']: extn_id = extension['extn_id'].native critical = extension['critical'].native value = extension['extn_value'].parsed # This variable tracks whether any unknown extensions were encountered unknown = False # Handle nonce extension if extn_id == 'nonce': builder.nonce = value.native # That's all we know else: unknown = True # If an unknown critical extension is encountered (which should not # usually happen, according to RFC 6960 4.1.2), we should throw our # hands up in despair and run. if unknown is True and critical is True: logger.warning('Could not parse unknown critical extension: %r', dict(extension.native)) return self._fail(ResponseStatus.internal_error) # If it's an unknown non-critical extension, we can safely ignore it. elif unknown is True: logger.info('Ignored unknown non-critical extension: %r', dict(extension.native)) # Set certificate issuer builder.certificate_issuer = self._issuer_cert # Set next update date now = datetime.now(timezone.utc) builder.next_update = (now + timedelta(seconds=self._next_update_seconds)).replace(microsecond=0) return builder.build(self._responder_key, self._responder_cert) def build_http_response(self, request_der: bytes) -> Response: global app response_der = self._build_ocsp_response(request_der).dump() resp = app.make_response((response_der, 200)) resp.headers['content_type'] = 'application/ocsp-response' return resp responder = None def init_responder(issuer_cert: str, responder_cert: str, responder_key: str, fault: str, next_update_seconds: int): global responder responder = OCSPResponder( issuer_cert=issuer_cert, responder_cert=responder_cert, responder_key=responder_key, fault=fault, next_update_seconds=next_update_seconds, ) def init(port=8080, debug=False): logger.info('Launching %sserver on port %d', 'debug' if debug else '', port) app.run(port=port, debug=debug) @app.route('/', methods=['GET']) def _handle_root(): return 'ocsp-responder' @app.route('/status/', defaults={'u_path': ''}, methods=['GET']) @app.route('/status/', methods=['GET']) def _handle_get(u_path): global responder """ An OCSP GET request contains the DER-in-base64 encoded OCSP request in the HTTP request URL. """ if 'Host' not in request.headers: raise ValueError("Required 'Host' header not present") der = base64.b64decode(u_path) ocsp_request = responder.parse_ocsp_request(der) return responder.build_http_response(ocsp_request) @app.route('/status', methods=['POST']) def _handle_post(): global responder """ An OCSP POST request contains the DER encoded OCSP request in the HTTP request body. """ if 'Host' not in request.headers: raise ValueError("Required 'Host' header not present") ocsp_request = responder.parse_ocsp_request(request.data) return responder.build_http_response(ocsp_request) mongo-c-driver-2.2.1/.evergreen/ocsp/ocsp_mock.py000077500000000000000000000035611511661753600217220ustar00rootroot00000000000000#!/usr/bin/env python3 """ Python script to interface as a mock OCSP responder. """ import argparse import logging import os import sys sys.path.append(os.path.join(os.getcwd(), 'src', 'third_party', 'mock_ocsp_responder')) import mock_ocsp_responder def main(): """Main entry point""" parser = argparse.ArgumentParser(description='MongoDB Mock OCSP Responder.') parser.add_argument('-p', '--port', type=int, default=8080, help='Port to listen on') parser.add_argument('--ca_file', type=str, required=True, help='CA file for OCSP responder') parser.add_argument('-v', '--verbose', action='count', help='Enable verbose tracing') parser.add_argument('--ocsp_responder_cert', type=str, required=True, help='OCSP Responder Certificate') parser.add_argument('--ocsp_responder_key', type=str, required=True, help='OCSP Responder Keyfile') parser.add_argument( '--fault', choices=[mock_ocsp_responder.FAULT_REVOKED, mock_ocsp_responder.FAULT_UNKNOWN, None], default=None, type=str, help='Specify a specific fault to test', ) parser.add_argument( '--next_update_seconds', type=int, default=32400, help='Specify how long the OCSP response should be valid for' ) args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) print('Initializing OCSP Responder') mock_ocsp_responder.init_responder( issuer_cert=args.ca_file, responder_cert=args.ocsp_responder_cert, responder_key=args.ocsp_responder_key, fault=args.fault, next_update_seconds=args.next_update_seconds, ) if args.verbose: mock_ocsp_responder.init(args.port, debug=True) else: mock_ocsp_responder.init(args.port) print('Mock OCSP Responder is running on port %s' % (str(args.port))) if __name__ == '__main__': main() mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/000077500000000000000000000000001511661753600201505ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/ca.crt000066400000000000000000000023611511661753600212470ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDeTCCAmGgAwIBAgIEZLtwgzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjAxMzExWhcNNDAwMjA4MjAxMzExWjB0MQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp dHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwO S2VybmVsIFRlc3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0 D1mnIrh7RRrCUEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8Ws yuaRUkjFhh9M69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucC fcAZ6MvcC7n6qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL7 4cIxNsS0iHpYI3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwH rGmeGQwiSlw48wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX +K6p5v3RVHn89VaWiTorAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAAd1jj1GECUEJMH00IX3VFgb2RpJ4Qi8TKAZgMMHdE7Cyv4M p4w/zvQC1F6i54n+TWucq3I+c33lEj63ybFdJO5HOWoGzC/f5qO7z0gYdP2Ltdxg My2uVZNQS+B8hF9MhGUeFnOpzAbKW2If3KN1fn/m2NDYGEK/Z2t7ZkpOcpEW5Lib vX+BBG/s4DeyhRXy+grs0ASU/z8VOhZYSJpgdbvXsY4RXXloTDcWIlNqra5K6+3T nVEkBDm0Qw97Y6FsqBVxk4kgWC6xNxQ4Sp+Sg4wthMQ70iFGlMin0kYRo7kAIUF9 M+v2vMwTFWkcl0BT5LobE39kWVbQKEVPH7nkItE= -----END CERTIFICATE----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/ca.key000066400000000000000000000032501511661753600212450ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0D1mnIrh7RRrC UEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8WsyuaRUkjFhh9M 69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucCfcAZ6MvcC7n6 qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL74cIxNsS0iHpY I3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwHrGmeGQwiSlw4 8wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX+K6p5v3RVHn8 9VaWiTorAgMBAAECggEBAJ7umazMGdg80/TGF9Q0a2JutplDj5zyXgUJUSNkAMWB /V+Qi8pZG1/J6CzfVpche3McmU2WOsOWslQcLUnY6W7NLFW1kGXGof5e+HgDASik jxB6FfJrvVagpR+/wZxAjQmG46Q69o4hD6SxKcMpz9BTnPXxG6n1B2EeFd+lPb2r zf/C4uXBczWn5rFXkj0DZGq81ZXewcnUNnxjQnccVCuYW+hqYxznSxqWTCD6hsvg sGceqv0Ppp6TqMSECCIIJ+kVlbiAC2i6mnoertheFVrNUdwDb8nRn6fs8T+F0ShW PdxIfSvAaBKqvseJqqueVpuwVcdSl+moJYlCdMb4cUECgYEA30AIHvMQq/s33ipV 62xOKXcEZ7tKaJrAbJvG4cx934wNiQ0tLwRNlonGbuTjsUaPRvagVeJND/UPIsfH ZwoY1Uw25fZNaveoQtU8LQBAG53R5yaMiUH48JWVvKRdfG09zr6EFCM/k2loHS1W /CiDlaIl59B8REnihyn0wvkiaIsCgYEAznlZRhlruk+n2sWklierav4M8GEK22+/ A/UP1eUnlcHgSaFZoM0sukSrisZnj6zu/BAfFEVN5czra3ARrLClLQteFREr2BMF 9XymrjNG99QkBAall7BGpfkDW/D2DFZa4G5R6AMG+pYZHCU84U4QT5ZKyfdhTUbQ uTYx2F31COECgYAIUm+7D56AerXjbzqSsw/a1dfxMfcdHR+tLMVmJ2RNz/+1KyuT BBsMUIh4G8otEo9GuuzRJsVuodj1l/Lj8WlpkhS9z8elBCRekWpT1x2Mqf5oGnTE rRPli/3v8USW3c+fBFUSFxpImXZLGCSU88Gr80ZsdMYdGY/7L+Iy3myc7wKBgQC1 uHeqCpWV1KWXFnxU63UjJZWdussjdqZXhUf6qUS9uXT9WNTZgbrr9aRE73oWKc3s awPvg0+cAU7xsCDeLFoz2t1jDUnZUmTcOmk4yEidtkg8gt0bNDn5ucALG3hyQ06Y WIAeAwwRYCmZa+y5H0ubwFryhpdMvBbX66rTE16mAQKBgC5PJd9zLEzyLj/jUfZ0 xOwXubu9GejOuCiVwKMTn73nvdi57zFBOrDxSl9yVCRhve61L5fcJixRDiwx8qtd VGclRMxbVPKVfKpAyKjpsmZXk3IPHjXjJb3fYLXAnzRHk6v+yjVn4fy2Z93pW/cF wBgQNqXLNTGrBzrFi469oc1s -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/ca.pem000066400000000000000000000056311511661753600212430ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDeTCCAmGgAwIBAgIEZLtwgzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjAxMzExWhcNNDAwMjA4MjAxMzExWjB0MQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp dHkxEDAOBgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwO S2VybmVsIFRlc3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0 D1mnIrh7RRrCUEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8Ws yuaRUkjFhh9M69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucC fcAZ6MvcC7n6qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL7 4cIxNsS0iHpYI3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwH rGmeGQwiSlw48wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX +K6p5v3RVHn89VaWiTorAgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI hvcNAQELBQADggEBAAd1jj1GECUEJMH00IX3VFgb2RpJ4Qi8TKAZgMMHdE7Cyv4M p4w/zvQC1F6i54n+TWucq3I+c33lEj63ybFdJO5HOWoGzC/f5qO7z0gYdP2Ltdxg My2uVZNQS+B8hF9MhGUeFnOpzAbKW2If3KN1fn/m2NDYGEK/Z2t7ZkpOcpEW5Lib vX+BBG/s4DeyhRXy+grs0ASU/z8VOhZYSJpgdbvXsY4RXXloTDcWIlNqra5K6+3T nVEkBDm0Qw97Y6FsqBVxk4kgWC6xNxQ4Sp+Sg4wthMQ70iFGlMin0kYRo7kAIUF9 M+v2vMwTFWkcl0BT5LobE39kWVbQKEVPH7nkItE= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0D1mnIrh7RRrC UEocNYLMZ2azo6c6NUTqSAMQyDDvRUsezil2NCqKo0ptMRtmb8WsyuaRUkjFhh9M 69kiuj89GKRALXxExHjWX7e8iS1NTGL+Uakc1J23Z5FvlUyVLucCfcAZ6MvcC7n6 qpzUxkqz1u/27Ze9nv2mleLYBVWbGpjSHAUDuZzMCBs5Q/QrUwL74cIxNsS0iHpY I3aee67cmFoK4guN9LBOtviyXUTP22kJLXe41HDjdWh01+FxcuwHrGmeGQwiSlw4 8wkdoC0M51SwpHEq+K91BqGsTboC5mshqKA88OPf5JK9ied/OsNX+K6p5v3RVHn8 9VaWiTorAgMBAAECggEBAJ7umazMGdg80/TGF9Q0a2JutplDj5zyXgUJUSNkAMWB /V+Qi8pZG1/J6CzfVpche3McmU2WOsOWslQcLUnY6W7NLFW1kGXGof5e+HgDASik jxB6FfJrvVagpR+/wZxAjQmG46Q69o4hD6SxKcMpz9BTnPXxG6n1B2EeFd+lPb2r zf/C4uXBczWn5rFXkj0DZGq81ZXewcnUNnxjQnccVCuYW+hqYxznSxqWTCD6hsvg sGceqv0Ppp6TqMSECCIIJ+kVlbiAC2i6mnoertheFVrNUdwDb8nRn6fs8T+F0ShW PdxIfSvAaBKqvseJqqueVpuwVcdSl+moJYlCdMb4cUECgYEA30AIHvMQq/s33ipV 62xOKXcEZ7tKaJrAbJvG4cx934wNiQ0tLwRNlonGbuTjsUaPRvagVeJND/UPIsfH ZwoY1Uw25fZNaveoQtU8LQBAG53R5yaMiUH48JWVvKRdfG09zr6EFCM/k2loHS1W /CiDlaIl59B8REnihyn0wvkiaIsCgYEAznlZRhlruk+n2sWklierav4M8GEK22+/ A/UP1eUnlcHgSaFZoM0sukSrisZnj6zu/BAfFEVN5czra3ARrLClLQteFREr2BMF 9XymrjNG99QkBAall7BGpfkDW/D2DFZa4G5R6AMG+pYZHCU84U4QT5ZKyfdhTUbQ uTYx2F31COECgYAIUm+7D56AerXjbzqSsw/a1dfxMfcdHR+tLMVmJ2RNz/+1KyuT BBsMUIh4G8otEo9GuuzRJsVuodj1l/Lj8WlpkhS9z8elBCRekWpT1x2Mqf5oGnTE rRPli/3v8USW3c+fBFUSFxpImXZLGCSU88Gr80ZsdMYdGY/7L+Iy3myc7wKBgQC1 uHeqCpWV1KWXFnxU63UjJZWdussjdqZXhUf6qUS9uXT9WNTZgbrr9aRE73oWKc3s awPvg0+cAU7xsCDeLFoz2t1jDUnZUmTcOmk4yEidtkg8gt0bNDn5ucALG3hyQ06Y WIAeAwwRYCmZa+y5H0ubwFryhpdMvBbX66rTE16mAQKBgC5PJd9zLEzyLj/jUfZ0 xOwXubu9GejOuCiVwKMTn73nvdi57zFBOrDxSl9yVCRhve61L5fcJixRDiwx8qtd VGclRMxbVPKVfKpAyKjpsmZXk3IPHjXjJb3fYLXAnzRHk6v+yjVn4fy2Z93pW/cF wBgQNqXLNTGrBzrFi469oc1s -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/mock-delegate-revoked.sh000077500000000000000000000002771511661753600246530ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp_responder.crt \ --ocsp_responder_key ocsp_responder.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/mock-delegate-valid.sh000077500000000000000000000002531511661753600243050ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ocsp-responder.crt \ --ocsp_responder_key ocsp-responder.key \ -p 8100 \ -v mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/mock-revoked.sh000077500000000000000000000002471511661753600231000ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v \ --fault revoked mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/mock-valid.sh000077500000000000000000000002231511661753600225320ustar00rootroot00000000000000#!/usr/bin/env sh python3 ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert ca.crt \ --ocsp_responder_key ca.key \ -p 8100 \ -v mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/ocsp-responder.crt000066400000000000000000000023751511661753600236340ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIEA0v5yzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMjA2MjMyMjU4WhcNNDAwMjA4MjMyMjU4WjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTMwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiHYXGCSOK3gxlEmNSLepoFJbv hfYxxaqAWEceiTQdRpN97YRr/ywPm0+932EsE6/gIjqVs8IOtsiFKK1lQ9sL/9f+ ckS5gj9AR+Cta+FLDRP5plE+aao5no0kA8qMx2HHd47XFnuxKtUztRmgmTBNYbYh PdY1kjBSRyuXXBn1V6TRaYhk6dsK56Zvhgo6Y3YqpjpldePa4E0XpUlBhY020QXt K3iWFauEYKcKR2JI2oVjY0tR60zf3GHkMLCe7SdbofCdwkBHcCctLSp4xYb44JGb JX1npM1mhxR4pnp80tbEXNvXQ4S3kmd7/QFUYE4IdXVkXNhkK6PtIdDKbLa9AgMB AAGjLzAtMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoGCCsGAQUF BwMJMA0GCSqGSIb3DQEBCwUAA4IBAQB5igUUQSzxzWvL+28TDYFuNnTB0hvqTnd7 ZVyk8RVBiUkudxEmt5uFRWT6GOc7Y1H6w4igtuhhqxAeG9bUob+VQkCyc4GxaHSO oBtl/Zu+ts+0gUUlm+Bs6wFnFsGhM0awV/vqigDADZT2jbqbHBm2lP99eq8fsi6L kpohhbuTVWjLuViARYIOJLoBnNRpVXqwD5A8uNqwZI2OVGh1cQYNZcmfLJ1u2j5C ycohoa+o8NGgkxEhG2QETdVodfHT2dUgzPDvO42CVa3MK7J0sovBU5DeuIDPV/hh j+v5A8L8gMiNpkLClqt2TEiFH2GItWDNQjTgrLq9iFUgJnbwuj4F -----END CERTIFICATE----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/ocsp-responder.key000066400000000000000000000032501511661753600236250ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiHYXGCSOK3gxl EmNSLepoFJbvhfYxxaqAWEceiTQdRpN97YRr/ywPm0+932EsE6/gIjqVs8IOtsiF KK1lQ9sL/9f+ckS5gj9AR+Cta+FLDRP5plE+aao5no0kA8qMx2HHd47XFnuxKtUz tRmgmTBNYbYhPdY1kjBSRyuXXBn1V6TRaYhk6dsK56Zvhgo6Y3YqpjpldePa4E0X pUlBhY020QXtK3iWFauEYKcKR2JI2oVjY0tR60zf3GHkMLCe7SdbofCdwkBHcCct LSp4xYb44JGbJX1npM1mhxR4pnp80tbEXNvXQ4S3kmd7/QFUYE4IdXVkXNhkK6Pt IdDKbLa9AgMBAAECggEBAMMYOe4OwI323LbwUKX9W/0Flt1/tlZneJ9Yi7R7KW4B EQ1cPB96gafNl9X5wLvpGJzIq8ey28MaTpUl7cYr7/nAe7rdGRL+oFh0LBU1uaOp 2wxSRlMVlHw2owzqAH/LIECclbBbg8nvbRk6Lqx0wEpj/mNcGVELm4nCQohMPVGC 9/8GZ63r+tS35jry9SBG0X4R5jYKsNzgNgcjR+lgMv/2FfpuZDryk9TWIP9ApQoc 7/DpTfC6P34f/ermfo4f2GEmRJsTACphA0kkpQX/n88r35cUSGeO5M9jYICUeCFw IK4L6KNQcTRVOknFYeVJembVrj0RYKtWT+oU84a4XPkCgYEA+k7fcXhU2K+NX8RN 7HUPbxBE/TfLTNHdLTuWCUI77j+J3LUPNQ4BUyue+pUaFxI7Huc6x1zvvD27EqJ8 0ge5MkFNflTUdUotuU/FKg7GKOU7rfdEvthzU2MbAZrHc0SeF+9/YrpvWZ+ZMKQ5 IBQhiloFLsVGpGFzzF/MjpFdYo8CgYEA50HQxDDmfzmvNnURRZZV0lQ203m9I4KF DbL2x59q0DaJkUpFr3uyvghAoz4y/OD5vNIwbzHWbmDQEA06v7iFoJ6BcJFG1syc 7A7KTB3PNQK4+ASG6pC3tYJ78mWtJwK130hFpuVkS/VPhQZJ/21EcWj9V153SZpA RUqv/L+lx/MCgYEAs7E7p3IDNyuQClgauM2wrsK3RDFxuUxPw9Eq/KqX64mhptg0 epn7SYHfN3Uirb1gw+arw8NsN275hX8wrHbu9Kz8vNyZSTpfaNFjcbX5fBJUrab9 qyQoZoyXLqe214FDHVvJz06X8Xcpukmq2OSaz3+giNsGw6tSPj3n09F3gPECgYBI 1NGK+FufdetYm0X1RIOC2kLqF00aAeElj1dpRyu8p3Br8ZhAzBRfBPpWbyBfw/rj HM9kNa3y1Uqxw3jdKJ/tFf5uFVLaE1bYgU/06O55I4Jdmg9jkHBLGe0vShZeUtw0 le5ZwaT0xy1kF7b2WtNTZF1lRrsK0ymqqPsD/teXQQKBgBTyYVxPEHKr86kEQqL5 /OKByVpqAxA7LQ1lTLNV9lXMRawp848flv/Uc8pj43MitAIiYazfXkpeeC6gGntJ kkRT9jraOzy51tVAIh2KXm3l6KY/gnYTO3UXrxZOZU4IA7OttP3BG7xKq/9HP+kV 5P1bAkqo+n3XNxKoSSeJteCd -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/responder.logs000066400000000000000000000000741511661753600230400ustar00rootroot00000000000000INFO:mock_ocsp_responder:Launching debugserver on port 8100 mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/server-mustStaple.pem000066400000000000000000000062551511661753600243300ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIERjCCAy6gAwIBAgIEJ++lZzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMzE5MTU1NjIyWhcNNDAwMzIxMTU1NjIyWjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTEwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDykV3fTFJgaqjfAgbAC7TGPk9V VVsRYRgLF8Zjh9GDRU/TQ6pGZG7qo64D11oQurW0WT2Zv/lqhXW4mWNFv8+qoS5L 9z2Dtmxr8CZbb6YftA0e22KPUuDCQ5nYhOY21A6SYFwqEZ6ZsrZAMkgfhx+TY1kZ 0jZM/jgkvRtpG9I8BbddHyF8eFATCJ41DnLOzjfNukd5zKSIdVxY6r+ZBOr29kii dcNHkCAck7+WXl9/KSqH7jF5asU0S3x/68G2R/qdKAxki9b2fe70N3XGZE0P2WHi lq2aJeE0eqjAv+hBGiEb4iJl0s8iheardrHFeL4EMbiiVfVdVCHKkp58wjB9AgMB AAGjgfEwge4wCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB BQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTOLiS9HKGWpiVKx81nNuRlK+HAITBn BggrBgEFBQcBAQRbMFkwLQYIKwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAw MS9wb3dlci9sZXZlbDAoBggrBgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAw L3N0YXR1czARBggrBgEFBQcBGAQFMAMCAQUwGgYDVR0RBBMwEYIJbG9jYWxob3N0 hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCg3NfTO8eCdhtmdDVF5WwP4/lXMYJY 5wn7PhYKMyUQI3rjUpQRIQwCVerHAJAiiflpgefxB8PD5spHPFq6RqAvH9SKpP5x nyhiRdo51BmijCIl7VNdqyM5ZgDAN2fm2m56mDxpo9xqeTWg83YK8YY1xvBHl3jl vQC+bBJzhaTp6SYXMc/70qIPcln0IElbuLN8vL4aG6xULkivtjiv7qBSZrNrBMSf QJan9En4wcNGFt5ozrgJthZHTTX9pXOGVZe4LXbPCQSrBxZiBD9bITUyhtbeYhYR 4yfXjr7IeuoX+0g6+EEtxqrbWfIkJ3D7UaxAorZEsCt18GC7fap9/fzv -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDykV3fTFJgaqjf AgbAC7TGPk9VVVsRYRgLF8Zjh9GDRU/TQ6pGZG7qo64D11oQurW0WT2Zv/lqhXW4 mWNFv8+qoS5L9z2Dtmxr8CZbb6YftA0e22KPUuDCQ5nYhOY21A6SYFwqEZ6ZsrZA Mkgfhx+TY1kZ0jZM/jgkvRtpG9I8BbddHyF8eFATCJ41DnLOzjfNukd5zKSIdVxY 6r+ZBOr29kiidcNHkCAck7+WXl9/KSqH7jF5asU0S3x/68G2R/qdKAxki9b2fe70 N3XGZE0P2WHilq2aJeE0eqjAv+hBGiEb4iJl0s8iheardrHFeL4EMbiiVfVdVCHK kp58wjB9AgMBAAECggEATA91Bf3insUTKspx32pMRxVmvvVC1xJA/cl4teDyu1zS iQZgsC3x8bVdbWrrnO9O5rxM6pcd2F786OOAE3Dv5ysfX0apjVF4cegdvvIlfy9w JcrY/uQYAhI8fX4+ydZ4s0Fv5OkdeEhniX26y9gM+KRgXg5iZIYaiLqbi7vjkloE NBIDWGj8PCNKUVc2PSbZFVMMTc+7qZeUR0WRKr9CsaXBiEkWKfuw4MH1YUL0HJOs uLd/oYg0l0eHPluUkKQW+KVq1GKsmr2sSc8NOcGtVTsUygSgX4hw36V7Vw3MfQRv sNIgKp3RDEyynoXRoG3laHrib1GdYwDKRsHB2znKQQKBgQD+NAOOqoEx0lmlg/Wf sNImv+3da0owE1TqTMHBWXriGo+DwqT+d9S+M5x3JMpmgH9vTEDlLOM2+qF8M3B3 TLlu1k7F8D1G7YCdIZwMLUNCekCSHsqQcU9HMHlQqXd2cxFqWbyATk9tvJzj7xC9 zMhaKGKvIS/EF0Ld8kIvrINmGQKBgQD0SExjk4yshv/DvWknxfJr8OupgQrriLHA Hrk+n84Iv/4vzupgKsXJQE6VN0xM6e/ANhGATuxiaA3UE4p6K9wJNryHrw/wdnyf I9AR0Cea9F4pa26BBCdLtQuyRqgl7dBZA1n3il7vKX6wB0MLoy/uYWYCedk4w+9d acqh7S0CBQKBgBl8x5qHV/rR13E0AO2pAfkmp0fbGQ4m8g2n8olbWmnPNfKFEpv9 EdScQiTkCHMskRpsr9kKniGGEajtU2pyw+jsDevkwZAaAho/I3FJHIRO06iS88Z1 xfgiUReYVkUHFojuRGss7uPW1Hg6IRiWrsPzZqmejzZ/CpJMVvyGtIoJAoGAXmo7 LBlxO5WJ8SuaIwc85T9etkrr35EbsnetfWjihzs9kVjV+YlOnLRAKygOU4PvaEj9 hqv6bSZugdNzqDifeOgxAfhFntkM3a1H1DqxtBBS/ItLUI48aeR1utfYUaCS8HR9 J1HR03okPwDvhuXxtp7qgHZ74JbKQz6KVP+Ib8kCgYEA7w0NnuOoZ0la17XuyQzA UeTZZavgm0tNqqT4JcPiUV9zkR8WJsFQE704KQ8BjDyeYMWwe8EpfJaqsGqdJKGo RnnxwNuwT4uSNb78MxXXVRG0fN/2iu70lNySKOl/DmA8siRc/weQj5JPsGbyZkjZ IsaTqaZQUdtbZ7vRukyPo8Q= -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/ocsp/rsa/server.pem000066400000000000000000000062251511661753600221660ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIET11AjzANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJV UzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENpdHkxEDAO BgNVBAoMB01vbmdvREIxDzANBgNVBAsMBktlcm5lbDEXMBUGA1UEAwwOS2VybmVs IFRlc3QgQ0EwHhcNMjAwMzE5MTU1NjI1WhcNNDAwMzIxMTU1NjI1WjBiMRAwDgYD VQQKDAdNb25nb0RCMQ8wDQYDVQQLDAZLZXJuZWwxEjAQBgNVBAMMCWxvY2FsaG9z dDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMQ8wDQYDVQQHDAZPQ1NQLTEwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0usokl3+yXDtLeYquHQyAkXIw lY4tukv8nEgLtUlK0kt9Q7P8EdZigzFUeJtL7piFCTIaLuv6e4UqLLDXbIANxD/J NXXQPtBasOSzdgZ2ToUj5ANPv0QegsFubpYGq5LXsMdKTRE8uTB91PJBvRzxY2Nx O1kdQcIrYpSYXqKsNgq/8iAPrmAdZ3y+S7OBuNyvlQJZqWoB1Y0ZWuR1QrcLMgdm q2SdBzZT/3P+r/dbHMKdDZ5JdJ9Nm4ylOG7mhZkfb38JfdvWedzXDMu6TzS2W67o yM90Cj9Lt+UyHLJ2jlcsZSZp4km6Oj5RBNVhd95SFckvPJxLzSyFlpjOIXsNAgMB AAGjgd4wgdswCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB BQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTe7IMKaO1aQILcpoj5wLFgIRuPHzBn BggrBgEFBQcBAQRbMFkwLQYIKwYBBQUHMAGGIWh0dHA6Ly9sb2NhbGhvc3Q6OTAw MS9wb3dlci9sZXZlbDAoBggrBgEFBQcwAYYcaHR0cDovL2xvY2FsaG9zdDo4MTAw L3N0YXR1czAaBgNVHREEEzARgglsb2NhbGhvc3SHBH8AAAEwDQYJKoZIhvcNAQEL BQADggEBAFMVds6y5Qy7DlFsca0u8WE+ckoONa427bWBqNx8b/Hwaj3N3C58XQx/ EZRNt9XVy/LoEHr+NmOWsCl69fINeVpx8Ftot8XPbFG9YxL/xbJ3lvWesPR6bwpm PZqGiwfl1VrZvuobXADz0Rfru7B7LPkurpSxDiNBf/9JuLPYe9ffZwdFWQoehw07 b9FKVaJ7mSHno/5f4Z/uKau91sL0kiKKG9Lo2JEIEmpp8HJ3OKCFh7DFkeDlRCDl WyYxF4g/PfvJQm2Hd89cu8m3RX84rLa9jn1RGL/8bmxE0dxk4Di/t9gl5KGWIH9Q LBeVRSQmH9GbI/WmldMLkGkvARYYTp8= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC0usokl3+yXDtL eYquHQyAkXIwlY4tukv8nEgLtUlK0kt9Q7P8EdZigzFUeJtL7piFCTIaLuv6e4Uq LLDXbIANxD/JNXXQPtBasOSzdgZ2ToUj5ANPv0QegsFubpYGq5LXsMdKTRE8uTB9 1PJBvRzxY2NxO1kdQcIrYpSYXqKsNgq/8iAPrmAdZ3y+S7OBuNyvlQJZqWoB1Y0Z WuR1QrcLMgdmq2SdBzZT/3P+r/dbHMKdDZ5JdJ9Nm4ylOG7mhZkfb38JfdvWedzX DMu6TzS2W67oyM90Cj9Lt+UyHLJ2jlcsZSZp4km6Oj5RBNVhd95SFckvPJxLzSyF lpjOIXsNAgMBAAECggEAIjNe4YHR5nzRs7yyY7SXkxTzGQKUP08L5ifk8mJCFmip ZHEVdFQjz8yn3yZbrQjfz/0ngBD1Exeg4ZRHetzLds92iqsVOm1InIDxJozlOCov w9T4U3UMfQGdfTpsJaL+TNblP8hJxMX+yTEtDwesnHmEbf8fJAw3pGIpYJQ4EIJv 1uPzyB8EsrTjj23a5NPF/FGdzzO+HP5fhNNIUmP83pqonXLUSy0v5rsRFNxNMBn3 SPRWq+Z779eLQXnRjW/6hKssSBFg6zAOi3Gc4oDbrDa2WEbZ0BEU+JW3XduN91bU SsO3yQ+VL+CQn5wvXGIsc4EHH6wO8Bs0vXfD7zeLgQKBgQDrHOzPymI0p0PnxL2+ 8LrSU1x0WdedPZJugwwfUYMfn7sjKx+FyVLvM+7wuJ8zsMOAab2AHv3S0Nxkovhb aa4lH9SUAHILcU+nb7M6E+mwSr65AemGspvGz4ZC6L52CGVzRfIcoBDD0T8OZGH0 4IeiqOluqtvgCoW4UV1dyw0nPQKBgQDEyQwcim5ghEQ7V2eDefE5yxNlkNEnSVnG DNubM8KURR8jehpDWkIlxQ4p2tLBWGB0YeOCG9NmwfLnQUStvSFE6/XjP5bBJlov jT66T98NgFRfUeVkcCAiVT/LlDzXWXXPLyZSY+bxtn8UA1NYNu0pLCLDR9TlH1dK FKwiomdgEQKBgEimcHqo4/23LeGBRsyooGH7hlchp+GbtBLYBbfrvSPZfL8aRSxX EHx/xLa3peIYHeEhS4A6k15AUcn7HdlJZ5lrI4n0NUlZ4y4u8ufgXVavUg3jDGEl 8cLWP3uPZcMdRxP+qhi0UVng36Y32JkNhHv7y935h+XL+pQA+GPSKadVAoGAPPvp SvcDmdmjo5hEthQWU8jBbBpjFv++WIgnjoON65E4QzBV70WLdlUJPKNZ6R1QVwD3 Fp00+IVml5A8jnMsWkWd4B0WxSjzjgUByY9zGqYIf7nLk0LEUp+Es7xu1nYc8mY0 RBg9u+7IlxUowQ/Uk4vgAhDCw3bhAE5Dwj/+NWECgYBWnBz5l+Uar9oT1ErRSbJW RVYx3iIsqka1lox/zw5nme1Q/dv2uTQy6uZRn9U9ikqGwePuMEexQTR1csnMqeMM 4i3pDFpGBfTZXJAvH790ak6eZ0eBXqzJlTyEjll4r4zXHk+slm/tAgpIg0Ps3J9j Sd+bTtG47gpb4sRbqEtQFQ== -----END PRIVATE KEY----- mongo-c-driver-2.2.1/.evergreen/scripts/000077500000000000000000000000001511661753600201065ustar00rootroot00000000000000mongo-c-driver-2.2.1/.evergreen/scripts/abi-compliance-check-setup.sh000077500000000000000000000030221511661753600255160ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail declare working_dir working_dir="$(pwd)" export PATH PATH="${working_dir:?}/install/bin:${PATH:-}" # Install prefix to use for ABI compatibility scripts. if [[ ! -d "${working_dir}/install" ]]; then echo "Creating install directory at ${working_dir}/install" mkdir -p "${working_dir}/install" fi declare parallel_level parallel_level="$(("$(nproc)" + 1))" export PATH PATH="${MONGO_C_DRIVER_CACHE_DIR:?}/bin:${PATH:-}" # abi-compliance-checker # Obtain abi-compliance-checker. echo "Fetching abi-compliance-checker..." [[ -d "${MONGO_C_DRIVER_CACHE_DIR:?}/checker-2.3" ]] || { git clone -b "2.3" --depth 1 https://github.com/lvc/abi-compliance-checker.git "${MONGO_C_DRIVER_CACHE_DIR:?}/checker-2.3" pushd "${MONGO_C_DRIVER_CACHE_DIR:?}/checker-2.3" make -j "${parallel_level:?}" --no-print-directory install prefix="${MONGO_C_DRIVER_CACHE_DIR:?}" popd # "${MONGO_C_DRIVER_CACHE_DIR:?}/checker-2.3" } >/dev/null echo "Fetching abi-compliance-checker... done." # Obtain ctags. echo "Fetching ctags..." [[ -d "${MONGO_C_DRIVER_CACHE_DIR:?}/ctags-6.0.0" ]] || { git clone -b "v6.0.0" --depth 1 https://github.com/universal-ctags/ctags.git "${MONGO_C_DRIVER_CACHE_DIR:?}/ctags-6.0.0" pushd "${MONGO_C_DRIVER_CACHE_DIR:?}/ctags-6.0.0" ./autogen.sh ./configure --prefix="${MONGO_C_DRIVER_CACHE_DIR:?}" make -j "${parallel_level:?}" make install popd # "${MONGO_C_DRIVER_CACHE_DIR:?}/ctags-6.0.0" } >/dev/null echo "Fetching ctags... done." command -V abi-compliance-checker mongo-c-driver-2.2.1/.evergreen/scripts/abi-compliance-check.sh000077500000000000000000000057271511661753600243760ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # create all needed directories mkdir abi-compliance mkdir abi-compliance/current-install mkdir abi-compliance/base-install mkdir abi-compliance/dumps declare head_commit today # The 10 digits of the base commit head_commit=$(git rev-parse --revs-only --short=10 "HEAD^{commit}") # The YYYYMMDD date today=$(date +%Y%m%d) declare current base current="$(cat VERSION_CURRENT)-${today:?}+git${head_commit:?}" # e.g. 2.3.4-dev base=$(cat etc/prior_version.txt) # e.g. 1.2.3 current_verdir="$(echo "${current:?}" | perl -lne 'm|^(\d+\.\d+\.\d+).*$|; print $1')" # Strip any suffixes. base_verdir="${base:?}" # Double-check we are testing against the same API major version. if [[ "${base_verdir:?}" != 2.* ]]; then echo "API major version mismatch: base version is ${base:?} but current version is ${current:?}" >&2 exit 1 fi declare working_dir working_dir="$(pwd)" export PATH PATH="${MONGO_C_DRIVER_CACHE_DIR:?}/bin:${PATH:-}" # abi-compliance-checker cmake_configure_flags=( "-DENABLE_STATIC=OFF" "-DENABLE_TESTS=OFF" "-DENABLE_EXAMPLES=OFF" ) # build the current changes env \ CFLAGS="-g -Og" \ EXTRA_CONFIGURE_FLAGS="-DCMAKE_INSTALL_PREFIX=./abi-compliance/current-install ${cmake_configure_flags[*]:?}" \ .evergreen/scripts/compile.sh # checkout the base release git checkout "tags/${base:?}" -f declare compile_script compile_script=".evergreen/scripts/compile.sh" # build the base release env \ CFLAGS="-g -Og" \ EXTRA_CONFIGURE_FLAGS="-DCMAKE_INSTALL_PREFIX=./abi-compliance/base-install ${cmake_configure_flags[*]:?}" \ bash "${compile_script}" # check for abi compliance. Generates HTML Reports. cd abi-compliance cat >|old.xml < ${base:?} $(pwd)/base-install/lib $(pwd)/base-install/include/bson-${base_verdir:?}/ $(pwd)/base-install/include/mongoc-${base_verdir:?}/ $(pwd)/base-install/include/bson-${base_verdir:?}/bson/bson.h $(pwd)/base-install/include/mongoc-${base_verdir:?}/mongoc/mongoc.h DOC cat >|new.xml < ${current:?} $(pwd)/current-install/lib $(pwd)/current-install/include/bson-${current_verdir:?}/ $(pwd)/current-install/include/mongoc-${current_verdir:?}/ $(pwd)/current-install/include/bson-${current_verdir:?}/bson/bson.h $(pwd)/current-install/include/mongoc-${current_verdir:?}/mongoc/mongoc.h DOC # Allow task to upload the HTML report despite failed status. if ! abi-compliance-checker -lib mongo-c-driver -old old.xml -new new.xml; then find . -name log.txt -exec cat {} + >&2 || true declare status status='{"status":"failed", "type":"test", "should_continue":true, "desc":"abi-compliance-checker emitted one or more errors"}' curl -sS -d "${status:?}" -H "Content-Type: application/json" -X POST localhost:2285/task_status || true fi mongo-c-driver-2.2.1/.evergreen/scripts/add-build-dirs-to-paths.sh000077500000000000000000000023031511661753600247640ustar00rootroot00000000000000#!/usr/bin/env bash case "${OSTYPE}" in cygwin) export PATH PATH="$(pwd)/install-dir/bin:${PATH:-}" PATH="$(pwd)/src/libbson/Release:${PATH}" PATH="$(pwd)/src/libbson/Debug:${PATH}" chmod -f +x src/libmongoc/Debug/* || true chmod -f +x src/libbson/Debug/* || true chmod -f +x src/libmongoc/Release/* || true chmod -f +x src/libbson/Release/* || true chmod -f +x install-dir/bin/* || true ;; darwin*) export DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH="${EXTRA_LIB_PATH:-}:${DYLD_LIBRARY_PATH:-}" DYLD_LIBRARY_PATH="$(pwd)/src/libmongoc:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/src/libbson:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/install-dir/lib64:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd)/install-dir/lib:${DYLD_LIBRARY_PATH}" DYLD_LIBRARY_PATH="$(pwd):${DYLD_LIBRARY_PATH}" ;; *) export LD_LIBRARY_PATH LD_LIBRARY_PATH="${EXTRA_LIB_PATH:-}:${LD_LIBRARY_PATH:-}" LD_LIBRARY_PATH="$(pwd)/src/libmongoc:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/src/libbson:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/install-dir/lib64:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd)/install-dir/lib:${LD_LIBRARY_PATH}" LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH}" ;; esac mongo-c-driver-2.2.1/.evergreen/scripts/build-docs.sh000077500000000000000000000012251511661753600224720ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths . "$MONGOC_DIR/.evergreen/scripts/install-build-tools.sh" # Check that a CLion user didn't accidentally convert NEWS from UTF-8 to ASCII grep "á" NEWS >/dev/null || (echo "NEWS file appears to have lost its UTF-8 encoding?" || exit 1) build_dir=$MONGOC_DIR/_build/for-docs uvx cmake --fresh -G "Ninja" -S "$MONGOC_DIR" -B "$build_dir" \ -D ENABLE_MAN_PAGES=ON \ -D ENABLE_HTML_DOCS=ON \ -D ENABLE_ZLIB=BUNDLED uvx cmake --build "$build_dir" \ --parallel 8 \ --target bson-doc \ --target mongoc-doc mongo-c-driver-2.2.1/.evergreen/scripts/build_snapshot_rpm.sh000077500000000000000000000136341511661753600243500ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # # build_snapshot_rpm.sh # # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # for arg in "$@"; do if [ "$arg" = "-h" ]; then echo "Usage: .evergreen/scripts/build_snapshot_rpm.sh" echo "" echo " This script is used to build a .rpm package directly from a snapshot of the" echo " current repository." echo "" echo " This script must be called from the base directory of the repository, and" echo " requires utilities from these packages: rpm-build, mock" echo "" exit fi done package=mongo-c-driver spec_file=../mongo-c-driver.spec config=${MOCK_TARGET_CONFIG:=fedora-40-aarch64} if [ ! -x /usr/bin/rpmbuild -o ! -x /usr/bin/rpmspec ]; then echo "Missing the rpmbuild or rpmspec utility from the rpm-build package" exit 1 fi if [ ! -d .git ]; then echo "This script only works from within a repository" exit 1 fi if [ ! -x /usr/bin/mock ]; then echo "Missing mock" exit 1 fi if [ -f "${spec_file}" ]; then echo "Found old spec file (${spec_file})...removing" rm -f ${spec_file} fi cp "$(pwd)/.evergreen/etc/${package}.spec" .. if [ -f .evergreen/etc/spec.patch ]; then patch -d .. -p0 -i $(pwd)/.evergreen/etc/spec.patch fi changelog_package=$(rpmspec --srpm -q --qf "%{name}" ${spec_file}) if [ "${package}" != "${changelog_package}" ]; then echo "This script is configured to create snapshots for ${package} but you are trying to create a snapshot for ${changelog_package}" exit 1 fi build_dir=$(basename $(pwd)) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean sudo mock -r ${config} --use-bootstrap-image --isolation=simple --init mock_root=$(sudo mock -r ${config} --use-bootstrap-image --isolation=simple --print-root-path) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --install rpmdevtools git rpm-build cmake python3.11 gcc openssl-devel # This step is needed to avoid the following error on rocky+epel8: # Problem: conflicting requests # - package utf8proc-devel-2.6.1-3.module+el8.7.0+1065+42200b2e.aarch64 from powertools is filtered out by modular filtering sudo mock -r ${config} --use-bootstrap-image --isolation=simple --dnf-cmd --setopt=powertools.module_hotfixes=true install utf8proc-devel sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyin "$(pwd)" "$(pwd)/${spec_file}" /tmp sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyout "/tmp/${build_dir}/VERSION_CURRENT" . bare_upstream_version=$(rpmspec --srpm -q --qf '%{version}' "$spec_file") # Upstream version in the .spec file cannot have hyphen (-); replace the current # version so that the dist tarball version does not have a pre-release component sudo sh -c "echo ${bare_upstream_version} > VERSION_CURRENT" echo "Found bare upstream version: ${bare_upstream_version}" git_rev="$(git rev-parse --short HEAD)" snapshot_version="${bare_upstream_version}-0.$(date +%Y%m%d)+git${git_rev}" echo "Upstream snapshot version: ${snapshot_version}" current_package_version=$(rpmspec --srpm -q --qf "%{version}-%{release}" ${spec_file}) if [ -n "${current_package_version##*${git_rev}*}" ]; then echo "Making RPM changelog entry" sudo mock -r ${config} --use-bootstrap-image --isolation=simple --cwd "/tmp/${build_dir}" --chroot -- rpmdev-bumpspec --comment="Built from Git Snapshot." --userstring="Test User " --new="${snapshot_version}%{?dist}" ${spec_file} fi sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyout "/tmp/${build_dir}/${spec_file}" .. [ -d ~/rpmbuild/SOURCES ] || mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} # Create a source archive for rpmbuild to use: expect_filename=$(rpmspec --srpm -q --qf '%{source}' "$spec_file") tar_filestem=$package-$bare_upstream_version tar_filename=$tar_filestem.tar tar_filepath="/tmp/$tar_filename" tgz_filepath="$HOME/rpmbuild/SOURCES/$expect_filename" echo "Creating source archive [$tgz_filepath]" # If Evergreen is running a patch build, changes have been git applied to the index. # Commit the changes to include them in the tarball. git commit -m "Include applied changes from a patch build" || true git archive --format=tar --output="$tar_filepath" --prefix="$tar_filestem/" HEAD mkdir -p "$tar_filestem" cp VERSION_CURRENT "$tar_filestem/." tar -rf "$tar_filepath" "$tar_filestem/" gzip --keep "$tar_filepath" --stdout >"$tgz_filepath" echo "Building source RPM ..." rpmbuild -bs ${spec_file} echo "Building binary RPMs ..." mock_result=$(readlink -f ../mock-result) sudo mock --resultdir="${mock_result}" --use-bootstrap-image --isolation=simple -r ${config} --no-clean --no-cleanup-after --rebuild ~/rpmbuild/SRPMS/${package}-${snapshot_version}*.src.rpm || ( cd "${mock_result}" cat *.log exit 1 ) sudo mock -r ${config} --use-bootstrap-image --isolation=simple --copyin "${mock_result}" /tmp sudo mock -r ${config} --use-bootstrap-image --isolation=simple --cwd "/tmp/${build_dir}" --chroot -- /bin/sh -c "( rpm -Uvh ../mock-result/*.rpm && gcc -I/usr/include/libmongoc-1.0 -I/usr/include/libbson-1.0 -o example-client src/libmongoc/examples/example-client.c -lmongoc-1.0 -lbson-1.0 )" if [ ! -e "${mock_root}/tmp/${build_dir}/example-client" ]; then echo "Example was not built!" sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean exit 1 fi sudo mock -r ${config} --use-bootstrap-image --isolation=simple --clean ( cd "${mock_result}" tar zcvf ../rpm.tar.gz *.rpm ) mongo-c-driver-2.2.1/.evergreen/scripts/bypass-dlclose.sh000077500000000000000000000025551511661753600234000ustar00rootroot00000000000000#!/usr/bin/env bash # bypass_dlclose # # Usage: # bypass_dlclose command args... # # Parameters: # "$CC": compiler to use to compile and link the bypass_dlclose library. # # Return 0 (true) if able to create a shared library to bypass calls to dlclose. # Return a non-zero (false) value otherwise. # # If successful, print paths to add to LD_PRELOAD to stdout (pipe 1). # Otherwise, no output is printed to stdout (pipe 1). # # Diagnostic messages may be printed to stderr (pipe 2). Redirect to /dev/null # with `2>/dev/null` to silence these messages. bypass_dlclose() ( : "${CC:?'bypass_dlclose expects environment variable CC to be defined!'}" declare ld_preload { declare tmp if ! tmp="$(mktemp -d)"; then echo "Could not create temporary directory for bypass_dlclose library!" 1>&2 return 1 fi echo "int dlclose (void *handle) {(void) handle; return 0; }" \ >|"${tmp:?}/bypass_dlclose.c" || return "${CC:?}" -o "${tmp:?}/bypass_dlclose.so" \ -shared "${tmp:?}/bypass_dlclose.c" || return ld_preload="${tmp:?}/bypass_dlclose.so" # Clang uses its own libasan.so; do not preload it! if [[ ! "${CC:?}" =~ clang ]]; then declare asan_path asan_path="$("${CC:?}" -print-file-name=libasan.so)" || return ld_preload="${asan_path:?}:${ld_preload:?}" fi } 1>&2 printf "%s" "${ld_preload:?}" ) mongo-c-driver-2.2.1/.evergreen/scripts/check-preludes.py000066400000000000000000000042431511661753600233610ustar00rootroot00000000000000#!/usr/bin/env python3 # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Check that public libbson/libmongoc headers all include the prelude line.""" import sys from pathlib import Path if len(sys.argv) != 2: print('Usage: python check-preludes.py ') sys.exit(1) MONGOC_PREFIX = Path('src/libmongoc/src/mongoc') BSON_PREFIX = Path('src/libbson/src/bson') COMMON_PREFIX = Path('src/common/src') checks = [ { 'name': 'libmongoc', 'headers': list(MONGOC_PREFIX.glob('mongoc-*.h')), 'exclusions': [ MONGOC_PREFIX / 'mongoc-prelude.h', MONGOC_PREFIX / 'mongoc.h', ], 'include': '#include ', }, { 'name': 'libbson', 'headers': list(BSON_PREFIX.glob('bson-*.h')), 'exclusions': [ BSON_PREFIX / 'bson-prelude.h', BSON_PREFIX / 'bson.h', ], 'include': '#include ', }, { 'name': 'common', 'headers': list(COMMON_PREFIX.glob('*.h')), 'exclusions': [COMMON_PREFIX / 'common-prelude.h'], 'include': '#include ', }, ] for check in checks: NAME = check['name'] print(f'Checking headers for {NAME}') assert len(check['headers']) > 0 for header in check['headers']: if header in check['exclusions'] or header.name.endswith('-private.h'): continue lines = Path(header).read_text(encoding='utf-8').splitlines() if check['include'] not in lines: print(f'{header} did not include prelude') sys.exit(1) print('All checks passed') mongo-c-driver-2.2.1/.evergreen/scripts/check-public-decls.sh000077500000000000000000000016271511661753600240740ustar00rootroot00000000000000#!/usr/bin/env bash # regex to match public headers. declare pattern pattern="\.\/src\/libmongoc\/src\/mongoc\/mongoc.*[^private]\.h$" # public headers we expect not to have BSON_BEGIN_DECLS and BSON_END_DECLS. declare exclude exclude="\.\/src\/libmongoc\/src\/mongoc\/mongoc-macros.h|.\/src\/libmongoc\/src\/mongoc\/mongoc.h" # get all public headers. find ./src/libmongoc/src/mongoc -regex $pattern -regextype posix-extended -not -regex $exclude | sort >/tmp/public_headers.txt # get all public headers with BSON_BEGIN_DECLS. find ./src/libmongoc/src/mongoc -regex $pattern -regextype posix-extended -not -regex $exclude | xargs grep -l "BSON_BEGIN_DECLS" | sort >/tmp/public_headers_with_extern_c.txt echo "checking if any public headers are missing 'extern C' declaration" # check if there's any diff. diff -y /tmp/public_headers.txt /tmp/public_headers_with_extern_c.txt # use return status of diff exit $? mongo-c-driver-2.2.1/.evergreen/scripts/check-symlink.sh000077500000000000000000000011031511661753600232010ustar00rootroot00000000000000check_symlink() { SYMLINK="$INSTALL_DIR/lib/$1" EXPECTED_TARGET="$2" if test ! -L "$SYMLINK"; then echo "$SYMLINK should be a symlink" exit 1 fi TARGET=$(readlink "$SYMLINK") if test ! -f $INSTALL_DIR/lib/$TARGET; then echo "$SYMLINK target $INSTALL_DIR/lib/$TARGET is missing!" exit 1 else echo "$SYMLINK target $INSTALL_DIR/lib/$TARGET check ok" fi if [ "$TARGET" != "$EXPECTED_TARGET" ]; then echo "$SYMLINK should symlink to $EXPECTED_TARGET, not to $TARGET" exit 1 else echo "$SYMLINK links to correct filename" fi } mongo-c-driver-2.2.1/.evergreen/scripts/check_rpm_spec.sh000077500000000000000000000027061511661753600234170ustar00rootroot00000000000000#!/usr/bin/env bash # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # set -o errexit # # check_rpm_spec.sh - Check if our RPM spec matches downstream's # # Supported/used environment variables: # IS_PATCH If "true", this is an Evergreen patch build. on_exit() { if [ -n "${SPEC_FILE}" ]; then rm -f "${SPEC_FILE}" fi } trap on_exit EXIT if [ "${IS_PATCH}" = "true" ]; then echo "This is a patch build...skipping RPM spec check" exit fi SPEC_FILE=$(mktemp --tmpdir -u mongo-c-driver.XXXXXXXX.spec) curl --retry 5 https://src.fedoraproject.org/rpms/mongo-c-driver/raw/rawhide/f/mongo-c-driver.spec -sS --max-time 120 --fail --output "${SPEC_FILE}" diff -q .evergreen/etc/mongo-c-driver.spec "${SPEC_FILE}" || ( echo "Synchronize RPM spec from downstream to fix this failure. See instructions here: https://docs.google.com/document/d/1ItyBC7VN383zNXu3oUOQJYR7adfYI8ECjLMJ5kqA9X8/edit#heading=h.ahdrr3b5xv3" exit 1 ) mongo-c-driver-2.2.1/.evergreen/scripts/compile-libmongocrypt.sh000077500000000000000000000030451511661753600247650ustar00rootroot00000000000000#!/usr/bin/env bash compile_libmongocrypt() { declare -r cmake_binary="${1:?"missing path to CMake binary"}" shift declare -r mongoc_dir="${1:?"missing path to mongoc directory"}" shift declare -r install_dir="${1:?"missing path to install directory"}" shift # When updating libmongocrypt, also update openssl-compat-check.sh and the copy of libmongocrypt's kms-message in # `src/kms-message`. # # Run `.evergreen/scripts/kms-divergence-check.sh` to ensure that there is no divergence in the copied files. declare -r version="1.15.1" git clone -q --depth=1 https://github.com/mongodb/libmongocrypt --branch "${version:?}" || return declare -a crypt_cmake_flags=( "-DMONGOCRYPT_MONGOC_DIR=${mongoc_dir}" "-DBUILD_TESTING=OFF" "-DENABLE_ONLINE_TESTS=OFF" "-DENABLE_MONGOC=OFF" "-DBUILD_VERSION=${version:?}" ) . "$(dirname "${BASH_SOURCE[0]}")/find-ccache.sh" find_ccache_and_export_vars "$(pwd)/libmongocrypt" || true if command -v "${CMAKE_C_COMPILER_LAUNCHER:-}" && [[ "${OSTYPE:?}" == cygwin ]]; then crypt_cmake_flags+=( "-DCMAKE_POLICY_DEFAULT_CMP0141=NEW" "-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=Embedded" ) fi # Forward all extra arguments as extra CMake flags. crypt_cmake_flags+=("$@") env \ DEBUG="0" \ CMAKE_EXE="${cmake_binary:?}" \ MONGOCRYPT_INSTALL_PREFIX="${install_dir:?}" \ DEFAULT_BUILD_ONLY="true" \ LIBMONGOCRYPT_EXTRA_CMAKE_FLAGS="${crypt_cmake_flags[*]:?}" \ ./libmongocrypt/.evergreen/compile.sh || return } compile_libmongocrypt "${@}" mongo-c-driver-2.2.1/.evergreen/scripts/compile-openssl-static.sh000077500000000000000000000045211511661753600250450ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt CC check_var_opt CMAKE_GENERATOR "Ninja" check_var_opt CMAKE_GENERATOR_PLATFORM check_var_opt MARCH declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare cmake_prefix_path="${install_dir}" if [[ -n "${EXTRA_CMAKE_PREFIX_PATH:-}" ]]; then cmake_prefix_path+=";${EXTRA_CMAKE_PREFIX_PATH}" fi . "${script_dir:?}/install-build-tools.sh" install_build_tools cmake --version | head -n 1 echo "ninja version: $(ninja --version)" declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_SSL=OPENSSL" configure_flags_append "-DOPENSSL_USE_STATIC_LIBS=ON" declare -a flags case "${MARCH}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true cmake "${configure_flags[@]}" . cmake --build . mongo-c-driver-2.2.1/.evergreen/scripts/compile-scan-build.sh000077500000000000000000000123301511661753600241130ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare cmake_prefix_path="${install_dir}" . "${script_dir:?}/install-build-tools.sh" install_build_tools export CMAKE_GENERATOR="Ninja" declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_PREFIX_PATH=${cmake_prefix_path}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_SASL=OFF" configure_flags_append "-DENABLE_SNAPPY=OFF" configure_flags_append "-DENABLE_SSL=AUTO" # For Client Side Encryption. configure_flags_append "-DENABLE_ZLIB=OFF" configure_flags_append "-DENABLE_ZSTD=OFF" if [[ "${OSTYPE:?}" == darwin* ]]; then # Prevent CMake from confusing custom LLVM linker with Apple LLVM linker: # ld64.lld: warning: ignoring unknown argument: -search_paths_first # ld64.lld: warning: ignoring unknown argument: -headerpad_max_install_names # ld64.lld: warning: -sdk_version is required when emitting min version load command configure_flags_append "-DMONGO_USE_LLD=OFF" fi declare -a flags case "${MARCH:-}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE:-}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CC export CXX export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "$(command -v cmake)" "${mongoc_dir}" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # scan-build binary is available in different locations depending on the distro. # Search for a match in order of preference as listed. declare -a scan_build_directories # Prioritize Apple LLVM on MacOS to avoid confusing CMake with inconsistent # compilers and linkers. if [[ -d /usr/local/Cellar/llvm ]]; then for dir in /opt/homebrew/Cellar/llvm /usr/local/Cellar/llvm; do # Max depth: llvm/bin/scan-build. Sort: prefer newer versions. for bin in $(find "${dir}" -maxdepth 3 -name 'scan-build' 2>/dev/null | sort -rV); do if command -v "${bin}"; then scan_build_directories+=("$(dirname "${bin}")") fi done done fi if command -v scan-build && command -v clang && command -v clang++; then scan_build_binary="scan-build" CC="clang" CXX="clang++" else scan_build_directories+=( # Prefer toolchain scan-build if available. "/opt/mongodbtoolchain/v4/bin" "/opt/mongodbtoolchain/v3/bin" # Use system scan-build otherwise. "/usr/bin" ) declare scan_build_binary for dir in "${scan_build_directories[@]}"; do if command -v "${dir}/scan-build" && command -v "${dir}/clang" && command -v "${dir}/clang++"; then # Ensure compilers are consistent with scan-build binary. All three binaries # should be present in the same directory. scan_build_binary="${dir}/scan-build" CC="${dir}/clang" CXX="${dir}/clang++" break fi done fi : "${scan_build_binary:?"could not find a scan-build binary!"}" : "${CC:?}" : "${CXX:?}" # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true "${scan_build_binary}" --use-cc="${CC}" --use-c++="${CXX}" cmake "${configure_flags[@]}" . if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu; } fi # If scan-build emits warnings, continue the task and upload scan results before marking task as a failure. declare -r continue_command='{"status":"failed", "type":"test", "should_continue":true, "desc":"scan-build emitted one or more warnings or errors"}' # Put clang static analyzer results in scan/ and fail build if warnings found. "${scan_build_binary}" --use-cc="${CC}" --use-c++="${CXX}" -o scan --status-bugs cmake --build . -- -j "$(nproc)" || curl -sS -d "${continue_command}" -H "Content-Type: application/json" -X POST localhost:2285/task_status mongo-c-driver-2.2.1/.evergreen/scripts/compile-std.sh000077500000000000000000000153501511661753600226710ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt CC check_var_opt CMAKE_GENERATOR "Ninja" check_var_opt CMAKE_GENERATOR_PLATFORM check_var_req C_STD_VERSION check_var_opt CFLAGS check_var_opt CXXFLAGS check_var_opt MARCH declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare libmongocrypt_install_dir="${mongoc_dir}/libmongocrypt-install-dir" . "${script_dir:?}/install-build-tools.sh" install_build_tools declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } configure_flags_append "-DCMAKE_PREFIX_PATH=${libmongocrypt_install_dir:?}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" if [[ "${C_STD_VERSION}" == "latest" ]]; then [[ "${CMAKE_GENERATOR:-}" =~ "Visual Studio" ]] || { echo "C_STD_VERSION=latest to enable /std:clatest is only supported with Visual Studio generators" 1>&2 exit 1 } configure_flags_append "-DCMAKE_C_FLAGS=/std:clatest" else configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION}" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi if [[ "${CMAKE_GENERATOR:-}" =~ "Visual Studio" ]]; then # Avoid C standard conformance issues with Windows 10 SDK headers. # See: https://developercommunity.visualstudio.com/t/stdc17-generates-warning-compiling-windowsh/1249671#T-N1257345 configure_flags_append "-DCMAKE_SYSTEM_VERSION=10.0.20348.0" fi declare -a flags if [[ "${CMAKE_GENERATOR:-}" =~ "Visual Studio" ]]; then # Even with -DCMAKE_SYSTEM_VERSION=10.0.20348.0, winbase.h emits conformance warnings. flags+=('/wd5105') fi if [[ "${OSTYPE}" == darwin* ]]; then flags+=('-Wno-unknown-pragmas') fi # CMake and compiler environment variables. export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" declare mongoc_build_dir mongoc_install_dir mongoc_build_dir="cmake-build" mongoc_install_dir="cmake-install" configure_flags_append "-DCMAKE_INSTALL_PREFIX=${mongoc_install_dir:?}" # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi export CMAKE_BUILD_PARALLEL_LEVEL CMAKE_BUILD_PARALLEL_LEVEL="$(nproc)" if [[ "${CMAKE_GENERATOR:-}" =~ "Visual Studio" ]]; then # MSBuild needs additional assistance. # https://devblogs.microsoft.com/cppblog/improved-parallelism-in-msbuild/ export UseMultiToolTask=1 export EnforceProcessCountAcrossBuilds=1 fi echo "Checking requested C standard is supported..." pushd "$(mktemp -d)" cat >CMakeLists.txt <= version else() failure() # Both are old: latest < version endif() elseif(CMAKE_C_STANDARD_LATEST IN_LIST old_std_versions) failure() # latest (old) < version (new) elseif(c_std_version IN_LIST old_std_versions) success() # latest (new) >= version (old) elseif(CMAKE_C_STANDARD_LATEST GREATER_EQUAL c_std_version) success() # Both are new: latest >= version. else() failure() # Both are new: latest < version. endif() endif() DOC cmake -S . -B build popd # "$(tmpfile -d)" echo "Checking requested C standard is supported... done." echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "$(command -v cmake)" "${mongoc_dir}" "${libmongocrypt_install_dir:?}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true if command -v "${CMAKE_C_COMPILER_LAUNCHER:-}" && [[ "${OSTYPE:?}" == cygwin ]]; then configure_flags_append "-DCMAKE_POLICY_DEFAULT_CMP0141=NEW" configure_flags_append "-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=$<$:Embedded>" fi echo "CFLAGS: ${CFLAGS}" echo "configure_flags: ${configure_flags[*]}" if [[ "${CMAKE_GENERATOR:-}" =~ "Visual Studio" ]]; then all_target="ALL_BUILD" else all_target="all" fi # Ensure we're starting with a clean slate. rm -rf "${mongoc_build_dir:?}" "${mongoc_install_dir:?}" cmake -S . -B "${mongoc_build_dir:?}" "${configure_flags[@]}" cmake --build "${mongoc_build_dir:?}" --config Debug \ --target mongo_c_driver_tests \ --target mongo_c_driver_examples \ --target public-header-warnings \ --target "${all_target:?}" cmake --install "${mongoc_build_dir:?}" --config Debug # "lib" vs. "lib64" if [[ -d "${mongoc_install_dir:?}/lib64" ]]; then lib_dir="lib64" else lib_dir="lib" fi # This file should not be deleted! touch "${mongoc_install_dir:?}/${lib_dir:?}/canary.txt" # Linux/MacOS: uninstall.sh # Windows: uninstall.cmd cmake --build "${mongoc_build_dir:?}" --target uninstall # No files should remain except canary.txt. # No directories except top-level directories should remain. echo "Checking results of uninstall..." diff <(cd "${mongoc_install_dir:?}" && find . -mindepth 1 | sort) <( echo "./bin" echo "./include" echo "./${lib_dir:?}" echo "./${lib_dir:?}/canary.txt" echo "./share" ) echo "Checking results of uninstall... done." mongo-c-driver-2.2.1/.evergreen/scripts/compile-test-azurekms.sh000077500000000000000000000026041511661753600247130ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Working directory is expected to be mongo-c-driver repo. ROOT=$(pwd) INSTALL_DIR=$ROOT/install if [[ "${distro_id:?}" == "debian11-small" ]]; then # Temporary workaround for lack of uv on `debian11`. TODO: remove after DEVPROD-23011 is resolved. uv_dir="$(mktemp -d)" python3 -m virtualenv "${uv_dir:?}" # shellcheck source=/dev/null (. "${uv_dir:?}/bin/activate" && python -m pip install uv) PATH="${uv_dir:?}/bin:${PATH:-}" command -V uv >/dev/null fi . .evergreen/scripts/install-build-tools.sh install_build_tools export CMAKE_GENERATOR="Ninja" echo "Installing libmongocrypt ... begin" .evergreen/scripts/compile-libmongocrypt.sh "$(command -v cmake)" "$ROOT" "$INSTALL_DIR" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt ... end" # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true echo "Compile test-azurekms ... begin" # Disable unnecessary dependencies. test-azurekms is copied to a remote host for testing, which may not have all dependent libraries. cmake \ -DENABLE_SASL=OFF \ -DENABLE_SNAPPY=OFF \ -DENABLE_ZSTD=OFF \ -DENABLE_ZLIB=OFF \ -DENABLE_SRV=OFF \ -DENABLE_CLIENT_SIDE_ENCRYPTION=ON \ -DCMAKE_PREFIX_PATH="$INSTALL_DIR" \ . cmake --build . --target test-azurekms echo "Compile test-azurekms ... end" mongo-c-driver-2.2.1/.evergreen/scripts/compile-test-gcpkms.sh000077500000000000000000000020061511661753600243320ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Working directory is expected to be mongo-c-driver repo. ROOT=$(pwd) INSTALL_DIR=$ROOT/install . .evergreen/scripts/install-build-tools.sh install_build_tools export CMAKE_GENERATOR="Ninja" echo "Installing libmongocrypt ... begin" .evergreen/scripts/compile-libmongocrypt.sh "$(command -v cmake)" "$ROOT" "$INSTALL_DIR" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt ... end" # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true echo "Compile test-gcpkms ... begin" # Disable unnecessary dependencies. test-gcpkms is copied to a remote host for testing, which may not have all dependent libraries. cmake \ -DENABLE_SASL=OFF \ -DENABLE_SNAPPY=OFF \ -DENABLE_ZSTD=OFF \ -DENABLE_ZLIB=OFF \ -DENABLE_SRV=OFF \ -DENABLE_CLIENT_SIDE_ENCRYPTION=ON \ -DCMAKE_PREFIX_PATH="$INSTALL_DIR" \ . cmake --build . --target test-gcpkms echo "Compile test-gcpkms ... end" mongo-c-driver-2.2.1/.evergreen/scripts/compile-unix.sh000077500000000000000000000141221511661753600230560ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt C_STD_VERSION # CMake default: 99. check_var_opt CC check_var_opt CMAKE_GENERATOR "Ninja" check_var_opt CMAKE_GENERATOR_PLATFORM check_var_opt CFLAGS check_var_opt CHECK_LOG "OFF" check_var_opt COMPILE_LIBMONGOCRYPT "OFF" check_var_opt COVERAGE # CMake default: OFF. check_var_opt CXXFLAGS check_var_opt ENABLE_SHM_COUNTERS # CMake default: AUTO. check_var_opt EXTRA_CMAKE_PREFIX_PATH check_var_opt EXTRA_CONFIGURE_FLAGS check_var_opt ENABLE_RDTSCP "OFF" check_var_opt MARCH check_var_opt RELEASE "OFF" check_var_opt SANITIZE check_var_opt SASL "OFF" # CMake default: AUTO. check_var_opt SNAPPY # CMake default: AUTO. check_var_opt SRV # CMake default: AUTO. check_var_opt SSL "OFF" # CMake default: AUTO. check_var_opt TRACING # CMake default: OFF. check_var_opt ZLIB "BUNDLED" # CMake default: AUTO. check_var_opt ZSTD # CMake default: AUTO. declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" declare cmake_prefix_path="${install_dir}" if [[ -n "${EXTRA_CMAKE_PREFIX_PATH:-}" ]]; then cmake_prefix_path+=";${EXTRA_CMAKE_PREFIX_PATH}" fi . "${script_dir:?}/install-build-tools.sh" install_build_tools declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } ## * Note: For additional configure-time context, the following lines can be ## * uncommented to enable CMake's debug output: # configure_flags_append --log-level=debug # configure_flags_append --log-context configure_flags_append "-DCMAKE_INSTALL_PREFIX=${install_dir}" configure_flags_append "-DCMAKE_PREFIX_PATH=${cmake_prefix_path}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_HTML_DOCS=OFF" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append "-DENABLE_MAN_PAGES=OFF" configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION}" configure_flags_append_if_not_null ENABLE_RDTSCP "-DENABLE_RDTSCP=${ENABLE_RDTSCP}" configure_flags_append_if_not_null ENABLE_SHM_COUNTERS "-DENABLE_SHM_COUNTERS=${ENABLE_SHM_COUNTERS}" configure_flags_append_if_not_null SANITIZE "-DMONGO_SANITIZE=${SANITIZE}" configure_flags_append_if_not_null SASL "-DENABLE_SASL=${SASL}" configure_flags_append_if_not_null SNAPPY "-DENABLE_SNAPPY=${SNAPPY}" configure_flags_append_if_not_null SRV "-DENABLE_SRV=${SRV}" configure_flags_append_if_not_null TRACING "-DENABLE_TRACING=${TRACING}" configure_flags_append_if_not_null ZLIB "-DENABLE_ZLIB=${ZLIB}" if [[ "${RELEASE}" == "ON" ]]; then configure_flags_append "-DCMAKE_BUILD_TYPE=RelWithDebInfo" else configure_flags_append "-DCMAKE_BUILD_TYPE=Debug" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" fi configure_flags_append_if_not_null SSL "-DENABLE_SSL=${SSL:-}" if [[ "${COVERAGE}" == "ON" ]]; then configure_flags_append "-DENABLE_COVERAGE=ON" "-DENABLE_EXAMPLES=OFF" # Ensure no pre-existing and outdated coverage data is present prior to execution. find . -name '*.gcno' -o -name '*.gcda' -exec rm -f {} \+ # Avoid confusing gcov with potentially-mismatched source files. export CCACHE_DISABLE=1 fi declare -a flags case "${MARCH}" in i686) flags+=("-m32" "-march=i386") ;; esac case "${HOSTTYPE}" in s390x) flags+=("-march=z196" "-mtune=zEC12") ;; x86_64) flags+=("-m64" "-march=x86-64") ;; powerpc64le) flags+=("-mcpu=power8" "-mtune=power8" "-mcmodel=medium") ;; esac # CMake and compiler environment variables. export CFLAGS export CXXFLAGS CFLAGS+=" ${flags+${flags[*]}}" CXXFLAGS+=" ${flags+${flags[*]}}" if [[ "${OSTYPE}" == darwin* ]]; then CFLAGS+=" -Wno-unknown-pragmas" fi if [[ "${OSTYPE}" == darwin* && "${HOSTTYPE}" == "arm64" ]]; then configure_flags_append "-DCMAKE_OSX_ARCHITECTURES=arm64" fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" export PKG_CONFIG_PATH PKG_CONFIG_PATH="${install_dir}/lib/pkgconfig:${PKG_CONFIG_PATH:-}" if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi export CMAKE_BUILD_PARALLEL_LEVEL CMAKE_BUILD_PARALLEL_LEVEL="$(nproc)" declare -a extra_configure_flags IFS=' ' read -ra extra_configure_flags <<<"${EXTRA_CONFIGURE_FLAGS:-}" if [[ "${COMPILE_LIBMONGOCRYPT}" == "ON" ]]; then echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "$(command -v cmake)" "${mongoc_dir}" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Fail if the C driver is unable to find the installed libmongocrypt. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" else # Avoid symbol collisions with libmongocrypt installed via apt/yum. # Note: may be overwritten by ${EXTRA_CONFIGURE_FLAGS}. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=OFF" fi # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true declare build_dir build_dir="cmake-build" cmake -S . -B "${build_dir:?}" "${configure_flags[@]}" ${extra_configure_flags[@]+"${extra_configure_flags[@]}"} . cmake --build "${build_dir:?}" cmake --install "${build_dir:?}" # For use by test tasks, which directly use the binary directory contents. cmake --build "${build_dir:?}" --target mongo_c_driver_tests # Also validate examples. cmake --build "${build_dir:?}" --target mongo_c_driver_examples if [[ "$EXTRA_CONFIGURE_FLAGS" != *"ENABLE_MONGOC=OFF"* ]]; then # Check public headers for extra warnings. cmake --build "${build_dir:?}" --target public-header-warnings fi mongo-c-driver-2.2.1/.evergreen/scripts/compile-windows.sh000077500000000000000000000116511511661753600235710ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o igncr # Ignore CR in this script for Windows compatibility. # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt C_STD_VERSION # CMake default: 99. check_var_opt CC check_var_opt CMAKE_GENERATOR check_var_opt CMAKE_GENERATOR_PLATFORM check_var_opt COMPILE_LIBMONGOCRYPT "OFF" check_var_opt EXTRA_CONFIGURE_FLAGS check_var_opt RELEASE "OFF" check_var_opt SASL "SSPI" # CMake default: AUTO. check_var_opt SNAPPY # CMake default: AUTO. check_var_opt SRV # CMake default: AUTO. check_var_opt SSL "WINDOWS" # CMake default: OFF. check_var_opt ZSTD # CMake default: AUTO. check_var_opt ZLIB # CMake default: AUTO. declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" . "${script_dir:?}/install-build-tools.sh" install_build_tools declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append_if_not_null() { declare var="${1:?}" if [[ -n "${!var:-}" ]]; then shift configure_flags+=("${@:?}") fi } declare install_dir="${mongoc_dir}/install-dir" declare -a extra_configure_flags IFS=' ' read -ra extra_configure_flags <<<"${EXTRA_CONFIGURE_FLAGS:-}" ## * Note: For additional configure-time context, the following lines can be ## * uncommented to enable CMake's debug output: # configure_flags_append --log-level=debug # configure_flags_append --log-context configure_flags_append "-DCMAKE_INSTALL_PREFIX=$(native-path "${install_dir}")" configure_flags_append "-DCMAKE_PREFIX_PATH=$(native-path "${install_dir}")" configure_flags_append "-DENABLE_MAINTAINER_FLAGS=ON" configure_flags_append_if_not_null C_STD_VERSION "-DCMAKE_C_STANDARD=${C_STD_VERSION:-}" configure_flags_append_if_not_null SASL "-DENABLE_SASL=${SASL:-}" configure_flags_append_if_not_null SNAPPY "-DENABLE_SNAPPY=${SNAPPY:-}" configure_flags_append_if_not_null SRV "-DENABLE_SRV=${SRV:-}" configure_flags_append_if_not_null ZLIB "-DENABLE_ZLIB=${ZLIB:-}" declare build_config if [[ "${RELEASE}" == "ON" ]]; then build_config="RelWithDebInfo" else build_config="Debug" configure_flags_append "-DENABLE_DEBUG_ASSERTIONS=ON" fi configure_flags_append "-DCMAKE_BUILD_TYPE=${build_config:?}" configure_flags_append "-DENABLE_SSL=${SSL:-}" declare build_dir build_dir="cmake-build" # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true if [[ "${CC}" =~ 'gcc' ]]; then PATH="/cygdrive/c/ProgramData/chocolatey/lib/winlibs/tools/mingw64/bin:${PATH:-}" # mingw-w64 GCC export CMAKE_GENERATOR="Ninja" # MinGW has trouble compiling src/cpp-check.cpp without some assistance. configure_flags_append "-DCMAKE_CXX_STANDARD=11" # mingw-w64 doesn't like lld (hangs indefinitely?). configure_flags_append "-DMONGO_USE_LLD=OFF" cmake "${configure_flags[@]}" "${extra_configure_flags[@]}" -B "${build_dir:?}" cmake --build "${build_dir:?}" --target all mongo_c_driver_tests mongo_c_driver_examples else # MSBuild task-based parallelism (VS 2019 16.3 and newer). export UseMultiToolTask=true export EnforceProcessCountAcrossBuilds=true # MSBuild inter-project parallelism via CMake (3.26 and newer). export CMAKE_BUILD_PARALLEL_LEVEL CMAKE_BUILD_PARALLEL_LEVEL="$(nproc)" # /maxcpucount if [ "${COMPILE_LIBMONGOCRYPT}" = "ON" ]; then echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "$(command -v cmake)" "$(native-path "${mongoc_dir}")" "${install_dir}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Fail if the C driver is unable to find the installed libmongocrypt. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" fi if command -v "${CMAKE_C_COMPILER_LAUNCHER:-}" && [[ "${OSTYPE:?}" == cygwin ]]; then configure_flags_append "-DCMAKE_POLICY_DEFAULT_CMP0141=NEW" configure_flags_append "-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=$<$:Embedded>" fi cmake -S . -B "${build_dir:?}" "${configure_flags[@]}" "${extra_configure_flags[@]}" cmake --build "${build_dir:?}" --config "${build_config:?}" cmake --install "${build_dir:?}" --config "${build_config:?}" # For use by test tasks, which directly use the binary directory contents. cmake --build "${build_dir:?}" --config "${build_config:?}" --target mongo_c_driver_tests # Also validate examples. cmake --build "${build_dir:?}" --config "${build_config:?}" --target mongo_c_driver_examples if [[ "$EXTRA_CONFIGURE_FLAGS" != *"ENABLE_MONGOC=OFF"* ]]; then # Check public headers for extra warnings. cmake --build "${build_dir:?}" --config "${build_config:?}" --target public-header-warnings fi fi mongo-c-driver-2.2.1/.evergreen/scripts/compile.sh000077500000000000000000000002211511661753600220700ustar00rootroot00000000000000#!/usr/bin/env bash if [[ "${OSTYPE}" == "cygwin" ]]; then .evergreen/scripts/compile-windows.sh else .evergreen/scripts/compile-unix.sh fi mongo-c-driver-2.2.1/.evergreen/scripts/debian_package_build.sh000077500000000000000000000120131511661753600245160ustar00rootroot00000000000000#!/bin/sh # # Test libmongoc's Debian packaging scripts. # # Supported/used environment variables: # IS_PATCH If "true", this is an Evergreen patch build. set -o errexit on_exit() { if [ -e ./unstable-chroot/debootstrap/debootstrap.log ]; then echo "Dumping debootstrap.log (64-bit)" cat ./unstable-chroot/debootstrap/debootstrap.log fi if [ -e ./unstable-i386-chroot/debootstrap/debootstrap.log ]; then echo "Dumping debootstrap.log (32-bit)" cat ./unstable-i386-chroot/debootstrap/debootstrap.log fi } trap on_exit EXIT git config user.email "evergreen-build@example.com" git config user.name "Evergreen Build" if [ "${IS_PATCH}" = "true" ]; then git diff HEAD >../upstream.patch git clean -fdx git reset --hard HEAD git remote add upstream https://github.com/mongodb/mongo-c-driver git fetch upstream CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) git checkout upstream/debian/unstable git checkout ${CURRENT_BRANCH} git checkout upstream/debian/unstable -- ./debian/ if [ -s ../upstream.patch ]; then [ -d debian/patches ] || mkdir debian/patches mv ../upstream.patch debian/patches/ echo upstream.patch >>debian/patches/series git add debian/patches/* git commit -m 'Evergreen patch build - upstream changes' git log -n1 -p fi fi cd .. git clone https://salsa.debian.org/installer-team/debootstrap.git debootstrap.git export DEBOOTSTRAP_DIR=$(pwd)/debootstrap.git sudo -E ./debootstrap.git/debootstrap --variant=buildd unstable ./unstable-chroot/ http://cdn-aws.deb.debian.org/debian cp -a mongoc ./unstable-chroot/tmp/ sudo chroot ./unstable-chroot /bin/bash -c '(\ apt-get install -y build-essential quilt git-buildpackage fakeroot dpkg-dev debhelper cmake libssl-dev pkgconf python3-sphinx python3-sphinx-design furo libmongocrypt-dev zlib1g-dev libsasl2-dev libsnappy-dev libutf8proc-dev libzstd-dev libjs-mathjax python3-packaging && \ chown -R root:root /tmp/mongoc && \ cd /tmp/mongoc && \ git clean -fdx && \ git reset --hard HEAD && \ git remote remove upstream || true && \ git remote add upstream https://github.com/mongodb/mongo-c-driver && \ git fetch upstream && \ export CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" && \ git checkout upstream/debian/unstable && \ git checkout ${CURRENT_BRANCH} && \ git checkout upstream/debian/unstable -- ./debian/ && \ QUILT_PATCHES="debian/patches" quilt push -a --refresh && \ QUILT_PATCHES="debian/patches" quilt pop -a && rm -rf .pc/ && \ git commit -m "fetch debian directory from the debian/unstable branch" && \ LANG=C /bin/bash ./debian/build_snapshot.sh && \ debc ../*.changes && \ dpkg -i ../*.deb && \ gcc $(pkgconf --cflags bson2 mongoc2) -o example-client src/libmongoc/examples/example-client.c -lmongoc2 -lbson2 )' [ -e ./unstable-chroot/tmp/mongoc/example-client ] || ( echo "Example was not built!" exit 1 ) ( cd ./unstable-chroot/tmp/ tar zcvf ../../deb.tar.gz *.dsc *.orig.tar.gz *.debian.tar.xz *.build *.deb ) # Build a second time, to ensure a "double build" works sudo chroot ./unstable-chroot /bin/bash -c "(\ cd /tmp/mongoc && \ rm -f example-client && \ git status --ignored && \ dpkg-buildpackage -b && dpkg-buildpackage -S )" # And now do it all again for 32-bit sudo -E ./debootstrap.git/debootstrap --variant=buildd --arch i386 unstable ./unstable-i386-chroot/ http://cdn-aws.deb.debian.org/debian cp -a mongoc ./unstable-i386-chroot/tmp/ sudo chroot ./unstable-i386-chroot /bin/bash -c '(\ apt-get install -y build-essential quilt git-buildpackage fakeroot dpkg-dev debhelper cmake libssl-dev pkgconf python3-sphinx python3-sphinx-design furo libmongocrypt-dev zlib1g-dev libsasl2-dev libsnappy-dev libutf8proc-dev libzstd-dev libjs-mathjax && \ chown -R root:root /tmp/mongoc && \ cd /tmp/mongoc && \ git clean -fdx && \ git reset --hard HEAD && \ git remote remove upstream || true && \ git remote add upstream https://github.com/mongodb/mongo-c-driver && \ git fetch upstream && \ export CURRENT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" && \ git checkout upstream/debian/unstable && \ git checkout ${CURRENT_BRANCH} && \ git checkout upstream/debian/unstable -- ./debian/ && \ git commit -m "fetch debian directory from the debian/unstable branch" && \ QUILT_PATCHES="debian/patches" quilt push -a --refresh && \ QUILT_PATCHES="debian/patches" quilt pop -a && rm -rf .pc/ && \ LANG=C /bin/bash ./debian/build_snapshot.sh && \ debc ../*.changes && \ dpkg -i ../*.deb && \ gcc $(pkgconf --cflags bson2 mongoc2) -o example-client src/libmongoc/examples/example-client.c -lmongoc2 -lbson2 )' [ -e ./unstable-i386-chroot/tmp/mongoc/example-client ] || ( echo "Example was not built!" exit 1 ) ( cd ./unstable-i386-chroot/tmp/ tar zcvf ../../deb-i386.tar.gz *.dsc *.orig.tar.gz *.debian.tar.xz *.build *.deb ) # Build a second time, to ensure a "double build" works sudo chroot ./unstable-i386-chroot /bin/bash -c "(\ cd /tmp/mongoc && \ rm -f example-client && \ git status --ignored && \ dpkg-buildpackage -b && dpkg-buildpackage -S )" mongo-c-driver-2.2.1/.evergreen/scripts/debug-core-evergreen.sh000077500000000000000000000011641511661753600244430ustar00rootroot00000000000000#!/usr/bin/env bash if [[ "${OSTYPE}" == "cygwin" ]]; then echo "Skipping debug-core-evergreen.sh" exit fi shopt -s nullglob for i in *.core; do echo $i echo "backtrace full" | gdb -q ./cmake-build/src/libmongoc/test-libmongoc $i done # If there is still a test-libmongoc process running (perhaps due to # deadlock, or very slow test) attach a debugger and print stacks. TEST_LIBMONGOC_PID="$(pgrep test-libmongoc)" if [ -n "$TEST_LIBMONGOC_PID" ]; then echo "test-libmongoc processes still running with PID=$TEST_LIBMONGOC_PID" echo "backtrace full" | gdb -q -p $TEST_LIBMONGOC_PID kill $TEST_LIBMONGOC_PID fi mongo-c-driver-2.2.1/.evergreen/scripts/env-var-utils.sh000077500000000000000000000010171511661753600231600ustar00rootroot00000000000000#!/usr/bin/env bash # Usage: # print_var X print_var() { printf "%s: %s\n" "${1:?"print_var requires a variable to print"}" "${!1:-}" } # Usage: # check_var_opt X # check_var_opt X "default value" check_var_opt() { : "${1:?"check_var_opt requires a variable to check"}" printf -v "${1}" "%s" "${!1:-"${2:-}"}" print_var "${1}" } # Usage: # check_var_req X check_var_req() { : "${1:?"check_var_req requires a variable to check"}" : "${!1:?"required variable ${1} is unset or null!"}" print_var "${1}" } mongo-c-driver-2.2.1/.evergreen/scripts/find-ccache.sh000077500000000000000000000036411511661753600225750ustar00rootroot00000000000000#!/usr/bin/env bash find_ccache_check() { : "${1:?}" if command -v "${1:?}" >/dev/null; then declare version version="$("${1:?}" --version | head -n 1)" echo "Found ${1:?}: ${version:-}" 1>&2 echo "${1:?}" return 0 fi return 1 } # find_ccache # # Usage: # find_ccache # ccache_binary="$(find_ccache)" # ccache_binary="$(find_ccache 2>/dev/null)" # # Return 0 (true) if a ccache binary is found. # Return a non-zero (false) value otherwise. # # If successful, print the name of the ccache binary to stdout (pipe 1). # Otherwise, no output is printed to stdout. # # Diagnostic messages may be printed to stderr (pipe 2). Redirect to /dev/null # with `2>/dev/null` to silence these messages. find_ccache() { # Most distros provide ccache via system paths. { find_ccache_check ccache && return } || true # Some distros provide ccache via mongodbtoolchain. { find_ccache_check /opt/mongodbtoolchain/v4/bin/ccache && return } || { find_ccache_check /opt/mongodbtoolchain/v3/bin/ccache && return } || true # Could not find ccache. echo "Could not find a ccache binary." 1>&2 return 1 } # Find, export, and set ccache env vars in one command for convenience. # Requires base_dir as first argument. # Returns a non-zero (false) value if a ccache binary is not found. # Redirects find_ccache's stderr to stdout to avoid output sync issues on EVG. find_ccache_and_export_vars() { declare base_dir base_dir="${1:?"missing base_dir"}" declare ccache_binary ccache_binary="$(find_ccache)" 2>&1 || return export CMAKE_C_COMPILER_LAUNCHER="${ccache_binary:?}" export CMAKE_CXX_COMPILER_LAUNCHER="${ccache_binary:?}" # Allow reuse of ccache compilation results between different build directories. if [[ "${OSTYPE:?}" =~ cygwin ]]; then export CCACHE_BASEDIR="$(cygpath -aw ${base_dir:?})" else export CCACHE_BASEDIR="${base_dir:?}" fi export CCACHE_NOHASHDIR=1 } mongo-c-driver-2.2.1/.evergreen/scripts/install-build-tools.sh000077500000000000000000000020421511661753600243440ustar00rootroot00000000000000#!/usr/bin/env bash export_uv_tool_dirs() { UV_TOOL_DIR="$(pwd)/uv-tool" || return UV_TOOL_BIN_DIR="$(pwd)/uv-bin" || return PATH="${UV_TOOL_BIN_DIR:?}:${PATH:-}" # Windows requires "C:\path\to\dir" instead of "/cygdrive/c/path/to/dir" (PATH is automatically converted). if [[ "${OSTYPE:?}" == cygwin ]]; then UV_TOOL_DIR="$(cygpath -aw "${UV_TOOL_DIR:?}")" || return UV_TOOL_BIN_DIR="$(cygpath -aw "${UV_TOOL_BIN_DIR:?}")" || return fi export UV_TOOL_DIR UV_TOOL_BIN_DIR } install_build_tools() { export_uv_tool_dirs || return uv tool install -q cmake || return if [[ -f /etc/redhat-release ]]; then # Avoid strange "Could NOT find Threads" CMake configuration error on RHEL when using PyPI CMake, PyPI Ninja, and # C++20 or newer by using MongoDB Toolchain's Ninja binary instead. ln -sf /opt/mongodbtoolchain/v4/bin/ninja "${UV_TOOL_BIN_DIR:?}/ninja" || return else uv tool install -q ninja || return fi cmake --version | head -n 1 || return echo "ninja version: $(ninja --version)" || return } mongo-c-driver-2.2.1/.evergreen/scripts/install-libmongoc-after-libbson.sh000077500000000000000000000005101511661753600266030ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Install libbson only. EXTRA_CONFIGURE_FLAGS="-DENABLE_MONGOC=OFF" \ .evergreen/scripts/compile.sh # Install libmongoc using the system installed libbson. EXTRA_CONFIGURE_FLAGS="-DENABLE_MONGOC=ON -DUSE_SYSTEM_LIBBSON=ON" \ .evergreen/scripts/compile.sh mongo-c-driver-2.2.1/.evergreen/scripts/install-ssl.sh000077500000000000000000000052201511661753600227110ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt SSL "no" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare install_dir="${mongoc_dir}/install-dir" # Install OpenSSL library to separate install directory from normal # "install-ssl" directory to avoid interfering with OpenSSL requirements by # system binaries when install-dir/bin is prepended to $PATH. declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" declare -a ssl_extra_flags if [[ "${OSTYPE}" == darwin* ]]; then # MacOS does not have nproc. nproc() { sysctl -n hw.logicalcpu } fi # OpenSSL prior to 1.1.0 complains about "jobserver unavailable" if explicit N # is given to `-j` then defaults to N=1. Prefer unbounded parallelism over # none instead. declare njobs njobs="$(nproc)" build_target_if_exists() { if make -n "${1:?}" 2>/dev/null; then make -s "${@}" fi } install_openssl() { declare ssl_version="${SSL##openssl-}" declare tmp tmp="$(echo "${ssl_version:?}" | tr . _)" curl -L --retry 5 -o ssl.tar.gz "https://github.com/openssl/openssl/releases/download/OpenSSL_${tmp}/openssl-${ssl_version}.tar.gz" tar zxf ssl.tar.gz pushd "openssl-${ssl_version}" ( set -o xtrace ./config --prefix="${openssl_install_dir}" "${ssl_extra_flags[@]}" shared -fPIC make -j depend build_target_if_exists "build_crypto" # <1.1.0; parallel is broken. build_target_if_exists "build_engines" "-j" # <1.1.0 build_target_if_exists "build_ssl" "-j" # <1.1.0 build_target_if_exists "build_libs" "-j" # <1.1.0 make -j make install_sw ) >/dev/null popd # "openssl-${ssl_version}" } install_openssl_fips() { curl -L --retry 5 -o fips.tar.gz https://github.com/openssl/openssl/releases/download/OpenSSL-fips-2_0_16/openssl-fips-2.0.16.tar.gz tar zxf fips.tar.gz pushd openssl-fips-2.0.16 ( set -o xtrace ./config --prefix="${openssl_install_dir}" -fPIC make -j build_crypto make build_fips # Parallel is broken. make install_sw ) >/dev/null popd # openssl-fips-2.0.16 ssl_extra_flags=("--openssldir=${openssl_install_dir}" "--with-fipsdir=${openssl_install_dir}" "fips") SSL="${SSL%-fips}" install_openssl } case "${SSL}" in openssl-*-fips) export LC_ALL LC_ALL="C" # Silence perl locale warnings. install_openssl_fips ;; openssl-*) export LC_ALL LC_ALL="C" # Silence perl locale warnings. install_openssl ;; esac mongo-c-driver-2.2.1/.evergreen/scripts/integration-tests.sh000077500000000000000000000051571511661753600241400ustar00rootroot00000000000000#!/usr/bin/env bash # # Start up mongo-orchestration (a server to spawn mongodb clusters) and set up a cluster. # # Specify the following environment variables: # # MONGODB_VERSION: latest, 4.2, 4.0 # TOPOLOGY: server, replica_set, sharded_cluster # AUTH: auth, noauth # SSL: openssl, darwinssl, winssl, nossl # ORCHESTRATION_FILE: # REQUIRE_API_VERSION: set to a non-empty string to set the requireApiVersion parameter # This is currently only supported for standalone servers # LOAD_BALANCER: off, on # # This script may be run locally. # set -o errexit # Exit the script with error if any of the commands fail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]:?}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]:?}")/use-tools.sh" paths : "${AUTH:="noauth"}" : "${LOAD_BALANCER:="off"}" : "${MONGODB_VERSION:="latest"}" : "${ORCHESTRATION_FILE:-}" : "${REQUIRE_API_VERSION:-}" : "${SSL:="nossl"}" : "${TOPOLOGY:="server"}" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]:?}")")" # By fetch-det. export DRIVERS_TOOLS DRIVERS_TOOLS="$(cd ../drivers-evergreen-tools && pwd)" # ./mongoc -> ./drivers-evergreen-tools if [[ "${OSTYPE:?}" == cygwin ]]; then DRIVERS_TOOLS="$(cygpath -m "${DRIVERS_TOOLS:?}")" fi export MONGO_ORCHESTRATION_HOME="${DRIVERS_TOOLS:?}/.evergreen/orchestration" export MONGODB_BINARIES="${DRIVERS_TOOLS:?}/mongodb/bin" export PATH="${MONGODB_BINARIES:?}:$PATH" # Workaround absence of `tls=true` URI in the `mongodb_auth_uri` field returned by mongo orchestration. if [[ -n "${REQUIRE_API_VERSION:-}" && "${SSL:?}" != nossl ]]; then prev='$MONGODB_BINARIES/mongosh $URI $MONGO_ORCHESTRATION_HOME/require-api-version.js' # Use `--tlsAllowInvalidCertificates` to avoid self-signed certificate errors. next='$MONGODB_BINARIES/mongosh --tls --tlsAllowInvalidCertificates $URI $MONGO_ORCHESTRATION_HOME/require-api-version.js' sed -i -e "s|${prev:?}|${next:?}|" "${DRIVERS_TOOLS:?}/.evergreen/run-orchestration.sh" fi "${DRIVERS_TOOLS:?}/.evergreen/run-orchestration.sh" echo "Waiting for mongo-orchestration to start..." wait_for_mongo_orchestration() { declare port="${1:?"wait_for_mongo_orchestration requires a server port"}" for _ in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s --max-time 1 "localhost:${port:?}" >/dev/null test $? -ne 7 then return 0 else sleep 1 fi done echo "Could not detect mongo-orchestration on port ${port:?}" return 1 } wait_for_mongo_orchestration 8889 echo "Waiting for mongo-orchestration to start... done." mongo-c-driver-2.2.1/.evergreen/scripts/kms-divergence-check.sh000077500000000000000000000020771511661753600244310ustar00rootroot00000000000000#!/usr/bin/env bash # kms-divergence-check.sh checks that the vendored copy of kms-message does not # have additional changes not present in https://github.com/mongodb/libmongocrypt. set -o errexit # shellcheck source=.evergreen/scripts/use-tools.sh . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths # `paths` defines `MONGOC_DIR`. LIBMONGOCRYPT_DIR="$MONGOC_DIR/libmongocrypt-for-kms-divergence-check" # LIBMONGOCRYPT_GITREF is expected to refer to the version of libmongocrypt # where kms-message was last copied. LIBMONGOCRYPT_GITREF="9fff64216c06099401e2b3b2d5becb77bc17803d" cleanup() { if [ -d "$LIBMONGOCRYPT_DIR" ]; then rm -rf "$LIBMONGOCRYPT_DIR" fi } cleanup trap cleanup EXIT git clone -q https://github.com/mongodb/libmongocrypt "$LIBMONGOCRYPT_DIR" cd "$LIBMONGOCRYPT_DIR" git checkout "$LIBMONGOCRYPT_GITREF" --quiet if ! diff -uNr "$LIBMONGOCRYPT_DIR/kms-message/" "$MONGOC_DIR/src/kms-message/"; then echo "Unexpected differences found in KMS sources!" exit 1 else echo "No changes detected from KMS message at commit $LIBMONGOCRYPT_GITREF" fi mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program-bson.sh000077500000000000000000000055401511661753600252710ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail # Supported/used environment variables: # LINK_STATIC Whether to statically link to libbson # BUILD_SAMPLE_WITH_CMAKE Link program w/ CMake. Default: use pkg-config. echo "LINK_STATIC=$LINK_STATIC BUILD_SAMPLE_WITH_CMAKE=$BUILD_SAMPLE_WITH_CMAKE" DIR=$(dirname $0) . "${DIR:?}/install-build-tools.sh" install_build_tools export CMAKE_GENERATOR="Ninja" # The major version of the project. Appears in certain install filenames. _full_version=$(cat "$DIR/../../VERSION_CURRENT") version="${_full_version%-*}" # 1.2.3-dev → 1.2.3 major="${version%%.*}" # 1.2.3 → 1 echo "major version: $major" echo " full version: $version" # Get the kernel name, lowercased OS=$(uname -s | tr '[:upper:]' '[:lower:]') echo "OS: $OS" if [ "$OS" = "darwin" ]; then LDD="otool -L" else LDD=ldd fi SRCROOT=$(pwd) SCRATCH_DIR=$(pwd)/.scratch rm -rf "$SCRATCH_DIR" mkdir -p "$SCRATCH_DIR" cp -r -- "$SRCROOT"/* "$SCRATCH_DIR" BUILD_DIR=$SCRATCH_DIR/build-dir rm -rf $BUILD_DIR mkdir $BUILD_DIR INSTALL_DIR=$SCRATCH_DIR/install-dir rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR cd $BUILD_DIR # Use ccache if able. if [[ -f $DIR/find-ccache.sh ]]; then . $DIR/find-ccache.sh find_ccache_and_export_vars "$SCRATCH_DIR" || true fi if [ "$LINK_STATIC" ]; then # Our CMake system builds shared and static by default. cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DBUILD_TESTING=OFF -DENABLE_TESTS=OFF -DENABLE_MONGOC=OFF "$SCRATCH_DIR" cmake --build . --parallel cmake --build . --parallel --target install else cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DBUILD_TESTING=OFF -DENABLE_TESTS=OFF -DENABLE_MONGOC=OFF -DENABLE_STATIC=OFF "$SCRATCH_DIR" cmake --build . --parallel cmake --build . --parallel --target install fi # Revert ccache options, they no longer apply. unset CCACHE_BASEDIR CCACHE_NOHASHDIR ls -l $INSTALL_DIR/lib cd $SRCROOT if [ "$BUILD_SAMPLE_WITH_CMAKE" ]; then EXAMPLE_DIR=$SRCROOT/src/libbson/examples/cmake/find_package if [ "$LINK_STATIC" ]; then EXAMPLE_DIR="${EXAMPLE_DIR}_static" fi cd $EXAMPLE_DIR cmake -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake . cmake --build . --parallel else # Test our pkg-config file. export PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig cd $SRCROOT/src/libbson/examples if [ "$LINK_STATIC" ]; then echo "pkg-config output:" echo $(pkg-config --libs --cflags bson$major-static) env major=$major ./compile-with-pkg-config-static.sh else echo "pkg-config output:" echo $(pkg-config --libs --cflags bson$major) env major=$major ./compile-with-pkg-config.sh fi fi if [ ! "$LINK_STATIC" ]; then if [ "$OS" = "darwin" ]; then export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib else export LD_LIBRARY_PATH=$INSTALL_DIR/lib fi fi echo "ldd hello_bson:" $LDD hello_bson ./hello_bson mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program-mingw-bson.cmd000077500000000000000000000032231511661753600265350ustar00rootroot00000000000000rem Load environment for Visual Studio 15 2017. rem https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-150 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat" || goto :error echo on echo set TAR=C:\cygwin\bin\tar set LINK_STATIC=1 set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% 2>nul || true mkdir %BUILD_DIR% || goto :error set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% 2>nul || true mkdir %INSTALL_DIR% || goto :error set PATH=%PATH%;%INSTALL_DIR%\bin set major=1 set version=1.31.0 cd %BUILD_DIR% || goto :error rem Build libmongoc, with flags that the downstream R driver mongolite uses uvx cmake -G "Ninja" -DMONGO_USE_LLD=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_C_FLAGS="-pedantic" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DENABLE_STATIC=ON .. || goto :error uvx cmake --build . --parallel || goto :error uvx cmake --build . --target install || goto :error rem Test our pkg-config file set EXAMPLE_DIR=%SRCROOT%\src\libbson\examples\ cd %EXAMPLE_DIR% || goto :error rem Proceed from here once we have pkg-config on Windows exit /B 0 set PKG_CONFIG_PATH=%INSTALL_DIR%\lib\pkgconfig rem http://stackoverflow.com/questions/2323292 for /f %%i in ('pkg-config --libs --cflags bson%major%') do set PKG_CONFIG_OUT=%%i echo PKG_CONFIG_OUT is %PKG_CONFIG_OUT% %CC% -o hello_bson hello_bson.c %PKG_CONFIG_OUT% || goto :error dumpbin.exe /dependents Debug\hello_bson.exe || goto :error rem Add DLLs to PATH set PATH=%PATH%;%INSTALL_DIR%\bin Debug\hello_bson.exe %MONGODB_EXAMPLE_URI% || goto :error goto :EOF :error exit /B %errorlevel% mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program-mingw.cmd000077500000000000000000000034051511661753600256000ustar00rootroot00000000000000rem Load environment for Visual Studio 15 2017. rem https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-150 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat" || goto :error echo on echo rem Use DENABLE_SSL=OFF. Windows hosts do not have a MinGW ABI compatible OpenSSL install. set CMAKE_FLAGS=-DENABLE_SSL=OFF -DENABLE_SASL=CYRUS set TAR=C:\cygwin\bin\tar set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% 2>nul || true mkdir %BUILD_DIR% || goto :error set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% 2>nul || true mkdir %INSTALL_DIR% || goto :error set PATH=%PATH%;%INSTALL_DIR%\bin set major=1 cd %BUILD_DIR% || goto :error rem Build libmongoc, with flags that the downstream R driver mongolite uses uvx cmake -G "Ninja" -DMONGO_USE_LLD=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_C_FLAGS="-pedantic" -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake %CMAKE_FLAGS% .. || goto :error uvx cmake --build . --parallel || goto :error uvx cmake --build . --target install || goto :error rem Test our pkg-config file set EXAMPLE_DIR=%SRCROOT%\src\libmongoc\examples\ cd %EXAMPLE_DIR% || goto :error rem Proceed from here once we have pkg-config on Windows exit /B 0 set PKG_CONFIG_PATH=%INSTALL_DIR%\lib\pkgconfig rem http://stackoverflow.com/questions/2323292 for /f %%i in ('pkg-config --libs --cflags mongoc%major%') do set PKG_CONFIG_OUT=%%i echo PKG_CONFIG_OUT is %PKG_CONFIG_OUT% %CC% -o hello_mongoc hello_mongoc.c %PKG_CONFIG_OUT% || goto :error dumpbin.exe /dependents Debug\hello_mongoc.exe || goto :error rem Add DLLs to PATH set PATH=%PATH%;%INSTALL_DIR%\bin Debug\hello_mongoc.exe %MONGODB_EXAMPLE_URI% || goto :error goto :EOF :error exit /B %errorlevel% mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program-msvc-bson.cmd000077500000000000000000000035161511661753600263710ustar00rootroot00000000000000REM Supported/used environment variables: REM LINK_STATIC Whether to statically link to libbson rem Ensure Cygwin executables like sh.exe are not in PATH rem set PATH=C:\Windows\system32;C:\Windows rem Load environment for Visual Studio 15 2017. rem https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-150 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat" || goto :error echo on echo set TAR=C:\cygwin\bin\tar set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% 2>nul || true mkdir %BUILD_DIR% || goto :error set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% 2>nul || true mkdir %INSTALL_DIR% || goto :error set PATH=%PATH%;%INSTALL_DIR%\bin cd %BUILD_DIR% || goto :error if "%LINK_STATIC%"=="1" ( uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_TESTS=OFF .. || goto :error ) else ( uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_TESTS=OFF -DENABLE_STATIC=OFF .. || goto :error ) uvx cmake --build . --config "Debug" --target ALL_BUILD -- /m || goto :error uvx cmake --build . --config "Debug" --target INSTALL -- /m || goto :error rem Test our CMake package config file with CMake's find_package command. set EXAMPLE_DIR=%SRCROOT%\src\libbson\examples\cmake\find_package if "%LINK_STATIC%"=="1" ( set EXAMPLE_DIR="%EXAMPLE_DIR%_static" ) cd %EXAMPLE_DIR% || goto :error uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake . || goto :error uvx cmake --build . --config "Debug" --target ALL_BUILD -- /m || goto :error rem Yes, they should've named it "dependencies". dumpbin.exe /dependents Debug\hello_bson.exe || goto :error Debug\hello_bson.exe || goto :error goto :EOF :error exit /B %errorlevel% mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program-msvc.cmd000077500000000000000000000060631511661753600254320ustar00rootroot00000000000000REM Supported/used environment variables: REM LINK_STATIC Whether to statically link to libmongoc REM ENABLE_SSL Enable SSL with Microsoft Secure Channel REM ENABLE_SNAPPY Enable Snappy compression rem Ensure Cygwin executables like sh.exe are not in PATH rem set PATH=C:\Windows\system32;C:\Windows rem Load environment for Visual Studio 15 2017. rem https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-150 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvars64.bat" || goto :error echo on echo set TAR=C:\cygwin\bin\tar set SRCROOT=%CD% set BUILD_DIR=%CD%\build-dir rmdir /S /Q %BUILD_DIR% 2>nul || true mkdir %BUILD_DIR% || goto :error set INSTALL_DIR=%CD%\install-dir rmdir /S /Q %INSTALL_DIR% 2>nul || true mkdir %INSTALL_DIR% || goto :error set PATH=%PATH%;%INSTALL_DIR%\bin cd %BUILD_DIR% || goto :error if "%ENABLE_SNAPPY%"=="1" ( rem Enable Snappy curl -sS --retry 5 -LO https://github.com/google/snappy/archive/1.1.7.tar.gz || goto :error %TAR% xzf 1.1.7.tar.gz || goto :error cd snappy-1.1.7 || goto :error uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -S snappy-1.1.7 -B snappy-1.1.7-build || goto :error uvx cmake --build snappy-1.1.7-build --config "Debug" --target ALL_BUILD -- /m || goto :error uvx cmake --build snappy-1.1.7-build --config "Debug" --target INSTALL -- /m || goto :error set SNAPPY_OPTION=-DENABLE_SNAPPY=ON ) else ( set SNAPPY_OPTION=-DENABLE_SNAPPY=OFF ) cd %BUILD_DIR% || goto :error rem Build libmongoc if "%ENABLE_SSL%"=="1" ( uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_SSL=WINDOWS %ENABLE_SNAPPY_OPTION% .. || goto :error ) else ( uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DENABLE_SSL=OFF %ENABLE_SNAPPY_OPTION% .. || goto :error ) uvx cmake --build . --config "Debug" --target ALL_BUILD -- /m || goto :error uvx cmake --build . --config "Debug" --target INSTALL -- /m || goto :error rem Test our CMake package config file with CMake's find_package command. set EXAMPLE_DIR=%SRCROOT%\src\libmongoc\examples\cmake\find_package if "%LINK_STATIC%"=="1" ( set EXAMPLE_DIR="%EXAMPLE_DIR%_static" ) cd %EXAMPLE_DIR% || goto :error if "%ENABLE_SSL%"=="1" ( cp ..\..\..\tests\x509gen\client.pem . || goto :error cp ..\..\..\tests\x509gen\ca.pem . || goto :error set MONGODB_EXAMPLE_URI="mongodb://localhost/?ssl=true&sslclientcertificatekeyfile=client.pem&sslcertificateauthorityfile=ca.pem&sslallowinvalidhostnames=true" ) uvx cmake -G "Visual Studio 15 2017" -A x64 -DCMAKE_PREFIX_PATH=%INSTALL_DIR%\lib\cmake . || goto :error uvx cmake --build . --config "Debug" --target ALL_BUILD -- /m || goto :error rem Yes, they should've named it "dependencies". dumpbin.exe /dependents Debug\hello_mongoc.exe || goto :error Debug\hello_mongoc.exe %MONGODB_EXAMPLE_URI% || goto :error goto :EOF :error exit /B %errorlevel% mongo-c-driver-2.2.1/.evergreen/scripts/link-sample-program.sh000077500000000000000000000101461511661753600243300ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail # Supported/used environment variables: # LINK_STATIC Whether to statically link to libmongoc # BUILD_SAMPLE_WITH_CMAKE Link program w/ CMake. Default: use pkg-config. # ENABLE_SSL Set -DENABLE_SSL # ENABLE_SNAPPY Set -DENABLE_SNAPPY # CMAKE Path to cmake executable. echo "LINK_STATIC=$LINK_STATIC BUILD_SAMPLE_WITH_CMAKE=$BUILD_SAMPLE_WITH_CMAKE" DIR=$(dirname $0) . "${DIR:?}/install-build-tools.sh" install_build_tools export CMAKE_GENERATOR="Ninja" # The major version of the project. Appears in certain install filenames. _full_version=$(cat "$DIR/../../VERSION_CURRENT") version="${_full_version%-*}" # 1.2.3-dev → 1.2.3 major="${version%%.*}" # 1.2.3 → 1 echo "major version: $major" echo " full version: $version" # Get the kernel name, lowercased OS=$(uname -s | tr '[:upper:]' '[:lower:]') echo "OS: $OS" if [ "$OS" = "darwin" ]; then LDD="otool -L" else LDD=ldd fi SRCROOT=$(pwd) SCRATCH_DIR=$(pwd)/.scratch rm -rf "$SCRATCH_DIR" mkdir -p "$SCRATCH_DIR" cp -r -- "$SRCROOT"/* "$SCRATCH_DIR" BUILD_DIR=$SCRATCH_DIR/build-dir rm -rf $BUILD_DIR mkdir $BUILD_DIR INSTALL_DIR=$SCRATCH_DIR/install-dir rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR cd $BUILD_DIR # Use ccache if able. if [[ -f $DIR/find-ccache.sh ]]; then . $DIR/find-ccache.sh find_ccache_and_export_vars "$SCRATCH_DIR" || true if command -v "${CMAKE_C_COMPILER_LAUNCHER:-}" && [[ "${OSTYPE:?}" == cygwin ]]; then configure_flags_append "-DCMAKE_POLICY_DEFAULT_CMP0141=NEW" configure_flags_append "-DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=$<$:Embedded>" fi fi if [ "$ENABLE_SNAPPY" ]; then SNAPPY_CMAKE_OPTION="-DENABLE_SNAPPY=ON" else SNAPPY_CMAKE_OPTION="-DENABLE_SNAPPY=OFF" fi if [ "$ENABLE_SSL" ]; then if [ "$OS" = "darwin" ]; then SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=DARWIN" else SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=OPENSSL" fi else SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=OFF" fi if [ "$LINK_STATIC" ]; then STATIC_CMAKE_OPTION="-DENABLE_STATIC=ON -DENABLE_TESTS=ON" else STATIC_CMAKE_OPTION="-DENABLE_STATIC=OFF -DENABLE_TESTS=OFF" fi ZSTD="AUTO" cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake -DBUILD_TESTING=OFF $SSL_CMAKE_OPTION $SNAPPY_CMAKE_OPTION $STATIC_CMAKE_OPTION -DENABLE_ZSTD=$ZSTD "$SCRATCH_DIR" cmake --build . --parallel cmake --build . --parallel --target install # Revert ccache options, they no longer apply. unset CCACHE_BASEDIR CCACHE_NOHASHDIR ls -l $INSTALL_DIR/lib if [ "$OS" = "darwin" ] && [ "${HOSTTYPE:?}" != "arm64" ]; then if test -f $INSTALL_DIR/bin/mongoc$major-stat; then echo "mongoc$major-stat shouldn't have been installed" exit 1 fi else if test ! -f $INSTALL_DIR/bin/mongoc$major-stat; then echo "mongoc$major-stat missing!" exit 1 else echo "mongoc$major-stat check ok" fi fi if [ "$BUILD_SAMPLE_WITH_CMAKE" ]; then # Test our CMake package config file with CMake's find_package command. if [ "$BUILD_SAMPLE_WITH_CMAKE_DEPRECATED" ]; then EXAMPLE_DIR=$SRCROOT/src/libmongoc/examples/cmake-deprecated/find_package else EXAMPLE_DIR=$SRCROOT/src/libmongoc/examples/cmake/find_package fi if [ "$LINK_STATIC" ]; then EXAMPLE_DIR="${EXAMPLE_DIR}_static" fi cd $EXAMPLE_DIR cmake -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake . cmake --build . else # Test our pkg-config file. export PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig cd $SRCROOT/src/libmongoc/examples if [ "$LINK_STATIC" ]; then echo "pkg-config output:" echo $(pkg-config --libs --cflags mongoc$major-static) env major=$major ./compile-with-pkg-config-static.sh else echo "pkg-config output:" echo $(pkg-config --libs --cflags mongoc$major) env major=$major ./compile-with-pkg-config.sh fi fi if [ ! "$LINK_STATIC" ]; then if [ "$OS" = "darwin" ]; then export DYLD_LIBRARY_PATH=$INSTALL_DIR/lib else export LD_LIBRARY_PATH=$INSTALL_DIR/lib fi fi echo "ldd hello_mongoc:" $LDD hello_mongoc ./hello_mongoc mongo-c-driver-2.2.1/.evergreen/scripts/llvm-gcov.sh000077500000000000000000000000551511661753600223530ustar00rootroot00000000000000#!/usr/bin/env bash exec llvm-cov gcov "$@" mongo-c-driver-2.2.1/.evergreen/scripts/man-pages-to-html.sh000077500000000000000000000021161511661753600236770ustar00rootroot00000000000000#!/usr/bin/env bash # Make HTML page of all man pages so we can see them in Evergreen. # # Command-line positional parameters: # # LIBNAME bson or mongoc, for the page title # DIRECTORY path to .3 files # # Is the "aha" program in CWD or installed systemwide? if [ -e "aha" ]; then AHA="./aha" else AHA="aha" fi echo " $1 man pages
    "
    
    for doc in $2/*.3; do
      fullpath=$(pwd)/$doc
      name=$(basename $doc)
    
      if [ ! -e "$fullpath" ]; then
        >&2 echo "No .3 files in $2!"
        exit 1
      fi
    
      echo "
    $name

    "
    
      # suppress man's warnings "cannot break line" or "cannot adjust line"
      MAN_KEEP_FORMATTING=1 COLUMNS=80 man "$fullpath" 2>/dev/null | ul -t xterm | "$AHA" --no-header
    
      echo "

    " done echo "
    " mongo-c-driver-2.2.1/.evergreen/scripts/oidc-azure-compile.sh000077500000000000000000000031721511661753600241400ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset if [[ "${distro_id:?}" == "debian11-small" ]]; then # Temporary workaround for lack of uv on `debian11`. TODO: remove after DEVPROD-23011 is resolved. uv_dir="$(mktemp -d)" python3 -m virtualenv "${uv_dir:?}" # shellcheck source=/dev/null (. "${uv_dir:?}/bin/activate" && python -m pip install uv) PATH="${uv_dir:?}/bin:${PATH:-}" command -V uv >/dev/null fi . .evergreen/scripts/install-build-tools.sh install_build_tools export CMAKE_GENERATOR="Ninja" # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true echo "Compile test-libmongoc ... begin" # Disable unnecessary dependencies. test-libmongoc is copied to a remote host for testing, which may not have all dependent libraries. cmake_flags=( -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_ZLIB=OFF -DENABLE_SRV=OFF -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF -DENABLE_EXAMPLES=OFF -DENABLE_SRV=OFF ) cmake "${cmake_flags[@]}" -Bcmake-build cmake --build cmake-build --target test-libmongoc echo "Compile test-libmongoc ... end" # Create tarball for remote testing. echo "Creating test-libmongoc tarball ... begin" # Copy test binary and JSON test files. All JSON test files are needed to start test-libmongoc. files=( .evergreen/scripts/oidc-azure-test.sh cmake-build/src/libmongoc/test-libmongoc src/libmongoc/tests/json src/libbson/tests/json ) tar -czf test-libmongoc.tar.gz "${files[@]}" echo "Creating test-libmongoc tarball ... end" cat <oidc-remote-test-expansion.yml OIDC_TEST_TARBALL: $(pwd)/test-libmongoc.tar.gz EOT mongo-c-driver-2.2.1/.evergreen/scripts/oidc-azure-test.sh000066400000000000000000000006111511661753600234570ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset export MONGOC_TEST_OIDC="ON" export MONGOC_TEST_USER="$OIDC_ADMIN_USER" export MONGOC_TEST_PASSWORD="$OIDC_ADMIN_PWD" export MONGOC_AZURE_RESOURCE="$AZUREOIDC_RESOURCE" # Install required OpenSSL runtime library. sudo apt install -y libssl-dev ./cmake-build/src/libmongoc/test-libmongoc -d -l '/auth/unified/*' -l '/oidc/*' mongo-c-driver-2.2.1/.evergreen/scripts/oidc-gcp-compile.sh000077500000000000000000000031311511661753600235560ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset if [[ "${distro_id:?}" == "debian11-small" ]]; then # Temporary workaround for lack of uv on `debian11`. TODO: remove after DEVPROD-23011 is resolved. uv_dir="$(mktemp -d)" python3 -m virtualenv "${uv_dir:?}" # shellcheck source=/dev/null (. "${uv_dir:?}/bin/activate" && python -m pip install uv) PATH="${uv_dir:?}/bin:${PATH:-}" command -V uv >/dev/null fi . .evergreen/scripts/install-build-tools.sh install_build_tools export CMAKE_GENERATOR="Ninja" # Use ccache if able. . .evergreen/scripts/find-ccache.sh find_ccache_and_export_vars "$(pwd)" || true echo "Compile mongoc-ping ... begin" # Disable unnecessary dependencies. mongoc-ping is copied to a remote host for testing, which may not have all dependent libraries. cmake_flags=( -DENABLE_SASL=OFF -DENABLE_SNAPPY=OFF -DENABLE_ZSTD=OFF -DENABLE_ZLIB=OFF -DENABLE_SRV=ON # To support mongodb+srv URIs -DENABLE_CLIENT_SIDE_ENCRYPTION=OFF -DENABLE_EXAMPLES=ON # To build mongoc-ping ) cmake "${cmake_flags[@]}" -Bcmake-build cmake --build cmake-build --target mongoc-ping echo "Compile mongoc-ping ... end" # Create tarball for remote testing. echo "Creating mongoc-ping tarball ... begin" # Copy test binary and test script. files=( .evergreen/scripts/oidc-gcp-test.sh cmake-build/src/libmongoc/libmongoc2* cmake-build/src/libbson/libbson2* cmake-build/src/libmongoc/mongoc-ping ) tar -czf mongoc-ping.tar.gz "${files[@]}" echo "Creating mongoc-ping tarball ... end" cat <oidc-remote-test-expansion.yml OIDC_TEST_TARBALL: $(pwd)/mongoc-ping.tar.gz EOT mongo-c-driver-2.2.1/.evergreen/scripts/oidc-gcp-test.sh000066400000000000000000000017401511661753600231060ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Install required OpenSSL runtime library. sudo apt install -y libssl-dev mongoc_ping=./cmake-build/src/libmongoc/mongoc-ping export LD_LIBRARY_PATH LD_LIBRARY_PATH="$(pwd)/cmake-build/src/libmongoc:$(pwd)/cmake-build/src/libbson:${LD_LIBRARY_PATH:-}" echo "Testing good auth ..." if ! "$mongoc_ping" "$MONGODB_URI?authMechanism=MONGODB-OIDC&authSource=%24external&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:$GCPOIDC_AUDIENCE" &>output.txt; then echo "mongoc-ping failed to authenticate using OIDC in GCP" 1>&2 cat output.txt 1>&2 exit 1 fi echo "Testing good auth ... done" echo "Testing bad TOKEN_RESOURCE ..." if "$mongoc_ping" "$MONGODB_URI?authMechanism=MONGODB-OIDC&authSource=%24external&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:bad" &>output.txt; then echo "mongoc-ping unexpectedly succeeded with bad token resource" 1>&2 exit 1 fi echo "Testing bad TOKEN_RESOURCE ... done" mongo-c-driver-2.2.1/.evergreen/scripts/openssl-compat-check.sh000077500000000000000000000070151511661753600244670ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req OPENSSL_VERSION check_var_opt OPENSSL_USE_STATIC_LIBS declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_build_dir mongoc_install_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" mongoc_build_dir="${mongoc_dir:?}/cmake-build" mongoc_install_dir="${mongoc_dir:?}/install-dir" declare openssl_install_dir openssl_install_dir="${mongoc_dir:?}/openssl-install-dir" declare -a openssl_cmake_flags=("-DOPENSSL_ROOT_DIR=${openssl_install_dir:?}") if [[ "${OPENSSL_USE_STATIC_LIBS:-}" == "ON" ]]; then openssl_cmake_flags+=("-DOPENSSL_USE_STATIC_LIBS=TRUE") fi declare libmongocrypt_install_dir="${mongoc_dir}/install-dir" . "${script_dir:?}/install-build-tools.sh" install_build_tools export CMAKE_GENERATOR="Ninja" # libmongocrypt must use the same OpenSSL library. echo "Installing libmongocrypt..." # shellcheck source=.evergreen/scripts/compile-libmongocrypt.sh "${script_dir}/compile-libmongocrypt.sh" "$(command -v cmake)" "${mongoc_dir:?}" "${mongoc_install_dir:?}" "${openssl_cmake_flags[@]:?}" &>output.txt || { cat output.txt 1>&2 exit 1 } echo "Installing libmongocrypt... done." # Use ccache if able. . "${script_dir:?}/find-ccache.sh" find_ccache_and_export_vars "$(pwd)" || true declare -a configure_flags configure_flags_append() { configure_flags+=("${@:?}") } configure_flags_append "-DCMAKE_INSTALL_PREFIX=${mongoc_install_dir:?}" configure_flags_append "-DCMAKE_BUILD_TYPE=Debug" configure_flags_append "-DCMAKE_PREFIX_PATH=${libmongocrypt_install_dir:?}" configure_flags_append "-DCMAKE_SKIP_RPATH=TRUE" # Avoid hardcoding absolute paths to dependency libraries. configure_flags_append "-DENABLE_CLIENT_SIDE_ENCRYPTION=ON" configure_flags_append "-DENABLE_SSL=OPENSSL" configure_flags_append "-DENABLE_SASL=AUTO" configure_flags+=("${openssl_cmake_flags[@]:?}") echo "configure_flags: ${configure_flags[*]}" echo "Configuring..." cmake -S . -B "${mongoc_build_dir:?}" "${configure_flags[@]}" >/dev/null echo "Configuring... done." echo "Verifying the correct OpenSSL library was found..." ( log="$(perl -lne 'print $1 if m|^FIND_PACKAGE_MESSAGE_DETAILS_OpenSSL:INTERNAL=(.*)$|' "${mongoc_build_dir:?}/CMakeCache.txt")" pattern="^\[([^\]]*)\]\[([^\]]*)\]\[([^\]]*)\]\[([^\]]*)\]" # [library][include][?][version] library="$(echo "${log:?}" | perl -lne "print \$1 if m|${pattern:?}|")" version="$(echo "${log:?}" | perl -lne "print \$4 if m|${pattern:?}|")" [[ "${library:-}" =~ "${openssl_install_dir:?}" ]] || { echo "expected \"${openssl_install_dir:?}\" in \"${library:-}\"" exit 1 } >&2 if [[ "${OPENSSL_USE_STATIC_LIBS:-}" == "ON" ]]; then [[ "${library:-}" =~ "libcrypto.a" ]] || { echo "expected \"libcrypto.a\" in \"${library:-}\"" exit 1 } >&2 else [[ "${library:-}" =~ "libcrypto.so" ]] || { echo "expected \"libcrypto.so\" in \"${library:-}\"" exit 1 } >&2 fi [[ "${version:-}" =~ "${OPENSSL_VERSION:?}" ]] || { echo "expected \"${OPENSSL_VERSION:?}\" in \"${version:-}\"" exit 1 } >&2 ) echo "Verifying the correct OpenSSL library was found... done." echo "Building..." cmake --build "${mongoc_build_dir:?}" --target all mongoc-ping test-mongoc-gssapi >/dev/null echo "Building... done." echo "Installing..." cmake --install "${mongoc_build_dir:?}" echo "Installing... done." mongo-c-driver-2.2.1/.evergreen/scripts/openssl-compat-setup.sh000077500000000000000000000062571511661753600245610ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req OPENSSL_VERSION check_var_opt OPENSSL_ENABLE_FIPS declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" # Use ccache if able. . "${script_dir:?}/find-ccache.sh" mongoc_dir="$(to_absolute "${script_dir:?}/../..")" openssl_source_dir="${mongoc_dir:?}/openssl-${OPENSSL_VERSION:?}" openssl_install_dir="${mongoc_dir:?}/openssl-install-dir" . "${mongoc_dir:?}/.evergreen/scripts/openssl-downloader.sh" openssl_download "${OPENSSL_VERSION:?}" rm -rf "${openssl_install_dir:?}" mkdir "${openssl_install_dir:?}" # For openssl.cnf. declare -a config_flags=( "--prefix=${openssl_install_dir:?}" "--openssldir=${openssl_install_dir:?}/ssl" "--libdir=lib" "shared" # Enable shared libraries. "-fPIC" # For static libraries. "-Wl,-rpath,${openssl_install_dir:?}" # For shared libraries. ) if [[ "${OPENSSL_ENABLE_FIPS:-}" == "ON" ]]; then config_flags+=("enable-fips") fi echo "Building and installing OpenSSL ${OPENSSL_VERSION:?}..." ( cd "${openssl_source_dir:?}" export MAKEFLAGS="--no-print-directory" CC="ccache gcc" ./config "${config_flags[@]:?}" # Silence: `WARNING: can't open config file: /openssl.cnf` during build. cp apps/openssl.cnf "${openssl_install_dir:?}" if [[ "${OPENSSL_ENABLE_FIPS:-}" == "ON" ]]; then # Use FIPS by default: https://docs.openssl.org/master/man7/fips_module/ perl -i'' -p \ -e "s|# (.include fipsmodule.cnf)|.include ${openssl_install_dir:?}/ssl/fipsmodule.cnf|;" \ -e "s|# (fips = fips_sect)|\$1\n\n[algorithm_sect]\ndefault_properties = fips=yes\n|;" \ -e "s|(providers = provider_sect)|\$1\nalg_section = algorithm_sect|;" \ -e "s|# (activate = 1)|\$1|;" \ "${openssl_install_dir:?}/openssl.cnf" fi case "${OPENSSL_VERSION:?}" in # Parallel builds can be flaky for some versions. 1.0.2) make ;; # Seems fine. *) make -j "$(nproc)" ;; esac make --no-print-directory install_sw if [[ "${OPENSSL_ENABLE_FIPS:-}" == "ON" ]]; then make install_ssldirs # For ssl/fipsmodule.cnf. make install_fips # For lib/lib/ossl-modules/fips.so. # Post-installation attention. env \ PATH="${openssl_install_dir:?}/bin:${PATH:-}" \ LD_LIBRARY_PATH="${openssl_install_dir:?}/lib:${LD_LIBRARY_PATH:-}" \ openssl fipsinstall \ -out "${openssl_install_dir:?}/ssl/fipsmodule.cnf" \ -module "${openssl_install_dir:?}/lib/ossl-modules/fips.so" \ -quiet # Verification. echo "Verifying OpenSSL FIPS 3.0 module is enabled..." declare providers providers="$(./util/wrap.pl -fips apps/openssl list -provider-path providers -provider fips -providers)" [[ -n "$(echo "${providers:-}" | grep "OpenSSL FIPS Provider")" ]] || { echo "missing \"OpenSSL FIPS Provider\" in: ${providers:-}" } >&2 echo "Verifying OpenSSL FIPS 3.0 module is enabled... done." fi ) >/dev/null echo "Building and installing OpenSSL ${OPENSSL_VERSION:?}... done." mongo-c-driver-2.2.1/.evergreen/scripts/openssl-downloader.sh000077500000000000000000000054621511661753600242730ustar00rootroot00000000000000#!/usr/bin/env bash # shellcheck disable=SC2034 openssl_version_to_url() { declare version version="${1:?"usage: openssl_version_to_url "}" command -v perl >/dev/null || return declare uversion # 1.2.3 -> 1_2_3 uversion="$(echo "${version:?}" | perl -lpe 's|\.|_|g')" || return declare download_url if [[ "${version:?}" == 1.0.2 ]]; then url="https://github.com/openssl/openssl/releases/download/OpenSSL_${uversion:?}u/openssl-${version:?}u.tar.gz" elif [[ "${version:?}" == 1.1.1 ]]; then url="https://github.com/openssl/openssl/releases/download/OpenSSL_${uversion:?}w/openssl-${version:?}w.tar.gz" else url="https://github.com/openssl/openssl/releases/download/openssl-${version:?}/openssl-${version:?}.tar.gz" fi echo "${url:?}" } # Download the requested OpenSSL version into `openssl-`. openssl_download() { declare version version="${1:?"usage: openssl_download "}" command -v curl perl tar sha256sum >/dev/null || return declare url url="$(openssl_version_to_url "${version:?}")" || return declare openssl_checksum_1_0_2="ecd0c6ffb493dd06707d38b14bb4d8c2288bb7033735606569d8f90f89669d16" declare openssl_checksum_1_1_1="cf3098950cb4d853ad95c0841f1f9c6d3dc102dccfcacd521d93925208b76ac8" declare openssl_checksum_3_0_9="eb1ab04781474360f77c318ab89d8c5a03abc38e63d65a603cabbf1b00a1dc90" # FIPS 140-2 declare openssl_checksum_3_0_17="dfdd77e4ea1b57ff3a6dbde6b0bdc3f31db5ac99e7fdd4eaf9e1fbb6ec2db8ce" declare openssl_checksum_3_1_2="a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" # FIPS 140-3 declare openssl_checksum_3_1_8="d319da6aecde3aa6f426b44bbf997406d95275c5c59ab6f6ef53caaa079f456f" declare openssl_checksum_3_2_5="b36347d024a0f5bd09fefcd6af7a58bb30946080eb8ce8f7be78562190d09879" declare openssl_checksum_3_3_4="8d1a5fc323d3fd351dc05458457fd48f78652d2a498e1d70ffea07b4d0eb3fa8" declare openssl_checksum_3_4_2="17b02459fc28be415470cccaae7434f3496cac1306b86b52c83886580e82834c" declare openssl_checksum_3_5_1="529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" declare checksum_name checksum_name="openssl_checksum_$(echo "${version:?}" | perl -lpe 's|\.|_|g')" || return [[ -n "$(eval "echo \${${checksum_name:-}:-}")" ]] || { echo "missing checksum for OpenSSL version \"${version:?}\"" return 1 } >&2 declare tarfile tarfile="openssl-${version:?}.tar.gz" echo "Downloading OpenSSL ${version:?}..." curl -sSL -o "${tarfile:?}" "${url:?}" || return echo "Downloading OpenSSL ${version:?}... done." echo "${!checksum_name:?} ${tarfile:?}" | sha256sum -c >/dev/null || return echo "Decompressing openssl-${version:?}.tar.gz..." tar --one-top-level="openssl-${version:?}" --strip-components=1 -xzf "${tarfile:?}" || return echo "Decompressing openssl-${version:?}.tar.gz... done." } mongo-c-driver-2.2.1/.evergreen/scripts/run-auth-tests.sh000077500000000000000000000210361511661753600233520ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set +o xtrace # Don't echo commands # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" platform paths declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare mongoc_build_dir="${mongoc_dir:?}/cmake-build" declare mongoc_install_dir="${mongoc_dir:?}/install-dir" declare openssl_install_dir="${mongoc_dir:?}/openssl-install-dir" # Create directory for secrets within Evergreen task directory. Task directory is cleaned up between tasks. declare secrets_dir secrets_dir="$(to_absolute "${mongoc_dir:?}/../secrets")" mkdir -p "${secrets_dir:?}" chmod 700 "${secrets_dir:?}" # Create certificate to test X509 auth with Atlas on cloud-prod: atlas_x509_path="${secrets_dir:?}/atlas_x509.pem" echo "${atlas_x509_cert_base64:?}" | base64 --decode >"${secrets_dir:?}/atlas_x509.pem" # Fix path on Windows: if $IS_WINDOWS; then atlas_x509_path="$(cygpath -m "${atlas_x509_path:?}")" fi # Create certificate to test X509 auth with Atlas on cloud-dev atlas_x509_dev_path="${secrets_dir:?}/atlas_x509_dev.pem" echo "${atlas_x509_dev_cert_base64:?}" | base64 --decode >"${atlas_x509_dev_path:?}" # Fix path on Windows: if $IS_WINDOWS; then atlas_x509_dev_path="$(cygpath -m "${atlas_x509_dev_path}")" fi # Create Kerberos config and keytab files. echo "Setting up Kerberos ... begin" if command -v kinit >/dev/null; then # Copy host config and append realm: if [ -e /etc/krb5.conf ]; then cat /etc/krb5.conf >"${secrets_dir:?}/krb5.conf" fi cat "${mongoc_dir:?}/.evergreen/etc/kerberos.realm" >>"${secrets_dir:?}/krb5.conf" # Set up keytab: echo "${keytab:?}" | base64 --decode >"${secrets_dir:?}/drivers.keytab" # Initialize kerberos: KRB5_CONFIG="${secrets_dir:?}/krb5.conf" kinit -k -t "${secrets_dir:?}/drivers.keytab" -p drivers@LDAPTEST.10GEN.CC echo "Setting up Kerberos ... done" else echo "No 'kinit' detected" echo "Setting up Kerberos ... skipping" fi declare c_timeout="connectTimeoutMS=30000&serverSelectionTryOnce=false" declare sasl="OFF" if grep -r -q "#define MONGOC_ENABLE_SASL 1" "${mongoc_install_dir:?}"; then sasl="ON" fi declare ssl="OFF" if grep -r -q "#define MONGOC_ENABLE_SSL 1" "${mongoc_install_dir:?}"; then ssl="ON" fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" declare mongoc_ping declare test_gssapi declare ip_addr case "${OSTYPE}" in cygwin) mongoc_ping="${mongoc_build_dir:?}/src/libmongoc/Debug/mongoc-ping.exe" test_gssapi="${mongoc_build_dir:?}/src/libmongoc/Debug/test-mongoc-gssapi.exe" ip_addr="$(getent hosts "${auth_host:?}" | head -n 1 | awk '{print $1}')" ;; darwin*) mongoc_ping="${mongoc_build_dir:?}/src/libmongoc/mongoc-ping" test_gssapi="${mongoc_build_dir:?}/src/libmongoc/test-mongoc-gssapi" ip_addr="$(dig "${auth_host:?}" +short | tail -1)" ;; *) mongoc_ping="${mongoc_build_dir:?}/src/libmongoc/mongoc-ping" test_gssapi="${mongoc_build_dir:?}/src/libmongoc/test-mongoc-gssapi" ip_addr="$(getent hosts "${auth_host:?}" | head -n 1 | awk '{print $1}')" ;; esac : "${mongoc_ping:?}" : "${test_gssapi:?}" : "${ip_addr:?}" command -V "${mongoc_ping:?}" command -V "${test_gssapi:?}" # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. if [[ -d "${openssl_install_dir:?}" ]]; then LD_LIBRARY_PATH="${openssl_install_dir:?}/lib:${LD_LIBRARY_PATH:-}" export LD_LIBRARY_PATH # Import the system's trust list into the custom OpenSSL installation's trust store. declare pem_file="/etc/ca-certificates/extracted/tls-ca-bundle.pem" if [[ -f "${pem_file:?}" ]]; then cp -v "${pem_file:?}" "${openssl_install_dir:?}/ssl/cert.pem" fi fi # There may be additional certs required by auth tests. Direct OpenSSL to use # the system cert directory if available. [[ ! -d /etc/ssl/certs ]] || export SSL_CERT_DIR=/etc/ssl/certs ulimit -c unlimited || true if command -v ldd >/dev/null; then ldd "${mongoc_ping:?}" | grep "libssl" || true ldd "${test_gssapi:?}" | grep "libssl" || true elif command -v otool >/dev/null; then # Try using otool on MacOS if ldd is not available. otool -L "${mongoc_ping:?}" | grep "libssl" || true otool -L "${test_gssapi:?}" | grep "libssl" || true fi # libkrb5.so.3 and libgssapi_krb5.so.2 and report memory leaks on Ubuntu. if [[ -n "$(grep "Ubuntu" /etc/os-release)" ]]; then supps="$(pwd)/.lsan-suppressions-ubuntu" cat >|"${supps:?}" <&2 exit 1 mongo-c-driver-2.2.1/.evergreen/scripts/run-mock-server-tests.sh000077500000000000000000000027671511661753600246600ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt ASAN "OFF" check_var_opt CC check_var_opt MARCH check_var_opt DNS "nodns" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare -a test_args=( "-d" "-F" "test-results.json" "--skip-tests" ".evergreen/etc/skip-tests.txt" ) # AddressSanitizer configuration export ASAN_OPTIONS="detect_leaks=1 abort_on_error=1 symbolize=1" export ASAN_SYMBOLIZER_PATH="/usr/lib/llvm-3.4/bin/llvm-symbolizer" export MONGOC_TEST_FUTURE_TIMEOUT_MS=30000 export MONGOC_TEST_SERVER_LOG="json" export MONGOC_TEST_SKIP_MOCK="off" export MONGOC_TEST_SKIP_LIVE="on" export MONGOC_TEST_SKIP_SLOW="on" export MONGOC_TEST_IPV4_AND_IPV6_HOST="ipv4_and_ipv6.test.build.10gen.cc" # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" declare ld_preload="${LD_PRELOAD:-}" if [[ "${ASAN}" == "on" ]]; then ld_preload="$(bypass_dlclose):${ld_preload}" fi case "${OSTYPE}" in cygwin) LD_PRELOAD="${ld_preload:-}" ./cmake-build/src/libmongoc/test-libmongoc.exe "${test_args[@]}" ;; *) ulimit -c unlimited || true LD_PRELOAD="${ld_preload:-}" ./cmake-build/src/libmongoc/test-libmongoc --no-fork "${test_args[@]}" ;; esac mongo-c-driver-2.2.1/.evergreen/scripts/run-mongodb-aws-ecs-test.sh000077500000000000000000000007171511661753600252160ustar00rootroot00000000000000#!/usr/bin/env bash # run-mongodb-aws-ecs-test.sh is intended to run on a remote ECS host. # For a description of ECS tests, see: https://github.com/mongodb-labs/drivers-evergreen-tools/tree/b01493d57e6716cb6385afaa4dc06330e4f33e01/.evergreen/auth_aws#ecs-test-process # ECS tests have paths /root/src echo "run-mongodb-aws-ecs-test.sh" expect_success() { echo "Should succeed:" /root/src/test-awsauth "${1:?}" "EXPECT_SUCCESS" } expect_success "${1:?}" mongo-c-driver-2.2.1/.evergreen/scripts/run-ocsp-cache-test.sh000077500000000000000000000066601511661753600242410ustar00rootroot00000000000000#!/usr/bin/env bash # End-to-end test runner for OCSP cache. # # Assumptions: # Mongod: # The script assumes that a mongod is running with TLS enabled. It also assumes that the server certificate will NOT # staple a response. This will force the test binary to reach out to an OCSP responder to check the certificates' # revocation status. # Mock OCSP Responder: # This script assumes that a mock OCSP responder is running named "ocsp_mock". It also assumes that the OCSP # responder will respond with a certificate status of 'revoked'. # # Behavior: # This script first runs the test binary 'test-mongoc-cache' which sends a ping command to the mongod. It then waits for 5 # seconds to give the binary enough time to make the request, and receive and process the response. Since we soft-fail # if an OCSP responder is not reachable, receiving a certificate status of 'revoked' is the only way we can be certain # our binary reached out to an OCSP responder. We assert a certificate status of 'revoked' in the test binary for both # ping commands. # # The test binary will hang (it calls 'raise (SIGSTOP)') after the first ping. This gives us enough time to kill the # mock OCSP responder before sending the second ping command to the server. If the cache is used, the expected behavior, # then the binary will use the response cached from the first ping command and report a certificate status of 'revoked'. # However, if the cache is not used, then second ping command will attempt to reach out to an OCSP responder. Since the # only one available was killed by this script and we soft-fail if we cannot contact an OCSP responder the binary # will report a certificate status of "good". # # The aforementioned behavior is asserted in the test binary, i.e., both ping commands should fail. If they do, # test-mongoc-cache will return EXIT_SUCCESS, otherwise, it will return EXIT_FAILURE. # # Environment variables: # # CERT_TYPE # Required. Set to either RSA or ECDSA. set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req CERT_TYPE declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" if ! pgrep -nf mongod >/dev/null; then echo "Cannot find mongod. See file comments for help." 1>&2 exit 1 fi if ! pgrep -nf ocsp_mock >/dev/null; then echo "Cannot find mock OCSP responder. See file comments for help." 1>&2 exit 1 fi # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi # This test will hang after the first ping. LD_LIBRARY_PATH="${openssl_lib_prefix}" "${mongoc_dir}/cmake-build/src/libmongoc/test-mongoc-cache" "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}/ca.pem" & sleep 5 # Give the program time to contact the OCSP responder pkill -nf "ocsp_mock" # We assume that the mock OCSP responder is named "ocsp_mock" # Resume the test binary. This will cause it to send the second ping command. kill -s SIGCONT "$(pgrep -nf test-mongoc-cache)" mongo-c-driver-2.2.1/.evergreen/scripts/run-ocsp-responder.sh000077500000000000000000000047421511661753600242210ustar00rootroot00000000000000#!/usr/bin/env bash # Run an OCSP mock responder server if necessary. # # See the tests described in the specification for more info: # https://github.com/mongodb/specifications/tree/master/source/ocsp-support/tests#integration-tests-permutations-to-be-tested. # Precondition: mongod is NOT running. The responder should be started first. # # Environment variables: # # TEST_COLUMN # Required. Corresponds to a column of the test matrix. Set to one of the following: # TEST_1, TEST_2, TEST_3, TEST_4, SOFT_FAIL_TEST, MALICIOUS_SERVER_TEST_1, MALICIOUS_SERVER_TEST_2 # CERT_TYPE # Required. Set to either rsa or ecdsa. # USE_DELEGATE # Required. May be ON or OFF. If a test requires use of a responder, this decides whether # the responder uses a delegate certificate. Defaults to "OFF" # # Example: # TEST_COLUMN=TEST_1 CERT_TYPE=rsa USE_DELEGATE=OFF ./run-ocsp-test.sh # set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req TEST_COLUMN check_var_req CERT_TYPE check_var_req USE_DELEGATE declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare responder_required case "${TEST_COLUMN}" in TEST_1) responder_required="valid" ;; TEST_2) responder_required="invalid" ;; TEST_3) responder_required="valid" ;; TEST_4) responder_required="invalid" ;; MALICIOUS_SERVER_TEST_1) responder_required="invalid" ;; esac # Same responder is used for both server and client. So even stapling tests require a responder. if [[ -n "${responder_required:-}" ]]; then echo "Starting mock responder" pushd ../drivers-evergreen-tools/.evergreen/ocsp # shellcheck source=/dev/null . ./activate-ocspvenv.sh popd # ../drivers-evergreen-tools/.evergreen/ocsp pushd "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}" declare -a fault_args if [ "${responder_required}" == "invalid" ]; then fault_args=("--fault" "revoked") fi declare responder_signer if [[ "${USE_DELEGATE}" == "ON" ]]; then responder_signer="ocsp-responder" else responder_signer="ca" fi python ../ocsp_mock.py \ --ca_file ca.pem \ --ocsp_responder_cert "${responder_signer}.crt" \ --ocsp_responder_key "${responder_signer}.key" \ -p 8100 -v "${fault_args[@]}" \ >"${mongoc_dir}/responder.log" 2>&1 & popd # "${mongoc_dir}/.evergreen/ocsp/${CERT_TYPE}" fi mongo-c-driver-2.2.1/.evergreen/scripts/run-ocsp-test.sh000077500000000000000000000121571511661753600231760ustar00rootroot00000000000000#!/usr/bin/env bash # Test runner for OCSP revocation checking. # # Closely models the tests described in the specification: # https://github.com/mongodb/specifications/tree/master/source/ocsp-support/tests#integration-tests-permutations-to-be-tested. # Based on the test case, this may start a mock responder process. # Preconditions: # - A mock responder configured for the test case is running (use run-ocsp-responder.sh – before running mongod). # - mongod is running with the correct configuration. (use integration-tests.sh or spawn one manually). # # Environment variables: # # TEST_COLUMN # Required. Corresponds to a column of the test matrix. Set to one of the following: # TEST_1, TEST_2, TEST_3, TEST_4, SOFT_FAIL_TEST, MALICIOUS_SERVER_TEST_1, MALICIOUS_SERVER_TEST_2 # CERT_TYPE # Required. Set to either rsa or ecdsa. # MONGODB_PORT # Optional. A custom port to connect to. Defaults to 27017. # # Example: # TEST_COLUMN=TEST_1 CERT_TYPE=rsa ./run-ocsp-test.sh # set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_req TEST_COLUMN check_var_req CERT_TYPE check_var_opt MONGODB_PORT "27017" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir:?}/../..")" declare mongoc_build_dir="${mongoc_dir:?}/cmake-build" declare mongoc_install_dir="${mongoc_dir:?}/install-dir" declare openssl_install_dir="${mongoc_dir:?}/openssl-install-dir" declare responder_required case "${TEST_COLUMN:?}" in TEST_1) responder_required="valid" ;; TEST_2) responder_required="invalid" ;; TEST_3) responder_required="valid" ;; TEST_4) responder_required="invalid" ;; MALICIOUS_SERVER_TEST_1) responder_required="invalid" ;; esac : "${responder_required:-}" on_exit() { echo "Cleaning up" if [[ -n "${responder_required:-}" ]]; then echo "Responder logs:" cat "${mongoc_dir:?}/responder.log" fi } trap on_exit EXIT declare mongoc_ping="${mongoc_build_dir:?}/src/libmongoc/mongoc-ping" # Add libmongoc-1.0 and libbson-1.0 to library path, so mongoc-ping can find them at runtime. if [[ "${OSTYPE}" == "cygwin" ]]; then export PATH PATH+=":${mongoc_build_dir:?}/src/libmongoc/Debug" PATH+=":${mongoc_build_dir:?}/src/libbson/Debug" chmod -f +x src/libmongoc/Debug/* src/libbson/Debug/* || true mongoc_ping="${mongoc_build_dir:?}/src/libmongoc/Debug/mongoc-ping.exe" elif [[ "${OSTYPE}" == darwin* ]]; then export DYLD_LIBRARY_PATH DYLD_LIBRARY_PATH="${mongoc_build_dir:?}/src/libmongoc:${DYLD_LIBRARY_PATH:-}" DYLD_LIBRARY_PATH="${mongoc_build_dir:?}/src/libbson:${DYLD_LIBRARY_PATH:-}" else export LD_LIBRARY_PATH LD_LIBRARY_PATH="${mongoc_build_dir:?}/src/libmongoc:${LD_LIBRARY_PATH:-}" LD_LIBRARY_PATH="${mongoc_build_dir:?}/src/libbson:${LD_LIBRARY_PATH:-}" fi command -V "${mongoc_ping:?}" # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH when # necessary to avoid conflicting with system binary requirements. if [[ -d "${openssl_install_dir:?}" ]]; then if [[ -d "${openssl_install_dir:?}/lib64" ]]; then LD_LIBRARY_PATH="${openssl_install_dir:?}/lib64:${LD_LIBRARY_PATH:-}" DYLD_LIBRARY_PATH="${openssl_install_dir:?}/lib64:${DYLD_LIBRARY_PATH:-}" else LD_LIBRARY_PATH="${openssl_install_dir:?}/lib:${LD_LIBRARY_PATH:-}" DYLD_LIBRARY_PATH="${openssl_install_dir:?}/lib:${DYLD_LIBRARY_PATH:-}" fi export LD_LIBRARY_PATH DYLD_LIBRARY_PATH fi expect_success() { echo "Should succeed:" if ! "${mongoc_ping:?}" "${MONGODB_URI:?}"; then echo "Unexpected failure" 1>&2 exit 1 fi } expect_failure() { echo "Should fail:" if "${mongoc_ping:?}" "${MONGODB_URI:?}" >output.txt 2>&1; then echo "Unexpected - succeeded but it should not have" 1>&2 cat output.txt exit 1 else echo "failed as expected" fi # libmongoc really should give a better error message for a revocation failure... # It is not at all obvious what went wrong. if ! grep "No suitable servers found" output.txt >/dev/null; then echo "Unexpected error, expecting TLS handshake failure" 1>&2 cat output.txt exit 1 fi } case "${OSTYPE:?}" in darwin*) find ~/Library/Keychains -name 'ocspcache.sqlite3' -exec sqlite3 "{}" 'DELETE FROM responses ;' \; >/dev/null || true ;; cygwin) certutil -urlcache "*" delete >/dev/null || true ;; esac # Always add the tlsCAFile declare ca_path="${mongoc_dir:?}/.evergreen/ocsp/${CERT_TYPE:?}/ca.pem" declare base_uri="mongodb://localhost:${MONGODB_PORT:?}/?tls=true&tlsCAFile=${ca_path:?}" # Only a handful of cases are expected to fail. case "${TEST_COLUMN:?}" in TEST_1 | TEST_3 | SOFT_FAIL_TEST) MONGODB_URI="${base_uri:?}" expect_success ;; TEST_2 | TEST_4 | MALICIOUS_SERVER_TEST_1 | MALICIOUS_SERVER_TEST_2) MONGODB_URI="${base_uri:?}" expect_failure ;; esac # With insecure options, connection should always succeed MONGODB_URI="${base_uri:?}&tlsInsecure=true" expect_success # With insecure options, connection should always succeed MONGODB_URI="${base_uri:?}&tlsAllowInvalidCertificates=true" expect_success mongo-c-driver-2.2.1/.evergreen/scripts/run-tests-mingw.bat000066400000000000000000000012751511661753600236660ustar00rootroot00000000000000rem "make install" would work, except we run tests on different Evergreen hosts, rem in different working directories, than where the driver was built. This rem causes errors in "make install" like: rem CMake Error at cmake_install cannot find rem "C:/data/mci/d3ba3391950aca9119e841818a8884bc/mongoc/src/libbson/libbson-1.0.dll" rem rem So just copy files manually rmdir /Q /S C:\mongo-c-driver md C:\mongo-c-driver md C:\mongo-c-driver\bin copy /Y libmongoc-1.0.dll C:\mongo-c-driver\bin copy /Y cmake-build\src\libbson\libbson-1.0.dll C:\mongo-c-driver\bin .\cmake-build\src\libmongoc\test-libmongoc.exe --no-fork -d -F test-results.json --skip-tests .evergreen\etc\skip-tests.txt mongo-c-driver-2.2.1/.evergreen/scripts/run-tests.sh000077500000000000000000000256531511661753600224240ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail # shellcheck source=.evergreen/scripts/env-var-utils.sh . "$(dirname "${BASH_SOURCE[0]}")/env-var-utils.sh" . "$(dirname "${BASH_SOURCE[0]}")/use-tools.sh" paths check_var_opt ASAN "OFF" check_var_opt AUTH "noauth" check_var_opt CC check_var_opt CLIENT_SIDE_ENCRYPTION check_var_opt COMPRESSORS "nocompressors" check_var_opt COVERAGE # CMake default: OFF. check_var_opt DNS "nodns" check_var_opt LOADBALANCED "noloadbalanced" check_var_opt MARCH check_var_opt MONGODB_API_VERSION check_var_opt MULTI_MONGOS_LB_URI check_var_opt SINGLE_MONGOS_LB_URI check_var_opt SKIP_CRYPT_SHARED_LIB check_var_opt SSL "nossl" check_var_opt URI check_var_opt OIDC "nooidc" declare script_dir script_dir="$(to_absolute "$(dirname "${BASH_SOURCE[0]}")")" declare mongoc_dir mongoc_dir="$(to_absolute "${script_dir}/../..")" declare det_dir det_dir="${mongoc_dir}/../drivers-evergreen-tools" declare openssl_install_dir="${mongoc_dir}/openssl-install-dir" if [[ "${COMPRESSORS}" != "nocompressors" ]]; then export MONGOC_TEST_COMPRESSORS="${COMPRESSORS}" fi if [[ "${AUTH}" != "noauth" ]]; then export MONGOC_TEST_USER="bob" export MONGOC_TEST_PASSWORD="pwd123" fi if [[ "${SSL}" != "nossl" ]]; then export MONGOC_TEST_SSL_WEAK_CERT_VALIDATION="off" export MONGOC_TEST_SSL_PEM_FILE="src/libmongoc/tests/x509gen/client.pem" export MONGOC_TEST_SSL_CA_FILE="src/libmongoc/tests/x509gen/ca.pem" fi export MONGOC_ENABLE_MAJORITY_READ_CONCERN=on export MONGOC_TEST_FUTURE_TIMEOUT_MS=30000 export MONGOC_TEST_URI="${URI}" export MONGOC_TEST_SERVER_LOG="json" export MONGOC_TEST_SKIP_MOCK="on" export MONGOC_TEST_IPV4_AND_IPV6_HOST="ipv4_and_ipv6.test.build.10gen.cc" # Only set creds if testing with Client Side Encryption. # libmongoc may build with CSE enabled (if the host has libmongocrypt installed) # and will try to run those tests (which fail on ASAN unless spawning is bypassed). if [[ -n "${CLIENT_SIDE_ENCRYPTION}" ]]; then echo "Testing with Client Side Encryption enabled." echo "Setting temporary credentials..." pushd "${det_dir:?}/.evergreen/csfle" { export AWS_SECRET_ACCESS_KEY="${client_side_encryption_aws_secret_access_key:?}" export AWS_ACCESS_KEY_ID="${client_side_encryption_aws_access_key_id:?}" export AWS_DEFAULT_REGION="us-east-1" } &>/dev/null echo "Running activate-kmstlsvenv.sh..." # shellcheck source=/dev/null . ./activate-kmstlsvenv.sh echo "Running activate-kmstlsvenv.sh... done." echo "Running set-temp-creds.sh..." # shellcheck source=/dev/null . ./set-temp-creds.sh echo "Running set-temp-creds.sh... done." deactivate popd # "${mongoc_dir}/../drivers-evergreen-tools/.evergreen/csfle" echo "Setting temporary credentials... done." # Ensure temporary credentials were properly set. if [ -z "${CSFLE_AWS_TEMP_ACCESS_KEY_ID}" ]; then echo "Failed to set temporary credentials!" 1>&2 exit 1 fi echo "Setting KMS credentials from the environment..." { export MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID="${CSFLE_AWS_TEMP_ACCESS_KEY_ID:?}" export MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY="${CSFLE_AWS_TEMP_SECRET_ACCESS_KEY:?}" export MONGOC_TEST_AWS_TEMP_SESSION_TOKEN="${CSFLE_AWS_TEMP_SESSION_TOKEN:?}" export MONGOC_TEST_AWS_SECRET_ACCESS_KEY="${AWS_SECRET_ACCESS_KEY}" export MONGOC_TEST_AWS_ACCESS_KEY_ID="${AWS_ACCESS_KEY_ID}" export MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY="${client_side_encryption_awsname2_secret_access_key}" export MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID="${client_side_encryption_awsname2_access_key_id}" export MONGOC_TEST_AZURE_TENANT_ID="${client_side_encryption_azure_tenant_id:?}" export MONGOC_TEST_AZURE_CLIENT_ID="${client_side_encryption_azure_client_id:?}" export MONGOC_TEST_AZURE_CLIENT_SECRET="${client_side_encryption_azure_client_secret:?}" export MONGOC_TEST_GCP_EMAIL="${client_side_encryption_gcp_email:?}" export MONGOC_TEST_GCP_PRIVATEKEY="${client_side_encryption_gcp_privatekey:?}" } &>/dev/null echo "Setting KMS credentials from the environment... done." export MONGOC_TEST_CSFLE_TLS_CA_FILE="src/libmongoc/tests/x509gen/ca.pem" export MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE="src/libmongoc/tests/x509gen/client.pem" export SKIP_CRYPT_SHARED_LIB="${SKIP_CRYPT_SHARED_LIB}" fi # Sanitizer environment variables. export ASAN_OPTIONS="detect_leaks=1 abort_on_error=1 symbolize=1" export ASAN_SYMBOLIZER_PATH if command -v "/opt/mongodbtoolchain/v4/bin/llvm-symbolizer" >/dev/null; then ASAN_SYMBOLIZER_PATH="/opt/mongodbtoolchain/v4/bin/llvm-symbolizer" elif command -v "/opt/mongodbtoolchain/v3/bin/llvm-symbolizer" >/dev/null; then ASAN_SYMBOLIZER_PATH="/opt/mongodbtoolchain/v3/bin/llvm-symbolizer" fi export TSAN_OPTIONS="suppressions=.tsan-suppressions" ubsan_opts=( "print_stacktrace=1" "abort_on_error=1" ) # UBSan with Clang 3.8 fails to parse the suppression file. if [[ "${distro_id:?}" != ubuntu1604-* ]]; then ubsan_opts+=("suppressions=.ubsan-suppressions") fi export UBSAN_OPTIONS="${ubsan_opts[*]}" declare -a test_args=( "-d" "-F" "test-results.json" "--skip-tests" ".evergreen/etc/skip-tests.txt" ) # TODO (CDRIVER-4045): consolidate DNS tests into regular test tasks. if [[ "${DNS}" != "nodns" ]]; then if [[ "${CC}" =~ mingw ]]; then echo "ERROR - DNS tests not implemented for MinGW yet" 1>&2 exit 1 fi test_args+=("-l" "/initial_dns_seedlist_discovery/*") if [[ "${DNS}" = "loadbalanced" ]]; then export MONGOC_TEST_DNS_LOADBALANCED=on else export MONGOC_TEST_DNS=on fi fi if [[ "${OIDC}" != "nooidc" ]]; then export MONGOC_TEST_OIDC="ON" # Only run OIDC tests. test_args+=("-l" "/oidc/*") test_args+=("-l" "/auth/unified/*") fi wait_for_server() { declare name="${1:?"wait_for_server requires a server name"}" declare port="${2:?"wait_for_server requires a server port"}" for _ in $(seq 300); do # Exit code 7: "Failed to connect to host". if curl -s --max-time 1 "localhost:${port}" >/dev/null test ${?} -ne 7 then return 0 else sleep 1 fi done echo "Could not detect ${name} server on port ${port}" 1>&2 return 1 } if [[ "${OSTYPE:?}" == cygwin && "${CC}" =~ gcc ]]; then echo "Waiting for simple HTTP server to start..." wait_for_server "simple HTTP" 18000 echo "Waiting for simple HTTP server to start... done." chmod -f +x ./cmake-build/src/libmongoc/test-libmongoc.exe cmd.exe /c "$(native-path "${script_dir}/run-tests-mingw.bat")" exit fi # shellcheck source=.evergreen/scripts/add-build-dirs-to-paths.sh . "${script_dir}/add-build-dirs-to-paths.sh" # shellcheck source=.evergreen/scripts/bypass-dlclose.sh . "${script_dir}/bypass-dlclose.sh" check_mongocryptd() { if [[ "${CLIENT_SIDE_ENCRYPTION}" == "on" && "${ASAN}" == "on" ]]; then # ASAN does not play well with spawned processes. In addition to --no-fork, do not spawn mongocryptd # for client-side encryption tests. export MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN="on" mongocryptd --logpath ./mongocryptd.logs --fork --pidfilepath="$(pwd)/mongocryptd.pid" fi } export MONGOC_TEST_MONITORING_VERBOSE=on # Limit tests to execute and ensure required servers are running. if [[ "${CLIENT_SIDE_ENCRYPTION}" == "on" ]]; then echo "Waiting for mock KMS servers to start..." wait_for_server "mock KMS" 8999 wait_for_server "mock KMS" 9000 wait_for_server "mock KMS" 9001 wait_for_server "mock KMS" 9002 wait_for_server "mock KMIP" 5698 echo "Waiting for mock KMS servers to start... done." # Check if tests should use the crypt_shared library. if [[ "${SKIP_CRYPT_SHARED_LIB}" == "on" ]]; then echo "crypt_shared library is skipped due to SKIP_CRYPT_SHARED_LIB=on" else export MONGOC_TEST_CRYPT_SHARED_LIB_PATH="${CRYPT_SHARED_LIB_PATH}" echo "crypt_shared library will be loaded with cryptSharedLibPath: [${MONGOC_TEST_CRYPT_SHARED_LIB_PATH}]" fi # Limit tests executed to CSE tests. test_args+=("-l" "/client_side_encryption/*") test_args+=("-l" "/unified/*") # Includes PoC tests for CSFLE/QE. fi if [[ "${LOADBALANCED}" != "noloadbalanced" ]]; then if [[ -z "${SINGLE_MONGOS_LB_URI}" || -z "${MULTI_MONGOS_LB_URI}" ]]; then echo "SINGLE_MONGOS_LB_URI and MULTI_MONGOS_LB_URI environment variables required." 1>&2 exit 1 fi # Limit tests executed to load balancer tests. export MONGOC_TEST_LOADBALANCED=ON # Limit tests executed to load balancer tests. test_args+=("-l" "/unified/*") test_args+=("-l" "/retryable_reads/*") test_args+=("-l" "/retryable_writes/*") test_args+=("-l" "/change_streams/*") test_args+=("-l" "/loadbalanced/*") test_args+=("-l" "/load_balancers/*") test_args+=("-l" "/crud/unified/*") test_args+=("-l" "/transactions/unified/*") test_args+=("-l" "/collection-management/*") test_args+=("-l" "/sessions/unified/*") test_args+=("-l" "/change_streams/unified/*") test_args+=("-l" "/versioned_api/*") test_args+=("-l" "/command_monitoring/unified/*") fi if [[ ! "${test_args[*]}" =~ "-l" ]]; then # /http tests are only run if the set of tests to execute were not limited. echo "Waiting for simple HTTP server to start..." wait_for_server "simple HTTP" 18000 echo "Waiting for simple HTTP server to start... done." fi declare ld_preload="${LD_PRELOAD:-}" if [[ "${ASAN}" == "on" ]]; then ld_preload="$(bypass_dlclose):${ld_preload}" fi # For mongocryptd, by integration-tests.sh. export PATH="${det_dir:?}/mongodb/bin:${PATH:-}" # Ensure no pre-existing and outdated coverage data is present prior to execution. if [[ "${COVERAGE}" == "ON" ]]; then find . -name '*.gcda' -exec rm -f {} \+ fi case "${OSTYPE}" in cygwin) check_mongocryptd chmod -f +x cmake-build/src/libmongoc/Debug/test-libmongoc.exe LD_PRELOAD="${ld_preload:-}" ./cmake-build/src/libmongoc/Debug/test-libmongoc.exe "${test_args[@]}" ;; *) ulimit -c unlimited || true check_mongocryptd # Custom OpenSSL library may be installed. Only prepend to LD_LIBRARY_PATH # when necessary to avoid conflicting with system binary requirements. declare openssl_lib_prefix="${LD_LIBRARY_PATH:-}" if [[ -d "${openssl_install_dir}" ]]; then openssl_lib_prefix="${openssl_install_dir}/lib:${openssl_lib_prefix:-}" fi LD_LIBRARY_PATH="${openssl_lib_prefix}" LD_PRELOAD="${ld_preload:-}" ./cmake-build/src/libmongoc/test-libmongoc --no-fork "${test_args[@]}" ;; esac if [[ "${COVERAGE}" == "ON" ]]; then declare -a coverage_args=( "--capture" "--directory" "." "--output-file" ".coverage.lcov" "--no-external" # WARNING: unexecuted block on non-branch line with non-zero hit count. "--rc" "geninfo_unexecuted_blocks=1" # ERROR: mismatched end line for ... "--ignore-errors" "mismatch" ) { case "${CC}" in clang) lcov --gcov-tool "$(pwd)/.evergreen/scripts/llvm-gcov.sh" "${coverage_args[@]}" ;; *) lcov --gcov-tool gcov "${coverage_args[@]}" ;; esac genhtml .coverage.lcov --legend --title "mongoc code coverage" --output-directory coverage } | perl -lne 'print if not m|Processing |' fi mongo-c-driver-2.2.1/.evergreen/scripts/sbom.sh000077500000000000000000000023361511661753600214110ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail : "${branch_name:?}" : "${DOCKER_CONFIG:?}" : "${KONDUKTO_TOKEN:?}" command -v podman >/dev/null || { echo "missing required program podman" 1>&2 exit 1 } silkbomb="901841024863.dkr.ecr.us-east-1.amazonaws.com/release-infrastructure/silkbomb:2.0" # Ensure latest version of SilkBomb is being used. podman pull "${silkbomb:?}" silkbomb_augment_flags=( --repo mongodb/mongo-c-driver --branch "${branch_name:?}" --sbom-in /pwd/etc/cyclonedx.sbom.json --sbom-out /pwd/augmented-sbom.json # Any notable updates to the Augmented SBOM version should be done manually after careful inspection. # Otherwise, it should be equal to the SBOM Lite version, which should normally be `1`. --no-update-sbom-version ) # First validate the SBOM Lite. podman run -it --rm -v "$(pwd):/pwd" "${silkbomb:?}" \ validate --purls /pwd/etc/purls.txt --sbom-in /pwd/etc/cyclonedx.sbom.json --exclude jira # Then download the Augmented SBOM. Allow the timestamp to be updated. podman run -it --rm -v "$(pwd):/pwd" --env 'KONDUKTO_TOKEN' "${silkbomb:?}" \ augment "${silkbomb_augment_flags[@]:?}" [[ -f ./augmented-sbom.json ]] || { echo "failed to download Augmented SBOM" 1>&2 exit 1 } mongo-c-driver-2.2.1/.evergreen/scripts/simple_http_server.py000077500000000000000000000014241511661753600244020ustar00rootroot00000000000000#!/usr/bin/env python3 # A simple HTTP server used by /http tests. import http from http.server import BaseHTTPRequestHandler, HTTPServer class Simple(BaseHTTPRequestHandler): def do_GET(self): self.send_response(http.HTTPStatus.OK) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write('Response to GET by simple HTTP server'.encode('utf-8')) def do_POST(self): self.send_response(http.HTTPStatus.OK) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write('Response to POST by simple HTTP server'.encode('utf-8')) def main(): HTTPServer(server_address=('', 18000), RequestHandlerClass=Simple).serve_forever() if __name__ == '__main__': main() mongo-c-driver-2.2.1/.evergreen/scripts/use-tools.sh000077500000000000000000000001601511661753600223740ustar00rootroot00000000000000#!/usr/bin/env bash # Call out to tools/use.sh source "$(dirname "${BASH_SOURCE[0]}")/../../tools/use.sh" "$@" mongo-c-driver-2.2.1/.gdbinit000066400000000000000000000106401511661753600160010ustar00rootroot00000000000000define printbson set $bson = $arg0 if $bson->flags & BSON_FLAG_INLINE print ((bson_impl_inline_t*) $bson)->data set $data = &(((bson_impl_inline_t*) $bson)->data) printf "INLINE" __printbson $data else set $impl = (bson_impl_alloc_t*) $bson printf "ALLOC [%p + %d]", $impl->buf, $impl->offset __printbson (*$impl->buf) + $impl->data end end define __printbson set $bson = ((uint32_t*)$arg0) printf " (len=%d)\n", $bson[0] printf "{\n" __printElements ($bson+1) 0 1 printf "\n}\n" end define __printElements set $data = ((uint8_t*)$arg0) set $isDocument = $arg1 set $depth = $arg2 set $addComma = 0 while $data != 0 set $type = (uint8_t)($data[0]) if $type == 0 loop_break end if $addComma == 1 printf ",\n" end set $addComma = 1 __printSpaces $depth printf "'%s' : ", (char*) ($data+1) # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 if $type == 0x01 __printDouble $data end if $type == 0x02 __printString $data end if $type == 0x03 __printDocument $data $depth end if $type == 0x04 __printArray $data $depth end if $type == 0x05 __printBinary $data end if $type == 0x07 __printObjectID $data end if $type == 0x08 __printBool $data end if $type == 0x09 __printUtcDateTime $data end if $type == 0x0a __printNull end if $type == 0x0b __printRegex $data end if $type == 0x0d __printJavascript $data end if $type == 0x0e __printSymbol $data end if $type == 0x0f __printJavascriptWScope $data end if $type == 0x10 __printInt32 $data end if $type == 0x11 __printTimestamp $data end if $type == 0x12 __printInt64 $data end end end define __printSpaces set $i = 0 while $i < (4 * $arg0) printf " " set $i = $i + 1 end end define __printDocument set $value = ((uint8_t*) $arg0) set $depth = $arg1 printf "{\n" __printElements ($value+4) 1 ($depth+1) printf "\n" __printSpaces ($depth-1) printf "}" set $depth = $depth-1 set $data = $data + 1 end define __printArray set $value = ((uint8_t*) $arg0) set $depth = $arg1 printf "[\n" __printElements ($value+4) (0) ($depth+1) printf "\n" __printSpaces ($depth-1) printf "]" set $depth = $depth-1 set $data = $data + 1 end define __printDouble set $value = ((double*) $arg0) printf "%f", $value[0] set $data = $data + 8 end define __printString set $value = ((char*) $arg0) + 4 printf "\"%s\"", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printBinary set $value = ((uint8_t*) $arg0) set $length = ((int32_t*) $arg0)[0] printf "Binary(\"%02X\", \"", $value[4] set $i = 4 while $i < $length printf "%02X", $value[$i+5] set $i = $i + 1 end printf "\")" set $data = $data + 5 + ((uint32_t*)$data)[0] end define __printObjectID set $value = ((uint8_t*) $arg0) set $i = 0 printf "ObjectID(\"" while $i < 12 printf "%02X", $value[$i] set $i = $i + 1 end printf "\")" set $data = $data + 12 end define __printBool set $value = ((uint8_t*) $arg0) printf "%s", $value[0] ? "true" : "false" set $data = $data + 1 end define __printUtcDateTime set $value = ((uint64_t*) $arg0) printf "UTCDateTime(%ld)", $value[0] set $data = $data + 8 end define __printNull printf "null" end define __printRegex printf "Regex(\"%s\", \"", (char*) $data # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 printf "%s\")", (char*) $data # skip through C String while $data[0] != '\0' set $data = $data + 1 end set $data = $data + 1 end define __printJavascript set $value = ((char*) $arg0) + 4 printf "JavaScript(\"%s\")", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printSymbol set $value = ((char*) $arg0) + 4 printf "Symbol(\"%s\")", $value set $data = $data + 4 + ((uint32_t*)$data)[0] end define __printJavascriptWScope set $value = ((char*) $arg0) + 8 printf "JavaScript(\"%s\") with scope: ", $value set $data = $data + 8 + ((uint32_t*)$data)[1] __printDocument $data $depth end define __printInt32 set $value = ((uint32_t*) $arg0) printf "NumberInt(\"%d\")", $value[0] set $data = $data + 4 end define __printTimestamp set $value = ((uint32_t*) $arg0) printf "Timestamp(%u, %u)", $value[0], $value[1] set $data = $data + 8 end define __printInt64 set $value = ((uint64_t*) $arg0) printf "NumberLong(\"%ld\")", $value[0] set $data = $data + 8 end mongo-c-driver-2.2.1/.git-blame-ignore-revs000066400000000000000000000002521511661753600204560ustar00rootroot00000000000000# Format source files with ColumnLimit: 120 482ea4e8d20a6af4be9c01d4fd220dd63b231332 # Remove whitespace in function/macro calls 6ccc0ae7b5ce30559853cc53f3a8938010fde332 mongo-c-driver-2.2.1/.gitattributes000066400000000000000000000000571511661753600172540ustar00rootroot00000000000000tests/binary/* text eol=lf *.bat text eol=crlf mongo-c-driver-2.2.1/.github/000077500000000000000000000000001511661753600157175ustar00rootroot00000000000000mongo-c-driver-2.2.1/.github/CODEOWNERS000066400000000000000000000001071511661753600173100ustar00rootroot00000000000000# Listing code owners is required by DRIVERS-3098 * @mongodb/dbx-c-cxx mongo-c-driver-2.2.1/.gitignore000066400000000000000000000011741511661753600163520ustar00rootroot00000000000000*.a *.dylib *.gcda *.gcno *.gz *.o *.lo *.pc *.so *.so.* .githooks .scratch/ cmake-build cmake_install.cmake CMakeCache.txt CMakeFiles CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake _build/ dist_manifest.txt test-results.json *.pyc # Windows things *.sdf *.sln *.vcxproj* .vs Debug install_manifest.txt x64 # "dist" is produced during the release process dist # `secrets-export.sh` is created by the drivers-evergreen-tools `setup_secrets.sh` script. # Ignore this file to reduce risk of committing credentials during local development. secrets-export.sh # A file that can be used to store secrets for Earthly .secretmongo-c-driver-2.2.1/.gitmodules000066400000000000000000000000001511661753600165220ustar00rootroot00000000000000mongo-c-driver-2.2.1/.lsan-suppressions000066400000000000000000000001531511661753600200670ustar00rootroot00000000000000leak:ccrng_cryptographic_init_once leak:ccrng_cryptographic_generate leak:res_9_ninit leak:SSLCreateContextmongo-c-driver-2.2.1/.tsan-suppressions000066400000000000000000000000251511661753600200750ustar00rootroot00000000000000race:mongoc_counter* mongo-c-driver-2.2.1/.ubsan-suppressions000066400000000000000000000011051511661753600202400ustar00rootroot00000000000000# src/utf8proc-2.8.0/utf8proc.c:368:53: runtime error: applying zero offset to null pointer # src/utf8proc-2.8.0/utf8proc.c:554:20: runtime error: applying zero offset to null pointer # # Upstream Fix: https://github.com/JuliaStrings/utf8proc/pull/240 # # Context: https://github.com/llvm/llvm-project/commit/536b0ee40ab97f2878dc124a321cf9108ee3d233 # > To make things more fun, in C (6.5.6p8), applying *any* offset to null pointer # > is undefined, although Clang front-end pessimizes the code by not lowering # > that info, so this UB is "harmless". pointer-overflow:utf8proc.c mongo-c-driver-2.2.1/CMakeLists.txt000066400000000000000000000476441511661753600171360ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) list (INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/build/cmake") # Defines BUILD_VERSION, which we use throughout: include (BuildVersion) project ( mongo-c-driver LANGUAGES C # BUILD_VERSION_SIMPLE is a CMake-compatible version number that omits suffixes VERSION "${BUILD_VERSION_SIMPLE}" ) # Set MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION, etc. include (ParseVersion) ParseVersion ("${BUILD_VERSION}" MONGOC) # Defines additional similar variables: include (LoadVersion) LoadVersion (VERSION_CURRENT MONGOC) # Extended version attributes that CMake doesn't (yet) understand, which include # the prerelease tag. Named here to match the variables generated by project() set(mongo-c-driver_VERSION_PRERELEASE ${MONGOC_PRERELEASE_VERSION}) set(mongo-c-driver_VERSION_FULL ${MONGOC_VERSION}) include(FeatureSummary) include (MongoSettings) include (MongoPlatform) include (GeneratePkgConfig) include (VerifyHeaders) # Subcomponents: mongo_bool_setting(ENABLE_MONGOC "Enable the build of libmongoc libraries (The MongoDB C database driver)") mongo_bool_setting( USE_SYSTEM_LIBBSON [[Use an existing libbson library (via find_package()) instead of building one from source]] DEFAULT VALUE OFF ADVANCED ) # Deprecated option "ENABLE_BSON" is gone, but old caches may rely on SYSTEM to # disable the libbson build. Allow ENABLE_BSON=SYSTEM only if USE_SYSTEM_LIBBSON # is also true, to allow both ENABLE_BSON=SYSTEM and USE_SYSTEM_LIBBSON=TRUE to # simplify downstream build scripts if(ENABLE_BSON STREQUAL "SYSTEM" AND NOT USE_SYSTEM_LIBBSON) # User set ENABLE_BSON=SYSTEM, so they intend for us to build against an external # libbson, but they didn't set USE_SYSTEM_LIBBSON=ON, so they are probably # unaware of this change. Rather than miscompile, stop what we're doing: message(FATAL_ERROR "ENABLE_BSON=SYSTEM is no longer supported. Use USE_SYSTEM_LIBBSON=ON for the same effect.") endif() # Toggle static libraries: mongo_setting( ENABLE_STATIC "Enable building and installing static library archive artifacts" OPTIONS ON OFF BUILD_ONLY DEFAULT VALUE "ON" ) # Toggle dynamic libraries: mongo_bool_setting(ENABLE_SHARED "Enable building and installing dynamic library artifacts") # Toggle PIC if(NOT WIN32) mongo_bool_setting(ENABLE_PIC "Enable position-independent code when building static libraries (Not applicable on Windows)") elseif(DEFINED ENABLE_PIC) # We are on Windows, and ENABLE_PIC is defined. message(STATUS "ENABLE_PIC=“${ENABLE_PIC}†has no effect on Windows (All Windows code is position-independent)") else() # We are on Windows, and ENABLE_PIC is not defined, which is normal endif() # Dev mode checks: mongo_bool_setting( ENABLE_MAINTAINER_FLAGS "Enable stricter build-time checks" DEFAULT VALUE OFF DEVEL EVAL [[ if(MSVC) set(DEFAULT OFF) else() set(DEFAULT ON) endif() ]]) # Toggle instrumentation: mongo_bool_setting(ENABLE_TRACING "Enable runtime tracing output in the built libmongoc (Very noisy!)" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_COVERAGE "Build code with coverage instrumentation" DEFAULT VALUE OFF DEVEL VALUE ON) mongo_bool_setting(ENABLE_DEBUG_ASSERTIONS "Build library with runtime debug assertions enabled" DEFAULT VALUE OFF DEVEL VALUE ON) # for MONGO_SANITIZE: include(Sanitizers) # Toggle optional components: mongo_bool_setting(ENABLE_TESTS "Enable building MongoDB C Driver tests") mongo_bool_setting(ENABLE_EXAMPLES "Enable building MongoDB C Driver examples") mongo_bool_setting(ENABLE_MAN_PAGES "Enable building the manual pages" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_HTML_DOCS "Enable building the HTML documentation" DEFAULT VALUE OFF) mongo_bool_setting(ENABLE_UNINSTALL "Generate an 'uninstall' script and an 'uninstall' build target") mongo_bool_setting(ENABLE_SRV "Enable support for mongodb+srv URIs.") # Optional features that are ENABLED when necessary dependencies are found: mongo_setting(ENABLE_SNAPPY "Enable Snappy compression support" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_ZSTD "Enable zstd compression support" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_ZLIB "Enable zlib compression support" OPTIONS BUNDLED SYSTEM OFF DEFAULT VALUE BUNDLED) mongo_bool_setting(USE_BUNDLED_UTF8PROC "Enable building with utf8proc. Needed for SCRAM-SHA-256 authentication with non-ASCII passwords" ADVANCED) mongo_setting( ENABLE_SSL [[Enable TLS connection and SCRAM authentication.]] OPTIONS WINDOWS DARWIN OPENSSL OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(ENABLE_SSL STREQUAL "DARWIN" AND NOT APPLE) message(WARNING "ENABLE_SSL=DARWIN is only supported on Apple platforms") elseif(ENABLE_SSL STREQUAL "WINDOWS" AND NOT WIN32) message(WARNING "ENABLE_SSL=WINDOWS is only supported on Windows platforms") endif() ]] ) mongo_bool_setting( ENABLE_SHM_COUNTERS "Enable memory performance counters" DEFAULT EVAL [[ set(DEFAULT OFF) if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" OR (APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")) set(DEFAULT ON) endif() ]] VALIDATE CODE [[ if(ENABLE_SHM_COUNTERS AND NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" AND NOT (APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")) message(WARNING "ENABLE_SHM_COUNTERS=ON is only supported on Linux or ARM Darwin") endif() ]] ) mongo_setting( ENABLE_SASL "Enable SASL authentication (Kerberos)" OPTIONS CYRUS SSPI OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(ENABLE_SASL STREQUAL "SSPI" AND NOT WIN32) message(WARNING "ENABLE_SASL=SSPI is only supported on Windows platforms") endif() if(ENABLE_SASL STREQUAL "CYRUS" AND WIN32) message(WARNING "ENABLE_SASL=CYRUS on Windows platforms is unsupported. Use ENABLE_SASL=SSPI or ENABLE_SASL=OFF instead") endif() ]] ) mongo_setting(ENABLE_CLIENT_SIDE_ENCRYPTION "Enable In-Use Encryption support. Requires additional support libraries." OPTIONS ON OFF AUTO DEFAULT VALUE AUTO) mongo_setting(ENABLE_MONGODB_AWS_AUTH "Enable support for the MONGODB-AWS authentication mechanism" OPTIONS ON OFF AUTO DEFAULT VALUE AUTO VALIDATE CODE [[ if(NOT ENABLE_MONGODB_AWS_AUTH STREQUAL "ON") return() endif() if(MSVC AND MSVC_VERSION LESS 1900) message(FATAL_ERROR "Visual Studio 2015 or newer is required for ENABLE_MONGODB_AWS_AUTH=ON") elseif(ENABLE_SSL STREQUAL "OFF") message(FATAL_ERROR "ENABLE_MONGODB_AWS_AUTH=ON requires that ENABLE_SSL not be 'OFF'") endif() ]]) # Optional features that are DISABLED by default: mongo_bool_setting(ENABLE_RDTSCP "Enable fast performance counters using the Intel RDTSCP instruction" DEFAULT VALUE OFF) mongo_bool_setting( ENABLE_CRYPTO_SYSTEM_PROFILE "Use system crypto profile" DEFAULT VALUE OFF VALIDATE CODE [[ if(ENABLE_CRYPTO_SYSTEM_PROFILE AND NOT ENABLE_SSL STREQUAL "OPENSSL") message(WARNING "ENABLE_CRYPTO_SYSTEM_PROFILE=TRUE is only applicable when ENABLE_SSL=OPENSSL") endif() ]] ) # Announce the build configuration. Used by `mlib_build_config_is()` in `mlib/config.h` add_compile_definitions(_MLIB_BUILD_CONFIG=$) if(ENABLE_COVERAGE) mongo_platform_link_options(--coverage) mongo_platform_compile_options($) include(CheckCCompilerFlag) check_c_compiler_flag("-fprofile-update=prefer-atomic" mongo_c_driver_prefer_atomic) if("$CACHE{mongo_c_driver_prefer_atomic}") # Avoid "ERROR: Unexpected negative count" errors on some newer platforms. mongo_platform_compile_options($) endif() endif() # Enable multi-threading: set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) mongo_platform_use_target(Threads::Threads) set_property(DIRECTORY APPEND PROPERTY pkg_config_LIBS ${CMAKE_THREAD_LIBS_INIT}) if(WIN32) # Required for gethostbyname on Windows: mongo_platform_link_libraries(ws2_32) endif() # librt needed on linux for clock_gettime find_library(RT_LIBRARY rt PATHS /usr/lib32) if(RT_LIBRARY) mongo_platform_link_libraries(${RT_LIBRARY}) # Set required libraries for CHECK_FUNCTION_EXISTS list(APPEND CMAKE_REQUIRED_LIBRARIES "${RT_LIBRARY}") # Export the rt linkage as a pkg-config property: get_filename_component(rt_dir "${RT_LIBRARY}" DIRECTORY) set_property(DIRECTORY APPEND PROPERTY pkg_config_LIBS "-L${rt_dir}" -lrt) endif() # On macOS Big Sur, libm resolves to the SDK's tbd file, like: # /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/libm.tbd # Not all consumers can easily link to a tbd file (notably golang will reject a tbd suffix by default) # macOS includes libm as part of libSystem (along with libc). # It does not need to be explicitly linked. if(NOT APPLE) find_library(M_LIBRARY m) if(M_LIBRARY) mongo_platform_link_libraries(${M_LIBRARY}) endif() endif() # Check for an optional C++ compiler. Result included in handshake metadata. Enables optional C++-specific tests. include (CheckLanguage) check_language (CXX) if (CMAKE_CXX_COMPILER) enable_language (CXX) if (NOT CMAKE_CXX_STANDARD) # Default to C++11 for purposes of testing. set (CMAKE_CXX_STANDARD 11) endif () else () message (STATUS "No CXX support") endif () if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set (CMAKE_BUILD_TYPE "RelWithDebInfo") message ( STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}" ) endif () include (InstallRequiredSystemLibraries) include (CMakeDependentOption) # Installation paths include (GNUInstallDirs) # The directory where CMake config packages will be installed, based on the libdir from GNUInstallDirs mongo_setting( MONGO_C_DRIVER_INSTALL_CMAKEDIR "The directory in which CMake package files will be installed" TYPE STRING DEFAULT VALUE "${CMAKE_INSTALL_LIBDIR}/cmake" VALIDATE CODE [[ if(IS_ABSOLUTE "${MONGO_C_DRIVER_INSTALL_CMAKEDIR}") message(SEND_ERROR "The CMake installation directory must be a relative path (Got “${MONGO_C_DRIVER_INSTALL_CMAKEDIR}â€)") endif() ]] ) include(MongoC-Warnings) # Enable "maintainer flags," which are supplementary but not mandatory. # (As opposed to MongoC-Warnings.cmake, which defines "the code is broken" warnings) if(ENABLE_MAINTAINER_FLAGS) mongoc_add_warning_options( gnu-like:-Werror gnu-like:-pedantic gnu-like:-Wall gnu-like:-Wempty-body gnu:not-gcc-lt7:-Wexpansion-to-defined gnu-like:-Winit-self gnu-like:-Wmissing-include-dirs gnu-like:-Wredundant-decls gnu-like:-Wshadow gnu-like:lang-c:-Wstrict-prototypes gnu-like:-Wswitch-default gnu-like:-Wswitch-enum gnu-like:-Wundef gnu-like:-Wuninitialized # Disabled, for now: gnu-like:-Wno-strict-aliasing gnu-like:-Wno-missing-braces # Sign-comparison-mismatch: gnu-like:-Wsign-compare msvc:/we4018 ) endif() # Link with LLD, if possible if (NOT MSVC) include (LLDLinker) endif () if ( (ENABLE_BUILD_DEPENDECIES STREQUAL OFF) AND (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) ) set (ENABLE_BUILD_DEPENDECIES ON) endif () mongo_pick(MONGOC_ENABLE_RDTSCP 1 0 ENABLE_RDTSCP) mongo_pick(MONGOC_ENABLE_STATIC_BUILD 1 0 ENABLE_STATIC) mongo_pick(MONGOC_ENABLE_STATIC_INSTALL 1 0 [[ENABLE_STATIC AND NOT ENABLE_STATIC STREQUAL "BUILD_ONLY"]]) if (USE_SYSTEM_LIBBSON) find_package (bson "${PROJECT_VERSION}" REQUIRED) # Disable test-libmongoc since we are using a system libbson set (ENABLE_TESTS OFF) set (USING_SYSTEM_BSON TRUE) if (NOT TARGET bson::shared) message (FATAL_ERROR "System libbson built without shared library target") endif () if (NOT TARGET bson::static) message (FATAL_ERROR "System libbson built without static library target") endif () endif () set (BUILD_SOURCE_DIR ${CMAKE_BINARY_DIR}) # Enable CTest include (CTest) if (BUILD_TESTING) include (TestFixtures) include (src/libmongoc/tests/import-tests.cmake) endif () # Ensure the default behavior: don't ignore RPATH settings. set (CMAKE_SKIP_BUILD_RPATH OFF) # Ensure the default behavior: don't use the final install destination as the # temporary RPATH for executables (ensure we can run tests and programs from # the build directory). set (CMAKE_BUILD_WITH_INSTALL_RPATH OFF) # Include any custom library paths in the final RPATH. set (CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) # Install libs with names like @rpath/libfoo.dylib, not bare names. set (CMAKE_MACOSX_RPATH ON) # Distinguish DLL import libs with a .dll.lib suffix. Also prevents filename collisions # between static libraries and the import libraries if(WIN32) set (CMAKE_IMPORT_LIBRARY_SUFFIX .dll.lib) endif() # By default, ensure conformance with a minimum C standard. # Required extensions to the language (i.e. POSIX) are (re)enabled further below. if (NOT DEFINED CMAKE_C_STANDARD) set (CMAKE_C_STANDARD 99) endif () if (NOT DEFINED CMAKE_C_STANDARD_REQUIRED) set (CMAKE_C_STANDARD_REQUIRED ON) endif () if (NOT DEFINED CMAKE_C_EXTENSIONS) set (CMAKE_C_EXTENSIONS OFF) endif () # https://man7.org/linux/man-pages/man7/feature_test_macros.7.html # https://pubs.opengroup.org/onlinepubs/7908799/xsh/compilation.html # Enable POSIX features up to POSIX.1-2008 plus the XSI extension and BSD-derived definitions. # Both _BSD_SOURCE and _DEFAULT_SOURCE are defined for backwards-compatibility with glibc 2.19 and earlier. # _BSD_SOURCE and _DEFAULT_SOURCE are required by `getpagesize`, `h_errno`, etc. # _XOPEN_SOURCE=700 is required by `strnlen`, `strerror_l`, etc. add_definitions (-D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_DEFAULT_SOURCE) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -D_DEFAULT_SOURCE) # Enable non-standard features on FreeBSD with __BSD_VISIBLE=1 if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") add_definitions (-D__BSD_VISIBLE=1) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D__BSD_VISIBLE=1) endif () # https://opensource.apple.com/source/Libc/Libc-1439.40.11/gen/compat.5.auto.html # Non-POSIX extensions are required by `_SC_NPROCESSORS_ONLN`. if (CMAKE_SYSTEM_NAME MATCHES "Darwin") add_definitions (-D_DARWIN_C_SOURCE) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_DARWIN_C_SOURCE) endif () # Convenience targets to build all tests or all examples. add_custom_target(mongo_c_driver_tests) add_custom_target(mongo_c_driver_examples) add_subdirectory (src/common) if (NOT USING_SYSTEM_BSON) message (STATUS "Using bundled libbson") add_subdirectory (src/libbson) endif () if (MSVC) add_definitions (-D_CRT_SECURE_NO_WARNINGS) list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_CRT_SECURE_NO_WARNINGS) endif () if (ENABLE_MONGOC) if (ENABLE_TESTS AND NOT MONGOC_ENABLE_STATIC_BUILD) message (FATAL_ERROR "ENABLE_TESTS requires ENABLE_STATIC or ENABLE_STATIC_BUILD") endif () set (CPACK_RESOURCE_FILE_LICENSE "${mongo-c-driver_SOURCE_DIR}/COPYING") include (CPack) # Ensure the default behavior: don't ignore RPATH settings. set (CMAKE_SKIP_BUILD_RPATH OFF) if (NOT ENABLE_MONGODB_AWS_AUTH MATCHES "ON|OFF|AUTO") message (FATAL_ERROR "ENABLE_MONGODB_AWS_AUTH option must be ON, AUTO, or OFF") endif () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 0) if (ENABLE_MONGODB_AWS_AUTH STREQUAL "AUTO") if (MSVC AND MSVC_VERSION LESS 1900) message (WARNING "MS Visual Studio too old for ENABLE_MONGODB_AWS_AUTH") elseif (NOT ENABLE_SSL) message (WARNING "Option ENABLE_MONGODB_AWS_AUTH requires ENABLE_SSL not set to OFF" ) else () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 1) endif () elseif (ENABLE_MONGODB_AWS_AUTH) if (MSVC AND MSVC_VERSION LESS 1900) message (FATAL_ERROR "Use Visual Studio 2015 or higher for ENABLE_MONGODB_AWS_AUTH") endif () if (NOT ENABLE_SSL) message (FATAL_ERROR "Option ENABLE_MONGODB_AWS_AUTH requires ENABLE_SSL not set to OFF" ) endif () set (MONGOC_ENABLE_MONGODB_AWS_AUTH 1) endif () add_subdirectory (src/libmongoc) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) message (STATUS "Building with MONGODB-AWS auth support") endif () if (ENABLE_MAN_PAGES STREQUAL ON OR ENABLE_HTML_DOCS STREQUAL ON) find_package (Sphinx REQUIRED) add_custom_target (doc ALL DEPENDS $<$>:bson-doc> $<$:mongoc-doc> ) endif () # sub-directory 'doc' was already included above add_subdirectory (src) # 'src/libbson' was already included, so 'src' will not include it directly # 'src/kms-message' was already included if appropriate # 'src/libmongoc' was already included, so 'src' will not include it directly endif () install (FILES COPYING NEWS README.rst THIRD_PARTY_NOTICES DESTINATION ${CMAKE_INSTALL_DATADIR}/mongo-c-driver/${PROJECT_VERSION} ) if (ENABLE_UNINSTALL) # Create uninstall program and associated uninstall target # # This needs to be last (after all other add_subdirectory calls) to ensure that # the generated uninstall program is complete and correct if (NOT ENABLE_MONGOC) # Generate a different script name for uninstalling libbson only: set (UNINSTALL_SCRIPT_NAME "uninstall-bson") endif () set (UNINSTALL_PROG_DIR "${CMAKE_INSTALL_DATADIR}/mongo-c-driver/${PROJECT_VERSION}") include (GenerateUninstaller) endif () # Spit out some information regarding the generated build system message (STATUS "Build files generated for:") message (STATUS "\tbuild system: ${CMAKE_GENERATOR}") if (CMAKE_GENERATOR_INSTANCE) message (STATUS "\tinstance: ${CMAKE_GENERATOR_INSTANCE}") endif () if (CMAKE_GENERATOR_PLATFORM) message (STATUS "\tinstance: ${CMAKE_GENERATOR_PLATFORM}") endif () if (CMAKE_GENERATOR_TOOLSET) message (STATUS "\tinstance: ${CMAKE_GENERATOR_TOOLSET}") endif () if (TARGET test-libmongoc) # Generate a file that can be included by CTest to load and enumerate all of the # tests defined by the test-libmongoc executable. Generate one for each # configuration in case of multiconf generators. string (CONFIGURE [=[ set (TEST_LIBMONGOC_EXE [[$]]) set (SRC_ROOT [[@PROJECT_SOURCE_DIR@]]) set (IS_MULTICONF $) if (NOT IS_MULTICONF OR CTEST_CONFIGURATION_TYPE STREQUAL "$") # We are not in multi-conf, or the current config matches our config. include ("${SRC_ROOT}/build/cmake/LoadTests.cmake") elseif (NOT CTEST_CONFIGURATION_TYPE) # We are in multi-conf, but no '-C' config was specified message (WARNING "Specify a --build-config when using CTest with a multi-config build") else () # Do nothing. Not our config. endif () ]=] code @ONLY) file (GENERATE OUTPUT "${PROJECT_BINARY_DIR}/LoadTests-$.cmake" CONTENT "${code}") if (CMAKE_CONFIGURATION_TYPES) foreach (conf IN LISTS CMAKE_CONFIGURATION_TYPES) # Direct the generated CTest code to include() the file that loads the tests: set_property ( DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${PROJECT_BINARY_DIR}/LoadTests-${conf}.cmake") endforeach () else () set_property ( DIRECTORY APPEND PROPERTY TEST_INCLUDE_FILES "${PROJECT_BINARY_DIR}/LoadTests-${CMAKE_BUILD_TYPE}.cmake") endif () endif () if (CMAKE_GENERATOR STREQUAL "Ninja Multi-Config" AND PROJECT_IS_TOP_LEVEL) set (CMAKE_CROSS_CONFIGS "all") endif () feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES) mongo-c-driver-2.2.1/CONTRIBUTING.md000066400000000000000000000330041511661753600166100ustar00rootroot00000000000000# Contributing to mongo-c-driver Thanks for considering contributing to the mongo-c-driver! This document intends to be a short guide to helping you contribute to the codebase. It expects a familiarity with the C programming language and writing portable software. Whenever in doubt, feel free to ask others that have contributed or look at the existing body of code. ## Guidelines The mongo-c-driver has a few guidelines that help direct the process. ### Portability mongo-c-driver is portable software. It needs to run on a multitude of [Supported Platforms](https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/ref/platforms/). ### Licensing Some of the mongo-c-driver users embed the library statically in their products. Therefore, the driver and all contributions must be liberally licensed. As a policy, we have chosen Apache 2.0 as the license for the project. ### Coding Style We try not to be pedantic with taking contributions that are not properly formatted, but we will likely perform a followup commit that cleans things up. The basics are, in vim: ``` : set ts=3 sw=3 et ``` 3 space tabs, insert spaces instead of tabs. For all the gory details, see [.clang-format](.clang-format) ### Commit Style Commit messages follow this pattern: ``` CDRIVER-#### lowercase commit message ``` There's no colon after the ticket number, and no period at the end of the subject line. If there's no related Jira ticket, then the message is simply all lowercase: ``` typos in NEWS ``` We follow [the widely adopted "50/72" rule](https://medium.com/@preslavrachev/what-s-with-the-50-72-rule-8a906f61f09c): the subject line is ideally only 50 characters, but definitely only 72 characters. This requires some thoughtful writing but it's worthwhile when you're scrolling through commits. The message body can be as large as you want, wrapped at 72 columns. ### Adding a new error code or domain When adding a new error code or domain, you must do the following. This is most applicable if you are adding a new symbol with a bson_error_t as a parameter, and the existing codes or domains are inappropriate. - Add the domain to `mongoc_error_domain_t` in `src/mongoc/mongoc-error.h` - Add the code to `mongoc_error_code_t` in `src/mongoc/mongoc-error.h` - Add documentation for the domain or code to the table in `doc/mongoc_errors.rst` ### Adding a new symbol This should be done rarely but there are several things that you need to do when adding a new symbol. - Add documentation for the new symbol in `doc/mongoc_your_new_symbol_name.rst` ### Documentation We strive to document all symbols. See doc/ for documentation examples. If you add a new public function, add a new .rst file describing the function so that we can generate man pages and HTML for it. For complex internal functions, comment above the function definition with a block comment like the following: ``` /*-------------------------------------------------------------------------- * * mongoc_cmd_parts_append_read_write -- * * Append user-supplied options to @parts->command_extra, taking the * selected server's max wire version into account. * * Return: * True if the options were successfully applied. If any options are * invalid, returns false and fills out @error. In that case @parts is * invalid and must not be used. * * Side effects: * May partly apply options before returning an error. * *-------------------------------------------------------------------------- */ ``` Public functions do not need these comment blocks, since they are documented in the .rst files. To build the documentation, it is recommended to run Sphinx commands through `uv`: ```bash uv run --frozen sphinx-build -WEn -bhtml src/libmongoc/doc/ src/libmongoc/doc/html ``` `sphinx-autobuild` can be used to serve docs locally. This can be convenient when editing. Files are rebuilt when changes are detected: ```bash uv run --frozen --with 'sphinx-autobuild' sphinx-autobuild -b html src/libmongoc/doc/ src/libmongoc/doc/html --re-ignore ".*.pickle" --re-ignore ".*.doctree" -j auto ``` ### Testing To run the entire test suite, including authentication and support for the `configureFailPoint` command, start `mongod` with security and test commands enabled: ``` $ mkdir db $ mongod --auth --setParameter enableTestCommands=1 --dbpath db/ ``` In another terminal, use the `mongosh` shell to create a user: ``` $ mongosh --eval "db.createUser({user: 'bob', pwd: 'pwd123', roles: ['root']})" admin ``` Authentication in MongoDB 3.0 and later uses SCRAM-SHA-1, which in turn requires a driver built with SSL. Set the user and password environment variables, then build and run the tests: ``` $ export MONGOC_TEST_USER=bob $ export MONGOC_TEST_PASSWORD=pwd123 $ ./test-libmongoc ``` Additional environment variables: * `MONGOC_TEST_HOST`: default `localhost`, the host running MongoDB. * `MONGOC_TEST_PORT`: default 27017, MongoDB's listening port. * `MONGOC_TEST_URI`: override both host and port with a full connection string, like "mongodb://server1,server2". * `MONGOC_TEST_SERVER_LOG`: set to `stdout` or `stderr` for wire protocol logging from tests that use `mock_server_t`. Set to `json` to include these logs in the test framework's JSON output, in a format compatible with [Evergreen](https://github.com/evergreen-ci/evergreen). * `MONGOC_TEST_MONITORING_VERBOSE`: set to `on` for verbose output from Application Performance Monitoring tests. * `MONGOC_TEST_COMPRESSORS=snappy,zlib`: wire protocol compressors to use If you start `mongod` with SSL, set these variables to configure how `test-libmongoc` connects to it: * `MONGOC_TEST_SSL`: set to `on` to connect to the server with SSL. * `MONGOC_TEST_SSL_PEM_FILE`: path to a client PEM file. * `MONGOC_TEST_SSL_PEM_PWD`: the PEM file's password. * `MONGOC_TEST_SSL_CA_FILE`: path to a certificate authority file. * `MONGOC_TEST_SSL_CA_DIR`: path to a certificate authority directory. * `MONGOC_TEST_SSL_CRL_FILE`: path to a certificate revocation list. * `MONGOC_TEST_SSL_WEAK_CERT_VALIDATION`: set to `on` to relax the client's validation of the server's certificate. * `MONGOC_TEST_SCHANNEL_CRL=on`: set to `on` to enable Windows Secure Channel tests loading CRL files. * If CRL tests abort before deleting the CRL file, this may cause later test errors like `The certificate is revoked`. Manually remove the CRL file with: ```powershell $crl = ".\src\libmongoc\tests\x509gen\crl.pem" $fingerprint = (openssl crl -in ".\src\libmongoc\tests\x509gen\crl.pem" -noout -fingerprint) -replace 'SHA1 Fingerprint=', '' -replace ':', '' certutil -delstore Root $fingerprint ``` The SASL / GSSAPI / Kerberos tests are skipped by default. To run them, set up a separate `mongod` with Kerberos and set its host and Kerberos principal name as environment variables: * `MONGOC_TEST_GSSAPI_HOST` * `MONGOC_TEST_GSSAPI_USER` URI-escape the username, for example write "user@realm" as "user%40realm". The user must be authorized to query `kerberos.test`. MongoDB 3.2 adds support for readConcern, but does not enable support for read concern majority by default. mongod must be launched using `--enableMajorityReadConcern`. The test framework does not (and can't) automatically discover if this option was provided to MongoDB, so an additional variable must be set to enable these tests: * `MONGOC_ENABLE_MAJORITY_READ_CONCERN` Set this environment variable to `on` if MongoDB has enabled majority read concern. Some tests require Internet access, e.g. to check the error message when failing to open a MongoDB connection to example.com. Skip them with: * `MONGOC_TEST_OFFLINE=on` Some tests require a running MongoDB server. Skip them with: * `MONGOC_TEST_SKIP_LIVE=on` For quick checks during development, disable long-running tests: * `MONGOC_TEST_SKIP_SLOW=on` Some tests run against a local mock server, these can be skipped with: * `MONGOC_TEST_SKIP_MOCK=on` The tests for mongodb+srv:// connection strings require some setup, see the Initial DNS Seedlist Discovery Spec. By default these connection strings are NOT tested, enable them with: * `MONGOC_TEST_DNS=on` assumes a replica set is running with TLS enabled on ports 27017, 27018, and 27019. * `MONGOC_TEST_DNS_LOADBALANCED=on` assumes a load balanced sharded cluster is running with mongoses on ports 27017 and 27018 and TLS enabled. The load balancer can be listening on any port. * `MONGOC_TEST_DNS_SRV_POLLING=on` assumes a sharded cluster is running with mongoses on ports 27017, 27018, 27019, and 27020 and TLS enabled. The mock server timeout threshold for future functions can be set with: * `MONGOC_TEST_FUTURE_TIMEOUT_MS=` This is useful for debugging, so future calls don't timeout when stepping through code. Tests of In-Use Encryption require credentials to external KMS providers. For AWS: * `MONGOC_TEST_AWS_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWS_ACCESS_KEY_ID=` * `MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID=` An Azure: * `MONGOC_TEST_AZURE_TENANT_ID=` * `MONGOC_TEST_AZURE_CLIENT_ID=` * `MONGOC_TEST_AZURE_CLIENT_SECRET=` For GCP: * `MONGOC_TEST_GCP_EMAIL=` * `MONGOC_TEST_GCP_PRIVATEKEY=` Tests of In-Use Encryption also require temporary credentials to external KMS providers. For AWS: * `MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY=` * `MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID=` * `MONGOC_TEST_AWS_TEMP_SESSION_TOKEN=` Tests of In-Use Encryption spawn an extra process, "mongocryptd", by default. To bypass this spawning, start mongocryptd on port 27020 and set the following: * `MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN=on` KMS TLS tests for In-Use Encryption require mock KMS servers to be running in the background. The [Setup instructions](https://github.com/mongodb/specifications/tree/master/source/client-side-encryption/tests#setup-3) given in the Client Side Encryption Tests specification provide additional information. The mock server scripts are located in the [mongodb-labs/drivers-evergreen-tools](https://github.com/mongodb-labs/drivers-evergreen-tools) in the [csfle directory](https://github.com/mongodb-labs/drivers-evergreen-tools/tree/master/.evergreen/csfle). The mock servers use certificates located in the [x509gen](https://github.com/mongodb-labs/drivers-evergreen-tools/tree/master/.evergreen/x509gen) directory. The set of mock KMS servers running in the background and their corresponding invocation command must be as follows: | Port | CA File | Cert File | Command | | --- | --- | --- | --- | | 8999 | ca.pem | server.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8999 | 9000 | ca.pem | expired.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 9000 | 9001 | ca.pem | wrong-host.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 9001 | 9002 | ca.pem | server.pem | python -u kms_http_server.py --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --require_client_cert --port 9002 | 5698 | ca.pem | server.pem | python -u kms_kmip_server.py | 9003 | ca.pem | server.pem | python kms_failpoint_server.py --port 9003 The path to `ca.pem` and `client.pem` must be passed through the following environment variables: * `MONGOC_TEST_CSFLE_TLS_CA_FILE=` * `MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE=` Specification tests may be filtered by their description: * `MONGOC_JSON_SUBTEST=` This can be useful in debugging a specific test case in a spec test file with multiple tests. Example: ```sh MONGOC_JSON_SUBTEST="Insert with randomized encryption, then find it" \ ./cmake-build/src/libmongoc/test-libmongoc -l "/client_side_encryption/legacy/basic" ``` To test with a declared API version, you can pass the API version using an environment variable: * `MONGODB_API_VERSION=` This will ensure that all tests declare the indicated API version when connecting to a server. To test a load balanced deployment, set the following environment variables: * `MONGOC_TEST_LOADBALANCED=on` * `SINGLE_MONGOS_LB_URI=` to a MongoDB URI with a host of a load balancer fronting one mongos. * `MULTI_MONGOS_LB_URI=` to a MongoDB URI with a host of a load balancer fronting multiple mongos processes. To run test cases with large allocations, set: * `MONGOC_TEST_LARGE_ALLOCATIONS=on` This may result in sudden test suite termination due to allocation failure. Use with caution. * `MONGOC_TEST_OIDC=on` to test OIDC using a test environment described [here](https://github.com/mongodb-labs/drivers-evergreen-tools/tree/d7a7337b384392a09fbe7fc80a7244e6f1226c18/.evergreen/auth_oidc). * `MONGOC_AZURE_RESOURCE=` to test OIDC using an Azure test environment described [here](https://github.com/mongodb-labs/drivers-evergreen-tools/blob/d7a7337b384392a09fbe7fc80a7244e6f1226c18/.evergreen/auth_oidc/azure/README.md). All tests should pass before submitting a patch. ## Configuring the test runner The test runner can be configured with command-line options. Run `test-libmongoc --help` for details. To run just a specific portion of the test suite use the -l option like so: ``` $ ./test-libmongoc -l "/server_selection/*" ``` The full list of tests is shown in the help. mongo-c-driver-2.2.1/COPYING000066400000000000000000000236761511661753600154300ustar00rootroot00000000000000 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 mongo-c-driver-2.2.1/Earthfile000066400000000000000000000545371511661753600162230ustar00rootroot00000000000000VERSION --arg-scope-and-set --pass-args --use-function-keyword 0.7 LOCALLY # Allow setting the "default" container image registry to use for image short names (e.g. to Amazon ECR). ARG --global default_search_registry=docker.io IMPORT ./tools/ AS tools # For target names, descriptions, and build parameters, run the "doc" Earthly subcommand. # Example use: +build --env=u22 --sasl=off --tls=OpenSSL --c_compiler=gcc # COPY_SOURCE : # Copy source files required for the build into the specified "--into" directory COPY_SOURCE: FUNCTION ARG --required into COPY --dir \ build/ \ CMakeLists.txt \ COPYING \ NEWS \ README.rst \ src/ \ THIRD_PARTY_NOTICES \ VERSION_CURRENT \ "$into" # CONFIGURE : # Configure the project in $source_dir into $build_dir with a common set of configuration options CONFIGURE: FUNCTION ARG --required source_dir ARG --required build_dir ARG --required tls ARG --required sasl RUN cmake -S "$source_dir" -B "$build_dir" -G "Ninja Multi-Config" \ -D ENABLE_MAINTAINER_FLAGS=ON \ -D ENABLE_SHM_COUNTERS=ON \ -D ENABLE_SASL=$(echo $sasl | __str upper) \ -D ENABLE_SNAPPY=ON \ -D ENABLE_SRV=ON \ -D ENABLE_ZLIB=BUNDLED \ -D ENABLE_SSL=$(echo $tls | __str upper) \ -D ENABLE_COVERAGE=ON \ -D ENABLE_DEBUG_ASSERTIONS=ON \ -Werror # build : # Build libmongoc and libbson using the specified environment. # # The --env argument specifies the build environment among the `+env.xyz` environment # targets, using --purpose=build for the build environment. Refer to the target # list for a list of available build environments. build: # env is an argument ARG --required env FROM --pass-args +env.$env --purpose=build # The configuration to be built ARG config=RelWithDebInfo # The prefix at which to install the built result ARG install_prefix=/opt/mongo-c-driver # Build configuration parameters. Will be case-normalized for CMake usage. ARG --required sasl ARG --required tls LET source_dir=/opt/mongoc/source LET build_dir=/opt/mongoc/build DO +COPY_SOURCE --into=$source_dir ENV CCACHE_HOME=/root/.cache/ccache DO --pass-args +CONFIGURE --source_dir=$source_dir --build_dir=$build_dir RUN --mount=type=cache,target=$CCACHE_HOME \ env CCACHE_BASE="$source_dir" \ cmake --build $build_dir --config $config RUN cmake --install $build_dir --prefix="$install_prefix" --config $config SAVE ARTIFACT /opt/mongoc/build/* /build-tree/ SAVE ARTIFACT /opt/mongo-c-driver/* /root/ # test-example will build one of the libmongoc example projects using the build # that comes from the +build target. Arguments for +build should also be provided test-example: ARG --required env FROM --pass-args +env.$env --purpose=build # Grab the built library COPY --pass-args +build/root /opt/mongo-c-driver # Add the example files COPY --dir \ src/libmongoc/examples/cmake \ src/libmongoc/examples/hello_mongoc.c \ /opt/mongoc-test/ # Configure and build it RUN cmake \ -S /opt/mongoc-test/cmake/find_package \ -B /bld \ -G Ninja \ -D CMAKE_PREFIX_PATH=/opt/mongo-c-driver RUN cmake --build /bld # test-cxx-driver : # Clone and build the mongo-cxx-driver project, using the current mongo-c-driver # for the build. # # The “--test_mongocxx_ref†argument must be a clone-able Git ref. The driver source # will be cloned at this point and built. # # The “--cxx_version_current†argument will be inserted into the VERSION_CURRENT # file for the cxx-driver build. The default value is “0.0.0†# # Arguments for +build should be provided. test-cxx-driver: ARG --required env ARG --required test_mongocxx_ref FROM --pass-args +env.$env --purpose=build ARG cxx_compiler IF test "$cxx_compiler" = "" # No cxx_compiler is set, so infer based on a possible c_compiler option ARG c_compiler IF test "$c_compiler" != "" # ADD_CXX_COMPILER will remap the C compiler name to an appropriate C++ name LET cxx_compiler="$c_compiler" ELSE LET cxx_compiler = gcc END END ARG cxx_version_current=0.0.0 DO tools+ADD_CXX_COMPILER --cxx_compiler=$cxx_compiler COPY --pass-args +build/root /opt/mongo-c-driver LET source=/opt/mongo-cxx-driver/src LET build=/opt/mongo-cxx-driver/bld GIT CLONE --branch=$test_mongocxx_ref https://github.com/mongodb/mongo-cxx-driver.git $source RUN echo $cxx_version_current > $source/build/VERSION_CURRENT RUN cmake -S $source -B $build -G Ninja -D CMAKE_PREFIX_PATH=/opt/mongo-c-driver -D CMAKE_CXX_STANDARD=17 ENV CCACHE_HOME=/root/.cache/ccache ENV CCACHE_BASE=$source RUN --mount=type=cache,target=$CCACHE_HOME cmake --build $build # PREP_CMAKE "warms up" the CMake installation cache for the current environment PREP_CMAKE: FUNCTION # Run all CMake commands using uvx: RUN __alias cmake uvx cmake RUN __alias ctest uvx --from=cmake ctest # Executing any CMake command will warm the cache: RUN cmake --version | head -n 1 env-warmup: ARG --required env BUILD --pass-args +env.$env --purpose=build BUILD --pass-args +env.$env --purpose=test # Simultaneously builds and tests multiple different platforms multibuild: BUILD +run --targets "test-example" \ --env=alpine3.19 --env=alpine3.20 --env=alpine3.21 --env=alpine3.22 \ --env=u20 --env=u22 --env=u24 \ --env=centos9 --env=centos10 \ --env=almalinux8 --env=almalinux9 --env=almalinux10 \ --env=archlinux \ --tls=OpenSSL --tls=off \ --sasl=Cyrus --sasl=off \ --c_compiler=gcc --c_compiler=clang \ --test_mongocxx_ref=master # release-archive : # Create a release archive of the source tree. (Refer to dev docs) release-archive: FROM $default_search_registry/library/alpine:3.20 RUN apk add git bash ARG --required prefix ARG --required ref WORKDIR /s COPY --dir .git . # Get the commit hash that we are archiving. Use ^{commit} to "dereference" tag objects LET revision = $(git rev-parse "$ref^{commit}") RUN git restore --quiet --source=$revision -- VERSION_CURRENT LET version = $(cat VERSION_CURRENT) # Pick the waterfall project based on the tag COPY tools+tools-dir/__str /usr/local/bin/__str IF __str test "$version" -matches ".*\.0\$" # This is a minor release. Link to the build on the main project. LET base = "mongo_c_driver" ELSE # This is (probably) a patch release. Link to the build on the release branch. LET base = "mongo_c_driver_latest_release" END # The augmented SBOM must be manually obtained from a recent execution of # the `sbom` task in an Evergreen patch or commit build in advance. COPY etc/augmented-sbom.json cyclonedx.sbom.json # The full link to the build for this commit LET waterfall_url = "https://spruce.mongodb.com/version/${base}_${revision}" # Insert the URL into the SSDLC report COPY etc/ssdlc.md ssdlc_compliance_report.md RUN sed -i " s|@waterfall_url@|$waterfall_url|g s|@version@|$version|g " ssdlc_compliance_report.md # Generate the archive RUN git archive -o release.tar.gz \ --prefix="$prefix/" \ # Set the archive path prefix "$revision" \ # Add the source tree --add-file cyclonedx.sbom.json \ # Add the SBOM --add-file ssdlc_compliance_report.md SAVE ARTIFACT release.tar.gz # Obtain the signing public key. Exported as an artifact /c-driver.pub signing-pubkey: FROM $default_search_registry/library/alpine:3.20 RUN apk add curl RUN curl --location --silent --fail "https://pgp.mongodb.com/c-driver.pub" -o /c-driver.pub SAVE ARTIFACT /c-driver.pub # sign-file : # Sign an arbitrary file. This uses internal MongoDB tools and requires authentication # to be used to access them. (Refer to dev docs) sign-file: # Pull from Garasign: FROM 901841024863.dkr.ecr.us-east-1.amazonaws.com/release-infrastructure/garasign-gpg # Copy the file to be signed ARG --required file COPY $file /s/file # Run the GPG signing command. Requires secrets! RUN --secret GRS_CONFIG_USER1_USERNAME --secret GRS_CONFIG_USER1_PASSWORD \ gpgloader && \ gpg --yes --verbose --armor --detach-sign --output=/s/signature.asc /s/file # Export the detatched signature SAVE ARTIFACT /s/signature.asc / # Verify the file signature against the public key COPY +signing-pubkey/c-driver.pub /s/ RUN touch /keyring && \ gpg --no-default-keyring --keyring /keyring --import /s/c-driver.pub && \ gpgv --keyring=/keyring /s/signature.asc /s/file # signed-release : # Generate a signed release artifact. Refer to the "Earthly" page of our dev docs for more information. # (Refer to dev docs) signed-release: FROM $default_search_registry/library/alpine:3.20 RUN apk add git # The version of the release. This affects the filepaths of the output and is the default for --ref ARG --required version # The Git revision of the repository to be archived. By default, archives the tag of the given version ARG ref=refs/tags/$version # File stem and archive prefix: LET stem="mongo-c-driver-$version" WORKDIR /s # Run the commands "locally" so that the files can be transferred between the # targets via the host filesystem. LOCALLY # Clean out a scratch space for us to work with LET rel_dir = ".scratch/release" RUN rm -rf -- "$rel_dir" # Primary artifact files LET rel_tgz = "$rel_dir/$stem.tar.gz" LET rel_asc = "$rel_dir/$stem.tar.gz.asc" # Make the release archive: COPY (+release-archive/ --prefix=$stem --ref=$ref) $rel_dir/ RUN mv $rel_dir/release.tar.gz $rel_tgz # Sign the release archive: COPY (+sign-file/signature.asc --file $rel_tgz) $rel_asc # Save them as an artifact. SAVE ARTIFACT $rel_dir /dist # Remove our scratch space from the host. Getting at the artifacts requires `earthly --artifact` RUN rm -rf -- "$rel_dir" # This target is simply an environment in which the SilkBomb executable is available. silkbomb: FROM 901841024863.dkr.ecr.us-east-1.amazonaws.com/release-infrastructure/silkbomb:2.0 # Alias the silkbomb executable to a simpler name: RUN ln -s /python/src/sbom/silkbomb/bin /usr/local/bin/silkbomb # sbom-generate : # Generate/update the etc/cyclonedx.sbom.json file from the etc/purls.txt file. # # This target will update the existing etc/cyclonedx.sbom.json file in-place based # on the content of etc/purls.txt and etc/cyclonedx.sbom.json. sbom-generate: FROM +silkbomb # Copy in the relevant files: WORKDIR /s COPY etc/purls.txt etc/cyclonedx.sbom.json /s/ # Update the SBOM file: RUN silkbomb update \ --refresh \ --no-update-sbom-version \ --purls purls.txt \ --sbom-in cyclonedx.sbom.json \ --sbom-out cyclonedx.sbom.json # Save the result back to the host: SAVE ARTIFACT /s/cyclonedx.sbom.json AS LOCAL etc/cyclonedx.sbom.json # sbom-generate-new-serial-number: # Equivalent to +sbom-generate but includes the --generate-new-serial-number # flag to generate a new unique serial number and reset the SBOM version to 1. # # This target will update the existing etc/cyclonedx.sbom.json file in-place based # on the content of etc/purls.txt and etc/cyclonedx.sbom.json. sbom-generate-new-serial-number: FROM +silkbomb # Copy in the relevant files: WORKDIR /s COPY etc/purls.txt etc/cyclonedx.sbom.json /s/ # Update the SBOM file: RUN silkbomb update \ --refresh \ --generate-new-serial-number \ --purls purls.txt \ --sbom-in cyclonedx.sbom.json \ --sbom-out cyclonedx.sbom.json # Save the result back to the host: SAVE ARTIFACT /s/cyclonedx.sbom.json AS LOCAL etc/cyclonedx.sbom.json # sbom-validate: # Validate the SBOM Lite for the given branch. sbom-validate: FROM +silkbomb # Copy in the relevant files: WORKDIR /s COPY etc/purls.txt etc/cyclonedx.sbom.json /s/ # Run the SilkBomb tool to download the artifact that matches the requested branch RUN silkbomb validate \ --purls purls.txt \ --sbom-in cyclonedx.sbom.json \ --exclude jira snyk: FROM --platform=linux/amd64 $default_search_registry/library/ubuntu:24.04 RUN apt-get update && apt-get -y install curl RUN curl --location https://github.com/snyk/cli/releases/download/v1.1291.1/snyk-linux -o /usr/local/bin/snyk RUN chmod a+x /usr/local/bin/snyk snyk-test: FROM +snyk WORKDIR /s # Take the scan from within the `src/` directory. This seems to help Snyk # actually find the external dependencies that live there. COPY --dir src . WORKDIR src/ # Snaptshot the repository and run the scan RUN --no-cache --secret SNYK_TOKEN \ snyk test --unmanaged --json > snyk.json SAVE ARTIFACT snyk.json # snyk-monitor-snapshot : # Post a crafted snapshot of the repository to Snyk for monitoring. Refer to "Snyk Scanning" # in the dev docs for more details. snyk-monitor-snapshot: FROM +snyk WORKDIR /s ARG remote="https://github.com/mongodb/mongo-c-driver.git" ARG --required branch ARG --required name IF test "$remote" = "local" COPY --dir src . ELSE GIT CLONE --branch $branch $remote clone RUN mv clone/src . END # Take the scan from within the `src/` directory. This seems to help Snyk # actually find the external dependencies that live there. WORKDIR src/ # Snaptshot the repository and run the scan RUN --no-cache --secret SNYK_TOKEN --secret SNYK_ORGANIZATION \ snyk monitor \ --org=$SNYK_ORGANIZATION \ --target-reference=$name \ --unmanaged \ --print-deps \ --project-name=mongo-c-driver \ --remote-repo-url=https://github.com/mongodb/mongo-c-driver # test-vcpkg-classic : # Builds src/libmongoc/examples/cmake/vcpkg by using vcpkg to download and # install a mongo-c-driver build in "classic mode". *Does not* use the local # mongo-c-driver repository. test-vcpkg-classic: FROM +vcpkg-base RUN vcpkg install mongo-c-driver RUN rm -rf _build && \ make test-classic # test-vcpkg-manifest-mode : # Builds src/libmongoc/examples/cmake/vcpkg by using vcpkg to download and # install a mongo-c-driver package based on the content of a vcpkg.json manifest # that is injected into the project. test-vcpkg-manifest-mode: FROM +vcpkg-base RUN apk add jq RUN jq -n ' { \ name: "test-app", \ version: "1.2.3", \ dependencies: ["mongo-c-driver"], \ }' > vcpkg.json && \ cat vcpkg.json RUN rm -rf _build && \ make test-manifest-mode vcpkg-base: FROM $default_search_registry/library/alpine:3.18 RUN apk add cmake curl gcc g++ musl-dev ninja-is-really-ninja zip unzip tar \ build-base git pkgconf perl bash linux-headers ENV VCPKG_ROOT=/opt/vcpkg-git ENV VCPKG_FORCE_SYSTEM_BINARIES=1 GIT CLONE --branch=2023.06.20 https://github.com/microsoft/vcpkg $VCPKG_ROOT RUN $VCPKG_ROOT/bootstrap-vcpkg.sh -disableMetrics && \ install -spD -m 755 $VCPKG_ROOT/vcpkg /usr/local/bin/ LET src_dir=/opt/mongoc-vcpkg-example COPY src/libmongoc/examples/cmake/vcpkg/ $src_dir WORKDIR $src_dir # verify-headers : # Execute CMake header verification on the sources # # See `earthly.rst` for more details. verify-headers: # We test against multiple different platforms, because glibc/musl versions may # rearrange their header contents and requirements, so we want to check against as # many as possible. BUILD +do-verify-headers-impl \ --from +env.alpine3.19 \ --from +env.almalinux8 \ --from +env.u20 \ --from +env.centos10 \ --sasl=off --tls=off --cxx_compiler=gcc --c_compiler=gcc do-verify-headers-impl: ARG --required from # We don't really care about the specifics of the build env/settings, so set some # reasonable defaults so the caller doesn't need to specify. In the future, it is # possible that we will need to test other environments and build settings. FROM --pass-args "$from" --purpose=build # Add C++ so we can test as C++ headers DO --pass-args tools+ADD_CXX_COMPILER DO +COPY_SOURCE --into=/s DO --pass-args +CONFIGURE --source_dir /s --build_dir /s/_build # The "all_verify_interface_header_sets" target is created automatically # by CMake for the VERIFY_INTERFACE_HEADER_SETS target property. RUN cmake --build /s/_build --target all_verify_interface_header_sets # run : # Run one or more targets simultaneously. # # The “--targets†argument should be a single-string space-separated list of # target names (not including a leading ‘+’) identifying targets to mark for # execution. Targets will be executed concurrently. Other build arguments # will be forwarded to the executed targets. run: LOCALLY ARG --required targets FOR __target IN $targets BUILD +$__target END # d88888b d8b db db db d888888b d8888b. .d88b. d8b db .88b d88. d88888b d8b db d888888b .d8888. # 88' 888o 88 88 88 `88' 88 `8D .8P Y8. 888o 88 88'YbdP`88 88' 888o 88 `~~88~~' 88' YP # 88ooooo 88V8o 88 Y8 8P 88 88oobY' 88 88 88V8o 88 88 88 88 88ooooo 88V8o 88 88 `8bo. # 88~~~~~ 88 V8o88 `8b d8' 88 88`8b 88 88 88 V8o88 88 88 88 88~~~~~ 88 V8o88 88 `Y8b. # 88. 88 V888 `8bd8' .88. 88 `88. `8b d8' 88 V888 88 88 88 88. 88 V888 88 db 8D # Y88888P VP V8P YP Y888888P 88 YD `Y88P' VP V8P YP YP YP Y88888P VP V8P YP `8888Y' env.archlinux: FROM --pass-args tools+init-env --from $default_search_registry/library/archlinux RUN pacman-key --init ARG --required purpose RUN __install ninja snappy uv IF test "$purpose" = build RUN __install ccache END # We don't install SASL here, because it's pre-installed on Arch DO --pass-args tools+ADD_TLS DO --pass-args tools+ADD_C_COMPILER DO +PREP_CMAKE env.alpine3.19: DO --pass-args +ALPINE_ENV --version=3.19 env.alpine3.20: DO --pass-args +ALPINE_ENV --version=3.20 env.alpine3.21: DO --pass-args +ALPINE_ENV --version=3.21 env.alpine3.22: DO --pass-args +ALPINE_ENV --version=3.22 ALPINE_ENV: FUNCTION ARG --required version FROM --pass-args tools+init-env --from $default_search_registry/library/alpine:$version RUN __install bash curl ninja musl-dev make python3 ARG --required purpose IF test "$version" = "3.19" -o "$version" = "3.20" # uv is not yet available. Install via pipx. RUN __install pipx ENV PATH="/opt/uv/bin:$PATH" RUN PIPX_BIN_DIR=/opt/uv/bin pipx install uv ELSE RUN __install uv END IF test "$purpose" = "build" RUN __install snappy-dev ccache ELSE IF test "$purpose" = "test" RUN __install snappy END DO --pass-args tools+ADD_SASL DO --pass-args tools+ADD_TLS # Add "gcc" when installing Clang, since it pulls in a lot of runtime libraries and # utils that are needed for linking with Clang DO --pass-args tools+ADD_C_COMPILER --clang_pkg="gcc clang compiler-rt" DO +PREP_CMAKE env.u20: DO --pass-args +UBUNTU_ENV --version=20.04 env.u22: DO --pass-args +UBUNTU_ENV --version=22.04 env.u24: DO --pass-args +UBUNTU_ENV --version=24.04 UBUNTU_ENV: FUNCTION ARG --required version FROM --pass-args tools+init-env --from $default_search_registry/library/ubuntu:$version RUN __install curl build-essential ARG --required purpose # uv is not available via apt. Avoid snapd (systemd) by using pipx instead. RUN __install python3-venv pipx ENV PATH="/opt/uv/bin:$PATH" RUN PIPX_BIN_DIR=/opt/uv/bin pipx install uv IF test "$purpose" = build RUN __install ninja-build gcc ccache libsnappy-dev zlib1g-dev ELSE IF test "$purpose" = test RUN __install libsnappy1v5 ninja-build END DO --pass-args tools+ADD_SASL DO --pass-args tools+ADD_TLS DO --pass-args tools+ADD_C_COMPILER DO +PREP_CMAKE env.centos9: DO --pass-args +CENTOS_STREAM_ENV --version=9 --image=quay.io/centos/centos:stream9 env.centos10: DO --pass-args +CENTOS_STREAM_ENV --version=10 --image=quay.io/centos/centos:stream10 env.almalinux8: DO --pass-args +CENTOS_STREAM_ENV --version 8 --image=$default_search_registry/library/almalinux:8 env.almalinux9: DO --pass-args +CENTOS_STREAM_ENV --version 9 --image=$default_search_registry/library/almalinux:9 env.almalinux10: DO --pass-args +CENTOS_STREAM_ENV --version 10 --image=$default_search_registry/library/almalinux:10 CENTOS_STREAM_ENV: FUNCTION ARG --required version ARG --required image FROM --pass-args tools+init-env --from "$image" RUN yum -y install epel-release RUN yum -y install "dnf-command(config-manager)" IF test "$version" = "8" RUN yum config-manager --enable powertools ELSE RUN yum config-manager --enable crb END RUN yum -y install gcc gcc-c++ make ARG --required purpose IF test "$purpose" = build RUN yum -y install ninja-build ccache snappy-devel zlib-devel ELSE IF test "$purpose" = test RUN yum -y install ninja-build snappy END IF test "$version" = "8" # Neither uv nor pipx is available via yum. # uv requires Python 3.7+, but system default is Python 3.6. yum provides Python 3.8+. RUN yum -y install python38 RUN python3 -m pip install --no-warn-script-location pipx ENV PATH="/opt/uv/bin:$PATH" RUN PIPX_BIN_DIR=/opt/uv/bin python3 -m pipx install uv ELSE IF test "$version" = "9" # uv is not available via yum. Avoid snapd (systemd) by using pipx instead. RUN yum -y install pipx ENV PATH="/opt/uv/bin:$PATH" RUN PIPX_BIN_DIR=/opt/uv/bin pipx install uv ELSE RUN yum -y install uv END DO --pass-args tools+ADD_SASL --cyrus_dev_pkg="cyrus-sasl-devel" --cyrus_rt_pkg="cyrus-sasl-lib" DO --pass-args tools+ADD_TLS --openssl_dev_pkg="openssl-devel" --openssl_rt_pkg="openssl-libs" DO --pass-args tools+ADD_C_COMPILER DO +PREP_CMAKE mongo-c-driver-2.2.1/NEWS000066400000000000000000004261511511661753600150670ustar00rootroot00000000000000libmongoc 2.2.1 =============== ## Fixed * Fix applied timeout on Azure and GCP KMS requests. * Do not error if server reply to bulkWrite omits `nModified`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 2.2.0 =============== ## New Features * `MONGODB-OIDC` authentication mechanism. * Support a custom callback with `mongoc_client_set_oidc_callback` and `mongoc_client_pool_set_oidc_callback`. * Support Azure environment with property `environment:azure`. * Support GCP environment with property `environment:gcp`. * Kubernetes environment is not-yet supported. * Add features to `mongoc_bulkwrite_t`: * Add `mongoc_bulkwrite_is_acknowledged`. * Add `mongoc_bulkwriteresult_serverid`. * Support Queryable Encryption. * Support text indexes for Queryable Encryption: * Add `mongoc_client_encryption_encrypt_text_opts_t`. * Substring, prefix and suffix search are in preview and should be used for experimental workloads only. These features are unstable and their security is not guaranteed until released as Generally Available (GA). The GA version of these features may not be backwards compatible with the preview version * Support TLS v1.3 with Windows Secure Channel. ## Fixed * Do not try to resume when iterating a closed change stream. ## Notes * Raise required version of libmongocrypt from 1.13.0 to 1.15.0 to support In-Use Encryption (corresponds to the CMake option: `ENABLE_CLIENT_SIDE_ENCRYPTION`). ## Deprecated * Support for macOS 11 (EOL since September 2023) and macOS 12 (EOL since September 2024). ## Removed * Support for Visual Studio 2015 (EOL since October 2025). Use Visual Studio 2017 or newer. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Connor MacDonald * Julia Garland * Ezra Chung * Adrian Dole * Colby Pike * Roberto C. Sánchez * shubhamhii libmongoc 2.1.2 =============== ## Fixes * Fix write command options handling. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson libmongoc 1.30.6 ================ Fixes: * Fix write command options handling. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson libmongoc 2.1.1 =============== ## Fixes * Do not propagate `-fPIC` in CMake targets. * Apply write command behavior to `mongoc_collection_create_indexes_with_opts`. * Omit `saslSupportedMechs` in single-threaded monitoring commands. Thanks to everyone who contributed to the development of this release. * Julia Garland * Roberto C. Sánchez libmongoc 2.1.0 =============== ## Fixes * Windows Secure Channel is fixed to support newer signatures to verify client certificates. * Replace use of `rand()` with thread-safe alternatives. * The uninstall script for Windows is fixed so it no longer "succeeds" with a non-zero `%ERRORLABEL%` value. * The uninstall script for non-Windows environments now calls `find "$dir" -maxdepth 1` instead of `ls --almost-all "$dir"` when detecting non-empty directories to fix macOS compatibility. ## Improvements * Remove unhelpful long-lived buffers to reduce memory usage. * Improve error messages produced by Windows APIs. ## Notes * The minimum supported MongoDB Server version is raised from 4.0 to 4.2. This is in accordance with [MongoDB Software Lifecycle Schedules](https://www.mongodb.com/legal/support-policy/lifecycles). ## Changes * The CMake project now sets a CMake policy max version of `4.0` (previously unset). ## Removed * Support for Debian 9 and Debian 10. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Adrian Dole * Azat Khuzhin * Jeroen Ooms * Roberto C. Sánchez * Micah Scott libmongoc 2.0.2 =============== Fixes: * Fix message of `bson_strerror_r` on Windows. * Fix memory leaks with Windows Secure Channel. * Fix loading PKCS#8 RSA keys with Windows Secure Channel. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libmongoc 1.30.5 ================ Fixes: * Fix message of `bson_strerror_r` on Windows. * Fix memory leaks with Windows Secure Channel. * Fix loading PKCS#8 RSA keys with Windows Secure Channel. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libmongoc 2.0.1 =============== Fixes: * Fix username handling for MONGODB-X509 authentication when C driver is configured to use Secure Transport (CMake option `ENABLE_SSL=DARWIN`) or Secure Channel (CMake option `ENABLE_SSL=WINDOWS`). * Do not set empty partial result on client error for `mongoc_bulkwrite_execute`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.30.4 ================ Fixes: * Fix username handling for MONGODB-X509 authentication when C driver is configured to use Secure Transport (CMake option `ENABLE_SSL=DARWIN`) or Secure Channel (CMake option `ENABLE_SSL=WINDOWS`). * Do not set empty partial result on client error for `mongoc_bulkwrite_execute`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.30.3 ================ New Features: * In anticipation of the 2.0 release of mongo-c-driver, new CMake packages and imported targets have been defined (for both `bson` and `mongoc`). To import `mongoc` with the new names, call `find_package` for the `mongoc` package. The new imported targets are named `mongoc::static`, `mongoc::shared`, and `mongoc::mongoc` (which points to either the static or the shared library, depending on an import-time configuration option). The new package and target names will remain unchanged when upgrading to the 2.0 release, allowing consumers to support both major versions without modifying their CMake project. The current imported target names will be removed from the 2.0 release, and should not be used for forward-compatibility. Programs that link to BSON libraries directly should also use the new target names `bson::static`, `bson::shared`, or `bson::bson`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike libmongoc 2.0.0 =============== ## Notes * In a future minor release the minimum supported MongoDB Server version will be raised from 4.0 to 4.2. This is in accordance with [MongoDB Software Lifecycle Schedules](https://www.mongodb.com/legal/support-policy/lifecycles). * Raise required version of libmongocrypt to 1.13.0 to support In-Use Encryption (corresponds to the CMake option: `ENABLE_CLIENT_SIDE_ENCRYPTION`). ## Changes * Passing `batchSize:0` as an option to `mongoc_client_watch`, `mongoc_database_watch`, or `mongoc_collection_watch` now applies `batchSize:0` to the `aggregate` command. Useful to request an immediate cursor. Previously the value was ignored. * `bson_oid_init_sequence` is removed. Use `bson_oid_init` instead. * `mongoc_server_description_host` changes the return type from `mongoc_host_list_t *` to `const mongoc_host_list_t *`. * URI authentication credentials validation (only applicable during creation of a new `mongoc_uri_t` object from a connection string): * The requirement that a username is non-empty when specified is now enforced regardless of authentication mechanism. * Username and password specification requirements are now validated and returns a client error for the specified authentication mechanism. * e.g. it is a client error to not specify a username or a password for SCRAM-SHA-1, SCRAM-SHA-256, and PLAIN. * e.g. it is a client error to specify a password for MONGODB-X509. * e.g. it is a client error to specify a username or a password without the other for MONGODB-AWS. * `authSource` is now correctly defaulted to `"$external"` for MONGODB-AWS (instead of the database name or `"admin"`). * `authMechanism` is now validated and returns a client error for invalid or unsupported values. * `authMechanismProperties` is now validated and returns a client error for invalid or unsupported properties for the specified authentication mechanism. * `authMechanismProperties` now correctly supports `':'` within property values. * Old behavior: `authMechanismProperties=A:B,C:D:E,F:G` is parsed as `{'A': 'B', 'C': 'D:E,F:G'}`. * New behavior: `authMechanismProperties=A:B,C:D:E,F:G` is parsed as `{'A': 'B': 'C': 'D:E', 'F': 'G'}`. * Calling `mongoc_bulk_operation_execute` on the same `mongoc_bulk_operation_t` repeatedly is an error. Previously this was only discouraged in documentation. * Consistently apply `__cdecl` calling convention to function declarations in public API. Intended to support consumers building their code using a different [default calling convention](https://learn.microsoft.com/en-us/cpp/build/reference/gd-gr-gv-gz-calling-convention) with MSVC. The mongoc and bson libraries only support being built with the `__cdecl` default calling convention. * `mongoc_client_set_ssl_opts` now ignores a pooled `mongoc_client_t` and logs an error. Use `mongoc_client_pool_set_ssl_opts` to set TLS options on a `mongoc_client_pool_t` before popping any clients. * `mongoc_client_set_ssl_stream_initiator` now ignores a pooled `mongoc_client_t` and logs an error. * The pkg-config files `libmongoc-1.0`, `libmongoc-static-1.0`, `libbson-1.0`, and `libbson-static-1.0` have been renamed to `mongoc2`, `mongoc2-static`, `bson2`, and `bson2-static`, respectively. ### CMake Packages and Imported Targets The `mongoc-1.0` (and `bson-1.0`) CMake packages have been removed. Instead, use `mongoc` or `bson`, and specify a version or version range to be imported: ```cmake find_package(mongoc 1.30...2.0) ``` The new packages import different target names: - `mongo::mongoc_static` → `mongoc::static` - `mongo::mongoc_shared` → `mongoc::shared` - The target `mongoc::mongoc` is a shim target that points to either the shared library or the static library. The BSON library has had similar name changes. ## Removals * The `bson_md5_t` struct and associated API is removed. * The client side matching feature, `mongoc_matcher_t` and related functions are removed. * `mongoc_server_description_ismaster` is removed. Use the equivalent `mongoc_server_description_hello` instead. * `MONGOC_QUERY_SLAVE_OK` is removed. Use the equivalent `MONGOC_QUERY_SECONDARY_OK` instead. * `MONGOC_URI_SLAVEOK` is removed. It was unused. * `mongoc_client_command`, `mongoc_database_command`, and `mongoc_collection_command` are removed. Use `mongoc_client_command_simple`, `mongoc_database_command_simple`, and `mongoc_collection_command_simple` instead. * `MONGOC_URI_MAXIDLETIMEMS` and `MONGOC_URI_WAITQUEUEMULTIPLE` are removed. They were unused. * `bson_string_t` and associated functions are removed. * Support for `ENABLE_SASL=CYRUS` on Windows is removed. Use `ENABLE_SASL=SSPI` or `ENABLE_SASL=OFF` instead. * The associated Windows-only option `CYRUS_PLUGIN_PATH_PREFIX` is removed. * Support for the deprecated `minPoolSize` URI option is removed along with associated API: `MONGOC_URI_MINPOOLSIZE` and `mongoc_client_pool_min_size`. * Support for LibreSSL (the CMake option `ENABLE_SSL=LIBRESSL`) is removed. Associated API is removed (`MONGOC_ENABLE_SSL_LIBRESSL` and `mongoc_stream_tls_libressl_new`). * `MONGOC_WRITE_CONCERN_W_ERRORS_IGNORED` (value -1) is removed. Use `MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED` (value 0) which is handled equivalently. If specified in a URI, replace: `mongodb://host/?w=-1` with `mongodb://host/?w=0`. * The deprecated CMake option `ENABLE_AUTOMATIC_INIT_AND_CLEANUP` is removed. See [Initialization and cleanup](https://mongoc.org/libmongoc/1.30.2/init-cleanup.html) for expected use of `mongoc_init()` and `mongoc_cleanup()`. * `mongoc_client_get_database_names` is removed. Use `mongoc_client_get_database_names_with_opts` instead. * `mongoc_client_find_databases` is removed. Use `mongoc_client_find_databases_with_opts` instead. * `mongoc_client_get_max_message_size` is removed. * `mongoc_client_get_max_bson_size` is removed. * Deprecated `mongoc_apm_command_*_get_server_connection_id` functions are removed. Use `mongoc_apm_command_*_get_server_connection_id_int64` instead. * Deprecated index management API is removed: * `mongoc_collection_create_index_with_opts`, `mongoc_collection_create_index`, and `mongoc_collection_ensure_index` are removed. Use `mongoc_collection_create_indexes_with_opts` instead. * `mongoc_index_opt_t`, `mongoc_index_opt_geo_t` `mongoc_index_opt_wt_t` are removed. Pass options using `bson_t` to `mongoc_collection_create_indexes_with_opts` instead. * `mongoc_collection_find_indexes` is removed. Use `mongoc_collection_find_indexes_with_opts` instead. * See [MongoDB documentation](https://www.mongodb.com/docs/languages/c/c-driver/current/indexes/) for working with indexes. * Deprecated cursor API is removed: * `mongoc_cursor_is_alive` is removed. Use the equivalent `mongoc_cursor_more` instead. * `mongoc_cursor_set_hint` is removed. Use the equivalent `mongoc_cursor_set_server_id` instead. * `mongoc_cursor_get_hint` is removed. Use the equivalent `mongoc_cursor_get_server_id` instead. * `mongoc_cursor_new_from_command_reply` is removed. Use `mongoc_cursor_new_from_command_reply_with_opts` instead. * Deprecated CRUD API is removed: * `mongoc_collection_save` is removed. Use `mongoc_collection_insert_one` or `mongoc_collection_replace_one` instead. * `mongoc_collection_delete` is removed. Use `mongoc_collection_delete_one` or `mongoc_collection_delete_many` instead. * `mongoc_delete_flags_t` and `mongoc_reply_flags_t` are removed. * `mongoc_collection_find` is removed. Use `mongoc_collection_find_with_opts` instead. * `mongoc_collection_insert_bulk` is removed. Use `mongoc_collection_insert_many` instead. * `mongoc_collection_create_bulk_operation` is removed. Use `mongoc_collection_create_bulk_operation_with_opts` instead. * `mongoc_collection_get_last_error` is removed. To get results from write operations, instead use: * `mongoc_collection_update_one` * `mongoc_collection_update_many` * `mongoc_collection_replace_one` * `mongoc_collection_delete_one` * `mongoc_collection_delete_many` * `mongoc_collection_insert_one` * `mongoc_collection_insert_many` * `mongoc_bulkwrite_t` * `mongoc_bulk_operation_t` * `mongoc_bulk_operation_delete` is removed. Use `mongoc_bulk_operation_remove()` instead. * `mongoc_bulk_operation_delete_one` is removed. Use `mongoc_bulk_operation_remove_one` instead. * `mongoc_bulk_operation_get_hint` is removed. Use `mongoc_bulk_operation_get_server_id` instead. * `mongoc_bulk_operation_set_hint` is removed. Use `mongoc_bulk_operation_set_server_id` instead. * `mongoc_collection_count` and `mongoc_collection_count_with_opts` are removed. Use `mongoc_collection_count_documents` or `mongoc_collection_estimated_document_count` instead. * `mongoc_collection_stats` is removed. Use the [$collStats aggregation pipeline stage](https://www.mongodb.com/docs/manual/reference/operator/aggregation/collStats/) with `mongoc_collection_aggregate` instead. * `mongoc_collection_validate` is removed. Run the [validate](https://www.mongodb.com/docs/manual/reference/command/validate/) command directly with `mongoc_client_read_command_with_opts` instead. * Deprecated API for `mongoc_database_t` is removed: * `mongoc_database_find_collections` is removed. Use `mongoc_database_find_collections_with_opts` instead. * `mongoc_database_get_collection_names` is removed. Use `mongoc_database_get_collection_names_with_opts` instead. * Deprecated GridFS API has been removed: * `mongoc_gridfs_find` is removed. Use `mongoc_gridfs_find_with_opts` instead. * `mongoc_gridfs_find_one` is removed. Use `mongoc_gridfs_find_one_with_opts` instead. * Deprecated TLS stream API is removed: * `mongoc_stream_tls_do_handshake` is removed. Use `mongoc_stream_tls_handshake` instead. * `mongoc_stream_tls_check_cert` is removed. Use `mongoc_stream_tls_handshake` instead. * `mongoc_stream_tls_new` is removed. Use `mongoc_stream_tls_new_with_hostname` instead. * Deprecated URI API has been removed: * `mongoc_uri_get_service` is removed. Use `mongoc_uri_get_srv_hostname` instead. * `mongoc_uri_get_read_prefs` is removed. Use `mongoc_uri_get_read_prefs_t` instead. * `mongoc_uri_get_ssl` is removed. Use `mongoc_uri_get_tls` instead. * Deprecated write concern API is removed: * `mongoc_write_concern_get_fsync` is removed. Use `mongoc_write_concern_get_journal` instead. * `mongoc_write_concern_set_fsync` is removed. Use `mongoc_write_concern_set_journal` instead. * The `libmongoc-ssl-1.0` pkg-config file has been removed. ### Forwarding headers (`#include ` and `#include `) The compatibility "forwarding" headers have been removed (previously added in 1.13.0). This means it is no longer valid to include the literal header names `mongoc.h` or `bson.h` directly: ```c #include // No longer provided! #include // No longer provided! ``` Instead, the names must be prefixed with the parent directory: `mongoc/mongoc.h` and `bson/bson.h`: ```c #include #include ``` ### `mongoc_client_kill_cursor` `mongoc_client_kill_cursor` is removed. It did not accept a server identifier. It was only reliable when connected to a single server. Sending [killCursors](https://www.mongodb.com/docs/manual/reference/command/killCursors/) is not typically needed. `mongoc_cursor_t` manages the cursor lifetime. If needed, use a generic command helper to manually send a `killCursors` command: ```c bson_t *cmd = BCON_NEW ("killCursors", "coll", "cursors", "[", BCON_INT64 (cursor_id), "]"); bool ok = mongoc_client_command_simple_with_server_id (client, "db", cmd, NULL, server_id, NULL, &error); if (!ok) { printf ("Failed to send 'killCursors': %s\n", error.message); } bson_destroy (cmd); ``` ### `mongoc_client_get_server_status` `mongoc_client_get_server_status` is removed. Use a command helper to run the "serverStatus" command instead: ```c bson_t *cmd = BCON_NEW("serverStatus", BCON_INT32(1)); if (!mongoc_client_command_simple(client, "db", cmd, NULL, &reply, &error)) { printf("Failed to send 'serverStatus': %s\n", error.message); } else { // TODO: use `reply` } bson_destroy(&reply); bson_destroy(cmd); ``` ## Contributors Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Micah Scott * Jeroen Ooms libmongoc 1.30.2 ================ Fixes: * Fix C23 build on Windows. Thanks to everyone who contributed to the development of this release. * Jeroen Ooms libmongoc 1.30.1 ================ No changes since 1.30.0. Version incremented to match the libbson version. libmongoc 1.30.0 ================ Fixes: * Additional APM events required by the SDAM specification will now be delivered: * Servers that have seen `server_opening` will now see a `server_closed` prior to `topology_closed`. * Before `topology_closed`, a `topology_changed` event will transition to `Unknown` topology type. * Fix reporting insert IDs in `mongoc_bulkwrite_t` when verbose results requested. Improvements: * Improve performance of `mongoc_server_description_new_copy`. New Features: * Add support for structured logging. * See `mongoc_client_set_structured_log_opts` and `mongoc_client_pool_set_structured_log_opts`. * Add option to configure cache lifetime of In-Use Encryption data encryption keys. * See `mongoc_auto_encryption_opts_set_key_expiration` and `mongoc_client_encryption_opts_set_key_expiration`. * Support `sort` option for update and replace operations. * Support constructing a `mongoc_bulkwrite_t` without a client. * See `mongoc_bulkwrite_new` and `mongoc_bulkwrite_set_client`. Deprecated: * Support for Debian 9 and Debian 10. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Micah Scott * Jeremy Mikola * Adrian Dole * Ezra Chung * Antony Polukhin * Jeroen Ooms libmongoc 1.29.2 ================ Fixes: * Rename `set_error` function to avoid symbol conflicts. * Fix Windows ARM 64 build. * Fix comparison of uninitialized bytes. * Fix format specifier on macOS. Notes: * Windows ARM 64 is not-yet officially tested or supported. Support is community driven. Thanks to everyone who contributed to the development of this release. * Adrian Dole * Christian Schmitz * Antony Polukhin * Kevin Albertson libmongoc 1.29.1 ================ Fixes: * Assert session is consistent with client in `mongoc_bulkwrite_set_session`. Thanks to everyone who contributed to the development of this release. * Jeremy Mikola * Kevin Albertson libmongoc 1.29.0 ================ Improvements: * Retry KMS requests on transient errors. Platform Support: * Support for Visual Studio 2013 is dropped. Deprecated: * `mongoc_client_command` is deprecated and planned for removal in a future release. Use `mongoc_client_command_simple` instead. * `mongoc_database_command` is deprecated and planned for removal in a future release. Use `mongoc_database_command_simple` instead. * `mongoc_collection_command` is deprecated and planned for removal in a future release. Use `mongoc_collection_command_simple` instead. Notes: * Raise required version of libmongocrypt to 1.12.0 to support In-Use Encryption (corresponds to the CMake option: `ENABLE_CLIENT_SIDE_ENCRYPTION`). * A future minor release will raise the minimum supported MongoDB Server version from 4.0 to 4.2. This is in accordance with [MongoDB Software Lifecycle Schedules](https://www.mongodb.com/legal/support-policy/lifecycles). **Support for MongoDB Server 4.0 will be dropped in a future release!** Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Micah Scott * Adrian Dole * Andreas Braun * Joshua Siegel libmongoc 1.28.1 ================ Fixes: * Do not return result in `mongoc_bulkwritereturn_t` if there are no known successful writes. * Validate lengths in ill-formed server responses. * Do not override read preference when using aggregate with `$out/$merge` with unscanned servers. * Remove unexpected warning if `authSource` in TXT record is overriden by URI option. * Fix crash when non-existent CA file configured with OpenSSL. libmongoc 1.28.0 ================ New features: * Support In-Use Encryption range queries. * Include insert ID on result of `mongoc_collection_insert_one`. * Add new bulk write API `mongoc_bulkwrite_t`. Requires MongoDB 8.0. Reduces round-trips for mixed writes. - Add `serverMonitoringMode` URI option. Improvements: * Improve performance of OpenSSL connection creation. * Improve performance when trace logging is configured (`ENABLE_TRACING=ON`) but disabled at runtime. * Prefer FIPS compliant functions for SCRAM-SHA-256 key derivation. * Remove required slash to delimit options in MongoDB URI (e.g. `mongodb://example.com?w=1` parses the same as `mongodb://example.com/?w=1`). * Include topology description in server selection timeout errors. Notes: * Bump minimum wire protocol version from 6 (MongoDB 3.6) to 7 (MongoDB 4.0). * Raise required version of libmongocrypt to 1.11.0 to support In-Use Encryption (corresponds to the CMake option: `ENABLE_CLIENT_SIDE_ENCRYPTION`). Build Configuration: * Remove automatic ccache detection and usage (CCache.cmake). * Set [`CMAKE__COMPILER_LAUNCHER`](https://cmake.org/cmake/help/latest/envvar/CMAKE_LANG_COMPILER_LAUNCHER.html) to build with ccache. * Remove `MONGO_USE_CCACHE` (no longer applicable; see above). Changed: * Test and example targets are excluded from the `ALL` target. * All test targets can be built using the `mongo_c_driver_tests` target. * All example targets can be built using the `mongo_c_driver_examples` target. * Use `#!/usr/bin/env bash` instead of `#!/bin/sh` in uninstall script generated by `ENABLE_UNINSTALL=ON`. Deprecated: * Use of `*_hint` functions is deprecated in favor of more aptly named `*_server_id` functions: * `mongoc_bulk_operation_set_hint` is deprecated for `mongoc_bulk_operation_set_server_id` * `mongoc_bulk_operation_get_hint` is deprecated for `mongoc_bulk_operation_get_server_id` * `mongoc_cursor_set_hint` is deprecated for `mongoc_cursor_set_server_id` * `mongoc_cursor_get_hint` is deprecated for `mongoc_cursor_get_server_id` * A future minor release plans to drop support for Visual Studio 2013. * `ENABLE_SSL=LIBRESSL` is deprecated along with `mongoc_stream_tls_libressl_new`. Support for LibreSSL may be dropped in a future major release. * `ENABLE_SASL=CYRUS` on Windows platforms is deprecated. Support for `ENABLE_SASL=CYRUS` on Windows may be dropped in a future major release. * The associated Windows-only option `CYRUS_PLUGIN_PATH_PREFIX` is deprecated. libmongoc 1.27.6 ================ Fixes: * Fix TSan warning. * Fix C23 compile. Improvements: * Document expected behavior of command errors in a transaction. Thanks to everyone who contributed to the development of this release. * Adrian Dole * Ezra Chung * Joshua Siegel * Kevin Albertson libmongoc 1.27.5 ================ Fixes: * Fix possible build error in environments where `bool` or `_Bool` is a macro. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.27.4 ================ Fixes: * Fix possible crash reading malformed wire protocol message. * Fix build with Visual Studio 2013. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson libmongoc 1.27.3 ================ Notes: * This patch release introduces changes surrounding the development processes, including new code signing and dependency tracking. There are no behavioral or API changes. Fixes: * Upgraded bundled Zlib from 1.2.3 to 1.3.1 Thanks to everyone who contributed to the development of this release. * Colby Pike libmongoc 1.27.2 ================ Fixes: * Close leftover connections to removed servers. New features: * Check environment variable `MONGOC_EXPERIMENTAL_SRV_PREFER_TCP` to prefer TCP for SRV lookup. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.27.1 ================ No changes since 1.27.0. Version incremented to match the libbson version. libmongoc 1.27.0 ================ Notes: * Raise required version of libmongocrypt to 1.10.0 to support In-Use Encryption (corresponds to the CMake option: `ENABLE_CLIENT_SIDE_ENCRYPTION`). * A future minor release plans to raise the minimum supported MongoDB Server version from 3.6 to 4.0. This is in accordance with [MongoDB Software Lifecycle Schedules](https://www.mongodb.com/legal/support-policy/lifecycles). Fixes: * Fix possible crash when client is configured with empty password. New Features: * Add database name to command events: `mongoc_apm_command_failed_get_database_name` and `mongoc_apm_command_succeeded_get_database_name`. * Support delegated KMIP protocol for In-Use Encryption. * Enable setting socket timeout per client. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Adrian Dole * Ezra Chung * Roberto C. Sánchez * Scott Hunt libmongoc 1.26.2 ================ Cyrus SASL: * Disable plugin loading with Cyrus SASL on Windows by default. To re-enable, set the CMake option `CYRUS_PLUGIN_PATH_PREFIX` to the absolute path prefix of the Cyrus SASL plugins. Fixes: * Fix possible hang if `mongoc_gridfs_file_readv` is called with a corrupt chunk with incomplete data. * Fix assert with legacy exhaust cursor protocol when connected to server < 4.2. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.26.1 ================ Fixes: * Fix 32-bit compile with 64-bit `time_t` Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez libmongoc 1.26.0 ================ New Features: * Support named KMS providers. * Redirect retries in sharded clusters to another mongos if possible. Improvements: * Add `VERSION_CURRENT` file in source to ease building. * Consider more errors retryable. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Adrian Dole * Kyle Kloberdanz * Ezra Chung * MongoCaleb * Roberto C. Sánchez * itrofimow libmongoc 1.25.4 ================ Fixes: * Restore support for Sphinx 1.7.6 for man page build. libmongoc 1.25.3 ================ Fixes: * Disable shared libmongoc targets if `ENABLE_SHARED=OFF` * Fix documentation build with Python 3.9. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.25.2 ================ Fixes: * Fix data race in `mongoc_cursor_get_host`. * Accept discouraged timeout values for backwards compatibility. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Kyle Kloberdanz * Roberto C. Sánchez libmongoc 1.25.1 ================ Fixes: * Add back support for `BUILD_VERSION` CMake option. `BUILD_VERSION` was unintentionally removed in 1.25.0. libmongoc 1.25.0 ================ Fixes: * Send `recoveryToken` in transactions when connected to a load balancer. Improvements: * Remove optional dependency of libicu. * Use OP_MSG exhaust for mongod >= 4.2. Enable exhaust cursors for mongos >= 7.1. * Share cached credentials for SCRAM authentication among all clients to improve performance. * Use polling monitoring in FaaS environments. Build Configuration: * Remove `ENABLE_SRV=AUTO`. Only support boolean values for `ENABLE_SRV`. Platform Support: * Support for macOS 10.14 is dropped. * Support for Ubuntu 14.04 is dropped. * Support for Debian 8.1 is dropped. Other: * The constructed source-distribution archive is no longer available as a release artifact. Please instead use the per-release repository archive attached to a GitHub release, or clone the repository at the desired release tag. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike * Adrian Dole * Roberto C. Sánchez * Ezra Chung * Joshua Siegel * Kyle Kloberdanz * Jeremy Mikola libmongoc 1.24.4 ================ Fixes: * Fix build failure caused by missing `bson-dsl.h` install in libbson. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.3 ================ Fixes: * Fix possible memory leak on SCRAM authentication failure. * Fix possible recursive lock on network error in single-threaded client. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Roberto C. Sánchez libmongoc 1.24.2 ================ Fixes: * Fix possible crash if thread creation fails. * Fix possible assertion if `mongoc_cursor_new_from_command_reply_with_opts` is called with open cursor and no `serverId` option. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.1 ================ Fixes: * Remove unnecessary assert in bulk API. May result in an abort when creating bulk operations with the `mongoc_bulk_operation_new` API intended for wrapping drivers. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.24.0 ================ New Features: * Support MongoDB server version 7.0. * Support updated Queryable Encryption protocol. * Introduces backwards breaking changes to the Queryable Encryption protocol. Using Queryable Encryption now requires MongoDB server version 7.0+. * Support new Queryable Encryption features. * Add `mongoc_client_encryption_create_encrypted_collection` to automatically create data encryption keys when creating a new encrypted collection. * Support new security features. * Add ability to fetch KMS credentials automatically from Azure, GCP, and AWS environments. * Support authentication with KMS AWS temporary credentials. * Cache fetched AWS credentials. * Support AWS IAM Roles for service accounts, EKS in particular. * Retry operations if the connection handshake fails. * Add index creation helper: `mongoc_collection_create_indexes_with_opts`. Fixes: * Fix default applied credentials for Kerberos with SSPI on Windows. * Fix possible overcounting in Performance Counters used by `mongoc-stat`. Language Standard Support: * C89 support has been dropped. C99 is the default tested C standard. Platform Support: * Support for macOS 10.14 will be dropped in an upcoming release. * Support for Ubuntu 14.04 will be dropped in an upcoming release. * Support for Debian 8.1 will be dropped in an upcoming release. Build Configuration: * The `ENABLE_BSON` configure-time option has been removed. Build scripts that used `ENABLE_BSON=SYSTEM` should be updated to use `USE_SYSTEM_LIBBSON=TRUE`. If the build script needs to support building arbitrary versions of the C driver, add both `ENABLE_BSON=SYSTEM` and `USE_SYSTEM_LIBBSON=TRUE`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Gil Alon * Kyle Kloberdanz * Jeremy Mikola * Andreas Braun * Kondaiah Valagonda * Joshua Siegel * Roberto C. Sánchez * Romain Geissler @ Amadeus * bisht2050 * Adrian Dole libmongoc 1.23.5 ================ Fixes: * Fix potential crash due to insufficient memory when allocating performance counters. * Fix compilation error on Android platforms due to missing `aligned_alloc`. * Return an error if `RewrapManyDataKey` is invoked without a `provider` when a `masterKey` is given. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Romain Geissler @ Amadeus libmongoc 1.23.4 ================ Fixes: * Fix possible failure to authenticate with MONGODB-X509 after network error. Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson * Kyle Kloberdanz libmongoc 1.23.3 ================ Fixes: * Better handle malformed `hello` responses * Handle `connectionId` of type `double`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Gil Alon * Kondaiah Valagonda libmongoc 1.23.2 ================ Bug fixes: * Fix compile on M1 macOS fails due to undeclared function (getpagesize) Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Kyle Kloberdanz libmongoc 1.22.2 ================ * Fix connectivity to Atlas Data Lake * Additional bugfixes from libbson 1.22.2 Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson * Roberto C. Sánchez libmongoc 1.23.1 ================ Bug fixes: * Fix connectivity to Atlas Data Lake * Fix crash when dropping a malformed Queryable Encryption collection. Thanks to everyone who contributed to the development of this release. * Andreas Braun * Kevin Albertson libmongoc 1.23.0 ================ Features: * Add on-demand Credentials Callback for CSFLE * Support obtaining AWS credentials for CSFLE in the same way as for MONGODB-AWS Improvements: * Reducing Warnings of Misaligned Address of Over-Aligned Types Bug fixes: * Do not spawn mongocryptd if mongo_shared shared library is loaded. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Colby Pike * Kevin Albertson * Roberto C. Sánchez libmongoc 1.22.1 ================ Bug fixes: * Fix documentation build when using Sphinx 5.0 or newer * Update patch release of libmongocrypt to 1.5.2: Fix a potential data corruption bug in RewrapManyDataKey when rotating encrypted data encryption keys backed by GCP or Azure key services. The following conditions will trigger this bug: A GCP-backed or Azure-backed data encryption key being rewrapped requires fetching an access token for decryption of the data encryption key. The result of this bug is that the key material for all data encryption keys being rewrapped is replaced by new randomly generated material, destroying the original key material. To mitigate potential data corruption, upgrade to this version or higher before using RewrapManyDataKey to rotate Azure-backed or GCP-backed data encryption keys. A backup of the key vault collection should always be taken before key rotation. Other: * Update to Fedora 37 for RPM builds * Dependency build of libmongocrypt re-uses the libbson of the depending libmongoc Thanks to everyone who contributed to the development of this release. * Ezra Chung * Roberto C. Sánchez * Kevin Albertson libmongoc 1.21.2 ================ Bug Fixes: * Address vulnerability in bundled zlib by updating to 1.1.12. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libmongoc 1.22.0 ================ Bug fixes: * Do not auto decrypt before emitting CommandSucceeded events. Improvements: * Use OP_MSG if a server API version is requested. Features: * Add server connectionId to command monitoring events. * Add support for the comment field to all helpers. * Support mongo_shared shared library. * Support pre-point-in-time change stream events. * Support Queryable Encryption. * Support 'let' option for multiple CRUD commands. * Add Key Management API functions. Notes: * The 5.0-compat release (1.18.0) accidentally broke estimatedDocumentCount on views by changing its implementation to use aggregate and a $collStats stage instead of the count command. * The new release is fixing estimatedDocumentCount on views by reverting back to using count in its implementation. * Due to an oversight, the count command was omitted from the Stable API in server versions 5.0.0 - 5.0.8 and 5.1.0 - 5.3.1, so users of the Stable API with estimatedDocumentCount are recommended to upgrade their MongoDB clusters to 5.0.9 or 5.3.2 (if on Atlas) or set apiStrict: false when constructing their MongoClients. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Colby Pike * Ezra Chung * Roberto C. Sánchez * Jake Molnar * Jesse Williamson * Remi Collet libmongoc 1.21.1 ================ Bug Fixes: * Use static decls for OpenSSL 1.1 polyfills * Prevent possible crash in _mongoc_cursor_fetch_stream Thanks to everyone who contributed to the development of this release. * Jeremy Mikola * Remi Collet libmongoc 1.21.0 ================ Bug Fixes: * Addressed VS 2013 build failures due to missing C99 features. Features: * Support conditional $merge and $out aggregation on secondaries. * Bump minimum wire protocol version from 3 (MongoDB 3.0) to 6 (MongoDB 3.6). * Bump maximum wire protocol version from 14 (MongoDB 5.1) to 15 (MongODB 5.2). Improvements: * Update algorithm used for generation of OID values to reduce collisions. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Colby Pike * Kevin Albertson * Roberto C. Sánchez * David CARLIER * Jeremy Mikola libmongoc 1.20.1 ================ Bug fixes: * Fix bug where first hello command on a single-threaded client may not include full handshake. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libmongoc 1.20.0 ================ Features: * Improve multi-threaded performance of client pool. * Support KMIP as a provider for Client-Side Field Level Encryption (CSFLE). Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Jesse Williamson * Jeremy Mikola * Kaitlin Mahar mongo-c-driver 1.19.2 ===================== Announcing libmongoc 1.19.2. Bug fixes: * Fix assert on invalid URI options in client pools connected to load balanced clusters when a topology closed callback is registered. Thanks to everyone who contributed to the development of this release. --Kevin Albertson libmongoc 1.19.1 ================ It is my pleasure to announce libmongoc 1.19.1. Bug fixes: * Permit NULL platform argument in mongoc_handshake_data_append. * Fix wire version check in server selection when maxStalenessSeconds is specified in read preferences. * Fix assert on invalid URI options in client pools connected to load balanced clusters. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung --Kevin Albertson mongo-c-driver 1.19.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.19.0 release. This release adds full support for MongoDB 5.0 servers and MongoDB Atlas Serverless Instances. Features: * Add full support to connect to MongoDB Atlas Serverless Instances. * Add support for snapshot reads on a session with mongoc_session_opts_set_snapshot. * Support the new URI option loadBalanced to connect to a MongoDB cluster behind a TCP load balancer. Bug fixes: * Fix the uploadDate set on newly created GridFS files in the mongoc_gridfs_bucket_t API. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Benjamin Rewis * Andreas Braun * Colby Pike * Ezra Chung * Roberto C. Sánchez * Jesse Williamson --Kevin Albertson mongo-c-driver 1.18.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.18.0 release. This release adds partial support for MongoDB 5.0 servers. Features: * Introduces support to select an API version when connecting to a MongoDB instance. * Supports Azure and Google Cloud Platform as Key Management Service (KMS) providers in Client-Side Field Level Encryption (CSFLE). * Support "let" option in aggregate command. * Support time series collections. * Relax validation for insert and replace documents to support fields containing dots and dollars. * Expose the reason operations fail document validation. Bug fixes: * Forward opts from mongoc_gridfs_bucket_find to underlying find operation. * Fixes a possible hang when a limited size client pool is waiting for a client to become available in mongoc_client_pool_pop. Improvements * Deprecate API containing deprecated terminology. * Use "hello" command for monitoring servers. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Benjamin Rewis * Jeremy Mikola * Andrew Witten * Samantha Ritter * samantharitter * Fermín Galán Márquez * David Carlier * Colby Pike * Josh Weinstein * Pierre Mickael Gonzalo mongo-c-driver 1.18.0-alpha =========================== It is my pleasure to announce the MongoDB C Driver 1.18.0-alpha. This is an unstable prerelease and is unsuitable for production applications. Features: * Introduces support to select an API version when connecting to a MongoDB instance. * Supports Azure and Google Cloud Platform as Key Management Service (KMS) providers in Client-Side Field Level Encryption (CSFLE) Bug fixes: * Fixes a possible hang when a limited size client pool is waiting for a client to become available in mongoc_client_pool_pop. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Clyde Bazile * Andreas Braun * Andrew Witten * Samantha Ritter * Benjamin Rewis * Fermín Galán Márquez * David Carlier * Josh Weinstein * Pierre Mickael Gonzalo mongo-c-driver 1.17.7 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.7. - Print correct error message when DNS resolution fails - Mix time to avoid duplicate RAND_bytes for the same PIDs Thanks to everyone who contributed to the development of this release. * Andreas Braun * Jeremy Mikola --Kevin Albertson mongo-c-driver 1.17.6 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.6. Bug fixes: * Fix possible crash when speculative authentication fails with network error. Thanks to everyone who contributed to the development of this release. * Andreas Braun --Kevin Albertson mongo-c-driver 1.17.5 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.5. Improvements: * Fix documentation regarding when to call mongoc_log_set_handler Thanks to everyone who contributed to the development of this release. * Clyde Bazile * Fermín Galán Márquez --Kevin Albertson mongo-c-driver 1.17.4 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.4. Bug fixes: * Fix crash on macOS on client pool shutdown. * Fix spacing in extended JSON output for numberLong. * Clear error in mongoc_collection_find_and_modify_with_opts on a successful retry. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Samantha Ritter -- Kevin Albertson mongo-c-driver 1.17.3 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.3. Bug fixes: * Do not send session ID on GSSAPI auth commands. * Fix build against zlib when zlib is installed in non-standard location. * Fix build when source directory path contains a space. * Fix a platform-specific bug causing mongoc_client_pool_pop to block indefinitely if all clients are checked out. * Fix a possible buffer overflow with hostnames resolving to IPv6 addresses on OpenSSL. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson * Andrew Witten * gonzalo -- Kevin Albertson mongo-c-driver 1.17.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.2. Bug fixes: * Stop the SRV polling thread when an SRV URI is used to connect to a deployment other than a sharded cluster. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson -- Kevin Albertson mongo-c-driver 1.17.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.1. Bug fixes: * Fix SRV/TXT record lookup for DNS records exceeding 1024 bytes. -- Kevin Albertson mongo-c-driver 1.17.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.17.0 release. This release adds support for MongoDB 4.4 servers. Features: * Support streamable server monitoring to reduce recovery time when the server topology changes. * Support the MONGODB-AWS authentication mechanism. * Support Online Certificate Status Protocol (OCSP). * Support configuring hedged reads in read preferences. * Reduce the number of round trips necessary for SCRAM and X509 authentication. * Monitor servers in parallel when using a mongoc_client_pool_t instead of doing serial scans. * Support the "hint" option in operations using the update, replace, delete, and findAndModify commands. * Improve behavior for retryable writes. * Improve resuming behavior of change streams on server errors. * Remove restriction of 255 character collection namespaces. Bug fixes: * Fix criteria for resumable errors in change streams. * Fix rare crashes when server is invalidated during authentication. * Reject client session for mongoc_collection_estimated_document_count. * Fix behavior of a SecondaryPreferred read preference for exhaust cursor operations against a sharded cluster. Prior to the fix, a nonzero maxStalenessSeconds would not trigger sending the read preference. * Fix SRV polling. Prior to the fix, SRV polling did not properly apply newly discovered results. * Fix checks for existing GridFS indexes to handle indexes created by the MongoDB shell. * Fix possible use of invalidated streams during an unordered OP_QUERY bulk write, and when ending many pooled sessions at client destruction. * Fix a crash when setting the crl_file TLS option for Secure Channel. * Avoid emitting duplicate ServerChanged events when no change is observed during monitoring. * Properly handle large SASL messages instead of erroring. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andrew Witten * Andreas Braun * Clyde Bazile * Josh Weinstein -- Kevin Albertson mongo-c-driver 1.17.0 rc0 ========================= It is my pleasure to announce the MongoDB C Driver 1.17.0 rc0 release. This release adds support for MongoDB 4.4 servers. Features: * Support streamable server monitoring to reduce recovery time when the server topology changes. * Support tlsDisableCertificateRevocationCheck when built with Secure Channel. Bug fixes: * Fix criteria for resumable errors in change streams. * Fix rare crashes when server is invalidated during authentication. * Improve behavior when reaching out to OCSP responders for certificate revocation checking. * Reject client session for mongoc_collection_estimated_document_count. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Andrew Witten * Roberto C. Sánchez * Clyde Bazile -- Kevin Albertson mongo-c-driver 1.17.0 beta2 =========================== It is my pleasure to announce the MongoDB C Driver 1.17.0 beta2 release. Features: * Support Online Certificate Status Protocol (OCSP) response caching. * Support configuring hedged reads in read preferences. * Reduce the number of round trips necessary for SCRAM and X509 authentication. * Monitor servers in parallel when using a mongoc_client_pool_t instead of doing serial scans. * Support OCSP on older versions of OpenSSL (1.0.1+). Bug fixes: * Fix behavior of a SecondaryPreferred read preference for exhaust cursor operations against a sharded cluster. Prior to the fix, a nonzero maxStalenessSeconds would not trigger sending the read preference. * Fix SRV polling. Prior to the fix, SRV polling did not properly apply newly discovered results. * Fix checks for existing GridFS indexes to handle indexes created by the MongoDB shell. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Josh Weinstein -- Kevin Albertson mongo-c-driver 1.17.0 beta ========================== It is my pleasure to announce the MongoDB C Driver 1.17.0 beta release. Features: * Support the MONGODB-AWS authentication mechanism. * Support the Online Certificate Status Protocol (OCSP) for OpenSSL 1.1.0+, Secure Transport, and Secure Channel. * Support the "hint" option in operations using the update, replace, delete, and findAndModify commands. * Improve behavior for retryable writes. * Improve resuming behavior of change streams on server errors. * Remove an extra round trip for SCRAM authentication. * Remove restriction of 255 character collection namespaces. Bug fixes: * Fix possible use of invalidated streams during an unordered OP_QUERY bulk write, and when ending many pooled sessions at client destruction. * Fix a crash when setting the crl_file TLS option for Secure Channel. * Avoid emitting duplicate ServerChanged events when no change is observed during monitoring. * Properly handle large SASL messages instead of erroring. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Andreas Braun * Clyde Bazile * Jeremy Mikola * Sara Golemon -- Kevin Albertson mongo-c-driver 1.16.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.16.1. Bug fixes: * Fix listed library dependency on mongoc_static target when building with libmongocrypt. * Replace a call of free to bson_free. * Vendor Sphinx basic theme and correctly list static files for docs. * Fix a compilation warning introduced in 1.16.0. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson mongo-c-driver 1.16.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.16.0. Features: * Support Client-side Field Level Encryption. * Support ability to pass an index hint to update operations. * Add cmake export targets. Bug fixes: * Fix a bug with Windows SSPI failing to authenticate with GSSAPI when using pooled clients for certain operations. * Fix behavior for bulk writes that retry to keep track of the successful server. * Remove hard limit of 1024 characters for SRV response. * Fix racy crash when using client pool against a sharded cluster if a server is invalidated shortly before a new socket is opened against it. * Remove unnecessary library dependencies causing overlinking. * Ensure server proof has been validated during SCRAM conversation. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Clyde Bazile * Andreas Braun * Roberto C. Sánchez * Samantha Ritter * Isabel Atkinson * Kaitlin Mahar * Diego Barrios Romero * Sara Golemon * Vasil Velichkov * EGuesnet Peace, Kevin Albertson mongo-c-driver 1.15.3 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.3. Bug fixes: * Fix a hang on macOS when connecting to a server over TLS * Add zstd as a dependency when libmongoc static library is compiled with zstd support * Fix compilation on AIX 6.1 Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Samantha Ritter * EGuesnet mongo-c-driver 1.15.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.2. Bug fixes: * Prevent mongoc_transaction_opts_set_max_commit_time_ms from applying to subsequent transactions that should be using the default. * Do not report the initial error if a retry for a change stream function (mongoc_collection_watch, mongoc_database_watch, or mongoc_client_watch) succeeds Thanks to everyone who contributed to the development of this release. * Andreas Braun * Clyde Bazile Peace, Kevin Albertson mongo-c-driver 1.15.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.1. Bug fixes: * Fix change stream resume logic when no documents received * Reduce the required cmake version to build with zstd support * Minor fixes to mongos pinning logic * Do not resume a change stream on NonResumableChangeStreamError Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Clyde Bazile Peace, Clyde Bazile mongo-c-driver 1.15.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.15.0. This release adds support for MongoDB 4.2 features. Features: * Support for sharded transactions on MongoDB sharded clusters 4.2+. * Add convenient transaction runner (mongoc_client_session_with_transaction), which accepts a callback and performs appropriate retry logic. * Add a new transaction option to specify maximum time to wait for a commit, mongoc_transaction_opts_set_max_commit_time_ms. * Add URI option "retryReads=true" safely and automatically retries certain read operations if the server is a MongoDB 3.6+. * Poll SRV records to mongos servers periodically. * Keep connections alive after a primary stepdown detected. * Standardizes URI options supported across all spec-compliant MongoDB drivers. * "retryWrites" URI option now defaults to true (requires crypto for session support). * Send any aggregate with $out or $merge stage to a primary. * Add the ability to specify an aggregate pipeline as an update document. * Add a database aggregate helper, mongoc_database_aggregate. * Add option for change streams, "startAfter". * Add mongoc_change_stream_get_resume_token, which returns the resume token which should be used to resume a change stream. * Add support for zstd compression. Bug fixes: * Correctly report an error in mongoc_change_stream_next if the resume token (_id) is not a document. Previously, an error was only reported if the field was missing. * Fix mongoc_collection_update with MONGOC_UPDATE_MULTI_UPDATE, mongoc_collection_remove, and mongoc_collection_delete when retryWrites was enabled. They would fail previously. * Command options are now correctly taken into account when batching bulk writes for OP_QUERY. It was possible to exceed the maximum document size before. * Fix a crash if a multi-batch bulk write with OP_MSG errored on a batch. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Jeremy Mikola * Haris Sheikh * Samantha Ritter * Isabel Atkinson * Sara Golemon * Clyde Bazile * Roberto C. Sánchez * Lior Kaplan * pasniak Peace, Kevin Albertson mongo-c-driver 1.14.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.14.1. Bug fixes: * Prohibit starting a transaction for pre-4.0 MongoDB servers. * Prohibit starting a sharded transaction for pre-4.2 MongoDB servers. Thanks to everyone who contributed to the development of this release. * Jeremy Mikola * Clyde Bazile Peace, Kevin Albertson mongo-c-driver 1.14.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.14.0. Features: * Support for OpenSSL 1.1.1 and its implementation of TLS v1.3. * New function mongoc_stream_should_retry. * New accessor mongoc_server_description_last_update_time. * New method mongoc_client_reset to be called after forking. Bug fixes: * OP_MSG with unacknowledged writes (write concern of w:0) would serialize incorrectly on big-endian platforms, causing writes to use the default write concern of w:1. * mongoc_collection_update_many and mongoc_collection_delete_many would fail with the URI option retryWrites=true. * In a transaction, the driver now properly ignores the readConcern configured on a client, database, or collection: only the mongoc_transaction_opt_t's readConcern is used. * Remove timestamp from uninstall scripts to permit reproducible build. * Setting mongoc_ssl_opt_t.pem_file or ca_file to a bad file path caused a hang with Darwin SSL. * Fix the ENABLE_SASL cmake option: * Remove unnecessary GSSAPI value. It was equivalent to specifying ENABLE_SASL=CYRUS. * ENABLE_SASL=AUTO now correctly chooses SSPI on Windows instead of CYRUS. * The client pool failed to set proper apm callbacks for clients created via try_pop(). Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Samantha Ritter * Spencer McKenney * Henrik Edin * Jeremy Mikola * Evgeni Dobranov * Derick Rethans * 平民·寻梦(Pingmin Fenlly Liu) * David Carlier * Gustaf Neumann * Jeroen * Jeroen Ooms * Kaitlin Mahar * Tomas Mozes * Clyde Bazile Peace, Samantha Ritter mongo-c-driver 1.13.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.13.1. Bug fixes: * mongoc_collection_update_many and mongoc_collection_delete_many would fail with the URI option retryWrites=true. * Remove timestamp from uninstall scripts to permit reproducible build. * Add missing header files to the release tarball to fix compilation when configuring with ENABLE_SASL=GSSAPI. * Separate libmongoc and libbson uninstall scripts so they do not overwrite each other. * Fix running make install with DESTDIR. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * A. Jesse Jiryu Davis * Henrik Edin Peace, Kevin Albertson mongo-c-driver 1.13.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.13.0. Features: * Report a new error code, MONGOC_ERROR_GRIDFS_CORRUPT, when a chunk larger than chunkSize is detected. Before, the driver had crashed with an assert. * Restructure of install directory. All mongoc headers are under mongoc/ and all bson headers are under bson/. The preferred way of including the headers are mongoc/mongoc.h and bson/bson.h respectively. Forwarding headers in the root are provided for backwards compatibility. (**Update**: These headers were removed in the 2.0 release) * The default CMake build type had been unspecified, now it is RelWithDebInfo. * Support LibreSSL 2.7+. Bug fixes: * mongoc_collection_replace_one is now a correctly exported symbol. * Fix multiple issues with readConcern and writeConcern inheritance. * Fix rare crash with mongodb+srv URIs on Windows. * mongoc_gridfs_create_file_from_stream ignored errors while writing chunks to the server. * The following functions should not have taken a "bypassDocumentValidation" option in bson_t *opts, the option is now prohibited: - mongoc_bulk_operation_insert_with_opts - mongoc_bulk_operation_update_one_with_opts - mongoc_bulk_operation_update_many_with_opts - mongoc_bulk_operation_replace_one_with_opts * The heartbeat-succeeded and heartbeat-failed events (part of SDAM Monitoring) had uninitialized "duration" fields, they are now set correctly. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Henrik Edin * Spencer McKenney * Jeremy Mikola * Evgeni Dobranov * Tomas Mozes * Derick Rethans * Gustaf Neumann * Jeroen Ooms * Kaitlin Mahar Peace, Kevin Albertson mongo-c-driver 1.12.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.12.0. Features: * New function mongoc_client_session_in_transaction to check if a multi- document transaction is started. * New examples for change streams and transactions, improved guide for migrating from mongoc_collection_count to mongoc_collection_count_documents Bug fixes: * Fix occasional crash in sharded queries * Retry all retryable write concern errors * mongoc_client_session_commit_transaction sets the correct error label when the primary is unavailable * mongoc_collection_find_with_opts had prohibited read preference "primary" in a transaction * mongoc_collection_aggregate had not inherited its mongoc_collection_t's read preference; only an explicitly provided read preference was used. * Allow unencoded delimiters in username/password if unambiguous Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * A. Jesse Jiryu Davis * Kevin Albertson * Spencer McKenney * Evgeni Dobranov * Jeremy Mikola * 平民·寻梦(Pingmin Fenlly Liu) Peace, A. Jesse Jiryu Davis mongo-c-driver 1.11.0 ===================== It is my pleasure to announce the MongoDB C Driver 1.11.0. This release adds support for MongoDB 4.0 features. It includes the following additions and improvements: * Multi-document transactions, see mongoc_client_session_start_transaction * New function mongoc_error_has_label to check for specific error labels such as "TransientTransactionError" or "UnknownTransactionCommitResult" in error replies. * New functions to subscribe to changes on an entire client or database: - mongoc_client_watch - mongoc_database_watch * New option for change streams, "startAtOperationTime". * mongoc_collection_count_with_opts is deprecated for two new functions: - mongoc_collection_count_documents - mongoc_collection_estimated_document_count * Support for SCRAM-SHA-256 authentication, including support for non-ASCII passwords using libicu is an optional dependency. * Faster mongoc_database_get_collection_names_with_opts fetches only names, not the entire collection metadata. Additional changes not specific to MongoDB 4.0: * All "destroy" functions such as mongoc_collection_destroy now ignore a NULL argument. * The driver now returns an error if you attempt to use "arrayFilters" in an update with a MongoDB server older than 3.6. * Update functions include a new "upsertedCount" field in the reply document. * Replace MD5 with FNV-1a hash to generate ObjectIds (for FIPS compliance). Bug fixes: * Functions incorrectly marked with the "const" compiler attribute are now marked as "pure", fixes build error when link-time optimization is enabled. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Evgeni Dobranov * Spencer McKenney * Jeremy Mikola * Roberto C. Sánchez * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.3 ===================== No change since 1.10.2; released to keep pace with libbson's version. -- A. Jesse Jiryu Davis mongo-c-driver 1.10.2 ===================== It is my pleasure to announce the MongoDB C Driver 1.10.2. This release fixes the libbson and libmongoc installed library filenames and SONAMEs on Linux. They had changed unintentionally with the switch to CMake in 1.10.0; they are now consistent with 1.9.x and previous releases. Thanks to Roberto C. Sánchez for the fix. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.1 ===================== It is my pleasure to announce the MongoDB C Driver 1.10.1. This release fixes the following bugs introduced in version 1.10.0: * Client sessions were not prohibited with unacknowledged write concern and mongoc_bulk_operation_execute; now they are prohibited. Client sessions have been prohibited with all other unacknowledged writes since 1.10. * The "arrayFilters" update option, new in MongoDB 3.6 and supported since libmongoc 1.9.0, was inadvertently prohibited by mongoc_bulk_operation_update_one_with_opts and mongoc_bulk_operation_update_many_with_opts in 1.10. The option is now permitted again. * The mongoc-stat tool for displaying shared counters was disabled on Linux and not installed; it is now restored. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.10.0 ===================== It is my pleasure to announce MongoDB C Driver 1.10.0. This version drops support for MongoDB 2.6 and adds the following features and bugfixes: * libbson and libmongoc are now maintained in the mongo-c-driver repository, although they are still built as separate libraries, and libbson can still be used without libmongoc. * Building libbson and libmongoc now requires CMake on all platforms. The Autotools build scripts ("configure" and related scripts) have been deleted. See the "installing" page for updated instructions, including the new ENABLE_MONGOC option and changes to the ENABLE_BSON option. * IPv6 is now fully supported and conforms to RFC-6555. If a hostname has both IPv4 and IPv6 DNS records, the driver tries connecting with IPv6 first. If a connection can't be established after 250ms then IPv4 is tried in parallel. Whichever succeeds connection first cancels the other. The successful DNS result is cached for 10 minutes. * If CMake is configured with ENABLE_SSL=AUTO (the default), libmongoc now uses native TLS libraries on Mac and Windows, and OpenSSL everywhere else. Before, it would search for OpenSSL on all platforms and only use native TLS on Mac and Windows as a fallback. * The driver now handshakes SSL connections to multiple servers in a replica set or sharded cluster in parallel, so long as it uses OpenSSL or Windows SChannel. (SSL handshakes with Apple's Secure Transport are still serial.) A larger receive buffer with SChannel increases performance over slow connections. * All functions that accept read concern now prohibit it, if MongoDB is too old to support it (MongoDB 3.0). * Client sessions are now prohibited with unacknowledged writes. * mongoc_collection_find_and_modify_with_opts now prohibits write concern if MongoDB is too old to support it (MongoDB 3.0). * Other helper functions for commands that write, now prohibit write concern if MongoDB is too old to support it (pre-3.4): mongoc_client_read_write_command_with_opts mongoc_client_write_command_with_opts mongoc_collection_read_write_command_with_opts mongoc_collection_write_command_with_opts mongoc_database_read_write_command_with_opts mongoc_database_write_command_with_opts mongoc_collection_aggregate with $out mongoc_collection_drop_index_with_opts mongoc_collection_drop_with_opts mongoc_collection_rename_with_opts mongoc_database_drop_with_opts Write concern behavior is unchanged for regular CRUD functions. * Setting a negative writeConcern level of -2 or smaller, via the "opts" parameter to functions that accept BSON options, is now prohibited. The special "w" values -2 through -4 are only used internally. The deprecated "w=-1" is still allowed, as a synonym for "w=0". * The Kerberos URI option authMechanismProperties=CANONICALIZE_HOST_NAME:true is now implemented with the Windows Kerberos provider, SSPI. * This repository now includes GDB and LLDB customizations for pretty-printing bson_t structs as JSON while debugging. See the "debugging" page. * The internal preprocessor symbol HAVE_STRINGS_H has been renamed BSON_HAVE_STRINGS_H. If you maintain a handwritten bson-config.h you must rename this symbol. * The following helper functions do not work with mongoc_client_session_t, they are deprecated in favor of running MongoDB commands directly with a function like mongoc_client_read_command_with_opts: mongoc_client_get_server_status mongoc_collection_stats mongoc_collection_validate * mongoc_cursor_is_alive is now deprecated for mongoc_cursor_more, which is functionally equivalent. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Roberto C. Sánchez * Jeremy Mikola * Xiangyu Yao * Jeroen Ooms * Derick Rethans * Kaitlin Mahar * Pavithra Vetriselvan * NotSpooky * Iulian Rotaru * Katherine Walker Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.5 ==================== It is my pleasure to announce mongo-c-driver 1.9.5. This release fixes the following bugs: * New change streams API functions were not marked extern "C" * mongoc_collection_watch now accepts a pipeline argument as a BSON array, in addition to accepting a BSON document with a "pipeline" array field * Crashes in several change stream error handling paths * Commands could return false with an empty bson_error_t after a replica set reconfig * Network error messages omitted the command name when using OP_MSG Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.4 ==================== It is my pleasure to announce mongo-c-driver 1.9.4. This release offers compatibility with Sphinx 1.7.0 and above and fixes two bugs: * Ensure a change stream uses the proper session id while iterating * Fix a rare crash in pooled mode when a replica set member was disconnected Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.3 ==================== It is my pleasure to announce mongo-c-driver 1.9.3. This version fixes a session-management bug that could cause an authentication error while connected to MongoDB 3.6+ and iterating a cursor, and it permits the $gleStats modifier with mongoc_collection_aggregate. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.2 ==================== No change since 1.9.1; released to keep pace with libbson's version number. -- A. Jesse Jiryu Davis mongo-c-driver 1.9.1 ==================== It is my pleasure to announce mongo-c-driver 1.9.1. This release fixes a bug that caused session ID to be included in authentication and server monitoring commands. Thanks to Jeremy Mikola for finding and fixing the issue. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.9.0 ==================== It is my pleasure to announce mongo-c-driver 1.9.0. This version drops support for MongoDB 2.4 and adds support for MongoDB 3.6 features: * New struct mongoc_change_stream_t to watch a collection for changes. * New struct mongoc_client_session_t represents a MongoDB 3.6 session, which supports causal consistency: you are guaranteed to read your writes and to perform monotonic reads, even when reading from secondaries or in a sharded cluster. * New functions that accept flexible options as a BSON document. These accept a "sessionId" option and any future options. In addition, the two new "update" functions accept the "arrayFilters" option that is new in MongoDB 3.6: mongoc_collection_insert_one mongoc_collection_insert_many mongoc_collection_update_one mongoc_collection_update_many mongoc_collection_replace_one mongoc_collection_delete_one mongoc_collection_delete_many mongoc_client_command_with_opts mongoc_database_command_with_opts mongoc_collection_command_with_opts mongoc_client_find_databases_with_opts mongoc_client_get_database_names_with_opts mongoc_collection_create_bulk_operation_with_opts mongoc_collection_find_indexes_with_opts mongoc_database_find_collections_with_opts mongoc_database_get_collection_names_with_opts * New URI option "retryWrites=true" safely and automatically retries certain write operations if the server is a MongoDB 3.6 replica set or sharded cluster. * Support for MongoDB OP_MSG wire protocol. Additional changes not specific to MongoDB 3.6: * Support for mongodb+srv URIs to query DNS for SRV and TXT records that configure the connection to MongoDB. * Support LibreSSL with CMake build * The "minPoolSize" URI option is deprecated: it's confusing and not useful. Bug fixes: * mongoc_bulk_operation_execute did not always initialize "reply". * Fix C99 pedantic warnings. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * Kevin Albertson * Jeroen Ooms * Iulian Rotaru * Derick Rethans * Graham Whitted * Brian Moss * Alex Masterov * Michael Kuhn * Sriharsha Vardhan Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.2 ==================== It is my pleasure to announce mongo-c-driver 1.8.2. This release fixes the following bugs: * Remove option to bundle the Snappy compression library, it caused issues for programs linking to libmongoc * Fix pkg-config and CMake config file flags for programs that statically link to libmongoc when libmongoc is statically linked to zLib * The configure flag "--with-zlib=no" was ignored Crash in authentication when username is NULL Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Derick Rethans * Hannes Magnusson * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.1 ==================== It is my pleasure to announce mongo-c-driver 1.8.1. This release fixes the following bugs: * Remove a syntax error in the configure script that affects some shells. * The configure script respects --with-zlib=system and --with-snappy=system. * The internal mongoc_server_description_t struct is properly reinitialized after a network error. * Fix the encoding of this NEWS file. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.8.0 ==================== * The zLib and Snappy compression libraries are bundled if not available. Wire protocol compression is enabled on Windows. * mongoc_collection_find_and_modify_with_opts now respects a "writeConcern" field in the "extra" BSON document in its mongoc_find_and_modify_opts_t. * The command functions mongoc_client_read_write_command_with_opts, mongoc_database_read_write_command_with_opts, and mongoc_collection_read_write_command_with_opts now ignore the "read_prefs" parameter. * mongoc_collection_create_index and mongoc_collection_create_index_with_opts are both now deprecated. Use mongoc_database_write_command_with_opts instead; a guide to creating an index using that function has been added. * Use select, not WSAPoll, on Windows. * Always mark a server "Unknown" after a network error (besides a timeout). * mongoc_client_pool_t sends platform metadata to the server; before, only a single mongoc_client_t did. * New stream method mongoc_stream_timed_out. * Wire version checks introduced in 1.8.0 will prevent the driver from connecting to a future MongoDB server version if its wire protocol is incompatible. * New CMake option ENABLE_MAINTAINER_FLAGS. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.7.0 ==================== It is my pleasure to announce mongo-c-driver 1.7.0. New features and bug fixes: * CMake build now installs .pc files for programs that link to libmongoc using pkg-config. Both the CMake and Autotools build systems now install .cmake files for programs that link to libmongoc using CMake. Linking to libmongoc statically or dynamically is now much more convenient. See the new tutorial section "Include and link libmongoc in your C program". * New CMake option ENABLE_STATIC can be ON, OFF, or AUTO (the default) * Minimum required CMake version has been increased to 3.1. * CMake remains experimental on non-Windows platforms and issues a warning now * Support for wire compression. * Support for snappy and zlib. MongoDB 3.4 only supports snappy, while zlib support is expected in MongoDB 3.6. The enable, configure mongoc like so: ./configure --with-snappy --with-zlib * New functions: mongoc_uri_get_compressors & mongoc_uri_set_compressors, to get and set compressor configuration on mongoc_uri_t * Added support for comma separated "compressors" connection string option (e.g. mongodb://localhost/?compressors=snappy,zlib) * Added support for configuring zlib compression level in the connection string (e.g. mongodb://localhost/?compressors=zlib&zlibcompressionlevel=8) * Now requires the use of CMake config files for libbson to build libmongoc with CMake * Added pkg-config support for libressl. * New function mongoc_uri_set_auth_mechanism to update the authentication mechanism of a mongoc_uri_t after it is created from a string. * New function mongoc_bulk_operation_insert_with_opts provides immediate error checking. * New function mongoc_uri_new_with_error provides a way to parse a connection string, and retrieve the failure reason, if any. * Support for MongoDB Connection String specification * All connection string options are now represented by MONGOC_URI_xxx macros * Paths to Unix Domain Sockets must be url encoded * Repeated options now issue warnings * Special characters in username, password and other values must be url encoded * Unsupported connection string options now issue warnings * Boolean values can now be represented as true/yes/y/t/1 and false/no/n/f/0. * Case is now preserved in Unix domain paths. * New function mongoc_cursor_error_document provides access to server's error reply if a query or command fails. * New function mongoc_write_concern_is_default determines whether any write concern options have been set, and mongoc_read_concern_is_default checks if read concern options are set. * mongoc_gridfs_find_one_with_opts optimized to use limit 1. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * David Golden * Jeremy Mikola * Bernard Spil * Aleksander Melnikov * Adam Seering * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.6.0 ==================== It is my pleasure to announce mongo-c-driver 1.6.0. New features and bug fixes: * Enterprise authentication on Windows now uses the native GSSAPI library; Cyrus SASL is no longer required for enterprise auth on Windows. * BSON documents are more thoroughly validated before insert or update. * New function mongoc_uri_set_mechanism_properties to replace all the authMechanismProperties on an existing URI. * mongoc_uri_get_mechanism_properties asserts its inputs are not NULL. * For consistency with other MongoDB drivers, mongoc_collection_save is deprecated in favor of mongoc_collection_insert or mongoc_collection_update. * The driver is now built and continuously tested with MinGW-W64 on Windows. * Experimental support for HPUX. * The correct operation ids are now passed to Command Monitoring callbacks. * Fix a crash if the driver couldn't connect to the server to create an index. * The documentation is ported from Mallard XML to ReStructured Text, the HTML documentation is restyled, and numerous man page syntax errors fixed. * Getter functions for options in mongoc_find_and_modify_opts_t: * mongoc_find_and_modify_opts_get_bypass_document_validation * mongoc_find_and_modify_opts_get_fields * mongoc_find_and_modify_opts_get_flags * mongoc_find_and_modify_opts_get_max_time_ms * mongoc_find_and_modify_opts_get_sort * mongoc_find_and_modify_opts_get_update * All public functions now have the __cdecl calling convention on Windows. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Aleksander Melnikov * Jeroen Ooms * Brian McCarthy * Jonathan Wang * Peter Beckman * Remi Collet * Rockford Wei * Alexey Ponomarev * Christopher Wang * David Golden * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.5 ==================== It is my pleasure to announce mongo-c-driver 1.5.5. This release fixes bugs parsing the localThresholdMS option from the MongoDB URI, and a crash in mongoc_cursor_destroy if "query" or "filter" are invalid. Thanks to Jeremy Mikola. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.4 ==================== It is my pleasure to announce mongo-c-driver 1.5.4. This release fixes an error in cursor iteration when a readConcern is set. Thanks to Jeremy Mikola and Hannes Magnusson. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.3 ==================== This release fixes a bug that prevented connecting to IPv4-only MongoDB servers by hostname. https://jira.mongodb.org/browse/CDRIVER-1988 The driver has reverted to its 1.5.1 behavior: it connects to MongoDB over IPv6 if given an IPv6 connection string like "mongodb://[::1]", and requires an IPv4 connection when given a hostname like "mongodb://localhost". Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.2 ==================== It is my pleasure to announce mongo-c-driver 1.5.2. Thanks to everyone who contributed to the development of this release. New bug fixes: * CDRIVER-1975 allow mixed $ and non-$ query ops. * CDRIVER-1972 Support for ipv6 hostnames. * CDRIVER-1971 Missing exports of mongoc_gridfs_file_set_*() functions. * CDRIVER-1970 update define constants for "find" opts to be unique. * CDRIVER-1964 Windows CA stores should be opened with read-only flag. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Alexey Ponomarev * Peter Beckman * Rockford Wei Peace, Hannes Magnusson mongo-c-driver 1.5.1 ==================== It is my pleasure to announce mongo-c-driver 1.5.1. This is a bugfix release: * Fix SEGFAULT with performance counters on NUMA (thanks to Jonathan Wang). * Prevent rare assertion error in mongoc_cluster_stream_for_server. * Improve error messages from auth failure. * Escape quotes when appending CFLAGS to handshake metadata. * Fix OpenSSL header lookups in non-default paths. * Fix build failure with LibreSSL. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeroen Ooms * Jonathan Wang Peace, A. Jesse Jiryu Davis mongo-c-driver 1.5.0 ==================== It is my pleasure to announce mongo-c-driver 1.5.0. New features and bug fixes: * MongoDB 3.4 Support * New URI and read preference option, "maxStalenessSeconds" * MongoDB Handshake * writeConcern and readConcern enhancements * Collation allows users to specify language-specific rules for string comparison when sorting documents. See the code examples for mongoc_client_read_command_with_opts, mongoc_collection_count_with_opts, mongoc_collection_find_with_opts, and mongoc_index_opt_t, as well as the "Setting Collation Order" section of the "Bulk Write Operations" guide. * mongoc_collection_count_with_opts uses the collection's read preference if none is passed in * Improved TLS support * Fixed LibreSSL (libssl) support * Added LibreSSL (libtls) support * Fixed Secure Channel build on VS 2010 * OpenSSL now supports SNI (all others already do) * Additional features for Application Performance Monitoring: * mongoc_topology_description_has_writable_server * mongoc_topology_description_has_readable_server * New functions accept flexible options as a BSON document: * mongoc_collection_find_with_opts * mongoc_client_read_command_with_opts * mongoc_client_write_command_with_opts * mongoc_client_read_write_command_with_opts * mongoc_database_read_command_with_opts * mongoc_database_write_command_with_opts * mongoc_database_read_write_command_with_opts * mongoc_collection_read_command_with_opts * mongoc_collection_write_command_with_opts * mongoc_collection_read_write_command_with_opts * mongoc_gridfs_find_with_opts * mongoc_gridfs_find_one_with_opts * mongoc_collection_find is now deprecated in favor of mongoc_collection_find_with_opts. * New helper function to include read concern in one of the above function's options parameter: mongoc_read_concern_append. * mongoc_client_command no longer applies the client's read preference and read concern by default. Same change for mongoc_database_command and mongoc_collection_command. * mongoc_collection_count_with_opts now applies the collection's read preference if no read preference is provided * mongoc_collection_create_index and mongoc_collection_drop_index now apply the collection's write concern. * connectTimeoutMS timer now begins after DNS resolution, and resets for each interface attempted (e.g., if the driver first tries IPv6, then IPv4). * New error code MONGOC_ERROR_DUPLICATE_KEY. * mongoc_collection_find no longer treats the "filter" key specially in queries - querying for a document with a key named "filter" is the same now as any other key. * The server description parameter to the following functions is "const": * mongoc_server_description_host * mongoc_server_description_id * mongoc_server_description_ismaster * mongoc_server_description_round_trip_time * mongoc_server_description_type * Exported symbols are no longer declared in separate export files. This could break ABI with applications using clang, which previously exported symbols from the internal private ABI. * mongoc no longer crashes when multi roundtrip bulk operation fails. * Added support for the new readConcernLevel "linearizable". * Clients now check for misformatted "readPreferenceTags" in URI. * New CMake option ENABLE_TRACING allows debug output, which before had only been available with "configure --enable-tracing". * Bugfix: "PossiblePrimary"-type replicas could be selected for reads * Bugfixes: The random number generator used to select servers is now properly seeded, and secondary queries are now properly distributed according to localThresholdMS, not just to the lowest-latency secondary. * mongoc_collection_insert, mongoc_collection_update, mongoc_collection_remove consistently use domain MONGOC_ERROR_BSON, code MONGOC_ERROR_BSON_INVALID if passed oversized BSON, and MONGOC_ERROR_COLLECTION for other errors. mongoc_bulk_operation_execute continues to use MONGOC_ERROR_COMMAND for all errors. * If mongoc_client_pool_t fails to start its scanner thread in the background, it logs and aborts instead of silently continuing, then failing to connect. * The driver now updates its view of the whole topology with information from each new connection handshake. * mongoc_client_set_apm_callbacks can be used repeatedly to change or clear the list of monitoring callbacks. * Improved error reporting when the driver fails to reach the server. Deprecations: * mongoc_collection_find is deprecated for mongoc_collection_find_with_opts. Removed configure flags: * --enable-experimental has been removed. All previously experimental features are now always on. * The configure option "--enable-hardening" had had no effect. It is removed in favor of system-wide compiler configuration. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Fiona Rowan * Ian Boros * Remi Collet * Brian McCarthy * Jeroen Ooms * J. Rassi * Christoph Schwarz * Alexey Vorobeyev Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.2 ==================== It is my pleasure to announce mongo-c-driver 1.4.2. This release fixes bugs in "minPoolSize" logic, see CDRIVER-1558 for details. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.1 ==================== It is my pleasure to announce mongo-c-driver 1.4.1. This is a bugfix release: * mongoc_client_get_server_descriptions could return a list including NULLs * Tailable cursors on MongoDB 3.2 only worked with MONGOC_QUERY_AWAIT_DATA * Spurious warnings with MONGOC_DISABLE_SHM Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.4.0 ==================== It is my pleasure to announce the release of mongo-c-driver 1.4.0. TLS --- The driver can now use the native TLS and crypto functions included in macOS and Windows. OpenSSL is no longer required for TLS or authentication on Mac or Windows. By default, OpenSSL is used if available, the default will switch in version 2.0 to prefer native TLS. For native TLS on Mac: ./configure --enable-ssl=darwin For Windows: cmake "-DENABLE_SSL=WINDOWS" -G "Visual Studio 10 Win64" "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" All of the TLS implementations now load the native default certificate store, with OpenSSL on Windows falling back on the Windows native certificate store if no other can be found. The "ca_dir" field on mongoc_ssl_opt_t is only supported by OpenSSL. All other fields, including "pem_file", are supported by all implementations. A new field, "allow_invalid_hostname", has been added to mongoc_ssl_opt_t and is preferred over the existing "allow_invalid_certificate" to disable hostname verification. The driver now supports the latest OpenSSL 1.1 in addition to past versions. Application Performance Monitoring ---------------------------------- The driver implements the MongoDB Command Monitoring Spec. Applications can record the duration and other details of every operation the driver performs on the server. See "Introduction to Application Performance Monitoring" in the docs. Error API --------- New functions mongoc_client_set_error_api and mongoc_client_pool_set_error_api allow applications to distinguish client and server errors. See the "Error Reporting" doc. Unacknowledged Write Results ---------------------------- Unacknowledged writes (writes whose mongoc_write_concern_t "w" value is zero) now reply with an empty document instead of one with nInserted: 0, nUpdated: 0, and so on. Command functions now ignore the read preferences set on a client, database, or collection. Instead, they use the mongoc_read_prefs_t passed in explicitly, or default to "primary". This change was made to bring them in line with the Server Selection Spec. These are the affected functions: * mongoc_client_command * mongoc_client_command_simple * mongoc_database_command * mongoc_database_command_simple * mongoc_collection_command * mongoc_collection_command_simple On the other hand, the following command-specific helper functions now use the collection's read preference: * mongoc_collection_count * mongoc_collection_stats New functions to send maxTimeMS or any arbitrary options with findAndModify: * mongoc_find_and_modify_opts_set_max_time_ms * mongoc_find_and_modify_opts_append New function to include a write concern with a generic command function like mongoc_client_command_simple: * mongoc_write_concern_append Public API For Higher-Level Drivers ----------------------------------- New functions support language drivers (specifically the PHP and HHVM drivers) using only the libmongoc public API: * mongoc_bulk_operation_get_hint * mongoc_client_command_simple_with_server_id * mongoc_client_get_server_description * mongoc_client_get_server_description_by_id * mongoc_client_get_server_descriptions * mongoc_client_select_server * mongoc_cursor_get_limit * mongoc_cursor_new_from_command_reply * mongoc_cursor_set_hint * mongoc_cursor_set_limit * mongoc_log_trace_disable * mongoc_log_trace_enable * mongoc_server_description_ismaster * mongoc_server_description_round_trip_time * mongoc_server_description_type * mongoc_server_descriptions_destroy_all * mongoc_uri_get_option_as_bool * mongoc_uri_get_option_as_int32 * mongoc_uri_get_option_as_utf8 * mongoc_uri_option_is_bool * mongoc_uri_option_is_int32 * mongoc_uri_option_is_utf8 * mongoc_uri_set_auth_source * mongoc_uri_set_database * mongoc_uri_set_option_as_bool * mongoc_uri_set_option_as_int32 * mongoc_uri_set_option_as_utf8 * mongoc_uri_set_password * mongoc_uri_set_read_concern * mongoc_uri_set_read_prefs_t * mongoc_uri_set_username * mongoc_uri_set_write_concern * mongoc_write_concern_is_acknowledged * mongoc_write_concern_is_valid * mongoc_write_concern_journal_is_set Now that these public APIs are available, the PHP drivers no longer define the MONGOC_I_AM_A_DRIVER preprocessor symbol to access private APIs. The symbol is removed from C Driver headers, and libmongoc-priv.so is no longer installed. Other Features -------------- * New connection string option "localThresholdMS". * zSeries and POWER8 platform support. * Performance enhancements, reduce allocation and copying in command code. * All man page names now begin with "mongoc_" to avoid install conflicts. * New function mongoc_gridfs_file_set_id. Deprecations ------------ Automatically calling mongoc_init and mongoc_cleanup is a GCC-specific feature that is now deprecated, and will be removed in version 2. The driver should be built with: ./configure --disable-automatic-init-and-cleanup Or: cmake "-DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF" -G "Visual Studio 10 Win64" "-DCMAKE_INSTALL_PREFIX=C:\mongo-c-driver" In this configuration, applications must explicitly init and cleanup libmongoc. Deprecated functions: * mongoc_write_concern_get_fsync * mongoc_write_concern_set_fsync Notable Bug Fixes ----------------- * Logic bugs using tag sets to select replica set members with complex configs * mongoc_client_get_database_names no longer filters out a replica set member's "local" database. * mongoc_client_get_gridfs now ensures the proper indexes on the files and chunks collections. * SecondaryPreferred fails if primary matches tags but secondaries don't. * mongoc_collection_find_and_modify_with_opts can return true on writeConcernError. * mongoc_collection_validate doesn't always init "reply". * The strings referred to by mongoc_ssl_opt_t, like pem_file and ca_file, are now copied into the client or client pool by mongoc_client_set_ssl_opts or mongoc_client_pool_set_ssl_opts, and need not be kept valid afterward. * mongoc_collection_count_with_opts ignored flags and read_prefs. * minPoolSize of 0 should mean "no minimum". * mongoc_database_create_collection should always use the primary. * The GSSAPI properties SERVICE_NAME and CANONICALIZE_HOST_NAME are now properly parsed from the URI, see the "Authentication" doc for details. * Comprehensive compatibility with various C standards and compilers. Acknowledgements ---------------- Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Ian Boros * Fiona Rowan * Jeremy Mikola * Christoph Schwarz * Mike Lloyd * Remi Collet * Jean-Bernard Jansen * David Hatch * Derick Rethans * Brian Samek Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.5 ==================== It is my pleasure to announce mongo-c-driver 1.3.5. This release fixes a crash in mongoc_cleanup when an allocator had been set with bson_mem_set_vtable, and introduces a configure option MONGOC_NO_AUTOMATIC_GLOBALS which prevents code built with GCC from automatically calling mongoc_init and mongoc_cleanup when your code does not. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.4 ==================== It is my pleasure to announce the MongoDB C Driver 1.3.4. This release fixes a security vulnerability: when a mongoc_client_t uses SSL and is disconnected, it failed to re-verify the server certificate after reconnecting. This flaw affects single clients, not pooled ones. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.3 ==================== It is my pleasure to announce MongoDB C Driver 1.3.3. This fixes a bug where a slightly-oversized bulk write operation was not split into batches; instead, it was sent whole to the server, which rejected it. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.2 ==================== It is my pleasure to announce MongoDB C Driver 1.3.2. This is a bugfix release: * A socket is properly discarded after a network error from a command. * mongoc_database_get_collection now copies the database's read preferences, read concern, and write concern, instead of copying the client's. * mongoc_cursor_t's private struct now allows a negative limit. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Jeremy Mikola * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.1 ==================== It is my pleasure to announce MongoDB C Driver 1.3.1. This is a bugfix release: * mongoc_client_get_gridfs now copies the client's read preferences, read concern, and write concern to the newly created mongoc_gridfs_t. Before this fix, GridFS operations were always executed with the default config: data was read from the primary, with the read concern level "local", and written with write concern "acknowledged". Now, if you have configured any of these options on the mongoc_client_t, they are respected by the mongoc_gridfs_t. * CMakeLists.txt now includes and installs the pkg-config files. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Christopher Wang * Jean-Bernard Jansen * Jeremy Mikola * Jeroen Ooms Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0 ==================== It is my pleasure to announce to you the release of the MongoDB C Driver 1.3.0. Changes since the release candidate 1.3.0-rc0: * Fix a cursor bug introduced on big-endian platforms in 1.3.0-beta0. * Improve documentation for mongoc_host_list_t. * Move private mongoc_host_list_t functions from public header. * Refactor the build system to declare library version in one place. All new features and changes since the previous stable release, 1.2.1: * If the driver is compiled without SSL support but a URI with "ssl=true" is passed to mongoc_client_new, mongoc_client_new_from_uri, or mongoc_client_pool_new, the function logs an error and returns NULL. Before, the driver would attempt a non-SSL connection. * mongoc_collection_find_and_modify will now apply the mongoc_collection_t's write_concern_t when talking to MongoDB 3.2. * Support for MongoDB 3.2's "readConcern" feature for queries, counts, and aggregations. The option "readConcernLevel" is now accepted in the MongoDB URI. New struct mongoc_read_concern_t, and functions operating on it: - mongoc_client_get_read_concern - mongoc_client_set_read_concern - mongoc_database_get_read_concern - mongoc_database_set_read_concern - mongoc_collection_get_read_concern - mongoc_collection_set_read_concern - mongoc_read_concern_copy - mongoc_read_concern_destroy - mongoc_read_concern_get_level - mongoc_read_concern_new - mongoc_read_concern_set_level - mongoc_uri_get_read_concern * Support for MongoDB 3.2's "bypassDocumentValidation" option for writes. * New struct mongoc_bulk_write_flags_t and related functions: - mongoc_bulk_operation_set_bypass_document_validation * New struct mongoc_find_and_modify_opts_t and related functions: - mongoc_find_and_modify_opts_new - mongoc_find_and_modify_opts_destroy - mongoc_find_and_modify_opts_set_sort - mongoc_find_and_modify_opts_set_update - mongoc_find_and_modify_opts_set_fields - mongoc_find_and_modify_opts_set_flags - mongoc_find_and_modify_opts_set_bypass_document_validation - mongoc_collection_find_and_modify_with_opts * New functions to copy database and collection handles: - mongoc_collection_copy - mongoc_database_copy * Support for MongoDB 3.2 wire protocol: use commands in place of OP_QUERY, OP_GETMORE, and OP_KILLCURSORS messages. * To explain a query plan with MongoDB 3.2, you must now call the "explain" command, instead of including the "$explain" key in a mongoc_collection_find query. See the mongoc_collection_find documentation page for details. * Configurable wait time on tailable cursors with MongoDB 3.2: - mongoc_cursor_get_max_await_time_ms - mongoc_cursor_set_max_await_time_ms * Use electionId to detect a stale replica set primary during a network split. * Disconnect from replica set members whose "me" field does not match the connection address. * The client side matching feature, mongoc_matcher_t and related functions, are deprecated and scheduled for removal in version 2.0. * New CMake options ENABLE_SSL, ENABLE_SASL, ENABLE_TESTS, and ENABLE_EXAMPLES. * Use constant-time comparison when verifying credentials. * Combine environment's CFLAGS with configure options when building. * Improved man page output and "whatis" entries. There are extensive bugfixes and improvements in GridFS since 1.2.1, including: * Handle seeking, reading, and writing past the end of a GridFS file. * If a GridFS chunk is missing, mongoc_gridfs_file_readv sets file->error to domain MONGOC_ERROR_GRIDFS and a new code MONGOC_ERROR_GRIDFS_CHUNK_MISSING. * Optimization for long seeks forward with mongoc_gridfs_file_seek. Other fixes since 1.2.1: * Memory leaks in mongoc_database_has_collection and mongoc_cursor_next. * Report writeConcern failures from findAndModify and from legacy writes. * Memory leak in mongoc_database_find_collections. * Set OP_QUERY's nToReturn from the provided limit. * Fix compiler warnings and errors, especially with Visual Studio 2015, GCC 4.8, and IBM XL C. * Bugs and typos in tutorial examples. Thanks to everyone who contributed to this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jose Sebastian Battig * Matt Cotter * Claudio Canella * alexeyvo * Christopher Wang * Flavio Medeiros * Iago Rubio * Jeremy Mikola * Victor Leschuk * Jason Carey Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0-rc0 ======================== It is my pleasure to announce to you the first release candidate of MongoDB C driver 1.3.0. It includes additive ABI changes and bugfixes, and support for the upcoming MongoDB 3.2. It is compatible with MongoDB 2.4 and later. New features and changes since 1.3.0-beta0: * If the driver is compiled without SSL support but a URI with "ssl=true" is passed to mongoc_client_new, mongoc_client_new_from_uri, or mongoc_client_pool_new, the function logs an error and returns NULL. Before, the driver would attempt a non-SSL connection. * New functions to copy database and collection handles: - mongoc_collection_copy - mongoc_database_copy * If a GridFS chunk is missing, mongoc_gridfs_file_readv sets file->error to domain MONGOC_ERROR_GRIDFS and a new code MONGOC_ERROR_GRIDFS_CHUNK_MISSING. * Use electionId to detect a stale replica set primary during a network split. * Disconnect from replica set members whose "me" field does not match the connection address. * The client side matching feature, mongoc_matcher_t and related functions, are deprecated and scheduled for removal in version 2.0. * New CMake options ENABLE_SSL, ENABLE_SASL, ENABLE_TESTS, and ENABLE_EXAMPLES. * The build system is refactored to declare the current version and latest release in one place. Other fixes: * Memory leaks in mongoc_database_has_collection and mongoc_cursor_next. * Report writeConcern failures from findAndModify and from legacy writes. Thanks to everyone who contributed to this release candidate. * A. Jesse Jiryu Davis * Hannes Magnusson * Matt Cotter * Claudio Canella * Victor Leschuk * Flavio Medeiros * Christopher Wang Peace, A. Jesse Jiryu Davis mongo-c-driver 1.3.0-beta0 ========================== It is my pleasure to announce to you the beta of MongoDB C driver 1.3.0. This beta includes additive ABI changes and bugfixes, and support for the upcoming MongoDB 3.2. It is compatible with MongoDB 2.4 and later. New features and changes: * mongoc_collection_find_and_modify will now apply the mongoc_collection_t's write_concern_t when talking to MongoDB 3.2. * Support for MongoDB 3.2's "readConcern" feature for queries, counts, and aggregations. The option "readConcernLevel" is now accepted in the MongoDB URI. New struct mongoc_read_concern_t, and functions operating on it: - mongoc_client_get_read_concern - mongoc_client_set_read_concern - mongoc_database_get_read_concern - mongoc_database_set_read_concern - mongoc_collection_get_read_concern - mongoc_collection_set_read_concern - mongoc_read_concern_copy - mongoc_read_concern_destroy - mongoc_read_concern_get_level - mongoc_read_concern_new - mongoc_read_concern_set_level - mongoc_uri_get_read_concern * Support for MongoDB 3.2's "bypassDocumentValidation" option for writes. * New struct mongoc_bulk_write_flags_t and related functions: - mongoc_bulk_operation_set_bypass_document_validation * New struct mongoc_find_and_modify_opts_t and related functions: - mongoc_find_and_modify_opts_new - mongoc_find_and_modify_opts_destroy - mongoc_find_and_modify_opts_set_sort - mongoc_find_and_modify_opts_set_update - mongoc_find_and_modify_opts_set_fields - mongoc_find_and_modify_opts_set_flags - mongoc_find_and_modify_opts_set_bypass_document_validation - mongoc_collection_find_and_modify_with_opts * Configurable wait time on tailable cursors with MongoDB 3.2: - mongoc_cursor_get_max_await_time_ms - mongoc_cursor_set_max_await_time_ms * Support for MongoDB 3.2 wire protocol: use commands in place of OP_QUERY, OP_GETMORE, and OP_KILLCURSORS messages. * To explain a query plan with MongoDB 3.2, you must now call the "explain" command, instead of including the "$explain" key in a mongoc_collection_find query. See the mongoc_collection_find documentation page for details. * Use constant-time comparison when verifying credentials. * Combine environment's CFLAGS with configure options when building. * Improved man page output and "whatis" entries. Extensive bugfixes and improvements in GridFS, including: * Handle seeking, reading, and writing past the end of a GridFS file. * Optimization for long seeks forward with mongoc_gridfs_file_seek. Other fixes: * Memory leak in mongoc_database_find_collections. * Set OP_QUERY's nToReturn from the provided limit. * Fix compiler warnings and errors, especially with Visual Studio 2015, GCC 4.8, and IBM XL C. * Bugs and typos in tutorial examples Thanks to everyone who contributed to this beta release. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jose Sebastian Battig * Jeremy Mikola * Iago Rubio * Matt Cotter * alexeyvo Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.2 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.2. This release fixes a rare bug where the driver can direct reads to hidden secondaries unintentionally. It also includes fixes and improvements to the build system. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.1 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.1. This release includes critical bugfixes for SSL connections with mongoc_client_pool_t, and for Unix domain socket connections. The documentation is updated for a change introduced in version 1.2.0: mongoc_client_set_ssl_opts and mongoc_client_pool_set_ssl_opts now configure the driver to require an SSL connection to the server, even if "ssl=true" is omitted from the MongoDB URI. Before, SSL options were ignored unless "ssl=true" was included in the URI. The build instructions are improved, including the steps to build with OpenSSL on OS X El Capitan. Build errors and warnings are fixed for clang in gnu99 mode and MinGW. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Tamas Nagy Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0 ==================== It is my pleasure to announce to you the MongoDB C driver 1.2.0. This is a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. The following notes summarize changes since the previous stable release, 1.1.11, including changes in the 1.2.0 betas and release candidate. This version rewrites mongoc_client_t's internals to match two important new specs for MongoDB drivers: the Server Discovery And Monitoring Spec and the Server Selection Spec. The rewritten client has many advantages: * All replica set members or mongos servers are discovered and periodically checked in parallel. The driver's performance is dramatically better and more predictable with multi-server deployments, or with a flaky network, or when some servers are slow or down. * Clients from the same mongoc_client_pool_t share a background thread that discovers and monitors all servers in parallel. * Unnecessary round trips for server checks and pings are eliminated. * Behavior is documented in the specs, and consistent with other drivers, even in complex or unusual scenarios. * The URI's "replicaSet" option is enforced: the driver now refuses to connect to a server unless it is a member of a replica set with the correct setName. * Many race conditions related to changing deployment conditions are fixed. To conform to the new specs, the client now accepts these options in the MongoDB URI; see the mongoc_uri_t documentation for details: * heartbeatFrequencyMS * serverSelectionTimeoutMS * serverSelectionTryOnce * socketCheckIntervalMS Other features: * All timeouts that can be configured in the URI now interpret 0 to mean "use the default value for this timeout". * The client's read preference can be configured in the URI with the new options "readPreference" and "readPreferenceTags"; see the mongoc_uri_t documentation. * The new mongoc_uri_get_read_prefs_t function retrieves both the read mode and tags from a mongoc_uri_t. * New accessors mongoc_gridfs_file_get_id, mongoc_client_get_default_database, and mongoc_bulk_operation_get_write_concern. * Debug tracing can be controlled at runtime with mongoc_log_trace_enable and mongoc_log_trace_disable. * Set mongoc_client_pool_t's size with mongoc_client_pool_min_size() and mongoc_client_pool_max_size(). Other changes: * Enable runtime asserts in release build. * The libbson submodule's URL now uses the recommended https://, not git:// * mongoc_client_kill_cursor is now deprecated and will be removed in 2.0. * The write concern "w=-1" is documented as obsolete. These notable bugs have been fixed since 1.1.11: * The driver now uses the server's maxWireVersion to avoid an error and extra round-trip when executing aggregations on MongoDB 2.4 and older. * Much improved reporting of network errors, unavailable servers, and authentication failure * Off-by-one error in mongoc_gridfs_file_seek with mode SEEK_END * The writeConcernErrors field of bulk results is properly formatted. * A cursor with a server "hint" sets slaveOkay and / or $readPreference. * Destroying an exhaust cursor must close its socket * "wtimeoutms" was ignored for write concerns besides "majority". * Bulk write operations might fail in mixed-version sharded clusters with some pre-2.6 mongos servers. * A variety of bugs and incorrect results in mongoc_bulk_operation_execute. * Numerous compiler warnings and build failures on various platforms. * Copious refinements to the documentation. Thanks to everyone who contributed to this version of libmongoc. * Jason Carey * Samantha Ritter * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jeremy Mikola * Remi Collet * Jose Sebastian Battig * Derick Rethans * Yuchen Xie * Manuel Schoenlaub * Sujan Dutta * Lloyd Zhou * rubicks * Pawel Szczurko * Yuval Hager Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-rc0 ======================== It is my pleasure to announce the release candidate of the MongoDB C driver 1.2.0. It includes features and bugfixes developed since 1.2.0-beta1. Notable bugs fixed: * Much improved reporting of network errors, unavailable servers, and authentication failure * Destroying an exhaust cursor must close its socket * Various bugs in server reconnection logic * mongoc_collection_aggregate returned invalid cursor after failure * Wrong error message after failed network write on Sparc * Missing JSON test files in release tarball Other changes: * Enable runtime asserts in release build. * mongoc_client_kill_cursor is now deprecated and will be removed in version 2.0. This release candidate also includes all bugfixes from 1.1.11. Version 1.2.0 final will be a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * rubicks * Jose Sebastian Battig * Jason Carey * Remi Collet * Yuval Hager Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-beta1 ========================== It is my pleasure to announce the second beta release of the MongoDB C driver 1.2.0. It includes features and bugfixes developed since 1.2.0-beta. New features: * Set mongoc_client_pool_t's size with mongoc_client_pool_min_size() and mongoc_client_pool_max_size(). * The write concern "w=-1" is now documented as obsolete. * Abundant fixes and additions to the documentation, beyond those in the previous beta. Notable bugs fixed: * Crashes and races in several replica set scenarios. * The driver now uses the server's maxWireVersion to avoid an error and extra round-trip when executing aggregations on MongoDB 2.4 and older. * Fixed network error handling in multiple code paths. * connectTimeoutMS limits the time the driver can spend reconnecting to servers in single-threaded (non-pooled) mode with serverSelectionTryOnce. Version 1.2.0 final will be a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Manuel Schoenlaub * Kyle Suarez * Remi Collet Peace, A. Jesse Jiryu Davis mongo-c-driver 1.2.0-beta ========================= It is my pleasure to announce to you the first beta release of the MongoDB C driver 1.2.0. This release is a stable release with additive ABI changes and bugfixes. It is compatible with MongoDB version 2.4 and later. Version 1.2.0 rewrites mongoc_client_t's internals to match two important new specs for MongoDB drivers: the Server Discovery And Monitoring Spec and the Server Selection Spec. The rewritten client has many advantages: * All replica set members or mongoses are discovered and periodically checked in parallel. The driver's performance is dramatically better and more predictable with multi-server deployments, or with a flaky network, or when some servers are slow or down. * Clients from the same mongoc_client_pool_t share a background thread that discovers and monitors all servers in parallel. * Unnecessary round trips for server checks and pings are eliminated. * Behavior is documented in the specs, and consistent with other drivers, even in complex or unusual scenarios. * The URI's "replicaSet" option is enforced: the driver now refuses to connect to a server unless it is a member of a replica set with the right setName. * Many race conditions related to changing deployment conditions are fixed. To conform to the new specs, the client now accepts these options in the MongoDB URI; see the mongoc_uri_t documentation for details: * heartbeatFrequencyMS * serverSelectionTimeoutMS * serverSelectionTryOnce * socketCheckIntervalMS Other features: * All timeouts that can be configured in the URI now interpret 0 to mean "use the default value for this timeout". * The client's read preference can be configured in the URI with the new options "readPreference" and "readPreferenceTags", see the mongoc_uri_t documentation. * The new mongoc_uri_get_read_prefs_t function retrieves both the read mode and tags from a mongoc_uri_t. * New accessors mongoc_gridfs_file_get_id, mongoc_client_get_default_database, and mongoc_bulk_operation_get_write_concern. * Debug tracing can be controlled at runtime with mongoc_log_trace_enable and mongoc_log_trace_disable. Notable bugs fixed: * "wtimeoutms" was ignored for write concerns besides "majority". * Bulk write operations might fail in mixed-version sharded clusters with some pre-2.6 mongos servers. * Normal operations were logged during startup and could not be silenced. * A variety of bugs and incorrect results in mongoc_bulk_operation_execute. * Numerous compiler warnings and build failures on various platforms. * Copious refinements to the documentation. Thanks to everyone who contributed to this version of libmongoc. * A. Jesse Jiryu Davis * Sujan Dutta * Jason Carey * Hannes Magnusson * Jeremy Mikola * Derick Rethans * Samantha Ritter * Yuchen Xie * Lloyd Zhou Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.11 ===================== It is my pleasure to announce to you the MongoDB C driver 1.1.11. This is a patch release with bug fixes: * Undetected network errors when sending messages to the server * Off-by-one error in mongoc_gridfs_file_seek with mode SEEK_END * Memory leak parsing a URI that contains an invalid option * The libbson submodule's URL now uses the recommended https://, not git:// Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Hannes Magnusson * Jason Carey * Jose Sebastian Battig * rubicks Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.10 ===================== It is my pleasure to announce to you the MongoDB C driver 1.1.10. This is a patch release with bug fixes: * Occasional crash reconnecting to replica set. * Queries sent to recovering replica set members. * Memory leak when calling ismaster on replica set members. Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Daniil Zaitsev * Jason Carey * Jeremy Mikola Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.9 ==================== It is my pleasure to announce to you the MongoDB C driver 1.1.9. This release fixes a common crash in 1.1.8, which itself was introduced while fixing a rare crash in 1.1.7. For further details: https://jira.mongodb.org/browse/CDRIVER-721 https://jira.mongodb.org/browse/CDRIVER-695 Thanks to everyone who contributed to the development of this point release for libmongoc. Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.8 ==================== UPDATE: 1.1.8 suffered a severe new bug so I removed the release from GitHub: https://jira.mongodb.org/browse/CDRIVER-721 This is a patch release with bug fixes: * Crash freeing client after a replica set auth error. * Compile error strict C89 mode. mongo-c-driver 1.1.7 ==================== It is my pleasure to announce to you the 1.1.7 release of the MongoDB C driver. This is a patch release with bug fixes: * Thread-safe use of Cyrus SASL library. * Experimental support for building with CMake and SASL. * Faster reconnection to replica set with some hosts down. * Crash iterating a cursor after reconnecting to a replica set. * Unchecked errors decoding invalid UTF-8 in MongoDB URIs. * Fix error reporting from mongoc_client_get_database_names. Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Jason Carey * Hannes Magnusson Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.6 ==================== It is my pleasure to announce to you the 1.1.6 release of the MongoDB C driver. This is a patch release with performance enhancements and bug fixes: * mongoc_bulk_operation_execute now coalesces consecutive update operations into a single message to a MongoDB 2.6+ server, yielding huge performance gains. Same for remove operations. (Inserts were always coalesced.) * Large numbers of insert operations are now properly batched according to number of documents and total data size. * GSSAPI / Kerberos auth now works. * The driver no longer tries three times in vain to reconnect to a primary, so socketTimeoutMS and connectTimeoutMS now behave *closer* to what you expect for replica sets with down members. A full fix awaits 1.2.0. I snuck in a feature: * mongoc_matcher_t now supports basic subdocument and array matching Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Jason Carey * Kai Mast * Matt Cotter Peace, A. Jesse Jiryu Davis mongo-c-driver 1.1.5 ==================== It is my pleasure to announce to you the 1.1.5 release of the MongoDB C driver. This is a patch release with performance enhancements and bug fixes: * The fsync and j write concern flags now imply acknowledged writes * Prevent using fsync or j with conflicting w=0 write concern * Obey socket timeout consistently in TLS/SSL mode * Return an error promptly after a network hangup in TLS mode * Prevent crash using SSL in FIPS mode * Always return NULL from mongoc_database_get_collection_names on error * Fix version check for GCC 5 and future versions of Clang * Fix warnings and errors building on various platforms * Add configure flag to enable/disable shared memory performance counters * Minor docs improvements and fix links from C Driver docs to Libbson docs With this release, Libbson abandons the convention that odd-numbered patch versions indicate unstable releases. We switch to simple semantic versioning: 1.1.5 is a stable release with bug fixes since 1.1.4. During subsequent development the version will be "1.1.6-dev". Thanks to everyone who contributed to the development of this point release for libmongoc. * A. Jesse Jiryu Davis * Christian Hergert * Jason Carey * Jeremy Mikola * Jeroen Ooms * Hannes Magnusson Enjoy! -- A. Jesse Jiryu Davis mongo-c-driver 1.1.4 ==================== It is my pleasure to announce to you the 1.1.4 release of the MongoDB C driver. This release is a stable release with performance enhancements and bugfixes. Changes include: * Fixed client pool concurrency issues * Fixed some scenarios where replica sets would fail to reconnect on primary step down. * Improved write concern handling * Validate port number in URI * Various other fixes Thanks to everyone who contributed to the development of this point release for libmongoc. * Jason Carey * Andrew Clayton * A. Jesse Jiryu Davis * Jeremy Mikola Enjoy! -- Jason Carey mongo-c-driver 1.1.2 ==================== It is my pleasure to announce to you the 1.1.2 release of the MongoDB C driver. This release is a stable release with performance enhancements and bugfixes. Changes include: * Process connectTimeoutMS cast insensitively * Addition of missing trace macros * Improvement of internal error messages * Fix a segfault in OpenSSL cleanup routines * Fix for IPv6 support for replica sets * Coalesce small vectorized TLS writes * MinGW fixups * Fix for a memory leak in get_database_names() * Fixes for patching write concern through the bulk api * Fix to normalize hostnames in uri parsing * Fix for managing connections in the client pool * Various other fixes Thanks to everyone who contributed to the development of this point release for libmongoc. * Andrew Clayton * Denis Gladkikh * Hannes Magnusson * Jason Carey * Jeremy Mikola * mschoenlaub * Samantha Ritter * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.1.0 ==================== It is my pleasure to announce to you the 1.1.0 release of the MongoDB C driver. This release is a stable release with additive ABI changes and bugfixes. The below changes include some carried over from RC0. Changes include: * RC0 * ABI versioning for 1.1 versus 1.0 symbols * additional geo index options * authMechanismProperties in URI * fixes for OS X Yosemite * removal of replica set member limit * SCRAM-SHA-1 SASL mechanism * updated dependency on libbson 1.1 abi * validation for bulk insert * various memory leak fixes * Fixes to documentation typos * "How to Ask For Help" in the README * Removed dependency on sasl for PLAIN authentication * Use provided username, if available, for X.509 auth * Fixed WriteConcern error reporting for some writes * Check for closed sockets before attempting RPCs * Fixes for gridfs file seek * Fixes for mongoc_cursor_clone() * Fixes for unix domain socket support * Fixes for polling on win32 * Improved warnings on failure to connect * Addition of wired tiger options * Fixes for examples Additions to the ABI include: * support for extra option in count - mongoc_collection_count_with_opts * additional index options - mongoc_index_opt_geo_get_default - mongoc_index_opt_geo_init - mongoc_index_opt_wt_get_default - mongoc_index_opt_wt_init * rand interface to seed and verify the strong random number generation needed by some auth mechanisms - mongoc_rand_seed - mongoc_rand_add - mongoc_rand_status * URI additions to support more complicated auth credentials - mongoc_uri_get_credentials - mongoc_uri_get_mechanism_properties * Support for cursor returning metadata crud operations - mongoc_client_find_databases - mongoc_collection_find_indexes - mongoc_database_find_collections * Kill cursor support - mongoc_client_kill_cursor * Various get/setters on cursor - mongoc_cursor_get_batch_size - mongoc_cursor_get_id - mongoc_cursor_set_batch_size * More socket/stream options - mongoc_socket_check_closed - mongoc_socket_inet_ntop - mongoc_stream_check_closed - mongoc_stream_write Additional Notes: Existing complex index names may contain a zero instead of a type due to a bug in mongoc_collection_keys_to_index_string. As a result those indexes may be hard to drop from the driver as they have a name you would not expect. Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * aherlihy * alexeyvo * Christian Hergert * Hannes Magnusson * Jason Carey * Jérôme Lebel * Jesse Jiryu Davis * lloydzhou * Mark Benevenuto * Paul Melnikow * Samantha Ritter * Shraya Ramani * Spencer Jackson * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.1.0-rc0 ======================== It is my pleasure to announce to you the 1.1.0-rc0 release of the MongoDB C driver. This release is a release candidate with additive ABI changes and bugfixes. Changes include: * ABI versioning for 1.1 versus 1.0 symbols * additional geo index options * authMechanismProperties in URI * fixes for OS X Yosemite * removal of replica set member limit * SCRAM-SHA-1 SASL mechanism * updated dependency on libbson 1.1 abi * validation for bulk insert * various memory leak fixes Additions to the ABI include: * support for extra option in count - mongoc_collection_count_with_opts * extra index and collection info - mongoc_collection_get_index_info - mongoc_database_get_collection_info * additional geo options - mongoc_index_opt_geo_get_default - mongoc_index_opt_geo_init * rand interface to seed and verify the strong random number generation needed by some auth mechanisms - mongoc_rand_seed - mongoc_rand_add - mongoc_rand_status * URI additions to support more complicated auth credentials - mongoc_uri_get_credentials - mongoc_uri_get_mechanism_properties Additional Notes: Existing complex index names may contain a zero instead of a type due to a bug in mongoc_collection_keys_to_index_string. As a result those indexes may be hard to drop from the driver as they have a name you would not expect. Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * aherlihy * alexeyvo * Christian Hergert * Jason Carey * Jérôme Lebel * Samantha Ritter * Spencer Jackson * Tyler Brock Enjoy! -- Jason Carey mongo-c-driver 1.0.2 ==================== It is my pleasure to announce to you the 1.0.2 release of the MongoDB C driver. This release is a minor point release with no ABI changes and mostly small bugfixes. Changes include: * A variety of fixes for read preference based node selection * Avoided inclusion of getLastError in 2.6 writeConcern * Correct handling of pass through params for collection_aggregate * Improved error reporting in socket connect * Public MONGOC_DEFAULT_CONNECTTIMEOUTMS Thanks to everyone who contributed to the development of this point release for libmongoc. * Adam Midvidy * Christian Hergert * Denis Gladkikh * Jason Carey * Jeremy Mikola * Jérôme Lebel * Tyler Brock * Wisdom Omuya -- Jason Carey mongo-c-driver 1.0.0 ==================== It is my very distinct pleasure to announce to you the 1.0 release of the MongoDB C driver! This is the culmination of just over a year of work and could not have been done without the help of our wonderful community. Thanks to everyone who contributed to the development of this driver! * Christian Hergert * Jason Carey * Gary Murakami * Christian Heckl * Frank Watson Song * Hannes Magnusson * JeÌroÌ‚me Lebel * Kyle Suarez * Maga Napanga * Michael Kuhn * Vincent Giersch * essentia44 * yuqing Happy Hacking! -- Christian Hergert mongo-c-driver 0.98.2 ===================== One final step before our journey to 1.0! This is a relatively small release, adding some features needed for drivers building on top of the C driver. A new libmongoc-priv.so library is installed that does not have symbols hidden. You can access private headers via the -private.h variants. This means you will need to recompile your project every time the library is changed (if you use those private headers, as they are subject to change). A special thanks to Hannes Magnusson for patches in this release. See `git shortlog 0.98.0..0.98.2` for a list of all the changes. -- Christian Hergert mongo-c-driver 0.98.0 ===================== Another step in the rapidly approaching path to 1.0! This release is primarily a bugfix release and stablization effort as we approach 1.0 of the MongoDB C driver. This release requires 0.98.0 of Libbson for improvements to the memory management system. You can now setup custom memory allocators at the start of the process. This is a RC release that with a few improvements will likely become 1.0. A special thanks to the following for patches in this cycle: * Kyle Suarez * yuqing See `git shortlog 0.96.4..0.98.0` for a list of all the changes. -- Christian Hergert mongo-c-driver 0.96.4 ===================== Another incremental feature update and bugfix release! In this release, you will find the following changes: * build/mci.sh script for automatically building Debian packages, RPMs, and Solaris packaging based on the host operating system. * Various libbson improvements, now depending on 0.8.4. * Alignment fixes for Solaris Studio C compiler via libbson. * Addition of mongoc_gridfs_remove_by_filename() for removing a file from gridfs by filename. * client command functions can now take a fully qualified namespace. * collections can now support names that indicate a command namespace. * Commands will no longer fail if they do not contain an "ok" field. * OP_QUERY will now set the slaveOk bit in the wire protocol if * readPreferences are set to non-PRIMARY. * Various documentation and build fixes. Thanks again to all the contributors, and happy hacking! mongo-c-driver 0.96.2 ===================== Hot on the heels of 0.96.0 we would like to present mongo-c-driver 0.96.2! This is primarily a bugfix release. Included in this release are: * Ensure batchSize is used in cursor GETMORE operations with `aggregate`. * Ensure enough buffer space is allocated for incoming RPC when buffering from a stream. * Require libbson 0.8.2 for more robust `bson_next_power_of_two()` when using `size_t` and BCON compilation fix with C++. * Handle cursor id's that are not 64-bit values in response from `aggregate` command. * Handle upsert on MongoDB < 2.6 when _id does not contain an `ObjectId`. * Use 100 for default batchSize in `aggregate` command. Happy Hacking! mongo-c-driver 0.96.0 ===================== It's that time again, time for another mongo-c-driver release! This release includes much new documentation, which can be found at https://www.mongodb.com/docs/ecosystem/drivers/c/. Additionally, this release improves support for various exotic systems. Solaris 10 is supported much better on SPARC and x86_64 based systems. Some workarounds for mixed-mode sharded-clusters have been added to improve resiliency when rolling upgrades are performed. Build improvements have been added to help us detect SASL and SSL implementations on platforms that do not support pkg-config. This should simplify building for some of you. We've added some more logging to SASL authentication to help debug authentication failures. A bug causing an abort() when SSL is used and a server is down has been fixed. We've renamed various _delete() functions to _remove() to provide consistency with other MongoDB drivers. You can now specify SSL options for client pools. -D_REENTRANT is always defined now on Solaris to help with errno detection. This may not have been done before if using a non-GCC platform with pthreads. A bug was fixed where timeouts could have been 1000x longer than expected due to failure to convert from microseconds to milliseconds. A bug was fixed with authentication in sharded cluster and replica set scenarios. Happy Hacking! mongo-c-driver 0.94.2 ===================== Hot on the heels of 0.94.0 is 0.94.2, a bugfix release. A bug has been fixed when using TLS streams and large result sets. In this release, we added support for Sun's C compiler (Sun Pro C) on Solaris. This allows for builds on Solaris 10 with SPARC using the native toolchain. This release contains a couple of fixes in libbson as well. Keep those bug reports coming, and as always, Happy Hacking! mongo-c-driver 0.94.0 ===================== The mongo-c-driver team is proud to announce the release of 0.94.0. This release is a followup to the previous release adding more features to be found in MongoDB 2.6. You will find some new API's, bug fixes, and more documentation. Under the hood, 0.94.0 uses the new write-commands as part of MongoDB 2.6 when it discovers it is communicating with a MongoDB server. There is now a bulk operation API (See `mongoc-bulk-operation.h`). Helpers for common server commands have been added. You can find most of them `mongoc-collection.h`. To simply using mongo-c-driver from Windows, we've included pre-built binaries on the release page. Thanks to all of the contributors this release! Happy Hacking! mongo-c-driver 0.92.0 ===================== The mongo-c-driver team is proud to announce the release of 0.92.0. This release is the culimation of a few months work and has many bug fixes and new features. It contains over 350 commits from 4 authors since the 0.90.0 release. The mongo-c-driver release tarballs now contain a bundled copy of libbson. If you do not have libbson installed or the system installed libbson is too old, the bundled copy of libbson will be installed. * Revamped build system to simplify installation. * Windows Vista and newer support. * Various GridFS fixes and features. * Kerberos support via cyrus-sasl. * Various SSL improvements. * Support for Solaris 11, FreeBSD 10, RHEL 5+, and SmartOS. * A new client side expression matcher to perform basic query processing. It can perform queries such as {'field': {'$in': [1,2,3]}}. See mongoc_matcher_t for more information. * A new socket abstraction for platform independent network sockets. * A new mongoc-dump example for how to write a simple mongodump replacement. * Counters can use rdtscp instruction on Core iX systems for very fast counters. * configure has new options. If in doubt, the defaults are sensible. * --enable-coverage=yes|no * --enable-debug=yes|no * --enable-debug-symbols=yes|no * --enable-hardening=yes|no * --enable-optimizations=yes|no * --enable-ssl=yes|no * --enable-sasl=yes|no * --enable-tracing=yes|no * --with-libbson=auto|system|bundled mongo-c-driver 0.92.0 requires libbson 0.6.4 or newer. Happy Hacking! Libmongoc 0.90.0 ================ This is the initial release of the new Libmongoc. We chose 0.90.0 for the release version to differentiate ourselves from the, now legacy, version of libmongoc. We will rapidly work towards reaching an API/ABI stable library fit for a 1.0.0 release. Libmongoc is Apache licensed so it can be embedded in a multitude of scenarios. The API of 0.90.0 is completely different from the previous versions. We think this allowed us to create a high-quality library that you will enjoy using in your applications. Many outstanding bugs were closed in the process of creating Libbson 0.90.0. So if you had a pet issue, please take a look to see if it was resolved as part of this effort! Thanks, and enjoy developing your applications with libmongoc! mongo-c-driver-2.2.1/README.rst000066400000000000000000000101441511661753600160460ustar00rootroot00000000000000============== mongo-c-driver ============== About ===== mongo-c-driver is a project that includes two libraries: - libmongoc, a client library written in C for MongoDB. - libbson, a library providing useful routines related to building, parsing, and iterating BSON documents. If libmongoc is not needed, it is possible to build and install only libbson. This project uses `Semantic Versioning `_. Documentation / Support / Feedback ================================== The documentation is available at `MongoDB C Driver Docs `_ and https://www.mongoc.org. For issues with, questions about, or feedback for libmongoc, please look into our `support channels `_. Please do not email any of the libmongoc developers directly with issues or questions - you're more likely to get an answer on the `MongoDB Community Forums`_ or `StackOverflow `_. Bugs / Feature Requests ======================= Think you’ve found a bug? Want to see a new feature in libmongoc? Please open a case in our issue management tool, JIRA: - `Create an account and login `_. - Navigate to `the CDRIVER project `_. - Click **Create Issue** - Please provide as much information as possible about the issue type and how to reproduce it. Bug reports in JIRA for all driver projects (i.e. CDRIVER, CSHARP, JAVA) and the Core Server (i.e. SERVER) project are **public**. How To Ask For Help ------------------- If you are having difficulty building the driver after reading the below instructions, please post on the `MongoDB Community Forums`_ to ask for help. Please include in your post all of the following information: - The version of the driver you are trying to build (branch or tag). - Examples: ``r1.17`` (branch), ``1.9.5`` (tag) - Host OS, version, and architecture. - Examples: Windows 10 64-bit x86, Ubuntu 16.04 64-bit x86, macOS 11.0 - C Compiler and version. - Examples: GCC 7.3.0, Visual Studio Community 2017, clang 3.9, XCode 9.3 - Run CMake with ``--log-level=debug`` and ``--log-context`` for more verbose output. - The output of any ``cmake``, ``make``, or other commands executed during the build. - The text of the error you encountered. Failure to include the relevant information will delay a useful response. Here is a made-up example of a help request that provides the relevant information: Hello, I'm trying to build the C driver with Kerberos support, from mongo-c-driver-1.9.5.tar.gz. I'm on Ubuntu 16.04, 64-bit Intel, with gcc 5.4.0. I run CMake like:: $ cmake . -- The C compiler identification is ;GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works ... SNIPPED OUTPUT, but when you ask for help, include full output without any omissions ... -- Searching for libsasl2 -- Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/sasl/lib for SASL support) CMake Error at CMakeLists.txt:10 (_message): SASL not found Can you tell me what I need to install? Thanks! .. _MongoDB Community Forums: https://www.mongodb.com/community/forums/tags/c/data/drivers/7/c-driver Security Vulnerabilities ------------------------ If you’ve identified a security vulnerability in a driver or any other MongoDB project, please report it according to the `instructions here `_. Installation ============ Detailed installation instructions are in the manual: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/tutorials/obtaining-libraries/ Resources ============ * `Getting Started Tutorial `_. * `MongoDB C Driver Examples `_. * Tutorials, videos, and code examples using the MongoDB C Driver can also be found in the `MongoDB Developer Center `_. mongo-c-driver-2.2.1/THIRD_PARTY_NOTICES000066400000000000000000000213771511661753600173310ustar00rootroot00000000000000The MongoDB C Driver uses third-party code distributed under different licenses. License notice for uthash ------------------------------------------------------------------------------- Copyright (c) 2003-2021, Troy D. Hanson http://troydhanson.github.com/uthash/ 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. 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. License notice for common-b64.c ------------------------------------------------------------------------------- ISC License Copyright: 1996, 1998 Internet Software Consortium 1995 International Business Machines, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions Copyright (c) 1995 by International Business Machines, Inc. International Business Machines, Inc. (hereinafter called IBM) grants permission under its copyrights to use, copy, modify, and distribute this Software with or without fee, provided that the above copyright notice and all paragraphs of this notice appear in all copies, and that the name of IBM not be used in connection with the marketing of any product incorporating the Software or modifications thereof, without specific, written prior permission. To the extent it has a right to do so, IBM grants an immunity from suit under its patents, if any, for the use, sale or manufacture of products to the extent that such products are used for performing Domain Name System dynamic updates in TCP/IP networks by means of the Software. No immunity is granted for any product per se or for any other function of any product. THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. License notice for mongoc.css_t ------------------------------------------------------------------------------- MIT License Portions Copyright 2013 by Ignacy Sokolowski. 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. License notice for zlib ------------------------------------------------------------------------------- /* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.11, January 15th, 2017 Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). */ License notice for common-md5.c ------------------------------------------------------------------------------- ZLib License Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com License notice for utf8proc ------------------------------------------------------------------------------- **utf8proc** is a software package originally developed by Jan Behrens and the rest of the Public Software Group, who deserve nearly all of the credit for this library, that is now maintained by the Julia-language developers. Like the original utf8proc, whose copyright and license statements are reproduced below, all new work on the utf8proc library is licensed under the [MIT "expat" license](http://opensource.org/licenses/MIT): *Copyright © 2014-2021 by Steven G. Johnson, Jiahao Chen, Tony Kelman, Jonas Fonseca, and other contributors listed in the git history.* 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. mongo-c-driver-2.2.1/VERSION_CURRENT000066400000000000000000000000061511661753600166250ustar00rootroot000000000000002.2.1 mongo-c-driver-2.2.1/build/000077500000000000000000000000001511661753600154565ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/.gitignore000066400000000000000000000000101511661753600174350ustar00rootroot00000000000000version mongo-c-driver-2.2.1/build/bottle.py000066400000000000000000005377221511661753600173410ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- """ Bottle is a fast and simple micro-framework for small web applications. It offers request dispatching (Routes) with URL parameter support, templates, a built-in HTTP Server and adapters for many third party WSGI/HTTP-server and template engines - all in a single file and with no dependencies other than the Python Standard Library. Homepage and documentation: http://bottlepy.org/ Copyright (c) 2009-2024, Marcel Hellkamp. License: MIT (see LICENSE for details) """ from __future__ import print_function import sys __author__ = 'Marcel Hellkamp' __version__ = '0.13.2' __license__ = 'MIT' ############################################################################### # Command-line interface ###################################################### ############################################################################### # INFO: Some server adapters need to monkey-patch std-lib modules before they # are imported. This is why some of the command-line handling is done here, but # the actual call to _main() is at the end of the file. def _cli_parse(args): # pragma: no coverage from argparse import ArgumentParser parser = ArgumentParser(prog=args[0], usage="%(prog)s [options] package.module:app") opt = parser.add_argument opt("--version", action="store_true", help="show version number.") opt("-b", "--bind", metavar="ADDRESS", help="bind socket to ADDRESS.") opt("-s", "--server", default='wsgiref', help="use SERVER as backend.") opt("-p", "--plugin", action="append", help="install additional plugin/s.") opt("-c", "--conf", action="append", metavar="FILE", help="load config values from FILE.") opt("-C", "--param", action="append", metavar="NAME=VALUE", help="override config values.") opt("--debug", action="store_true", help="start server in debug mode.") opt("--reload", action="store_true", help="auto-reload on file changes.") opt('app', help='WSGI app entry point.', nargs='?') cli_args = parser.parse_args(args[1:]) return cli_args, parser def _cli_patch(cli_args): # pragma: no coverage parsed_args, _ = _cli_parse(cli_args) opts = parsed_args if opts.server: if opts.server.startswith('gevent'): import gevent.monkey gevent.monkey.patch_all() elif opts.server.startswith('eventlet'): import eventlet eventlet.monkey_patch() if __name__ == '__main__': _cli_patch(sys.argv) ############################################################################### # Imports and Python 2/3 unification ########################################## ############################################################################### import base64, calendar, email.utils, functools, hmac, itertools,\ mimetypes, os, re, tempfile, threading, time, warnings, weakref, hashlib from types import FunctionType from datetime import date as datedate, datetime, timedelta from tempfile import NamedTemporaryFile from traceback import format_exc, print_exc from unicodedata import normalize try: from ujson import dumps as json_dumps, loads as json_lds except ImportError: from json import dumps as json_dumps, loads as json_lds py = sys.version_info py3k = py.major > 2 # Lots of stdlib and builtin differences. if py3k: import http.client as httplib import _thread as thread from urllib.parse import urljoin, SplitResult as UrlSplitResult from urllib.parse import urlencode, quote as urlquote, unquote as urlunquote urlunquote = functools.partial(urlunquote, encoding='latin1') from http.cookies import SimpleCookie, Morsel, CookieError from collections.abc import MutableMapping as DictMixin from types import ModuleType as new_module import pickle from io import BytesIO import configparser from datetime import timezone UTC = timezone.utc # getfullargspec was deprecated in 3.5 and un-deprecated in 3.6 # getargspec was deprecated in 3.0 and removed in 3.11 from inspect import getfullargspec def getargspec(func): spec = getfullargspec(func) kwargs = makelist(spec[0]) + makelist(spec.kwonlyargs) return kwargs, spec[1], spec[2], spec[3] basestring = str unicode = str json_loads = lambda s: json_lds(touni(s)) callable = lambda x: hasattr(x, '__call__') imap = map def _raise(*a): raise a[0](a[1]).with_traceback(a[2]) else: # 2.x warnings.warn("Python 2 support will be dropped in Bottle 0.14", DeprecationWarning) import httplib import thread from urlparse import urljoin, SplitResult as UrlSplitResult from urllib import urlencode, quote as urlquote, unquote as urlunquote from Cookie import SimpleCookie, Morsel, CookieError from itertools import imap import cPickle as pickle from imp import new_module from StringIO import StringIO as BytesIO import ConfigParser as configparser from collections import MutableMapping as DictMixin from inspect import getargspec from datetime import tzinfo class _UTC(tzinfo): def utcoffset(self, dt): return timedelta(0) def tzname(self, dt): return "UTC" def dst(self, dt): return timedelta(0) UTC = _UTC() unicode = unicode json_loads = json_lds exec(compile('def _raise(*a): raise a[0], a[1], a[2]', '', 'exec')) # Some helpers for string/byte handling def tob(s, enc='utf8'): if isinstance(s, unicode): return s.encode(enc) return b'' if s is None else bytes(s) def touni(s, enc='utf8', err='strict'): if isinstance(s, bytes): return s.decode(enc, err) return unicode("" if s is None else s) tonat = touni if py3k else tob def _stderr(*args): try: print(*args, file=sys.stderr) except (IOError, AttributeError): pass # Some environments do not allow printing (mod_wsgi) # A bug in functools causes it to break if the wrapper is an instance method def update_wrapper(wrapper, wrapped, *a, **ka): try: functools.update_wrapper(wrapper, wrapped, *a, **ka) except AttributeError: pass # These helpers are used at module level and need to be defined first. # And yes, I know PEP-8, but sometimes a lower-case classname makes more sense. def depr(major, minor, cause, fix, stacklevel=3): text = "Warning: Use of deprecated feature or API. (Deprecated in Bottle-%d.%d)\n"\ "Cause: %s\n"\ "Fix: %s\n" % (major, minor, cause, fix) if DEBUG == 'strict': raise DeprecationWarning(text) warnings.warn(text, DeprecationWarning, stacklevel=stacklevel) return DeprecationWarning(text) def makelist(data): # This is just too handy if isinstance(data, (tuple, list, set, dict)): return list(data) elif data: return [data] else: return [] class DictProperty(object): """ Property that maps to a key in a local dict-like attribute. """ def __init__(self, attr, key=None, read_only=False): self.attr, self.key, self.read_only = attr, key, read_only def __call__(self, func): functools.update_wrapper(self, func, updated=[]) self.getter, self.key = func, self.key or func.__name__ return self def __get__(self, obj, cls): if obj is None: return self key, storage = self.key, getattr(obj, self.attr) if key not in storage: storage[key] = self.getter(obj) return storage[key] def __set__(self, obj, value): if self.read_only: raise AttributeError("Read-Only property.") getattr(obj, self.attr)[self.key] = value def __delete__(self, obj): if self.read_only: raise AttributeError("Read-Only property.") del getattr(obj, self.attr)[self.key] class cached_property(object): """ A property that is only computed once per instance and then replaces itself with an ordinary attribute. Deleting the attribute resets the property. """ def __init__(self, func): update_wrapper(self, func) self.func = func def __get__(self, obj, cls): if obj is None: return self value = obj.__dict__[self.func.__name__] = self.func(obj) return value class lazy_attribute(object): """ A property that caches itself to the class object. """ def __init__(self, func): functools.update_wrapper(self, func, updated=[]) self.getter = func def __get__(self, obj, cls): value = self.getter(cls) setattr(cls, self.__name__, value) return value ############################################################################### # Exceptions and Events ####################################################### ############################################################################### class BottleException(Exception): """ A base class for exceptions used by bottle. """ pass ############################################################################### # Routing ###################################################################### ############################################################################### class RouteError(BottleException): """ This is a base class for all routing related exceptions """ class RouteReset(BottleException): """ If raised by a plugin or request handler, the route is reset and all plugins are re-applied. """ class RouterUnknownModeError(RouteError): pass class RouteSyntaxError(RouteError): """ The route parser found something not supported by this router. """ class RouteBuildError(RouteError): """ The route could not be built. """ def _re_flatten(p): """ Turn all capturing groups in a regular expression pattern into non-capturing groups. """ if '(' not in p: return p return re.sub(r'(\\*)(\(\?P<[^>]+>|\((?!\?))', lambda m: m.group(0) if len(m.group(1)) % 2 else m.group(1) + '(?:', p) class Router(object): """ A Router is an ordered collection of route->target pairs. It is used to efficiently match WSGI requests against a number of routes and return the first target that satisfies the request. The target may be anything, usually a string, ID or callable object. A route consists of a path-rule and a HTTP method. The path-rule is either a static path (e.g. `/contact`) or a dynamic path that contains wildcards (e.g. `/wiki/`). The wildcard syntax and details on the matching order are described in docs:`routing`. """ default_pattern = '[^/]+' default_filter = 're' #: The current CPython regexp implementation does not allow more #: than 99 matching groups per regular expression. _MAX_GROUPS_PER_PATTERN = 99 def __init__(self, strict=False): self.rules = [] # All rules in order self._groups = {} # index of regexes to find them in dyna_routes self.builder = {} # Data structure for the url builder self.static = {} # Search structure for static routes self.dyna_routes = {} self.dyna_regexes = {} # Search structure for dynamic routes #: If true, static routes are no longer checked first. self.strict_order = strict self.filters = { 're': lambda conf: (_re_flatten(conf or self.default_pattern), None, None), 'int': lambda conf: (r'-?\d+', int, lambda x: str(int(x))), 'float': lambda conf: (r'-?[\d.]+', float, lambda x: str(float(x))), 'path': lambda conf: (r'.+?', None, None) } def add_filter(self, name, func): """ Add a filter. The provided function is called with the configuration string as parameter and must return a (regexp, to_python, to_url) tuple. The first element is a string, the last two are callables or None. """ self.filters[name] = func rule_syntax = re.compile('(\\\\*)' '(?:(?::([a-zA-Z_][a-zA-Z_0-9]*)?()(?:#(.*?)#)?)' '|(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)' '(?::((?:\\\\.|[^\\\\>])+)?)?)?>))') def _itertokens(self, rule): offset, prefix = 0, '' for match in self.rule_syntax.finditer(rule): prefix += rule[offset:match.start()] g = match.groups() if g[2] is not None: depr(0, 13, "Use of old route syntax.", "Use instead of :name in routes.", stacklevel=4) if len(g[0]) % 2: # Escaped wildcard prefix += match.group(0)[len(g[0]):] offset = match.end() continue if prefix: yield prefix, None, None name, filtr, conf = g[4:7] if g[2] is None else g[1:4] yield name, filtr or 'default', conf or None offset, prefix = match.end(), '' if offset <= len(rule) or prefix: yield prefix + rule[offset:], None, None def add(self, rule, method, target, name=None): """ Add a new rule or replace the target for an existing rule. """ anons = 0 # Number of anonymous wildcards found keys = [] # Names of keys pattern = '' # Regular expression pattern with named groups filters = [] # Lists of wildcard input filters builder = [] # Data structure for the URL builder is_static = True for key, mode, conf in self._itertokens(rule): if mode: is_static = False if mode == 'default': mode = self.default_filter mask, in_filter, out_filter = self.filters[mode](conf) if not key: pattern += '(?:%s)' % mask key = 'anon%d' % anons anons += 1 else: pattern += '(?P<%s>%s)' % (key, mask) keys.append(key) if in_filter: filters.append((key, in_filter)) builder.append((key, out_filter or str)) elif key: pattern += re.escape(key) builder.append((None, key)) self.builder[rule] = builder if name: self.builder[name] = builder if is_static and not self.strict_order: self.static.setdefault(method, {}) self.static[method][self.build(rule)] = (target, None) return try: re_pattern = re.compile('^(%s)$' % pattern) re_match = re_pattern.match except re.error as e: raise RouteSyntaxError("Could not add Route: %s (%s)" % (rule, e)) if filters: def getargs(path): url_args = re_match(path).groupdict() for name, wildcard_filter in filters: try: url_args[name] = wildcard_filter(url_args[name]) except ValueError: raise HTTPError(400, 'Path has wrong format.') return url_args elif re_pattern.groupindex: def getargs(path): return re_match(path).groupdict() else: getargs = None flatpat = _re_flatten(pattern) whole_rule = (rule, flatpat, target, getargs) if (flatpat, method) in self._groups: if DEBUG: msg = 'Route <%s %s> overwrites a previously defined route' warnings.warn(msg % (method, rule), RuntimeWarning, stacklevel=3) self.dyna_routes[method][ self._groups[flatpat, method]] = whole_rule else: self.dyna_routes.setdefault(method, []).append(whole_rule) self._groups[flatpat, method] = len(self.dyna_routes[method]) - 1 self._compile(method) def _compile(self, method): all_rules = self.dyna_routes[method] comborules = self.dyna_regexes[method] = [] maxgroups = self._MAX_GROUPS_PER_PATTERN for x in range(0, len(all_rules), maxgroups): some = all_rules[x:x + maxgroups] combined = (flatpat for (_, flatpat, _, _) in some) combined = '|'.join('(^%s$)' % flatpat for flatpat in combined) combined = re.compile(combined).match rules = [(target, getargs) for (_, _, target, getargs) in some] comborules.append((combined, rules)) def build(self, _name, *anons, **query): """ Build an URL by filling the wildcards in a rule. """ builder = self.builder.get(_name) if not builder: raise RouteBuildError("No route with that name.", _name) try: for i, value in enumerate(anons): query['anon%d' % i] = value url = ''.join([f(query.pop(n)) if n else f for (n, f) in builder]) return url if not query else url + '?' + urlencode(query) except KeyError as E: raise RouteBuildError('Missing URL argument: %r' % E.args[0]) def match(self, environ): """ Return a (target, url_args) tuple or raise HTTPError(400/404/405). """ verb = environ['REQUEST_METHOD'].upper() path = environ['PATH_INFO'] or '/' methods = ('PROXY', 'HEAD', 'GET', 'ANY') if verb == 'HEAD' else ('PROXY', verb, 'ANY') for method in methods: if method in self.static and path in self.static[method]: target, getargs = self.static[method][path] return target, getargs(path) if getargs else {} elif method in self.dyna_regexes: for combined, rules in self.dyna_regexes[method]: match = combined(path) if match: target, getargs = rules[match.lastindex - 1] return target, getargs(path) if getargs else {} # No matching route found. Collect alternative methods for 405 response allowed = set([]) nocheck = set(methods) for method in set(self.static) - nocheck: if path in self.static[method]: allowed.add(method) for method in set(self.dyna_regexes) - allowed - nocheck: for combined, rules in self.dyna_regexes[method]: match = combined(path) if match: allowed.add(method) if allowed: allow_header = ",".join(sorted(allowed)) raise HTTPError(405, "Method not allowed.", Allow=allow_header) # No matching route and no alternative method found. We give up raise HTTPError(404, "Not found: " + repr(path)) class Route(object): """ This class wraps a route callback along with route specific metadata and configuration and applies Plugins on demand. It is also responsible for turning an URL path rule into a regular expression usable by the Router. """ def __init__(self, app, rule, method, callback, name=None, plugins=None, skiplist=None, **config): #: The application this route is installed to. self.app = app #: The path-rule string (e.g. ``/wiki/``). self.rule = rule #: The HTTP method as a string (e.g. ``GET``). self.method = method #: The original callback with no plugins applied. Useful for introspection. self.callback = callback #: The name of the route (if specified) or ``None``. self.name = name or None #: A list of route-specific plugins (see :meth:`Bottle.route`). self.plugins = plugins or [] #: A list of plugins to not apply to this route (see :meth:`Bottle.route`). self.skiplist = skiplist or [] #: Additional keyword arguments passed to the :meth:`Bottle.route` #: decorator are stored in this dictionary. Used for route-specific #: plugin configuration and meta-data. self.config = app.config._make_overlay() self.config.load_dict(config) @cached_property def call(self): """ The route callback with all plugins applied. This property is created on demand and then cached to speed up subsequent requests.""" return self._make_callback() def reset(self): """ Forget any cached values. The next time :attr:`call` is accessed, all plugins are re-applied. """ self.__dict__.pop('call', None) def prepare(self): """ Do all on-demand work immediately (useful for debugging).""" self.call def all_plugins(self): """ Yield all Plugins affecting this route. """ unique = set() for p in reversed(self.app.plugins + self.plugins): if True in self.skiplist: break name = getattr(p, 'name', False) if name and (name in self.skiplist or name in unique): continue if p in self.skiplist or type(p) in self.skiplist: continue if name: unique.add(name) yield p def _make_callback(self): callback = self.callback for plugin in self.all_plugins(): try: if hasattr(plugin, 'apply'): callback = plugin.apply(callback, self) else: callback = plugin(callback) except RouteReset: # Try again with changed configuration. return self._make_callback() if callback is not self.callback: update_wrapper(callback, self.callback) return callback def get_undecorated_callback(self): """ Return the callback. If the callback is a decorated function, try to recover the original function. """ func = self.callback func = getattr(func, '__func__' if py3k else 'im_func', func) closure_attr = '__closure__' if py3k else 'func_closure' while hasattr(func, closure_attr) and getattr(func, closure_attr): attributes = getattr(func, closure_attr) func = attributes[0].cell_contents # in case of decorators with multiple arguments if not isinstance(func, FunctionType): # pick first FunctionType instance from multiple arguments func = filter(lambda x: isinstance(x, FunctionType), map(lambda x: x.cell_contents, attributes)) func = list(func)[0] # py3 support return func def get_callback_args(self): """ Return a list of argument names the callback (most likely) accepts as keyword arguments. If the callback is a decorated function, try to recover the original function before inspection. """ return getargspec(self.get_undecorated_callback())[0] def get_config(self, key, default=None): """ Lookup a config field and return its value, first checking the route.config, then route.app.config.""" depr(0, 13, "Route.get_config() is deprecated.", "The Route.config property already includes values from the" " application config for missing keys. Access it directly.") return self.config.get(key, default) def __repr__(self): cb = self.get_undecorated_callback() return '<%s %s -> %s:%s>' % (self.method, self.rule, cb.__module__, cb.__name__) ############################################################################### # Application Object ########################################################### ############################################################################### class Bottle(object): """ Each Bottle object represents a single, distinct web application and consists of routes, callbacks, plugins, resources and configuration. Instances are callable WSGI applications. :param catchall: If true (default), handle all exceptions. Turn off to let debugging middleware handle exceptions. """ @lazy_attribute def _global_config(cls): cfg = ConfigDict() cfg.meta_set('catchall', 'validate', bool) return cfg def __init__(self, **kwargs): #: A :class:`ConfigDict` for app specific configuration. self.config = self._global_config._make_overlay() self.config._add_change_listener( functools.partial(self.trigger_hook, 'config')) self.config.update({ "catchall": True }) if kwargs.get('catchall') is False: depr(0, 13, "Bottle(catchall) keyword argument.", "The 'catchall' setting is now part of the app " "configuration. Fix: `app.config['catchall'] = False`") self.config['catchall'] = False if kwargs.get('autojson') is False: depr(0, 13, "Bottle(autojson) keyword argument.", "The 'autojson' setting is now part of the app " "configuration. Fix: `app.config['json.enable'] = False`") self.config['json.disable'] = True self._mounts = [] #: A :class:`ResourceManager` for application files self.resources = ResourceManager() self.routes = [] # List of installed :class:`Route` instances. self.router = Router() # Maps requests to :class:`Route` instances. self.error_handler = {} # Core plugins self.plugins = [] # List of installed plugins. self.install(JSONPlugin()) self.install(TemplatePlugin()) #: If true, most exceptions are caught and returned as :exc:`HTTPError` catchall = DictProperty('config', 'catchall') __hook_names = 'before_request', 'after_request', 'app_reset', 'config' __hook_reversed = {'after_request'} @cached_property def _hooks(self): return dict((name, []) for name in self.__hook_names) def add_hook(self, name, func): """ Attach a callback to a hook. Three hooks are currently implemented: before_request Executed once before each request. The request context is available, but no routing has happened yet. after_request Executed once after each request regardless of its outcome. app_reset Called whenever :meth:`Bottle.reset` is called. """ if name in self.__hook_reversed: self._hooks[name].insert(0, func) else: self._hooks[name].append(func) def remove_hook(self, name, func): """ Remove a callback from a hook. """ if name in self._hooks and func in self._hooks[name]: self._hooks[name].remove(func) return True def trigger_hook(self, __name, *args, **kwargs): """ Trigger a hook and return a list of results. """ return [hook(*args, **kwargs) for hook in self._hooks[__name][:]] def hook(self, name): """ Return a decorator that attaches a callback to a hook. See :meth:`add_hook` for details.""" def decorator(func): self.add_hook(name, func) return func return decorator def _mount_wsgi(self, prefix, app, **options): segments = [p for p in prefix.split('/') if p] if not segments: raise ValueError('WSGI applications cannot be mounted to "/".') path_depth = len(segments) def mountpoint_wrapper(): try: request.path_shift(path_depth) rs = HTTPResponse([]) def start_response(status, headerlist, exc_info=None): if exc_info: _raise(*exc_info) if py3k: # Errors here mean that the mounted WSGI app did not # follow PEP-3333 (which requires latin1) or used a # pre-encoding other than utf8 :/ status = status.encode('latin1').decode('utf8') headerlist = [(k, v.encode('latin1').decode('utf8')) for (k, v) in headerlist] rs.status = status for name, value in headerlist: rs.add_header(name, value) return rs.body.append body = app(request.environ, start_response) rs.body = itertools.chain(rs.body, body) if rs.body else body return rs finally: request.path_shift(-path_depth) options.setdefault('skip', True) options.setdefault('method', 'PROXY') options.setdefault('mountpoint', {'prefix': prefix, 'target': app}) options['callback'] = mountpoint_wrapper self.route('/%s/<:re:.*>' % '/'.join(segments), **options) if not prefix.endswith('/'): self.route('/' + '/'.join(segments), **options) def _mount_app(self, prefix, app, **options): if app in self._mounts or '_mount.app' in app.config: depr(0, 13, "Application mounted multiple times. Falling back to WSGI mount.", "Clone application before mounting to a different location.") return self._mount_wsgi(prefix, app, **options) if options: depr(0, 13, "Unsupported mount options. Falling back to WSGI mount.", "Do not specify any route options when mounting bottle application.") return self._mount_wsgi(prefix, app, **options) if not prefix.endswith("/"): depr(0, 13, "Prefix must end in '/'. Falling back to WSGI mount.", "Consider adding an explicit redirect from '/prefix' to '/prefix/' in the parent application.") return self._mount_wsgi(prefix, app, **options) self._mounts.append(app) app.config['_mount.prefix'] = prefix app.config['_mount.app'] = self for route in app.routes: route.rule = prefix + route.rule.lstrip('/') self.add_route(route) def mount(self, prefix, app, **options): """ Mount an application (:class:`Bottle` or plain WSGI) to a specific URL prefix. Example:: parent_app.mount('/prefix/', child_app) :param prefix: path prefix or `mount-point`. :param app: an instance of :class:`Bottle` or a WSGI application. Plugins from the parent application are not applied to the routes of the mounted child application. If you need plugins in the child application, install them separately. While it is possible to use path wildcards within the prefix path (:class:`Bottle` childs only), it is highly discouraged. The prefix path must end with a slash. If you want to access the root of the child application via `/prefix` in addition to `/prefix/`, consider adding a route with a 307 redirect to the parent application. """ if not prefix.startswith('/'): raise ValueError("Prefix must start with '/'") if isinstance(app, Bottle): return self._mount_app(prefix, app, **options) else: return self._mount_wsgi(prefix, app, **options) def merge(self, routes): """ Merge the routes of another :class:`Bottle` application or a list of :class:`Route` objects into this application. The routes keep their 'owner', meaning that the :data:`Route.app` attribute is not changed. """ if isinstance(routes, Bottle): routes = routes.routes for route in routes: self.add_route(route) def install(self, plugin): """ Add a plugin to the list of plugins and prepare it for being applied to all routes of this application. A plugin may be a simple decorator or an object that implements the :class:`Plugin` API. """ if hasattr(plugin, 'setup'): plugin.setup(self) if not callable(plugin) and not hasattr(plugin, 'apply'): raise TypeError("Plugins must be callable or implement .apply()") self.plugins.append(plugin) self.reset() return plugin def uninstall(self, plugin): """ Uninstall plugins. Pass an instance to remove a specific plugin, a type object to remove all plugins that match that type, a string to remove all plugins with a matching ``name`` attribute or ``True`` to remove all plugins. Return the list of removed plugins. """ removed, remove = [], plugin for i, plugin in list(enumerate(self.plugins))[::-1]: if remove is True or remove is plugin or remove is type(plugin) \ or getattr(plugin, 'name', True) == remove: removed.append(plugin) del self.plugins[i] if hasattr(plugin, 'close'): plugin.close() if removed: self.reset() return removed def reset(self, route=None): """ Reset all routes (force plugins to be re-applied) and clear all caches. If an ID or route object is given, only that specific route is affected. """ if route is None: routes = self.routes elif isinstance(route, Route): routes = [route] else: routes = [self.routes[route]] for route in routes: route.reset() if DEBUG: for route in routes: route.prepare() self.trigger_hook('app_reset') def close(self): """ Close the application and all installed plugins. """ for plugin in self.plugins: if hasattr(plugin, 'close'): plugin.close() def run(self, **kwargs): """ Calls :func:`run` with the same parameters. """ run(self, **kwargs) def match(self, environ): """ Search for a matching route and return a (:class:`Route`, urlargs) tuple. The second value is a dictionary with parameters extracted from the URL. Raise :exc:`HTTPError` (404/405) on a non-match.""" return self.router.match(environ) def get_url(self, routename, **kargs): """ Return a string that matches a named route """ scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/' location = self.router.build(routename, **kargs).lstrip('/') return urljoin(urljoin('/', scriptname), location) def add_route(self, route): """ Add a route object, but do not change the :data:`Route.app` attribute.""" self.routes.append(route) self.router.add(route.rule, route.method, route, name=route.name) if DEBUG: route.prepare() def route(self, path=None, method='GET', callback=None, name=None, apply=None, skip=None, **config): """ A decorator to bind a function to a request URL. Example:: @app.route('/hello/') def hello(name): return 'Hello %s' % name The ```` part is a wildcard. See :class:`Router` for syntax details. :param path: Request path or a list of paths to listen to. If no path is specified, it is automatically generated from the signature of the function. :param method: HTTP method (`GET`, `POST`, `PUT`, ...) or a list of methods to listen to. (default: `GET`) :param callback: An optional shortcut to avoid the decorator syntax. ``route(..., callback=func)`` equals ``route(...)(func)`` :param name: The name for this route. (default: None) :param apply: A decorator or plugin or a list of plugins. These are applied to the route callback in addition to installed plugins. :param skip: A list of plugins, plugin classes or names. Matching plugins are not installed to this route. ``True`` skips all. Any additional keyword arguments are stored as route-specific configuration and passed to plugins (see :meth:`Plugin.apply`). """ if callable(path): path, callback = None, path plugins = makelist(apply) skiplist = makelist(skip) def decorator(callback): if isinstance(callback, basestring): callback = load(callback) for rule in makelist(path) or yieldroutes(callback): for verb in makelist(method): verb = verb.upper() route = Route(self, rule, verb, callback, name=name, plugins=plugins, skiplist=skiplist, **config) self.add_route(route) return callback return decorator(callback) if callback else decorator def get(self, path=None, method='GET', **options): """ Equals :meth:`route`. """ return self.route(path, method, **options) def post(self, path=None, method='POST', **options): """ Equals :meth:`route` with a ``POST`` method parameter. """ return self.route(path, method, **options) def put(self, path=None, method='PUT', **options): """ Equals :meth:`route` with a ``PUT`` method parameter. """ return self.route(path, method, **options) def delete(self, path=None, method='DELETE', **options): """ Equals :meth:`route` with a ``DELETE`` method parameter. """ return self.route(path, method, **options) def patch(self, path=None, method='PATCH', **options): """ Equals :meth:`route` with a ``PATCH`` method parameter. """ return self.route(path, method, **options) def error(self, code=500, callback=None): """ Register an output handler for a HTTP error code. Can be used as a decorator or called directly :: def error_handler_500(error): return 'error_handler_500' app.error(code=500, callback=error_handler_500) @app.error(404) def error_handler_404(error): return 'error_handler_404' """ def decorator(callback): if isinstance(callback, basestring): callback = load(callback) self.error_handler[int(code)] = callback return callback return decorator(callback) if callback else decorator def default_error_handler(self, res): return tob(template(ERROR_PAGE_TEMPLATE, e=res, template_settings=dict(name='__ERROR_PAGE_TEMPLATE'))) def _handle(self, environ): path = environ['bottle.raw_path'] = environ['PATH_INFO'] if py3k: environ['PATH_INFO'] = path.encode('latin1').decode('utf8', 'ignore') environ['bottle.app'] = self request.bind(environ) response.bind() try: while True: # Remove in 0.14 together with RouteReset out = None try: self.trigger_hook('before_request') route, args = self.router.match(environ) environ['route.handle'] = route environ['bottle.route'] = route environ['route.url_args'] = args out = route.call(**args) break except HTTPResponse as E: out = E break except RouteReset: depr(0, 13, "RouteReset exception deprecated", "Call route.call() after route.reset() and " "return the result.") route.reset() continue finally: if isinstance(out, HTTPResponse): out.apply(response) try: self.trigger_hook('after_request') except HTTPResponse as E: out = E out.apply(response) except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception as E: if not self.catchall: raise stacktrace = format_exc() environ['wsgi.errors'].write(stacktrace) environ['wsgi.errors'].flush() environ['bottle.exc_info'] = sys.exc_info() out = HTTPError(500, "Internal Server Error", E, stacktrace) out.apply(response) return out def _cast(self, out, peek=None): """ Try to convert the parameter into something WSGI compatible and set correct HTTP headers when possible. Support: False, str, unicode, dict, HTTPResponse, HTTPError, file-like, iterable of strings and iterable of unicodes """ # Empty output is done here if not out: if 'Content-Length' not in response: response['Content-Length'] = 0 return [] # Join lists of byte or unicode strings. Mixed lists are NOT supported if isinstance(out, (tuple, list))\ and isinstance(out[0], (bytes, unicode)): out = out[0][0:0].join(out) # b'abc'[0:0] -> b'' # Encode unicode strings if isinstance(out, unicode): out = out.encode(response.charset) # Byte Strings are just returned if isinstance(out, bytes): if 'Content-Length' not in response: response['Content-Length'] = len(out) return [out] # HTTPError or HTTPException (recursive, because they may wrap anything) # TODO: Handle these explicitly in handle() or make them iterable. if isinstance(out, HTTPError): out.apply(response) out = self.error_handler.get(out.status_code, self.default_error_handler)(out) return self._cast(out) if isinstance(out, HTTPResponse): out.apply(response) return self._cast(out.body) # File-like objects. if hasattr(out, 'read'): if 'wsgi.file_wrapper' in request.environ: return request.environ['wsgi.file_wrapper'](out) elif hasattr(out, 'close') or not hasattr(out, '__iter__'): return WSGIFileWrapper(out) # Handle Iterables. We peek into them to detect their inner type. try: iout = iter(out) first = next(iout) while not first: first = next(iout) except StopIteration: return self._cast('') except HTTPResponse as E: first = E except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception as error: if not self.catchall: raise first = HTTPError(500, 'Unhandled exception', error, format_exc()) # These are the inner types allowed in iterator or generator objects. if isinstance(first, HTTPResponse): return self._cast(first) elif isinstance(first, bytes): new_iter = itertools.chain([first], iout) elif isinstance(first, unicode): encoder = lambda x: x.encode(response.charset) new_iter = imap(encoder, itertools.chain([first], iout)) else: msg = 'Unsupported response type: %s' % type(first) return self._cast(HTTPError(500, msg)) if hasattr(out, 'close'): new_iter = _closeiter(new_iter, out.close) return new_iter def wsgi(self, environ, start_response): """ The bottle WSGI-interface. """ try: out = self._cast(self._handle(environ)) # rfc2616 section 4.3 if response._status_code in (100, 101, 204, 304)\ or environ['REQUEST_METHOD'] == 'HEAD': if hasattr(out, 'close'): out.close() out = [] exc_info = environ.get('bottle.exc_info') if exc_info is not None: del environ['bottle.exc_info'] start_response(response._wsgi_status_line(), response.headerlist, exc_info) return out except (KeyboardInterrupt, SystemExit, MemoryError): raise except Exception as E: if not self.catchall: raise err = '

    Critical error while processing request: %s

    ' \ % html_escape(environ.get('PATH_INFO', '/')) if DEBUG: err += '

    Error:

    \n
    \n%s\n
    \n' \ '

    Traceback:

    \n
    \n%s\n
    \n' \ % (html_escape(repr(E)), html_escape(format_exc())) environ['wsgi.errors'].write(err) environ['wsgi.errors'].flush() headers = [('Content-Type', 'text/html; charset=UTF-8')] start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info()) return [tob(err)] def __call__(self, environ, start_response): """ Each instance of :class:'Bottle' is a WSGI application. """ return self.wsgi(environ, start_response) def __enter__(self): """ Use this application as default for all module-level shortcuts. """ default_app.push(self) return self def __exit__(self, exc_type, exc_value, traceback): default_app.pop() def __setattr__(self, name, value): if name in self.__dict__: raise AttributeError("Attribute %s already defined. Plugin conflict?" % name) object.__setattr__(self, name, value) ############################################################################### # HTTP and WSGI Tools ########################################################## ############################################################################### class BaseRequest(object): """ A wrapper for WSGI environment dictionaries that adds a lot of convenient access methods and properties. Most of them are read-only. Adding new attributes to a request actually adds them to the environ dictionary (as 'bottle.request.ext.'). This is the recommended way to store and access request-specific data. """ __slots__ = ('environ', ) #: Maximum size of memory buffer for :attr:`body` in bytes. MEMFILE_MAX = 102400 def __init__(self, environ=None): """ Wrap a WSGI environ dictionary. """ #: The wrapped WSGI environ dictionary. This is the only real attribute. #: All other attributes actually are read-only properties. self.environ = {} if environ is None else environ self.environ['bottle.request'] = self @DictProperty('environ', 'bottle.app', read_only=True) def app(self): """ Bottle application handling this request. """ raise RuntimeError('This request is not connected to an application.') @DictProperty('environ', 'bottle.route', read_only=True) def route(self): """ The bottle :class:`Route` object that matches this request. """ raise RuntimeError('This request is not connected to a route.') @DictProperty('environ', 'route.url_args', read_only=True) def url_args(self): """ The arguments extracted from the URL. """ raise RuntimeError('This request is not connected to a route.') @property def path(self): """ The value of ``PATH_INFO`` with exactly one prefixed slash (to fix broken clients and avoid the "empty path" edge case). """ return '/' + self.environ.get('PATH_INFO', '').lstrip('/') @property def method(self): """ The ``REQUEST_METHOD`` value as an uppercase string. """ return self.environ.get('REQUEST_METHOD', 'GET').upper() @DictProperty('environ', 'bottle.request.headers', read_only=True) def headers(self): """ A :class:`WSGIHeaderDict` that provides case-insensitive access to HTTP request headers. """ return WSGIHeaderDict(self.environ) def get_header(self, name, default=None): """ Return the value of a request header, or a given default value. """ return self.headers.get(name, default) @DictProperty('environ', 'bottle.request.cookies', read_only=True) def cookies(self): """ Cookies parsed into a :class:`FormsDict`. Signed cookies are NOT decoded. Use :meth:`get_cookie` if you expect signed cookies. """ cookies = SimpleCookie(self.environ.get('HTTP_COOKIE', '')).values() return FormsDict((c.key, c.value) for c in cookies) def get_cookie(self, key, default=None, secret=None, digestmod=hashlib.sha256): """ Return the content of a cookie. To read a `Signed Cookie`, the `secret` must match the one used to create the cookie (see :meth:`BaseResponse.set_cookie`). If anything goes wrong (missing cookie or wrong signature), return a default value. """ value = self.cookies.get(key) if secret: # See BaseResponse.set_cookie for details on signed cookies. if value and value.startswith('!') and '?' in value: sig, msg = map(tob, value[1:].split('?', 1)) hash = hmac.new(tob(secret), msg, digestmod=digestmod).digest() if _lscmp(sig, base64.b64encode(hash)): dst = pickle.loads(base64.b64decode(msg)) if dst and dst[0] == key: return dst[1] return default return value or default @DictProperty('environ', 'bottle.request.query', read_only=True) def query(self): """ The :attr:`query_string` parsed into a :class:`FormsDict`. These values are sometimes called "URL arguments" or "GET parameters", but not to be confused with "URL wildcards" as they are provided by the :class:`Router`. """ get = self.environ['bottle.get'] = FormsDict() pairs = _parse_qsl(self.environ.get('QUERY_STRING', '')) for key, value in pairs: get[key] = value return get @DictProperty('environ', 'bottle.request.forms', read_only=True) def forms(self): """ Form values parsed from an `url-encoded` or `multipart/form-data` encoded POST or PUT request body. The result is returned as a :class:`FormsDict`. All keys and values are strings. File uploads are stored separately in :attr:`files`. """ forms = FormsDict() forms.recode_unicode = self.POST.recode_unicode for name, item in self.POST.allitems(): if not isinstance(item, FileUpload): forms[name] = item return forms @DictProperty('environ', 'bottle.request.params', read_only=True) def params(self): """ A :class:`FormsDict` with the combined values of :attr:`query` and :attr:`forms`. File uploads are stored in :attr:`files`. """ params = FormsDict() for key, value in self.query.allitems(): params[key] = value for key, value in self.forms.allitems(): params[key] = value return params @DictProperty('environ', 'bottle.request.files', read_only=True) def files(self): """ File uploads parsed from `multipart/form-data` encoded POST or PUT request body. The values are instances of :class:`FileUpload`. """ files = FormsDict() files.recode_unicode = self.POST.recode_unicode for name, item in self.POST.allitems(): if isinstance(item, FileUpload): files[name] = item return files @DictProperty('environ', 'bottle.request.json', read_only=True) def json(self): """ If the ``Content-Type`` header is ``application/json`` or ``application/json-rpc``, this property holds the parsed content of the request body. Only requests smaller than :attr:`MEMFILE_MAX` are processed to avoid memory exhaustion. Invalid JSON raises a 400 error response. """ ctype = self.environ.get('CONTENT_TYPE', '').lower().split(';')[0] if ctype in ('application/json', 'application/json-rpc'): b = self._get_body_string(self.MEMFILE_MAX) if not b: return None try: return json_loads(b) except (ValueError, TypeError): raise HTTPError(400, 'Invalid JSON') return None def _iter_body(self, read, bufsize): maxread = max(0, self.content_length) while maxread: part = read(min(maxread, bufsize)) if not part: break yield part maxread -= len(part) @staticmethod def _iter_chunked(read, bufsize): err = HTTPError(400, 'Error while parsing chunked transfer body.') rn, sem, bs = tob('\r\n'), tob(';'), tob('') while True: header = read(1) while header[-2:] != rn: c = read(1) header += c if not c: raise err if len(header) > bufsize: raise err size, _, _ = header.partition(sem) try: maxread = int(tonat(size.strip()), 16) except ValueError: raise err if maxread == 0: break buff = bs while maxread > 0: if not buff: buff = read(min(maxread, bufsize)) part, buff = buff[:maxread], buff[maxread:] if not part: raise err yield part maxread -= len(part) if read(2) != rn: raise err @DictProperty('environ', 'bottle.request.body', read_only=True) def _body(self): try: read_func = self.environ['wsgi.input'].read except KeyError: self.environ['wsgi.input'] = BytesIO() return self.environ['wsgi.input'] body_iter = self._iter_chunked if self.chunked else self._iter_body body, body_size, is_temp_file = BytesIO(), 0, False for part in body_iter(read_func, self.MEMFILE_MAX): body.write(part) body_size += len(part) if not is_temp_file and body_size > self.MEMFILE_MAX: body, tmp = NamedTemporaryFile(mode='w+b'), body body.write(tmp.getvalue()) del tmp is_temp_file = True self.environ['wsgi.input'] = body body.seek(0) return body def _get_body_string(self, maxread): """ Read body into a string. Raise HTTPError(413) on requests that are too large. """ if self.content_length > maxread: raise HTTPError(413, 'Request entity too large') data = self.body.read(maxread + 1) if len(data) > maxread: raise HTTPError(413, 'Request entity too large') return data @property def body(self): """ The HTTP request body as a seek-able file-like object. Depending on :attr:`MEMFILE_MAX`, this is either a temporary file or a :class:`io.BytesIO` instance. Accessing this property for the first time reads and replaces the ``wsgi.input`` environ variable. Subsequent accesses just do a `seek(0)` on the file object. """ self._body.seek(0) return self._body @property def chunked(self): """ True if Chunked transfer encoding was. """ return 'chunked' in self.environ.get( 'HTTP_TRANSFER_ENCODING', '').lower() #: An alias for :attr:`query`. GET = query @DictProperty('environ', 'bottle.request.post', read_only=True) def POST(self): """ The values of :attr:`forms` and :attr:`files` combined into a single :class:`FormsDict`. Values are either strings (form values) or instances of :class:`FileUpload`. """ post = FormsDict() content_type = self.environ.get('CONTENT_TYPE', '') content_type, options = _parse_http_header(content_type)[0] # We default to application/x-www-form-urlencoded for everything that # is not multipart and take the fast path (also: 3.1 workaround) if not content_type.startswith('multipart/'): body = tonat(self._get_body_string(self.MEMFILE_MAX), 'latin1') for key, value in _parse_qsl(body): post[key] = value return post post.recode_unicode = False charset = options.get("charset", "utf8") boundary = options.get("boundary") if not boundary: raise MultipartError("Invalid content type header, missing boundary") parser = _MultipartParser(self.body, boundary, self.content_length, mem_limit=self.MEMFILE_MAX, memfile_limit=self.MEMFILE_MAX, charset=charset) for part in parser.parse(): if not part.filename and part.is_buffered(): post[part.name] = tonat(part.value, 'utf8') else: post[part.name] = FileUpload(part.file, part.name, part.filename, part.headerlist) return post @property def url(self): """ The full request URI including hostname and scheme. If your app lives behind a reverse proxy or load balancer and you get confusing results, make sure that the ``X-Forwarded-Host`` header is set correctly. """ return self.urlparts.geturl() @DictProperty('environ', 'bottle.request.urlparts', read_only=True) def urlparts(self): """ The :attr:`url` string as an :class:`urlparse.SplitResult` tuple. The tuple contains (scheme, host, path, query_string and fragment), but the fragment is always empty because it is not visible to the server. """ env = self.environ http = env.get('HTTP_X_FORWARDED_PROTO') \ or env.get('wsgi.url_scheme', 'http') host = env.get('HTTP_X_FORWARDED_HOST') or env.get('HTTP_HOST') if not host: # HTTP 1.1 requires a Host-header. This is for HTTP/1.0 clients. host = env.get('SERVER_NAME', '127.0.0.1') port = env.get('SERVER_PORT') if port and port != ('80' if http == 'http' else '443'): host += ':' + port path = urlquote(self.fullpath) return UrlSplitResult(http, host, path, env.get('QUERY_STRING'), '') @property def fullpath(self): """ Request path including :attr:`script_name` (if present). """ return urljoin(self.script_name, self.path.lstrip('/')) @property def query_string(self): """ The raw :attr:`query` part of the URL (everything in between ``?`` and ``#``) as a string. """ return self.environ.get('QUERY_STRING', '') @property def script_name(self): """ The initial portion of the URL's `path` that was removed by a higher level (server or routing middleware) before the application was called. This script path is returned with leading and tailing slashes. """ script_name = self.environ.get('SCRIPT_NAME', '').strip('/') return '/' + script_name + '/' if script_name else '/' def path_shift(self, shift=1): """ Shift path segments from :attr:`path` to :attr:`script_name` and vice versa. :param shift: The number of path segments to shift. May be negative to change the shift direction. (default: 1) """ script, path = path_shift(self.environ.get('SCRIPT_NAME', '/'), self.path, shift) self['SCRIPT_NAME'], self['PATH_INFO'] = script, path @property def content_length(self): """ The request body length as an integer. The client is responsible to set this header. Otherwise, the real length of the body is unknown and -1 is returned. In this case, :attr:`body` will be empty. """ return int(self.environ.get('CONTENT_LENGTH') or -1) @property def content_type(self): """ The Content-Type header as a lowercase-string (default: empty). """ return self.environ.get('CONTENT_TYPE', '').lower() @property def is_xhr(self): """ True if the request was triggered by a XMLHttpRequest. This only works with JavaScript libraries that support the `X-Requested-With` header (most of the popular libraries do). """ requested_with = self.environ.get('HTTP_X_REQUESTED_WITH', '') return requested_with.lower() == 'xmlhttprequest' @property def is_ajax(self): """ Alias for :attr:`is_xhr`. "Ajax" is not the right term. """ return self.is_xhr @property def auth(self): """ HTTP authentication data as a (user, password) tuple. This implementation currently supports basic (not digest) authentication only. If the authentication happened at a higher level (e.g. in the front web-server or a middleware), the password field is None, but the user field is looked up from the ``REMOTE_USER`` environ variable. On any errors, None is returned. """ basic = parse_auth(self.environ.get('HTTP_AUTHORIZATION', '')) if basic: return basic ruser = self.environ.get('REMOTE_USER') if ruser: return (ruser, None) return None @property def remote_route(self): """ A list of all IPs that were involved in this request, starting with the client IP and followed by zero or more proxies. This does only work if all proxies support the ```X-Forwarded-For`` header. Note that this information can be forged by malicious clients. """ proxy = self.environ.get('HTTP_X_FORWARDED_FOR') if proxy: return [ip.strip() for ip in proxy.split(',')] remote = self.environ.get('REMOTE_ADDR') return [remote] if remote else [] @property def remote_addr(self): """ The client IP as a string. Note that this information can be forged by malicious clients. """ route = self.remote_route return route[0] if route else None def copy(self): """ Return a new :class:`Request` with a shallow :attr:`environ` copy. """ return Request(self.environ.copy()) def get(self, value, default=None): return self.environ.get(value, default) def __getitem__(self, key): return self.environ[key] def __delitem__(self, key): self[key] = "" del (self.environ[key]) def __iter__(self): return iter(self.environ) def __len__(self): return len(self.environ) def keys(self): return self.environ.keys() def __setitem__(self, key, value): """ Change an environ value and clear all caches that depend on it. """ if self.environ.get('bottle.request.readonly'): raise KeyError('The environ dictionary is read-only.') self.environ[key] = value todelete = () if key == 'wsgi.input': todelete = ('body', 'forms', 'files', 'params', 'post', 'json') elif key == 'QUERY_STRING': todelete = ('query', 'params') elif key.startswith('HTTP_'): todelete = ('headers', 'cookies') for key in todelete: self.environ.pop('bottle.request.' + key, None) def __repr__(self): return '<%s: %s %s>' % (self.__class__.__name__, self.method, self.url) def __getattr__(self, name): """ Search in self.environ for additional user defined attributes. """ try: var = self.environ['bottle.request.ext.%s' % name] return var.__get__(self) if hasattr(var, '__get__') else var except KeyError: raise AttributeError('Attribute %r not defined.' % name) def __setattr__(self, name, value): """ Define new attributes that are local to the bound request environment. """ if name == 'environ': return object.__setattr__(self, name, value) key = 'bottle.request.ext.%s' % name if hasattr(self, name): raise AttributeError("Attribute already defined: %s" % name) self.environ[key] = value def __delattr__(self, name): try: del self.environ['bottle.request.ext.%s' % name] except KeyError: raise AttributeError("Attribute not defined: %s" % name) def _hkey(key): if '\n' in key or '\r' in key or '\0' in key: raise ValueError("Header names must not contain control characters: %r" % key) return key.title().replace('_', '-') def _hval(value): value = tonat(value) if '\n' in value or '\r' in value or '\0' in value: raise ValueError("Header value must not contain control characters: %r" % value) return value class HeaderProperty(object): def __init__(self, name, reader=None, writer=None, default=''): self.name, self.default = name, default self.reader, self.writer = reader, writer self.__doc__ = 'Current value of the %r header.' % name.title() def __get__(self, obj, _): if obj is None: return self value = obj.get_header(self.name, self.default) return self.reader(value) if self.reader else value def __set__(self, obj, value): obj[self.name] = self.writer(value) if self.writer else value def __delete__(self, obj): del obj[self.name] class BaseResponse(object): """ Storage class for a response body as well as headers and cookies. This class does support dict-like case-insensitive item-access to headers, but is NOT a dict. Most notably, iterating over a response yields parts of the body and not the headers. """ default_status = 200 default_content_type = 'text/html; charset=UTF-8' # Header denylist for specific response codes # (rfc2616 section 10.2.3 and 10.3.5) bad_headers = { 204: frozenset(('Content-Type', 'Content-Length')), 304: frozenset(('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-Range', 'Content-Type', 'Content-Md5', 'Last-Modified')) } def __init__(self, body='', status=None, headers=None, **more_headers): """ Create a new response object. :param body: The response body as one of the supported types. :param status: Either an HTTP status code (e.g. 200) or a status line including the reason phrase (e.g. '200 OK'). :param headers: A dictionary or a list of name-value pairs. Additional keyword arguments are added to the list of headers. Underscores in the header name are replaced with dashes. """ self._cookies = None self._headers = {} self.body = body self.status = status or self.default_status if headers: if isinstance(headers, dict): headers = headers.items() for name, value in headers: self.add_header(name, value) if more_headers: for name, value in more_headers.items(): self.add_header(name, value) def copy(self, cls=None): """ Returns a copy of self. """ cls = cls or BaseResponse assert issubclass(cls, BaseResponse) copy = cls() copy.status = self.status copy._headers = dict((k, v[:]) for (k, v) in self._headers.items()) if self._cookies: cookies = copy._cookies = SimpleCookie() for k,v in self._cookies.items(): cookies[k] = v.value cookies[k].update(v) # also copy cookie attributes return copy def __iter__(self): return iter(self.body) def close(self): if hasattr(self.body, 'close'): self.body.close() @property def status_line(self): """ The HTTP status line as a string (e.g. ``404 Not Found``).""" return self._status_line @property def status_code(self): """ The HTTP status code as an integer (e.g. 404).""" return self._status_code def _set_status(self, status): if isinstance(status, int): code, status = status, _HTTP_STATUS_LINES.get(status) elif ' ' in status: if '\n' in status or '\r' in status or '\0' in status: raise ValueError('Status line must not include control chars.') status = status.strip() code = int(status.split()[0]) else: raise ValueError('String status line without a reason phrase.') if not 100 <= code <= 999: raise ValueError('Status code out of range.') self._status_code = code self._status_line = str(status or ('%d Unknown' % code)) def _get_status(self): return self._status_line status = property( _get_status, _set_status, None, ''' A writeable property to change the HTTP response status. It accepts either a numeric code (100-999) or a string with a custom reason phrase (e.g. "404 Brain not found"). Both :data:`status_line` and :data:`status_code` are updated accordingly. The return value is always a status string. ''') del _get_status, _set_status @property def headers(self): """ An instance of :class:`HeaderDict`, a case-insensitive dict-like view on the response headers. """ hdict = HeaderDict() hdict.dict = self._headers return hdict def __contains__(self, name): return _hkey(name) in self._headers def __delitem__(self, name): del self._headers[_hkey(name)] def __getitem__(self, name): return self._headers[_hkey(name)][-1] def __setitem__(self, name, value): self._headers[_hkey(name)] = [_hval(value)] def get_header(self, name, default=None): """ Return the value of a previously defined header. If there is no header with that name, return a default value. """ return self._headers.get(_hkey(name), [default])[-1] def set_header(self, name, value): """ Create a new response header, replacing any previously defined headers with the same name. """ self._headers[_hkey(name)] = [_hval(value)] def add_header(self, name, value): """ Add an additional response header, not removing duplicates. """ self._headers.setdefault(_hkey(name), []).append(_hval(value)) def iter_headers(self): """ Yield (header, value) tuples, skipping headers that are not allowed with the current response status code. """ return self.headerlist def _wsgi_status_line(self): """ WSGI conform status line (latin1-encodeable) """ if py3k: return self._status_line.encode('utf8').decode('latin1') return self._status_line @property def headerlist(self): """ WSGI conform list of (header, value) tuples. """ out = [] headers = list(self._headers.items()) if 'Content-Type' not in self._headers: headers.append(('Content-Type', [self.default_content_type])) if self._status_code in self.bad_headers: bad_headers = self.bad_headers[self._status_code] headers = [h for h in headers if h[0] not in bad_headers] out += [(name, val) for (name, vals) in headers for val in vals] if self._cookies: for c in self._cookies.values(): out.append(('Set-Cookie', _hval(c.OutputString()))) if py3k: out = [(k, v.encode('utf8').decode('latin1')) for (k, v) in out] return out content_type = HeaderProperty('Content-Type') content_length = HeaderProperty('Content-Length', reader=int, default=-1) expires = HeaderProperty( 'Expires', reader=lambda x: datetime.fromtimestamp(parse_date(x), UTC), writer=lambda x: http_date(x)) @property def charset(self, default='UTF-8'): """ Return the charset specified in the content-type header (default: utf8). """ if 'charset=' in self.content_type: return self.content_type.split('charset=')[-1].split(';')[0].strip() return default def set_cookie(self, name, value, secret=None, digestmod=hashlib.sha256, **options): """ Create a new cookie or replace an old one. If the `secret` parameter is set, create a `Signed Cookie` (described below). :param name: the name of the cookie. :param value: the value of the cookie. :param secret: a signature key required for signed cookies. Additionally, this method accepts all RFC 2109 attributes that are supported by :class:`cookie.Morsel`, including: :param maxage: maximum age in seconds. (default: None) :param expires: a datetime object or UNIX timestamp. (default: None) :param domain: the domain that is allowed to read the cookie. (default: current domain) :param path: limits the cookie to a given path (default: current path) :param secure: limit the cookie to HTTPS connections (default: off). :param httponly: prevents client-side javascript to read this cookie (default: off, requires Python 2.6 or newer). :param samesite: Control or disable third-party use for this cookie. Possible values: `lax`, `strict` or `none` (default). If neither `expires` nor `maxage` is set (default), the cookie will expire at the end of the browser session (as soon as the browser window is closed). Signed cookies may store any pickle-able object and are cryptographically signed to prevent manipulation. Keep in mind that cookies are limited to 4kb in most browsers. Warning: Pickle is a potentially dangerous format. If an attacker gains access to the secret key, he could forge cookies that execute code on server side if unpickled. Using pickle is discouraged and support for it will be removed in later versions of bottle. Warning: Signed cookies are not encrypted (the client can still see the content) and not copy-protected (the client can restore an old cookie). The main intention is to make pickling and unpickling save, not to store secret information at client side. """ if not self._cookies: self._cookies = SimpleCookie() # Monkey-patch Cookie lib to support 'SameSite' parameter # https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1 if py < (3, 8, 0): Morsel._reserved.setdefault('samesite', 'SameSite') if secret: if not isinstance(value, basestring): depr(0, 13, "Pickling of arbitrary objects into cookies is " "deprecated.", "Only store strings in cookies. " "JSON strings are fine, too.") encoded = base64.b64encode(pickle.dumps([name, value], -1)) sig = base64.b64encode(hmac.new(tob(secret), encoded, digestmod=digestmod).digest()) value = touni(tob('!') + sig + tob('?') + encoded) elif not isinstance(value, basestring): raise TypeError('Secret key required for non-string cookies.') # Cookie size plus options must not exceed 4kb. if len(name) + len(value) > 3800: raise ValueError('Content does not fit into a cookie.') self._cookies[name] = value for key, value in options.items(): if key in ('max_age', 'maxage'): # 'maxage' variant added in 0.13 key = 'max-age' if isinstance(value, timedelta): value = value.seconds + value.days * 24 * 3600 if key == 'expires': value = http_date(value) if key in ('same_site', 'samesite'): # 'samesite' variant added in 0.13 key, value = 'samesite', (value or "none").lower() if value not in ('lax', 'strict', 'none'): raise CookieError("Invalid value for SameSite") if key in ('secure', 'httponly') and not value: continue self._cookies[name][key] = value def delete_cookie(self, key, **kwargs): """ Delete a cookie. Be sure to use the same `domain` and `path` settings as used to create the cookie. """ kwargs['max_age'] = -1 kwargs['expires'] = 0 self.set_cookie(key, '', **kwargs) def __repr__(self): out = '' for name, value in self.headerlist: out += '%s: %s\n' % (name.title(), value.strip()) return out def _local_property(): ls = threading.local() def fget(_): try: return ls.var except AttributeError: raise RuntimeError("Request context not initialized.") def fset(_, value): ls.var = value def fdel(_): del ls.var return property(fget, fset, fdel, 'Thread-local property') class LocalRequest(BaseRequest): """ A thread-local subclass of :class:`BaseRequest` with a different set of attributes for each thread. There is usually only one global instance of this class (:data:`request`). If accessed during a request/response cycle, this instance always refers to the *current* request (even on a multithreaded server). """ bind = BaseRequest.__init__ environ = _local_property() class LocalResponse(BaseResponse): """ A thread-local subclass of :class:`BaseResponse` with a different set of attributes for each thread. There is usually only one global instance of this class (:data:`response`). Its attributes are used to build the HTTP response at the end of the request/response cycle. """ bind = BaseResponse.__init__ _status_line = _local_property() _status_code = _local_property() _cookies = _local_property() _headers = _local_property() body = _local_property() Request = BaseRequest Response = BaseResponse class HTTPResponse(Response, BottleException): """ A subclass of :class:`Response` that can be raised or returned from request handlers to short-curcuit request processing and override changes made to the global :data:`request` object. This bypasses error handlers, even if the status code indicates an error. Return or raise :class:`HTTPError` to trigger error handlers. """ def __init__(self, body='', status=None, headers=None, **more_headers): super(HTTPResponse, self).__init__(body, status, headers, **more_headers) def apply(self, other): """ Copy the state of this response to a different :class:`Response` object. """ other._status_code = self._status_code other._status_line = self._status_line other._headers = self._headers other._cookies = self._cookies other.body = self.body class HTTPError(HTTPResponse): """ A subclass of :class:`HTTPResponse` that triggers error handlers. """ default_status = 500 def __init__(self, status=None, body=None, exception=None, traceback=None, **more_headers): self.exception = exception self.traceback = traceback super(HTTPError, self).__init__(body, status, **more_headers) ############################################################################### # Plugins ###################################################################### ############################################################################### class PluginError(BottleException): pass class JSONPlugin(object): name = 'json' api = 2 def __init__(self, json_dumps=json_dumps): self.json_dumps = json_dumps def setup(self, app): app.config._define('json.enable', default=True, validate=bool, help="Enable or disable automatic dict->json filter.") app.config._define('json.ascii', default=False, validate=bool, help="Use only 7-bit ASCII characters in output.") app.config._define('json.indent', default=True, validate=bool, help="Add whitespace to make json more readable.") app.config._define('json.dump_func', default=None, help="If defined, use this function to transform" " dict into json. The other options no longer" " apply.") def apply(self, callback, route): dumps = self.json_dumps if not self.json_dumps: return callback @functools.wraps(callback) def wrapper(*a, **ka): try: rv = callback(*a, **ka) except HTTPResponse as resp: rv = resp if isinstance(rv, dict): #Attempt to serialize, raises exception on failure json_response = dumps(rv) #Set content type only if serialization successful response.content_type = 'application/json' return json_response elif isinstance(rv, HTTPResponse) and isinstance(rv.body, dict): rv.body = dumps(rv.body) rv.content_type = 'application/json' return rv return wrapper class TemplatePlugin(object): """ This plugin applies the :func:`view` decorator to all routes with a `template` config parameter. If the parameter is a tuple, the second element must be a dict with additional options (e.g. `template_engine`) or default variables for the template. """ name = 'template' api = 2 def setup(self, app): app.tpl = self def apply(self, callback, route): conf = route.config.get('template') if isinstance(conf, (tuple, list)) and len(conf) == 2: return view(conf[0], **conf[1])(callback) elif isinstance(conf, str): return view(conf)(callback) else: return callback #: Not a plugin, but part of the plugin API. TODO: Find a better place. class _ImportRedirect(object): def __init__(self, name, impmask): """ Create a virtual package that redirects imports (see PEP 302). """ self.name = name self.impmask = impmask self.module = sys.modules.setdefault(name, new_module(name)) self.module.__dict__.update({ '__file__': __file__, '__path__': [], '__all__': [], '__loader__': self }) sys.meta_path.append(self) def find_spec(self, fullname, path, target=None): if '.' not in fullname: return if fullname.rsplit('.', 1)[0] != self.name: return from importlib.util import spec_from_loader return spec_from_loader(fullname, self) def find_module(self, fullname, path=None): if '.' not in fullname: return if fullname.rsplit('.', 1)[0] != self.name: return return self def create_module(self, spec): return self.load_module(spec.name) def exec_module(self, module): pass # This probably breaks importlib.reload() :/ def load_module(self, fullname): if fullname in sys.modules: return sys.modules[fullname] modname = fullname.rsplit('.', 1)[1] realname = self.impmask % modname __import__(realname) module = sys.modules[fullname] = sys.modules[realname] setattr(self.module, modname, module) module.__loader__ = self return module ############################################################################### # Common Utilities ############################################################# ############################################################################### class MultiDict(DictMixin): """ This dict stores multiple values per key, but behaves exactly like a normal dict in that it returns only the newest value for any given key. There are special methods available to access the full list of values. """ def __init__(self, *a, **k): self.dict = dict((k, [v]) for (k, v) in dict(*a, **k).items()) def __len__(self): return len(self.dict) def __iter__(self): return iter(self.dict) def __contains__(self, key): return key in self.dict def __delitem__(self, key): del self.dict[key] def __getitem__(self, key): return self.dict[key][-1] def __setitem__(self, key, value): self.append(key, value) def keys(self): return self.dict.keys() if py3k: def values(self): return (v[-1] for v in self.dict.values()) def items(self): return ((k, v[-1]) for k, v in self.dict.items()) def allitems(self): return ((k, v) for k, vl in self.dict.items() for v in vl) iterkeys = keys itervalues = values iteritems = items iterallitems = allitems else: def values(self): return [v[-1] for v in self.dict.values()] def items(self): return [(k, v[-1]) for k, v in self.dict.items()] def iterkeys(self): return self.dict.iterkeys() def itervalues(self): return (v[-1] for v in self.dict.itervalues()) def iteritems(self): return ((k, v[-1]) for k, v in self.dict.iteritems()) def iterallitems(self): return ((k, v) for k, vl in self.dict.iteritems() for v in vl) def allitems(self): return [(k, v) for k, vl in self.dict.iteritems() for v in vl] def get(self, key, default=None, index=-1, type=None): """ Return the most recent value for a key. :param default: The default value to be returned if the key is not present or the type conversion fails. :param index: An index for the list of available values. :param type: If defined, this callable is used to cast the value into a specific type. Exception are suppressed and result in the default value to be returned. """ try: val = self.dict[key][index] return type(val) if type else val except Exception: pass return default def append(self, key, value): """ Add a new value to the list of values for this key. """ self.dict.setdefault(key, []).append(value) def replace(self, key, value): """ Replace the list of values with a single value. """ self.dict[key] = [value] def getall(self, key): """ Return a (possibly empty) list of values for a key. """ return self.dict.get(key) or [] #: Aliases for WTForms to mimic other multi-dict APIs (Django) getone = get getlist = getall class FormsDict(MultiDict): """ This :class:`MultiDict` subclass is used to store request form data. Additionally to the normal dict-like item access methods (which return unmodified data as native strings), this container also supports attribute-like access to its values. Attributes are automatically de- or recoded to match :attr:`input_encoding` (default: 'utf8'). Missing attributes default to an empty string. """ #: Encoding used for attribute values. input_encoding = 'utf8' #: If true (default), unicode strings are first encoded with `latin1` #: and then decoded to match :attr:`input_encoding`. recode_unicode = True def _fix(self, s, encoding=None): if isinstance(s, unicode) and self.recode_unicode: # Python 3 WSGI return s.encode('latin1').decode(encoding or self.input_encoding) elif isinstance(s, bytes): # Python 2 WSGI return s.decode(encoding or self.input_encoding) else: return s def decode(self, encoding=None): """ Returns a copy with all keys and values de- or recoded to match :attr:`input_encoding`. Some libraries (e.g. WTForms) want a unicode dictionary. """ copy = FormsDict() enc = copy.input_encoding = encoding or self.input_encoding copy.recode_unicode = False for key, value in self.allitems(): copy.append(self._fix(key, enc), self._fix(value, enc)) return copy def getunicode(self, name, default=None, encoding=None): """ Return the value as a unicode string, or the default. """ try: return self._fix(self[name], encoding) except (UnicodeError, KeyError): return default def __getattr__(self, name, default=unicode()): # Without this guard, pickle generates a cryptic TypeError: if name.startswith('__') and name.endswith('__'): return super(FormsDict, self).__getattr__(name) return self.getunicode(name, default=default) class HeaderDict(MultiDict): """ A case-insensitive version of :class:`MultiDict` that defaults to replace the old value instead of appending it. """ def __init__(self, *a, **ka): self.dict = {} if a or ka: self.update(*a, **ka) def __contains__(self, key): return _hkey(key) in self.dict def __delitem__(self, key): del self.dict[_hkey(key)] def __getitem__(self, key): return self.dict[_hkey(key)][-1] def __setitem__(self, key, value): self.dict[_hkey(key)] = [_hval(value)] def append(self, key, value): self.dict.setdefault(_hkey(key), []).append(_hval(value)) def replace(self, key, value): self.dict[_hkey(key)] = [_hval(value)] def getall(self, key): return self.dict.get(_hkey(key)) or [] def get(self, key, default=None, index=-1): return MultiDict.get(self, _hkey(key), default, index) def filter(self, names): for name in (_hkey(n) for n in names): if name in self.dict: del self.dict[name] class WSGIHeaderDict(DictMixin): """ This dict-like class wraps a WSGI environ dict and provides convenient access to HTTP_* fields. Keys and values are native strings (2.x bytes or 3.x unicode) and keys are case-insensitive. If the WSGI environment contains non-native string values, these are de- or encoded using a lossless 'latin1' character set. The API will remain stable even on changes to the relevant PEPs. Currently PEP 333, 444 and 3333 are supported. (PEP 444 is the only one that uses non-native strings.) """ #: List of keys that do not have a ``HTTP_`` prefix. cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH') def __init__(self, environ): self.environ = environ def _ekey(self, key): """ Translate header field name to CGI/WSGI environ key. """ key = key.replace('-', '_').upper() if key in self.cgikeys: return key return 'HTTP_' + key def raw(self, key, default=None): """ Return the header value as is (may be bytes or unicode). """ return self.environ.get(self._ekey(key), default) def __getitem__(self, key): val = self.environ[self._ekey(key)] if py3k: if isinstance(val, unicode): val = val.encode('latin1').decode('utf8') else: val = val.decode('utf8') return val def __setitem__(self, key, value): raise TypeError("%s is read-only." % self.__class__) def __delitem__(self, key): raise TypeError("%s is read-only." % self.__class__) def __iter__(self): for key in self.environ: if key[:5] == 'HTTP_': yield _hkey(key[5:]) elif key in self.cgikeys: yield _hkey(key) def keys(self): return [x for x in self] def __len__(self): return len(self.keys()) def __contains__(self, key): return self._ekey(key) in self.environ _UNSET = object() class ConfigDict(dict): """ A dict-like configuration storage with additional support for namespaces, validators, meta-data and overlays. This dict-like class is heavily optimized for read access. Read-only methods and item access should be as fast as a native dict. """ __slots__ = ('_meta', '_change_listener', '_overlays', '_virtual_keys', '_source', '__weakref__') def __init__(self): self._meta = {} self._change_listener = [] #: Weak references of overlays that need to be kept in sync. self._overlays = [] #: Config that is the source for this overlay. self._source = None #: Keys of values copied from the source (values we do not own) self._virtual_keys = set() def load_module(self, name, squash=True): """Load values from a Python module. Import a python module by name and add all upper-case module-level variables to this config dict. :param name: Module name to import and load. :param squash: If true (default), nested dicts are assumed to represent namespaces and flattened (see :meth:`load_dict`). """ config_obj = load(name) obj = {key: getattr(config_obj, key) for key in dir(config_obj) if key.isupper()} if squash: self.load_dict(obj) else: self.update(obj) return self def load_config(self, filename, **options): """ Load values from ``*.ini`` style config files using configparser. INI style sections (e.g. ``[section]``) are used as namespace for all keys within that section. Both section and key names may contain dots as namespace separators and are converted to lower-case. The special sections ``[bottle]`` and ``[ROOT]`` refer to the root namespace and the ``[DEFAULT]`` section defines default values for all other sections. :param filename: The path of a config file, or a list of paths. :param options: All keyword parameters are passed to the underlying :class:`python:configparser.ConfigParser` constructor call. """ options.setdefault('allow_no_value', True) if py3k: options.setdefault('interpolation', configparser.ExtendedInterpolation()) conf = configparser.ConfigParser(**options) conf.read(filename) for section in conf.sections(): for key in conf.options(section): value = conf.get(section, key) if section not in ('bottle', 'ROOT'): key = section + '.' + key self[key.lower()] = value return self def load_dict(self, source, namespace=''): """ Load values from a dictionary structure. Nesting can be used to represent namespaces. >>> c = ConfigDict() >>> c.load_dict({'some': {'namespace': {'key': 'value'} } }) {'some.namespace.key': 'value'} """ for key, value in source.items(): if isinstance(key, basestring): nskey = (namespace + '.' + key).strip('.') if isinstance(value, dict): self.load_dict(value, namespace=nskey) else: self[nskey] = value else: raise TypeError('Key has type %r (not a string)' % type(key)) return self def update(self, *a, **ka): """ If the first parameter is a string, all keys are prefixed with this namespace. Apart from that it works just as the usual dict.update(). >>> c = ConfigDict() >>> c.update('some.namespace', key='value') """ prefix = '' if a and isinstance(a[0], basestring): prefix = a[0].strip('.') + '.' a = a[1:] for key, value in dict(*a, **ka).items(): self[prefix + key] = value def setdefault(self, key, value=None): if key not in self: self[key] = value return self[key] def __setitem__(self, key, value): if not isinstance(key, basestring): raise TypeError('Key has type %r (not a string)' % type(key)) self._virtual_keys.discard(key) value = self.meta_get(key, 'filter', lambda x: x)(value) if key in self and self[key] is value: return self._on_change(key, value) dict.__setitem__(self, key, value) for overlay in self._iter_overlays(): overlay._set_virtual(key, value) def __delitem__(self, key): if key not in self: raise KeyError(key) if key in self._virtual_keys: raise KeyError("Virtual keys cannot be deleted: %s" % key) if self._source and key in self._source: # Not virtual, but present in source -> Restore virtual value dict.__delitem__(self, key) self._set_virtual(key, self._source[key]) else: # not virtual, not present in source. This is OUR value self._on_change(key, None) dict.__delitem__(self, key) for overlay in self._iter_overlays(): overlay._delete_virtual(key) def _set_virtual(self, key, value): """ Recursively set or update virtual keys. """ if key in self and key not in self._virtual_keys: return # Do nothing for non-virtual keys. self._virtual_keys.add(key) if key in self and self[key] is not value: self._on_change(key, value) dict.__setitem__(self, key, value) for overlay in self._iter_overlays(): overlay._set_virtual(key, value) def _delete_virtual(self, key): """ Recursively delete virtual entry. """ if key not in self._virtual_keys: return # Do nothing for non-virtual keys. if key in self: self._on_change(key, None) dict.__delitem__(self, key) self._virtual_keys.discard(key) for overlay in self._iter_overlays(): overlay._delete_virtual(key) def _on_change(self, key, value): for cb in self._change_listener: if cb(self, key, value): return True def _add_change_listener(self, func): self._change_listener.append(func) return func def meta_get(self, key, metafield, default=None): """ Return the value of a meta field for a key. """ return self._meta.get(key, {}).get(metafield, default) def meta_set(self, key, metafield, value): """ Set the meta field for a key to a new value. Meta-fields are shared between all members of an overlay tree. """ self._meta.setdefault(key, {})[metafield] = value def meta_list(self, key): """ Return an iterable of meta field names defined for a key. """ return self._meta.get(key, {}).keys() def _define(self, key, default=_UNSET, help=_UNSET, validate=_UNSET): """ (Unstable) Shortcut for plugins to define own config parameters. """ if default is not _UNSET: self.setdefault(key, default) if help is not _UNSET: self.meta_set(key, 'help', help) if validate is not _UNSET: self.meta_set(key, 'validate', validate) def _iter_overlays(self): for ref in self._overlays: overlay = ref() if overlay is not None: yield overlay def _make_overlay(self): """ (Unstable) Create a new overlay that acts like a chained map: Values missing in the overlay are copied from the source map. Both maps share the same meta entries. Entries that were copied from the source are called 'virtual'. You can not delete virtual keys, but overwrite them, which turns them into non-virtual entries. Setting keys on an overlay never affects its source, but may affect any number of child overlays. Other than collections.ChainMap or most other implementations, this approach does not resolve missing keys on demand, but instead actively copies all values from the source to the overlay and keeps track of virtual and non-virtual keys internally. This removes any lookup-overhead. Read-access is as fast as a build-in dict for both virtual and non-virtual keys. Changes are propagated recursively and depth-first. A failing on-change handler in an overlay stops the propagation of virtual values and may result in an partly updated tree. Take extra care here and make sure that on-change handlers never fail. Used by Route.config """ # Cleanup dead references self._overlays[:] = [ref for ref in self._overlays if ref() is not None] overlay = ConfigDict() overlay._meta = self._meta overlay._source = self self._overlays.append(weakref.ref(overlay)) for key in self: overlay._set_virtual(key, self[key]) return overlay class AppStack(list): """ A stack-like list. Calling it returns the head of the stack. """ def __call__(self): """ Return the current default application. """ return self.default def push(self, value=None): """ Add a new :class:`Bottle` instance to the stack """ if not isinstance(value, Bottle): value = Bottle() self.append(value) return value new_app = push @property def default(self): try: return self[-1] except IndexError: return self.push() class WSGIFileWrapper(object): def __init__(self, fp, buffer_size=1024 * 64): self.fp, self.buffer_size = fp, buffer_size for attr in 'fileno', 'close', 'read', 'readlines', 'tell', 'seek': if hasattr(fp, attr): setattr(self, attr, getattr(fp, attr)) def __iter__(self): buff, read = self.buffer_size, self.read part = read(buff) while part: yield part part = read(buff) class _closeiter(object): """ This only exists to be able to attach a .close method to iterators that do not support attribute assignment (most of itertools). """ def __init__(self, iterator, close=None): self.iterator = iterator self.close_callbacks = makelist(close) def __iter__(self): return iter(self.iterator) def close(self): for func in self.close_callbacks: func() class ResourceManager(object): """ This class manages a list of search paths and helps to find and open application-bound resources (files). :param base: default value for :meth:`add_path` calls. :param opener: callable used to open resources. :param cachemode: controls which lookups are cached. One of 'all', 'found' or 'none'. """ def __init__(self, base='./', opener=open, cachemode='all'): self.opener = opener self.base = base self.cachemode = cachemode #: A list of search paths. See :meth:`add_path` for details. self.path = [] #: A cache for resolved paths. ``res.cache.clear()`` clears the cache. self.cache = {} def add_path(self, path, base=None, index=None, create=False): """ Add a new path to the list of search paths. Return False if the path does not exist. :param path: The new search path. Relative paths are turned into an absolute and normalized form. If the path looks like a file (not ending in `/`), the filename is stripped off. :param base: Path used to absolutize relative search paths. Defaults to :attr:`base` which defaults to ``os.getcwd()``. :param index: Position within the list of search paths. Defaults to last index (appends to the list). The `base` parameter makes it easy to reference files installed along with a python module or package:: res.add_path('./resources/', __file__) """ base = os.path.abspath(os.path.dirname(base or self.base)) path = os.path.abspath(os.path.join(base, os.path.dirname(path))) path += os.sep if path in self.path: self.path.remove(path) if create and not os.path.isdir(path): os.makedirs(path) if index is None: self.path.append(path) else: self.path.insert(index, path) self.cache.clear() return os.path.exists(path) def __iter__(self): """ Iterate over all existing files in all registered paths. """ search = self.path[:] while search: path = search.pop() if not os.path.isdir(path): continue for name in os.listdir(path): full = os.path.join(path, name) if os.path.isdir(full): search.append(full) else: yield full def lookup(self, name): """ Search for a resource and return an absolute file path, or `None`. The :attr:`path` list is searched in order. The first match is returned. Symlinks are followed. The result is cached to speed up future lookups. """ if name not in self.cache or DEBUG: for path in self.path: fpath = os.path.join(path, name) if os.path.isfile(fpath): if self.cachemode in ('all', 'found'): self.cache[name] = fpath return fpath if self.cachemode == 'all': self.cache[name] = None return self.cache[name] def open(self, name, mode='r', *args, **kwargs): """ Find a resource and return a file object, or raise IOError. """ fname = self.lookup(name) if not fname: raise IOError("Resource %r not found." % name) return self.opener(fname, mode=mode, *args, **kwargs) class FileUpload(object): def __init__(self, fileobj, name, filename, headers=None): """ Wrapper for a single file uploaded via ``multipart/form-data``. """ #: Open file(-like) object (BytesIO buffer or temporary file) self.file = fileobj #: Name of the upload form field self.name = name #: Raw filename as sent by the client (may contain unsafe characters) self.raw_filename = filename #: A :class:`HeaderDict` with additional headers (e.g. content-type) self.headers = HeaderDict(headers) if headers else HeaderDict() content_type = HeaderProperty('Content-Type') content_length = HeaderProperty('Content-Length', reader=int, default=-1) def get_header(self, name, default=None): """ Return the value of a header within the multipart part. """ return self.headers.get(name, default) @cached_property def filename(self): """ Name of the file on the client file system, but normalized to ensure file system compatibility. An empty filename is returned as 'empty'. Only ASCII letters, digits, dashes, underscores and dots are allowed in the final filename. Accents are removed, if possible. Whitespace is replaced by a single dash. Leading or tailing dots or dashes are removed. The filename is limited to 255 characters. """ fname = self.raw_filename if not isinstance(fname, unicode): fname = fname.decode('utf8', 'ignore') fname = normalize('NFKD', fname) fname = fname.encode('ASCII', 'ignore').decode('ASCII') fname = os.path.basename(fname.replace('\\', os.path.sep)) fname = re.sub(r'[^a-zA-Z0-9-_.\s]', '', fname).strip() fname = re.sub(r'[-\s]+', '-', fname).strip('.-') return fname[:255] or 'empty' def _copy_file(self, fp, chunk_size=2 ** 16): read, write, offset = self.file.read, fp.write, self.file.tell() while 1: buf = read(chunk_size) if not buf: break write(buf) self.file.seek(offset) def save(self, destination, overwrite=False, chunk_size=2 ** 16): """ Save file to disk or copy its content to an open file(-like) object. If *destination* is a directory, :attr:`filename` is added to the path. Existing files are not overwritten by default (IOError). :param destination: File path, directory or file(-like) object. :param overwrite: If True, replace existing files. (default: False) :param chunk_size: Bytes to read at a time. (default: 64kb) """ if isinstance(destination, basestring): # Except file-likes here if os.path.isdir(destination): destination = os.path.join(destination, self.filename) if not overwrite and os.path.exists(destination): raise IOError('File exists.') with open(destination, 'wb') as fp: self._copy_file(fp, chunk_size) else: self._copy_file(destination, chunk_size) ############################################################################### # Application Helper ########################################################### ############################################################################### def abort(code=500, text='Unknown Error.'): """ Aborts execution and causes a HTTP error. """ raise HTTPError(code, text) def redirect(url, code=None): """ Aborts execution and causes a 303 or 302 redirect, depending on the HTTP protocol version. """ if not code: code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302 res = response.copy(cls=HTTPResponse) res.status = code res.body = "" res.set_header('Location', urljoin(request.url, url)) raise res def _rangeiter(fp, offset, limit, bufsize=1024 * 1024): """ Yield chunks from a range in a file. """ fp.seek(offset) while limit > 0: part = fp.read(min(limit, bufsize)) if not part: break limit -= len(part) yield part def static_file(filename, root, mimetype=True, download=False, charset='UTF-8', etag=None, headers=None): """ Open a file in a safe way and return an instance of :exc:`HTTPResponse` that can be sent back to the client. :param filename: Name or path of the file to send, relative to ``root``. :param root: Root path for file lookups. Should be an absolute directory path. :param mimetype: Provide the content-type header (default: guess from file extension) :param download: If True, ask the browser to open a `Save as...` dialog instead of opening the file with the associated program. You can specify a custom filename as a string. If not specified, the original filename is used (default: False). :param charset: The charset for files with a ``text/*`` mime-type. (default: UTF-8) :param etag: Provide a pre-computed ETag header. If set to ``False``, ETag handling is disabled. (default: auto-generate ETag header) :param headers: Additional headers dict to add to the response. While checking user input is always a good idea, this function provides additional protection against malicious ``filename`` parameters from breaking out of the ``root`` directory and leaking sensitive information to an attacker. Read-protected files or files outside of the ``root`` directory are answered with ``403 Access Denied``. Missing files result in a ``404 Not Found`` response. Conditional requests (``If-Modified-Since``, ``If-None-Match``) are answered with ``304 Not Modified`` whenever possible. ``HEAD`` and ``Range`` requests (used by download managers to check or continue partial downloads) are also handled automatically. """ root = os.path.join(os.path.abspath(root), '') filename = os.path.abspath(os.path.join(root, filename.strip('/\\'))) headers = headers.copy() if headers else {} getenv = request.environ.get if not filename.startswith(root): return HTTPError(403, "Access denied.") if not os.path.exists(filename) or not os.path.isfile(filename): return HTTPError(404, "File does not exist.") if not os.access(filename, os.R_OK): return HTTPError(403, "You do not have permission to access this file.") if mimetype is True: name = download if isinstance(download, str) else filename mimetype, encoding = mimetypes.guess_type(name) if encoding == 'gzip': mimetype = 'application/gzip' elif encoding: # e.g. bzip2 -> application/x-bzip2 mimetype = 'application/x-' + encoding if charset and mimetype and 'charset=' not in mimetype \ and (mimetype[:5] == 'text/' or mimetype == 'application/javascript'): mimetype += '; charset=%s' % charset if mimetype: headers['Content-Type'] = mimetype if download is True: download = os.path.basename(filename) if download: download = download.replace('"','') headers['Content-Disposition'] = 'attachment; filename="%s"' % download stats = os.stat(filename) headers['Content-Length'] = clen = stats.st_size headers['Last-Modified'] = email.utils.formatdate(stats.st_mtime, usegmt=True) headers['Date'] = email.utils.formatdate(time.time(), usegmt=True) if etag is None: etag = '%d:%d:%d:%d:%s' % (stats.st_dev, stats.st_ino, stats.st_mtime, clen, filename) etag = hashlib.sha1(tob(etag)).hexdigest() if etag: headers['ETag'] = etag check = getenv('HTTP_IF_NONE_MATCH') if check and check == etag: return HTTPResponse(status=304, **headers) ims = getenv('HTTP_IF_MODIFIED_SINCE') if ims: ims = parse_date(ims.split(";")[0].strip()) if ims is not None and ims >= int(stats.st_mtime): return HTTPResponse(status=304, **headers) body = '' if request.method == 'HEAD' else open(filename, 'rb') headers["Accept-Ranges"] = "bytes" range_header = getenv('HTTP_RANGE') if range_header: ranges = list(parse_range_header(range_header, clen)) if not ranges: return HTTPError(416, "Requested Range Not Satisfiable") offset, end = ranges[0] rlen = end - offset headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end - 1, clen) headers["Content-Length"] = str(rlen) if body: body = _closeiter(_rangeiter(body, offset, rlen), body.close) return HTTPResponse(body, status=206, **headers) return HTTPResponse(body, **headers) ############################################################################### # HTTP Utilities and MISC (TODO) ############################################### ############################################################################### def debug(mode=True): """ Change the debug level. There is only one debug level supported at the moment.""" global DEBUG if mode: warnings.simplefilter('default') DEBUG = bool(mode) def http_date(value): if isinstance(value, basestring): return value if isinstance(value, datetime): # aware datetime.datetime is converted to UTC time # naive datetime.datetime is treated as UTC time value = value.utctimetuple() elif isinstance(value, datedate): # datetime.date is naive, and is treated as UTC time value = value.timetuple() if not isinstance(value, (int, float)): # convert struct_time in UTC to UNIX timestamp value = calendar.timegm(value) return email.utils.formatdate(value, usegmt=True) def parse_date(ims): """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ try: ts = email.utils.parsedate_tz(ims) return calendar.timegm(ts[:8] + (0, )) - (ts[9] or 0) except (TypeError, ValueError, IndexError, OverflowError): return None def parse_auth(header): """ Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None""" try: method, data = header.split(None, 1) if method.lower() == 'basic': user, pwd = touni(base64.b64decode(tob(data))).split(':', 1) return user, pwd except (KeyError, ValueError): return None def parse_range_header(header, maxlen=0): """ Yield (start, end) ranges parsed from a HTTP Range header. Skip unsatisfiable ranges. The end index is non-inclusive.""" if not header or header[:6] != 'bytes=': return ranges = [r.split('-', 1) for r in header[6:].split(',') if '-' in r] for start, end in ranges: try: if not start: # bytes=-100 -> last 100 bytes start, end = max(0, maxlen - int(end)), maxlen elif not end: # bytes=100- -> all but the first 99 bytes start, end = int(start), maxlen else: # bytes=100-200 -> bytes 100-200 (inclusive) start, end = int(start), min(int(end) + 1, maxlen) if 0 <= start < end <= maxlen: yield start, end except ValueError: pass #: Header tokenizer used by _parse_http_header() _hsplit = re.compile('(?:(?:"((?:[^"\\\\]|\\\\.)*)")|([^;,=]+))([;,=]?)').findall def _parse_http_header(h): """ Parses a typical multi-valued and parametrised HTTP header (e.g. Accept headers) and returns a list of values and parameters. For non-standard or broken input, this implementation may return partial results. :param h: A header string (e.g. ``text/html,text/plain;q=0.9,*/*;q=0.8``) :return: List of (value, params) tuples. The second element is a (possibly empty) dict. """ values = [] if '"' not in h: # INFO: Fast path without regexp (~2x faster) for value in h.split(','): parts = value.split(';') values.append((parts[0].strip(), {})) for attr in parts[1:]: name, value = attr.split('=', 1) values[-1][1][name.strip().lower()] = value.strip() else: lop, key, attrs = ',', None, {} for quoted, plain, tok in _hsplit(h): value = plain.strip() if plain else quoted.replace('\\"', '"') if lop == ',': attrs = {} values.append((value, attrs)) elif lop == ';': if tok == '=': key = value else: attrs[value.strip().lower()] = '' elif lop == '=' and key: attrs[key.strip().lower()] = value key = None lop = tok return values def _parse_qsl(qs): r = [] for pair in qs.split('&'): if not pair: continue nv = pair.split('=', 1) if len(nv) != 2: nv.append('') key = urlunquote(nv[0].replace('+', ' ')) value = urlunquote(nv[1].replace('+', ' ')) r.append((key, value)) return r def _lscmp(a, b): """ Compares two strings in a cryptographically safe way: Runtime is not affected by length of common prefix. """ return not sum(0 if x == y else 1 for x, y in zip(a, b)) and len(a) == len(b) def cookie_encode(data, key, digestmod=None): """ Encode and sign a pickle-able object. Return a (byte) string """ depr(0, 13, "cookie_encode() will be removed soon.", "Do not use this API directly.") digestmod = digestmod or hashlib.sha256 msg = base64.b64encode(pickle.dumps(data, -1)) sig = base64.b64encode(hmac.new(tob(key), msg, digestmod=digestmod).digest()) return tob('!') + sig + tob('?') + msg def cookie_decode(data, key, digestmod=None): """ Verify and decode an encoded string. Return an object or None.""" depr(0, 13, "cookie_decode() will be removed soon.", "Do not use this API directly.") data = tob(data) if cookie_is_encoded(data): sig, msg = data.split(tob('?'), 1) digestmod = digestmod or hashlib.sha256 hashed = hmac.new(tob(key), msg, digestmod=digestmod).digest() if _lscmp(sig[1:], base64.b64encode(hashed)): return pickle.loads(base64.b64decode(msg)) return None def cookie_is_encoded(data): """ Return True if the argument looks like a encoded cookie.""" depr(0, 13, "cookie_is_encoded() will be removed soon.", "Do not use this API directly.") return bool(data.startswith(tob('!')) and tob('?') in data) def html_escape(string): """ Escape HTML special characters ``&<>`` and quotes ``'"``. """ return string.replace('&', '&').replace('<', '<').replace('>', '>')\ .replace('"', '"').replace("'", ''') def html_quote(string): """ Escape and quote a string to be used as an HTTP attribute.""" return '"%s"' % html_escape(string).replace('\n', ' ')\ .replace('\r', ' ').replace('\t', ' ') def yieldroutes(func): """ Return a generator for routes that match the signature (name, args) of the func parameter. This may yield more than one route if the function takes optional keyword arguments. The output is best described by example:: a() -> '/a' b(x, y) -> '/b//' c(x, y=5) -> '/c/' and '/c//' d(x=5, y=6) -> '/d' and '/d/' and '/d//' """ path = '/' + func.__name__.replace('__', '/').lstrip('/') spec = getargspec(func) argc = len(spec[0]) - len(spec[3] or []) path += ('/<%s>' * argc) % tuple(spec[0][:argc]) yield path for arg in spec[0][argc:]: path += '/<%s>' % arg yield path def path_shift(script_name, path_info, shift=1): """ Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa. :return: The modified paths. :param script_name: The SCRIPT_NAME path. :param script_name: The PATH_INFO path. :param shift: The number of path fragments to shift. May be negative to change the shift direction. (default: 1) """ if shift == 0: return script_name, path_info pathlist = path_info.strip('/').split('/') scriptlist = script_name.strip('/').split('/') if pathlist and pathlist[0] == '': pathlist = [] if scriptlist and scriptlist[0] == '': scriptlist = [] if 0 < shift <= len(pathlist): moved = pathlist[:shift] scriptlist = scriptlist + moved pathlist = pathlist[shift:] elif 0 > shift >= -len(scriptlist): moved = scriptlist[shift:] pathlist = moved + pathlist scriptlist = scriptlist[:shift] else: empty = 'SCRIPT_NAME' if shift < 0 else 'PATH_INFO' raise AssertionError("Cannot shift. Nothing left from %s" % empty) new_script_name = '/' + '/'.join(scriptlist) new_path_info = '/' + '/'.join(pathlist) if path_info.endswith('/') and pathlist: new_path_info += '/' return new_script_name, new_path_info def auth_basic(check, realm="private", text="Access denied"): """ Callback decorator to require HTTP auth (basic). TODO: Add route(check_auth=...) parameter. """ def decorator(func): @functools.wraps(func) def wrapper(*a, **ka): user, password = request.auth or (None, None) if user is None or not check(user, password): err = HTTPError(401, text) err.add_header('WWW-Authenticate', 'Basic realm="%s"' % realm) return err return func(*a, **ka) return wrapper return decorator # Shortcuts for common Bottle methods. # They all refer to the current default application. def make_default_app_wrapper(name): """ Return a callable that relays calls to the current default app. """ @functools.wraps(getattr(Bottle, name)) def wrapper(*a, **ka): return getattr(app(), name)(*a, **ka) return wrapper route = make_default_app_wrapper('route') get = make_default_app_wrapper('get') post = make_default_app_wrapper('post') put = make_default_app_wrapper('put') delete = make_default_app_wrapper('delete') patch = make_default_app_wrapper('patch') error = make_default_app_wrapper('error') mount = make_default_app_wrapper('mount') hook = make_default_app_wrapper('hook') install = make_default_app_wrapper('install') uninstall = make_default_app_wrapper('uninstall') url = make_default_app_wrapper('get_url') ############################################################################### # Multipart Handling ########################################################### ############################################################################### # cgi.FieldStorage was deprecated in Python 3.11 and removed in 3.13 # This implementation is based on https://github.com/defnull/multipart/ class MultipartError(HTTPError): def __init__(self, msg): HTTPError.__init__(self, 400, "MultipartError: " + msg) class _MultipartParser(object): def __init__( self, stream, boundary, content_length=-1, disk_limit=2 ** 30, mem_limit=2 ** 20, memfile_limit=2 ** 18, buffer_size=2 ** 16, charset="latin1", ): self.stream = stream self.boundary = boundary self.content_length = content_length self.disk_limit = disk_limit self.memfile_limit = memfile_limit self.mem_limit = min(mem_limit, self.disk_limit) self.buffer_size = min(buffer_size, self.mem_limit) self.charset = charset if not boundary: raise MultipartError("No boundary.") if self.buffer_size - 6 < len(boundary): # "--boundary--\r\n" raise MultipartError("Boundary does not fit into buffer_size.") def _lineiter(self): """ Iterate over a binary file-like object (crlf terminated) line by line. Each line is returned as a (line, crlf) tuple. Lines larger than buffer_size are split into chunks where all but the last chunk has an empty string instead of crlf. Maximum chunk size is twice the buffer size. """ read = self.stream.read maxread, maxbuf = self.content_length, self.buffer_size partial = b"" # Contains the last (partial) line while True: chunk = read(maxbuf if maxread < 0 else min(maxbuf, maxread)) maxread -= len(chunk) if not chunk: if partial: yield partial, b'' break if partial: chunk = partial + chunk scanpos = 0 while True: i = chunk.find(b'\r\n', scanpos) if i >= 0: yield chunk[scanpos:i], b'\r\n' scanpos = i + 2 else: # CRLF not found partial = chunk[scanpos:] if scanpos else chunk break if len(partial) > maxbuf: yield partial[:-1], b"" partial = partial[-1:] def parse(self): """ Return a MultiPart iterator. Can only be called once. """ lines, line = self._lineiter(), "" separator = b"--" + tob(self.boundary) terminator = separator + b"--" mem_used, disk_used = 0, 0 # Track used resources to prevent DoS is_tail = False # True if the last line was incomplete (cutted) # Consume first boundary. Ignore any preamble, as required by RFC # 2046, section 5.1.1. for line, nl in lines: if line in (separator, terminator): break else: raise MultipartError("Stream does not contain boundary") # First line is termainating boundary -> empty multipart stream if line == terminator: for _ in lines: raise MultipartError("Found data after empty multipart stream") return part_options = { "buffer_size": self.buffer_size, "memfile_limit": self.memfile_limit, "charset": self.charset, } part = _MultipartPart(**part_options) for line, nl in lines: if not is_tail and (line == separator or line == terminator): part.finish() if part.is_buffered(): mem_used += part.size else: disk_used += part.size yield part if line == terminator: break part = _MultipartPart(**part_options) else: is_tail = not nl # The next line continues this one try: part.feed(line, nl) if part.is_buffered(): if part.size + mem_used > self.mem_limit: raise MultipartError("Memory limit reached.") elif part.size + disk_used > self.disk_limit: raise MultipartError("Disk limit reached.") except MultipartError: part.close() raise else: part.close() if line != terminator: raise MultipartError("Unexpected end of multipart stream.") class _MultipartPart(object): def __init__(self, buffer_size=2 ** 16, memfile_limit=2 ** 18, charset="latin1"): self.headerlist = [] self.headers = None self.file = False self.size = 0 self._buf = b"" self.disposition = None self.name = None self.filename = None self.content_type = None self.charset = charset self.memfile_limit = memfile_limit self.buffer_size = buffer_size def feed(self, line, nl=""): if self.file: return self.write_body(line, nl) return self.write_header(line, nl) def write_header(self, line, nl): line = line.decode(self.charset) if not nl: raise MultipartError("Unexpected end of line in header.") if not line.strip(): # blank line -> end of header segment self.finish_header() elif line[0] in " \t" and self.headerlist: name, value = self.headerlist.pop() self.headerlist.append((name, value + line.strip())) else: if ":" not in line: raise MultipartError("Syntax error in header: No colon.") name, value = line.split(":", 1) self.headerlist.append((name.strip(), value.strip())) def write_body(self, line, nl): if not line and not nl: return # This does not even flush the buffer self.size += len(line) + len(self._buf) self.file.write(self._buf + line) self._buf = nl if self.content_length > 0 and self.size > self.content_length: raise MultipartError("Size of body exceeds Content-Length header.") if self.size > self.memfile_limit and isinstance(self.file, BytesIO): self.file, old = NamedTemporaryFile(mode="w+b"), self.file old.seek(0) copied, maxcopy, chunksize = 0, self.size, self.buffer_size read, write = old.read, self.file.write while copied < maxcopy: chunk = read(min(chunksize, maxcopy - copied)) write(chunk) copied += len(chunk) def finish_header(self): self.file = BytesIO() self.headers = HeaderDict(self.headerlist) content_disposition = self.headers.get("Content-Disposition") content_type = self.headers.get("Content-Type") if not content_disposition: raise MultipartError("Content-Disposition header is missing.") self.disposition, self.options = _parse_http_header(content_disposition)[0] self.name = self.options.get("name") if "filename" in self.options: self.filename = self.options.get("filename") if self.filename[1:3] == ":\\" or self.filename[:2] == "\\\\": self.filename = self.filename.split("\\")[-1] # ie6 bug self.content_type, options = _parse_http_header(content_type)[0] if content_type else (None, {}) self.charset = options.get("charset") or self.charset self.content_length = int(self.headers.get("Content-Length", "-1")) def finish(self): if not self.file: raise MultipartError("Incomplete part: Header section not closed.") self.file.seek(0) def is_buffered(self): """ Return true if the data is fully buffered in memory.""" return isinstance(self.file, BytesIO) @property def value(self): """ Data decoded with the specified charset """ return self.raw.decode(self.charset) @property def raw(self): """ Data without decoding """ pos = self.file.tell() self.file.seek(0) try: return self.file.read() finally: self.file.seek(pos) def close(self): if self.file: self.file.close() self.file = False ############################################################################### # Server Adapter ############################################################### ############################################################################### # Before you edit or add a server adapter, please read: # - https://github.com/bottlepy/bottle/pull/647#issuecomment-60152870 # - https://github.com/bottlepy/bottle/pull/865#issuecomment-242795341 class ServerAdapter(object): quiet = False def __init__(self, host='127.0.0.1', port=8080, **options): self.options = options self.host = host self.port = int(port) def run(self, handler): # pragma: no cover pass def __repr__(self): args = ', '.join('%s=%s' % (k, repr(v)) for k, v in self.options.items()) return "%s(%s)" % (self.__class__.__name__, args) class CGIServer(ServerAdapter): quiet = True def run(self, handler): # pragma: no cover from wsgiref.handlers import CGIHandler def fixed_environ(environ, start_response): environ.setdefault('PATH_INFO', '') return handler(environ, start_response) CGIHandler().run(fixed_environ) class FlupFCGIServer(ServerAdapter): def run(self, handler): # pragma: no cover import flup.server.fcgi self.options.setdefault('bindAddress', (self.host, self.port)) flup.server.fcgi.WSGIServer(handler, **self.options).run() class WSGIRefServer(ServerAdapter): def run(self, app): # pragma: no cover from wsgiref.simple_server import make_server from wsgiref.simple_server import WSGIRequestHandler, WSGIServer import socket class FixedHandler(WSGIRequestHandler): def address_string(self): # Prevent reverse DNS lookups please. return self.client_address[0] def log_request(*args, **kw): if not self.quiet: return WSGIRequestHandler.log_request(*args, **kw) handler_cls = self.options.get('handler_class', FixedHandler) server_cls = self.options.get('server_class', WSGIServer) if ':' in self.host: # Fix wsgiref for IPv6 addresses. if getattr(server_cls, 'address_family') == socket.AF_INET: class server_cls(server_cls): address_family = socket.AF_INET6 self.srv = make_server(self.host, self.port, app, server_cls, handler_cls) self.port = self.srv.server_port # update port actual port (0 means random) try: self.srv.serve_forever() except KeyboardInterrupt: self.srv.server_close() # Prevent ResourceWarning: unclosed socket raise class CherryPyServer(ServerAdapter): def run(self, handler): # pragma: no cover depr(0, 13, "The wsgi server part of cherrypy was split into a new " "project called 'cheroot'.", "Use the 'cheroot' server " "adapter instead of cherrypy.") from cherrypy import wsgiserver # This will fail for CherryPy >= 9 self.options['bind_addr'] = (self.host, self.port) self.options['wsgi_app'] = handler certfile = self.options.get('certfile') if certfile: del self.options['certfile'] keyfile = self.options.get('keyfile') if keyfile: del self.options['keyfile'] server = wsgiserver.CherryPyWSGIServer(**self.options) if certfile: server.ssl_certificate = certfile if keyfile: server.ssl_private_key = keyfile try: server.start() finally: server.stop() class CherootServer(ServerAdapter): def run(self, handler): # pragma: no cover from cheroot import wsgi from cheroot.ssl import builtin self.options['bind_addr'] = (self.host, self.port) self.options['wsgi_app'] = handler certfile = self.options.pop('certfile', None) keyfile = self.options.pop('keyfile', None) chainfile = self.options.pop('chainfile', None) server = wsgi.Server(**self.options) if certfile and keyfile: server.ssl_adapter = builtin.BuiltinSSLAdapter( certfile, keyfile, chainfile) try: server.start() finally: server.stop() class WaitressServer(ServerAdapter): def run(self, handler): from waitress import serve serve(handler, host=self.host, port=self.port, _quiet=self.quiet, **self.options) class PasteServer(ServerAdapter): def run(self, handler): # pragma: no cover from paste import httpserver from paste.translogger import TransLogger handler = TransLogger(handler, setup_console_handler=(not self.quiet)) httpserver.serve(handler, host=self.host, port=str(self.port), **self.options) class MeinheldServer(ServerAdapter): def run(self, handler): from meinheld import server server.listen((self.host, self.port)) server.run(handler) class FapwsServer(ServerAdapter): """ Extremely fast webserver using libev. See https://github.com/william-os4y/fapws3 """ def run(self, handler): # pragma: no cover depr(0, 13, "fapws3 is not maintained and support will be dropped.") import fapws._evwsgi as evwsgi from fapws import base, config port = self.port if float(config.SERVER_IDENT[-2:]) > 0.4: # fapws3 silently changed its API in 0.5 port = str(port) evwsgi.start(self.host, port) # fapws3 never releases the GIL. Complain upstream. I tried. No luck. if 'BOTTLE_CHILD' in os.environ and not self.quiet: _stderr("WARNING: Auto-reloading does not work with Fapws3.") _stderr(" (Fapws3 breaks python thread support)") evwsgi.set_base_module(base) def app(environ, start_response): environ['wsgi.multiprocess'] = False return handler(environ, start_response) evwsgi.wsgi_cb(('', app)) evwsgi.run() class TornadoServer(ServerAdapter): """ The super hyped asynchronous server by facebook. Untested. """ def run(self, handler): # pragma: no cover import tornado.wsgi, tornado.httpserver, tornado.ioloop container = tornado.wsgi.WSGIContainer(handler) server = tornado.httpserver.HTTPServer(container) server.listen(port=self.port, address=self.host) tornado.ioloop.IOLoop.instance().start() class AppEngineServer(ServerAdapter): """ Adapter for Google App Engine. """ quiet = True def run(self, handler): depr(0, 13, "AppEngineServer no longer required", "Configure your application directly in your app.yaml") from google.appengine.ext.webapp import util # A main() function in the handler script enables 'App Caching'. # Lets makes sure it is there. This _really_ improves performance. module = sys.modules.get('__main__') if module and not hasattr(module, 'main'): module.main = lambda: util.run_wsgi_app(handler) util.run_wsgi_app(handler) class TwistedServer(ServerAdapter): """ Untested. """ def run(self, handler): from twisted.web import server, wsgi from twisted.python.threadpool import ThreadPool from twisted.internet import reactor thread_pool = ThreadPool() thread_pool.start() reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, handler)) reactor.listenTCP(self.port, factory, interface=self.host) if not reactor.running: reactor.run() class DieselServer(ServerAdapter): """ Untested. """ def run(self, handler): depr(0, 13, "Diesel is not tested or supported and will be removed.") from diesel.protocols.wsgi import WSGIApplication app = WSGIApplication(handler, port=self.port) app.run() class GeventServer(ServerAdapter): """ Untested. Options: * See gevent.wsgi.WSGIServer() documentation for more options. """ def run(self, handler): from gevent import pywsgi, local if not isinstance(threading.local(), local.local): msg = "Bottle requires gevent.monkey.patch_all() (before import)" raise RuntimeError(msg) if self.quiet: self.options['log'] = None address = (self.host, self.port) server = pywsgi.WSGIServer(address, handler, **self.options) if 'BOTTLE_CHILD' in os.environ: import signal signal.signal(signal.SIGINT, lambda s, f: server.stop()) server.serve_forever() class GunicornServer(ServerAdapter): """ Untested. See http://gunicorn.org/configure.html for options. """ def run(self, handler): from gunicorn.app.base import BaseApplication if self.host.startswith("unix:"): config = {'bind': self.host} else: config = {'bind': "%s:%d" % (self.host, self.port)} config.update(self.options) class GunicornApplication(BaseApplication): def load_config(self): for key, value in config.items(): self.cfg.set(key, value) def load(self): return handler GunicornApplication().run() class EventletServer(ServerAdapter): """ Untested. Options: * `backlog` adjust the eventlet backlog parameter which is the maximum number of queued connections. Should be at least 1; the maximum value is system-dependent. * `family`: (default is 2) socket family, optional. See socket documentation for available families. """ def run(self, handler): from eventlet import wsgi, listen, patcher if not patcher.is_monkey_patched(os): msg = "Bottle requires eventlet.monkey_patch() (before import)" raise RuntimeError(msg) socket_args = {} for arg in ('backlog', 'family'): try: socket_args[arg] = self.options.pop(arg) except KeyError: pass address = (self.host, self.port) try: wsgi.server(listen(address, **socket_args), handler, log_output=(not self.quiet)) except TypeError: # Fallback, if we have old version of eventlet wsgi.server(listen(address), handler) class BjoernServer(ServerAdapter): """ Fast server written in C: https://github.com/jonashaag/bjoern """ def run(self, handler): from bjoern import run run(handler, self.host, self.port, reuse_port=True) class AsyncioServerAdapter(ServerAdapter): """ Extend ServerAdapter for adding custom event loop """ def get_event_loop(self): pass class AiohttpServer(AsyncioServerAdapter): """ Asynchronous HTTP client/server framework for asyncio https://pypi.python.org/pypi/aiohttp/ https://pypi.org/project/aiohttp-wsgi/ """ def get_event_loop(self): import asyncio return asyncio.new_event_loop() def run(self, handler): import asyncio from aiohttp_wsgi.wsgi import serve self.loop = self.get_event_loop() asyncio.set_event_loop(self.loop) if 'BOTTLE_CHILD' in os.environ: import signal signal.signal(signal.SIGINT, lambda s, f: self.loop.stop()) serve(handler, host=self.host, port=self.port) class AiohttpUVLoopServer(AiohttpServer): """uvloop https://github.com/MagicStack/uvloop """ def get_event_loop(self): import uvloop return uvloop.new_event_loop() class AutoServer(ServerAdapter): """ Untested. """ adapters = [WaitressServer, PasteServer, TwistedServer, CherryPyServer, CherootServer, WSGIRefServer] def run(self, handler): for sa in self.adapters: try: return sa(self.host, self.port, **self.options).run(handler) except ImportError: pass server_names = { 'cgi': CGIServer, 'flup': FlupFCGIServer, 'wsgiref': WSGIRefServer, 'waitress': WaitressServer, 'cherrypy': CherryPyServer, 'cheroot': CherootServer, 'paste': PasteServer, 'fapws3': FapwsServer, 'tornado': TornadoServer, 'gae': AppEngineServer, 'twisted': TwistedServer, 'diesel': DieselServer, 'meinheld': MeinheldServer, 'gunicorn': GunicornServer, 'eventlet': EventletServer, 'gevent': GeventServer, 'bjoern': BjoernServer, 'aiohttp': AiohttpServer, 'uvloop': AiohttpUVLoopServer, 'auto': AutoServer, } ############################################################################### # Application Control ########################################################## ############################################################################### def load(target, **namespace): """ Import a module or fetch an object from a module. * ``package.module`` returns `module` as a module object. * ``pack.mod:name`` returns the module variable `name` from `pack.mod`. * ``pack.mod:func()`` calls `pack.mod.func()` and returns the result. The last form accepts not only function calls, but any type of expression. Keyword arguments passed to this function are available as local variables. Example: ``import_string('re:compile(x)', x='[a-z]')`` """ module, target = target.split(":", 1) if ':' in target else (target, None) if module not in sys.modules: __import__(module) if not target: return sys.modules[module] if target.isalnum(): return getattr(sys.modules[module], target) package_name = module.split('.')[0] namespace[package_name] = sys.modules[package_name] return eval('%s.%s' % (module, target), namespace) def load_app(target): """ Load a bottle application from a module and make sure that the import does not affect the current default application, but returns a separate application object. See :func:`load` for the target parameter. """ global NORUN NORUN, nr_old = True, NORUN tmp = default_app.push() # Create a new "default application" try: rv = load(target) # Import the target module return rv if callable(rv) else tmp finally: default_app.remove(tmp) # Remove the temporary added default application NORUN = nr_old _debug = debug def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=None, config=None, **kargs): """ Start a server instance. This method blocks until the server terminates. :param app: WSGI application or target string supported by :func:`load_app`. (default: :func:`default_app`) :param server: Server adapter to use. See :data:`server_names` keys for valid names or pass a :class:`ServerAdapter` subclass. (default: `wsgiref`) :param host: Server address to bind to. Pass ``0.0.0.0`` to listens on all interfaces including the external one. (default: 127.0.0.1) :param port: Server port to bind to. Values below 1024 require root privileges. (default: 8080) :param reloader: Start auto-reloading server? (default: False) :param interval: Auto-reloader interval in seconds (default: 1) :param quiet: Suppress output to stdout and stderr? (default: False) :param options: Options passed to the server adapter. """ if NORUN: return if reloader and not os.environ.get('BOTTLE_CHILD'): import subprocess fd, lockfile = tempfile.mkstemp(prefix='bottle.', suffix='.lock') environ = os.environ.copy() environ['BOTTLE_CHILD'] = 'true' environ['BOTTLE_LOCKFILE'] = lockfile args = [sys.executable] + sys.argv # If a package was loaded with `python -m`, then `sys.argv` needs to be # restored to the original value, or imports might break. See #1336 if getattr(sys.modules.get('__main__'), '__package__', None): args[1:1] = ["-m", sys.modules['__main__'].__package__] try: os.close(fd) # We never write to this file while os.path.exists(lockfile): p = subprocess.Popen(args, env=environ) while p.poll() is None: os.utime(lockfile, None) # Tell child we are still alive time.sleep(interval) if p.returncode == 3: # Child wants to be restarted continue sys.exit(p.returncode) except KeyboardInterrupt: pass finally: if os.path.exists(lockfile): os.unlink(lockfile) return try: if debug is not None: _debug(debug) app = app or default_app() if isinstance(app, basestring): app = load_app(app) if not callable(app): raise ValueError("Application is not callable: %r" % app) for plugin in plugins or []: if isinstance(plugin, basestring): plugin = load(plugin) app.install(plugin) if config: app.config.update(config) if server in server_names: server = server_names.get(server) if isinstance(server, basestring): server = load(server) if isinstance(server, type): server = server(host=host, port=port, **kargs) if not isinstance(server, ServerAdapter): raise ValueError("Unknown or unsupported server: %r" % server) server.quiet = server.quiet or quiet if not server.quiet: _stderr("Bottle v%s server starting up (using %s)..." % (__version__, repr(server))) if server.host.startswith("unix:"): _stderr("Listening on %s" % server.host) else: _stderr("Listening on http://%s:%d/" % (server.host, server.port)) _stderr("Hit Ctrl-C to quit.\n") if reloader: lockfile = os.environ.get('BOTTLE_LOCKFILE') bgcheck = FileCheckerThread(lockfile, interval) with bgcheck: server.run(app) if bgcheck.status == 'reload': sys.exit(3) else: server.run(app) except KeyboardInterrupt: pass except (SystemExit, MemoryError): raise except: if not reloader: raise if not getattr(server, 'quiet', quiet): print_exc() time.sleep(interval) sys.exit(3) class FileCheckerThread(threading.Thread): """ Interrupt main-thread as soon as a changed module file is detected, the lockfile gets deleted or gets too old. """ def __init__(self, lockfile, interval): threading.Thread.__init__(self) self.daemon = True self.lockfile, self.interval = lockfile, interval #: Is one of 'reload', 'error' or 'exit' self.status = None def run(self): exists = os.path.exists mtime = lambda p: os.stat(p).st_mtime files = dict() for module in list(sys.modules.values()): path = getattr(module, '__file__', '') or '' if path[-4:] in ('.pyo', '.pyc'): path = path[:-1] if path and exists(path): files[path] = mtime(path) while not self.status: if not exists(self.lockfile)\ or mtime(self.lockfile) < time.time() - self.interval - 5: self.status = 'error' thread.interrupt_main() for path, lmtime in list(files.items()): if not exists(path) or mtime(path) > lmtime: self.status = 'reload' thread.interrupt_main() break time.sleep(self.interval) def __enter__(self): self.start() def __exit__(self, exc_type, *_): if not self.status: self.status = 'exit' # silent exit self.join() return exc_type is not None and issubclass(exc_type, KeyboardInterrupt) ############################################################################### # Template Adapters ############################################################ ############################################################################### class TemplateError(BottleException): pass class BaseTemplate(object): """ Base class and minimal API for template adapters """ extensions = ['tpl', 'html', 'thtml', 'stpl'] settings = {} #used in prepare() defaults = {} #used in render() def __init__(self, source=None, name=None, lookup=None, encoding='utf8', **settings): """ Create a new template. If the source parameter (str or buffer) is missing, the name argument is used to guess a template filename. Subclasses can assume that self.source and/or self.filename are set. Both are strings. The lookup, encoding and settings parameters are stored as instance variables. The lookup parameter stores a list containing directory paths. The encoding parameter should be used to decode byte strings or files. The settings parameter contains a dict for engine-specific settings. """ self.name = name self.source = source.read() if hasattr(source, 'read') else source self.filename = source.filename if hasattr(source, 'filename') else None self.lookup = [os.path.abspath(x) for x in lookup] if lookup else [] self.encoding = encoding self.settings = self.settings.copy() # Copy from class variable self.settings.update(settings) # Apply if not self.source and self.name: self.filename = self.search(self.name, self.lookup) if not self.filename: raise TemplateError('Template %s not found.' % repr(name)) if not self.source and not self.filename: raise TemplateError('No template specified.') self.prepare(**self.settings) @classmethod def search(cls, name, lookup=None): """ Search name in all directories specified in lookup. First without, then with common extensions. Return first hit. """ if not lookup: raise depr(0, 12, "Empty template lookup path.", "Configure a template lookup path.") if os.path.isabs(name): raise depr(0, 12, "Use of absolute path for template name.", "Refer to templates with names or paths relative to the lookup path.") for spath in lookup: spath = os.path.abspath(spath) + os.sep fname = os.path.abspath(os.path.join(spath, name)) if not fname.startswith(spath): continue if os.path.isfile(fname): return fname for ext in cls.extensions: if os.path.isfile('%s.%s' % (fname, ext)): return '%s.%s' % (fname, ext) @classmethod def global_config(cls, key, *args): """ This reads or sets the global settings stored in class.settings. """ if args: cls.settings = cls.settings.copy() # Make settings local to class cls.settings[key] = args[0] else: return cls.settings[key] def prepare(self, **options): """ Run preparations (parsing, caching, ...). It should be possible to call this again to refresh a template or to update settings. """ raise NotImplementedError def render(self, *args, **kwargs): """ Render the template with the specified local variables and return a single byte or unicode string. If it is a byte string, the encoding must match self.encoding. This method must be thread-safe! Local variables may be provided in dictionaries (args) or directly, as keywords (kwargs). """ raise NotImplementedError class MakoTemplate(BaseTemplate): def prepare(self, **options): from mako.template import Template from mako.lookup import TemplateLookup options.update({'input_encoding': self.encoding}) options.setdefault('format_exceptions', bool(DEBUG)) lookup = TemplateLookup(directories=self.lookup, **options) if self.source: self.tpl = Template(self.source, lookup=lookup, **options) else: self.tpl = Template(uri=self.name, filename=self.filename, lookup=lookup, **options) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) _defaults = self.defaults.copy() _defaults.update(kwargs) return self.tpl.render(**_defaults) class CheetahTemplate(BaseTemplate): def prepare(self, **options): from Cheetah.Template import Template self.context = threading.local() self.context.vars = {} options['searchList'] = [self.context.vars] if self.source: self.tpl = Template(source=self.source, **options) else: self.tpl = Template(file=self.filename, **options) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) self.context.vars.update(self.defaults) self.context.vars.update(kwargs) out = str(self.tpl) self.context.vars.clear() return out class Jinja2Template(BaseTemplate): def prepare(self, filters=None, tests=None, globals={}, **kwargs): from jinja2 import Environment, FunctionLoader self.env = Environment(loader=FunctionLoader(self.loader), **kwargs) if filters: self.env.filters.update(filters) if tests: self.env.tests.update(tests) if globals: self.env.globals.update(globals) if self.source: self.tpl = self.env.from_string(self.source) else: self.tpl = self.env.get_template(self.name) def render(self, *args, **kwargs): for dictarg in args: kwargs.update(dictarg) _defaults = self.defaults.copy() _defaults.update(kwargs) return self.tpl.render(**_defaults) def loader(self, name): if name == self.filename: fname = name else: fname = self.search(name, self.lookup) if not fname: return with open(fname, "rb") as f: return (f.read().decode(self.encoding), fname, lambda: False) class SimpleTemplate(BaseTemplate): def prepare(self, escape_func=html_escape, noescape=False, syntax=None, **ka): self.cache = {} enc = self.encoding self._str = lambda x: touni(x, enc) self._escape = lambda x: escape_func(touni(x, enc)) self.syntax = syntax if noescape: self._str, self._escape = self._escape, self._str @cached_property def co(self): return compile(self.code, self.filename or '', 'exec') @cached_property def code(self): source = self.source if not source: with open(self.filename, 'rb') as f: source = f.read() try: source, encoding = touni(source), 'utf8' except UnicodeError: raise depr(0, 11, 'Unsupported template encodings.', 'Use utf-8 for templates.') parser = StplParser(source, encoding=encoding, syntax=self.syntax) code = parser.translate() self.encoding = parser.encoding return code def _rebase(self, _env, _name=None, **kwargs): _env['_rebase'] = (_name, kwargs) def _include(self, _env, _name=None, **kwargs): env = _env.copy() env.update(kwargs) if _name not in self.cache: self.cache[_name] = self.__class__(name=_name, lookup=self.lookup, syntax=self.syntax) return self.cache[_name].execute(env['_stdout'], env) def execute(self, _stdout, kwargs): env = self.defaults.copy() env.update(kwargs) env.update({ '_stdout': _stdout, '_printlist': _stdout.extend, 'include': functools.partial(self._include, env), 'rebase': functools.partial(self._rebase, env), '_rebase': None, '_str': self._str, '_escape': self._escape, 'get': env.get, 'setdefault': env.setdefault, 'defined': env.__contains__ }) exec(self.co, env) if env.get('_rebase'): subtpl, rargs = env.pop('_rebase') rargs['base'] = ''.join(_stdout) #copy stdout del _stdout[:] # clear stdout return self._include(env, subtpl, **rargs) return env def render(self, *args, **kwargs): """ Render the template using keyword arguments as local variables. """ env = {} stdout = [] for dictarg in args: env.update(dictarg) env.update(kwargs) self.execute(stdout, env) return ''.join(stdout) class StplSyntaxError(TemplateError): pass class StplParser(object): """ Parser for stpl templates. """ _re_cache = {} #: Cache for compiled re patterns # This huge pile of voodoo magic splits python code into 8 different tokens. # We use the verbose (?x) regex mode to make this more manageable _re_tok = r'''( [urbURB]* (?: ''(?!') |""(?!") |'{6} |"{6} |'(?:[^\\']|\\.)+?' |"(?:[^\\"]|\\.)+?" |'{3}(?:[^\\]|\\.|\n)+?'{3} |"{3}(?:[^\\]|\\.|\n)+?"{3} ) )''' _re_inl = _re_tok.replace(r'|\n', '') # We re-use this string pattern later _re_tok += r''' # 2: Comments (until end of line, but not the newline itself) |(\#.*) # 3: Open and close (4) grouping tokens |([\[\{\(]) |([\]\}\)]) # 5,6: Keywords that start or continue a python block (only start of line) |^([\ \t]*(?:if|for|while|with|try|def|class)\b) |^([\ \t]*(?:elif|else|except|finally)\b) # 7: Our special 'end' keyword (but only if it stands alone) |((?:^|;)[\ \t]*end[\ \t]*(?=(?:%(block_close)s[\ \t]*)?\r?$|;|\#)) # 8: A customizable end-of-code-block template token (only end of line) |(%(block_close)s[\ \t]*(?=\r?$)) # 9: And finally, a single newline. The 10th token is 'everything else' |(\r?\n) ''' # Match the start tokens of code areas in a template _re_split = r'''(?m)^[ \t]*(\\?)((%(line_start)s)|(%(block_start)s))''' # Match inline statements (may contain python strings) _re_inl = r'''%%(inline_start)s((?:%s|[^'"\n])*?)%%(inline_end)s''' % _re_inl # add the flag in front of the regexp to avoid Deprecation warning (see Issue #949) # verbose and dot-matches-newline mode _re_tok = '(?mx)' + _re_tok _re_inl = '(?mx)' + _re_inl default_syntax = '<% %> % {{ }}' def __init__(self, source, syntax=None, encoding='utf8'): self.source, self.encoding = touni(source, encoding), encoding self.set_syntax(syntax or self.default_syntax) self.code_buffer, self.text_buffer = [], [] self.lineno, self.offset = 1, 0 self.indent, self.indent_mod = 0, 0 self.paren_depth = 0 def get_syntax(self): """ Tokens as a space separated string (default: <% %> % {{ }}) """ return self._syntax def set_syntax(self, syntax): self._syntax = syntax self._tokens = syntax.split() if syntax not in self._re_cache: names = 'block_start block_close line_start inline_start inline_end' etokens = map(re.escape, self._tokens) pattern_vars = dict(zip(names.split(), etokens)) patterns = (self._re_split, self._re_tok, self._re_inl) patterns = [re.compile(p % pattern_vars) for p in patterns] self._re_cache[syntax] = patterns self.re_split, self.re_tok, self.re_inl = self._re_cache[syntax] syntax = property(get_syntax, set_syntax) def translate(self): if self.offset: raise RuntimeError('Parser is a one time instance.') while True: m = self.re_split.search(self.source, pos=self.offset) if m: text = self.source[self.offset:m.start()] self.text_buffer.append(text) self.offset = m.end() if m.group(1): # Escape syntax line, sep, _ = self.source[self.offset:].partition('\n') self.text_buffer.append(self.source[m.start():m.start(1)] + m.group(2) + line + sep) self.offset += len(line + sep) continue self.flush_text() self.offset += self.read_code(self.source[self.offset:], multiline=bool(m.group(4))) else: break self.text_buffer.append(self.source[self.offset:]) self.flush_text() return ''.join(self.code_buffer) def read_code(self, pysource, multiline): code_line, comment = '', '' offset = 0 while True: m = self.re_tok.search(pysource, pos=offset) if not m: code_line += pysource[offset:] offset = len(pysource) self.write_code(code_line.strip(), comment) break code_line += pysource[offset:m.start()] offset = m.end() _str, _com, _po, _pc, _blk1, _blk2, _end, _cend, _nl = m.groups() if self.paren_depth > 0 and (_blk1 or _blk2): # a if b else c code_line += _blk1 or _blk2 continue if _str: # Python string code_line += _str elif _com: # Python comment (up to EOL) comment = _com if multiline and _com.strip().endswith(self._tokens[1]): multiline = False # Allow end-of-block in comments elif _po: # open parenthesis self.paren_depth += 1 code_line += _po elif _pc: # close parenthesis if self.paren_depth > 0: # we could check for matching parentheses here, but it's # easier to leave that to python - just check counts self.paren_depth -= 1 code_line += _pc elif _blk1: # Start-block keyword (if/for/while/def/try/...) code_line = _blk1 self.indent += 1 self.indent_mod -= 1 elif _blk2: # Continue-block keyword (else/elif/except/...) code_line = _blk2 self.indent_mod -= 1 elif _cend: # The end-code-block template token (usually '%>') if multiline: multiline = False else: code_line += _cend elif _end: self.indent -= 1 self.indent_mod += 1 else: # \n self.write_code(code_line.strip(), comment) self.lineno += 1 code_line, comment, self.indent_mod = '', '', 0 if not multiline: break return offset def flush_text(self): text = ''.join(self.text_buffer) del self.text_buffer[:] if not text: return parts, pos, nl = [], 0, '\\\n' + ' ' * self.indent for m in self.re_inl.finditer(text): prefix, pos = text[pos:m.start()], m.end() if prefix: parts.append(nl.join(map(repr, prefix.splitlines(True)))) if prefix.endswith('\n'): parts[-1] += nl parts.append(self.process_inline(m.group(1).strip())) if pos < len(text): prefix = text[pos:] lines = prefix.splitlines(True) if lines[-1].endswith('\\\\\n'): lines[-1] = lines[-1][:-3] elif lines[-1].endswith('\\\\\r\n'): lines[-1] = lines[-1][:-4] parts.append(nl.join(map(repr, lines))) code = '_printlist((%s,))' % ', '.join(parts) self.lineno += code.count('\n') + 1 self.write_code(code) @staticmethod def process_inline(chunk): if chunk[0] == '!': return '_str(%s)' % chunk[1:] return '_escape(%s)' % chunk def write_code(self, line, comment=''): code = ' ' * (self.indent + self.indent_mod) code += line.lstrip() + comment + '\n' self.code_buffer.append(code) def template(*args, **kwargs): """ Get a rendered template as a string iterator. You can use a name, a filename or a template string as first parameter. Template rendering arguments can be passed as dictionaries or directly (as keyword arguments). """ tpl = args[0] if args else None for dictarg in args[1:]: kwargs.update(dictarg) adapter = kwargs.pop('template_adapter', SimpleTemplate) lookup = kwargs.pop('template_lookup', TEMPLATE_PATH) tplid = (id(lookup), tpl) if tplid not in TEMPLATES or DEBUG: settings = kwargs.pop('template_settings', {}) if isinstance(tpl, adapter): TEMPLATES[tplid] = tpl if settings: TEMPLATES[tplid].prepare(**settings) elif "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl: TEMPLATES[tplid] = adapter(source=tpl, lookup=lookup, **settings) else: TEMPLATES[tplid] = adapter(name=tpl, lookup=lookup, **settings) if not TEMPLATES[tplid]: abort(500, 'Template (%s) not found' % tpl) return TEMPLATES[tplid].render(kwargs) mako_template = functools.partial(template, template_adapter=MakoTemplate) cheetah_template = functools.partial(template, template_adapter=CheetahTemplate) jinja2_template = functools.partial(template, template_adapter=Jinja2Template) def view(tpl_name, **defaults): """ Decorator: renders a template for a handler. The handler can control its behavior like that: - return a dict of template vars to fill out the template - return something other than a dict and the view decorator will not process the template, but return the handler result as is. This includes returning a HTTPResponse(dict) to get, for instance, JSON with autojson or other castfilters. """ def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): result = func(*args, **kwargs) if isinstance(result, (dict, DictMixin)): tplvars = defaults.copy() tplvars.update(result) return template(tpl_name, **tplvars) elif result is None: return template(tpl_name, **defaults) return result return wrapper return decorator mako_view = functools.partial(view, template_adapter=MakoTemplate) cheetah_view = functools.partial(view, template_adapter=CheetahTemplate) jinja2_view = functools.partial(view, template_adapter=Jinja2Template) ############################################################################### # Constants and Globals ######################################################## ############################################################################### TEMPLATE_PATH = ['./', './views/'] TEMPLATES = {} DEBUG = False NORUN = False # If set, run() does nothing. Used by load_app() #: A dict to map HTTP status codes (e.g. 404) to phrases (e.g. 'Not Found') HTTP_CODES = httplib.responses.copy() HTTP_CODES[418] = "I'm a teapot" # RFC 2324 HTTP_CODES[428] = "Precondition Required" HTTP_CODES[429] = "Too Many Requests" HTTP_CODES[431] = "Request Header Fields Too Large" HTTP_CODES[451] = "Unavailable For Legal Reasons" # RFC 7725 HTTP_CODES[511] = "Network Authentication Required" _HTTP_STATUS_LINES = dict((k, '%d %s' % (k, v)) for (k, v) in HTTP_CODES.items()) #: The default template used for error pages. Override with @error() ERROR_PAGE_TEMPLATE = """ %%try: %%from %s import DEBUG, request Error: {{e.status}}

    Error: {{e.status}}

    Sorry, the requested URL {{repr(request.url)}} caused an error:

    {{e.body}}
    %%if DEBUG and e.exception:

    Exception:

    %%try: %%exc = repr(e.exception) %%except: %%exc = '' %% type(e.exception).__name__ %%end
    {{exc}}
    %%end %%if DEBUG and e.traceback:

    Traceback:

    {{e.traceback}}
    %%end %%except ImportError: ImportError: Could not generate the error page. Please add bottle to the import path. %%end """ % __name__ #: A thread-safe instance of :class:`LocalRequest`. If accessed from within a #: request callback, this instance always refers to the *current* request #: (even on a multi-threaded server). request = LocalRequest() #: A thread-safe instance of :class:`LocalResponse`. It is used to change the #: HTTP response for the *current* request. response = LocalResponse() #: A thread-safe namespace. Not used by Bottle. local = threading.local() # Initialize app stack (create first empty Bottle app now deferred until needed) # BC: 0.6.4 and needed for run() apps = app = default_app = AppStack() #: A virtual package that redirects import statements. #: Example: ``import bottle.ext.sqlite`` actually imports `bottle_sqlite`. ext = _ImportRedirect('bottle.ext' if __name__ == '__main__' else __name__ + ".ext", 'bottle_%s').module def _main(argv): # pragma: no coverage args, parser = _cli_parse(argv) def _cli_error(cli_msg): parser.print_help() _stderr('\nError: %s\n' % cli_msg) sys.exit(1) if args.version: print('Bottle %s' % __version__) sys.exit(0) if not args.app: _cli_error("No application entry point specified.") sys.path.insert(0, '.') sys.modules.setdefault('bottle', sys.modules['__main__']) host, port = (args.bind or 'localhost'), 8080 if ':' in host and host.rfind(']') < host.rfind(':'): host, port = host.rsplit(':', 1) host = host.strip('[]') config = ConfigDict() for cfile in args.conf or []: try: if cfile.endswith('.json'): with open(cfile, 'rb') as fp: config.load_dict(json_loads(fp.read())) else: config.load_config(cfile) except configparser.Error as parse_error: _cli_error(parse_error) except IOError: _cli_error("Unable to read config file %r" % cfile) except (UnicodeError, TypeError, ValueError) as error: _cli_error("Unable to parse config file %r: %s" % (cfile, error)) for cval in args.param or []: if '=' in cval: config.update((cval.split('=', 1),)) else: config[cval] = True run(args.app, host=host, port=int(port), server=args.server, reloader=args.reload, plugins=args.plugin, debug=args.debug, config=config) def main(): _main(sys.argv) if __name__ == '__main__': # pragma: no coverage main() mongo-c-driver-2.2.1/build/cmake/000077500000000000000000000000001511661753600165365ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/cmake/BuildVersion.cmake000066400000000000000000000020231511661753600221420ustar00rootroot00000000000000include_guard(GLOBAL) #[[ Attempts to find the current build version string by reading VERSION_CURRENT from the current source directory. The computed build version is set in the parent scope according to `outvar`. ]] function(compute_build_version outvar) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) # If it is present, defer to the VERSION_CURRENT file: set(ver_cur_file "${CMAKE_CURRENT_SOURCE_DIR}/VERSION_CURRENT") message(DEBUG "Using existing VERSION_CURRENT file as BUILD_VERSION [${ver_cur_file}]") file(READ "${ver_cur_file}" version) message(DEBUG "VERSION_CURRENT is “${version}â€") set("${outvar}" "${version}" PARENT_SCOPE) endfunction() # Compute the BUILD_VERSION if it is not already defined: if(NOT DEFINED BUILD_VERSION) compute_build_version(BUILD_VERSION) endif() # Set a BUILD_VERSION_SIMPLE, which is just a three-number-triple that CMake understands string (REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+).*$" "\\1" BUILD_VERSION_SIMPLE "${BUILD_VERSION}") mongo-c-driver-2.2.1/build/cmake/CheckSchedGetCPU.cmake000066400000000000000000000003121511661753600225300ustar00rootroot00000000000000include (CheckSymbolExists) check_symbol_exists (sched_getcpu sched.h HAVE_SCHED_GETCPU) if (HAVE_SCHED_GETCPU) set (MONGOC_HAVE_SCHED_GETCPU 1) else () set (MONGOC_HAVE_SCHED_GETCPU 0) endif () mongo-c-driver-2.2.1/build/cmake/FindSASL2.cmake000066400000000000000000000055341511661753600211740ustar00rootroot00000000000000#[[ Searches for a Cyrus "libsasl2" library available on the system. Upon success, Defines an imported target `SASL2::SASL2` that can be linked into other targts. ]] include(FindPackageHandleStandardArgs) # Upon early return, tell the caller that we don't have it: set(SASL2_FOUND FALSE) if(SASL2_FIND_COMPONENTS) message(FATAL_ERROR "This find_package(SASL2) does not support package components (Got “${SASL2_FIND_COMPONENTS}â€)") endif() list(APPEND SASL2_PATHS C:/sasl) # Search for the proper qualified path , not sasl.h find_path( SASL2_INCLUDE_DIR "sasl/sasl.h" DOC "Header include-directory for Cyrus libsasl2" HINTS ${SASL2_HINTS} PATHS ${SASL2_PREFIX} ${SASL2_ROOT_DIR} ${SASL2_PATHS} PATH_SUFFIXES include ) # Use the header path as a hint for the library path: unset(_hint) if(SASL2_INCLUDE_DIR) get_filename_component(_hint "${SASL2_INCLUDE_DIR}" DIRECTORY) endif() # The library filename is libsasl2.so, libsasl.dylib, etc. find_library( SASL2_LIBRARY sasl2 DOC "Library file for Cyrus libsasl2" HINTS ${_hint} ${SASL2_HINTS} PATHS ${SASL2_PREFIX} ${SASL2_ROOT_DIR} ${SASL2_PATHS} PATH_SUFFIXES lib ) if(SASL2_INCLUDE_DIR) message(DEBUG "Found SASL2 include-dir: ${SASL2_INCLUDE_DIR}") # Extract the library version from the sasl.h header file: file(READ "${SASL2_INCLUDE_DIR}/sasl/sasl.h" _sasl_h) # It is defined via three macro definitions: string(CONCAT _version_regex "define[ \t]+SASL_VERSION_MAJOR[ \t]+([0-9]+).+" "define[ \t]+SASL_VERSION_MINOR[ \t]+([0-9]+).+" "define[ \t]+SASL_VERSION_STEP[ \t]+([0-9]+)" ) if(NOT _sasl_h MATCHES "${_version_regex}") # Very strange... set(SASL2_NOT_FOUND_MESSAGE [[A sasl/sasl.h file was found, but we could not extract version information]]) else() set(SASL2_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") message(DEBUG "Found libsasl2 version from sasl.h: ${SASL2_VERSION}") endif() endif() find_package_handle_standard_args(SASL2 REQUIRED_VARS SASL2_VERSION SASL2_INCLUDE_DIR SASL2_LIBRARY VERSION_VAR SASL2_VERSION ) if(NOT SASL2_FOUND) return() endif() message(DEBUG "Found SASL2 library: ${SASL2_LIBRARY}") # Generate an imported target based on the paths that we found. if(NOT TARGET SASL2::SASL2) # (Guard against double-import) add_library(SASL2::SASL2 IMPORTED UNKNOWN GLOBAL) endif() set_target_properties(SASL2::SASL2 PROPERTIES IMPORTED_LOCATION "${SASL2_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${SASL2_INCLUDE_DIR}" INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${SASL2_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "" # Clear this property in case of double-import VERSION "${SASL2_VERSION}" ) # libsasl2 requires dlopen(): set_property(TARGET SASL2::SASL2 APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${CMAKE_DL_LIBS}) mongo-c-driver-2.2.1/build/cmake/FindSnappy.cmake000066400000000000000000000036641511661753600216240ustar00rootroot00000000000000include (CheckSymbolExists) # Allow old "SYSTEM" option but prefer ON/AUTO/OFF. if (NOT ENABLE_SNAPPY MATCHES "ON|SYSTEM|AUTO|OFF") message (FATAL_ERROR "ENABLE_SNAPPY option must be ON, AUTO, or OFF") endif () if (NOT ENABLE_SNAPPY STREQUAL OFF) message (STATUS "Searching for compression library header snappy-c.h") find_path ( SNAPPY_INCLUDE_DIRS NAMES snappy-c.h PATHS /include /usr/include /usr/local/include /usr/share/include /opt/include c:/snappy/include DOC "Searching for snappy-c.h") if (NOT SNAPPY_INCLUDE_DIRS) if (ENABLE_SNAPPY MATCHES "ON|SYSTEM") message (FATAL_ERROR " Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)") else () message (STATUS " Not found (specify -DCMAKE_INCLUDE_PATH=/path/to/snappy/include for Snappy compression)") endif () else () message (STATUS " Found in ${SNAPPY_INCLUDE_DIRS}") message (STATUS "Searching for libsnappy") find_library ( SNAPPY_LIBRARIES NAMES snappy PATHS /usr/lib /lib /usr/local/lib /usr/share/lib /opt/lib /opt/share/lib /var/lib c:/snappy/lib DOC "Searching for libsnappy") if (SNAPPY_LIBRARIES) message (STATUS " Found ${SNAPPY_LIBRARIES}") else () if (ENABLE_SNAPPY MATCHES "ON|SYSTEM") message (FATAL_ERROR " Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/snappy/lib for Snappy compression)") else () message (STATUS " Not found (specify -DCMAKE_LIBRARY_PATH=/path/to/snappy/lib for Snappy compression)") endif () endif () endif () if (SNAPPY_INCLUDE_DIRS AND SNAPPY_LIBRARIES) set (MONGOC_ENABLE_COMPRESSION_SNAPPY 1) set (MONGOC_ENABLE_COMPRESSION 1) endif () endif () if (NOT SNAPPY_INCLUDE_DIRS OR NOT SNAPPY_LIBRARIES) set (SNAPPY_INCLUDE_DIRS "") set (SNAPPY_LIBRARIES "") set (MONGOC_ENABLE_COMPRESSION_SNAPPY 0) endif () mongo-c-driver-2.2.1/build/cmake/FindSphinx.cmake000066400000000000000000000004541511661753600216150ustar00rootroot00000000000000find_program (SPHINX_EXECUTABLE NAMES sphinx-build HINTS $ENV{SPHINX_DIR} PATH_SUFFIXES bin DOC "Sphinx documentation generator" ) include (FindPackageHandleStandardArgs) find_package_handle_standard_args (Sphinx DEFAULT_MSG SPHINX_EXECUTABLE ) mark_as_advanced (SPHINX_EXECUTABLE) mongo-c-driver-2.2.1/build/cmake/FindUtf8Proc.cmake000066400000000000000000000010261511661753600220120ustar00rootroot00000000000000if(USE_BUNDLED_UTF8PROC) message (STATUS "Enabling utf8proc (bundled)") add_library (utf8proc_obj OBJECT "${mongo-c-driver_SOURCE_DIR}/src/utf8proc-2.8.0/utf8proc.c") set_property (TARGET utf8proc_obj PROPERTY POSITION_INDEPENDENT_CODE TRUE) target_compile_definitions (utf8proc_obj PUBLIC UTF8PROC_STATIC) else () message (STATUS "Searching for utf8proc on system") find_package(PkgConfig) pkg_check_modules(PC_UTF8PROC REQUIRED libutf8proc IMPORTED_TARGET) add_library(utf8proc ALIAS PkgConfig::PC_UTF8PROC) endif() mongo-c-driver-2.2.1/build/cmake/GeneratePkgConfig.cmake000066400000000000000000000325011511661753600230630ustar00rootroot00000000000000include_guard(GLOBAL) include(GNUInstallDirs) define_property( TARGET PROPERTY pkg_config_REQUIRES INHERITED BRIEF_DOCS "pkg-config 'Requires:' items" FULL_DOCS "Specify 'Requires:' items for the targets' pkg-config file" ) define_property( TARGET PROPERTY pkg_config_NAME INHERITED BRIEF_DOCS "The 'Name' for pkg-config" FULL_DOCS "The 'Name' of the pkg-config target" ) define_property( TARGET PROPERTY pkg_config_DESCRIPTION INHERITED BRIEF_DOCS "The 'Description' pkg-config property" FULL_DOCS "The 'Description' property to add to a target's pkg-config file" ) define_property( TARGET PROPERTY pkg_config_VERSION INHERITED BRIEF_DOCS "The 'Version' pkg-config property" FULL_DOCS "The 'Version' property to add to a target's pkg-config file" ) define_property( TARGET PROPERTY pkg_config_CFLAGS INHERITED BRIEF_DOCS "The 'Cflags' pkg-config property" FULL_DOCS "Set a list of options to add to a target's pkg-config file 'Cflags' field" ) define_property( TARGET PROPERTY pkg_config_INCLUDE_DIRECTORIES INHERITED BRIEF_DOCS "Add -I options to the 'Cflags' pkg-config property" FULL_DOCS "Set a list of directories that will be added using -I for the 'Cflags' pkg-config field" ) define_property( TARGET PROPERTY pkg_config_LIBS INHERITED BRIEF_DOCS "Add linker options to the 'Libs' pkg-config field" FULL_DOCS "Set a list of linker options that will joined in a string for the 'Libs' pkg-config field" ) # Given a string, escape any generator-expression-special characters function(_genex_escape out in) # Escape '>' string(REPLACE ">" "$" str "${in}") # Escape "$" string(REPLACE "$" "$<1:$>" str "${str}") # Undo the escaping of the dollar for $ string(REPLACE "$<1:$>" "$" str "${str}") # Escape "," string(REPLACE "," "$" str "${str}") # Escape ";" string(REPLACE ";" "$" str "${str}") set("${out}" "${str}" PARENT_SCOPE) endfunction() # Create a generator expression that ensures the given input generator expression # is evaluated within the context of the named target. function(_bind_genex_to_target out target genex) _genex_escape(escaped "${genex}") set("${out}" $ PARENT_SCOPE) endfunction() #[==[ Generate a pkg-config .pc file for the Given CMake target, and optionally a rule to install it:: generate_pkg_config( [FILENAME ] [LIBDIR ] [INSTALL [DESTINATION ] [RENAME ]] [CONDITION ] ) The `` must name an existing target. The following options are accepted: FILENAME - The generated .pc file will have the given ``. This name *must* be only the filename, and not a qualified path. If omitted, the default filename is generated based on the target name. If using a multi-config generator, the default filename will include the name of the configuration for which it was generated. LIBDIR - Specify the subdirectory of the install prefix in which the target binary will live. If unspecified, uses `CMAKE_INSTALL_LIBDIR`, which comes from the GNUInstallDirs module, which has a default of `lib`. INSTALL [DESTINATION ] [RENAME ] - Generate a rule to install the generated pkg-config file. This is better than using a `file(INSTALL)` on the generated file directly, since it ensures that the installed .pc file will have the correct install prefix value. The following additional arguments are also accepted: DESTINATION - If provided, specify the *directory* (relative to the install-prefix) in which the generated file will be installed. If unspecified, the default destination is `/pkgconfig` RENAME - If provided, set the filename of the installed pkg-config file. If unspecified, the top-level `` will be used. (Note that the default top-level `` will include the configuration type when built/installed using a multi-config generator!) CONDITION - The file will only be generated/installed if the condition `` results in the string "1" after evaluating generator expressions. All named parameters accept generator expressions. ]==] function(mongo_generate_pkg_config target) list(APPEND CMAKE_MESSAGE_CONTEXT "mongo_generate_pkg_config" "${target}") # Collect some target properties: # The name: _genex_escape(proj_name "${PROJECT_NAME}") _genex_escape(proj_desc "${PROJECT_DESCRIPTION}") set(tgt_name $) set(tgt_version $) set(tgt_desc $) string(CONCAT gx_name $, ${proj_name}, ${tgt_name}>) # Version: string(CONCAT gx_version $, ${PROJECT_VERSION}, ${tgt_version}>) # Description: string(CONCAT gx_desc $, ${proj_desc}, ${tgt_desc}>) # Parse and validate arguments: cmake_parse_arguments(PARSE_ARGV 1 ARG "" "FILENAME;LIBDIR;CONDITION" "INSTALL") # Compute the default FILENAME if(NOT DEFINED ARG_FILENAME) # No filename given. Pick a default: if(DEFINED CMAKE_CONFIGURATION_TYPES) # Multi-conf: We may want to generate more than one, so qualify the # filename with the configuration type: set(ARG_FILENAME "$-$>.pc") else() # Just generate a file based on the basename of the target: set(ARG_FILENAME "$.pc") endif() endif() message(DEBUG "FILENAME: ${ARG_FILENAME}") # The defalut CONDITION is just "1" (true) if(NOT DEFINED ARG_CONDITION) set(ARG_CONDITION 1) endif() message(DEBUG "CONDITION: ${ARG_CONDITION}") _bind_genex_to_target(gx_cond ${target} "${ARG_CONDITION}") # The default LIBDIR comes from GNUInstallDirs.cmake if(NOT ARG_LIBDIR) set(ARG_LIBDIR "${CMAKE_INSTALL_LIBDIR}") endif() message(DEBUG "LIBDIR: ${ARG_LIBDIR}") _bind_genex_to_target(gx_libdir ${target} "${ARG_LIBDIR}") # Evaluate the filename genex in the context of the target: _bind_genex_to_target(gx_filename ${target} "${ARG_FILENAME}") if(IS_ABSOLUTE "${ARG_FILENAME}") set(gx_output "${gx_filename}") else() get_filename_component(gx_output "${CMAKE_CURRENT_BINARY_DIR}/${gx_filename}" ABSOLUTE) endif() message(DEBUG "Generating build-tree file: ${gx_output}") # Generate the content of the file: _generate_pkg_config_content(content NAME "${gx_name}" VERSION "${gx_version}" DESCRIPTION "${gx_desc}" PREFIX "%INSTALL_PLACEHOLDER%" LIBDIR "${gx_libdir}" GENEX_TARGET "${target}" ) _bind_genex_to_target(gx_content ${target} "${content}") string(REPLACE "%INSTALL_PLACEHOLDER%" "${CMAKE_INSTALL_PREFIX}" gx_with_prefix "${gx_content}") # Now, generate the file: file(GENERATE OUTPUT "${gx_output}" CONTENT "${gx_with_prefix}" CONDITION "${gx_cond}") if(NOT "INSTALL" IN_LIST ARGN) # Nothing more to do here. message(DEBUG "(Not installing)") return() endif() # Installation handling: # Use file(GENERATE) to generate a temporary file to be picked up at install-time. # (For some reason, injecting the content directly into install(CODE) fails in corner cases) set(gx_tmpfile "${CMAKE_CURRENT_BINARY_DIR}/_pkgconfig/${target}-$>-for-install.txt") message(DEBUG "Generate for-install: ${gx_tmpfile}") file(GENERATE OUTPUT "${gx_tmpfile}" CONTENT "${gx_content}" CONDITION "${gx_cond}") # Parse the install args that we will inspect: cmake_parse_arguments(inst "" "DESTINATION;RENAME" "" ${ARG_INSTALL}) if(NOT DEFINED inst_DESTINATION) # Install based on the libdir: set(inst_DESTINATION "${gx_libdir}/pkgconfig") endif() if(NOT DEFINED inst_RENAME) set(inst_RENAME "${ARG_FILENAME}") endif() message(DEBUG "INSTALL DESTINATION: ${inst_DESTINATION}") message(DEBUG "INSTALL RENAME: ${inst_RENAME}") # install(CODE) will write a simple temporary file: set(inst_tmp "${CMAKE_CURRENT_BINARY_DIR}/${target}-pkg-config-tmp.txt") _genex_escape(esc_cond "${ARG_CONDITION}") string(CONFIGURE [==[ $<@gx_cond@: # Installation of pkg-config for target @target@ message(STATUS "Generating pkg-config file: @inst_RENAME@") file(READ [[@gx_tmpfile@]] content) # Insert the install prefix: string(REPLACE "%INSTALL_PLACEHOLDER%" "${CMAKE_INSTALL_PREFIX}" content "${content}") # Write it before installing again. Lock the file to sync with parallel installs. file(LOCK [[@inst_tmp@.lock]] GUARD PROCESS) file(WRITE [[@inst_tmp@]] "${content}") > $<$: # Installation was disabled for this generation. message(STATUS "Skipping install of file [@inst_RENAME@]: Disabled by CONDITION “@esc_cond@â€") > ]==] code @ONLY) install(CODE "${code}") _bind_genex_to_target(gx_dest ${target} "${inst_DESTINATION}") if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.20") _bind_genex_to_target(gx_rename ${target} "${inst_RENAME}") else() # Note: CMake 3.20 is required for using generator expresssions in install(RENAME). # if we are older than that, just treat RENAME as a plain value. set(gx_rename "${inst_RENAME}") endif() # Wrap the filename to install with the same condition used to generate it. If the condition # is not met, then the FILES list will be empty, and nothing will be installed. install(FILES "$<${gx_cond}:${inst_tmp}>" DESTINATION ${gx_dest} RENAME ${gx_rename} ${inst_UNPARSED_ARGUMENTS}) endfunction() # Generates the actual content of a .pc file. function(_generate_pkg_config_content out) cmake_parse_arguments(PARSE_ARGV 1 ARG "" "PREFIX;NAME;VERSION;DESCRIPTION;GENEX_TARGET;LIBDIR" "") if(ARG_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}") endif() set(content) string(APPEND content "# pkg-config .pc file generated by CMake ${CMAKE_VERSION} for ${ARG_NAME}-${ARG_VERSION}. DO NOT EDIT!\n" "prefix=${ARG_PREFIX}\n" "exec_prefix=\${prefix}\n" "libdir=\${exec_prefix}/${gx_libdir}\n" "\n" "Name: ${ARG_NAME}\n" "Description: ${ARG_DESCRIPTION}\n" "Version: ${ARG_VERSION}" ) # Add Requires: set(requires_joiner "\nRequires: ") set(gx_requires $>) set(has_requires $>) string(APPEND content "$<${has_requires}:${requires_joiner}$>\n") string(APPEND content "\n") # Add "Libs:" set(libs) # Link options: set(gx_libs $,STATIC_LIBRARY>, # If linking static, emit the full path to the static library file \${libdir}/$, # Otherwise, link to the dynamic library namelink -L\${libdir} -l$> $> $> ) # XXX: Could we define a genex that can transform the INTERFACE_LINK_LIBRARIES to a list of # pkg-config-compatible "-l"-flags? That would remove the need to populate pkg_config_LIBS # manually, and instead rely on target properties to handle transitive dependencies. string(APPEND libs "$") # Cflags: set(cflags) set(gx_flags $>> $> ) string(APPEND cflags "$") # Definitions: set(gx_defs $>) set(has_defs $>) set(def_joiner " -D") string(APPEND cflags $<${has_defs}:${def_joiner}$>) # Includes: set(gx_inc $>) set(gx_inc "$") set(gx_abs_inc "$") set(gx_rel_inc "$") set(has_abs_inc $>) set(has_rel_inc $>) string(APPEND cflags $<${has_rel_inc}: " -I\${prefix}/" $> $<${has_abs_inc}: " -I" $>) string(APPEND content "Libs: ${libs}\n") string(APPEND content "Cflags: ${cflags}\n") set("${out}" "${content}" PARENT_SCOPE) endfunction() mongo-c-driver-2.2.1/build/cmake/GenerateUninstaller.cmake000066400000000000000000000221251511661753600235150ustar00rootroot00000000000000# This script may be executed in script mode by the uninstall target. cmake_policy(VERSION 3.15...4.0) # Avoid CMake Issue 26678: https://gitlab.kitware.com/cmake/cmake/-/issues/26678 if("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.27") cmake_policy(SET CMP0147 OLD) endif() if(NOT CMAKE_SCRIPT_MODE_FILE) # We are being included from within a project, so we should generate the install rules # The script name is "uninstall" by default: if(NOT DEFINED UNINSTALL_SCRIPT_NAME) set(UNINSTALL_SCRIPT_NAME "uninstall") endif() # We need a directory where we should install the script: if(NOT UNINSTALL_PROG_DIR) message(SEND_ERROR "We require an UNINSTALL_PROG_DIR to be defined") endif() # Platform dependent values: if(WIN32) set(_script_ext "cmd") else() set(_script_ext "sh") endif() # The script filename and path: set(_script_filename "${UNINSTALL_SCRIPT_NAME}.${_script_ext}") get_filename_component(_uninstaller_script "${CMAKE_CURRENT_BINARY_DIR}/${_script_filename}" ABSOLUTE) # Code that will do the work at install-time: string(CONFIGURE [==[ function(__generate_uninstall) set(UNINSTALL_IS_WIN32 "@WIN32@") set(UNINSTALL_WRITE_FILE "@_uninstaller_script@") set(UNINSTALL_SCRIPT_SELF "@UNINSTALL_PROG_DIR@/@_script_filename@") include("@CMAKE_CURRENT_LIST_FILE@") endfunction() __generate_uninstall() ]==] code @ONLY ESCAPE_QUOTES) install(CODE "${code}") # Add a rule to install that file: install( FILES "${_uninstaller_script}" DESTINATION "${UNINSTALL_PROG_DIR}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) # If applicable, generate an "uninstall" target to run the uninstaller: if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR OR PROJECT_IS_TOP_LEVEL) add_custom_target( uninstall COMMAND "${_uninstaller_script}" COMMENT Uninstalling... ) endif() # Stop here: The rest of the file is for install-time return() endif() if(NOT DEFINED CMAKE_INSTALL_MANIFEST_FILES) message(FATAL_ERROR "This file is only for use with CMake's install(CODE/SCRIPT) command") endif() if(NOT DEFINED UNINSTALL_WRITE_FILE) message(FATAL_ERROR "Expected a variable “UNINSTALL_WRITE_FILE†to be defined") endif() # Lock the uninstall file to synchronize with parallel install processes. file(LOCK "${UNINSTALL_WRITE_FILE}.lock" GUARD PROCESS RESULT_VARIABLE lockres) # Clear out the uninstall script before we begin writing: file(WRITE "${UNINSTALL_WRITE_FILE}" "") # Append a line to the uninstall script file. Single quotes will be replaced with doubles, # and an appropriate newline will be added. function(append_line line) string(REPLACE "'" "\"" line "${line}") file(APPEND "${UNINSTALL_WRITE_FILE}" "${line}\n") endfunction() # Ensure generated uninstall script has executable permissions. if ("${CMAKE_VERSION}" VERSION_GREATER_EQUAL "3.19.0") file ( CHMOD "${UNINSTALL_WRITE_FILE}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) else () # Workaround lack of file(CHMOD). get_filename_component(_script_filename "${UNINSTALL_WRITE_FILE}" NAME) file ( COPY "${UNINSTALL_WRITE_FILE}" DESTINATION "${_script_filename}.d" FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) file (RENAME "${_script_filename}.d/${_script_filename}" "${_script_filename}") endif () # The copyright header: set(header [[ MongoDB C Driver uninstall program, generated with CMake Copyright 2009-present MongoDB, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.]]) string(STRIP header "${header}") string(REPLACE "\n" ";" header_lines "${header}") # Prefix for the shell script: set(sh_preamble [[ set -eu __rmfile() { set -eu abs=$__prefix/$1 printf "Remove file %s: " "$abs" if test -f "$abs" || test -L "$abs" then rm -- "$abs" echo "ok" else echo "skipped: not present" fi } __rmdir() { set -eu abs=$__prefix/$1 printf "Remove directory %s: " "$abs" if test -d "$abs" then list="$(find "$abs" -mindepth 1)" if test "$list" = "" then rmdir -- "$abs" 2>/dev/null && echo "ok" || echo "skipped: not empty" fi else echo "skipped: not present" fi } ]]) # Convert the install prefix to an absolute path with the native path format: get_filename_component(install_prefix "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) file(TO_NATIVE_PATH "${install_prefix}" install_prefix) # Handling DESTDIR requires careful handling of root path redirection: set(root_path) set(relative_prefix "${install_prefix}") if(COMMAND cmake_path) cmake_path(GET install_prefix ROOT_PATH root_path) cmake_path(GET install_prefix RELATIVE_PART relative_prefix) endif() # The first lines that will be written to the script: set(init_lines) if(UNINSTALL_IS_WIN32) # Comment the header: list(TRANSFORM header_lines PREPEND "rem " REGEX "^.+$") list(TRANSFORM header_lines PREPEND "rem" REGEX "^$") # Add the preamble list(APPEND init_lines "@echo off" "" "${header_lines}" "" "if \"%DESTDIR%\"==\"\" (set __prefix=${install_prefix}) else (set __prefix=!DESTDIR!\\${relative_prefix})" "" "(GOTO) 2>nul & (") else() # Comment the header: list(TRANSFORM header_lines PREPEND "# " REGEX "^.+$") list(TRANSFORM header_lines PREPEND "#" REGEX "^$") # Add the preamble list(APPEND init_lines "#!/usr/bin/env bash" "#" "${header_lines}" "" "${sh_preamble}" "__prefix=\${DESTDIR:-}${install_prefix}" "") endif() # Add the first lines to the file: string(REPLACE ";" "\n" init "${init_lines}") append_line("${init}") # Generate a "remove a file" command function(add_rmfile filename) file(TO_NATIVE_PATH "${filename}" native) if(WIN32) set(file "%__prefix%\\${native}") set(rmfile_lines " nul && echo - ok || echo - skipped ^(non-empty?^)" " ) ELSE echo - skipped: not present" ") && (") string(REPLACE ";" "\n" rmdir "${rmdir_lines}") append_line("${rmdir}") else() append_line("__rmdir '${native}'") endif() endfunction() set(script_self "${install_prefix}/${UNINSTALL_SCRIPT_SELF}") set(dirs_to_remove) foreach(installed IN LISTS CMAKE_INSTALL_MANIFEST_FILES script_self) # Get the relative path from the prefix (the uninstaller will fix it up later) file(RELATIVE_PATH relpath "${install_prefix}" "${installed}") # Add a removal: add_rmfile("${relpath}") # Climb the path and collect directories: while("1") get_filename_component(installed "${installed}" DIRECTORY) file(TO_NATIVE_PATH "${installed}" installed) get_filename_component(parent "${installed}" DIRECTORY) file(TO_NATIVE_PATH "${parent}" parent) # Don't account for the prefix or direct children of the prefix: if(installed STREQUAL install_prefix OR parent STREQUAL install_prefix) break() endif() # Keep track of this directory for later: list(APPEND dirs_to_remove "${installed}") endwhile() endforeach() # Now generate commands to remove (empty) directories: list(REMOVE_DUPLICATES dirs_to_remove) # Order them by depth so that we remove subdirectories before their parents: list(SORT dirs_to_remove ORDER DESCENDING) foreach(dir IN LISTS dirs_to_remove) file(RELATIVE_PATH relpath "${install_prefix}" "${dir}") add_rmdir("${relpath}") endforeach() # Allow the batch script delete itself without error. if(WIN32) append_line(" ver>nul") append_line(")") endif() message(STATUS "Generated uninstaller: ${UNINSTALL_WRITE_FILE}") mongo-c-driver-2.2.1/build/cmake/LLDLinker.cmake000066400000000000000000000054021511661753600213210ustar00rootroot00000000000000#[[ This module conditionally enables -fuse-ld=lld if it is supported by the compiler. This is purely for build performance, and has no apparent effect on the generated code. LLD is *significantly* faster to link and produces significantly better link-time error diagnostics. LLD linking will be automatically enabled if it is supported, but can be forced on or off by setting the MONGO_USE_LLD CMake option to ON or OFF. ]] if (NOT COMMAND add_link_options) # This only works on new-enough versions of CMake that support LINK_OPTIONS as # a separate configuration entity return () endif () include (CMakePushCheckState) include (CheckCSourceCompiles) cmake_push_check_state (RESET) # Newer GNU compilers support lld with the '-fuse-ld=lld' flag. set (CMAKE_REQUIRED_FLAGS "-fuse-ld=lld") set (CMAKE_REQUIRED_LINK_OPTIONS "-fuse-ld=lld") check_c_source_compiles ([[ #include int main (void) { puts ("Hello, world!"); return 0; } ]] HAVE_LLD_LINKER_SUPPORT) cmake_pop_check_state () if (HAVE_LLD_LINKER_SUPPORT) # Expose an option to toggle usage of lld option (MONGO_USE_LLD "Link runtime binaries using LLVM's lld linker" ON) elseif (NOT DEFINED _MONGO_LD_LLD_LINKER) # We don't have -fuse-lld support, but that might be because of a misconfig in # the environment. Issue a *one-time* diagnostic telling the user if they *almost* # have LLD support. This branch is only for diagnostic purposes. find_program (_MONGO_LD_LLD_LINKER NAMES ld.lld ld.lld-13 ld.lld-12 ld.lld-11 ld.lld-10 ld.lld-9 ld.lld-8 ld.lld-7 ld.lld-6 ld.lld-5 ) mark_as_advanced (_MONGO_LD_LLD_LINKER) # If we found one, we are compiling with GCC, *and* the found lld has a version suffix, issue a message # telling the user how they might be able to get lld work. if (_MONGO_LD_LLD_LINKER AND CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT _MONGO_LD_LLD_LINKER MATCHES "ld.lld$") message (STATUS "NOTE: A GNU-compatible lld linker was found (${_MONGO_LD_LLD_LINKER}), but support from GCC requires that") message (STATUS " the 'ld.lld' binary be named *exactly* 'ld.lld' (without a version suffix!)") message (STATUS " To enable 'lld' support, try creating a symlink of 'ld.lld' somewhere on your PATH that points") message (STATUS " to '${_MONGO_LD_LLD_LINKER}'") endif () endif () if (MONGO_USE_LLD) message (STATUS "Linking using LLVM lld. Disable by setting MONGO_USE_LLD to OFF") # We only tested with C, so only use LLD on C (some platforms don't support lld with g++) # XXX: This should use $ when we can require CMake 3.18+ add_link_options ($<$:-fuse-ld=lld>) endif () mongo-c-driver-2.2.1/build/cmake/LoadTests.cmake000066400000000000000000000071711511661753600214500ustar00rootroot00000000000000# This file is include()'d by CTest. It executes test-libmongoc to get a list # of all tests that are registered. Each test is then defined as a CTest test, # allowing CTest to control the execution, parallelization, and collection of # test results. if(NOT EXISTS "${TEST_LIBMONGOC_EXE}") # This will fail if 'test-libmongoc' is not compiled yet. message(WARNING "The test executable ${TEST_LIBMONGOC_EXE} is not present. " "Its tests will not be registered") add_test(mongoc/not-found NOT_FOUND) return() endif() # Get the list of tests. This command emits CMake code that defines variables for # all test cases defined in the suite execute_process( COMMAND "${TEST_LIBMONGOC_EXE}" --tests-cmake --no-fork OUTPUT_VARIABLE tests_cmake WORKING_DIRECTORY "${SRC_ROOT}" RESULT_VARIABLE retc ) if(retc) # Failed to list the tests. That's bad. message(FATAL_ERROR "Failed to run test-libmongoc to discover tests [${retc}]:\n${tests_out}") endif() # Execute the code that defines the test case information cmake_language(EVAL CODE "${tests_cmake}") # Define environment variables that are common to all test cases set(all_env TEST_KMS_PROVIDER_HOST=localhost:14987 # Refer: Fixtures.cmake ) function(list_select list_var) cmake_parse_arguments(PARSE_ARGV 1 arg "" "SELECT;REPLACE;OUT" "") set(seq "${${list_var}}") list(FILTER seq INCLUDE REGEX "${arg_SELECT}") list(TRANSFORM seq REPLACE "${arg_SELECT}" "${arg_REPLACE}") set("${arg_OUT}" "${seq}" PARENT_SCOPE) endfunction() # The emitted code defines a list MONGOC_TESTS with the name of every test case # in the suite. foreach(casename IN LISTS MONGOC_TESTS) set(name "mongoc${casename}") # Run the program with --ctest-run to select only this one test case add_test("${name}" "${TEST_LIBMONGOC_EXE}" --ctest-run "${casename}") # The emitted code defines a TAGS list for every test case that it emits. We use # these as the LABELS for the test case unset(labels) set(labels "${MONGOC_TEST_${casename}_TAGS}") # Find what test fixtures the test wants by inspecting labels. Each "uses:" # label defines the names of the test fixtures that a particular case requires list_select(labels SELECT "^uses:(.*)$" REPLACE "mongoc/fixtures/\\1" OUT fixtures) # For any "lock:..." labels, add a resource lock with the corresponding name list_select(labels SELECT "^lock:(.*)$" REPLACE "\\1" OUT locks) # Tests can set a timeout with a tag: list_select(labels SELECT "^timeout:(.*)$" REPLACE "\\1" OUT timeout) if(NOT timeout) # Default timeout of 10 seconds. If a test takes longer than this, it either # has a bug or it needs to declare a longer timeout. set(timeout 10) endif() # Add a label for all test cases generated via this script so that they # can be (de)selected separately: list(APPEND labels test-libmongoc-generated) # Set up the test: set_tests_properties("${name}" PROPERTIES # test-libmongoc expects to execute in the root of the source directory WORKING_DIRECTORY "${SRC_ROOT}" # If a test emits '@@ctest-skipped@@', this tells us that the test is # skipped. SKIP_REGULAR_EXPRESSION "@@ctest-skipped@@" # Apply a timeout to each test, either the default or one from test tags TIMEOUT "${timeout}" # Common environment variables: ENVIRONMENT "${all_env}" # Apply the labels LABELS "${labels}" # Fixture requirements: FIXTURES_REQUIRED "${fixtures}" # Test may lock resources: RESOURCE_LOCK "${locks}" ) endforeach() mongo-c-driver-2.2.1/build/cmake/LoadVersion.cmake000066400000000000000000000040061511661753600217650ustar00rootroot00000000000000function (LoadVersion FILEPATH PREFIX) # E.g., "MONGOC_VERSION". string (REPLACE ";" "" VERSION_NAME ${PREFIX} _VERSION) string (REPLACE ";" "" DIST_VERSION_NAME ${PREFIX} _DIST_VERSION) file (STRINGS ${FILEPATH} VERSION_CONTENTS) # A list of version components separated by dots and dashes: "1.3.0-[prerelease-marker]" string (REGEX MATCHALL "[^.-]+" VERSION ${VERSION_CONTENTS}) list (GET VERSION 0 MAJOR_VERSION) string (REPLACE ";" "" MAJOR_VERSION_NAME ${PREFIX} _MAJOR_VERSION) set (${MAJOR_VERSION_NAME} ${MAJOR_VERSION} PARENT_SCOPE) list (GET VERSION 1 MINOR_VERSION) string (REPLACE ";" "" MINOR_VERSION_NAME ${PREFIX} _MINOR_VERSION) set (${MINOR_VERSION_NAME} ${MINOR_VERSION} PARENT_SCOPE) list (GET VERSION 2 MICRO_VERSION) string (REPLACE ";" "" MICRO_VERSION_NAME ${PREFIX} _MICRO_VERSION) set (${MICRO_VERSION_NAME} ${MICRO_VERSION} PARENT_SCOPE) string (REPLACE ";" "" PRERELEASE_VERSION_NAME ${PREFIX} _PRERELEASE_VERSION) string (REPLACE ";" "" PRERELEASE_DIST_VERSION_NAME ${PREFIX} _PRERELEASE_DIST_VERSION) list (LENGTH VERSION VERSION_LENGTH) if (VERSION_LENGTH GREATER 3) list (GET VERSION 3 PRERELEASE_VERSION) set (${PRERELEASE_DIST_VERSION_NAME} ${PRERELEASE_VERSION} PARENT_SCOPE) set (${PRERELEASE_VERSION_NAME} "pre" PARENT_SCOPE) set (${VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}-pre" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}-${PRERELEASE_VERSION}" PARENT_SCOPE) else () set (${PRERELEASE_DIST_VERSION_NAME} "" PARENT_SCOPE) set (${PRERELEASE_VERSION_NAME} "" PARENT_SCOPE) set (${VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}" PARENT_SCOPE) endif () endfunction (LoadVersion) mongo-c-driver-2.2.1/build/cmake/MongoC-Warnings.cmake000066400000000000000000000110461511661753600225120ustar00rootroot00000000000000#[[ This file sets warning options in the "mongoc-warning-options" variable when included. These warnings are intended to be ported to each supported platform, and especially for high-value warnings that are very likely to catch latent bugs early in the process before the code is even run. ]] #[[ Appends additional compile options to the "mongoc-warning-options" variable, conditioned on the compiler being used. Each option should be prefixed by `gnu:`, `clang:`, `msvc:`, or `gnu-like:`. Those options will be conditionally enabled for GCC, Clang, or MSVC. ]] function (mongoc_add_warning_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) # Conditional prefixes: set(cond/gnu $) set(cond/llvm-clang $) set(cond/apple-clang $) set(cond/clang $) set(cond/gnu-like $) set(cond/msvc $) set(cond/lang-c $) # "Old" GNU is GCC < 5, which is missing several warning options set(cond/gcc-lt5 $,5>>) set(cond/gcc-lt7 $,7>>) set(cond/gcc-lt8 $,8>>) set(cond/gcc-lt11 $,11>>) set(cond/clang-lt4 $,4>>) set(cond/clang-lt10 $,10>>) set(cond/clang-lt19 $,19>>) # Process options: foreach (opt IN LISTS ARGV) # Replace prefixes. Matches right-most first: while (opt MATCHES "(.*)(^|:)([a-z0-9-]+):(.*)") set(before "${CMAKE_MATCH_1}${CMAKE_MATCH_2}") set(prefix "${CMAKE_MATCH_3}") set(suffix "${CMAKE_MATCH_4}") message(TRACE "Substitution: prefix “${prefix}†in “${opt}â€, suffix is “${suffix}â€") set(cond "cond/${prefix}") set(not 0) if(prefix MATCHES "^not-(.*)") set(cond "cond/${CMAKE_MATCH_1}") set(not 1) endif() if(DEFINED "${cond}") set(expr "${${cond}}") if(not) set(expr "$") endif() set(opt "$<${expr}:${suffix}>") else () message (SEND_ERROR "Unknown option prefix to ${CMAKE_CURRENT_FUNCTION}(): “${prefix}†in “${opt}â€") break() endif () set(opt "${before}${opt}") message(TRACE "Become: ${opt}") endwhile () list(APPEND mongoc-warning-options "${opt}") endforeach () set(mongoc-warning-options "${mongoc-warning-options}" PARENT_SCOPE) endfunction () set (is_c_lang "$") set (mongoc-warning-options "") # These below warnings should always be unconditional hard errors, as the code is # almost definitely broken mongoc_add_warning_options ( # Implicit function or variable declarations gnu-like:lang-c:-Werror=implicit msvc:/we4013 msvc:/we4431 # Missing return types/statements gnu-like:-Werror=return-type msvc:/we4716 # Incompatible pointer types gnu-like:lang-c:not-gcc-lt5:-Werror=incompatible-pointer-types msvc:/we4113 # Integral/pointer conversions gnu-like:lang-c:not-gcc-lt5:-Werror=int-conversion msvc:/we4047 # Discarding qualifiers gnu:lang-c:not-gcc-lt5:-Werror=discarded-qualifiers clang:lang-c:-Werror=ignored-qualifiers msvc:/we4090 # Definite use of uninitialized value gnu-like:-Werror=uninitialized msvc:/we4700 # Format strings. gnu-like:-Werror=format gnu-like:-Werror=format=2 # GCC does not document the full list of warnings enabled by -Wformat. # For assurance, explicitly include those not listed by -Wformat or -Wformat=2. gnu:not-gcc-lt11:-Werror=format-diag gnu:not-gcc-lt8:-Werror=format-overflow=2 gnu:not-gcc-lt5:-Werror=format-signedness gnu:not-gcc-lt8:-Werror=format-truncation=2 # Clang does not include several flags in `-Wformat` or `-Wformat=2`. # For assurance, explicitly include those not listed by -Wformat or -Wformat=2. clang:-Werror=format-non-iso clang:not-clang-lt4:-Werror=format-pedantic clang:not-clang-lt19:-Werror=format-signedness clang:not-clang-lt10:-Werror=format-type-confusion # Aside: Disable CRT insecurity warnings msvc:/D_CRT_SECURE_NO_WARNINGS ) mongo-c-driver-2.2.1/build/cmake/MongoPlatform.cmake000066400000000000000000000067701511661753600223360ustar00rootroot00000000000000#[[ Defines a target mongo::detail::c_platform (alias of _mongo-platform), which exposes system-level supporting compile and link usage requirements. All targets should link to this target with level PUBLIC. Use mongo_platform_compile_options and mongo_platform_link_options to add usage requirements to this library. The mongo::detail::c_platform library is installed and exported with the mongo-platform-targets export set as an implementation detail. It is installed with this export set so that it is available to both libbson and libmongoc (attempting to install this target in both mongo-platform-targets and mongoc-targets export sets would lead to duplicate definitions of mongo::detail::c_platform for downstream users). ]] add_library(_mongo-platform INTERFACE) if (NOT USE_SYSTEM_LIBBSON) add_library(mongo::detail::c_platform ALIAS _mongo-platform) else () # The system libbson exports the `mongo::detail::c_platform` target. # Do not define the `mongo::detail::c_platform` target, to prevent an "already defined" error. endif () set_property(TARGET _mongo-platform PROPERTY EXPORT_NAME mongo::detail::c_platform) # This export set is installed as part of libbson. Search: PLATFORM-EXPORT-TARGET-INSTALL install(TARGETS _mongo-platform EXPORT mongo-platform-targets) #[[ Define additional platform-support compile options These options are added to the mongo::detail::c_platform INTERFACE library. ]] function (mongo_platform_compile_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support compilation options: ${ARGN}") target_compile_options(_mongo-platform INTERFACE ${ARGN}) endfunction () #[[ Define additional platform-support link options. These options are added to the mongo::detail::c_platform INTERFACE library. ]] function(mongo_platform_link_options) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support runtime linking options: ${ARGN}") target_link_options(_mongo-platform INTERFACE ${ARGN}) endfunction() #[[ Add targets to the usage requirements for the current platform. All of the named items must be the names of existing targets. Note that these targets will also need to be available at import-time for consumers (unless wrapped in $). ]] function(mongo_platform_use_target) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) message(DEBUG "Add platform-support usage of targets: ${ARGN}") foreach(item IN LISTS ARGN) if(item MATCHES "::") # CMake will enforce that this link names an existing target target_link_libraries(_mongo-platform INTERFACE "${item}") else() # Generate a configure-time-error if the named item is not the name of a target target_link_libraries(_mongo-platform INTERFACE $,${item},NO_SUCH_TARGET::${item}>) endif() endforeach() endfunction() #[[ Add non-target link library as usage requirements for the current platform. This is intended for adding libraries that need to be linked. To add targets as usage requirements, use mongo_platform_use_target. For adding link options, use mongo_platform_link_options. ]] function(mongo_platform_link_libraries) list(APPEND CMAKE_MESSAGE_CONTEXT ${CMAKE_CURRENT_FUNCTION}) foreach(item IN LISTS ARGN) message(DEBUG "Add platform-support link library: ${item}") target_link_libraries(_mongo-platform INTERFACE "${item}") endforeach() endfunction() mongo-c-driver-2.2.1/build/cmake/MongoSettings.cmake000066400000000000000000000336411511661753600223470ustar00rootroot00000000000000include_guard(DIRECTORY) #[[ Bool: Set to TRUE if the environment variable MONGODB_DEVELOPER is a true value ]] set(MONGODB_DEVELOPER FALSE) # Detect developer mode: set(_is_dev "$ENV{MONGODB_DEVELOPER}") if(_is_dev) message(STATUS "Enabling MONGODB_DEVELOPER ðŸƒ") set(MONGODB_DEVELOPER TRUE) endif() #[==[ Define a new configure-time build setting:: mongo_setting( [TYPE ] [DEFAULT [[DEVEL] [VALUE | EVAL ]] ...] [OPTIONS [ ...]] [VALIDATE [CODE ]] [VISIBLE_IF ] [ADVANCED] ) The `` will be the name of the setting, while `` will be the documentation string shown to the user. Newlines in the doc string will be replaced with single spaces. If no other arguments are provided, the default `TYPE` will be `STRING`, and the DEFAULT value will be an empty string. If the previous cached value is AUTO, and AUTO is not listed in OPTIONS, then the cache value will be cleared and reset to the default value. Package maintainers Note: Setting a variable `-FORCE` to TRUE will make this function a no-op. TYPE - Sets the type for the generated cache variable. If the type is BOOL, this call will validate that the setting is a valid boolean value. OPTIONS [ [...]] - Specify the valid set of values available for this setting. This will set the STRINGS property on the cache variable and add an information message to the doc string. This call will also validate that the setting's value is one of these options, failing with an error if it is not. DEFAULT [[DEVEL] [VALUE | EVAL ]] [...] - Specify the default value(s) of the generated variable. If given VALUE, then `` will be used as the default, otherwise if given EVAL, `` will be executed and is expected to define a variable DEFAULT that will contain the default value. An optional DEVEL qualifier may be given before a default value specifier. If both qualified and unqualified defaults are given, the unqualified default must appear first in the argument list. - If MONGODB_DEVELOPER is not true, then the non-qualified default will be used. (If no non-qualified defaults are provided, then the default value is an empty string.) - Otherwise, If DEVEL defaults are provided and MONGODB_DEVELOPER is true, then the DEVEL defaults will be used. VALIDATE [CODE ] - If specified, then `` will be evaluated after the setting value is defined. `` may issue warnings and errors about the value of the setting. ADVANCED - If specified, the cache variable will be marked as an advanced setting VISIBLE_IF - If specified, then `` should be a quoted CMake condition (e.g. [[FOO AND NOT BAR]]). If the condition evaluates to a false value, then the setting will be hidden from the user. NOTE that the setting will still retain its original value and be available as a variable in the CMake code! ]==] function(mongo_setting setting_NAME setting_DOC) list(APPEND CMAKE_MESSAGE_CONTEXT mongo setting "${setting_NAME}") # Allow bypassing this code: set(force "${${setting_NAME}-FORCE}") if(force) return() endif() cmake_parse_arguments( PARSE_ARGV 2 setting "ADVANCED" "TYPE;VISIBLE_IF" "OPTIONS;DEFAULT;VALIDATE") # Check for unknown arguments: foreach(arg IN LISTS setting_UNPARSED_ARGUMENTS) message(SEND_ERROR "Unrecognized argument: “${arg}â€") endforeach() if(setting_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unrecognized arguments (see above)") endif() # By default, settings are strings: if(NOT DEFINED setting_TYPE) set(setting_TYPE STRING) endif() # More arg validation: if(setting_TYPE STREQUAL "BOOL") if(DEFINED setting_OPTIONS) message(FATAL_ERROR [["OPTIONS" cannot be specified with type "BOOL"]]) endif() endif() # Normalize the doc string for easier writing of doc strings at call sites: string(REGEX REPLACE "\n[ ]*" " " doc "${setting_DOC}") # Update the doc string with options: if(DEFINED setting_OPTIONS) string(REPLACE ";" ", " opts "${setting_OPTIONS}") string(APPEND doc " (Options: ${opts})") endif() # Get the default option value: unset(DEFAULT) if(DEFINED setting_DEFAULT) _mongo_compute_default(DEFAULT "${setting_DEFAULT}") endif() if(DEFINED DEFAULT) # Add that to the doc message: string(APPEND doc " (Default is “${DEFAULT}â€)") # Check that the default is actually a valid option: if(DEFINED setting_OPTIONS AND NOT DEFAULT IN_LIST setting_OPTIONS) message(AUTHOR_WARNING "${setting_NAME}: Setting's default value is “${DEFAULT}â€, which is not one of the provided setting options (${opts})") endif() # Reset "AUTO" values to the default if(NOT "AUTO" IN_LIST setting_OPTIONS AND "$CACHE{${setting_NAME}}" STREQUAL "AUTO") message(WARNING "Replacing old ${setting_NAME}=“AUTO†with the new default value ${setting_NAME}=“${DEFAULT}â€") unset("${setting_NAME}" CACHE) endif() endif() # Detect the previous value unset(prev_val) if(DEFINED "CACHE{${setting_NAME}-PREV}") set(prev_val "$CACHE{${setting_NAME}-PREV}") message(DEBUG "Detected previous value was “${prev_val}â€") elseif(DEFINED "CACHE{${setting_NAME}}") message(DEBUG "Externally defined to be “${${setting_NAME}}â€") else() message(DEBUG "No previous value detected") endif() # Actually define it now: set("${setting_NAME}" "${DEFAULT}" CACHE "${setting_TYPE}" "${doc}") # Variable properties: set_property(CACHE "${setting_NAME}" PROPERTY HELPSTRING "${doc}") set_property(CACHE "${setting_NAME}" PROPERTY TYPE "${setting_TYPE}") set_property(CACHE "${setting_NAME}" PROPERTY ADVANCED "${setting_ADVANCED}") if(setting_OPTIONS) set_property(CACHE "${setting_NAME}" PROPERTY STRINGS "${setting_OPTIONS}") endif() # Report what we set: if(NOT DEFINED prev_val) message(VERBOSE "Setting: ${setting_NAME} := “${${setting_NAME}}â€") elseif("${${setting_NAME}}" STREQUAL prev_val) message(DEBUG "Setting: ${setting_NAME} := “${${setting_NAME}}†(Unchanged)") else() message(VERBOSE "Setting: ${setting_NAME} := “${${setting_NAME}}†(Old value was “${prev_val}â€)") endif() set("${setting_NAME}-PREV" "${${setting_NAME}}" CACHE INTERNAL "Prior value of ${setting_NAME}") # Validation of options: if((DEFINED setting_OPTIONS) AND (NOT ("${${setting_NAME}}" IN_LIST setting_OPTIONS))) message(FATAL_ERROR "The value of “${setting_NAME}†must be one of [${opts}] (Got ${setting_NAME}=“${${setting_NAME}}â€)") endif() string(TOUPPER "${${setting_NAME}}" curval) if(setting_TYPE STREQUAL "BOOL" AND NOT curval MATCHES "^(1|0|ON|OFF|YES|NO|TRUE|FALSE|Y|N|IGNORE)$") message(WARNING "The value of ${setting_NAME}=“${${setting_NAME}}†is not a regular boolean value") endif() # Custom validation: if(DEFINED setting_VALIDATE) cmake_parse_arguments(validate "" "CODE" "" ${setting_VALIDATE}) if(DEFINED validate_CODE) _mongo_eval_cmake("" "${validate_CODE}") endif() if(validate_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unrecognized VALIDATE options: ${validate_UNPARSED_ARGUMENTS}") endif() endif() if(DEFINED setting_VISIBLE_IF) string(JOIN "\n" code "set(avail FALSE)" "if(${setting_VISIBLE_IF})" " set(avail TRUE)" "endif()") _mongo_eval_cmake(avail "${code}") if(NOT avail) # Hide the option by making it INTERNAL set_property(CACHE "${setting_NAME}" PROPERTY TYPE INTERNAL) endif() endif() endfunction() #[[ Implements DEFAULT setting value logic ]] function(_mongo_compute_default outvar arglist) list(APPEND CMAKE_MESSAGE_CONTEXT default) # Clear the value in the caller: unset("${outvar}" PARENT_SCOPE) # Parse arguments: cmake_parse_arguments(dflt "" "" "DEVEL" ${arglist}) # Developer-mode options: if(DEFINED dflt_DEVEL AND MONGODB_DEVELOPER) list(APPEND CMAKE_MESSAGE_CONTEXT "devel") _mongo_compute_default(tmp "${dflt_DEVEL}") message(DEBUG "Detected MONGODB_DEVELOPER: Default of ${setting_NAME} is “${tmp}â€") set("${outvar}" "${tmp}" PARENT_SCOPE) return() endif() # Parse everything else: set(other_args "${dflt_UNPARSED_ARGUMENTS}") cmake_parse_arguments(dflt "" "VALUE;EVAL" "" ${other_args}) if(DEFINED dflt_VALUE) # Simple value for the default if(DEFINED dflt_EVAL) message(FATAL_ERROR "Only one of VALUE or EVAL may be specified for a DEFAULT") endif() set("${outvar}" "${dflt_VALUE}" PARENT_SCOPE) elseif(DEFINED dflt_EVAL) # Evaluate some code to determine the default _mongo_eval_cmake(DEFAULT "${dflt_EVAL}") set("${outvar}" "${DEFAULT}" PARENT_SCOPE) if(DEFINED DEFAULT) message(DEBUG "Computed default ${setting_NAME} value to be “${DEFAULT}â€") else() message(DEBUG "No default for ${setting_NAME} was computed. Default will be an empty string.") endif() elseif(dflt_UNPARSED_ARGUMENTS) message(FATAL_ERROR "${setting_NAME}: " "DEFAULT got unexpected arguments: ${dflt_UNPARSED_ARGUMENTS}") endif() endfunction() #[==[ Define a new boolean build setting:: mongo_bool_setting( [DEFAULT [[DEVEL] [VALUE | EVAL ]] ...] [VALIDATE [CODE ]] [ADVANCED] ) This is a shorthand for defining a boolean setting. See mongo_setting() for more option information. The TYPE of the setting will be BOOL, and the implicit default value for the setting will be ON if no DEFAULT is provided. ]==] function(mongo_bool_setting name doc) set(args ${ARGN}) # Inject "ON" as a default: if(NOT "DEFAULT" IN_LIST args) list(APPEND args DEFAULT VALUE ON) endif() mongo_setting("${name}" "${doc}" TYPE BOOL ${args}) endfunction() # Set the variable named by 'out' to the 'if_true' or 'if_false' value based on 'cond' function(mongo_pick out if_true if_false cond) string(REPLACE "'" "\"" cond "${cond}") mongo_bool01(b "${cond}") if(b) set("${out}" "${if_true}" PARENT_SCOPE) else() set("${out}" "${if_false}" PARENT_SCOPE) endif() endfunction() # Evaluate CMake code , and lift the given variables into the caller's scope. function(_mongo_eval_cmake get_variables code) # Set a name that is unlikely to collide: set(__eval_liftvars "${get_variables}") # Clear the values before we evaluate the code: foreach(__varname IN LISTS __eval_liftvars) unset("${__varname}" PARENT_SCOPE) unset("${__varname}") endforeach() # We do the "eval" the old fashion way, since we can't yet use cmake_language() message(TRACE "Evaluating CMake code:\n\n${code}") file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/_eval.tmp.cmake" "${code}") include("${CMAKE_CURRENT_BINARY_DIR}/_eval.tmp.cmake") # Lift the variables into the caller's scope foreach(__varname IN LISTS __eval_liftvars) if(DEFINED "${__varname}") message(TRACE "Eval variable result: ${__varname}=${${__varname}}") set("${__varname}" "${${__varname}}" PARENT_SCOPE) endif() endforeach() endfunction() #[==[ mongo_bool01( ) Evaluate a condition and store the boolean result as a "0" or a "1". Parameters: - The name of the variable to define in the caller's scope. - `...cond` The condition to evaluate. It must be a single string that contains wraps the syntax of a CMake `if()` command Example: Evaluate Boolean Logic ############################### mongo_bool01(is_mingw [[WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU"]]) Note the quoting and use of [[]]-bracket strings ]==] function(mongo_bool01 var code) if(ARGN) message(FATAL_ERROR "Too many arguments passed to mongo_bool01") endif() string(CONCAT fullcode "if(${code})\n" " set(bool 1)\n" "else()\n" " set(bool 0)\n" "endif()\n") _mongo_eval_cmake(bool "${fullcode}") set("${var}" "${bool}" PARENT_SCOPE) endfunction() #[==[ Append usage requirement properties to a set of targets. mongo_target_requirements( [ [...]] [INCLUDE_DIRECTORIES [spec...]] [LINK_LIBRARIES [spec...]] [COMPILE_DEFINITIONS [spec...]] [COMPILE_OPTIONS [spec...]] [LINK_OPTIONS [spec...]] [SOURCES [spec...]] ) ]==] function(mongo_target_requirements) set(properties INCLUDE_DIRECTORIES LINK_LIBRARIES COMPILE_DEFINITIONS COMPILE_OPTIONS LINK_OPTIONS SOURCES ) cmake_parse_arguments(PARSE_ARGV 0 ARG "" "" "${properties}") foreach(target IN LISTS ARG_UNPARSED_ARGUMENTS) if(ARG_INCLUDE_DIRECTORIES) target_include_directories("${target}" ${ARG_INCLUDE_DIRECTORIES}) endif() if(ARG_LINK_LIBRARIES) target_link_libraries("${target}" ${ARG_LINK_LIBRARIES}) endif() if(ARG_COMPILE_DEFINITIONS) target_compile_definitions("${target}" ${ARG_COMPILE_DEFINITIONS}) endif() if(ARG_COMPILE_OPTIONS) target_compile_options("${target}" ${ARG_COMPILE_OPTIONS}) endif() if(ARG_LINK_OPTIONS) target_link_options("${target}" ${ARG_LINK_OPTIONS}) endif() if(ARG_SOURCES) target_sources("${target}" ${ARG_SOURCES}) endif() endforeach() endfunction() mongo-c-driver-2.2.1/build/cmake/ParseVersion.cmake000066400000000000000000000036531511661753600221670ustar00rootroot00000000000000function (ParseVersion VERSION_CONTENTS PREFIX) # E.g., "MONGOC_VERSION". string (REPLACE ";" "" VERSION_NAME ${PREFIX} _VERSION) string (REPLACE ";" "" DIST_VERSION_NAME ${PREFIX} _DIST_VERSION) # A list of version components separated by dots and dashes: "1.3.0-[prerelease-marker]" string (REGEX MATCHALL "[^.-]+" VERSION ${VERSION_CONTENTS}) list (GET VERSION 0 VERSION_MAJOR) string (REPLACE ";" "" VERSION_MAJOR_NAME ${PREFIX} _VERSION_MAJOR) set (${VERSION_MAJOR_NAME} ${VERSION_MAJOR} PARENT_SCOPE) list (GET VERSION 1 VERSION_MINOR) string (REPLACE ";" "" VERSION_MINOR_NAME ${PREFIX} _VERSION_MINOR) set (${VERSION_MINOR_NAME} ${VERSION_MINOR} PARENT_SCOPE) list (GET VERSION 2 VERSION_PATCH) string (REPLACE ";" "" VERSION_PATCH_NAME ${PREFIX} _VERSION_PATCH) set (${VERSION_PATCH_NAME} ${VERSION_PATCH} PARENT_SCOPE) string (REPLACE ";" "" VERSION_EXTRA_NAME ${PREFIX} _VERSION_EXTRA) string (REPLACE ";" "" VERSION_DIST_EXTRA_NAME ${PREFIX} _VERSION_DIST_EXTRA) list (LENGTH VERSION VERSION_LENGTH) if (VERSION_LENGTH GREATER 3) list (GET VERSION 3 VERSION_EXTRA) set (${VERSION_DIST_EXTRA_NAME} "-${VERSION_EXTRA}" PARENT_SCOPE) set (${VERSION_EXTRA_NAME} "-pre" PARENT_SCOPE) set (${VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-pre" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_EXTRA}" PARENT_SCOPE) else () set (${VERSION_DIST_EXTRA_NAME} "" PARENT_SCOPE) set (${VERSION_EXTRA_NAME} "" PARENT_SCOPE) set (${VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" PARENT_SCOPE) set (${DIST_VERSION_NAME} "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" PARENT_SCOPE) endif () endfunction (ParseVersion) mongo-c-driver-2.2.1/build/cmake/ResSearch.cmake000066400000000000000000000056431511661753600214270ustar00rootroot00000000000000include(CheckSymbolExists) include(CMakePushCheckState) cmake_push_check_state() # The name of the library that performs name resolution, suitable for giving to the "-l" link flag set(RESOLVE_LIB_NAME) # If TRUE, then the C runtime provides the name resolution that we need set(resolve_is_libc FALSE) if(WIN32) set(RESOLVE_LIB_NAME Dnsapi) set(_MONGOC_HAVE_DNSAPI 1) else() # Try to find the search functions for various configurations. # Headers required by minimum on the strictest system: (Tested on FreeBSD 13) set(resolve_headers netinet/in.h sys/types.h arpa/nameser.h resolv.h) set(CMAKE_REQUIRED_LIBRARIES resolv) check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_RESOLV) check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_RESOLV) check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_RESOLV) check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_RESOLV) if( (_MONGOC_HAVE_RES_NSEARCH_RESOLV AND (_MONGOC_HAVE_RES_NDESTROY_RESOLV OR _MONGOC_HAVE_RES_NCLOSE_RESOLV)) OR _MONGOC_HAVE_RES_SEARCH_RESOLV ) set(RESOLVE_LIB_NAME resolv) else() # Can we use name resolution with just libc? unset(CMAKE_REQUIRED_LIBRARIES) check_symbol_exists(res_nsearch "${resolve_headers}" _MONGOC_HAVE_RES_NSEARCH_NOLINK) check_symbol_exists(res_search "${resolve_headers}" _MONGOC_HAVE_RES_SEARCH_NOLINK) check_symbol_exists(res_ndestroy "${resolve_headers}" _MONGOC_HAVE_RES_NDESTROY_NOLINK) check_symbol_exists(res_nclose "${resolve_headers}" _MONGOC_HAVE_RES_NCLOSE_NOLINK) if( (_MONGOC_HAVE_RES_NSEARCH_NOLINK AND (_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_NOLINK)) OR _MONGOC_HAVE_RES_SEARCH_NOLINK ) set(resolve_is_libc TRUE) message(VERBOSE "Name resolution is provided by the C runtime") endif() endif() endif() mongo_pick(MONGOC_HAVE_DNSAPI 1 0 _MONGOC_HAVE_DNSAPI) mongo_pick(MONGOC_HAVE_RES_NSEARCH 1 0 [[_MONGOC_HAVE_RES_NSEARCH_NOLINK OR _MONGOC_HAVE_RES_NSEARCH_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_SEARCH 1 0 [[_MONGOC_HAVE_RES_SEARCH_NOLINK OR _MONGOC_HAVE_RES_SEARCH_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_NDESTROY 1 0 [[_MONGOC_HAVE_RES_NDESTROY_NOLINK OR _MONGOC_HAVE_RES_NDESTROY_RESOLV]]) mongo_pick(MONGOC_HAVE_RES_NCLOSE 1 0 [[_MONGOC_HAVE_RES_NCLOSE_NOLINK OR _MONGOC_HAVE_RES_NCLOSE_RESOLV]]) if(RESOLVE_LIB_NAME OR resolve_is_libc) # Define the resolver interface: add_library(_mongoc-resolve INTERFACE) add_library(mongo::detail::c_resolve ALIAS _mongoc-resolve) set_target_properties(_mongoc-resolve PROPERTIES INTERFACE_LINK_LIBRARIES "${RESOLVE_LIB_NAME}" EXPORT_NAME detail::c_resolve) install(TARGETS _mongoc-resolve EXPORT mongoc-targets) endif() cmake_pop_check_state() mongo-c-driver-2.2.1/build/cmake/Sanitizers.cmake000066400000000000000000000036661511661753600217060ustar00rootroot00000000000000include (CheckCSourceCompiles) include (CMakePushCheckState) include (MongoSettings) mongo_setting ( MONGO_SANITIZE "Semicolon/comma-separated list of sanitizers to apply when building" DEFAULT DEVEL EVAL [[ if(NOT MSVC) set(DEFAULT "address,undefined") endif() ]]) mongo_bool_setting( MONGO_FUZZ "Enable libFuzzer integration (Requires a C++ compiler)" DEFAULT VALUE OFF VALIDATE CODE [[ if (MONGO_FUZZ AND NOT ENABLE_STATIC) message (FATAL_ERROR "MONGO_FUZZ requires ENABLE_STATIC=ON or ENABLE_STATIC=BUILD_ONLY") endif () ]] ) if (MONGO_FUZZ) set(mongo_fuzz_options "address,undefined,fuzzer-no-link") if (MONGO_SANITIZE AND NOT "${MONGO_SANITIZE}" STREQUAL "${mongo_fuzz_options}") message(WARNING "Overriding user-provided MONGO_SANITIZE options due to MONGO_FUZZ=ON") endif () set_property (CACHE MONGO_SANITIZE PROPERTY VALUE "${mongo_fuzz_options}") endif () # Replace commas with semicolons for the genex string(REPLACE ";" "," _sanitize "${MONGO_SANITIZE}") if (_sanitize) string (MAKE_C_IDENTIFIER "HAVE_SANITIZE_${_sanitize}" ident) string (TOUPPER "${ident}" varname) set (flag -fsanitize=${_sanitize} -fno-sanitize-recover=all) cmake_push_check_state () set (CMAKE_REQUIRED_FLAGS "${flag}") set (CMAKE_REQUIRED_LIBRARIES "${flag}") check_c_source_compiles ([[ #include int main (void) { puts ("Hello, world!"); return 0; } ]] "${varname}") cmake_pop_check_state () if (NOT "${${varname}}") message (SEND_ERROR "Requested sanitizer option '${flag}' is not supported by the compiler+linker") else () message (STATUS "Enabling sanitizers: ${flag}") mongo_platform_compile_options ($) mongo_platform_link_options (${flag}) endif () endif () mongo-c-driver-2.2.1/build/cmake/SphinxBuild.cmake000066400000000000000000000126511511661753600217760ustar00rootroot00000000000000# function (sphinx_build_html) # # Parameters: # # target_name - name of the generated custom target (e.g., bson-html) # doc_dir - name of the destination directory for HTML documentation; is used # to construct a target path: ${CMAKE_INSTALL_PREFIX}/share/doc/${doc_dir}/html # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .html files # - create the custom Sphinx command that produces the HTML output # - add install rules for: # + source static content (e.g., images) # + each output file # + additional Sphinx-generated content # - create the custom target that depends on the output files and calls sphinx function (sphinx_build_html target_name doc_dir) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") set (doctrees_dir "${SPHINX_HTML_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) # Select a builder: The Sphinx `dirhtml` builder will result in "prettier" URLs, # as each page is an `index.html` within a directory. This relies on "autoindex"-style # static file URL resolution in the HTTP server, which is extremely common. For # EVG, however, we host build results on a server that does not support this, # so instead use the traditional HTML builder so that the built documentation # artifact can be easily viewed in a web browser set(is_evg_docs_build "$ENV{EVG_DOCS_BUILD}") if(NOT is_evg_docs_build) set (builder dirhtml) # We have an extension in place that generates stub page redirects for # old HTML file URLs that now point to the auto-index URL for the # corresponding page. As such, every .rst builds two corresponding .html # files: list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html;html/\\1/index.html" OUTPUT_VARIABLE doc_htmls) else() set (builder html) # We use the regular html builder in this case, which generates exactly # one HTML page for each input rST file list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html" OUTPUT_VARIABLE doc_htmls) endif() # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_htmls} ${SPHINX_HTML_DIR}/.nojekyll ${SPHINX_HTML_DIR}/objects.inv COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qnW -b "${builder}" -j "${NPROCS}" -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_HTML_DIR}" DEPENDS ${doc_rsts} COMMENT "Building HTML documentation with Sphinx" ) # Install all HTML files install (DIRECTORY "${SPHINX_HTML_DIR}/" DESTINATION "${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html" FILES_MATCHING PATTERN "*.html") # Ensure additional Sphinx-generated content gets installed install (FILES ${SPHINX_HTML_DIR}/search.html ${SPHINX_HTML_DIR}/objects.inv ${SPHINX_HTML_DIR}/searchindex.js DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) install (DIRECTORY ${SPHINX_HTML_DIR}/_static DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) add_custom_target (${target_name} DEPENDS ${doc_htmls}) endfunction () # function (sphinx_build_man) # # Parameters: # # target_name - name of the generated custom target (e.g., mongoc-man) # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .3 files (i.e., man pages) # - create the custom Sphinx command that produces the man page output # - add install rules for each output file # - create the custom target that depends on the output files and calls sphinx # function (sphinx_build_man target_name) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man") set (doctrees_dir "${SPHINX_MAN_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) set (doc_mans) foreach (rst IN LISTS doc_rsts) # Only those with the :man_page: tag at the beginning build man pages file (READ "${rst}" rst_head LIMIT 256) string (FIND "${rst_head}" ":man_page: " man_tag_pos) if (man_tag_pos GREATER_EQUAL "0") list (APPEND man_doc_rsts "${rst}") string (REGEX REPLACE "^.*:man_page: +([a-z0-9_]+).*$" "man\/\\1.3" man ${rst_head} ) list (APPEND doc_mans ${man}) endif () endforeach () # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_mans} COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qW -b man -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_MAN_DIR}" DEPENDS ${doc_rsts} COMMENT "Building manual pages with Sphinx" ) foreach (man IN LISTS doc_mans) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${man} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 ) endforeach () add_custom_target (${target_name} DEPENDS ${doc_mans}) endfunction () mongo-c-driver-2.2.1/build/cmake/TestFixtures.cmake000066400000000000000000000044041511661753600222130ustar00rootroot00000000000000find_package (Python3 COMPONENTS Interpreter) if (NOT TARGET Python3::Interpreter) message (STATUS "Python3 was not found, so test fixtures will not be defined") return () endif () get_filename_component(_MONGOC_BUILD_SCRIPT_DIR "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) set (_MONGOC_PROC_CTL_COMMAND "$" -u -- "${_MONGOC_BUILD_SCRIPT_DIR}/proc-ctl.py") function (mongo_define_subprocess_fixture name) cmake_parse_arguments(PARSE_ARGV 1 ARG "" "SPAWN_WAIT;STOP_WAIT;WORKING_DIRECTORY" "COMMAND") string (MAKE_C_IDENTIFIER "${name}" ident) if (NOT ARG_SPAWN_WAIT) set (ARG_SPAWN_WAIT 1) endif () if (NOT ARG_STOP_WAIT) set (ARG_STOP_WAIT 5) endif () if (NOT ARG_WORKING_DIRECTORY) set (ARG_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") endif () if (NOT ARG_COMMAND) message (SEND_ERROR "mongo_define_subprocess_fixture(${name}) requires a COMMAND") return () endif () get_filename_component (ctl_dir "${CMAKE_CURRENT_BINARY_DIR}/${ident}.ctl" ABSOLUTE) add_test (NAME "${name}/start" COMMAND ${_MONGOC_PROC_CTL_COMMAND} start "--ctl-dir=${ctl_dir}" "--cwd=${ARG_WORKING_DIRECTORY}" "--spawn-wait=${ARG_SPAWN_WAIT}" -- ${ARG_COMMAND}) add_test (NAME "${name}/stop" COMMAND ${_MONGOC_PROC_CTL_COMMAND} stop "--ctl-dir=${ctl_dir}" --if-not-running=ignore) set_property (TEST "${name}/start" PROPERTY FIXTURES_SETUP "${name}") set_property (TEST "${name}/stop" PROPERTY FIXTURES_CLEANUP "${name}") endfunction () # Create a fixture that runs a fake Azure IMDS server mongo_define_subprocess_fixture( mongoc/fixtures/fake_kms_provider_server SPAWN_WAIT 1 COMMAND "$" -u -- "${_MONGOC_BUILD_SCRIPT_DIR}/bottle.py" fake_kms_provider_server:kms_provider --bind localhost:14987 # Port 14987 chosen arbitrarily ) # Run our very simple HTTP server in a fixture process mongo_define_subprocess_fixture( mongoc/fixtures/simple-http-server-18000 SPAWN_WAIT 1 COMMAND $ -u "${mongo-c-driver_SOURCE_DIR}/.evergreen/scripts/simple_http_server.py" ) mongo-c-driver-2.2.1/build/cmake/TestProject.cmake000066400000000000000000000245501511661753600220140ustar00rootroot00000000000000#[[ Add a CMake test that configures, builds, and tests a CMake project. add_test_cmake_project( [INSTALL_PARENT] [BUILD_DIR ] [GENERATOR ] [CONFIG ] [PASSTHRU_VARS ...] [PASSTHRU_VARS_REGEX ] [CONFIGURE_ARGS ...] [SETTINGS ...] ) The generated test will run CMake configure on the project at `` (which is resolved relative to the caller's source directory). If INSTALL_PARENT is specified, then the host CMake project will be installed to a temporary prefix, and that prefix will be passed along with CMAKE_PREFIX_PATH when the test project is configured. PASSTHRU_VARS is a list of CMake variables visible in the current scope that should be made visible to the subproject with the same name and value. PASSTHRU_VARS_REGEX takes a single regular expression. Any variables currently defined which match the regex will be passed through as-if they were specified with PASSTHRU_VARS. SETTINGS is list of a `[name]=[value]` strings for additional `-D` arguments to pass to the sub-project. List arguments *are* supported. If CONFIG is unspecified, then the generated test will configure+build the project according to the configuration of CTest (passed with the `-C` argument). The default for GENERATOR is to use the same generator as the host project. The default BUILD_DIR will be a temporary directory that will be automatically deleted at the start of each test to ensure a fresh configure+build cycle. Additional Variables #################### In addition to the variables specified explicitly in the call, all variables with the suffix `_PATH` or `_DIR` will be passed to the sub-project with `HOST_PROJECT_` prepended. For example, CMAKE_SOURCE_DIR will be passed to the sub-project as HOST_PROJECT_CMAKE_SOURCE_DIR ]] function(add_test_cmake_project name path) # Logging context list(APPEND CMAKE_MESSAGE_CONTEXT "${CMAKE_CURRENT_FUNCTION}") # Parse command arguments: set(options INSTALL_PARENT) set(args BUILD_DIR GENERATOR CONFIG PASSTHRU_VARS_REGEX) set(list_args SETTINGS PASSTHRU_VARS CONFIGURE_ARGS) cmake_parse_arguments(PARSE_ARGV 2 _tp_arg "${options}" "${args}" "${list_args}") foreach(unknown IN LISTS _tp_arg_UNPARSED_ARGUMENTS) message(SEND_ERROR "Unknown argument: “${unknown}â€") endforeach() if(_tp_arg_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Bad arguments (see above)") endif() # Default values: if(NOT DEFINED _tp_arg_BUILD_DIR) set(dirname "${name}") if(WIN32) # Escape specials string(REPLACE "%" "%25" dirname "${dirname}") string(REPLACE ":" "%3A" dirname "${dirname}") string(REPLACE "?" "%3F" dirname "${dirname}") string(REPLACE "*" "%2A" dirname "${dirname}") string(REPLACE "\"" "%22" dirname "${dirname}") string(REPLACE "\\" "%5C" dirname "${dirname}") string(REPLACE "<" "%3C" dirname "${dirname}") string(REPLACE ">" "%3E" dirname "${dirname}") string(REPLACE "|" "%7C" dirname "${dirname}") endif() set(_tp_arg_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/TestProject/${dirname}") endif() if(NOT DEFINED _tp_arg_GENERATOR) set(_tp_arg_GENERATOR "${CMAKE_GENERATOR}") endif() # Normalize paths if(NOT IS_ABSOLUTE "${_tp_arg_BUILD_DIR}") set(_tp_arg_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/${_tp_arg_BUILD_DIR}") endif() get_filename_component(path "${path}" ABSOLUTE) message(VERBOSE "Add test project [${path}]") # Arguments that will be given during the CMake configure step: string(REPLACE ";" $ configure_args "${_tp_arg_CONFIGURE_ARGS}") # Build the argument lists that will be passed-through to project configuration -D flags: set(settings_passthru) # Pass through all _DIR and _PATH variables with a HOST_PROJECT_ prefix: get_directory_property(fwd_path_vars VARIABLES) list(FILTER fwd_path_vars INCLUDE REGEX "_DIR$|_PATH$") list(FILTER fwd_path_vars EXCLUDE REGEX "^_") list(SORT fwd_path_vars CASE INSENSITIVE) set(dir_passthrough) foreach(var IN LISTS fwd_path_vars) string(REPLACE ";" $ value "${${var}}") list(APPEND settings_passthru "HOST_PROJECT_${var}=${value}") endforeach() # Pass through other variables without a prefix: set(passthru_vars "${_tp_arg_PASSTHRU_VARS}") # Some platform variables should always go through: list(APPEND passthru_vars CMAKE_C_COMPILER CMAKE_CXX_COMPILER ) if(DEFINED _tp_arg_PASSTHRU_VARS_REGEX) # Pass through variables matching a certain pattern: get_directory_property(fwd_vars VARIABLES) list(FILTER fwd_vars INCLUDE REGEX "${_tp_arg_PASSTHRU_VARS_REGEX}") list(APPEND passthru_vars "${fwd_vars}") endif() # Pass through all variables that we've marked to be forwarded foreach(var IN LISTS passthru_vars) string(REPLACE ";" $ value "${${var}}") list(APPEND settings_passthru "${var}=${value}") endforeach() # Settings set with SETTINGS list(TRANSFORM _tp_arg_SETTINGS REPLACE ";" $ OUTPUT_VARIABLE settings_escaped) list(APPEND settings_passthru ${settings_escaped}) # Add a prefix to each variable to mark it as a pass-thru variable: list(TRANSFORM settings_passthru PREPEND "-D;TEST_PROJECT_SETTINGS/") # Generate the test case: add_test( NAME "${name}" COMMAND ${CMAKE_COMMAND} --log-context -D "TEST_PROJECT_NAME=${name}" -D "TEST_PROJECT_PARENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}" -D "TEST_PROJECT_SOURCE_DIR=${path}" -D "TEST_PROJECT_BINARY_DIR=${_tp_arg_BUILD_DIR}" -D "TEST_PROJECT_GENERATOR=${_tp_arg_GENERATOR}" -D TEST_PROJECT_INSTALL_PARENT=${_tp_arg_INSTALL_PARENT} -D "TEST_PROJECT_CONFIGURE_ARGS=${_tp_arg_CONFIGURE_ARGS}" -D "TEST_PROJECT_CONFIG=$" ${settings_passthru} -D __test_project_run=1 -P "${CMAKE_CURRENT_FUNCTION_LIST_FILE}" ) endfunction() # This function implements the actual test. function(__do_test_project) list(APPEND CMAKE_MESSAGE_CONTEXT "TestProject Execution") cmake_path(ABSOLUTE_PATH TEST_PROJECT_SOURCE_DIR NORMALIZE OUTPUT_VARIABLE src_dir) cmake_path(ABSOLUTE_PATH TEST_PROJECT_BINARY_DIR NORMALIZE OUTPUT_VARIABLE bin_dir) string(MD5 test_name_hash "${TEST_PROJECT_NAME}") set(tmp_install_prefix "${TEST_PROJECT_PARENT_BINARY_DIR}/TestProject-install/${test_name_hash}") file(REMOVE_RECURSE "${tmp_install_prefix}") list(APPEND TEST_PROJECT_SETTINGS/CMAKE_INSTALL_PREFIX "${tmp_install_prefix}") list(APPEND TEST_PROJECT_SETTINGS/CMAKE_PREFIX_PATH "${tmp_install_prefix}") if(TEST_PROJECT_INSTALL_PARENT) cmake_path(ABSOLUTE_PATH tmp_install_prefix NORMALIZE) message(STATUS "Installing parent project into [${tmp_install_prefix}]") execute_process( COMMAND # Suppress DESTDIR ${CMAKE_COMMAND} -E env --unset=DESTDIR # Do the install: ${CMAKE_COMMAND} --install "${TEST_PROJECT_PARENT_BINARY_DIR}" --prefix "${tmp_install_prefix}" --config "${TEST_PROJECT_CONFIG}" COMMAND_ERROR_IS_FATAL LAST ) endif() message(STATUS "Project source dir: [${src_dir}]") message(STATUS "Project build dir: [${bin_dir}]") message(STATUS "Deleting build directory …") file(REMOVE_RECURSE "${bin_dir}") file(MAKE_DIRECTORY "${bin_dir}") # Grab settings passed-through from the parent project: get_directory_property(vars VARIABLES) set(fwd_settings) list(FILTER vars INCLUDE REGEX "^TEST_PROJECT_SETTINGS/") if(vars) message(STATUS "Configuration settings:") endif() foreach(var IN LISTS vars) set(value "${${var}}") # Remove our prefix string(REGEX REPLACE "^TEST_PROJECT_SETTINGS/" "" varname "${var}") # Print the value we received for debugging purposes message(STATUS " • ${varname}=${value}") # Escape nested lists string(REPLACE ";" "\\;" value "${value}") list(APPEND fwd_settings -D "${varname}=${value}") endforeach() message(STATUS "Configuring project [${src_dir}] …") set(config_log "${bin_dir}/TestProject-configure.log") message(STATUS "CMake configure output will be written to [${config_log}]") execute_process( COMMAND_ECHO STDERR WORKING_DIRECTORY "${bin_dir}" RESULT_VARIABLE retc OUTPUT_VARIABLE output ERROR_VARIABLE output ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE COMMAND ${CMAKE_COMMAND} -S "${src_dir}" -B "${bin_dir}" -G "${TEST_PROJECT_GENERATOR}" -D "CMAKE_BUILD_TYPE=${TEST_PROJECT_BUILD_TYPE}" --no-warn-unused-cli --log-context --log-level=debug ${fwd_settings} ${TEST_PROJECT_CONFIGURE_ARGS} ) file(WRITE "${config_log}" "${output}") if(retc) message(FATAL_ERROR "Configure subcommand failed [${retc}]") endif() message(STATUS "CMake configure completed") set(build_log "${bin_dir}/TestProject-build.log") message(STATUS "Build output will be written to [${build_log}]") message(STATUS "Building configured project [${bin_dir}] …") execute_process( COMMAND_ECHO STDERR WORKING_DIRECTORY "${bin_dir}" RESULT_VARIABLE retc OUTPUT_VARIABLE out ERROR_VARIABLE out ECHO_OUTPUT_VARIABLE ECHO_ERROR_VARIABLE COMMAND ${CMAKE_COMMAND} --build "${bin_dir}" --config "${TEST_PROJECT_CONFIG}" ) file(WRITE "${build_log}" "${output}") if(retc) message(FATAL_ERROR "Project build failed [${retc}]") endif() message(STATUS "Project build completed") execute_process( COMMAND ${CMAKE_CTEST_COMMAND} -T Start -T Test -C "${TEST_PROJECT_CONFIG}" --output-on-failure WORKING_DIRECTORY "${bin_dir}" COMMAND_ERROR_IS_FATAL LAST ) endfunction() if(__test_project_run) cmake_minimum_required(VERSION 3.20) # cmake_path/execute_process __do_test_project() endif() mongo-c-driver-2.2.1/build/cmake/VerifyHeaders.cmake000066400000000000000000000110421511661753600222760ustar00rootroot00000000000000include_guard(DIRECTORY) #[==[ Add header verification targets for given headers: mongo_verify_headers( [USES_LIBRARIES [ ...]] [HEADERS [ ...]] [EXCLUDE_REGEX [ ...]] ) Here `` is an arbitrary string that is used to qualify the internal target created for the verification. The `` expressions are used to automatically collect sources files (relative to the current source directory). All files collected by `` must live within the current source directory. After collecting sources according to the `` patterns, sources are excluded if the filepath contains any substring that matches any regular expression in the `` list. Each `` is tested against the relative path to the header file that was found by ``, and not the absolute path to the file. The header verification targets are compiled according to the usage requirements from all `` arguments. ]==] function(mongo_verify_headers tag) list(APPEND CMAKE_MESSAGE_CONTEXT "${CMAKE_CURRENT_FUNCTION}(${tag})") cmake_parse_arguments( PARSE_ARGV 1 arg "" # No flags "" # No args "HEADERS;EXCLUDE_REGEX;USE_LIBRARIES" # List args ) if(arg_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unknown arguments: ${arg_UNPARSED_ARGUMENTS}") endif() # Collect headers according to our patterns set(headers_to_verify) foreach(pattern IN LISTS arg_HEADERS) # Use a recursive glob from the current source dir: file(GLOB_RECURSE more # Make the paths relative to the calling dir to prevent parent paths # from interfering with the exclusion regex logic below RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" # We need to re-run configuration if any files are added/removed CONFIGURE_DEPENDS "${pattern}" ) # Warn if this pattern didn't match anything. It is probably a mistake # in the caller's argument list. if(NOT more) message(WARNING "Globbing pattern “${pattern}†did not match any files") endif() list(APPEND headers_to_verify ${more}) endforeach() # Exclude anything that matches any exclusion regex foreach(pattern IN LISTS arg_EXCLUDE_REGEX) list(FILTER headers_to_verify EXCLUDE REGEX "${pattern}") endforeach() # Drop duplicates since globs may grab a file more than once list(REMOVE_DUPLICATES headers_to_verify) list(SORT headers_to_verify) foreach(file IN LISTS headers_to_verify) message(DEBUG "Verify header file: ${file}") endforeach() # We create two targets: One for C and one for C++ # C target set(c_target ${tag}-verify-headers-c) message(DEBUG "Defining header verification target “${c_target}†(C)") # Create object libraries. They will only have one empty compiled source file. # The source file language will tell CMake how to verify the associated header files. add_library(${c_target} OBJECT "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/empty.c") # Define the file set target_sources(${c_target} PUBLIC FILE_SET HEADERS) # Conditionally do the same thing for C++ if(CMAKE_CXX_COMPILER) # C++ is available. define it set(cxx_target ${tag}-verify-headers-cxx) message(DEBUG "Defining header verification targets “${cxx_target}†(C++)") add_library(${cxx_target} OBJECT "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/empty.cpp") target_sources(${cxx_target} PUBLIC FILE_SET HEADERS) else() message(AUTHOR_WARNING "No C++ compiler is available, so the header-check C++ targets won't be defined") unset(cxx_target) endif() # Populate the properties and file sets. set_target_properties(${c_target} ${cxx_target} PROPERTIES # The main header file set: HEADER_SET "${headers_to_verify}" # Enable header verification: VERIFY_INTERFACE_HEADER_SETS TRUE # Add the usage requirements that propagate to the generated compilation rules: INTERFACE_LINK_LIBRARIES "${arg_USE_LIBRARIES}" ) endfunction() #[[ Variable set to TRUE if-and-only-if CMake supports header verification. ]] set(MONGO_CAN_VERIFY_HEADERS FALSE) if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24") set(MONGO_CAN_VERIFY_HEADERS TRUE) endif() # Try to enable C++, but don't require it. This will be used to conditionally # define the C++ header-check tests include(CheckLanguage) check_language(CXX) if(CMAKE_CXX_COMPILER) enable_language(CXX) endif() mongo-c-driver-2.2.1/build/cmake/empty.c000066400000000000000000000001471511661753600200420ustar00rootroot00000000000000/* This is an empty placeholder file used for miscellaneous build system tasks */ #include mongo-c-driver-2.2.1/build/cmake/empty.cpp000066400000000000000000000001421511661753600203750ustar00rootroot00000000000000// This is an empty placeholder file used for miscellaneous build system tasks #include mongo-c-driver-2.2.1/build/cmake/libmongoc-hidden-symbols.map000066400000000000000000000000451511661753600241240ustar00rootroot00000000000000mongoc { local: kms*; }; mongo-c-driver-2.2.1/build/cmake/libmongoc-hidden-symbols.txt000066400000000000000000000000061511661753600241630ustar00rootroot00000000000000_kms* mongo-c-driver-2.2.1/build/cmake/packageConfigVersion.cmake.in000066400000000000000000000050201511661753600242310ustar00rootroot00000000000000#[[ This package version check file is based on the one that ships with CMake, but supports version ranges that span major versions, while also doing SameMajorVersion matching when a non-range is specified. ]] set(PACKAGE_VERSION "@PROJECT_VERSION@") set(__package_version_major "@PROJECT_VERSION_MAJOR@") # Announce that we are incompatible unless some condition below is satisfied set(PACKAGE_VERSION_COMPATIBLE FALSE) if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) # The find_package() requested a version that is at least newer than our own version # Not compatible elseif(NOT DEFINED PACKAGE_FIND_VERSION_RANGE) # A simple version check (no range) if(PACKAGE_FIND_VERSION_MAJOR EQUAL __package_version_major) # We are the same major version. Okay! set(PACKAGE_VERSION_COMPATIBLE TRUE) endif() if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) # We are an exact match to the requested version set(PACKAGE_VERSION_EXACT TRUE) endif() elseif(PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) # Package is newer than the range max (we already checked the range min) # Not compatible else() # We are doing a version range check and our version is within the # requested inclusive range. Set compatible, but we may be incompatible if we are # an exclusive range: set(PACKAGE_VERSION_COMPATIBLE TRUE) # Check whether the range endpoints are compatible: if(PACKAGE_VERSION VERSION_EQUAL PACKAGE_FIND_VERSION_MAX AND PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE") # The upper version is excluded from compatibility set(PACKAGE_VERSION_COMPATIBLE FALSE) elseif(PACKAGE_VERSION VERSION_EQUAL PACKAGE_FIND_VERSION_MIN AND PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "EXCLUDE") # The lower version is excluded from the range set(PACKAGE_VERSION_COMPATIBLE FALSE) endif() endif() # Check if pointer sizes match (this is relevant e.g. if we are a 32-bit build and # CMake is building for 64-bit) if(CMAKE_SIZEOF_VOID_P STREQUAL "" OR "@CMAKE_SIZEOF_VOID_P@" STREQUAL "") # Unknown pointer size. Don't check return() endif() # Check: if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "@CMAKE_SIZEOF_VOID_P@") math(EXPR bits "@CMAKE_SIZEOF_VOID_P@ * 8") # Announce the bitness of this package for diagnostics: set(PACKAGE_VERSION "${PACKAGE_VERSION} (${bits}bit)") # This package is unsuitable, regardless of version requested in the importer set(PACKAGE_VERSION_UNSUITABLE TRUE) endif() mongo-c-driver-2.2.1/build/fake_kms_provider_server.py000066400000000000000000000105751511661753600231200ustar00rootroot00000000000000import functools import json import sys import time import traceback from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, Iterable, cast, overload import bottle from bottle import Bottle, HTTPResponse kms_provider = Bottle(autojson=True) """A mock server for Azure IMDS and GCP metadata""" if not TYPE_CHECKING: from bottle import request else: from typing import Protocol class _RequestParams(Protocol): def __getitem__(self, key: str) -> str: ... @overload def get(self, key: str) -> 'str | None': ... @overload def get(self, key: str, default: str) -> str: ... class _HeadersDict(dict[str, str]): def raw(self, key: str) -> 'bytes | None': ... class _Request(Protocol): @property def query(self) -> _RequestParams: ... @property def params(self) -> _RequestParams: ... @property def headers(self) -> _HeadersDict: ... request = cast('_Request', None) def parse_qs(qs: str) -> 'dict[str, str]': # Re-use the bottle.py query string parser. It's a private function, but # we're using a fixed version of Bottle. return dict(bottle._parse_qsl(qs)) # type: ignore _HandlerFuncT = Callable[[], 'None|str|bytes|dict[str, Any]|bottle.BaseResponse|Iterable[bytes|str]'] def handle_asserts(fn: _HandlerFuncT) -> _HandlerFuncT: "Convert assertion failures into HTTP 400s" @functools.wraps(fn) def wrapped(): try: return fn() except AssertionError as e: traceback.print_exc() return bottle.HTTPResponse(status=400, body=json.dumps({'error': list(e.args)})) return wrapped def test_params() -> 'dict[str, str]': return parse_qs(request.headers.get('X-MongoDB-HTTP-TestParams', '')) @kms_provider.get('/computeMetadata/v1/instance/service-accounts/default/token') @handle_asserts def get_gcp_token(): metadata_header = request.headers.get('Metadata-Flavor') assert metadata_header == 'Google' case = test_params().get('case') print('Case is:', case) if case == '404': return HTTPResponse(status=404) if case == 'bad-json': return b'{"access-token": }' if case == 'empty-json': return b'{}' if case == 'giant': return _gen_giant() if case == 'slow': return _slow() assert case in (None, ''), 'Unknown HTTP test case "{}"'.format(case) return {'access_token': 'google-cookie', 'token_type': 'Bearer'} @kms_provider.get('/metadata/identity/oauth2/token') @handle_asserts def get_oauth2_token(): api_version = request.query['api-version'] assert api_version == '2018-02-01', 'Only api-version=2018-02-01 is supported' resource = request.query['resource'] assert resource == 'https://vault.azure.net', 'Only https://vault.azure.net is supported' case = test_params().get('case') print('Case is:', case) if case == '404': return HTTPResponse(status=404) if case == '500': return HTTPResponse(status=500) if case == 'bad-json': return b'{"key": }' if case == 'empty-json': return b'{}' if case == 'giant': return _gen_giant() if case == 'slow': return _slow() assert case in (None, ''), 'Unknown HTTP test case "{}"'.format(case) return { 'access_token': 'magic-cookie', 'expires_in': '70', 'token_type': 'Bearer', 'resource': 'https://vault.azure.net', } def _gen_giant() -> Iterable[bytes]: "Generate a giant message" yield b'{ "item": [' for _ in range(1024 * 256): yield ( b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ' b'null, null, null, null, null, null, null, null, null, null, ' ) yield b' null ] }' yield b'\n' def _slow() -> Iterable[bytes]: "Generate a very slow message" yield b'{ "item": [' for _ in range(1000): yield b'null, ' time.sleep(1) yield b' null ] }' if __name__ == '__main__': print( 'RECOMMENDED: Run this script using bottle.py (e.g. [{} {}/bottle.py fake_kms_provider_server:kms_provider])'.format( sys.executable, Path(__file__).resolve().parent ) ) kms_provider.run() mongo-c-driver-2.2.1/build/future_function_templates/000077500000000000000000000000001511661753600227535ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/future_function_templates/future-functions.c.template000066400000000000000000000036001511661753600302500ustar00rootroot00000000000000{{ header_comment }} /* * Define two sets of functions: background functions and future functions. * A background function like background_mongoc_cursor_next runs a driver * operation on a thread. * A future function like future_mongoc_cursor_next launches the background * operation and returns a future_t that will resolve when the operation * finishes. * * These are used with mock_server_t so you can run the driver on a thread while * controlling the server from the main thread. */ #include #include "mock_server/future-functions.h" {% for F in future_functions %} static BSON_THREAD_FUN (background_{{ F.name }}, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_{{ F.ret_type }}_type; {% if F.ret_type == 'void' %} {{ F.name }} ({% for P in F.params %} future_value_get_{{ P.type_name }} (future_get_param (future, {{ loop.index0 }})){% if not loop.last %},{% endif %}{% endfor %}); {% else %} future_value_set_{{ F.ret_type }} ( &return_value, {{ F.name }} ({% for P in F.params %} future_value_get_{{ P.type_name }} (future_get_param (future, {{ loop.index0 }})){% if not loop.last %},{% endif %}{% endfor %} )); {% endif %} future_resolve (future, return_value); BSON_THREAD_RETURN; } {% endfor %} {% for F in future_functions %} future_t * {{ F|future_function_name }} ({% for P in F.params %} {{ P.type_name }} {{ P.name }}{% if not loop.last %},{% endif %}{% endfor %}) { future_t *future = future_new (future_value_{{ F.ret_type }}_type, {{ F.params | length }}); {% for P in F.params %} future_value_set_{{ P.type_name }} ( future_get_param (future, {{ loop.index0 }}), {{ P.name }}); {% endfor %} future_start (future, background_{{ F.name }}); return future; } {%- endfor %} mongo-c-driver-2.2.1/build/future_function_templates/future-functions.h.template000066400000000000000000000006421511661753600302600ustar00rootroot00000000000000#ifndef FUTURE_FUNCTIONS_H #define FUTURE_FUNCTIONS_H #include "mock_server/future-value.h" #include "mock_server/future.h" #include {{ header_comment }} {% for F in future_functions %} future_t * {{ F|future_function_name }} ( {% for P in F.params %} {{ P.type_name }} {{ P.name }}{% if not loop.last %},{% endif %}{% endfor %} ); {% endfor %} #endif /* FUTURE_FUNCTIONS_H */ mongo-c-driver-2.2.1/build/future_function_templates/future-value.c.template000066400000000000000000000014511511661753600273560ustar00rootroot00000000000000#include "mock_server/future-value.h" {{ header_comment }} future_value_t * future_value_new (void) { return (future_value_t *) bson_malloc0 (sizeof (future_value_t)); } void future_value_set_void (future_value_t *future_value) { future_value->type = future_value_void_type; } void future_value_get_void (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_void_type); } {% for T in type_list %} void future_value_set_{{ T }} (future_value_t *future_value, {{ T }} value) { future_value->type = future_value_{{ T }}_type; future_value->value.{{ T }}_value = value; } {{ T }} future_value_get_{{ T }} (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_{{ T }}_type); return future_value->value.{{ T }}_value; } {%- endfor %} mongo-c-driver-2.2.1/build/future_function_templates/future-value.h.template000066400000000000000000000022021511661753600273560ustar00rootroot00000000000000#ifndef FUTURE_VALUE_H #define FUTURE_VALUE_H #include #include #include {{ header_comment }} {% for T in typedef_list %}{% if T.typedef %} typedef {{ T.typedef }} {{ T.name }};{% endif %}{% endfor %} typedef enum { future_value_no_type = 0, {% for T in type_list_with_void %} future_value_{{ T }}_type, {% endfor %} } future_value_type_t; typedef struct _future_value_t { future_value_type_t type; union { {% for T in type_list %} {{ T }} {{ T }}_value; {% endfor %} } value; } future_value_t; future_value_t *future_value_new (void); #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #endif void future_value_set_void (future_value_t *future_value); void future_value_get_void (future_value_t *future_value); {% for T in type_list %} void future_value_set_{{ T }}( future_value_t *future_value, {{ T }} value); {{ T }} future_value_get_{{ T }} ( future_value_t *future_value); {% endfor %} #ifdef __clang__ #pragma clang diagnostic pop #endif #endif /* FUTURE_VALUE_H */ mongo-c-driver-2.2.1/build/future_function_templates/future.c.template000066400000000000000000000057501511661753600262520ustar00rootroot00000000000000#include #include #include #include "mock_server/future.h" #include "../test-libmongoc.h" {{ header_comment }} #define FUTURE_TIMEOUT_ABORT \ if (1) { \ fflush (stdout); \ fprintf (stderr, "%s timed out\n", BSON_FUNC); \ fflush (stderr); \ abort (); \ } else \ ((void) 0) void future_get_void (future_t *future) { if (future_wait (future)) { return; } FUTURE_TIMEOUT_ABORT; } {% for T in type_list %} {{ T }} future_get_{{ T }} (future_t *future) { if (future_wait (future)) { return future_value_get_{{ T }} (&future->return_value); } FUTURE_TIMEOUT_ABORT; } {% endfor %} future_t * future_new (future_value_type_t return_type, int argc) { future_t *future; future = (future_t *)bson_malloc0 (sizeof *future); future->return_value.type = return_type; future->argc = argc; future->argv = (future_value_t *)bson_malloc0 ((size_t) argc * sizeof(future_value_t)); mongoc_cond_init (&future->cond); bson_mutex_init (&future->mutex); return future; } future_value_t * future_get_param (future_t *future, int i) { return &future->argv[i]; } void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)) { int r = mcommon_thread_create (&future->thread, start_routine, (void *) future); BSON_ASSERT (!r); } void future_resolve (future_t *future, future_value_t return_value) { bson_mutex_lock (&future->mutex); BSON_ASSERT (!future->resolved); BSON_ASSERT (future->return_value.type == return_value.type); future->return_value = return_value; future->resolved = true; mongoc_cond_signal (&future->cond); bson_mutex_unlock (&future->mutex); } bool future_wait_max (future_t *future, int64_t timeout_ms) { int64_t remaining_usec = timeout_ms * 1000; int64_t deadline = bson_get_monotonic_time () + timeout_ms * 1000; bool resolved; bson_mutex_lock (&future->mutex); while (!future->resolved && remaining_usec > 0) { mongoc_cond_timedwait (&future->cond, &future->mutex, remaining_usec / 1000); remaining_usec = deadline - bson_get_monotonic_time (); } resolved = future->resolved; bson_mutex_unlock (&future->mutex); if (resolved) { future->awaited = true; /* free memory */ mcommon_thread_join (future->thread); } return resolved; } bool future_wait (future_t *future) { return future_wait_max (future, get_future_timeout_ms ()); } void future_destroy (future_t *future) { BSON_ASSERT (future->awaited); bson_free (future->argv); mongoc_cond_destroy (&future->cond); bson_mutex_destroy (&future->mutex); bson_free (future); } mongo-c-driver-2.2.1/build/future_function_templates/future.h.template000066400000000000000000000017521511661753600262550ustar00rootroot00000000000000#ifndef FUTURE_H #define FUTURE_H #include #include "mock_server/future-value.h" #include {{ header_comment }} typedef struct { bool resolved; bool awaited; future_value_t return_value; int argc; future_value_t *argv; mongoc_cond_t cond; bson_mutex_t mutex; bson_thread_t thread; } future_t; future_t *future_new (future_value_type_t return_type, int argc); future_value_t *future_get_param (future_t *future, int i); void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)); void future_resolve (future_t *future, future_value_t return_value); bool future_wait (future_t *future); bool future_wait_max (future_t *future, int64_t timeout_ms); void future_get_void (future_t *future); {% for T in type_list %} {{ T }} future_get_{{ T }} (future_t *future); {% endfor %} void future_destroy (future_t *future); #endif /* FUTURE_H */ mongo-c-driver-2.2.1/build/generate-future-functions.py000066400000000000000000000543751511661753600231560ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Generate test functions for use with mock_server_t. Defines functions like future_cursor_next in future-functions.h and future-functions.c, which defer a libmongoc operation to a background thread via functions like background_cursor_next. Also defines functions like future_value_set_bson_ptr and future_value_get_bson_ptr which support the future / background functions, and functions like future_get_bson_ptr which wait for a future to resolve, then return its value. These future functions are used in conjunction with mock_server_t to conveniently test libmongoc wire protocol operations. Written for Python 2.6+, requires Jinja 2 for templating. """ from collections import namedtuple from os.path import basename, dirname, normpath from os.path import join as joinpath # Please "pip install jinja2". from jinja2 import Environment, FileSystemLoader this_dir = dirname(__file__) template_dir = joinpath(this_dir, 'future_function_templates') mock_server_dir = normpath(joinpath(this_dir, '../src/libmongoc/tests/mock_server')) # Add additional types here. Use typedefs for derived types so they can # be named with one symbol. typedef = namedtuple('typedef', ['name', 'typedef']) # These are typedef'ed if necessary in future-value.h, and added to the union # of possible future_value_t.value types. future_value_t getters and setters # are generated for all types, as well as future_t getters. typedef_list = [ # Fundamental. typedef('bool', None), typedef('char_ptr', 'char *'), typedef('char_ptr_ptr', 'char **'), typedef('int', None), typedef('int64_t', None), typedef('size_t', None), typedef('ssize_t', None), typedef('uint32_t', None), typedef('void_ptr', 'void *'), # Const fundamental. typedef('const_char_ptr', 'const char *'), typedef('bool_ptr', 'bool *'), # libbson. typedef('bson_error_ptr', 'bson_error_t *'), typedef('bson_ptr', 'bson_t *'), # Const libbson. typedef('const_bson_ptr', 'const bson_t *'), typedef('const_bson_ptr_ptr', 'const bson_t **'), # libmongoc. typedef('mongoc_async_ptr', 'mongoc_async_t *'), typedef('mongoc_bulk_operation_ptr', 'mongoc_bulk_operation_t *'), typedef('mongoc_client_ptr', 'mongoc_client_t *'), typedef('mongoc_client_pool_ptr', 'mongoc_client_pool_t *'), typedef('mongoc_collection_ptr', 'mongoc_collection_t *'), typedef('mongoc_cluster_ptr', 'mongoc_cluster_t *'), typedef('mongoc_cmd_parts_ptr', 'mongoc_cmd_parts_t *'), typedef('mongoc_cursor_ptr', 'mongoc_cursor_t *'), typedef('mongoc_database_ptr', 'mongoc_database_t *'), typedef('mongoc_gridfs_file_ptr', 'mongoc_gridfs_file_t *'), typedef('mongoc_gridfs_ptr', 'mongoc_gridfs_t *'), typedef('mongoc_insert_flags_t', None), typedef('mongoc_iovec_ptr', 'mongoc_iovec_t *'), typedef('mongoc_server_stream_ptr', 'mongoc_server_stream_t *'), typedef('mongoc_query_flags_t', None), typedef('mongoc_server_description_ptr', 'mongoc_server_description_t *'), typedef('mongoc_ss_optype_t', None), typedef('mongoc_topology_ptr', 'mongoc_topology_t *'), typedef('mongoc_write_concern_ptr', 'mongoc_write_concern_t *'), typedef('mongoc_change_stream_ptr', 'mongoc_change_stream_t *'), typedef('mongoc_remove_flags_t', None), typedef('mongoc_bulkwrite_ptr', 'mongoc_bulkwrite_t *'), typedef('mongoc_bulkwritereturn_t', None), # Const libmongoc. typedef('const_mongoc_find_and_modify_opts_ptr', 'const mongoc_find_and_modify_opts_t *'), typedef('const_mongoc_iovec_ptr', 'const mongoc_iovec_t *'), typedef('const_mongoc_read_prefs_ptr', 'const mongoc_read_prefs_t *'), typedef('const_mongoc_write_concern_ptr', 'const mongoc_write_concern_t *'), typedef('const_mongoc_ss_log_context_ptr', 'const mongoc_ss_log_context_t *'), typedef('mongoc_index_model_t_ptr_const_ptr', 'mongoc_index_model_t *const *'), typedef('const_mongoc_bulkwriteopts_ptr', 'const mongoc_bulkwriteopts_t *'), ] type_list = [T.name for T in typedef_list] type_list_with_void = type_list + ['void'] param = namedtuple('param', ['type_name', 'name']) future_function = namedtuple('future_function', ['ret_type', 'name', 'params']) # Add additional functions to be tested here. For a name like "cursor_next", we # generate two functions: future_cursor_next to prepare the future_t and launch # a background thread, and background_cursor_next to run on the thread and # resolve the future. future_functions = [ future_function('void', 'mongoc_async_run', [param('mongoc_async_ptr', 'async')]), future_function( 'uint32_t', 'mongoc_bulk_operation_execute', [param('mongoc_bulk_operation_ptr', 'bulk'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error')], ), future_function( 'bool', 'mongoc_database_read_command_with_opts', [ param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_database_read_write_command_with_opts', [ param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_database_write_command_with_opts', [ param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'command'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_client_command_simple', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db_name'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_client_command_with_opts', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db_name'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_client_read_command_with_opts', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db_name'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_client_write_command_with_opts', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db_name'), param('const_bson_ptr', 'command'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_client_read_write_command_with_opts', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db_name'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_change_stream_ptr', 'mongoc_client_watch', [param('mongoc_client_ptr', 'client'), param('const_bson_ptr', 'pipeline'), param('const_bson_ptr', 'opts')], ), future_function( 'mongoc_cursor_ptr', 'mongoc_collection_aggregate', [ param('mongoc_collection_ptr', 'collection'), param('mongoc_query_flags_t', 'flags'), param('const_bson_ptr', 'pipeline'), param('const_bson_ptr', 'options'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), ], ), future_function( 'bool', 'mongoc_collection_create_indexes_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('mongoc_index_model_t_ptr_const_ptr', 'models'), param('size_t', 'num_models'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_drop_index_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_char_ptr', 'index_name'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_drop_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_find_and_modify_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'query'), param('const_mongoc_find_and_modify_opts_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_find_and_modify', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'query'), param('const_bson_ptr', 'sort'), param('const_bson_ptr', 'update'), param('const_bson_ptr', 'fields'), param('bool', '_remove'), param('bool', 'upsert'), param('bool', '_new'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_cursor_ptr', 'mongoc_collection_find_indexes_with_opts', [param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'opts')], ), future_function( 'bool', 'mongoc_collection_insert_many', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr_ptr', 'documents'), param('size_t', 'n_documents'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_insert_one', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'document'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_read_command_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_read_write_command_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_write_command_with_opts', [ param('mongoc_collection_ptr', 'collection'), param('const_bson_ptr', 'command'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_cluster_run_command_parts', [ param('mongoc_cluster_ptr', 'cluster'), param('mongoc_server_stream_ptr', 'server_stream'), param('mongoc_cmd_parts_ptr', 'parts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function('void', 'mongoc_cursor_destroy', [param('mongoc_cursor_ptr', 'cursor')]), future_function( 'bool', 'mongoc_cursor_next', [param('mongoc_cursor_ptr', 'cursor'), param('const_bson_ptr_ptr', 'doc')] ), future_function( 'char_ptr_ptr', 'mongoc_client_get_database_names_with_opts', [param('mongoc_client_ptr', 'client'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error')], ), future_function( 'mongoc_server_description_ptr', 'mongoc_client_select_server', [ param('mongoc_client_ptr', 'client'), param('bool', 'for_writes'), param('const_mongoc_read_prefs_ptr', 'prefs'), param('bson_error_ptr', 'error'), ], ), future_function('void', 'mongoc_client_destroy', [param('mongoc_client_ptr', 'client')]), future_function('void', 'mongoc_client_pool_destroy', [param('mongoc_client_pool_ptr', 'pool')]), future_function( 'bool', 'mongoc_database_command_simple', [ param('mongoc_database_ptr', 'database'), param('bson_ptr', 'command'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_database_drop_with_opts', [param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error')], ), future_function( 'char_ptr_ptr', 'mongoc_database_get_collection_names_with_opts', [param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error')], ), future_function( 'mongoc_change_stream_ptr', 'mongoc_database_watch', [ param('mongoc_database_ptr', 'database'), param('const_bson_ptr', 'pipeline'), param('const_bson_ptr', 'opts'), ], ), future_function( 'ssize_t', 'mongoc_gridfs_file_readv', [ param('mongoc_gridfs_file_ptr', 'file'), param('mongoc_iovec_ptr', 'iov'), param('size_t', 'iovcnt'), param('size_t', 'min_bytes'), param('uint32_t', 'timeout_msec'), ], ), future_function( 'bool', 'mongoc_gridfs_file_remove', [param('mongoc_gridfs_file_ptr', 'file'), param('bson_error_ptr', 'error')] ), future_function( 'int', 'mongoc_gridfs_file_seek', [param('mongoc_gridfs_file_ptr', 'file'), param('int64_t', 'delta'), param('int', 'whence')], ), future_function( 'ssize_t', 'mongoc_gridfs_file_writev', [ param('mongoc_gridfs_file_ptr', 'file'), param('const_mongoc_iovec_ptr', 'iov'), param('size_t', 'iovcnt'), param('uint32_t', 'timeout_msec'), ], ), future_function( 'mongoc_gridfs_file_ptr', 'mongoc_gridfs_find_one_with_opts', [ param('mongoc_gridfs_ptr', 'gridfs'), param('const_bson_ptr', 'filter'), param('const_bson_ptr', 'opts'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_server_description_ptr', 'mongoc_topology_select', [ param('mongoc_topology_ptr', 'topology'), param('mongoc_ss_optype_t', 'optype'), param('const_mongoc_ss_log_context_ptr', 'log_context'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('bool_ptr', 'must_use_primary'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_gridfs_ptr', 'mongoc_client_get_gridfs', [ param('mongoc_client_ptr', 'client'), param('const_char_ptr', 'db'), param('const_char_ptr', 'prefix'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_change_stream_ptr', 'mongoc_collection_watch', [param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'pipeline'), param('const_bson_ptr', 'opts')], ), future_function( 'bool', 'mongoc_change_stream_next', [param('mongoc_change_stream_ptr', 'stream'), param('const_bson_ptr_ptr', 'bson')], ), future_function('void', 'mongoc_change_stream_destroy', [param('mongoc_change_stream_ptr', 'stream')]), future_function( 'bool', 'mongoc_collection_delete_one', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'selector'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_delete_many', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'selector'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_remove', [ param('mongoc_collection_ptr', 'coll'), param('mongoc_remove_flags_t', 'flags'), param('const_bson_ptr', 'selector'), param('const_mongoc_write_concern_ptr', 'write_concern'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_update_one', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'selector'), param('const_bson_ptr', 'update'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_update_many', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'selector'), param('const_bson_ptr', 'update'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'bool', 'mongoc_collection_replace_one', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'selector'), param('const_bson_ptr', 'replacement'), param('const_bson_ptr', 'opts'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'int64_t', 'mongoc_collection_count_documents', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'filter'), param('const_bson_ptr', 'opts'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'int64_t', 'mongoc_collection_estimated_document_count', [ param('mongoc_collection_ptr', 'coll'), param('const_bson_ptr', 'opts'), param('const_mongoc_read_prefs_ptr', 'read_prefs'), param('bson_ptr', 'reply'), param('bson_error_ptr', 'error'), ], ), future_function( 'mongoc_bulkwritereturn_t', 'mongoc_bulkwrite_execute', [ param('mongoc_bulkwrite_ptr', 'bw'), param('const_mongoc_bulkwriteopts_ptr', 'opts'), ], ), ] for fn in future_functions: if fn.ret_type not in type_list_with_void: raise Exception('bad type "%s"\n\nin %s' % (fn.ret_type, fn)) for p in fn.params: if p.type_name not in type_list: raise Exception('bad type "%s"\n\nin %s' % (p.type_name, fn)) header_comment = """/************************************************** * * Generated by build/%s. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */""" % basename(__file__) def future_function_name(fn): if fn.name.startswith('mongoc'): # E.g. future_cursor_next(). return 'future' + fn.name[len('mongoc') :] else: # E.g. future_mongoc_client_command_simple(). return 'future_' + fn.name env = Environment(loader=FileSystemLoader(template_dir)) env.filters['future_function_name'] = future_function_name files = [ 'future.h', 'future.c', 'future-value.h', 'future-value.c', 'future-functions.h', 'future-functions.c', ] for file_name in files: print(file_name) with open(joinpath(mock_server_dir, file_name), 'w+') as f: t = env.get_template(file_name + '.template') f.write(t.render(globals())) f.write('\n') mongo-c-driver-2.2.1/build/generate-opts.py000066400000000000000000000477341511661753600206240ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """IDL for functions that take flexible options as a bson_t. Defines the options accepted by functions that receive a const bson_t *opts, for example mongoc_collection_find_with_opts, mongoc_collection_insert_one, and many others. Generates struct types, options parsing code, and RST documentation. Written for Python 2.6+, requires Jinja 2 for templating. """ # yapf: disable import re from collections import OrderedDict from os.path import basename, dirname, normpath from os.path import join as joinpath from jinja2 import Environment, FileSystemLoader # Please "pip install jinja2". this_dir = dirname(__file__) template_dir = joinpath(this_dir, 'opts_templates') src_dir = normpath(joinpath(this_dir, '../src/libmongoc/src/mongoc')) doc_includes = normpath(joinpath(this_dir, '../src/libmongoc/doc/includes')) def flatten(items): for item in items: if isinstance(item, list): # "yield from". for subitem in flatten(item): yield subitem else: yield item class Struct(OrderedDict): def __init__(self, items, opts_name='opts', generate_rst=True, generate_code=True, allow_extra=True, rst_prelude=None, **defaults): """Define an options struct. - items: List of pairs: (optionName, info) - opts_name: Name of the const bson_t *opts parameter - allow_extra: Whether to allow unrecognized options - defaults: Initial values for options """ OrderedDict.__init__(self, list(flatten(items))) self.is_shared = False self.opts_name = opts_name self.generate_rst = generate_rst self.generate_code = generate_code self.allow_extra = allow_extra self.defaults = defaults self.rst_prelude = rst_prelude def default(self, item, fallback): return self.defaults.get(item, fallback) class Shared(Struct): def __init__(self, items, **defaults): """Define a struct that is shared by others.""" super(Shared, self).__init__(items, **defaults) self.is_shared = True self.generate_rst = False read_concern_help = 'Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned.' read_concern_document_option = ('readConcern', { 'type': 'document', 'help': read_concern_help }) read_concern_option = ('readConcern', { 'type': 'mongoc_read_concern_t *', 'help': read_concern_help, 'convert': '_mongoc_convert_read_concern' }) write_concern_option = [ ('writeConcern', { 'type': 'mongoc_write_concern_t *', 'convert': '_mongoc_convert_write_concern', 'help': 'Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`.' }), ('write_concern_owned', { 'type': 'bool', 'internal': True, }) ] session_option = ('sessionId', { 'type': 'mongoc_client_session_t *', 'convert': '_mongoc_convert_session_id', 'field': 'client_session', 'help': 'First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`.' }) ordered_option = ('ordered', { 'type': 'bool', 'help': 'set to ``false`` to attempt to insert all documents, continuing after errors.' }) validate_option = ('validate', { 'type': 'bson_validate_flags_t', 'convert': '_mongoc_convert_validate_flags', 'help': 'Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents.' }) collation_option = ('collation', { 'type': 'document', 'help': 'Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned.' }) array_filters_option = ('arrayFilters', { 'type': 'array', 'help': 'An array of filters specifying to which array elements an update should apply.', }) upsert_option = ('upsert', { 'type': 'bool', 'help': 'When true, creates a new document if no document matches the query.' }) bypass_option = ('bypassDocumentValidation', { 'type': 'bool', 'field': 'bypass', 'help': 'Set to ``true`` to skip server-side schema validation of the provided BSON documents.' }) server_option = ('serverId', { 'type': 'uint32_t', 'convert': '_mongoc_convert_server_id', 'help': 'To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value.' }) hint_option = ('hint', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_hint', 'help': 'A document or string that specifies the index to use to support the query predicate.' }) let_option = ('let', { 'type': 'document', 'help': 'A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language.' }) comment_option_since_4_4 = ('comment', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_bson_value_t', 'help': 'A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later.' }) comment_option_string_pre_4_4 = ('comment', { 'type': 'bson_value_t', 'convert': '_mongoc_convert_bson_value_t', 'help': 'A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4.' }) opts_structs = OrderedDict([ ('mongoc_crud_opts_t', Shared([ write_concern_option, session_option, validate_option, comment_option_since_4_4, ])), ('mongoc_update_opts_t', Shared([ ('crud', {'type': 'mongoc_crud_opts_t'}), bypass_option, collation_option, hint_option, upsert_option, let_option, ])), ('mongoc_insert_one_opts_t', Struct([ ('crud', {'type': 'mongoc_crud_opts_t'}), bypass_option ], validate='_mongoc_default_insert_vflags')), ('mongoc_insert_many_opts_t', Struct([ ('crud', {'type': 'mongoc_crud_opts_t'}), ordered_option, bypass_option, ], validate='_mongoc_default_insert_vflags', ordered='true')), ('mongoc_delete_opts_t', Shared([ ('crud', {'type': 'mongoc_crud_opts_t'}), collation_option, hint_option, let_option, ])), ('mongoc_delete_one_opts_t', Struct([ ('delete', {'type': 'mongoc_delete_opts_t'}), ])), ('mongoc_delete_many_opts_t', Struct([ ('delete', {'type': 'mongoc_delete_opts_t'}), ])), ('mongoc_update_one_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), array_filters_option, ('sort', {'type': 'document', 'help': 'Specify a sort order when matching documents.'}) ], validate='_mongoc_default_update_vflags')), ('mongoc_update_many_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), array_filters_option, ], validate='_mongoc_default_update_vflags')), ('mongoc_replace_one_opts_t', Struct([ ('update', {'type': 'mongoc_update_opts_t'}), ('sort', {'type': 'document', 'help': 'Specify a sort order when matching documents.'}) ], validate='_mongoc_default_replace_vflags')), ('mongoc_bulk_opts_t', Struct([ write_concern_option, ordered_option, session_option, let_option, comment_option_since_4_4, ], allow_extra=False, ordered='true')), ('mongoc_bulk_insert_opts_t', Struct([ validate_option, ], validate='_mongoc_default_insert_vflags', allow_extra=False)), ('mongoc_bulk_update_opts_t', Shared([ validate_option, collation_option, hint_option, ('upsert', { 'type': 'bool', 'help': 'If true, insert a document if none match ``selector``.' }), ('multi', {'type': 'bool', 'hidden': True}) ])), ('mongoc_bulk_update_one_opts_t', Struct( [ ('update', {'type': 'mongoc_bulk_update_opts_t'}), ('sort', {'type': 'document', 'help': 'Specify a sort order when matching documents.'}), array_filters_option, ], multi='false', validate='_mongoc_default_update_vflags', allow_extra=False)), ('mongoc_bulk_update_many_opts_t', Struct( [ ('update', {'type': 'mongoc_bulk_update_opts_t'}), array_filters_option, ], multi='true', validate='_mongoc_default_update_vflags', allow_extra=False)), ('mongoc_bulk_replace_one_opts_t', Struct( [ ('update', {'type': 'mongoc_bulk_update_opts_t'}), ('sort', {'type': 'document', 'help': 'Specify a sort order when matching documents.'}) ], multi='false', validate='_mongoc_default_replace_vflags', allow_extra=False)), ('mongoc_bulk_remove_opts_t', Shared([ collation_option, hint_option, ('limit', {'type': 'int32_t', 'hidden': True}) ])), ('mongoc_bulk_remove_one_opts_t', Struct([ ('remove', {'type': 'mongoc_bulk_remove_opts_t'}), ], limit=1, allow_extra=False)), ('mongoc_bulk_remove_many_opts_t', Struct([ ('remove', {'type': 'mongoc_bulk_remove_opts_t'}), ], limit=0, allow_extra=False)), ('mongoc_change_stream_opts_t', Struct([ ('batchSize', {'type': 'int32_t', 'help': 'An ``int32`` requesting a limit of documents returned in each server reply. If positive, the ``batchSize`` is applied to both ``aggregate`` and ``getMore`` commands. If 0, the ``batchSize`` is only applied to the ``aggregate`` command (Useful to request an immediate cursor without significant server-side work. See `Aggregate Data Specifying Batch Size `_). If omitted or negative, the value is ignored and server defaults are used (See `Cursor Batches `_ for a description of server defaults).'}), ('resumeAfter', {'type': 'document', 'help': 'A ``Document`` representing the logical starting point of the change stream. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``startAfter`` and ``startAtOperationTime``.'}), ('startAfter', {'type': 'document', 'help': 'A ``Document`` representing the logical starting point of the change stream. Unlike ``resumeAfter``, this can resume notifications after an "invalidate" event. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAtOperationTime``.'}), ('startAtOperationTime', {'type': 'timestamp', 'help': 'A ``Timestamp``. The change stream only provides changes that occurred at or after the specified timestamp. Any command run against the server will return an operation time that can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAfter``.'}), ('maxAwaitTimeMS', {'type': 'int64_t', 'convert': '_mongoc_convert_int64_positive', 'help': 'An ``int64`` representing the maximum amount of time a call to :symbol:`mongoc_change_stream_next` will block waiting for data'}), ('fullDocument', { 'type': 'utf8', 'help': 'An optional UTF-8 string. Set this option to "default", ' '"updateLookup", "whenAvailable", or "required", If unset, ' 'The string "default" is assumed. Set this option to ' '"updateLookup" to direct the change stream cursor to ' 'lookup the most current majority-committed version of the ' 'document associated to an update change stream event.' }), ('fullDocumentBeforeChange', { 'type': 'utf8', 'help': 'An optional UTF-8 string. Set this option to ' '"whenAvailable", "required", or "off". When unset, the ' 'default value is "off". Similar to "fullDocument", but ' 'returns the value of the document before the associated ' 'change.', }), ('showExpandedEvents', { 'type': 'bool', 'help': 'Set to ``true`` to return an expanded list of change stream events. Available only on MongoDB versions >=6.0'}), comment_option_string_pre_4_4, ], fullDocument=None, fullDocumentBeforeChange=None, batchSize=-1, rst_prelude=".. versionchanged:: 2.0.0 ``batchSize`` of 0 is applied to the ``aggregate`` command. 0 was previously ignored.")), ('mongoc_create_index_opts_t', Struct([ write_concern_option, session_option, ], opts_name='command_opts')), ('mongoc_read_write_opts_t', Struct([ read_concern_document_option, write_concern_option, session_option, collation_option, server_option, ])), # Only for documentation - we use mongoc_read_write_opts_t for real parsing. ('mongoc_read_opts_t', Struct([ read_concern_document_option, session_option, collation_option, server_option, ], generate_code=False)), ('mongoc_write_opts_t', Struct([ write_concern_option, session_option, collation_option, server_option, ], generate_code=False)), ('mongoc_gridfs_bucket_opts_t', Struct([ ('bucketName', {'type': 'utf8', 'help': 'A UTF-8 string used as the prefix to the GridFS "chunks" and "files" collections. Defaults to "fs". The bucket name, together with the database and suffix collections must not exceed 120 characters. See the manual for `the max namespace length `_.'}), ('chunkSizeBytes', {'type': 'int32_t', 'convert': '_mongoc_convert_int32_positive', 'help': 'An ``int32`` representing the chunk size. Defaults to 255KB.'}), write_concern_option, read_concern_option ], bucketName="fs", chunkSizeBytes=(255 * 1024))), ('mongoc_gridfs_bucket_upload_opts_t', Struct([ ('chunkSizeBytes', {'type': 'int32_t', 'convert': '_mongoc_convert_int32_positive', 'help': 'An ``int32`` chunk size to use for this file. Overrides the ``chunkSizeBytes`` set on ``bucket``.'}), ('metadata', {'type': 'document', 'help': 'A :symbol:`bson_t` representing metadata to include with the file.'}) ])), ('mongoc_aggregate_opts_t', Struct([ read_concern_option, write_concern_option, session_option, bypass_option, collation_option, server_option, ('batchSize', {'type': 'int32_t', 'help': 'An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_cursor_next`', 'check_set': True}), let_option, comment_option_string_pre_4_4, hint_option, ])), ('mongoc_find_and_modify_appended_opts_t', Struct([ write_concern_option, session_option, hint_option, let_option, comment_option_since_4_4, ], opts_name='extra')), ('mongoc_count_document_opts_t', Struct([ read_concern_document_option, session_option, collation_option, server_option, # The CRUD spec specifies `skip` and `limit` as int64_t. The server appears to accept int32 and double. The C driver accepts any bson_value_t and relies on the server to return an error for an invalid type. ('skip', {'type': 'bson_value_t', 'help': 'An int specifying how many documents matching the ``query`` should be skipped before counting.'}), ('limit', {'type': 'bson_value_t', 'help': 'An int specifying the maximum number of documents to count.'}), comment_option_string_pre_4_4, hint_option ])), ]) header_comment = """/************************************************** * * Generated by build/%s. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */""" % basename(__file__) def paths(struct): """Sequence of path, option name, option info.""" for option_name, info in struct.items(): the_type = info['type'] the_field = info.get('field', option_name) if the_type in opts_structs: # E.g., the type is mongoc_crud_opts_t. Recurse. sub_struct = opts_structs[the_type] for path, sub_option_name, sub_info in paths(sub_struct): yield ('%s.%s' % (the_field, path), sub_option_name, sub_info) else: yield the_field, option_name, info def path_to(the_type, the_field): """Like "mongoc_update_one_opts->update.crud.write_concern_owned".""" for path, name, info in paths(opts_structs[the_type]): if name == the_field: return path raise ValueError( "No field '%s' in '%s'" % (the_field, the_type)) env = Environment(loader=FileSystemLoader(template_dir), trim_blocks=True, extensions=['jinja2.ext.loopcontrols']) files = ["mongoc-opts-private.h", "mongoc-opts.c"] for file_name in files: print(file_name) with open(joinpath(src_dir, file_name), 'w+') as f: t = env.get_template(file_name + ".template") f.write(t.render(globals())) f.write('\n') def document_opts(struct, f): for option_name, info in struct.items(): if info.get('internal') or info.get('hidden'): continue the_type = info['type'] if the_type in opts_structs: # E.g., the type is mongoc_crud_opts_t. Recurse. document_opts(opts_structs[the_type], f) continue assert 'help' in info, "No 'help' for '%s'" % option_name f.write("* ``{option_name}``: {info[help]}\n".format(**locals())) disclaimer = """ .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE """ for struct_name, struct in opts_structs.items(): if not struct.generate_rst: continue name = re.sub(r'mongoc_(\w+)_t', r'\1', struct_name).replace('_', '-') file_name = name + '.txt' print(file_name) f = open(joinpath(doc_includes, file_name), 'w') f.write (disclaimer) if struct.rst_prelude is not None: f.write(struct.rst_prelude) f.write("\n\n") f.write( "``%s`` may be NULL or a BSON document with additional" " command options:\n\n" % struct.opts_name) document_opts(struct, f) f.close() mongo-c-driver-2.2.1/build/mongodl.py000066400000000000000000000564421511661753600175020ustar00rootroot00000000000000""" Download and extract MongoDB components. Use '--help' for more information. """ import argparse import enum import hashlib import json import os import platform import re import shutil import sqlite3 import sys import tarfile import tempfile import textwrap import urllib.error import urllib.request import zipfile from collections import namedtuple from contextlib import contextmanager from fnmatch import fnmatch from pathlib import Path, PurePath, PurePosixPath DISTRO_ID_MAP = { 'elementary': 'ubuntu', 'fedora': 'rhel', 'centos': 'rhel', 'mint': 'ubuntu', 'linuxmint': 'ubuntu', 'opensuse-leap': 'sles', 'opensuse': 'sles', 'redhat': 'rhel', 'rocky': 'rhel', 'ol': 'rhel', } DISTRO_VERSION_MAP = { 'elementary': { '6': '20.04' }, 'fedora': { '32': '8', '33': '8', '34': '8', '35': '8', '36': '8' }, 'linuxmint': { '19': '18.04', '19.1': '18.04', '19.2': '18.04', '19.3': '18.04', '20': '20.04', '20.1': '20.04', '20.2': '20.04', '20.3': '20.04', '21': '22.04' }, } DISTRO_ID_TO_TARGET = { 'ubuntu': { '22.*': 'ubuntu2204', '20.*': 'ubuntu2004', '18.*': 'ubuntu1804', '16.*': 'ubuntu1604', '14.*': 'ubuntu1404', }, 'debian': { '9': 'debian92', '10': 'debian10', '11': 'debian11', }, 'rhel': { '6': 'rhel60', '6.*': 'rhel60', '7': 'rhel70', '7.*': 'rhel70', '8': 'rhel80', '8.*': 'rhel80', }, 'sles': { '10.*': 'suse10', '11.*': 'suse11', '12.*': 'suse12', '13.*': 'suse13', '15.*': 'suse15', }, 'amzn': { '2018.*': 'amzn64', '2': 'amazon2', }, } def infer_target(): if sys.platform == 'win32': return 'windows' if sys.platform == 'darwin': return 'macos' # Now the tricky bit cands = map(Path, ['/etc/os-release', '/usr/lib/os-release']) for c in cands: if c.is_file(): return _infer_target_os_rel(c) raise RuntimeError("We don't know how to find the default '--target'" " option for this system. Please contribute!") def _infer_target_os_rel(os_rel_path: Path): with Path(os_rel_path).open('r', encoding='utf-8') as f: content = f.read() id_re = re.compile(r'\bID=("?)(.*)\1') mat = id_re.search(content) assert mat, 'Unable to detect ID from [{}] content:\n{}'.format( os_rel_path, content) os_id = mat.group(2) if os_id == 'arch': # There are no Archlinux-specific MongoDB downloads, so we'll just use # the build for RHEL8, which is reasonably compatible with other modern # distributions (including Arch). return 'rhel80' ver_id_re = re.compile(r'VERSION_ID=("?)(.*)\1') mat = ver_id_re.search(content) assert mat, 'Unable to detect VERSION_ID from [{}] content:\n{}'.format( os_rel_path, content) ver_id = mat.group(2) mapped_id = DISTRO_ID_MAP.get(os_id) if mapped_id: print('Mapping distro "{}" to "{}"'.format(os_id, mapped_id)) ver_mapper = DISTRO_VERSION_MAP.get(os_id) if ver_mapper: mapped_version = ver_mapper[ver_id] print('Mapping version "{}" to "{}"'.format( ver_id, mapped_version)) ver_id = mapped_version os_id = mapped_id os_id = os_id.lower() if os_id not in DISTRO_ID_TO_TARGET: raise RuntimeError("We don't know how to map '{}' to a distribution " "download target. Please contribute!".format(os_id)) ver_table = DISTRO_ID_TO_TARGET[os_id] for pattern, target in ver_table.items(): if fnmatch(ver_id, pattern): return target raise RuntimeError( "We don't know how to map '{}' version '{}' to a distribution " "download target. Please contribute!".format(os_id, ver_id)) def caches_root(): if sys.platform == 'win32': return Path(os.environ['LocalAppData']) if sys.platform == 'darwin': return Path(os.environ['HOME'] + '/Library/Caches') xdg_cache = os.getenv('XDG_CACHE_HOME') if xdg_cache: return Path(xdg_cache) return Path(os.environ['HOME'] + '/.cache') def cache_dir(): return caches_root().joinpath('mongodl').absolute() @contextmanager def tmp_dir(): tdir = tempfile.mkdtemp() try: yield Path(tdir) finally: shutil.rmtree(tdir) def _import_json_data(db, json_file): db.execute('DELETE FROM meta') db.execute('DROP TABLE IF EXISTS components') db.execute('DROP TABLE IF EXISTS downloads') db.execute('DROP TABLE IF EXISTS versions') db.execute(r''' CREATE TABLE versions ( version_id INTEGER PRIMARY KEY, date TEXT NOT NULL, version TEXT NOT NULL, githash TEXT NOT NULL ) ''') db.execute(r''' CREATE TABLE downloads ( download_id INTEGER PRIMARY KEY, version_id INTEGER NOT NULL REFERENCES versions, target TEXT NOT NULL, arch TEXT NOT NULL, edition TEXT NOT NULL, ar_url TEST NOT NULL, data TEXT NOT NULL ) ''') db.execute(r''' CREATE TABLE components ( component_id INTEGER PRIMARY KEY, key TEXT NOT NULL, download_id INTEGER NOT NULL REFERENCES downloads, data TEXT NOT NULL, UNIQUE(key, download_id) ) ''') with json_file.open('r') as f: data = json.load(f) for ver in data['versions']: version = ver['version'] githash = ver['githash'] date = ver['date'] db.execute( r''' INSERT INTO versions (date, version, githash) VALUES (?, ?, ?) ''', (date, version, githash), ) version_id = db.lastrowid for dl in ver['downloads']: arch = dl.get('arch', 'null') target = dl.get('target', 'null') edition = dl['edition'] ar_url = dl['archive']['url'] db.execute( r''' INSERT INTO downloads (version_id, target, arch, edition, ar_url, data) VALUES (?, ?, ?, ?, ?, ?) ''', (version_id, target, arch, edition, ar_url, json.dumps(dl)), ) dl_id = db.lastrowid for key, data in dl.items(): if 'url' not in data: continue db.execute( r''' INSERT INTO components (key, download_id, data) VALUES (?, ?, ?) ''', (key, dl_id, json.dumps(data)), ) def _mkdir(dirpath): """ Ensure a directory at ``dirpath``, and all parent directories thereof. Cannot using Path.mkdir(parents, exist_ok) on some Python versions that we need to support. """ if dirpath.is_dir(): return par = dirpath.parent if par != dirpath: _mkdir(par) try: dirpath.mkdir() except FileExistsError: pass def get_dl_db(): caches = cache_dir() _mkdir(caches) db = sqlite3.connect(str(caches / 'downloads.db'), isolation_level=None) db.executescript(r''' CREATE TABLE IF NOT EXISTS meta ( etag TEXT, last_modified TEXT ) ''') db.executescript(r''' CREATE TABLE IF NOT EXISTS past_downloads ( url TEXT NOT NULL UNIQUE, etag TEXT, last_modified TEXT ) ''') changed, full_json = _download_file( db, 'https://downloads.mongodb.org/full.json') if not changed: return db with db: print('Refreshing downloads manifest ...') cur = db.cursor() cur.execute("begin") _import_json_data(cur, full_json) return db def _print_list(db, version, target, arch, edition, component): if version or target or arch or edition or component: matching = db.execute( r''' SELECT version, target, arch, edition, key, components.data FROM components, downloads USING(download_id), versions USING(version_id) WHERE (:component IS NULL OR key=:component) AND (:target IS NULL OR target=:target) AND (:arch IS NULL OR arch=:arch) AND (:edition IS NULL OR edition=:edition) AND (:version IS NULL OR version=:version) ''', dict(version=version, target=target, arch=arch, edition=edition, component=component), ) for version, target, arch, edition, comp_key, comp_data in matching: print('Download: {}\n\n' ' Version: {}\n\n' ' Target: {}\n\n' ' Arch: {}\n\n' ' Edition: {}\n\n' ' Info: {}\n\n'.format(comp_key, version, target, arch, edition, comp_data)) print('(Omit filter arguments for a list of available filters)') return arches, targets, editions, versions, components = next( iter( db.execute(r''' VALUES( (select group_concat(arch, ', ') from (select distinct arch from downloads)), (select group_concat(target, ', ') from (select distinct target from downloads)), (select group_concat(edition, ', ') from (select distinct edition from downloads)), (select group_concat(version, ', ') from (select distinct version from versions)), (select group_concat(key, ', ') from (select distinct key from components)) ) '''))) versions = '\n'.join( textwrap.wrap(versions, width=78, initial_indent=' ', subsequent_indent=' ')) targets = '\n'.join( textwrap.wrap(targets, width=78, initial_indent=' ', subsequent_indent=' ')) print('Architectures:\n' ' {}\n' 'Targets:\n' '{}\n' 'Editions:\n' ' {}\n' 'Versions:\n' '{}\n' 'Components:\n' ' {}\n'.format(arches, targets, editions, versions, components)) def infer_arch(): a = platform.machine() or platform.processor() # Remap platform names to the names used for downloads return { 'AMD64': 'x86_64', }.get(a, a) DLRes = namedtuple('DLRes', ['is_changed', 'path']) def _download_file(db, url): caches = cache_dir() info = list( db.execute( 'SELECT etag, last_modified FROM past_downloads WHERE url=?', [url])) etag = None modtime = None if info: etag, modtime = info[0] headers = {} if etag: headers['If-None-Match'] = etag if modtime: headers['If-Modified-Since'] = modtime req = urllib.request.Request(url, headers=headers) digest = hashlib.md5(url.encode("utf-8")).hexdigest()[:4] dest = caches / 'files' / digest / PurePosixPath(url).name try: resp = urllib.request.urlopen(req) except urllib.error.HTTPError as e: if e.code != 304: raise return DLRes(False, dest) else: print('Downloading [{}] ...'.format(url)) _mkdir(dest.parent) got_etag = resp.getheader("ETag") got_modtime = resp.getheader('Last-Modified') with dest.open('wb') as of: buf = resp.read(1024 * 1024 * 4) while buf: of.write(buf) buf = resp.read(1024 * 1024 * 4) db.execute( 'INSERT OR REPLACE INTO past_downloads (url, etag, last_modified) VALUES (?, ?, ?)', (url, got_etag, got_modtime)) return DLRes(True, dest) def _dl_component(db, out_dir, version, target, arch, edition, component, pattern, strip_components, test): print('Download {} v{}-{} for {}-{}'.format(component, version, edition, target, arch)) matching = db.execute( r''' SELECT components.data FROM components, downloads USING(download_id), versions USING(version_id) WHERE target=:target AND arch=:arch AND edition=:edition AND version=:version AND key=:component ''', dict(version=version, target=target, arch=arch, edition=edition, component=component), ) found = list(matching) if not found: raise ValueError( 'No download for "{}" was found for ' 'the requested version+target+architecture+edition'.format( component)) data = json.loads(found[0][0]) cached = _download_file(db, data['url']).path return _expand_archive(cached, out_dir, pattern, strip_components, test=test) def pathjoin(items): """ Return a path formed by joining the given path components """ return PurePath('/'.join(items)) def _test_pattern(path, pattern): """ Test whether the given 'path' string matches the globbing pattern 'pattern'. Supports the '**' pattern to match any number of intermediate directories. """ if pattern is None: return True # Convert to path objects path = PurePath(path) pattern = PurePath(pattern) # Split pattern into parts pattern_parts = pattern.parts if not pattern_parts: # An empty pattern always matches return True path_parts = path.parts if not path_parts: # Non-empty pattern requires more path components return False pattern_head = pattern_parts[0] pattern_tail = pathjoin(pattern_parts[1:]) if pattern_head == '**': # Special "**" pattern matches and suffix of the path # Generate each suffix: tails = (path_parts[i:] for i in range(len(path_parts))) # Test if any of the suffixes match the remainder of the pattern: return any(_test_pattern(pathjoin(t), pattern_tail) for t in tails) if not fnmatch(path.parts[0], pattern_head): # Leading path component cannot match return False # The first component matches. Test the remainder: return _test_pattern(pathjoin(path_parts[1:]), pattern_tail) class ExpandResult(enum.Enum): Empty = 0 Okay = 1 def _expand_archive(ar, dest, pattern, strip_components, test): ''' Expand the archive members from 'ar' into 'dest'. If 'pattern' is not-None, only extracts members that match the pattern. ''' print('Extract from: [{}]'.format(ar.name)) print(' into: [{}]'.format(dest)) if ar.suffix == '.zip': n_extracted = _expand_zip(ar, dest, pattern, strip_components, test=test) elif ar.suffix == '.tgz': n_extracted = _expand_tgz(ar, dest, pattern, strip_components, test=test) else: raise RuntimeError('Unknown archive file extension: ' + ar.suffix) verb = 'would be' if test else 'were' if n_extracted == 0: if pattern and strip_components: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by "--only={p}" and/or "--strip-components={s}"'. format(p=pattern, s=strip_components, verb=verb)) elif pattern: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by the "--only={p}" filter'.format(p=pattern, verb=verb)) elif strip_components: print('NOTE: No files {verb} extracted. Likely all files {verb} ' 'excluded by "--strip-components={s}"'.format( s=strip_components, verb=verb)) else: print('NOTE: No files {verb} extracted. Empty archive?'.format( verb=verb)) return ExpandResult.Empty elif n_extracted == 1: print('One file {v} extracted'.format(v='would be' if test else 'was')) return ExpandResult.Okay else: print('{n} files {verb} extracted'.format(n=n_extracted, verb=verb)) return ExpandResult.Okay def _expand_tgz(ar, dest, pattern, strip_components, test): 'Expand a tar.gz archive' n_extracted = 0 with tarfile.open(str(ar), 'r:*') as tf: for mem in tf.getmembers(): n_extracted += _maybe_extract_member( dest, mem.name, pattern, strip_components, mem.isdir(), lambda: tf.extractfile(mem), mem.mode, test=test, ) return n_extracted def _expand_zip(ar, dest, pattern, strip_components, test): 'Expand a .zip archive.' n_extracted = 0 with zipfile.ZipFile(ar, 'r') as zf: for item in zf.infolist(): n_extracted += _maybe_extract_member( dest, item.filename, pattern, strip_components, item.is_dir(), lambda: zf.open(item, 'r'), 0o655, test=test, ) return n_extracted def _maybe_extract_member(out, relpath, pattern, strip, is_dir, opener, modebits, test): """ Try to extract an archive member according to the given arguments. :return: Zero if the file was excluded by filters, one otherwise. """ relpath = PurePath(relpath) print(' | {:-<65} |'.format(str(relpath) + ' '), end='') if len(relpath.parts) <= strip: # Not enough path components print(' (Excluded by --strip-components)') return 0 if not _test_pattern(relpath, pattern): # Doesn't match our pattern print(' (excluded by pattern)') return 0 stripped = pathjoin(relpath.parts[strip:]) dest = Path(out) / stripped print('\n -> [{}]'.format(dest)) if test: # We are running in test-only mode: Do not do anything return 1 if is_dir: _mkdir(dest) return 1 with opener() as infile: _mkdir(dest.parent) with dest.open('wb') as outfile: shutil.copyfileobj(infile, outfile) os.chmod(str(dest), modebits) return 1 def main(): parser = argparse.ArgumentParser(description=__doc__) grp = parser.add_argument_group('List arguments') grp.add_argument('--list', action='store_true', help='List available components, targets, editions, and ' 'architectures. Download arguments will act as filters.') dl_grp = parser.add_argument_group( 'Download arguments', description='Select what to download and extract. ' 'Non-required arguments will be inferred ' 'based on the host system.') dl_grp.add_argument('--target', '-T', help='The target platform for which to download. ' 'Use "--list" to list available targets.') dl_grp.add_argument('--arch', '-A', help='The architecture for which to download') dl_grp.add_argument( '--edition', '-E', help='The edition of the product to download (Default is "enterprise"). ' 'Use "--list" to list available editions.') dl_grp.add_argument( '--out', '-o', help='The directory in which to download components. (Required)', type=Path) dl_grp.add_argument('--version', '-V', help='The product version to download (Required). ' 'Use "--list" to list available versions.') dl_grp.add_argument('--component', '-C', help='The component to download (Required). ' 'Use "--list" to list available components.') dl_grp.add_argument( '--only', help= 'Restrict extraction to items that match the given globbing expression. ' 'The full archive member path is matched, so a pattern like "*.exe" ' 'will only match "*.exe" at the top level of the archive. To match ' 'recursively, use the "**" pattern to match any number of ' 'intermediate directories.') dl_grp.add_argument( '--strip-path-components', '-p', dest='strip_components', metavar='N', default=0, type=int, help= 'Strip the given number of path components from archive members before ' 'extracting into the destination. The relative path of the archive ' 'member will be used to form the destination path. For example, a ' 'member named [bin/mongod.exe] will be extracted to [/bin/mongod.exe]. ' 'Using --strip-components=1 will remove the first path component, extracting ' 'such an item to [/mongod.exe]. If the path has fewer than N components, ' 'that archive member will be ignored.') dl_grp.add_argument( '--test', action='store_true', help='Do not extract or place any files/directories. ' 'Only print what will be extracted without placing any files.') dl_grp.add_argument('--empty-is-error', action='store_true', help='If all files are excluded by other filters, ' 'treat that situation as an error and exit non-zero.') args = parser.parse_args() db = get_dl_db() if args.list: _print_list(db, args.version, args.target, args.arch, args.edition, args.component) return if args.version is None: raise argparse.ArgumentError(None, 'A "--version" is required') if args.component is None: raise argparse.ArgumentError( None, 'A "--component" name should be provided') if args.out is None: raise argparse.ArgumentError(None, 'A "--out" directory should be provided') target = args.target or infer_target() arch = args.arch or infer_arch() edition = args.edition or 'enterprise' out = args.out or Path.cwd() out = out.absolute() result = _dl_component(db, out, version=args.version, target=target, arch=arch, edition=edition, component=args.component, pattern=args.only, strip_components=args.strip_components, test=args.test) if result is ExpandResult.Empty: return 1 return 0 if __name__ == '__main__': sys.exit(main()) mongo-c-driver-2.2.1/build/opts_templates/000077500000000000000000000000001511661753600205215ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/opts_templates/mongoc-opts-private.h.template000066400000000000000000000041561511661753600264270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OPTS_H #define MONGOC_OPTS_H #include #include #include #include {{ header_comment }} {% for struct_type, description in opts_structs.items() %} {% if not description.generate_code %}{% continue %}{% endif %} typedef struct _{{ struct_type }} { {% for opt_name, info in description.items() %} {% if info['type'] == 'utf8' %} {% set the_type = 'const char *' %} {% elif info['type'] in ('document', 'array') %} {% set the_type = 'bson_t' %} {% elif info['type'] == 'timestamp' %} {% set the_type = 'mongoc_timestamp_t' %} {% else %} {% set the_type = info['type'] %} {% endif %} {% set the_name = info.get('field', opt_name) %} {% set space = '' if the_type.endswith('*') else ' ' %} {{ the_type }}{{ space }}{{ the_name }}; {% if info.check_set %} bool {{ the_name }}_is_set; {% endif %} {% endfor %} {% if not description.is_shared %} bson_t extra; {% endif %} } {{ struct_type }}; {% endfor %} {% for struct_type, description in opts_structs.items() %} {% if description.is_shared or not description.generate_code %}{% continue %}{% endif %} {% set struct_name = struct_type.split('_t', -1)[0] %} bool _{{ struct_name }}_parse ( mongoc_client_t *client, const bson_t *opts, {{ struct_type }} *{{ struct_name }}, bson_error_t *error); void _{{ struct_name }}_cleanup ({{ struct_type }} *{{ struct_name }}); {% endfor %} #endif /* MONGOC_OPTS_H */ mongo-c-driver-2.2.1/build/opts_templates/mongoc-opts.c.template000066400000000000000000000115521511661753600247500ustar00rootroot00000000000000#include #include #include #include #include {{ header_comment }} {% for struct_type, description in opts_structs.items() %} {% if description.is_shared or not description.generate_code %}{% continue %}{% endif %} {% set struct_name = struct_type.split('_t', -1)[0] %} bool _{{ struct_name }}_parse ( mongoc_client_t *client, const bson_t *opts, {{ struct_type }} *{{ struct_name }}, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. {% for path, opt_name, info in paths(description) %} {% if info['type'] == 'bool' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'false') }}; {% elif info['type'].startswith('int') or info['type'].startswith('uint') %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 0) }}; {% elif info['type'] == 'bson_validate_flags_t' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'BSON_VALIDATE_NONE') }}; {% elif info['type'] == 'mongoc_write_bypass_document_validation_t' %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'MONGOC_BYPASS_DOCUMENT_VALIDATION_DEFAULT') }}; {% elif info['type'] == 'bson_value_t' %} memset (&{{ struct_name }}->{{ path }}, 0, sizeof (bson_value_t)); {% elif info['type'] in ('document', 'array') %} bson_init (&{{ struct_name }}->{{ path }}); {% elif info['type'] == 'utf8' %} {% set dflt = description.default(opt_name, "") -%} {{ struct_name }}->{{ path }} = {{ "NULL" if dflt is none else (dflt|tojson) }}; {% elif info['type'] == 'timestamp' %} memset (&{{ struct_name }}->{{ path }}, 0, sizeof (mongoc_timestamp_t)); {% else %} {{ struct_name }}->{{ path }} = {{ description.default(opt_name, 'NULL') }}; {% endif %} {% if info['check_set'] %} {{ struct_name }}->{{ opt_name }}_is_set = false; {% endif %} {% endfor %} bson_init (&{{ struct_name }}->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { {% for path, opt_name, info in paths(description) %} {% if info.get('internal') %} {% continue %} {% endif %} {% if info['type'] == 'utf8' %} {% set the_type = 'const char *' %} {% elif info['type'] in ('document', 'array') %} {% set the_type = 'bson_t' %} {% else %} {% set the_type = info['type'] %} {% endif %} {% set the_name = info.get('field', opt_name) %} {% set the_converter = info.get('convert', '_mongoc_convert_' + info['type'] ) %} {% if loop.index > 1 %}else {% endif %}if (!strcmp (bson_iter_key (&iter), "{{ opt_name }}")) { if (!{{ the_converter }} ( client, &iter, &{{ struct_name }}->{{ path }}, error)) { return false; } {% if the_converter == '_mongoc_convert_write_concern' %} {{ struct_name }}->{{ path_to(struct_type, "write_concern_owned") }} = true; {% endif %} {% if info['check_set'] %} {{ struct_name }}->{{ the_name }}_is_set = true; {% endif %} } {% endfor %} else { {% if description.allow_extra %} /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &{{ struct_name }}->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } {% else %} _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; {% endif %} } } return true; } void _{{ struct_name }}_cleanup ({{ struct_type }} *{{ struct_name }}) { {% for path, opt_name, info in paths(description) %} {% if info['type'] == 'mongoc_write_concern_t *' %} if ({{ struct_name }}->{{ path_to(struct_type, "write_concern_owned") }}) { mongoc_write_concern_destroy ({{ struct_name }}->{{ path }}); } {% elif info['type'] == 'bson_value_t' %} bson_value_destroy (&{{ struct_name }}->{{ path }}); {% elif info['type'] in ('document', 'array') %} bson_destroy (&{{ struct_name }}->{{ path }}); {% elif info['type'] == 'mongoc_read_concern_t *' %} mongoc_read_concern_destroy ({{ struct_name }}->{{ path }}); {% endif %} {% endfor %} bson_destroy (&{{struct_name }}->extra); }{% endfor %} mongo-c-driver-2.2.1/build/proc-ctl.py000066400000000000000000000205151511661753600175560ustar00rootroot00000000000000""" Extremely basic subprocess control """ import argparse import json import os import random import signal import subprocess import sys import time import traceback from datetime import datetime, timedelta from pathlib import Path from typing import TYPE_CHECKING, NoReturn, Sequence, Union, cast if TYPE_CHECKING: from typing import Literal, NamedTuple, TypedDict INTERUPT_SIGNAL = signal.SIGINT if os.name != 'nt' else signal.CTRL_C_SIGNAL def create_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser('proc-ctl') grp = parser.add_subparsers(title='Commands', dest='command', metavar='') start = grp.add_parser('start', help='Start a new subprocess') start.add_argument('--ctl-dir', help='The control directory for the subprocess', required=True, type=Path) start.add_argument('--cwd', help='The new subdirectory of the spawned process', type=Path) start.add_argument('--spawn-wait', help='Number of seconds to wait for child to be running', type=float, default=3) start.add_argument('child_command', nargs='+', help='The command to execute', metavar=' [args...]') stop = grp.add_parser('stop', help='Stop a running subprocess') stop.add_argument('--ctl-dir', help='The control directory for the subprocess', required=True, type=Path) stop.add_argument('--stop-wait', help='Number of seconds to wait for stopping', type=float, default=5) stop.add_argument( '--if-not-running', help='Action to take if the child is not running', choices=['fail', 'ignore'], default='fail', ) ll_run = grp.add_parser('__run') ll_run.add_argument('--ctl-dir', type=Path, required=True) ll_run.add_argument('child_command', nargs='+') return parser if TYPE_CHECKING: StartCommandArgs = NamedTuple( 'StartCommandArgs', [ ('command', Literal['start']), ('ctl_dir', Path), ('cwd', Path), ('child_command', Sequence[str]), ('spawn_wait', float), ], ) StopCommandArgs = NamedTuple( 'StopCommandArgs', [ ('command', Literal['stop']), ('ctl_dir', Path), ('stop_wait', float), ('if_not_running', Literal['fail', 'ignore']), ], ) _RunCommandArgs = NamedTuple( '_RunCommandArgs', [ ('command', Literal['__run']), ('child_command', Sequence[str]), ('ctl_dir', Path), ], ) CommandArgs = Union[StartCommandArgs, StopCommandArgs, _RunCommandArgs] _ResultType = TypedDict('_ResultType', {'exit': 'str | int | None', 'error': 'str | None'}) def parse_argv(argv: 'Sequence[str]') -> 'CommandArgs': parser = create_parser() args = parser.parse_args(argv) return cast('CommandArgs', args) class _ChildControl: def __init__(self, ctl_dir: Path) -> None: self._ctl_dir = ctl_dir @property def pid_file(self): """The file containing the child PID""" return self._ctl_dir / 'pid.txt' @property def result_file(self): """The file containing the exit result""" return self._ctl_dir / 'exit.json' def set_pid(self, pid: int): write_text(self.pid_file, str(pid)) def get_pid(self) -> 'int | None': try: txt = self.pid_file.read_text() except FileNotFoundError: return None return int(txt) def set_exit(self, exit: 'str | int | None', error: 'str | None') -> None: write_text(self.result_file, json.dumps({'exit': exit, 'error': error})) remove_file(self.pid_file) def get_result(self) -> 'None | _ResultType': try: txt = self.result_file.read_text() except FileNotFoundError: return None return json.loads(txt) def clear_result(self) -> None: remove_file(self.result_file) def _start(args: 'StartCommandArgs') -> int: ll_run_cmd = [ sys.executable, '-u', '--', __file__, '__run', '--ctl-dir={}'.format(args.ctl_dir), '--', *args.child_command, ] args.ctl_dir.mkdir(exist_ok=True, parents=True) child = _ChildControl(args.ctl_dir) if child.get_pid() is not None: raise RuntimeError('Child process is already running [PID {}]'.format(child.get_pid())) child.clear_result() # Spawn the child controller subprocess.Popen( ll_run_cmd, cwd=args.cwd, stderr=subprocess.STDOUT, stdout=args.ctl_dir.joinpath('runner-output.txt').open('wb'), stdin=subprocess.DEVNULL, ) expire = datetime.now() + timedelta(seconds=args.spawn_wait) # Wait for the PID to appear while child.get_pid() is None and child.get_result() is None: if expire < datetime.now(): break time.sleep(0.1) # Check that it actually spawned if child.get_pid() is None: result = child.get_result() if result is None: raise RuntimeError('Failed to spawn child runner?') if result['error']: print(result['error'], file=sys.stderr) raise RuntimeError('Child exited immediately [Exited {}]'.format(result['exit'])) # Wait to see that it is still running after --spawn-wait seconds while child.get_result() is None: if expire < datetime.now(): break time.sleep(0.1) # A final check to see if it is running result = child.get_result() if result is not None: if result['error']: print(result['error'], file=sys.stderr) raise RuntimeError('Child exited prematurely [Exited {}]'.format(result['exit'])) return 0 def _stop(args: 'StopCommandArgs') -> int: child = _ChildControl(args.ctl_dir) pid = child.get_pid() if pid is None: if args.if_not_running == 'fail': raise RuntimeError('Child process is not running') elif args.if_not_running == 'ignore': # Nothing to do return 0 else: assert False os.kill(pid, INTERUPT_SIGNAL) expire_at = datetime.now() + timedelta(seconds=args.stop_wait) while expire_at > datetime.now() and child.get_result() is None: time.sleep(0.1) result = child.get_result() if result is None: raise RuntimeError('Child process did not exit within the grace period') return 0 def __run(args: '_RunCommandArgs') -> int: this = _ChildControl(args.ctl_dir) try: pipe = subprocess.Popen( args.child_command, stdout=args.ctl_dir.joinpath('child-output.txt').open('wb'), stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL, ) except: this.set_exit('spawn-failed', traceback.format_exc()) raise this.set_pid(pipe.pid) retc = None try: while 1: try: retc = pipe.wait(0.5) except subprocess.TimeoutExpired: pass except KeyboardInterrupt: pipe.send_signal(INTERUPT_SIGNAL) if retc is not None: break finally: this.set_exit(retc, None) return 0 def write_text(fpath: Path, content: str): """ "Atomically" write a new file. This writes the given ``content`` into a temporary file, then renames that file into place. This prevents readers from seeing a partial read. """ tmp = fpath.with_name(fpath.name + '.tmp') remove_file(tmp) tmp.write_text(content) os.sync() remove_file(fpath) tmp.rename(fpath) def remove_file(fpath: Path): """ Safely remove a file. Because Win32, deletes are asynchronous, so we rename to a random filename, then delete that file. This ensures the file is "out of the way", even if it takes some time to delete. """ delname = fpath.with_name(fpath.name + '.delete-' + str(random.randint(0, 999999))) try: fpath.rename(delname) except FileNotFoundError: return delname.unlink() def main(argv: 'Sequence[str]') -> int: args = parse_argv(argv) if args.command == 'start': return _start(args) if args.command == '__run': return __run(args) if args.command == 'stop': return _stop(args) return 0 def start_main() -> NoReturn: sys.exit(main(sys.argv[1:])) if __name__ == '__main__': start_main() mongo-c-driver-2.2.1/build/requirements.txt000066400000000000000000000002121511661753600207350ustar00rootroot00000000000000jinja2 git+https://github.com/mongodb-labs/drivers-evergreen-tools#subdirectory=evergreen_config_generator&egg=evergreen_config_generator mongo-c-driver-2.2.1/build/sphinx/000077500000000000000000000000001511661753600167675ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/sphinx/homepage-config/000077500000000000000000000000001511661753600220175ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/sphinx/homepage-config/.gitignore000066400000000000000000000000451511661753600240060ustar00rootroot00000000000000__pycache__/ *.py[cod] _build/ html/ mongo-c-driver-2.2.1/build/sphinx/homepage-config/conf.py000066400000000000000000000040461511661753600233220ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import sys from docutils import nodes # Import common docs config. this_path = os.path.dirname(__file__) sys.path.append(os.path.normpath(os.path.join(this_path, '../'))) from mongoc_common import * # noqa: E402, F403 with open(this_path + '/../../../VERSION_CURRENT') as vc: release = version = vc.read() # -- General configuration ------------------------------------------------ templates_path = ['_templates'] source_suffix = '.rst' master_doc = 'index' # General information about the project. project = 'mongoc.org' copyright = '2009-present, MongoDB, Inc.' author = 'MongoDB, Inc' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # Support :download-link:`bson` or :download-link:`mongoc`. def download_link(typ, rawtext, text, lineno, inliner, options={}, content=[]): if text == 'mongoc': lib = 'mongo-c-driver' else: raise ValueError('download link must be mongoc, not "%s"' % text) title = '%s-%s' % (lib, version) url = ('https://github.com/mongodb/mongo-c-driver/releases/tag/%(version)s') % {'version': version} pnode = nodes.reference(title, title, internal=False, refuri=url) return [pnode], [] def setup(app): mongoc_common_setup(app) # noqa: F405 app.add_role('download-link', download_link) # -- Options for HTML output ---------------------------------------------- html_theme = 'furo' html_title = html_shorttitle = 'MongoDB C Driver %s' % version # html_favicon = None html_use_smartypants = False html_show_sourcelink = False html_use_index = False rst_prolog = r""" .. _mongodb_docs_cdriver: https://www.mongodb.com/docs/languages/c/c-driver/current/ """ html_sidebars = {'**': []} # Note: http://www.sphinx-doc.org/en/1.5.1/config.html#confval-html_copy_source # This will degrade the Javascript quicksearch if we ever use it. html_copy_source = False mongo-c-driver-2.2.1/build/sphinx/homepage-config/index.rst000066400000000000000000000023141511661753600236600ustar00rootroot00000000000000MongoDB C Driver - API ====================== **A Cross Platform MongoDB Client Library for C** The MongoDB C Driver, also known as "libmongoc", is a library for using MongoDB from C applications, and for writing MongoDB drivers in higher-level languages. It depends on `libbson `_ to generate and parse BSON documents, the native data format of MongoDB. This site documents the API. For tutorials, guides, and explainers, see `MongoDB C Driver `_. Download -------- Latest release: :download-link:`mongoc` Documentation ------------- For tutorials, guides, and explainers, see `MongoDB C Driver `_. - `libmongoc API documentation `_ - `libbson API documentation `_ How To Ask For Help ------------------- For help using the driver: `MongoDB Community Forums `_. To file a bug or feature request: `MongoDB Jira Issue Tracker `_. Documentation for Older Versions -------------------------------- .. toctree:: :titlesonly: libmongoc-releases libbson-releases mongo-c-driver-2.2.1/build/sphinx/homepage-config/libbson-releases.rst000066400000000000000000000002321511661753600257770ustar00rootroot00000000000000.. After rendering to html, this gets copied to the gh-pages branch under /libbson/index.html libbson Releases ---------------- .. versionlist:: libbsonmongo-c-driver-2.2.1/build/sphinx/homepage-config/libmongoc-releases.rst000066400000000000000000000002421511661753600263210ustar00rootroot00000000000000.. After rendering to html, this gets copied to the gh-pages branch under /libmongoc/index.html libmongoc Releases ------------------ .. versionlist:: libmongocmongo-c-driver-2.2.1/build/sphinx/mongoc/000077500000000000000000000000001511661753600202515ustar00rootroot00000000000000mongo-c-driver-2.2.1/build/sphinx/mongoc/__init__.py000066400000000000000000000031311511661753600223600ustar00rootroot00000000000000from docutils.nodes import Text, literal from docutils.parsers.rst import roles from sphinx import version_info as sphinx_version_info from sphinx.roles import XRefRole class SymbolRole(XRefRole): def __call__(self, *args, **kwargs): nodes, messages = XRefRole.__call__(self, *args, **kwargs) for node in nodes: attrs = node.attributes target = attrs['reftarget'] parens = '' if target.endswith('()'): # Function call, :symbol:`mongoc_init()` target = target[:-2] parens = '()' if ':' in target: # E.g., 'bson:bson_t' has domain 'bson', target 'bson_t' attrs['domain'], name = target.split(':', 1) attrs['reftarget'] = name old = node.children[0].children[0] assert isinstance(old, Text) new = Text(name + parens, name + parens) # Ensure setup_child is called. node.children[0].replace(old, new) else: attrs['reftarget'] = target attrs['reftype'] = 'doc' attrs['classes'].append('symbol') if sphinx_version_info >= (1, 6): # https://github.com/sphinx-doc/sphinx/issues/3698 attrs['refdomain'] = 'std' return nodes, messages def setup(app): roles.register_local_role('symbol', SymbolRole(warn_dangling=True, innernodeclass=literal)) return { 'version': '1.0', 'parallel_read_safe': True, 'parallel_write_safe': True, } mongo-c-driver-2.2.1/build/sphinx/mongoc_common.py000066400000000000000000000145371511661753600222050ustar00rootroot00000000000000import os import re from pathlib import Path from typing import Any, Dict, Iterable, List, Sequence, Tuple, Union from docutils import nodes from docutils.nodes import Node, document from sphinx.application import Sphinx from sphinx.application import logger as sphinx_log try: from sphinx.builders.dirhtml import DirectoryHTMLBuilder except ImportError: # Try importing from older Sphinx version path. from sphinx.builders.html import DirectoryHTMLBuilder from docutils.parsers.rst import Directive # Do not require newer sphinx. EPEL packages build man pages with Sphinx 1.7.6. Refer: CDRIVER-4767 needs_sphinx = '1.7' author = 'MongoDB, Inc' # -- Options for HTML output ---------------------------------------------- smart_quotes = False html_show_sourcelink = False # Note: http://www.sphinx-doc.org/en/1.5.1/config.html#confval-html_copy_source # This will degrade the Javascript quicksearch if we ever use it. html_copy_source = False def _file_man_page_name(fpath: Path) -> Union[str, None]: "Given an rST file input, find the :man_page: frontmatter value, if present" lines = fpath.read_text().splitlines() for line in lines: mat = re.match(r':man_page:\s+(.+)', line) if not mat: continue return mat[1] def _collect_man(app: Sphinx): # Note: 'app' is partially-formed, as this is called from the Sphinx.__init__ docdir = Path(app.srcdir) # Find everything: children = docdir.rglob('*') # Find only regular files: files = filter(Path.is_file, children) # Find files that have a .rst extension: rst_files = (f for f in files if f.suffix == '.rst') # Pair each file with its :man_page: frontmatter, if present: with_man_name = ((f, _file_man_page_name(f)) for f in rst_files) # Filter out pages that do not have a :man_page: item:s pairs: Iterable[tuple[Path, str]] = ((f, m) for f, m in with_man_name if m) # Populate the man_pages: for filepath, man_name in pairs: # Generate the docname. relative_path = filepath.relative_to(app.srcdir) # The docname is relative to the source directory, and excludes the suffix. docname = str(relative_path.parent / filepath.stem) assert docname, filepath man_pages.append((docname, man_name, '', [author], 3)) # -- Options for manual page output --------------------------------------- # NOTE: This starts empty, but we populate it in `setup` in _collect_man() (see above) man_pages: List[Tuple[str, str, str, List[str], int]] = [] # If true, show URL addresses after external links. # # man_show_urls = False # -- Sphinx customization --------------------------------------- def add_ga_javascript(app: Sphinx, pagename: str, templatename: str, context: Dict[str, Any], doctree: document): if not app.env.config.analytics: return # Add google analytics. context['metatags'] = ( context.get('metatags', '') + """ """ ) class VersionList(Directive): """Custom directive to generate the version list from an environment variable""" option_spec = {} has_content = True def run(self) -> Sequence[Node]: if self.content[0] != 'libmongoc' and self.content[0] != 'libbson': print('versionlist must be libmongoc or libbson') return [] libname = self.content[0] env_name = libname.upper() + '_VERSION_LIST' if env_name not in os.environ: print(env_name + ' not set, not generating version list') return [] versions = os.environ[env_name].split(',') header = nodes.paragraph('', '') p = nodes.paragraph('', '') uri = 'https://www.mongoc.org/%s/%s/index.html' % (libname, versions[0]) p += nodes.reference('', 'Latest Release (%s)' % versions[0], internal=False, refuri=uri) header += p p = nodes.paragraph('', '') uri = 'https://s3.amazonaws.com/mciuploads/mongo-c-driver/docs/%s/latest/index.html' % (libname) p += nodes.reference('', 'Current Development (master)', internal=False, refuri=uri) header += p blist = nodes.bullet_list() for v in versions: item = nodes.list_item() p = nodes.paragraph('', '') uri = 'https://www.mongoc.org/%s/%s/index.html' % (libname, v) p += nodes.reference('', v, internal=False, refuri=uri) item += p blist += item return [header, blist] def generate_html_redirs(app: Sphinx, page: str, templatename: str, context: Dict[str, Any], doctree: Any) -> None: builder = app.builder if not isinstance(builder, DirectoryHTMLBuilder) or 'writing-redirect' in context: return if page == 'index' or page.endswith('.index'): return path = app.project.doc2path(page, True) out_index_html = Path(builder.get_outfilename(page)) slug = out_index_html.parent.name redirect_file = out_index_html.parent.parent / f'{slug}.html' # HACK: handle_page() is not properly reentrant. Save and restore state for # this page while we generate our redirects page: prev_scripts = builder.script_files[:] prev_css = builder.css_files[:] builder.handle_page( f'redirect-for-{page}', {'target': page, 'writing-redirect': 1}, str(Path(__file__).parent.resolve() / 'redirect.t.html'), # Note: In Sphinx 8.2, this argument changed from `str` to `Path`, but # continues to work with `str`. A future version might need this changed # to pass a `Path`, but we can keep `str` for now. outfilename=str(redirect_file), # type: ignore ) # Restore prior state: builder.script_files[:] = prev_scripts builder.css_files[:] = prev_css sphinx_log.debug('Wrote redirect: %r -> %r', path, page) def mongoc_common_setup(app: Sphinx): _collect_man(app) app.connect('html-page-context', generate_html_redirs) app.connect('html-page-context', add_ga_javascript) # Run sphinx-build -D analytics=1 to enable Google Analytics. app.add_config_value('analytics', False, 'html') app.add_directive('versionlist', VersionList) mongo-c-driver-2.2.1/build/sphinx/redirect.t.html000066400000000000000000000005201511661753600217150ustar00rootroot00000000000000{%- extends "!page.html" %} {% block extrahead -%} {%- endblock %} {% block content %}

    This page has been migrated to

    {{ pathto(target) | e }}
    . You should be redirected to this location automatically in a few seconds.

    {% endblock %} mongo-c-driver-2.2.1/docs/000077500000000000000000000000001511661753600153075ustar00rootroot00000000000000mongo-c-driver-2.2.1/docs/dev/000077500000000000000000000000001511661753600160655ustar00rootroot00000000000000mongo-c-driver-2.2.1/docs/dev/Makefile000066400000000000000000000010731511661753600175260ustar00rootroot00000000000000.SILENT: .PHONY: poetry-install html serve default: html THIS_FILE := $(realpath $(lastword $(MAKEFILE_LIST))) THIS_DIR := $(shell dirname $(THIS_FILE)) MONGOC_DIR := $(shell dirname $(shell dirname $(THIS_DIR))) BUILD_DIR := $(MONGOC_DIR)/_build SPHINX_JOBS ?= auto SPHINX_ARGS := -W -n -j "$(SPHINX_JOBS)" -a -b dirhtml DOCS_SRC := $(THIS_DIR) DOCS_OUT := $(BUILD_DIR)/docs/dev/html html: uv run --frozen sphinx-build $(SPHINX_ARGS) $(DOCS_SRC) $(DOCS_OUT) serve: uv run --frozen --with sphinx-autobuild sphinx-autobuild $(SPHINX_ARGS) $(DOCS_SRC) $(DOCS_OUT) mongo-c-driver-2.2.1/docs/dev/conf.py000066400000000000000000000063051511661753600173700ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information import re from pathlib import Path from typing import Callable from sphinx import addnodes from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment THIS_FILE = Path(__file__).resolve() THIS_DIR = THIS_FILE.parent REPO_ROOT = THIS_DIR.parent.parent project = 'MongoDB C Driver Development' copyright = '2009-present, MongoDB, Inc.' author = 'MongoDB, Inc' release = (REPO_ROOT / 'VERSION_CURRENT').read_text().strip() # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [] templates_path = [] exclude_patterns = [] default_role = 'any' # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output html_theme = 'nature' pygments_style = 'sphinx' html_static_path = [] rst_prolog = r""" .. role:: bash(code) :language: bash """ def annotator( annot: str, ) -> Callable[[BuildEnvironment, str, addnodes.desc_signature], str]: """ Create a parse_node function that adds a parenthesized annotation to an object signature. """ def parse_node(env: BuildEnvironment, sig: str, signode: addnodes.desc_signature) -> str: signode += addnodes.desc_name(sig, sig) signode += addnodes.desc_sig_space() signode += addnodes.desc_annotation('', f'({annot})') return sig return parse_node def parse_earthly_artifact(env: BuildEnvironment, sig: str, signode: addnodes.desc_signature) -> str: """ Parse and render the signature of an '.. earthly-artifact::' signature""" mat = re.match(r'(?P\+.+?)(?P/.*)$', sig) if not mat: raise RuntimeError(f'Invalid earthly-artifact signature: {sig!r} (expected “+/ string)') signode += addnodes.desc_addname(mat['target'], mat['target']) signode += addnodes.desc_name(mat['path'], mat['path']) signode += addnodes.desc_sig_space() signode += addnodes.desc_annotation('', '(Earthly Artifact)') return sig def setup(app: Sphinx): app.add_object_type( # type: ignore 'earthly-target', 'earthly-target', indextemplate='pair: earthly target; %s', parse_node=annotator('Earthly target'), ) app.add_object_type( # type: ignore 'script', 'script', indextemplate='pair: shell script; %s', parse_node=annotator('shell script'), ) app.add_object_type( # type: ignore 'earthly-artifact', 'earthly-artifact', indextemplate='pair: earthly artifact; %s', parse_node=parse_earthly_artifact, ) app.add_object_type( # type: ignore 'file', 'file', indextemplate='repository file; %s', parse_node=annotator('repository file'), ) mongo-c-driver-2.2.1/docs/dev/debian.rst000066400000000000000000000075231511661753600200500ustar00rootroot00000000000000Debian Packaging ################ .. highlight:: console .. default-role:: bash Release Publishing ****************** .. ! NOTE: Updates to these instructions should be synchronized to the corresponding ! C++ release process documentation located in the "etc/releasing.md" file in the C++ ! driver repository .. note:: The Debian package release is made only after the upstream release has been tagged. After a C driver release is completed (i.e. the :ref:`releasing.jira` step of the release process), a new Jira ticket will be automatically created to track the work of the corresponding release of the Debian package for the C driver (`example ticket `__). To publish a new release Debian package, perform the following: 1. Change to the packaging branch, ``git checkout debian/unstable``, and make sure the working directorty is clean, ``git status``, and up-to-date, ``git pull``. 2. Because it is possible to have divergences between release branches, some special procedures are needed. Execute the following sequence of commands (substituting version numbers as appropriate): .. code-block:: console $ git merge --no-commit --no-ff 2.x.y # may result in conflicts $ git checkout HEAD -- debian # ensures debian/ dir is preserved $ git add . # prepare to resolve conflicts $ git checkout --no-overlay 2.x.y -- . ':!debian' # resolve conflicts $ git add . $ git commit 3. Verify that there are no extraneous differences from the release tag, ``git diff 2.x.y..HEAD --stat -- . ':!debian'``; the command should produce no output, and if any output is shown then that indicates differences in files outside the ``debian/`` directory. 4. If there were any files outside the ``debian/`` directory listed in the last step then something has gone wrong. Discard the changes on the branch and start again. 5. Create a new changelog entry (use the command ``dch -i`` to ensure proper formatting), then adjust the version number on the top line of the changelog as appropriate. 6. Make any other necessary changes to the Debian packaging components (e.g., update to standards version, dependencies, descriptions, etc.) and make relevant entries in ``debian/changelog`` as needed. 7. Use ``git add`` to stage the changed files for commit (only files in the ``debian/`` directory should be committed), then commit them (the ``debcommit`` utility is helpful here). 8. Build the package with ``gbp buildpackage`` and inspect the resulting package files (at a minimum use ``debc`` on the ``.changes`` file in order to confirm files are installed to the proper locations by the proper packages and also use ``lintian`` on the ``.changes`` file in order to confirm that there are no unexpected errors or warnings; the ``lintian`` used for this check should always be the latest version as it is found in the unstable distribution). 9. If any changes are needed, make them, commit them, and rebuild the package. .. note:: It may be desirable to squash multiple commits down to a single commit before building the final packages. 10. Mark the package ready for release with the ``dch -r`` command, commit the resulting changes (after inspecting them), ``git commit debian/changelog -m 'mark ready for release'``. 11. Build the final packages. Once the final packages are built, they can be signed and uploaded and the version can be tagged using the ``--git-tag`` option of ``gbp buildpackage``. The best approach is to build the packages, prepare everything and then upload. Once the archive has accepted the upload, then execute ``gbp buildpackage --git-tag --git-tag-only --git-sign-tags`` and push the commits on the ``debian/unstable`` branch as well as the new signed tag. mongo-c-driver-2.2.1/docs/dev/deps.rst000066400000000000000000000254431511661753600175620ustar00rootroot00000000000000External Dependencies ##################### The C driver libraries make use of several external dependencies that are tracked separately from the library itself. These can be classified as: .. glossary:: Bundled Dependency Vendored Dependency A dependency is "bundled" or "vendored" if its source lives directly within the repository that is consuming it. We control the exact version of the dependency that is used during the build process, aiding in reproducibility and consumability for users. System Dependency A "system" dependency is any dependency that we rely on being provided by the user when they are building or executing the software. We have no control over the versions of system dependencies that the user might provide to us. .. _snyk: https://app.snyk.io The Software Bill of Materials (SBOM) ************************************* The repository and driver releases contain a machine-readable :abbr:`SBOM (software bill of materials)` that describes the contents of the :term:`vendored dependencies ` used in the distributed driver libraries. The SBOM comes in two flavors: The SBOM-\ *lite* and the *augmented* SBOM (aSBOM). The SBOM-lite is the stored in `etc/cyclonedx.sbom.json` within the repository, and is mostly generated from `etc/purls.txt`. .. _sbom-lite: The SBOM-Lite ============= The SBOM-lite is "lite" in that it contains only the minimum information required to later build the `augmented SBOM`_. It contains the name, version, copyright statements, URLs, and license identifiers of the dependencies. .. file:: etc/cyclonedx.sbom.json The `SBOM-lite`_ for the C driver project. This file is generated semi-automatically from `etc/purls.txt` and the `+sbom-generate` Earthly target. This file is used by SilkBomb to produce an `augmented SBOM`_. .. warning:: This file is **partially generated**! Prefer to edit `etc/purls.txt`! Refer to: `sbom-lite-updating` .. file:: etc/purls.txt This file contains a set of purls__ (package URLs) that refer to the third-party components that are :term:`vendored ` into the repository. A purl is a URL string that identifies details about software packages, including their upstream location and version. This file is maintained by hand and should be updated whenever any vendored dependencies are updated within the repository. Refer to: `sbom-lite-updating` __ https://github.com/package-url/purl-spec .. _sbom-lite-updating: Updating the SBOM-Lite ---------------------- Whenever a change is made to the set of vendored dependencies in the repository, the content of `etc/purls.txt` should be updated and the SBOM-lite `etc/cyclonedx.sbom.json` file re-generated. The contents of the SBOM lite JSON *should not* need to be updated manually. Refer to the following process: 1. Add/remove/update the package URLs in `etc/purls.txt` corresponding to the vendored dependencies that are being changed. 2. Execute the `+sbom-generate` Earthly target successfully. 3. Stage and commit the changes to *both* `etc/purls.txt` and `etc/cyclonedx.sbom.json` simultaneously. .. _augmented-SBOM: .. _augmented SBOM: The Augmented SBOM ================== At time of writing, the *augmented SBOM* file is not stored within the repository [#f1]_, but is instead obtained on-the-fly as part of the release process, as this is primarily a release artifact for end users. The augmented SBOM contains extra data about the dependencies from the `SBOM-lite `, including vulnerabilities known at the time of the augmented SBOM's generation. [#asbom-vulns]_ The augmented SBOM is produced by an external process that is not contained within the repository itself. The augmented SBOM must be downloaded from a recent execution of the ``sbom`` task in an Evergreen patch or commit build. This file is included in the release archive for the `+release-archive` target. .. _snyk scanning: Snyk Scanning ************* Snyk_ is a tool that detects dependencies and tracks vulnerabilities in packages. Snyk is used in a limited fashion to detect vulnerabilities in the bundled dependencies in the C driver repository. .. _snyk caveats: Caveats ======= At the time of writing (June 20, 2024), Snyk has trouble scanning the C driver repository for dependencies. If given the raw repository, it will detect the mongo-c-driver package as the sole "dependency" of itself, and it fails to detect the other dependencies within the project. The `+snyk-test` Earthly target is written to avoid this issue and allow Snyk to accurately detect other dependencies within the project. For now, vulnerability collection is partially a manual process. This is especially viable as the native code contains a very small number of dependencies and it is trivial to validate the output of Snyk by hand. .. seealso:: The `releasing.snyk` step of the release process .. _vuln-reporting: 3rd-Party Dependency Vulnerability Reporting ******************************************** Vulnerabilities in :term:`bundled dependencies ` are tracked by Snyk, but we maintain a hand-written document that details the vulnerabilities in current and past dependencies of in-support release versions. .. file:: etc/third_party_vulnerabilities.md The third-party dependency vulnerabily report. This file is stored in the repository and updated manually as vulnerabilities are added/removed. .. seealso:: At release-time, this file is added to the release archive. See: `releasing.vuln-report` Updating the Vulnerability Report ================================= When updating `etc/third_party_vulnerabilities.md`, perform the following steps: 1. Open the Snyk_ web UI and sign in via SSO. 2. Open `this Snyk search query`__ (Find the **mongodb/mongo-c-driver** CLI target within the **dev-prod** organization. Do not use the *GitHub target*: That one is not currently useful to us.) __ https://app.snyk.io/org/dev-prod/projects?searchQuery=mongo-c-driver&filters[Integrations]=cli 3. Expand the **mongodb/mongo-c-driver** target, and then expand all **currently supported release versions**. (If you are preparing for a new release, that version should also be available and used after the `releasing.snyk` process has been completed.) 4. Take note of *all unique vulnerabilities amongst all supported versions'* that are listed in Snyk. These will be the *relevant* vulnerabilities. 5. For each relevant vulnerability that is not already listed in `etc/third_party_vulnerabilities.md`, add a new entry under its corresponding package heading that includes the details outlined in the `attribute table` below. [#fixit]_ 6. For each *already recorded* vulnerability :math:`V` listed in `etc/third_party_vulnerabilities.md`: 1. If :math:`V` is not *relevant* (i.e. it is no longer part of any supported release version), delete its entry from `etc/third_party_vulnerabilities.md`. 2. Otherwise, update the entry for of :math:`V` according to the current details of the codebase and Snyk report. [#fixit]_ It is possible that no details need to be modified e.g. if the vulnerability is old and already fixed in a past release. 7. Save and commit the changes to `etc/third_party_vulnerabilities.md`. .. _attribute table: 3rd-Party Dependency Vulnerability Attributes ============================================= The following attributes of external vulnerabilities must be recorded within `etc/third_party_vulnerabilities.md`. .. list-table:: - - Attribute - Explanation - - **Date Detected** - The ISO 8601 date at which the vulnerability was first detected. - - **CVE Number** - The CVE record number. Recommended to include a hyperlink to the CVE. Example: `CVE-2023-45853 `_ - - **Snyk Entry** - A link to the Snyk entry in the Snyk Security database. Example: `SNYK-UNMANAGED-MADLERZLIB-5969359 `_. - - **Severity** - The severity of the vulnerability according to Snyk (Critical/High/Medium/Low) - - **Description** - Paste the description field from Snyk. - - **Upstream Fix Status** - One of "false positive", "won't fix", "fix pending", or "fix available". If a fix is avilable, this entry should include the version number and date at which the upstream project released a fix. - - **mongo-c-driver Fix Status** - One of "false positive", "won't fix", "fix pending", or "fix available". If a fix is avilable, this entry should include the version number and release date of the C driver that includes the fixed version. Use "fix pending" if the bundled dependency has been upgraded but there has not been a release that includes this upgrade. - - **Notes** - If a fix is available from the upstream package but has been purposefully omitted from a C driver release, this field should explain the reasoning for that omission. Other notes about the vulnerability that may be useful to users and future developers can also be included here. .. rubric:: Example The following is an example for a vulnerability listing in `etc/third_party_vulnerabilities.md` .. code-block:: markdown # Zlib ## CVE-2023-45853 - Integer Overflow or Wraparound - **Date Detected**: 2024-06-24 - **CVE Number**: [CVE-2023-45853](https://www.cve.org/CVERecord?id=CVE-2023-45853) - **Snyk Entry**: [SNYK-UNMANAGED-MADLERZLIB-5969359](https://security.snyk.io/vuln/SNYK-UNMANAGED-MADLERZLIB-5969359) - **Severity**: High - **Description**: Affected versions of this package are vulnerable to Integer Overflow or Wraparound via the `MiniZip` function in `zlib`, by providing a long filename, comment, or extra field. - **Upstream Fix Status**: Fix available (1.3.1, 2024-01-22) - **mongo-c-driver Fix Status**: Fix available (1.27.3, 2024-06-26) - **Notes**: This issue was related to Zip file handling, which was not used by mongo-c-driver. This errant code was never reachable via the C driver APIs. .. rubric:: Footnotes .. [#f1] This may change in the future depending on how the process may evolve. .. [#asbom-vulns] At time of writing, the vulnerabilities listing in the augmented SBOM is incomplete and vulnerability collection is partially manual. See: `snyk caveats` and `releasing.vuln-report`. .. [#fixit] If a fix is available and is reasonably easy to introduce, consider upgrading the associated dependency to include a fix before the next release is finalized. If a fix is available but *not* applied, then the rationale for such a decision will need to be included in the vulnerability listing (See the **Notes** section in the `attribute table`). mongo-c-driver-2.2.1/docs/dev/earthly.rst000066400000000000000000000307051511661753600202740ustar00rootroot00000000000000Earthly ####### Earthly_ is a CI and development tool that containerizes aspects of the CI pipeline so that they run consistently across hosts and across time. .. highlight:: console .. _earthly: https://earthly.dev .. _earthly secrets: https://docs.earthly.dev/docs/guides/secrets .. _docker: https://www.docker.com/ .. _podman: https://podman.io/ Running Earthly *************** .. note:: Before you can run Earthly, you will need either Podman_ or Docker_ installed on your system. If you have trouble getting Earthly to work with Podman, refer to `the Earthly Podman Guide`__. __ https://docs.earthly.dev/docs/guides/podman While it is possible to download and install Earthly_ on your system, this task itself is automated by scripting within the ``mongo-c-driver`` repository. To run Earthly from the ``mongo-c-driver`` repository, use `tools/earthly.sh`. .. script:: tools/earthly.sh This script will download and cache an Earthly executable on-the-fly and execute it with the same command-line arguments that were passed to the script. For any ``earthly`` command, you may run `tools/earthly.sh` in its place. .. code-block:: console :caption: Example Earthly output $ ./tools/earthly.sh --version earthly-linux-amd64 version v0.8.3 70916968c9b1cbc764c4a4d4d137eb9921e97a1f linux/amd64; EndeavourOS Running Earthly via this script ensures that the same Earthly version is used across all developer and CI systems. .. envvar:: EARTHLY_VERSION The `tools/earthly.sh` script inspects the `EARTHLY_VERSION` environment variable and downloads+executes that version of Earthly. This allows one to test new Earthly versions without modifying the `tools/earthly.sh` script. This environment variable has a default value, so specifying it is not required. Updating the default value in `tools/earthly.sh` will change the default version of Earthly that is used by the script. Testing Earthly =============== To verify that Earthly is running, execute the ``+env.u20`` Earthly target. This will exercise most Earthly functionality without requiring any special parameters or modifying the working directory:: $ ./tools/earthly.sh +env.u20 Init 🚀 ———————————————————————————————————————————————————————————————————————————————— [... snip ...] ========================== 🌠Earthly Build ✅ SUCCESS ========================== Earthly Targets *************** This section documents some of the available Earthly targets contained in the top-level ``Earthfile`` in the repository. More are defined, and can be enumerated using ``earthly ls`` or ``earthly doc`` in the root of the repository. .. program:: +signed-release .. earthly-target:: +signed-release Creates signed release artifacts using `+release-archive` and `+sign-file`. .. seealso:: `releasing.gen-archive`, which uses this target. .. earthly-artifact:: +signed-release/dist/ A directory artifact that contains the `+release-archive/release.tar.gz`, `+release-archive/ssdlc_compliance_report.md`, and `+sign-file/signature.asc` for the release. The exported filenames are based on the `--version` argument. .. option:: --version Affects the output filename and archive prefix paths in `+signed-release/dist/` and sets the default value for `--ref`. .. option:: --ref Specify the git revision to be archived. Forwarded to `+release-archive --ref`. If unspecified, archives the Git tag corresponding to `--version`. .. rubric:: Secrets Secrets for the `+snyk-test` and `+sign-file` targets are required for this target. .. program:: +release-archive .. earthly-target:: +release-archive Generate a source release archive of the repository for the specified branch. Requires the secrets for `+snyk-test`. Requires ``etc/augmented-sbom.json`` is present (obtained from Evergreen). .. earthly-artifact:: +release-archive/release.tar.gz The resulting source distribution archive for the specified branch. The generated archive includes the source tree, but also includes other release artifacts that are generated on-the-fly when invoked. .. earthly-artifact:: +release-archive/ssdlc_compliance_report.md The SSDLC compliance report for the release. This file is based on the content of ``etc/ssdlc.md``, which has certain substrings replaced based on attributes of the release. .. option:: --ref Specifies the Git revision that is used when we use ``git archive`` to generate the repository archive snapshot. Use of ``git archive`` ensures that the correct contents are included in the archive (i.e. it won't include local changes and ignored files). This also allows a release snapshot to be taken for a non-active branch. .. option:: --prefix Specify a filepath prefix to appear in the generated filepaths. This has no effect on the files archived, which is selected by `+release-archive --ref`. .. program:: +sbom-validate .. earthly-target:: +sbom-validate Validate the `etc/cyclonedx.sbom.json`. .. program:: +sign-file .. earthly-target:: +sign-file Signs a file using Garasign. Use of this target requires authenticating against the DevProd-provided Amazon ECR instance! (Refer to: `earthly.amazon-ecr`) .. earthly-artifact:: +sign-file/signature.asc The detached PGP signature for the input file. .. rubric:: Parameters .. option:: --file **Required**. Specify a path to a file (on the host) to be signed. This file must be a descendant of the directory that contains the ``Earthfile`` and must not be excluded by an ``.earthlyignore`` file (it is copied into the container using the COPY__ command.) __ https://docs.earthly.dev/docs/earthfile#copy .. rubric:: Secrets .. envvar:: GRS_CONFIG_USER1_PASSWORD GRS_CONFIG_USER1_USERNAME **Required**. [#creds]_ .. seealso:: `earthly.secrets` .. _earthly.amazon-ecr: Authenticating with Amazon ECR ============================== In order to run `+sign-file` or any target that depends upon it, the container engine client\ [#oci]_ will need to be authenticated with the DevProd-provided Amazon ECR instance using AWS CLI v2:: # Forward the short-term AWS credentials to the container engine client. $ aws ecr get-login-password --profile | podman login --username AWS --password-stdin 901841024863.dkr.ecr.us-east-1.amazonaws.com Configure the AWS profile using ``aws configure sso`` or modifying the ``$HOME/.aws/config`` file such that: - The SSO start URL is ``https://d-9067613a84.awsapps.com/start#/``. - The SSO and client region are ``us-east-1``. - The SSO registration scope is ``sso:account:access`` (default). - The SSO account ID is ``901841024863`` (aka ``devprod-platforms-ecr``). - The SSO role name is ``ECRScopedAccess`` (default). To refresh short-term credentials when they have expired, run ``aws sso login --profile `` followed by the same ``aws ecr get-login-password ... | podman login ...`` command described above. .. seealso:: `"DevProd Platforms Container Registry" `_ and `"Configuring IAM Identity Center authentication with the AWS CLI" `_. .. earthly-target:: +sbom-generate Updates the `etc/cyclonedx.sbom.json` file **in-place** based on the contents of `etc/purls.txt` and the existing `etc/cyclonedx.sbom.json`. After running this target, the contents of the `etc/cyclonedx.sbom.json` file may change. .. seealso:: `sbom-lite` and `sbom-lite-updating` .. program:: +sbom-generate-new-serial-number .. earthly-target:: +sbom-generate-new-serial-number Equivalent to `+sbom-generate` but uses the ``--generate-new-serial-number`` flag to generate a new unique serial number and reset the SBOM version to 1. After running this target, the contents of the `etc/cyclonedx.sbom.json` file may change. .. seealso:: `sbom-lite` and `sbom-lite-updating` .. program:: +snyk-monitor-snapshot .. earthly-target:: +snyk-monitor-snapshot Executes `snyk monitor`__ on a crafted snapshot of the remote repository. This target specifically avoids an issue outlined in `snyk scanning` (See "Caveats"). Clones the repository at the given `--branch` for the snapshot being taken. __ https://docs.snyk.io/snyk-cli/commands/monitor .. seealso:: Release process step: `releasing.snyk` .. rubric:: Parameters .. option:: --branch **Required**. The name of the branch or tag to be snapshot. .. option:: --name **Required**. The name for the monitored snapshot ("target reference") to be stored in the Snyk server. .. note:: If a target with this name already exists in the Snyk server, then executing `+snyk-monitor-snapshot` will replace that target. .. option:: --remote The repository to be snapshot and posted to Snyk for monitoring. Defaults to the upstream repository URL. Use ``"local"`` to snapshot the repository in the working directory (not recommended except for testing). .. rubric:: Secrets .. envvar:: SNYK_ORGANIZATION The API ID of the Snyk_ organization that owns the Snyk target. For the C driver, this secret must be set to the value for the organization ID of the MongoDB **dev-prod** Snyk organization. **Do not** use the organization ID of **mongodb-default**. The `SNYK_ORGANIZATION` may be obtained from the `Snyk organization page `_. .. _snyk: https://app.snyk.io .. envvar:: SNYK_TOKEN Set this to the value of an API token for accessing Snyk in the given `SNYK_ORGANIZATION`. The `SNYK_TOKEN` may be obtained from the `Snyk account page `_. .. program:: +snyk-test .. earthly-target:: +snyk-test Execute `snyk test`__ on the local copy. This target specifically avoids an issue outlined in `Snyk Scanning > Caveats `. __ https://docs.snyk.io/snyk-cli/commands/test .. earthly-artifact:: +snyk-test/snyk.json The Snyk JSON data result of the scan. .. rubric:: Secrets .. envvar:: SNYK_TOKEN :noindex: See: `SNYK_TOKEN` .. program:: +verify-headers .. earthly-target:: +verify-headers This runs `CMake's header verification`__ on the library sources, to ensure that the public API headers can be ``#include``\ 'd directly in a C++ compiler. __ https://cmake.org/cmake/help/latest/prop_tgt/VERIFY_INTERFACE_HEADER_SETS.html This target does not produce any output artifacts. This only checks that our public API headers are valid. This checks against a variety of environments to test that we are including the necessary standard library headers in our public API headers. .. _earthly.secrets: Setting Earthly Secrets *********************** Some of the above targets require defining `earthly secrets`_\ [#creds]_. To pass secrets to Earthly, it is easiest to use a ``.secret`` file in the root of the repository. Earthly will implicitly read this file for secrets required during execution. Your ``.secret`` file will look something like this: .. code-block:: ini :caption: Example ``.secret`` file content GRS_CONFIG_USER1_USERNAME=john.doe GRS_CONFIG_USER1_PASSWORD=hunter2 .. warning:: Earthly supports passing secrets on the command line, **but this is not recommended** as the secrets will then be stored in shell history. Shell history can be supressed by prefixing a command with an extra space, but this is more cumbersome than using environment variables or a ``.secret`` file. .. seealso:: `The Earthly documentation on passing secrets `_ .. [#oci] You container engine client will probably be Docker or Podman. Wherever the :bash:`podman` command is used, :bash:`docker` should also work equivalently. .. [#creds] Credentials are expected to be available in `AWS Secrets Manager `_ under ``drivers/c-driver``. mongo-c-driver-2.2.1/docs/dev/files.rst000066400000000000000000000023111511661753600177160ustar00rootroot00000000000000################ Repository Files ################ The files discussed here are relevant to the project, but do not fit under other categories Versioning Files ################ .. file:: VERSION_CURRENT This file contains the full version number of the current working copy of the project. During development, this should be ``x.y.z-dev``. On tagged commits, this will have the prerelease tag removed. .. note:: Previously, this file was auto-generated by inspecting the Git history. This proved to be somewhat finicky and depended on the local Git history to have all the proper metadata in place, which wasn't always reliable. .. note:: The version number ``x.y.z`` in this file is read by CMake at configure-time and is used as the version number for the ``project()`` call in the top-level ``CMakeLists.txt`` .. file:: etc/prior_version.txt This file, like `VERSION_CURRENT`, contains a version number string. Instead of referring to the current working copy version, this refers to the most recent stable release. This is used by various tasks to "compare" the working copy against the stable version. This version number should correspond to a published Git tag. mongo-c-driver-2.2.1/docs/dev/index.rst000066400000000000000000000020061511661753600177240ustar00rootroot00000000000000``mongo-c-driver`` Development Documentation ============================================ These pages detail information related to the development of the mongo-c-driver project. These are for project developers, not end users of the C driver library. To view these pages in their rendered HTML form, run the following command from the mongo-c-driver project directory: .. code-block:: console $ make -C docs/dev serve .. rubric:: Contents: - :doc:`Releasing the MongoDB C Driver ` - Instructions on performing a release of the C driver libaries. .. toctree:: debian earthly deps files .. Add the `releasing` page to a hidden toctree. We don't want to include it directly in a visible toctree because the top-level sections would render inline as top-level links, which we do not want. .. toctree:: :hidden: releasing Indices and tables ================== * :ref:`genindex` * :ref:`search` .. Hidden, because it is not currently relevant to this project: .. * :ref:`modindex` mongo-c-driver-2.2.1/docs/dev/releasing.rst000066400000000000000000000616061511661753600206010ustar00rootroot00000000000000.. title:: Releasing the MongoDB C Driver .. rubric:: Releasing the MongoDB C Driver .. The use of "rubric" here is to give the page a title header that does not effect the section numbering, which we use to enumerate the steps of the process. This page is not included directly in a visible toctree, and is instead linked manually with a :doc: role. If this page is included in a visible toctree, then the top-level sections would be inlined into the toctree in an unintuitive manner. This page documents the process required for releasing a new version of the MongoDB C driver library. The release includes the following steps: .. sectnum:: :prefix: Step # .. contents:: Release Process .. _latest-build: https://spruce.mongodb.com/commits/mongo-c-driver .. _evg-release: https://spruce.mongodb.com/commits/mongo-c-driver-latest-release .. _evg-release-settings: https://spruce.mongodb.com/project/mongo-c-driver-latest-release/settings/general .. _snyk: https://app.snyk.io .. _dbx-c-cxx-releases-github: https://github.com/orgs/mongodb/teams/dbx-c-cxx-releases/ .. _dbx-c-cxx-releases-mana: https://mana.corp.mongodb.com/resources/68029673d39aa9f7de6399f9 .. rubric:: Checklist Form The following Markdown text can be copied as a step-by-step checklist for this process. .. code-block:: markdown - [ ] Check Static Analysis - [ ] Check that Tests Are Passing - [ ] Create a new **mongo-c-driver** clone - [ ] Check and Update the SBOM Lite - [ ] Start Snyk Monitoring - [ ] Address and Report Vulnerabilities - [ ] Validate API Documentation - [ ] Get a GitHub API Token - [ ] Do the Release: - [ ] Start a Release Stopwatch (start time: HH:MM) - [ ] Clone the Driver Tools - [ ] Check Consistency with [the Jira release](https://jira.mongodb.org/projects/CDRIVER/versions/XXXXXX) - [ ] Run the Release Script - [ ] Fixup the `NEWS` Pages - [ ] Signed & Upload the Release - [ ] Publish Release Artifacts - [ ] Publish Documentation - [ ] Announce the Release on the Community Forums - [ ] Copy the Release Updates to the ``master`` Branch - [ ] Close the Jira Release - [ ] Update the GitHub Webhook - [ ] Comment on the Generated DOCSP Ticket - [ ] Update the EVG Project - [ ] Stop the Release Stopwatch (end time: HH:MM) - [ ] Record the Release - [ ] vcpkg - [ ] Conan Check Static Analysis ##################### Check Coverity, fix high-impact issues, and generate a static analysis report. `Follow the process outlined in this document`__ for the *C Driver* project in Coverity. __ https://docs.google.com/document/d/1rkFL8ymbkc0k8Apky9w5pTPbvKRm68wj17mPJt2_0yo .. note:: This step may require additional code changes that can delay the release! Check that Tests Are Passing ############################ Ensure that the latest commits on the branch are successful in CI. - For minor releases, `refer to the tests in the latest build `_ - For patch releases, `refer to the latest runs for the branch project `_. .. warning:: Be sure that you are looking at the correct branch in the Project Health page! The branch/release version will be displayed in the *Project* dropdown near the top of the page. If the project health page displays task failures, ensure that they are not unexpected by the changes introduced in the new release. .. _releasing.sbom: Check and Update the SBOM Lite and `etc/purls.txt` ################################################## Check that the `etc/purls.txt` file is up-to-date with the set of :term:`vendored dependencies `. If any items need to be updated, refer to `sbom-lite-updating`. Join the Release Team ##################### The release process may require creating new branches, new tags, and directly pushing to development branches. These operations are normally restricted by branch protection rules. When assigned the responsibility of performing a release, submit a request to a repository administrator to be temporarily added to the `releases team `_ on GitHub for the duration of the release process. The team member must be added via `MANA `_ (the GitHub team should normally be empty, meaning there should not be any member with the "Maintainer" role to add new users via GitHub). Create a New Clone of ``mongo-c-driver`` ######################################## To prevent publishing unwanted changes and to preserve local changes, create a fresh clone of the C driver. We will clone into a new arbitrary directory which we will refer to as ``$RELEASE_CLONE`` :: $ git clone "git@github.com:mongodb/mongo-c-driver.git" $RELEASE_CLONE .. note:: Unless otherwise noted, all commands below should be executed from within the ``$RELEASE_CLONE`` directory. Switch to a branch that corresponds to the release version: - **If performing a minor release (x.y.0)**, create a new branch for the major+minor release version. For example: If the major version is ``5`` and the minor version is ``42``, create a branch ``r5.42``:: $ git checkout master # Ensure we are on the `master` branch to begin $ git checkout -b "r5.42" # Create and switch to a new branch Push the newly created branch into the remote:: $ git push origin "r5.42" - **If performing a patch release (x.y.z)**, there should already exist a release branch corresponding to the major+minor version of the patch. For example, if we are releasing patch version ``7.8.9``, then there should already exist a branch ``r7.8``. Switch to that branch now:: $ git checkout --track origin/r7.8 .. _releasing.snyk: Start Snyk Monitoring ##################### We wish to track vulnerability information within bundled dependencies for releases until such releases are no longer supported. We use Snyk_ to perform this monitoring. .. seealso:: `snyk scanning` for information on how Snyk is used .. program:: +snyk-monitor-snapshot To enable Snyk monitoring for a release, execute the `+snyk-monitor-snapshot` Earthly target for the release branch to be monitored. Be sure to specify the correct branch name with `--branch`, and use `--name` to identify the snapshot as belonging to the new release version. Let ``$RELEASE_BRANCH`` being the name of the branch from which we are releasing (e.g. ``r1.27``), and let ``$NEW_VERSION`` be the new release version that we are posting (e.g. ``1.27.6``): .. code-block:: console $ tools/earthly.sh +snyk-monitor-snapshot --branch "$RELEASE_BRANCH" --name="release-$NEW_VERSION" .. note:: If any subsequent step requires modifying the repository on that branch, re-run the `+snyk-monitor-snapshot` command to renew the Snyk monitor. .. _releasing.vuln-report: Address and Report Vulnerabilities in Dependencies ################################################## Update the `etc/third_party_vulnerabilities.md` file according to the details currently available in the Snyk web UI for the C driver target. See `vuln-reporting` for more information on this process. If there are new unaddressed vulnerabilities for the pending release, *and* an upstream fix is available, *and* performing an upgrade is a simple enough option, create a new changeset that will upgrade that dependency so that a fix is available for the release. .. note:: This action must be performed on the branch from which the release will be created. .. important:: If any dependency was upgraded to remove vulnerabilities, return to `releasing.sbom`. Validate that New APIs Are Documented ##################################### The Evergreen CI task *abi-compliance-check* generates an "ABI Report" ``compat_report.html`` with an overview of all new/removed/changed symbols since the prior release of the C driver. Visit the most recent Evergreen build for the project, open the *abi-compliance-check* task, go to the *Files* tab, and open the *ABI Report: compat_report.html* artifact. In the *Added Symbols* section will be a list of all newly introduced APIs since the most release release version. Verify that documentation has been added for every symbol listed here. If no new symbols are added, then the documentation is up-to-date. .. _release.github-token: Get a GitHub API Token ###################### Later, we will use an automated script to publish the release artifacts to GitHub and create the GitHub Release object. In order to do this, it is required to have a GitHub API token that can be used to create and modify the releases for the repository. To get an access token, perform the following: 1. Open the `Settings > Personal access tokens`__ page on GitHub. 2. Press the *Generate new token* dropdown. 1. Select a "general use"/\ "classic" token. (Creating a fine-grained access token requires administrative approval before it can be used.) 3. Set a *note* for the token that explains its purpose. This can be arbitrary, but is useful when reviewing the token later. 4. Set the expiration to the minimum (we only need the token for the duration of this release). 5. In the scopes, enable the ``public_repo`` and ``repo_deployment`` scopes. 6. Generate the new token. Be sure to copy the access token a save it for later, as it won't be recoverable once the page is unloaded! 7. Grant the token access to the ``mongodb`` organization using the "Configure SSO" dropdown. __ https://github.com/settings/tokens .. XXX: The following applies to fine-grained access tokens. Not sure if these work yet? 1. Open the `Settings > Personal access tokens`__ page on GitHub. 2. Press the *Generate new token* dropdown. 1. Select a "Find-grained, repo-scoped" token. The general use token is also acceptable but is very coarse and not as restricted. 3. Set a token name. This can be arbitrary, but would be best to refer to the purpose so that it can be recognized later. 4. Set the expiration to the minimum (we only need the token for the duration of this release). 5. Set the *Resource owner* to **mongodb** (**mongodb** refers to the GitHub organization that owns the repository that will contain the release. A personal account resource owner will only have access to the personal repositories.) 6. Under *Repository access* choose "Only select repositories". 7. In the repository selection dropdown, select ``mongodb/mongo-c-driver``. 8. Under *Permissions > Repository permissions*, set the access level on *Contents* to *Read and write*. This will allow creating releases and publishing release artifacts. No other permissions need to be modified. (Selecting this permission may also enable the *Metadata* permission; this is normal.) Do the Release ############## .. highlight:: console .. default-role:: bash The release process at this point is semi-automated by scripts stored in a separate repository. .. hint:: It may be useful (but is not required) to perform the following steps within a new Python `virtual environment`__ dedicated to the process. __ https://docs.python.org/3/library/venv.html .. _do.stopwatch: Start a Release Stopwatch ************************* Start a stopwatch before proceeding. Clone the Driver Tools ********************** Clone the driver tools repository into a new directory, the path to which will be called `$CDRIVER_TOOLS`:: $ git clone "git@github.com:10gen/mongo-c-driver-tools.git" $CDRIVER_TOOLS Install the Python requirements for the driver tools:: $ pip install -r $CDRIVER_TOOLS/requirements.txt Check Consistency with the Jira Release *************************************** We must check that the Jira release matches the content of the branch to be released. Open `the releases page on Jira `_ and open the release page for the new release. **If we are releasing a patch version**, verify that the changes for all tickets in the Jira release have been cherry-picked onto the release branch (not including the "Release x.y.z" ticket that is part of every Jira release). Check tickets referenced in commit messages (e.g. "CDRIVER-1234 fix foo") are in the expected state. Expect most tickets to be in the "Closed" state with the ``fixVersion`` of the upcoming release. .. _Jira releases: .. _jira-releases: https://jira.mongodb.org/projects/CDRIVER?selectedItem=com.atlassian.jira.jira-projects-plugin%3Arelease-page&status=unreleased Run the Release Script ********************** Start running the release script: 1. Let `$PREVIOUS_VERSION` be the prior ``x.y.z`` version of the C driver that was released. 2. Let `$NEW_VERSION` be the ``x.y.z`` version that we are releasing. 3. Run the Python script:: $ python $CDRIVER_TOOLS/release.py release $PREVIOUS_VERSION $NEW_VERSION Fixup the ``NEWS`` Pages ************************ Manually edit the `$RELEASE_CLONE/NEWS` and `$RELEASE_CLONE/src/libbson/NEWS` files with details of the release. **Do NOT** commit any changes to these files yet: That step will be handled automatically by the release script in the next steps. .. _do.upload: Sign & Upload the Release ************************* Run the ``release.py`` script to sign the release objects:: $ python $CDRIVER_TOOLS/release.py sign Let `$GITHUB_TOKEN` be the personal access token that was obtained from the :ref:`release.github-token` step above. Use the token with the ``upload`` subcommand to post the release to GitHub: .. note:: This will create the public release object on GitHub! .. note:: If this is a pre-release, add the `--pre` option to the `release.py upload` command below. :: $ python $CDRIVER_TOOLS/release.py upload $GITHUB_TOKEN Update the :file:`VERSION_CURRENT` file on the release branch:: $ python $CDRIVER_TOOLS/release.py post_release_bump Publish Additional Artifacts **************************** .. note:: This is currently a manual additional process, but may be automated to be part of the release scripts in the future. .. warning:: This step should be run using the ``master`` branch, regardless of which branch is used for the release. We publish a release archive that contains a snapshot of the repository and some additional metadata, along with an OpenPGP signature of that archive. This archive is created using scripts in the C driver repository itself, not in `$CDRIVER_TOOLS`. .. _releasing.gen-archive: Generate the Release Artifacts ============================== The release artifacts are generated using :doc:`Earthly `. Specifically, it is generated using the :any:`+signed-release` target. Before running :any:`+signed-release`, one will need to set up some environment that is required for it to succeed: 1. :ref:`Authenticate with the DevProd-provided Amazon ECR instance ` 2. Set the Earthly secrets required for the :any:`+sign-file` target. 3. Download an augmented SBOM from a recent execution of the ``sbom`` task in an Evergreen patch or commit build and save it to ``etc/augmented-sbom.json``. Once these prerequesites are met, creating the release archive can be done using the :any:`+signed-release` target.:: $ ./tools/earthly.sh --artifact +signed-release/dist dist --version=$NEW_VERSION .. note:: `$NEW_VERSION` must correspond to the Git tag created by the release. The above command will create a `dist/` directory in the working directory that contains the release artifacts from the :any:`+signed-release/dist/` directory artifact. The generated filenames are based on the :any:`+signed-release --version` argument. The archive contents come from the Git tag corresponding to the specified version. The detached PGP signature is the file with the `.asc` extension and corresponds to the archive file with the same name without the `.asc` suffix. .. code-block:: :caption: Example :any:`+signed-release` output with `$NEW_VERSION="1.27.2"` $ ls dist/ mongo-c-driver-1.27.2.tar.gz mongo-c-driver-1.27.2.tar.gz.asc .. note:: The public key that corresponds to the signature is available at https://pgp.mongodb.com/c-driver.pub Attach the Release Artifacts ============================ In the :ref:`do.upload` step, a GitHub release was created. Navigate to that GitHub release and edit the release to attach additional artifacts. Attach the files from :any:`+signed-release/dist/` to the newly created release. Publish Documentation ********************* **If this is a stable release** (not a pre-release), publish the documentation with the following command:: $ python $CDRIVER_TOOLS/release.py docs $NEW_VERSION Announce the Release on the Community Forums ******************************************** Open the `MongoDB Developer Community / Product & Driver Announcments`__ page on the Community Forums and prepare a new post for the release. __ https://www.mongodb.com/community/forums/c/announcements/driver-releases/110 To generate the release template text, use the following:: $ git checkout $RELEASE_BRANCH $ python $CDRIVER_TOOLS/release.py announce -t community $NEW_VERSION Update/fix-up the generated text for the new release and publish the new post. .. seealso:: `An example of a release announcment post`__ __ https://www.mongodb.com/community/forums/t/mongodb-c-driver-1-24-0-released/232021 Copy the Release Updates to the ``master`` Branch ************************************************* Create a new branch from the C driver ``master`` branch, which will be used to publish a PR to merge the updates to the release files back into ``master``:: $ git checkout master $ git checkout -b post-release-merge (Here we have named the branch ``post-release-merge``, but the branch name is arbitrary.) Do the following: 1. Manually update the ``NEWS`` and ``src/libbson/NEWS`` files with the content from the release branch that we just published. Commit these changes to the new branch. 2. For a non-patch release, manually update the :file:`VERSION_CURRENT` file. Example: if ``1.28.0`` was just released, update to ``1.29.0-dev``. 3. For a non-patch release, update the :file:`etc/prior_version.txt` file to contain the version that you have just released. This text should match the generated Git tag. (The tag should always be an ancestor of the branch that contains that :file:`etc/prior_version.txt`.) 4. For a non-patch release, update the SBOM serial number with :any:`+sbom-generate-new-serial-number`: .. code-block:: console $ tools/earthly.sh +sbom-generate-new-serial-number Push this branch to your fork of the repository:: $ git push git@github.com:$YOUR_GH_USERNAME/mongo-c-driver.git post-release-merge Now `create a new GitHub Pull Request`__ to merge the ``post-release-merge`` changes back into the ``master`` branch. __ https://github.com/mongodb/mongo-c-driver/pulls Update SBOM serial number ************************* Regenerate the SBOM serial number so the next patch release will have a unique SBOM serial number. Check out the release branch and run :any:`+sbom-generate-new-serial-number`: .. code-block:: console $ git checkout $RELEASE_BRANCH $ tools/earthly.sh +sbom-generate-new-serial-number $ git add etc/cyclonedx.sbom.json $ git commit -m "update SBOM serial number" $ git push origin $RELEASE_BRANCH Leave the Release Team ********************** Remove yourself from the `releases team `_ on GitHub via `MANA `_. .. _releasing.jira: Close the Jira Release Ticket and Finish the Jira Release ********************************************************* Return to the `Jira releases`_ page and open the release for the release version. Close the *Release x.y.z* ticket that corresponds to the release and "Release" that version in Jira, ensuring that the release date is correct. (Do not use the "Build and Release" option) Update GitHub Webhook ********************* For a non-patch release, update the `Github Webhook `_ to include the new branch. Navigate to the `Webhook Settings `_. Click ``Edit`` on the hook for ``https://githook.mongodb.com/``. Add the new release branch to the ``Payload URL``. Remove unmaintained release branches. Comment on the Generated DOCSP Ticket ************************************* .. note:: This step is not applicable for patch releases. After a **minor** or **major** release is released in Jira (done in the previous step), a DOCSP "Update Compat Tables" ticket will be created automatically (`example DOCSP ticket`__). Add a comment to the newly created ticket for the release describing if there are any changes needed for the `driver/server compatibility matrix`__ or the `C language compatibility matix`__. __ https://jira.mongodb.org/browse/DOCSP-39145 __ https://www.mongodb.com/docs/languages/c/c-driver/current/#mongodb-compatibility __ https://www.mongodb.com/docs/languages/c/c-driver/current/#language-compatibility Update the Release Evergreen Project ************************************ **For minor releases**, open the `release project settings `_ and update the *Display Name* and *Branch Name* to match the new major+minor release version. Stop the Stopwatch & Record the Release *************************************** Stop the stopwatch started at :ref:`do.stopwatch`. Record the the new release details in the `C/C++ Release Info`__ sheet. __ https://docs.google.com/spreadsheets/d/1yHfGmDnbA5-Qt8FX4tKWC5xk9AhzYZx1SKF4AD36ecY/edit#gid=0 Linux Distribution Packages ########################### .. ! NOTE: Updates to these instructions should be synchronized to the corresponding ! C++ release process documentation located in the "etc/releasing.md" file in the C++ ! driver repository Debian ****** .. seealso:: The Debian packaging and releasing process are detailed on the :doc:`debian` page. Fedora ****** After the changes for `CDRIVER-3957`__, the RPM spec file has been vendored into the project; it needs to be updated periodically. The DBX C/C++ team does not maintain the RPM spec file. These steps can be done once the RPM spec file is updated (which will likely occur some time after the C driver is released). __ https://jira.mongodb.org/browse/CDRIVER-3957 1. From the project's root directory, download the latest spec file:: $ curl -L -o .evergreen/mongo-c-driver.spec https://src.fedoraproject.org/rpms/mongo-c-driver/raw/rawhide/f/mongo-c-driver.spec 2. Confirm that our spec patch applies to the new downstream spec:: $ patch --dry-run -d .evergreen/etc -p0 -i spec.patch 3. If the patch command fails, rebase the patch on the new spec file. 4. For a new major release (e.g., 1.17.0, 1.18.0, etc.), then ensure that the patch updates the `up_version` to be the NEXT major version (e.g., when releasing 1.17.0, the spec patch should update `up_version`` to 1.18.0); this is necessary to ensure that the spec file matches the tarball created by the dist target; if this is wrong, then the `rpm-package-build` task will fail in the next step. 5. Additionally, ensure that any changes made on the release branch vis-a-vis the spec file are also replicated on the master or main branch. 6. Test the RPM build in Evergreen with a command such as the following:: $ evergreen patch -p mongo-c-driver -v packaging -t rpm-package-build -f 7. There is no package upload step, since the downstream maintainer handles that and we only have the Evergreen task to ensure that we do not break the package build. 8. The same steps need to be executed on active release branches (e.g., r1.19), which can usually be accomplished via `git cherry-pick` and then resolving any minor conflict. vcpkg ##### To update the package in vcpkg, create an issue to update `the mongo-c-driver manifest`__. To submit an issue, `follow the steps here`__ (`example issue`__). Await a community PR to resolve the issue, or submit a new PR. __ https://github.com/microsoft/vcpkg/blob/master/versions/m-/mongo-c-driver.json __ https://github.com/microsoft/vcpkg/issues/new/choose __ https://github.com/microsoft/vcpkg/issues/34855 Conan ##### Create a new issue in the conan-center-index project to update `the recipe files for the C driver package`__. To submit an issue, `follow the process here`__ (`example issue`__) Await a community PR to resolve the issue, or submit a new PR. __ https://github.com/conan-io/conan-center-index/blob/master/recipes/mongo-c-driver/config.yml __ https://github.com/conan-io/conan-center-index/issues/new/choose/ __ https://github.com/conan-io/conan-center-index/issues/20879 Docker ###### The C driver does not have its own container image, but it may be useful to update the C driver used in the C++ container image build. If the C driver is being released without a corresponding C++ driver release, consider updating the mongo-cxx-driver container image files to use the newly released C driver version. `Details for this process are documented here`__ __ https://github.com/mongodb/mongo-cxx-driver/blob/5f2077f98140ea656983ea5881de31d73bb3f735/etc/releasing.md#docker-image-build-and-publish mongo-c-driver-2.2.1/etc/000077500000000000000000000000001511661753600151325ustar00rootroot00000000000000mongo-c-driver-2.2.1/etc/cyclonedx.sbom.json000066400000000000000000000112331511661753600207540ustar00rootroot00000000000000{ "components": [ { "bom-ref": "pkg:github/juliastrings/utf8proc@v2.8.0", "copyright": "Copyright \u00a9 2014-2021 by Steven G. Johnson, Jiahao Chen, Tony Kelman, Jonas Fonseca, and other contributors listed in the git history.", "externalReferences": [ { "type": "distribution", "url": "https://github.com/juliastrings/utf8proc/archive/refs/tags/v2.8.0.tar.gz" }, { "type": "website", "url": "https://github.com/juliastrings/utf8proc/tree/v2.8.0" } ], "group": "juliastrings", "licenses": [ { "license": { "id": "MIT" } }, { "license": { "id": "Unicode-TOU", "url": "https://www.unicode.org/copyright.html" } } ], "name": "utf8proc", "purl": "pkg:github/juliastrings/utf8proc@v2.8.0", "type": "library", "version": "v2.8.0" }, { "bom-ref": "pkg:github/madler/zlib@v1.3.1", "copyright": "(C) 1995-2024 Jean-loup Gailly and Mark Adler", "externalReferences": [ { "type": "distribution", "url": "https://github.com/madler/zlib/archive/refs/tags/v1.3.1.tar.gz" }, { "type": "website", "url": "https://github.com/madler/zlib/tree/v1.3.1" } ], "group": "madler", "licenses": [ { "license": { "id": "Zlib" } } ], "name": "zlib", "purl": "pkg:github/madler/zlib@v1.3.1", "type": "library", "version": "v1.3.1" }, { "bom-ref": "pkg:github/mnunberg/jsonsl", "copyright": "Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org", "externalReferences": [ { "type": "website", "url": "https://github.com/mnunberg/jsonsl" } ], "group": "mnunberg", "licenses": [ { "license": { "id": "MIT" } } ], "name": "jsonsl", "purl": "pkg:github/mnunberg/jsonsl", "type": "library" }, { "bom-ref": "pkg:github/troydhanson/uthash@v2.3.0", "copyright": "Copyright (c) 2005-2018, Troy D. Hanson http://troydhanson.github.com/uthash/", "externalReferences": [ { "type": "distribution", "url": "https://github.com/troydhanson/uthash/archive/refs/tags/v2.3.0.tar.gz" }, { "type": "website", "url": "https://github.com/troydhanson/uthash/tree/v2.3.0" } ], "group": "troydhanson", "licenses": [ { "license": { "id": "BSD-1-Clause" } } ], "name": "uthash", "purl": "pkg:github/troydhanson/uthash@v2.3.0", "type": "library", "version": "v2.3.0" } ], "dependencies": [ { "ref": "pkg:github/juliastrings/utf8proc@v2.8.0" }, { "ref": "pkg:github/madler/zlib@v1.3.1" }, { "ref": "pkg:github/mnunberg/jsonsl" }, { "ref": "pkg:github/troydhanson/uthash@v2.3.0" } ], "metadata": { "timestamp": "2025-11-25T14:17:27.291829+00:00", "tools": [ { "externalReferences": [ { "type": "build-system", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/actions" }, { "type": "distribution", "url": "https://pypi.org/project/cyclonedx-python-lib/" }, { "type": "documentation", "url": "https://cyclonedx-python-library.readthedocs.io/" }, { "type": "issue-tracker", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/issues" }, { "type": "license", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/LICENSE" }, { "type": "release-notes", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/blob/main/CHANGELOG.md" }, { "type": "vcs", "url": "https://github.com/CycloneDX/cyclonedx-python-lib" }, { "type": "website", "url": "https://github.com/CycloneDX/cyclonedx-python-lib/#readme" } ], "name": "cyclonedx-python-lib", "vendor": "CycloneDX", "version": "6.4.4" } ] }, "serialNumber": "urn:uuid:ebf02f48-2078-423e-8686-3418a319c1a1", "version": 1, "$schema": "http://cyclonedx.org/schema/bom-1.5.schema.json", "bomFormat": "CycloneDX", "specVersion": "1.5", "vulnerabilities": [] } mongo-c-driver-2.2.1/etc/prior_version.txt000066400000000000000000000000051511661753600205660ustar00rootroot000000000000002.2.0mongo-c-driver-2.2.1/etc/purls.txt000066400000000000000000000011521511661753600170370ustar00rootroot00000000000000# These package URLs (purls) point to the versions (tags) of external dependencies # that are committed to the project. Refer: https://github.com/package-url/purl-spec # This file is fed to silkbomb to generate the cyclonedx.sbom.json file. Edit this file # instead of modifying the SBOM JSON directly. After modifying this file, be sure to # re-generate the SBOM JSON file! # Lives at src/zlib-* pkg:github/madler/zlib@v1.3.1 # Lives at src/utf8proc-* pkg:github/juliastrings/utf8proc@v2.8.0 # Lives at src/uthash pkg:github/troydhanson/uthash@v2.3.0 # Lives at src/libbson/src/jsonsl pkg:github/mnunberg/jsonsl mongo-c-driver-2.2.1/etc/ssdlc.md000066400000000000000000000036571511661753600165770ustar00rootroot00000000000000# MongoDB C Driver SSDLC Compliance Report (@version@) ## Release Creator For information on the release creator, refer to the [C/C++ Release Info Spreadsheet](https://docs.google.com/spreadsheets/d/1yHfGmDnbA5-Qt8FX4tKWC5xk9AhzYZx1SKF4AD36ecY) (internal link). ## Process Document Not yet available. ## Third-Party Dependencies and Vulnerabilities The tracking of security information for bundled third-party dependencies is performed using Snyk. Refer to the `etc/third_party_vulnerabilities.md` file within the repository or the release archive for vulnerability information known at the time of a release. Full bundled dependency information is available in the `cyclonedx.sbom.json` file within the release archive. ## Static Analysis Findings Refer to the [SSDLC Static Analysis Reports](https://drive.google.com/drive/folders/17bjBnQ3mhEXvs6IK1rrTphJr0CUO2qZh) folder (internal) for release-specific reports. Available as-needed from the MongoDB C Driver team. ## Security Testing Report Refer to the [Driver Security Testing Summary](https://docs.google.com/document/d/1y2K_RY4GZVXpQvv4JH_35mSzFRTawNJ3mibpvSBU8H0) document (internal). Available as-needed from the MongoDB C Driver team. Refer to the [Evergreen waterfall build](@waterfall_url@) (internal) for test results. ## Release Signature Information The generated release archive is signed. The detached signature is available alongside the release archive in the GitHub Release page and can be verified using the `c-driver` public key available at https://pgp.mongodb.com/. ## Security Assessment Report Not applicable for the MongoDB C Driver. mongo-c-driver-2.2.1/etc/third_party_vulnerabilities.md000066400000000000000000000042741511661753600232750ustar00rootroot00000000000000# Thirty-Party Vulnerabilities This document lists known vulnerabilities in third-party dependencies that are directly bundled with standard release product for the MongoDB C Driver. This document was created on **$today** using data from [Snyk Security](https://security.snyk.io), and the details herein reflect information that was available at that time. > [!IMPORTANT] > > The "standard release product" is defined as the set of files which are > _installed_ by a configuration, build, and install. This includes > static/shared library files, header files, and packaging files for supported > build configurations. > > Vulnerabilities for 3rd party dependencies that are bundled with the standard > release product are reported in this document. Test files, utility scripts, > documentation generators, and other miscellaneous files and artifacts are NOT > considered part of the standard release product, even if they are included in > the release distribution tarball. Vulnerabilities for such 3rd party > dependencies are NOT reported in this document. > > Details on packages that are not tracked tracked by Snyk Security will not > appear in this document. ## `Zlib` ### CVE-2023-45853 - Integer Overflow or Wraparound - **Date Detected**: 2024-06-24 - **CVE Number**: [CVE-2023-45853](https://www.cve.org/CVERecord?id=CVE-2023-45853) - **Snyk Entry**: [SNYK-UNMANAGED-MADLERZLIB-5969359](https://security.snyk.io/vuln/SNYK-UNMANAGED-MADLERZLIB-5969359) - **Severity**: High - **Description**: Affected versions of this package are vulnerable to Integer Overflow or Wraparound via the `MiniZip` function in `zlib`, by providing a long filename, comment, or extra field. - **Upstream Fix Status**: Fix available (1.3.1, 2024-01-22) - **mongo-c-driver Fix Status**: Fix available (1.27.3, 2024-06-26) - **Notes**: This issue was related to Zip file handling, which was not used by mongo-c-driver. This errant code was never reachable via the C driver APIs. ## `jsonsl`, `utf8proc`, and `uthash` These bundled dependencies are present within the release archive, but are not tracked by Snyk and therefore no vulnerability information is available. mongo-c-driver-2.2.1/lldb.pyi000066400000000000000000000141421511661753600160210ustar00rootroot00000000000000""" This Python type stubs file is only here to support checking of lldb_bson.py. The type/member/constant listings in here are incomplete, as only those that are used in lldb_bson have been transcribed from the LLDB Python API documentation. Refer: https://lldb.llvm.org/python_api.html """ from typing import IO, Any, NoReturn, Sequence, TypeAlias _Pointer: TypeAlias = int _Size: TypeAlias = int _Offset: TypeAlias = int _InternalDict: TypeAlias = dict[str, Any] class SBError: def __init__(self) -> None: ... @property def success(self) -> bool: ... @property def fail(self) -> bool: ... @property def description(self) -> str: ... class SBDebugger: def __init__(self, _: NoReturn) -> None: ... def HandleCommand(self, command: str) -> None: ... def GetErrorFileHandle(self) -> IO[str]: ... def GetSelectedTarget(self) -> SBTarget | None: ... class SBAddress: def __init__(self) -> None: ... @property def offset(self) -> type: ... @property def load_addr(self) -> _Pointer: ... def SetLoadAddress(self, addr: _Pointer, tgt: SBTarget) -> None: ... class SBData: def GetSignedInt32(self, err: SBError, off: _Offset) -> int: ... @staticmethod def CreateDataFromUInt64Array(endian: ByteOrderType, size: _Size, dat: Sequence[int]) -> SBData: ... @staticmethod def CreateDataFromCString(endian: ByteOrderType, size: _Size, s: str) -> SBData: ... byte_order: ByteOrderType @property def uint8(self) -> Sequence[int]: ... @property def uint32(self) -> Sequence[int]: ... @property def uint64(self) -> Sequence[int]: ... @property def size(self) -> int: ... def ReadRawData(self, err: SBError, off: _Offset, size: _Size) -> bytes: ... def GetAddress(self, err: SBError, off: _Offset) -> _Pointer: ... def GetUnsignedInt32(self, err: SBError, off: _Offset) -> int: ... def GetUnsignedInt64(self, err: SBError, off: _Offset) -> int: ... class SBValue: def Dereference(self) -> SBValue: ... def TypeIsPointerType(self) -> bool: ... def GetChildMemberWithName(self, name: str) -> SBValue: ... def GetValueAsUnsigned(self) -> int: ... def Cast(self, type: SBType) -> SBValue: ... def GetAddress(self) -> SBAddress: ... def GetData(self) -> SBData: ... def GetNonSyntheticValue(self) -> SBValue: ... def CreateChildAtOffset(self, name: str, offset: _Offset, type: SBType) -> SBValue: ... def CreateValueFromData(self, name: str, data: SBData, type: SBType) -> SBValue: ... def CreateValueFromAddress(self, name: str, addr: _Pointer, type: SBType) -> SBValue: ... def CreateValueFromExpression(self, name: str, expr: str) -> SBValue: ... def synthetic_child_from_address(self, name: str, addr: _Pointer, type: SBType) -> SBValue: ... def synthetic_child_from_expression(self, name: str, expr: str) -> SBValue: ... @property def addr(self) -> SBAddress: ... @property def frame(self) -> SBFrame: ... @property def type(self) -> SBType: ... @property def name(self) -> str: ... @property def target(self) -> SBTarget: ... @property def load_addr(self) -> _Pointer: ... @property def size(self) -> int: ... @property def unsigned(self) -> int: ... @property def data(self) -> SBData: ... @property def deref(self) -> SBValue: ... @property def process(self) -> SBProcess: ... @property def error(self) -> SBError: ... @property def changed(self) -> bool: ... @property def children(self) -> Sequence[SBValue]: ... value: str format: ValueFormatType class SBFrame: def FindVariable(self, var_name: str) -> SBValue: ... def EvaluateExpression(self, expr: str) -> SBValue: ... @property def locals(self) -> Sequence[SBValue]: ... @property def thread(self) -> SBThread: ... class SBThread: @property def frames(self) -> Sequence[SBFrame]: ... @property def process(self) -> SBProcess: ... class SBProcess: def ReadMemory(self, addr: _Pointer, size: int, err: SBError) -> bytes: ... def ReadCStringFromMemory(self, addr: _Pointer, max: int, err: SBError) -> bytes: ... @property def selected_thread(self) -> SBThread: ... @property def id(self) -> int: ... class SBCommandReturnObject: def AppendMessage(self, s: str) -> None: ... class SBTarget: def FindFirstType(self, type: str) -> SBType: ... def CreateValueFromData(self, name: str, data: SBData, type: SBType) -> SBValue: ... def CreateValueFromExpression(self, name: str, expr: str) -> SBValue: ... def CreateValueFromAddress(self, name: str, addr: SBAddress, type: SBType) -> SBValue: ... def GetBasicType(self, type: BasicType) -> SBType: ... @property def process(self) -> SBProcess: ... class SBType: def GetDisplayTypeName(self) -> str: ... def GetPointerType(self) -> SBType: ... def GetArrayType(self, size: int) -> SBType: ... @property def name(self) -> str: ... def IsValid(self) -> bool: ... @property def fields(self) -> Sequence[SBTypeMember]: ... @property def size(self) -> int: ... class SBTypeMember: @property def name(self) -> str: ... @property def byte_offset(self) -> int: ... class SBSyntheticValueProvider: def __init__(self, valobj: SBValue, internal_dict: _InternalDict) -> None: ... def num_children(self) -> int: ... def get_child_at_index(self, pos: int) -> SBValue: ... def has_children(self) -> bool: ... def get_value(self) -> SBValue: ... def update(self) -> bool | None: ... # Types not present in lldb, but represent the types of top-level constants: # (These may only be used in unevaluated contexts) class ByteOrderType: ... class ValueFormatType: ... class BasicType: ... eBasicTypeNullPtr: BasicType eBasicTypeUnsignedChar: BasicType eBasicTypeDouble: BasicType eBasicTypeBool: BasicType eBasicTypeChar: BasicType eBasicTypeUnsignedChar: BasicType eBasicTypeVoid: BasicType eFormatDefault: ValueFormatType eFormatHex: ValueFormatType eFormatBinary: ValueFormatType eFormatPointer: ValueFormatType eFormatInvalid: ValueFormatType debugger: SBDebugger mongo-c-driver-2.2.1/lldb_bson.py000066400000000000000000001454071511661753600167020ustar00rootroot00000000000000""" This Python module is intended for use with the LLDB debugger. To import using this module in an LLDB session, execute the following command in LLDB:: command script import This may be useful to add as a "startup/init" command for an LLDB executor such as VSCode. From this point, all ``bson_t`` variables will show their full contents recursively. - Bonus: If using CodeLLDB, it is possible to add watch expressions to elements within a (nested) BSON document. To add a Python watch expression, prefix the watch string with ``/py``, and the remainder of the string will be evaluated in the LLDB Python interpreter rather than the LLDB evaluator. For example: /py 'hello, ' + 'world' will evaluate to a string "Hello, world". To reference a bson_t object, use the ``$variable_name`` syntax. Then, use the ``@`` operator with the special global ``bson`` object to walk through the document as if it were a regular Python object:: /py $my_bson_t @ bson.topElement.path["string key"].array[3].name Only the leading ``bson`` is required in the path, since it provides the "magic" necessary to perform document traversal. For example, with the given document ``userdata``:: { users: [ {username: "joe", age: 41}, {username: "alex", age: 33}, {username: "jane', age: 29} ] } the "age" of "alex" can be watched with the following watch expression: /py $userdata @bson.users[1].age """ from __future__ import annotations import enum import functools import hashlib import json import shlex import struct import traceback from datetime import datetime from typing import ( TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, Generic, Iterable, NamedTuple, Sequence, Tuple, Type, TypeVar, Union, cast, ) import lldb # pyright: ignore from lldb import ( # pyright: ignore SBAddress, SBDebugger, SBError, SBFrame, SBProcess, SBSyntheticValueProvider, SBType, SBValue, ) if TYPE_CHECKING: from typing_extensions import override else: def override(f: T) -> T: return f def print_errors(fn: FuncT) -> FuncT: """Exceptions from the decorated function will be printed, then re-raised""" @functools.wraps(fn) def _wrap(*args: Any, **kwargs: Any) -> Any: try: return fn(*args, **kwargs) except: e = traceback.format_exc() print(e) raise return cast('FuncT', _wrap) @print_errors def __lldb_init_module(debugger: SBDebugger, internal_dict: InternalDict): # Inject the global magic document traverser: internal_dict['bson'] = _BSONWalker() # Register types: for cls in _SyntheticMeta.synthetics: # The (regex of) the type that is handled by this class: ty = shlex.quote(cls.__typename__) if cls.__enable_synthetic__: # Register a synthetic child provider, generating the trees that can be expanded cmd = f"type synthetic add -l lldb_bson.{cls.__name__} -x '^{ty}$'" debugger.HandleCommand(cmd) if cls.__summary_str__ is not None: # Generate a simple summary string for this object quoted = cls.__summary_str__.replace("'", "\\'") cmd = f"type summary add --summary-string '{quoted}' -x '^{ty}$'" debugger.HandleCommand(cmd) if hasattr(cls, '__summary__'): # More complex: Call a Python function that will create the summary cmd = f"type summary add -F lldb_bson.{cls.__name__}.__summary__ -x '^{ty}$'" debugger.HandleCommand(cmd) # Render __bson_byte__ as "bytes with ASCII." __bson_byte__ is a # debug-only type generated on-the-fly in LLDB debugger.HandleCommand('type format add -f Y __bson_byte__') # Arrays of bytes as a sequence of hex values: debugger.HandleCommand(r"type summary add -s '${var[]%x}' -x '__bson_byte__\[[0-9]+\]'") print('lldb_bson is ready') _ = __lldb_init_module # Silence "unused function" warnings FuncT = TypeVar('FuncT', bound=Callable[..., Any]) 'Type of functions' T = TypeVar('T') 'Unbounded invariant type parameter' InternalDict = Dict[str, Any] 'Type of internal dictionaries, provided by LLDB' ValueFactory = Callable[[], SBValue] ChildItem = Union[ Tuple[str, 'str | int'], ValueFactory, Tuple[str, 'str | int', 'lldb.ValueFormatType|None', 'SBType|None'] ] class _SyntheticMeta(type): """ Metaclass that handles subclassing of SyntheticDisplayBase. Does basic checks and collects definitions into a list of display types """ synthetics: list[Type[SyntheticDisplayBase[Any]]] = [] 'The display type classes that have been defined' @override def __new__( cls: Type[_SyntheticMeta], name: str, bases: tuple[type, ...], namespace: dict[str, Any] ) -> Type[SyntheticDisplayBase[Any]]: new_class: Type[SyntheticDisplayBase[Any]] = type.__new__(cast(type, cls), name, bases, namespace) if namespace.get('__abstract__'): return new_class # Check for the required __typename__ and __parse__ if not hasattr(new_class, '__typename__'): raise TypeError(f'Type "{new_class}" is missing a "__typename__" attribute') if not hasattr(new_class, '__parse__'): raise TypeError(f'Type "{new_class}" has no "__parse__" method') # Remember this new class: cls.synthetics.append(new_class) return new_class class SyntheticDisplayBase(Generic[T], SBSyntheticValueProvider, metaclass=_SyntheticMeta): __abstract__: ClassVar[bool] = True 'If true, disables metaclass checks' __summary_str__: ClassVar[str | None] = None "Set to an LLDB '--summary-string' formatting string for rendering the inline value summary" __enable_synthetic__: ClassVar[bool] = True 'If False, do not generate synthetic children (used for primitive values)' if TYPE_CHECKING: __typename__: ClassVar[str] """ The (regular expression) name of the type that is handled by this class. This is a required class attribute. """ @classmethod def __summary__(cls, value: SBValue, idict: InternalDict) -> str: """ If provided, supplies the Python function that will dynamically generate a summary string from the SBValue. """ ... @classmethod def __parse__(cls, value: SBValue) -> T: """ Required method: Parse the data that lives at the given SBValue into a representation that will be useful for later display. """ ... @classmethod @print_errors def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """ Obtain the SBType for this class. Can be overriden in subclasses, and the type may consider the value that lives at the address. """ return generate_or_get_type(f'struct {cls.__typename__} {{}}', frame) @print_errors def __init__(self, val: SBValue, idict: InternalDict | None = None) -> None: self.__sbvalue = val 'The SBValue given for this object' self.__children: list[ChildItem] = [] 'The synthetic children associated with the value' self.__value: T | None = None 'The decoded value, or ``None`` if it has not yet been decoded' @property def sbvalue(self) -> SBValue: """Obtain the SBValue associated with this display object""" return self.__sbvalue @property def value(self) -> T: """Obtain the decoded BSON value""" if self.__value is None: self.__value = self.__parse__(self.sbvalue) return self.__value @property def address(self) -> int: """Obtain the memory address of the associated object""" return self.sbvalue.load_addr @print_errors @override def update(self) -> bool | None: """Update the parsed value and the child objects""" self.__value = None # Clear the value so it will be re-read self.__children = list(self.get_children()) def get_children(self) -> Iterable[ChildItem]: """ Subclasses must provide this method such that it returns an iterable object of ``ChildItem`` types. These will be used to generate the synthetic children that are displayed by LLDB. """ raise NotImplementedError @override def num_children(self) -> int: """Called by LLDB to know how many children exist""" n = len(self.__children) return n @override def has_children(self) -> bool: """Optimization opportunity for LLDB if it knows it doesn't need to ask""" return self.__enable_synthetic__ and self.num_children() != 0 @print_errors @override def get_child_at_index(self, pos: int) -> SBValue: """ Obtain the synthetic child of this value at index 'pos'. """ # LLDB sometimes calls us with a child that we don't have? if pos >= len(self.__children): print(f'NOTE: lldb called get_child_at_index({pos}), but we only have {len(self.__children)} children') return SBValue() # Get the child: nth = self.__children[pos] # If not a tuple: if not isinstance(nth, tuple): # The type is a ValueFactory, which will return a new SBValue val = nth() assert val.error.success, f'{val.error=}, {nth=}, {pos=}' return val # Otherwise, they yielded a tuple: if len(nth) == 4: # A four-tuple of key, value, an LLDB value format, and an LLDB value type key, val, fmt, ty = nth sbval = self.create_value(key, val, format=fmt, cast_to=ty) else: # Just a key and a value key, val = nth sbval = self.create_value(key, val) assert sbval.error.success, (sbval.error, key, val) return sbval def create_value( self, name: str, value: str | int | float, cast_to: SBType | None = None, format: lldb.ValueFormatType | None = None, ) -> SBValue: """Cast a Python primitive into an LLDB SBValue.""" # Encode the value in a JSON string, which will coincidentally be a valid # C expression that LLDB can parse: encoded = json.dumps(value) val = self.__sbvalue.CreateValueFromExpression(name, encoded) if cast_to: val = val.Cast(cast_to) if format is not None: val.format = format return val class PrimitiveDisplay(Generic[T], SyntheticDisplayBase[T]): """ Displays a primitive type. We can't use LLDB's basic types directly, since we must force a little-endian encoding. Set the __struct_format__ class variable to a Python struct format string. """ __abstract__ = True __enable_synthetic__: ClassVar[bool] = False __struct_format__: ClassVar[str] 'The struct format string that will be used to extract the value from memory' @classmethod @override @print_errors def __summary__(cls, value: SBValue, idict: InternalDict) -> str: return json.dumps(cls.__parse__(value)) @classmethod @override def __parse__(cls, value: SBValue) -> T: unpack = struct.Struct(cls.__struct_format__) buf = memcache.get_cached(value.load_addr)[: unpack.size] val: T = unpack.unpack(buf)[0] return val class DoubleDisplay(PrimitiveDisplay[float]): """Displays BSON doubles""" __typename__ = '__bson_double__' __struct_format__: ClassVar[str] = ' bytes: buf = memcache.get_cached(value.load_addr) size = read_i32le(buf) return bytes(buf[4:][:size]) @override def get_children(self) -> Iterable[ChildItem]: strlen = len(self.value) yield 'size (bytes)', strlen # Create a char[] type to represent the string content: array_t = self.sbvalue.target.GetBasicType(lldb.eBasicTypeChar).GetArrayType(strlen) yield lambda: self.sbvalue.synthetic_child_from_address('[content]', self.address + 4, array_t) try: # Attempt a UTF-8 decode. We don't actually show this, we just want to # check if there are encoding errors, which we will display in the output self.value.decode('utf-8') except UnicodeDecodeError as e: yield 'decode error', str(e) class DocumentInfo(NamedTuple): """A decoded document""" elements: Sequence[DocumentElement | DocumentError] 'Existing elements or errors found while parsing the data' class DocumentElement(NamedTuple): """Represents an element within a document""" type: BSONType key: str value_offset: int "Offset from the beginning of the document data where the element's value appears" value_size: int "The size of the element's value (in bytes)" class DocumentError(NamedTuple): """Represents an error while decoding a document""" message: str error_offset: int class DocumentDisplay(SyntheticDisplayBase['DocumentInfo | DocumentError']): """ Main display of BSON document elements. This parses a document/array, and generates the child elements that can be further expanded and inspected. This type does not refer to the _MemCache, since this object is usually the top-level object and is the one responsible for filling the cache. """ __typename__ = '__bson_document_[0-9]+__' __qualifier__: ClassVar[str] = 'document' "The 'qualifier' of this type. Overriden by ArrayDisplay." @classmethod @override @print_errors def __summary__(cls, value: SBValue, idict: InternalDict) -> str: prefix = cls.__qualifier__ doc = cls.__parse__(value) if isinstance(doc, DocumentError): return f'Error parsing {prefix} at byte {doc.error_offset}: {doc.message}' if len(doc.elements) == 0: return f'{prefix} (empty)' if len(doc.elements) == 1: return f'{prefix} (1 element)' return f'{prefix} ({len(doc.elements)} elements)' @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """Generate a unique type for the length of the document, allowing for byte-wise inspection""" # Read the size prefix: err = SBError() header = frame.thread.process.ReadMemory(addr, 4, err) assert err.success, f'{err=}, {frame=}, {addr=}' size = read_i32le(header) # Generate the type: typename = f'__bson_{cls.__qualifier__}_{size}__' doc_t = generate_or_get_type( f""" enum __bson_byte__ : unsigned char {{}}; struct {typename} {{ __bson_byte__ bytes[{size}]; }} """, frame, ) return doc_t @classmethod @override def __parse__(cls, value: SBValue) -> DocumentInfo | DocumentError: try: # Read from memory and refresh the segment in the memory cache. All # child element displays will re-use the same memory segment that # will be pulled here: buf = memcache.read(value)[1] except LookupError as e: return DocumentError(f'Failed to read memory: {e}', value.load_addr) return cls.parse_bytes(buf) @classmethod def parse_bytes(cls, buf: bytes) -> DocumentInfo | DocumentError: """Parse a document from the given data buffer""" elems = list(cls._parse_elems(buf)) return DocumentInfo(elems) @classmethod def _parse_elems(cls, buf: bytes) -> Iterable[DocumentElement | DocumentError]: """Iteratively yield elements, or an error if parsing fails""" cur_offset = 4 array_idx = 0 while buf: elem = yield from cls._parse_one(buf[cur_offset:], cur_offset) if isinstance(elem, DocumentError): # An error ocurred, so we can't reliably continue parsing yield elem return if elem.type == BSONType.EOD: # This is the end. break # Yield this one, and then advance to the next element: yield elem elem_size = 1 + len(elem.key) + 1 + elem.value_size if cls.__qualifier__ == 'array': # Validate that array keys are increasing integers: expect_key = str(array_idx) if elem.key != expect_key: yield DocumentError( f'Array element must have incrementing integer keys ' f'(Expected "{expect_key}", got "{elem.key}")', cur_offset, ) array_idx += 1 cur_offset += elem_size # Check that we actually consumed the whole buffer: remain = len(buf) - cur_offset if remain > 1: yield DocumentError(f'Extra {len(buf)} bytes in document data', cur_offset) @classmethod def _parse_one( cls, buf: bytes, elem_offset: int ) -> Generator[DocumentError, None, DocumentElement | DocumentError]: try: # Read the tag type type_tag = BSONType(buf[0]) except ValueError: # The tag byte is not a valid tag value return DocumentError(f'Invalid element type tag 0x{buf[0]:x}', elem_offset) except IndexError: # 'buf' was empty return DocumentError('Unexpected end-of-data', elem_offset) # Stop if this is the end: if type_tag == BSONType.EOD: return DocumentElement(type_tag, '', 0, 0) # Find the null terminator on the key: try: key_nulpos = buf.index(0, 1) except ValueError: return DocumentError('Unexpected end-of-data while parsing the element key', elem_offset) key_bytes = buf[1:key_nulpos] try: key = key_bytes.decode('utf-8') except UnicodeDecodeError as e: yield DocumentError(f'Element key {key_bytes} is not valid UTF-8 ({e})', elem_offset) key = key_bytes.decode('utf-8', errors='replace') # The offset of the value within the element: inner_offset = key_nulpos + 1 # The buffer that starts at the value: value_bytes = buf[inner_offset:] # Get the fixed size of the element: fixed_size = { BSONType.Double: 8, BSONType.Bool: 1, BSONType.Undefined: 0, BSONType.Null: 0, BSONType.MinKey: 0, BSONType.MaxKey: 0, BSONType.Datetime: 8, BSONType.ObjectID: 12, BSONType.Int32: 4, BSONType.Timestamp: 8, BSONType.Int64: 8, BSONType.Decimal128: 16, } value_size = fixed_size.get(BSONType(type_tag)) if value_size is not None: pass # This element has a fixed size elif type_tag in (BSONType.Code, BSONType.Symbol, BSONType.UTF8): # Size is 4 + a length prefix value_size = read_i32le(value_bytes) + 4 elif type_tag in (BSONType.Array, BSONType.Document, BSONType.CodeWithScope): # Size is given by the length prefix value_size = read_i32le(value_bytes) elif type_tag == BSONType.DBPointer: # Size is a length prefix, plus four, plus 12 bytes for the OID value_size = read_i32le(value_bytes) + 4 + 12 elif type_tag == BSONType.Regex: # Size is dynamic and given as two C strings: nul1 = value_bytes.index(0) nul2 = value_bytes.index(0, nul1 + 1) value_size = nul2 + 1 elif type_tag == BSONType.Binary: # Size is a length prefix, plus four, plus one for the subtype value_size = read_i32le(value_bytes) + 4 + 1 else: assert False, f'Unhandled value tag? {type_tag=} {buf=} {key=}' # The absolute offset of the element within the parent document: value_offset = elem_offset + inner_offset return DocumentElement(type_tag, key, value_offset, value_size) @override def get_children(self) -> Iterable[ChildItem]: doc = self.value if isinstance(doc, DocumentError): # The entire document failed to parse. Just generate one error: yield '[error]', f'Parsing error at byte {doc.error_offset}: {doc.message}' return for elem in doc.elements: if isinstance(elem, DocumentError): # There was an error at this location. yield '[error]', f'Data error at offset {elem.error_offset}: {elem.message}' else: # Create a ValueFactory for each element: yield functools.partial(self.create_child, self.sbvalue, elem) @classmethod def create_child(cls, parent: SBValue, elem: DocumentElement) -> SBValue: """Generate the child elements for LLDB to walk through""" if cls.__qualifier__ == 'array': # Don't quote the integer keys name = f'[{elem.key}]' else: name = f"['{elem.key}']" value_addr = parent.load_addr + elem.value_offset frame = parent.frame # Create a new SBType to represent the element value. For each type tag, we # want a function that maps an SBFrame and an address to a new SBType: by_type: dict[BSONType, Callable[[SBFrame, int], SBType]] = { BSONType.Double: DoubleDisplay.__get_sbtype__, BSONType.UTF8: UTF8Display.__get_sbtype__, BSONType.Document: DocumentDisplay.__get_sbtype__, BSONType.Binary: BinaryDisplay.__get_sbtype__, BSONType.Array: ArrayDisplay.__get_sbtype__, # For bool, we can just use LLDB's basic type: BSONType.Bool: lambda _fr, _addr: parent.target.GetBasicType(lldb.eBasicTypeBool), BSONType.Code: CodeDisplay.__get_sbtype__, BSONType.CodeWithScope: CodeWithScopeDisplay.__get_sbtype__, BSONType.Int32: Int32Display.__get_sbtype__, BSONType.Int64: Int64Display.__get_sbtype__, BSONType.ObjectID: ObjectIDDisplay.__get_sbtype__, BSONType.DBPointer: DBPointerDisplay.__get_sbtype__, BSONType.Regex: RegexDisplay.__get_sbtype__, BSONType.Symbol: SymbolDisplay.__get_sbtype__, BSONType.Datetime: DatetimeDisplay.__get_sbtype__, BSONType.Timestamp: TimestampDisplay.__get_sbtype__, BSONType.Decimal128: Decimal128Display.__get_sbtype__, BSONType.Null: NullDisplay.__get_sbtype__, BSONType.Undefined: UndefinedDisplay.__get_sbtype__, BSONType.MaxKey: MaxKeyDisplay.__get_sbtype__, BSONType.MinKey: MinKeyDisplay.__get_sbtype__, } get_type = by_type.get(elem.type) assert get_type is not None, f'Unhandled type tag? {elem=}' # Create the SBType: type = get_type(frame, value_addr) # Create a synthetic child of that type at the address of the element's value: val = parent.synthetic_child_from_address(name, value_addr, type) assert val.error.success, f'{elem=}, {val.error=}' return val class ArrayDisplay(DocumentDisplay): """Display for arrays. Most logic is implemented in the DocumentDisplay base.""" __typename__ = '__bson_array_[0-9]+__' __qualifier__: ClassVar[str] = 'array' class BinaryInfo(NamedTuple): subtype: int data: bytes class BinaryDisplay(SyntheticDisplayBase[BinaryInfo]): """Display for a BSON binary value""" __typename__ = '__bson_binary__' @classmethod @override def __parse__(cls, value: SBValue) -> BinaryInfo: buf = memcache.get_cached(value.load_addr) # Size prefix: data_size = read_i32le(buf) # Type tag: type = buf[4] # The remainder of the data: data = buf[5:][:data_size] return BinaryInfo(type, data) @override def get_children(self) -> Iterable[ChildItem]: yield 'size', len(self.value.data) byte_t = generate_or_get_type('enum __bson_byte__ : char {}', self.sbvalue.frame) yield 'subtype', self.value.subtype, lldb.eFormatHex, byte_t array_t = byte_t.GetArrayType(len(self.value.data)) yield lambda: self.sbvalue.synthetic_child_from_address('data', self.address + 5, array_t) class UndefinedDisplay(SyntheticDisplayBase[None]): """ Display type for 'undefined' values. Also derived from for other unit types. """ __typename__ = '__bson_undefined__' __summary_str__ = 'undefined' __enable_synthetic__: ClassVar[bool] = False @classmethod @override def __parse__(cls, value: SBValue) -> None: return None class ObjectIDDisplay(SyntheticDisplayBase[bytes]): """Display type for ObjectIDs""" __typename__ = '__bson_objectid__' @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: val = cls.__parse__(value) return f'ObjectID("{val.hex()}")' @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: return generate_or_get_type( r""" enum __bson_byte__ : char {}; struct __bson_objectid__ { __bson_byte__ bytes[12]; } """, frame, ) @classmethod @override def __parse__(cls, value: SBValue) -> bytes: buf = memcache.get_cached(value.load_addr) return buf[:12] @override def get_children(self) -> Iterable[ChildItem]: yield 'spelling', self.value.hex() class DatetimeDisplay(SyntheticDisplayBase[int]): """Display for BSON Datetime objects""" __typename__ = '__bson_datetime__' __summary_str__: ClassVar[str] = 'datetime: ${var[0]}' @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: dt = datetime.fromtimestamp(cls.__parse__(value) / 1000) s = f'{dt:%a %b %m %Y %H:%M:%S +%fμs}' return f'Date("{s}")' @classmethod @override def __parse__(cls, val: SBValue) -> int: buf = memcache.get_cached(val.load_addr) buf = buf[:8] value: int = struct.unpack(' Iterable[ChildItem]: # We can create a rich display using Python's datetime parsing: dt = datetime.fromtimestamp(self.value / 1000) # Adjusted to the local time zone: adjusted = dt.astimezone() yield from { '[isoformat]': dt.isoformat(), '[date]': f'{dt:%B %d, %Y}', '[time]': dt.strftime('%H:%M:%S +%fμs'), '[local]': adjusted.strftime('%c'), 'Year': dt.year, 'Month': dt.month, 'Day': dt.day, 'Hour': dt.hour, 'Minute': dt.minute, 'Second': dt.second, '+μs': dt.microsecond, }.items() class NullDisplay(UndefinedDisplay): """Display for the BSON 'null' type""" __typename__ = '__bson_null__' __summary_str__ = 'null' class RegexDisplay(SyntheticDisplayBase[Tuple[bytes, bytes]]): """Display type for BSON regular expressions""" __typename__ = '__bson_regex_[0-9]+_[0-9]+__' __enable_synthetic__: ClassVar[bool] = False @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: regex, opts = cls.parse_at(addr) regex_len = len(regex) + 1 opts_len = len(opts) + 1 # Synthesize a struct with two char[] matching the strings: return generate_or_get_type( rf""" struct __bson_regex_{regex_len}_{opts_len}__ {{ char regex[{regex_len}]; char options[{opts_len}]; }} """, frame, ) @classmethod @override def __parse__(cls, value: SBValue) -> tuple[bytes, bytes]: return cls.parse_at(value.load_addr) @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: # Create a JS-style regex literal: pair = cls.__parse__(value) regex, options = cls.decode_pair(pair) regex = regex.replace('/', '\\/').replace('\n', '\\n') return f'/{regex}/{options}' @classmethod def parse_at(cls, addr: int) -> tuple[bytes, bytes]: buf = memcache.get_cached(addr) # A regex is encoded with two C-strings. Find the nulls: nulpos_1 = buf.index(0) nulpos_2 = buf.index(0, nulpos_1 + 1) # Split them up: regex = buf[:nulpos_1] options = buf[nulpos_1 + 1 : nulpos_2] # Decode and return: return regex, options @classmethod def decode_pair(cls, value: tuple[bytes, bytes]) -> tuple[str, str]: regex, options = value regex = regex.decode('utf-8', errors='replace') options = options.decode('utf-8', errors='replace') return regex, options class DBPointerDisplay(SyntheticDisplayBase[Tuple[bytes, int]]): """Display type for DBPointers""" __typename__ = '__bson_dbpointer__' __summary_str__: ClassVar[str | None] = 'DBPointer(${var[0]}, ${var[1]})' @classmethod @override def __parse__(cls, value: SBValue) -> tuple[bytes, int]: buf = memcache.get_cached(value.load_addr) # Grab the string and the OID position strlen = read_i32le(buf) size = strlen + 4 + 12 return buf[:size], strlen + 4 @override def get_children(self) -> Iterable[ChildItem]: utf8_t = UTF8Display.__get_sbtype__(self.sbvalue.frame, self.address) oid_offset = self.value[1] oid_t = ObjectIDDisplay.__get_sbtype__(self.sbvalue.frame, self.address + oid_offset) yield lambda: self.sbvalue.synthetic_child_from_address('collection', self.sbvalue.load_addr, utf8_t) yield lambda: self.sbvalue.synthetic_child_from_address('object', self.sbvalue.load_addr + oid_offset, oid_t) class CodeDisplay(UTF8Display): """Display type for BSON code""" __typename__ = '__bson_code__' __summary_str__ = 'Code(${var[1]})' class SymbolDisplay(UTF8Display): """Display type for BSON symbols""" __typename__ = '__bson_symbol__' @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: spell = cls.__parse__(value) dec = spell.decode('utf-8', errors='replace').rstrip('\x00') return f'Symbol({dec})' class CodeWithScopeDisplay(SyntheticDisplayBase[int]): """Display type for BSON 'Code w/ Scope'""" __typename__ = '__code_with_scope__' __summary_str__: ClassVar[str | None] = 'Code(${var[0][1]}, ${var[1]})' @classmethod @override def __parse__(cls, value: SBValue) -> int: buf = memcache.get_cached(value.load_addr) # Find the end position of the string: strlen = read_i32le(buf[4:]) str_end = 4 + strlen + 4 return str_end @override def get_children(self) -> Iterable[ChildItem]: code_t = CodeDisplay.__get_sbtype__(self.sbvalue.frame, self.address) scope_doc_offset = self.value doc_t = DocumentDisplay.__get_sbtype__(self.sbvalue.frame, self.address + scope_doc_offset) yield lambda: checked(self.sbvalue.synthetic_child_from_address('code', self.address + 4, code_t)) yield lambda: checked( self.sbvalue.synthetic_child_from_address('scope', self.address + scope_doc_offset, doc_t) ) class Int32Display(PrimitiveDisplay[int]): """Display for 32-bit BSON integers""" __typename__ = '__bson_int32__' __struct_format__: ClassVar[str] = ' str: return f'NumberInt({cls.__parse__(value)})' class Int64Display(PrimitiveDisplay[int]): """Display for 64-bit BSON integers""" __typename__ = '__bson_int64__' __struct_format__: ClassVar[str] = ' str: return f'NumberLong({cls.__parse__(value)})' class TimestampDisplay(SyntheticDisplayBase[Tuple[int, int]]): """Display type for BSON timestamps""" __typename__ = '__bson_timestamp__' __summary_str__ = 'Timestamp(${var[0]}, ${var[1]})' @classmethod @override def __parse__(cls, value: SBValue) -> tuple[int, int]: buf = memcache.get_cached(value.load_addr)[:8] # Just two 32bit integers: timestamp, increment = struct.unpack(' Iterable[ChildItem]: yield 'timestamp', self.value[0] yield 'increment', self.value[1] class Decimal128Value(NamedTuple): """Represents a parsed Decimal128 value""" sign: int combination: int exponent: int significand: int spelling: str class Decimal128Display(SyntheticDisplayBase[Decimal128Value]): """The display type for BSON's Decimal128 type""" __typename__ = '__bson_decimal128__' @classmethod @override def __get_sbtype__(cls, frame: SBFrame, addr: int) -> SBType: """Generate a type for byte-wise introspection""" return generate_or_get_type( r""" struct __bson_decimal128__ { unsigned char bytes[16]; } """, frame, ) @classmethod @override def __summary__(cls, value: SBValue, idict: InternalDict) -> str: val = cls.__parse__(value) return f'NumberDecimal("{val.spelling}")' @classmethod @override def __parse__(cls, value: SBValue) -> Decimal128Value: dat = bytes(value.data.uint8) # The value is little-endian encoded, so we manually read it in that encoding d1 = read_i32le(dat) d2 = read_i32le(dat[4:]) d3 = read_i32le(dat[8:]) d4 = read_i32le(dat[12:]) # Combin the parts: low_word = (d2 << 32) | d1 hi_word = (d4 << 32) | d3 d128_tetra = (hi_word << 64) | low_word # Create an array of individual bits (high bits first): bits = tuple(((d128_tetra >> n) & 1) for n in range(127, -1, -1)) # Recombine a sequence of bits into an int (high bits first) def mergebits(bs: tuple[int, ...]) -> int: return functools.reduce(lambda a, b: (a << 1) | b, bs, 0) # Sign bit: sign = bits[0] # BID uses the first two combo bits to indicate that the exponent is shifted if bits[1] and bits[2]: shifted = True else: shifted = False spelling = None if not shifted: # Regular bit positions: exponent = bits[1:15] coeff = bits[15:] else: # Bit positions are shifted over exponent = bits[3:17] # The significand has an implicit '0b100' prepended as the highest bits: coeff = (1, 0, 0) + bits[17:] # Check for special values in the remainder of the combination: more = bits[3:6] if more == (1, 0, 0) or more == (1, 0, 1): spelling = 'Infinity' elif more == (1, 1, 0): spelling = 'NaN (quiet)' elif more == (1, 1, 1): spelling = 'NaN (signaling)' coeff = mergebits(coeff) exponent = mergebits(exponent) if spelling is None: spelling = str(coeff) e = exponent - 6176 if e == 0: pass elif e < 0: spelling = spelling.zfill(abs(e)) split = len(spelling) + e w, fr = spelling[:split], spelling[split:] spelling = f'{w}.{fr}' else: spelling = spelling + '0' * e if sign: spelling = f'-{spelling}' # The "combination" bits combination = mergebits(bits[1:18]) return Decimal128Value(sign, combination, exponent, coeff, spelling) @override def get_children(self) -> Iterable[ChildItem]: yield 'sign', self.value.sign yield 'combination', self.value.combination, lldb.eFormatBinary, None yield 'exponent (biased)', self.value.exponent yield 'exponent (actual)', self.value.exponent - 6176 yield 'significand', str(self.value.significand) yield 'value', self.value.spelling class MaxKeyDisplay(NullDisplay): """The display type for BSON's 'max key' type""" __typename__ = '__bson_maxkey__' __summary_str__ = 'max key' class MinKeyDisplay(NullDisplay): """The display type for BSON's 'min key' type""" __typename__ = '__bson_minkey__' __summary_str__ = 'min key' class BSONTInfo(NamedTuple): """Information about a bson_t object""" addr: int 'The address of the pointer to the beginning of the BSON data managed by this object' size: int 'The size of the BSON data managed/referenced by this object' flags: int 'Flags of the bson_t object' class BSONTError(NamedTuple): """Represents an error while reading a bson_t object""" reason: str 'A description of the error that ocurred' class BSONTDisplay(SyntheticDisplayBase['BSONTInfo | BSONTError']): """ Implements inspection logic for bson_t """ __typename__ = 'bson_t' @classmethod @override def __parse__(cls, value: SBValue) -> BSONTInfo | BSONTError: # Dereference pointers: if value.TypeIsPointerType(): value = value.deref # Unwrap the wrapped object value = value.GetNonSyntheticValue() dat = value.data # We know the location of the flags and size without debug info: err = SBError() flags = dat.GetUnsignedInt32(err, 0) if err.fail: return BSONTError(f'Failed to read memory at 0x{value.load_addr:x}: {err.description}') length = dat.GetUnsignedInt32(err, 4) if err.fail: return BSONTError(f'Failed to read memory at 0x{value.load_addr:x}: {err.description}') # Check bogus values: MAX_SIZE = 16 * 1024 * 1024 ALL_FLAGS = (1 << 6) - 1 if flags & ~ALL_FLAGS or length < 5 or length > MAX_SIZE: return BSONTError(f'bson_t appears uninitialized/invalid [a] {flags=} {length=}') is_inline = bool(flags & 1) if is_inline: # Inline objects may only occupy 120 bytes, at most if length > 120: return BSONTError('bson_t appears uninitialized/invalid [b]') # Look for debug info for the inline impl inline_t = value.target.FindFirstType('bson_impl_inline_t') if inline_t: as_inline = value.Cast(inline_t) ptr = as_inline.GetChildMemberWithName('data').load_addr else: # No debug info? Guess its location as the default ptr = value.load_addr + 4 + 4 if not err.success: return BSONTError(f'Failed to read inline bson_t data: {err}') return BSONTInfo(ptr, length, flags) # Look for impl_alloc_t alloc_t = value.target.FindFirstType('bson_impl_alloc_t') if alloc_t: alloc = value.Cast(alloc_t) # Walk to the buffer for this value: offset = alloc.GetChildMemberWithName('offset').unsigned buf = alloc.GetChildMemberWithName('buf').deref.deref ptr = buf.load_addr + offset return BSONTInfo(ptr, length, flags) # No debug info, we have to calc the offset ourself u8_t = value.target.GetBasicType(lldb.eBasicTypeUnsignedChar) u8ptr_t = u8_t.GetPointerType() ptr_size = u8ptr_t.size u32_size = 4 buf_off = (u32_size * 2) + ptr_size + u32_size if u32_size < ptr_size: # Adjust for alignment buf_off += u32_size offset_off = buf_off + (ptr_size * 2) offset = dat.GetUnsignedInt32(err, offset_off) if not err.success: return BSONTError(f'Failed to read offset of buffer: {err}') bufptr = value.CreateChildAtOffset('buf', buf_off, u8ptr_t.GetPointerType()).deref if not bufptr.error.success: return BSONTError(f'Failed to read the alloc buf: {bufptr.error} {offset=} {buf_off=}') ptr = bufptr.data.GetUnsignedInt64(err, 0) assert err.success, err u32_t = value.target.FindFirstType('uint32_t') addr = SBAddress() addr.SetLoadAddress(ptr, value.target) u32 = value.target.CreateValueFromAddress('tmp', addr, u32_t) assert u32.error.success, u32 if u32.unsigned != length or length < 5: return BSONTError(f'bson_t appears uninitialized/invalid [c] {flags=} {length=} {u32.unsigned=}') return BSONTInfo(ptr, length, flags) @override def get_children(self) -> Iterable[ChildItem]: val = self.value if isinstance(val, BSONTError): yield '[error]', val.reason return # Imbue the flags with the possible debug info to give it a nice rendering flags_t = self.sbvalue.target.FindFirstType('bson_flags_t') if flags_t.IsValid(): yield 'flags', val.flags, None, flags_t else: yield 'flags', val.flags yield 'data size', val.size ptr_t = self.sbvalue.target.GetBasicType(lldb.eBasicTypeVoid).GetPointerType() yield 'data address', val.addr, lldb.eFormatPointer, ptr_t # Generate the __bson_document_xxx__ that will allow walking the document: doc_t = DocumentDisplay.__get_sbtype__(self.sbvalue.frame, val.addr) yield lambda: checked(self.sbvalue.synthetic_child_from_address('[content]', val.addr, doc_t)) def checked(val: SBValue) -> SBValue: """Assert that ``val`` is valid. Returns ``val``""" assert val.error.success, f'{val=} {val.error=}' return val def read_i32le(dat: bytes) -> int: """Read a 32-bit integer from the given data.""" # Truncate before the read: buf = dat[0:4] return struct.unpack(' SBType: """ This is the big magic in this module: LLDB doesn't have a "simple" API to generate new datatypes (which we need in order to inspect element contents!), so we instead generate them on-the-fly using the expression evaluator. If we evaluate an expression like: struct some_struct { int a, b, c; }; some_struct x; x LLDB will give us a handle to ``x``. We can then ask for the type of ``x``, which gives us a handle to `some_struct`, from which we can now synthesize new values and use as if it were part of the target's debug information all along. This needs to be done carefully, since it is an expensive operation and we do not want to declare the same type more than once. For this reason, we cache. """ # The cache key cachekey = frame.thread.process.id, expr_prefix existing = _types_cache.get(cachekey) if existing is not None: # We've already generated this type before return existing # Create a new temporary object. Give it a unique name to prevent it from # colliding with any possible temporaries we may have generated previously. hash = hashlib.md5(expr_prefix.encode()).hexdigest() varname = f'__bson_lldb_tmp_{hash}' full_expr = f'{expr_prefix} {varname}; {varname}' tmp = frame.EvaluateExpression(full_expr) existing = tmp.type _types_cache[cachekey] = existing return existing class BSONType(enum.Enum): """The values for each bson element type tag""" EOD = 0 Double = 0x1 UTF8 = 0x2 Document = 0x3 Array = 0x4 Binary = 0x5 Undefined = 0x6 ObjectID = 0x7 Bool = 0x8 Datetime = 0x9 Null = 0xA Regex = 0xB DBPointer = 0xC Code = 0xD Symbol = 0xE CodeWithScope = 0xF Int32 = 0x10 Timestamp = 0x11 Int64 = 0x12 Decimal128 = 0x13 MinKey = 255 MaxKey = 127 class _BSONWalker: """ This implement document traversal in a Python expression evaluator. It uses __getattr__ and __getitem__ to provide simple semantics for accessing subelements, and uses the matmul infix operator ``@`` to resolve the path against a given SBValue that refers to a ``bson_t`` """ def __init__(self, path: Iterable[str | int] = ()) -> None: self._path = tuple(path) "The path that we will resolve when '@' is applied." def __rmatmul__(self, lhs: Any) -> SBValue | str: """Implement the actual path resolution. This is the '@' operator.""" if isinstance(lhs, str): # Evaluate the left-hand string as an expression within the target target = lldb.debugger.GetSelectedTarget() if target is None: raise RuntimeError('Not attached to a debug target') frame = target.process.selected_thread.frames[0] lhs = frame.EvaluateExpression(lhs) val: SBValue if hasattr(lhs.__class__, 'unwrap'): # CodeLLDB gives us a wrapper around SBValue, but we want the unwrapped # version: val = lhs.__class__.unwrap(lhs) else: val = lhs if val.TypeIsPointerType(): # Dereference pointers val = val.deref # Drop the synthetic wrapper that was wrapped around bson_t val = val.GetNonSyntheticValue() # Parse it: as_bson = BSONTDisplay.__parse__(val) if isinstance(as_bson, BSONTError): raise ValueError(as_bson.reason) # Create the synthetic __bson_document_xxx__ object for this doc doc_t = DocumentDisplay.__get_sbtype__(val.frame, as_bson.addr) # Obtain a value reference to the document data: retval = val.CreateValueFromAddress('[root]', as_bson.addr, doc_t) # Now resolve the path: for part in self._path: if isinstance(part, str): # Access via ``p['foo']`` or ``p.foo``, requires our current node # to be a document: if not retval.type.name.startswith('__bson_document_'): raise AttributeError( f'Element of type {retval.type.name} cannot be accessed as a document (looking for element "{part}")' ) # We are accessing the synthetic children generated by DocumentDisplay. # The keys are of the following format based on the element keys in the document: want_child_name = f"['{part}']" else: # Access via indexing ``p[42]``, requires an array if not retval.type.name.startswith('__bson_array_'): raise AttributeError( f'Element of type {retval.type.name} cannot be accessed as an array (looking for element {part})' ) # Array keys are bracketed, but not quoted want_child_name = f'[{part}]' # Find all children that match the key (usually only one) matching = (c for c in retval.children if c.name == want_child_name) # Get it: got = next(iter(matching), None) if got is None: # Didn't get it... if isinstance(part, str): raise KeyError(f'Document has no element "{part}"') else: raise IndexError(f'Array index [{part}] is out-of-bounds') # Set this as our current node, which we may step in further, or # we may be done retval = got return retval def __getattr__(self, key: str) -> _BSONWalker: """Generate a new traversal for the given key""" return _BSONWalker(self._path + (key,)) def __getitem__(self, key: str | int) -> _BSONWalker: """Generate a new traversal for the given key or index""" return _BSONWalker(self._path + (key,)) class _MemoryCache: """ Reading process memory is an extremely slow operation, and we don't want to re-read memory multiple times. Because parsing a document's elements requires reading the entire document into memory, we are guaranteed that the top-level DocumentDisplay object will perform a ReadMemory() of the entire object, and thus all child elements can reuse that buffer when they parse and render their own contents. This class implements that cache of memory segments """ def __init__(self): self._segments: dict[int, bytes] = {} 'Segments of memory keyed by the base address of the read operation' def get_cached(self, addr: int) -> bytes: """ Find and return a chunk of memory that was previously read from the process. The ``addr`` must be an address within a BSON document that was previously read by a DocumentDisplay. The returned buffer begins at exactly ``addr``, and contains the full remainder of the cached segment, which may be much longer than the caller actually needs. We don't need additional granularity for our purposes, though. """ segment = self.segment_containing(addr) if not segment: # Memory does not exist? print(f'lldb_bson: Note: Attempted read of uncached address 0x{addr:x}') print(''.join(traceback.format_stack())) return b'\0' * 512 base_addr, data = segment inner_offset = addr - base_addr return data[inner_offset:] def segment_containing(self, addr: int) -> tuple[int, bytes] | None: """Find the segment that contains ``addr``, or returns None""" for base_addr, data in self._segments.items(): end_addr = base_addr + len(data) if addr > end_addr or addr < base_addr: continue return base_addr, data return None def read(self, val: SBValue) -> tuple[int, bytes]: """ Read the memory segment referenced by the given SBValue """ return self.read_at(val.process, val.load_addr, val.size) def read_at(self, proc: SBProcess, addr: int, size: int) -> tuple[int, bytes]: """ Read from ``proc`` a chunk of memory beginning at ``addr`` and continuing for ``size`` bytes. """ err = SBError() buf = proc.ReadMemory(addr, size, err) if err.fail: raise LookupError(err.description) self._segments[addr] = buf return addr, buf memcache = _MemoryCache() 'A module-wide memory segment cache.' mongo-c-driver-2.2.1/pyproject.toml000066400000000000000000000021031511661753600172670ustar00rootroot00000000000000[project] name = "mongo-c-driver" version = "0.1.0" description = "For development only." requires-python = ">=3.10" dependencies = [] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [dependency-groups] dev = [ { include-group = "docs" }, { include-group = "evg" }, { include-group = "format" }, ] format = [ # tools/format.py "clang-format~=20.1.0", ] format-scripts = [ "ruff>=0.13.0", "shfmt-py>=3.12.0.2", ] docs = [ # .evergreen/scripts/build-docs.sh "furo>=2023.5.20", "sphinx-design>=0.5.0", "sphinx>=7.1.1,<9.0", ] evg = [ # .evergreen/config_generator "packaging>=14.0", "pydantic>=2.8", "shrub-py>=3.7", # .evergreen/legacy_config_generator/evergreen_config_generator/__init__.py "yamlloader>=1.5", ] [project.scripts] mc-evg-generate = "config_generator.generate:main" [tool.hatch.build.targets.wheel] packages = [ ".evergreen/config_generator", ] [tool.ruff] line-length = 120 src = [".evergreen", "etc"] [tool.ruff.format] quote-style = "single" indent-style = "space" mongo-c-driver-2.2.1/src/000077500000000000000000000000001511661753600151465ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/CMakeLists.txt000066400000000000000000000041351511661753600177110ustar00rootroot00000000000000# sub-directory 'libbson' was already included at the top-level # sub-directory 'libmongoc' was already included at the top-level # sub-directory 'kms-message' was already included at the top-level # Copy zconf.h.in to zconf.h, used by zlib configure_file ( "${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/zconf.h.in" "${CMAKE_BINARY_DIR}/src/zlib-1.3.1/zconf.h" COPYONLY ) if (CMAKE_CXX_COMPILER) # Add a C++ source file that will #include the main C headers. This "library" # does nothing other than validate that the C headers are valid C++ headers. add_library (mongoc-cxx-check OBJECT cpp-check.cpp) if (TARGET mongoc::static) target_link_libraries (mongoc-cxx-check PRIVATE mongoc::static) else () target_link_libraries (mongoc-cxx-check PRIVATE mongoc::shared) endif () endif () # public-header-warnings add_executable(public-header-warnings EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/c-check.c) if (TARGET mongoc::static) target_link_libraries(public-header-warnings PRIVATE mongoc::static) else () target_link_libraries(public-header-warnings PRIVATE mongoc::shared) endif () target_compile_options(public-header-warnings PRIVATE $<$:-Weverything> $<$:-Wextra> $<$:-Werror> $<$:-Wno-declaration-after-statement> $<$:-Wno-disabled-macro-expansion> $<$:-Wno-c++98-compat-pedantic> $<$:-Wno-pre-c11-compat> $<$:-Wno-pre-c2x-compat> $<$:-Wno-unsafe-buffer-usage> $<$:-Wno-padded> $<$:-Wno-reserved-identifier> $<$:-Wno-documentation-unknown-command> $<$:-Wno-unknown-warning-option> $<$:-Wno-poison-system-directories> $<$:/W4> $<$:/WX> $<$:/wd4324> ) mongo-c-driver-2.2.1/src/c-check.c000066400000000000000000000001241511661753600166040ustar00rootroot00000000000000#include #include int main (void) { return 0; } mongo-c-driver-2.2.1/src/common/000077500000000000000000000000001511661753600164365ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/common/CMakeLists.txt000066400000000000000000000017361511661753600212050ustar00rootroot00000000000000 set (MONGOC_ENABLE_DEBUG_ASSERTIONS 0) if (ENABLE_DEBUG_ASSERTIONS) set (MONGOC_ENABLE_DEBUG_ASSERTIONS 1) endif () configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/src/common-config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/src/common-config.h" ) add_library(mongo-mlib INTERFACE) add_library(mongo::mlib ALIAS mongo-mlib) target_include_directories(mongo-mlib INTERFACE $) set_property(TARGET mongo-mlib PROPERTY EXPORT_NAME mongo::mlib) if(CMAKE_CXX_COMPILER) add_executable(mlib-ckdint-test src/mlib/ckdint.test.cpp) set_target_properties(mlib-ckdint-test PROPERTIES COMPILE_FEATURES cxx_std_11 LINK_LIBRARIES mongo::mlib # Enable -fPIC, required for some build configurations POSITION_INDEPENDENT_CODE TRUE ) add_test(NAME mongoc/mlib/ckdint COMMAND mlib-ckdint-test) set_property(TEST mongoc/mlib/ckdint PROPERTY SKIP_REGULAR_EXPRESSION "@@ctest-skipped@@") endif() mongo-c-driver-2.2.1/src/common/src/000077500000000000000000000000001511661753600172255ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/common/src/.gitignore000066400000000000000000000000201511661753600212050ustar00rootroot00000000000000common-config.h mongo-c-driver-2.2.1/src/common/src/bson-dsl.md000066400000000000000000000707331511661753600213020ustar00rootroot00000000000000# Using `common-bson-dsl-private.h` The header `` exposes an embedded domain-specific language (DSL) built upon the C99 preprocessor. The DSL emits valid C99 and C++03 code that can be used to inspect and construct `bson_t` objects. The intent of the DSL is to simplify and streamline the process of working with BSON data within C, which is otherwise slow, error-prone, and requires a lot of boilerplate. The DSL presents a declarative style of working with BSON data. The DSL can be broken down into two classes: - [BSON writing](#generating-bson-data): - [`bsonBuild`](#bsonbuild) - [`bsonBuildDecl`](#bsonbuilddecl) - [`bsonBuildArray`](#bsonbuildarray) - [`bsonBuildAppend`](#bsonbuildappend) - [BSON reading](#reading-bson-data) - [`bsonVisitEach`](#bsonvisiteach) - [`bsonParse`](#bsonparse) The following DSL "grammatical elements" are defined: - [*DocOperation*](#docoperation) - [*ValueOperation*](#valueoperation) - [*ArrayOperation*](#arrayoperation) - [*ParseOperation*](#parseoperation) - [*VisitOperation*](#visitoperation) - [*Predicate*](#predicate) **NOTE:** The `common-bson-dsl-private.h` header is *not* a public API. It is intended for internal use and may be changed, broken, updated, or removed. # Generating BSON Data ## Examples ### Empty ```c bsonBuildDecl(empty); ``` Result: ```js {} ``` ### A Simple "okay" ```c bsonBuildDecl(e, kv("okay", boolean(true))); ``` Result: ```js { okay: true } ``` ### Nested Documents and Arrays ```c bsonBuildDecl(e, kv("integer", int32(8)), kv("subdoc", doc(kv("foo", cstr("bar")), kv("baz", null))), kv("anArray", array(int32(1), int32(2), null, cstr("I am a string")))); ``` Result: ```js { integer: 8, subdoc: { foo: "bar", "baz": null }, anArray: [1, 2, null, "I am a string"] } ``` ### Create an Aggregate Command ```c bson_t* make_aggregate(const char* coll, const bson_t* pipeline_array, int timeout_ms, int batch_size, const bson_t* comment, bson_error_t* error) { bson_t* r = bson_new(); bsonBuildAppend(r, kv("aggregate", cstr(coll)), kv("pipeline", bsonArray(*pipeline_array)), kv("cursor", doc(if(batch_size != -1, then(kv("batchSize", int32(batch_size)))))), if(timeout_ms > 0, then(kv("maxTimeMS", int32(timeout_ms))), if(comment, then(kv("comment", bson(*comment))))); // Check if any of the above failed: if (bsonBuildError) { bson_set_error(error, ERROR_COND, ERROR_CODE, "Failed to build aggregate: %s", bsonBuildError); bson_destroy(r); r = NULL; } return r; } ``` ## `bsonBuild` > `bsonBuild(BSON, DocOperation... ops)` Calls `bson_init(&BSON)`, followed by `bsonBuildAppend(BSON, ops...)`. ## `bsonBuildDecl` > `bsonBuildDecl(VarName, DocOperation... ops)` Declares a new `bson_t` named `VarName` and calls `bsonBuild(VarName, ops...)`. ## `bsonBuildAppend` > `bsonBuildAppend(BSON, DocOperation... ops)` Appends to an already-initialized `bson_t` given by `BSON` (which must be a modifiable l-value of type `bson_t`). For information on the meaning of `ops...`, See: [`DocOperation`](#DocOperation) ## `bsonBuildArray` > `bsonBuildArray(VarName, ArrayOperation... ops)` Appends to an already-initialized `bson_t` at `VarName`. Elements are inserted using incrementally increasing integer string keys. For more information, refer to [`ArrayOperation`](#ArrayOperation) ## Syntax ### *DocOperation* The *DocOperations* are used to generate elements of a `bson_t` document or subdocument thereof. The top-level `bsonBuildAppend()` and the `doc()` *ValueOperation* both accept a list of *DocOperations*. The following *DocOperations* are defined: #### `kvl()` > `kvl(const char* str, int len, ValueOperation val)` The lowest-level *DocOperation*, generates a key-value pair in the document, with the string begining at `str` for `len` characters defining the key, and `val` defining the value of the element. (See: [ValueOperation](#valueoperation)) If `str` is null-terminated, you can just use `kv()` #### `kv()` > `kv(const char* zstr, ValueOperation val)` Generate a key-value pair element, with the key given as the null-terminated C string at `zstr`, and the element value given by `val`. (See: [*ValueOperation*](#valueoperation)) #### `if()` > `if(bool c, then(DocOperation... thens))` > `if(bool c, then(DocOperation... thens), else(DocOperation... elses))` Conditionally insert elements into the document. If `c` evaluates to `true`, evaluates `thens`, otherwise `elses` (if given). `c` is a regular C expression (not a DSL *Predicate*, which is only used for visiting/parsing). Note that the `then()` and `else()` keywords must wrap the sub-operations: ```c if(some_condition, then(...), else(...)) ``` #### `insert()` > `insert(bson_t b, Predicate cond)` For some other valid `bson_t` given as `b`, copy every element from `b` that satisfies `cond` into the parent document. The *Predicate* `cond` will be evaluated for every element in `b`. Refer: [*Predicate*](#Predicate). To copy *all* elements from `b`, simply use the bare `always` predicate. #### `insertFromIter()` > `insertFromIter(bson_iter_t iter, Predicate cond)` Like `insert()`, but copies from the bson document/array referred to by `iter`. #### `iterElement()` > `iterElement(bson_iter_t iter)` Copy the BSON document element referred to by the given iterator. The element will have the same key+value as from the iterator. #### `do()` > `do(...)` Execute arbitrary C code while building the document. The document that is being built can be accessed and further modified by using the `bsonBuildContext.doc` pointer. Note: The given code can use `break` to "early exit" from the `do()`, but MUST NOT use any other form of control flow that would exit the `do()` block (i.e. `return`, `continue`, `goto`). ### *ValueOperation* The DSL *ValueOperations* are used to specify the value of an element to be appended to a document or array. #### `null` Generates a BSON null value. #### `boolean(bool b)` Generate a BSON boolean value from the given C boolean expression. #### `int32(int32_t v)` #### `int64(int64_t v)` Generate an integral value from the given C integer expression. #### `cstr(const char* zstr)` Generate a UTF-8 value from the given null-terminated character array beginning at `zstr`. #### `binary(bson_subtype_t subtype, const uint8_t *binary, uint32_t length)` Generate a binary value from a subtype, pointer, and length. #### `oid(const bson_oid_t* oid)` Generate an ObjectId value from the given C expression that evaluates to a bson_oid_t pointer. #### `utf8_w_len(const char* str, int len)` Generate a UTF-8 value from the character array beginning at `str`, with length `len`. #### `iterValue(bson_iter_t iter)` Copy the BSON value that is referenced by the given `iter`. #### `bson(bson_t)` Copy the given `bson_t` document as a subdocument for the element. #### `bsonArray(bson_t)` Copy the given `bson_t` document as an array element. (All keys in the array document are expected to be integer index keys, but this is not enforced). #### `doc(DocOperation... ops)` Create a sub-document using DSL *DocOperation* commands `ops`. #### `array(ArrayOperation... ops)` Create a sub-document of array type using the DSL *ArrayOperation* commands `ops`. #### `value(bson_value_t)` Insert the value denoted by the given `bson_value_t`. #### `if(bool cond, then(ValueOperation), else(ValueOperation))` "pick" one of two *ValueOperations* to use for the value, based on `cond`. Note that both of `then()` and `else()` are required. ### *ArrayOperation* *ArrayOperations* are used to build elements of arrays. **Most** *ValueOperations* are also valid *ArrayOperations*, with the following additions: #### `insert(bson_t other, Predicate cond)` Like the *DocOperation* `insert()`, but elements from `other` are given integer index keys to match the enclosing array. #### `if(bool cond, then(ArrayOperation... thens)) #### `if(bool cond, then(ArrayOperation... thens), else(ArrayOperation... elses)) Conditionally execute more *ArrayOperations* based on `cond`. # Reading BSON Data ## `bsonParse` > `bsonParse(bson_t b, ParseOperation... ops)` Perform the given *ParseOperations* `ops` on `b`. ## `bsonVisitEach` > `bsonVisitEach(bson_t b, VisitOperation... ops)` Perform the given *VisitOperations* `ops` *on every element* of `b`. ## `bsonAs` > `bsonAs(TypeName t)` Dereference the currently visited/parsed element as a value of the given type `t`. May only be evaluated within a visit/parsing context. ## "Parse" versus "Visit" `bsonParse` and `bsonVisitEach` are both commands for inspecting and destructuring BSON data, but work differently. `bsonParse` is given a list of *ParseOperations*, and then evaluates each of those operations in the given order exactly once for the whole document. `bsonParse` is used to inspect a document as a whole. `bsonVisitEach` is given a list of *VisitOperations*, and *for each element* will evaluate *all* of those operations. `bsonVisitEach` is used to inspect the individual elements of a document. Each element is visited in the order that it appears, and each operation is evaluated in the order they were given. ## The `bsonVisitIter` There is a global (thread-local) non-modifiable lvalue name `bsonVisitIter`, which evaluates to a `const bson_iter_t` that refers to whatever (sub)document element is currently being visited or parsed. This is useful in contexts where one wishes to execute arbitrary code within a parse/visit, and needs to refer to the element that is being visited. **Note** that evaluating this name outside of a parse/visit context is **undefined behavior**. ## Syntax ### *ParseOperation* Parse operations are used to find specific elements within documents, and perform additional control-flow operations. #### `find` #### `require` > `find(Predicate p, VisitOperation... ops)` > `require(Predicate p, VisitOperation... ops)` Locate the first element that matches the *Predicate* `p`, and then evaluate each *VisitOperation* in `ops` for that element. If the `require` command fails to find a matching element, it will generate an `error()` command that mentions the failed predicate `p`. #### `else` > `else(ParseOperation... ops)` If the previous `find()` command *did not* find an element, evaluate `ops`, otherwise does nothing. **NOTE** that this is unrelated to the "`if`" *ParseOperation*. #### `visitOthers` > `visitOthers(VisitOperation... ops)` For each element in the document being parsed that *has not* been visited by any previous `find` or `require` operation, evaluate `ops` #### `error` > `error(const char* S)` Assign the given character pointer `S` to `bsonParseError`. **Note** that this string is thread-local and is not freed or allocated. It is recommended to only use string literals for `S`. #### `errorf` > `errorf(char*& E, const char* fmt, ...)` If `E` is non-`NULL`, it will be freed, then: Generate an error string using printf-formatting. The allocated pointer will be written to `E`. `bsonParseError` will also be set to point to the same address as `E`. **NOTE:** It is the callers's responsibility to eventually free `E`. #### `halt` The `halt` keyword stops the current `bsonVisit()`/`bsonParse()` in which it appears. #### `if` > `if(bool cond, then(ParseOperation... thens))` > `if(bool cond, then(ParseOperation... thens), else(ParseOperation... elses))` If `cond` is true, evaluate `thens`, otherwise evaluate `elses` (if provided). #### `append` > `append(bson_t b, DocOperation... ops)` Evaluate as-if a `bsonBuildAppend(b, ops...)` appears at this location. The value of `bsonVisitIter` is unspecified. #### `do` > `do(...)` Evaluate the given arbitrary code. The value of `bsonVisitIter` is unspecified. ### *VisitOperation* A *VisitOperation* applies a specific action to individual elements within a BSON document. During a visit operation, `bsonVisitIter` refers to the current element that is being visited or parsed. For example, during a parse `find()` operation, `bsonVisitIter` refers to the element that was found matching the predicate. During a `bsonVisitEach()`, each element is iterated over, and `bsonVisitIter` will refer to every element in turn. #### `do(...)` Evaluate the given C code. The `bsonVisitIter` can be used to reference the element being visited/parsed. #### `storeBool(bool& b)` If `bsonVisitIter` refers to a boolean value, assign that value to `b` (which must be a modifiable lvalue of type `bool`). #### `storeStrRef(const char*& s)` If `bsonVisitIter` refers to a UTF-8 string, a pointer to that string element will be assigned to `s`. **NOTE** that this writes a pointer to the string within the BSON data, so `s` is only valid as long as the `bson_t` document is valid and unmodified. #### `storeStrDup(const char*& s)` If `bsonVisitIter` refers to a UTF-8 string, that string will be copied and a pointer to the allocated region will be assigned to `s`, which must later be freed. #### `storeDocRef(bson_t& doc)` Update `doc` to be a view of the subdocument at `bsonVisitIter`. This view will remain valid for as long as the root document being parsed is valid. The `doc` is a view, so it will not need to be destroyed, and cannot be modified. `storeDocDup(bson_t&)` and `storeDocDupPtr(bson_t*&)` will duplicate the document element into the given `bson_t` (or pointer thereof). The duplicated document will need to be destroyed, and is valid to modify. #### `append(bson_t b, DocOperation... ops)` Evaluate a `bsonBuildAppend(b, ops...)`, with `bsonVisitIter` referring to the element being visited. #### `appendTo(bson_t b)` Append the current element to the BSON document `b`. The element will be copied with the same key and value. #### `visitEach(VisitOperation... ops)` If `bsonVisitIter` refers to a document or array element `A`, apply `bsonVisitEach(A, ops...)`. #### `parse(ParseOperation... ops)` If `bsonVisitIter` refers to a document or array element `D`, apply `bsonParse(D, ops...)`. #### `halt` Completely stop the current `bsonParse`/`bsonVisit` command. #### `break` Stop the inner-most `bsonVisitEach`/`visitEach` command. Only valid when directly within a `bsonVisitEach` or `visitEach` context. #### `continue` If directly within a `bsonVisitEach`/`visitEach` evaluation, stop visiting the current element and advance to the next element. #### `error(const char* S)` Assign the given character pointer `S` to `bsonParseError`. **Note** that this string is thread-local and is not freed or allocated. It is recommended to only use string literals for `S`. #### `errorf(char*& E, const char* fmt, ...)` If `E` is not `NULL`, `E` will be freed. Then: Generate an error string using printf-style formatting. The allocated string will be written to `E`. `bsonParseError` will be updated to point to the generate string. **NOTE:** It is the caller's responsibility to eventually free `E`. #### `dupPath(char* P)` If `P` is non-`NULL`, `P` is freed. Then: Create a JSONPath-style string that refers to the document element currently being visited. The path will be rooted at the document given to the top-most `bsonParse`/`bsonVisit` invocation in the calling thread. **NOTE:** It is the caller's responsibility to eventually free `P`. #### `if()` > `if(Predicate cond, then(VisitOperation... thens))` > `if(Predicate cond, then(VisitOperation... thens), else(VisitOperation... elses))` If the *Predicate* `cond` matches the current element, apply the `thens` operations, otherwise the `elses` (if given). **NOTE** that this `if()` command expects a DSL *Predicate* as its condition, and *not* a regular C expression like the other `if()` DSL commands. #### `nop` Does nothing. #### `case()` > ``` > case(when(Predicate w, > VisitOperations... ops) > ..., > [else(VisitOperations... ops)]) > ``` Perform case selection based on a set of predicates. `case` accepts zero or more `when(Predicate w, VisitOperation... ops)` clauses. Each `when` is considered in the listed order. If the *Predicate* `w` of a `when` matches the `bsonVisitIter` element, then the `when`'s *VisitOperations* `ops` are evaluated on the element. After any `when` clause matches an element, no subsequent `when` clauses are considered. An `else(ops...)` clause is equivalent to `when(always, ops...)`. If no clause matches the element, nothing happens. ### *Predicate* DSL *Predicates* appears in several locations. A *Predicate* evaluates some condition on the current `bsonVisitIter` (which is updated automatically by other DSL commands). A predicate can be evaluated at any point in C code by using the `bsonPredicate()` expression (this is only valid within a `visitEach` or `parse` context, since it references the `bsonVisitIter` name). The following predicates are defined: #### `key(const char* s...)` Specify one or more C strings for `s`. This predicate will match if *any of* `s` is equivalent to the element's key string. The `iKey(s...)` predicate is the same as `key`, but performs a case-insensitive match. #### `type(TypeName t)` Matches if the element's current type matches the `TypeName` `t`. The `TypeName`s are: `double`, `utf8`, `doc`, `array`, `binary`, `undefined`, `oid`, `boolean`, `date_time`, `null`, `regex`, `dbpointer`, `code`, `codewscope`, `int32`, `timestamp`, `int64`, and `decimal128`. #### `keyWithType(const char* k, TypeName t)` Matches an element with key `k` and type `t`. `iKeyWithType` performs a case-insensitive string match for the key. #### `isNumeric` The `isNumeric` predicate matches if the element's value is a numeric type (`double`, `int32`, or `int64`. `decimal128` is *not* included). #### `lastElement` Matches only the final element in a document. #### `always` Always matches. #### `never` Never matches. #### `isTrue` Matches is the element is "true" according to `bson_iter_as_bool()`: A `true` boolean, a non-zero int/double value, or other non-null value. #### `isFalse` Matches any element that is not `isTrue`. #### `empty` Matches an element which is an empty BSON subdocument or array. #### `strEqual(const char* s)` Matches if the element value is a UTF-8 string and is equivalent to the string `s`. `iStrEqual(s)` performs the same match, but performs a case-insensitive comparison. #### `eq(TypeName t, any v)` Matches if the element has type `t` and `bsonAs(t) == v`. #### `not(Predicate... ps)` Matches if *none of* the predicates `ps` match. #### `allOf(Predicate... ps)` Matches if *all of* `ps` match the element (Logical conjunction). If `ps` is empty, always matches. #### `anyOf(Predicate... ps)` Matches if *any of* `ps` match the element (logical disjunction). If `ps` is empty, never matches. #### `eval(...)` Evaluate the given C expression, which must return a boolean-testable value. The code can refer to the element under consideration via `bsonVisitIter`. The code can test other predicates by using `bsonPredicate(P)`, which evaluates to a boolean value. # Error Handling The DSL uses two global (thread-local) names to perform error handling: `bsonBuildError` and `bsonParseError`. Upon entry, BSON-constructing commands will set `bsonBuildError` to `NULL`. BSON-reading commands will set `bsonParseError` to `NULL`. If `bsonBuildError` becomes non-`NULL` during DSL evaluation, the enclosing `bsonBuild-` command will stop evaluating and immediately return to the caller. `bsonParse` and `bsonVisitEach` behave similarly with respect to the `bsonParseError` name. After a DSL command returns, `bsonParseError`/`bsonBuildError` should be checked for `NULL`. If non-`NULL`, the relevant command encountered an error while executing. This can happen if the BSON iteration encountered corruption, if any build operation failed, if an `error()` or `errorf()` DSL command was executed, or if any inner C code assigned a non-`NULL` value to the respective error string: ```c // These functions add items to bsonBuildContext.doc: void add_stuff(); void add_data(); void add_more(); ``` ```c bsonBuildAppend(mydoc, do(add_stuff()), do({ if (!some_computation()) { bsonBuildError = "some_computation() failed!"; } }), kv("subarray", bsonArray(some_array)), do(add_data()), do(add_more())); if (bsonBuildError) { fprintf(stderr, "Error building BSON: %s\n", bsonBuildError); } ``` In the above, any of the `do` blocks can indicate an error by assigning `bsonBuildError` to a non-`NULL` string. The `bsonArray` *ValueOperation* may also generate an error while appending the `subarray` element (e.g. if `some_array` is corrupt). As soon as one subcommand indicates an error, the `bsonBuildAppend()` will not evaluate any further subcommands. The `bsonBuildError` value will be retained after it returns, for inspection by the caller. The `error()` (or `errorf()`) visit/parse command can be used to do terse document validation: ```c++ struct user_info { char* name; int age; }; user_info get_user(const bson_t* data) { user_info ret = {0}; bsonParse(*data, // Get the name find(key("name"), if(not(type(utf8)), then(error("'name' must be a string"))), if(strEqual(""), then(error("'name' must not be empty"))), storeStrDup(ret.name)), else(error("The 'name' property is missing")), // Get the age find(key("age"), case(when(not(isNumeric), error("'age' must be a number")), when(eval(bsonAs(int32) < 0), error("'age' cannot be negative")), else(do(ret.age = bsonAs(int32))))), else(error("The 'age' property is missing"))); if (bsonParseError) { bson_free(ret.name); fprintf(stderr, "Error while reading user_info from bson: %s\n", bsonParseError); return {0}; } return ret; } ``` # Other Important Details ## Deferred Evaluation In a regular C program a function call `foo(x, y, z)` will evaluate `x`, `y`, and `z` *before* calling `foo`. In the DSL, this is not the case: Subcommands that accept C code and expressions will evaluate the C code only if/when the subcommand is executed. This allows one to rely on previous-executed DSL subcommands in subsequent commands. e.g. one can store a variable extracted from a document, and then later perform additional conditional parsing based on the value that was extracted: ```c int32_t expect = 0; bsonParse( some_data, require(key("expect"), do(v = bsonAs(int32))), // At this point "expect" has been extracted from 'some_data' require(key("value"), case(when(bsonAs(int32) < expect), error("'value' is less than 'expect'"), when(bsonAs(int32) > expect), error("'value' is greater than 'expect'")))); ``` ## Building while Parsing The `append()` visit operation allows one to update one BSON document while parsing another: ```c const bson_t* input = ...; bson_t* output = ...; bsonParse( input, // Find a "src' subdocument require(keyWithType("src", doc), // Append what we found to the "got" key in 'output': // (bsonVisitIter still points to "src" in 'input') append(*output, kv("got", iterValue(bsonVisitIter)))), // Add "readonly", but only if we find it. find(key("readonly"), // bsonPredicate() will evaluate a predicate on bsonVisitIter // (which here points to the "readonly" property in "input") append(*output, kv("readonly", boolean(bsonPredicate(truthy)))))); ``` # Understanding Compiler Errors If you misspell the name of any DSL subcommand, or use one in an incorrect location, you will receive a string of errors from your compiler. (If you are using GCC, this will include a length expansion backtrace for `_bsonDSL_eval` and `_bsonDSL_mapMacro`, which you can mostly scroll over and ignore). However, all errors should be ignored *except* for the first one, which will often indicate the invocation of an unknown/implicitly-declared function. The name of the "missing function" will be the concatenation of a DSL-specific command namespace and the erroneous command name that was given. For example: ```c bsonBuildAppend( cmd, kv("count", utf8_w_len(collection->collection, collection->collectionlen)), kv("query", if(query, then (bson (*query)), else(doc()))), if(limit, then(kv("limit", o64(limit)))), // <-- misspelled "int64" if(skip, then(kv("skip", int64(skip))))); ``` results in the following error from GCC: ``` error: implicit declaration of function ‘_bsonValueOperation_o64’; did you mean ‘_bsonValueOperation_int64’? [-Werror=implicit-function-declaration] ``` This error message includes a helpful hint as to the spelling error and likely correction. # Debugging Unfortunately, debugging through macro definitions is still a tricky subject. `common-bson-dsl-private.h` includes a function `_bson_dsl_debug()`, which is invoked for every DSL subcommand, including a string expressing the arguments to the command. If debug is "enabled" for the DSL, `_bson_dsl_debug` will write the debug output to `stderr`. If it is "disabled", `_bson_dsl_debug` is a no-op. A breakpoint can be set within `_bson_dsl_debug` to "step through" each DSL operation. Each DSL command looks for a name `BSON_DSL_DEBUG`. If this value is truthy, debug output is enabled. The default of `BSON_DSL_DEBUG` is a global constant set to zero. A local `BSON_DSL_DEBUG` variable can be declared within the scope of a DSL command to toggle debugging for that scope only. # How? The DSL makes extreme usage of the C preprocessor to expand to fairly simple C code inline. ## The "MAP" Macro Suppose we have a macro "MAP", with the following psuedo-code: ```c #define MAP(F, Args... args) \ #foreach arg in args \ F(arg) \ #endforeach ``` That is, MAP accepts a name `F` and zero or more arguments as `args`. For each argument `a` in `args`, expand one `F(x)`. The actual definition of `MAP` is non-trivial. The definition provded in `common-bson-dsl-private.h` can be found near the bottom of the file, and goes by the name `_bsonDSL_mapMacro`. It is not necessary to understand how `MAP` works to understand the DSL. ## Token Pasting The token-paste operator `##` is a preprocessor operator that concatenates two identifiers for form a single new identifier. If the right-hand operand of `##` contains additional non-identifier characters, this does not matter. It only matters that the character touching the `##` operator is a valid alphanumeric. For example, pasting `foo` and `bar(baz)`, results in `foobar(baz)`. ## Pasting with "MAP" Suppose the following macro is defined: ```c #define execEach(...) \ MAP(_doExecEach, __VA_ARGS__) #define _doExecEach(Item) \ _doExecOperation_ ## Item ``` and then we use it: ```c execEach(foo(1), bar(2), baz(3)) ``` For the first expansion: ```c _doExecEach(foo(1)) _doExecEach(bar(2)) _doExecEach(baz(3)) ``` Then: ```c _doExecOperation_foo(1) _doExecOperation_bar(2) _doExecOperation_baz(3) ``` The resulting names may be regular functions, or may be additional macros that will be further expanded. This is the basis of this BSON DSL. ## One More Thing: `EVAL` There's one more thing to note. Imagine this: ```c #define AGAIN(X) X AGAIN(X) ``` A naive intuition is that `AGAIN(f)` will expand to an unending sequence of `f f f f f f f f f ...` since `AGAIN` "calls itself." However, the C preprocessor is written such that this will not occur. During the expansion of any macro `M`, any appearance of `M` within the result will be ignored. What we need is a way to force the preprocessor to "do it again." Besides simply appearing in the source text or during a re-scan, there is another context in which preprocessor macros will be expanded: When preparing the arguments to other function-like macros. This is where `EVAL` comes in: ```c #define EVAL(X) _doEval2(_doEval2(X)) #define _doEval2(X) _doEval4(_doEval4(X)) #define _doEval4(X) _doEval8(_doEval8(X)) #define _doEval8(X) _doEval16(_doEval16(X)) #define _doEval16(X) X ``` In this example, `EVAL(X)` will macro-expand `X` sixteen times: Twice more for each layer. This can be extended to arbitrary depth and recurring expansions. For `EVAL(AGAIN(f))`, we will end up with a string of `f f f f f f f f ...` followed by a single `AGAIN(f)`. There are additional tricks required to make `EVAL`, `MAP`, and token pasting play nice, but those details are not necessary here. mongo-c-driver-2.2.1/src/common/src/common-atomic-private.h000066400000000000000000001077141511661753600236220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_ATOMIC_PRIVATE_H #define MONGO_C_DRIVER_COMMON_ATOMIC_PRIVATE_H #include // BSON_INLINE #ifdef _MSC_VER #include #endif enum mcommon_memory_order { mcommon_memory_order_seq_cst, mcommon_memory_order_acquire, mcommon_memory_order_release, mcommon_memory_order_relaxed, mcommon_memory_order_acq_rel, mcommon_memory_order_consume, }; #if defined(_M_ARM) /* MSVC memorder atomics are only avail on ARM */ #define MSVC_MEMORDER_SUFFIX(X) X #else #define MSVC_MEMORDER_SUFFIX(X) #endif #if defined(USE_LEGACY_GCC_ATOMICS) || (!defined(__clang__) && __GNUC__ == 4) || defined(__xlC__) #define MCOMMON_USE_LEGACY_GCC_ATOMICS #else #undef MCOMMON_USE_LEGACY_GCC_ATOMICS #endif /* Not all GCC-like compilers support the current __atomic built-ins. Older * GCC (pre-5) used different built-ins named with the __sync prefix. When * compiling with such older GCC versions, it is necessary to use the applicable * functions, which requires redefining BSON_IF_GNU_LIKE and defining the * additional MCOMMON_IF_GNU_LEGACY_ATOMICS macro here. */ #ifdef MCOMMON_USE_LEGACY_GCC_ATOMICS #undef BSON_IF_GNU_LIKE #define BSON_IF_GNU_LIKE(...) #define MCOMMON_IF_GNU_LEGACY_ATOMICS(...) __VA_ARGS__ #else #define MCOMMON_IF_GNU_LEGACY_ATOMICS(...) #endif /* CDRIVER-4229 zSeries with gcc 4.8.4 produces illegal instructions for int and * int32 atomic intrinsics. */ #if defined(__s390__) || defined(__s390x__) || defined(__zarch__) #define MCOMMON_EMULATE_INT32 #define MCOMMON_EMULATE_INT #endif /* CDRIVER-4264 Contrary to documentation, VS 2013 targeting x86 does not * correctly/consistently provide _InterlockedPointerExchange. */ #if defined(_MSC_VER) && _MSC_VER < 1900 && defined(_M_IX86) #define MCOMMON_EMULATE_PTR #endif #define DEF_ATOMIC_OP(MSVC_Intrinsic, GNU_Intrinsic, GNU_Legacy_Intrinsic, Order, ...) \ do { \ switch (Order) { \ case mcommon_memory_order_acq_rel: \ BSON_IF_MSVC(return MSVC_Intrinsic(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_ACQ_REL);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ case mcommon_memory_order_seq_cst: \ BSON_IF_MSVC(return MSVC_Intrinsic(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_SEQ_CST);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ case mcommon_memory_order_acquire: \ BSON_IF_MSVC(return BSON_CONCAT(MSVC_Intrinsic, MSVC_MEMORDER_SUFFIX(_acq))(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_ACQUIRE);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ case mcommon_memory_order_consume: \ BSON_IF_MSVC(return BSON_CONCAT(MSVC_Intrinsic, MSVC_MEMORDER_SUFFIX(_acq))(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_CONSUME);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ case mcommon_memory_order_release: \ BSON_IF_MSVC(return BSON_CONCAT(MSVC_Intrinsic, MSVC_MEMORDER_SUFFIX(_rel))(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_RELEASE);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ case mcommon_memory_order_relaxed: \ BSON_IF_MSVC(return BSON_CONCAT(MSVC_Intrinsic, MSVC_MEMORDER_SUFFIX(_nf))(__VA_ARGS__);) \ BSON_IF_GNU_LIKE(return GNU_Intrinsic(__VA_ARGS__, __ATOMIC_RELAXED);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(return GNU_Legacy_Intrinsic(__VA_ARGS__);) \ default: \ BSON_UNREACHABLE("Invalid mcommon_memory_order value"); \ } \ } while (0) #define DEF_ATOMIC_CMPEXCH_STRONG(VCSuffix1, VCSuffix2, GNU_MemOrder, Ptr, ExpectActualVar, NewValue) \ do { \ BSON_IF_MSVC(ExpectActualVar = BSON_CONCAT3(_InterlockedCompareExchange, VCSuffix1, VCSuffix2)( \ Ptr, NewValue, ExpectActualVar);) \ BSON_IF_GNU_LIKE((void)__atomic_compare_exchange_n(Ptr, \ &ExpectActualVar, \ NewValue, \ false, /* Not weak */ \ GNU_MemOrder, \ GNU_MemOrder);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(__typeof__(ExpectActualVar) _val; \ _val = __sync_val_compare_and_swap(Ptr, ExpectActualVar, NewValue); \ ExpectActualVar = _val;) \ } while (0) #define DEF_ATOMIC_CMPEXCH_WEAK(VCSuffix1, VCSuffix2, GNU_MemOrder, Ptr, ExpectActualVar, NewValue) \ do { \ BSON_IF_MSVC(ExpectActualVar = BSON_CONCAT3(_InterlockedCompareExchange, VCSuffix1, VCSuffix2)( \ Ptr, NewValue, ExpectActualVar);) \ BSON_IF_GNU_LIKE((void)__atomic_compare_exchange_n(Ptr, \ &ExpectActualVar, \ NewValue, \ true, /* Yes weak */ \ GNU_MemOrder, \ GNU_MemOrder);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(__typeof__(ExpectActualVar) _val; \ _val = __sync_val_compare_and_swap(Ptr, ExpectActualVar, NewValue); \ ExpectActualVar = _val;) \ } while (0) #define DECL_ATOMIC_INTEGRAL(NamePart, Type, VCIntrinSuffix) \ static BSON_INLINE Type mcommon_atomic_##NamePart##_fetch_add( \ Type volatile *a, Type addend, enum mcommon_memory_order ord) \ { \ DEF_ATOMIC_OP(BSON_CONCAT(_InterlockedExchangeAdd, VCIntrinSuffix), \ __atomic_fetch_add, \ __sync_fetch_and_add, \ ord, \ a, \ addend); \ } \ \ static BSON_INLINE Type mcommon_atomic_##NamePart##_fetch_sub( \ Type volatile *a, Type subtrahend, enum mcommon_memory_order ord) \ { \ /* MSVC doesn't have a subtract intrinsic, so just reuse addition */ \ BSON_IF_MSVC(return mcommon_atomic_##NamePart##_fetch_add(a, -subtrahend, ord);) \ BSON_IF_GNU_LIKE(DEF_ATOMIC_OP(~, __atomic_fetch_sub, ~, ord, a, subtrahend);) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(DEF_ATOMIC_OP(~, ~, __sync_fetch_and_sub, ord, a, subtrahend);) \ } \ \ static BSON_INLINE Type mcommon_atomic_##NamePart##_fetch(Type volatile const *a, enum mcommon_memory_order order) \ { \ /* MSVC doesn't have a load intrinsic, so just add zero */ \ BSON_IF_MSVC(return mcommon_atomic_##NamePart##_fetch_add((Type volatile *)a, 0, order);) \ /* GNU doesn't want RELEASE order for the fetch operation, so we can't \ * just use DEF_ATOMIC_OP. */ \ BSON_IF_GNU_LIKE(switch (order) { \ case mcommon_memory_order_release: /* Fall back to seqcst */ \ case mcommon_memory_order_acq_rel: /* Fall back to seqcst */ \ case mcommon_memory_order_seq_cst: \ return __atomic_load_n(a, __ATOMIC_SEQ_CST); \ case mcommon_memory_order_acquire: \ return __atomic_load_n(a, __ATOMIC_ACQUIRE); \ case mcommon_memory_order_consume: \ return __atomic_load_n(a, __ATOMIC_CONSUME); \ case mcommon_memory_order_relaxed: \ return __atomic_load_n(a, __ATOMIC_RELAXED); \ default: \ BSON_UNREACHABLE("Invalid mcommon_memory_order value"); \ }) \ MCOMMON_IF_GNU_LEGACY_ATOMICS({ \ BSON_UNUSED(order); \ __sync_synchronize(); \ return *a; \ }) \ } \ \ static BSON_INLINE Type mcommon_atomic_##NamePart##_exchange( \ Type volatile *a, Type value, enum mcommon_memory_order ord) \ { \ BSON_IF_MSVC(DEF_ATOMIC_OP(BSON_CONCAT(_InterlockedExchange, VCIntrinSuffix), ~, ~, ord, a, value);) \ /* GNU doesn't want CONSUME order for the exchange operation, so we \ * cannot use DEF_ATOMIC_OP. */ \ BSON_IF_GNU_LIKE(switch (ord) { \ case mcommon_memory_order_acq_rel: \ return __atomic_exchange_n(a, value, __ATOMIC_ACQ_REL); \ case mcommon_memory_order_release: \ return __atomic_exchange_n(a, value, __ATOMIC_RELEASE); \ case mcommon_memory_order_seq_cst: \ return __atomic_exchange_n(a, value, __ATOMIC_SEQ_CST); \ case mcommon_memory_order_consume: /* Fall back to acquire */ \ case mcommon_memory_order_acquire: \ return __atomic_exchange_n(a, value, __ATOMIC_ACQUIRE); \ case mcommon_memory_order_relaxed: \ return __atomic_exchange_n(a, value, __ATOMIC_RELAXED); \ default: \ BSON_UNREACHABLE("Invalid mcommon_memory_order value"); \ }) \ MCOMMON_IF_GNU_LEGACY_ATOMICS(BSON_UNUSED(ord); return __sync_val_compare_and_swap(a, *a, value);) \ } \ \ static BSON_INLINE Type mcommon_atomic_##NamePart##_compare_exchange_strong( \ Type volatile *a, Type expect, Type new_value, enum mcommon_memory_order ord) \ { \ Type actual = expect; \ switch (ord) { \ case mcommon_memory_order_release: \ case mcommon_memory_order_acq_rel: \ case mcommon_memory_order_seq_cst: \ DEF_ATOMIC_CMPEXCH_STRONG(VCIntrinSuffix, , __ATOMIC_SEQ_CST, a, actual, new_value); \ break; \ case mcommon_memory_order_acquire: \ DEF_ATOMIC_CMPEXCH_STRONG( \ VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_ACQUIRE, a, actual, new_value); \ break; \ case mcommon_memory_order_consume: \ DEF_ATOMIC_CMPEXCH_STRONG( \ VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_CONSUME, a, actual, new_value); \ break; \ case mcommon_memory_order_relaxed: \ DEF_ATOMIC_CMPEXCH_STRONG(VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_nf), __ATOMIC_RELAXED, a, actual, new_value); \ break; \ default: \ BSON_UNREACHABLE("Invalid mcommon_memory_order value"); \ } \ return actual; \ } \ \ static BSON_INLINE Type mcommon_atomic_##NamePart##_compare_exchange_weak( \ Type volatile *a, Type expect, Type new_value, enum mcommon_memory_order ord) \ { \ Type actual = expect; \ switch (ord) { \ case mcommon_memory_order_release: \ case mcommon_memory_order_acq_rel: \ case mcommon_memory_order_seq_cst: \ DEF_ATOMIC_CMPEXCH_WEAK(VCIntrinSuffix, , __ATOMIC_SEQ_CST, a, actual, new_value); \ break; \ case mcommon_memory_order_acquire: \ DEF_ATOMIC_CMPEXCH_WEAK(VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_ACQUIRE, a, actual, new_value); \ break; \ case mcommon_memory_order_consume: \ DEF_ATOMIC_CMPEXCH_WEAK(VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_CONSUME, a, actual, new_value); \ break; \ case mcommon_memory_order_relaxed: \ DEF_ATOMIC_CMPEXCH_WEAK(VCIntrinSuffix, MSVC_MEMORDER_SUFFIX(_nf), __ATOMIC_RELAXED, a, actual, new_value); \ break; \ default: \ BSON_UNREACHABLE("Invalid mcommon_memory_order value"); \ } \ return actual; \ } #define DECL_ATOMIC_STDINT(Name, VCSuffix) DECL_ATOMIC_INTEGRAL(Name, Name##_t, VCSuffix) #if defined(_MSC_VER) || defined(MCOMMON_USE_LEGACY_GCC_ATOMICS) /* MSVC and GCC require built-in types (not typedefs) for their atomic * intrinsics. */ #if defined(_MSC_VER) #define DECL_ATOMIC_INTEGRAL_INT8 char #define DECL_ATOMIC_INTEGRAL_INT32 long #define DECL_ATOMIC_INTEGRAL_INT long #else #define DECL_ATOMIC_INTEGRAL_INT8 signed char #define DECL_ATOMIC_INTEGRAL_INT32 int #define DECL_ATOMIC_INTEGRAL_INT int #endif DECL_ATOMIC_INTEGRAL(int8, DECL_ATOMIC_INTEGRAL_INT8, 8) DECL_ATOMIC_INTEGRAL(int16, short, 16) #if !defined(MCOMMON_EMULATE_INT32) DECL_ATOMIC_INTEGRAL(int32, DECL_ATOMIC_INTEGRAL_INT32, ) #endif #if !defined(MCOMMON_EMULATE_INT) DECL_ATOMIC_INTEGRAL(int, DECL_ATOMIC_INTEGRAL_INT, ) #endif #else /* Other compilers that we support provide generic intrinsics */ DECL_ATOMIC_STDINT(int8, 8) DECL_ATOMIC_STDINT(int16, 16) #if !defined(MCOMMON_EMULATE_INT32) DECL_ATOMIC_STDINT(int32, ) #endif #if !defined(MCOMMON_EMULATE_INT) DECL_ATOMIC_INTEGRAL(int, int, ) #endif #endif #ifndef DECL_ATOMIC_INTEGRAL_INT32 #define DECL_ATOMIC_INTEGRAL_INT32 int32_t #endif #define _mcommon_emul_atomic_int64_fetch_add COMMON_NAME(emul_atomic_int64_fetch_add) #define _mcommon_emul_atomic_int64_exchange COMMON_NAME(emul_atomic_int64_exchange) #define _mcommon_emul_atomic_int64_compare_exchange_strong COMMON_NAME(emul_atomic_int64_compare_exchange_strong) #define _mcommon_emul_atomic_int64_compare_exchange_weak COMMON_NAME(emul_atomic_int64_compare_exchange_weak) #define _mcommon_emul_atomic_int32_fetch_add COMMON_NAME(emul_atomic_int32_fetch_add) #define _mcommon_emul_atomic_int32_exchange COMMON_NAME(emul_atomic_int32_exchange) #define _mcommon_emul_atomic_int32_compare_exchange_strong COMMON_NAME(emul_atomic_int32_compare_exchange_strong) #define _mcommon_emul_atomic_int32_compare_exchange_weak COMMON_NAME(emul_atomic_int32_compare_exchange_weak) #define _mcommon_emul_atomic_int_fetch_add COMMON_NAME(emul_atomic_int_fetch_add) #define _mcommon_emul_atomic_int_exchange COMMON_NAME(emul_atomic_int_exchange) #define _mcommon_emul_atomic_int_compare_exchange_strong COMMON_NAME(emul_atomic_int_compare_exchange_strong) #define _mcommon_emul_atomic_int_compare_exchange_weak COMMON_NAME(emul_atomic_int_compare_exchange_weak) #define _mcommon_emul_atomic_ptr_exchange COMMON_NAME(emul_atomic_ptr_exchange) #define mcommon_thrd_yield COMMON_NAME(thrd_yield) int64_t _mcommon_emul_atomic_int64_fetch_add(int64_t volatile *val, int64_t v, enum mcommon_memory_order); int64_t _mcommon_emul_atomic_int64_exchange(int64_t volatile *val, int64_t v, enum mcommon_memory_order); int64_t _mcommon_emul_atomic_int64_compare_exchange_strong(int64_t volatile *val, int64_t expect_value, int64_t new_value, enum mcommon_memory_order); int64_t _mcommon_emul_atomic_int64_compare_exchange_weak(int64_t volatile *val, int64_t expect_value, int64_t new_value, enum mcommon_memory_order); int32_t _mcommon_emul_atomic_int32_fetch_add(int32_t volatile *val, int32_t v, enum mcommon_memory_order); int32_t _mcommon_emul_atomic_int32_exchange(int32_t volatile *val, int32_t v, enum mcommon_memory_order); int32_t _mcommon_emul_atomic_int32_compare_exchange_strong(int32_t volatile *val, int32_t expect_value, int32_t new_value, enum mcommon_memory_order); int32_t _mcommon_emul_atomic_int32_compare_exchange_weak(int32_t volatile *val, int32_t expect_value, int32_t new_value, enum mcommon_memory_order); int _mcommon_emul_atomic_int_fetch_add(int volatile *val, int v, enum mcommon_memory_order); int _mcommon_emul_atomic_int_exchange(int volatile *val, int v, enum mcommon_memory_order); int _mcommon_emul_atomic_int_compare_exchange_strong(int volatile *val, int expect_value, int new_value, enum mcommon_memory_order); int _mcommon_emul_atomic_int_compare_exchange_weak(int volatile *val, int expect_value, int new_value, enum mcommon_memory_order); void * _mcommon_emul_atomic_ptr_exchange(void *volatile *val, void *v, enum mcommon_memory_order); void mcommon_thrd_yield(void); #if (defined(_MSC_VER) && !defined(_M_IX86)) || (defined(__LP64__) && __LP64__) /* (64-bit intrinsics are only available in x64) */ #ifdef _MSC_VER DECL_ATOMIC_INTEGRAL(int64, __int64, 64) #else DECL_ATOMIC_STDINT(int64, 64) #endif #else static BSON_INLINE int64_t mcommon_atomic_int64_fetch(const int64_t volatile *val, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_fetch_add((int64_t volatile *)val, 0, order); } static BSON_INLINE int64_t mcommon_atomic_int64_fetch_add(int64_t volatile *val, int64_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_fetch_add(val, v, order); } static BSON_INLINE int64_t mcommon_atomic_int64_fetch_sub(int64_t volatile *val, int64_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_fetch_add(val, -v, order); } static BSON_INLINE int64_t mcommon_atomic_int64_exchange(int64_t volatile *val, int64_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_exchange(val, v, order); } static BSON_INLINE int64_t mcommon_atomic_int64_compare_exchange_strong(int64_t volatile *val, int64_t expect_value, int64_t new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_compare_exchange_strong(val, expect_value, new_value, order); } static BSON_INLINE int64_t mcommon_atomic_int64_compare_exchange_weak(int64_t volatile *val, int64_t expect_value, int64_t new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int64_compare_exchange_weak(val, expect_value, new_value, order); } #endif #if defined(MCOMMON_EMULATE_INT32) static BSON_INLINE int32_t mcommon_atomic_int32_fetch(const int32_t volatile *val, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_fetch_add((int32_t volatile *)val, 0, order); } static BSON_INLINE int32_t mcommon_atomic_int32_fetch_add(int32_t volatile *val, int32_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_fetch_add(val, v, order); } static BSON_INLINE int32_t mcommon_atomic_int32_fetch_sub(int32_t volatile *val, int32_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_fetch_add(val, -v, order); } static BSON_INLINE int32_t mcommon_atomic_int32_exchange(int32_t volatile *val, int32_t v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_exchange(val, v, order); } static BSON_INLINE int32_t mcommon_atomic_int32_compare_exchange_strong(int32_t volatile *val, int32_t expect_value, int32_t new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_compare_exchange_strong(val, expect_value, new_value, order); } static BSON_INLINE int32_t mcommon_atomic_int32_compare_exchange_weak(int32_t volatile *val, int32_t expect_value, int32_t new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int32_compare_exchange_weak(val, expect_value, new_value, order); } #endif /* MCOMMON_EMULATE_INT32 */ #if defined(MCOMMON_EMULATE_INT) static BSON_INLINE int mcommon_atomic_int_fetch(const int volatile *val, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_fetch_add((int volatile *)val, 0, order); } static BSON_INLINE int mcommon_atomic_int_fetch_add(int volatile *val, int v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_fetch_add(val, v, order); } static BSON_INLINE int mcommon_atomic_int_fetch_sub(int volatile *val, int v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_fetch_add(val, -v, order); } static BSON_INLINE int mcommon_atomic_int_exchange(int volatile *val, int v, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_exchange(val, v, order); } static BSON_INLINE int mcommon_atomic_int_compare_exchange_strong(int volatile *val, int expect_value, int new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_compare_exchange_strong(val, expect_value, new_value, order); } static BSON_INLINE int mcommon_atomic_int_compare_exchange_weak(int volatile *val, int expect_value, int new_value, enum mcommon_memory_order order) { return _mcommon_emul_atomic_int_compare_exchange_weak(val, expect_value, new_value, order); } #endif /* MCOMMON_EMULATE_INT */ static BSON_INLINE void * mcommon_atomic_ptr_exchange(void *volatile *ptr, void *new_value, enum mcommon_memory_order ord) { #if defined(MCOMMON_EMULATE_PTR) return _mcommon_emul_atomic_ptr_exchange(ptr, new_value, ord); #elif defined(MCOMMON_USE_LEGACY_GCC_ATOMICS) /* The older __sync_val_compare_and_swap also takes oldval */ DEF_ATOMIC_OP(_InterlockedExchangePointer, , __sync_val_compare_and_swap, ord, ptr, *ptr, new_value); #else DEF_ATOMIC_OP(_InterlockedExchangePointer, __atomic_exchange_n, , ord, ptr, new_value); #endif } static BSON_INLINE void * mcommon_atomic_ptr_compare_exchange_strong(void *volatile *ptr, void *expect, void *new_value, enum mcommon_memory_order ord) { switch (ord) { case mcommon_memory_order_release: case mcommon_memory_order_acq_rel: case mcommon_memory_order_seq_cst: DEF_ATOMIC_CMPEXCH_STRONG(Pointer, , __ATOMIC_SEQ_CST, ptr, expect, new_value); return expect; case mcommon_memory_order_relaxed: DEF_ATOMIC_CMPEXCH_STRONG(Pointer, MSVC_MEMORDER_SUFFIX(_nf), __ATOMIC_RELAXED, ptr, expect, new_value); return expect; case mcommon_memory_order_consume: DEF_ATOMIC_CMPEXCH_STRONG(Pointer, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_CONSUME, ptr, expect, new_value); return expect; case mcommon_memory_order_acquire: DEF_ATOMIC_CMPEXCH_STRONG(Pointer, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_ACQUIRE, ptr, expect, new_value); return expect; default: BSON_UNREACHABLE("Invalid mcommon_memory_order value"); } } static BSON_INLINE void * mcommon_atomic_ptr_compare_exchange_weak(void *volatile *ptr, void *expect, void *new_value, enum mcommon_memory_order ord) { switch (ord) { case mcommon_memory_order_release: case mcommon_memory_order_acq_rel: case mcommon_memory_order_seq_cst: DEF_ATOMIC_CMPEXCH_WEAK(Pointer, , __ATOMIC_SEQ_CST, ptr, expect, new_value); return expect; case mcommon_memory_order_relaxed: DEF_ATOMIC_CMPEXCH_WEAK(Pointer, MSVC_MEMORDER_SUFFIX(_nf), __ATOMIC_RELAXED, ptr, expect, new_value); return expect; case mcommon_memory_order_consume: DEF_ATOMIC_CMPEXCH_WEAK(Pointer, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_CONSUME, ptr, expect, new_value); return expect; case mcommon_memory_order_acquire: DEF_ATOMIC_CMPEXCH_WEAK(Pointer, MSVC_MEMORDER_SUFFIX(_acq), __ATOMIC_ACQUIRE, ptr, expect, new_value); return expect; default: BSON_UNREACHABLE("Invalid mcommon_memory_order value"); } } static BSON_INLINE void * mcommon_atomic_ptr_fetch(void *volatile const *ptr, enum mcommon_memory_order ord) { return mcommon_atomic_ptr_compare_exchange_strong((void *volatile *)ptr, NULL, NULL, ord); } #undef DECL_ATOMIC_STDINT #undef DECL_ATOMIC_INTEGRAL #undef DEF_ATOMIC_OP #undef DEF_ATOMIC_CMPEXCH_STRONG #undef DEF_ATOMIC_CMPEXCH_WEAK #undef MSVC_MEMORDER_SUFFIX /** * @brief Generate a full-fence memory barrier at the call site. */ static BSON_INLINE void mcommon_atomic_thread_fence(void) { BSON_IF_MSVC(MemoryBarrier();) BSON_IF_GNU_LIKE(__sync_synchronize();) MCOMMON_IF_GNU_LEGACY_ATOMICS(__sync_synchronize();) } #ifdef MCOMMON_USE_LEGACY_GCC_ATOMICS #undef BSON_IF_GNU_LIKE #define BSON_IF_GNU_LIKE(...) __VA_ARGS__ #endif #undef MCOMMON_IF_GNU_LEGACY_ATOMICS #undef MCOMMON_USE_LEGACY_GCC_ATOMICS #undef MCOMMON_EMULATE_PTR #undef MCOMMON_EMULATE_INT32 #undef MCOMMON_EMULATE_INT #endif /* MONGO_C_DRIVER_COMMON_ATOMIC_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-atomic.c000066400000000000000000000144201511661753600221340ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef BSON_OS_UNIX /* For sched_yield() */ #include #endif void mcommon_thrd_yield(void) { BSON_IF_WINDOWS(SwitchToThread();) BSON_IF_POSIX(sched_yield();) } /** * Some platforms do not support compiler intrinsics for atomic operations. * We emulate that here using a spin lock and regular arithmetic operations */ static int8_t gEmulAtomicLock = 0; static void _lock_emul_atomic(void) { int i; if (mcommon_atomic_int8_compare_exchange_weak(&gEmulAtomicLock, 0, 1, mcommon_memory_order_acquire) == 0) { /* Successfully took the spinlock */ return; } /* Failed. Try taking ten more times, then begin sleeping. */ for (i = 0; i < 10; ++i) { if (mcommon_atomic_int8_compare_exchange_weak(&gEmulAtomicLock, 0, 1, mcommon_memory_order_acquire) == 0) { /* Succeeded in taking the lock */ return; } } /* Still don't have the lock. Spin and yield */ while (mcommon_atomic_int8_compare_exchange_weak(&gEmulAtomicLock, 0, 1, mcommon_memory_order_acquire) != 0) { mcommon_thrd_yield(); } } static void _unlock_emul_atomic(void) { int64_t rv = mcommon_atomic_int8_exchange(&gEmulAtomicLock, 0, mcommon_memory_order_release); BSON_ASSERT(rv == 1 && "Released atomic lock while not holding it"); } int64_t _mcommon_emul_atomic_int64_fetch_add(volatile int64_t *p, int64_t n, enum mcommon_memory_order _unused) { int64_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p += n; _unlock_emul_atomic(); return ret; } int64_t _mcommon_emul_atomic_int64_exchange(volatile int64_t *p, int64_t n, enum mcommon_memory_order _unused) { int64_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p = n; _unlock_emul_atomic(); return ret; } int64_t _mcommon_emul_atomic_int64_compare_exchange_strong(volatile int64_t *p, int64_t expect_value, int64_t new_value, enum mcommon_memory_order _unused) { int64_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic(); return ret; } int64_t _mcommon_emul_atomic_int64_compare_exchange_weak(volatile int64_t *p, int64_t expect_value, int64_t new_value, enum mcommon_memory_order order) { /* We're emulating. We can't do a weak version. */ return _mcommon_emul_atomic_int64_compare_exchange_strong(p, expect_value, new_value, order); } int32_t _mcommon_emul_atomic_int32_fetch_add(volatile int32_t *p, int32_t n, enum mcommon_memory_order _unused) { int32_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p += n; _unlock_emul_atomic(); return ret; } int32_t _mcommon_emul_atomic_int32_exchange(volatile int32_t *p, int32_t n, enum mcommon_memory_order _unused) { int32_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p = n; _unlock_emul_atomic(); return ret; } int32_t _mcommon_emul_atomic_int32_compare_exchange_strong(volatile int32_t *p, int32_t expect_value, int32_t new_value, enum mcommon_memory_order _unused) { int32_t ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic(); return ret; } int32_t _mcommon_emul_atomic_int32_compare_exchange_weak(volatile int32_t *p, int32_t expect_value, int32_t new_value, enum mcommon_memory_order order) { /* We're emulating. We can't do a weak version. */ return _mcommon_emul_atomic_int32_compare_exchange_strong(p, expect_value, new_value, order); } int _mcommon_emul_atomic_int_fetch_add(volatile int *p, int n, enum mcommon_memory_order _unused) { int ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p += n; _unlock_emul_atomic(); return ret; } int _mcommon_emul_atomic_int_exchange(volatile int *p, int n, enum mcommon_memory_order _unused) { int ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p = n; _unlock_emul_atomic(); return ret; } int _mcommon_emul_atomic_int_compare_exchange_strong(volatile int *p, int expect_value, int new_value, enum mcommon_memory_order _unused) { int ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; if (ret == expect_value) { *p = new_value; } _unlock_emul_atomic(); return ret; } int _mcommon_emul_atomic_int_compare_exchange_weak(volatile int *p, int expect_value, int new_value, enum mcommon_memory_order order) { /* We're emulating. We can't do a weak version. */ return _mcommon_emul_atomic_int_compare_exchange_strong(p, expect_value, new_value, order); } void * _mcommon_emul_atomic_ptr_exchange(void *volatile *p, void *n, enum mcommon_memory_order _unused) { void *ret; BSON_UNUSED(_unused); _lock_emul_atomic(); ret = *p; *p = n; _unlock_emul_atomic(); return ret; } mongo-c-driver-2.2.1/src/common/src/common-b64-private.h000066400000000000000000000044061511661753600227330ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_B64_PRIVATE_H #define MONGO_C_DRIVER_COMMON_B64_PRIVATE_H #include #define mcommon_b64_ntop_calculate_target_size COMMON_NAME(b64_ntop_calculate_target_size) #define mcommon_b64_pton_calculate_target_size COMMON_NAME(b64_pton_calculate_target_size) #define mcommon_b64_ntop COMMON_NAME(b64_ntop) #define mcommon_b64_pton COMMON_NAME(b64_pton) /** * When encoding from "network" (raw data) to "presentation" (base64 encoded). * Includes the trailing null byte. */ size_t mcommon_b64_ntop_calculate_target_size(size_t raw_size); /* When encoding from "presentation" (base64 encoded) to "network" (raw data). * This may be an overestimate if the base64 data includes spaces. For a more * accurate size, call b64_pton (src, NULL, 0), which will read the src * data and return an exact size. */ size_t mcommon_b64_pton_calculate_target_size(size_t base64_encoded_size); /* Returns the number of bytes written (excluding NULL byte) to target on * success or -1 on error. Adds a trailing NULL byte. * Encodes from "network" (raw data) to "presentation" (base64 encoded), * hence the obscure name "ntop". */ int mcommon_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize); /** If target is not NULL, the number of bytes written to target on success or * -1 on error. If target is NULL, returns the exact number of bytes that would * be written to target on decoding. Encodes from "presentation" (base64 * encoded) to "network" (raw data), hence the obscure name "pton". */ int mcommon_b64_pton(char const *src, uint8_t *target, size_t targsize); #endif /* MONGO_C_DRIVER_COMMON_B64_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-b64.c000066400000000000000000000443131511661753600212570ustar00rootroot00000000000000/* * Copyright (c) 1996, 1998 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software. No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #include #include #include #include #include #define Assert(Cond) \ if (!(Cond)) \ abort() static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) * The following encoding technique is taken from RFC 1521 by Borenstein * and Freed. It is reproduced here in a slightly edited form for * convenience. * * A 65-character subset of US-ASCII is used, enabling 6 bits to be * represented per printable character. (The extra 65th character, "=", * is used to signify a special processing function.) * * The encoding process represents 24-bit groups of input bits as output * strings of 4 encoded characters. Proceeding from left to right, a * 24-bit input group is formed by concatenating 3 8-bit input groups. * These 24 bits are then treated as 4 concatenated 6-bit groups, each * of which is translated into a single digit in the base64 alphabet. * * Each 6-bit group is used as an index into an array of 64 printable * characters. The character referenced by the index is placed in the * output string. * * Table 1: The Base64 Alphabet * * Value Encoding Value Encoding Value Encoding Value Encoding * 0 A 17 R 34 i 51 z * 1 B 18 S 35 j 52 0 * 2 C 19 T 36 k 53 1 * 3 D 20 U 37 l 54 2 * 4 E 21 V 38 m 55 3 * 5 F 22 W 39 n 56 4 * 6 G 23 X 40 o 57 5 * 7 H 24 Y 41 p 58 6 * 8 I 25 Z 42 q 59 7 * 9 J 26 a 43 r 60 8 * 10 K 27 b 44 s 61 9 * 11 L 28 c 45 t 62 + * 12 M 29 d 46 u 63 / * 13 N 30 e 47 v * 14 O 31 f 48 w (pad) = * 15 P 32 g 49 x * 16 Q 33 h 50 y * * Special processing is performed if fewer than 24 bits are available * at the end of the data being encoded. A full encoding quantum is * always completed at the end of a quantity. When fewer than 24 input * bits are available in an input group, zero bits are added (on the * right) to form an integral number of 6-bit groups. Padding at the * end of the data is performed using the '=' character. * * Since all base64 input is an integral number of octets, only the * following cases can arise: * * (1) the final quantum of encoding input is an integral * multiple of 24 bits; here, the final unit of encoded * output will be an integral multiple of 4 characters * with no "=" padding, * (2) the final quantum of encoding input is exactly 8 bits; * here, the final unit of encoded output will be two * characters followed by two "=" padding characters, or * (3) the final quantum of encoding input is exactly 16 bits; * here, the final unit of encoded output will be three * characters followed by one "=" padding character. */ int mcommon_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) { size_t datalength = 0; uint8_t input[3]; uint8_t output[4]; if (!target) { return -1; } // While we have at least three chars to read: while (srclength > 2) { input[0] = *src++; input[1] = *src++; input[2] = *src++; srclength -= 3; output[0] = input[0] >> 2; output[1] = (uint8_t)(((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t)(((input[1] & 0x0f) << 2) + (input[2] >> 6)); output[3] = input[2] & 0x3f; Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); Assert(output[3] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; target[datalength++] = Base64[output[2]]; target[datalength++] = Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; memcpy(input, src, srclength); output[0] = input[0] >> 2; output[1] = (uint8_t)(((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t)(((input[1] & 0x0f) << 2) + (input[2] >> 6)); Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; if (srclength == 1) { target[datalength++] = Pad64; } else { target[datalength++] = Base64[output[2]]; } target[datalength++] = Pad64; } if (datalength >= targsize) { return -1; } target[datalength] = '\0'; /* Returned value doesn't count \0. */ return (int)datalength; } /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) The following encoding technique is taken from RFC 1521 by Borenstein and Freed. It is reproduced here in a slightly edited form for convenience. A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.) The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8-bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a quantity. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the '=' character. Since all base64 input is an integral number of octets, only the following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character. */ /* skips all whitespace anywhere. converts characters, four at a time, starting at (or after) src from base - 64 numbers into three 8 bit bytes in the target area. it returns the number of data bytes stored at the target, or -1 on error. */ static uint8_t mongoc_b64rmap[256]; static const uint8_t mongoc_b64rmap_special = 0xf0; static const uint8_t mongoc_b64rmap_end = 0xfd; static const uint8_t mongoc_b64rmap_space = 0xfe; static const uint8_t mongoc_b64rmap_invalid = 0xff; /* initializing the reverse map isn't thread safe, do it in pthread_once */ static BSON_ONCE_FUN(bson_b64_initialize_rmap) { /* Null: end of string, stop parsing */ mongoc_b64rmap[0] = mongoc_b64rmap_end; mlib_foreach_urange (i, 1, 256) { const uint8_t ch = (uint8_t)i; /* Whitespaces */ if (bson_isspace(ch)) mongoc_b64rmap[ch] = mongoc_b64rmap_space; /* Padding: stop parsing */ else if (ch == Pad64) mongoc_b64rmap[ch] = mongoc_b64rmap_end; /* Non-base64 char */ else mongoc_b64rmap[ch] = mongoc_b64rmap_invalid; } /* Fill reverse mapping for base64 chars */ for (uint8_t i = 0; Base64[i] != '\0'; ++i) mongoc_b64rmap[(uint8_t)Base64[i]] = i; BSON_ONCE_RETURN; } static int mongoc_b64_pton_do(char const *src, uint8_t *target, size_t targsize) { int tarindex, state; uint8_t ch, ofs; state = 0; tarindex = 0; while (1) { ch = (uint8_t)*src++; ofs = mongoc_b64rmap[ch]; if (ofs >= mongoc_b64rmap_special) { /* Ignore whitespaces */ if (ofs == mongoc_b64rmap_space) continue; /* End of base64 characters */ if (ofs == mongoc_b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: if ((size_t)tarindex >= targsize) return (-1); target[tarindex] = ofs << 2; state = 1; break; case 1: if ((size_t)tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 4; target[tarindex + 1] = (ofs & 0x0f) << 4; tarindex++; state = 2; break; case 2: if ((size_t)tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 2; target[tarindex + 1] = (ofs & 0x03) << 6; tarindex++; state = 3; break; case 3: if ((size_t)tarindex >= targsize) return (-1); target[tarindex] |= ofs; tarindex++; state = 0; break; default: abort(); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = (uint8_t)*src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void)NULL; ch != '\0'; ch = (uint8_t)*src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = (uint8_t)*src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void)NULL; ch != '\0'; ch = (uint8_t)*src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) return (-1); /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (target[tarindex] != 0) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } static int mongoc_b64_pton_len(char const *src) { uint8_t ch = 0; uint8_t ofs = 0; int state = 0; int tarindex = 0; while (1) { ch = (uint8_t)*src++; ofs = mongoc_b64rmap[ch]; if (ofs >= mongoc_b64rmap_special) { /* Ignore whitespaces */ if (ofs == mongoc_b64rmap_space) continue; /* End of base64 characters */ if (ofs == mongoc_b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: state = 1; break; case 1: tarindex++; state = 2; break; case 2: tarindex++; state = 3; break; case 3: tarindex++; state = 0; break; default: abort(); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = (uint8_t)*src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void)NULL; ch != '\0'; ch = (uint8_t)*src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = (uint8_t)*src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for (; ch != '\0'; ch = (uint8_t)*src++) if (mongoc_b64rmap[ch] != mongoc_b64rmap_space) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } int mcommon_b64_pton(char const *src, uint8_t *target, size_t targsize) { static bson_once_t once = BSON_ONCE_INIT; bson_once(&once, bson_b64_initialize_rmap); if (!src) { return -1; } if (target) return mongoc_b64_pton_do(src, target, targsize); else return mongoc_b64_pton_len(src); } size_t mcommon_b64_ntop_calculate_target_size(size_t raw_size) { size_t num_bits = raw_size * 8; /* Calculate how many groups of six bits this contains, adding 5 to round up * to the nearest group of 6. */ size_t num_b64_chars = (num_bits + 5) / 6; /* Round to nearest set of four. */ size_t num_b64_chars_with_padding = 4 * ((num_b64_chars + 3) / 4); /* Add one for NULL byte. */ return num_b64_chars_with_padding + 1; } size_t mcommon_b64_pton_calculate_target_size(size_t base64_encoded_size) { /* Without inspecting the data, we don't know how many padding characters * there are. Assuming none, that means each character represents 6 bits of * data. */ size_t num_bits = base64_encoded_size * 6; /* Round down to the nearest group of eight. */ return num_bits / 8; } mongo-c-driver-2.2.1/src/common/src/common-bits-private.h000066400000000000000000000023301511661753600232730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_BITS_PRIVATE_H #define MONGO_C_DRIVER_COMMON_BITS_PRIVATE_H #include // Round up to the next power of two uint32_t value. Saturates on overflow. static BSON_INLINE uint32_t mcommon_next_power_of_two_u32(uint32_t v) { if (v == 0) { return 1; } // https://graphics.stanford.edu/%7Eseander/bithacks.html#RoundUpPowerOf2 v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; if (v == 0) { return UINT32_MAX; } else { return v; } } #endif /* MONGO_C_DRIVER_COMMON_BITS_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-bson-dsl-private.h000066400000000000000000002002161511661753600240560ustar00rootroot00000000000000#include #ifndef MONGO_C_DRIVER_COMMON_BSON_DSL_PRIVATE_H #define MONGO_C_DRIVER_COMMON_BSON_DSL_PRIVATE_H /** * @file common-bson-dsl-private.h * @brief Define a C-preprocessor DSL for working with BSON objects * * This file defines an embedded DSL for working with BSON objects consisely and * correctly. * * For more information about using this DSL, refer to `bson-dsl.md`. */ #include #include enum { /// Toggle this value to enable/disable debug output for all bsonDSL /// operations (printed to stderr). You can also set a constant /// BSON_DSL_DEBUG within the scope of a DSL command to selectively debug /// only the commands within that scope. BSON_DSL_DEBUG = 0 }; #define _bson_thread_local BSON_IF_GNU_LIKE(__thread) BSON_IF_MSVC(__declspec(thread)) #define _bson_comdat \ BSON_IF_WINDOWS(__declspec(selectany)) \ BSON_IF_POSIX(__attribute__((weak))) #ifdef __GNUC__ // GCC has a bug handling pragma statements that disable warnings within complex // nested macro expansions. If we're GCC, just disable -Wshadow outright: BSON_IF_GNU_LIKE(_Pragma("GCC diagnostic ignored \"-Wshadow\"")) #endif #define _bsonDSL_disableWarnings() \ if (1) { \ mlib_diagnostic_push(); \ mlib_gnu_warning_disable("-Wshadow"); \ mlib_msvc_warning(disable : 4456); \ } else \ ((void)0) #define _bsonDSL_restoreWarnings() \ if (1) { \ mlib_diagnostic_pop(); \ } else \ ((void)0) /** * @brief Parse the given BSON document. * * @param doc A bson_t object to walk. (Not a pointer) */ #define bsonParse(Document, ...) \ _bsonDSL_begin("bsonParse(%s)", _bsonDSL_str(Document)); \ _bsonDSL_disableWarnings(); \ bsonParseError = NULL; \ bool _bvHalt = false; \ const bool _bvContinue = false; \ const bool _bvBreak = false; \ (void)_bvHalt; \ (void)_bvContinue; \ (void)_bvBreak; \ _bsonDSL_eval(_bsonParse((Document), __VA_ARGS__)); \ _bsonDSL_restoreWarnings(); \ _bsonDSL_end /** * @brief Visit each element of a BSON document */ #define bsonVisitEach(Document, ...) \ _bsonDSL_begin("bsonVisitEach(%s)", _bsonDSL_str(Document)); \ _bsonDSL_disableWarnings(); \ bool _bvHalt = false; \ (void)_bvHalt; \ _bsonDSL_eval(_bsonVisitEach((Document), __VA_ARGS__)); \ _bsonDSL_restoreWarnings(); \ _bsonDSL_end #define bsonBuildContext (*_bsonBuildContextThreadLocalPtr) #define bsonVisitContext (*_bsonVisitContextThreadLocalPtr) #define bsonVisitIter (bsonVisitContext.iter) /// Begin any function-like macro by opening a new scope and writing a debug /// message. #define _bsonDSL_begin(Str, ...) \ if (true) { \ _bsonDSLDebug(Str, __VA_ARGS__); \ ++_bson_dsl_indent /// End a function-like macro scope. #define _bsonDSL_end \ --_bson_dsl_indent; \ } \ else((void)0) /** * @brief Expands to a call to bson_append_{Kind}, with the three first * arguments filled in by the DSL context variables. */ #define _bsonBuildAppendArgs bsonBuildContext.doc, bsonBuildContext.key, bsonBuildContext.key_len /** * The _bsonDocOperation_XYZ macros handle the top-level bsonBuild() * items, and any nested doc() items, with XYZ being the doc-building * subcommand. */ #define _bsonDocOperation(Command, _ignore, _count) \ if (!bsonBuildError) { \ _bsonDocOperation_##Command; \ if (bsonBuildError) { \ _bsonDSLDebug("Stopping doc() due to bsonBuildError: [%s]", bsonBuildError); \ } \ } #define _bsonValueOperation(P) _bsonValueOperation_##P /// key-value pair with explicit key length #define _bsonDocOperation_kvl(String, Len, Element) \ _bsonDSL_begin("\"%s\" => [%s]", String, _bsonDSL_strElide(30, Element)); \ const char *_bbString = (String); \ const uint64_t length = (Len); \ if (mlib_in_range(int, length)) { \ _bbCtx.key = _bbString; \ _bbCtx.key_len = (int)length; \ _bsonValueOperation(Element); \ } else { \ bsonBuildError = "Out-of-range key string length value"; \ } \ _bsonDSL_end /// Key-value pair with a C-string #define _bsonDocOperation_kv(String, Element) _bsonDocOperation_kvl((String), strlen((String)), Element) /// Execute arbitrary code #define _bsonDocOperation_do(...) \ _bsonDSL_begin("do(%s)", _bsonDSL_strElide(30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ if (bsonBuildError) { \ _bsonDSLDebug("do() set bsonBuildError: [%s]", bsonBuildError); \ } \ _bsonDSL_end /// We must defer expansion of the nested doc() to allow "recursive" evaluation #define _bsonValueOperation_doc _bsonValueOperationDeferred_doc _bsonDSL_nothing() #define _bsonArrayOperation_doc(...) _bsonArrayAppendValue(doc(__VA_ARGS__)) #define _bsonValueOperationDeferred_doc(...) \ _bsonDSL_begin("doc(%s)", _bsonDSL_strElide(30, __VA_ARGS__)); \ /* Write to this variable as the child: */ \ bson_t _bbChildDoc = BSON_INITIALIZER; \ if (!bson_append_document_begin(_bsonBuildAppendArgs, &_bbChildDoc)) { \ bsonBuildError = "Error while initializing child document: " _bsonDSL_str(__VA_ARGS__); \ } else { \ _bsonBuildAppend(_bbChildDoc, __VA_ARGS__); \ if (!bsonBuildError) { \ if (!bson_append_document_end(bsonBuildContext.doc, &_bbChildDoc)) { \ bsonBuildError = "Error while finalizing document: " _bsonDSL_str(__VA_ARGS__); \ } \ } \ } \ _bsonDSL_end /// We must defer expansion of the nested array() to allow "recursive" /// evaluation #define _bsonValueOperation_array _bsonValueOperationDeferred_array _bsonDSL_nothing() #define _bsonArrayOperation_array(...) _bsonArrayAppendValue(array(__VA_ARGS__)) #define _bsonValueOperationDeferred_array(...) \ _bsonDSL_begin("array(%s)", _bsonDSL_strElide(30, __VA_ARGS__)); \ /* Write to this variable as the child array: */ \ bson_t _bbArray = BSON_INITIALIZER; \ if (!bson_append_array_begin(_bsonBuildAppendArgs, &_bbArray)) { \ bsonBuildError = "Error while initializing child array: " _bsonDSL_str(__VA_ARGS__); \ } else { \ _bsonBuildArray(_bbArray, __VA_ARGS__); \ if (!bsonBuildError) { \ if (!bson_append_array_end(bsonBuildContext.doc, &_bbArray)) { \ bsonBuildError = "Error while finalizing child array: " _bsonDSL_str(__VA_ARGS__); \ } \ } else { \ _bsonDSLDebug("Got bsonBuildError: [%s]", bsonBuildError); \ } \ } \ _bsonDSL_end /// Append a UTF-8 string with an explicit length #define _bsonValueOperation_utf8_w_len(String, Len) \ if (!bson_append_utf8(_bsonBuildAppendArgs, (String), (int)(Len))) { \ bsonBuildError = "Error while appending utf8 string: " _bsonDSL_str(String); \ } else \ ((void)0) #define _bsonArrayOperation_utf8_w_len(X) _bsonArrayAppendValue(utf8_w_len(X)) /// Append a "cstr" as UTF-8 #define _bsonValueOperation_cstr(String) _bsonValueOperation_utf8_w_len((String), strlen(String)) #define _bsonArrayOperation_cstr(X) _bsonArrayAppendValue(cstr(X)) /// Append an int32 #define _bsonValueOperation_int32(Integer) \ if (!bson_append_int32(_bsonBuildAppendArgs, (Integer))) { \ bsonBuildError = "Error while appending int32(" _bsonDSL_str(Integer) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_int32(X) _bsonArrayAppendValue(int32(X)) /// Append an int64 #define _bsonValueOperation_int64(Integer) \ if (!bson_append_int64(_bsonBuildAppendArgs, (Integer))) { \ bsonBuildError = "Error while appending int64(" _bsonDSL_str(Integer) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_int64(X) _bsonArrayAppendValue(int64(X)) /// Append the value referenced by a given iterator #define _bsonValueOperation_iterValue(Iter) \ if (!bson_append_iter(_bsonBuildAppendArgs, &(Iter))) { \ bsonBuildError = "Error while appending iterValue(" _bsonDSL_str(Iter) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_iterValue(X) _bsonArrayAppendValue(iterValue(X)) /// Append the BSON document referenced by the given pointer #define _bsonValueOperation_bson(Doc) \ if (!bson_append_document(_bsonBuildAppendArgs, &(Doc))) { \ bsonBuildError = "Error while appending subdocument: bson(" _bsonDSL_str(Doc) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_bson(X) _bsonArrayAppendValue(bson(X)) /// Append the BSON document referenced by the given pointer as an array #define _bsonValueOperation_bsonArray(Arr) \ if (!bson_append_array(_bsonBuildAppendArgs, &(Arr))) { \ bsonBuildError = "Error while appending subdocument array: " \ "bsonArray(" _bsonDSL_str(Arr) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_bsonArray(X) _bsonArrayAppendValue(bsonArray(X)) #define _bsonValueOperation_bool(b) \ if (!bson_append_bool(_bsonBuildAppendArgs, (b))) { \ bsonBuildError = "Error while appending bool(" _bsonDSL_str(b) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_boolean(X) _bsonArrayAppendValue(boolean(X)) #define _bsonValueOperation_boolean(b) _bsonValueOperation_bool(b) #define _bsonValueOperation_oid(o) \ if (!bson_append_oid(_bsonBuildAppendArgs, (o))) { \ bsonBuildError = "Error while appending oid(" _bsonDSL_str(o) ")"; \ } else \ ((void)0) #define _bsonArrayOperation_oid(X) _bsonArrayAppendValue(oid(X)) #define _bsonValueOperation_null \ if (!bson_append_null(_bsonBuildAppendArgs)) { \ bsonBuildError = "Error while appending a null"; \ } else \ ((void)0) #define _bsonArrayOperation_null _bsonValueOperation(null) #define _bsonArrayOperation_value(X) _bsonArrayAppendValue(value(X)) #define _bsonValueOperation_value(Value) \ _bsonDSL_begin("value(%s)", _bsonDSL_str(Value)); \ if (!bson_append_value(_bsonBuildAppendArgs, &(Value))) { \ bsonBuildError = "Error while appending value(" _bsonDSL_str(Value) ")"; \ } \ _bsonDSL_end #define _bsonValueOperation_binary(SubType, Data, Len) \ if (!bson_append_binary(_bsonBuildAppendArgs, (SubType), (Data), (Len))) { \ bsonBuildError = "Error while appending binary(" _bsonDSL_str(Data) ")"; \ } else \ ((void)0) /// Insert the given BSON document into the parent document in-place #define _bsonDocOperation_insert(OtherBSON, Pred) \ _bsonDSL_begin("Insert other document: [%s]", _bsonDSL_str(OtherBSON)); \ const bool _bvHalt = false; /* Required for _bsonVisitEach() */ \ _bsonVisitEach(OtherBSON, if (Pred, then(do(_bsonDocOperation_iterElement(bsonVisitIter))))); \ _bsonDSL_end #define _bsonDocOperation_insertFromIter(Iter, Pred) \ _bsonDSL_begin("Insert document from iterator: [%s]", _bsonDSL_str(Iter)); \ bson_t _bbDocFromIter = _bson_dsl_iter_as_doc(&(Iter)); \ if (_bbDocFromIter.len == 0) { \ _bsonDSLDebug("NOTE: Skipping insert of non-document value from iterator"); \ } else { \ _bsonDocOperation_insert(_bbDocFromIter, Pred); \ } \ _bsonDSL_end #define _bsonDocOperation_iterElement(Iter) \ _bsonDSL_begin("Insert element from bson_iter_t [%s]", _bsonDSL_str(Iter)); \ bson_iter_t _bbIter = (Iter); \ _bsonDocOperation_kvl(bson_iter_key(&_bbIter), bson_iter_key_len(&_bbIter), iterValue(_bbIter)); \ _bsonDSL_end /// Insert the given BSON document into the parent array. Keys of the given /// document are discarded and it is treated as an array of values. #define _bsonArrayOperation_insert(OtherArr, Pred) \ _bsonDSL_begin("Insert other array: [%s]", _bsonDSL_str(OtherArr)); \ _bsonVisitEach(OtherArr, if (Pred, then(do(_bsonArrayOperation_iterValue(bsonVisitIter))))); \ _bsonDSL_end #define _bsonArrayAppendValue(ValueOperation) \ _bsonDSL_begin("[%d] => [%s]", (int)bsonBuildContext.index, _bsonDSL_strElide(30, ValueOperation)); \ /* Set the doc key to the array index as a string: */ \ _bsonBuild_setKeyToArrayIndex(bsonBuildContext.index); \ /* Append a value: */ \ _bsonValueOperation_##ValueOperation; \ /* Increment the array index: */ \ ++_bbCtx.index; \ _bsonDSL_end #define _bsonDocOperationIfThen_then _bsonBuildAppendWithCurrentContext #define _bsonDocOperationIfElse_else _bsonBuildAppendWithCurrentContext #define _bsonDocOperationIfThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug("Taking TRUE branch: [%s]", _bsonDSL_str(Then)); \ _bsonDocOperationIfThen_##Then; \ } else { \ _bsonDSLDebug("Taking FALSE branch: [%s]", _bsonDSL_str(Else)); \ _bsonDocOperationIfElse_##Else; \ } #define _bsonDocOperationIfThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug("Taking TRUE branch: [%s]", _bsonDSL_str(Then)); \ _bsonDocOperationIfThen_##Then; \ } #define _bsonDocOperation_if(Condition, ...) \ _bsonDSL_begin("Conditional append on [%s]", _bsonDSL_str(Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonDocOperationIfThenElse, _bsonDocOperationIfThen)(Condition, \ __VA_ARGS__); \ _bsonDSL_end #define _bsonArrayOperationIfThen_then _bsonBuildArrayWithCurrentContext #define _bsonArrayOperationIfElse_else _bsonBuildArrayWithCurrentContext #define _bsonArrayOperationIfThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug("Taking TRUE branch: [%s]", _bsonDSL_str(Then)); \ _bsonArrayOperationIfThen_##Then; \ } else { \ _bsonDSLDebug("Taking FALSE branch: [%s]", _bsonDSL_str(Else)); \ _bsonArrayOperationIfElse_##Else; \ } #define _bsonArrayOperationIfThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug("Taking TRUE branch: [%s]", _bsonDSL_str(Then)); \ _bsonArrayOperationIfThen_##Then; \ } #define _bsonArrayOperation_if(Condition, ...) \ _bsonDSL_begin("Conditional value on [%s]", _bsonDSL_str(Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonArrayOperationIfThenElse, _bsonArrayOperationIfThen)( \ Condition, __VA_ARGS__); \ _bsonDSL_end #define _bsonValueOperationIf_then(X) _bsonValueOperation_##X #define _bsonValueOperationIf_else(X) _bsonValueOperation_##X #define _bsonValueOperation_if(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug("Taking TRUE branch: [%s]", _bsonDSL_str(Then)); \ _bsonValueOperationIf_##Then; \ } else { \ _bsonDSLDebug("Taking FALSE branch: [%s]", _bsonDSL_str(Else)); \ _bsonValueOperationIf_##Else; \ } #define _bsonBuild_setKeyToArrayIndex(Idx) \ _bbCtx.key_len = bson_snprintf(_bbCtx.index_key_str, sizeof _bbCtx.index_key_str, "%d", (int)_bbCtx.index); \ _bbCtx.key = _bbCtx.index_key_str /// Handle an element of array() #define _bsonArrayOperation(Element, _nil, _count) \ if (!bsonBuildError) { \ _bsonArrayOperation_##Element; \ } #define _bsonBuildAppendWithCurrentContext(...) _bsonDSL_mapMacro(_bsonDocOperation, ~, __VA_ARGS__) #define _bsonBuildArrayWithCurrentContext(...) _bsonDSL_mapMacro(_bsonArrayOperation, ~, __VA_ARGS__) #define _bsonDSL_Type_double BSON_TYPE_DOUBLE #define _bsonDSL_Type_utf8 BSON_TYPE_UTF8 #define _bsonDSL_Type_doc BSON_TYPE_DOCUMENT #define _bsonDSL_Type_array BSON_TYPE_ARRAY #define _bsonDSL_Type_binary BSON_TYPE_BINARY #define _bsonDSL_Type_undefined BSON_TYPE_UNDEFINED #define _bsonDSL_Type_oid BSON_TYPE_OID // Use `boolean`, not `bool`. `bool` may be defined as a macro to `_Bool` or `int`: #define _bsonDSL_Type_boolean BSON_TYPE_BOOL #define _bsonDSL_Type_date_time BSON_TYPE_DATE_TIME #define _bsonDSL_Type_null BSON_TYPE_NULL #define _bsonDSL_Type_regex BSON_TYPE_REGEX #define _bsonDSL_Type_dbpointer BSON_TYPE_DBPOINTER #define _bsonDSL_Type_code BSON_TYPE_CODE #define _bsonDSL_Type_codewscope BSON_TYPE_CODEWSCOPE #define _bsonDSL_Type_int32 BSON_TYPE_INT32 #define _bsonDSL_Type_timestamp BSON_TYPE_TIMESTAMP #define _bsonDSL_Type_int64 BSON_TYPE_INT64 #define _bsonDSL_Type_decimal128 BSON_TYPE_DECIMAL128 #define _bsonDSL_Type_string __NOTE__No_type_named__string__did_you_mean__utf8 #define _bsonVisitOperation_halt _bvHalt = true #define _bsonVisitOperation_if(Predicate, ...) \ _bsonDSL_begin("if(%s)", _bsonDSL_str(Predicate)); \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonVisit_ifThenElse, _bsonVisit_ifThen)(Predicate, __VA_ARGS__); \ _bsonDSL_end #define _bsonVisit_ifThenElse(Predicate, Then, Else) \ if (bsonPredicate(Predicate)) { \ _bsonDSLDebug("then:"); \ _bsonVisit_ifThen_##Then; \ } else { \ _bsonDSLDebug("else:"); \ _bsonVisit_ifElse_##Else; \ } #define _bsonVisit_ifThen(Predicate, Then) \ if (bsonPredicate(Predicate)) { \ _bsonDSLDebug("then:"); \ _bsonVisit_ifThen_##Then; \ } else { \ _bsonDSLDebug("[else nothing]"); \ } #define _bsonVisit_ifThen_then _bsonVisit_applyOps #define _bsonVisit_ifElse_else _bsonVisit_applyOps #define _bsonVisitOperation_storeBool(Dest) \ _bsonDSL_begin("storeBool(%s)", _bsonDSL_str(Dest)); \ (Dest) = bson_iter_as_bool(&bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_storeStrRef(Dest) \ _bsonDSL_begin("storeStrRef(%s)", _bsonDSL_str(Dest)); \ (Dest) = bson_iter_utf8(&bsonVisitIter, NULL); \ _bsonDSL_end #define _bsonVisitOperation_storeStrDup(Dest) \ _bsonDSL_begin("storeStrDup(%s)", _bsonDSL_str(Dest)); \ (Dest) = bson_iter_dup_utf8(&bsonVisitIter, NULL); \ _bsonDSL_end #define _bsonVisitOperation_storeDocDup(Dest) \ _bsonDSL_begin("storeDocDup(%s)", _bsonDSL_str(Dest)); \ bson_t _bvDoc = BSON_INITIALIZER; \ _bson_dsl_iter_as_doc(&_bvDoc, &bsonVisitIter); \ if (_bvDoc.len) { \ bson_copy_to(&_bvDoc, &(Dest)); \ } \ _bsonDSL_end #define _bsonVisitOperation_storeDocRef(Dest) \ _bsonDSL_begin("storeDocRef(%s)", _bsonDSL_str(Dest)); \ _bson_dsl_iter_as_doc(&(Dest), &bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_storeDocDupPtr(Dest) \ _bsonDSL_begin("storeDocDupPtr(%s)", _bsonDSL_str(Dest)); \ bson_t _bvDoc = BSON_INITIALIZER; \ _bson_dsl_iter_as_doc(&_bvDoc, &bsonVisitIter); \ if (_bvDoc.len) { \ (Dest) = bson_copy(&_bvDoc); \ } \ _bsonDSL_end #define _bsonVisitOperation_storeInt32(Dest) \ _bsonDSL_begin("storeInt32(%s)", _bsonDSL_str(Dest)); \ (Dest) = bson_iter_int32(&bsonVisitIter); \ _bsonDSL_end #define _bsonVisitOperation_do(...) \ _bsonDSL_begin("do: %s", _bsonDSL_strElide(30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_appendTo(BSON) \ _bsonDSL_begin("appendTo(%s)", _bsonDSL_str(BSON)); \ if (!bson_append_iter( \ &(BSON), bson_iter_key(&bsonVisitIter), (int)bson_iter_key_len(&bsonVisitIter), &bsonVisitIter)) { \ bsonParseError = "Error in appendTo(" _bsonDSL_str(BSON) ")"; \ } \ _bsonDSL_end #define _bsonVisitCase_when(Pred, ...) \ _bsonDSL_begin("when: [%s]", _bsonDSL_str(Pred)); \ _bvCaseMatched = _bsonPredicate(Pred); \ if (_bvCaseMatched) { \ _bsonVisit_applyOps(__VA_ARGS__); \ } \ _bsonDSL_end #define _bsonVisitCase_else(...) \ _bsonDSL_begin("else:%s", ""); \ _bvCaseMatched = true; \ _bsonVisit_applyOps(__VA_ARGS__); \ _bsonDSL_end #define _bsonVisitCase(Pair, _nil, _count) \ if (!_bvCaseMatched) { \ _bsonVisitCase_##Pair; \ } else \ ((void)0); #define _bsonVisitOperation_case(...) \ _bsonDSL_begin("case:%s", ""); \ bool _bvCaseMatched = false; \ (void)_bvCaseMatched; \ _bsonDSL_mapMacro(_bsonVisitCase, ~, __VA_ARGS__); \ _bsonDSL_end #define _bsonVisitOperation_append _bsonVisitOneApplyDeferred_append _bsonDSL_nothing() #define _bsonVisitOneApplyDeferred_append(Doc, ...) \ _bsonDSL_begin("append to [%s] : %s", _bsonDSL_str(Doc), _bsonDSL_strElide(30, __VA_ARGS__)); \ _bsonBuildAppend(Doc, __VA_ARGS__); \ if (bsonBuildError) { \ bsonParseError = bsonBuildError; \ } \ _bsonDSL_end #define _bsonVisitEach(Doc, ...) \ _bsonDSL_begin("visitEach(%s)", _bsonDSL_str(Doc)); \ do { \ /* Reset the context */ \ struct _bsonVisitContext_t _bvCtx = { \ .doc = &(Doc), \ .parent = _bsonVisitContextThreadLocalPtr, \ .index = 0, \ }; \ _bsonVisitContextThreadLocalPtr = &_bvCtx; \ bsonParseError = NULL; \ /* Iterate over each element of the document */ \ if (!bson_iter_init(&_bvCtx.iter, &(Doc))) { \ bsonParseError = "Invalid BSON data [a]"; \ } \ bool _bvBreak = false; \ bool _bvContinue = false; \ (void)_bvBreak; \ (void)_bvContinue; \ while (bson_iter_next(&_bvCtx.iter) && !_bvHalt && !bsonParseError && !_bvBreak) { \ _bvContinue = false; \ _bsonVisit_applyOps(__VA_ARGS__); \ ++_bvCtx.index; \ } \ if (bsonVisitIter.err_off) { \ bsonParseError = "Invalid BSON data [b]"; \ } \ /* Restore the dsl context */ \ _bsonVisitContextThreadLocalPtr = _bvCtx.parent; \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_visitEach _bsonVisitOperation_visitEachDeferred _bsonDSL_nothing() #define _bsonVisitOperation_visitEachDeferred(...) \ _bsonDSL_begin("visitEach:%s", ""); \ do { \ const uint8_t *data; \ uint32_t len; \ bson_type_t typ = bson_iter_type_unsafe(&bsonVisitIter); \ if (typ == BSON_TYPE_ARRAY) \ bson_iter_array(&bsonVisitIter, &len, &data); \ else if (typ == BSON_TYPE_DOCUMENT) \ bson_iter_document(&bsonVisitIter, &len, &data); \ else { \ _bsonDSLDebug("(Skipping visitEach() of non-array/document value)"); \ break; \ } \ bson_t inner; \ BSON_ASSERT(bson_init_static(&inner, data, len)); \ _bsonVisitEach(inner, __VA_ARGS__); \ } while (0); \ _bsonDSL_end #define _bsonVisitOperation_nop _bsonDSLDebug("[nop]") #define _bsonVisitOperation_parse(...) \ do { \ const uint8_t *data; \ uint32_t len; \ bson_type_t typ = bson_iter_type(&bsonVisitIter); \ if (typ == BSON_TYPE_ARRAY) \ bson_iter_array(&bsonVisitIter, &len, &data); \ else if (typ == BSON_TYPE_DOCUMENT) \ bson_iter_document(&bsonVisitIter, &len, &data); \ else { \ _bsonDSLDebug("Ignoring parse() for non-document/array value"); \ break; \ } \ bson_t inner; \ BSON_ASSERT(bson_init_static(&inner, data, len)); \ _bsonParse(inner, __VA_ARGS__); \ } while (0); #define _bsonVisitOperation_continue _bvContinue = true #define _bsonVisitOperation_break _bvBreak = _bvContinue = true #define _bsonVisitOperation_require(Predicate) \ _bsonDSL_begin("require(%s)", _bsonDSL_str(Predicate)); \ if (!bsonPredicate(Predicate)) { \ bsonParseError = "Element requirement failed: " _bsonDSL_str(Predicate); \ } \ _bsonDSL_end #define _bsonVisitOperation_error(S) bsonParseError = (S) #define _bsonVisitOperation_errorf(S, ...) (bsonParseError = _bson_dsl_errorf(&(S), __VA_ARGS__)) #define _bsonVisitOperation_dupPath(S) \ _bsonDSL_begin("dupPath(%s)", _bsonDSL_str(S)); \ _bson_dsl_dupPath(&(S)); \ _bsonDSL_end #define _bsonVisit_applyOp(P, _const, _count) \ do { \ if (!_bvContinue && !_bvHalt && !bsonParseError) { \ _bsonVisitOperation_##P; \ } \ } while (0); #define _bsonParse(Doc, ...) \ do { \ /* Keep track of which elements have been visited based on their index*/ \ uint64_t _bpVisitBits_static[4] = {0}; \ const bson_t *_bpDoc = &(Doc); \ uint64_t *_bpVisitBits = _bpVisitBits_static; \ size_t _bpNumVisitBitInts = sizeof _bpVisitBits_static / sizeof(uint64_t); \ bool _bpFoundElement = false; \ (void)_bpDoc; \ (void)_bpVisitBits; \ (void)_bpNumVisitBitInts; \ (void)_bpFoundElement; \ _bsonParse_applyOps(__VA_ARGS__); \ /* We may have allocated for visit bits */ \ if (_bpVisitBits != _bpVisitBits_static) { \ bson_free(_bpVisitBits); \ } \ } while (0) #define _bsonParse_applyOps(...) _bsonDSL_mapMacro(_bsonParse_applyOp, ~, __VA_ARGS__) /// Parse one entry referrenced by the context iterator #define _bsonParse_applyOp(P, _nil, Counter) \ do { \ if (!_bvHalt && !bsonParseError) { \ _bsonParseOperation_##P; \ } \ } while (0); #define _bsonParseMarkVisited(Index) \ if (1) { \ const size_t nth_int = Index / 64u; \ const size_t nth_bit = Index % 64u; \ while (nth_int >= _bpNumVisitBitInts) { \ /* Say that five times, fast: */ \ size_t new_num_visit_bit_ints = _bpNumVisitBitInts * 2u; \ uint64_t *new_visit_bit_ints = BSON_ARRAY_ALLOC0(new_num_visit_bit_ints, uint64_t); \ memcpy(new_visit_bit_ints, _bpVisitBits, sizeof(uint64_t) * _bpNumVisitBitInts); \ if (_bpVisitBits != _bpVisitBits_static) { \ bson_free(_bpVisitBits); \ } \ _bpVisitBits = new_visit_bit_ints; \ _bpNumVisitBitInts = new_num_visit_bit_ints; \ } \ \ _bpVisitBits[nth_int] |= (UINT64_C(1) << nth_bit); \ } else \ ((void)0) #define _bsonParseDidVisitNth(Index) _bsonParseDidVisitNth_1(Index / 64u, Index % 64u) #define _bsonParseDidVisitNth_1(NthInt, NthBit) \ (NthInt < _bpNumVisitBitInts && (_bpVisitBits[NthInt] & (UINT64_C(1) << NthBit))) #define _bsonParseOperation_find(Predicate, ...) \ _bsonDSL_begin("find(%s)", _bsonDSL_str(Predicate)); \ _bpFoundElement = false; \ _bsonVisitEach( \ *_bpDoc, \ if (Predicate, \ then(do(_bsonParseMarkVisited(bsonVisitContext.index); _bpFoundElement = true), __VA_ARGS__, break))); \ if (!_bpFoundElement && !bsonParseError) { \ _bsonDSLDebug("[not found]"); \ } \ _bsonDSL_end #define _bsonParseOperation_require(Predicate, ...) \ _bsonDSL_begin("require(%s)", _bsonDSL_str(Predicate)); \ _bpFoundElement = false; \ _bsonVisitEach( \ *_bpDoc, \ if (Predicate, \ then(do(_bsonParseMarkVisited(bsonVisitContext.index); _bpFoundElement = true), __VA_ARGS__, break))); \ if (!_bpFoundElement && !bsonParseError) { \ bsonParseError = "Failed to find a required element: " _bsonDSL_str(Predicate); \ } \ _bsonDSL_end #define _bsonParseOperation_visitOthers(...) \ _bsonDSL_begin("visitOthers(%s)", _bsonDSL_strElide(30, __VA_ARGS__)); \ _bsonVisitEach(*_bpDoc, if (not(eval(_bsonParseDidVisitNth(bsonVisitContext.index))), then(__VA_ARGS__))); \ _bsonDSL_end #define bsonPredicate(P) _bsonPredicate _bsonDSL_nothing()(P) #define _bsonPredicate(P) _bsonPredicate_Condition_##P #define _bsonPredicate_Condition_ __NOTE__Missing_name_for_a_predicate_expression #define _bsonPredicate_Condition_allOf(...) (1 _bsonDSL_mapMacro(_bsonPredicateAnd, ~, __VA_ARGS__)) #define _bsonPredicate_Condition_anyOf(...) (0 _bsonDSL_mapMacro(_bsonPredicateOr, ~, __VA_ARGS__)) #define _bsonPredicate_Condition_not(...) (!(0 _bsonDSL_mapMacro(_bsonPredicateOr, ~, __VA_ARGS__))) #define _bsonPredicateAnd(Pred, _ignore, _ignore1) &&_bsonPredicate _bsonDSL_nothing()(Pred) #define _bsonPredicateOr(Pred, _ignore, _ignore2) || _bsonPredicate _bsonDSL_nothing()(Pred) #define _bsonPredicate_Condition_eval(X) (X) #define _bsonPredicate_Condition_key(...) \ (_bson_dsl_key_is_anyof( \ bson_iter_key(&bsonVisitIter), bson_iter_key_len(&bsonVisitIter), true /* case senstive */, __VA_ARGS__, NULL)) #define _bsonPredicate_Condition_iKey(...) \ (_bson_dsl_key_is_anyof(bson_iter_key(&bsonVisitIter), \ bson_iter_key_len(&bsonVisitIter), \ false /* case insenstive */, \ __VA_ARGS__, \ NULL)) #define _bsonPredicate_Condition_type(Type) (bson_iter_type(&bsonVisitIter) == _bsonDSL_Type_##Type) #define _bsonPredicate_Condition_keyWithType(Key, Type) \ (_bsonPredicate_Condition_allOf _bsonDSL_nothing()(key(Key), type(Type))) #define _bsonPredicate_Condition_iKeyWithType(Key, Type) \ (_bsonPredicate_Condition_allOf _bsonDSL_nothing()(iKey(Key), type(Type))) #define _bsonPredicate_Condition_lastElement (_bson_dsl_iter_is_last_element(&bsonVisitIter)) #define _bsonPredicate_Condition_isNumeric BSON_ITER_HOLDS_NUMBER(&bsonVisitIter) #define _bsonPredicate_Condition_1 1 #define _bsonPredicate_Condition_0 0 #define _bsonPredicate_Condition_always true #define _bsonPredicate_Condition_never false #define _bsonPredicate_Condition_isTrue (bson_iter_as_bool(&bsonVisitIter)) #define _bsonPredicate_Condition_isFalse (!bson_iter_as_bool(&bsonVisitIter)) #define _bsonPredicate_Condition_empty (_bson_dsl_is_empty_bson(&bsonVisitIter)) #define _bsonPredicate_Condition_strEqual(S) (_bson_dsl_test_strequal(S, true)) #define _bsonPredicate_Condition_iStrEqual(S) (_bson_dsl_test_strequal(S, false)) #define _bsonPredicate_Condition_eq(Type, Value) (_bsonPredicate_Condition_type(Type) && bsonAs(Type) == Value) #define _bsonParseOperation_else _bsonParse_deferredElse _bsonDSL_nothing() #define _bsonParse_deferredElse(...) \ if (!_bpFoundElement) { \ _bsonDSL_begin("else:%s", ""); \ _bsonParse_applyOps(__VA_ARGS__); \ _bsonDSL_end; \ } else \ ((void)0) #define _bsonParseOperation_do(...) \ _bsonDSL_begin("do: %s", _bsonDSL_strElide(30, __VA_ARGS__)); \ do { \ __VA_ARGS__; \ } while (0); \ _bsonDSL_end #define _bsonParseOperation_halt _bvHalt = true #define _bsonParseOperation_error(S) bsonParseError = (S) #define _bsonParseOperation_errorf(S, ...) (bsonParseError = _bson_dsl_errorf(&(S), __VA_ARGS__)) /// Perform conditional parsing #define _bsonParseOperation_if(Condition, ...) \ _bsonDSL_begin("if(%s)", _bsonDSL_str(Condition)); \ /* Pick a sub-macro depending on if there are one or two args */ \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonParse_ifThenElse, _bsonParse_ifThen)(Condition, __VA_ARGS__); \ _bsonDSL_end #define _bsonParse_ifThen_then _bsonParse_applyOps #define _bsonParse_ifElse_else _bsonParse_applyOps #define _bsonParse_ifThenElse(Condition, Then, Else) \ if ((Condition)) { \ _bsonDSLDebug("then:"); \ _bsonParse_ifThen_##Then; \ } else { \ _bsonDSLDebug("else:"); \ _bsonParse_ifElse_##Else; \ } #define _bsonParse_ifThen(Condition, Then) \ if ((Condition)) { \ _bsonDSLDebug("%s", _bsonDSL_str(Then)); \ _bsonParse_ifThen_##Then; \ } else { \ _bsonDSLDebug("[else nothing]"); \ } #define _bsonParseOperation_append _bsonParseOperationDeferred_append _bsonDSL_nothing() #define _bsonParseOperationDeferred_append(Doc, ...) \ _bsonDSL_begin("append to [%s] : %s", _bsonDSL_str(Doc), _bsonDSL_strElide(30, __VA_ARGS__)); \ _bsonBuildAppend(Doc, __VA_ARGS__); \ if (bsonBuildError) { \ bsonParseError = bsonBuildError; \ } \ _bsonDSL_end #define _bsonVisit_applyOps _bsonVisit_applyOpsDeferred _bsonDSL_nothing() #define _bsonVisit_applyOpsDeferred(...) \ do { \ _bsonDSL_mapMacro(_bsonVisit_applyOp, ~, __VA_ARGS__); \ } while (0); #define bsonBuildArray(BSON, ...) \ _bsonDSL_begin("bsonBuildArray(%s, %s)", _bsonDSL_str(BSON), _bsonDSL_strElide(30, __VA_ARGS__)); \ _bsonDSL_eval(_bsonBuildArray(BSON, __VA_ARGS__)); \ _bsonDSL_end #define _bsonBuildArray(BSON, ...) \ do { \ _bsonDSL_disableWarnings(); \ struct _bsonBuildContext_t _bbCtx = { \ .doc = &(BSON), \ .parent = _bsonBuildContextThreadLocalPtr, \ .index = 0, \ }; \ _bsonBuildContextThreadLocalPtr = &_bbCtx; \ _bsonBuildArrayWithCurrentContext(__VA_ARGS__); \ _bsonBuildContextThreadLocalPtr = _bbCtx.parent; \ _bsonDSL_restoreWarnings(); \ } while (0) /** * @brief Build a BSON document by appending to an existing bson_t document * * @param Pointer The document upon which to append * @param ... The Document elements to append to the document */ #define bsonBuildAppend(BSON, ...) _bsonDSL_eval(_bsonBuildAppend(BSON, __VA_ARGS__)) #define _bsonBuildAppend(BSON, ...) \ _bsonDSL_begin("Appending to document '%s'", _bsonDSL_str(BSON)); \ _bsonDSL_disableWarnings(); \ /* Save the dsl context */ \ struct _bsonBuildContext_t _bbCtx = { \ .doc = &(BSON), \ .parent = _bsonBuildContextThreadLocalPtr, \ }; \ /* Reset the context */ \ _bsonBuildContextThreadLocalPtr = &_bbCtx; \ bsonBuildError = NULL; \ _bsonBuildAppendWithCurrentContext(__VA_ARGS__); \ /* Restore the dsl context */ \ _bsonBuildContextThreadLocalPtr = _bbCtx.parent; \ _bsonDSL_restoreWarnings(); \ _bsonDSL_end /** * @brief Build a new BSON document and assign the value into the given * pointer. */ #define bsonBuild(BSON, ...) \ _bsonDSL_begin("Build a new document for '%s'", _bsonDSL_str(BSON)); \ bson_t *_bbDest = &(BSON); \ bson_init(_bbDest); \ bsonBuildAppend(*_bbDest, __VA_ARGS__); \ _bsonDSL_end /** * @brief Declare a variable and build it with the BSON DSL @see bsonBuild */ #define bsonBuildDecl(Variable, ...) \ bson_t Variable = BSON_INITIALIZER; \ bsonBuild(Variable, __VA_ARGS__) struct _bsonBuildContext_t { /// The document that is being built bson_t *doc; /// The key that is pending an append const char *key; /// The length of the string given in 'key' int key_len; /// The index of the array being built (if applicable) size_t index; /// A buffer for formatting key strings char index_key_str[16]; /// The parent context (if building a sub-document) struct _bsonBuildContext_t *parent; }; /// A pointer to the current thread's bsonBuild context _bson_thread_local _bson_comdat struct _bsonBuildContext_t *_bsonBuildContextThreadLocalPtr = NULL; struct _bsonVisitContext_t { const bson_t *doc; bson_iter_t iter; const struct _bsonVisitContext_t *parent; size_t index; }; /// A pointer to the current thread's bsonVisit/bsonParse context _bson_thread_local _bson_comdat struct _bsonVisitContext_t const *_bsonVisitContextThreadLocalPtr = NULL; /** * @brief The most recent error from a bsonBuild() DSL command. * * If NULL, no error occurred. Users can assign a value to this string to * indicate failure. */ _bson_thread_local _bson_comdat const char *bsonBuildError = NULL; /** * @brief The most recent error from a buildVisit() or bsonParse() DSL command. * * If NULL, no error occurred. Users can assign a value to this string to * indicate an error. * * If this string becomes non-NULL, the current bsonVisit()/bsonParse() will * halt and return. * * Upon entering a new bsonVisit()/bsonParse(), this will be reset to NULL. */ _bson_thread_local _bson_comdat const char *bsonParseError = NULL; #define _bsonDSLDebug(...) _bson_dsl_debug(BSON_DSL_DEBUG, __FILE__, __LINE__, BSON_FUNC, __VA_ARGS__) static BSON_INLINE bool _bson_dsl_test_strequal(const char *string, bool case_sensitive) { bson_iter_t it = bsonVisitIter; if (bson_iter_type(&it) == BSON_TYPE_UTF8) { uint32_t len; const char *s = bson_iter_utf8(&it, &len); if (len != (uint32_t)strlen(string)) { return false; } if (case_sensitive) { return memcmp(string, s, len) == 0; } else { return bson_strcasecmp(string, s) == 0; } } return false; } static BSON_INLINE bool _bson_dsl_key_is_anyof(const char *key, const size_t keylen, int case_sensitive, ...) { va_list va; va_start(va, case_sensitive); const char *str; while ((str = va_arg(va, const char *))) { size_t str_len = strlen(str); if (str_len != keylen) { continue; } if (case_sensitive) { if (memcmp(str, key, str_len) == 0) { va_end(va); return true; } } else { if (bson_strcasecmp(str, key) == 0) { va_end(va); return true; } } } va_end(va); return false; } static BSON_INLINE void _bson_dsl_iter_as_doc(bson_t *into, const bson_iter_t *it) { uint32_t len = 0; const uint8_t *dataptr = NULL; if (BSON_ITER_HOLDS_ARRAY(it)) { bson_iter_array(it, &len, &dataptr); } else if (BSON_ITER_HOLDS_DOCUMENT(it)) { bson_iter_document(it, &len, &dataptr); } if (dataptr) { BSON_ASSERT(bson_init_static(into, dataptr, len)); } } static BSON_INLINE bool _bson_dsl_is_empty_bson(const bson_iter_t *it) { bson_t d = BSON_INITIALIZER; _bson_dsl_iter_as_doc(&d, it); return d.len == 5; // Empty documents/arrays have byte-size of five } static BSON_INLINE bool _bson_dsl_iter_is_last_element(const bson_iter_t *it) { bson_iter_t dup = *it; return !bson_iter_next(&dup) && dup.err_off == 0; } _bson_thread_local _bson_comdat int _bson_dsl_indent = 0; static BSON_INLINE void BSON_GNUC_PRINTF(5, 6) _bson_dsl_debug(bool do_debug, const char *file, int line, const char *func, const char *string, ...) { if (do_debug) { fprintf(stderr, "%s:%d: [%s] bson_dsl: ", file, line, func); for (int i = 0; i < _bson_dsl_indent; ++i) { fputs(" ", stderr); } va_list va; va_start(va, string); vfprintf(stderr, string, va); va_end(va); fputc('\n', stderr); fflush(stderr); } } static BSON_INLINE char *BSON_GNUC_PRINTF(2, 3) _bson_dsl_errorf(char **const into, const char *const fmt, ...) { if (*into) { bson_free(*into); *into = NULL; } va_list args; va_start(args, fmt); *into = bson_strdupv_printf(fmt, args); va_end(args); return *into; } static BSON_INLINE void _bson_dsl_dupPath(char **into) { if (*into) { bson_free(*into); *into = NULL; } char *acc = bson_strdup(""); for (const struct _bsonVisitContext_t *ctx = &bsonVisitContext; ctx; ctx = ctx->parent) { char *prev = acc; if (ctx->parent && BSON_ITER_HOLDS_ARRAY(&ctx->parent->iter)) { // We're an array element acc = bson_strdup_printf("[%d]%s", (int)ctx->index, prev); } else { // We're a document element acc = bson_strdup_printf(".%s%s", bson_iter_key(&ctx->iter), prev); } bson_free(prev); } *into = bson_strdup_printf("$%s", acc); bson_free(acc); } static BSON_INLINE const char * _bsonVisitIterAs_cstr(void) { return bson_iter_utf8(&bsonVisitIter, NULL); } static BSON_INLINE int32_t _bsonVisitIterAs_int32(void) { return bson_iter_int32(&bsonVisitIter); } static BSON_INLINE bool _bsonVisitIterAs_boolean(void) { return bson_iter_as_bool(&bsonVisitIter); } #define bsonAs(Type) _bsonDSL_paste(_bsonVisitIterAs_, Type)() /// Convert the given argument into a string without inhibitting macro expansion #define _bsonDSL_str(...) _bsonDSL_str_1(__VA_ARGS__) // Empty quotes "" are to ensure a string appears. Old MSVC has a bug // where empty #__VA_ARGS__ just vanishes. #define _bsonDSL_str_1(...) "" #__VA_ARGS__ #define _bsonDSL_strElide(MaxLen, ...) \ (strlen(_bsonDSL_str(__VA_ARGS__)) > (MaxLen) ? "[...]" : _bsonDSL_str(__VA_ARGS__)) /// Paste two tokens: #define _bsonDSL_paste(a, ...) _bsonDSL_paste_impl(a, __VA_ARGS__) #define _bsonDSL_paste_impl(a, ...) a##__VA_ARGS__ /// Paste three tokens: #define _bsonDSL_paste3(a, b, c) _bsonDSL_paste(a, _bsonDSL_paste(b, c)) /// Paste four tokens: #define _bsonDSL_paste4(a, b, c, d) _bsonDSL_paste(a, _bsonDSL_paste3(b, c, d)) // clang-format off /// Now we need a MAP() macro. This idiom is common, but fairly opaque. Below is /// some crazy preprocessor trickery to implement it. Fortunately, once we have /// MAP(), the remainder of this file is straightforward. This implementation /// isn't the simplest one possible, but is one that supports the old /// non-compliant MSVC preprocessor. /* Expands to nothing. Used to defer a function-like macro and to ignore arguments */ #define _bsonDSL_nothing(...) /// Expand to the 64th argument. See below for why this is useful. #define _bsonDSL_pick64th(\ _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \ _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \ _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \ _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \ _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \ _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \ _61, _62, _63, ...) \ _63 /** * @brief Expands to 1 if the given arguments contain any top-level commas, zero otherwise. * * There is an expansion of __VA_ARGS__, followed by 62 '1' arguments, followed * by single '0'. If __VA_ARGS__ contains no commas, pick64th() will return the * single zero. If __VA_ARGS__ contains any top-level commas, the series of ones * will shift to the right and pick64th will return one of those ones. (This only * works __VA_ARGS__ contains fewer than 62 commas, which is a somewhat reasonable * limit.) The _bsonDSL_nothing() is a workaround for MSVC's bad preprocessor that * expands __VA_ARGS__ incorrectly. * * If we have __VA_OPT__, this can be a lot simpler. */ #define _bsonDSL_hasComma(...) \ _bsonDSL_pick64th \ _bsonDSL_nothing() (__VA_ARGS__, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ~) /** * Expands to a single comma if "invoked" as a function-like macro. * (This will make sense, I promise.) */ #define _bsonDSL_commaIfRHSHasParens(...) , /** * @brief Expand to 1 if given no arguments, otherwise 0. * * This could be done much more simply using __VA_OPT__, but we need to work on * older compilers. */ #define _bsonDSL_isEmpty(...) \ _bsonDSL_isEmpty_1(\ /* Expands to '1' if __VA_ARGS__ contains any top-level commas */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ begins with a parenthesis, because \ * that will cause an "invocation" of _bsonDSL_commaIfRHSHasParens, \ * which immediately expands to a single comma. */ \ _bsonDSL_hasComma(_bsonDSL_commaIfRHSHasParens __VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ expands to a function-like macro name \ * that then expands to anything containing a top-level comma */ \ _bsonDSL_hasComma(__VA_ARGS__ ()), \ /* Expands to '1' if __VA_ARGS__ expands to nothing. */ \ _bsonDSL_hasComma(_bsonDSL_commaIfRHSHasParens __VA_ARGS__ ())) /** * A helper for isEmpty(): If given (0, 0, 0, 1), expands as: * - first: _bsonDSL_hasComma(_bsonDSL_isEmpty_CASE_0001) * - then: _bsonDSL_hasComma(,) * - then: 1 * Given any other aruments: * - first: _bsonDSL_hasComma(_bsonDSL_isEmpty_CASE_) * - then: 0 */ #define _bsonDSL_isEmpty_1(_1, _2, _3, _4) \ _bsonDSL_hasComma(_bsonDSL_paste(_bsonDSL_isEmpty_CASE_, _bsonDSL_paste4(_1, _2, _3, _4))) #define _bsonDSL_isEmpty_CASE_0001 , /** * @brief Expand to the first argument if `Cond` is 1, the second argument if `Cond` is 0 */ #define _bsonDSL_ifElse(Cond, IfTrue, IfFalse) \ /* Suppress expansion of the two branches by using the '#' operator */ \ _bsonDSL_nothing(#IfTrue, #IfFalse) \ /* Concat the cond 1/0 with a prefix macro: */ \ _bsonDSL_paste(_bsonDSL_ifElse_PICK_, Cond)(IfTrue, IfFalse) #define _bsonDSL_ifElse_PICK_1(IfTrue, IfFalse) \ /* Expand the first operand, throw away the second */ \ IfTrue _bsonDSL_nothing(#IfFalse) #define _bsonDSL_ifElse_PICK_0(IfTrue, IfFalse) \ /* Expand to the second operand, throw away the first */ \ IfFalse _bsonDSL_nothing(#IfTrue) #ifdef _MSC_VER // MSVC's "traditional" preprocessor requires many more expansion passes, // but GNU and Clang are very slow when evaluating hugely nested expansions // and generate massive macro expansion backtraces. #define _bsonDSL_eval_1(...) __VA_ARGS__ #define _bsonDSL_eval_2(...) _bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(_bsonDSL_eval_1(__VA_ARGS__))))) #define _bsonDSL_eval_4(...) _bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(_bsonDSL_eval_2(__VA_ARGS__))))) #define _bsonDSL_eval_8(...) _bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(_bsonDSL_eval_4(__VA_ARGS__))))) #define _bsonDSL_eval_16(...) _bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(_bsonDSL_eval_8(__VA_ARGS__))))) #define _bsonDSL_eval(...) _bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(_bsonDSL_eval_16(__VA_ARGS__))))) #else // Each level of "eval" applies double the expansions of the previous level. #define _bsonDSL_eval_1(...) __VA_ARGS__ #define _bsonDSL_eval_2(...) _bsonDSL_eval_1(_bsonDSL_eval_1(__VA_ARGS__)) #define _bsonDSL_eval_4(...) _bsonDSL_eval_2(_bsonDSL_eval_2(__VA_ARGS__)) #define _bsonDSL_eval_8(...) _bsonDSL_eval_4(_bsonDSL_eval_4(__VA_ARGS__)) #define _bsonDSL_eval_16(...) _bsonDSL_eval_8(_bsonDSL_eval_8(__VA_ARGS__)) #define _bsonDSL_eval_32(...) _bsonDSL_eval_16(_bsonDSL_eval_16(__VA_ARGS__)) #define _bsonDSL_eval(...) _bsonDSL_eval_32(__VA_ARGS__) #endif /** * Finally, the Map() macro that allows us to do the magic, which we've been * building up to all along. * * The dance with mapMacro_first, mapMacro_final, and _bsonDSL_nothing * conditional on argument count is to prevent warnings from pre-C99 about * passing no arguments to the '...' parameters. Yet again, if we had C99 and * __VA_OPT__ this would be simpler. */ #define _bsonDSL_mapMacro(Action, Constant, ...) \ /* Pick our first action based on the content of '...': */ \ _bsonDSL_ifElse( \ /* If given no arguments: */\ _bsonDSL_isEmpty(__VA_ARGS__), \ /* expand to _bsonDSL_nothing */ \ _bsonDSL_nothing, \ /* Otherwise, expand to mapMacro_first: */ \ _bsonDSL_mapMacro_first) \ /* Now "invoke" the chosen macro: */ \ _bsonDSL_nothing() (Action, Constant, __VA_ARGS__) #define _bsonDSL_mapMacro_first(Action, Constant, ...) \ /* Select our next step based on whether we have one or more arguments: */ \ _bsonDSL_ifElse( \ /* If '...' contains more than one argument (has a top-level comma): */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Begin the mapMacro loop with mapMacro_A: */ \ _bsonDSL_mapMacro_A, \ /* Otherwise skip to the final step of the loop: */ \ _bsonDSL_mapMacro_final) \ /* Invoke the chosen macro, setting the counter to zero: */ \ _bsonDSL_nothing() (Action, Constant, 0, __VA_ARGS__) /// Handle the last expansion in a mapMacro sequence. #define _bsonDSL_mapMacro_final(Action, Constant, Counter, FinalElement) \ Action(FinalElement, Constant, Counter) /** * mapMacro_A and mapMacro_B are identical and just invoke each other. */ #define _bsonDSL_mapMacro_A(Action, Constant, Counter, Head, ...) \ /* First evaluate the action once: */ \ Action(Head, Constant, Counter) \ /* Pick our next step: */ \ _bsonDSL_ifElse( \ /* If '...' contains more than one argument (has a top-level comma): */ \ _bsonDSL_hasComma(__VA_ARGS__), \ /* Jump to the other mapMacro: */ \ _bsonDSL_mapMacro_B, \ /* Otherwise go to mapMacro_final */ \ _bsonDSL_mapMacro_final) \ /* Invoke the next step of the map: */ \ _bsonDSL_nothing() (Action, Constant, Counter + 1, __VA_ARGS__) #define _bsonDSL_mapMacro_B(Action, Constant, Counter, Head, ...) \ Action(Head, Constant, Counter) \ _bsonDSL_ifElse(_bsonDSL_hasComma(__VA_ARGS__), _bsonDSL_mapMacro_A, _bsonDSL_mapMacro_final) \ _bsonDSL_nothing() (Action, Constant, Counter + 1, __VA_ARGS__) // clang-format on #endif // MONGO_C_DRIVER_COMMON_BSON_DSL_PRIVATE_H mongo-c-driver-2.2.1/src/common/src/common-config.h.in000066400000000000000000000003311511661753600225330ustar00rootroot00000000000000#ifndef COMMON_CONFIG_H #define COMMON_CONFIG_H #define MONGOC_ENABLE_DEBUG_ASSERTIONS @MONGOC_ENABLE_DEBUG_ASSERTIONS@ #if MONGOC_ENABLE_DEBUG_ASSERTIONS != 1 # undef MONGOC_ENABLE_DEBUG_ASSERTIONS #endif #endif mongo-c-driver-2.2.1/src/common/src/common-json-private.h000066400000000000000000000432041511661753600233100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_JSON_PRIVATE_H #define MONGO_C_DRIVER_COMMON_JSON_PRIVATE_H #include #define mcommon_iso8601_string_append COMMON_NAME(iso8601_string_append) #define mcommon_json_append_escaped COMMON_NAME(json_append_escaped) #define mcommon_json_append_value_double COMMON_NAME(json_append_value_double) #define mcommon_json_append_value_decimal128 COMMON_NAME(json_append_value_decimal128) #define mcommon_json_append_value_oid COMMON_NAME(json_append_value_oid) #define mcommon_json_append_value_binary COMMON_NAME(json_append_value_binary) #define mcommon_json_append_value_date_time COMMON_NAME(json_append_value_date_time) #define mcommon_json_append_value_timestamp COMMON_NAME(json_append_value_timestamp) #define mcommon_json_append_value_regex COMMON_NAME(json_append_value_regex) #define mcommon_json_append_value_dbpointer COMMON_NAME(json_append_value_dbpointer) #define mcommon_json_append_value_code COMMON_NAME(json_append_value_code) #define mcommon_json_append_value_codewscope COMMON_NAME(json_append_value_codewscope) #define mcommon_json_append_value_symbol COMMON_NAME(json_append_value_symbol) #define mcommon_json_append_bson_values COMMON_NAME(json_append_bson_values) #define mcommon_json_append_bson_document COMMON_NAME(json_append_bson_document) #define mcommon_json_append_bson_array COMMON_NAME(json_append_bson_array) // Needed by libbson and common-json #ifndef BSON_MAX_RECURSION #define BSON_MAX_RECURSION 200 #endif // Needed by libbson and common-json #define BSON_REGEX_OPTIONS_SORTED "ilmsux" /** * @brief Append an ISO 8601 formatted date, given 64-bit milliseconds since the epoch * @param append A bounded string append, initialized with mcommon_string_set_append() * @param msec_since_epoch Milliseconds since Jan 1 1970 UTC * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_iso8601_string_append(mcommon_string_append_t *append, int64_t msec_since_epoch); /** * @brief Append a UTF-8 string with all special characters escaped * * @param append A bounded string append, initialized with mcommon_string_set_append() * @param str UTF-8 string to escape and append * @param len Length of 'str' in bytes * @param allow_nul true if internal "00" bytes or "C0 80" sequences should be encoded as "\u0000", false to treat * them as invalid data * @returns true on success, false if this 'append' has exceeded its max length or if we encountered invalid UTF-8 or * disallowed NUL bytes in 'str' * * The string may include internal NUL characters. It does not need to be NUL terminated. * The two-byte sequence "C0 80" is also interpreted as an internal NUL, for historical reasons. This sequence is * considered invalid according to RFC3629. */ bool mcommon_json_append_escaped(mcommon_string_append_t *append, const char *str, uint32_t len, bool allow_nul); /** * @brief Append a comma separator string to appear between values * @param append A bounded string append, initialized with mcommon_string_set_append() * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_separator(mcommon_string_append_t *append) { return mcommon_string_append(append, ", "); } /** * @brief Append a quoted and escaped key and key-value separator * @param append A bounded string append, initialized with mcommon_string_set_append() * @param str UTF-8 string to escape and append * @param len Length of 'str' in bytes * @returns true on success, false if this 'append' has exceeded its max length or if we encountered invalid UTF-8 or * disallowed NUL bytes in 'str' * * See mcommon_json_append_escaped. NUL values in keys are never allowed. */ static BSON_INLINE bool mcommon_json_append_key(mcommon_string_append_t *append, const char *str, uint32_t len) { return mcommon_string_append(append, "\"") && mcommon_json_append_escaped(append, str, len, false) && mcommon_string_append(append, "\" : "); } /** * @brief Append a quoted and escaped string * @param append A bounded string append, initialized with mcommon_string_set_append() * @param str UTF-8 string to escape and append * @param len Length of 'str' in bytes * @param allow_nul true if internal "00" bytes or "C0 80" sequences should be encoded as "\u0000", false to treat them * as invalid data * @returns true on success, false if this 'append' has exceeded its max length or if we encountered invalid UTF-8 or * disallowed NUL bytes in 'str' * * See mcommon_json_append_escaped. */ static BSON_INLINE bool mcommon_json_append_value_utf8(mcommon_string_append_t *append, const char *str, uint32_t len, bool allow_nul) { return mcommon_string_append(append, "\"") && mcommon_json_append_escaped(append, str, len, allow_nul) && mcommon_string_append(append, "\""); } /** * @brief Append an int32_t value, serialized according to a bson_json_mode_t * @param append A bounded string append, initialized with mcommon_string_set_append() * @param value Integer value * @param mode One of the JSON serialization modes, as a bson_json_mode_t. * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_int32(mcommon_string_append_t *append, int32_t value, bson_json_mode_t mode) { return mode == BSON_JSON_MODE_CANONICAL ? mcommon_string_append_printf(append, "{ \"$numberInt\" : \"%" PRId32 "\" }", value) : mcommon_string_append_printf(append, "%" PRId32, value); } /** * @brief Append an int64_t value, serialized according to a bson_json_mode_t * @param append A bounded string append, initialized with mcommon_string_set_append() * @param value Integer value * @param mode One of the JSON serialization modes, as a bson_json_mode_t. * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_int64(mcommon_string_append_t *append, int64_t value, bson_json_mode_t mode) { return mode == BSON_JSON_MODE_CANONICAL ? mcommon_string_append_printf(append, "{ \"$numberLong\" : \"%" PRId64 "\" }", value) : mcommon_string_append_printf(append, "%" PRId64, value); } /** * @brief Append a JSON compatible bool value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param bool Boolean value * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_bool(mcommon_string_append_t *append, bool value) { return mcommon_string_append(append, value ? "true" : "false"); } /** * @brief Append an $undefined value * @param append A bounded string append, initialized with mcommon_string_set_append() * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_undefined(mcommon_string_append_t *append) { return mcommon_string_append(append, "{ \"$undefined\" : true }"); } /** * @brief Append a null value * @param append A bounded string append, initialized with mcommon_string_set_append() * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_null(mcommon_string_append_t *append) { return mcommon_string_append(append, "null"); } /** * @brief Append a $minKey value * @param append A bounded string append, initialized with mcommon_string_set_append() * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_minkey(mcommon_string_append_t *append) { return mcommon_string_append(append, "{ \"$minKey\" : 1 }"); } /** * @brief Append a $maxKey value * @param append A bounded string append, initialized with mcommon_string_set_append() * @returns true on success, false if this 'append' has exceeded its max length */ static BSON_INLINE bool mcommon_json_append_value_maxkey(mcommon_string_append_t *append) { return mcommon_string_append(append, "{ \"$maxKey\" : 1 }"); } /** * @brief Append a double-precision floating point value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param value Double-precision floating point value * @param mode One of the JSON serialization modes, as a bson_json_mode_t. * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_double(mcommon_string_append_t *append, double value, bson_json_mode_t mode); /** * @brief Append a decimal128 value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param value decimal128 value to copy * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_decimal128(mcommon_string_append_t *append, const bson_decimal128_t *value); /** * @brief Append the $oid JSON serialization of an ObjectId value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param value bson_oid_t value to copy * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_oid(mcommon_string_append_t *append, const bson_oid_t *value); /** * @brief Append the JSON serialization of a BSON binary value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param subtype Subtype code, identifying the format within the base64-encoded binary block * @param bytes Bytes to be base64 encoded * @param byte_count Number of bytes * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_binary(mcommon_string_append_t *append, bson_subtype_t subtype, const uint8_t *bytes, uint32_t byte_count, bson_json_mode_t mode); /** * @brief Append the JSON serialization of a BSON date and time * @param append A bounded string append, initialized with mcommon_string_set_append() * @param msec_since_epoch Milliseconds since Jan 1 1970 * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_date_time(mcommon_string_append_t *append, int64_t msec_since_epoch, bson_json_mode_t mode); /** * @brief Append the JSON serialization of a BSON timestamp value * @param append A bounded string append, initialized with mcommon_string_set_append() * @param timestamp 32-bit timestamp value * @param increment 32-bit increment value * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_timestamp(mcommon_string_append_t *append, uint32_t timestamp, uint32_t increment); /** * @brief Append the JSON serialization of a BSON regular expression * @param append A bounded string append, initialized with mcommon_string_set_append() * @param pattern Regular expression pattern, as a UTF-8 string * @param pattern_len Length of pattern string, in bytes * @param options Regular expression options, as a UTF-8 string * @param options_len Length of the options string, in bytes * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_regex(mcommon_string_append_t *append, const char *pattern, uint32_t pattern_len, const char *options, size_t options_len, bson_json_mode_t mode); /** * @brief Append the JSON serialization of a BSON legacy DBPointer * @param append A bounded string append, initialized with mcommon_string_set_append() * @param collection Collection name, as a UTF-8 string * @param collection_len Length of collection name string, in bytes * @param oid Optional ObjectId reference, or NULL * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_dbpointer(mcommon_string_append_t *append, const char *collection, uint32_t collection_len, const bson_oid_t *oid, bson_json_mode_t mode); /** * @brief Append the JSON serialization of a BSON legacy code object * @param append A bounded string append, initialized with mcommon_string_set_append() * @param code Code string, in UTF-8 * @param code_len Length of code string, in bytes * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_code(mcommon_string_append_t *append, const char *code, uint32_t code_len); /** * @brief Append the JSON serialization of a BSON legacy code-with-scope object * @param append A bounded string append, initialized with mcommon_string_set_append() * @param code Code string, in UTF-8 * @param code_len Length of code string, in bytes * @param scope Scope as a bson_t document * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @param max_depth Maximum allowed number of document/array nesting levels below this one * @returns true if the input bson was valid, even if we reached max length. false on invalid BSON. */ bool mcommon_json_append_value_codewscope(mcommon_string_append_t *append, const char *code, uint32_t code_len, const bson_t *scope, bson_json_mode_t mode, unsigned max_depth); /** * @brief Append the JSON serialization of a BSON legacy symbol object * @param append A bounded string append, initialized with mcommon_string_set_append() * @param symbol Symbol string, in UTF-8 * @param symbol_len Length of symbol string, in bytes * @param mode One of the JSON serialization modes, as a bson_json_mode_t. * @returns true on success, false if this 'append' has exceeded its max length */ bool mcommon_json_append_value_symbol(mcommon_string_append_t *append, const char *symbol, uint32_t symbol_len, bson_json_mode_t mode); /** * @brief Append all JSON-serialized values from a bson_t * @param append A bounded string append, initialized with mcommon_string_set_append() * @param bson bson_t document or array * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @param has_keys true if this is a document, false if this is an array * @param max_depth Maximum allowed number of document/array nesting levels below this one * @returns true if the input bson was valid, even if we reached max length. false on invalid BSON. * * This generates keys, values, and separators but does not enclose the result in {} or []. * Note that the return value reflects the status of BSON decoding, not string appending. * The append status can be read using mcommon_string_status_from_append() if needed. * If encoding was stopped early due to the max depth limit or max length, invalid input may go unnoticed. */ bool mcommon_json_append_bson_values( mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, bool has_keys, unsigned max_depth); /** * @brief Append a BSON document serialized as a JSON document * @param append A bounded string append, initialized with mcommon_string_set_append() * @param bson bson_t document * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @param max_depth Maximum allowed number of document/array nesting levels *including* this one. If zero, appends "{ * ... }". * @returns true if the input bson was valid, even if we reached max length. false on invalid BSON. */ bool mcommon_json_append_bson_document(mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, unsigned max_depth); /** * @brief Append a BSON document serialized as a JSON array * @param append A bounded string append, initialized with mcommon_string_set_append() * @param bson bson_t to interpret as an array * @param mode One of the JSON serialization modes, as a bson_json_mode_t * @param max_depth Maximum allowed number of document/array nesting levels *including* this one. If zero, appends "[ * ... ]". * @returns true if the input bson was valid, even if we reached max length. false on invalid BSON. */ bool mcommon_json_append_bson_array(mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, unsigned max_depth); #endif /* MONGO_C_DRIVER_COMMON_JSON_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-json.c000066400000000000000000000656551511661753600216510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include typedef struct { mcommon_string_append_t *append; unsigned max_depth; bson_json_mode_t mode; bool has_keys; bool not_first_item; bool is_corrupt; } mcommon_json_append_visit_t; static bool mcommon_json_append_visit_utf8( const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_utf8_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_utf8(state->append, v_utf8, (uint32_t)v_utf8_len, true); } static bool mcommon_json_append_visit_int32(const bson_iter_t *iter, const char *key, int32_t v_int32, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_int32(state->append, v_int32, state->mode); } static bool mcommon_json_append_visit_int64(const bson_iter_t *iter, const char *key, int64_t v_int64, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_int64(state->append, v_int64, state->mode); } static bool mcommon_json_append_visit_decimal128(const bson_iter_t *iter, const char *key, const bson_decimal128_t *value, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_decimal128(state->append, value); } static bool mcommon_json_append_visit_double(const bson_iter_t *iter, const char *key, double v_double, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_double(state->append, v_double, state->mode); } static bool mcommon_json_append_visit_undefined(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_undefined(state->append); } static bool mcommon_json_append_visit_null(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_null(state->append); } static bool mcommon_json_append_visit_oid(const bson_iter_t *iter, const char *key, const bson_oid_t *oid, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_oid(state->append, oid); } static bool mcommon_json_append_visit_binary(const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_binary_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_binary(state->append, v_subtype, v_binary, (uint32_t)v_binary_len, state->mode); } static bool mcommon_json_append_visit_bool(const bson_iter_t *iter, const char *key, bool v_bool, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_bool(state->append, v_bool); } static bool mcommon_json_append_visit_date_time(const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_date_time(state->append, msec_since_epoch, state->mode); } static bool mcommon_json_append_visit_regex( const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data) { mcommon_json_append_visit_t *state = data; size_t v_regex_len = strlen(v_regex); size_t v_options_len = strlen(v_options); BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_regex_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_regex( state->append, v_regex, (uint32_t)v_regex_len, v_options, v_options_len, state->mode); } static bool mcommon_json_append_visit_timestamp( const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_timestamp(state->append, v_timestamp, v_increment); } static bool mcommon_json_append_visit_dbpointer(const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_collection_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_dbpointer( state->append, v_collection, (uint32_t)v_collection_len, v_oid, state->mode); } static bool mcommon_json_append_visit_minkey(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_minkey(state->append); } static bool mcommon_json_append_visit_maxkey(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_json_append_value_maxkey(state->append); } static bool mcommon_json_append_visit_before(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); if (!mcommon_string_status_from_append(state->append)) { return true; } if (state->not_first_item) { if (!mcommon_json_append_separator(state->append)) { return true; } } else { state->not_first_item = true; } if (state->has_keys) { size_t key_len = strlen(key); if (!mlib_in_range(uint32_t, key_len)) { mcommon_string_append_overflow(state->append); return true; } if (!mcommon_json_append_key(state->append, key, (uint32_t)key_len)) { return true; } } return false; } static bool mcommon_json_append_visit_after(const bson_iter_t *iter, const char *key, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); return !mcommon_string_status_from_append(state->append); } static void mcommon_json_append_visit_corrupt(const bson_iter_t *iter, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); state->is_corrupt = true; } static bool mcommon_json_append_visit_code( const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_code_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_code(state->append, v_code, (uint32_t)v_code_len); } static bool mcommon_json_append_visit_symbol( const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_symbol_len)) { mcommon_string_append_overflow(state->append); return true; } return !mcommon_json_append_value_symbol(state->append, v_symbol, (uint32_t)v_symbol_len, state->mode); } static bool mcommon_json_append_visit_codewscope( const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (!mlib_in_range(uint32_t, v_code_len)) { mcommon_string_append_overflow(state->append); return true; } if (mcommon_json_append_value_codewscope( state->append, v_code, (uint32_t)v_code_len, v_scope, state->mode, state->max_depth)) { return !mcommon_string_status_from_append(state->append); } else { state->is_corrupt = true; return true; } } static bool mcommon_json_append_visit_document(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (mcommon_json_append_bson_document(state->append, v_document, state->mode, state->max_depth)) { return !mcommon_string_status_from_append(state->append); } else { state->is_corrupt = true; return true; } } static bool mcommon_json_append_visit_array(const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data) { mcommon_json_append_visit_t *state = data; BSON_UNUSED(iter); BSON_UNUSED(key); if (mcommon_json_append_bson_array(state->append, v_array, state->mode, state->max_depth)) { return !mcommon_string_status_from_append(state->append); } else { state->is_corrupt = true; return true; } } bool mcommon_json_append_bson_values( mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, bool has_keys, unsigned max_depth) { mcommon_json_append_visit_t state = {.append = append, .max_depth = max_depth, .mode = mode, .has_keys = has_keys}; bson_iter_t iter; if (!bson_iter_init(&iter, bson)) { return false; } static const bson_visitor_t visitors = { mcommon_json_append_visit_before, mcommon_json_append_visit_after, mcommon_json_append_visit_corrupt, mcommon_json_append_visit_double, mcommon_json_append_visit_utf8, mcommon_json_append_visit_document, mcommon_json_append_visit_array, mcommon_json_append_visit_binary, mcommon_json_append_visit_undefined, mcommon_json_append_visit_oid, mcommon_json_append_visit_bool, mcommon_json_append_visit_date_time, mcommon_json_append_visit_null, mcommon_json_append_visit_regex, mcommon_json_append_visit_dbpointer, mcommon_json_append_visit_code, mcommon_json_append_visit_symbol, mcommon_json_append_visit_codewscope, mcommon_json_append_visit_int32, mcommon_json_append_visit_timestamp, mcommon_json_append_visit_int64, mcommon_json_append_visit_maxkey, mcommon_json_append_visit_minkey, NULL, /* visit_unsupported_type */ mcommon_json_append_visit_decimal128, }; /* Note that early exit from bson_iter_visit_all does not affect our success, which is based only on BSON validity. * BSON errors will set is_corrupt if they prevent full traversal, but non-fatal parse errors (like invalid UTF-8) * may let bson_iter_visit_all() succeed while leaving an error status in iter.err_off. */ (void)bson_iter_visit_all(&iter, &visitors, &state); return iter.err_off == 0 && !state.is_corrupt; } static BSON_INLINE bool mcommon_json_append_bson_container(mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, unsigned max_depth, bool has_keys, const char *empty, const char *begin_non_empty, const char *end_non_empty, const char *omitted) { // Note that the return value here is bson validity, not append status. if (bson_empty(bson)) { (void)mcommon_string_append(append, empty); return true; } else if (max_depth == 0) { (void)mcommon_string_append(append, omitted); return true; } else { (void)mcommon_string_append(append, begin_non_empty); bool result = mcommon_json_append_bson_values(append, bson, mode, has_keys, max_depth - 1u); (void)mcommon_string_append(append, end_non_empty); return result; } } bool mcommon_json_append_bson_document(mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, unsigned max_depth) { return mcommon_json_append_bson_container(append, bson, mode, max_depth, true, "{ }", "{ ", " }", "{ ... }"); } bool mcommon_json_append_bson_array(mcommon_string_append_t *append, const bson_t *bson, bson_json_mode_t mode, unsigned max_depth) { return mcommon_json_append_bson_container(append, bson, mode, max_depth, false, "[ ]", "[ ", " ]", "[ ... ]"); } /** * @brief Like mcommon_string_append_printf (append, "\\u%04x", c) but intended to be more optimizable. */ static BSON_INLINE bool mcommon_json_append_hex_char(mcommon_string_append_t *append, uint16_t c) { static const char digit_table[] = "0123456789abcdef"; char hex_char[6]; hex_char[0] = '\\'; hex_char[1] = 'u'; hex_char[2] = digit_table[0xf & (c >> 12)]; hex_char[3] = digit_table[0xf & (c >> 8)]; hex_char[4] = digit_table[0xf & (c >> 4)]; hex_char[5] = digit_table[0xf & c]; return mcommon_string_append_bytes(append, hex_char, 6); } /** * @brief Test whether a byte may require special processing in mcommon_json_append_escaped. * @returns true for bytes in the range 0x00 - 0x1F, '\\', '\"', and 0xC0. */ static BSON_INLINE bool mcommon_json_append_escaped_considers_byte_as_special(uint8_t byte) { static const uint64_t table[4] = { 0x00000004ffffffffull, // 0x00-0x1F (control), 0x22 (") 0x0000000010000000ull, // 0x5C (') 0x0000000000000000ull, // none 0x0000000000000001ull, // 0xC0 (Possible two-byte NUL) }; return 0 != (table[byte >> 6] & (1ull << (byte & 0x3f))); } /** * @brief Measure the number of consecutive non-special bytes. */ static BSON_INLINE uint32_t mcommon_json_append_escaped_count_non_special_bytes(const char *str, uint32_t len) { uint32_t result = 0; // Good candidate for architecture-specific optimizations. // SSE4 strcspn is nearly what we want, but our table of special bytes would be too large (34 > 16) while (len) { if (mcommon_json_append_escaped_considers_byte_as_special((uint8_t)*str)) { break; } result++; str++; len--; } return result; } bool mcommon_json_append_escaped(mcommon_string_append_t *append, const char *str, uint32_t len, bool allow_nul) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(str); // Repeatedly handle runs of zero or more non-special bytes punctuated by a potentially-special sequence. uint32_t non_special_len = mcommon_json_append_escaped_count_non_special_bytes(str, len); while (len) { if (!mcommon_string_append_bytes(append, str, non_special_len)) { return false; } str += non_special_len; len -= non_special_len; if (len) { char c = *str; switch (c) { case '"': if (!mcommon_string_append(append, "\\\"")) { return false; } break; case '\\': if (!mcommon_string_append(append, "\\\\")) { return false; } break; case '\b': if (!mcommon_string_append(append, "\\b")) { return false; } break; case '\f': if (!mcommon_string_append(append, "\\f")) { return false; } break; case '\n': if (!mcommon_string_append(append, "\\n")) { return false; } break; case '\r': if (!mcommon_string_append(append, "\\r")) { return false; } break; case '\t': if (!mcommon_string_append(append, "\\t")) { return false; } break; case '\0': if (!allow_nul || !mcommon_json_append_hex_char(append, 0)) { return false; } break; case '\xc0': // Could be a 2-byte NUL, or could begin another non-special run if (len >= 2 && str[1] == '\x80') { if (!allow_nul || !mcommon_json_append_hex_char(append, 0)) { return false; } str++; len--; } else { // Wasn't "C0 80". Begin a non-special run with the "C0" byte, which is usually special. non_special_len = mcommon_json_append_escaped_count_non_special_bytes(str + 1, len - 1) + 1; continue; } break; default: BSON_ASSERT(c > 0x00 && c < 0x20); if (!mcommon_json_append_hex_char(append, c)) { return false; } break; } str++; len--; non_special_len = mcommon_json_append_escaped_count_non_special_bytes(str, len); } } return mcommon_string_status_from_append(append); } bool mcommon_iso8601_string_append(mcommon_string_append_t *append, int64_t msec_since_epoch) { time_t t; int64_t msec_part; char buf[64]; msec_part = msec_since_epoch % 1000; t = (time_t)(msec_since_epoch / 1000); #ifdef BSON_HAVE_GMTIME_R { struct tm posix_date; gmtime_r(&t, &posix_date); strftime(buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", &posix_date); } #elif defined(_MSC_VER) { /* Windows gmtime_s is thread-safe */ struct tm time_buf; gmtime_s(&time_buf, &t); strftime(buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", &time_buf); } #else strftime(buf, sizeof buf, "%Y-%m-%dT%H:%M:%S", gmtime(&t)); #endif if (msec_part) { return mcommon_string_append_printf(append, "%s.%03" PRId64 "Z", buf, msec_part); } else { return mcommon_string_append_printf(append, "%sZ", buf); } } bool mcommon_json_append_value_double(mcommon_string_append_t *append, double value, bson_json_mode_t mode) { /* Determine if legacy (i.e. unwrapped) output should be used. Relaxed mode * will use this for nan and inf values, which we check manually since old * platforms may not have isinf or isnan. */ bool legacy = mode == BSON_JSON_MODE_LEGACY || (mode == BSON_JSON_MODE_RELAXED && !(value != value || value * 0 != 0)); if (!legacy) { mcommon_string_append(append, "{ \"$numberDouble\" : \""); } if (!legacy && value != value) { mcommon_string_append(append, "NaN"); } else if (!legacy && value * 0 != 0) { if (value > 0) { mcommon_string_append(append, "Infinity"); } else { mcommon_string_append(append, "-Infinity"); } } else { const mcommon_string_t *string = mcommon_string_from_append(append); uint32_t start_len = string->len; if (mcommon_string_append_printf(append, "%.20g", value)) { /* ensure trailing ".0" to distinguish "3" from "3.0" */ if (strspn(&string->str[start_len], "0123456789-") == string->len - start_len) { mcommon_string_append(append, ".0"); } } } if (!legacy) { mcommon_string_append(append, "\" }"); } return mcommon_string_status_from_append(append); } bool mcommon_json_append_value_decimal128(mcommon_string_append_t *append, const bson_decimal128_t *value) { char decimal128_string[BSON_DECIMAL128_STRING]; bson_decimal128_to_string(value, decimal128_string); return mcommon_string_append(append, "{ \"$numberDecimal\" : \"") && mcommon_string_append(append, decimal128_string) && mcommon_string_append(append, "\" }"); } bool mcommon_json_append_value_oid(mcommon_string_append_t *append, const bson_oid_t *value) { return mcommon_string_append(append, "{ \"$oid\" : \"") && mcommon_string_append_oid_as_hex(append, value) && mcommon_string_append(append, "\" }"); } bool mcommon_json_append_value_binary(mcommon_string_append_t *append, bson_subtype_t subtype, const uint8_t *bytes, uint32_t byte_count, bson_json_mode_t mode) { if (mode == BSON_JSON_MODE_CANONICAL || mode == BSON_JSON_MODE_RELAXED) { return mcommon_string_append(append, "{ \"$binary\" : { \"base64\" : \"") && mcommon_string_append_base64_encode(append, bytes, byte_count) && mcommon_string_append_printf(append, "\", \"subType\" : \"%02x\" } }", subtype); } else { return mcommon_string_append(append, "{ \"$binary\" : \"") && mcommon_string_append_base64_encode(append, bytes, byte_count) && mcommon_string_append_printf(append, "\", \"$type\" : \"%02x\" }", subtype); } } bool mcommon_json_append_value_date_time(mcommon_string_append_t *append, int64_t msec_since_epoch, bson_json_mode_t mode) { const int64_t y10k = 253402300800000; // 10000-01-01T00:00:00Z in milliseconds since the epoch. if (mode == BSON_JSON_MODE_CANONICAL || (mode == BSON_JSON_MODE_RELAXED && (msec_since_epoch < 0 || msec_since_epoch >= y10k))) { return mcommon_string_append_printf( append, "{ \"$date\" : { \"$numberLong\" : \"%" PRId64 "\" } }", msec_since_epoch); } else if (mode == BSON_JSON_MODE_RELAXED) { return mcommon_string_append(append, "{ \"$date\" : \"") && mcommon_iso8601_string_append(append, msec_since_epoch) && mcommon_string_append(append, "\" }"); } else { return mcommon_string_append_printf(append, "{ \"$date\" : %" PRId64 " }", msec_since_epoch); } } bool mcommon_json_append_value_timestamp(mcommon_string_append_t *append, uint32_t timestamp, uint32_t increment) { BSON_ASSERT_PARAM(append); return mcommon_string_append_printf(append, "{ \"$timestamp\" : { \"t\" : %u, \"i\" : %u } }", timestamp, increment); } bool mcommon_json_append_value_regex(mcommon_string_append_t *append, const char *pattern, uint32_t pattern_len, const char *options, size_t options_len, bson_json_mode_t mode) { if (mode == BSON_JSON_MODE_CANONICAL || mode == BSON_JSON_MODE_RELAXED) { return mcommon_string_append(append, "{ \"$regularExpression\" : { \"pattern\" : \"") && mcommon_json_append_escaped(append, pattern, pattern_len, false) && mcommon_string_append(append, "\", \"options\" : \"") && mcommon_string_append_selected_chars(append, BSON_REGEX_OPTIONS_SORTED, options, options_len) && mcommon_string_append(append, "\" } }"); } else { return mcommon_string_append(append, "{ \"$regex\" : \"") && mcommon_json_append_escaped(append, pattern, pattern_len, false) && mcommon_string_append(append, "\", \"$options\" : \"") && mcommon_string_append_selected_chars(append, BSON_REGEX_OPTIONS_SORTED, options, options_len) && mcommon_string_append(append, "\" }"); } } bool mcommon_json_append_value_dbpointer(mcommon_string_append_t *append, const char *collection, uint32_t collection_len, const bson_oid_t *oid, bson_json_mode_t mode) { if (mode == BSON_JSON_MODE_CANONICAL || mode == BSON_JSON_MODE_RELAXED) { return mcommon_string_append(append, "{ \"$dbPointer\" : { \"$ref\" : \"") && mcommon_json_append_escaped(append, collection, collection_len, false) && mcommon_string_append(append, "\"") && (!oid || (mcommon_string_append(append, ", \"$id\" : ") && mcommon_json_append_value_oid(append, oid))) && mcommon_string_append(append, " } }"); } else { return mcommon_string_append(append, "{ \"$ref\" : \"") && mcommon_json_append_escaped(append, collection, collection_len, false) && mcommon_string_append(append, "\"") && (!oid || (mcommon_string_append(append, ", \"$id\" : \"") && mcommon_string_append_oid_as_hex(append, oid))) && mcommon_string_append(append, "\" }"); } } bool mcommon_json_append_value_code(mcommon_string_append_t *append, const char *code, uint32_t code_len) { return mcommon_string_append(append, "{ \"$code\" : \"") && mcommon_json_append_escaped(append, code, code_len, true) && mcommon_string_append(append, "\" }"); } bool mcommon_json_append_value_codewscope(mcommon_string_append_t *append, const char *code, uint32_t code_len, const bson_t *scope, bson_json_mode_t mode, unsigned max_depth) { // Note that the return value here is bson validity, not append status. (void)mcommon_string_append(append, "{ \"$code\" : \""); (void)mcommon_json_append_escaped(append, code, code_len, true); (void)mcommon_string_append(append, "\", \"$scope\" : "); bool result = mcommon_json_append_bson_document(append, scope, mode, max_depth); (void)mcommon_string_append(append, " }"); return result; } bool mcommon_json_append_value_symbol(mcommon_string_append_t *append, const char *symbol, uint32_t symbol_len, bson_json_mode_t mode) { if (mode == BSON_JSON_MODE_CANONICAL || mode == BSON_JSON_MODE_RELAXED) { return mcommon_string_append(append, "{ \"$symbol\" : \"") && mcommon_json_append_escaped(append, symbol, symbol_len, true) && mcommon_string_append(append, "\" }"); } else { return mcommon_json_append_value_utf8(append, symbol, symbol_len, true); } } mongo-c-driver-2.2.1/src/common/src/common-macros-private.h000066400000000000000000000115321511661753600236220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_MACROS_PRIVATE_H #define MONGO_C_DRIVER_COMMON_MACROS_PRIVATE_H /* Test only assert. Is a noop unless -DENABLE_DEBUG_ASSERTIONS=ON is set * during configuration */ #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) #define MONGOC_DEBUG_ASSERT(statement) BSON_ASSERT(statement) #else #define MONGOC_DEBUG_ASSERT(statement) ((void)0) #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") #define MC_PRAGMA_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") #elif defined(__clang__) #define MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") #define MC_PRAGMA_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") #elif defined(_MSC_VER) #define MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("warning ( push )") #define MC_PRAGMA_DIAGNOSTIC_POP _Pragma("warning ( pop )") #else #define MC_PRAGMA_DIAGNOSTIC_PUSH #define MC_PRAGMA_DIAGNOSTIC_POP #endif // `MC_ENABLE_CONVERSION_WARNING_BEGIN` enables -Wconversion to check for potentially unsafe integer conversions. // The `mcommon_in_range_*` functions can help address these warnings by ensuring a cast is within bounds. #if defined(__GNUC__) #define MC_ENABLE_CONVERSION_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic warning \"-Wconversion\"") #define MC_ENABLE_CONVERSION_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #elif defined(__clang__) #define MC_ENABLE_CONVERSION_WARNING_BEGIN \ MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic warning \"-Wconversion\"") #define MC_ENABLE_CONVERSION_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #else #define MC_ENABLE_CONVERSION_WARNING_BEGIN #define MC_ENABLE_CONVERSION_WARNING_END #endif // Disable the -Wcast-function-type-strict warning. #define MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_BEGIN #define MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_END #if defined(__clang__) #if __has_warning("-Wcast-function-type-strict") #undef MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_BEGIN #undef MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_END #define MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_BEGIN \ MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic ignored \"-Wcast-function-type-strict\"") #define MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #endif // __has_warning("-Wcast-function-type-strict") #endif // defined(__clang__) #if defined(__GNUC__) #define BEGIN_IGNORE_DEPRECATIONS \ MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE_DEPRECATIONS MC_PRAGMA_DIAGNOSTIC_POP #elif defined(__clang__) #define BEGIN_IGNORE_DEPRECATIONS \ MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") #define END_IGNORE_DEPRECATIONS MC_PRAGMA_DIAGNOSTIC_PUSH #else #define BEGIN_IGNORE_DEPRECATIONS #define END_IGNORE_DEPRECATIONS #endif // Disable the -Wimplicit warning (including -Wimplicit-int and -Wimplicit-function-declaration). #if defined(__GNUC__) #define MC_DISABLE_IMPLICIT_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic ignored \"-Wimplicit\"") #define MC_DISABLE_IMPLICIT_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #elif defined(__clang__) #define MC_DISABLE_IMPLICIT_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic ignored \"-Wimplicit\"") #define MC_DISABLE_IMPLICIT_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #elif defined(_MSC_VER) #define MC_DISABLE_IMPLICIT_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("warning (disable : 4013 4431)") #define MC_DISABLE_IMPLICIT_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #else #define MC_DISABLE_IMPLICIT_WARNING_BEGIN #define MC_DISABLE_IMPLICIT_WARNING_END #endif // Disable the -Wcast-qual warning #if defined(__GNUC__) #define MC_DISABLE_CAST_QUAL_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") #define MC_DISABLE_CAST_QUAL_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #elif defined(__clang__) #define MC_DISABLE_CAST_QUAL_WARNING_BEGIN MC_PRAGMA_DIAGNOSTIC_PUSH _Pragma("clang diagnostic ignored \"-Wcast-qual\"") #define MC_DISABLE_CAST_QUAL_WARNING_END MC_PRAGMA_DIAGNOSTIC_POP #else #define MC_DISABLE_CAST_QUAL_WARNING_BEGIN #define MC_DISABLE_CAST_QUAL_WARNING_END #endif #endif /* MONGO_C_DRIVER_COMMON_MACROS_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-md5-private.h000066400000000000000000000024771511661753600230330ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_MD5_PRIVATE_H #define MONGO_C_DRIVER_COMMON_MD5_PRIVATE_H #include BSON_BEGIN_DECLS typedef struct { uint32_t count[2]; /* message length in bits, lsw first */ uint32_t abcd[4]; /* digest buffer */ uint8_t buf[64]; /* accumulate block */ } bson_md5_t; #define mcommon_md5_init COMMON_NAME(md5_init) #define mcommon_md5_append COMMON_NAME(md5_append) #define mcommon_md5_finish COMMON_NAME(md5_finish) void mcommon_md5_init(bson_md5_t *pms); void mcommon_md5_append(bson_md5_t *pms, const uint8_t *data, uint32_t nbytes); void mcommon_md5_finish(bson_md5_t *pms, uint8_t digest[16]); BSON_END_DECLS #endif /* MONGO_C_DRIVER_COMMON_MD5_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-md5.c000066400000000000000000000307441511661753600213540ustar00rootroot00000000000000/* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgement in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. L. Peter Deutsch ghost@aladdin.com */ /* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ /* Independent implementation of MD5 (RFC 1321). This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted. The original and principal author of md5.c is L. Peter Deutsch . Other authors are noted in the change history that follows (in reverse chronological order): 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include in library. 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program. 2002-02-21 lpd Added missing #include in test program. 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking. 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). 1999-05-03 lpd Original version. */ /* * The following MD5 implementation has been modified to use types as * specified in libbson. */ #include #include #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ #if BSON_BYTE_ORDER == BSON_BIG_ENDIAN #define BYTE_ORDER 1 #else #define BYTE_ORDER -1 #endif #define T_MASK ((uint32_t)~0) #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) #define T3 0x242070db #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) #define T6 0x4787c62a #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) #define T9 0x698098d8 #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) #define T13 0x6b901122 #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) #define T16 0x49b40821 #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) #define T19 0x265e5a51 #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) #define T22 0x02441453 #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) #define T25 0x21e1cde6 #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) #define T28 0x455a14ed #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) #define T31 0x676f02d9 #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) #define T35 0x6d9d6122 #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) #define T38 0x4bdecfa9 #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) #define T41 0x289b7ec6 #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) #define T44 0x04881d05 #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) #define T47 0x1fa27cf8 #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) #define T50 0x432aff97 #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) #define T53 0x655b59c3 #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) #define T57 0x6fa87e4f #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) #define T60 0x4e0811a1 #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) #define T63 0x2ad7d2bb #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) static void bson_md5_process(bson_md5_t *md5, const uint8_t *data) { uint32_t a = md5->abcd[0]; uint32_t b = md5->abcd[1]; uint32_t c = md5->abcd[2]; uint32_t d = md5->abcd[3]; uint32_t t; #if BYTE_ORDER > 0 /* Define storage only for big-endian CPUs. */ uint32_t X[16]; #else /* Define storage for little-endian or both types of CPUs. */ uint32_t xbuf[16]; const uint32_t *X; #endif { #if BYTE_ORDER == 0 /* * Determine dynamically whether this is a big-endian or * little-endian machine, since we can use a more efficient * algorithm on the latter. */ static const int w = 1; if (*((const uint8_t *)&w)) /* dynamic little-endian */ #endif #if BYTE_ORDER <= 0 /* little-endian */ { /* * On little-endian machines, we can process properly aligned * data without copying it. */ if (!(((uintptr_t)data) & 3u)) { /* data are properly aligned */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wcast-align" #endif X = (const uint32_t *)data; #ifdef __clang__ #pragma clang diagnostic pop #endif } else { /* not aligned */ memcpy(xbuf, data, sizeof(xbuf)); X = xbuf; } } #endif #if BYTE_ORDER == 0 else /* dynamic big-endian */ #endif #if BYTE_ORDER >= 0 /* big-endian */ { /* * On big-endian machines, we must arrange the bytes in the * right order. */ const uint8_t *xp = data; int i; #if BYTE_ORDER == 0 X = xbuf; /* (dynamic only) */ #else #define xbuf X /* (static only) */ #endif for (i = 0; i < 16; ++i, xp += 4) xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); } #endif } #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + F(b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1); SET(d, a, b, c, 1, 12, T2); SET(c, d, a, b, 2, 17, T3); SET(b, c, d, a, 3, 22, T4); SET(a, b, c, d, 4, 7, T5); SET(d, a, b, c, 5, 12, T6); SET(c, d, a, b, 6, 17, T7); SET(b, c, d, a, 7, 22, T8); SET(a, b, c, d, 8, 7, T9); SET(d, a, b, c, 9, 12, T10); SET(c, d, a, b, 10, 17, T11); SET(b, c, d, a, 11, 22, T12); SET(a, b, c, d, 12, 7, T13); SET(d, a, b, c, 13, 12, T14); SET(c, d, a, b, 14, 17, T15); SET(b, c, d, a, 15, 22, T16); #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + G(b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17); SET(d, a, b, c, 6, 9, T18); SET(c, d, a, b, 11, 14, T19); SET(b, c, d, a, 0, 20, T20); SET(a, b, c, d, 5, 5, T21); SET(d, a, b, c, 10, 9, T22); SET(c, d, a, b, 15, 14, T23); SET(b, c, d, a, 4, 20, T24); SET(a, b, c, d, 9, 5, T25); SET(d, a, b, c, 14, 9, T26); SET(c, d, a, b, 3, 14, T27); SET(b, c, d, a, 8, 20, T28); SET(a, b, c, d, 13, 5, T29); SET(d, a, b, c, 2, 9, T30); SET(c, d, a, b, 7, 14, T31); SET(b, c, d, a, 12, 20, T32); #undef SET /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ #define H(x, y, z) ((x) ^ (y) ^ (z)) #define SET(a, b, c, d, k, s, Ti) \ t = a + H(b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 5, 4, T33); SET(d, a, b, c, 8, 11, T34); SET(c, d, a, b, 11, 16, T35); SET(b, c, d, a, 14, 23, T36); SET(a, b, c, d, 1, 4, T37); SET(d, a, b, c, 4, 11, T38); SET(c, d, a, b, 7, 16, T39); SET(b, c, d, a, 10, 23, T40); SET(a, b, c, d, 13, 4, T41); SET(d, a, b, c, 0, 11, T42); SET(c, d, a, b, 3, 16, T43); SET(b, c, d, a, 6, 23, T44); SET(a, b, c, d, 9, 4, T45); SET(d, a, b, c, 12, 11, T46); SET(c, d, a, b, 15, 16, T47); SET(b, c, d, a, 2, 23, T48); #undef SET /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ #define I(x, y, z) ((y) ^ ((x) | ~(z))) #define SET(a, b, c, d, k, s, Ti) \ t = a + I(b, c, d) + X[k] + Ti; \ a = ROTATE_LEFT(t, s) + b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 6, T49); SET(d, a, b, c, 7, 10, T50); SET(c, d, a, b, 14, 15, T51); SET(b, c, d, a, 5, 21, T52); SET(a, b, c, d, 12, 6, T53); SET(d, a, b, c, 3, 10, T54); SET(c, d, a, b, 10, 15, T55); SET(b, c, d, a, 1, 21, T56); SET(a, b, c, d, 8, 6, T57); SET(d, a, b, c, 15, 10, T58); SET(c, d, a, b, 6, 15, T59); SET(b, c, d, a, 13, 21, T60); SET(a, b, c, d, 4, 6, T61); SET(d, a, b, c, 11, 10, T62); SET(c, d, a, b, 2, 15, T63); SET(b, c, d, a, 9, 21, T64); #undef SET /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ md5->abcd[0] += a; md5->abcd[1] += b; md5->abcd[2] += c; md5->abcd[3] += d; } void mcommon_md5_init(bson_md5_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; pms->abcd[3] = 0x10325476; } void mcommon_md5_append(bson_md5_t *pms, const uint8_t *data, uint32_t nbytes) { const uint8_t *p = data; uint32_t left = nbytes; uint8_t offset = (pms->count[0] >> 3) & 63; uint32_t nbits = (uint32_t)(nbytes << 3); if (nbytes <= 0) return; /* Update the message length. */ pms->count[1] += nbytes >> 29; pms->count[0] += nbits; if (pms->count[0] < nbits) pms->count[1]++; /* Process an initial partial block. */ if (offset) { uint32_t copy = (offset + nbytes > 64u ? 64u - offset : nbytes); memcpy(pms->buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; bson_md5_process(pms, pms->buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) bson_md5_process(pms, p); /* Process a final partial block. */ if (left) memcpy(pms->buf, p, left); } void mcommon_md5_finish(bson_md5_t *pms, uint8_t digest[16]) { static const uint8_t pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uint8_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (uint8_t)(pms->count[i >> 2] >> ((i & 3) << 3)); /* Pad to 56 bytes mod 64. */ mcommon_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ mcommon_md5_append(pms, data, sizeof(data)); for (i = 0; i < 16; ++i) digest[i] = (uint8_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); } mongo-c-driver-2.2.1/src/common/src/common-oid-private.h000066400000000000000000000017041511661753600231110ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_OID_PRIVATE_H #define MONGO_C_DRIVER_COMMON_OID_PRIVATE_H #include BSON_BEGIN_DECLS extern const bson_oid_t kZeroObjectId; void mcommon_oid_set_zero(bson_oid_t *oid); bool mcommon_oid_is_zero(const bson_oid_t *oid); BSON_END_DECLS #endif /* MONGO_C_DRIVER_COMMON_OID_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-oid.c000066400000000000000000000016121511661753600214320ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include const bson_oid_t kZeroObjectId = {{0}}; void mcommon_oid_set_zero(bson_oid_t *oid) { BSON_ASSERT(oid); memset(oid, 0, sizeof *oid); } bool mcommon_oid_is_zero(const bson_oid_t *oid) { BSON_ASSERT(oid); return bson_oid_equal_unsafe(oid, &kZeroObjectId); } mongo-c-driver-2.2.1/src/common/src/common-prelude.h000066400000000000000000000020751511661753600223300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION) && !defined(BSON_COMPILATION) && !defined(BSON_INSIDE) #error "Only or can be included directly." #endif #define COMMON_NAME_1(a, b) COMMON_NAME_2(a, b) #define COMMON_NAME_2(a, b) a##_##b #if defined(MCOMMON_NAME_PREFIX) && !defined(__INTELLISENSE__) #define COMMON_NAME(Name) COMMON_NAME_1(MCOMMON_NAME_PREFIX, Name) #else #define COMMON_NAME(Name) COMMON_NAME_1(mcommon, Name) #endif mongo-c-driver-2.2.1/src/common/src/common-string-private.h000066400000000000000000000647411511661753600236560ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_STRING_PRIVATE_H #define MONGO_C_DRIVER_COMMON_STRING_PRIVATE_H #include #include #include /* * In mcommon_string_t, 'str' is guaranteed to be NUL terminated and SHOULD be valid UTF-8. mcommon_string_t operations * MUST maintain the validity of valid UTF-8 strings. * * Unused portions of the buffer may be uninitialized, and must not be compared or copied. * * 'len' is measured in bytes, not including the NUL terminator. * * 'alloc' is the actual length of the bson_malloc() allocation in bytes, including the required space for NUL * termination. * * When we use 'capacity', it refers to the largest 'len' that the buffer could store. alloc == capacity + 1. */ typedef struct mcommon_string_t { char *str; uint32_t len; uint32_t alloc; } mcommon_string_t; /* Parameters and outcome for a bounded append operation on a mcommon_string_t. Individual type-specific append * functions can consume this struct to communicate bounds info. "max_len_exceeded" can be tested any time an * algorithmic exit is convenient; the actual appended content will be limited by max_len. Truncation is guaranteed not * to split a valid UTF-8 byte sequence. * * Members are here to support inline definitions; not intended for direct access. * * Multiple mcommon_string_append_t may simultaneously refer to the same 'string' but this usage is not recommended. * * 'max_len_exceeded' only includes operations undertaken on this specific mcommon_string_append_t. It will not be set * if the string was already overlong, or if a different mcommon_string_append_t experiences an overage. */ typedef struct mcommon_string_append_t { mcommon_string_t *_string; uint32_t _max_len; bool _max_len_exceeded; } mcommon_string_append_t; #define mcommon_string_new_with_capacity COMMON_NAME(string_new_with_capacity) #define mcommon_string_new_with_buffer COMMON_NAME(string_new_with_buffer) #define mcommon_string_destroy COMMON_NAME(string_destroy) #define mcommon_string_destroy_with_steal COMMON_NAME(string_destroy_with_steal) #define mcommon_string_grow_to_capacity COMMON_NAME(string_grow_to_capacity) #define mcommon_string_append_selected_chars COMMON_NAME(string_append_selected_chars) #define mcommon_string_append_bytes_internal COMMON_NAME(string_append_bytes_internal) #define mcommon_string_append_bytes_all_or_none COMMON_NAME(string_append_bytes_all_or_none) #define mcommon_string_append_unichar_internal COMMON_NAME(string_append_unichar_internal) #define mcommon_string_append_base64_encode COMMON_NAME(string_append_base64_encode) #define mcommon_string_append_oid_as_hex COMMON_NAME(string_append_oid_as_hex) #define mcommon_string_append_printf COMMON_NAME(string_append_printf) #define mcommon_string_append_vprintf COMMON_NAME(string_append_vprintf) bool mcommon_string_append_bytes_internal(mcommon_string_append_t *append, const char *str, uint32_t len); bool mcommon_string_append_unichar_internal(mcommon_string_append_t *append, bson_unichar_t unichar); /** * @brief Allocate a new mcommon_string_t with a copy of the supplied initializer string and an explicit buffer * capacity. * * @param str Initializer string, should be valid UTF-8. * @param length Length of initializer string, in bytes. * @param min_capacity Minimum string capacity, in bytes, the buffer must be able to store without reallocating. Does * not include the NUL terminator. Must be less than UINT32_MAX. * @returns A new mcommon_string_t that must be freed with mcommon_string_destroy() or * mcommon_string_destroy_with_steal() and bson_free(). It will hold 'str' in its entirety, even if the requested * min_capacity was smaller. */ mcommon_string_t * mcommon_string_new_with_capacity(const char *str, uint32_t length, uint32_t min_capacity); /** * @brief Allocate a new mcommon_string_t with a copy of the supplied initializer string and a minimum-capacity buffer * * @param str NUL terminated string, should be valid UTF-8. Must be less than UINT32_MAX bytes long, overlong input * causes a runtime assertion failure. * @returns A new mcommon_string_t that must be freed with mcommon_string_destroy() or * mcommon_string_destroy_with_steal() and bson_free(). */ static BSON_INLINE mcommon_string_t * mcommon_string_new(const char *str) { BSON_ASSERT_PARAM(str); size_t length = strlen(str); BSON_ASSERT(mlib_in_range(uint32_t, length) && (uint32_t)length < UINT32_MAX); return mcommon_string_new_with_capacity(str, (uint32_t)length, 0); } /** * @brief Allocate a new mcommon_string_t, taking ownership of an existing buffer * * @param buffer Buffer to adopt, suitable for bson_free() and bson_realloc(). * @param length Length of the string data, in bytes, not including the required NUL terminator. If string data is * present, it should be valid UTF-8. * @param alloc Actual allocated size of the buffer, in bytes, including room for NUL termination. * @returns A new mcommon_string_t that must be freed with mcommon_string_destroy() or * mcommon_string_destroy_with_steal() and bson_free(). */ mcommon_string_t * mcommon_string_new_with_buffer(char *buffer, uint32_t length, uint32_t alloc); /** * @brief Deallocate a mcommon_string_t and its internal buffer * @param string String allocated with mcommon_string_new, or NULL. */ void mcommon_string_destroy(mcommon_string_t *string); /** * @brief Deallocate a mcommon_string_t and return its internal buffer as a NUL-terminated C string. * @param string String allocated with mcommon_string_new, or NULL. * @returns A freestanding NUL-terminated string in a buffer that must be freed with bson_free(), or NULL if 'string' * was NULL. */ char * mcommon_string_destroy_with_steal(mcommon_string_t *string); /** * @brief Truncate the string to zero length without deallocating the buffer * @param string String to clear */ static BSON_INLINE void mcommon_string_clear(mcommon_string_t *string) { BSON_ASSERT_PARAM(string); string->len = 0; string->str[0] = '\0'; } /** * @brief Test if the string has zero length * @param string String to test */ static BSON_INLINE bool mcommon_string_is_empty(const mcommon_string_t *string) { BSON_ASSERT_PARAM(string); return string->len == 0; } /** * @brief Test if the string begins with a C string * @param string mcommon_string_t to test * @param substring prefix to match, as a NUL terminated C string. */ static BSON_INLINE bool mcommon_string_starts_with_str(const mcommon_string_t *string, const char *substring) { BSON_ASSERT_PARAM(string); BSON_ASSERT_PARAM(substring); size_t substring_len = strlen(substring); uint32_t string_len = string->len; if (mlib_in_range(uint32_t, substring_len) && (uint32_t)substring_len <= string_len) { return 0 == memcmp(string->str, substring, substring_len); } else { return false; } } /** * @brief Test if the string ends with a C string * @param string mcommon_string_t to test * @param substring suffix to match, as a NUL terminated C string. */ static BSON_INLINE bool mcommon_string_ends_with_str(const mcommon_string_t *string, const char *substring) { BSON_ASSERT_PARAM(string); BSON_ASSERT_PARAM(substring); size_t substring_len = strlen(substring); uint32_t string_len = string->len; if (mlib_in_range(uint32_t, substring_len) && (uint32_t)substring_len <= string_len) { uint32_t offset = string_len - (uint32_t)substring_len; return 0 == memcmp(string->str + offset, substring, substring_len); } else { return false; } } /** * @brief Grow a mcommon_string_t buffer if necessary to ensure a minimum capacity * * @param string String allocated with mcommon_string_new * @param capacity Minimum string length, in bytes, the buffer must be able to store without reallocating. Does not * include the NUL terminator. Must be less than UINT32_MAX. * * If a reallocation is necessary, the actual allocation size will be chosen as the next highest power-of-two above the * minimum needed to store 'capacity' as well as the NUL terminator. */ void mcommon_string_grow_to_capacity(mcommon_string_t *string, uint32_t capacity); /** * @brief Set an append operation for this string, with an explicit length limit * @param string String allocated with mcommon_string_new * @param new_append Pointer to an uninitialized mcommon_string_append_t * @param max_len Maximum allowed length for the resulting string, in bytes. Must be less than UINT32_MAX. * * The mcommon_string_append_t does not need to be deallocated. It is no longer usable if the underlying * mcommon_string_t is freed. * * If the string was already over maximum length, it will not be modified. All append operations are guaranteed not to * lengthen the string beyond max_len. Truncations are guaranteed to happen at UTF-8 code point boundaries. */ static BSON_INLINE void mcommon_string_set_append_with_limit(mcommon_string_t *string, mcommon_string_append_t *new_append, uint32_t max_len) { BSON_ASSERT_PARAM(string); BSON_ASSERT_PARAM(new_append); BSON_ASSERT(max_len < UINT32_MAX); new_append->_string = string; new_append->_max_len = max_len; new_append->_max_len_exceeded = false; } /** * @brief Set an append operation for this string * @param string String allocated with mcommon_string_new * @param new_append Pointer to an uninitialized mcommon_string_append_t * * The mcommon_string_append_t does not need to be deallocated. It is no longer usable if the underlying * mcommon_string_t is freed. * * The maximum string length will be set to the largest representable by the data type, UINT32_MAX - 1. */ static BSON_INLINE void mcommon_string_set_append(mcommon_string_t *string, mcommon_string_append_t *new_append) { BSON_ASSERT_PARAM(string); BSON_ASSERT_PARAM(new_append); mcommon_string_set_append_with_limit(string, new_append, UINT32_MAX - 1u); } /** * @brief Allocate an empty mcommon_string_t with the specified initial capacity, and set an append operation for it * with maximum length * @param new_append Pointer to an uninitialized mcommon_string_append_t * @param capacity Initial capacity for the string, in bytes, not including NUL termination * * Allocates a new mcommon_string_t, which will need to be deallocated by the caller. * The mcommon_string_append_t itself does not need to be deallocated. * * The initial mcommon_string_t buffer will be allocated to have room for the given number of string bytes, not * including the NUL terminator. The maximum append length will be set to the largest representable by the data type, * UINT32_MAX - 1. * * This is a shortcut for mcommon_string_new_with_capacity() combined with mcommon_string_set_append(). */ static BSON_INLINE void mcommon_string_new_with_capacity_as_append(mcommon_string_append_t *new_append, uint32_t capacity) { BSON_ASSERT_PARAM(new_append); mcommon_string_set_append(mcommon_string_new_with_capacity("", 0, capacity), new_append); } /** * @brief Allocate an empty mcommon_string_t with default initial capacity, and set an append operation for it with * maximum length * @param new_append Pointer to an uninitialized mcommon_string_append_t * * Allocates a new mcommon_string_t, which will need to be deallocated by the caller. * The mcommon_string_append_t itself does not need to be deallocated. * * The maximum string length will be set to the largest representable by the data type, UINT32_MAX - 1. * The new string will be allocated with a small default capacity. * * This method is intended to be the most convenient way to start growing a string. If a reasonable guess * can be made about the final size of the string, it's better to call mcommon_string_new_with_capacity_as_append() * or mcommon_string_new_with_capacity() and mcommon_string_set_append(). */ static BSON_INLINE void mcommon_string_new_as_append(mcommon_string_append_t *new_append) { BSON_ASSERT_PARAM(new_append); mcommon_string_new_with_capacity_as_append(new_append, 32); } /** * @brief Begin appending to a new empty mcommon_string_t with a given capacity and a matching max append length. * @param new_append Pointer to an uninitialized mcommon_string_append_t * @param capacity Fixed capacity for the string, in bytes, not including NUL termination * * Allocates a new mcommon_string_t, which will need to be deallocated by the caller. * The mcommon_string_append_t itself does not need to be deallocated. * The string buffer will not need to resize for operations performed through the resulting mcommon_string_append_t. */ static BSON_INLINE void mcommon_string_new_as_fixed_capacity_append(mcommon_string_append_t *new_append, uint32_t capacity) { BSON_ASSERT_PARAM(new_append); mcommon_string_set_append_with_limit(mcommon_string_new_with_capacity("", 0, capacity), new_append, capacity); } /** * @brief Check the status of an append operation. * @param append Append operation, initialized with mcommon_string_set_append * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. */ static BSON_INLINE bool mcommon_string_status_from_append(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return !append->_max_len_exceeded; } /** * @brief Get a mcommon_string_t pointer to a mcommon_string_append_t destination. * @param append Append operation, initialized with mcommon_string_set_append * @returns Pointer to the mcommon_string_t destination. * * The mcommon_string_append_t includes a plain mcommon_string_t pointer with no fixed ownership semantics. * Depending on usage, it may be a string with borrowed ownership or the append operation may be its primary owner. */ static BSON_INLINE mcommon_string_t * mcommon_string_from_append(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return append->_string; } /** * @brief Get the current string buffer for an mcommon_string_append_t destination. * @param append Append operation, initialized with mcommon_string_set_append * @returns String buffer pointer, NUL terminated, invalidated if the string is destroyed and by any operation that may * grow the string. * * Shortcut for mcommon_string_from_append(append)->str */ static BSON_INLINE char * mcommon_str_from_append(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return mcommon_string_from_append(append)->str; } /** * @brief Get the current string length for an mcommon_string_append_t destination. * @param append Append operation, initialized with mcommon_string_set_append * @returns Snapshot of the current string length * * Shortcut for mcommon_string_from_append(append)->len */ static BSON_INLINE uint32_t mcommon_strlen_from_append(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return mcommon_string_from_append(append)->len; } /** * @brief Deallocate the mcommon_string_t destination associated with an mcommon_string_append_t * @param append Append operation, initialized with mcommon_string_set_append * The append operation will no longer be usable after this call. */ static BSON_INLINE void mcommon_string_from_append_destroy(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); mcommon_string_destroy(mcommon_string_from_append(append)); } /** * @brief Truncate the append destination string to zero length without deallocating its buffer. * @param append Append operation, initialized with mcommon_string_set_append * This is equivalent to mcommon_string_clear() combined with mcommon_string_from_append(). */ static BSON_INLINE void mcommon_string_from_append_clear(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); mcommon_string_clear(mcommon_string_from_append(append)); } /** * @brief Deallocate the mcommon_string_t destination associated with an mcommon_string_append_t and return its internal * buffer * @param append Append operation, initialized with mcommon_string_set_append * @returns A freestanding NUL-terminated string in a buffer that must be freed with bson_free() * The append operation will no longer be usable after this call. */ static BSON_INLINE char * mcommon_string_from_append_destroy_with_steal(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return mcommon_string_destroy_with_steal(mcommon_string_from_append(append)); } /** * @brief Test if the append destination ends with a C string * @param string mcommon_string_append_t with the string to test * @param substring suffix to match, as a NUL terminated C string. */ static BSON_INLINE bool mcommon_string_from_append_ends_with_str(const mcommon_string_append_t *append, const char *substring) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(substring); return mcommon_string_ends_with_str(mcommon_string_from_append(append), substring); } /** * @brief Test if the append destination has zero length * @param string mcommon_string_append_t with the string to test */ static BSON_INLINE bool mcommon_string_from_append_is_empty(const mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); return mcommon_string_is_empty(mcommon_string_from_append(append)); } /** * @brief Signal an explicit overflow during string append * @param append Append operation, initialized with mcommon_string_set_append * * Future calls to mcommon_string_status_from_append() return false, exactly as if an overlong append was attempted and * failed. This should be used for cases when a logical overflow is occurring but it was detected early enough that no * actual append was attempted. */ static BSON_INLINE void mcommon_string_append_overflow(mcommon_string_append_t *append) { BSON_ASSERT_PARAM(append); append->_max_len_exceeded = true; } /** * @brief Append selected characters from a template * @param append Append operation, initialized with mcommon_string_set_append * @param template UTF-8 string listing allowed characters in the desired order * @param selector UTF-8 string that chooses which template characters are appended * @param selector_len Length of the selector string, in bytes * * Sort and filter lists of option characters. The template should list all allowed options in their desired order. * This implementation does not support multi-byte template characters. ASSERTs that each template character is <= * '\x7f'. Selectors may contain untrusted data, template should not. */ bool mcommon_string_append_selected_chars(mcommon_string_append_t *append, const char *template_, const char *selector, size_t selector_len); /** * @brief Append a string with known length to the mcommon_string_t * @param append Append operation, initialized with mcommon_string_set_append * @param str String to append a copy of, should be valid UTF-8 * @param len Length of 'str', in bytes * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. * * If the string must be truncated to fit in the limit set by mcommon_string_set_append_with_limit, it will always be * split in-between UTF-8 code points. */ static BSON_INLINE bool mcommon_string_append_bytes(mcommon_string_append_t *append, const char *str, uint32_t len) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(str); if (BSON_UNLIKELY(!mcommon_string_status_from_append(append))) { return false; } mcommon_string_t *string = append->_string; char *buffer = string->str; uint64_t alloc = (uint64_t)string->alloc; uint64_t old_len = (uint64_t)string->len; uint64_t max_len = (uint64_t)append->_max_len; uint64_t new_len = old_len + (uint64_t)len; uint64_t new_len_with_nul = new_len + 1; // Fast path: no truncation, no buffer growing if (BSON_LIKELY(new_len <= max_len && new_len_with_nul <= alloc)) { memcpy(buffer + old_len, str, len); buffer[new_len] = '\0'; string->len = (uint32_t)new_len; return true; } // Other cases are not inlined return mcommon_string_append_bytes_internal(append, str, len); } /** * @brief Append a NUL-terminated UTF-8 string to the mcommon_string_t * @param append Append operation, initialized with mcommon_string_set_append * @param str NUL-terminated string to append a copy of * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. * * If the string must be truncated to fit in the limit set by mcommon_string_set_append_with_limit, it will always be * split in-between UTF-8 code points. */ static BSON_INLINE bool mcommon_string_append(mcommon_string_append_t *append, const char *str) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(str); return mcommon_string_append_bytes(append, str, strlen(str)); } /** * @brief Append an entire string with known length to the mcommon_string_t or fail, without truncating. * @param append Append operation, initialized with mcommon_string_set_append * @param str UTF-8 string to append a copy of * @param len Length of 'str', in bytes * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. * * Atomic version of mcommon_string_append_bytes. If string does not fit completely, it is not truncated. * The destination string is only modified if the entire append operation can be completed. */ bool mcommon_string_append_bytes_all_or_none(mcommon_string_append_t *append, const char *str, uint32_t len); /** * @brief Append an entire NUL-terminated UTF-8 string to the mcommon_string_t or fail, without truncating. * @param append Append operation, initialized with mcommon_string_set_append * @param str NUL-terminated UTF-8 sequence to append a copy of * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. * * Atomic version of mcommon_string_append. If string does not fit completely, it is not truncated. * The destination string is only modified if the entire append operation can be completed. */ static BSON_INLINE bool mcommon_string_append_all_or_none(mcommon_string_append_t *append, const char *str) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(str); return mcommon_string_append_bytes_all_or_none(append, str, strlen(str)); } /** * @brief Append base64 encoded bytes to an mcommon_string_t * @param append Append operation, initialized with mcommon_string_set_append * @param bytes Bytes to be encoded * @param len Number of bytes to encoded * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. */ bool mcommon_string_append_base64_encode(mcommon_string_append_t *append, const uint8_t *bytes, uint32_t len); /** * @brief Append an ObjectId as a hex string * @param append Append operation, initialized with mcommon_string_set_append * @param value bson_oid_t value to copy * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. */ bool mcommon_string_append_oid_as_hex(mcommon_string_append_t *append, const bson_oid_t *value); /** * @brief Append printf() formatted text to a mcommon_string_t * @param append Append operation, initialized with mcommon_string_set_append * @param format printf() format string * @param ... Format string arguments * @returns true if the append operation has no permanent error status, and this operation has succeeded. false if the * max length has been surpassed or this printf() experienced an unrecoverable error. * * Writes the printf() result directly into the mcommon_string_t buffer, growing it as needed. * * If the string must be truncated to fit in the limit set by mcommon_string_set_append_with_limit, it will always be * split in-between UTF-8 code points. */ bool mcommon_string_append_printf(mcommon_string_append_t *append, const char *format, ...) BSON_GNUC_PRINTF(2, 3); /** * @brief Variant of mcommon_string_append_printf() that takes a va_list * @param append Append operation, initialized with mcommon_string_set_append * @param format printf() format string * @param args Format string arguments * @returns true if the append operation has no permanent error status, and this operation has succeeded. false if the * max length has been surpassed or this printf() experienced an unrecoverable error. * * Writes the printf() result directly into the mcommon_string_t buffer, growing it as needed. * * If the string must be truncated to fit in the limit set by mcommon_string_set_append_with_limit, it will always be * split in-between UTF-8 code points. */ bool mcommon_string_append_vprintf(mcommon_string_append_t *append, const char *format, va_list args) BSON_GNUC_PRINTF(2, 0); /** * @brief Append one code point to a mcommon_string_t * @param append Append operation, initialized with mcommon_string_set_append * @param unichar Code point to append, as a bson_unichar_t * @returns true if the append operation has no permanent error status. false if the max length has been exceeded. * * Guaranteed not to truncate. The character will fully append or no change will be made. */ static BSON_INLINE bool mcommon_string_append_unichar(mcommon_string_append_t *append, bson_unichar_t unichar) { BSON_ASSERT_PARAM(append); if (BSON_UNLIKELY(!mcommon_string_status_from_append(append))) { return false; } mcommon_string_t *string = append->_string; BSON_ASSERT(string); char *buffer = string->str; uint64_t alloc = (uint64_t)string->alloc; uint64_t old_len = (uint64_t)string->len; uint64_t max_len = (uint64_t)append->_max_len; // Fast path: single-byte character, no truncation, no buffer growing if (BSON_LIKELY(unichar <= 0x7f)) { uint64_t new_len = old_len + 1; uint64_t new_len_with_nul = new_len + 1; if (BSON_LIKELY(new_len <= max_len && new_len_with_nul <= alloc)) { buffer[old_len] = (char)unichar; buffer[new_len] = '\0'; string->len = new_len; return true; } } // Other cases are not inlined return mcommon_string_append_unichar_internal(append, unichar); } #endif /* MONGO_C_DRIVER_COMMON_STRING_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-string.c000066400000000000000000000334541511661753600221760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include mcommon_string_t * mcommon_string_new_with_capacity(const char *str, uint32_t length, uint32_t min_capacity) { BSON_ASSERT_PARAM(str); BSON_ASSERT(length < UINT32_MAX && min_capacity < UINT32_MAX); uint32_t capacity = BSON_MAX(length, min_capacity); uint32_t alloc = capacity + 1u; char *buffer = bson_malloc(alloc); memcpy(buffer, str, length); buffer[length] = '\0'; return mcommon_string_new_with_buffer(buffer, length, alloc); } mcommon_string_t * mcommon_string_new_with_buffer(char *buffer, uint32_t length, uint32_t alloc) { BSON_ASSERT_PARAM(buffer); BSON_ASSERT(length < UINT32_MAX && alloc >= length + 1u); BSON_ASSERT(buffer[length] == '\0'); mcommon_string_t *string = bson_malloc0(sizeof *string); string->str = buffer; string->len = length; string->alloc = alloc; return string; } void mcommon_string_destroy(mcommon_string_t *string) { if (string) { bson_free(mcommon_string_destroy_with_steal(string)); } } char * mcommon_string_destroy_with_steal(mcommon_string_t *string) { if (string) { char *buffer = string->str; BSON_ASSERT(buffer[string->len] == '\0'); bson_free(string); return buffer; } else { return NULL; } } void mcommon_string_grow_to_capacity(mcommon_string_t *string, uint32_t capacity) { BSON_ASSERT_PARAM(string); BSON_ASSERT(capacity < UINT32_MAX); uint32_t min_alloc_needed = capacity + 1u; if (string->alloc < min_alloc_needed) { uint32_t alloc = mcommon_next_power_of_two_u32(min_alloc_needed); string->str = bson_realloc(string->str, alloc); string->alloc = alloc; } } // Handle cases omitted from the inlined mcommon_string_append_bytes() bool mcommon_string_append_bytes_internal(mcommon_string_append_t *append, const char *str, uint32_t len) { mcommon_string_t *string = append->_string; BSON_ASSERT(string); uint32_t old_len = string->len; uint32_t max_len = append->_max_len; BSON_ASSERT(max_len < UINT32_MAX); uint32_t max_append_len = old_len < max_len ? max_len - old_len : 0; uint32_t truncated_append_len = len; if (len > max_append_len) { // Search for an actual append length, <= the maximum allowed, which preserves UTF-8 validity append->_max_len_exceeded = true; truncated_append_len = mcommon_utf8_truncate_len(str, max_append_len); } uint32_t new_len = old_len + truncated_append_len; BSON_ASSERT(new_len <= max_len); mcommon_string_grow_to_capacity(string, new_len); char *buffer = string->str; memcpy(buffer + old_len, str, truncated_append_len); buffer[new_len] = '\0'; string->len = new_len; return mcommon_string_status_from_append(append); } // Variant of mcommon_string_append_bytes() that grows but never truncates bool mcommon_string_append_bytes_all_or_none(mcommon_string_append_t *append, const char *str, uint32_t len) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(str); if (BSON_UNLIKELY(!mcommon_string_status_from_append(append))) { return false; } mcommon_string_t *string = append->_string; BSON_ASSERT(string); uint32_t old_len = string->len; uint32_t max_len = append->_max_len; BSON_ASSERT(max_len < UINT32_MAX); uint32_t max_append_len = old_len < max_len ? max_len - old_len : 0; if (len > max_append_len) { append->_max_len_exceeded = true; return false; } uint32_t new_len = old_len + len; BSON_ASSERT(new_len <= max_len); mcommon_string_grow_to_capacity(string, new_len); char *buffer = string->str; memcpy(buffer + old_len, str, len); buffer[new_len] = '\0'; string->len = new_len; return mcommon_string_status_from_append(append); } bool mcommon_string_append_unichar_internal(mcommon_string_append_t *append, bson_unichar_t unichar) { mcommon_string_t *string = append->_string; uint32_t old_len = string->len; uint32_t max_len = append->_max_len; BSON_ASSERT(max_len < UINT32_MAX); char max_utf8_sequence[6]; uint32_t max_append_len = old_len < max_len ? max_len - old_len : 0; // Usually we can write the UTF-8 sequence directly if (BSON_LIKELY(max_append_len >= sizeof max_utf8_sequence)) { uint32_t actual_sequence_len; mcommon_string_grow_to_capacity(string, old_len + sizeof max_utf8_sequence); char *buffer = string->str; mcommon_utf8_from_unichar(unichar, buffer + old_len, &actual_sequence_len); BSON_ASSERT(actual_sequence_len <= sizeof max_utf8_sequence); BSON_ASSERT(append->_max_len_exceeded == false); uint32_t new_len = old_len + actual_sequence_len; buffer[new_len] = '\0'; string->len = new_len; return true; } // If we are near max_len, avoid growing the buffer beyond it. uint32_t actual_sequence_len; mcommon_utf8_from_unichar(unichar, max_utf8_sequence, &actual_sequence_len); return mcommon_string_append_bytes_internal(append, max_utf8_sequence, actual_sequence_len); } bool mcommon_string_append_base64_encode(mcommon_string_append_t *append, const uint8_t *bytes, uint32_t len) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(bytes); if (BSON_UNLIKELY(!mcommon_string_status_from_append(append))) { return false; } mcommon_string_t *string = append->_string; uint32_t old_len = string->len; uint32_t max_len = append->_max_len; BSON_ASSERT(max_len < UINT32_MAX); uint32_t max_append_len = old_len < max_len ? max_len - old_len : 0; // Note that mcommon_b64_ntop_calculate_target_size includes room for NUL. // mcommon_b64_ntop includes NUL in the input (buffer size) but not in the return value (string length). size_t encoded_target_len = mcommon_b64_ntop_calculate_target_size((size_t)len) - 1; if (encoded_target_len <= (size_t)max_append_len) { // No truncation needed. Grow the buffer and encode directly. mcommon_string_grow_to_capacity(string, old_len + encoded_target_len); const int tgt = mcommon_b64_ntop(bytes, (size_t)len, string->str + old_len, encoded_target_len + 1); BSON_ASSERT(mlib_cmp(encoded_target_len, ==, tgt)); BSON_ASSERT(mlib_in_range(uint32_t, encoded_target_len)); string->len = old_len + (uint32_t)encoded_target_len; return true; } else if (max_append_len == 0) { // Truncation to a zero-length append mcommon_string_append_overflow(append); return false; } else { /* We expect to append at least one byte, and truncate. * Encoding only produces single-byte UTF-8 sequences, so the result always has exactly the maximum length. * * mcommon_b64_ntop() can't truncate without failing. To do this without allocating a full size temporary buffer * or rewriting mcommon_b64_ntop, we can partition the write into three parts: a 'direct' portion made from entire * non-truncated units of 3 bytes in and 4 characters out, a truncated 'remainder', and an ignored portion. * Remainders longer than 3 bytes in / 4 bytes out are never necessary, and further portions of the input data * will not be used. */ mcommon_string_grow_to_capacity(string, max_len); char *buffer = string->str; uint32_t remainder_truncated_len = max_append_len % 4; uint32_t direct_encoded_len = max_append_len - remainder_truncated_len; uint32_t direct_input_len = mcommon_b64_pton_calculate_target_size((size_t)direct_encoded_len); BSON_ASSERT(direct_input_len % 3 == 0); BSON_ASSERT(direct_input_len < len); const int tgt = mcommon_b64_ntop(bytes, (size_t)direct_input_len, string->str + old_len, direct_encoded_len + 1); BSON_ASSERT(mlib_cmp(direct_encoded_len, ==, tgt)); char remainder_buffer[5]; uint32_t remainder_input_len = BSON_MIN(3, len - direct_input_len); BSON_ASSERT(remainder_input_len > 0); uint32_t remainder_encoded_len = mcommon_b64_ntop_calculate_target_size((size_t)remainder_input_len) - 1; BSON_ASSERT(remainder_encoded_len > remainder_truncated_len); const int t2 = mcommon_b64_ntop( bytes + direct_input_len, (size_t)remainder_input_len, remainder_buffer, sizeof remainder_buffer); BSON_ASSERT(mlib_cmp(remainder_encoded_len, ==, t2)); memcpy(buffer + old_len + direct_encoded_len, remainder_buffer, remainder_encoded_len); BSON_ASSERT(old_len + direct_encoded_len + remainder_truncated_len == max_len); buffer[max_len] = '\0'; string->len = max_len; mcommon_string_append_overflow(append); return false; } } bool mcommon_string_append_oid_as_hex(mcommon_string_append_t *append, const bson_oid_t *value) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(value); char oid_str[25]; bson_oid_to_string(value, oid_str); return mcommon_string_append(append, oid_str); } bool mcommon_string_append_selected_chars(mcommon_string_append_t *append, const char *tmplt, const char *selector, size_t selector_len) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(tmplt); BSON_ASSERT_PARAM(selector); for (uint8_t template_char; (template_char = (uint8_t)*tmplt); tmplt++) { BSON_ASSERT(template_char <= 0x7f); if (memchr(selector, template_char, selector_len) && !mcommon_string_append_unichar(append, template_char)) { return false; } } return mcommon_string_status_from_append(append); } bool mcommon_string_append_printf(mcommon_string_append_t *append, const char *format, ...) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(format); va_list args; va_start(args, format); bool ret = mcommon_string_append_vprintf(append, format, args); va_end(args); return ret; } bool mcommon_string_append_vprintf(mcommon_string_append_t *append, const char *format, va_list args) { BSON_ASSERT_PARAM(append); BSON_ASSERT_PARAM(format); if (BSON_UNLIKELY(!mcommon_string_status_from_append(append))) { return false; } mcommon_string_t *string = append->_string; uint32_t old_len = string->len; uint32_t max_len = append->_max_len; BSON_ASSERT(max_len < UINT32_MAX); uint32_t max_append_len = old_len < max_len ? max_len - old_len : 0; // Initial minimum buffer length; increases on retry. uint32_t min_format_buffer_capacity = 16; while (true) { // Allocate room for a format buffer at the end of the string. // It will be at least this round's min_format_buffer_capacity, but if we happen to have extra space allocated we // do want that to be available to vsnprintf(). min_format_buffer_capacity = BSON_MIN(min_format_buffer_capacity, max_append_len); mcommon_string_grow_to_capacity(string, old_len + min_format_buffer_capacity); uint32_t alloc = string->alloc; BSON_ASSERT(alloc > 0 && alloc - 1u >= old_len); char *format_buffer = string->str + old_len; uint32_t actual_format_buffer_capacity = BSON_MIN(alloc - 1u - old_len, max_append_len); BSON_ASSERT(actual_format_buffer_capacity >= min_format_buffer_capacity); BSON_ASSERT(actual_format_buffer_capacity < UINT32_MAX); uint32_t format_buffer_alloc = actual_format_buffer_capacity + 1u; va_list args_copy; va_copy(args_copy, args); int format_result = bson_vsnprintf(format_buffer, format_buffer_alloc, format, args_copy); va_end(args_copy); if (format_result > -1 && mlib_in_range(uint32_t, format_result) && (uint32_t)format_result <= actual_format_buffer_capacity) { // Successful result, no truncation. format_buffer[format_result] = '\0'; string->len = old_len + (uint32_t)format_result; BSON_ASSERT(string->len <= append->_max_len); BSON_ASSERT(append->_max_len_exceeded == false); return true; } if (actual_format_buffer_capacity == max_append_len) { // No more space to grow into, this must be the final result. if (format_result > -1 && mlib_in_range(uint32_t, format_result) && (uint32_t)format_result < UINT32_MAX) { // We have truncated output from vsnprintf. Clean it up by removing // any partial UTF-8 sequences that might be left on the end. uint32_t truncated_append_len = mcommon_utf8_truncate_len( format_buffer, BSON_MIN(actual_format_buffer_capacity, (uint32_t)format_result)); BSON_ASSERT(truncated_append_len <= actual_format_buffer_capacity); format_buffer[truncated_append_len] = '\0'; string->len = old_len + truncated_append_len; append->_max_len_exceeded = true; return false; } // Error from vsnprintf; This operation fails, but we do not set max_len_exceeded. return false; } // Choose a larger format_buffer_len and try again. Length will be clamped to max_append_len above. if (format_result > -1 && mlib_in_range(uint32_t, format_result) && (uint32_t)format_result < UINT32_MAX) { min_format_buffer_capacity = (uint32_t)format_result + 1u; } else if (min_format_buffer_capacity < UINT32_MAX / 2) { min_format_buffer_capacity *= 2; } else { min_format_buffer_capacity = UINT32_MAX - 1u; } } } mongo-c-driver-2.2.1/src/common/src/common-thread-private.h000066400000000000000000000171011511661753600236030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #ifndef MONGO_C_DRIVER_COMMON_THREAD_PRIVATE_H #define MONGO_C_DRIVER_COMMON_THREAD_PRIVATE_H #include #include #include BSON_BEGIN_DECLS #define mcommon_thread_create COMMON_NAME(thread_create) #define mcommon_thread_join COMMON_NAME(thread_join) #if defined(BSON_OS_UNIX) #include #define BSON_ONCE_FUN(n) void n(void) #define BSON_ONCE_RETURN return #define BSON_ONCE_INIT PTHREAD_ONCE_INIT #define bson_once(o, c) \ do { \ BSON_ASSERT(pthread_once((o), (c)) == 0); \ } while (0) #define bson_once_t pthread_once_t #define bson_thread_t pthread_t #define BSON_THREAD_FUN(_function_name, _arg_name) void *(_function_name)(void *(_arg_name)) #define BSON_THREAD_FUN_TYPE(_function_name) void *(*(_function_name))(void *) #define BSON_THREAD_RETURN return NULL /* this macro can be defined as a as a build configuration option * with -DENABLE_DEBUG_ASSERTIONS=ON. its purpose is to allow for functions * that require a mutex to be locked on entry to assert that the mutex * is actually locked. * this can prevent bugs where a caller forgets to lock the mutex. */ #ifndef MONGOC_ENABLE_DEBUG_ASSERTIONS #define bson_mutex_destroy(m) \ do { \ BSON_ASSERT(pthread_mutex_destroy((m)) == 0); \ } while (0) #define bson_mutex_init(_n) \ do { \ BSON_ASSERT(pthread_mutex_init((_n), NULL) == 0); \ } while (0) #define bson_mutex_lock(m) \ do { \ BSON_ASSERT(pthread_mutex_lock((m)) == 0); \ } while (0) #define bson_mutex_t pthread_mutex_t #define bson_mutex_unlock(m) \ do { \ BSON_ASSERT(pthread_mutex_unlock((m)) == 0); \ } while (0) #else #include typedef struct { pthread_t lock_owner; pthread_mutex_t wrapped_mutex; bool valid_tid; } bson_mutex_t; #define bson_mutex_destroy(mutex) \ do { \ BSON_ASSERT(pthread_mutex_destroy(&(mutex)->wrapped_mutex) == 0); \ } while (0); #define bson_mutex_init(mutex) \ do { \ BSON_ASSERT(pthread_mutex_init(&(mutex)->wrapped_mutex, NULL) == 0); \ (mutex)->valid_tid = false; \ } while (0); #define bson_mutex_lock(mutex) \ do { \ BSON_ASSERT(pthread_mutex_lock(&(mutex)->wrapped_mutex) == 0); \ (mutex)->lock_owner = pthread_self(); \ (mutex)->valid_tid = true; \ } while (0); #define bson_mutex_unlock(mutex) \ do { \ (mutex)->valid_tid = false; \ BSON_ASSERT(pthread_mutex_unlock(&(mutex)->wrapped_mutex) == 0); \ } while (0); #endif #else #include #define BSON_ONCE_FUN(n) \ BOOL CALLBACK MLIB_PRAGMA_IF_MSVC(warning(push)) MLIB_PRAGMA_IF_MSVC(warning(disable : 4100)) \ n(PINIT_ONCE _ignored_a, PVOID _ignored_b, PVOID *_ignored_c) MLIB_PRAGMA_IF_MSVC(warning(pop)) #define BSON_ONCE_INIT INIT_ONCE_STATIC_INIT #define BSON_ONCE_RETURN return true #define bson_mutex_destroy DeleteCriticalSection #define bson_mutex_init InitializeCriticalSection #define bson_mutex_lock EnterCriticalSection #define bson_mutex_t CRITICAL_SECTION #define bson_mutex_unlock LeaveCriticalSection #define bson_once(o, c) \ do { \ BSON_ASSERT(InitOnceExecuteOnce((o), (c), NULL, NULL)); \ } while (0) #define bson_once_t INIT_ONCE #define bson_thread_t HANDLE #define BSON_THREAD_FUN(_function_name, _arg_name) unsigned(__stdcall _function_name)(void *(_arg_name)) #define BSON_THREAD_FUN_TYPE(_function_name) unsigned(__stdcall * _function_name)(void *) #define BSON_THREAD_RETURN return 0 #endif /* Functions that require definitions get the common prefix (_mongoc for * libmongoc or _bson for libbson) to avoid duplicate symbols when linking both * libbson and libmongoc statically. */ int mcommon_thread_join(bson_thread_t thread); // mcommon_thread_create returns 0 on success. Returns a non-zero error code on // error. Callers may use `bson_strerror_r` to get an error message from the // returned error code. int mcommon_thread_create(bson_thread_t *thread, BSON_THREAD_FUN_TYPE(func), void *arg); #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) #define mcommon_mutex_is_locked COMMON_NAME(mutex_is_locked) bool mcommon_mutex_is_locked(bson_mutex_t *mutex); #endif /** * @brief A shared mutex (a read-write lock) * * A shared mutex can be locked in 'shared' mode or 'exclusive' mode. Only one * thread may hold exclusive mode at a time. Any number of threads may hold * the lock in shared mode simultaneously. No thread can hold in exclusive mode * while another thread holds in shared mode, and vice-versa. */ typedef struct bson_shared_mutex_t { BSON_IF_WINDOWS(SRWLOCK native;) BSON_IF_POSIX(pthread_rwlock_t native;) } bson_shared_mutex_t; static BSON_INLINE void bson_shared_mutex_init(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS(InitializeSRWLock(&mtx->native)); BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_init(&mtx->native, NULL) == 0);) } static BSON_INLINE void bson_shared_mutex_destroy(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS((void)mtx;) BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_destroy(&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_lock_shared(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS(AcquireSRWLockShared(&mtx->native);) BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_rdlock(&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_lock(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS(AcquireSRWLockExclusive(&mtx->native);) BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_wrlock(&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_unlock(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS(ReleaseSRWLockExclusive(&mtx->native);) BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_unlock(&mtx->native) == 0);) } static BSON_INLINE void bson_shared_mutex_unlock_shared(bson_shared_mutex_t *mtx) { BSON_IF_WINDOWS(ReleaseSRWLockShared(&mtx->native);) BSON_IF_POSIX(BSON_ASSERT(pthread_rwlock_unlock(&mtx->native) == 0);) } BSON_END_DECLS #endif /* MONGO_C_DRIVER_COMMON_THREAD_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/common-thread.c000066400000000000000000000035741511661753600221370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #if defined(BSON_OS_UNIX) int mcommon_thread_create(bson_thread_t *thread, BSON_THREAD_FUN_TYPE(func), void *arg) { BSON_ASSERT_PARAM(thread); BSON_ASSERT_PARAM(func); BSON_OPTIONAL_PARAM(arg); // optional. return pthread_create(thread, NULL, func, arg); } int mcommon_thread_join(bson_thread_t thread) { return pthread_join(thread, NULL); } #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) bool mcommon_mutex_is_locked(bson_mutex_t *mutex) { return mutex->valid_tid && pthread_equal(pthread_self(), mutex->lock_owner); } #endif #else int mcommon_thread_create(bson_thread_t *thread, BSON_THREAD_FUN_TYPE(func), void *arg) { BSON_ASSERT_PARAM(thread); BSON_ASSERT_PARAM(func); BSON_OPTIONAL_PARAM(arg); // optional. *thread = (HANDLE)_beginthreadex(NULL, 0, func, arg, 0, NULL); if (0 == *thread) { return errno; } return 0; } int mcommon_thread_join(bson_thread_t thread) { int ret; /* zero indicates success for WaitForSingleObject. */ ret = WaitForSingleObject(thread, INFINITE); if (WAIT_OBJECT_0 != ret) { return ret; } /* zero indicates failure for CloseHandle. */ ret = CloseHandle(thread); if (0 == ret) { return 1; } return 0; } #endif mongo-c-driver-2.2.1/src/common/src/common-utf8-private.h000066400000000000000000000122241511661753600232230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGO_C_DRIVER_COMMON_UTF8_PRIVATE_H #define MONGO_C_DRIVER_COMMON_UTF8_PRIVATE_H #include /* *-------------------------------------------------------------------------- * * mcommon_utf8_get_sequence -- * * Determine the sequence length of the first UTF-8 character in * @utf8. The sequence length is stored in @seq_length and the mask * for the first character is stored in @first_mask. * * Returns: * None. * * Side effects: * @seq_length is set. * @first_mask is set. * *-------------------------------------------------------------------------- */ static BSON_INLINE void mcommon_utf8_get_sequence(const char *utf8, /* IN */ uint8_t *seq_length, /* OUT */ uint8_t *first_mask) /* OUT */ { unsigned char c = *(const unsigned char *)utf8; uint8_t m; uint8_t n; /* * See the following[1] for a description of what the given multi-byte * sequences will be based on the bits set of the first byte. We also need * to mask the first byte based on that. All subsequent bytes are masked * against 0x3F. * * [1] http://www.joelonsoftware.com/articles/Unicode.html */ if ((c & 0x80) == 0) { n = 1; m = 0x7F; } else if ((c & 0xE0) == 0xC0) { n = 2; m = 0x1F; } else if ((c & 0xF0) == 0xE0) { n = 3; m = 0x0F; } else if ((c & 0xF8) == 0xF0) { n = 4; m = 0x07; } else { n = 0; m = 0; } *seq_length = n; *first_mask = m; } /* *-------------------------------------------------------------------------- * * mcommon_utf8_from_unichar -- * * Converts the unichar to a sequence of utf8 bytes and stores those * in @utf8. The number of bytes in the sequence are stored in @len. * * Parameters: * @unichar: A bson_unichar_t. * @utf8: A location for the multi-byte sequence. * @len: A location for number of bytes stored in @utf8. * * Returns: * None. * * Side effects: * @utf8 is set. * @len is set. * *-------------------------------------------------------------------------- */ static BSON_INLINE void mcommon_utf8_from_unichar(bson_unichar_t unichar, /* IN */ char utf8[BSON_ENSURE_ARRAY_PARAM_SIZE(6)], /* OUT */ uint32_t *len) /* OUT */ { BSON_ASSERT_PARAM(len); if (unichar <= 0x7F) { utf8[0] = unichar; *len = 1; } else if (unichar <= 0x7FF) { *len = 2; utf8[0] = 0xC0 | ((unichar >> 6) & 0x3F); utf8[1] = 0x80 | ((unichar) & 0x3F); } else if (unichar <= 0xFFFF) { *len = 3; utf8[0] = 0xE0 | ((unichar >> 12) & 0xF); utf8[1] = 0x80 | ((unichar >> 6) & 0x3F); utf8[2] = 0x80 | ((unichar) & 0x3F); } else if (unichar <= 0x1FFFFF) { *len = 4; utf8[0] = 0xF0 | ((unichar >> 18) & 0x7); utf8[1] = 0x80 | ((unichar >> 12) & 0x3F); utf8[2] = 0x80 | ((unichar >> 6) & 0x3F); utf8[3] = 0x80 | ((unichar) & 0x3F); } else { *len = 0; } } /* * @brief Calculate a truncation length that preserves UTF-8 validity * @param str String data, at least 'len' bytes long. * @returns A new length <= 'len' * * When 'str' is a valid UTF-8 string with length >= 'len' bytes, * this calculates a new length, less than or equal to 'len', which * guarantees that the string will be truncated in-between code points. */ static BSON_INLINE uint32_t mcommon_utf8_truncate_len(const char *str, uint32_t len) { uint32_t resulting_len = len; while (resulting_len > 0) { if (BSON_LIKELY((uint8_t)str[resulting_len - 1u] <= 0x7f)) { // Single-byte sequence, always a fine place to stop return resulting_len; } // Search for the last byte that could begin a UTF-8 sequence uint32_t seq_begin_at = resulting_len - 1u; while (((uint8_t)str[seq_begin_at] & 0xc0) == 0x80) { if (seq_begin_at > 0) { seq_begin_at--; } else { return 0; } } uint8_t seq_length, first_mask_unused; mcommon_utf8_get_sequence(str + seq_begin_at, &seq_length, &first_mask_unused); if (seq_begin_at + seq_length == resulting_len) { // Sequence is complete, we can truncate here. return resulting_len; } // Sequence was truncated or invalid; resume search prior to it's beginning. resulting_len = seq_begin_at; } return 0; } #endif /* MONGO_C_DRIVER_COMMON_UTF8_PRIVATE_H */ mongo-c-driver-2.2.1/src/common/src/mlib/000077500000000000000000000000001511661753600201505ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/common/src/mlib/ckdint.h000066400000000000000000000702451511661753600216050ustar00rootroot00000000000000/** * @file mlib/ckdint.h * @brief Checked integer arithmetic * @date 2025-02-04 * * This file implements the C23 checked-integer-arithmetic functions as macros. * * The function-like macros are defined: * * - `mlib_add(Dst, L, R)` / `mlib_add(Dst, A)` * - `mlib_sub(Dst, L, R)` / `mlib_sub(Dst, A)` * - `mlib_mul(Dst, L, R)` / `mlib_mul(Dst, A)` * - `mlib_narrow(Dst, V)` (not from stdckdint, but defined as `mlib_add(Dst, V, 0)`) * * Where `Dst` is a pointer to integral storage, and `L` and `R` are arbitrary * integral expressions. The two-argument variants treat `Dst` as the the left-hand * operand for in-place arithmetic. * * Each macro accepts arguments of arbitrary type at any position, and will "do * the right thing", regardless of the parameter types. No funny integer promotion, * sign extension, sign conversion, nor implicit narrowing. The macros return `false` * if-and-only-if the result was lossless. They return `true` if-and-only-if the * value written to `Dst` does not represent the true arithmetic result. * * The following additional macros are defined: * * - `mlib_assert_add(T, L, R)` * - `mlib_assert_sub(T, L, R)` * - `mlib_assert_mul(T, L, R)` * * Where `T` is an integer type. The macro will yield a value of that type, asserting * that the operation on `L` and `R` does not overflow. If the operation overflows, * the program will be terminated with a diagnostic to `stderr` pointing to the call site. * * For implementation details and a usage guide, see `ckdint.md` * * @copyright Copyright (c) 2025 * * 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. */ #pragma once #include #include #include #include #include #include #include mlib_extern_c_begin(); /** * @brief Perform integer addition * * @param Out A non-null pointer to a modifiable integer. * @param A The left-hand addend of addition * @param B The right-hand addend of addition * @retval `true` if the value written to `Out` does not represent the true arithmetic sum. * @retval `false` Otherwise. * * The sum `A + B` is written to `Out`. The operation is commutative. * * If the argument `B` is omitted, computes `*Out + A` (performs in-place addition). */ #define mlib_add(...) MLIB_ARGC_PICK(_mlib_ckdint, mlib_add, __VA_ARGS__) /** * @brief Perform integer subtraction * * @param Out A non-null pointer to a modifiable integer. * @param A The left-hand operand of the subtraction (minuend) * @param B The right-hand operand of subtraction (subtrahend) * @retval `true` if the value written to `Out` does not represent the true arithmetic difference. * @retval `false` Otherwise. * * The difference `A - B` will be written to `Out`. * * If the argument `B` is omitted, computes `*Out - A` (performs in-place subtraction) */ #define mlib_sub(...) MLIB_ARGC_PICK(_mlib_ckdint, mlib_sub, __VA_ARGS__) /** * @brief Perform integer multiplication * * @param Out A non-null pointer to a modifiable integer. * @param A The left-hand factor of multiplication * @param B The right-hand factor of multiplication * @retval `true` if the value written to `Out` does not represent the true arithmetic product. * @retval `false` Otherwise. * * The product `A × B` will be written to `Out`. The operation is commutative. * * If the argument `B` is omitted, computes `Out × A` (performs in-place multiplication) */ #define mlib_mul(...) MLIB_ARGC_PICK(_mlib_ckdint, mlib_mul, __VA_ARGS__) /** * @brief Perform narrowing assignment from one integer value to another. * * @param Out A non-null pointer to a modifiable integer. * @param A The integer value to be narrowed. * @retval `true` if the value written to `Out` is not equivalent to the value of `A` * @retval `false` otherwise */ #define mlib_narrow(O, A) mlib_add((O), (A), 0) /** * @brief Perform an asserting addition, yielding the result * * @param T The target type of the operation * @param A The left-hand addend for the addition * @param B The right-hand addend for the addition * @return The sum `A + B` as type `T` * * If the true arithmetic sum is not representable in `T`, the program terminates. */ #define mlib_assert_add(T, A, B) \ _mlib_assert_ckdint(T, A, B, &mlib_add, "mlib_assert_add", #T, #A, #B, mlib_this_source_location()) /** * @brief Perform an asserting subtraction, yielding the result * * @param T The target type of the operation * @param A The left-hand minuend for the subtraction * @param B The right-hand subtrahend for the subtraction * @return The difference `A - B` as type `T` * * If the true arithmetic difference is not representable in `T`, the program terminates. */ #define mlib_assert_sub(T, A, B) \ _mlib_assert_ckdint(T, A, B, &mlib_sub, "mlib_assert_sub", #T, #A, #B, mlib_this_source_location()) /** * @brief Perform an asserting multiplication, yielding the result * * @param T The target type of the operation * @param A The left-hand factor for the multiplication * @param B The right-hand factor for the multiplication * @return The product `A × B` as type `T` * * If the true arithmetic product is not representable in `T`, the program terminates. */ #define mlib_assert_mul(T, A, B) \ _mlib_assert_ckdint(T, A, B, &mlib_mul, "mlib_assert_mul", #T, #A, #B, mlib_this_source_location()) /** * @brief Perform a runtime-checked cast of an integral value to another type. * * @param T A type specifier for a target integral type for the cast. * @param Operand The integral value to be converted. * * If the cast would result in the operand value changing, the program will be * terminated with a diagnostic. */ #define mlib_assert_narrow(T, Operand) \ (T) _mlib_checked_cast( \ mlib_minof(T), mlib_maxof(T), mlib_upsize_integer(Operand), #T, #Operand, mlib_this_source_location()) #define _mlib_ckdint_argc_3(Fn, Out, Arg) _mlib_ckdint_argc_4(Fn, Out, *(Out), Arg) #define _mlib_ckdint_argc_4(Fn, O, A, B) \ _mlib_ckdint(O, \ sizeof(*(O)), \ _mlibClobberIsSigned(*(O), 0) ? (intmax_t)_mlibMinofSigned(*(O)) : _mlibMinofUnsigned(*(O)), \ _mlibClobberIsSigned(*(O), 1) ? _mlibMaxofSigned(*(O)) : _mlibMaxofUnsigned(*(O)), \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ &Fn) // Impl macro for the asserting checked arithmetic functions #define _mlib_assert_ckdint(T, A, B, Fn, F_str, T_str, A_str, B_str, Here) \ ((T)_mlib_assert_ckdint(sizeof(T), \ mlib_minof(T), \ mlib_maxof(T), \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ Fn, \ F_str, \ T_str, \ A_str, \ B_str, \ Here)) // clang-format off // Generates an 0b11111 bit pattern for appropriate size: #define _mlibMaxofUnsigned(V) \ /* NOLINTNEXTLINE(bugprone-sizeof-expression) */ \ mlib_bits(mlib_bitsizeof((V)), 0) // Generates an 0b01111 bit pattern for the two's complement max value: #define _mlibMaxofSigned(V) \ /* NOLINTNEXTLINE(bugprone-sizeof-expression) */ \ mlib_bits(mlib_bitsizeof(V) - 1u, 0) // Generates an 0b10000... bit pattern for the two's complement min value: #define _mlibMinofSigned(V) \ /* NOLINTNEXTLINE(bugprone-sizeof-expression) */ \ (0 - mlib_bits(1, mlib_bitsizeof(V) - 1u)) // For completeness: #define _mlibMinofUnsigned(V) 0 // Yields true iff the operand expression has a signed type, but requires that // the operand is a modifiable l-value. The `N` must be 0 or 1, arbitrarily (see below). #define _mlibClobberIsSigned(V, N) \ MLIB_IF_ELSE(mlib_have_typeof()) \ /* Prefer using typeof(), if we can. */ \ (mlib_is_signed(mlib_typeof(V))) \ /* Otherwise, do a dance: */ \ (( \ /* Save the value of V */ \ _mlibSignCheckTmp[N] = 0ull | (uintmax_t) (V), \ /* Set V to zero, and check whether decrementing results in a negative value */ \ (V) = 0, \ _mlibSignCheckResult[N] = (--(V) < 0), \ /* Restore the value of V (bit hacks to prevent conversion warnings) */ \ (V) = 0, \ (V) |= _mlibSignCheckTmp[N], \ /* Yield the sign-check result */ \ _mlibSignCheckResult[N] \ )) // Storage for `_mlibClobberIsSigned`. We use more than one storage space to prevent // unsequenced-operation warnings when we use `_mlibClobberIsSigned` multiple times // in a function argument list. GCC and Clang are able to easily elide these from // an optimized TU. MSVC has trouble, but is still able to constant-fold where it matters. static mlib_maybe_unused mlib_thread_local uintmax_t _mlibSignCheckTmp[2]; static mlib_maybe_unused mlib_thread_local bool _mlibSignCheckResult[2]; // clang-format on // Compile-time assert that the compiler's integer conversions obey two's complement encoding mlib_static_assert((intmax_t)UINTMAX_MAX == -1 // && (intmax_t)(UINTMAX_MAX - 5) == -6, "This file requires two's complement signed integers"); /** * @brief Function signature for checked arithmetic support functions * * The function operates on max-precision integers of either sign, and should * return true iff the arithmetic operation overflows for the given sign configuration. * * @param dst The output parameter for the operation. Never a null pointer. * @param dst_signed Whether to treat the result as a signed integer * @param a_signed Whether to treat the `a` operand as signed * @param a The left-hand operand of the operation * @param b_signed Whether to treat the `b` operand as signed * @param b The right-hand operand of the operation * * @note This was original written to use `mlib_upscaled_integer` for `a/b/dst`, but * this defeats MSVC's ability to inline an indirect call through a constant-folded function * pointer with this signature. GCC and Clang handle this fine, but for MSVC performance * the more verbose signature is used. */ typedef bool (*_mlib_ckdint_arith_fn)( uintmax_t *dst, bool dst_signed, bool a_signed, uintmax_t a, bool b_signed, uintmax_t b); // Support function for the `mlib_add` macro static inline bool(mlib_add)(uintmax_t *dst, bool dst_signed, bool a_signed, uintmax_t a, bool b_signed, uintmax_t b) mlib_noexcept { // Perform regular wrapping arithmetic on the unsigned value. The bit pattern // is equivalent if there is two's complement signed arithmetic. const uintmax_t sum = *dst = a + b; const uintmax_t signbit = mlib_bits(1, mlib_bitsizeof(uintmax_t) - 1u); // Now we check whether that overflowed according to the sign configuration. // We use some bit fiddling magic that treat the signbit as a boolean for // "is this number negative?" or "is this number “large†(i.e. bigger than signed-max)?" // The expanded verbose form of each bit-magic is written below the more esoteric cases if (dst_signed) { if (a_signed) { if (b_signed) { // S = S + S return signbit & (sum ^ a) & (sum ^ b); // Expanded: // Test whether the product sign is unequal to both input signs // X ^ Y yields a negative value if the signs are unequal // const bool a_signflipped = (intmax_t) (sum ^ a) < 0; // const bool b_signflipped = (intmax_t) (sum ^ b) < 0; // return a_signflipped && b_signflipped; } else { // S = S + U // Flip the sign bit of a, test whether that sum overflows a ^= signbit; return a + b < a; } } else { if (b_signed) { // S = U + S // Flip the sign bit of `b`, test whether that sum overflows b ^= signbit; return a + b < b; } else { // S = U + U // The signed sum must not be less than the addend, and not negative return sum < a || (signbit & sum); } } } else { if (a_signed) { if (b_signed) { // U = S + S return signbit & (((sum | a) & b) | ((sum & a) & ~b)); // Expanded: // const bool a_is_negative = (intmax_t) a < 0; // const bool b_is_negative = (intmax_t) b < 0; // const bool sum_is_large = sum > INTMAX_MAX; // if (b_is_negative) { // if (a_is_negative) { // // The sum must be negative, and therefore cannot be stored in an unsigned // return true; // } else if (sum_is_large) { // // We added a negative value B to a positive value A, but the sum // // ended up larger than the max signed value, so we wrapped // return true; // } // } else if (a_is_negative) { // if (sum_is_large) { // // Same as above case with sum_is_large // return true; // } // } // return false; } else { // U = S + U return signbit & (sum ^ a ^ signbit) & (sum ^ b); // Expanded: // const bool sum_is_large = sum > INTMAX_MAX; // const bool b_is_large = b > INTMAX_MAX; // const bool a_is_negative = (intmax_t) a < 0; // if (!a_is_negative && b_is_large) { // // We are adding a non-negative value to a large number, so the // // sum must also be large // if (!sum_is_large) { // // We ended up with a smaller value, meaning that we must have wrapped // return true; // } // } // if (a_is_negative && !b_is_large) { // // We subtracted a non-negative value from a non-large number, so // // the result should not be large // if (sum_is_large) { // // We ended up with a large value, so we must have wrapped // return true; // } // } // return false; } } else { if (b_signed) { // U = U + S --- (See [U = S + U] for an explanation) return signbit & (sum ^ a) & (sum ^ b ^ signbit); } else { // U = U + U (simple case) return sum < a; } } } } // Support for the `mlib_sub` macro static inline bool(mlib_sub)(uintmax_t *dst, bool dst_signed, bool a_signed, uintmax_t a, bool b_signed, uintmax_t b) mlib_noexcept { // Perform the subtraction using regular wrapping arithmetic const uintmax_t diff = *dst = a - b; const uintmax_t signbit = mlib_bits(1, mlib_bitsizeof(uintmax_t) - 1u); // Test whether the operation overflowed for the given sign configuration // (See mlib_add for more details on why we do this bit fiddling) if (dst_signed) { const bool diff_is_negative = signbit & diff; if (a_signed) { if (b_signed) { // S = S - S return signbit & (a ^ b) & (diff ^ a); // Explain: // const bool a_is_negative = (intmax_t) a < 0; // const bool b_is_negative = (intmax_t) b < 0; // if (a_is_negative != b_is_negative) { // // Given: Pos - Neg = Pos // // ∧ Neg - Pos = Neg // // We expect that the difference preserves the sign of the minuend // if (diff_is_negative != a_is_negative) { // return true; // } // } // // Otherwise, `Pos - Pos` and `Neg - Neg` cannot possibly overflow // return false; } else { // S = S - U // The diff overflows if the sign-bit-flipped minuend is smaller than the subtrahend return (a ^ signbit) < b; } } else { if (b_signed) { // S = U - S // The diff overflows if the sign-bit-flipped subtrahend is greater than or equal to the minuend return a >= (b ^ signbit); } else { // S = U - U const bool expect_negative = a < b; return expect_negative != diff_is_negative; } } } else { if (a_signed) { if (b_signed) { // U = S - S return signbit & (((diff & a) & b) | ((diff | a) & ~b)); // Expanded: // const bool a_is_negative = (intmax_t) a < 0; // const bool b_is_negative = (intmax_t) b < 0; // const bool diff_is_large = diff > INTMAX_MAX; // if (!b_is_negative) { // if (a_is_negative) { // // We subtracted a non-negative from a negative value, so the difference // // must be negative and cannot be stored as unsigned // return true; // } // if (diff_is_large) { // // We subtracted a positive value from a signed value, so we must not // // end up with a large value // return true; // } // } // if (a_is_negative) { // if (diff_is_large) { // // A is negative, and there is no possible value that we can subtract // // from it to obtain this large integer, so we must have overflowed // return true; // } // } // return false; } else { // return (b > a) || (signbit & a); } } else { if (b_signed) { // U = U - S return signbit & (a ^ b ^ signbit) & (diff ^ a); // Explain: // const bool a_is_large = a > INTMAX_MAX; // const bool b_is_negative = (intmax_t) b < 0; // const bool diff_is_large = diff > INTMAX_MAX; // if (a_is_large && b_is_negative) { // // The difference between a large value and a negative // // value must also be a large value // if (!diff_is_large) { // // We expected another large value to appear. // return true; // } // } // if (!a_is_large && !b_is_negative) { // // The difference between a non-large positive value and a non-negative value // // must not be a large value // if (diff_is_large) { // // We did not expect a large difference // return true; // } // } // return false; } else { return a < b; } } } } // Support for the `mlib_mul` macro static inline bool(mlib_mul)(uintmax_t *dst, bool dst_signed, bool a_signed, uintmax_t a, bool b_signed, uintmax_t b) mlib_noexcept { // Multiplication is a lot more subtle const uintmax_t signbit = mlib_bits(1, mlib_bitsizeof(uintmax_t) - 1u); if (dst_signed) { if (a_signed) { if (b_signed) { // S = S × S *dst = a * b; if (((intmax_t)b == -1 && (intmax_t)a == INTMAX_MIN) || ((intmax_t)a == -1 && (intmax_t)b == INTMAX_MIN)) { // MIN × -1 is undefined return true; } if (a && (intmax_t)*dst / (intmax_t)a != (intmax_t)b) { // Mult did not preserve the arithmetic identity return true; } return false; } else { // S = S × U *dst = a * b; const bool a_is_negative = signbit & a; const uintmax_t positive_a = a_is_negative ? (0 - a) : a; const uintmax_t positive_prod = positive_a * b; const bool did_overflow = positive_a && positive_prod / positive_a != b; if (did_overflow) { return true; } if (positive_prod > (uintmax_t)INTMAX_MAX + (unsigned)a_is_negative) { return true; } return false; } } else { if (b_signed) { // S = U × S // Swap args: [S = S × U] return (mlib_mul)(dst, dst_signed, b_signed, b, a_signed, a); } else { // S = U × U *dst = a * b; const bool did_overflow = a && *dst / a != b; if (did_overflow) { return true; } if (signbit & *dst) { // A negative product indicates wrapping return true; } return false; } } } else { if (a_signed) { if (b_signed) { // U = S × S // Is either operand the min? bool either_min = false; if (signbit & a & b) { // Both negative: Flip the signs a = 0 - a; b = 0 - b; // MIN is pathological: 0 - MIN = MIN, so we need to check that: either_min = (intmax_t)a == INTMAX_MIN || (intmax_t)b == INTMAX_MIN; } // Check if the product would be a negative number const bool neg_prod = (signbit & (a ^ b)) && a && b && !either_min; *dst = a * b; return neg_prod || (a && *dst / a != b); } else { // U = S × U *dst = a * b; const bool did_ovr = a && *dst / a != b; const bool a_is_negative = signbit & a; if (did_ovr || (a_is_negative && b)) { return true; } return false; } } else { if (b_signed) { // U = U × S // Swap to [U = S × U] return (mlib_mul)(dst, dst_signed, b_signed, b, a_signed, a); } else { // U = U × U: Simple: *dst = a * b; return a && *dst / a != b; } } } } /** * @private * @brief This function performs the narrowing checks around a ckdint funciton * * @param dst Pointer to the target interger * @param dst_sz The size of the target integer, in bytes * @param minval The minimum value for the result. If negative, the target is treated as signed * @param maxval The maximum value for the result * @param a The left-hand operand for the operation * @param b The right-hand operand for the operation * @param fn The arithmetic function that performs arithmetic on the max-precision integer * @return true If the resulting value DOES NOT equal the true arithmetic result * @return false If the resulting value represents the true arithmetic results */ static inline bool _mlib_ckdint(void *dst, int dst_sz, intmax_t minval, uintmax_t maxval, struct mlib_upsized_integer a, struct mlib_upsized_integer b, _mlib_ckdint_arith_fn fn) mlib_noexcept { // Perform the arithmetic on uintmax_t, for wrapping behavior uintmax_t tmp; bool ovr = fn(&tmp, minval < 0, a.is_signed, a.bits.as_unsigned, b.is_signed, b.bits.as_unsigned); // Endian-adjusting for writing the result const char *copy_from = (const char *)&tmp; if (!mlib_is_little_endian()) { // We need to adjust the copy src in order to truncate the integer for big-endian encoding. // Number of high bytes that we need to drop: const int n_drop = (int)sizeof(tmp) - dst_sz; // Adjust the copy pointer to so that we copy from the most significant byte that // we wish to keep copy_from += n_drop; } else { // For little-endian native, we don't need to adjust the bytes, since we can just // truncate using the memcpy() } // Send the result to the destination memcpy(dst, copy_from, (size_t)dst_sz); // Final range check: if (minval < 0) { // Treat the target as signed: intmax_t idst = (intmax_t)tmp; return ovr || idst < minval || (idst > 0 && (uintmax_t)idst > maxval); } else { return ovr || tmp > maxval; } } /** * @internal * @brief Implementation function for the asserting arithmetic functions */ static inline uintmax_t(_mlib_assert_ckdint)(size_t dst_sz, intmax_t minval, uintmax_t maxval, struct mlib_upsized_integer a, struct mlib_upsized_integer b, _mlib_ckdint_arith_fn arith, const char *fn_str, const char *type_str, const char *a_str, const char *b_str, struct mlib_source_location here) mlib_noexcept { uintmax_t tmp; bool did_overflow = _mlib_ckdint(&tmp, dst_sz, minval, maxval, a, b, arith); if (did_overflow) { fprintf(stderr, "%s:%d: [in %s]: Call of %s(%s, %s, %s) resulted in arithmetic overflow\n", here.file, here.lineno, here.func, fn_str, type_str, a_str, b_str); abort(); } if (!mlib_is_little_endian()) { // We unconditionally set the leading bytes of `tmp`, but big-endian expects // the lower place values to be in the later bytes. If the target int is // smaller than intmax, we must shift all the bits over to their proper // position. This expression is trivially constant-folded by an optimizer. tmp >>= ((size_t)CHAR_BIT * ((sizeof tmp) - dst_sz)); } return tmp; } static inline uintmax_t _mlib_checked_cast(intmax_t min_, uintmax_t max_, struct mlib_upsized_integer val, const char *typename_, const char *expr, struct mlib_source_location here) mlib_noexcept { if (!(mlib_in_range)(min_, max_, val)) { if (val.is_signed) { fprintf(stderr, "%s:%d: in [%s]: Checked integer cast of “%s†(value = %lld) to “%s†loses information\n", here.file, here.lineno, here.func, expr, (long long)val.bits.as_signed, typename_); } else { fprintf(stderr, "%s:%d: in [%s]: Checked integer cast of “%s†(value = %llu) to “%s†loses information\n", here.file, here.lineno, here.func, expr, (unsigned long long)val.bits.as_unsigned, typename_); } fflush(stderr); abort(); } if (val.is_signed) { return (uintmax_t)val.bits.as_signed; } return val.bits.as_unsigned; } mlib_extern_c_end(); mongo-c-driver-2.2.1/src/common/src/mlib/ckdint.md000066400000000000000000000242631511661753600217550ustar00rootroot00000000000000# `mlib/ckdint.h` C23 `stdckdint.h` for C99 The `mlib/ckdint.h` header implements the [C23 checked arithmetic][stdckdint] functionality in a C99-compatible manner. There are only three caveats to keep in mind: [stdckdint]: https://en.cppreference.com/w/c/numeric#Checked_integer_arithmetic - The backport relies assumes two's complement signed integer encoding. - The operand expressions of a call to the ckdint function-like macros may be evaluated more than once. - The output parameter is read-from before the operation begins, meaning that it must be initialized to some value to prevent an uninitialized-read from being seen by the compiler. (The value isn't used, and the compiler will easily elide the dead store/read.) Implementing this correctly, especially without the aide of `_Generic`, requires quite a few tricks, but the results are correct (tested against GCC's `__builtin__overflow` intrinsic, which is how `glibc` implements C23 [stdckdint][]). # How to Use The following function-like macros are defined: - Regular: `mlib_add`, `mlib_sub`, and `mlib_mul`, with an additional `mlib_narrow` macro. - Asserting: `mlib_assert_add`, `mlib_assert_sub`, `mlib_assert_mul`, and `mlib_assert_narrow` ## Regular Macros The "regular" macros have the same API as [stdckdint][], with an additional feature: If called with two arguments, the output parameter is used as the left-hand operand of the operation: ```c int foo = 42; mlib_add(&foo, n); // Equivalent to `foo += n` ``` `mlib_narrow(Dst, I)` is not from [stdckdint][], but is useful to check that an integral cast operation does not modify the value: ```c void foo(size_t N) { int a = 0; if (mlib_narrow(&a, N)) { fprintf(stderr, "Invalid operand: N is too large\n"); abort(); } // … } ``` All of the "regular" macros return a boolean. If they return `true`, then the result written to the destination DOES NOT represent the true arithmetic result (i.e. the operation overflowed or narrowed). If it returns `false`, then the operation succeeded without issue. This allows one to chain arithmetic operations together with the logical-or operator, short-circuiting when the operation fails: ```c ssize_t grow_size(size_t sz, size_t elem_size, size_t count) { ssize_t ret = 0; // Compute: ret = sz + (elem_size × count) if (mlib_mul(&elem_size, count) || // elem_size *= count mlib_add(&ret, sz, elem_size)) { // ret = sz + elem_size // Overflow. Indicate an error. return SSIZE_MIN; } return ret; } ``` ## Asserting Macros The `mlib_assert_…` macros take a type as their first argument instead of a destination pointer. The macro yields the result of the operation as a value of the specified type, asserting at runtime that no overflow or narrowing occurs. If the operation results in information loss, the program terminates at the call site. # How it Works This section details how it works, since it isn't straightforward from reading. ## Max-Precision Arithmetic The basis of the checked arithmetic is to do the math in the maximum width unsigned integer type, which is well-defined. We can then treat the unsigned bit pattern as a signed or unsigned integer as appropriate to perform the arithmetic correctly and check for overflow. This arithmetic is implemented in the `mlib_add`, `mlib_sub`, and `mlib_mul` *functions* (not the macros). The bit fiddling tricks are a combination of straightforward arithmetic checks and more esoteric algorithms. The checks for addition and subtraction are fairly straightforward, while the multiplication implementation is substantially more complicated since its overflow semantics are much more pernicious. The bit hacks are described within each function. They are split between each combination of signed/unsigned treatment for the dest/left/right operands. The basis of the bit checks is in treating the high bit as a special boolean: For unsigned types, a set high bit represents a value outside the bounds of the signed equivalent. For signed types, a set high bit indicates a negative value that cannot be stored in an unsigned integer. Thus, logical-bit operations on integers and then comparing the result as less-than-zero effectively treats the high bit as a boolean, e.g.: - For signed X and Y, `(X ^ Y) < 0` yield `true` iff `X` and `Y` have different sign. - `(X & Y) < 0` tests that both X and Y are negative. - `(X | Y) < 0` tests that either X or Y are negative. The very terse bit-manipulation expressions are difficult to parse at first, and have been expanded below each occurrence to explain what they are actually testing. The terse bit-manip tests are left as the main condition for overflow checking, as they generate significantly better machine code, even with the optimizer enabled. If the arithmetic overflows in the max precision integer, then we can assume that it overflows for any smaller integer types. For this integer promotion at macro sites, we use `mlib_upscale_integer`, defined in `mlib/intutil.h`. ## Final Narrowing While it is simple enough to perform arithmetic in the max precision, we need to narrow the result to the target type, and that requires knowing the min/max bounds of that type. This was the most difficult challenge, because it requires the following: 1. Given a pointer to an integer type $T$, what is the minimum value of $T$? 2. ... what is the maximum value of $T$? 3. How do we cast from a `uintmax_t` to $T$ through a generic `void*`? Point (3) is fairly simple: If we know the byte-size of $T$, we can bit-copy the integer representation from `uintmax_t` into the `void*`, preserving endian-encoding. For little-endian encoding, this is as simple as copying the first $N$ bytes from the `uintmax_t` into the target, truncating to the target size. For big-endian encoding, we just adjust a pointer into the object representation of the `uintmax_t` to drop the high bytes that we don't need. Points (1) and (2) are more subtle. We need a way to obtain a bit pattern that respects the "min" and "max" two's complement values. While one can easily form an aribtrary bit pattern using bit-shifts and `sizeof(*ptr)`, the trouble is that the min/max values depend on whether the target is signed, and it is *not possible* in C99 to ask whether an arbitrary integer expression is signed/unsigned. ### Things that Don't Work™ Given a type `T`, we can check whether it is signed with a simple macro: ```c #define IS_SIGNED(T) ((T)-1 < 0) ``` Unfortunately, we don't have a type `T`. We have an expression `V`: ```c #define IS_SIGNED_TYPEOF(V) ??? ``` With C23 or GNU's `__typeof__`, we could do this easily (see below). There is one close call, that allows us to grab a zero and subtract one: ```c #define IS_SIGNED_TYPEOF(V) ((0 & V) - 1 < 0) ``` This seems promising, but this **doesn't work**, because of C's awful, horrible, no-good, very-bad integer promotion rules. The expression `0 & V` *will* yield zero, but if `V` is smaller than `int`, it will be immediately promoted to `signed int` beforehand, regardless of the sign of `V`. This macro gives the correct answer for `(unsigned) int` and larger, but `(unsigned) short` and `(unsigned) char` will always yield `true`. ### How `mlib/ckdint.h` Does It There is one set of C operators that *don't* perform integer promotion: assignment and in-place arithmetic. This macro *does* work: ```c #define IS_SIGNED_TYPEOF(V) (((V) = -1) < 0) ``` But this obviously can't be used, because we're modifying the operand! Right...? Except: We're only needing to do this check on the *destination* of the arithmetic function. We already know that it's modifiable and that we're going to reassign to it, so it doesn't matter that we temporarily write a garbage `-1` into it! With this, we can write our needed support macros: ```c #define MINOF_TYPEOF(V) \ IS_SIGNED_TYPEOF(V) \ ? MIN_TYPEOF_SIGNED(V) \ : MIN_TYPEOF_UNSIGNED(V) ``` With this, a call-site of our checked arithmetic macros can inject the appropriate min/max values of the destination operand, and the checked arithmetic functions can do the final bounds check. Almost ### Big Problem, Though Suppose the following: ```c int a = 42; mlib_add(&a, a, 5); // 42 + 5 ? ``` The correct result of `a` is `47`, but the value is unspecified: It is either `4` or `47`, depending on argument evaluation order, because we are silently overwriting the value in `a` to `-1` before doing the operation. We need to save the value of `a`, do the check, and then restore the value of `a`, all in a single go. Thus we have a much hairier macro: ```c static thread_local uintmax_t P; static thread_local bool S; #define IS_SIGNED_TYPEOF(V) \ (( \ P = 0ull | (uintmax_t) V, \ V = 0, \ S = (--V < 0), \ V = 0, \ V |= P, \ S \ )) ``` This uses the comma-operator the enforce evaluation of each sub-expression: 1. Save the bit pattern of `V` in a global static temporary $P$. 2. Set `V` to zero. 3. Decrement `V` and check if the result is negative. Save that value in a separate global $S$. 4. Restore the value of `V` by writing the bit pattern stored in $P$ back into `V`. (The use of `= 0` + `|= P` prevents compilers from emitting any integer conversion warnings) 5. Yield the bool we saved in $S$. $P$ and $S$ are `thread_local` to allow multiple threads to evaluate the macro simultaneously without interfering. The `static` allows the optimizer to delete $P$ and $S$ from the translation unit when it can statically determine that the values written into these variables are never read from after constant folding (usually: MSVC is currently unable to elide the writes, but is still able to constant-fold across these assignments, which is the most important optimization we need to ensure works to eliminate redundant branches after inlining). With this modified roundabout definition, we can perform in-place checked arithmetic where the output can also be used as an input of the operation. ### Optimize: Use `__typeof__` If we have `__typeof__` (available in GCC, Clang, and MSVC 19.39+) or C23 `typeof` , we can simplify our macro to a trivial one: ```c #define IS_SIGNED_TYPEOF(V) IS_SIGNED(__typeof__(V)) ``` This will yield an equivalent result, but improves debug codegen and gives the optimizer an easier time doing constant folding across function calls. mongo-c-driver-2.2.1/src/common/src/mlib/ckdint.test.cpp000066400000000000000000000112101511661753600231010ustar00rootroot00000000000000#include #include #include #include #include #define have_ckdint_builtins() 0 // Check for the stdckdint builtins, but don't use Clang, as it has bugs on some platforms. #if defined(__has_builtin) && !defined(__clang__) #if __has_builtin(__builtin_add_overflow) #undef have_ckdint_builtins #define have_ckdint_builtins() 1 #endif // __has_builtin #endif template struct typelist { }; using integer_types = typelist; /** * @brief For every "interesting" value of integer type `T`, call `F` * * @tparam T An integer type to be inspected * @param fn A function to be called with every "interesting value" */ template void with_interesting_values(F &&fn) { using lim = std::numeric_limits; // A list of the values of T that are potentially problematic // when combined in various ways. const T interesting_values[] = { 0, (T)(-1), (T)(-2), (T)(-10), 1, 2, 10, // Min value lim::min(), // Half min (T)(lim::min() / 2), (T)(lim::min() / 2 + 1), (T)(lim::min() / 2 - 1), // Max value lim::max(), // Half max (T)(lim::max() / 2), (T)(lim::max() / 2 + 1), (T)(lim::max() / 2 - 1), }; // Call with each value: for (T v : interesting_values) { fn(v); } } /** * @brief Perform one set of tests with the given integer values * * @tparam Dst The target type for the operation * @param lhs The left-hand operand * @param rhs The right-hand operand * * If you identify a problematic combination, you can call this * directly in `main` with the known-bad values for easier debugging. * * This function is a no-op if the compiler does not provide the checked-arithmetic * builtins. */ template void test_case(L lhs, R rhs) { (void)lhs; (void)rhs; #if have_ckdint_builtins() Dst mres, gres; // Test addition: mlib_check(mlib_add(&mres, lhs, rhs), eq, __builtin_add_overflow(lhs, rhs, &gres)); mlib_check(mres, eq, gres); // Test subtraction: mlib_check(mlib_sub(&mres, lhs, rhs), eq, __builtin_sub_overflow(lhs, rhs, &gres)); mlib_check(mres, eq, gres); // Test multiplication mlib_check(mlib_mul(&mres, lhs, rhs), eq, __builtin_mul_overflow(lhs, rhs, &gres)); mlib_check(mres, eq, gres); // Test narrowing (both operands) mlib_check(mlib_narrow(&mres, lhs), eq, __builtin_add_overflow(lhs, 0, &gres)); mlib_check(mres, eq, gres); mlib_check(mlib_narrow(&mres, rhs), eq, __builtin_add_overflow(rhs, 0, &gres)); mlib_check(mres, eq, gres); #endif } template int test_arithmetic() { with_interesting_values([&](L lhs) { // with_interesting_values([&](R rhs) { // test_case(lhs, rhs); }); }); return 0; } template int test_rhs(typelist) { // Call with every Rhs type auto arr = {test_arithmetic()...}; (void)arr; return 0; } template int test_lhs(typelist) { // Expand to a call of test_rhs for every Lhs type auto arr = {test_rhs(integer_types{})...}; (void)arr; return 0; } template void test_dst_types(typelist) { // Expand to a call of test_lhs for each Dst type auto arr = {test_lhs(integer_types{})...}; (void)arr; } int main() { // Test that the dest can be used as an operand simultaneously: int a = 42; mlib_add(&a, a, 5); // `a` is both an addend and the dst mlib_check(a, eq, 47); // Check that the addition respected the `42` // The `check` arithmetic functions should abort the process immediately mlib_assert_aborts () { mlib_assert_add(size_t, 41, -42); } mlib_assert_aborts () { mlib_assert_add(ptrdiff_t, 41, SIZE_MAX); } // Does not abort: const size_t sum = mlib_assert_add(size_t, -32, 33); mlib_check(sum, eq, 1); // Test all integer types: test_dst_types(integer_types{}); if (!have_ckdint_builtins()) { puts("@@ctest-skipped@@ - No __builtin__overflow builtins to test against"); } } mongo-c-driver-2.2.1/src/common/src/mlib/cmp.h000066400000000000000000000115731511661753600211070ustar00rootroot00000000000000/** * @file mlib/cmp.h * @brief Safe integer comparison and range checking * @date 2024-08-29 * * This file provides safe and intuitive integer comparison macros that behave * appropriately, regardless of the sign or precision of the integer operands. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_CMP_H_INCLUDED #define MLIB_CMP_H_INCLUDED #include #include #include #include /** * @brief Result type of comparing two integral values with `mlib_cmp` * * The enumerator values are chosen such that they can be compared with zero */ enum mlib_cmp_result { // The two values are equivalent mlib_equal = 0, // The left-hand operand is less than the right-hand mlib_less = -1, // The left-hand operand is greater than the right-hand mlib_greater = 1, }; /** * @brief Compare two integral values safely. * * This function can be called with two arguments or with three: * * - `mlib_cmp(a, b)` Returns a value of type `mlib_cmp_result` * - `mlib_cmp(a, Op, b)` where `Op` is a relational operator. Evaluates to a boolean value. */ #define mlib_cmp(...) MLIB_ARGC_PICK(_mlib_cmp, __VA_ARGS__) // Compare two integers, and return the result of that comparison: #define _mlib_cmp_argc_2(L, R) mlib_cmp(mlib_upsize_integer((L)), mlib_upsize_integer((R)), 0) // Compare two integers, but with an infix operator: #define _mlib_cmp_argc_3(L, Op, R) (mlib_cmp(mlib_upsize_integer((L)), mlib_upsize_integer((R)), 0) Op 0) // Impl for mlib_cmp mlib_always_inline static enum mlib_cmp_result(mlib_cmp)(struct mlib_upsized_integer x, struct mlib_upsized_integer y, int always_zero) mlib_noexcept { (void)always_zero; #if mlib_is_optimized_build() && !mlib_is_msvc() && \ !(defined(MLIB_DISABLE_INLINING_ASSERTIONS) && MLIB_DISABLE_INLINING_ASSERTIONS) if (always_zero != 0) { // All calls must pass zero for `always_zero`. In optimized builds, we assert that this function // is always inlined, and that dead-code-elim triggers to delete this branch that calls // a never-defined function. extern void __assert_that_mlib_cmp_was_inlined(void); // If you see a call to this function ↑ produce a link error here ↓, it means // that inlining or DCE failed within the relevant translation unit. __assert_that_mlib_cmp_was_inlined(); } #endif if (x.is_signed) { if (y.is_signed) { // Both signed if (x.bits.as_signed < y.bits.as_signed) { return mlib_less; } else if (x.bits.as_signed > y.bits.as_signed) { return mlib_greater; } } else { // X signed, Y unsigned if (x.bits.as_signed < 0 || (uintmax_t)x.bits.as_signed < y.bits.as_unsigned) { return mlib_less; } else if ((uintmax_t)x.bits.as_signed > y.bits.as_unsigned) { return mlib_greater; } } } else { if (!y.is_signed) { // Both unsigned if (x.bits.as_unsigned < y.bits.as_unsigned) { return mlib_less; } else if (x.bits.as_unsigned > y.bits.as_unsigned) { return mlib_greater; } } else { // X unsigned, Y signed if (y.bits.as_signed < 0 || x.bits.as_unsigned > (uintmax_t)y.bits.as_signed) { return mlib_greater; } else if (x.bits.as_unsigned < (uintmax_t)y.bits.as_signed) { return mlib_less; } } } return mlib_equal; } /** * @brief Test whether the given operand is within the range of some other integral type * * @param T A type specifier of the target integral type * @param Operand the expression that is being inspected. * * @note This macro may evaluate the operand more than once */ #define mlib_in_range(T, Operand) \ mlib_in_range((intmax_t)mlib_minof(T), (uintmax_t)mlib_maxof(T), mlib_upsize_integer(Operand)) static inline bool(mlib_in_range)(intmax_t min_, uintmax_t max_, struct mlib_upsized_integer val) mlib_noexcept { if (val.is_signed) { return mlib_cmp(val.bits.as_signed, >=, min_) && mlib_cmp(val.bits.as_signed, <=, max_); } else { return mlib_cmp(val.bits.as_unsigned, >=, min_) && mlib_cmp(val.bits.as_unsigned, <=, max_); } } #endif // MLIB_CMP_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/config.h000066400000000000000000000363761511661753600216050ustar00rootroot00000000000000/** * @file mlib/config.h * @brief Provides utility macros * @date 2024-08-29 * * @note This file is intented to be standalone-includable, with no dependencies * other than the standard library and platform headers. This file (and other * `mlib` files), are for internal use only, and should not be used in any public * headers. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_CONFIG_H_INCLUDED #define MLIB_CONFIG_H_INCLUDED #ifndef _WIN32 #include // Endian detection #endif /** * @brief A function-like macro that always expands to nothing */ #define MLIB_NOTHING(...) /** * @brief A function macro that simply expands to its arguments unchanged */ #define MLIB_JUST(...) __VA_ARGS__ // Paste two tokens #ifndef _MSC_VER #define MLIB_PASTE(A, ...) _mlibPaste1(A, __VA_ARGS__) #else #define MLIB_PASTE(A, ...) MLIB_JUST(_mlibPaste1(A, __VA_ARGS__)) #endif // Paste three tokens #define MLIB_PASTE_3(A, B, ...) MLIB_PASTE(A, MLIB_PASTE(B, __VA_ARGS__)) // Paste four tokens #define MLIB_PASTE_4(A, B, C, ...) MLIB_PASTE(A, MLIB_PASTE_3(B, C, __VA_ARGS__)) // Paste five tokens #define MLIB_PASTE_5(A, B, C, D, ...) MLIB_PASTE(A, MLIB_PASTE_4(B, C, D, __VA_ARGS__)) #define _mlibPaste1(A, ...) A##__VA_ARGS__ /** * @brief Convert the token sequence into a string after macro expansion */ #define MLIB_STR(...) _mlibStr(__VA_ARGS__) #define _mlibStr(...) #__VA_ARGS__ #define MLIB_EVAL_32(...) MLIB_EVAL_16(MLIB_EVAL_16(__VA_ARGS__)) #define MLIB_EVAL_16(...) MLIB_EVAL_8(MLIB_EVAL_8(__VA_ARGS__)) #define MLIB_EVAL_8(...) MLIB_EVAL_4(MLIB_EVAL_4(__VA_ARGS__)) #define MLIB_EVAL_4(...) MLIB_EVAL_2(MLIB_EVAL_2(__VA_ARGS__)) #define MLIB_EVAL_2(...) MLIB_EVAL_1(MLIB_EVAL_1(__VA_ARGS__)) #define MLIB_EVAL_1(...) __VA_ARGS__ // clang-format off /** * @brief Expand to 1 if given no arguments, otherwise 0. * * This could be done trivially using __VA_OPT__, but we need to work on * older compilers. */ #define MLIB_IS_EMPTY(...) \ _mlibIsEmpty_1( \ /* Expands to '1' if __VA_ARGS__ contains any top-level commas */ \ _mlibHasComma(__VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ begins with a parenthesis, because \ * that will cause an "invocation" of _mlibCommaIfParens, \ * which immediately expands to a single comma. */ \ _mlibHasComma(_mlibCommaIfParens __VA_ARGS__), \ /* Expands to '1' if __VA_ARGS__ expands to a function-like macro name \ * that then expands to anything containing a top-level comma */ \ _mlibHasComma(__VA_ARGS__ ()), \ /* Expands to '1' if __VA_ARGS__ expands to nothing. */ \ _mlibHasComma(_mlibCommaIfParens __VA_ARGS__ ())) // Expand to 1 if the argument list has a comma. The weird definition is to support // old MSVC's bad preprocessor #define _mlibHasComma(...) \ MLIB_JUST(_mlibPickSixteenth \ MLIB_NOTHING("MSVC workaround") \ (__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, ~)) // Expands to a single comma if invoked as a function-like macro #define _mlibCommaIfParens(...) , /** * @brief Expands to `1` if the given macro argument is a parenthesized group of * tokens, otherwise `0` */ #define MLIB_IS_PARENTHESIZED(X) \ _mlibHasComma(_mlibCommaIfParens X) /** * @brief Pass a function-like macro name, inhibiting its expansion until the * next pass: * * #define func_macro(x) x * * MLIB_DEFERRED(func_macro)(foo) // Expands to "func_macro(foo)", not "foo" */ #define MLIB_DEFERRED(MacroName) \ /* Expand to the macro name: */ \ MacroName \ /*- * Place a separator between the function macro name and whatever comes next * in the file. Presumably, the next token will be the parens to invoke "MacroName", * but this separator inhibits its expansion unless something else comes * along to do another expansion pass */ \ MLIB_NOTHING("[separator]") /** * A helper for isEmpty(): If given (0, 0, 0, 1), expands as: * - first: _mlibHasComma(_mlibIsEmptyCase_0001) * - then: _mlibHasComma(,) * - then: 1 * Given any other aruments: * - first: _mlibHasComma(_mlibIsEmptyCase_) * - then: 0 */ #define _mlibIsEmpty_1(_1, _2, _3, _4) \ _mlibHasComma(MLIB_PASTE_5(_mlibIsEmptyCase_, _1, _2, _3, _4)) #define _mlibIsEmptyCase_0001 , #define MLIB_IS_NOT_EMPTY(...) MLIB_PASTE (_mlibNotEmpty_, MLIB_IS_EMPTY (__VA_ARGS__)) #define _mlibNotEmpty_1 0 #define _mlibNotEmpty_0 1 // clang-format on /** * @brief If the argument expands to `0`, `false`, or nothing, expands to `0`. * Otherwise expands to `1`. */ #define MLIB_BOOLEAN(...) MLIB_IS_NOT_EMPTY(MLIB_PASTE_3(_mlib, Bool_, __VA_ARGS__)) #define _mlibBool_0 #define _mlibBool_false #define _mlibBool_ /** * @brief A ternary macro. Expects three parenthesized argument lists in * sequence. * * If the first argument list is a truthy value, expands to the second argument * list. Otherwise, expands to the third argument list. The unused argument list * is not expanded and is discarded. */ #define MLIB_IF_ELSE(...) MLIB_PASTE(_mlibIfElseBranch_, MLIB_BOOLEAN(__VA_ARGS__)) #define _mlibIfElseBranch_1(...) __VA_ARGS__ MLIB_NOTHING #define _mlibIfElseBranch_0(...) MLIB_JUST /** * @brief Expands to an integer literal corresponding to the number of macro * arguments. Supports up to fifteen arguments. */ #define MLIB_ARG_COUNT(...) \ MLIB_IF_ELSE(MLIB_IS_EMPTY(__VA_ARGS__)) \ (0)(_mlibPickSixteenth(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) #define _mlibPickSixteenth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) _16 /** * @brief Expand to a call expression `Prefix##_argc_N(...)`, where `N` is the * number of macro arguments. * * XXX: The `MLIB_JUST` forces an additional expansion pass that works around a * bug in the old MSVC preprocessor, but is not required in a conforming preprocessor. */ #define MLIB_ARGC_PICK(Prefix, ...) MLIB_JUST(MLIB_ARGC_PASTE(Prefix, __VA_ARGS__)(__VA_ARGS__)) #define MLIB_ARGC_PASTE(Prefix, ...) MLIB_PASTE_3(Prefix, _argc_, MLIB_ARG_COUNT(__VA_ARGS__)) #ifdef __cplusplus #define mlib_is_cxx() 1 #define mlib_is_not_cxx() 0 #define MLIB_IF_CXX(...) __VA_ARGS__ #define MLIB_IF_NOT_CXX(...) #else #define mlib_is_cxx() 0 #define mlib_is_not_cxx() 1 #define MLIB_IF_CXX(...) #define MLIB_IF_NOT_CXX(...) __VA_ARGS__ #endif #define MLIB_LANG_PICK MLIB_IF_ELSE(mlib_is_not_cxx()) /** * @brief Use as the prefix of a braced initializer within C headers, allowing * the initializer to appear as a compound-init in C and an equivalent braced * aggregate-init in C++ */ #define mlib_init(T) MLIB_LANG_PICK((T))(T) /** * @brief Expands to `noexcept` when compiled as C++, otherwise expands to * nothing */ #define mlib_noexcept MLIB_IF_CXX(noexcept) #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) #define mlib_is_little_endian() (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) #define mlib_is_little_endian() (__BYTE_ORDER == __LITTLE_ENDIAN) #elif defined(_WIN32) #define mlib_is_little_endian() 1 #else #error "Do not know how to detect endianness on this platform." #endif // clang-format off /** * @brief Expands to a static assertion declaration. * * When supported, this can be replaced with `_Static_assert` or `static_assert` */ #define mlib_static_assert(...) MLIB_ARGC_PICK (_mlib_static_assert, __VA_ARGS__) #define _mlib_static_assert_argc_1(Expr) \ _mlib_static_assert_argc_2 ((Expr), "Static assertion failed") #define _mlib_static_assert_argc_2(Expr, Msg) \ extern int \ MLIB_PASTE (_mlib_static_assert_placeholder, __COUNTER__)[(Expr) ? 2 : -1] \ MLIB_IF_GNU_LIKE (__attribute__ ((unused))) // clang-format on #define mlib_extern_c_begin() MLIB_IF_CXX(extern "C" {) mlib_static_assert(1, "") #define mlib_extern_c_end() MLIB_IF_CXX( \ }) mlib_static_assert(1, "") #ifdef __GNUC__ #define mlib_is_gnu_like() 1 #ifdef __clang__ #define mlib_is_gcc() 0 #define mlib_is_clang() 1 #else #define mlib_is_gcc() 1 #define mlib_is_clang() 0 #endif #define mlib_is_msvc() 0 #elif defined(_MSC_VER) #define mlib_is_gnu_like() 0 #define mlib_is_clang() 0 #define mlib_is_gcc() 0 #define mlib_is_msvc() 1 #endif #if defined(_WIN32) #define mlib_is_win32() 1 #define mlib_is_unix() 0 #else #define mlib_is_unix() 1 #define mlib_is_win32() 0 #endif #define MLIB_IF_CLANG(...) MLIB_IF_ELSE(mlib_is_clang())(__VA_ARGS__)(MLIB_NOTHING(#__VA_ARGS__)) #define MLIB_IF_GCC(...) MLIB_IF_ELSE(mlib_is_gcc())(__VA_ARGS__)(MLIB_NOTHING(#__VA_ARGS__)) #define MLIB_IF_GNU_LIKE(...) MLIB_IF_GCC(__VA_ARGS__) MLIB_IF_CLANG(__VA_ARGS__) MLIB_NOTHING(#__VA_ARGS__) #define MLIB_IF_UNIX_LIKE(...) MLIB_IF_ELSE(mlib_is_unix())(__VA_ARGS__)(MLIB_NOTHING(#__VA_ARGS__)) // note: Bug on GCC preprocessor prevents us from using if/else trick to omit MSVC code #if mlib_is_msvc() #define MLIB_IF_MSVC(...) __VA_ARGS__ #define mlib_pragma(...) __pragma(__VA_ARGS__) mlib_static_assert(1, "") #else #define MLIB_IF_MSVC(...) MLIB_NOTHING(#__VA_ARGS__) #define mlib_pragma(...) _Pragma(#__VA_ARGS__) mlib_static_assert(1, "") #endif #define MLIB_PRAGMA_IF_CLANG(...) MLIB_IF_CLANG(_Pragma(#__VA_ARGS__)) #define MLIB_PRAGMA_IF_GCC(...) MLIB_IF_GCC(_Pragma(#__VA_ARGS__)) #define MLIB_PRAGMA_IF_GNU_LIKE(...) MLIB_IF_GNU_LIKE(_Pragma(#__VA_ARGS__)) #define MLIB_PRAGMA_IF_UNIX_LIKE(...) MLIB_IF_UNIX_LIKE(_Pragma(#__VA_ARGS__)) #define MLIB_PRAGMA_IF_MSVC(...) MLIB_IF_MSVC(__pragma(__VA_ARGS__)) #define MLIB_FUNC MLIB_IF_GNU_LIKE(__func__) MLIB_IF_MSVC(__FUNCTION__) #define mlib_diagnostic_push() \ MLIB_IF_GNU_LIKE(mlib_pragma(GCC diagnostic push);) \ MLIB_IF_MSVC(mlib_pragma(warning(push));) \ mlib_static_assert(1, "") #define mlib_diagnostic_pop() \ MLIB_IF_GNU_LIKE(mlib_pragma(GCC diagnostic pop);) \ MLIB_IF_MSVC(mlib_pragma(warning(pop));) \ mlib_static_assert(1, "") #define mlib_gcc_warning_disable(Warning) \ MLIB_IF_GCC(mlib_pragma(GCC diagnostic ignored Warning);) \ mlib_static_assert(1, "") #define mlib_gnu_warning_disable(Warning) \ MLIB_IF_GNU_LIKE(mlib_pragma(GCC diagnostic ignored Warning);) \ mlib_static_assert(1, "") #define mlib_msvc_warning(...) \ MLIB_IF_MSVC(mlib_pragma(warning(__VA_ARGS__));) \ mlib_static_assert(1, "") /** * @brief Attribute macro that forces the function to be inlined at all call sites. * * Don't use this unless you really know that you need it, lest you generate code * bloat when the compiler's heuristics would do a better job. */ #define mlib_always_inline MLIB_IF_GNU_LIKE(__attribute__((always_inline)) inline) MLIB_IF_MSVC(__forceinline) // Annotate a variable as thread-local #define mlib_thread_local MLIB_IF_GNU_LIKE(__thread) MLIB_IF_MSVC(__declspec(thread)) // Annotate an entiry that might be unused #define mlib_maybe_unused MLIB_IF_GNU_LIKE(__attribute__((unused))) // clang-format off /** * @brief Expand to `1` if the current build configuration matches the given token. * * If the token is not a known valid build configuration, generates a compilation * error (check your spelling!) * * Requires that `_MLIB_BUILD_CONFIG` is defined, otherwise always expands to `0` */ #define mlib_build_config_is(Config) \ /* If `Config` is a recognized config, this line will disappear, */ \ /* other wise it will be a "call to undefined macro": */ \ MLIB_PASTE_4 (_mlibTestBuildConfig_, Config, _, Config) () \ /* If `Config` is the same token as `_MLIB_BUILD_CONFIG`, this will */ \ /* expand to `1`, otherwise it will expand to `0` */ \ MLIB_IS_EMPTY (MLIB_PASTE_4 (_mlibTestBuildConfig_, Config, _, _MLIB_BUILD_CONFIG) ()) // clang-format on // Known build configurations: #define _mlibTestBuildConfig_Release_Release() #define _mlibTestBuildConfig_Debug_Debug() #define _mlibTestBuildConfig_RelWithDebInfo_RelWithDebInfo() #define _mlibTestBuildConfig_MinSizeRel_MinSizeRel() /** * @brief Emit a _Pragma that will disable warnings about the use of deprecated entities. */ #define mlib_disable_deprecation_warnings() \ mlib_gnu_warning_disable("-Wdeprecated-declarations"); \ mlib_msvc_warning(disable : 4996) /** * @brief Function-like macro that expands to `1` if we are certain that we are * compiling with optimizations enabled. * * This may yield `0` if we cannot determine whether optimization is turned on. * * This macro should be used with care, as different translation units can see different values, * but still be linked together in the final program. Beware generating ODR violations. */ #define mlib_is_optimized_build() _mlibIsOptimizedBuild() #if mlib_build_config_is(Release) || mlib_build_config_is(RelWithDebInfo) || mlib_build_config_is(MinSizeRel) || \ (defined(__OPTIMIZE__) && __OPTIMIZE__) // Preproc definition __OPTIMIZE__set by GCC ang Clang when the optimizer is enabled. // MSVC has no such definition, so we rely on CMake to tell us when we are compiling in release mode #define _mlibIsOptimizedBuild() 1 #else #define _mlibIsOptimizedBuild() 0 #endif #if mlib_is_gnu_like() #define mlib_have_typeof() 1 #elif defined _MSC_VER && _MSC_VER >= 1939 && !__cplusplus // We can __typeof__ in MSVC 19.39+ #define mlib_have_typeof() 1 #else #define mlib_have_typeof() 0 #endif /** * @brief Equivalent to C23's `typeof()`, if it is supported by the current compiler. * * This expands to `__typeof__`, which is supported even on newer MSVC compilers, * even when not in C23 mode. */ #define mlib_typeof(...) MLIB_IF_ELSE(mlib_have_typeof())(__typeof__)(__mlib_typeof_is_not_supported)(__VA_ARGS__) /** * @brief Disable warnings for constant conditional expressions. */ #define mlib_disable_constant_conditional_expression_warnings() mlib_msvc_warning(disable : 4127) /** * @brief Disable warnings for potentially unused parameters. */ #define mlib_disable_unused_parameter_warnings() \ MLIB_IF_GNU_LIKE(mlib_gnu_warning_disable("-Wunused-parameter");) \ MLIB_IF_MSVC(mlib_msvc_warning(disable : 4100);) mlib_static_assert(1, "") #if mlib_is_clang() #define mlib_printf_attribute(f, v) __attribute__((format(printf, f, v))) #elif mlib_is_gcc() #define mlib_printf_attribute(f, v) __attribute__((format(gnu_printf, f, v))) #else #define mlib_printf_attribute(f, v) #endif /** * @brief Annotate a boolean expression as "likely to be true" to guide the optimizer. * Use this very sparingly. */ #define mlib_likely(...) MLIB_IF_ELSE(mlib_is_gnu_like())(__builtin_expect(!!(__VA_ARGS__), 1))((__VA_ARGS__)) /** * @brief Annotate a boolean expression as "likely to be untrue" to guide the optimizer. * Use this very sparingly. */ #define mlib_unlikely(...) MLIB_IF_ELSE(mlib_is_gnu_like())(__builtin_expect(!!(__VA_ARGS__), 0))((__VA_ARGS__)) #endif // MLIB_CONFIG_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/duration.h000066400000000000000000000321631511661753600221530ustar00rootroot00000000000000/** * @file mlib/duration.h * @brief Duration types and functions * @date 2025-04-17 * * This file contains types and functions for working with a "duration" type, * which represents an elapsed amount of time, possibly negative. * * The type `mlib_duration_rep_t` is a typedef of the intregral type that is * used to represent duration units. * * The `mlib_duration` is a trivial object that represents a duration of time. * The internal representation should not be inspected outside of this file. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_DURATION_H_INCLUDED #define MLIB_DURATION_H_INCLUDED #include #include #include #include #include #include mlib_extern_c_begin(); /** * @brief The integral type used to represent a count of units of time. */ typedef int64_t mlib_duration_rep_t; /** * @brief Represents a duration of time, either positive, negative, or zero. * * @note A zero-initialized (static initialized) duration represents the zero * duration (no elapsed time) * * @note The time representation is intended to be abstract, and should be * converted to concrete units of time by calling the `_count` functions. */ typedef struct mlib_duration { /** * @brief The integral representation of the duration. * * Do not read or modify this field except to zero-initialize it. */ mlib_duration_rep_t _rep; } mlib_duration; /** * @brief A macro that expands to the maximum positive duration */ #define mlib_duration_max() (mlib_init(mlib_duration){mlib_maxof(mlib_duration_rep_t)}) /** * @brief A macro that expands to the minimum duration (a negative duration) */ #define mlib_duration_min() (mlib_init(mlib_duration){mlib_minof(mlib_duration_rep_t)}) /** * @brief Obtain the count of microseconds represented by the duration (round * toward zero) */ static inline mlib_duration_rep_t mlib_microseconds_count(const mlib_duration dur) mlib_noexcept { return dur._rep; } /** * @brief Obtain the count of milliseconds represented by the duration (round * toward zero) */ static inline mlib_duration_rep_t mlib_milliseconds_count(const mlib_duration dur) mlib_noexcept { return mlib_microseconds_count(dur) / 1000; } /** * @brief Obtain the count of seconds represented by the duration (rounded * toward zero) */ static inline mlib_duration_rep_t mlib_seconds_count(const mlib_duration dur) mlib_noexcept { return mlib_milliseconds_count(dur) / 1000; } /** * @brief Duration creation and manipulation shorthands * * This function-like macro is used to create and manipulate durations on-the-fly. * It can be called with the following syntaxes: * * - `mlib_duration()` (no arguments) * creates a zero-valued duration * - `mlib_duration()` * copies the duration object `` * - `mlib_duration(, )` * Creates a duration of `` instances of ``. * - `mlib_duration(, , )` * Manipulates a duration according to ``. * * In the above, `` may be a parenthesized `mlib_duration` argument list or a * duration object; `` must be an integral expression and `` is a * unit suffix identifer (see: `mlib_duration_with_unit`) to create a duration * of `` instances of ``, and `` is one of: * * - `plus`/`minus` to add/subtract two durations. * - `mul`/`div` to multiply/divide a duration by a scalar factor. * - `min`/`max` to get the minimum/maximum between two durations. * * All duration arithmetic/conversion operations use well-defined saturating * arithmetic, and never wrap or trap. */ #define mlib_duration(...) MLIB_EVAL_16(_mlibDurationMagic(__VA_ARGS__)) #define _mlibDurationMagic(...) \ MLIB_DEFERRED(MLIB_ARGC_PASTE(_mlib_duration, __VA_ARGS__)) \ (__VA_ARGS__) // Wraps a `` argument, and expands to the magic only if it is parenthesized #define _mlibDurationArgument(X) \ /* If given a parenthesized expression, act as an invocation of `mlib_duration() */ \ MLIB_IF_ELSE(MLIB_IS_PARENTHESIZED(X)) \ /* then: */ (_mlibDurationMagic X) /* else: */ (X) // Wrap a macro argument that should support the duration DSL #define mlib_duration_arg(X) MLIB_EVAL_16(_mlibDurationArgument(X)) // Zero arguments, just return a zero duration: #define _mlib_duration_argc_0() (mlib_init(mlib_duration){0}) // One argument, just copy the duration. Passing through a function forces the type to be correct #define _mlib_duration_argc_1(D) _mlibDurationCopy(D) // Two arguments, the second arg is a unit suffix: #define _mlib_duration_argc_2(Count, Unit) mlib_duration_with_unit(Count, Unit) // Three arguments, an infix operation: #define _mlib_duration_argc_3(Duration, Operator, Operand) \ MLIB_DEFERRED(MLIB_PASTE(_mlibDurationInfixOperator_, Operator)) \ (Duration, Operand) // By-value copy a duration static inline mlib_duration _mlibDurationCopy(mlib_duration d) { return d; } // Duration scalar multiply #define _mlibDurationInfixOperator_mul(LHS, Fac) \ _mlibDurationMultiply(_mlibDurationArgument(LHS), mlib_upsize_integer(Fac)) static inline mlib_duration _mlibDurationMultiply(const mlib_duration dur, mlib_upsized_integer fac) mlib_noexcept { mlib_duration ret = {0}; const bool overflowed = fac.is_signed ? mlib_mul(&ret._rep, dur._rep, fac.bits.as_signed) : mlib_mul(&ret._rep, dur._rep, fac.bits.as_unsigned); if (overflowed) { if ((dur._rep < 0) != (fac.is_signed && fac.bits.as_signed < 0)) { // Different signs: Neg × Pos = Neg ret = mlib_duration_min(); } else { // Same signs: Pos × Pos = Pos // Neg × Neg = Pos ret = mlib_duration_max(); } } return ret; } // Duration scalar divide #define _mlibDurationInfixOperator_div(LHS, Div) \ _mlibDurationDivide(_mlibDurationArgument(LHS), mlib_upsize_integer(Div)) static inline mlib_duration _mlibDurationDivide(mlib_duration a, mlib_upsized_integer div) mlib_noexcept { mlib_check(div.bits.as_unsigned, neq, 0); if ((div.is_signed && div.bits.as_signed == -1) // && a._rep == mlib_minof(mlib_duration_rep_t)) { // MIN / -1 is UB, but the saturating result is the max a = mlib_duration_max(); } else { if (div.is_signed) { a._rep /= div.bits.as_signed; } else { a._rep = (mlib_duration_rep_t)((uintmax_t)a._rep / div.bits.as_unsigned); } } return a; } // Duration addition #define _mlibDurationInfixOperator_plus(LHS, RHS) \ _mlibDurationAdd(_mlibDurationArgument(LHS), _mlibDurationArgument(RHS)) static inline mlib_duration _mlibDurationAdd(const mlib_duration a, const mlib_duration b) mlib_noexcept { mlib_duration ret = {0}; if (mlib_add(&ret._rep, a._rep, b._rep)) { if (a._rep > 0) { ret = mlib_duration_max(); } else { ret = mlib_duration_min(); } } return ret; } // Duration subtraction #define _mlibDurationInfixOperator_minus(LHS, RHS) \ _mlibDurationSubtract(_mlibDurationArgument(LHS), _mlibDurationArgument(RHS)) static inline mlib_duration _mlibDurationSubtract(const mlib_duration a, const mlib_duration b) mlib_noexcept { mlib_duration ret = {0}; if (mlib_sub(&ret._rep, a._rep, b._rep)) { if (a._rep < 0) { ret = mlib_duration_min(); } else { ret = mlib_duration_max(); } } return ret; } #define _mlibDurationInfixOperator_min(Duration, RHS) \ _mlibDurationMinBetween(_mlibDurationArgument(Duration), _mlibDurationArgument(RHS)) static inline mlib_duration _mlibDurationMinBetween(mlib_duration lhs, mlib_duration rhs) { if (lhs._rep < rhs._rep) { return lhs; } return rhs; } #define _mlibDurationInfixOperator_max(Duration, RHS) \ _mlibDurationMaxBetween(_mlibDurationArgument(Duration), _mlibDurationArgument(RHS)) static inline mlib_duration _mlibDurationMaxBetween(mlib_duration lhs, mlib_duration rhs) { if (lhs._rep > rhs._rep) { return lhs; } return rhs; } /** * @brief Create a duration object from a count of some unit of time * * @param Count An integral expression * @param Unit A unit suffix identifier, must be one of: * * - `ns` (nanoseconds) * - `us` (microseconds) * - `ms` (milliseconds) * - `s` (seconds) * - `mn` (minutes) * - `h` (hours) * * Other unit suffixes will generate a compile-time error */ #define mlib_duration_with_unit(Count, Unit) \ MLIB_PASTE(_mlibCreateDurationFromUnitCount_, Unit)(mlib_upsize_integer(Count)) static inline mlib_duration _mlibCreateDurationFromUnitCount_us(const mlib_upsized_integer n) mlib_noexcept { mlib_duration ret = mlib_duration(); if (n.is_signed) { // The duration rep is the same as the signed max type, so we don't need to do any // special arithmetic to encode it mlib_static_assert(sizeof(mlib_duration_rep_t) == sizeof(n.bits.as_signed)); ret._rep = mlib_assert_narrow(mlib_duration_rep_t, n.bits.as_signed); } else { if (mlib_narrow(&ret._rep, n.bits.as_unsigned)) { // Unsigned value is too large to fit in our signed repr, so just use the max repr ret = mlib_duration_max(); } } return ret; } static inline mlib_duration _mlibCreateDurationFromUnitCount_ns(mlib_upsized_integer n) mlib_noexcept { // We encode as a count of microseconds, so we lose precision here. if (n.is_signed) { n.bits.as_signed /= 1000; } else { n.bits.as_unsigned /= 1000; } return _mlibCreateDurationFromUnitCount_us(n); } static inline mlib_duration _mlibCreateDurationFromUnitCount_ms(const mlib_upsized_integer n) mlib_noexcept { return mlib_duration(_mlibCreateDurationFromUnitCount_us(n), mul, 1000); } static inline mlib_duration _mlibCreateDurationFromUnitCount_s(const mlib_upsized_integer n) { return mlib_duration(_mlibCreateDurationFromUnitCount_us(n), mul, 1000 * 1000); } static inline mlib_duration _mlibCreateDurationFromUnitCount_mn(const mlib_upsized_integer n) { return mlib_duration(_mlibCreateDurationFromUnitCount_us(n), mul, 60 * 1000 * 1000); } static inline mlib_duration _mlibCreateDurationFromUnitCount_h(const mlib_upsized_integer n) { return mlib_duration(_mlibCreateDurationFromUnitCount_mn(n), mul, 60); } /** * @brief Compare two durations * * @retval <0 If `a` is less-than `b` * @retval >0 If `b` is less-than `a` * @retval 0 If `a` and `b` are equal durations * * @note This is a function-like macro that can be called with an infix operator * as the second argument to do natural duration comparisons: * * ``` * mlib_duration_cmp(, , ) * ``` * * Where each `` should be an arglist for @see mlib_duration */ static inline enum mlib_cmp_result mlib_duration_cmp(const mlib_duration a, const mlib_duration b) mlib_noexcept { return mlib_cmp(a._rep, b._rep); } #define mlib_duration_cmp(...) MLIB_ARGC_PICK(_mlibDurationCmp, __VA_ARGS__) #define _mlibDurationCmp_argc_2 mlib_duration_cmp #define _mlibDurationCmp_argc_3(Left, Op, Right) \ (mlib_duration_cmp(mlib_duration_arg(Left), mlib_duration_arg(Right)) Op 0) /** * @brief Obtain an mlib_duration that corresponds to a `timespec` value * * @note The `timespec` type may represent times outside of the range of, or * more precise than, what is representable in `mlib_duration`. In such case, * the returned duration will be the nearest representable duration, rounded * toward zero. */ static inline mlib_duration mlib_duration_from_timespec(const struct timespec ts) mlib_noexcept { return mlib_duration((ts.tv_sec, s), plus, (ts.tv_nsec, ns)); } /** * @brief Create a C `struct timespec` that corresponds to the given duration * * @param d The duration to be converted * @return struct timespec A timespec that represents the same durations */ static inline struct timespec mlib_duration_to_timespec(const mlib_duration d) mlib_noexcept { // Number of full seconds in the duration const mlib_duration_rep_t n_full_seconds = mlib_seconds_count(d); // Duration with full seconds removed const mlib_duration usec_part = mlib_duration(d, minus, (n_full_seconds, s)); // Number of microseconds in the duration, minus all full seconds const mlib_duration_rep_t n_remaining_microseconds = mlib_microseconds_count(usec_part); // Compute the number of nanoseconds: const int32_t n_nsec = mlib_assert_mul(int32_t, n_remaining_microseconds, 1000); struct timespec ret; ret.tv_sec = n_full_seconds; ret.tv_nsec = n_nsec; return ret; } mlib_extern_c_end(); #endif // MLIB_DURATION_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/intencode.h000066400000000000000000000232001511661753600222660ustar00rootroot00000000000000/** * @file mlib/intencode.h * @brief Integer encoding functions * @date 2025-01-31 * * @copyright Copyright (c) 2025 * * 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. */ #pragma once #include #include #include #include #include #include #include /** * @brief Decode an unsigned 32-bit little-endian integer from a memory buffer */ static inline uint32_t mlib_read_u32le(const void *buf) { uint32_t ret = 0; if (mlib_is_little_endian()) { // Optimize: The platform uses a LE encoding already memcpy(&ret, buf, sizeof ret); } else { // Portable decode of an LE integer const uint8_t *cptr = (const uint8_t *)buf; mlib_foreach_urange (i, sizeof ret) { ret <<= 8; ret |= cptr[(sizeof ret) - i - 1]; } } return ret; } /** * @brief Decode an signed 32-bit little-endian integer from a memory buffer */ static inline int32_t mlib_read_i32le(const void *buf) { const uint32_t u = mlib_read_u32le(buf); int32_t r; memcpy(&r, &u, sizeof r); return r; } /** * @brief Decode an unsigned 64-bit little-endian integer from a memory buffer */ static inline uint64_t mlib_read_u64le(const void *buf) { uint64_t ret = 0; if (mlib_is_little_endian()) { // Optimize: The platform uses a LE encoding already memcpy(&ret, buf, sizeof ret); } else { // Portable decode of an LE integer const uint8_t *cptr = (const uint8_t *)buf; mlib_foreach_urange (i, sizeof ret) { ret <<= 8; ret |= cptr[(sizeof ret) - i - 1]; } } return ret; } /** * @brief Decode an signed 64-bit little-endian integer from a memory buffer */ static inline int64_t mlib_read_i64le(const void *buf) { const uint64_t u = mlib_read_u64le(buf); int64_t r; memcpy(&r, &u, sizeof r); return r; } /** * @brief Write an unsigned 32-bit little-endian integer into a destination * * @return void* The address after the written value */ static inline void * mlib_write_u32le(void *out, const uint32_t value) { uint8_t *o = (uint8_t *)out; if (mlib_is_little_endian()) { memcpy(o, &value, sizeof value); return o + sizeof value; } mlib_foreach_urange (i, sizeof value) { *o++ = (value >> (8u * i)) & 0xffu; } return o; } /** * @brief Write a signed 32-bit little-endian integer into a destination * * @return void* The address after the written value */ static inline void * mlib_write_i32le(void *out, int32_t value) { return mlib_write_u32le(out, (uint32_t)value); } /** * @brief Write an unsigned 64-bit little-endian integer into a destination * * @return void* The address after the written value */ static inline void * mlib_write_u64le(void *out, const uint64_t value) { uint8_t *o = (uint8_t *)out; if (mlib_is_little_endian()) { memcpy(o, &value, sizeof value); return o + sizeof value; } mlib_foreach_urange (i, sizeof value) { *o++ = (value >> (8u * i)) & 0xffu; } return o; } /** * @brief Write an signed 64-bit little-endian integer into a destination * * @return void* The address after the written value */ static inline void * mlib_write_i64le(void *out, int64_t value) { return mlib_write_u64le(out, (uint64_t)value); } /** * @brief Write a little-endian 64-bit floating point (double) to the given * memory location * * @return void* The address after the written value. */ static inline void * mlib_write_f64le(void *out, double d) { mlib_static_assert(sizeof(double) == sizeof(uint64_t)); uint64_t bits; memcpy(&bits, &d, sizeof d); return mlib_write_u64le(out, bits); } /** * @brief Decode a 64-bit natural number * * @param in The input string to be decoded. Does not support a sign or base prefix! * @param base The base to be decoded. Must not be zero! * @param out Pointer that receives the decoded value * @return int A result code for the operation. * * See `mlib_i64_parse` for more details. */ static inline int mlib_nat64_parse(mstr_view in, unsigned base, uint64_t *out) { if (in.len == 0) { // Empty string is not valid return EINVAL; } // Accummulate into this value: uint64_t value = 0; // Whether any operation in the parse overflowed the integer value bool did_overflow = false; // Loop until we have consumed the full string, or encounter an invalid digit while (in.len) { // Shift place value for another digit did_overflow = mlib_mul(&value, base) || did_overflow; // Case-fold for alpha digits int32_t digit = mlib_latin_tolower(in.data[0]); unsigned digit_value = 0; // Only standard digits if (digit >= '0' && digit <= '9') { // Normal digit digit_value = (unsigned)(digit - '0'); } else if (digit >= 'a' && digit <= 'z') { // Letter digits digit_value = (unsigned)(digit - 'a') + 10; } else { // Not a valid alnum digit return EINVAL; } if (digit_value >= base) { // The digit value is out-of-range for our chosen base return EINVAL; } // Accumulate the new digit value did_overflow = mlib_add(&value, digit_value) || did_overflow; // Jump to the next digit in the string in = mstr_substr(in, 1); } if (did_overflow) { return ERANGE; } (void)(out && (*out = value)); return 0; } /** * @brief Parse a string as a 64-bit signed integer * * @param in The string of digits to be parsed. * @param base Optional: The base to use for parsing. Use "0" to infer the base. * @param out Optional storage for an int64 value to be updated with the result * @return int Returns an errno value for the parse * * - A value of `0` indicates that the parse was successful. * - A value of `EINVAL` indicates that the input string is not a valid * representation of an integer. * - A value of `ERANGE` indicates that the input string is a valid integer, * but the actual encoded value cannot be represented in an `int64_t` * - If the parse fails (returns non-zero), then the value at `*out` will remain * unmodified. * * This differs from `strtoll` in that it requires that the entire string be * parsed as a valid integer. If parsing stops early, then the result will indicate * an error of EINVAL. */ static inline int mlib_i64_parse(mstr_view in, unsigned base, int64_t *out) { if (in.len == 0) { // Empty string is not a valid integer return EINVAL; } // Parse the possible sign prefix int sign = 1; // Check for a "+" if (in.data[0] == '+') { // Just a plus. Drop it and do nothing with it. in = mstr_substr(in, 1); } // Check for a negative prefix else if (in.data[0] == '-') { // Negative sign. We'll negate the value later. in = mstr_substr(in, 1); sign = -1; } // Infer the base value, if we have one if (base == 0) { if (in.len && in.data[0] == '0') { if (in.len > 1) { if (mlib_latin_tolower(in.data[1]) == 'x') { // Hexadecimal base = 16; in = mstr_substr(in, 2); } else if (mlib_latin_tolower(in.data[1]) == 'o') { // Octal base = 8; in = mstr_substr(in, 2); } else if (mlib_latin_tolower(in.data[1]) == 'b') { // Binary base = 2; in = mstr_substr(in, 2); } } if (base == 0) { // Other: Octal with a single "0" prefix. Don't trim this, because // it may be a literal "0" base = 8; } } else { // No '0' prefix. Treat it as decimal base = 10; } } // Try to parse the natural number now that we have removed all prefixes and // have a non-zero base. uint64_t nat; int rc = mlib_nat64_parse(in, base, &nat); if (rc) { return rc; } // Try to narrow from the u64 to i64 and apply the sign. This must be done as // one operation because of the pathological case of parsing INT64_MIN int64_t i64 = 0; if (mlib_mul(&i64, nat, sign)) { return ERANGE; } (void)(out && (*out = i64)); return 0; } #define mlib_i64_parse(...) MLIB_ARGC_PICK(_mlib_i64_parse, __VA_ARGS__) #define _mlib_i64_parse_argc_2(S, Ptr) _mlib_i64_parse_argc_3((S), 0, (Ptr)) #define _mlib_i64_parse_argc_3(S, Base, Ptr) mlib_i64_parse(mstr_view_from((S)), Base, Ptr) /** * @brief Parse a 32-bit integer from a string. * * See `mlib_i64_parse` for more details. */ static inline int mlib_i32_parse(mstr_view in, unsigned base, int32_t *out) { int64_t tmp; int ec = mlib_i64_parse(in, base, &tmp); if (ec) { // Failed to parse the int64 value. return ec; } // Attempt to narrow to a 32-bit value int32_t i32 = 0; if (mlib_narrow(&i32, tmp)) { // Value is out-of-range return ERANGE; } // Success (void)(out && (*out = i32)); return 0; } #define mlib_i32_parse(...) MLIB_ARGC_PICK(_mlib_i32_parse, __VA_ARGS__) #define _mlib_i32_parse_argc_2(S, Ptr) _mlib_i32_parse_argc_3((S), 0, (Ptr)) #define _mlib_i32_parse_argc_3(S, Base, Ptr) mlib_i32_parse(mstr_view_from((S)), Base, Ptr) mongo-c-driver-2.2.1/src/common/src/mlib/intutil.h000066400000000000000000000121071511661753600220120ustar00rootroot00000000000000/** * @file mlib/intutil.h * @brief Integer utilities * @date 2025-01-28 * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_INTUTIL_H_INCLUDED #define MLIB_INTUTIL_H_INCLUDED #include #include #include #include /** * @brief Given an integral type, evaluates to `true` if that type is signed, * otherwise `false` */ #define mlib_is_signed(T) (!((T)(-1) > 0)) /** * @brief Like `sizeof`, but returns the number of bits in the object representation */ #define mlib_bitsizeof(T) ((sizeof(T)) * ((size_t)CHAR_BIT)) // clang-format off /** * @brief Generate a mask of contiguous bits. * * @param NumOnes The non-negative number of contiguous 1 bits * @param NumZeros The non-negative number of contiguous 0 bits to set in the low position * * The generated mask is of the form: * * NumZeros * │ * ┌┴─┠* │ │ * `0..0 1..1 0..0` * │ │ * └┬─┘ * │ * NumOnes * * Explain the arithmetic below: * * 1. `ones = 0b1111...` : All high bits * 2. `tmp = ones >> (NumOnes - num_bits_of(ones))` : Truncate to the number of 1s we want * 3. `res = tmp << NumZeros` : Add the 0s in the low position */ #define mlib_bits(NumOnes, NumZeros) ( \ ((NumOnes) \ ? (~UINTMAX_C(0) >> ((mlib_bitsizeof(uintmax_t) - (uintmax_t)(NumOnes)))) \ : 0) \ << ((uintmax_t)(NumZeros))) /** * @brief Given an integral type, yield an integral constant value representing * the maximal value of that type. */ #define mlib_maxof(T) \ ((T) (mlib_is_signed (T) \ ? ((T) mlib_bits(mlib_bitsizeof(T) - 1u, 0)) \ : ((T) mlib_bits(mlib_bitsizeof(T), 0)))) /** * @brief Given an integral type, yield an integral constant value for the * minimal value of that type. */ #define mlib_minof(T) \ ((T) (!mlib_is_signed (T) \ ? (T) 0 \ : (T) mlib_bits(1, mlib_bitsizeof(T) - 1u))) // clang-format on /** * @brief A container for an integer that has been "scaled up" to maximum precision * * Don't create this manually. Instead, use `mlib_upsize_integer` to do it automatically */ typedef struct mlib_upsized_integer { union { // The signed value of the integer intmax_t as_signed; // The unsigned value of the integer uintmax_t as_unsigned; } bits; // Whether the upscaled integer bits should be treated as a two's complement signed integer bool is_signed; } mlib_upsized_integer; // clang-format off /** * @brief Create an "upsized" version of an integer, normalizing all integral * values into a single type so that we can deduplicate functions that operate * on disparate integer types. * * Details: The integer is upcast into the maximum precision integer type (intmax_t). If * the operand is smaller than `intmax_t`, we assume that casting to the signed `intmax_t` * is always safe, even if the operand is unsigned, since e.g. a u32 can always be cast to * an i64 losslessly. * * If the integer to upcast is the same size as `intmax_t`, we need to decide whether to store * it as unsigned. The expression `(_mlibGetOne(Value)) - 2 < 1` will be `true` iff the operand is signed, * otherwise false. If the operand is signed, we can safely cast to `intmax_t` (it probably already * is of that type), otherwise, we cast to `uintmax_t` and the returned `mlib_upsized_integer` will * indicate that the stored value is unsigned. The expression `1 - 2 < 1` is chosen * to avoid `-Wtype-limits` warnings from some compilers about unsigned comparison. */ #define mlib_upsize_integer(Value) \ mlib_upsize_integer((uintmax_t)(intmax_t)((Value)), _mlibShouldTreatBitsAsSigned(Value)) #define _mlibShouldTreatBitsAsSigned(Value) \ /* NOLINTNEXTLINE(bugprone-sizeof-expression) */ \ (sizeof ((Value)) < sizeof (intmax_t) || (_mlibGetOne(Value) - 2) < _mlibGetOne(Value)) // Yield a 1 value of similar-ish type to the given expression. The ternary // forces an integer promotion of literal 1 match the type of `V`, while leaving // `V` unevaluated. Note that this will also promote `V` to be at least `(unsigned) int`, // so the 1 value is only "similar" to `V`, and may be of a larger type #define _mlibGetOne(V) (1 ? 1 : (V)) // Function impl for upsize_integer static inline mlib_upsized_integer (mlib_upsize_integer) (uintmax_t bits, bool treat_as_signed) { mlib_upsized_integer ret; ret.bits.as_unsigned = bits; ret.is_signed = treat_as_signed; return ret; } // clang-format on #endif // MLIB_INTUTIL_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/loop.h000066400000000000000000000161501511661753600212750ustar00rootroot00000000000000/** * @file mlib/loop.h * @brief Looping utility macros * @date 2025-01-29 * * @copyright Copyright (c) 2025 * * 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 MLIB_LOOP_H_INCLUDED #define MLIB_LOOP_H_INCLUDED #include #include #include // u/intmax_t /** * @brief Begin a loop over a range of integer values. Supports: * * - `mlib_foreach_{u,i}range(Var, Stop)` * - `mlib_foreach_{u,i}range(Var, Start, Stop)` * * If omitted, starts at zero. The loop does not include the `Stop` value. The `Var` * variable cannot be modified within the loop. The loop variable is declared as the maximum * precision type for the requested signedness. */ #define mlib_foreach_urange(...) MLIB_ARGC_PICK(_mlib_foreach_urange, __VA_ARGS__) #define mlib_foreach_irange(...) MLIB_ARGC_PICK(_mlib_foreach_irange, __VA_ARGS__) #define _mlib_foreach_urange_argc_2(VarName, Stop) _mlib_foreach_urange_argc_3(VarName, 0, Stop) #define _mlib_foreach_urange_argc_3(VarName, Start, Stop) \ _mlibForeachRange(uintmax_t, \ VarName, \ Start, \ Stop, \ MLIB_PASTE(VarName, _start), \ MLIB_PASTE(VarName, _stop), \ MLIB_PASTE(VarName, _counter)) #define _mlib_foreach_irange_argc_2(VarName, Stop) _mlib_foreach_irange_argc_3(VarName, 0, Stop) #define _mlib_foreach_irange_argc_3(VarName, Start, Stop) \ _mlibForeachRange(intmax_t, \ VarName, \ Start, \ Stop, \ MLIB_PASTE(VarName, _start), \ MLIB_PASTE(VarName, _stop), \ MLIB_PASTE(VarName, _counter)) /** * @brief Loop over a pointed-to array * * @param T The type of the array elements * @param Var Identifier to declare as the pointer to the current element * @param ArrayPtr A pointer to the beginning of the array * @param Count The number of elements in the array */ #define mlib_foreach(T, Var, ArrayPtr, Count) \ _mlibForeach(T, Var, ArrayPtr, Count, MLIB_PASTE(Var, _start), MLIB_PASTE(Var, _stop), MLIB_PASTE(Var, _iter)) /** * @brief Loop over the elements of a C array * * @param T the type of the array elements * @param Var Identifier to declare as the pointer to the current element * @param Array An expression of array type (not a pointer) */ #define mlib_foreach_arr(T, Var, Array) mlib_foreach (T, Var, Array, (sizeof Array / sizeof Array[0])) // clang-format off #define _mlibForeachRange(VarType, VarName, StartValue, StopValue, StartVar, StopVar, Counter) \ _mlibLoopMagicBegin() \ /* Capture the starting and stopping value first */ \ for (VarType StartVar = (StartValue), StopVar = (StopValue); !_mlibLoopIsDone;) \ _mlibLoopMagicEnd( \ /* Init counter to the start value */ \ VarType Counter = StartVar, \ /* Stop when the counter is not less than the stop value */ \ (_mlibLoopState.first = Counter == StartVar, \ _mlibLoopState.last = Counter + 1 == StopVar, \ Counter < StopVar), \ /* Increment the counter at loop end */ \ ++Counter, \ /* Declare the loop variable as const at the start of each iteraiton */ \ const VarType VarName = Counter) #define _mlibForeach(T, VarName, ArrayPtr, Count, StartVar, StopVar, Iter) \ _mlibLoopMagicBegin() \ /* Capture the starting and stopping position so we only evaluate them once */ \ for (T* const StartVar = (ArrayPtr) + 0; !_mlibLoopIsDone;) \ for (T* const StopVar = StartVar + (Count); !_mlibLoopIsDone;) \ _mlibLoopMagicEnd( \ /* Init the iteration pointer to the array start */ \ T* Iter = StartVar, \ /* Stop when the iterator points to the stop position */ \ (_mlibLoopState.first = Iter == StartVar, \ _mlibLoopState.last = Iter + 1 == StopVar, \ Iter != StopVar), \ /* Advance the iterator on each loop */ \ ++Iter, \ /* Declare a constant pointer to the current element at the top of the loop */ \ T* const VarName = Iter) #define _mlibLoopDidBreak MLIB_PASTE(_mlibLoopDidBreak_lno_, __LINE__) #define _mlibLoopOnce MLIB_PASTE(_mlibLoopOnce_lno_, __LINE__) #define _mlibLoopIsDone MLIB_PASTE(_mlibLoopIsDone_lno_, __LINE__) #define _mlibLoopIsState MLIB_PASTE(_mlibLoopIsState_lno_, __LINE__) #define _mlibLoopMagicBegin() \ /* Loop stop condition */ \ for (int _mlibLoopIsDone = 0; !_mlibLoopIsDone;) \ /* Track if the user broke out of the inner loop */ \ for (int _mlibLoopDidBreak = 0; !_mlibLoopIsDone;) \ /* Loop variables */ \ for (struct mlib_loop_state _mlibLoopState = {0, 0, 0}; !_mlibLoopIsDone;) /** * @brief Struct type declared within the scope of an `mlib_foreach` loop, which * contains information about the running loop. */ struct mlib_loop_state { // The current zero-based index of the loop size_t index; // Whether the current iteration is the first in the loop bool first; // Whether the current iteration will be the last in the loop bool last; }; /// InitStmt: Statement that executes once at the top of the loop /// ContinueCond: Condition at which the loop will stop /// StepExpr: Expression for the loop step /// HeadStmt: A statement that appears at the head of the loop, executed once on each iteration #define _mlibLoopMagicEnd(InitStmt, ContinueCond, StepExpr, HeadStmt) \ for (\ /* Run the init statement */ \ InitStmt; \ /* Test the loop condition, unless we `break` out of the loop */ \ !(_mlibLoopIsDone = _mlibLoopIsDone || !(ContinueCond)); \ /* Run the step expression, unless we `break` from the loop */ \ (void)(_mlibLoopIsDone || ((void)(StepExpr), 1))) \ /* `break` detection: */ \ for (int _mlibLoopOnce = 0; !_mlibLoopOnce; _mlibLoopOnce = 1, _mlibLoopIsDone = _mlibLoopDidBreak) \ /* Loop state information */ \ for (const struct mlib_loop_state loop = _mlibLoopState; \ !_mlibLoopOnce; \ ((void)loop, _mlibLoopOnce = 1, ++_mlibLoopState.index)) \ for (HeadStmt; \ /* Set `_mlibLoopDidBreak` to true at the start of the loop: */ \ !_mlibLoopOnce && (_mlibLoopDidBreak = 1); \ /* If loop exits normally, set `_mlibLoopDidBreak` to false */ \ _mlibLoopDidBreak = 0, _mlibLoopOnce = 1) // clang-format on #endif // MLIB_LOOP_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/platform.h000066400000000000000000000032471511661753600221530ustar00rootroot00000000000000/** * @file mlib/platform.h * @brief Operating System Headers and Definitions * @date 2025-04-21 * * This file will conditionally include the general system headers available * for the current host platform. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_PLATFORM_H_INCLUDED #define MLIB_PLATFORM_H_INCLUDED // clang-format off // Windows headers #ifdef _WIN32 // Check that our WINNT version isn't too old to be used #if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x601) #undef _WIN32_WINNT #endif #ifndef _WIN32_WINNT // Request a new-enough version of the Win32 API (required for MinGW) #define _WIN32_WINNT 0x601 #endif // Winsock must be included before windows.h #include // IWYU pragma: export #include // IWYU pragma: export #endif // POSIX headers #if defined(__unix__) || defined(__unix) || defined(__APPLE__) #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #endif // clang-format on #endif // MLIB_PLATFORM_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/str.h000066400000000000000000001237251511661753600211430ustar00rootroot00000000000000/** * @file mlib/str.h * @brief String handling utilities * @date 2025-04-30 * * This file provides utilities for handling *sized* strings. That is, strings * that carry their size, and do not rely on null termination. These APIs also * do a lot more bounds checking than is found in ``. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_STR_H_INCLUDED #define MLIB_STR_H_INCLUDED #include #include #include #include #include #include #include // va_list #include #include #include #include // vsnprintf #include // malloc/free #include // memcpy /** * @brief A simple non-owning string-view type. * * The viewed string can be treated as an array of `char`. It's pointed-to data * must not be freed or manipulated. * * @note The viewed string is NOT guaranteed to be null-terminated. It WILL * be null-terminated if: Directly created from a string literal, a C string, or * a null-terminated `mstr_view`. * @note The viewed string MAY contain nul (zero-value) characters, so using them * with C string APIs could truncate unexpectedly. * @note The view itself may be "null" if the `data` member of the string view * is a null pointer. A zero-initialized `mstr_view` is null. */ typedef struct mstr_view { /** * @brief Pointer to the string data viewed by this object. * * - This pointer may be null, in which case the string view itself is "null". * - If `len > 1`, then this points to a contiguous array of `char` of length * `len`. * - If `len == 1`, then this *may* point to a single `char` object. * - The pointed-to string might not be a null-terminated C string. Accessing * the `char` value at `data[len]` is undefined behavior. */ const char *data; /** * @brief The length of the viewed string pointed-to by `data` * * If `data` points to a single `char` object, then this must be `1`. If * `data` is a null pointer, then this value should be zero. */ size_t len; } mstr_view; /** * @brief Expand to the two printf format arguments required to format an mstr object * * You should use the format specifier `%.*s' for all mstr strings. * * This is just a convenience shorthand. */ #define MSTR_FMT(S) (int)mstr_view_from(S).len, mstr_view_from(S).data /** * @brief Create an `mstr_view` that views the given array of `char` * * @param data Pointer to the beginning of the string, or pointer to a single * `char`, or a null pointer * @param len Length of the new string-view. If `data` points to a single `char`, * this must be `0` or `1`. If `data` is a null pointer, this should be `0`. * * @note This is defined as a macro that expands to a compound literal to prevent * proliferation of redundant function calls in debug builds. */ #define mstr_view_data(DataPointer, Length) (mlib_init(mstr_view){(DataPointer), (Length)}) #if 1 // See "!! NOTE" below /** * @brief Coerce a string-like object to an `mstr_view` of that string * * This macro requires that the object have `.data` and `.len` members. * * @note This macro will double-evaluate its argument. */ #define mstr_view_from(X) mstr_view_data((X).data, (X).len) /** * ! NOTE: The disabled snippet below is kept for posterity as a drop-in replacment * ! for mstr_view_from with support for _Generic. * * When we can increase the compiler requirements to support _Generic, the following * macro definition alone makes almost every function in this file significantly * more concise to use, as it allows us to pass a C string to any API that * expects an `mstr_view`, enabling code like this: * * ``` * mstr s = get_string(); * if (mstr_cmp(s, ==, "magicKeyword")) { * Do something... * } * ``` * * This also allows us to avoid the double-evaluation problem presented by * `mstr_view_from` being defined as above. * * Without _Generic, we require all C strings to be wrapped with `mstr_cstring`, * which isn't especially onerous, but it is annoying. Additionally, the below * `_Generic` macro can be extended to support more complex string-like types. * * For reference, support for _Generic requires the following compilers: * * - MSVC 19.28.0+ (VS 2019, 16.8.1) * - GCC 4.9+ * - Clang 3.0+ */ #else /** * @brief Coerce an object to an `mstr_view` * * The object requires a `data` and `len` member */ #define mstr_view_from(X) \ _Generic((X), mstr_view: _mstr_view_trivial_copy, char *: mstr_cstring, const char *: mstr_cstring)((X)) // Just copy an mstr_view by-value static inline mstr_view _mstr_view_trivial_copy(mstr_view s) { return s; } #endif /** * @brief Create an `mstr_view` referring to the given null-terminated C string * * @param s Pointer to a C string. The length of the returned string is infered using `strlen` * * This should not defined as a macro, because defining it as a macro would require * double-evaluating for the call to `strlen`. */ static inline mstr_view mstr_cstring(const char *s) { const size_t l = strlen(s); return mstr_view_data(s, l); } /** * @brief Compare two strings lexicographically by each code unit * * If called with two arguments behaves the same as `strcmp`. If called with * three arguments, the center argument should be an infix operator to perform * the semantic comparison. */ static inline enum mlib_cmp_result mstr_cmp(mstr_view a, mstr_view b) { size_t l = a.len; if (b.len < l) { l = b.len; } // Use `memcmp`, not `strncmp`: We want to respect nul characters int r = memcmp(a.data, b.data, l); if (r) { // Not equal: Compare with zero to normalize to the cmp_result value return mlib_cmp(r, 0); } // Same prefixes, the ordering is now based on their length (longer string > shorter string) return mlib_cmp(a.len, b.len); } #define mstr_cmp(...) MLIB_ARGC_PICK(_mstr_cmp, __VA_ARGS__) #define _mstr_cmp_argc_2(A, B) mstr_cmp(mstr_view_from(A), mstr_view_from(B)) #define _mstr_cmp_argc_3(A, Op, B) (_mstr_cmp_argc_2(A, B) Op 0) /** * @brief If the given codepoint is a Basic Latin (ASCII) uppercase character, * return the lowercase character. Other codepoint values are returned unchanged. * * This is safer than `tolower`, because it doesn't respect locale and has no * undefined behavior. */ static inline int32_t mlib_latin_tolower(int32_t a) { if (a >= 0x41 /* "A" */ && a <= 0x5a /* "Z" */) { a += 0x20; // Adjust from "A" -> "a" } return a; } /** * @brief Compare two individual codepoint values, with case-insensitivity in * the Basic Latin range. */ static inline enum mlib_cmp_result mlib_latin_charcasecmp(int32_t a, int32_t b) { return mlib_cmp(mlib_latin_tolower(a), mlib_latin_tolower(b)); } /** * @brief Compare two strings lexicographically, case-insensitive in the Basic * Latin range. * * If called with two arguments, behaves the same as `strcasecmp`. If called with * three arguments, the center argument should be an infix operator to perform * the semantic comparison. */ static inline enum mlib_cmp_result mstr_latin_casecmp(mstr_view a, mstr_view b) { size_t l = a.len; if (b.len < l) { l = b.len; } mlib_foreach_urange (i, l) { // We don't need to do any UTF-8 decoding, because our case insensitivity // only activates for 1-byte encoded codepoints, and all other valid UTF-8 // sequences will collate equivalently with byte-wise comparison to a UTF-32 // encoding. enum mlib_cmp_result r = mlib_latin_charcasecmp(a.data[i], b.data[i]); if (r) { // Not equivalent at this code unit. Return this as the overall string ordering. return r; } } // Same prefixes, the ordering is now based on their length (longer string > shorter string) return mlib_cmp(a.len, b.len); } #define mstr_latin_casecmp(...) MLIB_ARGC_PICK(_mstr_latin_casecmp, __VA_ARGS__) #define _mstr_latin_casecmp_argc_2(A, B) mstr_latin_casecmp(mstr_view_from(A), mstr_view_from(B)) #define _mstr_latin_casecmp_argc_3(A, Op, B) (_mstr_latin_casecmp_argc_2(A, B) Op 0) /** * @brief Adjust a possibly negative index position to wrap around for a string * * @param s The string to be respected for index wrapping * @param pos The maybe-negative index to be adjusted * @param clamp_to_length If `true` and given a non-negative value, if that * value is greater than the string length, this function will return the string * length instead. * @return size_t The new zero-based non-negative index * * If `pos` is negative, then it represents indexing from the end of the string, * where `-1` refers to the last character in the string, `-2` the penultimate, * etc. If the absolute value is greater than the length of the string, the * program will be terminated. */ static inline size_t _mstr_adjust_index(mstr_view s, mlib_upsized_integer pos, bool clamp_to_length) { if (clamp_to_length && (mlib_cmp)(pos, mlib_upsize_integer(s.len), 0) == mlib_greater) { // We want to clamp to the length, and the given value is greater than the string length. return s.len; } if (pos.is_signed && pos.bits.as_signed < 0) { // This will add the negative value to the length of the string. If such // an operation would result a negative value, this will terminate the // program. return mlib_assert_add(size_t, s.len, pos.bits.as_signed); } // No special behavior, just assert that the given position is in-bounds for the string mlib_check( pos.bits.as_unsigned <= s.len, because, "the string position index must not be larger than the string length"); return pos.bits.as_unsigned; } /** * @brief Obtain the code unit at the given zero-based index, with negative index wrapping. * * This function asserts that the index is in-bounds for the given string. * * @param s The string to be inspected. * @param pos The index to access. Zero is the first code unit, and -1 is the last. * @return char The code unit at position `pos`. */ static inline char mstr_at(mstr_view s, mlib_upsized_integer pos_) { size_t pos = _mstr_adjust_index(s, pos_, false); return s.data[pos]; } #define mstr_at(S, Pos) (mstr_at)(mstr_view_from(S), mlib_upsize_integer(Pos)) /** * @brief Create a new `mstr_view` that views a substring within another string * * @param s The original string view to be inspected * @param pos The number of `char` to skip in `s`, or a negative value to * pos from the end of the string. * @param len The length of the new string view (optional, default SIZE_MAX) * * The length of the string view is clamped to the characters available in `s`, * so passing a too-large value for `len` is well-defined. Passing a too-large * value for `pos` will abort the program. * * Callable as: * * - `mstr_substr(s, pos)` * - `mstr_substr(s, pos, len)` */ static inline mstr_view mstr_substr(mstr_view s, mlib_upsized_integer pos_, size_t len) { const size_t pos = _mstr_adjust_index(s, pos_, false); // Number of characters in the string after we remove the prefix const size_t remain = s.len - pos; // Clamp the new length to the size that is actually available. if (len > remain) { len = remain; } return mstr_view_data(s.data + pos, len); } #define mstr_substr(...) MLIB_ARGC_PICK(_mstr_substr, __VA_ARGS__) #define _mstr_substr_argc_2(Str, Start) _mstr_substr_argc_3(Str, Start, SIZE_MAX) #define _mstr_substr_argc_3(Str, Start, Stop) mstr_substr(mstr_view_from(Str), mlib_upsize_integer(Start), Stop) /** * @brief Obtain a slice of the given string view, where the two arguments are zero-based indices into the string * * @param s The string to be sliced * @param start The zero-based index of the new string start * @param end The zero-based index of the first character to exclude from the new string * * @note Unlike `substr`, the second argument is required, and must specify the index at which the * string will end, rather than the length of the string. */ static inline mstr_view mstr_slice(const mstr_view s, const mlib_upsized_integer start_, const mlib_upsized_integer end_) { const size_t start_pos = _mstr_adjust_index(s, start_, false); const size_t end_pos = _mstr_adjust_index(s, end_, true); mlib_check(end_pos >= start_pos, because, "Slice positions must end after the start position"); const size_t sz = (size_t)(end_pos - start_pos); return mstr_substr(s, start_pos, sz); } #define mstr_slice(S, StartPos, EndPos) \ mstr_slice(mstr_view_from(S), mlib_upsize_integer((StartPos)), mlib_upsize_integer((EndPos))) /** * @brief Find the first occurrence of `needle` within `hay`, returning the zero-based index * if found, and `SIZE_MAX` if it is not found. * * @param hay The string which is being scanned * @param needle The substring that we are searching to find * @param pos The start position of the search (optional, default zero) * @param len The number of characters to search in `hay` (optional, default SIZE_MAX) * @return size_t If found, the zero-based index of the first occurrence within * the string. If not found, returns `SIZE_MAX`. * * The `len` is clamped to the available string length. * * Callable as: * * - `mstr_find(hay, needle)` * - `mstr_find(hay, needle, pos)` * - `mstr_find(hay, needle, pos, len)` */ static inline size_t mstr_find(mstr_view hay, mstr_view const needle, mlib_upsized_integer const pos_, size_t const len) { const size_t pos = _mstr_adjust_index(hay, pos_, false); // Trim the hay according to our search window: hay = mstr_substr(hay, pos, len); // Larger needle can never exist within the smaller string: if (hay.len < needle.len) { return SIZE_MAX; } // Set the index at which we can stop searching early. This will never // overflow, because we guard against hay.len > needle.len size_t stop_idx = hay.len - needle.len; // Use "<=", because we do want to include the final search position for (size_t offset = 0; offset <= stop_idx; ++offset) { if (memcmp(hay.data + offset, needle.data, needle.len) == 0) { // Return the found position. Adjust by the start pos since we may // have trimmed the search window return offset + pos; } } // Nothing was found. Return SIZE_MAX to indicate the not-found return SIZE_MAX; } #define mstr_find(...) MLIB_ARGC_PICK(_mstr_find, __VA_ARGS__) #define _mstr_find_argc_2(Hay, Needle) _mstr_find_argc_3(Hay, Needle, 0) #define _mstr_find_argc_3(Hay, Needle, Start) _mstr_find_argc_4(Hay, Needle, Start, SIZE_MAX) #define _mstr_find_argc_4(Hay, Needle, Start, Stop) \ mstr_find(mstr_view_from(Hay), mstr_view_from(Needle), mlib_upsize_integer(Start), Stop) /** * @brief Find the zero-based index of the first `char` in `hay` that also occurs in `needles` * * This is different from `find()` because it considers each char in `needles` as an individual * one-character string to be search for in `hay`. * * @param hay The string to be searched * @param needles A string containing a set of characters which are searched for in `hay` * @param pos The index at which to begin searching (optional, default is zero) * @param len The number of characters in `hay` to consider before stopping (optional, default is SIZE_MAX) * @return size_t If a needle is found, returns the zero-based index of that first needle. * Otherwise, returns SIZE_MAX. * * Callable as: * * - `mstr_find_first_of(hay, needles)` * - `mstr_find_first_of(hay, needles, pos)` * - `mstr_find_first_of(hay, needles, pos, len)` */ static inline size_t mstr_find_first_of(mstr_view hay, mstr_view const needles, mlib_upsized_integer const pos_, size_t const len) { const size_t pos = _mstr_adjust_index(hay, pos_, false); // Trim to fit the search window hay = mstr_substr(hay, pos, len); // We search by incrementing an index mlib_foreach_urange (idx, hay.len) { // Grab a substring of the single char at the current search index mstr_view one = mstr_substr(hay, idx, 1); // Test if the single char occurs anywhere in the needle set if (mstr_find(needles, one) != SIZE_MAX) { // We found the first index in `hay` where one of the needles occurs. Adjust // by `pos` since we may have trimmed return idx + pos; } } return SIZE_MAX; } #define mstr_find_first_of(...) MLIB_ARGC_PICK(_mstr_find_first_of, __VA_ARGS__) #define _mstr_find_first_of_argc_2(Hay, Needle) _mstr_find_first_of_argc_3(Hay, Needle, 0) #define _mstr_find_first_of_argc_3(Hay, Needle, Pos) _mstr_find_first_of_argc_4(Hay, Needle, Pos, SIZE_MAX) #define _mstr_find_first_of_argc_4(Hay, Needle, Pos, Len) mstr_find_first_of(Hay, Needle, mlib_upsize_integer(Pos), Len) /** * @brief Test whether the given codepoint is a Basic Latin whitespace character * * This function does not depend on the locale and has no undefined behavior, unlike functions * * @param c The codepoint to be tested */ static inline bool mlib_is_latin_whitespace(int32_t c) { switch (c) { case 0x09: // horizontal tab case 0x0a: // line feed case 0x0d: // carriage return case 0x20: // space return true; default: return false; } } /** * @brief Trim leading latin (ASCII) whitespace from the given string * * @param s The string to be inspected * @return mstr_view A substring view of `s` that excludes any leading whitespace */ static inline mstr_view mstr_trim_left(mstr_view s) { // Testing arbitrary code units for whitespace is safe as only 1-byte-encoded // codepoints can land within the Basic Latin range: while (s.len && mlib_is_latin_whitespace(mstr_at(s, 0))) { s = mstr_substr(s, 1); } return s; } #define mstr_trim_left(S) (mstr_trim_left)(mstr_view_from(S)) /** * @brief Trim trailing latin (ASCII) whitespace from the given string * * @param s The string to be insepcted * @return mstr_view A substring view of `s` that excludes any trailing whitespace. */ static inline mstr_view mstr_trim_right(mstr_view s) { while (s.len && mlib_is_latin_whitespace(mstr_at(s, -1))) { s = mstr_slice(s, 0, -1); } return s; } #define mstr_trim_right(S) (mstr_trim_right)(mstr_view_from(S)) /** * @brief Trim leading and trailing latin (ASCII) whitespace from the string * * @param s The string to be inspected * @return mstr_view A substring of `s` that excludes leading and trailing whitespace. */ static inline mstr_view mstr_trim(mstr_view s) { s = mstr_trim_left(s); s = mstr_trim_right(s); return s; } #define mstr_trim(S) (mstr_trim)(mstr_view_from(S)) /** * @brief Split a single string view into two strings at the given position * * @param s The string to be split * @param pos The position at which the prefix string is ended * @param drop [optional] The number of characters to drop between the prefix and suffix * @param prefix [out] Updated to point to the part of the string before the split * @param suffix [out] Updated to point to the part of the string after the split * * `pos` and `drop` are clamped to the size of the input string. * * Callable as: * * - `mstr_split_at(s, pos, prefix, suffix)` * - `mstr_split_at(s, pos, drop, prefix, suffix)` * * If either `prefix` or `suffix` is a null pointer, then they will be ignored */ static inline void mstr_split_at(mstr_view s, mlib_upsized_integer pos_, size_t drop, mstr_view *prefix, mstr_view *suffix) { const size_t pos = _mstr_adjust_index(s, pos_, true /* clamp to the string size */); // Save the prefix string if (prefix) { *prefix = mstr_substr(s, 0, pos); } // Save the suffix string if (suffix) { // The number of characters that remain after the prefix is removed const size_t remain = s.len - pos; // Clamp the number of chars to drop to not overrun the input string if (remain < drop) { drop = remain; } // The start position of the new string const size_t next_start = pos + drop; *suffix = mstr_substr(s, next_start, SIZE_MAX); } } #define mstr_split_at(...) MLIB_ARGC_PICK(_mstr_split_at, __VA_ARGS__) #define _mstr_split_at_argc_4(Str, Pos, Prefix, Suffix) _mstr_split_at_argc_5(Str, Pos, 0, Prefix, Suffix) #define _mstr_split_at_argc_5(Str, Pos, Drop, Prefix, Suffix) \ mstr_split_at(mstr_view_from(Str), mlib_upsize_integer(Pos), Drop, Prefix, Suffix) /** * @brief Split a string in two around the first occurrence of some infix string. * * @param s The string to be split in twain * @param infix The infix string to be searched for * @param prefix The part of the string that precedes the infix (nullable) * @param suffix The part of the string that follows the infix (nullable) * @return true If the infix was found * @return false Otherwise * * @note If `infix` does not occur in `s`, then `*prefix` will be set equal to `s`, * and `*suffix` will be made an empty string, as if the infix occurred at the end * of the string. */ static inline bool mstr_split_around(mstr_view s, mstr_view infix, mstr_view *prefix, mstr_view *suffix) { // Find the position of the infix. If it is not found, returns SIZE_MAX const size_t pos = mstr_find(s, infix); // Split at the infix, dropping as many characters as are in the infix. If // the `pos` is SIZE_MAX, then this call will clamp to the end of the string. mstr_split_at(s, pos, infix.len, prefix, suffix); // Return `true` if we found the infix, indicated by a not-SIZE_MAX `pos` return pos != SIZE_MAX; } #define mstr_split_around(Str, Infix, PrefixPtr, SuffixPtr) \ mstr_split_around(mstr_view_from((Str)), mstr_view_from((Infix)), (PrefixPtr), (SuffixPtr)) /** * @brief Test whether the given string starts with the given prefix * * @param str The string to be tested * @param prefix The prefix to be searched for * @return true if-and-only-if `str` starts with `prefix` * @return false Otherwise */ static inline bool mstr_starts_with(mstr_view str, mstr_view prefix) { // Trim to match the length of the prefix we want str = mstr_substr(str, 0, prefix.len); // Check if the trimmed string is the same as the prefix return mstr_cmp(str, ==, prefix); } #define mstr_starts_with(Str, Prefix) mstr_starts_with(mstr_view_from(Str), mstr_view_from(Prefix)) /** * @brief Test whether a substring occurs at any point within the given string * * @param str The string to be inspected * @param needle The substring to be searched for * @return true If-and-only-if `str` contains `needle` at any position * @return false Otherise */ static inline bool mstr_contains(mstr_view str, mstr_view needle) { return mstr_find(str, needle) != SIZE_MAX; } #define mstr_contains(Str, Needle) mstr_contains(mstr_view_from(Str), mstr_view_from(Needle)) /** * @brief Test whether a given string contains any of the characters in some other string * * @param str The string to be inspected * @param needle A string to be treated as a set of one-byte characters to search for * @return true If-and-only-if `str` contains `needle` at any position * @return false Otherise * * @note This function does not currently support multi-byte codepoints */ static inline bool mstr_contains_any_of(mstr_view str, mstr_view needle) { return mstr_find_first_of(str, needle) != SIZE_MAX; } #define mstr_contains_any_of(Str, Needle) mstr_contains_any_of(mstr_view_from(Str), mstr_view_from(Needle)) /** * @brief A simple mutable string type, with a guaranteed null terminator. * * This type is a trivially relocatable aggregate type that contains a pointer `data` * and a size `len`. If not null, the pointer `data` points to an array of mutable * `char` of length `len + 1`, where the character at `data[len]` is always zero, * and must not be modified. * * @note The string MAY contain nul (zero-value) characters, so using them with * C string APIs could truncate unexpectedly. * @note The string itself may be "null" if the `data` member of the string is * a null pointer. A zero-initialized `mstr` is null. The null string is distinct * from the empty string, which has a non-null `.data` that points to an empty * C string. */ typedef struct mstr { /** * @brief Pointer to the first char in the string, or NULL if * the string is null. * * The pointed-to character array has a length of `len + 1`, where * the character at `data[len]` is always null. * * @warning Attempting to overwrite the null character at `data[len]` * will result in undefined behavior! * * @note An empty string is not equivalent to a null string! An empty string * will still point to an array of length 1, where the only char is the null * terminator. */ char *data; /** * @brief The number of characters in the array pointed-to by `data` * that precede the null terminator. */ size_t len; } mstr; /** * @brief Resize an existing or null `mstr`, without initializing any of the * added content other than the null terminator. This operation is potentially * UNSAFE, because it gives uninitialized memory to the caller. * * @param str Pointer to a valid `mstr`, or a null `mstr`. * @param new_len The new length of the string. * @return true If the operation succeeds * @return false Otherwise * * If `str` is a null string, this function will initialize a new `mstr` object * on-the-fly. * * If the operation increases the length of the string (or initializes a new string), * then the new `char` in `str.data[str.len : new_len] will contain uninitialized * values. The char at `str.data[new_len]` WILL be set to zero, to ensure there * is a null terminator. The caller should always initialize the new string * content to ensure that the string has a specified value. */ static inline bool mstr_resize_for_overwrite(mstr *const str, const size_t new_len) { // We need to allocate one additional char to hold the null terminator size_t alloc_size = new_len; if (mlib_unlikely(mlib_add(&alloc_size, 1) || alloc_size > PTRDIFF_MAX)) { // Allocation size is too large return false; } // Try to (re)allocate the region char *data = (char *)realloc(str->data, alloc_size); if (!data) { // Failed to (re)allocate return false; } // Note: We do not initialize any of the data in the newly allocated region. // We only set the null terminator. It is up to the caller to do the rest of // the init. data[new_len] = '\0'; // Update the final object str->data = data; str->len = new_len; // Success return true; } /** * @brief Given an existing `mstr`, resize it to hold `new_len` chars * * @param str Pointer to a string object to update, or a null `mstr` * @param new_len The new length of the string, not including the implicit null terminator * @return true If the operation succeeds * @return false Otherwise * * @note If the operation fails, then `*str` is not modified. */ static inline bool mstr_resize(mstr *str, size_t new_len) { const size_t old_len = str->len; if (!mstr_resize_for_overwrite(str, new_len)) { // Failed to allocate new storage for the string return false; } // Check how many chars we added/removed const ptrdiff_t len_diff = mlib_assert_sub(ptrdiff_t, new_len, str->len); if (len_diff > 0) { // We added new chars. Zero-init all the new chars memset(str->data + old_len, 0, (size_t)len_diff); } // Success return true; } /** * @brief Create a new `mstr` of the given length * * @param new_len The length of the new string, in characters, not including the null terminator * @return mstr A new string. The string's `data` member is NULL in case of failure * * The character array allocated for the string will always be `new_len + 1` `char` in length, * where the char at the index `new_len` is a null terminator. This means that a string of * length zero will allocate a single character to store the null terminator. * * All characters in the new string are initialize to zero. If you want uninitialized * string content, use `mstr_resize_for_overwrite`. */ static inline mstr mstr_new(size_t new_len) { mstr ret = {NULL, 0}; // We can rely on `resize` to handle the null state properly. mstr_resize(&ret, new_len); return ret; } /** * @brief Free the resources associated with an mstr object. * * @param s Pointer to an `mstr` object. If pointer or the pointed-to-object is null, * this function is a no-op. * * After this call, the pointed-to `s` will be a null `mstr` */ static inline void mstr_destroy(mstr *s) { if (s) { free(s->data); s->len = 0; s->data = NULL; } } /** * @brief Obtain a null mstr string object. * * @return mstr A null string, with a null data pointer and zero size */ static inline mstr mstr_null(void) { return mlib_init(mstr){0}; } /** * @internal * @brief Test whether the given string-view is a view within the given owning string */ static inline bool _mstr_overlaps(mstr const *str, mstr_view sv) { // Note: Pointer-comparison between objects is unspecified, but is guaranteed // to returns `true` if there is overlap. We're okay with false-positive overlaps. // Additionally, POSIX and Win32 both offer stronger guarantees about pointer // comparison, which we can rely on here. return str->data // && str->data <= sv.data // && sv.data <= str->data + str->len; } /** * @brief Replace the content of the given string, attempting to reuse the buffer * * @param inout Pointer to a valid or null `mstr` to be replaced * @param s The new string contents * @return true If the operation succeeded * @return false Otherwise * * If the operation fails, `*inout` is not modified */ static inline bool mstr_assign(mstr *inout, mstr_view s) { // Check for self-assignment if (_mstr_overlaps(inout, s)) { // We are overwriting a string with a (sub)string of its own content. // Move the substring to the front of the string (may be a no-op if `s` // points to the beginning of the string) memmove(inout->data, s.data, s.len); // Resize to truncate. This will always shrink the string, because a valid // string-view into `inout` cannot be longer than `inout` itself. Thus, it // also cannot fail. mstr_resize_for_overwrite(inout, s.len); return true; } if (!mstr_resize_for_overwrite(inout, s.len)) { return false; } memcpy(inout->data, s.data, s.len); return true; } #define mstr_assign(InOut, S) mstr_assign((InOut), mstr_view_from((S))) /** * @brief Create a mutable copy of the given string. * * @param sv The string to be copied * @return mstr A new valid string, or a null string in case of allocation failure. */ static inline mstr mstr_copy(mstr_view sv) { mstr ret = {NULL, 0}; mstr_assign(&ret, sv); return ret; } #define mstr_copy(S) mstr_copy(mstr_view_from((S))) #define mstr_copy_cstring(S) mstr_copy(mstr_cstring((S))) /** * @brief Concatenate two strings into a new mutable string * * @param a The left-hand string to be concatenated * @param b The right-hand string to be concatenated * @return mstr A new valid string composed by concatenating `a` with `b`, or * a null string in case of allocation failure. */ static inline mstr mstr_concat(mstr_view a, mstr_view b) { mstr ret = {NULL, 0}; size_t cat_len = 0; if (mlib_unlikely(mlib_add(&cat_len, a.len, b.len))) { // Size would overflow. No go. return ret; } // Prepare the new string if (!mstr_resize_for_overwrite(&ret, cat_len)) { // Failed to allocate. The ret string is still null, and we can just return it return ret; } // Copy in the characters from `a` char *out = ret.data; memcpy(out, a.data, a.len); // Copy in the characters from `b` out += a.len; memcpy(out, b.data, b.len); // Success return ret; } #define mstr_concat(A, B) mstr_concat(mstr_view_from((A)), mstr_view_from((B))) /** * @brief Delete and/or insert characters into a string * * @param str The string object to be updated * @param splice_pos The position at which to do the splice * @param n_delete The number of characters to delete at `splice_pos` * @param insert A string to be inserted at `split_pos` after chars are deleted * @return true If the operation succeeds * @return false Otherwise * * If `n_delete` is zero, then no characters are deleted. If `insert` is empty * or null, then no characters are inserted. */ static inline bool mstr_splice(mstr *str, size_t splice_pos, size_t n_delete, mstr_view insert) { // Guard against self-insertion: if (insert.data && _mstr_overlaps(str, insert)) { // The insertion string exists within the current string. We cannot modify it in-place. // Duplicate the insertion string to remain pristine while we splice: mstr insert_dup = mstr_copy(insert); if (!insert_dup.data) { // Failed to dup the insert string. Failure to splice return false; } // Do the splice, now using the copy of the insertion string const bool ok = mstr_splice(str, splice_pos, n_delete, mstr_view_from(insert_dup)); // We're done with the dup mstr_destroy(&insert_dup); // Return the sub-result return ok; } mlib_check(splice_pos <= str->len); // How many chars is it possible to delete from `splice_pos`? size_t n_chars_avail_to_delete = str->len - splice_pos; // Clamp to the number of chars available for deletion: if (n_delete > n_chars_avail_to_delete) { n_delete = n_chars_avail_to_delete; } // Compute the new string length size_t new_len = str->len; // This should never fail, because we should never try to delete more chars than we have mlib_check(!mlib_sub(&new_len, n_delete)); // Check if appending would make too big of a string if (mlib_unlikely(mlib_add(&new_len, insert.len))) { // New string will be too long return false; } char *mut = str->data; // We either resize first or resize last, depending on where we are shifting chars if (new_len > str->len) { // Do the resize first if (!mstr_resize_for_overwrite(str, new_len)) { // Failed to allocate return false; } mut = str->data; } // Move to the splice position mut += splice_pos; // Shift the existing string parts around for the deletion operation const size_t tail_len = n_chars_avail_to_delete - n_delete; // Adjust to the begining of the string part that we want to keep char *copy_from = mut + n_delete; char *copy_to = mut + insert.len; memmove(copy_to, copy_from, tail_len); if (new_len < str->len) { // We didn't resize first, so resize now. We are shrinking the string, so this // will never fail, and does not create any uninitialized memory: mlib_check(mstr_resize_for_overwrite(str, new_len)); mut = str->data + splice_pos; } // Insert the new data if the insertion string is non-null if (insert.data) { memcpy(mut, insert.data, insert.len); } return true; } /** * @brief Append a string to the end of some other string. * * @param str The string to be modified * @param suffix The suffix string to be appended onto `*str` * @return true If the operation was successful * @return false Otherwise * * If case of failure, `*str` is not modified. */ static inline bool mstr_append(mstr *str, mstr_view suffix) { return mstr_splice(str, str->len, 0, suffix); } #define mstr_append(Into, Suffix) mstr_append((Into), mstr_view_from((Suffix))) /** * @brief Append a single character to the given string object * * @param str The string object to be updated * @param c The single character that will be inserted at the end * @return true If the operation succeeded * @return false Otherwise * * In case of failure, the string is not modified. */ static inline bool mstr_append_char(mstr *str, char c) { mstr_view one = mstr_view_data(&c, 1); return mstr_append(str, one); } /** * @brief Replace every occurrence of `needle` in `str` with `sub` * * @param str The string object to be updated * @param needle The non-empty needle string to be searched for.s * @param sub The string to be inserted in place of each `needle` * @return true If the operation succeeds * @return false Otherwise * * @note If the `needle` string is empty, then the substitution string will * be inserted around and between every byte in the string: * * replace("foo", "", "|") -> "|f|o|o|" * * @note The operation is guaranteed to never fail if the `sub` string is not * longer than the `needle` string AND the needle and sub strings do not overlap * * @note If the operation fails, the content of `str` is an unspecified but valid * string. */ static inline bool mstr_replace(mstr *str, mstr_view needle, mstr_view sub) { bool okay = true; // We may dup the needle/sub if they overlap the output string mstr needle_dup = mstr_null(); mstr sub_dup = mstr_null(); // Check if the needle is a substring of the target: if (_mstr_overlaps(str, needle)) { // Copy the needle string needle_dup = mstr_copy(needle); // Detect allocation failure: okay = !!needle_dup.data; // Update the needle to point to the duplicate: needle = mstr_view_from(needle_dup); } // Do the same with the sub string: if (okay && _mstr_overlaps(str, sub)) { sub_dup = mstr_copy(sub); okay = !!needle_dup.data; sub = mstr_view_from(sub_dup); } // Scan forward, starting from the first position: size_t off = 0; while (okay && off <= str->len) { // Find the next occurrence, starting from the scan offset off = mstr_find(*str, needle, off); if (off == SIZE_MAX) { // No more occurrences. break; } // Replace the needle string with the new value if (!mstr_splice(str, off, needle.len, sub)) { okay = false; } // Advance over the length of the replacement string, so we don't try to // infinitely replace content if the replacement itself contains the needle // string if (mlib_unlikely(mlib_add(&off, sub.len))) { // Integer overflow while advancing the offset. No good. okay = false; } // Note: To support empty needles, advance one more space to avoid infinite // repititions in-place. // TODO: To do this "properly", this should instead advance over a full UTF-8-encoded // codepoint. For now, just do a single byte. if (!needle.len && mlib_unlikely(mlib_add(&off, 1))) { // Advancing the extra distance failed okay = false; } } // Destroy the needle/sub strings, which we may have duplicated if they overlapped // the target. If not, then these are a no-op. mstr_destroy(&needle_dup); mstr_destroy(&sub_dup); return okay; } /** * @brief Like `mstr_sprintf`, but accepts a `va_list` directly. */ mlib_printf_attribute(1, 0) static inline mstr mstr_vsprintf(const char *format, va_list args) { size_t format_strlen = strlen(format); size_t sz = format_strlen; if (mlib_unlikely(mlib_mul(&sz, 2))) { // Overflow on multiply. Oof sz = format_strlen; } mstr ret = mstr_null(); while (1) { // Resize to make room for the formatted text if (!mstr_resize(&ret, sz)) { // Allocation failure break; } // Calc the size with the null terminator size_t len_with_null = ret.len; if (mlib_unlikely(mlib_add(&len_with_null, 1))) { // Unlikely: Overflow break; } // Do the formatting va_list dup_args; va_copy(dup_args, args); int n_chars = vsnprintf(ret.data, len_with_null, format, dup_args); va_end(dup_args); // On error, returns a negative value if (n_chars < 0) { break; } if ((size_t)n_chars <= ret.len) { // Success. Truncate to the number of chars actually written: mstr_resize(&ret, (size_t)n_chars); // Return the successfully formatted string: return ret; } // Need more room. Resize and try again: sz = (size_t)n_chars; continue; } // Only reached if the operation failed mstr_destroy(&ret); return ret; } /** * @brief Format a string according to `printf` rules * * @param f The format string to be used. * @param ... The formatting arguments to interpolate into the string * @return mstr A new mstr upon success, or a null mstr upon failure. */ mlib_printf_attribute(1, 2) static inline mstr mstr_sprintf(const char *f, ...) { va_list args; va_start(args, f); mstr ret = mstr_vsprintf(f, args); va_end(args); return ret; } /** * @brief Like `mstr_sprintf_append`, but accepts the va_list directly. */ mlib_printf_attribute(2, 0) static inline bool mstr_vsprintf_append(mstr *string, const char *format, va_list args) { mlib_check(string != NULL, because, "Output string parameter is required"); mstr suffix = mstr_vsprintf(format, args); bool ok = mstr_append(string, suffix); mstr_destroy(&suffix); return ok; } /** * @brief Append content to a string using `printf()` style formatting. * * @param string Pointer to a valid or null string object which will be modified * @param format A printf-style format string to append onto `string` * @param ... The interpolation arguments for `format` * * @retval true If-and-only-if the string is successfully modified * @retval false If there was an error during formatting. The content of `string` * is unspecified. * * This function maintains the existing content of `string` and only inserts * additional characters at the end of the string. */ mlib_printf_attribute(2, 3) static inline bool mstr_sprintf_append(mstr *string, const char *format, ...) { va_list args; va_start(args, format); const bool okay = mstr_vsprintf_append(string, format, args); va_end(args); return okay; } #endif // MLIB_STR_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/str_vec.h000066400000000000000000000020221511661753600217620ustar00rootroot00000000000000/** * @file str_vec.h * @brief This file defines mstr_vec, a common "array of strings" type * @date 2025-09-30 * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_STR_VEC_H_INCLUDED #define MLIB_STR_VEC_H_INCLUDED #include #include #define T mstr #define VecDestroyElement(Ptr) (mstr_destroy(Ptr)) #define VecCopyElement(Dst, Src) (*Dst = mstr_copy(*Src), Dst->data != NULL) #include #endif // MLIB_STR_VEC_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/test.h000066400000000000000000000331641511661753600213070ustar00rootroot00000000000000/** * @file mlib/test.h * @brief Testing utilities * @date 2025-01-30 * * @copyright Copyright (c) 2025 * * 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. */ #pragma once #include #include #include #include #include #include #include /** * @brief Place this macro at the head of a (compound) statement to assert that * executing that statement aborts the program with SIGABRT. * * Internally, this will fork the calling process and wait for the child process * to terminate. It asserts that the child exits abnormally with SIGABRT. This * test assertion is a no-op on Win32, since it does not have a suitable `fork` * API. * * Beware that the child process runs in a forked environment, so it is not * safe to use any non-fork-safe functionality, and any modifications to program * state will not be visible in the parent. Behavior of attempting to escape the * statement (goto/return) is undefined. * * If the child process does not abort, it will call `_Exit(71)` to indicate * to the parent that it did not terminate (the number 71 is chosen arbitrarily) * * If the token `debug` is passed as a macro argument, then the forking behavior * is suppressed, allowing for easier debugging of the statement. */ #define mlib_assert_aborts(...) MLIB_PASTE_3(_mlibAssertAbortsStmt, _, __VA_ARGS__)() #ifndef _WIN32 #include #include #define _mlibAssertAbortsStmt_() \ for (int once = 1, other_pid = fork(); once; once = 0) \ for (; once; once = 0) \ if (other_pid != 0) { \ /* We are the parent */ \ int wstatus; \ waitpid(other_pid, &wstatus, 0); \ if (WIFEXITED(wstatus)) { \ /* Normal exit! */ \ _mlib_stmt_did_not_abort(__FILE__, MLIB_FUNC, __LINE__, WEXITSTATUS(wstatus)); \ } else if (WIFSIGNALED(wstatus)) { \ /* Signalled */ \ if (WTERMSIG(wstatus) != SIGABRT) { \ fprintf(stderr, \ "%s:%d: [%s]: Child process did not exit with SIGABRT! (Exited %d)\n", \ __FILE__, \ __LINE__, \ MLIB_FUNC, \ WTERMSIG(wstatus)); \ fflush(stderr); \ abort(); \ } \ } \ } else /* We are the child */ \ if ((fclose(stderr), 1)) \ for (;; _Exit(71)) \ for (;; _Exit(71)) /* Double loop to prevent the block from `break`ing out */ #else #define _mlibAssertAbortsStmt_() \ if (1) { \ } else #endif // Called when an assert-aborts statement does not terminate static inline void _mlib_stmt_did_not_abort(const char *file, const char *func, int line, int rc) { /* Normal exit! */ if (rc == 71) { fprintf(stderr, "%s:%d: [%s]: Test case did not abort. The statement completed normally.\n", file, line, func); } else { fprintf(stderr, "%s:%d: [%s]: Test case did not abort (Exited %d)\n", file, line, func, rc); } fflush(stderr); abort(); } #define _mlibAssertAbortsStmt_debug() \ for (;; _mlib_stmt_did_not_abort(__FILE__, MLIB_FUNC, __LINE__, -1)) \ for (;; _mlib_stmt_did_not_abort(__FILE__, MLIB_FUNC, __LINE__, -1)) /** * @brief Aggregate type that holds information about a source location */ typedef struct mlib_source_location { const char *file; int lineno; const char *func; } mlib_source_location; /** * @brief Expands to an `mlib_source_location` for the location in which the macro is expanded */ #define mlib_this_source_location() (mlib_init(mlib_source_location){(__FILE__), (__LINE__), (MLIB_FUNC)}) // ↑ The paren wrapping is required on VS2017 to prevent it from deleting the preceding comma (?!) /** * @brief Evaluate a check, aborting with a diagnostic if that check fails * * Can be called with one argument to test a single boolean condition, or three * arguments for more useful diagnostics with an infix operator. */ #define mlib_check(...) MLIB_ARGC_PICK(_mlib_check, #__VA_ARGS__, __VA_ARGS__) // One arg: #define _mlib_check_argc_2(ArgString, Condition) \ _mlibCheckConditionSimple(Condition, ArgString, NULL, mlib_this_source_location()) // Three args: #define _mlib_check_argc_4(ArgString, A, Operator, B) \ MLIB_NOTHING(#A, #B) MLIB_PASTE(_mlibCheckCondition_, Operator)(A, B, NULL) // Five args: #define _mlib_check_argc_6(ArgString, A, Operator, B, Infix, Reason) \ MLIB_NOTHING(#A, #B) MLIB_PASTE(_mlib_check_with_suffix_, Infix)(A, Operator, B, Reason) #define _mlib_check_with_suffix_because(A, Operator, B, Reason) \ MLIB_NOTHING(#A, #B) MLIB_PASTE(_mlibCheckCondition_, Operator)(A, B, Reason) // String-compare: #define _mlibCheckCondition_str_eq(A, B, Reason) _mlibCheckStrEq(A, B, #A, #B, Reason, mlib_this_source_location()) // Pointer-compare: #define _mlibCheckCondition_ptr_eq(A, B, Reason) _mlibCheckPtrEq(A, B, #A, #B, Reason, mlib_this_source_location()) // Integer-equal: #define _mlibCheckCondition_eq(A, B, Reason) \ _mlibCheckIntCmp(mlib_equal, \ true, \ "==", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) // Integer not-equal: #define _mlibCheckCondition_neq(A, B, Reason) \ _mlibCheckIntCmp(mlib_equal, \ false, \ "!=", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) // Integer comparisons: #define _mlibCheckCondition_lt(A, B, Reason) \ _mlibCheckIntCmp(mlib_less, \ true, \ "<", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) #define _mlibCheckCondition_lte(A, B, Reason) \ _mlibCheckIntCmp(mlib_greater, \ false, \ "≤", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) #define _mlibCheckCondition_gt(A, B, Reason) \ _mlibCheckIntCmp(mlib_greater, \ true, \ ">", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) #define _mlibCheckCondition_gte(A, B, Reason) \ _mlibCheckIntCmp(mlib_less, \ false, \ "≥", \ mlib_upsize_integer(A), \ mlib_upsize_integer(B), \ #A, \ #B, \ Reason, \ mlib_this_source_location()) // Simple assertion with an explanatory string #define _mlibCheckCondition_because(Cond, Reason, _null) \ _mlibCheckConditionSimple(Cond, #Cond, Reason, mlib_this_source_location()) /// Check evaluator when given a single boolean static inline void _mlibCheckConditionSimple(bool c, const char *expr, const char *reason, struct mlib_source_location here) { if (!c) { fprintf(stderr, "%s:%d: in [%s]: Check condition ⟨%s⟩ failed", here.file, here.lineno, here.func, expr); if (reason) { fprintf(stderr, " (%s)", reason); } fprintf(stderr, "\n"); fflush(stderr); abort(); } } // Implement integer comparison checks static inline void _mlibCheckIntCmp(enum mlib_cmp_result cres, // The cmp result to check bool cond, // Whether we expect the cmp result to match `cres` const char *operator_str, struct mlib_upsized_integer left, struct mlib_upsized_integer right, const char *left_expr, const char *right_expr, const char *reason, struct mlib_source_location here) { if (((mlib_cmp)(left, right, 0) == cres) != cond) { fprintf(stderr, "%s:%d: in [%s]: Check [⟨%s⟩ %s ⟨%s⟩] failed:\n", here.file, here.lineno, here.func, left_expr, operator_str, right_expr); fprintf(stderr, " "); if (left.is_signed) { fprintf(stderr, "%lld", (long long)left.bits.as_signed); } else { fprintf(stderr, "%llu", (unsigned long long)left.bits.as_unsigned); } fprintf(stderr, " ⟨%s⟩\n", left_expr); fprintf(stderr, " "); if (right.is_signed) { fprintf(stderr, "%lld", (long long)right.bits.as_signed); } else { fprintf(stderr, "%llu", (unsigned long long)right.bits.as_unsigned); } fprintf(stderr, " ⟨%s⟩\n", right_expr); if (reason) { fprintf(stderr, "Because: %s\n", reason); } fflush(stderr); abort(); } } // Pointer-comparison static inline void _mlibCheckPtrEq(const void *left, const void *right, const char *left_expr, const char *right_expr, const char *reason, struct mlib_source_location here) { if (left != right) { fprintf(stderr, "%s:%d: in [%s]: Check [⟨%s⟩ pointer-equal ⟨%s⟩] failed:\n", here.file, here.lineno, here.func, left_expr, right_expr); fprintf(stderr, " %p ⟨%s⟩\n" " ≠ %p ⟨%s⟩\n", left, left_expr, right, right_expr); if (reason) { fprintf(stderr, "Because: %s\n", reason); } fflush(stderr); abort(); } } // String-comparison static inline void _mlibCheckStrEq(const char *left, const char *right, const char *left_expr, const char *right_expr, const char *reason, struct mlib_source_location here) { if (strcmp(left, right)) { fprintf(stderr, "%s:%d: in [%s]: Check [⟨%s⟩ str-equal ⟨%s⟩] failed:\n", here.file, here.lineno, here.func, left_expr, right_expr); fprintf(stderr, " “%s†⟨%s⟩\n" " ≠ “%s†⟨%s⟩\n", left, left_expr, right, right_expr); if (reason) { fprintf(stderr, "Because: %s\n", reason); } fflush(stderr); abort(); } } mongo-c-driver-2.2.1/src/common/src/mlib/time_point.h000066400000000000000000000302241511661753600224710ustar00rootroot00000000000000/** * @file mlib/time_point.h * @brief A point-in-time type * @date 2025-04-17 * * The `mlib_time_point` type represents a stable point-in-time. The time point * itself is relative to a monotonic clock for the program, so it should not be * transmitted or persisted outside of the execution of a program that uses it. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_TIME_POINT_H_INCLUDED #define MLIB_TIME_POINT_H_INCLUDED #include #include #include #include // Check for POSIX clock functions functions #undef mlib_have_posix_clocks #define mlib_have_posix_clocks() 0 #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || (defined(_DEFAULT_SOURCE) && !defined(_WIN32)) #include #undef mlib_have_posix_clocks #define mlib_have_posix_clocks() 1 #endif #include #include #include mlib_extern_c_begin(); /** * @brief An abstract point-in-time type * * The time point is encoded as a duration relative to some stable reference point * provided by the system. See the docs for the `time_since_monotonic_start` * member for more details. * * At time of writing, there is no easy way to convert this monotonic time point * into a human-readable wall time. Thus, the time-point itself is abstract. */ typedef struct mlib_time_point { /** * @brief The encoding of the time point as a duration relative to some * unspecified stable real point in time. * * It is important to understand the nature of the reference point: `mlib_now()` * uses the system's monotonic high-resolution clock, which has an unspecified * reference point in the past. That stable reference point may change between * program executions, so it is not safe to store/transmit this value outside * of the current program execution. * * If you attempt to store a duration in this member that is with respect to * some other clock, then the resulting time point object will have an unspecified * relationship to other time points created with different clocks. For this reason, * this member should not be set to any absolute values, and should only be adjusted * relative to its current value. */ mlib_duration time_since_monotonic_start; } mlib_time_point; /** * @brief Given two time points, selects the time point that occurs earliest */ static inline mlib_time_point mlib_earliest(mlib_time_point l, mlib_time_point r) { l.time_since_monotonic_start = mlib_duration(l.time_since_monotonic_start, min, r.time_since_monotonic_start); return l; } /** * @brief Given two time points, selects the time point that occurs later */ static inline mlib_time_point mlib_latest(mlib_time_point l, mlib_time_point r) { l.time_since_monotonic_start = mlib_duration(l.time_since_monotonic_start, max, r.time_since_monotonic_start); return l; } /** * @brief Obtain the integer clock ID that is used by `mlib_now()` to obtain * the time. This value only has meaning on POSIX systems. On Win32, returns * INT_MIN. * * @return int The integer clock ID, corresponding to the value of a `CLOCK_...` * object macro. */ static inline int mlib_now_clockid(void) mlib_noexcept { #ifdef CLOCK_MONOTONIC_RAW // Linux had a bad definition of CLOCK_MONOTONIC, which would jump based on NTP adjustments. // They replaced it with CLOCK_MONOTONIC_RAW, which is stable and cannot be adjusted. return CLOCK_MONOTONIC_RAW; #elif defined(CLOCK_MONOTONIC) return CLOCK_MONOTONIC; #else return INT_MIN; #endif } /** * @brief Obtain a point-in-time corresponding to the current time */ static inline mlib_time_point mlib_now(void) mlib_noexcept { #if mlib_have_posix_clocks() // Use POSIX clock_gettime struct timespec ts; int rc = clock_gettime(mlib_now_clockid(), &ts); // The above call must never fail: mlib_check(rc, eq, 0); // Encode the time point: mlib_time_point ret; ret.time_since_monotonic_start = mlib_duration_from_timespec(ts); return ret; #elif mlib_is_win32() // Win32 APIs for the high-performance monotonic counter. These APIs never fail after Windows XP LARGE_INTEGER freq; QueryPerformanceFrequency(&freq); LARGE_INTEGER lits; QueryPerformanceCounter(&lits); // Number of ticks of the perf counter const int64_t ticks = lits.QuadPart; // Number of ticks that the counter emits in one second const int64_t ticks_per_second = freq.QuadPart; // Do some math that avoids an integer overflow when converting to microseconds. // Just one million, used to convert time units to microseconds. const int64_t one_million = 1000000; // Number of whole seconds that have elapsed: const int64_t whole_seconds = ticks / ticks_per_second; // Number of microseconds beyond the last whole second: const int64_t subsecond_us = ((ticks % ticks_per_second) * one_million) / ticks_per_second; mlib_time_point ret; ret.time_since_monotonic_start = mlib_duration((whole_seconds, s), plus, (subsecond_us, us)); return ret; #else #error We do not know how to get the current time on this platform #endif } /** * @brief Obtain a point-in-time relative to a base time offset by the given * duration (which may be negative). * * @param from The basis of the time offset * @param delta The amount of time to shift the resulting time point * @return mlib_time_point If 'delta' is a positive duration, the result is a * point-in-time *after* 'from'. If 'delta' is a negative duration, the result * is a point-in-time *before* 'from'. */ static inline mlib_time_point mlib_time_add(mlib_time_point from, mlib_duration delta) mlib_noexcept { mlib_time_point ret; ret.time_since_monotonic_start = mlib_duration(from.time_since_monotonic_start, plus, delta); return ret; } #define mlib_time_add(From, Delta) mlib_time_add(From, mlib_duration_arg(Delta)) /** * @brief Obtain the duration between two points in time. * * @param stop The target time * @param start The base time * @return mlib_duration The amount of time you would need to wait starting * at 'start' for the time to become 'stop' (the result may be a negative * duration). * * Intuition: If "stop" is "in the future" relative to "start", you will * receive a positive duration, indicating an amount of time to wait * beginning at 'start' to reach 'stop'. If "stop" is actually *before* * "start", you will receive a paradoxical *negative* duration, indicating * the amount of time needed to time-travel backwards to reach "stop." */ static inline mlib_duration mlib_time_difference(mlib_time_point stop, mlib_time_point start) { return mlib_duration(stop.time_since_monotonic_start, minus, start.time_since_monotonic_start); } /** * @brief Obtain the amount of time that has elapsed since the time point `t`, * or a negative duration if the time is in the future. * * @param t The time point to be inspected * @return mlib_duration If `t` is in the past, returns the duration of time * that has elapsed since that point-in-time. If `t` is in the future, returns * a negative time representing the amount of time that be be waited until we * reach `t`. */ static inline mlib_duration mlib_elapsed_since(mlib_time_point t) { return mlib_time_difference(mlib_now(), t); } /** * @brief Compare two time points to create an ordering. * * A time point "in the past" is "less than" a time point "in the future". * * @retval <0 If 'a' is before 'b' * @retval >0 If 'b' is before 'a' * @retval 0 If 'a' and 'b' are equivalent * * @note This is a function-like macro that can be called with an infix operator * as the second argument to do natural time-point comparisons: * * ``` * mlib_time_cmp(a, <=, b) * ``` */ static inline enum mlib_cmp_result mlib_time_cmp(mlib_time_point a, mlib_time_point b) mlib_noexcept { return mlib_duration_cmp(a.time_since_monotonic_start, b.time_since_monotonic_start); } #define mlib_time_cmp(...) MLIB_ARGC_PICK(_mlib_time_cmp, __VA_ARGS__) #define _mlib_time_cmp_argc_2 mlib_time_cmp #define _mlib_time_cmp_argc_3(L, Op, R) (mlib_time_cmp((L), (R)) Op 0) /** * @brief Pause the calling thread until at least the specified duration has elapsed. * * @param d The duration of time to pause the thread. If this duration is zero * or negative, then this function returns immediately. * @return int An error code, if any occurred. Returns zero upon success, or * the system's error number value (`errno` on POSIX, `GetLastError()` on * Windows) */ static inline int mlib_sleep_for(const mlib_duration d) mlib_noexcept { mlib_duration_rep_t duration_usec = mlib_microseconds_count(d); if (duration_usec <= 0) { // Don't sleep any time return 0; } #if mlib_have_posix_clocks() // Convert the microseconds count to the value for the usleep function. We don't // know the precise integer type that `usleep` expects, so do a checked-narrow // to handle too-large values. useconds_t i = 0; if (mlib_narrow(&i, duration_usec)) { // Too many microseconds. Sleep for the max. This will only be reached // for positive durations because of the above check against `<= 0` i = mlib_maxof(useconds_t); } int rc = usleep(i); if (rc != 0) { return errno; } return 0; #elif defined(_WIN32) DWORD retc = 0; // Use WaitableTimer const HANDLE timer = CreateWaitableTimerW(/* no attributes */ NULL, /* Manual reset */ true, /* Unnamed */ NULL); // Check that we actually succeeded in creating a timer. if (!timer) { retc = GetLastError(); goto done; } // Convert the number of microseconds into a count of 100ns intervals. Use // a negative value to request a relative sleep time. LONGLONG negative_n_100ns_units = 0; if (mlib_mul(&negative_n_100ns_units, duration_usec, -10)) { // Too many units. Clamp to the max duration (negative for a relative // sleep): negative_n_100ns_units = mlib_minof(LONGLONG); } LARGE_INTEGER due_time; due_time.QuadPart = negative_n_100ns_units; BOOL okay = SetWaitableTimer(/* The timer to modify */ timer, /* The time after which it will fire */ &due_time, /* Interval period 0 = only fire once */ 0, /* No completion routine */ NULL, /* No arg for no completion routine */ NULL, /* Wake up the system if it goes to sleep */ true); if (!okay) { // Failed to set the timer. Hmm? retc = GetLastError(); goto done; } // Do the actual wait DWORD rc = WaitForSingleObject(timer, INFINITE); if (rc == WAIT_FAILED) { // Executing the wait operation failed. retc = GetLastError(); goto done; } // Check for success: mlib_check(rc, eq, WAIT_OBJECT_0); done: // Done with the timer. if (timer) { CloseHandle(timer); } return retc; #else #error "mlib_sleep_for" is not implemented on this platform. #endif } #define mlib_sleep_for(...) mlib_sleep_for(mlib_duration(__VA_ARGS__)) /** * @brief Pause the calling thread until the given time point has been reached * * @param when The time point at which to resume, at soonest * @return int A possible error code for the operation. Returns zero upon success. * * The `when` is the *soonest* successful wake time. The thread may wake at a later time. */ static inline int mlib_sleep_until(const mlib_time_point when) mlib_noexcept { const mlib_duration time_until = mlib_time_difference(when, mlib_now()); return mlib_sleep_for(time_until); } mlib_extern_c_end(); #endif // MLIB_TIME_POINT_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/timer.h000066400000000000000000000124601511661753600214440ustar00rootroot00000000000000/** * @file mlib/timer.h * @brief Timer types and functions * @date 2025-04-18 * * This file contains APIs for creating fixed-deadline timer objects that represent * stable expiration points. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MLIB_TIMER_H_INCLUDED #define MLIB_TIMER_H_INCLUDED #include #include #include mlib_extern_c_begin(); /** * @brief Represents an expiry timer. The timer stores some point-in-time * after which it is considered to have "expired." */ typedef struct mlib_timer { /** * @brief The point-in-time at which the timer will be considered expired. * * This field can be updated or modified to change the expiration time of * the timer. */ mlib_time_point expires_at; } mlib_timer; /** * @brief Create a deadline timer that expires at the given point-in-time * * @param t The point-in-time at which the returned timer should be expired * @return mlib_timer */ static inline mlib_timer mlib_expires_at(const mlib_time_point t) mlib_noexcept { mlib_timer ret; ret.expires_at = t; return ret; } /** * @brief Create a deadline timer that expires after the given duration has * elapsed from the point-in-time at which this function is called */ static inline mlib_timer mlib_expires_after(const mlib_duration dur) mlib_noexcept { const mlib_time_point later = mlib_time_add(mlib_now(), dur); return mlib_expires_at(later); } #define mlib_expires_after(...) mlib_expires_after(mlib_duration(__VA_ARGS__)) /** * @brief Obtain a timer that will "never" expire * * In actuality, the timer expires at a time so far in the future that no computer * program could ever hope to continue running to that point, and by the time * that point is reached it will be some other civilization's problem. */ static inline mlib_timer mlib_expires_never(void) mlib_noexcept { mlib_timer t; t.expires_at.time_since_monotonic_start = mlib_duration_max(); return t; } /** * @brief Between two timers, return the timer that will expire the soonest */ static inline mlib_timer mlib_soonest_timer(mlib_timer l, mlib_timer r) mlib_noexcept { l.expires_at = mlib_earliest(l.expires_at, r.expires_at); return l; } /** * @brief Obtain the duration of time that is remaining until the given timer * expires. If the timer has expired, the returned duration will be zero (never * negative) */ static inline mlib_duration mlib_timer_remaining(const mlib_timer timer) mlib_noexcept { // The duration until the expiry time of the timer const mlib_duration remain = mlib_time_difference(timer.expires_at, mlib_now()); if (mlib_duration_cmp(remain, <, mlib_duration())) { // No time remaining. Return a zero duration (not a negative duration) return mlib_duration(); } return remain; } /** * @brief Test for timer expiration * * @param timer The timer to be tested * @param once (Optional) A pointer to an optional once-flag that will be set * to `true` (see below) * * The function behaves as follows: * * - If `once` is a null pointer, then returns a boolean indicating whether the * timer has expired. * - Otherwise, if `*once` is `true`: * - If `timer` has expired, returns `true` * - Otherwise, `*once` is set to `true` and returns `false` * * The intent of the `once` flag is to support loops that check for expiry, * where at least one iteration of the loop *must* be attempted, even if the * timer has expired. For example: * * ``` * void do_thing() { * bool once = false; * while (!mlib_timer_is_expired(timer, &once)) { * try_thing(timer); * } * } * ``` * * In the above, `try_thing` will be called *at least once*, even if the timer * is already expired. */ static inline bool mlib_timer_is_expired(const mlib_timer timer, bool *once) mlib_noexcept { // Is the timer already expired? const bool no_time_remaining = mlib_time_cmp(timer.expires_at, <=, mlib_now()); if (!once) { // Just return `true` if there is zero time remaining return no_time_remaining; } else { // Tweak behavior based on the `*once` value if (!*once) { // This is the first time we have been called with the given once-flag *once = true; // Don't count an expiration, even if we have zero time left, because // the caller wants to try some operation at least once return false; } return no_time_remaining; } } mlib_extern_c_end(); #define mlib_timer_is_expired(...) MLIB_ARGC_PICK(_mlibTimerIsExpired, __VA_ARGS__) #define _mlibTimerIsExpired_argc_1(Timer) mlib_timer_is_expired((Timer), NULL) #define _mlibTimerIsExpired_argc_2(Timer, OncePtr) mlib_timer_is_expired((Timer), (OncePtr)) #endif // MLIB_TIMER_H_INCLUDED mongo-c-driver-2.2.1/src/common/src/mlib/vec.th000066400000000000000000000354211511661753600212670ustar00rootroot00000000000000/** * @file vec.th * @brief Declare a new vector container data type * @date 2024-10-02 * * To use this file: * * - #define a type `T` immediately before including this file. * - Optional: Define an identifier `VecName` to the name of the vector. If unset, declares `_vec` * - Optional: Define a `VecDestroyElement(Ptr)` macro to specify how the vector * should destroy the element at `*Ptr`. If unset, destroying is a no-op. * - Optional: Define `VecInitElement(Ptr, ...)` which initializes a new element. * The first macro argument is a pointer to the element and subsequent arguments * are unspecified and reserved for future use. Elements are zero-initialized * before being passed to this macro. * - Optional: Define `VecCopyElement(DstPtr, SrcPtr)` to copy data from `*SrcPtr` * to `*DstPtr`. The vector's copying function is only defined if this macro * is defined. This macro MUST evaluate to a boolean to indicate if the copy * operation succeeded. If a copy fails, then the partially copied elements * will be destroyed and the overall copy will fail. * * To add a trival copying function, define `VecCopyElement` to * `VecTrivialCopyElement`. * * - NOTE: All of the above macros will be automatically undef'd after this file * is included. * * Types stored in the vector must be trivially relocatable. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include // assert #include // bool #include // size_t #include // calloc, realloc, free #include // memcpy, memset // Check that the caller provided a `T` macro to be the element type #ifndef T #if defined(__clangd__) || defined(__INTELLISENSE__) #define T int // Define a type for IDE diagnostics #define VecCopyElement VecTrivialCopyElement // For IDE highlighting #else #error A type `T` should be defined before including this file #endif #endif #ifndef VecName #define VecName MLIB_PASTE(T, _vec) #endif #ifndef VecDestroyElement #define VecDestroyElement(Ptr) ((void)(Ptr)) #endif #ifndef VecInitElement #define VecInitElement(Ptr) ((void)(Ptr)) #endif #ifndef VecTrivialCopyElement #define VecTrivialCopyElement(DstPtr, SrcPtr) ((*(DstPtr) = *(SrcPtr)), true) #endif #pragma push_macro("vec_inline_spec") #if !defined(vec_inline_spec) #define vec_inline_spec static inline #endif // The "fn" macro just adds a qualified name to the front of a function identifier #pragma push_macro("fn") #undef fn #define fn(M) MLIB_PASTE_3(VecName, _, M) typedef struct VecName { /** * @private * @brief Pointer to the first vector element, or NULL if the vector is * empty. * * @note DO NOT DIRECTLY MODIFY THIS VALUE */ T *data; /** * @brief The number of elements in the vector. * * @note DO NOT DIRECTLY MODIFY THIS VALUE */ size_t size; /** * @brief The number of allocated storage elements. * * @note DO NOT DIRECTLY MODIFY THIS VALUE */ size_t capacity; #if mlib_is_cxx() T * begin() noexcept { return data; } T * end() noexcept { return data ? data + size : data; } #endif } VecName; mlib_extern_c_begin(); /** * @brief Obtain a pointer-to-mutable to the first element in the given vector */ vec_inline_spec T * fn(begin(VecName *v)) mlib_noexcept { return v->data; } /** * @brief Obtain a pointer-to-mutable past the last element in the given vector */ vec_inline_spec T * fn(end(VecName *v)) mlib_noexcept { return v->data ? v->data + v->size : v->data; } /** * @brief Obtain a pointer-to-const to the first element in the given vector */ vec_inline_spec T const * fn(cbegin(VecName const *v)) mlib_noexcept { return v->data; } /** * @brief Obtain a pointer-to-const past the last element in the given vector */ vec_inline_spec T const * fn(cend(VecName const *v)) mlib_noexcept { return v->data ? v->data + v->size : v->data; } /** * @brief Get the maximum number of elements that can be held in the vector of * a certain type. */ vec_inline_spec size_t fn(max_size(void)) mlib_noexcept { // We compare against (signed) PTRDIFF_MAX because want to support the difference // between two pointers. If we use the unsigned size, then we could have vectors // with size that is too large to represent the difference between two sizes. return PTRDIFF_MAX / sizeof(T); } /** * @brief Set the capacity of the given vector. * * @param self The vector object to be modified * @param count The new capacity. If this is less than the current size, then * the capacity will be capped at the size instead * * @retval true If-and-only-if the reallocation was successful * @retval false If there was an error in allocating the buffer */ vec_inline_spec bool fn(reserve(VecName *const self, size_t count)) mlib_noexcept { // Check if this value is beyond the possible capacity of the vector if (count > fn(max_size())) { // Too many elements. We cannot allocate a region this large. return false; } // Check if we are already at the requested capacity. if (count == self->capacity) { // No reallocation needed. return true; } // Check if the caller is requesting a lower capacity than our current size if (count < self->size) { // We cannot shrink the capacity below the current size, so just shrink-to-fit count = self->size; } // Impossible: We will never shrink below `self.size`, and if // `self.size == 0` and `count == 0`, then we early-return'd above. assert(count != 0); // The number of bytes we need to allocate. Note that this cannot overflow // because we guard against it by checking against `max_size()` const size_t new_buffer_size = count * sizeof(T); // Attempt to reallocate the region T *const new_buffer = (T *)realloc(self->data, new_buffer_size); if (!new_buffer) { // Failed to reallocate a new storage region return false; } // Successfully reallocated the buffer. Update our storage pointer. self->data = new_buffer; // Note the new capacity. self->capacity = count; return true; } /** * @brief Destroy elements in the vector at the specified range positions * * @param self The vector to be updated * @param first Pointer to the first element to be destroyed * @param last Pointer to the first element to NOT be destroyed * * Elements are destroyed and removed starting at the end. If `first == last`, * this is a no-op. The given pointers must refer to vector elements, and `last` * must be reachable by advancing `first` zero or more times. */ vec_inline_spec void fn(erase(VecName *const self, T *const first, T *const last)) { // Number of elements following the removed region const size_t n_tail_elements = (size_t)(fn(end(self)) - last); // Destroy elements in reverse order: for (T *r_iter = last; r_iter != first; --r_iter) { VecDestroyElement((r_iter - 1)); --self->size; } // This mult cannot overflow because we can never contain enough elements to overflow PTRDIFF_MAX const size_t n_bytes_to_shift = n_tail_elements * sizeof(T); // If there are any elements to be shifted, shift them down over the removed region if (n_bytes_to_shift) { // Shift all tail elements down into their new position memmove(first, last, n_bytes_to_shift); } } /** * @brief Destroy a single element at the given zero-based index position */ vec_inline_spec void fn(erase_at(VecName *const self, size_t pos)) { fn(erase(self, fn(begin(self)) + pos, fn(end(self)))); } /** * @brief Resize the vector to hold the given number of elements * * Newly added elements are zero-initialized, or initailized using VecInitElement * * @retval true If-and-only-if the resize was successful * @retval false If the function failed to allocate the new storage region * * @note Don't forget to check the return value for success! */ // mlib_nodiscard ("Check the returned bool to detect allocation failure") vec_inline_spec bool fn(resize(VecName *const self, size_t const count)) mlib_noexcept { // Check if we aren't actually growing the vector. if (count <= self->size) { // We need to destroy elements at the tail. If `count == size`, this is a no-op. if (self->data) { fn(erase(self, fn(begin(self)) + count, fn(end(self)))); } return true; } // We need to increase the capacity of the vector to hold the new elements // Try to auto-grow capacity. Increase capacity by ×1.5 const size_t half_current_capacity = self->capacity / 2; size_t new_capacity = 0; if (mlib_unlikely(mlib_add(&new_capacity, self->size, half_current_capacity))) { // The auto growth amount would overflow, so just cap to the max size. new_capacity = fn(max_size()); } // Check if our automatic growth is big enough to hold the requested number of elements if (new_capacity < count) { // The automatic growth factor is actually smaller than the number of new elements // the caller wants, so we need to increase capacity to that level instead. new_capacity = count; } // Try to reserve more storage if (!fn(reserve(self, new_capacity))) { // We failed to reserve the new storage region. The requested capacity may be too large, // or we may have just run out of memory. return false; } // Pointer to where the new end will be T *const new_end = fn(begin(self)) + count; // Create a zero-initialized object to copy over the top of each new element. T zero; memset(&zero, 0, sizeof zero); // Call init() on ever new element up until the new size for (T *iter = fn(end(self)); iter != new_end; ++iter) { *iter = zero; (void)(VecInitElement((iter))); } // Update the stored size self->size = count; return true; } /** * @brief Append another element, returning a pointer to that element. * * @return T* A pointer to the newly added element, or NULL in case of allocation failure. */ // mlib_nodiscard ("Check the returned pointer for failure") vec_inline_spec T * fn(push(VecName *self)) mlib_noexcept { size_t count = self->size; if (mlib_unlikely(mlib_add(&count, 1))) { // Adding another element would overflow size_t. This is extremely unlikely, // but precautionary. return NULL; } if (!fn(resize(self, count))) { // Failed to push another item return NULL; } return fn(begin(self)) + count - 1; } /** * @brief Create a new empty vector */ vec_inline_spec VecName fn(new(void)) mlib_noexcept { VecName ret = {NULL, 0, 0}; return ret; } /** * @brief Destroy the pointed-to vector, freeing the associated data buffer. * * The pointed-to vector becomes valid storage for a new vector object. */ vec_inline_spec void fn(destroy(VecName *self)) mlib_noexcept { // Resizing to zero will destroy all elements (void)fn(resize(self, 0)); // Resizing won't necessarily free the data buffer. Do that now. free(self->data); self->capacity = 0; self->data = NULL; } /** * @brief Create a new vector with `n` initialized elements */ vec_inline_spec VecName fn(new_n(size_t n, bool *okay)) mlib_noexcept { VecName ret = fn(new()); *okay = fn(resize)(&ret, n); return ret; } #ifdef VecCopyElement /** * @brief Copy the data from the vector `src` into storage for a new vector `dst` * * @param dst_vec Pointer-to-storage for a new vector object to be initialized. * @param src_vec Pointer to a vector whose elements will be copied into a new vector * @retval true If-and-only-if the copy was successful. * @retval false Otherwise */ vec_inline_spec bool fn(init_copy(VecName *dst_vec, VecName const *src_vec)) mlib_noexcept { VecName tmp = fn(new()); // Try to reseve capacity for all new elements. Don't resize(), because we want // uninitialized storage for the new data. if (!fn(reserve(&tmp, src_vec->size))) { // We failed to reserve capacity in the new vector fn(destroy(&tmp)); // Always leave `dst_vec` in an initialized state. *dst_vec = (VecName){NULL, 0, 0}; return false; } // Copy everything into the destination element-by-element { // Input iterator T const *in_iter = fn(cbegin(src_vec)); // Input stop position T const *const in_stop = fn(cend(src_vec)); // Output iterator T *out_iter = tmp.data; // Copy from the first to the last for (; in_iter != in_stop; ++in_iter, ++out_iter) { // Try to copy into the new element if (!VecCopyElement((out_iter), (in_iter))) { // Failed copying here. Undo everything by destroying the temporary fn(destroy(&tmp)); // Always leave `dst_vec` in an initialized state. *dst_vec = (VecName){NULL, 0, 0}; return false; } // Update the size of the temporary vec to record that it is holding the new // element. This allows us to call `destroy()` to undo our work. tmp.size++; } } // Everything went okay. Give the temporary to the caller as the final result *dst_vec = tmp; return true; } #endif // VecCopyElement #ifndef mlib_vec_foreach #define mlib_vec_foreach(Type, VarName, Vector) \ for (Type *VarName = (Vector).data; VarName && (VarName != (Vector).data + (Vector).size); ++VarName) #endif #ifndef mlib_vec_at /** * @brief Obtain a vector element at some zero-based index offset, with negative index * wrapping (-1 refers to the last element in the vector) * * @note The `Vec` argument will be evaluated at least twice! */ #define mlib_vec_at(Vec, Pos) ((Vec).data[_mlib_vec_index_adjust((Vec).size, mlib_upsize_integer(Pos))]) static inline size_t _mlib_vec_index_adjust(size_t size, mlib_upsized_integer pos) { if (pos.is_signed && pos.bits.as_signed < 0) { return mlib_assert_add(size_t, size, pos.bits.as_signed); } mlib_check(pos.bits.as_unsigned, lte, size, because, "the vector index must be in-bounds for mlib_vec_at()"); return pos.bits.as_unsigned; } #endif mlib_extern_c_end(); #undef T #undef VecName #undef VecDestroyElement #undef VecInitElement #undef VecTrivialCopyElement #ifdef VecCopyElement #undef VecCopyElement #endif // These ones we want to pop, not undefine: #pragma pop_macro("fn") #pragma pop_macro("vec_inline_spec") // vi: ft=c mongo-c-driver-2.2.1/src/common/tests/000077500000000000000000000000001511661753600176005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/common/tests/test-common-atomic.c000066400000000000000000000133641511661753600234720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #define ATOMIC(Kind, Operation) BSON_CONCAT4(mcommon_atomic_, Kind, _, Operation) #define TEST_KIND_WITH_MEMORDER(Kind, TypeName, MemOrder, Assert) \ do { \ int i; \ TypeName got; \ TypeName value = 0; \ got = ATOMIC(Kind, fetch)(&value, MemOrder); \ Assert(got, ==, 0); \ got = ATOMIC(Kind, fetch_add)(&value, 42, MemOrder); \ Assert(got, ==, 0); \ Assert(value, ==, 42); \ got = ATOMIC(Kind, fetch_sub)(&value, 7, MemOrder); \ Assert(got, ==, 42); \ Assert(value, ==, 35); \ got = ATOMIC(Kind, exchange)(&value, 77, MemOrder); \ Assert(got, ==, 35); \ Assert(value, ==, 77); \ /* Compare-exchange fail: */ \ got = ATOMIC(Kind, compare_exchange_strong)(&value, 4, 9, MemOrder); \ Assert(got, ==, 77); \ Assert(value, ==, 77); \ /* Compare-exchange succeed: */ \ got = ATOMIC(Kind, compare_exchange_strong)(&value, 77, 9, MemOrder); \ Assert(got, ==, 77); \ Assert(value, ==, 9); \ /* Compare-exchange fail: */ \ got = ATOMIC(Kind, compare_exchange_weak)(&value, 8, 12, MemOrder); \ Assert(got, ==, 9); \ Assert(value, ==, 9); \ /* Compare-exchange-weak succeed: */ \ /* 'weak' may fail spuriously, so it must *eventually* succeed */ \ for (i = 0; i < 10000 && value != 53; ++i) { \ got = ATOMIC(Kind, compare_exchange_weak)(&value, 9, 53, MemOrder); \ Assert(got, ==, 9); \ } \ /* Check that it evenutally succeeded */ \ Assert(value, ==, 53); \ } while (0) #define TEST_INTEGER_KIND(Kind, TypeName, Assert) \ do { \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_relaxed, Assert); \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_acq_rel, Assert); \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_acquire, Assert); \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_release, Assert); \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_consume, Assert); \ TEST_KIND_WITH_MEMORDER(Kind, TypeName, mcommon_memory_order_seq_cst, Assert); \ } while (0) static void test_integers(void) { TEST_INTEGER_KIND(int64, int64_t, ASSERT_CMPINT64); TEST_INTEGER_KIND(int32, int32_t, ASSERT_CMPINT32); TEST_INTEGER_KIND(int16, int16_t, ASSERT_CMPINT); TEST_INTEGER_KIND(int8, int8_t, ASSERT_CMPINT); TEST_INTEGER_KIND(int, int, ASSERT_CMPINT); } static void test_pointers(void) { int u = 12; int v = 9; int w = 91; int *ptr = &v; int *other; int *prev; other = mcommon_atomic_ptr_fetch((void *)&ptr, mcommon_memory_order_relaxed); ASSERT_CMPVOID(other, ==, ptr); prev = mcommon_atomic_ptr_exchange((void *)&other, &u, mcommon_memory_order_relaxed); ASSERT_CMPVOID(prev, ==, &v); ASSERT_CMPVOID(other, ==, &u); prev = mcommon_atomic_ptr_compare_exchange_strong((void *)&other, &v, &w, mcommon_memory_order_relaxed); ASSERT_CMPVOID(prev, ==, &u); ASSERT_CMPVOID(other, ==, &u); prev = mcommon_atomic_ptr_compare_exchange_strong((void *)&other, &u, &w, mcommon_memory_order_relaxed); ASSERT_CMPVOID(prev, ==, &u); ASSERT_CMPVOID(other, ==, &w); } static void test_thread_fence(void) { mcommon_atomic_thread_fence(); } static void test_thrd_yield(void) { mcommon_thrd_yield(); } void test_mcommon_atomic_install(TestSuite *suite) { TestSuite_Add(suite, "/mcommon/atomic/integers", test_integers); TestSuite_Add(suite, "/mcommon/atomic/pointers", test_pointers); TestSuite_Add(suite, "/mcommon/atomic/thread_fence", test_thread_fence); TestSuite_Add(suite, "/mcommon/atomic/thread_yield", test_thrd_yield); } mongo-c-driver-2.2.1/src/common/tests/test-common-oid.c000066400000000000000000000026551511661753600227720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void test_mcommon_oid_zero(void) { bson_oid_t oid; bson_oid_init_from_string(&oid, "000000000000000000000000"); BSON_ASSERT(true == bson_oid_equal(&oid, &kZeroObjectId)); BSON_ASSERT(true == mcommon_oid_is_zero(&oid)); bson_oid_init_from_string(&oid, "010000000000000000000000"); BSON_ASSERT(false == mcommon_oid_is_zero(&oid)); bson_oid_init_from_string(&oid, "000000000000000000000001"); BSON_ASSERT(false == mcommon_oid_is_zero(&oid)); bson_oid_init_from_string(&oid, "ffffffffffffffffffffffff"); BSON_ASSERT(false == mcommon_oid_is_zero(&oid)); mcommon_oid_set_zero(&oid); BSON_ASSERT(true == mcommon_oid_is_zero(&oid)); } void test_mcommon_oid_install(TestSuite *suite) { TestSuite_Add(suite, "/mcommon/oid/zero", test_mcommon_oid_zero); } mongo-c-driver-2.2.1/src/common/tests/test-mlib.c000066400000000000000000001244351511661753600216550ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #undef min // Used as a time unit suffix mlib_diagnostic_push(); // We don't set any diagnostics, we just want to make sure it compiles // Not relevant, we just want to test that it compiles: mlib_msvc_warning(disable : 4507); static void _test_checks(void) { // Simple condiion mlib_check(true); mlib_assert_aborts () { mlib_check(false); } // str_eq mlib_check("foo", str_eq, "foo"); mlib_assert_aborts () { mlib_check("foo", str_eq, "bar"); } // ptr_eq const char *s = "foo"; mlib_check(s, ptr_eq, s); mlib_assert_aborts () { mlib_check(s, ptr_eq, NULL); } // eq mlib_check(4, eq, 4); mlib_assert_aborts () { mlib_check(1, eq, 4); } // neq mlib_check(1, neq, 4); mlib_assert_aborts () { mlib_check(1, neq, 1); } // "because" string mlib_check(true, because, "just true"); mlib_assert_aborts () { mlib_check(false, because, "this will fail"); } // lt mlib_check(1, lt, 4); mlib_assert_aborts () { mlib_check(4, lt, 1); } mlib_check(1, lte, 4); mlib_check(1, lte, 1); mlib_assert_aborts () { mlib_check(4, lte, 3); } // gt mlib_check(4, gt, 2); mlib_assert_aborts () { mlib_check(3, gt, 5); } mlib_check(3, gte, 2); mlib_check(3, gte, 3); mlib_assert_aborts () { mlib_check(3, gte, 5); } // An infix with a reason string mlib_check(1, eq, 1, because, "1 = 1"); } static void _test_bits(void) { mlib_check(mlib_bits(0, 0), eq, 0); // 0b000 mlib_check(mlib_bits(1, 0), eq, 1); // 0b001 mlib_check(mlib_bits(2, 0), eq, 3); // 0b011 mlib_check(mlib_bits(1, 1), eq, 2); // 0b010 mlib_check(mlib_bits(5, 3), eq, 248); // 0b11111000 mlib_check(mlib_bits(64, 0), eq, UINT64_MAX); // 0b111... } static void _test_minmax(void) { mlib_static_assert(mlib_minof(unsigned) == 0); // Ambiguous signedness, still works: mlib_static_assert(mlib_minof(char) == CHAR_MIN); mlib_static_assert(mlib_maxof(char) == CHAR_MAX); mlib_static_assert(mlib_minof(uint8_t) == 0); mlib_static_assert(mlib_maxof(uint8_t) == UINT8_MAX); mlib_static_assert(mlib_minof(uint16_t) == 0); mlib_static_assert(mlib_maxof(uint16_t) == UINT16_MAX); mlib_static_assert(mlib_minof(uint32_t) == 0); mlib_static_assert(mlib_maxof(uint32_t) == UINT32_MAX); mlib_static_assert(mlib_minof(uint64_t) == 0); mlib_static_assert(mlib_maxof(uint64_t) == UINT64_MAX); mlib_static_assert(mlib_maxof(size_t) == SIZE_MAX); mlib_static_assert(mlib_maxof(ptrdiff_t) == PTRDIFF_MAX); mlib_static_assert(mlib_minof(int) == INT_MIN); mlib_static_assert(mlib_maxof(int) == INT_MAX); mlib_static_assert(mlib_maxof(unsigned) == UINT_MAX); mlib_static_assert(mlib_is_signed(int)); mlib_static_assert(mlib_is_signed(signed char)); mlib_static_assert(mlib_is_signed(int8_t)); mlib_static_assert(!mlib_is_signed(uint8_t)); mlib_static_assert(mlib_is_signed(int16_t)); mlib_static_assert(!mlib_is_signed(uint16_t)); mlib_static_assert(mlib_is_signed(int32_t)); mlib_static_assert(!mlib_is_signed(uint32_t)); mlib_static_assert(mlib_is_signed(int64_t)); mlib_static_assert(!mlib_is_signed(uint64_t)); // Ambiguous signedness: mlib_static_assert(mlib_is_signed(char) || !mlib_is_signed(char)); } static void _test_upsize(void) { struct mlib_upsized_integer up; up = mlib_upsize_integer(31); mlib_check(up.is_signed); mlib_check(up.bits.as_signed == 31); // Casting from the max unsigned integer generates an unsigned upsized integer: up = mlib_upsize_integer((uintmax_t)1729); mlib_check(!up.is_signed); mlib_check(up.bits.as_unsigned == 1729); // Max signed integer makes a signed upsized integer: up = mlib_upsize_integer((intmax_t)1729); mlib_check(up.is_signed); mlib_check(up.bits.as_signed == 1729); // From a literal: up = mlib_upsize_integer(UINTMAX_MAX); mlib_check(!up.is_signed); mlib_check(up.bits.as_unsigned == UINTMAX_MAX); } static void _test_cmp(void) { mlib_check(mlib_cmp(1, 2) == mlib_less); mlib_check(mlib_cmp(1, 2) < 0); mlib_check(mlib_cmp(1, <, 2)); mlib_check(mlib_cmp(2, 1) == mlib_greater); mlib_check(mlib_cmp(2, 1) > 0); mlib_check(mlib_cmp(2, >, 1)); mlib_check(mlib_cmp(1, 1) == mlib_equal); mlib_check(mlib_cmp(1, 1) == 0); mlib_check(mlib_cmp(1, ==, 1)); ASSERT(mlib_cmp(0, ==, 0)); ASSERT(!mlib_cmp(0, ==, -1)); ASSERT(!mlib_cmp(0, ==, 1)); ASSERT(!mlib_cmp(-1, ==, 0)); ASSERT(mlib_cmp(-1, ==, -1)); ASSERT(!mlib_cmp(-1, ==, 1)); ASSERT(!mlib_cmp(1, ==, 0)); ASSERT(!mlib_cmp(1, ==, -1)); ASSERT(mlib_cmp(1, ==, 1)); ASSERT(mlib_cmp(0u, ==, 0u)); ASSERT(!mlib_cmp(0u, ==, 1u)); ASSERT(!mlib_cmp(1u, ==, 0u)); ASSERT(mlib_cmp(1u, ==, 1u)); ASSERT(mlib_cmp(0, ==, 0u)); ASSERT(!mlib_cmp(0, ==, 1u)); ASSERT(!mlib_cmp(-1, ==, 0u)); ASSERT(!mlib_cmp(-1, ==, 1u)); ASSERT(!mlib_cmp(1, ==, 0u)); ASSERT(mlib_cmp(1, ==, 1u)); ASSERT(mlib_cmp(0u, ==, 0)); ASSERT(!mlib_cmp(0u, ==, -1)); ASSERT(!mlib_cmp(0u, ==, 1)); ASSERT(!mlib_cmp(1u, ==, 0)); ASSERT(!mlib_cmp(1u, ==, -1)); ASSERT(mlib_cmp(1u, ==, 1)); ASSERT(!mlib_cmp(0, !=, 0)); ASSERT(mlib_cmp(0, !=, -1)); ASSERT(mlib_cmp(0, !=, 1)); ASSERT(mlib_cmp(-1, !=, 0)); ASSERT(!mlib_cmp(-1, !=, -1)); ASSERT(mlib_cmp(-1, !=, 1)); ASSERT(mlib_cmp(1, !=, 0)); ASSERT(mlib_cmp(1, !=, -1)); ASSERT(!mlib_cmp(1, !=, 1)); ASSERT(!mlib_cmp(0u, !=, 0u)); ASSERT(mlib_cmp(0u, !=, 1u)); ASSERT(mlib_cmp(1u, !=, 0u)); ASSERT(!mlib_cmp(1u, !=, 1u)); ASSERT(!mlib_cmp(0, !=, 0u)); ASSERT(mlib_cmp(0, !=, 1u)); ASSERT(mlib_cmp(-1, !=, 0u)); ASSERT(mlib_cmp(-1, !=, 1u)); ASSERT(mlib_cmp(1, !=, 0u)); ASSERT(!mlib_cmp(1, !=, 1u)); ASSERT(!mlib_cmp(0u, !=, 0)); ASSERT(mlib_cmp(0u, !=, -1)); ASSERT(mlib_cmp(0u, !=, 1)); ASSERT(mlib_cmp(1u, !=, 0)); ASSERT(mlib_cmp(1u, !=, -1)); ASSERT(!mlib_cmp(1u, !=, 1)); ASSERT(!mlib_cmp(0, <, 0)); ASSERT(!mlib_cmp(0, <, -1)); ASSERT(mlib_cmp(0, <, 1)); ASSERT(mlib_cmp(-1, <, 0)); ASSERT(!mlib_cmp(-1, <, -1)); ASSERT(mlib_cmp(-1, <, 1)); ASSERT(!mlib_cmp(1, <, 0)); ASSERT(!mlib_cmp(1, <, -1)); ASSERT(!mlib_cmp(1, <, 1)); ASSERT(!mlib_cmp(0u, <, 0u)); ASSERT(mlib_cmp(0u, <, 1u)); ASSERT(!mlib_cmp(1u, <, 0u)); ASSERT(!mlib_cmp(1u, <, 1u)); ASSERT(!mlib_cmp(0, <, 0u)); ASSERT(mlib_cmp(0, <, 1u)); ASSERT(mlib_cmp(-1, <, 0u)); ASSERT(mlib_cmp(-1, <, 1u)); ASSERT(!mlib_cmp(1, <, 0u)); ASSERT(!mlib_cmp(1, <, 1u)); ASSERT(!mlib_cmp(0u, <, 0)); ASSERT(!mlib_cmp(0u, <, -1)); ASSERT(mlib_cmp(0u, <, 1)); ASSERT(!mlib_cmp(1u, <, 0)); ASSERT(!mlib_cmp(1u, <, -1)); ASSERT(!mlib_cmp(1u, <, 1)); ASSERT(!mlib_cmp(0, >, 0)); ASSERT(mlib_cmp(0, >, -1)); ASSERT(!mlib_cmp(0, >, 1)); ASSERT(!mlib_cmp(-1, >, 0)); ASSERT(!mlib_cmp(-1, >, -1)); ASSERT(!mlib_cmp(-1, >, 1)); ASSERT(mlib_cmp(1, >, 0)); ASSERT(mlib_cmp(1, >, -1)); ASSERT(!mlib_cmp(1, >, 1)); ASSERT(!mlib_cmp(0u, >, 0u)); ASSERT(!mlib_cmp(0u, >, 1u)); ASSERT(mlib_cmp(1u, >, 0u)); ASSERT(!mlib_cmp(1u, >, 1u)); ASSERT(!mlib_cmp(0, >, 0u)); ASSERT(!mlib_cmp(0, >, 1u)); ASSERT(!mlib_cmp(-1, >, 0u)); ASSERT(!mlib_cmp(-1, >, 1u)); ASSERT(mlib_cmp(1, >, 0u)); ASSERT(!mlib_cmp(1, >, 1u)); ASSERT(!mlib_cmp(0u, >, 0)); ASSERT(mlib_cmp(0u, >, -1)); ASSERT(!mlib_cmp(0u, >, 1)); ASSERT(mlib_cmp(1u, >, 0)); ASSERT(mlib_cmp(1u, >, -1)); ASSERT(!mlib_cmp(1u, >, 1)); ASSERT(mlib_cmp(0, <=, 0)); ASSERT(!mlib_cmp(0, <=, -1)); ASSERT(mlib_cmp(0, <=, 1)); ASSERT(mlib_cmp(-1, <=, 0)); ASSERT(mlib_cmp(-1, <=, -1)); ASSERT(mlib_cmp(-1, <=, 1)); ASSERT(!mlib_cmp(1, <=, 0)); ASSERT(!mlib_cmp(1, <=, -1)); ASSERT(mlib_cmp(1, <=, 1)); ASSERT(mlib_cmp(0u, <=, 0u)); ASSERT(mlib_cmp(0u, <=, 1u)); ASSERT(!mlib_cmp(1u, <=, 0u)); ASSERT(mlib_cmp(1u, <=, 1u)); ASSERT(mlib_cmp(0, <=, 0u)); ASSERT(mlib_cmp(0, <=, 1u)); ASSERT(mlib_cmp(-1, <=, 0u)); ASSERT(mlib_cmp(-1, <=, 1u)); ASSERT(!mlib_cmp(1, <=, 0u)); ASSERT(mlib_cmp(1, <=, 1u)); ASSERT(mlib_cmp(0u, <=, 0)); ASSERT(!mlib_cmp(0u, <=, -1)); ASSERT(mlib_cmp(0u, <=, 1)); ASSERT(!mlib_cmp(1u, <=, 0)); ASSERT(!mlib_cmp(1u, <=, -1)); ASSERT(mlib_cmp(1u, <=, 1)); ASSERT(mlib_cmp(0, >=, 0)); ASSERT(mlib_cmp(0, >=, -1)); ASSERT(!mlib_cmp(0, >=, 1)); ASSERT(!mlib_cmp(-1, >=, 0)); ASSERT(mlib_cmp(-1, >=, -1)); ASSERT(!mlib_cmp(-1, >=, 1)); ASSERT(mlib_cmp(1, >=, 0)); ASSERT(mlib_cmp(1, >=, -1)); ASSERT(mlib_cmp(1, >=, 1)); ASSERT(mlib_cmp(0u, >=, 0u)); ASSERT(!mlib_cmp(0u, >=, 1u)); ASSERT(mlib_cmp(1u, >=, 0u)); ASSERT(mlib_cmp(1u, >=, 1u)); ASSERT(mlib_cmp(0, >=, 0u)); ASSERT(!mlib_cmp(0, >=, 1u)); ASSERT(!mlib_cmp(-1, >=, 0u)); ASSERT(!mlib_cmp(-1, >=, 1u)); ASSERT(mlib_cmp(1, >=, 0u)); ASSERT(mlib_cmp(1, >=, 1u)); ASSERT(mlib_cmp(0u, >=, 0)); ASSERT(mlib_cmp(0u, >=, -1)); ASSERT(!mlib_cmp(0u, >=, 1)); ASSERT(mlib_cmp(1u, >=, 0)); ASSERT(mlib_cmp(1u, >=, -1)); ASSERT(mlib_cmp(1u, >=, 1)); size_t big_size = SIZE_MAX; ASSERT(mlib_cmp(42, big_size) == mlib_less); ASSERT(mlib_cmp(big_size, big_size) == mlib_equal); ASSERT(mlib_cmp(big_size, SSIZE_MIN) == mlib_greater); uint8_t smol = 7; ASSERT(mlib_cmp(smol, SIZE_MAX) == mlib_less); int8_t ismol = -4; ASSERT(mlib_cmp(ismol, big_size) == mlib_less); /// Example: Getting the correct answer: // Unintuitive result due to integer promotion: mlib_diagnostic_push(); mlib_gnu_warning_disable("-Wsign-compare"); mlib_disable_constant_conditional_expression_warnings(); mlib_msvc_warning(disable : 4308); ASSERT(-27 > 20u); // Deliberate signed -> unsigned implicit conversion check. mlib_diagnostic_pop(); // mlib_cmp produces the correct answer: ASSERT(mlib_cmp(-27, <, 20u)); // CDRIVER-6043: until VS 2019 (MSVC 19.20), compound literals seem to "escape" the expression or scope they are // meant to be in. This includes the compound literals used by the conditional operator in mlib_upsize_integer. #if !defined(_MSC_VER) || _MSC_VER >= 1920 { // Check that we do not double-evaluate the operand expression. intmax_t a = 4; mlib_check(mlib_cmp(++a, ==, 5)); // We only increment once: mlib_check(a, eq, 5); } #endif } static void _test_in_range(void) { const int64_t int8_min = INT8_MIN; const int64_t int8_max = INT8_MAX; const int64_t int32_min = INT32_MIN; const int64_t int32_max = INT32_MAX; const uint64_t uint8_max = UINT8_MAX; const uint64_t uint32_max = UINT32_MAX; const ssize_t ssize_min = SSIZE_MIN; const ssize_t ssize_max = SSIZE_MAX; ASSERT(!mlib_in_range(int8_t, 1729)); ASSERT(!mlib_in_range(int, SIZE_MAX)); ASSERT(mlib_in_range(size_t, SIZE_MAX)); ASSERT(!mlib_in_range(size_t, -42)); ASSERT(mlib_in_range(int8_t, -42)); ASSERT(mlib_in_range(int8_t, -128)); ASSERT(!mlib_in_range(int8_t, -129)); ASSERT(!mlib_in_range(int8_t, int8_min - 1)); ASSERT(mlib_in_range(int8_t, int8_min)); ASSERT(mlib_in_range(int8_t, 0)); ASSERT(mlib_in_range(int8_t, int8_max)); ASSERT(!mlib_in_range(int8_t, int8_max + 1)); ASSERT(mlib_in_range(int8_t, 0u)); ASSERT(mlib_in_range(int8_t, (uint64_t)int8_max)); ASSERT(!mlib_in_range(int8_t, (uint64_t)(int8_max + 1))); ASSERT(!mlib_in_range(uint8_t, int8_min - 1)); ASSERT(!mlib_in_range(uint8_t, int8_min)); ASSERT(mlib_in_range(uint8_t, 0)); ASSERT(mlib_in_range(uint8_t, int8_max)); ASSERT(mlib_in_range(uint8_t, int8_max + 1)); ASSERT(mlib_in_range(uint8_t, (int64_t)uint8_max)); ASSERT(!mlib_in_range(uint8_t, (int64_t)uint8_max + 1)); ASSERT(mlib_in_range(uint8_t, 0u)); ASSERT(mlib_in_range(uint8_t, uint8_max)); ASSERT(!mlib_in_range(uint8_t, uint8_max + 1u)); ASSERT(!mlib_in_range(int32_t, int32_min - 1)); ASSERT(mlib_in_range(int32_t, int32_min)); ASSERT(mlib_in_range(int32_t, 0)); ASSERT(mlib_in_range(int32_t, int32_max)); ASSERT(!mlib_in_range(int32_t, int32_max + 1)); ASSERT(mlib_in_range(int32_t, 0u)); ASSERT(mlib_in_range(int32_t, (uint64_t)int32_max)); ASSERT(!mlib_in_range(int32_t, (uint64_t)(int32_max + 1))); ASSERT(!mlib_in_range(uint32_t, int32_min - 1)); ASSERT(!mlib_in_range(uint32_t, int32_min)); ASSERT(mlib_in_range(uint32_t, 0)); ASSERT(mlib_in_range(uint32_t, int32_max)); ASSERT(mlib_in_range(uint32_t, int32_max + 1)); ASSERT(mlib_in_range(uint32_t, (int64_t)uint32_max)); ASSERT(!mlib_in_range(uint32_t, (int64_t)uint32_max + 1)); ASSERT(mlib_in_range(uint32_t, 0u)); ASSERT(mlib_in_range(uint32_t, uint32_max)); ASSERT(!mlib_in_range(uint32_t, uint32_max + 1u)); ASSERT(mlib_in_range(ssize_t, ssize_min)); ASSERT(mlib_in_range(ssize_t, 0)); ASSERT(mlib_in_range(ssize_t, ssize_max)); ASSERT(mlib_in_range(ssize_t, 0u)); ASSERT(mlib_in_range(ssize_t, (size_t)ssize_max)); ASSERT(!mlib_in_range(ssize_t, (size_t)ssize_max + 1u)); ASSERT(!mlib_in_range(size_t, ssize_min)); ASSERT(mlib_in_range(size_t, 0)); ASSERT(mlib_in_range(size_t, ssize_max)); ASSERT(mlib_in_range(size_t, 0u)); ASSERT(mlib_in_range(size_t, (size_t)ssize_max)); ASSERT(mlib_in_range(size_t, (size_t)ssize_max + 1u)); } static void _test_assert_aborts(void) { int a = 0; mlib_assert_aborts () { a = 4; abort(); } // Parent process is unaffected: ASSERT(a == 0); } static void _test_int_encoding(void) { { const char *buf = "\x01\x02\x03\x04"; const uint32_t val = mlib_read_u32le(buf); mlib_check(val, eq, 0x04030201); } { char buf[9] = {0}; char *o = mlib_write_i32le(buf, 0x01020304); mlib_check(o, ptr_eq, buf + 4); mlib_check(buf, str_eq, "\x04\x03\x02\x01"); o = mlib_write_i32le(o, 42); mlib_check(o, ptr_eq, buf + 8); mlib_check(buf, str_eq, "\x04\x03\x02\x01*"); o = mlib_write_i64le(buf, 0x0102030405060708); mlib_check(o, ptr_eq, buf + 8); mlib_check(buf, str_eq, "\x08\x07\x06\x05\x04\x03\x02\x01"); } } static void _test_int_parse(void) { const int64_t bogus_value = 2424242424242424242; struct case_ { const char *in; int64_t value; int ec; } cases[] = { // Basics: {"0", 0}, {"1", 1}, {"+1", 1}, {"-1", -1}, // Differences from strtoll // We require at least one digit immediately {"a1", bogus_value, EINVAL}, {"", bogus_value, EINVAL}, // No space skipping {" 1", bogus_value, EINVAL}, {" +42", bogus_value, EINVAL}, // No trailing characters {"123a", bogus_value, EINVAL}, // strtoll: Set ERANGE if the value is too large {"123456789123456789123", bogus_value, ERANGE}, // Difference: We generate EINVAL if its not an integer, even if strtoll says ERANGE {"123456789123456789123abc", bogus_value, EINVAL}, // Truncated prefix {"+", bogus_value, EINVAL}, {"+0x", bogus_value, EINVAL}, {"0x", bogus_value, EINVAL}, {"-0b", bogus_value, EINVAL}, {"0xff", 0xff}, {"0xfr", bogus_value, EINVAL}, {"0x0", 0}, {"0o755", 0755}, {"0755", 0755}, // Boundary cases: {"9223372036854775807", INT64_MAX}, {"-9223372036854775808", INT64_MIN}, }; mlib_foreach_arr (struct case_, test, cases) { int64_t value = bogus_value; int ec = mlib_i64_parse(mstr_cstring(test->in), &value); mlib_check(value, eq, test->value); mlib_check(ec, eq, test->ec); } { // Parsing stops after the three digits when we slice the string int64_t value; int ec = mlib_i64_parse(mstr_view_data("123abc", 3), &value); mlib_check(ec, eq, 0); mlib_check(value, eq, 123); } { // Does not try to parse after the "0x" when we slice int ec = mlib_i64_parse(mstr_view_data("0x123", 2), NULL); mlib_check(ec, eq, EINVAL); } { // Does not try to read past the "+" into stack memory char plus = '+'; int ec = mlib_i64_parse(mstr_view_data(&plus, 1), NULL); mlib_check(ec, eq, EINVAL); } } static void _test_foreach(void) { int n_loops = 0; mlib_foreach_urange (i, 10) { fprintf(stderr, "i: %zu\n", i); fprintf(stderr, "counter: %zu\n", i_counter); ASSERT(i == loop.index); ASSERT(loop.first == (i == 0)); ASSERT(loop.last == (i == 9)); ++n_loops; (void)i; ASSERT(n_loops <= 10); } ASSERT(n_loops == 10); n_loops = 0; mlib_foreach_urange (i, 100) { if (i == 42) { break; } ++n_loops; } ASSERT(n_loops == 42); n_loops = 0; mlib_foreach_urange (i, 1729) { (void)i; ++n_loops; } ASSERT(n_loops == 1729); mlib_foreach_urange (i, 0) { (void)i; ASSERT(false); // Shouldn't ever enter the loop } n_loops = 0; mlib_foreach_urange (i, 4, 7) { ++n_loops; ASSERT(i >= 4); ASSERT(i < 7); } ASSERT(n_loops == 3); int arr[] = {1, 2, 3}; int sum = 0; n_loops = 0; mlib_foreach_arr (int, n, arr) { mlib_check(n_loops, eq, loop.index); n_loops++; sum += *n; ASSERT(loop.first == (n == arr + 0)); ASSERT(loop.last == (n == arr + 2)); } ASSERT(sum == 6); ASSERT(n_loops == 3); } static void _test_cast(void) { int a = 1729; // Fine: int16_t i16 = mlib_assert_narrow(int16_t, a); ASSERT(i16 == 1729); // Fine: a = -6; i16 = mlib_assert_narrow(int16_t, a); ASSERT(i16 == -6); // Boundary: size_t sz = mlib_assert_narrow(size_t, SIZE_MAX); ASSERT(sz == SIZE_MAX); sz = mlib_assert_narrow(size_t, 0); ASSERT(sz == 0); // Boundary: sz = mlib_assert_narrow(size_t, SSIZE_MAX); ASSERT(sz == SSIZE_MAX); mlib_assert_aborts () { (void)mlib_assert_narrow(size_t, -4); } mlib_assert_aborts () { (void)mlib_assert_narrow(ssize_t, SIZE_MAX); } } // This is a "partial" test of the ckdint APIs. A fully exhaustive test set is defined // in `mlib/ckdint.test.cpp` static void _test_ckdint_partial(void) { // Small signed { int a = 42; mlib_check(!mlib_add(&a, a, 5)); // a = a + 5 mlib_check(a, eq, 47); mlib_check(!mlib_add(&a, 5)); // a += 5 mlib_check(a, eq, 52); // The `check` arithmetic functions should abort the process immediately mlib_assert_aborts () { mlib_assert_add(size_t, 41, -42); } mlib_assert_aborts () { mlib_assert_add(ptrdiff_t, 41, SIZE_MAX); } // Does not abort: const size_t sum = mlib_assert_add(size_t, -32, 33); mlib_check(sum, eq, 1); mlib_check(!mlib_add(&a, a, (size_t)123456)); mlib_check(a, eq, 123508); a = 4; mlib_check(mlib_add(&a, a, INT_MAX)); // Indicates overflow mlib_check(a, eq, INT_MIN + 3); // Result is wrapped a = -1; mlib_check(!mlib_add(&a, a, INT_MAX)); mlib_check(a, eq, INT_MAX - 1); } // Small unsigned { unsigned a = 42; mlib_check(!mlib_add(&a, a, 5)); mlib_check(a, eq, 47); mlib_check(!mlib_add(&a, a, INT_MAX)); mlib_check(a, eq, (unsigned)INT_MAX + 47); } // Sub with small signed { int a = -1; mlib_check(mlib_sub(&a, INT_MAX, a)); // MAX - (-1) → MAX + 1 mlib_check(a, eq, INT_MIN); a = -1; mlib_check(!mlib_sub(&a, INT_MIN, a)); // MIN - (-1) → MIN + 1 mlib_check(a, eq, INT_MIN + 1); } // Max precision tests are more interesting, because they excercise the bit-manipulation // tricks in the arithmetic functions, while smaller ints are simple bounds checks // ============== // Maximum precision signed { intmax_t a = 42; mlib_check(!mlib_add(&a, a, 5)); mlib_check(a, eq, 47); mlib_check(mlib_add(&a, 42, INTMAX_MAX)); // Overflows mlib_check(a, eq, INTMAX_MIN + 41); // Wraps mlib_check(!mlib_sub(&a, -1, INTMAX_MIN)); // (-N) - (-M) is always well-defined mlib_check(a, eq, INTMAX_MAX); mlib_check(mlib_sub(&a, -2, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX); mlib_check(!mlib_sub(&a, 1, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MIN + 2); mlib_check(!mlib_mul(&a, 1, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX); mlib_check(mlib_mul(&a, 2, INTMAX_MAX)); mlib_check(a, eq, -2); mlib_check(mlib_mul(&a, 3, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX - 2); } // Maximum precision unsigned { uintmax_t a = 42; mlib_check(!mlib_add(&a, a, 5)); mlib_check(a, eq, 47); a = 42; mlib_check(mlib_add(&a, a, UINTMAX_MAX)); // Overflows mlib_check(a, eq, 41); // Wraps a = 1; mlib_check(mlib_sub(&a, a, INTMAX_MAX)); // Overflows (result is negative) mlib_check(a, eq, (uintmax_t)INTMAX_MAX + 3); mlib_check(!mlib_sub(&a, -1, INTMAX_MIN)); // (-N) - (-M) is always well-defined mlib_check(a, eq, INTMAX_MAX); mlib_check(mlib_sub(&a, -2, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX); mlib_check(mlib_sub(&a, 1, INTMAX_MAX)); mlib_check(a, eq, (uintmax_t)INTMAX_MAX + 3); mlib_check(!mlib_mul(&a, 1, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX); // Just barely enough room: mlib_check(!mlib_mul(&a, 2, INTMAX_MAX)); mlib_check(a, eq, UINTMAX_MAX - 1); // Too big: mlib_check(mlib_mul(&a, 3, INTMAX_MAX)); mlib_check(a, eq, INTMAX_MAX - 2); } { // Check asserting form with a dest type smaller than intmax, which triggers // a special branch on big-endian systems. int32_t const i = mlib_assert_mul(int32_t, -908, 1000); mlib_check(i, eq, -908000); } } static void _test_str_view(void) { mstr_view sv = mstr_cstring("Hello, world!"); mlib_check(sv.data, str_eq, "Hello, world!"); mlib_check(mstr_cmp(sv, ==, mstr_cstring("Hello, world!"))); mlib_check(mstr_cmp(sv, >, mstr_cstring("Hello"))); // Longer strings are greater than shorter strings mlib_check(mstr_cmp(sv, <, mstr_cstring("ZZZZZ"))); // str_view_from duplicates a string view: mlib_check(mstr_cmp(sv, ==, mstr_view_from(sv))); // Substring { sv = mstr_cstring("foobar"); // Implicit length includes everything: mlib_check(mstr_cmp(mstr_substr(sv, 2), ==, mstr_cstring("obar"))); // Explicit length trims: mlib_check(mstr_cmp(mstr_substr(sv, 2, 1), ==, mstr_cstring("o"))); // Substring over the whole length: mlib_check(mstr_cmp(mstr_substr(sv, sv.len), ==, mstr_cstring(""))); } // Substring from end { sv = mstr_cstring("foobar"); mlib_check(mstr_cmp(mstr_substr(sv, -3), ==, mstr_cstring("bar"))); mlib_check(mstr_cmp(mstr_substr(sv, -6), ==, mstr_cstring("foobar"))); } // Searching forward: { sv = mstr_cstring("foobar"); mlib_check(mstr_find(sv, mstr_cstring("foo")), eq, 0); mlib_check(mstr_find(sv, mstr_cstring("o")), eq, 1); mlib_check(mstr_find(sv, mstr_cstring("foof")), eq, SIZE_MAX); mlib_check(mstr_find(sv, mstr_cstring("bar")), eq, 3); mlib_check(mstr_find(sv, mstr_cstring("barf")), eq, SIZE_MAX); // Start at index 3 mlib_check(mstr_find(sv, mstr_cstring("bar"), 3), eq, 3); // Starting beyond the ocurrence will fail: mlib_check(mstr_find(sv, mstr_cstring("b"), 4), eq, SIZE_MAX); // Empty string is found immediately: mlib_check(mstr_find(sv, mstr_cstring("")), eq, 0); } { // Searching for certain chars mstr_view digits = mstr_cstring("1234567890"); // The needle chars never occur, so returns SIZE_MAX mlib_check(mstr_find_first_of(mstr_cstring("foobar"), digits), eq, SIZE_MAX); // `1` at the fourth pos mlib_check(mstr_find_first_of(mstr_cstring("foo1barbaz4"), digits), eq, 3); // `1` at the fourth pos, with a trimmed window: mlib_check(mstr_find_first_of(mstr_cstring("foo1barbaz4"), digits, 3), eq, 3); // `4` is found, since we drop the `1` from the window: mlib_check(mstr_find_first_of(mstr_cstring("foo1barbaz4"), digits, 4), eq, 10); // Empty needles string is never found in any string mlib_check(mstr_find_first_of(mstr_cstring("foo bar baz"), mstr_cstring("")), eq, SIZE_MAX); // Find at the end of the string mlib_check(mstr_find_first_of(mstr_cstring("foo bar baz"), mstr_cstring("z")), eq, 10); } // Splitting { sv = mstr_cstring("foo bar baz"); mstr_view a, b; // Trim at index 3, drop one char: mstr_split_at(sv, 3, 1, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo"))); mlib_check(mstr_cmp(b, ==, mstr_cstring("bar baz"))); // Trim at index 3, default drop=0: mstr_split_at(sv, 3, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo"))); mlib_check(mstr_cmp(b, ==, mstr_cstring(" bar baz"))); // Trim past-the-end mstr_split_at(sv, 5000, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo bar baz"))); mlib_check(mstr_cmp(b, ==, mstr_cstring(""))); // Drop too many: mstr_split_at(sv, 0, 5000, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring(""))); mlib_check(mstr_cmp(b, ==, mstr_cstring(""))); // Past-the-end and also drop mstr_split_at(sv, 4000, 42, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo bar baz"))); mlib_check(mstr_cmp(b, ==, mstr_cstring(""))); // Split using a negative index mstr_split_at(sv, -4, 1, &a, &b); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo bar"))); mlib_check(mstr_cmp(b, ==, mstr_cstring("baz"))); } // Splitting around an infix { sv = mstr_cstring("foo bar baz"); mstr_view a, b; // Split around the first space const mstr_view space = mstr_cstring(" "); mlib_check(mstr_split_around(sv, space, &a, &b)); mlib_check(mstr_cmp(a, ==, mstr_cstring("foo"))); mlib_check(mstr_cmp(b, ==, mstr_cstring("bar baz"))); // Split again mlib_check(mstr_split_around(b, space, &a, &b)); mlib_check(mstr_cmp(a, ==, mstr_cstring("bar"))); mlib_check(mstr_cmp(b, ==, mstr_cstring("baz"))); // Split again. This won't find a space, but will still do something mlib_check(!mstr_split_around(b, space, &a, &b)); mlib_check(mstr_cmp(a, ==, mstr_cstring("baz"))); mlib_check(mstr_cmp(b, ==, mstr_cstring(""))); // Splitting on the final empty string does nothing mlib_check(!mstr_split_around(b, space, &a, &b)); mlib_check(mstr_cmp(a, ==, mstr_cstring(""))); mlib_check(mstr_cmp(b, ==, mstr_cstring(""))); } // Case folding { mlib_check(mlib_latin_tolower('a'), eq, 'a'); mlib_check(mlib_latin_tolower('z'), eq, 'z'); mlib_check(mlib_latin_tolower('A'), eq, 'a'); mlib_check(mlib_latin_tolower('Z'), eq, 'z'); // Other chars are unchanged: mlib_check(mlib_latin_tolower('7'), eq, '7'); mlib_check(mlib_latin_tolower('?'), eq, '?'); } // Case-insensitive compare { mlib_check(mstr_latin_casecmp(mstr_cstring("foo"), ==, mstr_cstring("foo"))); mlib_check(mstr_latin_casecmp(mstr_cstring("foo"), !=, mstr_cstring("bar"))); mlib_check(mstr_latin_casecmp(mstr_cstring("Foo"), ==, mstr_cstring("foo"))); mlib_check(mstr_latin_casecmp(mstr_cstring("Foo"), >, mstr_cstring("bar"))); // "Food" < "foo" when case-sensitive ('F' < 'f'): mlib_check(mstr_cmp(mstr_cstring("Food"), <, mstr_cstring("foo"))); // But "Food" > "foo" when case-insensitive: mlib_check(mstr_latin_casecmp(mstr_cstring("Food"), >, mstr_cstring("foo"))); } // Trimming { mstr_view s = mstr_cstring(" foo bar \n"); mlib_check(mstr_cmp(mstr_trim_left(s), ==, mstr_cstring("foo bar \n"))); mlib_check(mstr_cmp(mstr_trim_right(s), ==, mstr_cstring(" foo bar"))); mlib_check(mstr_cmp(mstr_trim(s), ==, mstr_cstring("foo bar"))); } } static inline void _test_str(void) { // Simple empty { mstr s = mstr_new(0); // Length is zero mlib_check(s.len, eq, 0); // Data is not null for empty strings, since we want a null terminator mlib_check(s.data != NULL); // The null terminator is present: mlib_check(s.data[0], eq, 0); mstr_destroy(&s); } // Simple copy of a C string { mstr s = mstr_copy_cstring("foo bar"); mlib_check(s.len, eq, 7); mlib_check(mstr_cmp(s, ==, mstr_cstring("foo bar"))); mstr_destroy(&s); } // Concat two strings { mstr s = mstr_concat(mstr_cstring("foo"), mstr_cstring("bar")); mlib_check(mstr_cmp(s, ==, mstr_cstring("foobar"))); mstr_destroy(&s); } // Append individual characters { mstr s = mstr_new(0); mstr_append_char(&s, 'f'); mstr_append_char(&s, 'o'); mstr_append_char(&s, 'o'); mlib_check(mstr_cmp(s, ==, mstr_cstring("foo"))); mstr_destroy(&s); } // Splice deletion { mstr s = mstr_copy_cstring("foo bar baz"); mlib_check(mstr_splice(&s, 4, 3, mstr_cstring(""))); mlib_check(mstr_cmp(s, ==, mstr_cstring("foo baz"))); mstr_assign(&s, mstr_cstring("foo bar baz")); mlib_check(mstr_splice(&s, 4, 3, mstr_cstring("quux"))); mlib_check(mstr_cmp(s, ==, mstr_cstring("foo quux baz"))); mstr_assign(&s, mstr_cstring("foo bar baz")); mlib_check(mstr_splice(&s, 4, 0, mstr_cstring("quux "))); mlib_check(mstr_cmp(s, ==, mstr_cstring("foo quux bar baz"))); mstr_destroy(&s); } // Replacing { mstr s = mstr_copy_cstring("abcd abcd"); mlib_check(mstr_replace(&s, mstr_cstring("b"), mstr_cstring("foo"))); mlib_check(mstr_cmp(s, ==, mstr_cstring("afoocd afoocd"))); // Try to replace where the replacement contains the needle mstr_assign(&s, mstr_cstring("foo bar baz")); mlib_check(mstr_replace(&s, mstr_cstring("bar"), mstr_cstring("foo bar baz"))); // A naive impl would explode into an infinite string, but we don't try to replace // within the already-replaced content: mlib_check(s.data, str_eq, "foo foo bar baz baz"); // Try to replace, where the needle is an empty string. mstr_assign(&s, mstr_cstring("foo")); mlib_check(mstr_replace(&s, mstr_cstring(""), mstr_cstring("bar"))); mlib_check(s.data, str_eq, "barfbarobarobar"); mstr_assign(&s, mstr_cstring("foofoofoo")); mlib_check(mstr_replace(&s, mstr_cstring("foo"), mstr_cstring("bar"))); mlib_check(s.data, str_eq, "barbarbar"); mstr_destroy(&s); } // Self-assignment/insertion { // Use `assign()` over itself mstr s = mstr_copy_cstring("foo bar baz"); mstr_assign(&s, s); mlib_check(s.data, str_eq, "foo bar baz"); // Use splice() where the insertion string overlaps the target mstr_view bar = mstr_substr(s, 4, 3); mlib_check(mstr_splice(&s, 0, 3, bar)); mlib_check(mstr_splice(&s, 8, 3, bar)); mlib_check(s.data, str_eq, "bar bar bar"); // Use replace() with a needle that points into the target mstr_replace(&s, bar, mstr_cstring("foo")); mlib_check(s.data, str_eq, "foo foo foo"); mstr_destroy(&s); } } static void _test_str_format(void) { mstr s = mstr_sprintf("foo"); mlib_check(s.len, eq, 3); mlib_check(s.data, str_eq, "foo"); mstr_sprintf_append(&s, " bar"); mlib_check(s.data, str_eq, "foo bar"); mstr_sprintf_append(&s, " %d", 123); mlib_check(s.data, str_eq, "foo bar 123"); // Attempt to format into itself: mstr_sprintf_append(&s, " hey %s", s.data); mlib_check(s.data, str_eq, "foo bar 123 hey foo bar 123"); mstr_destroy(&s); } static void _test_duration(void) { mlib_duration d = mlib_duration(); mlib_check(mlib_microseconds_count(d), eq, 0); // Creating durations with the macro name d = mlib_duration(); mlib_check(mlib_duration_cmp(d, ==, mlib_duration())); d = mlib_duration(d); mlib_check(mlib_duration_cmp(d, ==, mlib_duration())); d = mlib_duration(10, ms); mlib_check(mlib_duration_cmp(d, ==, (10, ms))); d = mlib_duration(10, us); mlib_check(mlib_duration_cmp(d, ==, (10, us))); d = mlib_duration(10, s); mlib_check(mlib_duration_cmp(d, ==, (10, s))); d = mlib_duration((10, s), mul, 3); mlib_check(mlib_duration_cmp(d, ==, (30, s))); d = mlib_duration((10, s), plus, (40, ms)); mlib_check(mlib_duration_cmp(d, ==, (10040, ms))); d = mlib_duration((10, s), div, 20); mlib_check(mlib_duration_cmp(d, ==, (500, ms))); d = mlib_duration((4, s), min, (400, ms)); mlib_check(mlib_duration_cmp(d, ==, (400, ms))); d = mlib_duration(10, mn); mlib_check(mlib_duration_cmp(d, ==, (600, s))); d = mlib_duration(4, h); mlib_check(mlib_duration_cmp(d, ==, (240, mn))); d = mlib_duration((10, s), div, 20); d = mlib_duration( // At least 5 seconds: (d, max, (5, s)), // At most 90 seconds: min, (90, s)); mlib_check(mlib_duration_cmp(d, ==, (5, s))); // Comparison mlib_check(mlib_duration_cmp(mlib_duration(4, s), mlib_duration(4, s)) == 0); mlib_check(mlib_duration_cmp(mlib_duration(4, s), mlib_duration(5, s)) < 0); mlib_check(mlib_duration_cmp(mlib_duration(4, s), mlib_duration(-5, s)) > 0); mlib_check(mlib_duration_cmp((4, s), ==, (4, s))); mlib_check(mlib_duration_cmp((4, s), <, (5, s))); mlib_check(mlib_duration_cmp((4, s), >, (-5, s))); // Overflow saturates: d = mlib_duration(mlib_maxof(mlib_duration_rep_t), s); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); d = mlib_duration(d, mul, 16); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); // Rounds toward zero d = mlib_duration(1050, ms); mlib_check(mlib_seconds_count(d), eq, 1); d = mlib_duration(-1050, ms); mlib_check(mlib_seconds_count(d), eq, -1); d = mlib_duration(1729, us); mlib_check(mlib_milliseconds_count(d), eq, 1); d = mlib_duration(-1729, us); mlib_check(mlib_milliseconds_count(d), eq, -1); d = mlib_duration((-3, s), plus, mlib_duration_min()); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_min())); d = mlib_duration((4, s), plus, mlib_duration_max()); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); d = mlib_duration((4, s), minus, (2271, ms)); mlib_check(mlib_milliseconds_count(d), eq, 1729); // Overflow saturates: d = mlib_duration((-4, ms), minus, mlib_duration_max()); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_min())); d = mlib_duration((4, ms), minus, mlib_duration_min()); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); d = mlib_duration((4, s), mul, 5); mlib_check(mlib_duration_cmp(d, ==, (20, s))); d = mlib_duration(mlib_duration_max(), mul, 2); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); d = mlib_duration(mlib_duration_max(), mul, -2); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_min())); d = mlib_duration(mlib_duration_min(), mul, 2); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_min())); d = mlib_duration(mlib_duration_min(), mul, -2); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); d = mlib_duration(mlib_duration_max(), div, -1); mlib_check(mlib_duration_cmp(d, mlib_duration()) < 0); d = mlib_duration(mlib_duration_min(), div, -1); mlib_check(mlib_duration_cmp(d, ==, mlib_duration_max())); mlib_assert_aborts () { // Division by zero d = mlib_duration(d, div, 0); } // To/from timespec struct timespec ts; ts.tv_sec = 4; ts.tv_nsec = 0; d = mlib_duration_from_timespec(ts); mlib_check(mlib_duration_cmp(d, ==, (4, s))); // ts.tv_sec = -3; ts.tv_nsec = -4000; d = mlib_duration_from_timespec(ts); mlib_check(mlib_duration_cmp(d, ==, mlib_duration((-3000004, us), plus, (0, us)))); // ts = mlib_duration_to_timespec(mlib_duration(-5000908, us)); mlib_check(ts.tv_sec, eq, -5); mlib_check(ts.tv_nsec, eq, -908000); // Test when min is defined (CDRIVER-6102) #pragma push_macro("min") #undef min #define min(a, b) ((a) > (b) ? (b) : (a)) d = mlib_duration((1, s), min, (2, s)); mlib_check(mlib_duration_cmp(d, ==, (1, s))); d = mlib_duration(3, mn); #pragma pop_macro("min") } static void _test_time_point(void) { mlib_time_point t = mlib_now(); // Offset the time point mlib_time_point later = mlib_time_add(t, (1, s)); mlib_check(mlib_time_cmp(t, <, later)); // Difference between two time points is a duration: mlib_duration diff = mlib_time_difference(later, t); mlib_check(mlib_milliseconds_count(diff), eq, 1000); // The time is only ever monotonically increasing mlib_foreach_urange (i, 10000) { (void)i; mlib_check(mlib_time_cmp(t, <=, mlib_now())); t = mlib_now(); } } static void _test_sleep(void) { mlib_time_point start = mlib_now(); int rc = mlib_sleep_for(mlib_duration(50, ms)); mlib_check(rc, eq, 0); mlib_duration t = mlib_time_difference(mlib_now(), start); mlib_check(mlib_milliseconds_count(t), gte, 45); mlib_check(mlib_milliseconds_count(t), lt, 200); // Sleeping for a negative duration returns immediately with success start = mlib_now(); mlib_check(mlib_sleep_for(-10, s), eq, 0); mlib_check(mlib_duration_cmp(mlib_elapsed_since(start), <, (100, ms))); // Sleeping until a point in the past returns immediately as well mlib_check(mlib_sleep_until(start), eq, 0); mlib_check(mlib_duration_cmp(mlib_elapsed_since(start), <, (100, ms))); } static void _test_timer(void) { mlib_timer tm = mlib_expires_after(200, ms); mlib_check(!mlib_timer_is_expired(tm)); mlib_sleep_for(250, ms); mlib_check(mlib_timer_is_expired(tm)); // Test the once-var condition bool cond = false; // Says not expired on the first call mlib_check(!mlib_timer_is_expired(tm, &cond)); mlib_check(cond); // Was set to `true` // Says it was expired on this call: mlib_check(mlib_timer_is_expired(tm, &cond)); // Try with a not-yet-expired timer cond = false; tm = mlib_expires_after(10, s); mlib_check(!mlib_timer_is_expired(tm)); mlib_check(!mlib_timer_is_expired(tm, &cond)); // cond was set to `true`, even though we are not yet expired mlib_check(cond); // Create a timer that expired in the past tm = mlib_expires_at(mlib_time_add(mlib_now(), (-10, s))); mlib_check(mlib_timer_is_expired(tm)); } // Tests for `int_vec` assert the behavior of the vector type when handling trivial // elements. #define T int #include static void _test_int_vec(void) { int_vec ints = int_vec_new(); mlib_check(ints.size, eq, 0, because, "Initial vector is empty"); // Append an element int *el; mlib_check((el = int_vec_push(&ints))); *el = 42; mlib_check(int_vec_begin(&ints)[0], eq, 42); mlib_check(ints.size, eq, 1); int_vec_erase_at(&ints, 0); mlib_check(ints.size, eq, 0, because, "We are back to an empty vector"); *int_vec_push(&ints) = 42; *int_vec_push(&ints) = 1729; *int_vec_push(&ints) = 123456; *int_vec_push(&ints) = -7; mlib_check(ints.size, eq, 4, because, "We added four elements from empty"); mlib_check(mlib_vec_at(ints, -1), eq, -7, because, "Negative index wraps"); // Erase in the middle int_vec_erase(&ints, ints.data + 1, ints.data + 3); mlib_check(ints.size, eq, 2, because, "We erased two elements"); mlib_check(mlib_vec_at(ints, 1), eq, -7, because, "We erased, so the back elements shifted down"); mlib_check(mlib_vec_at(ints, -1), eq, -7, because, "-7 is still the last element"); int_vec_destroy(&ints); } #define T char * #define VecName cstring_vec #define VecDestroyElement(CStrPtr) ((free(*CStrPtr), *CStrPtr = NULL)) #define VecCopyElement(Dst, Src) ((*Dst = strdup(*Src))) #include static void _test_cstring_vec(void) { // Simple new and destroy { cstring_vec v = cstring_vec_new(); mlib_check(v.size, eq, 0); mlib_check(v.capacity, eq, 0); cstring_vec_destroy(&v); } // Simple new and push an element { cstring_vec v = cstring_vec_new(); *cstring_vec_push(&v) = strdup("Hey"); mlib_check(v.size, eq, 1); mlib_check(v.capacity, eq, 1); mlib_check(cstring_vec_begin(&v)[0], str_eq, "Hey"); cstring_vec_destroy(&v); } // Copy an empty { cstring_vec v = cstring_vec_new(); cstring_vec b; cstring_vec_init_copy(&b, &v); cstring_vec_destroy(&v); cstring_vec_destroy(&b); } // Copy non-empty { cstring_vec a = cstring_vec_new(); *cstring_vec_push(&a) = strdup("Hello"); *cstring_vec_push(&a) = strdup("world!"); mlib_check(a.size, eq, 2); mlib_check(a.capacity, eq, 2); cstring_vec b; mlib_check(cstring_vec_init_copy(&b, &a)); mlib_check(a.size, eq, 2); mlib_check(a.capacity, eq, 2); mlib_check(cstring_vec_begin(&a)[0], str_eq, "Hello"); mlib_check(cstring_vec_begin(&b)[1], str_eq, "world!"); cstring_vec_destroy(&b); cstring_vec_destroy(&a); } } void test_mlib_install(TestSuite *suite) { TestSuite_Add(suite, "/mlib/checks", _test_checks); TestSuite_Add(suite, "/mlib/intutil/bits", _test_bits); TestSuite_Add(suite, "/mlib/intutil/minmax", _test_minmax); TestSuite_Add(suite, "/mlib/intutil/upsize", _test_upsize); TestSuite_Add(suite, "/mlib/cmp", _test_cmp); TestSuite_Add(suite, "/mlib/in-range", _test_in_range); TestSuite_Add(suite, "/mlib/assert-aborts", _test_assert_aborts); TestSuite_Add(suite, "/mlib/int-encoding", _test_int_encoding); TestSuite_Add(suite, "/mlib/int-parse", _test_int_parse); TestSuite_Add(suite, "/mlib/foreach", _test_foreach); TestSuite_Add(suite, "/mlib/check-cast", _test_cast); TestSuite_Add(suite, "/mlib/ckdint-partial", _test_ckdint_partial); TestSuite_Add(suite, "/mlib/str_view", _test_str_view); TestSuite_Add(suite, "/mlib/str", _test_str); TestSuite_Add(suite, "/mlib/str-format", _test_str_format); TestSuite_Add(suite, "/mlib/duration", _test_duration); TestSuite_Add(suite, "/mlib/time_point", _test_time_point); TestSuite_Add(suite, "/mlib/sleep", _test_sleep); TestSuite_Add(suite, "/mlib/timer", _test_timer); TestSuite_Add(suite, "/mlib/int-vector", _test_int_vec); TestSuite_Add(suite, "/mlib/string-vector", _test_cstring_vec); } mlib_diagnostic_pop(); mongo-c-driver-2.2.1/src/cpp-check.cpp000066400000000000000000000002571511661753600175130ustar00rootroot00000000000000/** * The sole purpose of this file is to check that the mongoc headers can be * included in a C++ file without error. */ #include #include mongo-c-driver-2.2.1/src/kms-message/000077500000000000000000000000001511661753600173625ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/.gitattributes000066400000000000000000000000151511661753600222510ustar00rootroot00000000000000*.bin binary mongo-c-driver-2.2.1/src/kms-message/CMakeLists.txt000066400000000000000000000236561511661753600221360ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) project (kms_message VERSION 0.0.1 LANGUAGES C ) set (CMAKE_C_STANDARD 99) include (CheckCCompilerFlag) set (CMAKE_C_VISIBILITY_PRESET hidden) set (KMS_MESSAGE_SOURCES src/kms_b64.c src/kms_message/kms_b64.h src/hexlify.c src/hexlify.h src/kms_azure_request.c src/kms_crypto.h src/kms_crypto_none.c src/kms_crypto_windows.c src/kms_crypto_apple.c src/kms_crypto_libcrypto.c src/kms_caller_identity_request.c src/kms_decrypt_request.c src/kms_encrypt_request.c src/kms_gcp_request.c src/kms_kmip_reader_writer.c src/kms_kmip_request.c src/kms_kmip_response.c src/kms_kmip_response_parser.c src/kms_kv_list.c src/kms_kv_list.h src/kms_message.c src/kms_port.c src/kms_message/kms_azure_request.h src/kms_message/kms_caller_identity_request.h src/kms_message/kms_decrypt_request.h src/kms_message/kms_encrypt_request.h src/kms_message/kms_gcp_request.h src/kms_message/kms_message.h src/kms_message/kms_request.h src/kms_message/kms_request_opt.h src/kms_message/kms_response.h src/kms_message/kms_response_parser.h src/kms_request.c src/kms_request_opt.c src/kms_request_opt_private.h src/kms_request_str.c src/kms_request_str.h src/kms_response.c src/kms_response_parser.c src/sort.c ) if (DISABLE_NATIVE_CRYPTO) # Nothing elseif (WIN32) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_CNG") elseif (APPLE) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO") else() set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_ENABLE_CRYPTO" "KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO") endif() include (CheckSymbolExists) CHECK_SYMBOL_EXISTS (gmtime_r time.h KMS_MESSAGE_HAVE_GMTIME_R) if (KMS_MESSAGE_HAVE_GMTIME_R) set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_HAVE_GMTIME_R") endif () include (TestBigEndian) TEST_BIG_ENDIAN (KMS_BIG_ENDIAN) if (KMS_BIG_ENDIAN) message ("Detected byte order: big endian") set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_BIG_ENDIAN") else () message ("Detected byte order: little endian") set (KMS_MESSAGE_DEFINITIONS ${KMS_MESSAGE_DEFINITIONS} "KMS_MESSAGE_LITTLE_ENDIAN") endif () add_library ( kms_message SHARED ${KMS_MESSAGE_SOURCES} ) add_library ( kms_message_static STATIC ${KMS_MESSAGE_SOURCES} ) string(FIND "${CMAKE_C_FLAGS}" "-fPIC" FPIC_LOCATION) if (NOT WIN32 AND ENABLE_PIC AND "${FPIC_LOCATION}" EQUAL "-1") set_property (TARGET kms_message_static PROPERTY POSITION_INDEPENDENT_CODE TRUE) message ("Adding -fPIC to compilation of kms_message_static components") endif () add_library ( kms_message_obj OBJECT ${KMS_MESSAGE_SOURCES} ) target_compile_definitions (kms_message_obj PRIVATE ${KMS_MESSAGE_DEFINITIONS}) if (NOT DISABLE_NATIVE_CRYPTO) if (WIN32) target_link_libraries(kms_message "bcrypt" "crypt32") target_link_libraries(kms_message_static "bcrypt" "crypt32") elseif (APPLE) target_link_libraries (kms_message "-framework Security -framework CoreFoundation") target_link_libraries (kms_message_static "-framework Security -framework CoreFoundation") else() include (FindOpenSSL) target_link_libraries(kms_message "${OPENSSL_LIBRARIES}") target_include_directories(kms_message SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") target_link_libraries(kms_message_static "${OPENSSL_LIBRARIES}") target_include_directories(kms_message_static SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") endif() endif () if ( CMAKE_COMPILER_IS_GNUCC ) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wno-unused-function -Wsign-compare") endif() if ( MSVC ) # W4273 - inconsistent dll linkage # W4996 - POSIX name for this item is deprecated set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4273 /wd4996 /D_CRT_SECURE_NO_WARNINGS") endif() set_target_properties (kms_message PROPERTIES SOVERSION 0 VERSION "0.0.0" OUTPUT_NAME "kms_message" ) set_target_properties (kms_message_static PROPERTIES SOVERSION 0 VERSION "0.0.0" OUTPUT_NAME "kms_message-static" ) target_compile_definitions (kms_message PRIVATE KMS_MSG_COMPILATION) target_compile_definitions (kms_message PRIVATE ${KMS_MESSAGE_DEFINITIONS}) set_property (TARGET kms_message APPEND PROPERTY COMPATIBLE_INTERFACE_STRING kms_message_MAJOR_VERSION ) target_compile_definitions (kms_message_static PRIVATE KMS_MSG_COMPILATION) target_compile_definitions (kms_message_static PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_compile_definitions (kms_message_static PUBLIC KMS_MSG_STATIC) set_property (TARGET kms_message_static APPEND PROPERTY COMPATIBLE_INTERFACE_STRING kms_message_MAJOR_VERSION ) include (CMakePackageConfigHelpers) if (ENABLE_STATIC) set (TARGETS_TO_INSTALL kms_message kms_message_static) else () set (TARGETS_TO_INSTALL kms_message) endif () install ( TARGETS ${TARGETS_TO_INSTALL} EXPORT kms_message_targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install ( FILES src/kms_message/kms_azure_request.h src/kms_message/kms_b64.h src/kms_message/kms_caller_identity_request.h src/kms_message/kms_decrypt_request.h src/kms_message/kms_encrypt_request.h src/kms_message/kms_gcp_request.h src/kms_message/kms_message.h src/kms_message/kms_message_defines.h src/kms_message/kms_kmip_request.h src/kms_message/kms_kmip_response.h src/kms_message/kms_kmip_response_parser.h src/kms_message/kms_request.h src/kms_message/kms_request_opt.h src/kms_message/kms_response.h src/kms_message/kms_response_parser.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/kms_message COMPONENT Devel ) include (CMakePackageConfigHelpers) write_basic_package_version_file ( "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config-version.cmake" VERSION 0.0.1 COMPATIBILITY AnyNewerVersion ) export (EXPORT kms_message_targets NAMESPACE mongo:: FILE "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message_targets.cmake" ) configure_file (cmake/kms_message-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config.cmake" COPYONLY ) set (ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/kms_message) install (EXPORT kms_message_targets NAMESPACE mongo:: FILE kms_message_targets.cmake DESTINATION ${ConfigPackageLocation} ) install ( FILES cmake/kms_message-config.cmake "${CMAKE_CURRENT_BINARY_DIR}/kms_message/kms_message-config-version.cmake" DESTINATION ${ConfigPackageLocation} COMPONENT Devel ) # pkg-config. set (PKG_CONFIG_LIBDIR "\${prefix}/${CMAKE_INSTALL_LIBDIR}") set (PKG_CONFIG_INCLUDEDIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") set (PKG_CONFIG_LIBS "-L\${libdir} -lkms_message") set (PKG_CONFIG_CFLAGS "-I\${includedir}") configure_file ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libkms_message.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libkms_message.pc" ) install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/libkms_message.pc" DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) # cannot run tests without crypto if (NOT DISABLE_NATIVE_CRYPTO) add_executable ( test_kms_request ${KMS_MESSAGE_SOURCES} test/test_kms_request.c test/test_kmip_reader_writer.c test/test_kms_util.c test/test_kms_kmip_request.c test/test_kms_kmip_response_parser.c test/test_kms_kmip_response.c ) target_include_directories(test_kms_request PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_request PRIVATE ${KMS_MESSAGE_DEFINITIONS}) if (WIN32) target_link_libraries(test_kms_request "bcrypt" "crypt32") elseif (APPLE) target_link_libraries (test_kms_request "-framework Security -framework CoreFoundation") else() include (FindOpenSSL) target_link_libraries(test_kms_request "${OPENSSL_LIBRARIES}") target_include_directories(test_kms_request SYSTEM PRIVATE "${OPENSSL_INCLUDE_DIR}") endif() add_test ( NAME test_kms_request COMMAND test_kms_request WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) endif () # build online_tests if OpenSSL is available (to create TLS connections). if(DISABLE_NATIVE_CRYPTO) message ("test_kms_azure_online target disabled: Not building with native crypto.") elseif(ENABLE_ONLINE_TESTS) add_executable(test_kms_azure_online test/test_kms_azure_online.c test/test_kms_util.c test/test_kms_online_util.c) target_include_directories(test_kms_azure_online PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_azure_online PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_link_libraries(test_kms_azure_online _mongocrypt::mongoc) target_link_libraries(test_kms_azure_online kms_message_static) add_test ( NAME test_kms_azure_online COMMAND test_kms_azure_online WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) add_executable(test_kms_gcp_online test/test_kms_gcp_online.c test/test_kms_util.c test/test_kms_online_util.c) target_include_directories(test_kms_gcp_online PRIVATE ${PROJECT_SOURCE_DIR}/src) target_compile_definitions(test_kms_gcp_online PRIVATE ${KMS_MESSAGE_DEFINITIONS}) target_link_libraries(test_kms_gcp_online _mongocrypt::mongoc) target_link_libraries(test_kms_gcp_online kms_message_static) add_test ( NAME test_kms_gcp_online COMMAND test_kms_gcp_online WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) set_tests_properties ( test_kms_gcp_online test_kms_azure_online PROPERTIES SKIP_REGULAR_EXPRESSION "@@ctest-skip@@" # Older CMake (<3.16) does not support skipping via regex, so we'll use the # less-expressive skip-retcode. SKIP_RETURN_CODE 2 ) endif () mongo-c-driver-2.2.1/src/kms-message/COPYING000066400000000000000000000236761511661753600204330ustar00rootroot00000000000000 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 mongo-c-driver-2.2.1/src/kms-message/README.md000066400000000000000000000041171511661753600206440ustar00rootroot00000000000000# kms-message Library used to generate requests for: - Amazon Web Services Key Management Service (KMS) - Azure Key Vault This library is *not* a complete implementation of a KMS client, it only implements the request format. ## Testing kms-message - `test_kms_request` tests HTTP request generation and response parsing, but does not require internet or use any live servers. - `test_kms_azure_online` makes live requests, and has additional requirements (must have working credentials). ### Requirements - A complete installation of the C driver. (libbson is needed for parsing JSON, and libmongoc is used for creating TLS streams). See the [C Driver Manual](https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/tutorials/obtaining-libraries/) for installation instructions. For macOS, `brew install mongo-c-driver` will suffice. - An Azure key vault, and a service principal with an access policy allowing encrypt / decrypt key operations. The following environment variables must be set: - AZURE_TENANT_ID - AZURE_CLIENT_ID - AZURE_CLIENT_SECRET - AZURE_KEY_URL (e.g. `https://key-vault-kevinalbs.vault.azure.net/keys/test-key/9e1159e6ee5b447ba17e850b779bf652`) ### Building Configure and build with cmake: ``` mkdir cmake-build cd cmake-build cmake .. cmake --build . --target all ``` If the C driver is installed in a non-default location, specify the location with `-DCMAKE_PREFIX_PATH=...`. To build tests with verbose (and insecure) tracing, define `TEST_TRACING_INSECURE` in compiler flags by specifying `-DCMAKE_C_FLAGS="-DTEST_TRACING_INSECURE"` on cmake configuration. Recommended: compile tests with address sanitizer (use a relatively new gcc / clang compiler) by specifying `-fsanitize=address` in the C flags. This can be done by specifygin `-DCMAKE_C_FLAGS="-fsanitize=address"` as an option to cmake. Enable leak detection with the environment variable `ASAN_OPTIONS='detect_leaks=1'. Example: ``` cd cmake-build cmake -DCMAKE_C_FLAGS="-fsanitize=address -DTEST_TRACING_INSECURE" export ASAN_OPTIONS='detect_leaks=1' ./cmake-build/kms-message/test_kms_azure_online ``` mongo-c-driver-2.2.1/src/kms-message/THIRD_PARTY_NOTICES000066400000000000000000000042751511661753600223320ustar00rootroot00000000000000License notice for kms_b64.c ------------------------------------------------------------------------------- ISC License Copyright: 1996, 1998 Internet Software Consortium 1995 International Business Machines, Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Portions Copyright (c) 1995 by International Business Machines, Inc. International Business Machines, Inc. (hereinafter called IBM) grants permission under its copyrights to use, copy, modify, and distribute this Software with or without fee, provided that the above copyright notice and all paragraphs of this notice appear in all copies, and that the name of IBM not be used in connection with the marketing of any product incorporating the Software or modifications thereof, without specific, written prior permission. To the extent it has a right to do so, IBM grants an immunity from suit under its patents, if any, for the use, sale or manufacture of products to the extent that such products are used for performing Domain Name System dynamic updates in TCP/IP networks by means of the Software. No immunity is granted for any product per se or for any other function of any product. THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/000077500000000000000000000000001511661753600233675ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/LICENSE000077500000000000000000000261361511661753600244070ustar00rootroot00000000000000 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. mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/NOTICE000077500000000000000000000001531511661753600242750ustar00rootroot00000000000000AWS Signature Version 4 Test Suite Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicate/000077500000000000000000000000001511661753600301325ustar00rootroot00000000000000get-header-key-duplicate.authz000077500000000000000000000003051511661753600356740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138eaget-header-key-duplicate.creq000077500000000000000000000002721511661753600354760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / host:example.amazonaws.com my-header1:value2,value2,value1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-key-duplicate.req000077500000000000000000000001731511661753600353330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value2 My-Header1:value2 My-Header1:value1 X-Amz-Date:20150830T123600Zget-header-key-duplicate.sreq000077500000000000000000000005201511661753600355120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value2 My-Header1:value2 My-Header1:value1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138eaget-header-key-duplicate.sts000077500000000000000000000002121511661753600353470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-key-duplicateAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request dc7f04a3abfde8d472b0ab1a418b741b7c67174dad1551b4117b15527fbe966cmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multiline/000077500000000000000000000000001511661753600305065ustar00rootroot00000000000000get-header-value-multiline.authz000077500000000000000000000003051511661753600366240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=ba17b383a53190154eb5fa66a1b836cc297cc0a3d70a5d00705980573d8ff790get-header-value-multiline.creq000077500000000000000000000002721511661753600364260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / host:example.amazonaws.com my-header1:value1,value2,value3 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-multiline.req000077500000000000000000000001541511661753600362620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 value2 value3 X-Amz-Date:20150830T123600Zget-header-value-multiline.sreq000077500000000000000000000005011511661753600364410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 value2 value3 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=ba17b383a53190154eb5fa66a1b836cc297cc0a3d70a5d00705980573d8ff790get-header-value-multiline.sts000077500000000000000000000002121511661753600362770ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-multilineAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request b7b6cbfd8a0430b78891e986784da2630c8a135a8595cec25b26ea94f926ee55mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-order/000077500000000000000000000000001511661753600276175ustar00rootroot00000000000000get-header-value-order.authz000077500000000000000000000003051511661753600350460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01get-header-value-order.creq000077500000000000000000000003011511661753600346410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / host:example.amazonaws.com my-header1:value4,value1,value3,value2 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-order.req000077500000000000000000000002151511661753600345020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value4 My-Header1:value1 My-Header1:value3 My-Header1:value2 X-Amz-Date:20150830T123600Zget-header-value-order.sreq000077500000000000000000000005421511661753600346700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderGET / HTTP/1.1 Host:example.amazonaws.com My-Header1:value4 My-Header1:value1 My-Header1:value3 My-Header1:value2 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01get-header-value-order.sts000077500000000000000000000002121511661753600345210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-orderAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 31ce73cd3f3d9f66977ad3dd957dc47af14df92fcd8509f59b349e9137c58b86mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trim/000077500000000000000000000000001511661753600274575ustar00rootroot00000000000000get-header-value-trim.authz000077500000000000000000000003201511661753600345430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736get-header-value-trim.creq000077500000000000000000000003121511661753600343430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / host:example.amazonaws.com my-header1:value1 my-header2:"a b c" x-amz-date:20150830T123600Z host;my-header1;my-header2;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-header-value-trim.req000077500000000000000000000001601511661753600342010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / HTTP/1.1 Host:example.amazonaws.com My-Header1: value1 My-Header2: "a b c" X-Amz-Date:20150830T123600Zget-header-value-trim.sreq000077500000000000000000000005201511661753600343640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimGET / HTTP/1.1 Host:example.amazonaws.com My-Header1: value1 My-Header2: "a b c" X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736get-header-value-trim.sts000077500000000000000000000002121511661753600342210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-header-value-trimAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request a726db9b0df21c14f559d0a978e563112acb1b9e05476f0a6a1c7d68f28605c7mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/000077500000000000000000000000001511661753600263265ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.authz000077500000000000000000000002721511661753600323460ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24fmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.creq000077500000000000000000000003211511661753600321400ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.req000077500000000000000000000002071511661753600320000ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.sreq000077500000000000000000000005211511661753600321620ustar00rootroot00000000000000GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24fmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-unreserved/get-unreserved.sts000077500000000000000000000002121511661753600320160ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 6a968768eefaa713e2a6b16b589a8ea192661f098f37349f4e2c0082757446f9mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/000077500000000000000000000000001511661753600250325ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.authz000077500000000000000000000002721511661753600275560ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.creq000077500000000000000000000002301511661753600273470ustar00rootroot00000000000000GET /%E1%88%B4 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.req000077500000000000000000000001101511661753600272010ustar00rootroot00000000000000GET /ሴ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.sreq000077500000000000000000000004221511661753600273720ustar00rootroot00000000000000GET /ሴ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-utf8/get-utf8.sts000077500000000000000000000002121511661753600272260ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 2a0a97d02205e45ce2e994789806b19270cfbbb0921b278ccf58f5249ac42102mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-key/000077500000000000000000000000001511661753600306575ustar00rootroot00000000000000get-vanilla-empty-query-key.authz000077500000000000000000000002721511661753600371510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aebget-vanilla-empty-query-key.creq000077500000000000000000000002341511661753600367460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-empty-query-key.req000077500000000000000000000001231511661753600366000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-empty-query-key.sreq000077500000000000000000000004351511661753600367710ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyGET /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aebget-vanilla-empty-query-key.sts000077500000000000000000000002121511661753600366210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-empty-query-keyAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 1e24db194ed7d0eec2de28d7369675a243488e08526e8c1c73571282f7c517abmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-case/000077500000000000000000000000001511661753600315455ustar00rootroot00000000000000get-vanilla-query-order-key-case.authz000077500000000000000000000002721511661753600407250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500get-vanilla-query-order-key-case.creq000077500000000000000000000002521511661753600405220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET / Param1=value1&Param2=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-key-case.req000077500000000000000000000001411511661753600403540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-key-case.sreq000077500000000000000000000004531511661753600405450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseGET /?Param2=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500get-vanilla-query-order-key-case.sts000077500000000000000000000002121511661753600403750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-key/000077500000000000000000000000001511661753600306345ustar00rootroot00000000000000get-vanilla-query-order-key.authz000077500000000000000000000002721511661753600371030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=eedbc4e291e521cf13422ffca22be7d2eb8146eecf653089df300a15b2382bd1get-vanilla-query-order-key.creq000077500000000000000000000002521511661753600367000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET / Param1=Value1&Param1=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-key.req000077500000000000000000000001411511661753600365320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET /?Param1=value2&Param1=Value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-key.sreq000077500000000000000000000004531511661753600367230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyGET /?Param1=value2&Param1=Value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=eedbc4e291e521cf13422ffca22be7d2eb8146eecf653089df300a15b2382bd1get-vanilla-query-order-key.sts000077500000000000000000000002121511661753600365530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-keyAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 704b4cef673542d84cdff252633f065e8daeba5f168b77116f8b1bcaf3d38f89mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-value/000077500000000000000000000000001511661753600311605ustar00rootroot00000000000000get-vanilla-query-order-value.authz000077500000000000000000000002721511661753600377530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5772eed61e12b33fae39ee5e7012498b51d56abc0abb7c60486157bd471c4694get-vanilla-query-order-value.creq000077500000000000000000000002521511661753600375500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET / Param1=value1&Param1=value2 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-order-value.req000077500000000000000000000001411511661753600374020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET /?Param1=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-order-value.sreq000077500000000000000000000004531511661753600375730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueGET /?Param1=value2&Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5772eed61e12b33fae39ee5e7012498b51d56abc0abb7c60486157bd471c4694get-vanilla-query-order-value.sts000077500000000000000000000002121511661753600374230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-order-valueAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c968629d70850097a2d8781c9bf7edcb988b04cac14cca9be4acc3595f884606mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreserved/000077500000000000000000000000001511661753600311155ustar00rootroot00000000000000get-vanilla-query-unreserved.authz000077500000000000000000000002721511661753600376450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197get-vanilla-query-unreserved.creq000077500000000000000000000004241511661753600374430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET / -._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-query-unreserved.req000077500000000000000000000003131511661753600372750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-query-unreserved.sreq000077500000000000000000000006251511661753600374660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedGET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197get-vanilla-query-unreserved.sts000077500000000000000000000002121511661753600373150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query-unreservedAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c30d4703d9f799439be92736156d47ccfb2d879ddf56f5befa6d1d6aab979177mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/000077500000000000000000000000001511661753600267355ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.authz000077500000000000000000000002721511661753600333640ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.creq000077500000000000000000000002171511661753600331620ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.req000077500000000000000000000001051511661753600330130ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.sreq000077500000000000000000000004171511661753600332040ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-query/get-vanilla-query.sts000077500000000000000000000002121511661753600330340ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-query/000077500000000000000000000000001511661753600276215ustar00rootroot00000000000000get-vanilla-utf8-query.authz000077500000000000000000000002721511661753600350550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04get-vanilla-utf8-query.creq000077500000000000000000000002341511661753600346520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET / %E1%88%B4=bar host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-vanilla-utf8-query.req000077500000000000000000000001151511661753600345050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET /?ሴ=bar HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-vanilla-utf8-query.sreq000077500000000000000000000004271511661753600346760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryGET /?ሴ=bar HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04get-vanilla-utf8-query.sts000077500000000000000000000002121511661753600345250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla-utf8-queryAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request eb30c5bed55734080471a834cc727ae56beb50e5f39d1bff6d0d38cb192a7073mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/000077500000000000000000000000001511661753600255725ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.authz000077500000000000000000000002721511661753600310560ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.creq000077500000000000000000000002171511661753600306540ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.req000077500000000000000000000001051511661753600305050ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.sreq000077500000000000000000000004171511661753600306760ustar00rootroot00000000000000GET / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/get-vanilla/get-vanilla.sts000077500000000000000000000002121511661753600305260ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/000077500000000000000000000000001511661753600263215ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relative/000077500000000000000000000000001511661753600325225ustar00rootroot00000000000000get-relative-relative.authz000077500000000000000000000002721511661753600377250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative-relative.creq000077500000000000000000000002171511661753600375230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-relative-relative.req000077500000000000000000000001341511661753600373560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET /example1/example2/../.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-relative-relative.sreq000077500000000000000000000004461511661753600375470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeGET /example1/example2/../.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative-relative.sts000077500000000000000000000002121511661753600373750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative-relativeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relative/000077500000000000000000000000001511661753600307115ustar00rootroot00000000000000get-relative.authz000077500000000000000000000002721511661753600343030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative.creq000077500000000000000000000002171511661753600341010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-relative.req000077500000000000000000000001171511661753600337350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET /example/.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-relative.sreq000077500000000000000000000004311511661753600341170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeGET /example/.. HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-relative.sts000077500000000000000000000002121511661753600337530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-relativeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slash/000077500000000000000000000000001511661753600321045ustar00rootroot00000000000000get-slash-dot-slash.authz000077500000000000000000000002721511661753600366710ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-slash-dot-slash.creq000077500000000000000000000002171511661753600364670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slash-dot-slash.req000077500000000000000000000001071511661753600363220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET /./ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slash-dot-slash.sreq000077500000000000000000000004211511661753600365040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashGET /./ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31get-slash-dot-slash.sts000077500000000000000000000002121511661753600363410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-dot-slashAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dot/000077500000000000000000000000001511661753600330125ustar00rootroot00000000000000get-slash-pointless-dot.authz000077500000000000000000000002721511661753600405050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5get-slash-pointless-dot.creq000077500000000000000000000002261511661753600403030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /example host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slash-pointless-dot.req000077500000000000000000000001161511661753600401360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /./example HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slash-pointless-dot.sreq000077500000000000000000000004301511661753600403200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotGET /./example HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5get-slash-pointless-dot.sts000077500000000000000000000002121511661753600401550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash-pointless-dotAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 214d50c111a8edc4819da6a636336472c916b5240f51e9a51b5c3305180cf702mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/000077500000000000000000000000001511661753600302105ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.authz000077500000000000000000000002721511661753600331600ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.creq000077500000000000000000000002171511661753600327560ustar00rootroot00000000000000GET / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.req000077500000000000000000000001061511661753600326100ustar00rootroot00000000000000GET // HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.sreq000077500000000000000000000004201511661753600327720ustar00rootroot00000000000000GET // HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slash/get-slash.sts000077500000000000000000000002121511661753600326300ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request bb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashes/000077500000000000000000000000001511661753600305405ustar00rootroot00000000000000get-slashes.authz000077500000000000000000000002721511661753600337610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84get-slashes.creq000077500000000000000000000002271511661753600335600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET /example/ host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855get-slashes.req000077500000000000000000000001171511661753600334130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET //example// HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zget-slashes.sreq000077500000000000000000000004311511661753600335750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesGET //example// HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84get-slashes.sts000077500000000000000000000002121511661753600334310ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-slashesAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request cb96b4ac96d501f7c5c15bc6d67b3035061cfced4af6585ad927f7e6c985c015mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/000077500000000000000000000000001511661753600301715ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.authz000077500000000000000000000002721511661753600331220ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.creq000077500000000000000000000002371511661753600327220ustar00rootroot00000000000000GET /example%20space/ host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.req000077500000000000000000000001231511661753600325510ustar00rootroot00000000000000GET /example space/ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.sreq000077500000000000000000000004351511661753600327420ustar00rootroot00000000000000GET /example space/ HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/get-space/get-space.sts000077500000000000000000000002121511661753600325720ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 63ee75631ed7234ae61b5f736dfc7754cdccfedbff4b5128a915706ee9390d86mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/normalize-path/normalize-path.txt000077500000000000000000000010071511661753600320150ustar00rootroot00000000000000A note about signing requests to Amazon S3: In exception to this, you do not normalize URI paths for requests to Amazon S3. For example, if you have a bucket with an object named my-object//example//photo.user, use that path. Normalizing the path to my-object/example/photo.user will cause the request to fail. For more information, see Task 1: Create a Canonical Request in the Amazon Simple Storage Service API Reference: http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html#canonical-requestmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-case/000077500000000000000000000000001511661753600273015ustar00rootroot00000000000000post-header-key-case.authz000077500000000000000000000002721511661753600342150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-header-key-case.creq000077500000000000000000000002201511661753600340050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-key-case.req000077500000000000000000000001061511661753600336450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-header-key-case.sreq000077500000000000000000000004201511661753600340270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-casePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-header-key-case.sts000077500000000000000000000002121511661753600336650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sort/000077500000000000000000000000001511661753600273555ustar00rootroot00000000000000post-header-key-sort.authz000077500000000000000000000003051511661753600343420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852cpost-header-key-sort.creq000077500000000000000000000002551511661753600341450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / host:example.amazonaws.com my-header1:value1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-key-sort.req000077500000000000000000000001301511661753600337720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 X-Amz-Date:20150830T123600Zpost-header-key-sort.sreq000077500000000000000000000004551511661753600341670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortPOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:value1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852cpost-header-key-sort.sts000077500000000000000000000002121511661753600340150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-key-sortAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9368318c2967cf6de74404b30c65a91e8f6253e0a8659d6d5319f1a812f87d65mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-case/000077500000000000000000000000001511661753600276255ustar00rootroot00000000000000post-header-value-case.authz000077500000000000000000000003051511661753600350620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-caseAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7dpost-header-value-case.creq000077500000000000000000000002551511661753600346650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / host:example.amazonaws.com my-header1:VALUE1 x-amz-date:20150830T123600Z host;my-header1;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-header-value-case.req000077500000000000000000000001301511661753600345120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:VALUE1 X-Amz-Date:20150830T123600Zpost-header-value-case.sreq000077500000000000000000000004551511661753600347070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-casePOST / HTTP/1.1 Host:example.amazonaws.com My-Header1:VALUE1 X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7dpost-header-value-case.sts000077500000000000000000000002121511661753600345350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-header-value-caseAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request d51ced243e649e3de6ef63afbbdcbca03131a21a7103a1583706a64618606a93mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/000077500000000000000000000000001511661753600263015ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-after/000077500000000000000000000000001511661753600324225ustar00rootroot00000000000000post-sts-header-after.authz000077500000000000000000000002721511661753600375450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-sts-header-after.creq000077500000000000000000000002201511661753600373350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-sts-header-after.req000077500000000000000000000001061511661753600371750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-sts-header-after.sreq000077500000000000000000000011661511661753600373670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterPOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bpost-sts-header-after.sts000077500000000000000000000002121511661753600372150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-afterAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-before/000077500000000000000000000000001511661753600325635ustar00rootroot00000000000000post-sts-header-before.authz000077500000000000000000000003171511661753600400470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforeAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05eadpost-sts-header-before.creq000077500000000000000000000010131511661753600376400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / host:example.amazonaws.com x-amz-date:20150830T123600Z x-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== host;x-amz-date;x-amz-security-token e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-sts-header-before.req000077500000000000000000000006541511661753600375070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==post-sts-header-before.sreq000077500000000000000000000012131511661753600376620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforePOST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA== Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05eadpost-sts-header-before.sts000077500000000000000000000002121511661753600375170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/post-sts-header-beforeAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request c237e1b440d4c63c32ca95b5b99481081cb7b13c7e40434868e71567c1a882f6mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-sts-token/readme.txt000077500000000000000000000026361511661753600303110ustar00rootroot00000000000000A note about using temporary security credentials: You can use temporary security credentials provided by the AWS Security Token Service (AWS STS) to sign a request. The process is the same as using long-term credentials but requires an additional HTTP header or query string parameter for the security token. The name of the header or query string parameter is X-Amz-Security-Token, and the value is the session token (the string that you received from AWS STS when you obtained temporary security credentials). When you add X-Amz-Security-Token, some services require that you include this parameter in the canonical (signed) request. For other services, you add this parameter at the end, after you calculate the signature. For details see the API reference documentation for that service. The test suite has 2 examples: post-sts-header-before - The X-Amz-Security-Token header is part of the canonical request. post-sts-header-after - The X-Amz-Security-Token header is added to the request after you calculate the signature. The test suite uses this example value for X-Amz-Security-Token: AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-value/000077500000000000000000000000001511661753600314115ustar00rootroot00000000000000post-vanilla-empty-query-value.authz000077500000000000000000000002721511661753600404350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valueAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-empty-query-value.creq000077500000000000000000000002351511661753600402330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855post-vanilla-empty-query-value.req000077500000000000000000000001241511661753600400650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-vanilla-empty-query-value.sreq000077500000000000000000000004361511661753600402560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valuePOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-empty-query-value.sts000077500000000000000000000002121511661753600401050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-empty-query-valueAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbdmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-query/000077500000000000000000000000001511661753600271435ustar00rootroot00000000000000post-vanilla-query.authz000077500000000000000000000002721511661753600337210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11post-vanilla-query.creq000077500000000000000000000002351511661753600335170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryPOST / Param1=value1 host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-query/post-vanilla-query.req000077500000000000000000000001241511661753600334300ustar00rootroot00000000000000POST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zpost-vanilla-query.sreq000077500000000000000000000004361511661753600335420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-queryPOST /?Param1=value1 HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla-query/post-vanilla-query.sts000077500000000000000000000002121511661753600334500ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbdmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/000077500000000000000000000000001511661753600260005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.authz000077500000000000000000000002721511661753600314720ustar00rootroot00000000000000AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.creq000077500000000000000000000002201511661753600312620ustar00rootroot00000000000000POST / host:example.amazonaws.com x-amz-date:20150830T123600Z host;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.req000077500000000000000000000001061511661753600311220ustar00rootroot00000000000000POST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Zmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.sreq000077500000000000000000000004201511661753600313040ustar00rootroot00000000000000POST / HTTP/1.1 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6bmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-vanilla/post-vanilla.sts000077500000000000000000000002121511661753600311420ustar00rootroot00000000000000AWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parameters/000077500000000000000000000000001511661753600326675ustar00rootroot00000000000000post-x-www-form-urlencoded-parameters.authz000077500000000000000000000003071511661753600431700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=1a72ec8f64bd914b0e42e42607c7fbce7fb2c7465f63e3092b3b0d39fa77a6fepost-x-www-form-urlencoded-parameters.creq000077500000000000000000000003321511661753600427650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / content-type:application/x-www-form-urlencoded; charset=utf8 host:example.amazonaws.com x-amz-date:20150830T123600Z content-type;host;x-amz-date 9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6epost-x-www-form-urlencoded-parameters.req000077500000000000000000000002221511661753600426200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded; charset=utf8 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Param1=value1post-x-www-form-urlencoded-parameters.sreq000077500000000000000000000005511511661753600430100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded; charset=utf8 Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=1a72ec8f64bd914b0e42e42607c7fbce7fb2c7465f63e3092b3b0d39fa77a6fe Param1=value1post-x-www-form-urlencoded-parameters.sts000077500000000000000000000002121511661753600426410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded-parametersAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 2e1cf7ed91881a30569e46552437e4156c823447bf1781b921b5d486c568dd1cmongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencoded/000077500000000000000000000000001511661753600305265ustar00rootroot00000000000000post-x-www-form-urlencoded.authz000077500000000000000000000003071511661753600366660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedAWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ff11897932ad3f4e8b18135d722051e5ac45fc38421b1da7b9d196a0fe09473apost-x-www-form-urlencoded.creq000077500000000000000000000003141511661753600364630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / content-type:application/x-www-form-urlencoded host:example.amazonaws.com x-amz-date:20150830T123600Z content-type;host;x-amz-date 9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6epost-x-www-form-urlencoded.req000077500000000000000000000002041511661753600363160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Param1=value1post-x-www-form-urlencoded.sreq000077500000000000000000000005331511661753600365060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedPOST / HTTP/1.1 Content-Type:application/x-www-form-urlencoded Host:example.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ff11897932ad3f4e8b18135d722051e5ac45fc38421b1da7b9d196a0fe09473a Param1=value1post-x-www-form-urlencoded.sts000077500000000000000000000002121511661753600363370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/aws-sig-v4-test-suite/post-x-www-form-urlencodedAWS4-HMAC-SHA256 20150830T123600Z 20150830/us-east-1/service/aws4_request 42a5e5bb34198acb3e84da4f085bb7927f2bc277ca766e6d19c73c2154021281mongo-c-driver-2.2.1/src/kms-message/cmake/000077500000000000000000000000001511661753600204425ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/cmake/kms_message-config.cmake000066400000000000000000000000771511661753600252110ustar00rootroot00000000000000include("${CMAKE_CURRENT_LIST_DIR}/kms_message_targets.cmake") mongo-c-driver-2.2.1/src/kms-message/cmake/libkms_message.pc.in000066400000000000000000000004141511661753600243570ustar00rootroot00000000000000Name: ${PROJECT_NAME} Description: ${PROJECT_DESCRIPTION} Version: ${PROJECT_VERSION} Requires: ${PKG_CONFIG_REQUIRES} prefix=${CMAKE_INSTALL_PREFIX} includedir=${PKG_CONFIG_INCLUDEDIR} libdir=${PKG_CONFIG_LIBDIR} Libs: ${PKG_CONFIG_LIBS} Cflags: ${PKG_CONFIG_CFLAGS} mongo-c-driver-2.2.1/src/kms-message/src/000077500000000000000000000000001511661753600201515ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/src/hexlify.c000066400000000000000000000030151511661753600217640ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "hexlify.h" // #include "kms_message_private.h" #include #include #include #include char * hexlify (const uint8_t *buf, size_t len) { char *hex_chars = malloc (len * 2 + 1); KMS_ASSERT (hex_chars); char *p = hex_chars; size_t i; for (i = 0; i < len; i++) { p += sprintf (p, "%02x", buf[i]); } *p = '\0'; return hex_chars; } /* Returns -1 on error. */ int unhexlify (const char *in, size_t len) { int i; int byte; int total = 0; int multiplier = 1; for (i = (int) len - 1; i >= 0; i--) { char c = *(in + i); if (c >= '0' && c <= '9') { byte = c - 48; } else if (c >= 'a' && c <= 'f') { byte = c - 97 + 10; } else if (c >= 'A' && c <= 'F') { byte = c - 65 + 10; } else { return -1; } total += byte * multiplier; multiplier *= 16; } return total; } mongo-c-driver-2.2.1/src/kms-message/src/hexlify.h000066400000000000000000000013431511661753600217730ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include char * hexlify (const uint8_t *buf, size_t len); int unhexlify (const char *in, size_t len); mongo-c-driver-2.2.1/src/kms-message/src/kms_azure_request.c000066400000000000000000000155031511661753600240710ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" #include "kms_request_str.h" /* * Request has the following form: * * POST /{tenant ID}/oauth2/v2.0/token HTTP/1.1 * Host: {host of identify platform URL} * Content-Type: application/x-www-form-urlencoded * * client_id={client ID} * &scope=https%3A%2F%2Fvault.azure.net%2F.default * &client_secret={client secret} * &grant_type=client_credentials */ kms_request_t * kms_azure_request_oauth_new (const char *host, const char *scope, const char *tenant_id, const char *client_id, const char *client_secret, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); kms_request_str_appendf (str, "/%s/oauth2/v2.0/token", tenant_id); path_and_query = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf ( str, "client_id=%s&scope=%s&client_secret=%s&grant_type=client_credentials", client_id, scope, client_secret); payload = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_AZURE) { KMS_ERROR (req, "Expected KMS request with provider type: Azure"); goto done; } if (kms_request_get_error (req)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/x-www-form-urlencoded")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); return req; } static kms_request_t * _wrap_unwrap_common (const char *wrap_unwrap, const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *value, size_t value_len, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; char *bearer_token_value = NULL; char *value_base64url = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); /* {vaultBaseUrl}/keys/{key-name}/{key-version}/wrapkey?api-version=7.1 */ kms_request_str_appendf (str, "/keys/%s/%s/%s?api-version=7.1", key_name, key_version ? key_version : "", wrap_unwrap); path_and_query = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_AZURE) { KMS_ERROR (req, "Expected KMS request with provider type: Azure"); goto done; } if (kms_request_get_error (req)) { goto done; } value_base64url = kms_message_raw_to_b64url (value, value_len); if (!value_base64url) { KMS_ERROR (req, "Could not bases64url-encode plaintext"); goto done; } str = kms_request_str_new (); kms_request_str_appendf ( str, "{\"alg\": \"RSA-OAEP-256\", \"value\": \"%s\"}", value_base64url); payload = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf (str, "Bearer %s", access_token); bearer_token_value = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Authorization", bearer_token_value)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/json")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); kms_request_free_string (bearer_token_value); kms_request_free_string (value_base64url); return req; } /* * Request has the following form: * * POST /keys/{key-name}/{key-version}/wrapkey?api-version=7.1 * Host: {host of key vault endpoint} * Authentication: Bearer {token} * Content-Type: application/json * * { * "alg": "RSA-OAEP-256" * "value": "base64url encoded data" * } */ kms_request_t * kms_azure_request_wrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt) { return _wrap_unwrap_common ("wrapkey", host, access_token, key_name, key_version, plaintext, plaintext_len, opt); } kms_request_t * kms_azure_request_unwrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt) { return _wrap_unwrap_common ("unwrapkey", host, access_token, key_name, key_version, ciphertext, ciphertext_len, opt); } mongo-c-driver-2.2.1/src/kms-message/src/kms_b64.c000066400000000000000000000475221511661753600215740ustar00rootroot00000000000000/* * Copyright (c) 1996, 1998 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* * Portions Copyright (c) 1995 by International Business Machines, Inc. * * International Business Machines, Inc. (hereinafter called IBM) grants * permission under its copyrights to use, copy, modify, and distribute this * Software with or without fee, provided that the above copyright notice and * all paragraphs of this notice appear in all copies, and that the name of IBM * not be used in connection with the marketing of any product incorporating * the Software or modifications thereof, without specific, written prior * permission. * * To the extent it has a right to do so, IBM grants an immunity from suit * under its patents, if any, for the use, sale or manufacture of products to * the extent that such products are used for performing Domain Name System * dynamic updates in TCP/IP networks by means of the Software. No immunity is * granted for any product per se or for any other function of any product. * * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #include #include #include #include #include "kms_message/kms_b64.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) * The following encoding technique is taken from RFC 1521 by Borenstein * and Freed. It is reproduced here in a slightly edited form for * convenience. * * A 65-character subset of US-ASCII is used, enabling 6 bits to be * represented per printable character. (The extra 65th character, "=", * is used to signify a special processing function.) * * The encoding process represents 24-bit groups of input bits as output * strings of 4 encoded characters. Proceeding from left to right, a * 24-bit input group is formed by concatenating 3 8-bit input groups. * These 24 bits are then treated as 4 concatenated 6-bit groups, each * of which is translated into a single digit in the base64 alphabet. * * Each 6-bit group is used as an index into an array of 64 printable * characters. The character referenced by the index is placed in the * output string. * * Table 1: The Base64 Alphabet * * Value Encoding Value Encoding Value Encoding Value Encoding * 0 A 17 R 34 i 51 z * 1 B 18 S 35 j 52 0 * 2 C 19 T 36 k 53 1 * 3 D 20 U 37 l 54 2 * 4 E 21 V 38 m 55 3 * 5 F 22 W 39 n 56 4 * 6 G 23 X 40 o 57 5 * 7 H 24 Y 41 p 58 6 * 8 I 25 Z 42 q 59 7 * 9 J 26 a 43 r 60 8 * 10 K 27 b 44 s 61 9 * 11 L 28 c 45 t 62 + * 12 M 29 d 46 u 63 / * 13 N 30 e 47 v * 14 O 31 f 48 w (pad) = * 15 P 32 g 49 x * 16 Q 33 h 50 y * * Special processing is performed if fewer than 24 bits are available * at the end of the data being encoded. A full encoding quantum is * always completed at the end of a quantity. When fewer than 24 input * bits are available in an input group, zero bits are added (on the * right) to form an integral number of 6-bit groups. Padding at the * end of the data is performed using the '=' character. * * Since all base64 input is an integral number of octets, only the * following cases can arise: * * (1) the final quantum of encoding input is an integral * multiple of 24 bits; here, the final unit of encoded * output will be an integral multiple of 4 characters * with no "=" padding, * (2) the final quantum of encoding input is exactly 8 bits; * here, the final unit of encoded output will be two * characters followed by two "=" padding characters, or * (3) the final quantum of encoding input is exactly 16 bits; * here, the final unit of encoded output will be three * characters followed by one "=" padding character. */ int kms_message_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize) { size_t datalength = 0; uint8_t input[3]; uint8_t output[4]; size_t i; while (2 < srclength) { input[0] = *src++; input[1] = *src++; input[2] = *src++; srclength -= 3; output[0] = input[0] >> 2; output[1] = (uint8_t) (((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t) (((input[1] & 0x0f) << 2) + (input[2] >> 6)); output[3] = input[2] & 0x3f; KMS_ASSERT (output[0] < 64); KMS_ASSERT (output[1] < 64); KMS_ASSERT (output[2] < 64); KMS_ASSERT (output[3] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; target[datalength++] = Base64[output[2]]; target[datalength++] = Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; for (i = 0; i < srclength; i++) { input[i] = *src++; } output[0] = input[0] >> 2; output[1] = (uint8_t) (((input[0] & 0x03) << 4) + (input[1] >> 4)); output[2] = (uint8_t) (((input[1] & 0x0f) << 2) + (input[2] >> 6)); KMS_ASSERT (output[0] < 64); KMS_ASSERT (output[1] < 64); KMS_ASSERT (output[2] < 64); if (datalength + 4 > targsize) { return -1; } target[datalength++] = Base64[output[0]]; target[datalength++] = Base64[output[1]]; if (srclength == 1) { target[datalength++] = Pad64; } else { target[datalength++] = Base64[output[2]]; } target[datalength++] = Pad64; } if (datalength >= targsize) { return -1; } target[datalength] = '\0'; /* Returned value doesn't count \0. */ return (int) datalength; } /* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) The following encoding technique is taken from RFC 1521 by Borenstein and Freed. It is reproduced here in a slightly edited form for convenience. A 65-character subset of US-ASCII is used, enabling 6 bits to be represented per printable character. (The extra 65th character, "=", is used to signify a special processing function.) The encoding process represents 24-bit groups of input bits as output strings of 4 encoded characters. Proceeding from left to right, a 24-bit input group is formed by concatenating 3 8-bit input groups. These 24 bits are then treated as 4 concatenated 6-bit groups, each of which is translated into a single digit in the base64 alphabet. Each 6-bit group is used as an index into an array of 64 printable characters. The character referenced by the index is placed in the output string. Table 1: The Base64 Alphabet Value Encoding Value Encoding Value Encoding Value Encoding 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Special processing is performed if fewer than 24 bits are available at the end of the data being encoded. A full encoding quantum is always completed at the end of a quantity. When fewer than 24 input bits are available in an input group, zero bits are added (on the right) to form an integral number of 6-bit groups. Padding at the end of the data is performed using the '=' character. Since all base64 input is an integral number of octets, only the following cases can arise: (1) the final quantum of encoding input is an integral multiple of 24 bits; here, the final unit of encoded output will be an integral multiple of 4 characters with no "=" padding, (2) the final quantum of encoding input is exactly 8 bits; here, the final unit of encoded output will be two characters followed by two "=" padding characters, or (3) the final quantum of encoding input is exactly 16 bits; here, the final unit of encoded output will be three characters followed by one "=" padding character. */ /* skips all whitespace anywhere. converts characters, four at a time, starting at (or after) src from base - 64 numbers into three 8 bit bytes in the target area. it returns the number of data bytes stored at the target, or -1 on error. */ static uint8_t b64rmap[256]; static const uint8_t b64rmap_special = 0xf0; static const uint8_t b64rmap_end = 0xfd; static const uint8_t b64rmap_space = 0xfe; static const uint8_t b64rmap_invalid = 0xff; void kms_message_b64_initialize_rmap (void) { uint16_t i; unsigned char ch; /* Null: end of string, stop parsing */ b64rmap[0] = b64rmap_end; for (i = 1; i < 256; ++i) { ch = (unsigned char) i; /* Whitespaces */ if (isspace (ch)) b64rmap[i] = b64rmap_space; /* Padding: stop parsing */ else if (ch == Pad64) b64rmap[i] = b64rmap_end; /* Non-base64 char */ else b64rmap[i] = b64rmap_invalid; } /* Fill reverse mapping for base64 chars */ for (i = 0; Base64[i] != '\0'; ++i) b64rmap[(uint8_t) Base64[i]] = (uint8_t) i; } static int b64_pton_do (char const *src, uint8_t *target, size_t targsize) { int tarindex, state, ch; uint8_t ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = b64rmap[ch]; if (ofs >= b64rmap_special) { /* Ignore whitespaces */ if (ofs == b64rmap_space) continue; /* End of base64 characters */ if (ofs == b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] = (uint8_t) (ofs << 2); state = 1; break; case 1: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 4; target[tarindex + 1] = (uint8_t) ((ofs & 0x0f) << 4); tarindex++; state = 2; break; case 2: if ((size_t) tarindex + 1 >= targsize) return (-1); target[tarindex] |= ofs >> 2; target[tarindex + 1] = (uint8_t) ((ofs & 0x03) << 6); tarindex++; state = 3; break; case 3: if ((size_t) tarindex >= targsize) return (-1); target[tarindex] |= ofs; tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) return (-1); /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (target[tarindex] != 0) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } static int b64_pton_len (char const *src) { int tarindex, state, ch; uint8_t ofs; state = 0; tarindex = 0; while (1) { ch = *src++; ofs = b64rmap[ch]; if (ofs >= b64rmap_special) { /* Ignore whitespaces */ if (ofs == b64rmap_space) continue; /* End of base64 characters */ if (ofs == b64rmap_end) break; /* A non-base64 character. */ return (-1); } switch (state) { case 0: state = 1; break; case 1: tarindex++; state = 2; break; case 2: tarindex++; state = 3; break; case 3: tarindex++; state = 0; break; default: abort (); } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = *src++; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ return (-1); case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) return (-1); ch = *src++; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for ((void) NULL; ch != '\0'; ch = *src++) if (b64rmap[ch] != b64rmap_space) return (-1); default: break; } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) return (-1); } return (tarindex); } int kms_message_b64_pton (char const *src, uint8_t *target, size_t targsize) { if (target) return b64_pton_do (src, target, targsize); else return b64_pton_len (src); } int kms_message_b64_to_b64url (const char *src, size_t srclength, char *target, size_t targsize) { size_t i; for (i = 0; i < srclength; i++) { if (i >= targsize) { return -1; } target[i] = src[i]; if (target[i] == '+') { target[i] = '-'; } else if (target[i] == '/') { target[i] = '_'; } } /* NULL terminate if room. */ if (i < targsize) { target[i] = '\0'; } return (int) i; } int kms_message_b64url_to_b64 (const char *src, size_t srclength, char *target, size_t targsize) { size_t i; size_t boundary; for (i = 0; i < srclength; i++) { if (i >= targsize) { return -1; } target[i] = src[i]; if (target[i] == '-') { target[i] = '+'; } else if (target[i] == '_') { target[i] = '/'; } } /* Pad to four byte boundary. */ boundary = 4 * ((i + 3) / 4); for (; i < boundary; i++) { if (i >= targsize) { return -1; } target[i] = '='; } /* NULL terminate if room. */ if (i < targsize) { target[i] = '\0'; } return (int) i; } char * kms_message_raw_to_b64 (const uint8_t *raw, size_t raw_len) { char *b64; size_t b64_len; b64_len = (raw_len / 3 + 1) * 4 + 1; b64 = malloc (b64_len); KMS_ASSERT (b64); memset (b64, 0, b64_len); if (-1 == kms_message_b64_ntop (raw, raw_len, b64, b64_len)) { free (b64); return NULL; } return b64; } uint8_t * kms_message_b64_to_raw (const char *b64, size_t *out) { uint8_t *raw; int ret; size_t b64len; b64len = strlen (b64); raw = (uint8_t *) malloc (b64len + 1); KMS_ASSERT (raw); memset (raw, 0, b64len + 1); ret = kms_message_b64_pton (b64, raw, b64len); if (ret > 0) { *out = (size_t) ret; return raw; } free (raw); return NULL; } char * kms_message_raw_to_b64url (const uint8_t *raw, size_t raw_len) { char *b64; size_t b64len; b64 = kms_message_raw_to_b64 (raw, raw_len); if (!b64) { return NULL; } b64len = strlen (b64); if (-1 == kms_message_b64_to_b64url (b64, b64len, b64, b64len)) { free (b64); return NULL; } return b64; } uint8_t * kms_message_b64url_to_raw (const char *b64url, size_t *out) { char *b64; size_t capacity; uint8_t *raw; size_t b64urllen; b64urllen = strlen(b64url); /* Add four for padding '=' characters. */ capacity = b64urllen + 4; b64 = malloc (capacity); KMS_ASSERT (b64); memset (b64, 0, capacity); if (-1 == kms_message_b64url_to_b64 (b64url, b64urllen, b64, capacity)) { free (b64); return NULL; } raw = kms_message_b64_to_raw (b64, out); free (b64); return raw; } mongo-c-driver-2.2.1/src/kms-message/src/kms_caller_identity_request.c000066400000000000000000000027501511661753600261160ustar00rootroot00000000000000/* * Copyright 2019-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_caller_identity_request_new (const kms_request_opt_t *opt) { kms_request_t *request; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-www-form-urlencoded"))) { goto done; } payload = kms_request_str_new (); kms_request_str_appendf (payload, "Action=GetCallerIdentity&Version=2011-06-15"); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: kms_request_str_destroy (payload); return request; } mongo-c-driver-2.2.1/src/kms-message/src/kms_crypto.h000066400000000000000000000043641511661753600225230ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_KMS_CRYPTO_H #define KMS_MESSAGE_KMS_CRYPTO_H #include #include typedef struct { bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out); bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out); bool (*sign_rsaes_pkcs1_v1_5) (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out); void *ctx; void *sign_ctx; } _kms_crypto_t; int kms_crypto_init (void); void kms_crypto_cleanup (void); bool kms_sha256 (void *ctx, const char *input, size_t len, unsigned char *hash_out); bool kms_sha256_hmac (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out); /* signature_out must be a preallocated buffer of 256 bytes (or greater). */ bool kms_sign_rsaes_pkcs1_v1_5 (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out); #endif /* KMS_MESSAGE_KMS_CRYPTO_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_crypto_apple.c000066400000000000000000000107671511661753600237030ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message_private.h" /* KMS_ASSERT */ #ifdef KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO #include #include #include #include #include #include int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { CC_SHA256_CTX ctx; CC_SHA256_Init (&ctx); KMS_ASSERT (len <= (size_t) UINT32_MAX); CC_SHA256_Update (&ctx, input, (uint32_t) len); CC_SHA256_Final (hash_out, &ctx); return true; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { CCHmac (kCCHmacAlgSHA256, key_input, key_len, input, len, hash_out); return true; } static void safe_CFRelease (CFTypeRef ptr) { if (ptr) { CFRelease (ptr); } } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { CFDataRef key_data_ref = NULL; CFDataRef pass_ref = NULL; SecItemImportExportKeyParameters import_params; OSStatus status; /* TODO: I think the expected format should be kSecFormatWrappedPKCS8, but * GCP keys appear to only load for kSecFormatBSAFE. */ SecExternalFormat format = kSecFormatUnknown; SecExternalItemType type = kSecItemTypePrivateKey; CFArrayRef out_ref = NULL; SecKeyRef key_ref = NULL; CFDataRef data_to_sign_ref = NULL; CFErrorRef error_ref; CFDataRef signature_ref = NULL; bool ret = false; key_data_ref = CFDataCreate (NULL /* default allocator */, (const uint8_t *) private_key, (CFIndex) private_key_len); if (!key_data_ref) { goto cleanup; } memset (&import_params, 0, sizeof (SecItemImportExportKeyParameters)); import_params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION; /* Give an empty password. SecItemImport returns an error expecting a * password. */ pass_ref = CFDataCreate (NULL, NULL, 0); if (!pass_ref) { goto cleanup; } import_params.passphrase = (CFTypeRef) pass_ref; status = SecItemImport (key_data_ref, NULL /* extension. */, &format, &type, 0, &import_params, NULL /* keychain */, &out_ref); if (status != errSecSuccess) { goto cleanup; } if (1 != CFArrayGetCount (out_ref)) { goto cleanup; } key_ref = (SecKeyRef) CFArrayGetValueAtIndex (out_ref, 0); KMS_ASSERT (input_len <= (size_t) LONG_MAX); data_to_sign_ref = CFDataCreate (NULL, (const uint8_t *) input, (long) input_len); if (!data_to_sign_ref) { goto cleanup; } error_ref = NULL; signature_ref = SecKeyCreateSignature (key_ref, kSecKeyAlgorithmRSASignatureMessagePKCS1v15SHA256, data_to_sign_ref, &error_ref); if (!signature_ref) { goto cleanup; } memcpy (signature_out, CFDataGetBytePtr (signature_ref), (size_t) CFDataGetLength (signature_ref)); ret = true; cleanup: safe_CFRelease (key_data_ref); safe_CFRelease (pass_ref); safe_CFRelease (out_ref); safe_CFRelease (data_to_sign_ref); safe_CFRelease (signature_ref); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO */ mongo-c-driver-2.2.1/src/kms-message/src/kms_crypto_libcrypto.c000066400000000000000000000065661511661753600246130ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message_private.h" #ifdef KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO #include #include #include #include /* INT_MAX, LONG_MAX */ #if OPENSSL_VERSION_NUMBER < 0x10100000L || \ (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) static EVP_MD_CTX * EVP_MD_CTX_new (void) { return calloc (sizeof (EVP_MD_CTX), 1); } static void EVP_MD_CTX_free (EVP_MD_CTX *ctx) { EVP_MD_CTX_cleanup (ctx); free (ctx); } #endif int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { EVP_MD_CTX *digest_ctxp = EVP_MD_CTX_new (); KMS_ASSERT (digest_ctxp); bool rval = false; if (1 != EVP_DigestInit_ex (digest_ctxp, EVP_sha256 (), NULL)) { goto cleanup; } if (1 != EVP_DigestUpdate (digest_ctxp, input, len)) { goto cleanup; } rval = (1 == EVP_DigestFinal_ex (digest_ctxp, hash_out, NULL)); cleanup: EVP_MD_CTX_free (digest_ctxp); return rval; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { KMS_ASSERT (key_len <= INT_MAX); return HMAC (EVP_sha256 (), key_input, (int) key_len, (unsigned char *) input, len, hash_out, NULL) != NULL; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { EVP_MD_CTX *ctx; EVP_PKEY *pkey = NULL; bool ret = false; size_t signature_out_len = 256; ctx = EVP_MD_CTX_new (); KMS_ASSERT (ctx); KMS_ASSERT (private_key_len <= LONG_MAX); pkey = d2i_PrivateKey (EVP_PKEY_RSA, NULL, (const unsigned char **) &private_key, (long) private_key_len); if (!pkey) { goto cleanup; } ret = EVP_DigestSignInit (ctx, NULL, EVP_sha256 (), NULL /* engine */, pkey); if (ret != 1) { goto cleanup; } ret = EVP_DigestSignUpdate (ctx, input, input_len); if (ret != 1) { goto cleanup; } ret = EVP_DigestSignFinal (ctx, signature_out, &signature_out_len); if (ret != 1) { goto cleanup; } ret = true; cleanup: EVP_MD_CTX_free (ctx); EVP_PKEY_free (pkey); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO */ mongo-c-driver-2.2.1/src/kms-message/src/kms_crypto_none.c000066400000000000000000000032131511661753600235250ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #ifndef KMS_MESSAGE_ENABLE_CRYPTO int kms_crypto_init (void) { return 0; } void kms_crypto_cleanup (void) { } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { /* only gets called if hooks were mistakenly not set */ return false; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { /* only gets called if hooks were mistakenly not set */ return false; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { /* only gets called if hooks were mistakenly not set */ return false; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO */ mongo-c-driver-2.2.1/src/kms-message/src/kms_crypto_windows.c000066400000000000000000000167061511661753600242730ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #ifdef KMS_MESSAGE_ENABLE_CRYPTO_CNG #include "kms_message_private.h" // tell windows.h not to include a bunch of headers we don't need: #define WIN32_LEAN_AND_MEAN // Tell windows.h not to define any NT status codes, so that we can // get the definitions from ntstatus.h, which has a more complete list. #define WIN32_NO_STATUS #include #undef WIN32_NO_STATUS // Obtain a definition for the ntstatus type. #include // Add back in the status definitions so that macro expansions for // things like STILL_ACTIVE and WAIT_OBJECT_O can be resolved (they // expand to STATUS_ codes). #include #include #include static BCRYPT_ALG_HANDLE _algoSHA256 = 0; static BCRYPT_ALG_HANDLE _algoSHA256Hmac = 0; static BCRYPT_ALG_HANDLE _algoRSA = 0; #define SHA_256_HASH_LEN 32 int kms_crypto_init (void) { if (BCryptOpenAlgorithmProvider ( &_algoSHA256, BCRYPT_SHA256_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0) != STATUS_SUCCESS) { return 1; } if (BCryptOpenAlgorithmProvider (&_algoSHA256Hmac, BCRYPT_SHA256_ALGORITHM, MS_PRIMITIVE_PROVIDER, BCRYPT_ALG_HANDLE_HMAC_FLAG) != STATUS_SUCCESS) { return 2; } if (BCryptOpenAlgorithmProvider ( &_algoRSA, BCRYPT_RSA_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0) != STATUS_SUCCESS) { return 3; } return 0; } void kms_crypto_cleanup (void) { (void) BCryptCloseAlgorithmProvider (_algoSHA256, 0); (void) BCryptCloseAlgorithmProvider (_algoSHA256Hmac, 0); (void) BCryptCloseAlgorithmProvider (_algoRSA, 0); } bool kms_sha256 (void *unused_ctx, const char *input, size_t len, unsigned char *hash_out) { BCRYPT_HASH_HANDLE hHash; NTSTATUS status = BCryptCreateHash (_algoSHA256, &hHash, NULL, 0, NULL, 0, 0); if (status != STATUS_SUCCESS) { return 0; } status = BCryptHashData (hHash, (PUCHAR) (input), (ULONG) len, 0); if (status != STATUS_SUCCESS) { goto cleanup; } // Hardcode output length status = BCryptFinishHash (hHash, hash_out, 256 / 8, 0); if (status != STATUS_SUCCESS) { goto cleanup; } cleanup: (void) BCryptDestroyHash (hHash); return status == STATUS_SUCCESS ? 1 : 0; } bool kms_sha256_hmac (void *unused_ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out) { BCRYPT_HASH_HANDLE hHash; NTSTATUS status = BCryptCreateHash ( _algoSHA256Hmac, &hHash, NULL, 0, (PUCHAR) key_input, (ULONG) key_len, 0); if (status != STATUS_SUCCESS) { return 0; } status = BCryptHashData (hHash, (PUCHAR) input, (ULONG) len, 0); if (status != STATUS_SUCCESS) { goto cleanup; } // Hardcode output length status = BCryptFinishHash (hHash, hash_out, 256 / 8, 0); if (status != STATUS_SUCCESS) { goto cleanup; } cleanup: (void) BCryptDestroyHash (hHash); return status == STATUS_SUCCESS ? 1 : 0; } bool kms_sign_rsaes_pkcs1_v1_5 (void *unused_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out) { bool success = false; bool ret = false; LPBYTE blob_private = NULL; DWORD blob_private_len = 0; LPBYTE raw_private = NULL; DWORD raw_private_len = 0; NTSTATUS status; BCRYPT_KEY_HANDLE hKey = NULL; BCRYPT_PKCS1_PADDING_INFO padding_PKCS1; unsigned char *hash_value = NULL; DWORD hash_length = 256; success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, (BYTE*) private_key, (DWORD) private_key_len, 0, NULL, NULL, &blob_private_len); if (!success) { goto cleanup; } blob_private = (LPBYTE) calloc (1, blob_private_len); KMS_ASSERT (blob_private); success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_PRIVATE_KEY_INFO, (BYTE*) private_key, (DWORD) private_key_len, 0, NULL, blob_private, &blob_private_len); if (!success) { goto cleanup; } CRYPT_PRIVATE_KEY_INFO *privateKeyInfo = (CRYPT_PRIVATE_KEY_INFO *) blob_private; success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, privateKeyInfo->PrivateKey.pbData, (DWORD) privateKeyInfo->PrivateKey.cbData, 0, NULL, NULL, &raw_private_len); if (!success) { goto cleanup; } raw_private = (LPBYTE) calloc (1, raw_private_len); KMS_ASSERT (raw_private); success = CryptDecodeObjectEx (X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, privateKeyInfo->PrivateKey.pbData, (DWORD) privateKeyInfo->PrivateKey.cbData, 0, NULL, raw_private, &raw_private_len); if (!success) { goto cleanup; } status = BCryptImportKeyPair ( _algoRSA, NULL, LEGACY_RSAPRIVATE_BLOB, &hKey, raw_private, raw_private_len, 0); if (!NT_SUCCESS (status)) { goto cleanup; } hash_value = calloc (1, SHA_256_HASH_LEN); KMS_ASSERT (hash_value); if(!kms_sha256 (NULL, input, input_len, hash_value)) { goto cleanup; } padding_PKCS1.pszAlgId = BCRYPT_SHA256_ALGORITHM; status = BCryptSignHash (hKey, &padding_PKCS1, hash_value, SHA_256_HASH_LEN, signature_out, hash_length, &hash_length, BCRYPT_PAD_PKCS1); if (!NT_SUCCESS (status)) { goto cleanup; } ret = true; cleanup: BCryptDestroyKey(hKey); free (blob_private); free (raw_private); free (hash_value); return ret; } #endif /* KMS_MESSAGE_ENABLE_CRYPTO_CNG */ mongo-c-driver-2.2.1/src/kms-message/src/kms_decrypt_request.c000066400000000000000000000041001511661753600244040ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_decrypt_request_new (const uint8_t *ciphertext_blob, size_t len, const kms_request_opt_t *opt) { kms_request_t *request; size_t b64_len; char *b64 = NULL; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-amz-json-1.1") && kms_request_add_header_field ( request, "X-Amz-Target", "TrentService.Decrypt"))) { goto done; } b64_len = (len / 3 + 1) * 4 + 1; if (!(b64 = malloc (b64_len))) { KMS_ERROR (request, "Could not allocate %d bytes for base64-encoding payload", (int) b64_len); goto done; } if (kms_message_b64_ntop (ciphertext_blob, len, b64, b64_len) == -1) { KMS_ERROR (request, "Could not base64-encode ciphertext blob"); goto done; } payload = kms_request_str_new (); kms_request_str_appendf (payload, "{\"CiphertextBlob\": \"%s\"}", b64); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: free (b64); kms_request_str_destroy (payload); return request; } mongo-c-driver-2.2.1/src/kms-message/src/kms_encrypt_request.c000066400000000000000000000042721511661753600244300ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_message/kms_b64.h" #include "kms_request_str.h" kms_request_t * kms_encrypt_request_new (const uint8_t *plaintext, size_t plaintext_length, const char *key_id, const kms_request_opt_t *opt) { kms_request_t *request; size_t b64_len; char *b64 = NULL; kms_request_str_t *payload = NULL; request = kms_request_new ("POST", "/", opt); if (kms_request_get_error (request)) { goto done; } if (!(kms_request_add_header_field ( request, "Content-Type", "application/x-amz-json-1.1") && kms_request_add_header_field ( request, "X-Amz-Target", "TrentService.Encrypt"))) { goto done; } b64_len = (plaintext_length / 3 + 1) * 4 + 1; if (!(b64 = malloc (b64_len))) { KMS_ERROR (request, "Could not allocate %d bytes for base64-encoding payload", (int) b64_len); goto done; } if (kms_message_b64_ntop ( (const uint8_t *) plaintext, plaintext_length, b64, b64_len) == -1) { KMS_ERROR (request, "Could not base64-encode plaintext"); goto done; } payload = kms_request_str_new (); kms_request_str_appendf ( payload, "{\"Plaintext\": \"%s\", \"KeyId\": \"%s\"}", b64, key_id); if (!kms_request_append_payload (request, payload->str, payload->len)) { KMS_ERROR (request, "Could not append payload"); goto done; } done: free (b64); kms_request_str_destroy (payload); return request; } mongo-c-driver-2.2.1/src/kms-message/src/kms_endian_private.h000066400000000000000000000121341511661753600241650ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* This file is copied and modified from libbson's bson-endian.h. */ #ifndef KMS_ENDIAN_PRIVATE_H #define KMS_ENDIAN_PRIVATE_H #include #include "kms_message/kms_message_defines.h" /* Define a fallback for __has_builtin for compatibility with non-clang compilers. */ #ifndef __has_builtin #define __has_builtin(x) 0 #endif #if defined(__clang__) && __has_builtin(__builtin_bswap16) && \ __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64) #define KMS_UINT16_SWAP_LE_BE(v) __builtin_bswap16 (v) #define KMS_UINT32_SWAP_LE_BE(v) __builtin_bswap32 (v) #define KMS_UINT64_SWAP_LE_BE(v) __builtin_bswap64 (v) #elif defined(__GNUC__) && (__GNUC__ >= 4) #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 3) #define KMS_UINT32_SWAP_LE_BE(v) __builtin_bswap32 ((uint32_t) v) #define KMS_UINT64_SWAP_LE_BE(v) __builtin_bswap64 ((uint64_t) v) #endif #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 8) #define KMS_UINT16_SWAP_LE_BE(v) __builtin_bswap16 ((uint32_t) v) #endif #endif #ifndef KMS_UINT16_SWAP_LE_BE #define KMS_UINT16_SWAP_LE_BE(v) __kms_uint16_swap_slow ((uint16_t) v) #endif #ifndef KMS_UINT32_SWAP_LE_BE #define KMS_UINT32_SWAP_LE_BE(v) __kms_uint32_swap_slow ((uint32_t) v) #endif #ifndef KMS_UINT64_SWAP_LE_BE #define KMS_UINT64_SWAP_LE_BE(v) __kms_uint64_swap_slow ((uint64_t) v) #endif #if defined(KMS_MESSAGE_LITTLE_ENDIAN) #define KMS_UINT16_FROM_LE(v) ((uint16_t) v) #define KMS_UINT16_TO_LE(v) ((uint16_t) v) #define KMS_UINT16_FROM_BE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_TO_BE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT32_FROM_LE(v) ((uint32_t) v) #define KMS_UINT32_TO_LE(v) ((uint32_t) v) #define KMS_UINT32_FROM_BE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_TO_BE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT64_FROM_LE(v) ((uint64_t) v) #define KMS_UINT64_TO_LE(v) ((uint64_t) v) #define KMS_UINT64_FROM_BE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_TO_BE(v) KMS_UINT64_SWAP_LE_BE (v) #elif defined(KMS_MESSAGE_BIG_ENDIAN) #define KMS_UINT16_FROM_LE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_TO_LE(v) KMS_UINT16_SWAP_LE_BE (v) #define KMS_UINT16_FROM_BE(v) ((uint16_t) v) #define KMS_UINT16_TO_BE(v) ((uint16_t) v) #define KMS_UINT32_FROM_LE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_TO_LE(v) KMS_UINT32_SWAP_LE_BE (v) #define KMS_UINT32_FROM_BE(v) ((uint32_t) v) #define KMS_UINT32_TO_BE(v) ((uint32_t) v) #define KMS_UINT64_FROM_LE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_TO_LE(v) KMS_UINT64_SWAP_LE_BE (v) #define KMS_UINT64_FROM_BE(v) ((uint64_t) v) #define KMS_UINT64_TO_BE(v) ((uint64_t) v) #else #error "The endianness of target architecture is unknown." #endif /* *-------------------------------------------------------------------------- * * __kms_uint16_swap_slow -- * * Fallback endianness conversion for 16-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint16_t __kms_uint16_swap_slow (uint16_t v) /* IN */ { return (uint16_t) (((v & 0x00FF) << 8) | ((v & 0xFF00) >> 8)); } /* *-------------------------------------------------------------------------- * * __kms_uint32_swap_slow -- * * Fallback endianness conversion for 32-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint32_t __kms_uint32_swap_slow (uint32_t v) /* IN */ { return ((v & 0x000000FFU) << 24) | ((v & 0x0000FF00U) << 8) | ((v & 0x00FF0000U) >> 8) | ((v & 0xFF000000U) >> 24); } /* *-------------------------------------------------------------------------- * * __kms_uint64_swap_slow -- * * Fallback endianness conversion for 64-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static KMS_MSG_INLINE uint64_t __kms_uint64_swap_slow (uint64_t v) /* IN */ { return ((v & 0x00000000000000FFULL) << 56) | ((v & 0x000000000000FF00ULL) << 40) | ((v & 0x0000000000FF0000ULL) << 24) | ((v & 0x00000000FF000000ULL) << 8) | ((v & 0x000000FF00000000ULL) >> 8) | ((v & 0x0000FF0000000000ULL) >> 24) | ((v & 0x00FF000000000000ULL) >> 40) | ((v & 0xFF00000000000000ULL) >> 56); } #endif /* KMS_ENDIAN_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_gcp_request.c000066400000000000000000000235761511661753600235250ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_gcp_request.h" #include "kms_message/kms_b64.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" /* Set a default expiration of 5 minutes for JSON Web Tokens (GCP allows up to * one hour) */ #define JWT_EXPIRATION_SECS 5 * 60 #define SIGNATURE_LEN 256 kms_request_t * kms_gcp_request_oauth_new (const char *host, const char *email, const char *audience, const char *scope, const char *private_key_data, size_t private_key_len, const kms_request_opt_t *opt) { kms_request_t *req = NULL; kms_request_str_t *str = NULL; time_t issued_at; /* base64 encoding of {"alg":"RS256","typ":"JWT"} */ const char *jwt_header_b64url = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"; char *jwt_claims_b64url = NULL; char *jwt_header_and_claims_b64url = NULL; uint8_t *jwt_signature = NULL; char *jwt_signature_b64url = NULL; char *jwt_assertion_b64url = NULL; char *payload = NULL; req = kms_request_new ("POST", "/token", opt); if (opt->provider != KMS_REQUEST_PROVIDER_GCP) { KMS_ERROR (req, "Expected KMS request with provider type: GCP"); goto done; } if (kms_request_get_error (req)) { goto done; } /* Produce the signed JWT .. */ issued_at = time (NULL); str = kms_request_str_new (); kms_request_str_appendf (str, "{\"iss\": \"%s\", \"aud\": \"%s\", \"scope\": " "\"%s\", \"iat\": %lu, \"exp\": %lu}", email, audience, scope, (unsigned long) issued_at, (unsigned long) issued_at + JWT_EXPIRATION_SECS); jwt_claims_b64url = kms_message_raw_to_b64url ((const uint8_t *) str->str, str->len); kms_request_str_destroy (str); if (!jwt_claims_b64url) { KMS_ERROR (req, "Failed to base64url encode JWT claims"); goto done; } str = kms_request_str_new (); kms_request_str_appendf (str, "%s.%s", jwt_header_b64url, jwt_claims_b64url); jwt_header_and_claims_b64url = kms_request_str_detach (str); /* Produce the signature of . */ req->crypto.sign_rsaes_pkcs1_v1_5 = kms_sign_rsaes_pkcs1_v1_5; if (opt->crypto.sign_rsaes_pkcs1_v1_5) { req->crypto.sign_rsaes_pkcs1_v1_5 = opt->crypto.sign_rsaes_pkcs1_v1_5; req->crypto.sign_ctx = opt->crypto.sign_ctx; } jwt_signature = calloc (1, SIGNATURE_LEN); KMS_ASSERT (jwt_signature); if (!req->crypto.sign_rsaes_pkcs1_v1_5 ( req->crypto.sign_ctx, private_key_data, private_key_len, jwt_header_and_claims_b64url, strlen (jwt_header_and_claims_b64url), jwt_signature)) { KMS_ERROR (req, "Failed to create GCP oauth request signature"); goto done; } jwt_signature_b64url = kms_message_raw_to_b64url (jwt_signature, SIGNATURE_LEN); if (!jwt_signature_b64url) { KMS_ERROR (req, "Failed to base64url encode JWT signature"); goto done; } str = kms_request_str_new (); kms_request_str_appendf (str, "%s.%s.%s", jwt_header_b64url, jwt_claims_b64url, jwt_signature_b64url); jwt_assertion_b64url = kms_request_str_detach (str); str = kms_request_str_new_from_chars ("grant_type=urn%3Aietf%3Aparams%3Aoauth%" "3Agrant-type%3Ajwt-bearer&assertion=", -1); kms_request_str_append_chars (str, jwt_assertion_b64url, -1); payload = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Content-Type", "application/x-www-form-urlencoded")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: free (jwt_signature); free (jwt_signature_b64url); free (jwt_claims_b64url); free (jwt_header_and_claims_b64url); free (jwt_assertion_b64url); free (payload); return req; } static kms_request_t * _encrypt_decrypt_common (const char *encrypt_decrypt, const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *value, size_t value_len, const kms_request_opt_t *opt) { char *path_and_query = NULL; char *payload = NULL; char *bearer_token_value = NULL; char *value_base64 = NULL; kms_request_t *req; kms_request_str_t *str; str = kms_request_str_new (); /* /v1/projects/{project-id}/locations/{location}/keyRings/{key-ring-name}/cryptoKeys/{key-name} */ kms_request_str_appendf ( str, "/v1/projects/%s/locations/%s/keyRings/%s/cryptoKeys/%s", project_id, location, key_ring_name, key_name); if (key_version && strlen (key_version) > 0) { kms_request_str_appendf (str, "/cryptoKeyVersions/%s", key_version); } kms_request_str_appendf (str, ":%s", encrypt_decrypt); path_and_query = kms_request_str_detach (str); req = kms_request_new ("POST", path_and_query, opt); if (opt->provider != KMS_REQUEST_PROVIDER_GCP) { KMS_ERROR (req, "Expected KMS request with provider type: GCP"); goto done; } if (kms_request_get_error (req)) { goto done; } value_base64 = kms_message_raw_to_b64 (value, value_len); if (!value_base64) { KMS_ERROR (req, "Could not bases64-encode plaintext"); goto done; } str = kms_request_str_new (); if (0 == strcmp ("encrypt", encrypt_decrypt)) { kms_request_str_appendf (str, "{\"plaintext\": \"%s\"}", value_base64); } else { kms_request_str_appendf (str, "{\"ciphertext\": \"%s\"}", value_base64); } payload = kms_request_str_detach (str); str = kms_request_str_new (); kms_request_str_appendf (str, "Bearer %s", access_token); bearer_token_value = kms_request_str_detach (str); if (!kms_request_add_header_field ( req, "Authorization", bearer_token_value)) { goto done; } if (!kms_request_add_header_field ( req, "Content-Type", "application/json")) { goto done; } if (!kms_request_add_header_field (req, "Host", host)) { goto done; } if (!kms_request_add_header_field (req, "Accept", "application/json")) { goto done; } if (!kms_request_append_payload (req, payload, strlen (payload))) { goto done; } done: kms_request_free_string (path_and_query); kms_request_free_string (payload); kms_request_free_string (bearer_token_value); kms_request_free_string (value_base64); return req; } kms_request_t * kms_gcp_request_encrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt) { return _encrypt_decrypt_common ("encrypt", host, access_token, project_id, location, key_ring_name, key_name, key_version, plaintext, plaintext_len, opt); } kms_request_t * kms_gcp_request_decrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt) { return _encrypt_decrypt_common ("decrypt", host, access_token, project_id, location, key_ring_name, key_name, NULL /* key_version */, ciphertext, ciphertext_len, opt); } mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_item_type_private.h000066400000000000000000000033101511661753600257420ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_ITEM_TYPE_PRIVATE_H #define KMS_KMIP_ITEM_TYPE_PRIVATE_H #include "kms_message/kms_message_defines.h" #define KMS_XMACRO \ KMS_X (Structure, 0x01) \ KMS_X (Integer, 0x02) \ KMS_X (LongInteger, 0x03) \ KMS_X (BigInteger, 0x04) \ KMS_X (Enumeration, 0x05) \ KMS_X (Boolean, 0x06) \ KMS_X (TextString, 0x07) \ KMS_X (ByteString, 0x08) \ KMS_X (DateTime, 0x09) \ KMS_X_LAST (Interval, 0x0A) /* Generate an enum with each item_type value. */ #define KMS_X(ITEM_TYPE, VAL) KMIP_ITEM_TYPE_##ITEM_TYPE = VAL, #define KMS_X_LAST(ITEM_TYPE, VAL) KMIP_ITEM_TYPE_##ITEM_TYPE = VAL typedef enum { KMS_XMACRO } kmip_item_type_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(ITEM_TYPE, VAL) \ case KMIP_ITEM_TYPE_##ITEM_TYPE: \ return #ITEM_TYPE; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_item_type_to_string (kmip_item_type_t item_type) { switch (item_type) { default: return "Unknown KMIP item type"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_ITEM_TYPE_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_reader_writer.c000066400000000000000000000315661511661753600250600ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_kmip_reader_writer_private.h" #include "kms_endian_private.h" #include "kms_request_str.h" #include #define MAX_KMIP_WRITER_POSITIONS 10 /* KMIP encodes signed integers with two's complement. * Parsing functions read Integer / LongInteger as int32_t / int64_t by * reinterpreting byte representation. * Ensure that platform represents integers in two's complement. * See: https://stackoverflow.com/a/64843863/774658 */ #if (-1 & 3) != 3 #error Error: Twos complement integer representation is required. #endif struct _kmip_writer_t { kms_request_str_t *buffer; size_t positions[MAX_KMIP_WRITER_POSITIONS]; size_t cur_pos; }; kmip_writer_t * kmip_writer_new (void) { kmip_writer_t *writer = calloc (1, sizeof (kmip_writer_t)); KMS_ASSERT (writer); writer->buffer = kms_request_str_new (); return writer; } void kmip_writer_destroy (kmip_writer_t *writer) { kms_request_str_destroy (writer->buffer); free (writer); } void kmip_writer_write_u8 (kmip_writer_t *writer, uint8_t value) { char *c = (char *) &value; kms_request_str_append_chars (writer->buffer, c, 1); } void kmip_writer_write_u16 (kmip_writer_t *writer, uint16_t value) { uint16_t v = KMS_UINT16_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 2); } void kmip_writer_write_u32 (kmip_writer_t *writer, uint32_t value) { uint32_t v = KMS_UINT32_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 4); } void kmip_writer_write_u64 (kmip_writer_t *writer, uint64_t value) { uint64_t v = KMS_UINT64_TO_BE (value); char *c = (char *) &v; kms_request_str_append_chars (writer->buffer, c, 8); } void kmip_writer_write_tag_enum (kmip_writer_t *writer, kmip_tag_type_t tag) { /* The 0x42 prefix is for tags built into the protocol. */ /* The 0x54 prefix is for extension tags. */ kmip_writer_write_u8 (writer, 0x42); kmip_writer_write_u16 (writer, (uint16_t) tag); } static size_t compute_padded_length (size_t len) { if (len % 8 == 0) { return len; } size_t padding = 8 - (len % 8); return len + padding; } void kmip_writer_write_string (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_TextString); kmip_writer_write_u32 (writer, (uint32_t) len); size_t i; for (i = 0; i < len; i++) { kmip_writer_write_u8 (writer, (uint8_t) str[i]); } size_t padded_length = compute_padded_length (len); for (i = 0; i < padded_length - len; i++) { kmip_writer_write_u8 (writer, 0); } } void kmip_writer_write_bytes (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_ByteString); kmip_writer_write_u32 (writer, (uint32_t) len); size_t i; for (i = 0; i < len; i++) { kmip_writer_write_u8 (writer, (uint8_t) str[i]); } size_t padded_length = compute_padded_length (len); for (i = 0; i < padded_length - len; i++) { kmip_writer_write_u8 (writer, 0); } } void kmip_writer_write_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Integer); kmip_writer_write_u32 (writer, 4); KMS_ASSERT (value >= 0); kmip_writer_write_u32 (writer, (uint32_t) value); kmip_writer_write_u32 (writer, 0); } void kmip_writer_write_long_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_LongInteger); kmip_writer_write_u32 (writer, 8); KMS_ASSERT (value >= 0); kmip_writer_write_u64 (writer, (uint64_t) value); } void kmip_writer_write_enumeration (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Enumeration); kmip_writer_write_u32 (writer, 4); KMS_ASSERT (value >= 0); kmip_writer_write_u32 (writer, (uint32_t) value); kmip_writer_write_u32 (writer, 0); } void kmip_writer_write_bool (kmip_writer_t *writer, kmip_tag_type_t tag, bool value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Boolean); kmip_writer_write_u32 (writer, 8); kmip_writer_write_u64(writer, (uint64_t) value); } void kmip_writer_write_datetime (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_DateTime); kmip_writer_write_u32 (writer, 8); KMS_ASSERT (value >= 0); kmip_writer_write_u64 (writer, (uint64_t) value); } void kmip_writer_begin_struct (kmip_writer_t *writer, kmip_tag_type_t tag) { kmip_writer_write_tag_enum (writer, tag); kmip_writer_write_u8 (writer, KMIP_ITEM_TYPE_Structure); size_t pos = writer->buffer->len; kmip_writer_write_u32 (writer, 0); KMS_ASSERT(writer->cur_pos < MAX_KMIP_WRITER_POSITIONS - 1); writer->cur_pos++; writer->positions[writer->cur_pos] = pos; } void kmip_writer_close_struct (kmip_writer_t *writer) { size_t current_pos = writer->buffer->len; KMS_ASSERT(writer->cur_pos > 0); size_t start_pos = writer->positions[writer->cur_pos]; writer->cur_pos--; /* offset by 4 */ uint32_t len = (uint32_t) (current_pos - start_pos - 4); uint32_t v = KMS_UINT32_TO_BE (len); char *c = (char *) &v; memcpy (writer->buffer->str + start_pos, c, 4); } const uint8_t * kmip_writer_get_buffer (kmip_writer_t *writer, size_t* len) { *len = writer->buffer->len; return (const uint8_t*) writer->buffer->str; } struct _kmip_reader_t { uint8_t *ptr; size_t pos; size_t len; }; kmip_reader_t * kmip_reader_new (uint8_t *ptr, size_t len) { kmip_reader_t *reader = calloc (1, sizeof (kmip_reader_t)); KMS_ASSERT (reader); reader->ptr = ptr; reader->len = len; return reader; } void kmip_reader_destroy (kmip_reader_t *reader) { free (reader); } bool kmip_reader_in_place (kmip_reader_t *reader, size_t pos, size_t len, kmip_reader_t *out_reader) { /* Everything should be padding to 8 byte boundaries. */ len = compute_padded_length (len); if ((pos + len) > reader->len) { return false; } memset (out_reader, 0, sizeof (kmip_reader_t)); out_reader->ptr = reader->ptr + reader->pos; out_reader->len = len; return true; } bool kmip_reader_has_data (kmip_reader_t *reader) { return reader->pos < reader->len; } #define CHECK_REMAINING_BUFFER_AND_RET(read_size) \ if ((reader->pos + (read_size)) > reader->len) { \ return false; \ } else \ ((void)0) bool kmip_reader_read_u8 (kmip_reader_t *reader, uint8_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint8_t)); *value = *(reader->ptr + reader->pos); reader->pos += sizeof (uint8_t); return true; } bool kmip_reader_read_u16 (kmip_reader_t *reader, uint16_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint16_t)); uint16_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint16_t)); *value = KMS_UINT16_FROM_BE (temp); reader->pos += sizeof (uint16_t); return true; } bool kmip_reader_read_u32 (kmip_reader_t *reader, uint32_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint32_t)); uint32_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint32_t)); *value = KMS_UINT32_FROM_BE (temp); reader->pos += sizeof (uint32_t); return true; } bool kmip_reader_read_u64 (kmip_reader_t *reader, uint64_t *value) { CHECK_REMAINING_BUFFER_AND_RET (sizeof (uint64_t)); uint64_t temp; memcpy (&temp, reader->ptr + reader->pos, sizeof (uint64_t)); *value = KMS_UINT64_FROM_BE (temp); reader->pos += sizeof (uint64_t); return true; } bool kmip_reader_read_bytes (kmip_reader_t *reader, uint8_t **ptr, size_t length) { size_t advance_length = compute_padded_length (length); CHECK_REMAINING_BUFFER_AND_RET (advance_length); *ptr = reader->ptr + reader->pos; reader->pos += advance_length; return true; } #define CHECK_AND_RET(x) \ if (!(x)) { \ return false; \ } else \ ((void)0) bool kmip_reader_read_tag (kmip_reader_t *reader, kmip_tag_type_t *tag) { uint8_t tag_first; CHECK_AND_RET (kmip_reader_read_u8 (reader, &tag_first)); if (tag_first != 0x42) { return false; } uint16_t tag_second; CHECK_AND_RET (kmip_reader_read_u16 (reader, &tag_second)); *tag = (kmip_tag_type_t) (0x420000 + tag_second); return true; } bool kmip_reader_read_length (kmip_reader_t *reader, uint32_t *length) { return kmip_reader_read_u32 (reader, length); } bool kmip_reader_read_type (kmip_reader_t *reader, kmip_item_type_t *type) { uint8_t u8; CHECK_AND_RET (kmip_reader_read_u8 (reader, &u8)); *type = (kmip_item_type_t) u8; return true; } bool kmip_reader_read_enumeration (kmip_reader_t *reader, uint32_t *enum_value) { CHECK_AND_RET (kmip_reader_read_u32 (reader, enum_value)); /* Skip 4 bytes because enums are padded. */ uint32_t ignored; return kmip_reader_read_u32 (reader, &ignored); } bool kmip_reader_read_bool (kmip_reader_t *reader, bool *value) { uint64_t u64; CHECK_AND_RET (kmip_reader_read_u64 (reader, &u64)); *value = (bool) u64; return true; } bool kmip_reader_read_integer (kmip_reader_t *reader, int32_t *value) { CHECK_AND_RET (kmip_reader_read_u32 (reader, (uint32_t*) value)); /* Skip 4 bytes because integers are padded. */ uint32_t ignored; return kmip_reader_read_u32 (reader, &ignored); } bool kmip_reader_read_long_integer (kmip_reader_t *reader, int64_t *value) { return kmip_reader_read_u64 (reader, (uint64_t*) value); } bool kmip_reader_read_string (kmip_reader_t *reader, uint8_t **ptr, size_t length) { return kmip_reader_read_bytes (reader, ptr, length); } bool kmip_reader_find (kmip_reader_t *reader, kmip_tag_type_t search_tag, kmip_item_type_t type, size_t *pos, size_t *length) { reader->pos = 0; while (kmip_reader_has_data (reader)) { kmip_tag_type_t read_tag; CHECK_AND_RET (kmip_reader_read_tag (reader, &read_tag)); kmip_item_type_t read_type; CHECK_AND_RET (kmip_reader_read_type (reader, &read_type)); uint32_t read_length; CHECK_AND_RET (kmip_reader_read_length (reader, &read_length)); if (read_tag == search_tag && read_type == type) { *pos = reader->pos; *length = read_length; return true; } size_t advance_length = read_length; advance_length = compute_padded_length (advance_length); CHECK_REMAINING_BUFFER_AND_RET (advance_length); /* Skip to the next type. */ reader->pos += advance_length; } return false; } bool kmip_reader_find_and_recurse (kmip_reader_t *reader, kmip_tag_type_t tag) { size_t pos; size_t length; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_Structure, &pos, &length)) { return false; } reader->pos = 0; reader->ptr = reader->ptr + pos; reader->len = length; return true; } bool kmip_reader_find_and_read_enum (kmip_reader_t *reader, kmip_tag_type_t tag, uint32_t *value) { size_t pos; size_t length; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_Enumeration, &pos, &length)) { return false; } kmip_reader_t temp_reader; if (!kmip_reader_in_place (reader, pos, length, &temp_reader)) { return false; } return kmip_reader_read_enumeration (&temp_reader, value); } bool kmip_reader_find_and_read_bytes (kmip_reader_t *reader, kmip_tag_type_t tag, uint8_t **out_ptr, size_t *out_len) { size_t pos; if (!kmip_reader_find (reader, tag, KMIP_ITEM_TYPE_ByteString, &pos, out_len)) { return false; } kmip_reader_t temp_reader; if (!kmip_reader_in_place (reader, pos, *out_len, &temp_reader)) { return false; } return kmip_reader_read_bytes (&temp_reader, out_ptr, *out_len); } mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_reader_writer_private.h000066400000000000000000000104361511661753600266100ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_READER_WRITER_PRIVATE_H #define KMS_KMIP_READER_WRITER_PRIVATE_H #include "kms_kmip_item_type_private.h" #include "kms_kmip_tag_type_private.h" #include "kms_message_private.h" #include typedef struct _kmip_writer_t kmip_writer_t; kmip_writer_t * kmip_writer_new (void); void kmip_writer_destroy (kmip_writer_t *writer); void kmip_writer_write_u8 (kmip_writer_t *writer, uint8_t value); void kmip_writer_write_u16 (kmip_writer_t *writer, uint16_t value); void kmip_writer_write_u32 (kmip_writer_t *writer, uint32_t value); void kmip_writer_write_u64 (kmip_writer_t *writer, uint64_t value); void kmip_writer_write_tag_enum (kmip_writer_t *writer, kmip_tag_type_t tag); void kmip_writer_write_string (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len); void kmip_writer_write_bytes (kmip_writer_t *writer, kmip_tag_type_t tag, const char *str, size_t len); void kmip_writer_write_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value); void kmip_writer_write_long_integer (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value); void kmip_writer_write_enumeration (kmip_writer_t *writer, kmip_tag_type_t tag, int32_t value); void kmip_writer_write_bool (kmip_writer_t *writer, kmip_tag_type_t tag, bool value); void kmip_writer_write_datetime (kmip_writer_t *writer, kmip_tag_type_t tag, int64_t value); void kmip_writer_begin_struct (kmip_writer_t *writer, kmip_tag_type_t tag); void kmip_writer_close_struct (kmip_writer_t *writer); const uint8_t * kmip_writer_get_buffer (kmip_writer_t *writer, size_t* len); typedef struct _kmip_reader_t kmip_reader_t; kmip_reader_t * kmip_reader_new (uint8_t *ptr, size_t len); void kmip_reader_destroy (kmip_reader_t *reader); bool kmip_reader_in_place (kmip_reader_t *reader, size_t pos, size_t len, kmip_reader_t *out_reader); bool kmip_reader_has_data (kmip_reader_t *reader); bool kmip_reader_read_u8 (kmip_reader_t *reader, uint8_t *value); bool kmip_reader_read_u16 (kmip_reader_t *reader, uint16_t *value); bool kmip_reader_read_u32 (kmip_reader_t *reader, uint32_t *value); bool kmip_reader_read_u64 (kmip_reader_t *reader, uint64_t *value); bool kmip_reader_read_tag (kmip_reader_t *reader, kmip_tag_type_t *tag); bool kmip_reader_read_length (kmip_reader_t *reader, uint32_t *length); bool kmip_reader_read_type (kmip_reader_t *reader, kmip_item_type_t *type); bool kmip_reader_read_enumeration (kmip_reader_t *reader, uint32_t *enum_value); bool kmip_reader_read_bool (kmip_reader_t *reader, bool *value); bool kmip_reader_read_integer (kmip_reader_t *reader, int32_t *value); bool kmip_reader_read_long_integer (kmip_reader_t *reader, int64_t *value); bool kmip_reader_read_bytes (kmip_reader_t *reader, uint8_t **ptr, size_t length); bool kmip_reader_read_string (kmip_reader_t *reader, uint8_t **ptr, size_t length); /* kmip_reader_find does not descend structures. * To find and descend into a structure use kmip_reader_find_and_recurse. */ bool kmip_reader_find (kmip_reader_t *reader, kmip_tag_type_t search_tag, kmip_item_type_t type, size_t *pos, size_t *length); bool kmip_reader_find_and_recurse (kmip_reader_t *reader, kmip_tag_type_t tag); bool kmip_reader_find_and_read_enum (kmip_reader_t *reader, kmip_tag_type_t tag, uint32_t *value); bool kmip_reader_find_and_read_bytes (kmip_reader_t *reader, kmip_tag_type_t tag, uint8_t **out_ptr, size_t *out_len); #endif /* KMS_KMIP_READER_WRITER_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_request.c000066400000000000000000000474431511661753600237130ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_kmip_request.h" #include "kms_kmip_tag_type_private.h" #include "kms_message_private.h" #include "kms_kmip_reader_writer_private.h" #include #include static void copy_writer_buffer (kms_request_t *req, kmip_writer_t *writer) { const uint8_t *buf; size_t buflen; buf = kmip_writer_get_buffer (writer, &buflen); req->kmip.data = malloc (buflen); KMS_ASSERT (req->kmip.data); memcpy (req->kmip.data, buf, buflen); req->kmip.len = (uint32_t) buflen; } kms_request_t * kms_kmip_request_register_secretdata_new (void *reserved, const uint8_t *data, size_t len) { /* Create a KMIP Register request with a 96 byte SecretData of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); KMS_ASSERT (req); req->provider = KMS_REQUEST_PROVIDER_KMIP; if (len != KMS_KMIP_REQUEST_SECRETDATA_LENGTH) { KMS_ERROR (req, "expected SecretData length of %d, got %zu", KMS_KMIP_REQUEST_SECRETDATA_LENGTH, len); return req; } writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x03 == Register */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x03); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); /* 0x07 == SecretData */ kmip_writer_write_enumeration (writer, KMIP_TAG_ObjectType, 0x07); kmip_writer_begin_struct (writer, KMIP_TAG_TemplateAttribute); // Add required Cryptographic Usage Mask attribute. { kmip_writer_begin_struct (writer, KMIP_TAG_Attribute); const char *cryptographicUsageMaskStr = "Cryptographic Usage Mask"; kmip_writer_write_string (writer, KMIP_TAG_AttributeName, cryptographicUsageMaskStr, strlen (cryptographicUsageMaskStr)); // Use 0 because the Secret Data object is not used in cryptographic // operations on the KMIP server. kmip_writer_write_integer (writer, KMIP_TAG_AttributeValue, 0); kmip_writer_close_struct (writer); } kmip_writer_close_struct (writer); /* KMIP_TAG_TemplateAttribute */ kmip_writer_begin_struct (writer, KMIP_TAG_SecretData); /* 0x02 = Seed */ kmip_writer_write_enumeration (writer, KMIP_TAG_SecretDataType, 0x02); kmip_writer_begin_struct (writer, KMIP_TAG_KeyBlock); /* 0x02 = Opaque */ kmip_writer_write_enumeration (writer, KMIP_TAG_KeyFormatType, 0x02); kmip_writer_begin_struct (writer, KMIP_TAG_KeyValue); kmip_writer_write_bytes ( writer, KMIP_TAG_KeyMaterial, (const char *) data, len); kmip_writer_close_struct (writer); /* KMIP_TAG_KeyValue */ kmip_writer_close_struct (writer); /* KMIP_TAG_KeyBlock */ kmip_writer_close_struct (writer); /* KMIP_TAG_SecretData */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_activate_new (void *reserved, const char *unique_identifer) { /* Create a KMIP Activate request of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); KMS_ASSERT (req); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x12 == Activate */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x12); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); kmip_writer_write_string (writer, KMIP_TAG_UniqueIdentifier, unique_identifer, strlen (unique_identifer)); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_get_new (void *reserved, const char *unique_identifer) { /* Create a KMIP Get request of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); KMS_ASSERT (req); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 0); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x0A == Get */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x0A); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); kmip_writer_write_string (writer, KMIP_TAG_UniqueIdentifier, unique_identifer, strlen (unique_identifer)); /* 0x01 = Raw */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ /* Copy the KMIP writer buffer to a KMIP request. */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_create_new (void *reserved) { /* Create a KMIP Create request of this form: */ kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); KMS_ASSERT (req); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new(); kmip_writer_begin_struct(writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 2); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x01 == Create */ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, 0x01); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); /* 0x02 == symmetric key */ kmip_writer_write_enumeration(writer, KMIP_TAG_ObjectType, 0x02); { kmip_writer_begin_struct (writer, KMIP_TAG_TemplateAttribute); kmip_writer_begin_struct (writer, KMIP_TAG_Attribute); const char *cryptographicAlgorithmStr = "Cryptographic Algorithm"; kmip_writer_write_string (writer, KMIP_TAG_AttributeName, cryptographicAlgorithmStr, strlen (cryptographicAlgorithmStr)); kmip_writer_write_enumeration (writer, KMIP_TAG_AttributeValue, 3 /* AES */); kmip_writer_close_struct (writer); kmip_writer_begin_struct (writer, KMIP_TAG_Attribute); const char *cryptographicLengthStr = "Cryptographic Length"; kmip_writer_write_string (writer, KMIP_TAG_AttributeName, cryptographicLengthStr, strlen (cryptographicLengthStr)); kmip_writer_write_integer (writer, KMIP_TAG_AttributeValue, 256); kmip_writer_close_struct (writer); kmip_writer_begin_struct (writer, KMIP_TAG_Attribute); const char *cryptographicUsageMaskStr = "Cryptographic Usage Mask"; kmip_writer_write_string (writer, KMIP_TAG_AttributeName, cryptographicUsageMaskStr, strlen (cryptographicUsageMaskStr)); kmip_writer_write_integer (writer, KMIP_TAG_AttributeValue, 4 | 8 /* Encrypt | Decrypt */); kmip_writer_close_struct (writer); kmip_writer_close_struct (writer); /* KMIP_TAG_TemplateAttribute */ } kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ /* Copy the KMIP writer buffer to a KMIP request. */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } static kms_request_t * kmip_encrypt_decrypt (const char* unique_identifer, const uint8_t *data, size_t len, const uint8_t *iv_data, size_t iv_len, bool encrypt) { kmip_writer_t *writer; kms_request_t *req; req = calloc (1, sizeof (kms_request_t)); KMS_ASSERT (req); req->provider = KMS_REQUEST_PROVIDER_KMIP; writer = kmip_writer_new(); kmip_writer_begin_struct(writer, KMIP_TAG_RequestMessage); kmip_writer_begin_struct (writer, KMIP_TAG_RequestHeader); kmip_writer_begin_struct (writer, KMIP_TAG_ProtocolVersion); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMajor, 1); kmip_writer_write_integer (writer, KMIP_TAG_ProtocolVersionMinor, 2); kmip_writer_close_struct (writer); /* KMIP_TAG_ProtocolVersion */ kmip_writer_write_integer (writer, KMIP_TAG_BatchCount, 1); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestHeader */ kmip_writer_begin_struct (writer, KMIP_TAG_BatchItem); /* 0x1F == Encrypt, 0x20 == Decrypt*/ kmip_writer_write_enumeration (writer, KMIP_TAG_Operation, encrypt ? 0x1F : 0x20); kmip_writer_begin_struct (writer, KMIP_TAG_RequestPayload); kmip_writer_write_string (writer, KMIP_TAG_UniqueIdentifier, unique_identifer, strlen (unique_identifer)); kmip_writer_begin_struct (writer, KMIP_TAG_CryptographicParameters); kmip_writer_write_enumeration(writer, KMIP_TAG_BlockCipherMode, 1 /* CBC */); kmip_writer_write_enumeration(writer, KMIP_TAG_PaddingMethod, 3 /* PKCS5 */); kmip_writer_write_enumeration(writer, KMIP_TAG_CryptographicAlgorithm, 3 /* AES */); if (encrypt) kmip_writer_write_bool(writer, KMIP_TAG_RandomIV, true); kmip_writer_close_struct(writer); /* KMIP_TAG_CryptographicParameters */ kmip_writer_write_bytes(writer, KMIP_TAG_Data, (char *) data, len); if (!encrypt) kmip_writer_write_bytes(writer, KMIP_TAG_IVCounterNonce, (char *) iv_data, iv_len); kmip_writer_close_struct (writer); /* KMIP_TAG_RequestPayload */ kmip_writer_close_struct (writer); /* KMIP_TAG_BatchItem */ kmip_writer_close_struct (writer); /* KMIP_TAG_RequestMessage */ /* Copy the KMIP writer buffer to a KMIP request. */ copy_writer_buffer (req, writer); kmip_writer_destroy (writer); return req; } kms_request_t * kms_kmip_request_encrypt_new (void *reserved, const char* unique_identifer, const uint8_t *plaintext, size_t len) { /* Create a KMIP Encrypt request of this form: */ return kmip_encrypt_decrypt(unique_identifer, plaintext, len, NULL, 0, true); } kms_request_t * kms_kmip_request_decrypt_new (void *reserved, const char* unique_identifer, const uint8_t *ciphertext, size_t len, const uint8_t *iv_data, size_t iv_len) { /* Create a KMIP Decrypt request of this form: */ return kmip_encrypt_decrypt(unique_identifer, ciphertext, len, iv_data, iv_len, false); } mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_response.c000066400000000000000000000362231511661753600240530ustar00rootroot00000000000000#include "kms_message/kms_kmip_response.h" #include "kms_kmip_item_type_private.h" #include "kms_kmip_tag_type_private.h" #include "kms_message_private.h" #include "kms_kmip_reader_writer_private.h" #include "kms_kmip_result_reason_private.h" #include "kms_kmip_result_status_private.h" #include #include #include /* CHAR_BIT */ static bool check_and_require_kmip (kms_response_t *res) { if (res->provider != KMS_REQUEST_PROVIDER_KMIP) { KMS_ERROR (res, "Function requires KMIP request"); return false; } return true; } /* Example of an error message: */ static bool kms_kmip_response_ok (kms_response_t *res) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint32_t result_status; uint32_t result_reason = 0; const char *result_message = ""; uint32_t result_message_len = 0; bool ok = false; reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } /* Look for optional Result Reason. */ if (kmip_reader_find (reader, KMIP_TAG_ResultReason, KMIP_ITEM_TYPE_Enumeration, &pos, &len)) { if (!kmip_reader_read_enumeration (reader, &result_reason)) { KMS_ERROR (res, "unable to read result reason value"); goto fail; } } /* Look for optional Result Message. */ if (kmip_reader_find (reader, KMIP_TAG_ResultMessage, KMIP_ITEM_TYPE_TextString, &pos, &len)) { if (!kmip_reader_read_string ( reader, (uint8_t **) &result_message, len)) { KMS_ERROR (res, "unable to read result message value"); goto fail; } result_message_len = (uint32_t) len; } /* Look for required Result Status. */ if (!kmip_reader_find (reader, KMIP_TAG_ResultStatus, KMIP_ITEM_TYPE_Enumeration, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResultStatus)); goto fail; } if (!kmip_reader_read_enumeration (reader, &result_status)) { KMS_ERROR (res, "unable to read result status value"); goto fail; } if (result_status != KMIP_RESULT_STATUS_OperationSuccess) { KMS_ERROR (res, "KMIP response error. Result Status (%" PRIu32 "): %s. Result Reason (%" PRIu32 "): %s. Result Message: %.*s", result_status, kmip_result_status_to_string (result_status), result_reason, kmip_result_reason_to_string (result_reason), result_message_len, result_message); goto fail; } ok = true; fail: kmip_reader_destroy (reader); return ok; } /* Example of a successful response to a Register request: */ char * kms_kmip_response_get_unique_identifier (kms_response_t *res) { kmip_reader_t *reader = NULL; size_t pos; size_t len; char *uid = NULL; kms_request_str_t *nullterminated = NULL; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_UniqueIdentifier, KMIP_ITEM_TYPE_TextString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_UniqueIdentifier)); goto fail; } if (!kmip_reader_read_string (reader, (uint8_t **) &uid, len)) { KMS_ERROR (res, "unable to read unique identifier"); goto fail; } KMS_ASSERT (len <= SSIZE_MAX); nullterminated = kms_request_str_new_from_chars (uid, (ssize_t) len); fail: kmip_reader_destroy (reader); return kms_request_str_detach (nullterminated); } /* Example of a successful response to an Encrypt request: */ uint8_t * kms_kmip_response_get_iv (kms_response_t *res, size_t *datalen) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint8_t *data = NULL; uint8_t *tmp; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_IVCounterNonce, KMIP_ITEM_TYPE_ByteString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_Data)); goto fail; } if (!kmip_reader_read_bytes (reader, &tmp, len)) { KMS_ERROR (res, "unable to read data bytes"); goto fail; } data = malloc (len); KMS_ASSERT (data); memcpy (data, tmp, len); *datalen = len; fail: kmip_reader_destroy (reader); return data; } /* Example of a successful response to a Decrypt request: */ uint8_t * kms_kmip_response_get_data (kms_response_t *res, size_t *datalen) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint8_t *data = NULL; uint8_t *tmp; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_Data, KMIP_ITEM_TYPE_ByteString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_Data)); goto fail; } if (!kmip_reader_read_bytes (reader, &tmp, len)) { KMS_ERROR (res, "unable to read data bytes"); goto fail; } data = malloc (len); KMS_ASSERT (data); memcpy (data, tmp, len); *datalen = len; fail: kmip_reader_destroy (reader); return data; } /* Example of a successful response to a Get request: */ uint8_t * kms_kmip_response_get_secretdata (kms_response_t *res, size_t *secretdatalen) { kmip_reader_t *reader = NULL; size_t pos; size_t len; uint8_t *secretdata = NULL; uint8_t *tmp; if (!check_and_require_kmip (res)) { goto fail; } if (!kms_kmip_response_ok (res)) { goto fail; } reader = kmip_reader_new (res->kmip.data, res->kmip.len); if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponseMessage)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponseMessage)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_BatchItem)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_BatchItem)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_ResponsePayload)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_ResponsePayload)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_SecretData)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_SecretData)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_KeyBlock)) { KMS_ERROR ( res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyBlock)); goto fail; } if (!kmip_reader_find_and_recurse (reader, KMIP_TAG_KeyValue)) { KMS_ERROR ( res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyValue)); goto fail; } if (!kmip_reader_find (reader, KMIP_TAG_KeyMaterial, KMIP_ITEM_TYPE_ByteString, &pos, &len)) { KMS_ERROR (res, "unable to find tag: %s", kmip_tag_to_string (KMIP_TAG_KeyMaterial)); goto fail; } if (!kmip_reader_read_bytes (reader, &tmp, len)) { KMS_ERROR (res, "unable to read secretdata bytes"); goto fail; } secretdata = malloc (len); KMS_ASSERT (secretdata); memcpy (secretdata, tmp, len); *secretdatalen = len; fail: kmip_reader_destroy (reader); return secretdata; } mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_response_parser.c000066400000000000000000000105721511661753600254260ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_kmip_response_parser.h" #include "kms_endian_private.h" #include "kms_kmip_response_parser_private.h" #include "kms_message_private.h" #include "kms_request_str.h" struct _kms_kmip_response_parser_t { uint32_t first_len; uint32_t bytes_fed; kms_request_str_t *buf; bool failed; char error[512]; }; /* FIRST_LENGTH_OFFSET is the offset of the first Length in a TTLV sequence. The * sequence is: Tag (3 bytes), Type (1 byte), Length (4 bytes), Value (Length * bytes). */ static const uint32_t FIRST_LENGTH_OFFSET = 4; /* _parser_destroy destroys the fields of parser, but not the parser itself. */ static void _parser_destroy (kms_kmip_response_parser_t *parser) { kms_request_str_destroy (parser->buf); } /* _parser_init initializes the members of parser. */ static void _parser_init (kms_kmip_response_parser_t *parser) { memset (parser, 0, sizeof (*parser)); parser->buf = kms_request_str_new (); } kms_response_parser_t * kms_kmip_response_parser_new (void *reserved) { kms_response_parser_t *parser = kms_response_parser_new (); parser->kmip = malloc (sizeof (kms_kmip_response_parser_t)); KMS_ASSERT (parser->kmip); _parser_init (parser->kmip); return parser; } int32_t kms_kmip_response_parser_wants_bytes (const kms_kmip_response_parser_t *parser, int32_t max) { int32_t wants_bytes; uint32_t total_len; uint32_t want_bytes_pending; if (parser->bytes_fed < KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { wants_bytes = KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - (int32_t) parser->bytes_fed; } else { KMS_ASSERT (parser->first_len <= UINT32_MAX - KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH); total_len = parser->first_len + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH; KMS_ASSERT (total_len >= parser->bytes_fed); want_bytes_pending = total_len - parser->bytes_fed; KMS_ASSERT (want_bytes_pending <= (uint32_t) INT32_MAX); wants_bytes = (int32_t) want_bytes_pending; } if (max < wants_bytes) { return max; } return wants_bytes; } bool kms_kmip_response_parser_feed (kms_kmip_response_parser_t *parser, const uint8_t *buf, uint32_t len) { kms_request_str_append_chars (parser->buf, (char *) buf, len); parser->bytes_fed += len; if (parser->first_len > 0) { if (parser->bytes_fed > parser->first_len + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { KMS_ERROR (parser, "KMIP parser was fed too much data"); return false; } } else if (parser->first_len == 0 && parser->bytes_fed >= KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH) { uint32_t temp; memcpy (&temp, parser->buf->str + FIRST_LENGTH_OFFSET, sizeof (uint32_t)); parser->first_len = KMS_UINT32_FROM_BE (temp); } return true; } kms_response_t * kms_kmip_response_parser_get_response (kms_kmip_response_parser_t *parser) { kms_response_t *res; if (kms_kmip_response_parser_wants_bytes (parser, 1) != 0) { KMS_ERROR (parser, "KMIP parser does not have a complete message"); return NULL; } res = calloc (1, sizeof (kms_response_t)); KMS_ASSERT (res); res->provider = KMS_REQUEST_PROVIDER_KMIP; res->kmip.len = (uint32_t) parser->buf->len; res->kmip.data = (uint8_t *) kms_request_str_detach (parser->buf); parser->buf = NULL; /* Reinitialize for reuse. */ _parser_destroy (parser); _parser_init (parser); return res; } const char * kms_kmip_response_parser_error (const kms_kmip_response_parser_t *parser) { return parser->failed ? parser->error : NULL; } void kms_kmip_response_parser_destroy (kms_kmip_response_parser_t *parser) { if (!parser) { return; } _parser_destroy (parser); free (parser); } mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_response_parser_private.h000066400000000000000000000037031511661753600271630ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_PARSER_PRIVATE_H #define KMS_KMIP_RESPONSE_PARSER_PRIVATE_H #include "kms_message/kms_response.h" #include #include /* kms_kmip_response_parser_t is a private type used for parsing a KMIP * response. */ typedef struct _kms_kmip_response_parser_t kms_kmip_response_parser_t; /* KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH is the number of bytes needed by the * parser to determine the total length of the message being parsed. * It includes the first Length in a TTLV sequence. The sequence is: Tag (3 * bytes), Type (1 byte), Length (4 bytes), Value (Length bytes). */ #define KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH 8 int32_t kms_kmip_response_parser_wants_bytes (const kms_kmip_response_parser_t *parser, int32_t max); bool kms_kmip_response_parser_feed (kms_kmip_response_parser_t *parser, const uint8_t *buf, uint32_t len); /* kms_kmip_response_parser_get_response returns a kms_response_t and resets the * parser. */ kms_response_t * kms_kmip_response_parser_get_response (kms_kmip_response_parser_t *parser); void kms_kmip_response_parser_destroy (kms_kmip_response_parser_t *parser); const char * kms_kmip_response_parser_error (const kms_kmip_response_parser_t *parser); #endif /* KMS_KMIP_RESPONSE_PARSER_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_result_reason_private.h000066400000000000000000000076571511661753600266520ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESULT_REASON_PRIVATE_H #define KMS_KMIP_RESULT_REASON_PRIVATE_H #include "kms_message/kms_message_defines.h" /* clang-format off */ #define KMS_XMACRO \ KMS_X (ItemNotFound, "Item Not Found", 0x00000001) \ KMS_X (ResponseTooLarge, "Response Too Large", 0x00000002) \ KMS_X (AuthenticationNotSuccessful, "Authentication Not Successful", 0x00000003) \ KMS_X (InvalidMessage, "Invalid Message", 0x00000004) \ KMS_X (OperationNotSupported, "Operation Not Supported", 0x00000005) \ KMS_X (MissingData, "Missing Data", 0x00000006) \ KMS_X (InvalidField, "Invalid Field", 0x00000007) \ KMS_X (FeatureNotSupported, "Feature Not Supported", 0x00000008) \ KMS_X (OperationCanceledByRequester, "Operation Canceled By Requester", 0x00000009) \ KMS_X (CryptographicFailure, "Cryptographic Failure", 0x0000000A) \ KMS_X (IllegalOperation, "Illegal Operation", 0x0000000B) \ KMS_X (PermissionDenied, "Permission Denied", 0x0000000C) \ KMS_X (Objectarchived, "Object archived", 0x0000000D) \ KMS_X (IndexOutofBounds, "Index Out of Bounds", 0x0000000E) \ KMS_X (ApplicationNamespaceNotSupported, "Application Namespace Not Supported", 0x0000000F) \ KMS_X (KeyFormatTypeNotSupported, "Key Format Type Not Supported", 0x00000010) \ KMS_X (KeyCompressionTypeNotSupported, "Key Compression Type Not Supported", 0x00000011) \ KMS_X (EncodingOptionError, "Encoding Option Error", 0x00000012) \ KMS_X (KeyValueNotPresent, "Key Value Not Present", 0x00000013) \ KMS_X (AttestationRequired, "Attestation Required", 0x00000014) \ KMS_X (AttestationFailed, "Attestation Failed", 0x00000015) \ KMS_X (Sensitive, "Sensitive", 0x00000016) \ KMS_X (NotExtractable, "Not Extractable", 0x00000017) \ KMS_X (ObjectAlreadyExists, "Object Already Exists", 0x00000018) \ KMS_X_LAST (GeneralFailure, "General Failure", 0x00000100) /* clang-format on */ /* Generate an enum with each result_reason value. */ #define KMS_X(RESULT_REASON, STR, VAL) KMIP_RESULT_REASON_##RESULT_REASON = VAL, #define KMS_X_LAST(RESULT_REASON, STR, VAL) \ KMIP_RESULT_REASON_##RESULT_REASON = VAL typedef enum { KMS_XMACRO } kmip_result_reason_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(RESULT_REASON, STR, VAL) \ case KMIP_RESULT_REASON_##RESULT_REASON: \ return STR; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_result_reason_to_string (kmip_result_reason_t result_reason) { switch (result_reason) { default: return "Unknown KMIP result reason"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_RESULT_REASON_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_result_status_private.h000066400000000000000000000034071511661753600266730ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESULT_STATUS_PRIVATE_H #define KMS_KMIP_RESULT_STATUS_PRIVATE_H #include "kms_message/kms_message_defines.h" #define KMS_XMACRO \ KMS_X (OperationSuccess, "Success", 0x00000000) \ KMS_X (OperationFailed, "Operation Failed", 0x00000001) \ KMS_X (OperationPending, "Operation Pending", 0x00000002) \ KMS_X_LAST (OperationUndone, "Operation Undone", 0x00000003) /* Generate an enum with each result_status value. */ #define KMS_X(RESULT_STATUS, STR, VAL) KMIP_RESULT_STATUS_##RESULT_STATUS = VAL, #define KMS_X_LAST(RESULT_STATUS, STR, VAL) \ KMIP_RESULT_STATUS_##RESULT_STATUS = VAL typedef enum { KMS_XMACRO } kmip_result_status_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(RESULT_STATUS, STR, VAL) \ case KMIP_RESULT_STATUS_##RESULT_STATUS: \ return STR; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_result_status_to_string (kmip_result_status_t result_status) { switch (result_status) { default: return "Unknown KMIP result status"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_RESULT_STATUS_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kmip_tag_type_private.h000066400000000000000000000703661511661753600255760ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_TAG_TYPE_PRIVATE_H #define KMS_KMIP_TAG_TYPE_PRIVATE_H #include "kms_message/kms_message_defines.h" /* clang-format off */ #define KMS_XMACRO \ KMS_X (ActivationDate, 0x420001) \ KMS_X (ApplicationData, 0x420002) \ KMS_X (ApplicationNamespace, 0x420003) \ KMS_X (ApplicationSpecificInformation, 0x420004) \ KMS_X (ArchiveDate, 0x420005) \ KMS_X (AsynchronousCorrelationValue, 0x420006) \ KMS_X (AsynchronousIndicator, 0x420007) \ KMS_X (Attribute, 0x420008) \ KMS_X (AttributeIndex, 0x420009) \ KMS_X (AttributeName, 0x42000A) \ KMS_X (AttributeValue, 0x42000B) \ KMS_X (Authentication, 0x42000C) \ KMS_X (BatchCount, 0x42000D) \ KMS_X (BatchErrorContinuationOption, 0x42000E) \ KMS_X (BatchItem, 0x42000F) \ KMS_X (BatchOrderOption, 0x420010) \ KMS_X (BlockCipherMode, 0x420011) \ KMS_X (CancellationResult, 0x420012) \ KMS_X (Certificate, 0x420013) \ KMS_X (CertificateIdentifier, 0x420014) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuer, 0x420015) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuerAlternativeName, 0x420016) /* deprecated as of version 1.1 */ \ KMS_X (CertificateIssuerDistinguishedName, 0x420017) /* deprecated as of version 1.1 */ \ KMS_X (CertificateRequest, 0x420018) \ KMS_X (CertificateRequestType, 0x420019) \ KMS_X (CertificateSubject, 0x42001A) /* deprecated as of version 1.1 */ \ KMS_X (CertificateSubjectAlternativeName, 0x42001B) /* deprecated as of version 1.1 */ \ KMS_X (CertificateSubjectDistinguishedName, 0x42001C) /* deprecated as of version 1.1 */ \ KMS_X (CertificateType, 0x42001D) \ KMS_X (CertificateValue, 0x42001E) \ KMS_X (CommonTemplateAttribute, 0x42001F) \ KMS_X (CompromiseDate, 0x420020) \ KMS_X (CompromiseOccurrenceDate, 0x420021) \ KMS_X (ContactInformation, 0x420022) \ KMS_X (Credential, 0x420023) \ KMS_X (CredentialType, 0x420024) \ KMS_X (CredentialValue, 0x420025) \ KMS_X (CriticalityIndicator, 0x420026) \ KMS_X (CRTCoefficient, 0x420027) \ KMS_X (CryptographicAlgorithm, 0x420028) \ KMS_X (CryptographicDomainParameters, 0x420029) \ KMS_X (CryptographicLength, 0x42002A) \ KMS_X (CryptographicParameters, 0x42002B) \ KMS_X (CryptographicUsageMask, 0x42002C) \ KMS_X (CustomAttribute, 0x42002D) \ KMS_X (D, 0x42002E) \ KMS_X (DeactivationDate, 0x42002F) \ KMS_X (DerivationData, 0x420030) \ KMS_X (DerivationMethod, 0x420031) \ KMS_X (DerivationParameters, 0x420032) \ KMS_X (DestroyDate, 0x420033) \ KMS_X (Digest, 0x420034) \ KMS_X (DigestValue, 0x420035) \ KMS_X (EncryptionKeyInformation, 0x420036) \ KMS_X (G, 0x420037) \ KMS_X (HashingAlgorithm, 0x420038) \ KMS_X (InitialDate, 0x420039) \ KMS_X (InitializationVector, 0x42003A) \ KMS_X (Issuer, 0x42003B) /* deprecated as of version 1.1 */ \ KMS_X (IterationCount, 0x42003C) \ KMS_X (IVCounterNonce, 0x42003D) \ KMS_X (J, 0x42003E) \ KMS_X (Key, 0x42003F) \ KMS_X (KeyBlock, 0x420040) \ KMS_X (KeyCompressionType, 0x420041) \ KMS_X (KeyFormatType, 0x420042) \ KMS_X (KeyMaterial, 0x420043) \ KMS_X (KeyPartIdentifier, 0x420044) \ KMS_X (KeyValue, 0x420045) \ KMS_X (KeyWrappingData, 0x420046) \ KMS_X (KeyWrappingSpecification, 0x420047) \ KMS_X (LastChangeDate, 0x420048) \ KMS_X (LeaseTime, 0x420049) \ KMS_X (Link, 0x42004A) \ KMS_X (LinkType, 0x42004B) \ KMS_X (LinkedObjectIdentifier, 0x42004C) \ KMS_X (MACSignature, 0x42004D) \ KMS_X (MACSignatureKeyInformation, 0x42004E) \ KMS_X (MaximumItems, 0x42004F) \ KMS_X (MaximumResponseSize, 0x420050) \ KMS_X (MessageExtension, 0x420051) \ KMS_X (Modulus, 0x420052) \ KMS_X (Name, 0x420053) \ KMS_X (NameType, 0x420054) \ KMS_X (NameValue, 0x420055) \ KMS_X (ObjectGroup, 0x420056) \ KMS_X (ObjectType, 0x420057) \ KMS_X (Offset, 0x420058) \ KMS_X (OpaqueDataType, 0x420059) \ KMS_X (OpaqueDataValue, 0x42005A) \ KMS_X (OpaqueObject, 0x42005B) \ KMS_X (Operation, 0x42005C) \ KMS_X (OperationPolicyName, 0x42005D) /* deprecated */ \ KMS_X (P, 0x42005E) \ KMS_X (PaddingMethod, 0x42005F) \ KMS_X (PrimeExponentP, 0x420060) \ KMS_X (PrimeExponentQ, 0x420061) \ KMS_X (PrimeFieldSize, 0x420062) \ KMS_X (PrivateExponent, 0x420063) \ KMS_X (PrivateKey, 0x420064) \ KMS_X (PrivateKeyTemplateAttribute, 0x420065) \ KMS_X (PrivateKeyUniqueIdentifier, 0x420066) \ KMS_X (ProcessStartDate, 0x420067) \ KMS_X (ProtectStopDate, 0x420068) \ KMS_X (ProtocolVersion, 0x420069) \ KMS_X (ProtocolVersionMajor, 0x42006A) \ KMS_X (ProtocolVersionMinor, 0x42006B) \ KMS_X (PublicExponent, 0x42006C) \ KMS_X (PublicKey, 0x42006D) \ KMS_X (PublicKeyTemplateAttribute, 0x42006E) \ KMS_X (PublicKeyUniqueIdentifier, 0x42006F) \ KMS_X (PutFunction, 0x420070) \ KMS_X (Q, 0x420071) \ KMS_X (QString, 0x420072) \ KMS_X (Qlength, 0x420073) \ KMS_X (QueryFunction, 0x420074) \ KMS_X (RecommendedCurve, 0x420075) \ KMS_X (ReplacedUniqueIdentifier, 0x420076) \ KMS_X (RequestHeader, 0x420077) \ KMS_X (RequestMessage, 0x420078) \ KMS_X (RequestPayload, 0x420079) \ KMS_X (ResponseHeader, 0x42007A) \ KMS_X (ResponseMessage, 0x42007B) \ KMS_X (ResponsePayload, 0x42007C) \ KMS_X (ResultMessage, 0x42007D) \ KMS_X (ResultReason, 0x42007E) \ KMS_X (ResultStatus, 0x42007F) \ KMS_X (RevocationMessage, 0x420080) \ KMS_X (RevocationReason, 0x420081) \ KMS_X (RevocationReasonCode, 0x420082) \ KMS_X (KeyRoleType, 0x420083) \ KMS_X (Salt, 0x420084) \ KMS_X (SecretData, 0x420085) \ KMS_X (SecretDataType, 0x420086) \ KMS_X (SerialNumber, 0x420087) /* deprecated as of version 1.1 */ \ KMS_X (ServerInformation, 0x420088) \ KMS_X (SplitKey, 0x420089) \ KMS_X (SplitKeyMethod, 0x42008A) \ KMS_X (SplitKeyParts, 0x42008B) \ KMS_X (SplitKeyThreshold, 0x42008C) \ KMS_X (State, 0x42008D) \ KMS_X (StorageStatusMask, 0x42008E) \ KMS_X (SymmetricKey, 0x42008F) \ KMS_X (Template, 0x420090) \ KMS_X (TemplateAttribute, 0x420091) \ KMS_X (TimeStamp, 0x420092) \ KMS_X (UniqueBatchItemID, 0x420093) \ KMS_X (UniqueIdentifier, 0x420094) \ KMS_X (UsageLimits, 0x420095) \ KMS_X (UsageLimitsCount, 0x420096) \ KMS_X (UsageLimitsTotal, 0x420097) \ KMS_X (UsageLimitsUnit, 0x420098) \ KMS_X (Username, 0x420099) \ KMS_X (ValidityDate, 0x42009A) \ KMS_X (ValidityIndicator, 0x42009B) \ KMS_X (VendorExtension, 0x42009C) \ KMS_X (VendorIdentification, 0x42009D) \ KMS_X (WrappingMethod, 0x42009E) \ KMS_X (X, 0x42009F) \ KMS_X (Y, 0x4200A0) \ KMS_X (Password, 0x4200A1) \ KMS_X (DeviceIdentifier, 0x4200A2) \ KMS_X (EncodingOption, 0x4200A3) \ KMS_X (ExtensionInformation, 0x4200A4) \ KMS_X (ExtensionName, 0x4200A5) \ KMS_X (ExtensionTag, 0x4200A6) \ KMS_X (ExtensionType, 0x4200A7) \ KMS_X (Fresh, 0x4200A8) \ KMS_X (MachineIdentifier, 0x4200A9) \ KMS_X (MediaIdentifier, 0x4200AA) \ KMS_X (NetworkIdentifier, 0x4200AB) \ KMS_X (ObjectGroupMember, 0x4200AC) \ KMS_X (CertificateLength, 0x4200AD) \ KMS_X (DigitalSignatureAlgorithm, 0x4200AE) \ KMS_X (CertificateSerialNumber, 0x4200AF) \ KMS_X (DeviceSerialNumber, 0x4200B0) \ KMS_X (IssuerAlternativeName, 0x4200B1) \ KMS_X (IssuerDistinguishedName, 0x4200B2) \ KMS_X (SubjectAlternativeName, 0x4200B3) \ KMS_X (SubjectDistinguishedName, 0x4200B4) \ KMS_X (X509CertificateIdentifier, 0x4200B5) \ KMS_X (X509CertificateIssuer, 0x4200B6) \ KMS_X (X509CertificateSubject, 0x4200B7) \ KMS_X (KeyValueLocation, 0x4200B8) \ KMS_X (KeyValueLocationValue, 0x4200B9) \ KMS_X (KeyValueLocationType, 0x4200BA) \ KMS_X (KeyValuePresent, 0x4200BB) \ KMS_X (OriginalCreationDate, 0x4200BC) \ KMS_X (PGPKey, 0x4200BD) \ KMS_X (PGPKeyVersion, 0x4200BE) \ KMS_X (AlternativeName, 0x4200BF) \ KMS_X (AlternativeNameValue, 0x4200C0) \ KMS_X (AlternativeNameType, 0x4200C1) \ KMS_X (Data, 0x4200C2) \ KMS_X (SignatureData, 0x4200C3) \ KMS_X (DataLength, 0x4200C4) \ KMS_X (RandomIV, 0x4200C5) \ KMS_X (MACData, 0x4200C6) \ KMS_X (AttestationType, 0x4200C7) \ KMS_X (Nonce, 0x4200C8) \ KMS_X (NonceID, 0x4200C9) \ KMS_X (NonceValue, 0x4200CA) \ KMS_X (AttestationMeasurement, 0x4200CB) \ KMS_X (AttestationAssertion, 0x4200CC) \ KMS_X (IVLength, 0x4200CD) \ KMS_X (TagLength, 0x4200CE) \ KMS_X (FixedFieldLength, 0x4200CF) \ KMS_X (CounterLength, 0x4200D0) \ KMS_X (InitialCounterValue, 0x4200D1) \ KMS_X (InvocationFieldLength, 0x4200D2) \ KMS_X (AttestationCapableIndicator, 0x4200D3) \ KMS_X (OffsetItems, 0x4200D4) \ KMS_X (LocatedItems, 0x4200D5) \ KMS_X (CorrelationValue, 0x4200D6) \ KMS_X (InitIndicator, 0x4200D7) \ KMS_X (FinalIndicator, 0x4200D8) \ KMS_X (RNGParameters, 0x4200D9) \ KMS_X (RNGAlgorithm, 0x4200DA) \ KMS_X (DRBGAlgorithm, 0x4200DB) \ KMS_X (FIPS186Variation, 0x4200DC) \ KMS_X (PredictionResistance, 0x4200DD) \ KMS_X (RandomNumberGenerator, 0x4200DE) \ KMS_X (ValidationInformation, 0x4200DF) \ KMS_X (ValidationAuthorityType, 0x4200E0) \ KMS_X (ValidationAuthorityCountry, 0x4200E1) \ KMS_X (ValidationAuthorityURI, 0x4200E2) \ KMS_X (ValidationVersionMajor, 0x4200E3) \ KMS_X (ValidationVersionMinor, 0x4200E4) \ KMS_X (ValidationType, 0x4200E5) \ KMS_X (ValidationLevel, 0x4200E6) \ KMS_X (ValidationCertificateIdentifier, 0x4200E7) \ KMS_X (ValidationCertificateURI, 0x4200E8) \ KMS_X (ValidationVendorURI, 0x4200E9) \ KMS_X (ValidationProfile, 0x4200EA) \ KMS_X (ProfileInformation, 0x4200EB) \ KMS_X (ProfileName, 0x4200EC) \ KMS_X (ServerURI, 0x4200ED) \ KMS_X (ServerPort, 0x4200EE) \ KMS_X (StreamingCapability, 0x4200EF) \ KMS_X (AsynchronousCapability, 0x4200F0) \ KMS_X (AttestationCapability, 0x4200F1) \ KMS_X (UnwrapMode, 0x4200F2) \ KMS_X (DestroyAction, 0x4200F3) \ KMS_X (ShreddingAlgorithm, 0x4200F4) \ KMS_X (RNGMode, 0x4200F5) \ KMS_X (ClientRegistrationMethod, 0x4200F6) \ KMS_X (CapabilityInformation, 0x4200F7) \ KMS_X (KeyWrapType, 0x4200F8) \ KMS_X (BatchUndoCapability, 0x4200F9) \ KMS_X (BatchContinueCapability, 0x4200FA) \ KMS_X (PKCS12FriendlyName, 0x4200FB) \ KMS_X (Description, 0x4200FC) \ KMS_X (Comment, 0x4200FD) \ KMS_X (AuthenticatedEncryptionAdditionalData, 0x4200FE) \ KMS_X (AuthenticatedEncryptionTag, 0x4200FF) \ KMS_X (SaltLength, 0x420100) \ KMS_X (MaskGenerator, 0x420101) \ KMS_X (MaskGeneratorHashingAlgorithm, 0x420102) \ KMS_X (PSource, 0x420103) \ KMS_X (TrailerField, 0x420104) \ KMS_X (ClientCorrelationValue, 0x420105) \ KMS_X (ServerCorrelationValue, 0x420106) \ KMS_X (DigestedData, 0x420107) \ KMS_X (CertificateSubjectCN, 0x420108) \ KMS_X (CertificateSubjectO, 0x420109) \ KMS_X (CertificateSubjectOU, 0x42010A) \ KMS_X (CertificateSubjectEmail, 0x42010B) \ KMS_X (CertificateSubjectC, 0x42010C) \ KMS_X (CertificateSubjectST, 0x42010D) \ KMS_X (CertificateSubjectL, 0x42010E) \ KMS_X (CertificateSubjectUID, 0x42010F) \ KMS_X (CertificateSubjectSerialNumber, 0x420110) \ KMS_X (CertificateSubjectTitle, 0x420111) \ KMS_X (CertificateSubjectDC, 0x420112) \ KMS_X (CertificateSubjectDNQualifier, 0x420113) \ KMS_X (CertificateIssuerCN, 0x420114) \ KMS_X (CertificateIssuerO, 0x420115) \ KMS_X (CertificateIssuerOU, 0x420116) \ KMS_X (CertificateIssuerEmail, 0x420117) \ KMS_X (CertificateIssuerC, 0x420118) \ KMS_X (CertificateIssuerST, 0x420119) \ KMS_X (CertificateIssuerL, 0x42011A) \ KMS_X (CertificateIssuerUID, 0x42011B) \ KMS_X (CertificateIssuerSerialNumber, 0x42011C) \ KMS_X (CertificateIssuerTitle, 0x42011D) \ KMS_X (CertificateIssuerDC, 0x42011E) \ KMS_X (CertificateIssuerDNQualifier, 0x42011F) \ KMS_X (Sensitive, 0x420120) \ KMS_X (AlwaysSensitive, 0x420121) \ KMS_X (Extractable, 0x420122) \ KMS_X (NeverExtractable, 0x420123) \ KMS_X (ReplaceExisting, 0x420124) \ KMS_X_LAST (Attributes, 0x420125) /* clang-format on */ /* Generate an enum with each tag value. */ #define KMS_X(TAG, VAL) KMIP_TAG_##TAG = VAL, #define KMS_X_LAST(TAG, VAL) KMIP_TAG_##TAG = VAL typedef enum { KMS_XMACRO } kmip_tag_type_t; #undef KMS_X #undef KMS_X_LAST #define KMS_X(TAG, VAL) \ case KMIP_TAG_##TAG: \ return #TAG; #define KMS_X_LAST KMS_X static KMS_MSG_INLINE const char * kmip_tag_to_string (kmip_tag_type_t tag) { switch (tag) { default: return "Unknown KMIP tag"; KMS_XMACRO } } #undef KMS_X #undef KMS_X_LAST #undef KMS_XMACRO #endif /* KMS_KMIP_TAG_TYPE_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_kv_list.c000066400000000000000000000062741511661753600226530ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_kv_list.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" #include "kms_port.h" #include "sort.h" static void kv_init (kms_kv_t *kv, kms_request_str_t *key, kms_request_str_t *value) { kv->key = kms_request_str_dup (key); kv->value = kms_request_str_dup (value); } static void kv_cleanup (kms_kv_t *kv) { kms_request_str_destroy (kv->key); kms_request_str_destroy (kv->value); } kms_kv_list_t * kms_kv_list_new (void) { kms_kv_list_t *lst = malloc (sizeof (kms_kv_list_t)); KMS_ASSERT (lst); lst->size = 16; lst->kvs = malloc (lst->size * sizeof (kms_kv_t)); KMS_ASSERT (lst->kvs); lst->len = 0; return lst; } void kms_kv_list_destroy (kms_kv_list_t *lst) { size_t i; if (!lst) { return; } for (i = 0; i < lst->len; i++) { kv_cleanup (&lst->kvs[i]); } free (lst->kvs); free (lst); } void kms_kv_list_add (kms_kv_list_t *lst, kms_request_str_t *key, kms_request_str_t *value) { if (lst->len == lst->size) { lst->size *= 2; lst->kvs = realloc (lst->kvs, lst->size * sizeof (kms_kv_t)); KMS_ASSERT (lst->kvs); } kv_init (&lst->kvs[lst->len], key, value); ++lst->len; } const kms_kv_t * kms_kv_list_find (const kms_kv_list_t *lst, const char *key) { size_t i; for (i = 0; i < lst->len; i++) { if (0 == kms_strcasecmp (lst->kvs[i].key->str, key)) { return &lst->kvs[i]; } } return NULL; } void kms_kv_list_del (kms_kv_list_t *lst, const char *key) { size_t i; for (i = 0; i < lst->len; i++) { if (0 == strcmp (lst->kvs[i].key->str, key)) { kv_cleanup (&lst->kvs[i]); memmove (&lst->kvs[i], &lst->kvs[i + 1], sizeof (kms_kv_t) * (lst->len - i - 1)); lst->len--; } } } kms_kv_list_t * kms_kv_list_dup (const kms_kv_list_t *lst) { kms_kv_list_t *dup; size_t i; if (lst->len == 0) { return kms_kv_list_new (); } dup = malloc (sizeof (kms_kv_list_t)); KMS_ASSERT (dup); dup->size = dup->len = lst->len; dup->kvs = malloc (lst->len * sizeof (kms_kv_t)); KMS_ASSERT (dup->kvs); for (i = 0; i < lst->len; i++) { kv_init (&dup->kvs[i], lst->kvs[i].key, lst->kvs[i].value); } return dup; } void kms_kv_list_sort (kms_kv_list_t *lst, int (*cmp) (const void *, const void *)) { /* A stable sort is required to sort headers when creating canonical * requests. qsort is not stable. */ insertionsort ( (unsigned char *) (lst->kvs), lst->len, sizeof (kms_kv_t), cmp); } mongo-c-driver-2.2.1/src/kms-message/src/kms_kv_list.h000066400000000000000000000027271511661753600226570ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KV_LIST_H #define KMS_KV_LIST_H #include "kms_message/kms_message.h" #include "kms_request_str.h" #include #include #include /* key-value pair */ typedef struct { kms_request_str_t *key; kms_request_str_t *value; } kms_kv_t; typedef struct { kms_kv_t *kvs; size_t len; size_t size; } kms_kv_list_t; kms_kv_list_t * kms_kv_list_new (void); void kms_kv_list_destroy (kms_kv_list_t *lst); void kms_kv_list_add (kms_kv_list_t *lst, kms_request_str_t *key, kms_request_str_t *value); const kms_kv_t * kms_kv_list_find (const kms_kv_list_t *lst, const char *key); void kms_kv_list_del (kms_kv_list_t *lst, const char *key); kms_kv_list_t * kms_kv_list_dup (const kms_kv_list_t *lst); void kms_kv_list_sort (kms_kv_list_t *lst, int (*cmp) (const void *, const void *)); #endif /* KMS_KV_LIST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message.c000066400000000000000000000021301511661753600226070ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_b64.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_crypto.h" #include #include void kms_set_error (char *error, size_t size, const char *fmt, ...) { va_list va; va_start (va, fmt); (void) vsnprintf (error, size, fmt, va); va_end (va); } int kms_message_init (void) { kms_message_b64_initialize_rmap (); return kms_crypto_init (); } void kms_message_cleanup (void) { kms_crypto_cleanup (); } mongo-c-driver-2.2.1/src/kms-message/src/kms_message/000077500000000000000000000000001511661753600224475ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_azure_request.h000066400000000000000000000104021511661753600263650ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_AZURE_REQUEST_H #define KMS_AZURE_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif /* Constructs an oauth client credentials grant request for Azure. * See * https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow#get-a-token. * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header. This should be a custom host or * "login.microsoftonline.com". * - scope: The oauth scope. This should be a custom scope or * "https%3A%2F%2Fvault.azure.net%2F.default". Must be URL encoded. * - tenant_id: The Azure tenant ID. * - client_id: The client ID to authenticate. * - client_secret: The client secret to authenticate. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_oauth_new (const char *host, const char *scope, const char *tenant_id, const char *client_id, const char *client_secret, const kms_request_opt_t *opt); /* Constructs a wrapkey request for Azure. * See https://docs.microsoft.com/en-us/rest/api/keyvault/wrapkey/wrapkey * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header, like "mykeyvault.vault.azure.net". * - access_token: The access_token obtained from an oauth response as a * base64url encoded string. * - key_name: The azure key name. * - key_version: An optional key version. May be NULL or empty string. * - plaintext: The plaintext key to encrypt. * - plaintext_len: The number of bytes of plaintext. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_wrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt); /* Constructs an unwrapkey request for Azure. * See https://docs.microsoft.com/en-us/rest/api/keyvault/unwrapkey/unwrapkey * * Parameters: * All parameters must be NULL terminated strings. * - host: The value of the Host header, like "mykeyvault.vault.azure.net". * - access_token: The access_token obtained from an oauth response as a * base64url encoded string. * - key_name: The azure key name. * - key_version: An optional key version. May be NULL or empty string. * - ciphertext: The ciphertext key to decrypt. * - ciphertext_len: The number of bytes of ciphertext. * - opt: Additional options. This must have the Azure provider set via * kms_request_opt_set_provider. */ KMS_MSG_EXPORT (kms_request_t *) kms_azure_request_unwrapkey_new (const char *host, const char *access_token, const char *key_name, const char *key_version, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_AZURE_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_b64.h000066400000000000000000000036711511661753600240740ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_B64_H #define KMS_MESSAGE_B64_H #include "kms_message.h" #include #include #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (void) kms_message_b64_initialize_rmap (void); KMS_MSG_EXPORT (int) kms_message_b64_ntop (uint8_t const *src, size_t srclength, char *target, size_t targsize); KMS_MSG_EXPORT (int) kms_message_b64_pton (char const *src, uint8_t *target, size_t targsize); /* src and target may be the same string. Assumes no whitespace in src. */ KMS_MSG_EXPORT (int) kms_message_b64_to_b64url (const char *src, size_t srclength, char *target, size_t targsize); KMS_MSG_EXPORT (int) kms_message_b64url_to_b64 (const char *src, size_t srclength, char *target, size_t targsize); /* Convenience conversions which return copies. */ char * kms_message_raw_to_b64 (const uint8_t *raw, size_t raw_len); uint8_t * kms_message_b64_to_raw (const char *b64, size_t *out); char * kms_message_raw_to_b64url (const uint8_t *raw, size_t raw_len); uint8_t * kms_message_b64url_to_raw (const char *b64url, size_t *out); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_MESSAGE_B64_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_caller_identity_request.h000066400000000000000000000017451511661753600304240ustar00rootroot00000000000000/* * Copyright 2019-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_CALLER_IDENTITY_REQUEST_H #define KMS_CALLER_IDENTITY_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_caller_identity_request_new (const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_CALLER_IDENTITY_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_decrypt_request.h000066400000000000000000000020421511661753600267120ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_DECRYPT_REQUEST_H #define KMS_DECRYPT_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_decrypt_request_new (const uint8_t *ciphertext_blob, size_t len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_DECRYPT_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_encrypt_request.h000066400000000000000000000021271511661753600267300ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_ENCRYPT_REQUEST_H #define KMS_ENCRYPT_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (kms_request_t *) kms_encrypt_request_new (const uint8_t *plaintext, size_t plaintext_length, const char *key_id, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_ENCRYPT_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_gcp_request.h000066400000000000000000000116221511661753600260150ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_GCP_REQUEST_H #define KMS_GCP_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include "kms_request_opt.h" #ifdef __cplusplus extern "C" { #endif /* Constructs an oauth client credentials request for GCP. * See https://developers.google.com/identity/protocols/oauth2/service-account * * Parameters: * - host: The host header, like "oauth2.googleapis.com". * - email: The email for the service account to authenticate. * - audience: The "aud" field in the JSON Web Token (JWT). Should be a URL * like "https://oauth2.googleapis.com/token" * - scope: The "scope" field in the JSON Web Token (JWT). Should be a URL * like "https://www.googleapis.com/auth/cloudkms". * - private_key_data: Bytes pointing to a PKCS#8 private key. * - private_key_len: The length of private_key_data. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. Callers that want to use a custom crypto * callback to sign the request should set the callback on opt with * kms_request_opt_set_crypto_hook_rsaes_pkcs1_v1_5. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_oauth_new (const char *host, const char *email, const char *audience, const char *scope, const char *private_key_data, size_t private_key_len, const kms_request_opt_t *opt); /* Constructs the encrypt request for GCP. * See * https://cloud.google.com/kms/docs/encrypt-decrypt#kms-encrypt-symmetric-api * * Parameters: * - host: The value of the Host header, like "cloudkms.googleapis.com". * - project_id: The project id. * - location: The location id, like "global". * - key_ring_name: The key ring name. * - key_name: The key name. * - key_version: The optional key version. May be NULL. * - plaintext: The plaintext key to encrypt. * - plaintext_len: The number of bytes of plaintext. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_encrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const char *key_version, const uint8_t *plaintext, size_t plaintext_len, const kms_request_opt_t *opt); /* Constructs the decrypt request for GCP. * See * https://cloud.google.com/kms/docs/encrypt-decrypt#kms-decrypt-symmetric-api * * Parameters: * - host: The value of the Host header, like "cloudkms.googleapis.com". * - project_id: The project id. * - location: The location id, like "global". * - key_ring_name: The key ring name. * - key_name: The key name. * - ciphertext: The ciphertext key to encrypt. * - ciphertext_len: The number of bytes of ciphertext. * - opt: Request options. The provider must be set to KMS_REQUEST_PROVIDER_GCP * with kms_request_opt_set_provider. * * Returns: A new kms_request_t. * Always returns a new kms_request_t, even on error. * Caller must check if an error occurred by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_gcp_request_decrypt_new (const char *host, const char *access_token, const char *project_id, const char *location, const char *key_ring_name, const char *key_name, const uint8_t *ciphertext, size_t ciphertext_len, const kms_request_opt_t *opt); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_GCP_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_kmip_request.h000066400000000000000000000051671511661753600262130ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_REQUEST_H #define KMS_KMIP_REQUEST_H #include "kms_message_defines.h" #include "kms_request.h" #include #ifdef __cplusplus extern "C" { #endif #define KMS_KMIP_REQUEST_SECRETDATA_LENGTH 96 /* kms_kmip_request_register_secretdata_new creates a KMIP Register request with * a SecretData payload of length KMS_KMIP_REQUEST_SECRETDATA_LENGTH. * - len must be KMS_KMIP_REQUEST_SECRETDATA_LENGTH. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_register_secretdata_new (void *reserved, const uint8_t *data, size_t len); /* kms_kmip_request_activate_new creates a KMIP Activate request with the * provided unique identifer. * - unique_identifier must be a NULL terminated string. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_activate_new (void *reserved, const char *unique_identifier); /* kms_kmip_request_get_new creates a KMIP Get request with the provided unique * identifer. * - unique_identifier must be a NULL terminated string. * - Callers must check for an error by calling kms_request_get_error. */ KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_get_new (void *reserved, const char *unique_identifier); KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_create_new (void *reserved); KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_encrypt_new (void *reserved, const char *unique_identifier, const uint8_t *plaintext, size_t len); KMS_MSG_EXPORT (kms_request_t *) kms_kmip_request_decrypt_new (void *reserved, const char *unique_identifier, const uint8_t *ciphertext, size_t len, const uint8_t *iv, size_t iv_len); #ifdef __cplusplus } #endif #endif /* KMS_KMIP_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_kmip_response.h000066400000000000000000000031271511661753600263530ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_H #define KMS_KMIP_RESPONSE_H #include "kms_message_defines.h" #include #include "kms_response.h" /* kms_kmip_response_get_unique_identifier returns the UniqueIdentifier in the * first BatchItem in a ResponseMessage. * - Returns a NULL terminated string that the caller must free. * - Returns NULL on error and sets an error on kms_response_t. */ KMS_MSG_EXPORT (char *) kms_kmip_response_get_unique_identifier (kms_response_t *res); /* kms_kmip_response_get_secretdata returns the KeyMaterial in the * first BatchItem in a ResponseMessage. * - Caller must free returned data. * - Returns NULL on error and sets an error on kms_response_t. */ KMS_MSG_EXPORT (uint8_t *) kms_kmip_response_get_secretdata (kms_response_t *res, size_t *secretdatalen); KMS_MSG_EXPORT (uint8_t *) kms_kmip_response_get_data (kms_response_t *res, size_t *datalen); KMS_MSG_EXPORT (uint8_t *) kms_kmip_response_get_iv (kms_response_t *res, size_t *datalen); #endif /* KMS_KMIP_RESPONSE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_kmip_response_parser.h000066400000000000000000000015471511661753600277330ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_KMIP_RESPONSE_PARSER_H #define KMS_KMIP_RESPONSE_PARSER_H #include "kms_message_defines.h" #include "kms_response_parser.h" KMS_MSG_EXPORT (kms_response_parser_t *) kms_kmip_response_parser_new (void *reserved); #endif /* KMS_KMIP_RESPONSE_PARSER_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_message.h000066400000000000000000000020351511661753600251160ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_H #define KMS_MESSAGE_H #include #include "kms_message_defines.h" #include "kms_kmip_request.h" #include "kms_kmip_response.h" #include "kms_kmip_response_parser.h" #include "kms_request_opt.h" #include "kms_request.h" #include "kms_response.h" #include "kms_response_parser.h" #include "kms_caller_identity_request.h" #include "kms_decrypt_request.h" #include "kms_encrypt_request.h" #endif /* KMS_MESSAGE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_message_defines.h000066400000000000000000000032201511661753600266100ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_DEFINES_H #define KMS_MESSAGE_DEFINES_H #ifdef _MSC_VER #ifdef KMS_MSG_STATIC #define KMS_MSG_API #elif defined(KMS_MSG_COMPILATION) #define KMS_MSG_API __declspec(dllexport) #else #define KMS_MSG_API __declspec(dllimport) #endif #define KMS_MSG_CALL __cdecl #elif defined(__GNUC__) #ifdef KMS_MSG_STATIC #define KMS_MSG_API #elif defined(KMS_MSG_COMPILATION) #define KMS_MSG_API __attribute__ ((visibility ("default"))) #else #define KMS_MSG_API #endif #define KMS_MSG_CALL #endif #define KMS_MSG_EXPORT(type) KMS_MSG_API type KMS_MSG_CALL #ifdef __cplusplus extern "C" { #endif KMS_MSG_EXPORT (int) kms_message_init (void); KMS_MSG_EXPORT (void) kms_message_cleanup (void); #ifdef __cplusplus } /* extern "C" */ #endif #ifdef _MSC_VER #include #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #pragma warning(default : 4142) #endif #if defined(_MSC_VER) #define KMS_MSG_INLINE __inline #else #define KMS_MSG_INLINE __inline__ #endif #endif /* KMS_MESSAGE_DEFINES_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_request.h000066400000000000000000000065151511661753600251710ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_H #define KMS_REQUEST_H #include "kms_message_defines.h" #include "kms_request_opt.h" #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* A KMS request is general enough to create arbitrary HTTP requests, but also * supports generating AWS signature v4. */ typedef struct _kms_request_t kms_request_t; KMS_MSG_EXPORT (kms_request_t *) kms_request_new (const char *method, const char *path_and_query, const kms_request_opt_t *opt); KMS_MSG_EXPORT (void) kms_request_destroy (kms_request_t *request); KMS_MSG_EXPORT (const char *) kms_request_get_error (kms_request_t *request); /* Begin: AWS specific */ KMS_MSG_EXPORT (bool) kms_request_set_date (kms_request_t *request, const struct tm *tm); KMS_MSG_EXPORT (bool) kms_request_set_region (kms_request_t *request, const char *region); KMS_MSG_EXPORT (bool) kms_request_set_service (kms_request_t *request, const char *service); KMS_MSG_EXPORT (bool) kms_request_set_access_key_id (kms_request_t *request, const char *akid); KMS_MSG_EXPORT (bool) kms_request_set_secret_key (kms_request_t *request, const char *key); /* End: AWS specific */ KMS_MSG_EXPORT (bool) kms_request_add_header_field (kms_request_t *request, const char *field_name, const char *value); KMS_MSG_EXPORT (bool) kms_request_append_header_field_value (kms_request_t *request, const char *value, size_t len); KMS_MSG_EXPORT (bool) kms_request_append_payload (kms_request_t *request, const char *payload, size_t len); /* Begin: AWS specific */ KMS_MSG_EXPORT (char *) kms_request_get_canonical (kms_request_t *request); KMS_MSG_EXPORT (const char *) kms_request_get_canonical_header (kms_request_t *request, const char *header); KMS_MSG_EXPORT (char *) kms_request_get_string_to_sign (kms_request_t *request); KMS_MSG_EXPORT (bool) kms_request_get_signing_key (kms_request_t *request, unsigned char *key); KMS_MSG_EXPORT (char *) kms_request_get_signature (kms_request_t *request); KMS_MSG_EXPORT (char *) kms_request_get_signed (kms_request_t *request); /* End: AWS specific */ KMS_MSG_EXPORT (void) kms_request_free_string (char *ptr); /* Finalize and obtain a plain HTTP request (no signing). */ KMS_MSG_EXPORT (char *) kms_request_to_string (kms_request_t *request); /* kms_request_to_bytes returns the data for a request. * - Returns NULL on error and sets an error on request. */ KMS_MSG_EXPORT (const uint8_t *) kms_request_to_bytes (kms_request_t *request, size_t *len); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_REQUEST_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_request_opt.h000066400000000000000000000055501511661753600260510ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_OPT_H #define KMS_REQUEST_OPT_H #include "kms_message_defines.h" #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_request_opt_t kms_request_opt_t; typedef size_t kms_request_provider_t; #define KMS_REQUEST_PROVIDER_AWS 0 #define KMS_REQUEST_PROVIDER_AZURE 1 #define KMS_REQUEST_PROVIDER_GCP 2 #define KMS_REQUEST_PROVIDER_KMIP 3 KMS_MSG_EXPORT (kms_request_opt_t *) kms_request_opt_new (void); /* The default provider is AWS. This will automatically set extra headers. * Returns false if provider is invalid. */ KMS_MSG_EXPORT (bool) kms_request_opt_set_provider (kms_request_opt_t *opt, kms_request_provider_t provider); KMS_MSG_EXPORT (void) kms_request_opt_destroy (kms_request_opt_t *request); KMS_MSG_EXPORT (void) kms_request_opt_set_connection_close (kms_request_opt_t *opt, bool connection_close); KMS_MSG_EXPORT (void) kms_request_opt_set_crypto_hooks (kms_request_opt_t *opt, bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out), bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out), void *ctx); KMS_MSG_EXPORT (void) kms_request_opt_set_crypto_hook_sign_rsaes_pkcs1_v1_5 ( kms_request_opt_t *opt, bool (*sign_rsaes_pkcs1_v1_5) (void *ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out), void *ctx); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_REQUEST_OPT_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_response.h000066400000000000000000000023001511661753600253230ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_RESPONSE_H #define KMS_RESPONSE_H #include "kms_message_defines.h" #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_response_t kms_response_t; KMS_MSG_EXPORT (int) kms_response_get_status (kms_response_t *response); KMS_MSG_EXPORT (const char *) kms_response_get_body (kms_response_t *response, size_t *len); KMS_MSG_EXPORT (void) kms_response_destroy (kms_response_t *response); KMS_MSG_EXPORT (const char *) kms_response_get_error (const kms_response_t *response); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_RESPONSE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message/kms_response_parser.h000066400000000000000000000036151511661753600267110ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_RESPONSE_PARSER_H #define KMS_RESPONSE_PARSER_H #include "kms_message_defines.h" #include "kms_response.h" #include #include #include #ifdef __cplusplus extern "C" { #endif typedef struct _kms_response_parser_t kms_response_parser_t; KMS_MSG_EXPORT (kms_response_parser_t *) kms_response_parser_new (void); KMS_MSG_EXPORT (int) kms_response_parser_wants_bytes (kms_response_parser_t *parser, int32_t max); KMS_MSG_EXPORT (bool) kms_response_parser_feed (kms_response_parser_t *parser, uint8_t *buf, uint32_t len); KMS_MSG_EXPORT (kms_response_t *) kms_response_parser_get_response (kms_response_parser_t *parser); /* kms_response_parser_status returns the HTTP response status if one was * parsed. * - Calling on a KMIP parser is an error. * - Returns an int for the HTTP status or 0 on error. */ KMS_MSG_EXPORT (int) kms_response_parser_status (kms_response_parser_t *parser); KMS_MSG_EXPORT (const char *) kms_response_parser_error (kms_response_parser_t *parser); KMS_MSG_EXPORT (void) kms_response_parser_destroy (kms_response_parser_t *parser); KMS_MSG_EXPORT (void) kms_response_parser_reset (kms_response_parser_t *parser); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* KMS_RESPONSE_PARSER_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_message_private.h000066400000000000000000000102671511661753600243600ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_PRIVATE_H #define KMS_MESSAGE_PRIVATE_H #include #include "kms_message/kms_message.h" #include "kms_request_str.h" #include "kms_kv_list.h" #include "kms_crypto.h" #include "kms_kmip_response_parser_private.h" /* Sadly, Windows does not define SSIZE_MAX. It is defined in bson-compat.h, * but only since 1.22.x, so copy this from bson-compat.h for now. */ #ifndef SSIZE_MAX #define SSIZE_MAX \ (ssize_t) ( \ (((size_t) 0x01u) << (sizeof (ssize_t) * (size_t) CHAR_BIT - 1u)) - 1u) #endif struct _kms_request_t { char error[512]; bool failed; bool finalized; /* Begin: AWS specific */ kms_request_str_t *region; kms_request_str_t *service; kms_request_str_t *access_key_id; kms_request_str_t *secret_key; kms_request_str_t *datetime; kms_request_str_t *date; /* End: AWS specific */ kms_request_str_t *method; kms_request_str_t *path; kms_request_str_t *query; kms_request_str_t *payload; kms_kv_list_t *query_params; kms_kv_list_t *header_fields; /* turn off for tests only, not in public kms_request_opt_t API */ bool auto_content_length; _kms_crypto_t crypto; kms_request_str_t *to_string; kms_request_provider_t provider; /* TODO (MONGOCRYPT-342): make a union for each KMS provider type. kms_request_provider_t provider; union { struct {} aws; struct {} azure; struct {} gcp; struct {} kmip; } */ struct { uint8_t *data; uint32_t len; } kmip; }; struct _kms_response_t { int status; kms_kv_list_t *headers; kms_request_str_t *body; /* TODO (MONGOCRYPT-347): make a union for each KMS provider type. */ char error[512]; bool failed; kms_request_provider_t provider; struct { uint8_t *data; uint32_t len; } kmip; }; typedef enum { PARSING_STATUS_LINE, PARSING_HEADER, PARSING_BODY, PARSING_CHUNK_LENGTH, PARSING_CHUNK, PARSING_DONE } kms_response_parser_state_t; struct _kms_response_parser_t { char error[512]; bool failed; kms_response_t *response; kms_request_str_t *raw_response; int content_length; int start; /* start of the current thing getting parsed. */ /* Support two types of HTTP 1.1 responses. * - "Content-Length: x" header is present, indicating the body length. * - "Transfer-Encoding: chunked" header is present, indicating a stream of * chunks. */ bool transfer_encoding_chunked; int chunk_size; kms_response_parser_state_t state; /* TODO: MONGOCRYPT-348 reorganize this struct to better separate fields for * HTTP parsing and fields for KMIP parsing. */ kms_kmip_response_parser_t *kmip; }; #define CHECK_FAILED \ do { \ if (request->failed) { \ return false; \ } \ } while (0) #if defined(__clang__) __attribute__((format(printf, 3, 4))) #elif defined(__GNUC__) __attribute__((format(gnu_printf, 3, 4))) #endif void kms_set_error (char *error, size_t size, const char *fmt, ...); #define KMS_ERROR(obj, ...) \ do { \ obj->failed = true; \ kms_set_error (obj->error, sizeof (obj->error), __VA_ARGS__); \ } while (0) #define KMS_ASSERT(stmt) \ if (!(stmt)) { \ fprintf (stderr, "%s failed\n", #stmt); \ abort (); \ } else \ ((void)0) #endif /* KMS_MESSAGE_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_port.c000066400000000000000000000015701511661753600221560ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_port.h" #if defined(_WIN32) #include #include char * kms_strndup (const char *src, size_t len) { char *dst = (char *) malloc (len + 1); if (!dst) { return 0; } memcpy (dst, src, len); dst[len] = '\0'; return dst; } #endif mongo-c-driver-2.2.1/src/kms-message/src/kms_port.h000066400000000000000000000015741511661753600221670ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_PORT_H #define KMS_PORT_H #include #if defined(_WIN32) #define kms_strcasecmp _stricmp char * kms_strndup (const char *src, size_t len); #else #include #define kms_strndup strndup #define kms_strcasecmp strcasecmp #endif #endif /* KMS_PORT_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_request.c000066400000000000000000000607371511661753600226740ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_crypto.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_opt_private.h" #include "kms_port.h" #include /* CHAR_BIT */ static kms_kv_list_t * parse_query_params (kms_request_str_t *q) { kms_kv_list_t *lst = kms_kv_list_new (); char *p = q->str; char *end = q->str + q->len; char *amp, *equals; kms_request_str_t *k, *v; do { equals = strchr ((const char *) p, '='); if (!equals) { kms_kv_list_destroy (lst); return NULL; } amp = strchr ((const char *) equals, '&'); if (!amp) { amp = end; } k = kms_request_str_new_from_chars (p, equals - p); v = kms_request_str_new_from_chars (equals + 1, amp - equals - 1); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); p = amp + 1; } while (p < end); return lst; } static bool check_and_prohibit_kmip (kms_request_t *req) { if (req->provider == KMS_REQUEST_PROVIDER_KMIP) { KMS_ERROR (req, "Function not applicable to KMIP"); return false; } return true; } kms_request_t * kms_request_new (const char *method, const char *path_and_query, const kms_request_opt_t *opt) { kms_request_t *request = calloc (1, sizeof (kms_request_t)); const char *question_mark; KMS_ASSERT (request); if (opt && opt->provider) { request->provider = opt->provider; } else { request->provider = KMS_REQUEST_PROVIDER_AWS; } if (!check_and_prohibit_kmip (request)) { return request; } /* parsing may set failed to true */ request->failed = false; request->finalized = false; request->region = kms_request_str_new (); request->service = kms_request_str_new (); request->access_key_id = kms_request_str_new (); request->secret_key = kms_request_str_new (); question_mark = strchr (path_and_query, '?'); if (question_mark) { request->path = kms_request_str_new_from_chars ( path_and_query, question_mark - path_and_query); request->query = kms_request_str_new_from_chars (question_mark + 1, -1); request->query_params = parse_query_params (request->query); if (!request->query_params) { KMS_ERROR (request, "Cannot parse query: %s", request->query->str); } } else { request->path = kms_request_str_new_from_chars (path_and_query, -1); request->query = kms_request_str_new (); request->query_params = kms_kv_list_new (); } request->payload = kms_request_str_new (); request->date = kms_request_str_new (); request->datetime = kms_request_str_new (); request->method = kms_request_str_new_from_chars (method, -1); request->header_fields = kms_kv_list_new (); request->auto_content_length = true; /* For AWS KMS requests, add a X-Amz-Date header. */ if (request->provider == KMS_REQUEST_PROVIDER_AWS && !kms_request_set_date (request, NULL)) { return request; } if (opt && opt->connection_close) { if (!kms_request_add_header_field (request, "Connection", "close")) { return request; } } if (opt && opt->crypto.sha256) { memcpy (&request->crypto, &opt->crypto, sizeof (opt->crypto)); } else { request->crypto.sha256 = kms_sha256; request->crypto.sha256_hmac = kms_sha256_hmac; } return request; } void kms_request_destroy (kms_request_t *request) { kms_request_str_destroy (request->region); kms_request_str_destroy (request->service); kms_request_str_destroy (request->access_key_id); kms_request_str_destroy (request->secret_key); kms_request_str_destroy (request->method); kms_request_str_destroy (request->path); kms_request_str_destroy (request->query); kms_request_str_destroy (request->payload); kms_request_str_destroy (request->datetime); kms_request_str_destroy (request->date); kms_kv_list_destroy (request->query_params); kms_kv_list_destroy (request->header_fields); kms_request_str_destroy (request->to_string); free (request->kmip.data); free (request); } const char * kms_request_get_error (kms_request_t *request) { return request->failed ? request->error : NULL; } #define AMZ_DT_FORMAT "YYYYmmDDTHHMMSSZ" bool kms_request_set_date (kms_request_t *request, const struct tm *tm) { char buf[sizeof AMZ_DT_FORMAT]; struct tm tmp_tm; if (request->failed) { return false; } if (!check_and_prohibit_kmip (request)) { return false; } if (!tm) { /* use current time */ time_t t; time (&t); #if defined(KMS_MESSAGE_HAVE_GMTIME_R) gmtime_r (&t, &tmp_tm); #elif defined(_MSC_VER) gmtime_s (&tmp_tm, &t); #else tmp_tm = *gmtime (&t); #endif tm = &tmp_tm; } if (0 == strftime (buf, sizeof AMZ_DT_FORMAT, "%Y%m%dT%H%M%SZ", tm)) { KMS_ERROR (request, "Invalid tm struct"); return false; } kms_request_str_set_chars (request->date, buf, sizeof "YYYYmmDD" - 1); kms_request_str_set_chars (request->datetime, buf, sizeof AMZ_DT_FORMAT - 1); kms_kv_list_del (request->header_fields, "X-Amz-Date"); if (!kms_request_add_header_field (request, "X-Amz-Date", buf)) { return false; } return true; } #undef AMZ_DT_FORMAT bool kms_request_set_region (kms_request_t *request, const char *region) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->region, region, -1); return true; } bool kms_request_set_service (kms_request_t *request, const char *service) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->service, service, -1); return true; } bool kms_request_set_access_key_id (kms_request_t *request, const char *akid) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->access_key_id, akid, -1); return true; } bool kms_request_set_secret_key (kms_request_t *request, const char *key) { if (!check_and_prohibit_kmip (request)) { return false; } kms_request_str_set_chars (request->secret_key, key, -1); return true; } bool kms_request_add_header_field (kms_request_t *request, const char *field_name, const char *value) { kms_request_str_t *k, *v; CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } k = kms_request_str_new_from_chars (field_name, -1); v = kms_request_str_new_from_chars (value, -1); kms_kv_list_add (request->header_fields, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); return true; } bool kms_request_append_header_field_value (kms_request_t *request, const char *value, size_t len) { kms_request_str_t *v; CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } if (request->header_fields->len == 0) { KMS_ERROR ( request, "Ensure the request has at least one header field before calling %s", __func__); } v = request->header_fields->kvs[request->header_fields->len - 1].value; KMS_ASSERT (len <= SSIZE_MAX); kms_request_str_append_chars (v, value, (ssize_t) len); return true; } bool kms_request_append_payload (kms_request_t *request, const char *payload, size_t len) { CHECK_FAILED; if (!check_and_prohibit_kmip (request)) { return false; } KMS_ASSERT (len <= SSIZE_MAX); kms_request_str_append_chars (request->payload, payload, (ssize_t) len); return true; } /* docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html * * "Sort the parameter names by character code point in ascending order. For * example, a parameter name that begins with the uppercase letter F precedes a * parameter name that begins with a lowercase letter b." */ static int cmp_query_params (const void *a, const void *b) { int r = strcmp (((kms_kv_t *) a)->key->str, ((kms_kv_t *) b)->key->str); if (r != 0) { return r; } /* not in docs, but tested in get-vanilla-query-order-key: sort by value */ return strcmp (((kms_kv_t *) a)->value->str, ((kms_kv_t *) b)->value->str); } static void append_canonical_query (kms_request_t *request, kms_request_str_t *str) { size_t i; kms_kv_list_t *lst; if (!request->query_params->len) { return; } lst = kms_kv_list_dup (request->query_params); kms_kv_list_sort (lst, cmp_query_params); for (i = 0; i < lst->len; i++) { kms_request_str_append_escaped (str, lst->kvs[i].key, true); kms_request_str_append_char (str, '='); kms_request_str_append_escaped (str, lst->kvs[i].value, true); if (i < lst->len - 1) { kms_request_str_append_char (str, '&'); } } kms_kv_list_destroy (lst); } /* "lst" is a sorted list of headers */ static void append_canonical_headers (kms_kv_list_t *lst, kms_request_str_t *str) { size_t i; kms_kv_t *kv; const kms_request_str_t *previous_key = NULL; /* aws docs: "To create the canonical headers list, convert all header names * to lowercase and remove leading spaces and trailing spaces. Convert * sequential spaces in the header value to a single space." "Do not sort the * values in headers that have multiple values." */ for (i = 0; i < lst->len; i++) { kv = &lst->kvs[i]; if (previous_key && 0 == kms_strcasecmp (previous_key->str, kv->key->str)) { /* duplicate header */ kms_request_str_append_char (str, ','); kms_request_str_append_stripped (str, kv->value); continue; } if (i > 0) { kms_request_str_append_newline (str); } kms_request_str_append_lowercase (str, kv->key); kms_request_str_append_char (str, ':'); kms_request_str_append_stripped (str, kv->value); previous_key = kv->key; } kms_request_str_append_newline (str); } static void append_signed_headers (kms_kv_list_t *lst, kms_request_str_t *str) { size_t i; kms_kv_t *kv; const kms_request_str_t *previous_key = NULL; for (i = 0; i < lst->len; i++) { kv = &lst->kvs[i]; if (previous_key && 0 == kms_strcasecmp (previous_key->str, kv->key->str)) { /* duplicate header */ continue; } if (0 == kms_strcasecmp (kv->key->str, "connection")) { continue; } kms_request_str_append_lowercase (str, kv->key); if (i < lst->len - 1) { kms_request_str_append_char (str, ';'); } previous_key = kv->key; } } static bool finalize (kms_request_t *request) { kms_kv_list_t *lst; kms_request_str_t *k; kms_request_str_t *v; if (request->failed) { return false; } if (request->finalized) { return true; } request->finalized = true; lst = request->header_fields; if (!kms_kv_list_find (lst, "Host")) { if (request->provider != KMS_REQUEST_PROVIDER_AWS) { KMS_ERROR (request, "Required Host header not set"); return false; } /* For AWS requests, derive a default Host header from region + service. * E.g. "kms.us-east-1.amazonaws.com" */ k = kms_request_str_new_from_chars ("Host", -1); v = kms_request_str_dup (request->service); kms_request_str_append_char (v, '.'); kms_request_str_append (v, request->region); kms_request_str_append_chars (v, ".amazonaws.com", -1); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); } if (!kms_kv_list_find (lst, "Content-Length") && request->payload->len && request->auto_content_length) { k = kms_request_str_new_from_chars ("Content-Length", -1); v = kms_request_str_new (); kms_request_str_appendf (v, "%zu", request->payload->len); kms_kv_list_add (lst, k, v); kms_request_str_destroy (k); kms_request_str_destroy (v); } return true; } /* docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html * * "Build the canonical headers list by sorting the (lowercase) headers by * character code... Do not sort the values in headers that have multiple * values." */ static int cmp_header_field_names (const void *a, const void *b) { return kms_strcasecmp (((kms_kv_t *) a)->key->str, ((kms_kv_t *) b)->key->str); } static kms_kv_list_t * canonical_headers (const kms_request_t *request) { kms_kv_list_t *lst; KMS_ASSERT (request->finalized); lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); kms_kv_list_del (lst, "Connection"); return lst; } char * kms_request_get_canonical (kms_request_t *request) { kms_request_str_t *canonical; kms_request_str_t *normalized; kms_kv_list_t *lst; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } canonical = kms_request_str_new (); kms_request_str_append (canonical, request->method); kms_request_str_append_newline (canonical); normalized = kms_request_str_path_normalized (request->path); kms_request_str_append_escaped (canonical, normalized, false); kms_request_str_destroy (normalized); kms_request_str_append_newline (canonical); append_canonical_query (request, canonical); kms_request_str_append_newline (canonical); lst = canonical_headers (request); append_canonical_headers (lst, canonical); kms_request_str_append_newline (canonical); append_signed_headers (lst, canonical); kms_kv_list_destroy (lst); kms_request_str_append_newline (canonical); if (!kms_request_str_append_hashed ( &request->crypto, canonical, request->payload)) { KMS_ERROR (request, "could not generate hash"); kms_request_str_destroy (canonical); return NULL; } return kms_request_str_detach (canonical); } const char * kms_request_get_canonical_header (kms_request_t *request, const char *header) { const kms_kv_t *value; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } value = kms_kv_list_find (request->header_fields, header); if (!value) { return NULL; } return value->value->str; } char * kms_request_get_string_to_sign (kms_request_t *request) { bool success = false; kms_request_str_t *sts; kms_request_str_t *creq = NULL; /* canonical request */ if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } sts = kms_request_str_new (); kms_request_str_append_chars (sts, "AWS4-HMAC-SHA256\n", -1); kms_request_str_append (sts, request->datetime); kms_request_str_append_newline (sts); /* credential scope, like "20150830/us-east-1/service/aws4_request" */ kms_request_str_append (sts, request->date); kms_request_str_append_char (sts, '/'); kms_request_str_append (sts, request->region); kms_request_str_append_char (sts, '/'); kms_request_str_append (sts, request->service); kms_request_str_append_chars (sts, "/aws4_request\n", -1); creq = kms_request_str_wrap (kms_request_get_canonical (request), -1); if (!creq) { goto done; } if (!kms_request_str_append_hashed (&request->crypto, sts, creq)) { goto done; } success = true; done: kms_request_str_destroy (creq); if (!success) { kms_request_str_destroy (sts); sts = NULL; } return kms_request_str_detach (sts); } static bool kms_request_hmac (_kms_crypto_t *crypto, unsigned char *out, kms_request_str_t *key, kms_request_str_t *data) { return crypto->sha256_hmac ( crypto->ctx, key->str, key->len, data->str, data->len, out); } static bool kms_request_hmac_again (_kms_crypto_t *crypto, unsigned char *out, unsigned char *in, kms_request_str_t *data) { return crypto->sha256_hmac ( crypto->ctx, (const char *) in, 32, data->str, data->len, out); } bool kms_request_get_signing_key (kms_request_t *request, unsigned char *key) { bool success = false; kms_request_str_t *aws4_plus_secret = NULL; kms_request_str_t *aws4_request = NULL; unsigned char k_date[32]; unsigned char k_region[32]; unsigned char k_service[32]; if (request->failed) { return false; } if (!check_and_prohibit_kmip (request)) { return false; } /* docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html * Pseudocode for deriving a signing key * * kSecret = your secret access key * kDate = HMAC("AWS4" + kSecret, Date) * kRegion = HMAC(kDate, Region) * kService = HMAC(kRegion, Service) * kSigning = HMAC(kService, "aws4_request") */ aws4_plus_secret = kms_request_str_new_from_chars ("AWS4", -1); kms_request_str_append (aws4_plus_secret, request->secret_key); aws4_request = kms_request_str_new_from_chars ("aws4_request", -1); if (!(kms_request_hmac ( &request->crypto, k_date, aws4_plus_secret, request->date) && kms_request_hmac_again ( &request->crypto, k_region, k_date, request->region) && kms_request_hmac_again ( &request->crypto, k_service, k_region, request->service) && kms_request_hmac_again ( &request->crypto, key, k_service, aws4_request))) { goto done; } success = true; done: kms_request_str_destroy (aws4_plus_secret); kms_request_str_destroy (aws4_request); return success; } char * kms_request_get_signature (kms_request_t *request) { bool success = false; kms_kv_list_t *lst = NULL; kms_request_str_t *sig = NULL; kms_request_str_t *sts = NULL; unsigned char signing_key[32]; unsigned char signature[32]; if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } sts = kms_request_str_wrap (kms_request_get_string_to_sign (request), -1); if (!sts) { goto done; } sig = kms_request_str_new (); kms_request_str_append_chars (sig, "AWS4-HMAC-SHA256 Credential=", -1); kms_request_str_append (sig, request->access_key_id); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->date); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->region); kms_request_str_append_char (sig, '/'); kms_request_str_append (sig, request->service); kms_request_str_append_chars (sig, "/aws4_request, SignedHeaders=", -1); lst = canonical_headers (request); append_signed_headers (lst, sig); kms_request_str_append_chars (sig, ", Signature=", -1); if (!(kms_request_get_signing_key (request, signing_key) && kms_request_hmac_again ( &request->crypto, signature, signing_key, sts))) { goto done; } kms_request_str_append_hex (sig, signature, sizeof (signature)); success = true; done: kms_kv_list_destroy (lst); kms_request_str_destroy (sts); if (!success) { kms_request_str_destroy (sig); sig = NULL; } return kms_request_str_detach (sig); } static void kms_request_validate (kms_request_t *request) { if (!check_and_prohibit_kmip (request)) { return; } if (0 == request->region->len) { KMS_ERROR (request, "Region not set"); } else if (0 == request->service->len) { KMS_ERROR (request, "Service not set"); } else if (0 == request->access_key_id->len) { KMS_ERROR (request, "Access key ID not set"); } else if (0 == request->method->len) { KMS_ERROR (request, "Method not set"); } else if (0 == request->path->len) { KMS_ERROR (request, "Path not set"); } else if (0 == request->date->len) { KMS_ERROR (request, "Date not set"); } else if (0 == request->secret_key->len) { KMS_ERROR (request, "Secret key not set"); } } /* append_http_endofline appends an HTTP end-of-line marker: "\r\n". */ static void append_http_endofline (kms_request_str_t *str) { kms_request_str_append_chars (str, "\r\n", 2); } char * kms_request_get_signed (kms_request_t *request) { bool success = false; kms_kv_list_t *lst = NULL; char *signature = NULL; kms_request_str_t *sreq = NULL; size_t i; kms_request_validate (request); if (request->failed) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (!finalize (request)) { return NULL; } sreq = kms_request_str_new (); /* like "POST / HTTP/1.1" */ kms_request_str_append (sreq, request->method); kms_request_str_append_char (sreq, ' '); kms_request_str_append (sreq, request->path); if (request->query->len) { kms_request_str_append_char (sreq, '?'); kms_request_str_append (sreq, request->query); } kms_request_str_append_chars (sreq, " HTTP/1.1", -1); append_http_endofline (sreq); /* headers */ lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); for (i = 0; i < lst->len; i++) { kms_request_str_append (sreq, lst->kvs[i].key); kms_request_str_append_char (sreq, ':'); kms_request_str_append (sreq, lst->kvs[i].value); append_http_endofline (sreq); } /* authorization header */ signature = kms_request_get_signature (request); if (!signature) { goto done; } /* note space after ':', to match test .sreq files */ kms_request_str_append_chars (sreq, "Authorization: ", -1); kms_request_str_append_chars (sreq, signature, -1); /* body */ if (request->payload->len) { append_http_endofline (sreq); append_http_endofline (sreq); kms_request_str_append (sreq, request->payload); } success = true; done: free (signature); kms_kv_list_destroy (lst); if (!success) { kms_request_str_destroy (sreq); sreq = NULL; } return kms_request_str_detach (sreq); } char * kms_request_to_string (kms_request_t *request) { kms_kv_list_t *lst = NULL; kms_request_str_t *sreq = NULL; size_t i; if (!finalize (request)) { return NULL; } if (!check_and_prohibit_kmip (request)) { return NULL; } if (request->to_string) { return kms_request_str_detach (kms_request_str_dup (request->to_string)); } sreq = kms_request_str_new (); /* like "POST / HTTP/1.1" */ kms_request_str_append (sreq, request->method); kms_request_str_append_char (sreq, ' '); kms_request_str_append (sreq, request->path); if (request->query->len) { kms_request_str_append_char (sreq, '?'); kms_request_str_append (sreq, request->query); } kms_request_str_append_chars (sreq, " HTTP/1.1", -1); append_http_endofline (sreq); /* headers */ lst = kms_kv_list_dup (request->header_fields); kms_kv_list_sort (lst, cmp_header_field_names); for (i = 0; i < lst->len; i++) { kms_request_str_append (sreq, lst->kvs[i].key); kms_request_str_append_char (sreq, ':'); kms_request_str_append (sreq, lst->kvs[i].value); append_http_endofline (sreq); } append_http_endofline (sreq); /* body */ if (request->payload->len) { kms_request_str_append (sreq, request->payload); } kms_kv_list_destroy (lst); request->to_string = kms_request_str_dup (sreq); return kms_request_str_detach (sreq); } void kms_request_free_string (char *ptr) { free (ptr); } const uint8_t * kms_request_to_bytes (kms_request_t *request, size_t *len) { if (request->provider == KMS_REQUEST_PROVIDER_KMIP) { *len = request->kmip.len; return request->kmip.data; } if (!request->to_string && !kms_request_to_string (request)) { return NULL; } KMS_ASSERT (request->to_string); *len = request->to_string->len; return (const uint8_t*) request->to_string->str; } mongo-c-driver-2.2.1/src/kms-message/src/kms_request_opt.c000066400000000000000000000055021511661753600235430ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_request_opt_private.h" #include kms_request_opt_t * kms_request_opt_new (void) { return calloc (1, sizeof (kms_request_opt_t)); } void kms_request_opt_destroy (kms_request_opt_t *request) { free (request); } void kms_request_opt_set_connection_close (kms_request_opt_t *opt, bool connection_close) { opt->connection_close = connection_close; } void kms_request_opt_set_crypto_hooks (kms_request_opt_t *opt, bool (*sha256) (void *ctx, const char *input, size_t len, unsigned char *hash_out), bool (*sha256_hmac) (void *ctx, const char *key_input, size_t key_len, const char *input, size_t len, unsigned char *hash_out), void *ctx) { opt->crypto.sha256 = sha256; opt->crypto.sha256_hmac = sha256_hmac; opt->crypto.ctx = ctx; } bool kms_request_opt_set_provider (kms_request_opt_t *opt, kms_request_provider_t provider) { if (provider != KMS_REQUEST_PROVIDER_AWS && provider != KMS_REQUEST_PROVIDER_AZURE && provider != KMS_REQUEST_PROVIDER_GCP && provider != KMS_REQUEST_PROVIDER_KMIP) { return false; } opt->provider = provider; return true; } void kms_request_opt_set_crypto_hook_sign_rsaes_pkcs1_v1_5 ( kms_request_opt_t *opt, bool (*sign_rsaes_pkcs1_v1_5) (void *sign_ctx, const char *private_key, size_t private_key_len, const char *input, size_t input_len, unsigned char *signature_out), void *sign_ctx) { opt->crypto.sign_rsaes_pkcs1_v1_5 = sign_rsaes_pkcs1_v1_5; opt->crypto.sign_ctx = sign_ctx; } mongo-c-driver-2.2.1/src/kms-message/src/kms_request_opt_private.h000066400000000000000000000017041511661753600253020ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_REQUEST_OPT_PRIVATE_H #define KMS_REQUEST_OPT_PRIVATE_H #include "kms_message/kms_message_defines.h" #include "kms_message/kms_request_opt.h" #include "kms_crypto.h" #include struct _kms_request_opt_t { bool connection_close; _kms_crypto_t crypto; kms_request_provider_t provider; }; #endif /* KMS_REQUEST_OPT_PRIVATE_H */ mongo-c-driver-2.2.1/src/kms-message/src/kms_request_str.c000066400000000000000000000276561511661753600235670ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "hexlify.h" #include "kms_crypto.h" #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" #include "kms_port.h" #include #include #include #include #include /* CHAR_BIT */ static bool rfc_3986_tab[256] = {0}; static bool kms_initialized = false; static void tables_init (void) { int i; if (kms_initialized) { return; } for (i = 0; i < 256; ++i) { rfc_3986_tab[i] = isalnum (i) || i == '~' || i == '-' || i == '.' || i == '_'; } kms_initialized = true; } kms_request_str_t * kms_request_str_new (void) { kms_request_str_t *s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); s->len = 0; s->size = 16; s->str = malloc (s->size); KMS_ASSERT (s->str); s->str[0] = '\0'; return s; } kms_request_str_t * kms_request_str_new_from_chars (const char *chars, ssize_t len) { kms_request_str_t *s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); size_t actual_len; actual_len = len < 0 ? strlen (chars) : (size_t) len; s->size = actual_len + 1; s->str = malloc (s->size); KMS_ASSERT (s->str); memcpy (s->str, chars, actual_len); s->str[actual_len] = '\0'; s->len = actual_len; return s; } kms_request_str_t * kms_request_str_wrap (char *chars, ssize_t len) { kms_request_str_t *s; if (!chars) { return NULL; } s = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (s); s->str = chars; s->len = len < 0 ? strlen (chars) : (size_t) len; s->size = s->len; return s; } void kms_request_str_destroy (kms_request_str_t *str) { if (!str) { return; } free (str->str); free (str); } char * kms_request_str_detach (kms_request_str_t *str) { if (!str) { return NULL; } char *r = str->str; free (str); return r; } bool kms_request_str_reserve (kms_request_str_t *str, size_t size) { size_t next_size = str->len + size + 1; if (str->size < next_size) { /* next power of 2 */ --next_size; next_size |= next_size >> 1U; next_size |= next_size >> 2U; next_size |= next_size >> 4U; next_size |= next_size >> 8U; next_size |= next_size >> 16U; ++next_size; str->size = next_size; str->str = realloc (str->str, next_size); } return str->str != NULL; } kms_request_str_t * kms_request_str_dup (kms_request_str_t *str) { kms_request_str_t *dup = malloc (sizeof (kms_request_str_t)); KMS_ASSERT (dup); dup->str = kms_strndup (str->str, str->len); dup->len = str->len; dup->size = str->len + 1; return dup; } void kms_request_str_set_chars (kms_request_str_t *str, const char *chars, ssize_t len) { size_t actual_len = len < 0 ? strlen (chars) : (size_t) len; kms_request_str_reserve (str, actual_len); /* adds 1 for nil */ memcpy (str->str, chars, actual_len + 1); str->len = actual_len; } bool kms_request_str_ends_with (kms_request_str_t *str, kms_request_str_t *suffix) { if (str->len >= suffix->len && 0 == strncmp ( &str->str[str->len - suffix->len], suffix->str, suffix->len)) { return true; } return false; } void kms_request_str_append (kms_request_str_t *str, kms_request_str_t *appended) { size_t next_len = str->len + appended->len; kms_request_str_reserve (str, next_len); memcpy (str->str + str->len, appended->str, appended->len); str->len += appended->len; str->str[str->len] = '\0'; } void kms_request_str_append_char (kms_request_str_t *str, char c) { kms_request_str_reserve (str, 1); *(str->str + str->len) = c; ++str->len; str->str[str->len] = '\0'; } void kms_request_str_append_chars (kms_request_str_t *str, const char *appended, ssize_t len) { size_t str_len; if (len < 0) { str_len = strlen (appended); } else { str_len = (size_t) len; } kms_request_str_reserve (str, str_len); memcpy (str->str + str->len, appended, str_len); str->len += str_len; str->str[str->len] = '\0'; } void kms_request_str_append_newline (kms_request_str_t *str) { kms_request_str_append_char (str, '\n'); } void kms_request_str_append_lowercase (kms_request_str_t *str, kms_request_str_t *appended) { size_t i; char *p; i = str->len; kms_request_str_append (str, appended); /* downcase the chars from the old end to the new end of str */ for (; i < str->len; ++i) { p = &str->str[i]; /* ignore UTF-8 non-ASCII chars, which have 1 in the top bit */ if (((unsigned int) (*p) & (0x1U << 7U)) == 0) { *p = (char) tolower (*p); } } } void kms_request_str_appendf (kms_request_str_t *str, const char *format, ...) { va_list args; size_t remaining; int n; KMS_ASSERT (format); while (true) { remaining = str->size - str->len; va_start (args, format); n = vsnprintf (&str->str[str->len], remaining, format, args); va_end (args); if (n > -1 && (size_t) n < remaining) { /* success */ str->len += (size_t) n; return; } if (n > -1) { kms_request_str_reserve (str, (size_t) n); } else { /* TODO: error! */ abort (); } } } void kms_request_str_append_escaped (kms_request_str_t *str, kms_request_str_t *appended, bool escape_slash) { uint8_t *in; uint8_t *out; size_t i; tables_init (); /* might replace each input char with 3 output chars: "%AB" */ kms_request_str_reserve (str, 3 * appended->len); in = (uint8_t *) appended->str; out = (uint8_t *) str->str + str->len; for (i = 0; i < appended->len; ++i) { if (rfc_3986_tab[*in] || (*in == '/' && !escape_slash)) { *out = *in; ++out; ++str->len; } else { sprintf ((char *) out, "%%%02X", *in); out += 3; str->len += 3; } ++in; } } void kms_request_str_append_stripped (kms_request_str_t *str, kms_request_str_t *appended) { const char *src = appended->str; const char *end = appended->str + appended->len; bool space = false; bool comma = false; kms_request_str_reserve (str, appended->len); /* msvcrt is unhappy when it gets non-ANSI characters in isspace */ while (*src >= 0 && isspace (*src)) { ++src; } while (src < end) { /* replace newlines with commas. not documented but see * get-header-value-multiline.creq */ if (*src == '\n') { comma = true; space = false; } else if (*src >= 0 && isspace (*src)) { space = true; } else { if (comma) { kms_request_str_append_char (str, ','); comma = false; space = false; } /* is there a run of spaces waiting to be written as one space? */ if (space) { kms_request_str_append_char (str, ' '); space = false; } kms_request_str_append_char (str, *src); } ++src; } } bool kms_request_str_append_hashed (_kms_crypto_t *crypto, kms_request_str_t *str, kms_request_str_t *appended) { uint8_t hash[32] = {0}; char *hex_chars; if (!crypto->sha256 (crypto->ctx, appended->str, appended->len, hash)) { return false; } hex_chars = hexlify (hash, sizeof (hash)); kms_request_str_append_chars (str, hex_chars, 2 * sizeof (hash)); free (hex_chars); return true; } bool kms_request_str_append_hex (kms_request_str_t *str, unsigned char *data, size_t len) { char *hex_chars; hex_chars = hexlify (data, len); KMS_ASSERT (len <= SSIZE_MAX / 2); kms_request_str_append_chars (str, hex_chars, (ssize_t) (len * 2)); free (hex_chars); return true; } static bool starts_with (char *s, const char *prefix) { if (strstr (s, prefix) == s) { return true; } return false; } /* remove from last slash to the end, but don't remove slash from start */ static void delete_last_segment (kms_request_str_t *str, bool is_absolute) { ssize_t i; if (!str->len) { return; } KMS_ASSERT (str->len < SSIZE_MAX); for (i = (ssize_t) str->len - 1; i >= 0; --i) { if (str->str[i] == '/') { if (i == 0 && is_absolute) { str->len = 1; } else { str->len = (size_t) i; } goto done; } } /* no slashes */ str->len = 0; done: str->str[str->len] = '\0'; } /* follow algorithm in https://tools.ietf.org/html/rfc3986#section-5.2.4, * the block comments are copied from there */ kms_request_str_t * kms_request_str_path_normalized (kms_request_str_t *str) { kms_request_str_t *slash = kms_request_str_new_from_chars ("/", 1); kms_request_str_t *out = kms_request_str_new (); char *in = strdup (str->str); char *p = in; char *end = in + str->len; bool is_absolute = (*p == '/'); if (0 == strcmp (p, "/")) { goto done; } while (p < end) { /* If the input buffer begins with a prefix of "../" or "./", * then remove that prefix from the input buffer */ if (starts_with (p, "../")) { p += 3; } else if (starts_with (p, "./")) { p += 2; } /* otherwise, if the input buffer begins with a prefix of "/./" or "/.", * where "." is a complete path segment, then replace that prefix with "/" * in the input buffer */ else if (starts_with (p, "/./")) { p += 2; } else if (0 == strcmp (p, "/.")) { break; } /* otherwise, if the input buffer begins with a prefix of "/../" or "/..", * where ".." is a complete path segment, then replace that prefix with * "/" in the input buffer and remove the last segment and its preceding * "/" (if any) from the output buffer */ else if (starts_with (p, "/../")) { p += 3; delete_last_segment (out, is_absolute); } else if (0 == strcmp (p, "/..")) { delete_last_segment (out, is_absolute); break; } /* otherwise, if the input buffer consists only of "." or "..", then remove that from the input buffer */ else if (0 == strcmp (p, ".") || 0 == strcmp (p, "..")) { break; } /* otherwise, move the first path segment in the input buffer to the end * of the output buffer, including the initial "/" character (if any) and * any subsequent characters up to, but not including, the next "/" * character or the end of the input buffer. */ else { char *next_slash = strchr (p + 1, '/'); if (!next_slash) { next_slash = end; } /* fold repeated slashes */ if (kms_request_str_ends_with (out, slash) && *p == '/') { ++p; } /* normalize "a/../b" as "b", not as "/b" */ if (out->len == 0 && !is_absolute && *p == '/') { ++p; } kms_request_str_append_chars (out, p, next_slash - p); p = next_slash; } } done: free (in); kms_request_str_destroy (slash); if (!out->len) { kms_request_str_append_char (out, '/'); } return out; } mongo-c-driver-2.2.1/src/kms-message/src/kms_request_str.h000066400000000000000000000070211511661753600235540ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef KMS_MESSAGE_KMS_REQUEST_STR_H #define KMS_MESSAGE_KMS_REQUEST_STR_H #include "kms_message/kms_message.h" #include "kms_crypto.h" #include #include #include #include typedef struct { char *str; size_t len; size_t size; } kms_request_str_t; KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_new (void); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_new_from_chars (const char *chars, ssize_t len); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_wrap (char *chars, ssize_t len); KMS_MSG_EXPORT (void) kms_request_str_destroy (kms_request_str_t *str); KMS_MSG_EXPORT (char *) kms_request_str_detach (kms_request_str_t *str); KMS_MSG_EXPORT (bool) kms_request_str_reserve (kms_request_str_t *str, size_t size); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_dup (kms_request_str_t *str); KMS_MSG_EXPORT (void) kms_request_str_set_chars (kms_request_str_t *str, const char *chars, ssize_t len); KMS_MSG_EXPORT (bool) kms_request_str_ends_with (kms_request_str_t *str, kms_request_str_t *suffix); KMS_MSG_EXPORT (void) kms_request_str_append (kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (void) kms_request_str_append_char (kms_request_str_t *str, char c); KMS_MSG_EXPORT (void) kms_request_str_append_chars (kms_request_str_t *str, const char *appended, ssize_t len); KMS_MSG_EXPORT (void) kms_request_str_append_newline (kms_request_str_t *str); KMS_MSG_EXPORT (void) kms_request_str_append_lowercase (kms_request_str_t *str, kms_request_str_t *appended); #if defined(__clang__) __attribute__((format(printf, 2, 3))) #elif defined(__GNUC__) __attribute__((format(gnu_printf, 2, 3))) #endif KMS_MSG_EXPORT (void) kms_request_str_appendf (kms_request_str_t *str, const char *format, ...); #if defined(__clang__) __attribute__((format(printf, 2, 3))) #elif defined(__GNUC__) __attribute__((format(gnu_printf, 2, 3))) #endif KMS_MSG_EXPORT (void) kms_request_strdupf (kms_request_str_t *str, const char *format, ...); KMS_MSG_EXPORT (void) kms_request_str_append_escaped (kms_request_str_t *str, kms_request_str_t *appended, bool escape_slash); KMS_MSG_EXPORT (void) kms_request_str_append_stripped (kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (bool) kms_request_str_append_hashed (_kms_crypto_t *crypto, kms_request_str_t *str, kms_request_str_t *appended); KMS_MSG_EXPORT (bool) kms_request_str_append_hex (kms_request_str_t *str, unsigned char *data, size_t len); KMS_MSG_EXPORT (kms_request_str_t *) kms_request_str_path_normalized (kms_request_str_t *str); #endif // KMS_MESSAGE_KMS_REQUEST_STR_H mongo-c-driver-2.2.1/src/kms-message/src/kms_response.c000066400000000000000000000024631511661753600230320ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_message.h" #include "kms_message_private.h" #include "kms_request_str.h" void kms_response_destroy (kms_response_t *response) { if (response == NULL) { return; } free (response->kmip.data); kms_kv_list_destroy (response->headers); kms_request_str_destroy (response->body); free (response); } const char * kms_response_get_body (kms_response_t *response, size_t *len) { if (len) { *len = response->body->len; } return response->body->str; } int kms_response_get_status (kms_response_t *response) { return response->status; } const char * kms_response_get_error (const kms_response_t *response) { return response->failed ? response->error : NULL; } mongo-c-driver-2.2.1/src/kms-message/src/kms_response_parser.c000066400000000000000000000262471511661753600244140ustar00rootroot00000000000000#include "kms_message/kms_response_parser.h" #include "kms_message_private.h" #include "kms_kmip_response_parser_private.h" #include #include #include #include #include "hexlify.h" /* destroys the members of parser, but not the parser itself. */ static void _parser_destroy (kms_response_parser_t *parser) { kms_request_str_destroy (parser->raw_response); parser->raw_response = NULL; parser->content_length = -1; kms_response_destroy (parser->response); parser->response = NULL; kms_kmip_response_parser_destroy (parser->kmip); } /* initializes the members of parser. */ static void _parser_init (kms_response_parser_t *parser) { parser->raw_response = kms_request_str_new (); parser->content_length = -1; parser->response = calloc (1, sizeof (kms_response_t)); KMS_ASSERT (parser->response); parser->response->headers = kms_kv_list_new (); parser->state = PARSING_STATUS_LINE; parser->start = 0; parser->failed = false; parser->chunk_size = 0; parser->transfer_encoding_chunked = false; parser->kmip = NULL; } void kms_response_parser_reset (kms_response_parser_t *parser) { KMS_ASSERT(!parser->kmip); // KMIP is not-yet supported. _parser_destroy(parser); _parser_init(parser); } kms_response_parser_t * kms_response_parser_new (void) { kms_response_parser_t *parser = malloc (sizeof (kms_response_parser_t)); KMS_ASSERT (parser); _parser_init (parser); return parser; } int kms_response_parser_wants_bytes (kms_response_parser_t *parser, int32_t max) { if (parser->kmip) { return kms_kmip_response_parser_wants_bytes (parser->kmip, max); } switch (parser->state) { case PARSING_DONE: return 0; case PARSING_STATUS_LINE: case PARSING_HEADER: return max; case PARSING_CHUNK_LENGTH: return max; case PARSING_CHUNK: /* add 2 for trailing \r\n */ return (parser->chunk_size + 2) - ((int) parser->raw_response->len - parser->start); case PARSING_BODY: KMS_ASSERT (parser->content_length != -1); return parser->content_length - ((int) parser->raw_response->len - parser->start); default: KMS_ASSERT (false && "Invalid kms_response_parser HTTP state"); } } static bool _parse_int (const char *str, int *result) { char *endptr = NULL; int64_t long_result; errno = 0; long_result = strtol (str, &endptr, 10); if (endptr == str) { /* No digits were parsed. Consider this an error */ return false; } if (endptr != NULL && *endptr != '\0') { /* endptr points to the first invalid character. */ return false; } if (errno == EINVAL || errno == ERANGE) { return false; } if (long_result > INT32_MAX || long_result < INT32_MIN) { return false; } *result = (int) long_result; return true; } /* parse an int from a substring inside of a string. */ static bool _parse_int_from_view (const char *str, int start, int end, int *result) { KMS_ASSERT (end >= start); char *num_str = malloc ((size_t) (end - start + 1)); KMS_ASSERT (num_str); bool ret; strncpy (num_str, str + start, (size_t) (end - start)); num_str[end - start] = '\0'; ret = _parse_int (num_str, result); free (num_str); return ret; } static bool _parse_hex_from_view (const char *str, int len, int *result) { KMS_ASSERT (len >= 0); *result = unhexlify (str, (size_t) len); if (*result < 0) { return false; } return true; } /* returns true if char is "linear white space". This *ignores* the folding case * of CRLF followed by WSP. See https://stackoverflow.com/a/21072806/774658 */ static bool _is_lwsp (char c) { return c == ' ' || c == 0x09 /* HTAB */; } /* parse a header line or status line. */ static kms_response_parser_state_t _parse_line (kms_response_parser_t *parser, int end) { int i = parser->start; const char *raw = parser->raw_response->str; kms_response_t *response = parser->response; if (parser->state == PARSING_STATUS_LINE) { /* Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF */ int j; int status; if (strncmp (raw + i, "HTTP/1.1 ", 9) != 0) { KMS_ERROR (parser, "Could not parse HTTP-Version."); return PARSING_DONE; } i += 9; for (j = i; j < end; j++) { if (raw[j] == ' ') break; } if (!_parse_int_from_view (raw, i, j, &status)) { KMS_ERROR (parser, "Could not parse Status-Code."); return PARSING_DONE; } response->status = status; /* ignore the Reason-Phrase. */ return PARSING_HEADER; } else if (parser->state == PARSING_HEADER) { /* Treating a header as: * message-header = field-name ":" [ field-value ] CRLF * This is not completely correct, and does not take folding into acct. * See https://tools.ietf.org/html/rfc822#section-3.1 */ int j; kms_request_str_t *key; kms_request_str_t *val; if (i == end) { /* empty line, this signals the start of the body. */ if (parser->transfer_encoding_chunked) { return PARSING_CHUNK_LENGTH; } return PARSING_BODY; } for (j = i; j < end; j++) { if (raw[j] == ':') break; } if (j == end) { KMS_ERROR (parser, "Could not parse header, no colon found."); return PARSING_DONE; } key = kms_request_str_new_from_chars (raw + i, j - i); i = j + 1; /* remove leading and trailing whitespace from the value. */ for (j = i; j < end; j++) { if (!_is_lwsp (raw[j])) break; } i = j; /* find the end of the header by backtracking. */ for (j = end; j > i; j--) { if (!_is_lwsp (raw[j])) break; } if (i == j) { val = kms_request_str_new (); } else { val = kms_request_str_new_from_chars (raw + i, j - i); } kms_kv_list_add (response->headers, key, val); /* if we have *not* read the Content-Length yet, check. */ if (parser->content_length == -1 && strcmp (key->str, "Content-Length") == 0) { if (!_parse_int (val->str, &parser->content_length)) { KMS_ERROR (parser, "Could not parse Content-Length header."); kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_DONE; } } if (0 == strcmp (key->str, "Transfer-Encoding")) { if (0 == strcmp (val->str, "chunked")) { parser->transfer_encoding_chunked = true; } else { KMS_ERROR (parser, "Unsupported Transfer-Encoding: %s", val->str); kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_DONE; } } kms_request_str_destroy (key); kms_request_str_destroy (val); return PARSING_HEADER; } else if (parser->state == PARSING_CHUNK_LENGTH) { int result = 0; if (!_parse_hex_from_view (raw + i, end - i, &result)) { KMS_ERROR (parser, "Failed to parse hex chunk length."); return PARSING_DONE; } parser->chunk_size = result; return PARSING_CHUNK; } return PARSING_DONE; } bool kms_response_parser_feed (kms_response_parser_t *parser, uint8_t *buf, uint32_t len) { kms_request_str_t *raw = parser->raw_response; int curr, body_read, chunk_read; if (parser->kmip) { return kms_kmip_response_parser_feed (parser->kmip, buf, len); } curr = (int) raw->len; kms_request_str_append_chars (raw, (char *) buf, len); /* process the new data appended. */ while (curr < (int) raw->len) { switch (parser->state) { case PARSING_STATUS_LINE: case PARSING_HEADER: case PARSING_CHUNK_LENGTH: /* find the next \r\n. */ if (curr && strncmp (raw->str + (curr - 1), "\r\n", 2) == 0) { parser->state = _parse_line (parser, curr - 1); parser->start = curr + 1; } curr++; if (parser->state == PARSING_BODY && parser->content_length <= 0) { /* Ok, no Content-Length header, or explicitly 0, so empty body */ parser->response->body = kms_request_str_new (); parser->state = PARSING_DONE; } break; case PARSING_BODY: body_read = (int) raw->len - parser->start; if (parser->content_length == -1 || body_read > parser->content_length) { KMS_ERROR (parser, "Unexpected: exceeded content length"); return false; } /* check if we have the entire body. */ if (body_read == parser->content_length) { parser->response->body = kms_request_str_new_from_chars ( raw->str + parser->start, parser->content_length); parser->state = PARSING_DONE; } curr = (int) raw->len; break; case PARSING_CHUNK: chunk_read = (int) raw->len - parser->start; /* check if we've read the full chunk and the trailing \r\n */ if (chunk_read >= parser->chunk_size + 2) { if (!parser->response->body) { parser->response->body = kms_request_str_new (); } kms_request_str_append_chars (parser->response->body, raw->str + parser->start, parser->chunk_size); curr = parser->start + parser->chunk_size + 2; parser->start = curr; if (parser->chunk_size == 0) { /* last chunk. */ parser->state = PARSING_DONE; } else { parser->state = PARSING_CHUNK_LENGTH; } } else { curr = (int) raw->len; } break; case PARSING_DONE: KMS_ERROR (parser, "Unexpected extra HTTP content"); return false; default: KMS_ASSERT (false && "Invalid kms_response_parser HTTP state"); } } if (parser->failed) { return false; } return true; } /* steals the response from the parser. */ kms_response_t * kms_response_parser_get_response (kms_response_parser_t *parser) { kms_response_t *response; if (parser->kmip) { return kms_kmip_response_parser_get_response (parser->kmip); } response = parser->response; parser->response = NULL; /* reset the parser. */ _parser_destroy (parser); _parser_init (parser); return response; } int kms_response_parser_status (kms_response_parser_t *parser) { if (!parser) { return 0; } if (parser->kmip) { KMS_ERROR (parser, "kms_response_parser_status not applicable to KMIP"); return 0; } if (!parser->response) { return 0; } return parser->response->status; } const char * kms_response_parser_error (kms_response_parser_t *parser) { if (!parser) { return NULL; } if (parser->kmip) { return kms_kmip_response_parser_error (parser->kmip); } return parser->error; } void kms_response_parser_destroy (kms_response_parser_t *parser) { _parser_destroy (parser); free (parser); } mongo-c-driver-2.2.1/src/kms-message/src/sort.c000066400000000000000000000050741511661753600213120ustar00rootroot00000000000000/* * SPDX-License-Identifier: BSD-3-Clause * * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Peter McIlroy. * * 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. * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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. */ /** * This code is originally from: * https://github.com/freebsd/freebsd/blob/e7c6cef9514d3bb1f14a30a5ee871231523e43db/lib/libc/stdlib/merge.c */ #include "sort.h" // #include /* * This is to avoid out-of-bounds addresses in sorting the * last 4 elements. */ #define CMP(x, y) cmp (x, y) #define swap(a, b) \ if (1) { \ s = b; \ i = size; \ do { \ tmp = *a; \ *a++ = *s; \ *s++ = tmp; \ } while (--i); \ a -= size; \ } else \ ((void)0) void insertionsort (unsigned char *a, size_t n, size_t size, cmp_t cmp) { unsigned char *ai, *s, *t, *u, tmp; size_t i; for (ai = a + size; --n >= 1; ai += size) for (t = ai; t > a; t -= size) { u = t - size; if (CMP (u, t) <= 0) break; swap (u, t); } } mongo-c-driver-2.2.1/src/kms-message/src/sort.h000066400000000000000000000013621511661753600213130ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"){} * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include typedef int (*cmp_t) (const void *, const void *); void insertionsort (unsigned char *a, size_t n, size_t size, cmp_t cmp); mongo-c-driver-2.2.1/src/kms-message/test/000077500000000000000000000000001511661753600203415ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/connection_close/000077500000000000000000000000001511661753600236655ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/connection_close/connection_close.sreq000066400000000000000000000004621511661753600301070ustar00rootroot00000000000000POST / HTTP/1.1 Connection:close Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8b264695a2fd7fe28b309c611e0770da5a4c5ca0c040209941f78d773d9297b2mongo-c-driver-2.2.1/src/kms-message/test/content_length/000077500000000000000000000000001511661753600233545ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/content_length/content_length.sreq000066400000000000000000000005171511661753600272660ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:11 Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=content-length;host;x-amz-date, Signature=9025f1937fb114f77158a8bf0170e1ec1a9aa29806bc7800ca850966cd32920b foo-payloadmongo-c-driver-2.2.1/src/kms-message/test/decrypt/000077500000000000000000000000001511661753600220135ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/decrypt/decrypt.creq000066400000000000000000000004401511661753600243370ustar00rootroot00000000000000POST / content-length:234 content-type:application/x-amz-json-1.1 host:service.us-east-1.amazonaws.com x-amz-date:20150830T123600Z x-amz-target:TrentService.Decrypt content-length;content-type;host;x-amz-date;x-amz-target 48384de310621c850968f3948bddd004ecf5cae592a24530f778e4d190bd9dbcmongo-c-driver-2.2.1/src/kms-message/test/decrypt/decrypt.sreq000066400000000000000000000012141511661753600243570ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:234 Content-Type:application/x-amz-json-1.1 Host:service.us-east-1.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Target:TrentService.Decrypt Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target, Signature=977a49f82aa74b38944cbd299880dcc3ec2bbcd953c36b1a19a3cde56f415f31 {"CiphertextBlob": "AQICAHjzjtjUxrr7oc/BHmjyoZGeNk10osSeMGcIUzMNzeDJGwFgMNRznpAfp0NVhCb51fCxAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMoscSHCU4DuwIHyMJAgEQgCFhA83L4qw2T3PbG3MuM9pFUfTNwP/S4bnEwg6/U5BGGEI="}mongo-c-driver-2.2.1/src/kms-message/test/encrypt/000077500000000000000000000000001511661753600220255ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/encrypt/encrypt.creq000066400000000000000000000004371511661753600243710ustar00rootroot00000000000000POST / content-length:45 content-type:application/x-amz-json-1.1 host:service.us-east-1.amazonaws.com x-amz-date:20150830T123600Z x-amz-target:TrentService.Encrypt content-length;content-type;host;x-amz-date;x-amz-target 5fc6e5b49ee8c6926b9eeefb69e108be4c8e1cf81d8af8f51c7d5b992afd029cmongo-c-driver-2.2.1/src/kms-message/test/encrypt/encrypt.sreq000066400000000000000000000007161511661753600244110ustar00rootroot00000000000000POST / HTTP/1.1 Content-Length:45 Content-Type:application/x-amz-json-1.1 Host:service.us-east-1.amazonaws.com X-Amz-Date:20150830T123600Z X-Amz-Target:TrentService.Encrypt Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target, Signature=28d8a139a4a7da0bd7082979fa938ce20514e0500cdd441fd46f702ae3d3cfd2 {"Plaintext": "Zm9vYmFy", "KeyId": "alias/1"}mongo-c-driver-2.2.1/src/kms-message/test/example-chunked-response.bin000066400000000000000000000015561511661753600257500ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: X-Origin Vary: Referer Date: Thu, 24 Sep 2020 14:21:44 GMT Server: scaffolding on HTTPServer2 Cache-Control: private X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Alt-Svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" Accept-Ranges: none Vary: Origin,Accept-Encoding Connection: close Transfer-Encoding: chunked 105 {"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA","expires_in":3599,"token_type":"Bearer"} 0 mongo-c-driver-2.2.1/src/kms-message/test/example-multi-chunked-response.bin000066400000000000000000000015631511661753600270760ustar00rootroot00000000000000HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Vary: X-Origin Vary: Referer Date: Thu, 24 Sep 2020 14:21:44 GMT Server: scaffolding on HTTPServer2 Cache-Control: private X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN X-Content-Type-Options: nosniff Alt-Svc: h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" Accept-Ranges: none Vary: Origin,Accept-Encoding Connection: close Transfer-Encoding: chunked DD {"access_token":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 28 "expires_in":3599,"token_type":"Bearer"} 0 mongo-c-driver-2.2.1/src/kms-message/test/example-response.bin000077500000000000000000000007111511661753600243240ustar00rootroot00000000000000HTTP/1.1 200 OK x-amzn-RequestId: deeb35e5-4ecb-4bf1-9af5-84a54ff0af0e Content-Type: application/x-amz-json-1.1 Content-Length: 319 {"CiphertextBlob":"AQICAHifzrL6n/3uqZyz+z1bJj80DhqPcSAibAaIoYc+HOVP6QEplwbM0wpvU5zsQG/1SBKvAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM5syMJE7RodxDaqYqAgEQgCHMFCnFso4Lih0CNbLT1kiET0hQyzjgoa9733353GQkGlM=","KeyId":"arn:aws:kms:us-east-1:524754917239:key/bd05530b-0a7f-4fbd-8362-ab3667370db0"}mongo-c-driver-2.2.1/src/kms-message/test/host/000077500000000000000000000000001511661753600213165ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/host/host.sreq000066400000000000000000000004411511661753600231660ustar00rootroot00000000000000POST / HTTP/1.1 Host:foo-service.foo-region.amazonaws.com X-Amz-Date:20150830T123600Z Authorization: AWS4-HMAC-SHA256 Credential=foo-akid/20150830/foo-region/foo-service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8b264695a2fd7fe28b309c611e0770da5a4c5ca0c040209941f78d773d9297b2mongo-c-driver-2.2.1/src/kms-message/test/multibyte/000077500000000000000000000000001511661753600223575ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/multibyte/multibyte.creq000066400000000000000000000003321511661753600252470ustar00rootroot00000000000000GET /%E2%82%AC/ euro=%E2%82%AC content-length:4 host:€.€.amazonaws.com x-amz-date:20150830T123600Z €:€asdf€ content-length;host;x-amz-date;€ 5bf858e4b892817978d798623768af7080d99ded72501cf15374e12861725f12mongo-c-driver-2.2.1/src/kms-message/test/multibyte/multibyte.sreq000066400000000000000000000005121511661753600252670ustar00rootroot00000000000000GET /€/?euro=€ HTTP/1.1 Content-Length:4 Host:€.€.amazonaws.com X-Amz-Date:20150830T123600Z €:€asdf€ Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/€/€/aws4_request, SignedHeaders=content-length;host;x-amz-date;€, Signature=88d2d4b0639c6b6db1ce366d2578b8407562caa905fc375fdf1ddb7f0b789f5b €mongo-c-driver-2.2.1/src/kms-message/test/test_kmip_reader_writer.c000066400000000000000000000430651511661753600254320ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_kmip_reader_writer_private.h" #include #include typedef struct { char *desc; char *expected_hex; } kms_kmip_writer_test_case_t; static void kms_kmip_writer_test_evaluate (kmip_writer_t *writer, const char *expected_hex_in, char *desc) { char *expected_hex; const uint8_t *actual_buf; size_t actual_len; char *actual_hex; expected_hex = copy_and_filter_hex (expected_hex_in); actual_buf = kmip_writer_get_buffer (writer, &actual_len); actual_hex = data_to_hex (actual_buf, actual_len); if (0 != strcmp (expected_hex, actual_hex)) { TEST_STDERR_PRINTF ( "expected '%s' but got '%s' for test description: %s\n", expected_hex, actual_hex, desc); abort (); } free (actual_hex); free (expected_hex); } void kms_kmip_writer_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_writer_test (void) { kmip_writer_t *writer; /* The following test cases come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html */ writer = kmip_writer_new (); kmip_writer_write_integer (writer, KMIP_TAG_CompromiseDate, 8); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 02 | 00 00 00 04 | 00 00 00 08 00 00 00 00", "An Integer containing the decimal value 8"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_long_integer ( writer, KMIP_TAG_CompromiseDate, 123456789000000000LL); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 03 | 00 00 00 08 | 01 B6 9B 4B A5 74 92 00", "A Long Integer containing the decimal value 123456789000000000"); kmip_writer_destroy (writer); /* BigInteger is not implemented. */ writer = kmip_writer_new (); kmip_writer_write_enumeration (writer, KMIP_TAG_CompromiseDate, 255); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 05 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", "An Enumeration with value 255"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_bool (writer, KMIP_TAG_CompromiseDate, true); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 06 | 00 00 00 08 | 00 00 00 00 00 00 00 01", "An boolean containing the value true"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_string ( writer, KMIP_TAG_CompromiseDate, "Hello World", 11); kms_kmip_writer_test_evaluate (writer, "42 00 20 | 07 | 00 00 00 0B | 48 65 6C 6C " "6F 20 57 6F 72 6C 64 00 00 00 00 00", "A Text String with the value 'Hello World'"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_bytes (writer, KMIP_TAG_CompromiseDate, "\01\02\03", 3); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 08 | 00 00 00 03 | 01 02 03 00 00 00 00 00", "A Byte String with the value { 0x01, 0x02, 0x03 }"); kmip_writer_destroy (writer); writer = kmip_writer_new (); kmip_writer_write_datetime ( writer, KMIP_TAG_CompromiseDate, 0x0000000047DA67F8LL); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 09 | 00 00 00 08 | 00 00 00 00 47 DA 67 F8", "A Date-Time, containing the value for Friday, March 14, 2008, 11:56:40 " "GMT"); kmip_writer_destroy (writer); /* Interval is not implemented. */ writer = kmip_writer_new (); kmip_writer_begin_struct (writer, KMIP_TAG_CompromiseDate); kmip_writer_write_enumeration ( writer, KMIP_TAG_ApplicationSpecificInformation, 254); kmip_writer_write_integer (writer, KMIP_TAG_ArchiveDate, 255); kmip_writer_close_struct (writer); kms_kmip_writer_test_evaluate ( writer, "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", "A Structure containing an Enumeration, value 254, followed by an " "Integer, value 255, having tags 420004 and 420005 respectively"); kmip_writer_destroy (writer); } void kms_kmip_reader_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; kmip_tag_type_t tag; kmip_item_type_t type; uint32_t length; int32_t i32; int64_t i64; uint32_t u32; uint8_t *ptr; bool b; /* The following test cases come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html */ /* An Integer containing the decimal value 8 */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | 00 00 00 08 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == 8); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Long Integer containing the decimal value 123456789000000000 */ data = hex_to_data ("42 00 20 | 03 | 00 00 00 08 | 01 B6 9B 4B A5 74 92 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_LongInteger); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 8); ASSERT (kmip_reader_read_long_integer (reader, &i64)); ASSERT (i64 == 123456789000000000LL); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Big Integer is not implemented. */ /* An Enumeration with value 255 */ data = hex_to_data ("42 00 20 | 05 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Enumeration); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_enumeration (reader, &u32)); ASSERT (u32 == 255); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A boolean with value true */ data = hex_to_data ("42 00 20 | 06 | 00 00 00 08 | 00 00 00 00 00 00 00 01", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Boolean); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 8); ASSERT (kmip_reader_read_bool (reader, &b)); ASSERT (b); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Text String with the value 'Hello World' */ data = hex_to_data ("42 00 20 | 07 | 00 00 00 0B | 48 65 6C " "6C 6F 20 57 6F 72 6C 64 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_TextString); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 11); ASSERT (kmip_reader_read_string (reader, &ptr, length)); ASSERT (0 == strncmp ("Hello World", (const char *) ptr, length)); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Byte String with the value { 0x01, 0x02, 0x03 } */ data = hex_to_data ("42 00 20 | 08 | 00 00 00 03 | 01 02 03 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_ByteString); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 3); ASSERT (kmip_reader_read_bytes (reader, &ptr, length)); ASSERT (0 == strncmp ("\01\02\03", (const char *) ptr, length)); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* A Date-Time, containing the value for Friday, March 14, 2008, 11:56:40 GMT */ data = hex_to_data ("42 00 20 | 09 | 00 00 00 08 | 00 00 00 00 47 DA 67 F8", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_DateTime); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 8); kmip_reader_read_long_integer (reader, &i64); ASSERT (i64 == 0x47DA67F8); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Interval is not implemented. */ /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Structure); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 0x20); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_ApplicationSpecificInformation); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Enumeration); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_enumeration (reader, &u32)); ASSERT (u32 == 254); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_ArchiveDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == 255); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_negative_int_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_negative_int_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; kmip_tag_type_t tag; kmip_item_type_t type; uint32_t length; int32_t i32; /* Test reading the integer -1. */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | FF FF FF FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == -1); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); /* Test reading the integer INT32_MIN (-2^31). */ data = hex_to_data ("42 00 20 | 02 | 00 00 00 04 | 80 00 00 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_read_tag (reader, &tag)); ASSERT (tag == KMIP_TAG_CompromiseDate); ASSERT (kmip_reader_read_type (reader, &type)); ASSERT (type == KMIP_ITEM_TYPE_Integer); ASSERT (kmip_reader_read_length (reader, &length)); ASSERT (length == 4); ASSERT (kmip_reader_read_integer (reader, &i32)); ASSERT (i32 == INT32_MIN); ASSERT (!kmip_reader_has_data (reader)); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_find_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; size_t pos = 0; size_t len = 0; /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); /* Finds the top-level Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_CompromiseDate, KMIP_ITEM_TYPE_Structure, &pos, &len); ASSERT (found); ASSERT (pos == 0); ASSERT (len == 32); /* Mismatched tag does not find the Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_ActivationDate, KMIP_ITEM_TYPE_Structure, &pos, &len); ASSERT (!found); /* Mismatched type does not find the Structure. */ found = kmip_reader_find ( reader, KMIP_TAG_CompromiseDate, KMIP_ITEM_TYPE_Integer, &pos, &len); ASSERT (!found); /* Values nested within the Structure are not found. */ found = kmip_reader_find (reader, KMIP_TAG_ApplicationSpecificInformation, KMIP_ITEM_TYPE_Enumeration, &pos, &len); ASSERT (!found); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_recurse_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_find_and_recurse_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; size_t pos = 0; size_t len = 0; /* A Structure containing an Enumeration, value 254, followed by an Integer, * value 255, having tags 420004 and 420005 respectively */ data = hex_to_data ( "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE " "00 00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); ASSERT (kmip_reader_find_and_recurse (reader, KMIP_TAG_CompromiseDate)); /* Values nested within the Structure are found. */ found = kmip_reader_find (reader, KMIP_TAG_ApplicationSpecificInformation, KMIP_ITEM_TYPE_Enumeration, &pos, &len); ASSERT (found); ASSERT (pos == 8); ASSERT (len == 4); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_read_enum_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_find_and_read_enum_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; uint32_t value; /* An Integer, value 255, followed by an Enumeration, value 254 having tags * 420005 and 420004 respectively. */ data = hex_to_data ( "42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00 | 42 00 04 | 05 | " "00 00 00 04 | 00 00 00 FE 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); found = kmip_reader_find_and_read_enum ( reader, KMIP_TAG_ApplicationSpecificInformation, &value); ASSERT (found); ASSERT (value == 254); /* The Integer should not be found. */ found = kmip_reader_find_and_read_enum (reader, KMIP_TAG_ArchiveDate, &value); ASSERT (!found); kmip_reader_destroy (reader); free (data); } void kms_kmip_reader_find_and_read_bytes_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_reader_find_and_read_bytes_test (void) { uint8_t *data; size_t datalen; kmip_reader_t *reader; bool found; uint8_t *outptr; size_t outlen; /* An Integer, value 255, followed by ByteString of value 0x1122 having tags * 420005 and 420004 respectively. */ data = hex_to_data ( "42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00 | 42 00 04 | 08 | " "00 00 00 02 | 11 22 00 00 00 00 00 00", &datalen); reader = kmip_reader_new (data, datalen); found = kmip_reader_find_and_read_bytes ( reader, KMIP_TAG_ApplicationSpecificInformation, &outptr, &outlen); ASSERT (found); ASSERT (outlen == 2); ASSERT (outptr[0] == 0x11); ASSERT (outptr[1] == 0x22); /* The Integer should not be found. */ found = kmip_reader_find_and_read_bytes ( reader, KMIP_TAG_ArchiveDate, &outptr, &outlen); ASSERT (!found); kmip_reader_destroy (reader); free (data); } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_assert.h000066400000000000000000000201641511661753600237270ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_ASSERT_H #define TEST_KMS_ASSERT_H #include "kms_request_str.h" #include "test_kms_util.h" #include #include // TEST_PRINTF ensures stdout and stderr are flushed. #define TEST_PRINTF(...) \ if (1) { \ fflush (stderr); \ fprintf (stdout, __VA_ARGS__); \ fflush (stdout); \ } else \ ((void) 0) // TEST_STDERR_PRINTF ensures stdout and stderr are flushed. #define TEST_STDERR_PRINTF(...) \ if (1) { \ fflush (stdout); \ fprintf (stderr, __VA_ARGS__); \ fflush (stderr); \ } else \ ((void) 0) #define TEST_ERROR(...) \ do { \ TEST_STDERR_PRINTF ( \ "test error %s:%d %s(): ", __FILE__, __LINE__, __func__); \ TEST_STDERR_PRINTF (__VA_ARGS__); \ TEST_STDERR_PRINTF ("\n"); \ abort (); \ } while (0) #define ASSERT(stmt) \ if (!(stmt)) { \ TEST_ERROR ("statement failed %s", #stmt); \ } else \ ((void)0) #define ASSERT_CMPSTR_WITH_LEN(_expect, _expect_len, _actual, _actual_len) \ do { \ kms_request_str_t *_expect_str = \ kms_request_str_new_from_chars ((_expect), _expect_len); \ kms_request_str_t *_actual_str = \ kms_request_str_new_from_chars ((_actual), _actual_len); \ if (0 != strcmp (_expect_str->str, _actual_str->str)) { \ TEST_ERROR ( \ "strings not equal:\n%s\n%s", _expect_str->str, _actual_str->str); \ } \ kms_request_str_destroy (_actual_str); \ kms_request_str_destroy (_expect_str); \ } while (0) #define ASSERT_CMPSTR(_expect, _actual) \ ASSERT_CMPSTR_WITH_LEN ( \ (_expect), strlen (_expect), (_actual), strlen (_actual)) #define ASSERT_CONTAINS(_a, _b) \ do { \ kms_request_str_t *_a_str = kms_request_str_new_from_chars ((_a), -1); \ kms_request_str_t *_b_str = kms_request_str_new_from_chars ((_b), -1); \ kms_request_str_t *_a_lower = kms_request_str_new (); \ kms_request_str_t *_b_lower = kms_request_str_new (); \ kms_request_str_append_lowercase (_a_lower, (_a_str)); \ kms_request_str_append_lowercase (_b_lower, (_b_str)); \ if (NULL == strstr ((_a_lower->str), (_b_lower->str))) { \ TEST_ERROR ("string \"%s\" does not contain \"%s\"", _a, _b); \ } \ kms_request_str_destroy (_a_str); \ kms_request_str_destroy (_b_str); \ kms_request_str_destroy (_a_lower); \ kms_request_str_destroy (_b_lower); \ } while (0) #define ASSERT_CMPINT(_a, _operator, _b) \ do { \ int _a_int = _a; \ int _b_int = _b; \ if (!(_a_int _operator _b_int)) { \ TEST_ERROR ( \ "comparison failed: %d %s %d", _a_int, #_operator, _b_int); \ } \ } while (0) #define ASSERT_CMPBYTES( \ expected_bytes, expected_len, actual_bytes, actual_len) \ do { \ char *_actual_hex = data_to_hex (actual_bytes, actual_len); \ char *_expected_hex = data_to_hex (expected_bytes, expected_len); \ ASSERT_CMPSTR (_actual_hex, _expected_hex); \ free (_actual_hex); \ free (_expected_hex); \ } while (0) #define ASSERT_REQUEST_OK(req) \ do { \ if (kms_request_get_error (req)) { \ TEST_ERROR ("expected request ok but got error: %s", \ kms_request_get_error (req)); \ } \ } while (0) #define ASSERT_REQUEST_ERROR(req, expect_substring) \ do { \ if (!kms_request_get_error (req)) { \ TEST_ERROR ("expected request error but got ok"); \ } \ const char *_error_str = kms_request_get_error (req); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #define ASSERT_RESPONSE_OK(req) \ do { \ if (kms_response_get_error (req)) { \ TEST_ERROR ("expected response ok but got error: %s", \ kms_response_get_error (req)); \ } \ } while (0) #define ASSERT_RESPONSE_ERROR(req, expect_substring) \ do { \ if (!kms_response_get_error (req)) { \ TEST_ERROR ("expected response error but got ok"); \ } \ const char *_error_str = kms_response_get_error (req); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #define ASSERT_PARSER_OK(parser) \ do { \ if (kms_response_parser_error (parser)) { \ TEST_ERROR ("expected parser ok but got error: %s", \ kms_response_parser_error (parser)); \ } \ } while (0) #define ASSERT_PARSER_ERROR(parser, expect_substring) \ do { \ if (!kms_response_parser_error (parser)) { \ TEST_ERROR ("expected parser error but got ok"); \ } \ const char *_error_str = kms_response_parser_error (parser); \ ASSERT_CONTAINS (_error_str, expect_substring); \ } while (0) #endif /* TEST_KMS_ASSERT_H */ mongo-c-driver-2.2.1/src/kms-message/test/test_kms_azure_online.c000066400000000000000000000200201511661753600251020ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" #include "kms_message/kms_response_parser.h" #define MONGOC_LOG_DOMAIN "test_kms_azure_online" #include #include "test_kms_assert.h" #include #include "test_kms_online_util.h" #define SCOPE "https%3A%2F%2Fvault.azure.net%2F.default" /* Define TEST_TRACING_INSECURE in compiler flags to enable * log output with sensitive information (for debugging). */ #ifdef TEST_TRACING_INSECURE #define TEST_TRACE(...) MONGOC_DEBUG (__VA_ARGS__) #else #define TEST_TRACE(...) (void) 0 #endif typedef struct { char *tenant_id; char *client_id; char *client_secret; char *key_url; char *key_vault_url; char *key_path; char *key_host; char *key_name; char *key_version; } test_env_t; static char * test_getenv (const char *key) { char *value = getenv (key); if (!value) { TEST_STDERR_PRINTF ("Environment variable: %s not set (@@ctest-skip@@)\n", key); exit (2); } TEST_TRACE ("Env: %s = %s", key, value); return value; } static void test_env_init (test_env_t *test_env) { char *azure_domain = "vault.azure.net"; char *loc; test_env->tenant_id = test_getenv ("AZURE_TENANT_ID"); test_env->client_id = test_getenv ("AZURE_CLIENT_ID"); test_env->client_secret = test_getenv ("AZURE_CLIENT_SECRET"); test_env->key_url = test_getenv ("AZURE_KEY_URL"); test_env->key_name = test_getenv ("AZURE_KEY_NAME"); test_env->key_version = test_getenv ("AZURE_KEY_VERSION"); loc = strstr (test_env->key_url, azure_domain); ASSERT (loc); test_env->key_vault_url = bson_strndup ( test_env->key_url, strlen (azure_domain) + loc - test_env->key_url); test_env->key_path = bson_strdup (loc + strlen (azure_domain)); loc = strstr (test_env->key_vault_url, "//"); test_env->key_host = bson_strdup (loc + 2); } static void test_env_cleanup (test_env_t *test_env) { bson_free (test_env->key_vault_url); bson_free (test_env->key_path); bson_free (test_env->key_host); } /* Authenticate to Azure by sending an oauth request with client_id and client_secret (set in environment variables). Returns the base64url encoded bearer token that must be freed with bson_free. Subsequent requests to Azure can use the returned token by setting the header Authorization: Bearer . References: [1] https://docs.microsoft.com/en-us/azure/key-vault/general/authentication-requests-and-responses */ static char * azure_authenticate (void) { kms_request_t *req; kms_request_opt_t *opt; char *req_str; const char *res_str; bson_t *res_bson; bson_iter_t iter; char *bearer_token; kms_response_t *res; test_env_t test_env; test_env_init (&test_env); opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE); req = kms_azure_request_oauth_new ("login.microsoftonline.com", SCOPE, test_env.tenant_id, test_env.client_id, test_env.client_secret, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, "login.microsoftonline.com"); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s\n", res_str); ASSERT (kms_response_get_status (res) == 200); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); if (!bson_iter_init_find (&iter, res_bson, "access_token")) { TEST_ERROR ("could not find 'access_token' in HTTP response"); } bearer_token = bson_strdup (bson_iter_utf8 (&iter, NULL)); kms_request_free_string (req_str); kms_response_destroy (res); kms_request_destroy (req); bson_destroy (res_bson); test_env_cleanup (&test_env); kms_request_opt_destroy (opt); return bearer_token; } /* Test wrapping a 96 byte payload (the size of a data key) and unwrapping it * back. */ static void test_azure_wrapkey (void) { test_env_t test_env; kms_request_opt_t *opt; kms_request_t *req; char *req_str; char *bearer_token; kms_response_t *res; const char *res_str; uint8_t *encrypted_raw; size_t encrypted_raw_len; char *decrypted; bson_t *res_bson; bson_iter_t iter; uint8_t *key_data; char *key_data_b64url; int i; #define KEYLEN 96 key_data = bson_malloc0 (KEYLEN); for (i = 0; i < KEYLEN; i++) { key_data[i] = i; } key_data_b64url = kms_message_raw_to_b64url (key_data, KEYLEN); test_env_init (&test_env); bearer_token = azure_authenticate (); opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE); req = kms_azure_request_wrapkey_new (test_env.key_host, bearer_token, test_env.key_name, test_env.key_version, key_data, KEYLEN, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.key_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "value")); encrypted_raw = kms_message_b64url_to_raw (bson_iter_utf8 (&iter, NULL), &encrypted_raw_len); ASSERT (encrypted_raw); bson_destroy (res_bson); bson_free (req_str); kms_request_destroy (req); kms_response_destroy (res); /* Send a request to unwrap the encrypted key. */ req = kms_azure_request_unwrapkey_new (test_env.key_host, bearer_token, test_env.key_name, test_env.key_version, encrypted_raw, encrypted_raw_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.key_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "value")); decrypted = bson_strdup (bson_iter_utf8 (&iter, NULL)); ASSERT_CMPSTR (decrypted, key_data_b64url); bson_destroy (res_bson); kms_response_destroy (res); bson_free (req_str); bson_free (bearer_token); test_env_cleanup (&test_env); kms_request_destroy (req); bson_free (encrypted_raw); bson_free (key_data_b64url); bson_free (key_data); bson_free (decrypted); kms_request_opt_destroy (opt); } int main (int argc, char **argv) { kms_message_init (); test_azure_wrapkey (); return 0; } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_gcp_online.c000066400000000000000000000175761511661753600245530ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "kms_message/kms_gcp_request.h" #include "kms_message/kms_b64.h" #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" #include "kms_message/kms_response_parser.h" #define MONGOC_LOG_DOMAIN "test_kms_gcp_online" #include #include "test_kms_assert.h" #include #include "test_kms_online_util.h" /* Define TEST_TRACING_INSECURE in compiler flags to enable * log output with sensitive information (for debugging). */ #ifdef TEST_TRACING_INSECURE #define TEST_TRACE(...) MONGOC_DEBUG (__VA_ARGS__) #else #define TEST_TRACE(...) (void) 0 #endif typedef struct { const char *email; const char *audience; const char *scope; const char *auth_host; const char *private_key_b64; const char *kms_host; const char *project_id; const char *location; const char *key_ring_name; const char *key_name; const char *key_version; } test_env_t; static char * test_getenv (const char *key) { char *value = getenv (key); if (!value) { TEST_STDERR_PRINTF ("Environment variable: %s not set (@@ctest-skip@@)\n", key); exit (2); } TEST_TRACE ("Env: %s = %s", key, value); return value; } static void test_env_init (test_env_t *test_env) { test_env->email = test_getenv ("GCP_EMAIL"); test_env->audience = test_getenv ("GCP_AUDIENCE"); test_env->scope = test_getenv ("GCP_SCOPE"); test_env->auth_host = test_getenv ("GCP_AUTH_HOST"); test_env->private_key_b64 = test_getenv ("GCP_PRIVATE_KEY_B64"); test_env->kms_host = test_getenv ("GCP_KMS_HOST"); test_env->project_id = test_getenv ("GCP_PROJECT_ID"); test_env->location = test_getenv ("GCP_LOCATION"); test_env->key_ring_name = test_getenv ("GCP_KEY_RING_NAME"); test_env->key_name = test_getenv ("GCP_KEY_NAME"); test_env->key_version = test_getenv ("GCP_KEY_VERSION"); } static char * gcp_authenticate (void) { kms_request_t *req; kms_request_opt_t *opt; char *req_str; const char *res_str; bson_t *res_bson; bson_iter_t iter; char *bearer_token; char *private_key_data; size_t private_key_len; kms_response_t *res; test_env_t test_env; test_env_init (&test_env); opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP); private_key_data = (char *) kms_message_b64_to_raw (test_env.private_key_b64, &private_key_len); if (!private_key_data) { TEST_ERROR ("unable to base64 decode private key"); } req = kms_gcp_request_oauth_new (test_env.auth_host, test_env.email, test_env.audience, test_env.scope, private_key_data, private_key_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, "oauth2.googleapis.com"); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s\n", res_str); ASSERT (kms_response_get_status (res) == 200); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); if (!bson_iter_init_find (&iter, res_bson, "access_token")) { TEST_ERROR ("could not find 'access_token' in HTTP response"); } bearer_token = bson_strdup (bson_iter_utf8 (&iter, NULL)); kms_request_free_string (req_str); kms_response_destroy (res); kms_request_destroy (req); bson_destroy (res_bson); kms_request_opt_destroy (opt); bson_free (private_key_data); return bearer_token; } static void test_gcp (void) { test_env_t test_env; kms_request_opt_t *opt; kms_request_t *req; char *req_str; char *bearer_token; kms_response_t *res; const char *res_str; uint8_t *encrypted_raw; size_t encrypted_raw_len; char *decrypted; bson_t *res_bson; bson_iter_t iter; uint8_t *key_data; char *key_data_b64url; int i; #define KEYLEN 96 key_data = bson_malloc0 (KEYLEN); for (i = 0; i < KEYLEN; i++) { key_data[i] = i; } key_data_b64url = kms_message_raw_to_b64 (key_data, KEYLEN); test_env_init (&test_env); bearer_token = gcp_authenticate (); opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_GCP); req = kms_gcp_request_encrypt_new (test_env.kms_host, bearer_token, test_env.project_id, test_env.location, test_env.key_ring_name, test_env.key_name, test_env.key_version, key_data, KEYLEN, opt); ASSERT (req); if (kms_request_get_error (req)) { TEST_STDERR_PRINTF ("error: %s\n", kms_request_get_error (req)); ASSERT (false); } req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.kms_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "ciphertext")); encrypted_raw = kms_message_b64_to_raw (bson_iter_utf8 (&iter, NULL), &encrypted_raw_len); ASSERT (encrypted_raw); bson_destroy (res_bson); bson_free (req_str); kms_request_destroy (req); kms_response_destroy (res); /* Send a request to decrypt the encrypted key. */ req = kms_gcp_request_decrypt_new (test_env.kms_host, bearer_token, test_env.project_id, test_env.location, test_env.key_ring_name, test_env.key_name, encrypted_raw, encrypted_raw_len, opt); req_str = kms_request_to_string (req); TEST_TRACE ("--> HTTP request:\n%s\n", req_str); res = send_kms_request (req, test_env.kms_host); res_str = kms_response_get_body (res, NULL); TEST_TRACE ("<-- HTTP response:\n%s", res_str); res_bson = bson_new_from_json ((const uint8_t *) res_str, strlen (res_str), NULL); ASSERT (res_bson); ASSERT (bson_iter_init_find (&iter, res_bson, "plaintext")); decrypted = bson_strdup (bson_iter_utf8 (&iter, NULL)); ASSERT_CMPSTR (decrypted, key_data_b64url); bson_destroy (res_bson); kms_response_destroy (res); bson_free (req_str); bson_free (bearer_token); kms_request_destroy (req); bson_free (encrypted_raw); bson_free (key_data_b64url); bson_free (key_data); bson_free (decrypted); kms_request_opt_destroy (opt); } int main (int argc, char **argv) { kms_message_init (); test_gcp (); return 0; } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_kmip_request.c000066400000000000000000000250011511661753600251240ustar00rootroot00000000000000#include "test_kms_assert.h" #include "kms_message/kms_kmip_request.h" /* */ #define REGISTER_SECRETDATA_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x01, 0x50, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x01, 0x08, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0xf0, 0x42, 0x00, 0x57, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x91, 0x01, 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x08, 0x01, \ 0x00, 0x00, 0x00, 0x30, 0x42, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, 0x18, \ 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, \ 0x63, 0x20, 0x55, 0x73, 0x61, 0x67, 0x65, 0x20, 0x4d, 0x61, 0x73, 0x6b, \ 0x42, 0x00, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0x01, 0x00, 0x00, 0x00, 0x98, \ 0x42, 0x00, 0x86, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, \ 0x42, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x68, \ 0x42, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x60, 0xff, 0xa8, 0xcc, 0x79, \ 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, \ 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, \ 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, \ 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, \ 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, \ 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, \ 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, \ 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec #define REGISTER_SECRETDATA_SECRETDATA \ 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, \ 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, \ 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, \ 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, \ 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, \ 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, \ 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, \ 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec void kms_kmip_request_register_secretdata_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_request_register_secretdata_test (void) { kms_request_t *req; uint8_t secret_data[] = {REGISTER_SECRETDATA_SECRETDATA}; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {REGISTER_SECRETDATA_REQUEST}; size_t expected_len = sizeof (expected_bytes); req = kms_kmip_request_register_secretdata_new ( NULL, secret_data, sizeof (secret_data)); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (expected_bytes, expected_len, actual_bytes, actual_len); kms_request_destroy (req); } void kms_kmip_request_register_secretdata_invalid_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_request_register_secretdata_invalid_test (void) { kms_request_t *req; uint8_t secret_data[KMS_KMIP_REQUEST_SECRETDATA_LENGTH] = {0}; req = kms_kmip_request_register_secretdata_new ( NULL, secret_data, KMS_KMIP_REQUEST_SECRETDATA_LENGTH - 1); ASSERT_REQUEST_ERROR (req, "SecretData length"); kms_request_destroy (req); } /* */ #define GET_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x88, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0x28, 0x42, 0x00, 0x94, 0x07, \ 0x00, 0x00, 0x00, 0x20, 0x37, 0x46, 0x4a, 0x59, 0x76, 0x6e, 0x56, 0x36, \ 0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \ 0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49 void kms_kmip_request_get_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_request_get_test (void) { kms_request_t *req; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {GET_REQUEST}; size_t expected_len = sizeof (expected_bytes); static const char *const GET_UNIQUE_IDENTIFIER = "7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"; req = kms_kmip_request_get_new (NULL, GET_UNIQUE_IDENTIFIER); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (actual_bytes, actual_len, expected_bytes, expected_len); kms_request_destroy (req); } /* */ #define ACTIVATE_REQUEST \ 0x42, 0x00, 0x78, 0x01, 0x00, 0x00, 0x00, 0x88, 0x42, 0x00, 0x77, 0x01, \ 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, \ 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, \ 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0d, 0x02, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x40, 0x42, 0x00, 0x5c, 0x05, \ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, \ 0x42, 0x00, 0x79, 0x01, 0x00, 0x00, 0x00, 0x28, 0x42, 0x00, 0x94, 0x07, \ 0x00, 0x00, 0x00, 0x20, 0x37, 0x46, 0x4a, 0x59, 0x76, 0x6e, 0x56, 0x36, \ 0x58, 0x6b, 0x61, 0x55, 0x43, 0x57, 0x75, 0x59, 0x39, 0x36, 0x62, 0x43, \ 0x53, 0x63, 0x36, 0x41, 0x75, 0x68, 0x76, 0x6b, 0x50, 0x70, 0x71, 0x49 void kms_kmip_request_activate_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_request_activate_test (void) { kms_request_t *req; const uint8_t *actual_bytes; size_t actual_len; uint8_t expected_bytes[] = {ACTIVATE_REQUEST}; size_t expected_len = sizeof (expected_bytes); static const char *const ACTIVATE_UNIQUE_IDENTIFIER = "7FJYvnV6XkaUCWuY96bCSc6AuhvkPpqI"; req = kms_kmip_request_activate_new (NULL, ACTIVATE_UNIQUE_IDENTIFIER); ASSERT_REQUEST_OK (req); actual_bytes = kms_request_to_bytes (req, &actual_len); ASSERT (actual_bytes != NULL); ASSERT_CMPBYTES (actual_bytes, actual_len, expected_bytes, expected_len); kms_request_destroy (req); } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_kmip_response.c000066400000000000000000000246671511661753600253130ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_message/kms_kmip_response.h" #include "kms_message_private.h" /* */ static const uint8_t SUCCESS_REGISTER_RESPONSE[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x90, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x65, 0x97, 0x15, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x38, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x10, 0x42, 0x00, 0x94, 0x07, 0x00, 0x00, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; static const char *const SUCCESS_REGISTER_RESPONSE_UNIQUE_IDENTIFIER = "39"; void kms_kmip_response_get_unique_identifier_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_get_unique_identifier_test (void) { kms_response_t res = {0}; char *actual_uid; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) SUCCESS_REGISTER_RESPONSE; res.kmip.len = sizeof (SUCCESS_REGISTER_RESPONSE); actual_uid = kms_kmip_response_get_unique_identifier (&res); ASSERT_RESPONSE_OK (&res); ASSERT_CMPSTR (SUCCESS_REGISTER_RESPONSE_UNIQUE_IDENTIFIER, actual_uid); free (actual_uid); } /* */ static const uint8_t SUCCESS_GET_RESPONSE[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x01, 0x40, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x65, 0x97, 0x15, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xe8, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x42, 0x00, 0x57, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x94, 0x07, 0x00, 0x00, 0x00, 0x02, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x85, 0x01, 0x00, 0x00, 0x00, 0x98, 0x42, 0x00, 0x86, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x80, 0x42, 0x00, 0x42, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x45, 0x01, 0x00, 0x00, 0x00, 0x68, 0x42, 0x00, 0x43, 0x08, 0x00, 0x00, 0x00, 0x60, 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec}; static const uint8_t SUCCESS_GET_RESPONSE_SECRETDATA[] = { 0xff, 0xa8, 0xcc, 0x79, 0xe8, 0xc3, 0x76, 0x3b, 0x01, 0x21, 0xfc, 0xd0, 0x6b, 0xb3, 0x48, 0x8c, 0x8b, 0xf4, 0x2c, 0x07, 0x74, 0x60, 0x46, 0x40, 0x27, 0x9b, 0x16, 0xb2, 0x64, 0x19, 0x40, 0x30, 0xee, 0xb0, 0x83, 0x96, 0x24, 0x1d, 0xef, 0xcc, 0x4d, 0x32, 0xd1, 0x6e, 0xa8, 0x31, 0xad, 0x77, 0x71, 0x38, 0xf0, 0x8e, 0x2f, 0x98, 0x56, 0x64, 0xc0, 0x04, 0xc2, 0x48, 0x5d, 0x6f, 0x49, 0x91, 0xeb, 0x3d, 0x9e, 0xc3, 0x28, 0x02, 0x53, 0x78, 0x36, 0xa9, 0x06, 0x6b, 0x4e, 0x10, 0xae, 0xb5, 0x6a, 0x5c, 0xcf, 0x6a, 0xa4, 0x69, 0x01, 0xe6, 0x25, 0xe3, 0x40, 0x0c, 0x78, 0x11, 0xd2, 0xec}; void kms_kmip_response_get_secretdata_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_get_secretdata_test (void) { kms_response_t res = {0}; uint8_t *actual_secretdata; size_t actual_secretdata_len; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) SUCCESS_GET_RESPONSE; res.kmip.len = sizeof (SUCCESS_GET_RESPONSE); actual_secretdata = kms_kmip_response_get_secretdata (&res, &actual_secretdata_len); ASSERT_RESPONSE_OK (&res); ASSERT_CMPBYTES (SUCCESS_GET_RESPONSE_SECRETDATA, sizeof (SUCCESS_GET_RESPONSE_SECRETDATA), actual_secretdata, actual_secretdata_len); free (actual_secretdata); } /* */ static const uint8_t ERROR_GET_RESPOSE_NOTFOUND[] = { 0x42, 0x00, 0x7b, 0x01, 0x00, 0x00, 0x00, 0xa8, 0x42, 0x00, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x48, 0x42, 0x00, 0x69, 0x01, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x6a, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x6b, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x92, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x61, 0x57, 0x1e, 0x81, 0x42, 0x00, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x50, 0x42, 0x00, 0x5c, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7f, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7e, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x7d, 0x07, 0x00, 0x00, 0x00, 0x18, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64}; void kms_kmip_response_get_secretdata_notfound_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_get_secretdata_notfound_test (void) { kms_response_t res = {0}; uint8_t *secretdata; size_t secretdata_len; res.provider = KMS_REQUEST_PROVIDER_KMIP; res.kmip.data = (uint8_t *) ERROR_GET_RESPOSE_NOTFOUND; res.kmip.len = sizeof (ERROR_GET_RESPOSE_NOTFOUND); secretdata = kms_kmip_response_get_secretdata (&res, &secretdata_len); ASSERT_RESPONSE_ERROR (&res, "ResultReasonItemNotFound"); ASSERT (NULL == secretdata); } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_kmip_response_parser.c000066400000000000000000000140571511661753600266570ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_assert.h" #include "test_kms_util.h" #include "kms_message/kms_kmip_response_parser.h" #include "kms_kmip_response_parser_private.h" /* The following sample data come from section 9.1.2 of * http://docs.oasis-open.org/kmip/spec/v1.4/os/kmip-spec-v1.4-os.html. The * data describes "A Structure containing an Enumeration, value 254, followed * by an Integer, value 255, having tags 420004 and 420005 respectively." */ static const char *const SAMPLE_KMIP = "42 00 20 | 01 | 00 00 00 20 | 42 00 04 | 05 | 00 00 00 04 | 00 00 00 FE 00 " "00 00 00 | 42 00 05 | 02 | 00 00 00 04 | 00 00 00 FF 00 00 00 00"; /* SAMPLE_KMIP_FIRST_LENGTH is the length of message after the first tag, type, * and length. */ static const int SAMPLE_KMIP_FIRST_LENGTH = 32; /* SAMPLE_KMIP_LARGE_LENGTH is a byte size larger than the message. */ static const int SAMPLE_KMIP_LARGE_LENGTH = 1024; void kms_kmip_response_parser_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_parser_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; int32_t want_bytes; kms_response_t *res; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, ==, want_bytes); /* A smaller maximum size caps the requested bytes. */ want_bytes = kms_response_parser_wants_bytes (parser, 1); ASSERT_CMPINT (1, ==, want_bytes); /* Feed one byte */ ok = kms_response_parser_feed (parser, data, 1); ASSERT_PARSER_OK (parser); ASSERT (ok); want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - 1, ==, want_bytes); /* Feed the remaining bytes. */ ok = kms_response_parser_feed ( parser, data + 1, KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH - 1); ASSERT_PARSER_OK (parser); ASSERT (ok); /* The parser knows first length. Expect the parser wants the remaining * length. */ want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (want_bytes, ==, SAMPLE_KMIP_FIRST_LENGTH); ok = kms_response_parser_feed (parser, data + KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, SAMPLE_KMIP_FIRST_LENGTH); ASSERT_PARSER_OK (parser); ASSERT (ok); /* Parser has full message. */ want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (want_bytes, ==, 0); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); kms_response_parser_destroy (parser); free (data); } static void feed_full_response (kms_response_parser_t *parser, uint8_t *data) { uint32_t i = 0; int32_t want_bytes; bool ok; want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); ASSERT_CMPINT (KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH, ==, want_bytes); while (want_bytes > 0) { ok = kms_response_parser_feed (parser, data + i, want_bytes); ASSERT_PARSER_OK (parser); ASSERT (ok); i += want_bytes; want_bytes = kms_response_parser_wants_bytes (parser, SAMPLE_KMIP_LARGE_LENGTH); } } void kms_kmip_response_parser_reuse_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_parser_reuse_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; kms_response_t *res; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); feed_full_response (parser, data); ASSERT_PARSER_OK (parser); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); /* Feed another full response. */ feed_full_response (parser, data); ASSERT_PARSER_OK (parser); res = kms_response_parser_get_response (parser); ASSERT_PARSER_OK (parser); ASSERT (res); kms_response_destroy (res); kms_response_parser_destroy (parser); free (data); } void kms_kmip_response_parser_excess_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_parser_excess_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); feed_full_response (parser, data); ASSERT_PARSER_OK (parser); ok = kms_response_parser_feed (parser, data, 1); ASSERT_PARSER_ERROR (parser, "KMIP parser was fed too much data"); ASSERT (!ok); kms_response_parser_destroy (parser); free (data); } void kms_kmip_response_parser_notenough_test (void); // -Wmissing-prototypes: for testing only. void kms_kmip_response_parser_notenough_test (void) { kms_response_parser_t *parser; uint8_t *data; size_t outlen; kms_response_t *res; bool ok; data = hex_to_data (SAMPLE_KMIP, &outlen); parser = kms_kmip_response_parser_new (NULL); ok = kms_response_parser_feed ( parser, data, KMS_KMIP_RESPONSE_PARSER_FIRST_LENGTH); ASSERT_PARSER_OK (parser); ASSERT (ok); res = kms_response_parser_get_response (parser); ASSERT_PARSER_ERROR (parser, "KMIP parser does not have a complete message"); ASSERT (!res); kms_response_parser_destroy (parser); free (data); } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_online_util.c000066400000000000000000000066101511661753600247420ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_online_util.h" #include "test_kms_assert.h" #include "kms_message/kms_response_parser.h" mongoc_stream_t * connect_with_tls (const char *host, const char *port, mongoc_ssl_opt_t *ssl_opt) { mongoc_stream_t *stream; mongoc_socket_t *sock = NULL; struct addrinfo hints; struct addrinfo *result, *rp; int64_t expire_at; int s; const int connecttimeoutms = 5000; memset (&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; if (!port) { port = "443"; } s = getaddrinfo (host, port, &hints, &result); ASSERT_CMPINT (s, ==, 0); for (rp = result; rp; rp = rp->ai_next) { if (!(sock = mongoc_socket_new ( rp->ai_family, rp->ai_socktype, rp->ai_protocol))) { continue; } expire_at = bson_get_monotonic_time () + (connecttimeoutms * 1000L); if (0 != mongoc_socket_connect ( sock, rp->ai_addr, (mongoc_socklen_t) rp->ai_addrlen, expire_at)) { mongoc_socket_destroy (sock); sock = NULL; continue; } break; } if (!sock) { TEST_ERROR ("Failed to connect: %s", host); } freeaddrinfo (result); stream = mongoc_stream_socket_new (sock); ASSERT (stream); if (ssl_opt == NULL) { ssl_opt = (mongoc_ssl_opt_t *) mongoc_ssl_opt_get_default (); } return mongoc_stream_tls_new_with_hostname ( stream, host, ssl_opt, 1); } /* Helper to send an HTTP request and receive a response. */ kms_response_t * send_kms_request (kms_request_t *req, const char *host) { mongoc_stream_t *tls_stream; char *req_str; int32_t socket_timeout_ms = 5000; ssize_t write_ret; kms_response_parser_t *response_parser; int bytes_to_read; int bytes_read; uint8_t buf[1024]; kms_response_t *response; tls_stream = connect_with_tls (host, NULL, NULL); req_str = kms_request_to_string (req); write_ret = mongoc_stream_write ( tls_stream, req_str, strlen (req_str), socket_timeout_ms); ASSERT_CMPINT ((int) write_ret, ==, (int) strlen (req_str)); response_parser = kms_response_parser_new (); while ((bytes_to_read = kms_response_parser_wants_bytes (response_parser, 1024)) > 0) { bytes_read = (int) mongoc_stream_read ( tls_stream, buf, bytes_to_read, 0, socket_timeout_ms); if (!kms_response_parser_feed (response_parser, buf, bytes_read)) { TEST_ERROR ("read failed: %s", kms_response_parser_error (response_parser)); } } response = kms_response_parser_get_response (response_parser); ASSERT (response); kms_request_free_string (req_str); kms_response_parser_destroy (response_parser); mongoc_stream_destroy (tls_stream); return response; } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_online_util.h000066400000000000000000000022241511661753600247440ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_ONLINE_UTIL_H #define TEST_KMS_ONLINE_UTIL_H #include #include "kms_message/kms_request.h" #include "kms_message/kms_response.h" /* connect_with_tls creates a TLS stream. * port may be NULL. It defaults to "443". * ssl_opt may be NULL. It defaults to mongoc_ssl_opt_default (). */ mongoc_stream_t * connect_with_tls (const char *host, const char *port, mongoc_ssl_opt_t *ssl_opt); kms_response_t * send_kms_request (kms_request_t *req, const char *host); #endif /* TEST_KMS_ONLINE_UTIL_H */ mongo-c-driver-2.2.1/src/kms-message/test/test_kms_request.c000066400000000000000000001204551511661753600241150ustar00rootroot00000000000000/* * Copyright 2018-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* Needed for strptime */ #if !defined(_GNU_SOURCE) #define _GNU_SOURCE #endif #include "kms_message/kms_message.h" #include "kms_message_private.h" #ifndef _WIN32 #include #else #include "windows/dirent.h" #endif #include #include #include #include #include #include #include #include "kms_message/kms_azure_request.h" #include "kms_message/kms_b64.h" #include "hexlify.h" #include "kms_request_str.h" #include "kms_kv_list.h" #include "kms_port.h" #include "test_kms_assert.h" static const char *aws_test_suite_dir = "aws-sig-v4-test-suite"; static const char *skipped_aws_tests[] = { /* we don't yet support temporary security credentials provided by the AWS * Security Token Service (AWS STS). see post-sts-token/readme.txt */ "post-sts-token", }; static bool skip_aws_test (const char *test_name) { size_t i; for (i = 0; i < sizeof (skipped_aws_tests) / sizeof (char *); i++) { if (0 == strcmp (test_name, skipped_aws_tests[i])) { return true; } } return false; } static bool ends_with (const char *str, const char *suffix) { size_t str_len = strlen (str); size_t suf_len = strlen (suffix); if (str_len >= suf_len && 0 == strncmp (&str[str_len - suf_len], suffix, suf_len)) { return true; } return false; } static char * last_segment (const char *str) { const char *p = str + strlen (str); while (--p > str) { if (*p == '/') { return strdup (p + 1); } } return strdup (str); } static char * test_file_path (const char *path, const char *suffix) { char *r; char *test_name = last_segment (path); char file_path[PATH_MAX]; snprintf (file_path, PATH_MAX, "%s/%s.%s", path, test_name, suffix); r = strdup (file_path); free (test_name); return r; } static void realloc_buffer (char **buffer, size_t *n, size_t len) { if (*buffer == NULL) { *buffer = malloc (len); KMS_ASSERT (*buffer); } else { *buffer = realloc (*buffer, len); } *n = len; } static ssize_t test_getline (char **lineptr, size_t *n, FILE *stream) { if (*lineptr == NULL && *n == 0) { realloc_buffer (lineptr, n, 128); } // Sanity check if ((*lineptr == NULL && *n != 0) || (*lineptr != NULL && *n == 0)) { abort (); } ssize_t count = 0; while (true) { // Read a character int c = fgetc (stream); // If the buffer is full, grow the buffer if ((*n - count) <= 1) { realloc_buffer (lineptr, n, *n + 128); } if (c == EOF) { *(*lineptr + count) = '\0'; if (count > 0) { return count; } return -1; } *(*lineptr + count) = c; ++count; // If we hit the end of the line, we are done if (c == '\n') { *(*lineptr + count) = '\0'; return count; } } } static char * read_test (const char *path, const char *suffix) { char *file_path = test_file_path (path, suffix); FILE *f; struct stat file_stat; size_t f_size; char *str; if (0 != stat (file_path, &file_stat)) { perror (file_path); abort (); } f = fopen (file_path, "r"); if (!f) { perror (file_path); abort (); } f_size = (size_t) file_stat.st_size; str = malloc (f_size + 1); KMS_ASSERT (str); memset (str, 0, f_size + 1); // Windows will convert crlf to lf // We want this behavior in this function call but // it prevents us from validating we read the whole file here. #ifndef _WIN32 if (f_size != fread (str, 1, f_size, f)) { perror (file_path); abort (); } #else fread (str, 1, f_size, f); #endif fclose (f); str[f_size] = '\0'; free (file_path); return str; } static void set_test_date (kms_request_t *request) { struct tm tm; /* all tests use the same date and time: 20150830T123600Z */ tm.tm_year = 115; tm.tm_mon = 7; tm.tm_mday = 30; tm.tm_yday = 241; tm.tm_wday = 0; tm.tm_hour = 12; tm.tm_min = 36; tm.tm_sec = 0; KMS_ASSERT (kms_request_set_date (request, &tm)); } static kms_request_t * read_req (const char *path) { kms_request_t *request; char *file_path = test_file_path (path, "req"); FILE *f; size_t len = 0; ssize_t line_len; char *line = NULL; char *method; char *uri_path; char *field_name; char *field_value; bool r; f = fopen (file_path, "r"); if (!f) { perror (file_path); abort (); } /* like "GET /path HTTP/1.1" */ line_len = test_getline (&line, &len, f); method = kms_strndup (line, strchr (line, ' ') - line); uri_path = kms_strndup (line + strlen (method) + 1, line_len - strlen (method) - 1 - strlen (" HTTP/1.1\n")); request = kms_request_new (method, uri_path, NULL); request->auto_content_length = false; /* from docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html */ kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); while ((line_len = test_getline (&line, &len, f)) != -1) { if (strchr (line, ':')) { /* new header field like Host:example.com */ field_name = strtok (line, ": "); KMS_ASSERT (field_name); field_value = strtok (NULL, "\n"); KMS_ASSERT (field_value); r = kms_request_add_header_field (request, field_name, field_value); KMS_ASSERT (r); } else if (0 == strcmp (line, "\n")) { /* end of header */ break; } else if (line_len > 2) { /* continuing a multiline header value from previous line */ /* Header line folding is deprecated by RFC 7230 section 3.2. */ /* get-header-value-multiline tests this behavior. */ kms_request_append_header_field_value (request, "\r\n", 2); /* omit this line's newline */ kms_request_append_header_field_value ( request, line, (size_t) (line_len - 1)); } } while ((line_len = test_getline (&line, &len, f)) != -1) { KMS_ASSERT (kms_request_append_payload (request, line, (size_t) line_len)); } fclose (f); free (file_path); free (line); free (uri_path); free (method); set_test_date (request); return request; } static void test_compare (kms_request_t *request, char *(*func) (kms_request_t *), const char *dir_path, const char *suffix) { char *test_name = last_segment (dir_path); char *expect; char *actual; expect = read_test (dir_path, suffix); if (0 == strcmp (suffix, "sreq")) { /* The final signed request is an HTTP request. * The expected output must contain \r\n, not \n. */ char* tmp = replace_all (expect, "\n", "\r\n"); free (expect); expect = tmp; } actual = func (request); ASSERT_CMPSTR (expect, actual); free (actual); free (expect); free (test_name); } static void test_compare_creq (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_canonical, dir_path, "creq"); } static void test_compare_sts (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_string_to_sign, dir_path, "sts"); } static void test_compare_authz (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_signature, dir_path, "authz"); } static void test_compare_sreq (kms_request_t *request, const char *dir_path) { test_compare (request, kms_request_get_signed, dir_path, "sreq"); } static void aws_sig_v4_test (const char *dir_path) { kms_request_t *request; request = read_req (dir_path); test_compare_creq (request, dir_path); test_compare_sts (request, dir_path); test_compare_authz (request, dir_path); test_compare_sreq (request, dir_path); kms_request_destroy (request); } static bool all_aws_sig_v4_tests (const char *path, const char *selected) { /* Amazon supplies tests, one per directory, 5 files per test, see * docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html */ DIR *dp; struct dirent *ent; bool ran_tests = false; char *test_name = last_segment (path); char sub[PATH_MAX]; dp = opendir (path); if (!dp) { perror (path); abort (); } if (skip_aws_test (test_name) && !selected) { TEST_PRINTF ("SKIP: %s\n", test_name); goto done; } while ((ent = readdir (dp))) { if (ent->d_name[0] == '.') { continue; } if (ent->d_type & DT_DIR) { snprintf (sub, PATH_MAX, "%s/%s", path, ent->d_name); ran_tests |= all_aws_sig_v4_tests (sub, selected); } if (!(ent->d_type & DT_REG) || !ends_with (ent->d_name, ".req")) { continue; } /* "ent" is a "test.req" request file, this is a test directory */ /* skip the test if it doesn't match the name passed to us */ if (selected && 0 != strcmp (test_name, selected)) { continue; } TEST_PRINTF ("%s\n", path); aws_sig_v4_test (path); ran_tests = true; } done: (void) closedir (dp); free (test_name); return ran_tests; } /* docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html */ static void example_signature_test (void) { const char *expect = "c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9"; kms_request_t *request; unsigned char signing[32]; char *sig; request = kms_request_new ("GET", "uri", NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "iam"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); KMS_ASSERT (kms_request_get_signing_key (request, signing)); sig = hexlify (signing, 32); ASSERT_CMPSTR (expect, sig); free (sig); kms_request_destroy (request); } static void path_normalization_test (void) { const char *tests[][2] = { {"", "/"}, {"/", "/"}, {"/..", "/"}, {"./..", "/"}, {"../..", "/"}, {"/../..", "/"}, {"a", "a"}, {"a/", "a/"}, {"a//", "a/"}, {"a///", "a/"}, {"/a", "/a"}, {"//a", "/a"}, {"///a", "/a"}, {"/a/", "/a/"}, {"/a/..", "/"}, {"/a/../..", "/"}, {"/a/b/../..", "/"}, {"/a/b/c/../..", "/a"}, {"/a/b/../../d", "/d"}, {"/a/b/c/../../d", "/a/d"}, {"/a/b", "/a/b"}, {"a/..", "/"}, {"a/../..", "/"}, {"a/b/../..", "/"}, {"a/b/c/../..", "a"}, {"a/b/../../d", "d"}, {"a/b/c/../../d", "a/d"}, {"a/b", "a/b"}, {"/a//b", "/a/b"}, {"/a///b", "/a/b"}, {"/a////b", "/a/b"}, {"//", "/"}, {"//a///", "/a/"}, }; const char **test; const char *out; size_t i; kms_request_str_t *in, *norm; for (i = 0; i < sizeof (tests) / (2 * sizeof (const char *)); i++) { test = tests[i]; in = kms_request_str_new_from_chars (test[0], -1); out = test[1]; norm = kms_request_str_path_normalized (in); ASSERT_CMPSTR (out, norm->str); kms_request_str_destroy (in); kms_request_str_destroy (norm); } } static kms_request_t * make_test_request (void) { kms_request_t *request = kms_request_new ("POST", "/", NULL); kms_request_set_region (request, "foo-region"); kms_request_set_service (request, "foo-service"); kms_request_set_access_key_id (request, "foo-akid"); kms_request_set_secret_key (request, "foo-key"); set_test_date (request); return request; } static void host_test (void) { kms_request_t *request = make_test_request (); test_compare_sreq (request, "test/host"); kms_request_destroy (request); } static void content_length_test (void) { const char *payload = "foo-payload"; kms_request_t *request = make_test_request (); KMS_ASSERT (kms_request_append_payload (request, payload, strlen (payload))); test_compare_sreq (request, "test/content_length"); kms_request_destroy (request); } static void bad_query_test (void) { kms_request_t *request = kms_request_new ("GET", "/?asdf", NULL); ASSERT_CONTAINS (kms_request_get_error (request), "Cannot parse"); kms_request_destroy (request); } static void append_header_field_value_test (void) { kms_request_t *request = kms_request_new ("GET", "/", NULL); KMS_ASSERT (kms_request_add_header_field (request, "a", "b")); KMS_ASSERT (kms_request_append_header_field_value (request, "asdf", 4)); /* header field 0 is "X-Amz-Date", field 1 is "a" */ ASSERT_CMPSTR (request->header_fields->kvs[1].value->str, "basdf"); kms_request_destroy (request); } static void set_date_test (void) { // Windows CRT asserts on this negative test because it is a negative test // so it is skipped on Windows. #ifndef _WIN32 struct tm tm = {0}; kms_request_t *request = kms_request_new ("GET", "/", NULL); tm.tm_sec = 9999; /* invalid, shouldn't be > 60 */ KMS_ASSERT (!kms_request_set_date (request, &tm)); ASSERT_CONTAINS (kms_request_get_error (request), "Invalid tm struct"); kms_request_destroy (request); #endif } static void multibyte_test (void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" kms_request_t *request = kms_request_new ("GET", "/" EU "/?euro=" EU, NULL); set_test_date (request); KMS_ASSERT (kms_request_set_region (request, EU)); KMS_ASSERT (kms_request_set_service (request, EU)); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); KMS_ASSERT (kms_request_add_header_field (request, EU, EU)); KMS_ASSERT (kms_request_append_header_field_value (request, "asdf" EU, 7)); KMS_ASSERT (kms_request_append_payload (request, EU, sizeof (EU))); /* header field 0 is "X-Amz-Date" */ ASSERT_CMPSTR (request->header_fields->kvs[1].value->str, EU "asdf" EU); test_compare_creq (request, "test/multibyte"); test_compare_sreq (request, "test/multibyte"); kms_request_destroy (request); #undef EU } static void connection_close_test (void) { kms_request_opt_t *opt; kms_request_t *request; opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); request = kms_request_new ("POST", "/", opt); kms_request_set_region (request, "foo-region"); kms_request_set_service (request, "foo-service"); kms_request_set_access_key_id (request, "foo-akid"); kms_request_set_secret_key (request, "foo-key"); set_test_date (request); test_compare_sreq (request, "test/connection_close"); kms_request_opt_destroy (opt); kms_request_destroy (request); } /* the ciphertext blob from a response to an "Encrypt" API call */ static const char ciphertext_blob[] = "\x01\x02\x02\x00\x78\xf3\x8e\xd8\xd4\xc6\xba\xfb\xa1\xcf\xc1\x1e\x68\xf2" "\xa1\x91\x9e\x36\x4d\x74\xa2\xc4\x9e\x30\x67\x08\x53\x33\x0d\xcd\xe0\xc9" "\x1b\x01\x60\x30\xd4\x73\x9e\x90\x1f\xa7\x43\x55\x84\x26\xf9\xd5\xf0\xb1" "\x00\x00\x00\x64\x30\x62\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x07\x06\xa0" "\x55\x30\x53\x02\x01\x00\x30\x4e\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x07" "\x01\x30\x1e\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x2e\x30\x11\x04\x0c" "\xa2\xc7\x12\x1c\x25\x38\x0e\xec\x08\x1f\x23\x09\x02\x01\x10\x80\x21\x61" "\x03\xcd\xcb\xe2\xac\x36\x4f\x73\xdb\x1b\x73\x2e\x33\xda\x45\x51\xf4\xcd" "\xc0\xff\xd2\xe1\xb9\xc4\xc2\x0e\xbf\x53\x90\x46\x18\x42"; static void decrypt_request_test (void) { kms_request_t *request = kms_decrypt_request_new ( (uint8_t *) ciphertext_blob, sizeof (ciphertext_blob) - 1, NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); test_compare_creq (request, "test/decrypt"); test_compare_sreq (request, "test/decrypt"); kms_request_destroy (request); } static void encrypt_request_test (void) { char *plaintext = "foobar"; kms_request_t *request = kms_encrypt_request_new ( (uint8_t *) plaintext, strlen (plaintext), "alias/1", NULL); set_test_date (request); kms_request_set_region (request, "us-east-1"); kms_request_set_service (request, "service"); kms_request_set_access_key_id (request, "AKIDEXAMPLE"); kms_request_set_secret_key (request, "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY"); test_compare_creq (request, "test/encrypt"); test_compare_sreq (request, "test/encrypt"); kms_request_destroy (request); } static void kv_list_del_test (void) { kms_kv_list_t *lst = kms_kv_list_new (); kms_request_str_t *k = kms_request_str_new_from_chars ("one", -1); kms_request_str_t *v = kms_request_str_new_from_chars ("v", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "two", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "three", -1); kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "two", -1); /* dupe */ kms_kv_list_add (lst, k, v); kms_request_str_set_chars (k, "four", -1); kms_kv_list_add (lst, k, v); KMS_ASSERT (lst->len == 5); kms_kv_list_del (lst, "two"); /* delete both "two" keys */ KMS_ASSERT (lst->len == 3); ASSERT_CMPSTR (lst->kvs[0].key->str, "one"); ASSERT_CMPSTR (lst->kvs[1].key->str, "three"); ASSERT_CMPSTR (lst->kvs[2].key->str, "four"); kms_request_str_destroy (k); kms_request_str_destroy (v); kms_kv_list_destroy (lst); } static void b64_test (void) { uint8_t *expected = (uint8_t *) "\x01\x02\x03\x04"; char encoded[9]; int r; uint8_t data[5]; r = kms_message_b64_ntop (expected, 4, encoded, 9); KMS_ASSERT (r == 8); ASSERT_CMPSTR (encoded, "AQIDBA=="); r = kms_message_b64_pton (encoded, data, 5); /* +1 for terminator */ KMS_ASSERT (r == 4); KMS_ASSERT (0 == memcmp (expected, data, 4)); } static void b64_b64url_test (void) { char base64_data[64]; char base64url_data[64]; int ret; memset (base64_data, 0, sizeof (base64_data)); memset (base64url_data, 0, sizeof (base64url_data)); strcpy (base64_data, "PDw/Pz8+Pg=="); ret = kms_message_b64_to_b64url (base64_data, strlen (base64_data), base64url_data, sizeof (base64url_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64url_data, "PDw_Pz8-Pg=="); memset (base64_data, 0, sizeof (base64_data)); ret = kms_message_b64url_to_b64 (base64url_data, strlen (base64url_data), base64_data, sizeof (base64_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64_data, "PDw/Pz8+Pg=="); /* Convert to base64url in-place. */ ret = kms_message_b64_to_b64url ( base64_data, strlen (base64_data), base64_data, sizeof (base64_data)); ASSERT (ret == 12); ASSERT_CMPSTR (base64_data, "PDw_Pz8-Pg=="); } static void kms_response_parser_test (void) { kms_response_parser_t *parser = kms_response_parser_new (); kms_response_t *response; /* the parser resets after returning a response. */ ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "Content-Length: 15\r\n", 20)); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "This is a test.", 15)); ASSERT (0 == kms_response_parser_wants_bytes (parser, 123)); response = kms_response_parser_get_response (parser); ASSERT (response->status == 200); ASSERT_CMPSTR (response->body->str, "This is a test."); kms_response_destroy (response); kms_response_parser_destroy (parser); /* We fail to parse invalid HTTP */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "To Whom it May Concern\r\n", 24)); kms_response_parser_destroy (parser); /* We fail on HTTP other than 1.1 */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "HTTP/6.1 200 OK\r\n", 17)); kms_response_parser_destroy (parser); /* We fail if there is no status */ parser = kms_response_parser_new (); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 CREATED\r\n", 18)); kms_response_parser_destroy (parser); /* We do not fail when parsing a non-200 status code, * as the content may provide a useful error message. */ parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 100 CONTINUE\r\n", 23)); ASSERT (kms_response_parser_status (parser) == 100); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 201 CREATED\r\n", 22)); ASSERT (kms_response_parser_status (parser) == 201); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 301 MOVED PERMANENTLY\r\n", 32)); ASSERT (kms_response_parser_status (parser) == 301); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 400 BAD REQUEST\r\n", 26)); ASSERT (kms_response_parser_status (parser) == 400); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 404 NOT FOUND\r\n", 24)); ASSERT (kms_response_parser_status (parser) == 404); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "HTTP/1.1 500 INTERNAL SERVER ERROR\r\n", 36)); ASSERT (kms_response_parser_status (parser) == 500); kms_response_parser_destroy (parser); /* We fail if the header doesn't have a colon in it */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (!kms_response_parser_feed ( parser, (uint8_t *) "Content-Length= 15\r\n", 20)); ASSERT (strstr (kms_response_parser_error (parser), "Could not parse header, no colon found.")); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT ( !kms_response_parser_feed (parser, (uint8_t *) "Anything else\r\n", 15)); ASSERT (strstr (kms_response_parser_error (parser), "Could not parse header, no colon found.")); kms_response_parser_destroy (parser); /* An empty body is ok. */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); kms_response_parser_destroy (parser); /* Extra content is not ok. */ parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (!kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (strstr (kms_response_parser_error (parser), "Unexpected extra HTTP content")); kms_response_parser_destroy (parser); parser = kms_response_parser_new (); ASSERT ( kms_response_parser_feed (parser, (uint8_t *) "HTTP/1.1 200 OK\r\n", 17)); ASSERT (kms_response_parser_status (parser) == 200); ASSERT (kms_response_parser_feed ( parser, (uint8_t *) "Content-Length: 5\r\n", 19)); ASSERT (kms_response_parser_feed (parser, (uint8_t *) "\r\n", 2)); ASSERT (!kms_response_parser_feed (parser, (uint8_t *) "abcdefghi", 9)); ASSERT (strstr (kms_response_parser_error (parser), "Unexpected: exceeded content length")); kms_response_parser_destroy (parser); } typedef struct { const char *filepath; const char *expected_body; int max_to_read; int expected_status; } parser_testcase_t; /* File should have \r\n line endings (use /etc/rewrite.py) */ static void parser_testcase_run (parser_testcase_t *testcase) { FILE *response_file; kms_response_parser_t *parser; kms_response_t *response; uint8_t buf[512] = {0}; int bytes_to_read; response_file = fopen (testcase->filepath, "rb"); ASSERT (response_file); parser = kms_response_parser_new (); while ((bytes_to_read = kms_response_parser_wants_bytes ( parser, testcase->max_to_read)) > 0) { if (bytes_to_read > testcase->max_to_read) { bytes_to_read = testcase->max_to_read; } size_t ret = fread (buf, 1, (size_t) bytes_to_read, response_file); if (!kms_response_parser_feed (parser, buf, (int) ret)) { TEST_PRINTF ("feed error: %s\n", parser->error); ASSERT (false); } } fclose (response_file); ASSERT (0 == kms_response_parser_wants_bytes (parser, 123)); response = kms_response_parser_get_response (parser); ASSERT_CMPSTR (testcase->expected_body, response->body->str); ASSERT (response->status == testcase->expected_status); kms_response_parser_destroy (parser); kms_response_destroy (response); } static void kms_response_parser_files (void) { const char *body = "{\"CiphertextBlob\":\"AQICAHifzrL6n/" "3uqZyz+z1bJj80DhqPcSAibAaIoYc+HOVP6QEplwbM0wpvU5zsQG/" "1SBKvAAAAZDBiBgkqhkiG9w0BBwagVTBTAgEAME4GCSqGSIb3DQEHATA" "eBglghkgBZQMEAS4wEQQM5syMJE7RodxDaqYqAgEQgCHMFCnFso4Lih0" "CNbLT1kiET0hQyzjgoa9733353GQkGlM=\",\"KeyId\":\"arn:aws:" "kms:us-east-1:524754917239:key/" "bd05530b-0a7f-4fbd-8362-ab3667370db0\"}"; const char *chunked_body = "{\"access_token\":" "\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"," "\"expires_in\":3599,\"token_type\":\"Bearer\"}"; parser_testcase_t tests[] = { {"./test/example-response.bin", body, 512, 200}, {"./test/example-response.bin", body, 1, 200}, {"./test/example-chunked-response.bin", chunked_body, 512, 200}, {"./test/example-chunked-response.bin", chunked_body, 1, 200}, {"./test/example-multi-chunked-response.bin", chunked_body, 512, 200}, {"./test/example-multi-chunked-response.bin", chunked_body, 1, 200}}; size_t i; for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) { TEST_PRINTF (" parser testcase: %d\n", (int) i); parser_testcase_run (tests + i); } } #define CLEAR(_field) \ do { \ kms_request_str_destroy (_field); \ _field = kms_request_str_new (); \ } while (0) static void kms_request_validate_test (void) { kms_request_t *request = NULL; request = make_test_request (); CLEAR (request->region); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Region not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->service); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Service not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->access_key_id); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Access key ID not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->method); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Method not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->path); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Path not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->date); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Date not set", kms_request_get_error (request)); kms_request_destroy (request); request = make_test_request (); CLEAR (request->secret_key); ASSERT (NULL == kms_request_get_signed (request)); ASSERT_CMPSTR ("Secret key not set", kms_request_get_error (request)); kms_request_destroy (request); } /* Test private key signing. * * private_key_b64 was generated by taking the base64 data out of * test-private-key.pem generated as follows: openssl genpkey -out * test-private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048 * * It was used to generate a test signature of the string "data to sign" with: * openssl dgst -sign test-private-key.pem -sha256 signme.txt | base64 */ static void kms_signature_test (void) { const char *private_key_b64 = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4JOyv5z05cL18ztpknRC7" "CFY2gYol4DAKerdVUoDJxCTmFMf39dVUEqD0WDiw/qcRtSO1/" "FRut08PlSPmvbyKetsLoxlpS8lukSzEFpFK7+L+R4miFOl6HvECyg7lbC1H/" "WGAhIz9yZRlXhRo9qmO/" "fB6PV9IeYtU+" "1xYuXicjCDPp36uuxBAnCz7JfvxJ3mdVc0vpSkbSb141nWuKNYR1mgyvvL6KzxO6mYsCo4hR" "AdhuizD9C4jDHk0V2gDCFBk0h8SLEdzStX8L0jG90/Og4y7J1b/cPo/" "kbYokkYisxe8cPlsvGBf+rZex7XPxc1yWaP080qeABJb+S88O//" "LAgMBAAECggEBAKVxP1m3FzHBUe2NZ3fYCc0Qa2zjK7xl1KPFp2u4CU+" "9sy0oZJUqQHUdm5CMprqWwIHPTftWboFenmCwrSXFOFzujljBO7Z3yc1WD3NJl1ZNepLcsRJ" "3WWFH5V+NLJ8Bdxlj1DMEZCwr7PC5+vpnCuYWzvT0qOPTl9RNVaW9VVjHouJ9Fg+" "s2DrShXDegFabl1iZEDdI4xScHoYBob06A5lw0WOCTayzw0Naf37lM8Y4psRAmI46XLiF/" "Vbuorna4hcChxDePlNLEfMipICcuxTcei1RBSlBa2t1tcnvoTy6cuYDqqImRYjp1KnMKlKQB" "nQ1NjS2TsRGm+F0FbreVCECgYEA4IDJlm8q/hVyNcPe4OzIcL1rsdYN3bNm2Y2O/" "YtRPIkQ446ItyxD06d9VuXsQpFp9jNACAPfCMSyHpPApqlxdc8z/" "xATlgHkcGezEOd1r4E7NdTpGg8y6Rj9b8kVlED6v4grbRhKcU6moyKUQT3+" "1B6ENZTOKyxuyDEgTwZHtFECgYEA0fqdv9h9s77d6eWmIioP7FSymq93pC4umxf6TVicpjpM" "ErdD2ZfJGulN37dq8FOsOFnSmFYJdICj/PbJm6p1i8O21lsFCltEqVoVabJ7/" "0alPfdG2U76OeBqI8ZubL4BMnWXAB/" "VVEYbyWCNpQSDTjHQYs54qa2I0dJB7OgJt1sCgYEArctFQ02/" "7H5Rscl1yo3DBXO94SeiCFSPdC8f2Kt3MfOxvVdkAtkjkMACSbkoUsgbTVqTYSEOEc2jTgR3" "iQ13JgpHaFbbsq64V0QP3TAxbLIQUjYGVgQaF1UfLOBv8hrzgj45z/ST/" "G80lOl595+0nCUbmBcgG1AEWrmdF0/" "3RmECgYAKvIzKXXB3+19vcT2ga5Qq2l3TiPtOGsppRb2XrNs9qKdxIYvHmXo/" "9QP1V3SRW0XoD7ez8FpFabp42cmPOxUNk3FK3paQZABLxH5pzCWI9PzIAVfPDrm+" "sdnbgG7vAnwfL2IMMJSA3aDYGCbF9EgefG+" "STcpfqq7fQ6f5TBgLFwKBgCd7gn1xYL696SaKVSm7VngpXlczHVEpz3kStWR5gfzriPBxXgM" "VcWmcbajRser7ARpCEfbxM1UJyv6oAYZWVSNErNzNVb4POqLYcCNySuC6xKhs9FrEQnyKjyk" "8wI4VnrEMGrQ8e+qYSwYk9Gh6dKGoRMAPYVXQAO0fIsHF/T0a"; const char *data_to_sign = "data to sign"; const char *expected_signature = "VocBRhpMmQ2XCzVehWSqheQLnU889gf3dhU4AnVnQTJjsKx/CM23qKDPkZDd2A/" "BnQsp99SN7ksIX5Raj0TPwyN5OCN/YrNFNGoOFlTsGhgP/" "hyE8X3Duiq6sNO0SMvRYNPFFGlJFsp1Fw3Z94eYMg4/Wpw5s4+Jo5Zm/" "qY7aTJIqDKDQ3CNHLeJgcMUOc9sz01/" "GzoUYKDVODHSxrYEk5ireFJFz9vP8P7Ha+" "VDUZuQIQdXer9NBbGFtYmWprY3nn4D3Dw93Sn0V0dIqYeIo91oKyslvMebmUM95S2PyIJdEp" "Pb2DJDxjvX/0LLwSWlSXRWy9gapWoBkb4ynqZBsg=="; uint8_t *private_key_raw; size_t private_key_len; unsigned char *signature_raw; bool ret; char *signature_b64; private_key_raw = kms_message_b64_to_raw (private_key_b64, &private_key_len); signature_raw = malloc (256); ret = kms_sign_rsaes_pkcs1_v1_5 (NULL /* unused ctx */, (const char *) private_key_raw, private_key_len, data_to_sign, strlen (data_to_sign), signature_raw); KMS_ASSERT (ret); signature_b64 = kms_message_raw_to_b64 (signature_raw, 256); if (0 != strcmp (signature_b64, expected_signature)) { TEST_PRINTF ("generated signature: %s\n", signature_b64); TEST_PRINTF ("but expected signature: %s\n", expected_signature); abort (); } /* Test with an invalid key. */ ret = kms_sign_rsaes_pkcs1_v1_5 ( NULL, "blah", 4, data_to_sign, strlen (data_to_sign), signature_raw); free (private_key_raw); free (signature_raw); free (signature_b64); KMS_ASSERT (!ret); } static void kms_request_kmip_prohibited_test (void) { kms_request_opt_t *opt; kms_request_t *req; opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_KMIP); req = kms_request_new ("method", "path_and_query", opt); ASSERT_REQUEST_ERROR (req, "Function not applicable to KMIP"); kms_request_destroy (req); kms_request_opt_destroy (opt); } static int count_substrings (const char *big, const char *little) { char *iter; int count = 0; iter = strstr (big, little); while (iter != NULL) { count += 1; iter += strlen (little); iter = strstr (iter, little); } return count; } /* Test that outgoing HTTP requests use \r\n line delimitters, not \n. * This is a regression test for MONGOCRYPT-457. */ static void test_request_newlines (void) { bool ok; kms_request_t *req; kms_request_opt_t *opt; uint8_t example_data[] = {0x01, 0x02, 0x03, 0x04}; // Test kms_request_to_string. { opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); ASSERT (kms_request_opt_set_provider (opt, KMS_REQUEST_PROVIDER_AZURE)); req = kms_azure_request_wrapkey_new ("example-host", "example-access-token", "example-key-name", "example-key-version", example_data, sizeof (example_data), opt); ASSERT_REQUEST_OK (req); char *req_str = kms_request_to_string (req); ASSERT_REQUEST_OK (req); ASSERT (req_str); /* Check that all \n have a \r. */ int n = count_substrings (req_str, "\n"); int rn = count_substrings (req_str, "\r\n"); ASSERT_CMPINT (n, ==, rn); ASSERT_CMPINT (rn, ==, 8); free (req_str); kms_request_opt_destroy (opt); kms_request_destroy (req); } // Test kms_request_get_signed. { opt = kms_request_opt_new (); ASSERT (opt); kms_request_opt_set_connection_close (opt, true); req = kms_caller_identity_request_new (opt); ASSERT_REQUEST_OK (req); ok = kms_request_set_region (req, "example-region"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_service (req, "example-service"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_access_key_id (req, "example-access-key-id"); ASSERT_REQUEST_OK (req); ASSERT (ok); ok = kms_request_set_secret_key (req, "example-secret-key"); ASSERT_REQUEST_OK (req); ASSERT (ok); char *req_str = kms_request_get_signed (req); ASSERT_REQUEST_OK (req); ASSERT (req_str); /* Check that all \n have a \r. */ int n = count_substrings (req_str, "\n"); int rn = count_substrings (req_str, "\r\n"); ASSERT_CMPINT (n, ==, rn); ASSERT_CMPINT (rn, ==, 8); free (req_str); kms_request_opt_destroy (opt); kms_request_destroy (req); } } #define RUN_TEST(_func) \ do { \ if (!selector || 0 == kms_strcasecmp (#_func, selector)) { \ TEST_PRINTF ("%s\n", #_func); \ _func (); \ ran_tests = true; \ } \ } while (0) extern void kms_kmip_writer_test (void); extern void kms_kmip_reader_test (void); extern void kms_kmip_reader_negative_int_test (void); extern void kms_kmip_reader_find_test (void); extern void kms_kmip_reader_find_and_recurse_test (void); extern void kms_kmip_reader_find_and_read_enum_test (void); extern void kms_kmip_reader_find_and_read_bytes_test (void); extern void kms_kmip_request_register_secretdata_test (void); extern void kms_kmip_request_register_secretdata_invalid_test (void); extern void kms_kmip_request_get_test (void); extern void kms_kmip_request_activate_test (void); extern void kms_kmip_response_parser_test (void); extern void kms_kmip_response_get_unique_identifier_test (void); extern void kms_kmip_response_get_secretdata_test (void); extern void kms_kmip_response_get_secretdata_notfound_test (void); extern void kms_kmip_response_parser_reuse_test (void); extern void kms_kmip_response_parser_excess_test (void); extern void kms_kmip_response_parser_notenough_test (void); int main (int argc, char *argv[]) { const char *help; char *selector = NULL; bool ran_tests = false; help = "Usage: test_kms_request [TEST_NAME]"; if (argc > 2) { TEST_STDERR_PRINTF ("%s\n", help); abort (); } else if (argc == 2) { selector = argv[1]; } int ret = kms_message_init (); if (ret != 0) { TEST_PRINTF ("kms_message_init failed: 0x%d\n", ret); abort (); } RUN_TEST (example_signature_test); RUN_TEST (path_normalization_test); RUN_TEST (host_test); RUN_TEST (content_length_test); RUN_TEST (bad_query_test); RUN_TEST (append_header_field_value_test); RUN_TEST (set_date_test); RUN_TEST (multibyte_test); RUN_TEST (connection_close_test); RUN_TEST (decrypt_request_test); RUN_TEST (encrypt_request_test); RUN_TEST (kv_list_del_test); RUN_TEST (b64_test); RUN_TEST (b64_b64url_test); ran_tests |= all_aws_sig_v4_tests (aws_test_suite_dir, selector); RUN_TEST (kms_response_parser_test); RUN_TEST (kms_response_parser_files); RUN_TEST (kms_request_validate_test); RUN_TEST (kms_signature_test); RUN_TEST (kms_kmip_writer_test); RUN_TEST (kms_kmip_reader_test); RUN_TEST (kms_kmip_reader_negative_int_test); RUN_TEST (kms_kmip_reader_test); RUN_TEST (kms_kmip_reader_find_and_recurse_test); RUN_TEST (kms_kmip_reader_find_and_read_enum_test); RUN_TEST (kms_kmip_reader_find_and_read_bytes_test); RUN_TEST (kms_kmip_request_register_secretdata_test); RUN_TEST (kms_kmip_request_register_secretdata_invalid_test); RUN_TEST (kms_kmip_request_get_test); RUN_TEST (kms_kmip_request_activate_test); RUN_TEST (kms_request_kmip_prohibited_test); RUN_TEST (kms_kmip_response_parser_test); RUN_TEST (kms_kmip_response_get_unique_identifier_test); RUN_TEST (kms_kmip_response_get_secretdata_test); RUN_TEST (kms_kmip_response_get_secretdata_notfound_test); RUN_TEST (kms_kmip_response_parser_reuse_test); RUN_TEST (kms_kmip_response_parser_excess_test); RUN_TEST (kms_kmip_response_parser_notenough_test); RUN_TEST (test_request_newlines); RUN_TEST (test_kms_util); if (!ran_tests) { KMS_ASSERT (argc == 2); TEST_STDERR_PRINTF ("No such test: \"%s\"\n", argv[1]); abort (); } kms_message_cleanup (); return 0; } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_util.c000066400000000000000000000046171511661753600234030ustar00rootroot00000000000000/* * Copyright 2021-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "test_kms_util.h" #include "test_kms_assert.h" #include "hexlify.h" #include /* tolower */ char * copy_and_filter_hex (const char *unfiltered_hex) { size_t i, j; char *filtered = malloc (strlen (unfiltered_hex) + 1); j = 0; for (i = 0; i < strlen (unfiltered_hex); i++) { if (unfiltered_hex[i] != ' ' && unfiltered_hex[i] != '|') { filtered[j] = (char) tolower (unfiltered_hex[i]); j++; } } filtered[j] = '\0'; return filtered; } uint8_t * hex_to_data (const char *unfiltered_hex, size_t *outlen) { char *filtered_hex; uint8_t *bytes; size_t i; filtered_hex = copy_and_filter_hex (unfiltered_hex); *outlen = strlen (filtered_hex) / 2; bytes = malloc (*outlen); for (i = 0; i < *outlen; i++) { bytes[i] = unhexlify (filtered_hex + (i * 2), 2); } free (filtered_hex); return bytes; } char * data_to_hex (const uint8_t *buf, size_t len) { return hexlify (buf, len); } char * replace_all (const char *input, const char *match, const char *replacement) { ASSERT (input); ASSERT (match); ASSERT (replacement); kms_request_str_t *replaced = kms_request_str_new (); const char *start = input; const char *iter = strstr (input, match); while (iter != NULL) { kms_request_str_append_chars (replaced, start, (ssize_t) (iter - start)); kms_request_str_append_chars ( replaced, replacement, (ssize_t) strlen (replacement)); iter += strlen (match); start = iter; iter = strstr (iter, match); } // Append the remainder of input. kms_request_str_append_chars (replaced, start, -1); return kms_request_str_detach (replaced); } void test_kms_util (void) { char *got = replace_all ("foo bar baz", "bar", "baz"); ASSERT_CMPSTR (got, "foo baz baz"); free (got); } mongo-c-driver-2.2.1/src/kms-message/test/test_kms_util.h000066400000000000000000000025771511661753600234130ustar00rootroot00000000000000/* * Copyright 2020-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_KMS_UTIL_H #define TEST_KMS_UTIL_H #include #include "kms_request_str.h" /* copy_and_filter_hex returns a copy of @unfiltered_hex with the following * characters removed: ' ', '|' */ char * copy_and_filter_hex (const char *unfiltered_hex); /* hex_to_data calls copy_and_filter_hex on @unfiltered_hex, then converts it to * binary and returns a byte array. */ uint8_t * hex_to_data (const char *unfiltered_hex, size_t *outlen); char * data_to_hex (const uint8_t *data, size_t len); /* replace_all returns a copy of @input with all occurrences of @match replaced * with @replacement. */ char * replace_all (const char *input, const char *match, const char *replacement); /* test_kms_util tests utility functions. */ void test_kms_util (void); #endif /* TEST_KMS_UTIL_H */ mongo-c-driver-2.2.1/src/kms-message/test/windows/000077500000000000000000000000001511661753600220335ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/kms-message/test/windows/dirent.h000066400000000000000000000717701511661753600235050ustar00rootroot00000000000000/* * Dirent interface for Microsoft Visual Studio * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent. Dirent may be freely distributed * under the MIT license. For all details and documentation, see * https://github.com/tronkko/dirent */ #ifndef DIRENT_H #define DIRENT_H /* * Include windows.h without Windows Sockets 1.1 to prevent conflicts with * Windows Sockets 2.0. */ #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include #include #include #include #include #include #include #include #include #include /* Indicates that d_type field is available in dirent structure */ #define _DIRENT_HAVE_D_TYPE /* Indicates that d_namlen field is available in dirent structure */ #define _DIRENT_HAVE_D_NAMLEN /* Entries missing from MSVC 6.0 */ #if !defined(FILE_ATTRIBUTE_DEVICE) # define FILE_ATTRIBUTE_DEVICE 0x40 #endif /* File type and permission flags for stat(), general mask */ #if !defined(S_IFMT) # define S_IFMT _S_IFMT #endif /* Directory bit */ #if !defined(S_IFDIR) # define S_IFDIR _S_IFDIR #endif /* Character device bit */ #if !defined(S_IFCHR) # define S_IFCHR _S_IFCHR #endif /* Pipe bit */ #if !defined(S_IFFIFO) # define S_IFFIFO _S_IFFIFO #endif /* Regular file bit */ #if !defined(S_IFREG) # define S_IFREG _S_IFREG #endif /* Read permission */ #if !defined(S_IREAD) # define S_IREAD _S_IREAD #endif /* Write permission */ #if !defined(S_IWRITE) # define S_IWRITE _S_IWRITE #endif /* Execute permission */ #if !defined(S_IEXEC) # define S_IEXEC _S_IEXEC #endif /* Pipe */ #if !defined(S_IFIFO) # define S_IFIFO _S_IFIFO #endif /* Block device */ #if !defined(S_IFBLK) # define S_IFBLK 0 #endif /* Link */ #if !defined(S_IFLNK) # define S_IFLNK 0 #endif /* Socket */ #if !defined(S_IFSOCK) # define S_IFSOCK 0 #endif /* Read user permission */ #if !defined(S_IRUSR) # define S_IRUSR S_IREAD #endif /* Write user permission */ #if !defined(S_IWUSR) # define S_IWUSR S_IWRITE #endif /* Execute user permission */ #if !defined(S_IXUSR) # define S_IXUSR 0 #endif /* Read group permission */ #if !defined(S_IRGRP) # define S_IRGRP 0 #endif /* Write group permission */ #if !defined(S_IWGRP) # define S_IWGRP 0 #endif /* Execute group permission */ #if !defined(S_IXGRP) # define S_IXGRP 0 #endif /* Read others permission */ #if !defined(S_IROTH) # define S_IROTH 0 #endif /* Write others permission */ #if !defined(S_IWOTH) # define S_IWOTH 0 #endif /* Execute others permission */ #if !defined(S_IXOTH) # define S_IXOTH 0 #endif /* Maximum length of file name */ #if !defined(PATH_MAX) # define PATH_MAX MAX_PATH #endif #if !defined(FILENAME_MAX) # define FILENAME_MAX MAX_PATH #endif #if !defined(NAME_MAX) # define NAME_MAX FILENAME_MAX #endif /* File type flags for d_type */ #define DT_UNKNOWN 0 #define DT_REG S_IFREG #define DT_DIR S_IFDIR #define DT_FIFO S_IFIFO #define DT_SOCK S_IFSOCK #define DT_CHR S_IFCHR #define DT_BLK S_IFBLK #define DT_LNK S_IFLNK /* Macros for converting between st_mode and d_type */ #define IFTODT(mode) ((mode) & S_IFMT) #define DTTOIF(type) (type) /* * File type macros. Note that block devices, sockets and links cannot be * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are * only defined for compatibility. These macros should always return false * on Windows. */ #if !defined(S_ISFIFO) # define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO) #endif #if !defined(S_ISDIR) # define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #if !defined(S_ISREG) # define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) #endif #if !defined(S_ISLNK) # define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK) #endif #if !defined(S_ISSOCK) # define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK) #endif #if !defined(S_ISCHR) # define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR) #endif #if !defined(S_ISBLK) # define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK) #endif /* Return the exact length of the file name without zero terminator */ #define _D_EXACT_NAMLEN(p) ((p)->d_namlen) /* Return the maximum size of a file name */ #define _D_ALLOC_NAMLEN(p) ((PATH_MAX)+1) #ifdef __cplusplus extern "C" { #endif /* Wide-character version */ struct _wdirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ wchar_t d_name[PATH_MAX+1]; }; typedef struct _wdirent _wdirent; struct _WDIR { /* Current directory entry */ struct _wdirent ent; /* Private file data */ WIN32_FIND_DATAW data; /* True if data is valid */ int cached; /* Win32 search handle */ HANDLE handle; /* Initial directory name */ wchar_t *patt; }; typedef struct _WDIR _WDIR; /* Multi-byte character version */ struct dirent { /* Always zero */ long d_ino; /* File position within stream */ long d_off; /* Structure size */ unsigned short d_reclen; /* Length of name without \0 */ size_t d_namlen; /* File type */ int d_type; /* File name */ char d_name[PATH_MAX+1]; }; typedef struct dirent dirent; struct DIR { struct dirent ent; struct _WDIR *wdirp; }; typedef struct DIR DIR; /* Dirent functions */ static DIR *opendir (const char *dirname); static _WDIR *_wopendir (const wchar_t *dirname); static struct dirent *readdir (DIR *dirp); static struct _wdirent *_wreaddir (_WDIR *dirp); static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result); static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result); static int closedir (DIR *dirp); static int _wclosedir (_WDIR *dirp); static void rewinddir (DIR* dirp); static void _wrewinddir (_WDIR* dirp); static int scandir (const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)); static int alphasort (const struct dirent **a, const struct dirent **b); static int versionsort (const struct dirent **a, const struct dirent **b); /* For compatibility with Symbian */ #define wdirent _wdirent #define WDIR _WDIR #define wopendir _wopendir #define wreaddir _wreaddir #define wclosedir _wclosedir #define wrewinddir _wrewinddir /* Internal utility functions */ static WIN32_FIND_DATAW *dirent_first (_WDIR *dirp); static WIN32_FIND_DATAW *dirent_next (_WDIR *dirp); static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count); static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, const wchar_t *wcstr, size_t count); static void dirent_set_errno (int error); /* * Open directory stream DIRNAME for read and return a pointer to the * internal working area that is used to retrieve individual directory * entries. */ static _WDIR* _wopendir( const wchar_t *dirname) { _WDIR *dirp = NULL; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate new _WDIR structure */ dirp = (_WDIR*) malloc (sizeof (struct _WDIR)); if (dirp != NULL) { DWORD n; /* Reset _WDIR structure */ dirp->handle = INVALID_HANDLE_VALUE; dirp->patt = NULL; dirp->cached = 0; /* Compute the length of full path plus zero terminator * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) n = wcslen(dirname); # else n = GetFullPathNameW (dirname, 0, NULL, NULL); # endif /* Allocate room for absolute directory name and search pattern */ dirp->patt = (wchar_t*) malloc (sizeof (wchar_t) * n + 16); if (dirp->patt) { /* * Convert relative directory name to an absolute one. This * allows rewinddir() to function correctly even when current * working directory is changed between opendir() and rewinddir(). * * Note that on WinRT there's no way to convert relative paths * into absolute paths, so just assume it is an absolute path. */ # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) wcsncpy_s(dirp->patt, n+1, dirname, n); # else n = GetFullPathNameW (dirname, n, dirp->patt, NULL); # endif if (n > 0) { wchar_t *p; /* Append search pattern \* to the directory name */ p = dirp->patt + n; if (dirp->patt < p) { switch (p[-1]) { case '\\': case '/': case ':': /* Directory ends in path separator, e.g. c:\temp\ */ /*NOP*/; break; default: /* Directory name doesn't end in path separator */ *p++ = '\\'; } } *p++ = '*'; *p = '\0'; /* Open directory stream and retrieve the first entry */ if (dirent_first (dirp)) { /* Directory stream opened successfully */ error = 0; } else { /* Cannot retrieve first entry */ error = 1; dirent_set_errno (ENOENT); } } else { /* Cannot retrieve full path name */ dirent_set_errno (ENOENT); error = 1; } } else { /* Cannot allocate memory for search pattern */ error = 1; } } else { /* Cannot allocate _WDIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { _wclosedir (dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. * * Returns pointer to static directory entry which may be overwritten by * subsequent calls to _wreaddir(). */ static struct _wdirent* _wreaddir( _WDIR *dirp) { struct _wdirent *entry; /* * Read directory entry to buffer. We can safely ignore the return value * as entry will be set to NULL in case of error. */ (void) _wreaddir_r (dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry. * * Returns zero on success. If end of directory stream is reached, then sets * result to NULL and returns zero. */ static int _wreaddir_r( _WDIR *dirp, struct _wdirent *entry, struct _wdirent **result) { WIN32_FIND_DATAW *datap; /* Read next directory entry */ datap = dirent_next (dirp); if (datap) { size_t n; DWORD attr; /* * Copy file name as wide-character string. If the file name is too * long to fit in to the destination buffer, then truncate file name * to PATH_MAX characters and zero-terminate the buffer. */ n = 0; while (n < PATH_MAX && datap->cFileName[n] != 0) { entry->d_name[n] = datap->cFileName[n]; n++; } entry->d_name[n] = 0; /* Length of file name excluding zero terminator */ entry->d_namlen = n; /* File type */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entry->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entry->d_type = DT_DIR; } else { entry->d_type = DT_REG; } /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof (struct _wdirent); /* Set result address */ *result = entry; } else { /* Return NULL to indicate end of directory */ *result = NULL; } return /*OK*/0; } /* * Close directory stream opened by opendir() function. This invalidates the * DIR structure as well as any directory entry read previously by * _wreaddir(). */ static int _wclosedir( _WDIR *dirp) { int ok; if (dirp) { /* Release search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; } /* Release search pattern */ if (dirp->patt) { free (dirp->patt); dirp->patt = NULL; } /* Release directory structure */ free (dirp); ok = /*success*/0; } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream such that _wreaddir() returns the very first * file name again. */ static void _wrewinddir( _WDIR* dirp) { if (dirp) { /* Release existing search handle */ if (dirp->handle != INVALID_HANDLE_VALUE) { FindClose (dirp->handle); } /* Open new search handle */ dirent_first (dirp); } } /* Get first directory entry (internal) */ static WIN32_FIND_DATAW* dirent_first( _WDIR *dirp) { WIN32_FIND_DATAW *datap; /* Open directory and retrieve the first entry */ dirp->handle = FindFirstFileExW( dirp->patt, FindExInfoStandard, &dirp->data, FindExSearchNameMatch, NULL, 0); if (dirp->handle != INVALID_HANDLE_VALUE) { /* a directory entry is now waiting in memory */ datap = &dirp->data; dirp->cached = 1; } else { /* Failed to re-open directory: no directory entry in memory */ dirp->cached = 0; datap = NULL; } return datap; } /* * Get next directory entry (internal). * * Returns */ static WIN32_FIND_DATAW* dirent_next( _WDIR *dirp) { WIN32_FIND_DATAW *p; /* Get next directory entry */ if (dirp->cached != 0) { /* A valid directory entry already in memory */ p = &dirp->data; dirp->cached = 0; } else if (dirp->handle != INVALID_HANDLE_VALUE) { /* Get the next directory entry from stream */ if (FindNextFileW (dirp->handle, &dirp->data) != FALSE) { /* Got a file */ p = &dirp->data; } else { /* The very last entry has been processed or an error occurred */ FindClose (dirp->handle); dirp->handle = INVALID_HANDLE_VALUE; p = NULL; } } else { /* End of directory stream reached */ p = NULL; } return p; } /* * Open directory stream using plain old C-string. */ static DIR* opendir( const char *dirname) { struct DIR *dirp; int error; /* Must have directory name */ if (dirname == NULL || dirname[0] == '\0') { dirent_set_errno (ENOENT); return NULL; } /* Allocate memory for DIR structure */ dirp = (DIR*) malloc (sizeof (struct DIR)); if (dirp) { wchar_t wname[PATH_MAX + 1]; size_t n; /* Convert directory name to wide-character string */ error = dirent_mbstowcs_s( &n, wname, PATH_MAX + 1, dirname, PATH_MAX + 1); if (!error) { /* Open directory stream using wide-character name */ dirp->wdirp = _wopendir (wname); if (dirp->wdirp) { /* Directory stream opened */ error = 0; } else { /* Failed to open directory stream */ error = 1; } } else { /* * Cannot convert file name to wide-character string. This * occurs if the string contains invalid multi-byte sequences or * the output buffer is too small to contain the resulting * string. */ error = 1; } } else { /* Cannot allocate DIR structure */ error = 1; } /* Clean up in case of error */ if (error && dirp) { free (dirp); dirp = NULL; } return dirp; } /* * Read next directory entry. */ static struct dirent* readdir( DIR *dirp) { struct dirent *entry; /* * Read directory entry to buffer. We can safely ignore the return value * as entry will be set to NULL in case of error. */ (void) readdir_r (dirp, &dirp->ent, &entry); /* Return pointer to statically allocated directory entry */ return entry; } /* * Read next directory entry into called-allocated buffer. * * Returns zero on success. If the end of directory stream is reached, then * sets result to NULL and returns zero. */ static int readdir_r( DIR *dirp, struct dirent *entry, struct dirent **result) { WIN32_FIND_DATAW *datap; /* Read next directory entry */ datap = dirent_next (dirp->wdirp); if (datap) { size_t n; int error; /* Attempt to convert file name to multi-byte string */ error = dirent_wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cFileName, PATH_MAX + 1); /* * If the file name cannot be represented by a multi-byte string, * then attempt to use old 8+3 file name. This allows traditional * Unix-code to access some file names despite of unicode * characters, although file names may seem unfamiliar to the user. * * Be ware that the code below cannot come up with a short file * name unless the file system provides one. At least * VirtualBox shared folders fail to do this. */ if (error && datap->cAlternateFileName[0] != '\0') { error = dirent_wcstombs_s( &n, entry->d_name, PATH_MAX + 1, datap->cAlternateFileName, PATH_MAX + 1); } if (!error) { DWORD attr; /* Length of file name excluding zero terminator */ entry->d_namlen = n - 1; /* File attributes */ attr = datap->dwFileAttributes; if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) { entry->d_type = DT_CHR; } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) { entry->d_type = DT_DIR; } else { entry->d_type = DT_REG; } /* Reset dummy fields */ entry->d_ino = 0; entry->d_off = 0; entry->d_reclen = sizeof (struct dirent); } else { /* * Cannot convert file name to multi-byte string so construct * an erroneous directory entry and return that. Note that * we cannot return NULL as that would stop the processing * of directory entries completely. */ entry->d_name[0] = '?'; entry->d_name[1] = '\0'; entry->d_namlen = 1; entry->d_type = DT_UNKNOWN; entry->d_ino = 0; entry->d_off = -1; entry->d_reclen = 0; } /* Return pointer to directory entry */ *result = entry; } else { /* No more directory entries */ *result = NULL; } return /*OK*/0; } /* * Close directory stream. */ static int closedir( DIR *dirp) { int ok; if (dirp) { /* Close wide-character directory stream */ ok = _wclosedir (dirp->wdirp); dirp->wdirp = NULL; /* Release multi-byte character version */ free (dirp); } else { /* Invalid directory stream */ dirent_set_errno (EBADF); ok = /*failure*/-1; } return ok; } /* * Rewind directory stream to beginning. */ static void rewinddir( DIR* dirp) { /* Rewind wide-character string directory stream */ _wrewinddir (dirp->wdirp); } /* * Scan directory for entries. */ static int scandir( const char *dirname, struct dirent ***namelist, int (*filter)(const struct dirent*), int (*compare)(const struct dirent**, const struct dirent**)) { struct dirent **files = NULL; size_t size = 0; size_t allocated = 0; const size_t init_size = 1; DIR *dir = NULL; struct dirent *entry; struct dirent *tmp = NULL; size_t i; int result = 0; /* Open directory stream */ dir = opendir (dirname); if (dir) { /* Read directory entries to memory */ while (1) { /* Enlarge pointer table to make room for another pointer */ if (size >= allocated) { void *p; size_t num_entries; /* Compute number of entries in the enlarged pointer table */ if (size < init_size) { /* Allocate initial pointer table */ num_entries = init_size; } else { /* Double the size */ num_entries = size * 2; } /* Allocate first pointer table or enlarge existing table */ p = realloc (files, sizeof (void*) * num_entries); if (p != NULL) { /* Got the memory */ files = (dirent**) p; allocated = num_entries; } else { /* Out of memory */ result = -1; break; } } /* Allocate room for temporary directory entry */ if (tmp == NULL) { tmp = (struct dirent*) malloc (sizeof (struct dirent)); if (tmp == NULL) { /* Cannot allocate temporary directory entry */ result = -1; break; } } /* Read directory entry to temporary area */ if (readdir_r (dir, tmp, &entry) == /*OK*/0) { /* Did we get an entry? */ if (entry != NULL) { int pass; /* Determine whether to include the entry in result */ if (filter) { /* Let the filter function decide */ pass = filter (tmp); } else { /* No filter function, include everything */ pass = 1; } if (pass) { /* Store the temporary entry to pointer table */ files[size++] = tmp; tmp = NULL; /* Keep up with the number of files */ result++; } } else { /* * End of directory stream reached => sort entries and * exit. */ qsort (files, size, sizeof (void*), (int (*) (const void*, const void*)) compare); break; } } else { /* Error reading directory entry */ result = /*Error*/ -1; break; } } } else { /* Cannot open directory */ result = /*Error*/ -1; } /* Release temporary directory entry */ if (tmp) { free (tmp); } /* Release allocated memory on error */ if (result < 0) { for (i = 0; i < size; i++) { free (files[i]); } free (files); files = NULL; } /* Close directory stream */ if (dir) { closedir (dir); } /* Pass pointer table to caller */ if (namelist) { *namelist = files; } return result; } /* Alphabetical sorting */ static int alphasort( const struct dirent **a, const struct dirent **b) { return strcoll ((*a)->d_name, (*b)->d_name); } /* Sort versions */ static int versionsort( const struct dirent **a, const struct dirent **b) { /* FIXME: implement strverscmp and use that */ return alphasort (a, b); } /* Convert multi-byte string to wide character string */ static int dirent_mbstowcs_s( size_t *pReturnValue, wchar_t *wcstr, size_t sizeInWords, const char *mbstr, size_t count) { int error; int n; size_t len; UINT cp; DWORD flags; /* Determine code page for multi-byte string */ if (AreFileApisANSI ()) { /* Default ANSI code page */ cp = GetACP (); } else { /* Default OEM code page */ cp = GetOEMCP (); } /* * Determine flags based on the character set. For more information, * please see https://docs.microsoft.com/fi-fi/windows/desktop/api/stringapiset/nf-stringapiset-multibytetowidechar */ switch (cp) { case 42: case 50220: case 50221: case 50222: case 50225: case 50227: case 50229: case 57002: case 57003: case 57004: case 57005: case 57006: case 57007: case 57008: case 57009: case 57010: case 57011: case 65000: /* MultiByteToWideChar does not support MB_ERR_INVALID_CHARS */ flags = 0; break; default: /* * Ask MultiByteToWideChar to return an error if a multi-byte * character cannot be converted to a wide-character. */ flags = MB_ERR_INVALID_CHARS; } /* Compute the length of input string without zero-terminator */ len = 0; while (mbstr[len] != '\0' && len < count) { len++; } /* Convert to wide-character string */ n = MultiByteToWideChar( /* Source code page */ cp, /* Flags */ flags, /* Pointer to string to convert */ mbstr, /* Size of multi-byte string */ (int) len, /* Pointer to output buffer */ wcstr, /* Size of output buffer */ (int)sizeInWords - 1 ); /* Ensure that output buffer is zero-terminated */ wcstr[n] = '\0'; /* Return length of wide-character string with zero-terminator */ *pReturnValue = (size_t) (n + 1); /* Return zero if conversion succeeded */ if (n > 0) { error = 0; } else { error = 1; } return error; } /* Convert wide-character string to multi-byte string */ static int dirent_wcstombs_s( size_t *pReturnValue, char *mbstr, size_t sizeInBytes, /* max size of mbstr */ const wchar_t *wcstr, size_t count) { int n; int error; UINT cp; size_t len; BOOL flag = 0; LPBOOL pflag; /* Determine code page for multi-byte string */ if (AreFileApisANSI ()) { /* Default ANSI code page */ cp = GetACP (); } else { /* Default OEM code page */ cp = GetOEMCP (); } /* Compute the length of input string without zero-terminator */ len = 0; while (wcstr[len] != '\0' && len < count) { len++; } /* * Determine if we can ask WideCharToMultiByte to return information on * broken characters. For more information, please see * https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-widechartomultibyte */ switch (cp) { case CP_UTF7: case CP_UTF8: /* * WideCharToMultiByte fails if we request information on default * characters. This is just a nuisance but doesn't affect the * conversion: if Windows is configured to use UTF-8, then the default * character should not be needed anyway. */ pflag = NULL; break; default: /* * Request that WideCharToMultiByte sets the flag if it uses the * default character. */ pflag = &flag; } /* Convert wide-character string to multi-byte character string */ n = WideCharToMultiByte( /* Target code page */ cp, /* Flags */ 0, /* Pointer to unicode string */ wcstr, /* Length of unicode string */ (int) len, /* Pointer to output buffer */ mbstr, /* Size of output buffer */ (int)sizeInBytes - 1, /* Default character */ NULL, /* Whether default character was used or not */ pflag ); /* Ensure that output buffer is zero-terminated */ mbstr[n] = '\0'; /* Return length of multi-byte string with zero-terminator */ *pReturnValue = (size_t) (n + 1); /* Return zero if conversion succeeded without using default characters */ if (n > 0 && flag == 0) { error = 0; } else { error = 1; } return error; } /* Set errno variable */ static void dirent_set_errno( int error) { #if defined(_MSC_VER) && _MSC_VER >= 1400 /* Microsoft Visual Studio 2005 and later */ _set_errno (error); #else /* Non-Microsoft compiler or older Microsoft compiler */ errno = error; #endif } #ifdef __cplusplus } #endif #endif /*DIRENT_H*/ mongo-c-driver-2.2.1/src/libbson/000077500000000000000000000000001511661753600165765ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/.gitattributes000066400000000000000000000001051511661753600214650ustar00rootroot00000000000000*.txt text *.vcproj eol=crlf *.sh eol=lf mongo-c-driver-2.2.1/src/libbson/.gitignore000066400000000000000000000015601511661753600205700ustar00rootroot00000000000000*~ *.a aclocal.m4 AUTHORS autom4te.cache ChangeLog CMakeFiles CMakeCache.txt compile !config.yml configure depcomp .deps .dirstamp *.exe INSTALL install-sh *.la .libs libtool libbson-1.0.so* *.lo ltmain.sh Makefile Makefile.in missing *.o *.pc README stamp-h1 *.swp test-libbson test.log test-results.json .DS_Store xcuserdata tags .lvimrc doc/installing.page doc/version.page .coverage.lcov coverage *.gcda *.gcno CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake cmake_install.cmake # CMake artifacts libbson-1.0-config-version.cmake libbson-1.0-config.cmake libbson-static-1.0-config-version.cmake libbson-static-1.0-config.cmake bson/bson-1.0-config-version.cmake bson/bson-1.0-config.cmake bson/bson-targets.cmake # Example binaries bcon-col-view bcon-speed bson-check-depth bson-depth bson-metrics bson-streaming-reader bson-to-json bson-validate json-to-bson mongo-c-driver-2.2.1/src/libbson/CMakeLists.txt000066400000000000000000000352631511661753600213470ustar00rootroot00000000000000 # .d8888b. 888 # d88P Y88b 888 # Y88b. 888 # "Y888b. .d88b. 888888 888 888 88888b. # "Y88b. d8P Y8b 888 888 888 888 "88b # "888 88888888 888 888 888 888 888 # Y88b d88P Y8b. Y88b. Y88b 888 888 d88P # "Y8888P" "Y8888 "Y888 "Y88888 88888P" # 888 # 888 # 888 cmake_minimum_required (VERSION 3.15...4.0) project (libbson LANGUAGES C # Inherit the version from mongo-c-driver VERSION "${PROJECT_VERSION}" DESCRIPTION "The libbson BSON serialization library" ) # These values are inherited from the mongo-c-driver parent. These are named as to # match the CMake variables generated by project(). set(libbson_VERSION_PRERELEASE ${mongo-c-driver_VERSION_PRERELEASE}) set(libbson_VERSION_FULL ${mongo-c-driver_VERSION_FULL}) # Don't export symbols implicitly set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) # .d8888b. 888 888 d8b # d88P Y88b 888 888 Y8P # Y88b. 888 888 # "Y888b. .d88b. 888888 888888 888 88888b. .d88b. .d8888b # "Y88b. d8P Y8b 888 888 888 888 "88b d88P"88b 88K # "888 88888888 888 888 888 888 888 888 888 "Y8888b. # Y88b d88P Y8b. Y88b. Y88b. 888 888 888 Y88b 888 X88 # "Y8888P" "Y8888 "Y888 "Y888 888 888 888 "Y88888 88888P' # 888 # Y8b d88P # "Y88P" # libbson-specific configuration settings. Note that we inherit all settings # from the parent! mongo_setting( BSON_OUTPUT_BASENAME "Set the output basename for the libbson library" TYPE STRING DEFAULT VALUE "bson" ) # Control over what components are installed: mongo_bool_setting( ENABLE_STATIC_LIBBSON_INSTALL "Install static libbson" VISIBLE_IF ENABLE_STATIC) mongo_bool_setting( ENABLE_SHARED_LIBBSON_INSTALL "Install shared libbson" VISIBLE_IF ENABLE_SHARED) # .d8888b. 888 888 # d88P Y88b 888 888 # 888 888 888 888 # 888 88888b. .d88b. .d8888b 888 888 .d8888b # 888 888 "88b d8P Y8b d88P" 888 .88P 88K # 888 888 888 888 88888888 888 888888K "Y8888b. # Y88b d88P 888 888 Y8b. Y88b. 888 "88b X88 # "Y8888P" 888 888 "Y8888 "Y8888P 888 888 88888P' # Configure-time platform checks. These start as regular CMake booleans, but are # converted to 0/1 values (with mongo_bool01) so that they can be inserted into # bson/config.h as preprocessor values. We cannot use #cmakedefine01, as we need # to keep compatibility with an external Autotools-generated library configuration include (CheckFunctionExists) include (CheckIncludeFile) include (CheckStructHasMember) include (CheckSymbolExists) include (TestBigEndian) include (InstallRequiredSystemLibraries) include (CheckIncludeFiles) # See https://public.kitware.com/Bug/view.php?id=15659 check_symbol_exists (snprintf stdio.h BSON_HAVE_SNPRINTF) mongo_bool01 (BSON_HAVE_SNPRINTF BSON_HAVE_SNPRINTF) check_struct_has_member ("struct timespec" tv_sec time.h BSON_HAVE_TIMESPEC) mongo_bool01 (BSON_HAVE_TIMESPEC BSON_HAVE_TIMESPEC) check_symbol_exists (gmtime_r time.h BSON_HAVE_GMTIME_R) mongo_bool01 (BSON_HAVE_GMTIME_R BSON_HAVE_GMTIME_R) check_function_exists (rand_r BSON_HAVE_RAND_R) mongo_bool01 (BSON_HAVE_RAND_R BSON_HAVE_RAND_R) check_include_file (strings.h BSON_HAVE_STRINGS_H) mongo_bool01 (BSON_HAVE_STRINGS_H BSON_HAVE_STRINGS_H) check_symbol_exists (strlcpy string.h BSON_HAVE_STRLCPY) mongo_bool01 (BSON_HAVE_STRLCPY BSON_HAVE_STRLCPY) check_include_file (stdbool.h BSON_HAVE_STDBOOL_H) mongo_bool01 (BSON_HAVE_STDBOOL_H BSON_HAVE_STDBOOL_H) check_symbol_exists (clock_gettime time.h BSON_HAVE_CLOCK_GETTIME) mongo_bool01 (BSON_HAVE_CLOCK_GETTIME BSON_HAVE_CLOCK_GETTIME) check_symbol_exists (strnlen string.h BSON_HAVE_STRNLEN) mongo_bool01 (BSON_HAVE_STRNLEN BSON_HAVE_STRNLEN) check_symbol_exists (aligned_alloc stdlib.h BSON_HAVE_ALIGNED_ALLOC) mongo_bool01 (BSON_HAVE_ALIGNED_ALLOC BSON_HAVE_ALIGNED_ALLOC) test_big_endian (BSON_BIG_ENDIAN) if (WIN32) set (BSON_OS 2) else () set (BSON_OS 1) endif () if (BSON_BIG_ENDIAN) set (BSON_BYTE_ORDER 4321) else () set (BSON_BYTE_ORDER 1234) endif () configure_file ( "${PROJECT_SOURCE_DIR}/src/bson/config.h.in" "${PROJECT_BINARY_DIR}/src/bson/config.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/src/bson/version.h.in" "${PROJECT_BINARY_DIR}/src/bson/version.h" ) # 8888888b. .d888 d8b d8b 888 d8b # 888 "Y88b d88P" Y8P Y8P 888 Y8P # 888 888 888 888 # 888 888 .d88b. 888888 888 88888b. 888 888888 888 .d88b. 88888b. .d8888b # 888 888 d8P Y8b 888 888 888 "88b 888 888 888 d88""88b 888 "88b 88K # 888 888 88888888 888 888 888 888 888 888 888 888 888 888 888 "Y8888b. # 888 .d88P Y8b. 888 888 888 888 888 Y88b. 888 Y88..88P 888 888 X88 # 8888888P" "Y8888 888 888 888 888 888 "Y888 888 "Y88P" 888 888 88888P' # Base INTERFACE library propagates in-build-tree requirements for using libbson add_library(_libbson_build_interface INTERFACE) # Header directories required for libbson in-source target_include_directories(_libbson_build_interface INTERFACE # The default src/ src/ # The generated src/ ${PROJECT_BINARY_DIR}/src/ # The source directories of the common lib: ${mongo-c-driver_SOURCE_DIR}/src/common/src/ # Generated: ${mongo-c-driver_BINARY_DIR}/src/common/src/ ) target_link_libraries(_libbson_build_interface INTERFACE mongo::detail::c_platform) # Collect all source files file(GLOB_RECURSE all_sources CONFIGURE_DEPENDS src/*.c src/*.h # Include common library source files within libbson itself (names # will be mangled with MCOMMON_NAME_PREFIX) "${mongo-c-driver_SOURCE_DIR}/src/common/src/*.c" ) # List of the primary BSON library targets that we are building set(bson_libs) if(ENABLE_STATIC) add_library(bson_static STATIC ${all_sources}) add_library(bson::static ALIAS bson_static) set_property(TARGET bson_static PROPERTY EXPORT_NAME bson::static) list(APPEND bson_libs bson_static) # Define `BSON_STATIC` to suppress __declspec(dllexport/dllimport) when compiling # and consuming the static library target_compile_definitions(bson_static PUBLIC BSON_STATIC) if(ENABLE_PIC) # User wants static libs to use PIC code. set_property(TARGET bson_static PROPERTY POSITION_INDEPENDENT_CODE TRUE) endif() if(MONGO_CAN_VERIFY_HEADERS AND ENABLE_TESTS) mongo_verify_headers( bson USE_LIBRARIES bson::static HEADERS # Grab all headers "src/*.h" EXCLUDE_REGEX # No -private headers "-private\\.h" # Ignore all headers that start with "bson-", as they have not # been sanitized for direct inclusion. "bson/bson-.*\\.h" # Don't check jsonsl.h either "jsonsl\\.h" ) endif() endif() if(ENABLE_SHARED) add_library(bson_shared SHARED ${all_sources}) add_library(bson::shared ALIAS bson_shared) set_property(TARGET bson_shared PROPERTY EXPORT_NAME bson::shared) if(WIN32) # Add resource-definition script for Windows shared library (.dll). configure_file(libbson.rc.in libbson.rc) target_sources(bson_shared PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libbson.rc) endif() list(APPEND bson_libs bson_shared) endif() if(NOT bson_libs) message(FATAL_ERROR "Neither bson_shared nor bson_static is going to be built. Did you mean to enable at least one of them?") endif() # Set target properties for the libraries. mongo_target_requirements( ${bson_libs} LINK_LIBRARIES PUBLIC # Build-local requirements: $ # Include in the install interface explicitly: mongo::detail::c_platform COMPILE_DEFINITIONS PRIVATE # Tell headers that they are part of compilation: BSON_COMPILATION # Enable NaN parsing in jsonsl JSONSL_PARSE_NAN # Set the name mangling scheme for the common libraries MCOMMON_NAME_PREFIX=_bson_mcommon COMPILE_OPTIONS PRIVATE # Enable unconditional warnings-as-errors for our source code. ${mongoc-warning-options} # Macro constant INFINITY triggers constant arithmetic overflow warnings in # VS 2013, but VS 2013 doesn't support inline warning suppression. # Remove once support for VS 2013 is dropped. $<$,$>:/wd4756> ) set_target_properties(${bson_libs} PROPERTIES VERSION "${PROJECT_VERSION}" SOVERSION "${PROJECT_VERSION_MAJOR}" OUTPUT_NAME "${BSON_OUTPUT_BASENAME}${PROJECT_VERSION_MAJOR}" ) # 8888888888 888 # 888 888 # 888 888 # 8888888 888 888 8888b. 88888b.d88b. 88888b. 888 .d88b. .d8888b # 888 `Y8bd8P' "88b 888 "888 "88b 888 "88b 888 d8P Y8b 88K # 888 X88K .d888888 888 888 888 888 888 888 88888888 "Y8888b. # 888 .d8""8b. 888 888 888 888 888 888 d88P 888 Y8b. X88 # 8888888888 888 888 "Y888888 888 888 888 88888P" 888 "Y8888 88888P' # 888 # 888 # 888 if (ENABLE_EXAMPLES) function (add_example bin src) add_executable (${bin} EXCLUDE_FROM_ALL ${src}) add_dependencies (mongo_c_driver_examples ${bin}) # Enable unconditional warnings-as-errors for our source code. target_compile_options (${bin} PRIVATE ${mongoc-warning-options}) # Link against the shared lib like normal apps if(TARGET bson_shared) target_link_libraries (${bin} bson_shared) elseif(TARGET bson_static) target_link_libraries (${bin} bson_static) else() return() endif() endfunction () add_example (bcon-col-view examples/bcon-col-view.c) add_example (bcon-speed examples/bcon-speed.c) add_example (bson-metrics examples/bson-metrics.c) if (NOT WIN32) target_link_libraries (bson-metrics m) add_example (bson-streaming-reader examples/bson-streaming-reader.c) endif () add_example (bson-to-json examples/bson-to-json.c) add_example (bson-validate examples/bson-validate.c) add_example (json-to-bson examples/json-to-bson.c) add_example (bson-check-depth examples/bson-check-depth.c) add_example (creating examples/creating.c) add_example (extended-json examples/extended-json.c) endif () # ENABLE_EXAMPLES # 8888888 888 888 888 # 888 888 888 888 # 888 888 888 888 # 888 88888b. .d8888b 888888 8888b. 888 888 # 888 888 "88b 88K 888 "88b 888 888 # 888 888 888 "Y8888b. 888 .d888888 888 888 # 888 888 888 X88 Y88b. 888 888 888 888 # 8888888 888 888 88888P' "Y888 "Y888888 888 888 # Infix directory for all libbson headers. if(NOT DEFINED BSON_INSTALL_INCLUDEDIR) set(BSON_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/bson-${PROJECT_VERSION}") endif() # Infix directory for all libbson CMake package files if(NOT DEFINED BSON_INSTALL_CMAKEDIR) set(BSON_INSTALL_CMAKEDIR "${MONGO_C_DRIVER_INSTALL_CMAKEDIR}/bson-${PROJECT_VERSION}") endif() # pkg-config properties: set_directory_properties(PROPERTIES pkg_config_INCLUDE_DIRECTORIES "${BSON_INSTALL_INCLUDEDIR}" pkg_config_NAME "bson" ) function(install_export_target target) # Install the target: install( TARGETS "${target}" # Important: We generate a unique export set for this target alone. EXPORT "${target}-targets" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${BSON_INSTALL_INCLUDEDIR}" ) # Install the unique export set into a file that is qualified by the name of # the target itself. The main config-file package will search for the # possibly-installed exported targets for the known targets. install( EXPORT "${target}-targets" FILE "${target}-targets.cmake" DESTINATION "${BSON_INSTALL_CMAKEDIR}" ) endfunction() if(ENABLE_STATIC_LIBBSON_INSTALL AND TARGET bson_static) install_export_target(bson_static) mongo_generate_pkg_config(bson_static FILENAME bson${PROJECT_VERSION_MAJOR}-static.pc INSTALL) endif() if(ENABLE_SHARED_LIBBSON_INSTALL AND TARGET bson_shared) install_export_target(bson_shared) mongo_generate_pkg_config(bson_shared FILENAME bson${PROJECT_VERSION_MAJOR}.pc INSTALL) endif() # Install all headers by doing a recursive directory-install. In the future, this # can be better handled by installing the headers as a file set via target_sources() install( DIRECTORY # Trailing "/" requests directory contents, not the dir itself: src/ # Also get the generated dir: ${PROJECT_BINARY_DIR}/src/ DESTINATION "${BSON_INSTALL_INCLUDEDIR}" # Only grab the *public* headers. FILES_MATCHING PATTERN "*.h" PATTERN "*-private.h" EXCLUDE # Don't install jsonsl headers PATTERN "jsonsl" EXCLUDE ) # Install the platform libraries from MongoPlatform.cmake. Search: PLATFORM-EXPORT-TARGET-INSTALL install(EXPORT mongo-platform-targets # The "00" prefix forces the file to sort to the top during globbing, because # we want it to be included first before the libbson targets FILE 00-mongo-platform-targets.cmake DESTINATION "${BSON_INSTALL_CMAKEDIR}" ) # Install the CMake config-mode package configure_file( ${mongo-c-driver_SOURCE_DIR}/build/cmake/packageConfigVersion.cmake.in bsonConfigVersion.cmake @ONLY ) install( FILES etc/bsonConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/bsonConfigVersion.cmake" DESTINATION "${BSON_INSTALL_CMAKEDIR}" ) include (CPack) if (MONGO_FUZZ) add_subdirectory(fuzz) endif () # 8888888b. # 888 "Y88b # 888 888 # 888 888 .d88b. .d8888b .d8888b # 888 888 d88""88b d88P" 88K # 888 888 888 888 888 "Y8888b. # 888 .d88P Y88..88P Y88b. X88 # 8888888P" "Y88P" "Y8888P 88888P' if (ENABLE_MAN_PAGES OR ENABLE_HTML_DOCS) find_package (Sphinx REQUIRED) add_subdirectory (doc) add_custom_target (bson-doc ALL DEPENDS $ $ ) endif () mongo-c-driver-2.2.1/src/libbson/NEWS000066400000000000000000001634051511661753600173060ustar00rootroot00000000000000libbson 2.2.1 ============= No changes since 2.2.0. Version incremented to match the libmongoc version. libbson 2.2.0 ============= ## Improvements * Increase resolution of `bson_get_monotonic_time` on Windows. ## Deprecated * Support for macOS 11 (EOL since September 2023) and macOS 12 (EOL since September 2024). ## Removed * Support for Visual Studio 2015 (EOL since October 2025). Use Visual Studio 2017 or newer. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Connor MacDonald * Julia Garland * Ezra Chung * Adrian Dole * Colby Pike * Roberto C. Sánchez * shubhamhii libbson 2.1.2 ============= No changes since 2.1.1. Version incremented to match the libmongoc version. libbson 1.30.6 ============== No changes since 1.30.5. Version incremented to match the libmongoc version. libbson 2.1.1 ============= No changes since 2.1.0. Version incremented to match the libmongoc version. libbson 2.1.0 ============= ## Fixes * The uninstall script for Windows is fixed so it no longer "succeeds" with a non-zero `%ERRORLABEL%` value. * The uninstall script for non-Windows environments now calls `find "$dir" -maxdepth 1` instead of `ls --almost-all "$dir"` when detecting non-empty directories to fix macOS compatibility. ## Changed * The CMake project now sets a CMake policy max version of `4.0` (previously unset). ## Removed * Support for Debian 9 and Debian 10. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Colby Pike * Roberto C. Sánchez * Micah Scott libbson 2.0.2 ============= Fixes: * Various fixes have been applied to the `bson_validate` family of functions, with some minor behavioral changes. * Previously accepted invalid UTF-8 will be rejected when `BSON_VALIDATE_UTF8` is specified. * The scope document in a deprecated "code with scope" element is now validated with a fixed set of rules and is treated as an opaque JavaScript object. * A document nesting limit is now enforced during validation. libbson 1.30.5 ============== Fixes: * Various fixes have been applied to the `bson_validate` family of functions, with some minor behavioral changes. * Previously accepted invalid UTF-8 will be rejected when `BSON_VALIDATE_UTF8` is specified. * The scope document in a deprecated "code with scope" element is now validated with a fixed set of rules and is treated as an opaque JavaScript object. * A document nesting limit is now enforced during validation. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libbson 2.0.1 ============= Fixes: * Fix CMake configure error on macOS with CMake 4. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libbson 1.30.4 ============== No changes since 1.30.3. Version incremented to match the libmongoc version. libbson 1.30.3 ============== Fixes: * Fix CMake configure error on macOS with CMake 4. New Features: * In anticipation of the 2.0 release of mongo-c-driver, new CMake packages and imported targets have been defined (for both `bson` and `mongoc`). To import `bson` with the new names, call `find_package` for the `bson` package. The new imported targets are named `bson::static`, `bson::shared`, and `bson::bson` (which points to either the static or the shared library, depending on an import-time configuration option). The new package and target names will remain unchanged when upgrading to the 2.0 release, allowing consumers to support both major versions without modifying their CMake project. The current imported target names will be removed from the 2.0 release, and should not be used for forward-compatibility. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike libbson 2.0.0 ============= ## Changes * `BSON_ERROR_BUFFER_SIZE` is reduced from `504` to `503` to reserve the final byte for internal use. * The data layout of `bson_error_t` remains otherwise unchanged: the size is still 512 bytes and the offset of the `.code`, `.domain`, and `.message` data members remain unchanged. * The pkg-config files `libbson-1.0` and `libbson-static-1.0` have been renamed to `bson2`, and `bson2-static`, respectively. ### CMake Packages and Imported Targets The `bson-1.0` CMake package has been removed. Instead, use or `bson`, and specify a version or version range to be imported: ```cmake find_package(bson 1.30...2.0) ``` The new package imports different target names: - `mongo::bson_static` → `bson::static` - `mongo::bson_shared` → `bson::shared` - The target `bson::bson` is a shim target that points to either the shared library or the static library. ## Removals * `bson_as_json` and `bson_array_as_json` are removed due to producing non-portable Legacy Extended JSON. Prefer Canonical Extended JSON or Relaxed Extended JSON for portability. To continue using Legacy Extended JSON, use `bson_as_legacy_extended_json` and `bson_array_as_legacy_extended_json`. * Compiling with `BSON_MEMCHECK` defined now has no effect. * Remove deprecated integral comparison interfaces: `bson_in_range_*` and `bson_cmp_*`. * Remove deprecated atomic and threading interfaces: `bson_atomic_*` and `bson_thrd_yield`. * The deprecated `ENABLE_EXTRA_ALIGNMENT` CMake option is removed. * `bson_t` and `bson_iter_t` are now aligned to the size of a pointer instead of `128`. * `bson_error_t`, `bson_value_t`, and `bson_visitor_t` are now aligned to the size of a pointer instead of `8`. * `BSON_ALIGNED_BEGIN` and `BSON_ALIGNED_END` now unconditionally apply their requested alignment. * Remove deprecated `bson_copy_to_excluding`. Use `bson_copy_to_excluding_noinit` instead. ## Contributors Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Micah Scott * Colby Pike * Ezra Chung * Lin Raymond libbson 1.30.2 ============== Fixes: * Fix `bson_new_from_buffer` behavior on malformed input. * Fix allocation of large `bson_t`. Thanks to everyone who contributed to the development of this release. * Micah Scott * Kevin Albertson libbson 1.30.1 ============== Fixes: * Fix `BSON_NORETURN` macro for C23 standard Thanks to everyone who contributed to the development of this release. * Micah Scott libbson 1.30.0 ============== Deprecated: * Support for Debian 9 and Debian 10. Fixes: * Truncated output of `bson_as_json_with_opts` is changed to no longer split valid UTF-8 sequences. * Changes were made to the generated JSON text in some cases: * Previously, empty arrays and documents would serialize with either one or two spaces depending on whether it is nested. Empty arrays and documents now consistently serialize with just one space. * Previously, an array omitted due to the maximum recursion limit would serialize to "{ ... }", as if it were a document. Omitted arrays now serialize to "[ ... ]". * The maximum recursion limit now applies to legacy codewscope documents. Deeply nested scope documents will now be omitted like any other deeply nested document. * Fix leak of output parameter on failed call to `bson_append_array_builder_begin`. Improvements: * Improve performance of BSON-to-JSON serialization for nested documents. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ezra Chung * Micah Scott * Jeremy Mikola * Colby Pike libbson 1.29.2 ============== No changes since 1.29.1. Version incremented to match the libmongoc version. libbson 1.29.1 ============== Fixes: * Fix result of `bson_strerror_r` on macOS. * Fix max length string handling `bson_value_copy`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libbson 1.29.0 ============== Deprecated: * `bson_string_t` and associated functions are deprecated and planned for removal in a future major release. * Compiling with `BSON_MEMCHECK` defined is deprecated. * `bson_in_range_*` and `bson_cmp_*` functions. * `bson_atomic_*` and `bson_thrd_yield` functions. * `bson_as_json` and `bson_array_as_json` are deprecated due to producing non-portable Legacy Extended JSON. Prefer Canonical Extended JSON or Relaxed Extended JSON for portability. To continue using Legacy Extended JSON, use `bson_as_legacy_extended_json` and `bson_array_as_legacy_extended_json`. Fixes: * Fix Relaxed Extended JSON encoding of dates after year 9999. Improvements: * Improve performance of bson_utf8_escape_for_json Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Micah Scott @ MongoDB * Ezra Chung * Joshua Siegel libbson 1.28.1 ============== Fixes: * Fix large string handling in `bson_string_truncate`. * Fix possible crash in `bson_value_copy`. Thanks to everyone who contributed to the development of this release. * Joshua Siegel * Kevin Albertson libbson 1.28.0 ============== New features: * Add `bson_validate_with_error_and_offset`. Build Configuration: * Remove automatic ccache detection and usage (CCache.cmake). * Set [`CMAKE__COMPILER_LAUNCHER`](https://cmake.org/cmake/help/latest/envvar/CMAKE_LANG_COMPILER_LAUNCHER.html) to build with ccache. * Remove `MONGO_USE_CCACHE` (no longer applicable; see above). libbson 1.27.6 ============== Fixes: * Fix handling of malformed extended JSON for special BSON types. * Fix large string handling in `bson_string_new` and `bson_string_append`. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson libbson 1.27.5 ============== * Fix large string handling in `bson_append_utf8`. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez libbson 1.27.4 ============== Fixes: * Fix build with Visual Studio 2013. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libbson 1.27.3 ============== Notes: * This patch release introduces changes surrounding the development processes, including new code signing and dependency tracking. There are no behavioral or API changes. Thanks to everyone who contributed to the development of this release. * Colby Pike libbson 1.27.2 ============== Fixes: * Fix parsing of colon in timezone. * Error on failure to init subdocument in `bson_iter_visit_all`. Thanks to everyone who contributed to the development of this release. * Roman-Koshelev * Kevin Albertson libbson 1.27.1 ============== Fixes: * Fix string handling in `bson_string_new` and `bson_string_append`. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez libbson 1.27.0 ============== No changes since 1.26.2. Version incremented to match the libmongoc version. libbson 1.26.2 ============== Fixes: * Fix iteration in `bson_strfreev`. Thanks to everyone who contributed to the development of this release. * Ezra Chung libbson 1.26.1 ============== Fixes: * Use aligned alloc for `bson_array_builder_t` Thanks to everyone who contributed to the development of this release. * 0x1 Louis libbson 1.26.0 ============== No changes since 1.25.4. Version incremented to match the libmongoc version. libbson 1.25.4 ============== Fixes: * Restore support for Sphinx 1.7.6 for man page build. libbson 1.25.3 ============== No changes since 1.25.2. Version incremented to match the libmongoc version. libbson 1.25.2 ============== Fixes: * Fix conversion warning with GCC 12. * Include -pthread in pkg-config Libs. Thanks to everyone who contributed to the development of this release. * Calvin Buckley * Kevin Albertson * Roland Hieber libbson 1.25.1 ============== Fixes: * The `BUILD_VERSION` CMake option was restored. * Fixes to some format strings in trace logs. * Allow mongoc_buffer_t to be larger than INT_MAX. Thanks to everyone who contributed to the development of this release: * Adrian Dole * Kevin Albertson * Roberto C. Sánchez libbson 1.25.0 ============== New Features: * Add `bson_array_builder_t`. Platform Support: * Support for macOS 10.14 is dropped. * Support for Ubuntu 14.04 is dropped. * Support for Debian 8.1 is dropped. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Colby Pike * Adrian Dole * Roberto C. Sánchez * Ezra Chung * Joshua Siegel libbson 1.24.4 ============== Fixes: * Fix libmongoc build failure caused by missing install of `bson-dsl.h`. Thanks to everyone who contributed to the development of this release. * Kevin Albertson libbson 1.24.3 ============== Fixes: * Fix parsing of `[ { $code: ... } ]` or `[{$dbPointer: ...}]`. * Improve detection Fix use of `strerror_l`. * Fix possible overflow parsing Decimal128 in extJSON with very large exponents. Thanks to everyone who contributed to the development of this release. * Joshua Siegel * Ezra Chung libbson 1.24.2 ============== No changes since 1.24.1. Version incremented to match the libmongoc version. libbson 1.24.1 ============== No changes since 1.24.0. Version incremented to match the libmongoc version. libbson 1.24.0 ============== New Features: * Add extended JSON helpers for top-level BSON arrays `bson_array_as_canonical_extended_json` and `bson_array_as_relaxed_extended_json`. Language Standard Support: * C89 support has been dropped. C99 is the default tested C standard. Platform Support: * Support for macOS 10.14 will be dropped in an upcoming release. * Support for Ubuntu 14.04 will be dropped in an upcoming release. * Support for Debian 8.1 will be dropped in an upcoming release. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike * Joshua Siegel * Jeroen Ooms * Jean-Marc Le Roux * Kyle Kloberdanz * bisht2050 * gopukrishnasIBM * Charles Pritchard libbson 1.23.5 ============== No changes since 1.23.3. Version incremented to match the libmongoc version. libbson 1.23.4 ============== No changes since 1.23.3. Version incremented to match the libmongoc version. libbson 1.23.3 ============== Fix: * Don't use `aligned_alloc()` on Windows Thanks to everyone who contributed to the development of this release. * Jeroen Ooms libbson 1.23.2 ============== No changes since 1.23.1. Version incremented to match the libmongoc version. -- Kevin Albertson libbson 1.22.2 ============== Bug fixes: - Fix link errors related to atomic operations on RISC-V - Fix compile-time errors due to type conflicts on some platforms. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Roberto C. Sánchez libbson 1.23.1 ============== No changes since 1.23.0. Version incremented to match the libmongoc version. libbson 1.23.0 ============== Improvements: * Reducing Warnings of Misaligned Address of Over-Aligned Types Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike libbson 1.22.1 ============== No changes since 1.22.0. Version incremented to match the libmongoc version. --Colby Pike libbson 1.21.2 ============== Announcing libbson 1.21.2. No changes since 1.21.1; release to keep pace with libmongoc's version. -- Ezra Chung libbson 1.22.0-beta0 ==================== Bug fixes: * Fix BSON_ASSERT triggered by invalid JavaScript/JSON. Thanks to everyone who contributed to the development of this release. * Colby Pike * Ezra Chung * Jesse Williamson * MonkeybreadSoftware libbson 1.21.1 ============== Announcing libbson 1.21.1 No changes since 1.21.0; release to keep pace with libmongoc's version. --Jesse Williamson libbson 1.21.0 ============== Bug Fixes: * Addressed VS 2013 build failures due to missing C99 features. Improvements: * Addressed -Wstrict-prototype warnings in bson-atomic.h. * Addressed incompatible pointer warnings in bson-atomic.h on GCC 4.8.5. Thanks to everyone who contributed to the development of this release. * Ezra Chung * Kevin Albertson * Colby Pike * Pau Espin Pedrol * Ryan Schmidt libbson 1.20.1 ============== Bug fixes: * Fix implicit declarations causing build failures on macOS. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Ryan Schmidt libbson 1.20.0 ============== Features: * Improve atomics API. Thanks to everyone who contributed to the development of this release. * Colby Pike * Kevin Albertson * Roberto C. Sánchez * Ezra Chung libbson 1.19.2 ============== Announcing libbson 1.19.2. No changes since 1.19.1; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.19.1 ============== It is my pleasure to announce libbson 1.19.1. Bug fixes: * Fix string handling in BSON keys and regular expressions. --Kevin Albertson libbson 1.19.0 ============== It is my pleasure to announce libbson 1.18.0. No changes since 1.18.0; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.18.0 ============== It is my pleasure to announce libbson 1.18.0. Features: * Add BSON to JSON encoder that limits encoded string length. * Support parsing $uuid into a binary UUID. * Relax validation for insert and replace documents to support fields containing dots and dollars. Improvements: * Add trailing space after base64 JSON field for consistency. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Jeremy Mikola * Andreas Braun * Benjamin Rewis * Richard Donkin * David Korczynski * Josh Weinstein * David Carlier * Andrew Witten * Tim Gates --Kevin Albertson libbson 1.18.0-alpha ==================== It is my pleasure to announce libbson 1.18.0-alpha. This is an unstable prerelease and is unsuitable for production applications. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Benjamin Rewis * Richard Donkin * Andreas Braun * Tim Gates * Andrew Witten * David Carlier * David Korczynski * Josh Weinstein --Kevin Albertson libbson 1.17.7 ============== It is my pleasure to announce libbson 1.17.7. No changes since 1.17.6; release to keep pace with libmongoc's version. --Kevin Albertson libbson 1.17.6 ============== It is my pleasure to announce libbson 1.17.6. No changes since 1.17.5; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.5 ============== It is my pleasure to announce libbson 1.17.5. Bug fixes: * Remove unnecessary dependency of libm for static libbson on macOS Thanks to everyone who contributed to the development of this release. * Kevin Albertson --Kevin Albertson libbson 1.17.4 ============== It is my pleasure to announce libbson 1.17.4. No changes since 1.17.3; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.3 ============== No changes since 1.17.2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.2 ============== No changes since 1.17.1; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.1 ============== No changes since 1.17.0; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.0 ============== It is my pleasure to announce libbson 1.17.0. Features: * Add the cmake option ENABLE_PIC to build static libraries with position independent code. Bug fixes: * Fix possible int32 overflow when comparing and constructing large bson_t's. * Fix pedantic compiler warnings. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Richard Donkin * Roberto C. Sánchez * Josh Weinstein -- Kevin Albertson libbson 1.17.0 rc0 ================== It is my pleasure to announce libbson 1.17.0 rc0. No changes since 1.17.0 beta2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.17.0 beta2 ==================== It is my pleasure to announce libbson 1.17.0 beta2. Features: * Fix pedantic compiler warnings. * Improve assertion error messages. Bug fixes: * Fix possible int32 overflow when comparing and constructing large bson_t's. Thanks to everyone who contributed to the development of this release. * Richard Donkin * Roberto C. Sánchez * Josh Weinstein * Kevin Albertson -- Kevin Albertson libbson 1.17.0 beta =================== It is my pleasure to announce libbson 1.17.0 beta. Features: * Add the cmake option ENABLE_PIC to build static libraries with position independent code. Notes: * Deprecated "lib" prefixed artifacts are no longer produced when building on Windows. Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * Kevin Albertson * Jeroen Ooms -- Kevin Albertson libbson 1.16.1 ============== It is my pleasure to announce libbson 1.16.1. Features: * Add bson_isspace, a safer isspace alternative. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson libbson 1.16.0 ============== It is my pleasure to announce libbson 1.16.0. Bug fixes: * Fix crash if an empty BSON binary value is copied and then appended. * Fix out-of-bounds read when parsing JSON. * Fix out-of-bounds read when parsing base64. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * Clyde Bazile * Diego Barrios Romero * Vasil Velichkov Peace, Kevin Albertson libbson 1.15.3 ============== It is my pleasure to announce libbson 1.15.3. No changes since 1.15.2; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.15.2 ============== It is my pleasure to announce libbson 1.15.2. No changes since 1.15.1; release to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.15.1 ============== No change since 1.15.0; released to keep pace with libmongoc's version. -- Clyde Bazile libbson 1.15.0 ============== No change since 1.14.1; released to keep pace with libmongoc's version. -- Kevin Albertson libbson 1.14.1 ============== It is my pleasure to announce libbson 1.14.1. Bug fixes: * Remove unnecessary dependencies from pkg-config. Thanks to everyone who contributed to the development of this release. * Kevin Albertson Peace, Kevin Albertson libbson 1.14.0 ============== It is my pleasure to announce libbson 1.14.0. Features: * ObjectIDs are generated in compliance with the driver ObjectID spec. * Add a bson_copy_to_excluding_noinit variant taking a va_list. * Add example of validating BSON nesting depth with bson_visitor_t. Bug fixes: * Relaxed JSON pads datetime milliseconds with spaces instead of zeroes. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Roberto C. Sánchez * A. Jesse Jiryu Davis * Henrik Edin * Jeroen * Gustaf Neumann * Scott Gayou * Spencer McKenney * Samantha Ritter Peace, Samantha Ritter libbson 1.13.1 ============== It is my pleasure to announce libbson 1.13.1. Bug fixes: * Separate libmongoc and libbson uninstall scripts so they do not overwrite each other. Thanks to everyone who contributed to the development of this release. * Kevin Albertson * Henrik Edin Peace, Kevin Albertson libbson 1.13.0 ============== It is my pleasure to announce libbson 1.13.0. Features: * New functions to save and restore progress of a bson_iter_t: bson_iter_key_len, bson_iter_offset, and bson_iter_init_from_data_at_offset * Additional functions bson_iter_overwrite_date_time, bson_iter_overwrite_oid, and bson_iter_overwrite_timestamp. All fixed-length BSON values can now be updated in place. Bug fixes: * Fix crash when iterating corrupt BSON. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Kevin Albertson * Henrik Edin * Gustaf Neumann * Scott Gayou * Spencer McKenney Peace, Kevin Albertson libbson 1.12.0 ============== It is my pleasure to announce libbson 1.12.0. This release deprecates all MD5-related public APIs; they will be removed in the next major release. Bug fixes: * Properly handle zero-length BSON binary values * Fix crash parsing Base64-encoded data in JSON when using libbson without libmongoc Thanks to everyone who contributed to the development of this release. * Roberto C. Sánchez * A. Jesse Jiryu Davis * Kevin Albertson Peace, A. Jesse Jiryu Davis libbson 1.11.0 ============== It is my pleasure to announce libbson 1.11.0. This version adds the following features and improvements: * All "destroy" functions such as bson_destroy or bson_reader_destroy now ignore a NULL argument. * Replace MD5 with FNV-1a hash to generate ObjectIds (for FIPS compliance). Bug fixes: * Functions incorrectly marked with the "const" compiler attribute are now marked as "pure", fixes build error when link-time optimization is enabled. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Roberto C. Sánchez Peace, A. Jesse Jiryu Davis libbson 1.10.3 ============== It is my pleasure to announce libbson 1.10.3. This release fixes a crash when parsing binary data from JSON if using libbson as a standalone library, without calling mongoc_init. Peace, A. Jesse Jiryu Davis libbson 1.10.2 ============== No change since 1.10.1; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis libbson 1.10.1 ============== No change since 1.10.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis libbson 1.10.0 ============== It is my pleasure to announce libbson 1.10.0. This version adds the following features: * libbson and libmongoc are now maintained in the mongo-c-driver repository, although they are still built as separate libraries, and libbson can still be used without libmongoc. * Building libbson and libmongoc now requires CMake on all platforms. The Autotools build scripts ("configure" and related scripts) have been deleted. See the "installing" page for updated instructions. * Additional functions for strings of known length (not necessarily null- terminated): bson_iter_find_w_len bson_iter_init_find_w_len bson_append_regex_w_len bson_decimal128_from_string_w_len Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Roberto C. Sánchez * Xiangyu Yao * Kevin Albertson * Mansuro * Petr PísaÅ™ Peace, A. Jesse Jiryu Davis Libbson-1.9.5 ============= No change since 1.9.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.9.4 ============= It is my pleasure to announce Libbson-1.9.4. This release offers compatibility with Sphinx 1.7.0 and later. Peace, A. Jesse Jiryu Davis Libbson-1.9.3 ============= No change since 1.9.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.9.2 ============= It is my pleasure to announce Libbson-1.9.2. This release completes reverting a changed macro definition that broke API compatibility. The revert in 1.9.1 did not completely fix the BC break. Thanks to Petr PísaÅ™ for finding and fixing the mistake. Peace, A. Jesse Jiryu Davis Libbson-1.9.1 ============= It is my pleasure to announce Libbson-1.9.1. This release reverts a changed macro definition that broke API compatibility, and fixes an off-by-one error in bson_append_regex that resulted in corrupt BSON. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Derick Rethans Peace, A. Jesse Jiryu Davis Libbson-1.9.0 ============= It is my pleasure to announce Libbson-1.9.0. New features and bugfixes: * Fix Autotools syntax for OpenBSD and any platform lacking stdint.h. * Fix Android NDK incompatibilities. * Fix a one-byte write past the end of a buffer in bson_decimal128_to_string. * Avoid reading past the end of a string that contains UTF-8 multibyte NIL. * Fix some pedantic warnings in C99 mode. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Kevin Albertson * Jean-Marc Le Roux * Jeremy Mikola * Dimitri Gence * Hannes Magnusson Peace, A. Jesse Jiryu Davis Libbson-1.8.2 ============= No change since 1.8.1; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.8.1 ============= It is my pleasure to announce libbson-1.8.1. This release removes a syntax error in the configure script that affects some shells, and fixes the encoding of this NEWS file. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Jeremy Mikola Peace, A. Jesse Jiryu Davis Libbson-1.8.0 ============= It is my pleasure to announce Libbson-1.8.0. New features and bugfixes: * Make symbols bson_get_major_version, bson_get_minor_version, bson_get_micro_version, bson_get_version, and bson_check_version available to C++ programs. * New CMake option ENABLE_MAINTAINER_FLAGS. * Crash iterating over invalid code with scope. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * Kevin Albertson * Michael Kuhn Peace, A. Jesse Jiryu Davis Libbson-1.7.0 ============= * Changes to JSON encoding and decoding: * New functions bson_as_canonical_extended_json and bson_as_relaxed_extended_json convert BSON to canonical and relaxed extended JSON according to MongoDB Extended JSON Spec. Output for the existing bson_as_json function has not been changed. * When parsing JSON type wrappers like "$timestamp", any missing or extra keys are an error. * The JSON format for BSON regular expressions is now "$regularExpression": {"pattern": "...", "options": "..."}. The old format {"$regex": "...", "$options": "..."} is still parsed. * The JSON format for BSON binary elements is now "$binary": {"base64": "...", "subType": "..."}. The old format {"$binary": "...", "$type": "..."} is still parsed. * BSON dates can be parsed from "$date" as an ISO8601 date or "$numberLong" as milliseconds since the epoch: "t": {"$date": {"$numberLong": "1234"}}. Dates can no longer be formatted as raw integers. bson_as_json writes a BSON date after 1970 as "$date" with an ISO8601 string, and dates before 1970 as negative milliseconds wrapped in "$numberLong". bson_as_canonical_extended_json always writes dates with "$numberLong". bson_as_relaxed_extended_json always writes dates with "$date". * The non-numbers NaN, Infinity, and -Infinity are now recognized (regardless of case) when parsing JSON. * CMake build now installs .pc files for programs that link to libbson using pkg-config. Both the CMake and Autotools build systems now install .cmake files for programs that link to libbson using CMake. Linking to libbson statically or dynamically is now much more convenient. * New CMake option, "ENABLE_STATIC", defaults to ON. * Minimum required CMake version has been increased to 3.1. * CMake remains experimental on non-Windows platforms and issues a warning now * New functions * bson_strcasecmp, a portable equivalent of strcasecmp. * bson_iter_as_double, cast the current value to double. * bson_iter_init_from_data, creates an iterator from BSON string. * bson_validate_with_error, checks a document like bson_validate does but also reports which key was invalid * New convenience macros * BSON_ITER_HOLDS_INT, checks if iterator holds int32 or int64 * BSON_ITER_HOLDS_NUMBER, checks if iterator holds int32, int64 or double * Raised BSON recursion limit to 200 Libbson-1.6.0 ============= It is my pleasure to announce libbson-1.6.0. New features and bug fixes: * Use jsonsl instead of libyajl as our JSON parsing library, parse JSON more strictly, fix minor parsing bugs. * Extended JSON documents like '{"$code": "...", "$scope": {}}' are now parsed into BSON "code" elements. * ISO8601 dates now allow years from 0000 to 9999 inclusive. Before, years before 1970 were prohibited. * BSON floats and ints are now distinguished in JSON output. * The library is now built and continuously tested with MinGW-W64 on Windows. * The documentation is ported from Mallard XML to ReStructured Text, the HTML documentation is restyled, and numerous man page syntax errors fixed. * All public functions now have the __cdecl calling convention on Windows. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Aleksander Melnikov * Remi Collet Peace, A. Jesse Jiryu Davis libbson-1.5.5 ============= No change since 1.5.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.4 ============= No change since 1.5.3; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.3 ============= No change since 1.5.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.2 ============= This is a patch release that fixes a build error with MinGW on Windows. Libbson-1.5.1 ============= No change since 1.5.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.2 ============= It is my pleasure to announce Libbson-1.5.2. New bug fixes: * CDRIVER-1982 fix ifdef for strerror_s with mingw. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis Peace, Hannes Magnusson Libbson-1.5.1 ============= No change since 1.5.0; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.5.0 ============= It is my pleasure to announce Libbson-1.5.0. New features and bug fixes: * New BSON Type, Decimal128 (bson_decimal128_t) along with the following new functions and helpers: * bson_decimal128_to_string() * bson_decimal128_from_string() * bson_iter_decimal128() * bson_iter_overwrite_decimal128() * BSON_ITER_HOLDS_DECIMAL128() * bson_append_decimal128() * BSON_APPEND_DECIMAL128() * BCON_DECIMAL128() See the documentations for further details. * bson_validate and bson_iter_next now validate that BSON boolean values are 0 or 1. Before, any non-zero value was considered true. * bson_append_code_with_scope now preserves the "code with scope" type if scope is an empty, non-NULL BSON document. * BSON "code" and "code with scope" types are properly translated to and from JSON of the form '{"$code": "...", "$scope": {...}}'. * bson_json_reader functions now always validate UTF-8. * JSON parsing now preserves integer width. * bson_strtoll now matches stroll: it detects range errors, and when parsing octal it stops at non-octal digits and returns what it parsed instead of setting errno. * New flag BSON_VALIDATE_EMPTY_KEYS causes bson_validate to fail if a document contains zero-length field names. * The configure option "--enable-hardening" had had no effect. It is removed in favor of system-wide compiler configuration. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Fiona Rowan * Brian Samek Peace, A. Jesse Jiryu Davis Libbson-1.4.1 ============= This release improves the HTML documentation's Makefile. -- A. Jesse Jiryu Davis Libbson-1.4.0 ============= It is my pleasure to announce Libbson-1.4.0. New features and bug fixes: * bson_reader_reset seeks to the beginning of a BSON buffer. * bson_steal efficiently transfers contents from one bson_t to another. * Fix Windows compile error with BSON_EXTRA_ALIGN disabled. * Potential buffer overrun in bson_strndup. * bson_oid_to_string optimization for MS Visual Studio * bson_oid_is_valid accepts uppercase hex characters. * bson_json_reader_read aborted on some invalid Extended JSON documents. * All man page names now begin with "bson_" to avoid install conflicts. * Error messages sometimes truncated at 63 chars. This release tentatively supports the new BSON decimal type when built with "./configure --enable-experimental-features", or with "cmake -DENABLE_EXPERIMENTAL_FEATURES=ON", but this feature may change between now and libbson 1.5. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jeremy Mikola * David Hatch * Ian Boros * Fiona Rowan * Shane Harvey * Runar Buvik * Raymond Jacobson * ReadmeCritic * Mike Lloyd * Derick Rethans * Maverick Chan Peace, A. Jesse Jiryu Davis Libbson-1.3.5 ============= No change since 1.3.4; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.4 ============= No change since 1.3.3; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.3 ============= No change since 1.3.2; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.3.2 ============= This is a patch release with a fix for the build system: * man pages couldn't be built from a distribution tarball. Peace, A. Jesse Jiryu Davis Libbson-1.3.1 ============= It is my pleasure to announce Libbson-1.3.1. This is a bugfix release: * bson_strnlen is off by one on Windows. * BSON_HAVE_STRNLEN config check used incorrectly. * Incompatibility with older CMake versions. * Wrong-sized allocation in bson_json_reader_new. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Alex Bishop * Jeroen Ooms Peace, A. Jesse Jiryu Davis Libbson-1.3.0 ============= It is my pleasure to announce to you the release of Libbson-1.3.0. Since the release candidate 1.3.0-rc0, the only changes have been fixes for compiler warnings and errors on various platforms. All changes since the previous stable release, 1.2.1: * Fix potential crash in bson_strncpy on Windows. * Parse DBRefs correctly from JSON. * CMake option to disable building tests: "cmake -DENABLE_TESTS:BOOL=OFF". * Refactor the build system to declare library version in one place. * Fix compiler warnings and errors, especially with Visual Studio 2015 and IBM XL C. * Combine environment's CFLAGS with configure options when building. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Mark Benvenuto * Petr PísaÅ™ * xpol * Jose Sebastian Battig * Jeroen Ooms Peace, A. Jesse Jiryu Davis Libbson-1.3.0-rc0 ================= It is my pleasure to announce to you first release candidate of Libbson-1.3.0. Changes since 1.3.0-beta0: * Parse DBRefs correctly from JSON. * CMake option to disable building tests: "cmake -DENABLE_TESTS:BOOL=OFF". * Fix build warnings on some platforms, and refactor the build system. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jose Sebastian Battig Peace, A. Jesse Jiryu Davis Libbson-1.3.0-beta0 =================== It is my pleasure to announce to you the beta release of Libbson-1.3.0. Changes since the previous stable release, 1.2.1: * Fix potential crash in bson_strncpy on Windows. * Fix compiler warnings and errors, especially with Visual Studio 2015 and IBM XL C. * Combine environment's CFLAGS with configure options when building. Thanks to everyone who contributed to the development of this release. * Hannes Magnusson * A. Jesse Jiryu Davis * Jeroen Ooms * Petr PísaÅ™ * xpol Peace, A. Jesse Jiryu Davis Libbson-1.2.1 ============= It is my pleasure to announce to you the release of Libbson-1.2.1. Changes since the previous stable release, 1.2.0 are solely in the content and format of documentation. Peace, A. Jesse Jiryu Davis Libbson-1.2.0 ============= It is my pleasure to announce to you the release of Libbson-1.2.0. Changes since the previous stable release, 1.1.11: * Add bson_mem_restore_vtable(), the inverse of bson_mem_set_vtable(). * Enable runtime asserts in release build. * Fixed compiler warnings and build failures on various platforms. * Improvements to the formatting and contents of the documentation. Thanks to everyone who contributed to the development of this release. * A. Jesse Jiryu Davis * Hannes Magnusson * Jason Carey * Kyle Suarez * Derick Rethans * David Hatch Peace, A. Jesse Jiryu Davis Libbson 1.2.0-rc0 ================== It is my pleasure to announce to you the release candidate of Libbson-1.2.0. Changes: * Merge changes from 1.1.11. * Enable runtime asserts in release build. Thanks to everyone who contributed to the development of this release candidate. * A. Jesse Jiryu Davis * Hannes Magnusson * Kyle Suarez * Jason Carey -- A. Jesse Jiryu Davis Libbson 1.2.0-beta ================== It is my pleasure to announce to you the beta of Libbson-1.2.0. This release adds the bson_mem_restore_vtable() function to undo the effect of bson_mem_set_vtable(). Thanks to everyone who contributed to the development of this beta. * Jason Carey * Hannes Magnusson Libbson-1.1.11 ============== It is my pleasure to announce to you the release of Libbson-1.1.11. This is a patch release with improvements to the documentation: * Document bson streaming reads with an example, bson-streaming-reader.c. * Document callback function types bson_reader_destroy_func_t and bson_reader_read_func_t. Thanks to Kyle Suarez for his contributions to this version of Libbson. -- A. Jesse Jiryu Davis Libbson-1.1.10 ============== No change since 1.1.9; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.1.9 ============= This is a patch release with a fix for the build system: * "./configure --enable-coverage" works now. -- A. Jesse Jiryu Davis Libbson-1.1.8 ============= No change since 1.1.7; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson-1.1.7 ============= It is my pleasure to announce to you the release of Libbson-1.1.7. This is a patch release with bug fixes: * Unchecked error in bson_utf8_escape_for_json caused unbounded memory growth and a crash. * Nicer floating-point formatting in bson_as_json. * Link error with CMake on Mac. Thanks to everyone who contributed to this version of Libbson. * A. Jesse Jiryu Davis * Jason Carey * Jeroen Ooms * Hannes Magnusson * Hendrik Dahlkamp -- A. Jesse Jiryu Davis Libbson-1.1.6 ============= No change since 1.1.5; released to keep pace with libmongoc's version. -- A. Jesse Jiryu Davis Libbson 1.1.5 ============= It is my pleasure to announce to you the release of Libbson-1.1.5. This is a patch release with small bug fixes: * Fix link error "missing __sync_add_and_fetch_4" in GCC on i386 - the functions bson_atomic_int_add and bson_atomic_int64_add are now compiled and exported if needed in i386 mode * Fix version check for GCC 5 and future versions of Clang * Fix warnings and errors building on various platforms With this release, Libbson abandons the convention that odd-numbered patch versions indicate unstable releases. We switch to simple semantic versioning: 1.1.5 is a stable release with bug fixes since 1.1.4. During subsequent development the version will be "1.1.6-dev". Thanks to everyone who contributed to this version of Libbson. * A. Jesse Jiryu Davis * Christian Hergert * Jason Carey * Hannes Magnusson * Paul Melnikow -- A. Jesse Jiryu Davis Libbson 1.1.4 ============= It is my pleasure to announce to you the release of Libbson-1.1.4. This release is a minor patch release with one bug fix for bson_iter_timeval Thanks to everyone who contributed to the development of this release candidate for Libbson. * Jason Carey * A. Jesse Jiryu Davis * Vladimir Zidar -- Jason Carey Libbson 1.1.2 ============= It is my pleasure to announce to you the release of Libbson-1.1.2. This release is a minor patch release with one bug fix for mingw. * sscanf_s doesn't exist for mingw. -- Jason Carey Libbson 1.1.0 ============= It is my pleasure to announce to you the release of Libbson-1.1.0. This release is a stable release with some ABI additions and bugfixes. The below changes include the changes mentioned in the rc0. ABI/API changes include: * RC0 * Deprecation of bson_copy_to_excluding * Addition of bson_copy_to_excluding_noinit * Removal of MIN, MAX and ABS macros in favor of BSON_MIN, BSON_MAX and BSON_ABS. Note this is a breaking source level change if you relied on these from bson.h. Also note that this is not a breaking ABI change. * Addition of BSON_ERROR_BUFFER_SIZE macro Other changes include: * RC0 * Addition of a versioned ABI for the libbson shared library * fixed bson_get_monotonic_time fallback when a system monotonic clock can not be found. Formerly failed to compile with an incorrect call to bson_gettimeofday * Allow the "dbref" convention in bson_validate when BSON_VALIDATE_DOLLAR_KEYS is present * Support for ISO-8601 or $numberLong dates in bson <-> json parsing * Quiet various compiler warnings Thanks to everyone who contributed to the development of this release candidate for Libbson. * Adam Midvidy * Christian Hergert * Daniel Colchete * Ivan Suvorov * Hannes Magnusson * Jason Carey * Jérôme Lebel * Samantha Ritter -- Jason Carey Libbson 1.1.0-rc0 ================= It is my pleasure to announce to you the release of Libbson-1.1.0-rc0. This release is a release candidate release with some ABI additions and bugfixes. ABI changes include: * Deprecation of bson_copy_to_excluding * Addition of bson_copy_to_excluding_noinit Other changes include: * Addition of a versioned ABI for the libbson shared library * fixed bson_get_monotonic_time fallback when a system monotonic clock can not be found. Formerly failed to compile with an incorrect call to bson_gettimeofday * Allow the "dbref" convention in bson_validate when BSON_VALIDATE_DOLLAR_KEYS is present * Support for ISO-8601 or $numberLong dates in bson <-> json parsing * Quiet various compiler warnings Thanks to everyone who contributed to the development of this release candidate for Libbson. * Adam Midvidy * Christian Hergert * Daniel Colchete * Ivan Suvorov * Jason Carey * Jérôme Lebel -- Jason Carey Libbson 1.0.2 ============= It is my pleasure to announce to you the release of Libbson-1.0.2. This release is a minor point release with no ABI changes and mostly small bugfixes. Changes include: * bson_init_from_json supports top level arrays * fixes for bson_strerror_r * fix for timeouts on OS X * house cleaning for various integer types Thanks to everyone who contributed to the development of this point release for Libbson. * Adam Midvidy * Christian Hergert * Jason Carey * Jérôme Lebel * Tyler Brock -- Jason Carey Libbson 1.0.0 ============= It is my very distinct pleasure to announce to you the release of Libbson-1.0.0! This is the culmination of just over a year of work and could not have been done without the help of our wonderful community. Thanks to everyone who contributed to the development of Libbson! * Christian Hergert * Jason Carey * Jose Sebastian Battig * Maxim Zakharov * Jérôme Lebel * Itay Neeman * Mike Manilone * Michael Kuhn * Kyle Suarez * Josh Blum * Jason Choy * mntmnt7@gmail.com * Tyler Brock * Stefan Kaes * Paul Melnikow * Matt Cotter * Gary J. Murakami * Toon Schoenmakers * Máximo Cuadros * Michael Whittaker * Kota Yamaguchi * Justin Case * Jeff Yemin * Ivan Suvorov * Hannes Magnusson * Eric Daniels * Anil Kumar * A. Jesse Jiryu Davis Happy Hacking! -- Christian Hergert Libbson 0.98.0 ============== One more step closer to a 1.0! This release has a few fixes as we near the finish line of a 1.0 release. We have bumped the version to 0.98.0 to sync up with MongoDB C driver, which is the primary consumer of this library. This release includes a new memory callback vtable to help in embedding situations that have their own custom allocator such as various language runtimes. A few compilation fixes for various C++ compilers have also been included. A special thanks to: * Itay Neeman * Michael Whittaker Happy Hacking! -- Christian Libbson 0.8.4 ============= Another incremental release with a couple of new functions and bugfixes. In this release you will find the following changes: * Alignment fixes for Solaris Studio C compiler. * RPM and Debian packaging helpers. * bson_gettimeofday() has dropped the deprecated timezone field used when calling posix gettimeofday(). This eases portability concerns. It is technically an ABI break, but since the field was never set, in reality it shouldn't be an issue. * Multi-byte optimizations for bson_oid_to_string() have been disabled on non-x86 based platforms. This should aid in architecture portability. * The JSON parser can now support $numberLong. * bson_ascii_strtoll() has been added, which is a portable strtoll() implementation. This is primarily useful for Windows users and is used by the JSON parser. * A bug was fixed in bson_iter_find_descendent() where the wrong field could be matched if it's prefix matched the query. * bson_array_as_json() has been added to convert a bson_t as a top-level array. Thanks to: * Kyle Suarez * Itay Neeman Happy Hacking! Libbson 0.8.2 ============= A bugfix release is here as a follow up to 0.8.0. In this release you will find the following changes: * A fix for BCON when used from C++. * Change bson_next_power_of_two() to accept size_t. This should not be an ABI break since it is static inline. Happy Hacking! Libbson 0.8.0 ============= It's that time again, time for another Libbson release! This cycle includes much, much more documentation for your perusing. There is much more cross-referencing and structure for your navigation pleasure. We've improved support for Libbson on a few more exotic platforms. SPARC support is looking pretty good these days. You'll also find some new examples in this release to help you get started a bit faster. If there is something you'd like to see, just ask! There are a few ABI breaks this cycle, as we are well on the road to a 1.0 and would like things as clean as possible. I anticipate a few more during the next couple of cycles, but we will try to keep them to a minimum. With that said, you *WILL* need to recompile your application against 0.8.0. Happy Hacking! Libbson 0.6.8 ============= Quickly following up on the 0.6.6 release is 0.6.8. This release contains a couple of bugfixes and more support for older architectures. On big-endian systems, bson_append_date_time() was not properly converting to little-endian. This is now fixed. We've added support for Sun Pro C Compiler on Solaris 10 and 11. This includes support for SPARC systems as well as x86_64. In particular, intrinsics were added for the Solaris/SPARC/SunProC combination. If you are running SunProC on a non-Solaris platform, a fallback path will be used which is slower than native support for atomics. Additionally, bson_gettimeofday() does not fully support timezones under SunProC as struct timezone is not defined. Libbson will now check for GLibc 2.19 to remove various warnings with both _GNU_SOURCE and _BSD_SOURCE defined. Happy Hacking! Libbson 0.6.6 ============= Another release for your hacking pleasure! First off, note that there are two ABI breaks as part of this release. We felt they were important as they will help us stablize towards a 1.0 release. It is recommended that you recompile against this version of libbson. Lots of small fixes went into this release to help get things building better on various platforms. Windows support should be improved and many warnings have been cleaned up. The signature of bson_realloc_func has changed to allow for context to be provided. This should help in situations where a pointer to the memory pool is required. bson_destroy_with_steal() has been added so that you can steal a buffer instead of freeing it when bson_destroy() is called. bson_new_from_buffer() has been added so that you can provide your own realloc function to manage the underlying buffer. This will be useful for bindings that want to integrate their memory manager for bson documents. bson_value_t is a new container type that can hold any bson type. I'd like to thank everyone who contributed to this release. Gary Murakami Jason Carey Jose Sebastian Battig Máximo Cuadros Paul Melnikow Stefan Kaes Happy hacking! Libbson 0.6.4 ============= This is just a followup release of libbson as we work towards stablizing for the new mongo-c-driver release. In fact, it only includes build work and a new macro, bson_clear(). Happy hacking! Libbson 0.6.2 ============= A new Libbson release is already here as a follow up to the 0.6.0 release. This release includes a few build and installation fixes. In particular, * Windows build fixes * CMake build fixes * C++ build fixes. The monotonic clock is now more accurately calculated on Windows as well. If you'd like to build on Windows, check out the section in README.md for information on how to do so. Happy hacking! Libbson 0.6.0 ============= Many changes have gone into this release! TL;DR * C99 types (from C89). * JSON parsing. * Lots of Operating System support, including Windows. * Parallel Test Suite. * Revamped build system. * A couple ABI breaks. First off, 0.6.0 has gone through a significant amount of build system cleanup. This should simplify using libbson as a submodule for those that wish to do so. For example, the mongo-c-driver now does this using autotools. Windows Vista and higher is now supported as a build target through the use of cmake. See README.md for the instructions. Other platforms should continue to use autotools. The test suite has been improved and more tests added. We now generate random seeds on every run to help catch more errors with additional fuzzing passes. By default, the test suite will run all tests in parallel with subprocesses. This should speed up execution of `make test' for contributors. bson_string_t went through an ABI break to support power-of-two growth. JSON parsing has been added through the bson_json_reader_t type. You can also now use bson_init_from_json() for a simplified interface. Types were revamped to appear to be using C99 types. If C99 types are available, they will be used. If not, they will be emulated. This means you can just go on using uint64_t and similar. We even use bool now. Many functions have been made portable to deal with inconsistencies with Win32. This release has been tested on the following operating systems: * RedHat Enterprise 5, 6, and 7 beta. * CentOS 6.5 * Ubuntu 12.04 LTS * Fedora 20 * Windows 7 * FreeBSD 10 * DragonFly BSD * Solaris 11 * SmartOS * mingw64 Thanks again and enjoy using libbson! Libbson 0.4.0 ============= This release includes a few bug fixes and copious documentation. Additionally, we improved our fuzz testing and found a couple issues in the process. It is suggested that everyone upgrade their installations to 0.4.0. We have been busy adding a lot of documentation that we hope you will like. Many `man' pages have been added for various API endpoints and structures. If you use vim, remember that you can jump to the documentation with k while on a symbol. Thanks and enjoy using libbson! Libbson 0.2.4 ============= This release includes some more performance improvements and bug fixes. It contains an important fix for dealing with invalid string lengths that could cause an integer overflow when checking to see if the string length fits within the end of the buffer. There is preliminary support for Solaris on x86_64 and SPARC. Generating OIDs is now simpler with the use of bson_context_get_default(). This function will return a thread-safe generic bson_context_t implementation. Alternatively, you may pass NULL to bson_oid_init() for the context and the default context is automatically used. The fuzz tests now use srand() with a 32-bit integer derived from /dev/urandom. Endianess conversions are now performed by __builtin_bswap*() functions when available with the GCC compiler. Endianness conversions for the double type are now properly handled on big-endian systems. bson_reinit() has been added to cleanup code that needs to destroy and then initialize a bson_t. Validation of Code with Scope fields was absent from bson_validate(). This is now supported. Libbson 0.2.2 ============= This release includes a few performance improvements and bug fixes. The bson_t structure is more efficient when growing allocated buffers. The use of memalign() was unnecessary for allocated bson_t structures and has therefore been removed. Performance sensitive allocations now use bson_malloc() instead of calloc() and initialize fields directly. Stack alignment of bson_t is now enforced through compiler intrinsics. The unit tests can now support running inside of valgrind to check for various memory leaks. Simply defing VALGRIND=valgrind when running `make test`. Enjoy libbson-0.2.2! Libbson 0.2.0 ============= This is the initial release of Libbson. It has not yet reached API and ABI maturity and is therefore subject to change without notice. Developers are encouraged to start using Libbson as we journey on the road to 1.0, where ABI stability will be guaranteed. Libbson is Apache 2.0 licensed so that it can be embedded in a multitude of scenarios. This means that we try hard to not rely on external libraries. Therefore, Libbson contains useful routines to help in portability as well as BSON support. Libbson is the basis of a new MongoDB C driver that will follow shortly. Please see the doc/ directory for documentation on how to use Libbson. We would love for you to contribute to Libbson, whether that is code, documentation or packaging. mongo-c-driver-2.2.1/src/libbson/THIRD_PARTY_NOTICES000066400000000000000000000023731511661753600215430ustar00rootroot00000000000000Libbson uses third-party libraries distributed under different licenses. License notice for jsonsl ------------------------------------------------------------------------------- MIT License Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org 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.mongo-c-driver-2.2.1/src/libbson/doc/000077500000000000000000000000001511661753600173435ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/doc/.gitignore000066400000000000000000000002351511661753600213330ustar00rootroot00000000000000*.7 *.pyc .doctrees objects.inv html/*.html html/*.css html/*.js html/*.png html/_sources html/_static html/.buildinfo html/.nojekyll man/*.3 man/.buildinfo mongo-c-driver-2.2.1/src/libbson/doc/CMakeLists.txt000066400000000000000000000002361511661753600221040ustar00rootroot00000000000000include (SphinxBuild) if (ENABLE_HTML_DOCS) sphinx_build_html (bson-html libbson) endif () if (ENABLE_MAN_PAGES) sphinx_build_man (bson-man) endif () mongo-c-driver-2.2.1/src/libbson/doc/api.rst000066400000000000000000000007161511661753600206520ustar00rootroot00000000000000API Reference ============= .. toctree:: :titlesonly: :maxdepth: 2 bson_t bson_array_builder_t bson_context_t bson_decimal128_t bson_error_t bson_iter_t bson_json_reader_t bson_oid_t bson_reader_t character_and_string_routines bson_subtype_t bson_type_t bson_unichar_t bson_validate_flags_t bson_value_t bson_visitor_t bson_writer_t bson_get_monotonic_time bson_memory binary_vector version legacy_extended_json mongo-c-driver-2.2.1/src/libbson/doc/binary_vector.rst000066400000000000000000000076351511661753600227560ustar00rootroot00000000000000:man_page: libbson_binary_vector BSON Binary Vector subtype ========================== In Libbson, we use the term *Vector* to refer to a data representation for compact storage of uniform elements, defined by the `BSON Binary Subtype 9 - Vector `_ specification. Libbson includes API support for Vectors: * The *view* APIs provide an efficient way to access elements of Vector fields that reside within :symbol:`bson_t` storage. * Integration between *views* and other Libbson features: append, array builder, iter. * Vectors can be converted to and from a plain BSON Array, subject to the specification's type conversion rules. The specification currently defines three element types, which Libbson interprets as: * ``int8``: signed integer elements, equivalent to C ``int8_t``. * ``float32``: IEEE 754 floating point, 32 bits per element, least-significant byte first. After alignment and byte swapping, elements are equivalent to C ``float``. * ``packed_bit``: single-bit integer elements, packed most-significant bit first. Accessible in packed form as C ``uint8_t`` or as unpacked elements using C ``bool``. Vector Views ------------ .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_int8_view_t bson_vector_int8_const_view_t bson_vector_float32_view_t bson_vector_float32_const_view_t bson_vector_packed_bit_view_t bson_vector_packed_bit_const_view_t Integration ----------- * Allocating Vectors inside :symbol:`bson_t`: .. toctree:: :titlesonly: :maxdepth: 1 bson_append_vector_int8_uninit bson_append_vector_float32_uninit bson_append_vector_packed_bit_uninit * Accessing an existing Vector via :symbol:`bson_iter_t`: .. code-block:: c #define BSON_ITER_HOLDS_VECTOR(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_INT8(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_FLOAT32(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_PACKED_BIT(iter) /* ... */ .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_int8_view_from_iter bson_vector_int8_const_view_from_iter bson_vector_float32_view_from_iter bson_vector_float32_const_view_from_iter bson_vector_packed_bit_view_from_iter bson_vector_packed_bit_const_view_from_iter Array Conversion ---------------- * Polymorphic array-from-vector: .. toctree:: :titlesonly: :maxdepth: 1 bson_append_array_from_vector * Type specific array-from-vector: .. toctree:: :titlesonly: :maxdepth: 1 bson_append_array_from_vector_int8 bson_append_array_from_vector_float32 bson_append_array_from_vector_packed_bit * Using :symbol:`bson_array_builder_t` for array-from-vector: .. toctree:: :titlesonly: :maxdepth: 1 bson_array_builder_append_vector_int8_elements bson_array_builder_append_vector_float32_elements bson_array_builder_append_vector_packed_bit_elements bson_array_builder_append_vector_elements * Type specific vector-from-array: .. toctree:: :titlesonly: :maxdepth: 1 bson_append_vector_int8_from_array bson_append_vector_float32_from_array bson_append_vector_packed_bit_from_array Additional Definitions ---------------------- * Binary subtype: .. code-block:: c typedef enum { BSON_SUBTYPE_VECTOR = 0x09, /* ... */ } bson_subtype_t; * Byte length of the Vector header: .. code-block:: c // Length of the required header for BSON_SUBTYPE_VECTOR, in bytes #define BSON_VECTOR_HEADER_LEN 2 * Byte length for a Vector with specific element type and count: .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_int8_binary_data_length bson_vector_float32_binary_data_length bson_vector_packed_bit_binary_data_length * Errors: .. code-block:: c // Error "domain" #define BSON_ERROR_VECTOR 4 .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_error_code_t mongo-c-driver-2.2.1/src/libbson/doc/bson_aligned_alloc.rst000066400000000000000000000013561511661753600237000ustar00rootroot00000000000000:man_page: bson_aligned_alloc bson_aligned_alloc() ==================== Synopsis -------- .. code-block:: c void * bson_aligned_alloc (size_t alignment, size_t num_bytes); Parameters ---------- * ``alignment``: The alignment of the allocated bytes of memory. Must be a power of 2 and a multiple of ``sizeof (void *)``. * ``num_bytes``: The number of bytes to allocate. Must be a multiple of ``alignment``. Description ----------- This is a portable ``aligned_alloc()`` wrapper. If there was a failure to allocate ``num_bytes`` bytes aligned to ``alignment``, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-2.2.1/src/libbson/doc/bson_aligned_alloc0.rst000066400000000000000000000014201511661753600237500ustar00rootroot00000000000000:man_page: bson_aligned_alloc0 bson_aligned_alloc0() ===================== Synopsis -------- .. code-block:: c void * bson_aligned_alloc0 (size_t alignment, size_t num_bytes); Parameters ---------- * ``alignment``: The alignment of the allocated bytes of memory. Must be a power of 2 and a multiple of ``sizeof (void *)``. * ``num_bytes``: The number of bytes to allocate. Must be a multiple of ``alignment``. Description ----------- This is a portable ``aligned_alloc()`` wrapper that also sets the memory to zero. If there was a failure to allocate ``num_bytes`` bytes aligned to ``alignment``, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS* been zeroed. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array.rst000066400000000000000000000022021511661753600235570ustar00rootroot00000000000000:man_page: bson_append_array bson_append_array() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) bool bson_append_array (bson_t *bson, const char *key, int key_length, const bson_t *array); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``array``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_append_array()` function shall append ``array`` to ``bson`` using the specified key. The type of the field will be an array, but it is the responsibility of the caller to ensure that the keys of ``array`` are properly formatted with string keys such as "0", "1", "2" and so forth. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_begin.rst000066400000000000000000000025601511661753600247320ustar00rootroot00000000000000:man_page: bson_append_array_begin bson_append_array_begin() ========================= Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) bool bson_append_array_begin (bson_t *bson, const char *key, int key_length, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: A string containing the name for the key. * ``key_length``: The length of ``key`` or -1 to call ``strlen()``. * ``child``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_append_array_begin()` function shall begin appending an array field to ``bson``. This allows for incrementally building a sub-array. Doing so will generally yield better performance as you will serialize to a single buffer. When done building the sub-array, the caller *MUST* call :symbol:`bson_append_array_end()`. For generating array element keys, see :symbol:`bson_uint32_to_string`. Consider using :symbol:`bson_array_builder_t` to append an array without needing to generate array element keys. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_end.rst000066400000000000000000000012171511661753600244120ustar00rootroot00000000000000:man_page: bson_append_array_end bson_append_array_end() ======================= Synopsis -------- .. code-block:: c bool bson_append_array_end (bson_t *bson, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``child``: The :symbol:`bson_t` initialized in a call to :symbol:`bson_append_array_begin()`. Description ----------- The :symbol:`bson_append_array_end()` function shall complete the appending of an array field started with :symbol:`bson_append_array_begin()`. ``child`` is invalid after calling this function. Returns ------- Returns ``true`` if successful. .. seealso:: | :symbol:`bson_array_builder_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_from_vector.rst000066400000000000000000000023071511661753600261720ustar00rootroot00000000000000:man_page: bson_append_array_from_vector bson_append_array_from_vector() =============================== Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_FROM_VECTOR(b, key, iter) \ bson_append_array_from_vector (b, key, (int) strlen (key), iter) bool bson_append_array_from_vector (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``iter``: A :symbol:`bson_iter_t` pointing to any supported :doc:`binary_vector` field. Description ----------- Converts the Vector pointed to by ``iter`` into a plain BSON Array, written to ``bson`` under the name ``key``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX, or if ``iter`` doesn't point to a valid recognized Vector type. .. seealso:: | :symbol:`bson_array_builder_append_vector_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_from_vector_float32.rst000066400000000000000000000024011511661753600275170ustar00rootroot00000000000000:man_page: bson_append_array_from_vector_float32 bson_append_array_from_vector_float32() ======================================= Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_FROM_VECTOR_FLOAT32(b, key, view) \ bson_append_array_from_vector_float32 (b, key, (int) strlen (key), view) bool bson_append_array_from_vector_float32 (bson_t *bson, const char *key, int key_length, bson_vector_float32_const_view_t view); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``view``: A :symbol:`bson_vector_float32_const_view_t` pointing to validated ``float32`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into a plain BSON Array, written to ``bson`` under the name ``key``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_append_vector_float32_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_from_vector_int8.rst000066400000000000000000000023321511661753600271320ustar00rootroot00000000000000:man_page: bson_append_array_from_vector_int8 bson_append_array_from_vector_int8() ==================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_FROM_VECTOR_INT8(b, key, view) \ bson_append_array_from_vector_int8 (b, key, (int) strlen (key), view) bool bson_append_array_from_vector_int8 (bson_t *bson, const char *key, int key_length, bson_vector_int8_const_view_t view); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``view``: A :symbol:`bson_vector_int8_const_view_t` pointing to validated ``int8`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into a plain BSON Array, written to ``bson`` under the name ``key``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_append_vector_int8_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_array_from_vector_packed_bit.rst000066400000000000000000000024501511661753600303360ustar00rootroot00000000000000:man_page: bson_append_array_from_vector_packed_bit bson_append_array_from_vector_packed_bit() ========================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_ARRAY_FROM_VECTOR_PACKED_BIT(b, key, view) \ bson_append_array_from_vector_packed_bit (b, key, (int) strlen (key), view) bool bson_append_array_from_vector_packed_bit (bson_t *bson, const char *key, int key_length, bson_vector_packed_bit_const_view_t view); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``view``: A :symbol:`bson_vector_packed_bit_const_view_t` pointing to validated ``packed_bit`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into a plain BSON Array, written to ``bson`` under the name ``key``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_array_builder_append_vector_packed_bit_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_binary.rst000066400000000000000000000023431511661753600237330ustar00rootroot00000000000000:man_page: bson_append_binary bson_append_binary() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) bool bson_append_binary (bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The key name. * ``key_length``: The length of ``key`` in bytes or -1 to use strlen(). * ``subtype``: A bson_subtype_t indicating the binary subtype. * ``binary``: A buffer to embed as binary data. May be ``NULL`` for an empty binary value. * ``length``: The length of ``buffer`` in bytes. Must be ``0`` if ``binary`` is NULL. Description ----------- The :symbol:`bson_append_binary()` function shall append a new element to ``bson`` containing the binary data provided. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``binary`` grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_append_binary_uninit` mongo-c-driver-2.2.1/src/libbson/doc/bson_append_binary_uninit.rst000066400000000000000000000031351511661753600253210ustar00rootroot00000000000000:man_page: bson_append_binary_uninit bson_append_binary_uninit() =========================== Synopsis -------- .. code-block:: c #define BSON_APPEND_BINARY_UNINIT(b, key, subtype, val, len) \ bson_append_binary_uninit (b, key, (int) strlen (key), subtype, val, len) bool bson_append_binary_uninit (bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, uint8_t **binary, uint32_t length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The key name. * ``key_length``: The length of ``key`` in bytes or -1 to use strlen(). * ``subtype``: A bson_subtype_t indicating the binary subtype. * ``binary``: Location for a pointer that will receive a writable pointer to the uninitialized binary data block. * ``length``: The length of ``buffer`` in bytes. Description ----------- The :symbol:`bson_append_binary_uninit()` function is an alternative to :symbol:`bson_append_binary()` which allows applications to assemble the contents of the binary field within the :symbol:`bson_t`, without an additional temporary buffer. On success, the caller MUST write to every byte of the binary data block if the resulting :symbol:`bson_t` is to be used. The buffer that ``binary`` points to is only valid until the iterator's :symbol:`bson_t` is otherwise modified or freed. Returns ------- Returns ``true`` if the uninitialized ``binary`` item was appended. The function will fail if appending ``binary`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_bool.rst000066400000000000000000000014071511661753600234020ustar00rootroot00000000000000:man_page: bson_append_bool bson_append_bool() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) bool bson_append_bool (bson_t *bson, const char *key, int key_length, bool value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The name of the field. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``value``: true or false. Description ----------- The :symbol:`bson_append_bool()` function shall append a new element to ``bson`` containing the boolean provided. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_code.rst000066400000000000000000000016661511661753600233700ustar00rootroot00000000000000:man_page: bson_append_code bson_append_code() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) bool bson_append_code (bson_t *bson, const char *key, int key_length, const char *javascript); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: The key name. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``javascript``: A UTF-8 encoded string containing the javascript. Description ----------- The :symbol:`bson_append_code()` function shall append a new element to ``bson`` using the UTF-8 encoded ``javascript`` provided. ``javascript`` must be a NULL terminated C string. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_code_with_scope.rst000066400000000000000000000026451511661753600256120ustar00rootroot00000000000000:man_page: bson_append_code_with_scope bson_append_code_with_scope() ============================= Synopsis -------- .. code-block:: c #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) bool bson_append_code_with_scope (bson_t *bson, const char *key, int key_length, const char *javascript, const bson_t *scope); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``javascript``: A NULL-terminated UTF-8 encoded string containing the javascript fragment. * ``scope``: Optional :symbol:`bson_t` containing the scope for ``javascript``. Description ----------- The :symbol:`bson_append_code_with_scope()` function shall perform like :symbol:`bson_append_code()` except it allows providing a scope to the javascript function in the form of a bson document. If ``scope`` is NULL, this function appends an element with BSON type "code", otherwise with BSON type "code with scope". Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``javascript`` and ``scope`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_date_time.rst000066400000000000000000000021761511661753600244060ustar00rootroot00000000000000:man_page: bson_append_date_time bson_append_date_time() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) bool bson_append_date_time (bson_t *bson, const char *key, int key_length, int64_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: The date and time as specified in milliseconds since the UNIX epoch. Description ----------- The :symbol:`bson_append_date_time()` function shall append a new element to a ``bson`` document containing a date and time with no timezone information. ``value`` is assumed to be in UTC format of milliseconds since the UNIX epoch. ``value`` *MAY* be negative. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_dbpointer.rst000066400000000000000000000020731511661753600244350ustar00rootroot00000000000000:man_page: bson_append_dbpointer bson_append_dbpointer() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) bool bson_append_dbpointer (bson_t *bson, const char *key, int key_length, const char *collection, const bson_oid_t *oid); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``collection``: The target collection name. * ``oid``: The target document identifier. Description ----------- .. warning:: The dbpointer field type is *DEPRECATED* and should only be used when interacting with legacy systems. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the array grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_decimal128.rst000066400000000000000000000017351511661753600243040ustar00rootroot00000000000000:man_page: bson_append_decimal128 bson_append_decimal128() ======================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) bool bson_append_decimal128 (bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_decimal128_t`. Description ----------- The :symbol:`bson_append_decimal128()` function shall append a new element to ``bson`` containing a Decimal 128. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_document.rst000066400000000000000000000017761511661753600242760ustar00rootroot00000000000000:man_page: bson_append_document bson_append_document() ====================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) bool bson_append_document (bson_t *bson, const char *key, int key_length, const bson_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_t` containing the sub-document to append. Description ----------- The :symbol:`bson_append_document()` function shall append ``child`` to ``bson`` using the specified key. The type of the field will be a document. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_document_begin.rst000066400000000000000000000023271511661753600254330ustar00rootroot00000000000000:man_page: bson_append_document_begin bson_append_document_begin() ============================ Synopsis -------- .. code-block:: c #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) bool bson_append_document_begin (bson_t *bson, const char *key, int key_length, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``child``: An uninitialized :symbol:`bson_t` to be initialized as the sub-document. Description ----------- The :symbol:`bson_append_document_begin()` function shall begin appending a sub-document to ``bson``. Use ``child`` to add fields to the sub-document. When completed, call :symbol:`bson_append_document_end()` to complete the element. ``child`` *MUST* be an uninitialized :symbol:`bson_t` to avoid leaking memory. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if ``bson`` must grow larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_document_end.rst000066400000000000000000000011541511661753600251120ustar00rootroot00000000000000:man_page: bson_append_document_end bson_append_document_end() ========================== Synopsis -------- .. code-block:: c bool bson_append_document_end (bson_t *bson, bson_t *child); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``child``: The child :symbol:`bson_t` initialized in a call to :symbol:`bson_append_document_begin()`. Description ----------- The :symbol:`bson_append_document_end()` function shall complete the appending of a document with :symbol:`bson_append_document_begin()`. ``child`` is invalid after calling this function. Returns ------- Returns ``true`` if successful. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_double.rst000066400000000000000000000016371511661753600237260ustar00rootroot00000000000000:man_page: bson_append_double bson_append_double() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) bool bson_append_double (bson_t *bson, const char *key, int key_length, double value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A double value to append. Description ----------- The :symbol:`bson_append_double()` function shall append a new element to a bson document of type ``double``. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_int32.rst000066400000000000000000000016211511661753600234040ustar00rootroot00000000000000:man_page: bson_append_int32 bson_append_int32() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) bool bson_append_int32 (bson_t *bson, const char *key, int key_length, int32_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: An int32_t. Description ----------- The :symbol:`bson_append_int32()` function shall append a new element to ``bson`` containing a 32-bit signed integer. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_int64.rst000066400000000000000000000016211511661753600234110ustar00rootroot00000000000000:man_page: bson_append_int64 bson_append_int64() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) bool bson_append_int64 (bson_t *bson, const char *key, int key_length, int64_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: An int64_t. Description ----------- The :symbol:`bson_append_int64()` function shall append a new element to ``bson`` containing a 64-bit signed integer. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``value`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_iter.rst000066400000000000000000000014611511661753600234120ustar00rootroot00000000000000:man_page: bson_append_iter bson_append_iter() ================== Synopsis -------- .. code-block:: c bool bson_append_iter (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: Optional field name. If NULL, uses :symbol:`bson_iter_key(iter) `. * ``key_length``: The length of ``key`` or -1 to use strlen(). * ``iter``: A :symbol:`bson_iter_t` located on the position of the element to append. Description ----------- Appends the value at the current position of ``iter`` to the document. Returns ------- Returns ``true`` if successful; ``false`` if the operation would overflow the maximum document size or another invalid state is detected. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_maxkey.rst000066400000000000000000000015771511661753600237550ustar00rootroot00000000000000:man_page: bson_append_maxkey bson_append_maxkey() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) bool bson_append_maxkey (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_maxkey()` function shall append an element of type BSON_TYPE_MAXKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_minkey.rst000066400000000000000000000015771511661753600237530ustar00rootroot00000000000000:man_page: bson_append_minkey bson_append_minkey() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) bool bson_append_minkey (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_minkey()` function shall append an element of type BSON_TYPE_MINKEY to a bson document. This is primarily used in queries and unlikely to be used when storing a document to MongoDB. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_now_utc.rst000066400000000000000000000014671511661753600241330ustar00rootroot00000000000000:man_page: bson_append_now_utc bson_append_now_utc() ===================== Synopsis -------- .. code-block:: c bool bson_append_now_utc (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_now_utc()` function is a helper to get the current date and time in UTC and append it to ``bson`` as a BSON_TYPE_DATE_TIME element. This function calls :symbol:`bson_append_date_time()` internally. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_null.rst000066400000000000000000000014061511661753600234200ustar00rootroot00000000000000:man_page: bson_append_null bson_append_null() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) bool bson_append_null (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_null()` function shall append a new element to ``bson`` of type BSON_TYPE_NULL. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_oid.rst000066400000000000000000000016551511661753600232270ustar00rootroot00000000000000:man_page: bson_append_oid bson_append_oid() ================= Synopsis -------- .. code-block:: c #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) bool bson_append_oid (bson_t *bson, const char *key, int key_length, const bson_oid_t *oid); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``oid``: A bson_oid_t. Description ----------- The :symbol:`bson_append_oid()` function shall append a new element to ``bson`` of type BSON_TYPE_OID. ``oid`` *MUST* be a pointer to a :symbol:`bson_oid_t`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending ``oid`` grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_regex.rst000066400000000000000000000025431511661753600235630ustar00rootroot00000000000000:man_page: bson_append_regex bson_append_regex() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) bool bson_append_regex (bson_t *bson, const char *key, int key_length, const char *regex, const char *options); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``regex``: An ASCII string containing the regex. * ``options``: An optional string containing the regex options as a string. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_REGEX. ``regex`` should be the regex string. ``options`` should contain the options for the regex. Valid characters for ``options`` include: * ``'i'`` for case-insensitive. * ``'m'`` for multiple matching. * ``'x'`` for verbose mode. * ``'l'`` to make \w and \W locale dependent. * ``'s'`` for dotall mode ('.' matches everything) * ``'u'`` to make \w and \W match unicode. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the regex grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_regex_w_len.rst000066400000000000000000000026771511661753600247570ustar00rootroot00000000000000:man_page: bson_append_regex_w_len bson_append_regex_w_len() ========================== Synopsis -------- .. code-block:: c bool bson_append_regex_w_len (bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``regex``: An ASCII string containing the regex. * ``regex_length``: The length of ``regex`` in bytes, or -1 to determine the length with ``strlen()``. * ``options``: An optional string containing the regex options as a string. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_REGEX. ``regex`` should be the regex string. ``options`` should contain the options for the regex. Valid characters for ``options`` include: * ``'i'`` for case-insensitive. * ``'m'`` for multiple matching. * ``'x'`` for verbose mode. * ``'l'`` to make \w and \W locale dependent. * ``'s'`` for dotall mode ('.' matches everything) * ``'u'`` to make \w and \W match unicode. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the regex grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_symbol.rst000066400000000000000000000023511511661753600237530ustar00rootroot00000000000000:man_page: bson_append_symbol bson_append_symbol() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) bool bson_append_symbol (bson_t *bson, const char *key, int key_length, const char *value, int length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: The symbol. * ``length``: A length of ``symbol`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- Appends a new field to ``bson`` of type BSON_TYPE_SYMBOL. This BSON type is deprecated and should not be used in new code. Due to legacy behavior, passing ``NULL`` for ``value`` appends a null value, *not* a symbol value. To append a null value directly, prefer using :symbol:`bson_append_null()`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_time_t.rst000066400000000000000000000016371511661753600237350ustar00rootroot00000000000000:man_page: bson_append_time_t bson_append_time_t() ==================== Synopsis -------- .. code-block:: c #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) bool bson_append_time_t (bson_t *bson, const char *key, int key_length, time_t value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A time_t. Description ----------- The :symbol:`bson_append_time_t()` function is a helper that takes a ``time_t`` instead of milliseconds since the UNIX epoch. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_timestamp.rst000066400000000000000000000023751511661753600244570ustar00rootroot00000000000000:man_page: bson_append_timestamp bson_append_timestamp() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) bool bson_append_timestamp (bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- This function is not similar in functionality to :symbol:`bson_append_date_time()`. Timestamp elements are different in that they include only second precision and an increment field. They are primarily used for intra-MongoDB server communication. The :symbol:`bson_append_timestamp()` function shall append a new element of type BSON_TYPE_TIMESTAMP. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_timeval.rst000066400000000000000000000017021511661753600241060ustar00rootroot00000000000000:man_page: bson_append_timeval bson_append_timeval() ===================== Synopsis -------- .. code-block:: c #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) bool bson_append_timeval (bson_t *bson, const char *key, int key_length, struct timeval *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A struct timeval. Description ----------- The :symbol:`bson_append_timeval()` function is a helper that takes a ``struct timeval`` instead of milliseconds since the UNIX epoch. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_undefined.rst000066400000000000000000000016451511661753600244140ustar00rootroot00000000000000:man_page: bson_append_undefined bson_append_undefined() ======================= Synopsis -------- .. code-block:: c #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) bool bson_append_undefined (bson_t *bson, const char *key, int key_length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_undefined()` function shall append a new element to ``bson`` of type BSON_TYPE_UNDEFINED. Undefined is common in Javascript. However, this element type is deprecated and should not be used in new code. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_utf8.rst000066400000000000000000000032531511661753600233360ustar00rootroot00000000000000:man_page: bson_append_utf8 bson_append_utf8() ================== Synopsis -------- .. code-block:: c #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) bool bson_append_utf8 (bson_t *bson, const char *key, int key_length, const char *value, int length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A UTF-8 encoded string. * ``length``: The number of bytes in ``value`` excluding the trailing ``\0``, or -1 to determine the length with ``strlen()``. Description ----------- The :symbol:`bson_append_utf8()` function shall append a UTF-8 encoded string to ``bson``. ``value`` *MUST* be valid UTF-8. Some UTF-8 implementations allow for ``\0`` to be contained within the string (excluding the termination ``\0``. This is allowed, but remember that it could cause issues with communicating with external systems that do not support it. It is suggested to use modified UTF-8 which uses a 2 byte representation for embedded ``\0`` within the string. This will allow these UTF-8 encoded strings to used with many libc functions. Due to legacy behavior, passing ``NULL`` for ``value`` appends a null value, *not* a UTF8 value. To append a null value directly, prefer using :symbol:`bson_append_null()`. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_value.rst000066400000000000000000000017551511661753600235710ustar00rootroot00000000000000:man_page: bson_append_value bson_append_value() =================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) bool bson_append_value (bson_t *bson, const char *key, int key_length, const bson_value_t *value); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``value``: A :symbol:`bson_value_t`. Description ----------- Appends a new field to ``bson`` by determining the boxed type in ``value``. This is useful if you want to copy fields between documents but do not know the field type until runtime. Returns ------- Returns ``true`` if the operation was applied successfully. The function will fail if appending the value grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_float32_from_array.rst000066400000000000000000000034251511661753600275260ustar00rootroot00000000000000:man_page: bson_append_vector_float32_from_array bson_append_vector_float32_from_array() ======================================= Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_FLOAT32_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_float32_from_array (b, key, (int) strlen (key), iter, err) bool bson_append_vector_float32_from_array (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``iter``: A :symbol:`bson_iter_t` referencing array elements that will be converted. * ``error``: Optional :symbol:`bson_error_t` for detail about conversion failures. Description ----------- Appends a new field to ``bson`` by converting an Array to a Vector of ``float32`` elements. For the conversion to succeed, every item in the Array must be double-precision floating point number. (``BSON_TYPE_DOUBLE``) The provided ``iter`` must be positioned just prior to the first element of the BSON Array. If your input is a bare BSON Array, set up ``iter`` using :symbol:`bson_iter_init`. If the input is within a document field, use :symbol:`bson_iter_recurse`. Returns ------- Returns ``true`` if the operation was applied successfully. On error, returns ``false`` and writes additional error information to ``error`` without modifying ``bson``. The error will have a ``domain`` of ``BSON_ERROR_VECTOR`` and a ``code`` from :symbol:`bson_vector_error_code_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_float32_uninit.rst000066400000000000000000000027511511661753600266740ustar00rootroot00000000000000:man_page: bson_append_vector_float32_uninit bson_append_vector_float32_uninit() =================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_FLOAT32_UNINIT(b, key, count, view) \ bson_append_vector_float32_uninit (b, key, (int) strlen (key), count, view) bool bson_append_vector_float32_uninit (bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_float32_view_t *view_out); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``element_count``: Number of elements to allocate space for. * ``view_out``: Receives a :symbol:`bson_vector_float32_view_t` with uninitialized elements. Description ----------- Appends a new field to ``bson`` by allocating a Vector with the indicated number of ``float32`` elements. The elements will be uninitialized. On success, the caller must write every element in the Vector if the resulting :symbol:`bson_t` is to be used. The view written to ``*view_out`` is only valid until ``bson`` is otherwise modified or freed. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_int8_from_array.rst000066400000000000000000000037321511661753600271370ustar00rootroot00000000000000:man_page: bson_append_vector_int8_from_array bson_append_vector_int8_from_array() ==================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_INT8_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_int8_from_array (b, key, (int) strlen (key), iter, err) bool bson_append_vector_int8_from_array (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``iter``: A :symbol:`bson_iter_t` referencing array elements that will be converted. * ``error``: Optional :symbol:`bson_error_t` for detail about conversion failures. Description ----------- Appends a new field to ``bson`` by converting an Array to a Vector of ``int8`` elements. For the conversion to succeed, every item in the Array must be an integer (``BSON_TYPE_INT32`` or ``BSON_TYPE_INT64``) in the range ``INT8_MIN`` (-128) through ``INT8_MAX`` (127) inclusive. If any element has an incorrect type or an out-of-range value, the conversion fails with an ``error`` message providing details, and no changes are made to ``bson``. The provided ``iter`` must be positioned just prior to the first element of the BSON Array. If your input is a bare BSON Array, set up ``iter`` using :symbol:`bson_iter_init`. If the input is within a document field, use :symbol:`bson_iter_recurse`. Returns ------- Returns ``true`` if the operation was applied successfully. On error, returns ``false`` and writes additional error information to ``error`` without modifying ``bson``. The error will have a ``domain`` of ``BSON_ERROR_VECTOR`` and a ``code`` from :symbol:`bson_vector_error_code_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_int8_uninit.rst000066400000000000000000000027021511661753600263000ustar00rootroot00000000000000:man_page: bson_append_vector_int8_uninit bson_append_vector_int8_uninit() ================================ Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_INT8_UNINIT(b, key, count, view) \ bson_append_vector_int8_uninit (b, key, (int) strlen (key), count, view) bool bson_append_vector_int8_uninit (bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_int8_view_t *view_out); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``element_count``: Number of elements to allocate space for. * ``view_out``: Receives a :symbol:`bson_vector_int8_view_t` with uninitialized elements. Description ----------- Appends a new field to ``bson`` by allocating a Vector with the indicated number of ``int8`` elements. The elements will be uninitialized. On success, the caller must write every element in the Vector if the resulting :symbol:`bson_t` is to be used. The view written to ``*view_out`` is only valid until ``bson`` is otherwise modified or freed. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_packed_bit_from_array.rst000066400000000000000000000040351511661753600303370ustar00rootroot00000000000000:man_page: bson_append_vector_packed_bit_from_array bson_append_vector_packed_bit_from_array() ========================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_PACKED_BIT_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_packed_bit_from_array (b, key, (int) strlen (key), iter, err) bool bson_append_vector_packed_bit_from_array (bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``iter``: A :symbol:`bson_iter_t` referencing array elements that will be converted. * ``error``: Optional :symbol:`bson_error_t` for detail about conversion failures. Description ----------- Appends a new field to ``bson`` by converting an Array to a Vector of ``packed_bit`` elements. For the conversion to succeed, every item in the Array must be either an integer (``BSON_TYPE_INT32`` or ``BSON_TYPE_INT64``) with the values ``0`` or ``1``, or boolean (``BSON_TYPE_BOOL``). If any element has an incorrect type or an out-of-range value, the conversion fails with an ``error`` message providing details, and no changes are made to ``bson``. The provided ``iter`` must be positioned just prior to the first element of the BSON Array. If your input is a bare BSON Array, set up ``iter`` using :symbol:`bson_iter_init`. If the input is within a document field, use :symbol:`bson_iter_recurse`. Returns ------- Returns ``true`` if the operation was applied successfully. On error, returns ``false`` and writes additional error information to ``error`` without modifying ``bson``. The error will have a ``domain`` of ``BSON_ERROR_VECTOR`` and a ``code`` from :symbol:`bson_vector_error_code_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_append_vector_packed_bit_uninit.rst000066400000000000000000000030201511661753600274750ustar00rootroot00000000000000:man_page: bson_append_vector_packed_bit_uninit bson_append_vector_packed_bit_uninit() ====================================== Synopsis -------- .. code-block:: c #define BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(b, key, count, view) \ bson_append_vector_packed_bit_uninit (b, key, (int) strlen (key), count, view) bool bson_append_vector_packed_bit_uninit (bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_packed_bit_view_t *view_out); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: An ASCII C string containing the name of the field. * ``key_length``: The length of ``key`` in bytes, or -1 to determine the length with ``strlen()``. * ``element_count``: Number of elements to allocate space for. * ``view_out``: Receives a :symbol:`bson_vector_packed_bit_view_t` with uninitialized elements. Description ----------- Appends a new field to ``bson`` by allocating a Vector with the indicated number of ``packed_bit`` elements. The elements will be uninitialized. On success, the caller must write every element in the Vector if the resulting :symbol:`bson_t` is to be used. The view written to ``*view_out`` is only valid until ``bson`` is otherwise modified or freed. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. mongo-c-driver-2.2.1/src/libbson/doc/bson_array_alloc.rst000066400000000000000000000015131511661753600234060ustar00rootroot00000000000000:man_page: bson_array_alloc bson_array_alloc() ================== Synopsis -------- .. code-block:: c #define BSON_ARRAY_ALLOC(Count, Type) \ (Type*) bson_array_alloc (Count, sizeof (Type)) void * bson_array_alloc (size_t num_elems, size_t elem_size); Parameters ---------- * ``num_elems``: A size_t containing the number of objects to allocate. * ``elem_size``: A size_t containing the size of each object in bytes. Description ----------- This is a portable ``malloc()`` wrapper to allocate an array of objects. If ``num_elems * elem_size`` cannot be represented in a size_t or there was a failure to allocate ``num_elems * elem_size`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed.mongo-c-driver-2.2.1/src/libbson/doc/bson_array_alloc0.rst000066400000000000000000000015571511661753600234760ustar00rootroot00000000000000:man_page: bson_array_alloc0 bson_array_alloc0() =================== Synopsis -------- .. code-block:: c #define BSON_ARRAY_ALLOC0(Count, Type) \ (Type*) bson_array_alloc0 (Count, sizeof (Type)) void * bson_array_alloc0 (size_t num_elems, size_t elem_size); Parameters ---------- * ``num_elems``: A size_t containing the number of objects to allocate. * ``elem_size``: A size_t containing the size of each object in bytes. Description ----------- This is a portable ``calloc()`` wrapper to allocate an array of objects that also sets the memory to zero. If ``num_elems * elem_size`` cannot be represented in a size_t or there was a failure to allocate ``num_elems * elem_size`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS* been zeroed.mongo-c-driver-2.2.1/src/libbson/doc/bson_array_as_canonical_extended_json.rst000066400000000000000000000026671511661753600276520ustar00rootroot00000000000000:man_page: bson_array_as_canonical_extended_json bson_array_as_canonical_extended_json() ======================================= Synopsis -------- .. code-block:: c char * bson_array_as_canonical_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_array_as_canonical_extended_json()` encodes ``bson`` as a UTF-8 string in Canonical Extended JSON. The outermost element is encoded as a JSON array (``[ ... ]``), rather than a JSON document (``{ ... }``). See `MongoDB Extended JSON format`_ for a description of Extended JSON formats. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_array_as_canonical_extended_json ... begin :end-before: // bson_array_as_canonical_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_array_as_legacy_extended_json.rst000066400000000000000000000031171511661753600271560ustar00rootroot00000000000000:man_page: bson_array_as_legacy_extended_json bson_array_as_legacy_extended_json() ==================================== Synopsis -------- .. code-block:: c char * bson_array_as_legacy_extended_json (const bson_t *bson, size_t *length) Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_array_as_legacy_extended_json()` encodes ``bson`` as a UTF-8 string using :doc:`libbson's Legacy Extended JSON `. The outermost element is encoded as a JSON array (``[ ... ]``), rather than a JSON document (``{ ... }``). This function is superseded by :symbol:`bson_array_as_canonical_extended_json()` and :symbol:`bson_array_as_relaxed_extended_json()`, which use the same `MongoDB Extended JSON format`_ as all other MongoDB drivers. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_array_as_legacy_extended_json ... begin :end-before: // bson_array_as_legacy_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_array_as_relaxed_extended_json.rst000066400000000000000000000026451511661753600273430ustar00rootroot00000000000000:man_page: bson_array_as_relaxed_extended_json bson_array_as_relaxed_extended_json() ===================================== Synopsis -------- .. code-block:: c char * bson_array_as_relaxed_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_as_relaxed_extended_json()` encodes ``bson`` as a UTF-8 string in the Relaxed Extended JSON. The outermost element is encoded as a JSON array (``[ ... ]``), rather than a JSON document (``{ ... }``). See `MongoDB Extended JSON format`_ for a description of Extended JSON formats. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_array_as_relaxed_extended_json ... begin :end-before: // bson_array_as_relaxed_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_array_builder_append_vector_elements.rst000066400000000000000000000024001511661753600305430ustar00rootroot00000000000000:man_page: bson_array_builder_append_vector_elements bson_array_builder_append_vector_elements() =========================================== Synopsis -------- .. code-block:: c bool bson_array_builder_append_vector_elements (bson_array_builder_t *builder, const bson_iter_t *iter); Parameters ---------- * ``builder``: A valid :symbol:`bson_array_builder_t`. * ``iter``: A :symbol:`bson_iter_t` pointing to any supported :doc:`binary_vector` field. Description ----------- Converts the Vector pointed to by ``iter`` into elements of a plain BSON Array, written to ``builder``. This conversion is polymorphic: A converted element type will be chosen based on the type of the input Vector. For details, see the type-specific versions of this function. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX, or if ``iter`` doesn't point to a valid recognized Vector type. .. seealso:: | :symbol:`bson_append_array_from_vector` | :symbol:`bson_array_builder_append_vector_int8_elements` | :symbol:`bson_array_builder_append_vector_float32_elements` | :symbol:`bson_array_builder_append_vector_packed_bit_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_array_builder_append_vector_float32_elements.rst000066400000000000000000000020451511661753600321020ustar00rootroot00000000000000:man_page: bson_array_builder_append_vector_float32_elements bson_array_builder_append_vector_float32_elements() =================================================== Synopsis -------- .. code-block:: c bool bson_array_builder_append_vector_float32_elements (bson_array_builder_t *builder, bson_vector_float32_const_view_t view); Parameters ---------- * ``builder``: A valid :symbol:`bson_array_builder_t`. * ``view``: A :symbol:`bson_vector_float32_const_view_t` pointing to validated ``float32`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into elements of a plain BSON Array, written to ``builder``. Every element will be converted from ``float`` to ``double`` precision. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_append_array_from_vector` | :symbol:`bson_array_builder_append_vector_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_array_builder_append_vector_int8_elements.rst000066400000000000000000000020171511661753600315110ustar00rootroot00000000000000:man_page: bson_array_builder_append_vector_int8_elements bson_array_builder_append_vector_int8_elements() ================================================ Synopsis -------- .. code-block:: c bool bson_array_builder_append_vector_int8_elements (bson_array_builder_t *builder, bson_vector_int8_const_view_t view); Parameters ---------- * ``builder``: A valid :symbol:`bson_array_builder_t`. * ``view``: A :symbol:`bson_vector_int8_const_view_t` pointing to validated ``int8`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into elements of a plain BSON Array, written to ``builder``. Every element will be losslessly extended from ``int8_t`` to ``int32_t``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_append_array_from_vector` | :symbol:`bson_array_builder_append_vector_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_array_builder_append_vector_packed_bit_elements.rst000066400000000000000000000020741511661753600327170ustar00rootroot00000000000000:man_page: bson_array_builder_append_vector_packed_bit_elements bson_array_builder_append_vector_packed_bit_elements() ====================================================== Synopsis -------- .. code-block:: c bool bson_array_builder_append_vector_packed_bit_elements (bson_array_builder_t *builder, bson_vector_packed_bit_const_view_t view); Parameters ---------- * ``builder``: A valid :symbol:`bson_array_builder_t`. * ``view``: A :symbol:`bson_vector_packed_bit_const_view_t` pointing to validated ``packed_bit`` :doc:`binary_vector` data. Description ----------- Converts the Vector pointed to by ``view`` into elements of a plain BSON Array, written to ``builder``. Every element will be ``0`` or ``1`` written as a ``BSON_TYPE_INT32``. Returns ------- Returns ``true`` if the operation was applied successfully. The function fails if appending the array grows ``bson`` larger than INT32_MAX. .. seealso:: | :symbol:`bson_append_array_from_vector` | :symbol:`bson_array_builder_append_vector_elements` mongo-c-driver-2.2.1/src/libbson/doc/bson_array_builder_t.rst000066400000000000000000000154121511661753600242700ustar00rootroot00000000000000:man_page: bson_array_builder_t bson_array_builder_t ==================== .. code-block:: c typedef struct _bson_array_builder_t bson_array_builder_t; ``bson_array_builder_t`` may be used to build BSON arrays. ``bson_array_builder_t`` internally tracks and uses the array index as a key ("0", "1", "2", ...) when appending elements. Appending an array value ------------------------ .. code-block:: c typedef struct _bson_array_builder_t bson_array_builder_t; bool bson_append_array_builder_begin (bson_t *bson, const char *key, int key_length, bson_array_builder_t **child); bool bson_append_array_builder_end (bson_t *bson, bson_array_builder_t *child); #define BSON_APPEND_ARRAY_BUILDER_BEGIN(b, key, child) \ bson_append_array_builder_begin (b, key, (int) strlen (key), child) ``bson_append_array_builder_begin`` may be used to append an array as a value. Example: .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_array_builder_t example ... begin :end-before: // bson_array_builder_t example ... end :dedent: 6 Creating a top-level array -------------------------- .. code-block:: c bson_array_builder_t * bson_array_builder_new (void); bool bson_array_builder_build (bson_array_builder_t *bab, bson_t *out); void bson_array_builder_destroy (bson_array_builder_t *bab); ``bson_array_builder_new`` and ``bson_array_builder_build`` may be used to build a top-level BSON array. ``bson_array_builder_build`` initializes and moves BSON data to ``out``. The ``bson_array_builder_t`` may be reused and will start appending a new array at index "0": Example: .. literalinclude:: ../examples/creating.c :language: c :start-after: // bson_array_builder_t top-level example ... begin :end-before: // bson_array_builder_t top-level example ... end :dedent: 6 Appending values to an array ---------------------------- ``bson_array_builder_append_*`` functions are provided to append values to a BSON array. The ``bson_array_builder_append_*`` functions internally use ``bson_append_*`` and provide the array index as a key: .. code-block:: c bool bson_array_builder_append_value (bson_array_builder_t *bab, const bson_value_t *value); bool bson_array_builder_append_array (bson_array_builder_t *bab, const bson_t *array); bool bson_array_builder_append_binary (bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); bool bson_array_builder_append_binary_uninit (bson_array_builder_t *bab, bson_subtype_t subtype, uint8_t **binary, uint32_t length); bool bson_array_builder_append_bool (bson_array_builder_t *bab, bool value); bool bson_array_builder_append_code (bson_array_builder_t *bab, const char *javascript); bool bson_array_builder_append_code_with_scope (bson_array_builder_t *bab, const char *javascript, const bson_t *scope); bool bson_array_builder_append_dbpointer (bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid); bool bson_array_builder_append_double (bson_array_builder_t *bab, double value); bool bson_array_builder_append_document (bson_array_builder_t *bab, const bson_t *value); bool bson_array_builder_append_document_begin (bson_array_builder_t *bab, bson_t *child); bool bson_array_builder_append_document_end (bson_array_builder_t *bab, bson_t *child); bool bson_array_builder_append_int32 (bson_array_builder_t *bab, int32_t value); bool bson_array_builder_append_int64 (bson_array_builder_t *bab, int64_t value); bool bson_array_builder_append_decimal128 (bson_array_builder_t *bab, const bson_decimal128_t *value); bool bson_array_builder_append_iter (bson_array_builder_t *bab, const bson_iter_t *iter); bool bson_array_builder_append_minkey (bson_array_builder_t *bab); bool bson_array_builder_append_maxkey (bson_array_builder_t *bab); bool bson_array_builder_append_null (bson_array_builder_t *bab); bool bson_array_builder_append_oid (bson_array_builder_t *bab, const bson_oid_t *oid); bool bson_array_builder_append_regex (bson_array_builder_t *bab, const char *regex, const char *options); bool bson_array_builder_append_regex_w_len (bson_array_builder_t *bab, const char *regex, int regex_length, const char *options); bool bson_array_builder_append_utf8 (bson_array_builder_t *bab, const char *value, int length); bool bson_array_builder_append_symbol (bson_array_builder_t *bab, const char *value, int length); bool bson_array_builder_append_time_t (bson_array_builder_t *bab, time_t value); bool bson_array_builder_append_timeval (bson_array_builder_t *bab, struct timeval *value); bool bson_array_builder_append_date_time (bson_array_builder_t *bab, int64_t value); bool bson_array_builder_append_now_utc (bson_array_builder_t *bab); bool bson_array_builder_append_timestamp (bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment); bool bson_array_builder_append_undefined (bson_array_builder_t *bab); bool bson_array_builder_append_array_builder_begin (bson_array_builder_t *bab, bson_array_builder_t **child); bool bson_array_builder_append_array_builder_end (bson_array_builder_t *bab, bson_array_builder_t *child); mongo-c-driver-2.2.1/src/libbson/doc/bson_as_canonical_extended_json.rst000066400000000000000000000024461511661753600264470ustar00rootroot00000000000000:man_page: bson_as_canonical_extended_json bson_as_canonical_extended_json() ================================= Synopsis -------- .. code-block:: c char * bson_as_canonical_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_as_canonical_extended_json()` encodes ``bson`` as a UTF-8 string in the Canonical Extended JSON. See `MongoDB Extended JSON format`_ for a description of Extended JSON formats. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_as_canonical_extended_json ... begin :end-before: // bson_as_canonical_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_as_json_with_opts.rst000066400000000000000000000027031511661753600246540ustar00rootroot00000000000000:man_page: bson_as_json_with_opts bson_as_json_with_opts() ======================== Synopsis -------- .. code-block:: c char * bson_as_json_with_opts (const bson_t *bson, size_t *length, const bson_json_opts_t *opts); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. * ``opts``: A :symbol:`bson_json_opts_t`. Description ----------- :symbol:`bson_as_json_with_opts()` encodes ``bson`` as a UTF-8 string in the `MongoDB Extended JSON format`_ or :doc:`libbson's Legacy Extended JSON `. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. The ``opts`` structure is used to pass options for the encoding process. Please refer to the documentation of :symbol:`bson_json_opts_t` for more details. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_as_json_with_opts ... begin :end-before: // bson_as_json_with_opts ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_as_legacy_extended_json.rst000066400000000000000000000026561511661753600257670ustar00rootroot00000000000000:man_page: bson_as_legacy_extended_json bson_as_legacy_extended_json() ============================== Synopsis -------- .. code-block:: c char * bson_as_legacy_extended_json (const bson_t *bson, size_t *length) Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_as_legacy_extended_json()` encodes ``bson`` as a UTF-8 string using :doc:`libbson's Legacy Extended JSON `. This function is superseded by :symbol:`bson_as_canonical_extended_json()` and :symbol:`bson_as_relaxed_extended_json()`, which use the same `MongoDB Extended JSON format`_ as all other MongoDB drivers. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_as_legacy_extended_json ... begin :end-before: // bson_as_legacy_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_as_relaxed_extended_json.rst000066400000000000000000000024211511661753600261350ustar00rootroot00000000000000:man_page: bson_as_relaxed_extended_json bson_as_relaxed_extended_json() =============================== Synopsis -------- .. code-block:: c char * bson_as_relaxed_extended_json (const bson_t *bson, size_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``length``: An optional location for the length of the resulting string. Description ----------- :symbol:`bson_as_relaxed_extended_json()` encodes ``bson`` as a UTF-8 string in Relaxed Extended JSON. See `MongoDB Extended JSON format`_ for a description of Extended JSON formats. The caller is responsible for freeing the resulting UTF-8 encoded string by calling :symbol:`bson_free()` with the result. If non-NULL, ``length`` will be set to the length of the result in bytes. Returns ------- If successful, a newly allocated UTF-8 encoded string and ``length`` is set. Upon failure, NULL is returned. Example ------- .. literalinclude:: ../examples/extended-json.c :language: c :start-after: // bson_as_relaxed_extended_json ... begin :end-before: // bson_as_relaxed_extended_json ... end :dedent: 6 .. only:: html .. include:: includes/seealso/bson-as-json.txt .. _MongoDB Extended JSON format: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_ascii_strtoll.rst000066400000000000000000000022331511661753600237710ustar00rootroot00000000000000:man_page: bson_ascii_strtoll bson_ascii_strtoll() ==================== Synopsis -------- .. code-block:: c int64_t bson_ascii_strtoll (const char *str, char **endptr, int base); Parameters ---------- * ``str``: The string to convert. * ``endptr``: Address of the first invalid character of ``str``, or null. * ``base``: The base to use for the conversion. Description ----------- A portable version of ``strtoll()``. Converts a string to a 64-bit signed integer according to the given ``base``, which must be 16, 10, or 8. Leading whitespace will be ignored. If base is 0 is passed in, the base is inferred from the string's leading characters. Base-16 numbers start with "0x" or "0X", base-8 numbers start with "0", base-10 numbers start with a digit from 1 to 9. If ``endptr`` is not NULL, it will be assigned the address of the first invalid character of ``str``, or its null terminating byte if the entire string was valid. If an invalid value is encountered, errno will be set to EINVAL and zero will be returned. If the number is out of range, errno is set to ERANGE and LLONG_MAX or LLONG_MIN is returned. Returns ------- The result of the conversion. mongo-c-driver-2.2.1/src/libbson/doc/bson_check_version.rst000066400000000000000000000011171511661753600237400ustar00rootroot00000000000000:man_page: bson_check_version bson_check_version() ==================== Synopsis -------- .. code-block:: c bool bson_check_version (int required_major, int required_minor, int required_micro); Parameters ---------- * ``required_major``: The minimum major version required. * ``required_minor``: The minimum minor version required. * ``required_micro``: The minimum micro version required. Description ----------- Check at runtime if this release of libbson meets a required version. Returns ------- True if libbson's version is greater than or equal to the required version. mongo-c-driver-2.2.1/src/libbson/doc/bson_compare.rst000066400000000000000000000011351511661753600225440ustar00rootroot00000000000000:man_page: bson_compare bson_compare() ============== Synopsis -------- .. code-block:: c int bson_compare (const bson_t *bson, const bson_t *other); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``other``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_compare()` function shall compare two bson documents for equality. This can be useful in conjunction with _qsort()_. If equal, 0 is returned. .. tip:: This function uses _memcmp()_ internally, so the semantics are the same. Returns ------- less than zero, zero, or greater than zero in ``qsort()`` style. mongo-c-driver-2.2.1/src/libbson/doc/bson_concat.rst000066400000000000000000000010651511661753600223670ustar00rootroot00000000000000:man_page: bson_concat bson_concat() ============= Synopsis -------- .. code-block:: c bool bson_concat (bson_t *dst, const bson_t *src); Parameters ---------- * ``dst``: A :symbol:`bson_t`. * ``src``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_concat()` function shall append the contents of ``src`` to ``dst``. Returns ------- Returns ``true`` if successful; ``false`` if the operation would overflow the maximum document size or another invalid state is detected. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_context_destroy.rst000066400000000000000000000010351511661753600243520ustar00rootroot00000000000000:man_page: bson_context_destroy bson_context_destroy() ====================== Synopsis -------- .. code-block:: c void bson_context_destroy (bson_context_t *context); Parameters ---------- * ``context``: A :symbol:`bson_context_t`. Description ----------- The ``bson_context_destroy()`` function shall release all resources associated with ``context``. Does nothing if ``context`` is NULL. This should be called when you are no longer using a :symbol:`bson_context_t` that you have allocated with :symbol:`bson_context_new()`. mongo-c-driver-2.2.1/src/libbson/doc/bson_context_get_default.rst000066400000000000000000000006441511661753600251510ustar00rootroot00000000000000:man_page: bson_context_get_default bson_context_get_default() ========================== Synopsis -------- .. code-block:: c bson_context_t * bson_context_get_default (void); Returns ------- The ``bson_context_get_default()`` function shall return the default :symbol:`bson_context_t` for the process. This context is created with the flags ``BSON_CONTEXT_THREAD_SAFE`` and ``BSON_CONTEXT_DISABLE_PID_CACHE``.mongo-c-driver-2.2.1/src/libbson/doc/bson_context_new.rst000066400000000000000000000017361511661753600234620ustar00rootroot00000000000000:man_page: bson_context_new bson_context_new() ================== Synopsis -------- .. code-block:: c bson_context_t * bson_context_new (bson_context_flags_t flags); Parameters ---------- * ``flags``: A :symbol:`bson_context_flags_t `. The following ``flags`` may be used: * ``BSON_CONTEXT_NONE`` meaning creating ObjectIDs with this context is not a thread-safe operation. * ``BSON_CONTEXT_DISABLE_PID_CACHE`` meaning creating ObjectIDs will also check if the process has changed by calling ``getpid()`` on every ObjectID generation. The following flags are deprecated and have no effect: - ``BSON_CONTEXT_DISABLE_HOST_CACHE`` - ``BSON_CONTEXT_THREAD_SAFE`` - ``BSON_CONTEXT_USE_TASK_ID`` Description ----------- Creates a new :symbol:`bson_context_t`. This is rarely needed as :symbol:`bson_context_get_default()` serves most use-cases. Returns ------- A newly allocated :symbol:`bson_context_t` that should be freed with :symbol:`bson_context_destroy`. mongo-c-driver-2.2.1/src/libbson/doc/bson_context_t.rst000066400000000000000000000026451511661753600231340ustar00rootroot00000000000000:man_page: bson_context_t bson_context_t ============== BSON OID Generation Context Synopsis -------- .. code-block:: c #include typedef enum { BSON_CONTEXT_NONE = 0, BSON_CONTEXT_DISABLE_PID_CACHE = (1 << 2), } bson_context_flags_t; typedef struct _bson_context_t bson_context_t; bson_context_t * bson_context_get_default (void); bson_context_t * bson_context_new (bson_context_flags_t flags); void bson_context_destroy (bson_context_t *context); Description ----------- The :symbol:`bson_context_t` structure is context for generation of BSON Object IDs. This context allows overriding behavior of generating ObjectIDs. The flags ``BSON_CONTEXT_NONE``, ``BSON_CONTEXT_THREAD_SAFE``, and ``BSON_CONTEXT_DISABLE_PID_CACHE`` are the only ones used. The others have no effect. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_context_destroy bson_context_get_default bson_context_new Example ------- .. code-block:: c #include int main (int argc, char *argv[]) { bson_context_t *ctx = NULL; bson_oid_t oid; /* use default context, via bson_context_get_default() */ bson_oid_init (&oid, NULL); /* specify a local context for additional control */ ctx = bson_context_new (BSON_CONTEXT_NONE); bson_oid_init (&oid, ctx); bson_context_destroy (ctx); return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_copy.rst000066400000000000000000000007701511661753600220740ustar00rootroot00000000000000:man_page: bson_copy bson_copy() =========== Synopsis -------- .. code-block:: c bson_t * bson_copy (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_copy()` function shall copy the contents of a bson document into a new :symbol:`bson_t`. The resulting :symbol:`bson_t` should be freed with :symbol:`bson_destroy()`. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. mongo-c-driver-2.2.1/src/libbson/doc/bson_copy_to.rst000066400000000000000000000006741511661753600226010ustar00rootroot00000000000000:man_page: bson_copy_to bson_copy_to() ============== Synopsis -------- .. code-block:: c void bson_copy_to (const bson_t *src, bson_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_copy_to()` function shall initialize ``dst`` with a copy of the contents of ``src``. ``dst`` *MUST* be an uninitialized :symbol:`bson_t` to avoid leaking memory. mongo-c-driver-2.2.1/src/libbson/doc/bson_copy_to_excluding_noinit.rst000066400000000000000000000026511511661753600262200ustar00rootroot00000000000000:man_page: bson_copy_to_excluding_noinit bson_copy_to_excluding_noinit() =============================== Synopsis -------- .. code-block:: c void bson_copy_to_excluding_noinit (const bson_t *src, bson_t *dst, const char *first_exclude, ...); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. * ``first_exclude``: The first field name to exclude. Description ----------- The :symbol:`bson_copy_to_excluding_noinit()` function shall copy all fields from ``src`` to ``dst`` except those specified by the variadic, NULL terminated list of keys starting from ``first_exclude``. Does **not** call :symbol:`bson_init` on ``dst``. .. warning:: This is generally not needed except in very special situations. Example ------- .. code-block:: c #include int main () { bson_t bson; bson_t bson2; char *str; bson_init (&bson); bson_append_int32 (&bson, "a", 1, 1); bson_append_int32 (&bson, "b", 1, 2); bson_append_int32 (&bson, "c", 1, 2); bson_init (&bson2); bson_copy_to_excluding_noinit (&bson, &bson2, "b", NULL); str = bson_as_relaxed_extended_json (&bson2, NULL); /* Prints * { "a" : 1, "c" : 2 } */ printf ("%s\n", str); bson_free (str); bson_destroy (&bson); bson_destroy (&bson2); } mongo-c-driver-2.2.1/src/libbson/doc/bson_copy_to_excluding_noinit_va.rst000066400000000000000000000015161511661753600267050ustar00rootroot00000000000000:man_page: bson_copy_to_excluding_noinit_va bson_copy_to_excluding_noinit_va() ================================== Synopsis -------- .. code-block:: c void bson_copy_to_excluding_noinit_va (const bson_t *src, bson_t *dst, const char *first_exclude, va_list args); Parameters ---------- * ``src``: A :symbol:`bson_t`. * ``dst``: A :symbol:`bson_t`. * ``first_exclude``: The first field name to exclude. * ``args``: A va_list. Description ----------- The :symbol:`bson_copy_to_excluding_noinit_va()` function shall copy all fields from ``src`` to ``dst`` except those specified by ``first_exclude`` and ``args``. Does **not** call :symbol:`bson_init` on ``dst``. .. seealso:: | :symbol:`bson_copy_to_excluding_noinit` mongo-c-driver-2.2.1/src/libbson/doc/bson_count_keys.rst000066400000000000000000000005701511661753600233030ustar00rootroot00000000000000:man_page: bson_count_keys bson_count_keys() ================= Synopsis -------- .. code-block:: c uint32_t bson_count_keys (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_count_keys()` function shall count the number of elements within ``bson``. Returns ------- A positive integer or zero. mongo-c-driver-2.2.1/src/libbson/doc/bson_decimal128_from_string.rst000066400000000000000000000015371511661753600253660ustar00rootroot00000000000000:man_page: bson_decimal128_from_string bson_decimal128_from_string() ============================= Synopsis -------- .. code-block:: c bool bson_decimal128_from_string (const char *string, bson_decimal128_t *dec); Parameters ---------- * ``string``: A string containing ASCII encoded Decimal128. * ``dec``: A :symbol:`bson_decimal128_t`. Description ----------- Parses the string containing ascii encoded Decimal128 and initialize the bytes in ``dec``. See the `Decimal128 specification `_ for the exact string format. Returns ------- Returns ``true`` if valid Decimal128 string was provided, otherwise ``false`` and ``dec`` will be set to ``NaN``. Example ------- .. code-block:: c bson_decimal128_t dec; bson_decimal128_from_string ("1.00", &dec); mongo-c-driver-2.2.1/src/libbson/doc/bson_decimal128_from_string_w_len.rst000066400000000000000000000021461511661753600265470ustar00rootroot00000000000000:man_page: bson_decimal128_from_string_w_len bson_decimal128_from_string_w_len() =================================== Synopsis -------- .. code-block:: c bool bson_decimal128_from_string_w_len (const char *string, int len, bson_decimal128_t *dec); Parameters ---------- * ``string``: A string containing ASCII encoded Decimal128. * ``len``: The length of ``string`` in bytes, or -1 meaning the string is null-terminated. * ``dec``: A :symbol:`bson_decimal128_t`. Description ----------- Parses the string containing ascii encoded Decimal128 and initialize the bytes in ``dec``. See the `Decimal128 specification `_ for the exact string format. Returns ------- Returns ``true`` if valid Decimal128 string was provided, otherwise ``false`` and ``dec`` will be set to ``NaN``. Example ------- .. code-block:: c bson_decimal128_t dec; bson_decimal128_from_string_w_len ("1.00", 4, &dec); bson_decimal128_from_string_w_len ("1.00", -1, &dec); mongo-c-driver-2.2.1/src/libbson/doc/bson_decimal128_t.rst000066400000000000000000000031371511661753600232760ustar00rootroot00000000000000:man_page: bson_decimal128_t bson_decimal128_t ================= BSON Decimal128 Abstraction Synopsis -------- .. code-block:: c #include #define BSON_DECIMAL128_STRING 43 #define BSON_DECIMAL128_INF "Infinity" #define BSON_DECIMAL128_NAN "NaN" typedef struct { #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN uint64_t low; uint64_t high; #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN uint64_t high; uint64_t low; #endif } bson_decimal128_t; Description ----------- The :symbol:`bson_decimal128_t` structure represents the IEEE-754 Decimal128 data type. The type ``bson_decimal128_t`` is an aggregate that contains two ``uint64_t``\ s, named ``high`` and ``low``. The declaration and layout order between them depends on the endian order of the target platform: ``low`` will always correspond to the low-order bits of the Decimal128 object, while ``high`` corresponds to the high-order bits. The ``bson_decimal128_t`` always has a size of sixteen (``16``), and can be bit-cast to/from a ``_Decimal128``. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_decimal128_from_string bson_decimal128_from_string_w_len bson_decimal128_to_string Example ------- .. code-block:: c #include #include int main (int argc, char *argv[]) { char string[BSON_DECIMAL128_STRING]; bson_decimal128_t decimal128; bson_decimal128_from_string ("100.00", &decimal128); bson_decimal128_to_string (&decimal128, string); printf ("Decimal128 value: %s\n", string); return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_decimal128_to_string.rst000066400000000000000000000011011511661753600250300ustar00rootroot00000000000000:man_page: bson_decimal128_to_string bson_decimal128_to_string() =========================== Synopsis -------- .. code-block:: c void bson_decimal128_to_string (const bson_decimal128_t *dec, char *str); Parameters ---------- * ``dec``: A :symbol:`bson_decimal128_t`. * ``str``: A location of length BSON_DECIMAL128_STRING for the resulting string. Description ----------- Converts ``dec`` into a printable string. Example ------- .. code-block:: c char decimal128_string[BSON_DECIMAL128_STRING]; bson_decimal128_to_string (&decimal128t, decimal128_string); mongo-c-driver-2.2.1/src/libbson/doc/bson_destroy.rst000066400000000000000000000007001511661753600226040ustar00rootroot00000000000000:man_page: bson_destroy bson_destroy() ============== Synopsis -------- .. code-block:: c void bson_destroy (bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_destroy()` function shall free an allocated :symbol:`bson_t` structure. Does nothing if ``bson`` is NULL. This function should always be called when you are done with a :symbol:`bson_t` unless otherwise specified. mongo-c-driver-2.2.1/src/libbson/doc/bson_destroy_with_steal.rst000066400000000000000000000024671511661753600250430ustar00rootroot00000000000000:man_page: bson_destroy_with_steal bson_destroy_with_steal() ========================= Synopsis -------- .. code-block:: c uint8_t * bson_destroy_with_steal (bson_t *bson, bool steal, uint32_t *length); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``steal``: A bool indicating if the underlying buffer should be stolen. * ``length``: A location for storing the resulting buffer length. Description ----------- The :symbol:`bson_destroy_with_steal()` function shall destroy a :symbol:`bson_t` structure but return the underlying buffer instead of freeing it. If steal is false, this is equivalent to calling bson_destroy(). It is a programming error to call this function on a :symbol:`bson_t` that is not a top-level :symbol:`bson_t`, such as those initialized with :symbol:`bson_append_document_begin()`, :symbol:`bson_append_array_begin()`, and :symbol:`bson_writer_begin()`. Returns ------- :symbol:`bson_destroy_with_steal()` shall return a buffer containing the contents of the :symbol:`bson_t` if ``steal`` is non-zero. This should be freed with :symbol:`bson_free()` when no longer in use. ``length`` will be set to the length of the bson document if non-NULL. .. seealso:: | :symbol:`bson_steal`, a higher-level function that efficiently transfers the contents of one :symbol:`bson_t` to another. mongo-c-driver-2.2.1/src/libbson/doc/bson_equal.rst000066400000000000000000000006221511661753600222250ustar00rootroot00000000000000:man_page: bson_equal bson_equal() ============ Synopsis -------- .. code-block:: c bool bson_equal (const bson_t *bson, const bson_t *other); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``other``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_equal()` function shall return true if both documents are equal. Returns ------- true if both documents are equal. mongo-c-driver-2.2.1/src/libbson/doc/bson_error_clear.rst000066400000000000000000000007271511661753600234230ustar00rootroot00000000000000:man_page: bson_error_clear bson_error_clear() ================== Synopsis -------- .. code-block:: c void bson_error_clear (bson_error_t *error); Parameters ---------- * ``error``: A pointer to storage for a :symbol:`bson_error_t`, or NULL. Description ----------- If given a non-null pointer to a :symbol:`bson_error_t`, this function will clear any error value that is stored in the pointed-to object. If given a null pointer, this function has no effect. mongo-c-driver-2.2.1/src/libbson/doc/bson_error_reset.rst000066400000000000000000000013201511661753600234450ustar00rootroot00000000000000:man_page: bson_error_reset bson_error_reset() ================== Synopsis -------- .. code-block:: c #define bson_error_reset(ErrorPointer) Parameters ---------- * ``ErrorPointer``: An l-value expression of type ``bson_error_t*``. May be a null pointer. Description ----------- This function-like macro modifies a pointer to :symbol:`bson_error_t` to be non-null, and clears any contained value using :symbol:`bson_error_clear`. If the given pointer object is null, then the pointer is updated to point to a local anonymous :symbol:`bson_error_t` object. After the evaluation of this macro, it is guaranteed that the given pointer is non-null. .. important:: This function-like macro is not valid in C++! mongo-c-driver-2.2.1/src/libbson/doc/bson_error_t.rst000066400000000000000000000016141511661753600225740ustar00rootroot00000000000000:man_page: bson_error_t bson_error_t ============ BSON Error Encapsulation Synopsis -------- .. code-block:: c #include typedef struct { uint32_t domain; uint32_t code; char message[504]; } bson_error_t; Description ----------- The :symbol:`bson_error_t` structure is used as an out-parameter to pass error information to the caller. It should be stack-allocated and does not requiring freeing. See `Handling Errors `_. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_set_error bson_strerror_r bson_error_clear bson_error_reset Example ------- .. code-block:: c bson_reader_t *reader; bson_error_t error; reader = bson_reader_new_from_file ("dump.bson", &error); if (!reader) { fprintf ( stderr, "ERROR: %d.%d: %s\n", error.domain, error.code, error.message); } mongo-c-driver-2.2.1/src/libbson/doc/bson_free.rst000066400000000000000000000005251511661753600220410ustar00rootroot00000000000000:man_page: bson_free bson_free() =========== Synopsis -------- .. code-block:: c void bson_free (void *mem); Parameters ---------- * ``mem``: A memory region. Description ----------- This function shall free the memory supplied by ``mem``. This should be used by functions that require you free the result with ``bson_free()``. mongo-c-driver-2.2.1/src/libbson/doc/bson_get_data.rst000066400000000000000000000010001511661753600226550ustar00rootroot00000000000000:man_page: bson_get_data bson_get_data() =============== Synopsis -------- .. code-block:: c const uint8_t * bson_get_data (const bson_t *bson); Parameters ---------- * ``bson``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_get_data()` function shall return the raw buffer of a bson document. This can be used in conjunction with the ``len`` property of a :symbol:`bson_t` if you want to copy the raw buffer around. Returns ------- A buffer which should not be modified or freed. mongo-c-driver-2.2.1/src/libbson/doc/bson_get_major_version.rst000066400000000000000000000005241511661753600246330ustar00rootroot00000000000000:man_page: bson_get_major_version bson_get_major_version() ======================== Synopsis -------- .. code-block:: c int bson_get_major_version (void); Description ----------- Get the first number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MAJOR_VERSION`` when Libbson was compiled. mongo-c-driver-2.2.1/src/libbson/doc/bson_get_micro_version.rst000066400000000000000000000005241511661753600246340ustar00rootroot00000000000000:man_page: bson_get_micro_version bson_get_micro_version() ======================== Synopsis -------- .. code-block:: c int bson_get_micro_version (void); Description ----------- Get the third number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MICRO_VERSION`` when Libbson was compiled. mongo-c-driver-2.2.1/src/libbson/doc/bson_get_minor_version.rst000066400000000000000000000005251511661753600246500ustar00rootroot00000000000000:man_page: bson_get_minor_version bson_get_minor_version() ======================== Synopsis -------- .. code-block:: c int bson_get_minor_version (void); Description ----------- Get the middle number in libbson's MAJOR.MINOR.MICRO release version. Returns ------- The value of ``BSON_MINOR_VERSION`` when Libbson was compiled. mongo-c-driver-2.2.1/src/libbson/doc/bson_get_monotonic_time.rst000066400000000000000000000011141511661753600247750ustar00rootroot00000000000000:man_page: bson_get_monotonic_time System Clock ============ BSON Clock Abstraction Synopsis -------- .. code-block:: c int64_t bson_get_monotonic_time (void); int bson_gettimeofday (struct timeval *tv); Description ----------- The clock abstraction in Libbson provides a cross-platform way to handle timeouts within the BSON library. It abstracts the differences in implementations of ``gettimeofday()`` as well as providing a monotonic (incrementing only) clock in microseconds. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongo-c-driver-2.2.1/src/libbson/doc/bson_get_version.rst000066400000000000000000000005061511661753600234430ustar00rootroot00000000000000:man_page: bson_get_version bson_get_version() ================== Synopsis -------- .. code-block:: c const char * bson_get_version (void); Description ----------- A string representation of Libbson's version, formatted something like "1.2.3" or "1.2.3-pre". Returns ------- A string you must not modify or free. mongo-c-driver-2.2.1/src/libbson/doc/bson_has_field.rst000066400000000000000000000007661511661753600230450ustar00rootroot00000000000000:man_page: bson_has_field bson_has_field() ================ Synopsis -------- .. code-block:: c bool bson_has_field (const bson_t *bson, const char *key); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``key``: A string containing the name of the field to check for. Description ----------- Checks to see if key contains an element named ``key``. This also accepts "dotkey" notation such as "a.b.c.d". Returns ------- true if ``key`` was found within ``bson``; otherwise false. mongo-c-driver-2.2.1/src/libbson/doc/bson_init.rst000066400000000000000000000006701511661753600220640ustar00rootroot00000000000000:man_page: bson_init bson_init() =========== Synopsis -------- .. code-block:: c void bson_init (bson_t *b); Parameters ---------- * ``b``: A :symbol:`bson_t`. Description ----------- The :symbol:`bson_init()` function shall initialize a :symbol:`bson_t` that is placed on the stack. This is equivalent to initializing a :symbol:`bson_t` to ``BSON_INITIALIZER``. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_init_from_json.rst000066400000000000000000000034601511661753600241400ustar00rootroot00000000000000:man_page: bson_init_from_json bson_init_from_json() ===================== Synopsis -------- .. code-block:: c bool bson_init_from_json (bson_t *bson, const char *data, ssize_t len, bson_error_t *error); Parameters ---------- * ``bson``: Pointer to an uninitialized :symbol:`bson_t`. * ``data``: A UTF-8 encoded string containing valid JSON. * ``len``: The length of ``data`` in bytes excluding a trailing ``\0`` or -1 to determine the length with ``strlen()``. * ``error``: An optional location for a :symbol:`bson_error_t`. Description ----------- The ``bson_init_from_json()`` function will initialize a new :symbol:`bson_t` by parsing the JSON found in ``data``. Only a single JSON object may exist in ``data`` or an error will be set and false returned. ``data`` should be in `MongoDB Extended JSON `_ format. Deprecated behavior ------------------- If there are multiple comma-separated JSONs in ``data``, the keys from all JSONs are merged in the returned BSON. For example, ``{"a": 1},{"b": 2}`` is parsed as ``{"a": 1, "b": 2}``. If the first character encountered after the last valid JSON object is ``{``, all following characters are ignored and no error is set. Otherwise, an error will be set and NULL returned. This deprecated behavior is subject to change in a future release. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if valid JSON was parsed, otherwise ``false`` and ``error`` is set. On success, ``bson`` is initialized and must be freed with :symbol:`bson_destroy`, otherwise ``bson`` is invalid. .. only:: html .. include:: includes/seealso/create-bson.txt .. include:: includes/seealso/json.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_init_static.rst000066400000000000000000000016501511661753600234320ustar00rootroot00000000000000:man_page: bson_init_static bson_init_static() ================== Synopsis -------- .. code-block:: c bool bson_init_static (bson_t *b, const uint8_t *data, size_t length); Parameters ---------- * ``b``: A :symbol:`bson_t`. * ``data``: A buffer to initialize with. * ``length``: The length of ``data`` in bytes. Description ----------- The :symbol:`bson_init_static()` function shall initialize a read-only :symbol:`bson_t` on the stack using the data provided. No copies of the data will be made and therefore must remain valid for the lifetime of the :symbol:`bson_t`. The resulting `bson_t` has internal references and therefore must not be copied to avoid dangling pointers in the copy. Returns ------- Returns ``true`` if :symbol:`bson_t` was successfully initialized, otherwise ``false``. The function can fail if ``data`` or ``length`` are invalid. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_isspace.rst000066400000000000000000000007661511661753600225560ustar00rootroot00000000000000:man_page: bson_isspace bson_isspace() ============== Synopsis -------- .. code-block:: c bool bson_isspace (int c); Parameters ---------- * ``c``: A character. Description ----------- A safer alternative to ``isspace`` with additional bounds checking. It is equivalent to ``isspace``, excepts always returns false if ``c`` is out of the inclusive bounds [-1, 255]. Returns ------- A boolean indicating if the ``c`` is considered white-space (as determined by the ``isspace`` function). mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_array.rst000066400000000000000000000013761511661753600232660ustar00rootroot00000000000000:man_page: bson_iter_array bson_iter_array() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_ARRAY(iter) (bson_iter_type ((iter)) == BSON_TYPE_ARRAY) void bson_iter_array (const bson_iter_t *iter, uint32_t *array_len, const uint8_t **array); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``array_len``: A location for the buffer length. * ``array``: A location for the immutable buffer. Description ----------- The ``bson_iter_array()`` function shall retrieve the raw buffer of a sub-array from ``iter``. ``iter`` *MUST* be on an element that is of type BSON_TYPE_ARRAY. This can be verified with :symbol:`bson_iter_type()` or the ``BSON_ITER_HOLDS_ARRAY()`` macro. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_as_bool.rst000066400000000000000000000011741511661753600235620ustar00rootroot00000000000000:man_page: bson_iter_as_bool bson_iter_as_bool() =================== Synopsis -------- .. code-block:: c bool bson_iter_as_bool (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the current field as if it were a boolean. ``bson_iter_as_bool()`` currently knows how to determine a boolean value from the following types: * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 * BSON_TYPE_NULL * BSON_TYPE_UNDEFINED * BSON_TYPE_UTF8 BSON_TYPE_UTF8 will always equate to ``true``. Returns ------- true if the field equates to non-zero. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_as_double.rst000066400000000000000000000010261511661753600240750ustar00rootroot00000000000000:man_page: bson_iter_as_double bson_iter_as_double() ===================== Synopsis -------- .. code-block:: c double bson_iter_as_double (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the current field as if it were a double. ``bson_iter_as_double()`` will cast the following types to double * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 Any other value will return 0. Returns ------- The value type casted to double. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_as_int64.rst000066400000000000000000000010351511661753600235670ustar00rootroot00000000000000:man_page: bson_iter_as_int64 bson_iter_as_int64() ==================== Synopsis -------- .. code-block:: c int64_t bson_iter_as_int64 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_as_int64()`` function shall return the contents of the current element as if it were a BSON_TYPE_INT64 element. The currently supported casts include: * BSON_TYPE_BOOL * BSON_TYPE_DOUBLE * BSON_TYPE_INT32 * BSON_TYPE_INT64 Returns ------- A 64-bit signed integer. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_binary.rst000066400000000000000000000021431511661753600234250ustar00rootroot00000000000000:man_page: bson_iter_binary bson_iter_binary() ================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_BINARY(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_BINARY) void bson_iter_binary (const bson_iter_t *iter, bson_subtype_t *subtype, uint32_t *binary_len, const uint8_t **binary); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``subtype``: A location for a :symbol:`bson_subtype_t` or NULL. * ``binary_len``: A location for the length of ``binary``. * ``binary``: A location for a pointer to the immutable buffer. Description ----------- This function shall return the binary data of a BSON_TYPE_BINARY element. It is a programming error to call this function on a field that is not of type BSON_TYPE_BINARY. You can check this with the BSON_ITER_HOLDS_BINARY() macro or :symbol:`bson_iter_type()`. The buffer that ``binary`` points to is only valid until the iterator's :symbol:`bson_t` is modified or freed. .. seealso:: | :symbol:`bson_iter_binary_equal` | :symbol:`bson_iter_binary_subtype` mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_binary_equal.rst000066400000000000000000000012711511661753600246150ustar00rootroot00000000000000:man_page: bson_iter_binary_equal bson_iter_binary_equal() ======================== Synopsis -------- .. code-block:: c bool bson_iter_binary_equal (const bson_iter_t *iter_a, const bson_iter_t *iter_b); Parameters ---------- * ``iter_a``: A :symbol:`bson_iter_t`. * ``iter_b``: A :symbol:`bson_iter_t`. Description ----------- Compare two BSON_TYPE_BINARY fields for exact equality. This is the preferred way to compare :doc:`binary_vector` values for equality. Returns ------- ``true`` if both iterators point to BSON_TYPE_BINARY fields with identical subtype and contents. ``false`` if there is any difference in subtype, length, or content, or if the fields are not binary type.mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_binary_subtype.rst000066400000000000000000000011601511661753600251760ustar00rootroot00000000000000:man_page: bson_iter_binary_subtype bson_iter_binary_subtype() ========================== Synopsis -------- .. code-block:: c bson_subtype_t bson_iter_binary_subtype (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- This function shall return the subtype of a BSON_TYPE_BINARY element. It is a programming error to call this function on a field that is not of type BSON_TYPE_BINARY. You can check this with the BSON_ITER_HOLDS_BINARY() macro or :symbol:`bson_iter_type()`. Equivalent to the ``subtype`` output parameter of :symbol:`bson_iter_binary`. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_bool.rst000066400000000000000000000011721511661753600230750ustar00rootroot00000000000000:man_page: bson_iter_bool bson_iter_bool() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_BOOL(iter) (bson_iter_type ((iter)) == BSON_TYPE_BOOL) bool bson_iter_bool (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_bool()`` function shall return the boolean value of a BSON_TYPE_BOOL element. It is a programming error to call this function on an element other than BSON_TYPE_BOOL. You can check this with :symbol:`bson_iter_type()` or ``BSON_ITER_HOLDS_BOOL()``. Returns ------- Either ``true`` or ``false``. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_code.rst000066400000000000000000000013101511661753600230460ustar00rootroot00000000000000:man_page: bson_iter_code bson_iter_code() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_CODE(iter) (bson_iter_type ((iter)) == BSON_TYPE_CODE) const char * bson_iter_code (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: A location for the length of the UTF-8 encoded string or NULL. Description ----------- This function returns the contents of a BSON_TYPE_CODE field. The length of the string is stored in ``length`` if non-NULL. It is invalid to call this function on a field that is not of type BSON_TYPE_CODE. Returns ------- A UTF-8 encoded string which should not be modified or freed. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_codewscope.rst000066400000000000000000000021341511661753600242740ustar00rootroot00000000000000:man_page: bson_iter_codewscope bson_iter_codewscope() ====================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_CODEWSCOPE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_CODEWSCOPE) const char * bson_iter_codewscope (const bson_iter_t *iter, uint32_t *length, uint32_t *scope_len, const uint8_t **scope); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the resulting UTF-8 encoded string. * ``scope_len``: A optional location for the length of ``scope``. * ``scope``: An optional location to store the immutable raw scope BSON document. Description ----------- The ``bson_iter_codewscope()`` function acts similar to :symbol:`bson_iter_code()` except for BSON_TYPE_CODEWSCOPE elements. It also will provide a pointer to the buffer for scope, which can be loaded into a :symbol:`bson_t` using :symbol:`bson_init_static()`. Returns ------- An UTF-8 encoded string containing the JavaScript code which should not be modified or freed. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_date_time.rst000066400000000000000000000011321511661753600240710ustar00rootroot00000000000000:man_page: bson_iter_date_time bson_iter_date_time() ===================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DATE_TIME(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DATE_TIME) int64_t bson_iter_date_time (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The bson_iter_date_time() function shall return the number of milliseconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element. Returns ------- A 64-bit integer containing the number of milliseconds since the UNIX epoch. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_dbpointer.rst000066400000000000000000000013621511661753600241310ustar00rootroot00000000000000:man_page: bson_iter_dbpointer bson_iter_dbpointer() ===================== Synopsis -------- .. code-block:: c void bson_iter_dbpointer (const bson_iter_t *iter, uint32_t *collection_len, const char **collection, const bson_oid_t **oid); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``collection_len``: A location for the length of the collection name. * ``collection``: A location for the collection name.. * ``oid``: A location for a :symbol:`bson_oid_t`. Description ----------- Fetches the contents of a BSON_TYPE_DBPOINTER element. .. warning:: The BSON_TYPE_DBPOINTER field type is deprecated by the BSON spec and should not be used in new code. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_decimal128.rst000066400000000000000000000013011511661753600237650ustar00rootroot00000000000000:man_page: bson_iter_decimal128 bson_iter_decimal128() ====================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DECIMAL128(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DECIMAL128) bool bson_iter_decimal128 (const bson_iter_t *iter, /* IN */ bson_decimal128_t *dec); /* OUT */ Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``dec``: A location for a :symbol:`bson_decimal128_t`. Description ----------- Fetches the value from a BSON_TYPE_DECIMAL128 field. You should verify that this is a BSON_TYPE_DECIMAL128 field before calling this function. Returns ------- true if type was BSON_TYPE_DECIMAL128, otherwise false. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_document.rst000066400000000000000000000015061511661753600237610ustar00rootroot00000000000000:man_page: bson_iter_document bson_iter_document() ==================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DOCUMENT(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOCUMENT) void bson_iter_document (const bson_iter_t *iter, uint32_t *document_len, const uint8_t **document); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``document_len``: A location for the length of the document in bytes. * ``document``: A location for the document buffer. Description ----------- The ``bson_iter_document()`` function shall retrieve the raw buffer of a sub-document from ``iter``. ``iter`` *MUST* be on an element that is of type BSON_TYPE_DOCUMENT. This can be verified with :symbol:`bson_iter_type()` or the ``BSON_ITER_HOLDS_DOCUMENT()`` macro. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_double.rst000066400000000000000000000006441511661753600234170ustar00rootroot00000000000000:man_page: bson_iter_double bson_iter_double() ================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_DOUBLE(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_DOUBLE) double bson_iter_double (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the contents of a BSON_TYPE_DOUBLE field. Returns ------- A double. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_dup_utf8.rst000066400000000000000000000010621511661753600236760ustar00rootroot00000000000000:man_page: bson_iter_dup_utf8 bson_iter_dup_utf8() ==================== Synopsis -------- .. code-block:: c char * bson_iter_dup_utf8 (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the UTF-8 encoded string. Description ----------- This function is similar to :symbol:`bson_iter_utf8()` except that it calls :symbol:`bson_strndup()` on the result. Returns ------- A newly allocated string that should be freed with :symbol:`bson_free()`. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_find.rst000066400000000000000000000013501511661753600230600ustar00rootroot00000000000000:man_page: bson_iter_find bson_iter_find() ================ Synopsis -------- .. code-block:: c bool bson_iter_find (bson_iter_t *iter, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: A string containing the requested key. Description ----------- The ``bson_iter_find()`` function shall advance ``iter`` to the first element named ``key`` or exhaust all elements of ``iter``. If ``iter`` is exhausted, false is returned and ``iter`` should be considered invalid. ``key`` is case-sensitive. For a case-folded version, see :symbol:`bson_iter_find_case()`. Returns ------- true is returned if the requested key was found. If not, ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_find_case.rst000066400000000000000000000011021511661753600240460ustar00rootroot00000000000000:man_page: bson_iter_find_case bson_iter_find_case() ===================== Synopsis -------- .. code-block:: c bool bson_iter_find_case (bson_iter_t *iter, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: An ASCII string containing the field to locate. Description ----------- Advances ``iter`` to the first element matching the name of ``key`` or exhausting all elements. ``key`` is not case-sensitive. The keys will be case-folded to determine a match using the current locale. Returns ------- true if ``key`` was found. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_find_descendant.rst000066400000000000000000000016161511661753600252550ustar00rootroot00000000000000:man_page: bson_iter_find_descendant bson_iter_find_descendant() =========================== Synopsis -------- .. code-block:: c bool bson_iter_find_descendant (bson_iter_t *iter, const char *dotkey, bson_iter_t *descendant); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``dotkey``: A dot-notation key like ``"a.b.c.d"``. * ``descendant``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_find_descendant()` function shall follow standard MongoDB dot notation to recurse into subdocuments. ``descendant`` will be initialized and advanced to the descendant. If false is returned, both ``iter`` and ``descendant`` should be considered invalid. Returns ------- true is returned if the requested key was found. If not, false is returned and ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_find_w_len.rst000066400000000000000000000015241511661753600242470ustar00rootroot00000000000000:man_page: bson_iter_find_w_len bson_iter_find_w_len() ====================== Synopsis -------- .. code-block:: c bool bson_iter_find_w_len (bson_iter_t *iter, const char *key, int keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``key``: A string containing the requested key. * ``keylen``: An integer indicating the length of the key string. Description ----------- The ``bson_iter_find_w_len()`` function shall advance ``iter`` to the first element named ``key`` or exhaust all elements of ``iter``. If ``iter`` is exhausted, false is returned and ``iter`` should be considered invalid. ``key`` is case-sensitive. For a case-folded version, see :symbol:`bson_iter_find_case()`. Returns ------- true is returned if the requested key was found. If not, ``iter`` was exhausted and should now be considered invalid. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init.rst000066400000000000000000000030701511661753600231040ustar00rootroot00000000000000:man_page: bson_iter_init bson_iter_init() ================ Synopsis -------- .. code-block:: c bool bson_iter_init (bson_iter_t *iter, const bson_t *bson); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. Description ----------- The ``bson_iter_init()`` function shall initialize ``iter`` to iterate upon the BSON document ``bson``. Upon initialization, ``iter`` is placed before the first element. Callers must call :symbol:`bson_iter_next()`, :symbol:`bson_iter_find()`, or :symbol:`bson_iter_find_case()` to advance to an element. Returns ------- Returns true if the iter was successfully initialized. Example ------- .. code-block:: c static void print_doc_id (const bson_t *doc) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init (&iter, doc) && bson_iter_find (&iter, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } /* alternatively */ static void print_doc_id (const bson_t *doc) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init_find (&iter, doc, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init_find.rst000066400000000000000000000010021511661753600240750ustar00rootroot00000000000000:man_page: bson_iter_init_find bson_iter_init_find() ===================== Synopsis -------- .. code-block:: c bool bson_iter_init_find (bson_iter_t *iter, const bson_t *bson, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. Description ----------- This function is identical to ``(bson_iter_init() && bson_iter_find())``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init_find_case.rst000066400000000000000000000011211511661753600250720ustar00rootroot00000000000000:man_page: bson_iter_init_find_case bson_iter_init_find_case() ========================== Synopsis -------- .. code-block:: c bool bson_iter_init_find_case (bson_iter_t *iter, const bson_t *bson, const char *key); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. Description ----------- This function is identical to ``bson_iter_init() && bson_iter_find_case()``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init_find_w_len.rst000066400000000000000000000013061511661753600252700ustar00rootroot00000000000000:man_page: bson_iter_init_find_w_len bson_iter_init_find_w_len() =========================== Synopsis -------- .. code-block:: c bool bson_iter_init_find_w_len (bson_iter_t *iter, const bson_t *bson, const char *key, int keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``bson``: A :symbol:`bson_t`. * ``key``: A key to locate after initializing the iter. * ``keylen``: An integer indicating the length of the key string. Description ----------- This function is identical to ``(bson_iter_init() && bson_iter_find_w_len())``. .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init_from_data.rst000066400000000000000000000025271511661753600251260ustar00rootroot00000000000000:man_page: bson_iter_init_from_data bson_iter_init_from_data() ========================== Synopsis -------- .. code-block:: c bool bson_iter_init_from_data (bson_iter_t *iter, const uint8_t *data, size_t length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``data``: A buffer to initialize with. * ``length``: The length of ``data`` in bytes. Description ----------- The ``bson_iter_init_from_data()`` function shall initialize ``iter`` to iterate upon the buffer ``data``, which must contain a BSON document. Upon initialization, ``iter`` is placed before the first element. Callers must call :symbol:`bson_iter_next()`, :symbol:`bson_iter_find()`, or :symbol:`bson_iter_find_case()` to advance to an element. Returns ------- Returns true if the iter was successfully initialized. Example ------- .. code-block:: c static void print_doc_id (const uint8_t *data, size_t length) { bson_iter_t iter; bson_oid_t oid; char oidstr[25]; if (bson_iter_init_from_data (&iter, data, length) && bson_iter_find (&iter, "_id") && BSON_ITER_HOLDS_OID (&iter)) { bson_iter_oid (&iter, &oid); bson_oid_to_string (&oid, oidstr); printf ("%s\n", oidstr); } else { printf ("Document is missing _id.\n"); } } .. only:: html .. include:: includes/seealso/iter-init.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_init_from_data_at_offset.rst000066400000000000000000000037211511661753600271550ustar00rootroot00000000000000:man_page: bson_iter_init_from_data_at_offset bson_iter_init_from_data_at_offset() ==================================== Synopsis -------- .. code-block:: c bool bson_iter_init_from_data_at_offset (bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``data``: A buffer to initialize with. This is not validated. * ``length``: The length of ``data`` in bytes. This is not validated. * ``offset``: The offset of the field to start iterating. This is not validated. This should be an offset previously obtained from :symbol:`bson_iter_offset()`. * ``keylen``: The string length of the key of the field to start iterating. This is not validated. This should be a length previously obtained from :symbol:`bson_iter_key_len()`. Description ----------- Creates a :symbol:`bson_iter_t` and starts iteration on a field at the offset. :symbol:`bson_iter_init_from_data_at_offset` is useful for situations where the progress of a :symbol:`bson_iter_t` must be saved and restored without relying on the :symbol:`bson_iter_t` data layout. Saving the progress could be accomplished by: - Saving the current field's key length with :symbol:`bson_iter_key_len()` - Saving the current offset with :symbol:`bson_iter_offset()` - Saving the data pointer of the iterated :symbol:`bson_t` with :symbol:`bson_get_data()` - Saving the data length of the iterated :symbol:`bson_t` with the ``len`` struct field Then later, these saved values can be passed to :symbol:`bson_iter_init_from_data_at_offset()` to reconstruct the :symbol:`bson_iter_t` in constant time. Returns ------- Returns true if the iter was successfully initialized. .. seealso:: | :symbol:`bson_iter_key_len()` | :symbol:`bson_iter_offset()` | :symbol:`bson_get_data()` mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_int32.rst000066400000000000000000000007721511661753600231060ustar00rootroot00000000000000:man_page: bson_iter_int32 bson_iter_int32() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_INT32(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT32) int32_t bson_iter_int32 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value from a BSON_TYPE_INT32 element. You should verify that the field is a BSON_TYPE_INT32 field before calling this function. Returns ------- A 32-bit integer. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_int64.rst000066400000000000000000000007631511661753600231130ustar00rootroot00000000000000:man_page: bson_iter_int64 bson_iter_int64() ================= Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_INT64(iter) (bson_iter_type ((iter)) == BSON_TYPE_INT64) int64_t bson_iter_int64 (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value from a BSON_TYPE_INT64 field. You should verify that this is a BSON_TYPE_INT64 field before calling this function. Returns ------- A 64-bit integer. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_key.rst000066400000000000000000000007301511661753600227310ustar00rootroot00000000000000:man_page: bson_iter_key bson_iter_key() =============== Synopsis -------- .. code-block:: c const char * bson_iter_key (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the key for the current element observed by ``iter``. Returns ------- A string which should not be modified or freed. .. seealso:: | :symbol:`bson_iter_key_len()` to retrieve the length of the key in constant time. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_key_len.rst000066400000000000000000000011171511661753600235670ustar00rootroot00000000000000:man_page: bson_iter_key_len bson_iter_key_len() =================== Synopsis -------- .. code-block:: c uint32_t bson_iter_key_len (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the length of the key for the current element observed by ``iter``. This is a constant time computation, and therefore faster than calling ``strlen()`` on a key returned by :symbol:`bson_iter_key()`. Returns ------- An integer representing the key length. .. seealso:: | :symbol:`bson_iter_key()` to retrieve current key. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_next.rst000066400000000000000000000010071511661753600231150ustar00rootroot00000000000000:man_page: bson_iter_next bson_iter_next() ================ Synopsis -------- .. code-block:: c bool bson_iter_next (bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Advances ``iter`` to the next element in the document. Returns ------- true if ``iter`` was advanced. Returns false if ``iter`` has passed the last element in the document or encountered invalid BSON. It is a programming error to use ``iter`` after this function has returned false. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_offset.rst000066400000000000000000000010611511661753600234250ustar00rootroot00000000000000:man_page: bson_iter_offset bson_iter_offset() ================== Synopsis -------- .. code-block:: c uint32_t bson_iter_offset (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the offset for the current element observed by ``iter``. Returns ------- An unsigned integer representing the offset in the BSON data of the current element. .. seealso:: | :symbol:`bson_iter_init_from_data_at_offset()` to use this offset to reconstruct a :symbol:`bson_iter_t` in constant time. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_oid.rst000066400000000000000000000010551511661753600227150ustar00rootroot00000000000000:man_page: bson_iter_oid bson_iter_oid() =============== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_OID(iter) (bson_iter_type ((iter)) == BSON_TYPE_OID) const bson_oid_t * bson_iter_oid (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the :symbol:`bson_oid_t` for a BSON_TYPE_OID element. You should verify it is an element of type BSON_TYPE_OID before calling this function. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_binary.rst000066400000000000000000000021221511661753600255300ustar00rootroot00000000000000:man_page: bson_iter_overwrite_binary bson_iter_overwrite_binary() ============================ Synopsis -------- .. code-block:: c void bson_iter_overwrite_binary (bson_iter_t *iter, bson_subtype_t subtype, uint32_t *binary_len, uint8_t **binary); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``subtype``: The expected :symbol:`bson_subtype_t`. * ``binary_len``: A location for the length of ``binary``. * ``binary``: A location for a pointer to the mutable buffer. Description ----------- The ``bson_iter_overwrite_binary()`` function obtains mutable access to a BSON_TYPE_BINARY element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_BINARY and the provided ``subtype``. The buffer that ``binary`` points to is only valid until the iterator's :symbol:`bson_t` is otherwise modified or freed. .. seealso:: | :symbol:`bson_iter_binary` mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_bool.rst000066400000000000000000000011671511661753600252070ustar00rootroot00000000000000:man_page: bson_iter_overwrite_bool bson_iter_overwrite_bool() ========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_bool (bson_iter_t *iter, bool value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A bool containing the new value. Description ----------- The ``bson_iter_overwrite_bool()`` function shall overwrite the contents of a BSON_TYPE_BOOL element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_BOOL. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_date_time.rst000066400000000000000000000013011511661753600261750ustar00rootroot00000000000000:man_page: bson_iter_overwrite_date_time bson_iter_overwrite_date_time() =============================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_date_time (bson_iter_t *iter, int64_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The date and time as specified in milliseconds since the UNIX epoch. Description ----------- The ``bson_iter_overwrite_date_time()`` function shall overwrite the contents of a BSON_TYPE_DATE_TIME element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DATE_TIME. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_decimal128.rst000066400000000000000000000012641511661753600261030ustar00rootroot00000000000000:man_page: bson_iter_overwrite_decimal128 bson_iter_overwrite_decimal128() ================================ Synopsis -------- .. code-block:: c bool bson_iter_overwrite_decimal128 (bson_iter_t *iter, const bson_decimal128_t *value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The new Decimal128 value. Description ----------- The :symbol:`bson_iter_overwrite_decimal128()` function shall overwrite the contents of a BSON_TYPE_DECIMAL128 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DECIMAL128. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_double.rst000066400000000000000000000012021511661753600255140ustar00rootroot00000000000000:man_page: bson_iter_overwrite_double bson_iter_overwrite_double() ============================ Synopsis -------- .. code-block:: c void bson_iter_overwrite_double (bson_iter_t *iter, double value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: The new double value. Description ----------- The :symbol:`bson_iter_overwrite_double()` function shall overwrite the contents of a BSON_TYPE_DOUBLE element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_DOUBLE. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_int32.rst000066400000000000000000000011601511661753600252040ustar00rootroot00000000000000:man_page: bson_iter_overwrite_int32 bson_iter_overwrite_int32() =========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_int32 (bson_iter_t *iter, int32_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A int32_t. Description ----------- The :symbol:`bson_iter_overwrite_int32()` function shall overwrite the contents of a BSON_TYPE_INT32 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_BOOL. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_int64.rst000066400000000000000000000011611511661753600252120ustar00rootroot00000000000000:man_page: bson_iter_overwrite_int64 bson_iter_overwrite_int64() =========================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_int64 (bson_iter_t *iter, int64_t value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``value``: A int64_t. Description ----------- The :symbol:`bson_iter_overwrite_int64()` function shall overwrite the contents of a BSON_TYPE_INT64 element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_INT64. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_oid.rst000066400000000000000000000011621511661753600250220ustar00rootroot00000000000000:man_page: bson_iter_overwrite_oid bson_iter_overwrite_oid() ========================= Synopsis -------- .. code-block:: c void bson_iter_overwrite_oid (bson_iter_t *iter, const bson_oid_t *value); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``oid``: A :symbol:`bson_oid_t`. Description ----------- The ``bson_iter_overwrite_oid()`` function shall overwrite the contents of a BSON_TYPE_OID element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_OID. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_overwrite_timestamp.rst000066400000000000000000000014041511661753600262510ustar00rootroot00000000000000:man_page: bson_iter_overwrite_timestamp bson_iter_overwrite_timestamp() =============================== Synopsis -------- .. code-block:: c void bson_iter_overwrite_timestamp (bson_iter_t *iter, uint32_t timestamp, uint32_t increment); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- The ``bson_iter_overwrite_timestamp()`` function shall overwrite the contents of a BSON_TYPE_TIMESTAMP element in place. This may only be done when the underlying bson document allows mutation. It is a programming error to call this function when ``iter`` is not observing an element of type BSON_TYPE_TIMESTAMP. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_recurse.rst000066400000000000000000000016161511661753600236150ustar00rootroot00000000000000:man_page: bson_iter_recurse bson_iter_recurse() =================== Synopsis -------- .. code-block:: c bool bson_iter_recurse (const bson_iter_t *iter, bson_iter_t *child); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``child``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_recurse()` function shall initialize ``child`` using the embedded document or array currently observed by ``iter``. If there was a failure to initialize the ``iter``, false is returned and both ``iter`` and ``child`` should be considered invalid. This should only be called when observing an element of type BSON_TYPE_ARRAY or BSON_TYPE_DOCUMENT. Returns ------- If ``iter`` observes an element of type BSON_TYPE_ARRAY or BSON_TYPE_DOCUMENT, then ``child`` is initialized and the function returns ``true``. Otherwise, the function returns ``false`` and ``child`` is invalid. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_regex.rst000066400000000000000000000012311511661753600232500ustar00rootroot00000000000000:man_page: bson_iter_regex bson_iter_regex() ================= Synopsis -------- .. code-block:: c const char * bson_iter_regex (const bson_iter_t *iter, const char **options); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``options``: A (null). Description ----------- The :symbol:`bson_iter_regex()` function shall retrieve the contents of a BSON_TYPE_REGEX element currently observed by ``iter``. It is invalid to call this function when not observing an element of type BSON_TYPE_REGEX. Returns ------- A string containing the regex which should not be modified or freed. ``options`` is set to the options provided for the regex. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_symbol.rst000066400000000000000000000011511511661753600234440ustar00rootroot00000000000000:man_page: bson_iter_symbol bson_iter_symbol() ================== Synopsis -------- .. code-block:: c const char * bson_iter_symbol (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: A uint32_t. Description ----------- The symbol element type is *DEPRECATED* in the bson specification at http://bsonspec.org. The :symbol:`bson_iter_symbol()` function shall return the contents of a BSON_TYPE_SYMBOL element. If non-NULL, ``length`` will be set to the length of the resulting string. Returns ------- The symbol and ``length`` is set. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_t.rst000066400000000000000000000111131511661753600224010ustar00rootroot00000000000000:man_page: bson_iter_t bson_iter_t =========== BSON Document Iterator Synopsis -------- .. code-block:: c #include #define BSON_ITER_HOLDS_DOUBLE(iter) /* ... */ #define BSON_ITER_HOLDS_UTF8(iter) /* ... */ #define BSON_ITER_HOLDS_DOCUMENT(iter) /* ... */ #define BSON_ITER_HOLDS_ARRAY(iter) /* ... */ #define BSON_ITER_HOLDS_BINARY(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_INT8(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_FLOAT32(iter) /* ... */ #define BSON_ITER_HOLDS_VECTOR_PACKED_BIT(iter) /* ... */ #define BSON_ITER_HOLDS_UNDEFINED(iter) /* ... */ #define BSON_ITER_HOLDS_OID(iter) /* ... */ #define BSON_ITER_HOLDS_BOOL(iter) /* ... */ #define BSON_ITER_HOLDS_DATE_TIME(iter) /* ... */ #define BSON_ITER_HOLDS_NULL(iter) /* ... */ #define BSON_ITER_HOLDS_REGEX(iter) /* ... */ #define BSON_ITER_HOLDS_DBPOINTER(iter) /* ... */ #define BSON_ITER_HOLDS_CODE(iter) /* ... */ #define BSON_ITER_HOLDS_SYMBOL(iter) /* ... */ #define BSON_ITER_HOLDS_CODEWSCOPE(iter) /* ... */ #define BSON_ITER_HOLDS_INT32(iter) /* ... */ #define BSON_ITER_HOLDS_TIMESTAMP(iter) /* ... */ #define BSON_ITER_HOLDS_INT64(iter) /* ... */ #define BSON_ITER_HOLDS_DECIMAL128(iter) /* ... */ #define BSON_ITER_HOLDS_MAXKEY(iter) /* ... */ #define BSON_ITER_HOLDS_MINKEY(iter) /* ... */ #define BSON_ITER_HOLDS_INT(iter) \ (BSON_ITER_HOLDS_INT32 (iter) || BSON_ITER_HOLDS_INT64 (iter)) #define BSON_ITER_HOLDS_NUMBER(iter) \ (BSON_ITER_HOLDS_INT (iter) || BSON_ITER_HOLDS_DOUBLE (iter)) #define BSON_ITER_IS_KEY(iter, key) \ (0 == strcmp ((key), bson_iter_key ((iter)))) typedef struct { /*< private >*/ } bson_iter_t; Description ----------- :symbol:`bson_iter_t` is a structure used to iterate through the elements of a :symbol:`bson_t`. It is meant to be used on the stack and can be discarded at any time as it contains no external allocation. The contents of the structure should be considered private and may change between releases, however the structure size will not change. The :symbol:`bson_t` *MUST* be valid for the lifetime of the iter and it is an error to modify the :symbol:`bson_t` while using the iter. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_iter_array bson_iter_as_bool bson_iter_as_double bson_iter_as_int64 bson_iter_binary bson_iter_binary_subtype bson_iter_binary_equal bson_iter_bool bson_iter_code bson_iter_codewscope bson_iter_date_time bson_iter_dbpointer bson_iter_decimal128 bson_iter_document bson_iter_double bson_iter_dup_utf8 bson_iter_find bson_iter_find_case bson_iter_find_descendant bson_iter_find_w_len bson_iter_init bson_iter_init_find bson_iter_init_find_case bson_iter_init_find_w_len bson_iter_init_from_data bson_iter_init_from_data_at_offset bson_iter_int32 bson_iter_int64 bson_iter_key bson_iter_key_len bson_iter_next bson_iter_offset bson_iter_oid bson_iter_overwrite_bool bson_iter_overwrite_binary bson_iter_overwrite_date_time bson_iter_overwrite_decimal128 bson_iter_overwrite_double bson_iter_overwrite_int32 bson_iter_overwrite_int64 bson_iter_overwrite_oid bson_iter_overwrite_timestamp bson_iter_recurse bson_iter_regex bson_iter_symbol bson_iter_time_t bson_iter_timestamp bson_iter_timeval bson_iter_type bson_iter_utf8 bson_iter_value bson_iter_visit_all Examples -------- .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_bson_doc)) { while (bson_iter_next (&iter)) { printf ("Found a field named: %s\n", bson_iter_key (&iter)); } } .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_bson_doc) && bson_iter_find (&iter, "my_field")) { printf ("Found the field named: %s\n", bson_iter_key (&iter)); } .. code-block:: c bson_iter_t iter; bson_iter_t sub_iter; if (bson_iter_init_find (&iter, my_bson_doc, "mysubdoc") && (BSON_ITER_HOLDS_DOCUMENT (&iter) || BSON_ITER_HOLDS_ARRAY (&iter)) && bson_iter_recurse (&iter, &sub_iter)) { while (bson_iter_next (&sub_iter)) { printf ("Found key \"%s\" in sub document.\n", bson_iter_key (&sub_iter)); } } .. code-block:: c bson_iter_t iter; if (bson_iter_init (&iter, my_doc) && bson_iter_find_descendant (&iter, "a.b.c.d", &sub_iter)) { printf ("The type of a.b.c.d is: %d\n", (int) bson_iter_type (&sub_iter)); } mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_time_t.rst000066400000000000000000000007431511661753600234260ustar00rootroot00000000000000:man_page: bson_iter_time_t bson_iter_time_t() ================== Synopsis -------- .. code-block:: c time_t bson_iter_time_t (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The :symbol:`bson_iter_time_t()` function shall return the number of seconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element. Returns ------- A ``time_t`` containing the number of seconds since the UNIX epoch. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_timestamp.rst000066400000000000000000000015441511661753600241500ustar00rootroot00000000000000:man_page: bson_iter_timestamp bson_iter_timestamp() ===================== Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_TIMESTAMP(iter) \ (bson_iter_type ((iter)) == BSON_TYPE_TIMESTAMP) void bson_iter_timestamp (const bson_iter_t *iter, uint32_t *timestamp, uint32_t *increment); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``timestamp``: A uint32_t. * ``increment``: A uint32_t. Description ----------- The BSON_TYPE_TIMESTAMP type is not a date/time and is typically used for intra-server communication. You probably want :symbol:`bson_iter_date_time()`. The :symbol:`bson_iter_timestamp()` function shall return the contents of a BSON_TYPE_TIMESTAMP element. It is invalid to call this function while observing an element that is not of type BSON_TYPE_TIMESTAMP. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_timeval.rst000066400000000000000000000007351511661753600236070ustar00rootroot00000000000000:man_page: bson_iter_timeval bson_iter_timeval() =================== Synopsis -------- .. code-block:: c void bson_iter_timeval (const bson_iter_t *iter, struct timeval *tv); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``tv``: A struct timeval. Description ----------- The :symbol:`bson_iter_timeval()` function shall return the number of seconds and microseconds since the UNIX epoch, as contained in the BSON_TYPE_DATE_TIME element into ``tv``. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_type.rst000066400000000000000000000020361511661753600231230ustar00rootroot00000000000000:man_page: bson_iter_type bson_iter_type() ================ Synopsis -------- .. code-block:: c typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; bson_type_t bson_iter_type (const bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- The ``bson_iter_type()`` function shall return the type of the observed element in a bson document. Returns ------- A :symbol:`bson_type_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_utf8.rst000066400000000000000000000022331511661753600230270ustar00rootroot00000000000000:man_page: bson_iter_utf8 bson_iter_utf8() ================ Synopsis -------- .. code-block:: c #define BSON_ITER_HOLDS_UTF8(iter) (bson_iter_type ((iter)) == BSON_TYPE_UTF8) const char * bson_iter_utf8 (const bson_iter_t *iter, uint32_t *length); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``length``: An optional location for the length of the resulting UTF-8 encoded string. Description ----------- The :symbol:`bson_iter_utf8()` function shall retrieve the contents of a BSON_TYPE_UTF8 element currently observed by ``iter``. It is invalid to call this function while observing an element other than BSON_TYPE_UTF8. Returns ------- A UTF-8 encoded string that has not been modified or freed. It is suggested that the caller validate the content is valid UTF-8 before using this in other places. That can be done by calling :symbol:`bson_utf8_validate()` or validating the underlying :symbol:`bson_t` before iterating it. Note that not all drivers use multi-byte representation for ``\0`` in UTF-8 encodings (commonly referred to as modified-UTF8). You probably want to take a look at the length field when marshaling to other runtimes. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_value.rst000066400000000000000000000010711511661753600232540ustar00rootroot00000000000000:man_page: bson_iter_value bson_iter_value() ================= Synopsis -------- .. code-block:: c const bson_value_t * bson_iter_value (bson_iter_t *iter); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. Description ----------- Fetches the value for the currently observed type as a boxed type. This allows passing around the value without knowing the type at runtime. If the :symbol:`bson_iter_t` is further modified, the :symbol:`bson_value_t` is invalidated. Returns ------- A :symbol:`bson_value_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libbson/doc/bson_iter_visit_all.rst000066400000000000000000000015671511661753600241400ustar00rootroot00000000000000:man_page: bson_iter_visit_all bson_iter_visit_all() ===================== Synopsis -------- .. code-block:: c bool bson_iter_visit_all (bson_iter_t *iter, const bson_visitor_t *visitor, void *data); Parameters ---------- * ``iter``: A :symbol:`bson_iter_t`. * ``visitor``: A :symbol:`bson_visitor_t`. * ``data``: Optional data for ``visitor``. Description ----------- A convenience function to iterate all remaining fields of ``iter`` using the callback vtable provided by ``visitor``. Returns ------- Returns true if visitation was prematurely stopped by a callback function. Returns false either because all elements were visited *or* due to corrupt BSON. See :symbol:`bson_visitor_t` for examples of how to set your own callbacks to provide information about the location of corrupt or unsupported BSON document entries. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_data_reader_ingest.rst000066400000000000000000000010431511661753600257510ustar00rootroot00000000000000:man_page: bson_json_data_reader_ingest bson_json_data_reader_ingest() ============================== Synopsis -------- .. code-block:: c void bson_json_data_reader_ingest (bson_json_reader_t *reader, const uint8_t *data, size_t len); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. * ``data``: A uint8_t containing data to feed. * ``len``: A size_t containing the length of ``data``. Description ----------- Feed data to a memory based json reader. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_data_reader_new.rst000066400000000000000000000010721511661753600252530ustar00rootroot00000000000000:man_page: bson_json_data_reader_new bson_json_data_reader_new() =========================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_data_reader_new (bool allow_multiple, size_t size); Parameters ---------- * ``allow_multiple``: Unused. * ``size``: A requested buffer size. Description ----------- Creates a new streaming JSON reader that will convert JSON documents to BSON. The ``allow_multiple`` parameter is unused. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-2.2.1/src/libbson/doc/bson_json_mode_t.rst000066400000000000000000000011451511661753600234170ustar00rootroot00000000000000:man_page: bson_json_mode_t bson_json_mode_t ================ BSON JSON encoding mode enumeration Synopsis -------- .. code-block:: c #include typedef enum { BSON_JSON_MODE_LEGACY, BSON_JSON_MODE_CANONICAL, BSON_JSON_MODE_RELAXED, } bson_json_mode_t; Description ----------- The :symbol:`bson_json_mode_t` enumeration contains all available modes for encoding BSON into `MongoDB Extended JSON`_. .. seealso:: | :symbol:`bson_as_json_with_opts()` .. _MongoDB Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md mongo-c-driver-2.2.1/src/libbson/doc/bson_json_opts_destroy.rst000066400000000000000000000005621511661753600247100ustar00rootroot00000000000000:man_page: bson_json_opts_destroy bson_json_opts_destroy() ======================== Synopsis -------- .. code-block:: c void bson_json_opts_destroy (bson_json_opts_t *opts); Parameters ---------- * ``opts``: A :symbol:`bson_json_opts_t`. Description ----------- Destroys and releases all resources associated with ``opts``. Does nothing if ``opts`` is NULL. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_opts_new.rst000066400000000000000000000014401511661753600240040ustar00rootroot00000000000000:man_page: bson_json_opts_new bson_json_opts_new() ==================== Synopsis -------- .. code-block:: c bson_json_opts_t * bson_json_opts_new (bson_json_mode_t mode, int32_t max_len); Parameters ---------- * ``mode``: A bson_json_mode_t. * ``max_len``: An int32_t. Description ----------- The :symbol:`bson_json_opts_new()` function shall create a new :symbol:`bson_json_opts_t` using the mode and length supplied. The ``mode`` member is a :symbol:`bson_json_mode_t` defining the encoding mode. The ``max_len`` member holds a maximum length for the resulting JSON string. Encoding will stop once the serialised string has reached this length. To encode the full BSON document, ``BSON_MAX_LEN_UNLIMITED`` can be used. Returns ------- A newly allocated :symbol:`bson_json_opts_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_opts_set_outermost_array.rst000066400000000000000000000011641511661753600273300ustar00rootroot00000000000000:man_page: bson_json_opts_set_outermost_array bson_json_opts_set_outermost_array() ==================================== Synopsis -------- .. code-block:: c void bson_json_opts_set_outermost_array (bson_json_opts_t *opts, bool is_outermost_array); Parameters ---------- * ``opts``: A :symbol:`bson_json_opts_t`. * ``is_outermost_array``: A value determining what we want to set the is_outermost_array variable to. Description ----------- The :symbol:`bson_json_opts_set_outermost_array()` function shall set the ``is_outermost_array`` variable on the :symbol:`bson_json_opts_t` parameter using the boolean provided. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_opts_t.rst000066400000000000000000000022131511661753600234550ustar00rootroot00000000000000:man_page: bson_json_opts_t bson_json_opts_t ================ BSON to JSON encoding options Synopsis -------- .. code-block:: c #include typedef struct _bson_json_opts_t bson_json_opts_t; bson_json_opts_t * bson_json_opts_new (bson_json_mode_t mode, int32_t max_len); void bson_json_opts_destroy (bson_json_opts_t *opts); Description ----------- The :symbol:`bson_json_opts_t` structure contains options for encoding BSON into `MongoDB Extended JSON`_. The ``mode`` member is a :symbol:`bson_json_mode_t` defining the encoding mode. The ``max_len`` member holds a maximum length for the resulting JSON string. Encoding will stop once the serialised string has reached this length. To encode the full BSON document, ``BSON_MAX_LEN_UNLIMITED`` can be used. .. seealso:: | :symbol:`bson_as_json_with_opts()` .. _MongoDB Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json/extended-json.md .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_json_opts_new bson_json_opts_destroy bson_json_opts_set_outermost_array mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_destroy.rst000066400000000000000000000005421511661753600251630ustar00rootroot00000000000000:man_page: bson_json_reader_destroy bson_json_reader_destroy() ========================== Synopsis -------- .. code-block:: c void bson_json_reader_destroy (bson_json_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. Description ----------- Frees a bson_json_reader_t. Does nothing if ``reader`` is NULL. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_new.rst000066400000000000000000000015521511661753600242650ustar00rootroot00000000000000:man_page: bson_json_reader_new bson_json_reader_new() ====================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new (void *data, bson_json_reader_cb cb, bson_json_destroy_cb dcb, bool allow_multiple, size_t buf_size); Parameters ---------- * ``data``: A user-defined pointer. * ``cb``: A bson_json_reader_cb. * ``dcb``: A bson_json_destroy_cb. * ``allow_multiple``: Unused. * ``buf_size``: A size_t containing the requested internal buffer size. Description ----------- Creates a new bson_json_reader_t that can read from an arbitrary data source in a streaming fashion. The ``allow_multiple`` parameter is unused. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_new_from_fd.rst000066400000000000000000000011501511661753600257530ustar00rootroot00000000000000:man_page: bson_json_reader_new_from_fd bson_json_reader_new_from_fd() ============================== Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new_from_fd (int fd, bool close_on_destroy); Parameters ---------- * ``fd``: An open file-descriptor. * ``close_on_destroy``: Whether ``close()`` should be called on ``fd`` when the reader is destroyed. Description ----------- Creates a new JSON to BSON converter that will be reading from the file-descriptor ``fd``. Returns ------- A newly allocated bson_json_reader_t that should be freed with bson_json_reader_destroy(). mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_new_from_file.rst000066400000000000000000000011771511661753600263120ustar00rootroot00000000000000:man_page: bson_json_reader_new_from_file bson_json_reader_new_from_file() ================================ Synopsis -------- .. code-block:: c bson_json_reader_t * bson_json_reader_new_from_file (const char *filename, bson_error_t *error); Parameters ---------- * ``filename``: A file-name in the system file-name encoding. * ``error``: A :symbol:`bson_error_t`. Description ----------- Creates a new bson_json_reader_t using the underlying file found at ``filename``. Errors ------ Errors are propagated via ``error``. Returns ------- A newly allocated bson_json_reader_t if successful, otherwise NULL and error is set. mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_read.rst000066400000000000000000000013411511661753600244030ustar00rootroot00000000000000:man_page: bson_json_reader_read bson_json_reader_read() ======================= Synopsis -------- .. code-block:: c int bson_json_reader_read (bson_json_reader_t *reader, bson_t *bson, bson_error_t *error); Parameters ---------- * ``reader``: A :symbol:`bson_json_reader_t`. * ``bson``: A :symbol:`bson_t`. * ``error``: A :symbol:`bson_error_t`. Description ----------- Reads the next BSON document from the underlying JSON source. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- 1 if successful and data was read. 0 if successful and no data was read. -1 if there was an error. .. only:: html .. include:: includes/seealso/json.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_json_reader_t.rst000066400000000000000000000070731511661753600237430ustar00rootroot00000000000000:man_page: bson_json_reader_t bson_json_reader_t ================== Bulk JSON to BSON conversion Synopsis -------- .. code-block:: c #include typedef struct _bson_json_reader_t bson_json_reader_t; typedef enum { BSON_JSON_ERROR_READ_CORRUPT_JS = 1, BSON_JSON_ERROR_READ_INVALID_PARAM, BSON_JSON_ERROR_READ_CB_FAILURE, } bson_json_error_code_t; Description ----------- The :symbol:`bson_json_reader_t` structure is used for reading a sequence of JSON documents and transforming them to :symbol:`bson_t` documents. This can often be useful if you want to perform bulk operations that are defined in a file containing JSON documents. .. tip:: :symbol:`bson_json_reader_t` works upon JSON documents formatted in `MongoDB extended JSON `_ format. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_json_data_reader_ingest bson_json_data_reader_new bson_json_reader_destroy bson_json_reader_new bson_json_reader_new_from_fd bson_json_reader_new_from_file bson_json_reader_read Example ------- .. code-block:: c /* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each JSON document contained in the provided files * as a BSON string to STDOUT. */ #include #include #include int main (int argc, char *argv[]) { bson_json_reader_t *reader; bson_error_t error; const char *filename; bson_t doc = BSON_INITIALIZER; int i; int b; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; /* * Open the filename provided in command line arguments. */ if (0 == strcmp (filename, "-")) { reader = bson_json_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_json_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to BSON and print to stdout. */ while ((b = bson_json_reader_read (reader, &doc, &error))) { if (b < 0) { fprintf (stderr, "Error in json parsing:\n%s\n", error.message); abort (); } if (fwrite (bson_get_data (&doc), 1, doc.len, stdout) != doc.len) { fprintf (stderr, "Failed to write to stdout, exiting.\n"); exit (1); } bson_reinit (&doc); } bson_json_reader_destroy (reader); bson_destroy (&doc); } return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_malloc.rst000066400000000000000000000010231511661753600223610ustar00rootroot00000000000000:man_page: bson_malloc bson_malloc() ============= Synopsis -------- .. code-block:: c void * bson_malloc (size_t num_bytes); Parameters ---------- * ``num_bytes``: A size_t containing the number of bytes to allocate. Description ----------- This is a portable ``malloc()`` wrapper. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-2.2.1/src/libbson/doc/bson_malloc0.rst000066400000000000000000000010431511661753600224430ustar00rootroot00000000000000:man_page: bson_malloc0 bson_malloc0() ============== Synopsis -------- .. code-block:: c void * bson_malloc0 (size_t num_bytes); Parameters ---------- * ``num_bytes``: A size_t. Description ----------- This is a portable ``malloc()`` wrapper that also sets the memory to zero. Similar to ``calloc()``. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS* been zeroed. mongo-c-driver-2.2.1/src/libbson/doc/bson_mem_restore_vtable.rst000066400000000000000000000006511511661753600247760ustar00rootroot00000000000000:man_page: bson_mem_restore_vtable bson_mem_restore_vtable() ========================= Synopsis -------- .. code-block:: c void bson_mem_restore_vtable (void); Description ----------- This function shall restore the default memory allocator to be used by Libbson. .. warning:: This function *MUST* be called at the end of the process. Failure to do so will result in memory being freed by the wrong allocator. mongo-c-driver-2.2.1/src/libbson/doc/bson_mem_set_vtable.rst000066400000000000000000000017551511661753600241140ustar00rootroot00000000000000:man_page: bson_mem_set_vtable bson_mem_set_vtable() ===================== Synopsis -------- .. code-block:: c typedef struct _bson_mem_vtable_t { void *(*malloc) (size_t num_bytes); void *(*calloc) (size_t n_members, size_t num_bytes); void *(*realloc) (void *mem, size_t num_bytes); void (*free) (void *mem); void *(*aligned_alloc) (size_t alignment, size_t num_bytes); void *padding[3]; } bson_mem_vtable_t; void bson_mem_set_vtable (const bson_mem_vtable_t *vtable); Parameters ---------- * ``vtable``: A bson_mem_vtable_t with every non-padding field set. Description ----------- This function shall install a new memory allocator to be used by Libbson. For backwards compatibility, if ``vtable->aligned_alloc`` is not set, calls to ``vtable->aligned_alloc`` will use ``vtable->malloc`` instead. .. warning:: This function *MUST* be called at the beginning of the process. Failure to do so will result in memory being freed by the wrong allocator. mongo-c-driver-2.2.1/src/libbson/doc/bson_memory.rst000066400000000000000000000022041511661753600224240ustar00rootroot00000000000000:man_page: bson_memory Memory Management ================= BSON Memory Abstraction. Description ----------- Libbson contains a lightweight memory abstraction to make portability to new platforms easier. Additionally, it helps us integrate with interesting higher-level languages. One caveat, however, is that Libbson is not designed to deal with Out of Memory (OOM) situations. Doing so requires extreme diligence throughout the application stack that has rarely been implemented correctly. This may change in the future. As it stands now, Libbson will ``abort()`` under OOM situations. To aid in language binding integration, Libbson allows for setting a custom memory allocator via :symbol:`bson_mem_set_vtable()`. This allocation may be reversed via :symbol:`bson_mem_restore_vtable()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_free bson_malloc bson_malloc0 bson_aligned_alloc bson_aligned_alloc0 bson_array_alloc bson_array_alloc0 bson_mem_restore_vtable bson_mem_set_vtable bson_realloc bson_realloc_ctx bson_realloc_func bson_zero_free mongo-c-driver-2.2.1/src/libbson/doc/bson_new.rst000066400000000000000000000007371511661753600217160ustar00rootroot00000000000000:man_page: bson_new bson_new() ========== Synopsis -------- .. code-block:: c bson_t * bson_new (void); Description ----------- The :symbol:`bson_new()` function shall create a new :symbol:`bson_t` structure on the heap. It should be freed with :symbol:`bson_destroy()` when it is no longer in use. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_new_from_buffer.rst000066400000000000000000000023611511661753600242650ustar00rootroot00000000000000:man_page: bson_new_from_buffer bson_new_from_buffer() ====================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_buffer (uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx); Parameters ---------- * ``buf``: An out-pointer to a buffer containing a serialized BSON document, or to NULL. * ``buf_len``: An out-pointer to the length of the buffer in bytes. * ``realloc_func``: Optional :symbol:`bson_realloc_func` for reallocating the buffer. * ``realloc_func_ctx``: Optional pointer that will be passed as ``ctx`` to ``realloc_func``. Description ----------- Creates a new :symbol:`bson_t` using the data provided. The ``realloc_func``, if provided, is called to resize ``buf`` if the document is later expanded, for example by a call to one of the ``bson_append`` functions. If ``*buf`` is initially NULL then it is allocated, using ``realloc_func`` or the default allocator, and initialized with an empty BSON document, and ``*buf_len`` is set to 5, the size of an empty document. Returns ------- A newly-allocated :symbol:`bson_t` on success, or NULL. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_new_from_data.rst000066400000000000000000000012671511661753600237310ustar00rootroot00000000000000:man_page: bson_new_from_data bson_new_from_data() ==================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_data (const uint8_t *data, size_t length); Parameters ---------- * ``data``: A BSON encoded document buffer. * ``length``: The length of ``data`` in bytes. Description ----------- The :symbol:`bson_new_from_data()` function shall create a new :symbol:`bson_t` on the heap and copy the contents of ``data``. This may be helpful when working with language bindings but is generally expected to be slower. Returns ------- A newly allocated :symbol:`bson_t` if successful, otherwise NULL. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_new_from_json.rst000066400000000000000000000025461511661753600237720ustar00rootroot00000000000000:man_page: bson_new_from_json bson_new_from_json() ==================== Synopsis -------- .. code-block:: c bson_t * bson_new_from_json (const uint8_t *data, ssize_t len, bson_error_t *error); Parameters ---------- * ``data``: A UTF-8 encoded string containing valid JSON. * ``len``: The length of ``data`` in bytes excluding a trailing ``\0`` or -1 to determine the length with ``strlen()``. * ``error``: An optional location for a :symbol:`bson_error_t`. Description ----------- The ``bson_new_from_json()`` function allocates and initializes a new :symbol:`bson_t` by parsing the JSON found in ``data``. Only a single JSON object may exist in ``data`` or an error will be set and NULL returned. Deprecated behavior: If there are multiple comma-separated JSONs in ``data``, the keys from all JSONs are merged in the returned BSON. For example, ``{"a": 1},{"b": 2}`` is parsed as ``{"a": 1, "b": 2}``. If the first character encountered after the last valid JSON object is ``{``, all following characters are ignored and no error is set. Otherwise, an error will be set and NULL returned. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A newly allocated :symbol:`bson_t` if successful, otherwise NULL and ``error`` is set. .. only:: html .. include:: includes/seealso/create-bson.txt .. include:: includes/seealso/json.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_compare.rst000066400000000000000000000007761511661753600234110ustar00rootroot00000000000000:man_page: bson_oid_compare bson_oid_compare() ================== Synopsis -------- .. code-block:: c int bson_oid_compare (const bson_oid_t *oid1, const bson_oid_t *oid2); Parameters ---------- * ``oid1``: A :symbol:`bson_oid_t`. * ``oid2``: A :symbol:`bson_oid_t`. Description ----------- The :symbol:`bson_oid_compare()` function shall return a qsort() style value of a lexicographical sort of ``oid1`` and ``oid2``. Returns ------- less than 0, 0, or greater than 0 based on the comparison. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_compare_unsafe.rst000066400000000000000000000005101511661753600247340ustar00rootroot00000000000000:man_page: bson_oid_compare_unsafe bson_oid_compare_unsafe() ========================= Synopsis -------- .. code-block:: c static inline int bson_oid_compare_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2); Description ----------- Identical to :symbol:`bson_oid_compare()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_copy.rst000066400000000000000000000005001511661753600227160ustar00rootroot00000000000000:man_page: bson_oid_copy bson_oid_copy() =============== Synopsis -------- .. code-block:: c void bson_oid_copy (const bson_oid_t *src, bson_oid_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_oid_t`. * ``dst``: A :symbol:`bson_oid_t`. Description ----------- Copies the contents of src into dst. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_copy_unsafe.rst000066400000000000000000000004621511661753600242660ustar00rootroot00000000000000:man_page: bson_oid_copy_unsafe bson_oid_copy_unsafe() ====================== Synopsis -------- .. code-block:: c static inline void bson_oid_copy_unsafe (const bson_oid_t *src, bson_oid_t *dst); Description ----------- Identical to :symbol:`bson_oid_copy()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_equal.rst000066400000000000000000000006251511661753600230630ustar00rootroot00000000000000:man_page: bson_oid_equal bson_oid_equal() ================ Synopsis -------- .. code-block:: c bool bson_oid_equal (const bson_oid_t *oid1, const bson_oid_t *oid2); Parameters ---------- * ``oid1``: A :symbol:`bson_oid_t`. * ``oid2``: A :symbol:`bson_oid_t`. Description ----------- Checks if two bson_oid_t contain the same bytes. Returns ------- true if they are equal, otherwise false. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_equal_unsafe.rst000066400000000000000000000004771511661753600244310ustar00rootroot00000000000000:man_page: bson_oid_equal_unsafe bson_oid_equal_unsafe() ======================= Synopsis -------- .. code-block:: c static inline bool bson_oid_equal_unsafe (const bson_oid_t *oid1, const bson_oid_t *oid2); Description ----------- Identical to :symbol:`bson_oid_equal()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_get_time_t.rst000066400000000000000000000006341511661753600240740ustar00rootroot00000000000000:man_page: bson_oid_get_time_t bson_oid_get_time_t() ===================== Synopsis -------- .. code-block:: c time_t bson_oid_get_time_t (const bson_oid_t *oid); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. Description ----------- Fetches the generation time in seconds since the UNIX Epoch of ``oid``. Returns ------- A time_t containing the seconds since the UNIX epoch of ``oid``. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_get_time_t_unsafe.rst000066400000000000000000000005011511661753600254260ustar00rootroot00000000000000:man_page: bson_oid_get_time_t_unsafe bson_oid_get_time_t_unsafe() ============================ Synopsis -------- .. code-block:: c static inline time_t bson_oid_get_time_t_unsafe (const bson_oid_t *oid); Description ----------- Identical to :symbol:`bson_oid_get_time_t()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_hash.rst000066400000000000000000000005151511661753600226750ustar00rootroot00000000000000:man_page: bson_oid_hash bson_oid_hash() =============== Synopsis -------- .. code-block:: c uint32_t bson_oid_hash (const bson_oid_t *oid); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. Description ----------- Generates a hash code for ``oid`` suitable for a hashtable. Returns ------- A 32-bit hash code. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_hash_unsafe.rst000066400000000000000000000004451511661753600242400ustar00rootroot00000000000000:man_page: bson_oid_hash_unsafe bson_oid_hash_unsafe() ====================== Synopsis -------- .. code-block:: c static inline uint32_t bson_oid_hash_unsafe (const bson_oid_t *oid); Description ----------- Identical to :symbol:`bson_oid_hash()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_init.rst000066400000000000000000000006401511661753600227140ustar00rootroot00000000000000:man_page: bson_oid_init bson_oid_init() =============== Synopsis -------- .. code-block:: c void bson_oid_init (bson_oid_t *oid, bson_context_t *context); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``context``: An *optional* :symbol:`bson_context_t` or NULL. Description ----------- Generates a new :symbol:`bson_oid_t` using either ``context`` or the default :symbol:`bson_context_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_init_from_data.rst000066400000000000000000000006261511661753600247340ustar00rootroot00000000000000:man_page: bson_oid_init_from_data bson_oid_init_from_data() ========================= Synopsis -------- .. code-block:: c void bson_oid_init_from_data (bson_oid_t *oid, const uint8_t *data); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``data``: A buffer containing 12 bytes for the oid. Description ----------- Initializes a :symbol:`bson_oid_t` using the raw buffer provided. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_init_from_string.rst000066400000000000000000000010321511661753600253210ustar00rootroot00000000000000:man_page: bson_oid_init_from_string bson_oid_init_from_string() =========================== Synopsis -------- .. code-block:: c void bson_oid_init_from_string (bson_oid_t *oid, const char *str); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``str``: A string containing a hex encoded version of the oid. Description ----------- Parses the string containing hex encoded oid and initialize the bytes in ``oid``. Example ------- .. code-block:: c bson_oid_init_from_string (&oid, "012345678901234567890123"); mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_init_from_string_unsafe.rst000066400000000000000000000005501511661753600266660ustar00rootroot00000000000000:man_page: bson_oid_init_from_string_unsafe bson_oid_init_from_string_unsafe() ================================== Synopsis -------- .. code-block:: c static inline void bson_oid_init_from_string_unsafe (bson_oid_t *oid, const char *str); Description ----------- Identical to :symbol:`bson_oid_init_from_string()`, but performs no integrity checking. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_is_valid.rst000066400000000000000000000006271511661753600235500ustar00rootroot00000000000000:man_page: bson_oid_is_valid bson_oid_is_valid() =================== Synopsis -------- .. code-block:: c bool bson_oid_is_valid (const char *str, size_t length); Parameters ---------- * ``str``: A string. * ``length``: The length of ``str``. Description ----------- Checks if a string containing a hex encoded string is a valid BSON ObjectID. Returns ------- true if ``str`` could be parsed. mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_t.rst000066400000000000000000000042661511661753600222240ustar00rootroot00000000000000:man_page: bson_oid_t bson_oid_t ========== BSON ObjectID Abstraction Synopsis -------- .. code-block:: c #include typedef struct { uint8_t bytes[12]; } bson_oid_t; Description ----------- The :symbol:`bson_oid_t` structure contains the 12-byte ObjectId notation defined by the `BSON ObjectID specification `_. ObjectId is a 12-byte BSON type, constructed using: * a 4-byte value representing the seconds since the Unix epoch (in Big Endian). * a 5-byte random value. * a 3-byte counter (Big Endian), starting with a random value. String Conversion ----------------- You can convert an Object ID to a string using :symbol:`bson_oid_to_string()` and back with :symbol:`bson_oid_init_from_string()`. Hashing ------- A :symbol:`bson_oid_t` can be used in hashtables using the function :symbol:`bson_oid_hash()` and :symbol:`bson_oid_equal()`. Comparing --------- A :symbol:`bson_oid_t` can be compared to another using :symbol:`bson_oid_compare()` for ``qsort()`` style comparing and :symbol:`bson_oid_equal()` for direct equality. Validating ---------- You can validate that a string containing a hex-encoded ObjectID is valid using the function :symbol:`bson_oid_is_valid()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_oid_compare bson_oid_compare_unsafe bson_oid_copy bson_oid_copy_unsafe bson_oid_equal bson_oid_equal_unsafe bson_oid_get_time_t bson_oid_get_time_t_unsafe bson_oid_hash bson_oid_hash_unsafe bson_oid_init bson_oid_init_from_data bson_oid_init_from_string bson_oid_init_from_string_unsafe bson_oid_is_valid bson_oid_to_string Example ------- .. code-block:: c #include #include int main (int argc, char *argv[]) { bson_oid_t oid; char str[25]; bson_oid_init (&oid, NULL); bson_oid_to_string (&oid, str); printf ("%s\n", str); if (bson_oid_is_valid (str, sizeof str)) { bson_oid_init_from_string (&oid, str); } printf ("The UNIX time was: %u\n", (unsigned) bson_oid_get_time_t (&oid)); return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_oid_to_string.rst000066400000000000000000000005451511661753600237650ustar00rootroot00000000000000:man_page: bson_oid_to_string bson_oid_to_string() ==================== Synopsis -------- .. code-block:: c void bson_oid_to_string (const bson_oid_t *oid, char str[25]); Parameters ---------- * ``oid``: A :symbol:`bson_oid_t`. * ``str``: A location for the resulting string. Description ----------- Converts ``oid`` into a hex encoded string. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_destroy.rst000066400000000000000000000005501511661753600241310ustar00rootroot00000000000000:man_page: bson_reader_destroy bson_reader_destroy() ===================== Synopsis -------- .. code-block:: c void bson_reader_destroy (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Destroys and releases all resources associated with ``reader``. Does nothing if ``reader`` is NULL. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_destroy_func_t.rst000066400000000000000000000011041511661753600254630ustar00rootroot00000000000000:man_page: bson_reader_destroy_func_t bson_reader_destroy_func_t ========================== Synopsis -------- .. code-block:: c typedef void (*bson_reader_destroy_func_t) (void *handle); Parameters ---------- * ``handle``: The opaque handle provided to :symbol:`bson_reader_new_from_handle`. Description ----------- An optional callback function that will be called when a :symbol:`bson_reader_t` created with :symbol:`bson_reader_new_from_handle` is destroyed with :symbol:`bson_reader_destroy()`. The handle used when creating the reader is passed to this callback. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_new_from_data.rst000066400000000000000000000011271511661753600252460ustar00rootroot00000000000000:man_page: bson_reader_new_from_data bson_reader_new_from_data() =========================== Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_data (const uint8_t *data, size_t length); Parameters ---------- * ``data``: A uint8_t. * ``length``: A size_t. Description ----------- The :symbol:`bson_reader_new_from_data()` function shall create a new :symbol:`bson_reader_t` using the buffer supplied. ``data`` is not copied and *MUST* be valid for the lifetime of the resulting :symbol:`bson_reader_t`. Returns ------- A newly allocated :symbol:`bson_reader_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_new_from_fd.rst000066400000000000000000000014631511661753600247310ustar00rootroot00000000000000:man_page: bson_reader_new_from_fd bson_reader_new_from_fd() ========================= Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_fd (int fd, bool close_on_destroy); Parameters ---------- * ``fd``: A valid file-descriptor. * ``close_on_destroy``: Whether ``close()`` should be called on ``fd`` when the reader is destroyed. Description ----------- The :symbol:`bson_reader_new_from_fd()` function shall create a new :symbol:`bson_reader_t` that will read from the provided file-descriptor. fd *MUST* be in blocking mode. If ``close_fd`` is true, then ``fd`` will be closed when the :symbol:`bson_reader_t` is destroyed with :symbol:`bson_reader_destroy()`. Returns ------- A newly allocated :symbol:`bson_reader_t` that should be freed with :symbol:`bson_reader_destroy`. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_new_from_file.rst000066400000000000000000000011461511661753600252550ustar00rootroot00000000000000:man_page: bson_reader_new_from_file bson_reader_new_from_file() =========================== Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_file (const char *path, bson_error_t *error); Parameters ---------- * ``path``: A filename in the host filename encoding. * ``error``: A :symbol:`bson_error_t`. Description ----------- Creates a new :symbol:`bson_reader_t` using the file denoted by ``filename``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A newly allocated :symbol:`bson_reader_t` on success, otherwise NULL and error is set. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_new_from_handle.rst000066400000000000000000000013531511661753600255710ustar00rootroot00000000000000:man_page: bson_reader_new_from_handle bson_reader_new_from_handle() ============================= Synopsis -------- .. code-block:: c bson_reader_t * bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); Parameters ---------- * ``handle``: A user-provided pointer or NULL. * ``rf``: A :symbol:`bson_reader_read_func_t`. * ``df``: A :symbol:`bson_reader_destroy_func_t`. Description ----------- This function allows for a pluggable data stream for the reader. This can be used to read from sockets, files, memory, or other arbitrary sources. Returns ------- A newly allocated bson_reader_t if successful; otherwise NULL. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_read.rst000066400000000000000000000017271511661753600233620ustar00rootroot00000000000000:man_page: bson_reader_read bson_reader_read() ================== Synopsis -------- .. code-block:: c const bson_t * bson_reader_read (bson_reader_t *reader, bool *reached_eof); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``reached_eof``: A UNKNOWN. Description ----------- The :symbol:`bson_reader_read()` function shall read the next document from the underlying file-descriptor or buffer. If there are no further documents or a failure was detected, then NULL is returned. If we reached the end of the sequence, ``reached_eof`` is set to true. To detect an error, check for NULL and ``reached_of`` is false. Returns ------- A :symbol:`bson_t` that should not be modified or freed. Example ------- .. code-block:: c const bson_t *doc; bool reached_eof = false; while ((doc = bson_reader_read (reader, &reached_eof))) { /* do something */ } if (!reached_eof) { fprintf (stderr, "Failed to read all documents.\n"); } mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_read_func_t.rst000066400000000000000000000015301511661753600247100ustar00rootroot00000000000000:man_page: bson_reader_read_func_t bson_reader_read_func_t ======================= Synopsis -------- .. code-block:: c typedef ssize_t (*bson_reader_read_func_t) (void *handle, void *buf, size_t count); Parameters ---------- * ``handle``: The handle to read from. * ``buf``: The buffer to read into. * ``count``: The number of bytes to read. Description ----------- A callback function that will be called by :symbol:`bson_reader_t` to read the next chunk of data from the underlying opaque file descriptor. This function is meant to operate similar to the ``read(2)`` function as part of libc on UNIX-like systems. Returns ------- 0 for end of stream. -1 for a failure on read. A value greater than zero for the number of bytes read into ``buf``. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_reset.rst000066400000000000000000000006771511661753600235740ustar00rootroot00000000000000:man_page: bson_reader_reset bson_reader_reset() =================== Synopsis -------- .. code-block:: c void bson_reader_reset (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Seeks to the beginning of the underlying buffer. Valid only for a reader created from a buffer with :symbol:`bson_reader_new_from_data`, not one created from a file, file descriptor, or handle. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_set_destroy_func.rst000066400000000000000000000010721511661753600260170ustar00rootroot00000000000000:man_page: bson_reader_set_destroy_func bson_reader_set_destroy_func() ============================== Synopsis -------- .. code-block:: c void bson_reader_set_destroy_func (bson_reader_t *reader, bson_reader_destroy_func_t func); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``func``: A :symbol:`bson_reader_destroy_func_t`. Description ----------- Allows for setting a callback to be executed when a reader is destroyed. This should only be used by implementations implementing their own read callbacks. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_set_read_func.rst000066400000000000000000000007061511661753600252440ustar00rootroot00000000000000:man_page: bson_reader_set_read_func bson_reader_set_read_func() =========================== Synopsis -------- .. code-block:: c void bson_reader_set_read_func (bson_reader_t *reader, bson_reader_read_func_t func); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. * ``func``: A :symbol:`bson_reader_read_func_t`. Description ----------- Sets the function to read more data from the underlying stream in a custom bson_reader_t. mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_t.rst000066400000000000000000000066351511661753600227150ustar00rootroot00000000000000:man_page: bson_reader_t bson_reader_t ============= Streaming BSON Document Reader Synopsis -------- .. code-block:: c #include typedef struct _bson_reader_t bson_reader_t; bson_reader_t * bson_reader_new_from_handle (void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); bson_reader_t * bson_reader_new_from_fd (int fd, bool close_on_destroy); bson_reader_t * bson_reader_new_from_file (const char *path, bson_error_t *error); bson_reader_t * bson_reader_new_from_data (const uint8_t *data, size_t length); void bson_reader_destroy (bson_reader_t *reader); Description ----------- :symbol:`bson_reader_t` is a structure used for reading a sequence of BSON documents. The sequence can come from a file-descriptor, memory region, or custom callbacks. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_reader_destroy bson_reader_destroy_func_t bson_reader_new_from_data bson_reader_new_from_fd bson_reader_new_from_file bson_reader_new_from_handle bson_reader_read bson_reader_read_func_t bson_reader_reset bson_reader_set_destroy_func bson_reader_set_read_func bson_reader_tell Example ------- .. code-block:: c /* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each BSON document contained in the provided files * as a JSON string to STDOUT. */ #include #include int main (int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; char *str; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf (stderr, "usage: %s [FILE | -]...\nUse - for STDIN.\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; if (strcmp (filename, "-") == 0) { reader = bson_reader_new_from_fd (STDIN_FILENO, false); } else { if (!(reader = bson_reader_new_from_file (filename, &error))) { fprintf ( stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read (reader, NULL))) { str = bson_as_canonical_extended_json (b, NULL); fprintf (stdout, "%s\n", str); bson_free (str); } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy (reader); } return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_reader_tell.rst000066400000000000000000000006071511661753600234030ustar00rootroot00000000000000:man_page: bson_reader_tell bson_reader_tell() ================== Synopsis -------- .. code-block:: c off_t bson_reader_tell (bson_reader_t *reader); Parameters ---------- * ``reader``: A :symbol:`bson_reader_t`. Description ----------- Tells the current position within the underlying stream. Returns ------- -1 on failure, otherwise the offset within the underlying stream. mongo-c-driver-2.2.1/src/libbson/doc/bson_realloc.rst000066400000000000000000000011611511661753600225360ustar00rootroot00000000000000:man_page: bson_realloc bson_realloc() ============== Synopsis -------- .. code-block:: c void * bson_realloc (void *mem, size_t num_bytes); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the new requested size. Description ----------- This is a portable ``realloc()`` wrapper. If ``num_bytes`` is 0, then the allocation will be freed. If there was a failure to allocate ``num_bytes`` bytes, the process will be aborted. .. warning:: This function will abort on failure to allocate memory. Returns ------- A pointer to a memory region which *HAS NOT* been zeroed. mongo-c-driver-2.2.1/src/libbson/doc/bson_realloc_ctx.rst000066400000000000000000000010171511661753600234140ustar00rootroot00000000000000:man_page: bson_realloc_ctx bson_realloc_ctx() ================== Synopsis -------- .. code-block:: c void * bson_realloc_ctx (void *mem, size_t num_bytes, void *ctx); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the requested size. * ``ctx``: A consumer-specific pointer or ``NULL``. Description ----------- This function is identical to :symbol:`bson_realloc()` except it takes a context parameter. This is useful when working with pooled or specific memory allocators. mongo-c-driver-2.2.1/src/libbson/doc/bson_realloc_func.rst000066400000000000000000000011441511661753600235520ustar00rootroot00000000000000:man_page: bson_realloc_func bson_realloc_func ================= Synopsis -------- .. code-block:: c typedef void *(*bson_realloc_func) (void *mem, size_t num_bytes, void *ctx); Parameters ---------- * ``mem``: A memory region. * ``num_bytes``: A size_t containing the requested size. * ``ctx``: A consumer-specific pointer or ``NULL``. Description ----------- This is a prototype for pluggable realloc functions used through the Libbson library. If you wish to use a custom allocator this is one way to do it. Additionally, :symbol:`bson_realloc_ctx()` is a default implementation of this prototype. mongo-c-driver-2.2.1/src/libbson/doc/bson_reinit.rst000066400000000000000000000010531511661753600224070ustar00rootroot00000000000000:man_page: bson_reinit bson_reinit() ============= Synopsis -------- .. code-block:: c void bson_reinit (bson_t *b); Parameters ---------- * ``b``: A :symbol:`bson_t`. Description ----------- Reinitializes a :symbol:`bson_t`. If the :symbol:`bson_t` structure contains a malloc()'d buffer, it may be reused. To be certain that any buffer is freed, always call :symbol:`bson_destroy` on any :symbol:`bson_t` structure, whether initialized or reinitialized, after its final use. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_reserve_buffer.rst000066400000000000000000000054541511661753600241320ustar00rootroot00000000000000:man_page: bson_reserve_buffer bson_reserve_buffer() ===================== Synopsis -------- .. code-block:: c uint8_t * bson_reserve_buffer (bson_t *bson, uint32_t total_size); Parameters ---------- * ``bson``: An initialized :symbol:`bson_t`. * ``total_size``: The length in bytes of the new buffer. Description ----------- Grow the internal buffer of ``bson`` to ``total_size`` and set the document length to ``total_size``. Useful for eliminating copies when reading BSON bytes from a stream. First, initialize ``bson`` with :symbol:`bson_init` or :symbol:`bson_new`, then call this function. After it returns, the length of ``bson`` is set to ``total_size`` but its contents are uninitialized memory: you must fill the contents with a BSON document of the correct length before any other operations. The document must be freed with :symbol:`bson_destroy`. Note that, in this usage, the BSON header and footer bytes will not be verified or used by Libbson. The ``bson_t`` document length and buffer size limit are both set to ``total_size`` regardless of the value encoded in the document header. Returns ------- A pointer to the internal buffer, which is at least ``total_size`` bytes, or NULL if the space could not be allocated. Example ------- Use ``bson_reserve_buffer`` to write a function that takes a :symbol:`bson_t` pointer and reads a file into it directly: .. code-block:: c #include #include bool read_into (bson_t *bson, FILE *fp) { uint8_t *buffer; long size; if (fseek (fp, 0L, SEEK_END) < 0) { perror ("Couldn't get file size"); return 1; } size = ftell (fp); if (size == EOF) { perror ("Couldn't get file size"); return 1; } if (size > INT32_MAX) { fprintf (stderr, "File too large\n"); return 1; } /* reserve buffer space - bson is temporarily invalid */ buffer = bson_reserve_buffer (bson, (uint32_t) size); if (!buffer) { fprintf (stderr, "Couldn't reserve %ld bytes", size); return false; } /* read file directly into the buffer */ rewind (fp); if (fread ((void *) buffer, 1, (size_t) size, fp) < (size_t) size) { perror ("Couldn't read file"); return false; } return true; } int main () { FILE *fp; char *json; /* stack-allocated, initialized bson_t */ bson_t bson = BSON_INITIALIZER; if (!(fp = fopen ("document.bson", "rb"))) { perror ("Couldn't read file"); return 1; } read_into (&bson, fp); fclose (fp); json = bson_as_canonical_extended_json (&bson, NULL); printf ("%s\n", json); bson_free (json); bson_destroy (&bson); return 0; } .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_set_error.rst000066400000000000000000000010431511661753600231200ustar00rootroot00000000000000:man_page: bson_set_error bson_set_error() ================ Synopsis -------- .. code-block:: c void bson_set_error ( bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...); Parameters ---------- * ``error``: A :symbol:`bson_error_t`. * ``domain``: A ``uint32_t``. * ``code``: A ``uint32_t``. * ``format``: A ``printf()`` style format string. Description ----------- This is a helper function to set the parameters of a :symbol:`bson_error_t`. It handles the case where ``error`` is NULL by doing nothing. mongo-c-driver-2.2.1/src/libbson/doc/bson_sized_new.rst000066400000000000000000000011551511661753600231070ustar00rootroot00000000000000:man_page: bson_sized_new bson_sized_new() ================ Synopsis -------- .. code-block:: c bson_t * bson_sized_new (size_t size); Parameters ---------- * ``size``: The size to pre-allocate for the underlying buffer. Description ----------- The :symbol:`bson_sized_new()` function shall create a new :symbol:`bson_t` on the heap with a preallocated buffer. This is useful if you have a good idea of the size of the resulting document. Returns ------- A newly allocated :symbol:`bson_t` that should be freed with :symbol:`bson_destroy()`. .. only:: html .. include:: includes/seealso/create-bson.txt mongo-c-driver-2.2.1/src/libbson/doc/bson_snprintf.rst000066400000000000000000000007651511661753600227710ustar00rootroot00000000000000:man_page: bson_snprintf bson_snprintf() =============== Synopsis -------- .. code-block:: c int bson_snprintf (char *str, size_t size, const char *format, ...); Parameters ---------- * ``str``: The destination buffer. * ``size``: The size of ``str``. * ``format``: A printf style format string. Description ----------- This is a portable wrapper around ``snprintf()``. It also enforces a trailing ``\0`` in the resulting string. Returns ------- The number of bytes written to ``str``. mongo-c-driver-2.2.1/src/libbson/doc/bson_steal.rst000066400000000000000000000033221511661753600222260ustar00rootroot00000000000000:man_page: bson_steal bson_steal() ============ Synopsis -------- .. code-block:: c bool bson_steal (bson_t *dst, bson_t *src); Parameters ---------- * ``dst``: An uninitialized :symbol:`bson_t`. * ``src``: A :symbol:`bson_t`. Description ----------- Efficiently transfer the contents of ``src`` to ``dst`` and destroy ``src``. Before calling this function, ``src`` must be initialized and ``dst`` must be uninitialized. After this function returns successfully, ``src`` is destroyed, and ``dst`` is initialized and must be freed with :symbol:`bson_destroy`. For example, if you have a higher-level structure that wraps a :symbol:`bson_t`, use ``bson_steal`` to transfer BSON data into it: .. code-block:: c typedef struct { bson_t bson; } bson_wrapper_t; bson_wrapper_t * wrap_bson (bson_t *b) { bson_wrapper_t *wrapper = bson_malloc (sizeof (bson_wrapper_t)); if (bson_steal (&wrapper->bson, b)) { return wrapper; } bson_free (wrapper); return NULL; } void bson_wrapper_destroy (bson_wrapper_t *wrapper) { bson_destroy (&wrapper->bson); bson_free (wrapper); } int main (int argc, char *argv[]) { bson_t bson = BSON_INITIALIZER; bson_wrapper_t *wrapper; BSON_APPEND_UTF8 (&bson, "key", "value"); /* now "bson" is destroyed */ wrapper = wrap_bson (&bson); /* clean up */ bson_wrapper_destroy (wrapper); } Returns ------- Returns ``true`` if ``src`` was successfully moved to ``dst``, ``false`` if ``src`` is invalid, or was statically initialized, or another error occurred. .. seealso:: | :symbol:`bson_destroy_with_steal`, a lower-level function that returns the raw contents of a :symbol:`bson_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_strcasecmp.rst000066400000000000000000000007521511661753600232660ustar00rootroot00000000000000:man_page: bson_strcasecmp bson_strcasecmp() ================= Synopsis -------- .. code-block:: c int bson_strcasecmp (const char *s1, const char *s2); Parameters ---------- * ``s1``: A string. * ``s2``: A string. Description ----------- A portable version of ``strcasecmp()``. Returns ------- Returns a negative integer if s1 sorts lexicographically before s2, a positive integer if it sorts after, or 0 if they are equivalent, after translating both strings to lower case. mongo-c-driver-2.2.1/src/libbson/doc/bson_strdup.rst000066400000000000000000000005541511661753600224430ustar00rootroot00000000000000:man_page: bson_strdup bson_strdup() ============= Synopsis -------- .. code-block:: c char * bson_strdup (const char *str); Parameters ---------- * ``str``: A string. Description ----------- Copies ``str`` into a new string. If ``str`` is NULL, then NULL is returned. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-2.2.1/src/libbson/doc/bson_strdup_printf.rst000066400000000000000000000006521511661753600240240ustar00rootroot00000000000000:man_page: bson_strdup_printf bson_strdup_printf() ==================== Synopsis -------- .. code-block:: c char * bson_strdup_printf (const char *format, ...); Parameters ---------- * ``format``: A printf style format string. Description ----------- This function performs a printf style format but into a newly allocated string. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-2.2.1/src/libbson/doc/bson_strdupv_printf.rst000066400000000000000000000007311511661753600242100ustar00rootroot00000000000000:man_page: bson_strdupv_printf bson_strdupv_printf() ===================== Synopsis -------- .. code-block:: c char * bson_strdupv_printf (const char *format, va_list args); Parameters ---------- * ``format``: A printf style format string. * ``args``: A va_list. Description ----------- This function is like :symbol:`bson_strdup_printf()` except takes a va_list of parameters. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-2.2.1/src/libbson/doc/bson_strerror_r.rst000066400000000000000000000007051511661753600233230ustar00rootroot00000000000000:man_page: bson_strerror_r bson_strerror_r() ================= Synopsis -------- .. code-block:: c char * bson_strerror_r (int err_code, char *buf, size_t buflen); Parameters ---------- * ``err_code``: An errno. * ``buf``: A location to store the string. * ``buflen``: The size of ``buf``. Description ----------- This is a portability wrapper around ``strerror()``. Returns ------- The passed in ``buf`` parameter or an internal string. mongo-c-driver-2.2.1/src/libbson/doc/bson_strfreev.rst000066400000000000000000000005431511661753600227600ustar00rootroot00000000000000:man_page: bson_strfreev bson_strfreev() =============== Synopsis -------- .. code-block:: c void bson_strfreev (char **strv); Parameters ---------- * ``strv``: A NULL-terminated array of strings to free, including the array. Description ----------- This will free each string in a NULL-terminated array of strings and then the array itself. mongo-c-driver-2.2.1/src/libbson/doc/bson_strncpy.rst000066400000000000000000000016201511661753600226170ustar00rootroot00000000000000:man_page: bson_strncpy bson_strncpy() ============== Synopsis -------- .. code-block:: c void bson_strncpy (char *dst, const char *src, size_t size); Parameters ---------- * ``dst``: The destination buffer. * ``src``: The src buffer. * ``size``: The number of bytes to copy into dst, which must be at least that size. Description ----------- Copies up to ``size`` bytes from ``src`` into ``dst``. ``dst`` must be at least ``size`` bytes in size. A trailing ``\0`` is always set. Does nothing if ``size`` is zero. ``bson_strncpy`` matches the behavior of the C11 standard ``strncpy_s``, rather than ``strncpy``. This means that ``bson_strncpy`` always writes a null terminator to ``dst``, even if ``dst`` is too short to fit the entire string from ``src``. If there is additional space left in ``dst`` after copying ``src``, ``bson_strncpy`` does not fill the remaining space with null characters. mongo-c-driver-2.2.1/src/libbson/doc/bson_strndup.rst000066400000000000000000000006771511661753600226270ustar00rootroot00000000000000:man_page: bson_strndup bson_strndup() ============== Synopsis -------- .. code-block:: c char * bson_strndup (const char *str, size_t n_bytes); Parameters ---------- * ``str``: A string to copy. * ``n_bytes``: A size_t. Description ----------- Allocates a new string and copies up to ``n_bytes`` from ``str`` into it. A trailing ``\0`` is always set. Returns ------- A newly allocated string that should be freed with bson_free(). mongo-c-driver-2.2.1/src/libbson/doc/bson_strnlen.rst000066400000000000000000000006111511661753600226010ustar00rootroot00000000000000:man_page: bson_strnlen bson_strnlen() ============== Synopsis -------- .. code-block:: c size_t bson_strnlen (const char *s, size_t maxlen); Parameters ---------- * ``s``: A string. * ``maxlen``: The maximum size of string to check. Description ----------- A portable version of ``strnlen()``. Returns ------- The length of ``s`` in bytes or ``maxlen`` if no ``\0`` was found. mongo-c-driver-2.2.1/src/libbson/doc/bson_subtype_t.rst000066400000000000000000000016651511661753600231440ustar00rootroot00000000000000:man_page: bson_subtype_t bson_subtype_t ============== Binary Field Subtype Synopsis -------- .. code-block:: c #include typedef enum { BSON_SUBTYPE_BINARY = 0x00, BSON_SUBTYPE_FUNCTION = 0x01, BSON_SUBTYPE_BINARY_DEPRECATED = 0x02, BSON_SUBTYPE_UUID_DEPRECATED = 0x03, BSON_SUBTYPE_UUID = 0x04, BSON_SUBTYPE_MD5 = 0x05, BSON_SUBTYPE_COLUMN = 0x07, BSON_SUBTYPE_SENSITIVE = 0x08, BSON_SUBTYPE_VECTOR = 0x09, BSON_SUBTYPE_USER = 0x80, } bson_subtype_t; Description ----------- This enumeration contains the various subtypes that may be used in a binary field. See `http://bsonspec.org `_ for more information. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c bson_t doc = BSON_INITIALIZER; BSON_APPEND_BINARY (&doc, "binary", BSON_SUBTYPE_BINARY, data, data_len); mongo-c-driver-2.2.1/src/libbson/doc/bson_t.rst000066400000000000000000000155241511661753600213700ustar00rootroot00000000000000:man_page: bson_t bson_t ====== BSON Document Abstraction Synopsis -------- .. code-block:: c #include /** * bson_empty: * @b: a bson_t. * * Checks to see if @b is an empty BSON document. An empty BSON document is * a 5 byte document which contains the length (4 bytes) and a single NUL * byte indicating end of fields. */ #define bson_empty(b) /* ... */ /** * bson_empty0: * * Like bson_empty() but treats NULL the same as an empty bson_t document. */ #define bson_empty0(b) /* ... */ /** * bson_clear: * * Easily free a bson document and set it to NULL. Use like: * * bson_t *doc = bson_new(); * bson_clear (&doc); * BSON_ASSERT (doc == NULL); */ #define bson_clear(bptr) /* ... */ /** * BSON_MAX_SIZE: * * The maximum size in bytes of a BSON document. */ #define BSON_MAX_SIZE /* ... */ #define BSON_APPEND_ARRAY(b, key, val) \ bson_append_array (b, key, (int) strlen (key), val) #define BSON_APPEND_ARRAY_BEGIN(b, key, child) \ bson_append_array_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_BINARY(b, key, subtype, val, len) \ bson_append_binary (b, key, (int) strlen (key), subtype, val, len) #define BSON_APPEND_BINARY_UNINIT(b, key, subtype, val, len) \ bson_append_binary_uninit (b, key, (int) strlen (key), subtype, val, len) #define BSON_APPEND_BOOL(b, key, val) \ bson_append_bool (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE(b, key, val) \ bson_append_code (b, key, (int) strlen (key), val) #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope (b, key, (int) strlen (key), val, scope) #define BSON_APPEND_DBPOINTER(b, key, coll, oid) \ bson_append_dbpointer (b, key, (int) strlen (key), coll, oid) #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) \ bson_append_document_begin (b, key, (int) strlen (key), child) #define BSON_APPEND_DOUBLE(b, key, val) \ bson_append_double (b, key, (int) strlen (key), val) #define BSON_APPEND_DOCUMENT(b, key, val) \ bson_append_document (b, key, (int) strlen (key), val) #define BSON_APPEND_INT32(b, key, val) \ bson_append_int32 (b, key, (int) strlen (key), val) #define BSON_APPEND_INT64(b, key, val) \ bson_append_int64 (b, key, (int) strlen (key), val) #define BSON_APPEND_MINKEY(b, key) \ bson_append_minkey (b, key, (int) strlen (key)) #define BSON_APPEND_DECIMAL128(b, key, val) \ bson_append_decimal128 (b, key, (int) strlen (key), val) #define BSON_APPEND_MAXKEY(b, key) \ bson_append_maxkey (b, key, (int) strlen (key)) #define BSON_APPEND_NULL(b, key) bson_append_null (b, key, (int) strlen (key)) #define BSON_APPEND_OID(b, key, val) \ bson_append_oid (b, key, (int) strlen (key), val) #define BSON_APPEND_REGEX(b, key, val, opt) \ bson_append_regex (b, key, (int) strlen (key), val, opt) #define BSON_APPEND_UTF8(b, key, val) \ bson_append_utf8 (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_SYMBOL(b, key, val) \ bson_append_symbol (b, key, (int) strlen (key), val, (int) strlen (val)) #define BSON_APPEND_TIME_T(b, key, val) \ bson_append_time_t (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMEVAL(b, key, val) \ bson_append_timeval (b, key, (int) strlen (key), val) #define BSON_APPEND_DATE_TIME(b, key, val) \ bson_append_date_time (b, key, (int) strlen (key), val) #define BSON_APPEND_TIMESTAMP(b, key, val, inc) \ bson_append_timestamp (b, key, (int) strlen (key), val, inc) #define BSON_APPEND_UNDEFINED(b, key) \ bson_append_undefined (b, key, (int) strlen (key)) #define BSON_APPEND_VALUE(b, key, val) \ bson_append_value (b, key, (int) strlen (key), (val)) typedef struct { uint32_t flags; /* Internal flags for the bson_t. */ uint32_t len; /* Length of BSON data. */ uint8_t padding[120]; /* Padding for stack allocation. */ } bson_t; Description ----------- The :symbol:`bson_t` structure represents a BSON document. This structure manages the underlying BSON encoded buffer. For mutable documents, it can append new data to the document. Performance Notes ----------------- The :symbol:`bson_t` structure attempts to use an inline allocation within the structure to speed up performance of small documents. When this internal buffer has been exhausted, a heap allocated buffer will be dynamically allocated. Therefore, it is essential to call :symbol:`bson_destroy()` on allocated documents. Duplicate Keys -------------- The `BSON specification `_ allows BSON documents to have duplicate keys. Documents are stored as an ordered list of key-value pairs. A :symbol:`bson_t` may contain duplicate keys. Applications should refrain from generating such documents, because MongoDB server behavior is undefined when a BSON document contains duplicate keys. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_append_array bson_append_array_begin bson_append_array_end bson_append_binary bson_append_binary_uninit bson_append_bool bson_append_code bson_append_code_with_scope bson_append_date_time bson_append_dbpointer bson_append_decimal128 bson_append_document bson_append_document_begin bson_append_document_end bson_append_double bson_append_int32 bson_append_int64 bson_append_iter bson_append_maxkey bson_append_minkey bson_append_now_utc bson_append_null bson_append_oid bson_append_regex bson_append_regex_w_len bson_append_symbol bson_append_time_t bson_append_timestamp bson_append_timeval bson_append_undefined bson_append_utf8 bson_append_value bson_array_as_canonical_extended_json bson_array_as_legacy_extended_json bson_array_as_relaxed_extended_json bson_as_canonical_extended_json bson_as_json_with_opts bson_as_legacy_extended_json bson_as_relaxed_extended_json bson_compare bson_concat bson_copy bson_copy_to bson_copy_to_excluding_noinit bson_copy_to_excluding_noinit_va bson_count_keys bson_destroy bson_destroy_with_steal bson_equal bson_get_data bson_has_field bson_init bson_init_from_json bson_init_static bson_json_mode_t bson_json_opts_t bson_new bson_new_from_buffer bson_new_from_data bson_new_from_json bson_reinit bson_reserve_buffer bson_sized_new bson_steal bson_validate bson_validate_with_error bson_validate_with_error_and_offset Example ------- .. code-block:: c static void create_on_heap (void) { bson_t *b = bson_new (); BSON_APPEND_INT32 (b, "foo", 123); BSON_APPEND_UTF8 (b, "bar", "foo"); BSON_APPEND_DOUBLE (b, "baz", 1.23f); bson_destroy (b); } mongo-c-driver-2.2.1/src/libbson/doc/bson_type_t.rst000066400000000000000000000024641511661753600224300ustar00rootroot00000000000000:man_page: bson_type_t bson_type_t =========== BSON Type Enumeration Synopsis -------- .. code-block:: c #include typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_DECIMAL128 = 0x13, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; Description ----------- The :symbol:`bson_type_t` enumeration contains all of the types from the `BSON Specification `_. It can be used to determine the type of a field at runtime. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c bson_iter_t iter; if (bson_iter_init_find (&iter, doc, "foo") && (BSON_TYPE_INT32 == bson_iter_type (&iter))) { printf ("'foo' is an int32.\n"); } mongo-c-driver-2.2.1/src/libbson/doc/bson_uint32_to_string.rst000066400000000000000000000024061511661753600243340ustar00rootroot00000000000000:man_page: bson_uint32_to_string bson_uint32_to_string() ======================= Synopsis -------- .. code-block:: c size_t bson_uint32_to_string (uint32_t value, const char **strptr, char *str, size_t size); Parameters ---------- * ``value``: A uint32_t. * ``strptr``: A location for the resulting string pointer. * ``str``: A location to buffer the string. * ``size``: A size_t containing the size of ``str``. Description ----------- Converts ``value`` to a string. If ``value`` is from 0 to 999, it will use a constant string in the data section of the library. If not, a string will be formatted using ``str`` and ``snprintf()``. ``strptr`` will always be set. It will either point to ``str`` or a constant string. Use this as your key. Array Element Key Building -------------------------- Each element in a BSON array has a monotonic string key like ``"0"``, ``"1"``, etc. This function is optimized for generating such string keys. .. code-block:: c char str[16]; const char *key; uint32_t i; for (i = 0; i < 10; i++) { bson_uint32_to_string (i, &key, str, sizeof str); printf ("Key: %s\n", key); } Returns ------- The number of bytes in the resulting string. mongo-c-driver-2.2.1/src/libbson/doc/bson_unichar_t.rst000066400000000000000000000014221511661753600230710ustar00rootroot00000000000000:man_page: bson_unichar_t bson_unichar_t ============== Unicode Character Abstraction Synopsis -------- .. code-block:: c typedef uint32_t bson_unichar_t; Description ----------- :symbol:`bson_unichar_t` provides an abstraction on a single unicode character. It is the 32-bit representation of a character. As UTF-8 can contain multi-byte characters, this should be used when iterating through UTF-8 text. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Example ------- .. code-block:: c static void print_each_char (const char *str) { bson_unichar_t c; for (; *str; str = bson_utf8_next_char (str)) { c = bson_utf8_get_char (str); printf ("The numberic value is %u.\n", (unsigned) c); } } mongo-c-driver-2.2.1/src/libbson/doc/bson_utf8_escape_for_json.rst000066400000000000000000000020361511661753600252240ustar00rootroot00000000000000:man_page: bson_utf8_escape_for_json bson_utf8_escape_for_json() =========================== Synopsis -------- .. code-block:: c char * bson_utf8_escape_for_json (const char *utf8, ssize_t utf8_len); Parameters ---------- * ``utf8``: A UTF-8 encoded string. * ``utf8_len``: The length of ``utf8`` in bytes or -1 if it is NULL terminated. Description ----------- Allocates a new string matching ``utf8`` except that special characters in JSON are escaped. The resulting string is also UTF-8 encoded. Both " and \\ characters will be backslash-escaped. If a NUL byte is found before ``utf8_len`` bytes, it is converted to "\\u0000". Other non-ASCII characters in the input are preserved. The two-byte sequence "C0 80" is also interpreted as an internal NUL, for historical reasons. This sequence is considered invalid according to RFC3629. Returns ------- A newly allocated string that should be freed with :symbol:`bson_free()` when ``utf8`` is a valid UTF-8 string, or ``NULL`` if the (possibly invalid UTF-8) string could not be escaped.mongo-c-driver-2.2.1/src/libbson/doc/bson_utf8_from_unichar.rst000066400000000000000000000010731511661753600245410ustar00rootroot00000000000000:man_page: bson_utf8_from_unichar bson_utf8_from_unichar() ======================== Synopsis -------- .. code-block:: c void bson_utf8_from_unichar (bson_unichar_t unichar, char utf8[6], uint32_t *len); Parameters ---------- * ``unichar``: A :symbol:`bson_unichar_t`. * ``utf8``: A location for the utf8 sequence. * ``len``: A location for the number of bytes in the resulting utf8 sequence. Description ----------- Converts a single unicode character to a multi-byte UTF-8 sequence. The result is stored in ``utf8`` and the number of bytes used in ``len``. mongo-c-driver-2.2.1/src/libbson/doc/bson_utf8_get_char.rst000066400000000000000000000006561511661753600236470ustar00rootroot00000000000000:man_page: bson_utf8_get_char bson_utf8_get_char() ==================== Synopsis -------- .. code-block:: c bson_unichar_t bson_utf8_get_char (const char *utf8); Parameters ---------- * ``utf8``: A validated UTF-8 encoded string. Description ----------- Converts the current character in a UTF-8 sequence to a bson_unichar_t, the 32-bit representation of the multi-byte character. Returns ------- A bson_unichar_t. mongo-c-driver-2.2.1/src/libbson/doc/bson_utf8_next_char.rst000066400000000000000000000011141511661753600240340ustar00rootroot00000000000000:man_page: bson_utf8_next_char bson_utf8_next_char() ===================== Synopsis -------- .. code-block:: c const char * bson_utf8_next_char (const char *utf8); Parameters ---------- * ``utf8``: A UTF-8 encoded string. Description ----------- Advances within ``utf8`` to the next UTF-8 character, which may be multiple bytes offset from ``utf8``. A pointer to the next character is returned. It is invalid to call this function on a string whose current character is ``\0``. Returns ------- A pointer to the beginning of the next character in the UTF-8 encoded string. mongo-c-driver-2.2.1/src/libbson/doc/bson_utf8_validate.rst000066400000000000000000000011571511661753600236610ustar00rootroot00000000000000:man_page: bson_utf8_validate bson_utf8_validate() ==================== Synopsis -------- .. code-block:: c bool bson_utf8_validate (const char *utf8, size_t utf8_len, bool allow_null); Parameters ---------- * ``utf8``: A string to verify. * ``utf8_len``: The length of ``utf8`` in bytes. * ``allow_null``: A bool indicating that embedded ``\0`` bytes are allowed. Description ----------- Validates that the content within ``utf8`` is valid UTF-8 (by the RFC 3629 standard). If ``allow_null`` is ``true``, then embedded NULL bytes are allowed (``\0``). Returns ------- true if ``utf8`` contains valid UTF-8. mongo-c-driver-2.2.1/src/libbson/doc/bson_validate.rst000066400000000000000000000022741511661753600227140ustar00rootroot00000000000000:man_page: bson_validate bson_validate() =============== Synopsis -------- .. code-block:: c bool bson_validate (const bson_t *bson, bson_validate_flags_t flags, size_t *offset); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``flags``: A bitwise-or of all desired :symbol:`bson_validate_flags_t`. * ``offset``: Optional location where the error offset will be written. Description ----------- Validates a BSON document by walking through the document and inspecting the keys and values for valid content. You can modify how the validation occurs through the use of the ``flags`` parameter, see :symbol:`bson_validate_flags_t` for details. Returns ------- If ``bson`` passes the requested validations, returns true. Otherwise, returns false and if ``offset`` is non-`NULL` it will be written with the byte offset in the document where an error was detected. To get more information about the specific validation failure, use :symbol:`bson_validate_with_error_and_offset()` instead. .. seealso:: | :symbol:`bson_validate_with_error()`, :symbol:`bson_validate_with_error_and_offset()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-2.2.1/src/libbson/doc/bson_validate_flags_t.rst000066400000000000000000000045571511661753600244210ustar00rootroot00000000000000:man_page: bson_validate_flags_t bson_validate_flags_t ===================== Document validation options Synopsis -------- .. code-block:: c #include typedef enum { BSON_VALIDATE_NONE = 0, BSON_VALIDATE_UTF8 = (1 << 0), BSON_VALIDATE_DOLLAR_KEYS = (1 << 1), BSON_VALIDATE_DOT_KEYS = (1 << 2), BSON_VALIDATE_UTF8_ALLOW_NULL = (1 << 3), BSON_VALIDATE_EMPTY_KEYS = (1 << 4), BSON_VALIDATE_CORRUPT = (1 << 5), } bson_validate_flags_t; Description ----------- ``bson_validate_flags_t`` is a set of binary flags which may be combined to specify a level of BSON document validation. A value of ``0``, ``false``, or ``BSON_VALIDATE_NONE`` equivalently requests the minimum applicable level of validation. In the context of validation APIs :symbol:`bson_validate()`, :symbol:`bson_validate_with_error()`, and :symbol:`bson_validate_with_error_and_offset()` the minimum validation still guarantees that a document can be successfully traversed by :symbol:`bson_iter_visit_all()`. Higher level APIs using this type may have different minimum validation levels. For example, ``libmongoc`` functions that take ``bson_validate_flags_t`` use ``0`` to mean the document contents are not visited and malformed headers will not be detected by the client. Each defined flag aside from ``BSON_VALIDATE_NONE`` describes an optional validation feature that may be enabled, alone or in combination with other features: * ``BSON_VALIDATE_NONE`` Minimum level of validation; in ``libbson``, validates element headers. * ``BSON_VALIDATE_UTF8`` All keys and string values are checked for invalid UTF-8. * ``BSON_VALIDATE_UTF8_ALLOW_NULL`` String values are allowed to have embedded NULL bytes. This has no effect unless ``BSON_VALIDATE_UTF8`` is also passed. * ``BSON_VALIDATE_DOLLAR_KEYS`` Prohibit keys that start with ``$`` outside of a "DBRef" subdocument. * ``BSON_VALIDATE_DOT_KEYS`` Prohibit keys that contain ``.`` anywhere in the string. * ``BSON_VALIDATE_EMPTY_KEYS`` Prohibit zero-length keys. * ``BSON_VALIDATE_CORRUPT`` is not a control flag, but is used as an error code when a validation routine encounters corrupt BSON data. .. seealso:: | :symbol:`bson_validate()`, :symbol:`bson_validate_with_error()`, :symbol:`bson_validate_with_error_and_offset()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-2.2.1/src/libbson/doc/bson_validate_with_error.rst000066400000000000000000000031521511661753600251540ustar00rootroot00000000000000:man_page: bson_validate_with_error bson_validate_with_error() ========================== Synopsis -------- .. code-block:: c bool bson_validate_with_error (const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error); Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``flags``: A bitwise-or of all desired :symbol:`bson_validate_flags_t`. * ``error``: Optional :symbol:`bson_error_t`. Description ----------- Validates a BSON document by walking through the document and inspecting the keys and values for valid content. You can modify how the validation occurs through the use of the ``flags`` parameter, see :symbol:`bson_validate_flags_t` for details. Returns ------- If ``bson`` passes the requested validations, returns true. Otherwise, returns false and if ``error`` is non-`NULL` it will be filled out with details. The :symbol:`bson_error_t` domain is set to ``BSON_ERROR_INVALID``. Its code is set to one of the ``bson_validate_flags_t`` flags indicating which validation failed; for example, if a key contains invalid UTF-8, then the code is set to ``BSON_VALIDATE_UTF8``, but if the basic structure of the BSON document is corrupt, the code is set to ``BSON_VALIDATE_NONE``. The error message is filled out, and gives more detail if possible. To get the specific location of the error, use :symbol:`bson_validate_with_error_and_offset()` instead. .. seealso:: | :symbol:`bson_validate()`, :symbol:`bson_validate_with_error_and_offset()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-2.2.1/src/libbson/doc/bson_validate_with_error_and_offset.rst000066400000000000000000000033661511661753600273530ustar00rootroot00000000000000:man_page: bson_validate_with_error_and_offset bson_validate_with_error_and_offset() ===================================== Synopsis -------- .. code-block:: c bool bson_validate_with_error_and_offset (const bson_t *bson, bson_validate_flags_t flags, size_t *offset, bson_error_t *error) Parameters ---------- * ``bson``: A :symbol:`bson_t`. * ``flags``: A bitwise-or of all desired :symbol:`bson_validate_flags_t`. * ``offset``: Optional location where the error offset will be written. * ``error``: Optional :symbol:`bson_error_t`. Description ----------- Validates a BSON document by walking through the document and inspecting the keys and values for valid content. You can modify how the validation occurs through the use of the ``flags`` parameter, see :symbol:`bson_validate_flags_t` for details. Returns ------- If ``bson`` passes the requested validations, returns true. Otherwise, returns false and writes each non-`NULL` output parameter: ``offset`` with the byte offset of the detected error and ``error`` with the details. The :symbol:`bson_error_t` domain is set to ``BSON_ERROR_INVALID``. Its code is set to one of the ``bson_validate_flags_t`` flags indicating which validation failed; for example, if a key contains invalid UTF-8, then the code is set to ``BSON_VALIDATE_UTF8``, but if the basic structure of the BSON document is corrupt, the code is set to ``BSON_VALIDATE_NONE``. The error message is filled out, and gives more detail if possible. .. seealso:: | :symbol:`bson_validate()`, :symbol:`bson_validate_with_error()`. | :symbol:`bson_visitor_t` can be used for custom validation, :ref:`example_custom_validation`. mongo-c-driver-2.2.1/src/libbson/doc/bson_value_copy.rst000066400000000000000000000014321511661753600232640ustar00rootroot00000000000000:man_page: bson_value_copy bson_value_copy() ================= Synopsis -------- .. code-block:: c void bson_value_copy (const bson_value_t *src, bson_value_t *dst); Parameters ---------- * ``src``: A :symbol:`bson_value_t` to copy from. * ``dst``: A :symbol:`bson_value_t` to copy into. Description ----------- This function will copy the boxed content in ``src`` into ``dst``. ``dst`` must be freed with :symbol:`bson_value_destroy()` when no longer in use. ``dst`` *MUST* be an uninitialized :symbol:`bson_value_t` to avoid leaking memory. .. note:: If ``src`` represents a BSON UTF-8 string, :symbol:`bson_value_copy` attempts to NULL terminate the copied string in ``dst``. If ``src.value.v_utf8.len`` is `SIZE_MAX`, the copied string is (necessarily) not NULL terminated. mongo-c-driver-2.2.1/src/libbson/doc/bson_value_destroy.rst000066400000000000000000000005211511661753600240010ustar00rootroot00000000000000:man_page: bson_value_destroy bson_value_destroy() ==================== Synopsis -------- .. code-block:: c void bson_value_destroy (bson_value_t *value); Parameters ---------- * ``value``: A :symbol:`bson_value_t`. Description ----------- Releases any resources associated with ``value``. Does nothing if ``value`` is NULL. mongo-c-driver-2.2.1/src/libbson/doc/bson_value_t.rst000066400000000000000000000035201511661753600225550ustar00rootroot00000000000000:man_page: bson_value_t bson_value_t ============ BSON Boxed Container Type Synopsis -------- .. code-block:: c #include typedef struct _bson_value_t { bson_type_t value_type; union { bson_oid_t v_oid; int64_t v_int64; int32_t v_int32; int8_t v_int8; double v_double; bool v_bool; int64_t v_datetime; struct { uint32_t timestamp; uint32_t increment; } v_timestamp; struct { uint32_t len; char *str; } v_utf8; struct { uint32_t data_len; uint8_t *data; } v_doc; struct { uint32_t data_len; uint8_t *data; bson_subtype_t subtype; } v_binary; struct { char *regex; char *options; } v_regex; struct { char *collection; uint32_t collection_len; bson_oid_t oid; } v_dbpointer; struct { uint32_t code_len; char *code; } v_code; struct { uint32_t code_len; char *code; uint32_t scope_len; uint8_t *scope_data; } v_codewscope; struct { uint32_t len; char *symbol; } v_symbol; bson_decimal128_t v_decimal128; } value; } bson_value_t; Description ----------- The :symbol:`bson_value_t` structure is a boxed type for encapsulating a runtime determined type. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_value_copy bson_value_destroy Example ------- .. code-block:: c const bson_value_t *value; value = bson_iter_value (&iter); if (value->value_type == BSON_TYPE_INT32) { printf ("%d\n", value->value.v_int32); } mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_error_code_t.rst000066400000000000000000000023601511661753600251470ustar00rootroot00000000000000:man_page: bson_vector_error_code_t bson_vector_error_code_t ======================== BSON Error codes for :doc:`binary_vector` operations that could fail in multiple ways. Synopsis -------- .. code-block:: c #define BSON_ERROR_VECTOR 4 typedef enum { BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE = 1, BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE = 2, BSON_VECTOR_ERROR_ARRAY_KEY = 3, BSON_VECTOR_ERROR_MAX_SIZE = 4, } bson_vector_error_code_t; Description ----------- The error ``code`` values in ``bson_vector_error_code_t`` apply to :symbol:`bson_error_t` values with a ``category`` of ``BSON_ERROR_CATEGORY`` and a ``domain`` of ``BSON_ERROR_VECTOR``. * ``BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE``: An element was encountered with incorrect type. Location and type details in ``message``. * ``BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE``: An element was encountered with out-of-range value. Location and value details in ``message``. * ``BSON_VECTOR_ERROR_ARRAY_KEY``: An input BSON Array did not contain the expected numeric key value. Expected and actual keys in ``message``. * ``BSON_VECTOR_ERROR_MAX_SIZE``: The BSON maximum document size would be exceeded. Equivalent to a failure from ``bson_append_*`` functions that do not return an ``error``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_binary_data_length.rst000066400000000000000000000016041511661753600276510ustar00rootroot00000000000000:man_page: bson_vector_float32_binary_data_length bson_vector_float32_binary_data_length() ======================================== Calculate the size of a BSON Binary field that would be needed to store a Vector with the indicated number of ``float32`` elements. Synopsis -------- .. code-block:: c uint32_t bson_vector_float32_binary_data_length (size_t element_count); Parameters ---------- * ``element_count``: Number of elements, as a ``size_t``. Description ----------- Checks ``element_count`` against the maximum representable size, and calculates the required Binary size. Returns ------- On success, returns the required Binary size as a ``uint32_t`` greater than or equal to ``BSON_VECTOR_HEADER_LEN``. This length includes the 2-byte Vector header, but not the Binary subtype header or any other BSON headers. If the ``element_count`` is too large to represent, returns 0. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_const_view_from_iter.rst000066400000000000000000000022321511661753600302570ustar00rootroot00000000000000:man_page: bson_vector_float32_const_view_from_iter bson_vector_float32_const_view_from_iter() ========================================== Initialize a :symbol:`bson_vector_float32_const_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``float32`` element type. Synopsis -------- .. code-block:: c bool bson_vector_float32_const_view_from_iter (bson_vector_float32_const_view_t *view_out, const bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_float32_const_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``float32`` element type. On success, a :symbol:`bson_vector_float32_const_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or modified. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_float32_view_from_iter` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_const_view_init.rst000066400000000000000000000022541511661753600272400ustar00rootroot00000000000000:man_page: bson_vector_float32_const_view_init bson_vector_float32_const_view_init() ===================================== Initialize a :symbol:`bson_vector_float32_const_view_t` from a const ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_float32_const_view_init (bson_vector_float32_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_float32_const_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length and header of the provided binary data block will be checked for a valid Vector of ``float32`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_float32_const_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_float32_view_init` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_const_view_length.rst000066400000000000000000000012371511661753600275560ustar00rootroot00000000000000:man_page: bson_vector_float32_const_view_length bson_vector_float32_const_view_length() ======================================= Return the number of elements in a Vector referenced by a :symbol:`bson_vector_float32_const_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_float32_const_view_length (bson_vector_float32_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_const_view_t`. Description ----------- An element count is calculated from the view's stored binary block length. Returns ------- The number of elements, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_float32_view_length` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_const_view_read.rst000066400000000000000000000024421511661753600272070ustar00rootroot00000000000000:man_page: bson_vector_float32_const_view_read bson_vector_float32_const_view_read() ===================================== Copy a contiguous block of elements from a :symbol:`bson_vector_float32_const_view_t` into a C array of ``float``. Synopsis -------- .. code-block:: c bool bson_vector_float32_const_view_read (bson_vector_float32_const_view_t view, float *values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_const_view_t`. * ``values_out``: Location where the ``float`` elements will be read to. * ``element_count``: Number of elements to read. * ``vector_offset_elements``: The vector index of the first element to read. Description ----------- Elements are copied in bulk from the view to the provided output pointer. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``element_count`` elements into ``*values_out``. .. seealso:: | :symbol:`bson_vector_float32_view_read` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_const_view_t.rst000066400000000000000000000032231511661753600265350ustar00rootroot00000000000000:man_page: bson_vector_float32_const_view_t bson_vector_float32_const_view_t ================================ A reference to non-owned const BSON Binary data holding a valid Vector of ``float32`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_float32_const_view_t { /*< private >*/ } bson_vector_float32_const_view_t; Description ----------- :symbol:`bson_vector_float32_const_view_t` is a structure that acts as an opaque const reference to a block of memory that has been validated as a ``float32`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_float32_const_view_init bson_vector_float32_const_view_from_iter bson_vector_float32_const_view_length bson_vector_float32_const_view_read Example ------- .. code-block:: c bson_iter_t iter; bson_vector_float32_const_view_t view; if (bson_iter_init_find (&iter, &doc, "vector") && bson_vector_float32_const_view_from_iter (&view, &iter)) { size_t length = bson_vector_float32_const_view_length (view); printf ("Elements in 'vector':\n"); for (size_t i = 0; i < length; i++) { float element; BSON_ASSERT (bson_vector_float32_const_view_read (view, &element, 1, i)); printf (" [%d] = %f\n", (int) i, element); } } .. seealso:: | :symbol:`bson_vector_float32_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_as_const.rst000066400000000000000000000011741511661753600267000ustar00rootroot00000000000000:man_page: bson_vector_float32_view_as_const bson_vector_float32_view_as_const() =================================== Convert a :symbol:`bson_vector_float32_view_t` into a :symbol:`bson_vector_float32_const_view_t`. Synopsis -------- .. code-block:: c bson_vector_float32_const_view_t bson_vector_float32_view_as_const (bson_vector_float32_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_view_t`. Description ----------- This adds a ``const`` qualifier to the view without re-validating the underlying data. Returns ------- Always returns a :symbol:`bson_vector_float32_const_view_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_from_iter.rst000066400000000000000000000021561511661753600270560ustar00rootroot00000000000000:man_page: bson_vector_float32_view_from_iter bson_vector_float32_view_from_iter() ==================================== Initialize a :symbol:`bson_vector_float32_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``float32`` element type. Synopsis -------- .. code-block:: c bool bson_vector_float32_view_from_iter (bson_vector_float32_view_t *view_out, bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_float32_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``float32`` element type. On success, a :symbol:`bson_vector_float32_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or otherwise modified. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_float32_const_view_from_iter` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_init.rst000066400000000000000000000021621511661753600260300ustar00rootroot00000000000000:man_page: bson_vector_float32_view_init bson_vector_float32_view_init() =============================== Initialize a :symbol:`bson_vector_float32_view_t` from a mutable ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_float32_view_init (bson_vector_float32_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_float32_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length and header of the provided binary data block will be checked for a valid Vector of ``float32`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_float32_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_float32_const_view_init` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_length.rst000066400000000000000000000011731511661753600263470ustar00rootroot00000000000000:man_page: bson_vector_float32_view_length bson_vector_float32_view_length() ================================= Return the number of elements in a Vector referenced by a :symbol:`bson_vector_float32_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_float32_view_length (bson_vector_float32_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_view_t`. Description ----------- An element count is calculated from the view's stored binary block length. Returns ------- The number of elements, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_float32_const_view_length` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_read.rst000066400000000000000000000023541511661753600260030ustar00rootroot00000000000000:man_page: bson_vector_float32_view_read bson_vector_float32_view_read() =============================== Copy a contiguous block of elements from a :symbol:`bson_vector_float32_view_t` into a C array of ``float``. Synopsis -------- .. code-block:: c bool bson_vector_float32_view_read (bson_vector_float32_view_t view, float *values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_view_t`. * ``values_out``: Location where the ``float`` elements will be read to. * ``element_count``: Number of elements to read. * ``vector_offset_elements``: The vector index of the first element to read. Description ----------- Elements are copied in bulk from the view to the provided output pointer. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``element_count`` elements into ``*values_out``. .. seealso:: | :symbol:`bson_vector_float32_const_view_read` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_t.rst000066400000000000000000000030611511661753600253270ustar00rootroot00000000000000:man_page: bson_vector_float32_view_t bson_vector_float32_view_t ========================== A reference to mutable non-owned BSON Binary data holding a valid Vector of ``float32`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_float32_view_t { /*< private >*/ } bson_vector_float32_view_t; Description ----------- :symbol:`bson_vector_float32_view_t` is a structure that acts as an opaque reference to a block of memory that has been validated as a ``float32`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_float32_view_init bson_vector_float32_view_from_iter bson_vector_float32_view_as_const bson_vector_float32_view_length bson_vector_float32_view_read bson_vector_float32_view_write Example ------- .. code-block:: c static const float values[] = {1.0f, 2.0f, 3.0f}; const size_t values_count = sizeof values / sizeof values[0]; bson_vector_float32_view_t view; BSON_ASSERT (BSON_APPEND_VECTOR_FLOAT32_UNINIT (&doc, "vector", values_count, &view)); BSON_ASSERT (bson_vector_float32_view_write (view, values, values_count, 0)); .. seealso:: | :symbol:`bson_append_vector_float32_uninit` | :symbol:`bson_vector_float32_const_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_float32_view_write.rst000066400000000000000000000023211511661753600262140ustar00rootroot00000000000000:man_page: bson_vector_float32_view_write bson_vector_float32_view_write() ================================ Copy a contiguous block of elements from a C ``float`` array into a :symbol:`bson_vector_float32_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_float32_view_write (bson_vector_float32_view_t view, const float *values, size_t element_count, size_t vector_offset_elements) Parameters ---------- * ``view``: A valid :symbol:`bson_vector_float32_view_t`. * ``values``: Location where the ``float`` elements will be copied from. * ``element_count``: Number of elements to write. * ``vector_offset_elements``: The vector index of the first element to write. Description ----------- Elements are copied in bulk from the provided pointer into the view. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and writes to ``element_count`` elements in the Vector starting at ``vector_offset_elements``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_binary_data_length.rst000066400000000000000000000015651511661753600272670ustar00rootroot00000000000000:man_page: bson_vector_int8_binary_data_length bson_vector_int8_binary_data_length() ===================================== Calculate the size of a BSON Binary field that would be needed to store a Vector with the indicated number of ``int8`` elements. Synopsis -------- .. code-block:: c uint32_t bson_vector_int8_binary_data_length (size_t element_count); Parameters ---------- * ``element_count``: Number of elements, as a ``size_t``. Description ----------- Checks ``element_count`` against the maximum representable size, and calculates the required Binary size. Returns ------- On success, returns the required Binary size as a ``uint32_t`` greater than or equal to ``BSON_VECTOR_HEADER_LEN``. This length includes the 2-byte Vector header, but not the Binary subtype header or any other BSON headers. If the ``element_count`` is too large to represent, returns 0. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_from_iter.rst000066400000000000000000000021661511661753600276750ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_from_iter bson_vector_int8_const_view_from_iter() ======================================= Initialize a :symbol:`bson_vector_int8_const_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``int8`` element type. Synopsis -------- .. code-block:: c bool bson_vector_int8_const_view_from_iter (bson_vector_int8_const_view_t *view_out, const bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_int8_const_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``int8`` element type. On success, a :symbol:`bson_vector_int8_const_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or modified. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_int8_view_from_iter` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_init.rst000066400000000000000000000022101511661753600266400ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_init bson_vector_int8_const_view_init() ================================== Initialize a :symbol:`bson_vector_int8_const_view_t` from a const ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_int8_const_view_init (bson_vector_int8_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_int8_const_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length and header of the provided binary data block will be checked for a valid Vector of ``int8`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_int8_const_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_int8_view_init` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_length.rst000066400000000000000000000012071511661753600271630ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_length bson_vector_int8_const_view_length() ==================================== Return the number of elements in a Vector referenced by a :symbol:`bson_vector_int8_const_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_int8_const_view_length (bson_vector_int8_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_const_view_t`. Description ----------- An element count is calculated from the view's stored binary block length. Returns ------- The number of elements, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_int8_view_length` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_pointer.rst000066400000000000000000000017001511661753600273600ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_pointer bson_vector_int8_const_view_pointer() ===================================== Obtain a direct ``int8_t`` pointer to the Vector elements referenced by a :symbol:`bson_vector_int8_const_view_t`. Synopsis -------- .. code-block:: c const int8_t * bson_vector_int8_const_view_pointer (bson_vector_int8_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_const_view_t`. Description ----------- Unwraps a vector view into a bare pointer. The ``int8`` Vector elements use a serialized format that's fully compatible with a C ``int8_t``. Returns ------- A pointer derived from the pointer this View was created from. Its lifetime matches that of the original pointer. If the view was created from a :symbol:`bson_iter_t`, it will be valid until the underlying :symbol:`bson_t` is otherwise modified or destroyed. .. seealso:: | :symbol:`bson_vector_int8_view_pointer` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_read.rst000066400000000000000000000024041511661753600266150ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_read bson_vector_int8_const_view_read() ================================== Copy a contiguous block of elements from a :symbol:`bson_vector_int8_const_view_t` into a C array of ``int8_t``. Synopsis -------- .. code-block:: c bool bson_vector_int8_const_view_read (bson_vector_int8_const_view_t view, int8_t *values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_const_view_t`. * ``values_out``: Location where the ``int8_t`` elements will be read to. * ``element_count``: Number of elements to read. * ``vector_offset_elements``: The vector index of the first element to read. Description ----------- Elements are copied in bulk from the view to the provided output pointer. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``element_count`` elements into ``*values_out``. .. seealso:: | :symbol:`bson_vector_int8_view_read` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_const_view_t.rst000066400000000000000000000032201511661753600261420ustar00rootroot00000000000000:man_page: bson_vector_int8_const_view_t bson_vector_int8_const_view_t ============================= A reference to non-owned const BSON Binary data holding a valid Vector of ``int8`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_int8_const_view_t { /*< private >*/ } bson_vector_int8_const_view_t; Description ----------- :symbol:`bson_vector_int8_const_view_t` is a structure that acts as an opaque const reference to a block of memory that has been validated as an ``int8`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_int8_const_view_init bson_vector_int8_const_view_from_iter bson_vector_int8_const_view_length bson_vector_int8_const_view_read bson_vector_int8_const_view_pointer Example ------- .. code-block:: c bson_iter_t iter; bson_vector_int8_const_view_t view; if (bson_iter_init_find (&iter, &doc, "vector") && bson_vector_int8_const_view_from_iter (&view, &iter)) { size_t length = bson_vector_int8_const_view_length (view); printf ("Elements in 'vector':\n"); for (size_t i = 0; i < length; i++) { int8_t element; BSON_ASSERT (bson_vector_int8_const_view_read (view, &element, 1, i)); printf (" [%d] = %d\n", (int) i, (int) element); } } .. seealso:: | :symbol:`bson_vector_int8_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_as_const.rst000066400000000000000000000011361511661753600263060ustar00rootroot00000000000000:man_page: bson_vector_int8_view_as_const bson_vector_int8_view_as_const() ================================ Convert a :symbol:`bson_vector_int8_view_t` into a :symbol:`bson_vector_int8_const_view_t`. Synopsis -------- .. code-block:: c bson_vector_int8_const_view_t bson_vector_int8_view_as_const (bson_vector_int8_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_view_t`. Description ----------- This adds a ``const`` qualifier to the view without re-validating the underlying data. Returns ------- Always returns a :symbol:`bson_vector_int8_const_view_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_from_iter.rst000066400000000000000000000021121511661753600264560ustar00rootroot00000000000000:man_page: bson_vector_int8_view_from_iter bson_vector_int8_view_from_iter() ================================= Initialize a :symbol:`bson_vector_int8_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``int8`` element type. Synopsis -------- .. code-block:: c bool bson_vector_int8_view_from_iter (bson_vector_int8_view_t *view_out, bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_int8_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``int8`` element type. On success, a :symbol:`bson_vector_int8_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or otherwise modified. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_int8_const_view_from_iter` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_init.rst000066400000000000000000000021161511661753600254370ustar00rootroot00000000000000:man_page: bson_vector_int8_view_init bson_vector_int8_view_init() ============================ Initialize a :symbol:`bson_vector_int8_view_t` from a mutable ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_int8_view_init (bson_vector_int8_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_int8_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length and header of the provided binary data block will be checked for a valid Vector of ``int8`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_int8_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_int8_const_view_init` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_length.rst000066400000000000000000000011431511661753600257540ustar00rootroot00000000000000:man_page: bson_vector_int8_view_length bson_vector_int8_view_length() ============================== Return the number of elements in a Vector referenced by a :symbol:`bson_vector_int8_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_int8_view_length (bson_vector_int8_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_view_t`. Description ----------- An element count is calculated from the view's stored binary block length. Returns ------- The number of elements, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_int8_const_view_length` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_pointer.rst000066400000000000000000000016261511661753600261610ustar00rootroot00000000000000:man_page: bson_vector_int8_view_pointer bson_vector_int8_view_pointer() =============================== Obtain a direct ``int8_t`` pointer to the Vector elements referenced by a :symbol:`bson_vector_int8_view_t`. Synopsis -------- .. code-block:: c int8_t * bson_vector_int8_view_pointer (bson_vector_int8_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_view_t`. Description ----------- Unwraps a vector view into a bare pointer. The ``int8`` Vector elements use a serialized format that's fully compatible with a C ``int8_t``. Returns ------- A pointer derived from the pointer this View was created from. Its lifetime matches that of the original pointer. If the view was created from a :symbol:`bson_iter_t`, it will be valid until the underlying :symbol:`bson_t` is otherwise modified or destroyed. .. seealso:: | :symbol:`bson_vector_int8_const_view_pointer` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_read.rst000066400000000000000000000023161511661753600254110ustar00rootroot00000000000000:man_page: bson_vector_int8_view_read bson_vector_int8_view_read() ============================ Copy a contiguous block of elements from a :symbol:`bson_vector_int8_view_t` into a C array of ``int8_t``. Synopsis -------- .. code-block:: c bool bson_vector_int8_view_read (bson_vector_int8_view_t view, int8_t *values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_view_t`. * ``values_out``: Location where the ``int8_t`` elements will be read to. * ``element_count``: Number of elements to read. * ``vector_offset_elements``: The vector index of the first element to read. Description ----------- Elements are copied in bulk from the view to the provided output pointer. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``element_count`` elements into ``*values_out``. .. seealso:: | :symbol:`bson_vector_int8_const_view_read` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_t.rst000066400000000000000000000030231511661753600247350ustar00rootroot00000000000000:man_page: bson_vector_int8_view_t bson_vector_int8_view_t ======================= A reference to mutable non-owned BSON Binary data holding a valid Vector of ``int8`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_int8_view_t { /*< private >*/ } bson_vector_int8_view_t; Description ----------- :symbol:`bson_vector_int8_view_t` is a structure that acts as an opaque reference to a block of memory that has been validated as an ``int8`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_int8_view_init bson_vector_int8_view_from_iter bson_vector_int8_view_as_const bson_vector_int8_view_length bson_vector_int8_view_read bson_vector_int8_view_write bson_vector_int8_view_pointer Example ------- .. code-block:: c static const int8_t values[] = {1, 2, 3}; const size_t values_count = sizeof values / sizeof values[0]; bson_vector_int8_view_t view; BSON_ASSERT (BSON_APPEND_VECTOR_INT8_UNINIT (&doc, "vector", values_count, &view)); BSON_ASSERT (bson_vector_int8_view_write (view, values, values_count, 0)); .. seealso:: | :symbol:`bson_append_vector_int8_uninit` | :symbol:`bson_vector_int8_const_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_int8_view_write.rst000066400000000000000000000022671511661753600256350ustar00rootroot00000000000000:man_page: bson_vector_int8_view_write bson_vector_int8_view_write() ============================= Copy a contiguous block of elements from a C ``int8_t`` array into a :symbol:`bson_vector_int8_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_int8_view_write (bson_vector_int8_view_t view, const int8_t *values, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_int8_view_t`. * ``values``: Location where the ``int8_t`` elements will be copied from. * ``element_count``: Number of elements to write. * ``vector_offset_elements``: The vector index of the first element to write. Description ----------- Elements are copied in bulk from the provided pointer into the view. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and writes to ``element_count`` elements in the Vector starting at ``vector_offset_elements``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_binary_data_length.rst000066400000000000000000000016361511661753600304710ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_binary_data_length bson_vector_packed_bit_binary_data_length() =========================================== Calculate the size of a BSON Binary field that would be needed to store a Vector with the indicated number of ``packed_bit`` elements. Synopsis -------- .. code-block:: c uint32_t bson_vector_packed_bit_binary_data_length (size_t element_count); Parameters ---------- * ``element_count``: Number of single-bit elements, as a ``size_t``. Description ----------- Checks ``element_count`` against the maximum representable size, and calculates the required Binary size. Returns ------- On success, returns the required Binary size as a ``uint32_t`` greater than or equal to ``BSON_VECTOR_HEADER_LEN``. This length includes the 2-byte Vector header, but not the Binary subtype header or any other BSON headers. If the ``element_count`` is too large to represent, returns 0. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_from_iter.rst000066400000000000000000000022761511661753600311020ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_from_iter bson_vector_packed_bit_const_view_from_iter() ============================================= Initialize a :symbol:`bson_vector_packed_bit_const_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``packed_bit`` element type. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_const_view_from_iter (bson_vector_packed_bit_const_view_t *view_out, const bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_packed_bit_const_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``packed_bit`` element type. On success, a :symbol:`bson_vector_packed_bit_const_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or modified. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_packed_bit_view_from_iter` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_init.rst000066400000000000000000000023431511661753600300520ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_init bson_vector_packed_bit_const_view_init() ======================================== Initialize a :symbol:`bson_vector_packed_bit_const_view_t` from a const ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_const_view_init (bson_vector_packed_bit_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_packed_bit_const_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length, header, and trailing padding of the provided binary data block will be checked for a valid Vector of ``packed_bit`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_packed_bit_const_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. .. seealso:: | :symbol:`bson_vector_packed_bit_view_init` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_length.rst000066400000000000000000000013331511661753600303660ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_length bson_vector_packed_bit_const_view_length() ========================================== Return the number of elements in a Vector referenced by a :symbol:`bson_vector_packed_bit_const_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_const_view_length (bson_vector_packed_bit_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_const_view_t`. Description ----------- An element count is calculated from information stored inside the `bson_vector_packed_bit_const_view_t` value. Returns ------- The number of elements, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_packed_bit_view_length` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_length_bytes.rst000066400000000000000000000015021511661753600315720ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_length_bytes bson_vector_packed_bit_const_view_length_bytes() ================================================ Return the number of packed bytes in a Vector referenced by a :symbol:`bson_vector_packed_bit_const_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_const_view_length_bytes (bson_vector_packed_bit_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_const_view_t`. Description ----------- A byte count is calculated from the view's stored binary block length. If the element count isn't a multiple of 8, the final byte will include bits that do not belong to any element. Returns ------- The number of bytes, as a ``size_t``. .. seealso:: | :symbol:`bson_vector_packed_bit_view_length_bytes` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_padding.rst000066400000000000000000000015201511661753600305110ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_padding bson_vector_packed_bit_const_view_padding() =========================================== Returns the number of unused bits in a Vector referenced by a :symbol:`bson_vector_packed_bit_const_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_const_view_padding (bson_vector_packed_bit_const_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_const_view_t`. Description ----------- The 3-bit ``padding`` field is extracted from a copy of the Vector header inside ``view``. Returns ------- The number of unused bits in the final packed byte. Guaranteed to be between 0 and 7 inclusive. Vector validation guarantees that empty Vectors have a ``padding`` of 0. .. seealso:: | :symbol:`bson_vector_packed_bit_view_padding` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_read_packed.rst000066400000000000000000000031051511661753600313260ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_read_packed bson_vector_packed_bit_const_view_read_packed() =============================================== Copy a contiguous block of packed bytes out of a :symbol:`bson_vector_packed_bit_const_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_const_view_read_packed (bson_vector_packed_bit_const_view_t view, uint8_t *packed_values_out, size_t byte_count, size_t vector_offset_bytes); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_const_view_t`. * ``packed_values_out``: Location where the packed bytes will be read to. * ``byte_count``: Number of bytes to read. * ``vector_offset_bytes``: The byte index of the first packed byte to read. Description ----------- Packed bytes are copied in bulk from the view to the provided output pointer. If the Vector's element count isn't a multiple of 8, its final byte will include bits that do not belong to any element. Vector validation checks that these bits are zero. Returns ------- If the ``byte_count`` and ``vector_offset_bytes`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``byte_count`` bytes into ``*packed_values_out``. .. seealso:: | :symbol:`bson_vector_packed_bit_view_read_packed` | :symbol:`bson_vector_packed_bit_view_write_packed` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_t.rst000066400000000000000000000045131511661753600273530ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_t bson_vector_packed_bit_const_view_t =================================== A reference to non-owned const BSON Binary data holding a valid Vector of ``packed_bit`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_packed_bit_const_view_t { /*< private >*/ } bson_vector_packed_bit_const_view_t; Description ----------- :symbol:`bson_vector_packed_bit_const_view_t` is a structure that acts as an opaque const reference to a block of memory that has been validated as a ``packed_bit`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_packed_bit_const_view_init bson_vector_packed_bit_const_view_from_iter bson_vector_packed_bit_const_view_length bson_vector_packed_bit_const_view_length_bytes bson_vector_packed_bit_const_view_padding bson_vector_packed_bit_const_view_read_packed bson_vector_packed_bit_const_view_unpack_bool Example ------- .. code-block:: c bson_iter_t iter; bson_vector_packed_bit_const_view_t view; if (bson_iter_init_find (&iter, &doc, "vector") && bson_vector_packed_bit_const_view_from_iter (&view, &iter)) { size_t length = bson_vector_packed_bit_const_view_length (view); size_t length_bytes = bson_vector_packed_bit_const_view_length_bytes (view); size_t padding = bson_vector_packed_bit_const_view_padding (view); printf ("Elements in 'vector':\n"); for (size_t i = 0; i < length; i++) { bool element; BSON_ASSERT (bson_vector_packed_bit_const_view_unpack_bool (view, &element, 1, i)); printf (" elements[%d] = %d\n", (int) i, (int) element); } printf ("Bytes in 'vector': (%d bits unused)\n", (int) padding); for (size_t i = 0; i < length_bytes; i++) { uint8_t packed_byte; BSON_ASSERT (bson_vector_packed_bit_const_view_read_packed (view, &packed_byte, 1, i)); printf (" bytes[%d] = 0x%02x\n", (int) i, (unsigned) packed_byte); } } .. seealso:: | :symbol:`bson_vector_packed_bit_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_const_view_unpack_bool.rst000066400000000000000000000026341511661753600314060ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_const_view_unpack_bool bson_vector_packed_bit_const_view_unpack_bool() =============================================== Unpack a contiguous block of elements from a :symbol:`bson_vector_packed_bit_const_view_t` into a C array of ``bool``. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_const_view_unpack_bool (bson_vector_packed_bit_const_view_t view, bool *unpacked_values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_const_view_t`. * ``unpacked_values_out``: Location where the ``bool`` elements will be unpacked to. * ``element_count``: Number of elements to unpack. * ``vector_offset_elements``: The vector index of the first element to unpack. Description ----------- Elements are unpacked from individual bits into a C array of ``bool``. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and unpacks ``element_count`` elements into ``*unpacked_values_out``. .. seealso:: | :symbol:`bson_vector_packed_bit_view_unpack_bool` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_as_const.rst000066400000000000000000000012321511661753600275060ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_as_const bson_vector_packed_bit_view_as_const() ====================================== Convert a :symbol:`bson_vector_packed_bit_view_t` into a :symbol:`bson_vector_packed_bit_const_view_t`. Synopsis -------- .. code-block:: c bson_vector_packed_bit_const_view_t bson_vector_packed_bit_view_as_const (bson_vector_packed_bit_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. Description ----------- This adds a ``const`` qualifier to the view without re-validating the underlying data. Returns ------- Always returns a :symbol:`bson_vector_packed_bit_const_view_t`. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_from_iter.rst000066400000000000000000000021111511661753600276600ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_from_iter bson_vector_packed_bit_view_from_iter() ======================================= Initialize a :symbol:`bson_vector_packed_bit_view_t` from a :symbol:`bson_iter_t` pointing to a valid Vector of ``packed_bit`` element type. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_from_iter (bson_vector_packed_bit_view_t *view_out, bson_iter_t *iter); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_packed_bit_view_t` is written here on success. * ``iter``: A valid :symbol:`bson_iter_t`. Description ----------- The provided iterator, which must point to some kind of BSON item, will be checked for a valid Vector of ``packed_bit`` element type. On success, a :symbol:`bson_vector_packed_bit_view_t` is set to point to the same underlying :symbol:`bson_t` buffer as the provided :symbol:`bson_iter_t`. The view will only be valid until the containing document is destroyed or otherwise modified. Returns ------- Returns true if the view was successfully initialized. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_init.rst000066400000000000000000000021451511661753600266440ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_init bson_vector_packed_bit_view_init() ================================== Initialize a :symbol:`bson_vector_packed_bit_view_t` from a mutable ``uint8_t`` buffer. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_init (bson_vector_packed_bit_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); Parameters ---------- * ``view_out``: A :symbol:`bson_vector_packed_bit_view_t` is written here on success. * ``binary_data``: A pointer to the BSON Binary data block to be validated. * ``binary_data_len``: Length of the binary data block, in bytes. Description ----------- The length, header, and trailing padding of the provided binary data block will be checked for a valid Vector of ``packed_bit`` element type. On success, the pointer and length are packaged as a :symbol:`bson_vector_packed_bit_view_t` written to ``*view_out``. The view will only be valid as long as ``binary_data`` is valid. Returns ------- Returns true if the view was successfully initialized. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_length.rst000066400000000000000000000011531511661753600271600ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_length bson_vector_packed_bit_view_length() ==================================== Return the number of elements in a Vector referenced by a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_view_length (bson_vector_packed_bit_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. Description ----------- An element count is calculated from information stored inside the `bson_vector_packed_bit_view_t` value. Returns ------- The number of elements, as a ``size_t``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_length_bytes.rst000066400000000000000000000013221511661753600303640ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_length_bytes bson_vector_packed_bit_view_length_bytes() ========================================== Return the number of packed bytes in a Vector referenced by a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_view_length_bytes (bson_vector_packed_bit_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. Description ----------- A byte count is calculated from the view's stored binary block length. If the element count isn't a multiple of 8, the final byte will include bits that do not belong to any element. Returns ------- The number of bytes, as a ``size_t``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_pack_bool.rst000066400000000000000000000024341511661753600276330ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_pack_bool bson_vector_packed_bit_view_pack_bool() ======================================= Pack a contiguous block of elements from a C ``bool`` array into a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_pack_bool (bson_vector_packed_bit_view_t view, const bool *unpacked_values, size_t element_count, size_t vector_offset_elements) Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. * ``unpacked_values``: Location where the ``bool`` elements will be packed from. * ``element_count``: Number of elements to pack. * ``vector_offset_elements``: The vector index of the first element to pack. Description ----------- Elements are packed into individual Vector bits from a C ``bool`` array. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and writes to ``element_count`` elements in the Vector starting at ``vector_offset_elements``. mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_padding.rst000066400000000000000000000014541511661753600273110ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_padding bson_vector_packed_bit_view_padding() ===================================== Returns the number of unused bits in a Vector referenced by a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c size_t bson_vector_packed_bit_view_padding (bson_vector_packed_bit_view_t view); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. Description ----------- The 3-bit ``padding`` field is extracted from a copy of the Vector header inside ``view``. Returns ------- The number of unused bits in the final packed byte. Guaranteed to be between 0 and 7 inclusive. Vector validation guarantees that empty Vectors have a ``padding`` of 0. .. seealso:: | :symbol:`bson_vector_packed_bit_const_view_padding` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_read_packed.rst000066400000000000000000000030171511661753600301220ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_read_packed bson_vector_packed_bit_view_read_packed() ========================================= Copy a contiguous block of packed bytes out of a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_read_packed (bson_vector_packed_bit_view_t view, uint8_t *packed_values_out, size_t byte_count, size_t vector_offset_bytes); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. * ``packed_values_out``: Location where the packed bytes will be read to. * ``byte_count``: Number of bytes to read. * ``vector_offset_bytes``: The byte index of the first packed byte to read. Description ----------- Packed bytes are copied in bulk from the view to the provided output pointer. If the Vector's element count isn't a multiple of 8, its final byte will include bits that do not belong to any element. Vector validation checks that these bits are zero. Returns ------- If the ``byte_count`` and ``vector_offset_bytes`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and reads ``byte_count`` bytes into ``*packed_values_out``. .. seealso:: | :symbol:`bson_vector_packed_bit_const_view_read_packed` | :symbol:`bson_vector_packed_bit_view_write_packed` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_t.rst000066400000000000000000000053711511661753600261500ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_t bson_vector_packed_bit_view_t ============================= A reference to mutable non-owned BSON Binary data holding a valid Vector of ``packed_bit`` element type. Synopsis -------- .. code-block:: c #include typedef struct bson_vector_packed_bit_view_t { /*< private >*/ } bson_vector_packed_bit_view_t; Description ----------- :symbol:`bson_vector_packed_bit_view_t` is a structure that acts as an opaque reference to a block of memory that has been validated as a ``packed_bit`` vector. It is meant to be passed by value and can be discarded at any time. The contents of the structure should be considered private. The :symbol:`bson_t` *MUST* be valid for the lifetime of the view and it is an error to modify the :symbol:`bson_t` while using the view. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_vector_packed_bit_view_init bson_vector_packed_bit_view_from_iter bson_vector_packed_bit_view_as_const bson_vector_packed_bit_view_length bson_vector_packed_bit_view_length_bytes bson_vector_packed_bit_view_padding bson_vector_packed_bit_view_read_packed bson_vector_packed_bit_view_write_packed bson_vector_packed_bit_view_unpack_bool bson_vector_packed_bit_view_pack_bool Example ------- .. code-block:: c // Fill a new vector with individual boolean elements { static const bool bool_values[] = {true, false, true, true, false}; const size_t bool_values_count = sizeof bool_values / sizeof bool_values[0]; bson_vector_packed_bit_view_t view; BSON_ASSERT (BSON_APPEND_VECTOR_PACKED_BIT_UNINIT (&doc, "from_bool", bool_values_count, &view)); BSON_ASSERT (bson_vector_packed_bit_view_pack_bool (view, bool_values, bool_values_count, 0)); } // Fill another new vector with packed bytes { static const uint8_t packed_bytes[] = {0xb0}; const size_t unused_bits_count = 3; const size_t packed_values_count = sizeof packed_bytes * 8 - unused_bits_count; bson_vector_packed_bit_view_t view; BSON_ASSERT (BSON_APPEND_VECTOR_PACKED_BIT_UNINIT (&doc, "from_packed", packed_values_count, &view)); BSON_ASSERT (bson_vector_packed_bit_view_write_packed (view, packed_bytes, sizeof packed_bytes, 0)); } // Compare both vectors. They match exactly. { bson_iter_t from_bool_iter, from_packed_iter; BSON_ASSERT (bson_iter_init_find (&from_bool_iter, &doc, "from_bool")); BSON_ASSERT (bson_iter_init_find (&from_packed_iter, &doc, "from_packed")); BSON_ASSERT (bson_iter_binary_equal (&from_bool_iter, &from_packed_iter)); } .. seealso:: | :symbol:`bson_append_vector_packed_bit_uninit` | :symbol:`bson_vector_packed_bit_const_view_t` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_unpack_bool.rst000066400000000000000000000025461511661753600302020ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_unpack_bool bson_vector_packed_bit_view_unpack_bool() ========================================= Unpack a contiguous block of elements from a :symbol:`bson_vector_packed_bit_view_t` into a C array of ``bool``. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_unpack_bool (bson_vector_packed_bit_view_t view, bool *unpacked_values_out, size_t element_count, size_t vector_offset_elements); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. * ``unpacked_values_out``: Location where the ``bool`` elements will be unpacked to. * ``element_count``: Number of elements to unpack. * ``vector_offset_elements``: The vector index of the first element to unpack. Description ----------- Elements are unpacked from individual bits into a C array of ``bool``. Returns ------- If the ``element_count`` and ``vector_offset_elements`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and unpacks ``element_count`` elements into ``*unpacked_values_out``. .. seealso:: | :symbol:`bson_vector_packed_bit_const_view_unpack_bool` mongo-c-driver-2.2.1/src/libbson/doc/bson_vector_packed_bit_view_write_packed.rst000066400000000000000000000031761511661753600303470ustar00rootroot00000000000000:man_page: bson_vector_packed_bit_view_write_packed bson_vector_packed_bit_view_write_packed() ========================================== Copy a contiguous block of packed bytes into a :symbol:`bson_vector_packed_bit_view_t`. Synopsis -------- .. code-block:: c bool bson_vector_packed_bit_view_write_packed (bson_vector_packed_bit_view_t view, const uint8_t *packed_values, size_t byte_count, size_t vector_offset_bytes); Parameters ---------- * ``view``: A valid :symbol:`bson_vector_packed_bit_view_t`. * ``packed_values``: Location where the packed bytes will be copied from. * ``byte_count``: Number of bytes to write. * ``vector_offset_bytes``: The byte index of the first packed byte to write. Description ----------- Packed bytes are copied in bulk from the input pointer to the provided view. If the Vector's element count isn't a multiple of 8, its final byte will include bits that do not belong to any element. This function cannot be used to modify the unused bits, they will be explicitly zeroed if set. Returns ------- If the ``byte_count`` and ``vector_offset_bytes`` parameters overflow the bounds of the Vector, returns false without taking any other action. If the parameters are in range, this is guaranteed to succeed. On success, returns true and writes ``byte_count`` bytes from ``*packed_values`` into the Vector starting at byte index ``vector_offset_bytes``. .. seealso:: | :symbol:`bson_vector_packed_bit_view_read_packed` | :symbol:`bson_vector_packed_bit_const_view_read_packed` mongo-c-driver-2.2.1/src/libbson/doc/bson_visitor_t.rst000066400000000000000000000201701511661753600231400ustar00rootroot00000000000000:man_page: bson_visitor_t bson_visitor_t ============== Synopsis -------- .. code-block:: c #include typedef struct { /* run before / after descending into a document */ bool (*visit_before) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_after) (const bson_iter_t *iter, const char *key, void *data); /* corrupt BSON, or unsupported type and visit_unsupported_type not set */ void (*visit_corrupt) (const bson_iter_t *iter, void *data); /* normal bson field callbacks */ bool (*visit_double) (const bson_iter_t *iter, const char *key, double v_double, void *data); bool (*visit_utf8) (const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data); bool (*visit_document) (const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); bool (*visit_array) (const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); bool (*visit_binary) (const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data); /* normal field with deprecated "Undefined" BSON type */ bool (*visit_undefined) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_oid) (const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data); bool (*visit_bool) (const bson_iter_t *iter, const char *key, bool v_bool, void *data); bool (*visit_date_time) (const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data); bool (*visit_null) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_regex) (const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data); bool (*visit_dbpointer) (const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data); bool (*visit_code) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data); bool (*visit_symbol) (const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data); bool (*visit_codewscope) (const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data); bool (*visit_int32) (const bson_iter_t *iter, const char *key, int32_t v_int32, void *data); bool (*visit_timestamp) (const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data); bool (*visit_int64) (const bson_iter_t *iter, const char *key, int64_t v_int64, void *data); bool (*visit_maxkey) (const bson_iter_t *iter, const char *key, void *data); bool (*visit_minkey) (const bson_iter_t *iter, const char *key, void *data); /* if set, called instead of visit_corrupt when an apparently valid BSON * includes an unrecognized field type (reading future version of BSON) */ void (*visit_unsupported_type) (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data); bool (*visit_decimal128) (const bson_iter_t *iter, const char *key, const bson_decimal128_t *v_decimal128, void *data); void *padding[7]; } bson_visitor_t bson_visitor_t; Description ----------- The :symbol:`bson_visitor_t` structure provides a series of callbacks that can be called while iterating a BSON document. This may simplify the conversion of a :symbol:`bson_t` to a higher level language structure. If the optional callback ``visit_unsupported_type`` is set, it is called instead of ``visit_corrupt`` in the specific case of an unrecognized field type. (Parsing is aborted in either case.) Use this callback to report an error like "unrecognized type" instead of simply "corrupt BSON". This future-proofs code that may use an older version of libbson to parse future BSON formats. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 Basic Example ------------- .. code-block:: c #include #include static bool my_visit_before (const bson_iter_t *iter, const char *key, void *data) { int *count = (int *) data; (*count)++; /* returning true stops further iteration of the document */ return false; } static void count_fields (bson_t *doc) { bson_visitor_t visitor = {0}; bson_iter_t iter; int count = 0; visitor.visit_before = my_visit_before; if (bson_iter_init (&iter, doc)) { bson_iter_visit_all (&iter, &visitor, &count); } printf ("Found %d fields.\n", count); } The example below demonstrates how to set your own callbacks to provide information about the location of corrupt or unsupported BSON document entries. Example Corruption Check ------------------------ .. code-block:: c #include #include typedef struct { ssize_t *err_offset; } my_state_t; static void my_visit_corrupt (const bson_iter_t *iter, void *data) { *(((my_state_t *) data)->err_offset) = iter->off; } static void my_visit_unsupported_type (const bson_iter_t *iter, const char *key, uint32_t type_code, void *data) { *(((my_state_t *) data)->err_offset) = iter->off; } static void find_error_location (bson_t *doc) { bson_visitor_t visitors = {0}; bson_iter_t iter; my_state_t state; ssize_t err_offset = -1; visitors.visit_corrupt = my_visit_corrupt; visitors.visit_unsupported_type = my_visit_unsupported_type; /* provide additional visitors as needed based on your requirements */ state.err_offset = &err_offset; if (!bson_iter_init (&iter, doc)) { printf ("Could not initialize iterator!"); exit (1); } if (bson_iter_visit_all (&iter, &visitors, &state) || err_offset != -1) { printf ("Found error at offset %d.\n", err_offset); } else { printf ("BSON document had no errors.\n"); } } The example below demonstrates how to use a visitor to validate a BSON document's maximum depth. .. _example_custom_validation: Example Custom Validation ------------------------- .. literalinclude:: ../examples/bson-check-depth.c :caption: bson-check-depth.c :start-after: -- sphinx-include-start --mongo-c-driver-2.2.1/src/libbson/doc/bson_vsnprintf.rst000066400000000000000000000010511511661753600231440ustar00rootroot00000000000000:man_page: bson_vsnprintf bson_vsnprintf() ================ Synopsis -------- .. code-block:: c int bson_vsnprintf (char *str, size_t size, const char *format, va_list ap); Parameters ---------- * ``str``: A location for the resulting string. * ``size``: The size of str in bytes. * ``format``: A printf style format string. * ``ap``: A va_list of parameters for the format. Description ----------- Like bson_snprintf() but allows for variadic parameters. Returns ------- The number of bytes written to ``str`` excluding the ``\0`` byte. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_begin.rst000066400000000000000000000011331511661753600235740ustar00rootroot00000000000000:man_page: bson_writer_begin bson_writer_begin() =================== Synopsis -------- .. code-block:: c bool bson_writer_begin (bson_writer_t *writer, bson_t **bson); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. * ``bson``: A :symbol:`bson_t`. Description ----------- Begins writing a new document. The caller may use the bson structure to write out a new BSON document. When completed, the caller must call either :symbol:`bson_writer_end()` or :symbol:`bson_writer_rollback()`. Returns ------- true if there was space in the underlying buffers to begin the document. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_destroy.rst000066400000000000000000000007451511661753600242110ustar00rootroot00000000000000:man_page: bson_writer_destroy bson_writer_destroy() ===================== Synopsis -------- .. code-block:: c void bson_writer_destroy (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Cleanup after ``writer`` and release any allocated memory. Does nothing if ``writer`` is NULL. Note that the buffer supplied to :symbol:`bson_writer_new()` is *NOT* freed from this method. The caller is responsible for that. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_end.rst000066400000000000000000000004731511661753600232640ustar00rootroot00000000000000:man_page: bson_writer_end bson_writer_end() ================= Synopsis -------- .. code-block:: c void bson_writer_end (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Complete writing of a :symbol:`bson_writer_t` to the buffer supplied. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_get_length.rst000066400000000000000000000012631511661753600246340ustar00rootroot00000000000000:man_page: bson_writer_get_length bson_writer_get_length() ======================== Synopsis -------- .. code-block:: c size_t bson_writer_get_length (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Fetches the current length of the content written by the buffer (including the initial offset). This includes a partly written document currently being written. This is useful if you want to check to see if you've passed a given memory boundary that cannot be sent in a packet. See :symbol:`bson_writer_rollback()` to abort the current document being written. Returns ------- The length of the underlying buffer. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_new.rst000066400000000000000000000014531511661753600233060ustar00rootroot00000000000000:man_page: bson_writer_new bson_writer_new() ================= Synopsis -------- .. code-block:: c bson_writer_t * bson_writer_new (uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); Parameters ---------- * ``buf``: A uint8_t. * ``buflen``: A size_t. * ``offset``: A size_t. * ``realloc_func``: A bson_realloc_func. * ``realloc_func_ctx``: A bson_realloc_func. Description ----------- Creates a new instance of :symbol:`bson_writer_t` using the ``buffer``, ``length``, ``offset``, and _realloc()_ function supplied. The caller is expected to clean up the structure when finished using :symbol:`bson_writer_destroy()`. Returns ------- A newly allocated bson_writer_t. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_rollback.rst000066400000000000000000000007321511661753600243050ustar00rootroot00000000000000:man_page: bson_writer_rollback bson_writer_rollback() ====================== Synopsis -------- .. code-block:: c void bson_writer_rollback (bson_writer_t *writer); Parameters ---------- * ``writer``: A :symbol:`bson_writer_t`. Description ----------- Abort the appending of the current bson_t to the memory region managed by ``writer``. This is useful if you detected that you went past a particular memory limit. For example, MongoDB has 48MB message limits. mongo-c-driver-2.2.1/src/libbson/doc/bson_writer_t.rst000066400000000000000000000031531511661753600227570ustar00rootroot00000000000000:man_page: bson_writer_t bson_writer_t ============= Bulk BSON serialization Abstraction Synopsis -------- .. code-block:: c #include typedef struct _bson_writer_t bson_writer_t; bson_writer_t * bson_writer_new (uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); void bson_writer_destroy (bson_writer_t *writer); Description ----------- The :symbol:`bson_writer_t` API provides an abstraction for serializing many BSON documents to a single memory region. The memory region may be dynamically allocated and re-allocated as more memory is demanded. This can be useful when building network packets from a high-level language. For example, you can serialize a Python Dictionary directly to a single buffer destined for a TCP packet. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_writer_begin bson_writer_destroy bson_writer_end bson_writer_get_length bson_writer_new bson_writer_rollback Example ------- .. code-block:: c #include int main (int argc, char *argv[]) { bson_writer_t *writer; uint8_t *buf = NULL; size_t buflen = 0; bson_t *doc; writer = bson_writer_new (&buf, &buflen, 0, bson_realloc_ctx, NULL); for (int i = 0; i < 1000; i++) { bson_writer_begin (writer, &doc); BSON_APPEND_INT32 (doc, "i", i); bson_writer_end (writer); } bson_writer_destroy (writer); bson_free (buf); return 0; } mongo-c-driver-2.2.1/src/libbson/doc/bson_zero_free.rst000066400000000000000000000010621511661753600230750ustar00rootroot00000000000000:man_page: bson_zero_free bson_zero_free() ================ Synopsis -------- .. code-block:: c void bson_zero_free (void *mem, size_t size); Parameters ---------- * ``mem``: A memory region. * ``size``: The size of ``mem``. Description ----------- This function behaves like :symbol:`bson_free()` except that it zeroes the memory first. This can be useful if you are storing passwords or other similarly important data. Note that if it truly is important, you probably want a page protected with ``mlock()`` as well to prevent it swapping to disk. mongo-c-driver-2.2.1/src/libbson/doc/character_and_string_routines.rst000066400000000000000000000014001511661753600261640ustar00rootroot00000000000000:man_page: bson_character_and_string_routines Character and String Routines ============================= We provide a small number of character and string routines to substitute for those that are not available on all platforms, and routines to make UTF-8 character manipulation convenient. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_ascii_strtoll bson_isspace bson_snprintf bson_strcasecmp bson_strdup bson_strdup_printf bson_strdupv_printf bson_strfreev bson_strncpy bson_strndup bson_strnlen bson_uint32_to_string bson_utf8_escape_for_json bson_utf8_from_unichar bson_utf8_get_char bson_utf8_next_char bson_utf8_validate bson_vsnprintf mongo-c-driver-2.2.1/src/libbson/doc/conf.py000066400000000000000000000026401511661753600206440ustar00rootroot00000000000000# -*- coding: utf-8 -*- import os import os.path import sys # Ensure we can import "mongoc" extension module. this_path = os.path.dirname(__file__) sys.path.append(os.path.normpath(os.path.join(this_path, '../../../build/sphinx'))) from mongoc_common import * # noqa: E402, F403 extensions = [ 'mongoc', ] # General information about the project. project = 'libbson' copyright = '2009-present, MongoDB, Inc.' author = 'MongoDB, Inc' version_path = os.path.join(os.path.dirname(__file__), '../../..', 'VERSION_CURRENT') version = open(version_path).read().strip() language = 'en' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] master_doc = 'index' # -- Options for HTML output ---------------------------------------------- html_theme = 'furo' html_title = html_shorttitle = 'libbson %s' % version # html_favicon = None html_sidebars = {} html_use_index = False rst_prolog = r""" .. _mongodb_docs_cdriver: https://www.mongodb.com/docs/languages/c/c-driver/current/ .. _errors: https://www.mongodb.com/docs/languages/c/c-driver/current/libbson/tutorials/errors/ """ def add_canonical_link(app, pagename, templatename, context, doctree): link = f'' context['metatags'] = context.get('metatags', '') + link def setup(app): mongoc_common_setup(app) # noqa: F405 app.connect('html-page-context', add_canonical_link) mongo-c-driver-2.2.1/src/libbson/doc/full_index.rst000066400000000000000000000004271511661753600222310ustar00rootroot00000000000000:man_page: bson_reference :orphan: .. Yes it's confusing: the home page is called "index" so this is "full_index", and it works by including the complete Table of Contents from the homepage, i.e., "index". Index ===== .. toctree:: :maxdepth: 6 :titlesonly: index mongo-c-driver-2.2.1/src/libbson/doc/includes/000077500000000000000000000000001511661753600211515ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/doc/includes/seealso/000077500000000000000000000000001511661753600226045ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/doc/includes/seealso/bson-as-json.txt000066400000000000000000000005431511661753600256600ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_as_canonical_extended_json()` | :symbol:`bson_as_relaxed_extended_json()` | :symbol:`bson_as_legacy_extended_json()` | :symbol:`bson_as_json_with_opts()` | :symbol:`bson_array_as_canonical_extended_json()` | :symbol:`bson_array_as_relaxed_extended_json()` | :symbol:`bson_array_as_legacy_extended_json()` mongo-c-driver-2.2.1/src/libbson/doc/includes/seealso/create-bson.txt000066400000000000000000000005661511661753600255560ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_concat()` | :symbol:`bson_init()` | :symbol:`bson_init_from_json()` | :symbol:`bson_init_static()` | :symbol:`bson_new()` | :symbol:`bson_new_from_buffer()` | :symbol:`bson_new_from_data()` | :symbol:`bson_new_from_json()` | :symbol:`bson_reinit()` | :symbol:`bson_reserve_buffer()` | :symbol:`bson_sized_new()` mongo-c-driver-2.2.1/src/libbson/doc/includes/seealso/iter-init.txt000066400000000000000000000002461511661753600252530ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_iter_init()` | :symbol:`bson_iter_init_find()` | :symbol:`bson_iter_init_find_case()` | :symbol:`bson_iter_init_from_data()` mongo-c-driver-2.2.1/src/libbson/doc/includes/seealso/json.txt000066400000000000000000000001751511661753600243210ustar00rootroot00000000000000.. seealso:: | :symbol:`bson_init_from_json()` | :symbol:`bson_json_reader_read()` | :symbol:`bson_new_from_json()` mongo-c-driver-2.2.1/src/libbson/doc/index.rst000066400000000000000000000010041511661753600211770ustar00rootroot00000000000000libbson - API ============= A Cross Platform BSON Library for C This site documents the API. For tutorials, guides, and explainers, see `MongoDB C Driver `_. Introduction ------------ libbson builds, parses, and iterates `BSON `_ documents, the native data format of MongoDB. It also converts BSON to and from JSON, and provides a platform compatibility layer for `the MongoDB C Driver `_. .. toctree:: :titlesonly: :maxdepth: 2 api mongo-c-driver-2.2.1/src/libbson/doc/legacy_extended_json.rst000066400000000000000000000030561511661753600242560ustar00rootroot00000000000000:man_page: libbson_legacy_extended_json Libbson Legacy Extended JSON ============================ libbson can produce a non-portable Legacy Extended JSON format. .. warning:: Use of the Legacy Extended JSON format is discouraged. Prefer Canonical Extended JSON or Relaxed Extended JSON for portability. `MongoDB Extended JSON (v2)`_ describes the preferred Relaxed Extended JSON format and Canonical Extended Formats libbson's Legacy Extended JSON format matches Relaxed Extended JSON with the following exceptions. Notation is borrowed from `MongoDB Extended JSON (v2)`_: .. list-table:: :header-rows: 1 * - Type - Legacy Extended JSON * - Binary - .. code:: json { "$binary": "", "$type": "" } * - Date - .. code:: json { "$date" : "" } * - Regular Expression - .. code:: json { "$regex" : "", "$options" : "" } * - DBPointer (deprecated) - .. code:: json { "$ref" : "", "$id" : "" } * - Symbol (deprecated) - .. code:: json "" * - Double infinity - ``infinity`` or ``inf`` without quotes. Implementation defined. Produces invalid JSON. * - Double NaN - ``nan`` or ``nan(n-char-sequence)``. Implementation defined. Produces invalid JSON. .. _BSON: https://bsonspec.org/ .. _MongoDB Extended JSON (v2): https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ .. only:: html .. include:: includes/seealso/bson-as-json.txt mongo-c-driver-2.2.1/src/libbson/doc/version.rst000066400000000000000000000021051511661753600215600ustar00rootroot00000000000000:man_page: bson_version Libbson Versioning ================== Versioning Macros and Functions Macros ------ The following preprocessor macros can be used to perform various checks based on the version of the library you are compiling against. This may be useful if you only want to enable a feature on a certain version of the library. Synopsis -------- .. code-block:: c #define BSON_CHECK_VERSION(major, minor, micro) #define BSON_MAJOR_VERSION (1) #define BSON_MINOR_VERSION (4) #define BSON_MICRO_VERSION (1) #define BSON_VERSION_S "1.4.1" #define BSON_VERSION_HEX \ (BSON_MAJOR_VERSION << 24 | BSON_MINOR_VERSION << 16 | \ BSON_MICRO_VERSION << 8) Only compile a block on Libbson 1.1.0 and newer. .. code-block:: c #if BSON_CHECK_VERSION(1, 1, 0) static void do_something (void) { } #endif .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 bson_check_version bson_get_major_version bson_get_micro_version bson_get_minor_version bson_get_version mongo-c-driver-2.2.1/src/libbson/etc/000077500000000000000000000000001511661753600173515ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/etc/bsonConfig.cmake000066400000000000000000000050371511661753600224470ustar00rootroot00000000000000#[[ CMake package file for the BSON library. This file globs and includes all "*-targets.cmake" files in the containing directory, and intends that those files define the actual libbson targets. This file also defines a `bson::bson` target, which redirects to either `bson::static` or `bson::shared` depending on what type of library is available and can be controlled with an import-time CMake setting. If the installation has a static library, it is named `bson::static`. If the installation has a shared (dynamic) library, it is named `bson::shared`. ]] # Check for missing components before proceeding. We don't provide any, so we # should generate an error if the caller requests any *required* components. set(missing_required_components) foreach(comp IN LISTS bson_FIND_COMPONENTS) if(bson_FIND_REQUIRED_${comp}) list(APPEND missing_required_components "${comp}") endif() endforeach() if(missing_required_components) list(JOIN missing_required_components ", " components) set(bson_FOUND FALSE) set(bson_NOT_FOUND_MESSAGE "The package version is compatible, but is missing required components: ${components}") # Stop now. Don't generate any imported targets return() endif() include(CMakeFindDependencyMacro) find_dependency(Threads) # Required for Threads::Threads # Import the target files that will be installed alongside this file. Only the # targets of libraries that were actually installed alongside this file will be imported file(GLOB __targets_files "${CMAKE_CURRENT_LIST_DIR}/*-targets.cmake") foreach(__file IN LISTS __targets_files) include("${__file}") endforeach() # The library type that is linked with `bson::bson` set(__default_lib_type SHARED) if(TARGET bson::static) # If static is available, set it as the default library type set(__default_lib_type STATIC) endif() # Allow the user to tweak what library type is linked for `bson::bson` set(BSON_DEFAULT_IMPORTED_LIBRARY_TYPE "${__default_lib_type}" CACHE STRING "The default library type that is used when linking against 'bson::bson' (either SHARED or STATIC, requires that the package was built with the appropriate library type)") set_property(CACHE BSON_DEFAULT_IMPORTED_LIBRARY_TYPE PROPERTY STRINGS SHARED STATIC) if(NOT TARGET bson::bson) # Don't redefine the target if we were already included string(TOLOWER "${BSON_DEFAULT_IMPORTED_LIBRARY_TYPE}" __type) add_library(bson::bson IMPORTED INTERFACE) set_property(TARGET bson::bson APPEND PROPERTY INTERFACE_LINK_LIBRARIES bson::${__type}) endif() mongo-c-driver-2.2.1/src/libbson/examples/000077500000000000000000000000001511661753600204145ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/examples/bcon-col-view.c000066400000000000000000000041631511661753600232300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define QUERY(...) ELE_QUERY, __VA_ARGS__, NULL #define SORT(...) ELE_SORT, __VA_ARGS__, NULL #define LIMIT(var) ELE_LIMIT, (var) #define COL_VIEW_CREATE(...) col_view_create("", __VA_ARGS__, ELE_END) typedef enum ele { ELE_SORT, ELE_LIMIT, ELE_QUERY, ELE_END, } ele_t; bson_t * col_view_create(const char *stub, ...) { bson_t *bson; va_list ap; ele_t type; int keep_going = 1; bcon_append_ctx_t ctx; bcon_append_ctx_init(&ctx); va_start(ap, stub); bson = bson_new(); while (keep_going) { type = va_arg(ap, ele_t); switch (type) { case ELE_SORT: BCON_APPEND_CTX(bson, &ctx, "sort", "{"); bcon_append_ctx_va(bson, &ctx, &ap); BCON_APPEND_CTX(bson, &ctx, "}"); break; case ELE_LIMIT: { int i = va_arg(ap, int); BCON_APPEND_CTX(bson, &ctx, "limit", BCON_INT32(i)); break; } case ELE_QUERY: BCON_APPEND_CTX(bson, &ctx, "query", "{"); bcon_append_ctx_va(bson, &ctx, &ap); BCON_APPEND_CTX(bson, &ctx, "}"); break; case ELE_END: keep_going = 0; break; default: BSON_ASSERT(0); break; } } va_end(ap); return bson; } int main(void) { bson_t *bson; char *json; bson = COL_VIEW_CREATE(SORT("a", BCON_INT32(1)), QUERY("hello", "world"), LIMIT(10)); json = bson_as_canonical_extended_json(bson, NULL); printf("%s\n", json); bson_free(json); bson_destroy(bson); return 0; } mongo-c-driver-2.2.1/src/libbson/examples/bcon-speed.c000066400000000000000000000043401511661753600226000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* * This is a test for comparing the performance of BCON to regular * bson_append*() function calls. * * Maybe run the following a few times to get an idea of the performance * implications of using BCON. Generally, it's fast enough to be very * useful and result in easier to read BSON code. * * time ./bcon-speed 100000 y * time ./bcon-speed 100000 n */ int main(int argc, char *argv[]) { int i; int n; int bcon; bson_t bson, foo, bar, baz; bson_init(&bson); if (argc != 3) { fprintf(stderr, "usage: bcon-speed NUM_ITERATIONS [y|n]\n" "\n" " y = perform speed tests with bcon\n" " n = perform speed tests with bson_append\n" "\n"); return EXIT_FAILURE; } BSON_ASSERT(argc == 3); n = atoi(argv[1]); bcon = (argv[2][0] == 'y') ? 1 : 0; for (i = 0; i < n; i++) { if (bcon) { BCON_APPEND( &bson, "foo", "{", "bar", "{", "baz", "[", BCON_INT32(1), BCON_INT32(2), BCON_INT32(3), "]", "}", "}"); } else { bson_append_document_begin(&bson, "foo", -1, &foo); bson_append_document_begin(&foo, "bar", -1, &bar); bson_append_array_begin(&bar, "baz", -1, &baz); bson_append_int32(&baz, "0", -1, 1); bson_append_int32(&baz, "1", -1, 2); bson_append_int32(&baz, "2", -1, 3); bson_append_array_end(&bar, &baz); bson_append_document_end(&foo, &bar); bson_append_document_end(&bson, &foo); } bson_reinit(&bson); } bson_destroy(&bson); return 0; } mongo-c-driver-2.2.1/src/libbson/examples/bson-check-depth.c000066400000000000000000000062621511661753600237040ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* -- sphinx-include-start -- */ /* Reports the maximum nested depth of a BSON document. */ #include #include #include #include #include typedef struct { uint32_t depth; uint32_t max_depth; bool valid; } check_depth_t; bool _check_depth_document(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static const bson_visitor_t check_depth_funcs = { NULL, NULL, NULL, NULL, NULL, _check_depth_document, _check_depth_document, NULL, }; bool _check_depth_document(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { check_depth_t *state = (check_depth_t *)data; bson_iter_t child; BSON_UNUSED(iter); BSON_UNUSED(key); if (!bson_iter_init(&child, v_document)) { fprintf(stderr, "corrupt\n"); return true; /* cancel */ } state->depth++; if (state->depth > state->max_depth) { state->valid = false; return true; /* cancel */ } bson_iter_visit_all(&child, &check_depth_funcs, state); state->depth--; return false; /* continue */ } void check_depth(const bson_t *bson, uint32_t max_depth) { bson_iter_t iter; check_depth_t state = {0}; if (!bson_iter_init(&iter, bson)) { fprintf(stderr, "corrupt\n"); } state.valid = true; state.max_depth = max_depth; _check_depth_document(&iter, NULL, bson, &state); if (!state.valid) { printf("document exceeds maximum depth of %" PRIu32 "\n", state.max_depth); } else { char *as_json = bson_as_canonical_extended_json(bson, NULL); printf("document %s ", as_json); printf("is valid\n"); bson_free(as_json); } } int main(int argc, char **argv) { bson_reader_t *bson_reader; const bson_t *bson; bool reached_eof; bson_error_t error; if (argc != 3) { fprintf(stderr, "usage: %s FILE MAX_DEPTH\n", argv[0]); fprintf(stderr, "Checks that the depth of the BSON contained in FILE\n"); fprintf(stderr, "does not exceed MAX_DEPTH\n"); } const char *const filename = argv[1]; const int max_depth = atoi(argv[2]); bson_reader = bson_reader_new_from_file(filename, &error); if (!bson_reader) { printf("could not read %s: %s\n", filename, error.message); return 1; } BSON_ASSERT(max_depth >= 0 && (uint64_t)max_depth <= UINT32_MAX); while ((bson = bson_reader_read(bson_reader, &reached_eof))) { check_depth(bson, (uint32_t)max_depth); } if (!reached_eof) { printf("error reading BSON\n"); } bson_reader_destroy(bson_reader); return 0; } mongo-c-driver-2.2.1/src/libbson/examples/bson-metrics.c000066400000000000000000000247071511661753600231770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will scan each BSON document contained in the provided files * and print metrics to STDOUT. */ #include #include #include #define MAX_RECURSION 100 static double dtimeofday(void) { struct timeval timeval; bson_gettimeofday(&timeval); return (timeval.tv_sec + timeval.tv_usec * 0.000001); } typedef struct { uint64_t count; char *description; } bson_type_metrics_t; typedef struct { uint64_t doc_count; uint64_t element_count; uint64_t doc_size_max; uint64_t key_size_tally; uint64_t utf8_size_tally; uint32_t depth; bson_type_metrics_t bson_type_metrics[256]; } bson_metrics_state_t; static bson_metrics_state_t initial_state = {0L, 0L, 0L, 0L, 0L, 0L, {{/* BSON_TYPE_EOD = 0x00 */ 0L, "End of document"}, {/* BSON_TYPE_DOUBLE = 0x01 */ 0L, "Floating point"}, {/* BSON_TYPE_UTF8 = 0x02 */ 0L, "UTF-8 string"}, {/* BSON_TYPE_DOCUMENT = 0x03 */ 0L, "Embedded document"}, {/* BSON_TYPE_ARRAY = 0x04 */ 0L, "Array"}, {/* BSON_TYPE_BINARY = 0x05 */ 0L, "Binary data"}, {/* BSON_TYPE_UNDEFINED = 0x06 */ 0L, "Undefined - Deprecated"}, {/* BSON_TYPE_OID = 0x07 */ 0L, "ObjectId"}, {/* BSON_TYPE_BOOL = 0x08 */ 0L, "Boolean"}, {/* BSON_TYPE_DATE_TIME = 0x09 */ 0L, "UTC datetime"}, {/* BSON_TYPE_NULL = 0x0A */ 0L, "Null value"}, {/* BSON_TYPE_REGEX = 0x0B */ 0L, "Regular expression"}, {/* BSON_TYPE_DBPOINTER = 0x0C */ 0L, "DBPointer - Deprecated"}, {/* BSON_TYPE_CODE = 0x0D */ 0L, "JavaScript code"}, {/* BSON_TYPE_SYMBOL = 0x0E */ 0L, "Symbol - Deprecated"}, {/* BSON_TYPE_CODEWSCOPE = 0x0F */ 0L, "JavaScript code w/ scope"}, {/* BSON_TYPE_INT32 = 0x10 */ 0L, "32-bit Integer"}, {/* BSON_TYPE_TIMESTAMP = 0x11 */ 0L, "Timestamp"}, {/* BSON_TYPE_INT64 = 0x12 */ 0L, "64-bit Integer"}, {0L, NULL}}}; static bson_metrics_state_t state; static int compar_bson_type_metrics(const void *a, const void *b) { const uint64_t a_count = ((bson_type_metrics_t *)a)->count; const uint64_t b_count = ((bson_type_metrics_t *)b)->count; if (a_count == b_count) { return 0; } return a_count < b_count ? -1 : 1; } /* * Forward declarations. */ static bool bson_metrics_visit_array(const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); static bool bson_metrics_visit_document(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); static bool bson_metrics_visit_utf8(const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data) { bson_metrics_state_t *s = data; BSON_UNUSED(iter); BSON_UNUSED(key); BSON_UNUSED(v_utf8); s->utf8_size_tally += v_utf8_len; return false; } static bool bson_metrics_visit_before(const bson_iter_t *iter, const char *key, void *data) { bson_metrics_state_t *s = data; bson_type_t btype; ++s->element_count; s->key_size_tally += strlen(key); /* TODO - filter out array keys(?) */ btype = bson_iter_type(iter); ++s->bson_type_metrics[btype].count; return false; } static const bson_visitor_t bson_metrics_visitors = { bson_metrics_visit_before, NULL, /* visit_after */ NULL, /* visit_corrupt */ NULL, /* visit_double */ bson_metrics_visit_utf8, bson_metrics_visit_document, bson_metrics_visit_array, NULL, /* visit_binary */ NULL, /* visit_undefined */ NULL, /* visit_oid */ NULL, /* visit_bool */ NULL, /* visit_date_time */ NULL, /* visit_null */ NULL, /* visit_regex */ NULL, /* visit_dbpointer */ NULL, /* visit_code */ NULL, /* visit_symbol */ NULL, /* visit_codewscope */ NULL, /* visit_int32 */ NULL, /* visit_timestamp */ NULL, /* visit_int64 */ NULL, /* visit_maxkey */ NULL, /* visit_minkey */ }; static bool bson_metrics_visit_document(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data) { bson_metrics_state_t *s = data; bson_iter_t child; BSON_UNUSED(iter); BSON_UNUSED(key); if (s->depth >= MAX_RECURSION) { fprintf(stderr, "Invalid document, max recursion reached.\n"); return true; } if (bson_iter_init(&child, v_document)) { s->depth++; bson_iter_visit_all(&child, &bson_metrics_visitors, data); s->depth--; } return false; } static bool bson_metrics_visit_array(const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data) { bson_metrics_state_t *s = data; bson_iter_t child; BSON_UNUSED(iter); BSON_UNUSED(key); if (s->depth >= MAX_RECURSION) { fprintf(stderr, "Invalid document, max recursion reached.\n"); return true; } if (bson_iter_init(&child, v_array)) { s->depth++; bson_iter_visit_all(&child, &bson_metrics_visitors, data); s->depth--; } return false; } static void bson_metrics(const bson_t *bson, size_t *length, void *data) { bson_iter_t iter; bson_metrics_state_t *s = data; BSON_UNUSED(length); ++s->doc_count; if (bson_iter_init(&iter, bson)) { bson_iter_visit_all(&iter, &bson_metrics_visitors, data); } } int main(int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; int i, j; double dtime_before, dtime_after, dtime_delta; uint64_t aggregate_count; off_t mark; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf(stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ printf("["); for (i = 1; i < argc; i++) { if (i > 1) printf(","); filename = argv[i]; /* * Initialize a new reader for this file descriptor. */ if (!(reader = bson_reader_new_from_file(filename, &error))) { fprintf(stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } state = initial_state; dtime_before = dtimeofday(); mark = 0; while ((b = bson_reader_read(reader, NULL))) { off_t pos = bson_reader_tell(reader); state.doc_size_max = BSON_MAX(pos - mark, (off_t)state.doc_size_max); mark = pos; bson_metrics(b, NULL, &state); } dtime_after = dtimeofday(); dtime_delta = BSON_MAX(dtime_after - dtime_before, 0.000001); state.bson_type_metrics[BSON_TYPE_MAXKEY].description = "Max key"; state.bson_type_metrics[BSON_TYPE_MINKEY].description = "Min key"; aggregate_count = state.bson_type_metrics[BSON_TYPE_DOCUMENT].count + state.bson_type_metrics[BSON_TYPE_ARRAY].count; qsort(state.bson_type_metrics, 256, sizeof(bson_type_metrics_t), compar_bson_type_metrics); printf("\n {\n"); printf(" \"file\": \"%s\",\n", filename); printf(" \"secs\": %.2f,\n", dtime_delta); printf(" \"docs_per_sec\": %" PRIu64 ",\n", (uint64_t)floor(state.doc_count / dtime_delta)); printf(" \"docs\": %" PRIu64 ",\n", state.doc_count); printf(" \"elements\": %" PRIu64 ",\n", state.element_count); printf(" \"elements_per_doc\": %" PRIu64 ",\n", (uint64_t)floor((double)state.element_count / (double)BSON_MAX(state.doc_count, 1))); printf(" \"aggregates\": %" PRIu64 ",\n", aggregate_count); printf(" \"aggregates_per_doc\": %" PRIu64 ",\n", (uint64_t)floor((double)aggregate_count / (double)BSON_MAX(state.doc_count, 1))); printf(" \"degree\": %" PRIu64 ",\n", (uint64_t)floor((double)state.element_count / ((double)BSON_MAX(state.doc_count + aggregate_count, 1)))); printf(" \"doc_size_max\": %" PRIu64 ",\n", state.doc_size_max); printf(" \"doc_size_average\": %" PRIu64 ",\n", (uint64_t)floor((double)bson_reader_tell(reader) / (double)BSON_MAX(state.doc_count, 1))); printf(" \"key_size_average\": %" PRIu64 ",\n", (uint64_t)floor((double)state.key_size_tally / (double)BSON_MAX(state.element_count, 1))); printf(" \"string_size_average\": %" PRIu64 ",\n", (uint64_t)floor((double)state.utf8_size_tally / (double)BSON_MAX(state.bson_type_metrics[BSON_TYPE_UTF8].count, 1))); printf(" \"percent_by_type\": {\n"); for (j = 0; state.bson_type_metrics[j].count > 0; j++) { bson_type_metrics_t bson_type_metrics = state.bson_type_metrics[j]; printf(" \"%s\": %" PRIu64 ",\n", bson_type_metrics.description, (uint64_t)floor((double)bson_type_metrics.count * 100.0 / (double)BSON_MAX(state.element_count, 1))); } printf(" }\n"); printf(" }"); /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy(reader); } printf("\n]\n"); return 0; } mongo-c-driver-2.2.1/src/libbson/examples/bson-streaming-reader.c000066400000000000000000000117261511661753600247570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #include #endif #define DEFAULT_PORT "5000" #define DEFAULT_HOST "localhost" /* * bson-streaming-remote-open -- * * Makes a connection to the specified host and port over TCP. This * abstracts away most of the socket details required to make a * connection. * * Parameters: * @hostname: The name of the host to connect to, or NULL. * @port: The port number of the server on the host, or NULL. * * Returns: * A valid file descriptor ready for reading on success. * -1 on failure. */ int bson_streaming_remote_open(const char *hostname, const char *port) { int error = 0; int sock = 0; struct addrinfo hints, *ptr, *server_list; /* * Look up the host's address information, hinting that we'd like to use a * TCP/IP connection. */ memset(&hints, 0, sizeof hints); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; error = getaddrinfo((!hostname || !strlen(hostname)) ? DEFAULT_HOST : hostname, (!port || !strlen(port)) ? DEFAULT_PORT : port, &hints, &server_list); if (error) { fprintf(stderr, "bson-streaming-remote-open: Failed to get server info: %s\n", gai_strerror(error)); return -1; } /* * Iterate through the results of getaddrinfo, attempting to connect to the * first possible result. */ for (ptr = server_list; ptr != NULL; ptr = ptr->ai_next) { sock = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (sock < 0) { perror("bson-streaming-remote-open: socket creation failed"); continue; } if (connect(sock, ptr->ai_addr, ptr->ai_addrlen) < 0) { close(sock); perror("bson-streaming-remote-open: connect failure"); continue; } /* * Connection success. */ break; } freeaddrinfo(server_list); if (ptr == NULL) { fprintf(stderr, "bson-streaming-remote-open: failed to connect to server\n"); return -1; } return sock; } /* * main -- * * Connects to a server and reads BSON from it. This program takes the * following command line options: * * -h Print this help and exit. * -s SERVER_NAME Specify the host name of the server. * -p PORT_NUM Specify the port number to connect to on the server. */ int main(int argc, char *argv[]) { bson_reader_t *reader; char *hostname = NULL; char *json; char *port = NULL; const bson_t *document; int fd; int opt; opterr = 1; /* * Parse command line arguments. */ while ((opt = getopt(argc, argv, "hs:p:")) != -1) { switch (opt) { case 'h': fprintf(stdout, "Usage: %s [-s SERVER_NAME] [-p PORT_NUM]\n", argv[0]); bson_free(hostname); bson_free(port); return EXIT_SUCCESS; case 'p': bson_free(port); port = (char *)bson_malloc(strlen(optarg) + 1); strcpy(port, optarg); break; case 's': bson_free(hostname); hostname = (char *)bson_malloc(strlen(optarg) + 1); strcpy(hostname, optarg); break; default: fprintf(stderr, "Unknown option: %s\n", optarg); } } /* * Open a file descriptor on the remote and read in BSON documents, one by * one. As an example of processing, this prints the incoming documents as * JSON onto STDOUT. */ fd = bson_streaming_remote_open(hostname, port); if (fd == -1) { bson_free(hostname); bson_free(port); return EXIT_FAILURE; } reader = bson_reader_new_from_fd(fd, true); while ((document = bson_reader_read(reader, NULL))) { json = bson_as_canonical_extended_json(document, NULL); fprintf(stdout, "%s\n", json); bson_free(json); } /* * Destroy the reader, which performs cleanup. The ``true'' argument passed * to bson_reader_new_from_fd tells libbson to close the file descriptor on * destruction. */ bson_reader_destroy(reader); bson_free(hostname); bson_free(port); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libbson/examples/bson-to-json.c000066400000000000000000000037661511661753600231240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each BSON document contained in the provided files * as a JSON string to STDOUT. */ #include #include #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif int main(int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; char *str; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf(stderr, "usage: %s [FILE | -]...\nUse - for STDIN.\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; if (strcmp(filename, "-") == 0) { reader = bson_reader_new_from_fd(STDIN_FILENO, false); } else { if (!(reader = bson_reader_new_from_file(filename, &error))) { fprintf(stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read(reader, NULL))) { str = bson_as_canonical_extended_json(b, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy(reader); } return 0; } mongo-c-driver-2.2.1/src/libbson/examples/bson-validate.c000066400000000000000000000045351511661753600233170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will validate each BSON document contained in the files provide * as arguments to the program. Each document from each file is read in * sequence until a bad BSON document is found or there are no more documents * to read. * * Try running it with: * * ./bson-validate tests/binary/overflow2.bson * ./bson-validate tests/binary/trailingnull.bson */ #include #include #include int main(int argc, char *argv[]) { bson_reader_t *reader; const bson_t *b; bson_error_t error; const char *filename; size_t offset; int docnum; int i; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf(stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; docnum = 0; /* * Initialize a new reader for this file descriptor. */ if (!(reader = bson_reader_new_from_file(filename, &error))) { fprintf(stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } /* * Convert each incoming document to JSON and print to stdout. */ while ((b = bson_reader_read(reader, NULL))) { docnum++; if (!bson_validate(b, (BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL), &offset)) { fprintf(stderr, "Document %d in \"%s\" is invalid at offset %zu.\n", docnum, filename, offset); bson_reader_destroy(reader); return 1; } } /* * Cleanup after our reader, which closes the file descriptor. */ bson_reader_destroy(reader); } return 0; } mongo-c-driver-2.2.1/src/libbson/examples/cmake/000077500000000000000000000000001511661753600214745ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/examples/cmake/.gitignore000066400000000000000000000001101511661753600234540ustar00rootroot00000000000000CMakeCache.txt CMakeFiles Makefile cmake_install.cmake hello_bson build mongo-c-driver-2.2.1/src/libbson/examples/cmake/find_package/000077500000000000000000000000001511661753600240675ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/examples/cmake/find_package/CMakeLists.txt000066400000000000000000000022711511661753600266310ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 3.15...4.0) project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (bson 2.0 REQUIRED) # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_link_libraries (hello_bson PRIVATE bson::bson) mongo-c-driver-2.2.1/src/libbson/examples/cmake/find_package_static/000077500000000000000000000000001511661753600254365ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/examples/cmake/find_package_static/CMakeLists.txt000066400000000000000000000022731511661753600302020ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libbson. cmake_minimum_required (VERSION 3.15...4.0) project (hello_bson LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libbson. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (bson 2.0 REQUIRED) # The "hello_bson.c" sample program is shared among four tests. add_executable (hello_bson ../../hello_bson.c) target_link_libraries (hello_bson PRIVATE bson::static) mongo-c-driver-2.2.1/src/libbson/examples/compile-with-pkg-config-static.sh000077500000000000000000000003121511661753600266570ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail # -- sphinx-include-start -- gcc -o hello_bson hello_bson.c $(pkg-config --libs --cflags bson$major-static) mongo-c-driver-2.2.1/src/libbson/examples/compile-with-pkg-config.sh000077500000000000000000000003031511661753600253720ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail # -- sphinx-include-start -- gcc -o hello_bson hello_bson.c $(pkg-config --libs --cflags bson$major) mongo-c-driver-2.2.1/src/libbson/examples/creating.c000066400000000000000000000045041511661753600223570ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include int main(void) { { // bson_append_document_begin example ... begin bson_t parent = BSON_INITIALIZER; bson_t child; bson_append_document_begin(&parent, "foo", 3, &child); bson_append_int32(&child, "baz", 3, 1); bson_append_document_end(&parent, &child); char *str = bson_as_relaxed_extended_json(&parent, NULL); printf("%s\n", str); // Prints: { "foo" : { "baz" : 1 } } bson_free(str); bson_destroy(&parent); // bson_append_document_begin example ... end } { // bson_array_builder_t example ... begin bson_t parent = BSON_INITIALIZER; bson_array_builder_t *bab; bson_append_array_builder_begin(&parent, "foo", 3, &bab); bson_array_builder_append_int32(bab, 9); bson_array_builder_append_int32(bab, 8); bson_array_builder_append_int32(bab, 7); bson_append_array_builder_end(&parent, bab); char *str = bson_as_relaxed_extended_json(&parent, NULL); printf("%s\n", str); // Prints: { "foo" : [ 9, 8, 7 ] } bson_free(str); bson_destroy(&parent); // bson_array_builder_t example ... end } { // bson_array_builder_t top-level example ... begin bson_t out; bson_array_builder_t *bab = bson_array_builder_new(); bson_array_builder_append_int32(bab, 9); bson_array_builder_append_int32(bab, 8); bson_array_builder_append_int32(bab, 7); bson_array_builder_build(bab, &out); char *str = bson_array_as_relaxed_extended_json(&out, NULL); printf("%s\n", str); // Prints: [ 9, 8, 7 ] bson_free(str); bson_array_builder_destroy(bab); // bson_array_builder_t top-level example ... end } return 0; } mongo-c-driver-2.2.1/src/libbson/examples/extended-json.c000066400000000000000000000100621511661753600233260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // extended-json.c shows examples of producing Extended JSON. #include #include int main(void) { { // bson_as_canonical_extended_json ... begin bson_t *b = BCON_NEW("foo", BCON_INT32(123)); char *str = bson_as_canonical_extended_json(b, NULL); printf("Canonical Extended JSON: %s\n", str); // Prints: // Canonical Extended JSON: { "foo" : { "$numberInt" : "123" } } bson_free(str); bson_destroy(b); // bson_as_canonical_extended_json ... end } { // bson_as_relaxed_extended_json ... begin bson_t *b = BCON_NEW("foo", BCON_INT32(123)); char *str = bson_as_relaxed_extended_json(b, NULL); printf("Relaxed Extended JSON: %s\n", str); // Prints: // Relaxed Extended JSON: { "foo" : 123 } bson_free(str); bson_destroy(b); // bson_as_relaxed_extended_json ... end } { // bson_as_legacy_extended_json ... begin bson_t *b = BCON_NEW("foo", BCON_INT32(123)); char *str = bson_as_legacy_extended_json(b, NULL); printf("Legacy Extended JSON: %s\n", str); // Prints: // Legacy Extended JSON: { "foo" : 123 } bson_free(str); bson_destroy(b); // bson_as_legacy_extended_json ... end } { // bson_array_as_canonical_extended_json ... begin bson_t *b = BCON_NEW("0", BCON_INT32(1), "1", BCON_UTF8("bar")); // The document for an array is a normal BSON document with integer values for the keys, starting with 0 and // continuing sequentially. char *str = bson_array_as_canonical_extended_json(b, NULL); printf("Canonical Extended JSON array: %s\n", str); // Prints: // Canonical Extended JSON array: [ { "$numberInt" : "1" }, "bar" ] bson_free(str); bson_destroy(b); // bson_array_as_canonical_extended_json ... end } { // bson_array_as_relaxed_extended_json ... begin bson_t *b = BCON_NEW("0", BCON_INT32(1), "1", BCON_UTF8("bar")); // The document for an array is a normal BSON document with integer values for the keys, starting with 0 and // continuing sequentially. char *str = bson_array_as_relaxed_extended_json(b, NULL); printf("Relaxed Extended JSON array: %s\n", str); // Prints: // Relaxed Extended JSON array: [ 1, "bar" ] bson_free(str); bson_destroy(b); // bson_array_as_relaxed_extended_json ... end } { // bson_array_as_legacy_extended_json ... begin bson_t *b = BCON_NEW("0", BCON_INT32(1), "1", BCON_UTF8("bar")); // The document for an array is a normal BSON document with integer values for the keys, starting with 0 and // continuing sequentially. char *str = bson_array_as_legacy_extended_json(b, NULL); printf("Legacy Extended JSON array: %s\n", str); // Prints: // Legacy Extended JSON array: [ 1, "bar" ] bson_free(str); bson_destroy(b); // bson_array_as_legacy_extended_json ... end } { // bson_as_json_with_opts ... begin bson_t *b = BCON_NEW("foo", BCON_INT32(123)); bson_json_opts_t *opts = bson_json_opts_new(BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED); char *str = bson_as_json_with_opts(b, NULL, opts); printf("Canonical Extended JSON: %s\n", str); // Prints: // Canonical Extended JSON: { "foo" : { "$numberInt" : "123" } } bson_free(str); bson_json_opts_destroy(opts); bson_destroy(b); // bson_as_json_with_opts ... end } } mongo-c-driver-2.2.1/src/libbson/examples/hello_bson.c000066400000000000000000000016221511661753600227050ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* -- sphinx-include-start -- */ #include #include int main(int argc, const char **argv) { bson_t *b; char *j; b = BCON_NEW("hello", BCON_UTF8("bson!")); j = bson_as_canonical_extended_json(b, NULL); printf("%s\n", j); bson_free(j); bson_destroy(b); return 0; } mongo-c-driver-2.2.1/src/libbson/examples/json-to-bson.c000066400000000000000000000044111511661753600231100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This program will print each JSON document contained in the provided files * as a BSON string to STDOUT. */ #include #include #include #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif int main(int argc, char *argv[]) { bson_json_reader_t *reader; bson_error_t error; const char *filename; bson_t doc = BSON_INITIALIZER; int i; int b; /* * Print program usage if no arguments are provided. */ if (argc == 1) { fprintf(stderr, "usage: %s FILE...\n", argv[0]); return 1; } /* * Process command line arguments expecting each to be a filename. */ for (i = 1; i < argc; i++) { filename = argv[i]; /* * Open the filename provided in command line arguments. */ if (0 == strcmp(filename, "-")) { reader = bson_json_reader_new_from_fd(STDIN_FILENO, false); } else { if (!(reader = bson_json_reader_new_from_file(filename, &error))) { fprintf(stderr, "Failed to open \"%s\": %s\n", filename, error.message); continue; } } /* * Convert each incoming document to BSON and print to stdout. */ while ((b = bson_json_reader_read(reader, &doc, &error))) { if (b < 0) { fprintf(stderr, "Error in json parsing:\n%s\n", error.message); abort(); } if (fwrite(bson_get_data(&doc), 1, doc.len, stdout) != doc.len) { fprintf(stderr, "Failed to write to stdout, exiting.\n"); exit(1); } bson_reinit(&doc); } bson_json_reader_destroy(reader); bson_destroy(&doc); } return 0; } mongo-c-driver-2.2.1/src/libbson/fuzz/000077500000000000000000000000001511661753600175745ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/fuzz/CMakeLists.txt000066400000000000000000000014301511661753600223320ustar00rootroot00000000000000add_library(fuzz-properties INTERFACE) target_link_libraries(fuzz-properties INTERFACE bson_static) set_property(TARGET fuzz-properties APPEND PROPERTY INTERFACE_LINK_OPTIONS -fsanitize=fuzzer) add_executable(fuzz-init-from-json EXCLUDE_FROM_ALL init-from-json.c) target_link_libraries(fuzz-init-from-json PRIVATE fuzz-properties) if(CMAKE_CXX_COMPILER) add_executable(fuzz-validate EXCLUDE_FROM_ALL validate.cpp) target_link_libraries(fuzz-validate PRIVATE fuzz-properties) add_executable(validate-repro EXCLUDE_FROM_ALL validate-repro.cpp) target_link_libraries(validate-repro PRIVATE bson_static) endif() add_executable(fuzz-bson-utf8-escape-for-json EXCLUDE_FROM_ALL utf8-escape-for-json.c) target_link_libraries(fuzz-bson-utf8-escape-for-json PRIVATE fuzz-properties) mongo-c-driver-2.2.1/src/libbson/fuzz/init-from-json.c000066400000000000000000000004511511661753600226130ustar00rootroot00000000000000#include #include #include #include int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { bson_error_t error; bson_t b; if (bson_init_from_json(&b, (const char *)data, size, &error)) { bson_destroy(&b); } return 0; } mongo-c-driver-2.2.1/src/libbson/fuzz/make-dicts.py000066400000000000000000000171111511661753600221700ustar00rootroot00000000000000from __future__ import annotations import enum import struct from typing import Final, Iterable, NamedTuple, Sequence def generate(): simple_oid = OID((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) ITEMS: list[LineItem] = [ Comment('This file is GENERATED! DO NOT MODIFY!'), Comment('Instead, modify the content of make-dicts.py'), Line(), Comment('Random values'), Entry('int32_1729', encode_value(1729)), Entry('int64_1729', struct.pack(' 0;'))), Entry('symbol_elem', element('Sym', Symbol('symbol'))), Entry('oid_elem', element('OID', simple_oid)), Entry('dbpointer_elem', element('dbp', DBPointer(String('db'), simple_oid))), Line(), Comment('Embedded nul'), Comment('This string contains an embedded null, which is abnormal but valid'), Entry('string_with_null', element('S0', 'string\0value')), Comment('This regex has an embedded null, which is invalid'), Entry('bad_regex_elem', element('RxB', Regex('f\0oo', 'ig'))), Comment("This element's key contains an embedded null, which is invalid"), Entry('bad_key_elem', element('foo\0bar', 'string')), Line(), Comment('Objects'), Entry('obj_with_string', wrap_obj(element('single-elem', 'foo'))), Entry('obj_with_null', wrap_obj(element('null', None))), Entry('obj_missing_term', wrap_obj(b'')[:-1]), ] for it in ITEMS: emit(it) BytesIter = bytes | Iterable['BytesIter'] def flatten(b: BytesIter) -> bytes: if isinstance(b, bytes): return b else: return b''.join(map(flatten, b)) def len_prefix(b: BytesIter) -> bytes: """Prepend an i32le byte-length prefix to a set of bytes""" b = flatten(b) length = len(b) return encode_value(length) + b def make_cstring(s: str) -> bytes: """Encode a UTF-8 string and append a null terminator""" return s.encode('utf-8') + b'\0' def make_string(s: str) -> bytes: """Create a length-prefixed string byte sequence""" return len_prefix(make_cstring(s)) def wrap_obj(items: BytesIter) -> bytes: """Wrap a sequence of bytes as if a BSON object (adds a header and trailing nul)""" bs = flatten(items) header = len(bs) + 5 return encode_value(header) + bs + b'\0' class UndefinedType: def __bytes__(self) -> bytes: return b'' class Binary(NamedTuple): tag: int data: bytes def __bytes__(self) -> bytes: return encode_value(len(self.data)) + bytes([self.tag]) + self.data class OID(NamedTuple): octets: tuple[int, int, int, int, int, int, int, int, int, int, int, int] def __bytes__(self) -> bytes: return bytes(self.octets) class DBPointer(NamedTuple): db: String oid: OID def __bytes__(self) -> bytes: return self.db.__bytes__() + self.oid.__bytes__() class Regex(NamedTuple): rx: str opts: str def __bytes__(self) -> bytes: return make_cstring(self.rx) + make_cstring(self.opts) class Elem(NamedTuple): key: str val: ValueType def __bytes__(self) -> bytes: return element(self.key, self.val) class Doc(NamedTuple): items: Sequence[Elem] = () def __bytes__(self) -> bytes: return wrap_obj((e.__bytes__() for e in self.items)) class String(NamedTuple): s: str def __bytes__(self) -> bytes: return make_string(self.s) class Symbol(String): pass class Code(String): pass class CodeWithScope(NamedTuple): code: str scope: Doc def __bytes__(self) -> bytes: string = make_string(self.code) doc = self.scope.__bytes__() length = len(string) + len(doc) + 4 return encode_value(length) + string + doc Undefined: Final = UndefinedType() ValueType = ( int | str | float | None | UndefinedType | Binary | Regex | Doc | CodeWithScope | String | Symbol | Code | OID | DBPointer ) def encode_value(val: ValueType) -> bytes: match val: case int(n): return struct.pack(' bytes: if type is not None: return flatten([bytes([type.value]), make_cstring(key), encode_value(value)]) match value: case int(): type = Tag.Int32 case float(): type = Tag.Double case None: type = Tag.Null case UndefinedType(): type = Tag.Undefined case Binary(): type = Tag.Binary case Regex(): type = Tag.Regex case Doc(): type = Tag.Doc case CodeWithScope(): type = Tag.CodeWithScope case Code(): type = Tag.Code case Symbol(): type = Tag.Symbol case str() | String(): # Must appear after Code()/Symbol() type = Tag.UTF8 case OID(): type = Tag.OID case DBPointer(): type = Tag.DBPointer return element(key, value, type=type) class Entry(NamedTuple): key: str 'The key for the entry. Only for human readability' value: bytes 'The arbitrary bytes that make up the entry' class Comment(NamedTuple): txt: str class Line(NamedTuple): txt: str = '' LineItem = Entry | Comment | Line def escape(b: bytes) -> Iterable[str]: s = b.decode('ascii', 'backslashreplace') for u8 in b: s = chr(u8) # 0 <= u8 and u8 <= 255 if s.isascii() and s.isprintable(): yield s continue # Byte is not valid ASCII, or is not a printable char yield f'\\x{u8:0>2x}' def emit(item: LineItem): match item: case Line(t): print(t) case Comment(txt): print(f'# {txt}') case Entry(key, val): s = ''.join(escape(val)) s = s.replace('"', r'\x22') print(f'{key}="{s}"') if __name__ == '__main__': generate() mongo-c-driver-2.2.1/src/libbson/fuzz/utf8-escape-for-json.c000066400000000000000000000010111511661753600236100ustar00rootroot00000000000000#include int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { // Reject inputs with lengths greater than ssize_t if (size > (size_t)SSIZE_MAX) { return -1; } // Check if input crashes program (ok if return NULL) char *got = bson_utf8_escape_for_json((const char *)data, (ssize_t)size); // If UTF-8 is valid, we should get some non-null response if (bson_utf8_validate((const char *)data, size, true)) { BSON_ASSERT(got); } bson_free(got); return 0; } mongo-c-driver-2.2.1/src/libbson/fuzz/validate-repro.cpp000066400000000000000000000016431511661753600232220ustar00rootroot00000000000000#include "./validate.hpp" #include #include #include #include int main(int argc, char **argv) { if (argc != 2) { std::fprintf(stderr, "Usage: %s \n", argv[0]); return 2; } std::ifstream infile{argv[1], std::ios::binary}; if (!infile) { std::fprintf(stderr, "Failed to open file [%s]: %s\n", argv[1], std::strerror(errno)); return 3; } std::stringstream sbuf; sbuf << infile.rdbuf(); auto s = sbuf.str(); int rc = validate_one_input(reinterpret_cast(s.data()), s.size()); if (rc == 0) { std::fprintf(stderr, "Validation returned normally (no bug?)\n"); } else if (rc == -1) { std::fprintf(stderr, "Test case was rejected by the fuzzer (not a valid corpus item?)\n"); } else { std::fprintf(stderr, "Test case returned unexpected result code %d (huh?)\n", rc); } return rc; } mongo-c-driver-2.2.1/src/libbson/fuzz/validate.cpp000066400000000000000000000002461511661753600220730ustar00rootroot00000000000000#include "./validate.hpp" #include extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { return validate_one_input(data, size); } mongo-c-driver-2.2.1/src/libbson/fuzz/validate.dict000066400000000000000000000031051511661753600222310ustar00rootroot00000000000000# This file is GENERATED! DO NOT MODIFY! # Instead, modify the content of make-dicts.py # Random values int32_1729="\xc1\x06\x00\x00" int64_1729="\xc1\x06\x00\x00\x00\x00\x00\x00" prefixed_string="\x10\x00\x00\x00prefixed-string\x00" empty_obj="\x05\x00\x00\x00\x00" c_string="null-terminated-string\x00" # Elements null_elem="\x0aN\x00" undef_elem="\x06U\x00" string_elem="\x02S\x00\x0d\x00\x00\x00string-value\x00" empty_bin_elem="\x05Bg\x00\x00\x00\x00\x00\x00" empty_regex_elem="\x0bRx0\x00\x00\x00" simple_regex_elem="\x0bRx1\x00foo\x00ig\x00" encrypted_bin_elem="\x05Be\x00\x04\x00\x00\x00\x06meow" empty_obj_elem="\x03Obj0\x00\x05\x00\x00\x00\x00" code_w_s_elem="\x0fClz\x00\x22\x00\x00\x00\x08\x00\x00\x00void 0;\x00\x12\x00\x00\x00\x02foo\x00\x04\x00\x00\x00bar\x00\x00" code_elem="\x0dJs\x00\x09\x00\x00\x00() => 0;\x00" symbol_elem="\x0eSym\x00\x07\x00\x00\x00symbol\x00" oid_elem="\x07OID\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c" dbpointer_elem="\x0cdbp\x00\x03\x00\x00\x00db\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c" # Embedded nul # This string contains an embedded null, which is abnormal but valid string_with_null="\x02S0\x00\x0d\x00\x00\x00string\x00value\x00" # This regex has an embedded null, which is invalid bad_regex_elem="\x0bRxB\x00f\x00oo\x00ig\x00" # This element's key contains an embedded null, which is invalid bad_key_elem="\x02foo\x00bar\x00\x07\x00\x00\x00string\x00" # Objects obj_with_string="\x1a\x00\x00\x00\x02single-elem\x00\x04\x00\x00\x00foo\x00\x00" obj_with_null="\x0b\x00\x00\x00\x0anull\x00\x00" obj_missing_term="\x05\x00\x00\x00" mongo-c-driver-2.2.1/src/libbson/fuzz/validate.hpp000066400000000000000000000052601511661753600221010ustar00rootroot00000000000000#include #include #include #include /** * @brief Do a BSON validation on a single test case. * * The test case input consists of a single byte specifying the validation flags, * followed by element bytes to be validated. * * The low six bits of the head byte are treated as flags. If any other bits are * set, then the case will be rejected from the corpus to prevent redundant cases since those * bits cannot effect the outcome. * * The low five bits are cast into bson_validate_flags_t, and the sixth bit tells us whether we * will pass an error offset pointer. * * The `data` points to the inner contents of a bson document, not to the document header. We * construct a buffer that contains a valid BSON header and trailer to wrap around these bytes before * we do the validation. */ inline int validate_one_input(const uint8_t *data, size_t size) { if (size < 1) { // We need at least one byte return -1; } const int six_bits = 0b111111; const uint8_t head_byte = data[0]; if ((head_byte & six_bits) != head_byte) { // Don't allow any more than six bits to be set in the first byte return -1; } // Grab the five low bits as control flags const bson_validate_flags_t flags = static_cast(data[0] & (six_bits >> 1)); // If bit 6 is set, pass an offset pointer const bool pass_offset = head_byte & (1 << 5); // Treat the first byte as the flags, and the BSON data is what remains: const uint8_t *bson_doc_data = data + 1; const size_t bson_data_size = size - 1; if (bson_data_size > static_cast(INT32_MAX)) { // This is very unlikely to happen, but reject this return -1; } // vec that will hold the entire document std::vector bson_doc; // Prepare the region. +4 for header, +1 for null terminator bson_doc.resize(bson_data_size + 5, 0); // Insert the header const uint32_t header_i32 = static_cast(bson_doc.size()); const uint32_t header_i32le = BSON_UINT32_TO_LE(header_i32); std::memcpy(bson_doc.data(), &header_i32le, sizeof header_i32le); // Insert the inner data: std::memcpy(bson_doc.data() + 4, bson_doc_data, bson_data_size); // std::vector will have already added a null terminator on resize() bson_t b = BSON_INITIALIZER; if (!bson_init_static(&b, bson_doc.data(), bson_doc.size())) { // Basic header/trailer validation failed. This should not occur since we constructed it // correctly ourselves. abort(); } size_t offset = 0; size_t *offset_ptr = pass_offset ? &offset : NULL; bson_validate(&b, (bson_validate_flags_t)flags, offset_ptr); return 0; } mongo-c-driver-2.2.1/src/libbson/libbson.rc.in000066400000000000000000000032201511661753600211560ustar00rootroot00000000000000// Defines Version Information to include in DLL on Windows. // Refer: https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource #include // Defines VS_VERSION_INFO #include // Defines BSON_MAJOR_VERSION and other version macros. #define BSON_OUTPUT_BASENAME "@BSON_OUTPUT_BASENAME@" VS_VERSION_INFO VERSIONINFO FILEVERSION BSON_MAJOR_VERSION,BSON_MINOR_VERSION,BSON_MICRO_VERSION,0 PRODUCTVERSION BSON_MAJOR_VERSION,BSON_MINOR_VERSION,BSON_MICRO_VERSION,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0L #endif // Set FILEOS to VOS_UNKNOWN. There is no documented value for 64-bit builds. FILEOS VOS_UNKNOWN FILETYPE VFT_DLL // Set FILESUBTYPE to VFT2_UNKNOWN. There is no applicable value. FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN // Use langID `0409` for "US English". Use charsetID `04b0` for "Unicode" BLOCK "040904b0" BEGIN VALUE "CompanyName", "MongoDB, Inc" VALUE "FileDescription", "A BSON Library for C" VALUE "FileVersion", BSON_VERSION_S VALUE "InternalName", BSON_OUTPUT_BASENAME "@PROJECT_VERSION_MAJOR@" VALUE "OriginalFilename", BSON_OUTPUT_BASENAME "@PROJECT_VERSION_MAJOR@.dll" VALUE "ProductName", "MongoDB C Driver" VALUE "ProductVersion", BSON_VERSION_S VALUE "LegalCopyright", "Copyright 2009-present MongoDB, Inc." END END BLOCK "VarFileInfo" BEGIN // Use langID `0x0409` for "U.S. English". Use charsetID `1200` for "Unicode". VALUE "Translation", 0x409, 1200 END END mongo-c-driver-2.2.1/src/libbson/src/000077500000000000000000000000001511661753600173655ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/src/bson/000077500000000000000000000000001511661753600203265ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/src/bson/.gitignore000066400000000000000000000000301511661753600223070ustar00rootroot00000000000000bson-stdint.h .dirstamp mongo-c-driver-2.2.1/src/libbson/src/bson/bson-bcon.c000066400000000000000000000643101511661753600223560ustar00rootroot00000000000000/* * @file bcon.c * @brief BCON (BSON C Object Notation) Implementation */ /* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* These stack manipulation macros are used to manage append recursion in * bcon_append_ctx_va(). They take care of some awkward dereference rules (the * real bson object isn't in the stack, but accessed by pointer) and add in run * time asserts to make sure we don't blow the stack in either direction */ #define STACK_ELE(_delta, _name) (ctx->stack[(_delta) + ctx->n]._name) #define STACK_BSON(_delta) (((_delta) + ctx->n) == 0 ? bson : &STACK_ELE(_delta, bson)) #define STACK_ITER(_delta) (((_delta) + ctx->n) == 0 ? &root_iter : &STACK_ELE(_delta, iter)) #define STACK_BSON_PARENT STACK_BSON(-1) #define STACK_BSON_CHILD STACK_BSON(0) #define STACK_ITER_CHILD STACK_ITER(0) #define STACK_I STACK_ELE(0, i) #define STACK_IS_ARRAY STACK_ELE(0, is_array) #define STACK_PUSH_ARRAY(statement) \ do { \ BSON_ASSERT(ctx->n < (BCON_STACK_MAX - 1)); \ ctx->n++; \ STACK_I = 0; \ STACK_IS_ARRAY = 1; \ statement; \ } while (0) #define STACK_PUSH_DOC(statement) \ do { \ BSON_ASSERT(ctx->n < (BCON_STACK_MAX - 1)); \ ctx->n++; \ STACK_IS_ARRAY = 0; \ statement; \ } while (0) #define STACK_POP_ARRAY(statement) \ do { \ BSON_ASSERT(STACK_IS_ARRAY); \ BSON_ASSERT(ctx->n != 0); \ statement; \ ctx->n--; \ } while (0) #define STACK_POP_DOC(statement) \ do { \ BSON_ASSERT(!STACK_IS_ARRAY); \ BSON_ASSERT(ctx->n != 0); \ statement; \ ctx->n--; \ } while (0) /* This is a landing pad union for all of the types we can process with bcon. * We need actual storage for this to capture the return value of va_arg, which * takes multiple calls to get everything we need for some complex types */ typedef union bcon_append { char *UTF8; double DOUBLE; bson_t *DOCUMENT; bson_t *ARRAY; bson_t *BCON; struct { bson_subtype_t subtype; uint8_t *binary; uint32_t length; } BIN; bson_oid_t *OID; bool BOOL; int64_t DATE_TIME; struct { char *regex; char *flags; } REGEX; struct { char *collection; bson_oid_t *oid; } DBPOINTER; const char *CODE; char *SYMBOL; struct { const char *js; bson_t *scope; } CODEWSCOPE; int32_t INT32; struct { uint32_t timestamp; uint32_t increment; } TIMESTAMP; int64_t INT64; bson_decimal128_t *DECIMAL128; const bson_iter_t *ITER; } bcon_append_t; /* same as bcon_append_t. Some extra symbols and varying types that handle the * differences between bson_append and bson_iter */ typedef union bcon_extract { bson_type_t TYPE; bson_iter_t *ITER; const char *key; const char **UTF8; double *DOUBLE; bson_t *DOCUMENT; bson_t *ARRAY; struct { bson_subtype_t *subtype; const uint8_t **binary; uint32_t *length; } BIN; const bson_oid_t **OID; bool *BOOL; int64_t *DATE_TIME; struct { const char **regex; const char **flags; } REGEX; struct { const char **collection; const bson_oid_t **oid; } DBPOINTER; const char **CODE; const char **SYMBOL; struct { const char **js; bson_t *scope; } CODEWSCOPE; int32_t *INT32; struct { uint32_t *timestamp; uint32_t *increment; } TIMESTAMP; int64_t *INT64; bson_decimal128_t *DECIMAL128; } bcon_extract_t; static const char *gBconMagic = "BCON_MAGIC"; static const char *gBconeMagic = "BCONE_MAGIC"; const char * bson_bcon_magic(void) { return gBconMagic; } const char * bson_bcone_magic(void) { return gBconeMagic; } static void _noop(void) { } /* appends val to the passed bson object. Meant to be a super simple dispatch * table */ static void _bcon_append_single(bson_t *bson, bcon_type_t type, const char *key, bcon_append_t *val) { switch ((int)type) { case BCON_TYPE_UTF8: BSON_ASSERT(bson_append_utf8(bson, key, -1, val->UTF8, -1)); break; case BCON_TYPE_DOUBLE: BSON_ASSERT(bson_append_double(bson, key, -1, val->DOUBLE)); break; case BCON_TYPE_BIN: { BSON_ASSERT(bson_append_binary(bson, key, -1, val->BIN.subtype, val->BIN.binary, val->BIN.length)); break; } case BCON_TYPE_UNDEFINED: BSON_ASSERT(bson_append_undefined(bson, key, -1)); break; case BCON_TYPE_OID: BSON_ASSERT(bson_append_oid(bson, key, -1, val->OID)); break; case BCON_TYPE_BOOL: BSON_ASSERT(bson_append_bool(bson, key, -1, (bool)val->BOOL)); break; case BCON_TYPE_DATE_TIME: BSON_ASSERT(bson_append_date_time(bson, key, -1, val->DATE_TIME)); break; case BCON_TYPE_NULL: BSON_ASSERT(bson_append_null(bson, key, -1)); break; case BCON_TYPE_REGEX: { BSON_ASSERT(bson_append_regex(bson, key, -1, val->REGEX.regex, val->REGEX.flags)); break; } case BCON_TYPE_DBPOINTER: { BSON_ASSERT(bson_append_dbpointer(bson, key, -1, val->DBPOINTER.collection, val->DBPOINTER.oid)); break; } case BCON_TYPE_CODE: BSON_ASSERT(bson_append_code(bson, key, -1, val->CODE)); break; case BCON_TYPE_SYMBOL: BSON_ASSERT(bson_append_symbol(bson, key, -1, val->SYMBOL, -1)); break; case BCON_TYPE_CODEWSCOPE: BSON_ASSERT(bson_append_code_with_scope(bson, key, -1, val->CODEWSCOPE.js, val->CODEWSCOPE.scope)); break; case BCON_TYPE_INT32: BSON_ASSERT(bson_append_int32(bson, key, -1, val->INT32)); break; case BCON_TYPE_TIMESTAMP: { BSON_ASSERT(bson_append_timestamp(bson, key, -1, val->TIMESTAMP.timestamp, val->TIMESTAMP.increment)); break; } case BCON_TYPE_INT64: BSON_ASSERT(bson_append_int64(bson, key, -1, val->INT64)); break; case BCON_TYPE_DECIMAL128: BSON_ASSERT(bson_append_decimal128(bson, key, -1, val->DECIMAL128)); break; case BCON_TYPE_MAXKEY: BSON_ASSERT(bson_append_maxkey(bson, key, -1)); break; case BCON_TYPE_MINKEY: BSON_ASSERT(bson_append_minkey(bson, key, -1)); break; case BCON_TYPE_ARRAY: { BSON_ASSERT(bson_append_array(bson, key, -1, val->ARRAY)); break; } case BCON_TYPE_DOCUMENT: { BSON_ASSERT(bson_append_document(bson, key, -1, val->DOCUMENT)); break; } case BCON_TYPE_ITER: BSON_ASSERT(bson_append_iter(bson, key, -1, val->ITER)); break; default: BSON_ASSERT(0); break; } } #define CHECK_TYPE(_type) \ do { \ if (bson_iter_type(iter) != (_type)) { \ return false; \ } \ } while (0) /* extracts the value under the iterator and writes it to val. returns false * if the iterator type doesn't match the token type. * * There are two magic tokens: * * BCONE_SKIP - * Let's us verify that a key has a type, without caring about its value. * This allows for wider declarative BSON verification * * BCONE_ITER - * Returns the underlying iterator. This could allow for more complicated, * procedural verification (if a parameter could have multiple types). * */ static bool _bcon_extract_single(const bson_iter_t *iter, bcon_type_t type, bcon_extract_t *val) { switch ((int)type) { case BCON_TYPE_UTF8: CHECK_TYPE(BSON_TYPE_UTF8); *val->UTF8 = bson_iter_utf8(iter, NULL); break; case BCON_TYPE_DOUBLE: CHECK_TYPE(BSON_TYPE_DOUBLE); *val->DOUBLE = bson_iter_double(iter); break; case BCON_TYPE_BIN: CHECK_TYPE(BSON_TYPE_BINARY); bson_iter_binary(iter, val->BIN.subtype, val->BIN.length, val->BIN.binary); break; case BCON_TYPE_UNDEFINED: CHECK_TYPE(BSON_TYPE_UNDEFINED); break; case BCON_TYPE_OID: CHECK_TYPE(BSON_TYPE_OID); *val->OID = bson_iter_oid(iter); break; case BCON_TYPE_BOOL: CHECK_TYPE(BSON_TYPE_BOOL); *val->BOOL = bson_iter_bool(iter); break; case BCON_TYPE_DATE_TIME: CHECK_TYPE(BSON_TYPE_DATE_TIME); *val->DATE_TIME = bson_iter_date_time(iter); break; case BCON_TYPE_NULL: CHECK_TYPE(BSON_TYPE_NULL); break; case BCON_TYPE_REGEX: CHECK_TYPE(BSON_TYPE_REGEX); *val->REGEX.regex = bson_iter_regex(iter, val->REGEX.flags); break; case BCON_TYPE_DBPOINTER: CHECK_TYPE(BSON_TYPE_DBPOINTER); bson_iter_dbpointer(iter, NULL, val->DBPOINTER.collection, val->DBPOINTER.oid); break; case BCON_TYPE_CODE: CHECK_TYPE(BSON_TYPE_CODE); *val->CODE = bson_iter_code(iter, NULL); break; case BCON_TYPE_SYMBOL: CHECK_TYPE(BSON_TYPE_SYMBOL); *val->SYMBOL = bson_iter_symbol(iter, NULL); break; case BCON_TYPE_CODEWSCOPE: { const uint8_t *buf; uint32_t len; CHECK_TYPE(BSON_TYPE_CODEWSCOPE); *val->CODEWSCOPE.js = bson_iter_codewscope(iter, NULL, &len, &buf); BSON_ASSERT(bson_init_static(val->CODEWSCOPE.scope, buf, len)); break; } case BCON_TYPE_INT32: CHECK_TYPE(BSON_TYPE_INT32); *val->INT32 = bson_iter_int32(iter); break; case BCON_TYPE_TIMESTAMP: CHECK_TYPE(BSON_TYPE_TIMESTAMP); bson_iter_timestamp(iter, val->TIMESTAMP.timestamp, val->TIMESTAMP.increment); break; case BCON_TYPE_INT64: CHECK_TYPE(BSON_TYPE_INT64); *val->INT64 = bson_iter_int64(iter); break; case BCON_TYPE_DECIMAL128: CHECK_TYPE(BSON_TYPE_DECIMAL128); BSON_ASSERT(bson_iter_decimal128(iter, val->DECIMAL128)); break; case BCON_TYPE_MAXKEY: CHECK_TYPE(BSON_TYPE_MAXKEY); break; case BCON_TYPE_MINKEY: CHECK_TYPE(BSON_TYPE_MINKEY); break; case BCON_TYPE_ARRAY: { const uint8_t *buf; uint32_t len; CHECK_TYPE(BSON_TYPE_ARRAY); bson_iter_array(iter, &len, &buf); BSON_ASSERT(bson_init_static(val->ARRAY, buf, len)); break; } case BCON_TYPE_DOCUMENT: { const uint8_t *buf; uint32_t len; CHECK_TYPE(BSON_TYPE_DOCUMENT); bson_iter_document(iter, &len, &buf); BSON_ASSERT(bson_init_static(val->DOCUMENT, buf, len)); break; } case BCON_TYPE_SKIP: CHECK_TYPE(val->TYPE); break; case BCON_TYPE_ITER: memcpy(val->ITER, iter, sizeof *iter); break; default: BSON_ASSERT(0); break; } return true; } /* Consumes ap, storing output values into u and returning the type of the * captured token. * * The basic workflow goes like this: * * 1. Look at the current arg. It will be a char * * a. If it's a NULL, we're done processing. * b. If it's BCON_MAGIC (a symbol with storage in this module) * I. The next token is the type * II. The type specifies how many args to eat and their types * c. Otherwise it's either recursion related or a raw string * I. If the first byte is '{', '}', '[', or ']' pass back an * appropriate recursion token * II. If not, just call it a UTF8 token and pass that back */ static bcon_type_t _bcon_append_tokenize(va_list *ap, bcon_append_t *u) { char *mark; bcon_type_t type; mark = va_arg(*ap, char *); BSON_ASSERT(mark != BCONE_MAGIC); if (mark == NULL) { type = BCON_TYPE_END; } else if (mark == BCON_MAGIC) { type = va_arg(*ap, bcon_type_t); switch ((int)type) { case BCON_TYPE_UTF8: u->UTF8 = va_arg(*ap, char *); break; case BCON_TYPE_DOUBLE: u->DOUBLE = va_arg(*ap, double); break; case BCON_TYPE_DOCUMENT: u->DOCUMENT = va_arg(*ap, bson_t *); break; case BCON_TYPE_ARRAY: u->ARRAY = va_arg(*ap, bson_t *); break; case BCON_TYPE_BIN: u->BIN.subtype = va_arg(*ap, bson_subtype_t); u->BIN.binary = va_arg(*ap, uint8_t *); u->BIN.length = va_arg(*ap, uint32_t); break; case BCON_TYPE_UNDEFINED: break; case BCON_TYPE_OID: u->OID = va_arg(*ap, bson_oid_t *); break; case BCON_TYPE_BOOL: u->BOOL = va_arg(*ap, int); break; case BCON_TYPE_DATE_TIME: u->DATE_TIME = va_arg(*ap, int64_t); break; case BCON_TYPE_NULL: break; case BCON_TYPE_REGEX: u->REGEX.regex = va_arg(*ap, char *); u->REGEX.flags = va_arg(*ap, char *); break; case BCON_TYPE_DBPOINTER: u->DBPOINTER.collection = va_arg(*ap, char *); u->DBPOINTER.oid = va_arg(*ap, bson_oid_t *); break; case BCON_TYPE_CODE: u->CODE = va_arg(*ap, char *); break; case BCON_TYPE_SYMBOL: u->SYMBOL = va_arg(*ap, char *); break; case BCON_TYPE_CODEWSCOPE: u->CODEWSCOPE.js = va_arg(*ap, char *); u->CODEWSCOPE.scope = va_arg(*ap, bson_t *); break; case BCON_TYPE_INT32: u->INT32 = va_arg(*ap, int32_t); break; case BCON_TYPE_TIMESTAMP: u->TIMESTAMP.timestamp = va_arg(*ap, uint32_t); u->TIMESTAMP.increment = va_arg(*ap, uint32_t); break; case BCON_TYPE_INT64: u->INT64 = va_arg(*ap, int64_t); break; case BCON_TYPE_DECIMAL128: u->DECIMAL128 = va_arg(*ap, bson_decimal128_t *); break; case BCON_TYPE_MAXKEY: break; case BCON_TYPE_MINKEY: break; case BCON_TYPE_BCON: u->BCON = va_arg(*ap, bson_t *); break; case BCON_TYPE_ITER: u->ITER = va_arg(*ap, const bson_iter_t *); break; default: BSON_ASSERT(0); break; } } else { switch (mark[0]) { case '{': type = BCON_TYPE_DOC_START; break; case '}': type = BCON_TYPE_DOC_END; break; case '[': type = BCON_TYPE_ARRAY_START; break; case ']': type = BCON_TYPE_ARRAY_END; break; default: type = BCON_TYPE_UTF8; u->UTF8 = mark; break; } } return type; } /* Consumes ap, storing output values into u and returning the type of the * captured token. * * The basic workflow goes like this: * * 1. Look at the current arg. It will be a char * * a. If it's a NULL, we're done processing. * b. If it's BCONE_MAGIC (a symbol with storage in this module) * I. The next token is the type * II. The type specifies how many args to eat and their types * c. Otherwise it's either recursion related or a raw string * I. If the first byte is '{', '}', '[', or ']' pass back an * appropriate recursion token * II. If not, just call it a UTF8 token and pass that back */ static bcon_type_t _bcon_extract_tokenize(va_list *ap, bcon_extract_t *u) { char *mark; bcon_type_t type; mark = va_arg(*ap, char *); BSON_ASSERT(mark != BCON_MAGIC); if (mark == NULL) { type = BCON_TYPE_END; } else if (mark == BCONE_MAGIC) { type = va_arg(*ap, bcon_type_t); switch ((int)type) { case BCON_TYPE_UTF8: u->UTF8 = va_arg(*ap, const char **); break; case BCON_TYPE_DOUBLE: u->DOUBLE = va_arg(*ap, double *); break; case BCON_TYPE_DOCUMENT: u->DOCUMENT = va_arg(*ap, bson_t *); break; case BCON_TYPE_ARRAY: u->ARRAY = va_arg(*ap, bson_t *); break; case BCON_TYPE_BIN: u->BIN.subtype = va_arg(*ap, bson_subtype_t *); u->BIN.binary = va_arg(*ap, const uint8_t **); u->BIN.length = va_arg(*ap, uint32_t *); break; case BCON_TYPE_UNDEFINED: break; case BCON_TYPE_OID: u->OID = va_arg(*ap, const bson_oid_t **); break; case BCON_TYPE_BOOL: u->BOOL = va_arg(*ap, bool *); break; case BCON_TYPE_DATE_TIME: u->DATE_TIME = va_arg(*ap, int64_t *); break; case BCON_TYPE_NULL: break; case BCON_TYPE_REGEX: u->REGEX.regex = va_arg(*ap, const char **); u->REGEX.flags = va_arg(*ap, const char **); break; case BCON_TYPE_DBPOINTER: u->DBPOINTER.collection = va_arg(*ap, const char **); u->DBPOINTER.oid = va_arg(*ap, const bson_oid_t **); break; case BCON_TYPE_CODE: u->CODE = va_arg(*ap, const char **); break; case BCON_TYPE_SYMBOL: u->SYMBOL = va_arg(*ap, const char **); break; case BCON_TYPE_CODEWSCOPE: u->CODEWSCOPE.js = va_arg(*ap, const char **); u->CODEWSCOPE.scope = va_arg(*ap, bson_t *); break; case BCON_TYPE_INT32: u->INT32 = va_arg(*ap, int32_t *); break; case BCON_TYPE_TIMESTAMP: u->TIMESTAMP.timestamp = va_arg(*ap, uint32_t *); u->TIMESTAMP.increment = va_arg(*ap, uint32_t *); break; case BCON_TYPE_INT64: u->INT64 = va_arg(*ap, int64_t *); break; case BCON_TYPE_DECIMAL128: u->DECIMAL128 = va_arg(*ap, bson_decimal128_t *); break; case BCON_TYPE_MAXKEY: break; case BCON_TYPE_MINKEY: break; case BCON_TYPE_SKIP: u->TYPE = va_arg(*ap, bson_type_t); break; case BCON_TYPE_ITER: u->ITER = va_arg(*ap, bson_iter_t *); break; default: BSON_ASSERT(0); break; } } else { switch (mark[0]) { case '{': type = BCON_TYPE_DOC_START; break; case '}': type = BCON_TYPE_DOC_END; break; case '[': type = BCON_TYPE_ARRAY_START; break; case ']': type = BCON_TYPE_ARRAY_END; break; default: type = BCON_TYPE_RAW; u->key = mark; break; } } return type; } /* This trivial utility function is useful for concatenating a bson object onto * the end of another, ignoring the keys from the source bson object and * continuing to use and increment the keys from the source. It's only useful * when called from bcon_append_ctx_va */ static void _bson_concat_array(bson_t *dest, const bson_t *src, bcon_append_ctx_t *ctx) { bson_iter_t iter; const char *key; char i_str[16]; bool r; r = bson_iter_init(&iter, src); if (!r) { fprintf(stderr, "Invalid BSON document, possible memory coruption.\n"); return; } STACK_I--; while (bson_iter_next(&iter)) { bson_uint32_to_string(STACK_I, &key, i_str, sizeof i_str); STACK_I++; BSON_ASSERT(bson_append_iter(dest, key, -1, &iter)); } } /* Append_ctx_va consumes the va_list until NULL is found, appending into bson * as tokens are found. It can receive or return an in-progress bson object * via the ctx param. It can also operate on the middle of a va_list, and so * can be wrapped inside of another varargs function. * * Note that passing in a va_list that isn't perferectly formatted for BCON * ingestion will almost certainly result in undefined behavior * * The workflow relies on the passed ctx object, which holds a stack of bson * objects, along with metadata (if the emedded layer is an array, and which * element it is on if so). We iterate, generating tokens from the va_list, * until we reach an END token. If any errors occur, we just blow up (the * var_args stuff is already incredibly fragile to mistakes, and we have no way * of introspecting, so just don't screw it up). * * There are also a few STACK_* macros in here which manipulate ctx that are * defined up top. * */ void bcon_append_ctx_va(bson_t *bson, bcon_append_ctx_t *ctx, va_list *ap) { bcon_type_t type; const char *key; char i_str[16]; bcon_append_t u = {0}; while (1) { if (STACK_IS_ARRAY) { bson_uint32_to_string(STACK_I, &key, i_str, sizeof i_str); STACK_I++; } else { type = _bcon_append_tokenize(ap, &u); if (type == BCON_TYPE_END) { return; } if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC(bson_append_document_end(STACK_BSON_PARENT, STACK_BSON_CHILD)); continue; } if (type == BCON_TYPE_BCON) { bson_concat(STACK_BSON_CHILD, u.BCON); continue; } BSON_ASSERT(type == BCON_TYPE_UTF8); key = u.UTF8; } type = _bcon_append_tokenize(ap, &u); BSON_ASSERT(type != BCON_TYPE_END); switch ((int)type) { case BCON_TYPE_BCON: BSON_ASSERT(STACK_IS_ARRAY); _bson_concat_array(STACK_BSON_CHILD, u.BCON, ctx); break; case BCON_TYPE_DOC_START: STACK_PUSH_DOC(bson_append_document_begin(STACK_BSON_PARENT, key, -1, STACK_BSON_CHILD)); break; case BCON_TYPE_DOC_END: STACK_POP_DOC(bson_append_document_end(STACK_BSON_PARENT, STACK_BSON_CHILD)); break; case BCON_TYPE_ARRAY_START: STACK_PUSH_ARRAY(bson_append_array_begin(STACK_BSON_PARENT, key, -1, STACK_BSON_CHILD)); break; case BCON_TYPE_ARRAY_END: STACK_POP_ARRAY(bson_append_array_end(STACK_BSON_PARENT, STACK_BSON_CHILD)); break; default: _bcon_append_single(STACK_BSON_CHILD, type, key, &u); break; } } } /* extract_ctx_va consumes the va_list until NULL is found, extracting values * as tokens are found. It can receive or return an in-progress bson object * via the ctx param. It can also operate on the middle of a va_list, and so * can be wrapped inside of another varargs function. * * Note that passing in a va_list that isn't perferectly formatted for BCON * ingestion will almost certainly result in undefined behavior * * The workflow relies on the passed ctx object, which holds a stack of iterator * objects, along with metadata (if the emedded layer is an array, and which * element it is on if so). We iterate, generating tokens from the va_list, * until we reach an END token. If any errors occur, we just blow up (the * var_args stuff is already incredibly fragile to mistakes, and we have no way * of introspecting, so just don't screw it up). * * There are also a few STACK_* macros in here which manipulate ctx that are * defined up top. * * The function returns true if all tokens could be successfully matched, false * otherwise. * */ bool bcon_extract_ctx_va(bson_t *bson, bcon_extract_ctx_t *ctx, va_list *ap) { bcon_type_t type; const char *key; bson_iter_t root_iter; bson_iter_t current_iter; char i_str[16]; bcon_extract_t u = {0}; BSON_ASSERT(bson_iter_init(&root_iter, bson)); while (1) { if (STACK_IS_ARRAY) { bson_uint32_to_string(STACK_I, &key, i_str, sizeof i_str); STACK_I++; } else { type = _bcon_extract_tokenize(ap, &u); if (type == BCON_TYPE_END) { return true; } if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC(_noop()); continue; } BSON_ASSERT(type == BCON_TYPE_RAW); key = u.key; } type = _bcon_extract_tokenize(ap, &u); BSON_ASSERT(type != BCON_TYPE_END); if (type == BCON_TYPE_DOC_END) { STACK_POP_DOC(_noop()); } else if (type == BCON_TYPE_ARRAY_END) { STACK_POP_ARRAY(_noop()); } else { memcpy(¤t_iter, STACK_ITER_CHILD, sizeof current_iter); if (!bson_iter_find(¤t_iter, key)) { return false; } switch ((int)type) { case BCON_TYPE_DOC_START: if (bson_iter_type(¤t_iter) != BSON_TYPE_DOCUMENT) { return false; } STACK_PUSH_DOC(bson_iter_recurse(¤t_iter, STACK_ITER_CHILD)); break; case BCON_TYPE_ARRAY_START: if (bson_iter_type(¤t_iter) != BSON_TYPE_ARRAY) { return false; } STACK_PUSH_ARRAY(bson_iter_recurse(¤t_iter, STACK_ITER_CHILD)); break; default: if (!_bcon_extract_single(¤t_iter, type, &u)) { return false; } break; } } } } void bcon_extract_ctx_init(bcon_extract_ctx_t *ctx) { ctx->n = 0; ctx->stack[0].is_array = false; } bool bcon_extract(bson_t *bson, ...) { va_list ap; bcon_extract_ctx_t ctx; bool r; bcon_extract_ctx_init(&ctx); va_start(ap, bson); r = bcon_extract_ctx_va(bson, &ctx, &ap); va_end(ap); return r; } void bcon_append(bson_t *bson, ...) { va_list ap; bcon_append_ctx_t ctx; bcon_append_ctx_init(&ctx); va_start(ap, bson); bcon_append_ctx_va(bson, &ctx, &ap); va_end(ap); } void bcon_append_ctx(bson_t *bson, bcon_append_ctx_t *ctx, ...) { va_list ap; va_start(ap, ctx); bcon_append_ctx_va(bson, ctx, &ap); va_end(ap); } void bcon_extract_ctx(bson_t *bson, bcon_extract_ctx_t *ctx, ...) { va_list ap; va_start(ap, ctx); bcon_extract_ctx_va(bson, ctx, &ap); va_end(ap); } void bcon_append_ctx_init(bcon_append_ctx_t *ctx) { ctx->n = 0; ctx->stack[0].is_array = 0; } bson_t * bcon_new(void *unused, ...) { va_list ap; bcon_append_ctx_t ctx; bson_t *bson; bcon_append_ctx_init(&ctx); bson = bson_new(); va_start(ap, unused); bcon_append_ctx_va(bson, &ctx, &ap); va_end(ap); return bson; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-bcon.h000066400000000000000000000245411511661753600223650ustar00rootroot00000000000000/* * @file bcon.h * @brief BCON (BSON C Object Notation) Declarations */ #include /* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BCON_H_ #define BCON_H_ // Include specific headers first, because bson.h tries to include this header itself: #include #include // For other APIs, not properly grouped, but needed: #include BSON_BEGIN_DECLS #define BCON_STACK_MAX 100 #define BCON_ENSURE_DECLARE(fun, type) \ static BSON_INLINE type bcon_ensure_##fun(type _t) \ { \ return _t; \ } #define BCON_ENSURE(fun, val) bcon_ensure_##fun(val) #define BCON_ENSURE_STORAGE(fun, val) bcon_ensure_##fun(&(val)) BCON_ENSURE_DECLARE(const_char_ptr, const char *) BCON_ENSURE_DECLARE(const_char_ptr_ptr, const char **) BCON_ENSURE_DECLARE(double, double) BCON_ENSURE_DECLARE(double_ptr, double *) BCON_ENSURE_DECLARE(const_bson_ptr, const bson_t *) BCON_ENSURE_DECLARE(bson_ptr, bson_t *) BCON_ENSURE_DECLARE(subtype, bson_subtype_t) BCON_ENSURE_DECLARE(subtype_ptr, bson_subtype_t *) BCON_ENSURE_DECLARE(const_uint8_ptr, const uint8_t *) BCON_ENSURE_DECLARE(const_uint8_ptr_ptr, const uint8_t **) BCON_ENSURE_DECLARE(uint32, uint32_t) BCON_ENSURE_DECLARE(uint32_ptr, uint32_t *) BCON_ENSURE_DECLARE(const_oid_ptr, const bson_oid_t *) BCON_ENSURE_DECLARE(const_oid_ptr_ptr, const bson_oid_t **) BCON_ENSURE_DECLARE(int32, int32_t) BCON_ENSURE_DECLARE(int32_ptr, int32_t *) BCON_ENSURE_DECLARE(int64, int64_t) BCON_ENSURE_DECLARE(int64_ptr, int64_t *) BCON_ENSURE_DECLARE(const_decimal128_ptr, const bson_decimal128_t *) BCON_ENSURE_DECLARE(bool, bool) BCON_ENSURE_DECLARE(bool_ptr, bool *) BCON_ENSURE_DECLARE(bson_type, bson_type_t) BCON_ENSURE_DECLARE(bson_iter_ptr, bson_iter_t *) BCON_ENSURE_DECLARE(const_bson_iter_ptr, const bson_iter_t *) #define BCON_UTF8(_val) BCON_MAGIC, BCON_TYPE_UTF8, BCON_ENSURE(const_char_ptr, (_val)) #define BCON_DOUBLE(_val) BCON_MAGIC, BCON_TYPE_DOUBLE, BCON_ENSURE(double, (_val)) #define BCON_DOCUMENT(_val) BCON_MAGIC, BCON_TYPE_DOCUMENT, BCON_ENSURE(const_bson_ptr, (_val)) #define BCON_ARRAY(_val) BCON_MAGIC, BCON_TYPE_ARRAY, BCON_ENSURE(const_bson_ptr, (_val)) #define BCON_BIN(_subtype, _binary, _length) \ BCON_MAGIC, BCON_TYPE_BIN, BCON_ENSURE(subtype, (_subtype)), BCON_ENSURE(const_uint8_ptr, (_binary)), \ BCON_ENSURE(uint32, (_length)) #define BCON_UNDEFINED BCON_MAGIC, BCON_TYPE_UNDEFINED #define BCON_OID(_val) BCON_MAGIC, BCON_TYPE_OID, BCON_ENSURE(const_oid_ptr, (_val)) #define BCON_BOOL(_val) BCON_MAGIC, BCON_TYPE_BOOL, BCON_ENSURE(bool, (_val)) #define BCON_DATE_TIME(_val) BCON_MAGIC, BCON_TYPE_DATE_TIME, BCON_ENSURE(int64, (_val)) #define BCON_NULL BCON_MAGIC, BCON_TYPE_NULL #define BCON_REGEX(_regex, _flags) \ BCON_MAGIC, BCON_TYPE_REGEX, BCON_ENSURE(const_char_ptr, (_regex)), BCON_ENSURE(const_char_ptr, (_flags)) #define BCON_DBPOINTER(_collection, _oid) \ BCON_MAGIC, BCON_TYPE_DBPOINTER, BCON_ENSURE(const_char_ptr, (_collection)), BCON_ENSURE(const_oid_ptr, (_oid)) #define BCON_CODE(_val) BCON_MAGIC, BCON_TYPE_CODE, BCON_ENSURE(const_char_ptr, (_val)) #define BCON_SYMBOL(_val) BCON_MAGIC, BCON_TYPE_SYMBOL, BCON_ENSURE(const_char_ptr, (_val)) #define BCON_CODEWSCOPE(_js, _scope) \ BCON_MAGIC, BCON_TYPE_CODEWSCOPE, BCON_ENSURE(const_char_ptr, (_js)), BCON_ENSURE(const_bson_ptr, (_scope)) #define BCON_INT32(_val) BCON_MAGIC, BCON_TYPE_INT32, BCON_ENSURE(int32, (_val)) #define BCON_TIMESTAMP(_timestamp, _increment) \ BCON_MAGIC, BCON_TYPE_TIMESTAMP, BCON_ENSURE(int32, (_timestamp)), BCON_ENSURE(int32, (_increment)) #define BCON_INT64(_val) BCON_MAGIC, BCON_TYPE_INT64, BCON_ENSURE(int64, (_val)) #define BCON_DECIMAL128(_val) BCON_MAGIC, BCON_TYPE_DECIMAL128, BCON_ENSURE(const_decimal128_ptr, (_val)) #define BCON_MAXKEY BCON_MAGIC, BCON_TYPE_MAXKEY #define BCON_MINKEY BCON_MAGIC, BCON_TYPE_MINKEY #define BCON(_val) BCON_MAGIC, BCON_TYPE_BCON, BCON_ENSURE(const_bson_ptr, (_val)) #define BCON_ITER(_val) BCON_MAGIC, BCON_TYPE_ITER, BCON_ENSURE(const_bson_iter_ptr, (_val)) #define BCONE_UTF8(_val) BCONE_MAGIC, BCON_TYPE_UTF8, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_val)) #define BCONE_DOUBLE(_val) BCONE_MAGIC, BCON_TYPE_DOUBLE, BCON_ENSURE_STORAGE(double_ptr, (_val)) #define BCONE_DOCUMENT(_val) BCONE_MAGIC, BCON_TYPE_DOCUMENT, BCON_ENSURE_STORAGE(bson_ptr, (_val)) #define BCONE_ARRAY(_val) BCONE_MAGIC, BCON_TYPE_ARRAY, BCON_ENSURE_STORAGE(bson_ptr, (_val)) #define BCONE_BIN(subtype, binary, length) \ BCONE_MAGIC, BCON_TYPE_BIN, BCON_ENSURE_STORAGE(subtype_ptr, (subtype)), \ BCON_ENSURE_STORAGE(const_uint8_ptr_ptr, (binary)), BCON_ENSURE_STORAGE(uint32_ptr, (length)) #define BCONE_UNDEFINED BCONE_MAGIC, BCON_TYPE_UNDEFINED #define BCONE_OID(_val) BCONE_MAGIC, BCON_TYPE_OID, BCON_ENSURE_STORAGE(const_oid_ptr_ptr, (_val)) #define BCONE_BOOL(_val) BCONE_MAGIC, BCON_TYPE_BOOL, BCON_ENSURE_STORAGE(bool_ptr, (_val)) #define BCONE_DATE_TIME(_val) BCONE_MAGIC, BCON_TYPE_DATE_TIME, BCON_ENSURE_STORAGE(int64_ptr, (_val)) #define BCONE_NULL BCONE_MAGIC, BCON_TYPE_NULL #define BCONE_REGEX(_regex, _flags) \ BCONE_MAGIC, BCON_TYPE_REGEX, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_regex)), \ BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_flags)) #define BCONE_DBPOINTER(_collection, _oid) \ BCONE_MAGIC, BCON_TYPE_DBPOINTER, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_collection)), \ BCON_ENSURE_STORAGE(const_oid_ptr_ptr, (_oid)) #define BCONE_CODE(_val) BCONE_MAGIC, BCON_TYPE_CODE, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_val)) #define BCONE_SYMBOL(_val) BCONE_MAGIC, BCON_TYPE_SYMBOL, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_val)) #define BCONE_CODEWSCOPE(_js, _scope) \ BCONE_MAGIC, BCON_TYPE_CODEWSCOPE, BCON_ENSURE_STORAGE(const_char_ptr_ptr, (_js)), \ BCON_ENSURE_STORAGE(bson_ptr, (_scope)) #define BCONE_INT32(_val) BCONE_MAGIC, BCON_TYPE_INT32, BCON_ENSURE_STORAGE(int32_ptr, (_val)) #define BCONE_TIMESTAMP(_timestamp, _increment) \ BCONE_MAGIC, BCON_TYPE_TIMESTAMP, BCON_ENSURE_STORAGE(int32_ptr, (_timestamp)), \ BCON_ENSURE_STORAGE(int32_ptr, (_increment)) #define BCONE_INT64(_val) BCONE_MAGIC, BCON_TYPE_INT64, BCON_ENSURE_STORAGE(int64_ptr, (_val)) #define BCONE_DECIMAL128(_val) BCONE_MAGIC, BCON_TYPE_DECIMAL128, BCON_ENSURE_STORAGE(const_decimal128_ptr, (_val)) #define BCONE_MAXKEY BCONE_MAGIC, BCON_TYPE_MAXKEY #define BCONE_MINKEY BCONE_MAGIC, BCON_TYPE_MINKEY #define BCONE_SKIP(_val) BCONE_MAGIC, BCON_TYPE_SKIP, BCON_ENSURE(bson_type, (_val)) #define BCONE_ITER(_val) BCONE_MAGIC, BCON_TYPE_ITER, BCON_ENSURE_STORAGE(bson_iter_ptr, (_val)) #define BCON_MAGIC bson_bcon_magic() #define BCONE_MAGIC bson_bcone_magic() typedef enum { BCON_TYPE_UTF8, BCON_TYPE_DOUBLE, BCON_TYPE_DOCUMENT, BCON_TYPE_ARRAY, BCON_TYPE_BIN, BCON_TYPE_UNDEFINED, BCON_TYPE_OID, BCON_TYPE_BOOL, BCON_TYPE_DATE_TIME, BCON_TYPE_NULL, BCON_TYPE_REGEX, BCON_TYPE_DBPOINTER, BCON_TYPE_CODE, BCON_TYPE_SYMBOL, BCON_TYPE_CODEWSCOPE, BCON_TYPE_INT32, BCON_TYPE_TIMESTAMP, BCON_TYPE_INT64, BCON_TYPE_DECIMAL128, BCON_TYPE_MAXKEY, BCON_TYPE_MINKEY, BCON_TYPE_BCON, BCON_TYPE_ARRAY_START, BCON_TYPE_ARRAY_END, BCON_TYPE_DOC_START, BCON_TYPE_DOC_END, BCON_TYPE_END, BCON_TYPE_RAW, BCON_TYPE_SKIP, BCON_TYPE_ITER, BCON_TYPE_ERROR, } bcon_type_t; typedef struct bcon_append_ctx_frame { int i; bool is_array; bson_t bson; } bcon_append_ctx_frame_t; typedef struct bcon_extract_ctx_frame { int i; bool is_array; bson_iter_t iter; } bcon_extract_ctx_frame_t; typedef struct _bcon_append_ctx_t { bcon_append_ctx_frame_t stack[BCON_STACK_MAX]; int n; } bcon_append_ctx_t; typedef struct _bcon_extract_ctx_t { bcon_extract_ctx_frame_t stack[BCON_STACK_MAX]; int n; } bcon_extract_ctx_t; BSON_EXPORT(void) bcon_append(bson_t *bson, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(void) bcon_append_ctx(bson_t *bson, bcon_append_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(void) bcon_append_ctx_va(bson_t *bson, bcon_append_ctx_t *ctx, va_list *va); BSON_EXPORT(void) bcon_append_ctx_init(bcon_append_ctx_t *ctx); BSON_EXPORT(void) bcon_extract_ctx_init(bcon_extract_ctx_t *ctx); BSON_EXPORT(void) bcon_extract_ctx(bson_t *bson, bcon_extract_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(bool) bcon_extract_ctx_va(bson_t *bson, bcon_extract_ctx_t *ctx, va_list *ap); BSON_EXPORT(bool) bcon_extract(bson_t *bson, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(bool) bcon_extract_va(bson_t *bson, bcon_extract_ctx_t *ctx, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(bson_t *) bcon_new(void *unused, ...) BSON_GNUC_NULL_TERMINATED; /** * The bcon_..() functions are all declared with __attribute__((sentinel)). * * From GCC manual for "sentinel": "A valid NULL in this context is defined as * zero with any pointer type. If your system defines the NULL macro with an * integer type then you need to add an explicit cast." * Case in point: GCC on Solaris (at least) */ #define BCON_APPEND(_bson, ...) bcon_append((_bson), __VA_ARGS__, (void *)NULL) #define BCON_APPEND_CTX(_bson, _ctx, ...) bcon_append_ctx((_bson), (_ctx), __VA_ARGS__, (void *)NULL) #define BCON_EXTRACT(_bson, ...) bcon_extract((_bson), __VA_ARGS__, (void *)NULL) #define BCON_EXTRACT_CTX(_bson, _ctx, ...) bcon_extract((_bson), (_ctx), __VA_ARGS__, (void *)NULL) #define BCON_NEW(...) bcon_new(NULL, __VA_ARGS__, (void *)NULL) BSON_EXPORT(const char *) bson_bcon_magic(void) BSON_GNUC_PURE; BSON_EXPORT(const char *) bson_bcone_magic(void) BSON_GNUC_PURE; BSON_END_DECLS #endif mongo-c-driver-2.2.1/src/libbson/src/bson/bson-clock.c000066400000000000000000000055041511661753600225300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #if defined(BSON_HAVE_CLOCK_GETTIME) #include #include #endif #include /* *-------------------------------------------------------------------------- * * bson_gettimeofday -- * * A wrapper around gettimeofday() with fallback support for Windows. * * Returns: * 0 if successful. * * Side effects: * @tv is set. * *-------------------------------------------------------------------------- */ int bson_gettimeofday(struct timeval *tv) /* OUT */ { #if defined(_WIN32) #if defined(_MSC_VER) #define DELTA_EPOCH_IN_MICROSEC 11644473600000000Ui64 #else #define DELTA_EPOCH_IN_MICROSEC 11644473600000000ULL #endif FILETIME ft; uint64_t tmp = 0; /* * The const value is shamelessly stolen from * http://www.boost.org/doc/libs/1_55_0/boost/chrono/detail/inlined/win/chrono.hpp * * File times are the number of 100 nanosecond intervals elapsed since * 12:00 am Jan 1, 1601 UTC. I haven't check the math particularly hard * * ... good luck */ if (tv) { GetSystemTimeAsFileTime(&ft); /* pull out of the filetime into a 64 bit uint */ tmp |= ft.dwHighDateTime; tmp <<= 32; tmp |= ft.dwLowDateTime; /* convert from 100's of nanosecs to microsecs */ tmp /= 10; /* adjust to unix epoch */ tmp -= DELTA_EPOCH_IN_MICROSEC; tv->tv_sec = (long)(tmp / 1000000UL); tv->tv_usec = (long)(tmp % 1000000UL); } return 0; #else return gettimeofday(tv, NULL); #endif } /* *-------------------------------------------------------------------------- * * bson_get_monotonic_time -- * * Returns the monotonic system time, if available. A best effort is * made to use the monotonic clock. However, some systems may not * support such a feature. * * Returns: * The monotonic clock in microseconds. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_get_monotonic_time(void) { mlib_time_point now = mlib_now(); return mlib_microseconds_count(now.time_since_monotonic_start); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-clock.h000066400000000000000000000016461511661753600225400ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CLOCK_H #define BSON_CLOCK_H #include #include #include BSON_BEGIN_DECLS BSON_EXPORT(int64_t) bson_get_monotonic_time(void); BSON_EXPORT(int) bson_gettimeofday(struct timeval *tv); BSON_END_DECLS #endif /* BSON_CLOCK_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-context-private.h000066400000000000000000000033751511661753600246020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CONTEXT_PRIVATE_H #define BSON_CONTEXT_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS enum { BSON_OID_RANDOMESS_OFFSET = 4, BSON_OID_RANDOMNESS_SIZE = 5, BSON_OID_SEQ32_OFFSET = 9, BSON_OID_SEQ32_SIZE = 3, BSON_OID_SEQ64_OFFSET = 4, BSON_OID_SEQ64_SIZE = 8 }; struct _bson_context_t { /* flags are defined in bson_context_flags_t */ int flags; uint32_t seq32; uint64_t seq64; uint8_t randomness[BSON_OID_RANDOMNESS_SIZE]; uint64_t pid; }; /** * @brief Insert the context's randomness data into the given OID * * @param context A context for some random data * @param oid The OID to update. */ void _bson_context_set_oid_rand(bson_context_t *context, bson_oid_t *oid); /** * @brief Insert the context's sequence counter into the given OID. Increments * the context's sequence counter. * * @param context The context with the counter to get+update * @param oid The OID to modify */ void _bson_context_set_oid_seq32(bson_context_t *context, bson_oid_t *oid); BSON_END_DECLS #endif /* BSON_CONTEXT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-context.c000066400000000000000000000212651511661753600231230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef HOST_NAME_MAX #define HOST_NAME_MAX 256 #endif /* * Globals. */ static bson_context_t gContextDefault; static BSON_INLINE uint64_t _bson_getpid(void) { uint64_t pid; #ifdef BSON_OS_WIN32 DWORD real_pid; real_pid = GetCurrentProcessId(); pid = (real_pid & 0xFFFF) ^ ((real_pid >> 16) & 0xFFFF); #else pid = (uint64_t)getpid(); #endif return pid; } void _bson_context_set_oid_seq32(bson_context_t *context, /* IN */ bson_oid_t *oid) /* OUT */ { uint32_t seq = (uint32_t)mcommon_atomic_int32_fetch_add( (DECL_ATOMIC_INTEGRAL_INT32 *)&context->seq32, 1, mcommon_memory_order_seq_cst); seq = BSON_UINT32_TO_BE(seq); memcpy(&oid->bytes[BSON_OID_SEQ32_OFFSET], ((uint8_t *)&seq) + 1, BSON_OID_SEQ32_SIZE); } /* * -------------------------------------------------------------------------- * * _bson_context_get_hostname * * Gets the hostname of the machine, logs a warning on failure. "out" * must be an array of HOST_NAME_MAX bytes. * * -------------------------------------------------------------------------- */ static void _bson_context_get_hostname(char out[HOST_NAME_MAX]) { if (gethostname(out, HOST_NAME_MAX) != 0) { if (errno == ENAMETOOLONG) { fprintf(stderr, "hostname exceeds %d characters, truncating.", HOST_NAME_MAX); } else { fprintf(stderr, "unable to get hostname: %d", errno); } } out[HOST_NAME_MAX - 1] = '\0'; } /*** ======================================== * The below SipHash implementation is based on the original public-domain * reference implementation from Jean-Philippe Aumasson and DJB * (https://github.com/veorq/SipHash). */ /* in-place rotate a 64bit number */ void _bson_rotl_u64(uint64_t *p, int nbits) { *p = (*p << nbits) | (*p >> (64 - nbits)); } /* Perform one SipHash round */ void _sip_round(uint64_t *v0, uint64_t *v1, uint64_t *v2, uint64_t *v3) { *v0 += *v1; _bson_rotl_u64(v1, 13); *v1 ^= *v0; _bson_rotl_u64(v0, 32); *v2 += *v3; _bson_rotl_u64(v3, 16); *v3 ^= *v2; *v0 += *v3; _bson_rotl_u64(v3, 21); *v3 ^= *v0; *v2 += *v1; _bson_rotl_u64(v1, 17); *v1 ^= *v2; _bson_rotl_u64(v2, 32); } void _siphash(const void *in, const size_t inlen, const uint64_t key[2], uint64_t digest[2]) { const unsigned char *ni = (const unsigned char *)in; const unsigned char *kk = (const unsigned char *)key; uint8_t digest_buf[16] = {0}; const int C_ROUNDS = 2; const int D_ROUNDS = 4; uint64_t v0 = UINT64_C(0x736f6d6570736575); uint64_t v1 = UINT64_C(0x646f72616e646f6d); uint64_t v2 = UINT64_C(0x6c7967656e657261); uint64_t v3 = UINT64_C(0x7465646279746573); uint64_t k0 = mlib_read_u64le(kk); uint64_t k1 = mlib_read_u64le(kk + 8); uint64_t m; int i; const unsigned char *end = ni + inlen - (inlen % sizeof(uint64_t)); const int left = inlen & 7; uint64_t b = ((uint64_t)inlen) << 56; v3 ^= k1; v2 ^= k0; v1 ^= k1; v0 ^= k0; v1 ^= 0xee; for (; ni != end; ni += 8) { m = mlib_read_u64le(ni); v3 ^= m; for (i = 0; i < C_ROUNDS; ++i) _sip_round(&v0, &v1, &v2, &v3); v0 ^= m; } switch (left) { case 7: b |= ((uint64_t)ni[6]) << 48; /* FALLTHRU */ case 6: b |= ((uint64_t)ni[5]) << 40; /* FALLTHRU */ case 5: b |= ((uint64_t)ni[4]) << 32; /* FALLTHRU */ case 4: b |= ((uint64_t)ni[3]) << 24; /* FALLTHRU */ case 3: b |= ((uint64_t)ni[2]) << 16; /* FALLTHRU */ case 2: b |= ((uint64_t)ni[1]) << 8; /* FALLTHRU */ case 1: b |= ((uint64_t)ni[0]); break; default: BSON_UNREACHABLE("Invalid remainder during SipHash"); case 0: break; } v3 ^= b; for (i = 0; i < C_ROUNDS; ++i) _sip_round(&v0, &v1, &v2, &v3); v0 ^= b; v2 ^= 0xee; for (i = 0; i < D_ROUNDS; ++i) _sip_round(&v0, &v1, &v2, &v3); b = v0 ^ v1 ^ v2 ^ v3; mlib_write_u64le(digest_buf, b); v1 ^= 0xdd; for (i = 0; i < D_ROUNDS; ++i) _sip_round(&v0, &v1, &v2, &v3); b = v0 ^ v1 ^ v2 ^ v3; mlib_write_u64le(digest_buf + 8, b); memcpy(digest, digest_buf, sizeof digest_buf); } /* * The seed consists of the following hashed together: * - current time (with microsecond resolution) * - current pid * - current hostname * - The init-call counter */ struct _init_rand_params { struct timeval time; uint64_t pid; char hostname[HOST_NAME_MAX]; int64_t rand_call_counter; }; static void _bson_context_init_random(bson_context_t *context, bool init_seq) { /* Keep an atomic counter of this function being called. This is used to add * additional input to the random hash, ensuring no two calls in a single * process will receive identical hash inputs, even occurring at the same * microsecond. */ static int64_t s_rand_call_counter = INT64_MIN; /* The message digest of the random params */ uint64_t digest[2] = {0}; uint64_t key[2] = {0}; /* The randomness parameters */ struct _init_rand_params rand_params; /* Init each part of the randomness source: */ memset(&rand_params, 0, sizeof rand_params); bson_gettimeofday(&rand_params.time); rand_params.pid = _bson_getpid(); _bson_context_get_hostname(rand_params.hostname); rand_params.rand_call_counter = mcommon_atomic_int64_fetch_add(&s_rand_call_counter, 1, mcommon_memory_order_seq_cst); /* Generate a SipHash key. We do not care about secrecy or determinism, only * uniqueness. */ memcpy(key, &rand_params, sizeof key); key[1] = ~key[0]; /* Hash the param struct */ _siphash(&rand_params, sizeof rand_params, key, digest); /** Initialize the rand and sequence counters with our random digest */ memcpy(context->randomness, digest, sizeof context->randomness); if (init_seq) { memcpy(&context->seq32, digest + 1, sizeof context->seq32); memcpy(&context->seq64, digest + 1, sizeof context->seq64); /* Chop off some initial bits for nicer counter behavior. This allows the * low digit to start at a zero, and prevents immediately wrapping the * counter in subsequent calls to set_oid_seq. */ context->seq32 &= ~UINT32_C(0xf0000f); context->seq64 &= ~UINT64_C(0xf0000f); } /* Remember the PID we saw here. This may change in case of fork() */ context->pid = rand_params.pid; } static void _bson_context_init(bson_context_t *context, bson_context_flags_t flags) { context->flags = (int)flags; _bson_context_init_random(context, true /* Init counters */); } void _bson_context_set_oid_rand(bson_context_t *context, bson_oid_t *oid) { BSON_ASSERT(context); BSON_ASSERT(oid); if (context->flags & BSON_CONTEXT_DISABLE_PID_CACHE) { /* User has requested that we check if our PID has changed. This can occur * after a call to fork() */ uint64_t now_pid = _bson_getpid(); if (now_pid != context->pid) { _bson_context_init_random(context, false /* Do not update the sequence counters */); } } /* Copy the stored randomness into the OID */ memcpy(oid->bytes + BSON_OID_RANDOMESS_OFFSET, &context->randomness, BSON_OID_RANDOMNESS_SIZE); } bson_context_t * bson_context_new(bson_context_flags_t flags) { bson_context_t *context; context = bson_malloc0(sizeof *context); _bson_context_init(context, flags); return context; } void bson_context_destroy(bson_context_t *context) /* IN */ { bson_free(context); } static BSON_ONCE_FUN(_bson_context_init_default) { _bson_context_init(&gContextDefault, BSON_CONTEXT_DISABLE_PID_CACHE); BSON_ONCE_RETURN; } bson_context_t * bson_context_get_default(void) { static bson_once_t once = BSON_ONCE_INIT; bson_once(&once, _bson_context_init_default); return &gContextDefault; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-context.h000066400000000000000000000032211511661753600231200ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_CONTEXT_H #define BSON_CONTEXT_H #include #include BSON_BEGIN_DECLS /** * @brief Initialize a new context with the given flags * * @param flags Flags used to configure the behavior of the context. For most * cases, this should be BSON_CONTEXT_NONE. * * @return A newly allocated context. Must be freed with bson_context_destroy() * * @note If you expect your pid to change without notice, such as from an * unexpected call to fork(), then specify BSON_CONTEXT_DISABLE_PID_CACHE in * `flags`. */ BSON_EXPORT(bson_context_t *) bson_context_new(bson_context_flags_t flags); /** * @brief Destroy and free a bson_context_t created by bson_context_new() */ BSON_EXPORT(void) bson_context_destroy(bson_context_t *context); /** * @brief Obtain a pointer to the application-default bson_context_t * * @note This context_t MUST NOT be passed to bson_context_destroy() */ BSON_EXPORT(bson_context_t *) bson_context_get_default(void); BSON_END_DECLS #endif /* BSON_CONTEXT_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-decimal128.c000066400000000000000000000567561511661753600233050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #define BSON_DECIMAL128_EXPONENT_MAX 6111 #define BSON_DECIMAL128_EXPONENT_MIN -6176 #define BSON_DECIMAL128_EXPONENT_BIAS 6176 #define BSON_DECIMAL128_MAX_DIGITS 34 #define BSON_DECIMAL128_SET_NAN(dec) \ if (1) { \ (dec).high = 0x7c00000000000000ull; \ (dec).low = 0; \ } else \ (void)0 #define BSON_DECIMAL128_SET_INF(dec, isneg) \ if (1) { \ (dec).high = 0x7800000000000000ull + 0x8000000000000000ull * (isneg); \ (dec).low = 0; \ } else \ (void)0 /** * _bson_uint128_t: * * This struct represents a 128 bit integer. */ typedef struct { uint32_t parts[4]; /* 32-bit words stored high to low. */ } _bson_uint128_t; /** *------------------------------------------------------------------------------ * * _bson_uint128_divide1B -- * * This function divides a #_bson_uint128_t by 1000000000 (1 billion) and * computes the quotient and remainder. * * The remainder will contain 9 decimal digits for conversion to string. * * @value The #_bson_uint128_t operand. * @quotient A pointer to store the #_bson_uint128_t quotient. * @rem A pointer to store the #uint64_t remainder. * * Returns: * The quotient at @quotient and the remainder at @rem. * * Side effects: * None. * *------------------------------------------------------------------------------ */ static void _bson_uint128_divide1B(_bson_uint128_t value, /* IN */ _bson_uint128_t *quotient, /* OUT */ uint32_t *rem) /* OUT */ { const uint32_t DIVISOR = 1000 * 1000 * 1000; uint64_t _rem = 0; int i = 0; if (!value.parts[0] && !value.parts[1] && !value.parts[2] && !value.parts[3]) { *quotient = value; *rem = 0; return; } for (i = 0; i <= 3; i++) { _rem <<= 32; /* Adjust remainder to match value of next dividend */ _rem += value.parts[i]; /* Add the divided to _rem */ value.parts[i] = (uint32_t)(_rem / DIVISOR); _rem %= DIVISOR; /* Store the remainder */ } *quotient = value; *rem = (uint32_t)_rem; } /** *------------------------------------------------------------------------------ * * bson_decimal128_to_string -- * * This function converts a BID formatted decimal128 value to string, * accepting a &bson_decimal128_t as @dec. The string is stored at @str. * * @dec : The BID formatted decimal to convert. * @str : The output decimal128 string. At least %BSON_DECIMAL128_STRING *characters. * * Returns: * None. * * Side effects: * None. * *------------------------------------------------------------------------------ */ void bson_decimal128_to_string(const bson_decimal128_t *dec, /* IN */ char *str) /* OUT */ { const int COMBINATION_MASK = 0x1f; /* Extract least significant 5 bits */ const int EXPONENT_MASK = 0x3fff; /* Extract least significant 14 bits */ const int COMBINATION_INFINITY = 30; /* Value of combination field for Inf */ const int COMBINATION_NAN = 31; /* Value of combination field for NaN */ const int EXPONENT_BIAS = 6176; /* decimal128 exponent bias */ char *str_out = str; /* output pointer in string */ char significand_str[35]; /* decoded significand digits */ /* Note: bits in this routine are referred to starting at 0, */ /* from the sign bit, towards the coefficient. */ uint32_t high; /* bits 0 - 31 */ uint32_t midh; /* bits 32 - 63 */ uint32_t midl; /* bits 64 - 95 */ uint32_t low; /* bits 96 - 127 */ uint32_t combination; /* bits 1 - 5 */ uint32_t significand[36] = {0}; /* the base-10 digits in the significand */ uint32_t *significand_read = significand; /* read pointer into significand */ bool is_zero = false; /* true if the number is zero */ uint8_t significand_msb; /* the most signifcant significand bits (50-46) */ _bson_uint128_t significand128; /* temporary storage for significand decoding */ memset(significand_str, 0, sizeof(significand_str)); if ((int64_t)dec->high < 0) { /* negative */ *(str_out++) = '-'; } low = (uint32_t)dec->low; midl = (uint32_t)(dec->low >> 32); midh = (uint32_t)dec->high; high = (uint32_t)(dec->high >> 32); /* Decode combination field and exponent */ combination = (high >> 26) & COMBINATION_MASK; int biased_exponent; if (BSON_UNLIKELY((combination >> 3) == 3)) { /* Check for 'special' values */ if (mlib_cmp(combination, ==, COMBINATION_INFINITY)) { /* Infinity */ strcpy(str_out, BSON_DECIMAL128_INF); return; } else if (mlib_cmp(combination, ==, COMBINATION_NAN)) { /* NaN */ /* str, not str_out, to erase the sign */ strcpy(str, BSON_DECIMAL128_NAN); /* we don't care about the NaN payload. */ return; } else { biased_exponent = (high >> 15) & EXPONENT_MASK; significand_msb = 0x8 + ((high >> 14) & 0x1); } } else { significand_msb = (high >> 14) & 0x7; biased_exponent = (high >> 17) & EXPONENT_MASK; } /* unbiased exponent */ const int32_t exponent = biased_exponent - EXPONENT_BIAS; /* Create string of significand digits */ /* Convert the 114-bit binary number represented by */ /* (high, midh, midl, low) to at most 34 decimal */ /* digits through modulo and division. */ significand128.parts[0] = (high & 0x3fff) + ((significand_msb & 0xfu) << 14); significand128.parts[1] = midh; significand128.parts[2] = midl; significand128.parts[3] = low; if (significand128.parts[0] == 0 && significand128.parts[1] == 0 && significand128.parts[2] == 0 && significand128.parts[3] == 0) { is_zero = true; } else if (significand128.parts[0] >= (1 << 17)) { /* The significand is non-canonical or zero. * In order to preserve compatibility with the densely packed decimal * format, the maximum value for the significand of decimal128 is * 1e34 - 1. If the value is greater than 1e34 - 1, the IEEE 754 * standard dictates that the significand is interpreted as zero. */ is_zero = true; } else { for (int k = 3; k >= 0; k--) { uint32_t least_digits = 0; _bson_uint128_divide1B(significand128, &significand128, &least_digits); /* We now have the 9 least significant digits (in base 2). */ /* Convert and output to string. */ if (!least_digits) { continue; } for (int j = 8; j >= 0; j--) { significand[k * 9 + j] = least_digits % 10; least_digits /= 10; } } } /* Output format options: */ /* Scientific - [-]d.dddE(+/-)dd or [-]dE(+/-)dd */ /* Regular - ddd.ddd */ int32_t num_significant_digits; if (is_zero) { num_significant_digits = 1; *significand_read = 0; } else { num_significant_digits = 36; while (!(*significand_read)) { num_significant_digits--; significand_read++; } } /* the exponent if scientific notation is used */ const int32_t scientific_exponent = num_significant_digits - 1 + exponent; /* The scientific exponent checks are dictated by the string conversion * specification and are somewhat arbitrary cutoffs. * * We must check exponent > 0, because if this is the case, the number * has trailing zeros. However, we *cannot* output these trailing zeros, * because doing so would change the precision of the value, and would * change stored data if the string converted number is round tripped. */ if (scientific_exponent < -6 || exponent > 0) { /* Scientific format */ *(str_out++) = *(significand_read++) + '0'; num_significant_digits--; if (num_significant_digits) { *(str_out++) = '.'; } for (int32_t i = 0; i < num_significant_digits && (str_out - str) < 36; i++) { *(str_out++) = *(significand_read++) + '0'; } /* Exponent */ *(str_out++) = 'E'; // Truncation is OK. int req = bson_snprintf(str_out, 6, "%+d", scientific_exponent); BSON_ASSERT(req > 0); } else { /* Regular format with no decimal place */ if (exponent >= 0) { for (int32_t i = 0; i < num_significant_digits && (str_out - str) < 36; i++) { *(str_out++) = *(significand_read++) + '0'; } *str_out = '\0'; } else { int32_t radix_position = num_significant_digits + exponent; // Reserve space for null terminator. const int available_bytes = BSON_DECIMAL128_STRING - 1; const char *const str_end = str + available_bytes; if (radix_position > 0) { /* non-zero digits before radix */ for (int32_t i = 0; i < radix_position && str_out != str_end; i++) { *(str_out++) = *(significand_read++) + '0'; } } else { /* leading zero before radix point */ *(str_out++) = '0'; } *(str_out++) = '.'; while (radix_position++ < 0 && str_out != str_end) { /* add leading zeros after radix */ *(str_out++) = '0'; } const unsigned dot_pos = (unsigned)BSON_MAX(radix_position - 1, 0); const unsigned n_trailing_digits = num_significant_digits - dot_pos; const unsigned n_to_write = BSON_MIN(n_trailing_digits, (unsigned)(str_end - str_out)); mlib_foreach_urange (i, n_to_write) { (void)i; *str_out++ = *significand_read++ + '0'; } *str_out = '\0'; } } } typedef struct { uint64_t high, low; } _bson_uint128_6464_t; /** *------------------------------------------------------------------------- * * mul64x64 -- * * This function multiplies two &uint64_t into a &_bson_uint128_6464_t. * * Returns: * The product of @left and @right. * * Side Effects: * None. * *------------------------------------------------------------------------- */ static void _mul_64x64(uint64_t left, /* IN */ uint64_t right, /* IN */ _bson_uint128_6464_t *product) /* OUT */ { uint64_t left_high, left_low, right_high, right_low, product_high, product_mid, product_mid2, product_low; _bson_uint128_6464_t rt = {0}; if (!left && !right) { *product = rt; return; } left_high = left >> 32; left_low = (uint32_t)left; right_high = right >> 32; right_low = (uint32_t)right; product_high = left_high * right_high; product_mid = left_high * right_low; product_mid2 = left_low * right_high; product_low = left_low * right_low; product_high += product_mid >> 32; product_mid = (uint32_t)product_mid + product_mid2 + (product_low >> 32); product_high = product_high + (product_mid >> 32); product_low = (product_mid << 32) + (uint32_t)product_low; rt.high = product_high; rt.low = product_low; *product = rt; } /** *------------------------------------------------------------------------------ * * _dec128_tolower -- * * This function converts the ASCII character @c to lowercase. It is locale * insensitive (unlike the stdlib tolower). * * Returns: * The lowercased character. */ char _dec128_tolower(char c) { if (isupper(c)) { c += 32; } return c; } /** *------------------------------------------------------------------------------ * * _dec128_istreq -- * * This function compares the null-terminated *ASCII* strings @a and @b * for case-insensitive equality. * * Returns: * true if the strings are equal, false otherwise. */ bool _dec128_istreq(const char *a, /* IN */ const char *b /* IN */) { while (*a != '\0' || *b != '\0') { /* strings are different lengths. */ if (*a == '\0' || *b == '\0') { return false; } if (_dec128_tolower(*a) != _dec128_tolower(*b)) { return false; } a++; b++; } return true; } /** *------------------------------------------------------------------------------ * * bson_decimal128_from_string -- * * This function converts @string in the format [+-]ddd[.]ddd[E][+-]dddd to * decimal128. Out of range values are converted to +/-Infinity. Invalid * strings are converted to NaN. * * If more digits are provided than the available precision allows, * round to the nearest expressable decimal128 with ties going to even will * occur. * * Note: @string must be ASCII only! * * Returns: * true on success, or false on failure. @dec will be NaN if @str was invalid * The &bson_decimal128_t converted from @string at @dec. * * Side effects: * None. * *------------------------------------------------------------------------------ */ bool bson_decimal128_from_string(const char *string, /* IN */ bson_decimal128_t *dec) /* OUT */ { return bson_decimal128_from_string_w_len(string, -1, dec); } /** *------------------------------------------------------------------------------ * * bson_decimal128_from_string_w_len -- * * This function converts @string in the format [+-]ddd[.]ddd[E][+-]dddd to * decimal128. Out of range values are converted to +/-Infinity. Invalid * strings are converted to NaN. @len is the length of the string, or -1 * meaning the string is null-terminated. * * If more digits are provided than the available precision allows, * round to the nearest expressable decimal128 with ties going to even will * occur. * * Note: @string must be ASCII only! * * Returns: * true on success, or false on failure. @dec will be NaN if @str was invalid * The &bson_decimal128_t converted from @string at @dec. * * Side effects: * None. * *------------------------------------------------------------------------------ */ bool bson_decimal128_from_string_w_len(const char *string, /* IN */ int len, /* IN */ bson_decimal128_t *dec) /* OUT */ { _bson_uint128_6464_t significand = {0}; const char *str_read = string; /* Read pointer for consuming str. */ /* Parsing state tracking */ bool is_negative = false; bool saw_radix = false; bool includes_sign = false; /* True if the input string contains a sign. */ bool found_nonzero = false; size_t significant_digits = 0; /* Total number of significant digits * (no leading or trailing zero) */ size_t ndigits_read = 0; /* Total number of significand digits read */ size_t ndigits = 0; /* Total number of digits (no leading zeros) */ size_t radix_position = 0; /* The number of the digits after radix */ size_t first_nonzero = 0; /* The index of the first non-zero in *str* */ uint16_t digits[BSON_DECIMAL128_MAX_DIGITS] = {0}; uint16_t ndigits_stored = 0; /* The number of digits in digits */ uint16_t *digits_insert = digits; /* Insertion pointer for digits */ size_t first_digit = 0; /* The index of the first non-zero digit */ size_t last_digit = 0; /* The index of the last digit */ int32_t exponent = 0; uint64_t significand_high = 0; /* The high 17 digits of the significand */ uint64_t significand_low = 0; /* The low 17 digits of the significand */ uint16_t biased_exponent = 0; /* The biased exponent */ BSON_ASSERT(dec); dec->high = 0; dec->low = 0; if (*str_read == '+' || *str_read == '-') { is_negative = *(str_read++) == '-'; includes_sign = true; } /* Check for Infinity or NaN */ if (!isdigit(*str_read) && *str_read != '.') { if (_dec128_istreq(str_read, "inf") || _dec128_istreq(str_read, "infinity")) { BSON_DECIMAL128_SET_INF(*dec, is_negative); return true; } else if (_dec128_istreq(str_read, "nan")) { BSON_DECIMAL128_SET_NAN(*dec); return true; } BSON_DECIMAL128_SET_NAN(*dec); return false; } /* Read digits */ while (((isdigit(*str_read) || *str_read == '.')) && (len == -1 || str_read < string + len)) { if (*str_read == '.') { if (saw_radix) { BSON_DECIMAL128_SET_NAN(*dec); return false; } saw_radix = true; str_read++; continue; } if (ndigits_stored < BSON_DECIMAL128_MAX_DIGITS) { if (*str_read != '0' || found_nonzero) { if (!found_nonzero) { first_nonzero = ndigits_read; } found_nonzero = true; *(digits_insert++) = (uint16_t)(*(str_read) - '0'); /* Only store 34 digits */ ndigits_stored++; } } if (found_nonzero) { ndigits++; } if (saw_radix) { radix_position++; } ndigits_read++; str_read++; } if (saw_radix && !ndigits_read) { BSON_DECIMAL128_SET_NAN(*dec); return false; } /* Read exponent if exists */ if (*str_read == 'e' || *str_read == 'E') { int nread = 0; #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif int64_t temp_exponent = 0; int read_exponent = SSCANF(++str_read, "%" SCNd64 "%n", &temp_exponent, &nread); str_read += nread; if (!read_exponent || nread == 0 || !mlib_in_range(int32_t, temp_exponent)) { BSON_DECIMAL128_SET_NAN(*dec); return false; } exponent = (int32_t)temp_exponent; #undef SSCANF } if ((len == -1 || str_read < string + len) && *str_read) { BSON_DECIMAL128_SET_NAN(*dec); return false; } /* Done reading input. */ /* Find first non-zero digit in digits */ first_digit = 0; if (!ndigits_stored) { /* value is zero */ last_digit = 0; digits[0] = 0; ndigits = 1; ndigits_stored = 1; significant_digits = 0; } else { last_digit = ndigits_stored - 1; significant_digits = ndigits; /* Mark trailing zeros as non-significant */ while (string[first_nonzero + significant_digits - 1 + includes_sign + saw_radix] == '0') { significant_digits--; } } /* Normalization of exponent */ /* Correct exponent based on radix position, and shift significand as needed */ /* to represent user input */ /* Overflow prevention */ if (mlib_cmp(exponent, <=, radix_position) && mlib_cmp(radix_position, >, exponent + (1 << 14))) { exponent = BSON_DECIMAL128_EXPONENT_MIN; } else { BSON_ASSERT(mlib_in_range(int32_t, radix_position)); exponent -= (int32_t)radix_position; } /* Attempt to normalize the exponent */ while (exponent > BSON_DECIMAL128_EXPONENT_MAX) { /* Shift exponent to significand and decrease */ last_digit++; if (last_digit - first_digit >= BSON_DECIMAL128_MAX_DIGITS) { /* The exponent is too great to shift into the significand. */ if (significant_digits == 0) { /* Value is zero, we are allowed to clamp the exponent. */ exponent = BSON_DECIMAL128_EXPONENT_MAX; break; } /* Overflow is not permitted, error. */ BSON_DECIMAL128_SET_NAN(*dec); return false; } exponent--; } while (exponent < BSON_DECIMAL128_EXPONENT_MIN || ndigits_stored < ndigits) { /* Shift last digit */ if (last_digit == 0) { /* underflow is not allowed, but zero clamping is */ if (significant_digits == 0) { exponent = BSON_DECIMAL128_EXPONENT_MIN; break; } BSON_DECIMAL128_SET_NAN(*dec); return false; } if (ndigits_stored < ndigits) { if (string[ndigits - 1 + includes_sign + saw_radix] - '0' != 0 && significant_digits != 0) { BSON_DECIMAL128_SET_NAN(*dec); return false; } ndigits--; /* adjust to match digits not stored */ } else { if (digits[last_digit] != 0) { /* Inexact rounding is not allowed. */ BSON_DECIMAL128_SET_NAN(*dec); return false; } last_digit--; /* adjust to round */ } if (exponent < BSON_DECIMAL128_EXPONENT_MAX) { exponent++; } else { BSON_DECIMAL128_SET_NAN(*dec); return false; } } /* Round */ /* We've normalized the exponent, but might still need to round. */ if (last_digit - first_digit + 1 < significant_digits) { /* There are non-zero digits after last_digit that need rounding. */ /* We round to nearest, ties to even */ const char round_digit = string[first_nonzero + last_digit + includes_sign + saw_radix + 1] - '0'; if (round_digit != 0) { /* Inexact (non-zero) rounding is not allowed */ BSON_DECIMAL128_SET_NAN(*dec); return false; } } /* Encode significand */ if (significant_digits == 0) { /* read a zero */ significand_high = 0; significand_low = 0; } else if (last_digit - first_digit < 17) { size_t d_idx = first_digit; significand_low = digits[d_idx++]; for (; d_idx <= last_digit; d_idx++) { significand_low *= 10; significand_low += digits[d_idx]; significand_high = 0; } } else { size_t d_idx = first_digit; significand_high = digits[d_idx++]; for (; d_idx <= last_digit - 17; d_idx++) { significand_high *= 10; significand_high += digits[d_idx]; } significand_low = digits[d_idx++]; for (; d_idx <= last_digit; d_idx++) { significand_low *= 10; significand_low += digits[d_idx]; } } _mul_64x64(significand_high, 100000000000000000ull, &significand); significand.low += significand_low; if (significand.low < significand_low) { significand.high += 1; } biased_exponent = (exponent + (int16_t)BSON_DECIMAL128_EXPONENT_BIAS); /* Encode combination, exponent, and significand. */ if ((significand.high >> 49) & 1) { /* Encode '11' into bits 1 to 3 */ dec->high |= (0x3ull << 61); dec->high |= (biased_exponent & 0x3fffull) << 47; dec->high |= significand.high & 0x7fffffffffffull; } else { dec->high |= (biased_exponent & 0x3fffull) << 49; dec->high |= significand.high & 0x1ffffffffffffull; } dec->low = significand.low; /* Encode sign */ if (is_negative) { dec->high |= 0x8000000000000000ull; } return true; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-decimal128.h000066400000000000000000000027561511661753600233010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_DECIMAL128_H #define BSON_DECIMAL128_H #include #include #include #include /** * BSON_DECIMAL128_STRING: * * The length of a decimal128 string (with null terminator). * * 1 for the sign * 35 for digits and radix * 2 for exponent indicator and sign * 4 for exponent digits */ #define BSON_DECIMAL128_STRING 43 #define BSON_DECIMAL128_INF "Infinity" #define BSON_DECIMAL128_NAN "NaN" BSON_BEGIN_DECLS BSON_EXPORT(void) bson_decimal128_to_string(const bson_decimal128_t *dec, char *str); /* Note: @string must be ASCII characters only! */ BSON_EXPORT(bool) bson_decimal128_from_string(const char *string, bson_decimal128_t *dec); BSON_EXPORT(bool) bson_decimal128_from_string_w_len(const char *string, int len, bson_decimal128_t *dec); BSON_END_DECLS #endif /* BSON_DECIMAL128_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-endian.h000066400000000000000000000153411511661753600227000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ENDIAN_H #define BSON_ENDIAN_H #include #include #include BSON_BEGIN_DECLS #define BSON_BIG_ENDIAN 4321 #define BSON_LITTLE_ENDIAN 1234 #if defined(__clang__) && defined(__clang_major__) && defined(__clang_minor__) && (__clang_major__ >= 3) && \ (__clang_minor__ >= 1) #if __has_builtin(__builtin_bswap16) #define BSON_UINT16_SWAP_LE_BE(v) __builtin_bswap16(v) #endif #if __has_builtin(__builtin_bswap32) #define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32(v) #endif #if __has_builtin(__builtin_bswap64) #define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64(v) #endif #elif defined(__GNUC__) && (__GNUC__ >= 4) #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 3) #define BSON_UINT32_SWAP_LE_BE(v) __builtin_bswap32((uint32_t)v) #define BSON_UINT64_SWAP_LE_BE(v) __builtin_bswap64((uint64_t)v) #endif #if __GNUC__ > 4 || (defined(__GNUC_MINOR__) && __GNUC_MINOR__ >= 8) #define BSON_UINT16_SWAP_LE_BE(v) __builtin_bswap16((uint32_t)v) #endif #endif #ifndef BSON_UINT16_SWAP_LE_BE #define BSON_UINT16_SWAP_LE_BE(v) __bson_uint16_swap_slow((uint16_t)v) #endif #ifndef BSON_UINT32_SWAP_LE_BE #define BSON_UINT32_SWAP_LE_BE(v) __bson_uint32_swap_slow((uint32_t)v) #endif #ifndef BSON_UINT64_SWAP_LE_BE #define BSON_UINT64_SWAP_LE_BE(v) __bson_uint64_swap_slow((uint64_t)v) #endif #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN #define BSON_UINT16_FROM_LE(v) ((uint16_t)v) #define BSON_UINT16_TO_LE(v) ((uint16_t)v) #define BSON_UINT16_FROM_BE(v) BSON_UINT16_SWAP_LE_BE(v) #define BSON_UINT16_TO_BE(v) BSON_UINT16_SWAP_LE_BE(v) #define BSON_UINT32_FROM_LE(v) ((uint32_t)v) #define BSON_UINT32_TO_LE(v) ((uint32_t)v) #define BSON_UINT32_FROM_BE(v) BSON_UINT32_SWAP_LE_BE(v) #define BSON_UINT32_TO_BE(v) BSON_UINT32_SWAP_LE_BE(v) #define BSON_UINT64_FROM_LE(v) ((uint64_t)v) #define BSON_UINT64_TO_LE(v) ((uint64_t)v) #define BSON_UINT64_FROM_BE(v) BSON_UINT64_SWAP_LE_BE(v) #define BSON_UINT64_TO_BE(v) BSON_UINT64_SWAP_LE_BE(v) #define BSON_DOUBLE_FROM_LE(v) ((double)v) #define BSON_DOUBLE_TO_LE(v) ((double)v) #define BSON_FLOAT_FROM_LE(v) ((float)v) #define BSON_FLOAT_TO_LE(v) ((float)v) #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN #define BSON_UINT16_FROM_LE(v) BSON_UINT16_SWAP_LE_BE(v) #define BSON_UINT16_TO_LE(v) BSON_UINT16_SWAP_LE_BE(v) #define BSON_UINT16_FROM_BE(v) ((uint16_t)v) #define BSON_UINT16_TO_BE(v) ((uint16_t)v) #define BSON_UINT32_FROM_LE(v) BSON_UINT32_SWAP_LE_BE(v) #define BSON_UINT32_TO_LE(v) BSON_UINT32_SWAP_LE_BE(v) #define BSON_UINT32_FROM_BE(v) ((uint32_t)v) #define BSON_UINT32_TO_BE(v) ((uint32_t)v) #define BSON_UINT64_FROM_LE(v) BSON_UINT64_SWAP_LE_BE(v) #define BSON_UINT64_TO_LE(v) BSON_UINT64_SWAP_LE_BE(v) #define BSON_UINT64_FROM_BE(v) ((uint64_t)v) #define BSON_UINT64_TO_BE(v) ((uint64_t)v) #define BSON_DOUBLE_FROM_LE(v) (__bson_double_swap_slow(v)) #define BSON_DOUBLE_TO_LE(v) (__bson_double_swap_slow(v)) #define BSON_FLOAT_FROM_LE(v) (__bson_float_swap_slow(v)) #define BSON_FLOAT_TO_LE(v) (__bson_float_swap_slow(v)) #else #error "The endianness of target architecture is unknown." #endif /* *-------------------------------------------------------------------------- * * __bson_uint16_swap_slow -- * * Fallback endianness conversion for 16-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint16_t __bson_uint16_swap_slow(uint16_t v) /* IN */ { return (uint16_t)((v & 0x00FF) << 8) | (uint16_t)((v & 0xFF00) >> 8); } /* *-------------------------------------------------------------------------- * * __bson_uint32_swap_slow -- * * Fallback endianness conversion for 32-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint32_t __bson_uint32_swap_slow(uint32_t v) /* IN */ { return ((v & 0x000000FFU) << 24) | ((v & 0x0000FF00U) << 8) | ((v & 0x00FF0000U) >> 8) | ((v & 0xFF000000U) >> 24); } /* *-------------------------------------------------------------------------- * * __bson_uint64_swap_slow -- * * Fallback endianness conversion for 64-bit integers. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint64_t __bson_uint64_swap_slow(uint64_t v) /* IN */ { return ((v & 0x00000000000000FFULL) << 56) | ((v & 0x000000000000FF00ULL) << 40) | ((v & 0x0000000000FF0000ULL) << 24) | ((v & 0x00000000FF000000ULL) << 8) | ((v & 0x000000FF00000000ULL) >> 8) | ((v & 0x0000FF0000000000ULL) >> 24) | ((v & 0x00FF000000000000ULL) >> 40) | ((v & 0xFF00000000000000ULL) >> 56); } /* *-------------------------------------------------------------------------- * * __bson_double_swap_slow -- * * Fallback endianness conversion for double floating point. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_STATIC_ASSERT2(sizeof_uint64_t, sizeof(double) == sizeof(uint64_t)); static BSON_INLINE double __bson_double_swap_slow(double v) /* IN */ { uint64_t uv; memcpy(&uv, &v, sizeof(v)); uv = BSON_UINT64_SWAP_LE_BE(uv); memcpy(&v, &uv, sizeof(v)); return v; } /* *-------------------------------------------------------------------------- * * __bson_float_swap_slow -- * * Fallback endianness conversion for single floating point. * * Returns: * The endian swapped version. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_STATIC_ASSERT2(sizeof_uint32_t, sizeof(float) == sizeof(uint32_t)); static BSON_INLINE float __bson_float_swap_slow(float v) /* IN */ { uint32_t uv; memcpy(&uv, &v, sizeof(v)); uv = BSON_UINT32_SWAP_LE_BE(uv); memcpy(&v, &uv, sizeof(v)); return v; } BSON_END_DECLS #endif /* BSON_ENDIAN_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-error-private.h000066400000000000000000000017401511661753600242410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ERROR_PRIVATE_H #define BSON_ERROR_PRIVATE_H #include // IWYU pragma: export // #include #define BSON_ERROR_CATEGORY 1 static BSON_INLINE void bson_set_error_category(bson_error_t *error, uint8_t category) { BSON_ASSERT_PARAM(error); error->reserved = category; } #endif /* BSON_ERROR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-iso8601-private.h000066400000000000000000000016751511661753600242300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ISO8601_PRIVATE_H #define BSON_ISO8601_PRIVATE_H #include #include #include BSON_BEGIN_DECLS bool _bson_iso8601_date_parse(const char *str, int32_t len, int64_t *out, bson_error_t *error); BSON_END_DECLS #endif /* BSON_ISO8601_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-iso8601.c000066400000000000000000000171621511661753600225510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include static bool get_tok(const char *terminals, const char **ptr, int32_t *remaining, const char **out, int32_t *out_len) { const char *terminal; bool found_terminal = false; if (!*remaining) { *out = ""; *out_len = 0; } *out = *ptr; *out_len = -1; for (; *remaining && !found_terminal; (*ptr)++, (*remaining)--, (*out_len)++) { for (terminal = terminals; *terminal; terminal++) { if (**ptr == *terminal) { found_terminal = true; break; } } } if (!found_terminal) { (*out_len)++; } return found_terminal; } static bool digits_only(const char *str, int32_t len) { int i; for (i = 0; i < len; i++) { if (!isdigit(str[i])) { return false; } } return true; } static bool parse_num(const char *str, int32_t len, int32_t digits, int32_t min, int32_t max, int32_t *out) { int i; int magnitude = 1; int32_t value = 0; if ((digits >= 0 && len != digits) || !digits_only(str, len)) { return false; } for (i = 1; i <= len; i++, magnitude *= 10) { value += (str[len - i] - '0') * magnitude; } if (value < min || value > max) { return false; } *out = value; return true; } bool _bson_iso8601_date_parse(const char *str, int32_t len, int64_t *out, bson_error_t *error) { const char *ptr; int32_t remaining = len; const char *year_ptr = NULL; const char *month_ptr = NULL; const char *day_ptr = NULL; const char *hour_ptr = NULL; const char *min_ptr = NULL; const char *sec_ptr = NULL; const char *millis_ptr = NULL; const char *tz_ptr = NULL; int32_t year_len = 0; int32_t month_len = 0; int32_t day_len = 0; int32_t hour_len = 0; int32_t min_len = 0; int32_t sec_len = 0; int32_t millis_len = 0; int32_t tz_len = 0; int32_t year; int32_t month; int32_t day; int32_t hour; int32_t min; int32_t sec = 0; int64_t millis = 0; int32_t tz_adjustment = 0; struct bson_tm posix_date = {0}; #define DATE_PARSE_ERR(msg) \ bson_set_error( \ error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Could not parse \"%s\" as date: " msg, str); \ return false #define DEFAULT_DATE_PARSE_ERR \ DATE_PARSE_ERR("use ISO8601 format yyyy-mm-ddThh:mm plus timezone, either" \ " \"Z\" or like \"+0500\" or like \"+05:00\"") ptr = str; /* we have to match at least yyyy-mm-ddThh:mm */ if (!(get_tok("-", &ptr, &remaining, &year_ptr, &year_len) && get_tok("-", &ptr, &remaining, &month_ptr, &month_len) && get_tok("T", &ptr, &remaining, &day_ptr, &day_len) && get_tok(":", &ptr, &remaining, &hour_ptr, &hour_len) && get_tok(":+-Z", &ptr, &remaining, &min_ptr, &min_len))) { DEFAULT_DATE_PARSE_ERR; } /* if the minute has a ':' at the end look for seconds */ if (min_ptr[min_len] == ':') { if (remaining < 2) { DATE_PARSE_ERR("reached end of date while looking for seconds"); } get_tok(".+-Z", &ptr, &remaining, &sec_ptr, &sec_len); if (!sec_len) { DATE_PARSE_ERR("minute ends in \":\" seconds is required"); } } /* if we had a second and it is followed by a '.' look for milliseconds */ if (sec_len && sec_ptr[sec_len] == '.') { if (remaining < 2) { DATE_PARSE_ERR("reached end of date while looking for milliseconds"); } get_tok("+-Z", &ptr, &remaining, &millis_ptr, &millis_len); if (!millis_len) { DATE_PARSE_ERR("seconds ends in \".\", milliseconds is required"); } } /* backtrack by 1 to put ptr on the timezone */ ptr--; remaining++; get_tok("", &ptr, &remaining, &tz_ptr, &tz_len); if (!parse_num(year_ptr, year_len, 4, -9999, 9999, &year)) { DATE_PARSE_ERR("year must be an integer"); } /* values are as in struct tm */ year -= 1900; if (!parse_num(month_ptr, month_len, 2, 1, 12, &month)) { DATE_PARSE_ERR("month must be an integer"); } /* values are as in struct tm */ month -= 1; if (!parse_num(day_ptr, day_len, 2, 1, 31, &day)) { DATE_PARSE_ERR("day must be an integer"); } if (!parse_num(hour_ptr, hour_len, 2, 0, 23, &hour)) { DATE_PARSE_ERR("hour must be an integer"); } if (!parse_num(min_ptr, min_len, 2, 0, 59, &min)) { DATE_PARSE_ERR("minute must be an integer"); } if (sec_len && !parse_num(sec_ptr, sec_len, 2, 0, 60, &sec)) { DATE_PARSE_ERR("seconds must be an integer"); } if (tz_len > 0) { if (tz_ptr[0] == 'Z' && tz_len == 1) { /* valid */ } else if (tz_ptr[0] == '+' || tz_ptr[0] == '-') { int32_t tz_hour; int32_t tz_min; if ((tz_len != 5 || !digits_only(tz_ptr + 1, 4)) && (tz_len != 6 || !digits_only(tz_ptr + 1, 2) || tz_ptr[3] != ':' || !digits_only(tz_ptr + 4, 2))) { DATE_PARSE_ERR("could not parse timezone"); } if (!parse_num(tz_ptr + 1, 2, -1, -23, 23, &tz_hour)) { DATE_PARSE_ERR("timezone hour must be at most 23"); } int32_t tz_min_offset = tz_ptr[3] == ':' ? 1 : 0; if (!parse_num(tz_ptr + 3 + tz_min_offset, 2, -1, 0, 59, &tz_min)) { DATE_PARSE_ERR("timezone minute must be at most 59"); } /* we inflect the meaning of a 'positive' timezone. Those are hours * we have to subtract, and vice versa */ tz_adjustment = (tz_ptr[0] == '-' ? 1 : -1) * ((tz_min * 60) + (tz_hour * 60 * 60)); if (!(tz_adjustment > -86400 && tz_adjustment < 86400)) { DATE_PARSE_ERR("timezone offset must be less than 24 hours"); } } else { DATE_PARSE_ERR("timezone is required"); } } if (millis_len > 0) { int i; int magnitude; millis = 0; if (millis_len > 3 || !digits_only(millis_ptr, millis_len)) { DATE_PARSE_ERR("milliseconds must be an integer"); } for (i = 1, magnitude = 1; i <= millis_len; i++, magnitude *= 10) { millis += (millis_ptr[millis_len - i] - '0') * magnitude; } if (millis_len == 1) { millis *= 100; } else if (millis_len == 2) { millis *= 10; } if (millis < 0 || millis > 1000) { DATE_PARSE_ERR("milliseconds must be at least 0 and less than 1000"); } } posix_date.tm_sec = sec; posix_date.tm_min = min; posix_date.tm_hour = hour; posix_date.tm_mday = day; posix_date.tm_mon = month; posix_date.tm_year = year; posix_date.tm_wday = 0; posix_date.tm_yday = 0; millis = 1000 * _bson_timegm(&posix_date) + millis; millis += tz_adjustment * 1000; *out = millis; return true; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-iter.c000066400000000000000000001761521511661753600224100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #define ITER_TYPE(i) ((bson_type_t) * ((i)->raw + (i)->type)) /* *-------------------------------------------------------------------------- * * bson_iter_init -- * * Initializes @iter to be used to iterate @bson. * * Returns: * true if bson_iter_t was initialized. otherwise false. * * Side effects: * @iter is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_init(bson_iter_t *iter, /* OUT */ const bson_t *bson) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(bson); if (BSON_UNLIKELY(bson->len < 5)) { memset(iter, 0, sizeof *iter); return false; } iter->raw = bson_get_data(bson); iter->len = bson->len; iter->off = 0; iter->type = 0; iter->key = 0; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; iter->next_off = 4; iter->err_off = 0; iter->value = (bson_value_t){0}; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_init_from_data -- * * Initializes @iter to be used to iterate @data of length @length * * Returns: * true if bson_iter_t was initialized. otherwise false. * * Side effects: * @iter is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_init_from_data(bson_iter_t *iter, /* OUT */ const uint8_t *data, /* IN */ size_t length) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(data); if (BSON_UNLIKELY((length < 5) || (length > INT_MAX))) { memset(iter, 0, sizeof *iter); return false; } // Check that the object header matches the length of the given buffer const uint32_t hdr_len = mlib_read_u32le(data); if (BSON_UNLIKELY(hdr_len != length)) { memset(iter, 0, sizeof *iter); return false; } if (BSON_UNLIKELY(data[length - 1])) { memset(iter, 0, sizeof *iter); return false; } if (BSON_UNLIKELY(!mlib_in_range(uint32_t, length))) { memset(iter, 0, sizeof *iter); return false; } iter->raw = (uint8_t *)data; iter->len = (uint32_t)length; iter->off = 0; iter->type = 0; iter->key = 0; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; iter->next_off = 4; iter->err_off = 0; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_recurse -- * * Creates a new sub-iter looking at the document or array that @iter * is currently pointing at. * * Returns: * true if successful and @child was initialized. * * Side effects: * @child is initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_recurse(const bson_iter_t *iter, /* IN */ bson_iter_t *child) /* OUT */ { const uint8_t *data = NULL; uint32_t len = 0; BSON_ASSERT(iter); BSON_ASSERT(child); if (ITER_TYPE(iter) == BSON_TYPE_DOCUMENT) { bson_iter_document(iter, &len, &data); } else if (ITER_TYPE(iter) == BSON_TYPE_ARRAY) { bson_iter_array(iter, &len, &data); } else { return false; } child->raw = data; child->len = len; child->off = 0; child->type = 0; child->key = 0; child->d1 = 0; child->d2 = 0; child->d3 = 0; child->d4 = 0; child->next_off = 4; child->err_off = 0; return true; } /* *-------------------------------------------------------------------------- * * bson_iter_init_find -- * * Initializes a #bson_iter_t and moves the iter to the first field * matching @key. * * Returns: * true if the field named @key was found; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find(bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(bson); BSON_ASSERT(key); return bson_iter_init(iter, bson) && bson_iter_find(iter, key); } /* *-------------------------------------------------------------------------- * * bson_iter_init_find_w_len -- * * Initializes a #bson_iter_t and moves the iter to the first field * matching @key. * * Returns: * true if the field named @key was found; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find_w_len(bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key, /* IN */ int keylen) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(bson); BSON_ASSERT(key); return bson_iter_init(iter, bson) && bson_iter_find_w_len(iter, key, keylen); } /* *-------------------------------------------------------------------------- * * bson_iter_init_find_case -- * * A case-insensitive version of bson_iter_init_find(). * * Returns: * true if the field was found and @iter is observing that field. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_init_find_case(bson_iter_t *iter, /* INOUT */ const bson_t *bson, /* IN */ const char *key) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(bson); BSON_ASSERT(key); return bson_iter_init(iter, bson) && bson_iter_find_case(iter, key); } /* *-------------------------------------------------------------------------- * * bson_iter_find_w_len -- * * Searches through @iter starting from the current position for a key * matching @key. @keylen indicates the length of @key, or -1 to * determine the length with strlen(). * * Returns: * true if the field @key was found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find_w_len(bson_iter_t *iter, /* INOUT */ const char *key, /* IN */ int keylen) /* IN */ { const char *ikey; if (keylen < 0) { keylen = (int)strlen(key); } while (bson_iter_next(iter)) { ikey = bson_iter_key(iter); if ((0 == strncmp(key, ikey, keylen)) && (ikey[keylen] == '\0')) { return true; } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_find -- * * Searches through @iter starting from the current position for a key * matching @key. This is a case-sensitive search meaning "KEY" and * "key" would NOT match. * * Returns: * true if @key is found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find(bson_iter_t *iter, /* INOUT */ const char *key) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(key); return bson_iter_find_w_len(iter, key, -1); } /* *-------------------------------------------------------------------------- * * bson_iter_find_case -- * * Searches through @iter starting from the current position for a key * matching @key. This is a case-insensitive search meaning "KEY" and * "key" would match. * * Returns: * true if @key is found. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_find_case(bson_iter_t *iter, /* INOUT */ const char *key) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(key); while (bson_iter_next(iter)) { if (!bson_strcasecmp(key, bson_iter_key(iter))) { return true; } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_find_descendant -- * * Locates a descendant using the "parent.child.key" notation. This * operates similar to bson_iter_find() except that it can recurse * into children documents using the dot notation. * * Returns: * true if the descendant was found and @descendant was initialized. * * Side effects: * @descendant may be initialized. * *-------------------------------------------------------------------------- */ bool bson_iter_find_descendant(bson_iter_t *iter, /* INOUT */ const char *dotkey, /* IN */ bson_iter_t *descendant) /* OUT */ { bson_iter_t tmp; const char *dot; size_t sublen; BSON_ASSERT(iter); BSON_ASSERT(dotkey); BSON_ASSERT(descendant); if ((dot = strchr(dotkey, '.'))) { sublen = dot - dotkey; } else { sublen = strlen(dotkey); } if (bson_iter_find_w_len(iter, dotkey, (int)sublen)) { if (!dot) { *descendant = *iter; return true; } if (BSON_ITER_HOLDS_DOCUMENT(iter) || BSON_ITER_HOLDS_ARRAY(iter)) { if (bson_iter_recurse(iter, &tmp)) { return bson_iter_find_descendant(&tmp, dot + 1, descendant); } } } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_key -- * * Retrieves the key of the current field. The resulting key is valid * while @iter is valid. * * Returns: * A string that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_key(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); return bson_iter_key_unsafe(iter); } /* *-------------------------------------------------------------------------- * * bson_iter_type -- * * Retrieves the type of the current field. It may be useful to check * the type using the BSON_ITER_HOLDS_*() macros. * * Returns: * A bson_type_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_type_t bson_iter_type(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); BSON_ASSERT(iter->raw); BSON_ASSERT(iter->len); return bson_iter_type_unsafe(iter); } /* *-------------------------------------------------------------------------- * * _bson_iter_next_internal -- * * Internal function to advance @iter to the next field and retrieve * the key and BSON type before error-checking. @next_keylen is * the key length of the next field being iterated or 0 if this is * not known. * * Return: * true if an element was decoded, else false. * * Side effects: * @key and @bson_type are set. * * If the return value is false: * - @iter is invalidated: @iter->raw is NULLed * - @unsupported is set to true if the bson type is unsupported * - otherwise if the BSON is corrupt, @iter->err_off is nonzero * - otherwise @bson_type is set to BSON_TYPE_EOD * *-------------------------------------------------------------------------- */ static bool _bson_iter_next_internal(bson_iter_t *iter, /* INOUT */ uint32_t next_keylen, /* IN */ const char **key, /* OUT */ uint32_t *bson_type, /* OUT */ bool *unsupported) /* OUT */ { const uint8_t *data; uint32_t o; unsigned int len; BSON_ASSERT(iter); *unsupported = false; if (!iter->raw) { *key = NULL; *bson_type = BSON_TYPE_EOD; return false; } data = iter->raw; len = iter->len; iter->off = iter->next_off; iter->type = iter->off; iter->key = iter->off + 1; iter->d1 = 0; iter->d2 = 0; iter->d3 = 0; iter->d4 = 0; if (next_keylen == 0) { /* iterate from start to end of NULL-terminated key string */ for (o = iter->key; o < len; o++) { if (!data[o]) { iter->d1 = ++o; goto fill_data_fields; } } } else { o = iter->key + next_keylen + 1; iter->d1 = o; goto fill_data_fields; } goto mark_invalid; fill_data_fields: *key = bson_iter_key_unsafe(iter); *bson_type = ITER_TYPE(iter); switch (*bson_type) { case BSON_TYPE_DATE_TIME: case BSON_TYPE_DOUBLE: case BSON_TYPE_INT64: case BSON_TYPE_TIMESTAMP: iter->next_off = o + 8; break; case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_UTF8: { if ((o + 4) >= len) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; const uint32_t l = mlib_read_u32le(iter->raw + iter->d1); if (l > (len - (o + 4))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + 4 + l; /* * Make sure the string length includes the NUL byte. */ if (BSON_UNLIKELY((l == 0) || (iter->next_off >= len))) { iter->err_off = o; goto mark_invalid; } /* * Make sure the last byte is a NUL byte. */ if (BSON_UNLIKELY((iter->raw + iter->d2)[l - 1] != '\0')) { iter->err_off = o + 4 + l - 1; goto mark_invalid; } } break; case BSON_TYPE_BINARY: { bson_subtype_t subtype; if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; iter->d3 = o + 5; const uint32_t l = mlib_read_u32le(iter->raw + iter->d1); if (l >= (len - o - 4)) { iter->err_off = o; goto mark_invalid; } subtype = *(iter->raw + iter->d2); if (subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { if (l < 4) { iter->err_off = o; goto mark_invalid; } /* subtype 2 has a redundant length header in the data */ const int32_t bin_len = mlib_read_i32le(iter->raw + iter->d3); if (mlib_cmp(bin_len, !=, l - 4)) { iter->err_off = iter->d3; goto mark_invalid; } } iter->next_off = o + 5 + l; } break; case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: { if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } const uint32_t l = mlib_read_u32le(iter->raw + iter->d1); if ((l > len) || (l > (len - o))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + l; } break; case BSON_TYPE_OID: iter->next_off = o + 12; break; case BSON_TYPE_BOOL: { char val; if (iter->d1 >= len) { iter->err_off = o; goto mark_invalid; } memcpy(&val, iter->raw + iter->d1, 1); if (val != 0x00 && val != 0x01) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + 1; } break; case BSON_TYPE_REGEX: { bool eor = false; bool eoo = false; for (; o < len; o++) { if (!data[o]) { iter->d2 = ++o; eor = true; break; } } if (!eor) { iter->err_off = iter->next_off; goto mark_invalid; } for (; o < len; o++) { if (!data[o]) { eoo = true; break; } } if (!eoo) { iter->err_off = iter->next_off; goto mark_invalid; } iter->next_off = o + 1; } break; case BSON_TYPE_DBPOINTER: { if (o >= (len - 4)) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; const uint32_t l = mlib_read_u32le(iter->raw + iter->d1); /* Check valid string length. l counts '\0' but not 4 bytes for itself. */ if (l == 0 || l > (len - o - 4)) { iter->err_off = o; goto mark_invalid; } if (*(iter->raw + o + l + 3)) { /* not null terminated */ iter->err_off = o + l + 3; goto mark_invalid; } iter->d3 = o + 4 + l; iter->next_off = o + 4 + l + 12; } break; case BSON_TYPE_CODEWSCOPE: { if ((len < 19) || (o >= (len - 14))) { iter->err_off = o; goto mark_invalid; } iter->d2 = o + 4; iter->d3 = o + 8; const uint32_t l1 = mlib_read_u32le(iter->raw + iter->d1); if ((l1 < 14) || (l1 >= (len - o))) { iter->err_off = o; goto mark_invalid; } iter->next_off = o + l1; if (iter->next_off >= len) { iter->err_off = o; goto mark_invalid; } const uint32_t l2 = mlib_read_u32le(iter->raw + iter->d2); if (l2 == 0 || l2 >= (len - o - 4 - 4)) { iter->err_off = o; goto mark_invalid; } if ((o + 4 + 4 + l2 + 4) >= iter->next_off) { iter->err_off = o + 4; goto mark_invalid; } iter->d4 = o + 4 + 4 + l2; const uint32_t doclen = mlib_read_u32le(iter->raw + iter->d4); if ((o + 4 + 4 + l2 + doclen) != iter->next_off) { iter->err_off = o + 4 + 4 + l2; goto mark_invalid; } } break; case BSON_TYPE_INT32: iter->next_off = o + 4; break; case BSON_TYPE_DECIMAL128: iter->next_off = o + 16; break; case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: iter->next_off = o; break; default: *unsupported = true; /* FALL THROUGH */ case BSON_TYPE_EOD: iter->err_off = o; goto mark_invalid; } /* * Check to see if any of the field locations would overflow the * current BSON buffer. If so, set the error location to the offset * of where the field starts. */ if (iter->next_off >= len) { iter->err_off = o; goto mark_invalid; } iter->err_off = 0; return true; mark_invalid: iter->raw = NULL; iter->len = 0; iter->next_off = 0; return false; } /* *-------------------------------------------------------------------------- * * bson_iter_next -- * * Advances @iter to the next field of the underlying BSON document. * If all fields have been exhausted, then %false is returned. * * It is a programming error to use @iter after this function has * returned false. * * Returns: * true if the iter was advanced to the next record. * otherwise false and @iter should be considered invalid. * * Side effects: * @iter may be invalidated. * *-------------------------------------------------------------------------- */ bool bson_iter_next(bson_iter_t *iter) /* INOUT */ { uint32_t bson_type; const char *key; bool unsupported; return _bson_iter_next_internal(iter, 0, &key, &bson_type, &unsupported); } /* *-------------------------------------------------------------------------- * * bson_iter_binary -- * * Retrieves the BSON_TYPE_BINARY field. The subtype is stored in * @subtype. The length of @binary in bytes is stored in @binary_len. * * @binary should not be modified or freed and is only valid while * @iter's bson_t is valid and unmodified. * * Note: Public constraints are tighter than private ones. * API documentation says it's "a programming error to call this function * when ``iter`` is not observing an element of type BSON_TYPE_BINARY.". * Privately only, we do check the iterator type and we output NULL and * BSON_SUBTYPE_BINARY when the type is incorrect. * * Parameters: * @iter: A bson_iter_t * @subtype: A location for the binary subtype. * @binary_len: A location for the length of @binary. * @binary: A location for a pointer to the binary data. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_binary(const bson_iter_t *iter, /* IN */ bson_subtype_t *subtype, /* OUT */ uint32_t *binary_len, /* OUT */ const uint8_t **binary) /* OUT */ { bson_subtype_t backup; BSON_ASSERT(iter); BSON_ASSERT(!binary || binary_len); if (ITER_TYPE(iter) == BSON_TYPE_BINARY) { if (!subtype) { subtype = &backup; } *subtype = (bson_subtype_t) * (iter->raw + iter->d2); if (binary) { *binary_len = mlib_read_u32le(iter->raw + iter->d1); *binary = iter->raw + iter->d3; if (*subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { *binary_len -= sizeof(int32_t); *binary += sizeof(int32_t); } } return; } if (binary) { *binary = NULL; } if (binary_len) { *binary_len = 0; } if (subtype) { *subtype = BSON_SUBTYPE_BINARY; } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_binary -- * * Obtain temporary mutable access to the contents of a BSON_TYPE_BINARY * field. It may be modified in content only, without changing length * or subtype, through a temporary pointer that's only valid until the * underlying bson_t is modified or deleted. * * Note: Public constraints are tighter than private ones. * API documentation says it's "a programming error to call this function * when ``iter`` is not observing an element of type BSON_TYPE_BINARY.". * Privately only, we do check the iterator type and we return NULL when * the type is incorrect. * * Parameters: * @iter: A bson_iter_t * @binary_len: A location for the length of @binary. * @binary: A location for a pointer to the binary data. * * Returns: * On success, returns a pointer in *binary and a length in *binary_len. * The pointer is invalidated when the underlying bson_t is destroyed or modified. * If the iter does not point to a binary item of the indicated subtype, * returns NULL in *binary and 0 *binary_len. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_EXPORT(void) bson_iter_overwrite_binary(bson_iter_t *iter, /* IN */ bson_subtype_t subtype, /* IN */ uint32_t *binary_len, /* OUT */ uint8_t **binary) /* OUT */ { BSON_ASSERT_PARAM(iter); BSON_OPTIONAL_PARAM(binary_len); BSON_OPTIONAL_PARAM(binary); bson_subtype_t iter_subtype; uint32_t iter_binary_len; const uint8_t *iter_binary; bson_iter_binary(iter, &iter_subtype, &iter_binary_len, &iter_binary); if (iter_binary && iter_subtype == subtype) { // All of bson_iter_overwrite_* work by casting away const from iter->raw. if (binary) { *binary = (void *)iter_binary; } if (binary_len) { *binary_len = iter_binary_len; } return; } if (binary) { *binary = NULL; } if (binary_len) { *binary_len = 0; } } /* *-------------------------------------------------------------------------- * * bson_iter_binary_subtype -- * * Retrieves the subtype of a BSON_TYPE_BINARY field. * * Note: Public constraints are tighter than private ones. * API documentation says it's "a programming error to call this function * when ``iter`` is not observing an element of type BSON_TYPE_BINARY.". * Privately only, we do check the iterator type and return * BSON_SUBTYPE_BINARY when the type is incorrect. * * Parameters: * @iter: A bson_iter_t * * Returns: * Same as the @subtype OUT parameter from bson_iter_binary(). * If the iterator is valid, returns the referenced subtype. Otherwise, * returns BSON_SUBTYPE_BINARY as a fallback. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_EXPORT(bson_subtype_t) bson_iter_binary_subtype(const bson_iter_t *iter) { bson_subtype_t result; bson_iter_binary(iter, &result, NULL, NULL); return result; } /* *-------------------------------------------------------------------------- * * bson_iter_binary_equal -- * * Compare two BSON_TYPE_BINARY fields for equality. * * Parameters: * @iter_a: First bson_iter_t to compare * @iter_b: Second bson_iter_t to compare * * Returns: * true if both iterators point to BSON_TYPE_BINARY fields with * identical subtype and contents. false if there is any difference. * * Side effects: * None. * *-------------------------------------------------------------------------- */ BSON_EXPORT(bool) bson_iter_binary_equal(const bson_iter_t *iter_a, const bson_iter_t *iter_b) { BSON_ASSERT_PARAM(iter_a); BSON_ASSERT_PARAM(iter_b); if (BSON_ITER_HOLDS_BINARY(iter_a) && BSON_ITER_HOLDS_BINARY(iter_b)) { bson_subtype_t subtypes[2]; uint32_t lengths[2]; const uint8_t *data[2]; bson_iter_binary(iter_a, &subtypes[0], &lengths[0], &data[0]); bson_iter_binary(iter_b, &subtypes[1], &lengths[1], &data[1]); return subtypes[0] == subtypes[1] && lengths[0] == lengths[1] && 0 == memcmp(data[0], data[1], lengths[0]); } else { return false; } } /* *-------------------------------------------------------------------------- * * bson_iter_bool -- * * Retrieves the current field of type BSON_TYPE_BOOL. * * Returns: * true or false, dependent on bson document. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_bool(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_BOOL) { return bson_iter_bool_unsafe(iter); } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_as_bool -- * * If @iter is on a boolean field, returns the boolean. If it is on a * non-boolean field such as int32, int64, or double, it will convert * the value to a boolean. * * Zero is false, and non-zero is true. * * Returns: * true or false, dependent on field type. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_as_bool(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); switch ((int)ITER_TYPE(iter)) { case BSON_TYPE_BOOL: return bson_iter_bool(iter); case BSON_TYPE_DOUBLE: return !(bson_iter_double(iter) == 0.0); case BSON_TYPE_INT64: return !(bson_iter_int64(iter) == 0); case BSON_TYPE_INT32: return !(bson_iter_int32(iter) == 0); case BSON_TYPE_UTF8: return true; case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: return false; default: return true; } } /* *-------------------------------------------------------------------------- * * bson_iter_double -- * * Retrieves the current field of type BSON_TYPE_DOUBLE. * * Returns: * A double. * * Side effects: * None. * *-------------------------------------------------------------------------- */ double bson_iter_double(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DOUBLE) { return bson_iter_double_unsafe(iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_as_double -- * * If @iter is on a field of type BSON_TYPE_DOUBLE, * returns the double. If it is on an integer field * such as int32, int64, or bool, it will convert * the value to a double. * * * Returns: * A double. * * Side effects: * None. * *-------------------------------------------------------------------------- */ double bson_iter_as_double(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); switch ((int)ITER_TYPE(iter)) { case BSON_TYPE_BOOL: return (double)bson_iter_bool(iter); case BSON_TYPE_DOUBLE: return bson_iter_double(iter); case BSON_TYPE_INT32: return (double)bson_iter_int32(iter); case BSON_TYPE_INT64: return (double)bson_iter_int64(iter); default: return 0; } } /* *-------------------------------------------------------------------------- * * bson_iter_int32 -- * * Retrieves the value of the field of type BSON_TYPE_INT32. * * Returns: * A 32-bit signed integer. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int32_t bson_iter_int32(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_INT32) { return bson_iter_int32_unsafe(iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_int64 -- * * Retrieves a 64-bit signed integer for the current BSON_TYPE_INT64 * field. * * Returns: * A 64-bit signed integer. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_int64(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_INT64) { return bson_iter_int64_unsafe(iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_as_int64 -- * * If @iter is not an int64 field, it will try to convert the value to * an int64. Such field types include: * * - bool * - double * - int32 * * Returns: * An int64_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_as_int64(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); switch ((int)ITER_TYPE(iter)) { case BSON_TYPE_BOOL: return (int64_t)bson_iter_bool(iter); case BSON_TYPE_DOUBLE: return (int64_t)bson_iter_double(iter); case BSON_TYPE_INT64: return bson_iter_int64(iter); case BSON_TYPE_INT32: return (int64_t)bson_iter_int32(iter); default: return 0; } } /* *-------------------------------------------------------------------------- * * bson_iter_decimal128 -- * * This function retrieves the current field of type *%BSON_TYPE_DECIMAL128. * The result is valid while @iter is valid, and is stored in @dec. * * Returns: * * True on success, false on failure. * * Side Effects: * None. * *-------------------------------------------------------------------------- */ bool bson_iter_decimal128(const bson_iter_t *iter, /* IN */ bson_decimal128_t *dec) /* OUT */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DECIMAL128) { bson_iter_decimal128_unsafe(iter, dec); return true; } return false; } /* *-------------------------------------------------------------------------- * * bson_iter_oid -- * * Retrieves the current field of type %BSON_TYPE_OID. The result is * valid while @iter is valid. * * Returns: * A bson_oid_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const bson_oid_t * bson_iter_oid(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_OID) { return bson_iter_oid_unsafe(iter); } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_regex -- * * Fetches the current field from the iter which should be of type * BSON_TYPE_REGEX. * * Returns: * Regex from @iter. This should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_regex(const bson_iter_t *iter, /* IN */ const char **options) /* IN */ { const char *ret = NULL; const char *ret_options = NULL; BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_REGEX) { ret = (const char *)(iter->raw + iter->d1); ret_options = (const char *)(iter->raw + iter->d2); } if (options) { *options = ret_options; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_utf8 -- * * Retrieves the current field of type %BSON_TYPE_UTF8 as a UTF-8 * encoded string. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the length of the string. * * Returns: * A string that should not be modified or freed. * * Side effects: * @length will be set to the result strings length if non-NULL. * *-------------------------------------------------------------------------- */ const char * bson_iter_utf8(const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_UTF8) { if (length) { *length = bson_iter_utf8_len_unsafe(iter); } return (const char *)(iter->raw + iter->d2); } if (length) { *length = 0; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_dup_utf8 -- * * Copies the current UTF-8 element into a newly allocated string. The * string should be freed using bson_free() when the caller is * finished with it. * * Returns: * A newly allocated char* that should be freed with bson_free(). * * Side effects: * @length will be set to the result strings length if non-NULL. * *-------------------------------------------------------------------------- */ char * bson_iter_dup_utf8(const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { uint32_t local_length = 0; const char *str; char *ret = NULL; BSON_ASSERT(iter); if ((str = bson_iter_utf8(iter, &local_length))) { ret = bson_malloc0(local_length + 1); memcpy(ret, str, local_length); ret[local_length] = '\0'; } if (length) { *length = local_length; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_code -- * * Retrieves the current field of type %BSON_TYPE_CODE. The length of * the resulting string is stored in @length. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the code length. * * Returns: * A NUL-terminated string containing the code which should not be * modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_iter_code(const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_CODE) { if (length) { *length = bson_iter_utf8_len_unsafe(iter); } return (const char *)(iter->raw + iter->d2); } if (length) { *length = 0; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_codewscope -- * * Similar to bson_iter_code() but with a scope associated encoded as * a BSON document. @scope should not be modified or freed. It is * valid while @iter is valid. * * Parameters: * @iter: A #bson_iter_t. * @length: A location for the length of resulting string. * @scope_len: A location for the length of @scope. * @scope: A location for the scope encoded as BSON. * * Returns: * A NUL-terminated string that should not be modified or freed. * * Side effects: * @length is set to the resulting string length in bytes. * @scope_len is set to the length of @scope in bytes. * @scope is set to the scope documents buffer which can be * turned into a bson document with bson_init_static(). * *-------------------------------------------------------------------------- */ const char * bson_iter_codewscope(const bson_iter_t *iter, /* IN */ uint32_t *length, /* OUT */ uint32_t *scope_len, /* OUT */ const uint8_t **scope) /* OUT */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_CODEWSCOPE) { if (length) { const uint32_t len = mlib_read_u32le(iter->raw + iter->d2); /* The string length was checked > 0 in _bson_iter_next_internal. */ BSON_ASSERT(len > 0); *length = len - 1; } *scope_len = mlib_read_u32le(iter->raw + iter->d4); *scope = iter->raw + iter->d4; return (const char *)(iter->raw + iter->d3); } if (length) { *length = 0; } if (scope_len) { *scope_len = 0; } if (scope) { *scope = NULL; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_iter_dbpointer -- * * Retrieves a BSON_TYPE_DBPOINTER field. @collection_len will be set * to the length of the collection name. The collection name will be * placed into @collection. The oid will be placed into @oid. * * @collection and @oid should not be modified. * * Parameters: * @iter: A #bson_iter_t. * @collection_len: A location for the length of @collection. * @collection: A location for the collection name. * @oid: A location for the oid. * * Returns: * None. * * Side effects: * @collection_len is set to the length of @collection in bytes * excluding the null byte. * @collection is set to the collection name, including a terminating * null byte. * @oid is initialized with the oid. * *-------------------------------------------------------------------------- */ void bson_iter_dbpointer(const bson_iter_t *iter, /* IN */ uint32_t *collection_len, /* OUT */ const char **collection, /* OUT */ const bson_oid_t **oid) /* OUT */ { BSON_ASSERT(iter); if (collection) { *collection = NULL; } if (oid) { *oid = NULL; } if (ITER_TYPE(iter) == BSON_TYPE_DBPOINTER) { if (collection_len) { *collection_len = mlib_read_u32le(iter->raw + iter->d1); if ((*collection_len) > 0) { (*collection_len)--; } } if (collection) { *collection = (const char *)(iter->raw + iter->d2); } if (oid) { *oid = (const bson_oid_t *)(iter->raw + iter->d3); } } } /* *-------------------------------------------------------------------------- * * bson_iter_symbol -- * * Retrieves the symbol of the current field of type BSON_TYPE_SYMBOL. * * Parameters: * @iter: A bson_iter_t. * @length: A location for the length of the symbol. * * Returns: * A string containing the symbol as UTF-8. The value should not be * modified or freed. * * Side effects: * @length is set to the resulting strings length in bytes, * excluding the null byte. * *-------------------------------------------------------------------------- */ const char * bson_iter_symbol(const bson_iter_t *iter, /* IN */ uint32_t *length) /* OUT */ { const char *ret = NULL; uint32_t ret_length = 0; BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_SYMBOL) { ret = (const char *)(iter->raw + iter->d2); ret_length = bson_iter_utf8_len_unsafe(iter); } if (length) { *length = ret_length; } return ret; } /* *-------------------------------------------------------------------------- * * bson_iter_date_time -- * * Fetches the number of milliseconds elapsed since the UNIX epoch. * This value can be negative as times before 1970 are valid. * * Returns: * A signed 64-bit integer containing the number of milliseconds. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int64_t bson_iter_date_time(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DATE_TIME) { return bson_iter_int64_unsafe(iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_time_t -- * * Retrieves the current field of type BSON_TYPE_DATE_TIME as a * time_t. * * Returns: * A #time_t of the number of seconds since UNIX epoch in UTC. * * Side effects: * None. * *-------------------------------------------------------------------------- */ time_t bson_iter_time_t(const bson_iter_t *iter) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DATE_TIME) { return bson_iter_time_t_unsafe(iter); } return 0; } /* *-------------------------------------------------------------------------- * * bson_iter_timestamp -- * * Fetches the current field if it is a BSON_TYPE_TIMESTAMP. * * Parameters: * @iter: A #bson_iter_t. * @timestamp: a location for the timestamp. * @increment: A location for the increment. * * Returns: * None. * * Side effects: * @timestamp is initialized. * @increment is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_timestamp(const bson_iter_t *iter, /* IN */ uint32_t *timestamp, /* OUT */ uint32_t *increment) /* OUT */ { uint32_t ret_timestamp = 0; uint32_t ret_increment = 0; BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_TIMESTAMP) { ret_increment = mlib_read_u32le(iter->raw + iter->d1); ret_timestamp = mlib_read_u32le(iter->raw + iter->d1 + sizeof(uint32_t)); } if (timestamp) { *timestamp = ret_timestamp; } if (increment) { *increment = ret_increment; } } /* *-------------------------------------------------------------------------- * * bson_iter_timeval -- * * Retrieves the current field of type BSON_TYPE_DATE_TIME and stores * it into the struct timeval provided. tv->tv_sec is set to the * number of seconds since the UNIX epoch in UTC. * * Since BSON_TYPE_DATE_TIME does not support fractions of a second, * tv->tv_usec will always be set to zero. * * Returns: * None. * * Side effects: * @tv is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_timeval(const bson_iter_t *iter, /* IN */ struct timeval *tv) /* OUT */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DATE_TIME) { bson_iter_timeval_unsafe(iter, tv); return; } memset(tv, 0, sizeof *tv); } /** * bson_iter_document: * @iter: a bson_iter_t. * @document_len: A location for the document length. * @document: A location for a pointer to the document buffer. * */ /* *-------------------------------------------------------------------------- * * bson_iter_document -- * * Retrieves the data to the document BSON structure and stores the * length of the document buffer in @document_len and the document * buffer in @document. * * If you would like to iterate over the child contents, you might * consider creating a bson_t on the stack such as the following. It * allows you to call functions taking a const bson_t* only. * * bson_t b; * uint32_t len; * const uint8_t *data; * * bson_iter_document(iter, &len, &data); * * if (bson_init_static (&b, data, len)) { * ... * } * * There is no need to cleanup the bson_t structure as no data can be * modified in the process of its use (as it is static/const). * * Returns: * None. * * Side effects: * @document_len is initialized. * @document is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_document(const bson_iter_t *iter, /* IN */ uint32_t *document_len, /* OUT */ const uint8_t **document) /* OUT */ { BSON_ASSERT(iter); BSON_ASSERT(document_len); BSON_ASSERT(document); *document = NULL; *document_len = 0; if (ITER_TYPE(iter) == BSON_TYPE_DOCUMENT) { *document_len = mlib_read_u32le(iter->raw + iter->d1); *document = (iter->raw + iter->d1); } } /** * bson_iter_array: * @iter: a #bson_iter_t. * @array_len: A location for the array length. * @array: A location for a pointer to the array buffer. */ /* *-------------------------------------------------------------------------- * * bson_iter_array -- * * Retrieves the data to the array BSON structure and stores the * length of the array buffer in @array_len and the array buffer in * @array. * * If you would like to iterate over the child contents, you might * consider creating a bson_t on the stack such as the following. It * allows you to call functions taking a const bson_t* only. * * bson_t b; * uint32_t len; * const uint8_t *data; * * bson_iter_array (iter, &len, &data); * * if (bson_init_static (&b, data, len)) { * ... * } * * There is no need to cleanup the #bson_t structure as no data can be * modified in the process of its use. * * Returns: * None. * * Side effects: * @array_len is initialized. * @array is initialized. * *-------------------------------------------------------------------------- */ void bson_iter_array(const bson_iter_t *iter, /* IN */ uint32_t *array_len, /* OUT */ const uint8_t **array) /* OUT */ { BSON_ASSERT(iter); BSON_ASSERT(array_len); BSON_ASSERT(array); *array = NULL; *array_len = 0; if (ITER_TYPE(iter) == BSON_TYPE_ARRAY) { *array_len = mlib_read_u32le(iter->raw + iter->d1); *array = (iter->raw + iter->d1); } } #define VISIT_FIELD(name) visitor->visit_##name && visitor->visit_##name #define VISIT_AFTER VISIT_FIELD(after) #define VISIT_BEFORE VISIT_FIELD(before) #define VISIT_CORRUPT \ if (visitor->visit_corrupt) \ visitor->visit_corrupt #define VISIT_DOUBLE VISIT_FIELD(double) #define VISIT_UTF8 VISIT_FIELD(utf8) #define VISIT_DOCUMENT VISIT_FIELD(document) #define VISIT_ARRAY VISIT_FIELD(array) #define VISIT_BINARY VISIT_FIELD(binary) #define VISIT_UNDEFINED VISIT_FIELD(undefined) #define VISIT_OID VISIT_FIELD(oid) #define VISIT_BOOL VISIT_FIELD(bool) #define VISIT_DATE_TIME VISIT_FIELD(date_time) #define VISIT_NULL VISIT_FIELD(null) #define VISIT_REGEX VISIT_FIELD(regex) #define VISIT_DBPOINTER VISIT_FIELD(dbpointer) #define VISIT_CODE VISIT_FIELD(code) #define VISIT_SYMBOL VISIT_FIELD(symbol) #define VISIT_CODEWSCOPE VISIT_FIELD(codewscope) #define VISIT_INT32 VISIT_FIELD(int32) #define VISIT_TIMESTAMP VISIT_FIELD(timestamp) #define VISIT_INT64 VISIT_FIELD(int64) #define VISIT_DECIMAL128 VISIT_FIELD(decimal128) #define VISIT_MAXKEY VISIT_FIELD(maxkey) #define VISIT_MINKEY VISIT_FIELD(minkey) bool bson_iter_visit_all(bson_iter_t *iter, /* INOUT */ const bson_visitor_t *visitor, /* IN */ void *data) /* IN */ { uint32_t bson_type = 0; const char *key = NULL; bool unsupported; BSON_ASSERT(iter); BSON_ASSERT(visitor); while (_bson_iter_next_internal(iter, 0, &key, &bson_type, &unsupported)) { if (*key && !bson_utf8_validate(key, strlen(key), false)) { iter->err_off = iter->off; break; } if (VISIT_BEFORE(iter, key, data)) { return true; } switch (bson_type) { case BSON_TYPE_DOUBLE: if (VISIT_DOUBLE(iter, key, bson_iter_double(iter), data)) { return true; } break; case BSON_TYPE_UTF8: { uint32_t utf8_len; const char *utf8; utf8 = bson_iter_utf8(iter, &utf8_len); if (!bson_utf8_validate(utf8, utf8_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_UTF8(iter, key, utf8_len, utf8, data)) { return true; } } break; case BSON_TYPE_DOCUMENT: { const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; bson_iter_document(iter, &doclen, &docbuf); if (!bson_init_static(&b, docbuf, doclen)) { iter->err_off = iter->off; break; } if (VISIT_DOCUMENT(iter, key, &b, data)) { return true; } } break; case BSON_TYPE_ARRAY: { const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; bson_iter_array(iter, &doclen, &docbuf); if (!bson_init_static(&b, docbuf, doclen)) { iter->err_off = iter->off; break; } if (VISIT_ARRAY(iter, key, &b, data)) { return true; } } break; case BSON_TYPE_BINARY: { const uint8_t *binary = NULL; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; uint32_t binary_len = 0; bson_iter_binary(iter, &subtype, &binary_len, &binary); if (VISIT_BINARY(iter, key, subtype, binary_len, binary, data)) { return true; } } break; case BSON_TYPE_UNDEFINED: if (VISIT_UNDEFINED(iter, key, data)) { return true; } break; case BSON_TYPE_OID: if (VISIT_OID(iter, key, bson_iter_oid(iter), data)) { return true; } break; case BSON_TYPE_BOOL: if (VISIT_BOOL(iter, key, bson_iter_bool(iter), data)) { return true; } break; case BSON_TYPE_DATE_TIME: if (VISIT_DATE_TIME(iter, key, bson_iter_date_time(iter), data)) { return true; } break; case BSON_TYPE_NULL: if (VISIT_NULL(iter, key, data)) { return true; } break; case BSON_TYPE_REGEX: { const char *regex = NULL; const char *options = NULL; regex = bson_iter_regex(iter, &options); if (!bson_utf8_validate(regex, strlen(regex), true)) { iter->err_off = iter->off; return true; } if (VISIT_REGEX(iter, key, regex, options, data)) { return true; } } break; case BSON_TYPE_DBPOINTER: { uint32_t collection_len = 0; const char *collection = NULL; const bson_oid_t *oid = NULL; bson_iter_dbpointer(iter, &collection_len, &collection, &oid); if (!bson_utf8_validate(collection, collection_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_DBPOINTER(iter, key, collection_len, collection, oid, data)) { return true; } } break; case BSON_TYPE_CODE: { uint32_t code_len; const char *code; code = bson_iter_code(iter, &code_len); if (!bson_utf8_validate(code, code_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_CODE(iter, key, code_len, code, data)) { return true; } } break; case BSON_TYPE_SYMBOL: { uint32_t symbol_len; const char *symbol; symbol = bson_iter_symbol(iter, &symbol_len); if (!bson_utf8_validate(symbol, symbol_len, true)) { iter->err_off = iter->off; return true; } if (VISIT_SYMBOL(iter, key, symbol_len, symbol, data)) { return true; } } break; case BSON_TYPE_CODEWSCOPE: { uint32_t length = 0; const char *code; const uint8_t *docbuf = NULL; uint32_t doclen = 0; bson_t b; code = bson_iter_codewscope(iter, &length, &doclen, &docbuf); if (!bson_utf8_validate(code, length, true)) { iter->err_off = iter->off; return true; } if (!bson_init_static(&b, docbuf, doclen)) { iter->err_off = iter->off; break; } if (VISIT_CODEWSCOPE(iter, key, length, code, &b, data)) { return true; } } break; case BSON_TYPE_INT32: if (VISIT_INT32(iter, key, bson_iter_int32(iter), data)) { return true; } break; case BSON_TYPE_TIMESTAMP: { uint32_t timestamp; uint32_t increment; bson_iter_timestamp(iter, ×tamp, &increment); if (VISIT_TIMESTAMP(iter, key, timestamp, increment, data)) { return true; } } break; case BSON_TYPE_INT64: if (VISIT_INT64(iter, key, bson_iter_int64(iter), data)) { return true; } break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; bson_iter_decimal128(iter, &dec); if (VISIT_DECIMAL128(iter, key, &dec, data)) { return true; } } break; case BSON_TYPE_MAXKEY: if (VISIT_MAXKEY(iter, bson_iter_key_unsafe(iter), data)) { return true; } break; case BSON_TYPE_MINKEY: if (VISIT_MINKEY(iter, bson_iter_key_unsafe(iter), data)) { return true; } break; case BSON_TYPE_EOD: default: break; } if (VISIT_AFTER(iter, bson_iter_key_unsafe(iter), data)) { return true; } } if (iter->err_off) { if (unsupported && visitor->visit_unsupported_type && bson_utf8_validate(key, strlen(key), false)) { visitor->visit_unsupported_type(iter, key, bson_type, data); return false; } VISIT_CORRUPT(iter, data); } #undef VISIT_FIELD return false; } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_bool -- * * Overwrites the current BSON_TYPE_BOOLEAN field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_bool(bson_iter_t *iter, /* IN */ bool value) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_BOOL) { memcpy((void *)(iter->raw + iter->d1), &value, 1); } } void bson_iter_overwrite_oid(bson_iter_t *iter, const bson_oid_t *value) { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_OID) { memcpy((void *)(iter->raw + iter->d1), value->bytes, sizeof(value->bytes)); } } void bson_iter_overwrite_timestamp(bson_iter_t *iter, uint32_t timestamp, uint32_t increment) { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_TIMESTAMP) { void *out = mlib_write_u32le((char *)iter->raw + iter->d1, increment); mlib_write_u32le(out, timestamp); } } void bson_iter_overwrite_date_time(bson_iter_t *iter, int64_t value) { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DATE_TIME) { mlib_write_i64le((char *)iter->raw + iter->d1, value); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_int32 -- * * Overwrites the current BSON_TYPE_INT32 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_int32(bson_iter_t *iter, /* IN */ int32_t value) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_INT32) { mlib_write_i32le((char *)iter->raw + iter->d1, value); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_int64 -- * * Overwrites the current BSON_TYPE_INT64 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_int64(bson_iter_t *iter, /* IN */ int64_t value) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_INT64) { mlib_write_i64le((char *)iter->raw + iter->d1, value); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_double -- * * Overwrites the current BSON_TYPE_DOUBLE field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_double(bson_iter_t *iter, /* IN */ double value) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DOUBLE) { mlib_write_f64le((char *)iter->raw + iter->d1, value); } } /* *-------------------------------------------------------------------------- * * bson_iter_overwrite_decimal128 -- * * Overwrites the current BSON_TYPE_DECIMAL128 field with a new value. * This is performed in-place and therefore no keys are moved. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_iter_overwrite_decimal128(bson_iter_t *iter, /* IN */ const bson_decimal128_t *value) /* IN */ { BSON_ASSERT(iter); if (ITER_TYPE(iter) == BSON_TYPE_DECIMAL128) { // low bits void *out = mlib_write_u64le((char *)iter->raw + iter->d1, value->low); // Followed by high bits mlib_write_u64le(out, value->high); } } /* *-------------------------------------------------------------------------- * * bson_iter_value -- * * Retrieves a bson_value_t containing the boxed value of the current * element. The result of this function valid until the state of * iter has been changed (through the use of bson_iter_next()). * * Returns: * A bson_value_t that should not be modified or freed. If you need * to hold on to the value, use bson_value_copy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ const bson_value_t * bson_iter_value(bson_iter_t *iter) /* IN */ { bson_value_t *value; BSON_ASSERT(iter); value = &iter->value; value->value_type = ITER_TYPE(iter); switch (value->value_type) { case BSON_TYPE_DOUBLE: value->value.v_double = bson_iter_double(iter); break; case BSON_TYPE_UTF8: value->value.v_utf8.str = (char *)bson_iter_utf8(iter, &value->value.v_utf8.len); break; case BSON_TYPE_DOCUMENT: bson_iter_document(iter, &value->value.v_doc.data_len, (const uint8_t **)&value->value.v_doc.data); break; case BSON_TYPE_ARRAY: bson_iter_array(iter, &value->value.v_doc.data_len, (const uint8_t **)&value->value.v_doc.data); break; case BSON_TYPE_BINARY: bson_iter_binary(iter, &value->value.v_binary.subtype, &value->value.v_binary.data_len, (const uint8_t **)&value->value.v_binary.data); break; case BSON_TYPE_OID: bson_oid_copy(bson_iter_oid(iter), &value->value.v_oid); break; case BSON_TYPE_BOOL: value->value.v_bool = bson_iter_bool(iter); break; case BSON_TYPE_DATE_TIME: value->value.v_datetime = bson_iter_date_time(iter); break; case BSON_TYPE_REGEX: value->value.v_regex.regex = (char *)bson_iter_regex(iter, (const char **)&value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: { const bson_oid_t *oid; bson_iter_dbpointer( iter, &value->value.v_dbpointer.collection_len, (const char **)&value->value.v_dbpointer.collection, &oid); bson_oid_copy(oid, &value->value.v_dbpointer.oid); break; } case BSON_TYPE_CODE: value->value.v_code.code = (char *)bson_iter_code(iter, &value->value.v_code.code_len); break; case BSON_TYPE_SYMBOL: value->value.v_symbol.symbol = (char *)bson_iter_symbol(iter, &value->value.v_symbol.len); break; case BSON_TYPE_CODEWSCOPE: value->value.v_codewscope.code = (char *)bson_iter_codewscope(iter, &value->value.v_codewscope.code_len, &value->value.v_codewscope.scope_len, (const uint8_t **)&value->value.v_codewscope.scope_data); break; case BSON_TYPE_INT32: value->value.v_int32 = bson_iter_int32(iter); break; case BSON_TYPE_TIMESTAMP: bson_iter_timestamp(iter, &value->value.v_timestamp.timestamp, &value->value.v_timestamp.increment); break; case BSON_TYPE_INT64: value->value.v_int64 = bson_iter_int64(iter); break; case BSON_TYPE_DECIMAL128: bson_iter_decimal128(iter, &(value->value.v_decimal128)); break; case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: return NULL; } return value; } uint32_t bson_iter_key_len(const bson_iter_t *iter) { /* * f i e l d n a m e \0 _ * ^ ^ * | | * iter->key iter->d1 * */ BSON_ASSERT(iter->d1 > iter->key); return iter->d1 - iter->key - 1; } bool bson_iter_init_from_data_at_offset( bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen) { const char *key; uint32_t bson_type; bool unsupported; BSON_ASSERT(iter); BSON_ASSERT(data); if (BSON_UNLIKELY((length < 5) || (length > INT_MAX))) { memset(iter, 0, sizeof *iter); return false; } iter->raw = (uint8_t *)data; iter->len = (uint32_t)length; iter->off = 0; iter->type = 0; iter->key = 0; iter->next_off = offset; iter->err_off = 0; if (!_bson_iter_next_internal(iter, keylen, &key, &bson_type, &unsupported)) { memset(iter, 0, sizeof *iter); return false; } return true; } uint32_t bson_iter_offset(bson_iter_t *iter) { return iter->off; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-iter.h000066400000000000000000000337411511661753600224110ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_ITER_H #define BSON_ITER_H #include #include #include #include BSON_BEGIN_DECLS #define BSON_ITER_HOLDS_DOUBLE(iter) (bson_iter_type((iter)) == BSON_TYPE_DOUBLE) #define BSON_ITER_HOLDS_UTF8(iter) (bson_iter_type((iter)) == BSON_TYPE_UTF8) #define BSON_ITER_HOLDS_DOCUMENT(iter) (bson_iter_type((iter)) == BSON_TYPE_DOCUMENT) #define BSON_ITER_HOLDS_ARRAY(iter) (bson_iter_type((iter)) == BSON_TYPE_ARRAY) #define BSON_ITER_HOLDS_BINARY(iter) (bson_iter_type((iter)) == BSON_TYPE_BINARY) #define BSON_ITER_HOLDS_VECTOR(iter) \ (BSON_ITER_HOLDS_BINARY(iter) && bson_iter_binary_subtype(iter) == BSON_SUBTYPE_VECTOR) #define BSON_ITER_HOLDS_VECTOR_INT8(iter) (bson_vector_int8_const_view_from_iter(NULL, iter)) #define BSON_ITER_HOLDS_VECTOR_FLOAT32(iter) (bson_vector_float32_const_view_from_iter(NULL, iter)) #define BSON_ITER_HOLDS_VECTOR_PACKED_BIT(iter) (bson_vector_packed_bit_const_view_from_iter(NULL, iter)) #define BSON_ITER_HOLDS_UNDEFINED(iter) (bson_iter_type((iter)) == BSON_TYPE_UNDEFINED) #define BSON_ITER_HOLDS_OID(iter) (bson_iter_type((iter)) == BSON_TYPE_OID) #define BSON_ITER_HOLDS_BOOL(iter) (bson_iter_type((iter)) == BSON_TYPE_BOOL) #define BSON_ITER_HOLDS_DATE_TIME(iter) (bson_iter_type((iter)) == BSON_TYPE_DATE_TIME) #define BSON_ITER_HOLDS_NULL(iter) (bson_iter_type((iter)) == BSON_TYPE_NULL) #define BSON_ITER_HOLDS_REGEX(iter) (bson_iter_type((iter)) == BSON_TYPE_REGEX) #define BSON_ITER_HOLDS_DBPOINTER(iter) (bson_iter_type((iter)) == BSON_TYPE_DBPOINTER) #define BSON_ITER_HOLDS_CODE(iter) (bson_iter_type((iter)) == BSON_TYPE_CODE) #define BSON_ITER_HOLDS_SYMBOL(iter) (bson_iter_type((iter)) == BSON_TYPE_SYMBOL) #define BSON_ITER_HOLDS_CODEWSCOPE(iter) (bson_iter_type((iter)) == BSON_TYPE_CODEWSCOPE) #define BSON_ITER_HOLDS_INT32(iter) (bson_iter_type((iter)) == BSON_TYPE_INT32) #define BSON_ITER_HOLDS_TIMESTAMP(iter) (bson_iter_type((iter)) == BSON_TYPE_TIMESTAMP) #define BSON_ITER_HOLDS_INT64(iter) (bson_iter_type((iter)) == BSON_TYPE_INT64) #define BSON_ITER_HOLDS_DECIMAL128(iter) (bson_iter_type((iter)) == BSON_TYPE_DECIMAL128) #define BSON_ITER_HOLDS_MAXKEY(iter) (bson_iter_type((iter)) == BSON_TYPE_MAXKEY) #define BSON_ITER_HOLDS_MINKEY(iter) (bson_iter_type((iter)) == BSON_TYPE_MINKEY) #define BSON_ITER_HOLDS_INT(iter) (BSON_ITER_HOLDS_INT32(iter) || BSON_ITER_HOLDS_INT64(iter)) #define BSON_ITER_HOLDS_NUMBER(iter) (BSON_ITER_HOLDS_INT(iter) || BSON_ITER_HOLDS_DOUBLE(iter)) #define BSON_ITER_IS_KEY(iter, key) (0 == strcmp((key), bson_iter_key((iter)))) BSON_EXPORT(const bson_value_t *) bson_iter_value(bson_iter_t *iter); /** * bson_iter_utf8_len_unsafe: * @iter: a bson_iter_t. * * Returns the length of a string currently pointed to by @iter. This performs * no validation so the is responsible for knowing the BSON is valid. Calling * bson_validate() is one way to do this ahead of time. */ static BSON_INLINE uint32_t bson_iter_utf8_len_unsafe(const bson_iter_t *iter) { uint32_t raw; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&raw, iter->raw + iter->d1, sizeof(raw)); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END const uint32_t native = BSON_UINT32_FROM_LE(raw); int32_t len; memcpy(&len, &native, sizeof(len)); return len <= 0 ? 0u : (uint32_t)(len - 1); } BSON_EXPORT(void) bson_iter_array(const bson_iter_t *iter, uint32_t *array_len, const uint8_t **array); BSON_EXPORT(void) bson_iter_binary(const bson_iter_t *iter, bson_subtype_t *subtype, uint32_t *binary_len, const uint8_t **binary); BSON_EXPORT(void) bson_iter_overwrite_binary(bson_iter_t *iter, bson_subtype_t subtype, uint32_t *binary_len, uint8_t **binary); BSON_EXPORT(bson_subtype_t) bson_iter_binary_subtype(const bson_iter_t *iter); BSON_EXPORT(bool) bson_iter_binary_equal(const bson_iter_t *iter_a, const bson_iter_t *iter_b); BSON_EXPORT(const char *) bson_iter_code(const bson_iter_t *iter, uint32_t *length); /** * bson_iter_code_unsafe: * @iter: A bson_iter_t. * @length: A location for the length of the resulting string. * * Like bson_iter_code() but performs no integrity checks. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_code_unsafe(const bson_iter_t *iter, uint32_t *length) { *length = bson_iter_utf8_len_unsafe(iter); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (const char *)(iter->raw + iter->d2); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } BSON_EXPORT(const char *) bson_iter_codewscope(const bson_iter_t *iter, uint32_t *length, uint32_t *scope_len, const uint8_t **scope); BSON_EXPORT(void) bson_iter_dbpointer(const bson_iter_t *iter, uint32_t *collection_len, const char **collection, const bson_oid_t **oid); BSON_EXPORT(void) bson_iter_document(const bson_iter_t *iter, uint32_t *document_len, const uint8_t **document); BSON_EXPORT(double) bson_iter_double(const bson_iter_t *iter); BSON_EXPORT(double) bson_iter_as_double(const bson_iter_t *iter); /** * bson_iter_double_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_double() but does not perform an integrity checking. * * Returns: A double. */ static BSON_INLINE double bson_iter_double_unsafe(const bson_iter_t *iter) { double val; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&val, iter->raw + iter->d1, sizeof(val)); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return BSON_DOUBLE_FROM_LE(val); } BSON_EXPORT(bool) bson_iter_init(bson_iter_t *iter, const bson_t *bson); BSON_EXPORT(bool) bson_iter_init_from_data(bson_iter_t *iter, const uint8_t *data, size_t length); BSON_EXPORT(bool) bson_iter_init_find(bson_iter_t *iter, const bson_t *bson, const char *key); BSON_EXPORT(bool) bson_iter_init_find_w_len(bson_iter_t *iter, const bson_t *bson, const char *key, int keylen); BSON_EXPORT(bool) bson_iter_init_find_case(bson_iter_t *iter, const bson_t *bson, const char *key); BSON_EXPORT(bool) bson_iter_init_from_data_at_offset( bson_iter_t *iter, const uint8_t *data, size_t length, uint32_t offset, uint32_t keylen); BSON_EXPORT(int32_t) bson_iter_int32(const bson_iter_t *iter); /** * bson_iter_int32_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_int32() but with no integrity checking. * * Returns: A 32-bit signed integer. */ static BSON_INLINE int32_t bson_iter_int32_unsafe(const bson_iter_t *iter) { uint32_t raw; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&raw, iter->raw + iter->d1, sizeof(raw)); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END const uint32_t native = BSON_UINT32_FROM_LE(raw); int32_t res; memcpy(&res, &native, sizeof(res)); return res; } BSON_EXPORT(int64_t) bson_iter_int64(const bson_iter_t *iter); BSON_EXPORT(int64_t) bson_iter_as_int64(const bson_iter_t *iter); /** * bson_iter_int64_unsafe: * @iter: a bson_iter_t. * * Similar to bson_iter_int64() but without integrity checking. * * Returns: A 64-bit signed integer. */ static BSON_INLINE int64_t bson_iter_int64_unsafe(const bson_iter_t *iter) { uint64_t raw; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&raw, iter->raw + iter->d1, sizeof(raw)); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END const uint64_t native = BSON_UINT64_FROM_LE(raw); int64_t res; memcpy(&res, &native, sizeof(res)); return res; } BSON_EXPORT(bool) bson_iter_find(bson_iter_t *iter, const char *key); BSON_EXPORT(bool) bson_iter_find_w_len(bson_iter_t *iter, const char *key, int keylen); BSON_EXPORT(bool) bson_iter_find_case(bson_iter_t *iter, const char *key); BSON_EXPORT(bool) bson_iter_find_descendant(bson_iter_t *iter, const char *dotkey, bson_iter_t *descendant); BSON_EXPORT(bool) bson_iter_next(bson_iter_t *iter); BSON_EXPORT(const bson_oid_t *) bson_iter_oid(const bson_iter_t *iter); /** * bson_iter_oid_unsafe: * @iter: A #bson_iter_t. * * Similar to bson_iter_oid() but performs no integrity checks. * * Returns: A #bson_oid_t that should not be modified or freed. */ static BSON_INLINE const bson_oid_t * bson_iter_oid_unsafe(const bson_iter_t *iter) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (const bson_oid_t *)(iter->raw + iter->d1); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } BSON_EXPORT(bool) bson_iter_decimal128(const bson_iter_t *iter, bson_decimal128_t *dec); /** * bson_iter_decimal128_unsafe: * @iter: A #bson_iter_t. * * Similar to bson_iter_decimal128() but performs no integrity checks. * * Returns: A #bson_decimal128_t. */ static BSON_INLINE void bson_iter_decimal128_unsafe(const bson_iter_t *iter, bson_decimal128_t *dec) { uint64_t low_le; uint64_t high_le; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&low_le, iter->raw + iter->d1, sizeof(low_le)); memcpy(&high_le, iter->raw + iter->d1 + 8, sizeof(high_le)); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END dec->low = BSON_UINT64_FROM_LE(low_le); dec->high = BSON_UINT64_FROM_LE(high_le); } BSON_EXPORT(const char *) bson_iter_key(const bson_iter_t *iter); BSON_EXPORT(uint32_t) bson_iter_key_len(const bson_iter_t *iter); /** * bson_iter_key_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_key() but performs no integrity checking. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_key_unsafe(const bson_iter_t *iter) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (const char *)(iter->raw + iter->key); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } BSON_EXPORT(const char *) bson_iter_utf8(const bson_iter_t *iter, uint32_t *length); /** * bson_iter_utf8_unsafe: * * Similar to bson_iter_utf8() but performs no integrity checking. * * Returns: A string that should not be modified or freed. */ static BSON_INLINE const char * bson_iter_utf8_unsafe(const bson_iter_t *iter, size_t *length) { *length = bson_iter_utf8_len_unsafe(iter); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (const char *)(iter->raw + iter->d2); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } BSON_EXPORT(char *) bson_iter_dup_utf8(const bson_iter_t *iter, uint32_t *length); BSON_EXPORT(int64_t) bson_iter_date_time(const bson_iter_t *iter); BSON_EXPORT(time_t) bson_iter_time_t(const bson_iter_t *iter); /** * bson_iter_time_t_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_time_t() but performs no integrity checking. * * Returns: A time_t containing the number of seconds since UNIX epoch * in UTC. */ static BSON_INLINE time_t bson_iter_time_t_unsafe(const bson_iter_t *iter) { return (time_t)(bson_iter_int64_unsafe(iter) / 1000); } BSON_EXPORT(void) bson_iter_timeval(const bson_iter_t *iter, struct timeval *tv); /** * bson_iter_timeval_unsafe: * @iter: A bson_iter_t. * @tv: A struct timeval. * * Similar to bson_iter_timeval() but performs no integrity checking. */ static BSON_INLINE void bson_iter_timeval_unsafe(const bson_iter_t *iter, struct timeval *tv) { int64_t value = bson_iter_int64_unsafe(iter); #ifdef BSON_OS_WIN32 tv->tv_sec = (long)(value / 1000); tv->tv_usec = (long)(value % 1000) * 1000; #else tv->tv_sec = (time_t)(value / 1000); tv->tv_usec = (suseconds_t)(value % 1000) * 1000; #endif } BSON_EXPORT(void) bson_iter_timestamp(const bson_iter_t *iter, uint32_t *timestamp, uint32_t *increment); BSON_EXPORT(bool) bson_iter_bool(const bson_iter_t *iter); /** * bson_iter_bool_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_bool() but performs no integrity checking. * * Returns: true or false. */ static BSON_INLINE bool bson_iter_bool_unsafe(const bson_iter_t *iter) { char val; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(&val, iter->raw + iter->d1, 1); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return !!val; } BSON_EXPORT(bool) bson_iter_as_bool(const bson_iter_t *iter); BSON_EXPORT(const char *) bson_iter_regex(const bson_iter_t *iter, const char **options); BSON_EXPORT(const char *) bson_iter_symbol(const bson_iter_t *iter, uint32_t *length); BSON_EXPORT(bson_type_t) bson_iter_type(const bson_iter_t *iter); /** * bson_iter_type_unsafe: * @iter: A bson_iter_t. * * Similar to bson_iter_type() but performs no integrity checking. * * Returns: A bson_type_t. */ static BSON_INLINE bson_type_t bson_iter_type_unsafe(const bson_iter_t *iter) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (bson_type_t)(iter->raw + iter->type)[0]; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } BSON_EXPORT(bool) bson_iter_recurse(const bson_iter_t *iter, bson_iter_t *child); BSON_EXPORT(void) bson_iter_overwrite_int32(bson_iter_t *iter, int32_t value); BSON_EXPORT(void) bson_iter_overwrite_int64(bson_iter_t *iter, int64_t value); BSON_EXPORT(void) bson_iter_overwrite_double(bson_iter_t *iter, double value); BSON_EXPORT(void) bson_iter_overwrite_decimal128(bson_iter_t *iter, const bson_decimal128_t *value); BSON_EXPORT(void) bson_iter_overwrite_bool(bson_iter_t *iter, bool value); BSON_EXPORT(void) bson_iter_overwrite_oid(bson_iter_t *iter, const bson_oid_t *value); BSON_EXPORT(void) bson_iter_overwrite_timestamp(bson_iter_t *iter, uint32_t timestamp, uint32_t increment); BSON_EXPORT(void) bson_iter_overwrite_date_time(bson_iter_t *iter, int64_t value); BSON_EXPORT(bool) bson_iter_visit_all(bson_iter_t *iter, const bson_visitor_t *visitor, void *data); BSON_EXPORT(uint32_t) bson_iter_offset(bson_iter_t *iter); BSON_END_DECLS #endif /* BSON_ITER_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-json-private.h000066400000000000000000000015641511661753600240650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_JSON_PRIVATE_H #define BSON_JSON_PRIVATE_H #include // IWYU pragma: export struct _bson_json_opts_t { bson_json_mode_t mode; int32_t max_len; bool is_outermost_array; }; #endif /* BSON_JSON_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-json.c000066400000000000000000002307271511661753600224150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #include #include #endif #ifndef _MSC_VER #include #endif #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif #define STACK_MAX 100 #define BSON_JSON_DEFAULT_BUF_SIZE (1 << 14) #define AT_LEAST_0(x) ((x) >= 0 ? (x) : 0) #define READ_STATE_ENUM(ENUM) BSON_JSON_##ENUM, #define GENERATE_STRING(STRING) #STRING, #define FOREACH_READ_STATE(RS) \ RS(REGULAR) \ RS(DONE) \ RS(ERROR) \ RS(IN_START_MAP) \ RS(IN_BSON_TYPE) \ RS(IN_BSON_TYPE_DATE_NUMBERLONG) \ RS(IN_BSON_TYPE_DATE_ENDMAP) \ RS(IN_BSON_TYPE_TIMESTAMP_STARTMAP) \ RS(IN_BSON_TYPE_TIMESTAMP_VALUES) \ RS(IN_BSON_TYPE_TIMESTAMP_ENDMAP) \ RS(IN_BSON_TYPE_REGEX_STARTMAP) \ RS(IN_BSON_TYPE_REGEX_VALUES) \ RS(IN_BSON_TYPE_REGEX_ENDMAP) \ RS(IN_BSON_TYPE_BINARY_VALUES) \ RS(IN_BSON_TYPE_BINARY_ENDMAP) \ RS(IN_BSON_TYPE_SCOPE_STARTMAP) \ RS(IN_BSON_TYPE_DBPOINTER_STARTMAP) \ RS(IN_SCOPE) \ RS(IN_DBPOINTER) typedef enum { FOREACH_READ_STATE(READ_STATE_ENUM) } bson_json_read_state_t; static const char *read_state_names[] = {FOREACH_READ_STATE(GENERATE_STRING)}; #define BSON_STATE_ENUM(ENUM) BSON_JSON_LF_##ENUM, #define FOREACH_BSON_STATE(BS) \ /* legacy {$regex: "...", $options: "..."} */ \ BS(REGEX) \ BS(OPTIONS) \ /* modern $regularExpression: {pattern: "...", options: "..."} */ \ BS(REGULAR_EXPRESSION_PATTERN) \ BS(REGULAR_EXPRESSION_OPTIONS) \ BS(CODE) \ BS(SCOPE) \ BS(OID) \ BS(BINARY) \ BS(TYPE) \ BS(DATE) \ BS(TIMESTAMP_T) \ BS(TIMESTAMP_I) \ BS(UNDEFINED) \ BS(MINKEY) \ BS(MAXKEY) \ BS(INT32) \ BS(INT64) \ BS(DOUBLE) \ BS(DECIMAL128) \ BS(DBPOINTER) \ BS(SYMBOL) \ BS(UUID) typedef enum { FOREACH_BSON_STATE(BSON_STATE_ENUM) } bson_json_read_bson_state_t; static const char *bson_state_names[] = {FOREACH_BSON_STATE(GENERATE_STRING)}; typedef struct { uint8_t *buf; size_t n_bytes; size_t len; } bson_json_buf_t; typedef enum { BSON_JSON_FRAME_INITIAL = 0, BSON_JSON_FRAME_ARRAY, BSON_JSON_FRAME_DOC, BSON_JSON_FRAME_SCOPE, BSON_JSON_FRAME_DBPOINTER, } bson_json_frame_type_t; typedef struct { int i; bson_json_frame_type_t type; bson_t bson; } bson_json_stack_frame_t; typedef union { struct { bool has_pattern; bool has_options; bool is_legacy; } regex; struct { bool has_oid; bson_oid_t oid; } oid; struct { bool has_binary; bool has_subtype; bson_subtype_t type; bool is_legacy; } binary; struct { bool has_date; int64_t date; } date; struct { bool has_t; bool has_i; uint32_t t; uint32_t i; } timestamp; struct { bool has_undefined; } undefined; struct { bool has_minkey; } minkey; struct { bool has_maxkey; } maxkey; struct { int32_t value; } v_int32; struct { int64_t value; } v_int64; struct { double value; } v_double; struct { bson_decimal128_t value; } v_decimal128; } bson_json_bson_data_t; /* collect info while parsing a {$code: "...", $scope: {...}} object */ typedef struct { bool has_code; bool has_scope; bool in_scope; bson_json_buf_t key_buf; bson_json_buf_t code_buf; } bson_json_code_t; static void _bson_json_code_cleanup(bson_json_code_t *code_data) { bson_free(code_data->key_buf.buf); bson_free(code_data->code_buf.buf); } typedef struct { bson_t *bson; bson_json_stack_frame_t stack[STACK_MAX]; int n; const char *key; bson_json_buf_t key_buf; bson_json_buf_t unescaped; bson_json_read_state_t read_state; bson_json_read_bson_state_t bson_state; bson_type_t bson_type; bson_json_buf_t bson_type_buf[3]; bson_json_bson_data_t bson_type_data; bson_json_code_t code_data; bson_json_buf_t dbpointer_key; } bson_json_reader_bson_t; typedef struct { void *data; bson_json_reader_cb cb; bson_json_destroy_cb dcb; uint8_t *buf; size_t buf_size; size_t bytes_read; size_t bytes_parsed; bool all_whitespace; } bson_json_reader_producer_t; struct _bson_json_reader_t { bson_json_reader_producer_t producer; bson_json_reader_bson_t bson; jsonsl_t json; ssize_t json_text_pos; bool should_reset; ssize_t advance; bson_json_buf_t tok_accumulator; bson_error_t *error; }; typedef struct { int fd; bool do_close; } bson_json_reader_handle_fd_t; /* forward decl */ static void _bson_json_save_map_key(bson_json_reader_bson_t *bson, const uint8_t *val, size_t len); static void _noop(void) { } #define STACK_ELE(_delta, _name) (bson->stack[(_delta) + bson->n]._name) #define STACK_BSON(_delta) (((_delta) + bson->n) == 0 ? bson->bson : &STACK_ELE(_delta, bson)) #define STACK_BSON_PARENT STACK_BSON(-1) #define STACK_BSON_CHILD STACK_BSON(0) #define STACK_I STACK_ELE(0, i) #define STACK_FRAME_TYPE STACK_ELE(0, type) #define STACK_IS_ARRAY (STACK_FRAME_TYPE == BSON_JSON_FRAME_ARRAY) #define STACK_IS_SCOPE (STACK_FRAME_TYPE == BSON_JSON_FRAME_SCOPE) #define STACK_IS_DBPOINTER (STACK_FRAME_TYPE == BSON_JSON_FRAME_DBPOINTER) #define FRAME_TYPE_HAS_BSON(_type) ((_type) == BSON_JSON_FRAME_SCOPE || (_type) == BSON_JSON_FRAME_DBPOINTER) #define STACK_HAS_BSON FRAME_TYPE_HAS_BSON(STACK_FRAME_TYPE) #define STACK_PUSH(frame_type) \ do { \ if (bson->n >= (STACK_MAX - 1)) { \ return; \ } \ bson->n++; \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (STACK_HAS_BSON) { \ if (FRAME_TYPE_HAS_BSON(frame_type)) { \ bson_reinit(STACK_BSON_CHILD); \ } else { \ bson_destroy(STACK_BSON_CHILD); \ } \ } else if (FRAME_TYPE_HAS_BSON(frame_type)) { \ bson_init(STACK_BSON_CHILD); \ } \ mlib_diagnostic_pop(); \ STACK_FRAME_TYPE = frame_type; \ } while (0) #define STACK_PUSH_ARRAY(statement) \ do { \ STACK_PUSH(BSON_JSON_FRAME_ARRAY); \ STACK_I = 0; \ if (bson->n != 0) { \ statement; \ } \ } while (0) #define STACK_PUSH_DOC(statement) \ do { \ STACK_PUSH(BSON_JSON_FRAME_DOC); \ if (bson->n != 0) { \ statement; \ } \ } while (0) #define STACK_PUSH_SCOPE \ do { \ STACK_PUSH(BSON_JSON_FRAME_SCOPE); \ bson->code_data.in_scope = true; \ } while (0) #define STACK_PUSH_DBPOINTER \ do { \ STACK_PUSH(BSON_JSON_FRAME_DBPOINTER); \ } while (0) #define STACK_POP_ARRAY(statement) \ do { \ if (!STACK_IS_ARRAY) { \ return; \ } \ if (bson->n < 0) { \ return; \ } \ if (bson->n > 0) { \ statement; \ } \ bson->n--; \ } while (0) #define STACK_POP_DOC(statement) \ do { \ if (STACK_IS_ARRAY) { \ return; \ } \ if (bson->n < 0) { \ return; \ } \ if (bson->n > 0) { \ statement; \ } \ bson->n--; \ } while (0) #define STACK_POP_SCOPE \ do { \ STACK_POP_DOC(_noop()); \ bson->code_data.in_scope = false; \ } while (0) #define STACK_POP_DBPOINTER STACK_POP_DOC(_noop()) #define BASIC_CB_PREAMBLE \ const char *key; \ size_t len; \ bson_json_reader_bson_t *bson = &reader->bson; \ _bson_json_read_fixup_key(bson); \ key = bson->key; \ len = bson->key_buf.len; \ if (len > INT_MAX) { \ _bson_json_read_set_error(reader, "Failed to read JSON. key size %zu is too large. Max is %d", len, INT_MAX); \ return; \ } \ (void)0 #define BASIC_CB_BAIL_IF_NOT_NORMAL(_type) \ if (bson->read_state != BSON_JSON_REGULAR) { \ _bson_json_read_set_error( \ reader, "Invalid read of %s in state %s", (_type), read_state_names[bson->read_state]); \ return; \ } else if (!key) { \ _bson_json_read_set_error( \ reader, "Invalid read of %s without key in state %s", (_type), read_state_names[bson->read_state]); \ return; \ } else \ (void)0 #define HANDLE_OPTION_KEY_COMPARE(_key) (len == strlen(_key) && memcmp(key, (_key), len) == 0) #define HANDLE_OPTION_TYPE_CHECK(_key, _type) \ if (bson->bson_type && bson->bson_type != (_type)) { \ _bson_json_read_set_error(reader, \ "Invalid key \"%s\". Looking for values " \ "for type \"%s\", got \"%s\"", \ (_key), \ _bson_json_type_name(bson->bson_type), \ _bson_json_type_name(_type)); \ return; \ } \ ((void)0) #define HANDLE_OPTION(_selection_statement, _key, _type, _state) \ _selection_statement(HANDLE_OPTION_KEY_COMPARE(_key)) \ { \ HANDLE_OPTION_TYPE_CHECK(_key, _type); \ bson->bson_type = (_type); \ bson->bson_state = (_state); \ } bson_json_opts_t * bson_json_opts_new(bson_json_mode_t mode, int32_t max_len) { bson_json_opts_t *opts; opts = (bson_json_opts_t *)bson_malloc(sizeof *opts); *opts = (bson_json_opts_t){ .mode = mode, .max_len = max_len, .is_outermost_array = false, }; return opts; } void bson_json_opts_destroy(bson_json_opts_t *opts) { bson_free(opts); } static void _bson_json_read_set_error(bson_json_reader_t *reader, const char *fmt, ...) BSON_GNUC_PRINTF(2, 3); static void _bson_json_read_set_error(bson_json_reader_t *reader, /* IN */ const char *fmt, /* IN */ ...) { va_list ap; if (reader->error) { reader->error->domain = BSON_ERROR_JSON; reader->error->code = BSON_JSON_ERROR_READ_INVALID_PARAM; bson_set_error_category(reader->error, BSON_ERROR_CATEGORY); va_start(ap, fmt); bson_vsnprintf(reader->error->message, sizeof reader->error->message, fmt, ap); va_end(ap); } reader->bson.read_state = BSON_JSON_ERROR; jsonsl_stop(reader->json); } static void _bson_json_read_corrupt(bson_json_reader_t *reader, const char *fmt, ...) BSON_GNUC_PRINTF(2, 3); static void _bson_json_read_corrupt(bson_json_reader_t *reader, /* IN */ const char *fmt, /* IN */ ...) { va_list ap; if (reader->error) { reader->error->domain = BSON_ERROR_JSON; reader->error->code = BSON_JSON_ERROR_READ_CORRUPT_JS; bson_set_error_category(reader->error, BSON_ERROR_CATEGORY); va_start(ap, fmt); bson_vsnprintf(reader->error->message, sizeof reader->error->message, fmt, ap); va_end(ap); } reader->bson.read_state = BSON_JSON_ERROR; jsonsl_stop(reader->json); } static void _bson_json_buf_ensure(bson_json_buf_t *buf, /* IN */ size_t len) /* IN */ { if (buf->n_bytes < len) { bson_free(buf->buf); buf->n_bytes = bson_next_power_of_two(len); buf->buf = bson_malloc(buf->n_bytes); } } static void _bson_json_buf_set(bson_json_buf_t *buf, const void *from, size_t len) { _bson_json_buf_ensure(buf, len + 1); memcpy(buf->buf, from, len); buf->buf[len] = '\0'; buf->len = len; } static void _bson_json_buf_append(bson_json_buf_t *buf, const void *from, size_t len) { size_t len_with_null = len + 1; if (buf->len == 0) { _bson_json_buf_ensure(buf, len_with_null); } else if (buf->n_bytes < buf->len + len_with_null) { buf->n_bytes = bson_next_power_of_two(buf->len + len_with_null); buf->buf = bson_realloc(buf->buf, buf->n_bytes); } memcpy(buf->buf + buf->len, from, len); buf->len += len; buf->buf[buf->len] = '\0'; } static const char * _bson_json_type_name(bson_type_t type) { switch (type) { case BSON_TYPE_EOD: return "end of document"; case BSON_TYPE_DOUBLE: return "double"; case BSON_TYPE_UTF8: return "utf-8"; case BSON_TYPE_DOCUMENT: return "document"; case BSON_TYPE_ARRAY: return "array"; case BSON_TYPE_BINARY: return "binary"; case BSON_TYPE_UNDEFINED: return "undefined"; case BSON_TYPE_OID: return "objectid"; case BSON_TYPE_BOOL: return "bool"; case BSON_TYPE_DATE_TIME: return "datetime"; case BSON_TYPE_NULL: return "null"; case BSON_TYPE_REGEX: return "regex"; case BSON_TYPE_DBPOINTER: return "dbpointer"; case BSON_TYPE_CODE: return "code"; case BSON_TYPE_SYMBOL: return "symbol"; case BSON_TYPE_CODEWSCOPE: return "code with scope"; case BSON_TYPE_INT32: return "int32"; case BSON_TYPE_TIMESTAMP: return "timestamp"; case BSON_TYPE_INT64: return "int64"; case BSON_TYPE_DECIMAL128: return "decimal128"; case BSON_TYPE_MAXKEY: return "maxkey"; case BSON_TYPE_MINKEY: return "minkey"; default: return ""; } } static void _bson_json_read_fixup_key(bson_json_reader_bson_t *bson) /* IN */ { bson_json_read_state_t rs = bson->read_state; if (bson->n >= 0 && STACK_IS_ARRAY && rs == BSON_JSON_REGULAR) { _bson_json_buf_ensure(&bson->key_buf, 12); bson->key_buf.len = bson_uint32_to_string(STACK_I, &bson->key, (char *)bson->key_buf.buf, 12); STACK_I++; } } static void _bson_json_read_null(bson_json_reader_t *reader) { BASIC_CB_PREAMBLE; BASIC_CB_BAIL_IF_NOT_NORMAL("null"); bson_append_null(STACK_BSON_CHILD, key, (int)len); } static void _bson_json_read_boolean(bson_json_reader_t *reader, /* IN */ int val) /* IN */ { BASIC_CB_PREAMBLE; if (bson->read_state == BSON_JSON_IN_BSON_TYPE && bson->bson_state == BSON_JSON_LF_UNDEFINED) { bson->bson_type_data.undefined.has_undefined = true; return; } BASIC_CB_BAIL_IF_NOT_NORMAL("boolean"); bson_append_bool(STACK_BSON_CHILD, key, (int)len, val); } /* sign is -1 or 1 */ static void _bson_json_read_integer(bson_json_reader_t *reader, uint64_t val, int64_t sign) { bson_json_read_state_t rs; bson_json_read_bson_state_t bs; BASIC_CB_PREAMBLE; if (sign == 1 && val > INT64_MAX) { _bson_json_read_set_error(reader, "Number \"%" PRIu64 "\" is out of range", val); return; } else if (sign == -1 && val > ((uint64_t)INT64_MAX + 1)) { _bson_json_read_set_error(reader, "Number \"-%" PRIu64 "\" is out of range", val); return; } rs = bson->read_state; bs = bson->bson_state; if (rs == BSON_JSON_REGULAR) { BASIC_CB_BAIL_IF_NOT_NORMAL("integer"); if (val <= INT32_MAX || (sign == -1 && val <= (uint64_t)INT32_MAX + 1)) { bson_append_int32(STACK_BSON_CHILD, key, (int)len, (int32_t)((int64_t)val * sign)); } else if (sign == -1) { #if defined(_WIN32) && !defined(__MINGW32__) // Unary negation of unsigned integer is deliberate. #pragma warning(suppress : 4146) bson_append_int64(STACK_BSON_CHILD, key, (int)len, (int64_t)-val); #else bson_append_int64(STACK_BSON_CHILD, key, (int)len, (int64_t)-val); #endif // defined(_WIN32) && !defined(__MINGW32__) } else { bson_append_int64(STACK_BSON_CHILD, key, (int)len, (int64_t)val); } } else if (rs == BSON_JSON_IN_BSON_TYPE || rs == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { switch (bs) { case BSON_JSON_LF_DATE: bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = sign * val; break; case BSON_JSON_LF_TIMESTAMP_T: if (sign == -1) { _bson_json_read_set_error(reader, "Invalid timestamp value: \"-%" PRIu64 "\"", val); return; } bson->bson_type_data.timestamp.has_t = true; bson->bson_type_data.timestamp.t = (uint32_t)val; break; case BSON_JSON_LF_TIMESTAMP_I: if (sign == -1) { _bson_json_read_set_error(reader, "Invalid timestamp value: \"-%" PRIu64 "\"", val); return; } bson->bson_type_data.timestamp.has_i = true; bson->bson_type_data.timestamp.i = (uint32_t)val; break; case BSON_JSON_LF_MINKEY: if (sign == -1) { _bson_json_read_set_error(reader, "Invalid MinKey value: \"-%" PRIu64 "\"", val); return; } else if (val != 1) { _bson_json_read_set_error(reader, "Invalid MinKey value: \"%" PRIu64 "\"", val); } bson->bson_type_data.minkey.has_minkey = true; break; case BSON_JSON_LF_MAXKEY: if (sign == -1) { _bson_json_read_set_error(reader, "Invalid MinKey value: \"-%" PRIu64 "\"", val); return; } else if (val != 1) { _bson_json_read_set_error(reader, "Invalid MinKey value: \"%" PRIu64 "\"", val); } bson->bson_type_data.maxkey.has_maxkey = true; break; case BSON_JSON_LF_INT32: case BSON_JSON_LF_INT64: _bson_json_read_set_error(reader, "Invalid state for integer read: %s, " "expected number as quoted string like \"123\"", bson_state_names[bs]); break; case BSON_JSON_LF_REGEX: case BSON_JSON_LF_OPTIONS: case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: case BSON_JSON_LF_CODE: case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_OID: case BSON_JSON_LF_BINARY: case BSON_JSON_LF_TYPE: case BSON_JSON_LF_UUID: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_DOUBLE: case BSON_JSON_LF_DECIMAL128: case BSON_JSON_LF_DBPOINTER: case BSON_JSON_LF_SYMBOL: default: _bson_json_read_set_error(reader, "Unexpected integer %s%" PRIu64 " in type \"%s\"", sign == -1 ? "-" : "", val, _bson_json_type_name(bson->bson_type)); } } else { _bson_json_read_set_error( reader, "Unexpected integer %s%" PRIu64 " in state \"%s\"", sign == -1 ? "-" : "", val, read_state_names[rs]); } } static bool _bson_json_parse_double(bson_json_reader_t *reader, const char *val, size_t vlen, double *d) { errno = 0; *d = strtod(val, NULL); #ifdef _MSC_VER const double pos_inf = INFINITY; const double neg_inf = -pos_inf; /* Microsoft's strtod parses "NaN", "Infinity", "-Infinity" as 0 */ if (*d == 0.0) { if (!_strnicmp(val, "nan", vlen)) { *d = NAN; return true; } else if (!_strnicmp(val, "infinity", vlen)) { *d = pos_inf; return true; } else if (!_strnicmp(val, "-infinity", vlen)) { *d = neg_inf; return true; } } if ((*d == HUGE_VAL || *d == -HUGE_VAL) && errno == ERANGE) { _bson_json_read_set_error(reader, "Number \"%.*s\" is out of range", (int)vlen, val); return false; } #else /* not MSVC - set err on overflow, but avoid err for infinity */ if ((*d == HUGE_VAL || *d == -HUGE_VAL) && errno == ERANGE && strncasecmp(val, "infinity", vlen) && strncasecmp(val, "-infinity", vlen)) { _bson_json_read_set_error(reader, "Number \"%.*s\" is out of range", (int)vlen, val); return false; } #endif /* _MSC_VER */ return true; } static void _bson_json_read_double(bson_json_reader_t *reader, /* IN */ double val) /* IN */ { BASIC_CB_PREAMBLE; BASIC_CB_BAIL_IF_NOT_NORMAL("double"); if (!bson_append_double(STACK_BSON_CHILD, key, (int)len, val)) { _bson_json_read_set_error(reader, "Cannot append double value %g", val); } } static bool _bson_json_read_int64_or_set_error(bson_json_reader_t *reader, /* IN */ const unsigned char *val, /* IN */ size_t vlen, /* IN */ int64_t *v64) /* OUT */ { bson_json_reader_bson_t *bson = &reader->bson; char *endptr = NULL; _bson_json_read_fixup_key(bson); errno = 0; *v64 = bson_ascii_strtoll((const char *)val, &endptr, 10); if (((*v64 == INT64_MIN) || (*v64 == INT64_MAX)) && (errno == ERANGE)) { _bson_json_read_set_error(reader, "Number \"%s\" is out of range", val); return false; } if (endptr != ((const char *)val + vlen)) { _bson_json_read_set_error(reader, "Number \"%s\" is invalid", val); return false; } return true; } static bool _unhexlify_uuid(const char *uuid, uint8_t *out, size_t max) { unsigned int byte; size_t x = 0; int i = 0; BSON_ASSERT(strlen(uuid) == 32); while (SSCANF(&uuid[i], "%2x", &byte) == 1) { if (x >= max) { return false; } out[x++] = (uint8_t)byte; i += 2; } return i == 32; } /* parse a value for "base64", "subType", legacy "$binary" or "$type", or * "$uuid" */ static void _bson_json_parse_binary_elem(bson_json_reader_t *reader, const char *val_w_null, size_t vlen) { bson_json_read_bson_state_t bs; bson_json_bson_data_t *data; int binary_len; BASIC_CB_PREAMBLE; bs = bson->bson_state; data = &bson->bson_type_data; if (bs == BSON_JSON_LF_BINARY) { data->binary.has_binary = true; binary_len = mcommon_b64_pton(val_w_null, NULL, 0); if (binary_len < 0) { _bson_json_read_set_error( reader, "Invalid input string \"%s\", looking for base64-encoded binary", val_w_null); } _bson_json_buf_ensure(&bson->bson_type_buf[0], (size_t)binary_len + 1); if (mcommon_b64_pton(val_w_null, bson->bson_type_buf[0].buf, (size_t)binary_len + 1) < 0) { _bson_json_read_set_error( reader, "Invalid input string \"%s\", looking for base64-encoded binary", val_w_null); } bson->bson_type_buf[0].len = (size_t)binary_len; } else if (bs == BSON_JSON_LF_TYPE) { data->binary.has_subtype = true; if (SSCANF(val_w_null, "%02x", &data->binary.type) != 1) { if (!data->binary.is_legacy || data->binary.has_binary) { /* misformatted subtype, like {$binary: {base64: "", subType: "x"}}, * or legacy {$binary: "", $type: "x"} */ _bson_json_read_set_error(reader, "Invalid input string \"%s\", looking for binary subtype", val_w_null); } else { /* actually a query operator: {x: {$type: "array"}}*/ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC(bson_append_document_begin(STACK_BSON_PARENT, key, (int)len, STACK_BSON_CHILD)); bson_append_utf8(STACK_BSON_CHILD, "$type", 5, (const char *)val_w_null, (int)vlen); } } } else if (bs == BSON_JSON_LF_UUID) { int nread = 0; char uuid[33]; data->binary.has_binary = true; data->binary.has_subtype = true; data->binary.type = BSON_SUBTYPE_UUID; /* Validate the UUID and extract relevant portions */ /* We can't use %x here as it allows +, -, and 0x prefixes */ #ifdef _MSC_VER SSCANF(val_w_null, "%8c-%4c-%4c-%4c-%12c%n", &uuid[0], 8, &uuid[8], 4, &uuid[12], 4, &uuid[16], 4, &uuid[20], 12, &nread); #else SSCANF(val_w_null, "%8c-%4c-%4c-%4c-%12c%n", &uuid[0], &uuid[8], &uuid[12], &uuid[16], &uuid[20], &nread); #endif uuid[32] = '\0'; if (nread != 36 || val_w_null[nread] != '\0') { _bson_json_read_set_error(reader, "Invalid input string \"%s\", looking for " "a dash-separated UUID string", val_w_null); return; } binary_len = 16; _bson_json_buf_ensure(&bson->bson_type_buf[0], (size_t)binary_len + 1); if (!_unhexlify_uuid(&uuid[0], bson->bson_type_buf[0].buf, (size_t)binary_len)) { _bson_json_read_set_error(reader, "Invalid input string \"%s\", looking for " "a dash-separated UUID string", val_w_null); } bson->bson_type_buf[0].len = (size_t)binary_len; } } static bool _bson_json_allow_embedded_nulls(bson_json_reader_t const *reader) { const bson_json_read_state_t read_state = reader->bson.read_state; const bson_json_read_bson_state_t bson_state = reader->bson.bson_state; if (read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { if (bson_state == BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN || bson_state == BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS) { /* Prohibit embedded NULL bytes for canonical extended regex: * { $regularExpression: { pattern: "pattern", options: "options" } } */ return false; } } if (read_state == BSON_JSON_IN_BSON_TYPE) { if (bson_state == BSON_JSON_LF_REGEX || bson_state == BSON_JSON_LF_OPTIONS) { /* Prohibit embedded NULL bytes for legacy regex: * { $regex: "pattern", $options: "options" } */ return false; } } /* Embedded nulls are okay in any other context */ return true; } static void _bson_json_read_string(bson_json_reader_t *reader, /* IN */ const unsigned char *val, /* IN */ size_t vlen) /* IN */ { bson_json_read_state_t rs; bson_json_read_bson_state_t bs; const bool allow_null = _bson_json_allow_embedded_nulls(reader); BASIC_CB_PREAMBLE; rs = bson->read_state; bs = bson->bson_state; if (!bson_utf8_validate((const char *)val, vlen, allow_null)) { _bson_json_read_corrupt(reader, "invalid bytes in UTF8 string"); return; } if (rs == BSON_JSON_REGULAR) { BASIC_CB_BAIL_IF_NOT_NORMAL("string"); bson_append_utf8(STACK_BSON_CHILD, key, (int)len, (const char *)val, (int)vlen); } else if (rs == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP || rs == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { _bson_json_read_set_error(reader, "Invalid read of \"%s\" in state \"%s\"", val, read_state_names[rs]); } else if (rs == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { const char *val_w_null; _bson_json_buf_set(&bson->bson_type_buf[2], val, vlen); val_w_null = (const char *)bson->bson_type_buf[2].buf; _bson_json_parse_binary_elem(reader, val_w_null, vlen); } else if (rs == BSON_JSON_IN_BSON_TYPE || rs == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES || rs == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES || rs == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { const char *val_w_null; _bson_json_buf_set(&bson->bson_type_buf[2], val, vlen); val_w_null = (const char *)bson->bson_type_buf[2].buf; switch (bs) { case BSON_JSON_LF_REGEX: bson->bson_type_data.regex.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: bson->bson_type_data.regex.has_pattern = true; _bson_json_buf_set(&bson->bson_type_buf[0], val, vlen); break; case BSON_JSON_LF_OPTIONS: bson->bson_type_data.regex.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: bson->bson_type_data.regex.has_options = true; _bson_json_buf_set(&bson->bson_type_buf[1], val, vlen); break; case BSON_JSON_LF_OID: if (vlen != 24) { goto BAD_PARSE; } bson->bson_type_data.oid.has_oid = true; bson_oid_init_from_string(&bson->bson_type_data.oid.oid, val_w_null); break; case BSON_JSON_LF_BINARY: case BSON_JSON_LF_TYPE: bson->bson_type_data.binary.is_legacy = true; /* FALL THROUGH */ case BSON_JSON_LF_UUID: _bson_json_parse_binary_elem(reader, val_w_null, vlen); break; case BSON_JSON_LF_INT32: { int64_t v64; if (!_bson_json_read_int64_or_set_error(reader, val, vlen, &v64)) { /* the error is set, return and let the reader exit */ return; } if (v64 < INT32_MIN || v64 > INT32_MAX) { goto BAD_PARSE; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_int32.value = (int32_t)v64; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_INT64: { int64_t v64; if (!_bson_json_read_int64_or_set_error(reader, val, vlen, &v64)) { /* the error is set, return and let the reader exit */ return; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_int64.value = v64; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = v64; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_DOUBLE: { if (!_bson_json_parse_double(reader, (const char *)val, vlen, &bson->bson_type_data.v_double.value)) { /* the error is set, return and let the reader exit */ return; } } break; case BSON_JSON_LF_DATE: { int64_t v64; if (!_bson_iso8601_date_parse((char *)val, (int)vlen, &v64, reader->error)) { jsonsl_stop(reader->json); } else { bson->bson_type_data.date.has_date = true; bson->bson_type_data.date.date = v64; } } break; case BSON_JSON_LF_DECIMAL128: { bson_decimal128_t decimal128; if (bson_decimal128_from_string(val_w_null, &decimal128) && bson->read_state == BSON_JSON_IN_BSON_TYPE) { bson->bson_type_data.v_decimal128.value = decimal128; } else { goto BAD_PARSE; } } break; case BSON_JSON_LF_CODE: _bson_json_buf_set(&bson->code_data.code_buf, val, vlen); break; case BSON_JSON_LF_SYMBOL: bson_append_symbol(STACK_BSON_CHILD, key, (int)len, (const char *)val, (int)vlen); break; case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_TIMESTAMP_T: case BSON_JSON_LF_TIMESTAMP_I: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_MINKEY: case BSON_JSON_LF_MAXKEY: case BSON_JSON_LF_DBPOINTER: default: goto BAD_PARSE; } return; BAD_PARSE: _bson_json_read_set_error( reader, "Invalid input string \"%s\", looking for %s", val_w_null, bson_state_names[bs]); } else { _bson_json_read_set_error(reader, "Invalid state to look for string: %s", read_state_names[rs]); } } static void _bson_json_read_start_map(bson_json_reader_t *reader) /* IN */ { BASIC_CB_PREAMBLE; if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { switch (bson->bson_state) { case BSON_JSON_LF_DATE: bson->read_state = BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG; break; case BSON_JSON_LF_BINARY: bson->read_state = BSON_JSON_IN_BSON_TYPE_BINARY_VALUES; break; case BSON_JSON_LF_TYPE: /* special case, we started parsing {$type: {$numberInt: "2"}} and we * expected a legacy Binary format. now we see the second "{", so * backtrack and parse $type query operator. */ bson->read_state = BSON_JSON_IN_START_MAP; BSON_ASSERT(mlib_in_range(int, len)); STACK_PUSH_DOC(bson_append_document_begin(STACK_BSON_PARENT, key, (int)len, STACK_BSON_CHILD)); _bson_json_save_map_key(bson, (const uint8_t *)"$type", 5); break; case BSON_JSON_LF_CODE: case BSON_JSON_LF_DECIMAL128: case BSON_JSON_LF_DOUBLE: case BSON_JSON_LF_INT32: case BSON_JSON_LF_INT64: case BSON_JSON_LF_MAXKEY: case BSON_JSON_LF_MINKEY: case BSON_JSON_LF_OID: case BSON_JSON_LF_OPTIONS: case BSON_JSON_LF_REGEX: /** * NOTE: A read_state of BSON_JSON_IN_BSON_TYPE is used when "$regex" is * found, but BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP is used for * "$regularExpression", which will instead go to a below 'if else' branch * instead of this switch statement. They're both called "regex" in their * respective enumerators, but they behave differently when parsing. */ // fallthrough case BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS: case BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN: case BSON_JSON_LF_SYMBOL: case BSON_JSON_LF_UNDEFINED: case BSON_JSON_LF_UUID: // These special keys do not expect objects as their values. Fail. _bson_json_read_set_error(reader, "Unexpected nested object value for \"%s\" key", reader->bson.unescaped.buf); break; case BSON_JSON_LF_DBPOINTER: case BSON_JSON_LF_SCOPE: case BSON_JSON_LF_TIMESTAMP_I: case BSON_JSON_LF_TIMESTAMP_T: default: // These special LF keys aren't handled with BSON_JSON_IN_BSON_TYPE BSON_UNREACHABLE("These LF values are handled with a different read_state"); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_STARTMAP) { bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP) { bson->read_state = BSON_JSON_IN_SCOPE; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { bson->read_state = BSON_JSON_IN_DBPOINTER; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP) { bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_VALUES; } else { bson->read_state = BSON_JSON_IN_START_MAP; } /* silence some warnings */ (void)len; (void)key; } #define BSON_PRIVATE_SPECIAL_KEYS_XMACRO(X) \ X(binary) \ X(code) \ X(date) \ X(dbPointer) \ X(maxKey) \ X(minKey) \ X(numberDecimal) \ X(numberDouble) \ X(numberInt) \ X(numberLong) \ X(oid) \ X(options) \ X(regex) \ X(regularExpression) \ X(scope) \ X(symbol) \ X(timestamp) \ X(type) \ X(undefined) \ X(uuid) static bool _is_known_key(const char *key, size_t len) { #define IS_KEY(k) \ if (len == strlen("$" #k) && (0 == memcmp("$" #k, key, len))) { \ return true; \ } BSON_PRIVATE_SPECIAL_KEYS_XMACRO(IS_KEY) #undef IS_KEY return false; } static void _bson_json_save_map_key(bson_json_reader_bson_t *bson, const uint8_t *val, size_t len) { _bson_json_buf_set(&bson->key_buf, val, len); bson->key = (const char *)bson->key_buf.buf; } static void _bson_json_read_code_or_scope_key(bson_json_reader_bson_t *bson, bool is_scope, const uint8_t *val, size_t len) { bson_json_code_t *code = &bson->code_data; if (code->in_scope) { /* we're reading something weirdly nested, e.g. we just read "$code" in * "$scope: {x: {$code: {}}}". just create the subdoc within the scope. */ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC( bson_append_document_begin(STACK_BSON_PARENT, bson->key, (int)bson->key_buf.len, STACK_BSON_CHILD)); _bson_json_save_map_key(bson, val, len); } else { if (!bson->code_data.key_buf.len) { /* save the key, e.g. {"key": {"$code": "return x", "$scope":{"x":1}}}, * in case it is overwritten while parsing scope sub-object */ _bson_json_buf_set(&bson->code_data.key_buf, bson->key, bson->key_buf.len); } if (is_scope) { bson->bson_type = BSON_TYPE_CODEWSCOPE; bson->read_state = BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP; bson->bson_state = BSON_JSON_LF_SCOPE; bson->code_data.has_scope = true; } else { bson->bson_type = BSON_TYPE_CODE; bson->bson_state = BSON_JSON_LF_CODE; bson->code_data.has_code = true; } } } static void _bson_json_bad_key_in_type(bson_json_reader_t *reader, /* IN */ const uint8_t *val) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; _bson_json_read_set_error( reader, "Invalid key \"%s\". Looking for values for type \"%s\"", val, _bson_json_type_name(bson->bson_type)); } static void _bson_json_read_map_key(bson_json_reader_t *reader, /* IN */ const uint8_t *val, /* IN */ size_t len) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; if (!bson_utf8_validate((const char *)val, len, false /* allow null */)) { _bson_json_read_corrupt(reader, "invalid bytes in UTF8 string"); return; } const char *const key = (const char *)val; if (bson->read_state == BSON_JSON_IN_START_MAP) { if (len > 0 && key[0] == '$' && _is_known_key(key, len) && bson->n >= 0 /* key is in subdocument */) { bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = (bson_type_t)0; memset(&bson->bson_type_data, 0, sizeof bson->bson_type_data); } else { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC( bson_append_document_begin(STACK_BSON_PARENT, bson->key, (int)bson->key_buf.len, STACK_BSON_CHILD)); } } else if (bson->read_state == BSON_JSON_IN_SCOPE) { /* we've read "key" in {$code: "", $scope: {key: ""}}*/ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_SCOPE; _bson_json_save_map_key(bson, val, len); } else if (bson->read_state == BSON_JSON_IN_DBPOINTER) { /* we've read "$ref" or "$id" in {$dbPointer: {$ref: ..., $id: ...}} */ bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DBPOINTER; _bson_json_save_map_key(bson, val, len); } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { HANDLE_OPTION(if, "$regex", BSON_TYPE_REGEX, BSON_JSON_LF_REGEX) HANDLE_OPTION(else if, "$options", BSON_TYPE_REGEX, BSON_JSON_LF_OPTIONS) HANDLE_OPTION(else if, "$oid", BSON_TYPE_OID, BSON_JSON_LF_OID) HANDLE_OPTION(else if, "$binary", BSON_TYPE_BINARY, BSON_JSON_LF_BINARY) HANDLE_OPTION(else if, "$type", BSON_TYPE_BINARY, BSON_JSON_LF_TYPE) HANDLE_OPTION(else if, "$uuid", BSON_TYPE_BINARY, BSON_JSON_LF_UUID) HANDLE_OPTION(else if, "$date", BSON_TYPE_DATE_TIME, BSON_JSON_LF_DATE) HANDLE_OPTION(else if, "$undefined", BSON_TYPE_UNDEFINED, BSON_JSON_LF_UNDEFINED) HANDLE_OPTION(else if, "$minKey", BSON_TYPE_MINKEY, BSON_JSON_LF_MINKEY) HANDLE_OPTION(else if, "$maxKey", BSON_TYPE_MAXKEY, BSON_JSON_LF_MAXKEY) HANDLE_OPTION(else if, "$numberInt", BSON_TYPE_INT32, BSON_JSON_LF_INT32) HANDLE_OPTION(else if, "$numberLong", BSON_TYPE_INT64, BSON_JSON_LF_INT64) HANDLE_OPTION(else if, "$numberDouble", BSON_TYPE_DOUBLE, BSON_JSON_LF_DOUBLE) HANDLE_OPTION(else if, "$symbol", BSON_TYPE_SYMBOL, BSON_JSON_LF_SYMBOL) HANDLE_OPTION(else if, "$numberDecimal", BSON_TYPE_DECIMAL128, BSON_JSON_LF_DECIMAL128) else if (HANDLE_OPTION_KEY_COMPARE("$timestamp")) { HANDLE_OPTION_TYPE_CHECK("$timestamp", BSON_TYPE_TIMESTAMP); bson->bson_type = BSON_TYPE_TIMESTAMP; bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_STARTMAP; } else if (HANDLE_OPTION_KEY_COMPARE("$regularExpression")) { HANDLE_OPTION_TYPE_CHECK("$regularExpression", BSON_TYPE_REGEX); bson->bson_type = BSON_TYPE_REGEX; bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_STARTMAP; } else if (HANDLE_OPTION_KEY_COMPARE("$dbPointer")) { HANDLE_OPTION_TYPE_CHECK("$dbPointer", BSON_TYPE_DBPOINTER); /* start parsing "key": {"$dbPointer": {...}}, save "key" for later */ _bson_json_buf_set(&bson->dbpointer_key, bson->key, bson->key_buf.len); bson->bson_type = BSON_TYPE_DBPOINTER; bson->read_state = BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP; } else if (HANDLE_OPTION_KEY_COMPARE("$code")) { // "$code" may come after "$scope". if (bson->bson_type != BSON_TYPE_CODEWSCOPE) { HANDLE_OPTION_TYPE_CHECK("$code", BSON_TYPE_CODE); } _bson_json_read_code_or_scope_key(bson, false /* is_scope */, val, len); } else if (HANDLE_OPTION_KEY_COMPARE("$scope")) { // "$scope" may come after "$code". if (bson->bson_type != BSON_TYPE_CODE) { HANDLE_OPTION_TYPE_CHECK("$scope", BSON_TYPE_CODEWSCOPE); } _bson_json_read_code_or_scope_key(bson, true /* is_scope */, val, len); } else { _bson_json_bad_key_in_type(reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { HANDLE_OPTION(if, "$numberLong", BSON_TYPE_DATE_TIME, BSON_JSON_LF_INT64) else { _bson_json_bad_key_in_type(reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { HANDLE_OPTION(if, "t", BSON_TYPE_TIMESTAMP, BSON_JSON_LF_TIMESTAMP_T) HANDLE_OPTION(else if, "i", BSON_TYPE_TIMESTAMP, BSON_JSON_LF_TIMESTAMP_I) else { _bson_json_bad_key_in_type(reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { HANDLE_OPTION(if, "pattern", BSON_TYPE_REGEX, BSON_JSON_LF_REGULAR_EXPRESSION_PATTERN) HANDLE_OPTION(else if, "options", BSON_TYPE_REGEX, BSON_JSON_LF_REGULAR_EXPRESSION_OPTIONS) else { _bson_json_bad_key_in_type(reader, val); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { HANDLE_OPTION(if, "base64", BSON_TYPE_BINARY, BSON_JSON_LF_BINARY) HANDLE_OPTION(else if, "subType", BSON_TYPE_BINARY, BSON_JSON_LF_TYPE) else { _bson_json_bad_key_in_type(reader, val); } } else { _bson_json_save_map_key(bson, val, len); } } static void _bson_json_read_append_binary(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_bson_data_t *data = &bson->bson_type_data; if (data->binary.is_legacy) { if (!data->binary.has_binary) { _bson_json_read_set_error(reader, "Missing \"$binary\" after \"$type\" reading type \"binary\""); return; } else if (!data->binary.has_subtype) { _bson_json_read_set_error(reader, "Missing \"$type\" after \"$binary\" reading type \"binary\""); return; } } else { if (!data->binary.has_binary) { _bson_json_read_set_error(reader, "Missing \"base64\" after \"subType\" reading type \"binary\""); return; } else if (!data->binary.has_subtype) { _bson_json_read_set_error(reader, "Missing \"subType\" after \"base64\" reading type \"binary\""); return; } } if (!bson_append_binary(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, data->binary.type, bson->bson_type_buf[0].buf, (uint32_t)bson->bson_type_buf[0].len)) { _bson_json_read_set_error(reader, "Error storing binary data"); } } static void _bson_json_read_append_regex(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_bson_data_t *data = &bson->bson_type_data; if (data->regex.is_legacy) { if (!data->regex.has_pattern) { _bson_json_read_set_error(reader, "Missing \"$regex\" after \"$options\""); return; } } else if (!data->regex.has_pattern) { _bson_json_read_set_error(reader, "Missing \"pattern\" after \"options\" in regular expression"); return; } else if (!data->regex.has_options) { _bson_json_read_set_error(reader, "Missing \"options\" after \"pattern\" in regular expression"); return; } if (!bson_append_regex(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, (char *)bson->bson_type_buf[0].buf, (char *)bson->bson_type_buf[1].buf)) { _bson_json_read_set_error(reader, "Error storing regex"); } } static void _bson_json_read_append_code(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_json_code_t *code_data; char *code = NULL; bson_t *scope = NULL; bool r; code_data = &bson->code_data; BSON_ASSERT(!code_data->in_scope); if (!code_data->has_code) { _bson_json_read_set_error(reader, "Missing $code after $scope"); return; } code = (char *)code_data->code_buf.buf; if (code_data->has_scope) { scope = STACK_BSON(1); } /* creates BSON "code" elem, or "code with scope" if scope is not NULL */ r = bson_append_code_with_scope( STACK_BSON_CHILD, (const char *)code_data->key_buf.buf, (int)code_data->key_buf.len, code, scope); if (!r) { _bson_json_read_set_error(reader, "Error storing Javascript code"); } /* keep the buffer but truncate it */ code_data->key_buf.len = 0; code_data->has_code = code_data->has_scope = false; } static void _bson_json_read_append_dbpointer(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { bson_t *db_pointer; bson_iter_t iter; const char *ns = NULL; const bson_oid_t *oid = NULL; bool r; BSON_ASSERT(reader->bson.dbpointer_key.buf); db_pointer = STACK_BSON(1); if (!bson_iter_init(&iter, db_pointer)) { _bson_json_read_set_error(reader, "Error storing DBPointer"); return; } while (bson_iter_next(&iter)) { if (!strcmp(bson_iter_key(&iter), "$id")) { if (!BSON_ITER_HOLDS_OID(&iter)) { _bson_json_read_set_error(reader, "$dbPointer.$id must be like {\"$oid\": ...\"}"); return; } oid = bson_iter_oid(&iter); } else if (!strcmp(bson_iter_key(&iter), "$ref")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _bson_json_read_set_error(reader, "$dbPointer.$ref must be a string like \"db.collection\""); return; } ns = bson_iter_utf8(&iter, NULL); } else { _bson_json_read_set_error(reader, "$dbPointer contains invalid key: \"%s\"", bson_iter_key(&iter)); return; } } if (!oid || !ns) { _bson_json_read_set_error(reader, "$dbPointer requires both $id and $ref"); return; } r = bson_append_dbpointer( STACK_BSON_CHILD, (char *)reader->bson.dbpointer_key.buf, (int)reader->bson.dbpointer_key.len, ns, oid); if (!r) { _bson_json_read_set_error(reader, "Error storing DBPointer"); } } static void _bson_json_read_append_oid(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson_append_oid(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, &bson->bson_type_data.oid.oid)) { _bson_json_read_set_error(reader, "Error storing ObjectId"); } } static void _bson_json_read_append_date_time(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson_append_date_time(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, bson->bson_type_data.date.date)) { _bson_json_read_set_error(reader, "Error storing datetime"); } } static void _bson_json_read_append_timestamp(bson_json_reader_t *reader, /* IN */ bson_json_reader_bson_t *bson) /* IN */ { if (!bson->bson_type_data.timestamp.has_t) { _bson_json_read_set_error(reader, "Missing t after $timestamp in BSON_TYPE_TIMESTAMP"); return; } else if (!bson->bson_type_data.timestamp.has_i) { _bson_json_read_set_error(reader, "Missing i after $timestamp in BSON_TYPE_TIMESTAMP"); return; } bson_append_timestamp(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, bson->bson_type_data.timestamp.t, bson->bson_type_data.timestamp.i); } static void _bad_extended_json(bson_json_reader_t *reader) { _bson_json_read_corrupt(reader, "Invalid MongoDB extended JSON"); } static void _bson_json_read_end_map(bson_json_reader_t *reader) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; bool r = true; if (bson->read_state == BSON_JSON_IN_START_MAP) { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_DOC( bson_append_document_begin(STACK_BSON_PARENT, bson->key, (int)bson->key_buf.len, STACK_BSON_CHILD)); } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_SCOPE_STARTMAP) { bson->read_state = BSON_JSON_REGULAR; STACK_PUSH_SCOPE; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP) { /* we've read last "}" in "{$dbPointer: {$id: ..., $ref: ...}}" */ _bson_json_read_append_dbpointer(reader, bson); bson->read_state = BSON_JSON_REGULAR; return; } if (bson->read_state == BSON_JSON_IN_BSON_TYPE) { if (!bson->key) { /* invalid, like {$numberLong: "1"} at the document top level */ _bad_extended_json(reader); return; } bson->read_state = BSON_JSON_REGULAR; switch (bson->bson_type) { case BSON_TYPE_REGEX: _bson_json_read_append_regex(reader, bson); break; case BSON_TYPE_CODE: case BSON_TYPE_CODEWSCOPE: /* we've read the closing "}" in "{$code: ..., $scope: ...}" */ _bson_json_read_append_code(reader, bson); break; case BSON_TYPE_OID: _bson_json_read_append_oid(reader, bson); break; case BSON_TYPE_BINARY: _bson_json_read_append_binary(reader, bson); break; case BSON_TYPE_DATE_TIME: _bson_json_read_append_date_time(reader, bson); break; case BSON_TYPE_UNDEFINED: r = bson_append_undefined(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len); break; case BSON_TYPE_MINKEY: r = bson_append_minkey(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len); break; case BSON_TYPE_MAXKEY: r = bson_append_maxkey(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len); break; case BSON_TYPE_INT32: r = bson_append_int32(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, bson->bson_type_data.v_int32.value); break; case BSON_TYPE_INT64: r = bson_append_int64(STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, bson->bson_type_data.v_int64.value); break; case BSON_TYPE_DOUBLE: r = bson_append_double( STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, bson->bson_type_data.v_double.value); break; case BSON_TYPE_DECIMAL128: r = bson_append_decimal128( STACK_BSON_CHILD, bson->key, (int)bson->key_buf.len, &bson->bson_type_data.v_decimal128.value); break; case BSON_TYPE_DBPOINTER: /* shouldn't set type to DBPointer unless inside $dbPointer: {...} */ _bson_json_read_set_error(reader, "Internal error: shouldn't be in state BSON_TYPE_DBPOINTER"); break; case BSON_TYPE_SYMBOL: break; case BSON_TYPE_EOD: case BSON_TYPE_UTF8: case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: case BSON_TYPE_BOOL: case BSON_TYPE_NULL: case BSON_TYPE_TIMESTAMP: default: _bson_json_read_set_error( reader, "Internal error: can't parse JSON wrapper for type \"%s\"", _bson_json_type_name(bson->bson_type)); break; } if (!r) { _bson_json_read_set_error(reader, "Cannot append value at end of JSON object for key %s", bson->key); } } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_VALUES) { if (!bson->key) { _bad_extended_json(reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_TIMESTAMP_ENDMAP; _bson_json_read_append_timestamp(reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_VALUES) { if (!bson->key) { _bad_extended_json(reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_REGEX_ENDMAP; _bson_json_read_append_regex(reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_VALUES) { if (!bson->key) { _bad_extended_json(reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_BINARY_ENDMAP; _bson_json_read_append_binary(reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_TIMESTAMP_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_REGEX_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_BINARY_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_NUMBERLONG) { if (!bson->key) { _bad_extended_json(reader); return; } bson->read_state = BSON_JSON_IN_BSON_TYPE_DATE_ENDMAP; _bson_json_read_append_date_time(reader, bson); return; } else if (bson->read_state == BSON_JSON_IN_BSON_TYPE_DATE_ENDMAP) { bson->read_state = BSON_JSON_REGULAR; } else if (bson->read_state == BSON_JSON_REGULAR) { if (STACK_IS_SCOPE) { bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = BSON_TYPE_CODE; STACK_POP_SCOPE; } else if (STACK_IS_DBPOINTER) { bson->read_state = BSON_JSON_IN_BSON_TYPE_DBPOINTER_STARTMAP; STACK_POP_DBPOINTER; } else { STACK_POP_DOC(bson_append_document_end(STACK_BSON_PARENT, STACK_BSON_CHILD)); } if (bson->n == -1) { bson->read_state = BSON_JSON_DONE; } } else if (bson->read_state == BSON_JSON_IN_SCOPE) { /* empty $scope */ BSON_ASSERT(bson->code_data.has_scope); STACK_PUSH_SCOPE; STACK_POP_SCOPE; bson->read_state = BSON_JSON_IN_BSON_TYPE; bson->bson_type = BSON_TYPE_CODE; } else if (bson->read_state == BSON_JSON_IN_DBPOINTER) { /* empty $dbPointer??? */ _bson_json_read_set_error(reader, "Empty $dbPointer"); } else { _bson_json_read_set_error(reader, "Invalid state \"%s\"", read_state_names[bson->read_state]); } } static void _bson_json_read_start_array(bson_json_reader_t *reader) /* IN */ { const char *key; size_t len; bson_json_reader_bson_t *bson = &reader->bson; if (bson->read_state != BSON_JSON_REGULAR) { _bson_json_read_set_error(reader, "Invalid read of \"[\" in state \"%s\"", read_state_names[bson->read_state]); return; } if (bson->n == -1) { STACK_PUSH_ARRAY(_noop()); } else { _bson_json_read_fixup_key(bson); key = bson->key; len = bson->key_buf.len; STACK_PUSH_ARRAY(bson_append_array_begin(STACK_BSON_PARENT, key, (int)len, STACK_BSON_CHILD)); } } static void _bson_json_read_end_array(bson_json_reader_t *reader) /* IN */ { bson_json_reader_bson_t *bson = &reader->bson; if (bson->read_state != BSON_JSON_REGULAR) { _bson_json_read_set_error(reader, "Invalid read of \"]\" in state \"%s\"", read_state_names[bson->read_state]); return; } STACK_POP_ARRAY(bson_append_array_end(STACK_BSON_PARENT, STACK_BSON_CHILD)); if (bson->n == -1) { bson->read_state = BSON_JSON_DONE; } } /* put unescaped text in reader->bson.unescaped, or set reader->error. * json_text has length len and it is not null-terminated. */ static bool _bson_json_unescape(bson_json_reader_t *reader, struct jsonsl_state_st *state, const char *json_text, ssize_t len) { bson_json_reader_bson_t *reader_bson; jsonsl_error_t err; reader_bson = &reader->bson; /* add 1 for NULL */ _bson_json_buf_ensure(&reader_bson->unescaped, (size_t)len + 1); /* length of unescaped str is always <= len */ reader_bson->unescaped.len = jsonsl_util_unescape(json_text, (char *)reader_bson->unescaped.buf, (size_t)len, NULL, &err); if (err != JSONSL_ERROR_SUCCESS) { bson_set_error(reader->error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "error near position %d: \"%s\"", (int)state->pos_begin, jsonsl_strerror(err)); return false; } reader_bson->unescaped.buf[reader_bson->unescaped.len] = '\0'; return true; } /* read the buffered JSON plus new data, and fill out @len with its length */ static const char * _get_json_text(jsonsl_t json, /* IN */ struct jsonsl_state_st *state, /* IN */ const char *buf /* IN */, ssize_t *len /* OUT */) { bson_json_reader_t *reader; ssize_t bytes_available; reader = (bson_json_reader_t *)json->data; BSON_ASSERT(state->pos_cur > state->pos_begin); *len = (ssize_t)(state->pos_cur - state->pos_begin); bytes_available = buf - json->base; if (*len <= bytes_available) { /* read directly from stream, not from saved JSON */ return buf - (size_t)*len; } else { /* combine saved text with new data from the jsonsl_t */ ssize_t append = buf - json->base; if (append > 0) { _bson_json_buf_append(&reader->tok_accumulator, buf - append, (size_t)append); } return (const char *)reader->tok_accumulator.buf; } } static void _push_callback(jsonsl_t json, jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf) { bson_json_reader_t *reader = (bson_json_reader_t *)json->data; BSON_UNUSED(action); BSON_UNUSED(buf); switch (state->type) { case JSONSL_T_STRING: case JSONSL_T_HKEY: case JSONSL_T_SPECIAL: case JSONSL_T_UESCAPE: reader->json_text_pos = state->pos_begin; break; case JSONSL_T_OBJECT: _bson_json_read_start_map(reader); break; case JSONSL_T_LIST: _bson_json_read_start_array(reader); break; default: break; } } static void _pop_callback(jsonsl_t json, jsonsl_action_t action, struct jsonsl_state_st *state, const char *buf) { bson_json_reader_t *reader; bson_json_reader_bson_t *reader_bson; ssize_t len; double d; const char *obj_text; BSON_UNUSED(action); reader = (bson_json_reader_t *)json->data; reader_bson = &reader->bson; switch (state->type) { case JSONSL_T_HKEY: case JSONSL_T_STRING: obj_text = _get_json_text(json, state, buf, &len); BSON_ASSERT(obj_text[0] == '"'); /* remove start/end quotes, replace backslash-escapes, null-terminate */ /* you'd think it would be faster to check if state->nescapes > 0 first, * but tests show no improvement */ if (!_bson_json_unescape(reader, state, obj_text + 1, len - 1)) { /* reader->error is set */ jsonsl_stop(json); break; } if (state->type == JSONSL_T_HKEY) { _bson_json_read_map_key(reader, reader_bson->unescaped.buf, reader_bson->unescaped.len); } else { _bson_json_read_string(reader, reader_bson->unescaped.buf, reader_bson->unescaped.len); } break; case JSONSL_T_OBJECT: _bson_json_read_end_map(reader); break; case JSONSL_T_LIST: _bson_json_read_end_array(reader); break; case JSONSL_T_SPECIAL: obj_text = _get_json_text(json, state, buf, &len); if (state->special_flags & JSONSL_SPECIALf_NUMNOINT) { if (_bson_json_parse_double(reader, obj_text, (size_t)len, &d)) { _bson_json_read_double(reader, d); } } else if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { /* jsonsl puts the unsigned value in state->nelem */ _bson_json_read_integer(reader, state->nelem, state->special_flags & JSONSL_SPECIALf_SIGNED ? -1 : 1); } else if (state->special_flags & JSONSL_SPECIALf_BOOLEAN) { _bson_json_read_boolean(reader, obj_text[0] == 't' ? 1 : 0); } else if (state->special_flags & JSONSL_SPECIALf_NULL) { _bson_json_read_null(reader); } break; default: break; } reader->json_text_pos = -1; reader->tok_accumulator.len = 0; } static int _error_callback(jsonsl_t json, jsonsl_error_t err, struct jsonsl_state_st *state, char *errat) { bson_json_reader_t *reader = (bson_json_reader_t *)json->data; BSON_UNUSED(state); if (err == JSONSL_ERROR_CANT_INSERT && *errat == '{') { /* start the next document */ reader->should_reset = true; reader->advance = errat - json->base; return 0; } bson_set_error(reader->error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at \"%c\", position %d: \"%s\"", *errat, (int)json->pos, jsonsl_strerror(err)); return 0; } /* *-------------------------------------------------------------------------- * * bson_json_reader_read -- * * Read the next json document from @reader and write its value * into @bson. @bson will be allocated as part of this process. * * @bson MUST be initialized before calling this function as it * will not be initialized automatically. The reasoning for this * is so that you can chain together bson_json_reader_t with * other components like bson_writer_t. * * Returns: * 1 if successful and data was read. * 0 if successful and no data was read. * -1 if there was an error and @error is set. * * Side effects: * @error may be set. * *-------------------------------------------------------------------------- */ int bson_json_reader_read(bson_json_reader_t *reader, /* IN */ bson_t *bson, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_producer_t *p; ssize_t start_pos; ssize_t r; ssize_t buf_offset; ssize_t accum; bson_error_t error_tmp; int ret = 0; BSON_ASSERT(reader); BSON_ASSERT(bson); p = &reader->producer; reader->bson.bson = bson; reader->bson.n = -1; reader->bson.read_state = BSON_JSON_REGULAR; reader->error = error ? error : &error_tmp; memset(reader->error, 0, sizeof(bson_error_t)); for (;;) { start_pos = reader->json->pos; if (p->bytes_read > 0) { /* leftover data from previous JSON doc in the stream */ r = p->bytes_read; } else { /* read a chunk of bytes by executing the callback */ r = p->cb(p->data, p->buf, p->buf_size); } if (r < 0) { if (error) { bson_set_error(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CB_FAILURE, "reader cb failed"); } ret = -1; goto cleanup; } else if (r == 0) { break; } else { ret = 1; p->bytes_read = (size_t)r; jsonsl_feed(reader->json, (const jsonsl_char_t *)p->buf, (size_t)r); if (reader->should_reset) { /* end of a document */ jsonsl_reset(reader->json); reader->should_reset = false; /* advance past already-parsed data */ memmove(p->buf, p->buf + reader->advance, r - reader->advance); p->bytes_read -= reader->advance; ret = 1; goto cleanup; } if (reader->error->domain) { ret = -1; goto cleanup; } /* accumulate a key or string value */ if (reader->json_text_pos != -1) { if (mlib_cmp(reader->json_text_pos, <, reader->json->pos)) { BSON_ASSERT(mlib_in_range(ssize_t, reader->json->pos)); accum = BSON_MIN((ssize_t)reader->json->pos - reader->json_text_pos, r); /* if this chunk stopped mid-token, buf_offset is how far into * our current chunk the token begins. */ buf_offset = AT_LEAST_0(reader->json_text_pos - start_pos); _bson_json_buf_append(&reader->tok_accumulator, p->buf + buf_offset, (size_t)accum); } } p->bytes_read = 0; } } cleanup: if (ret == 1 && reader->bson.read_state != BSON_JSON_DONE) { /* data ended in the middle */ _bson_json_read_corrupt(reader, "%s", "Incomplete JSON"); return -1; } return ret; } bson_json_reader_t * bson_json_reader_new(void *data, /* IN */ bson_json_reader_cb cb, /* IN */ bson_json_destroy_cb dcb, /* IN */ bool allow_multiple, /* unused */ size_t buf_size) /* IN */ { bson_json_reader_t *r; bson_json_reader_producer_t *p; BSON_UNUSED(allow_multiple); r = BSON_ALIGNED_ALLOC0(bson_json_reader_t); r->json = jsonsl_new(STACK_MAX); r->json->error_callback = _error_callback; r->json->action_callback_PUSH = _push_callback; r->json->action_callback_POP = _pop_callback; r->json->data = r; r->json_text_pos = -1; jsonsl_enable_all_callbacks(r->json); p = &r->producer; p->data = data; p->cb = cb; p->dcb = dcb; p->buf_size = buf_size ? buf_size : BSON_JSON_DEFAULT_BUF_SIZE; p->buf = bson_malloc(p->buf_size); return r; } void bson_json_reader_destroy(bson_json_reader_t *reader) /* IN */ { int i; bson_json_reader_producer_t *p; bson_json_reader_bson_t *b; if (!reader) { return; } p = &reader->producer; b = &reader->bson; if (reader->producer.dcb) { reader->producer.dcb(reader->producer.data); } bson_free(p->buf); bson_free(b->key_buf.buf); bson_free(b->unescaped.buf); bson_free(b->dbpointer_key.buf); /* destroy each bson_t initialized in parser stack frames */ for (i = 1; i < STACK_MAX; i++) { if (b->stack[i].type == BSON_JSON_FRAME_INITIAL) { /* highest the stack grew */ break; } if (FRAME_TYPE_HAS_BSON(b->stack[i].type)) { bson_destroy(&b->stack[i].bson); } } for (i = 0; i < 3; i++) { bson_free(b->bson_type_buf[i].buf); } _bson_json_code_cleanup(&b->code_data); jsonsl_destroy(reader->json); bson_free(reader->tok_accumulator.buf); bson_free(reader); } void bson_json_opts_set_outermost_array(bson_json_opts_t *opts, bool is_outermost_array) { opts->is_outermost_array = is_outermost_array; } typedef struct { const uint8_t *data; size_t len; size_t bytes_parsed; } bson_json_data_reader_t; static ssize_t _bson_json_data_reader_cb(void *_ctx, uint8_t *buf, size_t len) { size_t bytes; bson_json_data_reader_t *ctx = (bson_json_data_reader_t *)_ctx; if (!ctx->data) { return -1; } bytes = BSON_MIN(len, ctx->len - ctx->bytes_parsed); memcpy(buf, ctx->data + ctx->bytes_parsed, bytes); ctx->bytes_parsed += bytes; return bytes; } bson_json_reader_t * bson_json_data_reader_new(bool allow_multiple, /* IN */ size_t size) /* IN */ { bson_json_data_reader_t *dr = bson_malloc0(sizeof *dr); return bson_json_reader_new(dr, &_bson_json_data_reader_cb, &bson_free, allow_multiple, size); } void bson_json_data_reader_ingest(bson_json_reader_t *reader, /* IN */ const uint8_t *data, /* IN */ size_t len) /* IN */ { bson_json_data_reader_t *ctx = (bson_json_data_reader_t *)reader->producer.data; ctx->data = data; ctx->len = len; ctx->bytes_parsed = 0; } bson_t * bson_new_from_json(const uint8_t *data, /* IN */ ssize_t len, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_t *reader; bson_t *bson; int r; BSON_ASSERT(data); if (len < 0) { len = (ssize_t)strlen((const char *)data); } bson = bson_new(); reader = bson_json_data_reader_new(false, BSON_JSON_DEFAULT_BUF_SIZE); bson_json_data_reader_ingest(reader, data, len); r = bson_json_reader_read(reader, bson, error); bson_json_reader_destroy(reader); if (r == 0) { bson_set_error(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } if (r != 1) { bson_destroy(bson); return NULL; } return bson; } bool bson_init_from_json(bson_t *bson, /* OUT */ const char *data, /* IN */ ssize_t len, /* IN */ bson_error_t *error) /* OUT */ { bson_json_reader_t *reader; int r; BSON_ASSERT(bson); BSON_ASSERT(data); if (len < 0) { len = strlen(data); } bson_init(bson); reader = bson_json_data_reader_new(false, BSON_JSON_DEFAULT_BUF_SIZE); bson_json_data_reader_ingest(reader, (const uint8_t *)data, len); r = bson_json_reader_read(reader, bson, error); bson_json_reader_destroy(reader); if (r == 0) { bson_set_error(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } if (r != 1) { bson_destroy(bson); return false; } return true; } static void _bson_json_reader_handle_fd_destroy(void *handle) /* IN */ { bson_json_reader_handle_fd_t *fd = handle; if (fd) { if ((fd->fd != -1) && fd->do_close) { #ifdef _WIN32 _close(fd->fd); #else close(fd->fd); #endif } bson_free(fd); } } static ssize_t _bson_json_reader_handle_fd_read(void *handle, /* IN */ uint8_t *buf, /* IN */ size_t len) /* IN */ { bson_json_reader_handle_fd_t *fd = handle; ssize_t ret = -1; if (fd && (fd->fd != -1)) { again: #ifdef BSON_OS_WIN32 ret = _read(fd->fd, buf, (unsigned int)len); #else ret = read(fd->fd, buf, len); #endif if ((ret == -1) && (errno == EAGAIN)) { goto again; } } return ret; } bson_json_reader_t * bson_json_reader_new_from_fd(int fd, /* IN */ bool close_on_destroy) /* IN */ { bson_json_reader_handle_fd_t *handle; BSON_ASSERT(fd != -1); handle = bson_malloc0(sizeof *handle); handle->fd = fd; handle->do_close = close_on_destroy; return bson_json_reader_new( handle, _bson_json_reader_handle_fd_read, _bson_json_reader_handle_fd_destroy, true, BSON_JSON_DEFAULT_BUF_SIZE); } bson_json_reader_t * bson_json_reader_new_from_file(const char *path, /* IN */ bson_error_t *error) /* OUT */ { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg; int fd = -1; BSON_ASSERT(path); #ifdef BSON_OS_WIN32 _sopen_s(&fd, path, (_O_RDONLY | _O_BINARY), _SH_DENYNO, _S_IREAD); #else fd = open(path, O_RDONLY); #endif if (fd == -1) { errmsg = bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf); bson_set_error(error, BSON_ERROR_READER, BSON_ERROR_READER_BADFD, "%s", errmsg); return NULL; } return bson_json_reader_new_from_fd(fd, true); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-json.h000066400000000000000000000047261511661753600224200ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_JSON_H #define BSON_JSON_H #include BSON_BEGIN_DECLS typedef struct _bson_json_reader_t bson_json_reader_t; typedef enum { BSON_JSON_ERROR_READ_CORRUPT_JS = 1, BSON_JSON_ERROR_READ_INVALID_PARAM, BSON_JSON_ERROR_READ_CB_FAILURE, } bson_json_error_code_t; /** * BSON_MAX_LEN_UNLIMITED * * Denotes unlimited length limit when converting BSON to JSON. */ #define BSON_MAX_LEN_UNLIMITED -1 /** * bson_json_mode_t: * * This enumeration contains the different modes to serialize BSON into extended * JSON. */ typedef enum { BSON_JSON_MODE_LEGACY, BSON_JSON_MODE_CANONICAL, BSON_JSON_MODE_RELAXED, } bson_json_mode_t; BSON_EXPORT(bson_json_opts_t *) bson_json_opts_new(bson_json_mode_t mode, int32_t max_len); BSON_EXPORT(void) bson_json_opts_destroy(bson_json_opts_t *opts); BSON_EXPORT(void) bson_json_opts_set_outermost_array(bson_json_opts_t *opts, bool is_outermost_array); typedef ssize_t(BSON_CALL *bson_json_reader_cb)(void *handle, uint8_t *buf, size_t count); typedef void(BSON_CALL *bson_json_destroy_cb)(void *handle); BSON_EXPORT(bson_json_reader_t *) bson_json_reader_new( void *data, bson_json_reader_cb cb, bson_json_destroy_cb dcb, bool allow_multiple, size_t buf_size); BSON_EXPORT(bson_json_reader_t *) bson_json_reader_new_from_fd(int fd, bool close_on_destroy); BSON_EXPORT(bson_json_reader_t *) bson_json_reader_new_from_file(const char *filename, bson_error_t *error); BSON_EXPORT(void) bson_json_reader_destroy(bson_json_reader_t *reader); BSON_EXPORT(int) bson_json_reader_read(bson_json_reader_t *reader, bson_t *bson, bson_error_t *error); BSON_EXPORT(bson_json_reader_t *) bson_json_data_reader_new(bool allow_multiple, size_t size); BSON_EXPORT(void) bson_json_data_reader_ingest(bson_json_reader_t *reader, const uint8_t *data, size_t len); BSON_END_DECLS #endif /* BSON_JSON_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-keys.c000066400000000000000000000230031511661753600224020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include static const char *gUint32Strs[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124", "125", "126", "127", "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142", "143", "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159", "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175", "176", "177", "178", "179", "180", "181", "182", "183", "184", "185", "186", "187", "188", "189", "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "200", "201", "202", "203", "204", "205", "206", "207", "208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221", "222", "223", "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", "254", "255", "256", "257", "258", "259", "260", "261", "262", "263", "264", "265", "266", "267", "268", "269", "270", "271", "272", "273", "274", "275", "276", "277", "278", "279", "280", "281", "282", "283", "284", "285", "286", "287", "288", "289", "290", "291", "292", "293", "294", "295", "296", "297", "298", "299", "300", "301", "302", "303", "304", "305", "306", "307", "308", "309", "310", "311", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "322", "323", "324", "325", "326", "327", "328", "329", "330", "331", "332", "333", "334", "335", "336", "337", "338", "339", "340", "341", "342", "343", "344", "345", "346", "347", "348", "349", "350", "351", "352", "353", "354", "355", "356", "357", "358", "359", "360", "361", "362", "363", "364", "365", "366", "367", "368", "369", "370", "371", "372", "373", "374", "375", "376", "377", "378", "379", "380", "381", "382", "383", "384", "385", "386", "387", "388", "389", "390", "391", "392", "393", "394", "395", "396", "397", "398", "399", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "418", "419", "420", "421", "422", "423", "424", "425", "426", "427", "428", "429", "430", "431", "432", "433", "434", "435", "436", "437", "438", "439", "440", "441", "442", "443", "444", "445", "446", "447", "448", "449", "450", "451", "452", "453", "454", "455", "456", "457", "458", "459", "460", "461", "462", "463", "464", "465", "466", "467", "468", "469", "470", "471", "472", "473", "474", "475", "476", "477", "478", "479", "480", "481", "482", "483", "484", "485", "486", "487", "488", "489", "490", "491", "492", "493", "494", "495", "496", "497", "498", "499", "500", "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520", "521", "522", "523", "524", "525", "526", "527", "528", "529", "530", "531", "532", "533", "534", "535", "536", "537", "538", "539", "540", "541", "542", "543", "544", "545", "546", "547", "548", "549", "550", "551", "552", "553", "554", "555", "556", "557", "558", "559", "560", "561", "562", "563", "564", "565", "566", "567", "568", "569", "570", "571", "572", "573", "574", "575", "576", "577", "578", "579", "580", "581", "582", "583", "584", "585", "586", "587", "588", "589", "590", "591", "592", "593", "594", "595", "596", "597", "598", "599", "600", "601", "602", "603", "604", "605", "606", "607", "608", "609", "610", "611", "612", "613", "614", "615", "616", "617", "618", "619", "620", "621", "622", "623", "624", "625", "626", "627", "628", "629", "630", "631", "632", "633", "634", "635", "636", "637", "638", "639", "640", "641", "642", "643", "644", "645", "646", "647", "648", "649", "650", "651", "652", "653", "654", "655", "656", "657", "658", "659", "660", "661", "662", "663", "664", "665", "666", "667", "668", "669", "670", "671", "672", "673", "674", "675", "676", "677", "678", "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", "689", "690", "691", "692", "693", "694", "695", "696", "697", "698", "699", "700", "701", "702", "703", "704", "705", "706", "707", "708", "709", "710", "711", "712", "713", "714", "715", "716", "717", "718", "719", "720", "721", "722", "723", "724", "725", "726", "727", "728", "729", "730", "731", "732", "733", "734", "735", "736", "737", "738", "739", "740", "741", "742", "743", "744", "745", "746", "747", "748", "749", "750", "751", "752", "753", "754", "755", "756", "757", "758", "759", "760", "761", "762", "763", "764", "765", "766", "767", "768", "769", "770", "771", "772", "773", "774", "775", "776", "777", "778", "779", "780", "781", "782", "783", "784", "785", "786", "787", "788", "789", "790", "791", "792", "793", "794", "795", "796", "797", "798", "799", "800", "801", "802", "803", "804", "805", "806", "807", "808", "809", "810", "811", "812", "813", "814", "815", "816", "817", "818", "819", "820", "821", "822", "823", "824", "825", "826", "827", "828", "829", "830", "831", "832", "833", "834", "835", "836", "837", "838", "839", "840", "841", "842", "843", "844", "845", "846", "847", "848", "849", "850", "851", "852", "853", "854", "855", "856", "857", "858", "859", "860", "861", "862", "863", "864", "865", "866", "867", "868", "869", "870", "871", "872", "873", "874", "875", "876", "877", "878", "879", "880", "881", "882", "883", "884", "885", "886", "887", "888", "889", "890", "891", "892", "893", "894", "895", "896", "897", "898", "899", "900", "901", "902", "903", "904", "905", "906", "907", "908", "909", "910", "911", "912", "913", "914", "915", "916", "917", "918", "919", "920", "921", "922", "923", "924", "925", "926", "927", "928", "929", "930", "931", "932", "933", "934", "935", "936", "937", "938", "939", "940", "941", "942", "943", "944", "945", "946", "947", "948", "949", "950", "951", "952", "953", "954", "955", "956", "957", "958", "959", "960", "961", "962", "963", "964", "965", "966", "967", "968", "969", "970", "971", "972", "973", "974", "975", "976", "977", "978", "979", "980", "981", "982", "983", "984", "985", "986", "987", "988", "989", "990", "991", "992", "993", "994", "995", "996", "997", "998", "999"}; /* *-------------------------------------------------------------------------- * * bson_uint32_to_string -- * * Converts @value to a string. * * If @value is from 0 to 1000, it will use a constant string in the * data section of the library. * * If not, a string will be formatted using @str and snprintf(). This * is much slower, of course and therefore we try to optimize it out. * * @strptr will always be set. It will either point to @str or a * constant string. You will want to use this as your key. * * Parameters: * @value: A #uint32_t to convert to string. * @strptr: (out): A pointer to the resulting string. * @str: (out): Storage for a string made with snprintf. * @size: Size of @str. * * Returns: * The number of bytes in the resulting string excluding the NULL * terminator. If the output requires more than @size bytes, then @size * bytes are written and the result is the number of bytes required * (excluding the NULL terminator) * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_uint32_to_string(uint32_t value, /* IN */ const char **strptr, /* OUT */ char *str, /* OUT */ size_t size) /* IN */ { if (value < 1000) { *strptr = gUint32Strs[value]; if (value < 10) { return 1; } else if (value < 100) { return 2; } else { return 3; } } *strptr = str; int ret = bson_snprintf(str, size, "%u", value); // Truncation is OK. BSON_ASSERT(ret > 0); BSON_ASSERT(mlib_in_range(size_t, ret)); return (size_t)ret; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-keys.h000066400000000000000000000016061511661753600224140ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_KEYS_H #define BSON_KEYS_H #include #include BSON_BEGIN_DECLS BSON_EXPORT(size_t) bson_uint32_to_string(uint32_t value, const char **strptr, char *str, size_t size); BSON_END_DECLS #endif /* BSON_KEYS_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-oid.c000066400000000000000000000214131511661753600222050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include /* * This table contains an array of two character pairs for every possible * uint8_t. It is used as a lookup table when encoding a bson_oid_t * to hex formatted ASCII. Performing two characters at a time roughly * reduces the number of operations by one-half. */ BSON_MAYBE_UNUSED static const uint16_t gHexCharPairs[] = { #if BSON_BYTE_ORDER == BSON_BIG_ENDIAN 12336, 12337, 12338, 12339, 12340, 12341, 12342, 12343, 12344, 12345, 12385, 12386, 12387, 12388, 12389, 12390, 12592, 12593, 12594, 12595, 12596, 12597, 12598, 12599, 12600, 12601, 12641, 12642, 12643, 12644, 12645, 12646, 12848, 12849, 12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12897, 12898, 12899, 12900, 12901, 12902, 13104, 13105, 13106, 13107, 13108, 13109, 13110, 13111, 13112, 13113, 13153, 13154, 13155, 13156, 13157, 13158, 13360, 13361, 13362, 13363, 13364, 13365, 13366, 13367, 13368, 13369, 13409, 13410, 13411, 13412, 13413, 13414, 13616, 13617, 13618, 13619, 13620, 13621, 13622, 13623, 13624, 13625, 13665, 13666, 13667, 13668, 13669, 13670, 13872, 13873, 13874, 13875, 13876, 13877, 13878, 13879, 13880, 13881, 13921, 13922, 13923, 13924, 13925, 13926, 14128, 14129, 14130, 14131, 14132, 14133, 14134, 14135, 14136, 14137, 14177, 14178, 14179, 14180, 14181, 14182, 14384, 14385, 14386, 14387, 14388, 14389, 14390, 14391, 14392, 14393, 14433, 14434, 14435, 14436, 14437, 14438, 14640, 14641, 14642, 14643, 14644, 14645, 14646, 14647, 14648, 14649, 14689, 14690, 14691, 14692, 14693, 14694, 24880, 24881, 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24929, 24930, 24931, 24932, 24933, 24934, 25136, 25137, 25138, 25139, 25140, 25141, 25142, 25143, 25144, 25145, 25185, 25186, 25187, 25188, 25189, 25190, 25392, 25393, 25394, 25395, 25396, 25397, 25398, 25399, 25400, 25401, 25441, 25442, 25443, 25444, 25445, 25446, 25648, 25649, 25650, 25651, 25652, 25653, 25654, 25655, 25656, 25657, 25697, 25698, 25699, 25700, 25701, 25702, 25904, 25905, 25906, 25907, 25908, 25909, 25910, 25911, 25912, 25913, 25953, 25954, 25955, 25956, 25957, 25958, 26160, 26161, 26162, 26163, 26164, 26165, 26166, 26167, 26168, 26169, 26209, 26210, 26211, 26212, 26213, 26214 #else 12336, 12592, 12848, 13104, 13360, 13616, 13872, 14128, 14384, 14640, 24880, 25136, 25392, 25648, 25904, 26160, 12337, 12593, 12849, 13105, 13361, 13617, 13873, 14129, 14385, 14641, 24881, 25137, 25393, 25649, 25905, 26161, 12338, 12594, 12850, 13106, 13362, 13618, 13874, 14130, 14386, 14642, 24882, 25138, 25394, 25650, 25906, 26162, 12339, 12595, 12851, 13107, 13363, 13619, 13875, 14131, 14387, 14643, 24883, 25139, 25395, 25651, 25907, 26163, 12340, 12596, 12852, 13108, 13364, 13620, 13876, 14132, 14388, 14644, 24884, 25140, 25396, 25652, 25908, 26164, 12341, 12597, 12853, 13109, 13365, 13621, 13877, 14133, 14389, 14645, 24885, 25141, 25397, 25653, 25909, 26165, 12342, 12598, 12854, 13110, 13366, 13622, 13878, 14134, 14390, 14646, 24886, 25142, 25398, 25654, 25910, 26166, 12343, 12599, 12855, 13111, 13367, 13623, 13879, 14135, 14391, 14647, 24887, 25143, 25399, 25655, 25911, 26167, 12344, 12600, 12856, 13112, 13368, 13624, 13880, 14136, 14392, 14648, 24888, 25144, 25400, 25656, 25912, 26168, 12345, 12601, 12857, 13113, 13369, 13625, 13881, 14137, 14393, 14649, 24889, 25145, 25401, 25657, 25913, 26169, 12385, 12641, 12897, 13153, 13409, 13665, 13921, 14177, 14433, 14689, 24929, 25185, 25441, 25697, 25953, 26209, 12386, 12642, 12898, 13154, 13410, 13666, 13922, 14178, 14434, 14690, 24930, 25186, 25442, 25698, 25954, 26210, 12387, 12643, 12899, 13155, 13411, 13667, 13923, 14179, 14435, 14691, 24931, 25187, 25443, 25699, 25955, 26211, 12388, 12644, 12900, 13156, 13412, 13668, 13924, 14180, 14436, 14692, 24932, 25188, 25444, 25700, 25956, 26212, 12389, 12645, 12901, 13157, 13413, 13669, 13925, 14181, 14437, 14693, 24933, 25189, 25445, 25701, 25957, 26213, 12390, 12646, 12902, 13158, 13414, 13670, 13926, 14182, 14438, 14694, 24934, 25190, 25446, 25702, 25958, 26214 #endif }; void bson_oid_init(bson_oid_t *oid, /* OUT */ bson_context_t *context) /* IN */ { BSON_ASSERT(oid); if (!context) { context = bson_context_get_default(); } const time_t now = time(NULL); // Big-endian encode the low 32 bits of the time as the leading 32 bits of the new OID oid->bytes[0] = (uint8_t)(now >> 24); oid->bytes[1] = (uint8_t)(now >> 16); oid->bytes[2] = (uint8_t)(now >> 8); oid->bytes[3] = (uint8_t)(now >> 0); // Add randomness _bson_context_set_oid_rand(context, oid); _bson_context_set_oid_seq32(context, oid); } void bson_oid_init_from_data(bson_oid_t *oid, /* OUT */ const uint8_t *data) /* IN */ { BSON_ASSERT(oid); BSON_ASSERT(data); memcpy(oid, data, 12); } void bson_oid_init_from_string(bson_oid_t *oid, /* OUT */ const char *str) /* IN */ { BSON_ASSERT(oid); BSON_ASSERT(str); bson_oid_init_from_string_unsafe(oid, str); } time_t bson_oid_get_time_t(const bson_oid_t *oid) /* IN */ { BSON_ASSERT(oid); return bson_oid_get_time_t_unsafe(oid); } void bson_oid_to_string(const bson_oid_t *oid, /* IN */ char str[BSON_ENSURE_ARRAY_PARAM_SIZE(25)]) /* OUT */ { #if !defined(__i386__) && !defined(__x86_64__) && !defined(_M_IX86) && !defined(_M_X64) BSON_ASSERT(oid); BSON_ASSERT(str); bson_snprintf(str, 25, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", oid->bytes[0], oid->bytes[1], oid->bytes[2], oid->bytes[3], oid->bytes[4], oid->bytes[5], oid->bytes[6], oid->bytes[7], oid->bytes[8], oid->bytes[9], oid->bytes[10], oid->bytes[11]); #else uint16_t *dst; uint8_t *id = (uint8_t *)oid; BSON_ASSERT(oid); BSON_ASSERT(str); dst = (uint16_t *)(void *)str; dst[0] = gHexCharPairs[id[0]]; dst[1] = gHexCharPairs[id[1]]; dst[2] = gHexCharPairs[id[2]]; dst[3] = gHexCharPairs[id[3]]; dst[4] = gHexCharPairs[id[4]]; dst[5] = gHexCharPairs[id[5]]; dst[6] = gHexCharPairs[id[6]]; dst[7] = gHexCharPairs[id[7]]; dst[8] = gHexCharPairs[id[8]]; dst[9] = gHexCharPairs[id[9]]; dst[10] = gHexCharPairs[id[10]]; dst[11] = gHexCharPairs[id[11]]; str[24] = '\0'; #endif } uint32_t bson_oid_hash(const bson_oid_t *oid) /* IN */ { BSON_ASSERT(oid); return bson_oid_hash_unsafe(oid); } int bson_oid_compare(const bson_oid_t *oid1, /* IN */ const bson_oid_t *oid2) /* IN */ { BSON_ASSERT(oid1); BSON_ASSERT(oid2); return bson_oid_compare_unsafe(oid1, oid2); } bool bson_oid_equal(const bson_oid_t *oid1, /* IN */ const bson_oid_t *oid2) /* IN */ { BSON_ASSERT(oid1); BSON_ASSERT(oid2); return bson_oid_equal_unsafe(oid1, oid2); } void bson_oid_copy(const bson_oid_t *src, /* IN */ bson_oid_t *dst) /* OUT */ { BSON_ASSERT(src); BSON_ASSERT(dst); bson_oid_copy_unsafe(src, dst); } bool bson_oid_is_valid(const char *str, /* IN */ size_t length) /* IN */ { size_t i; BSON_ASSERT(str); if ((length == 25) && (str[24] == '\0')) { length = 24; } if (length == 24) { for (i = 0; i < length; i++) { switch (str[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': break; default: return false; } } return true; } return false; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-oid.h000066400000000000000000000137511511661753600222200ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_OID_H #define BSON_OID_H #include #include #include #include #include BSON_BEGIN_DECLS BSON_EXPORT(int) bson_oid_compare(const bson_oid_t *oid1, const bson_oid_t *oid2); BSON_EXPORT(void) bson_oid_copy(const bson_oid_t *src, bson_oid_t *dst); BSON_EXPORT(bool) bson_oid_equal(const bson_oid_t *oid1, const bson_oid_t *oid2); BSON_EXPORT(bool) bson_oid_is_valid(const char *str, size_t length); BSON_EXPORT(time_t) bson_oid_get_time_t(const bson_oid_t *oid); BSON_EXPORT(uint32_t) bson_oid_hash(const bson_oid_t *oid); BSON_EXPORT(void) bson_oid_init(bson_oid_t *oid, bson_context_t *context); BSON_EXPORT(void) bson_oid_init_from_data(bson_oid_t *oid, const uint8_t *data); BSON_EXPORT(void) bson_oid_init_from_string(bson_oid_t *oid, const char *str); BSON_EXPORT(void) bson_oid_to_string(const bson_oid_t *oid, char str[25]); /** * bson_oid_compare_unsafe: * @oid1: A bson_oid_t. * @oid2: A bson_oid_t. * * Performs a qsort() style comparison between @oid1 and @oid2. * * This function is meant to be as fast as possible and therefore performs * no argument validation. That is the callers responsibility. * * Returns: An integer < 0 if @oid1 is less than @oid2. Zero if they are equal. * An integer > 0 if @oid1 is greater than @oid2. */ static BSON_INLINE int bson_oid_compare_unsafe(const bson_oid_t *oid1, const bson_oid_t *oid2) { return memcmp(oid1, oid2, sizeof *oid1); } /** * bson_oid_equal_unsafe: * @oid1: A bson_oid_t. * @oid2: A bson_oid_t. * * Checks the equality of @oid1 and @oid2. * * This function is meant to be as fast as possible and therefore performs * no checks for argument validity. That is the callers responsibility. * * Returns: true if @oid1 and @oid2 are equal; otherwise false. */ static BSON_INLINE bool bson_oid_equal_unsafe(const bson_oid_t *oid1, const bson_oid_t *oid2) { return !memcmp(oid1, oid2, sizeof *oid1); } /** * bson_oid_hash_unsafe: * @oid: A bson_oid_t. * * This function performs a DJB style hash upon the bytes contained in @oid. * The result is a hash key suitable for use in a hashtable. * * This function is meant to be as fast as possible and therefore performs no * validation of arguments. The caller is responsible to ensure they are * passing valid arguments. * * Returns: A uint32_t containing a hash code. */ static BSON_INLINE uint32_t bson_oid_hash_unsafe(const bson_oid_t *oid) { uint32_t hash = 5381; uint32_t i; for (i = 0; i < sizeof oid->bytes; i++) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN hash = ((hash << 5) + hash) + oid->bytes[i]; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } return hash; } /** * bson_oid_copy_unsafe: * @src: A bson_oid_t to copy from. * @dst: A bson_oid_t to copy into. * * Copies the contents of @src into @dst. This function is meant to be as * fast as possible and therefore performs no argument checking. It is the * callers responsibility to ensure they are passing valid data into the * function. */ static BSON_INLINE void bson_oid_copy_unsafe(const bson_oid_t *src, bson_oid_t *dst) { memcpy(dst, src, sizeof *src); } /** * bson_oid_parse_hex_char: * @hex: A character to parse to its integer value. * * This function contains a jump table to return the integer value for a * character containing a hexadecimal value (0-9, a-f, A-F). If the character * is not a hexadecimal character then zero is returned. * * Returns: An integer between 0 and 15. */ static BSON_INLINE uint8_t bson_oid_parse_hex_char(char hex) { switch (hex) { case '0': return 0; case '1': return 1; case '2': return 2; case '3': return 3; case '4': return 4; case '5': return 5; case '6': return 6; case '7': return 7; case '8': return 8; case '9': return 9; case 'a': case 'A': return 0xa; case 'b': case 'B': return 0xb; case 'c': case 'C': return 0xc; case 'd': case 'D': return 0xd; case 'e': case 'E': return 0xe; case 'f': case 'F': return 0xf; default: return 0; } } /** * bson_oid_init_from_string_unsafe: * @oid: A bson_oid_t to store the result. * @str: A 24-character hexadecimal encoded string. * * Parses a string containing 24 hexadecimal encoded bytes into a bson_oid_t. * This function is meant to be as fast as possible and inlined into your * code. For that purpose, the function does not perform any sort of bounds * checking and it is the callers responsibility to ensure they are passing * valid input to the function. */ static BSON_INLINE void bson_oid_init_from_string_unsafe(bson_oid_t *oid, const char *str) { int i; for (i = 0; i < 12; i++) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN oid->bytes[i] = (uint8_t)((bson_oid_parse_hex_char(str[2 * i]) << 4) | (bson_oid_parse_hex_char(str[2 * i + 1]))); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } } /** * bson_oid_get_time_t_unsafe: * @oid: A bson_oid_t. * * Fetches the time @oid was generated. * * Returns: A time_t containing the UNIX timestamp of generation. */ static BSON_INLINE time_t bson_oid_get_time_t_unsafe(const bson_oid_t *oid) { uint32_t t; memcpy(&t, oid, sizeof(t)); return BSON_UINT32_FROM_BE(t); } BSON_END_DECLS #endif /* BSON_OID_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-prelude.h000066400000000000000000000013211511661753600230730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(BSON_INSIDE) && !defined(BSON_COMPILATION) #error "Only can be included directly." #endif mongo-c-driver-2.2.1/src/libbson/src/bson/bson-reader.c000066400000000000000000000451431511661753600227020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #ifdef BSON_OS_WIN32 #include #include #endif #include #include #include #include #include #include typedef enum { BSON_READER_HANDLE = 1, BSON_READER_DATA = 2, } bson_reader_type_t; typedef struct { bson_reader_type_t type; void *handle; bool done : 1; bool failed : 1; size_t end; size_t len; size_t offset; size_t bytes_read; bson_t inline_bson; uint8_t *data; bson_reader_read_func_t read_func; bson_reader_destroy_func_t destroy_func; } bson_reader_handle_t; typedef struct { int fd; bool do_close; } bson_reader_handle_fd_t; typedef struct { bson_reader_type_t type; const uint8_t *data; size_t length; size_t offset; bson_t inline_bson; } bson_reader_data_t; /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fill_buffer -- * * Attempt to read as much as possible until the underlying buffer * in @reader is filled or we have reached end-of-stream or * read failure. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_fill_buffer(bson_reader_handle_t *reader) /* IN */ { ssize_t ret; /* * Handle first read specially. */ if ((!reader->done) && (!reader->offset) && (!reader->end)) { ret = reader->read_func(reader->handle, &reader->data[0], reader->len); if (ret <= 0) { reader->done = true; return; } reader->bytes_read += ret; reader->end = ret; return; } /* * Move valid data to head. */ memmove(&reader->data[0], &reader->data[reader->offset], reader->end - reader->offset); reader->end = reader->end - reader->offset; reader->offset = 0; /* * Read in data to fill the buffer. */ ret = reader->read_func(reader->handle, &reader->data[reader->end], reader->len - reader->end); if (ret <= 0) { reader->done = true; reader->failed = (ret < 0); } else { reader->bytes_read += ret; reader->end += ret; } BSON_ASSERT(reader->offset == 0); BSON_ASSERT(reader->end <= reader->len); } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_handle -- * * Allocates and initializes a new bson_reader_t using the opaque * handle provided. * * Parameters: * @handle: an opaque handle to use to read data. * @rf: a function to perform reads on @handle. * @df: a function to release @handle, or NULL. * * Returns: * A newly allocated bson_reader_t if successful, otherwise NULL. * Free the successful result with bson_reader_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_handle(void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df) { bson_reader_handle_t *real; BSON_ASSERT(handle); BSON_ASSERT(rf); real = BSON_ALIGNED_ALLOC0(bson_reader_handle_t); real->type = BSON_READER_HANDLE; real->data = bson_malloc0(1024); real->handle = handle; real->len = 1024; real->offset = 0; bson_reader_set_read_func((bson_reader_t *)real, rf); if (df) { bson_reader_set_destroy_func((bson_reader_t *)real, df); } _bson_reader_handle_fill_buffer(real); return (bson_reader_t *)real; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fd_destroy -- * * Cleanup allocations associated with state created in * bson_reader_new_from_fd(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_fd_destroy(void *handle) /* IN */ { bson_reader_handle_fd_t *fd = handle; if (fd) { if ((fd->fd != -1) && fd->do_close) { #ifdef _WIN32 _close(fd->fd); #else close(fd->fd); #endif } bson_free(fd); } } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_fd_read -- * * Perform read on opaque handle created in * bson_reader_new_from_fd(). * * The underlying file descriptor is read from the current position * using the bson_reader_handle_fd_t allocated. * * Returns: * -1 on failure. * 0 on end of stream. * Greater than zero on success. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static ssize_t _bson_reader_handle_fd_read(void *handle, /* IN */ void *buf, /* IN */ size_t len) /* IN */ { bson_reader_handle_fd_t *fd = handle; ssize_t ret = -1; if (fd && (fd->fd != -1)) { again: #ifdef BSON_OS_WIN32 ret = _read(fd->fd, buf, (unsigned int)len); #else ret = read(fd->fd, buf, len); #endif if ((ret == -1) && (errno == EAGAIN)) { goto again; } } return ret; } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_fd -- * * Create a new bson_reader_t using the file-descriptor provided. * * Parameters: * @fd: a libc style file-descriptor. * @close_on_destroy: if close() should be called on @fd when * bson_reader_destroy() is called. * * Returns: * A newly allocated bson_reader_t on success; otherwise NULL. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_fd(int fd, /* IN */ bool close_on_destroy) /* IN */ { bson_reader_handle_fd_t *handle; BSON_ASSERT(fd != -1); handle = bson_malloc0(sizeof *handle); handle->fd = fd; handle->do_close = close_on_destroy; return bson_reader_new_from_handle(handle, _bson_reader_handle_fd_read, _bson_reader_handle_fd_destroy); } /** * bson_reader_set_read_func: * @reader: A bson_reader_t. * * Note that @reader must be initialized by bson_reader_init_from_handle(), or * data * will be destroyed. */ /* *-------------------------------------------------------------------------- * * bson_reader_set_read_func -- * * Set the read func to be provided for @reader. * * You probably want to use bson_reader_new_from_handle() or * bson_reader_new_from_fd() instead. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_set_read_func(bson_reader_t *reader, /* IN */ bson_reader_read_func_t func) /* IN */ { bson_reader_handle_t *real = (bson_reader_handle_t *)reader; BSON_ASSERT(reader->type == BSON_READER_HANDLE); real->read_func = func; } /* *-------------------------------------------------------------------------- * * bson_reader_set_destroy_func -- * * Set the function to cleanup state when @reader is destroyed. * * You probably want bson_reader_new_from_fd() or * bson_reader_new_from_handle() instead. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_set_destroy_func(bson_reader_t *reader, /* IN */ bson_reader_destroy_func_t func) /* IN */ { bson_reader_handle_t *real = (bson_reader_handle_t *)reader; BSON_ASSERT(reader->type == BSON_READER_HANDLE); real->destroy_func = func; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_grow_buffer -- * * Grow the buffer to the next power of two. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _bson_reader_handle_grow_buffer(bson_reader_handle_t *reader) /* IN */ { size_t size; size = reader->len * 2; reader->data = bson_realloc(reader->data, size); reader->len = size; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_tell -- * * Tell the current position within the underlying file-descriptor. * * Returns: * An off_t containing the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static off_t _bson_reader_handle_tell(bson_reader_handle_t *reader) /* IN */ { off_t off; off = (off_t)reader->bytes_read; off -= (off_t)reader->end; off += (off_t)reader->offset; return off; } /* *-------------------------------------------------------------------------- * * _bson_reader_handle_read -- * * Read the next chunk of data from the underlying file descriptor * and return a bson_t which should not be modified. * * There was a failure if NULL is returned and @reached_eof is * not set to true. * * Returns: * NULL on failure or end of stream. * * Side effects: * @reached_eof is set if non-NULL. * *-------------------------------------------------------------------------- */ static const bson_t * _bson_reader_handle_read(bson_reader_handle_t *reader, /* IN */ bool *reached_eof) /* IN */ { if (reached_eof) { *reached_eof = false; } while (!reader->done) { if ((reader->end - reader->offset) < 4) { _bson_reader_handle_fill_buffer(reader); continue; } const int32_t blen = mlib_read_i32le(reader->data + reader->offset); if (blen < 5) { return NULL; } if (blen > (int32_t)(reader->end - reader->offset)) { if (blen > (int32_t)reader->len) { _bson_reader_handle_grow_buffer(reader); } _bson_reader_handle_fill_buffer(reader); continue; } if (!bson_init_static(&reader->inline_bson, &reader->data[reader->offset], (uint32_t)blen)) { return NULL; } reader->offset += blen; return &reader->inline_bson; } if (reached_eof) { *reached_eof = reader->done && !reader->failed; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_data -- * * Allocates and initializes a new bson_reader_t that reads the memory * provided as a stream of BSON documents. * * Parameters: * @data: A buffer to read BSON documents from. * @length: The length of @data. * * Returns: * A newly allocated bson_reader_t that should be freed with * bson_reader_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_data(const uint8_t *data, /* IN */ size_t length) /* IN */ { bson_reader_data_t *real; BSON_ASSERT(data); real = BSON_ALIGNED_ALLOC0(bson_reader_data_t); real->type = BSON_READER_DATA; real->data = data; real->length = length; real->offset = 0; return (bson_reader_t *)real; } /* *-------------------------------------------------------------------------- * * _bson_reader_data_read -- * * Read the next document from the underlying buffer. * * Returns: * NULL on failure or end of stream. * a bson_t which should not be modified. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static const bson_t * _bson_reader_data_read(bson_reader_data_t *reader, /* IN */ bool *reached_eof) /* IN */ { if (reached_eof) { *reached_eof = false; } if ((reader->offset + 4) < reader->length) { const int32_t blen = mlib_read_i32le(reader->data + reader->offset); if (blen < 5) { return NULL; } if (blen > (int32_t)(reader->length - reader->offset)) { return NULL; } if (!bson_init_static(&reader->inline_bson, &reader->data[reader->offset], (uint32_t)blen)) { return NULL; } reader->offset += blen; return &reader->inline_bson; } if (reached_eof) { *reached_eof = (reader->offset == reader->length); } return NULL; } /* *-------------------------------------------------------------------------- * * _bson_reader_data_tell -- * * Tell the current position in the underlying buffer. * * Returns: * An off_t of the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static off_t _bson_reader_data_tell(bson_reader_data_t *reader) /* IN */ { return (off_t)reader->offset; } /* *-------------------------------------------------------------------------- * * bson_reader_destroy -- * * Release a bson_reader_t created with bson_reader_new_from_data(), * bson_reader_new_from_fd(), or bson_reader_new_from_handle(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_reader_destroy(bson_reader_t *reader) /* IN */ { if (!reader) { return; } switch (reader->type) { case 0: break; case BSON_READER_HANDLE: { bson_reader_handle_t *handle = (bson_reader_handle_t *)reader; if (handle->destroy_func) { handle->destroy_func(handle->handle); } bson_free(handle->data); } break; case BSON_READER_DATA: break; default: fprintf(stderr, "No such reader type: %02x\n", reader->type); break; } reader->type = 0; bson_free(reader); } /* *-------------------------------------------------------------------------- * * bson_reader_read -- * * Reads the next bson_t in the underlying memory or storage. The * resulting bson_t should not be modified or freed. You may copy it * and iterate over it. Functions that take a const bson_t* are safe * to use. * * This structure does not survive calls to bson_reader_read() or * bson_reader_destroy() as it uses memory allocated by the reader or * underlying storage/memory. * * If NULL is returned then @reached_eof will be set to true if the * end of the file or buffer was reached. This indicates if there was * an error parsing the document stream. * * Returns: * A const bson_t that should not be modified or freed. * NULL on failure or end of stream. * * Side effects: * @reached_eof is set if non-NULL. * *-------------------------------------------------------------------------- */ const bson_t * bson_reader_read(bson_reader_t *reader, /* IN */ bool *reached_eof) /* OUT */ { BSON_ASSERT(reader); switch (reader->type) { case BSON_READER_HANDLE: return _bson_reader_handle_read((bson_reader_handle_t *)reader, reached_eof); case BSON_READER_DATA: return _bson_reader_data_read((bson_reader_data_t *)reader, reached_eof); default: fprintf(stderr, "No such reader type: %02x\n", reader->type); break; } return NULL; } /* *-------------------------------------------------------------------------- * * bson_reader_tell -- * * Return the current position in the underlying reader. This will * always be at the beginning of a bson document or end of file. * * Returns: * An off_t containing the current offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ off_t bson_reader_tell(bson_reader_t *reader) /* IN */ { BSON_ASSERT(reader); switch (reader->type) { case BSON_READER_HANDLE: return _bson_reader_handle_tell((bson_reader_handle_t *)reader); case BSON_READER_DATA: return _bson_reader_data_tell((bson_reader_data_t *)reader); default: fprintf(stderr, "No such reader type: %02x\n", reader->type); return -1; } } /* *-------------------------------------------------------------------------- * * bson_reader_new_from_file -- * * A convenience function to open a file containing sequential * bson documents and read them using bson_reader_t. * * Returns: * A new bson_reader_t if successful, otherwise NULL and * @error is set. Free the non-NULL result with * bson_reader_destroy(). * * Side effects: * @error may be set. * *-------------------------------------------------------------------------- */ bson_reader_t * bson_reader_new_from_file(const char *path, /* IN */ bson_error_t *error) /* OUT */ { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg; int fd; BSON_ASSERT(path); #ifdef BSON_OS_WIN32 if (_sopen_s(&fd, path, (_O_RDONLY | _O_BINARY), _SH_DENYNO, 0) != 0) { fd = -1; } #else fd = open(path, O_RDONLY); #endif if (fd == -1) { errmsg = bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf); bson_set_error(error, BSON_ERROR_READER, BSON_ERROR_READER_BADFD, "%s", errmsg); return NULL; } return bson_reader_new_from_fd(fd, true); } /* *-------------------------------------------------------------------------- * * bson_reader_reset -- * * Restore the reader to its initial state. Valid only for readers * created with bson_reader_new_from_data. * *-------------------------------------------------------------------------- */ void bson_reader_reset(bson_reader_t *reader) { bson_reader_data_t *real = (bson_reader_data_t *)reader; if (real->type != BSON_READER_DATA) { fprintf(stderr, "Reader type cannot be reset\n"); return; } real->offset = 0; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-reader.h000066400000000000000000000063331511661753600227050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_READER_H #define BSON_READER_H #include #include #include BSON_BEGIN_DECLS #define BSON_ERROR_READER_BADFD 1 /* *-------------------------------------------------------------------------- * * bson_reader_read_func_t -- * * This function is a callback used by bson_reader_t to read the * next chunk of data from the underlying opaque file descriptor. * * This function is meant to operate similar to the read() function * as part of libc on UNIX-like systems. * * Parameters: * @handle: The handle to read from. * @buf: The buffer to read into. * @count: The number of bytes to read. * * Returns: * 0 for end of stream. * -1 for read failure. * Greater than zero for number of bytes read into @buf. * * Side effects: * None. * *-------------------------------------------------------------------------- */ typedef ssize_t(BSON_CALL *bson_reader_read_func_t)(void *handle, /* IN */ void *buf, /* IN */ size_t count); /* IN */ /* *-------------------------------------------------------------------------- * * bson_reader_destroy_func_t -- * * Destroy callback to release any resources associated with the * opaque handle. * * Parameters: * @handle: the handle provided to bson_reader_new_from_handle(). * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ typedef void(BSON_CALL *bson_reader_destroy_func_t)(void *handle); /* IN */ BSON_EXPORT(bson_reader_t *) bson_reader_new_from_handle(void *handle, bson_reader_read_func_t rf, bson_reader_destroy_func_t df); BSON_EXPORT(bson_reader_t *) bson_reader_new_from_fd(int fd, bool close_on_destroy); BSON_EXPORT(bson_reader_t *) bson_reader_new_from_file(const char *path, bson_error_t *error); BSON_EXPORT(bson_reader_t *) bson_reader_new_from_data(const uint8_t *data, size_t length); BSON_EXPORT(void) bson_reader_destroy(bson_reader_t *reader); BSON_EXPORT(void) bson_reader_set_read_func(bson_reader_t *reader, bson_reader_read_func_t func); BSON_EXPORT(void) bson_reader_set_destroy_func(bson_reader_t *reader, bson_reader_destroy_func_t func); BSON_EXPORT(const bson_t *) bson_reader_read(bson_reader_t *reader, bool *reached_eof); BSON_EXPORT(off_t) bson_reader_tell(bson_reader_t *reader); BSON_EXPORT(void) bson_reader_reset(bson_reader_t *reader); BSON_END_DECLS #endif /* BSON_READER_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-string.c000066400000000000000000000262451511661753600227500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #else #include #endif /* *-------------------------------------------------------------------------- * * bson_strdup -- * * Portable strdup(). * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdup(const char *str) /* IN */ { long len; char *out; if (!str) { return NULL; } len = (long)strlen(str); out = bson_malloc(len + 1); if (!out) { return NULL; } memcpy(out, str, len + 1); return out; } /* *-------------------------------------------------------------------------- * * bson_strdupv_printf -- * * Like bson_strdup_printf() but takes a va_list. * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdupv_printf(const char *format, /* IN */ va_list args) /* IN */ { va_list my_args; char *buf; int len = 32; int n; BSON_ASSERT(format); buf = bson_malloc0(len); while (true) { va_copy(my_args, args); n = bson_vsnprintf(buf, len, format, my_args); va_end(my_args); if (n > -1 && n < len) { return buf; } if (n > -1) { len = n + 1; } else { len *= 2; } buf = bson_realloc(buf, len); } } /* *-------------------------------------------------------------------------- * * bson_strdup_printf -- * * Convenience function that formats a string according to @format * and returns a copy of it. * * Returns: * A newly created string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strdup_printf(const char *format, /* IN */ ...) /* IN */ { va_list args; char *ret; BSON_ASSERT(format); va_start(args, format); ret = bson_strdupv_printf(format, args); va_end(args); return ret; } /* *-------------------------------------------------------------------------- * * bson_strndup -- * * A portable strndup(). * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strndup(const char *str, /* IN */ size_t n_bytes) /* IN */ { char *ret; BSON_ASSERT(str); ret = bson_malloc(n_bytes + 1); bson_strncpy(ret, str, n_bytes + 1); return ret; } /* *-------------------------------------------------------------------------- * * bson_strfreev -- * * Frees each string in a NULL terminated array of strings. * This also frees the underlying array. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_strfreev(char **str) /* IN */ { if (str) { for (char **ptr = str; *ptr != NULL; ++ptr) { bson_free(*ptr); } bson_free(str); } } /* *-------------------------------------------------------------------------- * * bson_strnlen -- * * A portable strnlen(). * * Returns: * The length of @s up to @maxlen. * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_strnlen(const char *s, /* IN */ size_t maxlen) /* IN */ { #ifdef BSON_HAVE_STRNLEN return strnlen(s, maxlen); #else size_t i; for (i = 0; i < maxlen; i++) { if (s[i] == '\0') { return i; } } return maxlen; #endif } /* *-------------------------------------------------------------------------- * * bson_strncpy -- * * A portable strncpy. * * Copies @src into @dst, which must be @size bytes or larger. * The result is guaranteed to be \0 terminated. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_strncpy(char *dst, /* IN */ const char *src, /* IN */ size_t size) /* IN */ { if (size == 0) { return; } /* Prefer strncpy_s for MSVC, or strlcpy, which has additional checks and only * adds one trailing \0 */ #ifdef _MSC_VER strncpy_s(dst, size, src, _TRUNCATE); #elif defined(BSON_HAVE_STRLCPY) strlcpy(dst, src, size); #else strncpy(dst, src, size); dst[size - 1] = '\0'; #endif } /* *-------------------------------------------------------------------------- * * bson_vsnprintf -- * * A portable vsnprintf. * * If more than @size bytes are required (exluding the null byte), * then @size bytes will be written to @string and the return value * is the number of bytes required. * * This function will always return a NULL terminated string. * * Returns: * The number of bytes required for @format excluding the null byte. * * Side effects: * @str is initialized with the formatted string. * *-------------------------------------------------------------------------- */ int bson_vsnprintf(char *str, /* IN */ size_t size, /* IN */ const char *format, /* IN */ va_list ap) /* IN */ { #ifdef _MSC_VER int r = -1; BSON_ASSERT(str); if (size == 0) { return 0; } r = _vsnprintf_s(str, size, _TRUNCATE, format, ap); if (r == -1) { r = _vscprintf(format, ap); } str[size - 1] = '\0'; return r; #else int r; BSON_ASSERT(str); if (size == 0) { return 0; } r = vsnprintf(str, size, format, ap); str[size - 1] = '\0'; return r; #endif } /* *-------------------------------------------------------------------------- * * bson_snprintf -- * * A portable snprintf. * * If @format requires more than @size bytes, then @size bytes are * written and the result is the number of bytes required (excluding * the null byte). * * This function will always return a NULL terminated string. * * Returns: * The number of bytes required for @format. * * Side effects: * @str is initialized. * *-------------------------------------------------------------------------- */ int bson_snprintf(char *str, /* IN */ size_t size, /* IN */ const char *format, /* IN */ ...) { int r; va_list ap; BSON_ASSERT(str); va_start(ap, format); r = bson_vsnprintf(str, size, format, ap); va_end(ap); return r; } /* *-------------------------------------------------------------------------- * * bson_ascii_strtoll -- * * A portable strtoll. * * Convert a string to a 64-bit signed integer according to the given * @base, which must be 16, 10, or 8. Leading whitespace will be ignored. * * If base is 0 is passed in, the base is inferred from the string's * leading characters. Base-16 numbers start with "0x" or "0X", base-8 * numbers start with "0", base-10 numbers start with a digit from 1 to 9. * * If @e is not NULL, it will be assigned the address of the first invalid * character of @s, or its null terminating byte if the entire string was * valid. * * If an invalid value is encountered, errno will be set to EINVAL and * zero will be returned. If the number is out of range, errno is set to * ERANGE and LLONG_MAX or LLONG_MIN is returned. * * Returns: * The result of the conversion. * * Side effects: * errno will be set on error. * *-------------------------------------------------------------------------- */ int64_t bson_ascii_strtoll(const char *s, char **e, int base) { char *tok = (char *)s; char *digits_start; char c; int64_t number = 0; int64_t sign = 1; int64_t cutoff; int64_t cutlim; errno = 0; if (!s) { errno = EINVAL; return 0; } c = *tok; while (bson_isspace(c)) { c = *++tok; } if (c == '-') { sign = -1; c = *++tok; } else if (c == '+') { c = *++tok; } else if (!isdigit(c)) { errno = EINVAL; return 0; } /* from here down, inspired by NetBSD's strtoll */ if ((base == 0 || base == 16) && c == '0' && (tok[1] == 'x' || tok[1] == 'X')) { tok += 2; c = *tok; base = 16; } if (base == 0) { base = c == '0' ? 8 : 10; } /* Cutoff is the greatest magnitude we'll be able to multiply by base without * range error. If the current number is past cutoff and we see valid digit, * fail. If the number is *equal* to cutoff, then the next digit must be less * than cutlim, otherwise fail. */ cutoff = sign == -1 ? INT64_MIN : INT64_MAX; cutlim = (int)(cutoff % base); cutoff /= base; if (sign == -1) { if (cutlim > 0) { cutlim -= base; cutoff += 1; } cutlim = -cutlim; } digits_start = tok; while ((c = *tok)) { if (isdigit(c)) { c -= '0'; } else if (isalpha(c)) { c -= isupper(c) ? 'A' - 10 : 'a' - 10; } else { /* end of number string */ break; } if (c >= base) { break; } if (sign == -1) { if (number < cutoff || (number == cutoff && c > cutlim)) { number = INT64_MIN; errno = ERANGE; break; } else { number *= base; number -= c; } } else { if (number > cutoff || (number == cutoff && c > cutlim)) { number = INT64_MAX; errno = ERANGE; break; } else { number *= base; number += c; } } tok++; } /* did we parse any digits at all? */ if (e != NULL && tok > digits_start) { *e = tok; } return number; } int bson_strcasecmp(const char *s1, const char *s2) { #ifdef BSON_OS_WIN32 return _stricmp(s1, s2); #else return strcasecmp(s1, s2); #endif } bool bson_isspace(int c) { return c >= -1 && c <= 255 && isspace(c); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-string.h000066400000000000000000000032751511661753600227530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_STRING_H #define BSON_STRING_H #include #include #include BSON_BEGIN_DECLS BSON_EXPORT(char *) bson_strdup(const char *str); BSON_EXPORT(char *) bson_strdup_printf(const char *format, ...) BSON_GNUC_PRINTF(1, 2); BSON_EXPORT(char *) bson_strdupv_printf(const char *format, va_list args) BSON_GNUC_PRINTF(1, 0); BSON_EXPORT(char *) bson_strndup(const char *str, size_t n_bytes); BSON_EXPORT(void) bson_strncpy(char *dst, const char *src, size_t size); BSON_EXPORT(int) bson_vsnprintf(char *str, size_t size, const char *format, va_list ap) BSON_GNUC_PRINTF(3, 0); BSON_EXPORT(int) bson_snprintf(char *str, size_t size, const char *format, ...) BSON_GNUC_PRINTF(3, 4); BSON_EXPORT(void) bson_strfreev(char **strv); BSON_EXPORT(size_t) bson_strnlen(const char *s, size_t maxlen); BSON_EXPORT(int64_t) bson_ascii_strtoll(const char *str, char **endptr, int base); BSON_EXPORT(int) bson_strcasecmp(const char *s1, const char *s2); BSON_EXPORT(bool) bson_isspace(int c); BSON_END_DECLS #endif /* BSON_STRING_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-timegm-private.h000066400000000000000000000030311511661753600243650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_TIMEGM_PRIVATE_H #define BSON_TIMEGM_PRIVATE_H #include #include BSON_BEGIN_DECLS /* avoid system-dependent struct tm definitions */ struct bson_tm { int64_t tm_sec; /* seconds after the minute [0-60] */ int64_t tm_min; /* minutes after the hour [0-59] */ int64_t tm_hour; /* hours since midnight [0-23] */ int64_t tm_mday; /* day of the month [1-31] */ int64_t tm_mon; /* months since January [0-11] */ int64_t tm_year; /* years since 1900 */ int64_t tm_wday; /* days since Sunday [0-6] */ int64_t tm_yday; /* days since January 1 [0-365] */ int64_t tm_isdst; /* Daylight Savings Time flag */ int64_t tm_gmtoff; /* offset from CUT in seconds */ const char *tm_zone; /* timezone abbreviation */ }; int64_t _bson_timegm(struct bson_tm *const tmp); BSON_END_DECLS #endif /* BSON_TIMEGM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-timegm.c000066400000000000000000000457651511661753600227340ustar00rootroot00000000000000/* ** The original version of this file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson. */ /* ** Leap second handling from Bradley White. ** POSIX-style TZ environment variable handling from Guy Harris. ** Updated to use int64_t's instead of system-dependent definitions of int64_t ** and struct tm by A. Jesse Jiryu Davis for MongoDB, Inc. */ #include #include #include #include #include /* for INT64_MAX and INT64_MIN */ #include #if 2 < __GNUC__ + (96 <= __GNUC_MINOR__) #define ATTRIBUTE_PURE __attribute__((__pure__)) #else #define ATTRIBUTE_PURE /* empty */ #endif #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wshift-negative-value" #endif /* The minimum and maximum finite time values. */ static int64_t const time_t_min = INT64_MIN; static int64_t const time_t_max = INT64_MAX; #ifdef __clang__ #pragma clang diagnostic pop #pragma clang diagnostic pop #endif #ifndef TZ_MAX_TIMES #define TZ_MAX_TIMES 2000 #endif /* !defined TZ_MAX_TIMES */ #ifndef TZ_MAX_TYPES /* This must be at least 17 for Europe/Samara and Europe/Vilnius. */ #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ #endif /* !defined TZ_MAX_TYPES */ #ifndef TZ_MAX_CHARS #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */ #endif /* !defined TZ_MAX_CHARS */ #ifndef TZ_MAX_LEAPS #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ #endif /* !defined TZ_MAX_LEAPS */ #define SECSPERMIN 60 #define MINSPERHOUR 60 #define HOURSPERDAY 24 #define DAYSPERWEEK 7 #define DAYSPERNYEAR 365 #define DAYSPERLYEAR 366 #define SECSPERHOUR (SECSPERMIN * MINSPERHOUR) #define SECSPERDAY ((int_fast32_t)SECSPERHOUR * HOURSPERDAY) #define MONSPERYEAR 12 #define TM_YEAR_BASE 1900 #define EPOCH_YEAR 1970 #define EPOCH_WDAY 4 /* TM_THURSDAY */ #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) struct ttinfo { /* time type information */ int_fast32_t tt_gmtoff; /* UT offset in seconds */ int tt_isdst; /* used to set tm_isdst */ int tt_abbrind; /* abbreviation list index */ int tt_ttisstd; /* true if transition is std time */ int tt_ttisgmt; /* true if transition is UT */ }; struct lsinfo { /* leap second information */ int64_t ls_trans; /* transition time */ int_fast64_t ls_corr; /* correction to apply */ }; #define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) #ifdef TZNAME_MAX #define MY_TZNAME_MAX TZNAME_MAX #endif /* defined TZNAME_MAX */ #ifndef TZNAME_MAX #define MY_TZNAME_MAX 255 #endif /* !defined TZNAME_MAX */ struct state { int leapcnt; int timecnt; int typecnt; int charcnt; int goback; int goahead; int64_t ats[TZ_MAX_TIMES]; unsigned char types[TZ_MAX_TIMES]; struct ttinfo ttis[TZ_MAX_TYPES]; char chars[BIGGEST(TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))]; struct lsinfo lsis[TZ_MAX_LEAPS]; int defaulttype; /* for early times or if no transitions */ }; struct rule { int r_type; /* type of rule--see below */ int r_day; /* day number of rule */ int r_week; /* week number of rule */ int r_mon; /* month number of rule */ int_fast32_t r_time; /* transition time of rule */ }; /* ** Prototypes for static functions. */ static void gmtload(struct state *const sp); static struct bson_tm * gmtsub(const int64_t *const timep, const int_fast32_t offset, struct bson_tm *const tmp); static int64_t increment_overflow(int64_t *const ip, int64_t j); static int64_t leaps_thru_end_of(const int64_t y) ATTRIBUTE_PURE; static int64_t increment_overflow32(int_fast32_t *const lp, int64_t const m); static int64_t normalize_overflow32(int_fast32_t *const tensptr, int64_t *const unitsptr, const int64_t base); static int64_t normalize_overflow(int64_t *const tensptr, int64_t *const unitsptr, const int64_t base); static int64_t time1(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset); static int64_t time2(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp); static int64_t time2sub(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp, const int64_t do_norm_secs); static struct bson_tm * timesub(const int64_t *const timep, const int_fast32_t offset, const struct state *const sp, struct bson_tm *const tmp); static int64_t tmcomp(const struct bson_tm *const atmp, const struct bson_tm *const btmp); static struct state gmtmem; #define gmtptr (&gmtmem) static int gmt_is_set; static const int mon_lengths[2][MONSPERYEAR] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; static const int year_lengths[2] = {DAYSPERNYEAR, DAYSPERLYEAR}; static void gmtload(struct state *const sp) { memset(sp, 0, sizeof(struct state)); sp->typecnt = 1; sp->charcnt = 4; sp->chars[0] = 'G'; sp->chars[1] = 'M'; sp->chars[2] = 'T'; } /* ** gmtsub is to gmtime as localsub is to localtime. */ static struct bson_tm * gmtsub(const int64_t *const timep, const int_fast32_t offset, struct bson_tm *const tmp) { struct bson_tm *result; if (!gmt_is_set) { gmt_is_set = true; gmtload(gmtptr); } result = timesub(timep, offset, gmtptr, tmp); return result; } /* ** Return the number of leap years through the end of the given year ** where, to make the math easy, the answer for year zero is defined as zero. */ static int64_t leaps_thru_end_of(const int64_t y) { return (y >= 0) ? (y / 4 - y / 100 + y / 400) : -(leaps_thru_end_of(-(y + 1)) + 1); } static struct bson_tm * timesub(const int64_t *const timep, const int_fast32_t offset, const struct state *const sp, struct bson_tm *const tmp) { const struct lsinfo *lp; int64_t tdays; int64_t idays; /* unsigned would be so 2003 */ int_fast64_t rem; int64_t y; const int (*ip)[MONSPERYEAR]; int_fast64_t corr; int64_t hit; int64_t i; corr = 0; hit = 0; i = (sp == NULL) ? 0 : sp->leapcnt; while (--i >= 0) { lp = &sp->lsis[i]; if (*timep >= lp->ls_trans) { if (*timep == lp->ls_trans) { hit = ((i == 0 && lp->ls_corr > 0) || lp->ls_corr > sp->lsis[i - 1].ls_corr); if (hit) while (i > 0 && sp->lsis[i].ls_trans == sp->lsis[i - 1].ls_trans + 1 && sp->lsis[i].ls_corr == sp->lsis[i - 1].ls_corr + 1) { ++hit; --i; } } corr = lp->ls_corr; break; } } y = EPOCH_YEAR; tdays = *timep / SECSPERDAY; rem = *timep - tdays * SECSPERDAY; while (tdays < 0 || tdays >= year_lengths[isleap(y)]) { int64_t newy; int64_t tdelta; int64_t idelta; int64_t leapdays; tdelta = tdays / DAYSPERLYEAR; idelta = tdelta; if (idelta == 0) idelta = (tdays < 0) ? -1 : 1; newy = y; if (increment_overflow(&newy, idelta)) return NULL; leapdays = leaps_thru_end_of(newy - 1) - leaps_thru_end_of(y - 1); tdays -= ((int64_t)newy - y) * DAYSPERNYEAR; tdays -= leapdays; y = newy; } { int_fast32_t seconds; seconds = (int_fast32_t)(tdays * SECSPERDAY); tdays = seconds / SECSPERDAY; rem += seconds - tdays * SECSPERDAY; } /* ** Given the range, we can now fearlessly cast... */ idays = (int64_t)tdays; rem += offset - corr; while (rem < 0) { rem += SECSPERDAY; --idays; } while (rem >= SECSPERDAY) { rem -= SECSPERDAY; ++idays; } while (idays < 0) { if (increment_overflow(&y, -1)) return NULL; idays += year_lengths[isleap(y)]; } while (idays >= year_lengths[isleap(y)]) { idays -= year_lengths[isleap(y)]; if (increment_overflow(&y, 1)) return NULL; } tmp->tm_year = y; if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE)) return NULL; tmp->tm_yday = idays; /* ** The "extra" mods below avoid overflow problems. */ tmp->tm_wday = EPOCH_WDAY + ((y - EPOCH_YEAR) % DAYSPERWEEK) * (DAYSPERNYEAR % DAYSPERWEEK) + leaps_thru_end_of(y - 1) - leaps_thru_end_of(EPOCH_YEAR - 1) + idays; tmp->tm_wday %= DAYSPERWEEK; if (tmp->tm_wday < 0) tmp->tm_wday += DAYSPERWEEK; tmp->tm_hour = (int64_t)(rem / SECSPERHOUR); rem %= SECSPERHOUR; tmp->tm_min = (int64_t)(rem / SECSPERMIN); /* ** A positive leap second requires a special ** representation. This uses "... ??:59:60" et seq. */ tmp->tm_sec = (int64_t)(rem % SECSPERMIN) + hit; ip = mon_lengths + (isleap(y) ? 1 : 0); tmp->tm_mon = 0; while (idays >= (*ip)[tmp->tm_mon]) { idays -= (*ip)[tmp->tm_mon++]; BSON_ASSERT(tmp->tm_mon < MONSPERYEAR); } tmp->tm_mday = (int64_t)(idays + 1); tmp->tm_isdst = 0; #ifdef TM_GMTOFF tmp->TM_GMTOFF = offset; #endif /* defined TM_GMTOFF */ return tmp; } /* ** Adapted from code provided by Robert Elz, who writes: ** The "best" way to do mktime I think is based on an idea of Bob ** Kridle's (so its said...) from a long time ago. ** It does a binary search of the int64_t space. Since int64_t's are ** just 32 bits, its a max of 32 iterations (even at 64 bits it ** would still be very reasonable). */ #ifndef WRONG #define WRONG (-1) #endif /* !defined WRONG */ /* ** Normalize logic courtesy Paul Eggert. */ static int64_t increment_overflow(int64_t *const ip, int64_t j) { int64_t const i = *ip; /* ** If i >= 0 there can only be overflow if i + j > INT_MAX ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow. ** If i < 0 there can only be overflow if i + j < INT_MIN ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow. */ if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i)) return true; *ip += j; return false; } static int64_t increment_overflow32(int_fast32_t *const lp, int64_t const m) { int_fast32_t const l = *lp; if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l)) return true; *lp += (int_fast32_t)m; return false; } static int64_t normalize_overflow(int64_t *const tensptr, int64_t *const unitsptr, const int64_t base) { int64_t tensdelta; tensdelta = (*unitsptr >= 0) ? (*unitsptr / base) : (-1 - (-1 - *unitsptr) / base); *unitsptr -= tensdelta * base; return increment_overflow(tensptr, tensdelta); } static int64_t normalize_overflow32(int_fast32_t *const tensptr, int64_t *const unitsptr, const int64_t base) { int64_t tensdelta; tensdelta = (*unitsptr >= 0) ? (*unitsptr / base) : (-1 - (-1 - *unitsptr) / base); *unitsptr -= tensdelta * base; return increment_overflow32(tensptr, tensdelta); } static int64_t tmcomp(const struct bson_tm *const atmp, const struct bson_tm *const btmp) { int64_t result; if (atmp->tm_year != btmp->tm_year) return atmp->tm_year < btmp->tm_year ? -1 : 1; if ((result = (atmp->tm_mon - btmp->tm_mon)) == 0 && (result = (atmp->tm_mday - btmp->tm_mday)) == 0 && (result = (atmp->tm_hour - btmp->tm_hour)) == 0 && (result = (atmp->tm_min - btmp->tm_min)) == 0) result = atmp->tm_sec - btmp->tm_sec; return result; } static int64_t time2sub(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp, const int64_t do_norm_secs) { const struct state *sp; int64_t dir; int64_t i, j; int64_t saved_seconds; int_fast32_t li; int64_t lo; int64_t hi; int_fast32_t y; int64_t newt; int64_t t; struct bson_tm yourtm, mytm; *okayp = false; yourtm = *tmp; if (do_norm_secs) { if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec, SECSPERMIN)) return WRONG; } if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR)) return WRONG; if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY)) return WRONG; y = (int_fast32_t)yourtm.tm_year; if (normalize_overflow32(&y, &yourtm.tm_mon, MONSPERYEAR)) return WRONG; /* ** Turn y into an actual year number for now. ** It is converted back to an offset from TM_YEAR_BASE later. */ if (increment_overflow32(&y, TM_YEAR_BASE)) return WRONG; while (yourtm.tm_mday <= 0) { if (increment_overflow32(&y, -1)) return WRONG; li = y + (1 < yourtm.tm_mon); yourtm.tm_mday += year_lengths[isleap(li)]; } while (yourtm.tm_mday > DAYSPERLYEAR) { li = y + (1 < yourtm.tm_mon); yourtm.tm_mday -= year_lengths[isleap(li)]; if (increment_overflow32(&y, 1)) return WRONG; } for (;;) { i = mon_lengths[isleap(y)][yourtm.tm_mon]; if (yourtm.tm_mday <= i) break; yourtm.tm_mday -= i; if (++yourtm.tm_mon >= MONSPERYEAR) { yourtm.tm_mon = 0; if (increment_overflow32(&y, 1)) return WRONG; } } if (increment_overflow32(&y, -TM_YEAR_BASE)) return WRONG; yourtm.tm_year = y; if (yourtm.tm_year != y) return WRONG; if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN) saved_seconds = 0; else if (y + TM_YEAR_BASE < EPOCH_YEAR) { /* ** We can't set tm_sec to 0, because that might push the ** time below the minimum representable time. ** Set tm_sec to 59 instead. ** This assumes that the minimum representable time is ** not in the same minute that a leap second was deleted from, ** which is a safer assumption than using 58 would be. */ if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN)) return WRONG; saved_seconds = yourtm.tm_sec; yourtm.tm_sec = SECSPERMIN - 1; } else { saved_seconds = yourtm.tm_sec; yourtm.tm_sec = 0; } /* ** Do a binary search. */ lo = INT64_MIN; hi = INT64_MAX; for (;;) { t = lo / 2 + hi / 2; if (t < lo) t = lo; else if (t > hi) t = hi; if ((*funcp)(&t, offset, &mytm) == NULL) { /* ** Assume that t is too extreme to be represented in ** a struct bson_tm; arrange things so that it is less ** extreme on the next pass. */ dir = (t > 0) ? 1 : -1; } else dir = tmcomp(&mytm, &yourtm); if (dir != 0) { if (t == lo) { if (t == time_t_max) return WRONG; ++t; ++lo; } else if (t == hi) { if (t == time_t_min) return WRONG; --t; --hi; } if (lo > hi) return WRONG; if (dir > 0) hi = t; else lo = t; continue; } if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst) break; /* ** Right time, wrong type. ** Hunt for right time, right type. ** It's okay to guess wrong since the guess ** gets checked. */ sp = (const struct state *)gmtptr; if (sp == NULL) return WRONG; for (i = sp->typecnt - 1; i >= 0; --i) { if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) continue; for (j = sp->typecnt - 1; j >= 0; --j) { if (sp->ttis[j].tt_isdst == yourtm.tm_isdst) continue; newt = t + sp->ttis[j].tt_gmtoff - sp->ttis[i].tt_gmtoff; if ((*funcp)(&newt, offset, &mytm) == NULL) continue; if (tmcomp(&mytm, &yourtm) != 0) continue; if (mytm.tm_isdst != yourtm.tm_isdst) continue; /* ** We have a match. */ t = newt; goto label; } } return WRONG; } label: newt = t + saved_seconds; if ((newt < t) != (saved_seconds < 0)) return WRONG; t = newt; if ((*funcp)(&t, offset, tmp)) *okayp = true; return t; } static int64_t time2(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset, int64_t *const okayp) { int64_t t; /* ** First try without normalization of seconds ** (in case tm_sec contains a value associated with a leap second). ** If that fails, try with normalization of seconds. */ t = time2sub(tmp, funcp, offset, okayp, false); return *okayp ? t : time2sub(tmp, funcp, offset, okayp, true); } static int64_t time1(struct bson_tm *const tmp, struct bson_tm *(*const funcp)(const int64_t *, int_fast32_t, struct bson_tm *), const int_fast32_t offset) { int64_t t; const struct state *sp; int64_t samei, otheri; int64_t sameind, otherind; int64_t i; int64_t nseen; int64_t seen[TZ_MAX_TYPES]; int64_t types[TZ_MAX_TYPES]; int64_t okay; if (tmp == NULL) { errno = EINVAL; return WRONG; } if (tmp->tm_isdst > 1) tmp->tm_isdst = 1; t = time2(tmp, funcp, offset, &okay); if (okay) return t; if (tmp->tm_isdst < 0) #ifdef PCTS /* ** POSIX Conformance Test Suite code courtesy Grant Sullivan. */ tmp->tm_isdst = 0; /* reset to std and try again */ #else return t; #endif /* !defined PCTS */ /* ** We're supposed to assume that somebody took a time of one type ** and did some math on it that yielded a "struct tm" that's bad. ** We try to divine the type they started from and adjust to the ** type they need. */ sp = (const struct state *)gmtptr; if (sp == NULL) return WRONG; for (i = 0; i < sp->typecnt; ++i) seen[i] = false; nseen = 0; for (i = sp->timecnt - 1; i >= 0; --i) if (!seen[sp->types[i]]) { seen[sp->types[i]] = true; types[nseen++] = sp->types[i]; } for (sameind = 0; sameind < nseen; ++sameind) { samei = types[sameind]; if (sp->ttis[samei].tt_isdst != tmp->tm_isdst) continue; for (otherind = 0; otherind < nseen; ++otherind) { otheri = types[otherind]; if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst) continue; tmp->tm_sec += sp->ttis[otheri].tt_gmtoff - sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; t = time2(tmp, funcp, offset, &okay); if (okay) return t; tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff - sp->ttis[samei].tt_gmtoff; tmp->tm_isdst = !tmp->tm_isdst; } } return WRONG; } int64_t _bson_timegm(struct bson_tm *const tmp) { if (tmp != NULL) tmp->tm_isdst = 0; return time1(tmp, gmtsub, 0L); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-types.h000066400000000000000000000365611511661753600226150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_TYPES_H #define BSON_TYPES_H #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS /* *-------------------------------------------------------------------------- * * bson_unichar_t -- * * bson_unichar_t provides an unsigned 32-bit type for containing * unicode characters. When iterating UTF-8 sequences, this should * be used to avoid losing the high-bits of non-ascii characters. * *-------------------------------------------------------------------------- */ typedef uint32_t bson_unichar_t; /** * @brief Flags configuring the creation of a bson_context_t */ typedef enum { /** Use default options */ BSON_CONTEXT_NONE = 0, /* Deprecated: Generating new OIDs from a bson_context_t is always thread-safe */ BSON_CONTEXT_THREAD_SAFE = (1 << 0), /* Deprecated: Does nothing and is ignored */ BSON_CONTEXT_DISABLE_HOST_CACHE = (1 << 1), /* Call getpid() instead of remembering the result of getpid() when using the context */ BSON_CONTEXT_DISABLE_PID_CACHE = (1 << 2), /* Deprecated: Does nothing */ BSON_CONTEXT_USE_TASK_ID = (1 << 3), } bson_context_flags_t; /** * bson_context_t: * * This structure manages context for the bson library. It handles * configuration for thread-safety and other performance related requirements. * Consumers will create a context and may use multiple under a variety of * situations. * * If your program calls fork(), you should initialize a new bson_context_t * using bson_context_init(). * * If you are using threading, it is suggested that you use a bson_context_t * per thread for best performance. Alternatively, you can initialize the * bson_context_t with BSON_CONTEXT_THREAD_SAFE, although a performance penalty * will be incurred. * * Many functions will require that you provide a bson_context_t such as OID * generation. * * This structure is opaque in that you cannot see the contents of the * structure. However, it is stack allocatable in that enough padding is * provided in _bson_context_t to hold the structure. */ typedef struct _bson_context_t bson_context_t; /** * bson_json_opts_t: * * This structure is used to pass options for serializing BSON into extended * JSON to the respective serialization methods. * * max_len can be either a non-negative integer, or BSON_MAX_LEN_UNLIMITED to * set no limit for serialization length. */ typedef struct _bson_json_opts_t bson_json_opts_t; /** * bson_oid_t: * * This structure contains the binary form of a BSON Object Id as specified * on http://bsonspec.org. If you would like the bson_oid_t in string form * see bson_oid_to_string() or bson_oid_to_string_r(). */ typedef struct { uint8_t bytes[12]; } bson_oid_t; BSON_STATIC_ASSERT2(oid_t, sizeof(bson_oid_t) == 12); /** * bson_decimal128_t: * * @high The high-order bytes of the decimal128. This field contains sign, * combination bits, exponent, and part of the coefficient continuation. * @low The low-order bytes of the decimal128. This field contains the second * part of the coefficient continuation. * * This structure is a boxed type containing the value for the BSON decimal128 * type. The structure stores the 128 bits such that they correspond to the * native format for the IEEE decimal128 type, if it is implemented. **/ typedef struct { #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN uint64_t low; uint64_t high; #elif BSON_BYTE_ORDER == BSON_BIG_ENDIAN uint64_t high; uint64_t low; #endif } bson_decimal128_t; /** * @brief Flags and error codes for BSON validation functions. * * Pass these flags bits to control the behavior of the `bson_validate` family * of functions. * * Additionally, if validation fails, then the error code set on a `bson_error_t` * will have the value corresponding to the reason that validation failed. */ typedef enum { /** * @brief No special validation behavior specified. */ BSON_VALIDATE_NONE = 0, /** * @brief Check that all text components of the BSON data are valid UTF-8. * * Note that this will also cause validation to reject valid text that contains * a null character. This can be changed by also passing * `BSON_VALIDATE_UTF8_ALLOW_NULL` */ BSON_VALIDATE_UTF8 = (1 << 0), /** * @brief Check that element keys do not begin with an ASCII dollar `$` */ BSON_VALIDATE_DOLLAR_KEYS = (1 << 1), /** * @brief Check that element keys do not contain an ASCII period `.` */ BSON_VALIDATE_DOT_KEYS = (1 << 2), /** * @brief If set then it is *not* an error for a UTF-8 string to contain * embedded null characters. * * This has no effect unless `BSON_VALIDATE_UTF8` is also passed. */ BSON_VALIDATE_UTF8_ALLOW_NULL = (1 << 3), /** * @brief Check that no element key is a zero-length empty string. */ BSON_VALIDATE_EMPTY_KEYS = (1 << 4), /** * @brief This is not a flag that controls behavior, but is instead used to indicate * that a BSON document is corrupted in some way. This is the value that will * appear as an error code. * * Passing this as a flag has no effect. */ BSON_VALIDATE_CORRUPT = (1 << 5), } bson_validate_flags_t; /** * bson_type_t: * * This enumeration contains all of the possible types within a BSON document. * Use bson_iter_type() to fetch the type of a field while iterating over it. */ typedef enum { BSON_TYPE_EOD = 0x00, BSON_TYPE_DOUBLE = 0x01, BSON_TYPE_UTF8 = 0x02, BSON_TYPE_DOCUMENT = 0x03, BSON_TYPE_ARRAY = 0x04, BSON_TYPE_BINARY = 0x05, BSON_TYPE_UNDEFINED = 0x06, BSON_TYPE_OID = 0x07, BSON_TYPE_BOOL = 0x08, BSON_TYPE_DATE_TIME = 0x09, BSON_TYPE_NULL = 0x0A, BSON_TYPE_REGEX = 0x0B, BSON_TYPE_DBPOINTER = 0x0C, BSON_TYPE_CODE = 0x0D, BSON_TYPE_SYMBOL = 0x0E, BSON_TYPE_CODEWSCOPE = 0x0F, BSON_TYPE_INT32 = 0x10, BSON_TYPE_TIMESTAMP = 0x11, BSON_TYPE_INT64 = 0x12, BSON_TYPE_DECIMAL128 = 0x13, BSON_TYPE_MAXKEY = 0x7F, BSON_TYPE_MINKEY = 0xFF, } bson_type_t; /** * bson_subtype_t: * * This enumeration contains the various subtypes that may be used in a binary * field. See http://bsonspec.org for more information. */ typedef enum { BSON_SUBTYPE_BINARY = 0x00, BSON_SUBTYPE_FUNCTION = 0x01, BSON_SUBTYPE_BINARY_DEPRECATED = 0x02, BSON_SUBTYPE_UUID_DEPRECATED = 0x03, BSON_SUBTYPE_UUID = 0x04, BSON_SUBTYPE_MD5 = 0x05, BSON_SUBTYPE_ENCRYPTED = 0x06, BSON_SUBTYPE_COLUMN = 0x07, BSON_SUBTYPE_SENSITIVE = 0x08, BSON_SUBTYPE_VECTOR = 0x09, BSON_SUBTYPE_USER = 0x80, } bson_subtype_t; /* *-------------------------------------------------------------------------- * * bson_value_t -- * * A boxed type to contain various bson_type_t types. * * See also: * bson_value_copy() * bson_value_destroy() * *-------------------------------------------------------------------------- */ typedef struct _bson_value_t { bson_type_t value_type; int32_t padding; union { bson_oid_t v_oid; int64_t v_int64; int32_t v_int32; int8_t v_int8; double v_double; bool v_bool; int64_t v_datetime; struct { uint32_t timestamp; uint32_t increment; } v_timestamp; struct { char *str; uint32_t len; } v_utf8; struct { uint8_t *data; uint32_t data_len; } v_doc; struct { uint8_t *data; uint32_t data_len; bson_subtype_t subtype; } v_binary; struct { char *regex; char *options; } v_regex; struct { char *collection; uint32_t collection_len; bson_oid_t oid; } v_dbpointer; struct { char *code; uint32_t code_len; } v_code; struct { char *code; uint8_t *scope_data; uint32_t code_len; uint32_t scope_len; } v_codewscope; struct { char *symbol; uint32_t len; } v_symbol; bson_decimal128_t v_decimal128; } value; } bson_value_t; /** * bson_iter_t: * * This structure manages iteration over a bson_t structure. It keeps track * of the location of the current key and value within the buffer. Using the * various functions to get the value of the iter will read from these * locations. * * This structure is safe to discard on the stack. No cleanup is necessary * after using it. */ typedef struct { const uint8_t *raw; /* The raw buffer being iterated. */ uint32_t len; /* The length of raw. */ uint32_t off; /* The offset within the buffer. */ uint32_t type; /* The offset of the type byte. */ uint32_t key; /* The offset of the key byte. */ uint32_t d1; /* The offset of the first data byte. */ uint32_t d2; /* The offset of the second data byte. */ uint32_t d3; /* The offset of the third data byte. */ uint32_t d4; /* The offset of the fourth data byte. */ uint32_t next_off; /* The offset of the next field. */ uint32_t err_off; /* The offset of the error. */ bson_value_t value; /* Internal value for various state. */ } bson_iter_t; /** * bson_reader_t: * * This structure is used to iterate over a sequence of BSON documents. It * allows for them to be iterated with the possibility of no additional * memory allocations under certain circumstances such as reading from an * incoming mongo packet. */ BSON_ALIGNED_BEGIN(BSON_ALIGN_OF_PTR) typedef struct { uint32_t type; /**< private >**/ } bson_reader_t BSON_ALIGNED_END(BSON_ALIGN_OF_PTR); /** * bson_visitor_t: * * This structure contains a series of pointers that can be executed for * each field of a BSON document based on the field type. * * For example, if an int32 field is found, visit_int32 will be called. * * When visiting each field using bson_iter_visit_all(), you may provide a * data pointer that will be provided with each callback. This might be useful * if you are marshaling to another language. * * You may pre-maturely stop the visitation of fields by returning true in your * visitor. Returning false will continue visitation to further fields. */ typedef struct { /* run before / after descending into a document */ bool(BSON_CALL *visit_before)(const bson_iter_t *iter, const char *key, void *data); bool(BSON_CALL *visit_after)(const bson_iter_t *iter, const char *key, void *data); /* corrupt BSON, or unsupported type and visit_unsupported_type not set */ void(BSON_CALL *visit_corrupt)(const bson_iter_t *iter, void *data); /* normal bson field callbacks */ bool(BSON_CALL *visit_double)(const bson_iter_t *iter, const char *key, double v_double, void *data); bool(BSON_CALL *visit_utf8)( const bson_iter_t *iter, const char *key, size_t v_utf8_len, const char *v_utf8, void *data); bool(BSON_CALL *visit_document)(const bson_iter_t *iter, const char *key, const bson_t *v_document, void *data); bool(BSON_CALL *visit_array)(const bson_iter_t *iter, const char *key, const bson_t *v_array, void *data); bool(BSON_CALL *visit_binary)(const bson_iter_t *iter, const char *key, bson_subtype_t v_subtype, size_t v_binary_len, const uint8_t *v_binary, void *data); /* normal field with deprecated "Undefined" BSON type */ bool(BSON_CALL *visit_undefined)(const bson_iter_t *iter, const char *key, void *data); bool(BSON_CALL *visit_oid)(const bson_iter_t *iter, const char *key, const bson_oid_t *v_oid, void *data); bool(BSON_CALL *visit_bool)(const bson_iter_t *iter, const char *key, bool v_bool, void *data); bool(BSON_CALL *visit_date_time)(const bson_iter_t *iter, const char *key, int64_t msec_since_epoch, void *data); bool(BSON_CALL *visit_null)(const bson_iter_t *iter, const char *key, void *data); bool(BSON_CALL *visit_regex)( const bson_iter_t *iter, const char *key, const char *v_regex, const char *v_options, void *data); bool(BSON_CALL *visit_dbpointer)(const bson_iter_t *iter, const char *key, size_t v_collection_len, const char *v_collection, const bson_oid_t *v_oid, void *data); bool(BSON_CALL *visit_code)( const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, void *data); bool(BSON_CALL *visit_symbol)( const bson_iter_t *iter, const char *key, size_t v_symbol_len, const char *v_symbol, void *data); bool(BSON_CALL *visit_codewscope)(const bson_iter_t *iter, const char *key, size_t v_code_len, const char *v_code, const bson_t *v_scope, void *data); bool(BSON_CALL *visit_int32)(const bson_iter_t *iter, const char *key, int32_t v_int32, void *data); bool(BSON_CALL *visit_timestamp)( const bson_iter_t *iter, const char *key, uint32_t v_timestamp, uint32_t v_increment, void *data); bool(BSON_CALL *visit_int64)(const bson_iter_t *iter, const char *key, int64_t v_int64, void *data); bool(BSON_CALL *visit_maxkey)(const bson_iter_t *iter, const char *key, void *data); bool(BSON_CALL *visit_minkey)(const bson_iter_t *iter, const char *key, void *data); /* if set, called instead of visit_corrupt when an apparently valid BSON * includes an unrecognized field type (reading future version of BSON) */ void(BSON_CALL *visit_unsupported_type)(const bson_iter_t *iter, const char *key, uint32_t type_code, void *data); bool(BSON_CALL *visit_decimal128)(const bson_iter_t *iter, const char *key, const bson_decimal128_t *v_decimal128, void *data); void *padding[7]; } bson_visitor_t; /** * bson_next_power_of_two: * @v: A 32-bit unsigned integer of required bytes. * * Determines the next larger power of two for the value of @v * in a constant number of operations. * * It is up to the caller to guarantee this will not overflow. * * Returns: The next power of 2 from @v. */ static BSON_INLINE size_t bson_next_power_of_two(size_t v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; #if BSON_WORD_SIZE == 64 v |= v >> 32; #endif v++; return v; } static BSON_INLINE bool bson_is_power_of_two(uint32_t v) { return ((v != 0) && ((v & (v - 1)) == 0)); } BSON_END_DECLS #endif /* BSON_TYPES_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-utf8.c000066400000000000000000000226421511661753600223250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include /* *-------------------------------------------------------------------------- * * bson_utf8_validate -- * * Validates that @utf8 is a valid UTF-8 string. Note that we only * support UTF-8 characters which have sequence length less than or equal * to 4 bytes (RFC 3629). * * If @allow_null is true, then \0 is allowed within @utf8_len bytes * of @utf8. Generally, this is bad practice since the main point of * UTF-8 strings is that they can be used with strlen() and friends. * However, some languages such as Python can send UTF-8 encoded * strings with NUL's in them. * * Note that the two-byte sequence "C0 80" is also interpreted as an * internal NUL, for historical reasons. This sequence is considered * invalid according to RFC3629. * * Parameters: * @utf8: A UTF-8 encoded string. * @utf8_len: The length of @utf8 in bytes. * @allow_null: If the single "00" byte or two-byte sequence "C0 80" are allowed internally within @utf8. * * Returns: * true if @utf8 is valid UTF-8. otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_utf8_validate(const char *utf8, /* IN */ size_t utf8_len, /* IN */ bool allow_null) /* IN */ { bson_unichar_t c; uint8_t first_mask; uint8_t seq_length; size_t i; size_t j; BSON_ASSERT(utf8); for (i = 0; i < utf8_len; i += seq_length) { mcommon_utf8_get_sequence(&utf8[i], &seq_length, &first_mask); /* * Ensure we have a valid multi-byte sequence length. */ if (!seq_length) { return false; } /* * Ensure we have enough bytes left. */ if ((utf8_len - i) < seq_length) { return false; } /* * Also calculate the next char as a unichar so we can * check code ranges for non-shortest form. */ c = utf8[i] & first_mask; /* * Check the high-bits for each additional sequence byte. */ for (j = i + 1; j < (i + seq_length); j++) { c = (c << 6) | (utf8[j] & 0x3F); if ((utf8[j] & 0xC0) != 0x80) { return false; } } /* * Check for NULL bytes afterwards. * * Hint: if you want to optimize this function, starting here to do * this in the same pass as the data above would probably be a good * idea. You would add a branch into the inner loop, but save possibly * on cache-line bouncing on larger strings. Just a thought. */ if (!allow_null) { for (j = 0; j < seq_length; j++) { if (((i + j) > utf8_len) || !utf8[i + j]) { return false; } } } /* * Code point won't fit in utf-16, not allowed. */ if (c > 0x0010FFFF) { return false; } /* * Byte is in reserved range for UTF-16 high-marks * for surrogate pairs. */ if ((c & 0xFFFFF800) == 0xD800) { return false; } /* * Check non-shortest form unicode. */ switch (seq_length) { case 1: if (c <= 0x007F) { continue; } return false; case 2: if ((c >= 0x0080) && (c <= 0x07FF)) { continue; } else if (c == 0) { /* Two-byte representation for NULL. */ if (!allow_null) { return false; } continue; } return false; case 3: if (((c >= 0x0800) && (c <= 0x0FFF)) || ((c >= 0x1000) && (c <= 0xFFFF))) { continue; } return false; case 4: if (((c >= 0x10000) && (c <= 0x3FFFF)) || ((c >= 0x40000) && (c <= 0xFFFFF)) || ((c >= 0x100000) && (c <= 0x10FFFF))) { continue; } return false; default: return false; } } return true; } /* *-------------------------------------------------------------------------- * * bson_utf8_escape_for_json -- * * Allocates a new string matching @utf8 except that special * characters in JSON will be escaped. The resulting string is also * UTF-8 encoded. * * Both " and \ characters will be escaped. Additionally, if a NUL * byte is found before @utf8_len bytes, it will be converted to the * two byte UTF-8 sequence. * * The two-byte sequence "C0 80" is also interpreted as an internal NUL, * for historical reasons. This sequence is considered invalid according * to RFC3629. * * Parameters: * @utf8: A UTF-8 encoded string. * @utf8_len: The length of @utf8 in bytes or -1 if NUL terminated. * * Returns: * A newly allocated string that should be freed with bson_free(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_utf8_escape_for_json(const char *utf8, /* IN */ ssize_t utf8_len) /* IN */ { uint32_t len32; bool allow_nul; if (utf8_len < 0) { size_t sizet_len = strlen(utf8); if (sizet_len < UINT32_MAX) { len32 = (uint32_t)sizet_len; allow_nul = false; } else { return NULL; } } else { if (mlib_in_range(uint32_t, utf8_len) && (uint32_t)utf8_len < UINT32_MAX) { len32 = utf8_len; allow_nul = true; } else { return NULL; } } /* The new private implementation of mcommon_json_append_escaped() avoids * parsing UTF-8 sequences at all in most cases. It preserves the validity * of valid sequences, but it will not catch most UTF-8 errors. For compatibility * at the expense of performance, we emulate the old behavior in this wrapper. */ if (!bson_utf8_validate(utf8, (size_t)len32, allow_nul)) { return NULL; } mcommon_string_append_t append; mcommon_string_new_with_capacity_as_append(&append, len32); if (mcommon_json_append_escaped(&append, utf8, len32, allow_nul)) { return mcommon_string_from_append_destroy_with_steal(&append); } else { mcommon_string_from_append_destroy(&append); return NULL; } } /* *-------------------------------------------------------------------------- * * bson_utf8_get_char -- * * Fetches the next UTF-8 character from the UTF-8 sequence. * * Parameters: * @utf8: A string containing validated UTF-8. * * Returns: * A 32-bit bson_unichar_t reprsenting the multi-byte sequence. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_unichar_t bson_utf8_get_char(const char *utf8) /* IN */ { bson_unichar_t c; uint8_t mask; uint8_t num; int i; BSON_ASSERT(utf8); mcommon_utf8_get_sequence(utf8, &num, &mask); c = (*utf8) & mask; for (i = 1; i < num; i++) { c = (c << 6) | (utf8[i] & 0x3F); } return c; } /* *-------------------------------------------------------------------------- * * bson_utf8_next_char -- * * Returns an incremented pointer to the beginning of the next * multi-byte sequence in @utf8. * * Parameters: * @utf8: A string containing validated UTF-8. * * Returns: * An incremented pointer in @utf8. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * bson_utf8_next_char(const char *utf8) /* IN */ { uint8_t mask; uint8_t num; BSON_ASSERT(utf8); mcommon_utf8_get_sequence(utf8, &num, &mask); return utf8 + num; } /* *-------------------------------------------------------------------------- * * bson_utf8_from_unichar -- * * Converts the unichar to a sequence of utf8 bytes and stores those * in @utf8. The number of bytes in the sequence are stored in @len. * * Parameters: * @unichar: A bson_unichar_t. * @utf8: A location for the multi-byte sequence. * @len: A location for number of bytes stored in @utf8. * * Returns: * None. * * Side effects: * @utf8 is set. * @len is set. * *-------------------------------------------------------------------------- */ void bson_utf8_from_unichar(bson_unichar_t unichar, /* IN */ char utf8[BSON_ENSURE_ARRAY_PARAM_SIZE(6)], /* OUT */ uint32_t *len) /* OUT */ { // Inlined implementation from common-utf8-private mcommon_utf8_from_unichar(unichar, utf8, len); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-utf8.h000066400000000000000000000022551511661753600223300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_UTF8_H #define BSON_UTF8_H #include #include BSON_BEGIN_DECLS BSON_EXPORT(bool) bson_utf8_validate(const char *utf8, size_t utf8_len, bool allow_null); BSON_EXPORT(char *) bson_utf8_escape_for_json(const char *utf8, ssize_t utf8_len); BSON_EXPORT(bson_unichar_t) bson_utf8_get_char(const char *utf8); BSON_EXPORT(const char *) bson_utf8_next_char(const char *utf8); BSON_EXPORT(void) bson_utf8_from_unichar(bson_unichar_t unichar, char utf8[6], uint32_t *len); BSON_END_DECLS #endif /* BSON_UTF8_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-value.c000066400000000000000000000166671511661753600225650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include void bson_value_copy(const bson_value_t *src, /* IN */ bson_value_t *dst) /* OUT */ { BSON_ASSERT(src); BSON_ASSERT(dst); dst->value_type = src->value_type; switch (src->value_type) { case BSON_TYPE_DOUBLE: dst->value.v_double = src->value.v_double; break; case BSON_TYPE_UTF8: BSON_ASSERT(mlib_in_range(size_t, src->value.v_utf8.len)); size_t utf8_len_sz = (size_t)src->value.v_utf8.len; if (utf8_len_sz == SIZE_MAX) { // If the string is at maximum length, do not NULL terminate. The source necessarily cannot fit it. dst->value.v_utf8.len = src->value.v_utf8.len; dst->value.v_utf8.str = bson_malloc(utf8_len_sz); memcpy(dst->value.v_utf8.str, src->value.v_utf8.str, dst->value.v_utf8.len); } else { // There is room in destination to NULL terminate. dst->value.v_utf8.len = src->value.v_utf8.len; dst->value.v_utf8.str = bson_malloc(utf8_len_sz + 1); memcpy(dst->value.v_utf8.str, src->value.v_utf8.str, dst->value.v_utf8.len); dst->value.v_utf8.str[dst->value.v_utf8.len] = '\0'; } break; case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: dst->value.v_doc.data_len = src->value.v_doc.data_len; dst->value.v_doc.data = bson_malloc(src->value.v_doc.data_len); memcpy(dst->value.v_doc.data, src->value.v_doc.data, dst->value.v_doc.data_len); break; case BSON_TYPE_BINARY: dst->value.v_binary.subtype = src->value.v_binary.subtype; dst->value.v_binary.data_len = src->value.v_binary.data_len; dst->value.v_binary.data = bson_malloc(src->value.v_binary.data_len); if (dst->value.v_binary.data_len) { memcpy(dst->value.v_binary.data, src->value.v_binary.data, dst->value.v_binary.data_len); } break; case BSON_TYPE_OID: bson_oid_copy(&src->value.v_oid, &dst->value.v_oid); break; case BSON_TYPE_BOOL: dst->value.v_bool = src->value.v_bool; break; case BSON_TYPE_DATE_TIME: dst->value.v_datetime = src->value.v_datetime; break; case BSON_TYPE_REGEX: dst->value.v_regex.regex = bson_strdup(src->value.v_regex.regex); dst->value.v_regex.options = bson_strdup(src->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: BSON_ASSERT(mlib_in_range(size_t, src->value.v_dbpointer.collection_len)); size_t dbpointer_len_sz = (size_t)src->value.v_dbpointer.collection_len; BSON_ASSERT(dbpointer_len_sz <= SIZE_MAX - 1); dst->value.v_dbpointer.collection_len = src->value.v_dbpointer.collection_len; dst->value.v_dbpointer.collection = bson_malloc(dbpointer_len_sz + 1); memcpy( dst->value.v_dbpointer.collection, src->value.v_dbpointer.collection, dst->value.v_dbpointer.collection_len); dst->value.v_dbpointer.collection[dst->value.v_dbpointer.collection_len] = '\0'; bson_oid_copy(&src->value.v_dbpointer.oid, &dst->value.v_dbpointer.oid); break; case BSON_TYPE_CODE: BSON_ASSERT(mlib_in_range(size_t, src->value.v_code.code_len)); size_t code_len_sz = (size_t)src->value.v_code.code_len; BSON_ASSERT(code_len_sz <= SIZE_MAX - 1); dst->value.v_code.code_len = src->value.v_code.code_len; dst->value.v_code.code = bson_malloc(code_len_sz + 1); memcpy(dst->value.v_code.code, src->value.v_code.code, dst->value.v_code.code_len); dst->value.v_code.code[dst->value.v_code.code_len] = '\0'; break; case BSON_TYPE_SYMBOL: BSON_ASSERT(mlib_in_range(size_t, src->value.v_symbol.len)); size_t symbol_len_sz = (size_t)src->value.v_symbol.len; BSON_ASSERT(symbol_len_sz <= SIZE_MAX - 1); dst->value.v_symbol.len = src->value.v_symbol.len; dst->value.v_symbol.symbol = bson_malloc(symbol_len_sz + 1); memcpy(dst->value.v_symbol.symbol, src->value.v_symbol.symbol, dst->value.v_symbol.len); dst->value.v_symbol.symbol[dst->value.v_symbol.len] = '\0'; break; case BSON_TYPE_CODEWSCOPE: BSON_ASSERT(mlib_in_range(size_t, src->value.v_codewscope.code_len)); size_t codewscope_len_sz = (size_t)src->value.v_codewscope.code_len; BSON_ASSERT(codewscope_len_sz <= SIZE_MAX - 1); dst->value.v_codewscope.code_len = src->value.v_codewscope.code_len; dst->value.v_codewscope.code = bson_malloc(codewscope_len_sz + 1); memcpy(dst->value.v_codewscope.code, src->value.v_codewscope.code, dst->value.v_codewscope.code_len); dst->value.v_codewscope.code[dst->value.v_codewscope.code_len] = '\0'; dst->value.v_codewscope.scope_len = src->value.v_codewscope.scope_len; dst->value.v_codewscope.scope_data = bson_malloc(src->value.v_codewscope.scope_len); memcpy(dst->value.v_codewscope.scope_data, src->value.v_codewscope.scope_data, dst->value.v_codewscope.scope_len); break; case BSON_TYPE_INT32: dst->value.v_int32 = src->value.v_int32; break; case BSON_TYPE_TIMESTAMP: dst->value.v_timestamp.timestamp = src->value.v_timestamp.timestamp; dst->value.v_timestamp.increment = src->value.v_timestamp.increment; break; case BSON_TYPE_INT64: dst->value.v_int64 = src->value.v_int64; break; case BSON_TYPE_DECIMAL128: dst->value.v_decimal128 = src->value.v_decimal128; break; case BSON_TYPE_UNDEFINED: case BSON_TYPE_NULL: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: BSON_ASSERT(false); return; } } void bson_value_destroy(bson_value_t *value) /* IN */ { if (!value) { return; } switch (value->value_type) { case BSON_TYPE_UTF8: bson_free(value->value.v_utf8.str); break; case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: bson_free(value->value.v_doc.data); break; case BSON_TYPE_BINARY: bson_free(value->value.v_binary.data); break; case BSON_TYPE_REGEX: bson_free(value->value.v_regex.regex); bson_free(value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: bson_free(value->value.v_dbpointer.collection); break; case BSON_TYPE_CODE: bson_free(value->value.v_code.code); break; case BSON_TYPE_SYMBOL: bson_free(value->value.v_symbol.symbol); break; case BSON_TYPE_CODEWSCOPE: bson_free(value->value.v_codewscope.code); bson_free(value->value.v_codewscope.scope_data); break; case BSON_TYPE_DOUBLE: case BSON_TYPE_UNDEFINED: case BSON_TYPE_OID: case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_DECIMAL128: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: case BSON_TYPE_EOD: default: break; } } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-value.h000066400000000000000000000016531511661753600225570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VALUE_H #define BSON_VALUE_H #include #include BSON_BEGIN_DECLS BSON_EXPORT(void) bson_value_copy(const bson_value_t *src, bson_value_t *dst); BSON_EXPORT(void) bson_value_destroy(bson_value_t *value); BSON_END_DECLS #endif /* BSON_VALUE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-vector-private.h000066400000000000000000000033331511661753600244120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VECTOR_PRIVATE_H #define BSON_VECTOR_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS typedef enum { BSON_VECTOR_ELEMENT_SIGNED_INT = 0, BSON_VECTOR_ELEMENT_UNSIGNED_INT = 1, BSON_VECTOR_ELEMENT_FLOAT = 2, } bson_vector_element_type_t; typedef enum { BSON_VECTOR_ELEMENT_1_BIT = 0, BSON_VECTOR_ELEMENT_8_BITS = 3, BSON_VECTOR_ELEMENT_32_BITS = 7, } bson_vector_element_size_t; static BSON_INLINE uint8_t bson_vector_header_byte_0(bson_vector_element_type_t element_type, bson_vector_element_size_t element_size) { BSON_ASSERT((unsigned)element_type <= 0x0f); BSON_ASSERT((unsigned)element_size <= 0x0f); return (uint8_t)(((unsigned)element_type << 4) | (unsigned)element_size); } // See also `bson_vector_padding_from_header_byte_1` defined in for use by public inline functions. static BSON_INLINE uint8_t bson_vector_header_byte_1(size_t padding) { BSON_ASSERT(padding <= 7); return (uint8_t)padding; } BSON_END_DECLS #endif /* BSON_VECTOR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-vector.c000066400000000000000000000571731511661753600227500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include static BSON_INLINE bool bson_vector_binary_header_impl_init(bson_vector_binary_header_impl_t *header_out, const uint8_t *binary_data, uint32_t binary_data_len) { if (binary_data_len >= BSON_VECTOR_HEADER_LEN) { memcpy(header_out->bytes, binary_data, BSON_VECTOR_HEADER_LEN); return true; } else { return false; } } static BSON_INLINE bool bson_vector_int8_validate(bson_vector_binary_header_impl_t header) { return header.bytes[0] == bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_SIGNED_INT, BSON_VECTOR_ELEMENT_8_BITS) && header.bytes[1] == bson_vector_header_byte_1(0); } static BSON_INLINE bool bson_vector_float32_validate(bson_vector_binary_header_impl_t header, uint32_t binary_data_len) { return (binary_data_len - BSON_VECTOR_HEADER_LEN) % sizeof(float) == 0 && header.bytes[0] == bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_FLOAT, BSON_VECTOR_ELEMENT_32_BITS) && header.bytes[1] == bson_vector_header_byte_1(0); } static BSON_INLINE bool bson_vector_packed_bit_validate(bson_vector_binary_header_impl_t header, const uint8_t *binary_data, uint32_t binary_data_len) { if (header.bytes[0] == bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_UNSIGNED_INT, BSON_VECTOR_ELEMENT_1_BIT)) { size_t padding = bson_vector_padding_from_header_byte_1(header.bytes[1]); if (header.bytes[1] != bson_vector_header_byte_1(padding)) { return false; } uint32_t vector_data_len = binary_data_len - BSON_VECTOR_HEADER_LEN; if (vector_data_len == 0) { return padding == 0; } else { // We need to read the last byte of the binary block to validate that unused bits are zero. uint8_t last_data_byte = binary_data[binary_data_len - 1]; uint8_t mask_of_unused_bits = (uint8_t)((1u << padding) - 1u); return (last_data_byte & mask_of_unused_bits) == 0; } } else { return false; } } bool bson_vector_int8_view_init(bson_vector_int8_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_int8_validate(header)) { if (view_out) { *view_out = (bson_vector_int8_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_int8_const_view_init(bson_vector_int8_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_int8_validate(header)) { if (view_out) { *view_out = (bson_vector_int8_const_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_float32_view_init(bson_vector_float32_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_float32_validate(header, binary_data_len)) { if (view_out) { *view_out = (bson_vector_float32_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_float32_const_view_init(bson_vector_float32_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_float32_validate(header, binary_data_len)) { if (view_out) { *view_out = (bson_vector_float32_const_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_packed_bit_view_init(bson_vector_packed_bit_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_packed_bit_validate(header, binary_data, binary_data_len)) { if (view_out) { *view_out = (bson_vector_packed_bit_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_packed_bit_const_view_init(bson_vector_packed_bit_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(binary_data); bson_vector_binary_header_impl_t header; if (bson_vector_binary_header_impl_init(&header, binary_data, binary_data_len) && bson_vector_packed_bit_validate(header, binary_data, binary_data_len)) { if (view_out) { *view_out = (bson_vector_packed_bit_const_view_t){ .binary.data = binary_data, .binary.data_len = binary_data_len, .binary.header_copy = header}; } return true; } else { return false; } } bool bson_vector_int8_view_from_iter(bson_vector_int8_view_t *view_out, bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { uint32_t binary_len; uint8_t *binary; bson_iter_overwrite_binary(iter, BSON_SUBTYPE_VECTOR, &binary_len, &binary); return binary && bson_vector_int8_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_vector_int8_const_view_from_iter(bson_vector_int8_const_view_t *view_out, const bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { bson_subtype_t subtype; uint32_t binary_len; const uint8_t *binary; bson_iter_binary(iter, &subtype, &binary_len, &binary); return binary && subtype == BSON_SUBTYPE_VECTOR && bson_vector_int8_const_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_vector_float32_view_from_iter(bson_vector_float32_view_t *view_out, bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { uint32_t binary_len; uint8_t *binary; bson_iter_overwrite_binary(iter, BSON_SUBTYPE_VECTOR, &binary_len, &binary); return binary && bson_vector_float32_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_vector_float32_const_view_from_iter(bson_vector_float32_const_view_t *view_out, const bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { bson_subtype_t subtype; uint32_t binary_len; const uint8_t *binary; bson_iter_binary(iter, &subtype, &binary_len, &binary); return binary && subtype == BSON_SUBTYPE_VECTOR && bson_vector_float32_const_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_vector_packed_bit_view_from_iter(bson_vector_packed_bit_view_t *view_out, bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { uint32_t binary_len; uint8_t *binary; bson_iter_overwrite_binary(iter, BSON_SUBTYPE_VECTOR, &binary_len, &binary); return binary && bson_vector_packed_bit_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_vector_packed_bit_const_view_from_iter(bson_vector_packed_bit_const_view_t *view_out, const bson_iter_t *iter) { BSON_OPTIONAL_PARAM(view_out); BSON_ASSERT_PARAM(iter); if (BSON_ITER_HOLDS_BINARY(iter)) { bson_subtype_t subtype; uint32_t binary_len; const uint8_t *binary; bson_iter_binary(iter, &subtype, &binary_len, &binary); return binary && subtype == BSON_SUBTYPE_VECTOR && bson_vector_packed_bit_const_view_init(view_out, binary, binary_len); } else { return false; } } bool bson_append_vector_int8_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_int8_view_t *view_out) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(view_out); uint32_t length = bson_vector_int8_binary_data_length(element_count); if (length < BSON_VECTOR_HEADER_LEN) { return false; } uint8_t *binary; if (bson_append_binary_uninit(bson, key, key_length, BSON_SUBTYPE_VECTOR, &binary, length)) { bson_vector_binary_header_impl_t header = { .bytes[0] = bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_SIGNED_INT, BSON_VECTOR_ELEMENT_8_BITS), .bytes[1] = bson_vector_header_byte_1(0)}; memcpy(binary, header.bytes, BSON_VECTOR_HEADER_LEN); *view_out = (bson_vector_int8_view_t){.binary.data = binary, .binary.data_len = length, .binary.header_copy = header}; return true; } else { return false; } } bool bson_append_vector_float32_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_float32_view_t *view_out) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(view_out); uint32_t length = bson_vector_float32_binary_data_length(element_count); if (length < BSON_VECTOR_HEADER_LEN) { return false; } uint8_t *binary; if (bson_append_binary_uninit(bson, key, key_length, BSON_SUBTYPE_VECTOR, &binary, length)) { bson_vector_binary_header_impl_t header = { .bytes[0] = bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_FLOAT, BSON_VECTOR_ELEMENT_32_BITS), .bytes[1] = bson_vector_header_byte_1(0)}; memcpy(binary, header.bytes, BSON_VECTOR_HEADER_LEN); *view_out = (bson_vector_float32_view_t){.binary.data = binary, .binary.data_len = length, .binary.header_copy = header}; return true; } else { return false; } } bool bson_append_vector_packed_bit_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_packed_bit_view_t *view_out) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(view_out); uint32_t length = bson_vector_packed_bit_binary_data_length(element_count); if (length < BSON_VECTOR_HEADER_LEN) { return false; } uint8_t *binary; if (bson_append_binary_uninit(bson, key, key_length, BSON_SUBTYPE_VECTOR, &binary, length)) { mlib_diagnostic_push(); mlib_msvc_warning(disable : 4146); size_t padding = (size_t)7 & -element_count; mlib_diagnostic_pop(); bson_vector_binary_header_impl_t header = { .bytes[0] = bson_vector_header_byte_0(BSON_VECTOR_ELEMENT_UNSIGNED_INT, BSON_VECTOR_ELEMENT_1_BIT), .bytes[1] = bson_vector_header_byte_1(padding)}; memcpy(binary, header.bytes, BSON_VECTOR_HEADER_LEN); if (element_count > 0 && padding > 0) { // We must explicitly zero bits in the final byte that aren't part of any element. // No reason to read-modify-write here, it's better to write the whole byte. binary[length - 1u] = 0u; } *view_out = (bson_vector_packed_bit_view_t){ .binary.data = binary, .binary.data_len = length, .binary.header_copy = header}; return true; } else { return false; } } static bool bson_vector_from_array_expect_key(const bson_iter_t *iter, uint32_t numeric_key, bson_error_t *error) { char buffer[16]; const char *key; bson_uint32_to_string(numeric_key, &key, buffer, sizeof buffer); if (0 == strcmp(key, bson_iter_key(iter))) { return true; } else { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_KEY, "expected BSON array key '%s', found key '%s'", key, bson_iter_key(iter)); return false; } } static void bson_vector_set_error_max_size(bson_error_t *error) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_MAX_SIZE, "maximum BSON document size would be exceeded"); } bool bson_append_vector_int8_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(iter); uint32_t element_count = 0; { bson_iter_t validation_iter = *iter; while (bson_iter_next(&validation_iter)) { if (!bson_vector_from_array_expect_key(&validation_iter, element_count, error)) { return false; } if (!BSON_ITER_HOLDS_INT(&validation_iter)) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE, "expected int32 or int64 in BSON array key '%s', found item type 0x%02X", bson_iter_key(&validation_iter), (unsigned)bson_iter_type(&validation_iter)); return false; } int64_t element_as_int64 = bson_iter_as_int64(&validation_iter); if (element_as_int64 < INT8_MIN || element_as_int64 > INT8_MAX) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE, "BSON array key '%s' value %" PRId64 " is out of range for vector of int8", bson_iter_key(&validation_iter), element_as_int64); return false; } element_count++; } } bson_vector_int8_view_t view; if (!bson_append_vector_int8_uninit(bson, key, key_length, element_count, &view)) { bson_vector_set_error_max_size(error); return false; } bson_iter_t copy_iter = *iter; for (uint32_t i = 0; i < element_count; i++) { BSON_ASSERT(bson_iter_next(©_iter)); int8_t element = (int8_t)bson_iter_as_int64(©_iter); BSON_ASSERT(bson_vector_int8_view_write(view, &element, 1, i)); } return true; } bool bson_append_vector_float32_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(iter); uint32_t element_count = 0; { bson_iter_t validation_iter = *iter; while (bson_iter_next(&validation_iter)) { if (!bson_vector_from_array_expect_key(&validation_iter, element_count, error)) { return false; } if (!BSON_ITER_HOLDS_DOUBLE(&validation_iter)) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE, "expected 'double' number type in BSON array key '%s', found item type 0x%02X", bson_iter_key(&validation_iter), (unsigned)bson_iter_type(&validation_iter)); return false; } element_count++; } } bson_vector_float32_view_t view; if (!bson_append_vector_float32_uninit(bson, key, key_length, element_count, &view)) { bson_vector_set_error_max_size(error); return false; } bson_iter_t copy_iter = *iter; for (uint32_t i = 0; i < element_count; i++) { BSON_ASSERT(bson_iter_next(©_iter)); float element = (float)bson_iter_double(©_iter); BSON_ASSERT(bson_vector_float32_view_write(view, &element, 1, i)); } return true; } bool bson_append_vector_packed_bit_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(iter); uint32_t element_count = 0; { bson_iter_t validation_iter = *iter; while (bson_iter_next(&validation_iter)) { if (!bson_vector_from_array_expect_key(&validation_iter, element_count, error)) { return false; } if (!BSON_ITER_HOLDS_INT(&validation_iter) && !BSON_ITER_HOLDS_BOOL(&validation_iter)) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE, "expected int32, int64, or bool in BSON array key '%s', found item type 0x%02X", bson_iter_key(&validation_iter), (unsigned)bson_iter_type(&validation_iter)); return false; } int64_t element_as_int64 = bson_iter_as_int64(&validation_iter); if (element_as_int64 < 0 || element_as_int64 > 1) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE, "BSON array key '%s' value %" PRId64 " is out of range for vector of packed_bit", bson_iter_key(&validation_iter), element_as_int64); return false; } element_count++; } } bson_vector_packed_bit_view_t view; if (!bson_append_vector_packed_bit_uninit(bson, key, key_length, element_count, &view)) { bson_vector_set_error_max_size(error); return false; } bson_iter_t copy_iter = *iter; for (uint32_t i = 0; i < element_count; i++) { BSON_ASSERT(bson_iter_next(©_iter)); bool element_as_bool = (bool)bson_iter_as_int64(©_iter); BSON_ASSERT(bson_vector_packed_bit_view_pack_bool(view, &element_as_bool, 1, i)); } return true; } bool bson_array_builder_append_vector_int8_elements(bson_array_builder_t *builder, bson_vector_int8_const_view_t view) { BSON_ASSERT_PARAM(builder); size_t length = bson_vector_int8_const_view_length(view); for (size_t i = 0; i < length; i++) { // Note, the zero initializer is only needed due to a false positive -Wmaybe-uninitialized warning in uncommon // configurations where the compiler does not have visibility into memcpy(). int8_t element = 0; BSON_ASSERT(bson_vector_int8_const_view_read(view, &element, 1, i)); if (!bson_array_builder_append_int32(builder, (int32_t)element)) { return false; } } return true; } bool bson_array_builder_append_vector_float32_elements(bson_array_builder_t *builder, bson_vector_float32_const_view_t view) { BSON_ASSERT_PARAM(builder); size_t length = bson_vector_float32_const_view_length(view); for (size_t i = 0; i < length; i++) { float element; BSON_ASSERT(bson_vector_float32_const_view_read(view, &element, 1, i)); if (!bson_array_builder_append_double(builder, (double)element)) { return false; } } return true; } bool bson_array_builder_append_vector_packed_bit_elements(bson_array_builder_t *builder, bson_vector_packed_bit_const_view_t view) { BSON_ASSERT_PARAM(builder); size_t length = bson_vector_packed_bit_const_view_length(view); for (size_t i = 0; i < length; i++) { bool element; BSON_ASSERT(bson_vector_packed_bit_const_view_unpack_bool(view, &element, 1, i)); if (!bson_array_builder_append_int32(builder, element ? 1 : 0)) { return false; } } return true; } bool bson_array_builder_append_vector_elements(bson_array_builder_t *builder, const bson_iter_t *iter) { BSON_ASSERT_PARAM(builder); BSON_ASSERT_PARAM(iter); { bson_vector_int8_const_view_t view; if (bson_vector_int8_const_view_from_iter(&view, iter)) { return bson_array_builder_append_vector_int8_elements(builder, view); } } { bson_vector_float32_const_view_t view; if (bson_vector_float32_const_view_from_iter(&view, iter)) { return bson_array_builder_append_vector_float32_elements(builder, view); } } { bson_vector_packed_bit_const_view_t view; if (bson_vector_packed_bit_const_view_from_iter(&view, iter)) { return bson_array_builder_append_vector_packed_bit_elements(builder, view); } } return false; } bool bson_append_array_from_vector_int8(bson_t *bson, const char *key, int key_length, bson_vector_int8_const_view_t view) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); bson_array_builder_t *child; if (bson_append_array_builder_begin(bson, key, key_length, &child)) { bool ok = bson_array_builder_append_vector_int8_elements(child, view); return bson_append_array_builder_end(bson, child) && ok; } else { return false; } } bool bson_append_array_from_vector_float32(bson_t *bson, const char *key, int key_length, bson_vector_float32_const_view_t view) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); bson_array_builder_t *child; if (bson_append_array_builder_begin(bson, key, key_length, &child)) { bool ok = bson_array_builder_append_vector_float32_elements(child, view); return bson_append_array_builder_end(bson, child) && ok; } else { return false; } } bool bson_append_array_from_vector_packed_bit(bson_t *bson, const char *key, int key_length, bson_vector_packed_bit_const_view_t view) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); bson_array_builder_t *child; if (bson_append_array_builder_begin(bson, key, key_length, &child)) { bool ok = bson_array_builder_append_vector_packed_bit_elements(child, view); return bson_append_array_builder_end(bson, child) && ok; } else { return false; } } bool bson_append_array_from_vector(bson_t *bson, const char *key, int key_length, const bson_iter_t *iter) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(iter); bson_array_builder_t *child; if (bson_append_array_builder_begin(bson, key, key_length, &child)) { bool ok = bson_array_builder_append_vector_elements(child, iter); return bson_append_array_builder_end(bson, child) && ok; } else { return false; } } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-vector.h000066400000000000000000000567351511661753600227600ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VECTOR_H #define BSON_VECTOR_H #include #include #include #include #include BSON_BEGIN_DECLS // Length of the required header for BSON_SUBTYPE_VECTOR, in bytes #define BSON_VECTOR_HEADER_LEN 2 // Forward declaration (typedef bson_array_builder_t in bson.h) struct _bson_array_builder_t; /** @brief Error codes for domain BSON_ERROR_VECTOR */ typedef enum { BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE = 1, BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE, BSON_VECTOR_ERROR_ARRAY_KEY, BSON_VECTOR_ERROR_MAX_SIZE, } bson_vector_error_code_t; /** @brief Implementation detail. A copy of the BSON_SUBTYPE_VECTOR header, suitable for pass-by-value. */ typedef struct bson_vector_binary_header_impl_t { uint8_t bytes[BSON_VECTOR_HEADER_LEN]; } bson_vector_binary_header_impl_t; /** @brief Implementation detail. A reference to non-owned const BSON Binary data of subtype BSON_SUBTYPE_VECTOR */ typedef struct bson_vector_binary_const_view_impl_t { const uint8_t *data; uint32_t data_len; bson_vector_binary_header_impl_t header_copy; } bson_vector_binary_const_view_impl_t; /** @brief Implementation detail. A reference to non-owned BSON Binary data of subtype BSON_SUBTYPE_VECTOR */ typedef struct bson_vector_binary_view_impl_t { uint8_t *data; uint32_t data_len; bson_vector_binary_header_impl_t header_copy; } bson_vector_binary_view_impl_t; /** @brief Implementation detail. Obtain a const reference from a non-const reference without re-validating. */ static BSON_INLINE bson_vector_binary_const_view_impl_t bson_vector_binary_view_impl_as_const(bson_vector_binary_view_impl_t view) { bson_vector_binary_const_view_impl_t result; result.data = view.data; result.data_len = view.data_len; result.header_copy = view.header_copy; return result; } /** @brief A reference to non-owned BSON Binary data holding a valid Vector of int8 element type */ typedef struct bson_vector_int8_view_t { bson_vector_binary_view_impl_t binary; } bson_vector_int8_view_t; /** @brief A reference to non-owned const BSON Binary data holding a valid Vector of int8 element type */ typedef struct bson_vector_int8_const_view_t { bson_vector_binary_const_view_impl_t binary; } bson_vector_int8_const_view_t; /** @brief A reference to non-owned BSON Binary data holding a valid Vector of float32 element type */ typedef struct bson_vector_float32_view_t { bson_vector_binary_view_impl_t binary; } bson_vector_float32_view_t; /** @brief A reference to non-owned const BSON Binary data holding a valid Vector of float32 element type */ typedef struct bson_vector_float32_const_view_t { bson_vector_binary_const_view_impl_t binary; } bson_vector_float32_const_view_t; /** @brief A reference to non-owned BSON Binary data holding a valid Vector of packed_bit */ typedef struct bson_vector_packed_bit_view_t { bson_vector_binary_view_impl_t binary; } bson_vector_packed_bit_view_t; /** @brief A reference to non-owned const BSON Binary data holding a valid Vector of packed_bit */ typedef struct bson_vector_packed_bit_const_view_t { bson_vector_binary_const_view_impl_t binary; } bson_vector_packed_bit_const_view_t; static BSON_INLINE bson_vector_int8_const_view_t bson_vector_int8_view_as_const(bson_vector_int8_view_t view) { bson_vector_int8_const_view_t result; result.binary = bson_vector_binary_view_impl_as_const(view.binary); return result; } static BSON_INLINE bson_vector_float32_const_view_t bson_vector_float32_view_as_const(bson_vector_float32_view_t view) { bson_vector_float32_const_view_t result; result.binary = bson_vector_binary_view_impl_as_const(view.binary); return result; } static BSON_INLINE bson_vector_packed_bit_const_view_t bson_vector_packed_bit_view_as_const(bson_vector_packed_bit_view_t view) { bson_vector_packed_bit_const_view_t result; result.binary = bson_vector_binary_view_impl_as_const(view.binary); return result; } BSON_EXPORT(bool) bson_vector_int8_view_init(bson_vector_int8_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_int8_const_view_init(bson_vector_int8_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_float32_view_init(bson_vector_float32_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_float32_const_view_init(bson_vector_float32_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_packed_bit_view_init(bson_vector_packed_bit_view_t *view_out, uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_packed_bit_const_view_init(bson_vector_packed_bit_const_view_t *view_out, const uint8_t *binary_data, uint32_t binary_data_len); BSON_EXPORT(bool) bson_vector_int8_view_from_iter(bson_vector_int8_view_t *view_out, bson_iter_t *iter); BSON_EXPORT(bool) bson_vector_int8_const_view_from_iter(bson_vector_int8_const_view_t *view_out, const bson_iter_t *iter); BSON_EXPORT(bool) bson_vector_float32_view_from_iter(bson_vector_float32_view_t *view_out, bson_iter_t *iter); BSON_EXPORT(bool) bson_vector_float32_const_view_from_iter(bson_vector_float32_const_view_t *view_out, const bson_iter_t *iter); BSON_EXPORT(bool) bson_vector_packed_bit_view_from_iter(bson_vector_packed_bit_view_t *view_out, bson_iter_t *iter); BSON_EXPORT(bool) bson_vector_packed_bit_const_view_from_iter(bson_vector_packed_bit_const_view_t *view_out, const bson_iter_t *iter); BSON_EXPORT(bool) bson_array_builder_append_vector_int8_elements(struct _bson_array_builder_t *builder, bson_vector_int8_const_view_t view); BSON_EXPORT(bool) bson_array_builder_append_vector_float32_elements(struct _bson_array_builder_t *builder, bson_vector_float32_const_view_t view); BSON_EXPORT(bool) bson_array_builder_append_vector_packed_bit_elements(struct _bson_array_builder_t *builder, bson_vector_packed_bit_const_view_t view); BSON_EXPORT(bool) bson_array_builder_append_vector_elements(struct _bson_array_builder_t *builder, const bson_iter_t *iter); BSON_EXPORT(bool) bson_append_vector_int8_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_int8_view_t *view_out); #define BSON_APPEND_VECTOR_INT8_UNINIT(b, key, count, view) \ bson_append_vector_int8_uninit(b, key, (int)strlen(key), count, view) BSON_EXPORT(bool) bson_append_vector_float32_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_float32_view_t *view_out); #define BSON_APPEND_VECTOR_FLOAT32_UNINIT(b, key, count, view) \ bson_append_vector_float32_uninit(b, key, (int)strlen(key), count, view) BSON_EXPORT(bool) bson_append_vector_packed_bit_uninit( bson_t *bson, const char *key, int key_length, size_t element_count, bson_vector_packed_bit_view_t *view_out); #define BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(b, key, count, view) \ bson_append_vector_packed_bit_uninit(b, key, (int)strlen(key), count, view) BSON_EXPORT(bool) bson_append_vector_int8_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); #define BSON_APPEND_VECTOR_INT8_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_int8_from_array(b, key, (int)strlen(key), iter, err) BSON_EXPORT(bool) bson_append_vector_float32_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); #define BSON_APPEND_VECTOR_FLOAT32_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_float32_from_array(b, key, (int)strlen(key), iter, err) BSON_EXPORT(bool) bson_append_vector_packed_bit_from_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, bson_error_t *error); #define BSON_APPEND_VECTOR_PACKED_BIT_FROM_ARRAY(b, key, iter, err) \ bson_append_vector_packed_bit_from_array(b, key, (int)strlen(key), iter, err) BSON_EXPORT(bool) bson_append_array_from_vector_int8(bson_t *bson, const char *key, int key_length, bson_vector_int8_const_view_t view); #define BSON_APPEND_ARRAY_FROM_VECTOR_INT8(b, key, view) \ bson_append_array_from_vector_int8(b, key, (int)strlen(key), view) BSON_EXPORT(bool) bson_append_array_from_vector_float32(bson_t *bson, const char *key, int key_length, bson_vector_float32_const_view_t view); #define BSON_APPEND_ARRAY_FROM_VECTOR_FLOAT32(b, key, view) \ bson_append_array_from_vector_float32(b, key, (int)strlen(key), view) BSON_EXPORT(bool) bson_append_array_from_vector_packed_bit(bson_t *bson, const char *key, int key_length, bson_vector_packed_bit_const_view_t view); #define BSON_APPEND_ARRAY_FROM_VECTOR_PACKED_BIT(b, key, view) \ bson_append_array_from_vector_packed_bit(b, key, (int)strlen(key), view) static BSON_INLINE const int8_t * bson_vector_int8_const_view_pointer(bson_vector_int8_const_view_t view) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (const int8_t *)(view.binary.data + BSON_VECTOR_HEADER_LEN); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } static BSON_INLINE int8_t * bson_vector_int8_view_pointer(bson_vector_int8_view_t view) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return (int8_t *)(view.binary.data + BSON_VECTOR_HEADER_LEN); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } static BSON_INLINE uint32_t bson_vector_int8_binary_data_length(size_t element_count) { const size_t max_representable = (size_t)UINT32_MAX - (size_t)BSON_VECTOR_HEADER_LEN; return element_count > max_representable ? 0u : (uint32_t)element_count + (uint32_t)BSON_VECTOR_HEADER_LEN; } static BSON_INLINE uint32_t bson_vector_float32_binary_data_length(size_t element_count) { const size_t max_representable = ((size_t)UINT32_MAX - (size_t)BSON_VECTOR_HEADER_LEN) / sizeof(float); return element_count > max_representable ? 0u : (uint32_t)element_count * sizeof(float) + (uint32_t)BSON_VECTOR_HEADER_LEN; } static BSON_INLINE uint32_t bson_vector_packed_bit_binary_data_length(size_t element_count) { const size_t max_representable = (size_t)BSON_MIN((uint64_t)SIZE_MAX, ((uint64_t)UINT32_MAX - (uint64_t)BSON_VECTOR_HEADER_LEN) * 8u); return element_count > max_representable ? 0u : (uint32_t)(((uint64_t)element_count + 7u) / 8u) + (uint32_t)BSON_VECTOR_HEADER_LEN; } static BSON_INLINE size_t bson_vector_int8_const_view_length(bson_vector_int8_const_view_t view) { return view.binary.data_len - (uint32_t)BSON_VECTOR_HEADER_LEN; } static BSON_INLINE size_t bson_vector_int8_view_length(bson_vector_int8_view_t view) { return bson_vector_int8_const_view_length(bson_vector_int8_view_as_const(view)); } static BSON_INLINE size_t bson_vector_float32_const_view_length(bson_vector_float32_const_view_t view) { return (view.binary.data_len - (uint32_t)BSON_VECTOR_HEADER_LEN) / (uint32_t)sizeof(float); } static BSON_INLINE size_t bson_vector_float32_view_length(bson_vector_float32_view_t view) { return bson_vector_float32_const_view_length(bson_vector_float32_view_as_const(view)); } static BSON_INLINE size_t bson_vector_packed_bit_const_view_length_bytes(bson_vector_packed_bit_const_view_t view) { return view.binary.data_len - (uint32_t)BSON_VECTOR_HEADER_LEN; } static BSON_INLINE size_t bson_vector_packed_bit_view_length_bytes(bson_vector_packed_bit_view_t view) { return bson_vector_packed_bit_const_view_length_bytes(bson_vector_packed_bit_view_as_const(view)); } // Implementation detail, not part of documented API. static BSON_INLINE size_t bson_vector_padding_from_header_byte_1(uint8_t byte_1) { return byte_1 & 7; } static BSON_INLINE size_t bson_vector_packed_bit_const_view_padding(bson_vector_packed_bit_const_view_t view) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN return bson_vector_padding_from_header_byte_1(view.binary.header_copy.bytes[1]); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } static BSON_INLINE size_t bson_vector_packed_bit_view_padding(bson_vector_packed_bit_view_t view) { return bson_vector_packed_bit_const_view_padding(bson_vector_packed_bit_view_as_const(view)); } static BSON_INLINE size_t bson_vector_packed_bit_const_view_length(bson_vector_packed_bit_const_view_t view) { return bson_vector_packed_bit_const_view_length_bytes(view) * 8u - bson_vector_packed_bit_const_view_padding(view); } static BSON_INLINE size_t bson_vector_packed_bit_view_length(bson_vector_packed_bit_view_t view) { return bson_vector_packed_bit_const_view_length(bson_vector_packed_bit_view_as_const(view)); } static BSON_INLINE bool bson_vector_int8_const_view_read(bson_vector_int8_const_view_t view, int8_t *BSON_RESTRICT values_out, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_int8_const_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(values_out, bson_vector_int8_const_view_pointer(view) + vector_offset_elements, element_count); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } static BSON_INLINE bool bson_vector_int8_view_read(bson_vector_int8_view_t view, int8_t *BSON_RESTRICT values_out, size_t element_count, uint32_t vector_offset_elements) { return bson_vector_int8_const_view_read( bson_vector_int8_view_as_const(view), values_out, element_count, vector_offset_elements); } static BSON_INLINE bool bson_vector_int8_view_write(bson_vector_int8_view_t view, const int8_t *BSON_RESTRICT values, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_int8_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(bson_vector_int8_view_pointer(view) + vector_offset_elements, values, element_count); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } BSON_STATIC_ASSERT2(float_is_float32, sizeof(float) == 4); static BSON_INLINE bool bson_vector_float32_const_view_read(bson_vector_float32_const_view_t view, float *BSON_RESTRICT values_out, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_float32_const_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { size_t byte_offset = BSON_VECTOR_HEADER_LEN + vector_offset_elements * 4; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN memcpy(values_out, view.binary.data + byte_offset, element_count * 4); #else size_t i; for (i = 0; i < element_count; i++) { float aligned_tmp; memcpy(&aligned_tmp, view.binary.data + byte_offset + i * 4, 4); values_out[i] = BSON_FLOAT_FROM_LE(aligned_tmp); } #endif BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } static BSON_INLINE bool bson_vector_float32_view_read(bson_vector_float32_view_t view, float *BSON_RESTRICT values_out, size_t element_count, size_t vector_offset_elements) { return bson_vector_float32_const_view_read( bson_vector_float32_view_as_const(view), values_out, element_count, vector_offset_elements); } static BSON_INLINE bool bson_vector_float32_view_write(bson_vector_float32_view_t view, const float *BSON_RESTRICT values, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_float32_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { size_t byte_offset = BSON_VECTOR_HEADER_LEN + vector_offset_elements * 4; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN #if BSON_BYTE_ORDER == BSON_LITTLE_ENDIAN memcpy(view.binary.data + byte_offset, values, element_count * 4); #else size_t i; for (i = 0; i < element_count; i++) { float aligned_tmp = BSON_FLOAT_TO_LE(values[i]); memcpy(view.binary.data + byte_offset + i * 4, &aligned_tmp, 4); } #endif BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } static BSON_INLINE bool bson_vector_packed_bit_const_view_read_packed(bson_vector_packed_bit_const_view_t view, uint8_t *BSON_RESTRICT packed_values_out, size_t byte_count, size_t vector_offset_bytes) { size_t length_bytes = bson_vector_packed_bit_const_view_length_bytes(view); if (BSON_LIKELY(vector_offset_bytes <= length_bytes && byte_count <= length_bytes - vector_offset_bytes)) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN memcpy(packed_values_out, view.binary.data + BSON_VECTOR_HEADER_LEN + vector_offset_bytes, byte_count); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } static BSON_INLINE bool bson_vector_packed_bit_view_read_packed(bson_vector_packed_bit_view_t view, uint8_t *BSON_RESTRICT packed_values_out, size_t byte_count, size_t vector_offset_bytes) { return bson_vector_packed_bit_const_view_read_packed( bson_vector_packed_bit_view_as_const(view), packed_values_out, byte_count, vector_offset_bytes); } static BSON_INLINE bool bson_vector_packed_bit_view_write_packed(bson_vector_packed_bit_view_t view, const uint8_t *BSON_RESTRICT packed_values, size_t byte_count, size_t vector_offset_bytes) { size_t length_bytes = bson_vector_packed_bit_view_length_bytes(view); if (BSON_LIKELY(vector_offset_bytes <= length_bytes && byte_count <= length_bytes - vector_offset_bytes)) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN if (byte_count == length_bytes - vector_offset_bytes && byte_count >= 1u) { // This write touches the last byte in the vector: // special-case that byte so we can ensure unused bits remain set to zero. size_t other_bytes = byte_count - 1u; memcpy(view.binary.data + BSON_VECTOR_HEADER_LEN + vector_offset_bytes, packed_values, other_bytes); view.binary.data[BSON_VECTOR_HEADER_LEN + vector_offset_bytes + other_bytes] = (UINT8_C(0xFF) << bson_vector_packed_bit_view_padding(view)) & packed_values[other_bytes]; } else { memcpy(view.binary.data + BSON_VECTOR_HEADER_LEN + vector_offset_bytes, packed_values, byte_count); } BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END return true; } else { return false; } } static BSON_INLINE bool bson_vector_packed_bit_const_view_unpack_bool(bson_vector_packed_bit_const_view_t view, bool *BSON_RESTRICT unpacked_values_out, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_packed_bit_const_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { size_t i; for (i = 0; i < element_count; i++) { size_t element_index = vector_offset_elements + i; BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN uint8_t packed_byte = view.binary.data[BSON_VECTOR_HEADER_LEN + (element_index >> 3)]; unpacked_values_out[i] = 0 != (packed_byte & ((uint8_t)0x80 >> (element_index & 7))); BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } return true; } else { return false; } } static BSON_INLINE bool bson_vector_packed_bit_view_unpack_bool(bson_vector_packed_bit_view_t view, bool *BSON_RESTRICT unpacked_values_out, size_t element_count, size_t vector_offset_elements) { return bson_vector_packed_bit_const_view_unpack_bool( bson_vector_packed_bit_view_as_const(view), unpacked_values_out, element_count, vector_offset_elements); } static BSON_INLINE bool bson_vector_packed_bit_view_pack_bool(bson_vector_packed_bit_view_t view, const bool *BSON_RESTRICT unpacked_values, size_t element_count, size_t vector_offset_elements) { size_t length = bson_vector_packed_bit_view_length(view); if (BSON_LIKELY(vector_offset_elements <= length && element_count <= length - vector_offset_elements)) { while (element_count > 0) { BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN uint8_t *BSON_RESTRICT packed_byte = BSON_VECTOR_HEADER_LEN + (vector_offset_elements >> 3) + view.binary.data; if (element_count >= 8 && (vector_offset_elements & 7) == 0) { uint8_t complete_byte = 0; unsigned i; for (i = 0; i < 8; i++) { complete_byte |= unpacked_values[i] ? ((uint8_t)0x80 >> i) : 0; } *packed_byte = complete_byte; unpacked_values += 8; vector_offset_elements += 8; element_count -= 8; } else { uint8_t mask = (uint8_t)0x80 >> (vector_offset_elements & 7); *packed_byte = (*packed_byte & ~mask) | (*unpacked_values ? mask : 0); unpacked_values++; vector_offset_elements++; element_count--; } BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END } return true; } else { return false; } } BSON_END_DECLS #endif /* BSON_VECTOR_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-version-functions.c000066400000000000000000000031731511661753600251300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include /** * bson_get_major_version: * * Helper function to return the runtime major version of the library. */ int bson_get_major_version(void) { return BSON_MAJOR_VERSION; } /** * bson_get_minor_version: * * Helper function to return the runtime minor version of the library. */ int bson_get_minor_version(void) { return BSON_MINOR_VERSION; } /** * bson_get_micro_version: * * Helper function to return the runtime micro version of the library. */ int bson_get_micro_version(void) { return BSON_MICRO_VERSION; } /** * bson_get_version: * * Helper function to return the runtime string version of the library. */ const char * bson_get_version(void) { return BSON_VERSION_S; } /** * bson_check_version: * * True if libmongoc's version is greater than or equal to the required * version. */ bool bson_check_version(int required_major, int required_minor, int required_micro) { return BSON_CHECK_VERSION(required_major, required_minor, required_micro); } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-version-functions.h000066400000000000000000000021111511661753600251240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_VERSION_FUNCTIONS_H #define BSON_VERSION_FUNCTIONS_H #include BSON_BEGIN_DECLS BSON_EXPORT(int) bson_get_major_version(void); BSON_EXPORT(int) bson_get_minor_version(void); BSON_EXPORT(int) bson_get_micro_version(void); BSON_EXPORT(const char *) bson_get_version(void); BSON_EXPORT(bool) bson_check_version(int required_major, int required_minor, int required_micro); BSON_END_DECLS #endif /* BSON_VERSION_FUNCTIONS_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson-writer.c000066400000000000000000000152621511661753600227530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include struct _bson_writer_t { bool ready; uint8_t **buf; size_t *buflen; size_t offset; bson_realloc_func realloc_func; void *realloc_func_ctx; bson_t b; }; /* *-------------------------------------------------------------------------- * * bson_writer_new -- * * Creates a new instance of bson_writer_t using the buffer, length, * offset, and realloc() function supplied. * * The caller is expected to clean up the structure when finished * using bson_writer_destroy(). * * Parameters: * @buf: (inout): A pointer to a target buffer. * @buflen: (inout): A pointer to the buffer length. * @offset: The offset in the target buffer to start from. * @realloc_func: A realloc() style function or NULL. * * Returns: * A newly allocated bson_writer_t that should be freed with * bson_writer_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ bson_writer_t * bson_writer_new(uint8_t **buf, /* IN */ size_t *buflen, /* IN */ size_t offset, /* IN */ bson_realloc_func realloc_func, /* IN */ void *realloc_func_ctx) /* IN */ { bson_writer_t *writer; writer = BSON_ALIGNED_ALLOC0(bson_writer_t); writer->buf = buf; writer->buflen = buflen; writer->offset = offset; writer->realloc_func = realloc_func; writer->realloc_func_ctx = realloc_func_ctx; writer->ready = true; return writer; } /* *-------------------------------------------------------------------------- * * bson_writer_destroy -- * * Cleanup after @writer and release any allocated memory. Note that * the buffer supplied to bson_writer_new() is NOT freed from this * method. The caller is responsible for that. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_destroy(bson_writer_t *writer) /* IN */ { bson_free(writer); } /* *-------------------------------------------------------------------------- * * bson_writer_get_length -- * * Fetches the current length of the content written by the buffer * (including the initial offset). This includes a partly written * document currently being written. * * This is useful if you want to check to see if you've passed a given * memory boundary that cannot be sent in a packet. See * bson_writer_rollback() to abort the current document being written. * * Returns: * The number of bytes written plus initial offset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ size_t bson_writer_get_length(bson_writer_t *writer) /* IN */ { return writer->offset + writer->b.len; } /* *-------------------------------------------------------------------------- * * bson_writer_begin -- * * Begins writing a new document. The caller may use the bson * structure to write out a new BSON document. When completed, the * caller must call either bson_writer_end() or * bson_writer_rollback(). * * Parameters: * @writer: A bson_writer_t. * @bson: (out): A location for a bson_t*. * * Returns: * true if the underlying realloc was successful; otherwise false. * * Side effects: * @bson is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_writer_begin(bson_writer_t *writer, /* IN */ bson_t **bson) /* OUT */ { bson_impl_alloc_t *b; bool grown = false; BSON_ASSERT(writer); BSON_ASSERT(writer->ready); BSON_ASSERT(bson); writer->ready = false; memset(&writer->b, 0, sizeof(bson_t)); b = (bson_impl_alloc_t *)&writer->b; b->flags = BSON_FLAG_STATIC | BSON_FLAG_NO_FREE; b->len = 5; b->parent = NULL; b->buf = writer->buf; b->buflen = writer->buflen; b->offset = writer->offset; b->alloc = NULL; b->alloclen = 0; b->realloc = writer->realloc_func; b->realloc_func_ctx = writer->realloc_func_ctx; while ((writer->offset + writer->b.len) > *writer->buflen) { if (!writer->realloc_func) { memset(&writer->b, 0, sizeof(bson_t)); writer->ready = true; return false; } grown = true; if (!*writer->buflen) { *writer->buflen = 64; } else { (*writer->buflen) *= 2; } } if (grown) { *writer->buf = writer->realloc_func(*writer->buf, *writer->buflen, writer->realloc_func_ctx); } memset((*writer->buf) + writer->offset + 1, 0, 5); (*writer->buf)[writer->offset] = 5; *bson = &writer->b; return true; } /* *-------------------------------------------------------------------------- * * bson_writer_end -- * * Complete writing of a bson_writer_t to the buffer supplied. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_end(bson_writer_t *writer) /* IN */ { BSON_ASSERT(writer); BSON_ASSERT(!writer->ready); writer->offset += writer->b.len; memset(&writer->b, 0, sizeof(bson_t)); writer->ready = true; } /* *-------------------------------------------------------------------------- * * bson_writer_rollback -- * * Abort the appending of the current bson_t to the memory region * managed by @writer. This is useful if you detected that you went * past a particular memory limit. For example, MongoDB has 48MB * message limits. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_writer_rollback(bson_writer_t *writer) /* IN */ { BSON_ASSERT(writer); if (writer->b.len) { memset(&writer->b, 0, sizeof(bson_t)); } writer->ready = true; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson-writer.h000066400000000000000000000033361511661753600227570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_WRITER_H #define BSON_WRITER_H #include #include #include BSON_BEGIN_DECLS /** * bson_writer_t: * * The bson_writer_t structure is a helper for writing a series of BSON * documents to a single malloc() buffer. You can provide a realloc() style * function to grow the buffer as you go. * * This is useful if you want to build a series of BSON documents right into * the target buffer for an outgoing packet. The offset parameter allows you to * start at an offset of the target buffer. */ typedef struct _bson_writer_t bson_writer_t; BSON_EXPORT(bson_writer_t *) bson_writer_new(uint8_t **buf, size_t *buflen, size_t offset, bson_realloc_func realloc_func, void *realloc_func_ctx); BSON_EXPORT(void) bson_writer_destroy(bson_writer_t *writer); BSON_EXPORT(size_t) bson_writer_get_length(bson_writer_t *writer); BSON_EXPORT(bool) bson_writer_begin(bson_writer_t *writer, bson_t **bson); BSON_EXPORT(void) bson_writer_end(bson_writer_t *writer); BSON_EXPORT(void) bson_writer_rollback(bson_writer_t *writer); BSON_END_DECLS #endif /* BSON_WRITER_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson.c000066400000000000000000002345121511661753600214420ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Globals. */ static const uint8_t gZero = 0; /* *-------------------------------------------------------------------------- * * _bson_round_up_alloc_size -- * * Given a potential allocation length in bytes, round up to the * next power of two without exceeding BSON_MAX_SIZE. * * Returns: * If the input is <= BSON_MAX_SIZE, returns a value >= the input * and still <= BSON_MAX_SIZE. If the input was greater than * BSON_MAX_SIZE, it is returned unmodified. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE size_t _bson_round_up_alloc_size(size_t size) { if (size <= BSON_MAX_SIZE) { size_t power_of_two = bson_next_power_of_two(size); return BSON_MIN(power_of_two, BSON_MAX_SIZE); } else { return size; } } /* *-------------------------------------------------------------------------- * * _bson_impl_inline_grow -- * * Document growth implementation for documents that currently * contain stack based buffers. The document may be switched to * a malloc based buffer. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_impl_inline_grow(bson_impl_inline_t *impl, /* IN */ uint32_t grow_size) /* IN */ { bson_impl_alloc_t *alloc = (bson_impl_alloc_t *)impl; uint8_t *data; MONGOC_DEBUG_ASSERT((size_t)impl->len <= BSON_MAX_SIZE); MONGOC_DEBUG_ASSERT((size_t)grow_size <= BSON_MAX_SIZE); size_t req = (size_t)impl->len + (size_t)grow_size; if (req <= sizeof impl->data) { return true; } req = _bson_round_up_alloc_size(req); if (req <= BSON_MAX_SIZE) { data = bson_malloc(req); memcpy(data, impl->data, impl->len); alloc->flags &= ~BSON_FLAG_INLINE; alloc->parent = NULL; alloc->depth = 0; alloc->buf = &alloc->alloc; alloc->buflen = &alloc->alloclen; alloc->offset = 0; alloc->alloc = data; alloc->alloclen = req; alloc->realloc = bson_realloc_ctx; alloc->realloc_func_ctx = NULL; return true; } return false; } /* *-------------------------------------------------------------------------- * * _bson_impl_alloc_grow -- * * Document growth implementation for non-inline documents, possibly * containing a reallocatable buffer. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow * or an attempt to grow a buffer with no realloc implementation. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_impl_alloc_grow(bson_impl_alloc_t *impl, /* IN */ uint32_t grow_size) /* IN */ { /* Determine how many bytes we need for this document in the buffer * including necessary trailing bytes for parent documents. * * On size assumptions: the previous grow operation has already checked * (len + offset + previous_depth) against BSON_MAX_SIZE. Current depth can be at most (previous_depth + 1). The * caller has checked grow_size against BSON_MAX_SIZE. On the smallest (32-bit) supported size_t, we can still add * these maximum values (2x BSON_MAX_SIZE, 1 additional byte of depth) without arithmetic overflow. */ MONGOC_DEBUG_ASSERT((uint64_t)impl->len + (uint64_t)impl->offset + (uint64_t)impl->depth <= (uint64_t)BSON_MAX_SIZE); MONGOC_DEBUG_ASSERT((size_t)grow_size <= BSON_MAX_SIZE); size_t req = impl->offset + (size_t)impl->len + (size_t)grow_size + (size_t)impl->depth; if (req <= *impl->buflen) { return true; } req = _bson_round_up_alloc_size(req); if ((req <= BSON_MAX_SIZE) && impl->realloc) { *impl->buf = impl->realloc(*impl->buf, req, impl->realloc_func_ctx); *impl->buflen = req; return true; } return false; } /* *-------------------------------------------------------------------------- * * _bson_grow -- * * Grows the bson_t structure to be large enough to contain @grow_size * bytes in addition to its current content. * * The caller is responsible for ensuring @grow_size itself is not * above BSON_MAX_SIZE, but a final determination of overflow status * can't be made until we are inside _bson_impl_*_grow(). * * Returns: * true if successful, false if the size would overflow or the buffer * needs to grow but does not support reallocation. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_grow(bson_t *bson, /* IN */ uint32_t grow_size) /* IN */ { BSON_ASSERT((size_t)grow_size <= BSON_MAX_SIZE); if ((bson->flags & BSON_FLAG_INLINE)) { return _bson_impl_inline_grow((bson_impl_inline_t *)bson, grow_size); } return _bson_impl_alloc_grow((bson_impl_alloc_t *)bson, grow_size); } /* *-------------------------------------------------------------------------- * * _bson_data -- * * A helper function to return the contents of the bson document * taking into account the polymorphic nature of bson_t. * * Returns: * A buffer which should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE uint8_t * _bson_data(const bson_t *bson) /* IN */ { if ((bson->flags & BSON_FLAG_INLINE)) { return ((bson_impl_inline_t *)bson)->data; } else { bson_impl_alloc_t *impl = (bson_impl_alloc_t *)bson; return (*impl->buf) + impl->offset; } } /* *-------------------------------------------------------------------------- * * _bson_encode_length -- * * Helper to encode the length of the bson_t in the first 4 bytes * of the bson document. Little endian format is used as specified * by bsonspec. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static BSON_INLINE void _bson_encode_length(bson_t *bson) /* IN */ { mlib_write_u32le(_bson_data(bson), bson->len); } typedef struct _bson_append_bytes_arg { const uint8_t *bytes; // Optional. uint32_t length; // > 0. } _bson_append_bytes_arg; typedef struct _bson_append_bytes_list { _bson_append_bytes_arg args[8]; // Arbitrary length: just needs to be large enough. _bson_append_bytes_arg *current; // "Insert"/"End" pointer. uint32_t n_bytes; // Total bytes to be appended. } _bson_append_bytes_list; // To support unchecked cast from non-negative `int` to `size_t`. BSON_STATIC_ASSERT2(size_t_gte_int, SIZE_MAX >= INT_MAX); // To support unchecked cast from `uint32_t` to `size_t`. BSON_STATIC_ASSERT2(size_t_gte_uint32_t, SIZE_MAX >= UINT32_MAX); // Support largest _bson_impl_alloc_grow on smallest size_t BSON_STATIC_ASSERT2(max_alloc_grow_fits_min_sizet, (uint64_t)BSON_MAX_SIZE * 2u + 1u <= (uint64_t)UINT32_MAX); // Declare local state with the identifier `ident`. #define BSON_APPEND_BYTES_LIST_DECLARE(ident) \ _bson_append_bytes_list ident = {.current = (ident).args, .n_bytes = 0u}; \ ((void)0) // Add a bytes+length pair only if `_length > 0`. // Append failure if `n_bytes` will exceed BSON max size. #define BSON_APPEND_BYTES_ADD_ARGUMENT(_list, _bytes, _length) \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (BSON_UNLIKELY((_length) > BSON_MAX_SIZE - (_list).n_bytes)) { \ mlib_diagnostic_pop(); \ goto append_failure; \ } else if ((_length) > 0) { \ *(_list).current++ = (_bson_append_bytes_arg){ \ .bytes = (const uint8_t *)(_bytes), \ .length = (_length), \ }; \ (_list).n_bytes += (_length); \ } else \ ((void)0) // Add a UTF-8 string only if no embedded null bytes are present. // Uses `strlen (_key)` when `_key_len < 0`, otherwise uses `_key_len`. #define BSON_APPEND_BYTES_ADD_CHECKED_STRING(_list, _key, _key_len) \ uint32_t BSON_CONCAT(key_ulen_, __LINE__); \ if ((_key_len) < 0) { \ const size_t key_zulen = strlen((_key)); \ if (BSON_UNLIKELY(key_zulen > UINT32_MAX)) { \ goto append_failure; \ } \ BSON_CONCAT(key_ulen_, __LINE__) = (uint32_t)key_zulen; \ } else { \ const size_t key_zulen = (size_t)(_key_len); \ if (BSON_UNLIKELY(key_zulen > UINT32_MAX)) { \ goto append_failure; \ } /* Necessary to validate embedded NULL is not present in key. */ \ else if (memchr((_key), '\0', key_zulen) != NULL) { \ goto append_failure; \ } else { \ BSON_CONCAT(key_ulen_, __LINE__) = (uint32_t)key_zulen; \ } \ } \ BSON_APPEND_BYTES_ADD_ARGUMENT((_list), (_key), BSON_CONCAT(key_ulen_, __LINE__)) // Apply the list of arguments to be appended to `_bson`. // Append failure if adding `_list.n_bytes` will exceed BSON max size. #define BSON_APPEND_BYTES_APPLY_ARGUMENTS(_bson, _list) \ if (BSON_UNLIKELY((_list).n_bytes > BSON_MAX_SIZE - (_bson)->len)) { \ goto append_failure; \ } else if (BSON_UNLIKELY(!_bson_grow((_bson), (_list).n_bytes))) { \ goto append_failure; \ } else { \ uint8_t *data = _bson_data((_bson)) + ((_bson)->len - 1u); \ for (const _bson_append_bytes_arg *arg = (_list).args; arg != (_list).current; ++arg) { \ if (arg->bytes) { \ memcpy(data, arg->bytes, arg->length); \ } \ (_bson)->len += arg->length; \ data += arg->length; \ } \ _bson_encode_length((_bson)); \ data[0] = '\0'; \ } \ ((void)0) /* *-------------------------------------------------------------------------- * * _bson_append_bson_begin -- * * Begin appending a subdocument or subarray to the document using * the key provided by @key. * * If @key_length is < 0, then strlen() will be called on @key * to determine the length. * * @key_type MUST be either BSON_TYPE_DOCUMENT or BSON_TYPE_ARRAY. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ static bool _bson_append_bson_begin(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_type_t child_type, /* IN */ bson_t *child) /* OUT */ { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(child); BSON_ASSERT(!(bson->flags & BSON_FLAG_RDONLY)); BSON_ASSERT(!(bson->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT((child_type == BSON_TYPE_DOCUMENT) || (child_type == BSON_TYPE_ARRAY)); { BSON_APPEND_BYTES_LIST_DECLARE(args); const uint8_t type = (uint8_t)child_type; BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); /* * If the parent is an inline bson_t, then we need to convert * it to a heap allocated buffer. This makes extending buffers * of child bson documents much simpler logic, as they can just * realloc the *buf pointer. */ if ((bson->flags & BSON_FLAG_INLINE)) { BSON_ASSERT(bson->len <= 120); if (!_bson_grow(bson, 128 - bson->len)) { return false; } BSON_ASSERT(!(bson->flags & BSON_FLAG_INLINE)); } const uint8_t empty[5] = {5}; BSON_APPEND_BYTES_ADD_ARGUMENT(args, &empty, sizeof(empty)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); goto append_success; append_failure: return false; } append_success: ((void)0); bson_impl_alloc_t *aparent = (bson_impl_alloc_t *)bson; bson_impl_alloc_t *achild = (bson_impl_alloc_t *)child; /* * Mark the document as working on a child document so that no * further modifications can happen until the caller has called * bson_append_{document,array}_end(). */ bson->flags |= BSON_FLAG_IN_CHILD; /* * Initialize the child bson_t structure and point it at the parents * buffers. This allows us to realloc directly from the child without * walking up to the parent bson_t. */ achild->flags = (BSON_FLAG_CHILD | BSON_FLAG_NO_FREE | BSON_FLAG_STATIC); if ((bson->flags & BSON_FLAG_CHILD)) { achild->depth = ((bson_impl_alloc_t *)bson)->depth + 1; } else { achild->depth = 1; } achild->parent = bson; achild->buf = aparent->buf; achild->buflen = aparent->buflen; achild->offset = aparent->offset + aparent->len - 1 - 5; achild->len = 5; achild->alloc = NULL; achild->alloclen = 0; achild->realloc = aparent->realloc; achild->realloc_func_ctx = aparent->realloc_func_ctx; return true; } /* *-------------------------------------------------------------------------- * * _bson_append_bson_end -- * * Complete a call to _bson_append_bson_begin. * * Returns: * true if successful. * * Side effects: * @child is destroyed and no longer valid after calling this * function. * *-------------------------------------------------------------------------- */ static bool _bson_append_bson_end(bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT(bson); BSON_ASSERT((bson->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT(!(child->flags & BSON_FLAG_IN_CHILD)); /* * Unmark the IN_CHILD flag. */ bson->flags &= ~BSON_FLAG_IN_CHILD; /* * Now that we are done building the sub-document, add the size to the * parent, not including the default 5 byte empty document already added. */ bson->len = (bson->len + child->len - 5); /* * Ensure we have a \0 byte at the end and proper length encoded at * the beginning of the document. */ _bson_data(bson)[bson->len - 1] = '\0'; _bson_encode_length(bson); return true; } /* *-------------------------------------------------------------------------- * * bson_append_array_begin -- * * Start appending a new array. * * Use @child to append to the data area for the given field. * * It is a programming error to call any other bson function on * @bson until bson_append_array_end() has been called. It is * valid to call bson_append*() functions on @child. * * This function is useful to allow building nested documents using * a single buffer owned by the top-level bson document. * * Returns: * true if successful; otherwise false and @child is invalid. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_append_array_begin(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT(bson); BSON_ASSERT(key); BSON_ASSERT(child); return _bson_append_bson_begin(bson, key, key_length, BSON_TYPE_ARRAY, child); } /* *-------------------------------------------------------------------------- * * bson_append_array_end -- * * Complete a call to bson_append_array_begin(). * * It is safe to append other fields to @bson after calling this * function. * * Returns: * true if successful. * * Side effects: * @child is invalid after calling this function. * *-------------------------------------------------------------------------- */ bool bson_append_array_end(bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT(bson); BSON_ASSERT(child); return _bson_append_bson_end(bson, child); } /* *-------------------------------------------------------------------------- * * bson_append_document_begin -- * * Start appending a new document. * * Use @child to append to the data area for the given field. * * It is a programming error to call any other bson function on * @bson until bson_append_document_end() has been called. It is * valid to call bson_append*() functions on @child. * * This function is useful to allow building nested documents using * a single buffer owned by the top-level bson document. * * Returns: * true if successful; otherwise false and @child is invalid. * * Side effects: * @child is initialized if true is returned. * *-------------------------------------------------------------------------- */ bool bson_append_document_begin(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT(bson); BSON_ASSERT(key); BSON_ASSERT(child); return _bson_append_bson_begin(bson, key, key_length, BSON_TYPE_DOCUMENT, child); } /* *-------------------------------------------------------------------------- * * bson_append_document_end -- * * Complete a call to bson_append_document_begin(). * * It is safe to append new fields to @bson after calling this * function, if true is returned. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * @child is destroyed and invalid after calling this function. * *-------------------------------------------------------------------------- */ bool bson_append_document_end(bson_t *bson, /* IN */ bson_t *child) /* IN */ { BSON_ASSERT(bson); BSON_ASSERT(child); return _bson_append_bson_end(bson, child); } /* *-------------------------------------------------------------------------- * * bson_append_array -- * * Append an array to @bson. * * Generally, bson_append_array_begin() will result in faster code * since few buffers need to be malloced. * * Returns: * true if successful; otherwise false indicating BSON_MAX_SIZE overflow. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_array(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const bson_t *array) /* IN */ { static const uint8_t type = BSON_TYPE_ARRAY; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(array); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); /* * Let's be a bit pedantic and ensure the array has properly formatted key * names. We will verify this simply by checking the first element for "0" * if the array is non-empty. */ if (array && !bson_empty(array)) { bson_iter_t iter; if (bson_iter_init(&iter, array) && bson_iter_next(&iter)) { if (0 != strcmp("0", bson_iter_key(&iter))) { fprintf(stderr, "%s(): invalid array detected. first element of array " "parameter is not \"0\".\n", BSON_FUNC); } } } BSON_APPEND_BYTES_ADD_ARGUMENT(args, _bson_data(array), array->len); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * _bson_append_binary -- * * Append a BSON_TYPE_BINARY field, optionally copying @binary into the field. * * Parameters: * @subtype: the BSON Binary Subtype. See bsonspec.org for more * information. * @binary: Optional pointer to the raw binary data. * @length: the size of the field's binary data in bytes. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _bson_append_binary(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_subtype_t subtype, /* IN */ const uint8_t *binary, /* IN */ uint32_t length) /* IN */ { static const uint8_t type = BSON_TYPE_BINARY; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_OPTIONAL_PARAM(binary); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); const uint8_t subtype_arg = (uint8_t)subtype; if (subtype == BSON_SUBTYPE_BINARY_DEPRECATED) { if (length > UINT32_MAX - 4u) { return false; } const uint32_t length_le = BSON_UINT32_TO_LE(length + 4u); const uint32_t length_arg = BSON_UINT32_TO_LE(length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &length_le, sizeof(length_le)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &subtype_arg, sizeof(subtype_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &length_arg, sizeof(length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, binary, length); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); } else { const uint32_t length_arg = BSON_UINT32_TO_LE(length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &length_arg, sizeof(length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &subtype_arg, sizeof(subtype_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, binary, length); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); } return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * bson_append_binary -- * * Append binary data to @bson. The field will have the * BSON_TYPE_BINARY type. * * Parameters: * @subtype: the BSON Binary Subtype. See bsonspec.org for more * information. * @binary: a pointer to the raw binary data. * @length: the size of @binary in bytes. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_binary(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_subtype_t subtype, /* IN */ const uint8_t *binary, /* IN */ uint32_t length) /* IN */ { if (!binary && length > 0u) { return false; } return _bson_append_binary(bson, key, key_length, subtype, binary, length); } /* *-------------------------------------------------------------------------- * * bson_append_binary_uninit -- * * Append binary data to @bson by framing an uninitialized field to be written by the caller. * The field will have the BSON_TYPE_BINARY type. On success, the caller MUST write to all * bytes in the binary data field. The returned `*binary` pointer may be invalidated by * subsequent modifications to @bson. * * Parameters: * @subtype: the BSON Binary Subtype. See bsonspec.org for more * information. * @binary: Output parameter for a temporary pointer where the binary item's contents must be written. * @length: the size of @binary in bytes. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_binary_uninit(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bson_subtype_t subtype, /* IN */ uint8_t **binary, /* IN */ uint32_t length) /* IN */ { BSON_ASSERT_PARAM(binary); if (_bson_append_binary(bson, key, key_length, subtype, NULL, length)) { *binary = _bson_data(bson) + bson->len - 1u - length; return true; } else { return false; } } /* *-------------------------------------------------------------------------- * * bson_append_bool -- * * Append a new field to @bson with the name @key. The value is * a boolean indicated by @value. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_bool(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ bool value) /* IN */ { static const uint8_t type = BSON_TYPE_BOOL; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); const uint8_t byte_arg = value ? 1u : 0u; BSON_APPEND_BYTES_ADD_ARGUMENT(args, &byte_arg, sizeof(byte_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * bson_append_code -- * * Append a new field to @bson containing javascript code. * * @javascript MUST be a zero terminated UTF-8 string. It MUST NOT * containing embedded \0 characters. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * * See also: * bson_append_code_with_scope(). * *-------------------------------------------------------------------------- */ bool bson_append_code(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *javascript) /* IN */ { static const uint8_t type = BSON_TYPE_CODE; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(javascript); const size_t zulength = strlen(javascript); if (zulength > UINT32_MAX - 1u) { return false; } const uint32_t length = (uint32_t)zulength + 1u; const uint32_t length_arg = BSON_UINT32_TO_LE(length); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &length_arg, sizeof(length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, javascript, length); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * bson_append_code_with_scope -- * * Append a new field to @bson containing javascript code with * supplied scope. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_code_with_scope(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *javascript, /* IN */ const bson_t *scope) /* IN */ { static const uint8_t type = BSON_TYPE_CODEWSCOPE; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(javascript); if (!scope) { return bson_append_code(bson, key, key_length, javascript); } const size_t zulength = strlen(javascript); if (zulength > UINT32_MAX - 1u) { return false; } const uint32_t js_length = (uint32_t)zulength + 1u; const uint32_t js_length_arg = BSON_UINT32_TO_LE(js_length); if (js_length > UINT32_MAX - scope->len) { return false; } if (js_length + scope->len > UINT32_MAX - (2u * sizeof(uint32_t))) { return false; } const uint32_t total_length = (uint32_t)(2u * sizeof(uint32_t)) + js_length + scope->len; const uint32_t total_length_arg = BSON_UINT32_TO_LE(total_length); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &total_length_arg, sizeof(total_length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &js_length_arg, sizeof(js_length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, javascript, js_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, _bson_data(scope), scope->len); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * bson_append_dbpointer -- * * This BSON data type is DEPRECATED. * * Append a BSON dbpointer field to @bson. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool bson_append_dbpointer(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const char *collection, /* IN */ const bson_oid_t *oid) { static const uint8_t type = BSON_TYPE_DBPOINTER; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(oid); const size_t zulength = strlen(collection); if (zulength > UINT32_MAX - 1u) { return false; } const uint32_t length = (uint32_t)zulength + 1u; const uint32_t length_arg = BSON_UINT32_TO_LE(length); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &length_arg, sizeof(length_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, collection, length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, oid->bytes, sizeof(oid->bytes)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } /* *-------------------------------------------------------------------------- * * bson_append_document -- * * Append a new field to @bson containing a BSON document. * * In general, using bson_append_document_begin() results in faster * code and less memory fragmentation. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * * See also: * bson_append_document_begin(). * *-------------------------------------------------------------------------- */ bool bson_append_document(bson_t *bson, /* IN */ const char *key, /* IN */ int key_length, /* IN */ const bson_t *value) /* IN */ { static const uint8_t type = BSON_TYPE_DOCUMENT; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, _bson_data(value), value->len); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_double(bson_t *bson, const char *key, int key_length, double value) { static const uint8_t type = BSON_TYPE_DOUBLE; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const double value_arg = BSON_DOUBLE_TO_LE(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value_arg, sizeof(value_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_int32(bson_t *bson, const char *key, int key_length, int32_t value) { static const uint8_t type = BSON_TYPE_INT32; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const uint32_t value_arg = BSON_UINT32_TO_LE(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value_arg, sizeof(value_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_int64(bson_t *bson, const char *key, int key_length, int64_t value) { static const uint8_t type = BSON_TYPE_INT64; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const uint64_t value_arg = BSON_UINT64_TO_LE(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value_arg, sizeof(value_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_decimal128(bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value) { static const uint8_t type = BSON_TYPE_DECIMAL128; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const uint64_t value_arg[] = { BSON_UINT64_TO_LE(value->low), BSON_UINT64_TO_LE(value->high), }; BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value_arg, sizeof(value_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_iter(bson_t *bson, const char *key, int key_length, const bson_iter_t *iter) { bool ret = false; BSON_ASSERT(bson); BSON_ASSERT(iter); if (!key) { key = bson_iter_key(iter); key_length = -1; } switch (bson_iter_type_unsafe(iter)) { case BSON_TYPE_EOD: return false; case BSON_TYPE_DOUBLE: ret = bson_append_double(bson, key, key_length, bson_iter_double(iter)); break; case BSON_TYPE_UTF8: { uint32_t len = 0; const char *str; str = bson_iter_utf8(iter, &len); ret = bson_append_utf8(bson, key, key_length, str, len); } break; case BSON_TYPE_DOCUMENT: { const uint8_t *buf = NULL; uint32_t len = 0; bson_t doc; bson_iter_document(iter, &len, &buf); if (bson_init_static(&doc, buf, len)) { ret = bson_append_document(bson, key, key_length, &doc); bson_destroy(&doc); } } break; case BSON_TYPE_ARRAY: { const uint8_t *buf = NULL; uint32_t len = 0; bson_t doc; bson_iter_array(iter, &len, &buf); if (bson_init_static(&doc, buf, len)) { ret = bson_append_array(bson, key, key_length, &doc); bson_destroy(&doc); } } break; case BSON_TYPE_BINARY: { const uint8_t *binary = NULL; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; uint32_t len = 0; bson_iter_binary(iter, &subtype, &len, &binary); ret = bson_append_binary(bson, key, key_length, subtype, binary, len); } break; case BSON_TYPE_UNDEFINED: ret = bson_append_undefined(bson, key, key_length); break; case BSON_TYPE_OID: ret = bson_append_oid(bson, key, key_length, bson_iter_oid(iter)); break; case BSON_TYPE_BOOL: ret = bson_append_bool(bson, key, key_length, bson_iter_bool(iter)); break; case BSON_TYPE_DATE_TIME: ret = bson_append_date_time(bson, key, key_length, bson_iter_date_time(iter)); break; case BSON_TYPE_NULL: ret = bson_append_null(bson, key, key_length); break; case BSON_TYPE_REGEX: { const char *regex; const char *options; regex = bson_iter_regex(iter, &options); ret = bson_append_regex(bson, key, key_length, regex, options); } break; case BSON_TYPE_DBPOINTER: { const bson_oid_t *oid; uint32_t len; const char *collection; bson_iter_dbpointer(iter, &len, &collection, &oid); ret = bson_append_dbpointer(bson, key, key_length, collection, oid); } break; case BSON_TYPE_CODE: { uint32_t len; const char *code; code = bson_iter_code(iter, &len); ret = bson_append_code(bson, key, key_length, code); } break; case BSON_TYPE_SYMBOL: { uint32_t len; const char *symbol; symbol = bson_iter_symbol(iter, &len); ret = bson_append_symbol(bson, key, key_length, symbol, len); } break; case BSON_TYPE_CODEWSCOPE: { const uint8_t *scope = NULL; uint32_t scope_len = 0; uint32_t len = 0; const char *javascript = NULL; bson_t doc; javascript = bson_iter_codewscope(iter, &len, &scope_len, &scope); if (bson_init_static(&doc, scope, scope_len)) { ret = bson_append_code_with_scope(bson, key, key_length, javascript, &doc); bson_destroy(&doc); } } break; case BSON_TYPE_INT32: ret = bson_append_int32(bson, key, key_length, bson_iter_int32(iter)); break; case BSON_TYPE_TIMESTAMP: { uint32_t ts; uint32_t inc; bson_iter_timestamp(iter, &ts, &inc); ret = bson_append_timestamp(bson, key, key_length, ts, inc); } break; case BSON_TYPE_INT64: ret = bson_append_int64(bson, key, key_length, bson_iter_int64(iter)); break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; if (!bson_iter_decimal128(iter, &dec)) { return false; } ret = bson_append_decimal128(bson, key, key_length, &dec); } break; case BSON_TYPE_MAXKEY: ret = bson_append_maxkey(bson, key, key_length); break; case BSON_TYPE_MINKEY: ret = bson_append_minkey(bson, key, key_length); break; default: break; } return ret; } bool bson_append_maxkey(bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_MAXKEY; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_minkey(bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_MINKEY; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_null(bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_NULL; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_oid(bson_t *bson, const char *key, int key_length, const bson_oid_t *value) { static const uint8_t type = BSON_TYPE_OID; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, value->bytes, sizeof(value->bytes)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_regex(bson_t *bson, const char *key, int key_length, const char *regex, const char *options) { return bson_append_regex_w_len(bson, key, key_length, regex, -1, options); } bool bson_append_regex_w_len( bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options) { static const uint8_t type = BSON_TYPE_REGEX; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); bool ret = false; if (!regex) { regex = ""; } if (!options) { options = ""; } size_t options_len = strlen(options); mcommon_string_append_t options_sorted; mcommon_string_new_with_capacity_as_append(&options_sorted, (uint32_t)options_len); if (!mcommon_string_append_selected_chars(&options_sorted, BSON_REGEX_OPTIONS_SORTED, options, options_len)) { goto append_failure; } BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, regex, regex_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT( args, mcommon_str_from_append(&options_sorted), 1u + mcommon_strlen_from_append(&options_sorted)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); ret = true; append_failure: mcommon_string_from_append_destroy(&options_sorted); return ret; } bool bson_append_utf8(bson_t *bson, const char *key, int key_length, const char *value, int length) { static const uint8_t type = BSON_TYPE_UTF8; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); if (BSON_UNLIKELY(!value)) { return bson_append_null(bson, key, key_length); } size_t zulength; if (BSON_UNLIKELY(length < 0)) { zulength = strlen(value); } else { zulength = (size_t)length; } if (zulength > UINT32_MAX - 1u) { return false; } const uint32_t ulength = (uint32_t)zulength; const uint32_t ulength_arg = BSON_UINT32_TO_LE(ulength + 1u); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &ulength_arg, sizeof(ulength_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, value, ulength); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_symbol(bson_t *bson, const char *key, int key_length, const char *value, int length) { static const uint8_t type = BSON_TYPE_SYMBOL; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); if (!value) { return bson_append_null(bson, key, key_length); } size_t zulength; if (BSON_UNLIKELY(length < 0)) { zulength = strlen(value); } else { zulength = (size_t)length; } if (zulength > UINT32_MAX - 1u) { return false; } const uint32_t ulength = (uint32_t)zulength; const uint32_t ulength_arg = BSON_UINT32_TO_LE(ulength + 1u); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &ulength_arg, sizeof(ulength_arg)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, value, ulength); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_time_t(bson_t *bson, const char *key, int key_length, time_t value) { #ifdef BSON_OS_WIN32 struct timeval tv = {(long)value, 0}; #else struct timeval tv = {value, 0}; #endif BSON_ASSERT(bson); BSON_ASSERT(key); return bson_append_timeval(bson, key, key_length, &tv); } bool bson_append_timestamp(bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment) { static const uint8_t type = BSON_TYPE_TIMESTAMP; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const uint64_t value = BSON_UINT64_TO_LE(((((uint64_t)timestamp) << 32) | ((uint64_t)increment))); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value, sizeof(value)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_now_utc(bson_t *bson, const char *key, int key_length) { BSON_ASSERT(bson); BSON_ASSERT(key); BSON_ASSERT(key_length >= -1); return bson_append_time_t(bson, key, key_length, time(NULL)); } bool bson_append_date_time(bson_t *bson, const char *key, int key_length, int64_t value) { static const uint8_t type = BSON_TYPE_DATE_TIME; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); const uint64_t value_arg = BSON_UINT64_TO_LE(value); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &value_arg, sizeof(value_arg)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_timeval(bson_t *bson, const char *key, int key_length, struct timeval *value) { uint64_t unix_msec; BSON_ASSERT(bson); BSON_ASSERT(key); BSON_ASSERT(value); unix_msec = (((uint64_t)value->tv_sec) * 1000UL) + (value->tv_usec / 1000UL); return bson_append_date_time(bson, key, key_length, unix_msec); } bool bson_append_undefined(bson_t *bson, const char *key, int key_length) { static const uint8_t type = BSON_TYPE_UNDEFINED; BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &type, sizeof(type)); BSON_APPEND_BYTES_ADD_CHECKED_STRING(args, key, key_length); BSON_APPEND_BYTES_ADD_ARGUMENT(args, &gZero, sizeof(gZero)); BSON_APPEND_BYTES_APPLY_ARGUMENTS(bson, args); return true; append_failure: return false; } bool bson_append_value(bson_t *bson, const char *key, int key_length, const bson_value_t *value) { bson_t local; bool ret = false; BSON_ASSERT(bson); BSON_ASSERT(key); BSON_ASSERT(value); switch (value->value_type) { case BSON_TYPE_DOUBLE: ret = bson_append_double(bson, key, key_length, value->value.v_double); break; case BSON_TYPE_UTF8: ret = bson_append_utf8(bson, key, key_length, value->value.v_utf8.str, value->value.v_utf8.len); break; case BSON_TYPE_DOCUMENT: if (bson_init_static(&local, value->value.v_doc.data, value->value.v_doc.data_len)) { ret = bson_append_document(bson, key, key_length, &local); bson_destroy(&local); } break; case BSON_TYPE_ARRAY: if (bson_init_static(&local, value->value.v_doc.data, value->value.v_doc.data_len)) { ret = bson_append_array(bson, key, key_length, &local); bson_destroy(&local); } break; case BSON_TYPE_BINARY: ret = bson_append_binary(bson, key, key_length, value->value.v_binary.subtype, value->value.v_binary.data, value->value.v_binary.data_len); break; case BSON_TYPE_UNDEFINED: ret = bson_append_undefined(bson, key, key_length); break; case BSON_TYPE_OID: ret = bson_append_oid(bson, key, key_length, &value->value.v_oid); break; case BSON_TYPE_BOOL: ret = bson_append_bool(bson, key, key_length, value->value.v_bool); break; case BSON_TYPE_DATE_TIME: ret = bson_append_date_time(bson, key, key_length, value->value.v_datetime); break; case BSON_TYPE_NULL: ret = bson_append_null(bson, key, key_length); break; case BSON_TYPE_REGEX: ret = bson_append_regex(bson, key, key_length, value->value.v_regex.regex, value->value.v_regex.options); break; case BSON_TYPE_DBPOINTER: ret = bson_append_dbpointer( bson, key, key_length, value->value.v_dbpointer.collection, &value->value.v_dbpointer.oid); break; case BSON_TYPE_CODE: ret = bson_append_code(bson, key, key_length, value->value.v_code.code); break; case BSON_TYPE_SYMBOL: ret = bson_append_symbol(bson, key, key_length, value->value.v_symbol.symbol, value->value.v_symbol.len); break; case BSON_TYPE_CODEWSCOPE: if (bson_init_static(&local, value->value.v_codewscope.scope_data, value->value.v_codewscope.scope_len)) { ret = bson_append_code_with_scope(bson, key, key_length, value->value.v_codewscope.code, &local); bson_destroy(&local); } break; case BSON_TYPE_INT32: ret = bson_append_int32(bson, key, key_length, value->value.v_int32); break; case BSON_TYPE_TIMESTAMP: ret = bson_append_timestamp( bson, key, key_length, value->value.v_timestamp.timestamp, value->value.v_timestamp.increment); break; case BSON_TYPE_INT64: ret = bson_append_int64(bson, key, key_length, value->value.v_int64); break; case BSON_TYPE_DECIMAL128: ret = bson_append_decimal128(bson, key, key_length, &(value->value.v_decimal128)); break; case BSON_TYPE_MAXKEY: ret = bson_append_maxkey(bson, key, key_length); break; case BSON_TYPE_MINKEY: ret = bson_append_minkey(bson, key, key_length); break; case BSON_TYPE_EOD: default: break; } return ret; } void bson_init(bson_t *bson) { bson_impl_inline_t *impl = (bson_impl_inline_t *)bson; BSON_ASSERT(bson); impl->flags = BSON_FLAG_INLINE | BSON_FLAG_STATIC; impl->len = 5; impl->data[0] = 5; impl->data[1] = 0; impl->data[2] = 0; impl->data[3] = 0; impl->data[4] = 0; } void bson_reinit(bson_t *bson) { uint8_t *data; BSON_ASSERT(bson); data = _bson_data(bson); bson->len = 5; data[0] = 5; data[1] = 0; data[2] = 0; data[3] = 0; data[4] = 0; } bool bson_init_static(bson_t *bson, const uint8_t *data, size_t length) { bson_impl_alloc_t *impl = (bson_impl_alloc_t *)bson; BSON_ASSERT(bson); BSON_ASSERT(data); if ((length < 5) || (length > BSON_MAX_SIZE)) { return false; } const uint32_t hdr_len = mlib_read_u32le(data); if (hdr_len != length) { return false; } if (data[length - 1]) { return false; } impl->flags = BSON_FLAG_STATIC | BSON_FLAG_RDONLY; impl->len = (uint32_t)length; impl->parent = NULL; impl->depth = 0; impl->buf = &impl->alloc; impl->buflen = &impl->alloclen; impl->offset = 0; impl->alloc = (uint8_t *)data; impl->alloclen = length; impl->realloc = NULL; impl->realloc_func_ctx = NULL; return true; } bson_t * bson_new(void) { bson_impl_inline_t *impl; bson_t *bson; bson = BSON_ALIGNED_ALLOC(bson_t); impl = (bson_impl_inline_t *)bson; impl->flags = BSON_FLAG_INLINE; impl->len = 5; impl->data[0] = 5; impl->data[1] = 0; impl->data[2] = 0; impl->data[3] = 0; impl->data[4] = 0; return bson; } bson_t * bson_sized_new(size_t size) { bson_impl_alloc_t *impl_a; bson_t *b; BSON_ASSERT(size <= BSON_MAX_SIZE); { b = BSON_ALIGNED_ALLOC(bson_t); impl_a = (bson_impl_alloc_t *)b; } if (size <= BSON_INLINE_DATA_SIZE) { bson_init(b); b->flags &= ~BSON_FLAG_STATIC; } else { impl_a->flags = BSON_FLAG_NONE; impl_a->len = 5; impl_a->parent = NULL; impl_a->depth = 0; impl_a->buf = &impl_a->alloc; impl_a->buflen = &impl_a->alloclen; impl_a->offset = 0; impl_a->alloclen = BSON_MAX(5, size); impl_a->alloc = bson_malloc(impl_a->alloclen); impl_a->alloc[0] = 5; impl_a->alloc[1] = 0; impl_a->alloc[2] = 0; impl_a->alloc[3] = 0; impl_a->alloc[4] = 0; impl_a->realloc = bson_realloc_ctx; impl_a->realloc_func_ctx = NULL; } return b; } bson_t * bson_new_from_data(const uint8_t *data, size_t length) { BSON_ASSERT(data); if ((length < 5) || (length > BSON_MAX_SIZE) || data[length - 1]) { // Invalid length, or not null-terminated return NULL; } const int32_t hdr = mlib_read_i32le(data); if (mlib_cmp(hdr, !=, length)) { // Header's declared length is not equal to the length of the data buffer we were given return NULL; } bson_t *const bson = bson_sized_new(length); memcpy(_bson_data(bson), data, length); bson->len = (uint32_t)length; return bson; } bson_t * bson_new_from_buffer(uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx) { bson_impl_alloc_t *impl; uint32_t length; bson_t *bson; BSON_ASSERT(buf); BSON_ASSERT(buf_len); if (!realloc_func) { realloc_func = bson_realloc_ctx; } bson = BSON_ALIGNED_ALLOC0(bson_t); impl = (bson_impl_alloc_t *)bson; if (!*buf) { length = 5; *buf_len = 5; *buf = realloc_func(*buf, *buf_len, realloc_func_ctx); mlib_write_u32le(*buf, length); (*buf)[4] = '\0'; } else { if ((*buf_len < 5) || (*buf_len > BSON_MAX_SIZE)) { bson_free(bson); return NULL; } length = mlib_read_u32le(*buf); if (length > *buf_len) { bson_free(bson); return NULL; } } if ((*buf)[length - 1]) { bson_free(bson); return NULL; } impl->flags = BSON_FLAG_NO_FREE; impl->len = length; impl->buf = buf; impl->buflen = buf_len; impl->realloc = realloc_func; impl->realloc_func_ctx = realloc_func_ctx; return bson; } bson_t * bson_copy(const bson_t *bson) { const uint8_t *data; BSON_ASSERT(bson); data = _bson_data(bson); return bson_new_from_data(data, bson->len); } void bson_copy_to(const bson_t *src, bson_t *dst) { const uint8_t *data; bson_impl_alloc_t *adst; size_t len; BSON_ASSERT(src); BSON_ASSERT(dst); if ((src->flags & BSON_FLAG_INLINE)) { memcpy(dst, src, sizeof *dst); dst->flags = (BSON_FLAG_STATIC | BSON_FLAG_INLINE); return; } data = _bson_data(src); len = _bson_round_up_alloc_size((size_t)src->len); MONGOC_DEBUG_ASSERT(len <= BSON_MAX_SIZE); adst = (bson_impl_alloc_t *)dst; adst->flags = BSON_FLAG_STATIC; adst->len = src->len; adst->parent = NULL; adst->depth = 0; adst->buf = &adst->alloc; adst->buflen = &adst->alloclen; adst->offset = 0; adst->alloc = bson_malloc(len); adst->alloclen = len; adst->realloc = bson_realloc_ctx; adst->realloc_func_ctx = NULL; memcpy(adst->alloc, data, src->len); } static bool should_ignore(const char *first_exclude, va_list args, const char *name) { bool ret = false; const char *exclude = first_exclude; va_list args_copy; va_copy(args_copy, args); do { if (!strcmp(name, exclude)) { ret = true; break; } } while ((exclude = va_arg(args_copy, const char *))); va_end(args_copy); return ret; } void bson_copy_to_excluding_noinit_va(const bson_t *src, bson_t *dst, const char *first_exclude, va_list args) { bson_iter_t iter; if (bson_iter_init(&iter, src)) { while (bson_iter_next(&iter)) { if (!should_ignore(first_exclude, args, bson_iter_key(&iter))) { if (!bson_append_iter(dst, NULL, 0, &iter)) { /* * This should not be able to happen since we are copying * from within a valid bson_t. */ BSON_ASSERT(false); return; } } } } } void bson_copy_to_excluding_noinit(const bson_t *src, bson_t *dst, const char *first_exclude, ...) { va_list args; BSON_ASSERT(src); BSON_ASSERT(dst); BSON_ASSERT(first_exclude); va_start(args, first_exclude); bson_copy_to_excluding_noinit_va(src, dst, first_exclude, args); va_end(args); } void bson_destroy(bson_t *bson) { if (!bson) { return; } if (!(bson->flags & (BSON_FLAG_RDONLY | BSON_FLAG_INLINE | BSON_FLAG_NO_FREE))) { bson_free(*((bson_impl_alloc_t *)bson)->buf); } if (!(bson->flags & BSON_FLAG_STATIC)) { bson_free(bson); } } uint8_t * bson_reserve_buffer(bson_t *bson, uint32_t total_size) { if (bson->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY)) { return NULL; } if (total_size > bson->len) { if ((size_t)total_size > BSON_MAX_SIZE) { return NULL; } /* Note that the bson_t can also include space for parent or sibling documents (offset) and for trailing bytes * (depth). These sizes will be considered by _bson_grow() but we can assume they are zero in documents without * BSON_FLAG_CHILD or BSON_FLAG_IN_CHILD. If this is called on a document that's part of a bson_writer_t, it is * correct to ignore offset: we set the size of the current document, leaving previous documents alone. */ if (!_bson_grow(bson, total_size - bson->len)) { // Will fail due to overflow or when reallocation is needed on a buffer that does not support it. return NULL; } } if (bson->flags & BSON_FLAG_INLINE) { /* bson_grow didn't spill over */ ((bson_impl_inline_t *)bson)->len = total_size; BSON_ASSERT(total_size <= BSON_INLINE_DATA_SIZE); } else { bson_impl_alloc_t *impl = (bson_impl_alloc_t *)bson; impl->len = total_size; BSON_ASSERT(impl->offset <= *impl->buflen && *impl->buflen - impl->offset >= (size_t)total_size); } return _bson_data(bson); } bool bson_steal(bson_t *dst, bson_t *src) { bson_impl_inline_t *src_inline; bson_impl_inline_t *dst_inline; bson_impl_alloc_t *alloc; BSON_ASSERT(dst); BSON_ASSERT(src); bson_init(dst); if (src->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY)) { return false; } if (src->flags & BSON_FLAG_INLINE) { src_inline = (bson_impl_inline_t *)src; dst_inline = (bson_impl_inline_t *)dst; dst_inline->len = src_inline->len; memcpy(dst_inline->data, src_inline->data, sizeof src_inline->data); /* for consistency, src is always invalid after steal, even if inline */ src->len = 0; } else { memcpy(dst, src, sizeof(bson_t)); alloc = (bson_impl_alloc_t *)dst; alloc->flags |= BSON_FLAG_STATIC; alloc->buf = &alloc->alloc; alloc->buflen = &alloc->alloclen; } if (!(src->flags & BSON_FLAG_STATIC)) { bson_free(src); } else { /* src is invalid after steal */ src->len = 0; } return true; } uint8_t * bson_destroy_with_steal(bson_t *bson, bool steal, uint32_t *length) { uint8_t *ret = NULL; BSON_ASSERT(bson); if (length) { *length = bson->len; } if (!steal) { bson_destroy(bson); return NULL; } if ((bson->flags & (BSON_FLAG_CHILD | BSON_FLAG_IN_CHILD | BSON_FLAG_RDONLY))) { /* Do nothing */ } else if ((bson->flags & BSON_FLAG_INLINE)) { bson_impl_inline_t *inl; inl = (bson_impl_inline_t *)bson; ret = bson_malloc(bson->len); memcpy(ret, inl->data, bson->len); } else { bson_impl_alloc_t *alloc; alloc = (bson_impl_alloc_t *)bson; ret = *alloc->buf; *alloc->buf = NULL; } bson_destroy(bson); return ret; } const uint8_t * bson_get_data(const bson_t *bson) { BSON_ASSERT(bson); return _bson_data(bson); } uint32_t bson_count_keys(const bson_t *bson) { uint32_t count = 0; bson_iter_t iter; BSON_ASSERT(bson); if (bson_iter_init(&iter, bson)) { while (bson_iter_next(&iter)) { count++; } } return count; } bool bson_has_field(const bson_t *bson, const char *key) { bson_iter_t iter; bson_iter_t child; BSON_ASSERT(bson); BSON_ASSERT(key); if (NULL != strchr(key, '.')) { return (bson_iter_init(&iter, bson) && bson_iter_find_descendant(&iter, key, &child)); } return bson_iter_init_find(&iter, bson, key); } int bson_compare(const bson_t *bson, const bson_t *other) { const uint8_t *data1; const uint8_t *data2; size_t len1; size_t len2; int64_t ret; data1 = _bson_data(bson) + 4; len1 = bson->len - 4; data2 = _bson_data(other) + 4; len2 = other->len - 4; if (len1 == len2) { return memcmp(data1, data2, len1); } ret = memcmp(data1, data2, BSON_MIN(len1, len2)); if (ret == 0) { ret = (int64_t)len1 - (int64_t)len2; } return (ret < 0) ? -1 : (ret > 0); } bool bson_equal(const bson_t *bson, const bson_t *other) { return !bson_compare(bson, other); } char * bson_as_json_with_opts(const bson_t *bson, size_t *length, const bson_json_opts_t *opts) { BSON_ASSERT_PARAM(bson); BSON_OPTIONAL_PARAM(length); BSON_ASSERT_PARAM(opts); // Convert the API-specified max length into a literal byte count; max length is transformed from a special value // (-1) to the maximum representable size. int32_t limit_i32 = opts->max_len; uint32_t limit_u32 = 0; if (limit_i32 == BSON_MAX_LEN_UNLIMITED) { limit_u32 = UINT32_MAX - 1u; } else if (limit_i32 > 0) { limit_u32 = (uint32_t)limit_i32; } // Use the bson length as an initial buffer capacity guess mcommon_string_append_t append; mcommon_string_set_append_with_limit(mcommon_string_new_with_capacity("", 0, bson->len), &append, limit_u32); if (opts->is_outermost_array ? mcommon_json_append_bson_array(&append, bson, opts->mode, BSON_MAX_RECURSION) : mcommon_json_append_bson_document(&append, bson, opts->mode, BSON_MAX_RECURSION)) { if (length) { *length = (size_t)mcommon_strlen_from_append(&append); } return mcommon_string_from_append_destroy_with_steal(&append); } else { if (length) { *length = 0; } mcommon_string_from_append_destroy(&append); return NULL; } } char * bson_as_canonical_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts(bson, length, &opts); } char * bson_as_legacy_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_LEGACY, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts(bson, length, &opts); } char * bson_as_relaxed_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED, false}; return bson_as_json_with_opts(bson, length, &opts); } char * bson_array_as_legacy_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_LEGACY, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts(bson, length, &opts); } char * bson_array_as_relaxed_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts(bson, length, &opts); } char * bson_array_as_canonical_extended_json(const bson_t *bson, size_t *length) { const bson_json_opts_t opts = {BSON_JSON_MODE_CANONICAL, BSON_MAX_LEN_UNLIMITED, true}; return bson_as_json_with_opts(bson, length, &opts); } bool bson_validate(const bson_t *bson, bson_validate_flags_t flags, size_t *offset) { return bson_validate_with_error_and_offset(bson, flags, offset, NULL); } bool bson_validate_with_error(const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error) { return bson_validate_with_error_and_offset(bson, flags, NULL, error); } bool bson_validate_with_error_and_offset(const bson_t *bson, bson_validate_flags_t flags, size_t *offset, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_OPTIONAL_PARAM(offset); BSON_OPTIONAL_PARAM(error); size_t offset_local = 0; if (!offset) { offset = &offset_local; } bson_error_t error_local; if (!error) { error = &error_local; } return _bson_validate_impl_v2(bson, flags, offset, error); } bool bson_concat(bson_t *dst, const bson_t *src) { BSON_ASSERT(dst); BSON_ASSERT(src); if (!bson_empty(src)) { BSON_APPEND_BYTES_LIST_DECLARE(args); BSON_APPEND_BYTES_ADD_ARGUMENT(args, _bson_data(src) + 4, src->len - 5u); BSON_APPEND_BYTES_APPLY_ARGUMENTS(dst, args); } return true; append_failure: return false; } struct _bson_array_builder_t { uint32_t index; bson_t bson; }; bson_array_builder_t * bson_array_builder_new(void) { bson_array_builder_t *bab = BSON_ALIGNED_ALLOC0(bson_array_builder_t); bson_init(&bab->bson); return bab; } // `bson_array_builder_append_impl` generates the next key index, calls // `append_fn`, and may update the tracked next index. #define bson_array_builder_append_impl(append_fn, ...) \ if (1) { \ BSON_ASSERT_PARAM(bab); \ const char *key; \ char buf[16]; \ size_t key_length = bson_uint32_to_string(bab->index, &key, buf, sizeof buf); \ /* Expect enough room in `buf` for key string. UINT32_MAX is 10 digits. \ * With the NULL terminator, 11 is expected maximum number of \ * characters. */ \ BSON_ASSERT(key_length < sizeof buf); \ bool ok = append_fn(&bab->bson, key, (int)key_length, __VA_ARGS__); \ if (ok) { \ bab->index += 1; \ } \ return ok; \ } else \ (void)0 #define bson_array_builder_append_impl_noargs(append_fn) \ if (1) { \ BSON_ASSERT_PARAM(bab); \ const char *key; \ char buf[16]; \ size_t key_length = bson_uint32_to_string(bab->index, &key, buf, sizeof buf); \ /* Expect enough room in `buf` for key string. UINT32_MAX is 10 digits. \ * With the NULL terminator, 11 is expected maximum number of \ * characters. */ \ BSON_ASSERT(key_length < sizeof buf); \ bool ok = append_fn(&bab->bson, key, (int)key_length); \ if (ok) { \ bab->index += 1; \ } \ return ok; \ } else \ (void)0 bool bson_array_builder_append_value(bson_array_builder_t *bab, const bson_value_t *value) { bson_array_builder_append_impl(bson_append_value, value); } bool bson_array_builder_append_array(bson_array_builder_t *bab, const bson_t *array) { bson_array_builder_append_impl(bson_append_array, array); } bool bson_array_builder_append_array_from_vector(bson_array_builder_t *bab, const bson_iter_t *iter) { bson_array_builder_append_impl(bson_append_array_from_vector, iter); } bool bson_array_builder_append_binary(bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length) { bson_array_builder_append_impl(bson_append_binary, subtype, binary, length); } bool bson_array_builder_append_binary_uninit(bson_array_builder_t *bab, bson_subtype_t subtype, uint8_t **binary, uint32_t length) { bson_array_builder_append_impl(bson_append_binary_uninit, subtype, binary, length); } bool bson_array_builder_append_bool(bson_array_builder_t *bab, bool value) { bson_array_builder_append_impl(bson_append_bool, value); } bool bson_array_builder_append_code(bson_array_builder_t *bab, const char *javascript) { bson_array_builder_append_impl(bson_append_code, javascript); } bool bson_array_builder_append_code_with_scope(bson_array_builder_t *bab, const char *javascript, const bson_t *scope) { bson_array_builder_append_impl(bson_append_code_with_scope, javascript, scope); } bool bson_array_builder_append_dbpointer(bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid) { bson_array_builder_append_impl(bson_append_dbpointer, collection, oid); } bool bson_array_builder_append_double(bson_array_builder_t *bab, double value) { bson_array_builder_append_impl(bson_append_double, value); } bool bson_array_builder_append_document(bson_array_builder_t *bab, const bson_t *value) { bson_array_builder_append_impl(bson_append_document, value); } bool bson_array_builder_append_document_begin(bson_array_builder_t *bab, bson_t *child) { bson_array_builder_append_impl(bson_append_document_begin, child); } bool bson_array_builder_append_document_end(bson_array_builder_t *bab, bson_t *child) { return bson_append_document_end(&bab->bson, child); } bool bson_array_builder_append_int32(bson_array_builder_t *bab, int32_t value) { bson_array_builder_append_impl(bson_append_int32, value); } bool bson_array_builder_append_int64(bson_array_builder_t *bab, int64_t value) { bson_array_builder_append_impl(bson_append_int64, value); } bool bson_array_builder_append_decimal128(bson_array_builder_t *bab, const bson_decimal128_t *value) { bson_array_builder_append_impl(bson_append_decimal128, value); } bool bson_array_builder_append_iter(bson_array_builder_t *bab, const bson_iter_t *iter) { bson_array_builder_append_impl(bson_append_iter, iter); } bool bson_array_builder_append_minkey(bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs(bson_append_minkey); } bool bson_array_builder_append_maxkey(bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs(bson_append_maxkey); } bool bson_array_builder_append_null(bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs(bson_append_null); } bool bson_array_builder_append_oid(bson_array_builder_t *bab, const bson_oid_t *oid) { bson_array_builder_append_impl(bson_append_oid, oid); } bool bson_array_builder_append_regex(bson_array_builder_t *bab, const char *regex, const char *options) { bson_array_builder_append_impl(bson_append_regex, regex, options); } bool bson_array_builder_append_regex_w_len(bson_array_builder_t *bab, const char *regex, int regex_length, const char *options) { bson_array_builder_append_impl(bson_append_regex_w_len, regex, regex_length, options); } bool bson_array_builder_append_utf8(bson_array_builder_t *bab, const char *value, int length) { bson_array_builder_append_impl(bson_append_utf8, value, length); } bool bson_array_builder_append_symbol(bson_array_builder_t *bab, const char *value, int length) { bson_array_builder_append_impl(bson_append_symbol, value, length); } bool bson_array_builder_append_time_t(bson_array_builder_t *bab, time_t value) { bson_array_builder_append_impl(bson_append_time_t, value); } bool bson_array_builder_append_timeval(bson_array_builder_t *bab, struct timeval *value) { bson_array_builder_append_impl(bson_append_timeval, value); } bool bson_array_builder_append_date_time(bson_array_builder_t *bab, int64_t value) { bson_array_builder_append_impl(bson_append_date_time, value); } bool bson_array_builder_append_now_utc(bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs(bson_append_now_utc); } bool bson_array_builder_append_timestamp(bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment) { bson_array_builder_append_impl(bson_append_timestamp, timestamp, increment); } bool bson_array_builder_append_undefined(bson_array_builder_t *bab) { bson_array_builder_append_impl_noargs(bson_append_undefined); } bool bson_array_builder_append_array_builder_begin(bson_array_builder_t *bab, bson_array_builder_t **child) { bson_array_builder_append_impl(bson_append_array_builder_begin, child); } bool bson_array_builder_append_array_builder_end(bson_array_builder_t *bab, bson_array_builder_t *child) { return bson_append_array_builder_end(&bab->bson, child); } bool bson_array_builder_build(bson_array_builder_t *bab, bson_t *out) { BSON_ASSERT_PARAM(bab); BSON_ASSERT_PARAM(out); if (!bson_steal(out, &bab->bson)) { return false; } bson_init(&bab->bson); bab->index = 0; return true; } void bson_array_builder_destroy(bson_array_builder_t *bab) { if (!bab) { return; } bson_destroy(&bab->bson); bson_free(bab); } bool bson_append_array_builder_begin(bson_t *bson, const char *key, int key_length, bson_array_builder_t **child) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(child); *child = bson_array_builder_new(); bool ok = bson_append_array_begin(bson, key, key_length, &(*child)->bson); if (!ok) { bson_array_builder_destroy(*child); *child = NULL; } return ok; } bool bson_append_array_builder_end(bson_t *bson, bson_array_builder_t *child) { bool ok = bson_append_array_end(bson, &child->bson); bson_array_builder_destroy(child); return ok; } mongo-c-driver-2.2.1/src/libbson/src/bson/bson.h000066400000000000000000001224471511661753600214520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_H #define BSON_H #define BSON_INSIDE #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include #include #undef BSON_INSIDE BSON_BEGIN_DECLS /** * bson_empty: * @b: a bson_t. * * Checks to see if @b is an empty BSON document. An empty BSON document is * a 5 byte document which contains the length (4 bytes) and a single NUL * byte indicating end of fields. */ #define bson_empty(b) (((b)->len == 5) || !bson_get_data((b))[4]) /** * bson_empty0: * * Like bson_empty() but treats NULL the same as an empty bson_t document. */ #define bson_empty0(b) (!(b) || bson_empty(b)) /** * bson_clear: * * Easily free a bson document and set it to NULL. Use like: * * bson_t *doc = bson_new(); * bson_clear (&doc); * BSON_ASSERT (doc == NULL); */ #define bson_clear(bptr) \ do { \ if (*(bptr)) { \ bson_destroy(*(bptr)); \ *(bptr) = NULL; \ } \ } while (0) /** * BSON_MAX_SIZE: * * The maximum size in bytes of a BSON document. */ #define BSON_MAX_SIZE ((size_t)((1U << 31) - 1)) #define BSON_APPEND_ARRAY(b, key, val) bson_append_array(b, key, (int)strlen(key), val) #define BSON_APPEND_ARRAY_BEGIN(b, key, child) bson_append_array_begin(b, key, (int)strlen(key), child) #define BSON_APPEND_BINARY(b, key, subtype, val, len) bson_append_binary(b, key, (int)strlen(key), subtype, val, len) #define BSON_APPEND_BOOL(b, key, val) bson_append_bool(b, key, (int)strlen(key), val) #define BSON_APPEND_CODE(b, key, val) bson_append_code(b, key, (int)strlen(key), val) #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope(b, key, (int)strlen(key), val, scope) #define BSON_APPEND_DBPOINTER(b, key, coll, oid) bson_append_dbpointer(b, key, (int)strlen(key), coll, oid) #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) bson_append_document_begin(b, key, (int)strlen(key), child) #define BSON_APPEND_DOUBLE(b, key, val) bson_append_double(b, key, (int)strlen(key), val) #define BSON_APPEND_DOCUMENT(b, key, val) bson_append_document(b, key, (int)strlen(key), val) #define BSON_APPEND_INT32(b, key, val) bson_append_int32(b, key, (int)strlen(key), val) #define BSON_APPEND_INT64(b, key, val) bson_append_int64(b, key, (int)strlen(key), val) #define BSON_APPEND_MINKEY(b, key) bson_append_minkey(b, key, (int)strlen(key)) #define BSON_APPEND_DECIMAL128(b, key, val) bson_append_decimal128(b, key, (int)strlen(key), val) #define BSON_APPEND_MAXKEY(b, key) bson_append_maxkey(b, key, (int)strlen(key)) #define BSON_APPEND_NULL(b, key) bson_append_null(b, key, (int)strlen(key)) #define BSON_APPEND_OID(b, key, val) bson_append_oid(b, key, (int)strlen(key), val) #define BSON_APPEND_REGEX(b, key, val, opt) bson_append_regex(b, key, (int)strlen(key), val, opt) #define BSON_APPEND_UTF8(b, key, val) bson_append_utf8(b, key, (int)strlen(key), val, (int)strlen(val)) #define BSON_APPEND_SYMBOL(b, key, val) bson_append_symbol(b, key, (int)strlen(key), val, (int)strlen(val)) #define BSON_APPEND_TIME_T(b, key, val) bson_append_time_t(b, key, (int)strlen(key), val) #define BSON_APPEND_TIMEVAL(b, key, val) bson_append_timeval(b, key, (int)strlen(key), val) #define BSON_APPEND_DATE_TIME(b, key, val) bson_append_date_time(b, key, (int)strlen(key), val) #define BSON_APPEND_TIMESTAMP(b, key, val, inc) bson_append_timestamp(b, key, (int)strlen(key), val, inc) #define BSON_APPEND_UNDEFINED(b, key) bson_append_undefined(b, key, (int)strlen(key)) #define BSON_APPEND_VALUE(b, key, val) bson_append_value(b, key, (int)strlen(key), (val)) /** * bson_new: * * Allocates a new bson_t structure. Call the various bson_append_*() * functions to add fields to the bson. You can iterate the bson_t at any * time using a bson_iter_t and bson_iter_init(). * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). */ BSON_EXPORT(bson_t *) bson_new(void); BSON_EXPORT(bson_t *) bson_new_from_json(const uint8_t *data, ssize_t len, bson_error_t *error); BSON_EXPORT(bool) bson_init_from_json(bson_t *bson, const char *data, ssize_t len, bson_error_t *error); /** * bson_init_static: * @b: A pointer to a bson_t. * @data: The data buffer to use. * @length: The length of @data. * * Initializes a bson_t using @data and @length. This is ideal if you would * like to use a stack allocation for your bson and do not need to grow the * buffer. @data must be valid for the life of @b. * * Returns: true if initialized successfully; otherwise false. */ BSON_EXPORT(bool) bson_init_static(bson_t *b, const uint8_t *data, size_t length); /** * bson_init: * @b: A pointer to a bson_t. * * Initializes a bson_t for use. This function is useful to those that want a * stack allocated bson_t. The usefulness of a stack allocated bson_t is * marginal as the target buffer for content will still require heap * allocations. It can help reduce heap fragmentation on allocators that do * not employ SLAB/magazine semantics. * * You must call bson_destroy() with @b to release resources when you are done * using @b. */ BSON_EXPORT(void) bson_init(bson_t *b); /** * bson_reinit: * @b: (inout): A bson_t. * * This is equivalent to calling bson_destroy() and bson_init() on a #bson_t. * However, it will try to persist the existing malloc'd buffer if one exists. * This is useful in cases where you want to reduce malloc overhead while * building many documents. */ BSON_EXPORT(void) bson_reinit(bson_t *b); /** * bson_new_from_data: * @data: A buffer containing a serialized bson document. * @length: The length of the document in bytes. * * Creates a new bson_t structure using the data provided. @data should contain * at least @length bytes that can be copied into the new bson_t structure. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). * If the first four bytes (little-endian) of data do not match @length, * then NULL will be returned. */ BSON_EXPORT(bson_t *) bson_new_from_data(const uint8_t *data, size_t length); /** * bson_new_from_buffer: * @buf: A pointer to a buffer containing a serialized bson document. * @buf_len: The length of the buffer in bytes. * @realloc_fun: a realloc like function * @realloc_fun_ctx: a context for the realloc function * * Creates a new bson_t structure using the data provided. @buf should contain * a bson document, or null pointer should be passed for new allocations. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). * The underlying buffer will be used and not be freed in destroy. */ BSON_EXPORT(bson_t *) bson_new_from_buffer(uint8_t **buf, size_t *buf_len, bson_realloc_func realloc_func, void *realloc_func_ctx); /** * bson_sized_new: * @size: A size_t containing the number of bytes to allocate. * * This will allocate a new bson_t with enough bytes to hold a buffer * sized @size. @size must be smaller than INT_MAX bytes. * * Returns: A newly allocated bson_t that should be freed with bson_destroy(). */ BSON_EXPORT(bson_t *) bson_sized_new(size_t size); /** * bson_copy: * @bson: A bson_t. * * Copies @bson into a newly allocated bson_t. You must call bson_destroy() * when you are done with the resulting value to free its resources. * * Returns: A newly allocated bson_t that should be free'd with bson_destroy() */ BSON_EXPORT(bson_t *) bson_copy(const bson_t *bson); /** * bson_copy_to: * @src: The source bson_t. * @dst: The destination bson_t. * * Initializes @dst and copies the content from @src into @dst. */ BSON_EXPORT(void) bson_copy_to(const bson_t *src, bson_t *dst); /** * bson_copy_to_excluding_noinit: * @src: A bson_t. * @dst: A bson_t to initialize and copy into. * @first_exclude: First field name to exclude. * * Does not call bson_init() on the dst. */ BSON_EXPORT(void) bson_copy_to_excluding_noinit(const bson_t *src, bson_t *dst, const char *first_exclude, ...) BSON_GNUC_NULL_TERMINATED; BSON_EXPORT(void) bson_copy_to_excluding_noinit_va(const bson_t *src, bson_t *dst, const char *first_exclude, va_list args); /** * bson_destroy: * @bson: A bson_t. * * Frees the resources associated with @bson. */ BSON_EXPORT(void) bson_destroy(bson_t *bson); BSON_EXPORT(uint8_t *) bson_reserve_buffer(bson_t *bson, uint32_t total_size); BSON_EXPORT(bool) bson_steal(bson_t *dst, bson_t *src); /** * bson_destroy_with_steal: * @bson: A #bson_t. * @steal: If ownership of the data buffer should be transferred to caller. * @length: (out): location for the length of the buffer. * * Destroys @bson similar to calling bson_destroy() except that the underlying * buffer will be returned and ownership transferred to the caller if @steal * is non-zero. * * If length is non-NULL, the length of @bson will be stored in @length. * * It is a programming error to call this function with any bson that has * been initialized static, or is being used to create a subdocument with * functions such as bson_append_document_begin() or bson_append_array_begin(). * * Returns: a buffer owned by the caller if @steal is true. Otherwise NULL. * If there was an error, NULL is returned. */ BSON_EXPORT(uint8_t *) bson_destroy_with_steal(bson_t *bson, bool steal, uint32_t *length); /** * bson_get_data: * @bson: A bson_t. * * Fetched the data buffer for @bson of @bson->len bytes in length. * * Returns: A buffer that should not be modified or freed. */ BSON_EXPORT(const uint8_t *) bson_get_data(const bson_t *bson); /** * bson_count_keys: * @bson: A bson_t. * * Counts the number of elements found in @bson. */ BSON_EXPORT(uint32_t) bson_count_keys(const bson_t *bson); /** * bson_has_field: * @bson: A bson_t. * @key: The key to lookup. * * Checks to see if @bson contains a field named @key. * * This function is case-sensitive. * * Returns: true if @key exists in @bson; otherwise false. */ BSON_EXPORT(bool) bson_has_field(const bson_t *bson, const char *key); /** * bson_compare: * @bson: A bson_t. * @other: A bson_t. * * Compares @bson to @other in a qsort() style comparison. * See qsort() for information on how this function works. * * Returns: Less than zero, zero, or greater than zero. */ BSON_EXPORT(int) bson_compare(const bson_t *bson, const bson_t *other); /* * bson_equal: * @bson: A bson_t. * @other: A bson_t. * * Checks to see if @bson and @other are equal. * * Returns: true if equal; otherwise false. */ BSON_EXPORT(bool) bson_equal(const bson_t *bson, const bson_t *other); /** * bson_validate: * @bson: A bson_t. * @offset: A location for the error offset. * * Validates a BSON document by walking through the document and inspecting * the fields for valid content. * * Returns: true if @bson is valid; otherwise false and @offset is set. */ BSON_EXPORT(bool) bson_validate(const bson_t *bson, bson_validate_flags_t flags, size_t *offset); /** * bson_validate_with_error: * @bson: A bson_t. * @error: A location for the error info. * * Validates a BSON document by walking through the document and inspecting * the fields for valid content. * * Returns: true if @bson is valid; otherwise false and @error is filled out. */ BSON_EXPORT(bool) bson_validate_with_error(const bson_t *bson, bson_validate_flags_t flags, bson_error_t *error); /** * bson_validate_with_error_and_offset: * @bson: A bson_t. * @offset: A location for the error offset. * @error: A location for the error info. * * Validates a BSON document by walking through the document and inspecting * the fields for valid content. * * Returns: true if @bson is valid; otherwise false, @offset is set * and @error is filled out. */ BSON_EXPORT(bool) bson_validate_with_error_and_offset(const bson_t *bson, bson_validate_flags_t flags, size_t *offset, bson_error_t *error); /** * bson_as_json_with_opts: * @bson: A bson_t. * @length: A location for the string length, or NULL. * @opts: A bson_t_json_opts_t defining options for the conversion * * Creates a new string containing @bson in the selected JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT(char *) bson_as_json_with_opts(const bson_t *bson, size_t *length, const bson_json_opts_t *opts); /** * bson_as_canonical_extended_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in canonical extended JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT(char *) bson_as_canonical_extended_json(const bson_t *bson, size_t *length); /** * bson_as_legacy_extended_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in libbson's legacy JSON format. * Superseded by bson_as_canonical_extended_json and * bson_as_relaxed_extended_json. The caller is * responsible for freeing the resulting string. If @length is non-NULL, then * the length of the resulting string will be placed in @length. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT(char *) bson_as_legacy_extended_json(const bson_t *bson, size_t *length); /** * bson_as_relaxed_extended_json: * @bson: A bson_t. * @length: A location for the string length, or NULL. * * Creates a new string containing @bson in relaxed extended JSON format, * conforming to the MongoDB Extended JSON Spec: * * github.com/mongodb/specifications/blob/master/source/extended-json.rst * * The caller is responsible for freeing the resulting string. If @length is * non-NULL, then the length of the resulting string will be placed in @length. * * See https://www.mongodb.com/docs/manual/reference/mongodb-extended-json/ for * more information on extended JSON. * * Returns: A newly allocated string that should be freed with bson_free(). */ BSON_EXPORT(char *) bson_as_relaxed_extended_json(const bson_t *bson, size_t *length); /* like bson_as_legacy_extended_json() but for outermost arrays. */ BSON_EXPORT(char *) bson_array_as_legacy_extended_json(const bson_t *bson, size_t *length); /* like bson_as_relaxed_extended_json() but for outermost arrays. */ BSON_EXPORT(char *) bson_array_as_relaxed_extended_json(const bson_t *bson, size_t *length); /* like bson_as_canonical_extended_json() but for outermost arrays. */ BSON_EXPORT(char *) bson_array_as_canonical_extended_json(const bson_t *bson, size_t *length); // bson_array_builder_t defines an API for building arrays. // BSON arrays require sequential numeric keys "0", "1", "2", ... typedef struct _bson_array_builder_t bson_array_builder_t; // bson_array_builder_new may be used to build a top-level BSON array. Example: // `[1,2,3]`. // To append an array field to a document (Example: `{ "field": [1,2,3] }`), use // `bson_append_array_builder_begin`. BSON_EXPORT(bson_array_builder_t *) bson_array_builder_new(void); // bson_array_builder_build initializes and moves BSON data to `out`. // `bab` may be reused and will start appending a new array at index "0". BSON_EXPORT(bool) bson_array_builder_build(bson_array_builder_t *bab, bson_t *out); BSON_EXPORT(void) bson_array_builder_destroy(bson_array_builder_t *bab); BSON_EXPORT(bool) bson_append_value(bson_t *bson, const char *key, int key_length, const bson_value_t *value); #define BSON_APPEND_VALUE(b, key, val) bson_append_value(b, key, (int)strlen(key), (val)) BSON_EXPORT(bool) bson_array_builder_append_value(bson_array_builder_t *bab, const bson_value_t *value); /** * bson_append_array: * @bson: A bson_t. * @key: The key for the field. * @array: A bson_t containing the array. * * Appends a BSON array to @bson. BSON arrays are like documents where the * key is the string version of the index. For example, the first item of the * array would have the key "0". The second item would have the index "1". * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_array(bson_t *bson, const char *key, int key_length, const bson_t *array); #define BSON_APPEND_ARRAY(b, key, val) bson_append_array(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_array(bson_array_builder_t *bab, const bson_t *array); /** * bson_append_array_from_vector: * @bson: A bson_t that will be modified. * @key: The key for the field. * @iter: A bson_iter_t pointing to any supported vector in another bson_t. * * If @iter points to a supported vector type, converts the vector to a BSON array appended to @bson. * * Returns: true if successful; false if append would overflow max size or @iter does not point to a vector in a * supported format. */ BSON_EXPORT(bool) bson_append_array_from_vector(bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); #define BSON_APPEND_ARRAY_FROM_VECTOR(b, key, iter) bson_append_array_from_vector(b, key, (int)strlen(key), iter) BSON_EXPORT(bool) bson_array_builder_append_array_from_vector(bson_array_builder_t *bab, const bson_iter_t *iter); /** * bson_append_binary: * @bson: A bson_t. * @key: The key for the field. * @key_length: Optional length of 'key' in bytes, or -1 to use strlen(key). * @subtype: The bson_subtype_t of the binary item. * @binary: The binary buffer to append. * @length: The length of @binary. * * Appends a binary buffer to the BSON document. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_binary( bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); #define BSON_APPEND_BINARY(b, key, subtype, val, len) bson_append_binary(b, key, (int)strlen(key), subtype, val, len) BSON_EXPORT(bool) bson_array_builder_append_binary(bson_array_builder_t *bab, bson_subtype_t subtype, const uint8_t *binary, uint32_t length); /** * bson_append_binary_uninit: * @bson: A bson_t. * @key: The key for the field. * @key_length: Optional length of 'key' in bytes, or -1 to use strlen(key). * @binary: Output parameter, pointer for the binary data within bson_t to be written. * @length: Length of the binary field to allocate, in bytes. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_binary_uninit( bson_t *bson, const char *key, int key_length, bson_subtype_t subtype, uint8_t **binary, uint32_t length); #define BSON_APPEND_BINARY_UNINIT(b, key, subtype, val, len) \ bson_append_binary_uninit(b, key, (int)strlen(key), subtype, val, len) BSON_EXPORT(bool) bson_array_builder_append_binary_uninit(bson_array_builder_t *bab, bson_subtype_t subtype, uint8_t **binary, uint32_t length); /** * bson_append_bool: * @bson: A bson_t. * @key: The key for the field. * @value: The boolean value. * * Appends a new field to @bson of type BSON_TYPE_BOOL. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_bool(bson_t *bson, const char *key, int key_length, bool value); #define BSON_APPEND_BOOL(b, key, val) bson_append_bool(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_bool(bson_array_builder_t *bab, bool value); /** * bson_append_code: * @bson: A bson_t. * @key: The key for the document. * @javascript: JavaScript code to be executed. * * Appends a field of type BSON_TYPE_CODE to the BSON document. @javascript * should contain a script in javascript to be executed. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_code(bson_t *bson, const char *key, int key_length, const char *javascript); #define BSON_APPEND_CODE(b, key, val) bson_append_code(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_code(bson_array_builder_t *bab, const char *javascript); /** * bson_append_code_with_scope: * @bson: A bson_t. * @key: The key for the document. * @javascript: JavaScript code to be executed. * @scope: A bson_t containing the scope for @javascript. * * Appends a field of type BSON_TYPE_CODEWSCOPE to the BSON document. * @javascript should contain a script in javascript to be executed. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_code_with_scope(bson_t *bson, const char *key, int key_length, const char *javascript, const bson_t *scope); #define BSON_APPEND_CODE_WITH_SCOPE(b, key, val, scope) \ bson_append_code_with_scope(b, key, (int)strlen(key), val, scope) BSON_EXPORT(bool) bson_array_builder_append_code_with_scope(bson_array_builder_t *bab, const char *javascript, const bson_t *scope); /** * bson_append_dbpointer: * @bson: A bson_t. * @key: The key for the field. * @collection: The collection name. * @oid: The oid to the reference. * * Appends a new field of type BSON_TYPE_DBPOINTER. This datum type is * deprecated in the BSON spec and should not be used in new code. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_dbpointer(bson_t *bson, const char *key, int key_length, const char *collection, const bson_oid_t *oid); #define BSON_APPEND_DBPOINTER(b, key, coll, oid) bson_append_dbpointer(b, key, (int)strlen(key), coll, oid) BSON_EXPORT(bool) bson_array_builder_append_dbpointer(bson_array_builder_t *bab, const char *collection, const bson_oid_t *oid); /** * bson_append_double: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field to @bson of the type BSON_TYPE_DOUBLE. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_double(bson_t *bson, const char *key, int key_length, double value); #define BSON_APPEND_DOUBLE(b, key, val) bson_append_double(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_double(bson_array_builder_t *bab, double value); /** * bson_append_document: * @bson: A bson_t. * @key: The key for the field. * @value: A bson_t containing the subdocument. * * Appends a new field to @bson of the type BSON_TYPE_DOCUMENT. * The documents contents will be copied into @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_document(bson_t *bson, const char *key, int key_length, const bson_t *value); #define BSON_APPEND_DOCUMENT(b, key, val) bson_append_document(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_document(bson_array_builder_t *bab, const bson_t *value); /** * bson_append_document_begin: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes not including NUL or -1 * if @key_length is NUL terminated. * @child: A location to an uninitialized bson_t. * * Appends a new field named @key to @bson. The field is, however, * incomplete. @child will be initialized so that you may add fields to the * child document. Child will use a memory buffer owned by @bson and * therefore grow the parent buffer as additional space is used. This allows * a single malloc'd buffer to be used when building documents which can help * reduce memory fragmentation. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_document_begin(bson_t *bson, const char *key, int key_length, bson_t *child); #define BSON_APPEND_DOCUMENT_BEGIN(b, key, child) bson_append_document_begin(b, key, (int)strlen(key), child) BSON_EXPORT(bool) bson_array_builder_append_document_begin(bson_array_builder_t *bab, bson_t *child); /** * bson_append_document_end: * @bson: A bson_t. * @child: A bson_t supplied to bson_append_document_begin(). * * Finishes the appending of a document to a @bson. @child is considered * disposed after this call and should not be used any further. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_document_end(bson_t *bson, bson_t *child); BSON_EXPORT(bool) bson_array_builder_append_document_end(bson_array_builder_t *bab, bson_t *child); /** * bson_append_array_begin: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes not including NUL or -1 * if @key_length is NUL terminated. * @child: A location to an uninitialized bson_t. * * Appends a new field named @key to @bson. The field is, however, * incomplete. @child will be initialized so that you may add fields to the * child array. Child will use a memory buffer owned by @bson and * therefore grow the parent buffer as additional space is used. This allows * a single malloc'd buffer to be used when building arrays which can help * reduce memory fragmentation. * * The type of @child will be BSON_TYPE_ARRAY and therefore the keys inside * of it MUST be "0", "1", etc. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_array_begin(bson_t *bson, const char *key, int key_length, bson_t *child); #define BSON_APPEND_ARRAY_BEGIN(b, key, child) bson_append_array_begin(b, key, (int)strlen(key), child) /** * bson_append_array_end: * @bson: A bson_t. * @child: A bson_t supplied to bson_append_array_begin(). * * Finishes the appending of a array to a @bson. @child is considered * disposed after this call and should not be used any further. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_array_end(bson_t *bson, bson_t *child); /** * bson_append_int32: * @bson: A bson_t. * @key: The key for the field. * @value: The int32_t 32-bit integer value. * * Appends a new field of type BSON_TYPE_INT32 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_int32(bson_t *bson, const char *key, int key_length, int32_t value); #define BSON_APPEND_INT32(b, key, val) bson_append_int32(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_int32(bson_array_builder_t *bab, int32_t value); /** * bson_append_int64: * @bson: A bson_t. * @key: The key for the field. * @value: The int64_t 64-bit integer value. * * Appends a new field of type BSON_TYPE_INT64 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_int64(bson_t *bson, const char *key, int key_length, int64_t value); #define BSON_APPEND_INT64(b, key, val) bson_append_int64(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_int64(bson_array_builder_t *bab, int64_t value); /** * bson_append_decimal128: * @bson: A bson_t. * @key: The key for the field. * @value: The bson_decimal128_t decimal128 value. * * Appends a new field of type BSON_TYPE_DECIMAL128 to @bson. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_decimal128(bson_t *bson, const char *key, int key_length, const bson_decimal128_t *value); #define BSON_APPEND_DECIMAL128(b, key, val) bson_append_decimal128(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_decimal128(bson_array_builder_t *bab, const bson_decimal128_t *value); /** * bson_append_iter: * @bson: A bson_t to append to. * @key: The key name or %NULL to take current key from @iter. * @key_length: The key length or -1 to use strlen(). * @iter: The iter located on the position of the element to append. * * Appends a new field to @bson that is equivalent to the field currently * pointed to by @iter. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_iter(bson_t *bson, const char *key, int key_length, const bson_iter_t *iter); #define BSON_APPEND_ITER(b, key, val) bson_append_iter(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_iter(bson_array_builder_t *bab, const bson_iter_t *iter); /** * bson_append_minkey: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field of type BSON_TYPE_MINKEY to @bson. This is a special * type that compares lower than all other possible BSON element values. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_minkey(bson_t *bson, const char *key, int key_length); #define BSON_APPEND_MINKEY(b, key) bson_append_minkey(b, key, (int)strlen(key)) BSON_EXPORT(bool) bson_array_builder_append_minkey(bson_array_builder_t *bab); /** * bson_append_maxkey: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field of type BSON_TYPE_MAXKEY to @bson. This is a special * type that compares higher than all other possible BSON element values. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_maxkey(bson_t *bson, const char *key, int key_length); #define BSON_APPEND_MAXKEY(b, key) bson_append_maxkey(b, key, (int)strlen(key)) BSON_EXPORT(bool) bson_array_builder_append_maxkey(bson_array_builder_t *bab); /** * bson_append_null: * @bson: A bson_t. * @key: The key for the field. * * Appends a new field to @bson with NULL for the value. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_null(bson_t *bson, const char *key, int key_length); #define BSON_APPEND_NULL(b, key) bson_append_null(b, key, (int)strlen(key)) BSON_EXPORT(bool) bson_array_builder_append_null(bson_array_builder_t *bab); /** * bson_append_oid: * @bson: A bson_t. * @key: The key for the field. * @oid: bson_oid_t. * * Appends a new field to the @bson of type BSON_TYPE_OID using the contents of * @oid. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_oid(bson_t *bson, const char *key, int key_length, const bson_oid_t *oid); #define BSON_APPEND_OID(b, key, val) bson_append_oid(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_oid(bson_array_builder_t *bab, const bson_oid_t *oid); /** * bson_append_regex: * @bson: A bson_t. * @key: The key of the field. * @regex: The regex to append to the bson. * @options: Options for @regex. * * Appends a new field to @bson of type BSON_TYPE_REGEX. @regex should * be the regex string. @options should contain the options for the regex. * * Valid options for @options are: * * 'i' for case-insensitive. * 'm' for multiple matching. * 'x' for verbose mode. * 'l' to make \w and \W locale dependent. * 's' for dotall mode ('.' matches everything) * 'u' to make \w and \W match unicode. * * For more detailed information about BSON regex elements, see bsonspec.org. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_regex(bson_t *bson, const char *key, int key_length, const char *regex, const char *options); #define BSON_APPEND_REGEX(b, key, val, opt) bson_append_regex(b, key, (int)strlen(key), val, opt) BSON_EXPORT(bool) bson_array_builder_append_regex(bson_array_builder_t *bab, const char *regex, const char *options); /** * bson_append_regex: * @bson: A bson_t. * @key: The key of the field. * @key_length: The length of the key string. * @regex: The regex to append to the bson. * @regex_length: The length of the regex string. * @options: Options for @regex. * * Appends a new field to @bson of type BSON_TYPE_REGEX. @regex should * be the regex string. @options should contain the options for the regex. * * Valid options for @options are: * * 'i' for case-insensitive. * 'm' for multiple matching. * 'x' for verbose mode. * 'l' to make \w and \W locale dependent. * 's' for dotall mode ('.' matches everything) * 'u' to make \w and \W match unicode. * * For more detailed information about BSON regex elements, see bsonspec.org. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_regex_w_len( bson_t *bson, const char *key, int key_length, const char *regex, int regex_length, const char *options); BSON_EXPORT(bool) bson_array_builder_append_regex_w_len(bson_array_builder_t *bab, const char *regex, int regex_length, const char *options); /** * bson_append_utf8: * @bson: A bson_t. * @key: The key for the field. * @value: A UTF-8 encoded string. * @length: The length of @value or -1 if it is NUL terminated. * * Appends a new field to @bson using @key as the key and @value as the UTF-8 * encoded value. * * It is the callers responsibility to ensure @value is valid UTF-8. You can * use bson_utf8_validate() to perform this check. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_utf8(bson_t *bson, const char *key, int key_length, const char *value, int length); #define BSON_APPEND_UTF8(b, key, val) bson_append_utf8(b, key, (int)strlen(key), val, (int)strlen(val)) BSON_EXPORT(bool) bson_array_builder_append_utf8(bson_array_builder_t *bab, const char *value, int length); /** * bson_append_symbol: * @bson: A bson_t. * @key: The key for the field. * @value: The symbol as a string. * @length: The length of @value or -1 if NUL-terminated. * * Appends a new field to @bson of type BSON_TYPE_SYMBOL. This BSON type is * deprecated and should not be used in new code. * * See http://bsonspec.org for more information on this type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_symbol(bson_t *bson, const char *key, int key_length, const char *value, int length); #define BSON_APPEND_SYMBOL(b, key, val) bson_append_symbol(b, key, (int)strlen(key), val, (int)strlen(val)) BSON_EXPORT(bool) bson_array_builder_append_symbol(bson_array_builder_t *bab, const char *value, int length); /** * bson_append_time_t: * @bson: A bson_t. * @key: The key for the field. * @value: A time_t. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the time_t @value for the * number of seconds since UNIX epoch in UTC. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_time_t(bson_t *bson, const char *key, int key_length, time_t value); #define BSON_APPEND_TIME_T(b, key, val) bson_append_time_t(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_time_t(bson_array_builder_t *bab, time_t value); /** * bson_append_timeval: * @bson: A bson_t. * @key: The key for the field. * @value: A struct timeval containing the date and time. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the struct timeval * provided. The time is persisted in milliseconds since the UNIX epoch in UTC. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_timeval(bson_t *bson, const char *key, int key_length, struct timeval *value); #define BSON_APPEND_TIMEVAL(b, key, val) bson_append_timeval(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_timeval(bson_array_builder_t *bab, struct timeval *value); /** * bson_append_date_time: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key in bytes or -1 if \0 terminated. * @value: The number of milliseconds elapsed since UNIX epoch. * * Appends a new field to @bson of type BSON_TYPE_DATE_TIME. * * Returns: true if successful; otherwise false. */ BSON_EXPORT(bool) bson_append_date_time(bson_t *bson, const char *key, int key_length, int64_t value); #define BSON_APPEND_DATE_TIME(b, key, val) bson_append_date_time(b, key, (int)strlen(key), val) BSON_EXPORT(bool) bson_array_builder_append_date_time(bson_array_builder_t *bab, int64_t value); /** * bson_append_now_utc: * @bson: A bson_t. * @key: The key for the field. * @key_length: The length of @key or -1 if it is NULL terminated. * * Appends a BSON_TYPE_DATE_TIME field to @bson using the current time in UTC * as the field value. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_now_utc(bson_t *bson, const char *key, int key_length); #define BSON_APPEND_NOW_UTC(b, key) bson_append_now_utc(b, key, (int)strlen(key)) BSON_EXPORT(bool) bson_array_builder_append_now_utc(bson_array_builder_t *bab); /** * bson_append_timestamp: * @bson: A bson_t. * @key: The key for the field. * @timestamp: 4 byte timestamp. * @increment: 4 byte increment for timestamp. * * Appends a field of type BSON_TYPE_TIMESTAMP to @bson. This is a special type * used by MongoDB replication and sharding. If you need generic time and date * fields use bson_append_time_t() or bson_append_timeval(). * * Setting @increment and @timestamp to zero has special semantics. See * http://bsonspec.org for more information on this field type. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_timestamp(bson_t *bson, const char *key, int key_length, uint32_t timestamp, uint32_t increment); #define BSON_APPEND_TIMESTAMP(b, key, val, inc) bson_append_timestamp(b, key, (int)strlen(key), val, inc) BSON_EXPORT(bool) bson_array_builder_append_timestamp(bson_array_builder_t *bab, uint32_t timestamp, uint32_t increment); /** * bson_append_undefined: * @bson: A bson_t. * @key: The key for the field. * * Appends a field of type BSON_TYPE_UNDEFINED. This type is deprecated in the * spec and should not be used for new code. However, it is provided for those * needing to interact with legacy systems. * * Returns: true if successful; false if append would overflow max size. */ BSON_EXPORT(bool) bson_append_undefined(bson_t *bson, const char *key, int key_length); #define BSON_APPEND_UNDEFINED(b, key) bson_append_undefined(b, key, (int)strlen(key)) BSON_EXPORT(bool) bson_array_builder_append_undefined(bson_array_builder_t *bab); BSON_EXPORT(bool) bson_concat(bson_t *dst, const bson_t *src); BSON_EXPORT(bool) bson_append_array_builder_begin(bson_t *bson, const char *key, int key_length, bson_array_builder_t **child); #define BSON_APPEND_ARRAY_BUILDER_BEGIN(b, key, child) bson_append_array_builder_begin(b, key, (int)strlen(key), child) BSON_EXPORT(bool) bson_array_builder_append_array_builder_begin(bson_array_builder_t *bab, bson_array_builder_t **child); BSON_EXPORT(bool) bson_append_array_builder_end(bson_t *bson, bson_array_builder_t *child); BSON_EXPORT(bool) bson_array_builder_append_array_builder_end(bson_array_builder_t *bab, bson_array_builder_t *child); BSON_END_DECLS #endif /* BSON_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson_t-private.h000066400000000000000000000053571511661753600234450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef BSON_PRIVATE_H #define BSON_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS typedef enum { BSON_FLAG_NONE = 0, BSON_FLAG_INLINE = (1 << 0), BSON_FLAG_STATIC = (1 << 1), BSON_FLAG_RDONLY = (1 << 2), BSON_FLAG_CHILD = (1 << 3), BSON_FLAG_IN_CHILD = (1 << 4), BSON_FLAG_NO_FREE = (1 << 5), } bson_flags_t; #define BSON_INLINE_DATA_SIZE 120 BSON_ALIGNED_BEGIN(BSON_ALIGN_OF_PTR) typedef struct { bson_flags_t flags; uint32_t len; uint8_t data[BSON_INLINE_DATA_SIZE]; } bson_impl_inline_t BSON_ALIGNED_END(BSON_ALIGN_OF_PTR); BSON_STATIC_ASSERT2(impl_inline_t, sizeof(bson_impl_inline_t) == 128); typedef struct { bson_flags_t flags; /* flags describing the bson_t */ /* len is part of the public bson_t declaration. It is not * exposed through an accessor function. Plus, it's redundant since * BSON self describes the length in the first four bytes of the * buffer. */ uint32_t len; /* length of bson document in bytes */ bson_t *parent; /* parent bson if a child */ uint32_t depth; /* Subdocument depth. */ uint8_t **buf; /* pointer to buffer pointer */ size_t *buflen; /* pointer to buffer length */ size_t offset; /* our offset inside *buf */ uint8_t *alloc; /* buffer that we own. */ size_t alloclen; /* length of buffer that we own. */ bson_realloc_func realloc; /* our realloc implementation */ void *realloc_func_ctx; /* context for our realloc func */ } bson_impl_alloc_t; BSON_STATIC_ASSERT2(impl_alloc_t, sizeof(bson_impl_alloc_t) <= 128); // Ensure both `bson_t` implementations have the same alignment requirement: BSON_STATIC_ASSERT2(impls_match_alignment, BSON_ALIGNOF(bson_impl_inline_t) == BSON_ALIGNOF(bson_impl_alloc_t)); // Ensure `bson_t` has same alignment requirement as implementations: BSON_STATIC_ASSERT2(impls_match_alignment, BSON_ALIGNOF(bson_t) == BSON_ALIGNOF(bson_impl_alloc_t)); BSON_END_DECLS #endif /* BSON_PRIVATE_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/bson_t.h000066400000000000000000000035731511661753600217730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_BSON_T_H_INCLUDED #define BSON_BSON_T_H_INCLUDED #include #include /** * bson_t: * * This structure manages a buffer whose contents are a properly formatted * BSON document. You may perform various transforms on the BSON documents. * Additionally, it can be iterated over using bson_iter_t. * * See bson_iter_init() for iterating the contents of a bson_t. * * When building a bson_t structure using the various append functions, * memory allocations may occur. That is performed using power of two * allocations and realloc(). * * See http://bsonspec.org for the BSON document spec. * * This structure is meant to fit in two sequential 64-byte cachelines. */ BSON_ALIGNED_BEGIN(BSON_ALIGN_OF_PTR) typedef struct _bson_t { uint32_t flags; /* Internal flags for the bson_t. */ uint32_t len; /* Length of BSON data. */ uint8_t padding[120]; /* Padding for stack allocation. */ } bson_t BSON_ALIGNED_END(BSON_ALIGN_OF_PTR); /** * BSON_INITIALIZER: * * This macro can be used to initialize a #bson_t structure on the stack * without calling bson_init(). * * |[ * bson_t b = BSON_INITIALIZER; * ]| */ #define BSON_INITIALIZER {3, 5, {5}} BSON_STATIC_ASSERT2(bson_t, sizeof(bson_t) == 128); #endif // BSON_BSON_T_H_INCLUDED mongo-c-driver-2.2.1/src/libbson/src/bson/compat.h000066400000000000000000000127231511661753600217670ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_COMPAT_H #define BSON_COMPAT_H #if defined(__MINGW32__) #if defined(__USE_MINGW_ANSI_STDIO) #if __USE_MINGW_ANSI_STDIO < 1 #error "__USE_MINGW_ANSI_STDIO > 0 is required for correct PRI* macros" #endif #else #define __USE_MINGW_ANSI_STDIO 1 #endif #endif #include // IWYU pragma: export #include // IWYU pragma: export #ifdef BSON_OS_WIN32 #if defined(_WIN32_WINNT) && (_WIN32_WINNT < 0x0601) #undef _WIN32_WINNT #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0601 #endif #ifndef NOMINMAX #define NOMINMAX #endif #include // IWYU pragma: export #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #include // IWYU pragma: export #undef WIN32_LEAN_AND_MEAN #else #include // IWYU pragma: export #endif #include // IWYU pragma: export #include // IWYU pragma: export #endif #ifdef BSON_OS_UNIX #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #endif #include #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: keep: to be removed. #include // IWYU pragma: keep: to be removed. #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: keep: to be removed. #include // IWYU pragma: keep: to be removed. #include // IWYU pragma: keep: to be removed. #include // IWYU pragma: keep: to be removed. BSON_BEGIN_DECLS #if !defined(_MSC_VER) || (_MSC_VER >= 1800) #include // IWYU pragma: export #endif #ifdef _MSC_VER #ifndef __cplusplus /* benign redefinition of type */ #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #ifndef _SIZE_T_DEFINED #define _SIZE_T_DEFINED typedef SIZE_T size_t; #endif #pragma warning(default : 4142) #else /* * MSVC++ does not include ssize_t, just size_t. * So we need to synthesize that as well. */ #pragma warning(disable : 4142) #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED typedef SSIZE_T ssize_t; #endif #pragma warning(default : 4142) #endif #ifndef PRIi32 #define PRIi32 "d" #endif #ifndef PRId32 #define PRId32 "d" #endif #ifndef PRIu32 #define PRIu32 "u" #endif #ifndef PRIi64 #define PRIi64 "I64i" #endif #ifndef PRId64 #define PRId64 "I64i" #endif #ifndef PRIu64 #define PRIu64 "I64u" #endif #endif /* Derive the maximum representable value of signed integer type T using the * formula 2^(N - 1) - 1 where N is the number of bits in type T. This assumes * T is represented using two's complement. */ #define BSON_NUMERIC_LIMITS_MAX_SIGNED(T) ((T)((((size_t)0x01u) << (sizeof(T) * (size_t)CHAR_BIT - 1u)) - 1u)) /* Derive the minimum representable value of signed integer type T as one less * than the negation of its maximum representable value. This assumes T is * represented using two's complement. */ #define BSON_NUMERIC_LIMITS_MIN_SIGNED(T, max) ((T)((-(max)) - 1)) /* Derive the maximum representable value of unsigned integer type T by flipping * all its bits to 1. */ #define BSON_NUMERIC_LIMITS_MAX_UNSIGNED(T) ((T)(~((T)0))) #ifndef SSIZE_MAX #define SSIZE_MAX BSON_NUMERIC_LIMITS_MAX_SIGNED(ssize_t) #endif #ifndef SSIZE_MIN #define SSIZE_MIN BSON_NUMERIC_LIMITS_MIN_SIGNED(ssize_t, SSIZE_MAX) #endif #if defined(__MINGW32__) && !defined(INIT_ONCE_STATIC_INIT) #define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT typedef RTL_RUN_ONCE INIT_ONCE; #endif #if !defined(va_copy) && defined(__va_copy) #define va_copy(dst, src) __va_copy(dst, src) #endif #if !defined(va_copy) #define va_copy(dst, src) ((dst) = (src)) #endif #ifdef _MSC_VER /** Expands the arguments if compiling with MSVC, otherwise empty */ #define BSON_IF_MSVC(...) __VA_ARGS__ /** Expands the arguments if compiling with GCC or Clang, otherwise empty */ #define BSON_IF_GNU_LIKE(...) #elif defined(__GNUC__) || defined(__clang__) /** Expands the arguments if compiling with MSVC, otherwise empty */ #define BSON_IF_MSVC(...) /** Expands the arguments if compiling with GCC or Clang, otherwise empty */ #define BSON_IF_GNU_LIKE(...) __VA_ARGS__ #else /** Unsupported compiler. **/ #define BSON_IF_MSVC(...) #define BSON_IF_GNU_LIKE(...) #endif #ifdef BSON_OS_WIN32 /** Expands the arguments if compiling for Windows, otherwise empty */ #define BSON_IF_WINDOWS(...) __VA_ARGS__ /** Expands the arguments if compiling for POSIX, otherwise empty */ #define BSON_IF_POSIX(...) #elif defined(BSON_OS_UNIX) /** Expands the arguments if compiling for Windows, otherwise empty */ #define BSON_IF_WINDOWS(...) /** Expands the arguments if compiling for POSIX, otherwise empty */ #define BSON_IF_POSIX(...) __VA_ARGS__ #endif BSON_END_DECLS #endif /* BSON_COMPAT_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/config.h.in000066400000000000000000000052241511661753600223540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_CONFIG_H #define BSON_CONFIG_H /* * Define to 1234 for Little Endian, 4321 for Big Endian. */ #define BSON_BYTE_ORDER @BSON_BYTE_ORDER@ /* * Define to 1 if you have stdbool.h */ #define BSON_HAVE_STDBOOL_H @BSON_HAVE_STDBOOL_H@ #if BSON_HAVE_STDBOOL_H != 1 # undef BSON_HAVE_STDBOOL_H #endif /* * Define to 1 for POSIX-like systems, 2 for Windows. */ #define BSON_OS @BSON_OS@ /* * Define to 1 if you have clock_gettime() available. */ #define BSON_HAVE_CLOCK_GETTIME @BSON_HAVE_CLOCK_GETTIME@ #if BSON_HAVE_CLOCK_GETTIME != 1 # undef BSON_HAVE_CLOCK_GETTIME #endif /* * Define to 1 if you have strings.h available on your platform. */ #define BSON_HAVE_STRINGS_H @BSON_HAVE_STRINGS_H@ #if BSON_HAVE_STRINGS_H != 1 # undef BSON_HAVE_STRINGS_H #endif /* * Define to 1 if you have strnlen available on your platform. */ #define BSON_HAVE_STRNLEN @BSON_HAVE_STRNLEN@ #if BSON_HAVE_STRNLEN != 1 # undef BSON_HAVE_STRNLEN #endif /* * Define to 1 if you have snprintf available on your platform. */ #define BSON_HAVE_SNPRINTF @BSON_HAVE_SNPRINTF@ #if BSON_HAVE_SNPRINTF != 1 # undef BSON_HAVE_SNPRINTF #endif /* * Define to 1 if you have gmtime_r available on your platform. */ #define BSON_HAVE_GMTIME_R @BSON_HAVE_GMTIME_R@ #if BSON_HAVE_GMTIME_R != 1 # undef BSON_HAVE_GMTIME_R #endif /* * Define to 1 if you have struct timespec available on your platform. */ #define BSON_HAVE_TIMESPEC @BSON_HAVE_TIMESPEC@ #if BSON_HAVE_TIMESPEC != 1 # undef BSON_HAVE_TIMESPEC #endif /* * Define to 1 if you have rand_r available on your platform. */ #define BSON_HAVE_RAND_R @BSON_HAVE_RAND_R@ #if BSON_HAVE_RAND_R != 1 # undef BSON_HAVE_RAND_R #endif /* * Define to 1 if you have strlcpy available on your platform. */ #define BSON_HAVE_STRLCPY @BSON_HAVE_STRLCPY@ #if BSON_HAVE_STRLCPY != 1 # undef BSON_HAVE_STRLCPY #endif /* * Define to 1 if you have aligned_alloc available on your platform. */ #define BSON_HAVE_ALIGNED_ALLOC @BSON_HAVE_ALIGNED_ALLOC@ #if BSON_HAVE_ALIGNED_ALLOC != 1 # undef BSON_HAVE_ALIGNED_ALLOC #endif #endif /* BSON_CONFIG_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/error.c000066400000000000000000000140041511661753600216220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include // See `bson_strerror_r()` definition below. #if !defined(_WIN32) && !defined(__APPLE__) #include // uselocale() #endif /* *-------------------------------------------------------------------------- * * bson_set_error -- * * Initializes @error using the parameters specified. * * @domain is an application specific error domain which should * describe which module initiated the error. Think of this as the * exception type. * * @code is the @domain specific error code. * * @format is used to generate the format string. It uses vsnprintf() * internally so the format should match what you would use there. * * Parameters: * @error: A #bson_error_t. * @domain: The error domain. * @code: The error code. * @format: A printf style format string. * * Returns: * None. * * Side effects: * @error is initialized. * *-------------------------------------------------------------------------- */ void bson_set_error(bson_error_t *error, /* OUT */ uint32_t domain, /* IN */ uint32_t code, /* IN */ const char *format, /* IN */ ...) /* IN */ { va_list args; if (error) { error->domain = domain; error->code = code; bson_set_error_category(error, BSON_ERROR_CATEGORY); va_start(args, format); char buffer[sizeof error->message]; bson_vsnprintf(buffer, sizeof error->message, format, args); memcpy(error->message, buffer, sizeof buffer); va_end(args); } } /* *-------------------------------------------------------------------------- * * bson_strerror_r -- * * This is a reentrant safe macro for strerror. * * The resulting string may be stored in @buf. * * Returns: * A pointer to a static string or @buf. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * bson_strerror_r(int err_code, /* IN */ char *buf BSON_MAYBE_UNUSED, /* IN */ size_t buflen BSON_MAYBE_UNUSED) /* IN */ { static const char *unknown_msg = "Unknown error"; char *ret = NULL; #if defined(_WIN32) // Windows does not provide `strerror_l` or `strerror_r`, but it does // unconditionally provide `strerror_s`. if (strerror_s(buf, buflen, err_code) == 0) { ret = buf; } #elif defined(_AIX) // AIX does not provide strerror_l, and its strerror_r isn't glibc's. // But it does provide a glibc compatible one called __linux_strerror_r ret = __linux_strerror_r(err_code, buf, buflen); #elif defined(__APPLE__) // Apple does not provide `strerror_l`, but it does unconditionally provide // the XSI-compliant `strerror_r`, but only when compiling with Apple Clang. // GNU extensions may still be a problem if we are being compiled with GCC on // Apple. Avoid the compatibility headaches with GNU extensions and the musl // library by assuming the implementation will not cause UB when reading the // error message string even when `strerror_r` fails, as encouraged (but not // required) by the POSIX spec (see: // https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html#tag_16_574_08). (void)strerror_r(err_code, buf, buflen); ret = buf; #elif defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 700 // The behavior (of `strerror_l`) is undefined if the locale argument to // `strerror_l()` is the special locale object LC_GLOBAL_LOCALE or is not a // valid locale object handle. locale_t locale = uselocale((locale_t)0); // No need to test for error (it can only be [EINVAL]). if (locale == LC_GLOBAL_LOCALE) { // Only use our own locale if a thread-local locale was not already set. // This is just to satisfy `strerror_l`. We do NOT want to unconditionally // set a thread-local locale. locale = newlocale(LC_MESSAGES_MASK, "C", (locale_t)0); } BSON_ASSERT(locale != LC_GLOBAL_LOCALE); // Avoid `strerror_r` compatibility headaches with GNU extensions and the // musl library by using `strerror_l` instead. Furthermore, `strerror_r` is // scheduled to be marked as obsolete in favor of `strerror_l` in the // upcoming POSIX Issue 8 (see: // https://www.austingroupbugs.net/view.php?id=655). // // POSIX Spec: since strerror_l() is required to return a string for some // errors, an application wishing to check for all error situations should // set errno to 0, then call strerror_l(), then check errno. if (locale != (locale_t)0) { errno = 0; ret = strerror_l(err_code, locale); if (errno != 0) { ret = NULL; } freelocale(locale); } else { // Could not obtain a valid `locale_t` object to satisfy `strerror_l`. // Fallback to `bson_strncpy` below. } #elif defined(_GNU_SOURCE) // Unlikely, but continue supporting use of GNU extension in cases where the // C Driver is being built without _XOPEN_SOURCE=700. ret = strerror_r(err_code, buf, buflen); #else #error "Unable to find a supported strerror_r candidate" #endif if (!ret) { bson_strncpy(buf, unknown_msg, buflen); ret = buf; } return ret; } mongo-c-driver-2.2.1/src/libbson/src/bson/error.h000066400000000000000000000052301511661753600216300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_ERROR_T_INCLUDED #define BSON_ERROR_T_INCLUDED #include #include BSON_BEGIN_DECLS #define BSON_ERROR_BUFFER_SIZE 503 BSON_ALIGNED_BEGIN(BSON_ALIGN_OF_PTR) // Aligned for backwards-compatibility. typedef struct _bson_error_t { uint32_t domain; uint32_t code; char message[BSON_ERROR_BUFFER_SIZE]; uint8_t reserved; // For internal use only! } bson_error_t BSON_ALIGNED_END(BSON_ALIGN_OF_PTR); BSON_STATIC_ASSERT2(error_t, sizeof(bson_error_t) == 512); #define BSON_ERROR_JSON 1 #define BSON_ERROR_READER 2 #define BSON_ERROR_INVALID 3 #define BSON_ERROR_VECTOR 4 BSON_EXPORT(void) bson_set_error(bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...) BSON_GNUC_PRINTF(4, 5); BSON_EXPORT(char *) bson_strerror_r(int err_code, char *buf, size_t buflen); /** * @brief Reset the content of a bson_error_t to indicate no error. * * @param error Pointer to an error to be overwritten. If null, this function * has no effect. * * This is static-inline because it is trivially optimizable as a (conditional) * `memset`. */ static inline void bson_error_clear(bson_error_t *error) { if (!error) { return; } // Statically initialized to a zero struct: static bson_error_t zero_error; // Replace the caller's value: *error = zero_error; } /** * @brief Given a `bson_error_t` pointer l-value, ensure that it is non-null, and clear any * error value that it might hold. * * @param ErrorPointer An l-value expression of type `bson_error_t*`. * * If the passed pointer is null, then it will be updated to point to an anonymous * `bson_error_t` object that lives in the caller's scope. * * @note This macro is not valid in C++ because it relies on C99 compound literal semantics */ #define bson_error_reset(ErrorPointer) bson_error_reset(&(ErrorPointer), &(bson_error_t){0}) static inline void(bson_error_reset)(bson_error_t **error, bson_error_t *localptr) { if (*error == NULL) { *error = localptr; } bson_error_clear(*error); } BSON_END_DECLS #endif // BSON_ERROR_T_INCLUDED mongo-c-driver-2.2.1/src/libbson/src/bson/macros.h000066400000000000000000000277511511661753600217770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_MACROS_H #define BSON_MACROS_H #include // IWYU pragma: export #include #include #ifdef __cplusplus #include #endif #if BSON_OS == 1 #define BSON_OS_UNIX #elif BSON_OS == 2 #define BSON_OS_WIN32 #else #error "Unknown operating system." #endif #ifdef __cplusplus #define BSON_BEGIN_DECLS extern "C" { #define BSON_END_DECLS } #else #define BSON_BEGIN_DECLS #define BSON_END_DECLS #endif #if defined(__GNUC__) #define BSON_GNUC_CHECK_VERSION(major, minor) \ ((__GNUC__ > (major)) || ((__GNUC__ == (major)) && (__GNUC_MINOR__ >= (minor)))) #else #define BSON_GNUC_CHECK_VERSION(major, minor) 0 #endif #if defined(__GNUC__) #define BSON_GNUC_IS_VERSION(major, minor) ((__GNUC__ == (major)) && (__GNUC_MINOR__ == (minor))) #else #define BSON_GNUC_IS_VERSION(major, minor) 0 #endif /* Decorate public functions: * - if BSON_STATIC, we're compiling a static libbson or a program * that uses libbson as a static library. Don't decorate functions. * - else if BSON_COMPILATION, we're compiling a shared libbson, mark * public functions for export from the shared lib * - else, we're compiling a program that uses libbson as a shared library, * mark public functions as DLL imports for Microsoft Visual C */ #ifdef _MSC_VER /* * Microsoft Visual C */ #ifdef BSON_STATIC #define BSON_API #elif defined(BSON_COMPILATION) #define BSON_API __declspec(dllexport) #else #define BSON_API __declspec(dllimport) #endif #define BSON_CALL __cdecl #elif defined(__GNUC__) /* * GCC */ #ifdef BSON_STATIC #define BSON_API #elif defined(BSON_COMPILATION) #define BSON_API __attribute__((visibility("default"))) #else #define BSON_API #endif #define BSON_CALL #else /* * Other compilers */ #define BSON_API #define BSON_CALL #endif #define BSON_EXPORT(type) BSON_API type BSON_CALL #ifdef MIN #define BSON_MIN MIN #elif defined(__cplusplus) #define BSON_MIN(a, b) ((std::min)(a, b)) #elif defined(_MSC_VER) #define BSON_MIN(a, b) ((a) < (b) ? (a) : (b)) #else #define BSON_MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifdef MAX #define BSON_MAX MAX #elif defined(__cplusplus) #define BSON_MAX(a, b) ((std::max)(a, b)) #elif defined(_MSC_VER) #define BSON_MAX(a, b) ((a) > (b) ? (a) : (b)) #else #define BSON_MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifdef ABS #define BSON_ABS ABS #else #define BSON_ABS(a) (((a) < 0) ? ((a) * -1) : (a)) #endif #if defined(__cplusplus) && (__cplusplus >= 201103L || defined(_MSVC_LANG)) #define BSON_ALIGNOF(expr) alignof(expr) #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #define BSON_ALIGNOF(expr) _Alignof(expr) #else #if defined(_MSC_VER) #define BSON_ALIGNOF(expr) __alignof(expr) #else #define BSON_ALIGNOF(expr) __alignof__(expr) #endif #endif // __STDC_VERSION__ >= 201112L #ifdef _MSC_VER // __declspec (align (_N)) only permits integer literals as _N. #ifdef _WIN64 #define BSON_ALIGN_OF_PTR 8 #else #define BSON_ALIGN_OF_PTR 4 #endif #else #define BSON_ALIGN_OF_PTR (BSON_ALIGNOF(void *)) #endif #if defined(_MSC_VER) #define BSON_ALIGNED_BEGIN(_N) __declspec(align(BSON_ALIGN_OF_PTR)) #define BSON_ALIGNED_END(_N) #else #define BSON_ALIGNED_BEGIN(_N) #define BSON_ALIGNED_END(_N) __attribute__((aligned((_N) > BSON_ALIGN_OF_PTR ? BSON_ALIGN_OF_PTR : (_N)))) #endif #define bson_str_empty(s) (!s[0]) #define bson_str_empty0(s) (!s || !s[0]) #if defined(_MSC_VER) #define BSON_FUNC __FUNCTION__ #else #define BSON_FUNC __func__ #endif #if defined(_MSC_VER) #define BSON_INLINE __inline #else #define BSON_INLINE __inline__ #endif #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L #define BSON_NORETURN [[noreturn]] #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #define BSON_NORETURN _Noreturn #elif defined(__GNUC__) && 2 < __GNUC__ + (8 <= __GNUC_MINOR__) #define BSON_NORETURN __attribute__((__noreturn__)) #else #define BSON_NORETURN #endif #if defined(__GNUC__) #define BSON_RESTRICT __restrict__ #elif defined(_MSC_VER) #define BSON_RESTRICT __restrict #elif !defined(__cplusplus) // C99 (not C++) #define BSON_RESTRICT restrict #else #define BSON_RESTRICT #endif BSON_NORETURN static BSON_INLINE void _bson_assert_failed_on_line(const char *file, int line, const char *func, const char *test) { fprintf(stderr, "%s:%d %s(): assertion failed: %s\n", file, line, func, test); abort(); } BSON_NORETURN static BSON_INLINE void _bson_assert_failed_on_param(const char *param, const char *func) { fprintf(stderr, "The parameter: %s, in function %s, cannot be NULL\n", param, func); abort(); } #define BSON_ASSERT(test) \ do { \ if (!(BSON_LIKELY(test))) { \ _bson_assert_failed_on_line(__FILE__, (int)(__LINE__), BSON_FUNC, #test); \ } \ } while (0) /** * @brief Assert the expression `Assertion`, and evaluates to `Value` on * success. */ #define BSON_ASSERT_INLINE(Assertion, Value) \ ((void)((Assertion) ? (0) : (_bson_assert_failed_on_line(__FILE__, (int)(__LINE__), BSON_FUNC, #Assertion), 0)), \ Value) /** * @brief Assert that the given pointer is non-NULL, while also evaluating to * that pointer. * * Can be used to inline assertions with a pointer dereference: * * ``` * foo* f = get_foo(); * bar* b = BSON_ASSERT_PTR_INLINE(f)->bar_value; * ``` */ #define BSON_ASSERT_PTR_INLINE(Pointer) BSON_ASSERT_INLINE((Pointer) != NULL, (Pointer)) /* Used for asserting parameters to provide a more precise error message */ #define BSON_ASSERT_PARAM(param) \ do { \ if ((BSON_UNLIKELY(param == NULL))) { \ _bson_assert_failed_on_param(#param, BSON_FUNC); \ } \ } while (0) // `BSON_OPTIONAL_PARAM` is a documentation-only macro to document X may be NULL. // Useful in combination with `BSON_ASSERT_PARAM` to document and assert pointer parameters. #define BSON_OPTIONAL_PARAM(param) ((void)param) /* obsolete macros, preserved for compatibility */ #define BSON_STATIC_ASSERT(s) BSON_STATIC_ASSERT_(s, __LINE__) #define BSON_STATIC_ASSERT_JOIN(a, b) BSON_STATIC_ASSERT_JOIN2(a, b) #define BSON_STATIC_ASSERT_JOIN2(a, b) a##b #define BSON_STATIC_ASSERT_(s, l) typedef char BSON_STATIC_ASSERT_JOIN(static_assert_test_, __LINE__)[(s) ? 1 : -1] /* modern macros */ #define BSON_STATIC_ASSERT2(_name, _s) BSON_STATIC_ASSERT2_(_s, __LINE__, _name) #define BSON_STATIC_ASSERT_JOIN3(_a, _b, _name) BSON_STATIC_ASSERT_JOIN4(_a, _b, _name) #define BSON_STATIC_ASSERT_JOIN4(_a, _b, _name) _a##_b##_name #define BSON_STATIC_ASSERT2_(_s, _l, _name) \ typedef char BSON_STATIC_ASSERT_JOIN3(static_assert_test_, __LINE__, _name)[(_s) ? 1 : -1] #if defined(__GNUC__) #define BSON_GNUC_PURE __attribute__((pure)) #define BSON_GNUC_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else #define BSON_GNUC_PURE #define BSON_GNUC_WARN_UNUSED_RESULT #endif #if BSON_GNUC_CHECK_VERSION(4, 0) && !defined(_WIN32) #define BSON_GNUC_NULL_TERMINATED __attribute__((sentinel)) #define BSON_GNUC_INTERNAL __attribute__((visibility("hidden"))) #else #define BSON_GNUC_NULL_TERMINATED #define BSON_GNUC_INTERNAL #endif #if defined(__GNUC__) #define BSON_LIKELY(x) __builtin_expect(!!(x), 1) #define BSON_UNLIKELY(x) __builtin_expect(!!(x), 0) #else #define BSON_LIKELY(v) v #define BSON_UNLIKELY(v) v #endif #if defined(__clang__) #define BSON_GNUC_PRINTF(f, v) __attribute__((format(printf, f, v))) #elif BSON_GNUC_CHECK_VERSION(4, 4) #define BSON_GNUC_PRINTF(f, v) __attribute__((format(gnu_printf, f, v))) #else #define BSON_GNUC_PRINTF(f, v) #endif #if defined(__LP64__) || defined(_LP64) #define BSON_WORD_SIZE 64 #else #define BSON_WORD_SIZE 32 #endif #ifdef _MSC_VER #define BSON_ENSURE_ARRAY_PARAM_SIZE(_n) #define BSON_TYPEOF decltype #else #define BSON_ENSURE_ARRAY_PARAM_SIZE(_n) static(_n) #define BSON_TYPEOF typeof #endif /** * @brief Statically annotate an entity as deprecated, including the given deprecation message * * @param Message The message to be included in a deprecation warning. This * should be a string literal. */ #define BSON_DEPRECATED(Message) _bsonDeprecatedImpl(Message) // Pick the appropriate implementation of a deprecation attribute #if defined(_MSC_VER) // For MSVC, emit __declspec(deprecated(Msg)) #define _bsonDeprecatedImpl(Msg) __declspec(deprecated(Msg)) #elif defined(__GNUC__) && (defined(__clang__) || BSON_GNUC_CHECK_VERSION(4, 5)) // For new enough Clang and GCC, emit __attribute__((__deprecated__(Msg))) #define _bsonDeprecatedImpl(Msg) __attribute__((__deprecated__(Msg))) #elif defined(__GNUC__) // For older GCC, emit deprecation attribute without the message #define _bsonDeprecatedImpl(Msg) __attribute__((__deprecated__)) #else // For other compilers, emit nothing #define _bsonDeprecatedImpl(Msg) #endif #define BSON_DEPRECATED_FOR(F) BSON_DEPRECATED("This API is deprecated. Use " #F " instead.") #define BSON_GNUC_DEPRECATED BSON_DEPRECATED("This API is deprecated") #define BSON_GNUC_DEPRECATED_FOR(F) BSON_DEPRECATED_FOR(F) #define BSON_CONCAT_IMPL(a, ...) a##__VA_ARGS__ #define BSON_CONCAT(a, ...) BSON_CONCAT_IMPL(a, __VA_ARGS__) #define BSON_CONCAT3(a, b, c) BSON_CONCAT(a, BSON_CONCAT(b, c)) #define BSON_CONCAT4(a, b, c, d) BSON_CONCAT(BSON_CONCAT(a, b), BSON_CONCAT(c, d)) /** * @brief String-ify the given argument */ #define BSON_STR(...) #__VA_ARGS__ /** * @brief Mark the attached declared entity as "possibly-unused." * * Does nothing on MSVC. */ #if defined(__GNUC__) || defined(__clang__) #define BSON_MAYBE_UNUSED __attribute__((unused)) #else #define BSON_MAYBE_UNUSED /* Nothing for other compilers */ #endif /** * @brief Mark a point in the code as unreachable. If the point is reached, the * program will abort with an error message. * * @param What A string to include in the error message if this point is ever * executed. */ #define BSON_UNREACHABLE(What) \ do { \ fprintf(stderr, "%s:%d %s(): Unreachable code reached: %s\n", __FILE__, (int)(__LINE__), BSON_FUNC, What); \ abort(); \ } while (0) /** * @brief Silence warnings for deliberately unused variables or parameters. * * @param expr An unused variable or parameter. * */ #define BSON_UNUSED(expr) \ do { \ (void)(expr); \ } while (0) // Disable the -Wunsafe-buffer-usage warning. #define BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN #define BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END #if defined(__clang__) #if __has_warning("-Wunsafe-buffer-usage") #undef BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN #undef BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END #define BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_BEGIN \ _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wunsafe-buffer-usage\"") #define BSON_DISABLE_UNSAFE_BUFFER_USAGE_WARNING_END _Pragma("clang diagnostic pop") #endif // __has_warning("-Wunsafe-buffer-usage") #endif // defined(__clang__) #endif /* BSON_MACROS_H */ mongo-c-driver-2.2.1/src/libbson/src/bson/memory.c000066400000000000000000000315271511661753600220120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include // Ensure size of exported structs are stable. BSON_STATIC_ASSERT2(bson_mem_vtable_t, sizeof(bson_mem_vtable_t) == sizeof(void *) * 8u); // For compatibility with C standards prior to C11. static void * _aligned_alloc_impl(size_t alignment, size_t num_bytes) #if defined(BSON_HAVE_ALIGNED_ALLOC) { MC_DISABLE_IMPLICIT_WARNING_BEGIN return aligned_alloc(alignment, num_bytes); MC_DISABLE_IMPLICIT_WARNING_END } #elif defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L { void *mem = NULL; // Workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425. BSON_MAYBE_UNUSED int ret = posix_memalign(&mem, alignment, num_bytes); return mem; } #else { // Fallback to simple malloc even if it does not satisfy alignment // requirements. Note: Visual C++ _aligned_malloc requires using // _aligned_free instead of free and modifies errno on failure, both of which // breaks symmetry with C11 aligned_alloc, so it is deliberately not used. BSON_UNUSED(alignment); return malloc(num_bytes); } #endif mlib_diagnostic_push(); mlib_msvc_warning(disable : 4232); static bson_mem_vtable_t gMemVtable = {.malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free, .aligned_alloc = _aligned_alloc_impl, .padding = {0}}; mlib_diagnostic_pop(); /* *-------------------------------------------------------------------------- * * bson_malloc -- * * Allocates @num_bytes of memory and returns a pointer to it. If * malloc failed to allocate the memory, abort() is called. * * Libbson does not try to handle OOM conditions as it is beyond the * scope of this library to handle so appropriately. * * Parameters: * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_malloc(size_t num_bytes) /* IN */ { void *mem = NULL; if (BSON_LIKELY(num_bytes)) { if (BSON_UNLIKELY(!(mem = gMemVtable.malloc(num_bytes)))) { fprintf(stderr, "Failure to allocate memory in bson_malloc(). errno: %d.\n", errno); abort(); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_malloc0 -- * * Like bson_malloc() except the memory is zeroed first. This is * similar to calloc() except that abort() is called in case of * failure to allocate memory. * * Parameters: * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_malloc0(size_t num_bytes) /* IN */ { void *mem = NULL; if (BSON_LIKELY(num_bytes)) { if (BSON_UNLIKELY(!(mem = gMemVtable.calloc(1, num_bytes)))) { fprintf(stderr, "Failure to allocate memory in bson_malloc0(). errno: %d.\n", errno); abort(); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_aligned_alloc -- * * Allocates @num_bytes of memory with an alignment of @alignment and * returns a pointer to it. If malloc failed to allocate the memory, * abort() is called. * * Libbson does not try to handle OOM conditions as it is beyond the * scope of this library to handle so appropriately. * * Parameters: * @alignment: The alignment of the allocated bytes of memory. * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_aligned_alloc(size_t alignment /* IN */, size_t num_bytes /* IN */) { void *mem = NULL; if (BSON_LIKELY(num_bytes)) { if (BSON_UNLIKELY(!(mem = gMemVtable.aligned_alloc(alignment, num_bytes)))) { fprintf(stderr, "Failure to allocate memory in bson_aligned_alloc()\n"); abort(); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_aligned_alloc0 -- * * Like bson_aligned_alloc() except the memory is zeroed after allocation * for convenience. * * Parameters: * @alignment: The alignment of the allocated bytes of memory. * @num_bytes: The number of bytes to allocate. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_aligned_alloc0(size_t alignment /* IN */, size_t num_bytes /* IN */) { void *mem = NULL; if (BSON_LIKELY(num_bytes)) { if (BSON_UNLIKELY(!(mem = gMemVtable.aligned_alloc(alignment, num_bytes)))) { fprintf(stderr, "Failure to allocate memory in bson_aligned_alloc0()\n"); abort(); } memset(mem, 0, num_bytes); } return mem; } /* *-------------------------------------------------------------------------- * * bson_array_alloc -- * * Allocates memory for an array of objects. * * Libbson does not try to handle OOM conditions as it is beyond the * scope of this library to handle so appropriately. * * Parameters: * @num_elems: The number of objects to allocate. * @elem_size: The size of each object in bytes. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * *-------------------------------------------------------------------------- */ void * bson_array_alloc(size_t num_elems /* IN */, size_t elem_size /* IN */) { void *mem = NULL; size_t num_bytes = 0; BSON_ASSERT(!mlib_mul(&num_bytes, num_elems, elem_size)); if (BSON_LIKELY(num_bytes)) { mem = bson_malloc(num_bytes); } return mem; } /* *-------------------------------------------------------------------------- * * bson_array_alloc0-- * * Like bson_array_alloc() except the memory is zeroed after allocation * for convenience. * * Parameters: * @num_elems: The number of objects to allocate. * @elem_size: The size of each object in bytes. * * Returns: * A pointer if successful; otherwise abort() is called and this * function will never return. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_array_alloc0(size_t num_elems /* IN */, size_t elem_size /* IN */) { void *mem = NULL; size_t num_bytes = 0; BSON_ASSERT(!mlib_mul(&num_bytes, num_elems, elem_size)); if (BSON_LIKELY(num_bytes)) { if (BSON_UNLIKELY(!(mem = gMemVtable.calloc(num_elems, elem_size)))) { fprintf(stderr, "Failure to allocate memory in bson_array_alloc0(). errno: %d.\n", errno); abort(); } } return mem; } /* *-------------------------------------------------------------------------- * * bson_realloc -- * * This function behaves similar to realloc() except that if there is * a failure abort() is called. * * Parameters: * @mem: The memory to realloc, or NULL. * @num_bytes: The size of the new allocation or 0 to free. * * Returns: * The new allocation if successful; otherwise abort() is called and * this function never returns. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_realloc(void *mem, /* IN */ size_t num_bytes) /* IN */ { /* * Not all platforms are guaranteed to free() the memory if a call to * realloc() with a size of zero occurs. Windows, Linux, and FreeBSD do, * however, OS X does not. */ if (BSON_UNLIKELY(num_bytes == 0)) { gMemVtable.free(mem); return NULL; } mem = gMemVtable.realloc(mem, num_bytes); if (BSON_UNLIKELY(!mem)) { fprintf(stderr, "Failure to re-allocate memory in bson_realloc(). errno: %d.\n", errno); abort(); } return mem; } /* *-------------------------------------------------------------------------- * * bson_realloc_ctx -- * * This wraps bson_realloc and provides a compatible api for similar * functions with a context * * Parameters: * @mem: The memory to realloc, or NULL. * @num_bytes: The size of the new allocation or 0 to free. * @ctx: Ignored * * Returns: * The new allocation if successful; otherwise abort() is called and * this function never returns. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void * bson_realloc_ctx(void *mem, /* IN */ size_t num_bytes, /* IN */ void *ctx) /* IN */ { BSON_UNUSED(ctx); return bson_realloc(mem, num_bytes); } /* *-------------------------------------------------------------------------- * * bson_free -- * * Frees @mem using the underlying allocator. * * Currently, this only calls free() directly, but that is subject to * change. * * Parameters: * @mem: An allocation to free. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_free(void *mem) /* IN */ { gMemVtable.free(mem); } /* *-------------------------------------------------------------------------- * * bson_zero_free -- * * Frees @mem using the underlying allocator. @size bytes of @mem will * be zeroed before freeing the memory. This is useful in scenarios * where @mem contains passwords or other sensitive information. * * Parameters: * @mem: An allocation to free. * @size: The number of bytes in @mem. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_zero_free(void *mem, /* IN */ size_t size) /* IN */ { if (BSON_LIKELY(mem)) { memset(mem, 0, size); gMemVtable.free(mem); } } static void * _aligned_alloc_as_malloc(size_t alignment, size_t num_bytes) { BSON_UNUSED(alignment); return gMemVtable.malloc(num_bytes); } /* *-------------------------------------------------------------------------- * * bson_mem_set_vtable -- * * This function will change our allocation vtable. * * It is imperative that this is called at the beginning of the * process before any memory has been allocated by the default * allocator. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void bson_mem_set_vtable(const bson_mem_vtable_t *vtable) { BSON_ASSERT(vtable); if (!vtable->malloc || !vtable->calloc || !vtable->realloc || !vtable->free) { fprintf(stderr, "Failure to install BSON vtable, " "missing functions.\n"); return; } gMemVtable = *vtable; // Backwards compatibility with code prior to addition of aligned_alloc. if (!gMemVtable.aligned_alloc) { gMemVtable.aligned_alloc = _aligned_alloc_as_malloc; } } void bson_mem_restore_vtable(void) { bson_mem_vtable_t vtable = {.malloc = malloc, .calloc = calloc, .realloc = realloc, .free = free, .aligned_alloc = _aligned_alloc_impl, .padding = {0}}; bson_mem_set_vtable(&vtable); } mongo-c-driver-2.2.1/src/libbson/src/bson/memory.h000066400000000000000000000043731511661753600220160ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSON_MEMORY_H_INCLUDED #define BSON_MEMORY_H_INCLUDED #include BSON_BEGIN_DECLS typedef void *(BSON_CALL *bson_realloc_func)(void *mem, size_t num_bytes, void *ctx); typedef struct _bson_mem_vtable_t { void *(BSON_CALL *malloc)(size_t num_bytes); void *(BSON_CALL *calloc)(size_t n_members, size_t num_bytes); void *(BSON_CALL *realloc)(void *mem, size_t num_bytes); void(BSON_CALL *free)(void *mem); void *(BSON_CALL *aligned_alloc)(size_t alignment, size_t num_bytes); void *padding[3]; } bson_mem_vtable_t; BSON_EXPORT(void) bson_mem_set_vtable(const bson_mem_vtable_t *vtable); BSON_EXPORT(void) bson_mem_restore_vtable(void); BSON_EXPORT(void *) bson_malloc(size_t num_bytes); BSON_EXPORT(void *) bson_malloc0(size_t num_bytes); BSON_EXPORT(void *) bson_aligned_alloc(size_t alignment, size_t num_bytes); BSON_EXPORT(void *) bson_aligned_alloc0(size_t alignment, size_t num_bytes); BSON_EXPORT(void *) bson_array_alloc(size_t num_elems, size_t elem_size); BSON_EXPORT(void *) bson_array_alloc0(size_t num_elems, size_t elem_size); BSON_EXPORT(void *) bson_realloc(void *mem, size_t num_bytes); BSON_EXPORT(void *) bson_realloc_ctx(void *mem, size_t num_bytes, void *ctx); BSON_EXPORT(void) bson_free(void *mem); BSON_EXPORT(void) bson_zero_free(void *mem, size_t size); #define BSON_ALIGNED_ALLOC(T) ((T *)(bson_aligned_alloc(BSON_ALIGNOF(T), sizeof(T)))) #define BSON_ALIGNED_ALLOC0(T) ((T *)(bson_aligned_alloc0(BSON_ALIGNOF(T), sizeof(T)))) #define BSON_ARRAY_ALLOC(N, T) ((T *)(bson_array_alloc(N, sizeof(T)))) #define BSON_ARRAY_ALLOC0(N, T) ((T *)(bson_array_alloc0(N, sizeof(T)))) BSON_END_DECLS #endif // BSON_MEMORY_H_INCLUDED mongo-c-driver-2.2.1/src/libbson/src/bson/validate-private.h000066400000000000000000000027051511661753600237440ustar00rootroot00000000000000#ifndef BSON_VALIDATE_PRIVATE_H_INCLUDED #define BSON_VALIDATE_PRIVATE_H_INCLUDED #include enum { /** * @brief This compile-time constant represents the maximum document nesting * depth permitted by the `bson_validate` family of functions. If the nesting * depth exceeds this limit, the data will be rejected. * * This limit is intentionally larger than the default limit of MongoDB * server, since we cannot anticipate what a libbson user might actually want * to do with BSON, and to prevent accidentally rejecting data that the * server might accept. The main purpose of this limit is to prevent stack * overflow, not to reject invalid data. */ BSON_VALIDATION_MAX_NESTING_DEPTH = 500, }; /** * @brief Private function backing the implementation of validation. * * Validation was previously defined in the overburdened `bson-iter.c`, but it * is now defined in its own file. * * @param bson The document to validate. Must be non-null. * @param flags Validation control flags * @param offset Receives the offset at which validation failed. Must be non-null. * @param error Receives the error describing why validation failed. Must be non-null. * @return true If the given document has no validation errors * @return false Otherwise */ bool _bson_validate_impl_v2(const bson_t *bson, bson_validate_flags_t flags, size_t *offset, bson_error_t *error); #endif // BSON_VALIDATE_PRIVATE_H_INCLUDED mongo-c-driver-2.2.1/src/libbson/src/bson/validate.c000066400000000000000000000513061511661753600222700ustar00rootroot00000000000000/** * @file bson/validate.c * @brief Implementation of BSON document validation * @date 2025-05-28 * * This file implements the backend for the `bson_validate` family of functions. * * The `_validate_...` functions all accept `validator* self` as their first parameter, * and must `return false` AND set `self->error` if-and-only-if they encounter a validation error. * If a function returns true, it is assumed that validation of that item succeeded. * * For brevity, the `require...` macros are defined, which check conditions, set errors, * and `return false` inline. * * @copyright Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include /** * @brief User parameters for validation behavior. These correspond to the various * flags that can be given when the user requests validation */ typedef struct { /** * @brief Should we allow invalid UTF-8 in string components? * * This affects the behavior of validation of key strings and string-like * elements that require UTF-8 encoding. * * Technically invalid UTF-8 is invalid in BSON, but applications may already * rely on this being accepted. */ bool allow_invalid_utf8; /** * @brief Should we allow a zero-valued codepoint in text? * * Unicode U+0000 is a valid codepoint, but a lot of software doesn't like * it and handles it poorly. By default, we reject it, but the user may * want to allow it. * * Note that because element keys rely on null termination, element keys * cannot contain U+0000 by construction. */ bool allow_null_in_utf8; /// Should we allow element key strings to be empty strings? bool allow_empty_keys; /// Should we allow ASCII dot "." in element key strings? bool allow_dot_in_keys; /** * @brief Check for special element keys that begin with an ASCII dollar "$" * * By default, we ignore them and treat them as regular elements. If this is * enabled, we reject key strings that start with a dollar, unless it is a * special extended JSON DBRef document. * * This also enables DBRef validation, which checks the structure of a document * whose first key is "$ref". */ bool check_special_dollar_keys; } validation_params; /** * @brief State for a validator. */ typedef struct { /// The parameters that control validation behavior const validation_params *params; /// Error storage that is updated if any validation encounters an error bson_error_t error; /// The zero-based index of the byte where validation stopped in case of an error. size_t error_offset; } validator; // Undef these macros, if they are defined. #ifdef require_with_error #undef require_with_error #endif #ifdef require #undef require #endif #ifdef require_advance #undef require_advance #endif /** * @brief Check that the given condition is satisfied, or set an error and return `false` * * @param Condition The condition that should evaluate to `true` * @param Offset The byte offset where an error should be indicated. * @param Code The error code that should be set if the condition fails * @param ... The error string and format arguments to be used in the error message * * This macro assumes a `validator* self` is in scope. This macro will evaluate `return false` * if the given condition is not true. */ #define require_with_error(Condition, Offset, Code, ...) \ if (!(Condition)) { \ self->error_offset = (Offset); \ bson_set_error(&self->error, BSON_ERROR_INVALID, Code, __VA_ARGS__); \ return false; \ } else \ ((void)0) /** * @brief Check that the given condition is satisfied, or `return false` immediately. * * This macro does not modify the validator state. It only does an early-return. */ #define require(Cond) \ if (!(Cond)) { \ return false; \ } else \ ((void)0) /** * @brief Advance the pointed-to iterator, check for errors, and test whether we are done. * * @param DoneVar An l-value of type `bool` that is set to `true` if the iterator hit the end of * the document, otherwise `false` * @param IteratorPointer An expression of type `bson_iter_t*`, which will be advanced. * * If advancing the iterator results in a decoding error, then this macro sets an error * on the `validator* self` that is in scope and will immediately `return false`. */ #define require_advance(DoneVar, IteratorPointer) \ if ((DoneVar = !bson_iter_next(IteratorPointer))) { \ /* The iterator indicates that it stopped */ \ if ((IteratorPointer)->err_off) { \ /* The iterator stopped because of a decoding error */ \ require_with_error(false, (IteratorPointer)->err_off, BSON_VALIDATE_CORRUPT, "corrupt BSON"); \ } \ } else \ ((void)0) // Test if the element's key is equal to the given string static bool _key_is(bson_iter_t const *iter, const char *const key) { BSON_ASSERT_PARAM(iter); BSON_ASSERT_PARAM(key); return !strcmp(bson_iter_key(iter), key); } /** * @brief Validate a document or array object, recursively. * * @param self The validator which will be updated and used to do the validation * @param bson The object to be validated * @param depth The validation depth. We indicate an error if this exceeds a limit. * @return true If the object is valid * @return false Otherwise */ static bool _validate_doc(validator *self, const bson_t *bson, int depth); /** * @brief Validate a UTF-8 string, if-and-only-if UTF-8 validation is requested * * @param self Pointer to the validator object * @param offset The byte-offset of the string, used to set the error offset * @param u8 Pointer to the first byte in a UTF-8 string * @param u8len The length of the array pointed-to by `u8` * @return true If the UTF-8 string is valid, or if UTF-8 validation is disabled * @return false If UTF-8 validation is requested, AND (the UTF-8 string is invalid OR (UTF-8 strings should not contain * null characters and the UTF-8 string contains a null character)) */ static bool _maybe_validate_utf8(validator *self, size_t offset, const char *u8, size_t u8len) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(u8); if (self->params->allow_invalid_utf8) { // We are not doing UTF-8 checks, so always succeed return true; } // Validate UTF-8 const bool u8okay = bson_utf8_validate(u8, u8len, self->params->allow_null_in_utf8); if (u8okay) { // Valid UTF-8, no more checks return true; } // Validation error. It may be invalid UTF-8, or it could be valid UTF-8 with a disallowed null if (!self->params->allow_null_in_utf8) { // We are disallowing null in UTF-8. Check whether it is invalid UTF-8, or is // valid UTF-8 with a null character const bool u8okay_with_null = bson_utf8_validate(u8, u8len, true); if (u8okay_with_null) { // The UTF-8 is valid, but contains a null character. require_with_error( false, offset, BSON_VALIDATE_UTF8_ALLOW_NULL, "UTF-8 string contains a U+0000 (null) character"); } } // The UTF-8 is invalid, regardless of whether it contains a null character require_with_error(false, offset, BSON_VALIDATE_UTF8, "Text element is not valid UTF-8"); } // Same as `_maybe_validate_u8`, but relies on a null-terminated C string to get the string length static bool _maybe_validate_utf8_cstring(validator *self, size_t offset, const char *const u8) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(u8); return _maybe_validate_utf8(self, offset, u8, strlen(u8)); } /** * @brief Validate a string-like element (UTF-8, Symbol, or Code) * * This function relies on the representation of the text-like elements within * the iterator struct to reduce code dup around text validation. */ static bool _validate_stringlike_element(validator *self, bson_iter_t const *iter) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); // iter->d1 is the offset to the string header. Subtract 1 to exclude the null terminator const uint32_t u8len = mlib_read_u32le(iter->raw + iter->d1) - 1; // iter->d2 is the offset to the first byte of the string const char *u8 = (const char *)iter->raw + iter->d2; return _maybe_validate_utf8(self, iter->off, u8, u8len); } static bool _validate_regex_elem(validator *self, bson_iter_t const *iter) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); mlib_check(BSON_ITER_HOLDS_REGEX(iter)); const char *opts; const char *const rx = bson_iter_regex(iter, &opts); mlib_check(rx); mlib_check(opts); return _maybe_validate_utf8_cstring(self, iter->off, rx) // && _maybe_validate_utf8_cstring(self, iter->off, opts); } static bool _validate_codewscope_elem(validator *self, bson_iter_t const *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); mlib_check(BSON_ITER_HOLDS_CODEWSCOPE(iter)); // Extract the code and the scope object uint8_t const *doc; uint32_t doc_len; uint32_t u8len; const char *const u8 = bson_iter_codewscope(iter, &u8len, &doc_len, &doc); bson_t scope; require_with_error( bson_init_static(&scope, doc, doc_len), iter->off, BSON_VALIDATE_CORRUPT, "corrupt scope document"); // Validate the code string require(_maybe_validate_utf8(self, iter->off, u8, u8len)); // Now we validate the scope object. // Don't validate the scope document using the parent parameters, because it should // be treated as an opaque closure of JS variables. validation_params const scope_params = { // JS object keys can contain dots .allow_dot_in_keys = true, // JS object keys can be empty .allow_empty_keys = true, // JS strings can contain null bytes .allow_null_in_utf8 = true, // JS strings need to encode properly .allow_invalid_utf8 = false, // JS allows object keys to have dollars .check_special_dollar_keys = false, }; validator scope_validator = {.params = &scope_params}; // We could do more validation that the scope keys are valid JS identifiers, // but that would require using a full Unicode database. if (_validate_doc(&scope_validator, &scope, depth)) { // No error return true; } // Validation error. Copy the error message, adding the name of the bad element bson_set_error(&self->error, scope_validator.error.domain, scope_validator.error.code, "Error in scope document for element \"%s\": %s", bson_iter_key(iter), scope_validator.error.message); // Adjust the error offset by the offset of the iterator self->error_offset = scope_validator.error_offset + iter->off; return false; } // Validate an element's key string according to the validation rules static bool _validate_element_key(validator *self, bson_iter_t const *iter) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); const char *const key = bson_iter_key(iter); mlib_check(key); const size_t key_len = bson_iter_key_len(iter); // Check the UTF-8 of the key require(_maybe_validate_utf8(self, iter->off, key, key_len)); // Check for special keys if (self->params->check_special_dollar_keys) { // dollar-keys are checked during the startup of _validate_doc. If we get here, there's a problem. require_with_error( key[0] != '$', iter->off, BSON_VALIDATE_DOLLAR_KEYS, "Disallowed '$' in element key: \"%s\"", key); } if (!self->params->allow_empty_keys) { require_with_error(key_len != 0, iter->off, BSON_VALIDATE_EMPTY_KEYS, "Element key cannot be an empty string"); } if (!self->params->allow_dot_in_keys) { require_with_error( !strstr(key, "."), iter->off, BSON_VALIDATE_DOT_KEYS, "Disallowed '.' in element key: \"%s\"", key); } return true; } // Extract a document referred-to by the given iterator. It must point to a // document or array element. Returns `false` if `bson_init_static` returns false static bool _get_subdocument(bson_t *subdoc, bson_iter_t const *iter) { BSON_ASSERT_PARAM(subdoc); BSON_ASSERT_PARAM(iter); uint32_t len = mlib_read_u32le(iter->raw + iter->d1); uint8_t const *data = (uint8_t const *)iter->raw + iter->d1; return bson_init_static(subdoc, data, len); } // Validate the value of an element, without checking its key static bool _validate_element_value(validator *self, bson_iter_t const *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); const bson_type_t type = bson_iter_type(iter); switch (type) { default: case BSON_TYPE_EOD: BSON_UNREACHABLE("Validation execution encountered an element of type 0x0, but this should not happen as tag " "validation is handled before we get to this point."); case BSON_TYPE_DOUBLE: case BSON_TYPE_NULL: case BSON_TYPE_OID: case BSON_TYPE_INT32: case BSON_TYPE_INT64: case BSON_TYPE_MINKEY: case BSON_TYPE_MAXKEY: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_UNDEFINED: case BSON_TYPE_DECIMAL128: case BSON_TYPE_DATE_TIME: case BSON_TYPE_BOOL: // No validation on these simple scalar elements. `bson_iter_next` does validation // on these objects for us. return true; case BSON_TYPE_BINARY: // Note: BSON binary validation is handled by bson_iter_next, which checks the // internal structure properly. If we get here, then the binary data is okay. return true; case BSON_TYPE_DBPOINTER: // DBPointer contains more than just a string, but we only need to validate // the string component, which happens to align with the repr of other stringlike // elements. bson_iter_next will do the validation on the element's size. //! fallthrough case BSON_TYPE_SYMBOL: case BSON_TYPE_CODE: case BSON_TYPE_UTF8: return _validate_stringlike_element(self, iter); case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: { bson_t doc; require_with_error(_get_subdocument(&doc, iter), iter->off, BSON_VALIDATE_CORRUPT, "corrupt BSON"); if (_validate_doc(self, &doc, depth)) { // No error return true; } // Error in subdocument. Adjust the error offset for the current iterator position, // plus the key length, plus 2 for the tag and key's null terminator. self->error_offset += iter->off + bson_iter_key_len(iter) + 2; return false; } case BSON_TYPE_REGEX: return _validate_regex_elem(self, iter); case BSON_TYPE_CODEWSCOPE: return _validate_codewscope_elem(self, iter, depth); } } // Validate a single BSON element referred-to by the given iterator static bool _validate_element(validator *self, bson_iter_t *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); return _validate_element_key(self, iter) && _validate_element_value(self, iter, depth); } /** * @brief Validate the elements of a document, beginning with the element pointed-to * by the given iterator. */ static bool _validate_remaining_elements(validator *self, bson_iter_t *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); bool done = false; while (!done) { require(_validate_element(self, iter, depth)); require_advance(done, iter); } return true; } // Do validation for a DBRef document, indicated by a leading $ref key static bool _validate_dbref(validator *self, bson_iter_t *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); // The iterator must be pointing to the initial $ref element mlib_check(_key_is(iter, "$ref")); // Check that $ref is a UTF-8 element require_with_error( BSON_ITER_HOLDS_UTF8(iter), iter->off, BSON_VALIDATE_DOLLAR_KEYS, "$ref element must be a UTF-8 element"); require(_validate_element_value(self, iter, depth)); // We require an $id as the next element bool done; require_advance(done, iter); require_with_error( !done && _key_is(iter, "$id"), iter->off, BSON_VALIDATE_DOLLAR_KEYS, "Expected an $id element following $ref"); // While $id is typically a OID value, it is not constraint to any specific type, so // we just validate it as an arbitrary value. require(_validate_element_value(self, iter, depth)); // We should stop, or we should have a $db, or we may have other elements require_advance(done, iter); if (done) { // No more elements. Nothing left to check return true; } // If it's a $db, check that it's a UTF-8 string if (_key_is(iter, "$db")) { require_with_error(BSON_ITER_HOLDS_UTF8(iter), iter->off, BSON_VALIDATE_DOLLAR_KEYS, "$db element in DBRef must be a UTF-8 element"); require(_validate_element_value(self, iter, depth)); // Advance past the $db require_advance(done, iter); if (done) { // Nothing left to do return true; } } // All subsequent elements should be validated as normal, and we don't expect // any more $-keys return _validate_remaining_elements(self, iter, depth); } // If we are validating special $-keys, validate a document whose first element is a $-key static bool _validate_dollar_doc(validator *self, bson_iter_t *iter, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(iter); if (_key_is(iter, "$ref")) { return _validate_dbref(self, iter, depth); } // Have the element key validator issue an error message about the bad $-key bool okay = _validate_element_key(self, iter); mlib_check(!okay); return false; } static bool _validate_doc(validator *self, const bson_t *bson, int depth) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(bson); require_with_error( depth <= BSON_VALIDATION_MAX_NESTING_DEPTH, 0, BSON_VALIDATE_CORRUPT, "BSON document nesting depth is too deep"); // We increment the depth here, otherwise we'd have `depth + 1` in several places. ++depth; // Initialize an iterator into the document to be validated bson_iter_t iter; require_with_error( bson_iter_init(&iter, bson), 0, BSON_VALIDATE_CORRUPT, "Document header corruption, unable to iterate"); bool done; require_advance(done, &iter); if (done) { // Nothing to check (empty doc/array) return true; } // Check if the first key starts with a dollar if (self->params->check_special_dollar_keys) { const char *const key = bson_iter_key(&iter); if (key[0] == '$') { return _validate_dollar_doc(self, &iter, depth); } } return _validate_remaining_elements(self, &iter, depth); } // This private function is called by `bson_validate_with_error_and_offset` bool _bson_validate_impl_v2(const bson_t *bson, bson_validate_flags_t flags, size_t *offset, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(offset); BSON_ASSERT_PARAM(error); // Clear the error *error = (bson_error_t){0}; // Initialize validation parameters validation_params const params = { .allow_invalid_utf8 = !(flags & BSON_VALIDATE_UTF8), .allow_null_in_utf8 = flags & BSON_VALIDATE_UTF8_ALLOW_NULL, .check_special_dollar_keys = (flags & BSON_VALIDATE_DOLLAR_KEYS), .allow_dot_in_keys = !(flags & BSON_VALIDATE_DOT_KEYS), .allow_empty_keys = !(flags & BSON_VALIDATE_EMPTY_KEYS), }; // Start the validator on the root document validator v = {.params = ¶ms}; bool okay = _validate_doc(&v, bson, 0); *offset = v.error_offset; *error = v.error; mlib_check(okay == (v.error.code == 0) && "Validation routine should return `false` if-and-only-if it sets an error code"); return okay; } mongo-c-driver-2.2.1/src/libbson/src/bson/version.h.in000066400000000000000000000046051511661753600225760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // clang-format off #ifndef BSON_VERSION_H #define BSON_VERSION_H /** * BSON_MAJOR_VERSION: * * BSON major version component (e.g. 1 if %BSON_VERSION is 1.2.3) */ #define BSON_MAJOR_VERSION (@libbson_VERSION_MAJOR@) /** * BSON_MINOR_VERSION: * * BSON minor version component (e.g. 2 if %BSON_VERSION is 1.2.3) */ #define BSON_MINOR_VERSION (@libbson_VERSION_MINOR@) /** * BSON_MICRO_VERSION: * * BSON micro version component (e.g. 3 if %BSON_VERSION is 1.2.3) */ #define BSON_MICRO_VERSION (@libbson_VERSION_PATCH@) /** * BSON_PRERELEASE_VERSION: * * BSON prerelease version component (e.g. pre if %BSON_VERSION is 1.2.3-pre) */ #define BSON_PRERELEASE_VERSION (@libbson_VERSION_PRERELEASE@) /** * BSON_VERSION: * * BSON version. */ #define BSON_VERSION (@libbson_VERSION_FULL@) /** * BSON_VERSION_S: * * BSON version, encoded as a string, useful for printing and * concatenation. */ #define BSON_VERSION_S "@libbson_VERSION_FULL@" /** * BSON_VERSION_HEX: * * BSON version, encoded as an hexadecimal number, useful for * integer comparisons. */ #define BSON_VERSION_HEX (BSON_MAJOR_VERSION << 24 | \ BSON_MINOR_VERSION << 16 | \ BSON_MICRO_VERSION << 8) /** * BSON_CHECK_VERSION: * @major: required major version * @minor: required minor version * @micro: required micro version * * Compile-time version checking. Evaluates to %TRUE if the version * of BSON is greater than or equal to the required one. */ #define BSON_CHECK_VERSION(major,minor,micro) \ (BSON_MAJOR_VERSION > (major) || \ (BSON_MAJOR_VERSION == (major) && BSON_MINOR_VERSION > (minor)) || \ (BSON_MAJOR_VERSION == (major) && BSON_MINOR_VERSION == (minor) && \ BSON_MICRO_VERSION >= (micro))) #endif /* BSON_VERSION_H */ mongo-c-driver-2.2.1/src/libbson/src/jsonsl/000077500000000000000000000000001511661753600206755ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/src/jsonsl/LICENSE000066400000000000000000000020721511661753600217030ustar00rootroot00000000000000Copyright (c) 2012-2015 M. Nunberg, mnunberg@haskalah.org 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. mongo-c-driver-2.2.1/src/libbson/src/jsonsl/jsonsl.c000066400000000000000000001453611511661753600223630ustar00rootroot00000000000000/* Copyright (C) 2012-2015 Mark Nunberg. * * See included LICENSE file for license details. */ #include #include #include #include #define CASE_DIGITS \ case '1': \ case '2': \ case '3': \ case '4': \ case '5': \ case '6': \ case '7': \ case '8': \ case '9': \ case '0': static unsigned extract_special(unsigned); static int is_special_end(unsigned); static int is_allowed_whitespace(unsigned); static int is_allowed_escape(unsigned); static int is_simple_char(unsigned); static char get_escape_equiv(unsigned); jsonsl_t jsonsl_new(int nlevels) { unsigned int ii; struct jsonsl_st * jsn; if (nlevels < 2) { return NULL; } jsn = (struct jsonsl_st *) bson_malloc0(sizeof (*jsn) + ( (nlevels) * sizeof (struct jsonsl_state_st) ) ); jsn->levels_max = (unsigned int) nlevels; jsn->max_callback_level = UINT_MAX; jsonsl_reset(jsn); for (ii = 0; ii < jsn->levels_max; ii++) { jsn->stack[ii].level = ii; } return jsn; } void jsonsl_reset(jsonsl_t jsn) { jsn->tok_last = 0; jsn->can_insert = 1; jsn->pos = 0; jsn->level = 0; jsn->stopfl = 0; jsn->in_escape = 0; jsn->expecting = 0; } void jsonsl_destroy(jsonsl_t jsn) { if (jsn) { bson_free(jsn); } } #define FASTPARSE_EXHAUSTED 1 #define FASTPARSE_BREAK 0 /* * This function is meant to accelerate string parsing, reducing the main loop's * check if we are indeed a string. * * @param jsn the parser * @param[in,out] bytes_p A pointer to the current buffer (i.e. current position) * @param[in,out] nbytes_p A pointer to the current size of the buffer * @return true if all bytes have been exhausted (and thus the main loop can * return), false if a special character was examined which requires greater * examination. */ static int jsonsl__str_fastparse(jsonsl_t jsn, const jsonsl_uchar_t **bytes_p, size_t *nbytes_p) { const jsonsl_uchar_t *bytes = *bytes_p; const jsonsl_uchar_t *end; for (end = bytes + *nbytes_p; bytes != end; bytes++) { if ( #ifdef JSONSL_USE_WCHAR *bytes >= 0x100 || #endif /* JSONSL_USE_WCHAR */ (is_simple_char(*bytes))) { } else { /* Once we're done here, re-calculate the position variables */ jsn->pos += (bytes - *bytes_p); *nbytes_p -= (bytes - *bytes_p); *bytes_p = bytes; return FASTPARSE_BREAK; } } /* Once we're done here, re-calculate the position variables */ jsn->pos += (bytes - *bytes_p); return FASTPARSE_EXHAUSTED; } /* Functions exactly like str_fastparse, except it also accepts a 'state' * argument, since the number's value is updated in the state. */ static int jsonsl__num_fastparse(jsonsl_t jsn, const jsonsl_uchar_t **bytes_p, size_t *nbytes_p, struct jsonsl_state_st *state) { int exhausted = 1; size_t nbytes = *nbytes_p; const jsonsl_uchar_t *bytes = *bytes_p; for (; nbytes; nbytes--, bytes++) { jsonsl_uchar_t c = *bytes; if (isdigit(c)) { state->nelem = (state->nelem * 10) + (c - 0x30); } else { exhausted = 0; break; } } jsn->pos += (*nbytes_p - nbytes); if (exhausted) { return FASTPARSE_EXHAUSTED; } *nbytes_p = nbytes; *bytes_p = bytes; return FASTPARSE_BREAK; } void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes) { #define INVOKE_ERROR(eb) \ if (1) { \ if (jsn->error_callback(jsn, JSONSL_ERROR_##eb, state, (char*)c)) { \ goto GT_AGAIN; \ } \ return; \ } else ((void)0) #define STACK_PUSH \ if (1) { \ if (jsn->level >= (levels_max-1)) { \ jsn->error_callback(jsn, JSONSL_ERROR_LEVELS_EXCEEDED, state, (char*)c); \ return; \ } \ state = jsn->stack + (++jsn->level); \ state->ignore_callback = jsn->stack[jsn->level-1].ignore_callback; \ state->pos_begin = jsn->pos; \ } else ((void)0) #define CALLBACK_AND_POP_NOPOS(T) \ if (1) { \ state->pos_cur = jsn->pos; \ DO_CALLBACK(T, POP); \ state->nescapes = 0; \ state = jsn->stack + (--jsn->level); \ } else ((void)0) #define CALLBACK_AND_POP(T) \ if (1) { \ CALLBACK_AND_POP_NOPOS(T); \ state->pos_cur = jsn->pos; \ } else ((void)0) #define SPECIAL_POP \ if (1) { \ CALLBACK_AND_POP(SPECIAL); \ jsn->expecting = 0; \ jsn->tok_last = 0; \ } else ((void)0) #define CUR_CHAR (*(jsonsl_uchar_t*)c) #define DO_CALLBACK(T, action) \ if (jsn->call_##T && \ jsn->max_callback_level > state->level && \ state->ignore_callback == 0) { \ \ if (jsn->action_callback_##action) { \ jsn->action_callback_##action(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } else if (jsn->action_callback) { \ jsn->action_callback(jsn, JSONSL_ACTION_##action, state, (jsonsl_char_t*)c); \ } \ if (jsn->stopfl) { return; } \ } else ((void)0) /** * Verifies that we are able to insert the (non-string) item into a hash. */ #define ENSURE_HVAL \ if (state->nelem % 2 == 0 && state->type == JSONSL_T_OBJECT) { \ INVOKE_ERROR(HKEY_EXPECTED); \ } else ((void)0) #define VERIFY_SPECIAL(lit, lit_len) \ if ((jsn->pos - state->pos_begin) > lit_len \ || CUR_CHAR != (lit)[jsn->pos - state->pos_begin]) { \ INVOKE_ERROR(SPECIAL_EXPECTED); \ } else ((void)0) #define VERIFY_SPECIAL_CI(lit, lit_len) \ if ((jsn->pos - state->pos_begin) > lit_len \ || tolower(CUR_CHAR) != (lit)[jsn->pos - state->pos_begin]) { \ INVOKE_ERROR(SPECIAL_EXPECTED); \ } else ((void)0) #define STATE_SPECIAL_LENGTH \ (state)->nescapes #define IS_NORMAL_NUMBER \ ((state)->special_flags == JSONSL_SPECIALf_UNSIGNED || \ (state)->special_flags == JSONSL_SPECIALf_SIGNED) #define STATE_NUM_LAST jsn->tok_last #define CONTINUE_NEXT_CHAR() continue const jsonsl_uchar_t *c = (jsonsl_uchar_t*)bytes; size_t levels_max = jsn->levels_max; struct jsonsl_state_st *state = jsn->stack + jsn->level; jsn->base = bytes; for (; nbytes; nbytes--, jsn->pos++, c++) { unsigned state_type; GT_AGAIN: state_type = state->type; /* Most common type is typically a string: */ if (state_type & JSONSL_Tf_STRINGY) { /* Special escape handling for some stuff */ if (jsn->in_escape) { jsn->in_escape = 0; if (!is_allowed_escape(CUR_CHAR)) { INVOKE_ERROR(ESCAPE_INVALID); } else if (CUR_CHAR == 'u') { DO_CALLBACK(UESCAPE, UESCAPE); if (jsn->return_UESCAPE) { return; } } CONTINUE_NEXT_CHAR(); } if (jsonsl__str_fastparse(jsn, &c, &nbytes) == FASTPARSE_EXHAUSTED) { /* No need to readjust variables as we've exhausted the iterator */ return; } else { if (CUR_CHAR == '"') { goto GT_QUOTE; } else if (CUR_CHAR == '\\') { goto GT_ESCAPE; } else { INVOKE_ERROR(WEIRD_WHITESPACE); } } } else if (state_type == JSONSL_T_SPECIAL) { /* Fast track for signed/unsigned */ if (IS_NORMAL_NUMBER) { if (jsonsl__num_fastparse(jsn, &c, &nbytes, state) == FASTPARSE_EXHAUSTED) { return; } else { goto GT_SPECIAL_NUMERIC; } } else if (state->special_flags == JSONSL_SPECIALf_DASH) { #ifdef JSONSL_PARSE_NAN if (CUR_CHAR == 'I' || CUR_CHAR == 'i') { /* parsing -Infinity? */ state->special_flags = JSONSL_SPECIALf_NEG_INF; CONTINUE_NEXT_CHAR(); } #endif if (!isdigit(CUR_CHAR)) { INVOKE_ERROR(INVALID_NUMBER); } if (CUR_CHAR == '0') { state->special_flags = JSONSL_SPECIALf_ZERO|JSONSL_SPECIALf_SIGNED; } else if (isdigit(CUR_CHAR)) { state->special_flags = JSONSL_SPECIALf_SIGNED; state->nelem = CUR_CHAR - 0x30; } else { INVOKE_ERROR(INVALID_NUMBER); } CONTINUE_NEXT_CHAR(); } else if (state->special_flags == JSONSL_SPECIALf_ZERO) { if (isdigit(CUR_CHAR)) { /* Following a zero! */ INVOKE_ERROR(INVALID_NUMBER); } /* Unset the 'zero' flag: */ if (state->special_flags & JSONSL_SPECIALf_SIGNED) { state->special_flags = JSONSL_SPECIALf_SIGNED; } else { state->special_flags = JSONSL_SPECIALf_UNSIGNED; } goto GT_SPECIAL_NUMERIC; } if ((state->special_flags & JSONSL_SPECIALf_NUMERIC) && !(state->special_flags & JSONSL_SPECIALf_INF)) { GT_SPECIAL_NUMERIC: switch (CUR_CHAR) { CASE_DIGITS STATE_NUM_LAST = '1'; CONTINUE_NEXT_CHAR(); case '.': if (state->special_flags & JSONSL_SPECIALf_FLOAT) { INVOKE_ERROR(INVALID_NUMBER); } state->special_flags |= JSONSL_SPECIALf_FLOAT; STATE_NUM_LAST = '.'; CONTINUE_NEXT_CHAR(); case 'e': case 'E': if (state->special_flags & JSONSL_SPECIALf_EXPONENT) { INVOKE_ERROR(INVALID_NUMBER); } state->special_flags |= JSONSL_SPECIALf_EXPONENT; STATE_NUM_LAST = 'e'; CONTINUE_NEXT_CHAR(); case '-': case '+': if (STATE_NUM_LAST != 'e') { INVOKE_ERROR(INVALID_NUMBER); } STATE_NUM_LAST = '-'; CONTINUE_NEXT_CHAR(); default: if (is_special_end(CUR_CHAR)) { goto GT_SPECIAL_POP; } INVOKE_ERROR(INVALID_NUMBER); break; } } /* else if (!NUMERIC) */ if (!is_special_end(CUR_CHAR)) { STATE_SPECIAL_LENGTH++; /* Verify TRUE, FALSE, NULL */ if (state->special_flags == JSONSL_SPECIALf_TRUE) { VERIFY_SPECIAL("true", 4 /* strlen("true") */); } else if (state->special_flags == JSONSL_SPECIALf_FALSE) { VERIFY_SPECIAL("false", 5 /* strlen("false") */); } else if (state->special_flags == JSONSL_SPECIALf_NULL) { VERIFY_SPECIAL("null", 4 /* strlen("null") */); #ifdef JSONSL_PARSE_NAN } else if (state->special_flags == JSONSL_SPECIALf_POS_INF) { VERIFY_SPECIAL_CI("infinity", 8 /* strlen("infinity") */); } else if (state->special_flags == JSONSL_SPECIALf_NEG_INF) { VERIFY_SPECIAL_CI("-infinity", 9 /* strlen("-infinity") */); } else if (state->special_flags == JSONSL_SPECIALf_NAN) { VERIFY_SPECIAL_CI("nan", 3 /* strlen("nan") */); } else if (state->special_flags & JSONSL_SPECIALf_NULL || state->special_flags & JSONSL_SPECIALf_NAN) { /* previous char was "n", are we parsing null or nan? */ const bool not_u = CUR_CHAR != 'u'; const bool not_a = tolower (CUR_CHAR) != 'a'; if (not_u) { state->special_flags &= ~JSONSL_SPECIALf_NULL; } if (not_a) { state->special_flags &= ~JSONSL_SPECIALf_NAN; } if (not_u && not_a) { /* This verify will always fail, as we have an 'n' * followed by a character that is neither 'a' nor 'u' * (and hence cannot be "null"). The purpose of this * VERIFY_SPECIAL is to generate an error in tokenization * that stops if a bare 'n' cannot possibly be a "nan" or * a "null". */ VERIFY_SPECIAL ("null", 4); } #endif } CONTINUE_NEXT_CHAR(); } GT_SPECIAL_POP: jsn->can_insert = 0; if (IS_NORMAL_NUMBER) { /* Nothing */ } else if (state->special_flags == JSONSL_SPECIALf_ZERO || state->special_flags == (JSONSL_SPECIALf_ZERO|JSONSL_SPECIALf_SIGNED)) { /* 0 is unsigned! */ state->special_flags = JSONSL_SPECIALf_UNSIGNED; } else if (state->special_flags == JSONSL_SPECIALf_DASH) { /* Still in dash! */ INVOKE_ERROR(INVALID_NUMBER); } else if (state->special_flags & JSONSL_SPECIALf_INF) { if (STATE_SPECIAL_LENGTH != 8) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } state->nelem = 1; } else if (state->special_flags & JSONSL_SPECIALf_NUMERIC) { /* Check that we're not at the end of a token */ if (STATE_NUM_LAST != '1') { INVOKE_ERROR(INVALID_NUMBER); } } else if (state->special_flags == JSONSL_SPECIALf_TRUE) { if (STATE_SPECIAL_LENGTH != 4) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } state->nelem = 1; } else if (state->special_flags == JSONSL_SPECIALf_FALSE) { if (STATE_SPECIAL_LENGTH != 5) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } } else if (state->special_flags == JSONSL_SPECIALf_NULL) { if (STATE_SPECIAL_LENGTH != 4) { INVOKE_ERROR(SPECIAL_INCOMPLETE); } } SPECIAL_POP; jsn->expecting = ','; if (is_allowed_whitespace(CUR_CHAR)) { CONTINUE_NEXT_CHAR(); } /** * This works because we have a non-whitespace token * which is not a special token. If this is a structural * character then it will be gracefully handled by the * switch statement. Otherwise it will default to the 'special' * state again, */ goto GT_STRUCTURAL_TOKEN; } else if (is_allowed_whitespace(CUR_CHAR)) { /* So we're not special. Harmless insignificant whitespace * passthrough */ CONTINUE_NEXT_CHAR(); } else if (extract_special(CUR_CHAR)) { /* not a string, whitespace, or structural token. must be special */ goto GT_SPECIAL_BEGIN; } if (CUR_CHAR == '"') { GT_QUOTE: jsn->can_insert = 0; switch (state_type) { /* the end of a string or hash key */ case JSONSL_T_STRING: CALLBACK_AND_POP(STRING); CONTINUE_NEXT_CHAR(); case JSONSL_T_HKEY: CALLBACK_AND_POP(HKEY); CONTINUE_NEXT_CHAR(); case JSONSL_T_OBJECT: state->nelem++; if ( (state->nelem-1) % 2 ) { /* Odd, this must be a hash value */ if (jsn->tok_last != ':') { INVOKE_ERROR(MISSING_TOKEN); } jsn->expecting = ','; /* Can't figure out what to expect next */ jsn->tok_last = 0; STACK_PUSH; state->type = JSONSL_T_STRING; DO_CALLBACK(STRING, PUSH); } else { /* hash key */ if (jsn->expecting != '"') { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = 0; jsn->expecting = ':'; STACK_PUSH; state->type = JSONSL_T_HKEY; DO_CALLBACK(HKEY, PUSH); } CONTINUE_NEXT_CHAR(); case JSONSL_T_LIST: state->nelem++; STACK_PUSH; state->type = JSONSL_T_STRING; jsn->expecting = ','; jsn->tok_last = 0; DO_CALLBACK(STRING, PUSH); CONTINUE_NEXT_CHAR(); case JSONSL_T_SPECIAL: INVOKE_ERROR(STRAY_TOKEN); break; default: INVOKE_ERROR(STRING_OUTSIDE_CONTAINER); break; } /* switch(state->type) */ } else if (CUR_CHAR == '\\') { GT_ESCAPE: /* Escape */ if ( (state->type & JSONSL_Tf_STRINGY) == 0 ) { INVOKE_ERROR(ESCAPE_OUTSIDE_STRING); } state->nescapes++; jsn->in_escape = 1; CONTINUE_NEXT_CHAR(); } /* " or \ */ GT_STRUCTURAL_TOKEN: switch (CUR_CHAR) { case ':': if (jsn->expecting != CUR_CHAR) { INVOKE_ERROR(STRAY_TOKEN); } jsn->tok_last = ':'; jsn->can_insert = 1; jsn->expecting = '"'; CONTINUE_NEXT_CHAR(); case ',': /** * The comma is one of the more generic tokens. * In the context of an OBJECT, the can_insert flag * should never be set, and no other action is * necessary. */ if (jsn->expecting != CUR_CHAR) { /* make this branch execute only when we haven't manually * just placed the ',' in the expecting register. */ INVOKE_ERROR(STRAY_TOKEN); } if (state->type == JSONSL_T_OBJECT) { /* end of hash value, expect a string as a hash key */ jsn->expecting = '"'; } else { jsn->can_insert = 1; } jsn->tok_last = ','; jsn->expecting = '"'; CONTINUE_NEXT_CHAR(); /* new list or object */ /* hashes are more common */ case '{': case '[': if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } ENSURE_HVAL; state->nelem++; STACK_PUSH; /* because the constants match the opening delimiters, we can do this: */ state->type = CUR_CHAR; state->nelem = 0; jsn->can_insert = 1; if (CUR_CHAR == '{') { /* If we're a hash, we expect a key first, which is quouted */ jsn->expecting = '"'; } if (CUR_CHAR == JSONSL_T_OBJECT) { DO_CALLBACK(OBJECT, PUSH); } else { DO_CALLBACK(LIST, PUSH); } jsn->tok_last = 0; CONTINUE_NEXT_CHAR(); /* closing of list or object */ case '}': case ']': if (jsn->tok_last == ',' && jsn->options.allow_trailing_comma == 0) { INVOKE_ERROR(TRAILING_COMMA); } jsn->can_insert = 0; jsn->level--; jsn->expecting = ','; jsn->tok_last = 0; if (CUR_CHAR == ']') { if (state->type != '[') { INVOKE_ERROR(BRACKET_MISMATCH); } DO_CALLBACK(LIST, POP); } else { if (state->type != '{') { INVOKE_ERROR(BRACKET_MISMATCH); } else if (state->nelem && state->nelem % 2 != 0) { INVOKE_ERROR(VALUE_EXPECTED); } DO_CALLBACK(OBJECT, POP); } state = jsn->stack + jsn->level; state->pos_cur = jsn->pos; CONTINUE_NEXT_CHAR(); default: GT_SPECIAL_BEGIN: /** * Not a string, not a structural token, and not benign whitespace. * Technically we should iterate over the character always, but since * we are not doing full numerical/value decoding anyway (but only hinting), * we only check upon entry. */ if (state->type != JSONSL_T_SPECIAL) { int special_flags = extract_special(CUR_CHAR); if (!special_flags) { /** * Try to do some heuristics here anyway to figure out what kind of * error this is. The 'special' case is a fallback scenario anyway. */ if (CUR_CHAR == '\0') { INVOKE_ERROR(FOUND_NULL_BYTE); } else if (CUR_CHAR < 0x20) { INVOKE_ERROR(WEIRD_WHITESPACE); } else { INVOKE_ERROR(SPECIAL_EXPECTED); } } ENSURE_HVAL; state->nelem++; if (!jsn->can_insert) { INVOKE_ERROR(CANT_INSERT); } STACK_PUSH; state->type = JSONSL_T_SPECIAL; state->special_flags = special_flags; STATE_SPECIAL_LENGTH = 1; if (special_flags == JSONSL_SPECIALf_UNSIGNED) { state->nelem = CUR_CHAR - 0x30; STATE_NUM_LAST = '1'; } else { STATE_NUM_LAST = '-'; state->nelem = 0; } DO_CALLBACK(SPECIAL, PUSH); } CONTINUE_NEXT_CHAR(); } } } const char* jsonsl_strerror(jsonsl_error_t err) { if (err == JSONSL_ERROR_SUCCESS) { return "SUCCESS"; } #define X(t) \ if (err == JSONSL_ERROR_##t) \ return #t; JSONSL_XERR #undef X return ""; } const char *jsonsl_strtype(jsonsl_type_t type) { #define X(o,c) \ if (type == JSONSL_T_##o) \ return #o; JSONSL_XTYPE #undef X return "UNKNOWN TYPE"; } /* * * JPR/JSONPointer functions * * */ static jsonsl_jpr_type_t populate_component(char *in, struct jsonsl_jpr_component_st *component, char **next, jsonsl_error_t *errp) { unsigned long pctval; char *c = NULL, *outp = NULL, *end = NULL; size_t input_len; jsonsl_jpr_type_t ret = JSONSL_PATH_NONE; if (*next == NULL || *(*next) == '\0') { return JSONSL_PATH_NONE; } /* Replace the next / with a NULL */ *next = strstr(in, "/"); if (*next != NULL) { *(*next) = '\0'; /* drop the forward slash */ input_len = *next - in; end = *next; *next += 1; /* next character after the '/' */ } else { input_len = strlen(in); end = in + input_len + 1; } component->pstr = in; /* Check for special components of interest */ if (*in == JSONSL_PATH_WILDCARD_CHAR && input_len == 1) { /* Lone wildcard */ ret = JSONSL_PATH_WILDCARD; goto GT_RET; } else if (isdigit(*in)) { /* ASCII Numeric */ char *endptr; component->idx = strtoul(in, &endptr, 10); if (endptr && *endptr == '\0') { ret = JSONSL_PATH_NUMERIC; goto GT_RET; } } /* Default, it's a string */ ret = JSONSL_PATH_STRING; for (c = outp = in; c < end; c++, outp++) { char origc; if (*c != '%') { goto GT_ASSIGN; } /* * c = { [+0] = '%', [+1] = 'b', [+2] = 'e', [+3] = '\0' } */ /* Need %XX */ if (c+2 >= end) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } if (! (isxdigit(*(c+1)) && isxdigit(*(c+2))) ) { *errp = JSONSL_ERROR_PERCENT_BADHEX; return JSONSL_PATH_INVALID; } /* Temporarily null-terminate the characters */ origc = *(c+3); *(c+3) = '\0'; pctval = strtoul(c+1, NULL, 16); *(c+3) = origc; *outp = (char) pctval; c += 2; continue; GT_ASSIGN: *outp = *c; } /* Null-terminate the string */ for (; outp < c; outp++) { *outp = '\0'; } GT_RET: component->ptype = ret; if (ret != JSONSL_PATH_WILDCARD) { component->len = strlen(component->pstr); } return ret; } jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp) { char *my_copy = NULL; int count, curidx; struct jsonsl_jpr_st *ret = NULL; struct jsonsl_jpr_component_st *components = NULL; size_t origlen; jsonsl_error_t errstacked; #define JPR_BAIL(err) if (1) { *errp = err; goto GT_ERROR; } else ((void)0) if (errp == NULL) { errp = &errstacked; } if (path == NULL || *path != '/') { JPR_BAIL(JSONSL_ERROR_JPR_NOROOT); } count = 1; path++; { const char *c = path; for (; *c; c++) { if (*c == '/') { count++; if (*(c+1) == '/') { JPR_BAIL(JSONSL_ERROR_JPR_DUPSLASH); } } } } if(*path) { count++; } components = (struct jsonsl_jpr_component_st *) malloc(sizeof(*components) * count); if (!components) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } my_copy = (char *)malloc(strlen(path) + 1); if (!my_copy) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } strcpy(my_copy, path); components[0].ptype = JSONSL_PATH_ROOT; if (*my_copy) { char *cur = my_copy; int pathret = JSONSL_PATH_STRING; curidx = 1; while (curidx < count) { pathret = populate_component(cur, components + curidx, &cur, errp); if (pathret > 0) { curidx++; } else { break; } } if (pathret == JSONSL_PATH_INVALID) { JPR_BAIL(JSONSL_ERROR_JPR_BADPATH); } } else { curidx = 1; } path--; /*revert path to leading '/' */ origlen = strlen(path) + 1; ret = (struct jsonsl_jpr_st *)malloc(sizeof(*ret)); if (!ret) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } ret->orig = (char *)malloc(origlen); if (!ret->orig) { JPR_BAIL(JSONSL_ERROR_ENOMEM); } ret->components = components; ret->ncomponents = curidx; ret->basestr = my_copy; ret->norig = origlen-1; strcpy(ret->orig, path); return ret; GT_ERROR: free(my_copy); free(components); if (ret) { free(ret->orig); } free(ret); return NULL; #undef JPR_BAIL } void jsonsl_jpr_destroy(jsonsl_jpr_t jpr) { free(jpr->components); free(jpr->basestr); free(jpr->orig); free(jpr); } /** * Call when there is a possibility of a match, either as a final match or * as a path within a match * @param jpr The JPR path * @param component Component corresponding to the current element * @param prlevel The level of the *parent* * @param chtype The type of the child * @return Match status */ static jsonsl_jpr_match_t jsonsl__match_continue(jsonsl_jpr_t jpr, const struct jsonsl_jpr_component_st *component, unsigned prlevel, unsigned chtype) { const struct jsonsl_jpr_component_st *next_comp = component + 1; if (prlevel == jpr->ncomponents - 1) { /* This is the match. Check the expected type of the match against * the child */ if (jpr->match_type == 0 || jpr->match_type == chtype) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_TYPE_MISMATCH; } } if (chtype == JSONSL_T_LIST) { if (next_comp->ptype == JSONSL_PATH_NUMERIC) { return JSONSL_MATCH_POSSIBLE; } else { return JSONSL_MATCH_TYPE_MISMATCH; } } else if (chtype == JSONSL_T_OBJECT) { if (next_comp->ptype == JSONSL_PATH_NUMERIC) { return JSONSL_MATCH_TYPE_MISMATCH; } else { return JSONSL_MATCH_POSSIBLE; } } else { return JSONSL_MATCH_TYPE_MISMATCH; } } jsonsl_jpr_match_t jsonsl_path_match(jsonsl_jpr_t jpr, const struct jsonsl_state_st *parent, const struct jsonsl_state_st *child, const char *key, size_t nkey) { const struct jsonsl_jpr_component_st *comp; if (!parent) { /* No parent. Return immediately since it's always a match */ return jsonsl__match_continue(jpr, jpr->components, 0, child->type); } comp = jpr->components + parent->level; /* note that we don't need to verify the type of the match, this is * always done through the previous call to jsonsl__match_continue. * If we are in a POSSIBLE tree then we can be certain the types (at * least at this level) are correct */ if (parent->type == JSONSL_T_OBJECT) { if (comp->len != nkey || strncmp(key, comp->pstr, nkey) != 0) { return JSONSL_MATCH_NOMATCH; } } else { if (comp->idx != parent->nelem - 1) { return JSONSL_MATCH_NOMATCH; } } return jsonsl__match_continue(jpr, comp, parent->level, child->type); } jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, unsigned int parent_type, unsigned int parent_level, const char *key, size_t nkey) { /* find our current component. This is the child level */ int cmpret; struct jsonsl_jpr_component_st *p_component; p_component = jpr->components + parent_level; if (parent_level >= jpr->ncomponents) { return JSONSL_MATCH_NOMATCH; } /* Lone query for 'root' element. Always matches */ if (parent_level == 0) { if (jpr->ncomponents == 1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Wildcard, always matches */ if (p_component->ptype == JSONSL_PATH_WILDCARD) { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } /* Check numeric array index. This gets its special block so we can avoid * string comparisons */ if (p_component->ptype == JSONSL_PATH_NUMERIC) { if (parent_type == JSONSL_T_LIST) { if (p_component->idx != nkey) { /* Wrong index */ return JSONSL_MATCH_NOMATCH; } else { if (parent_level == jpr->ncomponents-1) { /* This is the last element of the path */ return JSONSL_MATCH_COMPLETE; } else { /* Intermediate element */ return JSONSL_MATCH_POSSIBLE; } } } else if (p_component->is_arridx) { /* Numeric and an array index (set explicitly by user). But not * a list for a parent */ return JSONSL_MATCH_TYPE_MISMATCH; } } else if (parent_type == JSONSL_T_LIST) { return JSONSL_MATCH_TYPE_MISMATCH; } /* Check lengths */ if (p_component->len != nkey) { return JSONSL_MATCH_NOMATCH; } /* Check string comparison */ cmpret = strncmp(p_component->pstr, key, nkey); if (cmpret == 0) { if (parent_level == jpr->ncomponents-1) { return JSONSL_MATCH_COMPLETE; } else { return JSONSL_MATCH_POSSIBLE; } } return JSONSL_MATCH_NOMATCH; } void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs) { size_t ii, *firstjmp; if (njprs == 0) { return; } jsn->jprs = BSON_ARRAY_ALLOC(njprs, jsonsl_jpr_t); jsn->jpr_count = njprs; jsn->jpr_root = BSON_ARRAY_ALLOC0(njprs * jsn->levels_max, size_t); memcpy(jsn->jprs, jprs, sizeof(jsonsl_jpr_t) * njprs); /* Set the initial jump table values */ firstjmp = jsn->jpr_root; for (ii = 0; ii < njprs; ii++) { firstjmp[ii] = ii+1; } } void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn) { if (jsn->jpr_count == 0) { return; } bson_free(jsn->jpr_root); bson_free(jsn->jprs); jsn->jprs = NULL; jsn->jpr_root = NULL; jsn->jpr_count = 0; } /** * This function should be called exactly once on each element... * This should also be called in recursive order, since we rely * on the parent having been initialized for a match. * * Since the parent is checked for a match as well, we maintain a 'serial' counter. * Whenever we traverse an element, we expect the serial to be the same as a global * integer. If they do not match, we re-initialize the context, and set the serial. * * This ensures a type of consistency without having a proactive reset by the * main lexer itself. * */ jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out) { struct jsonsl_state_st *parent_state; jsonsl_jpr_t ret = NULL; /* Jump and JPR tables for our own state and the parent state */ size_t *jmptable, *pjmptable; size_t jmp_cur, ii, ourjmpidx; if (!jsn->jpr_root) { *out = JSONSL_MATCH_NOMATCH; return NULL; } pjmptable = jsn->jpr_root + (jsn->jpr_count * (state->level-1)); jmptable = pjmptable + jsn->jpr_count; /* If the parent cannot match, then invalidate it */ if (*pjmptable == 0) { *jmptable = 0; *out = JSONSL_MATCH_NOMATCH; return NULL; } parent_state = jsn->stack + state->level - 1; if (parent_state->type == JSONSL_T_LIST) { nkey = (size_t) parent_state->nelem; } *jmptable = 0; ourjmpidx = 0; memset(jmptable, 0, sizeof(int) * jsn->jpr_count); for (ii = 0; ii < jsn->jpr_count; ii++) { jmp_cur = pjmptable[ii]; if (jmp_cur) { jsonsl_jpr_t jpr = jsn->jprs[jmp_cur-1]; *out = jsonsl_jpr_match(jpr, parent_state->type, parent_state->level, key, nkey); if (*out == JSONSL_MATCH_COMPLETE) { ret = jpr; *jmptable = 0; return ret; } else if (*out == JSONSL_MATCH_POSSIBLE) { jmptable[ourjmpidx] = ii+1; ourjmpidx++; } } else { break; } } if (!*jmptable) { *out = JSONSL_MATCH_NOMATCH; } return NULL; } const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match) { #define X(T,v) \ if ( match == JSONSL_MATCH_##T ) \ return #T; JSONSL_XMATCH #undef X return ""; } static char * jsonsl__writeutf8(uint32_t pt, char *out) { #define ADD_OUTPUT(c) if (1) { *out = (char)(c); out++; } else ((void)0) if (pt < 0x80) { ADD_OUTPUT(pt); } else if (pt < 0x800) { ADD_OUTPUT((pt >> 6) | 0xC0); ADD_OUTPUT((pt & 0x3F) | 0x80); } else if (pt < 0x10000) { ADD_OUTPUT((pt >> 12) | 0xE0); ADD_OUTPUT(((pt >> 6) & 0x3F) | 0x80); ADD_OUTPUT((pt & 0x3F) | 0x80); } else { ADD_OUTPUT((pt >> 18) | 0xF0); ADD_OUTPUT(((pt >> 12) & 0x3F) | 0x80); ADD_OUTPUT(((pt >> 6) & 0x3F) | 0x80); ADD_OUTPUT((pt & 0x3F) | 0x80); } return out; #undef ADD_OUTPUT } /* Thanks snej (https://github.com/mnunberg/jsonsl/issues/9) */ static int jsonsl__digit2int(char ch) { int d = ch - '0'; if ((unsigned) d < 10) { return d; } d = ch - 'a'; if ((unsigned) d < 6) { return d + 10; } d = ch - 'A'; if ((unsigned) d < 6) { return d + 10; } return -1; } /* Assume 's' is at least 4 bytes long */ static int jsonsl__get_uescape_16(const char *s) { int ret = 0; int cur; #define GET_DIGIT(off) \ if (1) { \ cur = jsonsl__digit2int(s[off]); \ if (cur == -1) { return -1; } \ ret |= (cur << (12 - (off * 4))); \ } else ((void)0) GET_DIGIT(0); GET_DIGIT(1); GET_DIGIT(2); GET_DIGIT(3); #undef GET_DIGIT return ret; } /** * Utility function to convert escape sequences */ size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], unsigned *oflags, jsonsl_error_t *err, const char **errat) { const unsigned char *c = (const unsigned char*)in; char *begin_p = out; unsigned oflags_s; uint16_t last_codepoint = 0; if (!oflags) { oflags = &oflags_s; } *oflags = 0; #define UNESCAPE_BAIL(e,offset) \ if (1) { \ *err = JSONSL_ERROR_##e; \ if (errat) { \ *errat = (const char*)(c+ (ptrdiff_t)(offset)); \ } \ return 0; \ } else ((void)0) for (; len; len--, c++, out++) { int uescval; if (*c != '\\') { /* Not an escape, so we don't care about this */ goto GT_ASSIGN; } if (len < 2) { UNESCAPE_BAIL(ESCAPE_INVALID, 0); } if (!is_allowed_escape(c[1])) { UNESCAPE_BAIL(ESCAPE_INVALID, 1); } if ((toEscape && toEscape[(unsigned char)c[1] & 0x7f] == 0 && c[1] != '\\' && c[1] != '"')) { /* if we don't want to unescape this string, write the escape sequence to the output */ *out++ = *c++; --len; goto GT_ASSIGN; } if (c[1] != 'u') { /* simple skip-and-replace using pre-defined maps. * TODO: should the maps actually reflect the desired * replacement character in toEscape? */ char esctmp = get_escape_equiv(c[1]); if (esctmp) { /* Check if there is a corresponding replacement */ *out = esctmp; } else { /* Just gobble up the 'reverse-solidus' */ *out = c[1]; } len--; c++; /* do not assign, just continue */ continue; } /* next == 'u' */ if (len < 6) { /* Need at least six characters.. */ UNESCAPE_BAIL(UESCAPE_TOOSHORT, 2); } uescval = jsonsl__get_uescape_16((const char *)c + 2); if (uescval == -1) { UNESCAPE_BAIL(PERCENT_BADHEX, -1); } if (last_codepoint) { uint16_t w1 = last_codepoint, w2 = (uint16_t)uescval; uint32_t cp; if (uescval < 0xDC00 || uescval > 0xDFFF) { UNESCAPE_BAIL(INVALID_CODEPOINT, -1); } cp = (w1 & 0x3FF) << 10; cp |= (w2 & 0x3FF); cp += 0x10000; out = jsonsl__writeutf8(cp, out) - 1; last_codepoint = 0; } else if (uescval < 0xD800 || uescval > 0xDFFF) { *oflags |= JSONSL_SPECIALf_NONASCII; out = jsonsl__writeutf8(uescval, out) - 1; } else if (uescval < 0xDC00) { *oflags |= JSONSL_SPECIALf_NONASCII; last_codepoint = (uint16_t)uescval; out--; } else { UNESCAPE_BAIL(INVALID_CODEPOINT, 2); } /* Post uescape cleanup */ len -= 5; /* Gobble up 5 chars after 'u' */ c += 5; continue; /* Only reached by previous branches */ GT_ASSIGN: *out = *c; } if (last_codepoint) { *err = JSONSL_ERROR_INVALID_CODEPOINT; return 0; } *err = JSONSL_ERROR_SUCCESS; return out - begin_p; } /** * Character Table definitions. * These were all generated via srcutil/genchartables.pl */ /** * This table contains the beginnings of non-string * allowable (bareword) values. */ static unsigned short Special_Table[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2c */ /* 0x2d */ JSONSL_SPECIALf_DASH /* <-> */, /* 0x2d */ /* 0x2e */ 0,0, /* 0x2f */ /* 0x30 */ JSONSL_SPECIALf_ZERO /* <0> */, /* 0x30 */ /* 0x31 */ JSONSL_SPECIALf_UNSIGNED /* <1> */, /* 0x31 */ /* 0x32 */ JSONSL_SPECIALf_UNSIGNED /* <2> */, /* 0x32 */ /* 0x33 */ JSONSL_SPECIALf_UNSIGNED /* <3> */, /* 0x33 */ /* 0x34 */ JSONSL_SPECIALf_UNSIGNED /* <4> */, /* 0x34 */ /* 0x35 */ JSONSL_SPECIALf_UNSIGNED /* <5> */, /* 0x35 */ /* 0x36 */ JSONSL_SPECIALf_UNSIGNED /* <6> */, /* 0x36 */ /* 0x37 */ JSONSL_SPECIALf_UNSIGNED /* <7> */, /* 0x37 */ /* 0x38 */ JSONSL_SPECIALf_UNSIGNED /* <8> */, /* 0x38 */ /* 0x39 */ JSONSL_SPECIALf_UNSIGNED /* <9> */, /* 0x39 */ /* 0x3a */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x48 */ /* 0x49 */ JSONSL__INF_PROXY /* */, /* 0x49 */ /* 0x4a */ 0,0,0,0, /* 0x4d */ /* 0x4e */ JSONSL__NAN_PROXY /* */, /* 0x4e */ /* 0x4f */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x65 */ /* 0x66 */ JSONSL_SPECIALf_FALSE /* */, /* 0x66 */ /* 0x67 */ 0,0, /* 0x68 */ /* 0x69 */ JSONSL__INF_PROXY /* */, /* 0x69 */ /* 0x6a */ 0,0,0,0, /* 0x6d */ /* 0x6e */ JSONSL_SPECIALf_NULL|JSONSL__NAN_PROXY /* */, /* 0x6e */ /* 0x6f */ 0,0,0,0,0, /* 0x73 */ /* 0x74 */ JSONSL_SPECIALf_TRUE /* */, /* 0x74 */ /* 0x75 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x94 */ /* 0x95 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb4 */ /* 0xb5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd4 */ /* 0xd5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0, /* 0xfe */ }; /** * Contains characters which signal the termination of any of the 'special' bareword * values. */ static int Special_Endings[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 0, /* 0x21 */ /* 0x22 */ 1 /* " */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0, /* 0x2b */ /* 0x2c */ 1 /* , */, /* 0x2c */ /* 0x2d */ 0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x39 */ /* 0x3a */ 1 /* : */, /* 0x3a */ /* 0x3b */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5a */ /* 0x5b */ 1 /* [ */, /* 0x5b */ /* 0x5c */ 1 /* \ */, /* 0x5c */ /* 0x5d */ 1 /* ] */, /* 0x5d */ /* 0x5e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x7a */ /* 0x7b */ 1 /* { */, /* 0x7b */ /* 0x7c */ 0, /* 0x7c */ /* 0x7d */ 1 /* } */, /* 0x7d */ /* 0x7e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x9d */ /* 0x9e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xbd */ /* 0xbe */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xdd */ /* 0xde */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xfd */ /* 0xfe */ 0 /* 0xfe */ }; /** * This table contains entries for the allowed whitespace as per RFC 4627 */ static int Allowed_Whitespace[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 0,0, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 1 /* */, /* 0x20 */ /* 0x21 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x40 */ /* 0x41 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x60 */ /* 0x61 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x80 */ /* 0x81 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xa0 */ /* 0xa1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xc0 */ /* 0xc1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xe0 */ /* 0xe1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; static const int String_No_Passthrough[0x100] = { /* 0x00 */ 1 /* */, /* 0x00 */ /* 0x01 */ 1 /* */, /* 0x01 */ /* 0x02 */ 1 /* */, /* 0x02 */ /* 0x03 */ 1 /* */, /* 0x03 */ /* 0x04 */ 1 /* */, /* 0x04 */ /* 0x05 */ 1 /* */, /* 0x05 */ /* 0x06 */ 1 /* */, /* 0x06 */ /* 0x07 */ 1 /* */, /* 0x07 */ /* 0x08 */ 1 /* */, /* 0x08 */ /* 0x09 */ 1 /* */, /* 0x09 */ /* 0x0a */ 1 /* */, /* 0x0a */ /* 0x0b */ 1 /* */, /* 0x0b */ /* 0x0c */ 1 /* */, /* 0x0c */ /* 0x0d */ 1 /* */, /* 0x0d */ /* 0x0e */ 1 /* */, /* 0x0e */ /* 0x0f */ 1 /* */, /* 0x0f */ /* 0x10 */ 1 /* */, /* 0x10 */ /* 0x11 */ 1 /* */, /* 0x11 */ /* 0x12 */ 1 /* */, /* 0x12 */ /* 0x13 */ 1 /* */, /* 0x13 */ /* 0x14 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x21 */ /* 0x22 */ 1 /* <"> */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x42 */ /* 0x43 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ /* 0x5c */ 1 /* <\> */, /* 0x5c */ /* 0x5d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x7c */ /* 0x7d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x9c */ /* 0x9d */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xbc */ /* 0xbd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xdc */ /* 0xdd */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xfc */ /* 0xfd */ 0,0, /* 0xfe */ }; /** * Allowable two-character 'common' escapes: */ static int Allowed_Escapes[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0, /* 0x21 */ /* 0x22 */ 1 /* <"> */, /* 0x22 */ /* 0x23 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x2e */ /* 0x2f */ 1 /* */, /* 0x2f */ /* 0x30 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f */ /* 0x50 */ 0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5b */ /* 0x5c */ 1 /* <\> */, /* 0x5c */ /* 0x5d */ 0,0,0,0,0, /* 0x61 */ /* 0x62 */ 1 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 1 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 1 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 1 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 1 /* */, /* 0x74 */ /* 0x75 */ 1 /* */, /* 0x75 */ /* 0x76 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x95 */ /* 0x96 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb5 */ /* 0xb6 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd5 */ /* 0xd6 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf5 */ /* 0xf6 */ 0,0,0,0,0,0,0,0,0, /* 0xfe */ }; /** * This table contains the _values_ for a given (single) escaped character. */ static unsigned char Escape_Equivs[0x100] = { /* 0x00 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x1f */ /* 0x20 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x3f */ /* 0x40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x5f */ /* 0x60 */ 0,0, /* 0x61 */ /* 0x62 */ 8 /* */, /* 0x62 */ /* 0x63 */ 0,0,0, /* 0x65 */ /* 0x66 */ 12 /* */, /* 0x66 */ /* 0x67 */ 0,0,0,0,0,0,0, /* 0x6d */ /* 0x6e */ 10 /* */, /* 0x6e */ /* 0x6f */ 0,0,0, /* 0x71 */ /* 0x72 */ 13 /* */, /* 0x72 */ /* 0x73 */ 0, /* 0x73 */ /* 0x74 */ 9 /* */, /* 0x74 */ /* 0x75 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x94 */ /* 0x95 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xb4 */ /* 0xb5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xd4 */ /* 0xd5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xf4 */ /* 0xf5 */ 0,0,0,0,0,0,0,0,0,0 /* 0xfe */ }; /* Definitions of above-declared static functions */ static char get_escape_equiv(unsigned c) { return Escape_Equivs[c & 0xff]; } static unsigned extract_special(unsigned c) { return Special_Table[c & 0xff]; } static int is_special_end(unsigned c) { return Special_Endings[c & 0xff]; } static int is_allowed_whitespace(unsigned c) { return c == ' ' || Allowed_Whitespace[c & 0xff]; } static int is_allowed_escape(unsigned c) { return Allowed_Escapes[c & 0xff]; } static int is_simple_char(unsigned c) { return !String_No_Passthrough[c & 0xff]; } /* Clean up all our macros! */ #undef CASE_DIGITS #undef INVOKE_ERROR #undef STACK_PUSH #undef CALLBACK_AND_POP_NOPOS #undef CALLBACK_AND_POP #undef SPECIAL_POP #undef CUR_CHAR #undef DO_CALLBACK #undef ENSURE_HVAL #undef VERIFY_SPECIAL #undef STATE_SPECIAL_LENGTH #undef IS_NORMAL_NUMBER #undef STATE_NUM_LAST #undef FASTPARSE_EXHAUSTED #undef FASTPARSE_BREAK mongo-c-driver-2.2.1/src/libbson/src/jsonsl/jsonsl.h000066400000000000000000000733611511661753600223700ustar00rootroot00000000000000/** * JSON Simple/Stacked/Stateful Lexer. * - Does not buffer data * - Maintains state * - Callback oriented * - Lightweight and fast. One source file and one header file * * Copyright (C) 2012-2015 Mark Nunberg * See included LICENSE file for license details. */ #ifndef JSONSL_H_ #define JSONSL_H_ #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #ifdef JSONSL_USE_WCHAR typedef jsonsl_char_t wchar_t; typedef jsonsl_uchar_t unsigned wchar_t; #else typedef char jsonsl_char_t; typedef unsigned char jsonsl_uchar_t; #endif /* JSONSL_USE_WCHAR */ #ifdef JSONSL_PARSE_NAN #define JSONSL__NAN_PROXY JSONSL_SPECIALf_NAN #define JSONSL__INF_PROXY JSONSL_SPECIALf_INF #else #define JSONSL__NAN_PROXY 0 #define JSONSL__INF_PROXY 0 #endif /* Stolen from http-parser.h, and possibly others */ #if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #if !defined(_MSC_VER) || _MSC_VER<1400 typedef unsigned int size_t; typedef int ssize_t; #endif #else #include #endif #if (!defined(JSONSL_STATE_GENERIC)) && (!defined(JSONSL_STATE_USER_FIELDS)) #define JSONSL_STATE_GENERIC #endif /* !defined JSONSL_STATE_GENERIC */ #ifdef JSONSL_STATE_GENERIC #define JSONSL_STATE_USER_FIELDS #endif /* JSONSL_STATE_GENERIC */ /* Additional fields for component object */ #ifndef JSONSL_JPR_COMPONENT_USER_FIELDS #define JSONSL_JPR_COMPONENT_USER_FIELDS #endif #ifndef JSONSL_INLINE #if defined(_MSC_VER) #define JSONSL_INLINE __inline #elif defined(__GNUC__) #define JSONSL_INLINE __inline__ #else #define JSONSL_INLINE inline #endif /* _MSC_VER or __GNUC__ */ #endif /* JSONSL_INLINE */ #define JSONSL_MAX_LEVELS 512 struct jsonsl_st; typedef struct jsonsl_st *jsonsl_t; typedef struct jsonsl_jpr_st* jsonsl_jpr_t; /** * This flag is true when AND'd against a type whose value * must be in "quoutes" i.e. T_HKEY and T_STRING */ #define JSONSL_Tf_STRINGY 0xffff00 /** * Constant representing the special JSON types. * The values are special and aid in speed (the OBJECT and LIST * values are the char literals of their openings). * * Their actual value is a character which attempts to resemble * some mnemonic reference to the actual type. * * If new types are added, they must fit into the ASCII printable * range (so they should be AND'd with 0x7f and yield something * meaningful) */ #define JSONSL_XTYPE \ X(STRING, '"'|JSONSL_Tf_STRINGY) \ X(HKEY, '#'|JSONSL_Tf_STRINGY) \ X(OBJECT, '{') \ X(LIST, '[') \ X(SPECIAL, '^') \ X(UESCAPE, 'u') typedef enum { #define X(o, c) \ JSONSL_T_##o = c, JSONSL_XTYPE JSONSL_T_UNKNOWN = '?', /* Abstract 'root' object */ JSONSL_T_ROOT = 0 #undef X } jsonsl_type_t; /** * Subtypes for T_SPECIAL. We define them as flags * because more than one type can be applied to a * given object. */ #define JSONSL_XSPECIAL \ X(NONE, 0) \ X(SIGNED, 1<<0) \ X(UNSIGNED, 1<<1) \ X(TRUE, 1<<2) \ X(FALSE, 1<<3) \ X(NULL, 1<<4) \ X(FLOAT, 1<<5) \ X(EXPONENT, 1<<6) \ X(NONASCII, 1<<7) \ X(NAN, 1<<8) \ X(INF, 1<<9) typedef enum { #define X(o,b) \ JSONSL_SPECIALf_##o = b, JSONSL_XSPECIAL #undef X /* Handy flags for checking */ JSONSL_SPECIALf_UNKNOWN = 1 << 10, /** @private Private */ JSONSL_SPECIALf_ZERO = 1 << 11 | JSONSL_SPECIALf_UNSIGNED, /** @private */ JSONSL_SPECIALf_DASH = 1 << 12, /** @private */ JSONSL_SPECIALf_POS_INF = (JSONSL_SPECIALf_INF), JSONSL_SPECIALf_NEG_INF = (JSONSL_SPECIALf_INF|JSONSL_SPECIALf_SIGNED), /** Type is numeric */ JSONSL_SPECIALf_NUMERIC = (JSONSL_SPECIALf_SIGNED| JSONSL_SPECIALf_UNSIGNED), /** Type is a boolean */ JSONSL_SPECIALf_BOOLEAN = (JSONSL_SPECIALf_TRUE|JSONSL_SPECIALf_FALSE), /** Type is an "extended", not integral type (but numeric) */ JSONSL_SPECIALf_NUMNOINT = (JSONSL_SPECIALf_FLOAT|JSONSL_SPECIALf_EXPONENT|JSONSL_SPECIALf_NAN |JSONSL_SPECIALf_INF) } jsonsl_special_t; /** * These are the various types of stack (or other) events * which will trigger a callback. * Like the type constants, this are also mnemonic */ #define JSONSL_XACTION \ X(PUSH, '+') \ X(POP, '-') \ X(UESCAPE, 'U') \ X(ERROR, '!') typedef enum { #define X(a,c) \ JSONSL_ACTION_##a = c, JSONSL_XACTION JSONSL_ACTION_UNKNOWN = '?' #undef X } jsonsl_action_t; /** * Various errors which may be thrown while parsing JSON */ #define JSONSL_XERR \ /* Trailing garbage characters */ \ X(GARBAGE_TRAILING) \ /* We were expecting a 'special' (numeric, true, false, null) */ \ X(SPECIAL_EXPECTED) \ /* The 'special' value was incomplete */ \ X(SPECIAL_INCOMPLETE) \ /* Found a stray token */ \ X(STRAY_TOKEN) \ /* We were expecting a token before this one */ \ X(MISSING_TOKEN) \ /* Cannot insert because the container is not ready */ \ X(CANT_INSERT) \ /* Found a '\' outside a string */ \ X(ESCAPE_OUTSIDE_STRING) \ /* Found a ':' outside of a hash */ \ X(KEY_OUTSIDE_OBJECT) \ /* found a string outside of a container */ \ X(STRING_OUTSIDE_CONTAINER) \ /* Found a null byte in middle of string */ \ X(FOUND_NULL_BYTE) \ /* Current level exceeds limit specified in constructor */ \ X(LEVELS_EXCEEDED) \ /* Got a } as a result of an opening [ or vice versa */ \ X(BRACKET_MISMATCH) \ /* We expected a key, but got something else instead */ \ X(HKEY_EXPECTED) \ /* We got an illegal control character (bad whitespace or something) */ \ X(WEIRD_WHITESPACE) \ /* Found a \u-escape, but there were less than 4 following hex digits */ \ X(UESCAPE_TOOSHORT) \ /* Invalid two-character escape */ \ X(ESCAPE_INVALID) \ /* Trailing comma */ \ X(TRAILING_COMMA) \ /* An invalid number was passed in a numeric field */ \ X(INVALID_NUMBER) \ /* Value is missing for object */ \ X(VALUE_EXPECTED) \ /* The following are for JPR Stuff */ \ \ /* Found a literal '%' but it was only followed by a single valid hex digit */ \ X(PERCENT_BADHEX) \ /* jsonpointer URI is malformed '/' */ \ X(JPR_BADPATH) \ /* Duplicate slash */ \ X(JPR_DUPSLASH) \ /* No leading root */ \ X(JPR_NOROOT) \ /* Allocation failure */ \ X(ENOMEM) \ /* Invalid unicode codepoint detected (in case of escapes) */ \ X(INVALID_CODEPOINT) typedef enum { JSONSL_ERROR_SUCCESS = 0, #define X(e) \ JSONSL_ERROR_##e, JSONSL_XERR #undef X JSONSL_ERROR_GENERIC } jsonsl_error_t; /** * A state is a single level of the stack. * Non-private data (i.e. the 'data' field, see the STATE_GENERIC section) * will remain in tact until the item is popped. * * As a result, it means a parent state object may be accessed from a child * object, (the parents fields will all be valid). This allows a user to create * an ad-hoc hierarchy on top of the JSON one. * */ struct jsonsl_state_st { /** * The JSON object type */ unsigned type; /** If this element is special, then its extended type is here */ unsigned special_flags; /** * The position (in terms of number of bytes since the first call to * jsonsl_feed()) at which the state was first pushed. This includes * opening tokens, if applicable. * * @note For strings (i.e. type & JSONSL_Tf_STRINGY is nonzero) this will * be the position of the first quote. * * @see jsonsl_st::pos which contains the _current_ position and can be * used during a POP callback to get the length of the element. */ size_t pos_begin; /**FIXME: This is redundant as the same information can be derived from * jsonsl_st::pos at pop-time */ size_t pos_cur; /** * Level of recursion into nesting. This is mainly a convenience * variable, as this can technically be deduced from the lexer's * level parameter (though the logic is not that simple) */ unsigned int level; /** * how many elements in the object/list. * For objects (hashes), an element is either * a key or a value. Thus for one complete pair, * nelem will be 2. * * For special types, this will hold the sum of the digits. * This only holds true for values which are simple signed/unsigned * numbers. Otherwise a special flag is set, and extra handling is not * performed. */ uint64_t nelem; /*TODO: merge this and special_flags into a union */ /** * Useful for an opening nest, this will prevent a callback from being * invoked on this item or any of its children */ int ignore_callback; /** * Counter which is incremented each time an escape ('\') is encountered. * This is used internally for non-string types and should only be * inspected by the user if the state actually represents a string * type. */ unsigned int nescapes; /** * Put anything you want here. if JSONSL_STATE_USER_FIELDS is here, then * the macro expansion happens here. * * You can use these fields to store hierarchical or 'tagging' information * for specific objects. * * See the documentation above for the lifetime of the state object (i.e. * if the private data points to allocated memory, it should be freed * when the object is popped, as the state object will be re-used) */ #ifndef JSONSL_STATE_GENERIC JSONSL_STATE_USER_FIELDS #else /** * Otherwise, this is a simple void * pointer for anything you want */ void *data; #endif /* JSONSL_STATE_USER_FIELDS */ }; /**Gets the number of elements in the list. * @param st The state. Must be of type JSONSL_T_LIST * @return number of elements in the list */ #define JSONSL_LIST_SIZE(st) ((st)->nelem) /**Gets the number of key-value pairs in an object * @param st The state. Must be of type JSONSL_T_OBJECT * @return the number of key-value pairs in the object */ #define JSONSL_OBJECT_SIZE(st) ((st)->nelem / 2) /**Gets the numeric value. * @param st The state. Must be of type JSONSL_T_SPECIAL and * special_flags must have the JSONSL_SPECIALf_NUMERIC flag * set. * @return the numeric value of the state. */ #define JSONSL_NUMERIC_VALUE(st) ((st)->nelem) /* * So now we need some special structure for keeping the * JPR info in sync. Preferably all in a single block * of memory (there's no need for separate allocations. * So we will define a 'table' with the following layout * * Level nPosbl JPR1_last JPR2_last JPR3_last * * 0 1 NOMATCH POSSIBLE POSSIBLE * 1 0 NOMATCH NOMATCH COMPLETE * [ table ends here because no further path is possible] * * Where the JPR..n corresponds to the number of JPRs * requested, and nPosble is a quick flag to determine * * the number of possibilities. In the future this might * be made into a proper 'jump' table, * * Since we always mark JPRs from the higher levels descending * into the lower ones, a prospective child match would first * look at the parent table to check the possibilities, and then * see which ones were possible.. * * Thus, the size of this blob would be (and these are all ints here) * nLevels * nJPR * 2. * * the 'Width' of the table would be nJPR*2, and the 'height' would be * nlevels */ /** * This is called when a stack change ocurs. * * @param jsn The lexer * @param action The type of action, this can be PUSH or POP * @param state A pointer to the stack currently affected by the action * @param at A pointer to the position of the input buffer which triggered * this action. */ typedef void (*jsonsl_stack_callback)( jsonsl_t jsn, jsonsl_action_t action, struct jsonsl_state_st* state, const jsonsl_char_t *at); /** * This is called when an error is encountered. * Sometimes it's possible to 'erase' characters (by replacing them * with whitespace). If you think you have corrected the error, you * can return a true value, in which case the parser will backtrack * and try again. * * @param jsn The lexer * @param error The error which was thrown * @param state the current state * @param a pointer to the position of the input buffer which triggered * the error. Note that this is not const, this is because you have the * possibility of modifying the character in an attempt to correct the * error * * @return zero to bail, nonzero to try again (this only makes sense if * the input buffer has been modified by this callback) */ typedef int (*jsonsl_error_callback)( jsonsl_t jsn, jsonsl_error_t error, struct jsonsl_state_st* state, jsonsl_char_t *at); struct jsonsl_st { /** Public, read-only */ /** This is the current level of the stack */ unsigned int level; /** Flag set to indicate we should stop processing */ unsigned int stopfl; /** * This is the current position, relative to the beginning * of the stream. */ size_t pos; /** This is the 'bytes' variable passed to feed() */ const jsonsl_char_t *base; /** Callback invoked for PUSH actions */ jsonsl_stack_callback action_callback_PUSH; /** Callback invoked for POP actions */ jsonsl_stack_callback action_callback_POP; /** Default callback for any action, if neither PUSH or POP callbacks are defined */ jsonsl_stack_callback action_callback; /** * Do not invoke callbacks for objects deeper than this level. * NOTE: This field establishes the lower bound for ignored callbacks, * and is thus misnamed. `min_ignore_level` would actually make more * sense, but we don't want to break API. */ unsigned int max_callback_level; /** The error callback. Invoked when an error happens. Should not be NULL */ jsonsl_error_callback error_callback; /* these are boolean flags you can modify. You will be called * about notification for each of these types if the corresponding * variable is true. */ /** * @name Callback Booleans. * These determine whether a callback is to be invoked for certain types of objects * @{*/ /** Boolean flag to enable or disable the invokcation for events on this type*/ int call_SPECIAL; int call_OBJECT; int call_LIST; int call_STRING; int call_HKEY; /*@}*/ /** * @name u-Escape handling * Special handling for the \\u-f00d type sequences. These are meant * to be translated back into the corresponding octet(s). * A special callback (if set) is invoked with *at=='u'. An application * may wish to temporarily suspend parsing and handle the 'u-' sequence * internally (or not). */ /*@{*/ /** Callback to be invoked for a u-escape */ jsonsl_stack_callback action_callback_UESCAPE; /** Boolean flag, whether to invoke the callback */ int call_UESCAPE; /** Boolean flag, whether we should return after encountering a u-escape: * the callback is invoked and then we return if this is true */ int return_UESCAPE; /*@}*/ struct { int allow_trailing_comma; } options; /** Put anything here */ void *data; /*@{*/ /** Private */ int in_escape; char expecting; char tok_last; int can_insert; unsigned int levels_max; size_t jpr_count; jsonsl_jpr_t *jprs; /* Root pointer for JPR matching information */ size_t *jpr_root; /*@}*/ #if defined(_MSC_VER) #pragma warning (push) #pragma warning (disable : 4200) #endif // defined(_MSC_VER) /** * This is the stack. Its upper bound is levels_max, or the * nlevels argument passed to jsonsl_new. If you modify this structure, * make sure that this member is last. */ struct jsonsl_state_st stack[]; #if defined(_MSC_VER) #pragma warning (pop) #endif // defined(_MSC_VER) }; /** * Creates a new lexer object, with capacity for recursion up to nlevels * * @param nlevels maximum recursion depth */ jsonsl_t jsonsl_new(int nlevels); /** * Feeds data into the lexer. * * @param jsn the lexer object * @param bytes new data to be fed * @param nbytes size of new data */ void jsonsl_feed(jsonsl_t jsn, const jsonsl_char_t *bytes, size_t nbytes); /** * Resets the internal parser state. This does not free the parser * but does clean it internally, so that the next time feed() is called, * it will be treated as a new stream * * @param jsn the lexer */ void jsonsl_reset(jsonsl_t jsn); /** * Frees the lexer, cleaning any allocated memory taken * * @param jsn the lexer */ void jsonsl_destroy(jsonsl_t jsn); /** * Gets the 'parent' element, given the current one * * @param jsn the lexer * @param cur the current nest, which should be a struct jsonsl_nest_st */ static JSONSL_INLINE struct jsonsl_state_st *jsonsl_last_state(const jsonsl_t jsn, const struct jsonsl_state_st *state) { /* Don't complain about overriding array bounds */ if (state->level > 1) { return jsn->stack + state->level - 1; } else { return NULL; } } /** * Gets the state of the last fully consumed child of this parent. This is * only valid in the parent's POP callback. * * @param the lexer * @return A pointer to the child. */ static JSONSL_INLINE struct jsonsl_state_st *jsonsl_last_child(const jsonsl_t jsn, const struct jsonsl_state_st *parent) { return jsn->stack + (parent->level + 1); } /**Call to instruct the parser to stop parsing and return. This is valid * only from within a callback */ static JSONSL_INLINE void jsonsl_stop(jsonsl_t jsn) { jsn->stopfl = 1; } /** * This enables receiving callbacks on all events. Doesn't do * anything special but helps avoid some boilerplate. * This does not touch the UESCAPE callbacks or flags. */ static JSONSL_INLINE void jsonsl_enable_all_callbacks(jsonsl_t jsn) { jsn->call_HKEY = 1; jsn->call_STRING = 1; jsn->call_OBJECT = 1; jsn->call_SPECIAL = 1; jsn->call_LIST = 1; } /** * A macro which returns true if the current state object can * have children. This means a list type or an object type. */ #define JSONSL_STATE_IS_CONTAINER(state) \ (state->type == JSONSL_T_OBJECT || state->type == JSONSL_T_LIST) /** * These two functions, dump a string representation * of the error or type, respectively. They will never * return NULL */ const char* jsonsl_strerror(jsonsl_error_t err); const char* jsonsl_strtype(jsonsl_type_t jt); /** * @name JSON Pointer API * * JSONPointer API. This isn't really related to the lexer (at least not yet) * JSONPointer provides an extremely simple specification for providing * locations within JSON objects. We will extend it a bit and allow for * providing 'wildcard' characters by which to be able to 'query' the stream. * * See http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00 * * Currently I'm implementing the 'single query' API which can only use a single * query component. In the future I will integrate my yet-to-be-published * Boyer-Moore-esque prefix searching implementation, in order to allow * multiple paths to be merged into one for quick and efficient searching. * * * JPR (as we'll refer to it within the source) can be used by splitting * the components into multiple sections, and incrementally 'track' each * component. When JSONSL delivers a 'pop' callback for a string, or a 'push' * callback for an object, we will check to see whether the index matching * the component corresponding to the current level contains a match * for our path. * * In order to do this properly, a structure must be maintained within the * parent indicating whether its children are possible matches. This flag * will be 'inherited' by call children which may conform to the match * specification, and discarded by all which do not (thereby eliminating * their children from inheriting it). * * A successful match is a complete one. One can provide multiple paths with * multiple levels of matches e.g. * /foo/bar/baz/^/blah * * @{ */ /** The wildcard character */ #ifndef JSONSL_PATH_WILDCARD_CHAR #define JSONSL_PATH_WILDCARD_CHAR '^' #endif /* WILDCARD_CHAR */ #define JSONSL_XMATCH \ X(COMPLETE,1) \ X(POSSIBLE,0) \ X(NOMATCH,-1) \ X(TYPE_MISMATCH, -2) typedef enum { #define X(T,v) \ JSONSL_MATCH_##T = v, JSONSL_XMATCH #undef X JSONSL_MATCH_UNKNOWN } jsonsl_jpr_match_t; typedef enum { JSONSL_PATH_STRING = 1, JSONSL_PATH_WILDCARD, JSONSL_PATH_NUMERIC, JSONSL_PATH_ROOT, /* Special */ JSONSL_PATH_INVALID = -1, JSONSL_PATH_NONE = 0 } jsonsl_jpr_type_t; struct jsonsl_jpr_component_st { /** The string the component points to */ char *pstr; /** if this is a numeric type, the number is 'cached' here */ unsigned long idx; /** The length of the string */ size_t len; /** The type of component (NUMERIC or STRING) */ jsonsl_jpr_type_t ptype; /** Set this to true to enforce type checking between dict keys and array * indices. jsonsl_jpr_match() will return TYPE_MISMATCH if it detects * that an array index is actually a child of a dictionary. */ short is_arridx; /* Extra fields (for more advanced searches. Default is empty) */ JSONSL_JPR_COMPONENT_USER_FIELDS }; struct jsonsl_jpr_st { /** Path components */ struct jsonsl_jpr_component_st *components; size_t ncomponents; /**Type of the match to be expected. If nonzero, will be compared against * the actual type */ unsigned match_type; /** Base of allocated string for components */ char *basestr; /** The original match string. Useful for returning to the user */ char *orig; size_t norig; }; /** * Create a new JPR object. * * @param path the JSONPointer path specification. * @param errp a pointer to a jsonsl_error_t. If this function returns NULL, * then more details will be in this variable. * * @return a new jsonsl_jpr_t object, or NULL on error. */ jsonsl_jpr_t jsonsl_jpr_new(const char *path, jsonsl_error_t *errp); /** * Destroy a JPR object */ void jsonsl_jpr_destroy(jsonsl_jpr_t jpr); /** * Match a JSON object against a type and specific level * * @param jpr the JPR object * @param parent_type the type of the parent (should be T_LIST or T_OBJECT) * @param parent_level the level of the parent * @param key the 'key' of the child. If the parent is an array, this should be * empty. * @param nkey - the length of the key. If the parent is an array (T_LIST), then * this should be the current index. * * NOTE: The key of the child means any kind of associative data related to the * element. Thus: <<< { "foo" : [ >>, * the opening array's key is "foo". * * @return a status constant. This indicates whether a match was excluded, possible, * or successful. */ jsonsl_jpr_match_t jsonsl_jpr_match(jsonsl_jpr_t jpr, unsigned int parent_type, unsigned int parent_level, const char *key, size_t nkey); /** * Alternate matching algorithm. This matching algorithm does not use * JSONPointer but relies on a more structured searching mechanism. It * assumes that there is a clear distinction between array indices and * object keys. In this case, the jsonsl_path_component_st::ptype should * be set to @ref JSONSL_PATH_NUMERIC for an array index (the * jsonsl_path_comonent_st::is_arridx field will be removed in a future * version). * * @param jpr The path * @param parent The parent structure. Can be NULL if this is the root object * @param child The child structure. Should not be NULL * @param key Object key, if an object * @param nkey Length of object key * @return Status constant if successful * * @note * For successful matching, both the key and the path itself should be normalized * to contain 'proper' utf8 sequences rather than utf16 '\uXXXX' escapes. This * should currently be done in the application. Another version of this function * may use a temporary buffer in such circumstances (allocated by the application). * * Since this function also checks the state of the child, it should only * be called on PUSH callbacks, and not POP callbacks */ jsonsl_jpr_match_t jsonsl_path_match(jsonsl_jpr_t jpr, const struct jsonsl_state_st *parent, const struct jsonsl_state_st *child, const char *key, size_t nkey); /** * Associate a set of JPR objects with a lexer instance. * This should be called before the lexer has been fed any data (and * behavior is undefined if you don't adhere to this). * * After using this function, you may subsequently call match_state() on * given states (presumably from within the callbacks). * * Note that currently the first JPR is the quickest and comes * pre-allocated with the state structure. Further JPR objects * are chained. * * @param jsn The lexer * @param jprs An array of jsonsl_jpr_t objects * @param njprs How many elements in the jprs array. */ void jsonsl_jpr_match_state_init(jsonsl_t jsn, jsonsl_jpr_t *jprs, size_t njprs); /** * This follows the same semantics as the normal match, * except we infer parent and type information from the relevant state objects. * The match status (for all possible JPR objects) is set in the *out parameter. * * If a match has succeeded, then its JPR object will be returned. In all other * instances, NULL is returned; * * @param jpr The jsonsl_jpr_t handle * @param state The jsonsl_state_st which is a candidate * @param key The hash key (if applicable, can be NULL if parent is list) * @param nkey Length of hash key (if applicable, can be zero if parent is list) * @param out A pointer to a jsonsl_jpr_match_t. This will be populated with * the match result * * @return If a match was completed in full, then the JPR object containing * the matching path will be returned. Otherwise, the return is NULL (note, this * does not mean matching has failed, it can still be part of the match: check * the out parameter). */ jsonsl_jpr_t jsonsl_jpr_match_state(jsonsl_t jsn, struct jsonsl_state_st *state, const char *key, size_t nkey, jsonsl_jpr_match_t *out); /** * Cleanup any memory allocated and any states set by * match_state_init() and match_state() * @param jsn The lexer */ void jsonsl_jpr_match_state_cleanup(jsonsl_t jsn); /** * Return a string representation of the match result returned by match() */ const char *jsonsl_strmatchtype(jsonsl_jpr_match_t match); /* @}*/ /** * Utility function to convert escape sequences into their original form. * * The decoders I've sampled do not seem to specify a standard behavior of what * to escape/unescape. * * RFC 4627 Mandates only that the quoute, backslash, and ASCII control * characters (0x00-0x1f) be escaped. It is often common for applications * to escape a '/' - however this may also be desired behavior. the JSON * spec is not clear on this, and therefore jsonsl leaves it up to you. * * Additionally, sometimes you may wish to _normalize_ JSON. This is specifically * true when dealing with 'u-escapes' which can be expressed perfectly fine * as utf8. One use case for normalization is JPR string comparison, in which * case two effectively equivalent strings may not match because one is using * u-escapes and the other proper utf8. To normalize u-escapes only, pass in * an empty `toEscape` table, enabling only the `u` index. * * @param in The input string. * @param out An allocated output (should be the same size as in) * @param len the size of the buffer * @param toEscape - A sparse array of characters to unescape. Characters * which are not present in this array, e.g. toEscape['c'] == 0 will be * ignored and passed to the output in their original form. * @param oflags If not null, and a \uXXXX escape expands to a non-ascii byte, * then this variable will have the SPECIALf_NONASCII flag on. * * @param err A pointer to an error variable. If an error ocurrs, it will be * set in this variable * @param errat If not null and an error occurs, this will be set to point * to the position within the string at which the offending character was * encountered. * * @return The effective size of the output buffer. * * @note * This function now encodes the UTF8 equivalents of utf16 escapes (i.e. * 'u-escapes'). Previously this would encode the escapes as utf16 literals, * which while still correct in some sense was confusing for many (especially * considering that the inputs were variations of char). * * @note * The output buffer will never be larger than the input buffer, since * standard escape sequences (i.e. '\t') occupy two bytes in the source * but only one byte (when unescaped) in the output. Likewise u-escapes * (i.e. \uXXXX) will occupy six bytes in the source, but at the most * two bytes when escaped. */ size_t jsonsl_util_unescape_ex(const char *in, char *out, size_t len, const int toEscape[128], unsigned *oflags, jsonsl_error_t *err, const char **errat); /** * Convenience macro to avoid passing too many parameters */ #define jsonsl_util_unescape(in, out, len, toEscape, err) \ jsonsl_util_unescape_ex(in, out, len, toEscape, NULL, err, NULL) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* JSONSL_H_ */ mongo-c-driver-2.2.1/src/libbson/tests/000077500000000000000000000000001511661753600177405ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/binary/000077500000000000000000000000001511661753600212245ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/binary/binary_deprecated.bson000066400000000000000000000000321511661753600255460ustar00rootroot00000000000000binary1234mongo-c-driver-2.2.1/src/libbson/tests/binary/cdriver2269.bson000066400000000000000000000000341511661753600240650ustar00rootroot00000000000000興mongo-c-driver-2.2.1/src/libbson/tests/binary/code_w_empty_scope.bson000066400000000000000000000000441511661753600257540ustar00rootroot00000000000000$code var a = {};mongo-c-driver-2.2.1/src/libbson/tests/binary/codewscope.bson000066400000000000000000000000331511661753600242360ustar00rootroot00000000000000foofoomongo-c-driver-2.2.1/src/libbson/tests/binary/dollarquery.bson000066400000000000000000000000221511661753600244440ustar00rootroot00000000000000$querymongo-c-driver-2.2.1/src/libbson/tests/binary/dotkey.bson000066400000000000000000000000621511661753600234040ustar00rootroot000000000000002a*b"c012mongo-c-driver-2.2.1/src/libbson/tests/binary/dotquery.bson000066400000000000000000000000171511661753600237610ustar00rootroot00000000000000abc.defmongo-c-driver-2.2.1/src/libbson/tests/binary/empty_key.bson000066400000000000000000000000211511661753600241060ustar00rootroot00000000000000valuemongo-c-driver-2.2.1/src/libbson/tests/binary/eurokey.bson000066400000000000000000000000521511661753600235670ustar00rootroot00000000000000*€€€€€€€€€€mongo-c-driver-2.2.1/src/libbson/tests/binary/overflow1.bson000066400000000000000000000000221511661753600240250ustar00rootroot00000000000000foobarmongo-c-driver-2.2.1/src/libbson/tests/binary/overflow2.bson000066400000000000000000000000301511661753600240250ustar00rootroot00000000000000foobarÿÿÿmongo-c-driver-2.2.1/src/libbson/tests/binary/overflow3.bson000066400000000000000000000000251511661753600240320ustar00rootroot00000000000000foo barmongo-c-driver-2.2.1/src/libbson/tests/binary/overflow4.bson000066400000000000000000000000341511661753600240330ustar00rootroot00000000000000foobarbazmongo-c-driver-2.2.1/src/libbson/tests/binary/readergrow.bson000066400000000000000000000234351511661753600242570ustar00rootroot00000000000000'a'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamongo-c-driver-2.2.1/src/libbson/tests/binary/stackoverflow.bson000066400000000000000001000000041511661753600247730ustar00rootroot00000000000000ýÿÿöÿÿïÿÿèÿÿáÿÿÚÿÿÓÿÿÌÿÿÅÿÿ¾ÿÿ·ÿÿ°ÿÿ©ÿÿ¢ÿÿ›ÿÿ”ÿÿÿÿ†ÿÿÿÿxÿÿqÿÿjÿÿcÿÿ\ÿÿUÿÿNÿÿGÿÿ@ÿÿ9ÿÿ2ÿÿ+ÿÿ$ÿÿÿÿÿÿÿÿÿÿÿÿúþÿóþÿìþÿåþÿÞþÿ×þÿÐþÿÉþÿÂþÿ»þÿ´þÿ­þÿ¦þÿŸþÿ˜þÿ‘þÿŠþÿƒþÿ|þÿuþÿnþÿgþÿ`þÿYþÿRþÿKþÿDþÿ=þÿ6þÿ/þÿ(þÿ!þÿþÿþÿ þÿþÿþýÿ÷ýÿðýÿéýÿâýÿÛýÿÔýÿÍýÿÆýÿ¿ýÿ¸ýÿ±ýÿªýÿ£ýÿœýÿ•ýÿŽýÿ‡ýÿ€ýÿyýÿrýÿkýÿdýÿ]ýÿVýÿOýÿHýÿAýÿ:ýÿ3ýÿ,ýÿ%ýÿýÿýÿýÿ ýÿýÿûüÿôüÿíüÿæüÿßüÿØüÿÑüÿÊüÿÃüÿ¼üÿµüÿ®üÿ§üÿ üÿ™üÿ’üÿ‹üÿ„üÿ}üÿvüÿoüÿhüÿaüÿZüÿSüÿLüÿEüÿ>üÿ7üÿ0üÿ)üÿ"üÿüÿüÿ üÿüÿÿûÿøûÿñûÿêûÿãûÿÜûÿÕûÿÎûÿÇûÿÀûÿ¹ûÿ²ûÿ«ûÿ¤ûÿûÿ–ûÿûÿˆûÿûÿzûÿsûÿlûÿeûÿ^ûÿWûÿPûÿIûÿBûÿ;ûÿ4ûÿ-ûÿ&ûÿûÿûÿûÿ ûÿûÿüúÿõúÿîúÿçúÿàúÿÙúÿÒúÿËúÿÄúÿ½úÿ¶úÿ¯úÿ¨úÿ¡úÿšúÿ“úÿŒúÿ…úÿ~úÿwúÿpúÿiúÿbúÿ[úÿTúÿMúÿFúÿ?úÿ8úÿ1úÿ*úÿ#úÿúÿúÿúÿúÿúÿùùÿòùÿëùÿäùÿÝùÿÖùÿÏùÿÈùÿÁùÿºùÿ³ùÿ¬ùÿ¥ùÿžùÿ—ùÿùÿ‰ùÿ‚ùÿ{ùÿtùÿmùÿfùÿ_ùÿXùÿQùÿJùÿCùÿ<ùÿ5ùÿ.ùÿ'ùÿ ùÿùÿùÿ ùÿùÿýøÿöøÿïøÿèøÿáøÿÚøÿÓøÿÌøÿÅøÿ¾øÿ·øÿ°øÿ©øÿ¢øÿ›øÿ”øÿøÿ†øÿøÿxøÿqøÿjøÿcøÿ\øÿUøÿNøÿGøÿ@øÿ9øÿ2øÿ+øÿ$øÿøÿøÿøÿøÿøÿú÷ÿó÷ÿì÷ÿå÷ÿÞ÷ÿ×÷ÿÐ÷ÿÉ÷ÿÂ÷ÿ»÷ÿ´÷ÿ­÷ÿ¦÷ÿŸ÷ÿ˜÷ÿ‘÷ÿŠ÷ÿƒ÷ÿ|÷ÿu÷ÿn÷ÿg÷ÿ`÷ÿY÷ÿR÷ÿK÷ÿD÷ÿ=÷ÿ6÷ÿ/÷ÿ(÷ÿ!÷ÿ÷ÿ÷ÿ ÷ÿ÷ÿþöÿ÷öÿðöÿéöÿâöÿÛöÿÔöÿÍöÿÆöÿ¿öÿ¸öÿ±öÿªöÿ£öÿœöÿ•öÿŽöÿ‡öÿ€öÿyöÿröÿköÿdöÿ]öÿVöÿOöÿHöÿAöÿ:öÿ3öÿ,öÿ%öÿöÿöÿöÿ öÿöÿûõÿôõÿíõÿæõÿßõÿØõÿÑõÿÊõÿÃõÿ¼õÿµõÿ®õÿ§õÿ õÿ™õÿ’õÿ‹õÿ„õÿ}õÿvõÿoõÿhõÿaõÿZõÿSõÿLõÿEõÿ>õÿ7õÿ0õÿ)õÿ"õÿõÿõÿ õÿõÿÿôÿøôÿñôÿêôÿãôÿÜôÿÕôÿÎôÿÇôÿÀôÿ¹ôÿ²ôÿ«ôÿ¤ôÿôÿ–ôÿôÿˆôÿôÿzôÿsôÿlôÿeôÿ^ôÿWôÿPôÿIôÿBôÿ;ôÿ4ôÿ-ôÿ&ôÿôÿôÿôÿ ôÿôÿüóÿõóÿîóÿçóÿàóÿÙóÿÒóÿËóÿÄóÿ½óÿ¶óÿ¯óÿ¨óÿ¡óÿšóÿ“óÿŒóÿ…óÿ~óÿwóÿpóÿióÿbóÿ[óÿTóÿMóÿFóÿ?óÿ8óÿ1óÿ*óÿ#óÿóÿóÿóÿóÿóÿùòÿòòÿëòÿäòÿÝòÿÖòÿÏòÿÈòÿÁòÿºòÿ³òÿ¬òÿ¥òÿžòÿ—òÿòÿ‰òÿ‚òÿ{òÿtòÿmòÿfòÿ_òÿXòÿQòÿJòÿCòÿ<òÿ5òÿ.òÿ'òÿ òÿòÿòÿ òÿòÿýñÿöñÿïñÿèñÿáñÿÚñÿÓñÿÌñÿÅñÿ¾ñÿ·ñÿ°ñÿ©ñÿ¢ñÿ›ñÿ”ñÿñÿ†ñÿñÿxñÿqñÿjñÿcñÿ\ñÿUñÿNñÿGñÿ@ñÿ9ñÿ2ñÿ+ñÿ$ñÿñÿñÿñÿñÿñÿúðÿóðÿìðÿåðÿÞðÿ×ðÿÐðÿÉðÿÂðÿ»ðÿ´ðÿ­ðÿ¦ðÿŸðÿ˜ðÿ‘ðÿŠðÿƒðÿ|ðÿuðÿnðÿgðÿ`ðÿYðÿRðÿKðÿDðÿ=ðÿ6ðÿ/ðÿ(ðÿ!ðÿðÿðÿ ðÿðÿþïÿ÷ïÿðïÿéïÿâïÿÛïÿÔïÿÍïÿÆïÿ¿ïÿ¸ïÿ±ïÿªïÿ£ïÿœïÿ•ïÿŽïÿ‡ïÿ€ïÿyïÿrïÿkïÿdïÿ]ïÿVïÿOïÿHïÿAïÿ:ïÿ3ïÿ,ïÿ%ïÿïÿïÿïÿ ïÿïÿûîÿôîÿíîÿæîÿßîÿØîÿÑîÿÊîÿÃîÿ¼îÿµîÿ®îÿ§îÿ îÿ™îÿ’îÿ‹îÿ„îÿ}îÿvîÿoîÿhîÿaîÿZîÿSîÿLîÿEîÿ>îÿ7îÿ0îÿ)îÿ"îÿîÿîÿ îÿîÿÿíÿøíÿñíÿêíÿãíÿÜíÿÕíÿÎíÿÇíÿÀíÿ¹íÿ²íÿ«íÿ¤íÿíÿ–íÿíÿˆíÿíÿzíÿsíÿlíÿeíÿ^íÿWíÿPíÿIíÿBíÿ;íÿ4íÿ-íÿ&íÿíÿíÿíÿ íÿíÿüìÿõìÿîìÿçìÿàìÿÙìÿÒìÿËìÿÄìÿ½ìÿ¶ìÿ¯ìÿ¨ìÿ¡ìÿšìÿ“ìÿŒìÿ…ìÿ~ìÿwìÿpìÿiìÿbìÿ[ìÿTìÿMìÿFìÿ?ìÿ8ìÿ1ìÿ*ìÿ#ìÿìÿìÿìÿìÿìÿùëÿòëÿëëÿäëÿÝëÿÖëÿÏëÿÈëÿÁëÿºëÿ³ëÿ¬ëÿ¥ëÿžëÿ—ëÿëÿ‰ëÿ‚ëÿ{ëÿtëÿmëÿfëÿ_ëÿXëÿQëÿJëÿCëÿ<ëÿ5ëÿ.ëÿ'ëÿ ëÿëÿëÿ ëÿëÿýêÿöêÿïêÿèêÿáêÿÚêÿÓêÿÌêÿÅêÿ¾êÿ·êÿ°êÿ©êÿ¢êÿ›êÿ”êÿêÿ†êÿêÿxêÿqêÿjêÿcêÿ\êÿUêÿNêÿGêÿ@êÿ9êÿ2êÿ+êÿ$êÿêÿêÿêÿêÿêÿúéÿóéÿìéÿåéÿÞéÿ×éÿÐéÿÉéÿÂéÿ»éÿ´éÿ­éÿ¦éÿŸéÿ˜éÿ‘éÿŠéÿƒéÿ|éÿuéÿnéÿgéÿ`éÿYéÿRéÿKéÿDéÿ=éÿ6éÿ/éÿ(éÿ!éÿéÿéÿ éÿéÿþèÿ÷èÿðèÿéèÿâèÿÛèÿÔèÿÍèÿÆèÿ¿èÿ¸èÿ±èÿªèÿ£èÿœèÿ•èÿŽèÿ‡èÿ€èÿyèÿrèÿkèÿdèÿ]èÿVèÿOèÿHèÿAèÿ:èÿ3èÿ,èÿ%èÿèÿèÿèÿ èÿèÿûçÿôçÿíçÿæçÿßçÿØçÿÑçÿÊçÿÃçÿ¼çÿµçÿ®çÿ§çÿ çÿ™çÿ’çÿ‹çÿ„çÿ}çÿvçÿoçÿhçÿaçÿZçÿSçÿLçÿEçÿ>çÿ7çÿ0çÿ)çÿ"çÿçÿçÿ çÿçÿÿæÿøæÿñæÿêæÿãæÿÜæÿÕæÿÎæÿÇæÿÀæÿ¹æÿ²æÿ«æÿ¤æÿæÿ–æÿæÿˆæÿæÿzæÿsæÿlæÿeæÿ^æÿWæÿPæÿIæÿBæÿ;æÿ4æÿ-æÿ&æÿæÿæÿæÿ æÿæÿüåÿõåÿîåÿçåÿàåÿÙåÿÒåÿËåÿÄåÿ½åÿ¶åÿ¯åÿ¨åÿ¡åÿšåÿ“åÿŒåÿ…åÿ~åÿwåÿpåÿiåÿbåÿ[åÿTåÿMåÿFåÿ?åÿ8åÿ1åÿ*åÿ#åÿåÿåÿåÿåÿåÿùäÿòäÿëäÿääÿÝäÿÖäÿÏäÿÈäÿÁäÿºäÿ³äÿ¬äÿ¥äÿžäÿ—äÿäÿ‰äÿ‚äÿ{äÿtäÿmäÿfäÿ_äÿXäÿQäÿJäÿCäÿ<äÿ5äÿ.äÿ'äÿ äÿäÿäÿ äÿäÿýãÿöãÿïãÿèãÿáãÿÚãÿÓãÿÌãÿÅãÿ¾ãÿ·ãÿ°ãÿ©ãÿ¢ãÿ›ãÿ”ãÿãÿ†ãÿãÿxãÿqãÿjãÿcãÿ\ãÿUãÿNãÿGãÿ@ãÿ9ãÿ2ãÿ+ãÿ$ãÿãÿãÿãÿãÿãÿúâÿóâÿìâÿåâÿÞâÿ×âÿÐâÿÉâÿÂâÿ»âÿ´âÿ­âÿ¦âÿŸâÿ˜âÿ‘âÿŠâÿƒâÿ|âÿuâÿnâÿgâÿ`âÿYâÿRâÿKâÿDâÿ=âÿ6âÿ/âÿ(âÿ!âÿâÿâÿ âÿâÿþáÿ÷áÿðáÿéáÿâáÿÛáÿÔáÿÍáÿÆáÿ¿áÿ¸áÿ±áÿªáÿ£áÿœáÿ•áÿŽáÿ‡áÿ€áÿyáÿráÿkáÿdáÿ]áÿVáÿOáÿHáÿAáÿ:áÿ3áÿ,áÿ%áÿáÿáÿáÿ áÿáÿûàÿôàÿíàÿæàÿßàÿØàÿÑàÿÊàÿÃàÿ¼àÿµàÿ®àÿ§àÿ àÿ™àÿ’àÿ‹àÿ„àÿ}àÿvàÿoàÿhàÿaàÿZàÿSàÿLàÿEàÿ>àÿ7àÿ0àÿ)àÿ"àÿàÿàÿ àÿàÿÿßÿøßÿñßÿêßÿãßÿÜßÿÕßÿÎßÿÇßÿÀßÿ¹ßÿ²ßÿ«ßÿ¤ßÿßÿ–ßÿßÿˆßÿßÿzßÿsßÿlßÿeßÿ^ßÿWßÿPßÿIßÿBßÿ;ßÿ4ßÿ-ßÿ&ßÿßÿßÿßÿ ßÿßÿüÞÿõÞÿîÞÿçÞÿàÞÿÙÞÿÒÞÿËÞÿÄÞÿ½Þÿ¶Þÿ¯Þÿ¨Þÿ¡ÞÿšÞÿ“ÞÿŒÞÿ…Þÿ~ÞÿwÞÿpÞÿiÞÿbÞÿ[ÞÿTÞÿMÞÿFÞÿ?Þÿ8Þÿ1Þÿ*Þÿ#ÞÿÞÿÞÿÞÿÞÿÞÿùÝÿòÝÿëÝÿäÝÿÝÝÿÖÝÿÏÝÿÈÝÿÁÝÿºÝÿ³Ýÿ¬Ýÿ¥ÝÿžÝÿ—ÝÿÝÿ‰Ýÿ‚Ýÿ{ÝÿtÝÿmÝÿfÝÿ_ÝÿXÝÿQÝÿJÝÿCÝÿ<Ýÿ5Ýÿ.Ýÿ'Ýÿ ÝÿÝÿÝÿ ÝÿÝÿýÜÿöÜÿïÜÿèÜÿáÜÿÚÜÿÓÜÿÌÜÿÅÜÿ¾Üÿ·Üÿ°Üÿ©Üÿ¢Üÿ›Üÿ”ÜÿÜÿ†ÜÿÜÿxÜÿqÜÿjÜÿcÜÿ\ÜÿUÜÿNÜÿGÜÿ@Üÿ9Üÿ2Üÿ+Üÿ$ÜÿÜÿÜÿÜÿÜÿÜÿúÛÿóÛÿìÛÿåÛÿÞÛÿ×ÛÿÐÛÿÉÛÿÂÛÿ»Ûÿ´Ûÿ­Ûÿ¦ÛÿŸÛÿ˜Ûÿ‘ÛÿŠÛÿƒÛÿ|ÛÿuÛÿnÛÿgÛÿ`ÛÿYÛÿRÛÿKÛÿDÛÿ=Ûÿ6Ûÿ/Ûÿ(Ûÿ!ÛÿÛÿÛÿ ÛÿÛÿþÚÿ÷ÚÿðÚÿéÚÿâÚÿÛÚÿÔÚÿÍÚÿÆÚÿ¿Úÿ¸Úÿ±ÚÿªÚÿ£ÚÿœÚÿ•ÚÿŽÚÿ‡Úÿ€ÚÿyÚÿrÚÿkÚÿdÚÿ]ÚÿVÚÿOÚÿHÚÿAÚÿ:Úÿ3Úÿ,Úÿ%ÚÿÚÿÚÿÚÿ ÚÿÚÿûÙÿôÙÿíÙÿæÙÿßÙÿØÙÿÑÙÿÊÙÿÃÙÿ¼ÙÿµÙÿ®Ùÿ§Ùÿ Ùÿ™Ùÿ’Ùÿ‹Ùÿ„Ùÿ}ÙÿvÙÿoÙÿhÙÿaÙÿZÙÿSÙÿLÙÿEÙÿ>Ùÿ7Ùÿ0Ùÿ)Ùÿ"ÙÿÙÿÙÿ ÙÿÙÿÿØÿøØÿñØÿêØÿãØÿÜØÿÕØÿÎØÿÇØÿÀØÿ¹Øÿ²Øÿ«Øÿ¤ØÿØÿ–ØÿØÿˆØÿØÿzØÿsØÿlØÿeØÿ^ØÿWØÿPØÿIØÿBØÿ;Øÿ4Øÿ-Øÿ&ØÿØÿØÿØÿ ØÿØÿü×ÿõ×ÿî×ÿç×ÿà×ÿÙ×ÿÒ×ÿË×ÿÄ×ÿ½×ÿ¶×ÿ¯×ÿ¨×ÿ¡×ÿš×ÿ“×ÿŒ×ÿ…×ÿ~×ÿw×ÿp×ÿi×ÿb×ÿ[×ÿT×ÿM×ÿF×ÿ?×ÿ8×ÿ1×ÿ*×ÿ#×ÿ×ÿ×ÿ×ÿ×ÿ×ÿùÖÿòÖÿëÖÿäÖÿÝÖÿÖÖÿÏÖÿÈÖÿÁÖÿºÖÿ³Öÿ¬Öÿ¥ÖÿžÖÿ—ÖÿÖÿ‰Öÿ‚Öÿ{ÖÿtÖÿmÖÿfÖÿ_ÖÿXÖÿQÖÿJÖÿCÖÿ<Öÿ5Öÿ.Öÿ'Öÿ ÖÿÖÿÖÿ ÖÿÖÿýÕÿöÕÿïÕÿèÕÿáÕÿÚÕÿÓÕÿÌÕÿÅÕÿ¾Õÿ·Õÿ°Õÿ©Õÿ¢Õÿ›Õÿ”ÕÿÕÿ†ÕÿÕÿxÕÿqÕÿjÕÿcÕÿ\ÕÿUÕÿNÕÿGÕÿ@Õÿ9Õÿ2Õÿ+Õÿ$ÕÿÕÿÕÿÕÿÕÿÕÿúÔÿóÔÿìÔÿåÔÿÞÔÿ×ÔÿÐÔÿÉÔÿÂÔÿ»Ôÿ´Ôÿ­Ôÿ¦ÔÿŸÔÿ˜Ôÿ‘ÔÿŠÔÿƒÔÿ|ÔÿuÔÿnÔÿgÔÿ`ÔÿYÔÿRÔÿKÔÿDÔÿ=Ôÿ6Ôÿ/Ôÿ(Ôÿ!ÔÿÔÿÔÿ ÔÿÔÿþÓÿ÷ÓÿðÓÿéÓÿâÓÿÛÓÿÔÓÿÍÓÿÆÓÿ¿Óÿ¸Óÿ±ÓÿªÓÿ£ÓÿœÓÿ•ÓÿŽÓÿ‡Óÿ€ÓÿyÓÿrÓÿkÓÿdÓÿ]ÓÿVÓÿOÓÿHÓÿAÓÿ:Óÿ3Óÿ,Óÿ%ÓÿÓÿÓÿÓÿ ÓÿÓÿûÒÿôÒÿíÒÿæÒÿßÒÿØÒÿÑÒÿÊÒÿÃÒÿ¼ÒÿµÒÿ®Òÿ§Òÿ Òÿ™Òÿ’Òÿ‹Òÿ„Òÿ}ÒÿvÒÿoÒÿhÒÿaÒÿZÒÿSÒÿLÒÿEÒÿ>Òÿ7Òÿ0Òÿ)Òÿ"ÒÿÒÿÒÿ ÒÿÒÿÿÑÿøÑÿñÑÿêÑÿãÑÿÜÑÿÕÑÿÎÑÿÇÑÿÀÑÿ¹Ñÿ²Ñÿ«Ñÿ¤ÑÿÑÿ–ÑÿÑÿˆÑÿÑÿzÑÿsÑÿlÑÿeÑÿ^ÑÿWÑÿPÑÿIÑÿBÑÿ;Ñÿ4Ñÿ-Ñÿ&ÑÿÑÿÑÿÑÿ ÑÿÑÿüÐÿõÐÿîÐÿçÐÿàÐÿÙÐÿÒÐÿËÐÿÄÐÿ½Ðÿ¶Ðÿ¯Ðÿ¨Ðÿ¡ÐÿšÐÿ“ÐÿŒÐÿ…Ðÿ~ÐÿwÐÿpÐÿiÐÿbÐÿ[ÐÿTÐÿMÐÿFÐÿ?Ðÿ8Ðÿ1Ðÿ*Ðÿ#ÐÿÐÿÐÿÐÿÐÿÐÿùÏÿòÏÿëÏÿäÏÿÝÏÿÖÏÿÏÏÿÈÏÿÁÏÿºÏÿ³Ïÿ¬Ïÿ¥ÏÿžÏÿ—ÏÿÏÿ‰Ïÿ‚Ïÿ{ÏÿtÏÿmÏÿfÏÿ_ÏÿXÏÿQÏÿJÏÿCÏÿ<Ïÿ5Ïÿ.Ïÿ'Ïÿ ÏÿÏÿÏÿ ÏÿÏÿýÎÿöÎÿïÎÿèÎÿáÎÿÚÎÿÓÎÿÌÎÿÅÎÿ¾Îÿ·Îÿ°Îÿ©Îÿ¢Îÿ›Îÿ”ÎÿÎÿ†ÎÿÎÿxÎÿqÎÿjÎÿcÎÿ\ÎÿUÎÿNÎÿGÎÿ@Îÿ9Îÿ2Îÿ+Îÿ$ÎÿÎÿÎÿÎÿÎÿÎÿúÍÿóÍÿìÍÿåÍÿÞÍÿ×ÍÿÐÍÿÉÍÿÂÍÿ»Íÿ´Íÿ­Íÿ¦ÍÿŸÍÿ˜Íÿ‘ÍÿŠÍÿƒÍÿ|ÍÿuÍÿnÍÿgÍÿ`ÍÿYÍÿRÍÿKÍÿDÍÿ=Íÿ6Íÿ/Íÿ(Íÿ!ÍÿÍÿÍÿ ÍÿÍÿþÌÿ÷ÌÿðÌÿéÌÿâÌÿÛÌÿÔÌÿÍÌÿÆÌÿ¿Ìÿ¸Ìÿ±ÌÿªÌÿ£ÌÿœÌÿ•ÌÿŽÌÿ‡Ìÿ€ÌÿyÌÿrÌÿkÌÿdÌÿ]ÌÿVÌÿOÌÿHÌÿAÌÿ:Ìÿ3Ìÿ,Ìÿ%ÌÿÌÿÌÿÌÿ ÌÿÌÿûËÿôËÿíËÿæËÿßËÿØËÿÑËÿÊËÿÃËÿ¼ËÿµËÿ®Ëÿ§Ëÿ Ëÿ™Ëÿ’Ëÿ‹Ëÿ„Ëÿ}ËÿvËÿoËÿhËÿaËÿZËÿSËÿLËÿEËÿ>Ëÿ7Ëÿ0Ëÿ)Ëÿ"ËÿËÿËÿ ËÿËÿÿÊÿøÊÿñÊÿêÊÿãÊÿÜÊÿÕÊÿÎÊÿÇÊÿÀÊÿ¹Êÿ²Êÿ«Êÿ¤ÊÿÊÿ–ÊÿÊÿˆÊÿÊÿzÊÿsÊÿlÊÿeÊÿ^ÊÿWÊÿPÊÿIÊÿBÊÿ;Êÿ4Êÿ-Êÿ&ÊÿÊÿÊÿÊÿ ÊÿÊÿüÉÿõÉÿîÉÿçÉÿàÉÿÙÉÿÒÉÿËÉÿÄÉÿ½Éÿ¶Éÿ¯Éÿ¨Éÿ¡ÉÿšÉÿ“ÉÿŒÉÿ…Éÿ~ÉÿwÉÿpÉÿiÉÿbÉÿ[ÉÿTÉÿMÉÿFÉÿ?Éÿ8Éÿ1Éÿ*Éÿ#ÉÿÉÿÉÿÉÿÉÿÉÿùÈÿòÈÿëÈÿäÈÿÝÈÿÖÈÿÏÈÿÈÈÿÁÈÿºÈÿ³Èÿ¬Èÿ¥ÈÿžÈÿ—ÈÿÈÿ‰Èÿ‚Èÿ{ÈÿtÈÿmÈÿfÈÿ_ÈÿXÈÿQÈÿJÈÿCÈÿ<Èÿ5Èÿ.Èÿ'Èÿ ÈÿÈÿÈÿ ÈÿÈÿýÇÿöÇÿïÇÿèÇÿáÇÿÚÇÿÓÇÿÌÇÿÅÇÿ¾Çÿ·Çÿ°Çÿ©Çÿ¢Çÿ›Çÿ”ÇÿÇÿ†ÇÿÇÿxÇÿqÇÿjÇÿcÇÿ\ÇÿUÇÿNÇÿGÇÿ@Çÿ9Çÿ2Çÿ+Çÿ$ÇÿÇÿÇÿÇÿÇÿÇÿúÆÿóÆÿìÆÿåÆÿÞÆÿׯÿÐÆÿÉÆÿÂÆÿ»Æÿ´Æÿ­Æÿ¦ÆÿŸÆÿ˜Æÿ‘ÆÿŠÆÿƒÆÿ|ÆÿuÆÿnÆÿgÆÿ`ÆÿYÆÿRÆÿKÆÿDÆÿ=Æÿ6Æÿ/Æÿ(Æÿ!ÆÿÆÿÆÿ ÆÿÆÿþÅÿ÷ÅÿðÅÿéÅÿâÅÿÛÅÿÔÅÿÍÅÿÆÅÿ¿Åÿ¸Åÿ±ÅÿªÅÿ£ÅÿœÅÿ•ÅÿŽÅÿ‡Åÿ€ÅÿyÅÿrÅÿkÅÿdÅÿ]ÅÿVÅÿOÅÿHÅÿAÅÿ:Åÿ3Åÿ,Åÿ%ÅÿÅÿÅÿÅÿ ÅÿÅÿûÄÿôÄÿíÄÿæÄÿßÄÿØÄÿÑÄÿÊÄÿÃÄÿ¼ÄÿµÄÿ®Äÿ§Äÿ Äÿ™Äÿ’Äÿ‹Äÿ„Äÿ}ÄÿvÄÿoÄÿhÄÿaÄÿZÄÿSÄÿLÄÿEÄÿ>Äÿ7Äÿ0Äÿ)Äÿ"ÄÿÄÿÄÿ ÄÿÄÿÿÃÿøÃÿñÃÿêÃÿãÃÿÜÃÿÕÃÿÎÃÿÇÃÿÀÃÿ¹Ãÿ²Ãÿ«Ãÿ¤ÃÿÃÿ–ÃÿÃÿˆÃÿÃÿzÃÿsÃÿlÃÿeÃÿ^ÃÿWÃÿPÃÿIÃÿBÃÿ;Ãÿ4Ãÿ-Ãÿ&ÃÿÃÿÃÿÃÿ ÃÿÃÿüÂÿõÂÿîÂÿçÂÿàÂÿÙÂÿÒÂÿËÂÿÄÂÿ½Âÿ¶Âÿ¯Âÿ¨Âÿ¡ÂÿšÂÿ“ÂÿŒÂÿ…Âÿ~ÂÿwÂÿpÂÿiÂÿbÂÿ[ÂÿTÂÿMÂÿFÂÿ?Âÿ8Âÿ1Âÿ*Âÿ#ÂÿÂÿÂÿÂÿÂÿÂÿùÁÿòÁÿëÁÿäÁÿÝÁÿÖÁÿÏÁÿÈÁÿÁÁÿºÁÿ³Áÿ¬Áÿ¥ÁÿžÁÿ—ÁÿÁÿ‰Áÿ‚Áÿ{ÁÿtÁÿmÁÿfÁÿ_ÁÿXÁÿQÁÿJÁÿCÁÿ<Áÿ5Áÿ.Áÿ'Áÿ ÁÿÁÿÁÿ ÁÿÁÿýÀÿöÀÿïÀÿèÀÿáÀÿÚÀÿÓÀÿÌÀÿÅÀÿ¾Àÿ·Àÿ°Àÿ©Àÿ¢Àÿ›Àÿ”ÀÿÀÿ†ÀÿÀÿxÀÿqÀÿjÀÿcÀÿ\ÀÿUÀÿNÀÿGÀÿ@Àÿ9Àÿ2Àÿ+Àÿ$ÀÿÀÿÀÿÀÿÀÿÀÿú¿ÿó¿ÿì¿ÿå¿ÿÞ¿ÿ׿ÿпÿÉ¿ÿ¿ÿ»¿ÿ´¿ÿ­¿ÿ¦¿ÿŸ¿ÿ˜¿ÿ‘¿ÿŠ¿ÿƒ¿ÿ|¿ÿu¿ÿn¿ÿg¿ÿ`¿ÿY¿ÿR¿ÿK¿ÿD¿ÿ=¿ÿ6¿ÿ/¿ÿ(¿ÿ!¿ÿ¿ÿ¿ÿ ¿ÿ¿ÿþ¾ÿ÷¾ÿð¾ÿé¾ÿâ¾ÿÛ¾ÿÔ¾ÿ;ÿƾÿ¿¾ÿ¸¾ÿ±¾ÿª¾ÿ£¾ÿœ¾ÿ•¾ÿ޾ÿ‡¾ÿ€¾ÿy¾ÿr¾ÿk¾ÿd¾ÿ]¾ÿV¾ÿO¾ÿH¾ÿA¾ÿ:¾ÿ3¾ÿ,¾ÿ%¾ÿ¾ÿ¾ÿ¾ÿ ¾ÿ¾ÿû½ÿô½ÿí½ÿæ½ÿß½ÿؽÿѽÿʽÿýÿ¼½ÿµ½ÿ®½ÿ§½ÿ ½ÿ™½ÿ’½ÿ‹½ÿ„½ÿ}½ÿv½ÿo½ÿh½ÿa½ÿZ½ÿS½ÿL½ÿE½ÿ>½ÿ7½ÿ0½ÿ)½ÿ"½ÿ½ÿ½ÿ ½ÿ½ÿÿ¼ÿø¼ÿñ¼ÿê¼ÿã¼ÿܼÿÕ¼ÿμÿǼÿÀ¼ÿ¹¼ÿ²¼ÿ«¼ÿ¤¼ÿ¼ÿ–¼ÿ¼ÿˆ¼ÿ¼ÿz¼ÿs¼ÿl¼ÿe¼ÿ^¼ÿW¼ÿP¼ÿI¼ÿB¼ÿ;¼ÿ4¼ÿ-¼ÿ&¼ÿ¼ÿ¼ÿ¼ÿ ¼ÿ¼ÿü»ÿõ»ÿî»ÿç»ÿà»ÿÙ»ÿÒ»ÿË»ÿÄ»ÿ½»ÿ¶»ÿ¯»ÿ¨»ÿ¡»ÿš»ÿ“»ÿŒ»ÿ…»ÿ~»ÿw»ÿp»ÿi»ÿb»ÿ[»ÿT»ÿM»ÿF»ÿ?»ÿ8»ÿ1»ÿ*»ÿ#»ÿ»ÿ»ÿ»ÿ»ÿ»ÿùºÿòºÿëºÿäºÿݺÿÖºÿϺÿȺÿÁºÿººÿ³ºÿ¬ºÿ¥ºÿžºÿ—ºÿºÿ‰ºÿ‚ºÿ{ºÿtºÿmºÿfºÿ_ºÿXºÿQºÿJºÿCºÿ<ºÿ5ºÿ.ºÿ'ºÿ ºÿºÿºÿ ºÿºÿý¹ÿö¹ÿï¹ÿè¹ÿá¹ÿÚ¹ÿÓ¹ÿ̹ÿŹÿ¾¹ÿ·¹ÿ°¹ÿ©¹ÿ¢¹ÿ›¹ÿ”¹ÿ¹ÿ†¹ÿ¹ÿx¹ÿq¹ÿj¹ÿc¹ÿ\¹ÿU¹ÿN¹ÿG¹ÿ@¹ÿ9¹ÿ2¹ÿ+¹ÿ$¹ÿ¹ÿ¹ÿ¹ÿ¹ÿ¹ÿú¸ÿó¸ÿì¸ÿå¸ÿÞ¸ÿ׸ÿиÿɸÿ¸ÿ»¸ÿ´¸ÿ­¸ÿ¦¸ÿŸ¸ÿ˜¸ÿ‘¸ÿЏÿƒ¸ÿ|¸ÿu¸ÿn¸ÿg¸ÿ`¸ÿY¸ÿR¸ÿK¸ÿD¸ÿ=¸ÿ6¸ÿ/¸ÿ(¸ÿ!¸ÿ¸ÿ¸ÿ ¸ÿ¸ÿþ·ÿ÷·ÿð·ÿé·ÿâ·ÿÛ·ÿÔ·ÿÍ·ÿÆ·ÿ¿·ÿ¸·ÿ±·ÿª·ÿ£·ÿœ·ÿ•·ÿŽ·ÿ‡·ÿ€·ÿy·ÿr·ÿk·ÿd·ÿ]·ÿV·ÿO·ÿH·ÿA·ÿ:·ÿ3·ÿ,·ÿ%·ÿ·ÿ·ÿ·ÿ ·ÿ·ÿû¶ÿô¶ÿí¶ÿæ¶ÿß¶ÿضÿѶÿʶÿöÿ¼¶ÿµ¶ÿ®¶ÿ§¶ÿ ¶ÿ™¶ÿ’¶ÿ‹¶ÿ„¶ÿ}¶ÿv¶ÿo¶ÿh¶ÿa¶ÿZ¶ÿS¶ÿL¶ÿE¶ÿ>¶ÿ7¶ÿ0¶ÿ)¶ÿ"¶ÿ¶ÿ¶ÿ ¶ÿ¶ÿÿµÿøµÿñµÿêµÿãµÿܵÿÕµÿεÿǵÿÀµÿ¹µÿ²µÿ«µÿ¤µÿµÿ–µÿµÿˆµÿµÿzµÿsµÿlµÿeµÿ^µÿWµÿPµÿIµÿBµÿ;µÿ4µÿ-µÿ&µÿµÿµÿµÿ µÿµÿü´ÿõ´ÿî´ÿç´ÿà´ÿÙ´ÿÒ´ÿË´ÿÄ´ÿ½´ÿ¶´ÿ¯´ÿ¨´ÿ¡´ÿš´ÿ“´ÿŒ´ÿ…´ÿ~´ÿw´ÿp´ÿi´ÿb´ÿ[´ÿT´ÿM´ÿF´ÿ?´ÿ8´ÿ1´ÿ*´ÿ#´ÿ´ÿ´ÿ´ÿ´ÿ´ÿù³ÿò³ÿë³ÿä³ÿݳÿÖ³ÿϳÿȳÿÁ³ÿº³ÿ³³ÿ¬³ÿ¥³ÿž³ÿ—³ÿ³ÿ‰³ÿ‚³ÿ{³ÿt³ÿm³ÿf³ÿ_³ÿX³ÿQ³ÿJ³ÿC³ÿ<³ÿ5³ÿ.³ÿ'³ÿ ³ÿ³ÿ³ÿ ³ÿ³ÿý²ÿö²ÿï²ÿè²ÿá²ÿÚ²ÿÓ²ÿ̲ÿŲÿ¾²ÿ·²ÿ°²ÿ©²ÿ¢²ÿ›²ÿ”²ÿ²ÿ†²ÿ²ÿx²ÿq²ÿj²ÿc²ÿ\²ÿU²ÿN²ÿG²ÿ@²ÿ9²ÿ2²ÿ+²ÿ$²ÿ²ÿ²ÿ²ÿ²ÿ²ÿú±ÿó±ÿì±ÿå±ÿÞ±ÿ×±ÿбÿɱÿ±ÿ»±ÿ´±ÿ­±ÿ¦±ÿŸ±ÿ˜±ÿ‘±ÿбÿƒ±ÿ|±ÿu±ÿn±ÿg±ÿ`±ÿY±ÿR±ÿK±ÿD±ÿ=±ÿ6±ÿ/±ÿ(±ÿ!±ÿ±ÿ±ÿ ±ÿ±ÿþ°ÿ÷°ÿð°ÿé°ÿâ°ÿÛ°ÿÔ°ÿͰÿưÿ¿°ÿ¸°ÿ±°ÿª°ÿ£°ÿœ°ÿ•°ÿްÿ‡°ÿ€°ÿy°ÿr°ÿk°ÿd°ÿ]°ÿV°ÿO°ÿH°ÿA°ÿ:°ÿ3°ÿ,°ÿ%°ÿ°ÿ°ÿ°ÿ °ÿ°ÿû¯ÿô¯ÿí¯ÿæ¯ÿ߯ÿدÿѯÿʯÿïÿ¼¯ÿµ¯ÿ®¯ÿ§¯ÿ ¯ÿ™¯ÿ’¯ÿ‹¯ÿ„¯ÿ}¯ÿv¯ÿo¯ÿh¯ÿa¯ÿZ¯ÿS¯ÿL¯ÿE¯ÿ>¯ÿ7¯ÿ0¯ÿ)¯ÿ"¯ÿ¯ÿ¯ÿ ¯ÿ¯ÿÿ®ÿø®ÿñ®ÿê®ÿã®ÿÜ®ÿÕ®ÿήÿÇ®ÿÀ®ÿ¹®ÿ²®ÿ«®ÿ¤®ÿ®ÿ–®ÿ®ÿˆ®ÿ®ÿz®ÿs®ÿl®ÿe®ÿ^®ÿW®ÿP®ÿI®ÿB®ÿ;®ÿ4®ÿ-®ÿ&®ÿ®ÿ®ÿ®ÿ ®ÿ®ÿü­ÿõ­ÿî­ÿç­ÿà­ÿÙ­ÿÒ­ÿË­ÿÄ­ÿ½­ÿ¶­ÿ¯­ÿ¨­ÿ¡­ÿš­ÿ“­ÿŒ­ÿ…­ÿ~­ÿw­ÿp­ÿi­ÿb­ÿ[­ÿT­ÿM­ÿF­ÿ?­ÿ8­ÿ1­ÿ*­ÿ#­ÿ­ÿ­ÿ­ÿ­ÿ­ÿù¬ÿò¬ÿë¬ÿä¬ÿݬÿÖ¬ÿϬÿȬÿÁ¬ÿº¬ÿ³¬ÿ¬¬ÿ¥¬ÿž¬ÿ—¬ÿ¬ÿ‰¬ÿ‚¬ÿ{¬ÿt¬ÿm¬ÿf¬ÿ_¬ÿX¬ÿQ¬ÿJ¬ÿC¬ÿ<¬ÿ5¬ÿ.¬ÿ'¬ÿ ¬ÿ¬ÿ¬ÿ ¬ÿ¬ÿý«ÿö«ÿï«ÿè«ÿá«ÿÚ«ÿÓ«ÿÌ«ÿÅ«ÿ¾«ÿ·«ÿ°«ÿ©«ÿ¢«ÿ›«ÿ”«ÿ«ÿ†«ÿ«ÿx«ÿq«ÿj«ÿc«ÿ\«ÿU«ÿN«ÿG«ÿ@«ÿ9«ÿ2«ÿ+«ÿ$«ÿ«ÿ«ÿ«ÿ«ÿ«ÿúªÿóªÿìªÿåªÿÞªÿתÿЪÿɪÿªÿ»ªÿ´ªÿ­ªÿ¦ªÿŸªÿ˜ªÿ‘ªÿŠªÿƒªÿ|ªÿuªÿnªÿgªÿ`ªÿYªÿRªÿKªÿDªÿ=ªÿ6ªÿ/ªÿ(ªÿ!ªÿªÿªÿ ªÿªÿþ©ÿ÷©ÿð©ÿé©ÿâ©ÿÛ©ÿÔ©ÿÍ©ÿÆ©ÿ¿©ÿ¸©ÿ±©ÿª©ÿ£©ÿœ©ÿ•©ÿŽ©ÿ‡©ÿ€©ÿy©ÿr©ÿk©ÿd©ÿ]©ÿV©ÿO©ÿH©ÿA©ÿ:©ÿ3©ÿ,©ÿ%©ÿ©ÿ©ÿ©ÿ ©ÿ©ÿû¨ÿô¨ÿí¨ÿæ¨ÿߨÿبÿѨÿʨÿèÿ¼¨ÿµ¨ÿ®¨ÿ§¨ÿ ¨ÿ™¨ÿ’¨ÿ‹¨ÿ„¨ÿ}¨ÿv¨ÿo¨ÿh¨ÿa¨ÿZ¨ÿS¨ÿL¨ÿE¨ÿ>¨ÿ7¨ÿ0¨ÿ)¨ÿ"¨ÿ¨ÿ¨ÿ ¨ÿ¨ÿÿ§ÿø§ÿñ§ÿê§ÿã§ÿܧÿÕ§ÿΧÿǧÿÀ§ÿ¹§ÿ²§ÿ«§ÿ¤§ÿ§ÿ–§ÿ§ÿˆ§ÿ§ÿz§ÿs§ÿl§ÿe§ÿ^§ÿW§ÿP§ÿI§ÿB§ÿ;§ÿ4§ÿ-§ÿ&§ÿ§ÿ§ÿ§ÿ §ÿ§ÿü¦ÿõ¦ÿî¦ÿç¦ÿà¦ÿÙ¦ÿÒ¦ÿ˦ÿĦÿ½¦ÿ¶¦ÿ¯¦ÿ¨¦ÿ¡¦ÿš¦ÿ“¦ÿŒ¦ÿ…¦ÿ~¦ÿw¦ÿp¦ÿi¦ÿb¦ÿ[¦ÿT¦ÿM¦ÿF¦ÿ?¦ÿ8¦ÿ1¦ÿ*¦ÿ#¦ÿ¦ÿ¦ÿ¦ÿ¦ÿ¦ÿù¥ÿò¥ÿë¥ÿä¥ÿÝ¥ÿÖ¥ÿÏ¥ÿÈ¥ÿÁ¥ÿº¥ÿ³¥ÿ¬¥ÿ¥¥ÿž¥ÿ—¥ÿ¥ÿ‰¥ÿ‚¥ÿ{¥ÿt¥ÿm¥ÿf¥ÿ_¥ÿX¥ÿQ¥ÿJ¥ÿC¥ÿ<¥ÿ5¥ÿ.¥ÿ'¥ÿ ¥ÿ¥ÿ¥ÿ ¥ÿ¥ÿý¤ÿö¤ÿï¤ÿè¤ÿá¤ÿÚ¤ÿÓ¤ÿ̤ÿŤÿ¾¤ÿ·¤ÿ°¤ÿ©¤ÿ¢¤ÿ›¤ÿ”¤ÿ¤ÿ†¤ÿ¤ÿx¤ÿq¤ÿj¤ÿc¤ÿ\¤ÿU¤ÿN¤ÿG¤ÿ@¤ÿ9¤ÿ2¤ÿ+¤ÿ$¤ÿ¤ÿ¤ÿ¤ÿ¤ÿ¤ÿú£ÿó£ÿì£ÿå£ÿÞ£ÿ×£ÿУÿÉ£ÿ£ÿ»£ÿ´£ÿ­£ÿ¦£ÿŸ£ÿ˜£ÿ‘£ÿŠ£ÿƒ£ÿ|£ÿu£ÿn£ÿg£ÿ`£ÿY£ÿR£ÿK£ÿD£ÿ=£ÿ6£ÿ/£ÿ(£ÿ!£ÿ£ÿ£ÿ £ÿ£ÿþ¢ÿ÷¢ÿð¢ÿé¢ÿâ¢ÿÛ¢ÿÔ¢ÿÍ¢ÿÆ¢ÿ¿¢ÿ¸¢ÿ±¢ÿª¢ÿ£¢ÿœ¢ÿ•¢ÿŽ¢ÿ‡¢ÿ€¢ÿy¢ÿr¢ÿk¢ÿd¢ÿ]¢ÿV¢ÿO¢ÿH¢ÿA¢ÿ:¢ÿ3¢ÿ,¢ÿ%¢ÿ¢ÿ¢ÿ¢ÿ ¢ÿ¢ÿû¡ÿô¡ÿí¡ÿæ¡ÿß¡ÿØ¡ÿÑ¡ÿÊ¡ÿáÿ¼¡ÿµ¡ÿ®¡ÿ§¡ÿ ¡ÿ™¡ÿ’¡ÿ‹¡ÿ„¡ÿ}¡ÿv¡ÿo¡ÿh¡ÿa¡ÿZ¡ÿS¡ÿL¡ÿE¡ÿ>¡ÿ7¡ÿ0¡ÿ)¡ÿ"¡ÿ¡ÿ¡ÿ ¡ÿ¡ÿÿ ÿø ÿñ ÿê ÿã ÿÜ ÿÕ ÿΠÿÇ ÿÀ ÿ¹ ÿ² ÿ« ÿ¤ ÿ ÿ– ÿ ÿˆ ÿ ÿz ÿs ÿl ÿe ÿ^ ÿW ÿP ÿI ÿB ÿ; ÿ4 ÿ- ÿ& ÿ ÿ ÿ ÿ  ÿ ÿüŸÿõŸÿîŸÿçŸÿàŸÿÙŸÿÒŸÿËŸÿÄŸÿ½Ÿÿ¶Ÿÿ¯Ÿÿ¨Ÿÿ¡ŸÿšŸÿ“ŸÿŒŸÿ…Ÿÿ~ŸÿwŸÿpŸÿiŸÿbŸÿ[ŸÿTŸÿMŸÿFŸÿ?Ÿÿ8Ÿÿ1Ÿÿ*Ÿÿ#ŸÿŸÿŸÿŸÿŸÿŸÿùžÿòžÿëžÿäžÿÝžÿÖžÿÏžÿÈžÿÁžÿºžÿ³žÿ¬žÿ¥žÿžžÿ—žÿžÿ‰žÿ‚žÿ{žÿtžÿmžÿfžÿ_žÿXžÿQžÿJžÿCžÿ<žÿ5žÿ.žÿ'žÿ žÿžÿžÿ žÿžÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúœÿóœÿìœÿåœÿÞœÿלÿМÿÉœÿœÿ»œÿ´œÿ­œÿ¦œÿŸœÿ˜œÿ‘œÿŠœÿƒœÿ|œÿuœÿnœÿgœÿ`œÿYœÿRœÿKœÿDœÿ=œÿ6œÿ/œÿ(œÿ!œÿœÿœÿ œÿœÿþ›ÿ÷›ÿð›ÿé›ÿâ›ÿÛ›ÿÔ›ÿÍ›ÿÆ›ÿ¿›ÿ¸›ÿ±›ÿª›ÿ£›ÿœ›ÿ•›ÿŽ›ÿ‡›ÿ€›ÿy›ÿr›ÿk›ÿd›ÿ]›ÿV›ÿO›ÿH›ÿA›ÿ:›ÿ3›ÿ,›ÿ%›ÿ›ÿ›ÿ›ÿ ›ÿ›ÿûšÿôšÿíšÿæšÿßšÿØšÿÑšÿÊšÿÚÿ¼šÿµšÿ®šÿ§šÿ šÿ™šÿ’šÿ‹šÿ„šÿ}šÿvšÿošÿhšÿašÿZšÿSšÿLšÿEšÿ>šÿ7šÿ0šÿ)šÿ"šÿšÿšÿ šÿšÿÿ™ÿø™ÿñ™ÿê™ÿã™ÿÜ™ÿÕ™ÿΙÿÇ™ÿÀ™ÿ¹™ÿ²™ÿ«™ÿ¤™ÿ™ÿ–™ÿ™ÿˆ™ÿ™ÿz™ÿs™ÿl™ÿe™ÿ^™ÿW™ÿP™ÿI™ÿB™ÿ;™ÿ4™ÿ-™ÿ&™ÿ™ÿ™ÿ™ÿ ™ÿ™ÿü˜ÿõ˜ÿî˜ÿç˜ÿà˜ÿÙ˜ÿÒ˜ÿ˘ÿĘÿ½˜ÿ¶˜ÿ¯˜ÿ¨˜ÿ¡˜ÿš˜ÿ“˜ÿŒ˜ÿ…˜ÿ~˜ÿw˜ÿp˜ÿi˜ÿb˜ÿ[˜ÿT˜ÿM˜ÿF˜ÿ?˜ÿ8˜ÿ1˜ÿ*˜ÿ#˜ÿ˜ÿ˜ÿ˜ÿ˜ÿ˜ÿù—ÿò—ÿë—ÿä—ÿÝ—ÿÖ—ÿÏ—ÿÈ—ÿÁ—ÿº—ÿ³—ÿ¬—ÿ¥—ÿž—ÿ——ÿ—ÿ‰—ÿ‚—ÿ{—ÿt—ÿm—ÿf—ÿ_—ÿX—ÿQ—ÿJ—ÿC—ÿ<—ÿ5—ÿ.—ÿ'—ÿ —ÿ—ÿ—ÿ —ÿ—ÿý–ÿö–ÿï–ÿè–ÿá–ÿÚ–ÿÓ–ÿÌ–ÿÅ–ÿ¾–ÿ·–ÿ°–ÿ©–ÿ¢–ÿ›–ÿ”–ÿ–ÿ†–ÿ–ÿx–ÿq–ÿj–ÿc–ÿ\–ÿU–ÿN–ÿG–ÿ@–ÿ9–ÿ2–ÿ+–ÿ$–ÿ–ÿ–ÿ–ÿ–ÿ–ÿú•ÿó•ÿì•ÿå•ÿÞ•ÿוÿЕÿÉ•ÿ•ÿ»•ÿ´•ÿ­•ÿ¦•ÿŸ•ÿ˜•ÿ‘•ÿŠ•ÿƒ•ÿ|•ÿu•ÿn•ÿg•ÿ`•ÿY•ÿR•ÿK•ÿD•ÿ=•ÿ6•ÿ/•ÿ(•ÿ!•ÿ•ÿ•ÿ •ÿ•ÿþ”ÿ÷”ÿð”ÿé”ÿâ”ÿÛ”ÿÔ”ÿÍ”ÿÆ”ÿ¿”ÿ¸”ÿ±”ÿª”ÿ£”ÿœ”ÿ•”ÿŽ”ÿ‡”ÿ€”ÿy”ÿr”ÿk”ÿd”ÿ]”ÿV”ÿO”ÿH”ÿA”ÿ:”ÿ3”ÿ,”ÿ%”ÿ”ÿ”ÿ”ÿ ”ÿ”ÿû“ÿô“ÿí“ÿæ“ÿß“ÿØ“ÿÑ“ÿÊ“ÿÓÿ¼“ÿµ“ÿ®“ÿ§“ÿ “ÿ™“ÿ’“ÿ‹“ÿ„“ÿ}“ÿv“ÿo“ÿh“ÿa“ÿZ“ÿS“ÿL“ÿE“ÿ>“ÿ7“ÿ0“ÿ)“ÿ"“ÿ“ÿ“ÿ “ÿ“ÿÿ’ÿø’ÿñ’ÿê’ÿã’ÿÜ’ÿÕ’ÿÎ’ÿÇ’ÿÀ’ÿ¹’ÿ²’ÿ«’ÿ¤’ÿ’ÿ–’ÿ’ÿˆ’ÿ’ÿz’ÿs’ÿl’ÿe’ÿ^’ÿW’ÿP’ÿI’ÿB’ÿ;’ÿ4’ÿ-’ÿ&’ÿ’ÿ’ÿ’ÿ ’ÿ’ÿü‘ÿõ‘ÿî‘ÿç‘ÿà‘ÿÙ‘ÿÒ‘ÿË‘ÿÄ‘ÿ½‘ÿ¶‘ÿ¯‘ÿ¨‘ÿ¡‘ÿš‘ÿ“‘ÿŒ‘ÿ…‘ÿ~‘ÿw‘ÿp‘ÿi‘ÿb‘ÿ[‘ÿT‘ÿM‘ÿF‘ÿ?‘ÿ8‘ÿ1‘ÿ*‘ÿ#‘ÿ‘ÿ‘ÿ‘ÿ‘ÿ‘ÿùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúŽÿóŽÿìŽÿåŽÿÞŽÿ׎ÿÐŽÿÉŽÿÂŽÿ»Žÿ´Žÿ­Žÿ¦ŽÿŸŽÿ˜Žÿ‘ŽÿŠŽÿƒŽÿ|ŽÿuŽÿnŽÿgŽÿ`ŽÿYŽÿRŽÿKŽÿDŽÿ=Žÿ6Žÿ/Žÿ(Žÿ!ŽÿŽÿŽÿ ŽÿŽÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûŒÿôŒÿíŒÿæŒÿߌÿØŒÿÑŒÿÊŒÿÃŒÿ¼ŒÿµŒÿ®Œÿ§Œÿ Œÿ™Œÿ’Œÿ‹Œÿ„Œÿ}ŒÿvŒÿoŒÿhŒÿaŒÿZŒÿSŒÿLŒÿEŒÿ>Œÿ7Œÿ0Œÿ)Œÿ"ŒÿŒÿŒÿ ŒÿŒÿÿ‹ÿø‹ÿñ‹ÿê‹ÿã‹ÿÜ‹ÿÕ‹ÿ΋ÿÇ‹ÿÀ‹ÿ¹‹ÿ²‹ÿ«‹ÿ¤‹ÿ‹ÿ–‹ÿ‹ÿˆ‹ÿ‹ÿz‹ÿs‹ÿl‹ÿe‹ÿ^‹ÿW‹ÿP‹ÿI‹ÿB‹ÿ;‹ÿ4‹ÿ-‹ÿ&‹ÿ‹ÿ‹ÿ‹ÿ ‹ÿ‹ÿüŠÿõŠÿîŠÿçŠÿàŠÿÙŠÿÒŠÿËŠÿÄŠÿ½Šÿ¶Šÿ¯Šÿ¨Šÿ¡ŠÿšŠÿ“ŠÿŒŠÿ…Šÿ~ŠÿwŠÿpŠÿiŠÿbŠÿ[ŠÿTŠÿMŠÿFŠÿ?Šÿ8Šÿ1Šÿ*Šÿ#ŠÿŠÿŠÿŠÿŠÿŠÿù‰ÿò‰ÿë‰ÿä‰ÿ݉ÿÖ‰ÿωÿȉÿÁ‰ÿº‰ÿ³‰ÿ¬‰ÿ¥‰ÿž‰ÿ—‰ÿ‰ÿ‰‰ÿ‚‰ÿ{‰ÿt‰ÿm‰ÿf‰ÿ_‰ÿX‰ÿQ‰ÿJ‰ÿC‰ÿ<‰ÿ5‰ÿ.‰ÿ'‰ÿ ‰ÿ‰ÿ‰ÿ ‰ÿ‰ÿýˆÿöˆÿïˆÿèˆÿáˆÿÚˆÿÓˆÿ̈ÿňÿ¾ˆÿ·ˆÿ°ˆÿ©ˆÿ¢ˆÿ›ˆÿ”ˆÿˆÿ†ˆÿˆÿxˆÿqˆÿjˆÿcˆÿ\ˆÿUˆÿNˆÿGˆÿ@ˆÿ9ˆÿ2ˆÿ+ˆÿ$ˆÿˆÿˆÿˆÿˆÿˆÿú‡ÿó‡ÿì‡ÿå‡ÿÞ‡ÿׇÿЇÿɇÿ‡ÿ»‡ÿ´‡ÿ­‡ÿ¦‡ÿŸ‡ÿ˜‡ÿ‘‡ÿЇÿƒ‡ÿ|‡ÿu‡ÿn‡ÿg‡ÿ`‡ÿY‡ÿR‡ÿK‡ÿD‡ÿ=‡ÿ6‡ÿ/‡ÿ(‡ÿ!‡ÿ‡ÿ‡ÿ ‡ÿ‡ÿþ†ÿ÷†ÿð†ÿé†ÿâ†ÿÛ†ÿÔ†ÿ͆ÿƆÿ¿†ÿ¸†ÿ±†ÿª†ÿ£†ÿœ†ÿ•†ÿކÿ‡†ÿ€†ÿy†ÿr†ÿk†ÿd†ÿ]†ÿV†ÿO†ÿH†ÿA†ÿ:†ÿ3†ÿ,†ÿ%†ÿ†ÿ†ÿ†ÿ †ÿ†ÿû…ÿô…ÿí…ÿæ…ÿß…ÿØ…ÿÑ…ÿÊ…ÿÃ…ÿ¼…ÿµ…ÿ®…ÿ§…ÿ …ÿ™…ÿ’…ÿ‹…ÿ„…ÿ}…ÿv…ÿo…ÿh…ÿa…ÿZ…ÿS…ÿL…ÿE…ÿ>…ÿ7…ÿ0…ÿ)…ÿ"…ÿ…ÿ…ÿ …ÿ…ÿÿ„ÿø„ÿñ„ÿê„ÿã„ÿÜ„ÿÕ„ÿ΄ÿÇ„ÿÀ„ÿ¹„ÿ²„ÿ«„ÿ¤„ÿ„ÿ–„ÿ„ÿˆ„ÿ„ÿz„ÿs„ÿl„ÿe„ÿ^„ÿW„ÿP„ÿI„ÿB„ÿ;„ÿ4„ÿ-„ÿ&„ÿ„ÿ„ÿ„ÿ „ÿ„ÿüƒÿõƒÿîƒÿçƒÿàƒÿÙƒÿÒƒÿ˃ÿăÿ½ƒÿ¶ƒÿ¯ƒÿ¨ƒÿ¡ƒÿšƒÿ“ƒÿŒƒÿ…ƒÿ~ƒÿwƒÿpƒÿiƒÿbƒÿ[ƒÿTƒÿMƒÿFƒÿ?ƒÿ8ƒÿ1ƒÿ*ƒÿ#ƒÿƒÿƒÿƒÿƒÿƒÿù‚ÿò‚ÿë‚ÿä‚ÿÝ‚ÿÖ‚ÿÏ‚ÿÈ‚ÿÁ‚ÿº‚ÿ³‚ÿ¬‚ÿ¥‚ÿž‚ÿ—‚ÿ‚ÿ‰‚ÿ‚‚ÿ{‚ÿt‚ÿm‚ÿf‚ÿ_‚ÿX‚ÿQ‚ÿJ‚ÿC‚ÿ<‚ÿ5‚ÿ.‚ÿ'‚ÿ ‚ÿ‚ÿ‚ÿ ‚ÿ‚ÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿú€ÿó€ÿì€ÿå€ÿÞ€ÿ×€ÿЀÿÉ€ÿ€ÿ»€ÿ´€ÿ­€ÿ¦€ÿŸ€ÿ˜€ÿ‘€ÿŠ€ÿƒ€ÿ|€ÿu€ÿn€ÿg€ÿ`€ÿY€ÿR€ÿK€ÿD€ÿ=€ÿ6€ÿ/€ÿ(€ÿ!€ÿ€ÿ€ÿ €ÿ€ÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿû~ÿô~ÿí~ÿæ~ÿß~ÿØ~ÿÑ~ÿÊ~ÿÃ~ÿ¼~ÿµ~ÿ®~ÿ§~ÿ ~ÿ™~ÿ’~ÿ‹~ÿ„~ÿ}~ÿv~ÿo~ÿh~ÿa~ÿZ~ÿS~ÿL~ÿE~ÿ>~ÿ7~ÿ0~ÿ)~ÿ"~ÿ~ÿ~ÿ ~ÿ~ÿÿ}ÿø}ÿñ}ÿê}ÿã}ÿÜ}ÿÕ}ÿÎ}ÿÇ}ÿÀ}ÿ¹}ÿ²}ÿ«}ÿ¤}ÿ}ÿ–}ÿ}ÿˆ}ÿ}ÿz}ÿs}ÿl}ÿe}ÿ^}ÿW}ÿP}ÿI}ÿB}ÿ;}ÿ4}ÿ-}ÿ&}ÿ}ÿ}ÿ}ÿ }ÿ}ÿü|ÿõ|ÿî|ÿç|ÿà|ÿÙ|ÿÒ|ÿË|ÿÄ|ÿ½|ÿ¶|ÿ¯|ÿ¨|ÿ¡|ÿš|ÿ“|ÿŒ|ÿ…|ÿ~|ÿw|ÿp|ÿi|ÿb|ÿ[|ÿT|ÿM|ÿF|ÿ?|ÿ8|ÿ1|ÿ*|ÿ#|ÿ|ÿ|ÿ|ÿ|ÿ|ÿù{ÿò{ÿë{ÿä{ÿÝ{ÿÖ{ÿÏ{ÿÈ{ÿÁ{ÿº{ÿ³{ÿ¬{ÿ¥{ÿž{ÿ—{ÿ{ÿ‰{ÿ‚{ÿ{{ÿt{ÿm{ÿf{ÿ_{ÿX{ÿQ{ÿJ{ÿC{ÿ<{ÿ5{ÿ.{ÿ'{ÿ {ÿ{ÿ{ÿ {ÿ{ÿýzÿözÿïzÿèzÿázÿÚzÿÓzÿÌzÿÅzÿ¾zÿ·zÿ°zÿ©zÿ¢zÿ›zÿ”zÿzÿ†zÿzÿxzÿqzÿjzÿczÿ\zÿUzÿNzÿGzÿ@zÿ9zÿ2zÿ+zÿ$zÿzÿzÿzÿzÿzÿúyÿóyÿìyÿåyÿÞyÿ×yÿÐyÿÉyÿÂyÿ»yÿ´yÿ­yÿ¦yÿŸyÿ˜yÿ‘yÿŠyÿƒyÿ|yÿuyÿnyÿgyÿ`yÿYyÿRyÿKyÿDyÿ=yÿ6yÿ/yÿ(yÿ!yÿyÿyÿ yÿyÿþxÿ÷xÿðxÿéxÿâxÿÛxÿÔxÿÍxÿÆxÿ¿xÿ¸xÿ±xÿªxÿ£xÿœxÿ•xÿŽxÿ‡xÿ€xÿyxÿrxÿkxÿdxÿ]xÿVxÿOxÿHxÿAxÿ:xÿ3xÿ,xÿ%xÿxÿxÿxÿ xÿxÿûwÿôwÿíwÿæwÿßwÿØwÿÑwÿÊwÿÃwÿ¼wÿµwÿ®wÿ§wÿ wÿ™wÿ’wÿ‹wÿ„wÿ}wÿvwÿowÿhwÿawÿZwÿSwÿLwÿEwÿ>wÿ7wÿ0wÿ)wÿ"wÿwÿwÿ wÿwÿÿvÿøvÿñvÿêvÿãvÿÜvÿÕvÿÎvÿÇvÿÀvÿ¹vÿ²vÿ«vÿ¤vÿvÿ–vÿvÿˆvÿvÿzvÿsvÿlvÿevÿ^vÿWvÿPvÿIvÿBvÿ;vÿ4vÿ-vÿ&vÿvÿvÿvÿ vÿvÿüuÿõuÿîuÿçuÿàuÿÙuÿÒuÿËuÿÄuÿ½uÿ¶uÿ¯uÿ¨uÿ¡uÿšuÿ“uÿŒuÿ…uÿ~uÿwuÿpuÿiuÿbuÿ[uÿTuÿMuÿFuÿ?uÿ8uÿ1uÿ*uÿ#uÿuÿuÿuÿuÿuÿùtÿòtÿëtÿätÿÝtÿÖtÿÏtÿÈtÿÁtÿºtÿ³tÿ¬tÿ¥tÿžtÿ—tÿtÿ‰tÿ‚tÿ{tÿttÿmtÿftÿ_tÿXtÿQtÿJtÿCtÿpÿ7pÿ0pÿ)pÿ"pÿpÿpÿ pÿpÿÿoÿøoÿñoÿêoÿãoÿÜoÿÕoÿÎoÿÇoÿÀoÿ¹oÿ²oÿ«oÿ¤oÿoÿ–oÿoÿˆoÿoÿzoÿsoÿloÿeoÿ^oÿWoÿPoÿIoÿBoÿ;oÿ4oÿ-oÿ&oÿoÿoÿoÿ oÿoÿünÿõnÿînÿçnÿànÿÙnÿÒnÿËnÿÄnÿ½nÿ¶nÿ¯nÿ¨nÿ¡nÿšnÿ“nÿŒnÿ…nÿ~nÿwnÿpnÿinÿbnÿ[nÿTnÿMnÿFnÿ?nÿ8nÿ1nÿ*nÿ#nÿnÿnÿnÿnÿnÿùmÿòmÿëmÿämÿÝmÿÖmÿÏmÿÈmÿÁmÿºmÿ³mÿ¬mÿ¥mÿžmÿ—mÿmÿ‰mÿ‚mÿ{mÿtmÿmmÿfmÿ_mÿXmÿQmÿJmÿCmÿiÿ7iÿ0iÿ)iÿ"iÿiÿiÿ iÿiÿÿhÿøhÿñhÿêhÿãhÿÜhÿÕhÿÎhÿÇhÿÀhÿ¹hÿ²hÿ«hÿ¤hÿhÿ–hÿhÿˆhÿhÿzhÿshÿlhÿehÿ^hÿWhÿPhÿIhÿBhÿ;hÿ4hÿ-hÿ&hÿhÿhÿhÿ hÿhÿügÿõgÿîgÿçgÿàgÿÙgÿÒgÿËgÿÄgÿ½gÿ¶gÿ¯gÿ¨gÿ¡gÿšgÿ“gÿŒgÿ…gÿ~gÿwgÿpgÿigÿbgÿ[gÿTgÿMgÿFgÿ?gÿ8gÿ1gÿ*gÿ#gÿgÿgÿgÿgÿgÿùfÿòfÿëfÿäfÿÝfÿÖfÿÏfÿÈfÿÁfÿºfÿ³fÿ¬fÿ¥fÿžfÿ—fÿfÿ‰fÿ‚fÿ{fÿtfÿmfÿffÿ_fÿXfÿQfÿJfÿCfÿbÿ7bÿ0bÿ)bÿ"bÿbÿbÿ bÿbÿÿaÿøaÿñaÿêaÿãaÿÜaÿÕaÿÎaÿÇaÿÀaÿ¹aÿ²aÿ«aÿ¤aÿaÿ–aÿaÿˆaÿaÿzaÿsaÿlaÿeaÿ^aÿWaÿPaÿIaÿBaÿ;aÿ4aÿ-aÿ&aÿaÿaÿaÿ aÿaÿü`ÿõ`ÿî`ÿç`ÿà`ÿÙ`ÿÒ`ÿË`ÿÄ`ÿ½`ÿ¶`ÿ¯`ÿ¨`ÿ¡`ÿš`ÿ“`ÿŒ`ÿ…`ÿ~`ÿw`ÿp`ÿi`ÿb`ÿ[`ÿT`ÿM`ÿF`ÿ?`ÿ8`ÿ1`ÿ*`ÿ#`ÿ`ÿ`ÿ`ÿ`ÿ`ÿù_ÿò_ÿë_ÿä_ÿÝ_ÿÖ_ÿÏ_ÿÈ_ÿÁ_ÿº_ÿ³_ÿ¬_ÿ¥_ÿž_ÿ—_ÿ_ÿ‰_ÿ‚_ÿ{_ÿt_ÿm_ÿf_ÿ__ÿX_ÿQ_ÿJ_ÿC_ÿ<_ÿ5_ÿ._ÿ'_ÿ _ÿ_ÿ_ÿ _ÿ_ÿý^ÿö^ÿï^ÿè^ÿá^ÿÚ^ÿÓ^ÿÌ^ÿÅ^ÿ¾^ÿ·^ÿ°^ÿ©^ÿ¢^ÿ›^ÿ”^ÿ^ÿ†^ÿ^ÿx^ÿq^ÿj^ÿc^ÿ\^ÿU^ÿN^ÿG^ÿ@^ÿ9^ÿ2^ÿ+^ÿ$^ÿ^ÿ^ÿ^ÿ^ÿ^ÿú]ÿó]ÿì]ÿå]ÿÞ]ÿ×]ÿÐ]ÿÉ]ÿÂ]ÿ»]ÿ´]ÿ­]ÿ¦]ÿŸ]ÿ˜]ÿ‘]ÿŠ]ÿƒ]ÿ|]ÿu]ÿn]ÿg]ÿ`]ÿY]ÿR]ÿK]ÿD]ÿ=]ÿ6]ÿ/]ÿ(]ÿ!]ÿ]ÿ]ÿ ]ÿ]ÿþ\ÿ÷\ÿð\ÿé\ÿâ\ÿÛ\ÿÔ\ÿÍ\ÿÆ\ÿ¿\ÿ¸\ÿ±\ÿª\ÿ£\ÿœ\ÿ•\ÿŽ\ÿ‡\ÿ€\ÿy\ÿr\ÿk\ÿd\ÿ]\ÿV\ÿO\ÿH\ÿA\ÿ:\ÿ3\ÿ,\ÿ%\ÿ\ÿ\ÿ\ÿ \ÿ\ÿû[ÿô[ÿí[ÿæ[ÿß[ÿØ[ÿÑ[ÿÊ[ÿÃ[ÿ¼[ÿµ[ÿ®[ÿ§[ÿ [ÿ™[ÿ’[ÿ‹[ÿ„[ÿ}[ÿv[ÿo[ÿh[ÿa[ÿZ[ÿS[ÿL[ÿE[ÿ>[ÿ7[ÿ0[ÿ)[ÿ"[ÿ[ÿ[ÿ [ÿ[ÿÿZÿøZÿñZÿêZÿãZÿÜZÿÕZÿÎZÿÇZÿÀZÿ¹Zÿ²Zÿ«Zÿ¤ZÿZÿ–ZÿZÿˆZÿZÿzZÿsZÿlZÿeZÿ^ZÿWZÿPZÿIZÿBZÿ;Zÿ4Zÿ-Zÿ&ZÿZÿZÿZÿ ZÿZÿüYÿõYÿîYÿçYÿàYÿÙYÿÒYÿËYÿÄYÿ½Yÿ¶Yÿ¯Yÿ¨Yÿ¡YÿšYÿ“YÿŒYÿ…Yÿ~YÿwYÿpYÿiYÿbYÿ[YÿTYÿMYÿFYÿ?Yÿ8Yÿ1Yÿ*Yÿ#YÿYÿYÿYÿYÿYÿùXÿòXÿëXÿäXÿÝXÿÖXÿÏXÿÈXÿÁXÿºXÿ³Xÿ¬Xÿ¥XÿžXÿ—XÿXÿ‰Xÿ‚Xÿ{XÿtXÿmXÿfXÿ_XÿXXÿQXÿJXÿCXÿTÿ7Tÿ0Tÿ)Tÿ"TÿTÿTÿ TÿTÿÿSÿøSÿñSÿêSÿãSÿÜSÿÕSÿÎSÿÇSÿÀSÿ¹Sÿ²Sÿ«Sÿ¤SÿSÿ–SÿSÿˆSÿSÿzSÿsSÿlSÿeSÿ^SÿWSÿPSÿISÿBSÿ;Sÿ4Sÿ-Sÿ&SÿSÿSÿSÿ SÿSÿüRÿõRÿîRÿçRÿàRÿÙRÿÒRÿËRÿÄRÿ½Rÿ¶Rÿ¯Rÿ¨Rÿ¡RÿšRÿ“RÿŒRÿ…Rÿ~RÿwRÿpRÿiRÿbRÿ[RÿTRÿMRÿFRÿ?Rÿ8Rÿ1Rÿ*Rÿ#RÿRÿRÿRÿRÿRÿùQÿòQÿëQÿäQÿÝQÿÖQÿÏQÿÈQÿÁQÿºQÿ³Qÿ¬Qÿ¥QÿžQÿ—QÿQÿ‰Qÿ‚Qÿ{QÿtQÿmQÿfQÿ_QÿXQÿQQÿJQÿCQÿMÿ7Mÿ0Mÿ)Mÿ"MÿMÿMÿ MÿMÿÿLÿøLÿñLÿêLÿãLÿÜLÿÕLÿÎLÿÇLÿÀLÿ¹Lÿ²Lÿ«Lÿ¤LÿLÿ–LÿLÿˆLÿLÿzLÿsLÿlLÿeLÿ^LÿWLÿPLÿILÿBLÿ;Lÿ4Lÿ-Lÿ&LÿLÿLÿLÿ LÿLÿüKÿõKÿîKÿçKÿàKÿÙKÿÒKÿËKÿÄKÿ½Kÿ¶Kÿ¯Kÿ¨Kÿ¡KÿšKÿ“KÿŒKÿ…Kÿ~KÿwKÿpKÿiKÿbKÿ[KÿTKÿMKÿFKÿ?Kÿ8Kÿ1Kÿ*Kÿ#KÿKÿKÿKÿKÿKÿùJÿòJÿëJÿäJÿÝJÿÖJÿÏJÿÈJÿÁJÿºJÿ³Jÿ¬Jÿ¥JÿžJÿ—JÿJÿ‰Jÿ‚Jÿ{JÿtJÿmJÿfJÿ_JÿXJÿQJÿJJÿCJÿFÿ7Fÿ0Fÿ)Fÿ"FÿFÿFÿ FÿFÿÿEÿøEÿñEÿêEÿãEÿÜEÿÕEÿÎEÿÇEÿÀEÿ¹Eÿ²Eÿ«Eÿ¤EÿEÿ–EÿEÿˆEÿEÿzEÿsEÿlEÿeEÿ^EÿWEÿPEÿIEÿBEÿ;Eÿ4Eÿ-Eÿ&EÿEÿEÿEÿ EÿEÿüDÿõDÿîDÿçDÿàDÿÙDÿÒDÿËDÿÄDÿ½Dÿ¶Dÿ¯Dÿ¨Dÿ¡DÿšDÿ“DÿŒDÿ…Dÿ~DÿwDÿpDÿiDÿbDÿ[DÿTDÿMDÿFDÿ?Dÿ8Dÿ1Dÿ*Dÿ#DÿDÿDÿDÿDÿDÿùCÿòCÿëCÿäCÿÝCÿÖCÿÏCÿÈCÿÁCÿºCÿ³Cÿ¬Cÿ¥CÿžCÿ—CÿCÿ‰Cÿ‚Cÿ{CÿtCÿmCÿfCÿ_CÿXCÿQCÿJCÿCCÿ?ÿ7?ÿ0?ÿ)?ÿ"?ÿ?ÿ?ÿ ?ÿ?ÿÿ>ÿø>ÿñ>ÿê>ÿã>ÿÜ>ÿÕ>ÿÎ>ÿÇ>ÿÀ>ÿ¹>ÿ²>ÿ«>ÿ¤>ÿ>ÿ–>ÿ>ÿˆ>ÿ>ÿz>ÿs>ÿl>ÿe>ÿ^>ÿW>ÿP>ÿI>ÿB>ÿ;>ÿ4>ÿ->ÿ&>ÿ>ÿ>ÿ>ÿ >ÿ>ÿü=ÿõ=ÿî=ÿç=ÿà=ÿÙ=ÿÒ=ÿË=ÿÄ=ÿ½=ÿ¶=ÿ¯=ÿ¨=ÿ¡=ÿš=ÿ“=ÿŒ=ÿ…=ÿ~=ÿw=ÿp=ÿi=ÿb=ÿ[=ÿT=ÿM=ÿF=ÿ?=ÿ8=ÿ1=ÿ*=ÿ#=ÿ=ÿ=ÿ=ÿ=ÿ=ÿù<ÿò<ÿë<ÿä<ÿÝ<ÿÖ<ÿÏ<ÿÈ<ÿÁ<ÿº<ÿ³<ÿ¬<ÿ¥<ÿž<ÿ—<ÿ<ÿ‰<ÿ‚<ÿ{<ÿt<ÿm<ÿf<ÿ_<ÿX<ÿQ<ÿJ<ÿC<ÿ<<ÿ5<ÿ.<ÿ'<ÿ <ÿ<ÿ<ÿ <ÿ<ÿý;ÿö;ÿï;ÿè;ÿá;ÿÚ;ÿÓ;ÿÌ;ÿÅ;ÿ¾;ÿ·;ÿ°;ÿ©;ÿ¢;ÿ›;ÿ”;ÿ;ÿ†;ÿ;ÿx;ÿq;ÿj;ÿc;ÿ\;ÿU;ÿN;ÿG;ÿ@;ÿ9;ÿ2;ÿ+;ÿ$;ÿ;ÿ;ÿ;ÿ;ÿ;ÿú:ÿó:ÿì:ÿå:ÿÞ:ÿ×:ÿÐ:ÿÉ:ÿÂ:ÿ»:ÿ´:ÿ­:ÿ¦:ÿŸ:ÿ˜:ÿ‘:ÿŠ:ÿƒ:ÿ|:ÿu:ÿn:ÿg:ÿ`:ÿY:ÿR:ÿK:ÿD:ÿ=:ÿ6:ÿ/:ÿ(:ÿ!:ÿ:ÿ:ÿ :ÿ:ÿþ9ÿ÷9ÿð9ÿé9ÿâ9ÿÛ9ÿÔ9ÿÍ9ÿÆ9ÿ¿9ÿ¸9ÿ±9ÿª9ÿ£9ÿœ9ÿ•9ÿŽ9ÿ‡9ÿ€9ÿy9ÿr9ÿk9ÿd9ÿ]9ÿV9ÿO9ÿH9ÿA9ÿ:9ÿ39ÿ,9ÿ%9ÿ9ÿ9ÿ9ÿ 9ÿ9ÿû8ÿô8ÿí8ÿæ8ÿß8ÿØ8ÿÑ8ÿÊ8ÿÃ8ÿ¼8ÿµ8ÿ®8ÿ§8ÿ 8ÿ™8ÿ’8ÿ‹8ÿ„8ÿ}8ÿv8ÿo8ÿh8ÿa8ÿZ8ÿS8ÿL8ÿE8ÿ>8ÿ78ÿ08ÿ)8ÿ"8ÿ8ÿ8ÿ 8ÿ8ÿÿ7ÿø7ÿñ7ÿê7ÿã7ÿÜ7ÿÕ7ÿÎ7ÿÇ7ÿÀ7ÿ¹7ÿ²7ÿ«7ÿ¤7ÿ7ÿ–7ÿ7ÿˆ7ÿ7ÿz7ÿs7ÿl7ÿe7ÿ^7ÿW7ÿP7ÿI7ÿB7ÿ;7ÿ47ÿ-7ÿ&7ÿ7ÿ7ÿ7ÿ 7ÿ7ÿü6ÿõ6ÿî6ÿç6ÿà6ÿÙ6ÿÒ6ÿË6ÿÄ6ÿ½6ÿ¶6ÿ¯6ÿ¨6ÿ¡6ÿš6ÿ“6ÿŒ6ÿ…6ÿ~6ÿw6ÿp6ÿi6ÿb6ÿ[6ÿT6ÿM6ÿF6ÿ?6ÿ86ÿ16ÿ*6ÿ#6ÿ6ÿ6ÿ6ÿ6ÿ6ÿù5ÿò5ÿë5ÿä5ÿÝ5ÿÖ5ÿÏ5ÿÈ5ÿÁ5ÿº5ÿ³5ÿ¬5ÿ¥5ÿž5ÿ—5ÿ5ÿ‰5ÿ‚5ÿ{5ÿt5ÿm5ÿf5ÿ_5ÿX5ÿQ5ÿJ5ÿC5ÿ<5ÿ55ÿ.5ÿ'5ÿ 5ÿ5ÿ5ÿ 5ÿ5ÿý4ÿö4ÿï4ÿè4ÿá4ÿÚ4ÿÓ4ÿÌ4ÿÅ4ÿ¾4ÿ·4ÿ°4ÿ©4ÿ¢4ÿ›4ÿ”4ÿ4ÿ†4ÿ4ÿx4ÿq4ÿj4ÿc4ÿ\4ÿU4ÿN4ÿG4ÿ@4ÿ94ÿ24ÿ+4ÿ$4ÿ4ÿ4ÿ4ÿ4ÿ4ÿú3ÿó3ÿì3ÿå3ÿÞ3ÿ×3ÿÐ3ÿÉ3ÿÂ3ÿ»3ÿ´3ÿ­3ÿ¦3ÿŸ3ÿ˜3ÿ‘3ÿŠ3ÿƒ3ÿ|3ÿu3ÿn3ÿg3ÿ`3ÿY3ÿR3ÿK3ÿD3ÿ=3ÿ63ÿ/3ÿ(3ÿ!3ÿ3ÿ3ÿ 3ÿ3ÿþ2ÿ÷2ÿð2ÿé2ÿâ2ÿÛ2ÿÔ2ÿÍ2ÿÆ2ÿ¿2ÿ¸2ÿ±2ÿª2ÿ£2ÿœ2ÿ•2ÿŽ2ÿ‡2ÿ€2ÿy2ÿr2ÿk2ÿd2ÿ]2ÿV2ÿO2ÿH2ÿA2ÿ:2ÿ32ÿ,2ÿ%2ÿ2ÿ2ÿ2ÿ 2ÿ2ÿû1ÿô1ÿí1ÿæ1ÿß1ÿØ1ÿÑ1ÿÊ1ÿÃ1ÿ¼1ÿµ1ÿ®1ÿ§1ÿ 1ÿ™1ÿ’1ÿ‹1ÿ„1ÿ}1ÿv1ÿo1ÿh1ÿa1ÿZ1ÿS1ÿL1ÿE1ÿ>1ÿ71ÿ01ÿ)1ÿ"1ÿ1ÿ1ÿ 1ÿ1ÿÿ0ÿø0ÿñ0ÿê0ÿã0ÿÜ0ÿÕ0ÿÎ0ÿÇ0ÿÀ0ÿ¹0ÿ²0ÿ«0ÿ¤0ÿ0ÿ–0ÿ0ÿˆ0ÿ0ÿz0ÿs0ÿl0ÿe0ÿ^0ÿW0ÿP0ÿI0ÿB0ÿ;0ÿ40ÿ-0ÿ&0ÿ0ÿ0ÿ0ÿ 0ÿ0ÿü/ÿõ/ÿî/ÿç/ÿà/ÿÙ/ÿÒ/ÿË/ÿÄ/ÿ½/ÿ¶/ÿ¯/ÿ¨/ÿ¡/ÿš/ÿ“/ÿŒ/ÿ…/ÿ~/ÿw/ÿp/ÿi/ÿb/ÿ[/ÿT/ÿM/ÿF/ÿ?/ÿ8/ÿ1/ÿ*/ÿ#/ÿ/ÿ/ÿ/ÿ/ÿ/ÿù.ÿò.ÿë.ÿä.ÿÝ.ÿÖ.ÿÏ.ÿÈ.ÿÁ.ÿº.ÿ³.ÿ¬.ÿ¥.ÿž.ÿ—.ÿ.ÿ‰.ÿ‚.ÿ{.ÿt.ÿm.ÿf.ÿ_.ÿX.ÿQ.ÿJ.ÿC.ÿ<.ÿ5.ÿ..ÿ'.ÿ .ÿ.ÿ.ÿ .ÿ.ÿý-ÿö-ÿï-ÿè-ÿá-ÿÚ-ÿÓ-ÿÌ-ÿÅ-ÿ¾-ÿ·-ÿ°-ÿ©-ÿ¢-ÿ›-ÿ”-ÿ-ÿ†-ÿ-ÿx-ÿq-ÿj-ÿc-ÿ\-ÿU-ÿN-ÿG-ÿ@-ÿ9-ÿ2-ÿ+-ÿ$-ÿ-ÿ-ÿ-ÿ-ÿ-ÿú,ÿó,ÿì,ÿå,ÿÞ,ÿ×,ÿÐ,ÿÉ,ÿÂ,ÿ»,ÿ´,ÿ­,ÿ¦,ÿŸ,ÿ˜,ÿ‘,ÿŠ,ÿƒ,ÿ|,ÿu,ÿn,ÿg,ÿ`,ÿY,ÿR,ÿK,ÿD,ÿ=,ÿ6,ÿ/,ÿ(,ÿ!,ÿ,ÿ,ÿ ,ÿ,ÿþ+ÿ÷+ÿð+ÿé+ÿâ+ÿÛ+ÿÔ+ÿÍ+ÿÆ+ÿ¿+ÿ¸+ÿ±+ÿª+ÿ£+ÿœ+ÿ•+ÿŽ+ÿ‡+ÿ€+ÿy+ÿr+ÿk+ÿd+ÿ]+ÿV+ÿO+ÿH+ÿA+ÿ:+ÿ3+ÿ,+ÿ%+ÿ+ÿ+ÿ+ÿ +ÿ+ÿû*ÿô*ÿí*ÿæ*ÿß*ÿØ*ÿÑ*ÿÊ*ÿÃ*ÿ¼*ÿµ*ÿ®*ÿ§*ÿ *ÿ™*ÿ’*ÿ‹*ÿ„*ÿ}*ÿv*ÿo*ÿh*ÿa*ÿZ*ÿS*ÿL*ÿE*ÿ>*ÿ7*ÿ0*ÿ)*ÿ"*ÿ*ÿ*ÿ *ÿ*ÿÿ)ÿø)ÿñ)ÿê)ÿã)ÿÜ)ÿÕ)ÿÎ)ÿÇ)ÿÀ)ÿ¹)ÿ²)ÿ«)ÿ¤)ÿ)ÿ–)ÿ)ÿˆ)ÿ)ÿz)ÿs)ÿl)ÿe)ÿ^)ÿW)ÿP)ÿI)ÿB)ÿ;)ÿ4)ÿ-)ÿ&)ÿ)ÿ)ÿ)ÿ )ÿ)ÿü(ÿõ(ÿî(ÿç(ÿà(ÿÙ(ÿÒ(ÿË(ÿÄ(ÿ½(ÿ¶(ÿ¯(ÿ¨(ÿ¡(ÿš(ÿ“(ÿŒ(ÿ…(ÿ~(ÿw(ÿp(ÿi(ÿb(ÿ[(ÿT(ÿM(ÿF(ÿ?(ÿ8(ÿ1(ÿ*(ÿ#(ÿ(ÿ(ÿ(ÿ(ÿ(ÿù'ÿò'ÿë'ÿä'ÿÝ'ÿÖ'ÿÏ'ÿÈ'ÿÁ'ÿº'ÿ³'ÿ¬'ÿ¥'ÿž'ÿ—'ÿ'ÿ‰'ÿ‚'ÿ{'ÿt'ÿm'ÿf'ÿ_'ÿX'ÿQ'ÿJ'ÿC'ÿ<'ÿ5'ÿ.'ÿ''ÿ 'ÿ'ÿ'ÿ 'ÿ'ÿý&ÿö&ÿï&ÿè&ÿá&ÿÚ&ÿÓ&ÿÌ&ÿÅ&ÿ¾&ÿ·&ÿ°&ÿ©&ÿ¢&ÿ›&ÿ”&ÿ&ÿ†&ÿ&ÿx&ÿq&ÿj&ÿc&ÿ\&ÿU&ÿN&ÿG&ÿ@&ÿ9&ÿ2&ÿ+&ÿ$&ÿ&ÿ&ÿ&ÿ&ÿ&ÿú%ÿó%ÿì%ÿå%ÿÞ%ÿ×%ÿÐ%ÿÉ%ÿÂ%ÿ»%ÿ´%ÿ­%ÿ¦%ÿŸ%ÿ˜%ÿ‘%ÿŠ%ÿƒ%ÿ|%ÿu%ÿn%ÿg%ÿ`%ÿY%ÿR%ÿK%ÿD%ÿ=%ÿ6%ÿ/%ÿ(%ÿ!%ÿ%ÿ%ÿ %ÿ%ÿþ$ÿ÷$ÿð$ÿé$ÿâ$ÿÛ$ÿÔ$ÿÍ$ÿÆ$ÿ¿$ÿ¸$ÿ±$ÿª$ÿ£$ÿœ$ÿ•$ÿŽ$ÿ‡$ÿ€$ÿy$ÿr$ÿk$ÿd$ÿ]$ÿV$ÿO$ÿH$ÿA$ÿ:$ÿ3$ÿ,$ÿ%$ÿ$ÿ$ÿ$ÿ $ÿ$ÿû#ÿô#ÿí#ÿæ#ÿß#ÿØ#ÿÑ#ÿÊ#ÿÃ#ÿ¼#ÿµ#ÿ®#ÿ§#ÿ #ÿ™#ÿ’#ÿ‹#ÿ„#ÿ}#ÿv#ÿo#ÿh#ÿa#ÿZ#ÿS#ÿL#ÿE#ÿ>#ÿ7#ÿ0#ÿ)#ÿ"#ÿ#ÿ#ÿ #ÿ#ÿÿ"ÿø"ÿñ"ÿê"ÿã"ÿÜ"ÿÕ"ÿÎ"ÿÇ"ÿÀ"ÿ¹"ÿ²"ÿ«"ÿ¤"ÿ"ÿ–"ÿ"ÿˆ"ÿ"ÿz"ÿs"ÿl"ÿe"ÿ^"ÿW"ÿP"ÿI"ÿB"ÿ;"ÿ4"ÿ-"ÿ&"ÿ"ÿ"ÿ"ÿ "ÿ"ÿü!ÿõ!ÿî!ÿç!ÿà!ÿÙ!ÿÒ!ÿË!ÿÄ!ÿ½!ÿ¶!ÿ¯!ÿ¨!ÿ¡!ÿš!ÿ“!ÿŒ!ÿ…!ÿ~!ÿw!ÿp!ÿi!ÿb!ÿ[!ÿT!ÿM!ÿF!ÿ?!ÿ8!ÿ1!ÿ*!ÿ#!ÿ!ÿ!ÿ!ÿ!ÿ!ÿù ÿò ÿë ÿä ÿÝ ÿÖ ÿÏ ÿÈ ÿÁ ÿº ÿ³ ÿ¬ ÿ¥ ÿž ÿ— ÿ ÿ‰ ÿ‚ ÿ{ ÿt ÿm ÿf ÿ_ ÿX ÿQ ÿJ ÿC ÿ< ÿ5 ÿ. ÿ' ÿ ÿ ÿ ÿ ÿ ÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿ ÿø ÿñ ÿê ÿã ÿÜ ÿÕ ÿÎ ÿÇ ÿÀ ÿ¹ ÿ² ÿ« ÿ¤ ÿ ÿ– ÿ ÿˆ ÿ ÿz ÿs ÿl ÿe ÿ^ ÿW ÿP ÿI ÿB ÿ; ÿ4 ÿ- ÿ& ÿ ÿ ÿ ÿ ÿ ÿü ÿõ ÿî ÿç ÿà ÿÙ ÿÒ ÿË ÿÄ ÿ½ ÿ¶ ÿ¯ ÿ¨ ÿ¡ ÿš ÿ“ ÿŒ ÿ… ÿ~ ÿw ÿp ÿi ÿb ÿ[ ÿT ÿM ÿF ÿ? ÿ8 ÿ1 ÿ* ÿ# ÿ ÿ ÿ ÿ ÿ ÿù ÿò ÿë ÿä ÿÝ ÿÖ ÿÏ ÿÈ ÿÁ ÿº ÿ³ ÿ¬ ÿ¥ ÿž ÿ— ÿ ÿ‰ ÿ‚ ÿ{ ÿt ÿm ÿf ÿ_ ÿX ÿQ ÿJ ÿC ÿ< ÿ5 ÿ. ÿ' ÿ ÿ ÿ ÿ ÿ ÿý ÿö ÿï ÿè ÿá ÿÚ ÿÓ ÿÌ ÿÅ ÿ¾ ÿ· ÿ° ÿ© ÿ¢ ÿ› ÿ” ÿ ÿ† ÿ ÿx ÿq ÿj ÿc ÿ\ ÿU ÿN ÿG ÿ@ ÿ9 ÿ2 ÿ+ ÿ$ ÿ ÿ ÿ ÿ ÿ ÿú ÿó ÿì ÿå ÿÞ ÿ× ÿÐ ÿÉ ÿ ÿ» ÿ´ ÿ­ ÿ¦ ÿŸ ÿ˜ ÿ‘ ÿŠ ÿƒ ÿ| ÿu ÿn ÿg ÿ` ÿY ÿR ÿK ÿD ÿ= ÿ6 ÿ/ ÿ( ÿ! ÿ ÿ ÿ ÿ ÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿÿþøÿþñÿþêÿþãÿþÜÿþÕÿþÎÿþÇÿþÀÿþ¹ÿþ²ÿþ«ÿþ¤ÿþÿþ–ÿþÿþˆÿþÿþzÿþsÿþlÿþeÿþ^ÿþWÿþPÿþIÿþBÿþ;ÿþ4ÿþ-ÿþ&ÿþÿþÿþÿþ ÿþÿþüþþõþþîþþçþþàþþÙþþÒþþËþþÄþþ½þþ¶þþ¯þþ¨þþ¡þþšþþ“þþŒþþ…þþ~þþwþþpþþiþþbþþ[þþTþþMþþFþþ?þþ8þþ1þþ*þþ#þþþþþþþþþþþþùýþòýþëýþäýþÝýþÖýþÏýþÈýþÁýþºýþ³ýþ¬ýþ¥ýþžýþ—ýþýþ‰ýþ‚ýþ{ýþtýþmýþfýþ_ýþXýþQýþJýþCýþ<ýþ5ýþ.ýþ'ýþ ýþýþýþ ýþýþýüþöüþïüþèüþáüþÚüþÓüþÌüþÅüþ¾üþ·üþ°üþ©üþ¢üþ›üþ”üþüþ†üþüþxüþqüþjüþcüþ\üþUüþNüþGüþ@üþ9üþ2üþ+üþ$üþüþüþüþüþüþúûþóûþìûþåûþÞûþ×ûþÐûþÉûþÂûþ»ûþ´ûþ­ûþ¦ûþŸûþ˜ûþ‘ûþŠûþƒûþ|ûþuûþnûþgûþ`ûþYûþRûþKûþDûþ=ûþ6ûþ/ûþ(ûþ!ûþûþûþ ûþûþþúþ÷úþðúþéúþâúþÛúþÔúþÍúþÆúþ¿úþ¸úþ±úþªúþ£úþœúþ•úþŽúþ‡úþ€úþyúþrúþkúþdúþ]úþVúþOúþHúþAúþ:úþ3úþ,úþ%úþúþúþúþ úþúþûùþôùþíùþæùþßùþØùþÑùþÊùþÃùþ¼ùþµùþ®ùþ§ùþ ùþ™ùþ’ùþ‹ùþ„ùþ}ùþvùþoùþhùþaùþZùþSùþLùþEùþ>ùþ7ùþ0ùþ)ùþ"ùþùþùþ ùþùþÿøþøøþñøþêøþãøþÜøþÕøþÎøþÇøþÀøþ¹øþ²øþ«øþ¤øþøþ–øþøþˆøþøþzøþsøþløþeøþ^øþWøþPøþIøþBøþ;øþ4øþ-øþ&øþøþøþøþ øþøþü÷þõ÷þî÷þç÷þà÷þÙ÷þÒ÷þË÷þÄ÷þ½÷þ¶÷þ¯÷þ¨÷þ¡÷þš÷þ“÷þŒ÷þ…÷þ~÷þw÷þp÷þi÷þb÷þ[÷þT÷þM÷þF÷þ?÷þ8÷þ1÷þ*÷þ#÷þ÷þ÷þ÷þ÷þ÷þùöþòöþëöþäöþÝöþÖöþÏöþÈöþÁöþºöþ³öþ¬öþ¥öþžöþ—öþöþ‰öþ‚öþ{öþtöþmöþföþ_öþXöþQöþJöþCöþ<öþ5öþ.öþ'öþ öþöþöþ öþöþýõþöõþïõþèõþáõþÚõþÓõþÌõþÅõþ¾õþ·õþ°õþ©õþ¢õþ›õþ”õþõþ†õþõþxõþqõþjõþcõþ\õþUõþNõþGõþ@õþ9õþ2õþ+õþ$õþõþõþõþõþõþúôþóôþìôþåôþÞôþ×ôþÐôþÉôþÂôþ»ôþ´ôþ­ôþ¦ôþŸôþ˜ôþ‘ôþŠôþƒôþ|ôþuôþnôþgôþ`ôþYôþRôþKôþDôþ=ôþ6ôþ/ôþ(ôþ!ôþôþôþ ôþôþþóþ÷óþðóþéóþâóþÛóþÔóþÍóþÆóþ¿óþ¸óþ±óþªóþ£óþœóþ•óþŽóþ‡óþ€óþyóþróþkóþdóþ]óþVóþOóþHóþAóþ:óþ3óþ,óþ%óþóþóþóþ óþóþûòþôòþíòþæòþßòþØòþÑòþÊòþÃòþ¼òþµòþ®òþ§òþ òþ™òþ’òþ‹òþ„òþ}òþvòþoòþhòþaòþZòþSòþLòþEòþ>òþ7òþ0òþ)òþ"òþòþòþ òþòþÿñþøñþññþêñþãñþÜñþÕñþÎñþÇñþÀñþ¹ñþ²ñþ«ñþ¤ñþñþ–ñþñþˆñþñþzñþsñþlñþeñþ^ñþWñþPñþIñþBñþ;ñþ4ñþ-ñþ&ñþñþñþñþ ñþñþüðþõðþîðþçðþàðþÙðþÒðþËðþÄðþ½ðþ¶ðþ¯ðþ¨ðþ¡ðþšðþ“ðþŒðþ…ðþ~ðþwðþpðþiðþbðþ[ðþTðþMðþFðþ?ðþ8ðþ1ðþ*ðþ#ðþðþðþðþðþðþùïþòïþëïþäïþÝïþÖïþÏïþÈïþÁïþºïþ³ïþ¬ïþ¥ïþžïþ—ïþïþ‰ïþ‚ïþ{ïþtïþmïþfïþ_ïþXïþQïþJïþCïþ<ïþ5ïþ.ïþ'ïþ ïþïþïþ ïþïþýîþöîþïîþèîþáîþÚîþÓîþÌîþÅîþ¾îþ·îþ°îþ©îþ¢îþ›îþ”îþîþ†îþîþxîþqîþjîþcîþ\îþUîþNîþGîþ@îþ9îþ2îþ+îþ$îþîþîþîþîþîþúíþóíþìíþåíþÞíþ×íþÐíþÉíþÂíþ»íþ´íþ­íþ¦íþŸíþ˜íþ‘íþŠíþƒíþ|íþuíþníþgíþ`íþYíþRíþKíþDíþ=íþ6íþ/íþ(íþ!íþíþíþ íþíþþìþ÷ìþðìþéìþâìþÛìþÔìþÍìþÆìþ¿ìþ¸ìþ±ìþªìþ£ìþœìþ•ìþŽìþ‡ìþ€ìþyìþrìþkìþdìþ]ìþVìþOìþHìþAìþ:ìþ3ìþ,ìþ%ìþìþìþìþ ìþìþûëþôëþíëþæëþßëþØëþÑëþÊëþÃëþ¼ëþµëþ®ëþ§ëþ ëþ™ëþ’ëþ‹ëþ„ëþ}ëþvëþoëþhëþaëþZëþSëþLëþEëþ>ëþ7ëþ0ëþ)ëþ"ëþëþëþ ëþëþÿêþøêþñêþêêþãêþÜêþÕêþÎêþÇêþÀêþ¹êþ²êþ«êþ¤êþêþ–êþêþˆêþêþzêþsêþlêþeêþ^êþWêþPêþIêþBêþ;êþ4êþ-êþ&êþêþêþêþ êþêþüéþõéþîéþçéþàéþÙéþÒéþËéþÄéþ½éþ¶éþ¯éþ¨éþ¡éþšéþ“éþŒéþ…éþ~éþwéþpéþiéþbéþ[éþTéþMéþFéþ?éþ8éþ1éþ*éþ#éþéþéþéþéþéþùèþòèþëèþäèþÝèþÖèþÏèþÈèþÁèþºèþ³èþ¬èþ¥èþžèþ—èþèþ‰èþ‚èþ{èþtèþmèþfèþ_èþXèþQèþJèþCèþ<èþ5èþ.èþ'èþ èþèþèþ èþèþýçþöçþïçþèçþáçþÚçþÓçþÌçþÅçþ¾çþ·çþ°çþ©çþ¢çþ›çþ”çþçþ†çþçþxçþqçþjçþcçþ\çþUçþNçþGçþ@çþ9çþ2çþ+çþ$çþçþçþçþçþçþúæþóæþìæþåæþÞæþ׿þÐæþÉæþÂæþ»æþ´æþ­æþ¦æþŸæþ˜æþ‘æþŠæþƒæþ|æþuæþnæþgæþ`æþYæþRæþKæþDæþ=æþ6æþ/æþ(æþ!æþæþæþ æþæþþåþ÷åþðåþéåþâåþÛåþÔåþÍåþÆåþ¿åþ¸åþ±åþªåþ£åþœåþ•åþŽåþ‡åþ€åþyåþråþkåþdåþ]åþVåþOåþHåþAåþ:åþ3åþ,åþ%åþåþåþåþ åþåþûäþôäþíäþæäþßäþØäþÑäþÊäþÃäþ¼äþµäþ®äþ§äþ äþ™äþ’äþ‹äþ„äþ}äþväþoäþhäþaäþZäþSäþLäþEäþ>äþ7äþ0äþ)äþ"äþäþäþ äþäþÿãþøãþñãþêãþããþÜãþÕãþÎãþÇãþÀãþ¹ãþ²ãþ«ãþ¤ãþãþ–ãþãþˆãþãþzãþsãþlãþeãþ^ãþWãþPãþIãþBãþ;ãþ4ãþ-ãþ&ãþãþãþãþ ãþãþüâþõâþîâþçâþàâþÙâþÒâþËâþÄâþ½âþ¶âþ¯âþ¨âþ¡âþšâþ“âþŒâþ…âþ~âþwâþpâþiâþbâþ[âþTâþMâþFâþ?âþ8âþ1âþ*âþ#âþâþâþâþâþâþùáþòáþëáþäáþÝáþÖáþÏáþÈáþÁáþºáþ³áþ¬áþ¥áþžáþ—áþáþ‰áþ‚áþ{áþtáþmáþfáþ_áþXáþQáþJáþCáþ<áþ5áþ.áþ'áþ áþáþáþ áþáþýàþöàþïàþèàþáàþÚàþÓàþÌàþÅàþ¾àþ·àþ°àþ©àþ¢àþ›àþ”àþàþ†àþàþxàþqàþjàþcàþ\àþUàþNàþGàþ@àþ9àþ2àþ+àþ$àþàþàþàþàþàþúßþóßþìßþåßþÞßþ×ßþÐßþÉßþÂßþ»ßþ´ßþ­ßþ¦ßþŸßþ˜ßþ‘ßþŠßþƒßþ|ßþußþnßþgßþ`ßþYßþRßþKßþDßþ=ßþ6ßþ/ßþ(ßþ!ßþßþßþ ßþßþþÞþ÷ÞþðÞþéÞþâÞþÛÞþÔÞþÍÞþÆÞþ¿Þþ¸Þþ±ÞþªÞþ£ÞþœÞþ•ÞþŽÞþ‡Þþ€ÞþyÞþrÞþkÞþdÞþ]ÞþVÞþOÞþHÞþAÞþ:Þþ3Þþ,Þþ%ÞþÞþÞþÞþ ÞþÞþûÝþôÝþíÝþæÝþßÝþØÝþÑÝþÊÝþÃÝþ¼ÝþµÝþ®Ýþ§Ýþ Ýþ™Ýþ’Ýþ‹Ýþ„Ýþ}ÝþvÝþoÝþhÝþaÝþZÝþSÝþLÝþEÝþ>Ýþ7Ýþ0Ýþ)Ýþ"ÝþÝþÝþ ÝþÝþÿÜþøÜþñÜþêÜþãÜþÜÜþÕÜþÎÜþÇÜþÀÜþ¹Üþ²Üþ«Üþ¤ÜþÜþ–ÜþÜþˆÜþÜþzÜþsÜþlÜþeÜþ^ÜþWÜþPÜþIÜþBÜþ;Üþ4Üþ-Üþ&ÜþÜþÜþÜþ ÜþÜþüÛþõÛþîÛþçÛþàÛþÙÛþÒÛþËÛþÄÛþ½Ûþ¶Ûþ¯Ûþ¨Ûþ¡ÛþšÛþ“ÛþŒÛþ…Ûþ~ÛþwÛþpÛþiÛþbÛþ[ÛþTÛþMÛþFÛþ?Ûþ8Ûþ1Ûþ*Ûþ#ÛþÛþÛþÛþÛþÛþùÚþòÚþëÚþäÚþÝÚþÖÚþÏÚþÈÚþÁÚþºÚþ³Úþ¬Úþ¥ÚþžÚþ—ÚþÚþ‰Úþ‚Úþ{ÚþtÚþmÚþfÚþ_ÚþXÚþQÚþJÚþCÚþ<Úþ5Úþ.Úþ'Úþ ÚþÚþÚþ ÚþÚþýÙþöÙþïÙþèÙþáÙþÚÙþÓÙþÌÙþÅÙþ¾Ùþ·Ùþ°Ùþ©Ùþ¢Ùþ›Ùþ”ÙþÙþ†ÙþÙþxÙþqÙþjÙþcÙþ\ÙþUÙþNÙþGÙþ@Ùþ9Ùþ2Ùþ+Ùþ$ÙþÙþÙþÙþÙþÙþúØþóØþìØþåØþÞØþרþÐØþÉØþÂØþ»Øþ´Øþ­Øþ¦ØþŸØþ˜Øþ‘ØþŠØþƒØþ|ØþuØþnØþgØþ`ØþYØþRØþKØþDØþ=Øþ6Øþ/Øþ(Øþ!ØþØþØþ ØþØþþ×þ÷×þð×þé×þâ×þÛ×þÔ×þÍ×þÆ×þ¿×þ¸×þ±×þª×þ£×þœ×þ•×þŽ×þ‡×þ€×þy×þr×þk×þd×þ]×þV×þO×þH×þA×þ:×þ3×þ,×þ%×þ×þ×þ×þ ×þ×þûÖþôÖþíÖþæÖþßÖþØÖþÑÖþÊÖþÃÖþ¼ÖþµÖþ®Öþ§Öþ Öþ™Öþ’Öþ‹Öþ„Öþ}ÖþvÖþoÖþhÖþaÖþZÖþSÖþLÖþEÖþ>Öþ7Öþ0Öþ)Öþ"ÖþÖþÖþ ÖþÖþÿÕþøÕþñÕþêÕþãÕþÜÕþÕÕþÎÕþÇÕþÀÕþ¹Õþ²Õþ«Õþ¤ÕþÕþ–ÕþÕþˆÕþÕþzÕþsÕþlÕþeÕþ^ÕþWÕþPÕþIÕþBÕþ;Õþ4Õþ-Õþ&ÕþÕþÕþÕþ ÕþÕþüÔþõÔþîÔþçÔþàÔþÙÔþÒÔþËÔþÄÔþ½Ôþ¶Ôþ¯Ôþ¨Ôþ¡ÔþšÔþ“ÔþŒÔþ…Ôþ~ÔþwÔþpÔþiÔþbÔþ[ÔþTÔþMÔþFÔþ?Ôþ8Ôþ1Ôþ*Ôþ#ÔþÔþÔþÔþÔþÔþùÓþòÓþëÓþäÓþÝÓþÖÓþÏÓþÈÓþÁÓþºÓþ³Óþ¬Óþ¥ÓþžÓþ—ÓþÓþ‰Óþ‚Óþ{ÓþtÓþmÓþfÓþ_ÓþXÓþQÓþJÓþCÓþ<Óþ5Óþ.Óþ'Óþ ÓþÓþÓþ ÓþÓþýÒþöÒþïÒþèÒþáÒþÚÒþÓÒþÌÒþÅÒþ¾Òþ·Òþ°Òþ©Òþ¢Òþ›Òþ”ÒþÒþ†ÒþÒþxÒþqÒþjÒþcÒþ\ÒþUÒþNÒþGÒþ@Òþ9Òþ2Òþ+Òþ$ÒþÒþÒþÒþÒþÒþúÑþóÑþìÑþåÑþÞÑþ×ÑþÐÑþÉÑþÂÑþ»Ñþ´Ñþ­Ñþ¦ÑþŸÑþ˜Ñþ‘ÑþŠÑþƒÑþ|ÑþuÑþnÑþgÑþ`ÑþYÑþRÑþKÑþDÑþ=Ñþ6Ñþ/Ñþ(Ñþ!ÑþÑþÑþ ÑþÑþþÐþ÷ÐþðÐþéÐþâÐþÛÐþÔÐþÍÐþÆÐþ¿Ðþ¸Ðþ±ÐþªÐþ£ÐþœÐþ•ÐþŽÐþ‡Ðþ€ÐþyÐþrÐþkÐþdÐþ]ÐþVÐþOÐþHÐþAÐþ:Ðþ3Ðþ,Ðþ%ÐþÐþÐþÐþ ÐþÐþûÏþôÏþíÏþæÏþßÏþØÏþÑÏþÊÏþÃÏþ¼ÏþµÏþ®Ïþ§Ïþ Ïþ™Ïþ’Ïþ‹Ïþ„Ïþ}ÏþvÏþoÏþhÏþaÏþZÏþSÏþLÏþEÏþ>Ïþ7Ïþ0Ïþ)Ïþ"ÏþÏþÏþ ÏþÏþÿÎþøÎþñÎþêÎþãÎþÜÎþÕÎþÎÎþÇÎþÀÎþ¹Îþ²Îþ«Îþ¤ÎþÎþ–ÎþÎþˆÎþÎþzÎþsÎþlÎþeÎþ^ÎþWÎþPÎþIÎþBÎþ;Îþ4Îþ-Îþ&ÎþÎþÎþÎþ ÎþÎþüÍþõÍþîÍþçÍþàÍþÙÍþÒÍþËÍþÄÍþ½Íþ¶Íþ¯Íþ¨Íþ¡ÍþšÍþ“ÍþŒÍþ…Íþ~ÍþwÍþpÍþiÍþbÍþ[ÍþTÍþMÍþFÍþ?Íþ8Íþ1Íþ*Íþ#ÍþÍþÍþÍþÍþÍþùÌþòÌþëÌþäÌþÝÌþÖÌþÏÌþÈÌþÁÌþºÌþ³Ìþ¬Ìþ¥ÌþžÌþ—ÌþÌþ‰Ìþ‚Ìþ{ÌþtÌþmÌþfÌþ_ÌþXÌþQÌþJÌþCÌþ<Ìþ5Ìþ.Ìþ'Ìþ ÌþÌþÌþ ÌþÌþýËþöËþïËþèËþáËþÚËþÓËþÌËþÅËþ¾Ëþ·Ëþ°Ëþ©Ëþ¢Ëþ›Ëþ”ËþËþ†ËþËþxËþqËþjËþcËþ\ËþUËþNËþGËþ@Ëþ9Ëþ2Ëþ+Ëþ$ËþËþËþËþËþËþúÊþóÊþìÊþåÊþÞÊþ×ÊþÐÊþÉÊþÂÊþ»Êþ´Êþ­Êþ¦ÊþŸÊþ˜Êþ‘ÊþŠÊþƒÊþ|ÊþuÊþnÊþgÊþ`ÊþYÊþRÊþKÊþDÊþ=Êþ6Êþ/Êþ(Êþ!ÊþÊþÊþ ÊþÊþþÉþ÷ÉþðÉþéÉþâÉþÛÉþÔÉþÍÉþÆÉþ¿Éþ¸Éþ±ÉþªÉþ£ÉþœÉþ•ÉþŽÉþ‡Éþ€ÉþyÉþrÉþkÉþdÉþ]ÉþVÉþOÉþHÉþAÉþ:Éþ3Éþ,Éþ%ÉþÉþÉþÉþ ÉþÉþûÈþôÈþíÈþæÈþßÈþØÈþÑÈþÊÈþÃÈþ¼ÈþµÈþ®Èþ§Èþ Èþ™Èþ’Èþ‹Èþ„Èþ}ÈþvÈþoÈþhÈþaÈþZÈþSÈþLÈþEÈþ>Èþ7Èþ0Èþ)Èþ"ÈþÈþÈþ ÈþÈþÿÇþøÇþñÇþêÇþãÇþÜÇþÕÇþÎÇþÇÇþÀÇþ¹Çþ²Çþ«Çþ¤ÇþÇþ–ÇþÇþˆÇþÇþzÇþsÇþlÇþeÇþ^ÇþWÇþPÇþIÇþBÇþ;Çþ4Çþ-Çþ&ÇþÇþÇþÇþ ÇþÇþüÆþõÆþîÆþçÆþàÆþÙÆþÒÆþËÆþÄÆþ½Æþ¶Æþ¯Æþ¨Æþ¡ÆþšÆþ“ÆþŒÆþ…Æþ~ÆþwÆþpÆþiÆþbÆþ[ÆþTÆþMÆþFÆþ?Æþ8Æþ1Æþ*Æþ#ÆþÆþÆþÆþÆþÆþùÅþòÅþëÅþäÅþÝÅþÖÅþÏÅþÈÅþÁÅþºÅþ³Åþ¬Åþ¥ÅþžÅþ—ÅþÅþ‰Åþ‚Åþ{ÅþtÅþmÅþfÅþ_ÅþXÅþQÅþJÅþCÅþ<Åþ5Åþ.Åþ'Åþ ÅþÅþÅþ ÅþÅþýÄþöÄþïÄþèÄþáÄþÚÄþÓÄþÌÄþÅÄþ¾Äþ·Äþ°Äþ©Äþ¢Äþ›Äþ”ÄþÄþ†ÄþÄþxÄþqÄþjÄþcÄþ\ÄþUÄþNÄþGÄþ@Äþ9Äþ2Äþ+Äþ$ÄþÄþÄþÄþÄþÄþúÃþóÃþìÃþåÃþÞÃþ×ÃþÐÃþÉÃþÂÃþ»Ãþ´Ãþ­Ãþ¦ÃþŸÃþ˜Ãþ‘ÃþŠÃþƒÃþ|ÃþuÃþnÃþgÃþ`ÃþYÃþRÃþKÃþDÃþ=Ãþ6Ãþ/Ãþ(Ãþ!ÃþÃþÃþ ÃþÃþþÂþ÷ÂþðÂþéÂþâÂþÛÂþÔÂþÍÂþÆÂþ¿Âþ¸Âþ±ÂþªÂþ£ÂþœÂþ•ÂþŽÂþ‡Âþ€ÂþyÂþrÂþkÂþdÂþ]ÂþVÂþOÂþHÂþAÂþ:Âþ3Âþ,Âþ%ÂþÂþÂþÂþ ÂþÂþûÁþôÁþíÁþæÁþßÁþØÁþÑÁþÊÁþÃÁþ¼ÁþµÁþ®Áþ§Áþ Áþ™Áþ’Áþ‹Áþ„Áþ}ÁþvÁþoÁþhÁþaÁþZÁþSÁþLÁþEÁþ>Áþ7Áþ0Áþ)Áþ"ÁþÁþÁþ ÁþÁþÿÀþøÀþñÀþêÀþãÀþÜÀþÕÀþÎÀþÇÀþÀÀþ¹Àþ²Àþ«Àþ¤ÀþÀþ–ÀþÀþˆÀþÀþzÀþsÀþlÀþeÀþ^ÀþWÀþPÀþIÀþBÀþ;Àþ4Àþ-Àþ&ÀþÀþÀþÀþ ÀþÀþü¿þõ¿þî¿þç¿þà¿þÙ¿þÒ¿þË¿þÄ¿þ½¿þ¶¿þ¯¿þ¨¿þ¡¿þš¿þ“¿þŒ¿þ…¿þ~¿þw¿þp¿þi¿þb¿þ[¿þT¿þM¿þF¿þ?¿þ8¿þ1¿þ*¿þ#¿þ¿þ¿þ¿þ¿þ¿þù¾þò¾þë¾þä¾þݾþÖ¾þϾþȾþÁ¾þº¾þ³¾þ¬¾þ¥¾þž¾þ—¾þ¾þ‰¾þ‚¾þ{¾þt¾þm¾þf¾þ_¾þX¾þQ¾þJ¾þC¾þ<¾þ5¾þ.¾þ'¾þ ¾þ¾þ¾þ ¾þ¾þý½þö½þï½þè½þá½þÚ½þÓ½þ̽þŽþ¾½þ·½þ°½þ©½þ¢½þ›½þ”½þ½þ†½þ½þx½þq½þj½þc½þ\½þU½þN½þG½þ@½þ9½þ2½þ+½þ$½þ½þ½þ½þ½þ½þú¼þó¼þì¼þå¼þÞ¼þ×¼þмþɼþ¼þ»¼þ´¼þ­¼þ¦¼þŸ¼þ˜¼þ‘¼þмþƒ¼þ|¼þu¼þn¼þg¼þ`¼þY¼þR¼þK¼þD¼þ=¼þ6¼þ/¼þ(¼þ!¼þ¼þ¼þ ¼þ¼þþ»þ÷»þð»þé»þâ»þÛ»þÔ»þÍ»þÆ»þ¿»þ¸»þ±»þª»þ£»þœ»þ•»þŽ»þ‡»þ€»þy»þr»þk»þd»þ]»þV»þO»þH»þA»þ:»þ3»þ,»þ%»þ»þ»þ»þ »þ»þûºþôºþíºþæºþߺþغþѺþʺþúþ¼ºþµºþ®ºþ§ºþ ºþ™ºþ’ºþ‹ºþ„ºþ}ºþvºþoºþhºþaºþZºþSºþLºþEºþ>ºþ7ºþ0ºþ)ºþ"ºþºþºþ ºþºþÿ¹þø¹þñ¹þê¹þã¹þܹþÕ¹þιþǹþÀ¹þ¹¹þ²¹þ«¹þ¤¹þ¹þ–¹þ¹þˆ¹þ¹þz¹þs¹þl¹þe¹þ^¹þW¹þP¹þI¹þB¹þ;¹þ4¹þ-¹þ&¹þ¹þ¹þ¹þ ¹þ¹þü¸þõ¸þî¸þç¸þà¸þÙ¸þÒ¸þ˸þĸþ½¸þ¶¸þ¯¸þ¨¸þ¡¸þš¸þ“¸þŒ¸þ…¸þ~¸þw¸þp¸þi¸þb¸þ[¸þT¸þM¸þF¸þ?¸þ8¸þ1¸þ*¸þ#¸þ¸þ¸þ¸þ¸þ¸þù·þò·þë·þä·þÝ·þÖ·þÏ·þÈ·þÁ·þº·þ³·þ¬·þ¥·þž·þ—·þ·þ‰·þ‚·þ{·þt·þm·þf·þ_·þX·þQ·þJ·þC·þ<·þ5·þ.·þ'·þ ·þ·þ·þ ·þ·þý¶þö¶þï¶þè¶þá¶þÚ¶þÓ¶þ̶þŶþ¾¶þ·¶þ°¶þ©¶þ¢¶þ›¶þ”¶þ¶þ†¶þ¶þx¶þq¶þj¶þc¶þ\¶þU¶þN¶þG¶þ@¶þ9¶þ2¶þ+¶þ$¶þ¶þ¶þ¶þ¶þ¶þúµþóµþìµþåµþÞµþ×µþеþɵþµþ»µþ´µþ­µþ¦µþŸµþ˜µþ‘µþеþƒµþ|µþuµþnµþgµþ`µþYµþRµþKµþDµþ=µþ6µþ/µþ(µþ!µþµþµþ µþµþþ´þ÷´þð´þé´þâ´þÛ´þÔ´þÍ´þÆ´þ¿´þ¸´þ±´þª´þ£´þœ´þ•´þŽ´þ‡´þ€´þy´þr´þk´þd´þ]´þV´þO´þH´þA´þ:´þ3´þ,´þ%´þ´þ´þ´þ ´þ´þû³þô³þí³þæ³þß³þسþѳþʳþóþ¼³þµ³þ®³þ§³þ ³þ™³þ’³þ‹³þ„³þ}³þv³þo³þh³þa³þZ³þS³þL³þE³þ>³þ7³þ0³þ)³þ"³þ³þ³þ ³þ³þÿ²þø²þñ²þê²þã²þܲþÕ²þβþDzþÀ²þ¹²þ²²þ«²þ¤²þ²þ–²þ²þˆ²þ²þz²þs²þl²þe²þ^²þW²þP²þI²þB²þ;²þ4²þ-²þ&²þ²þ²þ²þ ²þ²þü±þõ±þî±þç±þà±þÙ±þÒ±þ˱þıþ½±þ¶±þ¯±þ¨±þ¡±þš±þ“±þŒ±þ…±þ~±þw±þp±þi±þb±þ[±þT±þM±þF±þ?±þ8±þ1±þ*±þ#±þ±þ±þ±þ±þ±þù°þò°þë°þä°þݰþÖ°þϰþȰþÁ°þº°þ³°þ¬°þ¥°þž°þ—°þ°þ‰°þ‚°þ{°þt°þm°þf°þ_°þX°þQ°þJ°þC°þ<°þ5°þ.°þ'°þ °þ°þ°þ °þ°þý¯þö¯þï¯þè¯þá¯þÚ¯þÓ¯þ̯þůþ¾¯þ·¯þ°¯þ©¯þ¢¯þ›¯þ”¯þ¯þ†¯þ¯þx¯þq¯þj¯þc¯þ\¯þU¯þN¯þG¯þ@¯þ9¯þ2¯þ+¯þ$¯þ¯þ¯þ¯þ¯þ¯þú®þó®þì®þå®þÞ®þ×®þЮþÉ®þ®þ»®þ´®þ­®þ¦®þŸ®þ˜®þ‘®þŠ®þƒ®þ|®þu®þn®þg®þ`®þY®þR®þK®þD®þ=®þ6®þ/®þ(®þ!®þ®þ®þ ®þ®þþ­þ÷­þð­þé­þâ­þÛ­þÔ­þÍ­þÆ­þ¿­þ¸­þ±­þª­þ£­þœ­þ•­þŽ­þ‡­þ€­þy­þr­þk­þd­þ]­þV­þO­þH­þA­þ:­þ3­þ,­þ%­þ­þ­þ­þ ­þ­þû¬þô¬þí¬þæ¬þ߬þجþѬþʬþìþ¼¬þµ¬þ®¬þ§¬þ ¬þ™¬þ’¬þ‹¬þ„¬þ}¬þv¬þo¬þh¬þa¬þZ¬þS¬þL¬þE¬þ>¬þ7¬þ0¬þ)¬þ"¬þ¬þ¬þ ¬þ¬þÿ«þø«þñ«þê«þã«þÜ«þÕ«þΫþÇ«þÀ«þ¹«þ²«þ««þ¤«þ«þ–«þ«þˆ«þ«þz«þs«þl«þe«þ^«þW«þP«þI«þB«þ;«þ4«þ-«þ&«þ«þ«þ«þ «þ«þüªþõªþîªþçªþàªþÙªþÒªþ˪þĪþ½ªþ¶ªþ¯ªþ¨ªþ¡ªþšªþ“ªþŒªþ…ªþ~ªþwªþpªþiªþbªþ[ªþTªþMªþFªþ?ªþ8ªþ1ªþ*ªþ#ªþªþªþªþªþªþù©þò©þë©þä©þÝ©þÖ©þÏ©þÈ©þÁ©þº©þ³©þ¬©þ¥©þž©þ—©þ©þ‰©þ‚©þ{©þt©þm©þf©þ_©þX©þQ©þJ©þC©þ<©þ5©þ.©þ'©þ ©þ©þ©þ ©þ©þý¨þö¨þï¨þè¨þá¨þÚ¨þÓ¨þ̨þŨþ¾¨þ·¨þ°¨þ©¨þ¢¨þ›¨þ”¨þ¨þ†¨þ¨þx¨þq¨þj¨þc¨þ\¨þU¨þN¨þG¨þ@¨þ9¨þ2¨þ+¨þ$¨þ¨þ¨þ¨þ¨þ¨þú§þó§þì§þå§þÞ§þ×§þЧþɧþ§þ»§þ´§þ­§þ¦§þŸ§þ˜§þ‘§þЧþƒ§þ|§þu§þn§þg§þ`§þY§þR§þK§þD§þ=§þ6§þ/§þ(§þ!§þ§þ§þ §þ§þþ¦þ÷¦þð¦þé¦þâ¦þÛ¦þÔ¦þͦþƦþ¿¦þ¸¦þ±¦þª¦þ£¦þœ¦þ•¦þަþ‡¦þ€¦þy¦þr¦þk¦þd¦þ]¦þV¦þO¦þH¦þA¦þ:¦þ3¦þ,¦þ%¦þ¦þ¦þ¦þ ¦þ¦þû¥þô¥þí¥þæ¥þߥþØ¥þÑ¥þÊ¥þÃ¥þ¼¥þµ¥þ®¥þ§¥þ ¥þ™¥þ’¥þ‹¥þ„¥þ}¥þv¥þo¥þh¥þa¥þZ¥þS¥þL¥þE¥þ>¥þ7¥þ0¥þ)¥þ"¥þ¥þ¥þ ¥þ¥þÿ¤þø¤þñ¤þê¤þã¤þܤþÕ¤þΤþǤþÀ¤þ¹¤þ²¤þ«¤þ¤¤þ¤þ–¤þ¤þˆ¤þ¤þz¤þs¤þl¤þe¤þ^¤þW¤þP¤þI¤þB¤þ;¤þ4¤þ-¤þ&¤þ¤þ¤þ¤þ ¤þ¤þü£þõ£þî£þç£þà£þÙ£þÒ£þË£þÄ£þ½£þ¶£þ¯£þ¨£þ¡£þš£þ“£þŒ£þ…£þ~£þw£þp£þi£þb£þ[£þT£þM£þF£þ?£þ8£þ1£þ*£þ#£þ£þ£þ£þ£þ£þù¢þò¢þë¢þä¢þÝ¢þÖ¢þÏ¢þÈ¢þÁ¢þº¢þ³¢þ¬¢þ¥¢þž¢þ—¢þ¢þ‰¢þ‚¢þ{¢þt¢þm¢þf¢þ_¢þX¢þQ¢þJ¢þC¢þ<¢þ5¢þ.¢þ'¢þ ¢þ¢þ¢þ ¢þ¢þý¡þö¡þï¡þè¡þá¡þÚ¡þÓ¡þÌ¡þÅ¡þ¾¡þ·¡þ°¡þ©¡þ¢¡þ›¡þ”¡þ¡þ†¡þ¡þx¡þq¡þj¡þc¡þ\¡þU¡þN¡þG¡þ@¡þ9¡þ2¡þ+¡þ$¡þ¡þ¡þ¡þ¡þ¡þú þó þì þå þÞ þ× þРþÉ þ þ» þ´ þ­ þ¦ þŸ þ˜ þ‘ þŠ þƒ þ| þu þn þg þ` þY þR þK þD þ= þ6 þ/ þ( þ! þ þ þ  þ þþŸþ÷ŸþðŸþéŸþâŸþÛŸþÔŸþÍŸþÆŸþ¿Ÿþ¸Ÿþ±ŸþªŸþ£ŸþœŸþ•ŸþŽŸþ‡Ÿþ€ŸþyŸþrŸþkŸþdŸþ]ŸþVŸþOŸþHŸþAŸþ:Ÿþ3Ÿþ,Ÿþ%ŸþŸþŸþŸþ ŸþŸþûžþôžþížþæžþßžþØžþÑžþÊžþÞþ¼žþµžþ®žþ§žþ žþ™žþ’žþ‹žþ„žþ}žþvžþožþhžþažþZžþSžþLžþEžþ>žþ7žþ0žþ)žþ"žþžþžþ žþžþÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüœþõœþîœþçœþàœþÙœþÒœþËœþÄœþ½œþ¶œþ¯œþ¨œþ¡œþšœþ“œþŒœþ…œþ~œþwœþpœþiœþbœþ[œþTœþMœþFœþ?œþ8œþ1œþ*œþ#œþœþœþœþœþœþù›þò›þë›þä›þÝ›þÖ›þÏ›þÈ›þÁ›þº›þ³›þ¬›þ¥›þž›þ—›þ›þ‰›þ‚›þ{›þt›þm›þf›þ_›þX›þQ›þJ›þC›þ<›þ5›þ.›þ'›þ ›þ›þ›þ ›þ›þýšþöšþïšþèšþášþÚšþÓšþÌšþÅšþ¾šþ·šþ°šþ©šþ¢šþ›šþ”šþšþ†šþšþxšþqšþjšþcšþ\šþUšþNšþGšþ@šþ9šþ2šþ+šþ$šþšþšþšþšþšþú™þó™þì™þå™þÞ™þ×™þЙþÉ™þ™þ»™þ´™þ­™þ¦™þŸ™þ˜™þ‘™þŠ™þƒ™þ|™þu™þn™þg™þ`™þY™þR™þK™þD™þ=™þ6™þ/™þ(™þ!™þ™þ™þ ™þ™þþ˜þ÷˜þð˜þé˜þâ˜þÛ˜þÔ˜þ͘þƘþ¿˜þ¸˜þ±˜þª˜þ£˜þœ˜þ•˜þŽ˜þ‡˜þ€˜þy˜þr˜þk˜þd˜þ]˜þV˜þO˜þH˜þA˜þ:˜þ3˜þ,˜þ%˜þ˜þ˜þ˜þ ˜þ˜þû—þô—þí—þæ—þß—þØ—þÑ—þÊ—þ×þ¼—þµ—þ®—þ§—þ —þ™—þ’—þ‹—þ„—þ}—þv—þo—þh—þa—þZ—þS—þL—þE—þ>—þ7—þ0—þ)—þ"—þ—þ—þ —þ—þÿ–þø–þñ–þê–þã–þÜ–þÕ–þΖþÇ–þÀ–þ¹–þ²–þ«–þ¤–þ–þ––þ–þˆ–þ–þz–þs–þl–þe–þ^–þW–þP–þI–þB–þ;–þ4–þ-–þ&–þ–þ–þ–þ –þ–þü•þõ•þî•þç•þà•þÙ•þÒ•þË•þÄ•þ½•þ¶•þ¯•þ¨•þ¡•þš•þ“•þŒ•þ…•þ~•þw•þp•þi•þb•þ[•þT•þM•þF•þ?•þ8•þ1•þ*•þ#•þ•þ•þ•þ•þ•þù”þò”þë”þä”þÝ”þÖ”þÏ”þÈ”þÁ”þº”þ³”þ¬”þ¥”þž”þ—”þ”þ‰”þ‚”þ{”þt”þm”þf”þ_”þX”þQ”þJ”þC”þ<”þ5”þ.”þ'”þ ”þ”þ”þ ”þ”þý“þö“þï“þè“þá“þÚ“þÓ“þÌ“þÅ“þ¾“þ·“þ°“þ©“þ¢“þ›“þ”“þ“þ†“þ“þx“þq“þj“þc“þ\“þU“þN“þG“þ@“þ9“þ2“þ+“þ$“þ“þ“þ“þ“þ“þú’þó’þì’þå’þÞ’þ×’þÐ’þÉ’þÂ’þ»’þ´’þ­’þ¦’þŸ’þ˜’þ‘’þŠ’þƒ’þ|’þu’þn’þg’þ`’þY’þR’þK’þD’þ=’þ6’þ/’þ(’þ!’þ’þ’þ ’þ’þþ‘þ÷‘þð‘þé‘þâ‘þÛ‘þÔ‘þÍ‘þÆ‘þ¿‘þ¸‘þ±‘þª‘þ£‘þœ‘þ•‘þŽ‘þ‡‘þ€‘þy‘þr‘þk‘þd‘þ]‘þV‘þO‘þH‘þA‘þ:‘þ3‘þ,‘þ%‘þ‘þ‘þ‘þ ‘þ‘þûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüŽþõŽþîŽþçŽþàŽþÙŽþÒŽþËŽþÄŽþ½Žþ¶Žþ¯Žþ¨Žþ¡ŽþšŽþ“ŽþŒŽþ…Žþ~ŽþwŽþpŽþiŽþbŽþ[ŽþTŽþMŽþFŽþ?Žþ8Žþ1Žþ*Žþ#ŽþŽþŽþŽþŽþŽþùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýŒþöŒþïŒþèŒþáŒþÚŒþÓŒþÌŒþÅŒþ¾Œþ·Œþ°Œþ©Œþ¢Œþ›Œþ”ŒþŒþ†ŒþŒþxŒþqŒþjŒþcŒþ\ŒþUŒþNŒþGŒþ@Œþ9Œþ2Œþ+Œþ$ŒþŒþŒþŒþŒþŒþú‹þó‹þì‹þå‹þÞ‹þ׋þЋþÉ‹þ‹þ»‹þ´‹þ­‹þ¦‹þŸ‹þ˜‹þ‘‹þŠ‹þƒ‹þ|‹þu‹þn‹þg‹þ`‹þY‹þR‹þK‹þD‹þ=‹þ6‹þ/‹þ(‹þ!‹þ‹þ‹þ ‹þ‹þþŠþ÷ŠþðŠþéŠþâŠþÛŠþÔŠþÍŠþÆŠþ¿Šþ¸Šþ±ŠþªŠþ£ŠþœŠþ•ŠþŽŠþ‡Šþ€ŠþyŠþrŠþkŠþdŠþ]ŠþVŠþOŠþHŠþAŠþ:Šþ3Šþ,Šþ%ŠþŠþŠþŠþ ŠþŠþû‰þô‰þí‰þæ‰þ߉þ؉þщþʉþÉþ¼‰þµ‰þ®‰þ§‰þ ‰þ™‰þ’‰þ‹‰þ„‰þ}‰þv‰þo‰þh‰þa‰þZ‰þS‰þL‰þE‰þ>‰þ7‰þ0‰þ)‰þ"‰þ‰þ‰þ ‰þ‰þÿˆþøˆþñˆþêˆþãˆþ܈þÕˆþΈþLjþÀˆþ¹ˆþ²ˆþ«ˆþ¤ˆþˆþ–ˆþˆþˆˆþˆþzˆþsˆþlˆþeˆþ^ˆþWˆþPˆþIˆþBˆþ;ˆþ4ˆþ-ˆþ&ˆþˆþˆþˆþ ˆþˆþü‡þõ‡þî‡þç‡þà‡þÙ‡þÒ‡þˇþćþ½‡þ¶‡þ¯‡þ¨‡þ¡‡þš‡þ“‡þŒ‡þ…‡þ~‡þw‡þp‡þi‡þb‡þ[‡þT‡þM‡þF‡þ?‡þ8‡þ1‡þ*‡þ#‡þ‡þ‡þ‡þ‡þ‡þù†þò†þë†þä†þ݆þÖ†þφþȆþÁ†þº†þ³†þ¬†þ¥†þž†þ—†þ†þ‰†þ‚†þ{†þt†þm†þf†þ_†þX†þQ†þJ†þC†þ<†þ5†þ.†þ'†þ †þ†þ†þ †þ†þý…þö…þï…þè…þá…þÚ…þÓ…þÌ…þÅ…þ¾…þ·…þ°…þ©…þ¢…þ›…þ”…þ…þ†…þ…þx…þq…þj…þc…þ\…þU…þN…þG…þ@…þ9…þ2…þ+…þ$…þ…þ…þ…þ…þ…þú„þó„þì„þå„þÞ„þׄþЄþÉ„þ„þ»„þ´„þ­„þ¦„þŸ„þ˜„þ‘„þŠ„þƒ„þ|„þu„þn„þg„þ`„þY„þR„þK„þD„þ=„þ6„þ/„þ(„þ!„þ„þ„þ „þ„þþƒþ÷ƒþðƒþéƒþâƒþÛƒþÔƒþ̓þƃþ¿ƒþ¸ƒþ±ƒþªƒþ£ƒþœƒþ•ƒþŽƒþ‡ƒþ€ƒþyƒþrƒþkƒþdƒþ]ƒþVƒþOƒþHƒþAƒþ:ƒþ3ƒþ,ƒþ%ƒþƒþƒþƒþ ƒþƒþû‚þô‚þí‚þæ‚þß‚þØ‚þÑ‚þÊ‚þÂþ¼‚þµ‚þ®‚þ§‚þ ‚þ™‚þ’‚þ‹‚þ„‚þ}‚þv‚þo‚þh‚þa‚þZ‚þS‚þL‚þE‚þ>‚þ7‚þ0‚þ)‚þ"‚þ‚þ‚þ ‚þ‚þÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþü€þõ€þî€þç€þà€þÙ€þÒ€þË€þÄ€þ½€þ¶€þ¯€þ¨€þ¡€þš€þ“€þŒ€þ…€þ~€þw€þp€þi€þb€þ[€þT€þM€þF€þ?€þ8€þ1€þ*€þ#€þ€þ€þ€þ€þ€þùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþý~þö~þï~þè~þá~þÚ~þÓ~þÌ~þÅ~þ¾~þ·~þ°~þ©~þ¢~þ›~þ”~þ~þ†~þ~þx~þq~þj~þc~þ\~þU~þN~þG~þ@~þ9~þ2~þ+~þ$~þ~þ~þ~þ~þ~þú}þó}þì}þå}þÞ}þ×}þÐ}þÉ}þÂ}þ»}þ´}þ­}þ¦}þŸ}þ˜}þ‘}þŠ}þƒ}þ|}þu}þn}þg}þ`}þY}þR}þK}þD}þ=}þ6}þ/}þ(}þ!}þ}þ}þ }þ}þþ|þ÷|þð|þé|þâ|þÛ|þÔ|þÍ|þÆ|þ¿|þ¸|þ±|þª|þ£|þœ|þ•|þŽ|þ‡|þ€|þy|þr|þk|þd|þ]|þV|þO|þH|þA|þ:|þ3|þ,|þ%|þ|þ|þ|þ |þ|þû{þô{þí{þæ{þß{þØ{þÑ{þÊ{þÃ{þ¼{þµ{þ®{þ§{þ {þ™{þ’{þ‹{þ„{þ}{þv{þo{þh{þa{þZ{þS{þL{þE{þ>{þ7{þ0{þ){þ"{þ{þ{þ {þ{þÿzþøzþñzþêzþãzþÜzþÕzþÎzþÇzþÀzþ¹zþ²zþ«zþ¤zþzþ–zþzþˆzþzþzzþszþlzþezþ^zþWzþPzþIzþBzþ;zþ4zþ-zþ&zþzþzþzþ zþzþüyþõyþîyþçyþàyþÙyþÒyþËyþÄyþ½yþ¶yþ¯yþ¨yþ¡yþšyþ“yþŒyþ…yþ~yþwyþpyþiyþbyþ[yþTyþMyþFyþ?yþ8yþ1yþ*yþ#yþyþyþyþyþyþùxþòxþëxþäxþÝxþÖxþÏxþÈxþÁxþºxþ³xþ¬xþ¥xþžxþ—xþxþ‰xþ‚xþ{xþtxþmxþfxþ_xþXxþQxþJxþCxþtþ7tþ0tþ)tþ"tþtþtþ tþtþÿsþøsþñsþêsþãsþÜsþÕsþÎsþÇsþÀsþ¹sþ²sþ«sþ¤sþsþ–sþsþˆsþsþzsþssþlsþesþ^sþWsþPsþIsþBsþ;sþ4sþ-sþ&sþsþsþsþ sþsþürþõrþîrþçrþàrþÙrþÒrþËrþÄrþ½rþ¶rþ¯rþ¨rþ¡rþšrþ“rþŒrþ…rþ~rþwrþprþirþbrþ[rþTrþMrþFrþ?rþ8rþ1rþ*rþ#rþrþrþrþrþrþùqþòqþëqþäqþÝqþÖqþÏqþÈqþÁqþºqþ³qþ¬qþ¥qþžqþ—qþqþ‰qþ‚qþ{qþtqþmqþfqþ_qþXqþQqþJqþCqþmþ7mþ0mþ)mþ"mþmþmþ mþmþÿlþølþñlþêlþãlþÜlþÕlþÎlþÇlþÀlþ¹lþ²lþ«lþ¤lþlþ–lþlþˆlþlþzlþslþllþelþ^lþWlþPlþIlþBlþ;lþ4lþ-lþ&lþlþlþlþ lþlþükþõkþîkþçkþàkþÙkþÒkþËkþÄkþ½kþ¶kþ¯kþ¨kþ¡kþškþ“kþŒkþ…kþ~kþwkþpkþikþbkþ[kþTkþMkþFkþ?kþ8kþ1kþ*kþ#kþkþkþkþkþkþùjþòjþëjþäjþÝjþÖjþÏjþÈjþÁjþºjþ³jþ¬jþ¥jþžjþ—jþjþ‰jþ‚jþ{jþtjþmjþfjþ_jþXjþQjþJjþCjþfþ7fþ0fþ)fþ"fþfþfþ fþfþÿeþøeþñeþêeþãeþÜeþÕeþÎeþÇeþÀeþ¹eþ²eþ«eþ¤eþeþ–eþeþˆeþeþzeþseþleþeeþ^eþWeþPeþIeþBeþ;eþ4eþ-eþ&eþeþeþeþ eþeþüdþõdþîdþçdþàdþÙdþÒdþËdþÄdþ½dþ¶dþ¯dþ¨dþ¡dþšdþ“dþŒdþ…dþ~dþwdþpdþidþbdþ[dþTdþMdþFdþ?dþ8dþ1dþ*dþ#dþdþdþdþdþdþùcþòcþëcþäcþÝcþÖcþÏcþÈcþÁcþºcþ³cþ¬cþ¥cþžcþ—cþcþ‰cþ‚cþ{cþtcþmcþfcþ_cþXcþQcþJcþCcþ_þ7_þ0_þ)_þ"_þ_þ_þ _þ_þÿ^þø^þñ^þê^þã^þÜ^þÕ^þÎ^þÇ^þÀ^þ¹^þ²^þ«^þ¤^þ^þ–^þ^þˆ^þ^þz^þs^þl^þe^þ^^þW^þP^þI^þB^þ;^þ4^þ-^þ&^þ^þ^þ^þ ^þ^þü]þõ]þî]þç]þà]þÙ]þÒ]þË]þÄ]þ½]þ¶]þ¯]þ¨]þ¡]þš]þ“]þŒ]þ…]þ~]þw]þp]þi]þb]þ[]þT]þM]þF]þ?]þ8]þ1]þ*]þ#]þ]þ]þ]þ]þ]þù\þò\þë\þä\þÝ\þÖ\þÏ\þÈ\þÁ\þº\þ³\þ¬\þ¥\þž\þ—\þ\þ‰\þ‚\þ{\þt\þm\þf\þ_\þX\þQ\þJ\þC\þ<\þ5\þ.\þ'\þ \þ\þ\þ \þ\þý[þö[þï[þè[þá[þÚ[þÓ[þÌ[þÅ[þ¾[þ·[þ°[þ©[þ¢[þ›[þ”[þ[þ†[þ[þx[þq[þj[þc[þ\[þU[þN[þG[þ@[þ9[þ2[þ+[þ$[þ[þ[þ[þ[þ[þúZþóZþìZþåZþÞZþ×ZþÐZþÉZþÂZþ»Zþ´Zþ­Zþ¦ZþŸZþ˜Zþ‘ZþŠZþƒZþ|ZþuZþnZþgZþ`ZþYZþRZþKZþDZþ=Zþ6Zþ/Zþ(Zþ!ZþZþZþ ZþZþþYþ÷YþðYþéYþâYþÛYþÔYþÍYþÆYþ¿Yþ¸Yþ±YþªYþ£YþœYþ•YþŽYþ‡Yþ€YþyYþrYþkYþdYþ]YþVYþOYþHYþAYþ:Yþ3Yþ,Yþ%YþYþYþYþ YþYþûXþôXþíXþæXþßXþØXþÑXþÊXþÃXþ¼XþµXþ®Xþ§Xþ Xþ™Xþ’Xþ‹Xþ„Xþ}XþvXþoXþhXþaXþZXþSXþLXþEXþ>Xþ7Xþ0Xþ)Xþ"XþXþXþ XþXþÿWþøWþñWþêWþãWþÜWþÕWþÎWþÇWþÀWþ¹Wþ²Wþ«Wþ¤WþWþ–WþWþˆWþWþzWþsWþlWþeWþ^WþWWþPWþIWþBWþ;Wþ4Wþ-Wþ&WþWþWþWþ WþWþüVþõVþîVþçVþàVþÙVþÒVþËVþÄVþ½Vþ¶Vþ¯Vþ¨Vþ¡VþšVþ“VþŒVþ…Vþ~VþwVþpVþiVþbVþ[VþTVþMVþFVþ?Vþ8Vþ1Vþ*Vþ#VþVþVþVþVþVþùUþòUþëUþäUþÝUþÖUþÏUþÈUþÁUþºUþ³Uþ¬Uþ¥UþžUþ—UþUþ‰Uþ‚Uþ{UþtUþmUþfUþ_UþXUþQUþJUþCUþQþ7Qþ0Qþ)Qþ"QþQþQþ QþQþÿPþøPþñPþêPþãPþÜPþÕPþÎPþÇPþÀPþ¹Pþ²Pþ«Pþ¤PþPþ–PþPþˆPþPþzPþsPþlPþePþ^PþWPþPPþIPþBPþ;Pþ4Pþ-Pþ&PþPþPþPþ PþPþüOþõOþîOþçOþàOþÙOþÒOþËOþÄOþ½Oþ¶Oþ¯Oþ¨Oþ¡OþšOþ“OþŒOþ…Oþ~OþwOþpOþiOþbOþ[OþTOþMOþFOþ?Oþ8Oþ1Oþ*Oþ#OþOþOþOþOþOþùNþòNþëNþäNþÝNþÖNþÏNþÈNþÁNþºNþ³Nþ¬Nþ¥NþžNþ—NþNþ‰Nþ‚Nþ{NþtNþmNþfNþ_NþXNþQNþJNþCNþJþ7Jþ0Jþ)Jþ"JþJþJþ JþJþÿIþøIþñIþêIþãIþÜIþÕIþÎIþÇIþÀIþ¹Iþ²Iþ«Iþ¤IþIþ–IþIþˆIþIþzIþsIþlIþeIþ^IþWIþPIþIIþBIþ;Iþ4Iþ-Iþ&IþIþIþIþ IþIþüHþõHþîHþçHþàHþÙHþÒHþËHþÄHþ½Hþ¶Hþ¯Hþ¨Hþ¡HþšHþ“HþŒHþ…Hþ~HþwHþpHþiHþbHþ[HþTHþMHþFHþ?Hþ8Hþ1Hþ*Hþ#HþHþHþHþHþHþùGþòGþëGþäGþÝGþÖGþÏGþÈGþÁGþºGþ³Gþ¬Gþ¥GþžGþ—GþGþ‰Gþ‚Gþ{GþtGþmGþfGþ_GþXGþQGþJGþCGþCþ7Cþ0Cþ)Cþ"CþCþCþ CþCþÿBþøBþñBþêBþãBþÜBþÕBþÎBþÇBþÀBþ¹Bþ²Bþ«Bþ¤BþBþ–BþBþˆBþBþzBþsBþlBþeBþ^BþWBþPBþIBþBBþ;Bþ4Bþ-Bþ&BþBþBþBþ BþBþüAþõAþîAþçAþàAþÙAþÒAþËAþÄAþ½Aþ¶Aþ¯Aþ¨Aþ¡AþšAþ“AþŒAþ…Aþ~AþwAþpAþiAþbAþ[AþTAþMAþFAþ?Aþ8Aþ1Aþ*Aþ#AþAþAþAþAþAþù@þò@þë@þä@þÝ@þÖ@þÏ@þÈ@þÁ@þº@þ³@þ¬@þ¥@þž@þ—@þ@þ‰@þ‚@þ{@þt@þm@þf@þ_@þX@þQ@þJ@þC@þ<@þ5@þ.@þ'@þ @þ@þ@þ @þ@þý?þö?þï?þè?þá?þÚ?þÓ?þÌ?þÅ?þ¾?þ·?þ°?þ©?þ¢?þ›?þ”?þ?þ†?þ?þx?þq?þj?þc?þ\?þU?þN?þG?þ@?þ9?þ2?þ+?þ$?þ?þ?þ?þ?þ?þú>þó>þì>þå>þÞ>þ×>þÐ>þÉ>þÂ>þ»>þ´>þ­>þ¦>þŸ>þ˜>þ‘>þŠ>þƒ>þ|>þu>þn>þg>þ`>þY>þR>þK>þD>þ=>þ6>þ/>þ(>þ!>þ>þ>þ >þ>þþ=þ÷=þð=þé=þâ=þÛ=þÔ=þÍ=þÆ=þ¿=þ¸=þ±=þª=þ£=þœ=þ•=þŽ=þ‡=þ€=þy=þr=þk=þd=þ]=þV=þO=þH=þA=þ:=þ3=þ,=þ%=þ=þ=þ=þ =þ=þû<þô<þí<þæ<þß<þØ<þÑ<þÊ<þÃ<þ¼<þµ<þ®<þ§<þ <þ™<þ’<þ‹<þ„<þ}<þv<þo<þh<þa<þZ<þS<þL<þE<þ><þ7<þ0<þ)<þ"<þ<þ<þ <þ<þÿ;þø;þñ;þê;þã;þÜ;þÕ;þÎ;þÇ;þÀ;þ¹;þ²;þ«;þ¤;þ;þ–;þ;þˆ;þ;þz;þs;þl;þe;þ^;þW;þP;þI;þB;þ;;þ4;þ-;þ&;þ;þ;þ;þ ;þ;þü:þõ:þî:þç:þà:þÙ:þÒ:þË:þÄ:þ½:þ¶:þ¯:þ¨:þ¡:þš:þ“:þŒ:þ…:þ~:þw:þp:þi:þb:þ[:þT:þM:þF:þ?:þ8:þ1:þ*:þ#:þ:þ:þ:þ:þ:þù9þò9þë9þä9þÝ9þÖ9þÏ9þÈ9þÁ9þº9þ³9þ¬9þ¥9þž9þ—9þ9þ‰9þ‚9þ{9þt9þm9þf9þ_9þX9þQ9þJ9þC9þ<9þ59þ.9þ'9þ 9þ9þ9þ 9þ9þý8þö8þï8þè8þá8þÚ8þÓ8þÌ8þÅ8þ¾8þ·8þ°8þ©8þ¢8þ›8þ”8þ8þ†8þ8þx8þq8þj8þc8þ\8þU8þN8þG8þ@8þ98þ28þ+8þ$8þ8þ8þ8þ8þ8þú7þó7þì7þå7þÞ7þ×7þÐ7þÉ7þÂ7þ»7þ´7þ­7þ¦7þŸ7þ˜7þ‘7þŠ7þƒ7þ|7þu7þn7þg7þ`7þY7þR7þK7þD7þ=7þ67þ/7þ(7þ!7þ7þ7þ 7þ7þþ6þ÷6þð6þé6þâ6þÛ6þÔ6þÍ6þÆ6þ¿6þ¸6þ±6þª6þ£6þœ6þ•6þŽ6þ‡6þ€6þy6þr6þk6þd6þ]6þV6þO6þH6þA6þ:6þ36þ,6þ%6þ6þ6þ6þ 6þ6þû5þô5þí5þæ5þß5þØ5þÑ5þÊ5þÃ5þ¼5þµ5þ®5þ§5þ 5þ™5þ’5þ‹5þ„5þ}5þv5þo5þh5þa5þZ5þS5þL5þE5þ>5þ75þ05þ)5þ"5þ5þ5þ 5þ5þÿ4þø4þñ4þê4þã4þÜ4þÕ4þÎ4þÇ4þÀ4þ¹4þ²4þ«4þ¤4þ4þ–4þ4þˆ4þ4þz4þs4þl4þe4þ^4þW4þP4þI4þB4þ;4þ44þ-4þ&4þ4þ4þ4þ 4þ4þü3þõ3þî3þç3þà3þÙ3þÒ3þË3þÄ3þ½3þ¶3þ¯3þ¨3þ¡3þš3þ“3þŒ3þ…3þ~3þw3þp3þi3þb3þ[3þT3þM3þF3þ?3þ83þ13þ*3þ#3þ3þ3þ3þ3þ3þù2þò2þë2þä2þÝ2þÖ2þÏ2þÈ2þÁ2þº2þ³2þ¬2þ¥2þž2þ—2þ2þ‰2þ‚2þ{2þt2þm2þf2þ_2þX2þQ2þJ2þC2þ<2þ52þ.2þ'2þ 2þ2þ2þ 2þ2þý1þö1þï1þè1þá1þÚ1þÓ1þÌ1þÅ1þ¾1þ·1þ°1þ©1þ¢1þ›1þ”1þ1þ†1þ1þx1þq1þj1þc1þ\1þU1þN1þG1þ@1þ91þ21þ+1þ$1þ1þ1þ1þ1þ1þú0þó0þì0þå0þÞ0þ×0þÐ0þÉ0þÂ0þ»0þ´0þ­0þ¦0þŸ0þ˜0þ‘0þŠ0þƒ0þ|0þu0þn0þg0þ`0þY0þR0þK0þD0þ=0þ60þ/0þ(0þ!0þ0þ0þ 0þ0þþ/þ÷/þð/þé/þâ/þÛ/þÔ/þÍ/þÆ/þ¿/þ¸/þ±/þª/þ£/þœ/þ•/þŽ/þ‡/þ€/þy/þr/þk/þd/þ]/þV/þO/þH/þA/þ:/þ3/þ,/þ%/þ/þ/þ/þ /þ/þû.þô.þí.þæ.þß.þØ.þÑ.þÊ.þÃ.þ¼.þµ.þ®.þ§.þ .þ™.þ’.þ‹.þ„.þ}.þv.þo.þh.þa.þZ.þS.þL.þE.þ>.þ7.þ0.þ).þ".þ.þ.þ .þ.þÿ-þø-þñ-þê-þã-þÜ-þÕ-þÎ-þÇ-þÀ-þ¹-þ²-þ«-þ¤-þ-þ–-þ-þˆ-þ-þz-þs-þl-þe-þ^-þW-þP-þI-þB-þ;-þ4-þ--þ&-þ-þ-þ-þ -þ-þü,þõ,þî,þç,þà,þÙ,þÒ,þË,þÄ,þ½,þ¶,þ¯,þ¨,þ¡,þš,þ“,þŒ,þ…,þ~,þw,þp,þi,þb,þ[,þT,þM,þF,þ?,þ8,þ1,þ*,þ#,þ,þ,þ,þ,þ,þù+þò+þë+þä+þÝ+þÖ+þÏ+þÈ+þÁ+þº+þ³+þ¬+þ¥+þž+þ—+þ+þ‰+þ‚+þ{+þt+þm+þf+þ_+þX+þQ+þJ+þC+þ<+þ5+þ.+þ'+þ +þ+þ+þ +þ+þý*þö*þï*þè*þá*þÚ*þÓ*þÌ*þÅ*þ¾*þ·*þ°*þ©*þ¢*þ›*þ”*þ*þ†*þ*þx*þq*þj*þc*þ\*þU*þN*þG*þ@*þ9*þ2*þ+*þ$*þ*þ*þ*þ*þ*þú)þó)þì)þå)þÞ)þ×)þÐ)þÉ)þÂ)þ»)þ´)þ­)þ¦)þŸ)þ˜)þ‘)þŠ)þƒ)þ|)þu)þn)þg)þ`)þY)þR)þK)þD)þ=)þ6)þ/)þ()þ!)þ)þ)þ )þ)þþ(þ÷(þð(þé(þâ(þÛ(þÔ(þÍ(þÆ(þ¿(þ¸(þ±(þª(þ£(þœ(þ•(þŽ(þ‡(þ€(þy(þr(þk(þd(þ](þV(þO(þH(þA(þ:(þ3(þ,(þ%(þ(þ(þ(þ (þ(þû'þô'þí'þæ'þß'þØ'þÑ'þÊ'þÃ'þ¼'þµ'þ®'þ§'þ 'þ™'þ’'þ‹'þ„'þ}'þv'þo'þh'þa'þZ'þS'þL'þE'þ>'þ7'þ0'þ)'þ"'þ'þ'þ 'þ'þÿ&þø&þñ&þê&þã&þÜ&þÕ&þÎ&þÇ&þÀ&þ¹&þ²&þ«&þ¤&þ&þ–&þ&þˆ&þ&þz&þs&þl&þe&þ^&þW&þP&þI&þB&þ;&þ4&þ-&þ&&þ&þ&þ&þ &þ&þü%þõ%þî%þç%þà%þÙ%þÒ%þË%þÄ%þ½%þ¶%þ¯%þ¨%þ¡%þš%þ“%þŒ%þ…%þ~%þw%þp%þi%þb%þ[%þT%þM%þF%þ?%þ8%þ1%þ*%þ#%þ%þ%þ%þ%þ%þù$þò$þë$þä$þÝ$þÖ$þÏ$þÈ$þÁ$þº$þ³$þ¬$þ¥$þž$þ—$þ$þ‰$þ‚$þ{$þt$þm$þf$þ_$þX$þQ$þJ$þC$þ<$þ5$þ.$þ'$þ $þ$þ$þ $þ$þý#þö#þï#þè#þá#þÚ#þÓ#þÌ#þÅ#þ¾#þ·#þ°#þ©#þ¢#þ›#þ”#þ#þ†#þ#þx#þq#þj#þc#þ\#þU#þN#þG#þ@#þ9#þ2#þ+#þ$#þ#þ#þ#þ#þ#þú"þó"þì"þå"þÞ"þ×"þÐ"þÉ"þÂ"þ»"þ´"þ­"þ¦"þŸ"þ˜"þ‘"þŠ"þƒ"þ|"þu"þn"þg"þ`"þY"þR"þK"þD"þ="þ6"þ/"þ("þ!"þ"þ"þ "þ"þþ!þ÷!þð!þé!þâ!þÛ!þÔ!þÍ!þÆ!þ¿!þ¸!þ±!þª!þ£!þœ!þ•!þŽ!þ‡!þ€!þy!þr!þk!þd!þ]!þV!þO!þH!þA!þ:!þ3!þ,!þ%!þ!þ!þ!þ !þ!þû þô þí þæ þß þØ þÑ þÊ þà þ¼ þµ þ® þ§ þ  þ™ þ’ þ‹ þ„ þ} þv þo þh þa þZ þS þL þE þ> þ7 þ0 þ) þ" þ þ þ þ þÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþú þó þì þå þÞ þ× þÐ þÉ þ þ» þ´ þ­ þ¦ þŸ þ˜ þ‘ þŠ þƒ þ| þu þn þg þ` þY þR þK þD þ= þ6 þ/ þ( þ! þ þ þ þ þþ þ÷ þð þé þâ þÛ þÔ þÍ þÆ þ¿ þ¸ þ± þª þ£ þœ þ• þŽ þ‡ þ€ þy þr þk þd þ] þV þO þH þA þ: þ3 þ, þ% þ þ þ þ þ þû þô þí þæ þß þØ þÑ þÊ þà þ¼ þµ þ® þ§ þ  þ™ þ’ þ‹ þ„ þ} þv þo þh þa þZ þS þL þE þ> þ7 þ0 þ) þ" þ þ þ þ þÿ þø þñ þê þã þÜ þÕ þÎ þÇ þÀ þ¹ þ² þ« þ¤ þ þ– þ þˆ þ þz þs þl þe þ^ þW þP þI þB þ; þ4 þ- þ& þ þ þ þ þ þü þõ þî þç þà þÙ þÒ þË þÄ þ½ þ¶ þ¯ þ¨ þ¡ þš þ“ þŒ þ… þ~ þw þp þi þb þ[ þT þM þF þ? þ8 þ1 þ* þ# þ þ þ þ þ þùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúÿýóÿýìÿýåÿýÞÿý×ÿýÐÿýÉÿýÂÿý»ÿý´ÿý­ÿý¦ÿýŸÿý˜ÿý‘ÿýŠÿýƒÿý|ÿýuÿýnÿýgÿý`ÿýYÿýRÿýKÿýDÿý=ÿý6ÿý/ÿý(ÿý!ÿýÿýÿý ÿýÿýþþý÷þýðþýéþýâþýÛþýÔþýÍþýÆþý¿þý¸þý±þýªþý£þýœþý•þýŽþý‡þý€þýyþýrþýkþýdþý]þýVþýOþýHþýAþý:þý3þý,þý%þýþýþýþý þýþýûýýôýýíýýæýýßýýØýýÑýýÊýýÃýý¼ýýµýý®ýý§ýý ýý™ýý’ýý‹ýý„ýý}ýývýýoýýhýýaýýZýýSýýLýýEýý>ýý7ýý0ýý)ýý"ýýýýýý ýýýýÿüýøüýñüýêüýãüýÜüýÕüýÎüýÇüýÀüý¹üý²üý«üý¤üýüý–üýüýˆüýüýzüýsüýlüýeüý^üýWüýPüýIüýBüý;üý4üý-üý&üýüýüýüý üýüýüûýõûýîûýçûýàûýÙûýÒûýËûýÄûý½ûý¶ûý¯ûý¨ûý¡ûýšûý“ûýŒûý…ûý~ûýwûýpûýiûýbûý[ûýTûýMûýFûý?ûý8ûý1ûý*ûý#ûýûýûýûýûýûýùúýòúýëúýäúýÝúýÖúýÏúýÈúýÁúýºúý³úý¬úý¥úýžúý—úýúý‰úý‚úý{úýtúýmúýfúý_úýXúýQúýJúýCúý<úý5úý.úý'úý úýúýúý úýúýýùýöùýïùýèùýáùýÚùýÓùýÌùýÅùý¾ùý·ùý°ùý©ùý¢ùý›ùý”ùýùý†ùýùýxùýqùýjùýcùý\ùýUùýNùýGùý@ùý9ùý2ùý+ùý$ùýùýùýùýùýùýúøýóøýìøýåøýÞøý×øýÐøýÉøýÂøý»øý´øý­øý¦øýŸøý˜øý‘øýŠøýƒøý|øýuøýnøýgøý`øýYøýRøýKøýDøý=øý6øý/øý(øý!øýøýøý øýøýþ÷ý÷÷ýð÷ýé÷ýâ÷ýÛ÷ýÔ÷ýÍ÷ýÆ÷ý¿÷ý¸÷ý±÷ýª÷ý£÷ýœ÷ý•÷ýŽ÷ý‡÷ý€÷ýy÷ýr÷ýk÷ýd÷ý]÷ýV÷ýO÷ýH÷ýA÷ý:÷ý3÷ý,÷ý%÷ý÷ý÷ý÷ý ÷ý÷ýûöýôöýíöýæöýßöýØöýÑöýÊöýÃöý¼öýµöý®öý§öý öý™öý’öý‹öý„öý}öývöýoöýhöýaöýZöýSöýLöýEöý>öý7öý0öý)öý"öýöýöý öýöýÿõýøõýñõýêõýãõýÜõýÕõýÎõýÇõýÀõý¹õý²õý«õý¤õýõý–õýõýˆõýõýzõýsõýlõýeõý^õýWõýPõýIõýBõý;õý4õý-õý&õýõýõýõý õýõýüôýõôýîôýçôýàôýÙôýÒôýËôýÄôý½ôý¶ôý¯ôý¨ôý¡ôýšôý“ôýŒôý…ôý~ôýwôýpôýiôýbôý[ôýTôýMôýFôý?ôý8ôý1ôý*ôý#ôýôýôýôýôýôýùóýòóýëóýäóýÝóýÖóýÏóýÈóýÁóýºóý³óý¬óý¥óýžóý—óýóý‰óý‚óý{óýtóýmóýfóý_óýXóýQóýJóýCóý<óý5óý.óý'óý óýóýóý óýóýýòýöòýïòýèòýáòýÚòýÓòýÌòýÅòý¾òý·òý°òý©òý¢òý›òý”òýòý†òýòýxòýqòýjòýcòý\òýUòýNòýGòý@òý9òý2òý+òý$òýòýòýòýòýòýúñýóñýìñýåñýÞñý×ñýÐñýÉñýÂñý»ñý´ñý­ñý¦ñýŸñý˜ñý‘ñýŠñýƒñý|ñýuñýnñýgñý`ñýYñýRñýKñýDñý=ñý6ñý/ñý(ñý!ñýñýñý ñýñýþðý÷ðýððýéðýâðýÛðýÔðýÍðýÆðý¿ðý¸ðý±ðýªðý£ðýœðý•ðýŽðý‡ðý€ðýyðýrðýkðýdðý]ðýVðýOðýHðýAðý:ðý3ðý,ðý%ðýðýðýðý ðýðýûïýôïýíïýæïýßïýØïýÑïýÊïýÃïý¼ïýµïý®ïý§ïý ïý™ïý’ïý‹ïý„ïý}ïývïýoïýhïýaïýZïýSïýLïýEïý>ïý7ïý0ïý)ïý"ïýïýïý ïýïýÿîýøîýñîýêîýãîýÜîýÕîýÎîýÇîýÀîý¹îý²îý«îý¤îýîý–îýîýˆîýîýzîýsîýlîýeîý^îýWîýPîýIîýBîý;îý4îý-îý&îýîýîýîý îýîýüíýõíýîíýçíýàíýÙíýÒíýËíýÄíý½íý¶íý¯íý¨íý¡íýšíý“íýŒíý…íý~íýwíýpíýiíýbíý[íýTíýMíýFíý?íý8íý1íý*íý#íýíýíýíýíýíýùìýòìýëìýäìýÝìýÖìýÏìýÈìýÁìýºìý³ìý¬ìý¥ìýžìý—ìýìý‰ìý‚ìý{ìýtìýmìýfìý_ìýXìýQìýJìýCìý<ìý5ìý.ìý'ìý ìýìýìý ìýìýýëýöëýïëýèëýáëýÚëýÓëýÌëýÅëý¾ëý·ëý°ëý©ëý¢ëý›ëý”ëýëý†ëýëýxëýqëýjëýcëý\ëýUëýNëýGëý@ëý9ëý2ëý+ëý$ëýëýëýëýëýëýúêýóêýìêýåêýÞêý×êýÐêýÉêýÂêý»êý´êý­êý¦êýŸêý˜êý‘êýŠêýƒêý|êýuêýnêýgêý`êýYêýRêýKêýDêý=êý6êý/êý(êý!êýêýêý êýêýþéý÷éýðéýééýâéýÛéýÔéýÍéýÆéý¿éý¸éý±éýªéý£éýœéý•éýŽéý‡éý€éýyéýréýkéýdéý]éýVéýOéýHéýAéý:éý3éý,éý%éýéýéýéý éýéýûèýôèýíèýæèýßèýØèýÑèýÊèýÃèý¼èýµèý®èý§èý èý™èý’èý‹èý„èý}èývèýoèýhèýaèýZèýSèýLèýEèý>èý7èý0èý)èý"èýèýèý èýèýÿçýøçýñçýêçýãçýÜçýÕçýÎçýÇçýÀçý¹çý²çý«çý¤çýçý–çýçýˆçýçýzçýsçýlçýeçý^çýWçýPçýIçýBçý;çý4çý-çý&çýçýçýçý çýçýüæýõæýîæýçæýàæýÙæýÒæýËæýÄæý½æý¶æý¯æý¨æý¡æýšæý“æýŒæý…æý~æýwæýpæýiæýbæý[æýTæýMæýFæý?æý8æý1æý*æý#æýæýæýæýæýæýùåýòåýëåýäåýÝåýÖåýÏåýÈåýÁåýºåý³åý¬åý¥åýžåý—åýåý‰åý‚åý{åýtåýmåýfåý_åýXåýQåýJåýCåý<åý5åý.åý'åý åýåýåý åýåýýäýöäýïäýèäýáäýÚäýÓäýÌäýÅäý¾äý·äý°äý©äý¢äý›äý”äýäý†äýäýxäýqäýjäýcäý\äýUäýNäýGäý@äý9äý2äý+äý$äýäýäýäýäýäýúãýóãýìãýåãýÞãý×ãýÐãýÉãýÂãý»ãý´ãý­ãý¦ãýŸãý˜ãý‘ãýŠãýƒãý|ãýuãýnãýgãý`ãýYãýRãýKãýDãý=ãý6ãý/ãý(ãý!ãýãýãý ãýãýþâý÷âýðâýéâýââýÛâýÔâýÍâýÆâý¿âý¸âý±âýªâý£âýœâý•âýŽâý‡âý€âýyâýrâýkâýdâý]âýVâýOâýHâýAâý:âý3âý,âý%âýâýâýâý âýâýûáýôáýíáýæáýßáýØáýÑáýÊáýÃáý¼áýµáý®áý§áý áý™áý’áý‹áý„áý}áýváýoáýháýaáýZáýSáýLáýEáý>áý7áý0áý)áý"áýáýáý áýáýÿàýøàýñàýêàýãàýÜàýÕàýÎàýÇàýÀàý¹àý²àý«àý¤àýàý–àýàýˆàýàýzàýsàýlàýeàý^àýWàýPàýIàýBàý;àý4àý-àý&àýàýàýàý àýàýüßýõßýîßýçßýàßýÙßýÒßýËßýÄßý½ßý¶ßý¯ßý¨ßý¡ßýšßý“ßýŒßý…ßý~ßýwßýpßýißýbßý[ßýTßýMßýFßý?ßý8ßý1ßý*ßý#ßýßýßýßýßýßýùÞýòÞýëÞýäÞýÝÞýÖÞýÏÞýÈÞýÁÞýºÞý³Þý¬Þý¥ÞýžÞý—ÞýÞý‰Þý‚Þý{ÞýtÞýmÞýfÞý_ÞýXÞýQÞýJÞýCÞý<Þý5Þý.Þý'Þý ÞýÞýÞý ÞýÞýýÝýöÝýïÝýèÝýáÝýÚÝýÓÝýÌÝýÅÝý¾Ýý·Ýý°Ýý©Ýý¢Ýý›Ýý”ÝýÝý†ÝýÝýxÝýqÝýjÝýcÝý\ÝýUÝýNÝýGÝý@Ýý9Ýý2Ýý+Ýý$ÝýÝýÝýÝýÝýÝýúÜýóÜýìÜýåÜýÞÜý×ÜýÐÜýÉÜýÂÜý»Üý´Üý­Üý¦ÜýŸÜý˜Üý‘ÜýŠÜýƒÜý|ÜýuÜýnÜýgÜý`ÜýYÜýRÜýKÜýDÜý=Üý6Üý/Üý(Üý!ÜýÜýÜý ÜýÜýþÛý÷ÛýðÛýéÛýâÛýÛÛýÔÛýÍÛýÆÛý¿Ûý¸Ûý±ÛýªÛý£ÛýœÛý•ÛýŽÛý‡Ûý€ÛýyÛýrÛýkÛýdÛý]ÛýVÛýOÛýHÛýAÛý:Ûý3Ûý,Ûý%ÛýÛýÛýÛý ÛýÛýûÚýôÚýíÚýæÚýßÚýØÚýÑÚýÊÚýÃÚý¼ÚýµÚý®Úý§Úý Úý™Úý’Úý‹Úý„Úý}ÚývÚýoÚýhÚýaÚýZÚýSÚýLÚýEÚý>Úý7Úý0Úý)Úý"ÚýÚýÚý ÚýÚýÿÙýøÙýñÙýêÙýãÙýÜÙýÕÙýÎÙýÇÙýÀÙý¹Ùý²Ùý«Ùý¤ÙýÙý–ÙýÙýˆÙýÙýzÙýsÙýlÙýeÙý^ÙýWÙýPÙýIÙýBÙý;Ùý4Ùý-Ùý&ÙýÙýÙýÙý ÙýÙýüØýõØýîØýçØýàØýÙØýÒØýËØýÄØý½Øý¶Øý¯Øý¨Øý¡ØýšØý“ØýŒØý…Øý~ØýwØýpØýiØýbØý[ØýTØýMØýFØý?Øý8Øý1Øý*Øý#ØýØýØýØýØýØýù×ýò×ýë×ýä×ýÝ×ýÖ×ýÏ×ýÈ×ýÁ×ýº×ý³×ý¬×ý¥×ýž×ý—×ý×ý‰×ý‚×ý{×ýt×ým×ýf×ý_×ýX×ýQ×ýJ×ýC×ý<×ý5×ý.×ý'×ý ×ý×ý×ý ×ý×ýýÖýöÖýïÖýèÖýáÖýÚÖýÓÖýÌÖýÅÖý¾Öý·Öý°Öý©Öý¢Öý›Öý”ÖýÖý†ÖýÖýxÖýqÖýjÖýcÖý\ÖýUÖýNÖýGÖý@Öý9Öý2Öý+Öý$ÖýÖýÖýÖýÖýÖýúÕýóÕýìÕýåÕýÞÕý×ÕýÐÕýÉÕýÂÕý»Õý´Õý­Õý¦ÕýŸÕý˜Õý‘ÕýŠÕýƒÕý|ÕýuÕýnÕýgÕý`ÕýYÕýRÕýKÕýDÕý=Õý6Õý/Õý(Õý!ÕýÕýÕý ÕýÕýþÔý÷ÔýðÔýéÔýâÔýÛÔýÔÔýÍÔýÆÔý¿Ôý¸Ôý±ÔýªÔý£ÔýœÔý•ÔýŽÔý‡Ôý€ÔýyÔýrÔýkÔýdÔý]ÔýVÔýOÔýHÔýAÔý:Ôý3Ôý,Ôý%ÔýÔýÔýÔý ÔýÔýûÓýôÓýíÓýæÓýßÓýØÓýÑÓýÊÓýÃÓý¼ÓýµÓý®Óý§Óý Óý™Óý’Óý‹Óý„Óý}ÓývÓýoÓýhÓýaÓýZÓýSÓýLÓýEÓý>Óý7Óý0Óý)Óý"ÓýÓýÓý ÓýÓýÿÒýøÒýñÒýêÒýãÒýÜÒýÕÒýÎÒýÇÒýÀÒý¹Òý²Òý«Òý¤ÒýÒý–ÒýÒýˆÒýÒýzÒýsÒýlÒýeÒý^ÒýWÒýPÒýIÒýBÒý;Òý4Òý-Òý&ÒýÒýÒýÒý ÒýÒýüÑýõÑýîÑýçÑýàÑýÙÑýÒÑýËÑýÄÑý½Ñý¶Ñý¯Ñý¨Ñý¡ÑýšÑý“ÑýŒÑý…Ñý~ÑýwÑýpÑýiÑýbÑý[ÑýTÑýMÑýFÑý?Ñý8Ñý1Ñý*Ñý#ÑýÑýÑýÑýÑýÑýùÐýòÐýëÐýäÐýÝÐýÖÐýÏÐýÈÐýÁÐýºÐý³Ðý¬Ðý¥ÐýžÐý—ÐýÐý‰Ðý‚Ðý{ÐýtÐýmÐýfÐý_ÐýXÐýQÐýJÐýCÐý<Ðý5Ðý.Ðý'Ðý ÐýÐýÐý ÐýÐýýÏýöÏýïÏýèÏýáÏýÚÏýÓÏýÌÏýÅÏý¾Ïý·Ïý°Ïý©Ïý¢Ïý›Ïý”ÏýÏý†ÏýÏýxÏýqÏýjÏýcÏý\ÏýUÏýNÏýGÏý@Ïý9Ïý2Ïý+Ïý$ÏýÏýÏýÏýÏýÏýúÎýóÎýìÎýåÎýÞÎý×ÎýÐÎýÉÎýÂÎý»Îý´Îý­Îý¦ÎýŸÎý˜Îý‘ÎýŠÎýƒÎý|ÎýuÎýnÎýgÎý`ÎýYÎýRÎýKÎýDÎý=Îý6Îý/Îý(Îý!ÎýÎýÎý ÎýÎýþÍý÷ÍýðÍýéÍýâÍýÛÍýÔÍýÍÍýÆÍý¿Íý¸Íý±ÍýªÍý£ÍýœÍý•ÍýŽÍý‡Íý€ÍýyÍýrÍýkÍýdÍý]ÍýVÍýOÍýHÍýAÍý:Íý3Íý,Íý%ÍýÍýÍýÍý ÍýÍýûÌýôÌýíÌýæÌýßÌýØÌýÑÌýÊÌýÃÌý¼ÌýµÌý®Ìý§Ìý Ìý™Ìý’Ìý‹Ìý„Ìý}ÌývÌýoÌýhÌýaÌýZÌýSÌýLÌýEÌý>Ìý7Ìý0Ìý)Ìý"ÌýÌýÌý ÌýÌýÿËýøËýñËýêËýãËýÜËýÕËýÎËýÇËýÀËý¹Ëý²Ëý«Ëý¤ËýËý–ËýËýˆËýËýzËýsËýlËýeËý^ËýWËýPËýIËýBËý;Ëý4Ëý-Ëý&ËýËýËýËý ËýËýüÊýõÊýîÊýçÊýàÊýÙÊýÒÊýËÊýÄÊý½Êý¶Êý¯Êý¨Êý¡ÊýšÊý“ÊýŒÊý…Êý~ÊýwÊýpÊýiÊýbÊý[ÊýTÊýMÊýFÊý?Êý8Êý1Êý*Êý#ÊýÊýÊýÊýÊýÊýùÉýòÉýëÉýäÉýÝÉýÖÉýÏÉýÈÉýÁÉýºÉý³Éý¬Éý¥ÉýžÉý—ÉýÉý‰Éý‚Éý{ÉýtÉýmÉýfÉý_ÉýXÉýQÉýJÉýCÉý<Éý5Éý.Éý'Éý ÉýÉýÉý ÉýÉýýÈýöÈýïÈýèÈýáÈýÚÈýÓÈýÌÈýÅÈý¾Èý·Èý°Èý©Èý¢Èý›Èý”ÈýÈý†ÈýÈýxÈýqÈýjÈýcÈý\ÈýUÈýNÈýGÈý@Èý9Èý2Èý+Èý$ÈýÈýÈýÈýÈýÈýúÇýóÇýìÇýåÇýÞÇý×ÇýÐÇýÉÇýÂÇý»Çý´Çý­Çý¦ÇýŸÇý˜Çý‘ÇýŠÇýƒÇý|ÇýuÇýnÇýgÇý`ÇýYÇýRÇýKÇýDÇý=Çý6Çý/Çý(Çý!ÇýÇýÇý ÇýÇýþÆý÷ÆýðÆýéÆýâÆýÛÆýÔÆýÍÆýÆÆý¿Æý¸Æý±ÆýªÆý£ÆýœÆý•ÆýŽÆý‡Æý€ÆýyÆýrÆýkÆýdÆý]ÆýVÆýOÆýHÆýAÆý:Æý3Æý,Æý%ÆýÆýÆýÆý ÆýÆýûÅýôÅýíÅýæÅýßÅýØÅýÑÅýÊÅýÃÅý¼ÅýµÅý®Åý§Åý Åý™Åý’Åý‹Åý„Åý}ÅývÅýoÅýhÅýaÅýZÅýSÅýLÅýEÅý>Åý7Åý0Åý)Åý"ÅýÅýÅý ÅýÅýÿÄýøÄýñÄýêÄýãÄýÜÄýÕÄýÎÄýÇÄýÀÄý¹Äý²Äý«Äý¤ÄýÄý–ÄýÄýˆÄýÄýzÄýsÄýlÄýeÄý^ÄýWÄýPÄýIÄýBÄý;Äý4Äý-Äý&ÄýÄýÄýÄý ÄýÄýüÃýõÃýîÃýçÃýàÃýÙÃýÒÃýËÃýÄÃý½Ãý¶Ãý¯Ãý¨Ãý¡ÃýšÃý“ÃýŒÃý…Ãý~ÃýwÃýpÃýiÃýbÃý[ÃýTÃýMÃýFÃý?Ãý8Ãý1Ãý*Ãý#ÃýÃýÃýÃýÃýÃýùÂýòÂýëÂýäÂýÝÂýÖÂýÏÂýÈÂýÁÂýºÂý³Âý¬Âý¥ÂýžÂý—ÂýÂý‰Âý‚Âý{ÂýtÂýmÂýfÂý_ÂýXÂýQÂýJÂýCÂý<Âý5Âý.Âý'Âý ÂýÂýÂý ÂýÂýýÁýöÁýïÁýèÁýáÁýÚÁýÓÁýÌÁýÅÁý¾Áý·Áý°Áý©Áý¢Áý›Áý”ÁýÁý†ÁýÁýxÁýqÁýjÁýcÁý\ÁýUÁýNÁýGÁý@Áý9Áý2Áý+Áý$ÁýÁýÁýÁýÁýÁýúÀýóÀýìÀýåÀýÞÀý×ÀýÐÀýÉÀýÂÀý»Àý´Àý­Àý¦ÀýŸÀý˜Àý‘ÀýŠÀýƒÀý|ÀýuÀýnÀýgÀý`ÀýYÀýRÀýKÀýDÀý=Àý6Àý/Àý(Àý!ÀýÀýÀý ÀýÀýþ¿ý÷¿ýð¿ýé¿ýâ¿ýÛ¿ýÔ¿ýÍ¿ýÆ¿ý¿¿ý¸¿ý±¿ýª¿ý£¿ýœ¿ý•¿ýŽ¿ý‡¿ý€¿ýy¿ýr¿ýk¿ýd¿ý]¿ýV¿ýO¿ýH¿ýA¿ý:¿ý3¿ý,¿ý%¿ý¿ý¿ý¿ý ¿ý¿ýû¾ýô¾ýí¾ýæ¾ýß¾ýؾýѾýʾýþý¼¾ýµ¾ý®¾ý§¾ý ¾ý™¾ý’¾ý‹¾ý„¾ý}¾ýv¾ýo¾ýh¾ýa¾ýZ¾ýS¾ýL¾ýE¾ý>¾ý7¾ý0¾ý)¾ý"¾ý¾ý¾ý ¾ý¾ýÿ½ýø½ýñ½ýê½ýã½ýܽýÕ½ýνýǽýÀ½ý¹½ý²½ý«½ý¤½ý½ý–½ý½ýˆ½ý½ýz½ýs½ýl½ýe½ý^½ýW½ýP½ýI½ýB½ý;½ý4½ý-½ý&½ý½ý½ý½ý ½ý½ýü¼ýõ¼ýî¼ýç¼ýà¼ýÙ¼ýÒ¼ý˼ýļý½¼ý¶¼ý¯¼ý¨¼ý¡¼ýš¼ý“¼ýŒ¼ý…¼ý~¼ýw¼ýp¼ýi¼ýb¼ý[¼ýT¼ýM¼ýF¼ý?¼ý8¼ý1¼ý*¼ý#¼ý¼ý¼ý¼ý¼ý¼ýù»ýò»ýë»ýä»ýÝ»ýÖ»ýÏ»ýÈ»ýÁ»ýº»ý³»ý¬»ý¥»ýž»ý—»ý»ý‰»ý‚»ý{»ýt»ým»ýf»ý_»ýX»ýQ»ýJ»ýC»ý<»ý5»ý.»ý'»ý »ý»ý»ý »ý»ýýºýöºýïºýèºýáºýÚºýÓºý̺ýźý¾ºý·ºý°ºý©ºý¢ºý›ºý”ºýºý†ºýºýxºýqºýjºýcºý\ºýUºýNºýGºý@ºý9ºý2ºý+ºý$ºýºýºýºýºýºýú¹ýó¹ýì¹ýå¹ýÞ¹ý×¹ýйýɹý¹ý»¹ý´¹ý­¹ý¦¹ýŸ¹ý˜¹ý‘¹ýйýƒ¹ý|¹ýu¹ýn¹ýg¹ý`¹ýY¹ýR¹ýK¹ýD¹ý=¹ý6¹ý/¹ý(¹ý!¹ý¹ý¹ý ¹ý¹ýþ¸ý÷¸ýð¸ýé¸ýâ¸ýÛ¸ýÔ¸ý͸ýƸý¿¸ý¸¸ý±¸ýª¸ý£¸ýœ¸ý•¸ýޏý‡¸ý€¸ýy¸ýr¸ýk¸ýd¸ý]¸ýV¸ýO¸ýH¸ýA¸ý:¸ý3¸ý,¸ý%¸ý¸ý¸ý¸ý ¸ý¸ýû·ýô·ýí·ýæ·ýß·ýØ·ýÑ·ýÊ·ý÷ý¼·ýµ·ý®·ý§·ý ·ý™·ý’·ý‹·ý„·ý}·ýv·ýo·ýh·ýa·ýZ·ýS·ýL·ýE·ý>·ý7·ý0·ý)·ý"·ý·ý·ý ·ý·ýÿ¶ýø¶ýñ¶ýê¶ýã¶ýܶýÕ¶ýζýǶýÀ¶ý¹¶ý²¶ý«¶ý¤¶ý¶ý–¶ý¶ýˆ¶ý¶ýz¶ýs¶ýl¶ýe¶ý^¶ýW¶ýP¶ýI¶ýB¶ý;¶ý4¶ý-¶ý&¶ý¶ý¶ý¶ý ¶ý¶ýüµýõµýîµýçµýàµýÙµýÒµý˵ýĵý½µý¶µý¯µý¨µý¡µýšµý“µýŒµý…µý~µýwµýpµýiµýbµý[µýTµýMµýFµý?µý8µý1µý*µý#µýµýµýµýµýµýù´ýò´ýë´ýä´ýÝ´ýÖ´ýÏ´ýÈ´ýÁ´ýº´ý³´ý¬´ý¥´ýž´ý—´ý´ý‰´ý‚´ý{´ýt´ým´ýf´ý_´ýX´ýQ´ýJ´ýC´ý<´ý5´ý.´ý'´ý ´ý´ý´ý ´ý´ýý³ýö³ýï³ýè³ýá³ýÚ³ýÓ³ý̳ýųý¾³ý·³ý°³ý©³ý¢³ý›³ý”³ý³ý†³ý³ýx³ýq³ýj³ýc³ý\³ýU³ýN³ýG³ý@³ý9³ý2³ý+³ý$³ý³ý³ý³ý³ý³ýú²ýó²ýì²ýå²ýÞ²ýײýвýɲý²ý»²ý´²ý­²ý¦²ýŸ²ý˜²ý‘²ýвýƒ²ý|²ýu²ýn²ýg²ý`²ýY²ýR²ýK²ýD²ý=²ý6²ý/²ý(²ý!²ý²ý²ý ²ý²ýþ±ý÷±ýð±ýé±ýâ±ýÛ±ýÔ±ýͱýƱý¿±ý¸±ý±±ýª±ý£±ýœ±ý•±ýޱý‡±ý€±ýy±ýr±ýk±ýd±ý]±ýV±ýO±ýH±ýA±ý:±ý3±ý,±ý%±ý±ý±ý±ý ±ý±ýû°ýô°ýí°ýæ°ýß°ýذýѰýʰýðý¼°ýµ°ý®°ý§°ý °ý™°ý’°ý‹°ý„°ý}°ýv°ýo°ýh°ýa°ýZ°ýS°ýL°ýE°ý>°ý7°ý0°ý)°ý"°ý°ý°ý °ý°ýÿ¯ýø¯ýñ¯ýê¯ýã¯ýܯýÕ¯ýίýǯýÀ¯ý¹¯ý²¯ý«¯ý¤¯ý¯ý–¯ý¯ýˆ¯ý¯ýz¯ýs¯ýl¯ýe¯ý^¯ýW¯ýP¯ýI¯ýB¯ý;¯ý4¯ý-¯ý&¯ý¯ý¯ý¯ý ¯ý¯ýü®ýõ®ýî®ýç®ýà®ýÙ®ýÒ®ýË®ýÄ®ý½®ý¶®ý¯®ý¨®ý¡®ýš®ý“®ýŒ®ý…®ý~®ýw®ýp®ýi®ýb®ý[®ýT®ýM®ýF®ý?®ý8®ý1®ý*®ý#®ý®ý®ý®ý®ý®ýù­ýò­ýë­ýä­ýÝ­ýÖ­ýÏ­ýÈ­ýÁ­ýº­ý³­ý¬­ý¥­ýž­ý—­ý­ý‰­ý‚­ý{­ýt­ým­ýf­ý_­ýX­ýQ­ýJ­ýC­ý<­ý5­ý.­ý'­ý ­ý­ý­ý ­ý­ýý¬ýö¬ýï¬ýè¬ýá¬ýÚ¬ýÓ¬ý̬ýŬý¾¬ý·¬ý°¬ý©¬ý¢¬ý›¬ý”¬ý¬ý†¬ý¬ýx¬ýq¬ýj¬ýc¬ý\¬ýU¬ýN¬ýG¬ý@¬ý9¬ý2¬ý+¬ý$¬ý¬ý¬ý¬ý¬ý¬ýú«ýó«ýì«ýå«ýÞ«ý׫ýЫýÉ«ý«ý»«ý´«ý­«ý¦«ýŸ«ý˜«ý‘«ýŠ«ýƒ«ý|«ýu«ýn«ýg«ý`«ýY«ýR«ýK«ýD«ý=«ý6«ý/«ý(«ý!«ý«ý«ý «ý«ýþªý÷ªýðªýéªýâªýÛªýÔªýͪýƪý¿ªý¸ªý±ªýªªý£ªýœªý•ªýŽªý‡ªý€ªýyªýrªýkªýdªý]ªýVªýOªýHªýAªý:ªý3ªý,ªý%ªýªýªýªý ªýªýû©ýô©ýí©ýæ©ýß©ýØ©ýÑ©ýÊ©ýéý¼©ýµ©ý®©ý§©ý ©ý™©ý’©ý‹©ý„©ý}©ýv©ýo©ýh©ýa©ýZ©ýS©ýL©ýE©ý>©ý7©ý0©ý)©ý"©ý©ý©ý ©ý©ýÿ¨ýø¨ýñ¨ýê¨ýã¨ýܨýÕ¨ýΨýǨýÀ¨ý¹¨ý²¨ý«¨ý¤¨ý¨ý–¨ý¨ýˆ¨ý¨ýz¨ýs¨ýl¨ýe¨ý^¨ýW¨ýP¨ýI¨ýB¨ý;¨ý4¨ý-¨ý&¨ý¨ý¨ý¨ý ¨ý¨ýü§ýõ§ýî§ýç§ýà§ýÙ§ýÒ§ý˧ýħý½§ý¶§ý¯§ý¨§ý¡§ýš§ý“§ýŒ§ý…§ý~§ýw§ýp§ýi§ýb§ý[§ýT§ýM§ýF§ý?§ý8§ý1§ý*§ý#§ý§ý§ý§ý§ý§ýù¦ýò¦ýë¦ýä¦ýݦýÖ¦ýϦýȦýÁ¦ýº¦ý³¦ý¬¦ý¥¦ýž¦ý—¦ý¦ý‰¦ý‚¦ý{¦ýt¦ým¦ýf¦ý_¦ýX¦ýQ¦ýJ¦ýC¦ý<¦ý5¦ý.¦ý'¦ý ¦ý¦ý¦ý ¦ý¦ýý¥ýö¥ýï¥ýè¥ýá¥ýÚ¥ýÓ¥ýÌ¥ýÅ¥ý¾¥ý·¥ý°¥ý©¥ý¢¥ý›¥ý”¥ý¥ý†¥ý¥ýx¥ýq¥ýj¥ýc¥ý\¥ýU¥ýN¥ýG¥ý@¥ý9¥ý2¥ý+¥ý$¥ý¥ý¥ý¥ý¥ý¥ýú¤ýó¤ýì¤ýå¤ýÞ¤ýפýФýɤý¤ý»¤ý´¤ý­¤ý¦¤ýŸ¤ý˜¤ý‘¤ýФýƒ¤ý|¤ýu¤ýn¤ýg¤ý`¤ýY¤ýR¤ýK¤ýD¤ý=¤ý6¤ý/¤ý(¤ý!¤ý¤ý¤ý ¤ý¤ýþ£ý÷£ýð£ýé£ýâ£ýÛ£ýÔ£ýÍ£ýÆ£ý¿£ý¸£ý±£ýª£ý££ýœ£ý•£ýŽ£ý‡£ý€£ýy£ýr£ýk£ýd£ý]£ýV£ýO£ýH£ýA£ý:£ý3£ý,£ý%£ý£ý£ý£ý £ý£ýû¢ýô¢ýí¢ýæ¢ýߢýØ¢ýÑ¢ýÊ¢ýâý¼¢ýµ¢ý®¢ý§¢ý ¢ý™¢ý’¢ý‹¢ý„¢ý}¢ýv¢ýo¢ýh¢ýa¢ýZ¢ýS¢ýL¢ýE¢ý>¢ý7¢ý0¢ý)¢ý"¢ý¢ý¢ý ¢ý¢ýÿ¡ýø¡ýñ¡ýê¡ýã¡ýÜ¡ýÕ¡ýΡýÇ¡ýÀ¡ý¹¡ý²¡ý«¡ý¤¡ý¡ý–¡ý¡ýˆ¡ý¡ýz¡ýs¡ýl¡ýe¡ý^¡ýW¡ýP¡ýI¡ýB¡ý;¡ý4¡ý-¡ý&¡ý¡ý¡ý¡ý ¡ý¡ýü ýõ ýî ýç ýà ýÙ ýÒ ýË ýÄ ý½ ý¶ ý¯ ý¨ ý¡ ýš ý“ ýŒ ý… ý~ ýw ýp ýi ýb ý[ ýT ýM ýF ý? ý8 ý1 ý* ý# ý ý ý ý ý ýùŸýòŸýëŸýäŸýÝŸýÖŸýÏŸýÈŸýÁŸýºŸý³Ÿý¬Ÿý¥ŸýžŸý—ŸýŸý‰Ÿý‚Ÿý{ŸýtŸýmŸýfŸý_ŸýXŸýQŸýJŸýCŸý<Ÿý5Ÿý.Ÿý'Ÿý ŸýŸýŸý ŸýŸýýžýöžýïžýèžýážýÚžýÓžýÌžýÅžý¾žý·žý°žý©žý¢žý›žý”žýžý†žýžýxžýqžýjžýcžý\žýUžýNžýGžý@žý9žý2žý+žý$žýžýžýžýžýžýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþœý÷œýðœýéœýâœýÛœýÔœýÍœýÆœý¿œý¸œý±œýªœý£œýœœý•œýŽœý‡œý€œýyœýrœýkœýdœý]œýVœýOœýHœýAœý:œý3œý,œý%œýœýœýœý œýœýû›ýô›ýí›ýæ›ýß›ýØ›ýÑ›ýÊ›ýÛý¼›ýµ›ý®›ý§›ý ›ý™›ý’›ý‹›ý„›ý}›ýv›ýo›ýh›ýa›ýZ›ýS›ýL›ýE›ý>›ý7›ý0›ý)›ý"›ý›ý›ý ›ý›ýÿšýøšýñšýêšýãšýÜšýÕšýΚýÇšýÀšý¹šý²šý«šý¤šýšý–šýšýˆšýšýzšýsšýlšýešý^šýWšýPšýIšýBšý;šý4šý-šý&šýšýšýšý šýšýü™ýõ™ýî™ýç™ýà™ýÙ™ýÒ™ýË™ýÄ™ý½™ý¶™ý¯™ý¨™ý¡™ýš™ý“™ýŒ™ý…™ý~™ýw™ýp™ýi™ýb™ý[™ýT™ýM™ýF™ý?™ý8™ý1™ý*™ý#™ý™ý™ý™ý™ý™ýù˜ýò˜ýë˜ýä˜ýݘýÖ˜ýϘýȘýÁ˜ýº˜ý³˜ý¬˜ý¥˜ýž˜ý—˜ý˜ý‰˜ý‚˜ý{˜ýt˜ým˜ýf˜ý_˜ýX˜ýQ˜ýJ˜ýC˜ý<˜ý5˜ý.˜ý'˜ý ˜ý˜ý˜ý ˜ý˜ýý—ýö—ýï—ýè—ýá—ýÚ—ýÓ—ýÌ—ýÅ—ý¾—ý·—ý°—ý©—ý¢—ý›—ý”—ý—ý†—ý—ýx—ýq—ýj—ýc—ý\—ýU—ýN—ýG—ý@—ý9—ý2—ý+—ý$—ý—ý—ý—ý—ý—ýú–ýó–ýì–ýå–ýÞ–ý×–ýЖýÉ–ý–ý»–ý´–ý­–ý¦–ýŸ–ý˜–ý‘–ýŠ–ýƒ–ý|–ýu–ýn–ýg–ý`–ýY–ýR–ýK–ýD–ý=–ý6–ý/–ý(–ý!–ý–ý–ý –ý–ýþ•ý÷•ýð•ýé•ýâ•ýÛ•ýÔ•ýÍ•ýÆ•ý¿•ý¸•ý±•ýª•ý£•ýœ•ý••ýŽ•ý‡•ý€•ýy•ýr•ýk•ýd•ý]•ýV•ýO•ýH•ýA•ý:•ý3•ý,•ý%•ý•ý•ý•ý •ý•ýû”ýô”ýí”ýæ”ýß”ýØ”ýÑ”ýÊ”ýÔý¼”ýµ”ý®”ý§”ý ”ý™”ý’”ý‹”ý„”ý}”ýv”ýo”ýh”ýa”ýZ”ýS”ýL”ýE”ý>”ý7”ý0”ý)”ý"”ý”ý”ý ”ý”ýÿ“ýø“ýñ“ýê“ýã“ýÜ“ýÕ“ýΓýÇ“ýÀ“ý¹“ý²“ý«“ý¤“ý“ý–“ý“ýˆ“ý“ýz“ýs“ýl“ýe“ý^“ýW“ýP“ýI“ýB“ý;“ý4“ý-“ý&“ý“ý“ý“ý “ý“ýü’ýõ’ýî’ýç’ýà’ýÙ’ýÒ’ýË’ýÄ’ý½’ý¶’ý¯’ý¨’ý¡’ýš’ý“’ýŒ’ý…’ý~’ýw’ýp’ýi’ýb’ý[’ýT’ýM’ýF’ý?’ý8’ý1’ý*’ý#’ý’ý’ý’ý’ý’ýù‘ýò‘ýë‘ýä‘ýÝ‘ýÖ‘ýÏ‘ýÈ‘ýÁ‘ýº‘ý³‘ý¬‘ý¥‘ýž‘ý—‘ý‘ý‰‘ý‚‘ý{‘ýt‘ým‘ýf‘ý_‘ýX‘ýQ‘ýJ‘ýC‘ý<‘ý5‘ý.‘ý'‘ý ‘ý‘ý‘ý ‘ý‘ýýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþŽý÷ŽýðŽýéŽýâŽýÛŽýÔŽýÍŽýÆŽý¿Žý¸Žý±ŽýªŽý£ŽýœŽý•ŽýŽŽý‡Žý€ŽýyŽýrŽýkŽýdŽý]ŽýVŽýOŽýHŽýAŽý:Žý3Žý,Žý%ŽýŽýŽýŽý ŽýŽýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿŒýøŒýñŒýêŒýãŒýÜŒýÕŒýÎŒýÇŒýÀŒý¹Œý²Œý«Œý¤ŒýŒý–ŒýŒýˆŒýŒýzŒýsŒýlŒýeŒý^ŒýWŒýPŒýIŒýBŒý;Œý4Œý-Œý&ŒýŒýŒýŒý ŒýŒýü‹ýõ‹ýî‹ýç‹ýà‹ýÙ‹ýÒ‹ýË‹ýÄ‹ý½‹ý¶‹ý¯‹ý¨‹ý¡‹ýš‹ý“‹ýŒ‹ý…‹ý~‹ýw‹ýp‹ýi‹ýb‹ý[‹ýT‹ýM‹ýF‹ý?‹ý8‹ý1‹ý*‹ý#‹ý‹ý‹ý‹ý‹ý‹ýùŠýòŠýëŠýäŠýÝŠýÖŠýÏŠýÈŠýÁŠýºŠý³Šý¬Šý¥ŠýžŠý—ŠýŠý‰Šý‚Šý{ŠýtŠýmŠýfŠý_ŠýXŠýQŠýJŠýCŠý<Šý5Šý.Šý'Šý ŠýŠýŠý ŠýŠýý‰ýö‰ýï‰ýè‰ýá‰ýÚ‰ýÓ‰ý̉ýʼný¾‰ý·‰ý°‰ý©‰ý¢‰ý›‰ý”‰ý‰ý†‰ý‰ýx‰ýq‰ýj‰ýc‰ý\‰ýU‰ýN‰ýG‰ý@‰ý9‰ý2‰ý+‰ý$‰ý‰ý‰ý‰ý‰ý‰ýúˆýóˆýìˆýåˆýÞˆý׈ýЈýɈýˆý»ˆý´ˆý­ˆý¦ˆýŸˆý˜ˆý‘ˆýŠˆýƒˆý|ˆýuˆýnˆýgˆý`ˆýYˆýRˆýKˆýDˆý=ˆý6ˆý/ˆý(ˆý!ˆýˆýˆý ˆýˆýþ‡ý÷‡ýð‡ýé‡ýâ‡ýÛ‡ýÔ‡ý͇ýƇý¿‡ý¸‡ý±‡ýª‡ý£‡ýœ‡ý•‡ýއý‡‡ý€‡ýy‡ýr‡ýk‡ýd‡ý]‡ýV‡ýO‡ýH‡ýA‡ý:‡ý3‡ý,‡ý%‡ý‡ý‡ý‡ý ‡ý‡ýû†ýô†ýí†ýæ†ý߆ý؆ýцýʆýÆý¼†ýµ†ý®†ý§†ý †ý™†ý’†ý‹†ý„†ý}†ýv†ýo†ýh†ýa†ýZ†ýS†ýL†ýE†ý>†ý7†ý0†ý)†ý"†ý†ý†ý †ý†ýÿ…ýø…ýñ…ýê…ýã…ýÜ…ýÕ…ýÎ…ýÇ…ýÀ…ý¹…ý²…ý«…ý¤…ý…ý–…ý…ýˆ…ý…ýz…ýs…ýl…ýe…ý^…ýW…ýP…ýI…ýB…ý;…ý4…ý-…ý&…ý…ý…ý…ý …ý…ýü„ýõ„ýî„ýç„ýà„ýÙ„ýÒ„ýË„ýÄ„ý½„ý¶„ý¯„ý¨„ý¡„ýš„ý“„ýŒ„ý…„ý~„ýw„ýp„ýi„ýb„ý[„ýT„ýM„ýF„ý?„ý8„ý1„ý*„ý#„ý„ý„ý„ý„ý„ýùƒýòƒýëƒýäƒý݃ýÖƒýσýȃýÁƒýºƒý³ƒý¬ƒý¥ƒýžƒý—ƒýƒý‰ƒý‚ƒý{ƒýtƒýmƒýfƒý_ƒýXƒýQƒýJƒýCƒý<ƒý5ƒý.ƒý'ƒý ƒýƒýƒý ƒýƒýý‚ýö‚ýï‚ýè‚ýá‚ýÚ‚ýÓ‚ýÌ‚ýÅ‚ý¾‚ý·‚ý°‚ý©‚ý¢‚ý›‚ý”‚ý‚ý†‚ý‚ýx‚ýq‚ýj‚ýc‚ý\‚ýU‚ýN‚ýG‚ý@‚ý9‚ý2‚ý+‚ý$‚ý‚ý‚ý‚ý‚ý‚ýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþ€ý÷€ýð€ýé€ýâ€ýÛ€ýÔ€ýÍ€ýÆ€ý¿€ý¸€ý±€ýª€ý£€ýœ€ý•€ýŽ€ý‡€ý€€ýy€ýr€ýk€ýd€ý]€ýV€ýO€ýH€ýA€ý:€ý3€ý,€ý%€ý€ý€ý€ý €ý€ýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿ~ýø~ýñ~ýê~ýã~ýÜ~ýÕ~ýÎ~ýÇ~ýÀ~ý¹~ý²~ý«~ý¤~ý~ý–~ý~ýˆ~ý~ýz~ýs~ýl~ýe~ý^~ýW~ýP~ýI~ýB~ý;~ý4~ý-~ý&~ý~ý~ý~ý ~ý~ýü}ýõ}ýî}ýç}ýà}ýÙ}ýÒ}ýË}ýÄ}ý½}ý¶}ý¯}ý¨}ý¡}ýš}ý“}ýŒ}ý…}ý~}ýw}ýp}ýi}ýb}ý[}ýT}ýM}ýF}ý?}ý8}ý1}ý*}ý#}ý}ý}ý}ý}ý}ýù|ýò|ýë|ýä|ýÝ|ýÖ|ýÏ|ýÈ|ýÁ|ýº|ý³|ý¬|ý¥|ýž|ý—|ý|ý‰|ý‚|ý{|ýt|ým|ýf|ý_|ýX|ýQ|ýJ|ýC|ý<|ý5|ý.|ý'|ý |ý|ý|ý |ý|ýý{ýö{ýï{ýè{ýá{ýÚ{ýÓ{ýÌ{ýÅ{ý¾{ý·{ý°{ý©{ý¢{ý›{ý”{ý{ý†{ý{ýx{ýq{ýj{ýc{ý\{ýU{ýN{ýG{ý@{ý9{ý2{ý+{ý${ý{ý{ý{ý{ý{ýúzýózýìzýåzýÞzý×zýÐzýÉzýÂzý»zý´zý­zý¦zýŸzý˜zý‘zýŠzýƒzý|zýuzýnzýgzý`zýYzýRzýKzýDzý=zý6zý/zý(zý!zýzýzý zýzýþyý÷yýðyýéyýâyýÛyýÔyýÍyýÆyý¿yý¸yý±yýªyý£yýœyý•yýŽyý‡yý€yýyyýryýkyýdyý]yýVyýOyýHyýAyý:yý3yý,yý%yýyýyýyý yýyýûxýôxýíxýæxýßxýØxýÑxýÊxýÃxý¼xýµxý®xý§xý xý™xý’xý‹xý„xý}xývxýoxýhxýaxýZxýSxýLxýExý>xý7xý0xý)xý"xýxýxý xýxýÿwýøwýñwýêwýãwýÜwýÕwýÎwýÇwýÀwý¹wý²wý«wý¤wýwý–wýwýˆwýwýzwýswýlwýewý^wýWwýPwýIwýBwý;wý4wý-wý&wýwýwýwý wýwýüvýõvýîvýçvýàvýÙvýÒvýËvýÄvý½vý¶vý¯vý¨vý¡výšvý“výŒvý…vý~výwvýpvýivýbvý[výTvýMvýFvý?vý8vý1vý*vý#vývývývývývýùuýòuýëuýäuýÝuýÖuýÏuýÈuýÁuýºuý³uý¬uý¥uýžuý—uýuý‰uý‚uý{uýtuýmuýfuý_uýXuýQuýJuýCuýqý7qý0qý)qý"qýqýqý qýqýÿpýøpýñpýêpýãpýÜpýÕpýÎpýÇpýÀpý¹pý²pý«pý¤pýpý–pýpýˆpýpýzpýspýlpýepý^pýWpýPpýIpýBpý;pý4pý-pý&pýpýpýpý pýpýüoýõoýîoýçoýàoýÙoýÒoýËoýÄoý½oý¶oý¯oý¨oý¡oýšoý“oýŒoý…oý~oýwoýpoýioýboý[oýToýMoýFoý?oý8oý1oý*oý#oýoýoýoýoýoýùnýònýënýänýÝnýÖnýÏnýÈnýÁnýºný³ný¬ný¥nýžný—nýný‰ný‚ný{nýtnýmnýfný_nýXnýQnýJnýCnýjý7jý0jý)jý"jýjýjý jýjýÿiýøiýñiýêiýãiýÜiýÕiýÎiýÇiýÀiý¹iý²iý«iý¤iýiý–iýiýˆiýiýziýsiýliýeiý^iýWiýPiýIiýBiý;iý4iý-iý&iýiýiýiý iýiýühýõhýîhýçhýàhýÙhýÒhýËhýÄhý½hý¶hý¯hý¨hý¡hýšhý“hýŒhý…hý~hýwhýphýihýbhý[hýThýMhýFhý?hý8hý1hý*hý#hýhýhýhýhýhýùgýògýëgýägýÝgýÖgýÏgýÈgýÁgýºgý³gý¬gý¥gýžgý—gýgý‰gý‚gý{gýtgýmgýfgý_gýXgýQgýJgýCgýcý7cý0cý)cý"cýcýcý cýcýÿbýøbýñbýêbýãbýÜbýÕbýÎbýÇbýÀbý¹bý²bý«bý¤býbý–býbýˆbýbýzbýsbýlbýebý^býWbýPbýIbýBbý;bý4bý-bý&býbýbýbý býbýüaýõaýîaýçaýàaýÙaýÒaýËaýÄaý½aý¶aý¯aý¨aý¡aýšaý“aýŒaý…aý~aýwaýpaýiaýbaý[aýTaýMaýFaý?aý8aý1aý*aý#aýaýaýaýaýaýù`ýò`ýë`ýä`ýÝ`ýÖ`ýÏ`ýÈ`ýÁ`ýº`ý³`ý¬`ý¥`ýž`ý—`ý`ý‰`ý‚`ý{`ýt`ým`ýf`ý_`ýX`ýQ`ýJ`ýC`ý<`ý5`ý.`ý'`ý `ý`ý`ý `ý`ýý_ýö_ýï_ýè_ýá_ýÚ_ýÓ_ýÌ_ýÅ_ý¾_ý·_ý°_ý©_ý¢_ý›_ý”_ý_ý†_ý_ýx_ýq_ýj_ýc_ý\_ýU_ýN_ýG_ý@_ý9_ý2_ý+_ý$_ý_ý_ý_ý_ý_ýú^ýó^ýì^ýå^ýÞ^ý×^ýÐ^ýÉ^ýÂ^ý»^ý´^ý­^ý¦^ýŸ^ý˜^ý‘^ýŠ^ýƒ^ý|^ýu^ýn^ýg^ý`^ýY^ýR^ýK^ýD^ý=^ý6^ý/^ý(^ý!^ý^ý^ý ^ý^ýþ]ý÷]ýð]ýé]ýâ]ýÛ]ýÔ]ýÍ]ýÆ]ý¿]ý¸]ý±]ýª]ý£]ýœ]ý•]ýŽ]ý‡]ý€]ýy]ýr]ýk]ýd]ý]]ýV]ýO]ýH]ýA]ý:]ý3]ý,]ý%]ý]ý]ý]ý ]ý]ýû\ýô\ýí\ýæ\ýß\ýØ\ýÑ\ýÊ\ýÃ\ý¼\ýµ\ý®\ý§\ý \ý™\ý’\ý‹\ý„\ý}\ýv\ýo\ýh\ýa\ýZ\ýS\ýL\ýE\ý>\ý7\ý0\ý)\ý"\ý\ý\ý \ý\ýÿ[ýø[ýñ[ýê[ýã[ýÜ[ýÕ[ýÎ[ýÇ[ýÀ[ý¹[ý²[ý«[ý¤[ý[ý–[ý[ýˆ[ý[ýz[ýs[ýl[ýe[ý^[ýW[ýP[ýI[ýB[ý;[ý4[ý-[ý&[ý[ý[ý[ý [ý[ýüZýõZýîZýçZýàZýÙZýÒZýËZýÄZý½Zý¶Zý¯Zý¨Zý¡ZýšZý“ZýŒZý…Zý~ZýwZýpZýiZýbZý[ZýTZýMZýFZý?Zý8Zý1Zý*Zý#ZýZýZýZýZýZýùYýòYýëYýäYýÝYýÖYýÏYýÈYýÁYýºYý³Yý¬Yý¥YýžYý—YýYý‰Yý‚Yý{YýtYýmYýfYý_YýXYýQYýJYýCYýUý7Uý0Uý)Uý"UýUýUý UýUýÿTýøTýñTýêTýãTýÜTýÕTýÎTýÇTýÀTý¹Tý²Tý«Tý¤TýTý–TýTýˆTýTýzTýsTýlTýeTý^TýWTýPTýITýBTý;Tý4Tý-Tý&TýTýTýTý TýTýüSýõSýîSýçSýàSýÙSýÒSýËSýÄSý½Sý¶Sý¯Sý¨Sý¡SýšSý“SýŒSý…Sý~SýwSýpSýiSýbSý[SýTSýMSýFSý?Sý8Sý1Sý*Sý#SýSýSýSýSýSýùRýòRýëRýäRýÝRýÖRýÏRýÈRýÁRýºRý³Rý¬Rý¥RýžRý—RýRý‰Rý‚Rý{RýtRýmRýfRý_RýXRýQRýJRýCRýNý7Ný0Ný)Ný"NýNýNý NýNýÿMýøMýñMýêMýãMýÜMýÕMýÎMýÇMýÀMý¹Mý²Mý«Mý¤MýMý–MýMýˆMýMýzMýsMýlMýeMý^MýWMýPMýIMýBMý;Mý4Mý-Mý&MýMýMýMý MýMýüLýõLýîLýçLýàLýÙLýÒLýËLýÄLý½Lý¶Lý¯Lý¨Lý¡LýšLý“LýŒLý…Lý~LýwLýpLýiLýbLý[LýTLýMLýFLý?Lý8Lý1Lý*Lý#LýLýLýLýLýLýùKýòKýëKýäKýÝKýÖKýÏKýÈKýÁKýºKý³Ký¬Ký¥KýžKý—KýKý‰Ký‚Ký{KýtKýmKýfKý_KýXKýQKýJKýCKýGý7Gý0Gý)Gý"GýGýGý GýGýÿFýøFýñFýêFýãFýÜFýÕFýÎFýÇFýÀFý¹Fý²Fý«Fý¤FýFý–FýFýˆFýFýzFýsFýlFýeFý^FýWFýPFýIFýBFý;Fý4Fý-Fý&FýFýFýFý FýFýüEýõEýîEýçEýàEýÙEýÒEýËEýÄEý½Eý¶Eý¯Eý¨Eý¡EýšEý“EýŒEý…Eý~EýwEýpEýiEýbEý[EýTEýMEýFEý?Eý8Eý1Eý*Eý#EýEýEýEýEýEýùDýòDýëDýäDýÝDýÖDýÏDýÈDýÁDýºDý³Dý¬Dý¥DýžDý—DýDý‰Dý‚Dý{DýtDýmDýfDý_DýXDýQDýJDýCDý@ý7@ý0@ý)@ý"@ý@ý@ý @ý@ýÿ?ýø?ýñ?ýê?ýã?ýÜ?ýÕ?ýÎ?ýÇ?ýÀ?ý¹?ý²?ý«?ý¤?ý?ý–?ý?ýˆ?ý?ýz?ýs?ýl?ýe?ý^?ýW?ýP?ýI?ýB?ý;?ý4?ý-?ý&?ý?ý?ý?ý ?ý?ýü>ýõ>ýî>ýç>ýà>ýÙ>ýÒ>ýË>ýÄ>ý½>ý¶>ý¯>ý¨>ý¡>ýš>ý“>ýŒ>ý…>ý~>ýw>ýp>ýi>ýb>ý[>ýT>ýM>ýF>ý?>ý8>ý1>ý*>ý#>ý>ý>ý>ý>ý>ýù=ýò=ýë=ýä=ýÝ=ýÖ=ýÏ=ýÈ=ýÁ=ýº=ý³=ý¬=ý¥=ýž=ý—=ý=ý‰=ý‚=ý{=ýt=ým=ýf=ý_=ýX=ýQ=ýJ=ýC=ý<=ý5=ý.=ý'=ý =ý=ý=ý =ý=ýý<ýö<ýï<ýè<ýá<ýÚ<ýÓ<ýÌ<ýÅ<ý¾<ý·<ý°<ý©<ý¢<ý›<ý”<ý<ý†<ý<ýx<ýq<ýj<ýc<ý\<ýU<ýN<ýG<ý@<ý9<ý2<ý+<ý$<ý<ý<ý<ý<ý<ýú;ýó;ýì;ýå;ýÞ;ý×;ýÐ;ýÉ;ýÂ;ý»;ý´;ý­;ý¦;ýŸ;ý˜;ý‘;ýŠ;ýƒ;ý|;ýu;ýn;ýg;ý`;ýY;ýR;ýK;ýD;ý=;ý6;ý/;ý(;ý!;ý;ý;ý ;ý;ýþ:ý÷:ýð:ýé:ýâ:ýÛ:ýÔ:ýÍ:ýÆ:ý¿:ý¸:ý±:ýª:ý£:ýœ:ý•:ýŽ:ý‡:ý€:ýy:ýr:ýk:ýd:ý]:ýV:ýO:ýH:ýA:ý::ý3:ý,:ý%:ý:ý:ý:ý :ý:ýû9ýô9ýí9ýæ9ýß9ýØ9ýÑ9ýÊ9ýÃ9ý¼9ýµ9ý®9ý§9ý 9ý™9ý’9ý‹9ý„9ý}9ýv9ýo9ýh9ýa9ýZ9ýS9ýL9ýE9ý>9ý79ý09ý)9ý"9ý9ý9ý 9ý9ýÿ8ýø8ýñ8ýê8ýã8ýÜ8ýÕ8ýÎ8ýÇ8ýÀ8ý¹8ý²8ý«8ý¤8ý8ý–8ý8ýˆ8ý8ýz8ýs8ýl8ýe8ý^8ýW8ýP8ýI8ýB8ý;8ý48ý-8ý&8ý8ý8ý8ý 8ý8ýü7ýõ7ýî7ýç7ýà7ýÙ7ýÒ7ýË7ýÄ7ý½7ý¶7ý¯7ý¨7ý¡7ýš7ý“7ýŒ7ý…7ý~7ýw7ýp7ýi7ýb7ý[7ýT7ýM7ýF7ý?7ý87ý17ý*7ý#7ý7ý7ý7ý7ý7ýù6ýò6ýë6ýä6ýÝ6ýÖ6ýÏ6ýÈ6ýÁ6ýº6ý³6ý¬6ý¥6ýž6ý—6ý6ý‰6ý‚6ý{6ýt6ým6ýf6ý_6ýX6ýQ6ýJ6ýC6ý<6ý56ý.6ý'6ý 6ý6ý6ý 6ý6ýý5ýö5ýï5ýè5ýá5ýÚ5ýÓ5ýÌ5ýÅ5ý¾5ý·5ý°5ý©5ý¢5ý›5ý”5ý5ý†5ý5ýx5ýq5ýj5ýc5ý\5ýU5ýN5ýG5ý@5ý95ý25ý+5ý$5ý5ý5ý5ý5ý5ýú4ýó4ýì4ýå4ýÞ4ý×4ýÐ4ýÉ4ýÂ4ý»4ý´4ý­4ý¦4ýŸ4ý˜4ý‘4ýŠ4ýƒ4ý|4ýu4ýn4ýg4ý`4ýY4ýR4ýK4ýD4ý=4ý64ý/4ý(4ý!4ý4ý4ý 4ý4ýþ3ý÷3ýð3ýé3ýâ3ýÛ3ýÔ3ýÍ3ýÆ3ý¿3ý¸3ý±3ýª3ý£3ýœ3ý•3ýŽ3ý‡3ý€3ýy3ýr3ýk3ýd3ý]3ýV3ýO3ýH3ýA3ý:3ý33ý,3ý%3ý3ý3ý3ý 3ý3ýû2ýô2ýí2ýæ2ýß2ýØ2ýÑ2ýÊ2ýÃ2ý¼2ýµ2ý®2ý§2ý 2ý™2ý’2ý‹2ý„2ý}2ýv2ýo2ýh2ýa2ýZ2ýS2ýL2ýE2ý>2ý72ý02ý)2ý"2ý2ý2ý 2ý2ýÿ1ýø1ýñ1ýê1ýã1ýÜ1ýÕ1ýÎ1ýÇ1ýÀ1ý¹1ý²1ý«1ý¤1ý1ý–1ý1ýˆ1ý1ýz1ýs1ýl1ýe1ý^1ýW1ýP1ýI1ýB1ý;1ý41ý-1ý&1ý1ý1ý1ý 1ý1ýü0ýõ0ýî0ýç0ýà0ýÙ0ýÒ0ýË0ýÄ0ý½0ý¶0ý¯0ý¨0ý¡0ýš0ý“0ýŒ0ý…0ý~0ýw0ýp0ýi0ýb0ý[0ýT0ýM0ýF0ý?0ý80ý10ý*0ý#0ý0ý0ý0ý0ý0ýù/ýò/ýë/ýä/ýÝ/ýÖ/ýÏ/ýÈ/ýÁ/ýº/ý³/ý¬/ý¥/ýž/ý—/ý/ý‰/ý‚/ý{/ýt/ým/ýf/ý_/ýX/ýQ/ýJ/ýC/ý+ý7+ý0+ý)+ý"+ý+ý+ý +ý+ýÿ*ýø*ýñ*ýê*ýã*ýÜ*ýÕ*ýÎ*ýÇ*ýÀ*ý¹*ý²*ý«*ý¤*ý*ý–*ý*ýˆ*ý*ýz*ýs*ýl*ýe*ý^*ýW*ýP*ýI*ýB*ý;*ý4*ý-*ý&*ý*ý*ý*ý *ý*ýü)ýõ)ýî)ýç)ýà)ýÙ)ýÒ)ýË)ýÄ)ý½)ý¶)ý¯)ý¨)ý¡)ýš)ý“)ýŒ)ý…)ý~)ýw)ýp)ýi)ýb)ý[)ýT)ýM)ýF)ý?)ý8)ý1)ý*)ý#)ý)ý)ý)ý)ý)ýù(ýò(ýë(ýä(ýÝ(ýÖ(ýÏ(ýÈ(ýÁ(ýº(ý³(ý¬(ý¥(ýž(ý—(ý(ý‰(ý‚(ý{(ýt(ým(ýf(ý_(ýX(ýQ(ýJ(ýC(ý<(ý5(ý.(ý'(ý (ý(ý(ý (ý(ýý'ýö'ýï'ýè'ýá'ýÚ'ýÓ'ýÌ'ýÅ'ý¾'ý·'ý°'ý©'ý¢'ý›'ý”'ý'ý†'ý'ýx'ýq'ýj'ýc'ý\'ýU'ýN'ýG'ý@'ý9'ý2'ý+'ý$'ý'ý'ý'ý'ý'ýú&ýó&ýì&ýå&ýÞ&ý×&ýÐ&ýÉ&ýÂ&ý»&ý´&ý­&ý¦&ýŸ&ý˜&ý‘&ýŠ&ýƒ&ý|&ýu&ýn&ýg&ý`&ýY&ýR&ýK&ýD&ý=&ý6&ý/&ý(&ý!&ý&ý&ý &ý&ýþ%ý÷%ýð%ýé%ýâ%ýÛ%ýÔ%ýÍ%ýÆ%ý¿%ý¸%ý±%ýª%ý£%ýœ%ý•%ýŽ%ý‡%ý€%ýy%ýr%ýk%ýd%ý]%ýV%ýO%ýH%ýA%ý:%ý3%ý,%ý%%ý%ý%ý%ý %ý%ýû$ýô$ýí$ýæ$ýß$ýØ$ýÑ$ýÊ$ýÃ$ý¼$ýµ$ý®$ý§$ý $ý™$ý’$ý‹$ý„$ý}$ýv$ýo$ýh$ýa$ýZ$ýS$ýL$ýE$ý>$ý7$ý0$ý)$ý"$ý$ý$ý $ý$ýÿ#ýø#ýñ#ýê#ýã#ýÜ#ýÕ#ýÎ#ýÇ#ýÀ#ý¹#ý²#ý«#ý¤#ý#ý–#ý#ýˆ#ý#ýz#ýs#ýl#ýe#ý^#ýW#ýP#ýI#ýB#ý;#ý4#ý-#ý&#ý#ý#ý#ý #ý#ýü"ýõ"ýî"ýç"ýà"ýÙ"ýÒ"ýË"ýÄ"ý½"ý¶"ý¯"ý¨"ý¡"ýš"ý“"ýŒ"ý…"ý~"ýw"ýp"ýi"ýb"ý["ýT"ýM"ýF"ý?"ý8"ý1"ý*"ý#"ý"ý"ý"ý"ý"ýù!ýò!ýë!ýä!ýÝ!ýÖ!ýÏ!ýÈ!ýÁ!ýº!ý³!ý¬!ý¥!ýž!ý—!ý!ý‰!ý‚!ý{!ýt!ým!ýf!ý_!ýX!ýQ!ýJ!ýC!ýý7ý0ý)ý"ýýý ýýÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýü ýõ ýî ýç ýà ýÙ ýÒ ýË ýÄ ý½ ý¶ ý¯ ý¨ ý¡ ýš ý“ ýŒ ý… ý~ ýw ýp ýi ýb ý[ ýT ýM ýF ý? ý8 ý1 ý* ý# ý ý ý ý ý ýù ýò ýë ýä ýÝ ýÖ ýÏ ýÈ ýÁ ýº ý³ ý¬ ý¥ ýž ý— ý ý‰ ý‚ ý{ ýt ým ýf ý_ ýX ýQ ýJ ýC ý< ý5 ý. ý' ý ý ý ý ý ýý ýö ýï ýè ýá ýÚ ýÓ ýÌ ýÅ ý¾ ý· ý° ý© ý¢ ý› ý” ý ý† ý ýx ýq ýj ýc ý\ ýU ýN ýG ý@ ý9 ý2 ý+ ý$ ý ý ý ý ý ýú ýó ýì ýå ýÞ ý× ýÐ ýÉ ý ý» ý´ ý­ ý¦ ýŸ ý˜ ý‘ ýŠ ýƒ ý| ýu ýn ýg ý` ýY ýR ýK ýD ý= ý6 ý/ ý( ý! ý ý ý ý ýþ ý÷ ýð ýé ýâ ýÛ ýÔ ýÍ ýÆ ý¿ ý¸ ý± ýª ý£ ýœ ý• ýŽ ý‡ ý€ ýy ýr ýk ýd ý] ýV ýO ýH ýA ý: ý3 ý, ý% ý ý ý ý ý ýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüÿüõÿüîÿüçÿüàÿüÙÿüÒÿüËÿüÄÿü½ÿü¶ÿü¯ÿü¨ÿü¡ÿüšÿü“ÿüŒÿü…ÿü~ÿüwÿüpÿüiÿübÿü[ÿüTÿüMÿüFÿü?ÿü8ÿü1ÿü*ÿü#ÿüÿüÿüÿüÿüÿüùþüòþüëþüäþüÝþüÖþüÏþüÈþüÁþüºþü³þü¬þü¥þüžþü—þüþü‰þü‚þü{þütþümþüfþü_þüXþüQþüJþüCþü<þü5þü.þü'þü þüþüþü þüþüýýüöýüïýüèýüáýüÚýüÓýüÌýüÅýü¾ýü·ýü°ýü©ýü¢ýü›ýü”ýüýü†ýüýüxýüqýüjýücýü\ýüUýüNýüGýü@ýü9ýü2ýü+ýü$ýüýüýüýüýüýüúüüóüüìüüåüüÞüü×üüÐüüÉüüÂüü»üü´üü­üü¦üüŸüü˜üü‘üüŠüüƒüü|üüuüünüügüü`üüYüüRüüKüüDüü=üü6üü/üü(üü!üüüüüü üüüüþûü÷ûüðûüéûüâûüÛûüÔûüÍûüÆûü¿ûü¸ûü±ûüªûü£ûüœûü•ûüŽûü‡ûü€ûüyûürûükûüdûü]ûüVûüOûüHûüAûü:ûü3ûü,ûü%ûüûüûüûü ûüûüûúüôúüíúüæúüßúüØúüÑúüÊúüÃúü¼úüµúü®úü§úü úü™úü’úü‹úü„úü}úüvúüoúühúüaúüZúüSúüLúüEúü>úü7úü0úü)úü"úüúüúü úüúüÿùüøùüñùüêùüãùüÜùüÕùüÎùüÇùüÀùü¹ùü²ùü«ùü¤ùüùü–ùüùüˆùüùüzùüsùülùüeùü^ùüWùüPùüIùüBùü;ùü4ùü-ùü&ùüùüùüùü ùüùüüøüõøüîøüçøüàøüÙøüÒøüËøüÄøü½øü¶øü¯øü¨øü¡øüšøü“øüŒøü…øü~øüwøüpøüiøübøü[øüTøüMøüFøü?øü8øü1øü*øü#øüøüøüøüøüøüù÷üò÷üë÷üä÷üÝ÷üÖ÷üÏ÷üÈ÷üÁ÷üº÷ü³÷ü¬÷ü¥÷üž÷ü—÷ü÷ü‰÷ü‚÷ü{÷üt÷üm÷üf÷ü_÷üX÷üQ÷üJ÷üC÷ü<÷ü5÷ü.÷ü'÷ü ÷ü÷ü÷ü ÷ü÷üýöüööüïöüèöüáöüÚöüÓöüÌöüÅöü¾öü·öü°öü©öü¢öü›öü”öüöü†öüöüxöüqöüjöücöü\öüUöüNöüGöü@öü9öü2öü+öü$öüöüöüöüöüöüúõüóõüìõüåõüÞõü×õüÐõüÉõüÂõü»õü´õü­õü¦õüŸõü˜õü‘õüŠõüƒõü|õüuõünõügõü`õüYõüRõüKõüDõü=õü6õü/õü(õü!õüõüõü õüõüþôü÷ôüðôüéôüâôüÛôüÔôüÍôüÆôü¿ôü¸ôü±ôüªôü£ôüœôü•ôüŽôü‡ôü€ôüyôürôükôüdôü]ôüVôüOôüHôüAôü:ôü3ôü,ôü%ôüôüôüôü ôüôüûóüôóüíóüæóüßóüØóüÑóüÊóüÃóü¼óüµóü®óü§óü óü™óü’óü‹óü„óü}óüvóüoóühóüaóüZóüSóüLóüEóü>óü7óü0óü)óü"óüóüóü óüóüÿòüøòüñòüêòüãòüÜòüÕòüÎòüÇòüÀòü¹òü²òü«òü¤òüòü–òüòüˆòüòüzòüsòülòüeòü^òüWòüPòüIòüBòü;òü4òü-òü&òüòüòüòü òüòüüñüõñüîñüçñüàñüÙñüÒñüËñüÄñü½ñü¶ñü¯ñü¨ñü¡ñüšñü“ñüŒñü…ñü~ñüwñüpñüiñübñü[ñüTñüMñüFñü?ñü8ñü1ñü*ñü#ñüñüñüñüñüñüùðüòðüëðüäðüÝðüÖðüÏðüÈðüÁðüºðü³ðü¬ðü¥ðüžðü—ðüðü‰ðü‚ðü{ðütðümðüfðü_ðüXðüQðüJðüCðü<ðü5ðü.ðü'ðü ðüðüðü ðüðüýïüöïüïïüèïüáïüÚïüÓïüÌïüÅïü¾ïü·ïü°ïü©ïü¢ïü›ïü”ïüïü†ïüïüxïüqïüjïücïü\ïüUïüNïüGïü@ïü9ïü2ïü+ïü$ïüïüïüïüïüïüúîüóîüìîüåîüÞîü×îüÐîüÉîüÂîü»îü´îü­îü¦îüŸîü˜îü‘îüŠîüƒîü|îüuîünîügîü`îüYîüRîüKîüDîü=îü6îü/îü(îü!îüîüîü îüîüþíü÷íüðíüéíüâíüÛíüÔíüÍíüÆíü¿íü¸íü±íüªíü£íüœíü•íüŽíü‡íü€íüyíüríükíüdíü]íüVíüOíüHíüAíü:íü3íü,íü%íüíüíüíü íüíüûìüôìüíìüæìüßìüØìüÑìüÊìüÃìü¼ìüµìü®ìü§ìü ìü™ìü’ìü‹ìü„ìü}ìüvìüoìühìüaìüZìüSìüLìüEìü>ìü7ìü0ìü)ìü"ìüìüìü ìüìüÿëüøëüñëüêëüãëüÜëüÕëüÎëüÇëüÀëü¹ëü²ëü«ëü¤ëüëü–ëüëüˆëüëüzëüsëülëüeëü^ëüWëüPëüIëüBëü;ëü4ëü-ëü&ëüëüëüëü ëüëüüêüõêüîêüçêüàêüÙêüÒêüËêüÄêü½êü¶êü¯êü¨êü¡êüšêü“êüŒêü…êü~êüwêüpêüiêübêü[êüTêüMêüFêü?êü8êü1êü*êü#êüêüêüêüêüêüùéüòéüëéüäéüÝéüÖéüÏéüÈéüÁéüºéü³éü¬éü¥éüžéü—éüéü‰éü‚éü{éütéüméüféü_éüXéüQéüJéüCéü<éü5éü.éü'éü éüéüéü éüéüýèüöèüïèüèèüáèüÚèüÓèüÌèüÅèü¾èü·èü°èü©èü¢èü›èü”èüèü†èüèüxèüqèüjèücèü\èüUèüNèüGèü@èü9èü2èü+èü$èüèüèüèüèüèüúçüóçüìçüåçüÞçü×çüÐçüÉçüÂçü»çü´çü­çü¦çüŸçü˜çü‘çüŠçüƒçü|çüuçünçügçü`çüYçüRçüKçüDçü=çü6çü/çü(çü!çüçüçü çüçüþæü÷æüðæüéæüâæüÛæüÔæüÍæüÆæü¿æü¸æü±æüªæü£æüœæü•æüŽæü‡æü€æüyæüræükæüdæü]æüVæüOæüHæüAæü:æü3æü,æü%æüæüæüæü æüæüûåüôåüíåüæåüßåüØåüÑåüÊåüÃåü¼åüµåü®åü§åü åü™åü’åü‹åü„åü}åüvåüoåühåüaåüZåüSåüLåüEåü>åü7åü0åü)åü"åüåüåü åüåüÿäüøäüñäüêäüãäüÜäüÕäüÎäüÇäüÀäü¹äü²äü«äü¤äüäü–äüäüˆäüäüzäüsäüläüeäü^äüWäüPäüIäüBäü;äü4äü-äü&äüäüäüäü äüäüüãüõãüîãüçãüàãüÙãüÒãüËãüÄãü½ãü¶ãü¯ãü¨ãü¡ãüšãü“ãüŒãü…ãü~ãüwãüpãüiãübãü[ãüTãüMãüFãü?ãü8ãü1ãü*ãü#ãüãüãüãüãüãüùâüòâüëâüäâüÝâüÖâüÏâüÈâüÁâüºâü³âü¬âü¥âüžâü—âüâü‰âü‚âü{âütâümâüfâü_âüXâüQâüJâüCâü<âü5âü.âü'âü âüâüâü âüâüýáüöáüïáüèáüááüÚáüÓáüÌáüÅáü¾áü·áü°áü©áü¢áü›áü”áüáü†áüáüxáüqáüjáücáü\áüUáüNáüGáü@áü9áü2áü+áü$áüáüáüáüáüáüúàüóàüìàüåàüÞàü×àüÐàüÉàüÂàü»àü´àü­àü¦àüŸàü˜àü‘àüŠàüƒàü|àüuàünàügàü`àüYàüRàüKàüDàü=àü6àü/àü(àü!àüàüàü àüàüþßü÷ßüðßüéßüâßüÛßüÔßüÍßüÆßü¿ßü¸ßü±ßüªßü£ßüœßü•ßüŽßü‡ßü€ßüyßürßükßüdßü]ßüVßüOßüHßüAßü:ßü3ßü,ßü%ßüßüßüßü ßüßüûÞüôÞüíÞüæÞüßÞüØÞüÑÞüÊÞüÃÞü¼ÞüµÞü®Þü§Þü Þü™Þü’Þü‹Þü„Þü}ÞüvÞüoÞühÞüaÞüZÞüSÞüLÞüEÞü>Þü7Þü0Þü)Þü"ÞüÞüÞü ÞüÞüÿÝüøÝüñÝüêÝüãÝüÜÝüÕÝüÎÝüÇÝüÀÝü¹Ýü²Ýü«Ýü¤ÝüÝü–ÝüÝüˆÝüÝüzÝüsÝülÝüeÝü^ÝüWÝüPÝüIÝüBÝü;Ýü4Ýü-Ýü&ÝüÝüÝüÝü ÝüÝüüÜüõÜüîÜüçÜüàÜüÙÜüÒÜüËÜüÄÜü½Üü¶Üü¯Üü¨Üü¡ÜüšÜü“ÜüŒÜü…Üü~ÜüwÜüpÜüiÜübÜü[ÜüTÜüMÜüFÜü?Üü8Üü1Üü*Üü#ÜüÜüÜüÜüÜüÜüùÛüòÛüëÛüäÛüÝÛüÖÛüÏÛüÈÛüÁÛüºÛü³Ûü¬Ûü¥ÛüžÛü—ÛüÛü‰Ûü‚Ûü{ÛütÛümÛüfÛü_ÛüXÛüQÛüJÛüCÛü<Ûü5Ûü.Ûü'Ûü ÛüÛüÛü ÛüÛüýÚüöÚüïÚüèÚüáÚüÚÚüÓÚüÌÚüÅÚü¾Úü·Úü°Úü©Úü¢Úü›Úü”ÚüÚü†ÚüÚüxÚüqÚüjÚücÚü\ÚüUÚüNÚüGÚü@Úü9Úü2Úü+Úü$ÚüÚüÚüÚüÚüÚüúÙüóÙüìÙüåÙüÞÙü×ÙüÐÙüÉÙüÂÙü»Ùü´Ùü­Ùü¦ÙüŸÙü˜Ùü‘ÙüŠÙüƒÙü|ÙüuÙünÙügÙü`ÙüYÙüRÙüKÙüDÙü=Ùü6Ùü/Ùü(Ùü!ÙüÙüÙü ÙüÙüþØü÷ØüðØüéØüâØüÛØüÔØüÍØüÆØü¿Øü¸Øü±ØüªØü£ØüœØü•ØüŽØü‡Øü€ØüyØürØükØüdØü]ØüVØüOØüHØüAØü:Øü3Øü,Øü%ØüØüØüØü ØüØüû×üô×üí×üæ×üß×üØ×üÑ×üÊ×üÃ×ü¼×üµ×ü®×ü§×ü ×ü™×ü’×ü‹×ü„×ü}×üv×üo×üh×üa×üZ×üS×üL×üE×ü>×ü7×ü0×ü)×ü"×ü×ü×ü ×ü×üÿÖüøÖüñÖüêÖüãÖüÜÖüÕÖüÎÖüÇÖüÀÖü¹Öü²Öü«Öü¤ÖüÖü–ÖüÖüˆÖüÖüzÖüsÖülÖüeÖü^ÖüWÖüPÖüIÖüBÖü;Öü4Öü-Öü&ÖüÖüÖüÖü ÖüÖüüÕüõÕüîÕüçÕüàÕüÙÕüÒÕüËÕüÄÕü½Õü¶Õü¯Õü¨Õü¡ÕüšÕü“ÕüŒÕü…Õü~ÕüwÕüpÕüiÕübÕü[ÕüTÕüMÕüFÕü?Õü8Õü1Õü*Õü#ÕüÕüÕüÕüÕüÕüùÔüòÔüëÔüäÔüÝÔüÖÔüÏÔüÈÔüÁÔüºÔü³Ôü¬Ôü¥ÔüžÔü—ÔüÔü‰Ôü‚Ôü{ÔütÔümÔüfÔü_ÔüXÔüQÔüJÔüCÔü<Ôü5Ôü.Ôü'Ôü ÔüÔüÔü ÔüÔüýÓüöÓüïÓüèÓüáÓüÚÓüÓÓüÌÓüÅÓü¾Óü·Óü°Óü©Óü¢Óü›Óü”ÓüÓü†ÓüÓüxÓüqÓüjÓücÓü\ÓüUÓüNÓüGÓü@Óü9Óü2Óü+Óü$ÓüÓüÓüÓüÓüÓüúÒüóÒüìÒüåÒüÞÒü×ÒüÐÒüÉÒüÂÒü»Òü´Òü­Òü¦ÒüŸÒü˜Òü‘ÒüŠÒüƒÒü|ÒüuÒünÒügÒü`ÒüYÒüRÒüKÒüDÒü=Òü6Òü/Òü(Òü!ÒüÒüÒü ÒüÒüþÑü÷ÑüðÑüéÑüâÑüÛÑüÔÑüÍÑüÆÑü¿Ñü¸Ñü±ÑüªÑü£ÑüœÑü•ÑüŽÑü‡Ñü€ÑüyÑürÑükÑüdÑü]ÑüVÑüOÑüHÑüAÑü:Ñü3Ñü,Ñü%ÑüÑüÑüÑü ÑüÑüûÐüôÐüíÐüæÐüßÐüØÐüÑÐüÊÐüÃÐü¼ÐüµÐü®Ðü§Ðü Ðü™Ðü’Ðü‹Ðü„Ðü}ÐüvÐüoÐühÐüaÐüZÐüSÐüLÐüEÐü>Ðü7Ðü0Ðü)Ðü"ÐüÐüÐü ÐüÐüÿÏüøÏüñÏüêÏüãÏüÜÏüÕÏüÎÏüÇÏüÀÏü¹Ïü²Ïü«Ïü¤ÏüÏü–ÏüÏüˆÏüÏüzÏüsÏülÏüeÏü^ÏüWÏüPÏüIÏüBÏü;Ïü4Ïü-Ïü&ÏüÏüÏüÏü ÏüÏüüÎüõÎüîÎüçÎüàÎüÙÎüÒÎüËÎüÄÎü½Îü¶Îü¯Îü¨Îü¡ÎüšÎü“ÎüŒÎü…Îü~ÎüwÎüpÎüiÎübÎü[ÎüTÎüMÎüFÎü?Îü8Îü1Îü*Îü#ÎüÎüÎüÎüÎüÎüùÍüòÍüëÍüäÍüÝÍüÖÍüÏÍüÈÍüÁÍüºÍü³Íü¬Íü¥ÍüžÍü—ÍüÍü‰Íü‚Íü{ÍütÍümÍüfÍü_ÍüXÍüQÍüJÍüCÍü<Íü5Íü.Íü'Íü ÍüÍüÍü ÍüÍüýÌüöÌüïÌüèÌüáÌüÚÌüÓÌüÌÌüÅÌü¾Ìü·Ìü°Ìü©Ìü¢Ìü›Ìü”ÌüÌü†ÌüÌüxÌüqÌüjÌücÌü\ÌüUÌüNÌüGÌü@Ìü9Ìü2Ìü+Ìü$ÌüÌüÌüÌüÌüÌüúËüóËüìËüåËüÞËü×ËüÐËüÉËüÂËü»Ëü´Ëü­Ëü¦ËüŸËü˜Ëü‘ËüŠËüƒËü|ËüuËünËügËü`ËüYËüRËüKËüDËü=Ëü6Ëü/Ëü(Ëü!ËüËüËü ËüËüþÊü÷ÊüðÊüéÊüâÊüÛÊüÔÊüÍÊüÆÊü¿Êü¸Êü±ÊüªÊü£ÊüœÊü•ÊüŽÊü‡Êü€ÊüyÊürÊükÊüdÊü]ÊüVÊüOÊüHÊüAÊü:Êü3Êü,Êü%ÊüÊüÊüÊü ÊüÊüûÉüôÉüíÉüæÉüßÉüØÉüÑÉüÊÉüÃÉü¼ÉüµÉü®Éü§Éü Éü™Éü’Éü‹Éü„Éü}ÉüvÉüoÉühÉüaÉüZÉüSÉüLÉüEÉü>Éü7Éü0Éü)Éü"ÉüÉüÉü ÉüÉüÿÈüøÈüñÈüêÈüãÈüÜÈüÕÈüÎÈüÇÈüÀÈü¹Èü²Èü«Èü¤ÈüÈü–ÈüÈüˆÈüÈüzÈüsÈülÈüeÈü^ÈüWÈüPÈüIÈüBÈü;Èü4Èü-Èü&ÈüÈüÈüÈü ÈüÈüüÇüõÇüîÇüçÇüàÇüÙÇüÒÇüËÇüÄÇü½Çü¶Çü¯Çü¨Çü¡ÇüšÇü“ÇüŒÇü…Çü~ÇüwÇüpÇüiÇübÇü[ÇüTÇüMÇüFÇü?Çü8Çü1Çü*Çü#ÇüÇüÇüÇüÇüÇüùÆüòÆüëÆüäÆüÝÆüÖÆüÏÆüÈÆüÁÆüºÆü³Æü¬Æü¥ÆüžÆü—ÆüÆü‰Æü‚Æü{ÆütÆümÆüfÆü_ÆüXÆüQÆüJÆüCÆü<Æü5Æü.Æü'Æü ÆüÆüÆü ÆüÆüýÅüöÅüïÅüèÅüáÅüÚÅüÓÅüÌÅüÅÅü¾Åü·Åü°Åü©Åü¢Åü›Åü”ÅüÅü†ÅüÅüxÅüqÅüjÅücÅü\ÅüUÅüNÅüGÅü@Åü9Åü2Åü+Åü$ÅüÅüÅüÅüÅüÅüúÄüóÄüìÄüåÄüÞÄü×ÄüÐÄüÉÄüÂÄü»Äü´Äü­Äü¦ÄüŸÄü˜Äü‘ÄüŠÄüƒÄü|ÄüuÄünÄügÄü`ÄüYÄüRÄüKÄüDÄü=Äü6Äü/Äü(Äü!ÄüÄüÄü ÄüÄüþÃü÷ÃüðÃüéÃüâÃüÛÃüÔÃüÍÃüÆÃü¿Ãü¸Ãü±ÃüªÃü£ÃüœÃü•ÃüŽÃü‡Ãü€ÃüyÃürÃükÃüdÃü]ÃüVÃüOÃüHÃüAÃü:Ãü3Ãü,Ãü%ÃüÃüÃüÃü ÃüÃüûÂüôÂüíÂüæÂüßÂüØÂüÑÂüÊÂüÃÂü¼ÂüµÂü®Âü§Âü Âü™Âü’Âü‹Âü„Âü}ÂüvÂüoÂühÂüaÂüZÂüSÂüLÂüEÂü>Âü7Âü0Âü)Âü"ÂüÂüÂü ÂüÂüÿÁüøÁüñÁüêÁüãÁüÜÁüÕÁüÎÁüÇÁüÀÁü¹Áü²Áü«Áü¤ÁüÁü–ÁüÁüˆÁüÁüzÁüsÁülÁüeÁü^ÁüWÁüPÁüIÁüBÁü;Áü4Áü-Áü&ÁüÁüÁüÁü ÁüÁüüÀüõÀüîÀüçÀüàÀüÙÀüÒÀüËÀüÄÀü½Àü¶Àü¯Àü¨Àü¡ÀüšÀü“ÀüŒÀü…Àü~ÀüwÀüpÀüiÀübÀü[ÀüTÀüMÀüFÀü?Àü8Àü1Àü*Àü#ÀüÀüÀüÀüÀüÀüù¿üò¿üë¿üä¿üÝ¿üÖ¿üÏ¿üÈ¿üÁ¿üº¿ü³¿ü¬¿ü¥¿üž¿ü—¿ü¿ü‰¿ü‚¿ü{¿üt¿üm¿üf¿ü_¿üX¿üQ¿üJ¿üC¿ü<¿ü5¿ü.¿ü'¿ü ¿ü¿ü¿ü ¿ü¿üý¾üö¾üï¾üè¾üá¾üÚ¾üÓ¾ü̾üžü¾¾ü·¾ü°¾ü©¾ü¢¾ü›¾ü”¾ü¾ü†¾ü¾üx¾üq¾üj¾üc¾ü\¾üU¾üN¾üG¾ü@¾ü9¾ü2¾ü+¾ü$¾ü¾ü¾ü¾ü¾ü¾üú½üó½üì½üå½üÞ½ü×½üнüɽü½ü»½ü´½ü­½ü¦½üŸ½ü˜½ü‘½üнüƒ½ü|½üu½ün½üg½ü`½üY½üR½üK½üD½ü=½ü6½ü/½ü(½ü!½ü½ü½ü ½ü½üþ¼ü÷¼üð¼üé¼üâ¼üÛ¼üÔ¼üͼüƼü¿¼ü¸¼ü±¼üª¼ü£¼üœ¼ü•¼ü޼ü‡¼ü€¼üy¼ür¼ük¼üd¼ü]¼üV¼üO¼üH¼üA¼ü:¼ü3¼ü,¼ü%¼ü¼ü¼ü¼ü ¼ü¼üû»üô»üí»üæ»üß»üØ»üÑ»üÊ»üûü¼»üµ»ü®»ü§»ü »ü™»ü’»ü‹»ü„»ü}»üv»üo»üh»üa»üZ»üS»üL»üE»ü>»ü7»ü0»ü)»ü"»ü»ü»ü »ü»üÿºüøºüñºüêºüãºüܺüÕºüκüǺüÀºü¹ºü²ºü«ºü¤ºüºü–ºüºüˆºüºüzºüsºülºüeºü^ºüWºüPºüIºüBºü;ºü4ºü-ºü&ºüºüºüºü ºüºüü¹üõ¹üî¹üç¹üà¹üÙ¹üÒ¹ü˹üĹü½¹ü¶¹ü¯¹ü¨¹ü¡¹üš¹ü“¹üŒ¹ü…¹ü~¹üw¹üp¹üi¹üb¹ü[¹üT¹üM¹üF¹ü?¹ü8¹ü1¹ü*¹ü#¹ü¹ü¹ü¹ü¹ü¹üù¸üò¸üë¸üä¸üݸüÖ¸üϸüȸüÁ¸üº¸ü³¸ü¬¸ü¥¸üž¸ü—¸ü¸ü‰¸ü‚¸ü{¸üt¸üm¸üf¸ü_¸üX¸üQ¸üJ¸üC¸ü<¸ü5¸ü.¸ü'¸ü ¸ü¸ü¸ü ¸ü¸üý·üö·üï·üè·üá·üÚ·üÓ·üÌ·üÅ·ü¾·ü··ü°·ü©·ü¢·ü›·ü”·ü·ü†·ü·üx·üq·üj·üc·ü\·üU·üN·üG·ü@·ü9·ü2·ü+·ü$·ü·ü·ü·ü·ü·üú¶üó¶üì¶üå¶üÞ¶ü×¶üжüɶü¶ü»¶ü´¶ü­¶ü¦¶üŸ¶ü˜¶ü‘¶üжüƒ¶ü|¶üu¶ün¶üg¶ü`¶üY¶üR¶üK¶üD¶ü=¶ü6¶ü/¶ü(¶ü!¶ü¶ü¶ü ¶ü¶üþµü÷µüðµüéµüâµüÛµüÔµü͵üƵü¿µü¸µü±µüªµü£µüœµü•µü޵ü‡µü€µüyµürµükµüdµü]µüVµüOµüHµüAµü:µü3µü,µü%µüµüµüµü µüµüû´üô´üí´üæ´üß´üØ´üÑ´üÊ´üôü¼´üµ´ü®´ü§´ü ´ü™´ü’´ü‹´ü„´ü}´üv´üo´üh´üa´üZ´üS´üL´üE´ü>´ü7´ü0´ü)´ü"´ü´ü´ü ´ü´üÿ³üø³üñ³üê³üã³üܳüÕ³üγüdzüÀ³ü¹³ü²³ü«³ü¤³ü³ü–³ü³üˆ³ü³üz³üs³ül³üe³ü^³üW³üP³üI³üB³ü;³ü4³ü-³ü&³ü³ü³ü³ü ³ü³üü²üõ²üî²üç²üà²üÙ²üÒ²ü˲üIJü½²ü¶²ü¯²ü¨²ü¡²üš²ü“²üŒ²ü…²ü~²üw²üp²üi²üb²ü[²üT²üM²üF²ü?²ü8²ü1²ü*²ü#²ü²ü²ü²ü²ü²üù±üò±üë±üä±üݱüÖ±üϱüȱüÁ±üº±ü³±ü¬±ü¥±üž±ü—±ü±ü‰±ü‚±ü{±üt±üm±üf±ü_±üX±üQ±üJ±üC±ü<±ü5±ü.±ü'±ü ±ü±ü±ü ±ü±üý°üö°üï°üè°üá°üÚ°üÓ°ṵ̈üŰü¾°ü·°ü°°ü©°ü¢°ü›°ü”°ü°ü†°ü°üx°üq°üj°üc°ü\°üU°üN°üG°ü@°ü9°ü2°ü+°ü$°ü°ü°ü°ü°ü°üú¯üó¯üì¯üå¯üÞ¯üׯüЯüɯü¯ü»¯ü´¯ü­¯ü¦¯üŸ¯ü˜¯ü‘¯üНüƒ¯ü|¯üu¯ün¯üg¯ü`¯üY¯üR¯üK¯üD¯ü=¯ü6¯ü/¯ü(¯ü!¯ü¯ü¯ü ¯ü¯üþ®ü÷®üð®üé®üâ®üÛ®üÔ®üÍ®üÆ®ü¿®ü¸®ü±®üª®ü£®üœ®ü•®üŽ®ü‡®ü€®üy®ür®ük®üd®ü]®üV®üO®üH®üA®ü:®ü3®ü,®ü%®ü®ü®ü®ü ®ü®üû­üô­üí­üæ­üß­üØ­üÑ­üÊ­üíü¼­üµ­ü®­ü§­ü ­ü™­ü’­ü‹­ü„­ü}­üv­üo­üh­üa­üZ­üS­üL­üE­ü>­ü7­ü0­ü)­ü"­ü­ü­ü ­ü­üÿ¬üø¬üñ¬üê¬üã¬üܬüÕ¬üάüǬüÀ¬ü¹¬ü²¬ü«¬ü¤¬ü¬ü–¬ü¬üˆ¬ü¬üz¬üs¬ül¬üe¬ü^¬üW¬üP¬üI¬üB¬ü;¬ü4¬ü-¬ü&¬ü¬ü¬ü¬ü ¬ü¬üü«üõ«üî«üç«üà«üÙ«üÒ«üË«üÄ«ü½«ü¶«ü¯«ü¨«ü¡«üš«ü“«üŒ«ü…«ü~«üw«üp«üi«üb«ü[«üT«üM«üF«ü?«ü8«ü1«ü*«ü#«ü«ü«ü«ü«ü«üùªüòªüëªüäªüݪüÖªüϪüȪüÁªüºªü³ªü¬ªü¥ªüžªü—ªüªü‰ªü‚ªü{ªütªümªüfªü_ªüXªüQªüJªüCªü<ªü5ªü.ªü'ªü ªüªüªü ªüªüý©üö©üï©üè©üá©üÚ©üÓ©üÌ©üÅ©ü¾©ü·©ü°©ü©©ü¢©ü›©ü”©ü©ü†©ü©üx©üq©üj©üc©ü\©üU©üN©üG©ü@©ü9©ü2©ü+©ü$©ü©ü©ü©ü©ü©üú¨üó¨üì¨üå¨üÞ¨üרüШüɨü¨ü»¨ü´¨ü­¨ü¦¨üŸ¨ü˜¨ü‘¨üЍüƒ¨ü|¨üu¨ün¨üg¨ü`¨üY¨üR¨üK¨üD¨ü=¨ü6¨ü/¨ü(¨ü!¨ü¨ü¨ü ¨ü¨üþ§ü÷§üð§üé§üâ§üÛ§üÔ§üͧüƧü¿§ü¸§ü±§üª§ü£§üœ§ü•§üާü‡§ü€§üy§ür§ük§üd§ü]§üV§üO§üH§üA§ü:§ü3§ü,§ü%§ü§ü§ü§ü §ü§üû¦üô¦üí¦üæ¦üߦüئüѦüʦüæü¼¦üµ¦ü®¦ü§¦ü ¦ü™¦ü’¦ü‹¦ü„¦ü}¦üv¦üo¦üh¦üa¦üZ¦üS¦üL¦üE¦ü>¦ü7¦ü0¦ü)¦ü"¦ü¦ü¦ü ¦ü¦üÿ¥üø¥üñ¥üê¥üã¥üÜ¥üÕ¥üÎ¥üÇ¥üÀ¥ü¹¥ü²¥ü«¥ü¤¥ü¥ü–¥ü¥üˆ¥ü¥üz¥üs¥ül¥üe¥ü^¥üW¥üP¥üI¥üB¥ü;¥ü4¥ü-¥ü&¥ü¥ü¥ü¥ü ¥ü¥üü¤üõ¤üî¤üç¤üà¤üÙ¤üÒ¤üˤüĤü½¤ü¶¤ü¯¤ü¨¤ü¡¤üš¤ü“¤üŒ¤ü…¤ü~¤üw¤üp¤üi¤üb¤ü[¤üT¤üM¤üF¤ü?¤ü8¤ü1¤ü*¤ü#¤ü¤ü¤ü¤ü¤ü¤üù£üò£üë£üä£üÝ£üÖ£üÏ£üÈ£üÁ£üº£ü³£ü¬£ü¥£üž£ü—£ü£ü‰£ü‚£ü{£üt£üm£üf£ü_£üX£üQ£üJ£üC£ü<£ü5£ü.£ü'£ü £ü£ü£ü £ü£üý¢üö¢üï¢üè¢üá¢üÚ¢üÓ¢üÌ¢üÅ¢ü¾¢ü·¢ü°¢ü©¢ü¢¢ü›¢ü”¢ü¢ü†¢ü¢üx¢üq¢üj¢üc¢ü\¢üU¢üN¢üG¢ü@¢ü9¢ü2¢ü+¢ü$¢ü¢ü¢ü¢ü¢ü¢üú¡üó¡üì¡üå¡üÞ¡üסüСüÉ¡ü¡ü»¡ü´¡ü­¡ü¦¡üŸ¡ü˜¡ü‘¡üŠ¡üƒ¡ü|¡üu¡ün¡üg¡ü`¡üY¡üR¡üK¡üD¡ü=¡ü6¡ü/¡ü(¡ü!¡ü¡ü¡ü ¡ü¡üþ ü÷ üð üé üâ üÛ üÔ üÍ üÆ ü¿ ü¸ ü± üª ü£ üœ ü• üŽ ü‡ ü€ üy ür ük üd ü] üV üO üH üA ü: ü3 ü, ü% ü ü ü ü  ü üûŸüôŸüíŸüæŸüߟüØŸüÑŸüÊŸüßü¼ŸüµŸü®Ÿü§Ÿü Ÿü™Ÿü’Ÿü‹Ÿü„Ÿü}ŸüvŸüoŸühŸüaŸüZŸüSŸüLŸüEŸü>Ÿü7Ÿü0Ÿü)Ÿü"ŸüŸüŸü ŸüŸüÿžüøžüñžüêžüãžüÜžüÕžüΞüÇžüÀžü¹žü²žü«žü¤žüžü–žüžüˆžüžüzžüsžülžüežü^žüWžüPžüIžüBžü;žü4žü-žü&žüžüžüžü žüžüüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùœüòœüëœüäœüÝœüÖœüÏœüÈœüÁœüºœü³œü¬œü¥œüžœü—œüœü‰œü‚œü{œütœümœüfœü_œüXœüQœüJœüCœü<œü5œü.œü'œü œüœüœü œüœüý›üö›üï›üè›üá›üÚ›üÓ›üÌ›üÅ›ü¾›ü·›ü°›ü©›ü¢›ü››ü”›ü›ü†›ü›üx›üq›üj›üc›ü\›üU›üN›üG›ü@›ü9›ü2›ü+›ü$›ü›ü›ü›ü›ü›üúšüóšüìšüåšüÞšüךüКüÉšüšü»šü´šü­šü¦šüŸšü˜šü‘šüŠšüƒšü|šüušünšügšü`šüYšüRšüKšüDšü=šü6šü/šü(šü!šüšüšü šüšüþ™ü÷™üð™üé™üâ™üÛ™üÔ™üÍ™üÆ™ü¿™ü¸™ü±™üª™ü£™üœ™ü•™üŽ™ü‡™ü€™üy™ür™ük™üd™ü]™üV™üO™üH™üA™ü:™ü3™ü,™ü%™ü™ü™ü™ü ™ü™üû˜üô˜üí˜üæ˜üߘüؘüјüʘüØü¼˜üµ˜ü®˜ü§˜ü ˜ü™˜ü’˜ü‹˜ü„˜ü}˜üv˜üo˜üh˜üa˜üZ˜üS˜üL˜üE˜ü>˜ü7˜ü0˜ü)˜ü"˜ü˜ü˜ü ˜ü˜üÿ—üø—üñ—üê—üã—üÜ—üÕ—üΗüÇ—üÀ—ü¹—ü²—ü«—ü¤—ü—ü–—ü—üˆ—ü—üz—üs—ül—üe—ü^—üW—üP—üI—üB—ü;—ü4—ü-—ü&—ü—ü—ü—ü —ü—üü–üõ–üî–üç–üà–üÙ–üÒ–üË–üÄ–ü½–ü¶–ü¯–ü¨–ü¡–üš–ü“–üŒ–ü…–ü~–üw–üp–üi–üb–ü[–üT–üM–üF–ü?–ü8–ü1–ü*–ü#–ü–ü–ü–ü–ü–üù•üò•üë•üä•üÝ•üÖ•üÏ•üÈ•üÁ•üº•ü³•ü¬•ü¥•üž•ü—•ü•ü‰•ü‚•ü{•üt•üm•üf•ü_•üX•üQ•üJ•üC•ü<•ü5•ü.•ü'•ü •ü•ü•ü •ü•üý”üö”üï”üè”üá”üÚ”üÓ”üÌ”üÅ”ü¾”ü·”ü°”ü©”ü¢”ü›”ü””ü”ü†”ü”üx”üq”üj”üc”ü\”üU”üN”üG”ü@”ü9”ü2”ü+”ü$”ü”ü”ü”ü”ü”üú“üó“üì“üå“üÞ“üדüГüÉ“ü“ü»“ü´“ü­“ü¦“üŸ“ü˜“ü‘“üŠ“üƒ“ü|“üu“ün“üg“ü`“üY“üR“üK“üD“ü=“ü6“ü/“ü(“ü!“ü“ü“ü “ü“üþ’ü÷’üð’üé’üâ’üÛ’üÔ’üÍ’üÆ’ü¿’ü¸’ü±’üª’ü£’üœ’ü•’üŽ’ü‡’ü€’üy’ür’ük’üd’ü]’üV’üO’üH’üA’ü:’ü3’ü,’ü%’ü’ü’ü’ü ’ü’üû‘üô‘üí‘üæ‘üß‘üØ‘üÑ‘üÊ‘üÑü¼‘üµ‘ü®‘ü§‘ü ‘ü™‘ü’‘ü‹‘ü„‘ü}‘üv‘üo‘üh‘üa‘üZ‘üS‘üL‘üE‘ü>‘ü7‘ü0‘ü)‘ü"‘ü‘ü‘ü ‘ü‘üÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùŽüòŽüëŽüäŽüÝŽüÖŽüÏŽüÈŽüÁŽüºŽü³Žü¬Žü¥ŽüžŽü—ŽüŽü‰Žü‚Žü{ŽütŽümŽüfŽü_ŽüXŽüQŽüJŽüCŽü<Žü5Žü.Žü'Žü ŽüŽüŽü ŽüŽüýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúŒüóŒüìŒüåŒüÞŒü׌üÐŒüÉŒüÂŒü»Œü´Œü­Œü¦ŒüŸŒü˜Œü‘ŒüŠŒüƒŒü|ŒüuŒünŒügŒü`ŒüYŒüRŒüKŒüDŒü=Œü6Œü/Œü(Œü!ŒüŒüŒü ŒüŒüþ‹ü÷‹üð‹üé‹üâ‹üÛ‹üÔ‹üÍ‹üÆ‹ü¿‹ü¸‹ü±‹üª‹ü£‹üœ‹ü•‹üŽ‹ü‡‹ü€‹üy‹ür‹ük‹üd‹ü]‹üV‹üO‹üH‹üA‹ü:‹ü3‹ü,‹ü%‹ü‹ü‹ü‹ü ‹ü‹üûŠüôŠüíŠüæŠüߊüØŠüÑŠüÊŠüÊü¼ŠüµŠü®Šü§Šü Šü™Šü’Šü‹Šü„Šü}ŠüvŠüoŠühŠüaŠüZŠüSŠüLŠüEŠü>Šü7Šü0Šü)Šü"ŠüŠüŠü ŠüŠüÿ‰üø‰üñ‰üê‰üã‰ü܉üÕ‰üΉüljüÀ‰ü¹‰ü²‰ü«‰ü¤‰ü‰ü–‰ü‰üˆ‰ü‰üz‰üs‰ül‰üe‰ü^‰üW‰üP‰üI‰üB‰ü;‰ü4‰ü-‰ü&‰ü‰ü‰ü‰ü ‰ü‰üüˆüõˆüîˆüçˆüàˆüÙˆüÒˆüˈüĈü½ˆü¶ˆü¯ˆü¨ˆü¡ˆüšˆü“ˆüŒˆü…ˆü~ˆüwˆüpˆüiˆübˆü[ˆüTˆüMˆüFˆü?ˆü8ˆü1ˆü*ˆü#ˆüˆüˆüˆüˆüˆüù‡üò‡üë‡üä‡ü݇üÖ‡üχüȇüÁ‡üº‡ü³‡ü¬‡ü¥‡üž‡ü—‡ü‡ü‰‡ü‚‡ü{‡üt‡üm‡üf‡ü_‡üX‡üQ‡üJ‡üC‡ü<‡ü5‡ü.‡ü'‡ü ‡ü‡ü‡ü ‡ü‡üý†üö†üï†üè†üá†üÚ†üÓ†ü̆üņü¾†ü·†ü°†ü©†ü¢†ü›†ü”†ü†ü††ü†üx†üq†üj†üc†ü\†üU†üN†üG†ü@†ü9†ü2†ü+†ü$†ü†ü†ü†ü†ü†üú…üó…üì…üå…üÞ…ü×…üÐ…üÉ…üÂ…ü»…ü´…ü­…ü¦…üŸ…ü˜…ü‘…üŠ…üƒ…ü|…üu…ün…üg…ü`…üY…üR…üK…üD…ü=…ü6…ü/…ü(…ü!…ü…ü…ü …ü…üþ„ü÷„üð„üé„üâ„üÛ„üÔ„üÍ„üÆ„ü¿„ü¸„ü±„üª„ü£„üœ„ü•„üŽ„ü‡„ü€„üy„ür„ük„üd„ü]„üV„üO„üH„üA„ü:„ü3„ü,„ü%„ü„ü„ü„ü „ü„üûƒüôƒüíƒüæƒü߃ü؃üуüʃüÃü¼ƒüµƒü®ƒü§ƒü ƒü™ƒü’ƒü‹ƒü„ƒü}ƒüvƒüoƒühƒüaƒüZƒüSƒüLƒüEƒü>ƒü7ƒü0ƒü)ƒü"ƒüƒüƒü ƒüƒüÿ‚üø‚üñ‚üê‚üã‚üÜ‚üÕ‚ü΂üÇ‚üÀ‚ü¹‚ü²‚ü«‚ü¤‚ü‚ü–‚ü‚üˆ‚ü‚üz‚üs‚ül‚üe‚ü^‚üW‚üP‚üI‚üB‚ü;‚ü4‚ü-‚ü&‚ü‚ü‚ü‚ü ‚ü‚üüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüù€üò€üë€üä€üÝ€üÖ€üÏ€üÈ€üÁ€üº€ü³€ü¬€ü¥€üž€ü—€ü€ü‰€ü‚€ü{€üt€üm€üf€ü_€üX€üQ€üJ€üC€ü<€ü5€ü.€ü'€ü €ü€ü€ü €ü€üýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüú~üó~üì~üå~üÞ~ü×~üÐ~üÉ~üÂ~ü»~ü´~ü­~ü¦~üŸ~ü˜~ü‘~üŠ~üƒ~ü|~üu~ün~üg~ü`~üY~üR~üK~üD~ü=~ü6~ü/~ü(~ü!~ü~ü~ü ~ü~üþ}ü÷}üð}üé}üâ}üÛ}üÔ}üÍ}üÆ}ü¿}ü¸}ü±}üª}ü£}üœ}ü•}üŽ}ü‡}ü€}üy}ür}ük}üd}ü]}üV}üO}üH}üA}ü:}ü3}ü,}ü%}ü}ü}ü}ü }ü}üû|üô|üí|üæ|üß|üØ|üÑ|üÊ|üÃ|ü¼|üµ|ü®|ü§|ü |ü™|ü’|ü‹|ü„|ü}|üv|üo|üh|üa|üZ|üS|üL|üE|ü>|ü7|ü0|ü)|ü"|ü|ü|ü |ü|üÿ{üø{üñ{üê{üã{üÜ{üÕ{üÎ{üÇ{üÀ{ü¹{ü²{ü«{ü¤{ü{ü–{ü{üˆ{ü{üz{üs{ül{üe{ü^{üW{üP{üI{üB{ü;{ü4{ü-{ü&{ü{ü{ü{ü {ü{üüzüõzüîzüçzüàzüÙzüÒzüËzüÄzü½zü¶zü¯zü¨zü¡züšzü“züŒzü…zü~züwzüpzüizübzü[züTzüMzüFzü?zü8zü1zü*zü#züzüzüzüzüzüùyüòyüëyüäyüÝyüÖyüÏyüÈyüÁyüºyü³yü¬yü¥yüžyü—yüyü‰yü‚yü{yütyümyüfyü_yüXyüQyüJyüCyüuü7uü0uü)uü"uüuüuü uüuüÿtüøtüñtüêtüãtüÜtüÕtüÎtüÇtüÀtü¹tü²tü«tü¤tütü–tütüˆtütüztüstültüetü^tüWtüPtüItüBtü;tü4tü-tü&tütütütü tütüüsüõsüîsüçsüàsüÙsüÒsüËsüÄsü½sü¶sü¯sü¨sü¡süšsü“süŒsü…sü~süwsüpsüisübsü[süTsüMsüFsü?sü8sü1sü*sü#süsüsüsüsüsüùrüòrüërüärüÝrüÖrüÏrüÈrüÁrüºrü³rü¬rü¥rüžrü—rürü‰rü‚rü{rütrümrüfrü_rüXrüQrüJrüCrünü7nü0nü)nü"nününü nünüÿmüømüñmüêmüãmüÜmüÕmüÎmüÇmüÀmü¹mü²mü«mü¤mümü–mümüˆmümüzmüsmülmüemü^müWmüPmüImüBmü;mü4mü-mü&mümümümü mümüülüõlüîlüçlüàlüÙlüÒlüËlüÄlü½lü¶lü¯lü¨lü¡lüšlü“lüŒlü…lü~lüwlüplüilüblü[lüTlüMlüFlü?lü8lü1lü*lü#lülülülülülüùküòküëküäküÝküÖküÏküÈküÁküºkü³kü¬kü¥küžkü—kükü‰kü‚kü{kütkümküfkü_küXküQküJküCkügü7gü0gü)gü"gügügü gügüÿfüøfüñfüêfüãfüÜfüÕfüÎfüÇfüÀfü¹fü²fü«fü¤füfü–füfüˆfüfüzfüsfülfüefü^füWfüPfüIfüBfü;fü4fü-fü&füfüfüfü füfüüeüõeüîeüçeüàeüÙeüÒeüËeüÄeü½eü¶eü¯eü¨eü¡eüšeü“eüŒeü…eü~eüweüpeüieübeü[eüTeüMeüFeü?eü8eü1eü*eü#eüeüeüeüeüeüùdüòdüëdüädüÝdüÖdüÏdüÈdüÁdüºdü³dü¬dü¥düždü—düdü‰dü‚dü{dütdümdüfdü_düXdüQdüJdüCdü`ü7`ü0`ü)`ü"`ü`ü`ü `ü`üÿ_üø_üñ_üê_üã_üÜ_üÕ_üÎ_üÇ_üÀ_ü¹_ü²_ü«_ü¤_ü_ü–_ü_üˆ_ü_üz_üs_ül_üe_ü^_üW_üP_üI_üB_ü;_ü4_ü-_ü&_ü_ü_ü_ü _ü_üü^üõ^üî^üç^üà^üÙ^üÒ^üË^üÄ^ü½^ü¶^ü¯^ü¨^ü¡^üš^ü“^üŒ^ü…^ü~^üw^üp^üi^üb^ü[^üT^üM^üF^ü?^ü8^ü1^ü*^ü#^ü^ü^ü^ü^ü^üù]üò]üë]üä]üÝ]üÖ]üÏ]üÈ]üÁ]üº]ü³]ü¬]ü¥]üž]ü—]ü]ü‰]ü‚]ü{]üt]üm]üf]ü_]üX]üQ]üJ]üC]ü<]ü5]ü.]ü']ü ]ü]ü]ü ]ü]üý\üö\üï\üè\üá\üÚ\üÓ\üÌ\üÅ\ü¾\ü·\ü°\ü©\ü¢\ü›\ü”\ü\ü†\ü\üx\üq\üj\üc\ü\\üU\üN\üG\ü@\ü9\ü2\ü+\ü$\ü\ü\ü\ü\ü\üú[üó[üì[üå[üÞ[ü×[üÐ[üÉ[üÂ[ü»[ü´[ü­[ü¦[üŸ[ü˜[ü‘[üŠ[üƒ[ü|[üu[ün[üg[ü`[üY[üR[üK[üD[ü=[ü6[ü/[ü([ü![ü[ü[ü [ü[üþZü÷ZüðZüéZüâZüÛZüÔZüÍZüÆZü¿Zü¸Zü±ZüªZü£ZüœZü•ZüŽZü‡Zü€ZüyZürZükZüdZü]ZüVZüOZüHZüAZü:Zü3Zü,Zü%ZüZüZüZü ZüZüûYüôYüíYüæYüßYüØYüÑYüÊYüÃYü¼YüµYü®Yü§Yü Yü™Yü’Yü‹Yü„Yü}YüvYüoYühYüaYüZYüSYüLYüEYü>Yü7Yü0Yü)Yü"YüYüYü YüYüÿXüøXüñXüêXüãXüÜXüÕXüÎXüÇXüÀXü¹Xü²Xü«Xü¤XüXü–XüXüˆXüXüzXüsXülXüeXü^XüWXüPXüIXüBXü;Xü4Xü-Xü&XüXüXüXü XüXüüWüõWüîWüçWüàWüÙWüÒWüËWüÄWü½Wü¶Wü¯Wü¨Wü¡WüšWü“WüŒWü…Wü~WüwWüpWüiWübWü[WüTWüMWüFWü?Wü8Wü1Wü*Wü#WüWüWüWüWüWüùVüòVüëVüäVüÝVüÖVüÏVüÈVüÁVüºVü³Vü¬Vü¥VüžVü—VüVü‰Vü‚Vü{VütVümVüfVü_VüXVüQVüJVüCVüRü7Rü0Rü)Rü"RüRüRü RüRüÿQüøQüñQüêQüãQüÜQüÕQüÎQüÇQüÀQü¹Qü²Qü«Qü¤QüQü–QüQüˆQüQüzQüsQülQüeQü^QüWQüPQüIQüBQü;Qü4Qü-Qü&QüQüQüQü QüQüüPüõPüîPüçPüàPüÙPüÒPüËPüÄPü½Pü¶Pü¯Pü¨Pü¡PüšPü“PüŒPü…Pü~PüwPüpPüiPübPü[PüTPüMPüFPü?Pü8Pü1Pü*Pü#PüPüPüPüPüPüùOüòOüëOüäOüÝOüÖOüÏOüÈOüÁOüºOü³Oü¬Oü¥OüžOü—OüOü‰Oü‚Oü{OütOümOüfOü_OüXOüQOüJOüCOüKü7Kü0Kü)Kü"KüKüKü KüKüÿJüøJüñJüêJüãJüÜJüÕJüÎJüÇJüÀJü¹Jü²Jü«Jü¤JüJü–JüJüˆJüJüzJüsJülJüeJü^JüWJüPJüIJüBJü;Jü4Jü-Jü&JüJüJüJü JüJüüIüõIüîIüçIüàIüÙIüÒIüËIüÄIü½Iü¶Iü¯Iü¨Iü¡IüšIü“IüŒIü…Iü~IüwIüpIüiIübIü[IüTIüMIüFIü?Iü8Iü1Iü*Iü#IüIüIüIüIüIüùHüòHüëHüäHüÝHüÖHüÏHüÈHüÁHüºHü³Hü¬Hü¥HüžHü—HüHü‰Hü‚Hü{HütHümHüfHü_HüXHüQHüJHüCHüDü7Dü0Dü)Dü"DüDüDü DüDüÿCüøCüñCüêCüãCüÜCüÕCüÎCüÇCüÀCü¹Cü²Cü«Cü¤CüCü–CüCüˆCüCüzCüsCülCüeCü^CüWCüPCüICüBCü;Cü4Cü-Cü&CüCüCüCü CüCüüBüõBüîBüçBüàBüÙBüÒBüËBüÄBü½Bü¶Bü¯Bü¨Bü¡BüšBü“BüŒBü…Bü~BüwBüpBüiBübBü[BüTBüMBüFBü?Bü8Bü1Bü*Bü#BüBüBüBüBüBüùAüòAüëAüäAüÝAüÖAüÏAüÈAüÁAüºAü³Aü¬Aü¥AüžAü—AüAü‰Aü‚Aü{AütAümAüfAü_AüXAüQAüJAüCAüü÷>üð>üé>üâ>üÛ>üÔ>üÍ>üÆ>ü¿>ü¸>ü±>üª>ü£>üœ>ü•>üŽ>ü‡>ü€>üy>ür>ük>üd>ü]>üV>üO>üH>üA>ü:>ü3>ü,>ü%>ü>ü>ü>ü >ü>üû=üô=üí=üæ=üß=üØ=üÑ=üÊ=üÃ=ü¼=üµ=ü®=ü§=ü =ü™=ü’=ü‹=ü„=ü}=üv=üo=üh=üa=üZ=üS=üL=üE=ü>=ü7=ü0=ü)=ü"=ü=ü=ü =ü=üÿ<üø<üñ<üê<üã<üÜ<üÕ<üÎ<üÇ<üÀ<ü¹<ü²<ü«<ü¤<ü<ü–<ü<üˆ<ü<üz<üs<ül<üe<ü^<üW<üP<üI<üB<ü;<ü4<ü-<ü&<ü<ü<ü<ü <ü<üü;üõ;üî;üç;üà;üÙ;üÒ;üË;üÄ;ü½;ü¶;ü¯;ü¨;ü¡;üš;ü“;üŒ;ü…;ü~;üw;üp;üi;üb;ü[;üT;üM;üF;ü?;ü8;ü1;ü*;ü#;ü;ü;ü;ü;ü;üù:üò:üë:üä:üÝ:üÖ:üÏ:üÈ:üÁ:üº:ü³:ü¬:ü¥:üž:ü—:ü:ü‰:ü‚:ü{:üt:üm:üf:ü_:üX:üQ:üJ:üC:ü<:ü5:ü.:ü':ü :ü:ü:ü :ü:üý9üö9üï9üè9üá9üÚ9üÓ9üÌ9üÅ9ü¾9ü·9ü°9ü©9ü¢9ü›9ü”9ü9ü†9ü9üx9üq9üj9üc9ü\9üU9üN9üG9ü@9ü99ü29ü+9ü$9ü9ü9ü9ü9ü9üú8üó8üì8üå8üÞ8ü×8üÐ8üÉ8üÂ8ü»8ü´8ü­8ü¦8üŸ8ü˜8ü‘8üŠ8üƒ8ü|8üu8ün8üg8ü`8üY8üR8üK8üD8ü=8ü68ü/8ü(8ü!8ü8ü8ü 8ü8üþ7ü÷7üð7üé7üâ7üÛ7üÔ7üÍ7üÆ7ü¿7ü¸7ü±7üª7ü£7üœ7ü•7üŽ7ü‡7ü€7üy7ür7ük7üd7ü]7üV7üO7üH7üA7ü:7ü37ü,7ü%7ü7ü7ü7ü 7ü7üû6üô6üí6üæ6üß6üØ6üÑ6üÊ6üÃ6ü¼6üµ6ü®6ü§6ü 6ü™6ü’6ü‹6ü„6ü}6üv6üo6üh6üa6üZ6üS6üL6üE6ü>6ü76ü06ü)6ü"6ü6ü6ü 6ü6üÿ5üø5üñ5üê5üã5üÜ5üÕ5üÎ5üÇ5üÀ5ü¹5ü²5ü«5ü¤5ü5ü–5ü5üˆ5ü5üz5üs5ül5üe5ü^5üW5üP5üI5üB5ü;5ü45ü-5ü&5ü5ü5ü5ü 5ü5üü4üõ4üî4üç4üà4üÙ4üÒ4üË4üÄ4ü½4ü¶4ü¯4ü¨4ü¡4üš4ü“4üŒ4ü…4ü~4üw4üp4üi4üb4ü[4üT4üM4üF4ü?4ü84ü14ü*4ü#4ü4ü4ü4ü4ü4üù3üò3üë3üä3üÝ3üÖ3üÏ3üÈ3üÁ3üº3ü³3ü¬3ü¥3üž3ü—3ü3ü‰3ü‚3ü{3üt3üm3üf3ü_3üX3üQ3üJ3üC3ü<3ü53ü.3ü'3ü 3ü3ü3ü 3ü3üý2üö2üï2üè2üá2üÚ2üÓ2üÌ2üÅ2ü¾2ü·2ü°2ü©2ü¢2ü›2ü”2ü2ü†2ü2üx2üq2üj2üc2ü\2üU2üN2üG2ü@2ü92ü22ü+2ü$2ü2ü2ü2ü2ü2üú1üó1üì1üå1üÞ1ü×1üÐ1üÉ1üÂ1ü»1ü´1ü­1ü¦1üŸ1ü˜1ü‘1üŠ1üƒ1ü|1üu1ün1üg1ü`1üY1üR1üK1üD1ü=1ü61ü/1ü(1ü!1ü1ü1ü 1ü1üþ0ü÷0üð0üé0üâ0üÛ0üÔ0üÍ0üÆ0ü¿0ü¸0ü±0üª0ü£0üœ0ü•0üŽ0ü‡0ü€0üy0ür0ük0üd0ü]0üV0üO0üH0üA0ü:0ü30ü,0ü%0ü0ü0ü0ü 0ü0üû/üô/üí/üæ/üß/üØ/üÑ/üÊ/üÃ/ü¼/üµ/ü®/ü§/ü /ü™/ü’/ü‹/ü„/ü}/üv/üo/üh/üa/üZ/üS/üL/üE/ü>/ü7/ü0/ü)/ü"/ü/ü/ü /ü/üÿ.üø.üñ.üê.üã.üÜ.üÕ.üÎ.üÇ.üÀ.ü¹.ü².ü«.ü¤.ü.ü–.ü.üˆ.ü.üz.üs.ül.üe.ü^.üW.üP.üI.üB.ü;.ü4.ü-.ü&.ü.ü.ü.ü .ü.üü-üõ-üî-üç-üà-üÙ-üÒ-üË-üÄ-ü½-ü¶-ü¯-ü¨-ü¡-üš-ü“-üŒ-ü…-ü~-üw-üp-üi-üb-ü[-üT-üM-üF-ü?-ü8-ü1-ü*-ü#-ü-ü-ü-ü-ü-üù,üò,üë,üä,üÝ,üÖ,üÏ,üÈ,üÁ,üº,ü³,ü¬,ü¥,üž,ü—,ü,ü‰,ü‚,ü{,üt,üm,üf,ü_,üX,üQ,üJ,üC,ü<,ü5,ü.,ü',ü ,ü,ü,ü ,ü,üý+üö+üï+üè+üá+üÚ+üÓ+üÌ+üÅ+ü¾+ü·+ü°+ü©+ü¢+ü›+ü”+ü+ü†+ü+üx+üq+üj+üc+ü\+üU+üN+üG+ü@+ü9+ü2+ü++ü$+ü+ü+ü+ü+ü+üú*üó*üì*üå*üÞ*ü×*üÐ*üÉ*üÂ*ü»*ü´*ü­*ü¦*üŸ*ü˜*ü‘*üŠ*üƒ*ü|*üu*ün*üg*ü`*üY*üR*üK*üD*ü=*ü6*ü/*ü(*ü!*ü*ü*ü *ü*üþ)ü÷)üð)üé)üâ)üÛ)üÔ)üÍ)üÆ)ü¿)ü¸)ü±)üª)ü£)üœ)ü•)üŽ)ü‡)ü€)üy)ür)ük)üd)ü])üV)üO)üH)üA)ü:)ü3)ü,)ü%)ü)ü)ü)ü )ü)üû(üô(üí(üæ(üß(üØ(üÑ(üÊ(üÃ(ü¼(üµ(ü®(ü§(ü (ü™(ü’(ü‹(ü„(ü}(üv(üo(üh(üa(üZ(üS(üL(üE(ü>(ü7(ü0(ü)(ü"(ü(ü(ü (ü(üÿ'üø'üñ'üê'üã'üÜ'üÕ'üÎ'üÇ'üÀ'ü¹'ü²'ü«'ü¤'ü'ü–'ü'üˆ'ü'üz'üs'ül'üe'ü^'üW'üP'üI'üB'ü;'ü4'ü-'ü&'ü'ü'ü'ü 'ü'üü&üõ&üî&üç&üà&üÙ&üÒ&üË&üÄ&ü½&ü¶&ü¯&ü¨&ü¡&üš&ü“&üŒ&ü…&ü~&üw&üp&üi&üb&ü[&üT&üM&üF&ü?&ü8&ü1&ü*&ü#&ü&ü&ü&ü&ü&üù%üò%üë%üä%üÝ%üÖ%üÏ%üÈ%üÁ%üº%ü³%ü¬%ü¥%üž%ü—%ü%ü‰%ü‚%ü{%üt%üm%üf%ü_%üX%üQ%üJ%üC%ü<%ü5%ü.%ü'%ü %ü%ü%ü %ü%üý$üö$üï$üè$üá$üÚ$üÓ$üÌ$üÅ$ü¾$ü·$ü°$ü©$ü¢$ü›$ü”$ü$ü†$ü$üx$üq$üj$üc$ü\$üU$üN$üG$ü@$ü9$ü2$ü+$ü$$ü$ü$ü$ü$ü$üú#üó#üì#üå#üÞ#ü×#üÐ#üÉ#üÂ#ü»#ü´#ü­#ü¦#üŸ#ü˜#ü‘#üŠ#üƒ#ü|#üu#ün#üg#ü`#üY#üR#üK#üD#ü=#ü6#ü/#ü(#ü!#ü#ü#ü #ü#üþ"ü÷"üð"üé"üâ"üÛ"üÔ"üÍ"üÆ"ü¿"ü¸"ü±"üª"ü£"üœ"ü•"üŽ"ü‡"ü€"üy"ür"ük"üd"ü]"üV"üO"üH"üA"ü:"ü3"ü,"ü%"ü"ü"ü"ü "ü"üû!üô!üí!üæ!üß!üØ!üÑ!üÊ!üÃ!ü¼!üµ!ü®!ü§!ü !ü™!ü’!ü‹!ü„!ü}!üv!üo!üh!üa!üZ!üS!üL!üE!ü>!ü7!ü0!ü)!ü"!ü!ü!ü !ü!üÿ üø üñ üê üã üÜ üÕ üÎ üÇ üÀ ü¹ ü² ü« ü¤ ü ü– ü üˆ ü üz üs ül üe ü^ üW üP üI üB ü; ü4 ü- ü& ü ü ü ü ü üüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþ ü÷ üð üé üâ üÛ üÔ üÍ üÆ ü¿ ü¸ ü± üª ü£ üœ ü• üŽ ü‡ ü€ üy ür ük üd ü] üV üO üH üA ü: ü3 ü, ü% ü ü ü ü ü üû üô üí üæ üß üØ üÑ üÊ üà ü¼ üµ ü® ü§ ü  ü™ ü’ ü‹ ü„ ü} üv üo üh üa üZ üS üL üE ü> ü7 ü0 ü) ü" ü ü ü ü üÿ üø üñ üê üã üÜ üÕ üÎ üÇ üÀ ü¹ ü² ü« ü¤ ü ü– ü üˆ ü üz üs ül üe ü^ üW üP üI üB ü; ü4 ü- ü& ü ü ü ü ü üü üõ üî üç üà üÙ üÒ üË üÄ ü½ ü¶ ü¯ ü¨ ü¡ üš ü“ üŒ ü… ü~ üw üp üi üb ü[ üT üM üF ü? ü8 ü1 ü* ü# ü ü ü ü ü üù üò üë üä üÝ üÖ üÏ üÈ üÁ üº ü³ ü¬ ü¥ üž ü— ü ü‰ ü‚ ü{ üt üm üf ü_ üX üQ üJ üC ü< ü5 ü. ü' ü ü ü ü ü üýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþÿû÷ÿûðÿûéÿûâÿûÛÿûÔÿûÍÿûÆÿû¿ÿû¸ÿû±ÿûªÿû£ÿûœÿû•ÿûŽÿû‡ÿû€ÿûyÿûrÿûkÿûdÿû]ÿûVÿûOÿûHÿûAÿû:ÿû3ÿû,ÿû%ÿûÿûÿûÿû ÿûÿûûþûôþûíþûæþûßþûØþûÑþûÊþûÃþû¼þûµþû®þû§þû þû™þû’þû‹þû„þû}þûvþûoþûhþûaþûZþûSþûLþûEþû>þû7þû0þû)þû"þûþûþû þûþûÿýûøýûñýûêýûãýûÜýûÕýûÎýûÇýûÀýû¹ýû²ýû«ýû¤ýûýû–ýûýûˆýûýûzýûsýûlýûeýû^ýûWýûPýûIýûBýû;ýû4ýû-ýû&ýûýûýûýû ýûýûüüûõüûîüûçüûàüûÙüûÒüûËüûÄüû½üû¶üû¯üû¨üû¡üûšüû“üûŒüû…üû~üûwüûpüûiüûbüû[üûTüûMüûFüû?üû8üû1üû*üû#üûüûüûüûüûüûùûûòûûëûûäûûÝûûÖûûÏûûÈûûÁûûºûû³ûû¬ûû¥ûûžûû—ûûûû‰ûû‚ûû{ûûtûûmûûfûû_ûûXûûQûûJûûCûû<ûû5ûû.ûû'ûû ûûûûûû ûûûûýúûöúûïúûèúûáúûÚúûÓúûÌúûÅúû¾úû·úû°úû©úû¢úû›úû”úûúû†úûúûxúûqúûjúûcúû\úûUúûNúûGúû@úû9úû2úû+úû$úûúûúûúûúûúûúùûóùûìùûåùûÞùû×ùûÐùûÉùûÂùû»ùû´ùû­ùû¦ùûŸùû˜ùû‘ùûŠùûƒùû|ùûuùûnùûgùû`ùûYùûRùûKùûDùû=ùû6ùû/ùû(ùû!ùûùûùû ùûùûþøû÷øûðøûéøûâøûÛøûÔøûÍøûÆøû¿øû¸øû±øûªøû£øûœøû•øûŽøû‡øû€øûyøûrøûkøûdøû]øûVøûOøûHøûAøû:øû3øû,øû%øûøûøûøû øûøûû÷ûô÷ûí÷ûæ÷ûß÷ûØ÷ûÑ÷ûÊ÷ûÃ÷û¼÷ûµ÷û®÷û§÷û ÷û™÷û’÷û‹÷û„÷û}÷ûv÷ûo÷ûh÷ûa÷ûZ÷ûS÷ûL÷ûE÷û>÷û7÷û0÷û)÷û"÷û÷û÷û ÷û÷ûÿöûøöûñöûêöûãöûÜöûÕöûÎöûÇöûÀöû¹öû²öû«öû¤öûöû–öûöûˆöûöûzöûsöûlöûeöû^öûWöûPöûIöûBöû;öû4öû-öû&öûöûöûöû öûöûüõûõõûîõûçõûàõûÙõûÒõûËõûÄõû½õû¶õû¯õû¨õû¡õûšõû“õûŒõû…õû~õûwõûpõûiõûbõû[õûTõûMõûFõû?õû8õû1õû*õû#õûõûõûõûõûõûùôûòôûëôûäôûÝôûÖôûÏôûÈôûÁôûºôû³ôû¬ôû¥ôûžôû—ôûôû‰ôû‚ôû{ôûtôûmôûfôû_ôûXôûQôûJôûCôû<ôû5ôû.ôû'ôû ôûôûôû ôûôûýóûöóûïóûèóûáóûÚóûÓóûÌóûÅóû¾óû·óû°óû©óû¢óû›óû”óûóû†óûóûxóûqóûjóûcóû\óûUóûNóûGóû@óû9óû2óû+óû$óûóûóûóûóûóûúòûóòûìòûåòûÞòû×òûÐòûÉòûÂòû»òû´òû­òû¦òûŸòû˜òû‘òûŠòûƒòû|òûuòûnòûgòû`òûYòûRòûKòûDòû=òû6òû/òû(òû!òûòûòû òûòûþñû÷ñûðñûéñûâñûÛñûÔñûÍñûÆñû¿ñû¸ñû±ñûªñû£ñûœñû•ñûŽñû‡ñû€ñûyñûrñûkñûdñû]ñûVñûOñûHñûAñû:ñû3ñû,ñû%ñûñûñûñû ñûñûûðûôðûíðûæðûßðûØðûÑðûÊðûÃðû¼ðûµðû®ðû§ðû ðû™ðû’ðû‹ðû„ðû}ðûvðûoðûhðûaðûZðûSðûLðûEðû>ðû7ðû0ðû)ðû"ðûðûðû ðûðûÿïûøïûñïûêïûãïûÜïûÕïûÎïûÇïûÀïû¹ïû²ïû«ïû¤ïûïû–ïûïûˆïûïûzïûsïûlïûeïû^ïûWïûPïûIïûBïû;ïû4ïû-ïû&ïûïûïûïû ïûïûüîûõîûîîûçîûàîûÙîûÒîûËîûÄîû½îû¶îû¯îû¨îû¡îûšîû“îûŒîû…îû~îûwîûpîûiîûbîû[îûTîûMîûFîû?îû8îû1îû*îû#îûîûîûîûîûîûùíûòíûëíûäíûÝíûÖíûÏíûÈíûÁíûºíû³íû¬íû¥íûžíû—íûíû‰íû‚íû{íûtíûmíûfíû_íûXíûQíûJíûCíû<íû5íû.íû'íû íûíûíû íûíûýìûöìûïìûèìûáìûÚìûÓìûÌìûÅìû¾ìû·ìû°ìû©ìû¢ìû›ìû”ìûìû†ìûìûxìûqìûjìûcìû\ìûUìûNìûGìû@ìû9ìû2ìû+ìû$ìûìûìûìûìûìûúëûóëûìëûåëûÞëû×ëûÐëûÉëûÂëû»ëû´ëû­ëû¦ëûŸëû˜ëû‘ëûŠëûƒëû|ëûuëûnëûgëû`ëûYëûRëûKëûDëû=ëû6ëû/ëû(ëû!ëûëûëû ëûëûþêû÷êûðêûéêûâêûÛêûÔêûÍêûÆêû¿êû¸êû±êûªêû£êûœêû•êûŽêû‡êû€êûyêûrêûkêûdêû]êûVêûOêûHêûAêû:êû3êû,êû%êûêûêûêû êûêûûéûôéûíéûæéûßéûØéûÑéûÊéûÃéû¼éûµéû®éû§éû éû™éû’éû‹éû„éû}éûvéûoéûhéûaéûZéûSéûLéûEéû>éû7éû0éû)éû"éûéûéû éûéûÿèûøèûñèûêèûãèûÜèûÕèûÎèûÇèûÀèû¹èû²èû«èû¤èûèû–èûèûˆèûèûzèûsèûlèûeèû^èûWèûPèûIèûBèû;èû4èû-èû&èûèûèûèû èûèûüçûõçûîçûççûàçûÙçûÒçûËçûÄçû½çû¶çû¯çû¨çû¡çûšçû“çûŒçû…çû~çûwçûpçûiçûbçû[çûTçûMçûFçû?çû8çû1çû*çû#çûçûçûçûçûçûùæûòæûëæûäæûÝæûÖæûÏæûÈæûÁæûºæû³æû¬æû¥æûžæû—æûæû‰æû‚æû{æûtæûmæûfæû_æûXæûQæûJæûCæû<æû5æû.æû'æû æûæûæû æûæûýåûöåûïåûèåûáåûÚåûÓåûÌåûÅåû¾åû·åû°åû©åû¢åû›åû”åûåû†åûåûxåûqåûjåûcåû\åûUåûNåûGåû@åû9åû2åû+åû$åûåûåûåûåûåûúäûóäûìäûåäûÞäû×äûÐäûÉäûÂäû»äû´äû­äû¦äûŸäû˜äû‘äûŠäûƒäû|äûuäûnäûgäû`äûYäûRäûKäûDäû=äû6äû/äû(äû!äûäûäû äûäûþãû÷ãûðãûéãûâãûÛãûÔãûÍãûÆãû¿ãû¸ãû±ãûªãû£ãûœãû•ãûŽãû‡ãû€ãûyãûrãûkãûdãû]ãûVãûOãûHãûAãû:ãû3ãû,ãû%ãûãûãûãû ãûãûûâûôâûíâûæâûßâûØâûÑâûÊâûÃâû¼âûµâû®âû§âû âû™âû’âû‹âû„âû}âûvâûoâûhâûaâûZâûSâûLâûEâû>âû7âû0âû)âû"âûâûâû âûâûÿáûøáûñáûêáûãáûÜáûÕáûÎáûÇáûÀáû¹áû²áû«áû¤áûáû–áûáûˆáûáûzáûsáûláûeáû^áûWáûPáûIáûBáû;áû4áû-áû&áûáûáûáû áûáûüàûõàûîàûçàûààûÙàûÒàûËàûÄàû½àû¶àû¯àû¨àû¡àûšàû“àûŒàû…àû~àûwàûpàûiàûbàû[àûTàûMàûFàû?àû8àû1àû*àû#àûàûàûàûàûàûùßûòßûëßûäßûÝßûÖßûÏßûÈßûÁßûºßû³ßû¬ßû¥ßûžßû—ßûßû‰ßû‚ßû{ßûtßûmßûfßû_ßûXßûQßûJßûCßû<ßû5ßû.ßû'ßû ßûßûßû ßûßûýÞûöÞûïÞûèÞûáÞûÚÞûÓÞûÌÞûÅÞû¾Þû·Þû°Þû©Þû¢Þû›Þû”ÞûÞû†ÞûÞûxÞûqÞûjÞûcÞû\ÞûUÞûNÞûGÞû@Þû9Þû2Þû+Þû$ÞûÞûÞûÞûÞûÞûúÝûóÝûìÝûåÝûÞÝû×ÝûÐÝûÉÝûÂÝû»Ýû´Ýû­Ýû¦ÝûŸÝû˜Ýû‘ÝûŠÝûƒÝû|ÝûuÝûnÝûgÝû`ÝûYÝûRÝûKÝûDÝû=Ýû6Ýû/Ýû(Ýû!ÝûÝûÝû ÝûÝûþÜû÷ÜûðÜûéÜûâÜûÛÜûÔÜûÍÜûÆÜû¿Üû¸Üû±ÜûªÜû£ÜûœÜû•ÜûŽÜû‡Üû€ÜûyÜûrÜûkÜûdÜû]ÜûVÜûOÜûHÜûAÜû:Üû3Üû,Üû%ÜûÜûÜûÜû ÜûÜûûÛûôÛûíÛûæÛûßÛûØÛûÑÛûÊÛûÃÛû¼ÛûµÛû®Ûû§Ûû Ûû™Ûû’Ûû‹Ûû„Ûû}ÛûvÛûoÛûhÛûaÛûZÛûSÛûLÛûEÛû>Ûû7Ûû0Ûû)Ûû"ÛûÛûÛû ÛûÛûÿÚûøÚûñÚûêÚûãÚûÜÚûÕÚûÎÚûÇÚûÀÚû¹Úû²Úû«Úû¤ÚûÚû–ÚûÚûˆÚûÚûzÚûsÚûlÚûeÚû^ÚûWÚûPÚûIÚûBÚû;Úû4Úû-Úû&ÚûÚûÚûÚû ÚûÚûüÙûõÙûîÙûçÙûàÙûÙÙûÒÙûËÙûÄÙû½Ùû¶Ùû¯Ùû¨Ùû¡ÙûšÙû“ÙûŒÙû…Ùû~ÙûwÙûpÙûiÙûbÙû[ÙûTÙûMÙûFÙû?Ùû8Ùû1Ùû*Ùû#ÙûÙûÙûÙûÙûÙûùØûòØûëØûäØûÝØûÖØûÏØûÈØûÁØûºØû³Øû¬Øû¥ØûžØû—ØûØû‰Øû‚Øû{ØûtØûmØûfØû_ØûXØûQØûJØûCØû<Øû5Øû.Øû'Øû ØûØûØû ØûØûý×ûö×ûï×ûè×ûá×ûÚ×ûÓ×ûÌ×ûÅ×û¾×û·×û°×û©×û¢×û›×û”×û×û†×û×ûx×ûq×ûj×ûc×û\×ûU×ûN×ûG×û@×û9×û2×û+×û$×û×û×û×û×û×ûúÖûóÖûìÖûåÖûÞÖû×ÖûÐÖûÉÖûÂÖû»Öû´Öû­Öû¦ÖûŸÖû˜Öû‘ÖûŠÖûƒÖû|ÖûuÖûnÖûgÖû`ÖûYÖûRÖûKÖûDÖû=Öû6Öû/Öû(Öû!ÖûÖûÖû ÖûÖûþÕû÷ÕûðÕûéÕûâÕûÛÕûÔÕûÍÕûÆÕû¿Õû¸Õû±ÕûªÕû£ÕûœÕû•ÕûŽÕû‡Õû€ÕûyÕûrÕûkÕûdÕû]ÕûVÕûOÕûHÕûAÕû:Õû3Õû,Õû%ÕûÕûÕûÕû ÕûÕûûÔûôÔûíÔûæÔûßÔûØÔûÑÔûÊÔûÃÔû¼ÔûµÔû®Ôû§Ôû Ôû™Ôû’Ôû‹Ôû„Ôû}ÔûvÔûoÔûhÔûaÔûZÔûSÔûLÔûEÔû>Ôû7Ôû0Ôû)Ôû"ÔûÔûÔû ÔûÔûÿÓûøÓûñÓûêÓûãÓûÜÓûÕÓûÎÓûÇÓûÀÓû¹Óû²Óû«Óû¤ÓûÓû–ÓûÓûˆÓûÓûzÓûsÓûlÓûeÓû^ÓûWÓûPÓûIÓûBÓû;Óû4Óû-Óû&ÓûÓûÓûÓû ÓûÓûüÒûõÒûîÒûçÒûàÒûÙÒûÒÒûËÒûÄÒû½Òû¶Òû¯Òû¨Òû¡ÒûšÒû“ÒûŒÒû…Òû~ÒûwÒûpÒûiÒûbÒû[ÒûTÒûMÒûFÒû?Òû8Òû1Òû*Òû#ÒûÒûÒûÒûÒûÒûùÑûòÑûëÑûäÑûÝÑûÖÑûÏÑûÈÑûÁÑûºÑû³Ñû¬Ñû¥ÑûžÑû—ÑûÑû‰Ñû‚Ñû{ÑûtÑûmÑûfÑû_ÑûXÑûQÑûJÑûCÑû<Ñû5Ñû.Ñû'Ñû ÑûÑûÑû ÑûÑûýÐûöÐûïÐûèÐûáÐûÚÐûÓÐûÌÐûÅÐû¾Ðû·Ðû°Ðû©Ðû¢Ðû›Ðû”ÐûÐû†ÐûÐûxÐûqÐûjÐûcÐû\ÐûUÐûNÐûGÐû@Ðû9Ðû2Ðû+Ðû$ÐûÐûÐûÐûÐûÐûúÏûóÏûìÏûåÏûÞÏû×ÏûÐÏûÉÏûÂÏû»Ïû´Ïû­Ïû¦ÏûŸÏû˜Ïû‘ÏûŠÏûƒÏû|ÏûuÏûnÏûgÏû`ÏûYÏûRÏûKÏûDÏû=Ïû6Ïû/Ïû(Ïû!ÏûÏûÏû ÏûÏûþÎû÷ÎûðÎûéÎûâÎûÛÎûÔÎûÍÎûÆÎû¿Îû¸Îû±ÎûªÎû£ÎûœÎû•ÎûŽÎû‡Îû€ÎûyÎûrÎûkÎûdÎû]ÎûVÎûOÎûHÎûAÎû:Îû3Îû,Îû%ÎûÎûÎûÎû ÎûÎûûÍûôÍûíÍûæÍûßÍûØÍûÑÍûÊÍûÃÍû¼ÍûµÍû®Íû§Íû Íû™Íû’Íû‹Íû„Íû}ÍûvÍûoÍûhÍûaÍûZÍûSÍûLÍûEÍû>Íû7Íû0Íû)Íû"ÍûÍûÍû ÍûÍûÿÌûøÌûñÌûêÌûãÌûÜÌûÕÌûÎÌûÇÌûÀÌû¹Ìû²Ìû«Ìû¤ÌûÌû–ÌûÌûˆÌûÌûzÌûsÌûlÌûeÌû^ÌûWÌûPÌûIÌûBÌû;Ìû4Ìû-Ìû&ÌûÌûÌûÌû ÌûÌûüËûõËûîËûçËûàËûÙËûÒËûËËûÄËû½Ëû¶Ëû¯Ëû¨Ëû¡ËûšËû“ËûŒËû…Ëû~ËûwËûpËûiËûbËû[ËûTËûMËûFËû?Ëû8Ëû1Ëû*Ëû#ËûËûËûËûËûËûùÊûòÊûëÊûäÊûÝÊûÖÊûÏÊûÈÊûÁÊûºÊû³Êû¬Êû¥ÊûžÊû—ÊûÊû‰Êû‚Êû{ÊûtÊûmÊûfÊû_ÊûXÊûQÊûJÊûCÊû<Êû5Êû.Êû'Êû ÊûÊûÊû ÊûÊûýÉûöÉûïÉûèÉûáÉûÚÉûÓÉûÌÉûÅÉû¾Éû·Éû°Éû©Éû¢Éû›Éû”ÉûÉû†ÉûÉûxÉûqÉûjÉûcÉû\ÉûUÉûNÉûGÉû@Éû9Éû2Éû+Éû$ÉûÉûÉûÉûÉûÉûúÈûóÈûìÈûåÈûÞÈû×ÈûÐÈûÉÈûÂÈû»Èû´Èû­Èû¦ÈûŸÈû˜Èû‘ÈûŠÈûƒÈû|ÈûuÈûnÈûgÈû`ÈûYÈûRÈûKÈûDÈû=Èû6Èû/Èû(Èû!ÈûÈûÈû ÈûÈûþÇû÷ÇûðÇûéÇûâÇûÛÇûÔÇûÍÇûÆÇû¿Çû¸Çû±ÇûªÇû£ÇûœÇû•ÇûŽÇû‡Çû€ÇûyÇûrÇûkÇûdÇû]ÇûVÇûOÇûHÇûAÇû:Çû3Çû,Çû%ÇûÇûÇûÇû ÇûÇûûÆûôÆûíÆûæÆû߯ûØÆûÑÆûÊÆûÃÆû¼ÆûµÆû®Æû§Æû Æû™Æû’Æû‹Æû„Æû}ÆûvÆûoÆûhÆûaÆûZÆûSÆûLÆûEÆû>Æû7Æû0Æû)Æû"ÆûÆûÆû ÆûÆûÿÅûøÅûñÅûêÅûãÅûÜÅûÕÅûÎÅûÇÅûÀÅû¹Åû²Åû«Åû¤ÅûÅû–ÅûÅûˆÅûÅûzÅûsÅûlÅûeÅû^ÅûWÅûPÅûIÅûBÅû;Åû4Åû-Åû&ÅûÅûÅûÅû ÅûÅûüÄûõÄûîÄûçÄûàÄûÙÄûÒÄûËÄûÄÄû½Äû¶Äû¯Äû¨Äû¡ÄûšÄû“ÄûŒÄû…Äû~ÄûwÄûpÄûiÄûbÄû[ÄûTÄûMÄûFÄû?Äû8Äû1Äû*Äû#ÄûÄûÄûÄûÄûÄûùÃûòÃûëÃûäÃûÝÃûÖÃûÏÃûÈÃûÁÃûºÃû³Ãû¬Ãû¥ÃûžÃû—ÃûÃû‰Ãû‚Ãû{ÃûtÃûmÃûfÃû_ÃûXÃûQÃûJÃûCÃû<Ãû5Ãû.Ãû'Ãû ÃûÃûÃû ÃûÃûýÂûöÂûïÂûèÂûáÂûÚÂûÓÂûÌÂûÅÂû¾Âû·Âû°Âû©Âû¢Âû›Âû”ÂûÂû†ÂûÂûxÂûqÂûjÂûcÂû\ÂûUÂûNÂûGÂû@Âû9Âû2Âû+Âû$ÂûÂûÂûÂûÂûÂûúÁûóÁûìÁûåÁûÞÁû×ÁûÐÁûÉÁûÂÁû»Áû´Áû­Áû¦ÁûŸÁû˜Áû‘ÁûŠÁûƒÁû|ÁûuÁûnÁûgÁû`ÁûYÁûRÁûKÁûDÁû=Áû6Áû/Áû(Áû!ÁûÁûÁû ÁûÁûþÀû÷ÀûðÀûéÀûâÀûÛÀûÔÀûÍÀûÆÀû¿Àû¸Àû±ÀûªÀû£ÀûœÀû•ÀûŽÀû‡Àû€ÀûyÀûrÀûkÀûdÀû]ÀûVÀûOÀûHÀûAÀû:Àû3Àû,Àû%ÀûÀûÀûÀû ÀûÀûû¿ûô¿ûí¿ûæ¿ûß¿ûØ¿ûÑ¿ûÊ¿ûÿû¼¿ûµ¿û®¿û§¿û ¿û™¿û’¿û‹¿û„¿û}¿ûv¿ûo¿ûh¿ûa¿ûZ¿ûS¿ûL¿ûE¿û>¿û7¿û0¿û)¿û"¿û¿û¿û ¿û¿ûÿ¾ûø¾ûñ¾ûê¾ûã¾ûܾûÕ¾ûξûǾûÀ¾û¹¾û²¾û«¾û¤¾û¾û–¾û¾ûˆ¾û¾ûz¾ûs¾ûl¾ûe¾û^¾ûW¾ûP¾ûI¾ûB¾û;¾û4¾û-¾û&¾û¾û¾û¾û ¾û¾ûü½ûõ½ûî½ûç½ûà½ûÙ½ûÒ½û˽ûĽû½½û¶½û¯½û¨½û¡½ûš½û“½ûŒ½û…½û~½ûw½ûp½ûi½ûb½û[½ûT½ûM½ûF½û?½û8½û1½û*½û#½û½û½û½û½û½ûù¼ûò¼ûë¼ûä¼ûݼûÖ¼ûϼûȼûÁ¼ûº¼û³¼û¬¼û¥¼ûž¼û—¼û¼û‰¼û‚¼û{¼ût¼ûm¼ûf¼û_¼ûX¼ûQ¼ûJ¼ûC¼û<¼û5¼û.¼û'¼û ¼û¼û¼û ¼û¼ûý»ûö»ûï»ûè»ûá»ûÚ»ûÓ»ûÌ»ûÅ»û¾»û·»û°»û©»û¢»û›»û”»û»û†»û»ûx»ûq»ûj»ûc»û\»ûU»ûN»ûG»û@»û9»û2»û+»û$»û»û»û»û»û»ûúºûóºûìºûåºûÞºû׺ûкûɺûºû»ºû´ºû­ºû¦ºûŸºû˜ºû‘ºûŠºûƒºû|ºûuºûnºûgºû`ºûYºûRºûKºûDºû=ºû6ºû/ºû(ºû!ºûºûºû ºûºûþ¹û÷¹ûð¹ûé¹ûâ¹ûÛ¹ûÔ¹û͹ûƹû¿¹û¸¹û±¹ûª¹û£¹ûœ¹û•¹û޹û‡¹û€¹ûy¹ûr¹ûk¹ûd¹û]¹ûV¹ûO¹ûH¹ûA¹û:¹û3¹û,¹û%¹û¹û¹û¹û ¹û¹ûû¸ûô¸ûí¸ûæ¸û߸ûظûѸûʸûøû¼¸ûµ¸û®¸û§¸û ¸û™¸û’¸û‹¸û„¸û}¸ûv¸ûo¸ûh¸ûa¸ûZ¸ûS¸ûL¸ûE¸û>¸û7¸û0¸û)¸û"¸û¸û¸û ¸û¸ûÿ·ûø·ûñ·ûê·ûã·ûÜ·ûÕ·ûηûÇ·ûÀ·û¹·û²·û«·û¤·û·û–·û·ûˆ·û·ûz·ûs·ûl·ûe·û^·ûW·ûP·ûI·ûB·û;·û4·û-·û&·û·û·û·û ·û·ûü¶ûõ¶ûî¶ûç¶ûà¶ûÙ¶ûÒ¶û˶ûĶû½¶û¶¶û¯¶û¨¶û¡¶ûš¶û“¶ûŒ¶û…¶û~¶ûw¶ûp¶ûi¶ûb¶û[¶ûT¶ûM¶ûF¶û?¶û8¶û1¶û*¶û#¶û¶û¶û¶û¶û¶ûùµûòµûëµûäµûݵûÖµûϵûȵûÁµûºµû³µû¬µû¥µûžµû—µûµû‰µû‚µû{µûtµûmµûfµû_µûXµûQµûJµûCµû<µû5µû.µû'µû µûµûµû µûµûý´ûö´ûï´ûè´ûá´ûÚ´ûÓ´ûÌ´ûÅ´û¾´û·´û°´û©´û¢´û›´û”´û´û†´û´ûx´ûq´ûj´ûc´û\´ûU´ûN´ûG´û@´û9´û2´û+´û$´û´û´û´û´û´ûú³ûó³ûì³ûå³ûÞ³û׳ûгûɳû³û»³û´³û­³û¦³ûŸ³û˜³û‘³ûгûƒ³û|³ûu³ûn³ûg³û`³ûY³ûR³ûK³ûD³û=³û6³û/³û(³û!³û³û³û ³û³ûþ²û÷²ûð²ûé²ûâ²ûÛ²ûÔ²ûͲûƲû¿²û¸²û±²ûª²û£²ûœ²û•²û޲û‡²û€²ûy²ûr²ûk²ûd²û]²ûV²ûO²ûH²ûA²û:²û3²û,²û%²û²û²û²û ²û²ûû±ûô±ûí±ûæ±ûß±ûرûѱûʱûñû¼±ûµ±û®±û§±û ±û™±û’±û‹±û„±û}±ûv±ûo±ûh±ûa±ûZ±ûS±ûL±ûE±û>±û7±û0±û)±û"±û±û±û ±û±ûÿ°ûø°ûñ°ûê°ûã°ûܰûÕ°ûΰûǰûÀ°û¹°û²°û«°û¤°û°û–°û°ûˆ°û°ûz°ûs°ûl°ûe°û^°ûW°ûP°ûI°ûB°û;°û4°û-°û&°û°û°û°û °û°ûü¯ûõ¯ûî¯ûç¯ûà¯ûÙ¯ûÒ¯û˯ûįû½¯û¶¯û¯¯û¨¯û¡¯ûš¯û“¯ûŒ¯û…¯û~¯ûw¯ûp¯ûi¯ûb¯û[¯ûT¯ûM¯ûF¯û?¯û8¯û1¯û*¯û#¯û¯û¯û¯û¯û¯ûù®ûò®ûë®ûä®ûÝ®ûÖ®ûÏ®ûÈ®ûÁ®ûº®û³®û¬®û¥®ûž®û—®û®û‰®û‚®û{®ût®ûm®ûf®û_®ûX®ûQ®ûJ®ûC®û<®û5®û.®û'®û ®û®û®û ®û®ûý­ûö­ûï­ûè­ûá­ûÚ­ûÓ­ûÌ­ûÅ­û¾­û·­û°­û©­û¢­û›­û”­û­û†­û­ûx­ûq­ûj­ûc­û\­ûU­ûN­ûG­û@­û9­û2­û+­û$­û­û­û­û­û­ûú¬ûó¬ûì¬ûå¬ûÞ¬û׬ûЬûɬû¬û»¬û´¬û­¬û¦¬ûŸ¬û˜¬û‘¬ûЬûƒ¬û|¬ûu¬ûn¬ûg¬û`¬ûY¬ûR¬ûK¬ûD¬û=¬û6¬û/¬û(¬û!¬û¬û¬û ¬û¬ûþ«û÷«ûð«ûé«ûâ«ûÛ«ûÔ«ûÍ«ûÆ«û¿«û¸«û±«ûª«û£«ûœ«û•«ûŽ«û‡«û€«ûy«ûr«ûk«ûd«û]«ûV«ûO«ûH«ûA«û:«û3«û,«û%«û«û«û«û «û«ûûªûôªûíªûæªûߪûتûѪûʪûêû¼ªûµªû®ªû§ªû ªû™ªû’ªû‹ªû„ªû}ªûvªûoªûhªûaªûZªûSªûLªûEªû>ªû7ªû0ªû)ªû"ªûªûªû ªûªûÿ©ûø©ûñ©ûê©ûã©ûÜ©ûÕ©ûΩûÇ©ûÀ©û¹©û²©û«©û¤©û©û–©û©ûˆ©û©ûz©ûs©ûl©ûe©û^©ûW©ûP©ûI©ûB©û;©û4©û-©û&©û©û©û©û ©û©ûü¨ûõ¨ûî¨ûç¨ûà¨ûÙ¨ûÒ¨û˨ûĨû½¨û¶¨û¯¨û¨¨û¡¨ûš¨û“¨ûŒ¨û…¨û~¨ûw¨ûp¨ûi¨ûb¨û[¨ûT¨ûM¨ûF¨û?¨û8¨û1¨û*¨û#¨û¨û¨û¨û¨û¨ûù§ûò§ûë§ûä§ûݧûÖ§ûϧûȧûÁ§ûº§û³§û¬§û¥§ûž§û—§û§û‰§û‚§û{§ût§ûm§ûf§û_§ûX§ûQ§ûJ§ûC§û<§û5§û.§û'§û §û§û§û §û§ûý¦ûö¦ûï¦ûè¦ûá¦ûÚ¦ûÓ¦û̦ûŦû¾¦û·¦û°¦û©¦û¢¦û›¦û”¦û¦û†¦û¦ûx¦ûq¦ûj¦ûc¦û\¦ûU¦ûN¦ûG¦û@¦û9¦û2¦û+¦û$¦û¦û¦û¦û¦û¦ûú¥ûó¥ûì¥ûå¥ûÞ¥û×¥ûÐ¥ûÉ¥ûÂ¥û»¥û´¥û­¥û¦¥ûŸ¥û˜¥û‘¥ûŠ¥ûƒ¥û|¥ûu¥ûn¥ûg¥û`¥ûY¥ûR¥ûK¥ûD¥û=¥û6¥û/¥û(¥û!¥û¥û¥û ¥û¥ûþ¤û÷¤ûð¤ûé¤ûâ¤ûÛ¤ûÔ¤ûͤûƤû¿¤û¸¤û±¤ûª¤û£¤ûœ¤û•¤ûޤû‡¤û€¤ûy¤ûr¤ûk¤ûd¤û]¤ûV¤ûO¤ûH¤ûA¤û:¤û3¤û,¤û%¤û¤û¤û¤û ¤û¤ûû£ûô£ûí£ûæ£ûߣûØ£ûÑ£ûÊ£ûãû¼£ûµ£û®£û§£û £û™£û’£û‹£û„£û}£ûv£ûo£ûh£ûa£ûZ£ûS£ûL£ûE£û>£û7£û0£û)£û"£û£û£û £û£ûÿ¢ûø¢ûñ¢ûê¢ûã¢ûÜ¢ûÕ¢û΢ûÇ¢ûÀ¢û¹¢û²¢û«¢û¤¢û¢û–¢û¢ûˆ¢û¢ûz¢ûs¢ûl¢ûe¢û^¢ûW¢ûP¢ûI¢ûB¢û;¢û4¢û-¢û&¢û¢û¢û¢û ¢û¢ûü¡ûõ¡ûî¡ûç¡ûà¡ûÙ¡ûÒ¡ûË¡ûÄ¡û½¡û¶¡û¯¡û¨¡û¡¡ûš¡û“¡ûŒ¡û…¡û~¡ûw¡ûp¡ûi¡ûb¡û[¡ûT¡ûM¡ûF¡û?¡û8¡û1¡û*¡û#¡û¡û¡û¡û¡û¡ûù ûò ûë ûä ûÝ ûÖ ûÏ ûÈ ûÁ ûº û³ û¬ û¥ ûž û— û û‰ û‚ û{ ût ûm ûf û_ ûX ûQ ûJ ûC û< û5 û. û' û  û û û  û ûýŸûöŸûïŸûèŸûáŸûÚŸûÓŸûÌŸûÅŸû¾Ÿû·Ÿû°Ÿû©Ÿû¢Ÿû›Ÿû”ŸûŸû†ŸûŸûxŸûqŸûjŸûcŸû\ŸûUŸûNŸûGŸû@Ÿû9Ÿû2Ÿû+Ÿû$ŸûŸûŸûŸûŸûŸûúžûóžûìžûåžûÞžûמûОûÉžûžû»žû´žû­žû¦žûŸžû˜žû‘žûŠžûƒžû|žûužûnžûgžû`žûYžûRžûKžûDžû=žû6žû/žû(žû!žûžûžû žûžûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûœûôœûíœûæœûßœûØœûÑœûÊœûÜû¼œûµœû®œû§œû œû™œû’œû‹œû„œû}œûvœûoœûhœûaœûZœûSœûLœûEœû>œû7œû0œû)œû"œûœûœû œûœûÿ›ûø›ûñ›ûê›ûã›ûÜ›ûÕ›ûΛûÇ›ûÀ›û¹›û²›û«›û¤›û›û–›û›ûˆ›û›ûz›ûs›ûl›ûe›û^›ûW›ûP›ûI›ûB›û;›û4›û-›û&›û›û›û›û ›û›ûüšûõšûîšûçšûàšûÙšûÒšûËšûÄšû½šû¶šû¯šû¨šû¡šûššû“šûŒšû…šû~šûwšûpšûišûbšû[šûTšûMšûFšû?šû8šû1šû*šû#šûšûšûšûšûšûù™ûò™ûë™ûä™ûÝ™ûÖ™ûÏ™ûÈ™ûÁ™ûº™û³™û¬™û¥™ûž™û—™û™û‰™û‚™û{™ût™ûm™ûf™û_™ûX™ûQ™ûJ™ûC™û<™û5™û.™û'™û ™û™û™û ™û™ûý˜ûö˜ûï˜ûè˜ûá˜ûÚ˜ûÓ˜û̘ûŘû¾˜û·˜û°˜û©˜û¢˜û›˜û”˜û˜û†˜û˜ûx˜ûq˜ûj˜ûc˜û\˜ûU˜ûN˜ûG˜û@˜û9˜û2˜û+˜û$˜û˜û˜û˜û˜û˜ûú—ûó—ûì—ûå—ûÞ—û×—ûЗûÉ—û—û»—û´—û­—û¦—ûŸ—û˜—û‘—ûŠ—ûƒ—û|—ûu—ûn—ûg—û`—ûY—ûR—ûK—ûD—û=—û6—û/—û(—û!—û—û—û —û—ûþ–û÷–ûð–ûé–ûâ–ûÛ–ûÔ–ûÍ–ûÆ–û¿–û¸–û±–ûª–û£–ûœ–û•–ûŽ–û‡–û€–ûy–ûr–ûk–ûd–û]–ûV–ûO–ûH–ûA–û:–û3–û,–û%–û–û–û–û –û–ûû•ûô•ûí•ûæ•ûß•ûØ•ûÑ•ûÊ•ûÕû¼•ûµ•û®•û§•û •û™•û’•û‹•û„•û}•ûv•ûo•ûh•ûa•ûZ•ûS•ûL•ûE•û>•û7•û0•û)•û"•û•û•û •û•ûÿ”ûø”ûñ”ûê”ûã”ûÜ”ûÕ”ûΔûÇ”ûÀ”û¹”û²”û«”û¤”û”û–”û”ûˆ”û”ûz”ûs”ûl”ûe”û^”ûW”ûP”ûI”ûB”û;”û4”û-”û&”û”û”û”û ”û”ûü“ûõ“ûî“ûç“ûà“ûÙ“ûÒ“ûË“ûÄ“û½“û¶“û¯“û¨“û¡“ûš“û““ûŒ“û…“û~“ûw“ûp“ûi“ûb“û[“ûT“ûM“ûF“û?“û8“û1“û*“û#“û“û“û“û“û“ûù’ûò’ûë’ûä’ûÝ’ûÖ’ûÏ’ûÈ’ûÁ’ûº’û³’û¬’û¥’ûž’û—’û’û‰’û‚’û{’ût’ûm’ûf’û_’ûX’ûQ’ûJ’ûC’û<’û5’û.’û'’û ’û’û’û ’û’ûý‘ûö‘ûï‘ûè‘ûá‘ûÚ‘ûÓ‘ûÌ‘ûÅ‘û¾‘û·‘û°‘û©‘û¢‘û›‘û”‘û‘û†‘û‘ûx‘ûq‘ûj‘ûc‘û\‘ûU‘ûN‘ûG‘û@‘û9‘û2‘û+‘û$‘û‘û‘û‘û‘û‘ûúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûŽûôŽûíŽûæŽûߎûØŽûÑŽûÊŽûÃŽû¼ŽûµŽû®Žû§Žû Žû™Žû’Žû‹Žû„Žû}ŽûvŽûoŽûhŽûaŽûZŽûSŽûLŽûEŽû>Žû7Žû0Žû)Žû"ŽûŽûŽû ŽûŽûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüŒûõŒûîŒûçŒûàŒûÙŒûÒŒûËŒûÄŒû½Œû¶Œû¯Œû¨Œû¡ŒûšŒû“ŒûŒŒû…Œû~ŒûwŒûpŒûiŒûbŒû[ŒûTŒûMŒûFŒû?Œû8Œû1Œû*Œû#ŒûŒûŒûŒûŒûŒûù‹ûò‹ûë‹ûä‹ûÝ‹ûÖ‹ûÏ‹ûÈ‹ûÁ‹ûº‹û³‹û¬‹û¥‹ûž‹û—‹û‹û‰‹û‚‹û{‹ût‹ûm‹ûf‹û_‹ûX‹ûQ‹ûJ‹ûC‹û<‹û5‹û.‹û'‹û ‹û‹û‹û ‹û‹ûýŠûöŠûïŠûèŠûáŠûÚŠûÓŠûÌŠûÅŠû¾Šû·Šû°Šû©Šû¢Šû›Šû”ŠûŠû†ŠûŠûxŠûqŠûjŠûcŠû\ŠûUŠûNŠûGŠû@Šû9Šû2Šû+Šû$ŠûŠûŠûŠûŠûŠûú‰ûó‰ûì‰ûå‰ûÞ‰û׉ûЉûɉû‰û»‰û´‰û­‰û¦‰ûŸ‰û˜‰û‘‰ûЉûƒ‰û|‰ûu‰ûn‰ûg‰û`‰ûY‰ûR‰ûK‰ûD‰û=‰û6‰û/‰û(‰û!‰û‰û‰û ‰û‰ûþˆû÷ˆûðˆûéˆûâˆûÛˆûÔˆû͈ûƈû¿ˆû¸ˆû±ˆûªˆû£ˆûœˆû•ˆûŽˆû‡ˆû€ˆûyˆûrˆûkˆûdˆû]ˆûVˆûOˆûHˆûAˆû:ˆû3ˆû,ˆû%ˆûˆûˆûˆû ˆûˆûû‡ûô‡ûí‡ûæ‡û߇û؇ûчûʇûÇû¼‡ûµ‡û®‡û§‡û ‡û™‡û’‡û‹‡û„‡û}‡ûv‡ûo‡ûh‡ûa‡ûZ‡ûS‡ûL‡ûE‡û>‡û7‡û0‡û)‡û"‡û‡û‡û ‡û‡ûÿ†ûø†ûñ†ûê†ûã†û܆ûÕ†ûΆûdžûÀ†û¹†û²†û«†û¤†û†û–†û†ûˆ†û†ûz†ûs†ûl†ûe†û^†ûW†ûP†ûI†ûB†û;†û4†û-†û&†û†û†û†û †û†ûü…ûõ…ûî…ûç…ûà…ûÙ…ûÒ…ûË…ûÄ…û½…û¶…û¯…û¨…û¡…ûš…û“…ûŒ…û……û~…ûw…ûp…ûi…ûb…û[…ûT…ûM…ûF…û?…û8…û1…û*…û#…û…û…û…û…û…ûù„ûò„ûë„ûä„ûÝ„ûÖ„ûÏ„ûÈ„ûÁ„ûº„û³„û¬„û¥„ûž„û—„û„û‰„û‚„û{„ût„ûm„ûf„û_„ûX„ûQ„ûJ„ûC„û<„û5„û.„û'„û „û„û„û „û„ûýƒûöƒûïƒûèƒûáƒûÚƒûÓƒû̃ûŃû¾ƒû·ƒû°ƒû©ƒû¢ƒû›ƒû”ƒûƒû†ƒûƒûxƒûqƒûjƒûcƒû\ƒûUƒûNƒûGƒû@ƒû9ƒû2ƒû+ƒû$ƒûƒûƒûƒûƒûƒûú‚ûó‚ûì‚ûå‚ûÞ‚ûׂûЂûÉ‚û‚û»‚û´‚û­‚û¦‚ûŸ‚û˜‚û‘‚ûŠ‚ûƒ‚û|‚ûu‚ûn‚ûg‚û`‚ûY‚ûR‚ûK‚ûD‚û=‚û6‚û/‚û(‚û!‚û‚û‚û ‚û‚ûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûû€ûô€ûí€ûæ€û߀ûØ€ûÑ€ûÊ€ûÀû¼€ûµ€û®€û§€û €û™€û’€û‹€û„€û}€ûv€ûo€ûh€ûa€ûZ€ûS€ûL€ûE€û>€û7€û0€û)€û"€û€û€û €û€ûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûü~ûõ~ûî~ûç~ûà~ûÙ~ûÒ~ûË~ûÄ~û½~û¶~û¯~û¨~û¡~ûš~û“~ûŒ~û…~û~~ûw~ûp~ûi~ûb~û[~ûT~ûM~ûF~û?~û8~û1~û*~û#~û~û~û~û~û~ûù}ûò}ûë}ûä}ûÝ}ûÖ}ûÏ}ûÈ}ûÁ}ûº}û³}û¬}û¥}ûž}û—}û}û‰}û‚}û{}ût}ûm}ûf}û_}ûX}ûQ}ûJ}ûC}û<}û5}û.}û'}û }û}û}û }û}ûý|ûö|ûï|ûè|ûá|ûÚ|ûÓ|ûÌ|ûÅ|û¾|û·|û°|û©|û¢|û›|û”|û|û†|û|ûx|ûq|ûj|ûc|û\|ûU|ûN|ûG|û@|û9|û2|û+|û$|û|û|û|û|û|ûú{ûó{ûì{ûå{ûÞ{û×{ûÐ{ûÉ{ûÂ{û»{û´{û­{û¦{ûŸ{û˜{û‘{ûŠ{ûƒ{û|{ûu{ûn{ûg{û`{ûY{ûR{ûK{ûD{û={û6{û/{û({û!{û{û{û {û{ûþzû÷zûðzûézûâzûÛzûÔzûÍzûÆzû¿zû¸zû±zûªzû£zûœzû•zûŽzû‡zû€zûyzûrzûkzûdzû]zûVzûOzûHzûAzû:zû3zû,zû%zûzûzûzû zûzûûyûôyûíyûæyûßyûØyûÑyûÊyûÃyû¼yûµyû®yû§yû yû™yû’yû‹yû„yû}yûvyûoyûhyûayûZyûSyûLyûEyû>yû7yû0yû)yû"yûyûyû yûyûÿxûøxûñxûêxûãxûÜxûÕxûÎxûÇxûÀxû¹xû²xû«xû¤xûxû–xûxûˆxûxûzxûsxûlxûexû^xûWxûPxûIxûBxû;xû4xû-xû&xûxûxûxû xûxûüwûõwûîwûçwûàwûÙwûÒwûËwûÄwû½wû¶wû¯wû¨wû¡wûšwû“wûŒwû…wû~wûwwûpwûiwûbwû[wûTwûMwûFwû?wû8wû1wû*wû#wûwûwûwûwûwûùvûòvûëvûävûÝvûÖvûÏvûÈvûÁvûºvû³vû¬vû¥vûžvû—vûvû‰vû‚vû{vûtvûmvûfvû_vûXvûQvûJvûCvûrû7rû0rû)rû"rûrûrû rûrûÿqûøqûñqûêqûãqûÜqûÕqûÎqûÇqûÀqû¹qû²qû«qû¤qûqû–qûqûˆqûqûzqûsqûlqûeqû^qûWqûPqûIqûBqû;qû4qû-qû&qûqûqûqû qûqûüpûõpûîpûçpûàpûÙpûÒpûËpûÄpû½pû¶pû¯pû¨pû¡pûšpû“pûŒpû…pû~pûwpûppûipûbpû[pûTpûMpûFpû?pû8pû1pû*pû#pûpûpûpûpûpûùoûòoûëoûäoûÝoûÖoûÏoûÈoûÁoûºoû³oû¬oû¥oûžoû—oûoû‰oû‚oû{oûtoûmoûfoû_oûXoûQoûJoûCoûkû7kû0kû)kû"kûkûkû kûkûÿjûøjûñjûêjûãjûÜjûÕjûÎjûÇjûÀjû¹jû²jû«jû¤jûjû–jûjûˆjûjûzjûsjûljûejû^jûWjûPjûIjûBjû;jû4jû-jû&jûjûjûjû jûjûüiûõiûîiûçiûàiûÙiûÒiûËiûÄiû½iû¶iû¯iû¨iû¡iûšiû“iûŒiû…iû~iûwiûpiûiiûbiû[iûTiûMiûFiû?iû8iû1iû*iû#iûiûiûiûiûiûùhûòhûëhûähûÝhûÖhûÏhûÈhûÁhûºhû³hû¬hû¥hûžhû—hûhû‰hû‚hû{hûthûmhûfhû_hûXhûQhûJhûChûdû7dû0dû)dû"dûdûdû dûdûÿcûøcûñcûêcûãcûÜcûÕcûÎcûÇcûÀcû¹cû²cû«cû¤cûcû–cûcûˆcûcûzcûscûlcûecû^cûWcûPcûIcûBcû;cû4cû-cû&cûcûcûcû cûcûübûõbûîbûçbûàbûÙbûÒbûËbûÄbû½bû¶bû¯bû¨bû¡bûšbû“bûŒbû…bû~bûwbûpbûibûbbû[bûTbûMbûFbû?bû8bû1bû*bû#bûbûbûbûbûbûùaûòaûëaûäaûÝaûÖaûÏaûÈaûÁaûºaû³aû¬aû¥aûžaû—aûaû‰aû‚aû{aûtaûmaûfaû_aûXaûQaûJaûCaû]û7]û0]û)]û"]û]û]û ]û]ûÿ\ûø\ûñ\ûê\ûã\ûÜ\ûÕ\ûÎ\ûÇ\ûÀ\û¹\û²\û«\û¤\û\û–\û\ûˆ\û\ûz\ûs\ûl\ûe\û^\ûW\ûP\ûI\ûB\û;\û4\û-\û&\û\û\û\û \û\ûü[ûõ[ûî[ûç[ûà[ûÙ[ûÒ[ûË[ûÄ[û½[û¶[û¯[û¨[û¡[ûš[û“[ûŒ[û…[û~[ûw[ûp[ûi[ûb[û[[ûT[ûM[ûF[û?[û8[û1[û*[û#[û[û[û[û[û[ûùZûòZûëZûäZûÝZûÖZûÏZûÈZûÁZûºZû³Zû¬Zû¥ZûžZû—ZûZû‰Zû‚Zû{ZûtZûmZûfZû_ZûXZûQZûJZûCZûVû7Vû0Vû)Vû"VûVûVû VûVûÿUûøUûñUûêUûãUûÜUûÕUûÎUûÇUûÀUû¹Uû²Uû«Uû¤UûUû–UûUûˆUûUûzUûsUûlUûeUû^UûWUûPUûIUûBUû;Uû4Uû-Uû&UûUûUûUû UûUûüTûõTûîTûçTûàTûÙTûÒTûËTûÄTû½Tû¶Tû¯Tû¨Tû¡TûšTû“TûŒTû…Tû~TûwTûpTûiTûbTû[TûTTûMTûFTû?Tû8Tû1Tû*Tû#TûTûTûTûTûTûùSûòSûëSûäSûÝSûÖSûÏSûÈSûÁSûºSû³Sû¬Sû¥SûžSû—SûSû‰Sû‚Sû{SûtSûmSûfSû_SûXSûQSûJSûCSûOû7Oû0Oû)Oû"OûOûOû OûOûÿNûøNûñNûêNûãNûÜNûÕNûÎNûÇNûÀNû¹Nû²Nû«Nû¤NûNû–NûNûˆNûNûzNûsNûlNûeNû^NûWNûPNûINûBNû;Nû4Nû-Nû&NûNûNûNû NûNûüMûõMûîMûçMûàMûÙMûÒMûËMûÄMû½Mû¶Mû¯Mû¨Mû¡MûšMû“MûŒMû…Mû~MûwMûpMûiMûbMû[MûTMûMMûFMû?Mû8Mû1Mû*Mû#MûMûMûMûMûMûùLûòLûëLûäLûÝLûÖLûÏLûÈLûÁLûºLû³Lû¬Lû¥LûžLû—LûLû‰Lû‚Lû{LûtLûmLûfLû_LûXLûQLûJLûCLûHû7Hû0Hû)Hû"HûHûHû HûHûÿGûøGûñGûêGûãGûÜGûÕGûÎGûÇGûÀGû¹Gû²Gû«Gû¤GûGû–GûGûˆGûGûzGûsGûlGûeGû^GûWGûPGûIGûBGû;Gû4Gû-Gû&GûGûGûGû GûGûüFûõFûîFûçFûàFûÙFûÒFûËFûÄFû½Fû¶Fû¯Fû¨Fû¡FûšFû“FûŒFû…Fû~FûwFûpFûiFûbFû[FûTFûMFûFFû?Fû8Fû1Fû*Fû#FûFûFûFûFûFûùEûòEûëEûäEûÝEûÖEûÏEûÈEûÁEûºEû³Eû¬Eû¥EûžEû—EûEû‰Eû‚Eû{EûtEûmEûfEû_EûXEûQEûJEûCEûAû7Aû0Aû)Aû"AûAûAû AûAûÿ@ûø@ûñ@ûê@ûã@ûÜ@ûÕ@ûÎ@ûÇ@ûÀ@û¹@û²@û«@û¤@û@û–@û@ûˆ@û@ûz@ûs@ûl@ûe@û^@ûW@ûP@ûI@ûB@û;@û4@û-@û&@û@û@û@û @û@ûü?ûõ?ûî?ûç?ûà?ûÙ?ûÒ?ûË?ûÄ?û½?û¶?û¯?û¨?û¡?ûš?û“?ûŒ?û…?û~?ûw?ûp?ûi?ûb?û[?ûT?ûM?ûF?û??û8?û1?û*?û#?û?û?û?û?û?ûù>ûò>ûë>ûä>ûÝ>ûÖ>ûÏ>ûÈ>ûÁ>ûº>û³>û¬>û¥>ûž>û—>û>û‰>û‚>û{>ût>ûm>ûf>û_>ûX>ûQ>ûJ>ûC>û<>û5>û.>û'>û >û>û>û >û>ûý=ûö=ûï=ûè=ûá=ûÚ=ûÓ=ûÌ=ûÅ=û¾=û·=û°=û©=û¢=û›=û”=û=û†=û=ûx=ûq=ûj=ûc=û\=ûU=ûN=ûG=û@=û9=û2=û+=û$=û=û=û=û=û=ûú<ûó<ûì<ûå<ûÞ<û×<ûÐ<ûÉ<ûÂ<û»<û´<û­<û¦<ûŸ<û˜<û‘<ûŠ<ûƒ<û|<ûu<ûn<ûg<û`<ûY<ûR<ûK<ûD<û=<û6<û/<û(<û!<û<û<û <û<ûþ;û÷;ûð;ûé;ûâ;ûÛ;ûÔ;ûÍ;ûÆ;û¿;û¸;û±;ûª;û£;ûœ;û•;ûŽ;û‡;û€;ûy;ûr;ûk;ûd;û];ûV;ûO;ûH;ûA;û:;û3;û,;û%;û;û;û;û ;û;ûû:ûô:ûí:ûæ:ûß:ûØ:ûÑ:ûÊ:ûÃ:û¼:ûµ:û®:û§:û :û™:û’:û‹:û„:û}:ûv:ûo:ûh:ûa:ûZ:ûS:ûL:ûE:û>:û7:û0:û):û":û:û:û :û:ûÿ9ûø9ûñ9ûê9ûã9ûÜ9ûÕ9ûÎ9ûÇ9ûÀ9û¹9û²9û«9û¤9û9û–9û9ûˆ9û9ûz9ûs9ûl9ûe9û^9ûW9ûP9ûI9ûB9û;9û49û-9û&9û9û9û9û 9û9ûü8ûõ8ûî8ûç8ûà8ûÙ8ûÒ8ûË8ûÄ8û½8û¶8û¯8û¨8û¡8ûš8û“8ûŒ8û…8û~8ûw8ûp8ûi8ûb8û[8ûT8ûM8ûF8û?8û88û18û*8û#8û8û8û8û8û8ûù7ûò7ûë7ûä7ûÝ7ûÖ7ûÏ7ûÈ7ûÁ7ûº7û³7û¬7û¥7ûž7û—7û7û‰7û‚7û{7ût7ûm7ûf7û_7ûX7ûQ7ûJ7ûC7û<7û57û.7û'7û 7û7û7û 7û7ûý6ûö6ûï6ûè6ûá6ûÚ6ûÓ6ûÌ6ûÅ6û¾6û·6û°6û©6û¢6û›6û”6û6û†6û6ûx6ûq6ûj6ûc6û\6ûU6ûN6ûG6û@6û96û26û+6û$6û6û6û6û6û6ûú5ûó5ûì5ûå5ûÞ5û×5ûÐ5ûÉ5ûÂ5û»5û´5û­5û¦5ûŸ5û˜5û‘5ûŠ5ûƒ5û|5ûu5ûn5ûg5û`5ûY5ûR5ûK5ûD5û=5û65û/5û(5û!5û5û5û 5û5ûþ4û÷4ûð4ûé4ûâ4ûÛ4ûÔ4ûÍ4ûÆ4û¿4û¸4û±4ûª4û£4ûœ4û•4ûŽ4û‡4û€4ûy4ûr4ûk4ûd4û]4ûV4ûO4ûH4ûA4û:4û34û,4û%4û4û4û4û 4û4ûû3ûô3ûí3ûæ3ûß3ûØ3ûÑ3ûÊ3ûÃ3û¼3ûµ3û®3û§3û 3û™3û’3û‹3û„3û}3ûv3ûo3ûh3ûa3ûZ3ûS3ûL3ûE3û>3û73û03û)3û"3û3û3û 3û3ûÿ2ûø2ûñ2ûê2ûã2ûÜ2ûÕ2ûÎ2ûÇ2ûÀ2û¹2û²2û«2û¤2û2û–2û2ûˆ2û2ûz2ûs2ûl2ûe2û^2ûW2ûP2ûI2ûB2û;2û42û-2û&2û2û2û2û 2û2ûü1ûõ1ûî1ûç1ûà1ûÙ1ûÒ1ûË1ûÄ1û½1û¶1û¯1û¨1û¡1ûš1û“1ûŒ1û…1û~1ûw1ûp1ûi1ûb1û[1ûT1ûM1ûF1û?1û81û11û*1û#1û1û1û1û1û1ûù0ûò0ûë0ûä0ûÝ0ûÖ0ûÏ0ûÈ0ûÁ0ûº0û³0û¬0û¥0ûž0û—0û0û‰0û‚0û{0ût0ûm0ûf0û_0ûX0ûQ0ûJ0ûC0û<0û50û.0û'0û 0û0û0û 0û0ûý/ûö/ûï/ûè/ûá/ûÚ/ûÓ/ûÌ/ûÅ/û¾/û·/û°/û©/û¢/û›/û”/û/û†/û/ûx/ûq/ûj/ûc/û\/ûU/ûN/ûG/û@/û9/û2/û+/û$/û/û/û/û/û/ûú.ûó.ûì.ûå.ûÞ.û×.ûÐ.ûÉ.ûÂ.û».û´.û­.û¦.ûŸ.û˜.û‘.ûŠ.ûƒ.û|.ûu.ûn.ûg.û`.ûY.ûR.ûK.ûD.û=.û6.û/.û(.û!.û.û.û .û.ûþ-û÷-ûð-ûé-ûâ-ûÛ-ûÔ-ûÍ-ûÆ-û¿-û¸-û±-ûª-û£-ûœ-û•-ûŽ-û‡-û€-ûy-ûr-ûk-ûd-û]-ûV-ûO-ûH-ûA-û:-û3-û,-û%-û-û-û-û -û-ûû,ûô,ûí,ûæ,ûß,ûØ,ûÑ,ûÊ,ûÃ,û¼,ûµ,û®,û§,û ,û™,û’,û‹,û„,û},ûv,ûo,ûh,ûa,ûZ,ûS,ûL,ûE,û>,û7,û0,û),û",û,û,û ,û,ûÿ+ûø+ûñ+ûê+ûã+ûÜ+ûÕ+ûÎ+ûÇ+ûÀ+û¹+û²+û«+û¤+û+û–+û+ûˆ+û+ûz+ûs+ûl+ûe+û^+ûW+ûP+ûI+ûB+û;+û4+û-+û&+û+û+û+û +û+ûü*ûõ*ûî*ûç*ûà*ûÙ*ûÒ*ûË*ûÄ*û½*û¶*û¯*û¨*û¡*ûš*û“*ûŒ*û…*û~*ûw*ûp*ûi*ûb*û[*ûT*ûM*ûF*û?*û8*û1*û**û#*û*û*û*û*û*ûù)ûò)ûë)ûä)ûÝ)ûÖ)ûÏ)ûÈ)ûÁ)ûº)û³)û¬)û¥)ûž)û—)û)û‰)û‚)û{)ût)ûm)ûf)û_)ûX)ûQ)ûJ)ûC)û<)û5)û.)û')û )û)û)û )û)ûý(ûö(ûï(ûè(ûá(ûÚ(ûÓ(ûÌ(ûÅ(û¾(û·(û°(û©(û¢(û›(û”(û(û†(û(ûx(ûq(ûj(ûc(û\(ûU(ûN(ûG(û@(û9(û2(û+(û$(û(û(û(û(û(ûú'ûó'ûì'ûå'ûÞ'û×'ûÐ'ûÉ'ûÂ'û»'û´'û­'û¦'ûŸ'û˜'û‘'ûŠ'ûƒ'û|'ûu'ûn'ûg'û`'ûY'ûR'ûK'ûD'û='û6'û/'û('û!'û'û'û 'û'ûþ&û÷&ûð&ûé&ûâ&ûÛ&ûÔ&ûÍ&ûÆ&û¿&û¸&û±&ûª&û£&ûœ&û•&ûŽ&û‡&û€&ûy&ûr&ûk&ûd&û]&ûV&ûO&ûH&ûA&û:&û3&û,&û%&û&û&û&û &û&ûû%ûô%ûí%ûæ%ûß%ûØ%ûÑ%ûÊ%ûÃ%û¼%ûµ%û®%û§%û %û™%û’%û‹%û„%û}%ûv%ûo%ûh%ûa%ûZ%ûS%ûL%ûE%û>%û7%û0%û)%û"%û%û%û %û%ûÿ$ûø$ûñ$ûê$ûã$ûÜ$ûÕ$ûÎ$ûÇ$ûÀ$û¹$û²$û«$û¤$û$û–$û$ûˆ$û$ûz$ûs$ûl$ûe$û^$ûW$ûP$ûI$ûB$û;$û4$û-$û&$û$û$û$û $û$ûü#ûõ#ûî#ûç#ûà#ûÙ#ûÒ#ûË#ûÄ#û½#û¶#û¯#û¨#û¡#ûš#û“#ûŒ#û…#û~#ûw#ûp#ûi#ûb#û[#ûT#ûM#ûF#û?#û8#û1#û*#û##û#û#û#û#û#ûù"ûò"ûë"ûä"ûÝ"ûÖ"ûÏ"ûÈ"ûÁ"ûº"û³"û¬"û¥"ûž"û—"û"û‰"û‚"û{"ût"ûm"ûf"û_"ûX"ûQ"ûJ"ûC"û<"û5"û."û'"û "û"û"û "û"ûý!ûö!ûï!ûè!ûá!ûÚ!ûÓ!ûÌ!ûÅ!û¾!û·!û°!û©!û¢!û›!û”!û!û†!û!ûx!ûq!ûj!ûc!û\!ûU!ûN!ûG!û@!û9!û2!û+!û$!û!û!û!û!û!ûú ûó ûì ûå ûÞ û× ûÐ ûÉ û û» û´ û­ û¦ ûŸ û˜ û‘ ûŠ ûƒ û| ûu ûn ûg û` ûY ûR ûK ûD û= û6 û/ û( û! û û û û ûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûù ûò ûë ûä ûÝ ûÖ ûÏ ûÈ ûÁ ûº û³ û¬ û¥ ûž û— û û‰ û‚ û{ ût ûm ûf û_ ûX ûQ ûJ ûC û< û5 û. û' û û û û û ûý ûö ûï ûè ûá ûÚ ûÓ ûÌ ûÅ û¾ û· û° û© û¢ û› û” û û† û ûx ûq ûj ûc û\ ûU ûN ûG û@ û9 û2 û+ û$ û û û û û ûú ûó ûì ûå ûÞ û× ûÐ ûÉ û û» û´ û­ û¦ ûŸ û˜ û‘ ûŠ ûƒ û| ûu ûn ûg û` ûY ûR ûK ûD û= û6 û/ û( û! û û û û ûþ û÷ ûð ûé ûâ ûÛ ûÔ ûÍ ûÆ û¿ û¸ û± ûª û£ ûœ û• ûŽ û‡ û€ ûy ûr ûk ûd û] ûV ûO ûH ûA û: û3 û, û% û û û û û ûû ûô ûí ûæ ûß ûØ ûÑ ûÊ ûà û¼ ûµ û® û§ û  û™ û’ û‹ û„ û} ûv ûo ûh ûa ûZ ûS ûL ûE û> û7 û0 û) û" û û û û ûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùÿúòÿúëÿúäÿúÝÿúÖÿúÏÿúÈÿúÁÿúºÿú³ÿú¬ÿú¥ÿúžÿú—ÿúÿú‰ÿú‚ÿú{ÿútÿúmÿúfÿú_ÿúXÿúQÿúJÿúCÿú<ÿú5ÿú.ÿú'ÿú ÿúÿúÿú ÿúÿúýþúöþúïþúèþúáþúÚþúÓþúÌþúÅþú¾þú·þú°þú©þú¢þú›þú”þúþú†þúþúxþúqþújþúcþú\þúUþúNþúGþú@þú9þú2þú+þú$þúþúþúþúþúþúúýúóýúìýúåýúÞýú×ýúÐýúÉýúÂýú»ýú´ýú­ýú¦ýúŸýú˜ýú‘ýúŠýúƒýú|ýúuýúnýúgýú`ýúYýúRýúKýúDýú=ýú6ýú/ýú(ýú!ýúýúýú ýúýúþüú÷üúðüúéüúâüúÛüúÔüúÍüúÆüú¿üú¸üú±üúªüú£üúœüú•üúŽüú‡üú€üúyüúrüúküúdüú]üúVüúOüúHüúAüú:üú3üú,üú%üúüúüúüú üúüúûûúôûúíûúæûúßûúØûúÑûúÊûúÃûú¼ûúµûú®ûú§ûú ûú™ûú’ûú‹ûú„ûú}ûúvûúoûúhûúaûúZûúSûúLûúEûú>ûú7ûú0ûú)ûú"ûúûúûú ûúûúÿúúøúúñúúêúúãúúÜúúÕúúÎúúÇúúÀúú¹úú²úú«úú¤úúúú–úúúúˆúúúúzúúsúúlúúeúú^úúWúúPúúIúúBúú;úú4úú-úú&úúúúúúúú úúúúüùúõùúîùúçùúàùúÙùúÒùúËùúÄùú½ùú¶ùú¯ùú¨ùú¡ùúšùú“ùúŒùú…ùú~ùúwùúpùúiùúbùú[ùúTùúMùúFùú?ùú8ùú1ùú*ùú#ùúùúùúùúùúùúùøúòøúëøúäøúÝøúÖøúÏøúÈøúÁøúºøú³øú¬øú¥øúžøú—øúøú‰øú‚øú{øútøúmøúføú_øúXøúQøúJøúCøú<øú5øú.øú'øú øúøúøú øúøúý÷úö÷úï÷úè÷úá÷úÚ÷úÓ÷úÌ÷úÅ÷ú¾÷ú·÷ú°÷ú©÷ú¢÷ú›÷ú”÷ú÷ú†÷ú÷úx÷úq÷új÷úc÷ú\÷úU÷úN÷úG÷ú@÷ú9÷ú2÷ú+÷ú$÷ú÷ú÷ú÷ú÷ú÷úúöúóöúìöúåöúÞöú×öúÐöúÉöúÂöú»öú´öú­öú¦öúŸöú˜öú‘öúŠöúƒöú|öúuöúnöúgöú`öúYöúRöúKöúDöú=öú6öú/öú(öú!öúöúöú öúöúþõú÷õúðõúéõúâõúÛõúÔõúÍõúÆõú¿õú¸õú±õúªõú£õúœõú•õúŽõú‡õú€õúyõúrõúkõúdõú]õúVõúOõúHõúAõú:õú3õú,õú%õúõúõúõú õúõúûôúôôúíôúæôúßôúØôúÑôúÊôúÃôú¼ôúµôú®ôú§ôú ôú™ôú’ôú‹ôú„ôú}ôúvôúoôúhôúaôúZôúSôúLôúEôú>ôú7ôú0ôú)ôú"ôúôúôú ôúôúÿóúøóúñóúêóúãóúÜóúÕóúÎóúÇóúÀóú¹óú²óú«óú¤óúóú–óúóúˆóúóúzóúsóúlóúeóú^óúWóúPóúIóúBóú;óú4óú-óú&óúóúóúóú óúóúüòúõòúîòúçòúàòúÙòúÒòúËòúÄòú½òú¶òú¯òú¨òú¡òúšòú“òúŒòú…òú~òúwòúpòúiòúbòú[òúTòúMòúFòú?òú8òú1òú*òú#òúòúòúòúòúòúùñúòñúëñúäñúÝñúÖñúÏñúÈñúÁñúºñú³ñú¬ñú¥ñúžñú—ñúñú‰ñú‚ñú{ñútñúmñúfñú_ñúXñúQñúJñúCñú<ñú5ñú.ñú'ñú ñúñúñú ñúñúýðúöðúïðúèðúáðúÚðúÓðúÌðúÅðú¾ðú·ðú°ðú©ðú¢ðú›ðú”ðúðú†ðúðúxðúqðújðúcðú\ðúUðúNðúGðú@ðú9ðú2ðú+ðú$ðúðúðúðúðúðúúïúóïúìïúåïúÞïú×ïúÐïúÉïúÂïú»ïú´ïú­ïú¦ïúŸïú˜ïú‘ïúŠïúƒïú|ïúuïúnïúgïú`ïúYïúRïúKïúDïú=ïú6ïú/ïú(ïú!ïúïúïú ïúïúþîú÷îúðîúéîúâîúÛîúÔîúÍîúÆîú¿îú¸îú±îúªîú£îúœîú•îúŽîú‡îú€îúyîúrîúkîúdîú]îúVîúOîúHîúAîú:îú3îú,îú%îúîúîúîú îúîúûíúôíúííúæíúßíúØíúÑíúÊíúÃíú¼íúµíú®íú§íú íú™íú’íú‹íú„íú}íúvíúoíúhíúaíúZíúSíúLíúEíú>íú7íú0íú)íú"íúíúíú íúíúÿìúøìúñìúêìúãìúÜìúÕìúÎìúÇìúÀìú¹ìú²ìú«ìú¤ìúìú–ìúìúˆìúìúzìúsìúlìúeìú^ìúWìúPìúIìúBìú;ìú4ìú-ìú&ìúìúìúìú ìúìúüëúõëúîëúçëúàëúÙëúÒëúËëúÄëú½ëú¶ëú¯ëú¨ëú¡ëúšëú“ëúŒëú…ëú~ëúwëúpëúiëúbëú[ëúTëúMëúFëú?ëú8ëú1ëú*ëú#ëúëúëúëúëúëúùêúòêúëêúäêúÝêúÖêúÏêúÈêúÁêúºêú³êú¬êú¥êúžêú—êúêú‰êú‚êú{êútêúmêúfêú_êúXêúQêúJêúCêú<êú5êú.êú'êú êúêúêú êúêúýéúöéúïéúèéúáéúÚéúÓéúÌéúÅéú¾éú·éú°éú©éú¢éú›éú”éúéú†éúéúxéúqéújéúcéú\éúUéúNéúGéú@éú9éú2éú+éú$éúéúéúéúéúéúúèúóèúìèúåèúÞèú×èúÐèúÉèúÂèú»èú´èú­èú¦èúŸèú˜èú‘èúŠèúƒèú|èúuèúnèúgèú`èúYèúRèúKèúDèú=èú6èú/èú(èú!èúèúèú èúèúþçú÷çúðçúéçúâçúÛçúÔçúÍçúÆçú¿çú¸çú±çúªçú£çúœçú•çúŽçú‡çú€çúyçúrçúkçúdçú]çúVçúOçúHçúAçú:çú3çú,çú%çúçúçúçú çúçúûæúôæúíæúææúßæúØæúÑæúÊæúÃæú¼æúµæú®æú§æú æú™æú’æú‹æú„æú}æúvæúoæúhæúaæúZæúSæúLæúEæú>æú7æú0æú)æú"æúæúæú æúæúÿåúøåúñåúêåúãåúÜåúÕåúÎåúÇåúÀåú¹åú²åú«åú¤åúåú–åúåúˆåúåúzåúsåúlåúeåú^åúWåúPåúIåúBåú;åú4åú-åú&åúåúåúåú åúåúüäúõäúîäúçäúàäúÙäúÒäúËäúÄäú½äú¶äú¯äú¨äú¡äúšäú“äúŒäú…äú~äúwäúpäúiäúbäú[äúTäúMäúFäú?äú8äú1äú*äú#äúäúäúäúäúäúùãúòãúëãúäãúÝãúÖãúÏãúÈãúÁãúºãú³ãú¬ãú¥ãúžãú—ãúãú‰ãú‚ãú{ãútãúmãúfãú_ãúXãúQãúJãúCãú<ãú5ãú.ãú'ãú ãúãúãú ãúãúýâúöâúïâúèâúáâúÚâúÓâúÌâúÅâú¾âú·âú°âú©âú¢âú›âú”âúâú†âúâúxâúqâújâúcâú\âúUâúNâúGâú@âú9âú2âú+âú$âúâúâúâúâúâúúáúóáúìáúåáúÞáú×áúÐáúÉáúÂáú»áú´áú­áú¦áúŸáú˜áú‘áúŠáúƒáú|áúuáúnáúgáú`áúYáúRáúKáúDáú=áú6áú/áú(áú!áúáúáú áúáúþàú÷àúðàúéàúâàúÛàúÔàúÍàúÆàú¿àú¸àú±àúªàú£àúœàú•àúŽàú‡àú€àúyàúràúkàúdàú]àúVàúOàúHàúAàú:àú3àú,àú%àúàúàúàú àúàúûßúôßúíßúæßúßßúØßúÑßúÊßúÃßú¼ßúµßú®ßú§ßú ßú™ßú’ßú‹ßú„ßú}ßúvßúoßúhßúaßúZßúSßúLßúEßú>ßú7ßú0ßú)ßú"ßúßúßú ßúßúÿÞúøÞúñÞúêÞúãÞúÜÞúÕÞúÎÞúÇÞúÀÞú¹Þú²Þú«Þú¤ÞúÞú–ÞúÞúˆÞúÞúzÞúsÞúlÞúeÞú^ÞúWÞúPÞúIÞúBÞú;Þú4Þú-Þú&ÞúÞúÞúÞú ÞúÞúüÝúõÝúîÝúçÝúàÝúÙÝúÒÝúËÝúÄÝú½Ýú¶Ýú¯Ýú¨Ýú¡ÝúšÝú“ÝúŒÝú…Ýú~ÝúwÝúpÝúiÝúbÝú[ÝúTÝúMÝúFÝú?Ýú8Ýú1Ýú*Ýú#ÝúÝúÝúÝúÝúÝúùÜúòÜúëÜúäÜúÝÜúÖÜúÏÜúÈÜúÁÜúºÜú³Üú¬Üú¥ÜúžÜú—ÜúÜú‰Üú‚Üú{ÜútÜúmÜúfÜú_ÜúXÜúQÜúJÜúCÜú<Üú5Üú.Üú'Üú ÜúÜúÜú ÜúÜúýÛúöÛúïÛúèÛúáÛúÚÛúÓÛúÌÛúÅÛú¾Ûú·Ûú°Ûú©Ûú¢Ûú›Ûú”ÛúÛú†ÛúÛúxÛúqÛújÛúcÛú\ÛúUÛúNÛúGÛú@Ûú9Ûú2Ûú+Ûú$ÛúÛúÛúÛúÛúÛúúÚúóÚúìÚúåÚúÞÚú×ÚúÐÚúÉÚúÂÚú»Úú´Úú­Úú¦ÚúŸÚú˜Úú‘ÚúŠÚúƒÚú|ÚúuÚúnÚúgÚú`ÚúYÚúRÚúKÚúDÚú=Úú6Úú/Úú(Úú!ÚúÚúÚú ÚúÚúþÙú÷ÙúðÙúéÙúâÙúÛÙúÔÙúÍÙúÆÙú¿Ùú¸Ùú±ÙúªÙú£ÙúœÙú•ÙúŽÙú‡Ùú€ÙúyÙúrÙúkÙúdÙú]ÙúVÙúOÙúHÙúAÙú:Ùú3Ùú,Ùú%ÙúÙúÙúÙú ÙúÙúûØúôØúíØúæØúߨúØØúÑØúÊØúÃØú¼ØúµØú®Øú§Øú Øú™Øú’Øú‹Øú„Øú}ØúvØúoØúhØúaØúZØúSØúLØúEØú>Øú7Øú0Øú)Øú"ØúØúØú ØúØúÿ×úø×úñ×úê×úã×úÜ×úÕ×úÎ×úÇ×úÀ×ú¹×ú²×ú«×ú¤×ú×ú–×ú×úˆ×ú×úz×ús×úl×úe×ú^×úW×úP×úI×úB×ú;×ú4×ú-×ú&×ú×ú×ú×ú ×ú×úüÖúõÖúîÖúçÖúàÖúÙÖúÒÖúËÖúÄÖú½Öú¶Öú¯Öú¨Öú¡ÖúšÖú“ÖúŒÖú…Öú~ÖúwÖúpÖúiÖúbÖú[ÖúTÖúMÖúFÖú?Öú8Öú1Öú*Öú#ÖúÖúÖúÖúÖúÖúùÕúòÕúëÕúäÕúÝÕúÖÕúÏÕúÈÕúÁÕúºÕú³Õú¬Õú¥ÕúžÕú—ÕúÕú‰Õú‚Õú{ÕútÕúmÕúfÕú_ÕúXÕúQÕúJÕúCÕú<Õú5Õú.Õú'Õú ÕúÕúÕú ÕúÕúýÔúöÔúïÔúèÔúáÔúÚÔúÓÔúÌÔúÅÔú¾Ôú·Ôú°Ôú©Ôú¢Ôú›Ôú”ÔúÔú†ÔúÔúxÔúqÔújÔúcÔú\ÔúUÔúNÔúGÔú@Ôú9Ôú2Ôú+Ôú$ÔúÔúÔúÔúÔúÔúúÓúóÓúìÓúåÓúÞÓú×ÓúÐÓúÉÓúÂÓú»Óú´Óú­Óú¦ÓúŸÓú˜Óú‘ÓúŠÓúƒÓú|ÓúuÓúnÓúgÓú`ÓúYÓúRÓúKÓúDÓú=Óú6Óú/Óú(Óú!ÓúÓúÓú ÓúÓúþÒú÷ÒúðÒúéÒúâÒúÛÒúÔÒúÍÒúÆÒú¿Òú¸Òú±ÒúªÒú£ÒúœÒú•ÒúŽÒú‡Òú€ÒúyÒúrÒúkÒúdÒú]ÒúVÒúOÒúHÒúAÒú:Òú3Òú,Òú%ÒúÒúÒúÒú ÒúÒúûÑúôÑúíÑúæÑúßÑúØÑúÑÑúÊÑúÃÑú¼ÑúµÑú®Ñú§Ñú Ñú™Ñú’Ñú‹Ñú„Ñú}ÑúvÑúoÑúhÑúaÑúZÑúSÑúLÑúEÑú>Ñú7Ñú0Ñú)Ñú"ÑúÑúÑú ÑúÑúÿÐúøÐúñÐúêÐúãÐúÜÐúÕÐúÎÐúÇÐúÀÐú¹Ðú²Ðú«Ðú¤ÐúÐú–ÐúÐúˆÐúÐúzÐúsÐúlÐúeÐú^ÐúWÐúPÐúIÐúBÐú;Ðú4Ðú-Ðú&ÐúÐúÐúÐú ÐúÐúüÏúõÏúîÏúçÏúàÏúÙÏúÒÏúËÏúÄÏú½Ïú¶Ïú¯Ïú¨Ïú¡ÏúšÏú“ÏúŒÏú…Ïú~ÏúwÏúpÏúiÏúbÏú[ÏúTÏúMÏúFÏú?Ïú8Ïú1Ïú*Ïú#ÏúÏúÏúÏúÏúÏúùÎúòÎúëÎúäÎúÝÎúÖÎúÏÎúÈÎúÁÎúºÎú³Îú¬Îú¥ÎúžÎú—ÎúÎú‰Îú‚Îú{ÎútÎúmÎúfÎú_ÎúXÎúQÎúJÎúCÎú<Îú5Îú.Îú'Îú ÎúÎúÎú ÎúÎúýÍúöÍúïÍúèÍúáÍúÚÍúÓÍúÌÍúÅÍú¾Íú·Íú°Íú©Íú¢Íú›Íú”ÍúÍú†ÍúÍúxÍúqÍújÍúcÍú\ÍúUÍúNÍúGÍú@Íú9Íú2Íú+Íú$ÍúÍúÍúÍúÍúÍúúÌúóÌúìÌúåÌúÞÌú×ÌúÐÌúÉÌúÂÌú»Ìú´Ìú­Ìú¦ÌúŸÌú˜Ìú‘ÌúŠÌúƒÌú|ÌúuÌúnÌúgÌú`ÌúYÌúRÌúKÌúDÌú=Ìú6Ìú/Ìú(Ìú!ÌúÌúÌú ÌúÌúþËú÷ËúðËúéËúâËúÛËúÔËúÍËúÆËú¿Ëú¸Ëú±ËúªËú£ËúœËú•ËúŽËú‡Ëú€ËúyËúrËúkËúdËú]ËúVËúOËúHËúAËú:Ëú3Ëú,Ëú%ËúËúËúËú ËúËúûÊúôÊúíÊúæÊúßÊúØÊúÑÊúÊÊúÃÊú¼ÊúµÊú®Êú§Êú Êú™Êú’Êú‹Êú„Êú}ÊúvÊúoÊúhÊúaÊúZÊúSÊúLÊúEÊú>Êú7Êú0Êú)Êú"ÊúÊúÊú ÊúÊúÿÉúøÉúñÉúêÉúãÉúÜÉúÕÉúÎÉúÇÉúÀÉú¹Éú²Éú«Éú¤ÉúÉú–ÉúÉúˆÉúÉúzÉúsÉúlÉúeÉú^ÉúWÉúPÉúIÉúBÉú;Éú4Éú-Éú&ÉúÉúÉúÉú ÉúÉúüÈúõÈúîÈúçÈúàÈúÙÈúÒÈúËÈúÄÈú½Èú¶Èú¯Èú¨Èú¡ÈúšÈú“ÈúŒÈú…Èú~ÈúwÈúpÈúiÈúbÈú[ÈúTÈúMÈúFÈú?Èú8Èú1Èú*Èú#ÈúÈúÈúÈúÈúÈúùÇúòÇúëÇúäÇúÝÇúÖÇúÏÇúÈÇúÁÇúºÇú³Çú¬Çú¥ÇúžÇú—ÇúÇú‰Çú‚Çú{ÇútÇúmÇúfÇú_ÇúXÇúQÇúJÇúCÇú<Çú5Çú.Çú'Çú ÇúÇúÇú ÇúÇúýÆúöÆúïÆúèÆúáÆúÚÆúÓÆúÌÆúÅÆú¾Æú·Æú°Æú©Æú¢Æú›Æú”ÆúÆú†ÆúÆúxÆúqÆújÆúcÆú\ÆúUÆúNÆúGÆú@Æú9Æú2Æú+Æú$ÆúÆúÆúÆúÆúÆúúÅúóÅúìÅúåÅúÞÅú×ÅúÐÅúÉÅúÂÅú»Åú´Åú­Åú¦ÅúŸÅú˜Åú‘ÅúŠÅúƒÅú|ÅúuÅúnÅúgÅú`ÅúYÅúRÅúKÅúDÅú=Åú6Åú/Åú(Åú!ÅúÅúÅú ÅúÅúþÄú÷ÄúðÄúéÄúâÄúÛÄúÔÄúÍÄúÆÄú¿Äú¸Äú±ÄúªÄú£ÄúœÄú•ÄúŽÄú‡Äú€ÄúyÄúrÄúkÄúdÄú]ÄúVÄúOÄúHÄúAÄú:Äú3Äú,Äú%ÄúÄúÄúÄú ÄúÄúûÃúôÃúíÃúæÃúßÃúØÃúÑÃúÊÃúÃÃú¼ÃúµÃú®Ãú§Ãú Ãú™Ãú’Ãú‹Ãú„Ãú}ÃúvÃúoÃúhÃúaÃúZÃúSÃúLÃúEÃú>Ãú7Ãú0Ãú)Ãú"ÃúÃúÃú ÃúÃúÿÂúøÂúñÂúêÂúãÂúÜÂúÕÂúÎÂúÇÂúÀÂú¹Âú²Âú«Âú¤ÂúÂú–ÂúÂúˆÂúÂúzÂúsÂúlÂúeÂú^ÂúWÂúPÂúIÂúBÂú;Âú4Âú-Âú&ÂúÂúÂúÂú ÂúÂúüÁúõÁúîÁúçÁúàÁúÙÁúÒÁúËÁúÄÁú½Áú¶Áú¯Áú¨Áú¡ÁúšÁú“ÁúŒÁú…Áú~ÁúwÁúpÁúiÁúbÁú[ÁúTÁúMÁúFÁú?Áú8Áú1Áú*Áú#ÁúÁúÁúÁúÁúÁúùÀúòÀúëÀúäÀúÝÀúÖÀúÏÀúÈÀúÁÀúºÀú³Àú¬Àú¥ÀúžÀú—ÀúÀú‰Àú‚Àú{ÀútÀúmÀúfÀú_ÀúXÀúQÀúJÀúCÀú<Àú5Àú.Àú'Àú ÀúÀúÀú ÀúÀúý¿úö¿úï¿úè¿úá¿úÚ¿úÓ¿úÌ¿úÅ¿ú¾¿ú·¿ú°¿ú©¿ú¢¿ú›¿ú”¿ú¿ú†¿ú¿úx¿úq¿új¿úc¿ú\¿úU¿úN¿úG¿ú@¿ú9¿ú2¿ú+¿ú$¿ú¿ú¿ú¿ú¿ú¿úú¾úó¾úì¾úå¾úÞ¾ú×¾úоúɾú¾ú»¾ú´¾ú­¾ú¦¾úŸ¾ú˜¾ú‘¾úоúƒ¾ú|¾úu¾ún¾úg¾ú`¾úY¾úR¾úK¾úD¾ú=¾ú6¾ú/¾ú(¾ú!¾ú¾ú¾ú ¾ú¾úþ½ú÷½úð½úé½úâ½úÛ½úÔ½úͽúƽú¿½ú¸½ú±½úª½ú£½úœ½ú•½ú޽ú‡½ú€½úy½úr½úk½úd½ú]½úV½úO½úH½úA½ú:½ú3½ú,½ú%½ú½ú½ú½ú ½ú½úû¼úô¼úí¼úæ¼úß¼úؼúѼúʼúüú¼¼úµ¼ú®¼ú§¼ú ¼ú™¼ú’¼ú‹¼ú„¼ú}¼úv¼úo¼úh¼úa¼úZ¼úS¼úL¼úE¼ú>¼ú7¼ú0¼ú)¼ú"¼ú¼ú¼ú ¼ú¼úÿ»úø»úñ»úê»úã»úÜ»úÕ»úλúÇ»úÀ»ú¹»ú²»ú«»ú¤»ú»ú–»ú»úˆ»ú»úz»ús»úl»úe»ú^»úW»úP»úI»úB»ú;»ú4»ú-»ú&»ú»ú»ú»ú »ú»úüºúõºúîºúçºúàºúÙºúÒºú˺úĺú½ºú¶ºú¯ºú¨ºú¡ºúšºú“ºúŒºú…ºú~ºúwºúpºúiºúbºú[ºúTºúMºúFºú?ºú8ºú1ºú*ºú#ºúºúºúºúºúºúù¹úò¹úë¹úä¹úݹúÖ¹úϹúȹúÁ¹úº¹ú³¹ú¬¹ú¥¹úž¹ú—¹ú¹ú‰¹ú‚¹ú{¹út¹úm¹úf¹ú_¹úX¹úQ¹úJ¹úC¹ú<¹ú5¹ú.¹ú'¹ú ¹ú¹ú¹ú ¹ú¹úý¸úö¸úï¸úè¸úá¸úÚ¸úÓ¸ú̸úŸú¾¸ú·¸ú°¸ú©¸ú¢¸ú›¸ú”¸ú¸ú†¸ú¸úx¸úq¸új¸úc¸ú\¸úU¸úN¸úG¸ú@¸ú9¸ú2¸ú+¸ú$¸ú¸ú¸ú¸ú¸ú¸úú·úó·úì·úå·úÞ·ú×·úзúÉ·ú·ú»·ú´·ú­·ú¦·úŸ·ú˜·ú‘·úŠ·úƒ·ú|·úu·ún·úg·ú`·úY·úR·úK·úD·ú=·ú6·ú/·ú(·ú!·ú·ú·ú ·ú·úþ¶ú÷¶úð¶úé¶úâ¶úÛ¶úÔ¶úͶúƶú¿¶ú¸¶ú±¶úª¶ú£¶úœ¶ú•¶ú޶ú‡¶ú€¶úy¶úr¶úk¶úd¶ú]¶úV¶úO¶úH¶úA¶ú:¶ú3¶ú,¶ú%¶ú¶ú¶ú¶ú ¶ú¶úûµúôµúíµúæµúßµúصúѵúʵúõú¼µúµµú®µú§µú µú™µú’µú‹µú„µú}µúvµúoµúhµúaµúZµúSµúLµúEµú>µú7µú0µú)µú"µúµúµú µúµúÿ´úø´úñ´úê´úã´úÜ´úÕ´úδúÇ´úÀ´ú¹´ú²´ú«´ú¤´ú´ú–´ú´úˆ´ú´úz´ús´úl´úe´ú^´úW´úP´úI´úB´ú;´ú4´ú-´ú&´ú´ú´ú´ú ´ú´úü³úõ³úî³úç³úà³úÙ³úÒ³ú˳úijú½³ú¶³ú¯³ú¨³ú¡³úš³ú“³úŒ³ú…³ú~³úw³úp³úi³úb³ú[³úT³úM³úF³ú?³ú8³ú1³ú*³ú#³ú³ú³ú³ú³ú³úù²úò²úë²úä²úݲúÖ²úϲúȲúÁ²úº²ú³²ú¬²ú¥²úž²ú—²ú²ú‰²ú‚²ú{²út²úm²úf²ú_²úX²úQ²úJ²úC²ú<²ú5²ú.²ú'²ú ²ú²ú²ú ²ú²úý±úö±úï±úè±úá±úÚ±úÓ±ú̱úűú¾±ú·±ú°±ú©±ú¢±ú›±ú”±ú±ú†±ú±úx±úq±új±úc±ú\±úU±úN±úG±ú@±ú9±ú2±ú+±ú$±ú±ú±ú±ú±ú±úú°úó°úì°úå°úÞ°ú×°úаúɰú°ú»°ú´°ú­°ú¦°úŸ°ú˜°ú‘°úаúƒ°ú|°úu°ún°úg°ú`°úY°úR°úK°úD°ú=°ú6°ú/°ú(°ú!°ú°ú°ú °ú°úþ¯ú÷¯úð¯úé¯úâ¯úÛ¯úÔ¯úͯúƯú¿¯ú¸¯ú±¯úª¯ú£¯úœ¯ú•¯úޝú‡¯ú€¯úy¯úr¯úk¯úd¯ú]¯úV¯úO¯úH¯úA¯ú:¯ú3¯ú,¯ú%¯ú¯ú¯ú¯ú ¯ú¯úû®úô®úí®úæ®úß®úØ®úÑ®úÊ®úîú¼®úµ®ú®®ú§®ú ®ú™®ú’®ú‹®ú„®ú}®úv®úo®úh®úa®úZ®úS®úL®úE®ú>®ú7®ú0®ú)®ú"®ú®ú®ú ®ú®úÿ­úø­úñ­úê­úã­úÜ­úÕ­úέúÇ­úÀ­ú¹­ú²­ú«­ú¤­ú­ú–­ú­úˆ­ú­úz­ús­úl­úe­ú^­úW­úP­úI­úB­ú;­ú4­ú-­ú&­ú­ú­ú­ú ­ú­úü¬úõ¬úî¬úç¬úà¬úÙ¬úÒ¬úˬúĬú½¬ú¶¬ú¯¬ú¨¬ú¡¬úš¬ú“¬úŒ¬ú…¬ú~¬úw¬úp¬úi¬úb¬ú[¬úT¬úM¬úF¬ú?¬ú8¬ú1¬ú*¬ú#¬ú¬ú¬ú¬ú¬ú¬úù«úò«úë«úä«úÝ«úÖ«úÏ«úÈ«úÁ«úº«ú³«ú¬«ú¥«úž«ú—«ú«ú‰«ú‚«ú{«út«úm«úf«ú_«úX«úQ«úJ«úC«ú<«ú5«ú.«ú'«ú «ú«ú«ú «ú«úýªúöªúïªúèªúáªúÚªúÓªú̪úŪú¾ªú·ªú°ªú©ªú¢ªú›ªú”ªúªú†ªúªúxªúqªújªúcªú\ªúUªúNªúGªú@ªú9ªú2ªú+ªú$ªúªúªúªúªúªúú©úó©úì©úå©úÞ©úשúЩúÉ©ú©ú»©ú´©ú­©ú¦©úŸ©ú˜©ú‘©úŠ©úƒ©ú|©úu©ún©úg©ú`©úY©úR©úK©úD©ú=©ú6©ú/©ú(©ú!©ú©ú©ú ©ú©úþ¨ú÷¨úð¨úé¨úâ¨úÛ¨úÔ¨úͨúƨú¿¨ú¸¨ú±¨úª¨ú£¨úœ¨ú•¨úލú‡¨ú€¨úy¨úr¨úk¨úd¨ú]¨úV¨úO¨úH¨úA¨ú:¨ú3¨ú,¨ú%¨ú¨ú¨ú¨ú ¨ú¨úû§úô§úí§úæ§úß§úاúѧúʧúçú¼§úµ§ú®§ú§§ú §ú™§ú’§ú‹§ú„§ú}§úv§úo§úh§úa§úZ§úS§úL§úE§ú>§ú7§ú0§ú)§ú"§ú§ú§ú §ú§úÿ¦úø¦úñ¦úê¦úã¦úܦúÕ¦úΦúǦúÀ¦ú¹¦ú²¦ú«¦ú¤¦ú¦ú–¦ú¦úˆ¦ú¦úz¦ús¦úl¦úe¦ú^¦úW¦úP¦úI¦úB¦ú;¦ú4¦ú-¦ú&¦ú¦ú¦ú¦ú ¦ú¦úü¥úõ¥úî¥úç¥úà¥úÙ¥úÒ¥úË¥úÄ¥ú½¥ú¶¥ú¯¥ú¨¥ú¡¥úš¥ú“¥úŒ¥ú…¥ú~¥úw¥úp¥úi¥úb¥ú[¥úT¥úM¥úF¥ú?¥ú8¥ú1¥ú*¥ú#¥ú¥ú¥ú¥ú¥ú¥úù¤úò¤úë¤úä¤úݤúÖ¤úϤúȤúÁ¤úº¤ú³¤ú¬¤ú¥¤úž¤ú—¤ú¤ú‰¤ú‚¤ú{¤út¤úm¤úf¤ú_¤úX¤úQ¤úJ¤úC¤ú<¤ú5¤ú.¤ú'¤ú ¤ú¤ú¤ú ¤ú¤úý£úö£úï£úè£úá£úÚ£úÓ£úÌ£úÅ£ú¾£ú·£ú°£ú©£ú¢£ú›£ú”£ú£ú†£ú£úx£úq£új£úc£ú\£úU£úN£úG£ú@£ú9£ú2£ú+£ú$£ú£ú£ú£ú£ú£úú¢úó¢úì¢úå¢úÞ¢ú×¢úТúÉ¢ú¢ú»¢ú´¢ú­¢ú¦¢úŸ¢ú˜¢ú‘¢úŠ¢úƒ¢ú|¢úu¢ún¢úg¢ú`¢úY¢úR¢úK¢úD¢ú=¢ú6¢ú/¢ú(¢ú!¢ú¢ú¢ú ¢ú¢úþ¡ú÷¡úð¡úé¡úâ¡úÛ¡úÔ¡úÍ¡úÆ¡ú¿¡ú¸¡ú±¡úª¡ú£¡úœ¡ú•¡úŽ¡ú‡¡ú€¡úy¡úr¡úk¡úd¡ú]¡úV¡úO¡úH¡úA¡ú:¡ú3¡ú,¡ú%¡ú¡ú¡ú¡ú ¡ú¡úû úô úí úæ úß úØ úÑ úÊ úàú¼ úµ ú® ú§ ú  ú™ ú’ ú‹ ú„ ú} úv úo úh úa úZ úS úL úE ú> ú7 ú0 ú) ú" ú ú ú  ú úÿŸúøŸúñŸúêŸúãŸúÜŸúÕŸúΟúÇŸúÀŸú¹Ÿú²Ÿú«Ÿú¤ŸúŸú–ŸúŸúˆŸúŸúzŸúsŸúlŸúeŸú^ŸúWŸúPŸúIŸúBŸú;Ÿú4Ÿú-Ÿú&ŸúŸúŸúŸú ŸúŸúüžúõžúîžúçžúàžúÙžúÒžúËžúÄžú½žú¶žú¯žú¨žú¡žúšžú“žúŒžú…žú~žúwžúpžúižúbžú[žúTžúMžúFžú?žú8žú1žú*žú#žúžúžúžúžúžúùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýœúöœúïœúèœúáœúÚœúÓœúÌœúÅœú¾œú·œú°œú©œú¢œú›œú”œúœú†œúœúxœúqœújœúcœú\œúUœúNœúGœú@œú9œú2œú+œú$œúœúœúœúœúœúú›úó›úì›úå›úÞ›ú×›úЛúÉ›ú›ú»›ú´›ú­›ú¦›úŸ›ú˜›ú‘›úŠ›úƒ›ú|›úu›ún›úg›ú`›úY›úR›úK›úD›ú=›ú6›ú/›ú(›ú!›ú›ú›ú ›ú›úþšú÷šúðšúéšúâšúÛšúÔšúÍšúÆšú¿šú¸šú±šúªšú£šúœšú•šúŽšú‡šú€šúyšúršúkšúdšú]šúVšúOšúHšúAšú:šú3šú,šú%šúšúšúšú šúšúû™úô™úí™úæ™úß™úØ™úÑ™úÊ™úÙú¼™úµ™ú®™ú§™ú ™ú™™ú’™ú‹™ú„™ú}™úv™úo™úh™úa™úZ™úS™úL™úE™ú>™ú7™ú0™ú)™ú"™ú™ú™ú ™ú™úÿ˜úø˜úñ˜úê˜úã˜úܘúÕ˜úΘúǘúÀ˜ú¹˜ú²˜ú«˜ú¤˜ú˜ú–˜ú˜úˆ˜ú˜úz˜ús˜úl˜úe˜ú^˜úW˜úP˜úI˜úB˜ú;˜ú4˜ú-˜ú&˜ú˜ú˜ú˜ú ˜ú˜úü—úõ—úî—úç—úà—úÙ—úÒ—úË—úÄ—ú½—ú¶—ú¯—ú¨—ú¡—úš—ú“—úŒ—ú…—ú~—úw—úp—úi—úb—ú[—úT—úM—úF—ú?—ú8—ú1—ú*—ú#—ú—ú—ú—ú—ú—úù–úò–úë–úä–úÝ–úÖ–úÏ–úÈ–úÁ–úº–ú³–ú¬–ú¥–úž–ú—–ú–ú‰–ú‚–ú{–út–úm–úf–ú_–úX–úQ–úJ–úC–ú<–ú5–ú.–ú'–ú –ú–ú–ú –ú–úý•úö•úï•úè•úá•úÚ•úÓ•úÌ•úÅ•ú¾•ú·•ú°•ú©•ú¢•ú›•ú”•ú•ú†•ú•úx•úq•új•úc•ú\•úU•úN•úG•ú@•ú9•ú2•ú+•ú$•ú•ú•ú•ú•ú•úú”úó”úì”úå”úÞ”ú×”úДúÉ”ú”ú»”ú´”ú­”ú¦”úŸ”ú˜”ú‘”úŠ”úƒ”ú|”úu”ún”úg”ú`”úY”úR”úK”úD”ú=”ú6”ú/”ú(”ú!”ú”ú”ú ”ú”úþ“ú÷“úð“úé“úâ“úÛ“úÔ“úÍ“úÆ“ú¿“ú¸“ú±“úª“ú£“úœ“ú•“úŽ“ú‡“ú€“úy“úr“úk“úd“ú]“úV“úO“úH“úA“ú:“ú3“ú,“ú%“ú“ú“ú“ú “ú“úû’úô’úí’úæ’úß’úØ’úÑ’úÊ’úÃ’ú¼’úµ’ú®’ú§’ú ’ú™’ú’’ú‹’ú„’ú}’úv’úo’úh’úa’úZ’úS’úL’úE’ú>’ú7’ú0’ú)’ú"’ú’ú’ú ’ú’úÿ‘úø‘úñ‘úê‘úã‘úÜ‘úÕ‘úΑúÇ‘úÀ‘ú¹‘ú²‘ú«‘ú¤‘ú‘ú–‘ú‘úˆ‘ú‘úz‘ús‘úl‘úe‘ú^‘úW‘úP‘úI‘úB‘ú;‘ú4‘ú-‘ú&‘ú‘ú‘ú‘ú ‘ú‘úüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýŽúöŽúïŽúèŽúáŽúÚŽúÓŽúÌŽúÅŽú¾Žú·Žú°Žú©Žú¢Žú›Žú”ŽúŽú†ŽúŽúxŽúqŽújŽúcŽú\ŽúUŽúNŽúGŽú@Žú9Žú2Žú+Žú$ŽúŽúŽúŽúŽúŽúúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþŒú÷ŒúðŒúéŒúâŒúÛŒúÔŒúÍŒúÆŒú¿Œú¸Œú±ŒúªŒú£ŒúœŒú•ŒúŽŒú‡Œú€ŒúyŒúrŒúkŒúdŒú]ŒúVŒúOŒúHŒúAŒú:Œú3Œú,Œú%ŒúŒúŒúŒú ŒúŒúû‹úô‹úí‹úæ‹úß‹úØ‹úÑ‹úÊ‹úËú¼‹úµ‹ú®‹ú§‹ú ‹ú™‹ú’‹ú‹‹ú„‹ú}‹úv‹úo‹úh‹úa‹úZ‹úS‹úL‹úE‹ú>‹ú7‹ú0‹ú)‹ú"‹ú‹ú‹ú ‹ú‹úÿŠúøŠúñŠúêŠúãŠúÜŠúÕŠúΊúÇŠúÀŠú¹Šú²Šú«Šú¤ŠúŠú–ŠúŠúˆŠúŠúzŠúsŠúlŠúeŠú^ŠúWŠúPŠúIŠúBŠú;Šú4Šú-Šú&ŠúŠúŠúŠú ŠúŠúü‰úõ‰úî‰úç‰úà‰úÙ‰úÒ‰úˉúĉú½‰ú¶‰ú¯‰ú¨‰ú¡‰úš‰ú“‰úŒ‰ú…‰ú~‰úw‰úp‰úi‰úb‰ú[‰úT‰úM‰úF‰ú?‰ú8‰ú1‰ú*‰ú#‰ú‰ú‰ú‰ú‰ú‰úùˆúòˆúëˆúäˆú݈úÖˆúψúȈúÁˆúºˆú³ˆú¬ˆú¥ˆúžˆú—ˆúˆú‰ˆú‚ˆú{ˆútˆúmˆúfˆú_ˆúXˆúQˆúJˆúCˆú<ˆú5ˆú.ˆú'ˆú ˆúˆúˆú ˆúˆúý‡úö‡úï‡úè‡úá‡úÚ‡úÓ‡ú̇úŇú¾‡ú·‡ú°‡ú©‡ú¢‡ú›‡ú”‡ú‡ú†‡ú‡úx‡úq‡új‡úc‡ú\‡úU‡úN‡úG‡ú@‡ú9‡ú2‡ú+‡ú$‡ú‡ú‡ú‡ú‡ú‡úú†úó†úì†úå†úÞ†ú׆úІúɆú†ú»†ú´†ú­†ú¦†úŸ†ú˜†ú‘†úІúƒ†ú|†úu†ún†úg†ú`†úY†úR†úK†úD†ú=†ú6†ú/†ú(†ú!†ú†ú†ú †ú†úþ…ú÷…úð…úé…úâ…úÛ…úÔ…úÍ…úÆ…ú¿…ú¸…ú±…úª…ú£…úœ…ú•…úŽ…ú‡…ú€…úy…úr…úk…úd…ú]…úV…úO…úH…úA…ú:…ú3…ú,…ú%…ú…ú…ú…ú …ú…úû„úô„úí„úæ„úß„úØ„úÑ„úÊ„úÄú¼„úµ„ú®„ú§„ú „ú™„ú’„ú‹„ú„„ú}„úv„úo„úh„úa„úZ„úS„úL„úE„ú>„ú7„ú0„ú)„ú"„ú„ú„ú „ú„úÿƒúøƒúñƒúêƒúãƒú܃úÕƒú΃úǃúÀƒú¹ƒú²ƒú«ƒú¤ƒúƒú–ƒúƒúˆƒúƒúzƒúsƒúlƒúeƒú^ƒúWƒúPƒúIƒúBƒú;ƒú4ƒú-ƒú&ƒúƒúƒúƒú ƒúƒúü‚úõ‚úî‚úç‚úà‚úÙ‚úÒ‚úË‚úÄ‚ú½‚ú¶‚ú¯‚ú¨‚ú¡‚úš‚ú“‚úŒ‚ú…‚ú~‚úw‚úp‚úi‚úb‚ú[‚úT‚úM‚úF‚ú?‚ú8‚ú1‚ú*‚ú#‚ú‚ú‚ú‚ú‚ú‚úùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúý€úö€úï€úè€úá€úÚ€úÓ€úÌ€úÅ€ú¾€ú·€ú°€ú©€ú¢€ú›€ú”€ú€ú†€ú€úx€úq€új€úc€ú\€úU€úN€úG€ú@€ú9€ú2€ú+€ú$€ú€ú€ú€ú€ú€úúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþ~ú÷~úð~úé~úâ~úÛ~úÔ~úÍ~úÆ~ú¿~ú¸~ú±~úª~ú£~úœ~ú•~úŽ~ú‡~ú€~úy~úr~úk~úd~ú]~úV~úO~úH~úA~ú:~ú3~ú,~ú%~ú~ú~ú~ú ~ú~úû}úô}úí}úæ}úß}úØ}úÑ}úÊ}úÃ}ú¼}úµ}ú®}ú§}ú }ú™}ú’}ú‹}ú„}ú}}úv}úo}úh}úa}úZ}úS}úL}úE}ú>}ú7}ú0}ú)}ú"}ú}ú}ú }ú}úÿ|úø|úñ|úê|úã|úÜ|úÕ|úÎ|úÇ|úÀ|ú¹|ú²|ú«|ú¤|ú|ú–|ú|úˆ|ú|úz|ús|úl|úe|ú^|úW|úP|úI|úB|ú;|ú4|ú-|ú&|ú|ú|ú|ú |ú|úü{úõ{úî{úç{úà{úÙ{úÒ{úË{úÄ{ú½{ú¶{ú¯{ú¨{ú¡{úš{ú“{úŒ{ú…{ú~{úw{úp{úi{úb{ú[{úT{úM{úF{ú?{ú8{ú1{ú*{ú#{ú{ú{ú{ú{ú{úùzúòzúëzúäzúÝzúÖzúÏzúÈzúÁzúºzú³zú¬zú¥zúžzú—zúzú‰zú‚zú{zútzúmzúfzú_zúXzúQzúJzúCzúvú7vú0vú)vú"vúvúvú vúvúÿuúøuúñuúêuúãuúÜuúÕuúÎuúÇuúÀuú¹uú²uú«uú¤uúuú–uúuúˆuúuúzuúsuúluúeuú^uúWuúPuúIuúBuú;uú4uú-uú&uúuúuúuú uúuúütúõtúîtúçtúàtúÙtúÒtúËtúÄtú½tú¶tú¯tú¨tú¡túštú“túŒtú…tú~túwtúptúitúbtú[túTtúMtúFtú?tú8tú1tú*tú#tútútútútútúùsúòsúësúäsúÝsúÖsúÏsúÈsúÁsúºsú³sú¬sú¥súžsú—súsú‰sú‚sú{sútsúmsúfsú_súXsúQsúJsúCsúoú7oú0oú)oú"oúoúoú oúoúÿnúønúñnúênúãnúÜnúÕnúÎnúÇnúÀnú¹nú²nú«nú¤núnú–núnúˆnúnúznúsnúlnúenú^núWnúPnúInúBnú;nú4nú-nú&núnúnúnú núnúümúõmúîmúçmúàmúÙmúÒmúËmúÄmú½mú¶mú¯mú¨mú¡múšmú“múŒmú…mú~múwmúpmúimúbmú[múTmúMmúFmú?mú8mú1mú*mú#múmúmúmúmúmúùlúòlúëlúälúÝlúÖlúÏlúÈlúÁlúºlú³lú¬lú¥lúžlú—lúlú‰lú‚lú{lútlúmlúflú_lúXlúQlúJlúClúhú7hú0hú)hú"húhúhú húhúÿgúøgúñgúêgúãgúÜgúÕgúÎgúÇgúÀgú¹gú²gú«gú¤gúgú–gúgúˆgúgúzgúsgúlgúegú^gúWgúPgúIgúBgú;gú4gú-gú&gúgúgúgú gúgúüfúõfúîfúçfúàfúÙfúÒfúËfúÄfú½fú¶fú¯fú¨fú¡fúšfú“fúŒfú…fú~fúwfúpfúifúbfú[fúTfúMfúFfú?fú8fú1fú*fú#fúfúfúfúfúfúùeúòeúëeúäeúÝeúÖeúÏeúÈeúÁeúºeú³eú¬eú¥eúžeú—eúeú‰eú‚eú{eúteúmeúfeú_eúXeúQeúJeúCeúaú7aú0aú)aú"aúaúaú aúaúÿ`úø`úñ`úê`úã`úÜ`úÕ`úÎ`úÇ`úÀ`ú¹`ú²`ú«`ú¤`ú`ú–`ú`úˆ`ú`úz`ús`úl`úe`ú^`úW`úP`úI`úB`ú;`ú4`ú-`ú&`ú`ú`ú`ú `ú`úü_úõ_úî_úç_úà_úÙ_úÒ_úË_úÄ_ú½_ú¶_ú¯_ú¨_ú¡_úš_ú“_úŒ_ú…_ú~_úw_úp_úi_úb_ú[_úT_úM_úF_ú?_ú8_ú1_ú*_ú#_ú_ú_ú_ú_ú_úù^úò^úë^úä^úÝ^úÖ^úÏ^úÈ^úÁ^úº^ú³^ú¬^ú¥^úž^ú—^ú^ú‰^ú‚^ú{^út^úm^úf^ú_^úX^úQ^úJ^úC^ú<^ú5^ú.^ú'^ú ^ú^ú^ú ^ú^úý]úö]úï]úè]úá]úÚ]úÓ]úÌ]úÅ]ú¾]ú·]ú°]ú©]ú¢]ú›]ú”]ú]ú†]ú]úx]úq]új]úc]ú\]úU]úN]úG]ú@]ú9]ú2]ú+]ú$]ú]ú]ú]ú]ú]úú\úó\úì\úå\úÞ\ú×\úÐ\úÉ\úÂ\ú»\ú´\ú­\ú¦\úŸ\ú˜\ú‘\úŠ\úƒ\ú|\úu\ún\úg\ú`\úY\úR\úK\úD\ú=\ú6\ú/\ú(\ú!\ú\ú\ú \ú\úþ[ú÷[úð[úé[úâ[úÛ[úÔ[úÍ[úÆ[ú¿[ú¸[ú±[úª[ú£[úœ[ú•[úŽ[ú‡[ú€[úy[úr[úk[úd[ú][úV[úO[úH[úA[ú:[ú3[ú,[ú%[ú[ú[ú[ú [ú[úûZúôZúíZúæZúßZúØZúÑZúÊZúÃZú¼ZúµZú®Zú§Zú Zú™Zú’Zú‹Zú„Zú}ZúvZúoZúhZúaZúZZúSZúLZúEZú>Zú7Zú0Zú)Zú"ZúZúZú ZúZúÿYúøYúñYúêYúãYúÜYúÕYúÎYúÇYúÀYú¹Yú²Yú«Yú¤YúYú–YúYúˆYúYúzYúsYúlYúeYú^YúWYúPYúIYúBYú;Yú4Yú-Yú&YúYúYúYú YúYúüXúõXúîXúçXúàXúÙXúÒXúËXúÄXú½Xú¶Xú¯Xú¨Xú¡XúšXú“XúŒXú…Xú~XúwXúpXúiXúbXú[XúTXúMXúFXú?Xú8Xú1Xú*Xú#XúXúXúXúXúXúùWúòWúëWúäWúÝWúÖWúÏWúÈWúÁWúºWú³Wú¬Wú¥WúžWú—WúWú‰Wú‚Wú{WútWúmWúfWú_WúXWúQWúJWúCWúSú7Sú0Sú)Sú"SúSúSú SúSúÿRúøRúñRúêRúãRúÜRúÕRúÎRúÇRúÀRú¹Rú²Rú«Rú¤RúRú–RúRúˆRúRúzRúsRúlRúeRú^RúWRúPRúIRúBRú;Rú4Rú-Rú&RúRúRúRú RúRúüQúõQúîQúçQúàQúÙQúÒQúËQúÄQú½Qú¶Qú¯Qú¨Qú¡QúšQú“QúŒQú…Qú~QúwQúpQúiQúbQú[QúTQúMQúFQú?Qú8Qú1Qú*Qú#QúQúQúQúQúQúùPúòPúëPúäPúÝPúÖPúÏPúÈPúÁPúºPú³Pú¬Pú¥PúžPú—PúPú‰Pú‚Pú{PútPúmPúfPú_PúXPúQPúJPúCPúLú7Lú0Lú)Lú"LúLúLú LúLúÿKúøKúñKúêKúãKúÜKúÕKúÎKúÇKúÀKú¹Kú²Kú«Kú¤KúKú–KúKúˆKúKúzKúsKúlKúeKú^KúWKúPKúIKúBKú;Kú4Kú-Kú&KúKúKúKú KúKúüJúõJúîJúçJúàJúÙJúÒJúËJúÄJú½Jú¶Jú¯Jú¨Jú¡JúšJú“JúŒJú…Jú~JúwJúpJúiJúbJú[JúTJúMJúFJú?Jú8Jú1Jú*Jú#JúJúJúJúJúJúùIúòIúëIúäIúÝIúÖIúÏIúÈIúÁIúºIú³Iú¬Iú¥IúžIú—IúIú‰Iú‚Iú{IútIúmIúfIú_IúXIúQIúJIúCIúEú7Eú0Eú)Eú"EúEúEú EúEúÿDúøDúñDúêDúãDúÜDúÕDúÎDúÇDúÀDú¹Dú²Dú«Dú¤DúDú–DúDúˆDúDúzDúsDúlDúeDú^DúWDúPDúIDúBDú;Dú4Dú-Dú&DúDúDúDú DúDúüCúõCúîCúçCúàCúÙCúÒCúËCúÄCú½Cú¶Cú¯Cú¨Cú¡CúšCú“CúŒCú…Cú~CúwCúpCúiCúbCú[CúTCúMCúFCú?Cú8Cú1Cú*Cú#CúCúCúCúCúCúùBúòBúëBúäBúÝBúÖBúÏBúÈBúÁBúºBú³Bú¬Bú¥BúžBú—BúBú‰Bú‚Bú{BútBúmBúfBú_BúXBúQBúJBúCBúúô>úí>úæ>úß>úØ>úÑ>úÊ>úÃ>ú¼>úµ>ú®>ú§>ú >ú™>ú’>ú‹>ú„>ú}>úv>úo>úh>úa>úZ>úS>úL>úE>ú>>ú7>ú0>ú)>ú">ú>ú>ú >ú>úÿ=úø=úñ=úê=úã=úÜ=úÕ=úÎ=úÇ=úÀ=ú¹=ú²=ú«=ú¤=ú=ú–=ú=úˆ=ú=úz=ús=úl=úe=ú^=úW=úP=úI=úB=ú;=ú4=ú-=ú&=ú=ú=ú=ú =ú=úü<úõ<úî<úç<úà<úÙ<úÒ<úË<úÄ<ú½<ú¶<ú¯<ú¨<ú¡<úš<ú“<úŒ<ú…<ú~<úw<úp<úi<úb<ú[<úT<úM<úF<ú?<ú8<ú1<ú*<ú#<ú<ú<ú<ú<ú<úù;úò;úë;úä;úÝ;úÖ;úÏ;úÈ;úÁ;úº;ú³;ú¬;ú¥;úž;ú—;ú;ú‰;ú‚;ú{;út;úm;úf;ú_;úX;úQ;úJ;úC;ú<;ú5;ú.;ú';ú ;ú;ú;ú ;ú;úý:úö:úï:úè:úá:úÚ:úÓ:úÌ:úÅ:ú¾:ú·:ú°:ú©:ú¢:ú›:ú”:ú:ú†:ú:úx:úq:új:úc:ú\:úU:úN:úG:ú@:ú9:ú2:ú+:ú$:ú:ú:ú:ú:ú:úú9úó9úì9úå9úÞ9ú×9úÐ9úÉ9úÂ9ú»9ú´9ú­9ú¦9úŸ9ú˜9ú‘9úŠ9úƒ9ú|9úu9ún9úg9ú`9úY9úR9úK9úD9ú=9ú69ú/9ú(9ú!9ú9ú9ú 9ú9úþ8ú÷8úð8úé8úâ8úÛ8úÔ8úÍ8úÆ8ú¿8ú¸8ú±8úª8ú£8úœ8ú•8úŽ8ú‡8ú€8úy8úr8úk8úd8ú]8úV8úO8úH8úA8ú:8ú38ú,8ú%8ú8ú8ú8ú 8ú8úû7úô7úí7úæ7úß7úØ7úÑ7úÊ7úÃ7ú¼7úµ7ú®7ú§7ú 7ú™7ú’7ú‹7ú„7ú}7úv7úo7úh7úa7úZ7úS7úL7úE7ú>7ú77ú07ú)7ú"7ú7ú7ú 7ú7úÿ6úø6úñ6úê6úã6úÜ6úÕ6úÎ6úÇ6úÀ6ú¹6ú²6ú«6ú¤6ú6ú–6ú6úˆ6ú6úz6ús6úl6úe6ú^6úW6úP6úI6úB6ú;6ú46ú-6ú&6ú6ú6ú6ú 6ú6úü5úõ5úî5úç5úà5úÙ5úÒ5úË5úÄ5ú½5ú¶5ú¯5ú¨5ú¡5úš5ú“5úŒ5ú…5ú~5úw5úp5úi5úb5ú[5úT5úM5úF5ú?5ú85ú15ú*5ú#5ú5ú5ú5ú5ú5úù4úò4úë4úä4úÝ4úÖ4úÏ4úÈ4úÁ4úº4ú³4ú¬4ú¥4úž4ú—4ú4ú‰4ú‚4ú{4út4úm4úf4ú_4úX4úQ4úJ4úC4ú<4ú54ú.4ú'4ú 4ú4ú4ú 4ú4úý3úö3úï3úè3úá3úÚ3úÓ3úÌ3úÅ3ú¾3ú·3ú°3ú©3ú¢3ú›3ú”3ú3ú†3ú3úx3úq3új3úc3ú\3úU3úN3úG3ú@3ú93ú23ú+3ú$3ú3ú3ú3ú3ú3úú2úó2úì2úå2úÞ2ú×2úÐ2úÉ2úÂ2ú»2ú´2ú­2ú¦2úŸ2ú˜2ú‘2úŠ2úƒ2ú|2úu2ún2úg2ú`2úY2úR2úK2úD2ú=2ú62ú/2ú(2ú!2ú2ú2ú 2ú2úþ1ú÷1úð1úé1úâ1úÛ1úÔ1úÍ1úÆ1ú¿1ú¸1ú±1úª1ú£1úœ1ú•1úŽ1ú‡1ú€1úy1úr1úk1úd1ú]1úV1úO1úH1úA1ú:1ú31ú,1ú%1ú1ú1ú1ú 1ú1úû0úô0úí0úæ0úß0úØ0úÑ0úÊ0úÃ0ú¼0úµ0ú®0ú§0ú 0ú™0ú’0ú‹0ú„0ú}0úv0úo0úh0úa0úZ0úS0úL0úE0ú>0ú70ú00ú)0ú"0ú0ú0ú 0ú0úÿ/úø/úñ/úê/úã/úÜ/úÕ/úÎ/úÇ/úÀ/ú¹/ú²/ú«/ú¤/ú/ú–/ú/úˆ/ú/úz/ús/úl/úe/ú^/úW/úP/úI/úB/ú;/ú4/ú-/ú&/ú/ú/ú/ú /ú/úü.úõ.úî.úç.úà.úÙ.úÒ.úË.úÄ.ú½.ú¶.ú¯.ú¨.ú¡.úš.ú“.úŒ.ú….ú~.úw.úp.úi.úb.ú[.úT.úM.úF.ú?.ú8.ú1.ú*.ú#.ú.ú.ú.ú.ú.úù-úò-úë-úä-úÝ-úÖ-úÏ-úÈ-úÁ-úº-ú³-ú¬-ú¥-úž-ú—-ú-ú‰-ú‚-ú{-út-úm-úf-ú_-úX-úQ-úJ-úC-ú<-ú5-ú.-ú'-ú -ú-ú-ú -ú-úý,úö,úï,úè,úá,úÚ,úÓ,úÌ,úÅ,ú¾,ú·,ú°,ú©,ú¢,ú›,ú”,ú,ú†,ú,úx,úq,új,úc,ú\,úU,úN,úG,ú@,ú9,ú2,ú+,ú$,ú,ú,ú,ú,ú,úú+úó+úì+úå+úÞ+ú×+úÐ+úÉ+úÂ+ú»+ú´+ú­+ú¦+úŸ+ú˜+ú‘+úŠ+úƒ+ú|+úu+ún+úg+ú`+úY+úR+úK+úD+ú=+ú6+ú/+ú(+ú!+ú+ú+ú +ú+úþ*ú÷*úð*úé*úâ*úÛ*úÔ*úÍ*úÆ*ú¿*ú¸*ú±*úª*ú£*úœ*ú•*úŽ*ú‡*ú€*úy*úr*úk*úd*ú]*úV*úO*úH*úA*ú:*ú3*ú,*ú%*ú*ú*ú*ú *ú*úû)úô)úí)úæ)úß)úØ)úÑ)úÊ)úÃ)ú¼)úµ)ú®)ú§)ú )ú™)ú’)ú‹)ú„)ú})úv)úo)úh)úa)úZ)úS)úL)úE)ú>)ú7)ú0)ú))ú")ú)ú)ú )ú)úÿ(úø(úñ(úê(úã(úÜ(úÕ(úÎ(úÇ(úÀ(ú¹(ú²(ú«(ú¤(ú(ú–(ú(úˆ(ú(úz(ús(úl(úe(ú^(úW(úP(úI(úB(ú;(ú4(ú-(ú&(ú(ú(ú(ú (ú(úü'úõ'úî'úç'úà'úÙ'úÒ'úË'úÄ'ú½'ú¶'ú¯'ú¨'ú¡'úš'ú“'úŒ'ú…'ú~'úw'úp'úi'úb'ú['úT'úM'úF'ú?'ú8'ú1'ú*'ú#'ú'ú'ú'ú'ú'úù&úò&úë&úä&úÝ&úÖ&úÏ&úÈ&úÁ&úº&ú³&ú¬&ú¥&úž&ú—&ú&ú‰&ú‚&ú{&út&úm&úf&ú_&úX&úQ&úJ&úC&ú<&ú5&ú.&ú'&ú &ú&ú&ú &ú&úý%úö%úï%úè%úá%úÚ%úÓ%úÌ%úÅ%ú¾%ú·%ú°%ú©%ú¢%ú›%ú”%ú%ú†%ú%úx%úq%új%úc%ú\%úU%úN%úG%ú@%ú9%ú2%ú+%ú$%ú%ú%ú%ú%ú%úú$úó$úì$úå$úÞ$ú×$úÐ$úÉ$úÂ$ú»$ú´$ú­$ú¦$úŸ$ú˜$ú‘$úŠ$úƒ$ú|$úu$ún$úg$ú`$úY$úR$úK$úD$ú=$ú6$ú/$ú($ú!$ú$ú$ú $ú$úþ#ú÷#úð#úé#úâ#úÛ#úÔ#úÍ#úÆ#ú¿#ú¸#ú±#úª#ú£#úœ#ú•#úŽ#ú‡#ú€#úy#úr#úk#úd#ú]#úV#úO#úH#úA#ú:#ú3#ú,#ú%#ú#ú#ú#ú #ú#úû"úô"úí"úæ"úß"úØ"úÑ"úÊ"úÃ"ú¼"úµ"ú®"ú§"ú "ú™"ú’"ú‹"ú„"ú}"úv"úo"úh"úa"úZ"úS"úL"úE"ú>"ú7"ú0"ú)"ú""ú"ú"ú "ú"úÿ!úø!úñ!úê!úã!úÜ!úÕ!úÎ!úÇ!úÀ!ú¹!ú²!ú«!ú¤!ú!ú–!ú!úˆ!ú!úz!ús!úl!úe!ú^!úW!úP!úI!úB!ú;!ú4!ú-!ú&!ú!ú!ú!ú !ú!úü úõ úî úç úà úÙ úÒ úË úÄ ú½ ú¶ ú¯ ú¨ ú¡ úš ú“ úŒ ú… ú~ úw úp úi úb ú[ úT úM úF ú? ú8 ú1 ú* ú# ú ú ú ú ú úùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúû úô úí úæ úß úØ úÑ úÊ úà ú¼ úµ ú® ú§ ú  ú™ ú’ ú‹ ú„ ú} úv úo úh úa úZ úS úL úE ú> ú7 ú0 ú) ú" ú ú ú ú úÿ úø úñ úê úã úÜ úÕ úÎ úÇ úÀ ú¹ ú² ú« ú¤ ú ú– ú úˆ ú úz ús úl úe ú^ úW úP úI úB ú; ú4 ú- ú& ú ú ú ú ú úü úõ úî úç úà úÙ úÒ úË úÄ ú½ ú¶ ú¯ ú¨ ú¡ úš ú“ úŒ ú… ú~ úw úp úi úb ú[ úT úM úF ú? ú8 ú1 ú* ú# ú ú ú ú ú úù úò úë úä úÝ úÖ úÏ úÈ úÁ úº ú³ ú¬ ú¥ úž ú— ú ú‰ ú‚ ú{ út úm úf ú_ úX úQ úJ úC ú< ú5 ú. ú' ú ú ú ú ú úý úö úï úè úá úÚ úÓ úÌ úÅ ú¾ ú· ú° ú© ú¢ ú› ú” ú ú† ú úx úq új úc ú\ úU úN úG ú@ ú9 ú2 ú+ ú$ ú ú ú ú ú úúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûÿùôÿùíÿùæÿùßÿùØÿùÑÿùÊÿùÃÿù¼ÿùµÿù®ÿù§ÿù ÿù™ÿù’ÿù‹ÿù„ÿù}ÿùvÿùoÿùhÿùaÿùZÿùSÿùLÿùEÿù>ÿù7ÿù0ÿù)ÿù"ÿùÿùÿù ÿùÿùÿþùøþùñþùêþùãþùÜþùÕþùÎþùÇþùÀþù¹þù²þù«þù¤þùþù–þùþùˆþùþùzþùsþùlþùeþù^þùWþùPþùIþùBþù;þù4þù-þù&þùþùþùþù þùþùüýùõýùîýùçýùàýùÙýùÒýùËýùÄýù½ýù¶ýù¯ýù¨ýù¡ýùšýù“ýùŒýù…ýù~ýùwýùpýùiýùbýù[ýùTýùMýùFýù?ýù8ýù1ýù*ýù#ýùýùýùýùýùýùùüùòüùëüùäüùÝüùÖüùÏüùÈüùÁüùºüù³üù¬üù¥üùžüù—üùüù‰üù‚üù{üùtüùmüùfüù_üùXüùQüùJüùCüù<üù5üù.üù'üù üùüùüù üùüùýûùöûùïûùèûùáûùÚûùÓûùÌûùÅûù¾ûù·ûù°ûù©ûù¢ûù›ûù”ûùûù†ûùûùxûùqûùjûùcûù\ûùUûùNûùGûù@ûù9ûù2ûù+ûù$ûùûùûùûùûùûùúúùóúùìúùåúùÞúù×úùÐúùÉúùÂúù»úù´úù­úù¦úùŸúù˜úù‘úùŠúùƒúù|úùuúùnúùgúù`úùYúùRúùKúùDúù=úù6úù/úù(úù!úùúùúù úùúùþùù÷ùùðùùéùùâùùÛùùÔùùÍùùÆùù¿ùù¸ùù±ùùªùù£ùùœùù•ùùŽùù‡ùù€ùùyùùrùùkùùdùù]ùùVùùOùùHùùAùù:ùù3ùù,ùù%ùùùùùùùù ùùùùûøùôøùíøùæøùßøùØøùÑøùÊøùÃøù¼øùµøù®øù§øù øù™øù’øù‹øù„øù}øùvøùoøùhøùaøùZøùSøùLøùEøù>øù7øù0øù)øù"øùøùøù øùøùÿ÷ùø÷ùñ÷ùê÷ùã÷ùÜ÷ùÕ÷ùÎ÷ùÇ÷ùÀ÷ù¹÷ù²÷ù«÷ù¤÷ù÷ù–÷ù÷ùˆ÷ù÷ùz÷ùs÷ùl÷ùe÷ù^÷ùW÷ùP÷ùI÷ùB÷ù;÷ù4÷ù-÷ù&÷ù÷ù÷ù÷ù ÷ù÷ùüöùõöùîöùçöùàöùÙöùÒöùËöùÄöù½öù¶öù¯öù¨öù¡öùšöù“öùŒöù…öù~öùwöùpöùiöùböù[öùTöùMöùFöù?öù8öù1öù*öù#öùöùöùöùöùöùùõùòõùëõùäõùÝõùÖõùÏõùÈõùÁõùºõù³õù¬õù¥õùžõù—õùõù‰õù‚õù{õùtõùmõùfõù_õùXõùQõùJõùCõù<õù5õù.õù'õù õùõùõù õùõùýôùöôùïôùèôùáôùÚôùÓôùÌôùÅôù¾ôù·ôù°ôù©ôù¢ôù›ôù”ôùôù†ôùôùxôùqôùjôùcôù\ôùUôùNôùGôù@ôù9ôù2ôù+ôù$ôùôùôùôùôùôùúóùóóùìóùåóùÞóù×óùÐóùÉóùÂóù»óù´óù­óù¦óùŸóù˜óù‘óùŠóùƒóù|óùuóùnóùgóù`óùYóùRóùKóùDóù=óù6óù/óù(óù!óùóùóù óùóùþòù÷òùðòùéòùâòùÛòùÔòùÍòùÆòù¿òù¸òù±òùªòù£òùœòù•òùŽòù‡òù€òùyòùròùkòùdòù]òùVòùOòùHòùAòù:òù3òù,òù%òùòùòùòù òùòùûñùôñùíñùæñùßñùØñùÑñùÊñùÃñù¼ñùµñù®ñù§ñù ñù™ñù’ñù‹ñù„ñù}ñùvñùoñùhñùañùZñùSñùLñùEñù>ñù7ñù0ñù)ñù"ñùñùñù ñùñùÿðùøðùñðùêðùãðùÜðùÕðùÎðùÇðùÀðù¹ðù²ðù«ðù¤ðùðù–ðùðùˆðùðùzðùsðùlðùeðù^ðùWðùPðùIðùBðù;ðù4ðù-ðù&ðùðùðùðù ðùðùüïùõïùîïùçïùàïùÙïùÒïùËïùÄïù½ïù¶ïù¯ïù¨ïù¡ïùšïù“ïùŒïù…ïù~ïùwïùpïùiïùbïù[ïùTïùMïùFïù?ïù8ïù1ïù*ïù#ïùïùïùïùïùïùùîùòîùëîùäîùÝîùÖîùÏîùÈîùÁîùºîù³îù¬îù¥îùžîù—îùîù‰îù‚îù{îùtîùmîùfîù_îùXîùQîùJîùCîù<îù5îù.îù'îù îùîùîù îùîùýíùöíùïíùèíùáíùÚíùÓíùÌíùÅíù¾íù·íù°íù©íù¢íù›íù”íùíù†íùíùxíùqíùjíùcíù\íùUíùNíùGíù@íù9íù2íù+íù$íùíùíùíùíùíùúìùóìùììùåìùÞìù×ìùÐìùÉìùÂìù»ìù´ìù­ìù¦ìùŸìù˜ìù‘ìùŠìùƒìù|ìùuìùnìùgìù`ìùYìùRìùKìùDìù=ìù6ìù/ìù(ìù!ìùìùìù ìùìùþëù÷ëùðëùéëùâëùÛëùÔëùÍëùÆëù¿ëù¸ëù±ëùªëù£ëùœëù•ëùŽëù‡ëù€ëùyëùrëùkëùdëù]ëùVëùOëùHëùAëù:ëù3ëù,ëù%ëùëùëùëù ëùëùûêùôêùíêùæêùßêùØêùÑêùÊêùÃêù¼êùµêù®êù§êù êù™êù’êù‹êù„êù}êùvêùoêùhêùaêùZêùSêùLêùEêù>êù7êù0êù)êù"êùêùêù êùêùÿéùøéùñéùêéùãéùÜéùÕéùÎéùÇéùÀéù¹éù²éù«éù¤éùéù–éùéùˆéùéùzéùséùléùeéù^éùWéùPéùIéùBéù;éù4éù-éù&éùéùéùéù éùéùüèùõèùîèùçèùàèùÙèùÒèùËèùÄèù½èù¶èù¯èù¨èù¡èùšèù“èùŒèù…èù~èùwèùpèùièùbèù[èùTèùMèùFèù?èù8èù1èù*èù#èùèùèùèùèùèùùçùòçùëçùäçùÝçùÖçùÏçùÈçùÁçùºçù³çù¬çù¥çùžçù—çùçù‰çù‚çù{çùtçùmçùfçù_çùXçùQçùJçùCçù<çù5çù.çù'çù çùçùçù çùçùýæùöæùïæùèæùáæùÚæùÓæùÌæùÅæù¾æù·æù°æù©æù¢æù›æù”æùæù†æùæùxæùqæùjæùcæù\æùUæùNæùGæù@æù9æù2æù+æù$æùæùæùæùæùæùúåùóåùìåùååùÞåù×åùÐåùÉåùÂåù»åù´åù­åù¦åùŸåù˜åù‘åùŠåùƒåù|åùuåùnåùgåù`åùYåùRåùKåùDåù=åù6åù/åù(åù!åùåùåù åùåùþäù÷äùðäùéäùâäùÛäùÔäùÍäùÆäù¿äù¸äù±äùªäù£äùœäù•äùŽäù‡äù€äùyäùräùkäùdäù]äùVäùOäùHäùAäù:äù3äù,äù%äùäùäùäù äùäùûãùôãùíãùæãùßãùØãùÑãùÊãùÃãù¼ãùµãù®ãù§ãù ãù™ãù’ãù‹ãù„ãù}ãùvãùoãùhãùaãùZãùSãùLãùEãù>ãù7ãù0ãù)ãù"ãùãùãù ãùãùÿâùøâùñâùêâùãâùÜâùÕâùÎâùÇâùÀâù¹âù²âù«âù¤âùâù–âùâùˆâùâùzâùsâùlâùeâù^âùWâùPâùIâùBâù;âù4âù-âù&âùâùâùâù âùâùüáùõáùîáùçáùàáùÙáùÒáùËáùÄáù½áù¶áù¯áù¨áù¡áùšáù“áùŒáù…áù~áùwáùpáùiáùbáù[áùTáùMáùFáù?áù8áù1áù*áù#áùáùáùáùáùáùùàùòàùëàùäàùÝàùÖàùÏàùÈàùÁàùºàù³àù¬àù¥àùžàù—àùàù‰àù‚àù{àùtàùmàùfàù_àùXàùQàùJàùCàù<àù5àù.àù'àù àùàùàù àùàùýßùößùïßùèßùáßùÚßùÓßùÌßùÅßù¾ßù·ßù°ßù©ßù¢ßù›ßù”ßùßù†ßùßùxßùqßùjßùcßù\ßùUßùNßùGßù@ßù9ßù2ßù+ßù$ßùßùßùßùßùßùúÞùóÞùìÞùåÞùÞÞù×ÞùÐÞùÉÞùÂÞù»Þù´Þù­Þù¦ÞùŸÞù˜Þù‘ÞùŠÞùƒÞù|ÞùuÞùnÞùgÞù`ÞùYÞùRÞùKÞùDÞù=Þù6Þù/Þù(Þù!ÞùÞùÞù ÞùÞùþÝù÷ÝùðÝùéÝùâÝùÛÝùÔÝùÍÝùÆÝù¿Ýù¸Ýù±ÝùªÝù£ÝùœÝù•ÝùŽÝù‡Ýù€ÝùyÝùrÝùkÝùdÝù]ÝùVÝùOÝùHÝùAÝù:Ýù3Ýù,Ýù%ÝùÝùÝùÝù ÝùÝùûÜùôÜùíÜùæÜùßÜùØÜùÑÜùÊÜùÃÜù¼ÜùµÜù®Üù§Üù Üù™Üù’Üù‹Üù„Üù}ÜùvÜùoÜùhÜùaÜùZÜùSÜùLÜùEÜù>Üù7Üù0Üù)Üù"ÜùÜùÜù ÜùÜùÿÛùøÛùñÛùêÛùãÛùÜÛùÕÛùÎÛùÇÛùÀÛù¹Ûù²Ûù«Ûù¤ÛùÛù–ÛùÛùˆÛùÛùzÛùsÛùlÛùeÛù^ÛùWÛùPÛùIÛùBÛù;Ûù4Ûù-Ûù&ÛùÛùÛùÛù ÛùÛùüÚùõÚùîÚùçÚùàÚùÙÚùÒÚùËÚùÄÚù½Úù¶Úù¯Úù¨Úù¡ÚùšÚù“ÚùŒÚù…Úù~ÚùwÚùpÚùiÚùbÚù[ÚùTÚùMÚùFÚù?Úù8Úù1Úù*Úù#ÚùÚùÚùÚùÚùÚùùÙùòÙùëÙùäÙùÝÙùÖÙùÏÙùÈÙùÁÙùºÙù³Ùù¬Ùù¥ÙùžÙù—ÙùÙù‰Ùù‚Ùù{ÙùtÙùmÙùfÙù_ÙùXÙùQÙùJÙùCÙù<Ùù5Ùù.Ùù'Ùù ÙùÙùÙù ÙùÙùýØùöØùïØùèØùáØùÚØùÓØùÌØùÅØù¾Øù·Øù°Øù©Øù¢Øù›Øù”ØùØù†ØùØùxØùqØùjØùcØù\ØùUØùNØùGØù@Øù9Øù2Øù+Øù$ØùØùØùØùØùØùú×ùó×ùì×ùå×ùÞ×ù××ùÐ×ùÉ×ùÂ×ù»×ù´×ù­×ù¦×ùŸ×ù˜×ù‘×ùŠ×ùƒ×ù|×ùu×ùn×ùg×ù`×ùY×ùR×ùK×ùD×ù=×ù6×ù/×ù(×ù!×ù×ù×ù ×ù×ùþÖù÷ÖùðÖùéÖùâÖùÛÖùÔÖùÍÖùÆÖù¿Öù¸Öù±ÖùªÖù£ÖùœÖù•ÖùŽÖù‡Öù€ÖùyÖùrÖùkÖùdÖù]ÖùVÖùOÖùHÖùAÖù:Öù3Öù,Öù%ÖùÖùÖùÖù ÖùÖùûÕùôÕùíÕùæÕùßÕùØÕùÑÕùÊÕùÃÕù¼ÕùµÕù®Õù§Õù Õù™Õù’Õù‹Õù„Õù}ÕùvÕùoÕùhÕùaÕùZÕùSÕùLÕùEÕù>Õù7Õù0Õù)Õù"ÕùÕùÕù ÕùÕùÿÔùøÔùñÔùêÔùãÔùÜÔùÕÔùÎÔùÇÔùÀÔù¹Ôù²Ôù«Ôù¤ÔùÔù–ÔùÔùˆÔùÔùzÔùsÔùlÔùeÔù^ÔùWÔùPÔùIÔùBÔù;Ôù4Ôù-Ôù&ÔùÔùÔùÔù ÔùÔùüÓùõÓùîÓùçÓùàÓùÙÓùÒÓùËÓùÄÓù½Óù¶Óù¯Óù¨Óù¡ÓùšÓù“ÓùŒÓù…Óù~ÓùwÓùpÓùiÓùbÓù[ÓùTÓùMÓùFÓù?Óù8Óù1Óù*Óù#ÓùÓùÓùÓùÓùÓùùÒùòÒùëÒùäÒùÝÒùÖÒùÏÒùÈÒùÁÒùºÒù³Òù¬Òù¥ÒùžÒù—ÒùÒù‰Òù‚Òù{ÒùtÒùmÒùfÒù_ÒùXÒùQÒùJÒùCÒù<Òù5Òù.Òù'Òù ÒùÒùÒù ÒùÒùýÑùöÑùïÑùèÑùáÑùÚÑùÓÑùÌÑùÅÑù¾Ñù·Ñù°Ñù©Ñù¢Ñù›Ñù”ÑùÑù†ÑùÑùxÑùqÑùjÑùcÑù\ÑùUÑùNÑùGÑù@Ñù9Ñù2Ñù+Ñù$ÑùÑùÑùÑùÑùÑùúÐùóÐùìÐùåÐùÞÐù×ÐùÐÐùÉÐùÂÐù»Ðù´Ðù­Ðù¦ÐùŸÐù˜Ðù‘ÐùŠÐùƒÐù|ÐùuÐùnÐùgÐù`ÐùYÐùRÐùKÐùDÐù=Ðù6Ðù/Ðù(Ðù!ÐùÐùÐù ÐùÐùþÏù÷ÏùðÏùéÏùâÏùÛÏùÔÏùÍÏùÆÏù¿Ïù¸Ïù±ÏùªÏù£ÏùœÏù•ÏùŽÏù‡Ïù€ÏùyÏùrÏùkÏùdÏù]ÏùVÏùOÏùHÏùAÏù:Ïù3Ïù,Ïù%ÏùÏùÏùÏù ÏùÏùûÎùôÎùíÎùæÎùßÎùØÎùÑÎùÊÎùÃÎù¼ÎùµÎù®Îù§Îù Îù™Îù’Îù‹Îù„Îù}ÎùvÎùoÎùhÎùaÎùZÎùSÎùLÎùEÎù>Îù7Îù0Îù)Îù"ÎùÎùÎù ÎùÎùÿÍùøÍùñÍùêÍùãÍùÜÍùÕÍùÎÍùÇÍùÀÍù¹Íù²Íù«Íù¤ÍùÍù–ÍùÍùˆÍùÍùzÍùsÍùlÍùeÍù^ÍùWÍùPÍùIÍùBÍù;Íù4Íù-Íù&ÍùÍùÍùÍù ÍùÍùüÌùõÌùîÌùçÌùàÌùÙÌùÒÌùËÌùÄÌù½Ìù¶Ìù¯Ìù¨Ìù¡ÌùšÌù“ÌùŒÌù…Ìù~ÌùwÌùpÌùiÌùbÌù[ÌùTÌùMÌùFÌù?Ìù8Ìù1Ìù*Ìù#ÌùÌùÌùÌùÌùÌùùËùòËùëËùäËùÝËùÖËùÏËùÈËùÁËùºËù³Ëù¬Ëù¥ËùžËù—ËùËù‰Ëù‚Ëù{ËùtËùmËùfËù_ËùXËùQËùJËùCËù<Ëù5Ëù.Ëù'Ëù ËùËùËù ËùËùýÊùöÊùïÊùèÊùáÊùÚÊùÓÊùÌÊùÅÊù¾Êù·Êù°Êù©Êù¢Êù›Êù”ÊùÊù†ÊùÊùxÊùqÊùjÊùcÊù\ÊùUÊùNÊùGÊù@Êù9Êù2Êù+Êù$ÊùÊùÊùÊùÊùÊùúÉùóÉùìÉùåÉùÞÉù×ÉùÐÉùÉÉùÂÉù»Éù´Éù­Éù¦ÉùŸÉù˜Éù‘ÉùŠÉùƒÉù|ÉùuÉùnÉùgÉù`ÉùYÉùRÉùKÉùDÉù=Éù6Éù/Éù(Éù!ÉùÉùÉù ÉùÉùþÈù÷ÈùðÈùéÈùâÈùÛÈùÔÈùÍÈùÆÈù¿Èù¸Èù±ÈùªÈù£ÈùœÈù•ÈùŽÈù‡Èù€ÈùyÈùrÈùkÈùdÈù]ÈùVÈùOÈùHÈùAÈù:Èù3Èù,Èù%ÈùÈùÈùÈù ÈùÈùûÇùôÇùíÇùæÇùßÇùØÇùÑÇùÊÇùÃÇù¼ÇùµÇù®Çù§Çù Çù™Çù’Çù‹Çù„Çù}ÇùvÇùoÇùhÇùaÇùZÇùSÇùLÇùEÇù>Çù7Çù0Çù)Çù"ÇùÇùÇù ÇùÇùÿÆùøÆùñÆùêÆùãÆùÜÆùÕÆùÎÆùÇÆùÀÆù¹Æù²Æù«Æù¤ÆùÆù–ÆùÆùˆÆùÆùzÆùsÆùlÆùeÆù^ÆùWÆùPÆùIÆùBÆù;Æù4Æù-Æù&ÆùÆùÆùÆù ÆùÆùüÅùõÅùîÅùçÅùàÅùÙÅùÒÅùËÅùÄÅù½Åù¶Åù¯Åù¨Åù¡ÅùšÅù“ÅùŒÅù…Åù~ÅùwÅùpÅùiÅùbÅù[ÅùTÅùMÅùFÅù?Åù8Åù1Åù*Åù#ÅùÅùÅùÅùÅùÅùùÄùòÄùëÄùäÄùÝÄùÖÄùÏÄùÈÄùÁÄùºÄù³Äù¬Äù¥ÄùžÄù—ÄùÄù‰Äù‚Äù{ÄùtÄùmÄùfÄù_ÄùXÄùQÄùJÄùCÄù<Äù5Äù.Äù'Äù ÄùÄùÄù ÄùÄùýÃùöÃùïÃùèÃùáÃùÚÃùÓÃùÌÃùÅÃù¾Ãù·Ãù°Ãù©Ãù¢Ãù›Ãù”ÃùÃù†ÃùÃùxÃùqÃùjÃùcÃù\ÃùUÃùNÃùGÃù@Ãù9Ãù2Ãù+Ãù$ÃùÃùÃùÃùÃùÃùúÂùóÂùìÂùåÂùÞÂù×ÂùÐÂùÉÂùÂÂù»Âù´Âù­Âù¦ÂùŸÂù˜Âù‘ÂùŠÂùƒÂù|ÂùuÂùnÂùgÂù`ÂùYÂùRÂùKÂùDÂù=Âù6Âù/Âù(Âù!ÂùÂùÂù ÂùÂùþÁù÷ÁùðÁùéÁùâÁùÛÁùÔÁùÍÁùÆÁù¿Áù¸Áù±ÁùªÁù£ÁùœÁù•ÁùŽÁù‡Áù€ÁùyÁùrÁùkÁùdÁù]ÁùVÁùOÁùHÁùAÁù:Áù3Áù,Áù%ÁùÁùÁùÁù ÁùÁùûÀùôÀùíÀùæÀùßÀùØÀùÑÀùÊÀùÃÀù¼ÀùµÀù®Àù§Àù Àù™Àù’Àù‹Àù„Àù}ÀùvÀùoÀùhÀùaÀùZÀùSÀùLÀùEÀù>Àù7Àù0Àù)Àù"ÀùÀùÀù ÀùÀùÿ¿ùø¿ùñ¿ùê¿ùã¿ùÜ¿ùÕ¿ùοùÇ¿ùÀ¿ù¹¿ù²¿ù«¿ù¤¿ù¿ù–¿ù¿ùˆ¿ù¿ùz¿ùs¿ùl¿ùe¿ù^¿ùW¿ùP¿ùI¿ùB¿ù;¿ù4¿ù-¿ù&¿ù¿ù¿ù¿ù ¿ù¿ùü¾ùõ¾ùî¾ùç¾ùà¾ùÙ¾ùÒ¾ù˾ùľù½¾ù¶¾ù¯¾ù¨¾ù¡¾ùš¾ù“¾ùŒ¾ù…¾ù~¾ùw¾ùp¾ùi¾ùb¾ù[¾ùT¾ùM¾ùF¾ù?¾ù8¾ù1¾ù*¾ù#¾ù¾ù¾ù¾ù¾ù¾ùù½ùò½ùë½ùä½ùݽùÖ½ùϽùȽùÁ½ùº½ù³½ù¬½ù¥½ùž½ù—½ù½ù‰½ù‚½ù{½ùt½ùm½ùf½ù_½ùX½ùQ½ùJ½ùC½ù<½ù5½ù.½ù'½ù ½ù½ù½ù ½ù½ùý¼ùö¼ùï¼ùè¼ùá¼ùÚ¼ùÓ¼ù̼ùżù¾¼ù·¼ù°¼ù©¼ù¢¼ù›¼ù”¼ù¼ù†¼ù¼ùx¼ùq¼ùj¼ùc¼ù\¼ùU¼ùN¼ùG¼ù@¼ù9¼ù2¼ù+¼ù$¼ù¼ù¼ù¼ù¼ù¼ùú»ùó»ùì»ùå»ùÞ»ù×»ùлùÉ»ù»ù»»ù´»ù­»ù¦»ùŸ»ù˜»ù‘»ùŠ»ùƒ»ù|»ùu»ùn»ùg»ù`»ùY»ùR»ùK»ùD»ù=»ù6»ù/»ù(»ù!»ù»ù»ù »ù»ùþºù÷ºùðºùéºùâºùÛºùÔºùͺùƺù¿ºù¸ºù±ºùªºù£ºùœºù•ºùŽºù‡ºù€ºùyºùrºùkºùdºù]ºùVºùOºùHºùAºù:ºù3ºù,ºù%ºùºùºùºù ºùºùû¹ùô¹ùí¹ùæ¹ùß¹ùعùѹùʹùùù¼¹ùµ¹ù®¹ù§¹ù ¹ù™¹ù’¹ù‹¹ù„¹ù}¹ùv¹ùo¹ùh¹ùa¹ùZ¹ùS¹ùL¹ùE¹ù>¹ù7¹ù0¹ù)¹ù"¹ù¹ù¹ù ¹ù¹ùÿ¸ùø¸ùñ¸ùê¸ùã¸ùܸùÕ¸ùθùǸùÀ¸ù¹¸ù²¸ù«¸ù¤¸ù¸ù–¸ù¸ùˆ¸ù¸ùz¸ùs¸ùl¸ùe¸ù^¸ùW¸ùP¸ùI¸ùB¸ù;¸ù4¸ù-¸ù&¸ù¸ù¸ù¸ù ¸ù¸ùü·ùõ·ùî·ùç·ùà·ùÙ·ùÒ·ùË·ùÄ·ù½·ù¶·ù¯·ù¨·ù¡·ùš·ù“·ùŒ·ù…·ù~·ùw·ùp·ùi·ùb·ù[·ùT·ùM·ùF·ù?·ù8·ù1·ù*·ù#·ù·ù·ù·ù·ù·ùù¶ùò¶ùë¶ùä¶ùݶùÖ¶ù϶ùȶùÁ¶ùº¶ù³¶ù¬¶ù¥¶ùž¶ù—¶ù¶ù‰¶ù‚¶ù{¶ùt¶ùm¶ùf¶ù_¶ùX¶ùQ¶ùJ¶ùC¶ù<¶ù5¶ù.¶ù'¶ù ¶ù¶ù¶ù ¶ù¶ùýµùöµùïµùèµùáµùÚµùÓµù̵ùŵù¾µù·µù°µù©µù¢µù›µù”µùµù†µùµùxµùqµùjµùcµù\µùUµùNµùGµù@µù9µù2µù+µù$µùµùµùµùµùµùú´ùó´ùì´ùå´ùÞ´ù×´ùдùÉ´ù´ù»´ù´´ù­´ù¦´ùŸ´ù˜´ù‘´ùŠ´ùƒ´ù|´ùu´ùn´ùg´ù`´ùY´ùR´ùK´ùD´ù=´ù6´ù/´ù(´ù!´ù´ù´ù ´ù´ùþ³ù÷³ùð³ùé³ùâ³ùÛ³ùÔ³ùͳùƳù¿³ù¸³ù±³ùª³ù£³ùœ³ù•³ù޳ù‡³ù€³ùy³ùr³ùk³ùd³ù]³ùV³ùO³ùH³ùA³ù:³ù3³ù,³ù%³ù³ù³ù³ù ³ù³ùû²ùô²ùí²ùæ²ùß²ùزùѲùʲùòù¼²ùµ²ù®²ù§²ù ²ù™²ù’²ù‹²ù„²ù}²ùv²ùo²ùh²ùa²ùZ²ùS²ùL²ùE²ù>²ù7²ù0²ù)²ù"²ù²ù²ù ²ù²ùÿ±ùø±ùñ±ùê±ùã±ùܱùÕ±ùαùDZùÀ±ù¹±ù²±ù«±ù¤±ù±ù–±ù±ùˆ±ù±ùz±ùs±ùl±ùe±ù^±ùW±ùP±ùI±ùB±ù;±ù4±ù-±ù&±ù±ù±ù±ù ±ù±ùü°ùõ°ùî°ùç°ùà°ùÙ°ùÒ°ù˰ùİù½°ù¶°ù¯°ù¨°ù¡°ùš°ù“°ùŒ°ù…°ù~°ùw°ùp°ùi°ùb°ù[°ùT°ùM°ùF°ù?°ù8°ù1°ù*°ù#°ù°ù°ù°ù°ù°ùù¯ùò¯ùë¯ùä¯ùݯùÖ¯ùϯùȯùÁ¯ùº¯ù³¯ù¬¯ù¥¯ùž¯ù—¯ù¯ù‰¯ù‚¯ù{¯ùt¯ùm¯ùf¯ù_¯ùX¯ùQ¯ùJ¯ùC¯ù<¯ù5¯ù.¯ù'¯ù ¯ù¯ù¯ù ¯ù¯ùý®ùö®ùï®ùè®ùá®ùÚ®ùÓ®ùÌ®ùÅ®ù¾®ù·®ù°®ù©®ù¢®ù›®ù”®ù®ù†®ù®ùx®ùq®ùj®ùc®ù\®ùU®ùN®ùG®ù@®ù9®ù2®ù+®ù$®ù®ù®ù®ù®ù®ùú­ùó­ùì­ùå­ùÞ­ù×­ùЭùÉ­ù­ù»­ù´­ù­­ù¦­ùŸ­ù˜­ù‘­ùŠ­ùƒ­ù|­ùu­ùn­ùg­ù`­ùY­ùR­ùK­ùD­ù=­ù6­ù/­ù(­ù!­ù­ù­ù ­ù­ùþ¬ù÷¬ùð¬ùé¬ùâ¬ùÛ¬ùÔ¬ùͬùƬù¿¬ù¸¬ù±¬ùª¬ù£¬ùœ¬ù•¬ùެù‡¬ù€¬ùy¬ùr¬ùk¬ùd¬ù]¬ùV¬ùO¬ùH¬ùA¬ù:¬ù3¬ù,¬ù%¬ù¬ù¬ù¬ù ¬ù¬ùû«ùô«ùí«ùæ«ùß«ùØ«ùÑ«ùÊ«ùëù¼«ùµ«ù®«ù§«ù «ù™«ù’«ù‹«ù„«ù}«ùv«ùo«ùh«ùa«ùZ«ùS«ùL«ùE«ù>«ù7«ù0«ù)«ù"«ù«ù«ù «ù«ùÿªùøªùñªùêªùãªùܪùÕªùΪùǪùÀªù¹ªù²ªù«ªù¤ªùªù–ªùªùˆªùªùzªùsªùlªùeªù^ªùWªùPªùIªùBªù;ªù4ªù-ªù&ªùªùªùªù ªùªùü©ùõ©ùî©ùç©ùà©ùÙ©ùÒ©ùË©ùÄ©ù½©ù¶©ù¯©ù¨©ù¡©ùš©ù“©ùŒ©ù…©ù~©ùw©ùp©ùi©ùb©ù[©ùT©ùM©ùF©ù?©ù8©ù1©ù*©ù#©ù©ù©ù©ù©ù©ùù¨ùò¨ùë¨ùä¨ùݨùÖ¨ùϨùȨùÁ¨ùº¨ù³¨ù¬¨ù¥¨ùž¨ù—¨ù¨ù‰¨ù‚¨ù{¨ùt¨ùm¨ùf¨ù_¨ùX¨ùQ¨ùJ¨ùC¨ù<¨ù5¨ù.¨ù'¨ù ¨ù¨ù¨ù ¨ù¨ùý§ùö§ùï§ùè§ùá§ùÚ§ùÓ§ù̧ùŧù¾§ù·§ù°§ù©§ù¢§ù›§ù”§ù§ù†§ù§ùx§ùq§ùj§ùc§ù\§ùU§ùN§ùG§ù@§ù9§ù2§ù+§ù$§ù§ù§ù§ù§ù§ùú¦ùó¦ùì¦ùå¦ùÞ¦ùצùЦùɦù¦ù»¦ù´¦ù­¦ù¦¦ùŸ¦ù˜¦ù‘¦ùЦùƒ¦ù|¦ùu¦ùn¦ùg¦ù`¦ùY¦ùR¦ùK¦ùD¦ù=¦ù6¦ù/¦ù(¦ù!¦ù¦ù¦ù ¦ù¦ùþ¥ù÷¥ùð¥ùé¥ùâ¥ùÛ¥ùÔ¥ùÍ¥ùÆ¥ù¿¥ù¸¥ù±¥ùª¥ù£¥ùœ¥ù•¥ùŽ¥ù‡¥ù€¥ùy¥ùr¥ùk¥ùd¥ù]¥ùV¥ùO¥ùH¥ùA¥ù:¥ù3¥ù,¥ù%¥ù¥ù¥ù¥ù ¥ù¥ùû¤ùô¤ùí¤ùæ¤ùߤùؤùѤùʤùäù¼¤ùµ¤ù®¤ù§¤ù ¤ù™¤ù’¤ù‹¤ù„¤ù}¤ùv¤ùo¤ùh¤ùa¤ùZ¤ùS¤ùL¤ùE¤ù>¤ù7¤ù0¤ù)¤ù"¤ù¤ù¤ù ¤ù¤ùÿ£ùø£ùñ£ùê£ùã£ùÜ£ùÕ£ùΣùÇ£ùÀ£ù¹£ù²£ù«£ù¤£ù£ù–£ù£ùˆ£ù£ùz£ùs£ùl£ùe£ù^£ùW£ùP£ùI£ùB£ù;£ù4£ù-£ù&£ù£ù£ù£ù £ù£ùü¢ùõ¢ùî¢ùç¢ùà¢ùÙ¢ùÒ¢ùË¢ùÄ¢ù½¢ù¶¢ù¯¢ù¨¢ù¡¢ùš¢ù“¢ùŒ¢ù…¢ù~¢ùw¢ùp¢ùi¢ùb¢ù[¢ùT¢ùM¢ùF¢ù?¢ù8¢ù1¢ù*¢ù#¢ù¢ù¢ù¢ù¢ù¢ùù¡ùò¡ùë¡ùä¡ùÝ¡ùÖ¡ùÏ¡ùÈ¡ùÁ¡ùº¡ù³¡ù¬¡ù¥¡ùž¡ù—¡ù¡ù‰¡ù‚¡ù{¡ùt¡ùm¡ùf¡ù_¡ùX¡ùQ¡ùJ¡ùC¡ù<¡ù5¡ù.¡ù'¡ù ¡ù¡ù¡ù ¡ù¡ùý ùö ùï ùè ùá ùÚ ùÓ ùÌ ùÅ ù¾ ù· ù° ù© ù¢ ù› ù” ù ù† ù ùx ùq ùj ùc ù\ ùU ùN ùG ù@ ù9 ù2 ù+ ù$ ù ù ù ù ù ùúŸùóŸùìŸùåŸùÞŸùןùПùÉŸùŸù»Ÿù´Ÿù­Ÿù¦ŸùŸŸù˜Ÿù‘ŸùŠŸùƒŸù|ŸùuŸùnŸùgŸù`ŸùYŸùRŸùKŸùDŸù=Ÿù6Ÿù/Ÿù(Ÿù!ŸùŸùŸù ŸùŸùþžù÷žùðžùéžùâžùÛžùÔžùÍžùÆžù¿žù¸žù±žùªžù£žùœžù•žùŽžù‡žù€žùyžùržùkžùdžù]žùVžùOžùHžùAžù:žù3žù,žù%žùžùžùžù žùžùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿœùøœùñœùêœùãœùÜœùÕœùΜùÇœùÀœù¹œù²œù«œù¤œùœù–œùœùˆœùœùzœùsœùlœùeœù^œùWœùPœùIœùBœù;œù4œù-œù&œùœùœùœù œùœùü›ùõ›ùî›ùç›ùà›ùÙ›ùÒ›ùË›ùÄ›ù½›ù¶›ù¯›ù¨›ù¡›ùš›ù“›ùŒ›ù…›ù~›ùw›ùp›ùi›ùb›ù[›ùT›ùM›ùF›ù?›ù8›ù1›ù*›ù#›ù›ù›ù›ù›ù›ùùšùòšùëšùäšùÝšùÖšùÏšùÈšùÁšùºšù³šù¬šù¥šùžšù—šùšù‰šù‚šù{šùtšùmšùfšù_šùXšùQšùJšùCšù<šù5šù.šù'šù šùšùšù šùšùý™ùö™ùï™ùè™ùá™ùÚ™ùÓ™ùÌ™ùÅ™ù¾™ù·™ù°™ù©™ù¢™ù›™ù”™ù™ù†™ù™ùx™ùq™ùj™ùc™ù\™ùU™ùN™ùG™ù@™ù9™ù2™ù+™ù$™ù™ù™ù™ù™ù™ùú˜ùó˜ùì˜ùå˜ùÞ˜ùטùИùɘù˜ù»˜ù´˜ù­˜ù¦˜ùŸ˜ù˜˜ù‘˜ùŠ˜ùƒ˜ù|˜ùu˜ùn˜ùg˜ù`˜ùY˜ùR˜ùK˜ùD˜ù=˜ù6˜ù/˜ù(˜ù!˜ù˜ù˜ù ˜ù˜ùþ—ù÷—ùð—ùé—ùâ—ùÛ—ùÔ—ùÍ—ùÆ—ù¿—ù¸—ù±—ùª—ù£—ùœ—ù•—ùŽ—ù‡—ù€—ùy—ùr—ùk—ùd—ù]—ùV—ùO—ùH—ùA—ù:—ù3—ù,—ù%—ù—ù—ù—ù —ù—ùû–ùô–ùí–ùæ–ùß–ùØ–ùÑ–ùÊ–ùÖù¼–ùµ–ù®–ù§–ù –ù™–ù’–ù‹–ù„–ù}–ùv–ùo–ùh–ùa–ùZ–ùS–ùL–ùE–ù>–ù7–ù0–ù)–ù"–ù–ù–ù –ù–ùÿ•ùø•ùñ•ùê•ùã•ùÜ•ùÕ•ùΕùÇ•ùÀ•ù¹•ù²•ù«•ù¤•ù•ù–•ù•ùˆ•ù•ùz•ùs•ùl•ùe•ù^•ùW•ùP•ùI•ùB•ù;•ù4•ù-•ù&•ù•ù•ù•ù •ù•ùü”ùõ”ùî”ùç”ùà”ùÙ”ùÒ”ùË”ùÄ”ù½”ù¶”ù¯”ù¨”ù¡”ùš”ù“”ùŒ”ù…”ù~”ùw”ùp”ùi”ùb”ù[”ùT”ùM”ùF”ù?”ù8”ù1”ù*”ù#”ù”ù”ù”ù”ù”ùù“ùò“ùë“ùä“ùÝ“ùÖ“ùÏ“ùÈ“ùÁ“ùº“ù³“ù¬“ù¥“ùž“ù—“ù“ù‰“ù‚“ù{“ùt“ùm“ùf“ù_“ùX“ùQ“ùJ“ùC“ù<“ù5“ù.“ù'“ù “ù“ù“ù “ù“ùý’ùö’ùï’ùè’ùá’ùÚ’ùÓ’ùÌ’ùÅ’ù¾’ù·’ù°’ù©’ù¢’ù›’ù”’ù’ù†’ù’ùx’ùq’ùj’ùc’ù\’ùU’ùN’ùG’ù@’ù9’ù2’ù+’ù$’ù’ù’ù’ù’ù’ùú‘ùó‘ùì‘ùå‘ùÞ‘ùבùБùÉ‘ù‘ù»‘ù´‘ù­‘ù¦‘ùŸ‘ù˜‘ù‘‘ùŠ‘ùƒ‘ù|‘ùu‘ùn‘ùg‘ù`‘ùY‘ùR‘ùK‘ùD‘ù=‘ù6‘ù/‘ù(‘ù!‘ù‘ù‘ù ‘ù‘ùþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿŽùøŽùñŽùêŽùãŽùÜŽùÕŽùÎŽùÇŽùÀŽù¹Žù²Žù«Žù¤ŽùŽù–ŽùŽùˆŽùŽùzŽùsŽùlŽùeŽù^ŽùWŽùPŽùIŽùBŽù;Žù4Žù-Žù&ŽùŽùŽùŽù ŽùŽùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùŒùòŒùëŒùäŒùÝŒùÖŒùÏŒùÈŒùÁŒùºŒù³Œù¬Œù¥ŒùžŒù—ŒùŒù‰Œù‚Œù{ŒùtŒùmŒùfŒù_ŒùXŒùQŒùJŒùCŒù<Œù5Œù.Œù'Œù ŒùŒùŒù ŒùŒùý‹ùö‹ùï‹ùè‹ùá‹ùÚ‹ùÓ‹ùÌ‹ùÅ‹ù¾‹ù·‹ù°‹ù©‹ù¢‹ù›‹ù”‹ù‹ù†‹ù‹ùx‹ùq‹ùj‹ùc‹ù\‹ùU‹ùN‹ùG‹ù@‹ù9‹ù2‹ù+‹ù$‹ù‹ù‹ù‹ù‹ù‹ùúŠùóŠùìŠùåŠùÞŠù׊ùЊùÉŠùŠù»Šù´Šù­Šù¦ŠùŸŠù˜Šù‘ŠùŠŠùƒŠù|ŠùuŠùnŠùgŠù`ŠùYŠùRŠùKŠùDŠù=Šù6Šù/Šù(Šù!ŠùŠùŠù ŠùŠùþ‰ù÷‰ùð‰ùé‰ùâ‰ùÛ‰ùÔ‰ù͉ùƉù¿‰ù¸‰ù±‰ùª‰ù£‰ùœ‰ù•‰ùމù‡‰ù€‰ùy‰ùr‰ùk‰ùd‰ù]‰ùV‰ùO‰ùH‰ùA‰ù:‰ù3‰ù,‰ù%‰ù‰ù‰ù‰ù ‰ù‰ùûˆùôˆùíˆùæˆù߈ù؈ùшùʈùÈù¼ˆùµˆù®ˆù§ˆù ˆù™ˆù’ˆù‹ˆù„ˆù}ˆùvˆùoˆùhˆùaˆùZˆùSˆùLˆùEˆù>ˆù7ˆù0ˆù)ˆù"ˆùˆùˆù ˆùˆùÿ‡ùø‡ùñ‡ùê‡ùã‡ù܇ùÕ‡ù·ùLJùÀ‡ù¹‡ù²‡ù«‡ù¤‡ù‡ù–‡ù‡ùˆ‡ù‡ùz‡ùs‡ùl‡ùe‡ù^‡ùW‡ùP‡ùI‡ùB‡ù;‡ù4‡ù-‡ù&‡ù‡ù‡ù‡ù ‡ù‡ùü†ùõ†ùî†ùç†ùà†ùÙ†ùÒ†ùˆùĆù½†ù¶†ù¯†ù¨†ù¡†ùš†ù“†ùŒ†ù…†ù~†ùw†ùp†ùi†ùb†ù[†ùT†ùM†ùF†ù?†ù8†ù1†ù*†ù#†ù†ù†ù†ù†ù†ùù…ùò…ùë…ùä…ùÝ…ùÖ…ùÏ…ùÈ…ùÁ…ùº…ù³…ù¬…ù¥…ùž…ù—…ù…ù‰…ù‚…ù{…ùt…ùm…ùf…ù_…ùX…ùQ…ùJ…ùC…ù<…ù5…ù.…ù'…ù …ù…ù…ù …ù…ùý„ùö„ùï„ùè„ùá„ùÚ„ùÓ„ùÌ„ùÅ„ù¾„ù·„ù°„ù©„ù¢„ù›„ù”„ù„ù†„ù„ùx„ùq„ùj„ùc„ù\„ùU„ùN„ùG„ù@„ù9„ù2„ù+„ù$„ù„ù„ù„ù„ù„ùúƒùóƒùìƒùåƒùÞƒù׃ùЃùɃùƒù»ƒù´ƒù­ƒù¦ƒùŸƒù˜ƒù‘ƒùŠƒùƒƒù|ƒùuƒùnƒùgƒù`ƒùYƒùRƒùKƒùDƒù=ƒù6ƒù/ƒù(ƒù!ƒùƒùƒù ƒùƒùþ‚ù÷‚ùð‚ùé‚ùâ‚ùÛ‚ùÔ‚ùÍ‚ùÆ‚ù¿‚ù¸‚ù±‚ùª‚ù£‚ùœ‚ù•‚ùŽ‚ù‡‚ù€‚ùy‚ùr‚ùk‚ùd‚ù]‚ùV‚ùO‚ùH‚ùA‚ù:‚ù3‚ù,‚ù%‚ù‚ù‚ù‚ù ‚ù‚ùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿ€ùø€ùñ€ùê€ùã€ùÜ€ùÕ€ù΀ùÇ€ùÀ€ù¹€ù²€ù«€ù¤€ù€ù–€ù€ùˆ€ù€ùz€ùs€ùl€ùe€ù^€ùW€ùP€ùI€ùB€ù;€ù4€ù-€ù&€ù€ù€ù€ù €ù€ùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùù~ùò~ùë~ùä~ùÝ~ùÖ~ùÏ~ùÈ~ùÁ~ùº~ù³~ù¬~ù¥~ùž~ù—~ù~ù‰~ù‚~ù{~ùt~ùm~ùf~ù_~ùX~ùQ~ùJ~ùC~ù<~ù5~ù.~ù'~ù ~ù~ù~ù ~ù~ùý}ùö}ùï}ùè}ùá}ùÚ}ùÓ}ùÌ}ùÅ}ù¾}ù·}ù°}ù©}ù¢}ù›}ù”}ù}ù†}ù}ùx}ùq}ùj}ùc}ù\}ùU}ùN}ùG}ù@}ù9}ù2}ù+}ù$}ù}ù}ù}ù}ù}ùú|ùó|ùì|ùå|ùÞ|ù×|ùÐ|ùÉ|ùÂ|ù»|ù´|ù­|ù¦|ùŸ|ù˜|ù‘|ùŠ|ùƒ|ù||ùu|ùn|ùg|ù`|ùY|ùR|ùK|ùD|ù=|ù6|ù/|ù(|ù!|ù|ù|ù |ù|ùþ{ù÷{ùð{ùé{ùâ{ùÛ{ùÔ{ùÍ{ùÆ{ù¿{ù¸{ù±{ùª{ù£{ùœ{ù•{ùŽ{ù‡{ù€{ùy{ùr{ùk{ùd{ù]{ùV{ùO{ùH{ùA{ù:{ù3{ù,{ù%{ù{ù{ù{ù {ù{ùûzùôzùízùæzùßzùØzùÑzùÊzùÃzù¼zùµzù®zù§zù zù™zù’zù‹zù„zù}zùvzùozùhzùazùZzùSzùLzùEzù>zù7zù0zù)zù"zùzùzù zùzùÿyùøyùñyùêyùãyùÜyùÕyùÎyùÇyùÀyù¹yù²yù«yù¤yùyù–yùyùˆyùyùzyùsyùlyùeyù^yùWyùPyùIyùByù;yù4yù-yù&yùyùyùyù yùyùüxùõxùîxùçxùàxùÙxùÒxùËxùÄxù½xù¶xù¯xù¨xù¡xùšxù“xùŒxù…xù~xùwxùpxùixùbxù[xùTxùMxùFxù?xù8xù1xù*xù#xùxùxùxùxùxùùwùòwùëwùäwùÝwùÖwùÏwùÈwùÁwùºwù³wù¬wù¥wùžwù—wùwù‰wù‚wù{wùtwùmwùfwù_wùXwùQwùJwùCwùsù7sù0sù)sù"sùsùsù sùsùÿrùørùñrùêrùãrùÜrùÕrùÎrùÇrùÀrù¹rù²rù«rù¤rùrù–rùrùˆrùrùzrùsrùlrùerù^rùWrùPrùIrùBrù;rù4rù-rù&rùrùrùrù rùrùüqùõqùîqùçqùàqùÙqùÒqùËqùÄqù½qù¶qù¯qù¨qù¡qùšqù“qùŒqù…qù~qùwqùpqùiqùbqù[qùTqùMqùFqù?qù8qù1qù*qù#qùqùqùqùqùqùùpùòpùëpùäpùÝpùÖpùÏpùÈpùÁpùºpù³pù¬pù¥pùžpù—pùpù‰pù‚pù{pùtpùmpùfpù_pùXpùQpùJpùCpùlù7lù0lù)lù"lùlùlù lùlùÿkùøkùñkùêkùãkùÜkùÕkùÎkùÇkùÀkù¹kù²kù«kù¤kùkù–kùkùˆkùkùzkùskùlkùekù^kùWkùPkùIkùBkù;kù4kù-kù&kùkùkùkù kùkùüjùõjùîjùçjùàjùÙjùÒjùËjùÄjù½jù¶jù¯jù¨jù¡jùšjù“jùŒjù…jù~jùwjùpjùijùbjù[jùTjùMjùFjù?jù8jù1jù*jù#jùjùjùjùjùjùùiùòiùëiùäiùÝiùÖiùÏiùÈiùÁiùºiù³iù¬iù¥iùžiù—iùiù‰iù‚iù{iùtiùmiùfiù_iùXiùQiùJiùCiùeù7eù0eù)eù"eùeùeù eùeùÿdùødùñdùêdùãdùÜdùÕdùÎdùÇdùÀdù¹dù²dù«dù¤dùdù–dùdùˆdùdùzdùsdùldùedù^dùWdùPdùIdùBdù;dù4dù-dù&dùdùdùdù dùdùücùõcùîcùçcùàcùÙcùÒcùËcùÄcù½cù¶cù¯cù¨cù¡cùšcù“cùŒcù…cù~cùwcùpcùicùbcù[cùTcùMcùFcù?cù8cù1cù*cù#cùcùcùcùcùcùùbùòbùëbùäbùÝbùÖbùÏbùÈbùÁbùºbù³bù¬bù¥bùžbù—bùbù‰bù‚bù{bùtbùmbùfbù_bùXbùQbùJbùCbù^ù7^ù0^ù)^ù"^ù^ù^ù ^ù^ùÿ]ùø]ùñ]ùê]ùã]ùÜ]ùÕ]ùÎ]ùÇ]ùÀ]ù¹]ù²]ù«]ù¤]ù]ù–]ù]ùˆ]ù]ùz]ùs]ùl]ùe]ù^]ùW]ùP]ùI]ùB]ù;]ù4]ù-]ù&]ù]ù]ù]ù ]ù]ùü\ùõ\ùî\ùç\ùà\ùÙ\ùÒ\ùË\ùÄ\ù½\ù¶\ù¯\ù¨\ù¡\ùš\ù“\ùŒ\ù…\ù~\ùw\ùp\ùi\ùb\ù[\ùT\ùM\ùF\ù?\ù8\ù1\ù*\ù#\ù\ù\ù\ù\ù\ùù[ùò[ùë[ùä[ùÝ[ùÖ[ùÏ[ùÈ[ùÁ[ùº[ù³[ù¬[ù¥[ùž[ù—[ù[ù‰[ù‚[ù{[ùt[ùm[ùf[ù_[ùX[ùQ[ùJ[ùC[ù<[ù5[ù.[ù'[ù [ù[ù[ù [ù[ùýZùöZùïZùèZùáZùÚZùÓZùÌZùÅZù¾Zù·Zù°Zù©Zù¢Zù›Zù”ZùZù†ZùZùxZùqZùjZùcZù\ZùUZùNZùGZù@Zù9Zù2Zù+Zù$ZùZùZùZùZùZùúYùóYùìYùåYùÞYù×YùÐYùÉYùÂYù»Yù´Yù­Yù¦YùŸYù˜Yù‘YùŠYùƒYù|YùuYùnYùgYù`YùYYùRYùKYùDYù=Yù6Yù/Yù(Yù!YùYùYù YùYùþXù÷XùðXùéXùâXùÛXùÔXùÍXùÆXù¿Xù¸Xù±XùªXù£XùœXù•XùŽXù‡Xù€XùyXùrXùkXùdXù]XùVXùOXùHXùAXù:Xù3Xù,Xù%XùXùXùXù XùXùûWùôWùíWùæWùßWùØWùÑWùÊWùÃWù¼WùµWù®Wù§Wù Wù™Wù’Wù‹Wù„Wù}WùvWùoWùhWùaWùZWùSWùLWùEWù>Wù7Wù0Wù)Wù"WùWùWù WùWùÿVùøVùñVùêVùãVùÜVùÕVùÎVùÇVùÀVù¹Vù²Vù«Vù¤VùVù–VùVùˆVùVùzVùsVùlVùeVù^VùWVùPVùIVùBVù;Vù4Vù-Vù&VùVùVùVù VùVùüUùõUùîUùçUùàUùÙUùÒUùËUùÄUù½Uù¶Uù¯Uù¨Uù¡UùšUù“UùŒUù…Uù~UùwUùpUùiUùbUù[UùTUùMUùFUù?Uù8Uù1Uù*Uù#UùUùUùUùUùUùùTùòTùëTùäTùÝTùÖTùÏTùÈTùÁTùºTù³Tù¬Tù¥TùžTù—TùTù‰Tù‚Tù{TùtTùmTùfTù_TùXTùQTùJTùCTùPù7Pù0Pù)Pù"PùPùPù PùPùÿOùøOùñOùêOùãOùÜOùÕOùÎOùÇOùÀOù¹Où²Où«Où¤OùOù–OùOùˆOùOùzOùsOùlOùeOù^OùWOùPOùIOùBOù;Où4Où-Où&OùOùOùOù OùOùüNùõNùîNùçNùàNùÙNùÒNùËNùÄNù½Nù¶Nù¯Nù¨Nù¡NùšNù“NùŒNù…Nù~NùwNùpNùiNùbNù[NùTNùMNùFNù?Nù8Nù1Nù*Nù#NùNùNùNùNùNùùMùòMùëMùäMùÝMùÖMùÏMùÈMùÁMùºMù³Mù¬Mù¥MùžMù—MùMù‰Mù‚Mù{MùtMùmMùfMù_MùXMùQMùJMùCMùIù7Iù0Iù)Iù"IùIùIù IùIùÿHùøHùñHùêHùãHùÜHùÕHùÎHùÇHùÀHù¹Hù²Hù«Hù¤HùHù–HùHùˆHùHùzHùsHùlHùeHù^HùWHùPHùIHùBHù;Hù4Hù-Hù&HùHùHùHù HùHùüGùõGùîGùçGùàGùÙGùÒGùËGùÄGù½Gù¶Gù¯Gù¨Gù¡GùšGù“GùŒGù…Gù~GùwGùpGùiGùbGù[GùTGùMGùFGù?Gù8Gù1Gù*Gù#GùGùGùGùGùGùùFùòFùëFùäFùÝFùÖFùÏFùÈFùÁFùºFù³Fù¬Fù¥FùžFù—FùFù‰Fù‚Fù{FùtFùmFùfFù_FùXFùQFùJFùCFùBù7Bù0Bù)Bù"BùBùBù BùBùÿAùøAùñAùêAùãAùÜAùÕAùÎAùÇAùÀAù¹Aù²Aù«Aù¤AùAù–AùAùˆAùAùzAùsAùlAùeAù^AùWAùPAùIAùBAù;Aù4Aù-Aù&AùAùAùAù AùAùü@ùõ@ùî@ùç@ùà@ùÙ@ùÒ@ùË@ùÄ@ù½@ù¶@ù¯@ù¨@ù¡@ùš@ù“@ùŒ@ù…@ù~@ùw@ùp@ùi@ùb@ù[@ùT@ùM@ùF@ù?@ù8@ù1@ù*@ù#@ù@ù@ù@ù@ù@ùù?ùò?ùë?ùä?ùÝ?ùÖ?ùÏ?ùÈ?ùÁ?ùº?ù³?ù¬?ù¥?ùž?ù—?ù?ù‰?ù‚?ù{?ùt?ùm?ùf?ù_?ùX?ùQ?ùJ?ùC?ùùö>ùï>ùè>ùá>ùÚ>ùÓ>ùÌ>ùÅ>ù¾>ù·>ù°>ù©>ù¢>ù›>ù”>ù>ù†>ù>ùx>ùq>ùj>ùc>ù\>ùU>ùN>ùG>ù@>ù9>ù2>ù+>ù$>ù>ù>ù>ù>ù>ùú=ùó=ùì=ùå=ùÞ=ù×=ùÐ=ùÉ=ùÂ=ù»=ù´=ù­=ù¦=ùŸ=ù˜=ù‘=ùŠ=ùƒ=ù|=ùu=ùn=ùg=ù`=ùY=ùR=ùK=ùD=ù==ù6=ù/=ù(=ù!=ù=ù=ù =ù=ùþ<ù÷<ùð<ùé<ùâ<ùÛ<ùÔ<ùÍ<ùÆ<ù¿<ù¸<ù±<ùª<ù£<ùœ<ù•<ùŽ<ù‡<ù€<ùy<ùr<ùk<ùd<ù]<ùV<ùO<ùH<ùA<ù:<ù3<ù,<ù%<ù<ù<ù<ù <ù<ùû;ùô;ùí;ùæ;ùß;ùØ;ùÑ;ùÊ;ùÃ;ù¼;ùµ;ù®;ù§;ù ;ù™;ù’;ù‹;ù„;ù};ùv;ùo;ùh;ùa;ùZ;ùS;ùL;ùE;ù>;ù7;ù0;ù);ù";ù;ù;ù ;ù;ùÿ:ùø:ùñ:ùê:ùã:ùÜ:ùÕ:ùÎ:ùÇ:ùÀ:ù¹:ù²:ù«:ù¤:ù:ù–:ù:ùˆ:ù:ùz:ùs:ùl:ùe:ù^:ùW:ùP:ùI:ùB:ù;:ù4:ù-:ù&:ù:ù:ù:ù :ù:ùü9ùõ9ùî9ùç9ùà9ùÙ9ùÒ9ùË9ùÄ9ù½9ù¶9ù¯9ù¨9ù¡9ùš9ù“9ùŒ9ù…9ù~9ùw9ùp9ùi9ùb9ù[9ùT9ùM9ùF9ù?9ù89ù19ù*9ù#9ù9ù9ù9ù9ù9ùù8ùò8ùë8ùä8ùÝ8ùÖ8ùÏ8ùÈ8ùÁ8ùº8ù³8ù¬8ù¥8ùž8ù—8ù8ù‰8ù‚8ù{8ùt8ùm8ùf8ù_8ùX8ùQ8ùJ8ùC8ù<8ù58ù.8ù'8ù 8ù8ù8ù 8ù8ùý7ùö7ùï7ùè7ùá7ùÚ7ùÓ7ùÌ7ùÅ7ù¾7ù·7ù°7ù©7ù¢7ù›7ù”7ù7ù†7ù7ùx7ùq7ùj7ùc7ù\7ùU7ùN7ùG7ù@7ù97ù27ù+7ù$7ù7ù7ù7ù7ù7ùú6ùó6ùì6ùå6ùÞ6ù×6ùÐ6ùÉ6ùÂ6ù»6ù´6ù­6ù¦6ùŸ6ù˜6ù‘6ùŠ6ùƒ6ù|6ùu6ùn6ùg6ù`6ùY6ùR6ùK6ùD6ù=6ù66ù/6ù(6ù!6ù6ù6ù 6ù6ùþ5ù÷5ùð5ùé5ùâ5ùÛ5ùÔ5ùÍ5ùÆ5ù¿5ù¸5ù±5ùª5ù£5ùœ5ù•5ùŽ5ù‡5ù€5ùy5ùr5ùk5ùd5ù]5ùV5ùO5ùH5ùA5ù:5ù35ù,5ù%5ù5ù5ù5ù 5ù5ùû4ùô4ùí4ùæ4ùß4ùØ4ùÑ4ùÊ4ùÃ4ù¼4ùµ4ù®4ù§4ù 4ù™4ù’4ù‹4ù„4ù}4ùv4ùo4ùh4ùa4ùZ4ùS4ùL4ùE4ù>4ù74ù04ù)4ù"4ù4ù4ù 4ù4ùÿ3ùø3ùñ3ùê3ùã3ùÜ3ùÕ3ùÎ3ùÇ3ùÀ3ù¹3ù²3ù«3ù¤3ù3ù–3ù3ùˆ3ù3ùz3ùs3ùl3ùe3ù^3ùW3ùP3ùI3ùB3ù;3ù43ù-3ù&3ù3ù3ù3ù 3ù3ùü2ùõ2ùî2ùç2ùà2ùÙ2ùÒ2ùË2ùÄ2ù½2ù¶2ù¯2ù¨2ù¡2ùš2ù“2ùŒ2ù…2ù~2ùw2ùp2ùi2ùb2ù[2ùT2ùM2ùF2ù?2ù82ù12ù*2ù#2ù2ù2ù2ù2ù2ùù1ùò1ùë1ùä1ùÝ1ùÖ1ùÏ1ùÈ1ùÁ1ùº1ù³1ù¬1ù¥1ùž1ù—1ù1ù‰1ù‚1ù{1ùt1ùm1ùf1ù_1ùX1ùQ1ùJ1ùC1ù<1ù51ù.1ù'1ù 1ù1ù1ù 1ù1ùý0ùö0ùï0ùè0ùá0ùÚ0ùÓ0ùÌ0ùÅ0ù¾0ù·0ù°0ù©0ù¢0ù›0ù”0ù0ù†0ù0ùx0ùq0ùj0ùc0ù\0ùU0ùN0ùG0ù@0ù90ù20ù+0ù$0ù0ù0ù0ù0ù0ùú/ùó/ùì/ùå/ùÞ/ù×/ùÐ/ùÉ/ùÂ/ù»/ù´/ù­/ù¦/ùŸ/ù˜/ù‘/ùŠ/ùƒ/ù|/ùu/ùn/ùg/ù`/ùY/ùR/ùK/ùD/ù=/ù6/ù//ù(/ù!/ù/ù/ù /ù/ùþ.ù÷.ùð.ùé.ùâ.ùÛ.ùÔ.ùÍ.ùÆ.ù¿.ù¸.ù±.ùª.ù£.ùœ.ù•.ùŽ.ù‡.ù€.ùy.ùr.ùk.ùd.ù].ùV.ùO.ùH.ùA.ù:.ù3.ù,.ù%.ù.ù.ù.ù .ù.ùû-ùô-ùí-ùæ-ùß-ùØ-ùÑ-ùÊ-ùÃ-ù¼-ùµ-ù®-ù§-ù -ù™-ù’-ù‹-ù„-ù}-ùv-ùo-ùh-ùa-ùZ-ùS-ùL-ùE-ù>-ù7-ù0-ù)-ù"-ù-ù-ù -ù-ùÿ,ùø,ùñ,ùê,ùã,ùÜ,ùÕ,ùÎ,ùÇ,ùÀ,ù¹,ù²,ù«,ù¤,ù,ù–,ù,ùˆ,ù,ùz,ùs,ùl,ùe,ù^,ùW,ùP,ùI,ùB,ù;,ù4,ù-,ù&,ù,ù,ù,ù ,ù,ùü+ùõ+ùî+ùç+ùà+ùÙ+ùÒ+ùË+ùÄ+ù½+ù¶+ù¯+ù¨+ù¡+ùš+ù“+ùŒ+ù…+ù~+ùw+ùp+ùi+ùb+ù[+ùT+ùM+ùF+ù?+ù8+ù1+ù*+ù#+ù+ù+ù+ù+ù+ùù*ùò*ùë*ùä*ùÝ*ùÖ*ùÏ*ùÈ*ùÁ*ùº*ù³*ù¬*ù¥*ùž*ù—*ù*ù‰*ù‚*ù{*ùt*ùm*ùf*ù_*ùX*ùQ*ùJ*ùC*ù<*ù5*ù.*ù'*ù *ù*ù*ù *ù*ùý)ùö)ùï)ùè)ùá)ùÚ)ùÓ)ùÌ)ùÅ)ù¾)ù·)ù°)ù©)ù¢)ù›)ù”)ù)ù†)ù)ùx)ùq)ùj)ùc)ù\)ùU)ùN)ùG)ù@)ù9)ù2)ù+)ù$)ù)ù)ù)ù)ù)ùú(ùó(ùì(ùå(ùÞ(ù×(ùÐ(ùÉ(ùÂ(ù»(ù´(ù­(ù¦(ùŸ(ù˜(ù‘(ùŠ(ùƒ(ù|(ùu(ùn(ùg(ù`(ùY(ùR(ùK(ùD(ù=(ù6(ù/(ù((ù!(ù(ù(ù (ù(ùþ'ù÷'ùð'ùé'ùâ'ùÛ'ùÔ'ùÍ'ùÆ'ù¿'ù¸'ù±'ùª'ù£'ùœ'ù•'ùŽ'ù‡'ù€'ùy'ùr'ùk'ùd'ù]'ùV'ùO'ùH'ùA'ù:'ù3'ù,'ù%'ù'ù'ù'ù 'ù'ùû&ùô&ùí&ùæ&ùß&ùØ&ùÑ&ùÊ&ùÃ&ù¼&ùµ&ù®&ù§&ù &ù™&ù’&ù‹&ù„&ù}&ùv&ùo&ùh&ùa&ùZ&ùS&ùL&ùE&ù>&ù7&ù0&ù)&ù"&ù&ù&ù &ù&ùÿ%ùø%ùñ%ùê%ùã%ùÜ%ùÕ%ùÎ%ùÇ%ùÀ%ù¹%ù²%ù«%ù¤%ù%ù–%ù%ùˆ%ù%ùz%ùs%ùl%ùe%ù^%ùW%ùP%ùI%ùB%ù;%ù4%ù-%ù&%ù%ù%ù%ù %ù%ùü$ùõ$ùî$ùç$ùà$ùÙ$ùÒ$ùË$ùÄ$ù½$ù¶$ù¯$ù¨$ù¡$ùš$ù“$ùŒ$ù…$ù~$ùw$ùp$ùi$ùb$ù[$ùT$ùM$ùF$ù?$ù8$ù1$ù*$ù#$ù$ù$ù$ù$ù$ùù#ùò#ùë#ùä#ùÝ#ùÖ#ùÏ#ùÈ#ùÁ#ùº#ù³#ù¬#ù¥#ùž#ù—#ù#ù‰#ù‚#ù{#ùt#ùm#ùf#ù_#ùX#ùQ#ùJ#ùC#ù<#ù5#ù.#ù'#ù #ù#ù#ù #ù#ùý"ùö"ùï"ùè"ùá"ùÚ"ùÓ"ùÌ"ùÅ"ù¾"ù·"ù°"ù©"ù¢"ù›"ù”"ù"ù†"ù"ùx"ùq"ùj"ùc"ù\"ùU"ùN"ùG"ù@"ù9"ù2"ù+"ù$"ù"ù"ù"ù"ù"ùú!ùó!ùì!ùå!ùÞ!ù×!ùÐ!ùÉ!ùÂ!ù»!ù´!ù­!ù¦!ùŸ!ù˜!ù‘!ùŠ!ùƒ!ù|!ùu!ùn!ùg!ù`!ùY!ùR!ùK!ùD!ù=!ù6!ù/!ù(!ù!!ù!ù!ù !ù!ùþ ù÷ ùð ùé ùâ ùÛ ùÔ ùÍ ùÆ ù¿ ù¸ ù± ùª ù£ ùœ ù• ùŽ ù‡ ù€ ùy ùr ùk ùd ù] ùV ùO ùH ùA ù: ù3 ù, ù% ù ù ù ù ù ùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùý ùö ùï ùè ùá ùÚ ùÓ ùÌ ùÅ ù¾ ù· ù° ù© ù¢ ù› ù” ù ù† ù ùx ùq ùj ùc ù\ ùU ùN ùG ù@ ù9 ù2 ù+ ù$ ù ù ù ù ù ùú ùó ùì ùå ùÞ ù× ùÐ ùÉ ù ù» ù´ ù­ ù¦ ùŸ ù˜ ù‘ ùŠ ùƒ ù| ùu ùn ùg ù` ùY ùR ùK ùD ù= ù6 ù/ ù( ù! ù ù ù ù ùþ ù÷ ùð ùé ùâ ùÛ ùÔ ùÍ ùÆ ù¿ ù¸ ù± ùª ù£ ùœ ù• ùŽ ù‡ ù€ ùy ùr ùk ùd ù] ùV ùO ùH ùA ù: ù3 ù, ù% ù ù ù ù ù ùû ùô ùí ùæ ùß ùØ ùÑ ùÊ ùà ù¼ ùµ ù® ù§ ù  ù™ ù’ ù‹ ù„ ù} ùv ùo ùh ùa ùZ ùS ùL ùE ù> ù7 ù0 ù) ù" ù ù ù ù ùÿ ùø ùñ ùê ùã ùÜ ùÕ ùÎ ùÇ ùÀ ù¹ ù² ù« ù¤ ù ù– ù ùˆ ù ùz ùs ùl ùe ù^ ùW ùP ùI ùB ù; ù4 ù- ù& ù ù ù ù ù ùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýÿøöÿøïÿøèÿøáÿøÚÿøÓÿøÌÿøÅÿø¾ÿø·ÿø°ÿø©ÿø¢ÿø›ÿø”ÿøÿø†ÿøÿøxÿøqÿøjÿøcÿø\ÿøUÿøNÿøGÿø@ÿø9ÿø2ÿø+ÿø$ÿøÿøÿøÿøÿøÿøúþøóþøìþøåþøÞþø×þøÐþøÉþøÂþø»þø´þø­þø¦þøŸþø˜þø‘þøŠþøƒþø|þøuþønþøgþø`þøYþøRþøKþøDþø=þø6þø/þø(þø!þøþøþø þøþøþýø÷ýøðýøéýøâýøÛýøÔýøÍýøÆýø¿ýø¸ýø±ýøªýø£ýøœýø•ýøŽýø‡ýø€ýøyýørýøkýødýø]ýøVýøOýøHýøAýø:ýø3ýø,ýø%ýøýøýøýø ýøýøûüøôüøíüøæüøßüøØüøÑüøÊüøÃüø¼üøµüø®üø§üø üø™üø’üø‹üø„üø}üøvüøoüøhüøaüøZüøSüøLüøEüø>üø7üø0üø)üø"üøüøüø üøüøÿûøøûøñûøêûøãûøÜûøÕûøÎûøÇûøÀûø¹ûø²ûø«ûø¤ûøûø–ûøûøˆûøûøzûøsûølûøeûø^ûøWûøPûøIûøBûø;ûø4ûø-ûø&ûøûøûøûø ûøûøüúøõúøîúøçúøàúøÙúøÒúøËúøÄúø½úø¶úø¯úø¨úø¡úøšúø“úøŒúø…úø~úøwúøpúøiúøbúø[úøTúøMúøFúø?úø8úø1úø*úø#úøúøúøúøúøúøùùøòùøëùøäùøÝùøÖùøÏùøÈùøÁùøºùø³ùø¬ùø¥ùøžùø—ùøùø‰ùø‚ùø{ùøtùømùøfùø_ùøXùøQùøJùøCùø<ùø5ùø.ùø'ùø ùøùøùø ùøùøýøøöøøïøøèøøáøøÚøøÓøøÌøøÅøø¾øø·øø°øø©øø¢øø›øø”øøøø†øøøøxøøqøøjøøcøø\øøUøøNøøGøø@øø9øø2øø+øø$øøøøøøøøøøøøú÷øó÷øì÷øå÷øÞ÷ø×÷øÐ÷øÉ÷øÂ÷ø»÷ø´÷ø­÷ø¦÷øŸ÷ø˜÷ø‘÷øŠ÷øƒ÷ø|÷øu÷øn÷øg÷ø`÷øY÷øR÷øK÷øD÷ø=÷ø6÷ø/÷ø(÷ø!÷ø÷ø÷ø ÷ø÷øþöø÷öøðöøéöøâöøÛöøÔöøÍöøÆöø¿öø¸öø±öøªöø£öøœöø•öøŽöø‡öø€öøyöøröøköødöø]öøVöøOöøHöøAöø:öø3öø,öø%öøöøöøöø öøöøûõøôõøíõøæõøßõøØõøÑõøÊõøÃõø¼õøµõø®õø§õø õø™õø’õø‹õø„õø}õøvõøoõøhõøaõøZõøSõøLõøEõø>õø7õø0õø)õø"õøõøõø õøõøÿôøøôøñôøêôøãôøÜôøÕôøÎôøÇôøÀôø¹ôø²ôø«ôø¤ôøôø–ôøôøˆôøôøzôøsôølôøeôø^ôøWôøPôøIôøBôø;ôø4ôø-ôø&ôøôøôøôø ôøôøüóøõóøîóøçóøàóøÙóøÒóøËóøÄóø½óø¶óø¯óø¨óø¡óøšóø“óøŒóø…óø~óøwóøpóøióøbóø[óøTóøMóøFóø?óø8óø1óø*óø#óøóøóøóøóøóøùòøòòøëòøäòøÝòøÖòøÏòøÈòøÁòøºòø³òø¬òø¥òøžòø—òøòø‰òø‚òø{òøtòømòøfòø_òøXòøQòøJòøCòø<òø5òø.òø'òø òøòøòø òøòøýñøöñøïñøèñøáñøÚñøÓñøÌñøÅñø¾ñø·ñø°ñø©ñø¢ñø›ñø”ñøñø†ñøñøxñøqñøjñøcñø\ñøUñøNñøGñø@ñø9ñø2ñø+ñø$ñøñøñøñøñøñøúðøóðøìðøåðøÞðø×ðøÐðøÉðøÂðø»ðø´ðø­ðø¦ðøŸðø˜ðø‘ðøŠðøƒðø|ðøuðønðøgðø`ðøYðøRðøKðøDðø=ðø6ðø/ðø(ðø!ðøðøðø ðøðøþïø÷ïøðïøéïøâïøÛïøÔïøÍïøÆïø¿ïø¸ïø±ïøªïø£ïøœïø•ïøŽïø‡ïø€ïøyïørïøkïødïø]ïøVïøOïøHïøAïø:ïø3ïø,ïø%ïøïøïøïø ïøïøûîøôîøíîøæîøßîøØîøÑîøÊîøÃîø¼îøµîø®îø§îø îø™îø’îø‹îø„îø}îøvîøoîøhîøaîøZîøSîøLîøEîø>îø7îø0îø)îø"îøîøîø îøîøÿíøøíøñíøêíøãíøÜíøÕíøÎíøÇíøÀíø¹íø²íø«íø¤íøíø–íøíøˆíøíøzíøsíølíøeíø^íøWíøPíøIíøBíø;íø4íø-íø&íøíøíøíø íøíøüìøõìøîìøçìøàìøÙìøÒìøËìøÄìø½ìø¶ìø¯ìø¨ìø¡ìøšìø“ìøŒìø…ìø~ìøwìøpìøiìøbìø[ìøTìøMìøFìø?ìø8ìø1ìø*ìø#ìøìøìøìøìøìøùëøòëøëëøäëøÝëøÖëøÏëøÈëøÁëøºëø³ëø¬ëø¥ëøžëø—ëøëø‰ëø‚ëø{ëøtëømëøfëø_ëøXëøQëøJëøCëø<ëø5ëø.ëø'ëø ëøëøëø ëøëøýêøöêøïêøèêøáêøÚêøÓêøÌêøÅêø¾êø·êø°êø©êø¢êø›êø”êøêø†êøêøxêøqêøjêøcêø\êøUêøNêøGêø@êø9êø2êø+êø$êøêøêøêøêøêøúéøóéøìéøåéøÞéø×éøÐéøÉéøÂéø»éø´éø­éø¦éøŸéø˜éø‘éøŠéøƒéø|éøuéønéøgéø`éøYéøRéøKéøDéø=éø6éø/éø(éø!éøéøéø éøéøþèø÷èøðèøéèøâèøÛèøÔèøÍèøÆèø¿èø¸èø±èøªèø£èøœèø•èøŽèø‡èø€èøyèørèøkèødèø]èøVèøOèøHèøAèø:èø3èø,èø%èøèøèøèø èøèøûçøôçøíçøæçøßçøØçøÑçøÊçøÃçø¼çøµçø®çø§çø çø™çø’çø‹çø„çø}çøvçøoçøhçøaçøZçøSçøLçøEçø>çø7çø0çø)çø"çøçøçø çøçøÿæøøæøñæøêæøãæøÜæøÕæøÎæøÇæøÀæø¹æø²æø«æø¤æøæø–æøæøˆæøæøzæøsæølæøeæø^æøWæøPæøIæøBæø;æø4æø-æø&æøæøæøæø æøæøüåøõåøîåøçåøàåøÙåøÒåøËåøÄåø½åø¶åø¯åø¨åø¡åøšåø“åøŒåø…åø~åøwåøpåøiåøbåø[åøTåøMåøFåø?åø8åø1åø*åø#åøåøåøåøåøåøùäøòäøëäøääøÝäøÖäøÏäøÈäøÁäøºäø³äø¬äø¥äøžäø—äøäø‰äø‚äø{äøtäømäøfäø_äøXäøQäøJäøCäø<äø5äø.äø'äø äøäøäø äøäøýãøöãøïãøèãøáãøÚãøÓãøÌãøÅãø¾ãø·ãø°ãø©ãø¢ãø›ãø”ãøãø†ãøãøxãøqãøjãøcãø\ãøUãøNãøGãø@ãø9ãø2ãø+ãø$ãøãøãøãøãøãøúâøóâøìâøåâøÞâø×âøÐâøÉâøÂâø»âø´âø­âø¦âøŸâø˜âø‘âøŠâøƒâø|âøuâønâøgâø`âøYâøRâøKâøDâø=âø6âø/âø(âø!âøâøâø âøâøþáø÷áøðáøéáøâáøÛáøÔáøÍáøÆáø¿áø¸áø±áøªáø£áøœáø•áøŽáø‡áø€áøyáøráøkáødáø]áøVáøOáøHáøAáø:áø3áø,áø%áøáøáøáø áøáøûàøôàøíàøæàøßàøØàøÑàøÊàøÃàø¼àøµàø®àø§àø àø™àø’àø‹àø„àø}àøvàøoàøhàøaàøZàøSàøLàøEàø>àø7àø0àø)àø"àøàøàø àøàøÿßøøßøñßøêßøãßøÜßøÕßøÎßøÇßøÀßø¹ßø²ßø«ßø¤ßøßø–ßøßøˆßøßøzßøsßølßøeßø^ßøWßøPßøIßøBßø;ßø4ßø-ßø&ßøßøßøßø ßøßøüÞøõÞøîÞøçÞøàÞøÙÞøÒÞøËÞøÄÞø½Þø¶Þø¯Þø¨Þø¡ÞøšÞø“ÞøŒÞø…Þø~ÞøwÞøpÞøiÞøbÞø[ÞøTÞøMÞøFÞø?Þø8Þø1Þø*Þø#ÞøÞøÞøÞøÞøÞøùÝøòÝøëÝøäÝøÝÝøÖÝøÏÝøÈÝøÁÝøºÝø³Ýø¬Ýø¥ÝøžÝø—ÝøÝø‰Ýø‚Ýø{ÝøtÝømÝøfÝø_ÝøXÝøQÝøJÝøCÝø<Ýø5Ýø.Ýø'Ýø ÝøÝøÝø ÝøÝøýÜøöÜøïÜøèÜøáÜøÚÜøÓÜøÌÜøÅÜø¾Üø·Üø°Üø©Üø¢Üø›Üø”ÜøÜø†ÜøÜøxÜøqÜøjÜøcÜø\ÜøUÜøNÜøGÜø@Üø9Üø2Üø+Üø$ÜøÜøÜøÜøÜøÜøúÛøóÛøìÛøåÛøÞÛø×ÛøÐÛøÉÛøÂÛø»Ûø´Ûø­Ûø¦ÛøŸÛø˜Ûø‘ÛøŠÛøƒÛø|ÛøuÛønÛøgÛø`ÛøYÛøRÛøKÛøDÛø=Ûø6Ûø/Ûø(Ûø!ÛøÛøÛø ÛøÛøþÚø÷ÚøðÚøéÚøâÚøÛÚøÔÚøÍÚøÆÚø¿Úø¸Úø±ÚøªÚø£ÚøœÚø•ÚøŽÚø‡Úø€ÚøyÚørÚøkÚødÚø]ÚøVÚøOÚøHÚøAÚø:Úø3Úø,Úø%ÚøÚøÚøÚø ÚøÚøûÙøôÙøíÙøæÙøßÙøØÙøÑÙøÊÙøÃÙø¼ÙøµÙø®Ùø§Ùø Ùø™Ùø’Ùø‹Ùø„Ùø}ÙøvÙøoÙøhÙøaÙøZÙøSÙøLÙøEÙø>Ùø7Ùø0Ùø)Ùø"ÙøÙøÙø ÙøÙøÿØøøØøñØøêØøãØøÜØøÕØøÎØøÇØøÀØø¹Øø²Øø«Øø¤ØøØø–ØøØøˆØøØøzØøsØølØøeØø^ØøWØøPØøIØøBØø;Øø4Øø-Øø&ØøØøØøØø ØøØøü×øõ×øî×øç×øà×øÙ×øÒ×øË×øÄ×ø½×ø¶×ø¯×ø¨×ø¡×øš×ø“×øŒ×ø…×ø~×øw×øp×øi×øb×ø[×øT×øM×øF×ø?×ø8×ø1×ø*×ø#×ø×ø×ø×ø×ø×øùÖøòÖøëÖøäÖøÝÖøÖÖøÏÖøÈÖøÁÖøºÖø³Öø¬Öø¥ÖøžÖø—ÖøÖø‰Öø‚Öø{ÖøtÖømÖøfÖø_ÖøXÖøQÖøJÖøCÖø<Öø5Öø.Öø'Öø ÖøÖøÖø ÖøÖøýÕøöÕøïÕøèÕøáÕøÚÕøÓÕøÌÕøÅÕø¾Õø·Õø°Õø©Õø¢Õø›Õø”ÕøÕø†ÕøÕøxÕøqÕøjÕøcÕø\ÕøUÕøNÕøGÕø@Õø9Õø2Õø+Õø$ÕøÕøÕøÕøÕøÕøúÔøóÔøìÔøåÔøÞÔø×ÔøÐÔøÉÔøÂÔø»Ôø´Ôø­Ôø¦ÔøŸÔø˜Ôø‘ÔøŠÔøƒÔø|ÔøuÔønÔøgÔø`ÔøYÔøRÔøKÔøDÔø=Ôø6Ôø/Ôø(Ôø!ÔøÔøÔø ÔøÔøþÓø÷ÓøðÓøéÓøâÓøÛÓøÔÓøÍÓøÆÓø¿Óø¸Óø±ÓøªÓø£ÓøœÓø•ÓøŽÓø‡Óø€ÓøyÓørÓøkÓødÓø]ÓøVÓøOÓøHÓøAÓø:Óø3Óø,Óø%ÓøÓøÓøÓø ÓøÓøûÒøôÒøíÒøæÒøßÒøØÒøÑÒøÊÒøÃÒø¼ÒøµÒø®Òø§Òø Òø™Òø’Òø‹Òø„Òø}ÒøvÒøoÒøhÒøaÒøZÒøSÒøLÒøEÒø>Òø7Òø0Òø)Òø"ÒøÒøÒø ÒøÒøÿÑøøÑøñÑøêÑøãÑøÜÑøÕÑøÎÑøÇÑøÀÑø¹Ñø²Ñø«Ñø¤ÑøÑø–ÑøÑøˆÑøÑøzÑøsÑølÑøeÑø^ÑøWÑøPÑøIÑøBÑø;Ñø4Ñø-Ñø&ÑøÑøÑøÑø ÑøÑøüÐøõÐøîÐøçÐøàÐøÙÐøÒÐøËÐøÄÐø½Ðø¶Ðø¯Ðø¨Ðø¡ÐøšÐø“ÐøŒÐø…Ðø~ÐøwÐøpÐøiÐøbÐø[ÐøTÐøMÐøFÐø?Ðø8Ðø1Ðø*Ðø#ÐøÐøÐøÐøÐøÐøùÏøòÏøëÏøäÏøÝÏøÖÏøÏÏøÈÏøÁÏøºÏø³Ïø¬Ïø¥ÏøžÏø—ÏøÏø‰Ïø‚Ïø{ÏøtÏømÏøfÏø_ÏøXÏøQÏøJÏøCÏø<Ïø5Ïø.Ïø'Ïø ÏøÏøÏø ÏøÏøýÎøöÎøïÎøèÎøáÎøÚÎøÓÎøÌÎøÅÎø¾Îø·Îø°Îø©Îø¢Îø›Îø”ÎøÎø†ÎøÎøxÎøqÎøjÎøcÎø\ÎøUÎøNÎøGÎø@Îø9Îø2Îø+Îø$ÎøÎøÎøÎøÎøÎøúÍøóÍøìÍøåÍøÞÍø×ÍøÐÍøÉÍøÂÍø»Íø´Íø­Íø¦ÍøŸÍø˜Íø‘ÍøŠÍøƒÍø|ÍøuÍønÍøgÍø`ÍøYÍøRÍøKÍøDÍø=Íø6Íø/Íø(Íø!ÍøÍøÍø ÍøÍøþÌø÷ÌøðÌøéÌøâÌøÛÌøÔÌøÍÌøÆÌø¿Ìø¸Ìø±ÌøªÌø£ÌøœÌø•ÌøŽÌø‡Ìø€ÌøyÌørÌøkÌødÌø]ÌøVÌøOÌøHÌøAÌø:Ìø3Ìø,Ìø%ÌøÌøÌøÌø ÌøÌøûËøôËøíËøæËøßËøØËøÑËøÊËøÃËø¼ËøµËø®Ëø§Ëø Ëø™Ëø’Ëø‹Ëø„Ëø}ËøvËøoËøhËøaËøZËøSËøLËøEËø>Ëø7Ëø0Ëø)Ëø"ËøËøËø ËøËøÿÊøøÊøñÊøêÊøãÊøÜÊøÕÊøÎÊøÇÊøÀÊø¹Êø²Êø«Êø¤ÊøÊø–ÊøÊøˆÊøÊøzÊøsÊølÊøeÊø^ÊøWÊøPÊøIÊøBÊø;Êø4Êø-Êø&ÊøÊøÊøÊø ÊøÊøüÉøõÉøîÉøçÉøàÉøÙÉøÒÉøËÉøÄÉø½Éø¶Éø¯Éø¨Éø¡ÉøšÉø“ÉøŒÉø…Éø~ÉøwÉøpÉøiÉøbÉø[ÉøTÉøMÉøFÉø?Éø8Éø1Éø*Éø#ÉøÉøÉøÉøÉøÉøùÈøòÈøëÈøäÈøÝÈøÖÈøÏÈøÈÈøÁÈøºÈø³Èø¬Èø¥ÈøžÈø—ÈøÈø‰Èø‚Èø{ÈøtÈømÈøfÈø_ÈøXÈøQÈøJÈøCÈø<Èø5Èø.Èø'Èø ÈøÈøÈø ÈøÈøýÇøöÇøïÇøèÇøáÇøÚÇøÓÇøÌÇøÅÇø¾Çø·Çø°Çø©Çø¢Çø›Çø”ÇøÇø†ÇøÇøxÇøqÇøjÇøcÇø\ÇøUÇøNÇøGÇø@Çø9Çø2Çø+Çø$ÇøÇøÇøÇøÇøÇøúÆøóÆøìÆø寸ÞÆøׯøÐÆøÉÆøÂÆø»Æø´Æø­Æø¦ÆøŸÆø˜Æø‘ÆøŠÆøƒÆø|ÆøuÆønÆøgÆø`ÆøYÆøRÆøKÆøDÆø=Æø6Æø/Æø(Æø!ÆøÆøÆø ÆøÆøþÅø÷ÅøðÅøéÅøâÅøÛÅøÔÅøÍÅøÆÅø¿Åø¸Åø±ÅøªÅø£ÅøœÅø•ÅøŽÅø‡Åø€ÅøyÅørÅøkÅødÅø]ÅøVÅøOÅøHÅøAÅø:Åø3Åø,Åø%ÅøÅøÅøÅø ÅøÅøûÄøôÄøíÄøæÄøßÄøØÄøÑÄøÊÄøÃÄø¼ÄøµÄø®Äø§Äø Äø™Äø’Äø‹Äø„Äø}ÄøvÄøoÄøhÄøaÄøZÄøSÄøLÄøEÄø>Äø7Äø0Äø)Äø"ÄøÄøÄø ÄøÄøÿÃøøÃøñÃøêÃøãÃøÜÃøÕÃøÎÃøÇÃøÀÃø¹Ãø²Ãø«Ãø¤ÃøÃø–ÃøÃøˆÃøÃøzÃøsÃølÃøeÃø^ÃøWÃøPÃøIÃøBÃø;Ãø4Ãø-Ãø&ÃøÃøÃøÃø ÃøÃøüÂøõÂøîÂøçÂøàÂøÙÂøÒÂøËÂøÄÂø½Âø¶Âø¯Âø¨Âø¡ÂøšÂø“ÂøŒÂø…Âø~ÂøwÂøpÂøiÂøbÂø[ÂøTÂøMÂøFÂø?Âø8Âø1Âø*Âø#ÂøÂøÂøÂøÂøÂøùÁøòÁøëÁøäÁøÝÁøÖÁøÏÁøÈÁøÁÁøºÁø³Áø¬Áø¥ÁøžÁø—ÁøÁø‰Áø‚Áø{ÁøtÁømÁøfÁø_ÁøXÁøQÁøJÁøCÁø<Áø5Áø.Áø'Áø ÁøÁøÁø ÁøÁøýÀøöÀøïÀøèÀøáÀøÚÀøÓÀøÌÀøÅÀø¾Àø·Àø°Àø©Àø¢Àø›Àø”ÀøÀø†ÀøÀøxÀøqÀøjÀøcÀø\ÀøUÀøNÀøGÀø@Àø9Àø2Àø+Àø$ÀøÀøÀøÀøÀøÀøú¿øó¿øì¿øå¿øÞ¿ø׿øпøÉ¿ø¿ø»¿ø´¿ø­¿ø¦¿øŸ¿ø˜¿ø‘¿øŠ¿øƒ¿ø|¿øu¿øn¿øg¿ø`¿øY¿øR¿øK¿øD¿ø=¿ø6¿ø/¿ø(¿ø!¿ø¿ø¿ø ¿ø¿øþ¾ø÷¾øð¾øé¾øâ¾øÛ¾øÔ¾ø;øƾø¿¾ø¸¾ø±¾øª¾ø£¾øœ¾ø•¾ø޾ø‡¾ø€¾øy¾ør¾øk¾ød¾ø]¾øV¾øO¾øH¾øA¾ø:¾ø3¾ø,¾ø%¾ø¾ø¾ø¾ø ¾ø¾øû½øô½øí½øæ½øß½øؽøѽøʽøýø¼½øµ½ø®½ø§½ø ½ø™½ø’½ø‹½ø„½ø}½øv½øo½øh½øa½øZ½øS½øL½øE½ø>½ø7½ø0½ø)½ø"½ø½ø½ø ½ø½øÿ¼øø¼øñ¼øê¼øã¼øܼøÕ¼øμøǼøÀ¼ø¹¼ø²¼ø«¼ø¤¼ø¼ø–¼ø¼øˆ¼ø¼øz¼øs¼øl¼øe¼ø^¼øW¼øP¼øI¼øB¼ø;¼ø4¼ø-¼ø&¼ø¼ø¼ø¼ø ¼ø¼øü»øõ»øî»øç»øà»øÙ»øÒ»øË»øÄ»ø½»ø¶»ø¯»ø¨»ø¡»øš»ø“»øŒ»ø…»ø~»øw»øp»øi»øb»ø[»øT»øM»øF»ø?»ø8»ø1»ø*»ø#»ø»ø»ø»ø»ø»øùºøòºøëºøäºøݺøÖºøϺøȺøÁºøººø³ºø¬ºø¥ºøžºø—ºøºø‰ºø‚ºø{ºøtºømºøfºø_ºøXºøQºøJºøCºø<ºø5ºø.ºø'ºø ºøºøºø ºøºøý¹øö¹øï¹øè¹øá¹øÚ¹øÓ¹ø̹øŹø¾¹ø·¹ø°¹ø©¹ø¢¹ø›¹ø”¹ø¹ø†¹ø¹øx¹øq¹øj¹øc¹ø\¹øU¹øN¹øG¹ø@¹ø9¹ø2¹ø+¹ø$¹ø¹ø¹ø¹ø¹ø¹øú¸øó¸øì¸ø司Þ¸ø׸øиøɸø¸ø»¸ø´¸ø­¸ø¦¸øŸ¸ø˜¸ø‘¸øЏøƒ¸ø|¸øu¸øn¸øg¸ø`¸øY¸øR¸øK¸øD¸ø=¸ø6¸ø/¸ø(¸ø!¸ø¸ø¸ø ¸ø¸øþ·ø÷·øð·øé·øâ·øÛ·øÔ·øÍ·øÆ·ø¿·ø¸·ø±·øª·ø£·øœ·ø•·øŽ·ø‡·ø€·øy·ør·øk·ød·ø]·øV·øO·øH·øA·ø:·ø3·ø,·ø%·ø·ø·ø·ø ·ø·øû¶øô¶øí¶øæ¶øß¶øضøѶøʶøöø¼¶øµ¶ø®¶ø§¶ø ¶ø™¶ø’¶ø‹¶ø„¶ø}¶øv¶øo¶øh¶øa¶øZ¶øS¶øL¶øE¶ø>¶ø7¶ø0¶ø)¶ø"¶ø¶ø¶ø ¶ø¶øÿµøøµøñµøêµøãµøܵøÕµøεøǵøÀµø¹µø²µø«µø¤µøµø–µøµøˆµøµøzµøsµølµøeµø^µøWµøPµøIµøBµø;µø4µø-µø&µøµøµøµø µøµøü´øõ´øî´øç´øà´øÙ´øÒ´øË´øÄ´ø½´ø¶´ø¯´ø¨´ø¡´øš´ø“´øŒ´ø…´ø~´øw´øp´øi´øb´ø[´øT´øM´øF´ø?´ø8´ø1´ø*´ø#´ø´ø´ø´ø´ø´øù³øò³øë³øä³øݳøÖ³øϳøȳøÁ³øº³ø³³ø¬³ø¥³øž³ø—³ø³ø‰³ø‚³ø{³øt³øm³øf³ø_³øX³øQ³øJ³øC³ø<³ø5³ø.³ø'³ø ³ø³ø³ø ³ø³øý²øö²øï²øè²øá²øÚ²øÓ²ø̲øŲø¾²ø·²ø°²ø©²ø¢²ø›²ø”²ø²ø†²ø²øx²øq²øj²øc²ø\²øU²øN²øG²ø@²ø9²ø2²ø+²ø$²ø²ø²ø²ø²ø²øú±øó±øì±øå±øÞ±ø×±øбøɱø±ø»±ø´±ø­±ø¦±øŸ±ø˜±ø‘±øбøƒ±ø|±øu±øn±øg±ø`±øY±øR±øK±øD±ø=±ø6±ø/±ø(±ø!±ø±ø±ø ±ø±øþ°ø÷°øð°øé°øâ°øÛ°øÔ°øͰøưø¿°ø¸°ø±°øª°ø£°øœ°ø•°øްø‡°ø€°øy°ør°øk°ød°ø]°øV°øO°øH°øA°ø:°ø3°ø,°ø%°ø°ø°ø°ø °ø°øû¯øô¯øí¯øæ¯ø߯øدøѯøʯøïø¼¯øµ¯ø®¯ø§¯ø ¯ø™¯ø’¯ø‹¯ø„¯ø}¯øv¯øo¯øh¯øa¯øZ¯øS¯øL¯øE¯ø>¯ø7¯ø0¯ø)¯ø"¯ø¯ø¯ø ¯ø¯øÿ®øø®øñ®øê®øã®øÜ®øÕ®øήøÇ®øÀ®ø¹®ø²®ø«®ø¤®ø®ø–®ø®øˆ®ø®øz®øs®øl®øe®ø^®øW®øP®øI®øB®ø;®ø4®ø-®ø&®ø®ø®ø®ø ®ø®øü­øõ­øî­øç­øà­øÙ­øÒ­øË­øÄ­ø½­ø¶­ø¯­ø¨­ø¡­øš­ø“­øŒ­ø…­ø~­øw­øp­øi­øb­ø[­øT­øM­øF­ø?­ø8­ø1­ø*­ø#­ø­ø­ø­ø­ø­øù¬øò¬øë¬ø䬸ݬøÖ¬øϬøȬøÁ¬øº¬ø³¬ø¬¬ø¥¬øž¬ø—¬ø¬ø‰¬ø‚¬ø{¬øt¬øm¬øf¬ø_¬øX¬øQ¬øJ¬øC¬ø<¬ø5¬ø.¬ø'¬ø ¬ø¬ø¬ø ¬ø¬øý«øö«øï«øè«øá«øÚ«øÓ«øÌ«øÅ«ø¾«ø·«ø°«ø©«ø¢«ø›«ø”«ø«ø†«ø«øx«øq«øj«øc«ø\«øU«øN«øG«ø@«ø9«ø2«ø+«ø$«ø«ø«ø«ø«ø«øúªøóªøìªøåªøÞªøתøЪøɪøªø»ªø´ªø­ªø¦ªøŸªø˜ªø‘ªøŠªøƒªø|ªøuªønªøgªø`ªøYªøRªøKªøDªø=ªø6ªø/ªø(ªø!ªøªøªø ªøªøþ©ø÷©øð©ø驸â©øÛ©øÔ©øÍ©øÆ©ø¿©ø¸©ø±©øª©ø£©øœ©ø•©øŽ©ø‡©ø€©øy©ør©øk©ød©ø]©øV©øO©øH©øA©ø:©ø3©ø,©ø%©ø©ø©ø©ø ©ø©øû¨øô¨øí¨øæ¨øߨøبøѨøʨøèø¼¨øµ¨ø®¨ø§¨ø ¨ø™¨ø’¨ø‹¨ø„¨ø}¨øv¨øo¨øh¨øa¨øZ¨øS¨øL¨øE¨ø>¨ø7¨ø0¨ø)¨ø"¨ø¨ø¨ø ¨ø¨øÿ§øø§øñ§øê§øã§øܧøÕ§øΧøǧøÀ§ø¹§ø²§ø«§ø¤§ø§ø–§ø§øˆ§ø§øz§øs§øl§øe§ø^§øW§øP§øI§øB§ø;§ø4§ø-§ø&§ø§ø§ø§ø §ø§øü¦øõ¦øî¦øç¦øà¦øÙ¦øÒ¦ø˦øĦø½¦ø¶¦ø¯¦ø¨¦ø¡¦øš¦ø“¦øŒ¦ø…¦ø~¦øw¦øp¦øi¦øb¦ø[¦øT¦øM¦øF¦ø?¦ø8¦ø1¦ø*¦ø#¦ø¦ø¦ø¦ø¦ø¦øù¥øò¥øë¥ø䥸Ý¥øÖ¥øÏ¥øÈ¥øÁ¥øº¥ø³¥ø¬¥ø¥¥øž¥ø—¥ø¥ø‰¥ø‚¥ø{¥øt¥øm¥øf¥ø_¥øX¥øQ¥øJ¥øC¥ø<¥ø5¥ø.¥ø'¥ø ¥ø¥ø¥ø ¥ø¥øý¤øö¤øï¤øè¤øá¤øÚ¤øÓ¤ø̤øŤø¾¤ø·¤ø°¤ø©¤ø¢¤ø›¤ø”¤ø¤ø†¤ø¤øx¤øq¤øj¤øc¤ø\¤øU¤øN¤øG¤ø@¤ø9¤ø2¤ø+¤ø$¤ø¤ø¤ø¤ø¤ø¤øú£øó£øì£ø壸Þ£ø×£øУøÉ£ø£ø»£ø´£ø­£ø¦£øŸ£ø˜£ø‘£øŠ£øƒ£ø|£øu£øn£øg£ø`£øY£øR£øK£øD£ø=£ø6£ø/£ø(£ø!£ø£ø£ø £ø£øþ¢ø÷¢øð¢ø颸â¢øÛ¢øÔ¢øÍ¢øÆ¢ø¿¢ø¸¢ø±¢øª¢ø£¢øœ¢ø•¢øŽ¢ø‡¢ø€¢øy¢ør¢øk¢ød¢ø]¢øV¢øO¢øH¢øA¢ø:¢ø3¢ø,¢ø%¢ø¢ø¢ø¢ø ¢ø¢øû¡øô¡øí¡øæ¡øß¡øØ¡øÑ¡øÊ¡øáø¼¡øµ¡ø®¡ø§¡ø ¡ø™¡ø’¡ø‹¡ø„¡ø}¡øv¡øo¡øh¡øa¡øZ¡øS¡øL¡øE¡ø>¡ø7¡ø0¡ø)¡ø"¡ø¡ø¡ø ¡ø¡øÿ øø øñ øê øã øÜ øÕ øΠøÇ øÀ ø¹ ø² ø« ø¤ ø ø– ø øˆ ø øz øs øl øe ø^ øW øP øI øB ø; ø4 ø- ø& ø ø ø ø  ø øüŸøõŸøîŸøçŸøàŸøÙŸøÒŸøËŸøÄŸø½Ÿø¶Ÿø¯Ÿø¨Ÿø¡ŸøšŸø“ŸøŒŸø…Ÿø~ŸøwŸøpŸøiŸøbŸø[ŸøTŸøMŸøFŸø?Ÿø8Ÿø1Ÿø*Ÿø#ŸøŸøŸøŸøŸøŸøùžøòžøëžøäžøÝžøÖžøÏžøÈžøÁžøºžø³žø¬žø¥žøžžø—žøžø‰žø‚žø{žøtžømžøfžø_žøXžøQžøJžøCžø<žø5žø.žø'žø žøžøžø žøžøýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúœøóœøìœøåœøÞœøלøМøÉœøœø»œø´œø­œø¦œøŸœø˜œø‘œøŠœøƒœø|œøuœønœøgœø`œøYœøRœøKœøDœø=œø6œø/œø(œø!œøœøœø œøœøþ›ø÷›øð›ø雸â›øÛ›øÔ›øÍ›øÆ›ø¿›ø¸›ø±›øª›ø£›øœ›ø•›øŽ›ø‡›ø€›øy›ør›øk›ød›ø]›øV›øO›øH›øA›ø:›ø3›ø,›ø%›ø›ø›ø›ø ›ø›øûšøôšøíšøæšøßšøØšøÑšøÊšøÚø¼šøµšø®šø§šø šø™šø’šø‹šø„šø}šøvšøošøhšøašøZšøSšøLšøEšø>šø7šø0šø)šø"šøšøšø šøšøÿ™øø™øñ™øê™øã™øÜ™øÕ™øΙøÇ™øÀ™ø¹™ø²™ø«™ø¤™ø™ø–™ø™øˆ™ø™øz™øs™øl™øe™ø^™øW™øP™øI™øB™ø;™ø4™ø-™ø&™ø™ø™ø™ø ™ø™øü˜øõ˜øî˜øç˜øà˜øÙ˜øÒ˜ø˘øĘø½˜ø¶˜ø¯˜ø¨˜ø¡˜øš˜ø“˜øŒ˜ø…˜ø~˜øw˜øp˜øi˜øb˜ø[˜øT˜øM˜øF˜ø?˜ø8˜ø1˜ø*˜ø#˜ø˜ø˜ø˜ø˜ø˜øù—øò—øë—øä—øÝ—øÖ—øÏ—øÈ—øÁ—øº—ø³—ø¬—ø¥—øž—ø——ø—ø‰—ø‚—ø{—øt—øm—øf—ø_—øX—øQ—øJ—øC—ø<—ø5—ø.—ø'—ø —ø—ø—ø —ø—øý–øö–øï–øè–øá–øÚ–øÓ–øÌ–øÅ–ø¾–ø·–ø°–ø©–ø¢–ø›–ø”–ø–ø†–ø–øx–øq–øj–øc–ø\–øU–øN–øG–ø@–ø9–ø2–ø+–ø$–ø–ø–ø–ø–ø–øú•øó•øì•ø啸Þ•øוøЕøÉ•ø•ø»•ø´•ø­•ø¦•øŸ•ø˜•ø‘•øŠ•øƒ•ø|•øu•øn•øg•ø`•øY•øR•øK•øD•ø=•ø6•ø/•ø(•ø!•ø•ø•ø •ø•øþ”ø÷”øð”ø锸â”øÛ”øÔ”øÍ”øÆ”ø¿”ø¸”ø±”øª”ø£”øœ”ø•”øŽ”ø‡”ø€”øy”ør”øk”ød”ø]”øV”øO”øH”øA”ø:”ø3”ø,”ø%”ø”ø”ø”ø ”ø”øû“øô“øí“øæ“øß“øØ“øÑ“øÊ“øÓø¼“øµ“ø®“ø§“ø “ø™“ø’“ø‹“ø„“ø}“øv“øo“øh“øa“øZ“øS“øL“øE“ø>“ø7“ø0“ø)“ø"“ø“ø“ø “ø“øÿ’øø’øñ’øê’øã’øÜ’øÕ’øÎ’øÇ’øÀ’ø¹’ø²’ø«’ø¤’ø’ø–’ø’øˆ’ø’øz’øs’øl’øe’ø^’øW’øP’øI’øB’ø;’ø4’ø-’ø&’ø’ø’ø’ø ’ø’øü‘øõ‘øî‘øç‘øà‘øÙ‘øÒ‘øË‘øÄ‘ø½‘ø¶‘ø¯‘ø¨‘ø¡‘øš‘ø“‘øŒ‘ø…‘ø~‘øw‘øp‘øi‘øb‘ø[‘øT‘øM‘øF‘ø?‘ø8‘ø1‘ø*‘ø#‘ø‘ø‘ø‘ø‘ø‘øùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúŽøóŽøìŽøåŽøÞŽø׎øÐŽøÉŽøÂŽø»Žø´Žø­Žø¦ŽøŸŽø˜Žø‘ŽøŠŽøƒŽø|ŽøuŽønŽøgŽø`ŽøYŽøRŽøKŽøDŽø=Žø6Žø/Žø(Žø!ŽøŽøŽø ŽøŽøþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûŒøôŒøíŒøæŒøߌøØŒøÑŒøÊŒøÃŒø¼ŒøµŒø®Œø§Œø Œø™Œø’Œø‹Œø„Œø}ŒøvŒøoŒøhŒøaŒøZŒøSŒøLŒøEŒø>Œø7Œø0Œø)Œø"ŒøŒøŒø ŒøŒøÿ‹øø‹øñ‹øê‹øã‹øÜ‹øÕ‹ø΋øÇ‹øÀ‹ø¹‹ø²‹ø«‹ø¤‹ø‹ø–‹ø‹øˆ‹ø‹øz‹øs‹øl‹øe‹ø^‹øW‹øP‹øI‹øB‹ø;‹ø4‹ø-‹ø&‹ø‹ø‹ø‹ø ‹ø‹øüŠøõŠøîŠøçŠøàŠøÙŠøÒŠøËŠøÄŠø½Šø¶Šø¯Šø¨Šø¡ŠøšŠø“ŠøŒŠø…Šø~ŠøwŠøpŠøiŠøbŠø[ŠøTŠøMŠøFŠø?Šø8Šø1Šø*Šø#ŠøŠøŠøŠøŠøŠøù‰øò‰øë‰ø䉸݉øÖ‰øωøȉøÁ‰øº‰ø³‰ø¬‰ø¥‰øž‰ø—‰ø‰ø‰‰ø‚‰ø{‰øt‰øm‰øf‰ø_‰øX‰øQ‰øJ‰øC‰ø<‰ø5‰ø.‰ø'‰ø ‰ø‰ø‰ø ‰ø‰øýˆøöˆøïˆøèˆøáˆøÚˆøÓˆø̈øňø¾ˆø·ˆø°ˆø©ˆø¢ˆø›ˆø”ˆøˆø†ˆøˆøxˆøqˆøjˆøcˆø\ˆøUˆøNˆøGˆø@ˆø9ˆø2ˆø+ˆø$ˆøˆøˆøˆøˆøˆøú‡øó‡øì‡ø凸Þ‡øׇøЇøɇø‡ø»‡ø´‡ø­‡ø¦‡øŸ‡ø˜‡ø‘‡øЇøƒ‡ø|‡øu‡øn‡øg‡ø`‡øY‡øR‡øK‡øD‡ø=‡ø6‡ø/‡ø(‡ø!‡ø‡ø‡ø ‡ø‡øþ†ø÷†øð†ø醸â†øÛ†øÔ†ø͆øƆø¿†ø¸†ø±†øª†ø£†øœ†ø•†øކø‡†ø€†øy†ør†øk†ød†ø]†øV†øO†øH†øA†ø:†ø3†ø,†ø%†ø†ø†ø†ø †ø†øû…øô…øí…øæ…øß…øØ…øÑ…øÊ…øÃ…ø¼…øµ…ø®…ø§…ø …ø™…ø’…ø‹…ø„…ø}…øv…øo…øh…øa…øZ…øS…øL…øE…ø>…ø7…ø0…ø)…ø"…ø…ø…ø …ø…øÿ„øø„øñ„øê„øã„øÜ„øÕ„ø΄øÇ„øÀ„ø¹„ø²„ø«„ø¤„ø„ø–„ø„øˆ„ø„øz„øs„øl„øe„ø^„øW„øP„øI„øB„ø;„ø4„ø-„ø&„ø„ø„ø„ø „ø„øüƒøõƒøîƒøçƒøàƒøÙƒøÒƒø˃øăø½ƒø¶ƒø¯ƒø¨ƒø¡ƒøšƒø“ƒøŒƒø…ƒø~ƒøwƒøpƒøiƒøbƒø[ƒøTƒøMƒøFƒø?ƒø8ƒø1ƒø*ƒø#ƒøƒøƒøƒøƒøƒøù‚øò‚øë‚ø䂸Ý‚øÖ‚øÏ‚øÈ‚øÁ‚øº‚ø³‚ø¬‚ø¥‚øž‚ø—‚ø‚ø‰‚ø‚‚ø{‚øt‚øm‚øf‚ø_‚øX‚øQ‚øJ‚øC‚ø<‚ø5‚ø.‚ø'‚ø ‚ø‚ø‚ø ‚ø‚øýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú€øó€øì€ø倸Þ€ø×€øЀøÉ€ø€ø»€ø´€ø­€ø¦€øŸ€ø˜€ø‘€øŠ€øƒ€ø|€øu€øn€øg€ø`€øY€øR€øK€øD€ø=€ø6€ø/€ø(€ø!€ø€ø€ø €ø€øþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøû~øô~øí~øæ~øß~øØ~øÑ~øÊ~øÃ~ø¼~øµ~ø®~ø§~ø ~ø™~ø’~ø‹~ø„~ø}~øv~øo~øh~øa~øZ~øS~øL~øE~ø>~ø7~ø0~ø)~ø"~ø~ø~ø ~ø~øÿ}øø}øñ}øê}øã}øÜ}øÕ}øÎ}øÇ}øÀ}ø¹}ø²}ø«}ø¤}ø}ø–}ø}øˆ}ø}øz}øs}øl}øe}ø^}øW}øP}øI}øB}ø;}ø4}ø-}ø&}ø}ø}ø}ø }ø}øü|øõ|øî|øç|øà|øÙ|øÒ|øË|øÄ|ø½|ø¶|ø¯|ø¨|ø¡|øš|ø“|øŒ|ø…|ø~|øw|øp|øi|øb|ø[|øT|øM|øF|ø?|ø8|ø1|ø*|ø#|ø|ø|ø|ø|ø|øù{øò{øë{øä{øÝ{øÖ{øÏ{øÈ{øÁ{øº{ø³{ø¬{ø¥{øž{ø—{ø{ø‰{ø‚{ø{{øt{øm{øf{ø_{øX{øQ{øJ{øC{ø<{ø5{ø.{ø'{ø {ø{ø{ø {ø{øýzøözøïzøèzøázøÚzøÓzøÌzøÅzø¾zø·zø°zø©zø¢zø›zø”zøzø†zøzøxzøqzøjzøczø\zøUzøNzøGzø@zø9zø2zø+zø$zøzøzøzøzøzøúyøóyøìyøåyøÞyø×yøÐyøÉyøÂyø»yø´yø­yø¦yøŸyø˜yø‘yøŠyøƒyø|yøuyønyøgyø`yøYyøRyøKyøDyø=yø6yø/yø(yø!yøyøyø yøyøþxø÷xøðxøéxøâxøÛxøÔxøÍxøÆxø¿xø¸xø±xøªxø£xøœxø•xøŽxø‡xø€xøyxørxøkxødxø]xøVxøOxøHxøAxø:xø3xø,xø%xøxøxøxø xøxøûwøôwøíwøæwøßwøØwøÑwøÊwøÃwø¼wøµwø®wø§wø wø™wø’wø‹wø„wø}wøvwøowøhwøawøZwøSwøLwøEwø>wø7wø0wø)wø"wøwøwø wøwøÿvøøvøñvøêvøãvøÜvøÕvøÎvøÇvøÀvø¹vø²vø«vø¤vøvø–vøvøˆvøvøzvøsvølvøevø^vøWvøPvøIvøBvø;vø4vø-vø&vøvøvøvø vøvøüuøõuøîuøçuøàuøÙuøÒuøËuøÄuø½uø¶uø¯uø¨uø¡uøšuø“uøŒuø…uø~uøwuøpuøiuøbuø[uøTuøMuøFuø?uø8uø1uø*uø#uøuøuøuøuøuøùtøòtøëtøätøÝtøÖtøÏtøÈtøÁtøºtø³tø¬tø¥tøžtø—tøtø‰tø‚tø{tøttømtøftø_tøXtøQtøJtøCtøpø7pø0pø)pø"pøpøpø pøpøÿoøøoøñoøêoøãoøÜoøÕoøÎoøÇoøÀoø¹oø²oø«oø¤oøoø–oøoøˆoøoøzoøsoøloøeoø^oøWoøPoøIoøBoø;oø4oø-oø&oøoøoøoø oøoøünøõnøînøçnøànøÙnøÒnøËnøÄnø½nø¶nø¯nø¨nø¡nøšnø“nøŒnø…nø~nøwnøpnøinøbnø[nøTnøMnøFnø?nø8nø1nø*nø#nønønønønønøùmøòmøëmøämøÝmøÖmøÏmøÈmøÁmøºmø³mø¬mø¥møžmø—mømø‰mø‚mø{møtmømmøfmø_møXmøQmøJmøCmøiø7iø0iø)iø"iøiøiø iøiøÿhøøhøñhøêhøãhøÜhøÕhøÎhøÇhøÀhø¹hø²hø«hø¤høhø–høhøˆhøhøzhøshølhøehø^høWhøPhøIhøBhø;hø4hø-hø&høhøhøhø høhøügøõgøîgøçgøàgøÙgøÒgøËgøÄgø½gø¶gø¯gø¨gø¡gøšgø“gøŒgø…gø~gøwgøpgøigøbgø[gøTgøMgøFgø?gø8gø1gø*gø#gøgøgøgøgøgøùføòføëføäføÝføÖføÏføÈføÁføºfø³fø¬fø¥føžfø—føfø‰fø‚fø{føtfømføffø_føXføQføJføCføbø7bø0bø)bø"bøbøbø bøbøÿaøøaøñaøêaøãaøÜaøÕaøÎaøÇaøÀaø¹aø²aø«aø¤aøaø–aøaøˆaøaøzaøsaølaøeaø^aøWaøPaøIaøBaø;aø4aø-aø&aøaøaøaø aøaøü`øõ`øî`øç`øà`øÙ`øÒ`øË`øÄ`ø½`ø¶`ø¯`ø¨`ø¡`øš`ø“`øŒ`ø…`ø~`øw`øp`øi`øb`ø[`øT`øM`øF`ø?`ø8`ø1`ø*`ø#`ø`ø`ø`ø`ø`øù_øò_øë_øä_øÝ_øÖ_øÏ_øÈ_øÁ_øº_ø³_ø¬_ø¥_øž_ø—_ø_ø‰_ø‚_ø{_øt_øm_øf_ø__øX_øQ_øJ_øC_ø<_ø5_ø._ø'_ø _ø_ø_ø _ø_øý^øö^øï^øè^øá^øÚ^øÓ^øÌ^øÅ^ø¾^ø·^ø°^ø©^ø¢^ø›^ø”^ø^ø†^ø^øx^øq^øj^øc^ø\^øU^øN^øG^ø@^ø9^ø2^ø+^ø$^ø^ø^ø^ø^ø^øú]øó]øì]øå]øÞ]ø×]øÐ]øÉ]øÂ]ø»]ø´]ø­]ø¦]øŸ]ø˜]ø‘]øŠ]øƒ]ø|]øu]øn]øg]ø`]øY]øR]øK]øD]ø=]ø6]ø/]ø(]ø!]ø]ø]ø ]ø]øþ\ø÷\øð\øé\øâ\øÛ\øÔ\øÍ\øÆ\ø¿\ø¸\ø±\øª\ø£\øœ\ø•\øŽ\ø‡\ø€\øy\ør\øk\ød\ø]\øV\øO\øH\øA\ø:\ø3\ø,\ø%\ø\ø\ø\ø \ø\øû[øô[øí[øæ[øß[øØ[øÑ[øÊ[øÃ[ø¼[øµ[ø®[ø§[ø [ø™[ø’[ø‹[ø„[ø}[øv[øo[øh[øa[øZ[øS[øL[øE[ø>[ø7[ø0[ø)[ø"[ø[ø[ø [ø[øÿZøøZøñZøêZøãZøÜZøÕZøÎZøÇZøÀZø¹Zø²Zø«Zø¤ZøZø–ZøZøˆZøZøzZøsZølZøeZø^ZøWZøPZøIZøBZø;Zø4Zø-Zø&ZøZøZøZø ZøZøüYøõYøîYøçYøàYøÙYøÒYøËYøÄYø½Yø¶Yø¯Yø¨Yø¡YøšYø“YøŒYø…Yø~YøwYøpYøiYøbYø[YøTYøMYøFYø?Yø8Yø1Yø*Yø#YøYøYøYøYøYøùXøòXøëXøäXøÝXøÖXøÏXøÈXøÁXøºXø³Xø¬Xø¥XøžXø—XøXø‰Xø‚Xø{XøtXømXøfXø_XøXXøQXøJXøCXøTø7Tø0Tø)Tø"TøTøTø TøTøÿSøøSøñSøêSøãSøÜSøÕSøÎSøÇSøÀSø¹Sø²Sø«Sø¤SøSø–SøSøˆSøSøzSøsSølSøeSø^SøWSøPSøISøBSø;Sø4Sø-Sø&SøSøSøSø SøSøüRøõRøîRøçRøàRøÙRøÒRøËRøÄRø½Rø¶Rø¯Rø¨Rø¡RøšRø“RøŒRø…Rø~RøwRøpRøiRøbRø[RøTRøMRøFRø?Rø8Rø1Rø*Rø#RøRøRøRøRøRøùQøòQøëQøäQøÝQøÖQøÏQøÈQøÁQøºQø³Qø¬Qø¥QøžQø—QøQø‰Qø‚Qø{QøtQømQøfQø_QøXQøQQøJQøCQøMø7Mø0Mø)Mø"MøMøMø MøMøÿLøøLøñLøêLøãLøÜLøÕLøÎLøÇLøÀLø¹Lø²Lø«Lø¤LøLø–LøLøˆLøLøzLøsLølLøeLø^LøWLøPLøILøBLø;Lø4Lø-Lø&LøLøLøLø LøLøüKøõKøîKøçKøàKøÙKøÒKøËKøÄKø½Kø¶Kø¯Kø¨Kø¡KøšKø“KøŒKø…Kø~KøwKøpKøiKøbKø[KøTKøMKøFKø?Kø8Kø1Kø*Kø#KøKøKøKøKøKøùJøòJøëJøäJøÝJøÖJøÏJøÈJøÁJøºJø³Jø¬Jø¥JøžJø—JøJø‰Jø‚Jø{JøtJømJøfJø_JøXJøQJøJJøCJøFø7Fø0Fø)Fø"FøFøFø FøFøÿEøøEøñEøêEøãEøÜEøÕEøÎEøÇEøÀEø¹Eø²Eø«Eø¤EøEø–EøEøˆEøEøzEøsEølEøeEø^EøWEøPEøIEøBEø;Eø4Eø-Eø&EøEøEøEø EøEøüDøõDøîDøçDøàDøÙDøÒDøËDøÄDø½Dø¶Dø¯Dø¨Dø¡DøšDø“DøŒDø…Dø~DøwDøpDøiDøbDø[DøTDøMDøFDø?Dø8Dø1Dø*Dø#DøDøDøDøDøDøùCøòCøëCøäCøÝCøÖCøÏCøÈCøÁCøºCø³Cø¬Cø¥CøžCø—CøCø‰Cø‚Cø{CøtCømCøfCø_CøXCøQCøJCøCCø?ø7?ø0?ø)?ø"?ø?ø?ø ?ø?øÿ>øø>øñ>øê>øã>øÜ>øÕ>øÎ>øÇ>øÀ>ø¹>ø²>ø«>ø¤>ø>ø–>ø>øˆ>ø>øz>øs>øl>øe>ø^>øW>øP>øI>øB>ø;>ø4>ø->ø&>ø>ø>ø>ø >ø>øü=øõ=øî=øç=øà=øÙ=øÒ=øË=øÄ=ø½=ø¶=ø¯=ø¨=ø¡=øš=ø“=øŒ=ø…=ø~=øw=øp=øi=øb=ø[=øT=øM=øF=ø?=ø8=ø1=ø*=ø#=ø=ø=ø=ø=ø=øù<øò<øë<øä<øÝ<øÖ<øÏ<øÈ<øÁ<øº<ø³<ø¬<ø¥<øž<ø—<ø<ø‰<ø‚<ø{<øt<øm<øf<ø_<øX<øQ<øJ<øC<ø<<ø5<ø.<ø'<ø <ø<ø<ø <ø<øý;øö;øï;øè;øá;øÚ;øÓ;øÌ;øÅ;ø¾;ø·;ø°;ø©;ø¢;ø›;ø”;ø;ø†;ø;øx;øq;øj;øc;ø\;øU;øN;øG;ø@;ø9;ø2;ø+;ø$;ø;ø;ø;ø;ø;øú:øó:øì:øå:øÞ:ø×:øÐ:øÉ:øÂ:ø»:ø´:ø­:ø¦:øŸ:ø˜:ø‘:øŠ:øƒ:ø|:øu:øn:øg:ø`:øY:øR:øK:øD:ø=:ø6:ø/:ø(:ø!:ø:ø:ø :ø:øþ9ø÷9øð9øé9øâ9øÛ9øÔ9øÍ9øÆ9ø¿9ø¸9ø±9øª9ø£9øœ9ø•9øŽ9ø‡9ø€9øy9ør9øk9ød9ø]9øV9øO9øH9øA9ø:9ø39ø,9ø%9ø9ø9ø9ø 9ø9øû8øô8øí8øæ8øß8øØ8øÑ8øÊ8øÃ8ø¼8øµ8ø®8ø§8ø 8ø™8ø’8ø‹8ø„8ø}8øv8øo8øh8øa8øZ8øS8øL8øE8ø>8ø78ø08ø)8ø"8ø8ø8ø 8ø8øÿ7øø7øñ7øê7øã7øÜ7øÕ7øÎ7øÇ7øÀ7ø¹7ø²7ø«7ø¤7ø7ø–7ø7øˆ7ø7øz7øs7øl7øe7ø^7øW7øP7øI7øB7ø;7ø47ø-7ø&7ø7ø7ø7ø 7ø7øü6øõ6øî6øç6øà6øÙ6øÒ6øË6øÄ6ø½6ø¶6ø¯6ø¨6ø¡6øš6ø“6øŒ6ø…6ø~6øw6øp6øi6øb6ø[6øT6øM6øF6ø?6ø86ø16ø*6ø#6ø6ø6ø6ø6ø6øù5øò5øë5øä5øÝ5øÖ5øÏ5øÈ5øÁ5øº5ø³5ø¬5ø¥5øž5ø—5ø5ø‰5ø‚5ø{5øt5øm5øf5ø_5øX5øQ5øJ5øC5ø<5ø55ø.5ø'5ø 5ø5ø5ø 5ø5øý4øö4øï4øè4øá4øÚ4øÓ4øÌ4øÅ4ø¾4ø·4ø°4ø©4ø¢4ø›4ø”4ø4ø†4ø4øx4øq4øj4øc4ø\4øU4øN4øG4ø@4ø94ø24ø+4ø$4ø4ø4ø4ø4ø4øú3øó3øì3øå3øÞ3ø×3øÐ3øÉ3øÂ3ø»3ø´3ø­3ø¦3øŸ3ø˜3ø‘3øŠ3øƒ3ø|3øu3øn3øg3ø`3øY3øR3øK3øD3ø=3ø63ø/3ø(3ø!3ø3ø3ø 3ø3øþ2ø÷2øð2øé2øâ2øÛ2øÔ2øÍ2øÆ2ø¿2ø¸2ø±2øª2ø£2øœ2ø•2øŽ2ø‡2ø€2øy2ør2øk2ød2ø]2øV2øO2øH2øA2ø:2ø32ø,2ø%2ø2ø2ø2ø 2ø2øû1øô1øí1øæ1øß1øØ1øÑ1øÊ1øÃ1ø¼1øµ1ø®1ø§1ø 1ø™1ø’1ø‹1ø„1ø}1øv1øo1øh1øa1øZ1øS1øL1øE1ø>1ø71ø01ø)1ø"1ø1ø1ø 1ø1øÿ0øø0øñ0øê0øã0øÜ0øÕ0øÎ0øÇ0øÀ0ø¹0ø²0ø«0ø¤0ø0ø–0ø0øˆ0ø0øz0øs0øl0øe0ø^0øW0øP0øI0øB0ø;0ø40ø-0ø&0ø0ø0ø0ø 0ø0øü/øõ/øî/øç/øà/øÙ/øÒ/øË/øÄ/ø½/ø¶/ø¯/ø¨/ø¡/øš/ø“/øŒ/ø…/ø~/øw/øp/øi/øb/ø[/øT/øM/øF/ø?/ø8/ø1/ø*/ø#/ø/ø/ø/ø/ø/øù.øò.øë.øä.øÝ.øÖ.øÏ.øÈ.øÁ.øº.ø³.ø¬.ø¥.øž.ø—.ø.ø‰.ø‚.ø{.øt.øm.øf.ø_.øX.øQ.øJ.øC.ø<.ø5.ø..ø'.ø .ø.ø.ø .ø.øý-øö-øï-øè-øá-øÚ-øÓ-øÌ-øÅ-ø¾-ø·-ø°-ø©-ø¢-ø›-ø”-ø-ø†-ø-øx-øq-øj-øc-ø\-øU-øN-øG-ø@-ø9-ø2-ø+-ø$-ø-ø-ø-ø-ø-øú,øó,øì,øå,øÞ,ø×,øÐ,øÉ,øÂ,ø»,ø´,ø­,ø¦,øŸ,ø˜,ø‘,øŠ,øƒ,ø|,øu,øn,øg,ø`,øY,øR,øK,øD,ø=,ø6,ø/,ø(,ø!,ø,ø,ø ,ø,øþ+ø÷+øð+øé+øâ+øÛ+øÔ+øÍ+øÆ+ø¿+ø¸+ø±+øª+ø£+øœ+ø•+øŽ+ø‡+ø€+øy+ør+øk+ød+ø]+øV+øO+øH+øA+ø:+ø3+ø,+ø%+ø+ø+ø+ø +ø+øû*øô*øí*øæ*øß*øØ*øÑ*øÊ*øÃ*ø¼*øµ*ø®*ø§*ø *ø™*ø’*ø‹*ø„*ø}*øv*øo*øh*øa*øZ*øS*øL*øE*ø>*ø7*ø0*ø)*ø"*ø*ø*ø *ø*øÿ)øø)øñ)øê)øã)øÜ)øÕ)øÎ)øÇ)øÀ)ø¹)ø²)ø«)ø¤)ø)ø–)ø)øˆ)ø)øz)øs)øl)øe)ø^)øW)øP)øI)øB)ø;)ø4)ø-)ø&)ø)ø)ø)ø )ø)øü(øõ(øî(øç(øà(øÙ(øÒ(øË(øÄ(ø½(ø¶(ø¯(ø¨(ø¡(øš(ø“(øŒ(ø…(ø~(øw(øp(øi(øb(ø[(øT(øM(øF(ø?(ø8(ø1(ø*(ø#(ø(ø(ø(ø(ø(øù'øò'øë'øä'øÝ'øÖ'øÏ'øÈ'øÁ'øº'ø³'ø¬'ø¥'øž'ø—'ø'ø‰'ø‚'ø{'øt'øm'øf'ø_'øX'øQ'øJ'øC'ø<'ø5'ø.'ø''ø 'ø'ø'ø 'ø'øý&øö&øï&øè&øá&øÚ&øÓ&øÌ&øÅ&ø¾&ø·&ø°&ø©&ø¢&ø›&ø”&ø&ø†&ø&øx&øq&øj&øc&ø\&øU&øN&øG&ø@&ø9&ø2&ø+&ø$&ø&ø&ø&ø&ø&øú%øó%øì%øå%øÞ%ø×%øÐ%øÉ%øÂ%ø»%ø´%ø­%ø¦%øŸ%ø˜%ø‘%øŠ%øƒ%ø|%øu%øn%øg%ø`%øY%øR%øK%øD%ø=%ø6%ø/%ø(%ø!%ø%ø%ø %ø%øþ$ø÷$øð$øé$øâ$øÛ$øÔ$øÍ$øÆ$ø¿$ø¸$ø±$øª$ø£$øœ$ø•$øŽ$ø‡$ø€$øy$ør$øk$ød$ø]$øV$øO$øH$øA$ø:$ø3$ø,$ø%$ø$ø$ø$ø $ø$øû#øô#øí#øæ#øß#øØ#øÑ#øÊ#øÃ#ø¼#øµ#ø®#ø§#ø #ø™#ø’#ø‹#ø„#ø}#øv#øo#øh#øa#øZ#øS#øL#øE#ø>#ø7#ø0#ø)#ø"#ø#ø#ø #ø#øÿ"øø"øñ"øê"øã"øÜ"øÕ"øÎ"øÇ"øÀ"ø¹"ø²"ø«"ø¤"ø"ø–"ø"øˆ"ø"øz"øs"øl"øe"ø^"øW"øP"øI"øB"ø;"ø4"ø-"ø&"ø"ø"ø"ø "ø"øü!øõ!øî!øç!øà!øÙ!øÒ!øË!øÄ!ø½!ø¶!ø¯!ø¨!ø¡!øš!ø“!øŒ!ø…!ø~!øw!øp!øi!øb!ø[!øT!øM!øF!ø?!ø8!ø1!ø*!ø#!ø!ø!ø!ø!ø!øù øò øë øä øÝ øÖ øÏ øÈ øÁ øº ø³ ø¬ ø¥ øž ø— ø ø‰ ø‚ ø{ øt øm øf ø_ øX øQ øJ øC ø< ø5 ø. ø' ø ø ø ø ø øýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿ øø øñ øê øã øÜ øÕ øÎ øÇ øÀ ø¹ ø² ø« ø¤ ø ø– ø øˆ ø øz øs øl øe ø^ øW øP øI øB ø; ø4 ø- ø& ø ø ø ø ø øü øõ øî øç øà øÙ øÒ øË øÄ ø½ ø¶ ø¯ ø¨ ø¡ øš ø“ øŒ ø… ø~ øw øp øi øb ø[ øT øM øF ø? ø8 ø1 ø* ø# ø ø ø ø ø øù øò øë øä øÝ øÖ øÏ øÈ øÁ øº ø³ ø¬ ø¥ øž ø— ø ø‰ ø‚ ø{ øt øm øf ø_ øX øQ øJ øC ø< ø5 ø. ø' ø ø ø ø ø øý øö øï øè øá øÚ øÓ øÌ øÅ ø¾ ø· ø° ø© ø¢ ø› ø” ø ø† ø øx øq øj øc ø\ øU øN øG ø@ ø9 ø2 ø+ ø$ ø ø ø ø ø øú øó øì øå øÞ ø× øÐ øÉ ø ø» ø´ ø­ ø¦ øŸ ø˜ ø‘ øŠ øƒ ø| øu øn øg ø` øY øR øK øD ø= ø6 ø/ ø( ø! ø ø ø ø øþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿÿ÷øÿ÷ñÿ÷êÿ÷ãÿ÷Üÿ÷Õÿ÷Îÿ÷Çÿ÷Àÿ÷¹ÿ÷²ÿ÷«ÿ÷¤ÿ÷ÿ÷–ÿ÷ÿ÷ˆÿ÷ÿ÷zÿ÷sÿ÷lÿ÷eÿ÷^ÿ÷Wÿ÷Pÿ÷Iÿ÷Bÿ÷;ÿ÷4ÿ÷-ÿ÷&ÿ÷ÿ÷ÿ÷ÿ÷ ÿ÷ÿ÷üþ÷õþ÷îþ÷çþ÷àþ÷Ùþ÷Òþ÷Ëþ÷Äþ÷½þ÷¶þ÷¯þ÷¨þ÷¡þ÷šþ÷“þ÷Œþ÷…þ÷~þ÷wþ÷pþ÷iþ÷bþ÷[þ÷Tþ÷Mþ÷Fþ÷?þ÷8þ÷1þ÷*þ÷#þ÷þ÷þ÷þ÷þ÷þ÷ùý÷òý÷ëý÷äý÷Ýý÷Öý÷Ïý÷Èý÷Áý÷ºý÷³ý÷¬ý÷¥ý÷žý÷—ý÷ý÷‰ý÷‚ý÷{ý÷tý÷mý÷fý÷_ý÷Xý÷Qý÷Jý÷Cý÷<ý÷5ý÷.ý÷'ý÷ ý÷ý÷ý÷ ý÷ý÷ýü÷öü÷ïü÷èü÷áü÷Úü÷Óü÷Ìü÷Åü÷¾ü÷·ü÷°ü÷©ü÷¢ü÷›ü÷”ü÷ü÷†ü÷ü÷xü÷qü÷jü÷cü÷\ü÷Uü÷Nü÷Gü÷@ü÷9ü÷2ü÷+ü÷$ü÷ü÷ü÷ü÷ü÷ü÷úû÷óû÷ìû÷åû÷Þû÷×û÷Ðû÷Éû÷Âû÷»û÷´û÷­û÷¦û÷Ÿû÷˜û÷‘û÷Šû÷ƒû÷|û÷uû÷nû÷gû÷`û÷Yû÷Rû÷Kû÷Dû÷=û÷6û÷/û÷(û÷!û÷û÷û÷ û÷û÷þú÷÷ú÷ðú÷éú÷âú÷Ûú÷Ôú÷Íú÷Æú÷¿ú÷¸ú÷±ú÷ªú÷£ú÷œú÷•ú÷Žú÷‡ú÷€ú÷yú÷rú÷kú÷dú÷]ú÷Vú÷Oú÷Hú÷Aú÷:ú÷3ú÷,ú÷%ú÷ú÷ú÷ú÷ ú÷ú÷ûù÷ôù÷íù÷æù÷ßù÷Øù÷Ñù÷Êù÷Ãù÷¼ù÷µù÷®ù÷§ù÷ ù÷™ù÷’ù÷‹ù÷„ù÷}ù÷vù÷où÷hù÷aù÷Zù÷Sù÷Lù÷Eù÷>ù÷7ù÷0ù÷)ù÷"ù÷ù÷ù÷ ù÷ù÷ÿø÷øø÷ñø÷êø÷ãø÷Üø÷Õø÷Îø÷Çø÷Àø÷¹ø÷²ø÷«ø÷¤ø÷ø÷–ø÷ø÷ˆø÷ø÷zø÷sø÷lø÷eø÷^ø÷Wø÷Pø÷Iø÷Bø÷;ø÷4ø÷-ø÷&ø÷ø÷ø÷ø÷ ø÷ø÷ü÷÷õ÷÷î÷÷ç÷÷à÷÷Ù÷÷Ò÷÷Ë÷÷Ä÷÷½÷÷¶÷÷¯÷÷¨÷÷¡÷÷š÷÷“÷÷Œ÷÷…÷÷~÷÷w÷÷p÷÷i÷÷b÷÷[÷÷T÷÷M÷÷F÷÷?÷÷8÷÷1÷÷*÷÷#÷÷÷÷÷÷÷÷÷÷÷÷ùö÷òö÷ëö÷äö÷Ýö÷Öö÷Ïö÷Èö÷Áö÷ºö÷³ö÷¬ö÷¥ö÷žö÷—ö÷ö÷‰ö÷‚ö÷{ö÷tö÷mö÷fö÷_ö÷Xö÷Qö÷Jö÷Cö÷<ö÷5ö÷.ö÷'ö÷ ö÷ö÷ö÷ ö÷ö÷ýõ÷öõ÷ïõ÷èõ÷áõ÷Úõ÷Óõ÷Ìõ÷Åõ÷¾õ÷·õ÷°õ÷©õ÷¢õ÷›õ÷”õ÷õ÷†õ÷õ÷xõ÷qõ÷jõ÷cõ÷\õ÷Uõ÷Nõ÷Gõ÷@õ÷9õ÷2õ÷+õ÷$õ÷õ÷õ÷õ÷õ÷õ÷úô÷óô÷ìô÷åô÷Þô÷×ô÷Ðô÷Éô÷Âô÷»ô÷´ô÷­ô÷¦ô÷Ÿô÷˜ô÷‘ô÷Šô÷ƒô÷|ô÷uô÷nô÷gô÷`ô÷Yô÷Rô÷Kô÷Dô÷=ô÷6ô÷/ô÷(ô÷!ô÷ô÷ô÷ ô÷ô÷þó÷÷ó÷ðó÷éó÷âó÷Ûó÷Ôó÷Íó÷Æó÷¿ó÷¸ó÷±ó÷ªó÷£ó÷œó÷•ó÷Žó÷‡ó÷€ó÷yó÷ró÷kó÷dó÷]ó÷Vó÷Oó÷Hó÷Aó÷:ó÷3ó÷,ó÷%ó÷ó÷ó÷ó÷ ó÷ó÷ûò÷ôò÷íò÷æò÷ßò÷Øò÷Ñò÷Êò÷Ãò÷¼ò÷µò÷®ò÷§ò÷ ò÷™ò÷’ò÷‹ò÷„ò÷}ò÷vò÷oò÷hò÷aò÷Zò÷Sò÷Lò÷Eò÷>ò÷7ò÷0ò÷)ò÷"ò÷ò÷ò÷ ò÷ò÷ÿñ÷øñ÷ññ÷êñ÷ãñ÷Üñ÷Õñ÷Îñ÷Çñ÷Àñ÷¹ñ÷²ñ÷«ñ÷¤ñ÷ñ÷–ñ÷ñ÷ˆñ÷ñ÷zñ÷sñ÷lñ÷eñ÷^ñ÷Wñ÷Pñ÷Iñ÷Bñ÷;ñ÷4ñ÷-ñ÷&ñ÷ñ÷ñ÷ñ÷ ñ÷ñ÷üð÷õð÷îð÷çð÷àð÷Ùð÷Òð÷Ëð÷Äð÷½ð÷¶ð÷¯ð÷¨ð÷¡ð÷šð÷“ð÷Œð÷…ð÷~ð÷wð÷pð÷ið÷bð÷[ð÷Tð÷Mð÷Fð÷?ð÷8ð÷1ð÷*ð÷#ð÷ð÷ð÷ð÷ð÷ð÷ùï÷òï÷ëï÷äï÷Ýï÷Öï÷Ïï÷Èï÷Áï÷ºï÷³ï÷¬ï÷¥ï÷žï÷—ï÷ï÷‰ï÷‚ï÷{ï÷tï÷mï÷fï÷_ï÷Xï÷Qï÷Jï÷Cï÷<ï÷5ï÷.ï÷'ï÷ ï÷ï÷ï÷ ï÷ï÷ýî÷öî÷ïî÷èî÷áî÷Úî÷Óî÷Ìî÷Åî÷¾î÷·î÷°î÷©î÷¢î÷›î÷”î÷î÷†î÷î÷xî÷qî÷jî÷cî÷\î÷Uî÷Nî÷Gî÷@î÷9î÷2î÷+î÷$î÷î÷î÷î÷î÷î÷úí÷óí÷ìí÷åí÷Þí÷×í÷Ðí÷Éí÷Âí÷»í÷´í÷­í÷¦í÷Ÿí÷˜í÷‘í÷Ší÷ƒí÷|í÷uí÷ní÷gí÷`í÷Yí÷Rí÷Kí÷Dí÷=í÷6í÷/í÷(í÷!í÷í÷í÷ í÷í÷þì÷÷ì÷ðì÷éì÷âì÷Ûì÷Ôì÷Íì÷Æì÷¿ì÷¸ì÷±ì÷ªì÷£ì÷œì÷•ì÷Žì÷‡ì÷€ì÷yì÷rì÷kì÷dì÷]ì÷Vì÷Oì÷Hì÷Aì÷:ì÷3ì÷,ì÷%ì÷ì÷ì÷ì÷ ì÷ì÷ûë÷ôë÷íë÷æë÷ßë÷Øë÷Ñë÷Êë÷Ãë÷¼ë÷µë÷®ë÷§ë÷ ë÷™ë÷’ë÷‹ë÷„ë÷}ë÷vë÷oë÷hë÷aë÷Zë÷Së÷Lë÷Eë÷>ë÷7ë÷0ë÷)ë÷"ë÷ë÷ë÷ ë÷ë÷ÿê÷øê÷ñê÷êê÷ãê÷Üê÷Õê÷Îê÷Çê÷Àê÷¹ê÷²ê÷«ê÷¤ê÷ê÷–ê÷ê÷ˆê÷ê÷zê÷sê÷lê÷eê÷^ê÷Wê÷Pê÷Iê÷Bê÷;ê÷4ê÷-ê÷&ê÷ê÷ê÷ê÷ ê÷ê÷üé÷õé÷îé÷çé÷àé÷Ùé÷Òé÷Ëé÷Äé÷½é÷¶é÷¯é÷¨é÷¡é÷šé÷“é÷Œé÷…é÷~é÷wé÷pé÷ié÷bé÷[é÷Té÷Mé÷Fé÷?é÷8é÷1é÷*é÷#é÷é÷é÷é÷é÷é÷ùè÷òè÷ëè÷äè÷Ýè÷Öè÷Ïè÷Èè÷Áè÷ºè÷³è÷¬è÷¥è÷žè÷—è÷è÷‰è÷‚è÷{è÷tè÷mè÷fè÷_è÷Xè÷Qè÷Jè÷Cè÷<è÷5è÷.è÷'è÷ è÷è÷è÷ è÷è÷ýç÷öç÷ïç÷èç÷áç÷Úç÷Óç÷Ìç÷Åç÷¾ç÷·ç÷°ç÷©ç÷¢ç÷›ç÷”ç÷ç÷†ç÷ç÷xç÷qç÷jç÷cç÷\ç÷Uç÷Nç÷Gç÷@ç÷9ç÷2ç÷+ç÷$ç÷ç÷ç÷ç÷ç÷ç÷úæ÷óæ÷ìæ÷åæ÷Þæ÷׿÷Ðæ÷Éæ÷Âæ÷»æ÷´æ÷­æ÷¦æ÷Ÿæ÷˜æ÷‘æ÷Šæ÷ƒæ÷|æ÷uæ÷næ÷gæ÷`æ÷Yæ÷Ræ÷Kæ÷Dæ÷=æ÷6æ÷/æ÷(æ÷!æ÷æ÷æ÷ æ÷æ÷þå÷÷å÷ðå÷éå÷âå÷Ûå÷Ôå÷Íå÷Æå÷¿å÷¸å÷±å÷ªå÷£å÷œå÷•å÷Žå÷‡å÷€å÷yå÷rå÷kå÷då÷]å÷Vå÷Oå÷Hå÷Aå÷:å÷3å÷,å÷%å÷å÷å÷å÷ å÷å÷ûä÷ôä÷íä÷æä÷ßä÷Øä÷Ñä÷Êä÷Ãä÷¼ä÷µä÷®ä÷§ä÷ ä÷™ä÷’ä÷‹ä÷„ä÷}ä÷vä÷oä÷hä÷aä÷Zä÷Sä÷Lä÷Eä÷>ä÷7ä÷0ä÷)ä÷"ä÷ä÷ä÷ ä÷ä÷ÿã÷øã÷ñã÷êã÷ãã÷Üã÷Õã÷Îã÷Çã÷Àã÷¹ã÷²ã÷«ã÷¤ã÷ã÷–ã÷ã÷ˆã÷ã÷zã÷sã÷lã÷eã÷^ã÷Wã÷Pã÷Iã÷Bã÷;ã÷4ã÷-ã÷&ã÷ã÷ã÷ã÷ ã÷ã÷üâ÷õâ÷îâ÷çâ÷àâ÷Ùâ÷Òâ÷Ëâ÷Äâ÷½â÷¶â÷¯â÷¨â÷¡â÷šâ÷“â÷Œâ÷…â÷~â÷wâ÷pâ÷iâ÷bâ÷[â÷Tâ÷Mâ÷Fâ÷?â÷8â÷1â÷*â÷#â÷â÷â÷â÷â÷â÷ùá÷òá÷ëá÷äá÷Ýá÷Öá÷Ïá÷Èá÷Áá÷ºá÷³á÷¬á÷¥á÷žá÷—á÷á÷‰á÷‚á÷{á÷tá÷má÷fá÷_á÷Xá÷Qá÷Já÷Cá÷<á÷5á÷.á÷'á÷ á÷á÷á÷ á÷á÷ýà÷öà÷ïà÷èà÷áà÷Úà÷Óà÷Ìà÷Åà÷¾à÷·à÷°à÷©à÷¢à÷›à÷”à÷à÷†à÷à÷xà÷qà÷jà÷cà÷\à÷Uà÷Nà÷Gà÷@à÷9à÷2à÷+à÷$à÷à÷à÷à÷à÷à÷úß÷óß÷ìß÷åß÷Þß÷×ß÷Ðß÷Éß÷Âß÷»ß÷´ß÷­ß÷¦ß÷Ÿß÷˜ß÷‘ß÷Šß÷ƒß÷|ß÷uß÷nß÷gß÷`ß÷Yß÷Rß÷Kß÷Dß÷=ß÷6ß÷/ß÷(ß÷!ß÷ß÷ß÷ ß÷ß÷þÞ÷÷Þ÷ðÞ÷éÞ÷âÞ÷ÛÞ÷ÔÞ÷ÍÞ÷ÆÞ÷¿Þ÷¸Þ÷±Þ÷ªÞ÷£Þ÷œÞ÷•Þ÷ŽÞ÷‡Þ÷€Þ÷yÞ÷rÞ÷kÞ÷dÞ÷]Þ÷VÞ÷OÞ÷HÞ÷AÞ÷:Þ÷3Þ÷,Þ÷%Þ÷Þ÷Þ÷Þ÷ Þ÷Þ÷ûÝ÷ôÝ÷íÝ÷æÝ÷ßÝ÷ØÝ÷ÑÝ÷ÊÝ÷ÃÝ÷¼Ý÷µÝ÷®Ý÷§Ý÷ Ý÷™Ý÷’Ý÷‹Ý÷„Ý÷}Ý÷vÝ÷oÝ÷hÝ÷aÝ÷ZÝ÷SÝ÷LÝ÷EÝ÷>Ý÷7Ý÷0Ý÷)Ý÷"Ý÷Ý÷Ý÷ Ý÷Ý÷ÿÜ÷øÜ÷ñÜ÷êÜ÷ãÜ÷ÜÜ÷ÕÜ÷ÎÜ÷ÇÜ÷ÀÜ÷¹Ü÷²Ü÷«Ü÷¤Ü÷Ü÷–Ü÷Ü÷ˆÜ÷Ü÷zÜ÷sÜ÷lÜ÷eÜ÷^Ü÷WÜ÷PÜ÷IÜ÷BÜ÷;Ü÷4Ü÷-Ü÷&Ü÷Ü÷Ü÷Ü÷ Ü÷Ü÷üÛ÷õÛ÷îÛ÷çÛ÷àÛ÷ÙÛ÷ÒÛ÷ËÛ÷ÄÛ÷½Û÷¶Û÷¯Û÷¨Û÷¡Û÷šÛ÷“Û÷ŒÛ÷…Û÷~Û÷wÛ÷pÛ÷iÛ÷bÛ÷[Û÷TÛ÷MÛ÷FÛ÷?Û÷8Û÷1Û÷*Û÷#Û÷Û÷Û÷Û÷Û÷Û÷ùÚ÷òÚ÷ëÚ÷äÚ÷ÝÚ÷ÖÚ÷ÏÚ÷ÈÚ÷ÁÚ÷ºÚ÷³Ú÷¬Ú÷¥Ú÷žÚ÷—Ú÷Ú÷‰Ú÷‚Ú÷{Ú÷tÚ÷mÚ÷fÚ÷_Ú÷XÚ÷QÚ÷JÚ÷CÚ÷<Ú÷5Ú÷.Ú÷'Ú÷ Ú÷Ú÷Ú÷ Ú÷Ú÷ýÙ÷öÙ÷ïÙ÷èÙ÷áÙ÷ÚÙ÷ÓÙ÷ÌÙ÷ÅÙ÷¾Ù÷·Ù÷°Ù÷©Ù÷¢Ù÷›Ù÷”Ù÷Ù÷†Ù÷Ù÷xÙ÷qÙ÷jÙ÷cÙ÷\Ù÷UÙ÷NÙ÷GÙ÷@Ù÷9Ù÷2Ù÷+Ù÷$Ù÷Ù÷Ù÷Ù÷Ù÷Ù÷úØ÷óØ÷ìØ÷åØ÷ÞØ÷ר÷ÐØ÷ÉØ÷ÂØ÷»Ø÷´Ø÷­Ø÷¦Ø÷ŸØ÷˜Ø÷‘Ø÷ŠØ÷ƒØ÷|Ø÷uØ÷nØ÷gØ÷`Ø÷YØ÷RØ÷KØ÷DØ÷=Ø÷6Ø÷/Ø÷(Ø÷!Ø÷Ø÷Ø÷ Ø÷Ø÷þ×÷÷×÷ð×÷é×÷â×÷Û×÷Ô×÷Í×÷Æ×÷¿×÷¸×÷±×÷ª×÷£×÷œ×÷•×÷Ž×÷‡×÷€×÷y×÷r×÷k×÷d×÷]×÷V×÷O×÷H×÷A×÷:×÷3×÷,×÷%×÷×÷×÷×÷ ×÷×÷ûÖ÷ôÖ÷íÖ÷æÖ÷ßÖ÷ØÖ÷ÑÖ÷ÊÖ÷ÃÖ÷¼Ö÷µÖ÷®Ö÷§Ö÷ Ö÷™Ö÷’Ö÷‹Ö÷„Ö÷}Ö÷vÖ÷oÖ÷hÖ÷aÖ÷ZÖ÷SÖ÷LÖ÷EÖ÷>Ö÷7Ö÷0Ö÷)Ö÷"Ö÷Ö÷Ö÷ Ö÷Ö÷ÿÕ÷øÕ÷ñÕ÷êÕ÷ãÕ÷ÜÕ÷ÕÕ÷ÎÕ÷ÇÕ÷ÀÕ÷¹Õ÷²Õ÷«Õ÷¤Õ÷Õ÷–Õ÷Õ÷ˆÕ÷Õ÷zÕ÷sÕ÷lÕ÷eÕ÷^Õ÷WÕ÷PÕ÷IÕ÷BÕ÷;Õ÷4Õ÷-Õ÷&Õ÷Õ÷Õ÷Õ÷ Õ÷Õ÷üÔ÷õÔ÷îÔ÷çÔ÷àÔ÷ÙÔ÷ÒÔ÷ËÔ÷ÄÔ÷½Ô÷¶Ô÷¯Ô÷¨Ô÷¡Ô÷šÔ÷“Ô÷ŒÔ÷…Ô÷~Ô÷wÔ÷pÔ÷iÔ÷bÔ÷[Ô÷TÔ÷MÔ÷FÔ÷?Ô÷8Ô÷1Ô÷*Ô÷#Ô÷Ô÷Ô÷Ô÷Ô÷Ô÷ùÓ÷òÓ÷ëÓ÷äÓ÷ÝÓ÷ÖÓ÷ÏÓ÷ÈÓ÷ÁÓ÷ºÓ÷³Ó÷¬Ó÷¥Ó÷žÓ÷—Ó÷Ó÷‰Ó÷‚Ó÷{Ó÷tÓ÷mÓ÷fÓ÷_Ó÷XÓ÷QÓ÷JÓ÷CÓ÷<Ó÷5Ó÷.Ó÷'Ó÷ Ó÷Ó÷Ó÷ Ó÷Ó÷ýÒ÷öÒ÷ïÒ÷èÒ÷áÒ÷ÚÒ÷ÓÒ÷ÌÒ÷ÅÒ÷¾Ò÷·Ò÷°Ò÷©Ò÷¢Ò÷›Ò÷”Ò÷Ò÷†Ò÷Ò÷xÒ÷qÒ÷jÒ÷cÒ÷\Ò÷UÒ÷NÒ÷GÒ÷@Ò÷9Ò÷2Ò÷+Ò÷$Ò÷Ò÷Ò÷Ò÷Ò÷Ò÷úÑ÷óÑ÷ìÑ÷åÑ÷ÞÑ÷×Ñ÷ÐÑ÷ÉÑ÷ÂÑ÷»Ñ÷´Ñ÷­Ñ÷¦Ñ÷ŸÑ÷˜Ñ÷‘Ñ÷ŠÑ÷ƒÑ÷|Ñ÷uÑ÷nÑ÷gÑ÷`Ñ÷YÑ÷RÑ÷KÑ÷DÑ÷=Ñ÷6Ñ÷/Ñ÷(Ñ÷!Ñ÷Ñ÷Ñ÷ Ñ÷Ñ÷þÐ÷÷Ð÷ðÐ÷éÐ÷âÐ÷ÛÐ÷ÔÐ÷ÍÐ÷ÆÐ÷¿Ð÷¸Ð÷±Ð÷ªÐ÷£Ð÷œÐ÷•Ð÷ŽÐ÷‡Ð÷€Ð÷yÐ÷rÐ÷kÐ÷dÐ÷]Ð÷VÐ÷OÐ÷HÐ÷AÐ÷:Ð÷3Ð÷,Ð÷%Ð÷Ð÷Ð÷Ð÷ Ð÷Ð÷ûÏ÷ôÏ÷íÏ÷æÏ÷ßÏ÷ØÏ÷ÑÏ÷ÊÏ÷ÃÏ÷¼Ï÷µÏ÷®Ï÷§Ï÷ Ï÷™Ï÷’Ï÷‹Ï÷„Ï÷}Ï÷vÏ÷oÏ÷hÏ÷aÏ÷ZÏ÷SÏ÷LÏ÷EÏ÷>Ï÷7Ï÷0Ï÷)Ï÷"Ï÷Ï÷Ï÷ Ï÷Ï÷ÿÎ÷øÎ÷ñÎ÷êÎ÷ãÎ÷ÜÎ÷ÕÎ÷ÎÎ÷ÇÎ÷ÀÎ÷¹Î÷²Î÷«Î÷¤Î÷Î÷–Î÷Î÷ˆÎ÷Î÷zÎ÷sÎ÷lÎ÷eÎ÷^Î÷WÎ÷PÎ÷IÎ÷BÎ÷;Î÷4Î÷-Î÷&Î÷Î÷Î÷Î÷ Î÷Î÷üÍ÷õÍ÷îÍ÷çÍ÷àÍ÷ÙÍ÷ÒÍ÷ËÍ÷ÄÍ÷½Í÷¶Í÷¯Í÷¨Í÷¡Í÷šÍ÷“Í÷ŒÍ÷…Í÷~Í÷wÍ÷pÍ÷iÍ÷bÍ÷[Í÷TÍ÷MÍ÷FÍ÷?Í÷8Í÷1Í÷*Í÷#Í÷Í÷Í÷Í÷Í÷Í÷ùÌ÷òÌ÷ëÌ÷äÌ÷ÝÌ÷ÖÌ÷ÏÌ÷ÈÌ÷ÁÌ÷ºÌ÷³Ì÷¬Ì÷¥Ì÷žÌ÷—Ì÷Ì÷‰Ì÷‚Ì÷{Ì÷tÌ÷mÌ÷fÌ÷_Ì÷XÌ÷QÌ÷JÌ÷CÌ÷<Ì÷5Ì÷.Ì÷'Ì÷ Ì÷Ì÷Ì÷ Ì÷Ì÷ýË÷öË÷ïË÷èË÷áË÷ÚË÷ÓË÷ÌË÷ÅË÷¾Ë÷·Ë÷°Ë÷©Ë÷¢Ë÷›Ë÷”Ë÷Ë÷†Ë÷Ë÷xË÷qË÷jË÷cË÷\Ë÷UË÷NË÷GË÷@Ë÷9Ë÷2Ë÷+Ë÷$Ë÷Ë÷Ë÷Ë÷Ë÷Ë÷úÊ÷óÊ÷ìÊ÷åÊ÷ÞÊ÷×Ê÷ÐÊ÷ÉÊ÷ÂÊ÷»Ê÷´Ê÷­Ê÷¦Ê÷ŸÊ÷˜Ê÷‘Ê÷ŠÊ÷ƒÊ÷|Ê÷uÊ÷nÊ÷gÊ÷`Ê÷YÊ÷RÊ÷KÊ÷DÊ÷=Ê÷6Ê÷/Ê÷(Ê÷!Ê÷Ê÷Ê÷ Ê÷Ê÷þÉ÷÷É÷ðÉ÷éÉ÷âÉ÷ÛÉ÷ÔÉ÷ÍÉ÷ÆÉ÷¿É÷¸É÷±É÷ªÉ÷£É÷œÉ÷•É÷ŽÉ÷‡É÷€É÷yÉ÷rÉ÷kÉ÷dÉ÷]É÷VÉ÷OÉ÷HÉ÷AÉ÷:É÷3É÷,É÷%É÷É÷É÷É÷ É÷É÷ûÈ÷ôÈ÷íÈ÷æÈ÷ßÈ÷ØÈ÷ÑÈ÷ÊÈ÷ÃÈ÷¼È÷µÈ÷®È÷§È÷ È÷™È÷’È÷‹È÷„È÷}È÷vÈ÷oÈ÷hÈ÷aÈ÷ZÈ÷SÈ÷LÈ÷EÈ÷>È÷7È÷0È÷)È÷"È÷È÷È÷ È÷È÷ÿÇ÷øÇ÷ñÇ÷êÇ÷ãÇ÷ÜÇ÷ÕÇ÷ÎÇ÷ÇÇ÷ÀÇ÷¹Ç÷²Ç÷«Ç÷¤Ç÷Ç÷–Ç÷Ç÷ˆÇ÷Ç÷zÇ÷sÇ÷lÇ÷eÇ÷^Ç÷WÇ÷PÇ÷IÇ÷BÇ÷;Ç÷4Ç÷-Ç÷&Ç÷Ç÷Ç÷Ç÷ Ç÷Ç÷üÆ÷õÆ÷îÆ÷çÆ÷àÆ÷ÙÆ÷ÒÆ÷ËÆ÷ÄÆ÷½Æ÷¶Æ÷¯Æ÷¨Æ÷¡Æ÷šÆ÷“Æ÷ŒÆ÷…Æ÷~Æ÷wÆ÷pÆ÷iÆ÷bÆ÷[Æ÷TÆ÷MÆ÷FÆ÷?Æ÷8Æ÷1Æ÷*Æ÷#Æ÷Æ÷Æ÷Æ÷Æ÷Æ÷ùÅ÷òÅ÷ëÅ÷äÅ÷ÝÅ÷ÖÅ÷ÏÅ÷ÈÅ÷ÁÅ÷ºÅ÷³Å÷¬Å÷¥Å÷žÅ÷—Å÷Å÷‰Å÷‚Å÷{Å÷tÅ÷mÅ÷fÅ÷_Å÷XÅ÷QÅ÷JÅ÷CÅ÷<Å÷5Å÷.Å÷'Å÷ Å÷Å÷Å÷ Å÷Å÷ýÄ÷öÄ÷ïÄ÷èÄ÷áÄ÷ÚÄ÷ÓÄ÷ÌÄ÷ÅÄ÷¾Ä÷·Ä÷°Ä÷©Ä÷¢Ä÷›Ä÷”Ä÷Ä÷†Ä÷Ä÷xÄ÷qÄ÷jÄ÷cÄ÷\Ä÷UÄ÷NÄ÷GÄ÷@Ä÷9Ä÷2Ä÷+Ä÷$Ä÷Ä÷Ä÷Ä÷Ä÷Ä÷úÃ÷óÃ÷ìÃ÷åÃ÷ÞÃ÷×Ã÷ÐÃ÷ÉÃ÷ÂÃ÷»Ã÷´Ã÷­Ã÷¦Ã÷ŸÃ÷˜Ã÷‘Ã÷ŠÃ÷ƒÃ÷|Ã÷uÃ÷nÃ÷gÃ÷`Ã÷YÃ÷RÃ÷KÃ÷DÃ÷=Ã÷6Ã÷/Ã÷(Ã÷!Ã÷Ã÷Ã÷ Ã÷Ã÷þÂ÷÷Â÷ðÂ÷éÂ÷âÂ÷ÛÂ÷ÔÂ÷ÍÂ÷ÆÂ÷¿Â÷¸Â÷±Â÷ªÂ÷£Â÷œÂ÷•Â÷ŽÂ÷‡Â÷€Â÷yÂ÷rÂ÷kÂ÷dÂ÷]Â÷VÂ÷OÂ÷HÂ÷AÂ÷:Â÷3Â÷,Â÷%Â÷Â÷Â÷Â÷ Â÷Â÷ûÁ÷ôÁ÷íÁ÷æÁ÷ßÁ÷ØÁ÷ÑÁ÷ÊÁ÷ÃÁ÷¼Á÷µÁ÷®Á÷§Á÷ Á÷™Á÷’Á÷‹Á÷„Á÷}Á÷vÁ÷oÁ÷hÁ÷aÁ÷ZÁ÷SÁ÷LÁ÷EÁ÷>Á÷7Á÷0Á÷)Á÷"Á÷Á÷Á÷ Á÷Á÷ÿÀ÷øÀ÷ñÀ÷êÀ÷ãÀ÷ÜÀ÷ÕÀ÷ÎÀ÷ÇÀ÷ÀÀ÷¹À÷²À÷«À÷¤À÷À÷–À÷À÷ˆÀ÷À÷zÀ÷sÀ÷lÀ÷eÀ÷^À÷WÀ÷PÀ÷IÀ÷BÀ÷;À÷4À÷-À÷&À÷À÷À÷À÷ À÷À÷ü¿÷õ¿÷î¿÷ç¿÷à¿÷Ù¿÷Ò¿÷Ë¿÷Ä¿÷½¿÷¶¿÷¯¿÷¨¿÷¡¿÷š¿÷“¿÷Œ¿÷…¿÷~¿÷w¿÷p¿÷i¿÷b¿÷[¿÷T¿÷M¿÷F¿÷?¿÷8¿÷1¿÷*¿÷#¿÷¿÷¿÷¿÷¿÷¿÷ù¾÷ò¾÷ë¾÷ä¾÷ݾ÷Ö¾÷Ͼ÷Ⱦ÷Á¾÷º¾÷³¾÷¬¾÷¥¾÷ž¾÷—¾÷¾÷‰¾÷‚¾÷{¾÷t¾÷m¾÷f¾÷_¾÷X¾÷Q¾÷J¾÷C¾÷<¾÷5¾÷.¾÷'¾÷ ¾÷¾÷¾÷ ¾÷¾÷ý½÷ö½÷ï½÷è½÷á½÷Ú½÷Ó½÷̽÷Ž÷¾½÷·½÷°½÷©½÷¢½÷›½÷”½÷½÷†½÷½÷x½÷q½÷j½÷c½÷\½÷U½÷N½÷G½÷@½÷9½÷2½÷+½÷$½÷½÷½÷½÷½÷½÷ú¼÷ó¼÷ì¼÷å¼÷Þ¼÷×¼÷м÷ɼ÷¼÷»¼÷´¼÷­¼÷¦¼÷Ÿ¼÷˜¼÷‘¼÷м÷ƒ¼÷|¼÷u¼÷n¼÷g¼÷`¼÷Y¼÷R¼÷K¼÷D¼÷=¼÷6¼÷/¼÷(¼÷!¼÷¼÷¼÷ ¼÷¼÷þ»÷÷»÷ð»÷é»÷â»÷Û»÷Ô»÷Í»÷Æ»÷¿»÷¸»÷±»÷ª»÷£»÷œ»÷•»÷Ž»÷‡»÷€»÷y»÷r»÷k»÷d»÷]»÷V»÷O»÷H»÷A»÷:»÷3»÷,»÷%»÷»÷»÷»÷ »÷»÷ûº÷ôº÷íº÷æº÷ߺ÷غ÷Ѻ÷ʺ÷ú÷¼º÷µº÷®º÷§º÷ º÷™º÷’º÷‹º÷„º÷}º÷vº÷oº÷hº÷aº÷Zº÷Sº÷Lº÷Eº÷>º÷7º÷0º÷)º÷"º÷º÷º÷ º÷º÷ÿ¹÷ø¹÷ñ¹÷ê¹÷ã¹÷ܹ÷Õ¹÷ι÷ǹ÷À¹÷¹¹÷²¹÷«¹÷¤¹÷¹÷–¹÷¹÷ˆ¹÷¹÷z¹÷s¹÷l¹÷e¹÷^¹÷W¹÷P¹÷I¹÷B¹÷;¹÷4¹÷-¹÷&¹÷¹÷¹÷¹÷ ¹÷¹÷ü¸÷õ¸÷î¸÷ç¸÷à¸÷Ù¸÷Ò¸÷˸÷ĸ÷½¸÷¶¸÷¯¸÷¨¸÷¡¸÷š¸÷“¸÷Œ¸÷…¸÷~¸÷w¸÷p¸÷i¸÷b¸÷[¸÷T¸÷M¸÷F¸÷?¸÷8¸÷1¸÷*¸÷#¸÷¸÷¸÷¸÷¸÷¸÷ù·÷ò·÷ë·÷ä·÷Ý·÷Ö·÷Ï·÷È·÷Á·÷º·÷³·÷¬·÷¥·÷ž·÷—·÷·÷‰·÷‚·÷{·÷t·÷m·÷f·÷_·÷X·÷Q·÷J·÷C·÷<·÷5·÷.·÷'·÷ ·÷·÷·÷ ·÷·÷ý¶÷ö¶÷ï¶÷è¶÷á¶÷Ú¶÷Ó¶÷̶÷Ŷ÷¾¶÷·¶÷°¶÷©¶÷¢¶÷›¶÷”¶÷¶÷†¶÷¶÷x¶÷q¶÷j¶÷c¶÷\¶÷U¶÷N¶÷G¶÷@¶÷9¶÷2¶÷+¶÷$¶÷¶÷¶÷¶÷¶÷¶÷úµ÷óµ÷ìµ÷åµ÷Þµ÷×µ÷е÷ɵ÷µ÷»µ÷´µ÷­µ÷¦µ÷Ÿµ÷˜µ÷‘µ÷е÷ƒµ÷|µ÷uµ÷nµ÷gµ÷`µ÷Yµ÷Rµ÷Kµ÷Dµ÷=µ÷6µ÷/µ÷(µ÷!µ÷µ÷µ÷ µ÷µ÷þ´÷÷´÷ð´÷é´÷â´÷Û´÷Ô´÷Í´÷Æ´÷¿´÷¸´÷±´÷ª´÷£´÷œ´÷•´÷Ž´÷‡´÷€´÷y´÷r´÷k´÷d´÷]´÷V´÷O´÷H´÷A´÷:´÷3´÷,´÷%´÷´÷´÷´÷ ´÷´÷û³÷ô³÷í³÷æ³÷ß³÷س÷ѳ÷ʳ÷ó÷¼³÷µ³÷®³÷§³÷ ³÷™³÷’³÷‹³÷„³÷}³÷v³÷o³÷h³÷a³÷Z³÷S³÷L³÷E³÷>³÷7³÷0³÷)³÷"³÷³÷³÷ ³÷³÷ÿ²÷ø²÷ñ²÷ê²÷ã²÷ܲ÷Õ²÷β÷Dz÷À²÷¹²÷²²÷«²÷¤²÷²÷–²÷²÷ˆ²÷²÷z²÷s²÷l²÷e²÷^²÷W²÷P²÷I²÷B²÷;²÷4²÷-²÷&²÷²÷²÷²÷ ²÷²÷ü±÷õ±÷î±÷ç±÷à±÷Ù±÷Ò±÷˱÷ı÷½±÷¶±÷¯±÷¨±÷¡±÷š±÷“±÷Œ±÷…±÷~±÷w±÷p±÷i±÷b±÷[±÷T±÷M±÷F±÷?±÷8±÷1±÷*±÷#±÷±÷±÷±÷±÷±÷ù°÷ò°÷ë°÷ä°÷ݰ÷Ö°÷ϰ÷Ȱ÷Á°÷º°÷³°÷¬°÷¥°÷ž°÷—°÷°÷‰°÷‚°÷{°÷t°÷m°÷f°÷_°÷X°÷Q°÷J°÷C°÷<°÷5°÷.°÷'°÷ °÷°÷°÷ °÷°÷ý¯÷ö¯÷ï¯÷è¯÷á¯÷Ú¯÷Ó¯÷̯÷ů÷¾¯÷·¯÷°¯÷©¯÷¢¯÷›¯÷”¯÷¯÷†¯÷¯÷x¯÷q¯÷j¯÷c¯÷\¯÷U¯÷N¯÷G¯÷@¯÷9¯÷2¯÷+¯÷$¯÷¯÷¯÷¯÷¯÷¯÷ú®÷ó®÷ì®÷å®÷Þ®÷×®÷Ю÷É®÷®÷»®÷´®÷­®÷¦®÷Ÿ®÷˜®÷‘®÷Š®÷ƒ®÷|®÷u®÷n®÷g®÷`®÷Y®÷R®÷K®÷D®÷=®÷6®÷/®÷(®÷!®÷®÷®÷ ®÷®÷þ­÷÷­÷ð­÷é­÷â­÷Û­÷Ô­÷Í­÷Æ­÷¿­÷¸­÷±­÷ª­÷£­÷œ­÷•­÷Ž­÷‡­÷€­÷y­÷r­÷k­÷d­÷]­÷V­÷O­÷H­÷A­÷:­÷3­÷,­÷%­÷­÷­÷­÷ ­÷­÷û¬÷ô¬÷í¬÷æ¬÷߬÷ج÷Ѭ÷ʬ÷ì÷¼¬÷µ¬÷®¬÷§¬÷ ¬÷™¬÷’¬÷‹¬÷„¬÷}¬÷v¬÷o¬÷h¬÷a¬÷Z¬÷S¬÷L¬÷E¬÷>¬÷7¬÷0¬÷)¬÷"¬÷¬÷¬÷ ¬÷¬÷ÿ«÷ø«÷ñ«÷ê«÷ã«÷Ü«÷Õ«÷Ϋ÷Ç«÷À«÷¹«÷²«÷««÷¤«÷«÷–«÷«÷ˆ«÷«÷z«÷s«÷l«÷e«÷^«÷W«÷P«÷I«÷B«÷;«÷4«÷-«÷&«÷«÷«÷«÷ «÷«÷üª÷õª÷îª÷çª÷àª÷Ùª÷Òª÷˪÷Ī÷½ª÷¶ª÷¯ª÷¨ª÷¡ª÷šª÷“ª÷Œª÷…ª÷~ª÷wª÷pª÷iª÷bª÷[ª÷Tª÷Mª÷Fª÷?ª÷8ª÷1ª÷*ª÷#ª÷ª÷ª÷ª÷ª÷ª÷ù©÷ò©÷ë©÷ä©÷Ý©÷Ö©÷Ï©÷È©÷Á©÷º©÷³©÷¬©÷¥©÷ž©÷—©÷©÷‰©÷‚©÷{©÷t©÷m©÷f©÷_©÷X©÷Q©÷J©÷C©÷<©÷5©÷.©÷'©÷ ©÷©÷©÷ ©÷©÷ý¨÷ö¨÷ï¨÷è¨÷á¨÷Ú¨÷Ó¨÷̨÷Ũ÷¾¨÷·¨÷°¨÷©¨÷¢¨÷›¨÷”¨÷¨÷†¨÷¨÷x¨÷q¨÷j¨÷c¨÷\¨÷U¨÷N¨÷G¨÷@¨÷9¨÷2¨÷+¨÷$¨÷¨÷¨÷¨÷¨÷¨÷ú§÷ó§÷ì§÷å§÷Þ§÷×§÷Ч÷ɧ÷§÷»§÷´§÷­§÷¦§÷Ÿ§÷˜§÷‘§÷Ч÷ƒ§÷|§÷u§÷n§÷g§÷`§÷Y§÷R§÷K§÷D§÷=§÷6§÷/§÷(§÷!§÷§÷§÷ §÷§÷þ¦÷÷¦÷ð¦÷é¦÷â¦÷Û¦÷Ô¦÷ͦ÷Ʀ÷¿¦÷¸¦÷±¦÷ª¦÷£¦÷œ¦÷•¦÷ަ÷‡¦÷€¦÷y¦÷r¦÷k¦÷d¦÷]¦÷V¦÷O¦÷H¦÷A¦÷:¦÷3¦÷,¦÷%¦÷¦÷¦÷¦÷ ¦÷¦÷û¥÷ô¥÷í¥÷æ¥÷ߥ÷Ø¥÷Ñ¥÷Ê¥÷Ã¥÷¼¥÷µ¥÷®¥÷§¥÷ ¥÷™¥÷’¥÷‹¥÷„¥÷}¥÷v¥÷o¥÷h¥÷a¥÷Z¥÷S¥÷L¥÷E¥÷>¥÷7¥÷0¥÷)¥÷"¥÷¥÷¥÷ ¥÷¥÷ÿ¤÷ø¤÷ñ¤÷ê¤÷ã¤÷ܤ÷Õ¤÷Τ÷Ǥ÷À¤÷¹¤÷²¤÷«¤÷¤¤÷¤÷–¤÷¤÷ˆ¤÷¤÷z¤÷s¤÷l¤÷e¤÷^¤÷W¤÷P¤÷I¤÷B¤÷;¤÷4¤÷-¤÷&¤÷¤÷¤÷¤÷ ¤÷¤÷ü£÷õ£÷î£÷ç£÷à£÷Ù£÷Ò£÷Ë£÷Ä£÷½£÷¶£÷¯£÷¨£÷¡£÷š£÷“£÷Œ£÷…£÷~£÷w£÷p£÷i£÷b£÷[£÷T£÷M£÷F£÷?£÷8£÷1£÷*£÷#£÷£÷£÷£÷£÷£÷ù¢÷ò¢÷ë¢÷ä¢÷Ý¢÷Ö¢÷Ï¢÷È¢÷Á¢÷º¢÷³¢÷¬¢÷¥¢÷ž¢÷—¢÷¢÷‰¢÷‚¢÷{¢÷t¢÷m¢÷f¢÷_¢÷X¢÷Q¢÷J¢÷C¢÷<¢÷5¢÷.¢÷'¢÷ ¢÷¢÷¢÷ ¢÷¢÷ý¡÷ö¡÷ï¡÷è¡÷á¡÷Ú¡÷Ó¡÷Ì¡÷Å¡÷¾¡÷·¡÷°¡÷©¡÷¢¡÷›¡÷”¡÷¡÷†¡÷¡÷x¡÷q¡÷j¡÷c¡÷\¡÷U¡÷N¡÷G¡÷@¡÷9¡÷2¡÷+¡÷$¡÷¡÷¡÷¡÷¡÷¡÷ú ÷ó ÷ì ÷å ÷Þ ÷× ÷Р÷É ÷ ÷» ÷´ ÷­ ÷¦ ÷Ÿ ÷˜ ÷‘ ÷Š ÷ƒ ÷| ÷u ÷n ÷g ÷` ÷Y ÷R ÷K ÷D ÷= ÷6 ÷/ ÷( ÷! ÷ ÷ ÷  ÷ ÷þŸ÷÷Ÿ÷ðŸ÷éŸ÷âŸ÷ÛŸ÷ÔŸ÷ÍŸ÷ÆŸ÷¿Ÿ÷¸Ÿ÷±Ÿ÷ªŸ÷£Ÿ÷œŸ÷•Ÿ÷ŽŸ÷‡Ÿ÷€Ÿ÷yŸ÷rŸ÷kŸ÷dŸ÷]Ÿ÷VŸ÷OŸ÷HŸ÷AŸ÷:Ÿ÷3Ÿ÷,Ÿ÷%Ÿ÷Ÿ÷Ÿ÷Ÿ÷ Ÿ÷Ÿ÷ûž÷ôž÷íž÷æž÷ßž÷Øž÷Ñž÷Êž÷Þ÷¼ž÷µž÷®ž÷§ž÷ ž÷™ž÷’ž÷‹ž÷„ž÷}ž÷vž÷ož÷hž÷až÷Zž÷Sž÷Lž÷Ež÷>ž÷7ž÷0ž÷)ž÷"ž÷ž÷ž÷ ž÷ž÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üœ÷õœ÷îœ÷çœ÷àœ÷Ùœ÷Òœ÷Ëœ÷Äœ÷½œ÷¶œ÷¯œ÷¨œ÷¡œ÷šœ÷“œ÷Œœ÷…œ÷~œ÷wœ÷pœ÷iœ÷bœ÷[œ÷Tœ÷Mœ÷Fœ÷?œ÷8œ÷1œ÷*œ÷#œ÷œ÷œ÷œ÷œ÷œ÷ù›÷ò›÷ë›÷ä›÷Ý›÷Ö›÷Ï›÷È›÷Á›÷º›÷³›÷¬›÷¥›÷ž›÷—›÷›÷‰›÷‚›÷{›÷t›÷m›÷f›÷_›÷X›÷Q›÷J›÷C›÷<›÷5›÷.›÷'›÷ ›÷›÷›÷ ›÷›÷ýš÷öš÷ïš÷èš÷áš÷Úš÷Óš÷Ìš÷Åš÷¾š÷·š÷°š÷©š÷¢š÷›š÷”š÷š÷†š÷š÷xš÷qš÷jš÷cš÷\š÷Uš÷Nš÷Gš÷@š÷9š÷2š÷+š÷$š÷š÷š÷š÷š÷š÷ú™÷ó™÷ì™÷å™÷Þ™÷×™÷Й÷É™÷™÷»™÷´™÷­™÷¦™÷Ÿ™÷˜™÷‘™÷Š™÷ƒ™÷|™÷u™÷n™÷g™÷`™÷Y™÷R™÷K™÷D™÷=™÷6™÷/™÷(™÷!™÷™÷™÷ ™÷™÷þ˜÷÷˜÷ð˜÷é˜÷â˜÷Û˜÷Ô˜÷͘÷Ƙ÷¿˜÷¸˜÷±˜÷ª˜÷£˜÷œ˜÷•˜÷Ž˜÷‡˜÷€˜÷y˜÷r˜÷k˜÷d˜÷]˜÷V˜÷O˜÷H˜÷A˜÷:˜÷3˜÷,˜÷%˜÷˜÷˜÷˜÷ ˜÷˜÷û—÷ô—÷í—÷æ—÷ß—÷Ø—÷Ñ—÷Ê—÷×÷¼—÷µ—÷®—÷§—÷ —÷™—÷’—÷‹—÷„—÷}—÷v—÷o—÷h—÷a—÷Z—÷S—÷L—÷E—÷>—÷7—÷0—÷)—÷"—÷—÷—÷ —÷—÷ÿ–÷ø–÷ñ–÷ê–÷ã–÷Ü–÷Õ–÷Ζ÷Ç–÷À–÷¹–÷²–÷«–÷¤–÷–÷––÷–÷ˆ–÷–÷z–÷s–÷l–÷e–÷^–÷W–÷P–÷I–÷B–÷;–÷4–÷-–÷&–÷–÷–÷–÷ –÷–÷ü•÷õ•÷î•÷ç•÷à•÷Ù•÷Ò•÷Ë•÷Ä•÷½•÷¶•÷¯•÷¨•÷¡•÷š•÷“•÷Œ•÷…•÷~•÷w•÷p•÷i•÷b•÷[•÷T•÷M•÷F•÷?•÷8•÷1•÷*•÷#•÷•÷•÷•÷•÷•÷ù”÷ò”÷ë”÷ä”÷Ý”÷Ö”÷Ï”÷È”÷Á”÷º”÷³”÷¬”÷¥”÷ž”÷—”÷”÷‰”÷‚”÷{”÷t”÷m”÷f”÷_”÷X”÷Q”÷J”÷C”÷<”÷5”÷.”÷'”÷ ”÷”÷”÷ ”÷”÷ý“÷ö“÷ï“÷è“÷á“÷Ú“÷Ó“÷Ì“÷Å“÷¾“÷·“÷°“÷©“÷¢“÷›“÷”“÷“÷†“÷“÷x“÷q“÷j“÷c“÷\“÷U“÷N“÷G“÷@“÷9“÷2“÷+“÷$“÷“÷“÷“÷“÷“÷ú’÷ó’÷ì’÷å’÷Þ’÷×’÷Ð’÷É’÷Â’÷»’÷´’÷­’÷¦’÷Ÿ’÷˜’÷‘’÷Š’÷ƒ’÷|’÷u’÷n’÷g’÷`’÷Y’÷R’÷K’÷D’÷=’÷6’÷/’÷(’÷!’÷’÷’÷ ’÷’÷þ‘÷÷‘÷ð‘÷é‘÷â‘÷Û‘÷Ô‘÷Í‘÷Æ‘÷¿‘÷¸‘÷±‘÷ª‘÷£‘÷œ‘÷•‘÷Ž‘÷‡‘÷€‘÷y‘÷r‘÷k‘÷d‘÷]‘÷V‘÷O‘÷H‘÷A‘÷:‘÷3‘÷,‘÷%‘÷‘÷‘÷‘÷ ‘÷‘÷û÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üŽ÷õŽ÷îŽ÷çŽ÷àŽ÷ÙŽ÷ÒŽ÷ËŽ÷ÄŽ÷½Ž÷¶Ž÷¯Ž÷¨Ž÷¡Ž÷šŽ÷“Ž÷ŒŽ÷…Ž÷~Ž÷wŽ÷pŽ÷iŽ÷bŽ÷[Ž÷TŽ÷MŽ÷FŽ÷?Ž÷8Ž÷1Ž÷*Ž÷#Ž÷Ž÷Ž÷Ž÷Ž÷Ž÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýŒ÷öŒ÷ïŒ÷èŒ÷áŒ÷ÚŒ÷ÓŒ÷ÌŒ÷ÅŒ÷¾Œ÷·Œ÷°Œ÷©Œ÷¢Œ÷›Œ÷”Œ÷Œ÷†Œ÷Œ÷xŒ÷qŒ÷jŒ÷cŒ÷\Œ÷UŒ÷NŒ÷GŒ÷@Œ÷9Œ÷2Œ÷+Œ÷$Œ÷Œ÷Œ÷Œ÷Œ÷Œ÷ú‹÷ó‹÷ì‹÷å‹÷Þ‹÷׋÷Ћ÷É‹÷‹÷»‹÷´‹÷­‹÷¦‹÷Ÿ‹÷˜‹÷‘‹÷Š‹÷ƒ‹÷|‹÷u‹÷n‹÷g‹÷`‹÷Y‹÷R‹÷K‹÷D‹÷=‹÷6‹÷/‹÷(‹÷!‹÷‹÷‹÷ ‹÷‹÷þŠ÷÷Š÷ðŠ÷éŠ÷âŠ÷ÛŠ÷ÔŠ÷ÍŠ÷ÆŠ÷¿Š÷¸Š÷±Š÷ªŠ÷£Š÷œŠ÷•Š÷ŽŠ÷‡Š÷€Š÷yŠ÷rŠ÷kŠ÷dŠ÷]Š÷VŠ÷OŠ÷HŠ÷AŠ÷:Š÷3Š÷,Š÷%Š÷Š÷Š÷Š÷ Š÷Š÷û‰÷ô‰÷í‰÷æ‰÷߉÷؉÷щ÷ʉ÷É÷¼‰÷µ‰÷®‰÷§‰÷ ‰÷™‰÷’‰÷‹‰÷„‰÷}‰÷v‰÷o‰÷h‰÷a‰÷Z‰÷S‰÷L‰÷E‰÷>‰÷7‰÷0‰÷)‰÷"‰÷‰÷‰÷ ‰÷‰÷ÿˆ÷øˆ÷ñˆ÷êˆ÷ãˆ÷܈÷Õˆ÷Έ÷Lj÷Àˆ÷¹ˆ÷²ˆ÷«ˆ÷¤ˆ÷ˆ÷–ˆ÷ˆ÷ˆˆ÷ˆ÷zˆ÷sˆ÷lˆ÷eˆ÷^ˆ÷Wˆ÷Pˆ÷Iˆ÷Bˆ÷;ˆ÷4ˆ÷-ˆ÷&ˆ÷ˆ÷ˆ÷ˆ÷ ˆ÷ˆ÷ü‡÷õ‡÷î‡÷ç‡÷à‡÷Ù‡÷Ò‡÷ˇ÷ć÷½‡÷¶‡÷¯‡÷¨‡÷¡‡÷š‡÷“‡÷Œ‡÷…‡÷~‡÷w‡÷p‡÷i‡÷b‡÷[‡÷T‡÷M‡÷F‡÷?‡÷8‡÷1‡÷*‡÷#‡÷‡÷‡÷‡÷‡÷‡÷ù†÷ò†÷ë†÷ä†÷݆÷Ö†÷φ÷Ȇ÷Á†÷º†÷³†÷¬†÷¥†÷ž†÷—†÷†÷‰†÷‚†÷{†÷t†÷m†÷f†÷_†÷X†÷Q†÷J†÷C†÷<†÷5†÷.†÷'†÷ †÷†÷†÷ †÷†÷ý…÷ö…÷ï…÷è…÷á…÷Ú…÷Ó…÷Ì…÷Å…÷¾…÷·…÷°…÷©…÷¢…÷›…÷”…÷…÷†…÷…÷x…÷q…÷j…÷c…÷\…÷U…÷N…÷G…÷@…÷9…÷2…÷+…÷$…÷…÷…÷…÷…÷…÷ú„÷ó„÷ì„÷å„÷Þ„÷ׄ÷Є÷É„÷„÷»„÷´„÷­„÷¦„÷Ÿ„÷˜„÷‘„÷Š„÷ƒ„÷|„÷u„÷n„÷g„÷`„÷Y„÷R„÷K„÷D„÷=„÷6„÷/„÷(„÷!„÷„÷„÷ „÷„÷þƒ÷÷ƒ÷ðƒ÷éƒ÷âƒ÷Ûƒ÷Ôƒ÷̓÷ƃ÷¿ƒ÷¸ƒ÷±ƒ÷ªƒ÷£ƒ÷œƒ÷•ƒ÷Žƒ÷‡ƒ÷€ƒ÷yƒ÷rƒ÷kƒ÷dƒ÷]ƒ÷Vƒ÷Oƒ÷Hƒ÷Aƒ÷:ƒ÷3ƒ÷,ƒ÷%ƒ÷ƒ÷ƒ÷ƒ÷ ƒ÷ƒ÷û‚÷ô‚÷í‚÷æ‚÷ß‚÷Ø‚÷Ñ‚÷Ê‚÷Â÷¼‚÷µ‚÷®‚÷§‚÷ ‚÷™‚÷’‚÷‹‚÷„‚÷}‚÷v‚÷o‚÷h‚÷a‚÷Z‚÷S‚÷L‚÷E‚÷>‚÷7‚÷0‚÷)‚÷"‚÷‚÷‚÷ ‚÷‚÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷ü€÷õ€÷î€÷ç€÷à€÷Ù€÷Ò€÷Ë€÷Ä€÷½€÷¶€÷¯€÷¨€÷¡€÷š€÷“€÷Œ€÷…€÷~€÷w€÷p€÷i€÷b€÷[€÷T€÷M€÷F€÷?€÷8€÷1€÷*€÷#€÷€÷€÷€÷€÷€÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý~÷ö~÷ï~÷è~÷á~÷Ú~÷Ó~÷Ì~÷Å~÷¾~÷·~÷°~÷©~÷¢~÷›~÷”~÷~÷†~÷~÷x~÷q~÷j~÷c~÷\~÷U~÷N~÷G~÷@~÷9~÷2~÷+~÷$~÷~÷~÷~÷~÷~÷ú}÷ó}÷ì}÷å}÷Þ}÷×}÷Ð}÷É}÷Â}÷»}÷´}÷­}÷¦}÷Ÿ}÷˜}÷‘}÷Š}÷ƒ}÷|}÷u}÷n}÷g}÷`}÷Y}÷R}÷K}÷D}÷=}÷6}÷/}÷(}÷!}÷}÷}÷ }÷}÷þ|÷÷|÷ð|÷é|÷â|÷Û|÷Ô|÷Í|÷Æ|÷¿|÷¸|÷±|÷ª|÷£|÷œ|÷•|÷Ž|÷‡|÷€|÷y|÷r|÷k|÷d|÷]|÷V|÷O|÷H|÷A|÷:|÷3|÷,|÷%|÷|÷|÷|÷ |÷|÷û{÷ô{÷í{÷æ{÷ß{÷Ø{÷Ñ{÷Ê{÷Ã{÷¼{÷µ{÷®{÷§{÷ {÷™{÷’{÷‹{÷„{÷}{÷v{÷o{÷h{÷a{÷Z{÷S{÷L{÷E{÷>{÷7{÷0{÷){÷"{÷{÷{÷ {÷{÷ÿz÷øz÷ñz÷êz÷ãz÷Üz÷Õz÷Îz÷Çz÷Àz÷¹z÷²z÷«z÷¤z÷z÷–z÷z÷ˆz÷z÷zz÷sz÷lz÷ez÷^z÷Wz÷Pz÷Iz÷Bz÷;z÷4z÷-z÷&z÷z÷z÷z÷ z÷z÷üy÷õy÷îy÷çy÷ày÷Ùy÷Òy÷Ëy÷Äy÷½y÷¶y÷¯y÷¨y÷¡y÷šy÷“y÷Œy÷…y÷~y÷wy÷py÷iy÷by÷[y÷Ty÷My÷Fy÷?y÷8y÷1y÷*y÷#y÷y÷y÷y÷y÷y÷ùx÷òx÷ëx÷äx÷Ýx÷Öx÷Ïx÷Èx÷Áx÷ºx÷³x÷¬x÷¥x÷žx÷—x÷x÷‰x÷‚x÷{x÷tx÷mx÷fx÷_x÷Xx÷Qx÷Jx÷Cx÷t÷7t÷0t÷)t÷"t÷t÷t÷ t÷t÷ÿs÷øs÷ñs÷ês÷ãs÷Üs÷Õs÷Îs÷Çs÷Às÷¹s÷²s÷«s÷¤s÷s÷–s÷s÷ˆs÷s÷zs÷ss÷ls÷es÷^s÷Ws÷Ps÷Is÷Bs÷;s÷4s÷-s÷&s÷s÷s÷s÷ s÷s÷ür÷õr÷îr÷çr÷àr÷Ùr÷Òr÷Ër÷Är÷½r÷¶r÷¯r÷¨r÷¡r÷šr÷“r÷Œr÷…r÷~r÷wr÷pr÷ir÷br÷[r÷Tr÷Mr÷Fr÷?r÷8r÷1r÷*r÷#r÷r÷r÷r÷r÷r÷ùq÷òq÷ëq÷äq÷Ýq÷Öq÷Ïq÷Èq÷Áq÷ºq÷³q÷¬q÷¥q÷žq÷—q÷q÷‰q÷‚q÷{q÷tq÷mq÷fq÷_q÷Xq÷Qq÷Jq÷Cq÷m÷7m÷0m÷)m÷"m÷m÷m÷ m÷m÷ÿl÷øl÷ñl÷êl÷ãl÷Ül÷Õl÷Îl÷Çl÷Àl÷¹l÷²l÷«l÷¤l÷l÷–l÷l÷ˆl÷l÷zl÷sl÷ll÷el÷^l÷Wl÷Pl÷Il÷Bl÷;l÷4l÷-l÷&l÷l÷l÷l÷ l÷l÷ük÷õk÷îk÷çk÷àk÷Ùk÷Òk÷Ëk÷Äk÷½k÷¶k÷¯k÷¨k÷¡k÷šk÷“k÷Œk÷…k÷~k÷wk÷pk÷ik÷bk÷[k÷Tk÷Mk÷Fk÷?k÷8k÷1k÷*k÷#k÷k÷k÷k÷k÷k÷ùj÷òj÷ëj÷äj÷Ýj÷Öj÷Ïj÷Èj÷Áj÷ºj÷³j÷¬j÷¥j÷žj÷—j÷j÷‰j÷‚j÷{j÷tj÷mj÷fj÷_j÷Xj÷Qj÷Jj÷Cj÷f÷7f÷0f÷)f÷"f÷f÷f÷ f÷f÷ÿe÷øe÷ñe÷êe÷ãe÷Üe÷Õe÷Îe÷Çe÷Àe÷¹e÷²e÷«e÷¤e÷e÷–e÷e÷ˆe÷e÷ze÷se÷le÷ee÷^e÷We÷Pe÷Ie÷Be÷;e÷4e÷-e÷&e÷e÷e÷e÷ e÷e÷üd÷õd÷îd÷çd÷àd÷Ùd÷Òd÷Ëd÷Äd÷½d÷¶d÷¯d÷¨d÷¡d÷šd÷“d÷Œd÷…d÷~d÷wd÷pd÷id÷bd÷[d÷Td÷Md÷Fd÷?d÷8d÷1d÷*d÷#d÷d÷d÷d÷d÷d÷ùc÷òc÷ëc÷äc÷Ýc÷Öc÷Ïc÷Èc÷Ác÷ºc÷³c÷¬c÷¥c÷žc÷—c÷c÷‰c÷‚c÷{c÷tc÷mc÷fc÷_c÷Xc÷Qc÷Jc÷Cc÷_÷7_÷0_÷)_÷"_÷_÷_÷ _÷_÷ÿ^÷ø^÷ñ^÷ê^÷ã^÷Ü^÷Õ^÷Î^÷Ç^÷À^÷¹^÷²^÷«^÷¤^÷^÷–^÷^÷ˆ^÷^÷z^÷s^÷l^÷e^÷^^÷W^÷P^÷I^÷B^÷;^÷4^÷-^÷&^÷^÷^÷^÷ ^÷^÷ü]÷õ]÷î]÷ç]÷à]÷Ù]÷Ò]÷Ë]÷Ä]÷½]÷¶]÷¯]÷¨]÷¡]÷š]÷“]÷Œ]÷…]÷~]÷w]÷p]÷i]÷b]÷[]÷T]÷M]÷F]÷?]÷8]÷1]÷*]÷#]÷]÷]÷]÷]÷]÷ù\÷ò\÷ë\÷ä\÷Ý\÷Ö\÷Ï\÷È\÷Á\÷º\÷³\÷¬\÷¥\÷ž\÷—\÷\÷‰\÷‚\÷{\÷t\÷m\÷f\÷_\÷X\÷Q\÷J\÷C\÷<\÷5\÷.\÷'\÷ \÷\÷\÷ \÷\÷ý[÷ö[÷ï[÷è[÷á[÷Ú[÷Ó[÷Ì[÷Å[÷¾[÷·[÷°[÷©[÷¢[÷›[÷”[÷[÷†[÷[÷x[÷q[÷j[÷c[÷\[÷U[÷N[÷G[÷@[÷9[÷2[÷+[÷$[÷[÷[÷[÷[÷[÷úZ÷óZ÷ìZ÷åZ÷ÞZ÷×Z÷ÐZ÷ÉZ÷ÂZ÷»Z÷´Z÷­Z÷¦Z÷ŸZ÷˜Z÷‘Z÷ŠZ÷ƒZ÷|Z÷uZ÷nZ÷gZ÷`Z÷YZ÷RZ÷KZ÷DZ÷=Z÷6Z÷/Z÷(Z÷!Z÷Z÷Z÷ Z÷Z÷þY÷÷Y÷ðY÷éY÷âY÷ÛY÷ÔY÷ÍY÷ÆY÷¿Y÷¸Y÷±Y÷ªY÷£Y÷œY÷•Y÷ŽY÷‡Y÷€Y÷yY÷rY÷kY÷dY÷]Y÷VY÷OY÷HY÷AY÷:Y÷3Y÷,Y÷%Y÷Y÷Y÷Y÷ Y÷Y÷ûX÷ôX÷íX÷æX÷ßX÷ØX÷ÑX÷ÊX÷ÃX÷¼X÷µX÷®X÷§X÷ X÷™X÷’X÷‹X÷„X÷}X÷vX÷oX÷hX÷aX÷ZX÷SX÷LX÷EX÷>X÷7X÷0X÷)X÷"X÷X÷X÷ X÷X÷ÿW÷øW÷ñW÷êW÷ãW÷ÜW÷ÕW÷ÎW÷ÇW÷ÀW÷¹W÷²W÷«W÷¤W÷W÷–W÷W÷ˆW÷W÷zW÷sW÷lW÷eW÷^W÷WW÷PW÷IW÷BW÷;W÷4W÷-W÷&W÷W÷W÷W÷ W÷W÷üV÷õV÷îV÷çV÷àV÷ÙV÷ÒV÷ËV÷ÄV÷½V÷¶V÷¯V÷¨V÷¡V÷šV÷“V÷ŒV÷…V÷~V÷wV÷pV÷iV÷bV÷[V÷TV÷MV÷FV÷?V÷8V÷1V÷*V÷#V÷V÷V÷V÷V÷V÷ùU÷òU÷ëU÷äU÷ÝU÷ÖU÷ÏU÷ÈU÷ÁU÷ºU÷³U÷¬U÷¥U÷žU÷—U÷U÷‰U÷‚U÷{U÷tU÷mU÷fU÷_U÷XU÷QU÷JU÷CU÷Q÷7Q÷0Q÷)Q÷"Q÷Q÷Q÷ Q÷Q÷ÿP÷øP÷ñP÷êP÷ãP÷ÜP÷ÕP÷ÎP÷ÇP÷ÀP÷¹P÷²P÷«P÷¤P÷P÷–P÷P÷ˆP÷P÷zP÷sP÷lP÷eP÷^P÷WP÷PP÷IP÷BP÷;P÷4P÷-P÷&P÷P÷P÷P÷ P÷P÷üO÷õO÷îO÷çO÷àO÷ÙO÷ÒO÷ËO÷ÄO÷½O÷¶O÷¯O÷¨O÷¡O÷šO÷“O÷ŒO÷…O÷~O÷wO÷pO÷iO÷bO÷[O÷TO÷MO÷FO÷?O÷8O÷1O÷*O÷#O÷O÷O÷O÷O÷O÷ùN÷òN÷ëN÷äN÷ÝN÷ÖN÷ÏN÷ÈN÷ÁN÷ºN÷³N÷¬N÷¥N÷žN÷—N÷N÷‰N÷‚N÷{N÷tN÷mN÷fN÷_N÷XN÷QN÷JN÷CN÷J÷7J÷0J÷)J÷"J÷J÷J÷ J÷J÷ÿI÷øI÷ñI÷êI÷ãI÷ÜI÷ÕI÷ÎI÷ÇI÷ÀI÷¹I÷²I÷«I÷¤I÷I÷–I÷I÷ˆI÷I÷zI÷sI÷lI÷eI÷^I÷WI÷PI÷II÷BI÷;I÷4I÷-I÷&I÷I÷I÷I÷ I÷I÷üH÷õH÷îH÷çH÷àH÷ÙH÷ÒH÷ËH÷ÄH÷½H÷¶H÷¯H÷¨H÷¡H÷šH÷“H÷ŒH÷…H÷~H÷wH÷pH÷iH÷bH÷[H÷TH÷MH÷FH÷?H÷8H÷1H÷*H÷#H÷H÷H÷H÷H÷H÷ùG÷òG÷ëG÷äG÷ÝG÷ÖG÷ÏG÷ÈG÷ÁG÷ºG÷³G÷¬G÷¥G÷žG÷—G÷G÷‰G÷‚G÷{G÷tG÷mG÷fG÷_G÷XG÷QG÷JG÷CG÷C÷7C÷0C÷)C÷"C÷C÷C÷ C÷C÷ÿB÷øB÷ñB÷êB÷ãB÷ÜB÷ÕB÷ÎB÷ÇB÷ÀB÷¹B÷²B÷«B÷¤B÷B÷–B÷B÷ˆB÷B÷zB÷sB÷lB÷eB÷^B÷WB÷PB÷IB÷BB÷;B÷4B÷-B÷&B÷B÷B÷B÷ B÷B÷üA÷õA÷îA÷çA÷àA÷ÙA÷ÒA÷ËA÷ÄA÷½A÷¶A÷¯A÷¨A÷¡A÷šA÷“A÷ŒA÷…A÷~A÷wA÷pA÷iA÷bA÷[A÷TA÷MA÷FA÷?A÷8A÷1A÷*A÷#A÷A÷A÷A÷A÷A÷ù@÷ò@÷ë@÷ä@÷Ý@÷Ö@÷Ï@÷È@÷Á@÷º@÷³@÷¬@÷¥@÷ž@÷—@÷@÷‰@÷‚@÷{@÷t@÷m@÷f@÷_@÷X@÷Q@÷J@÷C@÷<@÷5@÷.@÷'@÷ @÷@÷@÷ @÷@÷ý?÷ö?÷ï?÷è?÷á?÷Ú?÷Ó?÷Ì?÷Å?÷¾?÷·?÷°?÷©?÷¢?÷›?÷”?÷?÷†?÷?÷x?÷q?÷j?÷c?÷\?÷U?÷N?÷G?÷@?÷9?÷2?÷+?÷$?÷?÷?÷?÷?÷?÷ú>÷ó>÷ì>÷å>÷Þ>÷×>÷Ð>÷É>÷Â>÷»>÷´>÷­>÷¦>÷Ÿ>÷˜>÷‘>÷Š>÷ƒ>÷|>÷u>÷n>÷g>÷`>÷Y>÷R>÷K>÷D>÷=>÷6>÷/>÷(>÷!>÷>÷>÷ >÷>÷þ=÷÷=÷ð=÷é=÷â=÷Û=÷Ô=÷Í=÷Æ=÷¿=÷¸=÷±=÷ª=÷£=÷œ=÷•=÷Ž=÷‡=÷€=÷y=÷r=÷k=÷d=÷]=÷V=÷O=÷H=÷A=÷:=÷3=÷,=÷%=÷=÷=÷=÷ =÷=÷û<÷ô<÷í<÷æ<÷ß<÷Ø<÷Ñ<÷Ê<÷Ã<÷¼<÷µ<÷®<÷§<÷ <÷™<÷’<÷‹<÷„<÷}<÷v<÷o<÷h<÷a<÷Z<÷S<÷L<÷E<÷><÷7<÷0<÷)<÷"<÷<÷<÷ <÷<÷ÿ;÷ø;÷ñ;÷ê;÷ã;÷Ü;÷Õ;÷Î;÷Ç;÷À;÷¹;÷²;÷«;÷¤;÷;÷–;÷;÷ˆ;÷;÷z;÷s;÷l;÷e;÷^;÷W;÷P;÷I;÷B;÷;;÷4;÷-;÷&;÷;÷;÷;÷ ;÷;÷ü:÷õ:÷î:÷ç:÷à:÷Ù:÷Ò:÷Ë:÷Ä:÷½:÷¶:÷¯:÷¨:÷¡:÷š:÷“:÷Œ:÷…:÷~:÷w:÷p:÷i:÷b:÷[:÷T:÷M:÷F:÷?:÷8:÷1:÷*:÷#:÷:÷:÷:÷:÷:÷ù9÷ò9÷ë9÷ä9÷Ý9÷Ö9÷Ï9÷È9÷Á9÷º9÷³9÷¬9÷¥9÷ž9÷—9÷9÷‰9÷‚9÷{9÷t9÷m9÷f9÷_9÷X9÷Q9÷J9÷C9÷<9÷59÷.9÷'9÷ 9÷9÷9÷ 9÷9÷ý8÷ö8÷ï8÷è8÷á8÷Ú8÷Ó8÷Ì8÷Å8÷¾8÷·8÷°8÷©8÷¢8÷›8÷”8÷8÷†8÷8÷x8÷q8÷j8÷c8÷\8÷U8÷N8÷G8÷@8÷98÷28÷+8÷$8÷8÷8÷8÷8÷8÷ú7÷ó7÷ì7÷å7÷Þ7÷×7÷Ð7÷É7÷Â7÷»7÷´7÷­7÷¦7÷Ÿ7÷˜7÷‘7÷Š7÷ƒ7÷|7÷u7÷n7÷g7÷`7÷Y7÷R7÷K7÷D7÷=7÷67÷/7÷(7÷!7÷7÷7÷ 7÷7÷þ6÷÷6÷ð6÷é6÷â6÷Û6÷Ô6÷Í6÷Æ6÷¿6÷¸6÷±6÷ª6÷£6÷œ6÷•6÷Ž6÷‡6÷€6÷y6÷r6÷k6÷d6÷]6÷V6÷O6÷H6÷A6÷:6÷36÷,6÷%6÷6÷6÷6÷ 6÷6÷û5÷ô5÷í5÷æ5÷ß5÷Ø5÷Ñ5÷Ê5÷Ã5÷¼5÷µ5÷®5÷§5÷ 5÷™5÷’5÷‹5÷„5÷}5÷v5÷o5÷h5÷a5÷Z5÷S5÷L5÷E5÷>5÷75÷05÷)5÷"5÷5÷5÷ 5÷5÷ÿ4÷ø4÷ñ4÷ê4÷ã4÷Ü4÷Õ4÷Î4÷Ç4÷À4÷¹4÷²4÷«4÷¤4÷4÷–4÷4÷ˆ4÷4÷z4÷s4÷l4÷e4÷^4÷W4÷P4÷I4÷B4÷;4÷44÷-4÷&4÷4÷4÷4÷ 4÷4÷ü3÷õ3÷î3÷ç3÷à3÷Ù3÷Ò3÷Ë3÷Ä3÷½3÷¶3÷¯3÷¨3÷¡3÷š3÷“3÷Œ3÷…3÷~3÷w3÷p3÷i3÷b3÷[3÷T3÷M3÷F3÷?3÷83÷13÷*3÷#3÷3÷3÷3÷3÷3÷ù2÷ò2÷ë2÷ä2÷Ý2÷Ö2÷Ï2÷È2÷Á2÷º2÷³2÷¬2÷¥2÷ž2÷—2÷2÷‰2÷‚2÷{2÷t2÷m2÷f2÷_2÷X2÷Q2÷J2÷C2÷<2÷52÷.2÷'2÷ 2÷2÷2÷ 2÷2÷ý1÷ö1÷ï1÷è1÷á1÷Ú1÷Ó1÷Ì1÷Å1÷¾1÷·1÷°1÷©1÷¢1÷›1÷”1÷1÷†1÷1÷x1÷q1÷j1÷c1÷\1÷U1÷N1÷G1÷@1÷91÷21÷+1÷$1÷1÷1÷1÷1÷1÷ú0÷ó0÷ì0÷å0÷Þ0÷×0÷Ð0÷É0÷Â0÷»0÷´0÷­0÷¦0÷Ÿ0÷˜0÷‘0÷Š0÷ƒ0÷|0÷u0÷n0÷g0÷`0÷Y0÷R0÷K0÷D0÷=0÷60÷/0÷(0÷!0÷0÷0÷ 0÷0÷þ/÷÷/÷ð/÷é/÷â/÷Û/÷Ô/÷Í/÷Æ/÷¿/÷¸/÷±/÷ª/÷£/÷œ/÷•/÷Ž/÷‡/÷€/÷y/÷r/÷k/÷d/÷]/÷V/÷O/÷H/÷A/÷:/÷3/÷,/÷%/÷/÷/÷/÷ /÷/÷û.÷ô.÷í.÷æ.÷ß.÷Ø.÷Ñ.÷Ê.÷Ã.÷¼.÷µ.÷®.÷§.÷ .÷™.÷’.÷‹.÷„.÷}.÷v.÷o.÷h.÷a.÷Z.÷S.÷L.÷E.÷>.÷7.÷0.÷).÷".÷.÷.÷ .÷.÷ÿ-÷ø-÷ñ-÷ê-÷ã-÷Ü-÷Õ-÷Î-÷Ç-÷À-÷¹-÷²-÷«-÷¤-÷-÷–-÷-÷ˆ-÷-÷z-÷s-÷l-÷e-÷^-÷W-÷P-÷I-÷B-÷;-÷4-÷--÷&-÷-÷-÷-÷ -÷-÷ü,÷õ,÷î,÷ç,÷à,÷Ù,÷Ò,÷Ë,÷Ä,÷½,÷¶,÷¯,÷¨,÷¡,÷š,÷“,÷Œ,÷…,÷~,÷w,÷p,÷i,÷b,÷[,÷T,÷M,÷F,÷?,÷8,÷1,÷*,÷#,÷,÷,÷,÷,÷,÷ù+÷ò+÷ë+÷ä+÷Ý+÷Ö+÷Ï+÷È+÷Á+÷º+÷³+÷¬+÷¥+÷ž+÷—+÷+÷‰+÷‚+÷{+÷t+÷m+÷f+÷_+÷X+÷Q+÷J+÷C+÷<+÷5+÷.+÷'+÷ +÷+÷+÷ +÷+÷ý*÷ö*÷ï*÷è*÷á*÷Ú*÷Ó*÷Ì*÷Å*÷¾*÷·*÷°*÷©*÷¢*÷›*÷”*÷*÷†*÷*÷x*÷q*÷j*÷c*÷\*÷U*÷N*÷G*÷@*÷9*÷2*÷+*÷$*÷*÷*÷*÷*÷*÷ú)÷ó)÷ì)÷å)÷Þ)÷×)÷Ð)÷É)÷Â)÷»)÷´)÷­)÷¦)÷Ÿ)÷˜)÷‘)÷Š)÷ƒ)÷|)÷u)÷n)÷g)÷`)÷Y)÷R)÷K)÷D)÷=)÷6)÷/)÷()÷!)÷)÷)÷ )÷)÷þ(÷÷(÷ð(÷é(÷â(÷Û(÷Ô(÷Í(÷Æ(÷¿(÷¸(÷±(÷ª(÷£(÷œ(÷•(÷Ž(÷‡(÷€(÷y(÷r(÷k(÷d(÷](÷V(÷O(÷H(÷A(÷:(÷3(÷,(÷%(÷(÷(÷(÷ (÷(÷û'÷ô'÷í'÷æ'÷ß'÷Ø'÷Ñ'÷Ê'÷Ã'÷¼'÷µ'÷®'÷§'÷ '÷™'÷’'÷‹'÷„'÷}'÷v'÷o'÷h'÷a'÷Z'÷S'÷L'÷E'÷>'÷7'÷0'÷)'÷"'÷'÷'÷ '÷'÷ÿ&÷ø&÷ñ&÷ê&÷ã&÷Ü&÷Õ&÷Î&÷Ç&÷À&÷¹&÷²&÷«&÷¤&÷&÷–&÷&÷ˆ&÷&÷z&÷s&÷l&÷e&÷^&÷W&÷P&÷I&÷B&÷;&÷4&÷-&÷&&÷&÷&÷&÷ &÷&÷ü%÷õ%÷î%÷ç%÷à%÷Ù%÷Ò%÷Ë%÷Ä%÷½%÷¶%÷¯%÷¨%÷¡%÷š%÷“%÷Œ%÷…%÷~%÷w%÷p%÷i%÷b%÷[%÷T%÷M%÷F%÷?%÷8%÷1%÷*%÷#%÷%÷%÷%÷%÷%÷ù$÷ò$÷ë$÷ä$÷Ý$÷Ö$÷Ï$÷È$÷Á$÷º$÷³$÷¬$÷¥$÷ž$÷—$÷$÷‰$÷‚$÷{$÷t$÷m$÷f$÷_$÷X$÷Q$÷J$÷C$÷<$÷5$÷.$÷'$÷ $÷$÷$÷ $÷$÷ý#÷ö#÷ï#÷è#÷á#÷Ú#÷Ó#÷Ì#÷Å#÷¾#÷·#÷°#÷©#÷¢#÷›#÷”#÷#÷†#÷#÷x#÷q#÷j#÷c#÷\#÷U#÷N#÷G#÷@#÷9#÷2#÷+#÷$#÷#÷#÷#÷#÷#÷ú"÷ó"÷ì"÷å"÷Þ"÷×"÷Ð"÷É"÷Â"÷»"÷´"÷­"÷¦"÷Ÿ"÷˜"÷‘"÷Š"÷ƒ"÷|"÷u"÷n"÷g"÷`"÷Y"÷R"÷K"÷D"÷="÷6"÷/"÷("÷!"÷"÷"÷ "÷"÷þ!÷÷!÷ð!÷é!÷â!÷Û!÷Ô!÷Í!÷Æ!÷¿!÷¸!÷±!÷ª!÷£!÷œ!÷•!÷Ž!÷‡!÷€!÷y!÷r!÷k!÷d!÷]!÷V!÷O!÷H!÷A!÷:!÷3!÷,!÷%!÷!÷!÷!÷ !÷!÷û ÷ô ÷í ÷æ ÷ß ÷Ø ÷Ñ ÷Ê ÷à ÷¼ ÷µ ÷® ÷§ ÷  ÷™ ÷’ ÷‹ ÷„ ÷} ÷v ÷o ÷h ÷a ÷Z ÷S ÷L ÷E ÷> ÷7 ÷0 ÷) ÷" ÷ ÷ ÷ ÷ ÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷ü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷ú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷û÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷ü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷ú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷û÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷ü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷ú ÷ó ÷ì ÷å ÷Þ ÷× ÷Ð ÷É ÷ ÷» ÷´ ÷­ ÷¦ ÷Ÿ ÷˜ ÷‘ ÷Š ÷ƒ ÷| ÷u ÷n ÷g ÷` ÷Y ÷R ÷K ÷D ÷= ÷6 ÷/ ÷( ÷! ÷ ÷ ÷ ÷ ÷þ ÷÷ ÷ð ÷é ÷â ÷Û ÷Ô ÷Í ÷Æ ÷¿ ÷¸ ÷± ÷ª ÷£ ÷œ ÷• ÷Ž ÷‡ ÷€ ÷y ÷r ÷k ÷d ÷] ÷V ÷O ÷H ÷A ÷: ÷3 ÷, ÷% ÷ ÷ ÷ ÷ ÷ ÷û ÷ô ÷í ÷æ ÷ß ÷Ø ÷Ñ ÷Ê ÷à ÷¼ ÷µ ÷® ÷§ ÷  ÷™ ÷’ ÷‹ ÷„ ÷} ÷v ÷o ÷h ÷a ÷Z ÷S ÷L ÷E ÷> ÷7 ÷0 ÷) ÷" ÷ ÷ ÷ ÷ ÷ÿ ÷ø ÷ñ ÷ê ÷ã ÷Ü ÷Õ ÷Î ÷Ç ÷À ÷¹ ÷² ÷« ÷¤ ÷ ÷– ÷ ÷ˆ ÷ ÷z ÷s ÷l ÷e ÷^ ÷W ÷P ÷I ÷B ÷; ÷4 ÷- ÷& ÷ ÷ ÷ ÷ ÷ ÷ü ÷õ ÷î ÷ç ÷à ÷Ù ÷Ò ÷Ë ÷Ä ÷½ ÷¶ ÷¯ ÷¨ ÷¡ ÷š ÷“ ÷Œ ÷… ÷~ ÷w ÷p ÷i ÷b ÷[ ÷T ÷M ÷F ÷? ÷8 ÷1 ÷* ÷# ÷ ÷ ÷ ÷ ÷ ÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷ú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷û÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷ü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷úÿöóÿöìÿöåÿöÞÿö×ÿöÐÿöÉÿöÂÿö»ÿö´ÿö­ÿö¦ÿöŸÿö˜ÿö‘ÿöŠÿöƒÿö|ÿöuÿönÿögÿö`ÿöYÿöRÿöKÿöDÿö=ÿö6ÿö/ÿö(ÿö!ÿöÿöÿö ÿöÿöþþö÷þöðþöéþöâþöÛþöÔþöÍþöÆþö¿þö¸þö±þöªþö£þöœþö•þöŽþö‡þö€þöyþörþökþödþö]þöVþöOþöHþöAþö:þö3þö,þö%þöþöþöþö þöþöûýöôýöíýöæýößýöØýöÑýöÊýöÃýö¼ýöµýö®ýö§ýö ýö™ýö’ýö‹ýö„ýö}ýövýöoýöhýöaýöZýöSýöLýöEýö>ýö7ýö0ýö)ýö"ýöýöýö ýöýöÿüöøüöñüöêüöãüöÜüöÕüöÎüöÇüöÀüö¹üö²üö«üö¤üöüö–üöüöˆüöüözüösüölüöeüö^üöWüöPüöIüöBüö;üö4üö-üö&üöüöüöüö üöüöüûöõûöîûöçûöàûöÙûöÒûöËûöÄûö½ûö¶ûö¯ûö¨ûö¡ûöšûö“ûöŒûö…ûö~ûöwûöpûöiûöbûö[ûöTûöMûöFûö?ûö8ûö1ûö*ûö#ûöûöûöûöûöûöùúöòúöëúöäúöÝúöÖúöÏúöÈúöÁúöºúö³úö¬úö¥úöžúö—úöúö‰úö‚úö{úötúömúöfúö_úöXúöQúöJúöCúö<úö5úö.úö'úö úöúöúö úöúöýùööùöïùöèùöáùöÚùöÓùöÌùöÅùö¾ùö·ùö°ùö©ùö¢ùö›ùö”ùöùö†ùöùöxùöqùöjùöcùö\ùöUùöNùöGùö@ùö9ùö2ùö+ùö$ùöùöùöùöùöùöúøöóøöìøöåøöÞøö×øöÐøöÉøöÂøö»øö´øö­øö¦øöŸøö˜øö‘øöŠøöƒøö|øöuøönøögøö`øöYøöRøöKøöDøö=øö6øö/øö(øö!øöøöøö øöøöþ÷ö÷÷öð÷öé÷öâ÷öÛ÷öÔ÷öÍ÷öÆ÷ö¿÷ö¸÷ö±÷öª÷ö£÷öœ÷ö•÷öŽ÷ö‡÷ö€÷öy÷ör÷ök÷öd÷ö]÷öV÷öO÷öH÷öA÷ö:÷ö3÷ö,÷ö%÷ö÷ö÷ö÷ö ÷ö÷öûööôööíööæöößööØööÑööÊööÃöö¼ööµöö®öö§öö öö™öö’öö‹öö„öö}öövööoööhööaööZööSööLööEöö>öö7öö0öö)öö"öööööö ööööÿõöøõöñõöêõöãõöÜõöÕõöÎõöÇõöÀõö¹õö²õö«õö¤õöõö–õöõöˆõöõözõösõölõöeõö^õöWõöPõöIõöBõö;õö4õö-õö&õöõöõöõö õöõöüôöõôöîôöçôöàôöÙôöÒôöËôöÄôö½ôö¶ôö¯ôö¨ôö¡ôöšôö“ôöŒôö…ôö~ôöwôöpôöiôöbôö[ôöTôöMôöFôö?ôö8ôö1ôö*ôö#ôöôöôöôöôöôöùóöòóöëóöäóöÝóöÖóöÏóöÈóöÁóöºóö³óö¬óö¥óöžóö—óöóö‰óö‚óö{óötóömóöfóö_óöXóöQóöJóöCóö<óö5óö.óö'óö óöóöóö óöóöýòööòöïòöèòöáòöÚòöÓòöÌòöÅòö¾òö·òö°òö©òö¢òö›òö”òöòö†òöòöxòöqòöjòöcòö\òöUòöNòöGòö@òö9òö2òö+òö$òöòöòöòöòöòöúñöóñöìñöåñöÞñö×ñöÐñöÉñöÂñö»ñö´ñö­ñö¦ñöŸñö˜ñö‘ñöŠñöƒñö|ñöuñönñögñö`ñöYñöRñöKñöDñö=ñö6ñö/ñö(ñö!ñöñöñö ñöñöþðö÷ðöððöéðöâðöÛðöÔðöÍðöÆðö¿ðö¸ðö±ðöªðö£ðöœðö•ðöŽðö‡ðö€ðöyðörðökðödðö]ðöVðöOðöHðöAðö:ðö3ðö,ðö%ðöðöðöðö ðöðöûïöôïöíïöæïößïöØïöÑïöÊïöÃïö¼ïöµïö®ïö§ïö ïö™ïö’ïö‹ïö„ïö}ïövïöoïöhïöaïöZïöSïöLïöEïö>ïö7ïö0ïö)ïö"ïöïöïö ïöïöÿîöøîöñîöêîöãîöÜîöÕîöÎîöÇîöÀîö¹îö²îö«îö¤îöîö–îöîöˆîöîözîösîölîöeîö^îöWîöPîöIîöBîö;îö4îö-îö&îöîöîöîö îöîöüíöõíöîíöçíöàíöÙíöÒíöËíöÄíö½íö¶íö¯íö¨íö¡íöšíö“íöŒíö…íö~íöwíöpíöiíöbíö[íöTíöMíöFíö?íö8íö1íö*íö#íöíöíöíöíöíöùìöòìöëìöäìöÝìöÖìöÏìöÈìöÁìöºìö³ìö¬ìö¥ìöžìö—ìöìö‰ìö‚ìö{ìötìömìöfìö_ìöXìöQìöJìöCìö<ìö5ìö.ìö'ìö ìöìöìö ìöìöýëööëöïëöèëöáëöÚëöÓëöÌëöÅëö¾ëö·ëö°ëö©ëö¢ëö›ëö”ëöëö†ëöëöxëöqëöjëöcëö\ëöUëöNëöGëö@ëö9ëö2ëö+ëö$ëöëöëöëöëöëöúêöóêöìêöåêöÞêö×êöÐêöÉêöÂêö»êö´êö­êö¦êöŸêö˜êö‘êöŠêöƒêö|êöuêönêögêö`êöYêöRêöKêöDêö=êö6êö/êö(êö!êöêöêö êöêöþéö÷éöðéöééöâéöÛéöÔéöÍéöÆéö¿éö¸éö±éöªéö£éöœéö•éöŽéö‡éö€éöyéöréökéödéö]éöVéöOéöHéöAéö:éö3éö,éö%éöéöéöéö éöéöûèöôèöíèöæèößèöØèöÑèöÊèöÃèö¼èöµèö®èö§èö èö™èö’èö‹èö„èö}èövèöoèöhèöaèöZèöSèöLèöEèö>èö7èö0èö)èö"èöèöèö èöèöÿçöøçöñçöêçöãçöÜçöÕçöÎçöÇçöÀçö¹çö²çö«çö¤çöçö–çöçöˆçöçözçösçölçöeçö^çöWçöPçöIçöBçö;çö4çö-çö&çöçöçöçö çöçöüæöõæöîæöçæöàæöÙæöÒæöËæöÄæö½æö¶æö¯æö¨æö¡æöšæö“æöŒæö…æö~æöwæöpæöiæöbæö[æöTæöMæöFæö?æö8æö1æö*æö#æöæöæöæöæöæöùåöòåöëåöäåöÝåöÖåöÏåöÈåöÁåöºåö³åö¬åö¥åöžåö—åöåö‰åö‚åö{åötåömåöfåö_åöXåöQåöJåöCåö<åö5åö.åö'åö åöåöåö åöåöýäööäöïäöèäöáäöÚäöÓäöÌäöÅäö¾äö·äö°äö©äö¢äö›äö”äöäö†äöäöxäöqäöjäöcäö\äöUäöNäöGäö@äö9äö2äö+äö$äöäöäöäöäöäöúãöóãöìãöåãöÞãö×ãöÐãöÉãöÂãö»ãö´ãö­ãö¦ãöŸãö˜ãö‘ãöŠãöƒãö|ãöuãönãögãö`ãöYãöRãöKãöDãö=ãö6ãö/ãö(ãö!ãöãöãö ãöãöþâö÷âöðâöéâöââöÛâöÔâöÍâöÆâö¿âö¸âö±âöªâö£âöœâö•âöŽâö‡âö€âöyâörâökâödâö]âöVâöOâöHâöAâö:âö3âö,âö%âöâöâöâö âöâöûáöôáöíáöæáößáöØáöÑáöÊáöÃáö¼áöµáö®áö§áö áö™áö’áö‹áö„áö}áöváöoáöháöaáöZáöSáöLáöEáö>áö7áö0áö)áö"áöáöáö áöáöÿàöøàöñàöêàöãàöÜàöÕàöÎàöÇàöÀàö¹àö²àö«àö¤àöàö–àöàöˆàöàözàösàölàöeàö^àöWàöPàöIàöBàö;àö4àö-àö&àöàöàöàö àöàöüßöõßöîßöçßöàßöÙßöÒßöËßöÄßö½ßö¶ßö¯ßö¨ßö¡ßöšßö“ßöŒßö…ßö~ßöwßöpßöißöbßö[ßöTßöMßöFßö?ßö8ßö1ßö*ßö#ßößößößößößöùÞöòÞöëÞöäÞöÝÞöÖÞöÏÞöÈÞöÁÞöºÞö³Þö¬Þö¥ÞöžÞö—ÞöÞö‰Þö‚Þö{ÞötÞömÞöfÞö_ÞöXÞöQÞöJÞöCÞö<Þö5Þö.Þö'Þö ÞöÞöÞö ÞöÞöýÝööÝöïÝöèÝöáÝöÚÝöÓÝöÌÝöÅÝö¾Ýö·Ýö°Ýö©Ýö¢Ýö›Ýö”ÝöÝö†ÝöÝöxÝöqÝöjÝöcÝö\ÝöUÝöNÝöGÝö@Ýö9Ýö2Ýö+Ýö$ÝöÝöÝöÝöÝöÝöúÜöóÜöìÜöåÜöÞÜö×ÜöÐÜöÉÜöÂÜö»Üö´Üö­Üö¦ÜöŸÜö˜Üö‘ÜöŠÜöƒÜö|ÜöuÜönÜögÜö`ÜöYÜöRÜöKÜöDÜö=Üö6Üö/Üö(Üö!ÜöÜöÜö ÜöÜöþÛö÷ÛöðÛöéÛöâÛöÛÛöÔÛöÍÛöÆÛö¿Ûö¸Ûö±ÛöªÛö£ÛöœÛö•ÛöŽÛö‡Ûö€ÛöyÛörÛökÛödÛö]ÛöVÛöOÛöHÛöAÛö:Ûö3Ûö,Ûö%ÛöÛöÛöÛö ÛöÛöûÚöôÚöíÚöæÚößÚöØÚöÑÚöÊÚöÃÚö¼ÚöµÚö®Úö§Úö Úö™Úö’Úö‹Úö„Úö}ÚövÚöoÚöhÚöaÚöZÚöSÚöLÚöEÚö>Úö7Úö0Úö)Úö"ÚöÚöÚö ÚöÚöÿÙöøÙöñÙöêÙöãÙöÜÙöÕÙöÎÙöÇÙöÀÙö¹Ùö²Ùö«Ùö¤ÙöÙö–ÙöÙöˆÙöÙözÙösÙölÙöeÙö^ÙöWÙöPÙöIÙöBÙö;Ùö4Ùö-Ùö&ÙöÙöÙöÙö ÙöÙöüØöõØöîØöçØöàØöÙØöÒØöËØöÄØö½Øö¶Øö¯Øö¨Øö¡ØöšØö“ØöŒØö…Øö~ØöwØöpØöiØöbØö[ØöTØöMØöFØö?Øö8Øö1Øö*Øö#ØöØöØöØöØöØöù×öò×öë×öä×öÝ×öÖ×öÏ×öÈ×öÁ×öº×ö³×ö¬×ö¥×öž×ö—×ö×ö‰×ö‚×ö{×öt×öm×öf×ö_×öX×öQ×öJ×öC×ö<×ö5×ö.×ö'×ö ×ö×ö×ö ×ö×öýÖööÖöïÖöèÖöáÖöÚÖöÓÖöÌÖöÅÖö¾Öö·Öö°Öö©Öö¢Öö›Öö”ÖöÖö†ÖöÖöxÖöqÖöjÖöcÖö\ÖöUÖöNÖöGÖö@Öö9Öö2Öö+Öö$ÖöÖöÖöÖöÖöÖöúÕöóÕöìÕöåÕöÞÕö×ÕöÐÕöÉÕöÂÕö»Õö´Õö­Õö¦ÕöŸÕö˜Õö‘ÕöŠÕöƒÕö|ÕöuÕönÕögÕö`ÕöYÕöRÕöKÕöDÕö=Õö6Õö/Õö(Õö!ÕöÕöÕö ÕöÕöþÔö÷ÔöðÔöéÔöâÔöÛÔöÔÔöÍÔöÆÔö¿Ôö¸Ôö±ÔöªÔö£ÔöœÔö•ÔöŽÔö‡Ôö€ÔöyÔörÔökÔödÔö]ÔöVÔöOÔöHÔöAÔö:Ôö3Ôö,Ôö%ÔöÔöÔöÔö ÔöÔöûÓöôÓöíÓöæÓößÓöØÓöÑÓöÊÓöÃÓö¼ÓöµÓö®Óö§Óö Óö™Óö’Óö‹Óö„Óö}ÓövÓöoÓöhÓöaÓöZÓöSÓöLÓöEÓö>Óö7Óö0Óö)Óö"ÓöÓöÓö ÓöÓöÿÒöøÒöñÒöêÒöãÒöÜÒöÕÒöÎÒöÇÒöÀÒö¹Òö²Òö«Òö¤ÒöÒö–ÒöÒöˆÒöÒözÒösÒölÒöeÒö^ÒöWÒöPÒöIÒöBÒö;Òö4Òö-Òö&ÒöÒöÒöÒö ÒöÒöüÑöõÑöîÑöçÑöàÑöÙÑöÒÑöËÑöÄÑö½Ñö¶Ñö¯Ñö¨Ñö¡ÑöšÑö“ÑöŒÑö…Ñö~ÑöwÑöpÑöiÑöbÑö[ÑöTÑöMÑöFÑö?Ñö8Ñö1Ñö*Ñö#ÑöÑöÑöÑöÑöÑöùÐöòÐöëÐöäÐöÝÐöÖÐöÏÐöÈÐöÁÐöºÐö³Ðö¬Ðö¥ÐöžÐö—ÐöÐö‰Ðö‚Ðö{ÐötÐömÐöfÐö_ÐöXÐöQÐöJÐöCÐö<Ðö5Ðö.Ðö'Ðö ÐöÐöÐö ÐöÐöýÏööÏöïÏöèÏöáÏöÚÏöÓÏöÌÏöÅÏö¾Ïö·Ïö°Ïö©Ïö¢Ïö›Ïö”ÏöÏö†ÏöÏöxÏöqÏöjÏöcÏö\ÏöUÏöNÏöGÏö@Ïö9Ïö2Ïö+Ïö$ÏöÏöÏöÏöÏöÏöúÎöóÎöìÎöåÎöÞÎö×ÎöÐÎöÉÎöÂÎö»Îö´Îö­Îö¦ÎöŸÎö˜Îö‘ÎöŠÎöƒÎö|ÎöuÎönÎögÎö`ÎöYÎöRÎöKÎöDÎö=Îö6Îö/Îö(Îö!ÎöÎöÎö ÎöÎöþÍö÷ÍöðÍöéÍöâÍöÛÍöÔÍöÍÍöÆÍö¿Íö¸Íö±ÍöªÍö£ÍöœÍö•ÍöŽÍö‡Íö€ÍöyÍörÍökÍödÍö]ÍöVÍöOÍöHÍöAÍö:Íö3Íö,Íö%ÍöÍöÍöÍö ÍöÍöûÌöôÌöíÌöæÌößÌöØÌöÑÌöÊÌöÃÌö¼ÌöµÌö®Ìö§Ìö Ìö™Ìö’Ìö‹Ìö„Ìö}ÌövÌöoÌöhÌöaÌöZÌöSÌöLÌöEÌö>Ìö7Ìö0Ìö)Ìö"ÌöÌöÌö ÌöÌöÿËöøËöñËöêËöãËöÜËöÕËöÎËöÇËöÀËö¹Ëö²Ëö«Ëö¤ËöËö–ËöËöˆËöËözËösËölËöeËö^ËöWËöPËöIËöBËö;Ëö4Ëö-Ëö&ËöËöËöËö ËöËöüÊöõÊöîÊöçÊöàÊöÙÊöÒÊöËÊöÄÊö½Êö¶Êö¯Êö¨Êö¡ÊöšÊö“ÊöŒÊö…Êö~ÊöwÊöpÊöiÊöbÊö[ÊöTÊöMÊöFÊö?Êö8Êö1Êö*Êö#ÊöÊöÊöÊöÊöÊöùÉöòÉöëÉöäÉöÝÉöÖÉöÏÉöÈÉöÁÉöºÉö³Éö¬Éö¥ÉöžÉö—ÉöÉö‰Éö‚Éö{ÉötÉömÉöfÉö_ÉöXÉöQÉöJÉöCÉö<Éö5Éö.Éö'Éö ÉöÉöÉö ÉöÉöýÈööÈöïÈöèÈöáÈöÚÈöÓÈöÌÈöÅÈö¾Èö·Èö°Èö©Èö¢Èö›Èö”ÈöÈö†ÈöÈöxÈöqÈöjÈöcÈö\ÈöUÈöNÈöGÈö@Èö9Èö2Èö+Èö$ÈöÈöÈöÈöÈöÈöúÇöóÇöìÇöåÇöÞÇö×ÇöÐÇöÉÇöÂÇö»Çö´Çö­Çö¦ÇöŸÇö˜Çö‘ÇöŠÇöƒÇö|ÇöuÇönÇögÇö`ÇöYÇöRÇöKÇöDÇö=Çö6Çö/Çö(Çö!ÇöÇöÇö ÇöÇöþÆö÷ÆöðÆöéÆöâÆöÛÆöÔÆöÍÆöÆÆö¿Æö¸Æö±ÆöªÆö£ÆöœÆö•ÆöŽÆö‡Æö€ÆöyÆörÆökÆödÆö]ÆöVÆöOÆöHÆöAÆö:Æö3Æö,Æö%ÆöÆöÆöÆö ÆöÆöûÅöôÅöíÅöæÅößÅöØÅöÑÅöÊÅöÃÅö¼ÅöµÅö®Åö§Åö Åö™Åö’Åö‹Åö„Åö}ÅövÅöoÅöhÅöaÅöZÅöSÅöLÅöEÅö>Åö7Åö0Åö)Åö"ÅöÅöÅö ÅöÅöÿÄöøÄöñÄöêÄöãÄöÜÄöÕÄöÎÄöÇÄöÀÄö¹Äö²Äö«Äö¤ÄöÄö–ÄöÄöˆÄöÄözÄösÄölÄöeÄö^ÄöWÄöPÄöIÄöBÄö;Äö4Äö-Äö&ÄöÄöÄöÄö ÄöÄöüÃöõÃöîÃöçÃöàÃöÙÃöÒÃöËÃöÄÃö½Ãö¶Ãö¯Ãö¨Ãö¡ÃöšÃö“ÃöŒÃö…Ãö~ÃöwÃöpÃöiÃöbÃö[ÃöTÃöMÃöFÃö?Ãö8Ãö1Ãö*Ãö#ÃöÃöÃöÃöÃöÃöùÂöòÂöëÂöäÂöÝÂöÖÂöÏÂöÈÂöÁÂöºÂö³Âö¬Âö¥ÂöžÂö—ÂöÂö‰Âö‚Âö{ÂötÂömÂöfÂö_ÂöXÂöQÂöJÂöCÂö<Âö5Âö.Âö'Âö ÂöÂöÂö ÂöÂöýÁööÁöïÁöèÁöáÁöÚÁöÓÁöÌÁöÅÁö¾Áö·Áö°Áö©Áö¢Áö›Áö”ÁöÁö†ÁöÁöxÁöqÁöjÁöcÁö\ÁöUÁöNÁöGÁö@Áö9Áö2Áö+Áö$ÁöÁöÁöÁöÁöÁöúÀöóÀöìÀöåÀöÞÀö×ÀöÐÀöÉÀöÂÀö»Àö´Àö­Àö¦ÀöŸÀö˜Àö‘ÀöŠÀöƒÀö|ÀöuÀönÀögÀö`ÀöYÀöRÀöKÀöDÀö=Àö6Àö/Àö(Àö!ÀöÀöÀö ÀöÀöþ¿ö÷¿öð¿öé¿öâ¿öÛ¿öÔ¿öÍ¿öÆ¿ö¿¿ö¸¿ö±¿öª¿ö£¿öœ¿ö•¿öŽ¿ö‡¿ö€¿öy¿ör¿ök¿öd¿ö]¿öV¿öO¿öH¿öA¿ö:¿ö3¿ö,¿ö%¿ö¿ö¿ö¿ö ¿ö¿öû¾öô¾öí¾öæ¾öß¾öؾöѾöʾöþö¼¾öµ¾ö®¾ö§¾ö ¾ö™¾ö’¾ö‹¾ö„¾ö}¾öv¾öo¾öh¾öa¾öZ¾öS¾öL¾öE¾ö>¾ö7¾ö0¾ö)¾ö"¾ö¾ö¾ö ¾ö¾öÿ½öø½öñ½öê½öã½öܽöÕ½öνöǽöÀ½ö¹½ö²½ö«½ö¤½ö½ö–½ö½öˆ½ö½öz½ös½öl½öe½ö^½öW½öP½öI½öB½ö;½ö4½ö-½ö&½ö½ö½ö½ö ½ö½öü¼öõ¼öî¼öç¼öà¼öÙ¼öÒ¼ö˼öļö½¼ö¶¼ö¯¼ö¨¼ö¡¼öš¼ö“¼öŒ¼ö…¼ö~¼öw¼öp¼öi¼öb¼ö[¼öT¼öM¼öF¼ö?¼ö8¼ö1¼ö*¼ö#¼ö¼ö¼ö¼ö¼ö¼öù»öò»öë»öä»öÝ»öÖ»öÏ»öÈ»öÁ»öº»ö³»ö¬»ö¥»öž»ö—»ö»ö‰»ö‚»ö{»öt»öm»öf»ö_»öX»öQ»öJ»öC»ö<»ö5»ö.»ö'»ö »ö»ö»ö »ö»öýºööºöïºöèºöáºöÚºöÓºö̺öźö¾ºö·ºö°ºö©ºö¢ºö›ºö”ºöºö†ºöºöxºöqºöjºöcºö\ºöUºöNºöGºö@ºö9ºö2ºö+ºö$ºöºöºöºöºöºöú¹öó¹öì¹öå¹öÞ¹ö×¹öйöɹö¹ö»¹ö´¹ö­¹ö¦¹öŸ¹ö˜¹ö‘¹öйöƒ¹ö|¹öu¹ön¹ög¹ö`¹öY¹öR¹öK¹öD¹ö=¹ö6¹ö/¹ö(¹ö!¹ö¹ö¹ö ¹ö¹öþ¸ö÷¸öð¸öé¸öâ¸öÛ¸öÔ¸ö͸öƸö¿¸ö¸¸ö±¸öª¸ö£¸öœ¸ö•¸öޏö‡¸ö€¸öy¸ör¸ök¸öd¸ö]¸öV¸öO¸öH¸öA¸ö:¸ö3¸ö,¸ö%¸ö¸ö¸ö¸ö ¸ö¸öû·öô·öí·öæ·öß·öØ·öÑ·öÊ·ö÷ö¼·öµ·ö®·ö§·ö ·ö™·ö’·ö‹·ö„·ö}·öv·öo·öh·öa·öZ·öS·öL·öE·ö>·ö7·ö0·ö)·ö"·ö·ö·ö ·ö·öÿ¶öø¶öñ¶öê¶öã¶öܶöÕ¶öζöǶöÀ¶ö¹¶ö²¶ö«¶ö¤¶ö¶ö–¶ö¶öˆ¶ö¶öz¶ös¶öl¶öe¶ö^¶öW¶öP¶öI¶öB¶ö;¶ö4¶ö-¶ö&¶ö¶ö¶ö¶ö ¶ö¶öüµöõµöîµöçµöàµöÙµöÒµö˵öĵö½µö¶µö¯µö¨µö¡µöšµö“µöŒµö…µö~µöwµöpµöiµöbµö[µöTµöMµöFµö?µö8µö1µö*µö#µöµöµöµöµöµöù´öò´öë´öä´öÝ´öÖ´öÏ´öÈ´öÁ´öº´ö³´ö¬´ö¥´öž´ö—´ö´ö‰´ö‚´ö{´öt´öm´öf´ö_´öX´öQ´öJ´öC´ö<´ö5´ö.´ö'´ö ´ö´ö´ö ´ö´öý³öö³öï³öè³öá³öÚ³öÓ³ö̳öųö¾³ö·³ö°³ö©³ö¢³ö›³ö”³ö³ö†³ö³öx³öq³öj³öc³ö\³öU³öN³öG³ö@³ö9³ö2³ö+³ö$³ö³ö³ö³ö³ö³öú²öó²öì²öå²öÞ²öײöвöɲö²ö»²ö´²ö­²ö¦²öŸ²ö˜²ö‘²öвöƒ²ö|²öu²ön²ög²ö`²öY²öR²öK²öD²ö=²ö6²ö/²ö(²ö!²ö²ö²ö ²ö²öþ±ö÷±öð±öé±öâ±öÛ±öÔ±öͱöƱö¿±ö¸±ö±±öª±ö£±öœ±ö•±öޱö‡±ö€±öy±ör±ök±öd±ö]±öV±öO±öH±öA±ö:±ö3±ö,±ö%±ö±ö±ö±ö ±ö±öû°öô°öí°öæ°öß°öذöѰöʰöðö¼°öµ°ö®°ö§°ö °ö™°ö’°ö‹°ö„°ö}°öv°öo°öh°öa°öZ°öS°öL°öE°ö>°ö7°ö0°ö)°ö"°ö°ö°ö °ö°öÿ¯öø¯öñ¯öê¯öã¯öܯöÕ¯öίöǯöÀ¯ö¹¯ö²¯ö«¯ö¤¯ö¯ö–¯ö¯öˆ¯ö¯öz¯ös¯öl¯öe¯ö^¯öW¯öP¯öI¯öB¯ö;¯ö4¯ö-¯ö&¯ö¯ö¯ö¯ö ¯ö¯öü®öõ®öî®öç®öà®öÙ®öÒ®öË®öÄ®ö½®ö¶®ö¯®ö¨®ö¡®öš®ö“®öŒ®ö…®ö~®öw®öp®öi®öb®ö[®öT®öM®öF®ö?®ö8®ö1®ö*®ö#®ö®ö®ö®ö®ö®öù­öò­öë­öä­öÝ­öÖ­öÏ­öÈ­öÁ­öº­ö³­ö¬­ö¥­öž­ö—­ö­ö‰­ö‚­ö{­öt­öm­öf­ö_­öX­öQ­öJ­öC­ö<­ö5­ö.­ö'­ö ­ö­ö­ö ­ö­öý¬öö¬öï¬öè¬öá¬öÚ¬öÓ¬ö̬öŬö¾¬ö·¬ö°¬ö©¬ö¢¬ö›¬ö”¬ö¬ö†¬ö¬öx¬öq¬öj¬öc¬ö\¬öU¬öN¬öG¬ö@¬ö9¬ö2¬ö+¬ö$¬ö¬ö¬ö¬ö¬ö¬öú«öó«öì«öå«öÞ«ö׫öЫöÉ«ö«ö»«ö´«ö­«ö¦«öŸ«ö˜«ö‘«öŠ«öƒ«ö|«öu«ön«ög«ö`«öY«öR«öK«öD«ö=«ö6«ö/«ö(«ö!«ö«ö«ö «ö«öþªö÷ªöðªöéªöâªöÛªöÔªöͪöƪö¿ªö¸ªö±ªöªªö£ªöœªö•ªöŽªö‡ªö€ªöyªörªökªödªö]ªöVªöOªöHªöAªö:ªö3ªö,ªö%ªöªöªöªö ªöªöû©öô©öí©öæ©öß©öØ©öÑ©öÊ©öéö¼©öµ©ö®©ö§©ö ©ö™©ö’©ö‹©ö„©ö}©öv©öo©öh©öa©öZ©öS©öL©öE©ö>©ö7©ö0©ö)©ö"©ö©ö©ö ©ö©öÿ¨öø¨öñ¨öê¨öã¨öܨöÕ¨öΨöǨöÀ¨ö¹¨ö²¨ö«¨ö¤¨ö¨ö–¨ö¨öˆ¨ö¨öz¨ös¨öl¨öe¨ö^¨öW¨öP¨öI¨öB¨ö;¨ö4¨ö-¨ö&¨ö¨ö¨ö¨ö ¨ö¨öü§öõ§öî§öç§öà§öÙ§öÒ§ö˧öħö½§ö¶§ö¯§ö¨§ö¡§öš§ö“§öŒ§ö…§ö~§öw§öp§öi§öb§ö[§öT§öM§öF§ö?§ö8§ö1§ö*§ö#§ö§ö§ö§ö§ö§öù¦öò¦öë¦öä¦öݦöÖ¦öϦöȦöÁ¦öº¦ö³¦ö¬¦ö¥¦öž¦ö—¦ö¦ö‰¦ö‚¦ö{¦öt¦öm¦öf¦ö_¦öX¦öQ¦öJ¦öC¦ö<¦ö5¦ö.¦ö'¦ö ¦ö¦ö¦ö ¦ö¦öý¥öö¥öï¥öè¥öá¥öÚ¥öÓ¥öÌ¥öÅ¥ö¾¥ö·¥ö°¥ö©¥ö¢¥ö›¥ö”¥ö¥ö†¥ö¥öx¥öq¥öj¥öc¥ö\¥öU¥öN¥öG¥ö@¥ö9¥ö2¥ö+¥ö$¥ö¥ö¥ö¥ö¥ö¥öú¤öó¤öì¤öå¤öÞ¤öפöФöɤö¤ö»¤ö´¤ö­¤ö¦¤öŸ¤ö˜¤ö‘¤öФöƒ¤ö|¤öu¤ön¤ög¤ö`¤öY¤öR¤öK¤öD¤ö=¤ö6¤ö/¤ö(¤ö!¤ö¤ö¤ö ¤ö¤öþ£ö÷£öð£öé£öâ£öÛ£öÔ£öÍ£öÆ£ö¿£ö¸£ö±£öª£ö££öœ£ö•£öŽ£ö‡£ö€£öy£ör£ök£öd£ö]£öV£öO£öH£öA£ö:£ö3£ö,£ö%£ö£ö£ö£ö £ö£öû¢öô¢öí¢öæ¢öߢöØ¢öÑ¢öÊ¢öâö¼¢öµ¢ö®¢ö§¢ö ¢ö™¢ö’¢ö‹¢ö„¢ö}¢öv¢öo¢öh¢öa¢öZ¢öS¢öL¢öE¢ö>¢ö7¢ö0¢ö)¢ö"¢ö¢ö¢ö ¢ö¢öÿ¡öø¡öñ¡öê¡öã¡öÜ¡öÕ¡öΡöÇ¡öÀ¡ö¹¡ö²¡ö«¡ö¤¡ö¡ö–¡ö¡öˆ¡ö¡öz¡ös¡öl¡öe¡ö^¡öW¡öP¡öI¡öB¡ö;¡ö4¡ö-¡ö&¡ö¡ö¡ö¡ö ¡ö¡öü öõ öî öç öà öÙ öÒ öË öÄ ö½ ö¶ ö¯ ö¨ ö¡ öš ö“ öŒ ö… ö~ öw öp öi öb ö[ öT öM öF ö? ö8 ö1 ö* ö# ö ö ö ö ö öùŸöòŸöëŸöäŸöÝŸöÖŸöÏŸöÈŸöÁŸöºŸö³Ÿö¬Ÿö¥ŸöžŸö—ŸöŸö‰Ÿö‚Ÿö{ŸötŸömŸöfŸö_ŸöXŸöQŸöJŸöCŸö<Ÿö5Ÿö.Ÿö'Ÿö ŸöŸöŸö ŸöŸöýžööžöïžöèžöážöÚžöÓžöÌžöÅžö¾žö·žö°žö©žö¢žö›žö”žöžö†žöžöxžöqžöjžöcžö\žöUžöNžöGžö@žö9žö2žö+žö$žöžöžöžöžöžöúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþœö÷œöðœöéœöâœöÛœöÔœöÍœöÆœö¿œö¸œö±œöªœö£œöœœö•œöŽœö‡œö€œöyœörœökœödœö]œöVœöOœöHœöAœö:œö3œö,œö%œöœöœöœö œöœöû›öô›öí›öæ›öß›öØ›öÑ›öÊ›öÛö¼›öµ›ö®›ö§›ö ›ö™›ö’›ö‹›ö„›ö}›öv›öo›öh›öa›öZ›öS›öL›öE›ö>›ö7›ö0›ö)›ö"›ö›ö›ö ›ö›öÿšöøšöñšöêšöãšöÜšöÕšöΚöÇšöÀšö¹šö²šö«šö¤šöšö–šöšöˆšöšözšösšölšöešö^šöWšöPšöIšöBšö;šö4šö-šö&šöšöšöšö šöšöü™öõ™öî™öç™öà™öÙ™öÒ™öË™öÄ™ö½™ö¶™ö¯™ö¨™ö¡™öš™ö“™öŒ™ö…™ö~™öw™öp™öi™öb™ö[™öT™öM™öF™ö?™ö8™ö1™ö*™ö#™ö™ö™ö™ö™ö™öù˜öò˜öë˜öä˜öݘöÖ˜öϘöȘöÁ˜öº˜ö³˜ö¬˜ö¥˜öž˜ö—˜ö˜ö‰˜ö‚˜ö{˜öt˜öm˜öf˜ö_˜öX˜öQ˜öJ˜öC˜ö<˜ö5˜ö.˜ö'˜ö ˜ö˜ö˜ö ˜ö˜öý—öö—öï—öè—öá—öÚ—öÓ—öÌ—öÅ—ö¾—ö·—ö°—ö©—ö¢—ö›—ö”—ö—ö†—ö—öx—öq—öj—öc—ö\—öU—öN—öG—ö@—ö9—ö2—ö+—ö$—ö—ö—ö—ö—ö—öú–öó–öì–öå–öÞ–ö×–öЖöÉ–ö–ö»–ö´–ö­–ö¦–öŸ–ö˜–ö‘–öŠ–öƒ–ö|–öu–ön–ög–ö`–öY–öR–öK–öD–ö=–ö6–ö/–ö(–ö!–ö–ö–ö –ö–öþ•ö÷•öð•öé•öâ•öÛ•öÔ•öÍ•öÆ•ö¿•ö¸•ö±•öª•ö£•öœ•ö••öŽ•ö‡•ö€•öy•ör•ök•öd•ö]•öV•öO•öH•öA•ö:•ö3•ö,•ö%•ö•ö•ö•ö •ö•öû”öô”öí”öæ”öß”öØ”öÑ”öÊ”öÔö¼”öµ”ö®”ö§”ö ”ö™”ö’”ö‹”ö„”ö}”öv”öo”öh”öa”öZ”öS”öL”öE”ö>”ö7”ö0”ö)”ö"”ö”ö”ö ”ö”öÿ“öø“öñ“öê“öã“öÜ“öÕ“öΓöÇ“öÀ“ö¹“ö²“ö«“ö¤“ö“ö–“ö“öˆ“ö“öz“ös“öl“öe“ö^“öW“öP“öI“öB“ö;“ö4“ö-“ö&“ö“ö“ö“ö “ö“öü’öõ’öî’öç’öà’öÙ’öÒ’öË’öÄ’ö½’ö¶’ö¯’ö¨’ö¡’öš’ö“’öŒ’ö…’ö~’öw’öp’öi’öb’ö[’öT’öM’öF’ö?’ö8’ö1’ö*’ö#’ö’ö’ö’ö’ö’öù‘öò‘öë‘öä‘öÝ‘öÖ‘öÏ‘öÈ‘öÁ‘öº‘ö³‘ö¬‘ö¥‘öž‘ö—‘ö‘ö‰‘ö‚‘ö{‘öt‘öm‘öf‘ö_‘öX‘öQ‘öJ‘öC‘ö<‘ö5‘ö.‘ö'‘ö ‘ö‘ö‘ö ‘ö‘öýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþŽö÷ŽöðŽöéŽöâŽöÛŽöÔŽöÍŽöÆŽö¿Žö¸Žö±ŽöªŽö£ŽöœŽö•ŽöŽŽö‡Žö€ŽöyŽörŽökŽödŽö]ŽöVŽöOŽöHŽöAŽö:Žö3Žö,Žö%ŽöŽöŽöŽö ŽöŽöûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿŒöøŒöñŒöêŒöãŒöÜŒöÕŒöÎŒöÇŒöÀŒö¹Œö²Œö«Œö¤ŒöŒö–ŒöŒöˆŒöŒözŒösŒölŒöeŒö^ŒöWŒöPŒöIŒöBŒö;Œö4Œö-Œö&ŒöŒöŒöŒö ŒöŒöü‹öõ‹öî‹öç‹öà‹öÙ‹öÒ‹öË‹öÄ‹ö½‹ö¶‹ö¯‹ö¨‹ö¡‹öš‹ö“‹öŒ‹ö…‹ö~‹öw‹öp‹öi‹öb‹ö[‹öT‹öM‹öF‹ö?‹ö8‹ö1‹ö*‹ö#‹ö‹ö‹ö‹ö‹ö‹öùŠöòŠöëŠöäŠöÝŠöÖŠöÏŠöÈŠöÁŠöºŠö³Šö¬Šö¥ŠöžŠö—ŠöŠö‰Šö‚Šö{ŠötŠömŠöfŠö_ŠöXŠöQŠöJŠöCŠö<Šö5Šö.Šö'Šö ŠöŠöŠö ŠöŠöý‰öö‰öï‰öè‰öá‰öÚ‰öÓ‰ö̉öʼnö¾‰ö·‰ö°‰ö©‰ö¢‰ö›‰ö”‰ö‰ö†‰ö‰öx‰öq‰öj‰öc‰ö\‰öU‰öN‰öG‰ö@‰ö9‰ö2‰ö+‰ö$‰ö‰ö‰ö‰ö‰ö‰öúˆöóˆöìˆöåˆöÞˆö׈öЈöɈöˆö»ˆö´ˆö­ˆö¦ˆöŸˆö˜ˆö‘ˆöŠˆöƒˆö|ˆöuˆönˆögˆö`ˆöYˆöRˆöKˆöDˆö=ˆö6ˆö/ˆö(ˆö!ˆöˆöˆö ˆöˆöþ‡ö÷‡öð‡öé‡öâ‡öÛ‡öÔ‡ö͇öƇö¿‡ö¸‡ö±‡öª‡ö£‡öœ‡ö•‡öއö‡‡ö€‡öy‡ör‡ök‡öd‡ö]‡öV‡öO‡öH‡öA‡ö:‡ö3‡ö,‡ö%‡ö‡ö‡ö‡ö ‡ö‡öû†öô†öí†öæ†ö߆ö؆öцöʆöÆö¼†öµ†ö®†ö§†ö †ö™†ö’†ö‹†ö„†ö}†öv†öo†öh†öa†öZ†öS†öL†öE†ö>†ö7†ö0†ö)†ö"†ö†ö†ö †ö†öÿ…öø…öñ…öê…öã…öÜ…öÕ…öÎ…öÇ…öÀ…ö¹…ö²…ö«…ö¤…ö…ö–…ö…öˆ…ö…öz…ös…öl…öe…ö^…öW…öP…öI…öB…ö;…ö4…ö-…ö&…ö…ö…ö…ö …ö…öü„öõ„öî„öç„öà„öÙ„öÒ„öË„öÄ„ö½„ö¶„ö¯„ö¨„ö¡„öš„ö“„öŒ„ö…„ö~„öw„öp„öi„öb„ö[„öT„öM„öF„ö?„ö8„ö1„ö*„ö#„ö„ö„ö„ö„ö„öùƒöòƒöëƒöäƒö݃öÖƒöσöȃöÁƒöºƒö³ƒö¬ƒö¥ƒöžƒö—ƒöƒö‰ƒö‚ƒö{ƒötƒömƒöfƒö_ƒöXƒöQƒöJƒöCƒö<ƒö5ƒö.ƒö'ƒö ƒöƒöƒö ƒöƒöý‚öö‚öï‚öè‚öá‚öÚ‚öÓ‚öÌ‚öÅ‚ö¾‚ö·‚ö°‚ö©‚ö¢‚ö›‚ö”‚ö‚ö†‚ö‚öx‚öq‚öj‚öc‚ö\‚öU‚öN‚öG‚ö@‚ö9‚ö2‚ö+‚ö$‚ö‚ö‚ö‚ö‚ö‚öúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþ€ö÷€öð€öé€öâ€öÛ€öÔ€öÍ€öÆ€ö¿€ö¸€ö±€öª€ö£€öœ€ö•€öŽ€ö‡€ö€€öy€ör€ök€öd€ö]€öV€öO€öH€öA€ö:€ö3€ö,€ö%€ö€ö€ö€ö €ö€öûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿ~öø~öñ~öê~öã~öÜ~öÕ~öÎ~öÇ~öÀ~ö¹~ö²~ö«~ö¤~ö~ö–~ö~öˆ~ö~öz~ös~öl~öe~ö^~öW~öP~öI~öB~ö;~ö4~ö-~ö&~ö~ö~ö~ö ~ö~öü}öõ}öî}öç}öà}öÙ}öÒ}öË}öÄ}ö½}ö¶}ö¯}ö¨}ö¡}öš}ö“}öŒ}ö…}ö~}öw}öp}öi}öb}ö[}öT}öM}öF}ö?}ö8}ö1}ö*}ö#}ö}ö}ö}ö}ö}öù|öò|öë|öä|öÝ|öÖ|öÏ|öÈ|öÁ|öº|ö³|ö¬|ö¥|öž|ö—|ö|ö‰|ö‚|ö{|öt|öm|öf|ö_|öX|öQ|öJ|öC|ö<|ö5|ö.|ö'|ö |ö|ö|ö |ö|öý{öö{öï{öè{öá{öÚ{öÓ{öÌ{öÅ{ö¾{ö·{ö°{ö©{ö¢{ö›{ö”{ö{ö†{ö{öx{öq{öj{öc{ö\{öU{öN{öG{ö@{ö9{ö2{ö+{ö${ö{ö{ö{ö{ö{öúzöózöìzöåzöÞzö×zöÐzöÉzöÂzö»zö´zö­zö¦zöŸzö˜zö‘zöŠzöƒzö|zöuzönzögzö`zöYzöRzöKzöDzö=zö6zö/zö(zö!zözözö zözöþyö÷yöðyöéyöâyöÛyöÔyöÍyöÆyö¿yö¸yö±yöªyö£yöœyö•yöŽyö‡yö€yöyyöryökyödyö]yöVyöOyöHyöAyö:yö3yö,yö%yöyöyöyö yöyöûxöôxöíxöæxößxöØxöÑxöÊxöÃxö¼xöµxö®xö§xö xö™xö’xö‹xö„xö}xövxöoxöhxöaxöZxöSxöLxöExö>xö7xö0xö)xö"xöxöxö xöxöÿwöøwöñwöêwöãwöÜwöÕwöÎwöÇwöÀwö¹wö²wö«wö¤wöwö–wöwöˆwöwözwöswölwöewö^wöWwöPwöIwöBwö;wö4wö-wö&wöwöwöwö wöwöüvöõvöîvöçvöàvöÙvöÒvöËvöÄvö½vö¶vö¯vö¨vö¡vöšvö“vöŒvö…vö~vöwvöpvöivöbvö[vöTvöMvöFvö?vö8vö1vö*vö#vövövövövövöùuöòuöëuöäuöÝuöÖuöÏuöÈuöÁuöºuö³uö¬uö¥uöžuö—uöuö‰uö‚uö{uötuömuöfuö_uöXuöQuöJuöCuöqö7qö0qö)qö"qöqöqö qöqöÿpöøpöñpöêpöãpöÜpöÕpöÎpöÇpöÀpö¹pö²pö«pö¤pöpö–pöpöˆpöpözpöspölpöepö^pöWpöPpöIpöBpö;pö4pö-pö&pöpöpöpö pöpöüoöõoöîoöçoöàoöÙoöÒoöËoöÄoö½oö¶oö¯oö¨oö¡oöšoö“oöŒoö…oö~oöwoöpoöioöboö[oöToöMoöFoö?oö8oö1oö*oö#oöoöoöoöoöoöùnöònöënöänöÝnöÖnöÏnöÈnöÁnöºnö³nö¬nö¥nöžnö—nönö‰nö‚nö{nötnömnöfnö_nöXnöQnöJnöCnöjö7jö0jö)jö"jöjöjö jöjöÿiöøiöñiöêiöãiöÜiöÕiöÎiöÇiöÀiö¹iö²iö«iö¤iöiö–iöiöˆiöiöziösiöliöeiö^iöWiöPiöIiöBiö;iö4iö-iö&iöiöiöiö iöiöühöõhöîhöçhöàhöÙhöÒhöËhöÄhö½hö¶hö¯hö¨hö¡höšhö“höŒhö…hö~höwhöphöihöbhö[höThöMhöFhö?hö8hö1hö*hö#höhöhöhöhöhöùgöògöëgöägöÝgöÖgöÏgöÈgöÁgöºgö³gö¬gö¥göžgö—gögö‰gö‚gö{götgömgöfgö_göXgöQgöJgöCgöcö7cö0cö)cö"cöcöcö cöcöÿböøböñböêböãböÜböÕböÎböÇböÀbö¹bö²bö«bö¤böbö–böböˆböbözbösbölböebö^böWböPböIböBbö;bö4bö-bö&böböböbö böböüaöõaöîaöçaöàaöÙaöÒaöËaöÄaö½aö¶aö¯aö¨aö¡aöšaö“aöŒaö…aö~aöwaöpaöiaöbaö[aöTaöMaöFaö?aö8aö1aö*aö#aöaöaöaöaöaöù`öò`öë`öä`öÝ`öÖ`öÏ`öÈ`öÁ`öº`ö³`ö¬`ö¥`öž`ö—`ö`ö‰`ö‚`ö{`öt`öm`öf`ö_`öX`öQ`öJ`öC`ö<`ö5`ö.`ö'`ö `ö`ö`ö `ö`öý_öö_öï_öè_öá_öÚ_öÓ_öÌ_öÅ_ö¾_ö·_ö°_ö©_ö¢_ö›_ö”_ö_ö†_ö_öx_öq_öj_öc_ö\_öU_öN_öG_ö@_ö9_ö2_ö+_ö$_ö_ö_ö_ö_ö_öú^öó^öì^öå^öÞ^ö×^öÐ^öÉ^öÂ^ö»^ö´^ö­^ö¦^öŸ^ö˜^ö‘^öŠ^öƒ^ö|^öu^ön^ög^ö`^öY^öR^öK^öD^ö=^ö6^ö/^ö(^ö!^ö^ö^ö ^ö^öþ]ö÷]öð]öé]öâ]öÛ]öÔ]öÍ]öÆ]ö¿]ö¸]ö±]öª]ö£]öœ]ö•]öŽ]ö‡]ö€]öy]ör]ök]öd]ö]]öV]öO]öH]öA]ö:]ö3]ö,]ö%]ö]ö]ö]ö ]ö]öû\öô\öí\öæ\öß\öØ\öÑ\öÊ\öÃ\ö¼\öµ\ö®\ö§\ö \ö™\ö’\ö‹\ö„\ö}\öv\öo\öh\öa\öZ\öS\öL\öE\ö>\ö7\ö0\ö)\ö"\ö\ö\ö \ö\öÿ[öø[öñ[öê[öã[öÜ[öÕ[öÎ[öÇ[öÀ[ö¹[ö²[ö«[ö¤[ö[ö–[ö[öˆ[ö[öz[ös[öl[öe[ö^[öW[öP[öI[öB[ö;[ö4[ö-[ö&[ö[ö[ö[ö [ö[öüZöõZöîZöçZöàZöÙZöÒZöËZöÄZö½Zö¶Zö¯Zö¨Zö¡ZöšZö“ZöŒZö…Zö~ZöwZöpZöiZöbZö[ZöTZöMZöFZö?Zö8Zö1Zö*Zö#ZöZöZöZöZöZöùYöòYöëYöäYöÝYöÖYöÏYöÈYöÁYöºYö³Yö¬Yö¥YöžYö—YöYö‰Yö‚Yö{YötYömYöfYö_YöXYöQYöJYöCYöUö7Uö0Uö)Uö"UöUöUö UöUöÿTöøTöñTöêTöãTöÜTöÕTöÎTöÇTöÀTö¹Tö²Tö«Tö¤TöTö–TöTöˆTöTözTösTölTöeTö^TöWTöPTöITöBTö;Tö4Tö-Tö&TöTöTöTö TöTöüSöõSöîSöçSöàSöÙSöÒSöËSöÄSö½Sö¶Sö¯Sö¨Sö¡SöšSö“SöŒSö…Sö~SöwSöpSöiSöbSö[SöTSöMSöFSö?Sö8Sö1Sö*Sö#SöSöSöSöSöSöùRöòRöëRöäRöÝRöÖRöÏRöÈRöÁRöºRö³Rö¬Rö¥RöžRö—RöRö‰Rö‚Rö{RötRömRöfRö_RöXRöQRöJRöCRöNö7Nö0Nö)Nö"NöNöNö NöNöÿMöøMöñMöêMöãMöÜMöÕMöÎMöÇMöÀMö¹Mö²Mö«Mö¤MöMö–MöMöˆMöMözMösMölMöeMö^MöWMöPMöIMöBMö;Mö4Mö-Mö&MöMöMöMö MöMöüLöõLöîLöçLöàLöÙLöÒLöËLöÄLö½Lö¶Lö¯Lö¨Lö¡LöšLö“LöŒLö…Lö~LöwLöpLöiLöbLö[LöTLöMLöFLö?Lö8Lö1Lö*Lö#LöLöLöLöLöLöùKöòKöëKöäKöÝKöÖKöÏKöÈKöÁKöºKö³Kö¬Kö¥KöžKö—KöKö‰Kö‚Kö{KötKömKöfKö_KöXKöQKöJKöCKöGö7Gö0Gö)Gö"GöGöGö GöGöÿFöøFöñFöêFöãFöÜFöÕFöÎFöÇFöÀFö¹Fö²Fö«Fö¤FöFö–FöFöˆFöFözFösFölFöeFö^FöWFöPFöIFöBFö;Fö4Fö-Fö&FöFöFöFö FöFöüEöõEöîEöçEöàEöÙEöÒEöËEöÄEö½Eö¶Eö¯Eö¨Eö¡EöšEö“EöŒEö…Eö~EöwEöpEöiEöbEö[EöTEöMEöFEö?Eö8Eö1Eö*Eö#EöEöEöEöEöEöùDöòDöëDöäDöÝDöÖDöÏDöÈDöÁDöºDö³Dö¬Dö¥DöžDö—DöDö‰Dö‚Dö{DötDömDöfDö_DöXDöQDöJDöCDö@ö7@ö0@ö)@ö"@ö@ö@ö @ö@öÿ?öø?öñ?öê?öã?öÜ?öÕ?öÎ?öÇ?öÀ?ö¹?ö²?ö«?ö¤?ö?ö–?ö?öˆ?ö?öz?ös?öl?öe?ö^?öW?öP?öI?öB?ö;?ö4?ö-?ö&?ö?ö?ö?ö ?ö?öü>öõ>öî>öç>öà>öÙ>öÒ>öË>öÄ>ö½>ö¶>ö¯>ö¨>ö¡>öš>ö“>öŒ>ö…>ö~>öw>öp>öi>öb>ö[>öT>öM>öF>ö?>ö8>ö1>ö*>ö#>ö>ö>ö>ö>ö>öù=öò=öë=öä=öÝ=öÖ=öÏ=öÈ=öÁ=öº=ö³=ö¬=ö¥=öž=ö—=ö=ö‰=ö‚=ö{=öt=öm=öf=ö_=öX=öQ=öJ=öC=ö<=ö5=ö.=ö'=ö =ö=ö=ö =ö=öý<öö<öï<öè<öá<öÚ<öÓ<öÌ<öÅ<ö¾<ö·<ö°<ö©<ö¢<ö›<ö”<ö<ö†<ö<öx<öq<öj<öc<ö\<öU<öN<öG<ö@<ö9<ö2<ö+<ö$<ö<ö<ö<ö<ö<öú;öó;öì;öå;öÞ;ö×;öÐ;öÉ;öÂ;ö»;ö´;ö­;ö¦;öŸ;ö˜;ö‘;öŠ;öƒ;ö|;öu;ön;ög;ö`;öY;öR;öK;öD;ö=;ö6;ö/;ö(;ö!;ö;ö;ö ;ö;öþ:ö÷:öð:öé:öâ:öÛ:öÔ:öÍ:öÆ:ö¿:ö¸:ö±:öª:ö£:öœ:ö•:öŽ:ö‡:ö€:öy:ör:ök:öd:ö]:öV:öO:öH:öA:ö::ö3:ö,:ö%:ö:ö:ö:ö :ö:öû9öô9öí9öæ9öß9öØ9öÑ9öÊ9öÃ9ö¼9öµ9ö®9ö§9ö 9ö™9ö’9ö‹9ö„9ö}9öv9öo9öh9öa9öZ9öS9öL9öE9ö>9ö79ö09ö)9ö"9ö9ö9ö 9ö9öÿ8öø8öñ8öê8öã8öÜ8öÕ8öÎ8öÇ8öÀ8ö¹8ö²8ö«8ö¤8ö8ö–8ö8öˆ8ö8öz8ös8öl8öe8ö^8öW8öP8öI8öB8ö;8ö48ö-8ö&8ö8ö8ö8ö 8ö8öü7öõ7öî7öç7öà7öÙ7öÒ7öË7öÄ7ö½7ö¶7ö¯7ö¨7ö¡7öš7ö“7öŒ7ö…7ö~7öw7öp7öi7öb7ö[7öT7öM7öF7ö?7ö87ö17ö*7ö#7ö7ö7ö7ö7ö7öù6öò6öë6öä6öÝ6öÖ6öÏ6öÈ6öÁ6öº6ö³6ö¬6ö¥6öž6ö—6ö6ö‰6ö‚6ö{6öt6öm6öf6ö_6öX6öQ6öJ6öC6ö<6ö56ö.6ö'6ö 6ö6ö6ö 6ö6öý5öö5öï5öè5öá5öÚ5öÓ5öÌ5öÅ5ö¾5ö·5ö°5ö©5ö¢5ö›5ö”5ö5ö†5ö5öx5öq5öj5öc5ö\5öU5öN5öG5ö@5ö95ö25ö+5ö$5ö5ö5ö5ö5ö5öú4öó4öì4öå4öÞ4ö×4öÐ4öÉ4öÂ4ö»4ö´4ö­4ö¦4öŸ4ö˜4ö‘4öŠ4öƒ4ö|4öu4ön4ög4ö`4öY4öR4öK4öD4ö=4ö64ö/4ö(4ö!4ö4ö4ö 4ö4öþ3ö÷3öð3öé3öâ3öÛ3öÔ3öÍ3öÆ3ö¿3ö¸3ö±3öª3ö£3öœ3ö•3öŽ3ö‡3ö€3öy3ör3ök3öd3ö]3öV3öO3öH3öA3ö:3ö33ö,3ö%3ö3ö3ö3ö 3ö3öû2öô2öí2öæ2öß2öØ2öÑ2öÊ2öÃ2ö¼2öµ2ö®2ö§2ö 2ö™2ö’2ö‹2ö„2ö}2öv2öo2öh2öa2öZ2öS2öL2öE2ö>2ö72ö02ö)2ö"2ö2ö2ö 2ö2öÿ1öø1öñ1öê1öã1öÜ1öÕ1öÎ1öÇ1öÀ1ö¹1ö²1ö«1ö¤1ö1ö–1ö1öˆ1ö1öz1ös1öl1öe1ö^1öW1öP1öI1öB1ö;1ö41ö-1ö&1ö1ö1ö1ö 1ö1öü0öõ0öî0öç0öà0öÙ0öÒ0öË0öÄ0ö½0ö¶0ö¯0ö¨0ö¡0öš0ö“0öŒ0ö…0ö~0öw0öp0öi0öb0ö[0öT0öM0öF0ö?0ö80ö10ö*0ö#0ö0ö0ö0ö0ö0öù/öò/öë/öä/öÝ/öÖ/öÏ/öÈ/öÁ/öº/ö³/ö¬/ö¥/öž/ö—/ö/ö‰/ö‚/ö{/öt/öm/öf/ö_/öX/öQ/öJ/öC/ö+ö7+ö0+ö)+ö"+ö+ö+ö +ö+öÿ*öø*öñ*öê*öã*öÜ*öÕ*öÎ*öÇ*öÀ*ö¹*ö²*ö«*ö¤*ö*ö–*ö*öˆ*ö*öz*ös*öl*öe*ö^*öW*öP*öI*öB*ö;*ö4*ö-*ö&*ö*ö*ö*ö *ö*öü)öõ)öî)öç)öà)öÙ)öÒ)öË)öÄ)ö½)ö¶)ö¯)ö¨)ö¡)öš)ö“)öŒ)ö…)ö~)öw)öp)öi)öb)ö[)öT)öM)öF)ö?)ö8)ö1)ö*)ö#)ö)ö)ö)ö)ö)öù(öò(öë(öä(öÝ(öÖ(öÏ(öÈ(öÁ(öº(ö³(ö¬(ö¥(öž(ö—(ö(ö‰(ö‚(ö{(öt(öm(öf(ö_(öX(öQ(öJ(öC(ö<(ö5(ö.(ö'(ö (ö(ö(ö (ö(öý'öö'öï'öè'öá'öÚ'öÓ'öÌ'öÅ'ö¾'ö·'ö°'ö©'ö¢'ö›'ö”'ö'ö†'ö'öx'öq'öj'öc'ö\'öU'öN'öG'ö@'ö9'ö2'ö+'ö$'ö'ö'ö'ö'ö'öú&öó&öì&öå&öÞ&ö×&öÐ&öÉ&öÂ&ö»&ö´&ö­&ö¦&öŸ&ö˜&ö‘&öŠ&öƒ&ö|&öu&ön&ög&ö`&öY&öR&öK&öD&ö=&ö6&ö/&ö(&ö!&ö&ö&ö &ö&öþ%ö÷%öð%öé%öâ%öÛ%öÔ%öÍ%öÆ%ö¿%ö¸%ö±%öª%ö£%öœ%ö•%öŽ%ö‡%ö€%öy%ör%ök%öd%ö]%öV%öO%öH%öA%ö:%ö3%ö,%ö%%ö%ö%ö%ö %ö%öû$öô$öí$öæ$öß$öØ$öÑ$öÊ$öÃ$ö¼$öµ$ö®$ö§$ö $ö™$ö’$ö‹$ö„$ö}$öv$öo$öh$öa$öZ$öS$öL$öE$ö>$ö7$ö0$ö)$ö"$ö$ö$ö $ö$öÿ#öø#öñ#öê#öã#öÜ#öÕ#öÎ#öÇ#öÀ#ö¹#ö²#ö«#ö¤#ö#ö–#ö#öˆ#ö#öz#ös#öl#öe#ö^#öW#öP#öI#öB#ö;#ö4#ö-#ö&#ö#ö#ö#ö #ö#öü"öõ"öî"öç"öà"öÙ"öÒ"öË"öÄ"ö½"ö¶"ö¯"ö¨"ö¡"öš"ö“"öŒ"ö…"ö~"öw"öp"öi"öb"ö["öT"öM"öF"ö?"ö8"ö1"ö*"ö#"ö"ö"ö"ö"ö"öù!öò!öë!öä!öÝ!öÖ!öÏ!öÈ!öÁ!öº!ö³!ö¬!ö¥!öž!ö—!ö!ö‰!ö‚!ö{!öt!öm!öf!ö_!öX!öQ!öJ!öC!öö7ö0ö)ö"ööö ööÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööü öõ öî öç öà öÙ öÒ öË öÄ ö½ ö¶ ö¯ ö¨ ö¡ öš ö“ öŒ ö… ö~ öw öp öi öb ö[ öT öM öF ö? ö8 ö1 ö* ö# ö ö ö ö ö öù öò öë öä öÝ öÖ öÏ öÈ öÁ öº ö³ ö¬ ö¥ öž ö— ö ö‰ ö‚ ö{ öt öm öf ö_ öX öQ öJ öC ö< ö5 ö. ö' ö ö ö ö ö öý öö öï öè öá öÚ öÓ öÌ öÅ ö¾ ö· ö° ö© ö¢ ö› ö” ö ö† ö öx öq öj öc ö\ öU öN öG ö@ ö9 ö2 ö+ ö$ ö ö ö ö ö öú öó öì öå öÞ ö× öÐ öÉ ö ö» ö´ ö­ ö¦ öŸ ö˜ ö‘ öŠ öƒ ö| öu ön ög ö` öY öR öK öD ö= ö6 ö/ ö( ö! ö ö ö ö öþ ö÷ öð öé öâ öÛ öÔ öÍ öÆ ö¿ ö¸ ö± öª ö£ öœ ö• öŽ ö‡ ö€ öy ör ök öd ö] öV öO öH öA ö: ö3 ö, ö% ö ö ö ö ö öûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüÿõõÿõîÿõçÿõàÿõÙÿõÒÿõËÿõÄÿõ½ÿõ¶ÿõ¯ÿõ¨ÿõ¡ÿõšÿõ“ÿõŒÿõ…ÿõ~ÿõwÿõpÿõiÿõbÿõ[ÿõTÿõMÿõFÿõ?ÿõ8ÿõ1ÿõ*ÿõ#ÿõÿõÿõÿõÿõÿõùþõòþõëþõäþõÝþõÖþõÏþõÈþõÁþõºþõ³þõ¬þõ¥þõžþõ—þõþõ‰þõ‚þõ{þõtþõmþõfþõ_þõXþõQþõJþõCþõ<þõ5þõ.þõ'þõ þõþõþõ þõþõýýõöýõïýõèýõáýõÚýõÓýõÌýõÅýõ¾ýõ·ýõ°ýõ©ýõ¢ýõ›ýõ”ýõýõ†ýõýõxýõqýõjýõcýõ\ýõUýõNýõGýõ@ýõ9ýõ2ýõ+ýõ$ýõýõýõýõýõýõúüõóüõìüõåüõÞüõ×üõÐüõÉüõÂüõ»üõ´üõ­üõ¦üõŸüõ˜üõ‘üõŠüõƒüõ|üõuüõnüõgüõ`üõYüõRüõKüõDüõ=üõ6üõ/üõ(üõ!üõüõüõ üõüõþûõ÷ûõðûõéûõâûõÛûõÔûõÍûõÆûõ¿ûõ¸ûõ±ûõªûõ£ûõœûõ•ûõŽûõ‡ûõ€ûõyûõrûõkûõdûõ]ûõVûõOûõHûõAûõ:ûõ3ûõ,ûõ%ûõûõûõûõ ûõûõûúõôúõíúõæúõßúõØúõÑúõÊúõÃúõ¼úõµúõ®úõ§úõ úõ™úõ’úõ‹úõ„úõ}úõvúõoúõhúõaúõZúõSúõLúõEúõ>úõ7úõ0úõ)úõ"úõúõúõ úõúõÿùõøùõñùõêùõãùõÜùõÕùõÎùõÇùõÀùõ¹ùõ²ùõ«ùõ¤ùõùõ–ùõùõˆùõùõzùõsùõlùõeùõ^ùõWùõPùõIùõBùõ;ùõ4ùõ-ùõ&ùõùõùõùõ ùõùõüøõõøõîøõçøõàøõÙøõÒøõËøõÄøõ½øõ¶øõ¯øõ¨øõ¡øõšøõ“øõŒøõ…øõ~øõwøõpøõiøõbøõ[øõTøõMøõFøõ?øõ8øõ1øõ*øõ#øõøõøõøõøõøõù÷õò÷õë÷õä÷õÝ÷õÖ÷õÏ÷õÈ÷õÁ÷õº÷õ³÷õ¬÷õ¥÷õž÷õ—÷õ÷õ‰÷õ‚÷õ{÷õt÷õm÷õf÷õ_÷õX÷õQ÷õJ÷õC÷õ<÷õ5÷õ.÷õ'÷õ ÷õ÷õ÷õ ÷õ÷õýöõööõïöõèöõáöõÚöõÓöõÌöõÅöõ¾öõ·öõ°öõ©öõ¢öõ›öõ”öõöõ†öõöõxöõqöõjöõcöõ\öõUöõNöõGöõ@öõ9öõ2öõ+öõ$öõöõöõöõöõöõúõõóõõìõõåõõÞõõ×õõÐõõÉõõÂõõ»õõ´õõ­õõ¦õõŸõõ˜õõ‘õõŠõõƒõõ|õõuõõnõõgõõ`õõYõõRõõKõõDõõ=õõ6õõ/õõ(õõ!õõõõõõ õõõõþôõ÷ôõðôõéôõâôõÛôõÔôõÍôõÆôõ¿ôõ¸ôõ±ôõªôõ£ôõœôõ•ôõŽôõ‡ôõ€ôõyôõrôõkôõdôõ]ôõVôõOôõHôõAôõ:ôõ3ôõ,ôõ%ôõôõôõôõ ôõôõûóõôóõíóõæóõßóõØóõÑóõÊóõÃóõ¼óõµóõ®óõ§óõ óõ™óõ’óõ‹óõ„óõ}óõvóõoóõhóõaóõZóõSóõLóõEóõ>óõ7óõ0óõ)óõ"óõóõóõ óõóõÿòõøòõñòõêòõãòõÜòõÕòõÎòõÇòõÀòõ¹òõ²òõ«òõ¤òõòõ–òõòõˆòõòõzòõsòõlòõeòõ^òõWòõPòõIòõBòõ;òõ4òõ-òõ&òõòõòõòõ òõòõüñõõñõîñõçñõàñõÙñõÒñõËñõÄñõ½ñõ¶ñõ¯ñõ¨ñõ¡ñõšñõ“ñõŒñõ…ñõ~ñõwñõpñõiñõbñõ[ñõTñõMñõFñõ?ñõ8ñõ1ñõ*ñõ#ñõñõñõñõñõñõùðõòðõëðõäðõÝðõÖðõÏðõÈðõÁðõºðõ³ðõ¬ðõ¥ðõžðõ—ðõðõ‰ðõ‚ðõ{ðõtðõmðõfðõ_ðõXðõQðõJðõCðõ<ðõ5ðõ.ðõ'ðõ ðõðõðõ ðõðõýïõöïõïïõèïõáïõÚïõÓïõÌïõÅïõ¾ïõ·ïõ°ïõ©ïõ¢ïõ›ïõ”ïõïõ†ïõïõxïõqïõjïõcïõ\ïõUïõNïõGïõ@ïõ9ïõ2ïõ+ïõ$ïõïõïõïõïõïõúîõóîõìîõåîõÞîõ×îõÐîõÉîõÂîõ»îõ´îõ­îõ¦îõŸîõ˜îõ‘îõŠîõƒîõ|îõuîõnîõgîõ`îõYîõRîõKîõDîõ=îõ6îõ/îõ(îõ!îõîõîõ îõîõþíõ÷íõðíõéíõâíõÛíõÔíõÍíõÆíõ¿íõ¸íõ±íõªíõ£íõœíõ•íõŽíõ‡íõ€íõyíõríõkíõdíõ]íõVíõOíõHíõAíõ:íõ3íõ,íõ%íõíõíõíõ íõíõûìõôìõíìõæìõßìõØìõÑìõÊìõÃìõ¼ìõµìõ®ìõ§ìõ ìõ™ìõ’ìõ‹ìõ„ìõ}ìõvìõoìõhìõaìõZìõSìõLìõEìõ>ìõ7ìõ0ìõ)ìõ"ìõìõìõ ìõìõÿëõøëõñëõêëõãëõÜëõÕëõÎëõÇëõÀëõ¹ëõ²ëõ«ëõ¤ëõëõ–ëõëõˆëõëõzëõsëõlëõeëõ^ëõWëõPëõIëõBëõ;ëõ4ëõ-ëõ&ëõëõëõëõ ëõëõüêõõêõîêõçêõàêõÙêõÒêõËêõÄêõ½êõ¶êõ¯êõ¨êõ¡êõšêõ“êõŒêõ…êõ~êõwêõpêõiêõbêõ[êõTêõMêõFêõ?êõ8êõ1êõ*êõ#êõêõêõêõêõêõùéõòéõëéõäéõÝéõÖéõÏéõÈéõÁéõºéõ³éõ¬éõ¥éõžéõ—éõéõ‰éõ‚éõ{éõtéõméõféõ_éõXéõQéõJéõCéõ<éõ5éõ.éõ'éõ éõéõéõ éõéõýèõöèõïèõèèõáèõÚèõÓèõÌèõÅèõ¾èõ·èõ°èõ©èõ¢èõ›èõ”èõèõ†èõèõxèõqèõjèõcèõ\èõUèõNèõGèõ@èõ9èõ2èõ+èõ$èõèõèõèõèõèõúçõóçõìçõåçõÞçõ×çõÐçõÉçõÂçõ»çõ´çõ­çõ¦çõŸçõ˜çõ‘çõŠçõƒçõ|çõuçõnçõgçõ`çõYçõRçõKçõDçõ=çõ6çõ/çõ(çõ!çõçõçõ çõçõþæõ÷æõðæõéæõâæõÛæõÔæõÍæõÆæõ¿æõ¸æõ±æõªæõ£æõœæõ•æõŽæõ‡æõ€æõyæõræõkæõdæõ]æõVæõOæõHæõAæõ:æõ3æõ,æõ%æõæõæõæõ æõæõûåõôåõíåõæåõßåõØåõÑåõÊåõÃåõ¼åõµåõ®åõ§åõ åõ™åõ’åõ‹åõ„åõ}åõvåõoåõhåõaåõZåõSåõLåõEåõ>åõ7åõ0åõ)åõ"åõåõåõ åõåõÿäõøäõñäõêäõãäõÜäõÕäõÎäõÇäõÀäõ¹äõ²äõ«äõ¤äõäõ–äõäõˆäõäõzäõsäõläõeäõ^äõWäõPäõIäõBäõ;äõ4äõ-äõ&äõäõäõäõ äõäõüãõõãõîãõçãõàãõÙãõÒãõËãõÄãõ½ãõ¶ãõ¯ãõ¨ãõ¡ãõšãõ“ãõŒãõ…ãõ~ãõwãõpãõiãõbãõ[ãõTãõMãõFãõ?ãõ8ãõ1ãõ*ãõ#ãõãõãõãõãõãõùâõòâõëâõäâõÝâõÖâõÏâõÈâõÁâõºâõ³âõ¬âõ¥âõžâõ—âõâõ‰âõ‚âõ{âõtâõmâõfâõ_âõXâõQâõJâõCâõ<âõ5âõ.âõ'âõ âõâõâõ âõâõýáõöáõïáõèáõááõÚáõÓáõÌáõÅáõ¾áõ·áõ°áõ©áõ¢áõ›áõ”áõáõ†áõáõxáõqáõjáõcáõ\áõUáõNáõGáõ@áõ9áõ2áõ+áõ$áõáõáõáõáõáõúàõóàõìàõåàõÞàõ×àõÐàõÉàõÂàõ»àõ´àõ­àõ¦àõŸàõ˜àõ‘àõŠàõƒàõ|àõuàõnàõgàõ`àõYàõRàõKàõDàõ=àõ6àõ/àõ(àõ!àõàõàõ àõàõþßõ÷ßõðßõéßõâßõÛßõÔßõÍßõÆßõ¿ßõ¸ßõ±ßõªßõ£ßõœßõ•ßõŽßõ‡ßõ€ßõyßõrßõkßõdßõ]ßõVßõOßõHßõAßõ:ßõ3ßõ,ßõ%ßõßõßõßõ ßõßõûÞõôÞõíÞõæÞõßÞõØÞõÑÞõÊÞõÃÞõ¼ÞõµÞõ®Þõ§Þõ Þõ™Þõ’Þõ‹Þõ„Þõ}ÞõvÞõoÞõhÞõaÞõZÞõSÞõLÞõEÞõ>Þõ7Þõ0Þõ)Þõ"ÞõÞõÞõ ÞõÞõÿÝõøÝõñÝõêÝõãÝõÜÝõÕÝõÎÝõÇÝõÀÝõ¹Ýõ²Ýõ«Ýõ¤ÝõÝõ–ÝõÝõˆÝõÝõzÝõsÝõlÝõeÝõ^ÝõWÝõPÝõIÝõBÝõ;Ýõ4Ýõ-Ýõ&ÝõÝõÝõÝõ ÝõÝõüÜõõÜõîÜõçÜõàÜõÙÜõÒÜõËÜõÄÜõ½Üõ¶Üõ¯Üõ¨Üõ¡ÜõšÜõ“ÜõŒÜõ…Üõ~ÜõwÜõpÜõiÜõbÜõ[ÜõTÜõMÜõFÜõ?Üõ8Üõ1Üõ*Üõ#ÜõÜõÜõÜõÜõÜõùÛõòÛõëÛõäÛõÝÛõÖÛõÏÛõÈÛõÁÛõºÛõ³Ûõ¬Ûõ¥ÛõžÛõ—ÛõÛõ‰Ûõ‚Ûõ{ÛõtÛõmÛõfÛõ_ÛõXÛõQÛõJÛõCÛõ<Ûõ5Ûõ.Ûõ'Ûõ ÛõÛõÛõ ÛõÛõýÚõöÚõïÚõèÚõáÚõÚÚõÓÚõÌÚõÅÚõ¾Úõ·Úõ°Úõ©Úõ¢Úõ›Úõ”ÚõÚõ†ÚõÚõxÚõqÚõjÚõcÚõ\ÚõUÚõNÚõGÚõ@Úõ9Úõ2Úõ+Úõ$ÚõÚõÚõÚõÚõÚõúÙõóÙõìÙõåÙõÞÙõ×ÙõÐÙõÉÙõÂÙõ»Ùõ´Ùõ­Ùõ¦ÙõŸÙõ˜Ùõ‘ÙõŠÙõƒÙõ|ÙõuÙõnÙõgÙõ`ÙõYÙõRÙõKÙõDÙõ=Ùõ6Ùõ/Ùõ(Ùõ!ÙõÙõÙõ ÙõÙõþØõ÷ØõðØõéØõâØõÛØõÔØõÍØõÆØõ¿Øõ¸Øõ±ØõªØõ£ØõœØõ•ØõŽØõ‡Øõ€ØõyØõrØõkØõdØõ]ØõVØõOØõHØõAØõ:Øõ3Øõ,Øõ%ØõØõØõØõ ØõØõû×õô×õí×õæ×õß×õØ×õÑ×õÊ×õÃ×õ¼×õµ×õ®×õ§×õ ×õ™×õ’×õ‹×õ„×õ}×õv×õo×õh×õa×õZ×õS×õL×õE×õ>×õ7×õ0×õ)×õ"×õ×õ×õ ×õ×õÿÖõøÖõñÖõêÖõãÖõÜÖõÕÖõÎÖõÇÖõÀÖõ¹Öõ²Öõ«Öõ¤ÖõÖõ–ÖõÖõˆÖõÖõzÖõsÖõlÖõeÖõ^ÖõWÖõPÖõIÖõBÖõ;Öõ4Öõ-Öõ&ÖõÖõÖõÖõ ÖõÖõüÕõõÕõîÕõçÕõàÕõÙÕõÒÕõËÕõÄÕõ½Õõ¶Õõ¯Õõ¨Õõ¡ÕõšÕõ“ÕõŒÕõ…Õõ~ÕõwÕõpÕõiÕõbÕõ[ÕõTÕõMÕõFÕõ?Õõ8Õõ1Õõ*Õõ#ÕõÕõÕõÕõÕõÕõùÔõòÔõëÔõäÔõÝÔõÖÔõÏÔõÈÔõÁÔõºÔõ³Ôõ¬Ôõ¥ÔõžÔõ—ÔõÔõ‰Ôõ‚Ôõ{ÔõtÔõmÔõfÔõ_ÔõXÔõQÔõJÔõCÔõ<Ôõ5Ôõ.Ôõ'Ôõ ÔõÔõÔõ ÔõÔõýÓõöÓõïÓõèÓõáÓõÚÓõÓÓõÌÓõÅÓõ¾Óõ·Óõ°Óõ©Óõ¢Óõ›Óõ”ÓõÓõ†ÓõÓõxÓõqÓõjÓõcÓõ\ÓõUÓõNÓõGÓõ@Óõ9Óõ2Óõ+Óõ$ÓõÓõÓõÓõÓõÓõúÒõóÒõìÒõåÒõÞÒõ×ÒõÐÒõÉÒõÂÒõ»Òõ´Òõ­Òõ¦ÒõŸÒõ˜Òõ‘ÒõŠÒõƒÒõ|ÒõuÒõnÒõgÒõ`ÒõYÒõRÒõKÒõDÒõ=Òõ6Òõ/Òõ(Òõ!ÒõÒõÒõ ÒõÒõþÑõ÷ÑõðÑõéÑõâÑõÛÑõÔÑõÍÑõÆÑõ¿Ñõ¸Ñõ±ÑõªÑõ£ÑõœÑõ•ÑõŽÑõ‡Ñõ€ÑõyÑõrÑõkÑõdÑõ]ÑõVÑõOÑõHÑõAÑõ:Ñõ3Ñõ,Ñõ%ÑõÑõÑõÑõ ÑõÑõûÐõôÐõíÐõæÐõßÐõØÐõÑÐõÊÐõÃÐõ¼ÐõµÐõ®Ðõ§Ðõ Ðõ™Ðõ’Ðõ‹Ðõ„Ðõ}ÐõvÐõoÐõhÐõaÐõZÐõSÐõLÐõEÐõ>Ðõ7Ðõ0Ðõ)Ðõ"ÐõÐõÐõ ÐõÐõÿÏõøÏõñÏõêÏõãÏõÜÏõÕÏõÎÏõÇÏõÀÏõ¹Ïõ²Ïõ«Ïõ¤ÏõÏõ–ÏõÏõˆÏõÏõzÏõsÏõlÏõeÏõ^ÏõWÏõPÏõIÏõBÏõ;Ïõ4Ïõ-Ïõ&ÏõÏõÏõÏõ ÏõÏõüÎõõÎõîÎõçÎõàÎõÙÎõÒÎõËÎõÄÎõ½Îõ¶Îõ¯Îõ¨Îõ¡ÎõšÎõ“ÎõŒÎõ…Îõ~ÎõwÎõpÎõiÎõbÎõ[ÎõTÎõMÎõFÎõ?Îõ8Îõ1Îõ*Îõ#ÎõÎõÎõÎõÎõÎõùÍõòÍõëÍõäÍõÝÍõÖÍõÏÍõÈÍõÁÍõºÍõ³Íõ¬Íõ¥ÍõžÍõ—ÍõÍõ‰Íõ‚Íõ{ÍõtÍõmÍõfÍõ_ÍõXÍõQÍõJÍõCÍõ<Íõ5Íõ.Íõ'Íõ ÍõÍõÍõ ÍõÍõýÌõöÌõïÌõèÌõáÌõÚÌõÓÌõÌÌõÅÌõ¾Ìõ·Ìõ°Ìõ©Ìõ¢Ìõ›Ìõ”ÌõÌõ†ÌõÌõxÌõqÌõjÌõcÌõ\ÌõUÌõNÌõGÌõ@Ìõ9Ìõ2Ìõ+Ìõ$ÌõÌõÌõÌõÌõÌõúËõóËõìËõåËõÞËõ×ËõÐËõÉËõÂËõ»Ëõ´Ëõ­Ëõ¦ËõŸËõ˜Ëõ‘ËõŠËõƒËõ|ËõuËõnËõgËõ`ËõYËõRËõKËõDËõ=Ëõ6Ëõ/Ëõ(Ëõ!ËõËõËõ ËõËõþÊõ÷ÊõðÊõéÊõâÊõÛÊõÔÊõÍÊõÆÊõ¿Êõ¸Êõ±ÊõªÊõ£ÊõœÊõ•ÊõŽÊõ‡Êõ€ÊõyÊõrÊõkÊõdÊõ]ÊõVÊõOÊõHÊõAÊõ:Êõ3Êõ,Êõ%ÊõÊõÊõÊõ ÊõÊõûÉõôÉõíÉõæÉõßÉõØÉõÑÉõÊÉõÃÉõ¼ÉõµÉõ®Éõ§Éõ Éõ™Éõ’Éõ‹Éõ„Éõ}ÉõvÉõoÉõhÉõaÉõZÉõSÉõLÉõEÉõ>Éõ7Éõ0Éõ)Éõ"ÉõÉõÉõ ÉõÉõÿÈõøÈõñÈõêÈõãÈõÜÈõÕÈõÎÈõÇÈõÀÈõ¹Èõ²Èõ«Èõ¤ÈõÈõ–ÈõÈõˆÈõÈõzÈõsÈõlÈõeÈõ^ÈõWÈõPÈõIÈõBÈõ;Èõ4Èõ-Èõ&ÈõÈõÈõÈõ ÈõÈõüÇõõÇõîÇõçÇõàÇõÙÇõÒÇõËÇõÄÇõ½Çõ¶Çõ¯Çõ¨Çõ¡ÇõšÇõ“ÇõŒÇõ…Çõ~ÇõwÇõpÇõiÇõbÇõ[ÇõTÇõMÇõFÇõ?Çõ8Çõ1Çõ*Çõ#ÇõÇõÇõÇõÇõÇõùÆõòÆõëÆõäÆõÝÆõÖÆõÏÆõÈÆõÁÆõºÆõ³Æõ¬Æõ¥ÆõžÆõ—ÆõÆõ‰Æõ‚Æõ{ÆõtÆõmÆõfÆõ_ÆõXÆõQÆõJÆõCÆõ<Æõ5Æõ.Æõ'Æõ ÆõÆõÆõ ÆõÆõýÅõöÅõïÅõèÅõáÅõÚÅõÓÅõÌÅõÅÅõ¾Åõ·Åõ°Åõ©Åõ¢Åõ›Åõ”ÅõÅõ†ÅõÅõxÅõqÅõjÅõcÅõ\ÅõUÅõNÅõGÅõ@Åõ9Åõ2Åõ+Åõ$ÅõÅõÅõÅõÅõÅõúÄõóÄõìÄõåÄõÞÄõ×ÄõÐÄõÉÄõÂÄõ»Äõ´Äõ­Äõ¦ÄõŸÄõ˜Äõ‘ÄõŠÄõƒÄõ|ÄõuÄõnÄõgÄõ`ÄõYÄõRÄõKÄõDÄõ=Äõ6Äõ/Äõ(Äõ!ÄõÄõÄõ ÄõÄõþÃõ÷ÃõðÃõéÃõâÃõÛÃõÔÃõÍÃõÆÃõ¿Ãõ¸Ãõ±ÃõªÃõ£ÃõœÃõ•ÃõŽÃõ‡Ãõ€ÃõyÃõrÃõkÃõdÃõ]ÃõVÃõOÃõHÃõAÃõ:Ãõ3Ãõ,Ãõ%ÃõÃõÃõÃõ ÃõÃõûÂõôÂõíÂõæÂõßÂõØÂõÑÂõÊÂõÃÂõ¼ÂõµÂõ®Âõ§Âõ Âõ™Âõ’Âõ‹Âõ„Âõ}ÂõvÂõoÂõhÂõaÂõZÂõSÂõLÂõEÂõ>Âõ7Âõ0Âõ)Âõ"ÂõÂõÂõ ÂõÂõÿÁõøÁõñÁõêÁõãÁõÜÁõÕÁõÎÁõÇÁõÀÁõ¹Áõ²Áõ«Áõ¤ÁõÁõ–ÁõÁõˆÁõÁõzÁõsÁõlÁõeÁõ^ÁõWÁõPÁõIÁõBÁõ;Áõ4Áõ-Áõ&ÁõÁõÁõÁõ ÁõÁõüÀõõÀõîÀõçÀõàÀõÙÀõÒÀõËÀõÄÀõ½Àõ¶Àõ¯Àõ¨Àõ¡ÀõšÀõ“ÀõŒÀõ…Àõ~ÀõwÀõpÀõiÀõbÀõ[ÀõTÀõMÀõFÀõ?Àõ8Àõ1Àõ*Àõ#ÀõÀõÀõÀõÀõÀõù¿õò¿õë¿õä¿õÝ¿õÖ¿õÏ¿õÈ¿õÁ¿õº¿õ³¿õ¬¿õ¥¿õž¿õ—¿õ¿õ‰¿õ‚¿õ{¿õt¿õm¿õf¿õ_¿õX¿õQ¿õJ¿õC¿õ<¿õ5¿õ.¿õ'¿õ ¿õ¿õ¿õ ¿õ¿õý¾õö¾õï¾õè¾õá¾õÚ¾õÓ¾õ̾õžõ¾¾õ·¾õ°¾õ©¾õ¢¾õ›¾õ”¾õ¾õ†¾õ¾õx¾õq¾õj¾õc¾õ\¾õU¾õN¾õG¾õ@¾õ9¾õ2¾õ+¾õ$¾õ¾õ¾õ¾õ¾õ¾õú½õó½õì½õå½õÞ½õ×½õнõɽõ½õ»½õ´½õ­½õ¦½õŸ½õ˜½õ‘½õнõƒ½õ|½õu½õn½õg½õ`½õY½õR½õK½õD½õ=½õ6½õ/½õ(½õ!½õ½õ½õ ½õ½õþ¼õ÷¼õð¼õé¼õâ¼õÛ¼õÔ¼õͼõƼõ¿¼õ¸¼õ±¼õª¼õ£¼õœ¼õ•¼õ޼õ‡¼õ€¼õy¼õr¼õk¼õd¼õ]¼õV¼õO¼õH¼õA¼õ:¼õ3¼õ,¼õ%¼õ¼õ¼õ¼õ ¼õ¼õû»õô»õí»õæ»õß»õØ»õÑ»õÊ»õûõ¼»õµ»õ®»õ§»õ »õ™»õ’»õ‹»õ„»õ}»õv»õo»õh»õa»õZ»õS»õL»õE»õ>»õ7»õ0»õ)»õ"»õ»õ»õ »õ»õÿºõøºõñºõêºõãºõܺõÕºõκõǺõÀºõ¹ºõ²ºõ«ºõ¤ºõºõ–ºõºõˆºõºõzºõsºõlºõeºõ^ºõWºõPºõIºõBºõ;ºõ4ºõ-ºõ&ºõºõºõºõ ºõºõü¹õõ¹õî¹õç¹õà¹õÙ¹õÒ¹õ˹õĹõ½¹õ¶¹õ¯¹õ¨¹õ¡¹õš¹õ“¹õŒ¹õ…¹õ~¹õw¹õp¹õi¹õb¹õ[¹õT¹õM¹õF¹õ?¹õ8¹õ1¹õ*¹õ#¹õ¹õ¹õ¹õ¹õ¹õù¸õò¸õë¸õä¸õݸõÖ¸õϸõȸõÁ¸õº¸õ³¸õ¬¸õ¥¸õž¸õ—¸õ¸õ‰¸õ‚¸õ{¸õt¸õm¸õf¸õ_¸õX¸õQ¸õJ¸õC¸õ<¸õ5¸õ.¸õ'¸õ ¸õ¸õ¸õ ¸õ¸õý·õö·õï·õè·õá·õÚ·õÓ·õÌ·õÅ·õ¾·õ··õ°·õ©·õ¢·õ›·õ”·õ·õ†·õ·õx·õq·õj·õc·õ\·õU·õN·õG·õ@·õ9·õ2·õ+·õ$·õ·õ·õ·õ·õ·õú¶õó¶õì¶õå¶õÞ¶õ×¶õжõɶõ¶õ»¶õ´¶õ­¶õ¦¶õŸ¶õ˜¶õ‘¶õжõƒ¶õ|¶õu¶õn¶õg¶õ`¶õY¶õR¶õK¶õD¶õ=¶õ6¶õ/¶õ(¶õ!¶õ¶õ¶õ ¶õ¶õþµõ÷µõðµõéµõâµõÛµõÔµõ͵õƵõ¿µõ¸µõ±µõªµõ£µõœµõ•µõ޵õ‡µõ€µõyµõrµõkµõdµõ]µõVµõOµõHµõAµõ:µõ3µõ,µõ%µõµõµõµõ µõµõû´õô´õí´õæ´õß´õØ´õÑ´õÊ´õôõ¼´õµ´õ®´õ§´õ ´õ™´õ’´õ‹´õ„´õ}´õv´õo´õh´õa´õZ´õS´õL´õE´õ>´õ7´õ0´õ)´õ"´õ´õ´õ ´õ´õÿ³õø³õñ³õê³õã³õܳõÕ³õγõdzõÀ³õ¹³õ²³õ«³õ¤³õ³õ–³õ³õˆ³õ³õz³õs³õl³õe³õ^³õW³õP³õI³õB³õ;³õ4³õ-³õ&³õ³õ³õ³õ ³õ³õü²õõ²õî²õç²õà²õÙ²õÒ²õ˲õIJõ½²õ¶²õ¯²õ¨²õ¡²õš²õ“²õŒ²õ…²õ~²õw²õp²õi²õb²õ[²õT²õM²õF²õ?²õ8²õ1²õ*²õ#²õ²õ²õ²õ²õ²õù±õò±õë±õä±õݱõÖ±õϱõȱõÁ±õº±õ³±õ¬±õ¥±õž±õ—±õ±õ‰±õ‚±õ{±õt±õm±õf±õ_±õX±õQ±õJ±õC±õ<±õ5±õ.±õ'±õ ±õ±õ±õ ±õ±õý°õö°õï°õè°õá°õÚ°õÓ°õ̰õŰõ¾°õ·°õ°°õ©°õ¢°õ›°õ”°õ°õ†°õ°õx°õq°õj°õc°õ\°õU°õN°õG°õ@°õ9°õ2°õ+°õ$°õ°õ°õ°õ°õ°õú¯õó¯õì¯õå¯õÞ¯õׯõЯõɯõ¯õ»¯õ´¯õ­¯õ¦¯õŸ¯õ˜¯õ‘¯õНõƒ¯õ|¯õu¯õn¯õg¯õ`¯õY¯õR¯õK¯õD¯õ=¯õ6¯õ/¯õ(¯õ!¯õ¯õ¯õ ¯õ¯õþ®õ÷®õð®õé®õâ®õÛ®õÔ®õÍ®õÆ®õ¿®õ¸®õ±®õª®õ£®õœ®õ•®õŽ®õ‡®õ€®õy®õr®õk®õd®õ]®õV®õO®õH®õA®õ:®õ3®õ,®õ%®õ®õ®õ®õ ®õ®õû­õô­õí­õæ­õß­õØ­õÑ­õÊ­õíõ¼­õµ­õ®­õ§­õ ­õ™­õ’­õ‹­õ„­õ}­õv­õo­õh­õa­õZ­õS­õL­õE­õ>­õ7­õ0­õ)­õ"­õ­õ­õ ­õ­õÿ¬õø¬õñ¬õê¬õã¬õܬõÕ¬õάõǬõÀ¬õ¹¬õ²¬õ«¬õ¤¬õ¬õ–¬õ¬õˆ¬õ¬õz¬õs¬õl¬õe¬õ^¬õW¬õP¬õI¬õB¬õ;¬õ4¬õ-¬õ&¬õ¬õ¬õ¬õ ¬õ¬õü«õõ«õî«õç«õà«õÙ«õÒ«õË«õÄ«õ½«õ¶«õ¯«õ¨«õ¡«õš«õ“«õŒ«õ…«õ~«õw«õp«õi«õb«õ[«õT«õM«õF«õ?«õ8«õ1«õ*«õ#«õ«õ«õ«õ«õ«õùªõòªõëªõäªõݪõÖªõϪõȪõÁªõºªõ³ªõ¬ªõ¥ªõžªõ—ªõªõ‰ªõ‚ªõ{ªõtªõmªõfªõ_ªõXªõQªõJªõCªõ<ªõ5ªõ.ªõ'ªõ ªõªõªõ ªõªõý©õö©õï©õè©õá©õÚ©õÓ©õÌ©õÅ©õ¾©õ·©õ°©õ©©õ¢©õ›©õ”©õ©õ†©õ©õx©õq©õj©õc©õ\©õU©õN©õG©õ@©õ9©õ2©õ+©õ$©õ©õ©õ©õ©õ©õú¨õó¨õì¨õå¨õÞ¨õרõШõɨõ¨õ»¨õ´¨õ­¨õ¦¨õŸ¨õ˜¨õ‘¨õЍõƒ¨õ|¨õu¨õn¨õg¨õ`¨õY¨õR¨õK¨õD¨õ=¨õ6¨õ/¨õ(¨õ!¨õ¨õ¨õ ¨õ¨õþ§õ÷§õð§õé§õâ§õÛ§õÔ§õͧõƧõ¿§õ¸§õ±§õª§õ£§õœ§õ•§õާõ‡§õ€§õy§õr§õk§õd§õ]§õV§õO§õH§õA§õ:§õ3§õ,§õ%§õ§õ§õ§õ §õ§õû¦õô¦õí¦õæ¦õߦõئõѦõʦõæõ¼¦õµ¦õ®¦õ§¦õ ¦õ™¦õ’¦õ‹¦õ„¦õ}¦õv¦õo¦õh¦õa¦õZ¦õS¦õL¦õE¦õ>¦õ7¦õ0¦õ)¦õ"¦õ¦õ¦õ ¦õ¦õÿ¥õø¥õñ¥õê¥õã¥õÜ¥õÕ¥õÎ¥õÇ¥õÀ¥õ¹¥õ²¥õ«¥õ¤¥õ¥õ–¥õ¥õˆ¥õ¥õz¥õs¥õl¥õe¥õ^¥õW¥õP¥õI¥õB¥õ;¥õ4¥õ-¥õ&¥õ¥õ¥õ¥õ ¥õ¥õü¤õõ¤õî¤õç¤õà¤õÙ¤õÒ¤õˤõĤõ½¤õ¶¤õ¯¤õ¨¤õ¡¤õš¤õ“¤õŒ¤õ…¤õ~¤õw¤õp¤õi¤õb¤õ[¤õT¤õM¤õF¤õ?¤õ8¤õ1¤õ*¤õ#¤õ¤õ¤õ¤õ¤õ¤õù£õò£õë£õä£õÝ£õÖ£õÏ£õÈ£õÁ£õº£õ³£õ¬£õ¥£õž£õ—£õ£õ‰£õ‚£õ{£õt£õm£õf£õ_£õX£õQ£õJ£õC£õ<£õ5£õ.£õ'£õ £õ£õ£õ £õ£õý¢õö¢õï¢õè¢õá¢õÚ¢õÓ¢õÌ¢õÅ¢õ¾¢õ·¢õ°¢õ©¢õ¢¢õ›¢õ”¢õ¢õ†¢õ¢õx¢õq¢õj¢õc¢õ\¢õU¢õN¢õG¢õ@¢õ9¢õ2¢õ+¢õ$¢õ¢õ¢õ¢õ¢õ¢õú¡õó¡õì¡õå¡õÞ¡õסõСõÉ¡õ¡õ»¡õ´¡õ­¡õ¦¡õŸ¡õ˜¡õ‘¡õŠ¡õƒ¡õ|¡õu¡õn¡õg¡õ`¡õY¡õR¡õK¡õD¡õ=¡õ6¡õ/¡õ(¡õ!¡õ¡õ¡õ ¡õ¡õþ õ÷ õð õé õâ õÛ õÔ õÍ õÆ õ¿ õ¸ õ± õª õ£ õœ õ• õŽ õ‡ õ€ õy õr õk õd õ] õV õO õH õA õ: õ3 õ, õ% õ õ õ õ  õ õûŸõôŸõíŸõæŸõߟõØŸõÑŸõÊŸõßõ¼ŸõµŸõ®Ÿõ§Ÿõ Ÿõ™Ÿõ’Ÿõ‹Ÿõ„Ÿõ}ŸõvŸõoŸõhŸõaŸõZŸõSŸõLŸõEŸõ>Ÿõ7Ÿõ0Ÿõ)Ÿõ"ŸõŸõŸõ ŸõŸõÿžõøžõñžõêžõãžõÜžõÕžõΞõÇžõÀžõ¹žõ²žõ«žõ¤žõžõ–žõžõˆžõžõzžõsžõlžõežõ^žõWžõPžõIžõBžõ;žõ4žõ-žõ&žõžõžõžõ žõžõüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùœõòœõëœõäœõÝœõÖœõÏœõÈœõÁœõºœõ³œõ¬œõ¥œõžœõ—œõœõ‰œõ‚œõ{œõtœõmœõfœõ_œõXœõQœõJœõCœõ<œõ5œõ.œõ'œõ œõœõœõ œõœõý›õö›õï›õè›õá›õÚ›õÓ›õÌ›õÅ›õ¾›õ·›õ°›õ©›õ¢›õ››õ”›õ›õ†›õ›õx›õq›õj›õc›õ\›õU›õN›õG›õ@›õ9›õ2›õ+›õ$›õ›õ›õ›õ›õ›õúšõóšõìšõåšõÞšõךõКõÉšõšõ»šõ´šõ­šõ¦šõŸšõ˜šõ‘šõŠšõƒšõ|šõušõnšõgšõ`šõYšõRšõKšõDšõ=šõ6šõ/šõ(šõ!šõšõšõ šõšõþ™õ÷™õð™õé™õâ™õÛ™õÔ™õÍ™õÆ™õ¿™õ¸™õ±™õª™õ£™õœ™õ•™õŽ™õ‡™õ€™õy™õr™õk™õd™õ]™õV™õO™õH™õA™õ:™õ3™õ,™õ%™õ™õ™õ™õ ™õ™õû˜õô˜õí˜õæ˜õߘõؘõјõʘõØõ¼˜õµ˜õ®˜õ§˜õ ˜õ™˜õ’˜õ‹˜õ„˜õ}˜õv˜õo˜õh˜õa˜õZ˜õS˜õL˜õE˜õ>˜õ7˜õ0˜õ)˜õ"˜õ˜õ˜õ ˜õ˜õÿ—õø—õñ—õê—õã—õÜ—õÕ—õΗõÇ—õÀ—õ¹—õ²—õ«—õ¤—õ—õ–—õ—õˆ—õ—õz—õs—õl—õe—õ^—õW—õP—õI—õB—õ;—õ4—õ-—õ&—õ—õ—õ—õ —õ—õü–õõ–õî–õç–õà–õÙ–õÒ–õË–õÄ–õ½–õ¶–õ¯–õ¨–õ¡–õš–õ“–õŒ–õ…–õ~–õw–õp–õi–õb–õ[–õT–õM–õF–õ?–õ8–õ1–õ*–õ#–õ–õ–õ–õ–õ–õù•õò•õë•õä•õÝ•õÖ•õÏ•õÈ•õÁ•õº•õ³•õ¬•õ¥•õž•õ—•õ•õ‰•õ‚•õ{•õt•õm•õf•õ_•õX•õQ•õJ•õC•õ<•õ5•õ.•õ'•õ •õ•õ•õ •õ•õý”õö”õï”õè”õá”õÚ”õÓ”õÌ”õÅ”õ¾”õ·”õ°”õ©”õ¢”õ›”õ””õ”õ†”õ”õx”õq”õj”õc”õ\”õU”õN”õG”õ@”õ9”õ2”õ+”õ$”õ”õ”õ”õ”õ”õú“õó“õì“õå“õÞ“õדõГõÉ“õ“õ»“õ´“õ­“õ¦“õŸ“õ˜“õ‘“õŠ“õƒ“õ|“õu“õn“õg“õ`“õY“õR“õK“õD“õ=“õ6“õ/“õ(“õ!“õ“õ“õ “õ“õþ’õ÷’õð’õé’õâ’õÛ’õÔ’õÍ’õÆ’õ¿’õ¸’õ±’õª’õ£’õœ’õ•’õŽ’õ‡’õ€’õy’õr’õk’õd’õ]’õV’õO’õH’õA’õ:’õ3’õ,’õ%’õ’õ’õ’õ ’õ’õû‘õô‘õí‘õæ‘õß‘õØ‘õÑ‘õÊ‘õÑõ¼‘õµ‘õ®‘õ§‘õ ‘õ™‘õ’‘õ‹‘õ„‘õ}‘õv‘õo‘õh‘õa‘õZ‘õS‘õL‘õE‘õ>‘õ7‘õ0‘õ)‘õ"‘õ‘õ‘õ ‘õ‘õÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùŽõòŽõëŽõäŽõÝŽõÖŽõÏŽõÈŽõÁŽõºŽõ³Žõ¬Žõ¥ŽõžŽõ—ŽõŽõ‰Žõ‚Žõ{ŽõtŽõmŽõfŽõ_ŽõXŽõQŽõJŽõCŽõ<Žõ5Žõ.Žõ'Žõ ŽõŽõŽõ ŽõŽõýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúŒõóŒõìŒõåŒõÞŒõ׌õÐŒõÉŒõÂŒõ»Œõ´Œõ­Œõ¦ŒõŸŒõ˜Œõ‘ŒõŠŒõƒŒõ|ŒõuŒõnŒõgŒõ`ŒõYŒõRŒõKŒõDŒõ=Œõ6Œõ/Œõ(Œõ!ŒõŒõŒõ ŒõŒõþ‹õ÷‹õð‹õé‹õâ‹õÛ‹õÔ‹õÍ‹õÆ‹õ¿‹õ¸‹õ±‹õª‹õ£‹õœ‹õ•‹õŽ‹õ‡‹õ€‹õy‹õr‹õk‹õd‹õ]‹õV‹õO‹õH‹õA‹õ:‹õ3‹õ,‹õ%‹õ‹õ‹õ‹õ ‹õ‹õûŠõôŠõíŠõæŠõߊõØŠõÑŠõÊŠõÊõ¼ŠõµŠõ®Šõ§Šõ Šõ™Šõ’Šõ‹Šõ„Šõ}ŠõvŠõoŠõhŠõaŠõZŠõSŠõLŠõEŠõ>Šõ7Šõ0Šõ)Šõ"ŠõŠõŠõ ŠõŠõÿ‰õø‰õñ‰õê‰õã‰õ܉õÕ‰õΉõljõÀ‰õ¹‰õ²‰õ«‰õ¤‰õ‰õ–‰õ‰õˆ‰õ‰õz‰õs‰õl‰õe‰õ^‰õW‰õP‰õI‰õB‰õ;‰õ4‰õ-‰õ&‰õ‰õ‰õ‰õ ‰õ‰õüˆõõˆõîˆõçˆõàˆõÙˆõÒˆõˈõĈõ½ˆõ¶ˆõ¯ˆõ¨ˆõ¡ˆõšˆõ“ˆõŒˆõ…ˆõ~ˆõwˆõpˆõiˆõbˆõ[ˆõTˆõMˆõFˆõ?ˆõ8ˆõ1ˆõ*ˆõ#ˆõˆõˆõˆõˆõˆõù‡õò‡õë‡õä‡õ݇õÖ‡õχõȇõÁ‡õº‡õ³‡õ¬‡õ¥‡õž‡õ—‡õ‡õ‰‡õ‚‡õ{‡õt‡õm‡õf‡õ_‡õX‡õQ‡õJ‡õC‡õ<‡õ5‡õ.‡õ'‡õ ‡õ‡õ‡õ ‡õ‡õý†õö†õï†õè†õá†õÚ†õÓ†õ̆õņõ¾†õ·†õ°†õ©†õ¢†õ›†õ”†õ†õ††õ†õx†õq†õj†õc†õ\†õU†õN†õG†õ@†õ9†õ2†õ+†õ$†õ†õ†õ†õ†õ†õú…õó…õì…õå…õÞ…õ×…õÐ…õÉ…õÂ…õ»…õ´…õ­…õ¦…õŸ…õ˜…õ‘…õŠ…õƒ…õ|…õu…õn…õg…õ`…õY…õR…õK…õD…õ=…õ6…õ/…õ(…õ!…õ…õ…õ …õ…õþ„õ÷„õð„õé„õâ„õÛ„õÔ„õÍ„õÆ„õ¿„õ¸„õ±„õª„õ£„õœ„õ•„õŽ„õ‡„õ€„õy„õr„õk„õd„õ]„õV„õO„õH„õA„õ:„õ3„õ,„õ%„õ„õ„õ„õ „õ„õûƒõôƒõíƒõæƒõ߃õ؃õуõʃõÃõ¼ƒõµƒõ®ƒõ§ƒõ ƒõ™ƒõ’ƒõ‹ƒõ„ƒõ}ƒõvƒõoƒõhƒõaƒõZƒõSƒõLƒõEƒõ>ƒõ7ƒõ0ƒõ)ƒõ"ƒõƒõƒõ ƒõƒõÿ‚õø‚õñ‚õê‚õã‚õÜ‚õÕ‚õ΂õÇ‚õÀ‚õ¹‚õ²‚õ«‚õ¤‚õ‚õ–‚õ‚õˆ‚õ‚õz‚õs‚õl‚õe‚õ^‚õW‚õP‚õI‚õB‚õ;‚õ4‚õ-‚õ&‚õ‚õ‚õ‚õ ‚õ‚õüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõù€õò€õë€õä€õÝ€õÖ€õÏ€õÈ€õÁ€õº€õ³€õ¬€õ¥€õž€õ—€õ€õ‰€õ‚€õ{€õt€õm€õf€õ_€õX€õQ€õJ€õC€õ<€õ5€õ.€õ'€õ €õ€õ€õ €õ€õýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõú~õó~õì~õå~õÞ~õ×~õÐ~õÉ~õÂ~õ»~õ´~õ­~õ¦~õŸ~õ˜~õ‘~õŠ~õƒ~õ|~õu~õn~õg~õ`~õY~õR~õK~õD~õ=~õ6~õ/~õ(~õ!~õ~õ~õ ~õ~õþ}õ÷}õð}õé}õâ}õÛ}õÔ}õÍ}õÆ}õ¿}õ¸}õ±}õª}õ£}õœ}õ•}õŽ}õ‡}õ€}õy}õr}õk}õd}õ]}õV}õO}õH}õA}õ:}õ3}õ,}õ%}õ}õ}õ}õ }õ}õû|õô|õí|õæ|õß|õØ|õÑ|õÊ|õÃ|õ¼|õµ|õ®|õ§|õ |õ™|õ’|õ‹|õ„|õ}|õv|õo|õh|õa|õZ|õS|õL|õE|õ>|õ7|õ0|õ)|õ"|õ|õ|õ |õ|õÿ{õø{õñ{õê{õã{õÜ{õÕ{õÎ{õÇ{õÀ{õ¹{õ²{õ«{õ¤{õ{õ–{õ{õˆ{õ{õz{õs{õl{õe{õ^{õW{õP{õI{õB{õ;{õ4{õ-{õ&{õ{õ{õ{õ {õ{õüzõõzõîzõçzõàzõÙzõÒzõËzõÄzõ½zõ¶zõ¯zõ¨zõ¡zõšzõ“zõŒzõ…zõ~zõwzõpzõizõbzõ[zõTzõMzõFzõ?zõ8zõ1zõ*zõ#zõzõzõzõzõzõùyõòyõëyõäyõÝyõÖyõÏyõÈyõÁyõºyõ³yõ¬yõ¥yõžyõ—yõyõ‰yõ‚yõ{yõtyõmyõfyõ_yõXyõQyõJyõCyõuõ7uõ0uõ)uõ"uõuõuõ uõuõÿtõøtõñtõêtõãtõÜtõÕtõÎtõÇtõÀtõ¹tõ²tõ«tõ¤tõtõ–tõtõˆtõtõztõstõltõetõ^tõWtõPtõItõBtõ;tõ4tõ-tõ&tõtõtõtõ tõtõüsõõsõîsõçsõàsõÙsõÒsõËsõÄsõ½sõ¶sõ¯sõ¨sõ¡sõšsõ“sõŒsõ…sõ~sõwsõpsõisõbsõ[sõTsõMsõFsõ?sõ8sõ1sõ*sõ#sõsõsõsõsõsõùrõòrõërõärõÝrõÖrõÏrõÈrõÁrõºrõ³rõ¬rõ¥rõžrõ—rõrõ‰rõ‚rõ{rõtrõmrõfrõ_rõXrõQrõJrõCrõnõ7nõ0nõ)nõ"nõnõnõ nõnõÿmõømõñmõêmõãmõÜmõÕmõÎmõÇmõÀmõ¹mõ²mõ«mõ¤mõmõ–mõmõˆmõmõzmõsmõlmõemõ^mõWmõPmõImõBmõ;mõ4mõ-mõ&mõmõmõmõ mõmõülõõlõîlõçlõàlõÙlõÒlõËlõÄlõ½lõ¶lõ¯lõ¨lõ¡lõšlõ“lõŒlõ…lõ~lõwlõplõilõblõ[lõTlõMlõFlõ?lõ8lõ1lõ*lõ#lõlõlõlõlõlõùkõòkõëkõäkõÝkõÖkõÏkõÈkõÁkõºkõ³kõ¬kõ¥kõžkõ—kõkõ‰kõ‚kõ{kõtkõmkõfkõ_kõXkõQkõJkõCkõgõ7gõ0gõ)gõ"gõgõgõ gõgõÿfõøfõñfõêfõãfõÜfõÕfõÎfõÇfõÀfõ¹fõ²fõ«fõ¤fõfõ–fõfõˆfõfõzfõsfõlfõefõ^fõWfõPfõIfõBfõ;fõ4fõ-fõ&fõfõfõfõ fõfõüeõõeõîeõçeõàeõÙeõÒeõËeõÄeõ½eõ¶eõ¯eõ¨eõ¡eõšeõ“eõŒeõ…eõ~eõweõpeõieõbeõ[eõTeõMeõFeõ?eõ8eõ1eõ*eõ#eõeõeõeõeõeõùdõòdõëdõädõÝdõÖdõÏdõÈdõÁdõºdõ³dõ¬dõ¥dõždõ—dõdõ‰dõ‚dõ{dõtdõmdõfdõ_dõXdõQdõJdõCdõ`õ7`õ0`õ)`õ"`õ`õ`õ `õ`õÿ_õø_õñ_õê_õã_õÜ_õÕ_õÎ_õÇ_õÀ_õ¹_õ²_õ«_õ¤_õ_õ–_õ_õˆ_õ_õz_õs_õl_õe_õ^_õW_õP_õI_õB_õ;_õ4_õ-_õ&_õ_õ_õ_õ _õ_õü^õõ^õî^õç^õà^õÙ^õÒ^õË^õÄ^õ½^õ¶^õ¯^õ¨^õ¡^õš^õ“^õŒ^õ…^õ~^õw^õp^õi^õb^õ[^õT^õM^õF^õ?^õ8^õ1^õ*^õ#^õ^õ^õ^õ^õ^õù]õò]õë]õä]õÝ]õÖ]õÏ]õÈ]õÁ]õº]õ³]õ¬]õ¥]õž]õ—]õ]õ‰]õ‚]õ{]õt]õm]õf]õ_]õX]õQ]õJ]õC]õ<]õ5]õ.]õ']õ ]õ]õ]õ ]õ]õý\õö\õï\õè\õá\õÚ\õÓ\õÌ\õÅ\õ¾\õ·\õ°\õ©\õ¢\õ›\õ”\õ\õ†\õ\õx\õq\õj\õc\õ\\õU\õN\õG\õ@\õ9\õ2\õ+\õ$\õ\õ\õ\õ\õ\õú[õó[õì[õå[õÞ[õ×[õÐ[õÉ[õÂ[õ»[õ´[õ­[õ¦[õŸ[õ˜[õ‘[õŠ[õƒ[õ|[õu[õn[õg[õ`[õY[õR[õK[õD[õ=[õ6[õ/[õ([õ![õ[õ[õ [õ[õþZõ÷ZõðZõéZõâZõÛZõÔZõÍZõÆZõ¿Zõ¸Zõ±ZõªZõ£ZõœZõ•ZõŽZõ‡Zõ€ZõyZõrZõkZõdZõ]ZõVZõOZõHZõAZõ:Zõ3Zõ,Zõ%ZõZõZõZõ ZõZõûYõôYõíYõæYõßYõØYõÑYõÊYõÃYõ¼YõµYõ®Yõ§Yõ Yõ™Yõ’Yõ‹Yõ„Yõ}YõvYõoYõhYõaYõZYõSYõLYõEYõ>Yõ7Yõ0Yõ)Yõ"YõYõYõ YõYõÿXõøXõñXõêXõãXõÜXõÕXõÎXõÇXõÀXõ¹Xõ²Xõ«Xõ¤XõXõ–XõXõˆXõXõzXõsXõlXõeXõ^XõWXõPXõIXõBXõ;Xõ4Xõ-Xõ&XõXõXõXõ XõXõüWõõWõîWõçWõàWõÙWõÒWõËWõÄWõ½Wõ¶Wõ¯Wõ¨Wõ¡WõšWõ“WõŒWõ…Wõ~WõwWõpWõiWõbWõ[WõTWõMWõFWõ?Wõ8Wõ1Wõ*Wõ#WõWõWõWõWõWõùVõòVõëVõäVõÝVõÖVõÏVõÈVõÁVõºVõ³Võ¬Võ¥VõžVõ—VõVõ‰Võ‚Võ{VõtVõmVõfVõ_VõXVõQVõJVõCVõRõ7Rõ0Rõ)Rõ"RõRõRõ RõRõÿQõøQõñQõêQõãQõÜQõÕQõÎQõÇQõÀQõ¹Qõ²Qõ«Qõ¤QõQõ–QõQõˆQõQõzQõsQõlQõeQõ^QõWQõPQõIQõBQõ;Qõ4Qõ-Qõ&QõQõQõQõ QõQõüPõõPõîPõçPõàPõÙPõÒPõËPõÄPõ½Põ¶Põ¯Põ¨Põ¡PõšPõ“PõŒPõ…Põ~PõwPõpPõiPõbPõ[PõTPõMPõFPõ?Põ8Põ1Põ*Põ#PõPõPõPõPõPõùOõòOõëOõäOõÝOõÖOõÏOõÈOõÁOõºOõ³Oõ¬Oõ¥OõžOõ—OõOõ‰Oõ‚Oõ{OõtOõmOõfOõ_OõXOõQOõJOõCOõKõ7Kõ0Kõ)Kõ"KõKõKõ KõKõÿJõøJõñJõêJõãJõÜJõÕJõÎJõÇJõÀJõ¹Jõ²Jõ«Jõ¤JõJõ–JõJõˆJõJõzJõsJõlJõeJõ^JõWJõPJõIJõBJõ;Jõ4Jõ-Jõ&JõJõJõJõ JõJõüIõõIõîIõçIõàIõÙIõÒIõËIõÄIõ½Iõ¶Iõ¯Iõ¨Iõ¡IõšIõ“IõŒIõ…Iõ~IõwIõpIõiIõbIõ[IõTIõMIõFIõ?Iõ8Iõ1Iõ*Iõ#IõIõIõIõIõIõùHõòHõëHõäHõÝHõÖHõÏHõÈHõÁHõºHõ³Hõ¬Hõ¥HõžHõ—HõHõ‰Hõ‚Hõ{HõtHõmHõfHõ_HõXHõQHõJHõCHõDõ7Dõ0Dõ)Dõ"DõDõDõ DõDõÿCõøCõñCõêCõãCõÜCõÕCõÎCõÇCõÀCõ¹Cõ²Cõ«Cõ¤CõCõ–CõCõˆCõCõzCõsCõlCõeCõ^CõWCõPCõICõBCõ;Cõ4Cõ-Cõ&CõCõCõCõ CõCõüBõõBõîBõçBõàBõÙBõÒBõËBõÄBõ½Bõ¶Bõ¯Bõ¨Bõ¡BõšBõ“BõŒBõ…Bõ~BõwBõpBõiBõbBõ[BõTBõMBõFBõ?Bõ8Bõ1Bõ*Bõ#BõBõBõBõBõBõùAõòAõëAõäAõÝAõÖAõÏAõÈAõÁAõºAõ³Aõ¬Aõ¥AõžAõ—AõAõ‰Aõ‚Aõ{AõtAõmAõfAõ_AõXAõQAõJAõCAõõ÷>õð>õé>õâ>õÛ>õÔ>õÍ>õÆ>õ¿>õ¸>õ±>õª>õ£>õœ>õ•>õŽ>õ‡>õ€>õy>õr>õk>õd>õ]>õV>õO>õH>õA>õ:>õ3>õ,>õ%>õ>õ>õ>õ >õ>õû=õô=õí=õæ=õß=õØ=õÑ=õÊ=õÃ=õ¼=õµ=õ®=õ§=õ =õ™=õ’=õ‹=õ„=õ}=õv=õo=õh=õa=õZ=õS=õL=õE=õ>=õ7=õ0=õ)=õ"=õ=õ=õ =õ=õÿ<õø<õñ<õê<õã<õÜ<õÕ<õÎ<õÇ<õÀ<õ¹<õ²<õ«<õ¤<õ<õ–<õ<õˆ<õ<õz<õs<õl<õe<õ^<õW<õP<õI<õB<õ;<õ4<õ-<õ&<õ<õ<õ<õ <õ<õü;õõ;õî;õç;õà;õÙ;õÒ;õË;õÄ;õ½;õ¶;õ¯;õ¨;õ¡;õš;õ“;õŒ;õ…;õ~;õw;õp;õi;õb;õ[;õT;õM;õF;õ?;õ8;õ1;õ*;õ#;õ;õ;õ;õ;õ;õù:õò:õë:õä:õÝ:õÖ:õÏ:õÈ:õÁ:õº:õ³:õ¬:õ¥:õž:õ—:õ:õ‰:õ‚:õ{:õt:õm:õf:õ_:õX:õQ:õJ:õC:õ<:õ5:õ.:õ':õ :õ:õ:õ :õ:õý9õö9õï9õè9õá9õÚ9õÓ9õÌ9õÅ9õ¾9õ·9õ°9õ©9õ¢9õ›9õ”9õ9õ†9õ9õx9õq9õj9õc9õ\9õU9õN9õG9õ@9õ99õ29õ+9õ$9õ9õ9õ9õ9õ9õú8õó8õì8õå8õÞ8õ×8õÐ8õÉ8õÂ8õ»8õ´8õ­8õ¦8õŸ8õ˜8õ‘8õŠ8õƒ8õ|8õu8õn8õg8õ`8õY8õR8õK8õD8õ=8õ68õ/8õ(8õ!8õ8õ8õ 8õ8õþ7õ÷7õð7õé7õâ7õÛ7õÔ7õÍ7õÆ7õ¿7õ¸7õ±7õª7õ£7õœ7õ•7õŽ7õ‡7õ€7õy7õr7õk7õd7õ]7õV7õO7õH7õA7õ:7õ37õ,7õ%7õ7õ7õ7õ 7õ7õû6õô6õí6õæ6õß6õØ6õÑ6õÊ6õÃ6õ¼6õµ6õ®6õ§6õ 6õ™6õ’6õ‹6õ„6õ}6õv6õo6õh6õa6õZ6õS6õL6õE6õ>6õ76õ06õ)6õ"6õ6õ6õ 6õ6õÿ5õø5õñ5õê5õã5õÜ5õÕ5õÎ5õÇ5õÀ5õ¹5õ²5õ«5õ¤5õ5õ–5õ5õˆ5õ5õz5õs5õl5õe5õ^5õW5õP5õI5õB5õ;5õ45õ-5õ&5õ5õ5õ5õ 5õ5õü4õõ4õî4õç4õà4õÙ4õÒ4õË4õÄ4õ½4õ¶4õ¯4õ¨4õ¡4õš4õ“4õŒ4õ…4õ~4õw4õp4õi4õb4õ[4õT4õM4õF4õ?4õ84õ14õ*4õ#4õ4õ4õ4õ4õ4õù3õò3õë3õä3õÝ3õÖ3õÏ3õÈ3õÁ3õº3õ³3õ¬3õ¥3õž3õ—3õ3õ‰3õ‚3õ{3õt3õm3õf3õ_3õX3õQ3õJ3õC3õ<3õ53õ.3õ'3õ 3õ3õ3õ 3õ3õý2õö2õï2õè2õá2õÚ2õÓ2õÌ2õÅ2õ¾2õ·2õ°2õ©2õ¢2õ›2õ”2õ2õ†2õ2õx2õq2õj2õc2õ\2õU2õN2õG2õ@2õ92õ22õ+2õ$2õ2õ2õ2õ2õ2õú1õó1õì1õå1õÞ1õ×1õÐ1õÉ1õÂ1õ»1õ´1õ­1õ¦1õŸ1õ˜1õ‘1õŠ1õƒ1õ|1õu1õn1õg1õ`1õY1õR1õK1õD1õ=1õ61õ/1õ(1õ!1õ1õ1õ 1õ1õþ0õ÷0õð0õé0õâ0õÛ0õÔ0õÍ0õÆ0õ¿0õ¸0õ±0õª0õ£0õœ0õ•0õŽ0õ‡0õ€0õy0õr0õk0õd0õ]0õV0õO0õH0õA0õ:0õ30õ,0õ%0õ0õ0õ0õ 0õ0õû/õô/õí/õæ/õß/õØ/õÑ/õÊ/õÃ/õ¼/õµ/õ®/õ§/õ /õ™/õ’/õ‹/õ„/õ}/õv/õo/õh/õa/õZ/õS/õL/õE/õ>/õ7/õ0/õ)/õ"/õ/õ/õ /õ/õÿ.õø.õñ.õê.õã.õÜ.õÕ.õÎ.õÇ.õÀ.õ¹.õ².õ«.õ¤.õ.õ–.õ.õˆ.õ.õz.õs.õl.õe.õ^.õW.õP.õI.õB.õ;.õ4.õ-.õ&.õ.õ.õ.õ .õ.õü-õõ-õî-õç-õà-õÙ-õÒ-õË-õÄ-õ½-õ¶-õ¯-õ¨-õ¡-õš-õ“-õŒ-õ…-õ~-õw-õp-õi-õb-õ[-õT-õM-õF-õ?-õ8-õ1-õ*-õ#-õ-õ-õ-õ-õ-õù,õò,õë,õä,õÝ,õÖ,õÏ,õÈ,õÁ,õº,õ³,õ¬,õ¥,õž,õ—,õ,õ‰,õ‚,õ{,õt,õm,õf,õ_,õX,õQ,õJ,õC,õ<,õ5,õ.,õ',õ ,õ,õ,õ ,õ,õý+õö+õï+õè+õá+õÚ+õÓ+õÌ+õÅ+õ¾+õ·+õ°+õ©+õ¢+õ›+õ”+õ+õ†+õ+õx+õq+õj+õc+õ\+õU+õN+õG+õ@+õ9+õ2+õ++õ$+õ+õ+õ+õ+õ+õú*õó*õì*õå*õÞ*õ×*õÐ*õÉ*õÂ*õ»*õ´*õ­*õ¦*õŸ*õ˜*õ‘*õŠ*õƒ*õ|*õu*õn*õg*õ`*õY*õR*õK*õD*õ=*õ6*õ/*õ(*õ!*õ*õ*õ *õ*õþ)õ÷)õð)õé)õâ)õÛ)õÔ)õÍ)õÆ)õ¿)õ¸)õ±)õª)õ£)õœ)õ•)õŽ)õ‡)õ€)õy)õr)õk)õd)õ])õV)õO)õH)õA)õ:)õ3)õ,)õ%)õ)õ)õ)õ )õ)õû(õô(õí(õæ(õß(õØ(õÑ(õÊ(õÃ(õ¼(õµ(õ®(õ§(õ (õ™(õ’(õ‹(õ„(õ}(õv(õo(õh(õa(õZ(õS(õL(õE(õ>(õ7(õ0(õ)(õ"(õ(õ(õ (õ(õÿ'õø'õñ'õê'õã'õÜ'õÕ'õÎ'õÇ'õÀ'õ¹'õ²'õ«'õ¤'õ'õ–'õ'õˆ'õ'õz'õs'õl'õe'õ^'õW'õP'õI'õB'õ;'õ4'õ-'õ&'õ'õ'õ'õ 'õ'õü&õõ&õî&õç&õà&õÙ&õÒ&õË&õÄ&õ½&õ¶&õ¯&õ¨&õ¡&õš&õ“&õŒ&õ…&õ~&õw&õp&õi&õb&õ[&õT&õM&õF&õ?&õ8&õ1&õ*&õ#&õ&õ&õ&õ&õ&õù%õò%õë%õä%õÝ%õÖ%õÏ%õÈ%õÁ%õº%õ³%õ¬%õ¥%õž%õ—%õ%õ‰%õ‚%õ{%õt%õm%õf%õ_%õX%õQ%õJ%õC%õ<%õ5%õ.%õ'%õ %õ%õ%õ %õ%õý$õö$õï$õè$õá$õÚ$õÓ$õÌ$õÅ$õ¾$õ·$õ°$õ©$õ¢$õ›$õ”$õ$õ†$õ$õx$õq$õj$õc$õ\$õU$õN$õG$õ@$õ9$õ2$õ+$õ$$õ$õ$õ$õ$õ$õú#õó#õì#õå#õÞ#õ×#õÐ#õÉ#õÂ#õ»#õ´#õ­#õ¦#õŸ#õ˜#õ‘#õŠ#õƒ#õ|#õu#õn#õg#õ`#õY#õR#õK#õD#õ=#õ6#õ/#õ(#õ!#õ#õ#õ #õ#õþ"õ÷"õð"õé"õâ"õÛ"õÔ"õÍ"õÆ"õ¿"õ¸"õ±"õª"õ£"õœ"õ•"õŽ"õ‡"õ€"õy"õr"õk"õd"õ]"õV"õO"õH"õA"õ:"õ3"õ,"õ%"õ"õ"õ"õ "õ"õû!õô!õí!õæ!õß!õØ!õÑ!õÊ!õÃ!õ¼!õµ!õ®!õ§!õ !õ™!õ’!õ‹!õ„!õ}!õv!õo!õh!õa!õZ!õS!õL!õE!õ>!õ7!õ0!õ)!õ"!õ!õ!õ !õ!õÿ õø õñ õê õã õÜ õÕ õÎ õÇ õÀ õ¹ õ² õ« õ¤ õ õ– õ õˆ õ õz õs õl õe õ^ õW õP õI õB õ; õ4 õ- õ& õ õ õ õ õ õüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþ õ÷ õð õé õâ õÛ õÔ õÍ õÆ õ¿ õ¸ õ± õª õ£ õœ õ• õŽ õ‡ õ€ õy õr õk õd õ] õV õO õH õA õ: õ3 õ, õ% õ õ õ õ õ õû õô õí õæ õß õØ õÑ õÊ õà õ¼ õµ õ® õ§ õ  õ™ õ’ õ‹ õ„ õ} õv õo õh õa õZ õS õL õE õ> õ7 õ0 õ) õ" õ õ õ õ õÿ õø õñ õê õã õÜ õÕ õÎ õÇ õÀ õ¹ õ² õ« õ¤ õ õ– õ õˆ õ õz õs õl õe õ^ õW õP õI õB õ; õ4 õ- õ& õ õ õ õ õ õü õõ õî õç õà õÙ õÒ õË õÄ õ½ õ¶ õ¯ õ¨ õ¡ õš õ“ õŒ õ… õ~ õw õp õi õb õ[ õT õM õF õ? õ8 õ1 õ* õ# õ õ õ õ õ õù õò õë õä õÝ õÖ õÏ õÈ õÁ õº õ³ õ¬ õ¥ õž õ— õ õ‰ õ‚ õ{ õt õm õf õ_ õX õQ õJ õC õ< õ5 õ. õ' õ õ õ õ õ õýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþÿô÷ÿôðÿôéÿôâÿôÛÿôÔÿôÍÿôÆÿô¿ÿô¸ÿô±ÿôªÿô£ÿôœÿô•ÿôŽÿô‡ÿô€ÿôyÿôrÿôkÿôdÿô]ÿôVÿôOÿôHÿôAÿô:ÿô3ÿô,ÿô%ÿôÿôÿôÿô ÿôÿôûþôôþôíþôæþôßþôØþôÑþôÊþôÃþô¼þôµþô®þô§þô þô™þô’þô‹þô„þô}þôvþôoþôhþôaþôZþôSþôLþôEþô>þô7þô0þô)þô"þôþôþô þôþôÿýôøýôñýôêýôãýôÜýôÕýôÎýôÇýôÀýô¹ýô²ýô«ýô¤ýôýô–ýôýôˆýôýôzýôsýôlýôeýô^ýôWýôPýôIýôBýô;ýô4ýô-ýô&ýôýôýôýô ýôýôüüôõüôîüôçüôàüôÙüôÒüôËüôÄüô½üô¶üô¯üô¨üô¡üôšüô“üôŒüô…üô~üôwüôpüôiüôbüô[üôTüôMüôFüô?üô8üô1üô*üô#üôüôüôüôüôüôùûôòûôëûôäûôÝûôÖûôÏûôÈûôÁûôºûô³ûô¬ûô¥ûôžûô—ûôûô‰ûô‚ûô{ûôtûômûôfûô_ûôXûôQûôJûôCûô<ûô5ûô.ûô'ûô ûôûôûô ûôûôýúôöúôïúôèúôáúôÚúôÓúôÌúôÅúô¾úô·úô°úô©úô¢úô›úô”úôúô†úôúôxúôqúôjúôcúô\úôUúôNúôGúô@úô9úô2úô+úô$úôúôúôúôúôúôúùôóùôìùôåùôÞùô×ùôÐùôÉùôÂùô»ùô´ùô­ùô¦ùôŸùô˜ùô‘ùôŠùôƒùô|ùôuùônùôgùô`ùôYùôRùôKùôDùô=ùô6ùô/ùô(ùô!ùôùôùô ùôùôþøô÷øôðøôéøôâøôÛøôÔøôÍøôÆøô¿øô¸øô±øôªøô£øôœøô•øôŽøô‡øô€øôyøôrøôkøôdøô]øôVøôOøôHøôAøô:øô3øô,øô%øôøôøôøô øôøôû÷ôô÷ôí÷ôæ÷ôß÷ôØ÷ôÑ÷ôÊ÷ôÃ÷ô¼÷ôµ÷ô®÷ô§÷ô ÷ô™÷ô’÷ô‹÷ô„÷ô}÷ôv÷ôo÷ôh÷ôa÷ôZ÷ôS÷ôL÷ôE÷ô>÷ô7÷ô0÷ô)÷ô"÷ô÷ô÷ô ÷ô÷ôÿöôøöôñöôêöôãöôÜöôÕöôÎöôÇöôÀöô¹öô²öô«öô¤öôöô–öôöôˆöôöôzöôsöôlöôeöô^öôWöôPöôIöôBöô;öô4öô-öô&öôöôöôöô öôöôüõôõõôîõôçõôàõôÙõôÒõôËõôÄõô½õô¶õô¯õô¨õô¡õôšõô“õôŒõô…õô~õôwõôpõôiõôbõô[õôTõôMõôFõô?õô8õô1õô*õô#õôõôõôõôõôõôùôôòôôëôôäôôÝôôÖôôÏôôÈôôÁôôºôô³ôô¬ôô¥ôôžôô—ôôôô‰ôô‚ôô{ôôtôômôôfôô_ôôXôôQôôJôôCôô<ôô5ôô.ôô'ôô ôôôôôô ôôôôýóôöóôïóôèóôáóôÚóôÓóôÌóôÅóô¾óô·óô°óô©óô¢óô›óô”óôóô†óôóôxóôqóôjóôcóô\óôUóôNóôGóô@óô9óô2óô+óô$óôóôóôóôóôóôúòôóòôìòôåòôÞòô×òôÐòôÉòôÂòô»òô´òô­òô¦òôŸòô˜òô‘òôŠòôƒòô|òôuòônòôgòô`òôYòôRòôKòôDòô=òô6òô/òô(òô!òôòôòô òôòôþñô÷ñôðñôéñôâñôÛñôÔñôÍñôÆñô¿ñô¸ñô±ñôªñô£ñôœñô•ñôŽñô‡ñô€ñôyñôrñôkñôdñô]ñôVñôOñôHñôAñô:ñô3ñô,ñô%ñôñôñôñô ñôñôûðôôðôíðôæðôßðôØðôÑðôÊðôÃðô¼ðôµðô®ðô§ðô ðô™ðô’ðô‹ðô„ðô}ðôvðôoðôhðôaðôZðôSðôLðôEðô>ðô7ðô0ðô)ðô"ðôðôðô ðôðôÿïôøïôñïôêïôãïôÜïôÕïôÎïôÇïôÀïô¹ïô²ïô«ïô¤ïôïô–ïôïôˆïôïôzïôsïôlïôeïô^ïôWïôPïôIïôBïô;ïô4ïô-ïô&ïôïôïôïô ïôïôüîôõîôîîôçîôàîôÙîôÒîôËîôÄîô½îô¶îô¯îô¨îô¡îôšîô“îôŒîô…îô~îôwîôpîôiîôbîô[îôTîôMîôFîô?îô8îô1îô*îô#îôîôîôîôîôîôùíôòíôëíôäíôÝíôÖíôÏíôÈíôÁíôºíô³íô¬íô¥íôžíô—íôíô‰íô‚íô{íôtíômíôfíô_íôXíôQíôJíôCíô<íô5íô.íô'íô íôíôíô íôíôýìôöìôïìôèìôáìôÚìôÓìôÌìôÅìô¾ìô·ìô°ìô©ìô¢ìô›ìô”ìôìô†ìôìôxìôqìôjìôcìô\ìôUìôNìôGìô@ìô9ìô2ìô+ìô$ìôìôìôìôìôìôúëôóëôìëôåëôÞëô×ëôÐëôÉëôÂëô»ëô´ëô­ëô¦ëôŸëô˜ëô‘ëôŠëôƒëô|ëôuëônëôgëô`ëôYëôRëôKëôDëô=ëô6ëô/ëô(ëô!ëôëôëô ëôëôþêô÷êôðêôéêôâêôÛêôÔêôÍêôÆêô¿êô¸êô±êôªêô£êôœêô•êôŽêô‡êô€êôyêôrêôkêôdêô]êôVêôOêôHêôAêô:êô3êô,êô%êôêôêôêô êôêôûéôôéôíéôæéôßéôØéôÑéôÊéôÃéô¼éôµéô®éô§éô éô™éô’éô‹éô„éô}éôvéôoéôhéôaéôZéôSéôLéôEéô>éô7éô0éô)éô"éôéôéô éôéôÿèôøèôñèôêèôãèôÜèôÕèôÎèôÇèôÀèô¹èô²èô«èô¤èôèô–èôèôˆèôèôzèôsèôlèôeèô^èôWèôPèôIèôBèô;èô4èô-èô&èôèôèôèô èôèôüçôõçôîçôççôàçôÙçôÒçôËçôÄçô½çô¶çô¯çô¨çô¡çôšçô“çôŒçô…çô~çôwçôpçôiçôbçô[çôTçôMçôFçô?çô8çô1çô*çô#çôçôçôçôçôçôùæôòæôëæôäæôÝæôÖæôÏæôÈæôÁæôºæô³æô¬æô¥æôžæô—æôæô‰æô‚æô{æôtæômæôfæô_æôXæôQæôJæôCæô<æô5æô.æô'æô æôæôæô æôæôýåôöåôïåôèåôáåôÚåôÓåôÌåôÅåô¾åô·åô°åô©åô¢åô›åô”åôåô†åôåôxåôqåôjåôcåô\åôUåôNåôGåô@åô9åô2åô+åô$åôåôåôåôåôåôúäôóäôìäôåäôÞäô×äôÐäôÉäôÂäô»äô´äô­äô¦äôŸäô˜äô‘äôŠäôƒäô|äôuäônäôgäô`äôYäôRäôKäôDäô=äô6äô/äô(äô!äôäôäô äôäôþãô÷ãôðãôéãôâãôÛãôÔãôÍãôÆãô¿ãô¸ãô±ãôªãô£ãôœãô•ãôŽãô‡ãô€ãôyãôrãôkãôdãô]ãôVãôOãôHãôAãô:ãô3ãô,ãô%ãôãôãôãô ãôãôûâôôâôíâôæâôßâôØâôÑâôÊâôÃâô¼âôµâô®âô§âô âô™âô’âô‹âô„âô}âôvâôoâôhâôaâôZâôSâôLâôEâô>âô7âô0âô)âô"âôâôâô âôâôÿáôøáôñáôêáôãáôÜáôÕáôÎáôÇáôÀáô¹áô²áô«áô¤áôáô–áôáôˆáôáôzáôsáôláôeáô^áôWáôPáôIáôBáô;áô4áô-áô&áôáôáôáô áôáôüàôõàôîàôçàôààôÙàôÒàôËàôÄàô½àô¶àô¯àô¨àô¡àôšàô“àôŒàô…àô~àôwàôpàôiàôbàô[àôTàôMàôFàô?àô8àô1àô*àô#àôàôàôàôàôàôùßôòßôëßôäßôÝßôÖßôÏßôÈßôÁßôºßô³ßô¬ßô¥ßôžßô—ßôßô‰ßô‚ßô{ßôtßômßôfßô_ßôXßôQßôJßôCßô<ßô5ßô.ßô'ßô ßôßôßô ßôßôýÞôöÞôïÞôèÞôáÞôÚÞôÓÞôÌÞôÅÞô¾Þô·Þô°Þô©Þô¢Þô›Þô”ÞôÞô†ÞôÞôxÞôqÞôjÞôcÞô\ÞôUÞôNÞôGÞô@Þô9Þô2Þô+Þô$ÞôÞôÞôÞôÞôÞôúÝôóÝôìÝôåÝôÞÝô×ÝôÐÝôÉÝôÂÝô»Ýô´Ýô­Ýô¦ÝôŸÝô˜Ýô‘ÝôŠÝôƒÝô|ÝôuÝônÝôgÝô`ÝôYÝôRÝôKÝôDÝô=Ýô6Ýô/Ýô(Ýô!ÝôÝôÝô ÝôÝôþÜô÷ÜôðÜôéÜôâÜôÛÜôÔÜôÍÜôÆÜô¿Üô¸Üô±ÜôªÜô£ÜôœÜô•ÜôŽÜô‡Üô€ÜôyÜôrÜôkÜôdÜô]ÜôVÜôOÜôHÜôAÜô:Üô3Üô,Üô%ÜôÜôÜôÜô ÜôÜôûÛôôÛôíÛôæÛôßÛôØÛôÑÛôÊÛôÃÛô¼ÛôµÛô®Ûô§Ûô Ûô™Ûô’Ûô‹Ûô„Ûô}ÛôvÛôoÛôhÛôaÛôZÛôSÛôLÛôEÛô>Ûô7Ûô0Ûô)Ûô"ÛôÛôÛô ÛôÛôÿÚôøÚôñÚôêÚôãÚôÜÚôÕÚôÎÚôÇÚôÀÚô¹Úô²Úô«Úô¤ÚôÚô–ÚôÚôˆÚôÚôzÚôsÚôlÚôeÚô^ÚôWÚôPÚôIÚôBÚô;Úô4Úô-Úô&ÚôÚôÚôÚô ÚôÚôüÙôõÙôîÙôçÙôàÙôÙÙôÒÙôËÙôÄÙô½Ùô¶Ùô¯Ùô¨Ùô¡ÙôšÙô“ÙôŒÙô…Ùô~ÙôwÙôpÙôiÙôbÙô[ÙôTÙôMÙôFÙô?Ùô8Ùô1Ùô*Ùô#ÙôÙôÙôÙôÙôÙôùØôòØôëØôäØôÝØôÖØôÏØôÈØôÁØôºØô³Øô¬Øô¥ØôžØô—ØôØô‰Øô‚Øô{ØôtØômØôfØô_ØôXØôQØôJØôCØô<Øô5Øô.Øô'Øô ØôØôØô ØôØôý×ôö×ôï×ôè×ôá×ôÚ×ôÓ×ôÌ×ôÅ×ô¾×ô·×ô°×ô©×ô¢×ô›×ô”×ô×ô†×ô×ôx×ôq×ôj×ôc×ô\×ôU×ôN×ôG×ô@×ô9×ô2×ô+×ô$×ô×ô×ô×ô×ô×ôúÖôóÖôìÖôåÖôÞÖô×ÖôÐÖôÉÖôÂÖô»Öô´Öô­Öô¦ÖôŸÖô˜Öô‘ÖôŠÖôƒÖô|ÖôuÖônÖôgÖô`ÖôYÖôRÖôKÖôDÖô=Öô6Öô/Öô(Öô!ÖôÖôÖô ÖôÖôþÕô÷ÕôðÕôéÕôâÕôÛÕôÔÕôÍÕôÆÕô¿Õô¸Õô±ÕôªÕô£ÕôœÕô•ÕôŽÕô‡Õô€ÕôyÕôrÕôkÕôdÕô]ÕôVÕôOÕôHÕôAÕô:Õô3Õô,Õô%ÕôÕôÕôÕô ÕôÕôûÔôôÔôíÔôæÔôßÔôØÔôÑÔôÊÔôÃÔô¼ÔôµÔô®Ôô§Ôô Ôô™Ôô’Ôô‹Ôô„Ôô}ÔôvÔôoÔôhÔôaÔôZÔôSÔôLÔôEÔô>Ôô7Ôô0Ôô)Ôô"ÔôÔôÔô ÔôÔôÿÓôøÓôñÓôêÓôãÓôÜÓôÕÓôÎÓôÇÓôÀÓô¹Óô²Óô«Óô¤ÓôÓô–ÓôÓôˆÓôÓôzÓôsÓôlÓôeÓô^ÓôWÓôPÓôIÓôBÓô;Óô4Óô-Óô&ÓôÓôÓôÓô ÓôÓôüÒôõÒôîÒôçÒôàÒôÙÒôÒÒôËÒôÄÒô½Òô¶Òô¯Òô¨Òô¡ÒôšÒô“ÒôŒÒô…Òô~ÒôwÒôpÒôiÒôbÒô[ÒôTÒôMÒôFÒô?Òô8Òô1Òô*Òô#ÒôÒôÒôÒôÒôÒôùÑôòÑôëÑôäÑôÝÑôÖÑôÏÑôÈÑôÁÑôºÑô³Ñô¬Ñô¥ÑôžÑô—ÑôÑô‰Ñô‚Ñô{ÑôtÑômÑôfÑô_ÑôXÑôQÑôJÑôCÑô<Ñô5Ñô.Ñô'Ñô ÑôÑôÑô ÑôÑôýÐôöÐôïÐôèÐôáÐôÚÐôÓÐôÌÐôÅÐô¾Ðô·Ðô°Ðô©Ðô¢Ðô›Ðô”ÐôÐô†ÐôÐôxÐôqÐôjÐôcÐô\ÐôUÐôNÐôGÐô@Ðô9Ðô2Ðô+Ðô$ÐôÐôÐôÐôÐôÐôúÏôóÏôìÏôåÏôÞÏô×ÏôÐÏôÉÏôÂÏô»Ïô´Ïô­Ïô¦ÏôŸÏô˜Ïô‘ÏôŠÏôƒÏô|ÏôuÏônÏôgÏô`ÏôYÏôRÏôKÏôDÏô=Ïô6Ïô/Ïô(Ïô!ÏôÏôÏô ÏôÏôþÎô÷ÎôðÎôéÎôâÎôÛÎôÔÎôÍÎôÆÎô¿Îô¸Îô±ÎôªÎô£ÎôœÎô•ÎôŽÎô‡Îô€ÎôyÎôrÎôkÎôdÎô]ÎôVÎôOÎôHÎôAÎô:Îô3Îô,Îô%ÎôÎôÎôÎô ÎôÎôûÍôôÍôíÍôæÍôßÍôØÍôÑÍôÊÍôÃÍô¼ÍôµÍô®Íô§Íô Íô™Íô’Íô‹Íô„Íô}ÍôvÍôoÍôhÍôaÍôZÍôSÍôLÍôEÍô>Íô7Íô0Íô)Íô"ÍôÍôÍô ÍôÍôÿÌôøÌôñÌôêÌôãÌôÜÌôÕÌôÎÌôÇÌôÀÌô¹Ìô²Ìô«Ìô¤ÌôÌô–ÌôÌôˆÌôÌôzÌôsÌôlÌôeÌô^ÌôWÌôPÌôIÌôBÌô;Ìô4Ìô-Ìô&ÌôÌôÌôÌô ÌôÌôüËôõËôîËôçËôàËôÙËôÒËôËËôÄËô½Ëô¶Ëô¯Ëô¨Ëô¡ËôšËô“ËôŒËô…Ëô~ËôwËôpËôiËôbËô[ËôTËôMËôFËô?Ëô8Ëô1Ëô*Ëô#ËôËôËôËôËôËôùÊôòÊôëÊôäÊôÝÊôÖÊôÏÊôÈÊôÁÊôºÊô³Êô¬Êô¥ÊôžÊô—ÊôÊô‰Êô‚Êô{ÊôtÊômÊôfÊô_ÊôXÊôQÊôJÊôCÊô<Êô5Êô.Êô'Êô ÊôÊôÊô ÊôÊôýÉôöÉôïÉôèÉôáÉôÚÉôÓÉôÌÉôÅÉô¾Éô·Éô°Éô©Éô¢Éô›Éô”ÉôÉô†ÉôÉôxÉôqÉôjÉôcÉô\ÉôUÉôNÉôGÉô@Éô9Éô2Éô+Éô$ÉôÉôÉôÉôÉôÉôúÈôóÈôìÈôåÈôÞÈô×ÈôÐÈôÉÈôÂÈô»Èô´Èô­Èô¦ÈôŸÈô˜Èô‘ÈôŠÈôƒÈô|ÈôuÈônÈôgÈô`ÈôYÈôRÈôKÈôDÈô=Èô6Èô/Èô(Èô!ÈôÈôÈô ÈôÈôþÇô÷ÇôðÇôéÇôâÇôÛÇôÔÇôÍÇôÆÇô¿Çô¸Çô±ÇôªÇô£ÇôœÇô•ÇôŽÇô‡Çô€ÇôyÇôrÇôkÇôdÇô]ÇôVÇôOÇôHÇôAÇô:Çô3Çô,Çô%ÇôÇôÇôÇô ÇôÇôûÆôôÆôíÆôæÆô߯ôØÆôÑÆôÊÆôÃÆô¼ÆôµÆô®Æô§Æô Æô™Æô’Æô‹Æô„Æô}ÆôvÆôoÆôhÆôaÆôZÆôSÆôLÆôEÆô>Æô7Æô0Æô)Æô"ÆôÆôÆô ÆôÆôÿÅôøÅôñÅôêÅôãÅôÜÅôÕÅôÎÅôÇÅôÀÅô¹Åô²Åô«Åô¤ÅôÅô–ÅôÅôˆÅôÅôzÅôsÅôlÅôeÅô^ÅôWÅôPÅôIÅôBÅô;Åô4Åô-Åô&ÅôÅôÅôÅô ÅôÅôüÄôõÄôîÄôçÄôàÄôÙÄôÒÄôËÄôÄÄô½Äô¶Äô¯Äô¨Äô¡ÄôšÄô“ÄôŒÄô…Äô~ÄôwÄôpÄôiÄôbÄô[ÄôTÄôMÄôFÄô?Äô8Äô1Äô*Äô#ÄôÄôÄôÄôÄôÄôùÃôòÃôëÃôäÃôÝÃôÖÃôÏÃôÈÃôÁÃôºÃô³Ãô¬Ãô¥ÃôžÃô—ÃôÃô‰Ãô‚Ãô{ÃôtÃômÃôfÃô_ÃôXÃôQÃôJÃôCÃô<Ãô5Ãô.Ãô'Ãô ÃôÃôÃô ÃôÃôýÂôöÂôïÂôèÂôáÂôÚÂôÓÂôÌÂôÅÂô¾Âô·Âô°Âô©Âô¢Âô›Âô”ÂôÂô†ÂôÂôxÂôqÂôjÂôcÂô\ÂôUÂôNÂôGÂô@Âô9Âô2Âô+Âô$ÂôÂôÂôÂôÂôÂôúÁôóÁôìÁôåÁôÞÁô×ÁôÐÁôÉÁôÂÁô»Áô´Áô­Áô¦ÁôŸÁô˜Áô‘ÁôŠÁôƒÁô|ÁôuÁônÁôgÁô`ÁôYÁôRÁôKÁôDÁô=Áô6Áô/Áô(Áô!ÁôÁôÁô ÁôÁôþÀô÷ÀôðÀôéÀôâÀôÛÀôÔÀôÍÀôÆÀô¿Àô¸Àô±ÀôªÀô£ÀôœÀô•ÀôŽÀô‡Àô€ÀôyÀôrÀôkÀôdÀô]ÀôVÀôOÀôHÀôAÀô:Àô3Àô,Àô%ÀôÀôÀôÀô ÀôÀôû¿ôô¿ôí¿ôæ¿ôß¿ôØ¿ôÑ¿ôÊ¿ôÿô¼¿ôµ¿ô®¿ô§¿ô ¿ô™¿ô’¿ô‹¿ô„¿ô}¿ôv¿ôo¿ôh¿ôa¿ôZ¿ôS¿ôL¿ôE¿ô>¿ô7¿ô0¿ô)¿ô"¿ô¿ô¿ô ¿ô¿ôÿ¾ôø¾ôñ¾ôê¾ôã¾ôܾôÕ¾ôξôǾôÀ¾ô¹¾ô²¾ô«¾ô¤¾ô¾ô–¾ô¾ôˆ¾ô¾ôz¾ôs¾ôl¾ôe¾ô^¾ôW¾ôP¾ôI¾ôB¾ô;¾ô4¾ô-¾ô&¾ô¾ô¾ô¾ô ¾ô¾ôü½ôõ½ôî½ôç½ôà½ôÙ½ôÒ½ô˽ôĽô½½ô¶½ô¯½ô¨½ô¡½ôš½ô“½ôŒ½ô…½ô~½ôw½ôp½ôi½ôb½ô[½ôT½ôM½ôF½ô?½ô8½ô1½ô*½ô#½ô½ô½ô½ô½ô½ôù¼ôò¼ôë¼ôä¼ôݼôÖ¼ôϼôȼôÁ¼ôº¼ô³¼ô¬¼ô¥¼ôž¼ô—¼ô¼ô‰¼ô‚¼ô{¼ôt¼ôm¼ôf¼ô_¼ôX¼ôQ¼ôJ¼ôC¼ô<¼ô5¼ô.¼ô'¼ô ¼ô¼ô¼ô ¼ô¼ôý»ôö»ôï»ôè»ôá»ôÚ»ôÓ»ôÌ»ôÅ»ô¾»ô·»ô°»ô©»ô¢»ô›»ô”»ô»ô†»ô»ôx»ôq»ôj»ôc»ô\»ôU»ôN»ôG»ô@»ô9»ô2»ô+»ô$»ô»ô»ô»ô»ô»ôúºôóºôìºôåºôÞºô׺ôкôɺôºô»ºô´ºô­ºô¦ºôŸºô˜ºô‘ºôŠºôƒºô|ºôuºônºôgºô`ºôYºôRºôKºôDºô=ºô6ºô/ºô(ºô!ºôºôºô ºôºôþ¹ô÷¹ôð¹ôé¹ôâ¹ôÛ¹ôÔ¹ô͹ôƹô¿¹ô¸¹ô±¹ôª¹ô£¹ôœ¹ô•¹ô޹ô‡¹ô€¹ôy¹ôr¹ôk¹ôd¹ô]¹ôV¹ôO¹ôH¹ôA¹ô:¹ô3¹ô,¹ô%¹ô¹ô¹ô¹ô ¹ô¹ôû¸ôô¸ôí¸ôæ¸ô߸ôظôѸôʸôøô¼¸ôµ¸ô®¸ô§¸ô ¸ô™¸ô’¸ô‹¸ô„¸ô}¸ôv¸ôo¸ôh¸ôa¸ôZ¸ôS¸ôL¸ôE¸ô>¸ô7¸ô0¸ô)¸ô"¸ô¸ô¸ô ¸ô¸ôÿ·ôø·ôñ·ôê·ôã·ôÜ·ôÕ·ôηôÇ·ôÀ·ô¹·ô²·ô«·ô¤·ô·ô–·ô·ôˆ·ô·ôz·ôs·ôl·ôe·ô^·ôW·ôP·ôI·ôB·ô;·ô4·ô-·ô&·ô·ô·ô·ô ·ô·ôü¶ôõ¶ôî¶ôç¶ôà¶ôÙ¶ôÒ¶ô˶ôĶô½¶ô¶¶ô¯¶ô¨¶ô¡¶ôš¶ô“¶ôŒ¶ô…¶ô~¶ôw¶ôp¶ôi¶ôb¶ô[¶ôT¶ôM¶ôF¶ô?¶ô8¶ô1¶ô*¶ô#¶ô¶ô¶ô¶ô¶ô¶ôùµôòµôëµôäµôݵôÖµôϵôȵôÁµôºµô³µô¬µô¥µôžµô—µôµô‰µô‚µô{µôtµômµôfµô_µôXµôQµôJµôCµô<µô5µô.µô'µô µôµôµô µôµôý´ôö´ôï´ôè´ôá´ôÚ´ôÓ´ôÌ´ôÅ´ô¾´ô·´ô°´ô©´ô¢´ô›´ô”´ô´ô†´ô´ôx´ôq´ôj´ôc´ô\´ôU´ôN´ôG´ô@´ô9´ô2´ô+´ô$´ô´ô´ô´ô´ô´ôú³ôó³ôì³ôå³ôÞ³ô׳ôгôɳô³ô»³ô´³ô­³ô¦³ôŸ³ô˜³ô‘³ôгôƒ³ô|³ôu³ôn³ôg³ô`³ôY³ôR³ôK³ôD³ô=³ô6³ô/³ô(³ô!³ô³ô³ô ³ô³ôþ²ô÷²ôð²ôé²ôâ²ôÛ²ôÔ²ôͲôƲô¿²ô¸²ô±²ôª²ô£²ôœ²ô•²ô޲ô‡²ô€²ôy²ôr²ôk²ôd²ô]²ôV²ôO²ôH²ôA²ô:²ô3²ô,²ô%²ô²ô²ô²ô ²ô²ôû±ôô±ôí±ôæ±ôß±ôرôѱôʱôñô¼±ôµ±ô®±ô§±ô ±ô™±ô’±ô‹±ô„±ô}±ôv±ôo±ôh±ôa±ôZ±ôS±ôL±ôE±ô>±ô7±ô0±ô)±ô"±ô±ô±ô ±ô±ôÿ°ôø°ôñ°ôê°ôã°ôܰôÕ°ôΰôǰôÀ°ô¹°ô²°ô«°ô¤°ô°ô–°ô°ôˆ°ô°ôz°ôs°ôl°ôe°ô^°ôW°ôP°ôI°ôB°ô;°ô4°ô-°ô&°ô°ô°ô°ô °ô°ôü¯ôõ¯ôî¯ôç¯ôà¯ôÙ¯ôÒ¯ô˯ôįô½¯ô¶¯ô¯¯ô¨¯ô¡¯ôš¯ô“¯ôŒ¯ô…¯ô~¯ôw¯ôp¯ôi¯ôb¯ô[¯ôT¯ôM¯ôF¯ô?¯ô8¯ô1¯ô*¯ô#¯ô¯ô¯ô¯ô¯ô¯ôù®ôò®ôë®ôä®ôÝ®ôÖ®ôÏ®ôÈ®ôÁ®ôº®ô³®ô¬®ô¥®ôž®ô—®ô®ô‰®ô‚®ô{®ôt®ôm®ôf®ô_®ôX®ôQ®ôJ®ôC®ô<®ô5®ô.®ô'®ô ®ô®ô®ô ®ô®ôý­ôö­ôï­ôè­ôá­ôÚ­ôÓ­ôÌ­ôÅ­ô¾­ô·­ô°­ô©­ô¢­ô›­ô”­ô­ô†­ô­ôx­ôq­ôj­ôc­ô\­ôU­ôN­ôG­ô@­ô9­ô2­ô+­ô$­ô­ô­ô­ô­ô­ôú¬ôó¬ôì¬ôå¬ôÞ¬ô׬ôЬôɬô¬ô»¬ô´¬ô­¬ô¦¬ôŸ¬ô˜¬ô‘¬ôЬôƒ¬ô|¬ôu¬ôn¬ôg¬ô`¬ôY¬ôR¬ôK¬ôD¬ô=¬ô6¬ô/¬ô(¬ô!¬ô¬ô¬ô ¬ô¬ôþ«ô÷«ôð«ôé«ôâ«ôÛ«ôÔ«ôÍ«ôÆ«ô¿«ô¸«ô±«ôª«ô£«ôœ«ô•«ôŽ«ô‡«ô€«ôy«ôr«ôk«ôd«ô]«ôV«ôO«ôH«ôA«ô:«ô3«ô,«ô%«ô«ô«ô«ô «ô«ôûªôôªôíªôæªôߪôتôѪôʪôêô¼ªôµªô®ªô§ªô ªô™ªô’ªô‹ªô„ªô}ªôvªôoªôhªôaªôZªôSªôLªôEªô>ªô7ªô0ªô)ªô"ªôªôªô ªôªôÿ©ôø©ôñ©ôê©ôã©ôÜ©ôÕ©ôΩôÇ©ôÀ©ô¹©ô²©ô«©ô¤©ô©ô–©ô©ôˆ©ô©ôz©ôs©ôl©ôe©ô^©ôW©ôP©ôI©ôB©ô;©ô4©ô-©ô&©ô©ô©ô©ô ©ô©ôü¨ôõ¨ôî¨ôç¨ôà¨ôÙ¨ôÒ¨ô˨ôĨô½¨ô¶¨ô¯¨ô¨¨ô¡¨ôš¨ô“¨ôŒ¨ô…¨ô~¨ôw¨ôp¨ôi¨ôb¨ô[¨ôT¨ôM¨ôF¨ô?¨ô8¨ô1¨ô*¨ô#¨ô¨ô¨ô¨ô¨ô¨ôù§ôò§ôë§ôä§ôݧôÖ§ôϧôȧôÁ§ôº§ô³§ô¬§ô¥§ôž§ô—§ô§ô‰§ô‚§ô{§ôt§ôm§ôf§ô_§ôX§ôQ§ôJ§ôC§ô<§ô5§ô.§ô'§ô §ô§ô§ô §ô§ôý¦ôö¦ôï¦ôè¦ôá¦ôÚ¦ôÓ¦ô̦ôŦô¾¦ô·¦ô°¦ô©¦ô¢¦ô›¦ô”¦ô¦ô†¦ô¦ôx¦ôq¦ôj¦ôc¦ô\¦ôU¦ôN¦ôG¦ô@¦ô9¦ô2¦ô+¦ô$¦ô¦ô¦ô¦ô¦ô¦ôú¥ôó¥ôì¥ôå¥ôÞ¥ô×¥ôÐ¥ôÉ¥ôÂ¥ô»¥ô´¥ô­¥ô¦¥ôŸ¥ô˜¥ô‘¥ôŠ¥ôƒ¥ô|¥ôu¥ôn¥ôg¥ô`¥ôY¥ôR¥ôK¥ôD¥ô=¥ô6¥ô/¥ô(¥ô!¥ô¥ô¥ô ¥ô¥ôþ¤ô÷¤ôð¤ôé¤ôâ¤ôÛ¤ôÔ¤ôͤôƤô¿¤ô¸¤ô±¤ôª¤ô£¤ôœ¤ô•¤ôޤô‡¤ô€¤ôy¤ôr¤ôk¤ôd¤ô]¤ôV¤ôO¤ôH¤ôA¤ô:¤ô3¤ô,¤ô%¤ô¤ô¤ô¤ô ¤ô¤ôû£ôô£ôí£ôæ£ôߣôØ£ôÑ£ôÊ£ôãô¼£ôµ£ô®£ô§£ô £ô™£ô’£ô‹£ô„£ô}£ôv£ôo£ôh£ôa£ôZ£ôS£ôL£ôE£ô>£ô7£ô0£ô)£ô"£ô£ô£ô £ô£ôÿ¢ôø¢ôñ¢ôê¢ôã¢ôÜ¢ôÕ¢ô΢ôÇ¢ôÀ¢ô¹¢ô²¢ô«¢ô¤¢ô¢ô–¢ô¢ôˆ¢ô¢ôz¢ôs¢ôl¢ôe¢ô^¢ôW¢ôP¢ôI¢ôB¢ô;¢ô4¢ô-¢ô&¢ô¢ô¢ô¢ô ¢ô¢ôü¡ôõ¡ôî¡ôç¡ôà¡ôÙ¡ôÒ¡ôË¡ôÄ¡ô½¡ô¶¡ô¯¡ô¨¡ô¡¡ôš¡ô“¡ôŒ¡ô…¡ô~¡ôw¡ôp¡ôi¡ôb¡ô[¡ôT¡ôM¡ôF¡ô?¡ô8¡ô1¡ô*¡ô#¡ô¡ô¡ô¡ô¡ô¡ôù ôò ôë ôä ôÝ ôÖ ôÏ ôÈ ôÁ ôº ô³ ô¬ ô¥ ôž ô— ô ô‰ ô‚ ô{ ôt ôm ôf ô_ ôX ôQ ôJ ôC ô< ô5 ô. ô' ô  ô ô ô  ô ôýŸôöŸôïŸôèŸôáŸôÚŸôÓŸôÌŸôÅŸô¾Ÿô·Ÿô°Ÿô©Ÿô¢Ÿô›Ÿô”ŸôŸô†ŸôŸôxŸôqŸôjŸôcŸô\ŸôUŸôNŸôGŸô@Ÿô9Ÿô2Ÿô+Ÿô$ŸôŸôŸôŸôŸôŸôúžôóžôìžôåžôÞžôמôОôÉžôžô»žô´žô­žô¦žôŸžô˜žô‘žôŠžôƒžô|žôužônžôgžô`žôYžôRžôKžôDžô=žô6žô/žô(žô!žôžôžô žôžôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûœôôœôíœôæœôßœôØœôÑœôÊœôÜô¼œôµœô®œô§œô œô™œô’œô‹œô„œô}œôvœôoœôhœôaœôZœôSœôLœôEœô>œô7œô0œô)œô"œôœôœô œôœôÿ›ôø›ôñ›ôê›ôã›ôÜ›ôÕ›ôΛôÇ›ôÀ›ô¹›ô²›ô«›ô¤›ô›ô–›ô›ôˆ›ô›ôz›ôs›ôl›ôe›ô^›ôW›ôP›ôI›ôB›ô;›ô4›ô-›ô&›ô›ô›ô›ô ›ô›ôüšôõšôîšôçšôàšôÙšôÒšôËšôÄšô½šô¶šô¯šô¨šô¡šôššô“šôŒšô…šô~šôwšôpšôišôbšô[šôTšôMšôFšô?šô8šô1šô*šô#šôšôšôšôšôšôù™ôò™ôë™ôä™ôÝ™ôÖ™ôÏ™ôÈ™ôÁ™ôº™ô³™ô¬™ô¥™ôž™ô—™ô™ô‰™ô‚™ô{™ôt™ôm™ôf™ô_™ôX™ôQ™ôJ™ôC™ô<™ô5™ô.™ô'™ô ™ô™ô™ô ™ô™ôý˜ôö˜ôï˜ôè˜ôá˜ôÚ˜ôÓ˜ô̘ôŘô¾˜ô·˜ô°˜ô©˜ô¢˜ô›˜ô”˜ô˜ô†˜ô˜ôx˜ôq˜ôj˜ôc˜ô\˜ôU˜ôN˜ôG˜ô@˜ô9˜ô2˜ô+˜ô$˜ô˜ô˜ô˜ô˜ô˜ôú—ôó—ôì—ôå—ôÞ—ô×—ôЗôÉ—ô—ô»—ô´—ô­—ô¦—ôŸ—ô˜—ô‘—ôŠ—ôƒ—ô|—ôu—ôn—ôg—ô`—ôY—ôR—ôK—ôD—ô=—ô6—ô/—ô(—ô!—ô—ô—ô —ô—ôþ–ô÷–ôð–ôé–ôâ–ôÛ–ôÔ–ôÍ–ôÆ–ô¿–ô¸–ô±–ôª–ô£–ôœ–ô•–ôŽ–ô‡–ô€–ôy–ôr–ôk–ôd–ô]–ôV–ôO–ôH–ôA–ô:–ô3–ô,–ô%–ô–ô–ô–ô –ô–ôû•ôô•ôí•ôæ•ôß•ôØ•ôÑ•ôÊ•ôÕô¼•ôµ•ô®•ô§•ô •ô™•ô’•ô‹•ô„•ô}•ôv•ôo•ôh•ôa•ôZ•ôS•ôL•ôE•ô>•ô7•ô0•ô)•ô"•ô•ô•ô •ô•ôÿ”ôø”ôñ”ôê”ôã”ôÜ”ôÕ”ôΔôÇ”ôÀ”ô¹”ô²”ô«”ô¤”ô”ô–”ô”ôˆ”ô”ôz”ôs”ôl”ôe”ô^”ôW”ôP”ôI”ôB”ô;”ô4”ô-”ô&”ô”ô”ô”ô ”ô”ôü“ôõ“ôî“ôç“ôà“ôÙ“ôÒ“ôË“ôÄ“ô½“ô¶“ô¯“ô¨“ô¡“ôš“ô““ôŒ“ô…“ô~“ôw“ôp“ôi“ôb“ô[“ôT“ôM“ôF“ô?“ô8“ô1“ô*“ô#“ô“ô“ô“ô“ô“ôù’ôò’ôë’ôä’ôÝ’ôÖ’ôÏ’ôÈ’ôÁ’ôº’ô³’ô¬’ô¥’ôž’ô—’ô’ô‰’ô‚’ô{’ôt’ôm’ôf’ô_’ôX’ôQ’ôJ’ôC’ô<’ô5’ô.’ô'’ô ’ô’ô’ô ’ô’ôý‘ôö‘ôï‘ôè‘ôá‘ôÚ‘ôÓ‘ôÌ‘ôÅ‘ô¾‘ô·‘ô°‘ô©‘ô¢‘ô›‘ô”‘ô‘ô†‘ô‘ôx‘ôq‘ôj‘ôc‘ô\‘ôU‘ôN‘ôG‘ô@‘ô9‘ô2‘ô+‘ô$‘ô‘ô‘ô‘ô‘ô‘ôúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûŽôôŽôíŽôæŽôߎôØŽôÑŽôÊŽôÃŽô¼ŽôµŽô®Žô§Žô Žô™Žô’Žô‹Žô„Žô}ŽôvŽôoŽôhŽôaŽôZŽôSŽôLŽôEŽô>Žô7Žô0Žô)Žô"ŽôŽôŽô ŽôŽôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüŒôõŒôîŒôçŒôàŒôÙŒôÒŒôËŒôÄŒô½Œô¶Œô¯Œô¨Œô¡ŒôšŒô“ŒôŒŒô…Œô~ŒôwŒôpŒôiŒôbŒô[ŒôTŒôMŒôFŒô?Œô8Œô1Œô*Œô#ŒôŒôŒôŒôŒôŒôù‹ôò‹ôë‹ôä‹ôÝ‹ôÖ‹ôÏ‹ôÈ‹ôÁ‹ôº‹ô³‹ô¬‹ô¥‹ôž‹ô—‹ô‹ô‰‹ô‚‹ô{‹ôt‹ôm‹ôf‹ô_‹ôX‹ôQ‹ôJ‹ôC‹ô<‹ô5‹ô.‹ô'‹ô ‹ô‹ô‹ô ‹ô‹ôýŠôöŠôïŠôèŠôáŠôÚŠôÓŠôÌŠôÅŠô¾Šô·Šô°Šô©Šô¢Šô›Šô”ŠôŠô†ŠôŠôxŠôqŠôjŠôcŠô\ŠôUŠôNŠôGŠô@Šô9Šô2Šô+Šô$ŠôŠôŠôŠôŠôŠôú‰ôó‰ôì‰ôå‰ôÞ‰ô׉ôЉôɉô‰ô»‰ô´‰ô­‰ô¦‰ôŸ‰ô˜‰ô‘‰ôЉôƒ‰ô|‰ôu‰ôn‰ôg‰ô`‰ôY‰ôR‰ôK‰ôD‰ô=‰ô6‰ô/‰ô(‰ô!‰ô‰ô‰ô ‰ô‰ôþˆô÷ˆôðˆôéˆôâˆôÛˆôÔˆô͈ôƈô¿ˆô¸ˆô±ˆôªˆô£ˆôœˆô•ˆôŽˆô‡ˆô€ˆôyˆôrˆôkˆôdˆô]ˆôVˆôOˆôHˆôAˆô:ˆô3ˆô,ˆô%ˆôˆôˆôˆô ˆôˆôû‡ôô‡ôí‡ôæ‡ô߇ô؇ôчôʇôÇô¼‡ôµ‡ô®‡ô§‡ô ‡ô™‡ô’‡ô‹‡ô„‡ô}‡ôv‡ôo‡ôh‡ôa‡ôZ‡ôS‡ôL‡ôE‡ô>‡ô7‡ô0‡ô)‡ô"‡ô‡ô‡ô ‡ô‡ôÿ†ôø†ôñ†ôê†ôã†ô܆ôÕ†ôΆôdžôÀ†ô¹†ô²†ô«†ô¤†ô†ô–†ô†ôˆ†ô†ôz†ôs†ôl†ôe†ô^†ôW†ôP†ôI†ôB†ô;†ô4†ô-†ô&†ô†ô†ô†ô †ô†ôü…ôõ…ôî…ôç…ôà…ôÙ…ôÒ…ôË…ôÄ…ô½…ô¶…ô¯…ô¨…ô¡…ôš…ô“…ôŒ…ô……ô~…ôw…ôp…ôi…ôb…ô[…ôT…ôM…ôF…ô?…ô8…ô1…ô*…ô#…ô…ô…ô…ô…ô…ôù„ôò„ôë„ôä„ôÝ„ôÖ„ôÏ„ôÈ„ôÁ„ôº„ô³„ô¬„ô¥„ôž„ô—„ô„ô‰„ô‚„ô{„ôt„ôm„ôf„ô_„ôX„ôQ„ôJ„ôC„ô<„ô5„ô.„ô'„ô „ô„ô„ô „ô„ôýƒôöƒôïƒôèƒôáƒôÚƒôÓƒỗôŃô¾ƒô·ƒô°ƒô©ƒô¢ƒô›ƒô”ƒôƒô†ƒôƒôxƒôqƒôjƒôcƒô\ƒôUƒôNƒôGƒô@ƒô9ƒô2ƒô+ƒô$ƒôƒôƒôƒôƒôƒôú‚ôó‚ôì‚ôå‚ôÞ‚ôׂôЂôÉ‚ô‚ô»‚ô´‚ô­‚ô¦‚ôŸ‚ô˜‚ô‘‚ôŠ‚ôƒ‚ô|‚ôu‚ôn‚ôg‚ô`‚ôY‚ôR‚ôK‚ôD‚ô=‚ô6‚ô/‚ô(‚ô!‚ô‚ô‚ô ‚ô‚ôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôû€ôô€ôí€ôæ€ô߀ôØ€ôÑ€ôÊ€ôÀô¼€ôµ€ô®€ô§€ô €ô™€ô’€ô‹€ô„€ô}€ôv€ôo€ôh€ôa€ôZ€ôS€ôL€ôE€ô>€ô7€ô0€ô)€ô"€ô€ô€ô €ô€ôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôü~ôõ~ôî~ôç~ôà~ôÙ~ôÒ~ôË~ôÄ~ô½~ô¶~ô¯~ô¨~ô¡~ôš~ô“~ôŒ~ô…~ô~~ôw~ôp~ôi~ôb~ô[~ôT~ôM~ôF~ô?~ô8~ô1~ô*~ô#~ô~ô~ô~ô~ô~ôù}ôò}ôë}ôä}ôÝ}ôÖ}ôÏ}ôÈ}ôÁ}ôº}ô³}ô¬}ô¥}ôž}ô—}ô}ô‰}ô‚}ô{}ôt}ôm}ôf}ô_}ôX}ôQ}ôJ}ôC}ô<}ô5}ô.}ô'}ô }ô}ô}ô }ô}ôý|ôö|ôï|ôè|ôá|ôÚ|ôÓ|ôÌ|ôÅ|ô¾|ô·|ô°|ô©|ô¢|ô›|ô”|ô|ô†|ô|ôx|ôq|ôj|ôc|ô\|ôU|ôN|ôG|ô@|ô9|ô2|ô+|ô$|ô|ô|ô|ô|ô|ôú{ôó{ôì{ôå{ôÞ{ô×{ôÐ{ôÉ{ôÂ{ô»{ô´{ô­{ô¦{ôŸ{ô˜{ô‘{ôŠ{ôƒ{ô|{ôu{ôn{ôg{ô`{ôY{ôR{ôK{ôD{ô={ô6{ô/{ô({ô!{ô{ô{ô {ô{ôþzô÷zôðzôézôâzôÛzôÔzôÍzôÆzô¿zô¸zô±zôªzô£zôœzô•zôŽzô‡zô€zôyzôrzôkzôdzô]zôVzôOzôHzôAzô:zô3zô,zô%zôzôzôzô zôzôûyôôyôíyôæyôßyôØyôÑyôÊyôÃyô¼yôµyô®yô§yô yô™yô’yô‹yô„yô}yôvyôoyôhyôayôZyôSyôLyôEyô>yô7yô0yô)yô"yôyôyô yôyôÿxôøxôñxôêxôãxôÜxôÕxôÎxôÇxôÀxô¹xô²xô«xô¤xôxô–xôxôˆxôxôzxôsxôlxôexô^xôWxôPxôIxôBxô;xô4xô-xô&xôxôxôxô xôxôüwôõwôîwôçwôàwôÙwôÒwôËwôÄwô½wô¶wô¯wô¨wô¡wôšwô“wôŒwô…wô~wôwwôpwôiwôbwô[wôTwôMwôFwô?wô8wô1wô*wô#wôwôwôwôwôwôùvôòvôëvôävôÝvôÖvôÏvôÈvôÁvôºvô³vô¬vô¥vôžvô—vôvô‰vô‚vô{vôtvômvôfvô_vôXvôQvôJvôCvôrô7rô0rô)rô"rôrôrô rôrôÿqôøqôñqôêqôãqôÜqôÕqôÎqôÇqôÀqô¹qô²qô«qô¤qôqô–qôqôˆqôqôzqôsqôlqôeqô^qôWqôPqôIqôBqô;qô4qô-qô&qôqôqôqô qôqôüpôõpôîpôçpôàpôÙpôÒpôËpôÄpô½pô¶pô¯pô¨pô¡pôšpô“pôŒpô…pô~pôwpôppôipôbpô[pôTpôMpôFpô?pô8pô1pô*pô#pôpôpôpôpôpôùoôòoôëoôäoôÝoôÖoôÏoôÈoôÁoôºoô³oô¬oô¥oôžoô—oôoô‰oô‚oô{oôtoômoôfoô_oôXoôQoôJoôCoôkô7kô0kô)kô"kôkôkô kôkôÿjôøjôñjôêjôãjôÜjôÕjôÎjôÇjôÀjô¹jô²jô«jô¤jôjô–jôjôˆjôjôzjôsjôljôejô^jôWjôPjôIjôBjô;jô4jô-jô&jôjôjôjô jôjôüiôõiôîiôçiôàiôÙiôÒiôËiôÄiô½iô¶iô¯iô¨iô¡iôšiô“iôŒiô…iô~iôwiôpiôiiôbiô[iôTiôMiôFiô?iô8iô1iô*iô#iôiôiôiôiôiôùhôòhôëhôähôÝhôÖhôÏhôÈhôÁhôºhô³hô¬hô¥hôžhô—hôhô‰hô‚hô{hôthômhôfhô_hôXhôQhôJhôChôdô7dô0dô)dô"dôdôdô dôdôÿcôøcôñcôêcôãcôÜcôÕcôÎcôÇcôÀcô¹cô²cô«cô¤côcô–côcôˆcôcôzcôscôlcôecô^côWcôPcôIcôBcô;cô4cô-cô&côcôcôcô côcôübôõbôîbôçbôàbôÙbôÒbôËbôÄbô½bô¶bô¯bô¨bô¡bôšbô“bôŒbô…bô~bôwbôpbôibôbbô[bôTbôMbôFbô?bô8bô1bô*bô#bôbôbôbôbôbôùaôòaôëaôäaôÝaôÖaôÏaôÈaôÁaôºaô³aô¬aô¥aôžaô—aôaô‰aô‚aô{aôtaômaôfaô_aôXaôQaôJaôCaô]ô7]ô0]ô)]ô"]ô]ô]ô ]ô]ôÿ\ôø\ôñ\ôê\ôã\ôÜ\ôÕ\ôÎ\ôÇ\ôÀ\ô¹\ô²\ô«\ô¤\ô\ô–\ô\ôˆ\ô\ôz\ôs\ôl\ôe\ô^\ôW\ôP\ôI\ôB\ô;\ô4\ô-\ô&\ô\ô\ô\ô \ô\ôü[ôõ[ôî[ôç[ôà[ôÙ[ôÒ[ôË[ôÄ[ô½[ô¶[ô¯[ô¨[ô¡[ôš[ô“[ôŒ[ô…[ô~[ôw[ôp[ôi[ôb[ô[[ôT[ôM[ôF[ô?[ô8[ô1[ô*[ô#[ô[ô[ô[ô[ô[ôùZôòZôëZôäZôÝZôÖZôÏZôÈZôÁZôºZô³Zô¬Zô¥ZôžZô—ZôZô‰Zô‚Zô{ZôtZômZôfZô_ZôXZôQZôJZôCZôVô7Vô0Vô)Vô"VôVôVô VôVôÿUôøUôñUôêUôãUôÜUôÕUôÎUôÇUôÀUô¹Uô²Uô«Uô¤UôUô–UôUôˆUôUôzUôsUôlUôeUô^UôWUôPUôIUôBUô;Uô4Uô-Uô&UôUôUôUô UôUôüTôõTôîTôçTôàTôÙTôÒTôËTôÄTô½Tô¶Tô¯Tô¨Tô¡TôšTô“TôŒTô…Tô~TôwTôpTôiTôbTô[TôTTôMTôFTô?Tô8Tô1Tô*Tô#TôTôTôTôTôTôùSôòSôëSôäSôÝSôÖSôÏSôÈSôÁSôºSô³Sô¬Sô¥SôžSô—SôSô‰Sô‚Sô{SôtSômSôfSô_SôXSôQSôJSôCSôOô7Oô0Oô)Oô"OôOôOô OôOôÿNôøNôñNôêNôãNôÜNôÕNôÎNôÇNôÀNô¹Nô²Nô«Nô¤NôNô–NôNôˆNôNôzNôsNôlNôeNô^NôWNôPNôINôBNô;Nô4Nô-Nô&NôNôNôNô NôNôüMôõMôîMôçMôàMôÙMôÒMôËMôÄMô½Mô¶Mô¯Mô¨Mô¡MôšMô“MôŒMô…Mô~MôwMôpMôiMôbMô[MôTMôMMôFMô?Mô8Mô1Mô*Mô#MôMôMôMôMôMôùLôòLôëLôäLôÝLôÖLôÏLôÈLôÁLôºLô³Lô¬Lô¥LôžLô—LôLô‰Lô‚Lô{LôtLômLôfLô_LôXLôQLôJLôCLôHô7Hô0Hô)Hô"HôHôHô HôHôÿGôøGôñGôêGôãGôÜGôÕGôÎGôÇGôÀGô¹Gô²Gô«Gô¤GôGô–GôGôˆGôGôzGôsGôlGôeGô^GôWGôPGôIGôBGô;Gô4Gô-Gô&GôGôGôGô GôGôüFôõFôîFôçFôàFôÙFôÒFôËFôÄFô½Fô¶Fô¯Fô¨Fô¡FôšFô“FôŒFô…Fô~FôwFôpFôiFôbFô[FôTFôMFôFFô?Fô8Fô1Fô*Fô#FôFôFôFôFôFôùEôòEôëEôäEôÝEôÖEôÏEôÈEôÁEôºEô³Eô¬Eô¥EôžEô—EôEô‰Eô‚Eô{EôtEômEôfEô_EôXEôQEôJEôCEôAô7Aô0Aô)Aô"AôAôAô AôAôÿ@ôø@ôñ@ôê@ôã@ôÜ@ôÕ@ôÎ@ôÇ@ôÀ@ô¹@ô²@ô«@ô¤@ô@ô–@ô@ôˆ@ô@ôz@ôs@ôl@ôe@ô^@ôW@ôP@ôI@ôB@ô;@ô4@ô-@ô&@ô@ô@ô@ô @ô@ôü?ôõ?ôî?ôç?ôà?ôÙ?ôÒ?ôË?ôÄ?ô½?ô¶?ô¯?ô¨?ô¡?ôš?ô“?ôŒ?ô…?ô~?ôw?ôp?ôi?ôb?ô[?ôT?ôM?ôF?ô??ô8?ô1?ô*?ô#?ô?ô?ô?ô?ô?ôù>ôò>ôë>ôä>ôÝ>ôÖ>ôÏ>ôÈ>ôÁ>ôº>ô³>ô¬>ô¥>ôž>ô—>ô>ô‰>ô‚>ô{>ôt>ôm>ôf>ô_>ôX>ôQ>ôJ>ôC>ô<>ô5>ô.>ô'>ô >ô>ô>ô >ô>ôý=ôö=ôï=ôè=ôá=ôÚ=ôÓ=ôÌ=ôÅ=ô¾=ô·=ô°=ô©=ô¢=ô›=ô”=ô=ô†=ô=ôx=ôq=ôj=ôc=ô\=ôU=ôN=ôG=ô@=ô9=ô2=ô+=ô$=ô=ô=ô=ô=ô=ôú<ôó<ôì<ôå<ôÞ<ô×<ôÐ<ôÉ<ôÂ<ô»<ô´<ô­<ô¦<ôŸ<ô˜<ô‘<ôŠ<ôƒ<ô|<ôu<ôn<ôg<ô`<ôY<ôR<ôK<ôD<ô=<ô6<ô/<ô(<ô!<ô<ô<ô <ô<ôþ;ô÷;ôð;ôé;ôâ;ôÛ;ôÔ;ôÍ;ôÆ;ô¿;ô¸;ô±;ôª;ô£;ôœ;ô•;ôŽ;ô‡;ô€;ôy;ôr;ôk;ôd;ô];ôV;ôO;ôH;ôA;ô:;ô3;ô,;ô%;ô;ô;ô;ô ;ô;ôû:ôô:ôí:ôæ:ôß:ôØ:ôÑ:ôÊ:ôÃ:ô¼:ôµ:ô®:ô§:ô :ô™:ô’:ô‹:ô„:ô}:ôv:ôo:ôh:ôa:ôZ:ôS:ôL:ôE:ô>:ô7:ô0:ô):ô":ô:ô:ô :ô:ôÿ9ôø9ôñ9ôê9ôã9ôÜ9ôÕ9ôÎ9ôÇ9ôÀ9ô¹9ô²9ô«9ô¤9ô9ô–9ô9ôˆ9ô9ôz9ôs9ôl9ôe9ô^9ôW9ôP9ôI9ôB9ô;9ô49ô-9ô&9ô9ô9ô9ô 9ô9ôü8ôõ8ôî8ôç8ôà8ôÙ8ôÒ8ôË8ôÄ8ô½8ô¶8ô¯8ô¨8ô¡8ôš8ô“8ôŒ8ô…8ô~8ôw8ôp8ôi8ôb8ô[8ôT8ôM8ôF8ô?8ô88ô18ô*8ô#8ô8ô8ô8ô8ô8ôù7ôò7ôë7ôä7ôÝ7ôÖ7ôÏ7ôÈ7ôÁ7ôº7ô³7ô¬7ô¥7ôž7ô—7ô7ô‰7ô‚7ô{7ôt7ôm7ôf7ô_7ôX7ôQ7ôJ7ôC7ô<7ô57ô.7ô'7ô 7ô7ô7ô 7ô7ôý6ôö6ôï6ôè6ôá6ôÚ6ôÓ6ôÌ6ôÅ6ô¾6ô·6ô°6ô©6ô¢6ô›6ô”6ô6ô†6ô6ôx6ôq6ôj6ôc6ô\6ôU6ôN6ôG6ô@6ô96ô26ô+6ô$6ô6ô6ô6ô6ô6ôú5ôó5ôì5ôå5ôÞ5ô×5ôÐ5ôÉ5ôÂ5ô»5ô´5ô­5ô¦5ôŸ5ô˜5ô‘5ôŠ5ôƒ5ô|5ôu5ôn5ôg5ô`5ôY5ôR5ôK5ôD5ô=5ô65ô/5ô(5ô!5ô5ô5ô 5ô5ôþ4ô÷4ôð4ôé4ôâ4ôÛ4ôÔ4ôÍ4ôÆ4ô¿4ô¸4ô±4ôª4ô£4ôœ4ô•4ôŽ4ô‡4ô€4ôy4ôr4ôk4ôd4ô]4ôV4ôO4ôH4ôA4ô:4ô34ô,4ô%4ô4ô4ô4ô 4ô4ôû3ôô3ôí3ôæ3ôß3ôØ3ôÑ3ôÊ3ôÃ3ô¼3ôµ3ô®3ô§3ô 3ô™3ô’3ô‹3ô„3ô}3ôv3ôo3ôh3ôa3ôZ3ôS3ôL3ôE3ô>3ô73ô03ô)3ô"3ô3ô3ô 3ô3ôÿ2ôø2ôñ2ôê2ôã2ôÜ2ôÕ2ôÎ2ôÇ2ôÀ2ô¹2ô²2ô«2ô¤2ô2ô–2ô2ôˆ2ô2ôz2ôs2ôl2ôe2ô^2ôW2ôP2ôI2ôB2ô;2ô42ô-2ô&2ô2ô2ô2ô 2ô2ôü1ôõ1ôî1ôç1ôà1ôÙ1ôÒ1ôË1ôÄ1ô½1ô¶1ô¯1ô¨1ô¡1ôš1ô“1ôŒ1ô…1ô~1ôw1ôp1ôi1ôb1ô[1ôT1ôM1ôF1ô?1ô81ô11ô*1ô#1ô1ô1ô1ô1ô1ôù0ôò0ôë0ôä0ôÝ0ôÖ0ôÏ0ôÈ0ôÁ0ôº0ô³0ô¬0ô¥0ôž0ô—0ô0ô‰0ô‚0ô{0ôt0ôm0ôf0ô_0ôX0ôQ0ôJ0ôC0ô<0ô50ô.0ô'0ô 0ô0ô0ô 0ô0ôý/ôö/ôï/ôè/ôá/ôÚ/ôÓ/ôÌ/ôÅ/ô¾/ô·/ô°/ô©/ô¢/ô›/ô”/ô/ô†/ô/ôx/ôq/ôj/ôc/ô\/ôU/ôN/ôG/ô@/ô9/ô2/ô+/ô$/ô/ô/ô/ô/ô/ôú.ôó.ôì.ôå.ôÞ.ô×.ôÐ.ôÉ.ôÂ.ô».ô´.ô­.ô¦.ôŸ.ô˜.ô‘.ôŠ.ôƒ.ô|.ôu.ôn.ôg.ô`.ôY.ôR.ôK.ôD.ô=.ô6.ô/.ô(.ô!.ô.ô.ô .ô.ôþ-ô÷-ôð-ôé-ôâ-ôÛ-ôÔ-ôÍ-ôÆ-ô¿-ô¸-ô±-ôª-ô£-ôœ-ô•-ôŽ-ô‡-ô€-ôy-ôr-ôk-ôd-ô]-ôV-ôO-ôH-ôA-ô:-ô3-ô,-ô%-ô-ô-ô-ô -ô-ôû,ôô,ôí,ôæ,ôß,ôØ,ôÑ,ôÊ,ôÃ,ô¼,ôµ,ô®,ô§,ô ,ô™,ô’,ô‹,ô„,ô},ôv,ôo,ôh,ôa,ôZ,ôS,ôL,ôE,ô>,ô7,ô0,ô),ô",ô,ô,ô ,ô,ôÿ+ôø+ôñ+ôê+ôã+ôÜ+ôÕ+ôÎ+ôÇ+ôÀ+ô¹+ô²+ô«+ô¤+ô+ô–+ô+ôˆ+ô+ôz+ôs+ôl+ôe+ô^+ôW+ôP+ôI+ôB+ô;+ô4+ô-+ô&+ô+ô+ô+ô +ô+ôü*ôõ*ôî*ôç*ôà*ôÙ*ôÒ*ôË*ôÄ*ô½*ô¶*ô¯*ô¨*ô¡*ôš*ô“*ôŒ*ô…*ô~*ôw*ôp*ôi*ôb*ô[*ôT*ôM*ôF*ô?*ô8*ô1*ô**ô#*ô*ô*ô*ô*ô*ôù)ôò)ôë)ôä)ôÝ)ôÖ)ôÏ)ôÈ)ôÁ)ôº)ô³)ô¬)ô¥)ôž)ô—)ô)ô‰)ô‚)ô{)ôt)ôm)ôf)ô_)ôX)ôQ)ôJ)ôC)ô<)ô5)ô.)ô')ô )ô)ô)ô )ô)ôý(ôö(ôï(ôè(ôá(ôÚ(ôÓ(ôÌ(ôÅ(ô¾(ô·(ô°(ô©(ô¢(ô›(ô”(ô(ô†(ô(ôx(ôq(ôj(ôc(ô\(ôU(ôN(ôG(ô@(ô9(ô2(ô+(ô$(ô(ô(ô(ô(ô(ôú'ôó'ôì'ôå'ôÞ'ô×'ôÐ'ôÉ'ôÂ'ô»'ô´'ô­'ô¦'ôŸ'ô˜'ô‘'ôŠ'ôƒ'ô|'ôu'ôn'ôg'ô`'ôY'ôR'ôK'ôD'ô='ô6'ô/'ô('ô!'ô'ô'ô 'ô'ôþ&ô÷&ôð&ôé&ôâ&ôÛ&ôÔ&ôÍ&ôÆ&ô¿&ô¸&ô±&ôª&ô£&ôœ&ô•&ôŽ&ô‡&ô€&ôy&ôr&ôk&ôd&ô]&ôV&ôO&ôH&ôA&ô:&ô3&ô,&ô%&ô&ô&ô&ô &ô&ôû%ôô%ôí%ôæ%ôß%ôØ%ôÑ%ôÊ%ôÃ%ô¼%ôµ%ô®%ô§%ô %ô™%ô’%ô‹%ô„%ô}%ôv%ôo%ôh%ôa%ôZ%ôS%ôL%ôE%ô>%ô7%ô0%ô)%ô"%ô%ô%ô %ô%ôÿ$ôø$ôñ$ôê$ôã$ôÜ$ôÕ$ôÎ$ôÇ$ôÀ$ô¹$ô²$ô«$ô¤$ô$ô–$ô$ôˆ$ô$ôz$ôs$ôl$ôe$ô^$ôW$ôP$ôI$ôB$ô;$ô4$ô-$ô&$ô$ô$ô$ô $ô$ôü#ôõ#ôî#ôç#ôà#ôÙ#ôÒ#ôË#ôÄ#ô½#ô¶#ô¯#ô¨#ô¡#ôš#ô“#ôŒ#ô…#ô~#ôw#ôp#ôi#ôb#ô[#ôT#ôM#ôF#ô?#ô8#ô1#ô*#ô##ô#ô#ô#ô#ô#ôù"ôò"ôë"ôä"ôÝ"ôÖ"ôÏ"ôÈ"ôÁ"ôº"ô³"ô¬"ô¥"ôž"ô—"ô"ô‰"ô‚"ô{"ôt"ôm"ôf"ô_"ôX"ôQ"ôJ"ôC"ô<"ô5"ô."ô'"ô "ô"ô"ô "ô"ôý!ôö!ôï!ôè!ôá!ôÚ!ôÓ!ôÌ!ôÅ!ô¾!ô·!ô°!ô©!ô¢!ô›!ô”!ô!ô†!ô!ôx!ôq!ôj!ôc!ô\!ôU!ôN!ôG!ô@!ô9!ô2!ô+!ô$!ô!ô!ô!ô!ô!ôú ôó ôì ôå ôÞ ô× ôÐ ôÉ ô ô» ô´ ô­ ô¦ ôŸ ô˜ ô‘ ôŠ ôƒ ô| ôu ôn ôg ô` ôY ôR ôK ôD ô= ô6 ô/ ô( ô! ô ô ô ô ôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôù ôò ôë ôä ôÝ ôÖ ôÏ ôÈ ôÁ ôº ô³ ô¬ ô¥ ôž ô— ô ô‰ ô‚ ô{ ôt ôm ôf ô_ ôX ôQ ôJ ôC ô< ô5 ô. ô' ô ô ô ô ô ôý ôö ôï ôè ôá ôÚ ôÓ ôÌ ôÅ ô¾ ô· ô° ô© ô¢ ô› ô” ô ô† ô ôx ôq ôj ôc ô\ ôU ôN ôG ô@ ô9 ô2 ô+ ô$ ô ô ô ô ô ôú ôó ôì ôå ôÞ ô× ôÐ ôÉ ô ô» ô´ ô­ ô¦ ôŸ ô˜ ô‘ ôŠ ôƒ ô| ôu ôn ôg ô` ôY ôR ôK ôD ô= ô6 ô/ ô( ô! ô ô ô ô ôþ ô÷ ôð ôé ôâ ôÛ ôÔ ôÍ ôÆ ô¿ ô¸ ô± ôª ô£ ôœ ô• ôŽ ô‡ ô€ ôy ôr ôk ôd ô] ôV ôO ôH ôA ô: ô3 ô, ô% ô ô ô ô ô ôû ôô ôí ôæ ôß ôØ ôÑ ôÊ ôà ô¼ ôµ ô® ô§ ô  ô™ ô’ ô‹ ô„ ô} ôv ôo ôh ôa ôZ ôS ôL ôE ô> ô7 ô0 ô) ô" ô ô ô ô ôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùÿóòÿóëÿóäÿóÝÿóÖÿóÏÿóÈÿóÁÿóºÿó³ÿó¬ÿó¥ÿóžÿó—ÿóÿó‰ÿó‚ÿó{ÿótÿómÿófÿó_ÿóXÿóQÿóJÿóCÿó<ÿó5ÿó.ÿó'ÿó ÿóÿóÿó ÿóÿóýþóöþóïþóèþóáþóÚþóÓþóÌþóÅþó¾þó·þó°þó©þó¢þó›þó”þóþó†þóþóxþóqþójþócþó\þóUþóNþóGþó@þó9þó2þó+þó$þóþóþóþóþóþóúýóóýóìýóåýóÞýó×ýóÐýóÉýóÂýó»ýó´ýó­ýó¦ýóŸýó˜ýó‘ýóŠýóƒýó|ýóuýónýógýó`ýóYýóRýóKýóDýó=ýó6ýó/ýó(ýó!ýóýóýó ýóýóþüó÷üóðüóéüóâüóÛüóÔüóÍüóÆüó¿üó¸üó±üóªüó£üóœüó•üóŽüó‡üó€üóyüórüóküódüó]üóVüóOüóHüóAüó:üó3üó,üó%üóüóüóüó üóüóûûóôûóíûóæûóßûóØûóÑûóÊûóÃûó¼ûóµûó®ûó§ûó ûó™ûó’ûó‹ûó„ûó}ûóvûóoûóhûóaûóZûóSûóLûóEûó>ûó7ûó0ûó)ûó"ûóûóûó ûóûóÿúóøúóñúóêúóãúóÜúóÕúóÎúóÇúóÀúó¹úó²úó«úó¤úóúó–úóúóˆúóúózúósúólúóeúó^úóWúóPúóIúóBúó;úó4úó-úó&úóúóúóúó úóúóüùóõùóîùóçùóàùóÙùóÒùóËùóÄùó½ùó¶ùó¯ùó¨ùó¡ùóšùó“ùóŒùó…ùó~ùówùópùóiùóbùó[ùóTùóMùóFùó?ùó8ùó1ùó*ùó#ùóùóùóùóùóùóùøóòøóëøóäøóÝøóÖøóÏøóÈøóÁøóºøó³øó¬øó¥øóžøó—øóøó‰øó‚øó{øótøómøóføó_øóXøóQøóJøóCøó<øó5øó.øó'øó øóøóøó øóøóý÷óö÷óï÷óè÷óá÷óÚ÷óÓ÷óÌ÷óÅ÷ó¾÷ó·÷ó°÷ó©÷ó¢÷ó›÷ó”÷ó÷ó†÷ó÷óx÷óq÷ój÷óc÷ó\÷óU÷óN÷óG÷ó@÷ó9÷ó2÷ó+÷ó$÷ó÷ó÷ó÷ó÷ó÷óúöóóöóìöóåöóÞöó×öóÐöóÉöóÂöó»öó´öó­öó¦öóŸöó˜öó‘öóŠöóƒöó|öóuöónöógöó`öóYöóRöóKöóDöó=öó6öó/öó(öó!öóöóöó öóöóþõó÷õóðõóéõóâõóÛõóÔõóÍõóÆõó¿õó¸õó±õóªõó£õóœõó•õóŽõó‡õó€õóyõórõókõódõó]õóVõóOõóHõóAõó:õó3õó,õó%õóõóõóõó õóõóûôóôôóíôóæôóßôóØôóÑôóÊôóÃôó¼ôóµôó®ôó§ôó ôó™ôó’ôó‹ôó„ôó}ôóvôóoôóhôóaôóZôóSôóLôóEôó>ôó7ôó0ôó)ôó"ôóôóôó ôóôóÿóóøóóñóóêóóãóóÜóóÕóóÎóóÇóóÀóó¹óó²óó«óó¤óóóó–óóóóˆóóóózóósóólóóeóó^óóWóóPóóIóóBóó;óó4óó-óó&óóóóóóóó óóóóüòóõòóîòóçòóàòóÙòóÒòóËòóÄòó½òó¶òó¯òó¨òó¡òóšòó“òóŒòó…òó~òówòópòóiòóbòó[òóTòóMòóFòó?òó8òó1òó*òó#òóòóòóòóòóòóùñóòñóëñóäñóÝñóÖñóÏñóÈñóÁñóºñó³ñó¬ñó¥ñóžñó—ñóñó‰ñó‚ñó{ñótñómñófñó_ñóXñóQñóJñóCñó<ñó5ñó.ñó'ñó ñóñóñó ñóñóýðóöðóïðóèðóáðóÚðóÓðóÌðóÅðó¾ðó·ðó°ðó©ðó¢ðó›ðó”ðóðó†ðóðóxðóqðójðócðó\ðóUðóNðóGðó@ðó9ðó2ðó+ðó$ðóðóðóðóðóðóúïóóïóìïóåïóÞïó×ïóÐïóÉïóÂïó»ïó´ïó­ïó¦ïóŸïó˜ïó‘ïóŠïóƒïó|ïóuïónïógïó`ïóYïóRïóKïóDïó=ïó6ïó/ïó(ïó!ïóïóïó ïóïóþîó÷îóðîóéîóâîóÛîóÔîóÍîóÆîó¿îó¸îó±îóªîó£îóœîó•îóŽîó‡îó€îóyîórîókîódîó]îóVîóOîóHîóAîó:îó3îó,îó%îóîóîóîó îóîóûíóôíóííóæíóßíóØíóÑíóÊíóÃíó¼íóµíó®íó§íó íó™íó’íó‹íó„íó}íóvíóoíóhíóaíóZíóSíóLíóEíó>íó7íó0íó)íó"íóíóíó íóíóÿìóøìóñìóêìóãìóÜìóÕìóÎìóÇìóÀìó¹ìó²ìó«ìó¤ìóìó–ìóìóˆìóìózìósìólìóeìó^ìóWìóPìóIìóBìó;ìó4ìó-ìó&ìóìóìóìó ìóìóüëóõëóîëóçëóàëóÙëóÒëóËëóÄëó½ëó¶ëó¯ëó¨ëó¡ëóšëó“ëóŒëó…ëó~ëówëópëóiëóbëó[ëóTëóMëóFëó?ëó8ëó1ëó*ëó#ëóëóëóëóëóëóùêóòêóëêóäêóÝêóÖêóÏêóÈêóÁêóºêó³êó¬êó¥êóžêó—êóêó‰êó‚êó{êótêómêófêó_êóXêóQêóJêóCêó<êó5êó.êó'êó êóêóêó êóêóýéóöéóïéóèéóáéóÚéóÓéóÌéóÅéó¾éó·éó°éó©éó¢éó›éó”éóéó†éóéóxéóqéójéócéó\éóUéóNéóGéó@éó9éó2éó+éó$éóéóéóéóéóéóúèóóèóìèóåèóÞèó×èóÐèóÉèóÂèó»èó´èó­èó¦èóŸèó˜èó‘èóŠèóƒèó|èóuèónèógèó`èóYèóRèóKèóDèó=èó6èó/èó(èó!èóèóèó èóèóþçó÷çóðçóéçóâçóÛçóÔçóÍçóÆçó¿çó¸çó±çóªçó£çóœçó•çóŽçó‡çó€çóyçórçókçódçó]çóVçóOçóHçóAçó:çó3çó,çó%çóçóçóçó çóçóûæóôæóíæóææóßæóØæóÑæóÊæóÃæó¼æóµæó®æó§æó æó™æó’æó‹æó„æó}æóvæóoæóhæóaæóZæóSæóLæóEæó>æó7æó0æó)æó"æóæóæó æóæóÿåóøåóñåóêåóãåóÜåóÕåóÎåóÇåóÀåó¹åó²åó«åó¤åóåó–åóåóˆåóåózåósåólåóeåó^åóWåóPåóIåóBåó;åó4åó-åó&åóåóåóåó åóåóüäóõäóîäóçäóàäóÙäóÒäóËäóÄäó½äó¶äó¯äó¨äó¡äóšäó“äóŒäó…äó~äówäópäóiäóbäó[äóTäóMäóFäó?äó8äó1äó*äó#äóäóäóäóäóäóùãóòãóëãóäãóÝãóÖãóÏãóÈãóÁãóºãó³ãó¬ãó¥ãóžãó—ãóãó‰ãó‚ãó{ãótãómãófãó_ãóXãóQãóJãóCãó<ãó5ãó.ãó'ãó ãóãóãó ãóãóýâóöâóïâóèâóáâóÚâóÓâóÌâóÅâó¾âó·âó°âó©âó¢âó›âó”âóâó†âóâóxâóqâójâócâó\âóUâóNâóGâó@âó9âó2âó+âó$âóâóâóâóâóâóúáóóáóìáóåáóÞáó×áóÐáóÉáóÂáó»áó´áó­áó¦áóŸáó˜áó‘áóŠáóƒáó|áóuáónáógáó`áóYáóRáóKáóDáó=áó6áó/áó(áó!áóáóáó áóáóþàó÷àóðàóéàóâàóÛàóÔàóÍàóÆàó¿àó¸àó±àóªàó£àóœàó•àóŽàó‡àó€àóyàóràókàódàó]àóVàóOàóHàóAàó:àó3àó,àó%àóàóàóàó àóàóûßóôßóíßóæßóßßóØßóÑßóÊßóÃßó¼ßóµßó®ßó§ßó ßó™ßó’ßó‹ßó„ßó}ßóvßóoßóhßóaßóZßóSßóLßóEßó>ßó7ßó0ßó)ßó"ßóßóßó ßóßóÿÞóøÞóñÞóêÞóãÞóÜÞóÕÞóÎÞóÇÞóÀÞó¹Þó²Þó«Þó¤ÞóÞó–ÞóÞóˆÞóÞózÞósÞólÞóeÞó^ÞóWÞóPÞóIÞóBÞó;Þó4Þó-Þó&ÞóÞóÞóÞó ÞóÞóüÝóõÝóîÝóçÝóàÝóÙÝóÒÝóËÝóÄÝó½Ýó¶Ýó¯Ýó¨Ýó¡ÝóšÝó“ÝóŒÝó…Ýó~ÝówÝópÝóiÝóbÝó[ÝóTÝóMÝóFÝó?Ýó8Ýó1Ýó*Ýó#ÝóÝóÝóÝóÝóÝóùÜóòÜóëÜóäÜóÝÜóÖÜóÏÜóÈÜóÁÜóºÜó³Üó¬Üó¥ÜóžÜó—ÜóÜó‰Üó‚Üó{ÜótÜómÜófÜó_ÜóXÜóQÜóJÜóCÜó<Üó5Üó.Üó'Üó ÜóÜóÜó ÜóÜóýÛóöÛóïÛóèÛóáÛóÚÛóÓÛóÌÛóÅÛó¾Ûó·Ûó°Ûó©Ûó¢Ûó›Ûó”ÛóÛó†ÛóÛóxÛóqÛójÛócÛó\ÛóUÛóNÛóGÛó@Ûó9Ûó2Ûó+Ûó$ÛóÛóÛóÛóÛóÛóúÚóóÚóìÚóåÚóÞÚó×ÚóÐÚóÉÚóÂÚó»Úó´Úó­Úó¦ÚóŸÚó˜Úó‘ÚóŠÚóƒÚó|ÚóuÚónÚógÚó`ÚóYÚóRÚóKÚóDÚó=Úó6Úó/Úó(Úó!ÚóÚóÚó ÚóÚóþÙó÷ÙóðÙóéÙóâÙóÛÙóÔÙóÍÙóÆÙó¿Ùó¸Ùó±ÙóªÙó£ÙóœÙó•ÙóŽÙó‡Ùó€ÙóyÙórÙókÙódÙó]ÙóVÙóOÙóHÙóAÙó:Ùó3Ùó,Ùó%ÙóÙóÙóÙó ÙóÙóûØóôØóíØóæØóߨóØØóÑØóÊØóÃØó¼ØóµØó®Øó§Øó Øó™Øó’Øó‹Øó„Øó}ØóvØóoØóhØóaØóZØóSØóLØóEØó>Øó7Øó0Øó)Øó"ØóØóØó ØóØóÿ×óø×óñ×óê×óã×óÜ×óÕ×óÎ×óÇ×óÀ×ó¹×ó²×ó«×ó¤×ó×ó–×ó×óˆ×ó×óz×ós×ól×óe×ó^×óW×óP×óI×óB×ó;×ó4×ó-×ó&×ó×ó×ó×ó ×ó×óüÖóõÖóîÖóçÖóàÖóÙÖóÒÖóËÖóÄÖó½Öó¶Öó¯Öó¨Öó¡ÖóšÖó“ÖóŒÖó…Öó~ÖówÖópÖóiÖóbÖó[ÖóTÖóMÖóFÖó?Öó8Öó1Öó*Öó#ÖóÖóÖóÖóÖóÖóùÕóòÕóëÕóäÕóÝÕóÖÕóÏÕóÈÕóÁÕóºÕó³Õó¬Õó¥ÕóžÕó—ÕóÕó‰Õó‚Õó{ÕótÕómÕófÕó_ÕóXÕóQÕóJÕóCÕó<Õó5Õó.Õó'Õó ÕóÕóÕó ÕóÕóýÔóöÔóïÔóèÔóáÔóÚÔóÓÔóÌÔóÅÔó¾Ôó·Ôó°Ôó©Ôó¢Ôó›Ôó”ÔóÔó†ÔóÔóxÔóqÔójÔócÔó\ÔóUÔóNÔóGÔó@Ôó9Ôó2Ôó+Ôó$ÔóÔóÔóÔóÔóÔóúÓóóÓóìÓóåÓóÞÓó×ÓóÐÓóÉÓóÂÓó»Óó´Óó­Óó¦ÓóŸÓó˜Óó‘ÓóŠÓóƒÓó|ÓóuÓónÓógÓó`ÓóYÓóRÓóKÓóDÓó=Óó6Óó/Óó(Óó!ÓóÓóÓó ÓóÓóþÒó÷ÒóðÒóéÒóâÒóÛÒóÔÒóÍÒóÆÒó¿Òó¸Òó±ÒóªÒó£ÒóœÒó•ÒóŽÒó‡Òó€ÒóyÒórÒókÒódÒó]ÒóVÒóOÒóHÒóAÒó:Òó3Òó,Òó%ÒóÒóÒóÒó ÒóÒóûÑóôÑóíÑóæÑóßÑóØÑóÑÑóÊÑóÃÑó¼ÑóµÑó®Ñó§Ñó Ñó™Ñó’Ñó‹Ñó„Ñó}ÑóvÑóoÑóhÑóaÑóZÑóSÑóLÑóEÑó>Ñó7Ñó0Ñó)Ñó"ÑóÑóÑó ÑóÑóÿÐóøÐóñÐóêÐóãÐóÜÐóÕÐóÎÐóÇÐóÀÐó¹Ðó²Ðó«Ðó¤ÐóÐó–ÐóÐóˆÐóÐózÐósÐólÐóeÐó^ÐóWÐóPÐóIÐóBÐó;Ðó4Ðó-Ðó&ÐóÐóÐóÐó ÐóÐóüÏóõÏóîÏóçÏóàÏóÙÏóÒÏóËÏóÄÏó½Ïó¶Ïó¯Ïó¨Ïó¡ÏóšÏó“ÏóŒÏó…Ïó~ÏówÏópÏóiÏóbÏó[ÏóTÏóMÏóFÏó?Ïó8Ïó1Ïó*Ïó#ÏóÏóÏóÏóÏóÏóùÎóòÎóëÎóäÎóÝÎóÖÎóÏÎóÈÎóÁÎóºÎó³Îó¬Îó¥ÎóžÎó—ÎóÎó‰Îó‚Îó{ÎótÎómÎófÎó_ÎóXÎóQÎóJÎóCÎó<Îó5Îó.Îó'Îó ÎóÎóÎó ÎóÎóýÍóöÍóïÍóèÍóáÍóÚÍóÓÍóÌÍóÅÍó¾Íó·Íó°Íó©Íó¢Íó›Íó”ÍóÍó†ÍóÍóxÍóqÍójÍócÍó\ÍóUÍóNÍóGÍó@Íó9Íó2Íó+Íó$ÍóÍóÍóÍóÍóÍóúÌóóÌóìÌóåÌóÞÌó×ÌóÐÌóÉÌóÂÌó»Ìó´Ìó­Ìó¦ÌóŸÌó˜Ìó‘ÌóŠÌóƒÌó|ÌóuÌónÌógÌó`ÌóYÌóRÌóKÌóDÌó=Ìó6Ìó/Ìó(Ìó!ÌóÌóÌó ÌóÌóþËó÷ËóðËóéËóâËóÛËóÔËóÍËóÆËó¿Ëó¸Ëó±ËóªËó£ËóœËó•ËóŽËó‡Ëó€ËóyËórËókËódËó]ËóVËóOËóHËóAËó:Ëó3Ëó,Ëó%ËóËóËóËó ËóËóûÊóôÊóíÊóæÊóßÊóØÊóÑÊóÊÊóÃÊó¼ÊóµÊó®Êó§Êó Êó™Êó’Êó‹Êó„Êó}ÊóvÊóoÊóhÊóaÊóZÊóSÊóLÊóEÊó>Êó7Êó0Êó)Êó"ÊóÊóÊó ÊóÊóÿÉóøÉóñÉóêÉóãÉóÜÉóÕÉóÎÉóÇÉóÀÉó¹Éó²Éó«Éó¤ÉóÉó–ÉóÉóˆÉóÉózÉósÉólÉóeÉó^ÉóWÉóPÉóIÉóBÉó;Éó4Éó-Éó&ÉóÉóÉóÉó ÉóÉóüÈóõÈóîÈóçÈóàÈóÙÈóÒÈóËÈóÄÈó½Èó¶Èó¯Èó¨Èó¡ÈóšÈó“ÈóŒÈó…Èó~ÈówÈópÈóiÈóbÈó[ÈóTÈóMÈóFÈó?Èó8Èó1Èó*Èó#ÈóÈóÈóÈóÈóÈóùÇóòÇóëÇóäÇóÝÇóÖÇóÏÇóÈÇóÁÇóºÇó³Çó¬Çó¥ÇóžÇó—ÇóÇó‰Çó‚Çó{ÇótÇómÇófÇó_ÇóXÇóQÇóJÇóCÇó<Çó5Çó.Çó'Çó ÇóÇóÇó ÇóÇóýÆóöÆóïÆóèÆóáÆóÚÆóÓÆóÌÆóÅÆó¾Æó·Æó°Æó©Æó¢Æó›Æó”ÆóÆó†ÆóÆóxÆóqÆójÆócÆó\ÆóUÆóNÆóGÆó@Æó9Æó2Æó+Æó$ÆóÆóÆóÆóÆóÆóúÅóóÅóìÅóåÅóÞÅó×ÅóÐÅóÉÅóÂÅó»Åó´Åó­Åó¦ÅóŸÅó˜Åó‘ÅóŠÅóƒÅó|ÅóuÅónÅógÅó`ÅóYÅóRÅóKÅóDÅó=Åó6Åó/Åó(Åó!ÅóÅóÅó ÅóÅóþÄó÷ÄóðÄóéÄóâÄóÛÄóÔÄóÍÄóÆÄó¿Äó¸Äó±ÄóªÄó£ÄóœÄó•ÄóŽÄó‡Äó€ÄóyÄórÄókÄódÄó]ÄóVÄóOÄóHÄóAÄó:Äó3Äó,Äó%ÄóÄóÄóÄó ÄóÄóûÃóôÃóíÃóæÃóßÃóØÃóÑÃóÊÃóÃÃó¼ÃóµÃó®Ãó§Ãó Ãó™Ãó’Ãó‹Ãó„Ãó}ÃóvÃóoÃóhÃóaÃóZÃóSÃóLÃóEÃó>Ãó7Ãó0Ãó)Ãó"ÃóÃóÃó ÃóÃóÿÂóøÂóñÂóêÂóãÂóÜÂóÕÂóÎÂóÇÂóÀÂó¹Âó²Âó«Âó¤ÂóÂó–ÂóÂóˆÂóÂózÂósÂólÂóeÂó^ÂóWÂóPÂóIÂóBÂó;Âó4Âó-Âó&ÂóÂóÂóÂó ÂóÂóüÁóõÁóîÁóçÁóàÁóÙÁóÒÁóËÁóÄÁó½Áó¶Áó¯Áó¨Áó¡ÁóšÁó“ÁóŒÁó…Áó~ÁówÁópÁóiÁóbÁó[ÁóTÁóMÁóFÁó?Áó8Áó1Áó*Áó#ÁóÁóÁóÁóÁóÁóùÀóòÀóëÀóäÀóÝÀóÖÀóÏÀóÈÀóÁÀóºÀó³Àó¬Àó¥ÀóžÀó—ÀóÀó‰Àó‚Àó{ÀótÀómÀófÀó_ÀóXÀóQÀóJÀóCÀó<Àó5Àó.Àó'Àó ÀóÀóÀó ÀóÀóý¿óö¿óï¿óè¿óá¿óÚ¿óÓ¿óÌ¿óÅ¿ó¾¿ó·¿ó°¿ó©¿ó¢¿ó›¿ó”¿ó¿ó†¿ó¿óx¿óq¿ój¿óc¿ó\¿óU¿óN¿óG¿ó@¿ó9¿ó2¿ó+¿ó$¿ó¿ó¿ó¿ó¿ó¿óú¾óó¾óì¾óå¾óÞ¾ó×¾óоóɾó¾ó»¾ó´¾ó­¾ó¦¾óŸ¾ó˜¾ó‘¾óоóƒ¾ó|¾óu¾ón¾óg¾ó`¾óY¾óR¾óK¾óD¾ó=¾ó6¾ó/¾ó(¾ó!¾ó¾ó¾ó ¾ó¾óþ½ó÷½óð½óé½óâ½óÛ½óÔ½óͽóƽó¿½ó¸½ó±½óª½ó£½óœ½ó•½ó޽ó‡½ó€½óy½ór½ók½ód½ó]½óV½óO½óH½óA½ó:½ó3½ó,½ó%½ó½ó½ó½ó ½ó½óû¼óô¼óí¼óæ¼óß¼óؼóѼóʼóüó¼¼óµ¼ó®¼ó§¼ó ¼ó™¼ó’¼ó‹¼ó„¼ó}¼óv¼óo¼óh¼óa¼óZ¼óS¼óL¼óE¼ó>¼ó7¼ó0¼ó)¼ó"¼ó¼ó¼ó ¼ó¼óÿ»óø»óñ»óê»óã»óÜ»óÕ»óλóÇ»óÀ»ó¹»ó²»ó«»ó¤»ó»ó–»ó»óˆ»ó»óz»ós»ól»óe»ó^»óW»óP»óI»óB»ó;»ó4»ó-»ó&»ó»ó»ó»ó »ó»óüºóõºóîºóçºóàºóÙºóÒºó˺óĺó½ºó¶ºó¯ºó¨ºó¡ºóšºó“ºóŒºó…ºó~ºówºópºóiºóbºó[ºóTºóMºóFºó?ºó8ºó1ºó*ºó#ºóºóºóºóºóºóù¹óò¹óë¹óä¹óݹóÖ¹óϹóȹóÁ¹óº¹ó³¹ó¬¹ó¥¹óž¹ó—¹ó¹ó‰¹ó‚¹ó{¹ót¹óm¹óf¹ó_¹óX¹óQ¹óJ¹óC¹ó<¹ó5¹ó.¹ó'¹ó ¹ó¹ó¹ó ¹ó¹óý¸óö¸óï¸óè¸óá¸óÚ¸óÓ¸ó̸óŸó¾¸ó·¸ó°¸ó©¸ó¢¸ó›¸ó”¸ó¸ó†¸ó¸óx¸óq¸ój¸óc¸ó\¸óU¸óN¸óG¸ó@¸ó9¸ó2¸ó+¸ó$¸ó¸ó¸ó¸ó¸ó¸óú·óó·óì·óå·óÞ·ó×·óзóÉ·ó·ó»·ó´·ó­·ó¦·óŸ·ó˜·ó‘·óŠ·óƒ·ó|·óu·ón·óg·ó`·óY·óR·óK·óD·ó=·ó6·ó/·ó(·ó!·ó·ó·ó ·ó·óþ¶ó÷¶óð¶óé¶óâ¶óÛ¶óÔ¶óͶóƶó¿¶ó¸¶ó±¶óª¶ó£¶óœ¶ó•¶ó޶ó‡¶ó€¶óy¶ór¶ók¶ód¶ó]¶óV¶óO¶óH¶óA¶ó:¶ó3¶ó,¶ó%¶ó¶ó¶ó¶ó ¶ó¶óûµóôµóíµóæµóßµóصóѵóʵóõó¼µóµµó®µó§µó µó™µó’µó‹µó„µó}µóvµóoµóhµóaµóZµóSµóLµóEµó>µó7µó0µó)µó"µóµóµó µóµóÿ´óø´óñ´óê´óã´óÜ´óÕ´óδóÇ´óÀ´ó¹´ó²´ó«´ó¤´ó´ó–´ó´óˆ´ó´óz´ós´ól´óe´ó^´óW´óP´óI´óB´ó;´ó4´ó-´ó&´ó´ó´ó´ó ´ó´óü³óõ³óî³óç³óà³óÙ³óÒ³ó˳óijó½³ó¶³ó¯³ó¨³ó¡³óš³ó“³óŒ³ó…³ó~³ów³óp³ói³ób³ó[³óT³óM³óF³ó?³ó8³ó1³ó*³ó#³ó³ó³ó³ó³ó³óù²óò²óë²óä²óݲóÖ²óϲóȲóÁ²óº²ó³²ó¬²ó¥²óž²ó—²ó²ó‰²ó‚²ó{²ót²óm²óf²ó_²óX²óQ²óJ²óC²ó<²ó5²ó.²ó'²ó ²ó²ó²ó ²ó²óý±óö±óï±óè±óá±óÚ±óÓ±ó̱óűó¾±ó·±ó°±ó©±ó¢±ó›±ó”±ó±ó†±ó±óx±óq±ój±óc±ó\±óU±óN±óG±ó@±ó9±ó2±ó+±ó$±ó±ó±ó±ó±ó±óú°óó°óì°óå°óÞ°ó×°óаóɰó°ó»°ó´°ó­°ó¦°óŸ°ó˜°ó‘°óаóƒ°ó|°óu°ón°óg°ó`°óY°óR°óK°óD°ó=°ó6°ó/°ó(°ó!°ó°ó°ó °ó°óþ¯ó÷¯óð¯óé¯óâ¯óÛ¯óÔ¯óͯóƯó¿¯ó¸¯ó±¯óª¯ó£¯óœ¯ó•¯óޝó‡¯ó€¯óy¯ór¯ók¯ód¯ó]¯óV¯óO¯óH¯óA¯ó:¯ó3¯ó,¯ó%¯ó¯ó¯ó¯ó ¯ó¯óû®óô®óí®óæ®óß®óØ®óÑ®óÊ®óîó¼®óµ®ó®®ó§®ó ®ó™®ó’®ó‹®ó„®ó}®óv®óo®óh®óa®óZ®óS®óL®óE®ó>®ó7®ó0®ó)®ó"®ó®ó®ó ®ó®óÿ­óø­óñ­óê­óã­óÜ­óÕ­óέóÇ­óÀ­ó¹­ó²­ó«­ó¤­ó­ó–­ó­óˆ­ó­óz­ós­ól­óe­ó^­óW­óP­óI­óB­ó;­ó4­ó-­ó&­ó­ó­ó­ó ­ó­óü¬óõ¬óî¬óç¬óà¬óÙ¬óÒ¬óˬóĬó½¬ó¶¬ó¯¬ó¨¬ó¡¬óš¬ó“¬óŒ¬ó…¬ó~¬ów¬óp¬ói¬ób¬ó[¬óT¬óM¬óF¬ó?¬ó8¬ó1¬ó*¬ó#¬ó¬ó¬ó¬ó¬ó¬óù«óò«óë«óä«óÝ«óÖ«óÏ«óÈ«óÁ«óº«ó³«ó¬«ó¥«óž«ó—«ó«ó‰«ó‚«ó{«ót«óm«óf«ó_«óX«óQ«óJ«óC«ó<«ó5«ó.«ó'«ó «ó«ó«ó «ó«óýªóöªóïªóèªóáªóÚªóÓªó̪óŪó¾ªó·ªó°ªó©ªó¢ªó›ªó”ªóªó†ªóªóxªóqªójªócªó\ªóUªóNªóGªó@ªó9ªó2ªó+ªó$ªóªóªóªóªóªóú©óó©óì©óå©óÞ©óשóЩóÉ©ó©ó»©ó´©ó­©ó¦©óŸ©ó˜©ó‘©óŠ©óƒ©ó|©óu©ón©óg©ó`©óY©óR©óK©óD©ó=©ó6©ó/©ó(©ó!©ó©ó©ó ©ó©óþ¨ó÷¨óð¨óé¨óâ¨óÛ¨óÔ¨óͨóƨó¿¨ó¸¨ó±¨óª¨ó£¨óœ¨ó•¨óލó‡¨ó€¨óy¨ór¨ók¨ód¨ó]¨óV¨óO¨óH¨óA¨ó:¨ó3¨ó,¨ó%¨ó¨ó¨ó¨ó ¨ó¨óû§óô§óí§óæ§óß§óاóѧóʧóçó¼§óµ§ó®§ó§§ó §ó™§ó’§ó‹§ó„§ó}§óv§óo§óh§óa§óZ§óS§óL§óE§ó>§ó7§ó0§ó)§ó"§ó§ó§ó §ó§óÿ¦óø¦óñ¦óê¦óã¦óܦóÕ¦óΦóǦóÀ¦ó¹¦ó²¦ó«¦ó¤¦ó¦ó–¦ó¦óˆ¦ó¦óz¦ós¦ól¦óe¦ó^¦óW¦óP¦óI¦óB¦ó;¦ó4¦ó-¦ó&¦ó¦ó¦ó¦ó ¦ó¦óü¥óõ¥óî¥óç¥óà¥óÙ¥óÒ¥óË¥óÄ¥ó½¥ó¶¥ó¯¥ó¨¥ó¡¥óš¥ó“¥óŒ¥ó…¥ó~¥ów¥óp¥ói¥ób¥ó[¥óT¥óM¥óF¥ó?¥ó8¥ó1¥ó*¥ó#¥ó¥ó¥ó¥ó¥ó¥óù¤óò¤óë¤óä¤óݤóÖ¤óϤóȤóÁ¤óº¤ó³¤ó¬¤ó¥¤óž¤ó—¤ó¤ó‰¤ó‚¤ó{¤ót¤óm¤óf¤ó_¤óX¤óQ¤óJ¤óC¤ó<¤ó5¤ó.¤ó'¤ó ¤ó¤ó¤ó ¤ó¤óý£óö£óï£óè£óá£óÚ£óÓ£óÌ£óÅ£ó¾£ó·£ó°£ó©£ó¢£ó›£ó”£ó£ó†£ó£óx£óq£ój£óc£ó\£óU£óN£óG£ó@£ó9£ó2£ó+£ó$£ó£ó£ó£ó£ó£óú¢óó¢óì¢óå¢óÞ¢ó×¢óТóÉ¢ó¢ó»¢ó´¢ó­¢ó¦¢óŸ¢ó˜¢ó‘¢óŠ¢óƒ¢ó|¢óu¢ón¢óg¢ó`¢óY¢óR¢óK¢óD¢ó=¢ó6¢ó/¢ó(¢ó!¢ó¢ó¢ó ¢ó¢óþ¡ó÷¡óð¡óé¡óâ¡óÛ¡óÔ¡óÍ¡óÆ¡ó¿¡ó¸¡ó±¡óª¡ó£¡óœ¡ó•¡óŽ¡ó‡¡ó€¡óy¡ór¡ók¡ód¡ó]¡óV¡óO¡óH¡óA¡ó:¡ó3¡ó,¡ó%¡ó¡ó¡ó¡ó ¡ó¡óû óô óí óæ óß óØ óÑ óÊ óàó¼ óµ ó® ó§ ó  ó™ ó’ ó‹ ó„ ó} óv óo óh óa óZ óS óL óE ó> ó7 ó0 ó) ó" ó ó ó  ó óÿŸóøŸóñŸóêŸóãŸóÜŸóÕŸóΟóÇŸóÀŸó¹Ÿó²Ÿó«Ÿó¤ŸóŸó–ŸóŸóˆŸóŸózŸósŸólŸóeŸó^ŸóWŸóPŸóIŸóBŸó;Ÿó4Ÿó-Ÿó&ŸóŸóŸóŸó ŸóŸóüžóõžóîžóçžóàžóÙžóÒžóËžóÄžó½žó¶žó¯žó¨žó¡žóšžó“žóŒžó…žó~žówžópžóižóbžó[žóTžóMžóFžó?žó8žó1žó*žó#žóžóžóžóžóžóùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýœóöœóïœóèœóáœóÚœóÓœóÌœóÅœó¾œó·œó°œó©œó¢œó›œó”œóœó†œóœóxœóqœójœócœó\œóUœóNœóGœó@œó9œó2œó+œó$œóœóœóœóœóœóú›óó›óì›óå›óÞ›ó×›óЛóÉ›ó›ó»›ó´›ó­›ó¦›óŸ›ó˜›ó‘›óŠ›óƒ›ó|›óu›ón›óg›ó`›óY›óR›óK›óD›ó=›ó6›ó/›ó(›ó!›ó›ó›ó ›ó›óþšó÷šóðšóéšóâšóÛšóÔšóÍšóÆšó¿šó¸šó±šóªšó£šóœšó•šóŽšó‡šó€šóyšóršókšódšó]šóVšóOšóHšóAšó:šó3šó,šó%šóšóšóšó šóšóû™óô™óí™óæ™óß™óØ™óÑ™óÊ™óÙó¼™óµ™ó®™ó§™ó ™ó™™ó’™ó‹™ó„™ó}™óv™óo™óh™óa™óZ™óS™óL™óE™ó>™ó7™ó0™ó)™ó"™ó™ó™ó ™ó™óÿ˜óø˜óñ˜óê˜óã˜óܘóÕ˜óΘóǘóÀ˜ó¹˜ó²˜ó«˜ó¤˜ó˜ó–˜ó˜óˆ˜ó˜óz˜ós˜ól˜óe˜ó^˜óW˜óP˜óI˜óB˜ó;˜ó4˜ó-˜ó&˜ó˜ó˜ó˜ó ˜ó˜óü—óõ—óî—óç—óà—óÙ—óÒ—óË—óÄ—ó½—ó¶—ó¯—ó¨—ó¡—óš—ó“—óŒ—ó…—ó~—ów—óp—ói—ób—ó[—óT—óM—óF—ó?—ó8—ó1—ó*—ó#—ó—ó—ó—ó—ó—óù–óò–óë–óä–óÝ–óÖ–óÏ–óÈ–óÁ–óº–ó³–ó¬–ó¥–óž–ó—–ó–ó‰–ó‚–ó{–ót–óm–óf–ó_–óX–óQ–óJ–óC–ó<–ó5–ó.–ó'–ó –ó–ó–ó –ó–óý•óö•óï•óè•óá•óÚ•óÓ•óÌ•óÅ•ó¾•ó·•ó°•ó©•ó¢•ó›•ó”•ó•ó†•ó•óx•óq•ój•óc•ó\•óU•óN•óG•ó@•ó9•ó2•ó+•ó$•ó•ó•ó•ó•ó•óú”óó”óì”óå”óÞ”ó×”óДóÉ”ó”ó»”ó´”ó­”ó¦”óŸ”ó˜”ó‘”óŠ”óƒ”ó|”óu”ón”óg”ó`”óY”óR”óK”óD”ó=”ó6”ó/”ó(”ó!”ó”ó”ó ”ó”óþ“ó÷“óð“óé“óâ“óÛ“óÔ“óÍ“óÆ“ó¿“ó¸“ó±“óª“ó£“óœ“ó•“óŽ“ó‡“ó€“óy“ór“ók“ód“ó]“óV“óO“óH“óA“ó:“ó3“ó,“ó%“ó“ó“ó“ó “ó“óû’óô’óí’óæ’óß’óØ’óÑ’óÊ’óÃ’ó¼’óµ’ó®’ó§’ó ’ó™’ó’’ó‹’ó„’ó}’óv’óo’óh’óa’óZ’óS’óL’óE’ó>’ó7’ó0’ó)’ó"’ó’ó’ó ’ó’óÿ‘óø‘óñ‘óê‘óã‘óÜ‘óÕ‘óΑóÇ‘óÀ‘ó¹‘ó²‘ó«‘ó¤‘ó‘ó–‘ó‘óˆ‘ó‘óz‘ós‘ól‘óe‘ó^‘óW‘óP‘óI‘óB‘ó;‘ó4‘ó-‘ó&‘ó‘ó‘ó‘ó ‘ó‘óüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýŽóöŽóïŽóèŽóáŽóÚŽóÓŽóÌŽóÅŽó¾Žó·Žó°Žó©Žó¢Žó›Žó”ŽóŽó†ŽóŽóxŽóqŽójŽócŽó\ŽóUŽóNŽóGŽó@Žó9Žó2Žó+Žó$ŽóŽóŽóŽóŽóŽóúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþŒó÷ŒóðŒóéŒóâŒóÛŒóÔŒóÍŒóÆŒó¿Œó¸Œó±ŒóªŒó£ŒóœŒó•ŒóŽŒó‡Œó€ŒóyŒórŒókŒódŒó]ŒóVŒóOŒóHŒóAŒó:Œó3Œó,Œó%ŒóŒóŒóŒó ŒóŒóû‹óô‹óí‹óæ‹óß‹óØ‹óÑ‹óÊ‹óËó¼‹óµ‹ó®‹ó§‹ó ‹ó™‹ó’‹ó‹‹ó„‹ó}‹óv‹óo‹óh‹óa‹óZ‹óS‹óL‹óE‹ó>‹ó7‹ó0‹ó)‹ó"‹ó‹ó‹ó ‹ó‹óÿŠóøŠóñŠóêŠóãŠóÜŠóÕŠóΊóÇŠóÀŠó¹Šó²Šó«Šó¤ŠóŠó–ŠóŠóˆŠóŠózŠósŠólŠóeŠó^ŠóWŠóPŠóIŠóBŠó;Šó4Šó-Šó&ŠóŠóŠóŠó ŠóŠóü‰óõ‰óî‰óç‰óà‰óÙ‰óÒ‰óˉóĉó½‰ó¶‰ó¯‰ó¨‰ó¡‰óš‰ó“‰óŒ‰ó…‰ó~‰ów‰óp‰ói‰ób‰ó[‰óT‰óM‰óF‰ó?‰ó8‰ó1‰ó*‰ó#‰ó‰ó‰ó‰ó‰ó‰óùˆóòˆóëˆóäˆó݈óÖˆóψóȈóÁˆóºˆó³ˆó¬ˆó¥ˆóžˆó—ˆóˆó‰ˆó‚ˆó{ˆótˆómˆófˆó_ˆóXˆóQˆóJˆóCˆó<ˆó5ˆó.ˆó'ˆó ˆóˆóˆó ˆóˆóý‡óö‡óï‡óè‡óá‡óÚ‡óÓ‡ó̇óŇó¾‡ó·‡ó°‡ó©‡ó¢‡ó›‡ó”‡ó‡ó†‡ó‡óx‡óq‡ój‡óc‡ó\‡óU‡óN‡óG‡ó@‡ó9‡ó2‡ó+‡ó$‡ó‡ó‡ó‡ó‡ó‡óú†óó†óì†óå†óÞ†ó׆óІóɆó†ó»†ó´†ó­†ó¦†óŸ†ó˜†ó‘†óІóƒ†ó|†óu†ón†óg†ó`†óY†óR†óK†óD†ó=†ó6†ó/†ó(†ó!†ó†ó†ó †ó†óþ…ó÷…óð…óé…óâ…óÛ…óÔ…óÍ…óÆ…ó¿…ó¸…ó±…óª…ó£…óœ…ó•…óŽ…ó‡…ó€…óy…ór…ók…ód…ó]…óV…óO…óH…óA…ó:…ó3…ó,…ó%…ó…ó…ó…ó …ó…óû„óô„óí„óæ„óß„óØ„óÑ„óÊ„óÄó¼„óµ„ó®„ó§„ó „ó™„ó’„ó‹„ó„„ó}„óv„óo„óh„óa„óZ„óS„óL„óE„ó>„ó7„ó0„ó)„ó"„ó„ó„ó „ó„óÿƒóøƒóñƒóêƒóãƒó܃óÕƒó΃óǃóÀƒó¹ƒó²ƒó«ƒó¤ƒóƒó–ƒóƒóˆƒóƒózƒósƒólƒóeƒó^ƒóWƒóPƒóIƒóBƒó;ƒó4ƒó-ƒó&ƒóƒóƒóƒó ƒóƒóü‚óõ‚óî‚óç‚óà‚óÙ‚óÒ‚óË‚óÄ‚ó½‚ó¶‚ó¯‚ó¨‚ó¡‚óš‚ó“‚óŒ‚ó…‚ó~‚ów‚óp‚ói‚ób‚ó[‚óT‚óM‚óF‚ó?‚ó8‚ó1‚ó*‚ó#‚ó‚ó‚ó‚ó‚ó‚óùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóý€óö€óï€óè€óá€óÚ€óÓ€óÌ€óÅ€ó¾€ó·€ó°€ó©€ó¢€ó›€ó”€ó€ó†€ó€óx€óq€ój€óc€ó\€óU€óN€óG€ó@€ó9€ó2€ó+€ó$€ó€ó€ó€ó€ó€óúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþ~ó÷~óð~óé~óâ~óÛ~óÔ~óÍ~óÆ~ó¿~ó¸~ó±~óª~ó£~óœ~ó•~óŽ~ó‡~ó€~óy~ór~ók~ód~ó]~óV~óO~óH~óA~ó:~ó3~ó,~ó%~ó~ó~ó~ó ~ó~óû}óô}óí}óæ}óß}óØ}óÑ}óÊ}óÃ}ó¼}óµ}ó®}ó§}ó }ó™}ó’}ó‹}ó„}ó}}óv}óo}óh}óa}óZ}óS}óL}óE}ó>}ó7}ó0}ó)}ó"}ó}ó}ó }ó}óÿ|óø|óñ|óê|óã|óÜ|óÕ|óÎ|óÇ|óÀ|ó¹|ó²|ó«|ó¤|ó|ó–|ó|óˆ|ó|óz|ós|ól|óe|ó^|óW|óP|óI|óB|ó;|ó4|ó-|ó&|ó|ó|ó|ó |ó|óü{óõ{óî{óç{óà{óÙ{óÒ{óË{óÄ{ó½{ó¶{ó¯{ó¨{ó¡{óš{ó“{óŒ{ó…{ó~{ów{óp{ói{ób{ó[{óT{óM{óF{ó?{ó8{ó1{ó*{ó#{ó{ó{ó{ó{ó{óùzóòzóëzóäzóÝzóÖzóÏzóÈzóÁzóºzó³zó¬zó¥zóžzó—zózó‰zó‚zó{zótzómzófzó_zóXzóQzóJzóCzóvó7vó0vó)vó"vóvóvó vóvóÿuóøuóñuóêuóãuóÜuóÕuóÎuóÇuóÀuó¹uó²uó«uó¤uóuó–uóuóˆuóuózuósuóluóeuó^uóWuóPuóIuóBuó;uó4uó-uó&uóuóuóuó uóuóütóõtóîtóçtóàtóÙtóÒtóËtóÄtó½tó¶tó¯tó¨tó¡tóštó“tóŒtó…tó~tówtóptóitóbtó[tóTtóMtóFtó?tó8tó1tó*tó#tótótótótótóùsóòsóësóäsóÝsóÖsóÏsóÈsóÁsóºsó³só¬só¥sóžsó—sósó‰só‚só{sótsómsófsó_sóXsóQsóJsóCsóoó7oó0oó)oó"oóoóoó oóoóÿnóønóñnóênóãnóÜnóÕnóÎnóÇnóÀnó¹nó²nó«nó¤nónó–nónóˆnónóznósnólnóenó^nóWnóPnóInóBnó;nó4nó-nó&nónónónó nónóümóõmóîmóçmóàmóÙmóÒmóËmóÄmó½mó¶mó¯mó¨mó¡móšmó“móŒmó…mó~mówmópmóimóbmó[móTmóMmóFmó?mó8mó1mó*mó#mómómómómómóùlóòlóëlóälóÝlóÖlóÏlóÈlóÁlóºló³ló¬ló¥lóžló—lóló‰ló‚ló{lótlómlófló_lóXlóQlóJlóClóhó7hó0hó)hó"hóhóhó hóhóÿgóøgóñgóêgóãgóÜgóÕgóÎgóÇgóÀgó¹gó²gó«gó¤gógó–gógóˆgógózgósgólgóegó^góWgóPgóIgóBgó;gó4gó-gó&gógógógó gógóüfóõfóîfóçfóàfóÙfóÒfóËfóÄfó½fó¶fó¯fó¨fó¡fóšfó“fóŒfó…fó~fówfópfóifóbfó[fóTfóMfóFfó?fó8fó1fó*fó#fófófófófófóùeóòeóëeóäeóÝeóÖeóÏeóÈeóÁeóºeó³eó¬eó¥eóžeó—eóeó‰eó‚eó{eóteómeófeó_eóXeóQeóJeóCeóaó7aó0aó)aó"aóaóaó aóaóÿ`óø`óñ`óê`óã`óÜ`óÕ`óÎ`óÇ`óÀ`ó¹`ó²`ó«`ó¤`ó`ó–`ó`óˆ`ó`óz`ós`ól`óe`ó^`óW`óP`óI`óB`ó;`ó4`ó-`ó&`ó`ó`ó`ó `ó`óü_óõ_óî_óç_óà_óÙ_óÒ_óË_óÄ_ó½_ó¶_ó¯_ó¨_ó¡_óš_ó“_óŒ_ó…_ó~_ów_óp_ói_ób_ó[_óT_óM_óF_ó?_ó8_ó1_ó*_ó#_ó_ó_ó_ó_ó_óù^óò^óë^óä^óÝ^óÖ^óÏ^óÈ^óÁ^óº^ó³^ó¬^ó¥^óž^ó—^ó^ó‰^ó‚^ó{^ót^óm^óf^ó_^óX^óQ^óJ^óC^ó<^ó5^ó.^ó'^ó ^ó^ó^ó ^ó^óý]óö]óï]óè]óá]óÚ]óÓ]óÌ]óÅ]ó¾]ó·]ó°]ó©]ó¢]ó›]ó”]ó]ó†]ó]óx]óq]ój]óc]ó\]óU]óN]óG]ó@]ó9]ó2]ó+]ó$]ó]ó]ó]ó]ó]óú\óó\óì\óå\óÞ\ó×\óÐ\óÉ\óÂ\ó»\ó´\ó­\ó¦\óŸ\ó˜\ó‘\óŠ\óƒ\ó|\óu\ón\óg\ó`\óY\óR\óK\óD\ó=\ó6\ó/\ó(\ó!\ó\ó\ó \ó\óþ[ó÷[óð[óé[óâ[óÛ[óÔ[óÍ[óÆ[ó¿[ó¸[ó±[óª[ó£[óœ[ó•[óŽ[ó‡[ó€[óy[ór[ók[ód[ó][óV[óO[óH[óA[ó:[ó3[ó,[ó%[ó[ó[ó[ó [ó[óûZóôZóíZóæZóßZóØZóÑZóÊZóÃZó¼ZóµZó®Zó§Zó Zó™Zó’Zó‹Zó„Zó}ZóvZóoZóhZóaZóZZóSZóLZóEZó>Zó7Zó0Zó)Zó"ZóZóZó ZóZóÿYóøYóñYóêYóãYóÜYóÕYóÎYóÇYóÀYó¹Yó²Yó«Yó¤YóYó–YóYóˆYóYózYósYólYóeYó^YóWYóPYóIYóBYó;Yó4Yó-Yó&YóYóYóYó YóYóüXóõXóîXóçXóàXóÙXóÒXóËXóÄXó½Xó¶Xó¯Xó¨Xó¡XóšXó“XóŒXó…Xó~XówXópXóiXóbXó[XóTXóMXóFXó?Xó8Xó1Xó*Xó#XóXóXóXóXóXóùWóòWóëWóäWóÝWóÖWóÏWóÈWóÁWóºWó³Wó¬Wó¥WóžWó—WóWó‰Wó‚Wó{WótWómWófWó_WóXWóQWóJWóCWóSó7Só0Só)Só"SóSóSó SóSóÿRóøRóñRóêRóãRóÜRóÕRóÎRóÇRóÀRó¹Ró²Ró«Ró¤RóRó–RóRóˆRóRózRósRólRóeRó^RóWRóPRóIRóBRó;Ró4Ró-Ró&RóRóRóRó RóRóüQóõQóîQóçQóàQóÙQóÒQóËQóÄQó½Qó¶Qó¯Qó¨Qó¡QóšQó“QóŒQó…Qó~QówQópQóiQóbQó[QóTQóMQóFQó?Qó8Qó1Qó*Qó#QóQóQóQóQóQóùPóòPóëPóäPóÝPóÖPóÏPóÈPóÁPóºPó³Pó¬Pó¥PóžPó—PóPó‰Pó‚Pó{PótPómPófPó_PóXPóQPóJPóCPóLó7Ló0Ló)Ló"LóLóLó LóLóÿKóøKóñKóêKóãKóÜKóÕKóÎKóÇKóÀKó¹Kó²Kó«Kó¤KóKó–KóKóˆKóKózKósKólKóeKó^KóWKóPKóIKóBKó;Kó4Kó-Kó&KóKóKóKó KóKóüJóõJóîJóçJóàJóÙJóÒJóËJóÄJó½Jó¶Jó¯Jó¨Jó¡JóšJó“JóŒJó…Jó~JówJópJóiJóbJó[JóTJóMJóFJó?Jó8Jó1Jó*Jó#JóJóJóJóJóJóùIóòIóëIóäIóÝIóÖIóÏIóÈIóÁIóºIó³Ió¬Ió¥IóžIó—IóIó‰Ió‚Ió{IótIómIófIó_IóXIóQIóJIóCIóEó7Eó0Eó)Eó"EóEóEó EóEóÿDóøDóñDóêDóãDóÜDóÕDóÎDóÇDóÀDó¹Dó²Dó«Dó¤DóDó–DóDóˆDóDózDósDólDóeDó^DóWDóPDóIDóBDó;Dó4Dó-Dó&DóDóDóDó DóDóüCóõCóîCóçCóàCóÙCóÒCóËCóÄCó½Có¶Có¯Có¨Có¡CóšCó“CóŒCó…Có~CówCópCóiCóbCó[CóTCóMCóFCó?Có8Có1Có*Có#CóCóCóCóCóCóùBóòBóëBóäBóÝBóÖBóÏBóÈBóÁBóºBó³Bó¬Bó¥BóžBó—BóBó‰Bó‚Bó{BótBómBófBó_BóXBóQBóJBóCBóóô>óí>óæ>óß>óØ>óÑ>óÊ>óÃ>ó¼>óµ>ó®>ó§>ó >ó™>ó’>ó‹>ó„>ó}>óv>óo>óh>óa>óZ>óS>óL>óE>ó>>ó7>ó0>ó)>ó">ó>ó>ó >ó>óÿ=óø=óñ=óê=óã=óÜ=óÕ=óÎ=óÇ=óÀ=ó¹=ó²=ó«=ó¤=ó=ó–=ó=óˆ=ó=óz=ós=ól=óe=ó^=óW=óP=óI=óB=ó;=ó4=ó-=ó&=ó=ó=ó=ó =ó=óü<óõ<óî<óç<óà<óÙ<óÒ<óË<óÄ<ó½<ó¶<ó¯<ó¨<ó¡<óš<ó“<óŒ<ó…<ó~<ów<óp<ói<ób<ó[<óT<óM<óF<ó?<ó8<ó1<ó*<ó#<ó<ó<ó<ó<ó<óù;óò;óë;óä;óÝ;óÖ;óÏ;óÈ;óÁ;óº;ó³;ó¬;ó¥;óž;ó—;ó;ó‰;ó‚;ó{;ót;óm;óf;ó_;óX;óQ;óJ;óC;ó<;ó5;ó.;ó';ó ;ó;ó;ó ;ó;óý:óö:óï:óè:óá:óÚ:óÓ:óÌ:óÅ:ó¾:ó·:ó°:ó©:ó¢:ó›:ó”:ó:ó†:ó:óx:óq:ój:óc:ó\:óU:óN:óG:ó@:ó9:ó2:ó+:ó$:ó:ó:ó:ó:ó:óú9óó9óì9óå9óÞ9ó×9óÐ9óÉ9óÂ9ó»9ó´9ó­9ó¦9óŸ9ó˜9ó‘9óŠ9óƒ9ó|9óu9ón9óg9ó`9óY9óR9óK9óD9ó=9ó69ó/9ó(9ó!9ó9ó9ó 9ó9óþ8ó÷8óð8óé8óâ8óÛ8óÔ8óÍ8óÆ8ó¿8ó¸8ó±8óª8ó£8óœ8ó•8óŽ8ó‡8ó€8óy8ór8ók8ód8ó]8óV8óO8óH8óA8ó:8ó38ó,8ó%8ó8ó8ó8ó 8ó8óû7óô7óí7óæ7óß7óØ7óÑ7óÊ7óÃ7ó¼7óµ7ó®7ó§7ó 7ó™7ó’7ó‹7ó„7ó}7óv7óo7óh7óa7óZ7óS7óL7óE7ó>7ó77ó07ó)7ó"7ó7ó7ó 7ó7óÿ6óø6óñ6óê6óã6óÜ6óÕ6óÎ6óÇ6óÀ6ó¹6ó²6ó«6ó¤6ó6ó–6ó6óˆ6ó6óz6ós6ól6óe6ó^6óW6óP6óI6óB6ó;6ó46ó-6ó&6ó6ó6ó6ó 6ó6óü5óõ5óî5óç5óà5óÙ5óÒ5óË5óÄ5ó½5ó¶5ó¯5ó¨5ó¡5óš5ó“5óŒ5ó…5ó~5ów5óp5ói5ób5ó[5óT5óM5óF5ó?5ó85ó15ó*5ó#5ó5ó5ó5ó5ó5óù4óò4óë4óä4óÝ4óÖ4óÏ4óÈ4óÁ4óº4ó³4ó¬4ó¥4óž4ó—4ó4ó‰4ó‚4ó{4ót4óm4óf4ó_4óX4óQ4óJ4óC4ó<4ó54ó.4ó'4ó 4ó4ó4ó 4ó4óý3óö3óï3óè3óá3óÚ3óÓ3óÌ3óÅ3ó¾3ó·3ó°3ó©3ó¢3ó›3ó”3ó3ó†3ó3óx3óq3ój3óc3ó\3óU3óN3óG3ó@3ó93ó23ó+3ó$3ó3ó3ó3ó3ó3óú2óó2óì2óå2óÞ2ó×2óÐ2óÉ2óÂ2ó»2ó´2ó­2ó¦2óŸ2ó˜2ó‘2óŠ2óƒ2ó|2óu2ón2óg2ó`2óY2óR2óK2óD2ó=2ó62ó/2ó(2ó!2ó2ó2ó 2ó2óþ1ó÷1óð1óé1óâ1óÛ1óÔ1óÍ1óÆ1ó¿1ó¸1ó±1óª1ó£1óœ1ó•1óŽ1ó‡1ó€1óy1ór1ók1ód1ó]1óV1óO1óH1óA1ó:1ó31ó,1ó%1ó1ó1ó1ó 1ó1óû0óô0óí0óæ0óß0óØ0óÑ0óÊ0óÃ0ó¼0óµ0ó®0ó§0ó 0ó™0ó’0ó‹0ó„0ó}0óv0óo0óh0óa0óZ0óS0óL0óE0ó>0ó70ó00ó)0ó"0ó0ó0ó 0ó0óÿ/óø/óñ/óê/óã/óÜ/óÕ/óÎ/óÇ/óÀ/ó¹/ó²/ó«/ó¤/ó/ó–/ó/óˆ/ó/óz/ós/ól/óe/ó^/óW/óP/óI/óB/ó;/ó4/ó-/ó&/ó/ó/ó/ó /ó/óü.óõ.óî.óç.óà.óÙ.óÒ.óË.óÄ.ó½.ó¶.ó¯.ó¨.ó¡.óš.ó“.óŒ.ó….ó~.ów.óp.ói.ób.ó[.óT.óM.óF.ó?.ó8.ó1.ó*.ó#.ó.ó.ó.ó.ó.óù-óò-óë-óä-óÝ-óÖ-óÏ-óÈ-óÁ-óº-ó³-ó¬-ó¥-óž-ó—-ó-ó‰-ó‚-ó{-ót-óm-óf-ó_-óX-óQ-óJ-óC-ó<-ó5-ó.-ó'-ó -ó-ó-ó -ó-óý,óö,óï,óè,óá,óÚ,óÓ,óÌ,óÅ,ó¾,ó·,ó°,ó©,ó¢,ó›,ó”,ó,ó†,ó,óx,óq,ój,óc,ó\,óU,óN,óG,ó@,ó9,ó2,ó+,ó$,ó,ó,ó,ó,ó,óú+óó+óì+óå+óÞ+ó×+óÐ+óÉ+óÂ+ó»+ó´+ó­+ó¦+óŸ+ó˜+ó‘+óŠ+óƒ+ó|+óu+ón+óg+ó`+óY+óR+óK+óD+ó=+ó6+ó/+ó(+ó!+ó+ó+ó +ó+óþ*ó÷*óð*óé*óâ*óÛ*óÔ*óÍ*óÆ*ó¿*ó¸*ó±*óª*ó£*óœ*ó•*óŽ*ó‡*ó€*óy*ór*ók*ód*ó]*óV*óO*óH*óA*ó:*ó3*ó,*ó%*ó*ó*ó*ó *ó*óû)óô)óí)óæ)óß)óØ)óÑ)óÊ)óÃ)ó¼)óµ)ó®)ó§)ó )ó™)ó’)ó‹)ó„)ó})óv)óo)óh)óa)óZ)óS)óL)óE)ó>)ó7)ó0)ó))ó")ó)ó)ó )ó)óÿ(óø(óñ(óê(óã(óÜ(óÕ(óÎ(óÇ(óÀ(ó¹(ó²(ó«(ó¤(ó(ó–(ó(óˆ(ó(óz(ós(ól(óe(ó^(óW(óP(óI(óB(ó;(ó4(ó-(ó&(ó(ó(ó(ó (ó(óü'óõ'óî'óç'óà'óÙ'óÒ'óË'óÄ'ó½'ó¶'ó¯'ó¨'ó¡'óš'ó“'óŒ'ó…'ó~'ów'óp'ói'ób'ó['óT'óM'óF'ó?'ó8'ó1'ó*'ó#'ó'ó'ó'ó'ó'óù&óò&óë&óä&óÝ&óÖ&óÏ&óÈ&óÁ&óº&ó³&ó¬&ó¥&óž&ó—&ó&ó‰&ó‚&ó{&ót&óm&óf&ó_&óX&óQ&óJ&óC&ó<&ó5&ó.&ó'&ó &ó&ó&ó &ó&óý%óö%óï%óè%óá%óÚ%óÓ%óÌ%óÅ%ó¾%ó·%ó°%ó©%ó¢%ó›%ó”%ó%ó†%ó%óx%óq%ój%óc%ó\%óU%óN%óG%ó@%ó9%ó2%ó+%ó$%ó%ó%ó%ó%ó%óú$óó$óì$óå$óÞ$ó×$óÐ$óÉ$óÂ$ó»$ó´$ó­$ó¦$óŸ$ó˜$ó‘$óŠ$óƒ$ó|$óu$ón$óg$ó`$óY$óR$óK$óD$ó=$ó6$ó/$ó($ó!$ó$ó$ó $ó$óþ#ó÷#óð#óé#óâ#óÛ#óÔ#óÍ#óÆ#ó¿#ó¸#ó±#óª#ó£#óœ#ó•#óŽ#ó‡#ó€#óy#ór#ók#ód#ó]#óV#óO#óH#óA#ó:#ó3#ó,#ó%#ó#ó#ó#ó #ó#óû"óô"óí"óæ"óß"óØ"óÑ"óÊ"óÃ"ó¼"óµ"ó®"ó§"ó "ó™"ó’"ó‹"ó„"ó}"óv"óo"óh"óa"óZ"óS"óL"óE"ó>"ó7"ó0"ó)"ó""ó"ó"ó "ó"óÿ!óø!óñ!óê!óã!óÜ!óÕ!óÎ!óÇ!óÀ!ó¹!ó²!ó«!ó¤!ó!ó–!ó!óˆ!ó!óz!ós!ól!óe!ó^!óW!óP!óI!óB!ó;!ó4!ó-!ó&!ó!ó!ó!ó !ó!óü óõ óî óç óà óÙ óÒ óË óÄ ó½ ó¶ ó¯ ó¨ ó¡ óš ó“ óŒ ó… ó~ ów óp ói ób ó[ óT óM óF ó? ó8 ó1 ó* ó# ó ó ó ó ó óùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóû óô óí óæ óß óØ óÑ óÊ óà ó¼ óµ ó® ó§ ó  ó™ ó’ ó‹ ó„ ó} óv óo óh óa óZ óS óL óE ó> ó7 ó0 ó) ó" ó ó ó ó óÿ óø óñ óê óã óÜ óÕ óÎ óÇ óÀ ó¹ ó² ó« ó¤ ó ó– ó óˆ ó óz ós ól óe ó^ óW óP óI óB ó; ó4 ó- ó& ó ó ó ó ó óü óõ óî óç óà óÙ óÒ óË óÄ ó½ ó¶ ó¯ ó¨ ó¡ óš ó“ óŒ ó… ó~ ów óp ói ób ó[ óT óM óF ó? ó8 ó1 ó* ó# ó ó ó ó ó óù óò óë óä óÝ óÖ óÏ óÈ óÁ óº ó³ ó¬ ó¥ óž ó— ó ó‰ ó‚ ó{ ót óm óf ó_ óX óQ óJ óC ó< ó5 ó. ó' ó ó ó ó ó óý óö óï óè óá óÚ óÓ óÌ óÅ ó¾ ó· ó° ó© ó¢ ó› ó” ó ó† ó óx óq ój óc ó\ óU óN óG ó@ ó9 ó2 ó+ ó$ ó ó ó ó ó óúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûÿòôÿòíÿòæÿòßÿòØÿòÑÿòÊÿòÃÿò¼ÿòµÿò®ÿò§ÿò ÿò™ÿò’ÿò‹ÿò„ÿò}ÿòvÿòoÿòhÿòaÿòZÿòSÿòLÿòEÿò>ÿò7ÿò0ÿò)ÿò"ÿòÿòÿò ÿòÿòÿþòøþòñþòêþòãþòÜþòÕþòÎþòÇþòÀþò¹þò²þò«þò¤þòþò–þòþòˆþòþòzþòsþòlþòeþò^þòWþòPþòIþòBþò;þò4þò-þò&þòþòþòþò þòþòüýòõýòîýòçýòàýòÙýòÒýòËýòÄýò½ýò¶ýò¯ýò¨ýò¡ýòšýò“ýòŒýò…ýò~ýòwýòpýòiýòbýò[ýòTýòMýòFýò?ýò8ýò1ýò*ýò#ýòýòýòýòýòýòùüòòüòëüòäüòÝüòÖüòÏüòÈüòÁüòºüò³üò¬üò¥üòžüò—üòüò‰üò‚üò{üòtüòmüòfüò_üòXüòQüòJüòCüò<üò5üò.üò'üò üòüòüò üòüòýûòöûòïûòèûòáûòÚûòÓûòÌûòÅûò¾ûò·ûò°ûò©ûò¢ûò›ûò”ûòûò†ûòûòxûòqûòjûòcûò\ûòUûòNûòGûò@ûò9ûò2ûò+ûò$ûòûòûòûòûòûòúúòóúòìúòåúòÞúò×úòÐúòÉúòÂúò»úò´úò­úò¦úòŸúò˜úò‘úòŠúòƒúò|úòuúònúògúò`úòYúòRúòKúòDúò=úò6úò/úò(úò!úòúòúò úòúòþùò÷ùòðùòéùòâùòÛùòÔùòÍùòÆùò¿ùò¸ùò±ùòªùò£ùòœùò•ùòŽùò‡ùò€ùòyùòrùòkùòdùò]ùòVùòOùòHùòAùò:ùò3ùò,ùò%ùòùòùòùò ùòùòûøòôøòíøòæøòßøòØøòÑøòÊøòÃøò¼øòµøò®øò§øò øò™øò’øò‹øò„øò}øòvøòoøòhøòaøòZøòSøòLøòEøò>øò7øò0øò)øò"øòøòøò øòøòÿ÷òø÷òñ÷òê÷òã÷òÜ÷òÕ÷òÎ÷òÇ÷òÀ÷ò¹÷ò²÷ò«÷ò¤÷ò÷ò–÷ò÷òˆ÷ò÷òz÷òs÷òl÷òe÷ò^÷òW÷òP÷òI÷òB÷ò;÷ò4÷ò-÷ò&÷ò÷ò÷ò÷ò ÷ò÷òüöòõöòîöòçöòàöòÙöòÒöòËöòÄöò½öò¶öò¯öò¨öò¡öòšöò“öòŒöò…öò~öòwöòpöòiöòböò[öòTöòMöòFöò?öò8öò1öò*öò#öòöòöòöòöòöòùõòòõòëõòäõòÝõòÖõòÏõòÈõòÁõòºõò³õò¬õò¥õòžõò—õòõò‰õò‚õò{õòtõòmõòfõò_õòXõòQõòJõòCõò<õò5õò.õò'õò õòõòõò õòõòýôòöôòïôòèôòáôòÚôòÓôòÌôòÅôò¾ôò·ôò°ôò©ôò¢ôò›ôò”ôòôò†ôòôòxôòqôòjôòcôò\ôòUôòNôòGôò@ôò9ôò2ôò+ôò$ôòôòôòôòôòôòúóòóóòìóòåóòÞóò×óòÐóòÉóòÂóò»óò´óò­óò¦óòŸóò˜óò‘óòŠóòƒóò|óòuóònóògóò`óòYóòRóòKóòDóò=óò6óò/óò(óò!óòóòóò óòóòþòò÷òòðòòéòòâòòÛòòÔòòÍòòÆòò¿òò¸òò±òòªòò£òòœòò•òòŽòò‡òò€òòyòòròòkòòdòò]òòVòòOòòHòòAòò:òò3òò,òò%òòòòòòòò òòòòûñòôñòíñòæñòßñòØñòÑñòÊñòÃñò¼ñòµñò®ñò§ñò ñò™ñò’ñò‹ñò„ñò}ñòvñòoñòhñòañòZñòSñòLñòEñò>ñò7ñò0ñò)ñò"ñòñòñò ñòñòÿðòøðòñðòêðòãðòÜðòÕðòÎðòÇðòÀðò¹ðò²ðò«ðò¤ðòðò–ðòðòˆðòðòzðòsðòlðòeðò^ðòWðòPðòIðòBðò;ðò4ðò-ðò&ðòðòðòðò ðòðòüïòõïòîïòçïòàïòÙïòÒïòËïòÄïò½ïò¶ïò¯ïò¨ïò¡ïòšïò“ïòŒïò…ïò~ïòwïòpïòiïòbïò[ïòTïòMïòFïò?ïò8ïò1ïò*ïò#ïòïòïòïòïòïòùîòòîòëîòäîòÝîòÖîòÏîòÈîòÁîòºîò³îò¬îò¥îòžîò—îòîò‰îò‚îò{îòtîòmîòfîò_îòXîòQîòJîòCîò<îò5îò.îò'îò îòîòîò îòîòýíòöíòïíòèíòáíòÚíòÓíòÌíòÅíò¾íò·íò°íò©íò¢íò›íò”íòíò†íòíòxíòqíòjíòcíò\íòUíòNíòGíò@íò9íò2íò+íò$íòíòíòíòíòíòúìòóìòììòåìòÞìò×ìòÐìòÉìòÂìò»ìò´ìò­ìò¦ìòŸìò˜ìò‘ìòŠìòƒìò|ìòuìònìògìò`ìòYìòRìòKìòDìò=ìò6ìò/ìò(ìò!ìòìòìò ìòìòþëò÷ëòðëòéëòâëòÛëòÔëòÍëòÆëò¿ëò¸ëò±ëòªëò£ëòœëò•ëòŽëò‡ëò€ëòyëòrëòkëòdëò]ëòVëòOëòHëòAëò:ëò3ëò,ëò%ëòëòëòëò ëòëòûêòôêòíêòæêòßêòØêòÑêòÊêòÃêò¼êòµêò®êò§êò êò™êò’êò‹êò„êò}êòvêòoêòhêòaêòZêòSêòLêòEêò>êò7êò0êò)êò"êòêòêò êòêòÿéòøéòñéòêéòãéòÜéòÕéòÎéòÇéòÀéò¹éò²éò«éò¤éòéò–éòéòˆéòéòzéòséòléòeéò^éòWéòPéòIéòBéò;éò4éò-éò&éòéòéòéò éòéòüèòõèòîèòçèòàèòÙèòÒèòËèòÄèò½èò¶èò¯èò¨èò¡èòšèò“èòŒèò…èò~èòwèòpèòièòbèò[èòTèòMèòFèò?èò8èò1èò*èò#èòèòèòèòèòèòùçòòçòëçòäçòÝçòÖçòÏçòÈçòÁçòºçò³çò¬çò¥çòžçò—çòçò‰çò‚çò{çòtçòmçòfçò_çòXçòQçòJçòCçò<çò5çò.çò'çò çòçòçò çòçòýæòöæòïæòèæòáæòÚæòÓæòÌæòÅæò¾æò·æò°æò©æò¢æò›æò”æòæò†æòæòxæòqæòjæòcæò\æòUæòNæòGæò@æò9æò2æò+æò$æòæòæòæòæòæòúåòóåòìåòååòÞåò×åòÐåòÉåòÂåò»åò´åò­åò¦åòŸåò˜åò‘åòŠåòƒåò|åòuåònåògåò`åòYåòRåòKåòDåò=åò6åò/åò(åò!åòåòåò åòåòþäò÷äòðäòéäòâäòÛäòÔäòÍäòÆäò¿äò¸äò±äòªäò£äòœäò•äòŽäò‡äò€äòyäòräòkäòdäò]äòVäòOäòHäòAäò:äò3äò,äò%äòäòäòäò äòäòûãòôãòíãòæãòßãòØãòÑãòÊãòÃãò¼ãòµãò®ãò§ãò ãò™ãò’ãò‹ãò„ãò}ãòvãòoãòhãòaãòZãòSãòLãòEãò>ãò7ãò0ãò)ãò"ãòãòãò ãòãòÿâòøâòñâòêâòãâòÜâòÕâòÎâòÇâòÀâò¹âò²âò«âò¤âòâò–âòâòˆâòâòzâòsâòlâòeâò^âòWâòPâòIâòBâò;âò4âò-âò&âòâòâòâò âòâòüáòõáòîáòçáòàáòÙáòÒáòËáòÄáò½áò¶áò¯áò¨áò¡áòšáò“áòŒáò…áò~áòwáòpáòiáòbáò[áòTáòMáòFáò?áò8áò1áò*áò#áòáòáòáòáòáòùàòòàòëàòäàòÝàòÖàòÏàòÈàòÁàòºàò³àò¬àò¥àòžàò—àòàò‰àò‚àò{àòtàòmàòfàò_àòXàòQàòJàòCàò<àò5àò.àò'àò àòàòàò àòàòýßòößòïßòèßòáßòÚßòÓßòÌßòÅßò¾ßò·ßò°ßò©ßò¢ßò›ßò”ßòßò†ßòßòxßòqßòjßòcßò\ßòUßòNßòGßò@ßò9ßò2ßò+ßò$ßòßòßòßòßòßòúÞòóÞòìÞòåÞòÞÞò×ÞòÐÞòÉÞòÂÞò»Þò´Þò­Þò¦ÞòŸÞò˜Þò‘ÞòŠÞòƒÞò|ÞòuÞònÞògÞò`ÞòYÞòRÞòKÞòDÞò=Þò6Þò/Þò(Þò!ÞòÞòÞò ÞòÞòþÝò÷ÝòðÝòéÝòâÝòÛÝòÔÝòÍÝòÆÝò¿Ýò¸Ýò±ÝòªÝò£ÝòœÝò•ÝòŽÝò‡Ýò€ÝòyÝòrÝòkÝòdÝò]ÝòVÝòOÝòHÝòAÝò:Ýò3Ýò,Ýò%ÝòÝòÝòÝò ÝòÝòûÜòôÜòíÜòæÜòßÜòØÜòÑÜòÊÜòÃÜò¼ÜòµÜò®Üò§Üò Üò™Üò’Üò‹Üò„Üò}ÜòvÜòoÜòhÜòaÜòZÜòSÜòLÜòEÜò>Üò7Üò0Üò)Üò"ÜòÜòÜò ÜòÜòÿÛòøÛòñÛòêÛòãÛòÜÛòÕÛòÎÛòÇÛòÀÛò¹Ûò²Ûò«Ûò¤ÛòÛò–ÛòÛòˆÛòÛòzÛòsÛòlÛòeÛò^ÛòWÛòPÛòIÛòBÛò;Ûò4Ûò-Ûò&ÛòÛòÛòÛò ÛòÛòüÚòõÚòîÚòçÚòàÚòÙÚòÒÚòËÚòÄÚò½Úò¶Úò¯Úò¨Úò¡ÚòšÚò“ÚòŒÚò…Úò~ÚòwÚòpÚòiÚòbÚò[ÚòTÚòMÚòFÚò?Úò8Úò1Úò*Úò#ÚòÚòÚòÚòÚòÚòùÙòòÙòëÙòäÙòÝÙòÖÙòÏÙòÈÙòÁÙòºÙò³Ùò¬Ùò¥ÙòžÙò—ÙòÙò‰Ùò‚Ùò{ÙòtÙòmÙòfÙò_ÙòXÙòQÙòJÙòCÙò<Ùò5Ùò.Ùò'Ùò ÙòÙòÙò ÙòÙòýØòöØòïØòèØòáØòÚØòÓØòÌØòÅØò¾Øò·Øò°Øò©Øò¢Øò›Øò”ØòØò†ØòØòxØòqØòjØòcØò\ØòUØòNØòGØò@Øò9Øò2Øò+Øò$ØòØòØòØòØòØòú×òó×òì×òå×òÞ×ò××òÐ×òÉ×òÂ×ò»×ò´×ò­×ò¦×òŸ×ò˜×ò‘×òŠ×òƒ×ò|×òu×òn×òg×ò`×òY×òR×òK×òD×ò=×ò6×ò/×ò(×ò!×ò×ò×ò ×ò×òþÖò÷ÖòðÖòéÖòâÖòÛÖòÔÖòÍÖòÆÖò¿Öò¸Öò±ÖòªÖò£ÖòœÖò•ÖòŽÖò‡Öò€ÖòyÖòrÖòkÖòdÖò]ÖòVÖòOÖòHÖòAÖò:Öò3Öò,Öò%ÖòÖòÖòÖò ÖòÖòûÕòôÕòíÕòæÕòßÕòØÕòÑÕòÊÕòÃÕò¼ÕòµÕò®Õò§Õò Õò™Õò’Õò‹Õò„Õò}ÕòvÕòoÕòhÕòaÕòZÕòSÕòLÕòEÕò>Õò7Õò0Õò)Õò"ÕòÕòÕò ÕòÕòÿÔòøÔòñÔòêÔòãÔòÜÔòÕÔòÎÔòÇÔòÀÔò¹Ôò²Ôò«Ôò¤ÔòÔò–ÔòÔòˆÔòÔòzÔòsÔòlÔòeÔò^ÔòWÔòPÔòIÔòBÔò;Ôò4Ôò-Ôò&ÔòÔòÔòÔò ÔòÔòüÓòõÓòîÓòçÓòàÓòÙÓòÒÓòËÓòÄÓò½Óò¶Óò¯Óò¨Óò¡ÓòšÓò“ÓòŒÓò…Óò~ÓòwÓòpÓòiÓòbÓò[ÓòTÓòMÓòFÓò?Óò8Óò1Óò*Óò#ÓòÓòÓòÓòÓòÓòùÒòòÒòëÒòäÒòÝÒòÖÒòÏÒòÈÒòÁÒòºÒò³Òò¬Òò¥ÒòžÒò—ÒòÒò‰Òò‚Òò{ÒòtÒòmÒòfÒò_ÒòXÒòQÒòJÒòCÒò<Òò5Òò.Òò'Òò ÒòÒòÒò ÒòÒòýÑòöÑòïÑòèÑòáÑòÚÑòÓÑòÌÑòÅÑò¾Ñò·Ñò°Ñò©Ñò¢Ñò›Ñò”ÑòÑò†ÑòÑòxÑòqÑòjÑòcÑò\ÑòUÑòNÑòGÑò@Ñò9Ñò2Ñò+Ñò$ÑòÑòÑòÑòÑòÑòúÐòóÐòìÐòåÐòÞÐò×ÐòÐÐòÉÐòÂÐò»Ðò´Ðò­Ðò¦ÐòŸÐò˜Ðò‘ÐòŠÐòƒÐò|ÐòuÐònÐògÐò`ÐòYÐòRÐòKÐòDÐò=Ðò6Ðò/Ðò(Ðò!ÐòÐòÐò ÐòÐòþÏò÷ÏòðÏòéÏòâÏòÛÏòÔÏòÍÏòÆÏò¿Ïò¸Ïò±ÏòªÏò£ÏòœÏò•ÏòŽÏò‡Ïò€ÏòyÏòrÏòkÏòdÏò]ÏòVÏòOÏòHÏòAÏò:Ïò3Ïò,Ïò%ÏòÏòÏòÏò ÏòÏòûÎòôÎòíÎòæÎòßÎòØÎòÑÎòÊÎòÃÎò¼ÎòµÎò®Îò§Îò Îò™Îò’Îò‹Îò„Îò}ÎòvÎòoÎòhÎòaÎòZÎòSÎòLÎòEÎò>Îò7Îò0Îò)Îò"ÎòÎòÎò ÎòÎòÿÍòøÍòñÍòêÍòãÍòÜÍòÕÍòÎÍòÇÍòÀÍò¹Íò²Íò«Íò¤ÍòÍò–ÍòÍòˆÍòÍòzÍòsÍòlÍòeÍò^ÍòWÍòPÍòIÍòBÍò;Íò4Íò-Íò&ÍòÍòÍòÍò ÍòÍòüÌòõÌòîÌòçÌòàÌòÙÌòÒÌòËÌòÄÌò½Ìò¶Ìò¯Ìò¨Ìò¡ÌòšÌò“ÌòŒÌò…Ìò~ÌòwÌòpÌòiÌòbÌò[ÌòTÌòMÌòFÌò?Ìò8Ìò1Ìò*Ìò#ÌòÌòÌòÌòÌòÌòùËòòËòëËòäËòÝËòÖËòÏËòÈËòÁËòºËò³Ëò¬Ëò¥ËòžËò—ËòËò‰Ëò‚Ëò{ËòtËòmËòfËò_ËòXËòQËòJËòCËò<Ëò5Ëò.Ëò'Ëò ËòËòËò ËòËòýÊòöÊòïÊòèÊòáÊòÚÊòÓÊòÌÊòÅÊò¾Êò·Êò°Êò©Êò¢Êò›Êò”ÊòÊò†ÊòÊòxÊòqÊòjÊòcÊò\ÊòUÊòNÊòGÊò@Êò9Êò2Êò+Êò$ÊòÊòÊòÊòÊòÊòúÉòóÉòìÉòåÉòÞÉò×ÉòÐÉòÉÉòÂÉò»Éò´Éò­Éò¦ÉòŸÉò˜Éò‘ÉòŠÉòƒÉò|ÉòuÉònÉògÉò`ÉòYÉòRÉòKÉòDÉò=Éò6Éò/Éò(Éò!ÉòÉòÉò ÉòÉòþÈò÷ÈòðÈòéÈòâÈòÛÈòÔÈòÍÈòÆÈò¿Èò¸Èò±ÈòªÈò£ÈòœÈò•ÈòŽÈò‡Èò€ÈòyÈòrÈòkÈòdÈò]ÈòVÈòOÈòHÈòAÈò:Èò3Èò,Èò%ÈòÈòÈòÈò ÈòÈòûÇòôÇòíÇòæÇòßÇòØÇòÑÇòÊÇòÃÇò¼ÇòµÇò®Çò§Çò Çò™Çò’Çò‹Çò„Çò}ÇòvÇòoÇòhÇòaÇòZÇòSÇòLÇòEÇò>Çò7Çò0Çò)Çò"ÇòÇòÇò ÇòÇòÿÆòøÆòñÆòêÆòãÆòÜÆòÕÆòÎÆòÇÆòÀÆò¹Æò²Æò«Æò¤ÆòÆò–ÆòÆòˆÆòÆòzÆòsÆòlÆòeÆò^ÆòWÆòPÆòIÆòBÆò;Æò4Æò-Æò&ÆòÆòÆòÆò ÆòÆòüÅòõÅòîÅòçÅòàÅòÙÅòÒÅòËÅòÄÅò½Åò¶Åò¯Åò¨Åò¡ÅòšÅò“ÅòŒÅò…Åò~ÅòwÅòpÅòiÅòbÅò[ÅòTÅòMÅòFÅò?Åò8Åò1Åò*Åò#ÅòÅòÅòÅòÅòÅòùÄòòÄòëÄòäÄòÝÄòÖÄòÏÄòÈÄòÁÄòºÄò³Äò¬Äò¥ÄòžÄò—ÄòÄò‰Äò‚Äò{ÄòtÄòmÄòfÄò_ÄòXÄòQÄòJÄòCÄò<Äò5Äò.Äò'Äò ÄòÄòÄò ÄòÄòýÃòöÃòïÃòèÃòáÃòÚÃòÓÃòÌÃòÅÃò¾Ãò·Ãò°Ãò©Ãò¢Ãò›Ãò”ÃòÃò†ÃòÃòxÃòqÃòjÃòcÃò\ÃòUÃòNÃòGÃò@Ãò9Ãò2Ãò+Ãò$ÃòÃòÃòÃòÃòÃòúÂòóÂòìÂòåÂòÞÂò×ÂòÐÂòÉÂòÂÂò»Âò´Âò­Âò¦ÂòŸÂò˜Âò‘ÂòŠÂòƒÂò|ÂòuÂònÂògÂò`ÂòYÂòRÂòKÂòDÂò=Âò6Âò/Âò(Âò!ÂòÂòÂò ÂòÂòþÁò÷ÁòðÁòéÁòâÁòÛÁòÔÁòÍÁòÆÁò¿Áò¸Áò±ÁòªÁò£ÁòœÁò•ÁòŽÁò‡Áò€ÁòyÁòrÁòkÁòdÁò]ÁòVÁòOÁòHÁòAÁò:Áò3Áò,Áò%ÁòÁòÁòÁò ÁòÁòûÀòôÀòíÀòæÀòßÀòØÀòÑÀòÊÀòÃÀò¼ÀòµÀò®Àò§Àò Àò™Àò’Àò‹Àò„Àò}ÀòvÀòoÀòhÀòaÀòZÀòSÀòLÀòEÀò>Àò7Àò0Àò)Àò"ÀòÀòÀò ÀòÀòÿ¿òø¿òñ¿òê¿òã¿òÜ¿òÕ¿òοòÇ¿òÀ¿ò¹¿ò²¿ò«¿ò¤¿ò¿ò–¿ò¿òˆ¿ò¿òz¿òs¿òl¿òe¿ò^¿òW¿òP¿òI¿òB¿ò;¿ò4¿ò-¿ò&¿ò¿ò¿ò¿ò ¿ò¿òü¾òõ¾òî¾òç¾òà¾òÙ¾òÒ¾ò˾òľò½¾ò¶¾ò¯¾ò¨¾ò¡¾òš¾ò“¾òŒ¾ò…¾ò~¾òw¾òp¾òi¾òb¾ò[¾òT¾òM¾òF¾ò?¾ò8¾ò1¾ò*¾ò#¾ò¾ò¾ò¾ò¾ò¾òù½òò½òë½òä½òݽòÖ½òϽòȽòÁ½òº½ò³½ò¬½ò¥½òž½ò—½ò½ò‰½ò‚½ò{½òt½òm½òf½ò_½òX½òQ½òJ½òC½ò<½ò5½ò.½ò'½ò ½ò½ò½ò ½ò½òý¼òö¼òï¼òè¼òá¼òÚ¼òÓ¼ò̼òżò¾¼ò·¼ò°¼ò©¼ò¢¼ò›¼ò”¼ò¼ò†¼ò¼òx¼òq¼òj¼òc¼ò\¼òU¼òN¼òG¼ò@¼ò9¼ò2¼ò+¼ò$¼ò¼ò¼ò¼ò¼ò¼òú»òó»òì»òå»òÞ»ò×»òлòÉ»ò»ò»»ò´»ò­»ò¦»òŸ»ò˜»ò‘»òŠ»òƒ»ò|»òu»òn»òg»ò`»òY»òR»òK»òD»ò=»ò6»ò/»ò(»ò!»ò»ò»ò »ò»òþºò÷ºòðºòéºòâºòÛºòÔºòͺòƺò¿ºò¸ºò±ºòªºò£ºòœºò•ºòŽºò‡ºò€ºòyºòrºòkºòdºò]ºòVºòOºòHºòAºò:ºò3ºò,ºò%ºòºòºòºò ºòºòû¹òô¹òí¹òæ¹òß¹òعòѹòʹòùò¼¹òµ¹ò®¹ò§¹ò ¹ò™¹ò’¹ò‹¹ò„¹ò}¹òv¹òo¹òh¹òa¹òZ¹òS¹òL¹òE¹ò>¹ò7¹ò0¹ò)¹ò"¹ò¹ò¹ò ¹ò¹òÿ¸òø¸òñ¸òê¸òã¸òܸòÕ¸òθòǸòÀ¸ò¹¸ò²¸ò«¸ò¤¸ò¸ò–¸ò¸òˆ¸ò¸òz¸òs¸òl¸òe¸ò^¸òW¸òP¸òI¸òB¸ò;¸ò4¸ò-¸ò&¸ò¸ò¸ò¸ò ¸ò¸òü·òõ·òî·òç·òà·òÙ·òÒ·òË·òÄ·ò½·ò¶·ò¯·ò¨·ò¡·òš·ò“·òŒ·ò…·ò~·òw·òp·òi·òb·ò[·òT·òM·òF·ò?·ò8·ò1·ò*·ò#·ò·ò·ò·ò·ò·òù¶òò¶òë¶òä¶òݶòÖ¶ò϶òȶòÁ¶òº¶ò³¶ò¬¶ò¥¶òž¶ò—¶ò¶ò‰¶ò‚¶ò{¶òt¶òm¶òf¶ò_¶òX¶òQ¶òJ¶òC¶ò<¶ò5¶ò.¶ò'¶ò ¶ò¶ò¶ò ¶ò¶òýµòöµòïµòèµòáµòÚµòÓµò̵òŵò¾µò·µò°µò©µò¢µò›µò”µòµò†µòµòxµòqµòjµòcµò\µòUµòNµòGµò@µò9µò2µò+µò$µòµòµòµòµòµòú´òó´òì´òå´òÞ´ò×´òдòÉ´ò´ò»´ò´´ò­´ò¦´òŸ´ò˜´ò‘´òŠ´òƒ´ò|´òu´òn´òg´ò`´òY´òR´òK´òD´ò=´ò6´ò/´ò(´ò!´ò´ò´ò ´ò´òþ³ò÷³òð³òé³òâ³òÛ³òÔ³òͳòƳò¿³ò¸³ò±³òª³ò£³òœ³ò•³ò޳ò‡³ò€³òy³òr³òk³òd³ò]³òV³òO³òH³òA³ò:³ò3³ò,³ò%³ò³ò³ò³ò ³ò³òû²òô²òí²òæ²òß²òزòѲòʲòòò¼²òµ²ò®²ò§²ò ²ò™²ò’²ò‹²ò„²ò}²òv²òo²òh²òa²òZ²òS²òL²òE²ò>²ò7²ò0²ò)²ò"²ò²ò²ò ²ò²òÿ±òø±òñ±òê±òã±òܱòÕ±òαòDZòÀ±ò¹±ò²±ò«±ò¤±ò±ò–±ò±òˆ±ò±òz±òs±òl±òe±ò^±òW±òP±òI±òB±ò;±ò4±ò-±ò&±ò±ò±ò±ò ±ò±òü°òõ°òî°òç°òà°òÙ°òÒ°ò˰òİò½°ò¶°ò¯°ò¨°ò¡°òš°ò“°òŒ°ò…°ò~°òw°òp°òi°òb°ò[°òT°òM°òF°ò?°ò8°ò1°ò*°ò#°ò°ò°ò°ò°ò°òù¯òò¯òë¯òä¯òݯòÖ¯òϯòȯòÁ¯òº¯ò³¯ò¬¯ò¥¯òž¯ò—¯ò¯ò‰¯ò‚¯ò{¯òt¯òm¯òf¯ò_¯òX¯òQ¯òJ¯òC¯ò<¯ò5¯ò.¯ò'¯ò ¯ò¯ò¯ò ¯ò¯òý®òö®òï®òè®òá®òÚ®òÓ®òÌ®òÅ®ò¾®ò·®ò°®ò©®ò¢®ò›®ò”®ò®ò†®ò®òx®òq®òj®òc®ò\®òU®òN®òG®ò@®ò9®ò2®ò+®ò$®ò®ò®ò®ò®ò®òú­òó­òì­òå­òÞ­ò×­òЭòÉ­ò­ò»­ò´­ò­­ò¦­òŸ­ò˜­ò‘­òŠ­òƒ­ò|­òu­òn­òg­ò`­òY­òR­òK­òD­ò=­ò6­ò/­ò(­ò!­ò­ò­ò ­ò­òþ¬ò÷¬òð¬òé¬òâ¬òÛ¬òÔ¬òͬòƬò¿¬ò¸¬ò±¬òª¬ò£¬òœ¬ò•¬òެò‡¬ò€¬òy¬òr¬òk¬òd¬ò]¬òV¬òO¬òH¬òA¬ò:¬ò3¬ò,¬ò%¬ò¬ò¬ò¬ò ¬ò¬òû«òô«òí«òæ«òß«òØ«òÑ«òÊ«òëò¼«òµ«ò®«ò§«ò «ò™«ò’«ò‹«ò„«ò}«òv«òo«òh«òa«òZ«òS«òL«òE«ò>«ò7«ò0«ò)«ò"«ò«ò«ò «ò«òÿªòøªòñªòêªòãªòܪòÕªòΪòǪòÀªò¹ªò²ªò«ªò¤ªòªò–ªòªòˆªòªòzªòsªòlªòeªò^ªòWªòPªòIªòBªò;ªò4ªò-ªò&ªòªòªòªò ªòªòü©òõ©òî©òç©òà©òÙ©òÒ©òË©òÄ©ò½©ò¶©ò¯©ò¨©ò¡©òš©ò“©òŒ©ò…©ò~©òw©òp©òi©òb©ò[©òT©òM©òF©ò?©ò8©ò1©ò*©ò#©ò©ò©ò©ò©ò©òù¨òò¨òë¨òä¨òݨòÖ¨òϨòȨòÁ¨òº¨ò³¨ò¬¨ò¥¨òž¨ò—¨ò¨ò‰¨ò‚¨ò{¨òt¨òm¨òf¨ò_¨òX¨òQ¨òJ¨òC¨ò<¨ò5¨ò.¨ò'¨ò ¨ò¨ò¨ò ¨ò¨òý§òö§òï§òè§òá§òÚ§òÓ§ò̧òŧò¾§ò·§ò°§ò©§ò¢§ò›§ò”§ò§ò†§ò§òx§òq§òj§òc§ò\§òU§òN§òG§ò@§ò9§ò2§ò+§ò$§ò§ò§ò§ò§ò§òú¦òó¦òì¦òå¦òÞ¦òצòЦòɦò¦ò»¦ò´¦ò­¦ò¦¦òŸ¦ò˜¦ò‘¦òЦòƒ¦ò|¦òu¦òn¦òg¦ò`¦òY¦òR¦òK¦òD¦ò=¦ò6¦ò/¦ò(¦ò!¦ò¦ò¦ò ¦ò¦òþ¥ò÷¥òð¥òé¥òâ¥òÛ¥òÔ¥òÍ¥òÆ¥ò¿¥ò¸¥ò±¥òª¥ò£¥òœ¥ò•¥òŽ¥ò‡¥ò€¥òy¥òr¥òk¥òd¥ò]¥òV¥òO¥òH¥òA¥ò:¥ò3¥ò,¥ò%¥ò¥ò¥ò¥ò ¥ò¥òû¤òô¤òí¤òæ¤òߤòؤòѤòʤòäò¼¤òµ¤ò®¤ò§¤ò ¤ò™¤ò’¤ò‹¤ò„¤ò}¤òv¤òo¤òh¤òa¤òZ¤òS¤òL¤òE¤ò>¤ò7¤ò0¤ò)¤ò"¤ò¤ò¤ò ¤ò¤òÿ£òø£òñ£òê£òã£òÜ£òÕ£òΣòÇ£òÀ£ò¹£ò²£ò«£ò¤£ò£ò–£ò£òˆ£ò£òz£òs£òl£òe£ò^£òW£òP£òI£òB£ò;£ò4£ò-£ò&£ò£ò£ò£ò £ò£òü¢òõ¢òî¢òç¢òà¢òÙ¢òÒ¢òË¢òÄ¢ò½¢ò¶¢ò¯¢ò¨¢ò¡¢òš¢ò“¢òŒ¢ò…¢ò~¢òw¢òp¢òi¢òb¢ò[¢òT¢òM¢òF¢ò?¢ò8¢ò1¢ò*¢ò#¢ò¢ò¢ò¢ò¢ò¢òù¡òò¡òë¡òä¡òÝ¡òÖ¡òÏ¡òÈ¡òÁ¡òº¡ò³¡ò¬¡ò¥¡òž¡ò—¡ò¡ò‰¡ò‚¡ò{¡òt¡òm¡òf¡ò_¡òX¡òQ¡òJ¡òC¡ò<¡ò5¡ò.¡ò'¡ò ¡ò¡ò¡ò ¡ò¡òý òö òï òè òá òÚ òÓ òÌ òÅ ò¾ ò· ò° ò© ò¢ ò› ò” ò ò† ò òx òq òj òc ò\ òU òN òG ò@ ò9 ò2 ò+ ò$ ò ò ò ò ò òúŸòóŸòìŸòåŸòÞŸòןòПòÉŸòŸò»Ÿò´Ÿò­Ÿò¦ŸòŸŸò˜Ÿò‘ŸòŠŸòƒŸò|ŸòuŸònŸògŸò`ŸòYŸòRŸòKŸòDŸò=Ÿò6Ÿò/Ÿò(Ÿò!ŸòŸòŸò ŸòŸòþžò÷žòðžòéžòâžòÛžòÔžòÍžòÆžò¿žò¸žò±žòªžò£žòœžò•žòŽžò‡žò€žòyžòržòkžòdžò]žòVžòOžòHžòAžò:žò3žò,žò%žòžòžòžò žòžòûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿœòøœòñœòêœòãœòÜœòÕœòΜòÇœòÀœò¹œò²œò«œò¤œòœò–œòœòˆœòœòzœòsœòlœòeœò^œòWœòPœòIœòBœò;œò4œò-œò&œòœòœòœò œòœòü›òõ›òî›òç›òà›òÙ›òÒ›òË›òÄ›ò½›ò¶›ò¯›ò¨›ò¡›òš›ò“›òŒ›ò…›ò~›òw›òp›òi›òb›ò[›òT›òM›òF›ò?›ò8›ò1›ò*›ò#›ò›ò›ò›ò›ò›òùšòòšòëšòäšòÝšòÖšòÏšòÈšòÁšòºšò³šò¬šò¥šòžšò—šòšò‰šò‚šò{šòtšòmšòfšò_šòXšòQšòJšòCšò<šò5šò.šò'šò šòšòšò šòšòý™òö™òï™òè™òá™òÚ™òÓ™òÌ™òÅ™ò¾™ò·™ò°™ò©™ò¢™ò›™ò”™ò™ò†™ò™òx™òq™òj™òc™ò\™òU™òN™òG™ò@™ò9™ò2™ò+™ò$™ò™ò™ò™ò™ò™òú˜òó˜òì˜òå˜òÞ˜òטòИòɘò˜ò»˜ò´˜ò­˜ò¦˜òŸ˜ò˜˜ò‘˜òŠ˜òƒ˜ò|˜òu˜òn˜òg˜ò`˜òY˜òR˜òK˜òD˜ò=˜ò6˜ò/˜ò(˜ò!˜ò˜ò˜ò ˜ò˜òþ—ò÷—òð—òé—òâ—òÛ—òÔ—òÍ—òÆ—ò¿—ò¸—ò±—òª—ò£—òœ—ò•—òŽ—ò‡—ò€—òy—òr—òk—òd—ò]—òV—òO—òH—òA—ò:—ò3—ò,—ò%—ò—ò—ò—ò —ò—òû–òô–òí–òæ–òß–òØ–òÑ–òÊ–òÖò¼–òµ–ò®–ò§–ò –ò™–ò’–ò‹–ò„–ò}–òv–òo–òh–òa–òZ–òS–òL–òE–ò>–ò7–ò0–ò)–ò"–ò–ò–ò –ò–òÿ•òø•òñ•òê•òã•òÜ•òÕ•òΕòÇ•òÀ•ò¹•ò²•ò«•ò¤•ò•ò–•ò•òˆ•ò•òz•òs•òl•òe•ò^•òW•òP•òI•òB•ò;•ò4•ò-•ò&•ò•ò•ò•ò •ò•òü”òõ”òî”òç”òà”òÙ”òÒ”òË”òÄ”ò½”ò¶”ò¯”ò¨”ò¡”òš”ò“”òŒ”ò…”ò~”òw”òp”òi”òb”ò[”òT”òM”òF”ò?”ò8”ò1”ò*”ò#”ò”ò”ò”ò”ò”òù“òò“òë“òä“òÝ“òÖ“òÏ“òÈ“òÁ“òº“ò³“ò¬“ò¥“òž“ò—“ò“ò‰“ò‚“ò{“òt“òm“òf“ò_“òX“òQ“òJ“òC“ò<“ò5“ò.“ò'“ò “ò“ò“ò “ò“òý’òö’òï’òè’òá’òÚ’òÓ’òÌ’òÅ’ò¾’ò·’ò°’ò©’ò¢’ò›’ò”’ò’ò†’ò’òx’òq’òj’òc’ò\’òU’òN’òG’ò@’ò9’ò2’ò+’ò$’ò’ò’ò’ò’ò’òú‘òó‘òì‘òå‘òÞ‘òבòБòÉ‘ò‘ò»‘ò´‘ò­‘ò¦‘òŸ‘ò˜‘ò‘‘òŠ‘òƒ‘ò|‘òu‘òn‘òg‘ò`‘òY‘òR‘òK‘òD‘ò=‘ò6‘ò/‘ò(‘ò!‘ò‘ò‘ò ‘ò‘òþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿŽòøŽòñŽòêŽòãŽòÜŽòÕŽòÎŽòÇŽòÀŽò¹Žò²Žò«Žò¤ŽòŽò–ŽòŽòˆŽòŽòzŽòsŽòlŽòeŽò^ŽòWŽòPŽòIŽòBŽò;Žò4Žò-Žò&ŽòŽòŽòŽò ŽòŽòüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùŒòòŒòëŒòäŒòÝŒòÖŒòÏŒòÈŒòÁŒòºŒò³Œò¬Œò¥ŒòžŒò—ŒòŒò‰Œò‚Œò{ŒòtŒòmŒòfŒò_ŒòXŒòQŒòJŒòCŒò<Œò5Œò.Œò'Œò ŒòŒòŒò ŒòŒòý‹òö‹òï‹òè‹òá‹òÚ‹òÓ‹òÌ‹òÅ‹ò¾‹ò·‹ò°‹ò©‹ò¢‹ò›‹ò”‹ò‹ò†‹ò‹òx‹òq‹òj‹òc‹ò\‹òU‹òN‹òG‹ò@‹ò9‹ò2‹ò+‹ò$‹ò‹ò‹ò‹ò‹ò‹òúŠòóŠòìŠòåŠòÞŠò׊òЊòÉŠòŠò»Šò´Šò­Šò¦ŠòŸŠò˜Šò‘ŠòŠŠòƒŠò|ŠòuŠònŠògŠò`ŠòYŠòRŠòKŠòDŠò=Šò6Šò/Šò(Šò!ŠòŠòŠò ŠòŠòþ‰ò÷‰òð‰òé‰òâ‰òÛ‰òÔ‰ò͉òƉò¿‰ò¸‰ò±‰òª‰ò£‰òœ‰ò•‰òމò‡‰ò€‰òy‰òr‰òk‰òd‰ò]‰òV‰òO‰òH‰òA‰ò:‰ò3‰ò,‰ò%‰ò‰ò‰ò‰ò ‰ò‰òûˆòôˆòíˆòæˆò߈ò؈òшòʈòÈò¼ˆòµˆò®ˆò§ˆò ˆò™ˆò’ˆò‹ˆò„ˆò}ˆòvˆòoˆòhˆòaˆòZˆòSˆòLˆòEˆò>ˆò7ˆò0ˆò)ˆò"ˆòˆòˆò ˆòˆòÿ‡òø‡òñ‡òê‡òã‡ò܇òÕ‡ò·òLJòÀ‡ò¹‡ò²‡ò«‡ò¤‡ò‡ò–‡ò‡òˆ‡ò‡òz‡òs‡òl‡òe‡ò^‡òW‡òP‡òI‡òB‡ò;‡ò4‡ò-‡ò&‡ò‡ò‡ò‡ò ‡ò‡òü†òõ†òî†òç†òà†òÙ†òÒ†òˆòĆò½†ò¶†ò¯†ò¨†ò¡†òš†ò“†òŒ†ò…†ò~†òw†òp†òi†òb†ò[†òT†òM†òF†ò?†ò8†ò1†ò*†ò#†ò†ò†ò†ò†ò†òù…òò…òë…òä…òÝ…òÖ…òÏ…òÈ…òÁ…òº…ò³…ò¬…ò¥…òž…ò—…ò…ò‰…ò‚…ò{…òt…òm…òf…ò_…òX…òQ…òJ…òC…ò<…ò5…ò.…ò'…ò …ò…ò…ò …ò…òý„òö„òï„òè„òá„òÚ„òÓ„òÌ„òÅ„ò¾„ò·„ò°„ò©„ò¢„ò›„ò”„ò„ò†„ò„òx„òq„òj„òc„ò\„òU„òN„òG„ò@„ò9„ò2„ò+„ò$„ò„ò„ò„ò„ò„òúƒòóƒòìƒòåƒòÞƒò׃òЃòɃòƒò»ƒò´ƒò­ƒò¦ƒòŸƒò˜ƒò‘ƒòŠƒòƒƒò|ƒòuƒònƒògƒò`ƒòYƒòRƒòKƒòDƒò=ƒò6ƒò/ƒò(ƒò!ƒòƒòƒò ƒòƒòþ‚ò÷‚òð‚òé‚òâ‚òÛ‚òÔ‚òÍ‚òÆ‚ò¿‚ò¸‚ò±‚òª‚ò£‚òœ‚ò•‚òŽ‚ò‡‚ò€‚òy‚òr‚òk‚òd‚ò]‚òV‚òO‚òH‚òA‚ò:‚ò3‚ò,‚ò%‚ò‚ò‚ò‚ò ‚ò‚òûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿ€òø€òñ€òê€òã€òÜ€òÕ€ò΀òÇ€òÀ€ò¹€ò²€ò«€ò¤€ò€ò–€ò€òˆ€ò€òz€òs€òl€òe€ò^€òW€òP€òI€òB€ò;€ò4€ò-€ò&€ò€ò€ò€ò €ò€òüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòù~òò~òë~òä~òÝ~òÖ~òÏ~òÈ~òÁ~òº~ò³~ò¬~ò¥~òž~ò—~ò~ò‰~ò‚~ò{~òt~òm~òf~ò_~òX~òQ~òJ~òC~ò<~ò5~ò.~ò'~ò ~ò~ò~ò ~ò~òý}òö}òï}òè}òá}òÚ}òÓ}òÌ}òÅ}ò¾}ò·}ò°}ò©}ò¢}ò›}ò”}ò}ò†}ò}òx}òq}òj}òc}ò\}òU}òN}òG}ò@}ò9}ò2}ò+}ò$}ò}ò}ò}ò}ò}òú|òó|òì|òå|òÞ|ò×|òÐ|òÉ|òÂ|ò»|ò´|ò­|ò¦|òŸ|ò˜|ò‘|òŠ|òƒ|ò||òu|òn|òg|ò`|òY|òR|òK|òD|ò=|ò6|ò/|ò(|ò!|ò|ò|ò |ò|òþ{ò÷{òð{òé{òâ{òÛ{òÔ{òÍ{òÆ{ò¿{ò¸{ò±{òª{ò£{òœ{ò•{òŽ{ò‡{ò€{òy{òr{òk{òd{ò]{òV{òO{òH{òA{ò:{ò3{ò,{ò%{ò{ò{ò{ò {ò{òûzòôzòízòæzòßzòØzòÑzòÊzòÃzò¼zòµzò®zò§zò zò™zò’zò‹zò„zò}zòvzòozòhzòazòZzòSzòLzòEzò>zò7zò0zò)zò"zòzòzò zòzòÿyòøyòñyòêyòãyòÜyòÕyòÎyòÇyòÀyò¹yò²yò«yò¤yòyò–yòyòˆyòyòzyòsyòlyòeyò^yòWyòPyòIyòByò;yò4yò-yò&yòyòyòyò yòyòüxòõxòîxòçxòàxòÙxòÒxòËxòÄxò½xò¶xò¯xò¨xò¡xòšxò“xòŒxò…xò~xòwxòpxòixòbxò[xòTxòMxòFxò?xò8xò1xò*xò#xòxòxòxòxòxòùwòòwòëwòäwòÝwòÖwòÏwòÈwòÁwòºwò³wò¬wò¥wòžwò—wòwò‰wò‚wò{wòtwòmwòfwò_wòXwòQwòJwòCwòsò7sò0sò)sò"sòsòsò sòsòÿròøròñròêròãròÜròÕròÎròÇròÀrò¹rò²rò«rò¤ròrò–ròròˆròròzròsròlròerò^ròWròPròIròBrò;rò4rò-rò&ròròròrò ròròüqòõqòîqòçqòàqòÙqòÒqòËqòÄqò½qò¶qò¯qò¨qò¡qòšqò“qòŒqò…qò~qòwqòpqòiqòbqò[qòTqòMqòFqò?qò8qò1qò*qò#qòqòqòqòqòqòùpòòpòëpòäpòÝpòÖpòÏpòÈpòÁpòºpò³pò¬pò¥pòžpò—pòpò‰pò‚pò{pòtpòmpòfpò_pòXpòQpòJpòCpòlò7lò0lò)lò"lòlòlò lòlòÿkòøkòñkòêkòãkòÜkòÕkòÎkòÇkòÀkò¹kò²kò«kò¤kòkò–kòkòˆkòkòzkòskòlkòekò^kòWkòPkòIkòBkò;kò4kò-kò&kòkòkòkò kòkòüjòõjòîjòçjòàjòÙjòÒjòËjòÄjò½jò¶jò¯jò¨jò¡jòšjò“jòŒjò…jò~jòwjòpjòijòbjò[jòTjòMjòFjò?jò8jò1jò*jò#jòjòjòjòjòjòùiòòiòëiòäiòÝiòÖiòÏiòÈiòÁiòºiò³iò¬iò¥iòžiò—iòiò‰iò‚iò{iòtiòmiòfiò_iòXiòQiòJiòCiòeò7eò0eò)eò"eòeòeò eòeòÿdòødòñdòêdòãdòÜdòÕdòÎdòÇdòÀdò¹dò²dò«dò¤dòdò–dòdòˆdòdòzdòsdòldòedò^dòWdòPdòIdòBdò;dò4dò-dò&dòdòdòdò dòdòücòõcòîcòçcòàcòÙcòÒcòËcòÄcò½cò¶cò¯cò¨cò¡còšcò“còŒcò…cò~còwcòpcòicòbcò[còTcòMcòFcò?cò8cò1cò*cò#còcòcòcòcòcòùbòòbòëbòäbòÝbòÖbòÏbòÈbòÁbòºbò³bò¬bò¥bòžbò—bòbò‰bò‚bò{bòtbòmbòfbò_bòXbòQbòJbòCbò^ò7^ò0^ò)^ò"^ò^ò^ò ^ò^òÿ]òø]òñ]òê]òã]òÜ]òÕ]òÎ]òÇ]òÀ]ò¹]ò²]ò«]ò¤]ò]ò–]ò]òˆ]ò]òz]òs]òl]òe]ò^]òW]òP]òI]òB]ò;]ò4]ò-]ò&]ò]ò]ò]ò ]ò]òü\òõ\òî\òç\òà\òÙ\òÒ\òË\òÄ\ò½\ò¶\ò¯\ò¨\ò¡\òš\ò“\òŒ\ò…\ò~\òw\òp\òi\òb\ò[\òT\òM\òF\ò?\ò8\ò1\ò*\ò#\ò\ò\ò\ò\ò\òù[òò[òë[òä[òÝ[òÖ[òÏ[òÈ[òÁ[òº[ò³[ò¬[ò¥[òž[ò—[ò[ò‰[ò‚[ò{[òt[òm[òf[ò_[òX[òQ[òJ[òC[ò<[ò5[ò.[ò'[ò [ò[ò[ò [ò[òýZòöZòïZòèZòáZòÚZòÓZòÌZòÅZò¾Zò·Zò°Zò©Zò¢Zò›Zò”ZòZò†ZòZòxZòqZòjZòcZò\ZòUZòNZòGZò@Zò9Zò2Zò+Zò$ZòZòZòZòZòZòúYòóYòìYòåYòÞYò×YòÐYòÉYòÂYò»Yò´Yò­Yò¦YòŸYò˜Yò‘YòŠYòƒYò|YòuYònYògYò`YòYYòRYòKYòDYò=Yò6Yò/Yò(Yò!YòYòYò YòYòþXò÷XòðXòéXòâXòÛXòÔXòÍXòÆXò¿Xò¸Xò±XòªXò£XòœXò•XòŽXò‡Xò€XòyXòrXòkXòdXò]XòVXòOXòHXòAXò:Xò3Xò,Xò%XòXòXòXò XòXòûWòôWòíWòæWòßWòØWòÑWòÊWòÃWò¼WòµWò®Wò§Wò Wò™Wò’Wò‹Wò„Wò}WòvWòoWòhWòaWòZWòSWòLWòEWò>Wò7Wò0Wò)Wò"WòWòWò WòWòÿVòøVòñVòêVòãVòÜVòÕVòÎVòÇVòÀVò¹Vò²Vò«Vò¤VòVò–VòVòˆVòVòzVòsVòlVòeVò^VòWVòPVòIVòBVò;Vò4Vò-Vò&VòVòVòVò VòVòüUòõUòîUòçUòàUòÙUòÒUòËUòÄUò½Uò¶Uò¯Uò¨Uò¡UòšUò“UòŒUò…Uò~UòwUòpUòiUòbUò[UòTUòMUòFUò?Uò8Uò1Uò*Uò#UòUòUòUòUòUòùTòòTòëTòäTòÝTòÖTòÏTòÈTòÁTòºTò³Tò¬Tò¥TòžTò—TòTò‰Tò‚Tò{TòtTòmTòfTò_TòXTòQTòJTòCTòPò7Pò0Pò)Pò"PòPòPò PòPòÿOòøOòñOòêOòãOòÜOòÕOòÎOòÇOòÀOò¹Oò²Oò«Oò¤OòOò–OòOòˆOòOòzOòsOòlOòeOò^OòWOòPOòIOòBOò;Oò4Oò-Oò&OòOòOòOò OòOòüNòõNòîNòçNòàNòÙNòÒNòËNòÄNò½Nò¶Nò¯Nò¨Nò¡NòšNò“NòŒNò…Nò~NòwNòpNòiNòbNò[NòTNòMNòFNò?Nò8Nò1Nò*Nò#NòNòNòNòNòNòùMòòMòëMòäMòÝMòÖMòÏMòÈMòÁMòºMò³Mò¬Mò¥MòžMò—MòMò‰Mò‚Mò{MòtMòmMòfMò_MòXMòQMòJMòCMòIò7Iò0Iò)Iò"IòIòIò IòIòÿHòøHòñHòêHòãHòÜHòÕHòÎHòÇHòÀHò¹Hò²Hò«Hò¤HòHò–HòHòˆHòHòzHòsHòlHòeHò^HòWHòPHòIHòBHò;Hò4Hò-Hò&HòHòHòHò HòHòüGòõGòîGòçGòàGòÙGòÒGòËGòÄGò½Gò¶Gò¯Gò¨Gò¡GòšGò“GòŒGò…Gò~GòwGòpGòiGòbGò[GòTGòMGòFGò?Gò8Gò1Gò*Gò#GòGòGòGòGòGòùFòòFòëFòäFòÝFòÖFòÏFòÈFòÁFòºFò³Fò¬Fò¥FòžFò—FòFò‰Fò‚Fò{FòtFòmFòfFò_FòXFòQFòJFòCFòBò7Bò0Bò)Bò"BòBòBò BòBòÿAòøAòñAòêAòãAòÜAòÕAòÎAòÇAòÀAò¹Aò²Aò«Aò¤AòAò–AòAòˆAòAòzAòsAòlAòeAò^AòWAòPAòIAòBAò;Aò4Aò-Aò&AòAòAòAò AòAòü@òõ@òî@òç@òà@òÙ@òÒ@òË@òÄ@ò½@ò¶@ò¯@ò¨@ò¡@òš@ò“@òŒ@ò…@ò~@òw@òp@òi@òb@ò[@òT@òM@òF@ò?@ò8@ò1@ò*@ò#@ò@ò@ò@ò@ò@òù?òò?òë?òä?òÝ?òÖ?òÏ?òÈ?òÁ?òº?ò³?ò¬?ò¥?òž?ò—?ò?ò‰?ò‚?ò{?òt?òm?òf?ò_?òX?òQ?òJ?òC?òòö>òï>òè>òá>òÚ>òÓ>òÌ>òÅ>ò¾>ò·>ò°>ò©>ò¢>ò›>ò”>ò>ò†>ò>òx>òq>òj>òc>ò\>òU>òN>òG>ò@>ò9>ò2>ò+>ò$>ò>ò>ò>ò>ò>òú=òó=òì=òå=òÞ=ò×=òÐ=òÉ=òÂ=ò»=ò´=ò­=ò¦=òŸ=ò˜=ò‘=òŠ=òƒ=ò|=òu=òn=òg=ò`=òY=òR=òK=òD=ò==ò6=ò/=ò(=ò!=ò=ò=ò =ò=òþ<ò÷<òð<òé<òâ<òÛ<òÔ<òÍ<òÆ<ò¿<ò¸<ò±<òª<ò£<òœ<ò•<òŽ<ò‡<ò€<òy<òr<òk<òd<ò]<òV<òO<òH<òA<ò:<ò3<ò,<ò%<ò<ò<ò<ò <ò<òû;òô;òí;òæ;òß;òØ;òÑ;òÊ;òÃ;ò¼;òµ;ò®;ò§;ò ;ò™;ò’;ò‹;ò„;ò};òv;òo;òh;òa;òZ;òS;òL;òE;ò>;ò7;ò0;ò);ò";ò;ò;ò ;ò;òÿ:òø:òñ:òê:òã:òÜ:òÕ:òÎ:òÇ:òÀ:ò¹:ò²:ò«:ò¤:ò:ò–:ò:òˆ:ò:òz:òs:òl:òe:ò^:òW:òP:òI:òB:ò;:ò4:ò-:ò&:ò:ò:ò:ò :ò:òü9òõ9òî9òç9òà9òÙ9òÒ9òË9òÄ9ò½9ò¶9ò¯9ò¨9ò¡9òš9ò“9òŒ9ò…9ò~9òw9òp9òi9òb9ò[9òT9òM9òF9ò?9ò89ò19ò*9ò#9ò9ò9ò9ò9ò9òù8òò8òë8òä8òÝ8òÖ8òÏ8òÈ8òÁ8òº8ò³8ò¬8ò¥8òž8ò—8ò8ò‰8ò‚8ò{8òt8òm8òf8ò_8òX8òQ8òJ8òC8ò<8ò58ò.8ò'8ò 8ò8ò8ò 8ò8òý7òö7òï7òè7òá7òÚ7òÓ7òÌ7òÅ7ò¾7ò·7ò°7ò©7ò¢7ò›7ò”7ò7ò†7ò7òx7òq7òj7òc7ò\7òU7òN7òG7ò@7ò97ò27ò+7ò$7ò7ò7ò7ò7ò7òú6òó6òì6òå6òÞ6ò×6òÐ6òÉ6òÂ6ò»6ò´6ò­6ò¦6òŸ6ò˜6ò‘6òŠ6òƒ6ò|6òu6òn6òg6ò`6òY6òR6òK6òD6ò=6ò66ò/6ò(6ò!6ò6ò6ò 6ò6òþ5ò÷5òð5òé5òâ5òÛ5òÔ5òÍ5òÆ5ò¿5ò¸5ò±5òª5ò£5òœ5ò•5òŽ5ò‡5ò€5òy5òr5òk5òd5ò]5òV5òO5òH5òA5ò:5ò35ò,5ò%5ò5ò5ò5ò 5ò5òû4òô4òí4òæ4òß4òØ4òÑ4òÊ4òÃ4ò¼4òµ4ò®4ò§4ò 4ò™4ò’4ò‹4ò„4ò}4òv4òo4òh4òa4òZ4òS4òL4òE4ò>4ò74ò04ò)4ò"4ò4ò4ò 4ò4òÿ3òø3òñ3òê3òã3òÜ3òÕ3òÎ3òÇ3òÀ3ò¹3ò²3ò«3ò¤3ò3ò–3ò3òˆ3ò3òz3òs3òl3òe3ò^3òW3òP3òI3òB3ò;3ò43ò-3ò&3ò3ò3ò3ò 3ò3òü2òõ2òî2òç2òà2òÙ2òÒ2òË2òÄ2ò½2ò¶2ò¯2ò¨2ò¡2òš2ò“2òŒ2ò…2ò~2òw2òp2òi2òb2ò[2òT2òM2òF2ò?2ò82ò12ò*2ò#2ò2ò2ò2ò2ò2òù1òò1òë1òä1òÝ1òÖ1òÏ1òÈ1òÁ1òº1ò³1ò¬1ò¥1òž1ò—1ò1ò‰1ò‚1ò{1òt1òm1òf1ò_1òX1òQ1òJ1òC1ò<1ò51ò.1ò'1ò 1ò1ò1ò 1ò1òý0òö0òï0òè0òá0òÚ0òÓ0òÌ0òÅ0ò¾0ò·0ò°0ò©0ò¢0ò›0ò”0ò0ò†0ò0òx0òq0òj0òc0ò\0òU0òN0òG0ò@0ò90ò20ò+0ò$0ò0ò0ò0ò0ò0òú/òó/òì/òå/òÞ/ò×/òÐ/òÉ/òÂ/ò»/ò´/ò­/ò¦/òŸ/ò˜/ò‘/òŠ/òƒ/ò|/òu/òn/òg/ò`/òY/òR/òK/òD/ò=/ò6/ò//ò(/ò!/ò/ò/ò /ò/òþ.ò÷.òð.òé.òâ.òÛ.òÔ.òÍ.òÆ.ò¿.ò¸.ò±.òª.ò£.òœ.ò•.òŽ.ò‡.ò€.òy.òr.òk.òd.ò].òV.òO.òH.òA.ò:.ò3.ò,.ò%.ò.ò.ò.ò .ò.òû-òô-òí-òæ-òß-òØ-òÑ-òÊ-òÃ-ò¼-òµ-ò®-ò§-ò -ò™-ò’-ò‹-ò„-ò}-òv-òo-òh-òa-òZ-òS-òL-òE-ò>-ò7-ò0-ò)-ò"-ò-ò-ò -ò-òÿ,òø,òñ,òê,òã,òÜ,òÕ,òÎ,òÇ,òÀ,ò¹,ò²,ò«,ò¤,ò,ò–,ò,òˆ,ò,òz,òs,òl,òe,ò^,òW,òP,òI,òB,ò;,ò4,ò-,ò&,ò,ò,ò,ò ,ò,òü+òõ+òî+òç+òà+òÙ+òÒ+òË+òÄ+ò½+ò¶+ò¯+ò¨+ò¡+òš+ò“+òŒ+ò…+ò~+òw+òp+òi+òb+ò[+òT+òM+òF+ò?+ò8+ò1+ò*+ò#+ò+ò+ò+ò+ò+òù*òò*òë*òä*òÝ*òÖ*òÏ*òÈ*òÁ*òº*ò³*ò¬*ò¥*òž*ò—*ò*ò‰*ò‚*ò{*òt*òm*òf*ò_*òX*òQ*òJ*òC*ò<*ò5*ò.*ò'*ò *ò*ò*ò *ò*òý)òö)òï)òè)òá)òÚ)òÓ)òÌ)òÅ)ò¾)ò·)ò°)ò©)ò¢)ò›)ò”)ò)ò†)ò)òx)òq)òj)òc)ò\)òU)òN)òG)ò@)ò9)ò2)ò+)ò$)ò)ò)ò)ò)ò)òú(òó(òì(òå(òÞ(ò×(òÐ(òÉ(òÂ(ò»(ò´(ò­(ò¦(òŸ(ò˜(ò‘(òŠ(òƒ(ò|(òu(òn(òg(ò`(òY(òR(òK(òD(ò=(ò6(ò/(ò((ò!(ò(ò(ò (ò(òþ'ò÷'òð'òé'òâ'òÛ'òÔ'òÍ'òÆ'ò¿'ò¸'ò±'òª'ò£'òœ'ò•'òŽ'ò‡'ò€'òy'òr'òk'òd'ò]'òV'òO'òH'òA'ò:'ò3'ò,'ò%'ò'ò'ò'ò 'ò'òû&òô&òí&òæ&òß&òØ&òÑ&òÊ&òÃ&ò¼&òµ&ò®&ò§&ò &ò™&ò’&ò‹&ò„&ò}&òv&òo&òh&òa&òZ&òS&òL&òE&ò>&ò7&ò0&ò)&ò"&ò&ò&ò &ò&òÿ%òø%òñ%òê%òã%òÜ%òÕ%òÎ%òÇ%òÀ%ò¹%ò²%ò«%ò¤%ò%ò–%ò%òˆ%ò%òz%òs%òl%òe%ò^%òW%òP%òI%òB%ò;%ò4%ò-%ò&%ò%ò%ò%ò %ò%òü$òõ$òî$òç$òà$òÙ$òÒ$òË$òÄ$ò½$ò¶$ò¯$ò¨$ò¡$òš$ò“$òŒ$ò…$ò~$òw$òp$òi$òb$ò[$òT$òM$òF$ò?$ò8$ò1$ò*$ò#$ò$ò$ò$ò$ò$òù#òò#òë#òä#òÝ#òÖ#òÏ#òÈ#òÁ#òº#ò³#ò¬#ò¥#òž#ò—#ò#ò‰#ò‚#ò{#òt#òm#òf#ò_#òX#òQ#òJ#òC#ò<#ò5#ò.#ò'#ò #ò#ò#ò #ò#òý"òö"òï"òè"òá"òÚ"òÓ"òÌ"òÅ"ò¾"ò·"ò°"ò©"ò¢"ò›"ò”"ò"ò†"ò"òx"òq"òj"òc"ò\"òU"òN"òG"ò@"ò9"ò2"ò+"ò$"ò"ò"ò"ò"ò"òú!òó!òì!òå!òÞ!ò×!òÐ!òÉ!òÂ!ò»!ò´!ò­!ò¦!òŸ!ò˜!ò‘!òŠ!òƒ!ò|!òu!òn!òg!ò`!òY!òR!òK!òD!ò=!ò6!ò/!ò(!ò!!ò!ò!ò !ò!òþ ò÷ òð òé òâ òÛ òÔ òÍ òÆ ò¿ ò¸ ò± òª ò£ òœ ò• òŽ ò‡ ò€ òy òr òk òd ò] òV òO òH òA ò: ò3 ò, ò% ò ò ò ò ò òûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòý òö òï òè òá òÚ òÓ òÌ òÅ ò¾ ò· ò° ò© ò¢ ò› ò” ò ò† ò òx òq òj òc ò\ òU òN òG ò@ ò9 ò2 ò+ ò$ ò ò ò ò ò òú òó òì òå òÞ ò× òÐ òÉ ò ò» ò´ ò­ ò¦ òŸ ò˜ ò‘ òŠ òƒ ò| òu òn òg ò` òY òR òK òD ò= ò6 ò/ ò( ò! ò ò ò ò òþ ò÷ òð òé òâ òÛ òÔ òÍ òÆ ò¿ ò¸ ò± òª ò£ òœ ò• òŽ ò‡ ò€ òy òr òk òd ò] òV òO òH òA ò: ò3 ò, ò% ò ò ò ò ò òû òô òí òæ òß òØ òÑ òÊ òà ò¼ òµ ò® ò§ ò  ò™ ò’ ò‹ ò„ ò} òv òo òh òa òZ òS òL òE ò> ò7 ò0 ò) ò" ò ò ò ò òÿ òø òñ òê òã òÜ òÕ òÎ òÇ òÀ ò¹ ò² ò« ò¤ ò ò– ò òˆ ò òz òs òl òe ò^ òW òP òI òB ò; ò4 ò- ò& ò ò ò ò ò òüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýÿñöÿñïÿñèÿñáÿñÚÿñÓÿñÌÿñÅÿñ¾ÿñ·ÿñ°ÿñ©ÿñ¢ÿñ›ÿñ”ÿñÿñ†ÿñÿñxÿñqÿñjÿñcÿñ\ÿñUÿñNÿñGÿñ@ÿñ9ÿñ2ÿñ+ÿñ$ÿñÿñÿñÿñÿñÿñúþñóþñìþñåþñÞþñ×þñÐþñÉþñÂþñ»þñ´þñ­þñ¦þñŸþñ˜þñ‘þñŠþñƒþñ|þñuþñnþñgþñ`þñYþñRþñKþñDþñ=þñ6þñ/þñ(þñ!þñþñþñ þñþñþýñ÷ýñðýñéýñâýñÛýñÔýñÍýñÆýñ¿ýñ¸ýñ±ýñªýñ£ýñœýñ•ýñŽýñ‡ýñ€ýñyýñrýñkýñdýñ]ýñVýñOýñHýñAýñ:ýñ3ýñ,ýñ%ýñýñýñýñ ýñýñûüñôüñíüñæüñßüñØüñÑüñÊüñÃüñ¼üñµüñ®üñ§üñ üñ™üñ’üñ‹üñ„üñ}üñvüñoüñhüñaüñZüñSüñLüñEüñ>üñ7üñ0üñ)üñ"üñüñüñ üñüñÿûñøûññûñêûñãûñÜûñÕûñÎûñÇûñÀûñ¹ûñ²ûñ«ûñ¤ûñûñ–ûñûñˆûñûñzûñsûñlûñeûñ^ûñWûñPûñIûñBûñ;ûñ4ûñ-ûñ&ûñûñûñûñ ûñûñüúñõúñîúñçúñàúñÙúñÒúñËúñÄúñ½úñ¶úñ¯úñ¨úñ¡úñšúñ“úñŒúñ…úñ~úñwúñpúñiúñbúñ[úñTúñMúñFúñ?úñ8úñ1úñ*úñ#úñúñúñúñúñúñùùñòùñëùñäùñÝùñÖùñÏùñÈùñÁùñºùñ³ùñ¬ùñ¥ùñžùñ—ùñùñ‰ùñ‚ùñ{ùñtùñmùñfùñ_ùñXùñQùñJùñCùñ<ùñ5ùñ.ùñ'ùñ ùñùñùñ ùñùñýøñöøñïøñèøñáøñÚøñÓøñÌøñÅøñ¾øñ·øñ°øñ©øñ¢øñ›øñ”øñøñ†øñøñxøñqøñjøñcøñ\øñUøñNøñGøñ@øñ9øñ2øñ+øñ$øñøñøñøñøñøñú÷ñó÷ñì÷ñå÷ñÞ÷ñ×÷ñÐ÷ñÉ÷ñÂ÷ñ»÷ñ´÷ñ­÷ñ¦÷ñŸ÷ñ˜÷ñ‘÷ñŠ÷ñƒ÷ñ|÷ñu÷ñn÷ñg÷ñ`÷ñY÷ñR÷ñK÷ñD÷ñ=÷ñ6÷ñ/÷ñ(÷ñ!÷ñ÷ñ÷ñ ÷ñ÷ñþöñ÷öñðöñéöñâöñÛöñÔöñÍöñÆöñ¿öñ¸öñ±öñªöñ£öñœöñ•öñŽöñ‡öñ€öñyöñröñköñdöñ]öñVöñOöñHöñAöñ:öñ3öñ,öñ%öñöñöñöñ öñöñûõñôõñíõñæõñßõñØõñÑõñÊõñÃõñ¼õñµõñ®õñ§õñ õñ™õñ’õñ‹õñ„õñ}õñvõñoõñhõñaõñZõñSõñLõñEõñ>õñ7õñ0õñ)õñ"õñõñõñ õñõñÿôñøôññôñêôñãôñÜôñÕôñÎôñÇôñÀôñ¹ôñ²ôñ«ôñ¤ôñôñ–ôñôñˆôñôñzôñsôñlôñeôñ^ôñWôñPôñIôñBôñ;ôñ4ôñ-ôñ&ôñôñôñôñ ôñôñüóñõóñîóñçóñàóñÙóñÒóñËóñÄóñ½óñ¶óñ¯óñ¨óñ¡óñšóñ“óñŒóñ…óñ~óñwóñpóñióñbóñ[óñTóñMóñFóñ?óñ8óñ1óñ*óñ#óñóñóñóñóñóñùòñòòñëòñäòñÝòñÖòñÏòñÈòñÁòñºòñ³òñ¬òñ¥òñžòñ—òñòñ‰òñ‚òñ{òñtòñmòñfòñ_òñXòñQòñJòñCòñ<òñ5òñ.òñ'òñ òñòñòñ òñòñýññöññïññèññáññÚññÓññÌññÅññ¾ññ·ññ°ññ©ññ¢ññ›ññ”ññññ†ññññxññqññjññcññ\ññUññNññGññ@ññ9ññ2ññ+ññ$ññññññññññññúðñóðñìðñåðñÞðñ×ðñÐðñÉðñÂðñ»ðñ´ðñ­ðñ¦ðñŸðñ˜ðñ‘ðñŠðñƒðñ|ðñuðñnðñgðñ`ðñYðñRðñKðñDðñ=ðñ6ðñ/ðñ(ðñ!ðñðñðñ ðñðñþïñ÷ïñðïñéïñâïñÛïñÔïñÍïñÆïñ¿ïñ¸ïñ±ïñªïñ£ïñœïñ•ïñŽïñ‡ïñ€ïñyïñrïñkïñdïñ]ïñVïñOïñHïñAïñ:ïñ3ïñ,ïñ%ïñïñïñïñ ïñïñûîñôîñíîñæîñßîñØîñÑîñÊîñÃîñ¼îñµîñ®îñ§îñ îñ™îñ’îñ‹îñ„îñ}îñvîñoîñhîñaîñZîñSîñLîñEîñ>îñ7îñ0îñ)îñ"îñîñîñ îñîñÿíñøíññíñêíñãíñÜíñÕíñÎíñÇíñÀíñ¹íñ²íñ«íñ¤íñíñ–íñíñˆíñíñzíñsíñlíñeíñ^íñWíñPíñIíñBíñ;íñ4íñ-íñ&íñíñíñíñ íñíñüìñõìñîìñçìñàìñÙìñÒìñËìñÄìñ½ìñ¶ìñ¯ìñ¨ìñ¡ìñšìñ“ìñŒìñ…ìñ~ìñwìñpìñiìñbìñ[ìñTìñMìñFìñ?ìñ8ìñ1ìñ*ìñ#ìñìñìñìñìñìñùëñòëñëëñäëñÝëñÖëñÏëñÈëñÁëñºëñ³ëñ¬ëñ¥ëñžëñ—ëñëñ‰ëñ‚ëñ{ëñtëñmëñfëñ_ëñXëñQëñJëñCëñ<ëñ5ëñ.ëñ'ëñ ëñëñëñ ëñëñýêñöêñïêñèêñáêñÚêñÓêñÌêñÅêñ¾êñ·êñ°êñ©êñ¢êñ›êñ”êñêñ†êñêñxêñqêñjêñcêñ\êñUêñNêñGêñ@êñ9êñ2êñ+êñ$êñêñêñêñêñêñúéñóéñìéñåéñÞéñ×éñÐéñÉéñÂéñ»éñ´éñ­éñ¦éñŸéñ˜éñ‘éñŠéñƒéñ|éñuéñnéñgéñ`éñYéñRéñKéñDéñ=éñ6éñ/éñ(éñ!éñéñéñ éñéñþèñ÷èñðèñéèñâèñÛèñÔèñÍèñÆèñ¿èñ¸èñ±èñªèñ£èñœèñ•èñŽèñ‡èñ€èñyèñrèñkèñdèñ]èñVèñOèñHèñAèñ:èñ3èñ,èñ%èñèñèñèñ èñèñûçñôçñíçñæçñßçñØçñÑçñÊçñÃçñ¼çñµçñ®çñ§çñ çñ™çñ’çñ‹çñ„çñ}çñvçñoçñhçñaçñZçñSçñLçñEçñ>çñ7çñ0çñ)çñ"çñçñçñ çñçñÿæñøæññæñêæñãæñÜæñÕæñÎæñÇæñÀæñ¹æñ²æñ«æñ¤æñæñ–æñæñˆæñæñzæñsæñlæñeæñ^æñWæñPæñIæñBæñ;æñ4æñ-æñ&æñæñæñæñ æñæñüåñõåñîåñçåñàåñÙåñÒåñËåñÄåñ½åñ¶åñ¯åñ¨åñ¡åñšåñ“åñŒåñ…åñ~åñwåñpåñiåñbåñ[åñTåñMåñFåñ?åñ8åñ1åñ*åñ#åñåñåñåñåñåñùäñòäñëäñääñÝäñÖäñÏäñÈäñÁäñºäñ³äñ¬äñ¥äñžäñ—äñäñ‰äñ‚äñ{äñtäñmäñfäñ_äñXäñQäñJäñCäñ<äñ5äñ.äñ'äñ äñäñäñ äñäñýãñöãñïãñèãñáãñÚãñÓãñÌãñÅãñ¾ãñ·ãñ°ãñ©ãñ¢ãñ›ãñ”ãñãñ†ãñãñxãñqãñjãñcãñ\ãñUãñNãñGãñ@ãñ9ãñ2ãñ+ãñ$ãñãñãñãñãñãñúâñóâñìâñåâñÞâñ×âñÐâñÉâñÂâñ»âñ´âñ­âñ¦âñŸâñ˜âñ‘âñŠâñƒâñ|âñuâñnâñgâñ`âñYâñRâñKâñDâñ=âñ6âñ/âñ(âñ!âñâñâñ âñâñþáñ÷áñðáñéáñâáñÛáñÔáñÍáñÆáñ¿áñ¸áñ±áñªáñ£áñœáñ•áñŽáñ‡áñ€áñyáñráñkáñdáñ]áñVáñOáñHáñAáñ:áñ3áñ,áñ%áñáñáñáñ áñáñûàñôàñíàñæàñßàñØàñÑàñÊàñÃàñ¼àñµàñ®àñ§àñ àñ™àñ’àñ‹àñ„àñ}àñvàñoàñhàñaàñZàñSàñLàñEàñ>àñ7àñ0àñ)àñ"àñàñàñ àñàñÿßñøßññßñêßñãßñÜßñÕßñÎßñÇßñÀßñ¹ßñ²ßñ«ßñ¤ßñßñ–ßñßñˆßñßñzßñsßñlßñeßñ^ßñWßñPßñIßñBßñ;ßñ4ßñ-ßñ&ßñßñßñßñ ßñßñüÞñõÞñîÞñçÞñàÞñÙÞñÒÞñËÞñÄÞñ½Þñ¶Þñ¯Þñ¨Þñ¡ÞñšÞñ“ÞñŒÞñ…Þñ~ÞñwÞñpÞñiÞñbÞñ[ÞñTÞñMÞñFÞñ?Þñ8Þñ1Þñ*Þñ#ÞñÞñÞñÞñÞñÞñùÝñòÝñëÝñäÝñÝÝñÖÝñÏÝñÈÝñÁÝñºÝñ³Ýñ¬Ýñ¥ÝñžÝñ—ÝñÝñ‰Ýñ‚Ýñ{ÝñtÝñmÝñfÝñ_ÝñXÝñQÝñJÝñCÝñ<Ýñ5Ýñ.Ýñ'Ýñ ÝñÝñÝñ ÝñÝñýÜñöÜñïÜñèÜñáÜñÚÜñÓÜñÌÜñÅÜñ¾Üñ·Üñ°Üñ©Üñ¢Üñ›Üñ”ÜñÜñ†ÜñÜñxÜñqÜñjÜñcÜñ\ÜñUÜñNÜñGÜñ@Üñ9Üñ2Üñ+Üñ$ÜñÜñÜñÜñÜñÜñúÛñóÛñìÛñåÛñÞÛñ×ÛñÐÛñÉÛñÂÛñ»Ûñ´Ûñ­Ûñ¦ÛñŸÛñ˜Ûñ‘ÛñŠÛñƒÛñ|ÛñuÛñnÛñgÛñ`ÛñYÛñRÛñKÛñDÛñ=Ûñ6Ûñ/Ûñ(Ûñ!ÛñÛñÛñ ÛñÛñþÚñ÷ÚñðÚñéÚñâÚñÛÚñÔÚñÍÚñÆÚñ¿Úñ¸Úñ±ÚñªÚñ£ÚñœÚñ•ÚñŽÚñ‡Úñ€ÚñyÚñrÚñkÚñdÚñ]ÚñVÚñOÚñHÚñAÚñ:Úñ3Úñ,Úñ%ÚñÚñÚñÚñ ÚñÚñûÙñôÙñíÙñæÙñßÙñØÙñÑÙñÊÙñÃÙñ¼ÙñµÙñ®Ùñ§Ùñ Ùñ™Ùñ’Ùñ‹Ùñ„Ùñ}ÙñvÙñoÙñhÙñaÙñZÙñSÙñLÙñEÙñ>Ùñ7Ùñ0Ùñ)Ùñ"ÙñÙñÙñ ÙñÙñÿØñøØññØñêØñãØñÜØñÕØñÎØñÇØñÀØñ¹Øñ²Øñ«Øñ¤ØñØñ–ØñØñˆØñØñzØñsØñlØñeØñ^ØñWØñPØñIØñBØñ;Øñ4Øñ-Øñ&ØñØñØñØñ ØñØñü×ñõ×ñî×ñç×ñà×ñÙ×ñÒ×ñË×ñÄ×ñ½×ñ¶×ñ¯×ñ¨×ñ¡×ñš×ñ“×ñŒ×ñ…×ñ~×ñw×ñp×ñi×ñb×ñ[×ñT×ñM×ñF×ñ?×ñ8×ñ1×ñ*×ñ#×ñ×ñ×ñ×ñ×ñ×ñùÖñòÖñëÖñäÖñÝÖñÖÖñÏÖñÈÖñÁÖñºÖñ³Öñ¬Öñ¥ÖñžÖñ—ÖñÖñ‰Öñ‚Öñ{ÖñtÖñmÖñfÖñ_ÖñXÖñQÖñJÖñCÖñ<Öñ5Öñ.Öñ'Öñ ÖñÖñÖñ ÖñÖñýÕñöÕñïÕñèÕñáÕñÚÕñÓÕñÌÕñÅÕñ¾Õñ·Õñ°Õñ©Õñ¢Õñ›Õñ”ÕñÕñ†ÕñÕñxÕñqÕñjÕñcÕñ\ÕñUÕñNÕñGÕñ@Õñ9Õñ2Õñ+Õñ$ÕñÕñÕñÕñÕñÕñúÔñóÔñìÔñåÔñÞÔñ×ÔñÐÔñÉÔñÂÔñ»Ôñ´Ôñ­Ôñ¦ÔñŸÔñ˜Ôñ‘ÔñŠÔñƒÔñ|ÔñuÔñnÔñgÔñ`ÔñYÔñRÔñKÔñDÔñ=Ôñ6Ôñ/Ôñ(Ôñ!ÔñÔñÔñ ÔñÔñþÓñ÷ÓñðÓñéÓñâÓñÛÓñÔÓñÍÓñÆÓñ¿Óñ¸Óñ±ÓñªÓñ£ÓñœÓñ•ÓñŽÓñ‡Óñ€ÓñyÓñrÓñkÓñdÓñ]ÓñVÓñOÓñHÓñAÓñ:Óñ3Óñ,Óñ%ÓñÓñÓñÓñ ÓñÓñûÒñôÒñíÒñæÒñßÒñØÒñÑÒñÊÒñÃÒñ¼ÒñµÒñ®Òñ§Òñ Òñ™Òñ’Òñ‹Òñ„Òñ}ÒñvÒñoÒñhÒñaÒñZÒñSÒñLÒñEÒñ>Òñ7Òñ0Òñ)Òñ"ÒñÒñÒñ ÒñÒñÿÑñøÑññÑñêÑñãÑñÜÑñÕÑñÎÑñÇÑñÀÑñ¹Ññ²Ññ«Ññ¤ÑñÑñ–ÑñÑñˆÑñÑñzÑñsÑñlÑñeÑñ^ÑñWÑñPÑñIÑñBÑñ;Ññ4Ññ-Ññ&ÑñÑñÑñÑñ ÑñÑñüÐñõÐñîÐñçÐñàÐñÙÐñÒÐñËÐñÄÐñ½Ðñ¶Ðñ¯Ðñ¨Ðñ¡ÐñšÐñ“ÐñŒÐñ…Ðñ~ÐñwÐñpÐñiÐñbÐñ[ÐñTÐñMÐñFÐñ?Ðñ8Ðñ1Ðñ*Ðñ#ÐñÐñÐñÐñÐñÐñùÏñòÏñëÏñäÏñÝÏñÖÏñÏÏñÈÏñÁÏñºÏñ³Ïñ¬Ïñ¥ÏñžÏñ—ÏñÏñ‰Ïñ‚Ïñ{ÏñtÏñmÏñfÏñ_ÏñXÏñQÏñJÏñCÏñ<Ïñ5Ïñ.Ïñ'Ïñ ÏñÏñÏñ ÏñÏñýÎñöÎñïÎñèÎñáÎñÚÎñÓÎñÌÎñÅÎñ¾Îñ·Îñ°Îñ©Îñ¢Îñ›Îñ”ÎñÎñ†ÎñÎñxÎñqÎñjÎñcÎñ\ÎñUÎñNÎñGÎñ@Îñ9Îñ2Îñ+Îñ$ÎñÎñÎñÎñÎñÎñúÍñóÍñìÍñåÍñÞÍñ×ÍñÐÍñÉÍñÂÍñ»Íñ´Íñ­Íñ¦ÍñŸÍñ˜Íñ‘ÍñŠÍñƒÍñ|ÍñuÍñnÍñgÍñ`ÍñYÍñRÍñKÍñDÍñ=Íñ6Íñ/Íñ(Íñ!ÍñÍñÍñ ÍñÍñþÌñ÷ÌñðÌñéÌñâÌñÛÌñÔÌñÍÌñÆÌñ¿Ìñ¸Ìñ±ÌñªÌñ£ÌñœÌñ•ÌñŽÌñ‡Ìñ€ÌñyÌñrÌñkÌñdÌñ]ÌñVÌñOÌñHÌñAÌñ:Ìñ3Ìñ,Ìñ%ÌñÌñÌñÌñ ÌñÌñûËñôËñíËñæËñßËñØËñÑËñÊËñÃËñ¼ËñµËñ®Ëñ§Ëñ Ëñ™Ëñ’Ëñ‹Ëñ„Ëñ}ËñvËñoËñhËñaËñZËñSËñLËñEËñ>Ëñ7Ëñ0Ëñ)Ëñ"ËñËñËñ ËñËñÿÊñøÊññÊñêÊñãÊñÜÊñÕÊñÎÊñÇÊñÀÊñ¹Êñ²Êñ«Êñ¤ÊñÊñ–ÊñÊñˆÊñÊñzÊñsÊñlÊñeÊñ^ÊñWÊñPÊñIÊñBÊñ;Êñ4Êñ-Êñ&ÊñÊñÊñÊñ ÊñÊñüÉñõÉñîÉñçÉñàÉñÙÉñÒÉñËÉñÄÉñ½Éñ¶Éñ¯Éñ¨Éñ¡ÉñšÉñ“ÉñŒÉñ…Éñ~ÉñwÉñpÉñiÉñbÉñ[ÉñTÉñMÉñFÉñ?Éñ8Éñ1Éñ*Éñ#ÉñÉñÉñÉñÉñÉñùÈñòÈñëÈñäÈñÝÈñÖÈñÏÈñÈÈñÁÈñºÈñ³Èñ¬Èñ¥ÈñžÈñ—ÈñÈñ‰Èñ‚Èñ{ÈñtÈñmÈñfÈñ_ÈñXÈñQÈñJÈñCÈñ<Èñ5Èñ.Èñ'Èñ ÈñÈñÈñ ÈñÈñýÇñöÇñïÇñèÇñáÇñÚÇñÓÇñÌÇñÅÇñ¾Çñ·Çñ°Çñ©Çñ¢Çñ›Çñ”ÇñÇñ†ÇñÇñxÇñqÇñjÇñcÇñ\ÇñUÇñNÇñGÇñ@Çñ9Çñ2Çñ+Çñ$ÇñÇñÇñÇñÇñÇñúÆñóÆñìÆñåÆñÞÆñׯñÐÆñÉÆñÂÆñ»Æñ´Æñ­Æñ¦ÆñŸÆñ˜Æñ‘ÆñŠÆñƒÆñ|ÆñuÆñnÆñgÆñ`ÆñYÆñRÆñKÆñDÆñ=Æñ6Æñ/Æñ(Æñ!ÆñÆñÆñ ÆñÆñþÅñ÷ÅñðÅñéÅñâÅñÛÅñÔÅñÍÅñÆÅñ¿Åñ¸Åñ±ÅñªÅñ£ÅñœÅñ•ÅñŽÅñ‡Åñ€ÅñyÅñrÅñkÅñdÅñ]ÅñVÅñOÅñHÅñAÅñ:Åñ3Åñ,Åñ%ÅñÅñÅñÅñ ÅñÅñûÄñôÄñíÄñæÄñßÄñØÄñÑÄñÊÄñÃÄñ¼ÄñµÄñ®Äñ§Äñ Äñ™Äñ’Äñ‹Äñ„Äñ}ÄñvÄñoÄñhÄñaÄñZÄñSÄñLÄñEÄñ>Äñ7Äñ0Äñ)Äñ"ÄñÄñÄñ ÄñÄñÿÃñøÃññÃñêÃñãÃñÜÃñÕÃñÎÃñÇÃñÀÃñ¹Ãñ²Ãñ«Ãñ¤ÃñÃñ–ÃñÃñˆÃñÃñzÃñsÃñlÃñeÃñ^ÃñWÃñPÃñIÃñBÃñ;Ãñ4Ãñ-Ãñ&ÃñÃñÃñÃñ ÃñÃñüÂñõÂñîÂñçÂñàÂñÙÂñÒÂñËÂñÄÂñ½Âñ¶Âñ¯Âñ¨Âñ¡ÂñšÂñ“ÂñŒÂñ…Âñ~ÂñwÂñpÂñiÂñbÂñ[ÂñTÂñMÂñFÂñ?Âñ8Âñ1Âñ*Âñ#ÂñÂñÂñÂñÂñÂñùÁñòÁñëÁñäÁñÝÁñÖÁñÏÁñÈÁñÁÁñºÁñ³Áñ¬Áñ¥ÁñžÁñ—ÁñÁñ‰Áñ‚Áñ{ÁñtÁñmÁñfÁñ_ÁñXÁñQÁñJÁñCÁñ<Áñ5Áñ.Áñ'Áñ ÁñÁñÁñ ÁñÁñýÀñöÀñïÀñèÀñáÀñÚÀñÓÀñÌÀñÅÀñ¾Àñ·Àñ°Àñ©Àñ¢Àñ›Àñ”ÀñÀñ†ÀñÀñxÀñqÀñjÀñcÀñ\ÀñUÀñNÀñGÀñ@Àñ9Àñ2Àñ+Àñ$ÀñÀñÀñÀñÀñÀñú¿ñó¿ñì¿ñå¿ñÞ¿ñ׿ñпñÉ¿ñ¿ñ»¿ñ´¿ñ­¿ñ¦¿ñŸ¿ñ˜¿ñ‘¿ñŠ¿ñƒ¿ñ|¿ñu¿ñn¿ñg¿ñ`¿ñY¿ñR¿ñK¿ñD¿ñ=¿ñ6¿ñ/¿ñ(¿ñ!¿ñ¿ñ¿ñ ¿ñ¿ñþ¾ñ÷¾ñð¾ñé¾ñâ¾ñÛ¾ñÔ¾ñ;ñƾñ¿¾ñ¸¾ñ±¾ñª¾ñ£¾ñœ¾ñ•¾ñ޾ñ‡¾ñ€¾ñy¾ñr¾ñk¾ñd¾ñ]¾ñV¾ñO¾ñH¾ñA¾ñ:¾ñ3¾ñ,¾ñ%¾ñ¾ñ¾ñ¾ñ ¾ñ¾ñû½ñô½ñí½ñæ½ñß½ñؽñѽñʽñýñ¼½ñµ½ñ®½ñ§½ñ ½ñ™½ñ’½ñ‹½ñ„½ñ}½ñv½ño½ñh½ña½ñZ½ñS½ñL½ñE½ñ>½ñ7½ñ0½ñ)½ñ"½ñ½ñ½ñ ½ñ½ñÿ¼ñø¼ññ¼ñê¼ñã¼ñܼñÕ¼ñμñǼñÀ¼ñ¹¼ñ²¼ñ«¼ñ¤¼ñ¼ñ–¼ñ¼ñˆ¼ñ¼ñz¼ñs¼ñl¼ñe¼ñ^¼ñW¼ñP¼ñI¼ñB¼ñ;¼ñ4¼ñ-¼ñ&¼ñ¼ñ¼ñ¼ñ ¼ñ¼ñü»ñõ»ñî»ñç»ñà»ñÙ»ñÒ»ñË»ñÄ»ñ½»ñ¶»ñ¯»ñ¨»ñ¡»ñš»ñ“»ñŒ»ñ…»ñ~»ñw»ñp»ñi»ñb»ñ[»ñT»ñM»ñF»ñ?»ñ8»ñ1»ñ*»ñ#»ñ»ñ»ñ»ñ»ñ»ñùºñòºñëºñäºñݺñÖºñϺñȺñÁºñººñ³ºñ¬ºñ¥ºñžºñ—ºñºñ‰ºñ‚ºñ{ºñtºñmºñfºñ_ºñXºñQºñJºñCºñ<ºñ5ºñ.ºñ'ºñ ºñºñºñ ºñºñý¹ñö¹ñï¹ñè¹ñá¹ñÚ¹ñÓ¹ñ̹ñŹñ¾¹ñ·¹ñ°¹ñ©¹ñ¢¹ñ›¹ñ”¹ñ¹ñ†¹ñ¹ñx¹ñq¹ñj¹ñc¹ñ\¹ñU¹ñN¹ñG¹ñ@¹ñ9¹ñ2¹ñ+¹ñ$¹ñ¹ñ¹ñ¹ñ¹ñ¹ñú¸ñó¸ñì¸ñå¸ñÞ¸ñ׸ñиñɸñ¸ñ»¸ñ´¸ñ­¸ñ¦¸ñŸ¸ñ˜¸ñ‘¸ñЏñƒ¸ñ|¸ñu¸ñn¸ñg¸ñ`¸ñY¸ñR¸ñK¸ñD¸ñ=¸ñ6¸ñ/¸ñ(¸ñ!¸ñ¸ñ¸ñ ¸ñ¸ñþ·ñ÷·ñð·ñé·ñâ·ñÛ·ñÔ·ñÍ·ñÆ·ñ¿·ñ¸·ñ±·ñª·ñ£·ñœ·ñ•·ñŽ·ñ‡·ñ€·ñy·ñr·ñk·ñd·ñ]·ñV·ñO·ñH·ñA·ñ:·ñ3·ñ,·ñ%·ñ·ñ·ñ·ñ ·ñ·ñû¶ñô¶ñí¶ñæ¶ñß¶ñضñѶñʶñöñ¼¶ñµ¶ñ®¶ñ§¶ñ ¶ñ™¶ñ’¶ñ‹¶ñ„¶ñ}¶ñv¶ño¶ñh¶ña¶ñZ¶ñS¶ñL¶ñE¶ñ>¶ñ7¶ñ0¶ñ)¶ñ"¶ñ¶ñ¶ñ ¶ñ¶ñÿµñøµññµñêµñãµñܵñÕµñεñǵñÀµñ¹µñ²µñ«µñ¤µñµñ–µñµñˆµñµñzµñsµñlµñeµñ^µñWµñPµñIµñBµñ;µñ4µñ-µñ&µñµñµñµñ µñµñü´ñõ´ñî´ñç´ñà´ñÙ´ñÒ´ñË´ñÄ´ñ½´ñ¶´ñ¯´ñ¨´ñ¡´ñš´ñ“´ñŒ´ñ…´ñ~´ñw´ñp´ñi´ñb´ñ[´ñT´ñM´ñF´ñ?´ñ8´ñ1´ñ*´ñ#´ñ´ñ´ñ´ñ´ñ´ñù³ñò³ñë³ñä³ñݳñÖ³ñϳñȳñÁ³ñº³ñ³³ñ¬³ñ¥³ñž³ñ—³ñ³ñ‰³ñ‚³ñ{³ñt³ñm³ñf³ñ_³ñX³ñQ³ñJ³ñC³ñ<³ñ5³ñ.³ñ'³ñ ³ñ³ñ³ñ ³ñ³ñý²ñö²ñï²ñè²ñá²ñÚ²ñÓ²ñ̲ñŲñ¾²ñ·²ñ°²ñ©²ñ¢²ñ›²ñ”²ñ²ñ†²ñ²ñx²ñq²ñj²ñc²ñ\²ñU²ñN²ñG²ñ@²ñ9²ñ2²ñ+²ñ$²ñ²ñ²ñ²ñ²ñ²ñú±ñó±ñì±ñå±ñÞ±ñ×±ñбñɱñ±ñ»±ñ´±ñ­±ñ¦±ñŸ±ñ˜±ñ‘±ñбñƒ±ñ|±ñu±ñn±ñg±ñ`±ñY±ñR±ñK±ñD±ñ=±ñ6±ñ/±ñ(±ñ!±ñ±ñ±ñ ±ñ±ñþ°ñ÷°ñð°ñé°ñâ°ñÛ°ñÔ°ñͰñưñ¿°ñ¸°ñ±°ñª°ñ£°ñœ°ñ•°ñްñ‡°ñ€°ñy°ñr°ñk°ñd°ñ]°ñV°ñO°ñH°ñA°ñ:°ñ3°ñ,°ñ%°ñ°ñ°ñ°ñ °ñ°ñû¯ñô¯ñí¯ñæ¯ñ߯ñدñѯñʯñïñ¼¯ñµ¯ñ®¯ñ§¯ñ ¯ñ™¯ñ’¯ñ‹¯ñ„¯ñ}¯ñv¯ño¯ñh¯ña¯ñZ¯ñS¯ñL¯ñE¯ñ>¯ñ7¯ñ0¯ñ)¯ñ"¯ñ¯ñ¯ñ ¯ñ¯ñÿ®ñø®ññ®ñê®ñã®ñÜ®ñÕ®ñήñÇ®ñÀ®ñ¹®ñ²®ñ«®ñ¤®ñ®ñ–®ñ®ñˆ®ñ®ñz®ñs®ñl®ñe®ñ^®ñW®ñP®ñI®ñB®ñ;®ñ4®ñ-®ñ&®ñ®ñ®ñ®ñ ®ñ®ñü­ñõ­ñî­ñç­ñà­ñÙ­ñÒ­ñË­ñÄ­ñ½­ñ¶­ñ¯­ñ¨­ñ¡­ñš­ñ“­ñŒ­ñ…­ñ~­ñw­ñp­ñi­ñb­ñ[­ñT­ñM­ñF­ñ?­ñ8­ñ1­ñ*­ñ#­ñ­ñ­ñ­ñ­ñ­ñù¬ñò¬ñë¬ñä¬ñݬñÖ¬ñϬñȬñÁ¬ñº¬ñ³¬ñ¬¬ñ¥¬ñž¬ñ—¬ñ¬ñ‰¬ñ‚¬ñ{¬ñt¬ñm¬ñf¬ñ_¬ñX¬ñQ¬ñJ¬ñC¬ñ<¬ñ5¬ñ.¬ñ'¬ñ ¬ñ¬ñ¬ñ ¬ñ¬ñý«ñö«ñï«ñè«ñá«ñÚ«ñÓ«ñÌ«ñÅ«ñ¾«ñ·«ñ°«ñ©«ñ¢«ñ›«ñ”«ñ«ñ†«ñ«ñx«ñq«ñj«ñc«ñ\«ñU«ñN«ñG«ñ@«ñ9«ñ2«ñ+«ñ$«ñ«ñ«ñ«ñ«ñ«ñúªñóªñìªñåªñÞªñתñЪñɪñªñ»ªñ´ªñ­ªñ¦ªñŸªñ˜ªñ‘ªñŠªñƒªñ|ªñuªñnªñgªñ`ªñYªñRªñKªñDªñ=ªñ6ªñ/ªñ(ªñ!ªñªñªñ ªñªñþ©ñ÷©ñð©ñé©ñâ©ñÛ©ñÔ©ñÍ©ñÆ©ñ¿©ñ¸©ñ±©ñª©ñ£©ñœ©ñ•©ñŽ©ñ‡©ñ€©ñy©ñr©ñk©ñd©ñ]©ñV©ñO©ñH©ñA©ñ:©ñ3©ñ,©ñ%©ñ©ñ©ñ©ñ ©ñ©ñû¨ñô¨ñí¨ñæ¨ñߨñبñѨñʨñèñ¼¨ñµ¨ñ®¨ñ§¨ñ ¨ñ™¨ñ’¨ñ‹¨ñ„¨ñ}¨ñv¨ño¨ñh¨ña¨ñZ¨ñS¨ñL¨ñE¨ñ>¨ñ7¨ñ0¨ñ)¨ñ"¨ñ¨ñ¨ñ ¨ñ¨ñÿ§ñø§ññ§ñê§ñã§ñܧñÕ§ñΧñǧñÀ§ñ¹§ñ²§ñ«§ñ¤§ñ§ñ–§ñ§ñˆ§ñ§ñz§ñs§ñl§ñe§ñ^§ñW§ñP§ñI§ñB§ñ;§ñ4§ñ-§ñ&§ñ§ñ§ñ§ñ §ñ§ñü¦ñõ¦ñî¦ñç¦ñà¦ñÙ¦ñÒ¦ñ˦ñĦñ½¦ñ¶¦ñ¯¦ñ¨¦ñ¡¦ñš¦ñ“¦ñŒ¦ñ…¦ñ~¦ñw¦ñp¦ñi¦ñb¦ñ[¦ñT¦ñM¦ñF¦ñ?¦ñ8¦ñ1¦ñ*¦ñ#¦ñ¦ñ¦ñ¦ñ¦ñ¦ñù¥ñò¥ñë¥ñä¥ñÝ¥ñÖ¥ñÏ¥ñÈ¥ñÁ¥ñº¥ñ³¥ñ¬¥ñ¥¥ñž¥ñ—¥ñ¥ñ‰¥ñ‚¥ñ{¥ñt¥ñm¥ñf¥ñ_¥ñX¥ñQ¥ñJ¥ñC¥ñ<¥ñ5¥ñ.¥ñ'¥ñ ¥ñ¥ñ¥ñ ¥ñ¥ñý¤ñö¤ñï¤ñè¤ñá¤ñÚ¤ñÓ¤ñ̤ñŤñ¾¤ñ·¤ñ°¤ñ©¤ñ¢¤ñ›¤ñ”¤ñ¤ñ†¤ñ¤ñx¤ñq¤ñj¤ñc¤ñ\¤ñU¤ñN¤ñG¤ñ@¤ñ9¤ñ2¤ñ+¤ñ$¤ñ¤ñ¤ñ¤ñ¤ñ¤ñú£ñó£ñì£ñå£ñÞ£ñ×£ñУñÉ£ñ£ñ»£ñ´£ñ­£ñ¦£ñŸ£ñ˜£ñ‘£ñŠ£ñƒ£ñ|£ñu£ñn£ñg£ñ`£ñY£ñR£ñK£ñD£ñ=£ñ6£ñ/£ñ(£ñ!£ñ£ñ£ñ £ñ£ñþ¢ñ÷¢ñð¢ñé¢ñâ¢ñÛ¢ñÔ¢ñÍ¢ñÆ¢ñ¿¢ñ¸¢ñ±¢ñª¢ñ£¢ñœ¢ñ•¢ñŽ¢ñ‡¢ñ€¢ñy¢ñr¢ñk¢ñd¢ñ]¢ñV¢ñO¢ñH¢ñA¢ñ:¢ñ3¢ñ,¢ñ%¢ñ¢ñ¢ñ¢ñ ¢ñ¢ñû¡ñô¡ñí¡ñæ¡ñß¡ñØ¡ñÑ¡ñÊ¡ñáñ¼¡ñµ¡ñ®¡ñ§¡ñ ¡ñ™¡ñ’¡ñ‹¡ñ„¡ñ}¡ñv¡ño¡ñh¡ña¡ñZ¡ñS¡ñL¡ñE¡ñ>¡ñ7¡ñ0¡ñ)¡ñ"¡ñ¡ñ¡ñ ¡ñ¡ñÿ ñø ññ ñê ñã ñÜ ñÕ ñΠñÇ ñÀ ñ¹ ñ² ñ« ñ¤ ñ ñ– ñ ñˆ ñ ñz ñs ñl ñe ñ^ ñW ñP ñI ñB ñ; ñ4 ñ- ñ& ñ ñ ñ ñ  ñ ñüŸñõŸñîŸñçŸñàŸñÙŸñÒŸñËŸñÄŸñ½Ÿñ¶Ÿñ¯Ÿñ¨Ÿñ¡ŸñšŸñ“ŸñŒŸñ…Ÿñ~ŸñwŸñpŸñiŸñbŸñ[ŸñTŸñMŸñFŸñ?Ÿñ8Ÿñ1Ÿñ*Ÿñ#ŸñŸñŸñŸñŸñŸñùžñòžñëžñäžñÝžñÖžñÏžñÈžñÁžñºžñ³žñ¬žñ¥žñžžñ—žñžñ‰žñ‚žñ{žñtžñmžñfžñ_žñXžñQžñJžñCžñ<žñ5žñ.žñ'žñ žñžñžñ žñžñýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúœñóœñìœñåœñÞœñלñМñÉœñœñ»œñ´œñ­œñ¦œñŸœñ˜œñ‘œñŠœñƒœñ|œñuœñnœñgœñ`œñYœñRœñKœñDœñ=œñ6œñ/œñ(œñ!œñœñœñ œñœñþ›ñ÷›ñð›ñé›ñâ›ñÛ›ñÔ›ñÍ›ñÆ›ñ¿›ñ¸›ñ±›ñª›ñ£›ñœ›ñ•›ñŽ›ñ‡›ñ€›ñy›ñr›ñk›ñd›ñ]›ñV›ñO›ñH›ñA›ñ:›ñ3›ñ,›ñ%›ñ›ñ›ñ›ñ ›ñ›ñûšñôšñíšñæšñßšñØšñÑšñÊšñÚñ¼šñµšñ®šñ§šñ šñ™šñ’šñ‹šñ„šñ}šñvšñošñhšñašñZšñSšñLšñEšñ>šñ7šñ0šñ)šñ"šñšñšñ šñšñÿ™ñø™ññ™ñê™ñã™ñÜ™ñÕ™ñΙñÇ™ñÀ™ñ¹™ñ²™ñ«™ñ¤™ñ™ñ–™ñ™ñˆ™ñ™ñz™ñs™ñl™ñe™ñ^™ñW™ñP™ñI™ñB™ñ;™ñ4™ñ-™ñ&™ñ™ñ™ñ™ñ ™ñ™ñü˜ñõ˜ñî˜ñç˜ñà˜ñÙ˜ñÒ˜ñ˘ñĘñ½˜ñ¶˜ñ¯˜ñ¨˜ñ¡˜ñš˜ñ“˜ñŒ˜ñ…˜ñ~˜ñw˜ñp˜ñi˜ñb˜ñ[˜ñT˜ñM˜ñF˜ñ?˜ñ8˜ñ1˜ñ*˜ñ#˜ñ˜ñ˜ñ˜ñ˜ñ˜ñù—ñò—ñë—ñä—ñÝ—ñÖ—ñÏ—ñÈ—ñÁ—ñº—ñ³—ñ¬—ñ¥—ñž—ñ——ñ—ñ‰—ñ‚—ñ{—ñt—ñm—ñf—ñ_—ñX—ñQ—ñJ—ñC—ñ<—ñ5—ñ.—ñ'—ñ —ñ—ñ—ñ —ñ—ñý–ñö–ñï–ñè–ñá–ñÚ–ñÓ–ñÌ–ñÅ–ñ¾–ñ·–ñ°–ñ©–ñ¢–ñ›–ñ”–ñ–ñ†–ñ–ñx–ñq–ñj–ñc–ñ\–ñU–ñN–ñG–ñ@–ñ9–ñ2–ñ+–ñ$–ñ–ñ–ñ–ñ–ñ–ñú•ñó•ñì•ñå•ñÞ•ñוñЕñÉ•ñ•ñ»•ñ´•ñ­•ñ¦•ñŸ•ñ˜•ñ‘•ñŠ•ñƒ•ñ|•ñu•ñn•ñg•ñ`•ñY•ñR•ñK•ñD•ñ=•ñ6•ñ/•ñ(•ñ!•ñ•ñ•ñ •ñ•ñþ”ñ÷”ñð”ñé”ñâ”ñÛ”ñÔ”ñÍ”ñÆ”ñ¿”ñ¸”ñ±”ñª”ñ£”ñœ”ñ•”ñŽ”ñ‡”ñ€”ñy”ñr”ñk”ñd”ñ]”ñV”ñO”ñH”ñA”ñ:”ñ3”ñ,”ñ%”ñ”ñ”ñ”ñ ”ñ”ñû“ñô“ñí“ñæ“ñß“ñØ“ñÑ“ñÊ“ñÓñ¼“ñµ“ñ®“ñ§“ñ “ñ™“ñ’“ñ‹“ñ„“ñ}“ñv“ño“ñh“ña“ñZ“ñS“ñL“ñE“ñ>“ñ7“ñ0“ñ)“ñ"“ñ“ñ“ñ “ñ“ñÿ’ñø’ññ’ñê’ñã’ñÜ’ñÕ’ñÎ’ñÇ’ñÀ’ñ¹’ñ²’ñ«’ñ¤’ñ’ñ–’ñ’ñˆ’ñ’ñz’ñs’ñl’ñe’ñ^’ñW’ñP’ñI’ñB’ñ;’ñ4’ñ-’ñ&’ñ’ñ’ñ’ñ ’ñ’ñü‘ñõ‘ñî‘ñç‘ñà‘ñÙ‘ñÒ‘ñË‘ñÄ‘ñ½‘ñ¶‘ñ¯‘ñ¨‘ñ¡‘ñš‘ñ“‘ñŒ‘ñ…‘ñ~‘ñw‘ñp‘ñi‘ñb‘ñ[‘ñT‘ñM‘ñF‘ñ?‘ñ8‘ñ1‘ñ*‘ñ#‘ñ‘ñ‘ñ‘ñ‘ñ‘ñùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúŽñóŽñìŽñåŽñÞŽñ׎ñÐŽñÉŽñÂŽñ»Žñ´Žñ­Žñ¦ŽñŸŽñ˜Žñ‘ŽñŠŽñƒŽñ|ŽñuŽñnŽñgŽñ`ŽñYŽñRŽñKŽñDŽñ=Žñ6Žñ/Žñ(Žñ!ŽñŽñŽñ ŽñŽñþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûŒñôŒñíŒñæŒñߌñØŒñÑŒñÊŒñÃŒñ¼ŒñµŒñ®Œñ§Œñ Œñ™Œñ’Œñ‹Œñ„Œñ}ŒñvŒñoŒñhŒñaŒñZŒñSŒñLŒñEŒñ>Œñ7Œñ0Œñ)Œñ"ŒñŒñŒñ ŒñŒñÿ‹ñø‹ññ‹ñê‹ñã‹ñÜ‹ñÕ‹ñ΋ñÇ‹ñÀ‹ñ¹‹ñ²‹ñ«‹ñ¤‹ñ‹ñ–‹ñ‹ñˆ‹ñ‹ñz‹ñs‹ñl‹ñe‹ñ^‹ñW‹ñP‹ñI‹ñB‹ñ;‹ñ4‹ñ-‹ñ&‹ñ‹ñ‹ñ‹ñ ‹ñ‹ñüŠñõŠñîŠñçŠñàŠñÙŠñÒŠñËŠñÄŠñ½Šñ¶Šñ¯Šñ¨Šñ¡ŠñšŠñ“ŠñŒŠñ…Šñ~ŠñwŠñpŠñiŠñbŠñ[ŠñTŠñMŠñFŠñ?Šñ8Šñ1Šñ*Šñ#ŠñŠñŠñŠñŠñŠñù‰ñò‰ñë‰ñä‰ñ݉ñÖ‰ñωñȉñÁ‰ñº‰ñ³‰ñ¬‰ñ¥‰ñž‰ñ—‰ñ‰ñ‰‰ñ‚‰ñ{‰ñt‰ñm‰ñf‰ñ_‰ñX‰ñQ‰ñJ‰ñC‰ñ<‰ñ5‰ñ.‰ñ'‰ñ ‰ñ‰ñ‰ñ ‰ñ‰ñýˆñöˆñïˆñèˆñáˆñÚˆñÓˆñ̈ñňñ¾ˆñ·ˆñ°ˆñ©ˆñ¢ˆñ›ˆñ”ˆñˆñ†ˆñˆñxˆñqˆñjˆñcˆñ\ˆñUˆñNˆñGˆñ@ˆñ9ˆñ2ˆñ+ˆñ$ˆñˆñˆñˆñˆñˆñú‡ñó‡ñì‡ñå‡ñÞ‡ñׇñЇñɇñ‡ñ»‡ñ´‡ñ­‡ñ¦‡ñŸ‡ñ˜‡ñ‘‡ñЇñƒ‡ñ|‡ñu‡ñn‡ñg‡ñ`‡ñY‡ñR‡ñK‡ñD‡ñ=‡ñ6‡ñ/‡ñ(‡ñ!‡ñ‡ñ‡ñ ‡ñ‡ñþ†ñ÷†ñð†ñé†ñâ†ñÛ†ñÔ†ñ͆ñƆñ¿†ñ¸†ñ±†ñª†ñ£†ñœ†ñ•†ñކñ‡†ñ€†ñy†ñr†ñk†ñd†ñ]†ñV†ñO†ñH†ñA†ñ:†ñ3†ñ,†ñ%†ñ†ñ†ñ†ñ †ñ†ñû…ñô…ñí…ñæ…ñß…ñØ…ñÑ…ñÊ…ñÃ…ñ¼…ñµ…ñ®…ñ§…ñ …ñ™…ñ’…ñ‹…ñ„…ñ}…ñv…ño…ñh…ña…ñZ…ñS…ñL…ñE…ñ>…ñ7…ñ0…ñ)…ñ"…ñ…ñ…ñ …ñ…ñÿ„ñø„ññ„ñê„ñã„ñÜ„ñÕ„ñ΄ñÇ„ñÀ„ñ¹„ñ²„ñ«„ñ¤„ñ„ñ–„ñ„ñˆ„ñ„ñz„ñs„ñl„ñe„ñ^„ñW„ñP„ñI„ñB„ñ;„ñ4„ñ-„ñ&„ñ„ñ„ñ„ñ „ñ„ñüƒñõƒñîƒñçƒñàƒñÙƒñÒƒñ˃ñăñ½ƒñ¶ƒñ¯ƒñ¨ƒñ¡ƒñšƒñ“ƒñŒƒñ…ƒñ~ƒñwƒñpƒñiƒñbƒñ[ƒñTƒñMƒñFƒñ?ƒñ8ƒñ1ƒñ*ƒñ#ƒñƒñƒñƒñƒñƒñù‚ñò‚ñë‚ñä‚ñÝ‚ñÖ‚ñÏ‚ñÈ‚ñÁ‚ñº‚ñ³‚ñ¬‚ñ¥‚ñž‚ñ—‚ñ‚ñ‰‚ñ‚‚ñ{‚ñt‚ñm‚ñf‚ñ_‚ñX‚ñQ‚ñJ‚ñC‚ñ<‚ñ5‚ñ.‚ñ'‚ñ ‚ñ‚ñ‚ñ ‚ñ‚ñýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññú€ñó€ñì€ñå€ñÞ€ñ×€ñЀñÉ€ñ€ñ»€ñ´€ñ­€ñ¦€ñŸ€ñ˜€ñ‘€ñŠ€ñƒ€ñ|€ñu€ñn€ñg€ñ`€ñY€ñR€ñK€ñD€ñ=€ñ6€ñ/€ñ(€ñ!€ñ€ñ€ñ €ñ€ñþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññû~ñô~ñí~ñæ~ñß~ñØ~ñÑ~ñÊ~ñÃ~ñ¼~ñµ~ñ®~ñ§~ñ ~ñ™~ñ’~ñ‹~ñ„~ñ}~ñv~ño~ñh~ña~ñZ~ñS~ñL~ñE~ñ>~ñ7~ñ0~ñ)~ñ"~ñ~ñ~ñ ~ñ~ñÿ}ñø}ññ}ñê}ñã}ñÜ}ñÕ}ñÎ}ñÇ}ñÀ}ñ¹}ñ²}ñ«}ñ¤}ñ}ñ–}ñ}ñˆ}ñ}ñz}ñs}ñl}ñe}ñ^}ñW}ñP}ñI}ñB}ñ;}ñ4}ñ-}ñ&}ñ}ñ}ñ}ñ }ñ}ñü|ñõ|ñî|ñç|ñà|ñÙ|ñÒ|ñË|ñÄ|ñ½|ñ¶|ñ¯|ñ¨|ñ¡|ñš|ñ“|ñŒ|ñ…|ñ~|ñw|ñp|ñi|ñb|ñ[|ñT|ñM|ñF|ñ?|ñ8|ñ1|ñ*|ñ#|ñ|ñ|ñ|ñ|ñ|ñù{ñò{ñë{ñä{ñÝ{ñÖ{ñÏ{ñÈ{ñÁ{ñº{ñ³{ñ¬{ñ¥{ñž{ñ—{ñ{ñ‰{ñ‚{ñ{{ñt{ñm{ñf{ñ_{ñX{ñQ{ñJ{ñC{ñ<{ñ5{ñ.{ñ'{ñ {ñ{ñ{ñ {ñ{ñýzñözñïzñèzñázñÚzñÓzñÌzñÅzñ¾zñ·zñ°zñ©zñ¢zñ›zñ”zñzñ†zñzñxzñqzñjzñczñ\zñUzñNzñGzñ@zñ9zñ2zñ+zñ$zñzñzñzñzñzñúyñóyñìyñåyñÞyñ×yñÐyñÉyñÂyñ»yñ´yñ­yñ¦yñŸyñ˜yñ‘yñŠyñƒyñ|yñuyñnyñgyñ`yñYyñRyñKyñDyñ=yñ6yñ/yñ(yñ!yñyñyñ yñyñþxñ÷xñðxñéxñâxñÛxñÔxñÍxñÆxñ¿xñ¸xñ±xñªxñ£xñœxñ•xñŽxñ‡xñ€xñyxñrxñkxñdxñ]xñVxñOxñHxñAxñ:xñ3xñ,xñ%xñxñxñxñ xñxñûwñôwñíwñæwñßwñØwñÑwñÊwñÃwñ¼wñµwñ®wñ§wñ wñ™wñ’wñ‹wñ„wñ}wñvwñowñhwñawñZwñSwñLwñEwñ>wñ7wñ0wñ)wñ"wñwñwñ wñwñÿvñøvññvñêvñãvñÜvñÕvñÎvñÇvñÀvñ¹vñ²vñ«vñ¤vñvñ–vñvñˆvñvñzvñsvñlvñevñ^vñWvñPvñIvñBvñ;vñ4vñ-vñ&vñvñvñvñ vñvñüuñõuñîuñçuñàuñÙuñÒuñËuñÄuñ½uñ¶uñ¯uñ¨uñ¡uñšuñ“uñŒuñ…uñ~uñwuñpuñiuñbuñ[uñTuñMuñFuñ?uñ8uñ1uñ*uñ#uñuñuñuñuñuñùtñòtñëtñätñÝtñÖtñÏtñÈtñÁtñºtñ³tñ¬tñ¥tñžtñ—tñtñ‰tñ‚tñ{tñttñmtñftñ_tñXtñQtñJtñCtñpñ7pñ0pñ)pñ"pñpñpñ pñpñÿoñøoññoñêoñãoñÜoñÕoñÎoñÇoñÀoñ¹oñ²oñ«oñ¤oñoñ–oñoñˆoñoñzoñsoñloñeoñ^oñWoñPoñIoñBoñ;oñ4oñ-oñ&oñoñoñoñ oñoñünñõnñînñçnñànñÙnñÒnñËnñÄnñ½nñ¶nñ¯nñ¨nñ¡nñšnñ“nñŒnñ…nñ~nñwnñpnñinñbnñ[nñTnñMnñFnñ?nñ8nñ1nñ*nñ#nñnñnñnñnñnñùmñòmñëmñämñÝmñÖmñÏmñÈmñÁmñºmñ³mñ¬mñ¥mñžmñ—mñmñ‰mñ‚mñ{mñtmñmmñfmñ_mñXmñQmñJmñCmñiñ7iñ0iñ)iñ"iñiñiñ iñiñÿhñøhññhñêhñãhñÜhñÕhñÎhñÇhñÀhñ¹hñ²hñ«hñ¤hñhñ–hñhñˆhñhñzhñshñlhñehñ^hñWhñPhñIhñBhñ;hñ4hñ-hñ&hñhñhñhñ hñhñügñõgñîgñçgñàgñÙgñÒgñËgñÄgñ½gñ¶gñ¯gñ¨gñ¡gñšgñ“gñŒgñ…gñ~gñwgñpgñigñbgñ[gñTgñMgñFgñ?gñ8gñ1gñ*gñ#gñgñgñgñgñgñùfñòfñëfñäfñÝfñÖfñÏfñÈfñÁfñºfñ³fñ¬fñ¥fñžfñ—fñfñ‰fñ‚fñ{fñtfñmfñffñ_fñXfñQfñJfñCfñbñ7bñ0bñ)bñ"bñbñbñ bñbñÿañøaññañêañãañÜañÕañÎañÇañÀañ¹añ²añ«añ¤añañ–añañˆañañzañsañlañeañ^añWañPañIañBañ;añ4añ-añ&añañañañ añañü`ñõ`ñî`ñç`ñà`ñÙ`ñÒ`ñË`ñÄ`ñ½`ñ¶`ñ¯`ñ¨`ñ¡`ñš`ñ“`ñŒ`ñ…`ñ~`ñw`ñp`ñi`ñb`ñ[`ñT`ñM`ñF`ñ?`ñ8`ñ1`ñ*`ñ#`ñ`ñ`ñ`ñ`ñ`ñù_ñò_ñë_ñä_ñÝ_ñÖ_ñÏ_ñÈ_ñÁ_ñº_ñ³_ñ¬_ñ¥_ñž_ñ—_ñ_ñ‰_ñ‚_ñ{_ñt_ñm_ñf_ñ__ñX_ñQ_ñJ_ñC_ñ<_ñ5_ñ._ñ'_ñ _ñ_ñ_ñ _ñ_ñý^ñö^ñï^ñè^ñá^ñÚ^ñÓ^ñÌ^ñÅ^ñ¾^ñ·^ñ°^ñ©^ñ¢^ñ›^ñ”^ñ^ñ†^ñ^ñx^ñq^ñj^ñc^ñ\^ñU^ñN^ñG^ñ@^ñ9^ñ2^ñ+^ñ$^ñ^ñ^ñ^ñ^ñ^ñú]ñó]ñì]ñå]ñÞ]ñ×]ñÐ]ñÉ]ñÂ]ñ»]ñ´]ñ­]ñ¦]ñŸ]ñ˜]ñ‘]ñŠ]ñƒ]ñ|]ñu]ñn]ñg]ñ`]ñY]ñR]ñK]ñD]ñ=]ñ6]ñ/]ñ(]ñ!]ñ]ñ]ñ ]ñ]ñþ\ñ÷\ñð\ñé\ñâ\ñÛ\ñÔ\ñÍ\ñÆ\ñ¿\ñ¸\ñ±\ñª\ñ£\ñœ\ñ•\ñŽ\ñ‡\ñ€\ñy\ñr\ñk\ñd\ñ]\ñV\ñO\ñH\ñA\ñ:\ñ3\ñ,\ñ%\ñ\ñ\ñ\ñ \ñ\ñû[ñô[ñí[ñæ[ñß[ñØ[ñÑ[ñÊ[ñÃ[ñ¼[ñµ[ñ®[ñ§[ñ [ñ™[ñ’[ñ‹[ñ„[ñ}[ñv[ño[ñh[ña[ñZ[ñS[ñL[ñE[ñ>[ñ7[ñ0[ñ)[ñ"[ñ[ñ[ñ [ñ[ñÿZñøZññZñêZñãZñÜZñÕZñÎZñÇZñÀZñ¹Zñ²Zñ«Zñ¤ZñZñ–ZñZñˆZñZñzZñsZñlZñeZñ^ZñWZñPZñIZñBZñ;Zñ4Zñ-Zñ&ZñZñZñZñ ZñZñüYñõYñîYñçYñàYñÙYñÒYñËYñÄYñ½Yñ¶Yñ¯Yñ¨Yñ¡YñšYñ“YñŒYñ…Yñ~YñwYñpYñiYñbYñ[YñTYñMYñFYñ?Yñ8Yñ1Yñ*Yñ#YñYñYñYñYñYñùXñòXñëXñäXñÝXñÖXñÏXñÈXñÁXñºXñ³Xñ¬Xñ¥XñžXñ—XñXñ‰Xñ‚Xñ{XñtXñmXñfXñ_XñXXñQXñJXñCXñTñ7Tñ0Tñ)Tñ"TñTñTñ TñTñÿSñøSññSñêSñãSñÜSñÕSñÎSñÇSñÀSñ¹Sñ²Sñ«Sñ¤SñSñ–SñSñˆSñSñzSñsSñlSñeSñ^SñWSñPSñISñBSñ;Sñ4Sñ-Sñ&SñSñSñSñ SñSñüRñõRñîRñçRñàRñÙRñÒRñËRñÄRñ½Rñ¶Rñ¯Rñ¨Rñ¡RñšRñ“RñŒRñ…Rñ~RñwRñpRñiRñbRñ[RñTRñMRñFRñ?Rñ8Rñ1Rñ*Rñ#RñRñRñRñRñRñùQñòQñëQñäQñÝQñÖQñÏQñÈQñÁQñºQñ³Qñ¬Qñ¥QñžQñ—QñQñ‰Qñ‚Qñ{QñtQñmQñfQñ_QñXQñQQñJQñCQñMñ7Mñ0Mñ)Mñ"MñMñMñ MñMñÿLñøLññLñêLñãLñÜLñÕLñÎLñÇLñÀLñ¹Lñ²Lñ«Lñ¤LñLñ–LñLñˆLñLñzLñsLñlLñeLñ^LñWLñPLñILñBLñ;Lñ4Lñ-Lñ&LñLñLñLñ LñLñüKñõKñîKñçKñàKñÙKñÒKñËKñÄKñ½Kñ¶Kñ¯Kñ¨Kñ¡KñšKñ“KñŒKñ…Kñ~KñwKñpKñiKñbKñ[KñTKñMKñFKñ?Kñ8Kñ1Kñ*Kñ#KñKñKñKñKñKñùJñòJñëJñäJñÝJñÖJñÏJñÈJñÁJñºJñ³Jñ¬Jñ¥JñžJñ—JñJñ‰Jñ‚Jñ{JñtJñmJñfJñ_JñXJñQJñJJñCJñFñ7Fñ0Fñ)Fñ"FñFñFñ FñFñÿEñøEññEñêEñãEñÜEñÕEñÎEñÇEñÀEñ¹Eñ²Eñ«Eñ¤EñEñ–EñEñˆEñEñzEñsEñlEñeEñ^EñWEñPEñIEñBEñ;Eñ4Eñ-Eñ&EñEñEñEñ EñEñüDñõDñîDñçDñàDñÙDñÒDñËDñÄDñ½Dñ¶Dñ¯Dñ¨Dñ¡DñšDñ“DñŒDñ…Dñ~DñwDñpDñiDñbDñ[DñTDñMDñFDñ?Dñ8Dñ1Dñ*Dñ#DñDñDñDñDñDñùCñòCñëCñäCñÝCñÖCñÏCñÈCñÁCñºCñ³Cñ¬Cñ¥CñžCñ—CñCñ‰Cñ‚Cñ{CñtCñmCñfCñ_CñXCñQCñJCñCCñ?ñ7?ñ0?ñ)?ñ"?ñ?ñ?ñ ?ñ?ñÿ>ñø>ññ>ñê>ñã>ñÜ>ñÕ>ñÎ>ñÇ>ñÀ>ñ¹>ñ²>ñ«>ñ¤>ñ>ñ–>ñ>ñˆ>ñ>ñz>ñs>ñl>ñe>ñ^>ñW>ñP>ñI>ñB>ñ;>ñ4>ñ->ñ&>ñ>ñ>ñ>ñ >ñ>ñü=ñõ=ñî=ñç=ñà=ñÙ=ñÒ=ñË=ñÄ=ñ½=ñ¶=ñ¯=ñ¨=ñ¡=ñš=ñ“=ñŒ=ñ…=ñ~=ñw=ñp=ñi=ñb=ñ[=ñT=ñM=ñF=ñ?=ñ8=ñ1=ñ*=ñ#=ñ=ñ=ñ=ñ=ñ=ñù<ñò<ñë<ñä<ñÝ<ñÖ<ñÏ<ñÈ<ñÁ<ñº<ñ³<ñ¬<ñ¥<ñž<ñ—<ñ<ñ‰<ñ‚<ñ{<ñt<ñm<ñf<ñ_<ñX<ñQ<ñJ<ñC<ñ<<ñ5<ñ.<ñ'<ñ <ñ<ñ<ñ <ñ<ñý;ñö;ñï;ñè;ñá;ñÚ;ñÓ;ñÌ;ñÅ;ñ¾;ñ·;ñ°;ñ©;ñ¢;ñ›;ñ”;ñ;ñ†;ñ;ñx;ñq;ñj;ñc;ñ\;ñU;ñN;ñG;ñ@;ñ9;ñ2;ñ+;ñ$;ñ;ñ;ñ;ñ;ñ;ñú:ñó:ñì:ñå:ñÞ:ñ×:ñÐ:ñÉ:ñÂ:ñ»:ñ´:ñ­:ñ¦:ñŸ:ñ˜:ñ‘:ñŠ:ñƒ:ñ|:ñu:ñn:ñg:ñ`:ñY:ñR:ñK:ñD:ñ=:ñ6:ñ/:ñ(:ñ!:ñ:ñ:ñ :ñ:ñþ9ñ÷9ñð9ñé9ñâ9ñÛ9ñÔ9ñÍ9ñÆ9ñ¿9ñ¸9ñ±9ñª9ñ£9ñœ9ñ•9ñŽ9ñ‡9ñ€9ñy9ñr9ñk9ñd9ñ]9ñV9ñO9ñH9ñA9ñ:9ñ39ñ,9ñ%9ñ9ñ9ñ9ñ 9ñ9ñû8ñô8ñí8ñæ8ñß8ñØ8ñÑ8ñÊ8ñÃ8ñ¼8ñµ8ñ®8ñ§8ñ 8ñ™8ñ’8ñ‹8ñ„8ñ}8ñv8ño8ñh8ña8ñZ8ñS8ñL8ñE8ñ>8ñ78ñ08ñ)8ñ"8ñ8ñ8ñ 8ñ8ñÿ7ñø7ññ7ñê7ñã7ñÜ7ñÕ7ñÎ7ñÇ7ñÀ7ñ¹7ñ²7ñ«7ñ¤7ñ7ñ–7ñ7ñˆ7ñ7ñz7ñs7ñl7ñe7ñ^7ñW7ñP7ñI7ñB7ñ;7ñ47ñ-7ñ&7ñ7ñ7ñ7ñ 7ñ7ñü6ñõ6ñî6ñç6ñà6ñÙ6ñÒ6ñË6ñÄ6ñ½6ñ¶6ñ¯6ñ¨6ñ¡6ñš6ñ“6ñŒ6ñ…6ñ~6ñw6ñp6ñi6ñb6ñ[6ñT6ñM6ñF6ñ?6ñ86ñ16ñ*6ñ#6ñ6ñ6ñ6ñ6ñ6ñù5ñò5ñë5ñä5ñÝ5ñÖ5ñÏ5ñÈ5ñÁ5ñº5ñ³5ñ¬5ñ¥5ñž5ñ—5ñ5ñ‰5ñ‚5ñ{5ñt5ñm5ñf5ñ_5ñX5ñQ5ñJ5ñC5ñ<5ñ55ñ.5ñ'5ñ 5ñ5ñ5ñ 5ñ5ñý4ñö4ñï4ñè4ñá4ñÚ4ñÓ4ñÌ4ñÅ4ñ¾4ñ·4ñ°4ñ©4ñ¢4ñ›4ñ”4ñ4ñ†4ñ4ñx4ñq4ñj4ñc4ñ\4ñU4ñN4ñG4ñ@4ñ94ñ24ñ+4ñ$4ñ4ñ4ñ4ñ4ñ4ñú3ñó3ñì3ñå3ñÞ3ñ×3ñÐ3ñÉ3ñÂ3ñ»3ñ´3ñ­3ñ¦3ñŸ3ñ˜3ñ‘3ñŠ3ñƒ3ñ|3ñu3ñn3ñg3ñ`3ñY3ñR3ñK3ñD3ñ=3ñ63ñ/3ñ(3ñ!3ñ3ñ3ñ 3ñ3ñþ2ñ÷2ñð2ñé2ñâ2ñÛ2ñÔ2ñÍ2ñÆ2ñ¿2ñ¸2ñ±2ñª2ñ£2ñœ2ñ•2ñŽ2ñ‡2ñ€2ñy2ñr2ñk2ñd2ñ]2ñV2ñO2ñH2ñA2ñ:2ñ32ñ,2ñ%2ñ2ñ2ñ2ñ 2ñ2ñû1ñô1ñí1ñæ1ñß1ñØ1ñÑ1ñÊ1ñÃ1ñ¼1ñµ1ñ®1ñ§1ñ 1ñ™1ñ’1ñ‹1ñ„1ñ}1ñv1ño1ñh1ña1ñZ1ñS1ñL1ñE1ñ>1ñ71ñ01ñ)1ñ"1ñ1ñ1ñ 1ñ1ñÿ0ñø0ññ0ñê0ñã0ñÜ0ñÕ0ñÎ0ñÇ0ñÀ0ñ¹0ñ²0ñ«0ñ¤0ñ0ñ–0ñ0ñˆ0ñ0ñz0ñs0ñl0ñe0ñ^0ñW0ñP0ñI0ñB0ñ;0ñ40ñ-0ñ&0ñ0ñ0ñ0ñ 0ñ0ñü/ñõ/ñî/ñç/ñà/ñÙ/ñÒ/ñË/ñÄ/ñ½/ñ¶/ñ¯/ñ¨/ñ¡/ñš/ñ“/ñŒ/ñ…/ñ~/ñw/ñp/ñi/ñb/ñ[/ñT/ñM/ñF/ñ?/ñ8/ñ1/ñ*/ñ#/ñ/ñ/ñ/ñ/ñ/ñù.ñò.ñë.ñä.ñÝ.ñÖ.ñÏ.ñÈ.ñÁ.ñº.ñ³.ñ¬.ñ¥.ñž.ñ—.ñ.ñ‰.ñ‚.ñ{.ñt.ñm.ñf.ñ_.ñX.ñQ.ñJ.ñC.ñ<.ñ5.ñ..ñ'.ñ .ñ.ñ.ñ .ñ.ñý-ñö-ñï-ñè-ñá-ñÚ-ñÓ-ñÌ-ñÅ-ñ¾-ñ·-ñ°-ñ©-ñ¢-ñ›-ñ”-ñ-ñ†-ñ-ñx-ñq-ñj-ñc-ñ\-ñU-ñN-ñG-ñ@-ñ9-ñ2-ñ+-ñ$-ñ-ñ-ñ-ñ-ñ-ñú,ñó,ñì,ñå,ñÞ,ñ×,ñÐ,ñÉ,ñÂ,ñ»,ñ´,ñ­,ñ¦,ñŸ,ñ˜,ñ‘,ñŠ,ñƒ,ñ|,ñu,ñn,ñg,ñ`,ñY,ñR,ñK,ñD,ñ=,ñ6,ñ/,ñ(,ñ!,ñ,ñ,ñ ,ñ,ñþ+ñ÷+ñð+ñé+ñâ+ñÛ+ñÔ+ñÍ+ñÆ+ñ¿+ñ¸+ñ±+ñª+ñ£+ñœ+ñ•+ñŽ+ñ‡+ñ€+ñy+ñr+ñk+ñd+ñ]+ñV+ñO+ñH+ñA+ñ:+ñ3+ñ,+ñ%+ñ+ñ+ñ+ñ +ñ+ñû*ñô*ñí*ñæ*ñß*ñØ*ñÑ*ñÊ*ñÃ*ñ¼*ñµ*ñ®*ñ§*ñ *ñ™*ñ’*ñ‹*ñ„*ñ}*ñv*ño*ñh*ña*ñZ*ñS*ñL*ñE*ñ>*ñ7*ñ0*ñ)*ñ"*ñ*ñ*ñ *ñ*ñÿ)ñø)ññ)ñê)ñã)ñÜ)ñÕ)ñÎ)ñÇ)ñÀ)ñ¹)ñ²)ñ«)ñ¤)ñ)ñ–)ñ)ñˆ)ñ)ñz)ñs)ñl)ñe)ñ^)ñW)ñP)ñI)ñB)ñ;)ñ4)ñ-)ñ&)ñ)ñ)ñ)ñ )ñ)ñü(ñõ(ñî(ñç(ñà(ñÙ(ñÒ(ñË(ñÄ(ñ½(ñ¶(ñ¯(ñ¨(ñ¡(ñš(ñ“(ñŒ(ñ…(ñ~(ñw(ñp(ñi(ñb(ñ[(ñT(ñM(ñF(ñ?(ñ8(ñ1(ñ*(ñ#(ñ(ñ(ñ(ñ(ñ(ñù'ñò'ñë'ñä'ñÝ'ñÖ'ñÏ'ñÈ'ñÁ'ñº'ñ³'ñ¬'ñ¥'ñž'ñ—'ñ'ñ‰'ñ‚'ñ{'ñt'ñm'ñf'ñ_'ñX'ñQ'ñJ'ñC'ñ<'ñ5'ñ.'ñ''ñ 'ñ'ñ'ñ 'ñ'ñý&ñö&ñï&ñè&ñá&ñÚ&ñÓ&ñÌ&ñÅ&ñ¾&ñ·&ñ°&ñ©&ñ¢&ñ›&ñ”&ñ&ñ†&ñ&ñx&ñq&ñj&ñc&ñ\&ñU&ñN&ñG&ñ@&ñ9&ñ2&ñ+&ñ$&ñ&ñ&ñ&ñ&ñ&ñú%ñó%ñì%ñå%ñÞ%ñ×%ñÐ%ñÉ%ñÂ%ñ»%ñ´%ñ­%ñ¦%ñŸ%ñ˜%ñ‘%ñŠ%ñƒ%ñ|%ñu%ñn%ñg%ñ`%ñY%ñR%ñK%ñD%ñ=%ñ6%ñ/%ñ(%ñ!%ñ%ñ%ñ %ñ%ñþ$ñ÷$ñð$ñé$ñâ$ñÛ$ñÔ$ñÍ$ñÆ$ñ¿$ñ¸$ñ±$ñª$ñ£$ñœ$ñ•$ñŽ$ñ‡$ñ€$ñy$ñr$ñk$ñd$ñ]$ñV$ñO$ñH$ñA$ñ:$ñ3$ñ,$ñ%$ñ$ñ$ñ$ñ $ñ$ñû#ñô#ñí#ñæ#ñß#ñØ#ñÑ#ñÊ#ñÃ#ñ¼#ñµ#ñ®#ñ§#ñ #ñ™#ñ’#ñ‹#ñ„#ñ}#ñv#ño#ñh#ña#ñZ#ñS#ñL#ñE#ñ>#ñ7#ñ0#ñ)#ñ"#ñ#ñ#ñ #ñ#ñÿ"ñø"ññ"ñê"ñã"ñÜ"ñÕ"ñÎ"ñÇ"ñÀ"ñ¹"ñ²"ñ«"ñ¤"ñ"ñ–"ñ"ñˆ"ñ"ñz"ñs"ñl"ñe"ñ^"ñW"ñP"ñI"ñB"ñ;"ñ4"ñ-"ñ&"ñ"ñ"ñ"ñ "ñ"ñü!ñõ!ñî!ñç!ñà!ñÙ!ñÒ!ñË!ñÄ!ñ½!ñ¶!ñ¯!ñ¨!ñ¡!ñš!ñ“!ñŒ!ñ…!ñ~!ñw!ñp!ñi!ñb!ñ[!ñT!ñM!ñF!ñ?!ñ8!ñ1!ñ*!ñ#!ñ!ñ!ñ!ñ!ñ!ñù ñò ñë ñä ñÝ ñÖ ñÏ ñÈ ñÁ ñº ñ³ ñ¬ ñ¥ ñž ñ— ñ ñ‰ ñ‚ ñ{ ñt ñm ñf ñ_ ñX ñQ ñJ ñC ñ< ñ5 ñ. ñ' ñ ñ ñ ñ ñ ñýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿ ñø ññ ñê ñã ñÜ ñÕ ñÎ ñÇ ñÀ ñ¹ ñ² ñ« ñ¤ ñ ñ– ñ ñˆ ñ ñz ñs ñl ñe ñ^ ñW ñP ñI ñB ñ; ñ4 ñ- ñ& ñ ñ ñ ñ ñ ñü ñõ ñî ñç ñà ñÙ ñÒ ñË ñÄ ñ½ ñ¶ ñ¯ ñ¨ ñ¡ ñš ñ“ ñŒ ñ… ñ~ ñw ñp ñi ñb ñ[ ñT ñM ñF ñ? ñ8 ñ1 ñ* ñ# ñ ñ ñ ñ ñ ñù ñò ñë ñä ñÝ ñÖ ñÏ ñÈ ñÁ ñº ñ³ ñ¬ ñ¥ ñž ñ— ñ ñ‰ ñ‚ ñ{ ñt ñm ñf ñ_ ñX ñQ ñJ ñC ñ< ñ5 ñ. ñ' ñ ñ ñ ñ ñ ñý ñö ñï ñè ñá ñÚ ñÓ ñÌ ñÅ ñ¾ ñ· ñ° ñ© ñ¢ ñ› ñ” ñ ñ† ñ ñx ñq ñj ñc ñ\ ñU ñN ñG ñ@ ñ9 ñ2 ñ+ ñ$ ñ ñ ñ ñ ñ ñú ñó ñì ñå ñÞ ñ× ñÐ ñÉ ñ ñ» ñ´ ñ­ ñ¦ ñŸ ñ˜ ñ‘ ñŠ ñƒ ñ| ñu ñn ñg ñ` ñY ñR ñK ñD ñ= ñ6 ñ/ ñ( ñ! ñ ñ ñ ñ ñþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿÿðøÿðñÿðêÿðãÿðÜÿðÕÿðÎÿðÇÿðÀÿð¹ÿð²ÿð«ÿð¤ÿðÿð–ÿðÿðˆÿðÿðzÿðsÿðlÿðeÿð^ÿðWÿðPÿðIÿðBÿð;ÿð4ÿð-ÿð&ÿðÿðÿðÿð ÿðÿðüþðõþðîþðçþðàþðÙþðÒþðËþðÄþð½þð¶þð¯þð¨þð¡þðšþð“þðŒþð…þð~þðwþðpþðiþðbþð[þðTþðMþðFþð?þð8þð1þð*þð#þðþðþðþðþðþðùýðòýðëýðäýðÝýðÖýðÏýðÈýðÁýðºýð³ýð¬ýð¥ýðžýð—ýðýð‰ýð‚ýð{ýðtýðmýðfýð_ýðXýðQýðJýðCýð<ýð5ýð.ýð'ýð ýðýðýð ýðýðýüðöüðïüðèüðáüðÚüðÓüðÌüðÅüð¾üð·üð°üð©üð¢üð›üð”üðüð†üðüðxüðqüðjüðcüð\üðUüðNüðGüð@üð9üð2üð+üð$üðüðüðüðüðüðúûðóûðìûðåûðÞûð×ûðÐûðÉûðÂûð»ûð´ûð­ûð¦ûðŸûð˜ûð‘ûðŠûðƒûð|ûðuûðnûðgûð`ûðYûðRûðKûðDûð=ûð6ûð/ûð(ûð!ûðûðûð ûðûðþúð÷úððúðéúðâúðÛúðÔúðÍúðÆúð¿úð¸úð±úðªúð£úðœúð•úðŽúð‡úð€úðyúðrúðkúðdúð]úðVúðOúðHúðAúð:úð3úð,úð%úðúðúðúð úðúðûùðôùðíùðæùðßùðØùðÑùðÊùðÃùð¼ùðµùð®ùð§ùð ùð™ùð’ùð‹ùð„ùð}ùðvùðoùðhùðaùðZùðSùðLùðEùð>ùð7ùð0ùð)ùð"ùðùðùð ùðùðÿøðøøðñøðêøðãøðÜøðÕøðÎøðÇøðÀøð¹øð²øð«øð¤øðøð–øðøðˆøðøðzøðsøðløðeøð^øðWøðPøðIøðBøð;øð4øð-øð&øðøðøðøð øðøðü÷ðõ÷ðî÷ðç÷ðà÷ðÙ÷ðÒ÷ðË÷ðÄ÷ð½÷ð¶÷ð¯÷ð¨÷ð¡÷ðš÷ð“÷ðŒ÷ð…÷ð~÷ðw÷ðp÷ði÷ðb÷ð[÷ðT÷ðM÷ðF÷ð?÷ð8÷ð1÷ð*÷ð#÷ð÷ð÷ð÷ð÷ð÷ðùöðòöðëöðäöðÝöðÖöðÏöðÈöðÁöðºöð³öð¬öð¥öðžöð—öðöð‰öð‚öð{öðtöðmöðföð_öðXöðQöðJöðCöð<öð5öð.öð'öð öðöðöð öðöðýõðöõðïõðèõðáõðÚõðÓõðÌõðÅõð¾õð·õð°õð©õð¢õð›õð”õðõð†õðõðxõðqõðjõðcõð\õðUõðNõðGõð@õð9õð2õð+õð$õðõðõðõðõðõðúôðóôðìôðåôðÞôð×ôðÐôðÉôðÂôð»ôð´ôð­ôð¦ôðŸôð˜ôð‘ôðŠôðƒôð|ôðuôðnôðgôð`ôðYôðRôðKôðDôð=ôð6ôð/ôð(ôð!ôðôðôð ôðôðþóð÷óððóðéóðâóðÛóðÔóðÍóðÆóð¿óð¸óð±óðªóð£óðœóð•óðŽóð‡óð€óðyóðróðkóðdóð]óðVóðOóðHóðAóð:óð3óð,óð%óðóðóðóð óðóðûòðôòðíòðæòðßòðØòðÑòðÊòðÃòð¼òðµòð®òð§òð òð™òð’òð‹òð„òð}òðvòðoòðhòðaòðZòðSòðLòðEòð>òð7òð0òð)òð"òðòðòð òðòðÿñðøñðññðêñðãñðÜñðÕñðÎñðÇñðÀñð¹ñð²ñð«ñð¤ñðñð–ñðñðˆñðñðzñðsñðlñðeñð^ñðWñðPñðIñðBñð;ñð4ñð-ñð&ñðñðñðñð ñðñðüððõððîððçððàððÙððÒððËððÄðð½ðð¶ðð¯ðð¨ðð¡ððšðð“ððŒðð…ðð~ððwððpððiððbðð[ððTððMððFðð?ðð8ðð1ðð*ðð#ððððððððððððùïðòïðëïðäïðÝïðÖïðÏïðÈïðÁïðºïð³ïð¬ïð¥ïðžïð—ïðïð‰ïð‚ïð{ïðtïðmïðfïð_ïðXïðQïðJïðCïð<ïð5ïð.ïð'ïð ïðïðïð ïðïðýîðöîðïîðèîðáîðÚîðÓîðÌîðÅîð¾îð·îð°îð©îð¢îð›îð”îðîð†îðîðxîðqîðjîðcîð\îðUîðNîðGîð@îð9îð2îð+îð$îðîðîðîðîðîðúíðóíðìíðåíðÞíð×íðÐíðÉíðÂíð»íð´íð­íð¦íðŸíð˜íð‘íðŠíðƒíð|íðuíðníðgíð`íðYíðRíðKíðDíð=íð6íð/íð(íð!íðíðíð íðíðþìð÷ìððìðéìðâìðÛìðÔìðÍìðÆìð¿ìð¸ìð±ìðªìð£ìðœìð•ìðŽìð‡ìð€ìðyìðrìðkìðdìð]ìðVìðOìðHìðAìð:ìð3ìð,ìð%ìðìðìðìð ìðìðûëðôëðíëðæëðßëðØëðÑëðÊëðÃëð¼ëðµëð®ëð§ëð ëð™ëð’ëð‹ëð„ëð}ëðvëðoëðhëðaëðZëðSëðLëðEëð>ëð7ëð0ëð)ëð"ëðëðëð ëðëðÿêðøêðñêðêêðãêðÜêðÕêðÎêðÇêðÀêð¹êð²êð«êð¤êðêð–êðêðˆêðêðzêðsêðlêðeêð^êðWêðPêðIêðBêð;êð4êð-êð&êðêðêðêð êðêðüéðõéðîéðçéðàéðÙéðÒéðËéðÄéð½éð¶éð¯éð¨éð¡éðšéð“éðŒéð…éð~éðwéðpéðiéðbéð[éðTéðMéðFéð?éð8éð1éð*éð#éðéðéðéðéðéðùèðòèðëèðäèðÝèðÖèðÏèðÈèðÁèðºèð³èð¬èð¥èðžèð—èðèð‰èð‚èð{èðtèðmèðfèð_èðXèðQèðJèðCèð<èð5èð.èð'èð èðèðèð èðèðýçðöçðïçðèçðáçðÚçðÓçðÌçðÅçð¾çð·çð°çð©çð¢çð›çð”çðçð†çðçðxçðqçðjçðcçð\çðUçðNçðGçð@çð9çð2çð+çð$çðçðçðçðçðçðúæðóæðìæðåæðÞæð׿ðÐæðÉæðÂæð»æð´æð­æð¦æðŸæð˜æð‘æðŠæðƒæð|æðuæðnæðgæð`æðYæðRæðKæðDæð=æð6æð/æð(æð!æðæðæð æðæðþåð÷åððåðéåðâåðÛåðÔåðÍåðÆåð¿åð¸åð±åðªåð£åðœåð•åðŽåð‡åð€åðyåðråðkåðdåð]åðVåðOåðHåðAåð:åð3åð,åð%åðåðåðåð åðåðûäðôäðíäðæäðßäðØäðÑäðÊäðÃäð¼äðµäð®äð§äð äð™äð’äð‹äð„äð}äðväðoäðhäðaäðZäðSäðLäðEäð>äð7äð0äð)äð"äðäðäð äðäðÿãðøãðñãðêãðããðÜãðÕãðÎãðÇãðÀãð¹ãð²ãð«ãð¤ãðãð–ãðãðˆãðãðzãðsãðlãðeãð^ãðWãðPãðIãðBãð;ãð4ãð-ãð&ãðãðãðãð ãðãðüâðõâðîâðçâðàâðÙâðÒâðËâðÄâð½âð¶âð¯âð¨âð¡âðšâð“âðŒâð…âð~âðwâðpâðiâðbâð[âðTâðMâðFâð?âð8âð1âð*âð#âðâðâðâðâðâðùáðòáðëáðäáðÝáðÖáðÏáðÈáðÁáðºáð³áð¬áð¥áðžáð—áðáð‰áð‚áð{áðtáðmáðfáð_áðXáðQáðJáðCáð<áð5áð.áð'áð áðáðáð áðáðýàðöàðïàðèàðáàðÚàðÓàðÌàðÅàð¾àð·àð°àð©àð¢àð›àð”àðàð†àðàðxàðqàðjàðcàð\àðUàðNàðGàð@àð9àð2àð+àð$àðàðàðàðàðàðúßðóßðìßðåßðÞßð×ßðÐßðÉßðÂßð»ßð´ßð­ßð¦ßðŸßð˜ßð‘ßðŠßðƒßð|ßðußðnßðgßð`ßðYßðRßðKßðDßð=ßð6ßð/ßð(ßð!ßðßðßð ßðßðþÞð÷ÞððÞðéÞðâÞðÛÞðÔÞðÍÞðÆÞð¿Þð¸Þð±ÞðªÞð£ÞðœÞð•ÞðŽÞð‡Þð€ÞðyÞðrÞðkÞðdÞð]ÞðVÞðOÞðHÞðAÞð:Þð3Þð,Þð%ÞðÞðÞðÞð ÞðÞðûÝðôÝðíÝðæÝðßÝðØÝðÑÝðÊÝðÃÝð¼ÝðµÝð®Ýð§Ýð Ýð™Ýð’Ýð‹Ýð„Ýð}ÝðvÝðoÝðhÝðaÝðZÝðSÝðLÝðEÝð>Ýð7Ýð0Ýð)Ýð"ÝðÝðÝð ÝðÝðÿÜðøÜðñÜðêÜðãÜðÜÜðÕÜðÎÜðÇÜðÀÜð¹Üð²Üð«Üð¤ÜðÜð–ÜðÜðˆÜðÜðzÜðsÜðlÜðeÜð^ÜðWÜðPÜðIÜðBÜð;Üð4Üð-Üð&ÜðÜðÜðÜð ÜðÜðüÛðõÛðîÛðçÛðàÛðÙÛðÒÛðËÛðÄÛð½Ûð¶Ûð¯Ûð¨Ûð¡ÛðšÛð“ÛðŒÛð…Ûð~ÛðwÛðpÛðiÛðbÛð[ÛðTÛðMÛðFÛð?Ûð8Ûð1Ûð*Ûð#ÛðÛðÛðÛðÛðÛðùÚðòÚðëÚðäÚðÝÚðÖÚðÏÚðÈÚðÁÚðºÚð³Úð¬Úð¥ÚðžÚð—ÚðÚð‰Úð‚Úð{ÚðtÚðmÚðfÚð_ÚðXÚðQÚðJÚðCÚð<Úð5Úð.Úð'Úð ÚðÚðÚð ÚðÚðýÙðöÙðïÙðèÙðáÙðÚÙðÓÙðÌÙðÅÙð¾Ùð·Ùð°Ùð©Ùð¢Ùð›Ùð”ÙðÙð†ÙðÙðxÙðqÙðjÙðcÙð\ÙðUÙðNÙðGÙð@Ùð9Ùð2Ùð+Ùð$ÙðÙðÙðÙðÙðÙðúØðóØðìØðåØðÞØðרðÐØðÉØðÂØð»Øð´Øð­Øð¦ØðŸØð˜Øð‘ØðŠØðƒØð|ØðuØðnØðgØð`ØðYØðRØðKØðDØð=Øð6Øð/Øð(Øð!ØðØðØð ØðØðþ×ð÷×ðð×ðé×ðâ×ðÛ×ðÔ×ðÍ×ðÆ×ð¿×ð¸×ð±×ðª×ð£×ðœ×ð•×ðŽ×ð‡×ð€×ðy×ðr×ðk×ðd×ð]×ðV×ðO×ðH×ðA×ð:×ð3×ð,×ð%×ð×ð×ð×ð ×ð×ðûÖðôÖðíÖðæÖðßÖðØÖðÑÖðÊÖðÃÖð¼ÖðµÖð®Öð§Öð Öð™Öð’Öð‹Öð„Öð}ÖðvÖðoÖðhÖðaÖðZÖðSÖðLÖðEÖð>Öð7Öð0Öð)Öð"ÖðÖðÖð ÖðÖðÿÕðøÕðñÕðêÕðãÕðÜÕðÕÕðÎÕðÇÕðÀÕð¹Õð²Õð«Õð¤ÕðÕð–ÕðÕðˆÕðÕðzÕðsÕðlÕðeÕð^ÕðWÕðPÕðIÕðBÕð;Õð4Õð-Õð&ÕðÕðÕðÕð ÕðÕðüÔðõÔðîÔðçÔðàÔðÙÔðÒÔðËÔðÄÔð½Ôð¶Ôð¯Ôð¨Ôð¡ÔðšÔð“ÔðŒÔð…Ôð~ÔðwÔðpÔðiÔðbÔð[ÔðTÔðMÔðFÔð?Ôð8Ôð1Ôð*Ôð#ÔðÔðÔðÔðÔðÔðùÓðòÓðëÓðäÓðÝÓðÖÓðÏÓðÈÓðÁÓðºÓð³Óð¬Óð¥ÓðžÓð—ÓðÓð‰Óð‚Óð{ÓðtÓðmÓðfÓð_ÓðXÓðQÓðJÓðCÓð<Óð5Óð.Óð'Óð ÓðÓðÓð ÓðÓðýÒðöÒðïÒðèÒðáÒðÚÒðÓÒðÌÒðÅÒð¾Òð·Òð°Òð©Òð¢Òð›Òð”ÒðÒð†ÒðÒðxÒðqÒðjÒðcÒð\ÒðUÒðNÒðGÒð@Òð9Òð2Òð+Òð$ÒðÒðÒðÒðÒðÒðúÑðóÑðìÑðåÑðÞÑð×ÑðÐÑðÉÑðÂÑð»Ñð´Ñð­Ñð¦ÑðŸÑð˜Ñð‘ÑðŠÑðƒÑð|ÑðuÑðnÑðgÑð`ÑðYÑðRÑðKÑðDÑð=Ñð6Ñð/Ñð(Ñð!ÑðÑðÑð ÑðÑðþÐð÷ÐððÐðéÐðâÐðÛÐðÔÐðÍÐðÆÐð¿Ðð¸Ðð±ÐðªÐð£ÐðœÐð•ÐðŽÐð‡Ðð€ÐðyÐðrÐðkÐðdÐð]ÐðVÐðOÐðHÐðAÐð:Ðð3Ðð,Ðð%ÐðÐðÐðÐð ÐðÐðûÏðôÏðíÏðæÏðßÏðØÏðÑÏðÊÏðÃÏð¼ÏðµÏð®Ïð§Ïð Ïð™Ïð’Ïð‹Ïð„Ïð}ÏðvÏðoÏðhÏðaÏðZÏðSÏðLÏðEÏð>Ïð7Ïð0Ïð)Ïð"ÏðÏðÏð ÏðÏðÿÎðøÎðñÎðêÎðãÎðÜÎðÕÎðÎÎðÇÎðÀÎð¹Îð²Îð«Îð¤ÎðÎð–ÎðÎðˆÎðÎðzÎðsÎðlÎðeÎð^ÎðWÎðPÎðIÎðBÎð;Îð4Îð-Îð&ÎðÎðÎðÎð ÎðÎðüÍðõÍðîÍðçÍðàÍðÙÍðÒÍðËÍðÄÍð½Íð¶Íð¯Íð¨Íð¡ÍðšÍð“ÍðŒÍð…Íð~ÍðwÍðpÍðiÍðbÍð[ÍðTÍðMÍðFÍð?Íð8Íð1Íð*Íð#ÍðÍðÍðÍðÍðÍðùÌðòÌðëÌðäÌðÝÌðÖÌðÏÌðÈÌðÁÌðºÌð³Ìð¬Ìð¥ÌðžÌð—ÌðÌð‰Ìð‚Ìð{ÌðtÌðmÌðfÌð_ÌðXÌðQÌðJÌðCÌð<Ìð5Ìð.Ìð'Ìð ÌðÌðÌð ÌðÌðýËðöËðïËðèËðáËðÚËðÓËðÌËðÅËð¾Ëð·Ëð°Ëð©Ëð¢Ëð›Ëð”ËðËð†ËðËðxËðqËðjËðcËð\ËðUËðNËðGËð@Ëð9Ëð2Ëð+Ëð$ËðËðËðËðËðËðúÊðóÊðìÊðåÊðÞÊð×ÊðÐÊðÉÊðÂÊð»Êð´Êð­Êð¦ÊðŸÊð˜Êð‘ÊðŠÊðƒÊð|ÊðuÊðnÊðgÊð`ÊðYÊðRÊðKÊðDÊð=Êð6Êð/Êð(Êð!ÊðÊðÊð ÊðÊðþÉð÷ÉððÉðéÉðâÉðÛÉðÔÉðÍÉðÆÉð¿Éð¸Éð±ÉðªÉð£ÉðœÉð•ÉðŽÉð‡Éð€ÉðyÉðrÉðkÉðdÉð]ÉðVÉðOÉðHÉðAÉð:Éð3Éð,Éð%ÉðÉðÉðÉð ÉðÉðûÈðôÈðíÈðæÈðßÈðØÈðÑÈðÊÈðÃÈð¼ÈðµÈð®Èð§Èð Èð™Èð’Èð‹Èð„Èð}ÈðvÈðoÈðhÈðaÈðZÈðSÈðLÈðEÈð>Èð7Èð0Èð)Èð"ÈðÈðÈð ÈðÈðÿÇðøÇðñÇðêÇðãÇðÜÇðÕÇðÎÇðÇÇðÀÇð¹Çð²Çð«Çð¤ÇðÇð–ÇðÇðˆÇðÇðzÇðsÇðlÇðeÇð^ÇðWÇðPÇðIÇðBÇð;Çð4Çð-Çð&ÇðÇðÇðÇð ÇðÇðüÆðõÆðîÆðçÆðàÆðÙÆðÒÆðËÆðÄÆð½Æð¶Æð¯Æð¨Æð¡ÆðšÆð“ÆðŒÆð…Æð~ÆðwÆðpÆðiÆðbÆð[ÆðTÆðMÆðFÆð?Æð8Æð1Æð*Æð#ÆðÆðÆðÆðÆðÆðùÅðòÅðëÅðäÅðÝÅðÖÅðÏÅðÈÅðÁÅðºÅð³Åð¬Åð¥ÅðžÅð—ÅðÅð‰Åð‚Åð{ÅðtÅðmÅðfÅð_ÅðXÅðQÅðJÅðCÅð<Åð5Åð.Åð'Åð ÅðÅðÅð ÅðÅðýÄðöÄðïÄðèÄðáÄðÚÄðÓÄðÌÄðÅÄð¾Äð·Äð°Äð©Äð¢Äð›Äð”ÄðÄð†ÄðÄðxÄðqÄðjÄðcÄð\ÄðUÄðNÄðGÄð@Äð9Äð2Äð+Äð$ÄðÄðÄðÄðÄðÄðúÃðóÃðìÃðåÃðÞÃð×ÃðÐÃðÉÃðÂÃð»Ãð´Ãð­Ãð¦ÃðŸÃð˜Ãð‘ÃðŠÃðƒÃð|ÃðuÃðnÃðgÃð`ÃðYÃðRÃðKÃðDÃð=Ãð6Ãð/Ãð(Ãð!ÃðÃðÃð ÃðÃðþÂð÷ÂððÂðéÂðâÂðÛÂðÔÂðÍÂðÆÂð¿Âð¸Âð±ÂðªÂð£ÂðœÂð•ÂðŽÂð‡Âð€ÂðyÂðrÂðkÂðdÂð]ÂðVÂðOÂðHÂðAÂð:Âð3Âð,Âð%ÂðÂðÂðÂð ÂðÂðûÁðôÁðíÁðæÁðßÁðØÁðÑÁðÊÁðÃÁð¼ÁðµÁð®Áð§Áð Áð™Áð’Áð‹Áð„Áð}ÁðvÁðoÁðhÁðaÁðZÁðSÁðLÁðEÁð>Áð7Áð0Áð)Áð"ÁðÁðÁð ÁðÁðÿÀðøÀðñÀðêÀðãÀðÜÀðÕÀðÎÀðÇÀðÀÀð¹Àð²Àð«Àð¤ÀðÀð–ÀðÀðˆÀðÀðzÀðsÀðlÀðeÀð^ÀðWÀðPÀðIÀðBÀð;Àð4Àð-Àð&ÀðÀðÀðÀð ÀðÀðü¿ðõ¿ðî¿ðç¿ðà¿ðÙ¿ðÒ¿ðË¿ðÄ¿ð½¿ð¶¿ð¯¿ð¨¿ð¡¿ðš¿ð“¿ðŒ¿ð…¿ð~¿ðw¿ðp¿ði¿ðb¿ð[¿ðT¿ðM¿ðF¿ð?¿ð8¿ð1¿ð*¿ð#¿ð¿ð¿ð¿ð¿ð¿ðù¾ðò¾ðë¾ðä¾ðݾðÖ¾ðϾðȾðÁ¾ðº¾ð³¾ð¬¾ð¥¾ðž¾ð—¾ð¾ð‰¾ð‚¾ð{¾ðt¾ðm¾ðf¾ð_¾ðX¾ðQ¾ðJ¾ðC¾ð<¾ð5¾ð.¾ð'¾ð ¾ð¾ð¾ð ¾ð¾ðý½ðö½ðï½ðè½ðá½ðÚ½ðÓ½ð̽ðŽð¾½ð·½ð°½ð©½ð¢½ð›½ð”½ð½ð†½ð½ðx½ðq½ðj½ðc½ð\½ðU½ðN½ðG½ð@½ð9½ð2½ð+½ð$½ð½ð½ð½ð½ð½ðú¼ðó¼ðì¼ðå¼ðÞ¼ð×¼ðмðɼð¼ð»¼ð´¼ð­¼ð¦¼ðŸ¼ð˜¼ð‘¼ðмðƒ¼ð|¼ðu¼ðn¼ðg¼ð`¼ðY¼ðR¼ðK¼ðD¼ð=¼ð6¼ð/¼ð(¼ð!¼ð¼ð¼ð ¼ð¼ðþ»ð÷»ðð»ðé»ðâ»ðÛ»ðÔ»ðÍ»ðÆ»ð¿»ð¸»ð±»ðª»ð£»ðœ»ð•»ðŽ»ð‡»ð€»ðy»ðr»ðk»ðd»ð]»ðV»ðO»ðH»ðA»ð:»ð3»ð,»ð%»ð»ð»ð»ð »ð»ðûºðôºðíºðæºðߺðغðѺðʺðúð¼ºðµºð®ºð§ºð ºð™ºð’ºð‹ºð„ºð}ºðvºðoºðhºðaºðZºðSºðLºðEºð>ºð7ºð0ºð)ºð"ºðºðºð ºðºðÿ¹ðø¹ðñ¹ðê¹ðã¹ðܹðÕ¹ðιðǹðÀ¹ð¹¹ð²¹ð«¹ð¤¹ð¹ð–¹ð¹ðˆ¹ð¹ðz¹ðs¹ðl¹ðe¹ð^¹ðW¹ðP¹ðI¹ðB¹ð;¹ð4¹ð-¹ð&¹ð¹ð¹ð¹ð ¹ð¹ðü¸ðõ¸ðî¸ðç¸ðà¸ðÙ¸ðÒ¸ð˸ðĸð½¸ð¶¸ð¯¸ð¨¸ð¡¸ðš¸ð“¸ðŒ¸ð…¸ð~¸ðw¸ðp¸ði¸ðb¸ð[¸ðT¸ðM¸ðF¸ð?¸ð8¸ð1¸ð*¸ð#¸ð¸ð¸ð¸ð¸ð¸ðù·ðò·ðë·ðä·ðÝ·ðÖ·ðÏ·ðÈ·ðÁ·ðº·ð³·ð¬·ð¥·ðž·ð—·ð·ð‰·ð‚·ð{·ðt·ðm·ðf·ð_·ðX·ðQ·ðJ·ðC·ð<·ð5·ð.·ð'·ð ·ð·ð·ð ·ð·ðý¶ðö¶ðï¶ðè¶ðá¶ðÚ¶ðÓ¶ð̶ðŶð¾¶ð·¶ð°¶ð©¶ð¢¶ð›¶ð”¶ð¶ð†¶ð¶ðx¶ðq¶ðj¶ðc¶ð\¶ðU¶ðN¶ðG¶ð@¶ð9¶ð2¶ð+¶ð$¶ð¶ð¶ð¶ð¶ð¶ðúµðóµðìµðåµðÞµð×µðеðɵðµð»µð´µð­µð¦µðŸµð˜µð‘µðеðƒµð|µðuµðnµðgµð`µðYµðRµðKµðDµð=µð6µð/µð(µð!µðµðµð µðµðþ´ð÷´ðð´ðé´ðâ´ðÛ´ðÔ´ðÍ´ðÆ´ð¿´ð¸´ð±´ðª´ð£´ðœ´ð•´ðŽ´ð‡´ð€´ðy´ðr´ðk´ðd´ð]´ðV´ðO´ðH´ðA´ð:´ð3´ð,´ð%´ð´ð´ð´ð ´ð´ðû³ðô³ðí³ðæ³ðß³ðسðѳðʳðóð¼³ðµ³ð®³ð§³ð ³ð™³ð’³ð‹³ð„³ð}³ðv³ðo³ðh³ða³ðZ³ðS³ðL³ðE³ð>³ð7³ð0³ð)³ð"³ð³ð³ð ³ð³ðÿ²ðø²ðñ²ðê²ðã²ðܲðÕ²ðβðDzðÀ²ð¹²ð²²ð«²ð¤²ð²ð–²ð²ðˆ²ð²ðz²ðs²ðl²ðe²ð^²ðW²ðP²ðI²ðB²ð;²ð4²ð-²ð&²ð²ð²ð²ð ²ð²ðü±ðõ±ðî±ðç±ðà±ðÙ±ðÒ±ð˱ðıð½±ð¶±ð¯±ð¨±ð¡±ðš±ð“±ðŒ±ð…±ð~±ðw±ðp±ði±ðb±ð[±ðT±ðM±ðF±ð?±ð8±ð1±ð*±ð#±ð±ð±ð±ð±ð±ðù°ðò°ðë°ðä°ðݰðÖ°ðϰðȰðÁ°ðº°ð³°ð¬°ð¥°ðž°ð—°ð°ð‰°ð‚°ð{°ðt°ðm°ðf°ð_°ðX°ðQ°ðJ°ðC°ð<°ð5°ð.°ð'°ð °ð°ð°ð °ð°ðý¯ðö¯ðï¯ðè¯ðá¯ðÚ¯ðÓ¯ð̯ðůð¾¯ð·¯ð°¯ð©¯ð¢¯ð›¯ð”¯ð¯ð†¯ð¯ðx¯ðq¯ðj¯ðc¯ð\¯ðU¯ðN¯ðG¯ð@¯ð9¯ð2¯ð+¯ð$¯ð¯ð¯ð¯ð¯ð¯ðú®ðó®ðì®ðå®ðÞ®ð×®ðЮðÉ®ð®ð»®ð´®ð­®ð¦®ðŸ®ð˜®ð‘®ðŠ®ðƒ®ð|®ðu®ðn®ðg®ð`®ðY®ðR®ðK®ðD®ð=®ð6®ð/®ð(®ð!®ð®ð®ð ®ð®ðþ­ð÷­ðð­ðé­ðâ­ðÛ­ðÔ­ðÍ­ðÆ­ð¿­ð¸­ð±­ðª­ð£­ðœ­ð•­ðŽ­ð‡­ð€­ðy­ðr­ðk­ðd­ð]­ðV­ðO­ðH­ðA­ð:­ð3­ð,­ð%­ð­ð­ð­ð ­ð­ðû¬ðô¬ðí¬ðæ¬ð߬ðجðѬðʬðìð¼¬ðµ¬ð®¬ð§¬ð ¬ð™¬ð’¬ð‹¬ð„¬ð}¬ðv¬ðo¬ðh¬ða¬ðZ¬ðS¬ðL¬ðE¬ð>¬ð7¬ð0¬ð)¬ð"¬ð¬ð¬ð ¬ð¬ðÿ«ðø«ðñ«ðê«ðã«ðÜ«ðÕ«ðΫðÇ«ðÀ«ð¹«ð²«ð««ð¤«ð«ð–«ð«ðˆ«ð«ðz«ðs«ðl«ðe«ð^«ðW«ðP«ðI«ðB«ð;«ð4«ð-«ð&«ð«ð«ð«ð «ð«ðüªðõªðîªðçªðàªðÙªðÒªð˪ðĪð½ªð¶ªð¯ªð¨ªð¡ªðšªð“ªðŒªð…ªð~ªðwªðpªðiªðbªð[ªðTªðMªðFªð?ªð8ªð1ªð*ªð#ªðªðªðªðªðªðù©ðò©ðë©ðä©ðÝ©ðÖ©ðÏ©ðÈ©ðÁ©ðº©ð³©ð¬©ð¥©ðž©ð—©ð©ð‰©ð‚©ð{©ðt©ðm©ðf©ð_©ðX©ðQ©ðJ©ðC©ð<©ð5©ð.©ð'©ð ©ð©ð©ð ©ð©ðý¨ðö¨ðï¨ðè¨ðá¨ðÚ¨ðÓ¨ð̨ðŨð¾¨ð·¨ð°¨ð©¨ð¢¨ð›¨ð”¨ð¨ð†¨ð¨ðx¨ðq¨ðj¨ðc¨ð\¨ðU¨ðN¨ðG¨ð@¨ð9¨ð2¨ð+¨ð$¨ð¨ð¨ð¨ð¨ð¨ðú§ðó§ðì§ðå§ðÞ§ð×§ðЧðɧð§ð»§ð´§ð­§ð¦§ðŸ§ð˜§ð‘§ðЧðƒ§ð|§ðu§ðn§ðg§ð`§ðY§ðR§ðK§ðD§ð=§ð6§ð/§ð(§ð!§ð§ð§ð §ð§ðþ¦ð÷¦ðð¦ðé¦ðâ¦ðÛ¦ðÔ¦ðͦðƦð¿¦ð¸¦ð±¦ðª¦ð£¦ðœ¦ð•¦ðަð‡¦ð€¦ðy¦ðr¦ðk¦ðd¦ð]¦ðV¦ðO¦ðH¦ðA¦ð:¦ð3¦ð,¦ð%¦ð¦ð¦ð¦ð ¦ð¦ðû¥ðô¥ðí¥ðæ¥ðߥðØ¥ðÑ¥ðÊ¥ðÃ¥ð¼¥ðµ¥ð®¥ð§¥ð ¥ð™¥ð’¥ð‹¥ð„¥ð}¥ðv¥ðo¥ðh¥ða¥ðZ¥ðS¥ðL¥ðE¥ð>¥ð7¥ð0¥ð)¥ð"¥ð¥ð¥ð ¥ð¥ðÿ¤ðø¤ðñ¤ðê¤ðã¤ðܤðÕ¤ðΤðǤðÀ¤ð¹¤ð²¤ð«¤ð¤¤ð¤ð–¤ð¤ðˆ¤ð¤ðz¤ðs¤ðl¤ðe¤ð^¤ðW¤ðP¤ðI¤ðB¤ð;¤ð4¤ð-¤ð&¤ð¤ð¤ð¤ð ¤ð¤ðü£ðõ£ðî£ðç£ðà£ðÙ£ðÒ£ðË£ðÄ£ð½£ð¶£ð¯£ð¨£ð¡£ðš£ð“£ðŒ£ð…£ð~£ðw£ðp£ði£ðb£ð[£ðT£ðM£ðF£ð?£ð8£ð1£ð*£ð#£ð£ð£ð£ð£ð£ðù¢ðò¢ðë¢ðä¢ðÝ¢ðÖ¢ðÏ¢ðÈ¢ðÁ¢ðº¢ð³¢ð¬¢ð¥¢ðž¢ð—¢ð¢ð‰¢ð‚¢ð{¢ðt¢ðm¢ðf¢ð_¢ðX¢ðQ¢ðJ¢ðC¢ð<¢ð5¢ð.¢ð'¢ð ¢ð¢ð¢ð ¢ð¢ðý¡ðö¡ðï¡ðè¡ðá¡ðÚ¡ðÓ¡ðÌ¡ðÅ¡ð¾¡ð·¡ð°¡ð©¡ð¢¡ð›¡ð”¡ð¡ð†¡ð¡ðx¡ðq¡ðj¡ðc¡ð\¡ðU¡ðN¡ðG¡ð@¡ð9¡ð2¡ð+¡ð$¡ð¡ð¡ð¡ð¡ð¡ðú ðó ðì ðå ðÞ ð× ðРðÉ ð ð» ð´ ð­ ð¦ ðŸ ð˜ ð‘ ðŠ ðƒ ð| ðu ðn ðg ð` ðY ðR ðK ðD ð= ð6 ð/ ð( ð! ð ð ð  ð ðþŸð÷ŸððŸðéŸðâŸðÛŸðÔŸðÍŸðÆŸð¿Ÿð¸Ÿð±ŸðªŸð£ŸðœŸð•ŸðŽŸð‡Ÿð€ŸðyŸðrŸðkŸðdŸð]ŸðVŸðOŸðHŸðAŸð:Ÿð3Ÿð,Ÿð%ŸðŸðŸðŸð ŸðŸðûžðôžðížðæžðßžðØžðÑžðÊžðÞð¼žðµžð®žð§žð žð™žð’žð‹žð„žð}žðvžðožðhžðažðZžðSžðLžðEžð>žð7žð0žð)žð"žðžðžð žðžðÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüœðõœðîœðçœðàœðÙœðÒœðËœðÄœð½œð¶œð¯œð¨œð¡œðšœð“œðŒœð…œð~œðwœðpœðiœðbœð[œðTœðMœðFœð?œð8œð1œð*œð#œðœðœðœðœðœðù›ðò›ðë›ðä›ðÝ›ðÖ›ðÏ›ðÈ›ðÁ›ðº›ð³›ð¬›ð¥›ðž›ð—›ð›ð‰›ð‚›ð{›ðt›ðm›ðf›ð_›ðX›ðQ›ðJ›ðC›ð<›ð5›ð.›ð'›ð ›ð›ð›ð ›ð›ðýšðöšðïšðèšðášðÚšðÓšðÌšðÅšð¾šð·šð°šð©šð¢šð›šð”šðšð†šðšðxšðqšðjšðcšð\šðUšðNšðGšð@šð9šð2šð+šð$šðšðšðšðšðšðú™ðó™ðì™ðå™ðÞ™ð×™ðЙðÉ™ð™ð»™ð´™ð­™ð¦™ðŸ™ð˜™ð‘™ðŠ™ðƒ™ð|™ðu™ðn™ðg™ð`™ðY™ðR™ðK™ðD™ð=™ð6™ð/™ð(™ð!™ð™ð™ð ™ð™ðþ˜ð÷˜ðð˜ðé˜ðâ˜ðÛ˜ðÔ˜ð͘ðƘð¿˜ð¸˜ð±˜ðª˜ð£˜ðœ˜ð•˜ðŽ˜ð‡˜ð€˜ðy˜ðr˜ðk˜ðd˜ð]˜ðV˜ðO˜ðH˜ðA˜ð:˜ð3˜ð,˜ð%˜ð˜ð˜ð˜ð ˜ð˜ðû—ðô—ðí—ðæ—ðß—ðØ—ðÑ—ðÊ—ð×ð¼—ðµ—ð®—ð§—ð —ð™—ð’—ð‹—ð„—ð}—ðv—ðo—ðh—ða—ðZ—ðS—ðL—ðE—ð>—ð7—ð0—ð)—ð"—ð—ð—ð —ð—ðÿ–ðø–ðñ–ðê–ðã–ðÜ–ðÕ–ðΖðÇ–ðÀ–ð¹–ð²–ð«–ð¤–ð–ð––ð–ðˆ–ð–ðz–ðs–ðl–ðe–ð^–ðW–ðP–ðI–ðB–ð;–ð4–ð-–ð&–ð–ð–ð–ð –ð–ðü•ðõ•ðî•ðç•ðà•ðÙ•ðÒ•ðË•ðÄ•ð½•ð¶•ð¯•ð¨•ð¡•ðš•ð“•ðŒ•ð…•ð~•ðw•ðp•ði•ðb•ð[•ðT•ðM•ðF•ð?•ð8•ð1•ð*•ð#•ð•ð•ð•ð•ð•ðù”ðò”ðë”ðä”ðÝ”ðÖ”ðÏ”ðÈ”ðÁ”ðº”ð³”ð¬”ð¥”ðž”ð—”ð”ð‰”ð‚”ð{”ðt”ðm”ðf”ð_”ðX”ðQ”ðJ”ðC”ð<”ð5”ð.”ð'”ð ”ð”ð”ð ”ð”ðý“ðö“ðï“ðè“ðá“ðÚ“ðÓ“ðÌ“ðÅ“ð¾“ð·“ð°“ð©“ð¢“ð›“ð”“ð“ð†“ð“ðx“ðq“ðj“ðc“ð\“ðU“ðN“ðG“ð@“ð9“ð2“ð+“ð$“ð“ð“ð“ð“ð“ðú’ðó’ðì’ðå’ðÞ’ð×’ðÐ’ðÉ’ðÂ’ð»’ð´’ð­’ð¦’ðŸ’ð˜’ð‘’ðŠ’ðƒ’ð|’ðu’ðn’ðg’ð`’ðY’ðR’ðK’ðD’ð=’ð6’ð/’ð(’ð!’ð’ð’ð ’ð’ðþ‘ð÷‘ðð‘ðé‘ðâ‘ðÛ‘ðÔ‘ðÍ‘ðÆ‘ð¿‘ð¸‘ð±‘ðª‘ð£‘ðœ‘ð•‘ðŽ‘ð‡‘ð€‘ðy‘ðr‘ðk‘ðd‘ð]‘ðV‘ðO‘ðH‘ðA‘ð:‘ð3‘ð,‘ð%‘ð‘ð‘ð‘ð ‘ð‘ðûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüŽðõŽðîŽðçŽðàŽðÙŽðÒŽðËŽðÄŽð½Žð¶Žð¯Žð¨Žð¡ŽðšŽð“ŽðŒŽð…Žð~ŽðwŽðpŽðiŽðbŽð[ŽðTŽðMŽðFŽð?Žð8Žð1Žð*Žð#ŽðŽðŽðŽðŽðŽðùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýŒðöŒðïŒðèŒðáŒðÚŒðÓŒðÌŒðÅŒð¾Œð·Œð°Œð©Œð¢Œð›Œð”ŒðŒð†ŒðŒðxŒðqŒðjŒðcŒð\ŒðUŒðNŒðGŒð@Œð9Œð2Œð+Œð$ŒðŒðŒðŒðŒðŒðú‹ðó‹ðì‹ðå‹ðÞ‹ð׋ðЋðÉ‹ð‹ð»‹ð´‹ð­‹ð¦‹ðŸ‹ð˜‹ð‘‹ðŠ‹ðƒ‹ð|‹ðu‹ðn‹ðg‹ð`‹ðY‹ðR‹ðK‹ðD‹ð=‹ð6‹ð/‹ð(‹ð!‹ð‹ð‹ð ‹ð‹ðþŠð÷ŠððŠðéŠðâŠðÛŠðÔŠðÍŠðÆŠð¿Šð¸Šð±ŠðªŠð£ŠðœŠð•ŠðŽŠð‡Šð€ŠðyŠðrŠðkŠðdŠð]ŠðVŠðOŠðHŠðAŠð:Šð3Šð,Šð%ŠðŠðŠðŠð ŠðŠðû‰ðô‰ðí‰ðæ‰ð߉ð؉ðщðʉðÉð¼‰ðµ‰ð®‰ð§‰ð ‰ð™‰ð’‰ð‹‰ð„‰ð}‰ðv‰ðo‰ðh‰ða‰ðZ‰ðS‰ðL‰ðE‰ð>‰ð7‰ð0‰ð)‰ð"‰ð‰ð‰ð ‰ð‰ðÿˆðøˆðñˆðêˆðãˆð܈ðÕˆðΈðLjðÀˆð¹ˆð²ˆð«ˆð¤ˆðˆð–ˆðˆðˆˆðˆðzˆðsˆðlˆðeˆð^ˆðWˆðPˆðIˆðBˆð;ˆð4ˆð-ˆð&ˆðˆðˆðˆð ˆðˆðü‡ðõ‡ðî‡ðç‡ðà‡ðÙ‡ðÒ‡ðˇðćð½‡ð¶‡ð¯‡ð¨‡ð¡‡ðš‡ð“‡ðŒ‡ð…‡ð~‡ðw‡ðp‡ði‡ðb‡ð[‡ðT‡ðM‡ðF‡ð?‡ð8‡ð1‡ð*‡ð#‡ð‡ð‡ð‡ð‡ð‡ðù†ðò†ðë†ðä†ð݆ðÖ†ðφðȆðÁ†ðº†ð³†ð¬†ð¥†ðž†ð—†ð†ð‰†ð‚†ð{†ðt†ðm†ðf†ð_†ðX†ðQ†ðJ†ðC†ð<†ð5†ð.†ð'†ð †ð†ð†ð †ð†ðý…ðö…ðï…ðè…ðá…ðÚ…ðÓ…ðÌ…ðÅ…ð¾…ð·…ð°…ð©…ð¢…ð›…ð”…ð…ð†…ð…ðx…ðq…ðj…ðc…ð\…ðU…ðN…ðG…ð@…ð9…ð2…ð+…ð$…ð…ð…ð…ð…ð…ðú„ðó„ðì„ðå„ðÞ„ðׄðЄðÉ„ð„ð»„ð´„ð­„ð¦„ðŸ„ð˜„ð‘„ðŠ„ðƒ„ð|„ðu„ðn„ðg„ð`„ðY„ðR„ðK„ðD„ð=„ð6„ð/„ð(„ð!„ð„ð„ð „ð„ðþƒð÷ƒððƒðéƒðâƒðÛƒðÔƒð̓ðƃð¿ƒð¸ƒð±ƒðªƒð£ƒðœƒð•ƒðŽƒð‡ƒð€ƒðyƒðrƒðkƒðdƒð]ƒðVƒðOƒðHƒðAƒð:ƒð3ƒð,ƒð%ƒðƒðƒðƒð ƒðƒðû‚ðô‚ðí‚ðæ‚ðß‚ðØ‚ðÑ‚ðÊ‚ðÂð¼‚ðµ‚ð®‚ð§‚ð ‚ð™‚ð’‚ð‹‚ð„‚ð}‚ðv‚ðo‚ðh‚ða‚ðZ‚ðS‚ðL‚ðE‚ð>‚ð7‚ð0‚ð)‚ð"‚ð‚ð‚ð ‚ð‚ðÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððü€ðõ€ðî€ðç€ðà€ðÙ€ðÒ€ðË€ðÄ€ð½€ð¶€ð¯€ð¨€ð¡€ðš€ð“€ðŒ€ð…€ð~€ðw€ðp€ði€ðb€ð[€ðT€ðM€ðF€ð?€ð8€ð1€ð*€ð#€ð€ð€ð€ð€ð€ðùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððý~ðö~ðï~ðè~ðá~ðÚ~ðÓ~ðÌ~ðÅ~ð¾~ð·~ð°~ð©~ð¢~ð›~ð”~ð~ð†~ð~ðx~ðq~ðj~ðc~ð\~ðU~ðN~ðG~ð@~ð9~ð2~ð+~ð$~ð~ð~ð~ð~ð~ðú}ðó}ðì}ðå}ðÞ}ð×}ðÐ}ðÉ}ðÂ}ð»}ð´}ð­}ð¦}ðŸ}ð˜}ð‘}ðŠ}ðƒ}ð|}ðu}ðn}ðg}ð`}ðY}ðR}ðK}ðD}ð=}ð6}ð/}ð(}ð!}ð}ð}ð }ð}ðþ|ð÷|ðð|ðé|ðâ|ðÛ|ðÔ|ðÍ|ðÆ|ð¿|ð¸|ð±|ðª|ð£|ðœ|ð•|ðŽ|ð‡|ð€|ðy|ðr|ðk|ðd|ð]|ðV|ðO|ðH|ðA|ð:|ð3|ð,|ð%|ð|ð|ð|ð |ð|ðû{ðô{ðí{ðæ{ðß{ðØ{ðÑ{ðÊ{ðÃ{ð¼{ðµ{ð®{ð§{ð {ð™{ð’{ð‹{ð„{ð}{ðv{ðo{ðh{ða{ðZ{ðS{ðL{ðE{ð>{ð7{ð0{ð){ð"{ð{ð{ð {ð{ðÿzðøzðñzðêzðãzðÜzðÕzðÎzðÇzðÀzð¹zð²zð«zð¤zðzð–zðzðˆzðzðzzðszðlzðezð^zðWzðPzðIzðBzð;zð4zð-zð&zðzðzðzð zðzðüyðõyðîyðçyðàyðÙyðÒyðËyðÄyð½yð¶yð¯yð¨yð¡yðšyð“yðŒyð…yð~yðwyðpyðiyðbyð[yðTyðMyðFyð?yð8yð1yð*yð#yðyðyðyðyðyðùxðòxðëxðäxðÝxðÖxðÏxðÈxðÁxðºxð³xð¬xð¥xðžxð—xðxð‰xð‚xð{xðtxðmxðfxð_xðXxðQxðJxðCxðtð7tð0tð)tð"tðtðtð tðtðÿsðøsðñsðêsðãsðÜsðÕsðÎsðÇsðÀsð¹sð²sð«sð¤sðsð–sðsðˆsðsðzsðssðlsðesð^sðWsðPsðIsðBsð;sð4sð-sð&sðsðsðsð sðsðürðõrðîrðçrðàrðÙrðÒrðËrðÄrð½rð¶rð¯rð¨rð¡rðšrð“rðŒrð…rð~rðwrðprðirðbrð[rðTrðMrðFrð?rð8rð1rð*rð#rðrðrðrðrðrðùqðòqðëqðäqðÝqðÖqðÏqðÈqðÁqðºqð³qð¬qð¥qðžqð—qðqð‰qð‚qð{qðtqðmqðfqð_qðXqðQqðJqðCqðmð7mð0mð)mð"mðmðmð mðmðÿlðølðñlðêlðãlðÜlðÕlðÎlðÇlðÀlð¹lð²lð«lð¤lðlð–lðlðˆlðlðzlðslðllðelð^lðWlðPlðIlðBlð;lð4lð-lð&lðlðlðlð lðlðükðõkðîkðçkðàkðÙkðÒkðËkðÄkð½kð¶kð¯kð¨kð¡kðškð“kðŒkð…kð~kðwkðpkðikðbkð[kðTkðMkðFkð?kð8kð1kð*kð#kðkðkðkðkðkðùjðòjðëjðäjðÝjðÖjðÏjðÈjðÁjðºjð³jð¬jð¥jðžjð—jðjð‰jð‚jð{jðtjðmjðfjð_jðXjðQjðJjðCjðfð7fð0fð)fð"fðfðfð fðfðÿeðøeðñeðêeðãeðÜeðÕeðÎeðÇeðÀeð¹eð²eð«eð¤eðeð–eðeðˆeðeðzeðseðleðeeð^eðWeðPeðIeðBeð;eð4eð-eð&eðeðeðeð eðeðüdðõdðîdðçdðàdðÙdðÒdðËdðÄdð½dð¶dð¯dð¨dð¡dðšdð“dðŒdð…dð~dðwdðpdðidðbdð[dðTdðMdðFdð?dð8dð1dð*dð#dðdðdðdðdðdðùcðòcðëcðäcðÝcðÖcðÏcðÈcðÁcðºcð³cð¬cð¥cðžcð—cðcð‰cð‚cð{cðtcðmcðfcð_cðXcðQcðJcðCcð_ð7_ð0_ð)_ð"_ð_ð_ð _ð_ðÿ^ðø^ðñ^ðê^ðã^ðÜ^ðÕ^ðÎ^ðÇ^ðÀ^ð¹^ð²^ð«^ð¤^ð^ð–^ð^ðˆ^ð^ðz^ðs^ðl^ðe^ð^^ðW^ðP^ðI^ðB^ð;^ð4^ð-^ð&^ð^ð^ð^ð ^ð^ðü]ðõ]ðî]ðç]ðà]ðÙ]ðÒ]ðË]ðÄ]ð½]ð¶]ð¯]ð¨]ð¡]ðš]ð“]ðŒ]ð…]ð~]ðw]ðp]ði]ðb]ð[]ðT]ðM]ðF]ð?]ð8]ð1]ð*]ð#]ð]ð]ð]ð]ð]ðù\ðò\ðë\ðä\ðÝ\ðÖ\ðÏ\ðÈ\ðÁ\ðº\ð³\ð¬\ð¥\ðž\ð—\ð\ð‰\ð‚\ð{\ðt\ðm\ðf\ð_\ðX\ðQ\ðJ\ðC\ð<\ð5\ð.\ð'\ð \ð\ð\ð \ð\ðý[ðö[ðï[ðè[ðá[ðÚ[ðÓ[ðÌ[ðÅ[ð¾[ð·[ð°[ð©[ð¢[ð›[ð”[ð[ð†[ð[ðx[ðq[ðj[ðc[ð\[ðU[ðN[ðG[ð@[ð9[ð2[ð+[ð$[ð[ð[ð[ð[ð[ðúZðóZðìZðåZðÞZð×ZðÐZðÉZðÂZð»Zð´Zð­Zð¦ZðŸZð˜Zð‘ZðŠZðƒZð|ZðuZðnZðgZð`ZðYZðRZðKZðDZð=Zð6Zð/Zð(Zð!ZðZðZð ZðZðþYð÷YððYðéYðâYðÛYðÔYðÍYðÆYð¿Yð¸Yð±YðªYð£YðœYð•YðŽYð‡Yð€YðyYðrYðkYðdYð]YðVYðOYðHYðAYð:Yð3Yð,Yð%YðYðYðYð YðYðûXðôXðíXðæXðßXðØXðÑXðÊXðÃXð¼XðµXð®Xð§Xð Xð™Xð’Xð‹Xð„Xð}XðvXðoXðhXðaXðZXðSXðLXðEXð>Xð7Xð0Xð)Xð"XðXðXð XðXðÿWðøWðñWðêWðãWðÜWðÕWðÎWðÇWðÀWð¹Wð²Wð«Wð¤WðWð–WðWðˆWðWðzWðsWðlWðeWð^WðWWðPWðIWðBWð;Wð4Wð-Wð&WðWðWðWð WðWðüVðõVðîVðçVðàVðÙVðÒVðËVðÄVð½Vð¶Vð¯Vð¨Vð¡VðšVð“VðŒVð…Vð~VðwVðpVðiVðbVð[VðTVðMVðFVð?Vð8Vð1Vð*Vð#VðVðVðVðVðVðùUðòUðëUðäUðÝUðÖUðÏUðÈUðÁUðºUð³Uð¬Uð¥UðžUð—UðUð‰Uð‚Uð{UðtUðmUðfUð_UðXUðQUðJUðCUðQð7Qð0Qð)Qð"QðQðQð QðQðÿPðøPðñPðêPðãPðÜPðÕPðÎPðÇPðÀPð¹Pð²Pð«Pð¤PðPð–PðPðˆPðPðzPðsPðlPðePð^PðWPðPPðIPðBPð;Pð4Pð-Pð&PðPðPðPð PðPðüOðõOðîOðçOðàOðÙOðÒOðËOðÄOð½Oð¶Oð¯Oð¨Oð¡OðšOð“OðŒOð…Oð~OðwOðpOðiOðbOð[OðTOðMOðFOð?Oð8Oð1Oð*Oð#OðOðOðOðOðOðùNðòNðëNðäNðÝNðÖNðÏNðÈNðÁNðºNð³Nð¬Nð¥NðžNð—NðNð‰Nð‚Nð{NðtNðmNðfNð_NðXNðQNðJNðCNðJð7Jð0Jð)Jð"JðJðJð JðJðÿIðøIðñIðêIðãIðÜIðÕIðÎIðÇIðÀIð¹Ið²Ið«Ið¤IðIð–IðIðˆIðIðzIðsIðlIðeIð^IðWIðPIðIIðBIð;Ið4Ið-Ið&IðIðIðIð IðIðüHðõHðîHðçHðàHðÙHðÒHðËHðÄHð½Hð¶Hð¯Hð¨Hð¡HðšHð“HðŒHð…Hð~HðwHðpHðiHðbHð[HðTHðMHðFHð?Hð8Hð1Hð*Hð#HðHðHðHðHðHðùGðòGðëGðäGðÝGðÖGðÏGðÈGðÁGðºGð³Gð¬Gð¥GðžGð—GðGð‰Gð‚Gð{GðtGðmGðfGð_GðXGðQGðJGðCGðCð7Cð0Cð)Cð"CðCðCð CðCðÿBðøBðñBðêBðãBðÜBðÕBðÎBðÇBðÀBð¹Bð²Bð«Bð¤BðBð–BðBðˆBðBðzBðsBðlBðeBð^BðWBðPBðIBðBBð;Bð4Bð-Bð&BðBðBðBð BðBðüAðõAðîAðçAðàAðÙAðÒAðËAðÄAð½Að¶Að¯Að¨Að¡AðšAð“AðŒAð…Að~AðwAðpAðiAðbAð[AðTAðMAðFAð?Að8Að1Að*Að#AðAðAðAðAðAðù@ðò@ðë@ðä@ðÝ@ðÖ@ðÏ@ðÈ@ðÁ@ðº@ð³@ð¬@ð¥@ðž@ð—@ð@ð‰@ð‚@ð{@ðt@ðm@ðf@ð_@ðX@ðQ@ðJ@ðC@ð<@ð5@ð.@ð'@ð @ð@ð@ð @ð@ðý?ðö?ðï?ðè?ðá?ðÚ?ðÓ?ðÌ?ðÅ?ð¾?ð·?ð°?ð©?ð¢?ð›?ð”?ð?ð†?ð?ðx?ðq?ðj?ðc?ð\?ðU?ðN?ðG?ð@?ð9?ð2?ð+?ð$?ð?ð?ð?ð?ð?ðú>ðó>ðì>ðå>ðÞ>ð×>ðÐ>ðÉ>ðÂ>ð»>ð´>ð­>ð¦>ðŸ>ð˜>ð‘>ðŠ>ðƒ>ð|>ðu>ðn>ðg>ð`>ðY>ðR>ðK>ðD>ð=>ð6>ð/>ð(>ð!>ð>ð>ð >ð>ðþ=ð÷=ðð=ðé=ðâ=ðÛ=ðÔ=ðÍ=ðÆ=ð¿=ð¸=ð±=ðª=ð£=ðœ=ð•=ðŽ=ð‡=ð€=ðy=ðr=ðk=ðd=ð]=ðV=ðO=ðH=ðA=ð:=ð3=ð,=ð%=ð=ð=ð=ð =ð=ðû<ðô<ðí<ðæ<ðß<ðØ<ðÑ<ðÊ<ðÃ<ð¼<ðµ<ð®<ð§<ð <ð™<ð’<ð‹<ð„<ð}<ðv<ðo<ðh<ða<ðZ<ðS<ðL<ðE<ð><ð7<ð0<ð)<ð"<ð<ð<ð <ð<ðÿ;ðø;ðñ;ðê;ðã;ðÜ;ðÕ;ðÎ;ðÇ;ðÀ;ð¹;ð²;ð«;ð¤;ð;ð–;ð;ðˆ;ð;ðz;ðs;ðl;ðe;ð^;ðW;ðP;ðI;ðB;ð;;ð4;ð-;ð&;ð;ð;ð;ð ;ð;ðü:ðõ:ðî:ðç:ðà:ðÙ:ðÒ:ðË:ðÄ:ð½:ð¶:ð¯:ð¨:ð¡:ðš:ð“:ðŒ:ð…:ð~:ðw:ðp:ði:ðb:ð[:ðT:ðM:ðF:ð?:ð8:ð1:ð*:ð#:ð:ð:ð:ð:ð:ðù9ðò9ðë9ðä9ðÝ9ðÖ9ðÏ9ðÈ9ðÁ9ðº9ð³9ð¬9ð¥9ðž9ð—9ð9ð‰9ð‚9ð{9ðt9ðm9ðf9ð_9ðX9ðQ9ðJ9ðC9ð<9ð59ð.9ð'9ð 9ð9ð9ð 9ð9ðý8ðö8ðï8ðè8ðá8ðÚ8ðÓ8ðÌ8ðÅ8ð¾8ð·8ð°8ð©8ð¢8ð›8ð”8ð8ð†8ð8ðx8ðq8ðj8ðc8ð\8ðU8ðN8ðG8ð@8ð98ð28ð+8ð$8ð8ð8ð8ð8ð8ðú7ðó7ðì7ðå7ðÞ7ð×7ðÐ7ðÉ7ðÂ7ð»7ð´7ð­7ð¦7ðŸ7ð˜7ð‘7ðŠ7ðƒ7ð|7ðu7ðn7ðg7ð`7ðY7ðR7ðK7ðD7ð=7ð67ð/7ð(7ð!7ð7ð7ð 7ð7ðþ6ð÷6ðð6ðé6ðâ6ðÛ6ðÔ6ðÍ6ðÆ6ð¿6ð¸6ð±6ðª6ð£6ðœ6ð•6ðŽ6ð‡6ð€6ðy6ðr6ðk6ðd6ð]6ðV6ðO6ðH6ðA6ð:6ð36ð,6ð%6ð6ð6ð6ð 6ð6ðû5ðô5ðí5ðæ5ðß5ðØ5ðÑ5ðÊ5ðÃ5ð¼5ðµ5ð®5ð§5ð 5ð™5ð’5ð‹5ð„5ð}5ðv5ðo5ðh5ða5ðZ5ðS5ðL5ðE5ð>5ð75ð05ð)5ð"5ð5ð5ð 5ð5ðÿ4ðø4ðñ4ðê4ðã4ðÜ4ðÕ4ðÎ4ðÇ4ðÀ4ð¹4ð²4ð«4ð¤4ð4ð–4ð4ðˆ4ð4ðz4ðs4ðl4ðe4ð^4ðW4ðP4ðI4ðB4ð;4ð44ð-4ð&4ð4ð4ð4ð 4ð4ðü3ðõ3ðî3ðç3ðà3ðÙ3ðÒ3ðË3ðÄ3ð½3ð¶3ð¯3ð¨3ð¡3ðš3ð“3ðŒ3ð…3ð~3ðw3ðp3ði3ðb3ð[3ðT3ðM3ðF3ð?3ð83ð13ð*3ð#3ð3ð3ð3ð3ð3ðù2ðò2ðë2ðä2ðÝ2ðÖ2ðÏ2ðÈ2ðÁ2ðº2ð³2ð¬2ð¥2ðž2ð—2ð2ð‰2ð‚2ð{2ðt2ðm2ðf2ð_2ðX2ðQ2ðJ2ðC2ð<2ð52ð.2ð'2ð 2ð2ð2ð 2ð2ðý1ðö1ðï1ðè1ðá1ðÚ1ðÓ1ðÌ1ðÅ1ð¾1ð·1ð°1ð©1ð¢1ð›1ð”1ð1ð†1ð1ðx1ðq1ðj1ðc1ð\1ðU1ðN1ðG1ð@1ð91ð21ð+1ð$1ð1ð1ð1ð1ð1ðú0ðó0ðì0ðå0ðÞ0ð×0ðÐ0ðÉ0ðÂ0ð»0ð´0ð­0ð¦0ðŸ0ð˜0ð‘0ðŠ0ðƒ0ð|0ðu0ðn0ðg0ð`0ðY0ðR0ðK0ðD0ð=0ð60ð/0ð(0ð!0ð0ð0ð 0ð0ðþ/ð÷/ðð/ðé/ðâ/ðÛ/ðÔ/ðÍ/ðÆ/ð¿/ð¸/ð±/ðª/ð£/ðœ/ð•/ðŽ/ð‡/ð€/ðy/ðr/ðk/ðd/ð]/ðV/ðO/ðH/ðA/ð:/ð3/ð,/ð%/ð/ð/ð/ð /ð/ðû.ðô.ðí.ðæ.ðß.ðØ.ðÑ.ðÊ.ðÃ.ð¼.ðµ.ð®.ð§.ð .ð™.ð’.ð‹.ð„.ð}.ðv.ðo.ðh.ða.ðZ.ðS.ðL.ðE.ð>.ð7.ð0.ð).ð".ð.ð.ð .ð.ðÿ-ðø-ðñ-ðê-ðã-ðÜ-ðÕ-ðÎ-ðÇ-ðÀ-ð¹-ð²-ð«-ð¤-ð-ð–-ð-ðˆ-ð-ðz-ðs-ðl-ðe-ð^-ðW-ðP-ðI-ðB-ð;-ð4-ð--ð&-ð-ð-ð-ð -ð-ðü,ðõ,ðî,ðç,ðà,ðÙ,ðÒ,ðË,ðÄ,ð½,ð¶,ð¯,ð¨,ð¡,ðš,ð“,ðŒ,ð…,ð~,ðw,ðp,ði,ðb,ð[,ðT,ðM,ðF,ð?,ð8,ð1,ð*,ð#,ð,ð,ð,ð,ð,ðù+ðò+ðë+ðä+ðÝ+ðÖ+ðÏ+ðÈ+ðÁ+ðº+ð³+ð¬+ð¥+ðž+ð—+ð+ð‰+ð‚+ð{+ðt+ðm+ðf+ð_+ðX+ðQ+ðJ+ðC+ð<+ð5+ð.+ð'+ð +ð+ð+ð +ð+ðý*ðö*ðï*ðè*ðá*ðÚ*ðÓ*ðÌ*ðÅ*ð¾*ð·*ð°*ð©*ð¢*ð›*ð”*ð*ð†*ð*ðx*ðq*ðj*ðc*ð\*ðU*ðN*ðG*ð@*ð9*ð2*ð+*ð$*ð*ð*ð*ð*ð*ðú)ðó)ðì)ðå)ðÞ)ð×)ðÐ)ðÉ)ðÂ)ð»)ð´)ð­)ð¦)ðŸ)ð˜)ð‘)ðŠ)ðƒ)ð|)ðu)ðn)ðg)ð`)ðY)ðR)ðK)ðD)ð=)ð6)ð/)ð()ð!)ð)ð)ð )ð)ðþ(ð÷(ðð(ðé(ðâ(ðÛ(ðÔ(ðÍ(ðÆ(ð¿(ð¸(ð±(ðª(ð£(ðœ(ð•(ðŽ(ð‡(ð€(ðy(ðr(ðk(ðd(ð](ðV(ðO(ðH(ðA(ð:(ð3(ð,(ð%(ð(ð(ð(ð (ð(ðû'ðô'ðí'ðæ'ðß'ðØ'ðÑ'ðÊ'ðÃ'ð¼'ðµ'ð®'ð§'ð 'ð™'ð’'ð‹'ð„'ð}'ðv'ðo'ðh'ða'ðZ'ðS'ðL'ðE'ð>'ð7'ð0'ð)'ð"'ð'ð'ð 'ð'ðÿ&ðø&ðñ&ðê&ðã&ðÜ&ðÕ&ðÎ&ðÇ&ðÀ&ð¹&ð²&ð«&ð¤&ð&ð–&ð&ðˆ&ð&ðz&ðs&ðl&ðe&ð^&ðW&ðP&ðI&ðB&ð;&ð4&ð-&ð&&ð&ð&ð&ð &ð&ðü%ðõ%ðî%ðç%ðà%ðÙ%ðÒ%ðË%ðÄ%ð½%ð¶%ð¯%ð¨%ð¡%ðš%ð“%ðŒ%ð…%ð~%ðw%ðp%ði%ðb%ð[%ðT%ðM%ðF%ð?%ð8%ð1%ð*%ð#%ð%ð%ð%ð%ð%ðù$ðò$ðë$ðä$ðÝ$ðÖ$ðÏ$ðÈ$ðÁ$ðº$ð³$ð¬$ð¥$ðž$ð—$ð$ð‰$ð‚$ð{$ðt$ðm$ðf$ð_$ðX$ðQ$ðJ$ðC$ð<$ð5$ð.$ð'$ð $ð$ð$ð $ð$ðý#ðö#ðï#ðè#ðá#ðÚ#ðÓ#ðÌ#ðÅ#ð¾#ð·#ð°#ð©#ð¢#ð›#ð”#ð#ð†#ð#ðx#ðq#ðj#ðc#ð\#ðU#ðN#ðG#ð@#ð9#ð2#ð+#ð$#ð#ð#ð#ð#ð#ðú"ðó"ðì"ðå"ðÞ"ð×"ðÐ"ðÉ"ðÂ"ð»"ð´"ð­"ð¦"ðŸ"ð˜"ð‘"ðŠ"ðƒ"ð|"ðu"ðn"ðg"ð`"ðY"ðR"ðK"ðD"ð="ð6"ð/"ð("ð!"ð"ð"ð "ð"ðþ!ð÷!ðð!ðé!ðâ!ðÛ!ðÔ!ðÍ!ðÆ!ð¿!ð¸!ð±!ðª!ð£!ðœ!ð•!ðŽ!ð‡!ð€!ðy!ðr!ðk!ðd!ð]!ðV!ðO!ðH!ðA!ð:!ð3!ð,!ð%!ð!ð!ð!ð !ð!ðû ðô ðí ðæ ðß ðØ ðÑ ðÊ ðà ð¼ ðµ ð® ð§ ð  ð™ ð’ ð‹ ð„ ð} ðv ðo ðh ða ðZ ðS ðL ðE ð> ð7 ð0 ð) ð" ð ð ð ð ðÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððú ðó ðì ðå ðÞ ð× ðÐ ðÉ ð ð» ð´ ð­ ð¦ ðŸ ð˜ ð‘ ðŠ ðƒ ð| ðu ðn ðg ð` ðY ðR ðK ðD ð= ð6 ð/ ð( ð! ð ð ð ð ðþ ð÷ ðð ðé ðâ ðÛ ðÔ ðÍ ðÆ ð¿ ð¸ ð± ðª ð£ ðœ ð• ðŽ ð‡ ð€ ðy ðr ðk ðd ð] ðV ðO ðH ðA ð: ð3 ð, ð% ð ð ð ð ð ðû ðô ðí ðæ ðß ðØ ðÑ ðÊ ðà ð¼ ðµ ð® ð§ ð  ð™ ð’ ð‹ ð„ ð} ðv ðo ðh ða ðZ ðS ðL ðE ð> ð7 ð0 ð) ð" ð ð ð ð ðÿ ðø ðñ ðê ðã ðÜ ðÕ ðÎ ðÇ ðÀ ð¹ ð² ð« ð¤ ð ð– ð ðˆ ð ðz ðs ðl ðe ð^ ðW ðP ðI ðB ð; ð4 ð- ð& ð ð ð ð ð ðü ðõ ðî ðç ðà ðÙ ðÒ ðË ðÄ ð½ ð¶ ð¯ ð¨ ð¡ ðš ð“ ðŒ ð… ð~ ðw ðp ði ðb ð[ ðT ðM ðF ð? ð8 ð1 ð* ð# ð ð ð ð ð ðùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúÿïóÿïìÿïåÿïÞÿï×ÿïÐÿïÉÿïÂÿï»ÿï´ÿï­ÿï¦ÿïŸÿï˜ÿï‘ÿïŠÿïƒÿï|ÿïuÿïnÿïgÿï`ÿïYÿïRÿïKÿïDÿï=ÿï6ÿï/ÿï(ÿï!ÿïÿïÿï ÿïÿïþþï÷þïðþïéþïâþïÛþïÔþïÍþïÆþï¿þï¸þï±þïªþï£þïœþï•þïŽþï‡þï€þïyþïrþïkþïdþï]þïVþïOþïHþïAþï:þï3þï,þï%þïþïþïþï þïþïûýïôýïíýïæýïßýïØýïÑýïÊýïÃýï¼ýïµýï®ýï§ýï ýï™ýï’ýï‹ýï„ýï}ýïvýïoýïhýïaýïZýïSýïLýïEýï>ýï7ýï0ýï)ýï"ýïýïýï ýïýïÿüïøüïñüïêüïãüïÜüïÕüïÎüïÇüïÀüï¹üï²üï«üï¤üïüï–üïüïˆüïüïzüïsüïlüïeüï^üïWüïPüïIüïBüï;üï4üï-üï&üïüïüïüï üïüïüûïõûïîûïçûïàûïÙûïÒûïËûïÄûï½ûï¶ûï¯ûï¨ûï¡ûïšûï“ûïŒûï…ûï~ûïwûïpûïiûïbûï[ûïTûïMûïFûï?ûï8ûï1ûï*ûï#ûïûïûïûïûïûïùúïòúïëúïäúïÝúïÖúïÏúïÈúïÁúïºúï³úï¬úï¥úïžúï—úïúï‰úï‚úï{úïtúïmúïfúï_úïXúïQúïJúïCúï<úï5úï.úï'úï úïúïúï úïúïýùïöùïïùïèùïáùïÚùïÓùïÌùïÅùï¾ùï·ùï°ùï©ùï¢ùï›ùï”ùïùï†ùïùïxùïqùïjùïcùï\ùïUùïNùïGùï@ùï9ùï2ùï+ùï$ùïùïùïùïùïùïúøïóøïìøïåøïÞøï×øïÐøïÉøïÂøï»øï´øï­øï¦øïŸøï˜øï‘øïŠøïƒøï|øïuøïnøïgøï`øïYøïRøïKøïDøï=øï6øï/øï(øï!øïøïøï øïøïþ÷ï÷÷ïð÷ïé÷ïâ÷ïÛ÷ïÔ÷ïÍ÷ïÆ÷ï¿÷ï¸÷ï±÷ïª÷ï£÷ïœ÷ï•÷ïŽ÷ï‡÷ï€÷ïy÷ïr÷ïk÷ïd÷ï]÷ïV÷ïO÷ïH÷ïA÷ï:÷ï3÷ï,÷ï%÷ï÷ï÷ï÷ï ÷ï÷ïûöïôöïíöïæöïßöïØöïÑöïÊöïÃöï¼öïµöï®öï§öï öï™öï’öï‹öï„öï}öïvöïoöïhöïaöïZöïSöïLöïEöï>öï7öï0öï)öï"öïöïöï öïöïÿõïøõïñõïêõïãõïÜõïÕõïÎõïÇõïÀõï¹õï²õï«õï¤õïõï–õïõïˆõïõïzõïsõïlõïeõï^õïWõïPõïIõïBõï;õï4õï-õï&õïõïõïõï õïõïüôïõôïîôïçôïàôïÙôïÒôïËôïÄôï½ôï¶ôï¯ôï¨ôï¡ôïšôï“ôïŒôï…ôï~ôïwôïpôïiôïbôï[ôïTôïMôïFôï?ôï8ôï1ôï*ôï#ôïôïôïôïôïôïùóïòóïëóïäóïÝóïÖóïÏóïÈóïÁóïºóï³óï¬óï¥óïžóï—óïóï‰óï‚óï{óïtóïmóïfóï_óïXóïQóïJóïCóï<óï5óï.óï'óï óïóïóï óïóïýòïöòïïòïèòïáòïÚòïÓòïÌòïÅòï¾òï·òï°òï©òï¢òï›òï”òïòï†òïòïxòïqòïjòïcòï\òïUòïNòïGòï@òï9òï2òï+òï$òïòïòïòïòïòïúñïóñïìñïåñïÞñï×ñïÐñïÉñïÂñï»ñï´ñï­ñï¦ñïŸñï˜ñï‘ñïŠñïƒñï|ñïuñïnñïgñï`ñïYñïRñïKñïDñï=ñï6ñï/ñï(ñï!ñïñïñï ñïñïþðï÷ðïððïéðïâðïÛðïÔðïÍðïÆðï¿ðï¸ðï±ðïªðï£ðïœðï•ðïŽðï‡ðï€ðïyðïrðïkðïdðï]ðïVðïOðïHðïAðï:ðï3ðï,ðï%ðïðïðïðï ðïðïûïïôïïíïïæïïßïïØïïÑïïÊïïÃïï¼ïïµïï®ïï§ïï ïï™ïï’ïï‹ïï„ïï}ïïvïïoïïhïïaïïZïïSïïLïïEïï>ïï7ïï0ïï)ïï"ïïïïïï ïïïïÿîïøîïñîïêîïãîïÜîïÕîïÎîïÇîïÀîï¹îï²îï«îï¤îïîï–îïîïˆîïîïzîïsîïlîïeîï^îïWîïPîïIîïBîï;îï4îï-îï&îïîïîïîï îïîïüíïõíïîíïçíïàíïÙíïÒíïËíïÄíï½íï¶íï¯íï¨íï¡íïšíï“íïŒíï…íï~íïwíïpíïiíïbíï[íïTíïMíïFíï?íï8íï1íï*íï#íïíïíïíïíïíïùìïòìïëìïäìïÝìïÖìïÏìïÈìïÁìïºìï³ìï¬ìï¥ìïžìï—ìïìï‰ìï‚ìï{ìïtìïmìïfìï_ìïXìïQìïJìïCìï<ìï5ìï.ìï'ìï ìïìïìï ìïìïýëïöëïïëïèëïáëïÚëïÓëïÌëïÅëï¾ëï·ëï°ëï©ëï¢ëï›ëï”ëïëï†ëïëïxëïqëïjëïcëï\ëïUëïNëïGëï@ëï9ëï2ëï+ëï$ëïëïëïëïëïëïúêïóêïìêïåêïÞêï×êïÐêïÉêïÂêï»êï´êï­êï¦êïŸêï˜êï‘êïŠêïƒêï|êïuêïnêïgêï`êïYêïRêïKêïDêï=êï6êï/êï(êï!êïêïêï êïêïþéï÷éïðéïééïâéïÛéïÔéïÍéïÆéï¿éï¸éï±éïªéï£éïœéï•éïŽéï‡éï€éïyéïréïkéïdéï]éïVéïOéïHéïAéï:éï3éï,éï%éïéïéïéï éïéïûèïôèïíèïæèïßèïØèïÑèïÊèïÃèï¼èïµèï®èï§èï èï™èï’èï‹èï„èï}èïvèïoèïhèïaèïZèïSèïLèïEèï>èï7èï0èï)èï"èïèïèï èïèïÿçïøçïñçïêçïãçïÜçïÕçïÎçïÇçïÀçï¹çï²çï«çï¤çïçï–çïçïˆçïçïzçïsçïlçïeçï^çïWçïPçïIçïBçï;çï4çï-çï&çïçïçïçï çïçïüæïõæïîæïçæïàæïÙæïÒæïËæïÄæï½æï¶æï¯æï¨æï¡æïšæï“æïŒæï…æï~æïwæïpæïiæïbæï[æïTæïMæïFæï?æï8æï1æï*æï#æïæïæïæïæïæïùåïòåïëåïäåïÝåïÖåïÏåïÈåïÁåïºåï³åï¬åï¥åïžåï—åïåï‰åï‚åï{åïtåïmåïfåï_åïXåïQåïJåïCåï<åï5åï.åï'åï åïåïåï åïåïýäïöäïïäïèäïáäïÚäïÓäïÌäïÅäï¾äï·äï°äï©äï¢äï›äï”äïäï†äïäïxäïqäïjäïcäï\äïUäïNäïGäï@äï9äï2äï+äï$äïäïäïäïäïäïúãïóãïìãïåãïÞãï×ãïÐãïÉãïÂãï»ãï´ãï­ãï¦ãïŸãï˜ãï‘ãïŠãïƒãï|ãïuãïnãïgãï`ãïYãïRãïKãïDãï=ãï6ãï/ãï(ãï!ãïãïãï ãïãïþâï÷âïðâïéâïââïÛâïÔâïÍâïÆâï¿âï¸âï±âïªâï£âïœâï•âïŽâï‡âï€âïyâïrâïkâïdâï]âïVâïOâïHâïAâï:âï3âï,âï%âïâïâïâï âïâïûáïôáïíáïæáïßáïØáïÑáïÊáïÃáï¼áïµáï®áï§áï áï™áï’áï‹áï„áï}áïváïoáïháïaáïZáïSáïLáïEáï>áï7áï0áï)áï"áïáïáï áïáïÿàïøàïñàïêàïãàïÜàïÕàïÎàïÇàïÀàï¹àï²àï«àï¤àïàï–àïàïˆàïàïzàïsàïlàïeàï^àïWàïPàïIàïBàï;àï4àï-àï&àïàïàïàï àïàïüßïõßïîßïçßïàßïÙßïÒßïËßïÄßï½ßï¶ßï¯ßï¨ßï¡ßïšßï“ßïŒßï…ßï~ßïwßïpßïißïbßï[ßïTßïMßïFßï?ßï8ßï1ßï*ßï#ßïßïßïßïßïßïùÞïòÞïëÞïäÞïÝÞïÖÞïÏÞïÈÞïÁÞïºÞï³Þï¬Þï¥ÞïžÞï—ÞïÞï‰Þï‚Þï{ÞïtÞïmÞïfÞï_ÞïXÞïQÞïJÞïCÞï<Þï5Þï.Þï'Þï ÞïÞïÞï ÞïÞïýÝïöÝïïÝïèÝïáÝïÚÝïÓÝïÌÝïÅÝï¾Ýï·Ýï°Ýï©Ýï¢Ýï›Ýï”ÝïÝï†ÝïÝïxÝïqÝïjÝïcÝï\ÝïUÝïNÝïGÝï@Ýï9Ýï2Ýï+Ýï$ÝïÝïÝïÝïÝïÝïúÜïóÜïìÜïåÜïÞÜï×ÜïÐÜïÉÜïÂÜï»Üï´Üï­Üï¦ÜïŸÜï˜Üï‘ÜïŠÜïƒÜï|ÜïuÜïnÜïgÜï`ÜïYÜïRÜïKÜïDÜï=Üï6Üï/Üï(Üï!ÜïÜïÜï ÜïÜïþÛï÷ÛïðÛïéÛïâÛïÛÛïÔÛïÍÛïÆÛï¿Ûï¸Ûï±ÛïªÛï£ÛïœÛï•ÛïŽÛï‡Ûï€ÛïyÛïrÛïkÛïdÛï]ÛïVÛïOÛïHÛïAÛï:Ûï3Ûï,Ûï%ÛïÛïÛïÛï ÛïÛïûÚïôÚïíÚïæÚïßÚïØÚïÑÚïÊÚïÃÚï¼ÚïµÚï®Úï§Úï Úï™Úï’Úï‹Úï„Úï}ÚïvÚïoÚïhÚïaÚïZÚïSÚïLÚïEÚï>Úï7Úï0Úï)Úï"ÚïÚïÚï ÚïÚïÿÙïøÙïñÙïêÙïãÙïÜÙïÕÙïÎÙïÇÙïÀÙï¹Ùï²Ùï«Ùï¤ÙïÙï–ÙïÙïˆÙïÙïzÙïsÙïlÙïeÙï^ÙïWÙïPÙïIÙïBÙï;Ùï4Ùï-Ùï&ÙïÙïÙïÙï ÙïÙïüØïõØïîØïçØïàØïÙØïÒØïËØïÄØï½Øï¶Øï¯Øï¨Øï¡ØïšØï“ØïŒØï…Øï~ØïwØïpØïiØïbØï[ØïTØïMØïFØï?Øï8Øï1Øï*Øï#ØïØïØïØïØïØïù×ïò×ïë×ïä×ïÝ×ïÖ×ïÏ×ïÈ×ïÁ×ïº×ï³×ï¬×ï¥×ïž×ï—×ï×ï‰×ï‚×ï{×ït×ïm×ïf×ï_×ïX×ïQ×ïJ×ïC×ï<×ï5×ï.×ï'×ï ×ï×ï×ï ×ï×ïýÖïöÖïïÖïèÖïáÖïÚÖïÓÖïÌÖïÅÖï¾Öï·Öï°Öï©Öï¢Öï›Öï”ÖïÖï†ÖïÖïxÖïqÖïjÖïcÖï\ÖïUÖïNÖïGÖï@Öï9Öï2Öï+Öï$ÖïÖïÖïÖïÖïÖïúÕïóÕïìÕïåÕïÞÕï×ÕïÐÕïÉÕïÂÕï»Õï´Õï­Õï¦ÕïŸÕï˜Õï‘ÕïŠÕïƒÕï|ÕïuÕïnÕïgÕï`ÕïYÕïRÕïKÕïDÕï=Õï6Õï/Õï(Õï!ÕïÕïÕï ÕïÕïþÔï÷ÔïðÔïéÔïâÔïÛÔïÔÔïÍÔïÆÔï¿Ôï¸Ôï±ÔïªÔï£ÔïœÔï•ÔïŽÔï‡Ôï€ÔïyÔïrÔïkÔïdÔï]ÔïVÔïOÔïHÔïAÔï:Ôï3Ôï,Ôï%ÔïÔïÔïÔï ÔïÔïûÓïôÓïíÓïæÓïßÓïØÓïÑÓïÊÓïÃÓï¼ÓïµÓï®Óï§Óï Óï™Óï’Óï‹Óï„Óï}ÓïvÓïoÓïhÓïaÓïZÓïSÓïLÓïEÓï>Óï7Óï0Óï)Óï"ÓïÓïÓï ÓïÓïÿÒïøÒïñÒïêÒïãÒïÜÒïÕÒïÎÒïÇÒïÀÒï¹Òï²Òï«Òï¤ÒïÒï–ÒïÒïˆÒïÒïzÒïsÒïlÒïeÒï^ÒïWÒïPÒïIÒïBÒï;Òï4Òï-Òï&ÒïÒïÒïÒï ÒïÒïüÑïõÑïîÑïçÑïàÑïÙÑïÒÑïËÑïÄÑï½Ñï¶Ñï¯Ñï¨Ñï¡ÑïšÑï“ÑïŒÑï…Ñï~ÑïwÑïpÑïiÑïbÑï[ÑïTÑïMÑïFÑï?Ñï8Ñï1Ñï*Ñï#ÑïÑïÑïÑïÑïÑïùÐïòÐïëÐïäÐïÝÐïÖÐïÏÐïÈÐïÁÐïºÐï³Ðï¬Ðï¥ÐïžÐï—ÐïÐï‰Ðï‚Ðï{ÐïtÐïmÐïfÐï_ÐïXÐïQÐïJÐïCÐï<Ðï5Ðï.Ðï'Ðï ÐïÐïÐï ÐïÐïýÏïöÏïïÏïèÏïáÏïÚÏïÓÏïÌÏïÅÏï¾Ïï·Ïï°Ïï©Ïï¢Ïï›Ïï”ÏïÏï†ÏïÏïxÏïqÏïjÏïcÏï\ÏïUÏïNÏïGÏï@Ïï9Ïï2Ïï+Ïï$ÏïÏïÏïÏïÏïÏïúÎïóÎïìÎïåÎïÞÎï×ÎïÐÎïÉÎïÂÎï»Îï´Îï­Îï¦ÎïŸÎï˜Îï‘ÎïŠÎïƒÎï|ÎïuÎïnÎïgÎï`ÎïYÎïRÎïKÎïDÎï=Îï6Îï/Îï(Îï!ÎïÎïÎï ÎïÎïþÍï÷ÍïðÍïéÍïâÍïÛÍïÔÍïÍÍïÆÍï¿Íï¸Íï±ÍïªÍï£ÍïœÍï•ÍïŽÍï‡Íï€ÍïyÍïrÍïkÍïdÍï]ÍïVÍïOÍïHÍïAÍï:Íï3Íï,Íï%ÍïÍïÍïÍï ÍïÍïûÌïôÌïíÌïæÌïßÌïØÌïÑÌïÊÌïÃÌï¼ÌïµÌï®Ìï§Ìï Ìï™Ìï’Ìï‹Ìï„Ìï}ÌïvÌïoÌïhÌïaÌïZÌïSÌïLÌïEÌï>Ìï7Ìï0Ìï)Ìï"ÌïÌïÌï ÌïÌïÿËïøËïñËïêËïãËïÜËïÕËïÎËïÇËïÀËï¹Ëï²Ëï«Ëï¤ËïËï–ËïËïˆËïËïzËïsËïlËïeËï^ËïWËïPËïIËïBËï;Ëï4Ëï-Ëï&ËïËïËïËï ËïËïüÊïõÊïîÊïçÊïàÊïÙÊïÒÊïËÊïÄÊï½Êï¶Êï¯Êï¨Êï¡ÊïšÊï“ÊïŒÊï…Êï~ÊïwÊïpÊïiÊïbÊï[ÊïTÊïMÊïFÊï?Êï8Êï1Êï*Êï#ÊïÊïÊïÊïÊïÊïùÉïòÉïëÉïäÉïÝÉïÖÉïÏÉïÈÉïÁÉïºÉï³Éï¬Éï¥ÉïžÉï—ÉïÉï‰Éï‚Éï{ÉïtÉïmÉïfÉï_ÉïXÉïQÉïJÉïCÉï<Éï5Éï.Éï'Éï ÉïÉïÉï ÉïÉïýÈïöÈïïÈïèÈïáÈïÚÈïÓÈïÌÈïÅÈï¾Èï·Èï°Èï©Èï¢Èï›Èï”ÈïÈï†ÈïÈïxÈïqÈïjÈïcÈï\ÈïUÈïNÈïGÈï@Èï9Èï2Èï+Èï$ÈïÈïÈïÈïÈïÈïúÇïóÇïìÇïåÇïÞÇï×ÇïÐÇïÉÇïÂÇï»Çï´Çï­Çï¦ÇïŸÇï˜Çï‘ÇïŠÇïƒÇï|ÇïuÇïnÇïgÇï`ÇïYÇïRÇïKÇïDÇï=Çï6Çï/Çï(Çï!ÇïÇïÇï ÇïÇïþÆï÷ÆïðÆïéÆïâÆïÛÆïÔÆïÍÆïÆÆï¿Æï¸Æï±ÆïªÆï£ÆïœÆï•ÆïŽÆï‡Æï€ÆïyÆïrÆïkÆïdÆï]ÆïVÆïOÆïHÆïAÆï:Æï3Æï,Æï%ÆïÆïÆïÆï ÆïÆïûÅïôÅïíÅïæÅïßÅïØÅïÑÅïÊÅïÃÅï¼ÅïµÅï®Åï§Åï Åï™Åï’Åï‹Åï„Åï}ÅïvÅïoÅïhÅïaÅïZÅïSÅïLÅïEÅï>Åï7Åï0Åï)Åï"ÅïÅïÅï ÅïÅïÿÄïøÄïñÄïêÄïãÄïÜÄïÕÄïÎÄïÇÄïÀÄï¹Äï²Äï«Äï¤ÄïÄï–ÄïÄïˆÄïÄïzÄïsÄïlÄïeÄï^ÄïWÄïPÄïIÄïBÄï;Äï4Äï-Äï&ÄïÄïÄïÄï ÄïÄïüÃïõÃïîÃïçÃïàÃïÙÃïÒÃïËÃïÄÃï½Ãï¶Ãï¯Ãï¨Ãï¡ÃïšÃï“ÃïŒÃï…Ãï~ÃïwÃïpÃïiÃïbÃï[ÃïTÃïMÃïFÃï?Ãï8Ãï1Ãï*Ãï#ÃïÃïÃïÃïÃïÃïùÂïòÂïëÂïäÂïÝÂïÖÂïÏÂïÈÂïÁÂïºÂï³Âï¬Âï¥ÂïžÂï—ÂïÂï‰Âï‚Âï{ÂïtÂïmÂïfÂï_ÂïXÂïQÂïJÂïCÂï<Âï5Âï.Âï'Âï ÂïÂïÂï ÂïÂïýÁïöÁïïÁïèÁïáÁïÚÁïÓÁïÌÁïÅÁï¾Áï·Áï°Áï©Áï¢Áï›Áï”ÁïÁï†ÁïÁïxÁïqÁïjÁïcÁï\ÁïUÁïNÁïGÁï@Áï9Áï2Áï+Áï$ÁïÁïÁïÁïÁïÁïúÀïóÀïìÀïåÀïÞÀï×ÀïÐÀïÉÀïÂÀï»Àï´Àï­Àï¦ÀïŸÀï˜Àï‘ÀïŠÀïƒÀï|ÀïuÀïnÀïgÀï`ÀïYÀïRÀïKÀïDÀï=Àï6Àï/Àï(Àï!ÀïÀïÀï ÀïÀïþ¿ï÷¿ïð¿ïé¿ïâ¿ïÛ¿ïÔ¿ïÍ¿ïÆ¿ï¿¿ï¸¿ï±¿ïª¿ï£¿ïœ¿ï•¿ïŽ¿ï‡¿ï€¿ïy¿ïr¿ïk¿ïd¿ï]¿ïV¿ïO¿ïH¿ïA¿ï:¿ï3¿ï,¿ï%¿ï¿ï¿ï¿ï ¿ï¿ïû¾ïô¾ïí¾ïæ¾ïß¾ïؾïѾïʾïþ^ﵾ﮾茶ï}¾ïv¾ïo¾ïh¾ïa¾ïZ¾ïS¾ïL¾ïE¾ï>¾ï7¾ï0¾ï)¾ï"¾ï¾ï¾ï ¾ï¾ïÿ½ïø½ïñ½ïê½ïã½ïܽïÕ½ïνïǽïÀ½ï¹½ï²½ï«½ï¤½ï½ï–½ï½ïˆ½ï½ïz½ïs½ïl½ïe½ï^½ïW½ïP½ïI½ïB½ï;½ï4½ï-½ï&½ï½ï½ï½ï ½ï½ïü¼ïõ¼ïî¼ïç¼ïà¼ïÙ¼ïÒ¼ï˼ïļシﶼﯼ屮ï~¼ïw¼ïp¼ïi¼ïb¼ï[¼ïT¼ïM¼ïF¼ï?¼ï8¼ï1¼ï*¼ï#¼ï¼ï¼ï¼ï¼ï¼ïù»ïò»ïë»ïä»ïÝ»ïÖ»ïÏ»ïÈ»ïÁ»ïº»ï³»ï¬»ï¥»ïž»ï—»ï»ï‰»ï‚»ï{»ït»ïm»ïf»ï_»ïX»ïQ»ïJ»ïC»ï<»ï5»ï.»ï'»ï »ï»ï»ï »ï»ïýºïöºïïºïèºïáºïÚºïÓºï̺ïźï¾ºï·ºï°ºï©ºï¢ºï›ºï”ºïºï†ºïºïxºïqºïjºïcºï\ºïUºïNºïGºï@ºï9ºï2ºï+ºï$ºïºïºïºïºïºïú¹ïó¹ïì¹ïå¹ïÞ¹ï×¹ïйïɹï¹ï»¹ï´¹ï­¹ï¦¹ïŸ¹ï˜¹ï‘¹ïйï|¹ïu¹ïn¹ïg¹ï`¹ïY¹ïR¹ïK¹ïD¹ï=¹ï6¹ï/¹ï(¹ï!¹ï¹ï¹ï ¹ï¹ïþ¸ï÷¸ïð¸ïé¸ïâ¸ïÛ¸ïÔ¸ï͸ïƸ￸︸ﱸ視ïޏïy¸ïr¸ïk¸ïd¸ï]¸ïV¸ïO¸ïH¸ïA¸ï:¸ï3¸ï,¸ï%¸ï¸ï¸ï¸ï ¸ï¸ïû·ïô·ïí·ïæ·ïß·ïØ·ïÑ·ïÊ·ï÷ï¼·ïµ·ï®·ï§·ï ·ï™·ï’·ï‹·ï„·ï}·ïv·ïo·ïh·ïa·ïZ·ïS·ïL·ïE·ï>·ï7·ï0·ï)·ï"·ï·ï·ï ·ï·ïÿ¶ïø¶ïñ¶ïê¶ïã¶ïܶïÕ¶ïζïǶïÀ¶ï¹¶ï²¶ï«¶ï¤¶ï¶ï–¶ï¶ïˆ¶ï¶ïz¶ïs¶ïl¶ïe¶ï^¶ïW¶ïP¶ïI¶ïB¶ï;¶ï4¶ï-¶ï&¶ï¶ï¶ï¶ï ¶ï¶ïüµïõµïîµïçµïàµïÙµïÒµï˵ïĵオﶵﯵ卑ï~µïwµïpµïiµïbµï[µïTµïMµïFµï?µï8µï1µï*µï#µïµïµïµïµïµïù´ïò´ïë´ïä´ïÝ´ïÖ´ïÏ´ïÈ´ïÁ´ïº´ï³´ï¬´ï¥´ïž´ï—´ï´ï‰´ï‚´ï{´ït´ïm´ïf´ï_´ïX´ïQ´ïJ´ïC´ï<´ï5´ï.´ï'´ï ´ï´ï´ï ´ï´ïý³ïö³ïï³ïè³ïá³ïÚ³ïÓ³ï̳ïųᄈﷳﰳ侀ï³ï†³ï³ïx³ïq³ïj³ïc³ï\³ïU³ïN³ïG³ï@³ï9³ï2³ï+³ï$³ï³ï³ï³ï³ï³ïú²ïó²ïì²ïå²ïÞ²ïײïвïɲï²ï»²ï´²ï­²ï¦²ïŸ²ï˜²ï‘²ïвï|²ïu²ïn²ïg²ï`²ïY²ïR²ïK²ïD²ï=²ï6²ï/²ï(²ï!²ï²ï²ï ²ï²ïþ±ï÷±ïð±ïé±ïâ±ïÛ±ïÔ±ïͱïƱ￱︱ﱱ缾ïޱïy±ïr±ïk±ïd±ï]±ïV±ïO±ïH±ïA±ï:±ï3±ï,±ï%±ï±ï±ï±ï ±ï±ïû°ïô°ïí°ïæ°ïß°ïذïѰïʰïðï¼°ïµ°ï®°ï§°ï °ï™°ï’°ï‹°ï„°ï}°ïv°ïo°ïh°ïa°ïZ°ïS°ïL°ïE°ï>°ï7°ï0°ï)°ï"°ï°ï°ï °ï°ïÿ¯ïø¯ïñ¯ïê¯ïã¯ïܯïÕ¯ïίïǯïÀ¯ï¹¯ï²¯ï«¯ï¤¯ï¯ï–¯ï¯ïˆ¯ï¯ïz¯ïs¯ïl¯ïe¯ï^¯ïW¯ïP¯ïI¯ïB¯ï;¯ï4¯ï-¯ï&¯ï¯ï¯ï¯ï ¯ï¯ïü®ïõ®ïî®ïç®ïà®ïÙ®ïÒ®ïË®ïĮョﶮﯮ郞ï~®ïw®ïp®ïi®ïb®ï[®ïT®ïM®ïF®ï?®ï8®ï1®ï*®ï#®ï®ï®ï®ï®ï®ïù­ïò­ïë­ïä­ïÝ­ïÖ­ïÏ­ïÈ­ïÁ­ïº­ï³­ï¬­ï¥­ïž­ï—­ï­ï‰­ï‚­ï{­ït­ïm­ïf­ï_­ïX­ïQ­ïJ­ïC­ï<­ï5­ï.­ï'­ï ­ï­ï­ï ­ï­ïý¬ïö¬ïï¬ïè¬ïá¬ïÚ¬ïÓ¬ï̬ïŬᆲ﷬ﰬ𤋮ï¬ï†¬ï¬ïx¬ïq¬ïj¬ïc¬ï\¬ïU¬ïN¬ïG¬ï@¬ï9¬ï2¬ï+¬ï$¬ï¬ï¬ï¬ï¬ï¬ïú«ïó«ïì«ïå«ïÞ«ï׫ïЫïÉ«ï«ï»«ï´«ï­«ï¦«ïŸ«ï˜«ï‘«ïŠ«ïƒ«ï|«ïu«ïn«ïg«ï`«ïY«ïR«ïK«ïD«ï=«ï6«ï/«ï(«ï!«ï«ï«ï «ï«ïþªï÷ªïðªïéªïâªïÛªïÔªïͪïƪ↑︪ﱪ着ïyªïrªïkªïdªï]ªïVªïOªïHªïAªï:ªï3ªï,ªï%ªïªïªïªï ªïªïû©ïô©ïí©ïæ©ïß©ïØ©ïÑ©ïÊ©ïéIﵩﮩ里ï}©ïv©ïo©ïh©ïa©ïZ©ïS©ïL©ïE©ï>©ï7©ï0©ï)©ï"©ï©ï©ï ©ï©ïÿ¨ïø¨ïñ¨ïê¨ïã¨ïܨïÕ¨ïΨïǨïÀ¨ï¹¨ï²¨ï«¨ï¤¨ï¨ï–¨ï¨ïˆ¨ï¨ïz¨ïs¨ïl¨ïe¨ï^¨ïW¨ïP¨ïI¨ïB¨ï;¨ï4¨ï-¨ï&¨ï¨ï¨ï¨ï ¨ï¨ïü§ïõ§ïî§ïç§ïà§ïÙ§ïÒ§ï˧ïħァﶧﯧ﨧ï~§ïw§ïp§ïi§ïb§ï[§ïT§ïM§ïF§ï?§ï8§ï1§ï*§ï#§ï§ï§ï§ï§ï§ïù¦ïò¦ïë¦ïä¦ïݦïÖ¦ïϦïȦïÁ¦ïº¦ï³¦ï¬¦ï¥¦ïž¦ï—¦ï¦ï‰¦ï‚¦ï{¦ït¦ïm¦ïf¦ï_¦ïX¦ïQ¦ïJ¦ïC¦ï<¦ï5¦ï.¦ï'¦ï ¦ï¦ï¦ï ¦ï¦ïý¥ïö¥ïï¥ïè¥ïá¥ïÚ¥ïÓ¥ïÌ¥ïťᆬ﷥ﰥ贈ï¥ï†¥ï¥ïx¥ïq¥ïj¥ïc¥ï\¥ïU¥ïN¥ïG¥ï@¥ï9¥ï2¥ï+¥ï$¥ï¥ï¥ï¥ï¥ï¥ïú¤ïó¤ïì¤ïå¤ïÞ¤ïפïФïɤï¤ï»¤ï´¤ï­¤ï¦¤ïŸ¤ï˜¤ï‘¤ïФï|¤ïu¤ïn¤ïg¤ï`¤ïY¤ïR¤ïK¤ïD¤ï=¤ï6¤ï/¤ï(¤ï!¤ï¤ï¤ï ¤ï¤ïþ£ï÷£ïð£ïé£ïâ£ïÛ£ïÔ£ïÍ£ïÆ£ï¿£ï¸£ï±£ïª£ï££ïœ£ï•£ïŽ£ï‡£ï€£ïy£ïr£ïk£ïd£ï]£ïV£ïO£ïH£ïA£ï:£ï3£ï,£ï%£ï£ï£ï£ï £ï£ïû¢ïô¢ïí¢ïæ¢ïߢïØ¢ïÑ¢ïÊ¢ïâBﵢﮢ梨ï}¢ïv¢ïo¢ïh¢ïa¢ïZ¢ïS¢ïL¢ïE¢ï>¢ï7¢ï0¢ï)¢ï"¢ï¢ï¢ï ¢ï¢ïÿ¡ïø¡ïñ¡ïê¡ïã¡ïÜ¡ïÕ¡ïΡïÇ¡ïÀ¡ï¹¡ï²¡ï«¡ï¤¡ï¡ï–¡ï¡ïˆ¡ï¡ïz¡ïs¡ïl¡ïe¡ï^¡ïW¡ïP¡ïI¡ïB¡ï;¡ï4¡ï-¡ï&¡ï¡ï¡ï¡ï ¡ï¡ïü ïõ ïî ïç ïà ïÙ ïÒ ïË ïĠ⦆ﶠﯠ蘒ï~ ïw ïp ïi ïb ï[ ïT ïM ïF ï? ï8 ï1 ï* ï# ï ï ï ï ï ïùŸïòŸïëŸïäŸïÝŸïÖŸïÏŸïÈŸïÁŸïºŸï³Ÿï¬Ÿï¥ŸïžŸï—ŸïŸï‰Ÿï‚Ÿï{ŸïtŸïmŸïfŸï_ŸïXŸïQŸïJŸïCŸï<Ÿï5Ÿï.Ÿï'Ÿï ŸïŸïŸï ŸïŸïýžïöžïïžïèžïážïÚžïÓžïÌžïŞ゙﷞ﰞ艹ïžï†žïžïxžïqžïjžïcžï\žïUžïNžïGžï@žï9žï2žï+žï$žïžïžïžïžïžïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþœï÷œïðœïéœïâœïÛœïÔœïÍœïÆœï¿œï¸œï±œïªœï£œïœœï•œïŽœï‡œï€œïyœïrœïkœïdœï]œïVœïOœïHœïAœï:œï3œï,œï%œïœïœïœï œïœïû›ïô›ïí›ïæ›ïß›ïØ›ïÑ›ïÊ›ïÛ;ﵛﮛ率ï}›ïv›ïo›ïh›ïa›ïZ›ïS›ïL›ïE›ï>›ï7›ï0›ï)›ï"›ï›ï›ï ›ï›ïÿšïøšïñšïêšïãšïÜšïÕšïΚïÇšïÀšï¹šï²šï«šï¤šïšï–šïšïˆšïšïzšïsšïlšïešï^šïWšïPšïIšïBšï;šï4šï-šï&šïšïšïšï šïšïü™ïõ™ïî™ïç™ïà™ïÙ™ïÒ™ïË™ïęyﶙﯙ神ï~™ïw™ïp™ïi™ïb™ï[™ïT™ïM™ïF™ï?™ï8™ï1™ï*™ï#™ï™ï™ï™ï™ï™ïù˜ïò˜ïë˜ïä˜ïݘïÖ˜ïϘïȘïÁ˜ïº˜ï³˜ï¬˜ï¥˜ïž˜ï—˜ï˜ï‰˜ï‚˜ï{˜ït˜ïm˜ïf˜ï_˜ïX˜ïQ˜ïJ˜ïC˜ï<˜ï5˜ï.˜ï'˜ï ˜ï˜ï˜ï ˜ï˜ïý—ïö—ïï—ïè—ïá—ïÚ—ïÓ—ïÌ—ïŗラ﷗ﰗ練ï—ï—ïx—ïq—ïj—ïc—ï\—ïU—ïN—ïG—ï@—ï9—ï2—ï+—ï$—ï—ï—ï—ï—ï—ïú–ïó–ïì–ïå–ïÞ–ï×–ïЖïÉ–ï–ﻖﴖﭖ練ï|–ïu–ïn–ïg–ï`–ïY–ïR–ïK–ïD–ï=–ï6–ï/–ï(–ï!–ï–ï–ï –ï–ïþ•ï÷•ïð•ïé•ïâ•ïÛ•ïÔ•ïÍ•ïÆ•ï¿•ï¸•ï±•ïª•ï£•ïœ•ï••ïŽ•ï‡•ï€•ïy•ïr•ïk•ïd•ï]•ïV•ïO•ïH•ïA•ï:•ï3•ï,•ï%•ï•ï•ï•ï •ï•ïû”ïô”ïí”ïæ”ïß”ïØ”ïÑ”ïÊ”ïÔ4ﵔﮔ倫ï}”ïv”ïo”ïh”ïa”ïZ”ïS”ïL”ïE”ï>”ï7”ï0”ï)”ï"”ï”ï”ï ”ï”ïÿ“ïø“ïñ“ïê“ïã“ïÜ“ïÕ“ïΓïÇ“ïÀ“﹓ﲓ䀘邏ï“ï–“ï“ï“ïz“ïs“ïl“ïe“ï^“ïW“ïP“ïI“ïB“ï;“ï4“ï-“ï&“ï“ï“ï“ï “ï“ïü’ïõ’ïî’ïç’ïà’ïÙ’ïÒ’ïË’ïĒrﶒ﯒晴ï~’ïw’ïp’ïi’ïb’ï[’ïT’ïM’ïF’ï?’ï8’ï1’ï*’ï#’ï’ï’ï’ï’ï’ïù‘ïò‘ïë‘ïä‘ïÝ‘ïÖ‘ïÏ‘ïÈ‘ïÁ‘ﺑﳑ﬑陋ï‘ï{‘ït‘ïm‘ïf‘ï_‘ïX‘ïQ‘ïJ‘ïC‘ï<‘ï5‘ï.‘ï'‘ï ‘ï‘ï‘ï ‘ï‘ïýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþŽï÷ŽïðŽïéŽïâŽïÛŽïÔŽïÍŽïÆŽï¿Žï¸Žï±ŽïªŽï£ŽïœŽï•ŽïŽŽï‡Žï€ŽïyŽïrŽïkŽïdŽï]ŽïVŽïOŽïHŽïAŽï:Žï3Žï,Žï%ŽïŽïŽïŽï ŽïŽïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿŒïøŒïñŒïêŒïãŒïÜŒïÕŒïÎŒïÇŒïÀŒï¹Œï²Œï«Œï¤ŒïŒï–ŒïŒïˆŒïŒïzŒïsŒïlŒïeŒï^ŒïWŒïPŒïIŒïBŒï;Œï4Œï-Œï&ŒïŒïŒïŒï ŒïŒïü‹ïõ‹ïî‹ïç‹ïà‹ïÙ‹ïÒ‹ïË‹ïċkﶋ﯋廓ï~‹ïw‹ïp‹ïi‹ïb‹ï[‹ïT‹ïM‹ïF‹ï?‹ï8‹ï1‹ï*‹ï#‹ï‹ï‹ï‹ï‹ï‹ïùŠïòŠïëŠïäŠïÝŠïÖŠïÏŠïÈŠïÁŠïºŠï³Šï¬Šï¥ŠïžŠï—ŠïŠï‰Šï‚Šï{ŠïtŠïmŠïfŠï_ŠïXŠïQŠïJŠïCŠï<Šï5Šï.Šï'Šï ŠïŠïŠï ŠïŠïý‰ïö‰ïï‰ïè‰ïá‰ïÚ‰ïÓ‰ï̉ïʼnノ﷉ﰉ爫ï‰ï†‰ï‰ïx‰ïq‰ïj‰ïc‰ï\‰ïU‰ïN‰ïG‰ï@‰ï9‰ï2‰ï+‰ï$‰ï‰ï‰ï‰ï‰ï‰ïúˆïóˆïìˆïåˆïÞˆï׈ïЈïɈïˆï»ˆï´ˆï­ˆï¦ˆïŸˆï˜ˆï‘ˆïŠˆïƒˆï|ˆïuˆïnˆïgˆï`ˆïYˆïRˆïKˆïDˆï=ˆï6ˆï/ˆï(ˆï!ˆïˆïˆï ˆïˆïþ‡ï÷‡ïð‡ïé‡ïâ‡ïÛ‡ïÔ‡ï͇ïƇᅦ︇ﱇ慎ïއïy‡ïr‡ïk‡ïd‡ï]‡ïV‡ïO‡ïH‡ïA‡ï:‡ï3‡ï,‡ï%‡ï‡ï‡ï‡ï ‡ï‡ïû†ïô†ïí†ïæ†ï߆ï؆ïцïʆïÆï¼†ïµ†ï®†ï§†ï †ï™†ï’†ï‹†ï„†ï}†ïv†ïo†ïh†ïa†ïZ†ïS†ïL†ïE†ï>†ï7†ï0†ï)†ï"†ï†ï†ï †ï†ïÿ…ïø…ïñ…ïê…ïã…ïÜ…ïÕ…ïÎ…ïÇ…ïÀ…﹅ﲅ鉶串ï…ï–…ï…ï…ïz…ïs…ïl…ïe…ï^…ïW…ïP…ïI…ïB…ï;…ï4…ï-…ï&…ï…ï…ï…ï …ï…ïü„ïõ„ïî„ïç„ïà„ïÙ„ïÒ„ïË„ïĄdﶄ﯄宅ï~„ïw„ïp„ïi„ïb„ï[„ïT„ïM„ïF„ï?„ï8„ï1„ï*„ï#„ï„ï„ï„ï„ï„ïùƒïòƒïëƒïäƒï݃ïÖƒïσïȃïÁƒïºƒï³ƒï¬ƒï¥ƒïžƒï—ƒïƒï‰ƒï‚ƒï{ƒïtƒïmƒïfƒï_ƒïXƒïQƒïJƒïCƒï<ƒï5ƒï.ƒï'ƒï ƒïƒïƒï ƒïƒïý‚ïö‚ïï‚ïè‚ïá‚ïÚ‚ïÓ‚ïÌ‚ïłツﷂﰂ既ï‚ï‚ïx‚ïq‚ïj‚ïc‚ï\‚ïU‚ïN‚ïG‚ï@‚ï9‚ï2‚ï+‚ï$‚ï‚ï‚ï‚ï‚ï‚ïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþ€ï÷€ïð€ïé€ïâ€ïÛ€ïÔ€ïÍ€ïÆ€ï¿€ï¸€ï±€ïª€ï£€ïœ€ï•€ïŽ€ï‡€ï€€ïy€ïr€ïk€ïd€ï]€ïV€ïO€ïH€ïA€ï:€ï3€ï,€ï%€ï€ï€ï€ï €ï€ïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿ~ïø~ïñ~ïê~ïã~ïÜ~ïÕ~ïÎ~ïÇ~ïÀ~ï¹~ï²~ï«~ï¤~ï~ï–~ï~ïˆ~ï~ïz~ïs~ïl~ïe~ï^~ïW~ïP~ïI~ïB~ï;~ï4~ï-~ï&~ï~ï~ï~ï ~ï~ïü}ïõ}ïî}ïç}ïà}ïÙ}ïÒ}ïË}ïÄ}ï½}ï¶}ï¯}ï¨}ï¡}ïš}ï“}ïŒ}ï…}ï~}ïw}ïp}ïi}ïb}ï[}ïT}ïM}ïF}ï?}ï8}ï1}ï*}ï#}ï}ï}ï}ï}ï}ïù|ïò|ïë|ïä|ïÝ|ïÖ|ïÏ|ïÈ|ïÁ|ïº|ï³|ï¬|ï¥|ïž|ï—|ï|ï‰|ï‚|ï{|ït|ïm|ïf|ï_|ïX|ïQ|ïJ|ïC|ï<|ï5|ï.|ï'|ï |ï|ï|ï |ï|ïý{ïö{ïï{ïè{ïá{ïÚ{ïÓ{ïÌ{ïÅ{ï¾{ï·{ï°{ï©{ï¢{ï›{ï”{ï{ï†{ï{ïx{ïq{ïj{ïc{ï\{ïU{ïN{ïG{ï@{ï9{ï2{ï+{ï${ï{ï{ï{ï{ï{ïúzïózïìzïåzïÞzï×zïÐzïÉzïÂzï»zï´zï­zï¦zïŸzï˜zï‘zïŠzïƒzï|zïuzïnzïgzï`zïYzïRzïKzïDzï=zï6zï/zï(zï!zïzïzï zïzïþyï÷yïðyïéyïâyïÛyïÔyïÍyïÆyï¿yï¸yï±yïªyï£yïœyï•yïŽyï‡yï€yïyyïryïkyïdyï]yïVyïOyïHyïAyï:yï3yï,yï%yïyïyïyï yïyïûxïôxïíxïæxïßxïØxïÑxïÊxïÃxï¼xïµxï®xï§xï xï™xï’xï‹xï„xï}xïvxïoxïhxïaxïZxïSxïLxïExï>xï7xï0xï)xï"xïxïxï xïxïÿwïøwïñwïêwïãwïÜwïÕwïÎwïÇwïÀwï¹wï²wï«wï¤wïwï–wïwïˆwïwïzwïswïlwïewï^wïWwïPwïIwïBwï;wï4wï-wï&wïwïwïwï wïwïüvïõvïîvïçvïàvïÙvïÒvïËvïÄvï½vï¶vï¯vï¨vï¡vïšvï“vïŒvï…vï~vïwvïpvïivïbvï[vïTvïMvïFvï?vï8vï1vï*vï#vïvïvïvïvïvïùuïòuïëuïäuïÝuïÖuïÏuïÈuïÁuïºuï³uï¬uï¥uïžuï—uïuï‰uï‚uï{uïtuïmuïfuï_uïXuïQuïJuïCuïqï7qï0qï)qï"qïqïqï qïqïÿpïøpïñpïêpïãpïÜpïÕpïÎpïÇpïÀpï¹pï²pï«pï¤pïpï–pïpïˆpïpïzpïspïlpïepï^pïWpïPpïIpïBpï;pï4pï-pï&pïpïpïpï pïpïüoïõoïîoïçoïàoïÙoïÒoïËoïÄoï½oï¶oï¯oï¨oï¡oïšoï“oïŒoï…oï~oïwoïpoïioïboï[oïToïMoïFoï?oï8oï1oï*oï#oïoïoïoïoïoïùnïònïënïänïÝnïÖnïÏnïÈnïÁnïºnï³nï¬nï¥nïžnï—nïnï‰nï‚nï{nïtnïmnïfnï_nïXnïQnïJnïCnïjï7jï0jï)jï"jïjïjï jïjïÿiïøiïñiïêiïãiïÜiïÕiïÎiïÇiïÀiï¹iï²iï«iï¤iïiï–iïiïˆiïiïziïsiïliïeiï^iïWiïPiïIiïBiï;iï4iï-iï&iïiïiïiï iïiïühïõhïîhïçhïàhïÙhïÒhïËhïÄhï½hï¶hï¯hï¨hï¡hïšhï“hïŒhï…hï~hïwhïphïihïbhï[hïThïMhïFhï?hï8hï1hï*hï#hïhïhïhïhïhïùgïògïëgïägïÝgïÖgïÏgïÈgïÁgïºgï³gï¬gï¥gïžgï—gïgï‰gï‚gï{gïtgïmgïfgï_gïXgïQgïJgïCgïcï7cï0cï)cï"cïcïcï cïcïÿbïøbïñbïêbïãbïÜbïÕbïÎbïÇbïÀbï¹bï²bï«bï¤bïbï–bïbïˆbïbïzbïsbïlbïebï^bïWbïPbïIbïBbï;bï4bï-bï&bïbïbïbï bïbïüaïõaïîaïçaïàaïÙaïÒaïËaïÄaï½aï¶aï¯aï¨aï¡aïšaï“aïŒaï…aï~aïwaïpaïiaïbaï[aïTaïMaïFaï?aï8aï1aï*aï#aïaïaïaïaïaïù`ïò`ïë`ïä`ïÝ`ïÖ`ïÏ`ïÈ`ïÁ`ïº`ï³`ï¬`ï¥`ïž`ï—`ï`ï‰`ï‚`ï{`ït`ïm`ïf`ï_`ïX`ïQ`ïJ`ïC`ï<`ï5`ï.`ï'`ï `ï`ï`ï `ï`ïý_ïö_ïï_ïè_ïá_ïÚ_ïÓ_ïÌ_ïÅ_ï¾_ï·_ï°_ï©_ï¢_ï›_ï”_ï_ï†_ï_ïx_ïq_ïj_ïc_ï\_ïU_ïN_ïG_ï@_ï9_ï2_ï+_ï$_ï_ï_ï_ï_ï_ïú^ïó^ïì^ïå^ïÞ^ï×^ïÐ^ïÉ^ïÂ^ï»^ï´^ï­^ï¦^ïŸ^ï˜^ï‘^ïŠ^ïƒ^ï|^ïu^ïn^ïg^ï`^ïY^ïR^ïK^ïD^ï=^ï6^ï/^ï(^ï!^ï^ï^ï ^ï^ïþ]ï÷]ïð]ïé]ïâ]ïÛ]ïÔ]ïÍ]ïÆ]ï¿]ï¸]ï±]ïª]ï£]ïœ]ï•]ïŽ]ï‡]ï€]ïy]ïr]ïk]ïd]ï]]ïV]ïO]ïH]ïA]ï:]ï3]ï,]ï%]ï]ï]ï]ï ]ï]ïû\ïô\ïí\ïæ\ïß\ïØ\ïÑ\ïÊ\ïÃ\ï¼\ïµ\ï®\ï§\ï \ï™\ï’\ï‹\ï„\ï}\ïv\ïo\ïh\ïa\ïZ\ïS\ïL\ïE\ï>\ï7\ï0\ï)\ï"\ï\ï\ï \ï\ïÿ[ïø[ïñ[ïê[ïã[ïÜ[ïÕ[ïÎ[ïÇ[ïÀ[ï¹[ï²[ï«[ï¤[ï[ï–[ï[ïˆ[ï[ïz[ïs[ïl[ïe[ï^[ïW[ïP[ïI[ïB[ï;[ï4[ï-[ï&[ï[ï[ï[ï [ï[ïüZïõZïîZïçZïàZïÙZïÒZïËZïÄZï½Zï¶Zï¯Zï¨Zï¡ZïšZï“ZïŒZï…Zï~ZïwZïpZïiZïbZï[ZïTZïMZïFZï?Zï8Zï1Zï*Zï#ZïZïZïZïZïZïùYïòYïëYïäYïÝYïÖYïÏYïÈYïÁYïºYï³Yï¬Yï¥YïžYï—YïYï‰Yï‚Yï{YïtYïmYïfYï_YïXYïQYïJYïCYïUï7Uï0Uï)Uï"UïUïUï UïUïÿTïøTïñTïêTïãTïÜTïÕTïÎTïÇTïÀTï¹Tï²Tï«Tï¤TïTï–TïTïˆTïTïzTïsTïlTïeTï^TïWTïPTïITïBTï;Tï4Tï-Tï&TïTïTïTï TïTïüSïõSïîSïçSïàSïÙSïÒSïËSïÄSï½Sï¶Sï¯Sï¨Sï¡SïšSï“SïŒSï…Sï~SïwSïpSïiSïbSï[SïTSïMSïFSï?Sï8Sï1Sï*Sï#SïSïSïSïSïSïùRïòRïëRïäRïÝRïÖRïÏRïÈRïÁRïºRï³Rï¬Rï¥RïžRï—RïRï‰Rï‚Rï{RïtRïmRïfRï_RïXRïQRïJRïCRïNï7Nï0Nï)Nï"NïNïNï NïNïÿMïøMïñMïêMïãMïÜMïÕMïÎMïÇMïÀMï¹Mï²Mï«Mï¤MïMï–MïMïˆMïMïzMïsMïlMïeMï^MïWMïPMïIMïBMï;Mï4Mï-Mï&MïMïMïMï MïMïüLïõLïîLïçLïàLïÙLïÒLïËLïÄLï½Lï¶Lï¯Lï¨Lï¡LïšLï“LïŒLï…Lï~LïwLïpLïiLïbLï[LïTLïMLïFLï?Lï8Lï1Lï*Lï#LïLïLïLïLïLïùKïòKïëKïäKïÝKïÖKïÏKïÈKïÁKïºKï³Kï¬Kï¥KïžKï—KïKï‰Kï‚Kï{KïtKïmKïfKï_KïXKïQKïJKïCKïGï7Gï0Gï)Gï"GïGïGï GïGïÿFïøFïñFïêFïãFïÜFïÕFïÎFïÇFïÀFï¹Fï²Fï«Fï¤FïFï–FïFïˆFïFïzFïsFïlFïeFï^FïWFïPFïIFïBFï;Fï4Fï-Fï&FïFïFïFï FïFïüEïõEïîEïçEïàEïÙEïÒEïËEïÄEï½Eï¶Eï¯Eï¨Eï¡EïšEï“EïŒEï…Eï~EïwEïpEïiEïbEï[EïTEïMEïFEï?Eï8Eï1Eï*Eï#EïEïEïEïEïEïùDïòDïëDïäDïÝDïÖDïÏDïÈDïÁDïºDï³Dï¬Dï¥DïžDï—DïDï‰Dï‚Dï{DïtDïmDïfDï_DïXDïQDïJDïCDï@ï7@ï0@ï)@ï"@ï@ï@ï @ï@ïÿ?ïø?ïñ?ïê?ïã?ïÜ?ïÕ?ïÎ?ïÇ?ïÀ?ï¹?ï²?ï«?ï¤?ï?ï–?ï?ïˆ?ï?ïz?ïs?ïl?ïe?ï^?ïW?ïP?ïI?ïB?ï;?ï4?ï-?ï&?ï?ï?ï?ï ?ï?ïü>ïõ>ïî>ïç>ïà>ïÙ>ïÒ>ïË>ïÄ>ï½>ï¶>ï¯>ï¨>ï¡>ïš>ï“>ïŒ>ï…>ï~>ïw>ïp>ïi>ïb>ï[>ïT>ïM>ïF>ï?>ï8>ï1>ï*>ï#>ï>ï>ï>ï>ï>ïù=ïò=ïë=ïä=ïÝ=ïÖ=ïÏ=ïÈ=ïÁ=ïº=ï³=ï¬=ï¥=ïž=ï—=ï=ï‰=ï‚=ï{=ït=ïm=ïf=ï_=ïX=ïQ=ïJ=ïC=ï<=ï5=ï.=ï'=ï =ï=ï=ï =ï=ïý<ïö<ïï<ïè<ïá<ïÚ<ïÓ<ïÌ<ïÅ<ï¾<ï·<ï°<ï©<ï¢<ï›<ï”<ï<ï†<ï<ïx<ïq<ïj<ïc<ï\<ïU<ïN<ïG<ï@<ï9<ï2<ï+<ï$<ï<ï<ï<ï<ï<ïú;ïó;ïì;ïå;ïÞ;ï×;ïÐ;ïÉ;ïÂ;ï»;ï´;ï­;ï¦;ïŸ;ï˜;ï‘;ïŠ;ïƒ;ï|;ïu;ïn;ïg;ï`;ïY;ïR;ïK;ïD;ï=;ï6;ï/;ï(;ï!;ï;ï;ï ;ï;ïþ:ï÷:ïð:ïé:ïâ:ïÛ:ïÔ:ïÍ:ïÆ:ï¿:ï¸:ï±:ïª:ï£:ïœ:ï•:ïŽ:ï‡:ï€:ïy:ïr:ïk:ïd:ï]:ïV:ïO:ïH:ïA:ï::ï3:ï,:ï%:ï:ï:ï:ï :ï:ïû9ïô9ïí9ïæ9ïß9ïØ9ïÑ9ïÊ9ïÃ9ï¼9ïµ9ï®9ï§9ï 9ï™9ï’9ï‹9ï„9ï}9ïv9ïo9ïh9ïa9ïZ9ïS9ïL9ïE9ï>9ï79ï09ï)9ï"9ï9ï9ï 9ï9ïÿ8ïø8ïñ8ïê8ïã8ïÜ8ïÕ8ïÎ8ïÇ8ïÀ8ï¹8ï²8ï«8ï¤8ï8ï–8ï8ïˆ8ï8ïz8ïs8ïl8ïe8ï^8ïW8ïP8ïI8ïB8ï;8ï48ï-8ï&8ï8ï8ï8ï 8ï8ïü7ïõ7ïî7ïç7ïà7ïÙ7ïÒ7ïË7ïÄ7ï½7ï¶7ï¯7ï¨7ï¡7ïš7ï“7ïŒ7ï…7ï~7ïw7ïp7ïi7ïb7ï[7ïT7ïM7ïF7ï?7ï87ï17ï*7ï#7ï7ï7ï7ï7ï7ïù6ïò6ïë6ïä6ïÝ6ïÖ6ïÏ6ïÈ6ïÁ6ïº6ï³6ï¬6ï¥6ïž6ï—6ï6ï‰6ï‚6ï{6ït6ïm6ïf6ï_6ïX6ïQ6ïJ6ïC6ï<6ï56ï.6ï'6ï 6ï6ï6ï 6ï6ïý5ïö5ïï5ïè5ïá5ïÚ5ïÓ5ïÌ5ïÅ5ï¾5ï·5ï°5ï©5ï¢5ï›5ï”5ï5ï†5ï5ïx5ïq5ïj5ïc5ï\5ïU5ïN5ïG5ï@5ï95ï25ï+5ï$5ï5ï5ï5ï5ï5ïú4ïó4ïì4ïå4ïÞ4ï×4ïÐ4ïÉ4ïÂ4ï»4ï´4ï­4ï¦4ïŸ4ï˜4ï‘4ïŠ4ïƒ4ï|4ïu4ïn4ïg4ï`4ïY4ïR4ïK4ïD4ï=4ï64ï/4ï(4ï!4ï4ï4ï 4ï4ïþ3ï÷3ïð3ïé3ïâ3ïÛ3ïÔ3ïÍ3ïÆ3ï¿3ï¸3ï±3ïª3ï£3ïœ3ï•3ïŽ3ï‡3ï€3ïy3ïr3ïk3ïd3ï]3ïV3ïO3ïH3ïA3ï:3ï33ï,3ï%3ï3ï3ï3ï 3ï3ïû2ïô2ïí2ïæ2ïß2ïØ2ïÑ2ïÊ2ïÃ2ï¼2ïµ2ï®2ï§2ï 2ï™2ï’2ï‹2ï„2ï}2ïv2ïo2ïh2ïa2ïZ2ïS2ïL2ïE2ï>2ï72ï02ï)2ï"2ï2ï2ï 2ï2ïÿ1ïø1ïñ1ïê1ïã1ïÜ1ïÕ1ïÎ1ïÇ1ïÀ1ï¹1ï²1ï«1ï¤1ï1ï–1ï1ïˆ1ï1ïz1ïs1ïl1ïe1ï^1ïW1ïP1ïI1ïB1ï;1ï41ï-1ï&1ï1ï1ï1ï 1ï1ïü0ïõ0ïî0ïç0ïà0ïÙ0ïÒ0ïË0ïÄ0ï½0ï¶0ï¯0ï¨0ï¡0ïš0ï“0ïŒ0ï…0ï~0ïw0ïp0ïi0ïb0ï[0ïT0ïM0ïF0ï?0ï80ï10ï*0ï#0ï0ï0ï0ï0ï0ïù/ïò/ïë/ïä/ïÝ/ïÖ/ïÏ/ïÈ/ïÁ/ïº/ï³/ï¬/ï¥/ïž/ï—/ï/ï‰/ï‚/ï{/ït/ïm/ïf/ï_/ïX/ïQ/ïJ/ïC/ï+ï7+ï0+ï)+ï"+ï+ï+ï +ï+ïÿ*ïø*ïñ*ïê*ïã*ïÜ*ïÕ*ïÎ*ïÇ*ïÀ*ï¹*ï²*ï«*ï¤*ï*ï–*ï*ïˆ*ï*ïz*ïs*ïl*ïe*ï^*ïW*ïP*ïI*ïB*ï;*ï4*ï-*ï&*ï*ï*ï*ï *ï*ïü)ïõ)ïî)ïç)ïà)ïÙ)ïÒ)ïË)ïÄ)ï½)ï¶)ï¯)ï¨)ï¡)ïš)ï“)ïŒ)ï…)ï~)ïw)ïp)ïi)ïb)ï[)ïT)ïM)ïF)ï?)ï8)ï1)ï*)ï#)ï)ï)ï)ï)ï)ïù(ïò(ïë(ïä(ïÝ(ïÖ(ïÏ(ïÈ(ïÁ(ïº(ï³(ï¬(ï¥(ïž(ï—(ï(ï‰(ï‚(ï{(ït(ïm(ïf(ï_(ïX(ïQ(ïJ(ïC(ï<(ï5(ï.(ï'(ï (ï(ï(ï (ï(ïý'ïö'ïï'ïè'ïá'ïÚ'ïÓ'ïÌ'ïÅ'ï¾'ï·'ï°'ï©'ï¢'ï›'ï”'ï'ï†'ï'ïx'ïq'ïj'ïc'ï\'ïU'ïN'ïG'ï@'ï9'ï2'ï+'ï$'ï'ï'ï'ï'ï'ïú&ïó&ïì&ïå&ïÞ&ï×&ïÐ&ïÉ&ïÂ&ï»&ï´&ï­&ï¦&ïŸ&ï˜&ï‘&ïŠ&ïƒ&ï|&ïu&ïn&ïg&ï`&ïY&ïR&ïK&ïD&ï=&ï6&ï/&ï(&ï!&ï&ï&ï &ï&ïþ%ï÷%ïð%ïé%ïâ%ïÛ%ïÔ%ïÍ%ïÆ%ï¿%ï¸%ï±%ïª%ï£%ïœ%ï•%ïŽ%ï‡%ï€%ïy%ïr%ïk%ïd%ï]%ïV%ïO%ïH%ïA%ï:%ï3%ï,%ï%%ï%ï%ï%ï %ï%ïû$ïô$ïí$ïæ$ïß$ïØ$ïÑ$ïÊ$ïÃ$ï¼$ïµ$ï®$ï§$ï $ï™$ï’$ï‹$ï„$ï}$ïv$ïo$ïh$ïa$ïZ$ïS$ïL$ïE$ï>$ï7$ï0$ï)$ï"$ï$ï$ï $ï$ïÿ#ïø#ïñ#ïê#ïã#ïÜ#ïÕ#ïÎ#ïÇ#ïÀ#ï¹#ï²#ï«#ï¤#ï#ï–#ï#ïˆ#ï#ïz#ïs#ïl#ïe#ï^#ïW#ïP#ïI#ïB#ï;#ï4#ï-#ï&#ï#ï#ï#ï #ï#ïü"ïõ"ïî"ïç"ïà"ïÙ"ïÒ"ïË"ïÄ"ï½"ï¶"ï¯"ï¨"ï¡"ïš"ï“"ïŒ"ï…"ï~"ïw"ïp"ïi"ïb"ï["ïT"ïM"ïF"ï?"ï8"ï1"ï*"ï#"ï"ï"ï"ï"ï"ïù!ïò!ïë!ïä!ïÝ!ïÖ!ïÏ!ïÈ!ïÁ!ïº!ï³!ï¬!ï¥!ïž!ï—!ï!ï‰!ï‚!ï{!ït!ïm!ïf!ï_!ïX!ïQ!ïJ!ïC!ïï7ï0ï)ï"ïïï ïïÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïü ïõ ïî ïç ïà ïÙ ïÒ ïË ïÄ ï½ ï¶ ï¯ ï¨ ï¡ ïš ï“ ïŒ ï… ï~ ïw ïp ïi ïb ï[ ïT ïM ïF ï? ï8 ï1 ï* ï# ï ï ï ï ï ïù ïò ïë ïä ïÝ ïÖ ïÏ ïÈ ïÁ ïº ï³ ï¬ ï¥ ïž ï— ï ï‰ ï‚ ï{ ït ïm ïf ï_ ïX ïQ ïJ ïC ï< ï5 ï. ï' ï ï ï ï ï ïý ïö ïï ïè ïá ïÚ ïÓ ïÌ ïÅ ï¾ ï· ï° ï© ï¢ ï› ï” ï ï† ï ïx ïq ïj ïc ï\ ïU ïN ïG ï@ ï9 ï2 ï+ ï$ ï ï ï ï ï ïú ïó ïì ïå ïÞ ï× ïÐ ïÉ ï ï» ï´ ï­ ï¦ ïŸ ï˜ ï‘ ïŠ ïƒ ï| ïu ïn ïg ï` ïY ïR ïK ïD ï= ï6 ï/ ï( ï! ï ï ï ï ïþ ï÷ ïð ïé ïâ ïÛ ïÔ ïÍ ïÆ ï¿ ï¸ ï± ïª ï£ ïœ ï• ïŽ ï‡ ï€ ïy ïr ïk ïd ï] ïV ïO ïH ïA ï: ï3 ï, ï% ï ï ï ï ï ïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüÿîõÿîîÿîçÿîàÿîÙÿîÒÿîËÿîÄÿî½ÿî¶ÿî¯ÿî¨ÿî¡ÿîšÿî“ÿîŒÿî…ÿî~ÿîwÿîpÿîiÿîbÿî[ÿîTÿîMÿîFÿî?ÿî8ÿî1ÿî*ÿî#ÿîÿîÿîÿîÿîÿîùþîòþîëþîäþîÝþîÖþîÏþîÈþîÁþîºþî³þî¬þî¥þîžþî—þîþî‰þî‚þî{þîtþîmþîfþî_þîXþîQþîJþîCþî<þî5þî.þî'þî þîþîþî þîþîýýîöýîïýîèýîáýîÚýîÓýîÌýîÅýî¾ýî·ýî°ýî©ýî¢ýî›ýî”ýîýî†ýîýîxýîqýîjýîcýî\ýîUýîNýîGýî@ýî9ýî2ýî+ýî$ýîýîýîýîýîýîúüîóüîìüîåüîÞüî×üîÐüîÉüîÂüî»üî´üî­üî¦üîŸüî˜üî‘üîŠüîƒüî|üîuüînüîgüî`üîYüîRüîKüîDüî=üî6üî/üî(üî!üîüîüî üîüîþûî÷ûîðûîéûîâûîÛûîÔûîÍûîÆûî¿ûî¸ûî±ûîªûî£ûîœûî•ûîŽûî‡ûî€ûîyûîrûîkûîdûî]ûîVûîOûîHûîAûî:ûî3ûî,ûî%ûîûîûîûî ûîûîûúîôúîíúîæúîßúîØúîÑúîÊúîÃúî¼úîµúî®úî§úî úî™úî’úî‹úî„úî}úîvúîoúîhúîaúîZúîSúîLúîEúî>úî7úî0úî)úî"úîúîúî úîúîÿùîøùîñùîêùîãùîÜùîÕùîÎùîÇùîÀùî¹ùî²ùî«ùî¤ùîùî–ùîùîˆùîùîzùîsùîlùîeùî^ùîWùîPùîIùîBùî;ùî4ùî-ùî&ùîùîùîùî ùîùîüøîõøîîøîçøîàøîÙøîÒøîËøîÄøî½øî¶øî¯øî¨øî¡øîšøî“øîŒøî…øî~øîwøîpøîiøîbøî[øîTøîMøîFøî?øî8øî1øî*øî#øîøîøîøîøîøîù÷îò÷îë÷îä÷îÝ÷îÖ÷îÏ÷îÈ÷îÁ÷îº÷î³÷î¬÷î¥÷îž÷î—÷î÷î‰÷î‚÷î{÷ît÷îm÷îf÷î_÷îX÷îQ÷îJ÷îC÷î<÷î5÷î.÷î'÷î ÷î÷î÷î ÷î÷îýöîööîïöîèöîáöîÚöîÓöîÌöîÅöî¾öî·öî°öî©öî¢öî›öî”öîöî†öîöîxöîqöîjöîcöî\öîUöîNöîGöî@öî9öî2öî+öî$öîöîöîöîöîöîúõîóõîìõîåõîÞõî×õîÐõîÉõîÂõî»õî´õî­õî¦õîŸõî˜õî‘õîŠõîƒõî|õîuõînõîgõî`õîYõîRõîKõîDõî=õî6õî/õî(õî!õîõîõî õîõîþôî÷ôîðôîéôîâôîÛôîÔôîÍôîÆôî¿ôî¸ôî±ôîªôî£ôîœôî•ôîŽôî‡ôî€ôîyôîrôîkôîdôî]ôîVôîOôîHôîAôî:ôî3ôî,ôî%ôîôîôîôî ôîôîûóîôóîíóîæóîßóîØóîÑóîÊóîÃóî¼óîµóî®óî§óî óî™óî’óî‹óî„óî}óîvóîoóîhóîaóîZóîSóîLóîEóî>óî7óî0óî)óî"óîóîóî óîóîÿòîøòîñòîêòîãòîÜòîÕòîÎòîÇòîÀòî¹òî²òî«òî¤òîòî–òîòîˆòîòîzòîsòîlòîeòî^òîWòîPòîIòîBòî;òî4òî-òî&òîòîòîòî òîòîüñîõñîîñîçñîàñîÙñîÒñîËñîÄñî½ñî¶ñî¯ñî¨ñî¡ñîšñî“ñîŒñî…ñî~ñîwñîpñîiñîbñî[ñîTñîMñîFñî?ñî8ñî1ñî*ñî#ñîñîñîñîñîñîùðîòðîëðîäðîÝðîÖðîÏðîÈðîÁðîºðî³ðî¬ðî¥ðîžðî—ðîðî‰ðî‚ðî{ðîtðîmðîfðî_ðîXðîQðîJðîCðî<ðî5ðî.ðî'ðî ðîðîðî ðîðîýïîöïîïïîèïîáïîÚïîÓïîÌïîÅïî¾ïî·ïî°ïî©ïî¢ïî›ïî”ïîïî†ïîïîxïîqïîjïîcïî\ïîUïîNïîGïî@ïî9ïî2ïî+ïî$ïîïîïîïîïîïîúîîóîîìîîåîîÞîî×îîÐîîÉîîÂîî»îî´îî­îî¦îîŸîî˜îî‘îîŠîîƒîî|îîuîînîîgîî`îîYîîRîîKîîDîî=îî6îî/îî(îî!îîîîîî îîîîþíî÷íîðíîéíîâíîÛíîÔíîÍíîÆíî¿íî¸íî±íîªíî£íîœíî•íîŽíî‡íî€íîyíîríîkíîdíî]íîVíîOíîHíîAíî:íî3íî,íî%íîíîíîíî íîíîûìîôìîíìîæìîßìîØìîÑìîÊìîÃìî¼ìîµìî®ìî§ìî ìî™ìî’ìî‹ìî„ìî}ìîvìîoìîhìîaìîZìîSìîLìîEìî>ìî7ìî0ìî)ìî"ìîìîìî ìîìîÿëîøëîñëîêëîãëîÜëîÕëîÎëîÇëîÀëî¹ëî²ëî«ëî¤ëîëî–ëîëîˆëîëîzëîsëîlëîeëî^ëîWëîPëîIëîBëî;ëî4ëî-ëî&ëîëîëîëî ëîëîüêîõêîîêîçêîàêîÙêîÒêîËêîÄêî½êî¶êî¯êî¨êî¡êîšêî“êîŒêî…êî~êîwêîpêîiêîbêî[êîTêîMêîFêî?êî8êî1êî*êî#êîêîêîêîêîêîùéîòéîëéîäéîÝéîÖéîÏéîÈéîÁéîºéî³éî¬éî¥éîžéî—éîéî‰éî‚éî{éîtéîméîféî_éîXéîQéîJéîCéî<éî5éî.éî'éî éîéîéî éîéîýèîöèîïèîèèîáèîÚèîÓèîÌèîÅèî¾èî·èî°èî©èî¢èî›èî”èîèî†èîèîxèîqèîjèîcèî\èîUèîNèîGèî@èî9èî2èî+èî$èîèîèîèîèîèîúçîóçîìçîåçîÞçî×çîÐçîÉçîÂçî»çî´çî­çî¦çîŸçî˜çî‘çîŠçîƒçî|çîuçînçîgçî`çîYçîRçîKçîDçî=çî6çî/çî(çî!çîçîçî çîçîþæî÷æîðæîéæîâæîÛæîÔæîÍæîÆæî¿æî¸æî±æîªæî£æîœæî•æîŽæî‡æî€æîyæîræîkæîdæî]æîVæîOæîHæîAæî:æî3æî,æî%æîæîæîæî æîæîûåîôåîíåîæåîßåîØåîÑåîÊåîÃåî¼åîµåî®åî§åî åî™åî’åî‹åî„åî}åîvåîoåîhåîaåîZåîSåîLåîEåî>åî7åî0åî)åî"åîåîåî åîåîÿäîøäîñäîêäîãäîÜäîÕäîÎäîÇäîÀäî¹äî²äî«äî¤äîäî–äîäîˆäîäîzäîsäîläîeäî^äîWäîPäîIäîBäî;äî4äî-äî&äîäîäîäî äîäîüãîõãîîãîçãîàãîÙãîÒãîËãîÄãî½ãî¶ãî¯ãî¨ãî¡ãîšãî“ãîŒãî…ãî~ãîwãîpãîiãîbãî[ãîTãîMãîFãî?ãî8ãî1ãî*ãî#ãîãîãîãîãîãîùâîòâîëâîäâîÝâîÖâîÏâîÈâîÁâîºâî³âî¬âî¥âîžâî—âîâî‰âî‚âî{âîtâîmâîfâî_âîXâîQâîJâîCâî<âî5âî.âî'âî âîâîâî âîâîýáîöáîïáîèáîááîÚáîÓáîÌáîÅáî¾áî·áî°áî©áî¢áî›áî”áîáî†áîáîxáîqáîjáîcáî\áîUáîNáîGáî@áî9áî2áî+áî$áîáîáîáîáîáîúàîóàîìàîåàîÞàî×àîÐàîÉàîÂàî»àî´àî­àî¦àîŸàî˜àî‘àîŠàîƒàî|àîuàînàîgàî`àîYàîRàîKàîDàî=àî6àî/àî(àî!àîàîàî àîàîþßî÷ßîðßîéßîâßîÛßîÔßîÍßîÆßî¿ßî¸ßî±ßîªßî£ßîœßî•ßîŽßî‡ßî€ßîyßîrßîkßîdßî]ßîVßîOßîHßîAßî:ßî3ßî,ßî%ßîßîßîßî ßîßîûÞîôÞîíÞîæÞîßÞîØÞîÑÞîÊÞîÃÞî¼ÞîµÞî®Þî§Þî Þî™Þî’Þî‹Þî„Þî}ÞîvÞîoÞîhÞîaÞîZÞîSÞîLÞîEÞî>Þî7Þî0Þî)Þî"ÞîÞîÞî ÞîÞîÿÝîøÝîñÝîêÝîãÝîÜÝîÕÝîÎÝîÇÝîÀÝî¹Ýî²Ýî«Ýî¤ÝîÝî–ÝîÝîˆÝîÝîzÝîsÝîlÝîeÝî^ÝîWÝîPÝîIÝîBÝî;Ýî4Ýî-Ýî&ÝîÝîÝîÝî ÝîÝîüÜîõÜîîÜîçÜîàÜîÙÜîÒÜîËÜîÄÜî½Üî¶Üî¯Üî¨Üî¡ÜîšÜî“ÜîŒÜî…Üî~ÜîwÜîpÜîiÜîbÜî[ÜîTÜîMÜîFÜî?Üî8Üî1Üî*Üî#ÜîÜîÜîÜîÜîÜîùÛîòÛîëÛîäÛîÝÛîÖÛîÏÛîÈÛîÁÛîºÛî³Ûî¬Ûî¥ÛîžÛî—ÛîÛî‰Ûî‚Ûî{ÛîtÛîmÛîfÛî_ÛîXÛîQÛîJÛîCÛî<Ûî5Ûî.Ûî'Ûî ÛîÛîÛî ÛîÛîýÚîöÚîïÚîèÚîáÚîÚÚîÓÚîÌÚîÅÚî¾Úî·Úî°Úî©Úî¢Úî›Úî”ÚîÚî†ÚîÚîxÚîqÚîjÚîcÚî\ÚîUÚîNÚîGÚî@Úî9Úî2Úî+Úî$ÚîÚîÚîÚîÚîÚîúÙîóÙîìÙîåÙîÞÙî×ÙîÐÙîÉÙîÂÙî»Ùî´Ùî­Ùî¦ÙîŸÙî˜Ùî‘ÙîŠÙîƒÙî|ÙîuÙînÙîgÙî`ÙîYÙîRÙîKÙîDÙî=Ùî6Ùî/Ùî(Ùî!ÙîÙîÙî ÙîÙîþØî÷ØîðØîéØîâØîÛØîÔØîÍØîÆØî¿Øî¸Øî±ØîªØî£ØîœØî•ØîŽØî‡Øî€ØîyØîrØîkØîdØî]ØîVØîOØîHØîAØî:Øî3Øî,Øî%ØîØîØîØî ØîØîû×îô×îí×îæ×îß×îØ×îÑ×îÊ×îÃ×î¼×îµ×î®×î§×î ×î™×î’×î‹×î„×î}×îv×îo×îh×îa×îZ×îS×îL×îE×î>×î7×î0×î)×î"×î×î×î ×î×îÿÖîøÖîñÖîêÖîãÖîÜÖîÕÖîÎÖîÇÖîÀÖî¹Öî²Öî«Öî¤ÖîÖî–ÖîÖîˆÖîÖîzÖîsÖîlÖîeÖî^ÖîWÖîPÖîIÖîBÖî;Öî4Öî-Öî&ÖîÖîÖîÖî ÖîÖîüÕîõÕîîÕîçÕîàÕîÙÕîÒÕîËÕîÄÕî½Õî¶Õî¯Õî¨Õî¡ÕîšÕî“ÕîŒÕî…Õî~ÕîwÕîpÕîiÕîbÕî[ÕîTÕîMÕîFÕî?Õî8Õî1Õî*Õî#ÕîÕîÕîÕîÕîÕîùÔîòÔîëÔîäÔîÝÔîÖÔîÏÔîÈÔîÁÔîºÔî³Ôî¬Ôî¥ÔîžÔî—ÔîÔî‰Ôî‚Ôî{ÔîtÔîmÔîfÔî_ÔîXÔîQÔîJÔîCÔî<Ôî5Ôî.Ôî'Ôî ÔîÔîÔî ÔîÔîýÓîöÓîïÓîèÓîáÓîÚÓîÓÓîÌÓîÅÓî¾Óî·Óî°Óî©Óî¢Óî›Óî”ÓîÓî†ÓîÓîxÓîqÓîjÓîcÓî\ÓîUÓîNÓîGÓî@Óî9Óî2Óî+Óî$ÓîÓîÓîÓîÓîÓîúÒîóÒîìÒîåÒîÞÒî×ÒîÐÒîÉÒîÂÒî»Òî´Òî­Òî¦ÒîŸÒî˜Òî‘ÒîŠÒîƒÒî|ÒîuÒînÒîgÒî`ÒîYÒîRÒîKÒîDÒî=Òî6Òî/Òî(Òî!ÒîÒîÒî ÒîÒîþÑî÷ÑîðÑîéÑîâÑîÛÑîÔÑîÍÑîÆÑî¿Ñî¸Ñî±ÑîªÑî£ÑîœÑî•ÑîŽÑî‡Ñî€ÑîyÑîrÑîkÑîdÑî]ÑîVÑîOÑîHÑîAÑî:Ñî3Ñî,Ñî%ÑîÑîÑîÑî ÑîÑîûÐîôÐîíÐîæÐîßÐîØÐîÑÐîÊÐîÃÐî¼ÐîµÐî®Ðî§Ðî Ðî™Ðî’Ðî‹Ðî„Ðî}ÐîvÐîoÐîhÐîaÐîZÐîSÐîLÐîEÐî>Ðî7Ðî0Ðî)Ðî"ÐîÐîÐî ÐîÐîÿÏîøÏîñÏîêÏîãÏîÜÏîÕÏîÎÏîÇÏîÀÏî¹Ïî²Ïî«Ïî¤ÏîÏî–ÏîÏîˆÏîÏîzÏîsÏîlÏîeÏî^ÏîWÏîPÏîIÏîBÏî;Ïî4Ïî-Ïî&ÏîÏîÏîÏî ÏîÏîüÎîõÎîîÎîçÎîàÎîÙÎîÒÎîËÎîÄÎî½Îî¶Îî¯Îî¨Îî¡ÎîšÎî“ÎîŒÎî…Îî~ÎîwÎîpÎîiÎîbÎî[ÎîTÎîMÎîFÎî?Îî8Îî1Îî*Îî#ÎîÎîÎîÎîÎîÎîùÍîòÍîëÍîäÍîÝÍîÖÍîÏÍîÈÍîÁÍîºÍî³Íî¬Íî¥ÍîžÍî—ÍîÍî‰Íî‚Íî{ÍîtÍîmÍîfÍî_ÍîXÍîQÍîJÍîCÍî<Íî5Íî.Íî'Íî ÍîÍîÍî ÍîÍîýÌîöÌîïÌîèÌîáÌîÚÌîÓÌîÌÌîÅÌî¾Ìî·Ìî°Ìî©Ìî¢Ìî›Ìî”ÌîÌî†ÌîÌîxÌîqÌîjÌîcÌî\ÌîUÌîNÌîGÌî@Ìî9Ìî2Ìî+Ìî$ÌîÌîÌîÌîÌîÌîúËîóËîìËîåËîÞËî×ËîÐËîÉËîÂËî»Ëî´Ëî­Ëî¦ËîŸËî˜Ëî‘ËîŠËîƒËî|ËîuËînËîgËî`ËîYËîRËîKËîDËî=Ëî6Ëî/Ëî(Ëî!ËîËîËî ËîËîþÊî÷ÊîðÊîéÊîâÊîÛÊîÔÊîÍÊîÆÊî¿Êî¸Êî±ÊîªÊî£ÊîœÊî•ÊîŽÊî‡Êî€ÊîyÊîrÊîkÊîdÊî]ÊîVÊîOÊîHÊîAÊî:Êî3Êî,Êî%ÊîÊîÊîÊî ÊîÊîûÉîôÉîíÉîæÉîßÉîØÉîÑÉîÊÉîÃÉî¼ÉîµÉî®Éî§Éî Éî™Éî’Éî‹Éî„Éî}ÉîvÉîoÉîhÉîaÉîZÉîSÉîLÉîEÉî>Éî7Éî0Éî)Éî"ÉîÉîÉî ÉîÉîÿÈîøÈîñÈîêÈîãÈîÜÈîÕÈîÎÈîÇÈîÀÈî¹Èî²Èî«Èî¤ÈîÈî–ÈîÈîˆÈîÈîzÈîsÈîlÈîeÈî^ÈîWÈîPÈîIÈîBÈî;Èî4Èî-Èî&ÈîÈîÈîÈî ÈîÈîüÇîõÇîîÇîçÇîàÇîÙÇîÒÇîËÇîÄÇî½Çî¶Çî¯Çî¨Çî¡ÇîšÇî“ÇîŒÇî…Çî~ÇîwÇîpÇîiÇîbÇî[ÇîTÇîMÇîFÇî?Çî8Çî1Çî*Çî#ÇîÇîÇîÇîÇîÇîùÆîòÆîëÆîäÆîÝÆîÖÆîÏÆîÈÆîÁÆîºÆî³Æî¬Æî¥ÆîžÆî—ÆîÆî‰Æî‚Æî{ÆîtÆîmÆîfÆî_ÆîXÆîQÆîJÆîCÆî<Æî5Æî.Æî'Æî ÆîÆîÆî ÆîÆîýÅîöÅîïÅîèÅîáÅîÚÅîÓÅîÌÅîÅÅî¾Åî·Åî°Åî©Åî¢Åî›Åî”ÅîÅî†ÅîÅîxÅîqÅîjÅîcÅî\ÅîUÅîNÅîGÅî@Åî9Åî2Åî+Åî$ÅîÅîÅîÅîÅîÅîúÄîóÄîìÄîåÄîÞÄî×ÄîÐÄîÉÄîÂÄî»Äî´Äî­Äî¦ÄîŸÄî˜Äî‘ÄîŠÄîƒÄî|ÄîuÄînÄîgÄî`ÄîYÄîRÄîKÄîDÄî=Äî6Äî/Äî(Äî!ÄîÄîÄî ÄîÄîþÃî÷ÃîðÃîéÃîâÃîÛÃîÔÃîÍÃîÆÃî¿Ãî¸Ãî±ÃîªÃî£ÃîœÃî•ÃîŽÃî‡Ãî€ÃîyÃîrÃîkÃîdÃî]ÃîVÃîOÃîHÃîAÃî:Ãî3Ãî,Ãî%ÃîÃîÃîÃî ÃîÃîûÂîôÂîíÂîæÂîßÂîØÂîÑÂîÊÂîÃÂî¼ÂîµÂî®Âî§Âî Âî™Âî’Âî‹Âî„Âî}ÂîvÂîoÂîhÂîaÂîZÂîSÂîLÂîEÂî>Âî7Âî0Âî)Âî"ÂîÂîÂî ÂîÂîÿÁîøÁîñÁîêÁîãÁîÜÁîÕÁîÎÁîÇÁîÀÁî¹Áî²Áî«Áî¤ÁîÁî–ÁîÁîˆÁîÁîzÁîsÁîlÁîeÁî^ÁîWÁîPÁîIÁîBÁî;Áî4Áî-Áî&ÁîÁîÁîÁî ÁîÁîüÀîõÀîîÀîçÀîàÀîÙÀîÒÀîËÀîÄÀî½Àî¶Àî¯Àî¨Àî¡ÀîšÀî“ÀîŒÀî…Àî~ÀîwÀîpÀîiÀîbÀî[ÀîTÀîMÀîFÀî?Àî8Àî1Àî*Àî#ÀîÀîÀîÀîÀîÀîù¿îò¿îë¿îä¿îÝ¿îÖ¿îÏ¿îÈ¿îÁ¿îº¿î³¿î¬¿î¥¿îž¿î—¿î¿î‰¿î‚¿î{¿ît¿îm¿îf¿î_¿îX¿îQ¿îJ¿îC¿î<¿î5¿î.¿î'¿î ¿î¿î¿î ¿î¿îý¾îö¾îï¾îè¾îá¾îÚ¾îÓ¾î̾îžî¾¾î·¾î°¾î©¾î¢¾î›¾î”¾î¾î†¾î¾îx¾îq¾îj¾îc¾î\¾îU¾îN¾îG¾î@¾î9¾î2¾î+¾î$¾î¾î¾î¾î¾î¾îú½îó½îì½îå½îÞ½î×½îнîɽî½î»½î´½î­½î¦½îŸ½î˜½î‘½îнî|½îu½în½îg½î`½îY½îR½îK½îD½î=½î6½î/½î(½î!½î½î½î ½î½îþ¼î÷¼îð¼îé¼îâ¼îÛ¼îÔ¼îͼîƼî޼îy¼îr¼îk¼îd¼î]¼îV¼îO¼îH¼îA¼î:¼î3¼î,¼î%¼î¼î¼î¼î ¼î¼îû»îô»îí»îæ»îß»îØ»îÑ»îÊ»îûî}»îv»îo»îh»îa»îZ»îS»îL»îE»î>»î7»î0»î)»î"»î»î»î »î»îÿºîøºîñºîêºîãºîܺîÕºîκîǺîÀºî¹ºî²ºî«ºî¤ºîºî–ºîºîˆºîºîzºîsºîlºîeºî^ºîWºîPºîIºîBºî;ºî4ºî-ºî&ºîºîºîºî ºîºîü¹îõ¹îî¹îç¹îà¹îÙ¹îÒ¹î˹îĹî~¹îw¹îp¹îi¹îb¹î[¹îT¹îM¹îF¹î?¹î8¹î1¹î*¹î#¹î¹î¹î¹î¹î¹îù¸îò¸îë¸îä¸îݸîÖ¸îϸîȸîÁ¸îº¸î³¸î¬¸î¥¸îž¸î—¸î¸î‰¸î‚¸î{¸ît¸îm¸îf¸î_¸îX¸îQ¸îJ¸îC¸î<¸î5¸î.¸î'¸î ¸î¸î¸î ¸î¸îý·îö·îï·îè·îá·îÚ·îÓ·îÌ·îŷî·î†·î·îx·îq·îj·îc·î\·îU·îN·îG·î@·î9·î2·î+·î$·î·î·î·î·î·îú¶îó¶îì¶îå¶îÞ¶î×¶îжîɶî¶î»¶î´¶î­¶î¦¶îŸ¶î˜¶î‘¶îжî|¶îu¶în¶îg¶î`¶îY¶îR¶îK¶îD¶î=¶î6¶î/¶î(¶î!¶î¶î¶î ¶î¶îþµî÷µîðµîéµîâµîÛµîÔµî͵îƵî޵îyµîrµîkµîdµî]µîVµîOµîHµîAµî:µî3µî,µî%µîµîµîµî µîµîû´îô´îí´îæ´îß´îØ´îÑ´îÊ´îôî¼´îµ´î®´î§´î ´î™´î’´î‹´î„´î}´îv´îo´îh´îa´îZ´îS´îL´îE´î>´î7´î0´î)´î"´î´î´î ´î´îÿ³îø³îñ³îê³îã³îܳîÕ³îγîdzîÀ³î¹³î²³î«³î¤³î³î–³î³îˆ³î³îz³îs³îl³îe³î^³îW³îP³îI³îB³î;³î4³î-³î&³î³î³î³î ³î³îü²îõ²îî²îç²îà²îÙ²îÒ²î˲îIJî~²îw²îp²îi²îb²î[²îT²îM²îF²î?²î8²î1²î*²î#²î²î²î²î²î²îù±îò±îë±îä±îݱîÖ±îϱîȱîÁ±îº±î³±î¬±î¥±îž±î—±î±î‰±î‚±î{±ît±îm±îf±î_±îX±îQ±îJ±îC±î<±î5±î.±î'±î ±î±î±î ±î±îý°îö°îï°îè°îá°îÚ°îÓ°ḭ̂îŰî°î†°î°îx°îq°îj°îc°î\°îU°îN°îG°î@°î9°î2°î+°î$°î°î°î°î°î°îú¯îó¯îì¯îå¯îÞ¯îׯîЯîɯî¯î»¯î´¯î­¯î¦¯îŸ¯î˜¯î‘¯îНî|¯îu¯în¯îg¯î`¯îY¯îR¯îK¯îD¯î=¯î6¯î/¯î(¯î!¯î¯î¯î ¯î¯îþ®î÷®îð®îé®îâ®îÛ®îÔ®îÍ®îÆ®î¿®î¸®î±®îª®î£®îœ®î•®îŽ®î‡®î€®îy®îr®îk®îd®î]®îV®îO®îH®îA®î:®î3®î,®î%®î®î®î®î ®î®îû­îô­îí­îæ­îß­îØ­îÑ­îÊ­îíî¼­îµ­î®­î§­î ­î™­î’­î‹­î„­î}­îv­îo­îh­îa­îZ­îS­îL­îE­î>­î7­î0­î)­î"­î­î­î ­î­îÿ¬îø¬îñ¬îê¬îã¬îܬîÕ¬îάîǬîÀ¬î¹¬î²¬î«¬î¤¬î¬î–¬î¬îˆ¬î¬îz¬îs¬îl¬îe¬î^¬îW¬îP¬îI¬îB¬î;¬î4¬î-¬î&¬î¬î¬î¬î ¬î¬îü«îõ«îî«îç«îà«îÙ«îÒ«îË«îīî~«îw«îp«îi«îb«î[«îT«îM«îF«î?«î8«î1«î*«î#«î«î«î«î«î«îùªîòªîëªîäªîݪîÖªîϪîȪîÁªîºªî³ªî¬ªî¥ªîžªî—ªîªî‰ªî‚ªî{ªîtªîmªîfªî_ªîXªîQªîJªîCªî<ªî5ªî.ªî'ªî ªîªîªî ªîªîý©îö©îï©îè©îá©îÚ©îÓ©îÌ©îũî©î†©î©îx©îq©îj©îc©î\©îU©îN©îG©î@©î9©î2©î+©î$©î©î©î©î©î©îú¨îó¨îì¨îå¨îÞ¨îרîШîɨî¨î»¨î´¨î­¨î¦¨îŸ¨î˜¨î‘¨îЍî|¨îu¨în¨îg¨î`¨îY¨îR¨îK¨îD¨î=¨î6¨î/¨î(¨î!¨î¨î¨î ¨î¨îþ§î÷§îð§îé§îâ§îÛ§îÔ§îͧîƧîާîy§îr§îk§îd§î]§îV§îO§îH§îA§î:§î3§î,§î%§î§î§î§î §î§îû¦îô¦îí¦îæ¦îߦîئîѦîʦîæî¼¦îµ¦î®¦î§¦î ¦î™¦î’¦î‹¦î„¦î}¦îv¦îo¦îh¦îa¦îZ¦îS¦îL¦îE¦î>¦î7¦î0¦î)¦î"¦î¦î¦î ¦î¦îÿ¥îø¥îñ¥îê¥îã¥îÜ¥îÕ¥îÎ¥îÇ¥îÀ¥î¹¥î²¥î«¥î¤¥î¥î–¥î¥îˆ¥î¥îz¥îs¥îl¥îe¥î^¥îW¥îP¥îI¥îB¥î;¥î4¥î-¥î&¥î¥î¥î¥î ¥î¥îü¤îõ¤îî¤îç¤îà¤îÙ¤îÒ¤îˤîĤî~¤îw¤îp¤îi¤îb¤î[¤îT¤îM¤îF¤î?¤î8¤î1¤î*¤î#¤î¤î¤î¤î¤î¤îù£îò£îë£îä£îÝ£îÖ£îÏ£îÈ£îÁ£îº£î³£î¬£î¥£îž£î—£î£î‰£î‚£î{£ît£îm£îf£î_£îX£îQ£îJ£îC£î<£î5£î.£î'£î £î£î£î £î£îý¢îö¢îï¢îè¢îá¢îÚ¢îÓ¢îÌ¢îŢî¢î†¢î¢îx¢îq¢îj¢îc¢î\¢îU¢îN¢îG¢î@¢î9¢î2¢î+¢î$¢î¢î¢î¢î¢î¢îú¡îó¡îì¡îå¡îÞ¡îסîСîÉ¡î¡î»¡î´¡î­¡î¦¡îŸ¡î˜¡î‘¡îŠ¡îƒ¡î|¡îu¡în¡îg¡î`¡îY¡îR¡îK¡îD¡î=¡î6¡î/¡î(¡î!¡î¡î¡î ¡î¡îþ î÷ îð îé îâ îÛ îÔ îÍ îÆ î¿ î¸ î± îª î£ îœ î• îŽ î‡ î€ îy îr îk îd î] îV îO îH îA î: î3 î, î% î î î î  î îûŸîôŸîíŸîæŸîߟîØŸîÑŸîÊŸîßî}ŸîvŸîoŸîhŸîaŸîZŸîSŸîLŸîEŸî>Ÿî7Ÿî0Ÿî)Ÿî"ŸîŸîŸî ŸîŸîÿžîøžîñžîêžîãžîÜžîÕžîΞîÇžîÀžî¹žî²žî«žî¤žîžî–žîžîˆžîžîzžîsžîlžîežî^žîWžîPžîIžîBžî;žî4žî-žî&žîžîžîžî žîžîüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùœîòœîëœîäœîÝœîÖœîÏœîÈœîÁœîºœî³œî¬œî¥œîžœî—œîœî‰œî‚œî{œîtœîmœîfœî_œîXœîQœîJœîCœî<œî5œî.œî'œî œîœîœî œîœîý›îö›îï›îè›îá›îÚ›îÓ›îÌ›îśî›î†›î›îx›îq›îj›îc›î\›îU›îN›îG›î@›î9›î2›î+›î$›î›î›î›î›î›îúšîóšîìšîåšîÞšîךîКîÉšîšî»šî´šî­šî¦šîŸšî˜šî‘šîŠšîƒšî|šîušînšîgšî`šîYšîRšîKšîDšî=šî6šî/šî(šî!šîšîšî šîšîþ™î÷™îð™îé™îâ™îÛ™îÔ™îÍ™îÆ™î¿™î¸™î±™îª™î£™îœ™î•™îŽ™î‡™î€™îy™îr™îk™îd™î]™îV™îO™îH™îA™î:™î3™î,™î%™î™î™î™î ™î™îû˜îô˜îí˜îæ˜îߘîؘîјîʘîØî¼˜îµ˜î®˜î§˜î ˜î™˜î’˜î‹˜î„˜î}˜îv˜îo˜îh˜îa˜îZ˜îS˜îL˜îE˜î>˜î7˜î0˜î)˜î"˜î˜î˜î ˜î˜îÿ—îø—îñ—îê—îã—îÜ—îÕ—îΗîÇ—îÀ—î—î–—î—î—îz—îs—îl—îe—î^—îW—îP—îI—îB—î;—î4—î-—î&—î—î—î—î —î—îü–îõ–îî–îç–îà–îÙ–îÒ–îË–îĖî~–îw–îp–îi–îb–î[–îT–îM–îF–î?–î8–î1–î*–î#–î–î–î–î–î–îù•îò•îë•îä•îÝ•îÖ•îÏ•îÈ•îÁ•î•î{•ît•îm•îf•î_•îX•îQ•îJ•îC•î<•î5•î.•î'•î •î•î•î •î•îý”îö”îï”îè”îá”îÚ”îÓ”îÌ”îŔî”î”îx”îq”îj”îc”î\”îU”îN”îG”î@”î9”î2”î+”î$”î”î”î”î”î”îú“îó“îì“îå“îÞ“îדîГîÉ“î“î|“îu“în“îg“î`“îY“îR“îK“îD“î=“î6“î/“î(“î!“î“î“î “î“îþ’î÷’îð’îé’îâ’îÛ’îÔ’îÍ’îÆ’î¿’î¸’î±’îª’î£’îœ’î•’îŽ’î‡’î€’îy’îr’îk’îd’î]’îV’îO’îH’îA’î:’î3’î,’î%’î’î’î’î ’î’îû‘îô‘îí‘îæ‘îß‘îØ‘îÑ‘îÊ‘îÑî}‘îv‘îo‘îh‘îa‘îZ‘îS‘îL‘îE‘î>‘î7‘î0‘î)‘î"‘î‘î‘î ‘î‘îÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùŽîòŽîëŽîäŽîÝŽîÖŽîÏŽîÈŽîÁŽîºŽî³Žî¬Žî¥ŽîžŽî—ŽîŽî‰Žî‚Žî{ŽîtŽîmŽîfŽî_ŽîXŽîQŽîJŽîCŽî<Žî5Žî.Žî'Žî ŽîŽîŽî ŽîŽîýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúŒîóŒîìŒîåŒîÞŒî׌îÐŒîÉŒîŒî|ŒîuŒînŒîgŒî`ŒîYŒîRŒîKŒîDŒî=Œî6Œî/Œî(Œî!ŒîŒîŒî ŒîŒîþ‹î÷‹îð‹îé‹îâ‹îÛ‹îÔ‹îÍ‹îÆ‹î¿‹î¸‹î±‹îª‹î£‹îœ‹î•‹îŽ‹î‡‹î€‹îy‹îr‹îk‹îd‹î]‹îV‹îO‹îH‹îA‹î:‹î3‹î,‹î%‹î‹î‹î‹î ‹î‹îûŠîôŠîíŠîæŠîߊîØŠîÑŠîÊŠîÊî}ŠîvŠîoŠîhŠîaŠîZŠîSŠîLŠîEŠî>Šî7Šî0Šî)Šî"ŠîŠîŠî ŠîŠîÿ‰îø‰îñ‰îê‰îã‰î܉îÕ‰îΉîljîÀ‰î¹‰î²‰î«‰î¤‰î‰î–‰î‰îˆ‰î‰îz‰îs‰îl‰îe‰î^‰îW‰îP‰îI‰îB‰î;‰î4‰î-‰î&‰î‰î‰î‰î ‰î‰îüˆîõˆîîˆîçˆîàˆîÙˆîÒˆîˈîĈî~ˆîwˆîpˆîiˆîbˆî[ˆîTˆîMˆîFˆî?ˆî8ˆî1ˆî*ˆî#ˆîˆîˆîˆîˆîˆîù‡îò‡îë‡îä‡î݇îÖ‡îχîȇîÁ‡îº‡î³‡î¬‡î¥‡îž‡î—‡î‡î‰‡î‚‡î{‡ît‡îm‡îf‡î_‡îX‡îQ‡îJ‡îC‡î<‡î5‡î.‡î'‡î ‡î‡î‡î ‡î‡îý†îö†îï†îè†îá†îÚ†îÓ†î̆îņî†î††î†îx†îq†îj†îc†î\†îU†îN†îG†î@†î9†î2†î+†î$†î†î†î†î†î†îú…îó…îì…îå…îÞ…î×…îÐ…îÉ…î…î|…îu…în…îg…î`…îY…îR…îK…îD…î=…î6…î/…î(…î!…î…î…î …î…îþ„î÷„îð„îé„îâ„îÛ„îÔ„îÍ„îÆ„î¿„î¸„î±„îª„î£„îœ„î•„îŽ„î‡„î€„îy„îr„îk„îd„î]„îV„îO„îH„îA„î:„î3„î,„î%„î„î„î„î „î„îûƒîôƒîíƒîæƒî߃î؃îуîʃîÃî}ƒîvƒîoƒîhƒîaƒîZƒîSƒîLƒîEƒî>ƒî7ƒî0ƒî)ƒî"ƒîƒîƒî ƒîƒîÿ‚îø‚îñ‚îê‚îã‚îÜ‚îÕ‚î΂îÇ‚îÀ‚î‚î–‚î‚î‚îz‚îs‚îl‚îe‚î^‚îW‚îP‚îI‚îB‚î;‚î4‚î-‚î&‚î‚î‚î‚î ‚î‚îüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîù€îò€îë€îä€îÝ€îÖ€îÏ€îÈ€îÁ€îº€î³€î¬€î¥€îž€î—€î€î‰€î‚€î{€ît€îm€îf€î_€îX€îQ€îJ€îC€î<€î5€î.€î'€î €î€î€î €î€îýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîú~îó~îì~îå~îÞ~î×~îÐ~îÉ~îÂ~î»~î´~î­~î¦~îŸ~î˜~î‘~îŠ~îƒ~î|~îu~în~îg~î`~îY~îR~îK~îD~î=~î6~î/~î(~î!~î~î~î ~î~îþ}î÷}îð}îé}îâ}îÛ}îÔ}îÍ}îÆ}î¿}î¸}î±}îª}î£}îœ}î•}îŽ}î‡}î€}îy}îr}îk}îd}î]}îV}îO}îH}îA}î:}î3}î,}î%}î}î}î}î }î}îû|îô|îí|îæ|îß|îØ|îÑ|îÊ|îÃ|î¼|îµ|î®|î§|î |î™|î’|î‹|î„|î}|îv|îo|îh|îa|îZ|îS|îL|îE|î>|î7|î0|î)|î"|î|î|î |î|îÿ{îø{îñ{îê{îã{îÜ{îÕ{îÎ{îÇ{îÀ{î¹{î²{î«{î¤{î{î–{î{îˆ{î{îz{îs{îl{îe{î^{îW{îP{îI{îB{î;{î4{î-{î&{î{î{î{î {î{îüzîõzîîzîçzîàzîÙzîÒzîËzîÄzî½zî¶zî¯zî¨zî¡zîšzî“zîŒzî…zî~zîwzîpzîizîbzî[zîTzîMzîFzî?zî8zî1zî*zî#zîzîzîzîzîzîùyîòyîëyîäyîÝyîÖyîÏyîÈyîÁyîºyî³yî¬yî¥yîžyî—yîyî‰yî‚yî{yîtyîmyîfyî_yîXyîQyîJyîCyîuî7uî0uî)uî"uîuîuî uîuîÿtîøtîñtîêtîãtîÜtîÕtîÎtîÇtîÀtî¹tî²tî«tî¤tîtî–tîtîˆtîtîztîstîltîetî^tîWtîPtîItîBtî;tî4tî-tî&tîtîtîtî tîtîüsîõsîîsîçsîàsîÙsîÒsîËsîÄsî½sî¶sî¯sî¨sî¡sîšsî“sîŒsî…sî~sîwsîpsîisîbsî[sîTsîMsîFsî?sî8sî1sî*sî#sîsîsîsîsîsîùrîòrîërîärîÝrîÖrîÏrîÈrîÁrîºrî³rî¬rî¥rîžrî—rîrî‰rî‚rî{rîtrîmrîfrî_rîXrîQrîJrîCrînî7nî0nî)nî"nînînî nînîÿmîømîñmîêmîãmîÜmîÕmîÎmîÇmîÀmî¹mî²mî«mî¤mîmî–mîmîˆmîmîzmîsmîlmîemî^mîWmîPmîImîBmî;mî4mî-mî&mîmîmîmî mîmîülîõlîîlîçlîàlîÙlîÒlîËlîÄlî½lî¶lî¯lî¨lî¡lîšlî“lîŒlî…lî~lîwlîplîilîblî[lîTlîMlîFlî?lî8lî1lî*lî#lîlîlîlîlîlîùkîòkîëkîäkîÝkîÖkîÏkîÈkîÁkîºkî³kî¬kî¥kîžkî—kîkî‰kî‚kî{kîtkîmkîfkî_kîXkîQkîJkîCkîgî7gî0gî)gî"gîgîgî gîgîÿfîøfîñfîêfîãfîÜfîÕfîÎfîÇfîÀfî¹fî²fî«fî¤fîfî–fîfîˆfîfîzfîsfîlfîefî^fîWfîPfîIfîBfî;fî4fî-fî&fîfîfîfî fîfîüeîõeîîeîçeîàeîÙeîÒeîËeîÄeî½eî¶eî¯eî¨eî¡eîšeî“eîŒeî…eî~eîweîpeîieîbeî[eîTeîMeîFeî?eî8eî1eî*eî#eîeîeîeîeîeîùdîòdîëdîädîÝdîÖdîÏdîÈdîÁdîºdî³dî¬dî¥dîždî—dîdî‰dî‚dî{dîtdîmdîfdî_dîXdîQdîJdîCdî`î7`î0`î)`î"`î`î`î `î`îÿ_îø_îñ_îê_îã_îÜ_îÕ_îÎ_îÇ_îÀ_î¹_î²_î«_î¤_î_î–_î_îˆ_î_îz_îs_îl_îe_î^_îW_îP_îI_îB_î;_î4_î-_î&_î_î_î_î _î_îü^îõ^îî^îç^îà^îÙ^îÒ^îË^îÄ^î½^î¶^î¯^î¨^î¡^îš^î“^îŒ^î…^î~^îw^îp^îi^îb^î[^îT^îM^îF^î?^î8^î1^î*^î#^î^î^î^î^î^îù]îò]îë]îä]îÝ]îÖ]îÏ]îÈ]îÁ]îº]î³]î¬]î¥]îž]î—]î]î‰]î‚]î{]ît]îm]îf]î_]îX]îQ]îJ]îC]î<]î5]î.]î']î ]î]î]î ]î]îý\îö\îï\îè\îá\îÚ\îÓ\îÌ\îÅ\î¾\î·\î°\î©\î¢\î›\î”\î\î†\î\îx\îq\îj\îc\î\\îU\îN\îG\î@\î9\î2\î+\î$\î\î\î\î\î\îú[îó[îì[îå[îÞ[î×[îÐ[îÉ[îÂ[î»[î´[î­[î¦[îŸ[î˜[î‘[îŠ[îƒ[î|[îu[în[îg[î`[îY[îR[îK[îD[î=[î6[î/[î([î![î[î[î [î[îþZî÷ZîðZîéZîâZîÛZîÔZîÍZîÆZî¿Zî¸Zî±ZîªZî£ZîœZî•ZîŽZî‡Zî€ZîyZîrZîkZîdZî]ZîVZîOZîHZîAZî:Zî3Zî,Zî%ZîZîZîZî ZîZîûYîôYîíYîæYîßYîØYîÑYîÊYîÃYî¼YîµYî®Yî§Yî Yî™Yî’Yî‹Yî„Yî}YîvYîoYîhYîaYîZYîSYîLYîEYî>Yî7Yî0Yî)Yî"YîYîYî YîYîÿXîøXîñXîêXîãXîÜXîÕXîÎXîÇXîÀXî¹Xî²Xî«Xî¤XîXî–XîXîˆXîXîzXîsXîlXîeXî^XîWXîPXîIXîBXî;Xî4Xî-Xî&XîXîXîXî XîXîüWîõWîîWîçWîàWîÙWîÒWîËWîÄWî½Wî¶Wî¯Wî¨Wî¡WîšWî“WîŒWî…Wî~WîwWîpWîiWîbWî[WîTWîMWîFWî?Wî8Wî1Wî*Wî#WîWîWîWîWîWîùVîòVîëVîäVîÝVîÖVîÏVîÈVîÁVîºVî³Vî¬Vî¥VîžVî—VîVî‰Vî‚Vî{VîtVîmVîfVî_VîXVîQVîJVîCVîRî7Rî0Rî)Rî"RîRîRî RîRîÿQîøQîñQîêQîãQîÜQîÕQîÎQîÇQîÀQî¹Qî²Qî«Qî¤QîQî–QîQîˆQîQîzQîsQîlQîeQî^QîWQîPQîIQîBQî;Qî4Qî-Qî&QîQîQîQî QîQîüPîõPîîPîçPîàPîÙPîÒPîËPîÄPî½Pî¶Pî¯Pî¨Pî¡PîšPî“PîŒPî…Pî~PîwPîpPîiPîbPî[PîTPîMPîFPî?Pî8Pî1Pî*Pî#PîPîPîPîPîPîùOîòOîëOîäOîÝOîÖOîÏOîÈOîÁOîºOî³Oî¬Oî¥OîžOî—OîOî‰Oî‚Oî{OîtOîmOîfOî_OîXOîQOîJOîCOîKî7Kî0Kî)Kî"KîKîKî KîKîÿJîøJîñJîêJîãJîÜJîÕJîÎJîÇJîÀJî¹Jî²Jî«Jî¤JîJî–JîJîˆJîJîzJîsJîlJîeJî^JîWJîPJîIJîBJî;Jî4Jî-Jî&JîJîJîJî JîJîüIîõIîîIîçIîàIîÙIîÒIîËIîÄIî½Iî¶Iî¯Iî¨Iî¡IîšIî“IîŒIî…Iî~IîwIîpIîiIîbIî[IîTIîMIîFIî?Iî8Iî1Iî*Iî#IîIîIîIîIîIîùHîòHîëHîäHîÝHîÖHîÏHîÈHîÁHîºHî³Hî¬Hî¥HîžHî—HîHî‰Hî‚Hî{HîtHîmHîfHî_HîXHîQHîJHîCHîDî7Dî0Dî)Dî"DîDîDî DîDîÿCîøCîñCîêCîãCîÜCîÕCîÎCîÇCîÀCî¹Cî²Cî«Cî¤CîCî–CîCîˆCîCîzCîsCîlCîeCî^CîWCîPCîICîBCî;Cî4Cî-Cî&CîCîCîCî CîCîüBîõBîîBîçBîàBîÙBîÒBîËBîÄBî½Bî¶Bî¯Bî¨Bî¡BîšBî“BîŒBî…Bî~BîwBîpBîiBîbBî[BîTBîMBîFBî?Bî8Bî1Bî*Bî#BîBîBîBîBîBîùAîòAîëAîäAîÝAîÖAîÏAîÈAîÁAîºAî³Aî¬Aî¥AîžAî—AîAî‰Aî‚Aî{AîtAîmAîfAî_AîXAîQAîJAîCAîî÷>îð>îé>îâ>îÛ>îÔ>îÍ>îÆ>î¿>î¸>î±>îª>î£>îœ>î•>îŽ>î‡>î€>îy>îr>îk>îd>î]>îV>îO>îH>îA>î:>î3>î,>î%>î>î>î>î >î>îû=îô=îí=îæ=îß=îØ=îÑ=îÊ=îÃ=î¼=îµ=î®=î§=î =î™=î’=î‹=î„=î}=îv=îo=îh=îa=îZ=îS=îL=îE=î>=î7=î0=î)=î"=î=î=î =î=îÿ<îø<îñ<îê<îã<îÜ<îÕ<îÎ<îÇ<îÀ<î¹<î²<î«<î¤<î<î–<î<îˆ<î<îz<îs<îl<îe<î^<îW<îP<îI<îB<î;<î4<î-<î&<î<î<î<î <î<îü;îõ;îî;îç;îà;îÙ;îÒ;îË;îÄ;î½;î¶;î¯;î¨;î¡;îš;î“;îŒ;î…;î~;îw;îp;îi;îb;î[;îT;îM;îF;î?;î8;î1;î*;î#;î;î;î;î;î;îù:îò:îë:îä:îÝ:îÖ:îÏ:îÈ:îÁ:îº:î³:î¬:î¥:îž:î—:î:î‰:î‚:î{:ît:îm:îf:î_:îX:îQ:îJ:îC:î<:î5:î.:î':î :î:î:î :î:îý9îö9îï9îè9îá9îÚ9îÓ9îÌ9îÅ9î¾9î·9î°9î©9î¢9î›9î”9î9î†9î9îx9îq9îj9îc9î\9îU9îN9îG9î@9î99î29î+9î$9î9î9î9î9î9îú8îó8îì8îå8îÞ8î×8îÐ8îÉ8îÂ8î»8î´8î­8î¦8îŸ8î˜8î‘8îŠ8îƒ8î|8îu8în8îg8î`8îY8îR8îK8îD8î=8î68î/8î(8î!8î8î8î 8î8îþ7î÷7îð7îé7îâ7îÛ7îÔ7îÍ7îÆ7î¿7î¸7î±7îª7î£7îœ7î•7îŽ7î‡7î€7îy7îr7îk7îd7î]7îV7îO7îH7îA7î:7î37î,7î%7î7î7î7î 7î7îû6îô6îí6îæ6îß6îØ6îÑ6îÊ6îÃ6î¼6îµ6î®6î§6î 6î™6î’6î‹6î„6î}6îv6îo6îh6îa6îZ6îS6îL6îE6î>6î76î06î)6î"6î6î6î 6î6îÿ5îø5îñ5îê5îã5îÜ5îÕ5îÎ5îÇ5îÀ5î¹5î²5î«5î¤5î5î–5î5îˆ5î5îz5îs5îl5îe5î^5îW5îP5îI5îB5î;5î45î-5î&5î5î5î5î 5î5îü4îõ4îî4îç4îà4îÙ4îÒ4îË4îÄ4î½4î¶4î¯4î¨4î¡4îš4î“4îŒ4î…4î~4îw4îp4îi4îb4î[4îT4îM4îF4î?4î84î14î*4î#4î4î4î4î4î4îù3îò3îë3îä3îÝ3îÖ3îÏ3îÈ3îÁ3îº3î³3î¬3î¥3îž3î—3î3î‰3î‚3î{3ît3îm3îf3î_3îX3îQ3îJ3îC3î<3î53î.3î'3î 3î3î3î 3î3îý2îö2îï2îè2îá2îÚ2îÓ2îÌ2îÅ2î¾2î·2î°2î©2î¢2î›2î”2î2î†2î2îx2îq2îj2îc2î\2îU2îN2îG2î@2î92î22î+2î$2î2î2î2î2î2îú1îó1îì1îå1îÞ1î×1îÐ1îÉ1îÂ1î»1î´1î­1î¦1îŸ1î˜1î‘1îŠ1îƒ1î|1îu1în1îg1î`1îY1îR1îK1îD1î=1î61î/1î(1î!1î1î1î 1î1îþ0î÷0îð0îé0îâ0îÛ0îÔ0îÍ0îÆ0î¿0î¸0î±0îª0î£0îœ0î•0îŽ0î‡0î€0îy0îr0îk0îd0î]0îV0îO0îH0îA0î:0î30î,0î%0î0î0î0î 0î0îû/îô/îí/îæ/îß/îØ/îÑ/îÊ/îÃ/î¼/îµ/î®/î§/î /î™/î’/î‹/î„/î}/îv/îo/îh/îa/îZ/îS/îL/îE/î>/î7/î0/î)/î"/î/î/î /î/îÿ.îø.îñ.îê.îã.îÜ.îÕ.îÎ.îÇ.îÀ.î¹.î².î«.î¤.î.î–.î.îˆ.î.îz.îs.îl.îe.î^.îW.îP.îI.îB.î;.î4.î-.î&.î.î.î.î .î.îü-îõ-îî-îç-îà-îÙ-îÒ-îË-îÄ-î½-î¶-î¯-î¨-î¡-îš-î“-îŒ-î…-î~-îw-îp-îi-îb-î[-îT-îM-îF-î?-î8-î1-î*-î#-î-î-î-î-î-îù,îò,îë,îä,îÝ,îÖ,îÏ,îÈ,îÁ,îº,î³,î¬,î¥,îž,î—,î,î‰,î‚,î{,ît,îm,îf,î_,îX,îQ,îJ,îC,î<,î5,î.,î',î ,î,î,î ,î,îý+îö+îï+îè+îá+îÚ+îÓ+îÌ+îÅ+î¾+î·+î°+î©+î¢+î›+î”+î+î†+î+îx+îq+îj+îc+î\+îU+îN+îG+î@+î9+î2+î++î$+î+î+î+î+î+îú*îó*îì*îå*îÞ*î×*îÐ*îÉ*îÂ*î»*î´*î­*î¦*îŸ*î˜*î‘*îŠ*îƒ*î|*îu*în*îg*î`*îY*îR*îK*îD*î=*î6*î/*î(*î!*î*î*î *î*îþ)î÷)îð)îé)îâ)îÛ)îÔ)îÍ)îÆ)î¿)î¸)î±)îª)î£)îœ)î•)îŽ)î‡)î€)îy)îr)îk)îd)î])îV)îO)îH)îA)î:)î3)î,)î%)î)î)î)î )î)îû(îô(îí(îæ(îß(îØ(îÑ(îÊ(îÃ(î¼(îµ(î®(î§(î (î™(î’(î‹(î„(î}(îv(îo(îh(îa(îZ(îS(îL(îE(î>(î7(î0(î)(î"(î(î(î (î(îÿ'îø'îñ'îê'îã'îÜ'îÕ'îÎ'îÇ'îÀ'î¹'î²'î«'î¤'î'î–'î'îˆ'î'îz'îs'îl'îe'î^'îW'îP'îI'îB'î;'î4'î-'î&'î'î'î'î 'î'îü&îõ&îî&îç&îà&îÙ&îÒ&îË&îÄ&î½&î¶&î¯&î¨&î¡&îš&î“&îŒ&î…&î~&îw&îp&îi&îb&î[&îT&îM&îF&î?&î8&î1&î*&î#&î&î&î&î&î&îù%îò%îë%îä%îÝ%îÖ%îÏ%îÈ%îÁ%îº%î³%î¬%î¥%îž%î—%î%î‰%î‚%î{%ît%îm%îf%î_%îX%îQ%îJ%îC%î<%î5%î.%î'%î %î%î%î %î%îý$îö$îï$îè$îá$îÚ$îÓ$îÌ$îÅ$î¾$î·$î°$î©$î¢$î›$î”$î$î†$î$îx$îq$îj$îc$î\$îU$îN$îG$î@$î9$î2$î+$î$$î$î$î$î$î$îú#îó#îì#îå#îÞ#î×#îÐ#îÉ#îÂ#î»#î´#î­#î¦#îŸ#î˜#î‘#îŠ#îƒ#î|#îu#în#îg#î`#îY#îR#îK#îD#î=#î6#î/#î(#î!#î#î#î #î#îþ"î÷"îð"îé"îâ"îÛ"îÔ"îÍ"îÆ"î¿"î¸"î±"îª"î£"îœ"î•"îŽ"î‡"î€"îy"îr"îk"îd"î]"îV"îO"îH"îA"î:"î3"î,"î%"î"î"î"î "î"îû!îô!îí!îæ!îß!îØ!îÑ!îÊ!îÃ!î¼!îµ!î®!î§!î !î™!î’!î‹!î„!î}!îv!îo!îh!îa!îZ!îS!îL!îE!î>!î7!î0!î)!î"!î!î!î !î!îÿ îø îñ îê îã îÜ îÕ îÎ îÇ îÀ î¹ î² î« î¤ î î– î îˆ î îz îs îl îe î^ îW îP îI îB î; î4 î- î& î î î î î îüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþ î÷ îð îé îâ îÛ îÔ îÍ îÆ î¿ î¸ î± îª î£ îœ î• îŽ î‡ î€ îy îr îk îd î] îV îO îH îA î: î3 î, î% î î î î î îû îô îí îæ îß îØ îÑ îÊ îà î¼ îµ î® î§ î  î™ î’ î‹ î„ î} îv îo îh îa îZ îS îL îE î> î7 î0 î) î" î î î î îÿ îø îñ îê îã îÜ îÕ îÎ îÇ îÀ î¹ î² î« î¤ î î– î îˆ î îz îs îl îe î^ îW îP îI îB î; î4 î- î& î î î î î îü îõ îî îç îà îÙ îÒ îË îÄ î½ î¶ î¯ î¨ î¡ îš î“ îŒ î… î~ îw îp îi îb î[ îT îM îF î? î8 î1 î* î# î î î î î îù îò îë îä îÝ îÖ îÏ îÈ îÁ îº î³ î¬ î¥ îž î— î î‰ î‚ î{ ît îm îf î_ îX îQ îJ îC î< î5 î. î' î î î î î îýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþÿí÷ÿíðÿíéÿíâÿíÛÿíÔÿíÍÿíÆÿí¿ÿí¸ÿí±ÿíªÿí£ÿíœÿí•ÿíŽÿí‡ÿí€ÿíyÿírÿíkÿídÿí]ÿíVÿíOÿíHÿíAÿí:ÿí3ÿí,ÿí%ÿíÿíÿíÿí ÿíÿíûþíôþííþíæþíßþíØþíÑþíÊþíÃþí¼þíµþí®þí§þí þí™þí’þí‹þí„þí}þívþíoþíhþíaþíZþíSþíLþíEþí>þí7þí0þí)þí"þíþíþí þíþíÿýíøýíñýíêýíãýíÜýíÕýíÎýíÇýíÀýí¹ýí²ýí«ýí¤ýíýí–ýíýíˆýíýízýísýílýíeýí^ýíWýíPýíIýíBýí;ýí4ýí-ýí&ýíýíýíýí ýíýíüüíõüíîüíçüíàüíÙüíÒüíËüíÄüí½üí¶üí¯üí¨üí¡üíšüí“üíŒüí…üí~üíwüípüíiüíbüí[üíTüíMüíFüí?üí8üí1üí*üí#üíüíüíüíüíüíùûíòûíëûíäûíÝûíÖûíÏûíÈûíÁûíºûí³ûí¬ûí¥ûížûí—ûíûí‰ûí‚ûí{ûítûímûífûí_ûíXûíQûíJûíCûí<ûí5ûí.ûí'ûí ûíûíûí ûíûíýúíöúíïúíèúíáúíÚúíÓúíÌúíÅúí¾úí·úí°úí©úí¢úí›úí”úíúí†úíúíxúíqúíjúícúí\úíUúíNúíGúí@úí9úí2úí+úí$úíúíúíúíúíúíúùíóùíìùíåùíÞùí×ùíÐùíÉùíÂùí»ùí´ùí­ùí¦ùíŸùí˜ùí‘ùíŠùíƒùí|ùíuùínùígùí`ùíYùíRùíKùíDùí=ùí6ùí/ùí(ùí!ùíùíùí ùíùíþøí÷øíðøíéøíâøíÛøíÔøíÍøíÆøí¿øí¸øí±øíªøí£øíœøí•øíŽøí‡øí€øíyøírøíkøídøí]øíVøíOøíHøíAøí:øí3øí,øí%øíøíøíøí øíøíû÷íô÷íí÷íæ÷íß÷íØ÷íÑ÷íÊ÷íÃ÷í¼÷íµ÷í®÷í§÷í ÷í™÷í’÷í‹÷í„÷í}÷ív÷ío÷íh÷ía÷íZ÷íS÷íL÷íE÷í>÷í7÷í0÷í)÷í"÷í÷í÷í ÷í÷íÿöíøöíñöíêöíãöíÜöíÕöíÎöíÇöíÀöí¹öí²öí«öí¤öíöí–öíöíˆöíöízöísöílöíeöí^öíWöíPöíIöíBöí;öí4öí-öí&öíöíöíöí öíöíüõíõõíîõíçõíàõíÙõíÒõíËõíÄõí½õí¶õí¯õí¨õí¡õíšõí“õíŒõí…õí~õíwõípõíiõíbõí[õíTõíMõíFõí?õí8õí1õí*õí#õíõíõíõíõíõíùôíòôíëôíäôíÝôíÖôíÏôíÈôíÁôíºôí³ôí¬ôí¥ôížôí—ôíôí‰ôí‚ôí{ôítôímôífôí_ôíXôíQôíJôíCôí<ôí5ôí.ôí'ôí ôíôíôí ôíôíýóíöóíïóíèóíáóíÚóíÓóíÌóíÅóí¾óí·óí°óí©óí¢óí›óí”óíóí†óíóíxóíqóíjóícóí\óíUóíNóíGóí@óí9óí2óí+óí$óíóíóíóíóíóíúòíóòíìòíåòíÞòí×òíÐòíÉòíÂòí»òí´òí­òí¦òíŸòí˜òí‘òíŠòíƒòí|òíuòínòígòí`òíYòíRòíKòíDòí=òí6òí/òí(òí!òíòíòí òíòíþñí÷ñíðñíéñíâñíÛñíÔñíÍñíÆñí¿ñí¸ñí±ñíªñí£ñíœñí•ñíŽñí‡ñí€ñíyñírñíkñídñí]ñíVñíOñíHñíAñí:ñí3ñí,ñí%ñíñíñíñí ñíñíûðíôðííðíæðíßðíØðíÑðíÊðíÃðí¼ðíµðí®ðí§ðí ðí™ðí’ðí‹ðí„ðí}ðívðíoðíhðíaðíZðíSðíLðíEðí>ðí7ðí0ðí)ðí"ðíðíðí ðíðíÿïíøïíñïíêïíãïíÜïíÕïíÎïíÇïíÀïí¹ïí²ïí«ïí¤ïíïí–ïíïíˆïíïízïísïílïíeïí^ïíWïíPïíIïíBïí;ïí4ïí-ïí&ïíïíïíïí ïíïíüîíõîíîîíçîíàîíÙîíÒîíËîíÄîí½îí¶îí¯îí¨îí¡îíšîí“îíŒîí…îí~îíwîípîíiîíbîí[îíTîíMîíFîí?îí8îí1îí*îí#îíîíîíîíîíîíùííòííëííäííÝííÖííÏííÈííÁííºíí³íí¬íí¥íížíí—íííí‰íí‚íí{íítíímíífíí_ííXííQííJííCíí<íí5íí.íí'íí íííííí ííííýìíöìíïìíèìíáìíÚìíÓìíÌìíÅìí¾ìí·ìí°ìí©ìí¢ìí›ìí”ìíìí†ìíìíxìíqìíjìícìí\ìíUìíNìíGìí@ìí9ìí2ìí+ìí$ìíìíìíìíìíìíúëíóëíìëíåëíÞëí×ëíÐëíÉëíÂëí»ëí´ëí­ëí¦ëíŸëí˜ëí‘ëíŠëíƒëí|ëíuëínëígëí`ëíYëíRëíKëíDëí=ëí6ëí/ëí(ëí!ëíëíëí ëíëíþêí÷êíðêíéêíâêíÛêíÔêíÍêíÆêí¿êí¸êí±êíªêí£êíœêí•êíŽêí‡êí€êíyêírêíkêídêí]êíVêíOêíHêíAêí:êí3êí,êí%êíêíêíêí êíêíûéíôéííéíæéíßéíØéíÑéíÊéíÃéí¼éíµéí®éí§éí éí™éí’éí‹éí„éí}éívéíoéíhéíaéíZéíSéíLéíEéí>éí7éí0éí)éí"éíéíéí éíéíÿèíøèíñèíêèíãèíÜèíÕèíÎèíÇèíÀèí¹èí²èí«èí¤èíèí–èíèíˆèíèízèísèílèíeèí^èíWèíPèíIèíBèí;èí4èí-èí&èíèíèíèí èíèíüçíõçíîçíççíàçíÙçíÒçíËçíÄçí½çí¶çí¯çí¨çí¡çíšçí“çíŒçí…çí~çíwçípçíiçíbçí[çíTçíMçíFçí?çí8çí1çí*çí#çíçíçíçíçíçíùæíòæíëæíäæíÝæíÖæíÏæíÈæíÁæíºæí³æí¬æí¥æížæí—æíæí‰æí‚æí{æítæímæífæí_æíXæíQæíJæíCæí<æí5æí.æí'æí æíæíæí æíæíýåíöåíïåíèåíáåíÚåíÓåíÌåíÅåí¾åí·åí°åí©åí¢åí›åí”åíåí†åíåíxåíqåíjåícåí\åíUåíNåíGåí@åí9åí2åí+åí$åíåíåíåíåíåíúäíóäíìäíåäíÞäí×äíÐäíÉäíÂäí»äí´äí­äí¦äíŸäí˜äí‘äíŠäíƒäí|äíuäínäígäí`äíYäíRäíKäíDäí=äí6äí/äí(äí!äíäíäí äíäíþãí÷ãíðãíéãíâãíÛãíÔãíÍãíÆãí¿ãí¸ãí±ãíªãí£ãíœãí•ãíŽãí‡ãí€ãíyãírãíkãídãí]ãíVãíOãíHãíAãí:ãí3ãí,ãí%ãíãíãíãí ãíãíûâíôâííâíæâíßâíØâíÑâíÊâíÃâí¼âíµâí®âí§âí âí™âí’âí‹âí„âí}âívâíoâíhâíaâíZâíSâíLâíEâí>âí7âí0âí)âí"âíâíâí âíâíÿáíøáíñáíêáíãáíÜáíÕáíÎáíÇáíÀáí¹áí²áí«áí¤áíáí–áíáíˆáíáízáísáíláíeáí^áíWáíPáíIáíBáí;áí4áí-áí&áíáíáíáí áíáíüàíõàíîàíçàíààíÙàíÒàíËàíÄàí½àí¶àí¯àí¨àí¡àíšàí“àíŒàí…àí~àíwàípàíiàíbàí[àíTàíMàíFàí?àí8àí1àí*àí#àíàíàíàíàíàíùßíòßíëßíäßíÝßíÖßíÏßíÈßíÁßíºßí³ßí¬ßí¥ßížßí—ßíßí‰ßí‚ßí{ßítßímßífßí_ßíXßíQßíJßíCßí<ßí5ßí.ßí'ßí ßíßíßí ßíßíýÞíöÞíïÞíèÞíáÞíÚÞíÓÞíÌÞíÅÞí¾Þí·Þí°Þí©Þí¢Þí›Þí”ÞíÞí†ÞíÞíxÞíqÞíjÞícÞí\ÞíUÞíNÞíGÞí@Þí9Þí2Þí+Þí$ÞíÞíÞíÞíÞíÞíúÝíóÝíìÝíåÝíÞÝí×ÝíÐÝíÉÝíÂÝí»Ýí´Ýí­Ýí¦ÝíŸÝí˜Ýí‘ÝíŠÝíƒÝí|ÝíuÝínÝígÝí`ÝíYÝíRÝíKÝíDÝí=Ýí6Ýí/Ýí(Ýí!ÝíÝíÝí ÝíÝíþÜí÷ÜíðÜíéÜíâÜíÛÜíÔÜíÍÜíÆÜí¿Üí¸Üí±ÜíªÜí£ÜíœÜí•ÜíŽÜí‡Üí€ÜíyÜírÜíkÜídÜí]ÜíVÜíOÜíHÜíAÜí:Üí3Üí,Üí%ÜíÜíÜíÜí ÜíÜíûÛíôÛííÛíæÛíßÛíØÛíÑÛíÊÛíÃÛí¼ÛíµÛí®Ûí§Ûí Ûí™Ûí’Ûí‹Ûí„Ûí}ÛívÛíoÛíhÛíaÛíZÛíSÛíLÛíEÛí>Ûí7Ûí0Ûí)Ûí"ÛíÛíÛí ÛíÛíÿÚíøÚíñÚíêÚíãÚíÜÚíÕÚíÎÚíÇÚíÀÚí¹Úí²Úí«Úí¤ÚíÚí–ÚíÚíˆÚíÚízÚísÚílÚíeÚí^ÚíWÚíPÚíIÚíBÚí;Úí4Úí-Úí&ÚíÚíÚíÚí ÚíÚíüÙíõÙíîÙíçÙíàÙíÙÙíÒÙíËÙíÄÙí½Ùí¶Ùí¯Ùí¨Ùí¡ÙíšÙí“ÙíŒÙí…Ùí~ÙíwÙípÙíiÙíbÙí[ÙíTÙíMÙíFÙí?Ùí8Ùí1Ùí*Ùí#ÙíÙíÙíÙíÙíÙíùØíòØíëØíäØíÝØíÖØíÏØíÈØíÁØíºØí³Øí¬Øí¥ØížØí—ØíØí‰Øí‚Øí{ØítØímØífØí_ØíXØíQØíJØíCØí<Øí5Øí.Øí'Øí ØíØíØí ØíØíý×íö×íï×íè×íá×íÚ×íÓ×íÌ×íÅ×í¾×í·×í°×í©×í¢×í›×í”×í×í†×í×íx×íq×íj×íc×í\×íU×íN×íG×í@×í9×í2×í+×í$×í×í×í×í×í×íúÖíóÖíìÖíåÖíÞÖí×ÖíÐÖíÉÖíÂÖí»Öí´Öí­Öí¦ÖíŸÖí˜Öí‘ÖíŠÖíƒÖí|ÖíuÖínÖígÖí`ÖíYÖíRÖíKÖíDÖí=Öí6Öí/Öí(Öí!ÖíÖíÖí ÖíÖíþÕí÷ÕíðÕíéÕíâÕíÛÕíÔÕíÍÕíÆÕí¿Õí¸Õí±ÕíªÕí£ÕíœÕí•ÕíŽÕí‡Õí€ÕíyÕírÕíkÕídÕí]ÕíVÕíOÕíHÕíAÕí:Õí3Õí,Õí%ÕíÕíÕíÕí ÕíÕíûÔíôÔííÔíæÔíßÔíØÔíÑÔíÊÔíÃÔí¼ÔíµÔí®Ôí§Ôí Ôí™Ôí’Ôí‹Ôí„Ôí}ÔívÔíoÔíhÔíaÔíZÔíSÔíLÔíEÔí>Ôí7Ôí0Ôí)Ôí"ÔíÔíÔí ÔíÔíÿÓíøÓíñÓíêÓíãÓíÜÓíÕÓíÎÓíÇÓíÀÓí¹Óí²Óí«Óí¤ÓíÓí–ÓíÓíˆÓíÓízÓísÓílÓíeÓí^ÓíWÓíPÓíIÓíBÓí;Óí4Óí-Óí&ÓíÓíÓíÓí ÓíÓíüÒíõÒíîÒíçÒíàÒíÙÒíÒÒíËÒíÄÒí½Òí¶Òí¯Òí¨Òí¡ÒíšÒí“ÒíŒÒí…Òí~ÒíwÒípÒíiÒíbÒí[ÒíTÒíMÒíFÒí?Òí8Òí1Òí*Òí#ÒíÒíÒíÒíÒíÒíùÑíòÑíëÑíäÑíÝÑíÖÑíÏÑíÈÑíÁÑíºÑí³Ñí¬Ñí¥ÑížÑí—ÑíÑí‰Ñí‚Ñí{ÑítÑímÑífÑí_ÑíXÑíQÑíJÑíCÑí<Ñí5Ñí.Ñí'Ñí ÑíÑíÑí ÑíÑíýÐíöÐíïÐíèÐíáÐíÚÐíÓÐíÌÐíÅÐí¾Ðí·Ðí°Ðí©Ðí¢Ðí›Ðí”ÐíÐí†ÐíÐíxÐíqÐíjÐícÐí\ÐíUÐíNÐíGÐí@Ðí9Ðí2Ðí+Ðí$ÐíÐíÐíÐíÐíÐíúÏíóÏíìÏíåÏíÞÏí×ÏíÐÏíÉÏíÂÏí»Ïí´Ïí­Ïí¦ÏíŸÏí˜Ïí‘ÏíŠÏíƒÏí|ÏíuÏínÏígÏí`ÏíYÏíRÏíKÏíDÏí=Ïí6Ïí/Ïí(Ïí!ÏíÏíÏí ÏíÏíþÎí÷ÎíðÎíéÎíâÎíÛÎíÔÎíÍÎíÆÎí¿Îí¸Îí±ÎíªÎí£ÎíœÎí•ÎíŽÎí‡Îí€ÎíyÎírÎíkÎídÎí]ÎíVÎíOÎíHÎíAÎí:Îí3Îí,Îí%ÎíÎíÎíÎí ÎíÎíûÍíôÍííÍíæÍíßÍíØÍíÑÍíÊÍíÃÍí¼ÍíµÍí®Íí§Íí Íí™Íí’Íí‹Íí„Íí}ÍívÍíoÍíhÍíaÍíZÍíSÍíLÍíEÍí>Íí7Íí0Íí)Íí"ÍíÍíÍí ÍíÍíÿÌíøÌíñÌíêÌíãÌíÜÌíÕÌíÎÌíÇÌíÀÌí¹Ìí²Ìí«Ìí¤ÌíÌí–ÌíÌíˆÌíÌízÌísÌílÌíeÌí^ÌíWÌíPÌíIÌíBÌí;Ìí4Ìí-Ìí&ÌíÌíÌíÌí ÌíÌíüËíõËíîËíçËíàËíÙËíÒËíËËíÄËí½Ëí¶Ëí¯Ëí¨Ëí¡ËíšËí“ËíŒËí…Ëí~ËíwËípËíiËíbËí[ËíTËíMËíFËí?Ëí8Ëí1Ëí*Ëí#ËíËíËíËíËíËíùÊíòÊíëÊíäÊíÝÊíÖÊíÏÊíÈÊíÁÊíºÊí³Êí¬Êí¥ÊížÊí—ÊíÊí‰Êí‚Êí{ÊítÊímÊífÊí_ÊíXÊíQÊíJÊíCÊí<Êí5Êí.Êí'Êí ÊíÊíÊí ÊíÊíýÉíöÉíïÉíèÉíáÉíÚÉíÓÉíÌÉíÅÉí¾Éí·Éí°Éí©Éí¢Éí›Éí”ÉíÉí†ÉíÉíxÉíqÉíjÉícÉí\ÉíUÉíNÉíGÉí@Éí9Éí2Éí+Éí$ÉíÉíÉíÉíÉíÉíúÈíóÈíìÈíåÈíÞÈí×ÈíÐÈíÉÈíÂÈí»Èí´Èí­Èí¦ÈíŸÈí˜Èí‘ÈíŠÈíƒÈí|ÈíuÈínÈígÈí`ÈíYÈíRÈíKÈíDÈí=Èí6Èí/Èí(Èí!ÈíÈíÈí ÈíÈíþÇí÷ÇíðÇíéÇíâÇíÛÇíÔÇíÍÇíÆÇí¿Çí¸Çí±ÇíªÇí£ÇíœÇí•ÇíŽÇí‡Çí€ÇíyÇírÇíkÇídÇí]ÇíVÇíOÇíHÇíAÇí:Çí3Çí,Çí%ÇíÇíÇíÇí ÇíÇíûÆíôÆííÆíæÆí߯íØÆíÑÆíÊÆíÃÆí¼ÆíµÆí®Æí§Æí Æí™Æí’Æí‹Æí„Æí}ÆívÆíoÆíhÆíaÆíZÆíSÆíLÆíEÆí>Æí7Æí0Æí)Æí"ÆíÆíÆí ÆíÆíÿÅíøÅíñÅíêÅíãÅíÜÅíÕÅíÎÅíÇÅíÀÅí¹Åí²Åí«Åí¤ÅíÅí–ÅíÅíˆÅíÅízÅísÅílÅíeÅí^ÅíWÅíPÅíIÅíBÅí;Åí4Åí-Åí&ÅíÅíÅíÅí ÅíÅíüÄíõÄíîÄíçÄíàÄíÙÄíÒÄíËÄíÄÄí½Äí¶Äí¯Äí¨Äí¡ÄíšÄí“ÄíŒÄí…Äí~ÄíwÄípÄíiÄíbÄí[ÄíTÄíMÄíFÄí?Äí8Äí1Äí*Äí#ÄíÄíÄíÄíÄíÄíùÃíòÃíëÃíäÃíÝÃíÖÃíÏÃíÈÃíÁÃíºÃí³Ãí¬Ãí¥ÃížÃí—ÃíÃí‰Ãí‚Ãí{ÃítÃímÃífÃí_ÃíXÃíQÃíJÃíCÃí<Ãí5Ãí.Ãí'Ãí ÃíÃíÃí ÃíÃíýÂíöÂíïÂíèÂíáÂíÚÂíÓÂíÌÂíÅÂí¾Âí·Âí°Âí©Âí¢Âí›Âí”ÂíÂí†ÂíÂíxÂíqÂíjÂícÂí\ÂíUÂíNÂíGÂí@Âí9Âí2Âí+Âí$ÂíÂíÂíÂíÂíÂíúÁíóÁíìÁíåÁíÞÁí×ÁíÐÁíÉÁíÂÁí»Áí´Áí­Áí¦ÁíŸÁí˜Áí‘ÁíŠÁíƒÁí|ÁíuÁínÁígÁí`ÁíYÁíRÁíKÁíDÁí=Áí6Áí/Áí(Áí!ÁíÁíÁí ÁíÁíþÀí÷ÀíðÀíéÀíâÀíÛÀíÔÀíÍÀíÆÀí¿Àí¸Àí±ÀíªÀí£ÀíœÀí•ÀíŽÀí‡Àí€ÀíyÀírÀíkÀídÀí]ÀíVÀíOÀíHÀíAÀí:Àí3Àí,Àí%ÀíÀíÀíÀí ÀíÀíû¿íô¿íí¿íæ¿íß¿íØ¿íÑ¿íÊ¿íÿí¼¿íµ¿í®¿í§¿í ¿í™¿í’¿í‹¿í„¿í}¿ív¿ío¿íh¿ía¿íZ¿íS¿íL¿íE¿í>¿í7¿í0¿í)¿í"¿í¿í¿í ¿í¿íÿ¾íø¾íñ¾íê¾íã¾íܾíÕ¾íξíǾíÀ¾í¹¾í²¾í«¾í¤¾í¾í–¾í¾íˆ¾í¾íz¾ís¾íl¾íe¾í^¾íW¾íP¾íI¾íB¾í;¾í4¾í-¾í&¾í¾í¾í¾í ¾í¾íü½íõ½íî½íç½íà½íÙ½íÒ½í˽íĽí½½í¶½í¯½í¨½í¡½íš½í“½íŒ½í…½í~½íw½íp½íi½íb½í[½íT½íM½íF½í?½í8½í1½í*½í#½í½í½í½í½í½íù¼íò¼íë¼íä¼íݼíÖ¼íϼíȼíÁ¼íº¼í³¼í¬¼í¥¼íž¼í—¼í¼í‰¼í‚¼í{¼ít¼ím¼íf¼í_¼íX¼íQ¼íJ¼íC¼í<¼í5¼í.¼í'¼í ¼í¼í¼í ¼í¼íý»íö»íï»íè»íá»íÚ»íÓ»íÌ»íÅ»í¾»í·»í°»í©»í¢»í›»í”»í»í†»í»íx»íq»íj»íc»í\»íU»íN»íG»í@»í9»í2»í+»í$»í»í»í»í»í»íúºíóºíìºíåºíÞºí׺íкíɺíºí»ºí´ºí­ºí¦ºíŸºí˜ºí‘ºíŠºíƒºí|ºíuºínºígºí`ºíYºíRºíKºíDºí=ºí6ºí/ºí(ºí!ºíºíºí ºíºíþ¹í÷¹íð¹íé¹íâ¹íÛ¹íÔ¹í͹íƹí¿¹í¸¹í±¹íª¹í£¹íœ¹í•¹í޹퇹퀹íy¹ír¹ík¹íd¹í]¹íV¹íO¹íH¹íA¹í:¹í3¹í,¹í%¹í¹í¹í¹í ¹í¹íû¸íô¸íí¸íæ¸í߸íظíѸíʸíøí¼¸íµ¸í®¸í§¸í ¸í™¸í’¸í‹¸í„¸í}¸ív¸ío¸íh¸ía¸íZ¸íS¸íL¸íE¸í>¸í7¸í0¸í)¸í"¸í¸í¸í ¸í¸íÿ·íø·íñ·íê·íã·íÜ·íÕ·íηíÇ·íÀ·í¹·í²·í«·í¤·í·í–·í·íˆ·í·íz·ís·íl·íe·í^·íW·íP·íI·íB·í;·í4·í-·í&·í·í·í·í ·í·íü¶íõ¶íî¶íç¶íà¶íÙ¶íÒ¶í˶íĶí½¶í¶¶í¯¶í¨¶í¡¶íš¶í“¶íŒ¶í…¶í~¶íw¶íp¶íi¶íb¶í[¶íT¶íM¶íF¶í?¶í8¶í1¶í*¶í#¶í¶í¶í¶í¶í¶íùµíòµíëµíäµíݵíÖµíϵíȵíÁµíºµí³µí¬µí¥µížµí—µíµí‰µí‚µí{µítµímµífµí_µíXµíQµíJµíCµí<µí5µí.µí'µí µíµíµí µíµíý´íö´íï´íè´íá´íÚ´íÓ´íÌ´íÅ´í¾´í·´í°´í©´í¢´í›´í”´í´í†´í´íx´íq´íj´íc´í\´íU´íN´íG´í@´í9´í2´í+´í$´í´í´í´í´í´íú³íó³íì³íå³íÞ³í׳íгíɳí³í»³í´³í­³í¦³íŸ³í˜³í‘³íг탳í|³íu³ín³íg³í`³íY³íR³íK³íD³í=³í6³í/³í(³í!³í³í³í ³í³íþ²í÷²íð²íé²íâ²íÛ²íÔ²íͲíƲí¿²í¸²í±²íª²í£²íœ²í•²í޲퇲퀲íy²ír²ík²íd²í]²íV²íO²íH²íA²í:²í3²í,²í%²í²í²í²í ²í²íû±íô±íí±íæ±íß±íرíѱíʱíñí¼±íµ±í®±í§±í ±í™±í’±í‹±í„±í}±ív±ío±íh±ía±íZ±íS±íL±íE±í>±í7±í0±í)±í"±í±í±í ±í±íÿ°íø°íñ°íê°íã°íܰíÕ°íΰíǰíÀ°í¹°í²°í«°í¤°í°í–°í°íˆ°í°íz°ís°íl°íe°í^°íW°íP°íI°íB°í;°í4°í-°í&°í°í°í°í °í°íü¯íõ¯íî¯íç¯íà¯íÙ¯íÒ¯í˯íįí½¯í¶¯í¯¯í¨¯í¡¯íš¯í“¯íŒ¯í…¯í~¯íw¯íp¯íi¯íb¯í[¯íT¯íM¯íF¯í?¯í8¯í1¯í*¯í#¯í¯í¯í¯í¯í¯íù®íò®íë®íä®íÝ®íÖ®íÏ®íÈ®íÁ®íº®í³®í¬®í¥®íž®í—®í®í‰®í‚®í{®ít®ím®íf®í_®íX®íQ®íJ®íC®í<®í5®í.®í'®í ®í®í®í ®í®íý­íö­íï­íè­íá­íÚ­íÓ­íÌ­íÅ­í¾­í·­í°­í©­í¢­í›­í”­í­í†­í­íx­íq­íj­íc­í\­íU­íN­íG­í@­í9­í2­í+­í$­í­í­í­í­í­íú¬íó¬íì¬íå¬íÞ¬í׬íЬíɬí¬í»¬í´¬í­¬í¦¬íŸ¬í˜¬í‘¬íЬ탬í|¬íu¬ín¬íg¬í`¬íY¬íR¬íK¬íD¬í=¬í6¬í/¬í(¬í!¬í¬í¬í ¬í¬íþ«í÷«íð«íé«íâ«íÛ«íÔ«íÍ«íÆ«í¿«í¸«í±«íª«í£«íœ«í•«íŽ«í‡«í€«íy«ír«ík«íd«í]«íV«íO«íH«íA«í:«í3«í,«í%«í«í«í«í «í«íûªíôªííªíæªíߪíتíѪíʪíêí¼ªíµªí®ªí§ªí ªí™ªí’ªí‹ªí„ªí}ªívªíoªíhªíaªíZªíSªíLªíEªí>ªí7ªí0ªí)ªí"ªíªíªí ªíªíÿ©íø©íñ©íê©íã©íÜ©íÕ©íΩíÇ©íÀ©í¹©í²©í«©í¤©í©í–©í©íˆ©í©íz©ís©íl©íe©í^©íW©íP©íI©íB©í;©í4©í-©í&©í©í©í©í ©í©íü¨íõ¨íî¨íç¨íà¨íÙ¨íÒ¨í˨íĨí½¨í¶¨í¯¨í¨¨í¡¨íš¨í“¨íŒ¨í…¨í~¨íw¨íp¨íi¨íb¨í[¨íT¨íM¨íF¨í?¨í8¨í1¨í*¨í#¨í¨í¨í¨í¨í¨íù§íò§íë§íä§íݧíÖ§íϧíȧíÁ§íº§í³§í¬§í¥§íž§í—§í§í‰§í‚§í{§ít§ím§íf§í_§íX§íQ§íJ§íC§í<§í5§í.§í'§í §í§í§í §í§íý¦íö¦íï¦íè¦íá¦íÚ¦íÓ¦í̦íŦí¾¦í·¦í°¦í©¦í¢¦í›¦í”¦í¦í†¦í¦íx¦íq¦íj¦íc¦í\¦íU¦íN¦íG¦í@¦í9¦í2¦í+¦í$¦í¦í¦í¦í¦í¦íú¥íó¥íì¥íå¥íÞ¥í×¥íÐ¥íÉ¥íÂ¥í»¥í´¥í­¥í¦¥íŸ¥í˜¥í‘¥íŠ¥íƒ¥í|¥íu¥ín¥íg¥í`¥íY¥íR¥íK¥íD¥í=¥í6¥í/¥í(¥í!¥í¥í¥í ¥í¥íþ¤í÷¤íð¤íé¤íâ¤íÛ¤íÔ¤íͤíƤí¿¤í¸¤í±¤íª¤í£¤íœ¤í•¤íޤ퇤퀤íy¤ír¤ík¤íd¤í]¤íV¤íO¤íH¤íA¤í:¤í3¤í,¤í%¤í¤í¤í¤í ¤í¤íû£íô£íí£íæ£íߣíØ£íÑ£íÊ£íãí¼£íµ£í®£í§£í £í™£í’£í‹£í„£í}£ív£ío£íh£ía£íZ£íS£íL£íE£í>£í7£í0£í)£í"£í£í£í £í£íÿ¢íø¢íñ¢íê¢íã¢íÜ¢íÕ¢í΢íÇ¢íÀ¢í¹¢í²¢í«¢í¤¢í¢í–¢í¢íˆ¢í¢íz¢ís¢íl¢íe¢í^¢íW¢íP¢íI¢íB¢í;¢í4¢í-¢í&¢í¢í¢í¢í ¢í¢íü¡íõ¡íî¡íç¡íà¡íÙ¡íÒ¡íË¡íÄ¡í½¡í¶¡í¯¡í¨¡í¡¡íš¡í“¡íŒ¡í…¡í~¡íw¡íp¡íi¡íb¡í[¡íT¡íM¡íF¡í?¡í8¡í1¡í*¡í#¡í¡í¡í¡í¡í¡íù íò íë íä íÝ íÖ íÏ íÈ íÁ íº í³ í¬ í¥ íž í— í í‰ í‚ í{ ít ím íf í_ íX íQ íJ íC í< í5 í. í' í  í í í  í íýŸíöŸíïŸíèŸíáŸíÚŸíÓŸíÌŸíÅŸí¾Ÿí·Ÿí°Ÿí©Ÿí¢Ÿí›Ÿí”ŸíŸí†ŸíŸíxŸíqŸíjŸícŸí\ŸíUŸíNŸíGŸí@Ÿí9Ÿí2Ÿí+Ÿí$ŸíŸíŸíŸíŸíŸíúžíóžíìžíåžíÞžíמíОíÉžíží»ží´ží­ží¦žíŸží˜ží‘žíŠžíƒží|žíužínžígží`žíYžíRžíKžíDží=ží6ží/ží(ží!žížíží žížíþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûœíôœííœíæœíßœíØœíÑœíÊœíÜí¼œíµœí®œí§œí œí™œí’œí‹œí„œí}œívœíoœíhœíaœíZœíSœíLœíEœí>œí7œí0œí)œí"œíœíœí œíœíÿ›íø›íñ›íê›íã›íÜ›íÕ›íΛíÇ›íÀ›í¹›í²›í«›í¤›í›í–›í›íˆ›í›íz›ís›íl›íe›í^›íW›íP›íI›íB›í;›í4›í-›í&›í›í›í›í ›í›íüšíõšíîšíçšíàšíÙšíÒšíËšíÄší½ší¶ší¯ší¨ší¡šíšší“šíŒší…ší~šíwšípšíišíbší[šíTšíMšíFší?ší8ší1ší*ší#šíšíšíšíšíšíù™íò™íë™íä™íÝ™íÖ™íÏ™íÈ™íÁ™íº™í³™í¬™í¥™íž™í—™í™í‰™í‚™í{™ít™ím™íf™í_™íX™íQ™íJ™íC™í<™í5™í.™í'™í ™í™í™í ™í™íý˜íö˜íï˜íè˜íá˜íÚ˜íÓ˜í̘íŘí¾˜í·˜í°˜í©˜í¢˜í›˜í”˜í˜í†˜í˜íx˜íq˜íj˜íc˜í\˜íU˜íN˜íG˜í@˜í9˜í2˜í+˜í$˜í˜í˜í˜í˜í˜íú—íó—íì—íå—íÞ—í×—íЗíÉ—í—í»—í´—í­—í¦—íŸ—í˜—í‘—íŠ—íƒ—í|—íu—ín—íg—í`—íY—íR—íK—íD—í=—í6—í/—í(—í!—í—í—í —í—íþ–í÷–íð–íé–íâ–íÛ–íÔ–íÍ–íÆ–í¿–í¸–í±–íª–í£–íœ–í•–íŽ–í‡–í€–íy–ír–ík–íd–í]–íV–íO–íH–íA–í:–í3–í,–í%–í–í–í–í –í–íû•íô•íí•íæ•íß•íØ•íÑ•íÊ•íÕí¼•íµ•í®•í§•í •í™•í’•í‹•í„•í}•ív•ío•íh•ía•íZ•íS•íL•íE•í>•í7•í0•í)•í"•í•í•í •í•íÿ”íø”íñ”íê”íã”íÜ”íÕ”íΔíÇ”íÀ”í¹”í²”í«”í¤”í”í–”í”툔í”íz”ís”íl”íe”í^”íW”íP”íI”íB”í;”í4”í-”í&”í”í”í”í ”í”íü“íõ“íî“íç“íà“íÙ“íÒ“íË“íÄ“í½“í¶“í¯“í¨“í¡“íš“í““íŒ“í…“í~“íw“íp“íi“íb“í[“íT“íM“íF“í?“í8“í1“í*“í#“í“í“í“í“í“íù’íò’íë’íä’íÝ’íÖ’íÏ’íÈ’íÁ’íº’í³’í¬’í¥’íž’í—’í’퉒킒í{’ít’ím’íf’í_’íX’íQ’íJ’íC’í<’í5’í.’í'’í ’í’í’í ’í’íý‘íö‘íï‘íè‘íá‘íÚ‘íÓ‘íÌ‘íÅ‘í¾‘í·‘í°‘í©‘í¢‘í›‘í”‘í‘톑í‘íx‘íq‘íj‘íc‘í\‘íU‘íN‘íG‘í@‘í9‘í2‘í+‘í$‘í‘í‘í‘í‘í‘íúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûŽíôŽííŽíæŽíߎíØŽíÑŽíÊŽíÃŽí¼ŽíµŽí®Ží§Ží Ží™Ží’Ží‹Ží„Ží}ŽívŽíoŽíhŽíaŽíZŽíSŽíLŽíEŽí>Ží7Ží0Ží)Ží"ŽíŽíŽí ŽíŽíÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüŒíõŒíîŒíçŒíàŒíÙŒíÒŒíËŒíÄŒí½Œí¶Œí¯Œí¨Œí¡ŒíšŒí“ŒíŒŒí…Œí~ŒíwŒípŒíiŒíbŒí[ŒíTŒíMŒíFŒí?Œí8Œí1Œí*Œí#ŒíŒíŒíŒíŒíŒíù‹íò‹íë‹íä‹íÝ‹íÖ‹íÏ‹íÈ‹íÁ‹íº‹í³‹í¬‹í¥‹íž‹í—‹í‹í‰‹í‚‹í{‹ít‹ím‹íf‹í_‹íX‹íQ‹íJ‹íC‹í<‹í5‹í.‹í'‹í ‹í‹í‹í ‹í‹íýŠíöŠíïŠíèŠíáŠíÚŠíÓŠíÌŠíÅŠí¾Ší·Ší°Ší©Ší¢Ší›Ší”ŠíŠí†ŠíŠíxŠíqŠíjŠícŠí\ŠíUŠíNŠíGŠí@Ší9Ší2Ší+Ší$ŠíŠíŠíŠíŠíŠíú‰íó‰íì‰íå‰íÞ‰í׉íЉíɉí‰í»‰í´‰í­‰í¦‰íŸ‰í˜‰í‘‰íЉíƒ‰í|‰íu‰ín‰íg‰í`‰íY‰íR‰íK‰íD‰í=‰í6‰í/‰í(‰í!‰í‰í‰í ‰í‰íþˆí÷ˆíðˆíéˆíâˆíÛˆíÔˆí͈íƈí¿ˆí¸ˆí±ˆíªˆí£ˆíœˆí•ˆíŽˆí‡ˆí€ˆíyˆírˆíkˆídˆí]ˆíVˆíOˆíHˆíAˆí:ˆí3ˆí,ˆí%ˆíˆíˆíˆí ˆíˆíû‡íô‡íí‡íæ‡í߇í؇íчíʇíÇí¼‡íµ‡í®‡í§‡í ‡í™‡í’‡í‹‡í„‡í}‡ív‡ío‡íh‡ía‡íZ‡íS‡íL‡íE‡í>‡í7‡í0‡í)‡í"‡í‡í‡í ‡í‡íÿ†íø†íñ†íê†íã†í܆íÕ†íΆídžíÀ†í¹†í²†í«†í¤†í†í–†í†íˆ†í†íz†ís†íl†íe†í^†íW†íP†íI†íB†í;†í4†í-†í&†í†í†í†í †í†íü…íõ…íî…íç…íà…íÙ…íÒ…íË…íÄ…í½…í¶…í¯…í¨…í¡…íš…í“…íŒ…í……í~…íw…íp…íi…íb…í[…íT…íM…íF…í?…í8…í1…í*…í#…í…í…í…í…í…íù„íò„íë„íä„íÝ„íÖ„íÏ„íÈ„íÁ„íº„í³„í¬„í¥„íž„í—„í„퉄킄í{„ít„ím„íf„í_„íX„íQ„íJ„íC„í<„í5„í.„í'„í „í„í„í „í„íýƒíöƒíïƒíèƒíáƒíÚƒíÓƒí̃íŃí¾ƒí·ƒí°ƒí©ƒí¢ƒí›ƒí”ƒíƒí†ƒíƒíxƒíqƒíjƒícƒí\ƒíUƒíNƒíGƒí@ƒí9ƒí2ƒí+ƒí$ƒíƒíƒíƒíƒíƒíú‚íó‚íì‚íå‚íÞ‚íׂíЂíÉ‚í‚í»‚í´‚í­‚í¦‚íŸ‚í˜‚í‘‚íŠ‚íƒ‚í|‚íu‚ín‚íg‚í`‚íY‚íR‚íK‚íD‚í=‚í6‚í/‚í(‚í!‚í‚í‚í ‚í‚íþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííû€íô€íí€íæ€í߀íØ€íÑ€íÊ€íÀí¼€íµ€í®€í§€í €í™€í’€í‹€í„€í}€ív€ío€íh€ía€íZ€íS€íL€íE€í>€í7€í0€í)€í"€í€í€í €í€íÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííü~íõ~íî~íç~íà~íÙ~íÒ~íË~íÄ~í½~í¶~í¯~í¨~í¡~íš~í“~íŒ~í…~í~~íw~íp~íi~íb~í[~íT~íM~íF~í?~í8~í1~í*~í#~í~í~í~í~í~íù}íò}íë}íä}íÝ}íÖ}íÏ}íÈ}íÁ}íº}í³}í¬}í¥}íž}í—}í}í‰}í‚}í{}ít}ím}íf}í_}íX}íQ}íJ}íC}í<}í5}í.}í'}í }í}í}í }í}íý|íö|íï|íè|íá|íÚ|íÓ|íÌ|íÅ|í¾|í·|í°|í©|í¢|í›|í”|í|í†|í|íx|íq|íj|íc|í\|íU|íN|íG|í@|í9|í2|í+|í$|í|í|í|í|í|íú{íó{íì{íå{íÞ{í×{íÐ{íÉ{íÂ{í»{í´{í­{í¦{íŸ{í˜{í‘{íŠ{íƒ{í|{íu{ín{íg{í`{íY{íR{íK{íD{í={í6{í/{í({í!{í{í{í {í{íþzí÷zíðzíézíâzíÛzíÔzíÍzíÆzí¿zí¸zí±zíªzí£zíœzí•zíŽzí‡zí€zíyzírzíkzídzí]zíVzíOzíHzíAzí:zí3zí,zí%zízízízí zízíûyíôyííyíæyíßyíØyíÑyíÊyíÃyí¼yíµyí®yí§yí yí™yí’yí‹yí„yí}yívyíoyíhyíayíZyíSyíLyíEyí>yí7yí0yí)yí"yíyíyí yíyíÿxíøxíñxíêxíãxíÜxíÕxíÎxíÇxíÀxí¹xí²xí«xí¤xíxí–xíxíˆxíxízxísxílxíexí^xíWxíPxíIxíBxí;xí4xí-xí&xíxíxíxí xíxíüwíõwíîwíçwíàwíÙwíÒwíËwíÄwí½wí¶wí¯wí¨wí¡wíšwí“wíŒwí…wí~wíwwípwíiwíbwí[wíTwíMwíFwí?wí8wí1wí*wí#wíwíwíwíwíwíùvíòvíëvíävíÝvíÖvíÏvíÈvíÁvíºví³ví¬ví¥vížví—víví‰ví‚ví{vítvímvífví_víXvíQvíJvíCvírí7rí0rí)rí"rírírí ríríÿqíøqíñqíêqíãqíÜqíÕqíÎqíÇqíÀqí¹qí²qí«qí¤qíqí–qíqíˆqíqízqísqílqíeqí^qíWqíPqíIqíBqí;qí4qí-qí&qíqíqíqí qíqíüpíõpíîpíçpíàpíÙpíÒpíËpíÄpí½pí¶pí¯pí¨pí¡píšpí“píŒpí…pí~píwpíppíipíbpí[píTpíMpíFpí?pí8pí1pí*pí#pípípípípípíùoíòoíëoíäoíÝoíÖoíÏoíÈoíÁoíºoí³oí¬oí¥oížoí—oíoí‰oí‚oí{oítoímoífoí_oíXoíQoíJoíCoíkí7kí0kí)kí"kíkíkí kíkíÿjíøjíñjíêjíãjíÜjíÕjíÎjíÇjíÀjí¹jí²jí«jí¤jíjí–jíjíˆjíjízjísjíljíejí^jíWjíPjíIjíBjí;jí4jí-jí&jíjíjíjí jíjíüiíõiíîiíçiíàiíÙiíÒiíËiíÄií½ií¶ií¯ií¨ií¡iíšií“iíŒií…ií~iíwiípiíiiíbií[iíTiíMiíFií?ií8ií1ií*ií#iíiíiíiíiíiíùhíòhíëhíähíÝhíÖhíÏhíÈhíÁhíºhí³hí¬hí¥hížhí—híhí‰hí‚hí{híthímhífhí_híXhíQhíJhíChídí7dí0dí)dí"dídídí dídíÿcíøcíñcíêcíãcíÜcíÕcíÎcíÇcíÀcí¹cí²cí«cí¤cící–cícíˆcícízcíscílcíecí^cíWcíPcíIcíBcí;cí4cí-cí&cícícící cícíübíõbíîbíçbíàbíÙbíÒbíËbíÄbí½bí¶bí¯bí¨bí¡bíšbí“bíŒbí…bí~bíwbípbíibíbbí[bíTbíMbíFbí?bí8bí1bí*bí#bíbíbíbíbíbíùaíòaíëaíäaíÝaíÖaíÏaíÈaíÁaíºaí³aí¬aí¥aížaí—aíaí‰aí‚aí{aítaímaífaí_aíXaíQaíJaíCaí]í7]í0]í)]í"]í]í]í ]í]íÿ\íø\íñ\íê\íã\íÜ\íÕ\íÎ\íÇ\íÀ\í¹\í²\í«\í¤\í\í–\í\íˆ\í\íz\ís\íl\íe\í^\íW\íP\íI\íB\í;\í4\í-\í&\í\í\í\í \í\íü[íõ[íî[íç[íà[íÙ[íÒ[íË[íÄ[í½[í¶[í¯[í¨[í¡[íš[í“[íŒ[í…[í~[íw[íp[íi[íb[í[[íT[íM[íF[í?[í8[í1[í*[í#[í[í[í[í[í[íùZíòZíëZíäZíÝZíÖZíÏZíÈZíÁZíºZí³Zí¬Zí¥ZížZí—ZíZí‰Zí‚Zí{ZítZímZífZí_ZíXZíQZíJZíCZíVí7Ví0Ví)Ví"VíVíVí VíVíÿUíøUíñUíêUíãUíÜUíÕUíÎUíÇUíÀUí¹Uí²Uí«Uí¤UíUí–UíUíˆUíUízUísUílUíeUí^UíWUíPUíIUíBUí;Uí4Uí-Uí&UíUíUíUí UíUíüTíõTíîTíçTíàTíÙTíÒTíËTíÄTí½Tí¶Tí¯Tí¨Tí¡TíšTí“TíŒTí…Tí~TíwTípTíiTíbTí[TíTTíMTíFTí?Tí8Tí1Tí*Tí#TíTíTíTíTíTíùSíòSíëSíäSíÝSíÖSíÏSíÈSíÁSíºSí³Sí¬Sí¥SížSí—SíSí‰Sí‚Sí{SítSímSífSí_SíXSíQSíJSíCSíOí7Oí0Oí)Oí"OíOíOí OíOíÿNíøNíñNíêNíãNíÜNíÕNíÎNíÇNíÀNí¹Ní²Ní«Ní¤NíNí–NíNíˆNíNízNísNílNíeNí^NíWNíPNíINíBNí;Ní4Ní-Ní&NíNíNíNí NíNíüMíõMíîMíçMíàMíÙMíÒMíËMíÄMí½Mí¶Mí¯Mí¨Mí¡MíšMí“MíŒMí…Mí~MíwMípMíiMíbMí[MíTMíMMíFMí?Mí8Mí1Mí*Mí#MíMíMíMíMíMíùLíòLíëLíäLíÝLíÖLíÏLíÈLíÁLíºLí³Lí¬Lí¥LížLí—LíLí‰Lí‚Lí{LítLímLífLí_LíXLíQLíJLíCLíHí7Hí0Hí)Hí"HíHíHí HíHíÿGíøGíñGíêGíãGíÜGíÕGíÎGíÇGíÀGí¹Gí²Gí«Gí¤GíGí–GíGíˆGíGízGísGílGíeGí^GíWGíPGíIGíBGí;Gí4Gí-Gí&GíGíGíGí GíGíüFíõFíîFíçFíàFíÙFíÒFíËFíÄFí½Fí¶Fí¯Fí¨Fí¡FíšFí“FíŒFí…Fí~FíwFípFíiFíbFí[FíTFíMFíFFí?Fí8Fí1Fí*Fí#FíFíFíFíFíFíùEíòEíëEíäEíÝEíÖEíÏEíÈEíÁEíºEí³Eí¬Eí¥EížEí—EíEí‰Eí‚Eí{EítEímEífEí_EíXEíQEíJEíCEíAí7Aí0Aí)Aí"AíAíAí AíAíÿ@íø@íñ@íê@íã@íÜ@íÕ@íÎ@íÇ@íÀ@í¹@í²@í«@í¤@í@í–@í@íˆ@í@íz@ís@íl@íe@í^@íW@íP@íI@íB@í;@í4@í-@í&@í@í@í@í @í@íü?íõ?íî?íç?íà?íÙ?íÒ?íË?íÄ?í½?í¶?í¯?í¨?í¡?íš?í“?íŒ?í…?í~?íw?íp?íi?íb?í[?íT?íM?íF?í??í8?í1?í*?í#?í?í?í?í?í?íù>íò>íë>íä>íÝ>íÖ>íÏ>íÈ>íÁ>íº>í³>í¬>í¥>íž>í—>í>í‰>í‚>í{>ít>ím>íf>í_>íX>íQ>íJ>íC>í<>í5>í.>í'>í >í>í>í >í>íý=íö=íï=íè=íá=íÚ=íÓ=íÌ=íÅ=í¾=í·=í°=í©=í¢=í›=í”=í=í†=í=íx=íq=íj=íc=í\=íU=íN=íG=í@=í9=í2=í+=í$=í=í=í=í=í=íú<íó<íì<íå<íÞ<í×<íÐ<íÉ<íÂ<í»<í´<í­<í¦<íŸ<í˜<í‘<íŠ<íƒ<í|<íu<ín<íg<í`<íY<íR<íK<íD<í=<í6<í/<í(<í!<í<í<í <í<íþ;í÷;íð;íé;íâ;íÛ;íÔ;íÍ;íÆ;í¿;í¸;í±;íª;í£;íœ;í•;íŽ;í‡;í€;íy;ír;ík;íd;í];íV;íO;íH;íA;í:;í3;í,;í%;í;í;í;í ;í;íû:íô:íí:íæ:íß:íØ:íÑ:íÊ:íÃ:í¼:íµ:í®:í§:í :í™:í’:í‹:í„:í}:ív:ío:íh:ía:íZ:íS:íL:íE:í>:í7:í0:í):í":í:í:í :í:íÿ9íø9íñ9íê9íã9íÜ9íÕ9íÎ9íÇ9íÀ9í¹9í²9í«9í¤9í9í–9í9íˆ9í9íz9ís9íl9íe9í^9íW9íP9íI9íB9í;9í49í-9í&9í9í9í9í 9í9íü8íõ8íî8íç8íà8íÙ8íÒ8íË8íÄ8í½8í¶8í¯8í¨8í¡8íš8í“8íŒ8í…8í~8íw8íp8íi8íb8í[8íT8íM8íF8í?8í88í18í*8í#8í8í8í8í8í8íù7íò7íë7íä7íÝ7íÖ7íÏ7íÈ7íÁ7íº7í³7í¬7í¥7íž7í—7í7í‰7í‚7í{7ít7ím7íf7í_7íX7íQ7íJ7íC7í<7í57í.7í'7í 7í7í7í 7í7íý6íö6íï6íè6íá6íÚ6íÓ6íÌ6íÅ6í¾6í·6í°6í©6í¢6í›6í”6í6í†6í6íx6íq6íj6íc6í\6íU6íN6íG6í@6í96í26í+6í$6í6í6í6í6í6íú5íó5íì5íå5íÞ5í×5íÐ5íÉ5íÂ5í»5í´5í­5í¦5íŸ5í˜5í‘5íŠ5íƒ5í|5íu5ín5íg5í`5íY5íR5íK5íD5í=5í65í/5í(5í!5í5í5í 5í5íþ4í÷4íð4íé4íâ4íÛ4íÔ4íÍ4íÆ4í¿4í¸4í±4íª4í£4íœ4í•4íŽ4í‡4í€4íy4ír4ík4íd4í]4íV4íO4íH4íA4í:4í34í,4í%4í4í4í4í 4í4íû3íô3íí3íæ3íß3íØ3íÑ3íÊ3íÃ3í¼3íµ3í®3í§3í 3í™3í’3í‹3í„3í}3ív3ío3íh3ía3íZ3íS3íL3íE3í>3í73í03í)3í"3í3í3í 3í3íÿ2íø2íñ2íê2íã2íÜ2íÕ2íÎ2íÇ2íÀ2í¹2í²2í«2í¤2í2í–2í2íˆ2í2íz2ís2íl2íe2í^2íW2íP2íI2íB2í;2í42í-2í&2í2í2í2í 2í2íü1íõ1íî1íç1íà1íÙ1íÒ1íË1íÄ1í½1í¶1í¯1í¨1í¡1íš1í“1íŒ1í…1í~1íw1íp1íi1íb1í[1íT1íM1íF1í?1í81í11í*1í#1í1í1í1í1í1íù0íò0íë0íä0íÝ0íÖ0íÏ0íÈ0íÁ0íº0í³0í¬0í¥0íž0í—0í0í‰0í‚0í{0ít0ím0íf0í_0íX0íQ0íJ0íC0í<0í50í.0í'0í 0í0í0í 0í0íý/íö/íï/íè/íá/íÚ/íÓ/íÌ/íÅ/í¾/í·/í°/í©/í¢/í›/í”/í/í†/í/íx/íq/íj/íc/í\/íU/íN/íG/í@/í9/í2/í+/í$/í/í/í/í/í/íú.íó.íì.íå.íÞ.í×.íÐ.íÉ.íÂ.í».í´.í­.í¦.íŸ.í˜.í‘.íŠ.íƒ.í|.íu.ín.íg.í`.íY.íR.íK.íD.í=.í6.í/.í(.í!.í.í.í .í.íþ-í÷-íð-íé-íâ-íÛ-íÔ-íÍ-íÆ-í¿-í¸-í±-íª-í£-íœ-í•-íŽ-í‡-í€-íy-ír-ík-íd-í]-íV-íO-íH-íA-í:-í3-í,-í%-í-í-í-í -í-íû,íô,íí,íæ,íß,íØ,íÑ,íÊ,íÃ,í¼,íµ,í®,í§,í ,í™,í’,í‹,í„,í},ív,ío,íh,ía,íZ,íS,íL,íE,í>,í7,í0,í),í",í,í,í ,í,íÿ+íø+íñ+íê+íã+íÜ+íÕ+íÎ+íÇ+íÀ+í¹+í²+í«+í¤+í+í–+í+íˆ+í+íz+ís+íl+íe+í^+íW+íP+íI+íB+í;+í4+í-+í&+í+í+í+í +í+íü*íõ*íî*íç*íà*íÙ*íÒ*íË*íÄ*í½*í¶*í¯*í¨*í¡*íš*í“*íŒ*í…*í~*íw*íp*íi*íb*í[*íT*íM*íF*í?*í8*í1*í**í#*í*í*í*í*í*íù)íò)íë)íä)íÝ)íÖ)íÏ)íÈ)íÁ)íº)í³)í¬)í¥)íž)í—)í)í‰)í‚)í{)ít)ím)íf)í_)íX)íQ)íJ)íC)í<)í5)í.)í')í )í)í)í )í)íý(íö(íï(íè(íá(íÚ(íÓ(íÌ(íÅ(í¾(í·(í°(í©(í¢(í›(í”(í(í†(í(íx(íq(íj(íc(í\(íU(íN(íG(í@(í9(í2(í+(í$(í(í(í(í(í(íú'íó'íì'íå'íÞ'í×'íÐ'íÉ'íÂ'í»'í´'í­'í¦'íŸ'í˜'í‘'íŠ'íƒ'í|'íu'ín'íg'í`'íY'íR'íK'íD'í='í6'í/'í('í!'í'í'í 'í'íþ&í÷&íð&íé&íâ&íÛ&íÔ&íÍ&íÆ&í¿&í¸&í±&íª&í£&íœ&í•&íŽ&í‡&í€&íy&ír&ík&íd&í]&íV&íO&íH&íA&í:&í3&í,&í%&í&í&í&í &í&íû%íô%íí%íæ%íß%íØ%íÑ%íÊ%íÃ%í¼%íµ%í®%í§%í %í™%í’%í‹%í„%í}%ív%ío%íh%ía%íZ%íS%íL%íE%í>%í7%í0%í)%í"%í%í%í %í%íÿ$íø$íñ$íê$íã$íÜ$íÕ$íÎ$íÇ$íÀ$í¹$í²$í«$í¤$í$í–$í$íˆ$í$íz$ís$íl$íe$í^$íW$íP$íI$íB$í;$í4$í-$í&$í$í$í$í $í$íü#íõ#íî#íç#íà#íÙ#íÒ#íË#íÄ#í½#í¶#í¯#í¨#í¡#íš#í“#íŒ#í…#í~#íw#íp#íi#íb#í[#íT#íM#íF#í?#í8#í1#í*#í##í#í#í#í#í#íù"íò"íë"íä"íÝ"íÖ"íÏ"íÈ"íÁ"íº"í³"í¬"í¥"íž"í—"í"í‰"í‚"í{"ít"ím"íf"í_"íX"íQ"íJ"íC"í<"í5"í."í'"í "í"í"í "í"íý!íö!íï!íè!íá!íÚ!íÓ!íÌ!íÅ!í¾!í·!í°!í©!í¢!í›!í”!í!í†!í!íx!íq!íj!íc!í\!íU!íN!íG!í@!í9!í2!í+!í$!í!í!í!í!í!íú íó íì íå íÞ í× íÐ íÉ í í» í´ í­ í¦ íŸ í˜ í‘ íŠ íƒ í| íu ín íg í` íY íR íK íD í= í6 í/ í( í! í í í í íþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííù íò íë íä íÝ íÖ íÏ íÈ íÁ íº í³ í¬ í¥ íž í— í í‰ í‚ í{ ít ím íf í_ íX íQ íJ íC í< í5 í. í' í í í í í íý íö íï íè íá íÚ íÓ íÌ íÅ í¾ í· í° í© í¢ í› í” í í† í íx íq íj íc í\ íU íN íG í@ í9 í2 í+ í$ í í í í í íú íó íì íå íÞ í× íÐ íÉ í í» í´ í­ í¦ íŸ í˜ í‘ íŠ íƒ í| íu ín íg í` íY íR íK íD í= í6 í/ í( í! í í í í íþ í÷ íð íé íâ íÛ íÔ íÍ íÆ í¿ í¸ í± íª í£ íœ í• íŽ í‡ í€ íy ír ík íd í] íV íO íH íA í: í3 í, í% í í í í í íû íô íí íæ íß íØ íÑ íÊ íà í¼ íµ í® í§ í  í™ í’ í‹ í„ í} ív ío íh ía íZ íS íL íE í> í7 í0 í) í" í í í í íÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùÿìòÿìëÿìäÿìÝÿìÖÿìÏÿìÈÿìÁÿìºÿì³ÿì¬ÿì¥ÿìžÿì—ÿìÿì‰ÿì‚ÿì{ÿìtÿìmÿìfÿì_ÿìXÿìQÿìJÿìCÿì<ÿì5ÿì.ÿì'ÿì ÿìÿìÿì ÿìÿìýþìöþìïþìèþìáþìÚþìÓþìÌþìÅþì¾þì·þì°þì©þì¢þì›þì”þìþì†þìþìxþìqþìjþìcþì\þìUþìNþìGþì@þì9þì2þì+þì$þìþìþìþìþìþìúýìóýììýìåýìÞýì×ýìÐýìÉýìÂýì»ýì´ýì­ýì¦ýìŸýì˜ýì‘ýìŠýìƒýì|ýìuýìnýìgýì`ýìYýìRýìKýìDýì=ýì6ýì/ýì(ýì!ýìýìýì ýìýìþüì÷üìðüìéüìâüìÛüìÔüìÍüìÆüì¿üì¸üì±üìªüì£üìœüì•üìŽüì‡üì€üìyüìrüìküìdüì]üìVüìOüìHüìAüì:üì3üì,üì%üìüìüìüì üìüìûûìôûìíûìæûìßûìØûìÑûìÊûìÃûì¼ûìµûì®ûì§ûì ûì™ûì’ûì‹ûì„ûì}ûìvûìoûìhûìaûìZûìSûìLûìEûì>ûì7ûì0ûì)ûì"ûìûìûì ûìûìÿúìøúìñúìêúìãúìÜúìÕúìÎúìÇúìÀúì¹úì²úì«úì¤úìúì–úìúìˆúìúìzúìsúìlúìeúì^úìWúìPúìIúìBúì;úì4úì-úì&úìúìúìúì úìúìüùìõùìîùìçùìàùìÙùìÒùìËùìÄùì½ùì¶ùì¯ùì¨ùì¡ùìšùì“ùìŒùì…ùì~ùìwùìpùìiùìbùì[ùìTùìMùìFùì?ùì8ùì1ùì*ùì#ùìùìùìùìùìùìùøìòøìëøìäøìÝøìÖøìÏøìÈøìÁøìºøì³øì¬øì¥øìžøì—øìøì‰øì‚øì{øìtøìmøìføì_øìXøìQøìJøìCøì<øì5øì.øì'øì øìøìøì øìøìý÷ìö÷ìï÷ìè÷ìá÷ìÚ÷ìÓ÷ìÌ÷ìÅ÷ì¾÷ì·÷ì°÷ì©÷ì¢÷ì›÷ì”÷ì÷ì†÷ì÷ìx÷ìq÷ìj÷ìc÷ì\÷ìU÷ìN÷ìG÷ì@÷ì9÷ì2÷ì+÷ì$÷ì÷ì÷ì÷ì÷ì÷ìúöìóöììöìåöìÞöì×öìÐöìÉöìÂöì»öì´öì­öì¦öìŸöì˜öì‘öìŠöìƒöì|öìuöìnöìgöì`öìYöìRöìKöìDöì=öì6öì/öì(öì!öìöìöì öìöìþõì÷õìðõìéõìâõìÛõìÔõìÍõìÆõì¿õì¸õì±õìªõì£õìœõì•õìŽõì‡õì€õìyõìrõìkõìdõì]õìVõìOõìHõìAõì:õì3õì,õì%õìõìõìõì õìõìûôìôôìíôìæôìßôìØôìÑôìÊôìÃôì¼ôìµôì®ôì§ôì ôì™ôì’ôì‹ôì„ôì}ôìvôìoôìhôìaôìZôìSôìLôìEôì>ôì7ôì0ôì)ôì"ôìôìôì ôìôìÿóìøóìñóìêóìãóìÜóìÕóìÎóìÇóìÀóì¹óì²óì«óì¤óìóì–óìóìˆóìóìzóìsóìlóìeóì^óìWóìPóìIóìBóì;óì4óì-óì&óìóìóìóì óìóìüòìõòìîòìçòìàòìÙòìÒòìËòìÄòì½òì¶òì¯òì¨òì¡òìšòì“òìŒòì…òì~òìwòìpòìiòìbòì[òìTòìMòìFòì?òì8òì1òì*òì#òìòìòìòìòìòìùñìòñìëñìäñìÝñìÖñìÏñìÈñìÁñìºñì³ñì¬ñì¥ñìžñì—ñìñì‰ñì‚ñì{ñìtñìmñìfñì_ñìXñìQñìJñìCñì<ñì5ñì.ñì'ñì ñìñìñì ñìñìýðìöðìïðìèðìáðìÚðìÓðìÌðìÅðì¾ðì·ðì°ðì©ðì¢ðì›ðì”ðìðì†ðìðìxðìqðìjðìcðì\ðìUðìNðìGðì@ðì9ðì2ðì+ðì$ðìðìðìðìðìðìúïìóïììïìåïìÞïì×ïìÐïìÉïìÂïì»ïì´ïì­ïì¦ïìŸïì˜ïì‘ïìŠïìƒïì|ïìuïìnïìgïì`ïìYïìRïìKïìDïì=ïì6ïì/ïì(ïì!ïìïìïì ïìïìþîì÷îìðîìéîìâîìÛîìÔîìÍîìÆîì¿îì¸îì±îìªîì£îìœîì•îìŽîì‡îì€îìyîìrîìkîìdîì]îìVîìOîìHîìAîì:îì3îì,îì%îìîìîìîì îìîìûíìôíìííìæíìßíìØíìÑíìÊíìÃíì¼íìµíì®íì§íì íì™íì’íì‹íì„íì}íìvíìoíìhíìaíìZíìSíìLíìEíì>íì7íì0íì)íì"íìíìíì íìíìÿììøììñììêììãììÜììÕììÎììÇììÀìì¹ìì²ìì«ìì¤ìììì–ììììˆììììzììsììlììeìì^ììWììPììIììBìì;ìì4ìì-ìì&ìììììììì ììììüëìõëìîëìçëìàëìÙëìÒëìËëìÄëì½ëì¶ëì¯ëì¨ëì¡ëìšëì“ëìŒëì…ëì~ëìwëìpëìiëìbëì[ëìTëìMëìFëì?ëì8ëì1ëì*ëì#ëìëìëìëìëìëìùêìòêìëêìäêìÝêìÖêìÏêìÈêìÁêìºêì³êì¬êì¥êìžêì—êìêì‰êì‚êì{êìtêìmêìfêì_êìXêìQêìJêìCêì<êì5êì.êì'êì êìêìêì êìêìýéìöéìïéìèéìáéìÚéìÓéìÌéìÅéì¾éì·éì°éì©éì¢éì›éì”éìéì†éìéìxéìqéìjéìcéì\éìUéìNéìGéì@éì9éì2éì+éì$éìéìéìéìéìéìúèìóèììèìåèìÞèì×èìÐèìÉèìÂèì»èì´èì­èì¦èìŸèì˜èì‘èìŠèìƒèì|èìuèìnèìgèì`èìYèìRèìKèìDèì=èì6èì/èì(èì!èìèìèì èìèìþçì÷çìðçìéçìâçìÛçìÔçìÍçìÆçì¿çì¸çì±çìªçì£çìœçì•çìŽçì‡çì€çìyçìrçìkçìdçì]çìVçìOçìHçìAçì:çì3çì,çì%çìçìçìçì çìçìûæìôæìíæìææìßæìØæìÑæìÊæìÃæì¼æìµæì®æì§æì æì™æì’æì‹æì„æì}æìvæìoæìhæìaæìZæìSæìLæìEæì>æì7æì0æì)æì"æìæìæì æìæìÿåìøåìñåìêåìãåìÜåìÕåìÎåìÇåìÀåì¹åì²åì«åì¤åìåì–åìåìˆåìåìzåìsåìlåìeåì^åìWåìPåìIåìBåì;åì4åì-åì&åìåìåìåì åìåìüäìõäìîäìçäìàäìÙäìÒäìËäìÄäì½äì¶äì¯äì¨äì¡äìšäì“äìŒäì…äì~äìwäìpäìiäìbäì[äìTäìMäìFäì?äì8äì1äì*äì#äìäìäìäìäìäìùãìòãìëãìäãìÝãìÖãìÏãìÈãìÁãìºãì³ãì¬ãì¥ãìžãì—ãìãì‰ãì‚ãì{ãìtãìmãìfãì_ãìXãìQãìJãìCãì<ãì5ãì.ãì'ãì ãìãìãì ãìãìýâìöâìïâìèâìáâìÚâìÓâìÌâìÅâì¾âì·âì°âì©âì¢âì›âì”âìâì†âìâìxâìqâìjâìcâì\âìUâìNâìGâì@âì9âì2âì+âì$âìâìâìâìâìâìúáìóáììáìåáìÞáì×áìÐáìÉáìÂáì»áì´áì­áì¦áìŸáì˜áì‘áìŠáìƒáì|áìuáìnáìgáì`áìYáìRáìKáìDáì=áì6áì/áì(áì!áìáìáì áìáìþàì÷àìðàìéàìâàìÛàìÔàìÍàìÆàì¿àì¸àì±àìªàì£àìœàì•àìŽàì‡àì€àìyàìràìkàìdàì]àìVàìOàìHàìAàì:àì3àì,àì%àìàìàìàì àìàìûßìôßìíßìæßìßßìØßìÑßìÊßìÃßì¼ßìµßì®ßì§ßì ßì™ßì’ßì‹ßì„ßì}ßìvßìoßìhßìaßìZßìSßìLßìEßì>ßì7ßì0ßì)ßì"ßìßìßì ßìßìÿÞìøÞìñÞìêÞìãÞìÜÞìÕÞìÎÞìÇÞìÀÞì¹Þì²Þì«Þì¤ÞìÞì–ÞìÞìˆÞìÞìzÞìsÞìlÞìeÞì^ÞìWÞìPÞìIÞìBÞì;Þì4Þì-Þì&ÞìÞìÞìÞì ÞìÞìüÝìõÝìîÝìçÝìàÝìÙÝìÒÝìËÝìÄÝì½Ýì¶Ýì¯Ýì¨Ýì¡ÝìšÝì“ÝìŒÝì…Ýì~ÝìwÝìpÝìiÝìbÝì[ÝìTÝìMÝìFÝì?Ýì8Ýì1Ýì*Ýì#ÝìÝìÝìÝìÝìÝìùÜìòÜìëÜìäÜìÝÜìÖÜìÏÜìÈÜìÁÜìºÜì³Üì¬Üì¥ÜìžÜì—ÜìÜì‰Üì‚Üì{ÜìtÜìmÜìfÜì_ÜìXÜìQÜìJÜìCÜì<Üì5Üì.Üì'Üì ÜìÜìÜì ÜìÜìýÛìöÛìïÛìèÛìáÛìÚÛìÓÛìÌÛìÅÛì¾Ûì·Ûì°Ûì©Ûì¢Ûì›Ûì”ÛìÛì†ÛìÛìxÛìqÛìjÛìcÛì\ÛìUÛìNÛìGÛì@Ûì9Ûì2Ûì+Ûì$ÛìÛìÛìÛìÛìÛìúÚìóÚììÚìåÚìÞÚì×ÚìÐÚìÉÚìÂÚì»Úì´Úì­Úì¦ÚìŸÚì˜Úì‘ÚìŠÚìƒÚì|ÚìuÚìnÚìgÚì`ÚìYÚìRÚìKÚìDÚì=Úì6Úì/Úì(Úì!ÚìÚìÚì ÚìÚìþÙì÷ÙìðÙìéÙìâÙìÛÙìÔÙìÍÙìÆÙì¿Ùì¸Ùì±ÙìªÙì£ÙìœÙì•ÙìŽÙì‡Ùì€ÙìyÙìrÙìkÙìdÙì]ÙìVÙìOÙìHÙìAÙì:Ùì3Ùì,Ùì%ÙìÙìÙìÙì ÙìÙìûØìôØìíØìæØìߨìØØìÑØìÊØìÃØì¼ØìµØì®Øì§Øì Øì™Øì’Øì‹Øì„Øì}ØìvØìoØìhØìaØìZØìSØìLØìEØì>Øì7Øì0Øì)Øì"ØìØìØì ØìØìÿ×ìø×ìñ×ìê×ìã×ìÜ×ìÕ×ìÎ×ìÇ×ìÀ×ì¹×ì²×ì«×ì¤×ì×ì–×ì×ìˆ×ì×ìz×ìs×ìl×ìe×ì^×ìW×ìP×ìI×ìB×ì;×ì4×ì-×ì&×ì×ì×ì×ì ×ì×ìüÖìõÖìîÖìçÖìàÖìÙÖìÒÖìËÖìÄÖì½Öì¶Öì¯Öì¨Öì¡ÖìšÖì“ÖìŒÖì…Öì~ÖìwÖìpÖìiÖìbÖì[ÖìTÖìMÖìFÖì?Öì8Öì1Öì*Öì#ÖìÖìÖìÖìÖìÖìùÕìòÕìëÕìäÕìÝÕìÖÕìÏÕìÈÕìÁÕìºÕì³Õì¬Õì¥ÕìžÕì—ÕìÕì‰Õì‚Õì{ÕìtÕìmÕìfÕì_ÕìXÕìQÕìJÕìCÕì<Õì5Õì.Õì'Õì ÕìÕìÕì ÕìÕìýÔìöÔìïÔìèÔìáÔìÚÔìÓÔìÌÔìÅÔì¾Ôì·Ôì°Ôì©Ôì¢Ôì›Ôì”ÔìÔì†ÔìÔìxÔìqÔìjÔìcÔì\ÔìUÔìNÔìGÔì@Ôì9Ôì2Ôì+Ôì$ÔìÔìÔìÔìÔìÔìúÓìóÓììÓìåÓìÞÓì×ÓìÐÓìÉÓìÂÓì»Óì´Óì­Óì¦ÓìŸÓì˜Óì‘ÓìŠÓìƒÓì|ÓìuÓìnÓìgÓì`ÓìYÓìRÓìKÓìDÓì=Óì6Óì/Óì(Óì!ÓìÓìÓì ÓìÓìþÒì÷ÒìðÒìéÒìâÒìÛÒìÔÒìÍÒìÆÒì¿Òì¸Òì±ÒìªÒì£ÒìœÒì•ÒìŽÒì‡Òì€ÒìyÒìrÒìkÒìdÒì]ÒìVÒìOÒìHÒìAÒì:Òì3Òì,Òì%ÒìÒìÒìÒì ÒìÒìûÑìôÑìíÑìæÑìßÑìØÑìÑÑìÊÑìÃÑì¼ÑìµÑì®Ñì§Ñì Ñì™Ñì’Ñì‹Ñì„Ñì}ÑìvÑìoÑìhÑìaÑìZÑìSÑìLÑìEÑì>Ñì7Ñì0Ñì)Ñì"ÑìÑìÑì ÑìÑìÿÐìøÐìñÐìêÐìãÐìÜÐìÕÐìÎÐìÇÐìÀÐì¹Ðì²Ðì«Ðì¤ÐìÐì–ÐìÐìˆÐìÐìzÐìsÐìlÐìeÐì^ÐìWÐìPÐìIÐìBÐì;Ðì4Ðì-Ðì&ÐìÐìÐìÐì ÐìÐìüÏìõÏìîÏìçÏìàÏìÙÏìÒÏìËÏìÄÏì½Ïì¶Ïì¯Ïì¨Ïì¡ÏìšÏì“ÏìŒÏì…Ïì~ÏìwÏìpÏìiÏìbÏì[ÏìTÏìMÏìFÏì?Ïì8Ïì1Ïì*Ïì#ÏìÏìÏìÏìÏìÏìùÎìòÎìëÎìäÎìÝÎìÖÎìÏÎìÈÎìÁÎìºÎì³Îì¬Îì¥ÎìžÎì—ÎìÎì‰Îì‚Îì{ÎìtÎìmÎìfÎì_ÎìXÎìQÎìJÎìCÎì<Îì5Îì.Îì'Îì ÎìÎìÎì ÎìÎìýÍìöÍìïÍìèÍìáÍìÚÍìÓÍìÌÍìÅÍì¾Íì·Íì°Íì©Íì¢Íì›Íì”ÍìÍì†ÍìÍìxÍìqÍìjÍìcÍì\ÍìUÍìNÍìGÍì@Íì9Íì2Íì+Íì$ÍìÍìÍìÍìÍìÍìúÌìóÌììÌìåÌìÞÌì×ÌìÐÌìÉÌìÂÌì»Ìì´Ìì­Ìì¦ÌìŸÌì˜Ìì‘ÌìŠÌìƒÌì|ÌìuÌìnÌìgÌì`ÌìYÌìRÌìKÌìDÌì=Ìì6Ìì/Ìì(Ìì!ÌìÌìÌì ÌìÌìþËì÷ËìðËìéËìâËìÛËìÔËìÍËìÆËì¿Ëì¸Ëì±ËìªËì£ËìœËì•ËìŽËì‡Ëì€ËìyËìrËìkËìdËì]ËìVËìOËìHËìAËì:Ëì3Ëì,Ëì%ËìËìËìËì ËìËìûÊìôÊìíÊìæÊìßÊìØÊìÑÊìÊÊìÃÊì¼ÊìµÊì®Êì§Êì Êì™Êì’Êì‹Êì„Êì}ÊìvÊìoÊìhÊìaÊìZÊìSÊìLÊìEÊì>Êì7Êì0Êì)Êì"ÊìÊìÊì ÊìÊìÿÉìøÉìñÉìêÉìãÉìÜÉìÕÉìÎÉìÇÉìÀÉì¹Éì²Éì«Éì¤ÉìÉì–ÉìÉìˆÉìÉìzÉìsÉìlÉìeÉì^ÉìWÉìPÉìIÉìBÉì;Éì4Éì-Éì&ÉìÉìÉìÉì ÉìÉìüÈìõÈìîÈìçÈìàÈìÙÈìÒÈìËÈìÄÈì½Èì¶Èì¯Èì¨Èì¡ÈìšÈì“ÈìŒÈì…Èì~ÈìwÈìpÈìiÈìbÈì[ÈìTÈìMÈìFÈì?Èì8Èì1Èì*Èì#ÈìÈìÈìÈìÈìÈìùÇìòÇìëÇìäÇìÝÇìÖÇìÏÇìÈÇìÁÇìºÇì³Çì¬Çì¥ÇìžÇì—ÇìÇì‰Çì‚Çì{ÇìtÇìmÇìfÇì_ÇìXÇìQÇìJÇìCÇì<Çì5Çì.Çì'Çì ÇìÇìÇì ÇìÇìýÆìöÆìïÆìèÆìáÆìÚÆìÓÆìÌÆìÅÆì¾Æì·Æì°Æì©Æì¢Æì›Æì”ÆìÆì†ÆìÆìxÆìqÆìjÆìcÆì\ÆìUÆìNÆìGÆì@Æì9Æì2Æì+Æì$ÆìÆìÆìÆìÆìÆìúÅìóÅììÅìåÅìÞÅì×ÅìÐÅìÉÅìÂÅì»Åì´Åì­Åì¦ÅìŸÅì˜Åì‘ÅìŠÅìƒÅì|ÅìuÅìnÅìgÅì`ÅìYÅìRÅìKÅìDÅì=Åì6Åì/Åì(Åì!ÅìÅìÅì ÅìÅìþÄì÷ÄìðÄìéÄìâÄìÛÄìÔÄìÍÄìÆÄì¿Äì¸Äì±ÄìªÄì£ÄìœÄì•ÄìŽÄì‡Äì€ÄìyÄìrÄìkÄìdÄì]ÄìVÄìOÄìHÄìAÄì:Äì3Äì,Äì%ÄìÄìÄìÄì ÄìÄìûÃìôÃìíÃìæÃìßÃìØÃìÑÃìÊÃìÃÃì¼ÃìµÃì®Ãì§Ãì Ãì™Ãì’Ãì‹Ãì„Ãì}ÃìvÃìoÃìhÃìaÃìZÃìSÃìLÃìEÃì>Ãì7Ãì0Ãì)Ãì"ÃìÃìÃì ÃìÃìÿÂìøÂìñÂìêÂìãÂìÜÂìÕÂìÎÂìÇÂìÀÂì¹Âì²Âì«Âì¤ÂìÂì–ÂìÂìˆÂìÂìzÂìsÂìlÂìeÂì^ÂìWÂìPÂìIÂìBÂì;Âì4Âì-Âì&ÂìÂìÂìÂì ÂìÂìüÁìõÁìîÁìçÁìàÁìÙÁìÒÁìËÁìÄÁì½Áì¶Áì¯Áì¨Áì¡ÁìšÁì“ÁìŒÁì…Áì~ÁìwÁìpÁìiÁìbÁì[ÁìTÁìMÁìFÁì?Áì8Áì1Áì*Áì#ÁìÁìÁìÁìÁìÁìùÀìòÀìëÀìäÀìÝÀìÖÀìÏÀìÈÀìÁÀìºÀì³Àì¬Àì¥ÀìžÀì—ÀìÀì‰Àì‚Àì{ÀìtÀìmÀìfÀì_ÀìXÀìQÀìJÀìCÀì<Àì5Àì.Àì'Àì ÀìÀìÀì ÀìÀìý¿ìö¿ìï¿ìè¿ìá¿ìÚ¿ìÓ¿ìÌ¿ìſ쾿췿찿쩿좿웿씿ì¿ì†¿ì¿ìx¿ìq¿ìj¿ìc¿ì\¿ìU¿ìN¿ìG¿ì@¿ì9¿ì2¿ì+¿ì$¿ì¿ì¿ì¿ì¿ì¿ìú¾ìó¾ìì¾ìå¾ìÞ¾ì×¾ìоìɾì¾ì»¾ì´¾ì­¾ì¦¾ìŸ¾ì˜¾ì‘¾ìо샾ì|¾ìu¾ìn¾ìg¾ì`¾ìY¾ìR¾ìK¾ìD¾ì=¾ì6¾ì/¾ì(¾ì!¾ì¾ì¾ì ¾ì¾ìþ½ì÷½ìð½ìé½ìâ½ìÛ½ìÔ½ìͽìƽ쿽츽챽쪽죽윽약ì޽쇽쀽ìy½ìr½ìk½ìd½ì]½ìV½ìO½ìH½ìA½ì:½ì3½ì,½ì%½ì½ì½ì½ì ½ì½ìû¼ìô¼ìí¼ìæ¼ìß¼ìؼìѼìʼìü켼쵼쮼짼젼왼쒼싼센ì}¼ìv¼ìo¼ìh¼ìa¼ìZ¼ìS¼ìL¼ìE¼ì>¼ì7¼ì0¼ì)¼ì"¼ì¼ì¼ì ¼ì¼ìÿ»ìø»ìñ»ìê»ìã»ìÜ»ìÕ»ìλìÇ»ìÀ»ì¹»ì²»ì«»ì¤»ì»ì–»ì»ìˆ»ì»ìz»ìs»ìl»ìe»ì^»ìW»ìP»ìI»ìB»ì;»ì4»ì-»ì&»ì»ì»ì»ì »ì»ìüºìõºìîºìçºìàºìÙºìÒºì˺ìĺ콺춺쯺쨺졺욺쓺쌺셺ì~ºìwºìpºìiºìbºì[ºìTºìMºìFºì?ºì8ºì1ºì*ºì#ºìºìºìºìºìºìù¹ìò¹ìë¹ìä¹ìݹìÖ¹ìϹìȹìÁ¹ìº¹ì³¹ì¬¹ì¥¹ìž¹ì—¹ì¹ì‰¹ì‚¹ì{¹ìt¹ìm¹ìf¹ì_¹ìX¹ìQ¹ìJ¹ìC¹ì<¹ì5¹ì.¹ì'¹ì ¹ì¹ì¹ì ¹ì¹ìý¸ìö¸ìï¸ìè¸ìá¸ìÚ¸ìÓ¸ì̸ìŸì¾¸ì·¸ì°¸ì©¸ì¢¸ì›¸ì”¸ì¸ì†¸ì¸ìx¸ìq¸ìj¸ìc¸ì\¸ìU¸ìN¸ìG¸ì@¸ì9¸ì2¸ì+¸ì$¸ì¸ì¸ì¸ì¸ì¸ìú·ìó·ìì·ìå·ìÞ·ì×·ìзìÉ·ì·ì»·ì´·ì­·ì¦·ìŸ·ì˜·ì‘·ìŠ·ìƒ·ì|·ìu·ìn·ìg·ì`·ìY·ìR·ìK·ìD·ì=·ì6·ì/·ì(·ì!·ì·ì·ì ·ì·ìþ¶ì÷¶ìð¶ìé¶ìâ¶ìÛ¶ìÔ¶ìͶìƶ쿶츶챶쪶죶윶앶ì޶쇶쀶ìy¶ìr¶ìk¶ìd¶ì]¶ìV¶ìO¶ìH¶ìA¶ì:¶ì3¶ì,¶ì%¶ì¶ì¶ì¶ì ¶ì¶ìûµìôµìíµìæµìßµìصìѵìʵìõ켵쵵쮵짵젵왵쒵싵섵ì}µìvµìoµìhµìaµìZµìSµìLµìEµì>µì7µì0µì)µì"µìµìµì µìµìÿ´ìø´ìñ´ìê´ìã´ìÜ´ìÕ´ìδìÇ´ìÀ´ì¹´ì²´ì«´ì¤´ì´ì–´ì´ìˆ´ì´ìz´ìs´ìl´ìe´ì^´ìW´ìP´ìI´ìB´ì;´ì4´ì-´ì&´ì´ì´ì´ì ´ì´ìü³ìõ³ìî³ìç³ìà³ìÙ³ìÒ³ì˳ìij콳춳쯳쨳졳욳쓳쌳셳ì~³ìw³ìp³ìi³ìb³ì[³ìT³ìM³ìF³ì?³ì8³ì1³ì*³ì#³ì³ì³ì³ì³ì³ìù²ìò²ìë²ìä²ìݲìÖ²ìϲìȲìÁ²ìº²ì³²ì¬²ì¥²ìž²ì—²ì²ì‰²ì‚²ì{²ìt²ìm²ìf²ì_²ìX²ìQ²ìJ²ìC²ì<²ì5²ì.²ì'²ì ²ì²ì²ì ²ì²ìý±ìö±ìï±ìè±ìá±ìÚ±ìÓ±ì̱ìű쾱췱찱쩱좱웱씱ì±ì†±ì±ìx±ìq±ìj±ìc±ì\±ìU±ìN±ìG±ì@±ì9±ì2±ì+±ì$±ì±ì±ì±ì±ì±ìú°ìó°ìì°ìå°ìÞ°ì×°ìаìɰì°ì»°ì´°ì­°ì¦°ìŸ°ì˜°ì‘°ìа샰ì|°ìu°ìn°ìg°ì`°ìY°ìR°ìK°ìD°ì=°ì6°ì/°ì(°ì!°ì°ì°ì °ì°ìþ¯ì÷¯ìð¯ìé¯ìâ¯ìÛ¯ìÔ¯ìͯìƯ쿯츯챯쪯죯윯앯ìޝ쇯쀯ìy¯ìr¯ìk¯ìd¯ì]¯ìV¯ìO¯ìH¯ìA¯ì:¯ì3¯ì,¯ì%¯ì¯ì¯ì¯ì ¯ì¯ìû®ìô®ìí®ìæ®ìß®ìØ®ìÑ®ìÊ®ìî켮쵮쮮짮젮왮쒮싮섮ì}®ìv®ìo®ìh®ìa®ìZ®ìS®ìL®ìE®ì>®ì7®ì0®ì)®ì"®ì®ì®ì ®ì®ìÿ­ìø­ìñ­ìê­ìã­ìÜ­ìÕ­ìέìÇ­ìÀ­ì¹­ì²­ì«­ì¤­ì­ì–­ì­ìˆ­ì­ìz­ìs­ìl­ìe­ì^­ìW­ìP­ìI­ìB­ì;­ì4­ì-­ì&­ì­ì­ì­ì ­ì­ìü¬ìõ¬ìî¬ìç¬ìà¬ìÙ¬ìÒ¬ìˬìĬ콬춬쯬쨬졬욬쓬쌬셬ì~¬ìw¬ìp¬ìi¬ìb¬ì[¬ìT¬ìM¬ìF¬ì?¬ì8¬ì1¬ì*¬ì#¬ì¬ì¬ì¬ì¬ì¬ìù«ìò«ìë«ìä«ìÝ«ìÖ«ìÏ«ìÈ«ìÁ«ìº«ì³«ì¬«ì¥«ìž«ì—«ì«ì‰«ì‚«ì{«ìt«ìm«ìf«ì_«ìX«ìQ«ìJ«ìC«ì<«ì5«ì.«ì'«ì «ì«ì«ì «ì«ìýªìöªìïªìèªìáªìÚªìÓªì̪ìŪ쾪췪찪쩪좪웪씪ìªì†ªìªìxªìqªìjªìcªì\ªìUªìNªìGªì@ªì9ªì2ªì+ªì$ªìªìªìªìªìªìú©ìó©ìì©ìå©ìÞ©ìשìЩìÉ©ì©ì»©ì´©ì­©ì¦©ìŸ©ì˜©ì‘©ìŠ©ìƒ©ì|©ìu©ìn©ìg©ì`©ìY©ìR©ìK©ìD©ì=©ì6©ì/©ì(©ì!©ì©ì©ì ©ì©ìþ¨ì÷¨ìð¨ìé¨ìâ¨ìÛ¨ìÔ¨ìͨìƨ쿨츨챨쪨죨율앨ìލ쇨쀨ìy¨ìr¨ìk¨ìd¨ì]¨ìV¨ìO¨ìH¨ìA¨ì:¨ì3¨ì,¨ì%¨ì¨ì¨ì¨ì ¨ì¨ìû§ìô§ìí§ìæ§ìß§ìاìѧìʧìçì¼§ìµ§ì®§ì§§ì §ì™§ì’§ì‹§ì„§ì}§ìv§ìo§ìh§ìa§ìZ§ìS§ìL§ìE§ì>§ì7§ì0§ì)§ì"§ì§ì§ì §ì§ìÿ¦ìø¦ìñ¦ìê¦ìã¦ìܦìÕ¦ìΦìǦìÀ¦ì¹¦ì²¦ì«¦ì¤¦ì¦ì–¦ì¦ìˆ¦ì¦ìz¦ìs¦ìl¦ìe¦ì^¦ìW¦ìP¦ìI¦ìB¦ì;¦ì4¦ì-¦ì&¦ì¦ì¦ì¦ì ¦ì¦ìü¥ìõ¥ìî¥ìç¥ìà¥ìÙ¥ìÒ¥ìË¥ìĥ콥춥쯥쨥졥욥쓥쌥셥ì~¥ìw¥ìp¥ìi¥ìb¥ì[¥ìT¥ìM¥ìF¥ì?¥ì8¥ì1¥ì*¥ì#¥ì¥ì¥ì¥ì¥ì¥ìù¤ìò¤ìë¤ìä¤ìݤìÖ¤ìϤìȤìÁ¤ìº¤ì³¤ì¬¤ì¥¤ìž¤ì—¤ì¤ì‰¤ì‚¤ì{¤ìt¤ìm¤ìf¤ì_¤ìX¤ìQ¤ìJ¤ìC¤ì<¤ì5¤ì.¤ì'¤ì ¤ì¤ì¤ì ¤ì¤ìý£ìö£ìï£ìè£ìá£ìÚ£ìÓ£ìÌ£ìţ쾣췣찣쩣좣웣씣ì£ì†£ì£ìx£ìq£ìj£ìc£ì\£ìU£ìN£ìG£ì@£ì9£ì2£ì+£ì$£ì£ì£ì£ì£ì£ìú¢ìó¢ìì¢ìå¢ìÞ¢ì×¢ìТìÉ¢ì¢ì»¢ì´¢ì­¢ì¦¢ìŸ¢ì˜¢ì‘¢ìŠ¢ìƒ¢ì|¢ìu¢ìn¢ìg¢ì`¢ìY¢ìR¢ìK¢ìD¢ì=¢ì6¢ì/¢ì(¢ì!¢ì¢ì¢ì ¢ì¢ìþ¡ì÷¡ìð¡ìé¡ìâ¡ìÛ¡ìÔ¡ìÍ¡ìÆ¡ì¿¡ì¸¡ì±¡ìª¡ì£¡ìœ¡ì•¡ìŽ¡ì‡¡ì€¡ìy¡ìr¡ìk¡ìd¡ì]¡ìV¡ìO¡ìH¡ìA¡ì:¡ì3¡ì,¡ì%¡ì¡ì¡ì¡ì ¡ì¡ìû ìô ìí ìæ ìß ìØ ìÑ ìÊ ìàì¼ ìµ ì® ì§ ì  ì™ ì’ ì‹ ì„ ì} ìv ìo ìh ìa ìZ ìS ìL ìE ì> ì7 ì0 ì) ì" ì ì ì  ì ìÿŸìøŸìñŸìêŸìãŸìÜŸìÕŸìΟìÇŸìÀŸì¹Ÿì²Ÿì«Ÿì¤ŸìŸì–ŸìŸìˆŸìŸìzŸìsŸìlŸìeŸì^ŸìWŸìPŸìIŸìBŸì;Ÿì4Ÿì-Ÿì&ŸìŸìŸìŸì ŸìŸìüžìõžìîžìçžìàžìÙžìÒžìËžìĞ콞춞쯞쨞졞욞쓞쌞셞ì~žìwžìpžìižìbžì[žìTžìMžìFžì?žì8žì1žì*žì#žìžìžìžìžìžìùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýœìöœìïœìèœìáœìÚœìÓœìÌœìŜ쾜췜찜쩜좜웜씜ìœì†œìœìxœìqœìjœìcœì\œìUœìNœìGœì@œì9œì2œì+œì$œìœìœìœìœìœìú›ìó›ìì›ìå›ìÞ›ì×›ìЛìÉ›ì›ì»›ì´›ì­›ì¦›ìŸ›ì˜›ì‘›ìŠ›ìƒ›ì|›ìu›ìn›ìg›ì`›ìY›ìR›ìK›ìD›ì=›ì6›ì/›ì(›ì!›ì›ì›ì ›ì›ìþšì÷šìðšìéšìâšìÛšìÔšìÍšìÆšì¿šì¸šì±šìªšì£šìœšì•šìŽšì‡šì€šìyšìršìkšìdšì]šìVšìOšìHšìAšì:šì3šì,šì%šìšìšìšì šìšìû™ìô™ìí™ìæ™ìß™ìØ™ìÑ™ìÊ™ìÙ켙쵙쮙짙젙왙쒙싙섙ì}™ìv™ìo™ìh™ìa™ìZ™ìS™ìL™ìE™ì>™ì7™ì0™ì)™ì"™ì™ì™ì ™ì™ìÿ˜ìø˜ìñ˜ìê˜ìã˜ìܘìÕ˜ìΘìǘìÀ˜ì¹˜ì²˜ì«˜ì¤˜ì˜ì–˜ì˜ìˆ˜ì˜ìz˜ìs˜ìl˜ìe˜ì^˜ìW˜ìP˜ìI˜ìB˜ì;˜ì4˜ì-˜ì&˜ì˜ì˜ì˜ì ˜ì˜ìü—ìõ—ìî—ìç—ìà—ìÙ—ìÒ—ìË—ìė콗춗쯗쨗졗욗쓗쌗셗ì~—ìw—ìp—ìi—ìb—ì[—ìT—ìM—ìF—ì?—ì8—ì1—ì*—ì#—ì—ì—ì—ì—ì—ìù–ìò–ìë–ìä–ìÝ–ìÖ–ìÏ–ìÈ–ìÁ–캖쳖쬖쥖잖엖ì–쉖삖ì{–ìt–ìm–ìf–ì_–ìX–ìQ–ìJ–ìC–ì<–ì5–ì.–ì'–ì –ì–ì–ì –ì–ìý•ìö•ìï•ìè•ìá•ìÚ•ìÓ•ìÌ•ìŕ쾕췕찕쩕좕웕씕ì•솕ì•ìx•ìq•ìj•ìc•ì\•ìU•ìN•ìG•ì@•ì9•ì2•ì+•ì$•ì•ì•ì•ì•ì•ìú”ìó”ìì”ìå”ìÞ”ì×”ìДìÉ”ì”컔촔쭔즔쟔옔쑔슔샔ì|”ìu”ìn”ìg”ì`”ìY”ìR”ìK”ìD”ì=”ì6”ì/”ì(”ì!”ì”ì”ì ”ì”ìþ“ì÷“ìð“ìé“ìâ“ìÛ“ìÔ“ìÍ“ìÆ“ì¿“ì¸“ì±“ìª“ì£“ìœ“ì•“ìŽ“ì‡“ì€“ìy“ìr“ìk“ìd“ì]“ìV“ìO“ìH“ìA“ì:“ì3“ì,“ì%“ì“ì“ì“ì “ì“ìû’ìô’ìí’ìæ’ìß’ìØ’ìÑ’ìÊ’ìÃ’ì¼’ìµ’ì®’ì§’ì ’ì™’ì’’ì‹’ì„’ì}’ìv’ìo’ìh’ìa’ìZ’ìS’ìL’ìE’ì>’ì7’ì0’ì)’ì"’ì’ì’ì ’ì’ìÿ‘ìø‘ìñ‘ìê‘ìã‘ìÜ‘ìÕ‘ìΑìÇ‘ìÀ‘칑첑쫑중ì‘ì–‘ì‘숑ì‘ìz‘ìs‘ìl‘ìe‘ì^‘ìW‘ìP‘ìI‘ìB‘ì;‘ì4‘ì-‘ì&‘ì‘ì‘ì‘ì ‘ì‘ìüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýŽìöŽìïŽìèŽìáŽìÚŽìÓŽìÌŽìŎ쾎췎찎쩎좎웎씎ìŽì†ŽìŽìxŽìqŽìjŽìcŽì\ŽìUŽìNŽìGŽì@Žì9Žì2Žì+Žì$ŽìŽìŽìŽìŽìŽìúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþŒì÷ŒìðŒìéŒìâŒìÛŒìÔŒìÍŒìÆŒì¿Œì¸Œì±ŒìªŒì£ŒìœŒì•ŒìŽŒì‡Œì€ŒìyŒìrŒìkŒìdŒì]ŒìVŒìOŒìHŒìAŒì:Œì3Œì,Œì%ŒìŒìŒìŒì ŒìŒìû‹ìô‹ìí‹ìæ‹ìß‹ìØ‹ìÑ‹ìÊ‹ìË켋쵋쮋짋젋왋쒋싋섋ì}‹ìv‹ìo‹ìh‹ìa‹ìZ‹ìS‹ìL‹ìE‹ì>‹ì7‹ì0‹ì)‹ì"‹ì‹ì‹ì ‹ì‹ìÿŠìøŠìñŠìêŠìãŠìÜŠìÕŠìΊìÇŠìÀŠì¹Šì²Šì«Šì¤ŠìŠì–ŠìŠìˆŠìŠìzŠìsŠìlŠìeŠì^ŠìWŠìPŠìIŠìBŠì;Šì4Šì-Šì&ŠìŠìŠìŠì ŠìŠìü‰ìõ‰ìî‰ìç‰ìà‰ìÙ‰ìÒ‰ìˉìĉ콉춉쯉쨉졉욉쓉쌉셉ì~‰ìw‰ìp‰ìi‰ìb‰ì[‰ìT‰ìM‰ìF‰ì?‰ì8‰ì1‰ì*‰ì#‰ì‰ì‰ì‰ì‰ì‰ìùˆìòˆìëˆìäˆì݈ìÖˆìψìȈìÁˆìºˆì³ˆì¬ˆì¥ˆìžˆì—ˆìˆì‰ˆì‚ˆì{ˆìtˆìmˆìfˆì_ˆìXˆìQˆìJˆìCˆì<ˆì5ˆì.ˆì'ˆì ˆìˆìˆì ˆìˆìý‡ìö‡ìï‡ìè‡ìá‡ìÚ‡ìÓ‡ì̇ìŇ쾇췇찇쩇좇웇씇ì‡ì†‡ì‡ìx‡ìq‡ìj‡ìc‡ì\‡ìU‡ìN‡ìG‡ì@‡ì9‡ì2‡ì+‡ì$‡ì‡ì‡ì‡ì‡ì‡ìú†ìó†ìì†ìå†ìÞ†ì׆ìІìɆì†ì»†ì´†ì­†ì¦†ìŸ†ì˜†ì‘†ìІìƒ†ì|†ìu†ìn†ìg†ì`†ìY†ìR†ìK†ìD†ì=†ì6†ì/†ì(†ì!†ì†ì†ì †ì†ìþ…ì÷…ìð…ìé…ìâ…ìÛ…ìÔ…ìÍ…ìÆ…ì¿…ì¸…ì±…ìª…ì£…ìœ…ì•…ìŽ…ì‡…ì€…ìy…ìr…ìk…ìd…ì]…ìV…ìO…ìH…ìA…ì:…ì3…ì,…ì%…ì…ì…ì…ì …ì…ìû„ìô„ìí„ìæ„ìß„ìØ„ìÑ„ìÊ„ìÄ켄쵄쮄진전완쒄싄섄ì}„ìv„ìo„ìh„ìa„ìZ„ìS„ìL„ìE„ì>„ì7„ì0„ì)„ì"„ì„ì„ì „ì„ìÿƒìøƒìñƒìêƒìãƒì܃ìÕƒì΃ìǃìÀƒì¹ƒì²ƒì«ƒì¤ƒìƒì–ƒìƒìˆƒìƒìzƒìsƒìlƒìeƒì^ƒìWƒìPƒìIƒìBƒì;ƒì4ƒì-ƒì&ƒìƒìƒìƒì ƒìƒìü‚ìõ‚ìî‚ìç‚ìà‚ìÙ‚ìÒ‚ìË‚ìĂ콂춂쯂쨂졂욂쓂쌂셂ì~‚ìw‚ìp‚ìi‚ìb‚ì[‚ìT‚ìM‚ìF‚ì?‚ì8‚ì1‚ì*‚ì#‚ì‚ì‚ì‚ì‚ì‚ìùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììý€ìö€ìï€ìè€ìá€ìÚ€ìÓ€ìÌ€ìŀ쾀췀찀쩀좀움씀ì€ì†€ì€ìx€ìq€ìj€ìc€ì\€ìU€ìN€ìG€ì@€ì9€ì2€ì+€ì$€ì€ì€ì€ì€ì€ìúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþ~ì÷~ìð~ìé~ìâ~ìÛ~ìÔ~ìÍ~ìÆ~ì¿~ì¸~ì±~ìª~ì£~ìœ~ì•~ìŽ~ì‡~ì€~ìy~ìr~ìk~ìd~ì]~ìV~ìO~ìH~ìA~ì:~ì3~ì,~ì%~ì~ì~ì~ì ~ì~ìû}ìô}ìí}ìæ}ìß}ìØ}ìÑ}ìÊ}ìÃ}ì¼}ìµ}ì®}ì§}ì }ì™}ì’}ì‹}ì„}ì}}ìv}ìo}ìh}ìa}ìZ}ìS}ìL}ìE}ì>}ì7}ì0}ì)}ì"}ì}ì}ì }ì}ìÿ|ìø|ìñ|ìê|ìã|ìÜ|ìÕ|ìÎ|ìÇ|ìÀ|ì¹|ì²|ì«|ì¤|ì|ì–|ì|ìˆ|ì|ìz|ìs|ìl|ìe|ì^|ìW|ìP|ìI|ìB|ì;|ì4|ì-|ì&|ì|ì|ì|ì |ì|ìü{ìõ{ìî{ìç{ìà{ìÙ{ìÒ{ìË{ìÄ{ì½{ì¶{ì¯{ì¨{ì¡{ìš{ì“{ìŒ{ì…{ì~{ìw{ìp{ìi{ìb{ì[{ìT{ìM{ìF{ì?{ì8{ì1{ì*{ì#{ì{ì{ì{ì{ì{ìùzìòzìëzìäzìÝzìÖzìÏzìÈzìÁzìºzì³zì¬zì¥zìžzì—zìzì‰zì‚zì{zìtzìmzìfzì_zìXzìQzìJzìCzìvì7vì0vì)vì"vìvìvì vìvìÿuìøuìñuìêuìãuìÜuìÕuìÎuìÇuìÀuì¹uì²uì«uì¤uìuì–uìuìˆuìuìzuìsuìluìeuì^uìWuìPuìIuìBuì;uì4uì-uì&uìuìuìuì uìuìütìõtìîtìçtìàtìÙtìÒtìËtìÄtì½tì¶tì¯tì¨tì¡tìštì“tìŒtì…tì~tìwtìptìitìbtì[tìTtìMtìFtì?tì8tì1tì*tì#tìtìtìtìtìtìùsìòsìësìäsìÝsìÖsìÏsìÈsìÁsìºsì³sì¬sì¥sìžsì—sìsì‰sì‚sì{sìtsìmsìfsì_sìXsìQsìJsìCsìoì7oì0oì)oì"oìoìoì oìoìÿnìønìñnìênìãnìÜnìÕnìÎnìÇnìÀnì¹nì²nì«nì¤nìnì–nìnìˆnìnìznìsnìlnìenì^nìWnìPnìInìBnì;nì4nì-nì&nìnìnìnì nìnìümìõmìîmìçmìàmìÙmìÒmìËmìÄmì½mì¶mì¯mì¨mì¡mìšmì“mìŒmì…mì~mìwmìpmìimìbmì[mìTmìMmìFmì?mì8mì1mì*mì#mìmìmìmìmìmìùlìòlìëlìälìÝlìÖlìÏlìÈlìÁlìºlì³lì¬lì¥lìžlì—lìlì‰lì‚lì{lìtlìmlìflì_lìXlìQlìJlìClìhì7hì0hì)hì"hìhìhì hìhìÿgìøgìñgìêgìãgìÜgìÕgìÎgìÇgìÀgì¹gì²gì«gì¤gìgì–gìgìˆgìgìzgìsgìlgìegì^gìWgìPgìIgìBgì;gì4gì-gì&gìgìgìgì gìgìüfìõfìîfìçfìàfìÙfìÒfìËfìÄfì½fì¶fì¯fì¨fì¡fìšfì“fìŒfì…fì~fìwfìpfìifìbfì[fìTfìMfìFfì?fì8fì1fì*fì#fìfìfìfìfìfìùeìòeìëeìäeìÝeìÖeìÏeìÈeìÁeìºeì³eì¬eì¥eìžeì—eìeì‰eì‚eì{eìteìmeìfeì_eìXeìQeìJeìCeìaì7aì0aì)aì"aìaìaì aìaìÿ`ìø`ìñ`ìê`ìã`ìÜ`ìÕ`ìÎ`ìÇ`ìÀ`ì¹`ì²`ì«`ì¤`ì`ì–`ì`ìˆ`ì`ìz`ìs`ìl`ìe`ì^`ìW`ìP`ìI`ìB`ì;`ì4`ì-`ì&`ì`ì`ì`ì `ì`ìü_ìõ_ìî_ìç_ìà_ìÙ_ìÒ_ìË_ìÄ_ì½_ì¶_ì¯_ì¨_ì¡_ìš_ì“_ìŒ_ì…_ì~_ìw_ìp_ìi_ìb_ì[_ìT_ìM_ìF_ì?_ì8_ì1_ì*_ì#_ì_ì_ì_ì_ì_ìù^ìò^ìë^ìä^ìÝ^ìÖ^ìÏ^ìÈ^ìÁ^ìº^ì³^ì¬^ì¥^ìž^ì—^ì^ì‰^ì‚^ì{^ìt^ìm^ìf^ì_^ìX^ìQ^ìJ^ìC^ì<^ì5^ì.^ì'^ì ^ì^ì^ì ^ì^ìý]ìö]ìï]ìè]ìá]ìÚ]ìÓ]ìÌ]ìÅ]ì¾]ì·]ì°]ì©]ì¢]ì›]ì”]ì]ì†]ì]ìx]ìq]ìj]ìc]ì\]ìU]ìN]ìG]ì@]ì9]ì2]ì+]ì$]ì]ì]ì]ì]ì]ìú\ìó\ìì\ìå\ìÞ\ì×\ìÐ\ìÉ\ìÂ\ì»\ì´\ì­\ì¦\ìŸ\ì˜\ì‘\ìŠ\ìƒ\ì|\ìu\ìn\ìg\ì`\ìY\ìR\ìK\ìD\ì=\ì6\ì/\ì(\ì!\ì\ì\ì \ì\ìþ[ì÷[ìð[ìé[ìâ[ìÛ[ìÔ[ìÍ[ìÆ[ì¿[ì¸[ì±[ìª[ì£[ìœ[ì•[ìŽ[ì‡[ì€[ìy[ìr[ìk[ìd[ì][ìV[ìO[ìH[ìA[ì:[ì3[ì,[ì%[ì[ì[ì[ì [ì[ìûZìôZìíZìæZìßZìØZìÑZìÊZìÃZì¼ZìµZì®Zì§Zì Zì™Zì’Zì‹Zì„Zì}ZìvZìoZìhZìaZìZZìSZìLZìEZì>Zì7Zì0Zì)Zì"ZìZìZì ZìZìÿYìøYìñYìêYìãYìÜYìÕYìÎYìÇYìÀYì¹Yì²Yì«Yì¤YìYì–YìYìˆYìYìzYìsYìlYìeYì^YìWYìPYìIYìBYì;Yì4Yì-Yì&YìYìYìYì YìYìüXìõXìîXìçXìàXìÙXìÒXìËXìÄXì½Xì¶Xì¯Xì¨Xì¡XìšXì“XìŒXì…Xì~XìwXìpXìiXìbXì[XìTXìMXìFXì?Xì8Xì1Xì*Xì#XìXìXìXìXìXìùWìòWìëWìäWìÝWìÖWìÏWìÈWìÁWìºWì³Wì¬Wì¥WìžWì—WìWì‰Wì‚Wì{WìtWìmWìfWì_WìXWìQWìJWìCWìSì7Sì0Sì)Sì"SìSìSì SìSìÿRìøRìñRìêRìãRìÜRìÕRìÎRìÇRìÀRì¹Rì²Rì«Rì¤RìRì–RìRìˆRìRìzRìsRìlRìeRì^RìWRìPRìIRìBRì;Rì4Rì-Rì&RìRìRìRì RìRìüQìõQìîQìçQìàQìÙQìÒQìËQìÄQì½Qì¶Qì¯Qì¨Qì¡QìšQì“QìŒQì…Qì~QìwQìpQìiQìbQì[QìTQìMQìFQì?Qì8Qì1Qì*Qì#QìQìQìQìQìQìùPìòPìëPìäPìÝPìÖPìÏPìÈPìÁPìºPì³Pì¬Pì¥PìžPì—PìPì‰Pì‚Pì{PìtPìmPìfPì_PìXPìQPìJPìCPìLì7Lì0Lì)Lì"LìLìLì LìLìÿKìøKìñKìêKìãKìÜKìÕKìÎKìÇKìÀKì¹Kì²Kì«Kì¤KìKì–KìKìˆKìKìzKìsKìlKìeKì^KìWKìPKìIKìBKì;Kì4Kì-Kì&KìKìKìKì KìKìüJìõJìîJìçJìàJìÙJìÒJìËJìÄJì½Jì¶Jì¯Jì¨Jì¡JìšJì“JìŒJì…Jì~JìwJìpJìiJìbJì[JìTJìMJìFJì?Jì8Jì1Jì*Jì#JìJìJìJìJìJìùIìòIìëIìäIìÝIìÖIìÏIìÈIìÁIìºIì³Iì¬Iì¥IìžIì—IìIì‰Iì‚Iì{IìtIìmIìfIì_IìXIìQIìJIìCIìEì7Eì0Eì)Eì"EìEìEì EìEìÿDìøDìñDìêDìãDìÜDìÕDìÎDìÇDìÀDì¹Dì²Dì«Dì¤DìDì–DìDìˆDìDìzDìsDìlDìeDì^DìWDìPDìIDìBDì;Dì4Dì-Dì&DìDìDìDì DìDìüCìõCìîCìçCìàCìÙCìÒCìËCìÄCì½Cì¶Cì¯Cì¨Cì¡CìšCì“CìŒCì…Cì~CìwCìpCìiCìbCì[CìTCìMCìFCì?Cì8Cì1Cì*Cì#CìCìCìCìCìCìùBìòBìëBìäBìÝBìÖBìÏBìÈBìÁBìºBì³Bì¬Bì¥BìžBì—BìBì‰Bì‚Bì{BìtBìmBìfBì_BìXBìQBìJBìCBììô>ìí>ìæ>ìß>ìØ>ìÑ>ìÊ>ìÃ>ì¼>ìµ>ì®>ì§>ì >ì™>ì’>ì‹>ì„>ì}>ìv>ìo>ìh>ìa>ìZ>ìS>ìL>ìE>ì>>ì7>ì0>ì)>ì">ì>ì>ì >ì>ìÿ=ìø=ìñ=ìê=ìã=ìÜ=ìÕ=ìÎ=ìÇ=ìÀ=ì¹=ì²=ì«=ì¤=ì=ì–=ì=ìˆ=ì=ìz=ìs=ìl=ìe=ì^=ìW=ìP=ìI=ìB=ì;=ì4=ì-=ì&=ì=ì=ì=ì =ì=ìü<ìõ<ìî<ìç<ìà<ìÙ<ìÒ<ìË<ìÄ<ì½<ì¶<ì¯<ì¨<ì¡<ìš<ì“<ìŒ<ì…<ì~<ìw<ìp<ìi<ìb<ì[<ìT<ìM<ìF<ì?<ì8<ì1<ì*<ì#<ì<ì<ì<ì<ì<ìù;ìò;ìë;ìä;ìÝ;ìÖ;ìÏ;ìÈ;ìÁ;ìº;ì³;ì¬;ì¥;ìž;ì—;ì;ì‰;ì‚;ì{;ìt;ìm;ìf;ì_;ìX;ìQ;ìJ;ìC;ì<;ì5;ì.;ì';ì ;ì;ì;ì ;ì;ìý:ìö:ìï:ìè:ìá:ìÚ:ìÓ:ìÌ:ìÅ:ì¾:ì·:ì°:ì©:ì¢:ì›:ì”:ì:ì†:ì:ìx:ìq:ìj:ìc:ì\:ìU:ìN:ìG:ì@:ì9:ì2:ì+:ì$:ì:ì:ì:ì:ì:ìú9ìó9ìì9ìå9ìÞ9ì×9ìÐ9ìÉ9ìÂ9ì»9ì´9ì­9ì¦9ìŸ9ì˜9ì‘9ìŠ9ìƒ9ì|9ìu9ìn9ìg9ì`9ìY9ìR9ìK9ìD9ì=9ì69ì/9ì(9ì!9ì9ì9ì 9ì9ìþ8ì÷8ìð8ìé8ìâ8ìÛ8ìÔ8ìÍ8ìÆ8ì¿8ì¸8ì±8ìª8ì£8ìœ8ì•8ìŽ8ì‡8ì€8ìy8ìr8ìk8ìd8ì]8ìV8ìO8ìH8ìA8ì:8ì38ì,8ì%8ì8ì8ì8ì 8ì8ìû7ìô7ìí7ìæ7ìß7ìØ7ìÑ7ìÊ7ìÃ7ì¼7ìµ7ì®7ì§7ì 7ì™7ì’7ì‹7ì„7ì}7ìv7ìo7ìh7ìa7ìZ7ìS7ìL7ìE7ì>7ì77ì07ì)7ì"7ì7ì7ì 7ì7ìÿ6ìø6ìñ6ìê6ìã6ìÜ6ìÕ6ìÎ6ìÇ6ìÀ6ì¹6ì²6ì«6ì¤6ì6ì–6ì6ìˆ6ì6ìz6ìs6ìl6ìe6ì^6ìW6ìP6ìI6ìB6ì;6ì46ì-6ì&6ì6ì6ì6ì 6ì6ìü5ìõ5ìî5ìç5ìà5ìÙ5ìÒ5ìË5ìÄ5ì½5ì¶5ì¯5ì¨5ì¡5ìš5ì“5ìŒ5ì…5ì~5ìw5ìp5ìi5ìb5ì[5ìT5ìM5ìF5ì?5ì85ì15ì*5ì#5ì5ì5ì5ì5ì5ìù4ìò4ìë4ìä4ìÝ4ìÖ4ìÏ4ìÈ4ìÁ4ìº4ì³4ì¬4ì¥4ìž4ì—4ì4ì‰4ì‚4ì{4ìt4ìm4ìf4ì_4ìX4ìQ4ìJ4ìC4ì<4ì54ì.4ì'4ì 4ì4ì4ì 4ì4ìý3ìö3ìï3ìè3ìá3ìÚ3ìÓ3ìÌ3ìÅ3ì¾3ì·3ì°3ì©3ì¢3ì›3ì”3ì3ì†3ì3ìx3ìq3ìj3ìc3ì\3ìU3ìN3ìG3ì@3ì93ì23ì+3ì$3ì3ì3ì3ì3ì3ìú2ìó2ìì2ìå2ìÞ2ì×2ìÐ2ìÉ2ìÂ2ì»2ì´2ì­2ì¦2ìŸ2ì˜2ì‘2ìŠ2ìƒ2ì|2ìu2ìn2ìg2ì`2ìY2ìR2ìK2ìD2ì=2ì62ì/2ì(2ì!2ì2ì2ì 2ì2ìþ1ì÷1ìð1ìé1ìâ1ìÛ1ìÔ1ìÍ1ìÆ1ì¿1ì¸1ì±1ìª1ì£1ìœ1ì•1ìŽ1ì‡1ì€1ìy1ìr1ìk1ìd1ì]1ìV1ìO1ìH1ìA1ì:1ì31ì,1ì%1ì1ì1ì1ì 1ì1ìû0ìô0ìí0ìæ0ìß0ìØ0ìÑ0ìÊ0ìÃ0ì¼0ìµ0ì®0ì§0ì 0ì™0ì’0ì‹0ì„0ì}0ìv0ìo0ìh0ìa0ìZ0ìS0ìL0ìE0ì>0ì70ì00ì)0ì"0ì0ì0ì 0ì0ìÿ/ìø/ìñ/ìê/ìã/ìÜ/ìÕ/ìÎ/ìÇ/ìÀ/ì¹/ì²/ì«/ì¤/ì/ì–/ì/ìˆ/ì/ìz/ìs/ìl/ìe/ì^/ìW/ìP/ìI/ìB/ì;/ì4/ì-/ì&/ì/ì/ì/ì /ì/ìü.ìõ.ìî.ìç.ìà.ìÙ.ìÒ.ìË.ìÄ.ì½.ì¶.ì¯.ì¨.ì¡.ìš.ì“.ìŒ.ì….ì~.ìw.ìp.ìi.ìb.ì[.ìT.ìM.ìF.ì?.ì8.ì1.ì*.ì#.ì.ì.ì.ì.ì.ìù-ìò-ìë-ìä-ìÝ-ìÖ-ìÏ-ìÈ-ìÁ-ìº-ì³-ì¬-ì¥-ìž-ì—-ì-ì‰-ì‚-ì{-ìt-ìm-ìf-ì_-ìX-ìQ-ìJ-ìC-ì<-ì5-ì.-ì'-ì -ì-ì-ì -ì-ìý,ìö,ìï,ìè,ìá,ìÚ,ìÓ,ìÌ,ìÅ,ì¾,ì·,ì°,ì©,ì¢,ì›,ì”,ì,ì†,ì,ìx,ìq,ìj,ìc,ì\,ìU,ìN,ìG,ì@,ì9,ì2,ì+,ì$,ì,ì,ì,ì,ì,ìú+ìó+ìì+ìå+ìÞ+ì×+ìÐ+ìÉ+ìÂ+ì»+ì´+ì­+ì¦+ìŸ+ì˜+ì‘+ìŠ+ìƒ+ì|+ìu+ìn+ìg+ì`+ìY+ìR+ìK+ìD+ì=+ì6+ì/+ì(+ì!+ì+ì+ì +ì+ìþ*ì÷*ìð*ìé*ìâ*ìÛ*ìÔ*ìÍ*ìÆ*ì¿*ì¸*ì±*ìª*ì£*ìœ*ì•*ìŽ*ì‡*ì€*ìy*ìr*ìk*ìd*ì]*ìV*ìO*ìH*ìA*ì:*ì3*ì,*ì%*ì*ì*ì*ì *ì*ìû)ìô)ìí)ìæ)ìß)ìØ)ìÑ)ìÊ)ìÃ)ì¼)ìµ)ì®)ì§)ì )ì™)ì’)ì‹)ì„)ì})ìv)ìo)ìh)ìa)ìZ)ìS)ìL)ìE)ì>)ì7)ì0)ì))ì")ì)ì)ì )ì)ìÿ(ìø(ìñ(ìê(ìã(ìÜ(ìÕ(ìÎ(ìÇ(ìÀ(ì¹(ì²(ì«(ì¤(ì(ì–(ì(ìˆ(ì(ìz(ìs(ìl(ìe(ì^(ìW(ìP(ìI(ìB(ì;(ì4(ì-(ì&(ì(ì(ì(ì (ì(ìü'ìõ'ìî'ìç'ìà'ìÙ'ìÒ'ìË'ìÄ'ì½'ì¶'ì¯'ì¨'ì¡'ìš'ì“'ìŒ'ì…'ì~'ìw'ìp'ìi'ìb'ì['ìT'ìM'ìF'ì?'ì8'ì1'ì*'ì#'ì'ì'ì'ì'ì'ìù&ìò&ìë&ìä&ìÝ&ìÖ&ìÏ&ìÈ&ìÁ&ìº&ì³&ì¬&ì¥&ìž&ì—&ì&ì‰&ì‚&ì{&ìt&ìm&ìf&ì_&ìX&ìQ&ìJ&ìC&ì<&ì5&ì.&ì'&ì &ì&ì&ì &ì&ìý%ìö%ìï%ìè%ìá%ìÚ%ìÓ%ìÌ%ìÅ%ì¾%ì·%ì°%ì©%ì¢%ì›%ì”%ì%ì†%ì%ìx%ìq%ìj%ìc%ì\%ìU%ìN%ìG%ì@%ì9%ì2%ì+%ì$%ì%ì%ì%ì%ì%ìú$ìó$ìì$ìå$ìÞ$ì×$ìÐ$ìÉ$ìÂ$ì»$ì´$ì­$ì¦$ìŸ$ì˜$ì‘$ìŠ$ìƒ$ì|$ìu$ìn$ìg$ì`$ìY$ìR$ìK$ìD$ì=$ì6$ì/$ì($ì!$ì$ì$ì $ì$ìþ#ì÷#ìð#ìé#ìâ#ìÛ#ìÔ#ìÍ#ìÆ#ì¿#ì¸#ì±#ìª#ì£#ìœ#ì•#ìŽ#ì‡#ì€#ìy#ìr#ìk#ìd#ì]#ìV#ìO#ìH#ìA#ì:#ì3#ì,#ì%#ì#ì#ì#ì #ì#ìû"ìô"ìí"ìæ"ìß"ìØ"ìÑ"ìÊ"ìÃ"ì¼"ìµ"ì®"ì§"ì "ì™"ì’"ì‹"ì„"ì}"ìv"ìo"ìh"ìa"ìZ"ìS"ìL"ìE"ì>"ì7"ì0"ì)"ì""ì"ì"ì "ì"ìÿ!ìø!ìñ!ìê!ìã!ìÜ!ìÕ!ìÎ!ìÇ!ìÀ!ì¹!ì²!ì«!ì¤!ì!ì–!ì!ìˆ!ì!ìz!ìs!ìl!ìe!ì^!ìW!ìP!ìI!ìB!ì;!ì4!ì-!ì&!ì!ì!ì!ì !ì!ìü ìõ ìî ìç ìà ìÙ ìÒ ìË ìÄ ì½ ì¶ ì¯ ì¨ ì¡ ìš ì“ ìŒ ì… ì~ ìw ìp ìi ìb ì[ ìT ìM ìF ì? ì8 ì1 ì* ì# ì ì ì ì ì ìùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììû ìô ìí ìæ ìß ìØ ìÑ ìÊ ìà ì¼ ìµ ì® ì§ ì  ì™ ì’ ì‹ ì„ ì} ìv ìo ìh ìa ìZ ìS ìL ìE ì> ì7 ì0 ì) ì" ì ì ì ì ìÿ ìø ìñ ìê ìã ìÜ ìÕ ìÎ ìÇ ìÀ ì¹ ì² ì« ì¤ ì ì– ì ìˆ ì ìz ìs ìl ìe ì^ ìW ìP ìI ìB ì; ì4 ì- ì& ì ì ì ì ì ìü ìõ ìî ìç ìà ìÙ ìÒ ìË ìÄ ì½ ì¶ ì¯ ì¨ ì¡ ìš ì“ ìŒ ì… ì~ ìw ìp ìi ìb ì[ ìT ìM ìF ì? ì8 ì1 ì* ì# ì ì ì ì ì ìù ìò ìë ìä ìÝ ìÖ ìÏ ìÈ ìÁ ìº ì³ ì¬ ì¥ ìž ì— ì ì‰ ì‚ ì{ ìt ìm ìf ì_ ìX ìQ ìJ ìC ì< ì5 ì. ì' ì ì ì ì ì ìý ìö ìï ìè ìá ìÚ ìÓ ìÌ ìÅ ì¾ ì· ì° ì© ì¢ ì› ì” ì ì† ì ìx ìq ìj ìc ì\ ìU ìN ìG ì@ ì9 ì2 ì+ ì$ ì ì ì ì ì ìúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûÿëôÿëíÿëæÿëßÿëØÿëÑÿëÊÿëÃÿë¼ÿëµÿë®ÿë§ÿë ÿë™ÿë’ÿë‹ÿë„ÿë}ÿëvÿëoÿëhÿëaÿëZÿëSÿëLÿëEÿë>ÿë7ÿë0ÿë)ÿë"ÿëÿëÿë ÿëÿëÿþëøþëñþëêþëãþëÜþëÕþëÎþëÇþëÀþë¹þë²þë«þë¤þëþë–þëþëˆþëþëzþësþëlþëeþë^þëWþëPþëIþëBþë;þë4þë-þë&þëþëþëþë þëþëüýëõýëîýëçýëàýëÙýëÒýëËýëÄýë½ýë¶ýë¯ýë¨ýë¡ýëšýë“ýëŒýë…ýë~ýëwýëpýëiýëbýë[ýëTýëMýëFýë?ýë8ýë1ýë*ýë#ýëýëýëýëýëýëùüëòüëëüëäüëÝüëÖüëÏüëÈüëÁüëºüë³üë¬üë¥üëžüë—üëüë‰üë‚üë{üëtüëmüëfüë_üëXüëQüëJüëCüë<üë5üë.üë'üë üëüëüë üëüëýûëöûëïûëèûëáûëÚûëÓûëÌûëÅûë¾ûë·ûë°ûë©ûë¢ûë›ûë”ûëûë†ûëûëxûëqûëjûëcûë\ûëUûëNûëGûë@ûë9ûë2ûë+ûë$ûëûëûëûëûëûëúúëóúëìúëåúëÞúë×úëÐúëÉúëÂúë»úë´úë­úë¦úëŸúë˜úë‘úëŠúëƒúë|úëuúënúëgúë`úëYúëRúëKúëDúë=úë6úë/úë(úë!úëúëúë úëúëþùë÷ùëðùëéùëâùëÛùëÔùëÍùëÆùë¿ùë¸ùë±ùëªùë£ùëœùë•ùëŽùë‡ùë€ùëyùërùëkùëdùë]ùëVùëOùëHùëAùë:ùë3ùë,ùë%ùëùëùëùë ùëùëûøëôøëíøëæøëßøëØøëÑøëÊøëÃøë¼øëµøë®øë§øë øë™øë’øë‹øë„øë}øëvøëoøëhøëaøëZøëSøëLøëEøë>øë7øë0øë)øë"øëøëøë øëøëÿ÷ëø÷ëñ÷ëê÷ëã÷ëÜ÷ëÕ÷ëÎ÷ëÇ÷ëÀ÷ë¹÷ë²÷ë«÷ë¤÷ë÷ë–÷ë÷ëˆ÷ë÷ëz÷ës÷ël÷ëe÷ë^÷ëW÷ëP÷ëI÷ëB÷ë;÷ë4÷ë-÷ë&÷ë÷ë÷ë÷ë ÷ë÷ëüöëõöëîöëçöëàöëÙöëÒöëËöëÄöë½öë¶öë¯öë¨öë¡öëšöë“öëŒöë…öë~öëwöëpöëiöëböë[öëTöëMöëFöë?öë8öë1öë*öë#öëöëöëöëöëöëùõëòõëëõëäõëÝõëÖõëÏõëÈõëÁõëºõë³õë¬õë¥õëžõë—õëõë‰õë‚õë{õëtõëmõëfõë_õëXõëQõëJõëCõë<õë5õë.õë'õë õëõëõë õëõëýôëöôëïôëèôëáôëÚôëÓôëÌôëÅôë¾ôë·ôë°ôë©ôë¢ôë›ôë”ôëôë†ôëôëxôëqôëjôëcôë\ôëUôëNôëGôë@ôë9ôë2ôë+ôë$ôëôëôëôëôëôëúóëóóëìóëåóëÞóë×óëÐóëÉóëÂóë»óë´óë­óë¦óëŸóë˜óë‘óëŠóëƒóë|óëuóënóëgóë`óëYóëRóëKóëDóë=óë6óë/óë(óë!óëóëóë óëóëþòë÷òëðòëéòëâòëÛòëÔòëÍòëÆòë¿òë¸òë±òëªòë£òëœòë•òëŽòë‡òë€òëyòëròëkòëdòë]òëVòëOòëHòëAòë:òë3òë,òë%òëòëòëòë òëòëûñëôñëíñëæñëßñëØñëÑñëÊñëÃñë¼ñëµñë®ñë§ñë ñë™ñë’ñë‹ñë„ñë}ñëvñëoñëhñëañëZñëSñëLñëEñë>ñë7ñë0ñë)ñë"ñëñëñë ñëñëÿðëøðëñðëêðëãðëÜðëÕðëÎðëÇðëÀðë¹ðë²ðë«ðë¤ðëðë–ðëðëˆðëðëzðësðëlðëeðë^ðëWðëPðëIðëBðë;ðë4ðë-ðë&ðëðëðëðë ðëðëüïëõïëîïëçïëàïëÙïëÒïëËïëÄïë½ïë¶ïë¯ïë¨ïë¡ïëšïë“ïëŒïë…ïë~ïëwïëpïëiïëbïë[ïëTïëMïëFïë?ïë8ïë1ïë*ïë#ïëïëïëïëïëïëùîëòîëëîëäîëÝîëÖîëÏîëÈîëÁîëºîë³îë¬îë¥îëžîë—îëîë‰îë‚îë{îëtîëmîëfîë_îëXîëQîëJîëCîë<îë5îë.îë'îë îëîëîë îëîëýíëöíëïíëèíëáíëÚíëÓíëÌíëÅíë¾íë·íë°íë©íë¢íë›íë”íëíë†íëíëxíëqíëjíëcíë\íëUíëNíëGíë@íë9íë2íë+íë$íëíëíëíëíëíëúìëóìëììëåìëÞìë×ìëÐìëÉìëÂìë»ìë´ìë­ìë¦ìëŸìë˜ìë‘ìëŠìëƒìë|ìëuìënìëgìë`ìëYìëRìëKìëDìë=ìë6ìë/ìë(ìë!ìëìëìë ìëìëþëë÷ëëðëëéëëâëëÛëëÔëëÍëëÆëë¿ëë¸ëë±ëëªëë£ëëœëë•ëëŽëë‡ëë€ëëyëërëëkëëdëë]ëëVëëOëëHëëAëë:ëë3ëë,ëë%ëëëëëëëë ëëëëûêëôêëíêëæêëßêëØêëÑêëÊêëÃêë¼êëµêë®êë§êë êë™êë’êë‹êë„êë}êëvêëoêëhêëaêëZêëSêëLêëEêë>êë7êë0êë)êë"êëêëêë êëêëÿéëøéëñéëêéëãéëÜéëÕéëÎéëÇéëÀéë¹éë²éë«éë¤éëéë–éëéëˆéëéëzéëséëléëeéë^éëWéëPéëIéëBéë;éë4éë-éë&éëéëéëéë éëéëüèëõèëîèëçèëàèëÙèëÒèëËèëÄèë½èë¶èë¯èë¨èë¡èëšèë“èëŒèë…èë~èëwèëpèëièëbèë[èëTèëMèëFèë?èë8èë1èë*èë#èëèëèëèëèëèëùçëòçëëçëäçëÝçëÖçëÏçëÈçëÁçëºçë³çë¬çë¥çëžçë—çëçë‰çë‚çë{çëtçëmçëfçë_çëXçëQçëJçëCçë<çë5çë.çë'çë çëçëçë çëçëýæëöæëïæëèæëáæëÚæëÓæëÌæëÅæë¾æë·æë°æë©æë¢æë›æë”æëæë†æëæëxæëqæëjæëcæë\æëUæëNæëGæë@æë9æë2æë+æë$æëæëæëæëæëæëúåëóåëìåëååëÞåë×åëÐåëÉåëÂåë»åë´åë­åë¦åëŸåë˜åë‘åëŠåëƒåë|åëuåënåëgåë`åëYåëRåëKåëDåë=åë6åë/åë(åë!åëåëåë åëåëþäë÷äëðäëéäëâäëÛäëÔäëÍäëÆäë¿äë¸äë±äëªäë£äëœäë•äëŽäë‡äë€äëyäëräëkäëdäë]äëVäëOäëHäëAäë:äë3äë,äë%äëäëäëäë äëäëûãëôãëíãëæãëßãëØãëÑãëÊãëÃãë¼ãëµãë®ãë§ãë ãë™ãë’ãë‹ãë„ãë}ãëvãëoãëhãëaãëZãëSãëLãëEãë>ãë7ãë0ãë)ãë"ãëãëãë ãëãëÿâëøâëñâëêâëãâëÜâëÕâëÎâëÇâëÀâë¹âë²âë«âë¤âëâë–âëâëˆâëâëzâësâëlâëeâë^âëWâëPâëIâëBâë;âë4âë-âë&âëâëâëâë âëâëüáëõáëîáëçáëàáëÙáëÒáëËáëÄáë½áë¶áë¯áë¨áë¡áëšáë“áëŒáë…áë~áëwáëpáëiáëbáë[áëTáëMáëFáë?áë8áë1áë*áë#áëáëáëáëáëáëùàëòàëëàëäàëÝàëÖàëÏàëÈàëÁàëºàë³àë¬àë¥àëžàë—àëàë‰àë‚àë{àëtàëmàëfàë_àëXàëQàëJàëCàë<àë5àë.àë'àë àëàëàë àëàëýßëößëïßëèßëáßëÚßëÓßëÌßëÅßë¾ßë·ßë°ßë©ßë¢ßë›ßë”ßëßë†ßëßëxßëqßëjßëcßë\ßëUßëNßëGßë@ßë9ßë2ßë+ßë$ßëßëßëßëßëßëúÞëóÞëìÞëåÞëÞÞë×ÞëÐÞëÉÞëÂÞë»Þë´Þë­Þë¦ÞëŸÞë˜Þë‘ÞëŠÞëƒÞë|ÞëuÞënÞëgÞë`ÞëYÞëRÞëKÞëDÞë=Þë6Þë/Þë(Þë!ÞëÞëÞë ÞëÞëþÝë÷ÝëðÝëéÝëâÝëÛÝëÔÝëÍÝëÆÝë¿Ýë¸Ýë±ÝëªÝë£ÝëœÝë•ÝëŽÝë‡Ýë€ÝëyÝërÝëkÝëdÝë]ÝëVÝëOÝëHÝëAÝë:Ýë3Ýë,Ýë%ÝëÝëÝëÝë ÝëÝëûÜëôÜëíÜëæÜëßÜëØÜëÑÜëÊÜëÃÜë¼ÜëµÜë®Üë§Üë Üë™Üë’Üë‹Üë„Üë}ÜëvÜëoÜëhÜëaÜëZÜëSÜëLÜëEÜë>Üë7Üë0Üë)Üë"ÜëÜëÜë ÜëÜëÿÛëøÛëñÛëêÛëãÛëÜÛëÕÛëÎÛëÇÛëÀÛë¹Ûë²Ûë«Ûë¤ÛëÛë–ÛëÛëˆÛëÛëzÛësÛëlÛëeÛë^ÛëWÛëPÛëIÛëBÛë;Ûë4Ûë-Ûë&ÛëÛëÛëÛë ÛëÛëüÚëõÚëîÚëçÚëàÚëÙÚëÒÚëËÚëÄÚë½Úë¶Úë¯Úë¨Úë¡ÚëšÚë“ÚëŒÚë…Úë~ÚëwÚëpÚëiÚëbÚë[ÚëTÚëMÚëFÚë?Úë8Úë1Úë*Úë#ÚëÚëÚëÚëÚëÚëùÙëòÙëëÙëäÙëÝÙëÖÙëÏÙëÈÙëÁÙëºÙë³Ùë¬Ùë¥ÙëžÙë—ÙëÙë‰Ùë‚Ùë{ÙëtÙëmÙëfÙë_ÙëXÙëQÙëJÙëCÙë<Ùë5Ùë.Ùë'Ùë ÙëÙëÙë ÙëÙëýØëöØëïØëèØëáØëÚØëÓØëÌØëÅØë¾Øë·Øë°Øë©Øë¢Øë›Øë”ØëØë†ØëØëxØëqØëjØëcØë\ØëUØëNØëGØë@Øë9Øë2Øë+Øë$ØëØëØëØëØëØëú×ëó×ëì×ëå×ëÞ×ë××ëÐ×ëÉ×ëÂ×ë»×ë´×ë­×ë¦×ëŸ×ë˜×ë‘×ëŠ×ëƒ×ë|×ëu×ën×ëg×ë`×ëY×ëR×ëK×ëD×ë=×ë6×ë/×ë(×ë!×ë×ë×ë ×ë×ëþÖë÷ÖëðÖëéÖëâÖëÛÖëÔÖëÍÖëÆÖë¿Öë¸Öë±ÖëªÖë£ÖëœÖë•ÖëŽÖë‡Öë€ÖëyÖërÖëkÖëdÖë]ÖëVÖëOÖëHÖëAÖë:Öë3Öë,Öë%ÖëÖëÖëÖë ÖëÖëûÕëôÕëíÕëæÕëßÕëØÕëÑÕëÊÕëÃÕë¼ÕëµÕë®Õë§Õë Õë™Õë’Õë‹Õë„Õë}ÕëvÕëoÕëhÕëaÕëZÕëSÕëLÕëEÕë>Õë7Õë0Õë)Õë"ÕëÕëÕë ÕëÕëÿÔëøÔëñÔëêÔëãÔëÜÔëÕÔëÎÔëÇÔëÀÔë¹Ôë²Ôë«Ôë¤ÔëÔë–ÔëÔëˆÔëÔëzÔësÔëlÔëeÔë^ÔëWÔëPÔëIÔëBÔë;Ôë4Ôë-Ôë&ÔëÔëÔëÔë ÔëÔëüÓëõÓëîÓëçÓëàÓëÙÓëÒÓëËÓëÄÓë½Óë¶Óë¯Óë¨Óë¡ÓëšÓë“ÓëŒÓë…Óë~ÓëwÓëpÓëiÓëbÓë[ÓëTÓëMÓëFÓë?Óë8Óë1Óë*Óë#ÓëÓëÓëÓëÓëÓëùÒëòÒëëÒëäÒëÝÒëÖÒëÏÒëÈÒëÁÒëºÒë³Òë¬Òë¥ÒëžÒë—ÒëÒë‰Òë‚Òë{ÒëtÒëmÒëfÒë_ÒëXÒëQÒëJÒëCÒë<Òë5Òë.Òë'Òë ÒëÒëÒë ÒëÒëýÑëöÑëïÑëèÑëáÑëÚÑëÓÑëÌÑëÅÑë¾Ñë·Ñë°Ñë©Ñë¢Ñë›Ñë”ÑëÑë†ÑëÑëxÑëqÑëjÑëcÑë\ÑëUÑëNÑëGÑë@Ñë9Ñë2Ñë+Ñë$ÑëÑëÑëÑëÑëÑëúÐëóÐëìÐëåÐëÞÐë×ÐëÐÐëÉÐëÂÐë»Ðë´Ðë­Ðë¦ÐëŸÐë˜Ðë‘ÐëŠÐëƒÐë|ÐëuÐënÐëgÐë`ÐëYÐëRÐëKÐëDÐë=Ðë6Ðë/Ðë(Ðë!ÐëÐëÐë ÐëÐëþÏë÷ÏëðÏëéÏëâÏëÛÏëÔÏëÍÏëÆÏë¿Ïë¸Ïë±ÏëªÏë£ÏëœÏë•ÏëŽÏë‡Ïë€ÏëyÏërÏëkÏëdÏë]ÏëVÏëOÏëHÏëAÏë:Ïë3Ïë,Ïë%ÏëÏëÏëÏë ÏëÏëûÎëôÎëíÎëæÎëßÎëØÎëÑÎëÊÎëÃÎë¼ÎëµÎë®Îë§Îë Îë™Îë’Îë‹Îë„Îë}ÎëvÎëoÎëhÎëaÎëZÎëSÎëLÎëEÎë>Îë7Îë0Îë)Îë"ÎëÎëÎë ÎëÎëÿÍëøÍëñÍëêÍëãÍëÜÍëÕÍëÎÍëÇÍëÀÍë¹Íë²Íë«Íë¤ÍëÍë–ÍëÍëˆÍëÍëzÍësÍëlÍëeÍë^ÍëWÍëPÍëIÍëBÍë;Íë4Íë-Íë&ÍëÍëÍëÍë ÍëÍëüÌëõÌëîÌëçÌëàÌëÙÌëÒÌëËÌëÄÌë½Ìë¶Ìë¯Ìë¨Ìë¡ÌëšÌë“ÌëŒÌë…Ìë~ÌëwÌëpÌëiÌëbÌë[ÌëTÌëMÌëFÌë?Ìë8Ìë1Ìë*Ìë#ÌëÌëÌëÌëÌëÌëùËëòËëëËëäËëÝËëÖËëÏËëÈËëÁËëºËë³Ëë¬Ëë¥ËëžËë—ËëËë‰Ëë‚Ëë{ËëtËëmËëfËë_ËëXËëQËëJËëCËë<Ëë5Ëë.Ëë'Ëë ËëËëËë ËëËëýÊëöÊëïÊëèÊëáÊëÚÊëÓÊëÌÊëÅÊë¾Êë·Êë°Êë©Êë¢Êë›Êë”ÊëÊë†ÊëÊëxÊëqÊëjÊëcÊë\ÊëUÊëNÊëGÊë@Êë9Êë2Êë+Êë$ÊëÊëÊëÊëÊëÊëúÉëóÉëìÉëåÉëÞÉë×ÉëÐÉëÉÉëÂÉë»Éë´Éë­Éë¦ÉëŸÉë˜Éë‘ÉëŠÉëƒÉë|ÉëuÉënÉëgÉë`ÉëYÉëRÉëKÉëDÉë=Éë6Éë/Éë(Éë!ÉëÉëÉë ÉëÉëþÈë÷ÈëðÈëéÈëâÈëÛÈëÔÈëÍÈëÆÈë¿Èë¸Èë±ÈëªÈë£ÈëœÈë•ÈëŽÈë‡Èë€ÈëyÈërÈëkÈëdÈë]ÈëVÈëOÈëHÈëAÈë:Èë3Èë,Èë%ÈëÈëÈëÈë ÈëÈëûÇëôÇëíÇëæÇëßÇëØÇëÑÇëÊÇëÃÇë¼ÇëµÇë®Çë§Çë Çë™Çë’Çë‹Çë„Çë}ÇëvÇëoÇëhÇëaÇëZÇëSÇëLÇëEÇë>Çë7Çë0Çë)Çë"ÇëÇëÇë ÇëÇëÿÆëøÆëñÆëêÆëãÆëÜÆëÕÆëÎÆëÇÆëÀÆë¹Æë²Æë«Æë¤ÆëÆë–ÆëÆëˆÆëÆëzÆësÆëlÆëeÆë^ÆëWÆëPÆëIÆëBÆë;Æë4Æë-Æë&ÆëÆëÆëÆë ÆëÆëüÅëõÅëîÅëçÅëàÅëÙÅëÒÅëËÅëÄÅë½Åë¶Åë¯Åë¨Åë¡ÅëšÅë“ÅëŒÅë…Åë~ÅëwÅëpÅëiÅëbÅë[ÅëTÅëMÅëFÅë?Åë8Åë1Åë*Åë#ÅëÅëÅëÅëÅëÅëùÄëòÄëëÄëäÄëÝÄëÖÄëÏÄëÈÄëÁÄëºÄë³Äë¬Äë¥ÄëžÄë—ÄëÄë‰Äë‚Äë{ÄëtÄëmÄëfÄë_ÄëXÄëQÄëJÄëCÄë<Äë5Äë.Äë'Äë ÄëÄëÄë ÄëÄëýÃëöÃëïÃëèÃëáÃëÚÃëÓÃëÌÃëÅÃë¾Ãë·Ãë°Ãë©Ãë¢Ãë›Ãë”ÃëÃë†ÃëÃëxÃëqÃëjÃëcÃë\ÃëUÃëNÃëGÃë@Ãë9Ãë2Ãë+Ãë$ÃëÃëÃëÃëÃëÃëúÂëóÂëìÂëåÂëÞÂë×ÂëÐÂëÉÂëÂÂë»Âë´Âë­Âë¦ÂëŸÂë˜Âë‘ÂëŠÂëƒÂë|ÂëuÂënÂëgÂë`ÂëYÂëRÂëKÂëDÂë=Âë6Âë/Âë(Âë!ÂëÂëÂë ÂëÂëþÁë÷ÁëðÁëéÁëâÁëÛÁëÔÁëÍÁëÆÁë¿Áë¸Áë±ÁëªÁë£ÁëœÁë•ÁëŽÁë‡Áë€ÁëyÁërÁëkÁëdÁë]ÁëVÁëOÁëHÁëAÁë:Áë3Áë,Áë%ÁëÁëÁëÁë ÁëÁëûÀëôÀëíÀëæÀëßÀëØÀëÑÀëÊÀëÃÀë¼ÀëµÀë®Àë§Àë Àë™Àë’Àë‹Àë„Àë}ÀëvÀëoÀëhÀëaÀëZÀëSÀëLÀëEÀë>Àë7Àë0Àë)Àë"ÀëÀëÀë ÀëÀëÿ¿ëø¿ëñ¿ëê¿ëã¿ëÜ¿ëÕ¿ëοëÇ¿ëÀ¿ë¹¿ë²¿ë«¿ë¤¿ë¿ë–¿ë¿ëˆ¿ë¿ëz¿ës¿ël¿ëe¿ë^¿ëW¿ëP¿ëI¿ëB¿ë;¿ë4¿ë-¿ë&¿ë¿ë¿ë¿ë ¿ë¿ëü¾ëõ¾ëî¾ëç¾ëà¾ëÙ¾ëÒ¾ë˾ëľë½¾ë¶¾ë¯¾ë¨¾ë¡¾ëš¾ë“¾ëŒ¾ë…¾ë~¾ëw¾ëp¾ëi¾ëb¾ë[¾ëT¾ëM¾ëF¾ë?¾ë8¾ë1¾ë*¾ë#¾ë¾ë¾ë¾ë¾ë¾ëù½ëò½ëë½ëä½ëݽëÖ½ëϽëȽëÁ½ëº½ë³½ë¬½ë¥½ëž½ë—½ë½ë‰½ë‚½ë{½ët½ëm½ëf½ë_½ëX½ëQ½ëJ½ëC½ë<½ë5½ë.½ë'½ë ½ë½ë½ë ½ë½ëý¼ëö¼ëï¼ëè¼ëá¼ëÚ¼ëÓ¼ë̼ëżë¾¼ë·¼ë°¼ë©¼ë¢¼ë›¼ë”¼ë¼ë†¼ë¼ëx¼ëq¼ëj¼ëc¼ë\¼ëU¼ëN¼ëG¼ë@¼ë9¼ë2¼ë+¼ë$¼ë¼ë¼ë¼ë¼ë¼ëú»ëó»ëì»ëå»ëÞ»ë×»ëлëÉ»ë»ë»»ë´»ë­»ë¦»ëŸ»ë˜»ë‘»ëŠ»ëƒ»ë|»ëu»ën»ëg»ë`»ëY»ëR»ëK»ëD»ë=»ë6»ë/»ë(»ë!»ë»ë»ë »ë»ëþºë÷ºëðºëéºëâºëÛºëÔºëͺëƺ뿺븺뱺몺룺뜺땺뎺뇺뀺ëyºërºëkºëdºë]ºëVºëOºëHºëAºë:ºë3ºë,ºë%ºëºëºëºë ºëºëû¹ëô¹ëí¹ëæ¹ëß¹ëعëѹëʹëù뼹뵹뮹맹령뙹뒹당넹ë}¹ëv¹ëo¹ëh¹ëa¹ëZ¹ëS¹ëL¹ëE¹ë>¹ë7¹ë0¹ë)¹ë"¹ë¹ë¹ë ¹ë¹ëÿ¸ëø¸ëñ¸ëê¸ëã¸ëܸëÕ¸ëθëǸëÀ¸ë¹¸ë²¸ë«¸ë¤¸ë¸ë–¸ë¸ëˆ¸ë¸ëz¸ës¸ël¸ëe¸ë^¸ëW¸ëP¸ëI¸ëB¸ë;¸ë4¸ë-¸ë&¸ë¸ë¸ë¸ë ¸ë¸ëü·ëõ·ëî·ëç·ëà·ëÙ·ëÒ·ëË·ëķ뽷붷믷먷롷뚷듷댷녷ë~·ëw·ëp·ëi·ëb·ë[·ëT·ëM·ëF·ë?·ë8·ë1·ë*·ë#·ë·ë·ë·ë·ë·ëù¶ëò¶ëë¶ëä¶ëݶëÖ¶ë϶ëȶëÁ¶ëº¶ë³¶ë¬¶ë¥¶ëž¶ë—¶ë¶ë‰¶ë‚¶ë{¶ët¶ëm¶ëf¶ë_¶ëX¶ëQ¶ëJ¶ëC¶ë<¶ë5¶ë.¶ë'¶ë ¶ë¶ë¶ë ¶ë¶ëýµëöµëïµëèµëáµëÚµëÓµë̵ëŵ뾵뷵밵멵뢵뛵딵ëµë†µëµëxµëqµëjµëcµë\µëUµëNµëGµë@µë9µë2µë+µë$µëµëµëµëµëµëú´ëó´ëì´ëå´ëÞ´ë×´ëдëÉ´ë´ë»´ë´´ë­´ë¦´ëŸ´ë˜´ë‘´ëŠ´ëƒ´ë|´ëu´ën´ëg´ë`´ëY´ëR´ëK´ëD´ë=´ë6´ë/´ë(´ë!´ë´ë´ë ´ë´ëþ³ë÷³ëð³ëé³ëâ³ëÛ³ëÔ³ëͳëƳ뿳븳뱳몳룳뜳땳ë޳뇳뀳ëy³ër³ëk³ëd³ë]³ëV³ëO³ëH³ëA³ë:³ë3³ë,³ë%³ë³ë³ë³ë ³ë³ëû²ëô²ëí²ëæ²ëß²ëزëѲëʲëò뼲뵲뮲맲렲뙲뒲닲넲ë}²ëv²ëo²ëh²ëa²ëZ²ëS²ëL²ëE²ë>²ë7²ë0²ë)²ë"²ë²ë²ë ²ë²ëÿ±ëø±ëñ±ëê±ëã±ëܱëÕ±ëαëDZëÀ±ë¹±ë²±ë«±ë¤±ë±ë–±ë±ëˆ±ë±ëz±ës±ël±ëe±ë^±ëW±ëP±ëI±ëB±ë;±ë4±ë-±ë&±ë±ë±ë±ë ±ë±ëü°ëõ°ëî°ëç°ëà°ëÙ°ëÒ°ë˰ëİ뽰붰믰먰롰뚰듰댰녰ë~°ëw°ëp°ëi°ëb°ë[°ëT°ëM°ëF°ë?°ë8°ë1°ë*°ë#°ë°ë°ë°ë°ë°ëù¯ëò¯ëë¯ëä¯ëݯëÖ¯ëϯëȯëÁ¯ëº¯ë³¯ë¬¯ë¥¯ëž¯ë—¯ë¯ë‰¯ë‚¯ë{¯ët¯ëm¯ëf¯ë_¯ëX¯ëQ¯ëJ¯ëC¯ë<¯ë5¯ë.¯ë'¯ë ¯ë¯ë¯ë ¯ë¯ëý®ëö®ëï®ëè®ëá®ëÚ®ëÓ®ëÌ®ëŮ뾮뷮밮멮뢮뛮딮ë®ë†®ë®ëx®ëq®ëj®ëc®ë\®ëU®ëN®ëG®ë@®ë9®ë2®ë+®ë$®ë®ë®ë®ë®ë®ëú­ëó­ëì­ëå­ëÞ­ë×­ëЭëÉ­ë­ë»­ë´­ë­­ë¦­ëŸ­ë˜­ë‘­ëŠ­ëƒ­ë|­ëu­ën­ëg­ë`­ëY­ëR­ëK­ëD­ë=­ë6­ë/­ë(­ë!­ë­ë­ë ­ë­ëþ¬ë÷¬ëð¬ëé¬ëâ¬ëÛ¬ëÔ¬ëͬëƬ뿬븬뱬몬룬뜬땬ëެ뇬뀬ëy¬ër¬ëk¬ëd¬ë]¬ëV¬ëO¬ëH¬ëA¬ë:¬ë3¬ë,¬ë%¬ë¬ë¬ë¬ë ¬ë¬ëû«ëô«ëí«ëæ«ëß«ëØ«ëÑ«ëÊ«ëë뼫뵫뮫맫렫뙫뒫닫넫ë}«ëv«ëo«ëh«ëa«ëZ«ëS«ëL«ëE«ë>«ë7«ë0«ë)«ë"«ë«ë«ë «ë«ëÿªëøªëñªëêªëãªëܪëÕªëΪëǪëÀªë¹ªë²ªë«ªë¤ªëªë–ªëªëˆªëªëzªësªëlªëeªë^ªëWªëPªëIªëBªë;ªë4ªë-ªë&ªëªëªëªë ªëªëü©ëõ©ëî©ëç©ëà©ëÙ©ëÒ©ëË©ëĩ뽩붩믩먩롩뚩듩댩녩ë~©ëw©ëp©ëi©ëb©ë[©ëT©ëM©ëF©ë?©ë8©ë1©ë*©ë#©ë©ë©ë©ë©ë©ëù¨ëò¨ëë¨ëä¨ëݨëÖ¨ëϨëȨëÁ¨ëº¨ë³¨ë¬¨ë¥¨ëž¨ë—¨ë¨ë‰¨ë‚¨ë{¨ët¨ëm¨ëf¨ë_¨ëX¨ëQ¨ëJ¨ëC¨ë<¨ë5¨ë.¨ë'¨ë ¨ë¨ë¨ë ¨ë¨ëý§ëö§ëï§ëè§ëá§ëÚ§ëÓ§ȩ̈ëŧ뾧뷧밧멧뢧뛧딧ë§ë†§ë§ëx§ëq§ëj§ëc§ë\§ëU§ëN§ëG§ë@§ë9§ë2§ë+§ë$§ë§ë§ë§ë§ë§ëú¦ëó¦ëì¦ëå¦ëÞ¦ëצëЦëɦë¦ë»¦ë´¦ë­¦ë¦¦ëŸ¦ë˜¦ë‘¦ëЦ냦ë|¦ëu¦ën¦ëg¦ë`¦ëY¦ëR¦ëK¦ëD¦ë=¦ë6¦ë/¦ë(¦ë!¦ë¦ë¦ë ¦ë¦ëþ¥ë÷¥ëð¥ëé¥ëâ¥ëÛ¥ëÔ¥ëÍ¥ëÆ¥ë¿¥ë¸¥ë±¥ëª¥ë£¥ëœ¥ë•¥ëŽ¥ë‡¥ë€¥ëy¥ër¥ëk¥ëd¥ë]¥ëV¥ëO¥ëH¥ëA¥ë:¥ë3¥ë,¥ë%¥ë¥ë¥ë¥ë ¥ë¥ëû¤ëô¤ëí¤ëæ¤ëߤëؤëѤëʤëä뼤뵤뮤매려뙤뒤다네ë}¤ëv¤ëo¤ëh¤ëa¤ëZ¤ëS¤ëL¤ëE¤ë>¤ë7¤ë0¤ë)¤ë"¤ë¤ë¤ë ¤ë¤ëÿ£ëø£ëñ£ëê£ëã£ëÜ£ëÕ£ëΣëÇ£ëÀ£ë¹£ë²£ë«£ë¤£ë£ë–£ë£ëˆ£ë£ëz£ës£ël£ëe£ë^£ëW£ëP£ëI£ëB£ë;£ë4£ë-£ë&£ë£ë£ë£ë £ë£ëü¢ëõ¢ëî¢ëç¢ëà¢ëÙ¢ëÒ¢ëË¢ëĢ뽢붢믢먢롢뚢듢댢녢ë~¢ëw¢ëp¢ëi¢ëb¢ë[¢ëT¢ëM¢ëF¢ë?¢ë8¢ë1¢ë*¢ë#¢ë¢ë¢ë¢ë¢ë¢ëù¡ëò¡ëë¡ëä¡ëÝ¡ëÖ¡ëÏ¡ëÈ¡ëÁ¡ëº¡ë³¡ë¬¡ë¥¡ëž¡ë—¡ë¡ë‰¡ë‚¡ë{¡ët¡ëm¡ëf¡ë_¡ëX¡ëQ¡ëJ¡ëC¡ë<¡ë5¡ë.¡ë'¡ë ¡ë¡ë¡ë ¡ë¡ëý ëö ëï ëè ëá ëÚ ëÓ ëÌ ëŠ뾠뷠밠멠뢠뛠딠ë ë† ë ëx ëq ëj ëc ë\ ëU ëN ëG ë@ ë9 ë2 ë+ ë$ ë ë ë ë ë ëúŸëóŸëìŸëåŸëÞŸëןëПëÉŸëŸë»Ÿë´Ÿë­Ÿë¦ŸëŸŸë˜Ÿë‘ŸëŠŸëƒŸë|ŸëuŸënŸëgŸë`ŸëYŸëRŸëKŸëDŸë=Ÿë6Ÿë/Ÿë(Ÿë!ŸëŸëŸë ŸëŸëþžë÷žëðžëéžëâžëÛžëÔžëÍžëÆžë¿žë¸žë±žëªžë£žëœžë•žëŽžë‡žë€žëyžëržëkžëdžë]žëVžëOžëHžëAžë:žë3žë,žë%žëžëžëžë žëžëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿœëøœëñœëêœëãœëÜœëÕœëΜëÇœëÀœë¹œë²œë«œë¤œëœë–œëœëˆœëœëzœësœëlœëeœë^œëWœëPœëIœëBœë;œë4œë-œë&œëœëœëœë œëœëü›ëõ›ëî›ëç›ëà›ëÙ›ëÒ›ëË›ëě뽛붛믛먛롛뚛듛댛녛ë~›ëw›ëp›ëi›ëb›ë[›ëT›ëM›ëF›ë?›ë8›ë1›ë*›ë#›ë›ë›ë›ë›ë›ëùšëòšëëšëäšëÝšëÖšëÏšëÈšëÁšëºšë³šë¬šë¥šëžšë—šëšë‰šë‚šë{šëtšëmšëfšë_šëXšëQšëJšëCšë<šë5šë.šë'šë šëšëšë šëšëý™ëö™ëï™ëè™ëá™ëÚ™ëÓ™ëÌ™ëř뾙뷙밙멙뢙뛙딙ë™ë†™ë™ëx™ëq™ëj™ëc™ë\™ëU™ëN™ëG™ë@™ë9™ë2™ë+™ë$™ë™ë™ë™ë™ë™ëú˜ëó˜ëì˜ëå˜ëÞ˜ëטëИëɘë˜ë»˜ë´˜ë­˜ë¦˜ëŸ˜ë˜˜ë‘˜ëŠ˜ëƒ˜ë|˜ëu˜ën˜ëg˜ë`˜ëY˜ëR˜ëK˜ëD˜ë=˜ë6˜ë/˜ë(˜ë!˜ë˜ë˜ë ˜ë˜ëþ—ë÷—ëð—ëé—ëâ—ëÛ—ëÔ—ëÍ—ëÆ—ë¿—ë¸—ë±—ëª—ë£—ëœ—ë•—ëŽ—ë‡—ë€—ëy—ër—ëk—ëd—ë]—ëV—ëO—ëH—ëA—ë:—ë3—ë,—ë%—ë—ë—ë—ë —ë—ëû–ëô–ëí–ëæ–ëß–ëØ–ëÑ–ëÊ–ëÖë¼–ëµ–ë®–ë§–ë –ë™–ë’–ë‹–ë„–ë}–ëv–ëo–ëh–ëa–ëZ–ëS–ëL–ëE–ë>–ë7–ë0–ë)–ë"–ë–ë–ë –ë–ëÿ•ëø•ëñ•ëê•ëã•ëÜ•ëÕ•ëΕëÇ•ëÀ•빕법뫕뤕ë•ë–•ë•눕ë•ëz•ës•ël•ëe•ë^•ëW•ëP•ëI•ëB•ë;•ë4•ë-•ë&•ë•ë•ë•ë •ë•ëü”ëõ”ëî”ëç”ëà”ëÙ”ëÒ”ëË”ëĔ뽔붔믔먔롔뚔듔댔녔ë~”ëw”ëp”ëi”ëb”ë[”ëT”ëM”ëF”ë?”ë8”ë1”ë*”ë#”ë”ë”ë”ë”ë”ëù“ëò“ëë“ëä“ëÝ“ëÖ“ëÏ“ëÈ“ëÁ“뺓볓묓륓랓뗓ë“뉓낓ë{“ët“ëm“ëf“ë_“ëX“ëQ“ëJ“ëC“ë<“ë5“ë.“ë'“ë “ë“ë“ë “ë“ëý’ëö’ëï’ëè’ëá’ëÚ’ëÓ’ëÌ’ëŒ뾒뷒밒멒뢒뛒딒ë’높ë’ëx’ëq’ëj’ëc’ë\’ëU’ëN’ëG’ë@’ë9’ë2’ë+’ë$’ë’ë’ë’ë’ë’ëú‘ëó‘ëì‘ëå‘ëÞ‘ëבëБëÉ‘ë‘뻑봑뭑릑럑똑둑늑냑ë|‘ëu‘ën‘ëg‘ë`‘ëY‘ëR‘ëK‘ëD‘ë=‘ë6‘ë/‘ë(‘ë!‘ë‘ë‘ë ‘ë‘ëþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿŽëøŽëñŽëêŽëãŽëÜŽëÕŽëÎŽëÇŽëÀŽë¹Žë²Žë«Žë¤ŽëŽë–ŽëŽëˆŽëŽëzŽësŽëlŽëeŽë^ŽëWŽëPŽëIŽëBŽë;Žë4Žë-Žë&ŽëŽëŽëŽë ŽëŽëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùŒëòŒëëŒëäŒëÝŒëÖŒëÏŒëÈŒëÁŒëºŒë³Œë¬Œë¥ŒëžŒë—ŒëŒë‰Œë‚Œë{ŒëtŒëmŒëfŒë_ŒëXŒëQŒëJŒëCŒë<Œë5Œë.Œë'Œë ŒëŒëŒë ŒëŒëý‹ëö‹ëï‹ëè‹ëá‹ëÚ‹ëÓ‹ëÌ‹ëŋ뾋뷋밋멋뢋뛋딋ë‹ë†‹ë‹ëx‹ëq‹ëj‹ëc‹ë\‹ëU‹ëN‹ëG‹ë@‹ë9‹ë2‹ë+‹ë$‹ë‹ë‹ë‹ë‹ë‹ëúŠëóŠëìŠëåŠëÞŠë׊ëЊëÉŠëŠë»Šë´Šë­Šë¦ŠëŸŠë˜Šë‘ŠëŠŠëƒŠë|ŠëuŠënŠëgŠë`ŠëYŠëRŠëKŠëDŠë=Šë6Šë/Šë(Šë!ŠëŠëŠë ŠëŠëþ‰ë÷‰ëð‰ëé‰ëâ‰ëÛ‰ëÔ‰ë͉ëƉ뿉븉뱉몉룉뜉땉ëމ뇉뀉ëy‰ër‰ëk‰ëd‰ë]‰ëV‰ëO‰ëH‰ëA‰ë:‰ë3‰ë,‰ë%‰ë‰ë‰ë‰ë ‰ë‰ëûˆëôˆëíˆëæˆë߈ë؈ëшëʈëÈ뼈뵈뮈마레뙈뒈니너ë}ˆëvˆëoˆëhˆëaˆëZˆëSˆëLˆëEˆë>ˆë7ˆë0ˆë)ˆë"ˆëˆëˆë ˆëˆëÿ‡ëø‡ëñ‡ëê‡ëã‡ë܇ëÕ‡ë·ëLJëÀ‡ë¹‡ë²‡ë«‡ë¤‡ë‡ë–‡ë‡ëˆ‡ë‡ëz‡ës‡ël‡ëe‡ë^‡ëW‡ëP‡ëI‡ëB‡ë;‡ë4‡ë-‡ë&‡ë‡ë‡ë‡ë ‡ë‡ëü†ëõ†ëî†ëç†ëà†ëÙ†ëÒ†ëˆëĆ뽆붆믆먆롆뚆듆댆녆ë~†ëw†ëp†ëi†ëb†ë[†ëT†ëM†ëF†ë?†ë8†ë1†ë*†ë#†ë†ë†ë†ë†ë†ëù…ëò…ëë…ëä…ëÝ…ëÖ…ëÏ…ëÈ…ëÁ…뺅볅묅륅랅뗅ë…뉅낅ë{…ët…ëm…ëf…ë_…ëX…ëQ…ëJ…ëC…ë<…ë5…ë.…ë'…ë …ë…ë…ë …ë…ëý„ëö„ëï„ëè„ëá„ëÚ„ëÓ„ëÌ„ëń뾄뷄밄멄뢄뛄딄ë„놄ë„ëx„ëq„ëj„ëc„ë\„ëU„ëN„ëG„ë@„ë9„ë2„ë+„ë$„ë„ë„ë„ë„ë„ëúƒëóƒëìƒëåƒëÞƒë׃ëЃëɃëƒë»ƒë´ƒë­ƒë¦ƒëŸƒë˜ƒë‘ƒëŠƒëƒƒë|ƒëuƒënƒëgƒë`ƒëYƒëRƒëKƒëDƒë=ƒë6ƒë/ƒë(ƒë!ƒëƒëƒë ƒëƒëþ‚ë÷‚ëð‚ëé‚ëâ‚ëÛ‚ëÔ‚ëÍ‚ëÆ‚ë¿‚ë¸‚ë±‚ëª‚ë£‚ëœ‚ë•‚ëŽ‚ë‡‚ë€‚ëy‚ër‚ëk‚ëd‚ë]‚ëV‚ëO‚ëH‚ëA‚ë:‚ë3‚ë,‚ë%‚ë‚ë‚ë‚ë ‚ë‚ëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿ€ëø€ëñ€ëê€ëã€ëÜ€ëÕ€ë΀ëÇ€ëÀ€ë¹€ë²€ë«€ë¤€ë€ë–€ë€ëˆ€ë€ëz€ës€ël€ëe€ë^€ëW€ëP€ëI€ëB€ë;€ë4€ë-€ë&€ë€ë€ë€ë €ë€ëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëù~ëò~ëë~ëä~ëÝ~ëÖ~ëÏ~ëÈ~ëÁ~ëº~ë³~ë¬~ë¥~ëž~ë—~ë~ë‰~ë‚~ë{~ët~ëm~ëf~ë_~ëX~ëQ~ëJ~ëC~ë<~ë5~ë.~ë'~ë ~ë~ë~ë ~ë~ëý}ëö}ëï}ëè}ëá}ëÚ}ëÓ}ëÌ}ëÅ}ë¾}ë·}ë°}ë©}ë¢}ë›}ë”}ë}ë†}ë}ëx}ëq}ëj}ëc}ë\}ëU}ëN}ëG}ë@}ë9}ë2}ë+}ë$}ë}ë}ë}ë}ë}ëú|ëó|ëì|ëå|ëÞ|ë×|ëÐ|ëÉ|ëÂ|ë»|ë´|ë­|ë¦|ëŸ|ë˜|ë‘|ëŠ|ëƒ|ë||ëu|ën|ëg|ë`|ëY|ëR|ëK|ëD|ë=|ë6|ë/|ë(|ë!|ë|ë|ë |ë|ëþ{ë÷{ëð{ëé{ëâ{ëÛ{ëÔ{ëÍ{ëÆ{ë¿{ë¸{ë±{ëª{ë£{ëœ{ë•{ëŽ{ë‡{ë€{ëy{ër{ëk{ëd{ë]{ëV{ëO{ëH{ëA{ë:{ë3{ë,{ë%{ë{ë{ë{ë {ë{ëûzëôzëízëæzëßzëØzëÑzëÊzëÃzë¼zëµzë®zë§zë zë™zë’zë‹zë„zë}zëvzëozëhzëazëZzëSzëLzëEzë>zë7zë0zë)zë"zëzëzë zëzëÿyëøyëñyëêyëãyëÜyëÕyëÎyëÇyëÀyë¹yë²yë«yë¤yëyë–yëyëˆyëyëzyësyëlyëeyë^yëWyëPyëIyëByë;yë4yë-yë&yëyëyëyë yëyëüxëõxëîxëçxëàxëÙxëÒxëËxëÄxë½xë¶xë¯xë¨xë¡xëšxë“xëŒxë…xë~xëwxëpxëixëbxë[xëTxëMxëFxë?xë8xë1xë*xë#xëxëxëxëxëxëùwëòwëëwëäwëÝwëÖwëÏwëÈwëÁwëºwë³wë¬wë¥wëžwë—wëwë‰wë‚wë{wëtwëmwëfwë_wëXwëQwëJwëCwësë7së0së)së"sësësë sësëÿrëørëñrëêrëãrëÜrëÕrëÎrëÇrëÀrë¹rë²rë«rë¤rërë–rërëˆrërëzrësrëlrëerë^rëWrëPrëIrëBrë;rë4rë-rë&rërërërë rërëüqëõqëîqëçqëàqëÙqëÒqëËqëÄqë½që¶që¯që¨që¡qëšqë“qëŒqë…që~qëwqëpqëiqëbqë[qëTqëMqëFqë?që8që1që*që#qëqëqëqëqëqëùpëòpëëpëäpëÝpëÖpëÏpëÈpëÁpëºpë³pë¬pë¥pëžpë—pëpë‰pë‚pë{pëtpëmpëfpë_pëXpëQpëJpëCpëlë7lë0lë)lë"lëlëlë lëlëÿkëøkëñkëêkëãkëÜkëÕkëÎkëÇkëÀkë¹kë²kë«kë¤këkë–këkëˆkëkëzkëskëlkëekë^këWkëPkëIkëBkë;kë4kë-kë&këkëkëkë këkëüjëõjëîjëçjëàjëÙjëÒjëËjëÄjë½jë¶jë¯jë¨jë¡jëšjë“jëŒjë…jë~jëwjëpjëijëbjë[jëTjëMjëFjë?jë8jë1jë*jë#jëjëjëjëjëjëùiëòiëëiëäiëÝiëÖiëÏiëÈiëÁiëºië³ië¬ië¥iëžië—iëië‰ië‚ië{iëtiëmiëfië_iëXiëQiëJiëCiëeë7eë0eë)eë"eëeëeë eëeëÿdëødëñdëêdëãdëÜdëÕdëÎdëÇdëÀdë¹dë²dë«dë¤dëdë–dëdëˆdëdëzdësdëldëedë^dëWdëPdëIdëBdë;dë4dë-dë&dëdëdëdë dëdëücëõcëîcëçcëàcëÙcëÒcëËcëÄcë½cë¶cë¯cë¨cë¡cëšcë“cëŒcë…cë~cëwcëpcëicëbcë[cëTcëMcëFcë?cë8cë1cë*cë#cëcëcëcëcëcëùbëòbëëbëäbëÝbëÖbëÏbëÈbëÁbëºbë³bë¬bë¥bëžbë—bëbë‰bë‚bë{bëtbëmbëfbë_bëXbëQbëJbëCbë^ë7^ë0^ë)^ë"^ë^ë^ë ^ë^ëÿ]ëø]ëñ]ëê]ëã]ëÜ]ëÕ]ëÎ]ëÇ]ëÀ]ë¹]ë²]ë«]ë¤]ë]ë–]ë]ëˆ]ë]ëz]ës]ël]ëe]ë^]ëW]ëP]ëI]ëB]ë;]ë4]ë-]ë&]ë]ë]ë]ë ]ë]ëü\ëõ\ëî\ëç\ëà\ëÙ\ëÒ\ëË\ëÄ\ë½\ë¶\ë¯\ë¨\ë¡\ëš\ë“\ëŒ\ë…\ë~\ëw\ëp\ëi\ëb\ë[\ëT\ëM\ëF\ë?\ë8\ë1\ë*\ë#\ë\ë\ë\ë\ë\ëù[ëò[ëë[ëä[ëÝ[ëÖ[ëÏ[ëÈ[ëÁ[ëº[ë³[ë¬[ë¥[ëž[ë—[ë[ë‰[ë‚[ë{[ët[ëm[ëf[ë_[ëX[ëQ[ëJ[ëC[ë<[ë5[ë.[ë'[ë [ë[ë[ë [ë[ëýZëöZëïZëèZëáZëÚZëÓZëÌZëÅZë¾Zë·Zë°Zë©Zë¢Zë›Zë”ZëZë†ZëZëxZëqZëjZëcZë\ZëUZëNZëGZë@Zë9Zë2Zë+Zë$ZëZëZëZëZëZëúYëóYëìYëåYëÞYë×YëÐYëÉYëÂYë»Yë´Yë­Yë¦YëŸYë˜Yë‘YëŠYëƒYë|YëuYënYëgYë`YëYYëRYëKYëDYë=Yë6Yë/Yë(Yë!YëYëYë YëYëþXë÷XëðXëéXëâXëÛXëÔXëÍXëÆXë¿Xë¸Xë±XëªXë£XëœXë•XëŽXë‡Xë€XëyXërXëkXëdXë]XëVXëOXëHXëAXë:Xë3Xë,Xë%XëXëXëXë XëXëûWëôWëíWëæWëßWëØWëÑWëÊWëÃWë¼WëµWë®Wë§Wë Wë™Wë’Wë‹Wë„Wë}WëvWëoWëhWëaWëZWëSWëLWëEWë>Wë7Wë0Wë)Wë"WëWëWë WëWëÿVëøVëñVëêVëãVëÜVëÕVëÎVëÇVëÀVë¹Vë²Vë«Vë¤VëVë–VëVëˆVëVëzVësVëlVëeVë^VëWVëPVëIVëBVë;Vë4Vë-Vë&VëVëVëVë VëVëüUëõUëîUëçUëàUëÙUëÒUëËUëÄUë½Uë¶Uë¯Uë¨Uë¡UëšUë“UëŒUë…Uë~UëwUëpUëiUëbUë[UëTUëMUëFUë?Uë8Uë1Uë*Uë#UëUëUëUëUëUëùTëòTëëTëäTëÝTëÖTëÏTëÈTëÁTëºTë³Të¬Të¥TëžTë—TëTë‰Të‚Të{TëtTëmTëfTë_TëXTëQTëJTëCTëPë7Pë0Pë)Pë"PëPëPë PëPëÿOëøOëñOëêOëãOëÜOëÕOëÎOëÇOëÀOë¹Oë²Oë«Oë¤OëOë–OëOëˆOëOëzOësOëlOëeOë^OëWOëPOëIOëBOë;Oë4Oë-Oë&OëOëOëOë OëOëüNëõNëîNëçNëàNëÙNëÒNëËNëÄNë½Në¶Në¯Në¨Në¡NëšNë“NëŒNë…Në~NëwNëpNëiNëbNë[NëTNëMNëFNë?Në8Në1Në*Në#NëNëNëNëNëNëùMëòMëëMëäMëÝMëÖMëÏMëÈMëÁMëºMë³Më¬Më¥MëžMë—MëMë‰Më‚Më{MëtMëmMëfMë_MëXMëQMëJMëCMëIë7Ië0Ië)Ië"IëIëIë IëIëÿHëøHëñHëêHëãHëÜHëÕHëÎHëÇHëÀHë¹Hë²Hë«Hë¤HëHë–HëHëˆHëHëzHësHëlHëeHë^HëWHëPHëIHëBHë;Hë4Hë-Hë&HëHëHëHë HëHëüGëõGëîGëçGëàGëÙGëÒGëËGëÄGë½Gë¶Gë¯Gë¨Gë¡GëšGë“GëŒGë…Gë~GëwGëpGëiGëbGë[GëTGëMGëFGë?Gë8Gë1Gë*Gë#GëGëGëGëGëGëùFëòFëëFëäFëÝFëÖFëÏFëÈFëÁFëºFë³Fë¬Fë¥FëžFë—FëFë‰Fë‚Fë{FëtFëmFëfFë_FëXFëQFëJFëCFëBë7Bë0Bë)Bë"BëBëBë BëBëÿAëøAëñAëêAëãAëÜAëÕAëÎAëÇAëÀAë¹Aë²Aë«Aë¤AëAë–AëAëˆAëAëzAësAëlAëeAë^AëWAëPAëIAëBAë;Aë4Aë-Aë&AëAëAëAë AëAëü@ëõ@ëî@ëç@ëà@ëÙ@ëÒ@ëË@ëÄ@ë½@ë¶@ë¯@ë¨@ë¡@ëš@ë“@ëŒ@ë…@ë~@ëw@ëp@ëi@ëb@ë[@ëT@ëM@ëF@ë?@ë8@ë1@ë*@ë#@ë@ë@ë@ë@ë@ëù?ëò?ëë?ëä?ëÝ?ëÖ?ëÏ?ëÈ?ëÁ?ëº?ë³?ë¬?ë¥?ëž?ë—?ë?ë‰?ë‚?ë{?ët?ëm?ëf?ë_?ëX?ëQ?ëJ?ëC?ëëö>ëï>ëè>ëá>ëÚ>ëÓ>ëÌ>ëÅ>ë¾>ë·>ë°>ë©>ë¢>ë›>ë”>ë>ë†>ë>ëx>ëq>ëj>ëc>ë\>ëU>ëN>ëG>ë@>ë9>ë2>ë+>ë$>ë>ë>ë>ë>ë>ëú=ëó=ëì=ëå=ëÞ=ë×=ëÐ=ëÉ=ëÂ=ë»=ë´=ë­=ë¦=ëŸ=ë˜=ë‘=ëŠ=ëƒ=ë|=ëu=ën=ëg=ë`=ëY=ëR=ëK=ëD=ë==ë6=ë/=ë(=ë!=ë=ë=ë =ë=ëþ<ë÷<ëð<ëé<ëâ<ëÛ<ëÔ<ëÍ<ëÆ<ë¿<ë¸<ë±<ëª<ë£<ëœ<ë•<ëŽ<ë‡<ë€<ëy<ër<ëk<ëd<ë]<ëV<ëO<ëH<ëA<ë:<ë3<ë,<ë%<ë<ë<ë<ë <ë<ëû;ëô;ëí;ëæ;ëß;ëØ;ëÑ;ëÊ;ëÃ;ë¼;ëµ;ë®;ë§;ë ;ë™;ë’;ë‹;ë„;ë};ëv;ëo;ëh;ëa;ëZ;ëS;ëL;ëE;ë>;ë7;ë0;ë);ë";ë;ë;ë ;ë;ëÿ:ëø:ëñ:ëê:ëã:ëÜ:ëÕ:ëÎ:ëÇ:ëÀ:ë¹:ë²:ë«:ë¤:ë:ë–:ë:ëˆ:ë:ëz:ës:ël:ëe:ë^:ëW:ëP:ëI:ëB:ë;:ë4:ë-:ë&:ë:ë:ë:ë :ë:ëü9ëõ9ëî9ëç9ëà9ëÙ9ëÒ9ëË9ëÄ9ë½9ë¶9ë¯9ë¨9ë¡9ëš9ë“9ëŒ9ë…9ë~9ëw9ëp9ëi9ëb9ë[9ëT9ëM9ëF9ë?9ë89ë19ë*9ë#9ë9ë9ë9ë9ë9ëù8ëò8ëë8ëä8ëÝ8ëÖ8ëÏ8ëÈ8ëÁ8ëº8ë³8ë¬8ë¥8ëž8ë—8ë8ë‰8ë‚8ë{8ët8ëm8ëf8ë_8ëX8ëQ8ëJ8ëC8ë<8ë58ë.8ë'8ë 8ë8ë8ë 8ë8ëý7ëö7ëï7ëè7ëá7ëÚ7ëÓ7ëÌ7ëÅ7ë¾7ë·7ë°7ë©7ë¢7ë›7ë”7ë7ë†7ë7ëx7ëq7ëj7ëc7ë\7ëU7ëN7ëG7ë@7ë97ë27ë+7ë$7ë7ë7ë7ë7ë7ëú6ëó6ëì6ëå6ëÞ6ë×6ëÐ6ëÉ6ëÂ6ë»6ë´6ë­6ë¦6ëŸ6ë˜6ë‘6ëŠ6ëƒ6ë|6ëu6ën6ëg6ë`6ëY6ëR6ëK6ëD6ë=6ë66ë/6ë(6ë!6ë6ë6ë 6ë6ëþ5ë÷5ëð5ëé5ëâ5ëÛ5ëÔ5ëÍ5ëÆ5ë¿5ë¸5ë±5ëª5ë£5ëœ5ë•5ëŽ5ë‡5ë€5ëy5ër5ëk5ëd5ë]5ëV5ëO5ëH5ëA5ë:5ë35ë,5ë%5ë5ë5ë5ë 5ë5ëû4ëô4ëí4ëæ4ëß4ëØ4ëÑ4ëÊ4ëÃ4ë¼4ëµ4ë®4ë§4ë 4ë™4ë’4ë‹4ë„4ë}4ëv4ëo4ëh4ëa4ëZ4ëS4ëL4ëE4ë>4ë74ë04ë)4ë"4ë4ë4ë 4ë4ëÿ3ëø3ëñ3ëê3ëã3ëÜ3ëÕ3ëÎ3ëÇ3ëÀ3ë¹3ë²3ë«3ë¤3ë3ë–3ë3ëˆ3ë3ëz3ës3ël3ëe3ë^3ëW3ëP3ëI3ëB3ë;3ë43ë-3ë&3ë3ë3ë3ë 3ë3ëü2ëõ2ëî2ëç2ëà2ëÙ2ëÒ2ëË2ëÄ2ë½2ë¶2ë¯2ë¨2ë¡2ëš2ë“2ëŒ2ë…2ë~2ëw2ëp2ëi2ëb2ë[2ëT2ëM2ëF2ë?2ë82ë12ë*2ë#2ë2ë2ë2ë2ë2ëù1ëò1ëë1ëä1ëÝ1ëÖ1ëÏ1ëÈ1ëÁ1ëº1ë³1ë¬1ë¥1ëž1ë—1ë1ë‰1ë‚1ë{1ët1ëm1ëf1ë_1ëX1ëQ1ëJ1ëC1ë<1ë51ë.1ë'1ë 1ë1ë1ë 1ë1ëý0ëö0ëï0ëè0ëá0ëÚ0ëÓ0ëÌ0ëÅ0ë¾0ë·0ë°0ë©0ë¢0ë›0ë”0ë0ë†0ë0ëx0ëq0ëj0ëc0ë\0ëU0ëN0ëG0ë@0ë90ë20ë+0ë$0ë0ë0ë0ë0ë0ëú/ëó/ëì/ëå/ëÞ/ë×/ëÐ/ëÉ/ëÂ/ë»/ë´/ë­/ë¦/ëŸ/ë˜/ë‘/ëŠ/ëƒ/ë|/ëu/ën/ëg/ë`/ëY/ëR/ëK/ëD/ë=/ë6/ë//ë(/ë!/ë/ë/ë /ë/ëþ.ë÷.ëð.ëé.ëâ.ëÛ.ëÔ.ëÍ.ëÆ.ë¿.ë¸.ë±.ëª.ë£.ëœ.ë•.ëŽ.ë‡.ë€.ëy.ër.ëk.ëd.ë].ëV.ëO.ëH.ëA.ë:.ë3.ë,.ë%.ë.ë.ë.ë .ë.ëû-ëô-ëí-ëæ-ëß-ëØ-ëÑ-ëÊ-ëÃ-ë¼-ëµ-ë®-ë§-ë -ë™-ë’-ë‹-ë„-ë}-ëv-ëo-ëh-ëa-ëZ-ëS-ëL-ëE-ë>-ë7-ë0-ë)-ë"-ë-ë-ë -ë-ëÿ,ëø,ëñ,ëê,ëã,ëÜ,ëÕ,ëÎ,ëÇ,ëÀ,ë¹,ë²,ë«,ë¤,ë,ë–,ë,ëˆ,ë,ëz,ës,ël,ëe,ë^,ëW,ëP,ëI,ëB,ë;,ë4,ë-,ë&,ë,ë,ë,ë ,ë,ëü+ëõ+ëî+ëç+ëà+ëÙ+ëÒ+ëË+ëÄ+ë½+ë¶+ë¯+ë¨+ë¡+ëš+ë“+ëŒ+ë…+ë~+ëw+ëp+ëi+ëb+ë[+ëT+ëM+ëF+ë?+ë8+ë1+ë*+ë#+ë+ë+ë+ë+ë+ëù*ëò*ëë*ëä*ëÝ*ëÖ*ëÏ*ëÈ*ëÁ*ëº*ë³*ë¬*ë¥*ëž*ë—*ë*ë‰*ë‚*ë{*ët*ëm*ëf*ë_*ëX*ëQ*ëJ*ëC*ë<*ë5*ë.*ë'*ë *ë*ë*ë *ë*ëý)ëö)ëï)ëè)ëá)ëÚ)ëÓ)ëÌ)ëÅ)ë¾)ë·)ë°)ë©)ë¢)ë›)ë”)ë)ë†)ë)ëx)ëq)ëj)ëc)ë\)ëU)ëN)ëG)ë@)ë9)ë2)ë+)ë$)ë)ë)ë)ë)ë)ëú(ëó(ëì(ëå(ëÞ(ë×(ëÐ(ëÉ(ëÂ(ë»(ë´(ë­(ë¦(ëŸ(ë˜(ë‘(ëŠ(ëƒ(ë|(ëu(ën(ëg(ë`(ëY(ëR(ëK(ëD(ë=(ë6(ë/(ë((ë!(ë(ë(ë (ë(ëþ'ë÷'ëð'ëé'ëâ'ëÛ'ëÔ'ëÍ'ëÆ'ë¿'ë¸'ë±'ëª'ë£'ëœ'ë•'ëŽ'ë‡'ë€'ëy'ër'ëk'ëd'ë]'ëV'ëO'ëH'ëA'ë:'ë3'ë,'ë%'ë'ë'ë'ë 'ë'ëû&ëô&ëí&ëæ&ëß&ëØ&ëÑ&ëÊ&ëÃ&ë¼&ëµ&ë®&ë§&ë &ë™&ë’&ë‹&ë„&ë}&ëv&ëo&ëh&ëa&ëZ&ëS&ëL&ëE&ë>&ë7&ë0&ë)&ë"&ë&ë&ë &ë&ëÿ%ëø%ëñ%ëê%ëã%ëÜ%ëÕ%ëÎ%ëÇ%ëÀ%ë¹%ë²%ë«%ë¤%ë%ë–%ë%ëˆ%ë%ëz%ës%ël%ëe%ë^%ëW%ëP%ëI%ëB%ë;%ë4%ë-%ë&%ë%ë%ë%ë %ë%ëü$ëõ$ëî$ëç$ëà$ëÙ$ëÒ$ëË$ëÄ$ë½$ë¶$ë¯$ë¨$ë¡$ëš$ë“$ëŒ$ë…$ë~$ëw$ëp$ëi$ëb$ë[$ëT$ëM$ëF$ë?$ë8$ë1$ë*$ë#$ë$ë$ë$ë$ë$ëù#ëò#ëë#ëä#ëÝ#ëÖ#ëÏ#ëÈ#ëÁ#ëº#ë³#ë¬#ë¥#ëž#ë—#ë#ë‰#ë‚#ë{#ët#ëm#ëf#ë_#ëX#ëQ#ëJ#ëC#ë<#ë5#ë.#ë'#ë #ë#ë#ë #ë#ëý"ëö"ëï"ëè"ëá"ëÚ"ëÓ"ëÌ"ëÅ"ë¾"ë·"ë°"ë©"ë¢"ë›"ë”"ë"ë†"ë"ëx"ëq"ëj"ëc"ë\"ëU"ëN"ëG"ë@"ë9"ë2"ë+"ë$"ë"ë"ë"ë"ë"ëú!ëó!ëì!ëå!ëÞ!ë×!ëÐ!ëÉ!ëÂ!ë»!ë´!ë­!ë¦!ëŸ!ë˜!ë‘!ëŠ!ëƒ!ë|!ëu!ën!ëg!ë`!ëY!ëR!ëK!ëD!ë=!ë6!ë/!ë(!ë!!ë!ë!ë !ë!ëþ ë÷ ëð ëé ëâ ëÛ ëÔ ëÍ ëÆ ë¿ ë¸ ë± ëª ë£ ëœ ë• ëŽ ë‡ ë€ ëy ër ëk ëd ë] ëV ëO ëH ëA ë: ë3 ë, ë% ë ë ë ë ë ëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëý ëö ëï ëè ëá ëÚ ëÓ ëÌ ëÅ ë¾ ë· ë° ë© ë¢ ë› ë” ë ë† ë ëx ëq ëj ëc ë\ ëU ëN ëG ë@ ë9 ë2 ë+ ë$ ë ë ë ë ë ëú ëó ëì ëå ëÞ ë× ëÐ ëÉ ë ë» ë´ ë­ ë¦ ëŸ ë˜ ë‘ ëŠ ëƒ ë| ëu ën ëg ë` ëY ëR ëK ëD ë= ë6 ë/ ë( ë! ë ë ë ë ëþ ë÷ ëð ëé ëâ ëÛ ëÔ ëÍ ëÆ ë¿ ë¸ ë± ëª ë£ ëœ ë• ëŽ ë‡ ë€ ëy ër ëk ëd ë] ëV ëO ëH ëA ë: ë3 ë, ë% ë ë ë ë ë ëû ëô ëí ëæ ëß ëØ ëÑ ëÊ ëà ë¼ ëµ ë® ë§ ë  ë™ ë’ ë‹ ë„ ë} ëv ëo ëh ëa ëZ ëS ëL ëE ë> ë7 ë0 ë) ë" ë ë ë ë ëÿ ëø ëñ ëê ëã ëÜ ëÕ ëÎ ëÇ ëÀ ë¹ ë² ë« ë¤ ë ë– ë ëˆ ë ëz ës ël ëe ë^ ëW ëP ëI ëB ë; ë4 ë- ë& ë ë ë ë ë ëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýÿêöÿêïÿêèÿêáÿêÚÿêÓÿêÌÿêÅÿê¾ÿê·ÿê°ÿê©ÿê¢ÿê›ÿê”ÿêÿê†ÿêÿêxÿêqÿêjÿêcÿê\ÿêUÿêNÿêGÿê@ÿê9ÿê2ÿê+ÿê$ÿêÿêÿêÿêÿêÿêúþêóþêìþêåþêÞþê×þêÐþêÉþêÂþê»þê´þê­þê¦þêŸþê˜þê‘þêŠþêƒþê|þêuþênþêgþê`þêYþêRþêKþêDþê=þê6þê/þê(þê!þêþêþê þêþêþýê÷ýêðýêéýêâýêÛýêÔýêÍýêÆýê¿ýê¸ýê±ýêªýê£ýêœýê•ýêŽýê‡ýê€ýêyýêrýêkýêdýê]ýêVýêOýêHýêAýê:ýê3ýê,ýê%ýêýêýêýê ýêýêûüêôüêíüêæüêßüêØüêÑüêÊüêÃüê¼üêµüê®üê§üê üê™üê’üê‹üê„üê}üêvüêoüêhüêaüêZüêSüêLüêEüê>üê7üê0üê)üê"üêüêüê üêüêÿûêøûêñûêêûêãûêÜûêÕûêÎûêÇûêÀûê¹ûê²ûê«ûê¤ûêûê–ûêûêˆûêûêzûêsûêlûêeûê^ûêWûêPûêIûêBûê;ûê4ûê-ûê&ûêûêûêûê ûêûêüúêõúêîúêçúêàúêÙúêÒúêËúêÄúê½úê¶úê¯úê¨úê¡úêšúê“úêŒúê…úê~úêwúêpúêiúêbúê[úêTúêMúêFúê?úê8úê1úê*úê#úêúêúêúêúêúêùùêòùêëùêäùêÝùêÖùêÏùêÈùêÁùêºùê³ùê¬ùê¥ùêžùê—ùêùê‰ùê‚ùê{ùêtùêmùêfùê_ùêXùêQùêJùêCùê<ùê5ùê.ùê'ùê ùêùêùê ùêùêýøêöøêïøêèøêáøêÚøêÓøêÌøêÅøê¾øê·øê°øê©øê¢øê›øê”øêøê†øêøêxøêqøêjøêcøê\øêUøêNøêGøê@øê9øê2øê+øê$øêøêøêøêøêøêú÷êó÷êì÷êå÷êÞ÷ê×÷êÐ÷êÉ÷êÂ÷ê»÷ê´÷ê­÷ê¦÷êŸ÷ê˜÷ê‘÷êŠ÷êƒ÷ê|÷êu÷ên÷êg÷ê`÷êY÷êR÷êK÷êD÷ê=÷ê6÷ê/÷ê(÷ê!÷ê÷ê÷ê ÷ê÷êþöê÷öêðöêéöêâöêÛöêÔöêÍöêÆöê¿öê¸öê±öêªöê£öêœöê•öêŽöê‡öê€öêyöêröêköêdöê]öêVöêOöêHöêAöê:öê3öê,öê%öêöêöêöê öêöêûõêôõêíõêæõêßõêØõêÑõêÊõêÃõê¼õêµõê®õê§õê õê™õê’õê‹õê„õê}õêvõêoõêhõêaõêZõêSõêLõêEõê>õê7õê0õê)õê"õêõêõê õêõêÿôêøôêñôêêôêãôêÜôêÕôêÎôêÇôêÀôê¹ôê²ôê«ôê¤ôêôê–ôêôêˆôêôêzôêsôêlôêeôê^ôêWôêPôêIôêBôê;ôê4ôê-ôê&ôêôêôêôê ôêôêüóêõóêîóêçóêàóêÙóêÒóêËóêÄóê½óê¶óê¯óê¨óê¡óêšóê“óêŒóê…óê~óêwóêpóêióêbóê[óêTóêMóêFóê?óê8óê1óê*óê#óêóêóêóêóêóêùòêòòêëòêäòêÝòêÖòêÏòêÈòêÁòêºòê³òê¬òê¥òêžòê—òêòê‰òê‚òê{òêtòêmòêfòê_òêXòêQòêJòêCòê<òê5òê.òê'òê òêòêòê òêòêýñêöñêïñêèñêáñêÚñêÓñêÌñêÅñê¾ñê·ñê°ñê©ñê¢ñê›ñê”ñêñê†ñêñêxñêqñêjñêcñê\ñêUñêNñêGñê@ñê9ñê2ñê+ñê$ñêñêñêñêñêñêúðêóðêìðêåðêÞðê×ðêÐðêÉðêÂðê»ðê´ðê­ðê¦ðêŸðê˜ðê‘ðêŠðêƒðê|ðêuðênðêgðê`ðêYðêRðêKðêDðê=ðê6ðê/ðê(ðê!ðêðêðê ðêðêþïê÷ïêðïêéïêâïêÛïêÔïêÍïêÆïê¿ïê¸ïê±ïêªïê£ïêœïê•ïêŽïê‡ïê€ïêyïêrïêkïêdïê]ïêVïêOïêHïêAïê:ïê3ïê,ïê%ïêïêïêïê ïêïêûîêôîêíîêæîêßîêØîêÑîêÊîêÃîê¼îêµîê®îê§îê îê™îê’îê‹îê„îê}îêvîêoîêhîêaîêZîêSîêLîêEîê>îê7îê0îê)îê"îêîêîê îêîêÿíêøíêñíêêíêãíêÜíêÕíêÎíêÇíêÀíê¹íê²íê«íê¤íêíê–íêíêˆíêíêzíêsíêlíêeíê^íêWíêPíêIíêBíê;íê4íê-íê&íêíêíêíê íêíêüìêõìêîìêçìêàìêÙìêÒìêËìêÄìê½ìê¶ìê¯ìê¨ìê¡ìêšìê“ìêŒìê…ìê~ìêwìêpìêiìêbìê[ìêTìêMìêFìê?ìê8ìê1ìê*ìê#ìêìêìêìêìêìêùëêòëêëëêäëêÝëêÖëêÏëêÈëêÁëêºëê³ëê¬ëê¥ëêžëê—ëêëê‰ëê‚ëê{ëêtëêmëêfëê_ëêXëêQëêJëêCëê<ëê5ëê.ëê'ëê ëêëêëê ëêëêýêêöêêïêêèêêáêêÚêêÓêêÌêêÅêê¾êê·êê°êê©êê¢êê›êê”êêêê†êêêêxêêqêêjêêcêê\êêUêêNêêGêê@êê9êê2êê+êê$êêêêêêêêêêêêúéêóéêìéêåéêÞéê×éêÐéêÉéêÂéê»éê´éê­éê¦éêŸéê˜éê‘éêŠéêƒéê|éêuéênéêgéê`éêYéêRéêKéêDéê=éê6éê/éê(éê!éêéêéê éêéêþèê÷èêðèêéèêâèêÛèêÔèêÍèêÆèê¿èê¸èê±èêªèê£èêœèê•èêŽèê‡èê€èêyèêrèêkèêdèê]èêVèêOèêHèêAèê:èê3èê,èê%èêèêèêèê èêèêûçêôçêíçêæçêßçêØçêÑçêÊçêÃçê¼çêµçê®çê§çê çê™çê’çê‹çê„çê}çêvçêoçêhçêaçêZçêSçêLçêEçê>çê7çê0çê)çê"çêçêçê çêçêÿæêøæêñæêêæêãæêÜæêÕæêÎæêÇæêÀæê¹æê²æê«æê¤æêæê–æêæêˆæêæêzæêsæêlæêeæê^æêWæêPæêIæêBæê;æê4æê-æê&æêæêæêæê æêæêüåêõåêîåêçåêàåêÙåêÒåêËåêÄåê½åê¶åê¯åê¨åê¡åêšåê“åêŒåê…åê~åêwåêpåêiåêbåê[åêTåêMåêFåê?åê8åê1åê*åê#åêåêåêåêåêåêùäêòäêëäêääêÝäêÖäêÏäêÈäêÁäêºäê³äê¬äê¥äêžäê—äêäê‰äê‚äê{äêtäêmäêfäê_äêXäêQäêJäêCäê<äê5äê.äê'äê äêäêäê äêäêýãêöãêïãêèãêáãêÚãêÓãêÌãêÅãê¾ãê·ãê°ãê©ãê¢ãê›ãê”ãêãê†ãêãêxãêqãêjãêcãê\ãêUãêNãêGãê@ãê9ãê2ãê+ãê$ãêãêãêãêãêãêúâêóâêìâêåâêÞâê×âêÐâêÉâêÂâê»âê´âê­âê¦âêŸâê˜âê‘âêŠâêƒâê|âêuâênâêgâê`âêYâêRâêKâêDâê=âê6âê/âê(âê!âêâêâê âêâêþáê÷áêðáêéáêâáêÛáêÔáêÍáêÆáê¿áê¸áê±áêªáê£áêœáê•áêŽáê‡áê€áêyáêráêkáêdáê]áêVáêOáêHáêAáê:áê3áê,áê%áêáêáêáê áêáêûàêôàêíàêæàêßàêØàêÑàêÊàêÃàê¼àêµàê®àê§àê àê™àê’àê‹àê„àê}àêvàêoàêhàêaàêZàêSàêLàêEàê>àê7àê0àê)àê"àêàêàê àêàêÿßêøßêñßêêßêãßêÜßêÕßêÎßêÇßêÀßê¹ßê²ßê«ßê¤ßêßê–ßêßêˆßêßêzßêsßêlßêeßê^ßêWßêPßêIßêBßê;ßê4ßê-ßê&ßêßêßêßê ßêßêüÞêõÞêîÞêçÞêàÞêÙÞêÒÞêËÞêÄÞê½Þê¶Þê¯Þê¨Þê¡ÞêšÞê“ÞêŒÞê…Þê~ÞêwÞêpÞêiÞêbÞê[ÞêTÞêMÞêFÞê?Þê8Þê1Þê*Þê#ÞêÞêÞêÞêÞêÞêùÝêòÝêëÝêäÝêÝÝêÖÝêÏÝêÈÝêÁÝêºÝê³Ýê¬Ýê¥ÝêžÝê—ÝêÝê‰Ýê‚Ýê{ÝêtÝêmÝêfÝê_ÝêXÝêQÝêJÝêCÝê<Ýê5Ýê.Ýê'Ýê ÝêÝêÝê ÝêÝêýÜêöÜêïÜêèÜêáÜêÚÜêÓÜêÌÜêÅÜê¾Üê·Üê°Üê©Üê¢Üê›Üê”ÜêÜê†ÜêÜêxÜêqÜêjÜêcÜê\ÜêUÜêNÜêGÜê@Üê9Üê2Üê+Üê$ÜêÜêÜêÜêÜêÜêúÛêóÛêìÛêåÛêÞÛê×ÛêÐÛêÉÛêÂÛê»Ûê´Ûê­Ûê¦ÛêŸÛê˜Ûê‘ÛêŠÛêƒÛê|ÛêuÛênÛêgÛê`ÛêYÛêRÛêKÛêDÛê=Ûê6Ûê/Ûê(Ûê!ÛêÛêÛê ÛêÛêþÚê÷ÚêðÚêéÚêâÚêÛÚêÔÚêÍÚêÆÚê¿Úê¸Úê±ÚêªÚê£ÚêœÚê•ÚêŽÚê‡Úê€ÚêyÚêrÚêkÚêdÚê]ÚêVÚêOÚêHÚêAÚê:Úê3Úê,Úê%ÚêÚêÚêÚê ÚêÚêûÙêôÙêíÙêæÙêßÙêØÙêÑÙêÊÙêÃÙê¼ÙêµÙê®Ùê§Ùê Ùê™Ùê’Ùê‹Ùê„Ùê}ÙêvÙêoÙêhÙêaÙêZÙêSÙêLÙêEÙê>Ùê7Ùê0Ùê)Ùê"ÙêÙêÙê ÙêÙêÿØêøØêñØêêØêãØêÜØêÕØêÎØêÇØêÀØê¹Øê²Øê«Øê¤ØêØê–ØêØêˆØêØêzØêsØêlØêeØê^ØêWØêPØêIØêBØê;Øê4Øê-Øê&ØêØêØêØê ØêØêü×êõ×êî×êç×êà×êÙ×êÒ×êË×êÄ×ê½×ê¶×ê¯×ê¨×ê¡×êš×ê“×êŒ×ê…×ê~×êw×êp×êi×êb×ê[×êT×êM×êF×ê?×ê8×ê1×ê*×ê#×ê×ê×ê×ê×ê×êùÖêòÖêëÖêäÖêÝÖêÖÖêÏÖêÈÖêÁÖêºÖê³Öê¬Öê¥ÖêžÖê—ÖêÖê‰Öê‚Öê{ÖêtÖêmÖêfÖê_ÖêXÖêQÖêJÖêCÖê<Öê5Öê.Öê'Öê ÖêÖêÖê ÖêÖêýÕêöÕêïÕêèÕêáÕêÚÕêÓÕêÌÕêÅÕê¾Õê·Õê°Õê©Õê¢Õê›Õê”ÕêÕê†ÕêÕêxÕêqÕêjÕêcÕê\ÕêUÕêNÕêGÕê@Õê9Õê2Õê+Õê$ÕêÕêÕêÕêÕêÕêúÔêóÔêìÔêåÔêÞÔê×ÔêÐÔêÉÔêÂÔê»Ôê´Ôê­Ôê¦ÔêŸÔê˜Ôê‘ÔêŠÔêƒÔê|ÔêuÔênÔêgÔê`ÔêYÔêRÔêKÔêDÔê=Ôê6Ôê/Ôê(Ôê!ÔêÔêÔê ÔêÔêþÓê÷ÓêðÓêéÓêâÓêÛÓêÔÓêÍÓêÆÓê¿Óê¸Óê±ÓêªÓê£ÓêœÓê•ÓêŽÓê‡Óê€ÓêyÓêrÓêkÓêdÓê]ÓêVÓêOÓêHÓêAÓê:Óê3Óê,Óê%ÓêÓêÓêÓê ÓêÓêûÒêôÒêíÒêæÒêßÒêØÒêÑÒêÊÒêÃÒê¼ÒêµÒê®Òê§Òê Òê™Òê’Òê‹Òê„Òê}ÒêvÒêoÒêhÒêaÒêZÒêSÒêLÒêEÒê>Òê7Òê0Òê)Òê"ÒêÒêÒê ÒêÒêÿÑêøÑêñÑêêÑêãÑêÜÑêÕÑêÎÑêÇÑêÀÑê¹Ñê²Ñê«Ñê¤ÑêÑê–ÑêÑêˆÑêÑêzÑêsÑêlÑêeÑê^ÑêWÑêPÑêIÑêBÑê;Ñê4Ñê-Ñê&ÑêÑêÑêÑê ÑêÑêüÐêõÐêîÐêçÐêàÐêÙÐêÒÐêËÐêÄÐê½Ðê¶Ðê¯Ðê¨Ðê¡ÐêšÐê“ÐêŒÐê…Ðê~ÐêwÐêpÐêiÐêbÐê[ÐêTÐêMÐêFÐê?Ðê8Ðê1Ðê*Ðê#ÐêÐêÐêÐêÐêÐêùÏêòÏêëÏêäÏêÝÏêÖÏêÏÏêÈÏêÁÏêºÏê³Ïê¬Ïê¥ÏêžÏê—ÏêÏê‰Ïê‚Ïê{ÏêtÏêmÏêfÏê_ÏêXÏêQÏêJÏêCÏê<Ïê5Ïê.Ïê'Ïê ÏêÏêÏê ÏêÏêýÎêöÎêïÎêèÎêáÎêÚÎêÓÎêÌÎêÅÎê¾Îê·Îê°Îê©Îê¢Îê›Îê”ÎêÎê†ÎêÎêxÎêqÎêjÎêcÎê\ÎêUÎêNÎêGÎê@Îê9Îê2Îê+Îê$ÎêÎêÎêÎêÎêÎêúÍêóÍêìÍêåÍêÞÍê×ÍêÐÍêÉÍêÂÍê»Íê´Íê­Íê¦ÍêŸÍê˜Íê‘ÍêŠÍêƒÍê|ÍêuÍênÍêgÍê`ÍêYÍêRÍêKÍêDÍê=Íê6Íê/Íê(Íê!ÍêÍêÍê ÍêÍêþÌê÷ÌêðÌêéÌêâÌêÛÌêÔÌêÍÌêÆÌê¿Ìê¸Ìê±ÌêªÌê£ÌêœÌê•ÌêŽÌê‡Ìê€ÌêyÌêrÌêkÌêdÌê]ÌêVÌêOÌêHÌêAÌê:Ìê3Ìê,Ìê%ÌêÌêÌêÌê ÌêÌêûËêôËêíËêæËêßËêØËêÑËêÊËêÃËê¼ËêµËê®Ëê§Ëê Ëê™Ëê’Ëê‹Ëê„Ëê}ËêvËêoËêhËêaËêZËêSËêLËêEËê>Ëê7Ëê0Ëê)Ëê"ËêËêËê ËêËêÿÊêøÊêñÊêêÊêãÊêÜÊêÕÊêÎÊêÇÊêÀÊê¹Êê²Êê«Êê¤ÊêÊê–ÊêÊêˆÊêÊêzÊêsÊêlÊêeÊê^ÊêWÊêPÊêIÊêBÊê;Êê4Êê-Êê&ÊêÊêÊêÊê ÊêÊêüÉêõÉêîÉêçÉêàÉêÙÉêÒÉêËÉêÄÉê½Éê¶Éê¯Éê¨Éê¡ÉêšÉê“ÉêŒÉê…Éê~ÉêwÉêpÉêiÉêbÉê[ÉêTÉêMÉêFÉê?Éê8Éê1Éê*Éê#ÉêÉêÉêÉêÉêÉêùÈêòÈêëÈêäÈêÝÈêÖÈêÏÈêÈÈêÁÈêºÈê³Èê¬Èê¥ÈêžÈê—ÈêÈê‰Èê‚Èê{ÈêtÈêmÈêfÈê_ÈêXÈêQÈêJÈêCÈê<Èê5Èê.Èê'Èê ÈêÈêÈê ÈêÈêýÇêöÇêïÇêèÇêáÇêÚÇêÓÇêÌÇêÅÇê¾Çê·Çê°Çê©Çê¢Çê›Çê”ÇêÇê†ÇêÇêxÇêqÇêjÇêcÇê\ÇêUÇêNÇêGÇê@Çê9Çê2Çê+Çê$ÇêÇêÇêÇêÇêÇêúÆêóÆêìÆêåÆêÞÆêׯêÐÆêÉÆêÂÆê»Æê´Æê­Æê¦ÆêŸÆê˜Æê‘ÆêŠÆêƒÆê|ÆêuÆênÆêgÆê`ÆêYÆêRÆêKÆêDÆê=Æê6Æê/Æê(Æê!ÆêÆêÆê ÆêÆêþÅê÷ÅêðÅêéÅêâÅêÛÅêÔÅêÍÅêÆÅê¿Åê¸Åê±ÅêªÅê£ÅêœÅê•ÅêŽÅê‡Åê€ÅêyÅêrÅêkÅêdÅê]ÅêVÅêOÅêHÅêAÅê:Åê3Åê,Åê%ÅêÅêÅêÅê ÅêÅêûÄêôÄêíÄêæÄêßÄêØÄêÑÄêÊÄêÃÄê¼ÄêµÄê®Äê§Äê Äê™Äê’Äê‹Äê„Äê}ÄêvÄêoÄêhÄêaÄêZÄêSÄêLÄêEÄê>Äê7Äê0Äê)Äê"ÄêÄêÄê ÄêÄêÿÃêøÃêñÃêêÃêãÃêÜÃêÕÃêÎÃêÇÃêÀÃê¹Ãê²Ãê«Ãê¤ÃêÃê–ÃêÃêˆÃêÃêzÃêsÃêlÃêeÃê^ÃêWÃêPÃêIÃêBÃê;Ãê4Ãê-Ãê&ÃêÃêÃêÃê ÃêÃêüÂêõÂêîÂêçÂêàÂêÙÂêÒÂêËÂêÄÂê½Âê¶Âê¯Âê¨Âê¡ÂêšÂê“ÂêŒÂê…Âê~ÂêwÂêpÂêiÂêbÂê[ÂêTÂêMÂêFÂê?Âê8Âê1Âê*Âê#ÂêÂêÂêÂêÂêÂêùÁêòÁêëÁêäÁêÝÁêÖÁêÏÁêÈÁêÁÁêºÁê³Áê¬Áê¥ÁêžÁê—ÁêÁê‰Áê‚Áê{ÁêtÁêmÁêfÁê_ÁêXÁêQÁêJÁêCÁê<Áê5Áê.Áê'Áê ÁêÁêÁê ÁêÁêýÀêöÀêïÀêèÀêáÀêÚÀêÓÀêÌÀêÅÀê¾Àê·Àê°Àê©Àê¢Àê›Àê”ÀêÀê†ÀêÀêxÀêqÀêjÀêcÀê\ÀêUÀêNÀêGÀê@Àê9Àê2Àê+Àê$ÀêÀêÀêÀêÀêÀêú¿êó¿êì¿êå¿êÞ¿ê׿êпêÉ¿ê¿ê»¿ê´¿ê­¿ê¦¿êŸ¿ê˜¿ê‘¿êŠ¿êƒ¿ê|¿êu¿ên¿êg¿ê`¿êY¿êR¿êK¿êD¿ê=¿ê6¿ê/¿ê(¿ê!¿ê¿ê¿ê ¿ê¿êþ¾ê÷¾êð¾êé¾êâ¾êÛ¾êÔ¾ê;êƾ꿾긾걾ꪾꣾꜾꕾê޾ꇾꀾêy¾êr¾êk¾êd¾ê]¾êV¾êO¾êH¾êA¾ê:¾ê3¾ê,¾ê%¾ê¾ê¾ê¾ê ¾ê¾êû½êô½êí½êæ½êß½êؽêѽêʽêý꼽굽ꮽꧽ꠽꙽꒽ꋽꄽê}½êv½êo½êh½êa½êZ½êS½êL½êE½ê>½ê7½ê0½ê)½ê"½ê½ê½ê ½ê½êÿ¼êø¼êñ¼êê¼êã¼êܼêÕ¼êμêǼêÀ¼ê¹¼ê²¼ê«¼ê¤¼ê¼ê–¼ê¼êˆ¼ê¼êz¼ês¼êl¼êe¼ê^¼êW¼êP¼êI¼êB¼ê;¼ê4¼ê-¼ê&¼ê¼ê¼ê¼ê ¼ê¼êü»êõ»êî»êç»êà»êÙ»êÒ»êË»êĻ꽻궻꯻꨻꡻ꚻꓻꌻꅻê~»êw»êp»êi»êb»ê[»êT»êM»êF»ê?»ê8»ê1»ê*»ê#»ê»ê»ê»ê»ê»êùºêòºêëºêäºêݺêÖºêϺêȺêÁºêººê³ºê¬ºê¥ºêžºê—ºêºê‰ºê‚ºê{ºêtºêmºêfºê_ºêXºêQºêJºêCºê<ºê5ºê.ºê'ºê ºêºêºê ºêºêý¹êö¹êï¹êè¹êá¹êÚ¹êÓ¹ê̹êŹê¾¹ê·¹ê°¹ê©¹ê¢¹ê›¹ê”¹ê¹ê†¹ê¹êx¹êq¹êj¹êc¹ê\¹êU¹êN¹êG¹ê@¹ê9¹ê2¹ê+¹ê$¹ê¹ê¹ê¹ê¹ê¹êú¸êó¸êì¸êå¸êÞ¸ê׸êиêɸê¸ê»¸ê´¸ê­¸ê¦¸êŸ¸ê˜¸ê‘¸êЏêƒ¸ê|¸êu¸ên¸êg¸ê`¸êY¸êR¸êK¸êD¸ê=¸ê6¸ê/¸ê(¸ê!¸ê¸ê¸ê ¸ê¸êþ·ê÷·êð·êé·êâ·êÛ·êÔ·êÍ·êÆ·ê¿·ê¸·ê±·êª·ê£·êœ·ê•·êŽ·ê‡·ê€·êy·êr·êk·êd·ê]·êV·êO·êH·êA·ê:·ê3·ê,·ê%·ê·ê·ê·ê ·ê·êû¶êô¶êí¶êæ¶êß¶êضêѶêʶêöê¼¶êµ¶ê®¶ê§¶ê ¶ê™¶ê’¶ê‹¶ê„¶ê}¶êv¶êo¶êh¶êa¶êZ¶êS¶êL¶êE¶ê>¶ê7¶ê0¶ê)¶ê"¶ê¶ê¶ê ¶ê¶êÿµêøµêñµêêµêãµêܵêÕµêεêǵêÀµê¹µê²µê«µê¤µêµê–µêµêˆµêµêzµêsµêlµêeµê^µêWµêPµêIµêBµê;µê4µê-µê&µêµêµêµê µêµêü´êõ´êî´êç´êà´êÙ´êÒ´êË´êĴ꽴궴꯴ꨴ꡴ꚴꓴꌴꅴê~´êw´êp´êi´êb´ê[´êT´êM´êF´ê?´ê8´ê1´ê*´ê#´ê´ê´ê´ê´ê´êù³êò³êë³êä³êݳêÖ³êϳêȳêÁ³êº³ê³³ê¬³ê¥³êž³ê—³ê³ê‰³ê‚³ê{³êt³êm³êf³ê_³êX³êQ³êJ³êC³ê<³ê5³ê.³ê'³ê ³ê³ê³ê ³ê³êý²êö²êï²êè²êá²êÚ²êÓ²ê̲êŲ꾲귲갲ꩲꢲ꛲ꔲê²ê†²ê²êx²êq²êj²êc²ê\²êU²êN²êG²ê@²ê9²ê2²ê+²ê$²ê²ê²ê²ê²ê²êú±êó±êì±êå±êÞ±ê×±êбêɱê±ê»±ê´±ê­±ê¦±êŸ±ê˜±ê‘±êбꃱê|±êu±ên±êg±ê`±êY±êR±êK±êD±ê=±ê6±ê/±ê(±ê!±ê±ê±ê ±ê±êþ°ê÷°êð°êé°êâ°êÛ°êÔ°êͰêư꿰기거ꪰ꣰ꜰꕰêްꇰꀰêy°êr°êk°êd°ê]°êV°êO°êH°êA°ê:°ê3°ê,°ê%°ê°ê°ê°ê °ê°êû¯êô¯êí¯êæ¯ê߯êدêѯêʯêï꼯굯ꮯꧯ꠯꙯꒯ꋯꄯê}¯êv¯êo¯êh¯êa¯êZ¯êS¯êL¯êE¯ê>¯ê7¯ê0¯ê)¯ê"¯ê¯ê¯ê ¯ê¯êÿ®êø®êñ®êê®êã®êÜ®êÕ®êήêÇ®êÀ®ê¹®ê²®ê«®ê¤®ê®ê–®ê®êˆ®ê®êz®ês®êl®êe®ê^®êW®êP®êI®êB®ê;®ê4®ê-®ê&®ê®ê®ê®ê ®ê®êü­êõ­êî­êç­êà­êÙ­êÒ­êË­êĭ꽭궭꯭ꨭꡭꚭꓭꌭꅭê~­êw­êp­êi­êb­ê[­êT­êM­êF­ê?­ê8­ê1­ê*­ê#­ê­ê­ê­ê­ê­êù¬êò¬êë¬êä¬êݬêÖ¬êϬêȬêÁ¬êº¬ê³¬ê¬¬ê¥¬êž¬ê—¬ê¬ê‰¬ê‚¬ê{¬êt¬êm¬êf¬ê_¬êX¬êQ¬êJ¬êC¬ê<¬ê5¬ê.¬ê'¬ê ¬ê¬ê¬ê ¬ê¬êý«êö«êï«êè«êá«êÚ«êÓ«êÌ«êū꾫귫갫ꩫꢫꛫꔫê«ê†«ê«êx«êq«êj«êc«ê\«êU«êN«êG«ê@«ê9«ê2«ê+«ê$«ê«ê«ê«ê«ê«êúªêóªêìªêåªêÞªêתêЪêɪêªê»ªê´ªê­ªê¦ªêŸªê˜ªê‘ªêŠªêƒªê|ªêuªênªêgªê`ªêYªêRªêKªêDªê=ªê6ªê/ªê(ªê!ªêªêªê ªêªêþ©ê÷©êð©êé©êâ©êÛ©êÔ©êÍ©êÆ©ê¿©ê¸©ê±©êª©ê£©êœ©ê•©êŽ©ê‡©ê€©êy©êr©êk©êd©ê]©êV©êO©êH©êA©ê:©ê3©ê,©ê%©ê©ê©ê©ê ©ê©êû¨êô¨êí¨êæ¨êߨêبêѨêʨêè꼨굨ꮨꧨ꠨Ꙩ꒨ꋨꄨê}¨êv¨êo¨êh¨êa¨êZ¨êS¨êL¨êE¨ê>¨ê7¨ê0¨ê)¨ê"¨ê¨ê¨ê ¨ê¨êÿ§êø§êñ§êê§êã§êܧêÕ§êΧêǧêÀ§ê¹§ê²§ê«§ê¤§ê§ê–§ê§êˆ§ê§êz§ês§êl§êe§ê^§êW§êP§êI§êB§ê;§ê4§ê-§ê&§ê§ê§ê§ê §ê§êü¦êõ¦êî¦êç¦êà¦êÙ¦êÒ¦ê˦êĦ꽦궦ꯦꨦꡦꚦꓦꌦꅦê~¦êw¦êp¦êi¦êb¦ê[¦êT¦êM¦êF¦ê?¦ê8¦ê1¦ê*¦ê#¦ê¦ê¦ê¦ê¦ê¦êù¥êò¥êë¥êä¥êÝ¥êÖ¥êÏ¥êÈ¥êÁ¥êº¥ê³¥ê¬¥ê¥¥êž¥ê—¥ê¥ê‰¥ê‚¥ê{¥êt¥êm¥êf¥ê_¥êX¥êQ¥êJ¥êC¥ê<¥ê5¥ê.¥ê'¥ê ¥ê¥ê¥ê ¥ê¥êý¤êö¤êï¤êè¤êá¤êÚ¤êÓ¤ê̤êŤê¾¤ê·¤ê°¤ê©¤ê¢¤ê›¤ê”¤ê¤ê†¤ê¤êx¤êq¤êj¤êc¤ê\¤êU¤êN¤êG¤ê@¤ê9¤ê2¤ê+¤ê$¤ê¤ê¤ê¤ê¤ê¤êú£êó£êì£êå£êÞ£ê×£êУêÉ£ê£ê»£ê´£ê­£ê¦£êŸ£ê˜£ê‘£êŠ£êƒ£ê|£êu£ên£êg£ê`£êY£êR£êK£êD£ê=£ê6£ê/£ê(£ê!£ê£ê£ê £ê£êþ¢ê÷¢êð¢êé¢êâ¢êÛ¢êÔ¢êÍ¢êÆ¢ê¿¢ê¸¢ê±¢êª¢ê£¢êœ¢ê•¢êŽ¢ê‡¢ê€¢êy¢êr¢êk¢êd¢ê]¢êV¢êO¢êH¢êA¢ê:¢ê3¢ê,¢ê%¢ê¢ê¢ê¢ê ¢ê¢êû¡êô¡êí¡êæ¡êß¡êØ¡êÑ¡êÊ¡êá꼡굡ꮡꧡꠡꙡ꒡ꋡꄡê}¡êv¡êo¡êh¡êa¡êZ¡êS¡êL¡êE¡ê>¡ê7¡ê0¡ê)¡ê"¡ê¡ê¡ê ¡ê¡êÿ êø êñ êê êã êÜ êÕ êΠêÇ êÀ ê¹ ê² ê« ê¤ ê ê– ê êˆ ê êz ês êl êe ê^ êW êP êI êB ê; ê4 ê- ê& ê ê ê ê  ê êüŸêõŸêîŸêçŸêàŸêÙŸêÒŸêËŸêğ꽟궟ꯟꨟꡟꚟꓟꌟꅟê~ŸêwŸêpŸêiŸêbŸê[ŸêTŸêMŸêFŸê?Ÿê8Ÿê1Ÿê*Ÿê#ŸêŸêŸêŸêŸêŸêùžêòžêëžêäžêÝžêÖžêÏžêÈžêÁžêºžê³žê¬žê¥žêžžê—žêžê‰žê‚žê{žêtžêmžêfžê_žêXžêQžêJžêCžê<žê5žê.žê'žê žêžêžê žêžêýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúœêóœêìœêåœêÞœêלêМêÉœêœê»œê´œê­œê¦œêŸœê˜œê‘œêŠœêƒœê|œêuœênœêgœê`œêYœêRœêKœêDœê=œê6œê/œê(œê!œêœêœê œêœêþ›ê÷›êð›êé›êâ›êÛ›êÔ›êÍ›êÆ›ê¿›ê¸›ê±›êª›ê£›êœ›ê•›êŽ›ê‡›ê€›êy›êr›êk›êd›ê]›êV›êO›êH›êA›ê:›ê3›ê,›ê%›ê›ê›ê›ê ›ê›êûšêôšêíšêæšêßšêØšêÑšêÊšêÚ꼚굚ꮚ꧚ꠚꙚ꒚ꋚꄚê}šêvšêošêhšêašêZšêSšêLšêEšê>šê7šê0šê)šê"šêšêšê šêšêÿ™êø™êñ™êê™êã™êÜ™êÕ™êΙêÇ™êÀ™ê¹™ê²™ê«™ê¤™ê™ê–™ê™êˆ™ê™êz™ês™êl™êe™ê^™êW™êP™êI™êB™ê;™ê4™ê-™ê&™ê™ê™ê™ê ™ê™êü˜êõ˜êî˜êç˜êà˜êÙ˜êÒ˜ê˘êĘ꽘궘ꯘꨘꡘꚘꓘꌘꅘê~˜êw˜êp˜êi˜êb˜ê[˜êT˜êM˜êF˜ê?˜ê8˜ê1˜ê*˜ê#˜ê˜ê˜ê˜ê˜ê˜êù—êò—êë—êä—êÝ—êÖ—êÏ—êÈ—êÁ—꺗곗꬗꥗ꞗꗗê—ꉗꂗê{—êt—êm—êf—ê_—êX—êQ—êJ—êC—ê<—ê5—ê.—ê'—ê —ê—ê—ê —ê—êý–êö–êï–êè–êá–êÚ–êÓ–êÌ–êŖ꾖귖갖꩖ꢖꛖꔖê–ꆖê–êx–êq–êj–êc–ê\–êU–êN–êG–ê@–ê9–ê2–ê+–ê$–ê–ê–ê–ê–ê–êú•êó•êì•êå•êÞ•êוêЕêÉ•ê•껕괕ꭕꦕꟕꘕꑕꊕꃕê|•êu•ên•êg•ê`•êY•êR•êK•êD•ê=•ê6•ê/•ê(•ê!•ê•ê•ê •ê•êþ”ê÷”êð”êé”êâ”êÛ”êÔ”êÍ”êÆ”ê¿”ê¸”ê±”êª”ê£”êœ”ê•”êŽ”ê‡”ê€”êy”êr”êk”êd”ê]”êV”êO”êH”êA”ê:”ê3”ê,”ê%”ê”ê”ê”ê ”ê”êû“êô“êí“êæ“êß“êØ“êÑ“êÊ“êÓ꼓굓ꮓ꧓ꠓꙓ꒓ꋓꄓê}“êv“êo“êh“êa“êZ“êS“êL“êE“ê>“ê7“ê0“ê)“ê"“ê“ê“ê “ê“êÿ’êø’êñ’êê’êã’êÜ’êÕ’êÎ’êÇ’êÀ’깒겒꫒ꤒê’ê–’ê’ꈒê’êz’ês’êl’êe’ê^’êW’êP’êI’êB’ê;’ê4’ê-’ê&’ê’ê’ê’ê ’ê’êü‘êõ‘êî‘êç‘êà‘êÙ‘êÒ‘êË‘êđ꽑궑ꯑꨑꡑꚑꓑꌑꅑê~‘êw‘êp‘êi‘êb‘ê[‘êT‘êM‘êF‘ê?‘ê8‘ê1‘ê*‘ê#‘ê‘ê‘ê‘ê‘ê‘êùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúŽêóŽêìŽêåŽêÞŽê׎êÐŽêÉŽêŽ껎괎ꭎꦎ꟎꘎ꑎꊎꃎê|ŽêuŽênŽêgŽê`ŽêYŽêRŽêKŽêDŽê=Žê6Žê/Žê(Žê!ŽêŽêŽê ŽêŽêþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûŒêôŒêíŒêæŒêߌêØŒêÑŒêÊŒêÌ꼌굌ꮌ꧌ꠌꙌꒌꋌꄌê}ŒêvŒêoŒêhŒêaŒêZŒêSŒêLŒêEŒê>Œê7Œê0Œê)Œê"ŒêŒêŒê ŒêŒêÿ‹êø‹êñ‹êê‹êã‹êÜ‹êÕ‹ê΋êÇ‹êÀ‹ê¹‹ê²‹ê«‹ê¤‹ê‹ê–‹ê‹êˆ‹ê‹êz‹ês‹êl‹êe‹ê^‹êW‹êP‹êI‹êB‹ê;‹ê4‹ê-‹ê&‹ê‹ê‹ê‹ê ‹ê‹êüŠêõŠêîŠêçŠêàŠêÙŠêÒŠêËŠêĊ꽊궊ꯊꨊꡊꚊ꓊ꌊꅊê~ŠêwŠêpŠêiŠêbŠê[ŠêTŠêMŠêFŠê?Šê8Šê1Šê*Šê#ŠêŠêŠêŠêŠêŠêù‰êò‰êë‰êä‰ê݉êÖ‰êωêȉêÁ‰êº‰ê³‰ê¬‰ê¥‰êž‰ê—‰ê‰ê‰‰ê‚‰ê{‰êt‰êm‰êf‰ê_‰êX‰êQ‰êJ‰êC‰ê<‰ê5‰ê.‰ê'‰ê ‰ê‰ê‰ê ‰ê‰êýˆêöˆêïˆêèˆêáˆêÚˆêÓˆê̈êň꾈귈갈ꩈꢈꛈꔈêˆê†ˆêˆêxˆêqˆêjˆêcˆê\ˆêUˆêNˆêGˆê@ˆê9ˆê2ˆê+ˆê$ˆêˆêˆêˆêˆêˆêú‡êó‡êì‡êå‡êÞ‡êׇêЇêɇê‡ê»‡ê´‡ê­‡ê¦‡êŸ‡ê˜‡ê‘‡êЇêƒ‡ê|‡êu‡ên‡êg‡ê`‡êY‡êR‡êK‡êD‡ê=‡ê6‡ê/‡ê(‡ê!‡ê‡ê‡ê ‡ê‡êþ†ê÷†êð†êé†êâ†êÛ†êÔ†ê͆êƆ꿆긆걆ꪆ꣆꜆ꕆêކꇆꀆêy†êr†êk†êd†ê]†êV†êO†êH†êA†ê:†ê3†ê,†ê%†ê†ê†ê†ê †ê†êû…êô…êí…êæ…êß…êØ…êÑ…êÊ…êÃ…ê¼…êµ…ê®…ê§…ê …ê™…ê’…ê‹…ê„…ê}…êv…êo…êh…êa…êZ…êS…êL…êE…ê>…ê7…ê0…ê)…ê"…ê…ê…ê …ê…êÿ„êø„êñ„êê„êã„êÜ„êÕ„ê΄êÇ„êÀ„깄겄꫄꤄ê„ê–„ê„ꈄê„êz„ês„êl„êe„ê^„êW„êP„êI„êB„ê;„ê4„ê-„ê&„ê„ê„ê„ê „ê„êüƒêõƒêîƒêçƒêàƒêÙƒêÒƒê˃êă꽃궃ꯃꨃꡃꚃ꓃ꌃꅃê~ƒêwƒêpƒêiƒêbƒê[ƒêTƒêMƒêFƒê?ƒê8ƒê1ƒê*ƒê#ƒêƒêƒêƒêƒêƒêù‚êò‚êë‚êä‚êÝ‚êÖ‚êÏ‚êÈ‚êÁ‚꺂곂ꬂꥂꞂꗂê‚ꉂꂂê{‚êt‚êm‚êf‚ê_‚êX‚êQ‚êJ‚êC‚ê<‚ê5‚ê.‚ê'‚ê ‚ê‚ê‚ê ‚ê‚êýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêú€êó€êì€êå€êÞ€ê×€êЀêÉ€ê€ê»€ê´€ê­€ê¦€êŸ€ê˜€ê‘€êŠ€êƒ€ê|€êu€ên€êg€ê`€êY€êR€êK€êD€ê=€ê6€ê/€ê(€ê!€ê€ê€ê €ê€êþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêû~êô~êí~êæ~êß~êØ~êÑ~êÊ~êÃ~ê¼~êµ~ê®~ê§~ê ~ê™~ê’~ê‹~ê„~ê}~êv~êo~êh~êa~êZ~êS~êL~êE~ê>~ê7~ê0~ê)~ê"~ê~ê~ê ~ê~êÿ}êø}êñ}êê}êã}êÜ}êÕ}êÎ}êÇ}êÀ}ê¹}ê²}ê«}ê¤}ê}ê–}ê}êˆ}ê}êz}ês}êl}êe}ê^}êW}êP}êI}êB}ê;}ê4}ê-}ê&}ê}ê}ê}ê }ê}êü|êõ|êî|êç|êà|êÙ|êÒ|êË|êÄ|ê½|ê¶|ê¯|ê¨|ê¡|êš|ê“|êŒ|ê…|ê~|êw|êp|êi|êb|ê[|êT|êM|êF|ê?|ê8|ê1|ê*|ê#|ê|ê|ê|ê|ê|êù{êò{êë{êä{êÝ{êÖ{êÏ{êÈ{êÁ{êº{ê³{ê¬{ê¥{êž{ê—{ê{ê‰{ê‚{ê{{êt{êm{êf{ê_{êX{êQ{êJ{êC{ê<{ê5{ê.{ê'{ê {ê{ê{ê {ê{êýzêözêïzêèzêázêÚzêÓzêÌzêÅzê¾zê·zê°zê©zê¢zê›zê”zêzê†zêzêxzêqzêjzêczê\zêUzêNzêGzê@zê9zê2zê+zê$zêzêzêzêzêzêúyêóyêìyêåyêÞyê×yêÐyêÉyêÂyê»yê´yê­yê¦yêŸyê˜yê‘yêŠyêƒyê|yêuyênyêgyê`yêYyêRyêKyêDyê=yê6yê/yê(yê!yêyêyê yêyêþxê÷xêðxêéxêâxêÛxêÔxêÍxêÆxê¿xê¸xê±xêªxê£xêœxê•xêŽxê‡xê€xêyxêrxêkxêdxê]xêVxêOxêHxêAxê:xê3xê,xê%xêxêxêxê xêxêûwêôwêíwêæwêßwêØwêÑwêÊwêÃwê¼wêµwê®wê§wê wê™wê’wê‹wê„wê}wêvwêowêhwêawêZwêSwêLwêEwê>wê7wê0wê)wê"wêwêwê wêwêÿvêøvêñvêêvêãvêÜvêÕvêÎvêÇvêÀvê¹vê²vê«vê¤vêvê–vêvêˆvêvêzvêsvêlvêevê^vêWvêPvêIvêBvê;vê4vê-vê&vêvêvêvê vêvêüuêõuêîuêçuêàuêÙuêÒuêËuêÄuê½uê¶uê¯uê¨uê¡uêšuê“uêŒuê…uê~uêwuêpuêiuêbuê[uêTuêMuêFuê?uê8uê1uê*uê#uêuêuêuêuêuêùtêòtêëtêätêÝtêÖtêÏtêÈtêÁtêºtê³tê¬tê¥têžtê—têtê‰tê‚tê{têttêmtêftê_têXtêQtêJtêCtêpê7pê0pê)pê"pêpêpê pêpêÿoêøoêñoêêoêãoêÜoêÕoêÎoêÇoêÀoê¹oê²oê«oê¤oêoê–oêoêˆoêoêzoêsoêloêeoê^oêWoêPoêIoêBoê;oê4oê-oê&oêoêoêoê oêoêünêõnêînêçnêànêÙnêÒnêËnêÄnê½nê¶nê¯nê¨nê¡nêšnê“nêŒnê…nê~nêwnêpnêinêbnê[nêTnêMnêFnê?nê8nê1nê*nê#nênênênênênêùmêòmêëmêämêÝmêÖmêÏmêÈmêÁmêºmê³mê¬mê¥mêžmê—mêmê‰mê‚mê{mêtmêmmêfmê_mêXmêQmêJmêCmêiê7iê0iê)iê"iêiêiê iêiêÿhêøhêñhêêhêãhêÜhêÕhêÎhêÇhêÀhê¹hê²hê«hê¤hêhê–hêhêˆhêhêzhêshêlhêehê^hêWhêPhêIhêBhê;hê4hê-hê&hêhêhêhê hêhêügêõgêîgêçgêàgêÙgêÒgêËgêÄgê½gê¶gê¯gê¨gê¡gêšgê“gêŒgê…gê~gêwgêpgêigêbgê[gêTgêMgêFgê?gê8gê1gê*gê#gêgêgêgêgêgêùfêòfêëfêäfêÝfêÖfêÏfêÈfêÁfêºfê³fê¬fê¥fêžfê—fêfê‰fê‚fê{fêtfêmfêffê_fêXfêQfêJfêCfêbê7bê0bê)bê"bêbêbê bêbêÿaêøaêñaêêaêãaêÜaêÕaêÎaêÇaêÀaê¹aê²aê«aê¤aêaê–aêaêˆaêaêzaêsaêlaêeaê^aêWaêPaêIaêBaê;aê4aê-aê&aêaêaêaê aêaêü`êõ`êî`êç`êà`êÙ`êÒ`êË`êÄ`ê½`ê¶`ê¯`ê¨`ê¡`êš`ê“`êŒ`ê…`ê~`êw`êp`êi`êb`ê[`êT`êM`êF`ê?`ê8`ê1`ê*`ê#`ê`ê`ê`ê`ê`êù_êò_êë_êä_êÝ_êÖ_êÏ_êÈ_êÁ_êº_ê³_ê¬_ê¥_êž_ê—_ê_ê‰_ê‚_ê{_êt_êm_êf_ê__êX_êQ_êJ_êC_ê<_ê5_ê._ê'_ê _ê_ê_ê _ê_êý^êö^êï^êè^êá^êÚ^êÓ^êÌ^êÅ^ê¾^ê·^ê°^ê©^ê¢^ê›^ê”^ê^ê†^ê^êx^êq^êj^êc^ê\^êU^êN^êG^ê@^ê9^ê2^ê+^ê$^ê^ê^ê^ê^ê^êú]êó]êì]êå]êÞ]ê×]êÐ]êÉ]êÂ]ê»]ê´]ê­]ê¦]êŸ]ê˜]ê‘]êŠ]êƒ]ê|]êu]ên]êg]ê`]êY]êR]êK]êD]ê=]ê6]ê/]ê(]ê!]ê]ê]ê ]ê]êþ\ê÷\êð\êé\êâ\êÛ\êÔ\êÍ\êÆ\ê¿\ê¸\ê±\êª\ê£\êœ\ê•\êŽ\ê‡\ê€\êy\êr\êk\êd\ê]\êV\êO\êH\êA\ê:\ê3\ê,\ê%\ê\ê\ê\ê \ê\êû[êô[êí[êæ[êß[êØ[êÑ[êÊ[êÃ[ê¼[êµ[ê®[ê§[ê [ê™[ê’[ê‹[ê„[ê}[êv[êo[êh[êa[êZ[êS[êL[êE[ê>[ê7[ê0[ê)[ê"[ê[ê[ê [ê[êÿZêøZêñZêêZêãZêÜZêÕZêÎZêÇZêÀZê¹Zê²Zê«Zê¤ZêZê–ZêZêˆZêZêzZêsZêlZêeZê^ZêWZêPZêIZêBZê;Zê4Zê-Zê&ZêZêZêZê ZêZêüYêõYêîYêçYêàYêÙYêÒYêËYêÄYê½Yê¶Yê¯Yê¨Yê¡YêšYê“YêŒYê…Yê~YêwYêpYêiYêbYê[YêTYêMYêFYê?Yê8Yê1Yê*Yê#YêYêYêYêYêYêùXêòXêëXêäXêÝXêÖXêÏXêÈXêÁXêºXê³Xê¬Xê¥XêžXê—XêXê‰Xê‚Xê{XêtXêmXêfXê_XêXXêQXêJXêCXêTê7Tê0Tê)Tê"TêTêTê TêTêÿSêøSêñSêêSêãSêÜSêÕSêÎSêÇSêÀSê¹Sê²Sê«Sê¤SêSê–SêSêˆSêSêzSêsSêlSêeSê^SêWSêPSêISêBSê;Sê4Sê-Sê&SêSêSêSê SêSêüRêõRêîRêçRêàRêÙRêÒRêËRêÄRê½Rê¶Rê¯Rê¨Rê¡RêšRê“RêŒRê…Rê~RêwRêpRêiRêbRê[RêTRêMRêFRê?Rê8Rê1Rê*Rê#RêRêRêRêRêRêùQêòQêëQêäQêÝQêÖQêÏQêÈQêÁQêºQê³Qê¬Qê¥QêžQê—QêQê‰Qê‚Qê{QêtQêmQêfQê_QêXQêQQêJQêCQêMê7Mê0Mê)Mê"MêMêMê MêMêÿLêøLêñLêêLêãLêÜLêÕLêÎLêÇLêÀLê¹Lê²Lê«Lê¤LêLê–LêLêˆLêLêzLêsLêlLêeLê^LêWLêPLêILêBLê;Lê4Lê-Lê&LêLêLêLê LêLêüKêõKêîKêçKêàKêÙKêÒKêËKêÄKê½Kê¶Kê¯Kê¨Kê¡KêšKê“KêŒKê…Kê~KêwKêpKêiKêbKê[KêTKêMKêFKê?Kê8Kê1Kê*Kê#KêKêKêKêKêKêùJêòJêëJêäJêÝJêÖJêÏJêÈJêÁJêºJê³Jê¬Jê¥JêžJê—JêJê‰Jê‚Jê{JêtJêmJêfJê_JêXJêQJêJJêCJêFê7Fê0Fê)Fê"FêFêFê FêFêÿEêøEêñEêêEêãEêÜEêÕEêÎEêÇEêÀEê¹Eê²Eê«Eê¤EêEê–EêEêˆEêEêzEêsEêlEêeEê^EêWEêPEêIEêBEê;Eê4Eê-Eê&EêEêEêEê EêEêüDêõDêîDêçDêàDêÙDêÒDêËDêÄDê½Dê¶Dê¯Dê¨Dê¡DêšDê“DêŒDê…Dê~DêwDêpDêiDêbDê[DêTDêMDêFDê?Dê8Dê1Dê*Dê#DêDêDêDêDêDêùCêòCêëCêäCêÝCêÖCêÏCêÈCêÁCêºCê³Cê¬Cê¥CêžCê—CêCê‰Cê‚Cê{CêtCêmCêfCê_CêXCêQCêJCêCCê?ê7?ê0?ê)?ê"?ê?ê?ê ?ê?êÿ>êø>êñ>êê>êã>êÜ>êÕ>êÎ>êÇ>êÀ>ê¹>ê²>ê«>ê¤>ê>ê–>ê>êˆ>ê>êz>ês>êl>êe>ê^>êW>êP>êI>êB>ê;>ê4>ê->ê&>ê>ê>ê>ê >ê>êü=êõ=êî=êç=êà=êÙ=êÒ=êË=êÄ=ê½=ê¶=ê¯=ê¨=ê¡=êš=ê“=êŒ=ê…=ê~=êw=êp=êi=êb=ê[=êT=êM=êF=ê?=ê8=ê1=ê*=ê#=ê=ê=ê=ê=ê=êù<êò<êë<êä<êÝ<êÖ<êÏ<êÈ<êÁ<êº<ê³<ê¬<ê¥<êž<ê—<ê<ê‰<ê‚<ê{<êt<êm<êf<ê_<êX<êQ<êJ<êC<ê<<ê5<ê.<ê'<ê <ê<ê<ê <ê<êý;êö;êï;êè;êá;êÚ;êÓ;êÌ;êÅ;ê¾;ê·;ê°;ê©;ê¢;ê›;ê”;ê;ê†;ê;êx;êq;êj;êc;ê\;êU;êN;êG;ê@;ê9;ê2;ê+;ê$;ê;ê;ê;ê;ê;êú:êó:êì:êå:êÞ:ê×:êÐ:êÉ:êÂ:ê»:ê´:ê­:ê¦:êŸ:ê˜:ê‘:êŠ:êƒ:ê|:êu:ên:êg:ê`:êY:êR:êK:êD:ê=:ê6:ê/:ê(:ê!:ê:ê:ê :ê:êþ9ê÷9êð9êé9êâ9êÛ9êÔ9êÍ9êÆ9ê¿9ê¸9ê±9êª9ê£9êœ9ê•9êŽ9ê‡9ê€9êy9êr9êk9êd9ê]9êV9êO9êH9êA9ê:9ê39ê,9ê%9ê9ê9ê9ê 9ê9êû8êô8êí8êæ8êß8êØ8êÑ8êÊ8êÃ8ê¼8êµ8ê®8ê§8ê 8ê™8ê’8ê‹8ê„8ê}8êv8êo8êh8êa8êZ8êS8êL8êE8ê>8ê78ê08ê)8ê"8ê8ê8ê 8ê8êÿ7êø7êñ7êê7êã7êÜ7êÕ7êÎ7êÇ7êÀ7ê¹7ê²7ê«7ê¤7ê7ê–7ê7êˆ7ê7êz7ês7êl7êe7ê^7êW7êP7êI7êB7ê;7ê47ê-7ê&7ê7ê7ê7ê 7ê7êü6êõ6êî6êç6êà6êÙ6êÒ6êË6êÄ6ê½6ê¶6ê¯6ê¨6ê¡6êš6ê“6êŒ6ê…6ê~6êw6êp6êi6êb6ê[6êT6êM6êF6ê?6ê86ê16ê*6ê#6ê6ê6ê6ê6ê6êù5êò5êë5êä5êÝ5êÖ5êÏ5êÈ5êÁ5êº5ê³5ê¬5ê¥5êž5ê—5ê5ê‰5ê‚5ê{5êt5êm5êf5ê_5êX5êQ5êJ5êC5ê<5ê55ê.5ê'5ê 5ê5ê5ê 5ê5êý4êö4êï4êè4êá4êÚ4êÓ4êÌ4êÅ4ê¾4ê·4ê°4ê©4ê¢4ê›4ê”4ê4ê†4ê4êx4êq4êj4êc4ê\4êU4êN4êG4ê@4ê94ê24ê+4ê$4ê4ê4ê4ê4ê4êú3êó3êì3êå3êÞ3ê×3êÐ3êÉ3êÂ3ê»3ê´3ê­3ê¦3êŸ3ê˜3ê‘3êŠ3êƒ3ê|3êu3ên3êg3ê`3êY3êR3êK3êD3ê=3ê63ê/3ê(3ê!3ê3ê3ê 3ê3êþ2ê÷2êð2êé2êâ2êÛ2êÔ2êÍ2êÆ2ê¿2ê¸2ê±2êª2ê£2êœ2ê•2êŽ2ê‡2ê€2êy2êr2êk2êd2ê]2êV2êO2êH2êA2ê:2ê32ê,2ê%2ê2ê2ê2ê 2ê2êû1êô1êí1êæ1êß1êØ1êÑ1êÊ1êÃ1ê¼1êµ1ê®1ê§1ê 1ê™1ê’1ê‹1ê„1ê}1êv1êo1êh1êa1êZ1êS1êL1êE1ê>1ê71ê01ê)1ê"1ê1ê1ê 1ê1êÿ0êø0êñ0êê0êã0êÜ0êÕ0êÎ0êÇ0êÀ0ê¹0ê²0ê«0ê¤0ê0ê–0ê0êˆ0ê0êz0ês0êl0êe0ê^0êW0êP0êI0êB0ê;0ê40ê-0ê&0ê0ê0ê0ê 0ê0êü/êõ/êî/êç/êà/êÙ/êÒ/êË/êÄ/ê½/ê¶/ê¯/ê¨/ê¡/êš/ê“/êŒ/ê…/ê~/êw/êp/êi/êb/ê[/êT/êM/êF/ê?/ê8/ê1/ê*/ê#/ê/ê/ê/ê/ê/êù.êò.êë.êä.êÝ.êÖ.êÏ.êÈ.êÁ.êº.ê³.ê¬.ê¥.êž.ê—.ê.ê‰.ê‚.ê{.êt.êm.êf.ê_.êX.êQ.êJ.êC.ê<.ê5.ê..ê'.ê .ê.ê.ê .ê.êý-êö-êï-êè-êá-êÚ-êÓ-êÌ-êÅ-ê¾-ê·-ê°-ê©-ê¢-ê›-ê”-ê-ê†-ê-êx-êq-êj-êc-ê\-êU-êN-êG-ê@-ê9-ê2-ê+-ê$-ê-ê-ê-ê-ê-êú,êó,êì,êå,êÞ,ê×,êÐ,êÉ,êÂ,ê»,ê´,ê­,ê¦,êŸ,ê˜,ê‘,êŠ,êƒ,ê|,êu,ên,êg,ê`,êY,êR,êK,êD,ê=,ê6,ê/,ê(,ê!,ê,ê,ê ,ê,êþ+ê÷+êð+êé+êâ+êÛ+êÔ+êÍ+êÆ+ê¿+ê¸+ê±+êª+ê£+êœ+ê•+êŽ+ê‡+ê€+êy+êr+êk+êd+ê]+êV+êO+êH+êA+ê:+ê3+ê,+ê%+ê+ê+ê+ê +ê+êû*êô*êí*êæ*êß*êØ*êÑ*êÊ*êÃ*ê¼*êµ*ê®*ê§*ê *ê™*ê’*ê‹*ê„*ê}*êv*êo*êh*êa*êZ*êS*êL*êE*ê>*ê7*ê0*ê)*ê"*ê*ê*ê *ê*êÿ)êø)êñ)êê)êã)êÜ)êÕ)êÎ)êÇ)êÀ)ê¹)ê²)ê«)ê¤)ê)ê–)ê)êˆ)ê)êz)ês)êl)êe)ê^)êW)êP)êI)êB)ê;)ê4)ê-)ê&)ê)ê)ê)ê )ê)êü(êõ(êî(êç(êà(êÙ(êÒ(êË(êÄ(ê½(ê¶(ê¯(ê¨(ê¡(êš(ê“(êŒ(ê…(ê~(êw(êp(êi(êb(ê[(êT(êM(êF(ê?(ê8(ê1(ê*(ê#(ê(ê(ê(ê(ê(êù'êò'êë'êä'êÝ'êÖ'êÏ'êÈ'êÁ'êº'ê³'ê¬'ê¥'êž'ê—'ê'ê‰'ê‚'ê{'êt'êm'êf'ê_'êX'êQ'êJ'êC'ê<'ê5'ê.'ê''ê 'ê'ê'ê 'ê'êý&êö&êï&êè&êá&êÚ&êÓ&êÌ&êÅ&ê¾&ê·&ê°&ê©&ê¢&ê›&ê”&ê&ê†&ê&êx&êq&êj&êc&ê\&êU&êN&êG&ê@&ê9&ê2&ê+&ê$&ê&ê&ê&ê&ê&êú%êó%êì%êå%êÞ%ê×%êÐ%êÉ%êÂ%ê»%ê´%ê­%ê¦%êŸ%ê˜%ê‘%êŠ%êƒ%ê|%êu%ên%êg%ê`%êY%êR%êK%êD%ê=%ê6%ê/%ê(%ê!%ê%ê%ê %ê%êþ$ê÷$êð$êé$êâ$êÛ$êÔ$êÍ$êÆ$ê¿$ê¸$ê±$êª$ê£$êœ$ê•$êŽ$ê‡$ê€$êy$êr$êk$êd$ê]$êV$êO$êH$êA$ê:$ê3$ê,$ê%$ê$ê$ê$ê $ê$êû#êô#êí#êæ#êß#êØ#êÑ#êÊ#êÃ#ê¼#êµ#ê®#ê§#ê #ê™#ê’#ê‹#ê„#ê}#êv#êo#êh#êa#êZ#êS#êL#êE#ê>#ê7#ê0#ê)#ê"#ê#ê#ê #ê#êÿ"êø"êñ"êê"êã"êÜ"êÕ"êÎ"êÇ"êÀ"ê¹"ê²"ê«"ê¤"ê"ê–"ê"êˆ"ê"êz"ês"êl"êe"ê^"êW"êP"êI"êB"ê;"ê4"ê-"ê&"ê"ê"ê"ê "ê"êü!êõ!êî!êç!êà!êÙ!êÒ!êË!êÄ!ê½!ê¶!ê¯!ê¨!ê¡!êš!ê“!êŒ!ê…!ê~!êw!êp!êi!êb!ê[!êT!êM!êF!ê?!ê8!ê1!ê*!ê#!ê!ê!ê!ê!ê!êù êò êë êä êÝ êÖ êÏ êÈ êÁ êº ê³ ê¬ ê¥ êž ê— ê ê‰ ê‚ ê{ êt êm êf ê_ êX êQ êJ êC ê< ê5 ê. ê' ê ê ê ê ê êýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿ êø êñ êê êã êÜ êÕ êÎ êÇ êÀ ê¹ ê² ê« ê¤ ê ê– ê êˆ ê êz ês êl êe ê^ êW êP êI êB ê; ê4 ê- ê& ê ê ê ê ê êü êõ êî êç êà êÙ êÒ êË êÄ ê½ ê¶ ê¯ ê¨ ê¡ êš ê“ êŒ ê… ê~ êw êp êi êb ê[ êT êM êF ê? ê8 ê1 ê* ê# ê ê ê ê ê êù êò êë êä êÝ êÖ êÏ êÈ êÁ êº ê³ ê¬ ê¥ êž ê— ê ê‰ ê‚ ê{ êt êm êf ê_ êX êQ êJ êC ê< ê5 ê. ê' ê ê ê ê ê êý êö êï êè êá êÚ êÓ êÌ êÅ ê¾ ê· ê° ê© ê¢ ê› ê” ê ê† ê êx êq êj êc ê\ êU êN êG ê@ ê9 ê2 ê+ ê$ ê ê ê ê ê êú êó êì êå êÞ ê× êÐ êÉ ê ê» ê´ ê­ ê¦ êŸ ê˜ ê‘ êŠ êƒ ê| êu ên êg ê` êY êR êK êD ê= ê6 ê/ ê( ê! ê ê ê ê êþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿÿéøÿéñÿéêÿéãÿéÜÿéÕÿéÎÿéÇÿéÀÿé¹ÿé²ÿé«ÿé¤ÿéÿé–ÿéÿéˆÿéÿézÿésÿélÿéeÿé^ÿéWÿéPÿéIÿéBÿé;ÿé4ÿé-ÿé&ÿéÿéÿéÿé ÿéÿéüþéõþéîþéçþéàþéÙþéÒþéËþéÄþé½þé¶þé¯þé¨þé¡þéšþé“þéŒþé…þé~þéwþépþéiþébþé[þéTþéMþéFþé?þé8þé1þé*þé#þéþéþéþéþéþéùýéòýéëýéäýéÝýéÖýéÏýéÈýéÁýéºýé³ýé¬ýé¥ýéžýé—ýéýé‰ýé‚ýé{ýétýémýéfýé_ýéXýéQýéJýéCýé<ýé5ýé.ýé'ýé ýéýéýé ýéýéýüéöüéïüéèüéáüéÚüéÓüéÌüéÅüé¾üé·üé°üé©üé¢üé›üé”üéüé†üéüéxüéqüéjüécüé\üéUüéNüéGüé@üé9üé2üé+üé$üéüéüéüéüéüéúûéóûéìûéåûéÞûé×ûéÐûéÉûéÂûé»ûé´ûé­ûé¦ûéŸûé˜ûé‘ûéŠûéƒûé|ûéuûénûégûé`ûéYûéRûéKûéDûé=ûé6ûé/ûé(ûé!ûéûéûé ûéûéþúé÷úéðúééúéâúéÛúéÔúéÍúéÆúé¿úé¸úé±úéªúé£úéœúé•úéŽúé‡úé€úéyúérúékúédúé]úéVúéOúéHúéAúé:úé3úé,úé%úéúéúéúé úéúéûùéôùéíùéæùéßùéØùéÑùéÊùéÃùé¼ùéµùé®ùé§ùé ùé™ùé’ùé‹ùé„ùé}ùévùéoùéhùéaùéZùéSùéLùéEùé>ùé7ùé0ùé)ùé"ùéùéùé ùéùéÿøéøøéñøéêøéãøéÜøéÕøéÎøéÇøéÀøé¹øé²øé«øé¤øéøé–øéøéˆøéøézøésøéløéeøé^øéWøéPøéIøéBøé;øé4øé-øé&øéøéøéøé øéøéü÷éõ÷éî÷éç÷éà÷éÙ÷éÒ÷éË÷éÄ÷é½÷é¶÷é¯÷é¨÷é¡÷éš÷é“÷éŒ÷é…÷é~÷éw÷ép÷éi÷éb÷é[÷éT÷éM÷éF÷é?÷é8÷é1÷é*÷é#÷é÷é÷é÷é÷é÷éùöéòöéëöéäöéÝöéÖöéÏöéÈöéÁöéºöé³öé¬öé¥öéžöé—öéöé‰öé‚öé{öétöémöéföé_öéXöéQöéJöéCöé<öé5öé.öé'öé öéöéöé öéöéýõéöõéïõéèõéáõéÚõéÓõéÌõéÅõé¾õé·õé°õé©õé¢õé›õé”õéõé†õéõéxõéqõéjõécõé\õéUõéNõéGõé@õé9õé2õé+õé$õéõéõéõéõéõéúôéóôéìôéåôéÞôé×ôéÐôéÉôéÂôé»ôé´ôé­ôé¦ôéŸôé˜ôé‘ôéŠôéƒôé|ôéuôénôégôé`ôéYôéRôéKôéDôé=ôé6ôé/ôé(ôé!ôéôéôé ôéôéþóé÷óéðóééóéâóéÛóéÔóéÍóéÆóé¿óé¸óé±óéªóé£óéœóé•óéŽóé‡óé€óéyóéróékóédóé]óéVóéOóéHóéAóé:óé3óé,óé%óéóéóéóé óéóéûòéôòéíòéæòéßòéØòéÑòéÊòéÃòé¼òéµòé®òé§òé òé™òé’òé‹òé„òé}òévòéoòéhòéaòéZòéSòéLòéEòé>òé7òé0òé)òé"òéòéòé òéòéÿñéøñéññéêñéãñéÜñéÕñéÎñéÇñéÀñé¹ñé²ñé«ñé¤ñéñé–ñéñéˆñéñézñésñélñéeñé^ñéWñéPñéIñéBñé;ñé4ñé-ñé&ñéñéñéñé ñéñéüðéõðéîðéçðéàðéÙðéÒðéËðéÄðé½ðé¶ðé¯ðé¨ðé¡ðéšðé“ðéŒðé…ðé~ðéwðépðéiðébðé[ðéTðéMðéFðé?ðé8ðé1ðé*ðé#ðéðéðéðéðéðéùïéòïéëïéäïéÝïéÖïéÏïéÈïéÁïéºïé³ïé¬ïé¥ïéžïé—ïéïé‰ïé‚ïé{ïétïémïéfïé_ïéXïéQïéJïéCïé<ïé5ïé.ïé'ïé ïéïéïé ïéïéýîéöîéïîéèîéáîéÚîéÓîéÌîéÅîé¾îé·îé°îé©îé¢îé›îé”îéîé†îéîéxîéqîéjîécîé\îéUîéNîéGîé@îé9îé2îé+îé$îéîéîéîéîéîéúíéóíéìíéåíéÞíé×íéÐíéÉíéÂíé»íé´íé­íé¦íéŸíé˜íé‘íéŠíéƒíé|íéuíéníégíé`íéYíéRíéKíéDíé=íé6íé/íé(íé!íéíéíé íéíéþìé÷ìéðìééìéâìéÛìéÔìéÍìéÆìé¿ìé¸ìé±ìéªìé£ìéœìé•ìéŽìé‡ìé€ìéyìérìékìédìé]ìéVìéOìéHìéAìé:ìé3ìé,ìé%ìéìéìéìé ìéìéûëéôëéíëéæëéßëéØëéÑëéÊëéÃëé¼ëéµëé®ëé§ëé ëé™ëé’ëé‹ëé„ëé}ëévëéoëéhëéaëéZëéSëéLëéEëé>ëé7ëé0ëé)ëé"ëéëéëé ëéëéÿêéøêéñêéêêéãêéÜêéÕêéÎêéÇêéÀêé¹êé²êé«êé¤êéêé–êéêéˆêéêézêésêélêéeêé^êéWêéPêéIêéBêé;êé4êé-êé&êéêéêéêé êéêéüééõééîééçééàééÙééÒééËééÄéé½éé¶éé¯éé¨éé¡ééšéé“ééŒéé…éé~ééwéépééiéébéé[ééTééMééFéé?éé8éé1éé*éé#ééééééééééééùèéòèéëèéäèéÝèéÖèéÏèéÈèéÁèéºèé³èé¬èé¥èéžèé—èéèé‰èé‚èé{èétèémèéfèé_èéXèéQèéJèéCèé<èé5èé.èé'èé èéèéèé èéèéýçéöçéïçéèçéáçéÚçéÓçéÌçéÅçé¾çé·çé°çé©çé¢çé›çé”çéçé†çéçéxçéqçéjçécçé\çéUçéNçéGçé@çé9çé2çé+çé$çéçéçéçéçéçéúæéóæéìæéåæéÞæé׿éÐæéÉæéÂæé»æé´æé­æé¦æéŸæé˜æé‘æéŠæéƒæé|æéuæénæégæé`æéYæéRæéKæéDæé=æé6æé/æé(æé!æéæéæé æéæéþåé÷åéðåééåéâåéÛåéÔåéÍåéÆåé¿åé¸åé±åéªåé£åéœåé•åéŽåé‡åé€åéyåéråékåédåé]åéVåéOåéHåéAåé:åé3åé,åé%åéåéåéåé åéåéûäéôäéíäéæäéßäéØäéÑäéÊäéÃäé¼äéµäé®äé§äé äé™äé’äé‹äé„äé}äéväéoäéhäéaäéZäéSäéLäéEäé>äé7äé0äé)äé"äéäéäé äéäéÿãéøãéñãéêãéããéÜãéÕãéÎãéÇãéÀãé¹ãé²ãé«ãé¤ãéãé–ãéãéˆãéãézãésãélãéeãé^ãéWãéPãéIãéBãé;ãé4ãé-ãé&ãéãéãéãé ãéãéüâéõâéîâéçâéàâéÙâéÒâéËâéÄâé½âé¶âé¯âé¨âé¡âéšâé“âéŒâé…âé~âéwâépâéiâébâé[âéTâéMâéFâé?âé8âé1âé*âé#âéâéâéâéâéâéùáéòáéëáéäáéÝáéÖáéÏáéÈáéÁáéºáé³áé¬áé¥áéžáé—áéáé‰áé‚áé{áétáémáéfáé_áéXáéQáéJáéCáé<áé5áé.áé'áé áéáéáé áéáéýàéöàéïàéèàéáàéÚàéÓàéÌàéÅàé¾àé·àé°àé©àé¢àé›àé”àéàé†àéàéxàéqàéjàécàé\àéUàéNàéGàé@àé9àé2àé+àé$àéàéàéàéàéàéúßéóßéìßéåßéÞßé×ßéÐßéÉßéÂßé»ßé´ßé­ßé¦ßéŸßé˜ßé‘ßéŠßéƒßé|ßéußénßégßé`ßéYßéRßéKßéDßé=ßé6ßé/ßé(ßé!ßéßéßé ßéßéþÞé÷ÞéðÞééÞéâÞéÛÞéÔÞéÍÞéÆÞé¿Þé¸Þé±ÞéªÞé£ÞéœÞé•ÞéŽÞé‡Þé€ÞéyÞérÞékÞédÞé]ÞéVÞéOÞéHÞéAÞé:Þé3Þé,Þé%ÞéÞéÞéÞé ÞéÞéûÝéôÝéíÝéæÝéßÝéØÝéÑÝéÊÝéÃÝé¼ÝéµÝé®Ýé§Ýé Ýé™Ýé’Ýé‹Ýé„Ýé}ÝévÝéoÝéhÝéaÝéZÝéSÝéLÝéEÝé>Ýé7Ýé0Ýé)Ýé"ÝéÝéÝé ÝéÝéÿÜéøÜéñÜéêÜéãÜéÜÜéÕÜéÎÜéÇÜéÀÜé¹Üé²Üé«Üé¤ÜéÜé–ÜéÜéˆÜéÜézÜésÜélÜéeÜé^ÜéWÜéPÜéIÜéBÜé;Üé4Üé-Üé&ÜéÜéÜéÜé ÜéÜéüÛéõÛéîÛéçÛéàÛéÙÛéÒÛéËÛéÄÛé½Ûé¶Ûé¯Ûé¨Ûé¡ÛéšÛé“ÛéŒÛé…Ûé~ÛéwÛépÛéiÛébÛé[ÛéTÛéMÛéFÛé?Ûé8Ûé1Ûé*Ûé#ÛéÛéÛéÛéÛéÛéùÚéòÚéëÚéäÚéÝÚéÖÚéÏÚéÈÚéÁÚéºÚé³Úé¬Úé¥ÚéžÚé—ÚéÚé‰Úé‚Úé{ÚétÚémÚéfÚé_ÚéXÚéQÚéJÚéCÚé<Úé5Úé.Úé'Úé ÚéÚéÚé ÚéÚéýÙéöÙéïÙéèÙéáÙéÚÙéÓÙéÌÙéÅÙé¾Ùé·Ùé°Ùé©Ùé¢Ùé›Ùé”ÙéÙé†ÙéÙéxÙéqÙéjÙécÙé\ÙéUÙéNÙéGÙé@Ùé9Ùé2Ùé+Ùé$ÙéÙéÙéÙéÙéÙéúØéóØéìØéåØéÞØéרéÐØéÉØéÂØé»Øé´Øé­Øé¦ØéŸØé˜Øé‘ØéŠØéƒØé|ØéuØénØégØé`ØéYØéRØéKØéDØé=Øé6Øé/Øé(Øé!ØéØéØé ØéØéþ×é÷×éð×éé×éâ×éÛ×éÔ×éÍ×éÆ×é¿×é¸×é±×éª×é£×éœ×é•×éŽ×é‡×é€×éy×ér×ék×éd×é]×éV×éO×éH×éA×é:×é3×é,×é%×é×é×é×é ×é×éûÖéôÖéíÖéæÖéßÖéØÖéÑÖéÊÖéÃÖé¼ÖéµÖé®Öé§Öé Öé™Öé’Öé‹Öé„Öé}ÖévÖéoÖéhÖéaÖéZÖéSÖéLÖéEÖé>Öé7Öé0Öé)Öé"ÖéÖéÖé ÖéÖéÿÕéøÕéñÕéêÕéãÕéÜÕéÕÕéÎÕéÇÕéÀÕé¹Õé²Õé«Õé¤ÕéÕé–ÕéÕéˆÕéÕézÕésÕélÕéeÕé^ÕéWÕéPÕéIÕéBÕé;Õé4Õé-Õé&ÕéÕéÕéÕé ÕéÕéüÔéõÔéîÔéçÔéàÔéÙÔéÒÔéËÔéÄÔé½Ôé¶Ôé¯Ôé¨Ôé¡ÔéšÔé“ÔéŒÔé…Ôé~ÔéwÔépÔéiÔébÔé[ÔéTÔéMÔéFÔé?Ôé8Ôé1Ôé*Ôé#ÔéÔéÔéÔéÔéÔéùÓéòÓéëÓéäÓéÝÓéÖÓéÏÓéÈÓéÁÓéºÓé³Óé¬Óé¥ÓéžÓé—ÓéÓé‰Óé‚Óé{ÓétÓémÓéfÓé_ÓéXÓéQÓéJÓéCÓé<Óé5Óé.Óé'Óé ÓéÓéÓé ÓéÓéýÒéöÒéïÒéèÒéáÒéÚÒéÓÒéÌÒéÅÒé¾Òé·Òé°Òé©Òé¢Òé›Òé”ÒéÒé†ÒéÒéxÒéqÒéjÒécÒé\ÒéUÒéNÒéGÒé@Òé9Òé2Òé+Òé$ÒéÒéÒéÒéÒéÒéúÑéóÑéìÑéåÑéÞÑé×ÑéÐÑéÉÑéÂÑé»Ñé´Ñé­Ñé¦ÑéŸÑé˜Ñé‘ÑéŠÑéƒÑé|ÑéuÑénÑégÑé`ÑéYÑéRÑéKÑéDÑé=Ñé6Ñé/Ñé(Ñé!ÑéÑéÑé ÑéÑéþÐé÷ÐéðÐééÐéâÐéÛÐéÔÐéÍÐéÆÐé¿Ðé¸Ðé±ÐéªÐé£ÐéœÐé•ÐéŽÐé‡Ðé€ÐéyÐérÐékÐédÐé]ÐéVÐéOÐéHÐéAÐé:Ðé3Ðé,Ðé%ÐéÐéÐéÐé ÐéÐéûÏéôÏéíÏéæÏéßÏéØÏéÑÏéÊÏéÃÏé¼ÏéµÏé®Ïé§Ïé Ïé™Ïé’Ïé‹Ïé„Ïé}ÏévÏéoÏéhÏéaÏéZÏéSÏéLÏéEÏé>Ïé7Ïé0Ïé)Ïé"ÏéÏéÏé ÏéÏéÿÎéøÎéñÎéêÎéãÎéÜÎéÕÎéÎÎéÇÎéÀÎé¹Îé²Îé«Îé¤ÎéÎé–ÎéÎéˆÎéÎézÎésÎélÎéeÎé^ÎéWÎéPÎéIÎéBÎé;Îé4Îé-Îé&ÎéÎéÎéÎé ÎéÎéüÍéõÍéîÍéçÍéàÍéÙÍéÒÍéËÍéÄÍé½Íé¶Íé¯Íé¨Íé¡ÍéšÍé“ÍéŒÍé…Íé~ÍéwÍépÍéiÍébÍé[ÍéTÍéMÍéFÍé?Íé8Íé1Íé*Íé#ÍéÍéÍéÍéÍéÍéùÌéòÌéëÌéäÌéÝÌéÖÌéÏÌéÈÌéÁÌéºÌé³Ìé¬Ìé¥ÌéžÌé—ÌéÌé‰Ìé‚Ìé{ÌétÌémÌéfÌé_ÌéXÌéQÌéJÌéCÌé<Ìé5Ìé.Ìé'Ìé ÌéÌéÌé ÌéÌéýËéöËéïËéèËéáËéÚËéÓËéÌËéÅËé¾Ëé·Ëé°Ëé©Ëé¢Ëé›Ëé”ËéËé†ËéËéxËéqËéjËécËé\ËéUËéNËéGËé@Ëé9Ëé2Ëé+Ëé$ËéËéËéËéËéËéúÊéóÊéìÊéåÊéÞÊé×ÊéÐÊéÉÊéÂÊé»Êé´Êé­Êé¦ÊéŸÊé˜Êé‘ÊéŠÊéƒÊé|ÊéuÊénÊégÊé`ÊéYÊéRÊéKÊéDÊé=Êé6Êé/Êé(Êé!ÊéÊéÊé ÊéÊéþÉé÷ÉéðÉééÉéâÉéÛÉéÔÉéÍÉéÆÉé¿Éé¸Éé±ÉéªÉé£ÉéœÉé•ÉéŽÉé‡Éé€ÉéyÉérÉékÉédÉé]ÉéVÉéOÉéHÉéAÉé:Éé3Éé,Éé%ÉéÉéÉéÉé ÉéÉéûÈéôÈéíÈéæÈéßÈéØÈéÑÈéÊÈéÃÈé¼ÈéµÈé®Èé§Èé Èé™Èé’Èé‹Èé„Èé}ÈévÈéoÈéhÈéaÈéZÈéSÈéLÈéEÈé>Èé7Èé0Èé)Èé"ÈéÈéÈé ÈéÈéÿÇéøÇéñÇéêÇéãÇéÜÇéÕÇéÎÇéÇÇéÀÇé¹Çé²Çé«Çé¤ÇéÇé–ÇéÇéˆÇéÇézÇésÇélÇéeÇé^ÇéWÇéPÇéIÇéBÇé;Çé4Çé-Çé&ÇéÇéÇéÇé ÇéÇéüÆéõÆéîÆéçÆéàÆéÙÆéÒÆéËÆéÄÆé½Æé¶Æé¯Æé¨Æé¡ÆéšÆé“ÆéŒÆé…Æé~ÆéwÆépÆéiÆébÆé[ÆéTÆéMÆéFÆé?Æé8Æé1Æé*Æé#ÆéÆéÆéÆéÆéÆéùÅéòÅéëÅéäÅéÝÅéÖÅéÏÅéÈÅéÁÅéºÅé³Åé¬Åé¥ÅéžÅé—ÅéÅé‰Åé‚Åé{ÅétÅémÅéfÅé_ÅéXÅéQÅéJÅéCÅé<Åé5Åé.Åé'Åé ÅéÅéÅé ÅéÅéýÄéöÄéïÄéèÄéáÄéÚÄéÓÄéÌÄéÅÄé¾Äé·Äé°Äé©Äé¢Äé›Äé”ÄéÄé†ÄéÄéxÄéqÄéjÄécÄé\ÄéUÄéNÄéGÄé@Äé9Äé2Äé+Äé$ÄéÄéÄéÄéÄéÄéúÃéóÃéìÃéåÃéÞÃé×ÃéÐÃéÉÃéÂÃé»Ãé´Ãé­Ãé¦ÃéŸÃé˜Ãé‘ÃéŠÃéƒÃé|ÃéuÃénÃégÃé`ÃéYÃéRÃéKÃéDÃé=Ãé6Ãé/Ãé(Ãé!ÃéÃéÃé ÃéÃéþÂé÷ÂéðÂééÂéâÂéÛÂéÔÂéÍÂéÆÂé¿Âé¸Âé±ÂéªÂé£ÂéœÂé•ÂéŽÂé‡Âé€ÂéyÂérÂékÂédÂé]ÂéVÂéOÂéHÂéAÂé:Âé3Âé,Âé%ÂéÂéÂéÂé ÂéÂéûÁéôÁéíÁéæÁéßÁéØÁéÑÁéÊÁéÃÁé¼ÁéµÁé®Áé§Áé Áé™Áé’Áé‹Áé„Áé}ÁévÁéoÁéhÁéaÁéZÁéSÁéLÁéEÁé>Áé7Áé0Áé)Áé"ÁéÁéÁé ÁéÁéÿÀéøÀéñÀéêÀéãÀéÜÀéÕÀéÎÀéÇÀéÀÀé¹Àé²Àé«Àé¤ÀéÀé–ÀéÀéˆÀéÀézÀésÀélÀéeÀé^ÀéWÀéPÀéIÀéBÀé;Àé4Àé-Àé&ÀéÀéÀéÀé ÀéÀéü¿éõ¿éî¿éç¿éà¿éÙ¿éÒ¿éË¿éĿ齿鶿鯿騿顿隿铿錿酿é~¿éw¿ép¿éi¿éb¿é[¿éT¿éM¿éF¿é?¿é8¿é1¿é*¿é#¿é¿é¿é¿é¿é¿éù¾éò¾éë¾éä¾éݾéÖ¾éϾéȾéÁ¾éº¾é³¾é¬¾é¥¾éž¾é—¾é¾é‰¾é‚¾é{¾ét¾ém¾éf¾é_¾éX¾éQ¾éJ¾éC¾é<¾é5¾é.¾é'¾é ¾é¾é¾é ¾é¾éý½éö½éï½éè½éá½éÚ½éÓ½é̽éŽé¾½é·½é°½é©½é¢½é›½é”½é½é†½é½éx½éq½éj½éc½é\½éU½éN½éG½é@½é9½é2½é+½é$½é½é½é½é½é½éú¼éó¼éì¼éå¼éÞ¼é×¼éмéɼé¼é»¼é´¼é­¼é¦¼éŸ¼é˜¼é‘¼éм郼é|¼éu¼én¼ég¼é`¼éY¼éR¼éK¼éD¼é=¼é6¼é/¼é(¼é!¼é¼é¼é ¼é¼éþ»é÷»éð»éé»éâ»éÛ»éÔ»éÍ»éÆ»é¿»é¸»é±»éª»é£»éœ»é•»éŽ»é‡»é€»éy»ér»ék»éd»é]»éV»éO»éH»éA»é:»é3»é,»é%»é»é»é»é »é»éûºéôºéíºéæºéߺéغéѺéʺéú鼺鵺鮺駺頺険钺鋺鄺é}ºévºéoºéhºéaºéZºéSºéLºéEºé>ºé7ºé0ºé)ºé"ºéºéºé ºéºéÿ¹éø¹éñ¹éê¹éã¹éܹéÕ¹éιéǹéÀ¹é¹¹é²¹é«¹é¤¹é¹é–¹é¹éˆ¹é¹éz¹és¹él¹ée¹é^¹éW¹éP¹éI¹éB¹é;¹é4¹é-¹é&¹é¹é¹é¹é ¹é¹éü¸éõ¸éî¸éç¸éà¸éÙ¸éÒ¸é˸éĸ齸鶸鯸騸顸隸铸錸酸é~¸éw¸ép¸éi¸éb¸é[¸éT¸éM¸éF¸é?¸é8¸é1¸é*¸é#¸é¸é¸é¸é¸é¸éù·éò·éë·éä·éÝ·éÖ·éÏ·éÈ·éÁ·éº·é³·é¬·é¥·éž·é—·é·é‰·é‚·é{·ét·ém·éf·é_·éX·éQ·éJ·éC·é<·é5·é.·é'·é ·é·é·é ·é·éý¶éö¶éï¶éè¶éá¶éÚ¶éÓ¶é̶éŶ龶鷶鰶驶颶零锶é¶é†¶é¶éx¶éq¶éj¶éc¶é\¶éU¶éN¶éG¶é@¶é9¶é2¶é+¶é$¶é¶é¶é¶é¶é¶éúµéóµéìµéåµéÞµé×µéеéɵéµé»µé´µé­µé¦µéŸµé˜µé‘µéе郵é|µéuµénµégµé`µéYµéRµéKµéDµé=µé6µé/µé(µé!µéµéµé µéµéþ´é÷´éð´éé´éâ´éÛ´éÔ´éÍ´éÆ´é¿´é¸´é±´éª´é£´éœ´é•´éŽ´é‡´é€´éy´ér´ék´éd´é]´éV´éO´éH´éA´é:´é3´é,´é%´é´é´é´é ´é´éû³éô³éí³éæ³éß³éسéѳéʳéó鼳鵳鮳駳頳陳钳鋳鄳é}³év³éo³éh³éa³éZ³éS³éL³éE³é>³é7³é0³é)³é"³é³é³é ³é³éÿ²éø²éñ²éê²éã²éܲéÕ²éβéDzéÀ²é¹²é²²é«²é¤²é²é–²é²éˆ²é²éz²és²él²ée²é^²éW²éP²éI²éB²é;²é4²é-²é&²é²é²é²é ²é²éü±éõ±éî±éç±éà±éÙ±éÒ±é˱éı齱鶱鯱騱顱隱铱錱酱é~±éw±ép±éi±éb±é[±éT±éM±éF±é?±é8±é1±é*±é#±é±é±é±é±é±éù°éò°éë°éä°éݰéÖ°éϰéȰéÁ°éº°é³°é¬°é¥°éž°é—°é°é‰°é‚°é{°ét°ém°éf°é_°éX°éQ°éJ°éC°é<°é5°é.°é'°é °é°é°é °é°éý¯éö¯éï¯éè¯éá¯éÚ¯éÓ¯é̯éů龯鷯鰯驯颯雯锯é¯é†¯é¯éx¯éq¯éj¯éc¯é\¯éU¯éN¯éG¯é@¯é9¯é2¯é+¯é$¯é¯é¯é¯é¯é¯éú®éó®éì®éå®éÞ®é×®éЮéÉ®é®é»®é´®é­®é¦®éŸ®é˜®é‘®éŠ®éƒ®é|®éu®én®ég®é`®éY®éR®éK®éD®é=®é6®é/®é(®é!®é®é®é ®é®éþ­é÷­éð­éé­éâ­éÛ­éÔ­éÍ­éÆ­é¿­é¸­é±­éª­é£­éœ­é•­éŽ­é‡­é€­éy­ér­ék­éd­é]­éV­éO­éH­éA­é:­é3­é,­é%­é­é­é­é ­é­éû¬éô¬éí¬éæ¬é߬éجéѬéʬéì鼬鵬鮬駬頬陬钬鋬鄬é}¬év¬éo¬éh¬éa¬éZ¬éS¬éL¬éE¬é>¬é7¬é0¬é)¬é"¬é¬é¬é ¬é¬éÿ«éø«éñ«éê«éã«éÜ«éÕ«éΫéÇ«éÀ«é¹«é²«é««é¤«é«é–«é«éˆ«é«éz«és«él«ée«é^«éW«éP«éI«éB«é;«é4«é-«é&«é«é«é«é «é«éüªéõªéîªéçªéàªéÙªéÒªé˪éĪ齪鶪鯪騪顪險铪錪酪é~ªéwªépªéiªébªé[ªéTªéMªéFªé?ªé8ªé1ªé*ªé#ªéªéªéªéªéªéù©éò©éë©éä©éÝ©éÖ©éÏ©éÈ©éÁ©éº©é³©é¬©é¥©éž©é—©é©é‰©é‚©é{©ét©ém©éf©é_©éX©éQ©éJ©éC©é<©é5©é.©é'©é ©é©é©é ©é©éý¨éö¨éï¨éè¨éá¨éÚ¨éÓ¨ę́éŨ龨鷨鰨驨風雨锨é¨é†¨é¨éx¨éq¨éj¨éc¨é\¨éU¨éN¨éG¨é@¨é9¨é2¨é+¨é$¨é¨é¨é¨é¨é¨éú§éó§éì§éå§éÞ§é×§éЧéɧé§é»§é´§é­§é¦§éŸ§é˜§é‘§éЧ郧é|§éu§én§ég§é`§éY§éR§éK§éD§é=§é6§é/§é(§é!§é§é§é §é§éþ¦é÷¦éð¦éé¦éâ¦éÛ¦éÔ¦éͦéƦ鿦鸦鱦骦飦霦镦éަ釦逦éy¦ér¦ék¦éd¦é]¦éV¦éO¦éH¦éA¦é:¦é3¦é,¦é%¦é¦é¦é¦é ¦é¦éû¥éô¥éí¥éæ¥éߥ騥éÑ¥éÊ¥éå鼥鵥鮥駥頥陥钥鋥鄥é}¥év¥éo¥éh¥éa¥éZ¥éS¥éL¥éE¥é>¥é7¥é0¥é)¥é"¥é¥é¥é ¥é¥éÿ¤éø¤éñ¤éê¤éã¤éܤéÕ¤éΤéǤéÀ¤é¹¤é²¤é«¤é¤¤é¤é–¤é¤éˆ¤é¤éz¤és¤él¤ée¤é^¤éW¤éP¤éI¤éB¤é;¤é4¤é-¤é&¤é¤é¤é¤é ¤é¤éü£éõ£éî£éç£éà£éÙ£éÒ£éË£éģ齣鶣鯣騣顣隣铣錣酣é~£éw£ép£éi£éb£é[£éT£éM£éF£é?£é8£é1£é*£é#£é£é£é£é£é£éù¢éò¢éë¢éä¢éÝ¢éÖ¢éÏ¢éÈ¢éÁ¢éº¢é³¢é¬¢é¥¢éž¢é—¢é¢é‰¢é‚¢é{¢ét¢ém¢éf¢é_¢éX¢éQ¢éJ¢éC¢é<¢é5¢é.¢é'¢é ¢é¢é¢é ¢é¢éý¡éö¡éï¡éè¡éá¡éÚ¡éÓ¡éÌ¡éš龡鷡鰡驡颡雡锡é¡é†¡é¡éx¡éq¡éj¡éc¡é\¡éU¡éN¡éG¡é@¡é9¡é2¡é+¡é$¡é¡é¡é¡é¡é¡éú éó éì éå éÞ é× éРéÉ é é» é´ é­ é¦ éŸ é˜ é‘ éŠ éƒ é| éu én ég é` éY éR éK éD é= é6 é/ é( é! é é é  é éþŸé÷ŸéðŸééŸéâŸéÛŸéÔŸéÍŸéÆŸé¿Ÿé¸Ÿé±ŸéªŸé£ŸéœŸé•ŸéŽŸé‡Ÿé€ŸéyŸérŸékŸédŸé]ŸéVŸéOŸéHŸéAŸé:Ÿé3Ÿé,Ÿé%ŸéŸéŸéŸé ŸéŸéûžéôžéížéæžéßžéØžéÑžéÊžéÞ鼞鵞鮞駞頞陞钞鋞鄞é}žévžéožéhžéažéZžéSžéLžéEžé>žé7žé0žé)žé"žéžéžé žéžéÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüœéõœéîœéçœéàœéÙœéÒœéËœéĜ齜鶜鯜騜顜障铜錜酜é~œéwœépœéiœébœé[œéTœéMœéFœé?œé8œé1œé*œé#œéœéœéœéœéœéù›éò›éë›éä›éÝ›éÖ›éÏ›éÈ›éÁ›éº›é³›é¬›é¥›éž›é—›é›é‰›é‚›é{›ét›ém›éf›é_›éX›éQ›éJ›éC›é<›é5›é.›é'›é ›é›é›é ›é›éýšéöšéïšéèšéášéÚšéÓšéÌšéŚ龚鷚鰚驚颚雚锚éšé†šéšéxšéqšéjšécšé\šéUšéNšéGšé@šé9šé2šé+šé$šéšéšéšéšéšéú™éó™éì™éå™éÞ™é×™éЙéÉ™é™é»™é´™é­™é¦™éŸ™é˜™é‘™éŠ™éƒ™é|™éu™én™ég™é`™éY™éR™éK™éD™é=™é6™é/™é(™é!™é™é™é ™é™éþ˜é÷˜éð˜éé˜éâ˜éÛ˜éÔ˜é͘éƘ鿘鸘鱘骘飘霘镘鎘釘逘éy˜ér˜ék˜éd˜é]˜éV˜éO˜éH˜éA˜é:˜é3˜é,˜é%˜é˜é˜é˜é ˜é˜éû—éô—éí—éæ—éߗ騗éÑ—éÊ—é×é¼—éµ—é®—é§—é —é™—é’—é‹—é„—é}—év—éo—éh—éa—éZ—éS—éL—éE—é>—é7—é0—é)—é"—é—é—é —é—éÿ–éø–éñ–éê–éã–éÜ–éÕ–éΖéÇ–éÀ–鹖鲖髖餖é–é––é–鈖é–éz–és–él–ée–é^–éW–éP–éI–éB–é;–é4–é-–é&–é–é–é–é –é–éü•éõ•éî•éç•éà•éÙ•éÒ•éË•éĕ齕鶕鯕騕顕隕铕錕酕é~•éw•ép•éi•éb•é[•éT•éM•éF•é?•é8•é1•é*•é#•é•é•é•é•é•éù”éò”éë”éä”éÝ”éÖ”éÏ”éÈ”éÁ”麔鳔鬔饔鞔闔é”鉔邔é{”ét”ém”éf”é_”éX”éQ”éJ”éC”é<”é5”é.”é'”é ”é”é”é ”é”éý“éö“éï“éè“éá“éÚ“éÓ“éÌ“éœ龓鷓鰓驓颓雓锓é“醓é“éx“éq“éj“éc“é\“éU“éN“éG“é@“é9“é2“é+“é$“é“é“é“é“é“éú’éó’éì’éå’éÞ’é×’éÐ’éÉ’é’黒鴒魒馒韒阒鑒銒郒é|’éu’én’ég’é`’éY’éR’éK’éD’é=’é6’é/’é(’é!’é’é’é ’é’éþ‘é÷‘éð‘éé‘éâ‘éÛ‘éÔ‘éÍ‘éÆ‘é¿‘é¸‘é±‘éª‘é£‘éœ‘é•‘éŽ‘é‡‘é€‘éy‘ér‘ék‘éd‘é]‘éV‘éO‘éH‘éA‘é:‘é3‘é,‘é%‘é‘é‘é‘é ‘é‘éûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüŽéõŽéîŽéçŽéàŽéÙŽéÒŽéËŽéĎ齎鶎鯎騎顎階铎錎酎é~ŽéwŽépŽéiŽébŽé[ŽéTŽéMŽéFŽé?Žé8Žé1Žé*Žé#ŽéŽéŽéŽéŽéŽéùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýŒéöŒéïŒéèŒéáŒéÚŒéÓŒéÌŒéŌ龌鷌鰌驌颌雌锌éŒé†ŒéŒéxŒéqŒéjŒécŒé\ŒéUŒéNŒéGŒé@Œé9Œé2Œé+Œé$ŒéŒéŒéŒéŒéŒéú‹éó‹éì‹éå‹éÞ‹é׋éЋéÉ‹é‹é»‹é´‹é­‹é¦‹éŸ‹é˜‹é‘‹éŠ‹éƒ‹é|‹éu‹én‹ég‹é`‹éY‹éR‹éK‹éD‹é=‹é6‹é/‹é(‹é!‹é‹é‹é ‹é‹éþŠé÷ŠéðŠééŠéâŠéÛŠéÔŠéÍŠéÆŠé¿Šé¸Šé±ŠéªŠé£ŠéœŠé•ŠéŽŠé‡Šé€ŠéyŠérŠékŠédŠé]ŠéVŠéOŠéHŠéAŠé:Šé3Šé,Šé%ŠéŠéŠéŠé ŠéŠéû‰éô‰éí‰éæ‰é߉é؉éщéʉéÉ鼉鵉鮉駉頉陉钉鋉鄉é}‰év‰éo‰éh‰éa‰éZ‰éS‰éL‰éE‰é>‰é7‰é0‰é)‰é"‰é‰é‰é ‰é‰éÿˆéøˆéñˆéêˆéãˆé܈éÕˆéΈéLjéÀˆé¹ˆé²ˆé«ˆé¤ˆéˆé–ˆéˆéˆˆéˆézˆésˆélˆéeˆé^ˆéWˆéPˆéIˆéBˆé;ˆé4ˆé-ˆé&ˆéˆéˆéˆé ˆéˆéü‡éõ‡éî‡éç‡éà‡éÙ‡éÒ‡éˇéć齇鶇鯇騇顇隇铇錇酇é~‡éw‡ép‡éi‡éb‡é[‡éT‡éM‡éF‡é?‡é8‡é1‡é*‡é#‡é‡é‡é‡é‡é‡éù†éò†éë†éä†é݆éÖ†éφéȆéÁ†éº†é³†é¬†é¥†éž†é—†é†é‰†é‚†é{†ét†ém†éf†é_†éX†éQ†éJ†éC†é<†é5†é.†é'†é †é†é†é †é†éý…éö…éï…éè…éá…éÚ…éÓ…éÌ…éŅ龅鷅鰅驅颅雅锅é…醅é…éx…éq…éj…éc…é\…éU…éN…éG…é@…é9…é2…é+…é$…é…é…é…é…é…éú„éó„éì„éå„éÞ„éׄéЄéÉ„é„黄鴄魄馄韄阄鑄銄郄é|„éu„én„ég„é`„éY„éR„éK„éD„é=„é6„é/„é(„é!„é„é„é „é„éþƒé÷ƒéðƒééƒéâƒéÛƒéÔƒé̓éƃ鿃鸃鱃骃飃霃镃鎃釃逃éyƒérƒékƒédƒé]ƒéVƒéOƒéHƒéAƒé:ƒé3ƒé,ƒé%ƒéƒéƒéƒé ƒéƒéû‚éô‚éí‚éæ‚é߂騂éÑ‚éÊ‚éÂ鼂鵂鮂駂頂陂钂鋂鄂é}‚év‚éo‚éh‚éa‚éZ‚éS‚éL‚éE‚é>‚é7‚é0‚é)‚é"‚é‚é‚é ‚é‚éÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééü€éõ€éî€éç€éà€éÙ€éÒ€éË€éĀ齀鶀鯀騀顀隀铀錀酀é~€éw€ép€éi€éb€é[€éT€éM€éF€é?€é8€é1€é*€é#€é€é€é€é€é€éùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééý~éö~éï~éè~éá~éÚ~éÓ~éÌ~éÅ~é¾~é·~é°~é©~é¢~é›~é”~é~é†~é~éx~éq~éj~éc~é\~éU~éN~éG~é@~é9~é2~é+~é$~é~é~é~é~é~éú}éó}éì}éå}éÞ}é×}éÐ}éÉ}éÂ}é»}é´}é­}é¦}éŸ}é˜}é‘}éŠ}éƒ}é|}éu}én}ég}é`}éY}éR}éK}éD}é=}é6}é/}é(}é!}é}é}é }é}éþ|é÷|éð|éé|éâ|éÛ|éÔ|éÍ|éÆ|é¿|é¸|é±|éª|é£|éœ|é•|éŽ|é‡|é€|éy|ér|ék|éd|é]|éV|éO|éH|éA|é:|é3|é,|é%|é|é|é|é |é|éû{éô{éí{éæ{éß{éØ{éÑ{éÊ{éÃ{é¼{éµ{é®{é§{é {é™{é’{é‹{é„{é}{év{éo{éh{éa{éZ{éS{éL{éE{é>{é7{é0{é){é"{é{é{é {é{éÿzéøzéñzéêzéãzéÜzéÕzéÎzéÇzéÀzé¹zé²zé«zé¤zézé–zézéˆzézézzészélzéezé^zéWzéPzéIzéBzé;zé4zé-zé&zézézézé zézéüyéõyéîyéçyéàyéÙyéÒyéËyéÄyé½yé¶yé¯yé¨yé¡yéšyé“yéŒyé…yé~yéwyépyéiyébyé[yéTyéMyéFyé?yé8yé1yé*yé#yéyéyéyéyéyéùxéòxéëxéäxéÝxéÖxéÏxéÈxéÁxéºxé³xé¬xé¥xéžxé—xéxé‰xé‚xé{xétxémxéfxé_xéXxéQxéJxéCxété7té0té)té"tétété tétéÿséøséñséêséãséÜséÕséÎséÇséÀsé¹sé²sé«sé¤sésé–séséˆsésézséssélséesé^séWséPséIséBsé;sé4sé-sé&sésésésé séséüréõréîréçréàréÙréÒréËréÄré½ré¶ré¯ré¨ré¡réšré“réŒré…ré~réwrépréirébré[réTréMréFré?ré8ré1ré*ré#réréréréréréùqéòqéëqéäqéÝqéÖqéÏqéÈqéÁqéºqé³qé¬qé¥qéžqé—qéqé‰qé‚qé{qétqémqéfqé_qéXqéQqéJqéCqémé7mé0mé)mé"mémémé méméÿléøléñléêléãléÜléÕléÎléÇléÀlé¹lé²lé«lé¤lélé–léléˆlélézléslélléelé^léWléPléIléBlé;lé4lé-lé&lélélélé léléükéõkéîkéçkéàkéÙkéÒkéËkéÄké½ké¶ké¯ké¨ké¡kéšké“kéŒké…ké~kéwképkéikébké[kéTkéMkéFké?ké8ké1ké*ké#kékékékékékéùjéòjéëjéäjéÝjéÖjéÏjéÈjéÁjéºjé³jé¬jé¥jéžjé—jéjé‰jé‚jé{jétjémjéfjé_jéXjéQjéJjéCjéfé7fé0fé)fé"féféfé féféÿeéøeéñeéêeéãeéÜeéÕeéÎeéÇeéÀeé¹eé²eé«eé¤eéeé–eéeéˆeéeézeéseéleéeeé^eéWeéPeéIeéBeé;eé4eé-eé&eéeéeéeé eéeéüdéõdéîdéçdéàdéÙdéÒdéËdéÄdé½dé¶dé¯dé¨dé¡déšdé“déŒdé…dé~déwdépdéidébdé[déTdéMdéFdé?dé8dé1dé*dé#dédédédédédéùcéòcéëcéäcéÝcéÖcéÏcéÈcéÁcéºcé³cé¬cé¥céžcé—cécé‰cé‚cé{cétcémcéfcé_céXcéQcéJcéCcé_é7_é0_é)_é"_é_é_é _é_éÿ^éø^éñ^éê^éã^éÜ^éÕ^éÎ^éÇ^éÀ^é¹^é²^é«^é¤^é^é–^é^éˆ^é^éz^és^él^ée^é^^éW^éP^éI^éB^é;^é4^é-^é&^é^é^é^é ^é^éü]éõ]éî]éç]éà]éÙ]éÒ]éË]éÄ]é½]é¶]é¯]é¨]é¡]éš]é“]éŒ]é…]é~]éw]ép]éi]éb]é[]éT]éM]éF]é?]é8]é1]é*]é#]é]é]é]é]é]éù\éò\éë\éä\éÝ\éÖ\éÏ\éÈ\éÁ\éº\é³\é¬\é¥\éž\é—\é\é‰\é‚\é{\ét\ém\éf\é_\éX\éQ\éJ\éC\é<\é5\é.\é'\é \é\é\é \é\éý[éö[éï[éè[éá[éÚ[éÓ[éÌ[éÅ[é¾[é·[é°[é©[é¢[é›[é”[é[é†[é[éx[éq[éj[éc[é\[éU[éN[éG[é@[é9[é2[é+[é$[é[é[é[é[é[éúZéóZéìZéåZéÞZé×ZéÐZéÉZéÂZé»Zé´Zé­Zé¦ZéŸZé˜Zé‘ZéŠZéƒZé|ZéuZénZégZé`ZéYZéRZéKZéDZé=Zé6Zé/Zé(Zé!ZéZéZé ZéZéþYé÷YéðYééYéâYéÛYéÔYéÍYéÆYé¿Yé¸Yé±YéªYé£YéœYé•YéŽYé‡Yé€YéyYérYékYédYé]YéVYéOYéHYéAYé:Yé3Yé,Yé%YéYéYéYé YéYéûXéôXéíXéæXéßXéØXéÑXéÊXéÃXé¼XéµXé®Xé§Xé Xé™Xé’Xé‹Xé„Xé}XévXéoXéhXéaXéZXéSXéLXéEXé>Xé7Xé0Xé)Xé"XéXéXé XéXéÿWéøWéñWéêWéãWéÜWéÕWéÎWéÇWéÀWé¹Wé²Wé«Wé¤WéWé–WéWéˆWéWézWésWélWéeWé^WéWWéPWéIWéBWé;Wé4Wé-Wé&WéWéWéWé WéWéüVéõVéîVéçVéàVéÙVéÒVéËVéÄVé½Vé¶Vé¯Vé¨Vé¡VéšVé“VéŒVé…Vé~VéwVépVéiVébVé[VéTVéMVéFVé?Vé8Vé1Vé*Vé#VéVéVéVéVéVéùUéòUéëUéäUéÝUéÖUéÏUéÈUéÁUéºUé³Ué¬Ué¥UéžUé—UéUé‰Ué‚Ué{UétUémUéfUé_UéXUéQUéJUéCUéQé7Qé0Qé)Qé"QéQéQé QéQéÿPéøPéñPéêPéãPéÜPéÕPéÎPéÇPéÀPé¹Pé²Pé«Pé¤PéPé–PéPéˆPéPézPésPélPéePé^PéWPéPPéIPéBPé;Pé4Pé-Pé&PéPéPéPé PéPéüOéõOéîOéçOéàOéÙOéÒOéËOéÄOé½Oé¶Oé¯Oé¨Oé¡OéšOé“OéŒOé…Oé~OéwOépOéiOébOé[OéTOéMOéFOé?Oé8Oé1Oé*Oé#OéOéOéOéOéOéùNéòNéëNéäNéÝNéÖNéÏNéÈNéÁNéºNé³Né¬Né¥NéžNé—NéNé‰Né‚Né{NétNémNéfNé_NéXNéQNéJNéCNéJé7Jé0Jé)Jé"JéJéJé JéJéÿIéøIéñIéêIéãIéÜIéÕIéÎIéÇIéÀIé¹Ié²Ié«Ié¤IéIé–IéIéˆIéIézIésIélIéeIé^IéWIéPIéIIéBIé;Ié4Ié-Ié&IéIéIéIé IéIéüHéõHéîHéçHéàHéÙHéÒHéËHéÄHé½Hé¶Hé¯Hé¨Hé¡HéšHé“HéŒHé…Hé~HéwHépHéiHébHé[HéTHéMHéFHé?Hé8Hé1Hé*Hé#HéHéHéHéHéHéùGéòGéëGéäGéÝGéÖGéÏGéÈGéÁGéºGé³Gé¬Gé¥GéžGé—GéGé‰Gé‚Gé{GétGémGéfGé_GéXGéQGéJGéCGéCé7Cé0Cé)Cé"CéCéCé CéCéÿBéøBéñBéêBéãBéÜBéÕBéÎBéÇBéÀBé¹Bé²Bé«Bé¤BéBé–BéBéˆBéBézBésBélBéeBé^BéWBéPBéIBéBBé;Bé4Bé-Bé&BéBéBéBé BéBéüAéõAéîAéçAéàAéÙAéÒAéËAéÄAé½Aé¶Aé¯Aé¨Aé¡AéšAé“AéŒAé…Aé~AéwAépAéiAébAé[AéTAéMAéFAé?Aé8Aé1Aé*Aé#AéAéAéAéAéAéù@éò@éë@éä@éÝ@éÖ@éÏ@éÈ@éÁ@éº@é³@é¬@é¥@éž@é—@é@é‰@é‚@é{@ét@ém@éf@é_@éX@éQ@éJ@éC@é<@é5@é.@é'@é @é@é@é @é@éý?éö?éï?éè?éá?éÚ?éÓ?éÌ?éÅ?é¾?é·?é°?é©?é¢?é›?é”?é?é†?é?éx?éq?éj?éc?é\?éU?éN?éG?é@?é9?é2?é+?é$?é?é?é?é?é?éú>éó>éì>éå>éÞ>é×>éÐ>éÉ>éÂ>é»>é´>é­>é¦>éŸ>é˜>é‘>éŠ>éƒ>é|>éu>én>ég>é`>éY>éR>éK>éD>é=>é6>é/>é(>é!>é>é>é >é>éþ=é÷=éð=éé=éâ=éÛ=éÔ=éÍ=éÆ=é¿=é¸=é±=éª=é£=éœ=é•=éŽ=é‡=é€=éy=ér=ék=éd=é]=éV=éO=éH=éA=é:=é3=é,=é%=é=é=é=é =é=éû<éô<éí<éæ<éß<éØ<éÑ<éÊ<éÃ<é¼<éµ<é®<é§<é <é™<é’<é‹<é„<é}<év<éo<éh<éa<éZ<éS<éL<éE<é><é7<é0<é)<é"<é<é<é <é<éÿ;éø;éñ;éê;éã;éÜ;éÕ;éÎ;éÇ;éÀ;é¹;é²;é«;é¤;é;é–;é;éˆ;é;éz;és;él;ée;é^;éW;éP;éI;éB;é;;é4;é-;é&;é;é;é;é ;é;éü:éõ:éî:éç:éà:éÙ:éÒ:éË:éÄ:é½:é¶:é¯:é¨:é¡:éš:é“:éŒ:é…:é~:éw:ép:éi:éb:é[:éT:éM:éF:é?:é8:é1:é*:é#:é:é:é:é:é:éù9éò9éë9éä9éÝ9éÖ9éÏ9éÈ9éÁ9éº9é³9é¬9é¥9éž9é—9é9é‰9é‚9é{9ét9ém9éf9é_9éX9éQ9éJ9éC9é<9é59é.9é'9é 9é9é9é 9é9éý8éö8éï8éè8éá8éÚ8éÓ8éÌ8éÅ8é¾8é·8é°8é©8é¢8é›8é”8é8é†8é8éx8éq8éj8éc8é\8éU8éN8éG8é@8é98é28é+8é$8é8é8é8é8é8éú7éó7éì7éå7éÞ7é×7éÐ7éÉ7éÂ7é»7é´7é­7é¦7éŸ7é˜7é‘7éŠ7éƒ7é|7éu7én7ég7é`7éY7éR7éK7éD7é=7é67é/7é(7é!7é7é7é 7é7éþ6é÷6éð6éé6éâ6éÛ6éÔ6éÍ6éÆ6é¿6é¸6é±6éª6é£6éœ6é•6éŽ6é‡6é€6éy6ér6ék6éd6é]6éV6éO6éH6éA6é:6é36é,6é%6é6é6é6é 6é6éû5éô5éí5éæ5éß5éØ5éÑ5éÊ5éÃ5é¼5éµ5é®5é§5é 5é™5é’5é‹5é„5é}5év5éo5éh5éa5éZ5éS5éL5éE5é>5é75é05é)5é"5é5é5é 5é5éÿ4éø4éñ4éê4éã4éÜ4éÕ4éÎ4éÇ4éÀ4é¹4é²4é«4é¤4é4é–4é4éˆ4é4éz4és4él4ée4é^4éW4éP4éI4éB4é;4é44é-4é&4é4é4é4é 4é4éü3éõ3éî3éç3éà3éÙ3éÒ3éË3éÄ3é½3é¶3é¯3é¨3é¡3éš3é“3éŒ3é…3é~3éw3ép3éi3éb3é[3éT3éM3éF3é?3é83é13é*3é#3é3é3é3é3é3éù2éò2éë2éä2éÝ2éÖ2éÏ2éÈ2éÁ2éº2é³2é¬2é¥2éž2é—2é2é‰2é‚2é{2ét2ém2éf2é_2éX2éQ2éJ2éC2é<2é52é.2é'2é 2é2é2é 2é2éý1éö1éï1éè1éá1éÚ1éÓ1éÌ1éÅ1é¾1é·1é°1é©1é¢1é›1é”1é1é†1é1éx1éq1éj1éc1é\1éU1éN1éG1é@1é91é21é+1é$1é1é1é1é1é1éú0éó0éì0éå0éÞ0é×0éÐ0éÉ0éÂ0é»0é´0é­0é¦0éŸ0é˜0é‘0éŠ0éƒ0é|0éu0én0ég0é`0éY0éR0éK0éD0é=0é60é/0é(0é!0é0é0é 0é0éþ/é÷/éð/éé/éâ/éÛ/éÔ/éÍ/éÆ/é¿/é¸/é±/éª/é£/éœ/é•/éŽ/é‡/é€/éy/ér/ék/éd/é]/éV/éO/éH/éA/é:/é3/é,/é%/é/é/é/é /é/éû.éô.éí.éæ.éß.éØ.éÑ.éÊ.éÃ.é¼.éµ.é®.é§.é .é™.é’.é‹.é„.é}.év.éo.éh.éa.éZ.éS.éL.éE.é>.é7.é0.é).é".é.é.é .é.éÿ-éø-éñ-éê-éã-éÜ-éÕ-éÎ-éÇ-éÀ-é¹-é²-é«-é¤-é-é–-é-éˆ-é-éz-és-él-ée-é^-éW-éP-éI-éB-é;-é4-é--é&-é-é-é-é -é-éü,éõ,éî,éç,éà,éÙ,éÒ,éË,éÄ,é½,é¶,é¯,é¨,é¡,éš,é“,éŒ,é…,é~,éw,ép,éi,éb,é[,éT,éM,éF,é?,é8,é1,é*,é#,é,é,é,é,é,éù+éò+éë+éä+éÝ+éÖ+éÏ+éÈ+éÁ+éº+é³+é¬+é¥+éž+é—+é+é‰+é‚+é{+ét+ém+éf+é_+éX+éQ+éJ+éC+é<+é5+é.+é'+é +é+é+é +é+éý*éö*éï*éè*éá*éÚ*éÓ*éÌ*éÅ*é¾*é·*é°*é©*é¢*é›*é”*é*é†*é*éx*éq*éj*éc*é\*éU*éN*éG*é@*é9*é2*é+*é$*é*é*é*é*é*éú)éó)éì)éå)éÞ)é×)éÐ)éÉ)éÂ)é»)é´)é­)é¦)éŸ)é˜)é‘)éŠ)éƒ)é|)éu)én)ég)é`)éY)éR)éK)éD)é=)é6)é/)é()é!)é)é)é )é)éþ(é÷(éð(éé(éâ(éÛ(éÔ(éÍ(éÆ(é¿(é¸(é±(éª(é£(éœ(é•(éŽ(é‡(é€(éy(ér(ék(éd(é](éV(éO(éH(éA(é:(é3(é,(é%(é(é(é(é (é(éû'éô'éí'éæ'éß'éØ'éÑ'éÊ'éÃ'é¼'éµ'é®'é§'é 'é™'é’'é‹'é„'é}'év'éo'éh'éa'éZ'éS'éL'éE'é>'é7'é0'é)'é"'é'é'é 'é'éÿ&éø&éñ&éê&éã&éÜ&éÕ&éÎ&éÇ&éÀ&é¹&é²&é«&é¤&é&é–&é&éˆ&é&éz&és&él&ée&é^&éW&éP&éI&éB&é;&é4&é-&é&&é&é&é&é &é&éü%éõ%éî%éç%éà%éÙ%éÒ%éË%éÄ%é½%é¶%é¯%é¨%é¡%éš%é“%éŒ%é…%é~%éw%ép%éi%éb%é[%éT%éM%éF%é?%é8%é1%é*%é#%é%é%é%é%é%éù$éò$éë$éä$éÝ$éÖ$éÏ$éÈ$éÁ$éº$é³$é¬$é¥$éž$é—$é$é‰$é‚$é{$ét$ém$éf$é_$éX$éQ$éJ$éC$é<$é5$é.$é'$é $é$é$é $é$éý#éö#éï#éè#éá#éÚ#éÓ#éÌ#éÅ#é¾#é·#é°#é©#é¢#é›#é”#é#é†#é#éx#éq#éj#éc#é\#éU#éN#éG#é@#é9#é2#é+#é$#é#é#é#é#é#éú"éó"éì"éå"éÞ"é×"éÐ"éÉ"éÂ"é»"é´"é­"é¦"éŸ"é˜"é‘"éŠ"éƒ"é|"éu"én"ég"é`"éY"éR"éK"éD"é="é6"é/"é("é!"é"é"é "é"éþ!é÷!éð!éé!éâ!éÛ!éÔ!éÍ!éÆ!é¿!é¸!é±!éª!é£!éœ!é•!éŽ!é‡!é€!éy!ér!ék!éd!é]!éV!éO!éH!éA!é:!é3!é,!é%!é!é!é!é !é!éû éô éí éæ éß éØ éÑ éÊ éà é¼ éµ é® é§ é  é™ é’ é‹ é„ é} év éo éh éa éZ éS éL éE é> é7 é0 é) é" é é é é éÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééú éó éì éå éÞ é× éÐ éÉ é é» é´ é­ é¦ éŸ é˜ é‘ éŠ éƒ é| éu én ég é` éY éR éK éD é= é6 é/ é( é! é é é é éþ é÷ éð éé éâ éÛ éÔ éÍ éÆ é¿ é¸ é± éª é£ éœ é• éŽ é‡ é€ éy ér ék éd é] éV éO éH éA é: é3 é, é% é é é é é éû éô éí éæ éß éØ éÑ éÊ éà é¼ éµ é® é§ é  é™ é’ é‹ é„ é} év éo éh éa éZ éS éL éE é> é7 é0 é) é" é é é é éÿ éø éñ éê éã éÜ éÕ éÎ éÇ éÀ é¹ é² é« é¤ é é– é éˆ é éz és él ée é^ éW éP éI éB é; é4 é- é& é é é é é éü éõ éî éç éà éÙ éÒ éË éÄ é½ é¶ é¯ é¨ é¡ éš é“ éŒ é… é~ éw ép éi éb é[ éT éM éF é? é8 é1 é* é# é é é é é éùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúÿèóÿèìÿèåÿèÞÿè×ÿèÐÿèÉÿèÂÿè»ÿè´ÿè­ÿè¦ÿèŸÿè˜ÿè‘ÿèŠÿèƒÿè|ÿèuÿènÿègÿè`ÿèYÿèRÿèKÿèDÿè=ÿè6ÿè/ÿè(ÿè!ÿèÿèÿè ÿèÿèþþè÷þèðþèéþèâþèÛþèÔþèÍþèÆþè¿þè¸þè±þèªþè£þèœþè•þèŽþè‡þè€þèyþèrþèkþèdþè]þèVþèOþèHþèAþè:þè3þè,þè%þèþèþèþè þèþèûýèôýèíýèæýèßýèØýèÑýèÊýèÃýè¼ýèµýè®ýè§ýè ýè™ýè’ýè‹ýè„ýè}ýèvýèoýèhýèaýèZýèSýèLýèEýè>ýè7ýè0ýè)ýè"ýèýèýè ýèýèÿüèøüèñüèêüèãüèÜüèÕüèÎüèÇüèÀüè¹üè²üè«üè¤üèüè–üèüèˆüèüèzüèsüèlüèeüè^üèWüèPüèIüèBüè;üè4üè-üè&üèüèüèüè üèüèüûèõûèîûèçûèàûèÙûèÒûèËûèÄûè½ûè¶ûè¯ûè¨ûè¡ûèšûè“ûèŒûè…ûè~ûèwûèpûèiûèbûè[ûèTûèMûèFûè?ûè8ûè1ûè*ûè#ûèûèûèûèûèûèùúèòúèëúèäúèÝúèÖúèÏúèÈúèÁúèºúè³úè¬úè¥úèžúè—úèúè‰úè‚úè{úètúèmúèfúè_úèXúèQúèJúèCúè<úè5úè.úè'úè úèúèúè úèúèýùèöùèïùèèùèáùèÚùèÓùèÌùèÅùè¾ùè·ùè°ùè©ùè¢ùè›ùè”ùèùè†ùèùèxùèqùèjùècùè\ùèUùèNùèGùè@ùè9ùè2ùè+ùè$ùèùèùèùèùèùèúøèóøèìøèåøèÞøè×øèÐøèÉøèÂøè»øè´øè­øè¦øèŸøè˜øè‘øèŠøèƒøè|øèuøènøègøè`øèYøèRøèKøèDøè=øè6øè/øè(øè!øèøèøè øèøèþ÷è÷÷èð÷èé÷èâ÷èÛ÷èÔ÷èÍ÷èÆ÷è¿÷è¸÷è±÷èª÷è£÷èœ÷è•÷èŽ÷è‡÷è€÷èy÷èr÷èk÷èd÷è]÷èV÷èO÷èH÷èA÷è:÷è3÷è,÷è%÷è÷è÷è÷è ÷è÷èûöèôöèíöèæöèßöèØöèÑöèÊöèÃöè¼öèµöè®öè§öè öè™öè’öè‹öè„öè}öèvöèoöèhöèaöèZöèSöèLöèEöè>öè7öè0öè)öè"öèöèöè öèöèÿõèøõèñõèêõèãõèÜõèÕõèÎõèÇõèÀõè¹õè²õè«õè¤õèõè–õèõèˆõèõèzõèsõèlõèeõè^õèWõèPõèIõèBõè;õè4õè-õè&õèõèõèõè õèõèüôèõôèîôèçôèàôèÙôèÒôèËôèÄôè½ôè¶ôè¯ôè¨ôè¡ôèšôè“ôèŒôè…ôè~ôèwôèpôèiôèbôè[ôèTôèMôèFôè?ôè8ôè1ôè*ôè#ôèôèôèôèôèôèùóèòóèëóèäóèÝóèÖóèÏóèÈóèÁóèºóè³óè¬óè¥óèžóè—óèóè‰óè‚óè{óètóèmóèfóè_óèXóèQóèJóèCóè<óè5óè.óè'óè óèóèóè óèóèýòèöòèïòèèòèáòèÚòèÓòèÌòèÅòè¾òè·òè°òè©òè¢òè›òè”òèòè†òèòèxòèqòèjòècòè\òèUòèNòèGòè@òè9òè2òè+òè$òèòèòèòèòèòèúñèóñèìñèåñèÞñè×ñèÐñèÉñèÂñè»ñè´ñè­ñè¦ñèŸñè˜ñè‘ñèŠñèƒñè|ñèuñènñègñè`ñèYñèRñèKñèDñè=ñè6ñè/ñè(ñè!ñèñèñè ñèñèþðè÷ðèððèéðèâðèÛðèÔðèÍðèÆðè¿ðè¸ðè±ðèªðè£ðèœðè•ðèŽðè‡ðè€ðèyðèrðèkðèdðè]ðèVðèOðèHðèAðè:ðè3ðè,ðè%ðèðèðèðè ðèðèûïèôïèíïèæïèßïèØïèÑïèÊïèÃïè¼ïèµïè®ïè§ïè ïè™ïè’ïè‹ïè„ïè}ïèvïèoïèhïèaïèZïèSïèLïèEïè>ïè7ïè0ïè)ïè"ïèïèïè ïèïèÿîèøîèñîèêîèãîèÜîèÕîèÎîèÇîèÀîè¹îè²îè«îè¤îèîè–îèîèˆîèîèzîèsîèlîèeîè^îèWîèPîèIîèBîè;îè4îè-îè&îèîèîèîè îèîèüíèõíèîíèçíèàíèÙíèÒíèËíèÄíè½íè¶íè¯íè¨íè¡íèšíè“íèŒíè…íè~íèwíèpíèiíèbíè[íèTíèMíèFíè?íè8íè1íè*íè#íèíèíèíèíèíèùìèòìèëìèäìèÝìèÖìèÏìèÈìèÁìèºìè³ìè¬ìè¥ìèžìè—ìèìè‰ìè‚ìè{ìètìèmìèfìè_ìèXìèQìèJìèCìè<ìè5ìè.ìè'ìè ìèìèìè ìèìèýëèöëèïëèèëèáëèÚëèÓëèÌëèÅëè¾ëè·ëè°ëè©ëè¢ëè›ëè”ëèëè†ëèëèxëèqëèjëècëè\ëèUëèNëèGëè@ëè9ëè2ëè+ëè$ëèëèëèëèëèëèúêèóêèìêèåêèÞêè×êèÐêèÉêèÂêè»êè´êè­êè¦êèŸêè˜êè‘êèŠêèƒêè|êèuêènêègêè`êèYêèRêèKêèDêè=êè6êè/êè(êè!êèêèêè êèêèþéè÷éèðéèééèâéèÛéèÔéèÍéèÆéè¿éè¸éè±éèªéè£éèœéè•éèŽéè‡éè€éèyéèréèkéèdéè]éèVéèOéèHéèAéè:éè3éè,éè%éèéèéèéè éèéèûèèôèèíèèæèèßèèØèèÑèèÊèèÃèè¼èèµèè®èè§èè èè™èè’èè‹èè„èè}èèvèèoèèhèèaèèZèèSèèLèèEèè>èè7èè0èè)èè"èèèèèè èèèèÿçèøçèñçèêçèãçèÜçèÕçèÎçèÇçèÀçè¹çè²çè«çè¤çèçè–çèçèˆçèçèzçèsçèlçèeçè^çèWçèPçèIçèBçè;çè4çè-çè&çèçèçèçè çèçèüæèõæèîæèçæèàæèÙæèÒæèËæèÄæè½æè¶æè¯æè¨æè¡æèšæè“æèŒæè…æè~æèwæèpæèiæèbæè[æèTæèMæèFæè?æè8æè1æè*æè#æèæèæèæèæèæèùåèòåèëåèäåèÝåèÖåèÏåèÈåèÁåèºåè³åè¬åè¥åèžåè—åèåè‰åè‚åè{åètåèmåèfåè_åèXåèQåèJåèCåè<åè5åè.åè'åè åèåèåè åèåèýäèöäèïäèèäèáäèÚäèÓäèÌäèÅäè¾äè·äè°äè©äè¢äè›äè”äèäè†äèäèxäèqäèjäècäè\äèUäèNäèGäè@äè9äè2äè+äè$äèäèäèäèäèäèúãèóãèìãèåãèÞãè×ãèÐãèÉãèÂãè»ãè´ãè­ãè¦ãèŸãè˜ãè‘ãèŠãèƒãè|ãèuãènãègãè`ãèYãèRãèKãèDãè=ãè6ãè/ãè(ãè!ãèãèãè ãèãèþâè÷âèðâèéâèââèÛâèÔâèÍâèÆâè¿âè¸âè±âèªâè£âèœâè•âèŽâè‡âè€âèyâèrâèkâèdâè]âèVâèOâèHâèAâè:âè3âè,âè%âèâèâèâè âèâèûáèôáèíáèæáèßáèØáèÑáèÊáèÃáè¼áèµáè®áè§áè áè™áè’áè‹áè„áè}áèváèoáèháèaáèZáèSáèLáèEáè>áè7áè0áè)áè"áèáèáè áèáèÿàèøàèñàèêàèãàèÜàèÕàèÎàèÇàèÀàè¹àè²àè«àè¤àèàè–àèàèˆàèàèzàèsàèlàèeàè^àèWàèPàèIàèBàè;àè4àè-àè&àèàèàèàè àèàèüßèõßèîßèçßèàßèÙßèÒßèËßèÄßè½ßè¶ßè¯ßè¨ßè¡ßèšßè“ßèŒßè…ßè~ßèwßèpßèißèbßè[ßèTßèMßèFßè?ßè8ßè1ßè*ßè#ßèßèßèßèßèßèùÞèòÞèëÞèäÞèÝÞèÖÞèÏÞèÈÞèÁÞèºÞè³Þè¬Þè¥ÞèžÞè—ÞèÞè‰Þè‚Þè{ÞètÞèmÞèfÞè_ÞèXÞèQÞèJÞèCÞè<Þè5Þè.Þè'Þè ÞèÞèÞè ÞèÞèýÝèöÝèïÝèèÝèáÝèÚÝèÓÝèÌÝèÅÝè¾Ýè·Ýè°Ýè©Ýè¢Ýè›Ýè”ÝèÝè†ÝèÝèxÝèqÝèjÝècÝè\ÝèUÝèNÝèGÝè@Ýè9Ýè2Ýè+Ýè$ÝèÝèÝèÝèÝèÝèúÜèóÜèìÜèåÜèÞÜè×ÜèÐÜèÉÜèÂÜè»Üè´Üè­Üè¦ÜèŸÜè˜Üè‘ÜèŠÜèƒÜè|ÜèuÜènÜègÜè`ÜèYÜèRÜèKÜèDÜè=Üè6Üè/Üè(Üè!ÜèÜèÜè ÜèÜèþÛè÷ÛèðÛèéÛèâÛèÛÛèÔÛèÍÛèÆÛè¿Ûè¸Ûè±ÛèªÛè£ÛèœÛè•ÛèŽÛè‡Ûè€ÛèyÛèrÛèkÛèdÛè]ÛèVÛèOÛèHÛèAÛè:Ûè3Ûè,Ûè%ÛèÛèÛèÛè ÛèÛèûÚèôÚèíÚèæÚèßÚèØÚèÑÚèÊÚèÃÚè¼ÚèµÚè®Úè§Úè Úè™Úè’Úè‹Úè„Úè}ÚèvÚèoÚèhÚèaÚèZÚèSÚèLÚèEÚè>Úè7Úè0Úè)Úè"ÚèÚèÚè ÚèÚèÿÙèøÙèñÙèêÙèãÙèÜÙèÕÙèÎÙèÇÙèÀÙè¹Ùè²Ùè«Ùè¤ÙèÙè–ÙèÙèˆÙèÙèzÙèsÙèlÙèeÙè^ÙèWÙèPÙèIÙèBÙè;Ùè4Ùè-Ùè&ÙèÙèÙèÙè ÙèÙèüØèõØèîØèçØèàØèÙØèÒØèËØèÄØè½Øè¶Øè¯Øè¨Øè¡ØèšØè“ØèŒØè…Øè~ØèwØèpØèiØèbØè[ØèTØèMØèFØè?Øè8Øè1Øè*Øè#ØèØèØèØèØèØèù×èò×èë×èä×èÝ×èÖ×èÏ×èÈ×èÁ×èº×è³×è¬×è¥×èž×è—×è×è‰×è‚×è{×èt×èm×èf×è_×èX×èQ×èJ×èC×è<×è5×è.×è'×è ×è×è×è ×è×èýÖèöÖèïÖèèÖèáÖèÚÖèÓÖèÌÖèÅÖè¾Öè·Öè°Öè©Öè¢Öè›Öè”ÖèÖè†ÖèÖèxÖèqÖèjÖècÖè\ÖèUÖèNÖèGÖè@Öè9Öè2Öè+Öè$ÖèÖèÖèÖèÖèÖèúÕèóÕèìÕèåÕèÞÕè×ÕèÐÕèÉÕèÂÕè»Õè´Õè­Õè¦ÕèŸÕè˜Õè‘ÕèŠÕèƒÕè|ÕèuÕènÕègÕè`ÕèYÕèRÕèKÕèDÕè=Õè6Õè/Õè(Õè!ÕèÕèÕè ÕèÕèþÔè÷ÔèðÔèéÔèâÔèÛÔèÔÔèÍÔèÆÔè¿Ôè¸Ôè±ÔèªÔè£ÔèœÔè•ÔèŽÔè‡Ôè€ÔèyÔèrÔèkÔèdÔè]ÔèVÔèOÔèHÔèAÔè:Ôè3Ôè,Ôè%ÔèÔèÔèÔè ÔèÔèûÓèôÓèíÓèæÓèßÓèØÓèÑÓèÊÓèÃÓè¼ÓèµÓè®Óè§Óè Óè™Óè’Óè‹Óè„Óè}ÓèvÓèoÓèhÓèaÓèZÓèSÓèLÓèEÓè>Óè7Óè0Óè)Óè"ÓèÓèÓè ÓèÓèÿÒèøÒèñÒèêÒèãÒèÜÒèÕÒèÎÒèÇÒèÀÒè¹Òè²Òè«Òè¤ÒèÒè–ÒèÒèˆÒèÒèzÒèsÒèlÒèeÒè^ÒèWÒèPÒèIÒèBÒè;Òè4Òè-Òè&ÒèÒèÒèÒè ÒèÒèüÑèõÑèîÑèçÑèàÑèÙÑèÒÑèËÑèÄÑè½Ñè¶Ñè¯Ñè¨Ñè¡ÑèšÑè“ÑèŒÑè…Ñè~ÑèwÑèpÑèiÑèbÑè[ÑèTÑèMÑèFÑè?Ñè8Ñè1Ñè*Ñè#ÑèÑèÑèÑèÑèÑèùÐèòÐèëÐèäÐèÝÐèÖÐèÏÐèÈÐèÁÐèºÐè³Ðè¬Ðè¥ÐèžÐè—ÐèÐè‰Ðè‚Ðè{ÐètÐèmÐèfÐè_ÐèXÐèQÐèJÐèCÐè<Ðè5Ðè.Ðè'Ðè ÐèÐèÐè ÐèÐèýÏèöÏèïÏèèÏèáÏèÚÏèÓÏèÌÏèÅÏè¾Ïè·Ïè°Ïè©Ïè¢Ïè›Ïè”ÏèÏè†ÏèÏèxÏèqÏèjÏècÏè\ÏèUÏèNÏèGÏè@Ïè9Ïè2Ïè+Ïè$ÏèÏèÏèÏèÏèÏèúÎèóÎèìÎèåÎèÞÎè×ÎèÐÎèÉÎèÂÎè»Îè´Îè­Îè¦ÎèŸÎè˜Îè‘ÎèŠÎèƒÎè|ÎèuÎènÎègÎè`ÎèYÎèRÎèKÎèDÎè=Îè6Îè/Îè(Îè!ÎèÎèÎè ÎèÎèþÍè÷ÍèðÍèéÍèâÍèÛÍèÔÍèÍÍèÆÍè¿Íè¸Íè±ÍèªÍè£ÍèœÍè•ÍèŽÍè‡Íè€ÍèyÍèrÍèkÍèdÍè]ÍèVÍèOÍèHÍèAÍè:Íè3Íè,Íè%ÍèÍèÍèÍè ÍèÍèûÌèôÌèíÌèæÌèßÌèØÌèÑÌèÊÌèÃÌè¼ÌèµÌè®Ìè§Ìè Ìè™Ìè’Ìè‹Ìè„Ìè}ÌèvÌèoÌèhÌèaÌèZÌèSÌèLÌèEÌè>Ìè7Ìè0Ìè)Ìè"ÌèÌèÌè ÌèÌèÿËèøËèñËèêËèãËèÜËèÕËèÎËèÇËèÀËè¹Ëè²Ëè«Ëè¤ËèËè–ËèËèˆËèËèzËèsËèlËèeËè^ËèWËèPËèIËèBËè;Ëè4Ëè-Ëè&ËèËèËèËè ËèËèüÊèõÊèîÊèçÊèàÊèÙÊèÒÊèËÊèÄÊè½Êè¶Êè¯Êè¨Êè¡ÊèšÊè“ÊèŒÊè…Êè~ÊèwÊèpÊèiÊèbÊè[ÊèTÊèMÊèFÊè?Êè8Êè1Êè*Êè#ÊèÊèÊèÊèÊèÊèùÉèòÉèëÉèäÉèÝÉèÖÉèÏÉèÈÉèÁÉèºÉè³Éè¬Éè¥ÉèžÉè—ÉèÉè‰Éè‚Éè{ÉètÉèmÉèfÉè_ÉèXÉèQÉèJÉèCÉè<Éè5Éè.Éè'Éè ÉèÉèÉè ÉèÉèýÈèöÈèïÈèèÈèáÈèÚÈèÓÈèÌÈèÅÈè¾Èè·Èè°Èè©Èè¢Èè›Èè”ÈèÈè†ÈèÈèxÈèqÈèjÈècÈè\ÈèUÈèNÈèGÈè@Èè9Èè2Èè+Èè$ÈèÈèÈèÈèÈèÈèúÇèóÇèìÇèåÇèÞÇè×ÇèÐÇèÉÇèÂÇè»Çè´Çè­Çè¦ÇèŸÇè˜Çè‘ÇèŠÇèƒÇè|ÇèuÇènÇègÇè`ÇèYÇèRÇèKÇèDÇè=Çè6Çè/Çè(Çè!ÇèÇèÇè ÇèÇèþÆè÷ÆèðÆèéÆèâÆèÛÆèÔÆèÍÆèÆÆè¿Æè¸Æè±ÆèªÆè£ÆèœÆè•ÆèŽÆè‡Æè€ÆèyÆèrÆèkÆèdÆè]ÆèVÆèOÆèHÆèAÆè:Æè3Æè,Æè%ÆèÆèÆèÆè ÆèÆèûÅèôÅèíÅèæÅèßÅèØÅèÑÅèÊÅèÃÅè¼ÅèµÅè®Åè§Åè Åè™Åè’Åè‹Åè„Åè}ÅèvÅèoÅèhÅèaÅèZÅèSÅèLÅèEÅè>Åè7Åè0Åè)Åè"ÅèÅèÅè ÅèÅèÿÄèøÄèñÄèêÄèãÄèÜÄèÕÄèÎÄèÇÄèÀÄè¹Äè²Äè«Äè¤ÄèÄè–ÄèÄèˆÄèÄèzÄèsÄèlÄèeÄè^ÄèWÄèPÄèIÄèBÄè;Äè4Äè-Äè&ÄèÄèÄèÄè ÄèÄèüÃèõÃèîÃèçÃèàÃèÙÃèÒÃèËÃèÄÃè½Ãè¶Ãè¯Ãè¨Ãè¡ÃèšÃè“ÃèŒÃè…Ãè~ÃèwÃèpÃèiÃèbÃè[ÃèTÃèMÃèFÃè?Ãè8Ãè1Ãè*Ãè#ÃèÃèÃèÃèÃèÃèùÂèòÂèëÂèäÂèÝÂèÖÂèÏÂèÈÂèÁÂèºÂè³Âè¬Âè¥ÂèžÂè—ÂèÂè‰Âè‚Âè{ÂètÂèmÂèfÂè_ÂèXÂèQÂèJÂèCÂè<Âè5Âè.Âè'Âè ÂèÂèÂè ÂèÂèýÁèöÁèïÁèèÁèáÁèÚÁèÓÁèÌÁèÅÁè¾Áè·Áè°Áè©Áè¢Áè›Áè”ÁèÁè†ÁèÁèxÁèqÁèjÁècÁè\ÁèUÁèNÁèGÁè@Áè9Áè2Áè+Áè$ÁèÁèÁèÁèÁèÁèúÀèóÀèìÀèåÀèÞÀè×ÀèÐÀèÉÀèÂÀè»Àè´Àè­Àè¦ÀèŸÀè˜Àè‘ÀèŠÀèƒÀè|ÀèuÀènÀègÀè`ÀèYÀèRÀèKÀèDÀè=Àè6Àè/Àè(Àè!ÀèÀèÀè ÀèÀèþ¿è÷¿èð¿èé¿èâ¿èÛ¿èÔ¿èÍ¿èÆ¿è¿¿è¸¿è±¿èª¿è£¿èœ¿è•¿èŽ¿è‡¿è€¿èy¿èr¿èk¿èd¿è]¿èV¿èO¿èH¿èA¿è:¿è3¿è,¿è%¿è¿è¿è¿è ¿è¿èû¾èô¾èí¾èæ¾èß¾èؾèѾèʾèþ輾赾设觾蠾虾蒾苾脾è}¾èv¾èo¾èh¾èa¾èZ¾èS¾èL¾èE¾è>¾è7¾è0¾è)¾è"¾è¾è¾è ¾è¾èÿ½èø½èñ½èê½èã½èܽèÕ½èνèǽèÀ½è¹½è²½è«½è¤½è½è–½è½èˆ½è½èz½ès½èl½èe½è^½èW½èP½èI½èB½è;½è4½è-½è&½è½è½è½è ½è½èü¼èõ¼èî¼èç¼èà¼èÙ¼èÒ¼è˼èļ轼趼诼証衼蚼蓼茼腼è~¼èw¼èp¼èi¼èb¼è[¼èT¼èM¼èF¼è?¼è8¼è1¼è*¼è#¼è¼è¼è¼è¼è¼èù»èò»èë»èä»èÝ»èÖ»èÏ»èÈ»èÁ»èº»è³»è¬»è¥»èž»è—»è»è‰»è‚»è{»èt»èm»èf»è_»èX»èQ»èJ»èC»è<»è5»è.»è'»è »è»è»è »è»èýºèöºèïºèèºèáºèÚºèÓºè̺èźè¾ºè·ºè°ºè©ºè¢ºè›ºè”ºèºè†ºèºèxºèqºèjºècºè\ºèUºèNºèGºè@ºè9ºè2ºè+ºè$ºèºèºèºèºèºèú¹èó¹èì¹èå¹èÞ¹è×¹èйèɹè¹è»¹è´¹è­¹è¦¹èŸ¹è˜¹è‘¹èй胹è|¹èu¹èn¹èg¹è`¹èY¹èR¹èK¹èD¹è=¹è6¹è/¹è(¹è!¹è¹è¹è ¹è¹èþ¸è÷¸èð¸èé¸èâ¸èÛ¸èÔ¸è͸èƸ迸踸豸誸裸蜸蕸èޏ臸耸èy¸èr¸èk¸èd¸è]¸èV¸èO¸èH¸èA¸è:¸è3¸è,¸è%¸è¸è¸è¸è ¸è¸èû·èô·èí·èæ·èß·èØ·èÑ·èÊ·è÷è¼·èµ·è®·è§·è ·è™·è’·è‹·è„·è}·èv·èo·èh·èa·èZ·èS·èL·èE·è>·è7·è0·è)·è"·è·è·è ·è·èÿ¶èø¶èñ¶èê¶èã¶èܶèÕ¶èζèǶèÀ¶è¹¶è²¶è«¶è¤¶è¶è–¶è¶èˆ¶è¶èz¶ès¶èl¶èe¶è^¶èW¶èP¶èI¶èB¶è;¶è4¶è-¶è&¶è¶è¶è¶è ¶è¶èüµèõµèîµèçµèàµèÙµèÒµè˵èĵ轵趵诵訵衵蚵蓵茵腵è~µèwµèpµèiµèbµè[µèTµèMµèFµè?µè8µè1µè*µè#µèµèµèµèµèµèù´èò´èë´èä´èÝ´èÖ´èÏ´èÈ´èÁ´èº´è³´è¬´è¥´èž´è—´è´è‰´è‚´è{´èt´èm´èf´è_´èX´èQ´èJ´èC´è<´è5´è.´è'´è ´è´è´è ´è´èý³èö³èï³èè³èá³èÚ³èÓ³è̳èų辳跳谳詳袳蛳蔳è³è†³è³èx³èq³èj³èc³è\³èU³èN³èG³è@³è9³è2³è+³è$³è³è³è³è³è³èú²èó²èì²èå²èÞ²èײèвèɲè²è»²è´²è­²è¦²èŸ²è˜²è‘²èв胲è|²èu²èn²èg²è`²èY²èR²èK²èD²è=²è6²è/²è(²è!²è²è²è ²è²èþ±è÷±èð±èé±èâ±èÛ±èÔ±èͱèƱ迱踱豱誱裱蜱蕱èޱ臱耱èy±èr±èk±èd±è]±èV±èO±èH±èA±è:±è3±è,±è%±è±è±è±è ±è±èû°èô°èí°èæ°èß°èذèѰèʰèðè¼°èµ°è®°è§°è °è™°è’°è‹°è„°è}°èv°èo°èh°èa°èZ°èS°èL°èE°è>°è7°è0°è)°è"°è°è°è °è°èÿ¯èø¯èñ¯èê¯èã¯èܯèÕ¯èίèǯèÀ¯è¹¯è²¯è«¯è¤¯è¯è–¯è¯èˆ¯è¯èz¯ès¯èl¯èe¯è^¯èW¯èP¯èI¯èB¯è;¯è4¯è-¯è&¯è¯è¯è¯è ¯è¯èü®èõ®èî®èç®èà®èÙ®èÒ®èË®èĮ轮趮诮訮衮蚮蓮茮腮è~®èw®èp®èi®èb®è[®èT®èM®èF®è?®è8®è1®è*®è#®è®è®è®è®è®èù­èò­èë­èä­èÝ­èÖ­èÏ­èÈ­èÁ­èº­è³­è¬­è¥­èž­è—­è­è‰­è‚­è{­èt­èm­èf­è_­èX­èQ­èJ­èC­è<­è5­è.­è'­è ­è­è­è ­è­èý¬èö¬èï¬èè¬èá¬èÚ¬èÓ¬è̬èŬ辬跬谬詬袬蛬蔬è¬è†¬è¬èx¬èq¬èj¬èc¬è\¬èU¬èN¬èG¬è@¬è9¬è2¬è+¬è$¬è¬è¬è¬è¬è¬èú«èó«èì«èå«èÞ«è׫èЫèÉ«è«è»«è´«è­«è¦«èŸ«è˜«è‘«èŠ«èƒ«è|«èu«èn«èg«è`«èY«èR«èK«èD«è=«è6«è/«è(«è!«è«è«è «è«èþªè÷ªèðªèéªèâªèÛªèÔªèͪèƪ迪踪豪說裪蜪蕪莪自耪èyªèrªèkªèdªè]ªèVªèOªèHªèAªè:ªè3ªè,ªè%ªèªèªèªè ªèªèû©èô©èí©èæ©èß©èØ©èÑ©èÊ©èé輩赩让觩蠩虩蒩苩脩è}©èv©èo©èh©èa©èZ©èS©èL©èE©è>©è7©è0©è)©è"©è©è©è ©è©èÿ¨èø¨èñ¨èê¨èã¨èܨèÕ¨èΨèǨèÀ¨è¹¨è²¨è«¨è¤¨è¨è–¨è¨èˆ¨è¨èz¨ès¨èl¨èe¨è^¨èW¨èP¨èI¨èB¨è;¨è4¨è-¨è&¨è¨è¨è¨è ¨è¨èü§èõ§èî§èç§èà§èÙ§èÒ§è˧èħ轧趧诧訧衧蚧蓧茧腧è~§èw§èp§èi§èb§è[§èT§èM§èF§è?§è8§è1§è*§è#§è§è§è§è§è§èù¦èò¦èë¦èä¦èݦèÖ¦èϦèȦèÁ¦èº¦è³¦è¬¦è¥¦èž¦è—¦è¦è‰¦è‚¦è{¦èt¦èm¦èf¦è_¦èX¦èQ¦èJ¦èC¦è<¦è5¦è.¦è'¦è ¦è¦è¦è ¦è¦èý¥èö¥èï¥èè¥èá¥èÚ¥èÓ¥èÌ¥èť辥跥谥詥袥蛥蔥è¥è†¥è¥èx¥èq¥èj¥èc¥è\¥èU¥èN¥èG¥è@¥è9¥è2¥è+¥è$¥è¥è¥è¥è¥è¥èú¤èó¤èì¤èå¤èÞ¤èפèФèɤè¤è»¤è´¤è­¤è¦¤èŸ¤è˜¤è‘¤èФ胤è|¤èu¤èn¤èg¤è`¤èY¤èR¤èK¤èD¤è=¤è6¤è/¤è(¤è!¤è¤è¤è ¤è¤èþ£è÷£èð£èé£èâ£èÛ£èÔ£èÍ£èÆ£è¿£è¸£è±£èª£è££èœ£è•£èŽ£è‡£è€£èy£èr£èk£èd£è]£èV£èO£èH£èA£è:£è3£è,£è%£è£è£è£è £è£èû¢èô¢èí¢èæ¢èߢèØ¢èÑ¢èÊ¢èâ輢赢订觢蠢虢蒢苢脢è}¢èv¢èo¢èh¢èa¢èZ¢èS¢èL¢èE¢è>¢è7¢è0¢è)¢è"¢è¢è¢è ¢è¢èÿ¡èø¡èñ¡èê¡èã¡èÜ¡èÕ¡èΡèÇ¡èÀ¡è¹¡è²¡è«¡è¤¡è¡è–¡è¡èˆ¡è¡èz¡ès¡èl¡èe¡è^¡èW¡èP¡èI¡èB¡è;¡è4¡è-¡è&¡è¡è¡è¡è ¡è¡èü èõ èî èç èà èÙ èÒ èË èĠ轠趠诠訠衠蚠蓠茠腠è~ èw èp èi èb è[ èT èM èF è? è8 è1 è* è# è è è è è èùŸèòŸèëŸèäŸèÝŸèÖŸèÏŸèÈŸèÁŸèºŸè³Ÿè¬Ÿè¥ŸèžŸè—ŸèŸè‰Ÿè‚Ÿè{ŸètŸèmŸèfŸè_ŸèXŸèQŸèJŸèCŸè<Ÿè5Ÿè.Ÿè'Ÿè ŸèŸèŸè ŸèŸèýžèöžèïžèèžèážèÚžèÓžèÌžèŞ辞跞谞詞袞蛞蔞èžè†žèžèxžèqžèjžècžè\žèUžèNžèGžè@žè9žè2žè+žè$žèžèžèžèžèžèúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþœè÷œèðœèéœèâœèÛœèÔœèÍœèÆœè¿œè¸œè±œèªœè£œèœœè•œèŽœè‡œè€œèyœèrœèkœèdœè]œèVœèOœèHœèAœè:œè3œè,œè%œèœèœèœè œèœèû›èô›èí›èæ›èß›èØ›èÑ›èÊ›èÛ輛赛讛觛蠛虛蒛苛脛è}›èv›èo›èh›èa›èZ›èS›èL›èE›è>›è7›è0›è)›è"›è›è›è ›è›èÿšèøšèñšèêšèãšèÜšèÕšèΚèÇšèÀšè¹šè²šè«šè¤šèšè–šèšèˆšèšèzšèsšèlšèešè^šèWšèPšèIšèBšè;šè4šè-šè&šèšèšèšè šèšèü™èõ™èî™èç™èà™èÙ™èÒ™èË™èę轙趙诙訙衙蚙蓙茙腙è~™èw™èp™èi™èb™è[™èT™èM™èF™è?™è8™è1™è*™è#™è™è™è™è™è™èù˜èò˜èë˜èä˜èݘèÖ˜èϘèȘèÁ˜èº˜è³˜è¬˜è¥˜èž˜è—˜è˜è‰˜è‚˜è{˜èt˜èm˜èf˜è_˜èX˜èQ˜èJ˜èC˜è<˜è5˜è.˜è'˜è ˜è˜è˜è ˜è˜èý—èö—èï—èè—èá—èÚ—èÓ—èÌ—èŗ辗跗谗詗袗蛗蔗è—膗è—èx—èq—èj—èc—è\—èU—èN—èG—è@—è9—è2—è+—è$—è—è—è—è—è—èú–èó–èì–èå–èÞ–è×–èЖèÉ–è–軖贖譖視蟖蘖葖芖胖è|–èu–èn–èg–è`–èY–èR–èK–èD–è=–è6–è/–è(–è!–è–è–è –è–èþ•è÷•èð•èé•èâ•èÛ•èÔ•èÍ•èÆ•è¿•è¸•è±•èª•è£•èœ•è••èŽ•è‡•è€•èy•èr•èk•èd•è]•èV•èO•èH•èA•è:•è3•è,•è%•è•è•è•è •è•èû”èô”èí”èæ”èß”èØ”èÑ”èÊ”èÔ輔赔讔觔蠔虔蒔苔脔è}”èv”èo”èh”èa”èZ”èS”èL”èE”è>”è7”è0”è)”è"”è”è”è ”è”èÿ“èø“èñ“èê“èã“èÜ“èÕ“èΓèÇ“èÀ“蹓貓諓褓è“è–“è“舓è“èz“ès“èl“èe“è^“èW“èP“èI“èB“è;“è4“è-“è&“è“è“è“è “è“èü’èõ’èî’èç’èà’èÙ’èÒ’èË’èĒ轒趒诒訒衒蚒蓒茒腒è~’èw’èp’èi’èb’è[’èT’èM’èF’è?’è8’è1’è*’è#’è’è’è’è’è’èù‘èò‘èë‘èä‘èÝ‘èÖ‘èÏ‘èÈ‘èÁ‘躑賑謑襑螑藑è‘艑肑è{‘èt‘èm‘èf‘è_‘èX‘èQ‘èJ‘èC‘è<‘è5‘è.‘è'‘è ‘è‘è‘è ‘è‘èýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþŽè÷ŽèðŽèéŽèâŽèÛŽèÔŽèÍŽèÆŽè¿Žè¸Žè±ŽèªŽè£ŽèœŽè•ŽèŽŽè‡Žè€ŽèyŽèrŽèkŽèdŽè]ŽèVŽèOŽèHŽèAŽè:Žè3Žè,Žè%ŽèŽèŽèŽè ŽèŽèûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿŒèøŒèñŒèêŒèãŒèÜŒèÕŒèÎŒèÇŒèÀŒè¹Œè²Œè«Œè¤ŒèŒè–ŒèŒèˆŒèŒèzŒèsŒèlŒèeŒè^ŒèWŒèPŒèIŒèBŒè;Œè4Œè-Œè&ŒèŒèŒèŒè ŒèŒèü‹èõ‹èî‹èç‹èà‹èÙ‹èÒ‹èË‹èċ轋趋诋訋衋蚋蓋茋腋è~‹èw‹èp‹èi‹èb‹è[‹èT‹èM‹èF‹è?‹è8‹è1‹è*‹è#‹è‹è‹è‹è‹è‹èùŠèòŠèëŠèäŠèÝŠèÖŠèÏŠèÈŠèÁŠèºŠè³Šè¬Šè¥ŠèžŠè—ŠèŠè‰Šè‚Šè{ŠètŠèmŠèfŠè_ŠèXŠèQŠèJŠèCŠè<Šè5Šè.Šè'Šè ŠèŠèŠè ŠèŠèý‰èö‰èï‰èè‰èá‰èÚ‰èÓ‰è̉èʼn辉跉谉詉袉蛉蔉è‰è†‰è‰èx‰èq‰èj‰èc‰è\‰èU‰èN‰èG‰è@‰è9‰è2‰è+‰è$‰è‰è‰è‰è‰è‰èúˆèóˆèìˆèåˆèÞˆè׈èЈèɈèˆè»ˆè´ˆè­ˆè¦ˆèŸˆè˜ˆè‘ˆèŠˆèƒˆè|ˆèuˆènˆègˆè`ˆèYˆèRˆèKˆèDˆè=ˆè6ˆè/ˆè(ˆè!ˆèˆèˆè ˆèˆèþ‡è÷‡èð‡èé‡èâ‡èÛ‡èÔ‡è͇èƇ过踇豇誇裇蜇蕇èއ臇耇èy‡èr‡èk‡èd‡è]‡èV‡èO‡èH‡èA‡è:‡è3‡è,‡è%‡è‡è‡è‡è ‡è‡èû†èô†èí†èæ†è߆è؆èцèʆèÆè¼†èµ†è®†è§†è †è™†è’†è‹†è„†è}†èv†èo†èh†èa†èZ†èS†èL†èE†è>†è7†è0†è)†è"†è†è†è †è†èÿ…èø…èñ…èê…èã…èÜ…èÕ…èÎ…èÇ…èÀ…蹅貅諅褅è…è–…è…舅è…èz…ès…èl…èe…è^…èW…èP…èI…èB…è;…è4…è-…è&…è…è…è…è …è…èü„èõ„èî„èç„èà„èÙ„èÒ„èË„èĄ轄趄评訄衄蚄蓄茄腄è~„èw„èp„èi„èb„è[„èT„èM„èF„è?„è8„è1„è*„è#„è„è„è„è„è„èùƒèòƒèëƒèäƒè݃èÖƒèσèȃèÁƒèºƒè³ƒè¬ƒè¥ƒèžƒè—ƒèƒè‰ƒè‚ƒè{ƒètƒèmƒèfƒè_ƒèXƒèQƒèJƒèCƒè<ƒè5ƒè.ƒè'ƒè ƒèƒèƒè ƒèƒèý‚èö‚èï‚èè‚èá‚èÚ‚èÓ‚èÌ‚èł辂跂谂詂袂蛂蔂è‚膂è‚èx‚èq‚èj‚èc‚è\‚èU‚èN‚èG‚è@‚è9‚è2‚è+‚è$‚è‚è‚è‚è‚è‚èúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþ€è÷€èð€èé€èâ€èÛ€èÔ€èÍ€èÆ€è¿€è¸€è±€èª€è£€èœ€è•€èŽ€è‡€è€€èy€èr€èk€èd€è]€èV€èO€èH€èA€è:€è3€è,€è%€è€è€è€è €è€èûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿ~èø~èñ~èê~èã~èÜ~èÕ~èÎ~èÇ~èÀ~è¹~è²~è«~è¤~è~è–~è~èˆ~è~èz~ès~èl~èe~è^~èW~èP~èI~èB~è;~è4~è-~è&~è~è~è~è ~è~èü}èõ}èî}èç}èà}èÙ}èÒ}èË}èÄ}è½}è¶}è¯}è¨}è¡}èš}è“}èŒ}è…}è~}èw}èp}èi}èb}è[}èT}èM}èF}è?}è8}è1}è*}è#}è}è}è}è}è}èù|èò|èë|èä|èÝ|èÖ|èÏ|èÈ|èÁ|èº|è³|è¬|è¥|èž|è—|è|è‰|è‚|è{|èt|èm|èf|è_|èX|èQ|èJ|èC|è<|è5|è.|è'|è |è|è|è |è|èý{èö{èï{èè{èá{èÚ{èÓ{èÌ{èÅ{è¾{è·{è°{è©{è¢{è›{è”{è{è†{è{èx{èq{èj{èc{è\{èU{èN{èG{è@{è9{è2{è+{è${è{è{è{è{è{èúzèózèìzèåzèÞzè×zèÐzèÉzèÂzè»zè´zè­zè¦zèŸzè˜zè‘zèŠzèƒzè|zèuzènzègzè`zèYzèRzèKzèDzè=zè6zè/zè(zè!zèzèzè zèzèþyè÷yèðyèéyèâyèÛyèÔyèÍyèÆyè¿yè¸yè±yèªyè£yèœyè•yèŽyè‡yè€yèyyèryèkyèdyè]yèVyèOyèHyèAyè:yè3yè,yè%yèyèyèyè yèyèûxèôxèíxèæxèßxèØxèÑxèÊxèÃxè¼xèµxè®xè§xè xè™xè’xè‹xè„xè}xèvxèoxèhxèaxèZxèSxèLxèExè>xè7xè0xè)xè"xèxèxè xèxèÿwèøwèñwèêwèãwèÜwèÕwèÎwèÇwèÀwè¹wè²wè«wè¤wèwè–wèwèˆwèwèzwèswèlwèewè^wèWwèPwèIwèBwè;wè4wè-wè&wèwèwèwè wèwèüvèõvèîvèçvèàvèÙvèÒvèËvèÄvè½vè¶vè¯vè¨vè¡vèšvè“vèŒvè…vè~vèwvèpvèivèbvè[vèTvèMvèFvè?vè8vè1vè*vè#vèvèvèvèvèvèùuèòuèëuèäuèÝuèÖuèÏuèÈuèÁuèºuè³uè¬uè¥uèžuè—uèuè‰uè‚uè{uètuèmuèfuè_uèXuèQuèJuèCuèqè7qè0qè)qè"qèqèqè qèqèÿpèøpèñpèêpèãpèÜpèÕpèÎpèÇpèÀpè¹pè²pè«pè¤pèpè–pèpèˆpèpèzpèspèlpèepè^pèWpèPpèIpèBpè;pè4pè-pè&pèpèpèpè pèpèüoèõoèîoèçoèàoèÙoèÒoèËoèÄoè½oè¶oè¯oè¨oè¡oèšoè“oèŒoè…oè~oèwoèpoèioèboè[oèToèMoèFoè?oè8oè1oè*oè#oèoèoèoèoèoèùnèònèënèänèÝnèÖnèÏnèÈnèÁnèºnè³nè¬nè¥nèžnè—nènè‰nè‚nè{nètnèmnèfnè_nèXnèQnèJnèCnèjè7jè0jè)jè"jèjèjè jèjèÿièøièñièêièãièÜièÕièÎièÇièÀiè¹iè²iè«iè¤ièiè–ièièˆièièzièsièlièeiè^ièWièPièIièBiè;iè4iè-iè&ièièièiè ièièühèõhèîhèçhèàhèÙhèÒhèËhèÄhè½hè¶hè¯hè¨hè¡hèšhè“hèŒhè…hè~hèwhèphèihèbhè[hèThèMhèFhè?hè8hè1hè*hè#hèhèhèhèhèhèùgèògèëgèägèÝgèÖgèÏgèÈgèÁgèºgè³gè¬gè¥gèžgè—gègè‰gè‚gè{gètgèmgèfgè_gèXgèQgèJgèCgècè7cè0cè)cè"cècècè cècèÿbèøbèñbèêbèãbèÜbèÕbèÎbèÇbèÀbè¹bè²bè«bè¤bèbè–bèbèˆbèbèzbèsbèlbèebè^bèWbèPbèIbèBbè;bè4bè-bè&bèbèbèbè bèbèüaèõaèîaèçaèàaèÙaèÒaèËaèÄaè½aè¶aè¯aè¨aè¡aèšaè“aèŒaè…aè~aèwaèpaèiaèbaè[aèTaèMaèFaè?aè8aè1aè*aè#aèaèaèaèaèaèù`èò`èë`èä`èÝ`èÖ`èÏ`èÈ`èÁ`èº`è³`è¬`è¥`èž`è—`è`è‰`è‚`è{`èt`èm`èf`è_`èX`èQ`èJ`èC`è<`è5`è.`è'`è `è`è`è `è`èý_èö_èï_èè_èá_èÚ_èÓ_èÌ_èÅ_è¾_è·_è°_è©_è¢_è›_è”_è_è†_è_èx_èq_èj_èc_è\_èU_èN_èG_è@_è9_è2_è+_è$_è_è_è_è_è_èú^èó^èì^èå^èÞ^è×^èÐ^èÉ^èÂ^è»^è´^è­^è¦^èŸ^è˜^è‘^èŠ^èƒ^è|^èu^èn^èg^è`^èY^èR^èK^èD^è=^è6^è/^è(^è!^è^è^è ^è^èþ]è÷]èð]èé]èâ]èÛ]èÔ]èÍ]èÆ]è¿]è¸]è±]èª]è£]èœ]è•]èŽ]è‡]è€]èy]èr]èk]èd]è]]èV]èO]èH]èA]è:]è3]è,]è%]è]è]è]è ]è]èû\èô\èí\èæ\èß\èØ\èÑ\èÊ\èÃ\è¼\èµ\è®\è§\è \è™\è’\è‹\è„\è}\èv\èo\èh\èa\èZ\èS\èL\èE\è>\è7\è0\è)\è"\è\è\è \è\èÿ[èø[èñ[èê[èã[èÜ[èÕ[èÎ[èÇ[èÀ[è¹[è²[è«[è¤[è[è–[è[èˆ[è[èz[ès[èl[èe[è^[èW[èP[èI[èB[è;[è4[è-[è&[è[è[è[è [è[èüZèõZèîZèçZèàZèÙZèÒZèËZèÄZè½Zè¶Zè¯Zè¨Zè¡ZèšZè“ZèŒZè…Zè~ZèwZèpZèiZèbZè[ZèTZèMZèFZè?Zè8Zè1Zè*Zè#ZèZèZèZèZèZèùYèòYèëYèäYèÝYèÖYèÏYèÈYèÁYèºYè³Yè¬Yè¥YèžYè—YèYè‰Yè‚Yè{YètYèmYèfYè_YèXYèQYèJYèCYèUè7Uè0Uè)Uè"UèUèUè UèUèÿTèøTèñTèêTèãTèÜTèÕTèÎTèÇTèÀTè¹Tè²Tè«Tè¤TèTè–TèTèˆTèTèzTèsTèlTèeTè^TèWTèPTèITèBTè;Tè4Tè-Tè&TèTèTèTè TèTèüSèõSèîSèçSèàSèÙSèÒSèËSèÄSè½Sè¶Sè¯Sè¨Sè¡SèšSè“SèŒSè…Sè~SèwSèpSèiSèbSè[SèTSèMSèFSè?Sè8Sè1Sè*Sè#SèSèSèSèSèSèùRèòRèëRèäRèÝRèÖRèÏRèÈRèÁRèºRè³Rè¬Rè¥RèžRè—RèRè‰Rè‚Rè{RètRèmRèfRè_RèXRèQRèJRèCRèNè7Nè0Nè)Nè"NèNèNè NèNèÿMèøMèñMèêMèãMèÜMèÕMèÎMèÇMèÀMè¹Mè²Mè«Mè¤MèMè–MèMèˆMèMèzMèsMèlMèeMè^MèWMèPMèIMèBMè;Mè4Mè-Mè&MèMèMèMè MèMèüLèõLèîLèçLèàLèÙLèÒLèËLèÄLè½Lè¶Lè¯Lè¨Lè¡LèšLè“LèŒLè…Lè~LèwLèpLèiLèbLè[LèTLèMLèFLè?Lè8Lè1Lè*Lè#LèLèLèLèLèLèùKèòKèëKèäKèÝKèÖKèÏKèÈKèÁKèºKè³Kè¬Kè¥KèžKè—KèKè‰Kè‚Kè{KètKèmKèfKè_KèXKèQKèJKèCKèGè7Gè0Gè)Gè"GèGèGè GèGèÿFèøFèñFèêFèãFèÜFèÕFèÎFèÇFèÀFè¹Fè²Fè«Fè¤FèFè–FèFèˆFèFèzFèsFèlFèeFè^FèWFèPFèIFèBFè;Fè4Fè-Fè&FèFèFèFè FèFèüEèõEèîEèçEèàEèÙEèÒEèËEèÄEè½Eè¶Eè¯Eè¨Eè¡EèšEè“EèŒEè…Eè~EèwEèpEèiEèbEè[EèTEèMEèFEè?Eè8Eè1Eè*Eè#EèEèEèEèEèEèùDèòDèëDèäDèÝDèÖDèÏDèÈDèÁDèºDè³Dè¬Dè¥DèžDè—DèDè‰Dè‚Dè{DètDèmDèfDè_DèXDèQDèJDèCDè@è7@è0@è)@è"@è@è@è @è@èÿ?èø?èñ?èê?èã?èÜ?èÕ?èÎ?èÇ?èÀ?è¹?è²?è«?è¤?è?è–?è?èˆ?è?èz?ès?èl?èe?è^?èW?èP?èI?èB?è;?è4?è-?è&?è?è?è?è ?è?èü>èõ>èî>èç>èà>èÙ>èÒ>èË>èÄ>è½>è¶>è¯>è¨>è¡>èš>è“>èŒ>è…>è~>èw>èp>èi>èb>è[>èT>èM>èF>è?>è8>è1>è*>è#>è>è>è>è>è>èù=èò=èë=èä=èÝ=èÖ=èÏ=èÈ=èÁ=èº=è³=è¬=è¥=èž=è—=è=è‰=è‚=è{=èt=èm=èf=è_=èX=èQ=èJ=èC=è<=è5=è.=è'=è =è=è=è =è=èý<èö<èï<èè<èá<èÚ<èÓ<èÌ<èÅ<è¾<è·<è°<è©<è¢<è›<è”<è<è†<è<èx<èq<èj<èc<è\<èU<èN<èG<è@<è9<è2<è+<è$<è<è<è<è<è<èú;èó;èì;èå;èÞ;è×;èÐ;èÉ;èÂ;è»;è´;è­;è¦;èŸ;è˜;è‘;èŠ;èƒ;è|;èu;èn;èg;è`;èY;èR;èK;èD;è=;è6;è/;è(;è!;è;è;è ;è;èþ:è÷:èð:èé:èâ:èÛ:èÔ:èÍ:èÆ:è¿:è¸:è±:èª:è£:èœ:è•:èŽ:è‡:è€:èy:èr:èk:èd:è]:èV:èO:èH:èA:è::è3:è,:è%:è:è:è:è :è:èû9èô9èí9èæ9èß9èØ9èÑ9èÊ9èÃ9è¼9èµ9è®9è§9è 9è™9è’9è‹9è„9è}9èv9èo9èh9èa9èZ9èS9èL9èE9è>9è79è09è)9è"9è9è9è 9è9èÿ8èø8èñ8èê8èã8èÜ8èÕ8èÎ8èÇ8èÀ8è¹8è²8è«8è¤8è8è–8è8èˆ8è8èz8ès8èl8èe8è^8èW8èP8èI8èB8è;8è48è-8è&8è8è8è8è 8è8èü7èõ7èî7èç7èà7èÙ7èÒ7èË7èÄ7è½7è¶7è¯7è¨7è¡7èš7è“7èŒ7è…7è~7èw7èp7èi7èb7è[7èT7èM7èF7è?7è87è17è*7è#7è7è7è7è7è7èù6èò6èë6èä6èÝ6èÖ6èÏ6èÈ6èÁ6èº6è³6è¬6è¥6èž6è—6è6è‰6è‚6è{6èt6èm6èf6è_6èX6èQ6èJ6èC6è<6è56è.6è'6è 6è6è6è 6è6èý5èö5èï5èè5èá5èÚ5èÓ5èÌ5èÅ5è¾5è·5è°5è©5è¢5è›5è”5è5è†5è5èx5èq5èj5èc5è\5èU5èN5èG5è@5è95è25è+5è$5è5è5è5è5è5èú4èó4èì4èå4èÞ4è×4èÐ4èÉ4èÂ4è»4è´4è­4è¦4èŸ4è˜4è‘4èŠ4èƒ4è|4èu4èn4èg4è`4èY4èR4èK4èD4è=4è64è/4è(4è!4è4è4è 4è4èþ3è÷3èð3èé3èâ3èÛ3èÔ3èÍ3èÆ3è¿3è¸3è±3èª3è£3èœ3è•3èŽ3è‡3è€3èy3èr3èk3èd3è]3èV3èO3èH3èA3è:3è33è,3è%3è3è3è3è 3è3èû2èô2èí2èæ2èß2èØ2èÑ2èÊ2èÃ2è¼2èµ2è®2è§2è 2è™2è’2è‹2è„2è}2èv2èo2èh2èa2èZ2èS2èL2èE2è>2è72è02è)2è"2è2è2è 2è2èÿ1èø1èñ1èê1èã1èÜ1èÕ1èÎ1èÇ1èÀ1è¹1è²1è«1è¤1è1è–1è1èˆ1è1èz1ès1èl1èe1è^1èW1èP1èI1èB1è;1è41è-1è&1è1è1è1è 1è1èü0èõ0èî0èç0èà0èÙ0èÒ0èË0èÄ0è½0è¶0è¯0è¨0è¡0èš0è“0èŒ0è…0è~0èw0èp0èi0èb0è[0èT0èM0èF0è?0è80è10è*0è#0è0è0è0è0è0èù/èò/èë/èä/èÝ/èÖ/èÏ/èÈ/èÁ/èº/è³/è¬/è¥/èž/è—/è/è‰/è‚/è{/èt/èm/èf/è_/èX/èQ/èJ/èC/è+è7+è0+è)+è"+è+è+è +è+èÿ*èø*èñ*èê*èã*èÜ*èÕ*èÎ*èÇ*èÀ*è¹*è²*è«*è¤*è*è–*è*èˆ*è*èz*ès*èl*èe*è^*èW*èP*èI*èB*è;*è4*è-*è&*è*è*è*è *è*èü)èõ)èî)èç)èà)èÙ)èÒ)èË)èÄ)è½)è¶)è¯)è¨)è¡)èš)è“)èŒ)è…)è~)èw)èp)èi)èb)è[)èT)èM)èF)è?)è8)è1)è*)è#)è)è)è)è)è)èù(èò(èë(èä(èÝ(èÖ(èÏ(èÈ(èÁ(èº(è³(è¬(è¥(èž(è—(è(è‰(è‚(è{(èt(èm(èf(è_(èX(èQ(èJ(èC(è<(è5(è.(è'(è (è(è(è (è(èý'èö'èï'èè'èá'èÚ'èÓ'èÌ'èÅ'è¾'è·'è°'è©'è¢'è›'è”'è'è†'è'èx'èq'èj'èc'è\'èU'èN'èG'è@'è9'è2'è+'è$'è'è'è'è'è'èú&èó&èì&èå&èÞ&è×&èÐ&èÉ&èÂ&è»&è´&è­&è¦&èŸ&è˜&è‘&èŠ&èƒ&è|&èu&èn&èg&è`&èY&èR&èK&èD&è=&è6&è/&è(&è!&è&è&è &è&èþ%è÷%èð%èé%èâ%èÛ%èÔ%èÍ%èÆ%è¿%è¸%è±%èª%è£%èœ%è•%èŽ%è‡%è€%èy%èr%èk%èd%è]%èV%èO%èH%èA%è:%è3%è,%è%%è%è%è%è %è%èû$èô$èí$èæ$èß$èØ$èÑ$èÊ$èÃ$è¼$èµ$è®$è§$è $è™$è’$è‹$è„$è}$èv$èo$èh$èa$èZ$èS$èL$èE$è>$è7$è0$è)$è"$è$è$è $è$èÿ#èø#èñ#èê#èã#èÜ#èÕ#èÎ#èÇ#èÀ#è¹#è²#è«#è¤#è#è–#è#èˆ#è#èz#ès#èl#èe#è^#èW#èP#èI#èB#è;#è4#è-#è&#è#è#è#è #è#èü"èõ"èî"èç"èà"èÙ"èÒ"èË"èÄ"è½"è¶"è¯"è¨"è¡"èš"è“"èŒ"è…"è~"èw"èp"èi"èb"è["èT"èM"èF"è?"è8"è1"è*"è#"è"è"è"è"è"èù!èò!èë!èä!èÝ!èÖ!èÏ!èÈ!èÁ!èº!è³!è¬!è¥!èž!è—!è!è‰!è‚!è{!èt!èm!èf!è_!èX!èQ!èJ!èC!èè7è0è)è"èèè èèÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèü èõ èî èç èà èÙ èÒ èË èÄ è½ è¶ è¯ è¨ è¡ èš è“ èŒ è… è~ èw èp èi èb è[ èT èM èF è? è8 è1 è* è# è è è è è èù èò èë èä èÝ èÖ èÏ èÈ èÁ èº è³ è¬ è¥ èž è— è è‰ è‚ è{ èt èm èf è_ èX èQ èJ èC è< è5 è. è' è è è è è èý èö èï èè èá èÚ èÓ èÌ èÅ è¾ è· è° è© è¢ è› è” è è† è èx èq èj èc è\ èU èN èG è@ è9 è2 è+ è$ è è è è è èú èó èì èå èÞ è× èÐ èÉ è è» è´ è­ è¦ èŸ è˜ è‘ èŠ èƒ è| èu èn èg è` èY èR èK èD è= è6 è/ è( è! è è è è èþ è÷ èð èé èâ èÛ èÔ èÍ èÆ è¿ è¸ è± èª è£ èœ è• èŽ è‡ è€ èy èr èk èd è] èV èO èH èA è: è3 è, è% è è è è è èûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüÿçõÿçîÿççÿçàÿçÙÿçÒÿçËÿçÄÿç½ÿç¶ÿç¯ÿç¨ÿç¡ÿçšÿç“ÿçŒÿç…ÿç~ÿçwÿçpÿçiÿçbÿç[ÿçTÿçMÿçFÿç?ÿç8ÿç1ÿç*ÿç#ÿçÿçÿçÿçÿçÿçùþçòþçëþçäþçÝþçÖþçÏþçÈþçÁþçºþç³þç¬þç¥þçžþç—þçþç‰þç‚þç{þçtþçmþçfþç_þçXþçQþçJþçCþç<þç5þç.þç'þç þçþçþç þçþçýýçöýçïýçèýçáýçÚýçÓýçÌýçÅýç¾ýç·ýç°ýç©ýç¢ýç›ýç”ýçýç†ýçýçxýçqýçjýçcýç\ýçUýçNýçGýç@ýç9ýç2ýç+ýç$ýçýçýçýçýçýçúüçóüçìüçåüçÞüç×üçÐüçÉüçÂüç»üç´üç­üç¦üçŸüç˜üç‘üçŠüçƒüç|üçuüçnüçgüç`üçYüçRüçKüçDüç=üç6üç/üç(üç!üçüçüç üçüçþûç÷ûçðûçéûçâûçÛûçÔûçÍûçÆûç¿ûç¸ûç±ûçªûç£ûçœûç•ûçŽûç‡ûç€ûçyûçrûçkûçdûç]ûçVûçOûçHûçAûç:ûç3ûç,ûç%ûçûçûçûç ûçûçûúçôúçíúçæúçßúçØúçÑúçÊúçÃúç¼úçµúç®úç§úç úç™úç’úç‹úç„úç}úçvúçoúçhúçaúçZúçSúçLúçEúç>úç7úç0úç)úç"úçúçúç úçúçÿùçøùçñùçêùçãùçÜùçÕùçÎùçÇùçÀùç¹ùç²ùç«ùç¤ùçùç–ùçùçˆùçùçzùçsùçlùçeùç^ùçWùçPùçIùçBùç;ùç4ùç-ùç&ùçùçùçùç ùçùçüøçõøçîøççøçàøçÙøçÒøçËøçÄøç½øç¶øç¯øç¨øç¡øçšøç“øçŒøç…øç~øçwøçpøçiøçbøç[øçTøçMøçFøç?øç8øç1øç*øç#øçøçøçøçøçøçù÷çò÷çë÷çä÷çÝ÷çÖ÷çÏ÷çÈ÷çÁ÷çº÷ç³÷ç¬÷ç¥÷çž÷ç—÷ç÷ç‰÷ç‚÷ç{÷çt÷çm÷çf÷ç_÷çX÷çQ÷çJ÷çC÷ç<÷ç5÷ç.÷ç'÷ç ÷ç÷ç÷ç ÷ç÷çýöçööçïöçèöçáöçÚöçÓöçÌöçÅöç¾öç·öç°öç©öç¢öç›öç”öçöç†öçöçxöçqöçjöçcöç\öçUöçNöçGöç@öç9öç2öç+öç$öçöçöçöçöçöçúõçóõçìõçåõçÞõç×õçÐõçÉõçÂõç»õç´õç­õç¦õçŸõç˜õç‘õçŠõçƒõç|õçuõçnõçgõç`õçYõçRõçKõçDõç=õç6õç/õç(õç!õçõçõç õçõçþôç÷ôçðôçéôçâôçÛôçÔôçÍôçÆôç¿ôç¸ôç±ôçªôç£ôçœôç•ôçŽôç‡ôç€ôçyôçrôçkôçdôç]ôçVôçOôçHôçAôç:ôç3ôç,ôç%ôçôçôçôç ôçôçûóçôóçíóçæóçßóçØóçÑóçÊóçÃóç¼óçµóç®óç§óç óç™óç’óç‹óç„óç}óçvóçoóçhóçaóçZóçSóçLóçEóç>óç7óç0óç)óç"óçóçóç óçóçÿòçøòçñòçêòçãòçÜòçÕòçÎòçÇòçÀòç¹òç²òç«òç¤òçòç–òçòçˆòçòçzòçsòçlòçeòç^òçWòçPòçIòçBòç;òç4òç-òç&òçòçòçòç òçòçüñçõñçîñççñçàñçÙñçÒñçËñçÄñç½ñç¶ñç¯ñç¨ñç¡ñçšñç“ñçŒñç…ñç~ñçwñçpñçiñçbñç[ñçTñçMñçFñç?ñç8ñç1ñç*ñç#ñçñçñçñçñçñçùðçòðçëðçäðçÝðçÖðçÏðçÈðçÁðçºðç³ðç¬ðç¥ðçžðç—ðçðç‰ðç‚ðç{ðçtðçmðçfðç_ðçXðçQðçJðçCðç<ðç5ðç.ðç'ðç ðçðçðç ðçðçýïçöïçïïçèïçáïçÚïçÓïçÌïçÅïç¾ïç·ïç°ïç©ïç¢ïç›ïç”ïçïç†ïçïçxïçqïçjïçcïç\ïçUïçNïçGïç@ïç9ïç2ïç+ïç$ïçïçïçïçïçïçúîçóîçìîçåîçÞîç×îçÐîçÉîçÂîç»îç´îç­îç¦îçŸîç˜îç‘îçŠîçƒîç|îçuîçnîçgîç`îçYîçRîçKîçDîç=îç6îç/îç(îç!îçîçîç îçîçþíç÷íçðíçéíçâíçÛíçÔíçÍíçÆíç¿íç¸íç±íçªíç£íçœíç•íçŽíç‡íç€íçyíçríçkíçdíç]íçVíçOíçHíçAíç:íç3íç,íç%íçíçíçíç íçíçûìçôìçíìçæìçßìçØìçÑìçÊìçÃìç¼ìçµìç®ìç§ìç ìç™ìç’ìç‹ìç„ìç}ìçvìçoìçhìçaìçZìçSìçLìçEìç>ìç7ìç0ìç)ìç"ìçìçìç ìçìçÿëçøëçñëçêëçãëçÜëçÕëçÎëçÇëçÀëç¹ëç²ëç«ëç¤ëçëç–ëçëçˆëçëçzëçsëçlëçeëç^ëçWëçPëçIëçBëç;ëç4ëç-ëç&ëçëçëçëç ëçëçüêçõêçîêççêçàêçÙêçÒêçËêçÄêç½êç¶êç¯êç¨êç¡êçšêç“êçŒêç…êç~êçwêçpêçiêçbêç[êçTêçMêçFêç?êç8êç1êç*êç#êçêçêçêçêçêçùéçòéçëéçäéçÝéçÖéçÏéçÈéçÁéçºéç³éç¬éç¥éçžéç—éçéç‰éç‚éç{éçtéçméçféç_éçXéçQéçJéçCéç<éç5éç.éç'éç éçéçéç éçéçýèçöèçïèçèèçáèçÚèçÓèçÌèçÅèç¾èç·èç°èç©èç¢èç›èç”èçèç†èçèçxèçqèçjèçcèç\èçUèçNèçGèç@èç9èç2èç+èç$èçèçèçèçèçèçúççóççìççåççÞçç×ççÐççÉççÂçç»çç´çç­çç¦ççŸçç˜çç‘ççŠççƒçç|ççuççnççgçç`ççYççRççKççDçç=çç6çç/çç(çç!çççççç ççççþæç÷æçðæçéæçâæçÛæçÔæçÍæçÆæç¿æç¸æç±æçªæç£æçœæç•æçŽæç‡æç€æçyæçræçkæçdæç]æçVæçOæçHæçAæç:æç3æç,æç%æçæçæçæç æçæçûåçôåçíåçæåçßåçØåçÑåçÊåçÃåç¼åçµåç®åç§åç åç™åç’åç‹åç„åç}åçvåçoåçhåçaåçZåçSåçLåçEåç>åç7åç0åç)åç"åçåçåç åçåçÿäçøäçñäçêäçãäçÜäçÕäçÎäçÇäçÀäç¹äç²äç«äç¤äçäç–äçäçˆäçäçzäçsäçläçeäç^äçWäçPäçIäçBäç;äç4äç-äç&äçäçäçäç äçäçüãçõãçîãççãçàãçÙãçÒãçËãçÄãç½ãç¶ãç¯ãç¨ãç¡ãçšãç“ãçŒãç…ãç~ãçwãçpãçiãçbãç[ãçTãçMãçFãç?ãç8ãç1ãç*ãç#ãçãçãçãçãçãçùâçòâçëâçäâçÝâçÖâçÏâçÈâçÁâçºâç³âç¬âç¥âçžâç—âçâç‰âç‚âç{âçtâçmâçfâç_âçXâçQâçJâçCâç<âç5âç.âç'âç âçâçâç âçâçýáçöáçïáçèáçááçÚáçÓáçÌáçÅáç¾áç·áç°áç©áç¢áç›áç”áçáç†áçáçxáçqáçjáçcáç\áçUáçNáçGáç@áç9áç2áç+áç$áçáçáçáçáçáçúàçóàçìàçåàçÞàç×àçÐàçÉàçÂàç»àç´àç­àç¦àçŸàç˜àç‘àçŠàçƒàç|àçuàçnàçgàç`àçYàçRàçKàçDàç=àç6àç/àç(àç!àçàçàç àçàçþßç÷ßçðßçéßçâßçÛßçÔßçÍßçÆßç¿ßç¸ßç±ßçªßç£ßçœßç•ßçŽßç‡ßç€ßçyßçrßçkßçdßç]ßçVßçOßçHßçAßç:ßç3ßç,ßç%ßçßçßçßç ßçßçûÞçôÞçíÞçæÞçßÞçØÞçÑÞçÊÞçÃÞç¼ÞçµÞç®Þç§Þç Þç™Þç’Þç‹Þç„Þç}ÞçvÞçoÞçhÞçaÞçZÞçSÞçLÞçEÞç>Þç7Þç0Þç)Þç"ÞçÞçÞç ÞçÞçÿÝçøÝçñÝçêÝçãÝçÜÝçÕÝçÎÝçÇÝçÀÝç¹Ýç²Ýç«Ýç¤ÝçÝç–ÝçÝçˆÝçÝçzÝçsÝçlÝçeÝç^ÝçWÝçPÝçIÝçBÝç;Ýç4Ýç-Ýç&ÝçÝçÝçÝç ÝçÝçüÜçõÜçîÜççÜçàÜçÙÜçÒÜçËÜçÄÜç½Üç¶Üç¯Üç¨Üç¡ÜçšÜç“ÜçŒÜç…Üç~ÜçwÜçpÜçiÜçbÜç[ÜçTÜçMÜçFÜç?Üç8Üç1Üç*Üç#ÜçÜçÜçÜçÜçÜçùÛçòÛçëÛçäÛçÝÛçÖÛçÏÛçÈÛçÁÛçºÛç³Ûç¬Ûç¥ÛçžÛç—ÛçÛç‰Ûç‚Ûç{ÛçtÛçmÛçfÛç_ÛçXÛçQÛçJÛçCÛç<Ûç5Ûç.Ûç'Ûç ÛçÛçÛç ÛçÛçýÚçöÚçïÚçèÚçáÚçÚÚçÓÚçÌÚçÅÚç¾Úç·Úç°Úç©Úç¢Úç›Úç”ÚçÚç†ÚçÚçxÚçqÚçjÚçcÚç\ÚçUÚçNÚçGÚç@Úç9Úç2Úç+Úç$ÚçÚçÚçÚçÚçÚçúÙçóÙçìÙçåÙçÞÙç×ÙçÐÙçÉÙçÂÙç»Ùç´Ùç­Ùç¦ÙçŸÙç˜Ùç‘ÙçŠÙçƒÙç|ÙçuÙçnÙçgÙç`ÙçYÙçRÙçKÙçDÙç=Ùç6Ùç/Ùç(Ùç!ÙçÙçÙç ÙçÙçþØç÷ØçðØçéØçâØçÛØçÔØçÍØçÆØç¿Øç¸Øç±ØçªØç£ØçœØç•ØçŽØç‡Øç€ØçyØçrØçkØçdØç]ØçVØçOØçHØçAØç:Øç3Øç,Øç%ØçØçØçØç ØçØçû×çô×çí×çæ×çß×çØ×çÑ×çÊ×çÃ×ç¼×çµ×ç®×ç§×ç ×ç™×ç’×ç‹×ç„×ç}×çv×ço×çh×ça×çZ×çS×çL×çE×ç>×ç7×ç0×ç)×ç"×ç×ç×ç ×ç×çÿÖçøÖçñÖçêÖçãÖçÜÖçÕÖçÎÖçÇÖçÀÖç¹Öç²Öç«Öç¤ÖçÖç–ÖçÖçˆÖçÖçzÖçsÖçlÖçeÖç^ÖçWÖçPÖçIÖçBÖç;Öç4Öç-Öç&ÖçÖçÖçÖç ÖçÖçüÕçõÕçîÕççÕçàÕçÙÕçÒÕçËÕçÄÕç½Õç¶Õç¯Õç¨Õç¡ÕçšÕç“ÕçŒÕç…Õç~ÕçwÕçpÕçiÕçbÕç[ÕçTÕçMÕçFÕç?Õç8Õç1Õç*Õç#ÕçÕçÕçÕçÕçÕçùÔçòÔçëÔçäÔçÝÔçÖÔçÏÔçÈÔçÁÔçºÔç³Ôç¬Ôç¥ÔçžÔç—ÔçÔç‰Ôç‚Ôç{ÔçtÔçmÔçfÔç_ÔçXÔçQÔçJÔçCÔç<Ôç5Ôç.Ôç'Ôç ÔçÔçÔç ÔçÔçýÓçöÓçïÓçèÓçáÓçÚÓçÓÓçÌÓçÅÓç¾Óç·Óç°Óç©Óç¢Óç›Óç”ÓçÓç†ÓçÓçxÓçqÓçjÓçcÓç\ÓçUÓçNÓçGÓç@Óç9Óç2Óç+Óç$ÓçÓçÓçÓçÓçÓçúÒçóÒçìÒçåÒçÞÒç×ÒçÐÒçÉÒçÂÒç»Òç´Òç­Òç¦ÒçŸÒç˜Òç‘ÒçŠÒçƒÒç|ÒçuÒçnÒçgÒç`ÒçYÒçRÒçKÒçDÒç=Òç6Òç/Òç(Òç!ÒçÒçÒç ÒçÒçþÑç÷ÑçðÑçéÑçâÑçÛÑçÔÑçÍÑçÆÑç¿Ñç¸Ñç±ÑçªÑç£ÑçœÑç•ÑçŽÑç‡Ñç€ÑçyÑçrÑçkÑçdÑç]ÑçVÑçOÑçHÑçAÑç:Ñç3Ñç,Ñç%ÑçÑçÑçÑç ÑçÑçûÐçôÐçíÐçæÐçßÐçØÐçÑÐçÊÐçÃÐç¼ÐçµÐç®Ðç§Ðç Ðç™Ðç’Ðç‹Ðç„Ðç}ÐçvÐçoÐçhÐçaÐçZÐçSÐçLÐçEÐç>Ðç7Ðç0Ðç)Ðç"ÐçÐçÐç ÐçÐçÿÏçøÏçñÏçêÏçãÏçÜÏçÕÏçÎÏçÇÏçÀÏç¹Ïç²Ïç«Ïç¤ÏçÏç–ÏçÏçˆÏçÏçzÏçsÏçlÏçeÏç^ÏçWÏçPÏçIÏçBÏç;Ïç4Ïç-Ïç&ÏçÏçÏçÏç ÏçÏçüÎçõÎçîÎççÎçàÎçÙÎçÒÎçËÎçÄÎç½Îç¶Îç¯Îç¨Îç¡ÎçšÎç“ÎçŒÎç…Îç~ÎçwÎçpÎçiÎçbÎç[ÎçTÎçMÎçFÎç?Îç8Îç1Îç*Îç#ÎçÎçÎçÎçÎçÎçùÍçòÍçëÍçäÍçÝÍçÖÍçÏÍçÈÍçÁÍçºÍç³Íç¬Íç¥ÍçžÍç—ÍçÍç‰Íç‚Íç{ÍçtÍçmÍçfÍç_ÍçXÍçQÍçJÍçCÍç<Íç5Íç.Íç'Íç ÍçÍçÍç ÍçÍçýÌçöÌçïÌçèÌçáÌçÚÌçÓÌçÌÌçÅÌç¾Ìç·Ìç°Ìç©Ìç¢Ìç›Ìç”ÌçÌç†ÌçÌçxÌçqÌçjÌçcÌç\ÌçUÌçNÌçGÌç@Ìç9Ìç2Ìç+Ìç$ÌçÌçÌçÌçÌçÌçúËçóËçìËçåËçÞËç×ËçÐËçÉËçÂËç»Ëç´Ëç­Ëç¦ËçŸËç˜Ëç‘ËçŠËçƒËç|ËçuËçnËçgËç`ËçYËçRËçKËçDËç=Ëç6Ëç/Ëç(Ëç!ËçËçËç ËçËçþÊç÷ÊçðÊçéÊçâÊçÛÊçÔÊçÍÊçÆÊç¿Êç¸Êç±ÊçªÊç£ÊçœÊç•ÊçŽÊç‡Êç€ÊçyÊçrÊçkÊçdÊç]ÊçVÊçOÊçHÊçAÊç:Êç3Êç,Êç%ÊçÊçÊçÊç ÊçÊçûÉçôÉçíÉçæÉçßÉçØÉçÑÉçÊÉçÃÉç¼ÉçµÉç®Éç§Éç Éç™Éç’Éç‹Éç„Éç}ÉçvÉçoÉçhÉçaÉçZÉçSÉçLÉçEÉç>Éç7Éç0Éç)Éç"ÉçÉçÉç ÉçÉçÿÈçøÈçñÈçêÈçãÈçÜÈçÕÈçÎÈçÇÈçÀÈç¹Èç²Èç«Èç¤ÈçÈç–ÈçÈçˆÈçÈçzÈçsÈçlÈçeÈç^ÈçWÈçPÈçIÈçBÈç;Èç4Èç-Èç&ÈçÈçÈçÈç ÈçÈçüÇçõÇçîÇççÇçàÇçÙÇçÒÇçËÇçÄÇç½Çç¶Çç¯Çç¨Çç¡ÇçšÇç“ÇçŒÇç…Çç~ÇçwÇçpÇçiÇçbÇç[ÇçTÇçMÇçFÇç?Çç8Çç1Çç*Çç#ÇçÇçÇçÇçÇçÇçùÆçòÆçëÆçäÆçÝÆçÖÆçÏÆçÈÆçÁÆçºÆç³Æç¬Æç¥ÆçžÆç—ÆçÆç‰Æç‚Æç{ÆçtÆçmÆçfÆç_ÆçXÆçQÆçJÆçCÆç<Æç5Æç.Æç'Æç ÆçÆçÆç ÆçÆçýÅçöÅçïÅçèÅçáÅçÚÅçÓÅçÌÅçÅÅç¾Åç·Åç°Åç©Åç¢Åç›Åç”ÅçÅç†ÅçÅçxÅçqÅçjÅçcÅç\ÅçUÅçNÅçGÅç@Åç9Åç2Åç+Åç$ÅçÅçÅçÅçÅçÅçúÄçóÄçìÄçåÄçÞÄç×ÄçÐÄçÉÄçÂÄç»Äç´Äç­Äç¦ÄçŸÄç˜Äç‘ÄçŠÄçƒÄç|ÄçuÄçnÄçgÄç`ÄçYÄçRÄçKÄçDÄç=Äç6Äç/Äç(Äç!ÄçÄçÄç ÄçÄçþÃç÷ÃçðÃçéÃçâÃçÛÃçÔÃçÍÃçÆÃç¿Ãç¸Ãç±ÃçªÃç£ÃçœÃç•ÃçŽÃç‡Ãç€ÃçyÃçrÃçkÃçdÃç]ÃçVÃçOÃçHÃçAÃç:Ãç3Ãç,Ãç%ÃçÃçÃçÃç ÃçÃçûÂçôÂçíÂçæÂçßÂçØÂçÑÂçÊÂçÃÂç¼ÂçµÂç®Âç§Âç Âç™Âç’Âç‹Âç„Âç}ÂçvÂçoÂçhÂçaÂçZÂçSÂçLÂçEÂç>Âç7Âç0Âç)Âç"ÂçÂçÂç ÂçÂçÿÁçøÁçñÁçêÁçãÁçÜÁçÕÁçÎÁçÇÁçÀÁç¹Áç²Áç«Áç¤ÁçÁç–ÁçÁçˆÁçÁçzÁçsÁçlÁçeÁç^ÁçWÁçPÁçIÁçBÁç;Áç4Áç-Áç&ÁçÁçÁçÁç ÁçÁçüÀçõÀçîÀççÀçàÀçÙÀçÒÀçËÀçÄÀç½Àç¶Àç¯Àç¨Àç¡ÀçšÀç“ÀçŒÀç…Àç~ÀçwÀçpÀçiÀçbÀç[ÀçTÀçMÀçFÀç?Àç8Àç1Àç*Àç#ÀçÀçÀçÀçÀçÀçù¿çò¿çë¿çä¿çÝ¿çÖ¿çÏ¿çÈ¿çÁ¿çº¿ç³¿ç¬¿ç¥¿çž¿ç—¿ç¿ç‰¿ç‚¿ç{¿çt¿çm¿çf¿ç_¿çX¿çQ¿çJ¿çC¿ç<¿ç5¿ç.¿ç'¿ç ¿ç¿ç¿ç ¿ç¿çý¾çö¾çï¾çè¾çá¾çÚ¾çÓ¾ç̾çžç¾¾ç·¾ç°¾ç©¾ç¢¾ç›¾ç”¾ç¾ç†¾ç¾çx¾çq¾çj¾çc¾ç\¾çU¾çN¾çG¾ç@¾ç9¾ç2¾ç+¾ç$¾ç¾ç¾ç¾ç¾ç¾çú½çó½çì½çå½çÞ½ç×½çнçɽç½ç»½ç´½ç­½ç¦½çŸ½ç˜½ç‘½çн烽ç|½çu½çn½çg½ç`½çY½çR½çK½çD½ç=½ç6½ç/½ç(½ç!½ç½ç½ç ½ç½çþ¼ç÷¼çð¼çé¼çâ¼çÛ¼çÔ¼çͼçƼ翼縼籼窼磼眼畼ç޼燼瀼çy¼çr¼çk¼çd¼ç]¼çV¼çO¼çH¼çA¼ç:¼ç3¼ç,¼ç%¼ç¼ç¼ç¼ç ¼ç¼çû»çô»çí»çæ»çß»çØ»çÑ»çÊ»çû缻絻箻移砻登璻狻焻ç}»çv»ço»çh»ça»çZ»çS»çL»çE»ç>»ç7»ç0»ç)»ç"»ç»ç»ç »ç»çÿºçøºçñºçêºçãºçܺçÕºçκçǺçÀºç¹ºç²ºç«ºç¤ºçºç–ºçºçˆºçºçzºçsºçlºçeºç^ºçWºçPºçIºçBºç;ºç4ºç-ºç&ºçºçºçºç ºçºçü¹çõ¹çî¹çç¹çà¹çÙ¹çÒ¹ç˹çĹ罹綹篹稹硹皹瓹猹煹ç~¹çw¹çp¹çi¹çb¹ç[¹çT¹çM¹çF¹ç?¹ç8¹ç1¹ç*¹ç#¹ç¹ç¹ç¹ç¹ç¹çù¸çò¸çë¸çä¸çݸçÖ¸çϸçȸçÁ¸çº¸ç³¸ç¬¸ç¥¸çž¸ç—¸ç¸ç‰¸ç‚¸ç{¸çt¸çm¸çf¸ç_¸çX¸çQ¸çJ¸çC¸ç<¸ç5¸ç.¸ç'¸ç ¸ç¸ç¸ç ¸ç¸çý·çö·çï·çè·çá·çÚ·çÓ·çÌ·çŷ羷緷簷穷碷盷男ç·ç†·ç·çx·çq·çj·çc·ç\·çU·çN·çG·ç@·ç9·ç2·ç+·ç$·ç·ç·ç·ç·ç·çú¶çó¶çì¶çå¶çÞ¶ç×¶çжçɶç¶ç»¶ç´¶ç­¶ç¦¶çŸ¶ç˜¶ç‘¶çж烶ç|¶çu¶çn¶çg¶ç`¶çY¶çR¶çK¶çD¶ç=¶ç6¶ç/¶ç(¶ç!¶ç¶ç¶ç ¶ç¶çþµç÷µçðµçéµçâµçÛµçÔµç͵çƵ翵縵籵窵磵眵畵ç޵燵瀵çyµçrµçkµçdµç]µçVµçOµçHµçAµç:µç3µç,µç%µçµçµçµç µçµçû´çô´çí´çæ´çß´çØ´çÑ´çÊ´çôç¼´çµ´ç®´ç§´ç ´ç™´ç’´ç‹´ç„´ç}´çv´ço´çh´ça´çZ´çS´çL´çE´ç>´ç7´ç0´ç)´ç"´ç´ç´ç ´ç´çÿ³çø³çñ³çê³çã³çܳçÕ³çγçdzçÀ³ç¹³ç²³ç«³ç¤³ç³ç–³ç³çˆ³ç³çz³çs³çl³çe³ç^³çW³çP³çI³çB³ç;³ç4³ç-³ç&³ç³ç³ç³ç ³ç³çü²çõ²çî²çç²çà²çÙ²çÒ²ç˲çIJ署網篲稲硲皲瓲猲煲ç~²çw²çp²çi²çb²ç[²çT²çM²çF²ç?²ç8²ç1²ç*²ç#²ç²ç²ç²ç²ç²çù±çò±çë±çä±çݱçÖ±çϱçȱçÁ±çº±ç³±ç¬±ç¥±çž±ç—±ç±ç‰±ç‚±ç{±çt±çm±çf±ç_±çX±çQ±çJ±çC±ç<±ç5±ç.±ç'±ç ±ç±ç±ç ±ç±çý°çö°çï°çè°çá°çÚ°çÓ°ç̰çŰ羰緰簰穰碰盰田ç°ç†°ç°çx°çq°çj°çc°ç\°çU°çN°çG°ç@°ç9°ç2°ç+°ç$°ç°ç°ç°ç°ç°çú¯çó¯çì¯çå¯çÞ¯çׯçЯçɯç¯ç»¯ç´¯ç­¯ç¦¯çŸ¯ç˜¯ç‘¯çН烯ç|¯çu¯çn¯çg¯ç`¯çY¯çR¯çK¯çD¯ç=¯ç6¯ç/¯ç(¯ç!¯ç¯ç¯ç ¯ç¯çþ®ç÷®çð®çé®çâ®çÛ®çÔ®çÍ®çÆ®ç¿®ç¸®ç±®çª®ç£®çœ®ç•®çŽ®ç‡®ç€®çy®çr®çk®çd®ç]®çV®çO®çH®çA®ç:®ç3®ç,®ç%®ç®ç®ç®ç ®ç®çû­çô­çí­çæ­çß­çØ­çÑ­çÊ­çíç¼­çµ­ç®­ç§­ç ­ç™­ç’­ç‹­ç„­ç}­çv­ço­çh­ça­çZ­çS­çL­çE­ç>­ç7­ç0­ç)­ç"­ç­ç­ç ­ç­çÿ¬çø¬çñ¬çê¬çã¬çܬçÕ¬çάçǬçÀ¬ç¹¬ç²¬ç«¬ç¤¬ç¬ç–¬ç¬çˆ¬ç¬çz¬çs¬çl¬çe¬ç^¬çW¬çP¬çI¬çB¬ç;¬ç4¬ç-¬ç&¬ç¬ç¬ç¬ç ¬ç¬çü«çõ«çî«çç«çà«çÙ«çÒ«çË«çī罫綫篫稫硫皫瓫猫煫ç~«çw«çp«çi«çb«ç[«çT«çM«çF«ç?«ç8«ç1«ç*«ç#«ç«ç«ç«ç«ç«çùªçòªçëªçäªçݪçÖªçϪçȪçÁªçºªç³ªç¬ªç¥ªçžªç—ªçªç‰ªç‚ªç{ªçtªçmªçfªç_ªçXªçQªçJªçCªç<ªç5ªç.ªç'ªç ªçªçªç ªçªçý©çö©çï©çè©çá©çÚ©çÓ©çÌ©çũ義緩簩穩碩盩甩ç©ç†©ç©çx©çq©çj©çc©ç\©çU©çN©çG©ç@©ç9©ç2©ç+©ç$©ç©ç©ç©ç©ç©çú¨çó¨çì¨çå¨çÞ¨çרçШçɨç¨ç»¨ç´¨ç­¨ç¦¨çŸ¨ç˜¨ç‘¨çЍ烨ç|¨çu¨çn¨çg¨ç`¨çY¨çR¨çK¨çD¨ç=¨ç6¨ç/¨ç(¨ç!¨ç¨ç¨ç ¨ç¨çþ§ç÷§çð§çé§çâ§çÛ§çÔ§çͧçƧ翧縧籧窧磧眧畧çާ燧瀧çy§çr§çk§çd§ç]§çV§çO§çH§çA§ç:§ç3§ç,§ç%§ç§ç§ç§ç §ç§çû¦çô¦çí¦çæ¦çߦçئçѦçʦçæç¼¦çµ¦ç®¦ç§¦ç ¦ç™¦ç’¦ç‹¦ç„¦ç}¦çv¦ço¦çh¦ça¦çZ¦çS¦çL¦çE¦ç>¦ç7¦ç0¦ç)¦ç"¦ç¦ç¦ç ¦ç¦çÿ¥çø¥çñ¥çê¥çã¥çÜ¥çÕ¥çÎ¥çÇ¥çÀ¥ç¹¥ç²¥ç«¥ç¤¥ç¥ç–¥ç¥çˆ¥ç¥çz¥çs¥çl¥çe¥ç^¥çW¥çP¥çI¥çB¥ç;¥ç4¥ç-¥ç&¥ç¥ç¥ç¥ç ¥ç¥çü¤çõ¤çî¤çç¤çà¤çÙ¤çÒ¤çˤçĤ罤綤篤稤硤皤瓤猤煤ç~¤çw¤çp¤çi¤çb¤ç[¤çT¤çM¤çF¤ç?¤ç8¤ç1¤ç*¤ç#¤ç¤ç¤ç¤ç¤ç¤çù£çò£çë£çä£çÝ£çÖ£çÏ£çÈ£çÁ£çº£ç³£ç¬£ç¥£çž£ç—£ç£ç‰£ç‚£ç{£çt£çm£çf£ç_£çX£çQ£çJ£çC£ç<£ç5£ç.£ç'£ç £ç£ç£ç £ç£çý¢çö¢çï¢çè¢çá¢çÚ¢çÓ¢çÌ¢çŢ羢緢簢穢碢盢產ç¢ç†¢ç¢çx¢çq¢çj¢çc¢ç\¢çU¢çN¢çG¢ç@¢ç9¢ç2¢ç+¢ç$¢ç¢ç¢ç¢ç¢ç¢çú¡çó¡çì¡çå¡çÞ¡çסçСçÉ¡ç¡ç»¡ç´¡ç­¡ç¦¡çŸ¡ç˜¡ç‘¡çŠ¡çƒ¡ç|¡çu¡çn¡çg¡ç`¡çY¡çR¡çK¡çD¡ç=¡ç6¡ç/¡ç(¡ç!¡ç¡ç¡ç ¡ç¡çþ ç÷ çð çé çâ çÛ çÔ çÍ çÆ ç¿ ç¸ ç± çª ç£ çœ ç• çŽ ç‡ ç€ çy çr çk çd ç] çV çO çH çA ç: ç3 ç, ç% ç ç ç ç  ç çûŸçôŸçíŸçæŸçߟçØŸçÑŸçÊŸçß缟絟箟租砟癟璟狟焟ç}ŸçvŸçoŸçhŸçaŸçZŸçSŸçLŸçEŸç>Ÿç7Ÿç0Ÿç)Ÿç"ŸçŸçŸç ŸçŸçÿžçøžçñžçêžçãžçÜžçÕžçΞçÇžçÀžç¹žç²žç«žç¤žçžç–žçžçˆžçžçzžçsžçlžçežç^žçWžçPžçIžçBžç;žç4žç-žç&žçžçžçžç žçžçüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùœçòœçëœçäœçÝœçÖœçÏœçÈœçÁœçºœç³œç¬œç¥œçžœç—œçœç‰œç‚œç{œçtœçmœçfœç_œçXœçQœçJœçCœç<œç5œç.œç'œç œçœçœç œçœçý›çö›çï›çè›çá›çÚ›çÓ›çÌ›çś羛緛簛穛碛盛甛ç›ç†›ç›çx›çq›çj›çc›ç\›çU›çN›çG›ç@›ç9›ç2›ç+›ç$›ç›ç›ç›ç›ç›çúšçóšçìšçåšçÞšçךçКçÉšçšç»šç´šç­šç¦šçŸšç˜šç‘šçŠšçƒšç|šçušçnšçgšç`šçYšçRšçKšçDšç=šç6šç/šç(šç!šçšçšç šçšçþ™ç÷™çð™çé™çâ™çÛ™çÔ™çÍ™çÆ™ç¿™ç¸™ç±™çª™ç£™çœ™ç•™çŽ™ç‡™ç€™çy™çr™çk™çd™ç]™çV™çO™çH™çA™ç:™ç3™ç,™ç%™ç™ç™ç™ç ™ç™çû˜çô˜çí˜çæ˜çߘçؘçјçʘçØç¼˜çµ˜ç®˜ç§˜ç ˜ç™˜ç’˜ç‹˜ç„˜ç}˜çv˜ço˜çh˜ça˜çZ˜çS˜çL˜çE˜ç>˜ç7˜ç0˜ç)˜ç"˜ç˜ç˜ç ˜ç˜çÿ—çø—çñ—çê—çã—çÜ—çÕ—çΗçÇ—çÀ—繗粗竗礗ç—ç–—ç—爗ç—çz—çs—çl—çe—ç^—çW—çP—çI—çB—ç;—ç4—ç-—ç&—ç—ç—ç—ç —ç—çü–çõ–çî–çç–çà–çÙ–çÒ–çË–çĖ罖綖篖稖硖皖瓖猖煖ç~–çw–çp–çi–çb–ç[–çT–çM–çF–ç?–ç8–ç1–ç*–ç#–ç–ç–ç–ç–ç–çù•çò•çë•çä•çÝ•çÖ•çÏ•çÈ•çÁ•纕糕笕祕瞕痕ç•牕炕ç{•çt•çm•çf•ç_•çX•çQ•çJ•çC•ç<•ç5•ç.•ç'•ç •ç•ç•ç •ç•çý”çö”çï”çè”çá”çÚ”çÓ”çÌ”çŔ羔緔簔穔碔盔甔ç”熔ç”çx”çq”çj”çc”ç\”çU”çN”çG”ç@”ç9”ç2”ç+”ç$”ç”ç”ç”ç”ç”çú“çó“çì“çå“çÞ“çדçГçÉ“ç“结紓筓禓矓瘓瑓犓烓ç|“çu“çn“çg“ç`“çY“çR“çK“çD“ç=“ç6“ç/“ç(“ç!“ç“ç“ç “ç“çþ’ç÷’çð’çé’çâ’çÛ’çÔ’çÍ’çÆ’ç¿’ç¸’ç±’çª’ç£’çœ’ç•’çŽ’ç‡’ç€’çy’çr’çk’çd’ç]’çV’çO’çH’çA’ç:’ç3’ç,’ç%’ç’ç’ç’ç ’ç’çû‘çô‘çí‘çæ‘çß‘çØ‘çÑ‘çÊ‘çÑ缑絑箑科砑癑璑狑焑ç}‘çv‘ço‘çh‘ça‘çZ‘çS‘çL‘çE‘ç>‘ç7‘ç0‘ç)‘ç"‘ç‘ç‘ç ‘ç‘çÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùŽçòŽçëŽçäŽçÝŽçÖŽçÏŽçÈŽçÁŽçºŽç³Žç¬Žç¥ŽçžŽç—ŽçŽç‰Žç‚Žç{ŽçtŽçmŽçfŽç_ŽçXŽçQŽçJŽçCŽç<Žç5Žç.Žç'Žç ŽçŽçŽç ŽçŽçýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúŒçóŒçìŒçåŒçÞŒç׌çÐŒçÉŒçŒ绌紌筌禌矌瘌瑌犌烌ç|ŒçuŒçnŒçgŒç`ŒçYŒçRŒçKŒçDŒç=Œç6Œç/Œç(Œç!ŒçŒçŒç ŒçŒçþ‹ç÷‹çð‹çé‹çâ‹çÛ‹çÔ‹çÍ‹çÆ‹ç¿‹ç¸‹ç±‹çª‹ç£‹çœ‹ç•‹çŽ‹ç‡‹ç€‹çy‹çr‹çk‹çd‹ç]‹çV‹çO‹çH‹çA‹ç:‹ç3‹ç,‹ç%‹ç‹ç‹ç‹ç ‹ç‹çûŠçôŠçíŠçæŠçߊçØŠçÑŠçÊŠçÊ缊絊箊秊砊癊璊狊焊ç}ŠçvŠçoŠçhŠçaŠçZŠçSŠçLŠçEŠç>Šç7Šç0Šç)Šç"ŠçŠçŠç ŠçŠçÿ‰çø‰çñ‰çê‰çã‰ç܉çÕ‰çΉçljçÀ‰ç¹‰ç²‰ç«‰ç¤‰ç‰ç–‰ç‰çˆ‰ç‰çz‰çs‰çl‰çe‰ç^‰çW‰çP‰çI‰çB‰ç;‰ç4‰ç-‰ç&‰ç‰ç‰ç‰ç ‰ç‰çüˆçõˆçîˆççˆçàˆçÙˆçÒˆçˈçĈ罈綈篈稈硈皈瓈猈煈ç~ˆçwˆçpˆçiˆçbˆç[ˆçTˆçMˆçFˆç?ˆç8ˆç1ˆç*ˆç#ˆçˆçˆçˆçˆçˆçù‡çò‡çë‡çä‡ç݇çÖ‡çχçȇçÁ‡çº‡ç³‡ç¬‡ç¥‡çž‡ç—‡ç‡ç‰‡ç‚‡ç{‡çt‡çm‡çf‡ç_‡çX‡çQ‡çJ‡çC‡ç<‡ç5‡ç.‡ç'‡ç ‡ç‡ç‡ç ‡ç‡çý†çö†çï†çè†çá†çÚ†çÓ†ç̆çņ羆緆簆穆碆盆甆ç†ç††ç†çx†çq†çj†çc†ç\†çU†çN†çG†ç@†ç9†ç2†ç+†ç$†ç†ç†ç†ç†ç†çú…çó…çì…çå…çÞ…ç×…çÐ…çÉ…ç…绅紅筅禅矅瘅瑅犅烅ç|…çu…çn…çg…ç`…çY…çR…çK…çD…ç=…ç6…ç/…ç(…ç!…ç…ç…ç …ç…çþ„ç÷„çð„çé„çâ„çÛ„çÔ„çÍ„çÆ„ç¿„ç¸„ç±„çª„ç£„çœ„ç•„çŽ„ç‡„ç€„çy„çr„çk„çd„ç]„çV„çO„çH„çA„ç:„ç3„ç,„ç%„ç„ç„ç„ç „ç„çûƒçôƒçíƒçæƒç߃ç؃çуçʃçÃ缃絃箃秃砃癃璃狃焃ç}ƒçvƒçoƒçhƒçaƒçZƒçSƒçLƒçEƒç>ƒç7ƒç0ƒç)ƒç"ƒçƒçƒç ƒçƒçÿ‚çø‚çñ‚çê‚çã‚çÜ‚çÕ‚ç΂çÇ‚çÀ‚繂粂竂礂ç‚ç–‚ç‚爂ç‚çz‚çs‚çl‚çe‚ç^‚çW‚çP‚çI‚çB‚ç;‚ç4‚ç-‚ç&‚ç‚ç‚ç‚ç ‚ç‚çüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççù€çò€çë€çä€çÝ€çÖ€çÏ€çÈ€çÁ€çº€ç³€ç¬€ç¥€çž€ç—€ç€ç‰€ç‚€ç{€çt€çm€çf€ç_€çX€çQ€çJ€çC€ç<€ç5€ç.€ç'€ç €ç€ç€ç €ç€çýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççú~çó~çì~çå~çÞ~ç×~çÐ~çÉ~çÂ~ç»~ç´~ç­~ç¦~çŸ~ç˜~ç‘~çŠ~çƒ~ç|~çu~çn~çg~ç`~çY~çR~çK~çD~ç=~ç6~ç/~ç(~ç!~ç~ç~ç ~ç~çþ}ç÷}çð}çé}çâ}çÛ}çÔ}çÍ}çÆ}ç¿}ç¸}ç±}çª}ç£}çœ}ç•}çŽ}ç‡}ç€}çy}çr}çk}çd}ç]}çV}çO}çH}çA}ç:}ç3}ç,}ç%}ç}ç}ç}ç }ç}çû|çô|çí|çæ|çß|çØ|çÑ|çÊ|çÃ|ç¼|çµ|ç®|ç§|ç |ç™|ç’|ç‹|ç„|ç}|çv|ço|çh|ça|çZ|çS|çL|çE|ç>|ç7|ç0|ç)|ç"|ç|ç|ç |ç|çÿ{çø{çñ{çê{çã{çÜ{çÕ{çÎ{çÇ{çÀ{ç¹{ç²{ç«{ç¤{ç{ç–{ç{çˆ{ç{çz{çs{çl{çe{ç^{çW{çP{çI{çB{ç;{ç4{ç-{ç&{ç{ç{ç{ç {ç{çüzçõzçîzççzçàzçÙzçÒzçËzçÄzç½zç¶zç¯zç¨zç¡zçšzç“zçŒzç…zç~zçwzçpzçizçbzç[zçTzçMzçFzç?zç8zç1zç*zç#zçzçzçzçzçzçùyçòyçëyçäyçÝyçÖyçÏyçÈyçÁyçºyç³yç¬yç¥yçžyç—yçyç‰yç‚yç{yçtyçmyçfyç_yçXyçQyçJyçCyçuç7uç0uç)uç"uçuçuç uçuçÿtçøtçñtçêtçãtçÜtçÕtçÎtçÇtçÀtç¹tç²tç«tç¤tçtç–tçtçˆtçtçztçstçltçetç^tçWtçPtçItçBtç;tç4tç-tç&tçtçtçtç tçtçüsçõsçîsççsçàsçÙsçÒsçËsçÄsç½sç¶sç¯sç¨sç¡sçšsç“sçŒsç…sç~sçwsçpsçisçbsç[sçTsçMsçFsç?sç8sç1sç*sç#sçsçsçsçsçsçùrçòrçërçärçÝrçÖrçÏrçÈrçÁrçºrç³rç¬rç¥rçžrç—rçrç‰rç‚rç{rçtrçmrçfrç_rçXrçQrçJrçCrçnç7nç0nç)nç"nçnçnç nçnçÿmçømçñmçêmçãmçÜmçÕmçÎmçÇmçÀmç¹mç²mç«mç¤mçmç–mçmçˆmçmçzmçsmçlmçemç^mçWmçPmçImçBmç;mç4mç-mç&mçmçmçmç mçmçülçõlçîlççlçàlçÙlçÒlçËlçÄlç½lç¶lç¯lç¨lç¡lçšlç“lçŒlç…lç~lçwlçplçilçblç[lçTlçMlçFlç?lç8lç1lç*lç#lçlçlçlçlçlçùkçòkçëkçäkçÝkçÖkçÏkçÈkçÁkçºkç³kç¬kç¥kçžkç—kçkç‰kç‚kç{kçtkçmkçfkç_kçXkçQkçJkçCkçgç7gç0gç)gç"gçgçgç gçgçÿfçøfçñfçêfçãfçÜfçÕfçÎfçÇfçÀfç¹fç²fç«fç¤fçfç–fçfçˆfçfçzfçsfçlfçefç^fçWfçPfçIfçBfç;fç4fç-fç&fçfçfçfç fçfçüeçõeçîeççeçàeçÙeçÒeçËeçÄeç½eç¶eç¯eç¨eç¡eçšeç“eçŒeç…eç~eçweçpeçieçbeç[eçTeçMeçFeç?eç8eç1eç*eç#eçeçeçeçeçeçùdçòdçëdçädçÝdçÖdçÏdçÈdçÁdçºdç³dç¬dç¥dçždç—dçdç‰dç‚dç{dçtdçmdçfdç_dçXdçQdçJdçCdç`ç7`ç0`ç)`ç"`ç`ç`ç `ç`çÿ_çø_çñ_çê_çã_çÜ_çÕ_çÎ_çÇ_çÀ_ç¹_ç²_ç«_ç¤_ç_ç–_ç_çˆ_ç_çz_çs_çl_çe_ç^_çW_çP_çI_çB_ç;_ç4_ç-_ç&_ç_ç_ç_ç _ç_çü^çõ^çî^çç^çà^çÙ^çÒ^çË^çÄ^ç½^ç¶^ç¯^ç¨^ç¡^çš^ç“^çŒ^ç…^ç~^çw^çp^çi^çb^ç[^çT^çM^çF^ç?^ç8^ç1^ç*^ç#^ç^ç^ç^ç^ç^çù]çò]çë]çä]çÝ]çÖ]çÏ]çÈ]çÁ]çº]ç³]ç¬]ç¥]çž]ç—]ç]ç‰]ç‚]ç{]çt]çm]çf]ç_]çX]çQ]çJ]çC]ç<]ç5]ç.]ç']ç ]ç]ç]ç ]ç]çý\çö\çï\çè\çá\çÚ\çÓ\çÌ\çÅ\ç¾\ç·\ç°\ç©\ç¢\ç›\ç”\ç\ç†\ç\çx\çq\çj\çc\ç\\çU\çN\çG\ç@\ç9\ç2\ç+\ç$\ç\ç\ç\ç\ç\çú[çó[çì[çå[çÞ[ç×[çÐ[çÉ[çÂ[ç»[ç´[ç­[ç¦[çŸ[ç˜[ç‘[çŠ[çƒ[ç|[çu[çn[çg[ç`[çY[çR[çK[çD[ç=[ç6[ç/[ç([ç![ç[ç[ç [ç[çþZç÷ZçðZçéZçâZçÛZçÔZçÍZçÆZç¿Zç¸Zç±ZçªZç£ZçœZç•ZçŽZç‡Zç€ZçyZçrZçkZçdZç]ZçVZçOZçHZçAZç:Zç3Zç,Zç%ZçZçZçZç ZçZçûYçôYçíYçæYçßYçØYçÑYçÊYçÃYç¼YçµYç®Yç§Yç Yç™Yç’Yç‹Yç„Yç}YçvYçoYçhYçaYçZYçSYçLYçEYç>Yç7Yç0Yç)Yç"YçYçYç YçYçÿXçøXçñXçêXçãXçÜXçÕXçÎXçÇXçÀXç¹Xç²Xç«Xç¤XçXç–XçXçˆXçXçzXçsXçlXçeXç^XçWXçPXçIXçBXç;Xç4Xç-Xç&XçXçXçXç XçXçüWçõWçîWççWçàWçÙWçÒWçËWçÄWç½Wç¶Wç¯Wç¨Wç¡WçšWç“WçŒWç…Wç~WçwWçpWçiWçbWç[WçTWçMWçFWç?Wç8Wç1Wç*Wç#WçWçWçWçWçWçùVçòVçëVçäVçÝVçÖVçÏVçÈVçÁVçºVç³Vç¬Vç¥VçžVç—VçVç‰Vç‚Vç{VçtVçmVçfVç_VçXVçQVçJVçCVçRç7Rç0Rç)Rç"RçRçRç RçRçÿQçøQçñQçêQçãQçÜQçÕQçÎQçÇQçÀQç¹Qç²Qç«Qç¤QçQç–QçQçˆQçQçzQçsQçlQçeQç^QçWQçPQçIQçBQç;Qç4Qç-Qç&QçQçQçQç QçQçüPçõPçîPççPçàPçÙPçÒPçËPçÄPç½Pç¶Pç¯Pç¨Pç¡PçšPç“PçŒPç…Pç~PçwPçpPçiPçbPç[PçTPçMPçFPç?Pç8Pç1Pç*Pç#PçPçPçPçPçPçùOçòOçëOçäOçÝOçÖOçÏOçÈOçÁOçºOç³Oç¬Oç¥OçžOç—OçOç‰Oç‚Oç{OçtOçmOçfOç_OçXOçQOçJOçCOçKç7Kç0Kç)Kç"KçKçKç KçKçÿJçøJçñJçêJçãJçÜJçÕJçÎJçÇJçÀJç¹Jç²Jç«Jç¤JçJç–JçJçˆJçJçzJçsJçlJçeJç^JçWJçPJçIJçBJç;Jç4Jç-Jç&JçJçJçJç JçJçüIçõIçîIççIçàIçÙIçÒIçËIçÄIç½Iç¶Iç¯Iç¨Iç¡IçšIç“IçŒIç…Iç~IçwIçpIçiIçbIç[IçTIçMIçFIç?Iç8Iç1Iç*Iç#IçIçIçIçIçIçùHçòHçëHçäHçÝHçÖHçÏHçÈHçÁHçºHç³Hç¬Hç¥HçžHç—HçHç‰Hç‚Hç{HçtHçmHçfHç_HçXHçQHçJHçCHçDç7Dç0Dç)Dç"DçDçDç DçDçÿCçøCçñCçêCçãCçÜCçÕCçÎCçÇCçÀCç¹Cç²Cç«Cç¤CçCç–CçCçˆCçCçzCçsCçlCçeCç^CçWCçPCçICçBCç;Cç4Cç-Cç&CçCçCçCç CçCçüBçõBçîBççBçàBçÙBçÒBçËBçÄBç½Bç¶Bç¯Bç¨Bç¡BçšBç“BçŒBç…Bç~BçwBçpBçiBçbBç[BçTBçMBçFBç?Bç8Bç1Bç*Bç#BçBçBçBçBçBçùAçòAçëAçäAçÝAçÖAçÏAçÈAçÁAçºAç³Aç¬Aç¥AçžAç—AçAç‰Aç‚Aç{AçtAçmAçfAç_AçXAçQAçJAçCAçç÷>çð>çé>çâ>çÛ>çÔ>çÍ>çÆ>ç¿>ç¸>ç±>çª>ç£>çœ>ç•>çŽ>ç‡>ç€>çy>çr>çk>çd>ç]>çV>çO>çH>çA>ç:>ç3>ç,>ç%>ç>ç>ç>ç >ç>çû=çô=çí=çæ=çß=çØ=çÑ=çÊ=çÃ=ç¼=çµ=ç®=ç§=ç =ç™=ç’=ç‹=ç„=ç}=çv=ço=çh=ça=çZ=çS=çL=çE=ç>=ç7=ç0=ç)=ç"=ç=ç=ç =ç=çÿ<çø<çñ<çê<çã<çÜ<çÕ<çÎ<çÇ<çÀ<ç¹<ç²<ç«<ç¤<ç<ç–<ç<çˆ<ç<çz<çs<çl<çe<ç^<çW<çP<çI<çB<ç;<ç4<ç-<ç&<ç<ç<ç<ç <ç<çü;çõ;çî;çç;çà;çÙ;çÒ;çË;çÄ;ç½;ç¶;ç¯;ç¨;ç¡;çš;ç“;çŒ;ç…;ç~;çw;çp;çi;çb;ç[;çT;çM;çF;ç?;ç8;ç1;ç*;ç#;ç;ç;ç;ç;ç;çù:çò:çë:çä:çÝ:çÖ:çÏ:çÈ:çÁ:çº:ç³:ç¬:ç¥:çž:ç—:ç:ç‰:ç‚:ç{:çt:çm:çf:ç_:çX:çQ:çJ:çC:ç<:ç5:ç.:ç':ç :ç:ç:ç :ç:çý9çö9çï9çè9çá9çÚ9çÓ9çÌ9çÅ9ç¾9ç·9ç°9ç©9ç¢9ç›9ç”9ç9ç†9ç9çx9çq9çj9çc9ç\9çU9çN9çG9ç@9ç99ç29ç+9ç$9ç9ç9ç9ç9ç9çú8çó8çì8çå8çÞ8ç×8çÐ8çÉ8çÂ8ç»8ç´8ç­8ç¦8çŸ8ç˜8ç‘8çŠ8çƒ8ç|8çu8çn8çg8ç`8çY8çR8çK8çD8ç=8ç68ç/8ç(8ç!8ç8ç8ç 8ç8çþ7ç÷7çð7çé7çâ7çÛ7çÔ7çÍ7çÆ7ç¿7ç¸7ç±7çª7ç£7çœ7ç•7çŽ7ç‡7ç€7çy7çr7çk7çd7ç]7çV7çO7çH7çA7ç:7ç37ç,7ç%7ç7ç7ç7ç 7ç7çû6çô6çí6çæ6çß6çØ6çÑ6çÊ6çÃ6ç¼6çµ6ç®6ç§6ç 6ç™6ç’6ç‹6ç„6ç}6çv6ço6çh6ça6çZ6çS6çL6çE6ç>6ç76ç06ç)6ç"6ç6ç6ç 6ç6çÿ5çø5çñ5çê5çã5çÜ5çÕ5çÎ5çÇ5çÀ5ç¹5ç²5ç«5ç¤5ç5ç–5ç5çˆ5ç5çz5çs5çl5çe5ç^5çW5çP5çI5çB5ç;5ç45ç-5ç&5ç5ç5ç5ç 5ç5çü4çõ4çî4çç4çà4çÙ4çÒ4çË4çÄ4ç½4ç¶4ç¯4ç¨4ç¡4çš4ç“4çŒ4ç…4ç~4çw4çp4çi4çb4ç[4çT4çM4çF4ç?4ç84ç14ç*4ç#4ç4ç4ç4ç4ç4çù3çò3çë3çä3çÝ3çÖ3çÏ3çÈ3çÁ3çº3ç³3ç¬3ç¥3çž3ç—3ç3ç‰3ç‚3ç{3çt3çm3çf3ç_3çX3çQ3çJ3çC3ç<3ç53ç.3ç'3ç 3ç3ç3ç 3ç3çý2çö2çï2çè2çá2çÚ2çÓ2çÌ2çÅ2ç¾2ç·2ç°2ç©2ç¢2ç›2ç”2ç2ç†2ç2çx2çq2çj2çc2ç\2çU2çN2çG2ç@2ç92ç22ç+2ç$2ç2ç2ç2ç2ç2çú1çó1çì1çå1çÞ1ç×1çÐ1çÉ1çÂ1ç»1ç´1ç­1ç¦1çŸ1ç˜1ç‘1çŠ1çƒ1ç|1çu1çn1çg1ç`1çY1çR1çK1çD1ç=1ç61ç/1ç(1ç!1ç1ç1ç 1ç1çþ0ç÷0çð0çé0çâ0çÛ0çÔ0çÍ0çÆ0ç¿0ç¸0ç±0çª0ç£0çœ0ç•0çŽ0ç‡0ç€0çy0çr0çk0çd0ç]0çV0çO0çH0çA0ç:0ç30ç,0ç%0ç0ç0ç0ç 0ç0çû/çô/çí/çæ/çß/çØ/çÑ/çÊ/çÃ/ç¼/çµ/ç®/ç§/ç /ç™/ç’/ç‹/ç„/ç}/çv/ço/çh/ça/çZ/çS/çL/çE/ç>/ç7/ç0/ç)/ç"/ç/ç/ç /ç/çÿ.çø.çñ.çê.çã.çÜ.çÕ.çÎ.çÇ.çÀ.ç¹.ç².ç«.ç¤.ç.ç–.ç.çˆ.ç.çz.çs.çl.çe.ç^.çW.çP.çI.çB.ç;.ç4.ç-.ç&.ç.ç.ç.ç .ç.çü-çõ-çî-çç-çà-çÙ-çÒ-çË-çÄ-ç½-ç¶-ç¯-ç¨-ç¡-çš-ç“-çŒ-ç…-ç~-çw-çp-çi-çb-ç[-çT-çM-çF-ç?-ç8-ç1-ç*-ç#-ç-ç-ç-ç-ç-çù,çò,çë,çä,çÝ,çÖ,çÏ,çÈ,çÁ,çº,ç³,ç¬,ç¥,çž,ç—,ç,ç‰,ç‚,ç{,çt,çm,çf,ç_,çX,çQ,çJ,çC,ç<,ç5,ç.,ç',ç ,ç,ç,ç ,ç,çý+çö+çï+çè+çá+çÚ+çÓ+çÌ+çÅ+ç¾+ç·+ç°+ç©+ç¢+ç›+ç”+ç+ç†+ç+çx+çq+çj+çc+ç\+çU+çN+çG+ç@+ç9+ç2+ç++ç$+ç+ç+ç+ç+ç+çú*çó*çì*çå*çÞ*ç×*çÐ*çÉ*çÂ*ç»*ç´*ç­*ç¦*çŸ*ç˜*ç‘*çŠ*çƒ*ç|*çu*çn*çg*ç`*çY*çR*çK*çD*ç=*ç6*ç/*ç(*ç!*ç*ç*ç *ç*çþ)ç÷)çð)çé)çâ)çÛ)çÔ)çÍ)çÆ)ç¿)ç¸)ç±)çª)ç£)çœ)ç•)çŽ)ç‡)ç€)çy)çr)çk)çd)ç])çV)çO)çH)çA)ç:)ç3)ç,)ç%)ç)ç)ç)ç )ç)çû(çô(çí(çæ(çß(çØ(çÑ(çÊ(çÃ(ç¼(çµ(ç®(ç§(ç (ç™(ç’(ç‹(ç„(ç}(çv(ço(çh(ça(çZ(çS(çL(çE(ç>(ç7(ç0(ç)(ç"(ç(ç(ç (ç(çÿ'çø'çñ'çê'çã'çÜ'çÕ'çÎ'çÇ'çÀ'ç¹'ç²'ç«'ç¤'ç'ç–'ç'çˆ'ç'çz'çs'çl'çe'ç^'çW'çP'çI'çB'ç;'ç4'ç-'ç&'ç'ç'ç'ç 'ç'çü&çõ&çî&çç&çà&çÙ&çÒ&çË&çÄ&ç½&ç¶&ç¯&ç¨&ç¡&çš&ç“&çŒ&ç…&ç~&çw&çp&çi&çb&ç[&çT&çM&çF&ç?&ç8&ç1&ç*&ç#&ç&ç&ç&ç&ç&çù%çò%çë%çä%çÝ%çÖ%çÏ%çÈ%çÁ%çº%ç³%ç¬%ç¥%çž%ç—%ç%ç‰%ç‚%ç{%çt%çm%çf%ç_%çX%çQ%çJ%çC%ç<%ç5%ç.%ç'%ç %ç%ç%ç %ç%çý$çö$çï$çè$çá$çÚ$çÓ$çÌ$çÅ$ç¾$ç·$ç°$ç©$ç¢$ç›$ç”$ç$ç†$ç$çx$çq$çj$çc$ç\$çU$çN$çG$ç@$ç9$ç2$ç+$ç$$ç$ç$ç$ç$ç$çú#çó#çì#çå#çÞ#ç×#çÐ#çÉ#çÂ#ç»#ç´#ç­#ç¦#çŸ#ç˜#ç‘#çŠ#çƒ#ç|#çu#çn#çg#ç`#çY#çR#çK#çD#ç=#ç6#ç/#ç(#ç!#ç#ç#ç #ç#çþ"ç÷"çð"çé"çâ"çÛ"çÔ"çÍ"çÆ"ç¿"ç¸"ç±"çª"ç£"çœ"ç•"çŽ"ç‡"ç€"çy"çr"çk"çd"ç]"çV"çO"çH"çA"ç:"ç3"ç,"ç%"ç"ç"ç"ç "ç"çû!çô!çí!çæ!çß!çØ!çÑ!çÊ!çÃ!ç¼!çµ!ç®!ç§!ç !ç™!ç’!ç‹!ç„!ç}!çv!ço!çh!ça!çZ!çS!çL!çE!ç>!ç7!ç0!ç)!ç"!ç!ç!ç !ç!çÿ çø çñ çê çã çÜ çÕ çÎ çÇ çÀ ç¹ ç² ç« ç¤ ç ç– ç çˆ ç çz çs çl çe ç^ çW çP çI çB ç; ç4 ç- ç& ç ç ç ç ç çüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþ ç÷ çð çé çâ çÛ çÔ çÍ çÆ ç¿ ç¸ ç± çª ç£ çœ ç• çŽ ç‡ ç€ çy çr çk çd ç] çV çO çH çA ç: ç3 ç, ç% ç ç ç ç ç çû çô çí çæ çß çØ çÑ çÊ çà ç¼ çµ ç® ç§ ç  ç™ ç’ ç‹ ç„ ç} çv ço çh ça çZ çS çL çE ç> ç7 ç0 ç) ç" ç ç ç ç çÿ çø çñ çê çã çÜ çÕ çÎ çÇ çÀ ç¹ ç² ç« ç¤ ç ç– ç çˆ ç çz çs çl çe ç^ çW çP çI çB ç; ç4 ç- ç& ç ç ç ç ç çü çõ çî çç çà çÙ çÒ çË çÄ ç½ ç¶ ç¯ ç¨ ç¡ çš ç“ çŒ ç… ç~ çw çp çi çb ç[ çT çM çF ç? ç8 ç1 ç* ç# ç ç ç ç ç çù çò çë çä çÝ çÖ çÏ çÈ çÁ çº ç³ ç¬ ç¥ çž ç— ç ç‰ ç‚ ç{ çt çm çf ç_ çX çQ çJ çC ç< ç5 ç. ç' ç ç ç ç ç çýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþÿæ÷ÿæðÿæéÿæâÿæÛÿæÔÿæÍÿæÆÿæ¿ÿæ¸ÿæ±ÿæªÿæ£ÿæœÿæ•ÿæŽÿæ‡ÿæ€ÿæyÿærÿækÿædÿæ]ÿæVÿæOÿæHÿæAÿæ:ÿæ3ÿæ,ÿæ%ÿæÿæÿæÿæ ÿæÿæûþæôþæíþææþæßþæØþæÑþæÊþæÃþæ¼þæµþæ®þæ§þæ þæ™þæ’þæ‹þæ„þæ}þævþæoþæhþæaþæZþæSþæLþæEþæ>þæ7þæ0þæ)þæ"þæþæþæ þæþæÿýæøýæñýæêýæãýæÜýæÕýæÎýæÇýæÀýæ¹ýæ²ýæ«ýæ¤ýæýæ–ýæýæˆýæýæzýæsýælýæeýæ^ýæWýæPýæIýæBýæ;ýæ4ýæ-ýæ&ýæýæýæýæ ýæýæüüæõüæîüæçüæàüæÙüæÒüæËüæÄüæ½üæ¶üæ¯üæ¨üæ¡üæšüæ“üæŒüæ…üæ~üæwüæpüæiüæbüæ[üæTüæMüæFüæ?üæ8üæ1üæ*üæ#üæüæüæüæüæüæùûæòûæëûæäûæÝûæÖûæÏûæÈûæÁûæºûæ³ûæ¬ûæ¥ûæžûæ—ûæûæ‰ûæ‚ûæ{ûætûæmûæfûæ_ûæXûæQûæJûæCûæ<ûæ5ûæ.ûæ'ûæ ûæûæûæ ûæûæýúæöúæïúæèúæáúæÚúæÓúæÌúæÅúæ¾úæ·úæ°úæ©úæ¢úæ›úæ”úæúæ†úæúæxúæqúæjúæcúæ\úæUúæNúæGúæ@úæ9úæ2úæ+úæ$úæúæúæúæúæúæúùæóùæìùæåùæÞùæ×ùæÐùæÉùæÂùæ»ùæ´ùæ­ùæ¦ùæŸùæ˜ùæ‘ùæŠùæƒùæ|ùæuùænùægùæ`ùæYùæRùæKùæDùæ=ùæ6ùæ/ùæ(ùæ!ùæùæùæ ùæùæþøæ÷øæðøæéøæâøæÛøæÔøæÍøæÆøæ¿øæ¸øæ±øæªøæ£øæœøæ•øæŽøæ‡øæ€øæyøærøækøædøæ]øæVøæOøæHøæAøæ:øæ3øæ,øæ%øæøæøæøæ øæøæû÷æô÷æí÷ææ÷æß÷æØ÷æÑ÷æÊ÷æÃ÷æ¼÷æµ÷æ®÷æ§÷æ ÷æ™÷æ’÷æ‹÷æ„÷æ}÷æv÷æo÷æh÷æa÷æZ÷æS÷æL÷æE÷æ>÷æ7÷æ0÷æ)÷æ"÷æ÷æ÷æ ÷æ÷æÿöæøöæñöæêöæãöæÜöæÕöæÎöæÇöæÀöæ¹öæ²öæ«öæ¤öæöæ–öæöæˆöæöæzöæsöælöæeöæ^öæWöæPöæIöæBöæ;öæ4öæ-öæ&öæöæöæöæ öæöæüõæõõæîõæçõæàõæÙõæÒõæËõæÄõæ½õæ¶õæ¯õæ¨õæ¡õæšõæ“õæŒõæ…õæ~õæwõæpõæiõæbõæ[õæTõæMõæFõæ?õæ8õæ1õæ*õæ#õæõæõæõæõæõæùôæòôæëôæäôæÝôæÖôæÏôæÈôæÁôæºôæ³ôæ¬ôæ¥ôæžôæ—ôæôæ‰ôæ‚ôæ{ôætôæmôæfôæ_ôæXôæQôæJôæCôæ<ôæ5ôæ.ôæ'ôæ ôæôæôæ ôæôæýóæöóæïóæèóæáóæÚóæÓóæÌóæÅóæ¾óæ·óæ°óæ©óæ¢óæ›óæ”óæóæ†óæóæxóæqóæjóæcóæ\óæUóæNóæGóæ@óæ9óæ2óæ+óæ$óæóæóæóæóæóæúòæóòæìòæåòæÞòæ×òæÐòæÉòæÂòæ»òæ´òæ­òæ¦òæŸòæ˜òæ‘òæŠòæƒòæ|òæuòænòægòæ`òæYòæRòæKòæDòæ=òæ6òæ/òæ(òæ!òæòæòæ òæòæþñæ÷ñæðñæéñæâñæÛñæÔñæÍñæÆñæ¿ñæ¸ñæ±ñæªñæ£ñæœñæ•ñæŽñæ‡ñæ€ñæyñærñækñædñæ]ñæVñæOñæHñæAñæ:ñæ3ñæ,ñæ%ñæñæñæñæ ñæñæûðæôðæíðææðæßðæØðæÑðæÊðæÃðæ¼ðæµðæ®ðæ§ðæ ðæ™ðæ’ðæ‹ðæ„ðæ}ðævðæoðæhðæaðæZðæSðæLðæEðæ>ðæ7ðæ0ðæ)ðæ"ðæðæðæ ðæðæÿïæøïæñïæêïæãïæÜïæÕïæÎïæÇïæÀïæ¹ïæ²ïæ«ïæ¤ïæïæ–ïæïæˆïæïæzïæsïælïæeïæ^ïæWïæPïæIïæBïæ;ïæ4ïæ-ïæ&ïæïæïæïæ ïæïæüîæõîæîîæçîæàîæÙîæÒîæËîæÄîæ½îæ¶îæ¯îæ¨îæ¡îæšîæ“îæŒîæ…îæ~îæwîæpîæiîæbîæ[îæTîæMîæFîæ?îæ8îæ1îæ*îæ#îæîæîæîæîæîæùíæòíæëíæäíæÝíæÖíæÏíæÈíæÁíæºíæ³íæ¬íæ¥íæžíæ—íæíæ‰íæ‚íæ{íætíæmíæfíæ_íæXíæQíæJíæCíæ<íæ5íæ.íæ'íæ íæíæíæ íæíæýìæöìæïìæèìæáìæÚìæÓìæÌìæÅìæ¾ìæ·ìæ°ìæ©ìæ¢ìæ›ìæ”ìæìæ†ìæìæxìæqìæjìæcìæ\ìæUìæNìæGìæ@ìæ9ìæ2ìæ+ìæ$ìæìæìæìæìæìæúëæóëæìëæåëæÞëæ×ëæÐëæÉëæÂëæ»ëæ´ëæ­ëæ¦ëæŸëæ˜ëæ‘ëæŠëæƒëæ|ëæuëænëægëæ`ëæYëæRëæKëæDëæ=ëæ6ëæ/ëæ(ëæ!ëæëæëæ ëæëæþêæ÷êæðêæéêæâêæÛêæÔêæÍêæÆêæ¿êæ¸êæ±êæªêæ£êæœêæ•êæŽêæ‡êæ€êæyêærêækêædêæ]êæVêæOêæHêæAêæ:êæ3êæ,êæ%êæêæêæêæ êæêæûéæôéæíéææéæß鿨éæÑéæÊéæÃ鿼鿵鿮鿧鿠鿙鿒鿋鿄éæ}éævéæoéæhéæaéæZéæSéæLéæEéæ>éæ7éæ0éæ)éæ"éæéæéæ éæéæÿèæøèæñèæêèæãèæÜèæÕèæÎèæÇèæÀèæ¹èæ²èæ«èæ¤èæèæ–èæèæˆèæèæzèæsèælèæeèæ^èæWèæPèæIèæBèæ;èæ4èæ-èæ&èæèæèæèæ èæèæüçæõçæîçæççæàçæÙçæÒçæËçæÄçæ½çæ¶çæ¯çæ¨çæ¡çæšçæ“çæŒçæ…çæ~çæwçæpçæiçæbçæ[çæTçæMçæFçæ?çæ8çæ1çæ*çæ#çæçæçæçæçæçæùææòææëææäææÝææÖææÏææÈææÁææºææ³ææ¬ææ¥ææžææ—ææææ‰ææ‚ææ{æætææmææfææ_ææXææQææJææCææ<ææ5ææ.ææ'ææ ææææææ ææææýåæöåæïåæèåæáåæÚåæÓåæÌåæÅ忾忷忰忩忢忛忔åæåæ†åæåæxåæqåæjåæcåæ\åæUåæNåæGåæ@åæ9åæ2åæ+åæ$åæåæåæåæåæåæúäæóäæìäæåäæÞäæ×äæÐäæÉäæÂäæ»äæ´äæ­äæ¦äæŸäæ˜äæ‘äæŠäæƒäæ|äæuäænäægäæ`äæYäæRäæKäæDäæ=äæ6äæ/äæ(äæ!äæäæäæ äæäæþãæ÷ãæðãæéãæâãæÛãæÔãæÍãæÆãæ¿ãæ¸ãæ±ãæªãæ£ãæœãæ•ãæŽãæ‡ãæ€ãæyãærãækãædãæ]ãæVãæOãæHãæAãæ:ãæ3ãæ,ãæ%ãæãæãæãæ ãæãæûâæôâæíâææâæßâæØâæÑâæÊâæÃâæ¼âæµâæ®âæ§âæ âæ™âæ’âæ‹âæ„âæ}âævâæoâæhâæaâæZâæSâæLâæEâæ>âæ7âæ0âæ)âæ"âæâæâæ âæâæÿáæøáæñáæêáæãáæÜáæÕáæÎáæÇáæÀáæ¹áæ²áæ«áæ¤áæáæ–áæáæˆáæáæzáæsáæláæeáæ^áæWáæPáæIáæBáæ;áæ4áæ-áæ&áæáæáæáæ áæáæüàæõàæîàæçàæààæÙàæÒàæËàæÄàæ½àæ¶àæ¯àæ¨àæ¡àæšàæ“àæŒàæ…àæ~àæwàæpàæiàæbàæ[àæTàæMàæFàæ?àæ8àæ1àæ*àæ#àæàæàæàæàæàæùßæòßæëßæäßæÝßæÖßæÏßæÈßæÁßæºßæ³ßæ¬ßæ¥ßæžßæ—ßæßæ‰ßæ‚ßæ{ßætßæmßæfßæ_ßæXßæQßæJßæCßæ<ßæ5ßæ.ßæ'ßæ ßæßæßæ ßæßæýÞæöÞæïÞæèÞæáÞæÚÞæÓÞæÌÞæÅÞæ¾Þæ·Þæ°Þæ©Þæ¢Þæ›Þæ”ÞæÞæ†ÞæÞæxÞæqÞæjÞæcÞæ\ÞæUÞæNÞæGÞæ@Þæ9Þæ2Þæ+Þæ$ÞæÞæÞæÞæÞæÞæúÝæóÝæìÝæåÝæÞÝæ×ÝæÐÝæÉÝæÂÝæ»Ýæ´Ýæ­Ýæ¦ÝæŸÝæ˜Ýæ‘ÝæŠÝæƒÝæ|ÝæuÝænÝægÝæ`ÝæYÝæRÝæKÝæDÝæ=Ýæ6Ýæ/Ýæ(Ýæ!ÝæÝæÝæ ÝæÝæþÜæ÷ÜæðÜæéÜæâÜæÛÜæÔÜæÍÜæÆÜæ¿Üæ¸Üæ±ÜæªÜæ£ÜæœÜæ•ÜæŽÜæ‡Üæ€ÜæyÜærÜækÜædÜæ]ÜæVÜæOÜæHÜæAÜæ:Üæ3Üæ,Üæ%ܿܿܿܿ ܿܿûÛæôÛæíÛææÛæßÛæØÛæÑÛæÊÛæÃÛæ¼ÛæµÛæ®Ûæ§Ûæ Ûæ™Ûæ’Ûæ‹Ûæ„Ûæ}ÛævÛæoÛæhÛæaÛæZÛæSÛæLÛæEÛæ>Ûæ7Ûæ0Ûæ)Ûæ"ÛæÛæÛæ ÛæÛæÿÚæøÚæñÚæêÚæãÚæÜÚæÕÚæÎÚæÇÚæÀÚæ¹Úæ²Úæ«Úæ¤ÚæÚæ–ÚæÚæˆÚæÚæzÚæsÚælÚæeÚæ^ÚæWÚæPÚæIÚæBÚæ;Úæ4Úæ-Úæ&ÚæÚæÚæÚæ ÚæÚæüÙæõÙæîÙæçÙæàÙæÙÙæÒÙæËÙæÄÙæ½Ùæ¶Ùæ¯Ùæ¨Ùæ¡ÙæšÙæ“ÙæŒÙæ…Ùæ~ÙæwÙæpÙæiÙæbÙæ[ÙæTÙæMÙæFÙæ?Ùæ8Ùæ1Ùæ*Ùæ#ÙæÙæÙæÙæÙæÙæùØæòØæëØæ䨿ÝØæÖØæÏØæÈØæÁØæºØæ³Øæ¬Øæ¥ØæžØæ—ØæØæ‰Øæ‚Øæ{ØætØæmØæfØæ_ØæXØæQØæJØæCØæ<Øæ5Øæ.Øæ'Øæ ØæØæØæ ØæØæý׿ö׿ï׿è׿á׿Ú׿Ó׿Ì׿Å׿¾×æ·×æ°×æ©×æ¢×æ›×æ”׿׿†×æ׿x׿q׿j׿c׿\׿U׿N׿G׿@׿9׿2׿+׿$׿׿׿׿׿׿úÖæóÖæìÖæåÖæÞÖæ×ÖæÐÖæÉÖæÂÖæ»Öæ´Öæ­Öæ¦ÖæŸÖæ˜Öæ‘ÖæŠÖæƒÖæ|ÖæuÖænÖægÖæ`ÖæYÖæRÖæKÖæDÖæ=Öæ6Öæ/Öæ(Öæ!ÖæÖæÖæ ÖæÖæþÕæ÷ÕæðÕæéÕæâÕæÛÕæÔÕæÍÕæÆÕæ¿Õæ¸Õæ±ÕæªÕæ£ÕæœÕæ•ÕæŽÕæ‡Õæ€ÕæyÕærÕækÕædÕæ]ÕæVÕæOÕæHÕæAÕæ:Õæ3Õæ,Õæ%ÕæÕæÕæÕæ ÕæÕæûÔæôÔæíÔææÔæßÔæØÔæÑÔæÊÔæÃÔæ¼ÔæµÔæ®Ôæ§Ôæ Ôæ™Ôæ’Ôæ‹Ôæ„Ôæ}ÔævÔæoÔæhÔæaÔæZÔæSÔæLÔæEÔæ>Ôæ7Ôæ0Ôæ)Ôæ"ÔæÔæÔæ ÔæÔæÿÓæøÓæñÓæêÓæãÓæÜÓæÕÓæÎÓæÇÓæÀÓæ¹Óæ²Óæ«Óæ¤ÓæÓæ–ÓæÓæˆÓæÓæzÓæsÓælÓæeÓæ^ÓæWÓæPÓæIÓæBÓæ;Óæ4Óæ-Óæ&ÓæÓæÓæÓæ ÓæÓæüÒæõÒæîÒæçÒæàÒæÙÒæÒÒæËÒæÄÒæ½Òæ¶Òæ¯Òæ¨Òæ¡ÒæšÒæ“ÒæŒÒæ…Òæ~ÒæwÒæpÒæiÒæbÒæ[ÒæTÒæMÒæFÒæ?Òæ8Òæ1Òæ*Òæ#ÒæÒæÒæÒæÒæÒæùÑæòÑæëÑæäÑæÝÑæÖÑæÏÑæÈÑæÁÑæºÑæ³Ñæ¬Ñæ¥ÑæžÑæ—ÑæÑæ‰Ñæ‚Ñæ{ÑætÑæmÑæfÑæ_ÑæXÑæQÑæJÑæCÑæ<Ñæ5Ñæ.Ñæ'Ñæ ÑæÑæÑæ ÑæÑæýÐæöÐæïÐæèÐæáÐæÚÐæÓÐæÌÐæÅÐæ¾Ðæ·Ðæ°Ðæ©Ðæ¢Ðæ›Ðæ”ÐæÐæ†ÐæÐæxÐæqÐæjÐæcÐæ\ÐæUÐæNÐæGÐæ@Ðæ9Ðæ2Ðæ+Ðæ$ÐæÐæÐæÐæÐæÐæúÏæóÏæìÏæåÏæÞÏæ×ÏæÐÏæÉÏæÂÏæ»Ïæ´Ïæ­Ïæ¦ÏæŸÏæ˜Ïæ‘ÏæŠÏæƒÏæ|ÏæuÏænÏægÏæ`ÏæYÏæRÏæKÏæDÏæ=Ïæ6Ïæ/Ïæ(Ïæ!ÏæÏæÏæ ÏæÏæþÎæ÷ÎæðÎæéÎæâÎæÛÎæÔÎæÍÎæÆÎæ¿Îæ¸Îæ±ÎæªÎæ£ÎæœÎæ•ÎæŽÎæ‡Îæ€ÎæyÎærÎækÎædÎæ]ÎæVÎæOÎæHÎæAÎæ:Îæ3Îæ,Îæ%ÎæÎæÎæÎæ ÎæÎæûÍæôÍæíÍææÍæßÍæØÍæÑÍæÊÍæÃÍæ¼ÍæµÍæ®Íæ§Íæ Íæ™Íæ’Íæ‹Íæ„Íæ}ÍævÍæoÍæhÍæaÍæZÍæSÍæLÍæEÍæ>Íæ7Íæ0Íæ)Íæ"ÍæÍæÍæ ÍæÍæÿÌæøÌæñÌæêÌæãÌæÜÌæÕÌæÎÌæÇÌæÀÌæ¹Ìæ²Ìæ«Ìæ¤ÌæÌæ–ÌæÌæˆÌæÌæzÌæsÌælÌæeÌæ^ÌæWÌæPÌæIÌæBÌæ;Ìæ4Ìæ-Ìæ&ÌæÌæÌæÌæ ÌæÌæüËæõËæîËæçËæàËæÙËæÒËæËËæÄËæ½Ëæ¶Ëæ¯Ëæ¨Ëæ¡ËæšËæ“ËæŒËæ…Ëæ~ËæwËæpËæiËæbËæ[ËæTËæMËæFËæ?Ëæ8Ëæ1Ëæ*Ëæ#ËæËæËæËæËæËæùÊæòÊæëÊæäÊæÝÊæÖÊæÏÊæÈÊæÁÊæºÊæ³Êæ¬Êæ¥ÊæžÊæ—ÊæÊæ‰Êæ‚Êæ{ÊætÊæmÊæfÊæ_ÊæXÊæQÊæJÊæCÊæ<Êæ5Êæ.Êæ'Êæ ÊæÊæÊæ ÊæÊæýÉæöÉæïÉæèÉæáÉæÚÉæÓÉæÌÉæÅÉæ¾Éæ·Éæ°Éæ©Éæ¢Éæ›Éæ”ɿɿ†ÉæÉæxÉæqÉæjÉæcÉæ\ÉæUÉæNÉæGÉæ@Éæ9Éæ2Éæ+Éæ$ɿɿɿɿɿɿúÈæóÈæìÈæåÈæÞÈæ×ÈæÐÈæÉÈæÂÈæ»Èæ´Èæ­Èæ¦ÈæŸÈæ˜Èæ‘ÈæŠÈæƒÈæ|ÈæuÈænÈægÈæ`ÈæYÈæRÈæKÈæDÈæ=Èæ6Èæ/Èæ(Èæ!ÈæÈæÈæ ÈæÈæþÇæ÷ÇæðÇæéÇæâÇæÛÇæÔÇæÍÇæÆÇæ¿Çæ¸Çæ±ÇæªÇæ£ÇæœÇæ•ÇæŽÇæ‡Çæ€ÇæyÇærÇækÇædÇæ]ÇæVÇæOÇæHÇæAÇæ:Çæ3Çæ,Çæ%ÇæÇæÇæÇæ ÇæÇæûÆæôÆæíÆææÆæ߯æØÆæÑÆæÊÆæÃÆæ¼ÆæµÆæ®Ææ§Ææ Ææ™Ææ’Ææ‹Ææ„Ææ}ÆævÆæoÆæhÆæaÆæZÆæSÆæLÆæEÆæ>Ææ7Ææ0Ææ)Ææ"ÆæÆæÆæ ÆæÆæÿÅæøÅæñÅæêÅæãÅæÜÅæÕÅæÎÅæÇÅæÀÅæ¹Åæ²Åæ«Åæ¤ÅæÅæ–ſſˆÅæÅæzÅæsÅælÅæeÅæ^ÅæWÅæPÅæIÅæBÅæ;Åæ4Åæ-Åæ&ſſſſ ſſüÄæõÄæîÄæçÄæàÄæÙÄæÒÄæËÄæÄÄæ½Äæ¶Äæ¯Äæ¨Äæ¡ÄæšÄæ“ÄæŒÄæ…Äæ~ÄæwÄæpÄæiÄæbÄæ[ÄæTÄæMÄæFÄæ?Äæ8Äæ1Äæ*Äæ#ĿĿĿĿĿĿùÃæòÃæëÃæäÃæÝÃæÖÃæÏÃæÈÃæÁÃæºÃæ³Ãæ¬Ãæ¥ÃæžÃæ—̾̾‰Ãæ‚Ãæ{ÃætÃæmÃæfÃæ_ÃæXÃæQÃæJÃæCÃæ<Ãæ5Ãæ.Ãæ'Ãæ ̾̾̾ ̾̾ýÂæöÂæïÂæèÂæáÂæÚÂæÓÂæÌÂæÅÂæ¾Âæ·Âæ°Âæ©Âæ¢Âæ›Âæ”ÂæÂæ†ÂæÂæxÂæqÂæjÂæcÂæ\ÂæUÂæNÂæGÂæ@Âæ9Âæ2Âæ+Âæ$ÂæÂæÂæÂæÂæÂæúÁæóÁæìÁæåÁæÞÁæ×ÁæÐÁæÉÁæÂÁæ»Áæ´Áæ­Áæ¦ÁæŸÁæ˜Áæ‘ÁæŠÁæƒÁæ|ÁæuÁænÁægÁæ`ÁæYÁæRÁæKÁæDÁæ=Áæ6Áæ/Áæ(Áæ!ÁæÁæÁæ ÁæÁæþÀæ÷ÀæðÀæéÀæâÀæÛÀæÔÀæÍÀæÆÀæ¿Àæ¸Àæ±ÀæªÀæ£ÀæœÀæ•ÀæŽÀæ‡Àæ€ÀæyÀærÀækÀædÀæ]ÀæVÀæOÀæHÀæAÀæ:Àæ3Àæ,Àæ%ÀæÀæÀæÀæ ÀæÀæû¿æô¿æí¿ææ¿æß¿æØ¿æÑ¿æÊ¿æÿ漿浿殿槿栿晿撿拿愿æ}¿æv¿æo¿æh¿æa¿æZ¿æS¿æL¿æE¿æ>¿æ7¿æ0¿æ)¿æ"¿æ¿æ¿æ ¿æ¿æÿ¾æø¾æñ¾æê¾æã¾æܾæÕ¾æξæǾæÀ¾æ¹¾æ²¾æ«¾æ¤¾æ¾æ–¾æ¾æˆ¾æ¾æz¾æs¾æl¾æe¾æ^¾æW¾æP¾æI¾æB¾æ;¾æ4¾æ-¾æ&¾æ¾æ¾æ¾æ ¾æ¾æü½æõ½æî½æç½æà½æÙ½æÒ½æ˽æĽæ½½æ¶½æ¯½æ¨½æ¡½æš½æ“½æŒ½æ…½æ~½æw½æp½æi½æb½æ[½æT½æM½æF½æ?½æ8½æ1½æ*½æ#½æ½æ½æ½æ½æ½æù¼æò¼æë¼æ伿ݼæÖ¼æϼæȼæÁ¼æº¼æ³¼æ¬¼æ¥¼æž¼æ—¼æ¼æ‰¼æ‚¼æ{¼æt¼æm¼æf¼æ_¼æX¼æQ¼æJ¼æC¼æ<¼æ5¼æ.¼æ'¼æ ¼æ¼æ¼æ ¼æ¼æý»æö»æï»æè»æá»æÚ»æÓ»æÌ»æÅ»æ¾»æ·»æ°»æ©»æ¢»æ›»æ”»æ»æ†»æ»æx»æq»æj»æc»æ\»æU»æN»æG»æ@»æ9»æ2»æ+»æ$»æ»æ»æ»æ»æ»æúºæóºæìºæåºæÞºæ׺æкæɺæºæ»ºæ´ºæ­ºæ¦ºæŸºæ˜ºæ‘ºæŠºæƒºæ|ºæuºænºægºæ`ºæYºæRºæKºæDºæ=ºæ6ºæ/ºæ(ºæ!ºæºæºæ ºæºæþ¹æ÷¹æð¹æ鹿â¹æÛ¹æÔ¹æ͹æƹ濹渹汹檹棹朹敹æ޹懹怹æy¹ær¹æk¹æd¹æ]¹æV¹æO¹æH¹æA¹æ:¹æ3¹æ,¹æ%¹æ¹æ¹æ¹æ ¹æ¹æû¸æô¸æí¸ææ¸æ߸æظæѸæʸæøæ¼¸æµ¸æ®¸æ§¸æ ¸æ™¸æ’¸æ‹¸æ„¸æ}¸æv¸æo¸æh¸æa¸æZ¸æS¸æL¸æE¸æ>¸æ7¸æ0¸æ)¸æ"¸æ¸æ¸æ ¸æ¸æÿ·æø·æñ·æê·æã·æÜ·æÕ·æηæÇ·æÀ·æ¹·æ²·æ«·æ¤·æ·æ–·æ·æˆ·æ·æz·æs·æl·æe·æ^·æW·æP·æI·æB·æ;·æ4·æ-·æ&·æ·æ·æ·æ ·æ·æü¶æõ¶æî¶æç¶æà¶æÙ¶æÒ¶æ˶æĶ潶涶毶樶桶暶擶挶慶æ~¶æw¶æp¶æi¶æb¶æ[¶æT¶æM¶æF¶æ?¶æ8¶æ1¶æ*¶æ#¶æ¶æ¶æ¶æ¶æ¶æùµæòµæëµæ䵿ݵæÖµæϵæȵæÁµæºµæ³µæ¬µæ¥µæžµæ—µæµæ‰µæ‚µæ{µætµæmµæfµæ_µæXµæQµæJµæCµæ<µæ5µæ.µæ'µæ µæµæµæ µæµæý´æö´æï´æè´æá´æÚ´æÓ´æÌ´æÅ´æ¾´æ·´æ°´æ©´æ¢´æ›´æ”´æ´æ†´æ´æx´æq´æj´æc´æ\´æU´æN´æG´æ@´æ9´æ2´æ+´æ$´æ´æ´æ´æ´æ´æú³æó³æì³æ峿Þ³æ׳æгæɳæ³æ»³æ´³æ­³æ¦³æŸ³æ˜³æ‘³æг想æ|³æu³æn³æg³æ`³æY³æR³æK³æD³æ=³æ6³æ/³æ(³æ!³æ³æ³æ ³æ³æþ²æ÷²æð²æ鲿â²æÛ²æÔ²æͲæƲ濲渲汲檲棲朲敲æ޲懲怲æy²ær²æk²æd²æ]²æV²æO²æH²æA²æ:²æ3²æ,²æ%²æ²æ²æ²æ ²æ²æû±æô±æí±ææ±æß±æرæѱæʱæñ漱浱殱槱栱晱撱拱愱æ}±æv±æo±æh±æa±æZ±æS±æL±æE±æ>±æ7±æ0±æ)±æ"±æ±æ±æ ±æ±æÿ°æø°æñ°æê°æã°æܰæÕ°æΰæǰæÀ°æ¹°æ²°æ«°æ¤°æ°æ–°æ°æˆ°æ°æz°æs°æl°æe°æ^°æW°æP°æI°æB°æ;°æ4°æ-°æ&°æ°æ°æ°æ °æ°æü¯æõ¯æî¯æç¯æà¯æÙ¯æÒ¯æ˯æį潯涯毯樯桯暯擯振慯æ~¯æw¯æp¯æi¯æb¯æ[¯æT¯æM¯æF¯æ?¯æ8¯æ1¯æ*¯æ#¯æ¯æ¯æ¯æ¯æ¯æù®æò®æë®æ䮿Ý®æÖ®æÏ®æÈ®æÁ®æº®æ³®æ¬®æ¥®æž®æ—®æ®æ‰®æ‚®æ{®æt®æm®æf®æ_®æX®æQ®æJ®æC®æ<®æ5®æ.®æ'®æ ®æ®æ®æ ®æ®æý­æö­æï­æè­æá­æÚ­æÓ­æÌ­æÅ­æ¾­æ·­æ°­æ©­æ¢­æ›­æ”­æ­æ†­æ­æx­æq­æj­æc­æ\­æU­æN­æG­æ@­æ9­æ2­æ+­æ$­æ­æ­æ­æ­æ­æú¬æó¬æì¬æ嬿Þ¬æ׬æЬæɬæ¬æ»¬æ´¬æ­¬æ¦¬æŸ¬æ˜¬æ‘¬æЬ惬æ|¬æu¬æn¬æg¬æ`¬æY¬æR¬æK¬æD¬æ=¬æ6¬æ/¬æ(¬æ!¬æ¬æ¬æ ¬æ¬æþ«æ÷«æð«æ髿â«æÛ«æÔ«æÍ«æÆ«æ¿«æ¸«æ±«æª«æ£«æœ«æ•«æŽ«æ‡«æ€«æy«ær«æk«æd«æ]«æV«æO«æH«æA«æ:«æ3«æ,«æ%«æ«æ«æ«æ «æ«æûªæôªæíªææªæߪæتæѪæʪæê漪浪殪槪株晪撪拪愪æ}ªævªæoªæhªæaªæZªæSªæLªæEªæ>ªæ7ªæ0ªæ)ªæ"ªæªæªæ ªæªæÿ©æø©æñ©æê©æã©æÜ©æÕ©æΩæÇ©æÀ©æ¹©æ²©æ«©æ¤©æ©æ–©æ©æˆ©æ©æz©æs©æl©æe©æ^©æW©æP©æI©æB©æ;©æ4©æ-©æ&©æ©æ©æ©æ ©æ©æü¨æõ¨æî¨æç¨æà¨æÙ¨æÒ¨æ˨æĨ潨涨毨樨桨暨擨挨慨æ~¨æw¨æp¨æi¨æb¨æ[¨æT¨æM¨æF¨æ?¨æ8¨æ1¨æ*¨æ#¨æ¨æ¨æ¨æ¨æ¨æù§æò§æë§æä§æݧæÖ§æϧæȧæÁ§æº§æ³§æ¬§æ¥§æž§æ—§æ§æ‰§æ‚§æ{§æt§æm§æf§æ_§æX§æQ§æJ§æC§æ<§æ5§æ.§æ'§æ §æ§æ§æ §æ§æý¦æö¦æï¦æè¦æá¦æÚ¦æÓ¦æ̦æŦæ¾¦æ·¦æ°¦æ©¦æ¢¦æ›¦æ”¦æ¦æ†¦æ¦æx¦æq¦æj¦æc¦æ\¦æU¦æN¦æG¦æ@¦æ9¦æ2¦æ+¦æ$¦æ¦æ¦æ¦æ¦æ¦æú¥æó¥æì¥æ奿Þ¥æ×¥æÐ¥æÉ¥æÂ¥æ»¥æ´¥æ­¥æ¦¥æŸ¥æ˜¥æ‘¥æŠ¥æƒ¥æ|¥æu¥æn¥æg¥æ`¥æY¥æR¥æK¥æD¥æ=¥æ6¥æ/¥æ(¥æ!¥æ¥æ¥æ ¥æ¥æþ¤æ÷¤æð¤æ餿â¤æÛ¤æÔ¤æͤæƤ濤渤汤檤棤朤敤æޤ懤怤æy¤ær¤æk¤æd¤æ]¤æV¤æO¤æH¤æA¤æ:¤æ3¤æ,¤æ%¤æ¤æ¤æ¤æ ¤æ¤æû£æô£æí£ææ£æߣæØ£æÑ£æÊ£æã漣浣殣槣栣晣撣拣愣æ}£æv£æo£æh£æa£æZ£æS£æL£æE£æ>£æ7£æ0£æ)£æ"£æ£æ£æ £æ£æÿ¢æø¢æñ¢æê¢æã¢æÜ¢æÕ¢æ΢æÇ¢æÀ¢æ¹¢æ²¢æ«¢æ¤¢æ¢æ–¢æ¢æˆ¢æ¢æz¢æs¢æl¢æe¢æ^¢æW¢æP¢æI¢æB¢æ;¢æ4¢æ-¢æ&¢æ¢æ¢æ¢æ ¢æ¢æü¡æõ¡æî¡æç¡æà¡æÙ¡æÒ¡æË¡æÄ¡æ½¡æ¶¡æ¯¡æ¨¡æ¡¡æš¡æ“¡æŒ¡æ…¡æ~¡æw¡æp¡æi¡æb¡æ[¡æT¡æM¡æF¡æ?¡æ8¡æ1¡æ*¡æ#¡æ¡æ¡æ¡æ¡æ¡æù æò æë æä æÝ æÖ æÏ æÈ æÁ æº æ³ æ¬ æ¥ æž æ— æ æ‰ æ‚ æ{ æt æm æf æ_ æX æQ æJ æC æ< æ5 æ. æ' æ  æ æ æ  æ æýŸæöŸæïŸæèŸæáŸæÚŸæÓŸæÌŸæÅŸæ¾Ÿæ·Ÿæ°Ÿæ©Ÿæ¢Ÿæ›Ÿæ”ŸæŸæ†ŸæŸæxŸæqŸæjŸæcŸæ\ŸæUŸæNŸæGŸæ@Ÿæ9Ÿæ2Ÿæ+Ÿæ$ŸæŸæŸæŸæŸæŸæúžæóžæìžæåžæÞžæמæОæÉžæžæ»žæ´žæ­žæ¦žæŸžæ˜žæ‘žæŠžæƒžæ|žæužænžægžæ`žæYžæRžæKžæDžæ=žæ6žæ/žæ(žæ!žæžæžæ žæžæþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûœæôœæíœææœæßœæØœæÑœæÊœæÜ漜浜殜槜栜晜撜拜愜æ}œævœæoœæhœæaœæZœæSœæLœæEœæ>œæ7œæ0œæ)œæ"œæœæœæ œæœæÿ›æø›æñ›æê›æã›æÜ›æÕ›æΛæÇ›æÀ›æ¹›æ²›æ«›æ¤›æ›æ–›æ›æˆ›æ›æz›æs›æl›æe›æ^›æW›æP›æI›æB›æ;›æ4›æ-›æ&›æ›æ›æ›æ ›æ›æüšæõšæîšæçšæàšæÙšæÒšæËšæÄšæ½šæ¶šæ¯šæ¨šæ¡šæššæ“šæŒšæ…šæ~šæwšæpšæišæbšæ[šæTšæMšæFšæ?šæ8šæ1šæ*šæ#šæšæšæšæšæšæù™æò™æë™æ䙿Ý™æÖ™æÏ™æÈ™æÁ™æº™æ³™æ¬™æ¥™æž™æ—™æ™æ‰™æ‚™æ{™æt™æm™æf™æ_™æX™æQ™æJ™æC™æ<™æ5™æ.™æ'™æ ™æ™æ™æ ™æ™æý˜æö˜æï˜æè˜æá˜æÚ˜æÓ˜æ̘æŘæ¾˜æ·˜æ°˜æ©˜æ¢˜æ›˜æ”˜æ˜æ†˜æ˜æx˜æq˜æj˜æc˜æ\˜æU˜æN˜æG˜æ@˜æ9˜æ2˜æ+˜æ$˜æ˜æ˜æ˜æ˜æ˜æú—æó—æì—æå—æÞ—æ×—æЗæÉ—æ—æ»—洗歗榗柗昗摗抗惗æ|—æu—æn—æg—æ`—æY—æR—æK—æD—æ=—æ6—æ/—æ(—æ!—æ—æ—æ —æ—æþ–æ÷–æð–æé–æâ–æÛ–æÔ–æÍ–æÆ–æ¿–æ¸–æ±–æª–æ£–æœ–æ•–æŽ–æ‡–æ€–æy–ær–æk–æd–æ]–æV–æO–æH–æA–æ:–æ3–æ,–æ%–æ–æ–æ–æ –æ–æû•æô•æí•ææ•æß•æØ•æÑ•æÊ•æÕ漕浕殕槕栕晕撕拕愕æ}•æv•æo•æh•æa•æZ•æS•æL•æE•æ>•æ7•æ0•æ)•æ"•æ•æ•æ •æ•æÿ”æø”æñ”æê”æã”æÜ”æÕ”æΔæÇ”æÀ”æ¹”æ²”æ«”æ¤”æ”æ–”æ”æˆ”æ”æz”æs”æl”æe”æ^”æW”æP”æI”æB”æ;”æ4”æ-”æ&”æ”æ”æ”æ ”æ”æü“æõ“æî“æç“æà“æÙ“æÒ“æË“æÄ“潓涓毓樓桓暓擓挓慓æ~“æw“æp“æi“æb“æ[“æT“æM“æF“æ?“æ8“æ1“æ*“æ#“æ“æ“æ“æ“æ“æù’æò’æë’æä’æÝ’æÖ’æÏ’æÈ’æÁ’æº’æ³’æ¬’æ¥’æž’æ—’æ’æ‰’æ‚’æ{’æt’æm’æf’æ_’æX’æQ’æJ’æC’æ<’æ5’æ.’æ'’æ ’æ’æ’æ ’æ’æý‘æö‘æï‘æè‘æá‘æÚ‘æÓ‘æÌ‘æÅ‘æ¾‘æ·‘æ°‘æ©‘æ¢‘æ›‘æ”‘æ‘æ†‘æ‘æx‘æq‘æj‘æc‘æ\‘æU‘æN‘æG‘æ@‘æ9‘æ2‘æ+‘æ$‘æ‘æ‘æ‘æ‘æ‘æúæóæìæåæÞæ׿ÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûŽæôŽæíŽææŽæߎæØŽæÑŽæÊŽæÃŽæ¼ŽæµŽæ®Žæ§Žæ Žæ™Žæ’Žæ‹Žæ„Žæ}ŽævŽæoŽæhŽæaŽæZŽæSŽæLŽæEŽæ>Žæ7Žæ0Žæ)Žæ"޿޿޿ ޿޿ÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüŒæõŒæîŒæçŒæàŒæÙŒæÒŒæËŒæÄŒæ½Œæ¶Œæ¯Œæ¨Œæ¡ŒæšŒæ“ŒæŒŒæ…Œæ~ŒæwŒæpŒæiŒæbŒæ[ŒæTŒæMŒæFŒæ?Œæ8Œæ1Œæ*Œæ#ŒæŒæŒæŒæŒæŒæù‹æò‹æë‹æ䋿Ý‹æÖ‹æÏ‹æÈ‹æÁ‹æº‹æ³‹æ¬‹æ¥‹æž‹æ—‹æ‹æ‰‹æ‚‹æ{‹æt‹æm‹æf‹æ_‹æX‹æQ‹æJ‹æC‹æ<‹æ5‹æ.‹æ'‹æ ‹æ‹æ‹æ ‹æ‹æýŠæöŠæïŠæèŠæáŠæÚŠæÓŠæÌŠæÅŠæ¾Šæ·Šæ°Šæ©Šæ¢Šæ›Šæ”пп†ŠæŠæxŠæqŠæjŠæcŠæ\ŠæUŠæNŠæGŠæ@Šæ9Šæ2Šæ+Šæ$ппппппú‰æó‰æì‰æ剿Þ‰æ׉æЉæɉæ‰æ»‰æ´‰æ­‰æ¦‰æŸ‰æ˜‰æ‘‰æЉæƒ‰æ|‰æu‰æn‰æg‰æ`‰æY‰æR‰æK‰æD‰æ=‰æ6‰æ/‰æ(‰æ!‰æ‰æ‰æ ‰æ‰æþˆæ÷ˆæðˆæéˆæâˆæÛˆæÔˆæ͈æƈ濈済汈檈棈月效授懈怈æyˆærˆækˆædˆæ]ˆæVˆæOˆæHˆæAˆæ:ˆæ3ˆæ,ˆæ%ˆæˆæˆæˆæ ˆæˆæû‡æô‡æí‡ææ‡æ߇æ؇æчæʇæÇ漇浇殇槇标晇撇拇愇æ}‡æv‡æo‡æh‡æa‡æZ‡æS‡æL‡æE‡æ>‡æ7‡æ0‡æ)‡æ"‡æ‡æ‡æ ‡æ‡æÿ†æø†æñ†æê†æã†æ܆æÕ†æΆædžæÀ†æ¹†æ²†æ«†æ¤†æ†æ–†æ†æˆ†æ†æz†æs†æl†æe†æ^†æW†æP†æI†æB†æ;†æ4†æ-†æ&†æ†æ†æ†æ †æ†æü…æõ…æî…æç…æà…æÙ…æÒ…æË…æÄ…潅涅毅樅桅暅擅挅慅æ~…æw…æp…æi…æb…æ[…æT…æM…æF…æ?…æ8…æ1…æ*…æ#…æ…æ…æ…æ…æ…æù„æò„æë„æ䄿Ý„æÖ„æÏ„æÈ„æÁ„æº„æ³„æ¬„æ¥„æž„æ—„æ„æ‰„æ‚„æ{„æt„æm„æf„æ_„æX„æQ„æJ„æC„æ<„æ5„æ.„æ'„æ „æ„æ„æ „æ„æýƒæöƒæïƒæèƒæáƒæÚƒæÓƒæ̃æŃæ¾ƒæ·ƒæ°ƒæ©ƒæ¢ƒæ›ƒæ”ƒæƒæ†ƒæƒæxƒæqƒæjƒæcƒæ\ƒæUƒæNƒæGƒæ@ƒæ9ƒæ2ƒæ+ƒæ$ƒæƒæƒæƒæƒæƒæú‚æó‚æì‚æ傿Þ‚æׂæЂæÉ‚æ‚æ»‚洂歂概柂昂摂抂惂æ|‚æu‚æn‚æg‚æ`‚æY‚æR‚æK‚æD‚æ=‚æ6‚æ/‚æ(‚æ!‚æ‚æ‚æ ‚æ‚æþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææû€æô€æí€ææ€æ߀æØ€æÑ€æÊ€æÀ漀浀殀槀栀晀撀拀愀æ}€æv€æo€æh€æa€æZ€æS€æL€æE€æ>€æ7€æ0€æ)€æ"€æ€æ€æ €æ€æÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææü~æõ~æî~æç~æà~æÙ~æÒ~æË~æÄ~æ½~æ¶~æ¯~æ¨~æ¡~æš~æ“~æŒ~æ…~æ~~æw~æp~æi~æb~æ[~æT~æM~æF~æ?~æ8~æ1~æ*~æ#~æ~æ~æ~æ~æ~æù}æò}æë}æä}æÝ}æÖ}æÏ}æÈ}æÁ}æº}æ³}æ¬}æ¥}æž}æ—}æ}æ‰}æ‚}æ{}æt}æm}æf}æ_}æX}æQ}æJ}æC}æ<}æ5}æ.}æ'}æ }æ}æ}æ }æ}æý|æö|æï|æè|æá|æÚ|æÓ|æÌ|æÅ|æ¾|æ·|æ°|æ©|æ¢|æ›|æ”|æ|æ†|æ|æx|æq|æj|æc|æ\|æU|æN|æG|æ@|æ9|æ2|æ+|æ$|æ|æ|æ|æ|æ|æú{æó{æì{æå{æÞ{æ×{æÐ{æÉ{æÂ{æ»{æ´{æ­{æ¦{æŸ{æ˜{æ‘{æŠ{æƒ{æ|{æu{æn{æg{æ`{æY{æR{æK{æD{æ={æ6{æ/{æ({æ!{æ{æ{æ {æ{æþzæ÷zæðzæézæâzæÛzæÔzæÍzæÆzæ¿zæ¸zæ±zæªzæ£zæœzæ•zæŽzæ‡zæ€zæyzærzækzædzæ]zæVzæOzæHzæAzæ:zæ3zæ,zæ%zæzæzæzæ zæzæûyæôyæíyææyæßyæØyæÑyæÊyæÃyæ¼yæµyæ®yæ§yæ yæ™yæ’yæ‹yæ„yæ}yævyæoyæhyæayæZyæSyæLyæEyæ>yæ7yæ0yæ)yæ"yæyæyæ yæyæÿxæøxæñxæêxæãxæÜxæÕxæÎxæÇxæÀxæ¹xæ²xæ«xæ¤xæxæ–xæxæˆxæxæzxæsxælxæexæ^xæWxæPxæIxæBxæ;xæ4xæ-xæ&xæxæxæxæ xæxæüwæõwæîwæçwæàwæÙwæÒwæËwæÄwæ½wæ¶wæ¯wæ¨wæ¡wæšwæ“wæŒwæ…wæ~wæwwæpwæiwæbwæ[wæTwæMwæFwæ?wæ8wæ1wæ*wæ#wæwæwæwæwæwæùvæòvæëvæävæÝvæÖvæÏvæÈvæÁvæºvæ³væ¬væ¥væžvæ—vævæ‰væ‚væ{vætvæmvæfvæ_væXvæQvæJvæCværæ7ræ0ræ)ræ"ræræræ ræræÿqæøqæñqæêqæãqæÜqæÕqæÎqæÇqæÀqæ¹qæ²qæ«qæ¤qæqæ–qæqæˆqæqæzqæsqælqæeqæ^qæWqæPqæIqæBqæ;qæ4qæ-qæ&qæqæqæqæ qæqæüpæõpæîpæçpæàpæÙpæÒpæËpæÄpæ½pæ¶pæ¯pæ¨pæ¡pæšpæ“pæŒpæ…pæ~pæwpæppæipæbpæ[pæTpæMpæFpæ?pæ8pæ1pæ*pæ#pæpæpæpæpæpæùoæòoæëoæäoæÝoæÖoæÏoæÈoæÁoæºoæ³oæ¬oæ¥oæžoæ—oæoæ‰oæ‚oæ{oætoæmoæfoæ_oæXoæQoæJoæCoækæ7kæ0kæ)kæ"kækækæ kækæÿjæøjæñjæêjæãjæÜjæÕjæÎjæÇjæÀjæ¹jæ²jæ«jæ¤jæjæ–jæjæˆjæjæzjæsjæljæejæ^jæWjæPjæIjæBjæ;jæ4jæ-jæ&jæjæjæjæ jæjæüiæõiæîiæçiæàiæÙiæÒiæËiæÄiæ½iæ¶iæ¯iæ¨iæ¡iæšiæ“iæŒiæ…iæ~iæwiæpiæiiæbiæ[iæTiæMiæFiæ?iæ8iæ1iæ*iæ#iæiæiæiæiæiæùhæòhæëhæähæÝhæÖhæÏhæÈhæÁhæºhæ³hæ¬hæ¥hæžhæ—hæhæ‰hæ‚hæ{hæthæmhæfhæ_hæXhæQhæJhæChædæ7dæ0dæ)dæ"dædædæ dædæÿcæøcæñcæêcæãcæÜcæÕcæÎcæÇcæÀcæ¹cæ²cæ«cæ¤cæcæ–cæcæˆcæcæzcæscælcæecæ^cæWcæPcæIcæBcæ;cæ4cæ-cæ&cæcæcæcæ cæcæübæõbæîbæçbæàbæÙbæÒbæËbæÄbæ½bæ¶bæ¯bæ¨bæ¡bæšbæ“bæŒbæ…bæ~bæwbæpbæibæbbæ[bæTbæMbæFbæ?bæ8bæ1bæ*bæ#bæbæbæbæbæbæùaæòaæëaæäaæÝaæÖaæÏaæÈaæÁaæºaæ³aæ¬aæ¥aæžaæ—aæaæ‰aæ‚aæ{aætaæmaæfaæ_aæXaæQaæJaæCaæ]æ7]æ0]æ)]æ"]æ]æ]æ ]æ]æÿ\æø\æñ\æê\æã\æÜ\æÕ\æÎ\æÇ\æÀ\æ¹\æ²\æ«\æ¤\æ\æ–\æ\æˆ\æ\æz\æs\æl\æe\æ^\æW\æP\æI\æB\æ;\æ4\æ-\æ&\æ\æ\æ\æ \æ\æü[æõ[æî[æç[æà[æÙ[æÒ[æË[æÄ[æ½[æ¶[æ¯[æ¨[æ¡[æš[æ“[æŒ[æ…[æ~[æw[æp[æi[æb[æ[[æT[æM[æF[æ?[æ8[æ1[æ*[æ#[æ[æ[æ[æ[æ[æùZæòZæëZæäZæÝZæÖZæÏZæÈZæÁZæºZæ³Zæ¬Zæ¥ZæžZæ—ZæZæ‰Zæ‚Zæ{ZætZæmZæfZæ_ZæXZæQZæJZæCZæVæ7Væ0Væ)Væ"VæVæVæ VæVæÿUæøUæñUæêUæãUæÜUæÕUæÎUæÇUæÀUæ¹Uæ²Uæ«Uæ¤UæUæ–UæUæˆUæUæzUæsUælUæeUæ^UæWUæPUæIUæBUæ;Uæ4Uæ-Uæ&UæUæUæUæ UæUæüTæõTæîTæçTæàTæÙTæÒTæËTæÄTæ½Tæ¶Tæ¯Tæ¨Tæ¡TæšTæ“TæŒTæ…Tæ~TæwTæpTæiTæbTæ[TæTTæMTæFTæ?Tæ8Tæ1Tæ*Tæ#TæTæTæTæTæTæùSæòSæëSæäSæÝSæÖSæÏSæÈSæÁSæºSæ³Sæ¬Sæ¥SæžSæ—SæSæ‰Sæ‚Sæ{SætSæmSæfSæ_SæXSæQSæJSæCSæOæ7Oæ0Oæ)Oæ"OæOæOæ OæOæÿNæøNæñNæêNæãNæÜNæÕNæÎNæÇNæÀNæ¹Næ²Næ«Næ¤NæNæ–NæNæˆNæNæzNæsNælNæeNæ^NæWNæPNæINæBNæ;Næ4Næ-Næ&NæNæNæNæ NæNæüMæõMæîMæçMæàMæÙMæÒMæËMæÄMæ½Mæ¶Mæ¯Mæ¨Mæ¡MæšMæ“MæŒMæ…Mæ~MæwMæpMæiMæbMæ[MæTMæMMæFMæ?Mæ8Mæ1Mæ*Mæ#MæMæMæMæMæMæùLæòLæëLæäLæÝLæÖLæÏLæÈLæÁLæºLæ³Læ¬Læ¥LæžLæ—LæLæ‰Læ‚Læ{LætLæmLæfLæ_LæXLæQLæJLæCLæHæ7Hæ0Hæ)Hæ"HæHæHæ HæHæÿGæøGæñGæêGæãGæÜGæÕGæÎGæÇGæÀGæ¹Gæ²Gæ«Gæ¤GæGæ–GæGæˆGæGæzGæsGælGæeGæ^GæWGæPGæIGæBGæ;Gæ4Gæ-Gæ&GæGæGæGæ GæGæüFæõFæîFæçFæàFæÙFæÒFæËFæÄFæ½Fæ¶Fæ¯Fæ¨Fæ¡FæšFæ“FæŒFæ…Fæ~FæwFæpFæiFæbFæ[FæTFæMFæFFæ?Fæ8Fæ1Fæ*Fæ#FæFæFæFæFæFæùEæòEæëEæäEæÝEæÖEæÏEæÈEæÁEæºEæ³Eæ¬Eæ¥EæžEæ—EæEæ‰Eæ‚Eæ{EætEæmEæfEæ_EæXEæQEæJEæCEæAæ7Aæ0Aæ)Aæ"AæAæAæ AæAæÿ@æø@æñ@æê@æã@æÜ@æÕ@æÎ@æÇ@æÀ@æ¹@æ²@æ«@æ¤@æ@æ–@æ@æˆ@æ@æz@æs@æl@æe@æ^@æW@æP@æI@æB@æ;@æ4@æ-@æ&@æ@æ@æ@æ @æ@æü?æõ?æî?æç?æà?æÙ?æÒ?æË?æÄ?æ½?æ¶?æ¯?æ¨?æ¡?æš?æ“?æŒ?æ…?æ~?æw?æp?æi?æb?æ[?æT?æM?æF?æ??æ8?æ1?æ*?æ#?æ?æ?æ?æ?æ?æù>æò>æë>æä>æÝ>æÖ>æÏ>æÈ>æÁ>æº>æ³>æ¬>æ¥>æž>æ—>æ>æ‰>æ‚>æ{>æt>æm>æf>æ_>æX>æQ>æJ>æC>æ<>æ5>æ.>æ'>æ >æ>æ>æ >æ>æý=æö=æï=æè=æá=æÚ=æÓ=æÌ=æÅ=æ¾=æ·=æ°=æ©=æ¢=æ›=æ”=æ=æ†=æ=æx=æq=æj=æc=æ\=æU=æN=æG=æ@=æ9=æ2=æ+=æ$=æ=æ=æ=æ=æ=æú<æó<æì<æå<æÞ<æ×<æÐ<æÉ<æÂ<æ»<æ´<æ­<æ¦<æŸ<æ˜<æ‘<æŠ<æƒ<æ|<æu<æn<æg<æ`<æY<æR<æK<æD<æ=<æ6<æ/<æ(<æ!<æ<æ<æ <æ<æþ;æ÷;æð;æé;æâ;æÛ;æÔ;æÍ;æÆ;æ¿;æ¸;æ±;æª;æ£;æœ;æ•;æŽ;æ‡;æ€;æy;ær;æk;æd;æ];æV;æO;æH;æA;æ:;æ3;æ,;æ%;æ;æ;æ;æ ;æ;æû:æô:æí:ææ:æß:æØ:æÑ:æÊ:æÃ:æ¼:æµ:æ®:æ§:æ :æ™:æ’:æ‹:æ„:æ}:æv:æo:æh:æa:æZ:æS:æL:æE:æ>:æ7:æ0:æ):æ":æ:æ:æ :æ:æÿ9æø9æñ9æê9æã9æÜ9æÕ9æÎ9æÇ9æÀ9æ¹9æ²9æ«9æ¤9æ9æ–9æ9æˆ9æ9æz9æs9æl9æe9æ^9æW9æP9æI9æB9æ;9æ49æ-9æ&9æ9æ9æ9æ 9æ9æü8æõ8æî8æç8æà8æÙ8æÒ8æË8æÄ8æ½8æ¶8æ¯8æ¨8æ¡8æš8æ“8æŒ8æ…8æ~8æw8æp8æi8æb8æ[8æT8æM8æF8æ?8æ88æ18æ*8æ#8æ8æ8æ8æ8æ8æù7æò7æë7æä7æÝ7æÖ7æÏ7æÈ7æÁ7æº7æ³7æ¬7æ¥7æž7æ—7æ7æ‰7æ‚7æ{7æt7æm7æf7æ_7æX7æQ7æJ7æC7æ<7æ57æ.7æ'7æ 7æ7æ7æ 7æ7æý6æö6æï6æè6æá6æÚ6æÓ6æÌ6æÅ6æ¾6æ·6æ°6æ©6æ¢6æ›6æ”6æ6æ†6æ6æx6æq6æj6æc6æ\6æU6æN6æG6æ@6æ96æ26æ+6æ$6æ6æ6æ6æ6æ6æú5æó5æì5æå5æÞ5æ×5æÐ5æÉ5æÂ5æ»5æ´5æ­5æ¦5æŸ5æ˜5æ‘5æŠ5æƒ5æ|5æu5æn5æg5æ`5æY5æR5æK5æD5æ=5æ65æ/5æ(5æ!5æ5æ5æ 5æ5æþ4æ÷4æð4æé4æâ4æÛ4æÔ4æÍ4æÆ4æ¿4æ¸4æ±4æª4æ£4æœ4æ•4æŽ4æ‡4æ€4æy4ær4æk4æd4æ]4æV4æO4æH4æA4æ:4æ34æ,4æ%4æ4æ4æ4æ 4æ4æû3æô3æí3ææ3æß3æØ3æÑ3æÊ3æÃ3æ¼3æµ3æ®3æ§3æ 3æ™3æ’3æ‹3æ„3æ}3æv3æo3æh3æa3æZ3æS3æL3æE3æ>3æ73æ03æ)3æ"3æ3æ3æ 3æ3æÿ2æø2æñ2æê2æã2æÜ2æÕ2æÎ2æÇ2æÀ2æ¹2æ²2æ«2æ¤2æ2æ–2æ2æˆ2æ2æz2æs2æl2æe2æ^2æW2æP2æI2æB2æ;2æ42æ-2æ&2æ2æ2æ2æ 2æ2æü1æõ1æî1æç1æà1æÙ1æÒ1æË1æÄ1æ½1æ¶1æ¯1æ¨1æ¡1æš1æ“1æŒ1æ…1æ~1æw1æp1æi1æb1æ[1æT1æM1æF1æ?1æ81æ11æ*1æ#1æ1æ1æ1æ1æ1æù0æò0æë0æä0æÝ0æÖ0æÏ0æÈ0æÁ0æº0æ³0æ¬0æ¥0æž0æ—0æ0æ‰0æ‚0æ{0æt0æm0æf0æ_0æX0æQ0æJ0æC0æ<0æ50æ.0æ'0æ 0æ0æ0æ 0æ0æý/æö/æï/æè/æá/æÚ/æÓ/æÌ/æÅ/æ¾/æ·/æ°/æ©/æ¢/æ›/æ”/æ/æ†/æ/æx/æq/æj/æc/æ\/æU/æN/æG/æ@/æ9/æ2/æ+/æ$/æ/æ/æ/æ/æ/æú.æó.æì.æå.æÞ.æ×.æÐ.æÉ.æÂ.æ».æ´.æ­.æ¦.æŸ.æ˜.æ‘.æŠ.æƒ.æ|.æu.æn.æg.æ`.æY.æR.æK.æD.æ=.æ6.æ/.æ(.æ!.æ.æ.æ .æ.æþ-æ÷-æð-æé-æâ-æÛ-æÔ-æÍ-æÆ-æ¿-æ¸-æ±-æª-æ£-æœ-æ•-æŽ-æ‡-æ€-æy-ær-æk-æd-æ]-æV-æO-æH-æA-æ:-æ3-æ,-æ%-æ-æ-æ-æ -æ-æû,æô,æí,ææ,æß,æØ,æÑ,æÊ,æÃ,æ¼,æµ,æ®,æ§,æ ,æ™,æ’,æ‹,æ„,æ},æv,æo,æh,æa,æZ,æS,æL,æE,æ>,æ7,æ0,æ),æ",æ,æ,æ ,æ,æÿ+æø+æñ+æê+æã+æÜ+æÕ+æÎ+æÇ+æÀ+æ¹+æ²+æ«+æ¤+æ+æ–+æ+æˆ+æ+æz+æs+æl+æe+æ^+æW+æP+æI+æB+æ;+æ4+æ-+æ&+æ+æ+æ+æ +æ+æü*æõ*æî*æç*æà*æÙ*æÒ*æË*æÄ*æ½*æ¶*æ¯*æ¨*æ¡*æš*æ“*æŒ*æ…*æ~*æw*æp*æi*æb*æ[*æT*æM*æF*æ?*æ8*æ1*æ**æ#*æ*æ*æ*æ*æ*æù)æò)æë)æä)æÝ)æÖ)æÏ)æÈ)æÁ)æº)æ³)æ¬)æ¥)æž)æ—)æ)æ‰)æ‚)æ{)æt)æm)æf)æ_)æX)æQ)æJ)æC)æ<)æ5)æ.)æ')æ )æ)æ)æ )æ)æý(æö(æï(æè(æá(æÚ(æÓ(æÌ(æÅ(æ¾(æ·(æ°(æ©(æ¢(æ›(æ”(æ(æ†(æ(æx(æq(æj(æc(æ\(æU(æN(æG(æ@(æ9(æ2(æ+(æ$(æ(æ(æ(æ(æ(æú'æó'æì'æå'æÞ'æ×'æÐ'æÉ'æÂ'æ»'æ´'æ­'æ¦'æŸ'æ˜'æ‘'æŠ'æƒ'æ|'æu'æn'æg'æ`'æY'æR'æK'æD'æ='æ6'æ/'æ('æ!'æ'æ'æ 'æ'æþ&æ÷&æð&æé&æâ&æÛ&æÔ&æÍ&æÆ&æ¿&æ¸&æ±&æª&æ£&æœ&æ•&æŽ&æ‡&æ€&æy&ær&æk&æd&æ]&æV&æO&æH&æA&æ:&æ3&æ,&æ%&æ&æ&æ&æ &æ&æû%æô%æí%ææ%æß%æØ%æÑ%æÊ%æÃ%æ¼%æµ%æ®%æ§%æ %æ™%æ’%æ‹%æ„%æ}%æv%æo%æh%æa%æZ%æS%æL%æE%æ>%æ7%æ0%æ)%æ"%æ%æ%æ %æ%æÿ$æø$æñ$æê$æã$æÜ$æÕ$æÎ$æÇ$æÀ$æ¹$æ²$æ«$æ¤$æ$æ–$æ$æˆ$æ$æz$æs$æl$æe$æ^$æW$æP$æI$æB$æ;$æ4$æ-$æ&$æ$æ$æ$æ $æ$æü#æõ#æî#æç#æà#æÙ#æÒ#æË#æÄ#æ½#æ¶#æ¯#æ¨#æ¡#æš#æ“#æŒ#æ…#æ~#æw#æp#æi#æb#æ[#æT#æM#æF#æ?#æ8#æ1#æ*#æ##æ#æ#æ#æ#æ#æù"æò"æë"æä"æÝ"æÖ"æÏ"æÈ"æÁ"æº"æ³"æ¬"æ¥"æž"æ—"æ"æ‰"æ‚"æ{"æt"æm"æf"æ_"æX"æQ"æJ"æC"æ<"æ5"æ."æ'"æ "æ"æ"æ "æ"æý!æö!æï!æè!æá!æÚ!æÓ!æÌ!æÅ!æ¾!æ·!æ°!æ©!æ¢!æ›!æ”!æ!æ†!æ!æx!æq!æj!æc!æ\!æU!æN!æG!æ@!æ9!æ2!æ+!æ$!æ!æ!æ!æ!æ!æú æó æì æå æÞ æ× æÐ æÉ æ æ» æ´ æ­ æ¦ æŸ æ˜ æ‘ æŠ æƒ æ| æu æn æg æ` æY æR æK æD æ= æ6 æ/ æ( æ! æ æ æ æ æþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúæóæìæåæÞæ×æÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúæóæìæåæÞæ×æÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææù æò æë æä æÝ æÖ æÏ æÈ æÁ æº æ³ æ¬ æ¥ æž æ— æ æ‰ æ‚ æ{ æt æm æf æ_ æX æQ æJ æC æ< æ5 æ. æ' æ æ æ æ æ æý æö æï æè æá æÚ æÓ æÌ æÅ æ¾ æ· æ° æ© æ¢ æ› æ” æ æ† æ æx æq æj æc æ\ æU æN æG æ@ æ9 æ2 æ+ æ$ æ æ æ æ æ æú æó æì æå æÞ æ× æÐ æÉ æ æ» æ´ æ­ æ¦ æŸ æ˜ æ‘ æŠ æƒ æ| æu æn æg æ` æY æR æK æD æ= æ6 æ/ æ( æ! æ æ æ æ æþ æ÷ æð æé æâ æÛ æÔ æÍ æÆ æ¿ æ¸ æ± æª æ£ æœ æ• æŽ æ‡ æ€ æy ær æk æd æ] æV æO æH æA æ: æ3 æ, æ% æ æ æ æ æ æû æô æí ææ æß æØ æÑ æÊ æà æ¼ æµ æ® æ§ æ  æ™ æ’ æ‹ æ„ æ} æv æo æh æa æZ æS æL æE æ> æ7 æ0 æ) æ" æ æ æ æ æÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúæóæìæåæÞæ×æÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùÿåòÿåëÿåäÿåÝÿåÖÿåÏÿåÈÿåÁÿåºÿå³ÿå¬ÿå¥ÿåžÿå—ÿåÿå‰ÿå‚ÿå{ÿåtÿåmÿåfÿå_ÿåXÿåQÿåJÿåCÿå<ÿå5ÿå.ÿå'ÿå ÿåÿåÿå ÿåÿåýþåöþåïþåèþåáþåÚþåÓþåÌþåÅþå¾þå·þå°þå©þå¢þå›þå”þåþå†þåþåxþåqþåjþåcþå\þåUþåNþåGþå@þå9þå2þå+þå$þåþåþåþåþåþåúýåóýåìýååýåÞýå×ýåÐýåÉýåÂýå»ýå´ýå­ýå¦ýåŸýå˜ýå‘ýåŠýåƒýå|ýåuýånýågýå`ýåYýåRýåKýåDýå=ýå6ýå/ýå(ýå!ýåýåýå ýåýåþüå÷üåðüåéüåâüåÛüåÔüåÍüåÆüå¿üå¸üå±üåªüå£üåœüå•üåŽüå‡üå€üåyüårüåküådüå]üåVüåOüåHüåAüå:üå3üå,üå%üåüåüåüå üåüåûûåôûåíûåæûåßûåØûåÑûåÊûåÃûå¼ûåµûå®ûå§ûå ûå™ûå’ûå‹ûå„ûå}ûåvûåoûåhûåaûåZûåSûåLûåEûå>ûå7ûå0ûå)ûå"ûåûåûå ûåûåÿúåøúåñúåêúåãúåÜúåÕúåÎúåÇúåÀúå¹úå²úå«úå¤úåúå–úåúåˆúåúåzúåsúålúåeúå^úåWúåPúåIúåBúå;úå4úå-úå&úåúåúåúå úåúåüùåõùåîùåçùåàùåÙùåÒùåËùåÄùå½ùå¶ùå¯ùå¨ùå¡ùåšùå“ùåŒùå…ùå~ùåwùåpùåiùåbùå[ùåTùåMùåFùå?ùå8ùå1ùå*ùå#ùåùåùåùåùåùåùøåòøåëøåäøåÝøåÖøåÏøåÈøåÁøåºøå³øå¬øå¥øåžøå—øåøå‰øå‚øå{øåtøåmøåføå_øåXøåQøåJøåCøå<øå5øå.øå'øå øåøåøå øåøåý÷åö÷åï÷åè÷åá÷åÚ÷åÓ÷åÌ÷åÅ÷å¾÷å·÷å°÷å©÷å¢÷å›÷å”÷å÷å†÷å÷åx÷åq÷åj÷åc÷å\÷åU÷åN÷åG÷å@÷å9÷å2÷å+÷å$÷å÷å÷å÷å÷å÷åúöåóöåìöååöåÞöå×öåÐöåÉöåÂöå»öå´öå­öå¦öåŸöå˜öå‘öåŠöåƒöå|öåuöånöågöå`öåYöåRöåKöåDöå=öå6öå/öå(öå!öåöåöå öåöåþõå÷õåðõåéõåâõåÛõåÔõåÍõåÆõå¿õå¸õå±õåªõå£õåœõå•õåŽõå‡õå€õåyõårõåkõådõå]õåVõåOõåHõåAõå:õå3õå,õå%õåõåõåõå õåõåûôåôôåíôåæôåßôåØôåÑôåÊôåÃôå¼ôåµôå®ôå§ôå ôå™ôå’ôå‹ôå„ôå}ôåvôåoôåhôåaôåZôåSôåLôåEôå>ôå7ôå0ôå)ôå"ôåôåôå ôåôåÿóåøóåñóåêóåãóåÜóåÕóåÎóåÇóåÀóå¹óå²óå«óå¤óåóå–óåóåˆóåóåzóåsóålóåeóå^óåWóåPóåIóåBóå;óå4óå-óå&óåóåóåóå óåóåüòåõòåîòåçòåàòåÙòåÒòåËòåÄòå½òå¶òå¯òå¨òå¡òåšòå“òåŒòå…òå~òåwòåpòåiòåbòå[òåTòåMòåFòå?òå8òå1òå*òå#òåòåòåòåòåòåùñåòñåëñåäñåÝñåÖñåÏñåÈñåÁñåºñå³ñå¬ñå¥ñåžñå—ñåñå‰ñå‚ñå{ñåtñåmñåfñå_ñåXñåQñåJñåCñå<ñå5ñå.ñå'ñå ñåñåñå ñåñåýðåöðåïðåèðåáðåÚðåÓðåÌðåÅðå¾ðå·ðå°ðå©ðå¢ðå›ðå”ðåðå†ðåðåxðåqðåjðåcðå\ðåUðåNðåGðå@ðå9ðå2ðå+ðå$ðåðåðåðåðåðåúïåóïåìïååïåÞïå×ïåÐïåÉïåÂïå»ïå´ïå­ïå¦ïåŸïå˜ïå‘ïåŠïåƒïå|ïåuïånïågïå`ïåYïåRïåKïåDïå=ïå6ïå/ïå(ïå!ïåïåïå ïåïåþîå÷îåðîåéîåâîåÛîåÔîåÍîåÆîå¿îå¸îå±îåªîå£îåœîå•îåŽîå‡îå€îåyîårîåkîådîå]îåVîåOîåHîåAîå:îå3îå,îå%îåîåîåîå îåîåûíåôíåííåæíåßíåØíåÑíåÊíåÃíå¼íåµíå®íå§íå íå™íå’íå‹íå„íå}íåvíåoíåhíåaíåZíåSíåLíåEíå>íå7íå0íå)íå"íåíåíå íåíåÿìåøìåñìåêìåãìåÜìåÕìåÎìåÇìåÀìå¹ìå²ìå«ìå¤ìåìå–ìåìåˆìåìåzìåsìålìåeìå^ìåWìåPìåIìåBìå;ìå4ìå-ìå&ìåìåìåìå ìåìåüëåõëåîëåçëåàëåÙëåÒëåËëåÄëå½ëå¶ëå¯ëå¨ëå¡ëåšëå“ëåŒëå…ëå~ëåwëåpëåiëåbëå[ëåTëåMëåFëå?ëå8ëå1ëå*ëå#ëåëåëåëåëåëåùêåòêåëêåäêåÝêåÖêåÏêåÈêåÁêåºêå³êå¬êå¥êåžêå—êåêå‰êå‚êå{êåtêåmêåfêå_êåXêåQêåJêåCêå<êå5êå.êå'êå êåêåêå êåêåýéåöéåïéåèéåáéåÚéåÓéåÌéåÅéå¾éå·éå°éå©éå¢éå›éå”éåéå†éåéåxéåqéåjéåcéå\éåUéåNéåGéå@éå9éå2éå+éå$éåéåéåéåéåéåúèåóèåìèååèåÞèå×èåÐèåÉèåÂèå»èå´èå­èå¦èåŸèå˜èå‘èåŠèåƒèå|èåuèånèågèå`èåYèåRèåKèåDèå=èå6èå/èå(èå!èåèåèå èåèåþçå÷çåðçåéçåâçåÛçåÔçåÍçåÆçå¿çå¸çå±çåªçå£çåœçå•çåŽçå‡çå€çåyçårçåkçådçå]çåVçåOçåHçåAçå:çå3çå,çå%çåçåçåçå çåçåûæåôæåíæåææå߿娿åÑæåÊæåÃæå¼æåµæå®æå§æå æå™æå’æå‹æå„æå}æåvæåoæåhæåaæåZæåSæåLæåEæå>æå7æå0æå)æå"æåæåæå æåæåÿååøååñååêååãååÜååÕååÎååÇååÀåå¹åå²åå«åå¤åååå–ååååˆååååzååsåålååeåå^ååWååPååIååBåå;åå4åå-åå&åååååååå ååååüäåõäåîäåçäåàäåÙäåÒäåËäåÄäå½äå¶äå¯äå¨äå¡äåšäå“äåŒäå…äå~äåwäåpäåiäåbäå[äåTäåMäåFäå?äå8äå1äå*äå#äåäåäåäåäåäåùãåòãåëãåäãåÝãåÖãåÏãåÈãåÁãåºãå³ãå¬ãå¥ãåžãå—ãåãå‰ãå‚ãå{ãåtãåmãåfãå_ãåXãåQãåJãåCãå<ãå5ãå.ãå'ãå ãåãåãå ãåãåýâåöâåïâåèâåáâåÚâåÓâåÌâåÅâå¾âå·âå°âå©âå¢âå›âå”âåâå†âåâåxâåqâåjâåcâå\âåUâåNâåGâå@âå9âå2âå+âå$âåâåâåâåâåâåúáåóáåìáååáåÞáå×áåÐáåÉáåÂáå»áå´áå­áå¦áåŸáå˜áå‘áåŠáåƒáå|áåuáånáågáå`áåYáåRáåKáåDáå=áå6áå/áå(áå!áåáåáå áåáåþàå÷àåðàåéàåâàåÛàåÔàåÍàåÆàå¿àå¸àå±àåªàå£àåœàå•àåŽàå‡àå€àåyàåràåkàådàå]àåVàåOàåHàåAàå:àå3àå,àå%àåàåàåàå àåàåûßåôßåíßåæßåßßåØßåÑßåÊßåÃßå¼ßåµßå®ßå§ßå ßå™ßå’ßå‹ßå„ßå}ßåvßåoßåhßåaßåZßåSßåLßåEßå>ßå7ßå0ßå)ßå"ßåßåßå ßåßåÿÞåøÞåñÞåêÞåãÞåÜÞåÕÞåÎÞåÇÞåÀÞå¹Þå²Þå«Þå¤ÞåÞå–ÞåÞåˆÞåÞåzÞåsÞålÞåeÞå^ÞåWÞåPÞåIÞåBÞå;Þå4Þå-Þå&ÞåÞåÞåÞå ÞåÞåüÝåõÝåîÝåçÝåàÝåÙÝåÒÝåËÝåÄÝå½Ýå¶Ýå¯Ýå¨Ýå¡ÝåšÝå“ÝåŒÝå…Ýå~ÝåwÝåpÝåiÝåbÝå[ÝåTÝåMÝåFÝå?Ýå8Ýå1Ýå*Ýå#ÝåÝåÝåÝåÝåÝåùÜåòÜåëÜåäÜåÝÜåÖÜåÏÜåÈÜåÁÜåºÜå³Üå¬Üå¥ÜåžÜå—ÜåÜå‰Üå‚Üå{ÜåtÜåmÜåfÜå_ÜåXÜåQÜåJÜåCÜå<Üå5Üå.Üå'Üå ÜåÜåÜå ÜåÜåýÛåöÛåïÛåèÛåáÛåÚÛåÓÛåÌÛåÅÛå¾Ûå·Ûå°Ûå©Ûå¢Ûå›Ûå”ÛåÛå†ÛåÛåxÛåqÛåjÛåcÛå\ÛåUÛåNÛåGÛå@Ûå9Ûå2Ûå+Ûå$ÛåÛåÛåÛåÛåÛåúÚåóÚåìÚååÚåÞÚå×ÚåÐÚåÉÚåÂÚå»Úå´Úå­Úå¦ÚåŸÚå˜Úå‘ÚåŠÚåƒÚå|ÚåuÚånÚågÚå`ÚåYÚåRÚåKÚåDÚå=Úå6Úå/Úå(Úå!ÚåÚåÚå ÚåÚåþÙå÷ÙåðÙåéÙåâÙåÛÙåÔÙåÍÙåÆÙå¿Ùå¸Ùå±ÙåªÙå£ÙåœÙå•ÙåŽÙå‡Ùå€ÙåyÙårÙåkÙådÙå]ÙåVÙåOÙåHÙåAÙå:Ùå3Ùå,Ùå%ÙåÙåÙåÙå ÙåÙåûØåôØåíØåæØåߨ娨åÑØåÊØåÃØå¼ØåµØå®Øå§Øå Øå™Øå’Øå‹Øå„Øå}ØåvØåoØåhØåaØåZØåSØåLØåEØå>Øå7Øå0Øå)Øå"ØåØåØå ØåØåÿ×åø×åñ×åê×åã×åÜ×åÕ×åÎ×åÇ×åÀ×å¹×å²×å«×å¤×å×å–×å×åˆ×å×åz×ås×ål×åe×å^×åW×åP×åI×åB×å;×å4×å-×å&×å×å×å×å ×å×åüÖåõÖåîÖåçÖåàÖåÙÖåÒÖåËÖåÄÖå½Öå¶Öå¯Öå¨Öå¡ÖåšÖå“ÖåŒÖå…Öå~ÖåwÖåpÖåiÖåbÖå[ÖåTÖåMÖåFÖå?Öå8Öå1Öå*Öå#ÖåÖåÖåÖåÖåÖåùÕåòÕåëÕåäÕåÝÕåÖÕåÏÕåÈÕåÁÕåºÕå³Õå¬Õå¥ÕåžÕå—ÕåÕå‰Õå‚Õå{ÕåtÕåmÕåfÕå_ÕåXÕåQÕåJÕåCÕå<Õå5Õå.Õå'Õå ÕåÕåÕå ÕåÕåýÔåöÔåïÔåèÔåáÔåÚÔåÓÔåÌÔåÅÔå¾Ôå·Ôå°Ôå©Ôå¢Ôå›Ôå”ÔåÔå†ÔåÔåxÔåqÔåjÔåcÔå\ÔåUÔåNÔåGÔå@Ôå9Ôå2Ôå+Ôå$ÔåÔåÔåÔåÔåÔåúÓåóÓåìÓååÓåÞÓå×ÓåÐÓåÉÓåÂÓå»Óå´Óå­Óå¦ÓåŸÓå˜Óå‘ÓåŠÓåƒÓå|ÓåuÓånÓågÓå`ÓåYÓåRÓåKÓåDÓå=Óå6Óå/Óå(Óå!ÓåÓåÓå ÓåÓåþÒå÷ÒåðÒåéÒåâÒåÛÒåÔÒåÍÒåÆÒå¿Òå¸Òå±ÒåªÒå£ÒåœÒå•ÒåŽÒå‡Òå€ÒåyÒårÒåkÒådÒå]ÒåVÒåOÒåHÒåAÒå:Òå3Òå,Òå%ÒåÒåÒåÒå ÒåÒåûÑåôÑåíÑåæÑåßÑåØÑåÑÑåÊÑåÃÑå¼ÑåµÑå®Ñå§Ñå Ñå™Ñå’Ñå‹Ñå„Ñå}ÑåvÑåoÑåhÑåaÑåZÑåSÑåLÑåEÑå>Ñå7Ñå0Ñå)Ñå"ÑåÑåÑå ÑåÑåÿÐåøÐåñÐåêÐåãÐåÜÐåÕÐåÎÐåÇÐåÀÐå¹Ðå²Ðå«Ðå¤ÐåÐå–ÐåÐåˆÐåÐåzÐåsÐålÐåeÐå^ÐåWÐåPÐåIÐåBÐå;Ðå4Ðå-Ðå&ÐåÐåÐåÐå ÐåÐåüÏåõÏåîÏåçÏåàÏåÙÏåÒÏåËÏåÄÏå½Ïå¶Ïå¯Ïå¨Ïå¡ÏåšÏå“ÏåŒÏå…Ïå~ÏåwÏåpÏåiÏåbÏå[ÏåTÏåMÏåFÏå?Ïå8Ïå1Ïå*Ïå#ÏåÏåÏåÏåÏåÏåùÎåòÎåëÎåäÎåÝÎåÖÎåÏÎåÈÎåÁÎåºÎå³Îå¬Îå¥ÎåžÎå—ÎåÎå‰Îå‚Îå{ÎåtÎåmÎåfÎå_ÎåXÎåQÎåJÎåCÎå<Îå5Îå.Îå'Îå ÎåÎåÎå ÎåÎåýÍåöÍåïÍåèÍåáÍåÚÍåÓÍåÌÍåÅÍå¾Íå·Íå°Íå©Íå¢Íå›Íå”ÍåÍå†ÍåÍåxÍåqÍåjÍåcÍå\ÍåUÍåNÍåGÍå@Íå9Íå2Íå+Íå$ÍåÍåÍåÍåÍåÍåúÌåóÌåìÌååÌåÞÌå×ÌåÐÌåÉÌåÂÌå»Ìå´Ìå­Ìå¦ÌåŸÌå˜Ìå‘ÌåŠÌåƒÌå|ÌåuÌånÌågÌå`ÌåYÌåRÌåKÌåDÌå=Ìå6Ìå/Ìå(Ìå!ÌåÌåÌå ÌåÌåþËå÷ËåðËåéËåâËåÛËåÔËåÍËåÆËå¿Ëå¸Ëå±ËåªËå£ËåœËå•ËåŽËå‡Ëå€ËåyËårËåkËådËå]ËåVËåOËåHËåAËå:Ëå3Ëå,Ëå%ËåËåËåËå ËåËåûÊåôÊåíÊåæÊåßÊåØÊåÑÊåÊÊåÃÊå¼ÊåµÊå®Êå§Êå Êå™Êå’Êå‹Êå„Êå}ÊåvÊåoÊåhÊåaÊåZÊåSÊåLÊåEÊå>Êå7Êå0Êå)Êå"ÊåÊåÊå ÊåÊåÿÉåøÉåñÉåêÉåãÉåÜÉåÕÉåÎÉåÇÉåÀÉå¹Éå²Éå«Éå¤ÉåÉå–ÉåÉåˆÉåÉåzÉåsÉålÉåeÉå^ÉåWÉåPÉåIÉåBÉå;Éå4Éå-Éå&ÉåÉåÉåÉå ÉåÉåüÈåõÈåîÈåçÈåàÈåÙÈåÒÈåËÈåÄÈå½Èå¶Èå¯Èå¨Èå¡ÈåšÈå“ÈåŒÈå…Èå~ÈåwÈåpÈåiÈåbÈå[ÈåTÈåMÈåFÈå?Èå8Èå1Èå*Èå#ÈåÈåÈåÈåÈåÈåùÇåòÇåëÇåäÇåÝÇåÖÇåÏÇåÈÇåÁÇåºÇå³Çå¬Çå¥ÇåžÇå—ÇåÇå‰Çå‚Çå{ÇåtÇåmÇåfÇå_ÇåXÇåQÇåJÇåCÇå<Çå5Çå.Çå'Çå ÇåÇåÇå ÇåÇåýÆåöÆåïÆåèÆåáÆåÚÆåÓÆåÌÆåů徯巯尯婯墯囯唯åÆå†ÆåÆåxÆåqÆåjÆåcÆå\ÆåUÆåNÆåGÆå@Æå9Æå2Æå+Æå$ÆåÆåÆåÆåÆåÆåúÅåóÅåìÅååÅåÞÅå×ÅåÐÅåÉÅåÂÅå»Åå´Åå­Åå¦ÅåŸÅå˜Åå‘ÅåŠÅåƒÅå|ÅåuÅånÅågÅå`ÅåYÅåRÅåKÅåDÅå=Åå6Åå/Åå(Åå!ÅåÅåÅå ÅåÅåþÄå÷ÄåðÄåéÄåâÄåÛÄåÔÄåÍÄåÆÄå¿Äå¸Äå±ÄåªÄå£ÄåœÄå•ÄåŽÄå‡Äå€ÄåyÄårÄåkÄådÄå]ÄåVÄåOÄåHÄåAÄå:Äå3Äå,Äå%ÄåÄåÄåÄå ÄåÄåûÃåôÃåíÃåæÃåßÃåØÃåÑÃåÊÃåÃÃå¼ÃåµÃå®Ãå§Ãå Ãå™Ãå’Ãå‹Ãå„Ãå}ÃåvÃåoÃåhÃåaÃåZÃåSÃåLÃåEÃå>Ãå7Ãå0Ãå)Ãå"ÃåÃåÃå ÃåÃåÿÂåøÂåñÂåêÂåãÂåÜÂåÕÂåÎÂåÇÂåÀÂå¹Âå²Âå«Âå¤ÂåÂå–ÂåÂåˆÂåÂåzÂåsÂålÂåeÂå^ÂåWÂåPÂåIÂåBÂå;Âå4Âå-Âå&ÂåÂåÂåÂå ÂåÂåüÁåõÁåîÁåçÁåàÁåÙÁåÒÁåËÁåÄÁå½Áå¶Áå¯Áå¨Áå¡ÁåšÁå“ÁåŒÁå…Áå~ÁåwÁåpÁåiÁåbÁå[ÁåTÁåMÁåFÁå?Áå8Áå1Áå*Áå#ÁåÁåÁåÁåÁåÁåùÀåòÀåëÀåäÀåÝÀåÖÀåÏÀåÈÀåÁÀåºÀå³Àå¬Àå¥ÀåžÀå—ÀåÀå‰Àå‚Àå{ÀåtÀåmÀåfÀå_ÀåXÀåQÀåJÀåCÀå<Àå5Àå.Àå'Àå ÀåÀåÀå ÀåÀåý¿åö¿åï¿åè¿åá¿åÚ¿åÓ¿åÌ¿åſ徿巿尿婿墿囿唿å¿å†¿å¿åx¿åq¿åj¿åc¿å\¿åU¿åN¿åG¿å@¿å9¿å2¿å+¿å$¿å¿å¿å¿å¿å¿åú¾åó¾åì¾åå¾åÞ¾å×¾åоåɾå¾å»¾å´¾å­¾å¦¾åŸ¾å˜¾å‘¾åо僾å|¾åu¾ån¾åg¾å`¾åY¾åR¾åK¾åD¾å=¾å6¾å/¾å(¾å!¾å¾å¾å ¾å¾åþ½å÷½åð½åé½åâ½åÛ½åÔ½åͽåƽ忽帽屽媽壽圽啽å޽函倽åy½år½åk½åd½å]½åV½åO½åH½åA½å:½å3½å,½å%½å½å½å½å ½å½åû¼åô¼åí¼åæ¼åß¼åؼåѼåʼåü弼嵼宼姼堼噼咼勼儼å}¼åv¼åo¼åh¼åa¼åZ¼åS¼åL¼åE¼å>¼å7¼å0¼å)¼å"¼å¼å¼å ¼å¼åÿ»åø»åñ»åê»åã»åÜ»åÕ»åλåÇ»åÀ»å¹»å²»å«»å¤»å»å–»å»åˆ»å»åz»ås»ål»åe»å^»åW»åP»åI»åB»å;»å4»å-»å&»å»å»å»å »å»åüºåõºåîºåçºåàºåÙºåÒºå˺åĺ彺嶺寺娺塺嚺哺区兺å~ºåwºåpºåiºåbºå[ºåTºåMºåFºå?ºå8ºå1ºå*ºå#ºåºåºåºåºåºåù¹åò¹åë¹åä¹åݹåÖ¹åϹåȹåÁ¹åº¹å³¹å¬¹å¥¹åž¹å—¹å¹å‰¹å‚¹å{¹åt¹åm¹åf¹å_¹åX¹åQ¹åJ¹åC¹å<¹å5¹å.¹å'¹å ¹å¹å¹å ¹å¹åý¸åö¸åï¸åè¸åá¸åÚ¸åÓ¸å̸åŸå¾¸å·¸å°¸å©¸å¢¸å›¸å”¸å¸å†¸å¸åx¸åq¸åj¸åc¸å\¸åU¸åN¸åG¸å@¸å9¸å2¸å+¸å$¸å¸å¸å¸å¸å¸åú·åó·åì·åå·åÞ·å×·åзåÉ·å·å»·å´·å­·å¦·åŸ·å˜·å‘·åŠ·åƒ·å|·åu·ån·åg·å`·åY·åR·åK·åD·å=·å6·å/·å(·å!·å·å·å ·å·åþ¶å÷¶åð¶åé¶åâ¶åÛ¶åÔ¶åͶåƶ忶帶屶媶壶圶啶å޶凶倶åy¶år¶åk¶åd¶å]¶åV¶åO¶åH¶åA¶å:¶å3¶å,¶å%¶å¶å¶å¶å ¶å¶åûµåôµåíµåæµåßµåصåѵåʵåõ張嵵宵姵堵噵咵勵儵å}µåvµåoµåhµåaµåZµåSµåLµåEµå>µå7µå0µå)µå"µåµåµå µåµåÿ´åø´åñ´åê´åã´åÜ´åÕ´åδåÇ´åÀ´å¹´å²´å«´å¤´å´å–´å´åˆ´å´åz´ås´ål´åe´å^´åW´åP´åI´åB´å;´å4´å-´å&´å´å´å´å ´å´åü³åõ³åî³åç³åà³åÙ³åÒ³å˳åij彳嶳寳娳塳嚳哳匳关å~³åw³åp³åi³åb³å[³åT³åM³åF³å?³å8³å1³å*³å#³å³å³å³å³å³åù²åò²åë²åä²åݲåÖ²åϲåȲåÁ²åº²å³²å¬²å¥²åž²å—²å²å‰²å‚²å{²åt²åm²åf²å_²åX²åQ²åJ²åC²å<²å5²å.²å'²å ²å²å²å ²å²åý±åö±åï±åè±åá±åÚ±åÓ±å̱åű徱己就婱墱囱唱å±å†±å±åx±åq±åj±åc±å\±åU±åN±åG±å@±å9±å2±å+±å$±å±å±å±å±å±åú°åó°åì°åå°åÞ°å×°åаåɰå°å»°å´°å­°å¦°åŸ°å˜°å‘°åа僰å|°åu°ån°åg°å`°åY°åR°åK°åD°å=°å6°å/°å(°å!°å°å°å °å°åþ¯å÷¯åð¯åé¯åâ¯åÛ¯åÔ¯åͯåƯ忯帯屯媯壯圯啯åޝ凯倯åy¯år¯åk¯åd¯å]¯åV¯åO¯åH¯åA¯å:¯å3¯å,¯å%¯å¯å¯å¯å ¯å¯åû®åô®åí®åæ®å߮娮åÑ®åÊ®åî弮嵮宮姮堮噮咮勮儮å}®åv®åo®åh®åa®åZ®åS®åL®åE®å>®å7®å0®å)®å"®å®å®å ®å®åÿ­åø­åñ­åê­åã­åÜ­åÕ­åέåÇ­åÀ­å¹­å²­å«­å¤­å­å–­å­åˆ­å­åz­ås­ål­åe­å^­åW­åP­åI­åB­å;­å4­å-­å&­å­å­å­å ­å­åü¬åõ¬åî¬åç¬åà¬åÙ¬åÒ¬åˬåĬ彬嶬寬娬塬嚬哬匬公å~¬åw¬åp¬åi¬åb¬å[¬åT¬åM¬åF¬å?¬å8¬å1¬å*¬å#¬å¬å¬å¬å¬å¬åù«åò«åë«åä«åÝ«åÖ«åÏ«åÈ«åÁ«åº«å³«å¬«å¥«åž«å—«å«å‰«å‚«å{«åt«åm«åf«å_«åX«åQ«åJ«åC«å<«å5«å.«å'«å «å«å«å «å«åýªåöªåïªåèªåáªåÚªåÓªå̪åŪ循巪尪婪墪囪唪åªå†ªåªåxªåqªåjªåcªå\ªåUªåNªåGªå@ªå9ªå2ªå+ªå$ªåªåªåªåªåªåú©åó©åì©åå©åÞ©åשåЩåÉ©å©å»©å´©å­©å¦©åŸ©å˜©å‘©åŠ©åƒ©å|©åu©ån©åg©å`©åY©åR©åK©åD©å=©å6©å/©å(©å!©å©å©å ©å©åþ¨å÷¨åð¨åé¨åâ¨åÛ¨åÔ¨åͨåƨ忨帨屨媨壨在啨åލ凨倨åy¨år¨åk¨åd¨å]¨åV¨åO¨åH¨åA¨å:¨å3¨å,¨å%¨å¨å¨å¨å ¨å¨åû§åô§åí§åæ§åß§åاåѧåʧåçå¼§åµ§å®§å§§å §å™§å’§å‹§å„§å}§åv§åo§åh§åa§åZ§åS§åL§åE§å>§å7§å0§å)§å"§å§å§å §å§åÿ¦åø¦åñ¦åê¦åã¦åܦåÕ¦åΦåǦåÀ¦å¹¦å²¦å«¦å¤¦å¦å–¦å¦åˆ¦å¦åz¦ås¦ål¦åe¦å^¦åW¦åP¦åI¦åB¦å;¦å4¦å-¦å&¦å¦å¦å¦å ¦å¦åü¥åõ¥åî¥åç¥åà¥åÙ¥åÒ¥åË¥åĥ彥嶥寥娥塥嚥哥匥入å~¥åw¥åp¥åi¥åb¥å[¥åT¥åM¥åF¥å?¥å8¥å1¥å*¥å#¥å¥å¥å¥å¥å¥åù¤åò¤åë¤åä¤åݤåÖ¤åϤåȤåÁ¤åº¤å³¤å¬¤å¥¤åž¤å—¤å¤å‰¤å‚¤å{¤åt¤åm¤åf¤å_¤åX¤åQ¤åJ¤åC¤å<¤å5¤å.¤å'¤å ¤å¤å¤å ¤å¤åý£åö£åï£åè£åá£åÚ£åÓ£åÌ£åţ徣巣尣婣墣団唣å£å†£å£åx£åq£åj£åc£å\£åU£åN£åG£å@£å9£å2£å+£å$£å£å£å£å£å£åú¢åó¢åì¢åå¢åÞ¢å×¢åТåÉ¢å¢å»¢å´¢å­¢å¦¢åŸ¢å˜¢å‘¢åŠ¢åƒ¢å|¢åu¢ån¢åg¢å`¢åY¢åR¢åK¢åD¢å=¢å6¢å/¢å(¢å!¢å¢å¢å ¢å¢åþ¡å÷¡åð¡åé¡åâ¡åÛ¡åÔ¡åÍ¡åÆ¡å¿¡å¸¡å±¡åª¡å£¡åœ¡å•¡åŽ¡å‡¡å€¡åy¡år¡åk¡åd¡å]¡åV¡åO¡åH¡åA¡å:¡å3¡å,¡å%¡å¡å¡å¡å ¡å¡åû åô åí åæ åߠ娠åÑ åÊ åàå¼ åµ å® å§ å  å™ å’ å‹ å„ å} åv åo åh åa åZ åS åL åE å> å7 å0 å) å" å å å  å åÿŸåøŸåñŸåêŸåãŸåÜŸåÕŸåΟåÇŸåÀŸå¹Ÿå²Ÿå«Ÿå¤ŸåŸå–ŸåŸåˆŸåŸåzŸåsŸålŸåeŸå^ŸåWŸåPŸåIŸåBŸå;Ÿå4Ÿå-Ÿå&ŸåŸåŸåŸå ŸåŸåüžåõžåîžåçžåàžåÙžåÒžåËžåĞ彞嶞寞娞塞嚞哞匞兞å~žåwžåpžåižåbžå[žåTžåMžåFžå?žå8žå1žå*žå#žåžåžåžåžåžåùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýœåöœåïœåèœåáœåÚœåÓœåÌœåŜ徜巜尜婜墜囜唜åœå†œåœåxœåqœåjœåcœå\œåUœåNœåGœå@œå9œå2œå+œå$œåœåœåœåœåœåú›åó›åì›åå›åÞ›å×›åЛåÉ›å›å»›å´›å­›å¦›åŸ›å˜›å‘›åŠ›åƒ›å|›åu›ån›åg›å`›åY›åR›åK›åD›å=›å6›å/›å(›å!›å›å›å ›å›åþšå÷šåðšåéšåâšåÛšåÔšåÍšåÆšå¿šå¸šå±šåªšå£šåœšå•šåŽšå‡šå€šåyšåršåkšådšå]šåVšåOšåHšåAšå:šå3šå,šå%šåšåšåšå šåšåû™åô™åí™åæ™åߙ娙åÑ™åÊ™åÙ弙嵙宙姙堙噙咙務儙å}™åv™åo™åh™åa™åZ™åS™åL™åE™å>™å7™å0™å)™å"™å™å™å ™å™åÿ˜åø˜åñ˜åê˜åã˜åܘåÕ˜åΘåǘåÀ˜å¹˜å²˜å«˜å¤˜å˜å–˜å˜åˆ˜å˜åz˜ås˜ål˜åe˜å^˜åW˜åP˜åI˜åB˜å;˜å4˜å-˜å&˜å˜å˜å˜å ˜å˜åü—åõ—åî—åç—åà—åÙ—åÒ—åË—åė彗嶗寗娗塗嚗哗北兗å~—åw—åp—åi—åb—å[—åT—åM—åF—å?—å8—å1—å*—å#—å—å—å—å—å—åù–åò–åë–åä–åÝ–åÖ–åÏ–åÈ–åÁ–庖峖嬖奖垖嗖å–剖傖å{–åt–åm–åf–å_–åX–åQ–åJ–åC–å<–å5–å.–å'–å –å–å–å –å–åý•åö•åï•åè•åá•åÚ•åÓ•åÌ•åŕ徕巕尕婕墕囕唕å•冕å•åx•åq•åj•åc•å\•åU•åN•åG•å@•å9•å2•å+•å$•å•å•å•å•å•åú”åó”åì”åå”åÞ”å×”åДåÉ”å”廔崔孔妔埔嘔呔劔僔å|”åu”ån”åg”å`”åY”åR”åK”åD”å=”å6”å/”å(”å!”å”å”å ”å”åþ“å÷“åð“åé“åâ“åÛ“åÔ“åÍ“åÆ“å¿“å¸“å±“åª“å£“åœ“å•“åŽ“å‡“å€“åy“år“åk“åd“å]“åV“åO“åH“åA“å:“å3“å,“å%“å“å“å“å “å“åû’åô’åí’åæ’åߒ娒åÑ’åÊ’åÃ’å¼’åµ’å®’å§’å ’å™’å’’å‹’å„’å}’åv’åo’åh’åa’åZ’åS’åL’åE’å>’å7’å0’å)’å"’å’å’å ’å’åÿ‘åø‘åñ‘åê‘åã‘åÜ‘åÕ‘åΑåÇ‘åÀ‘幑岑嫑夑å‘å–‘å‘刑å‘åz‘ås‘ål‘åe‘å^‘åW‘åP‘åI‘åB‘å;‘å4‘å-‘å&‘å‘å‘å‘å ‘å‘åüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýŽåöŽåïŽåèŽåáŽåÚŽåÓŽåÌŽåŎ徎巎導婎墎囎唎åŽå†ŽåŽåxŽåqŽåjŽåcŽå\ŽåUŽåNŽåGŽå@Žå9Žå2Žå+Žå$ŽåŽåŽåŽåŽåŽåúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþŒå÷ŒåðŒåéŒåâŒåÛŒåÔŒåÍŒåÆŒå¿Œå¸Œå±ŒåªŒå£ŒåœŒå•ŒåŽŒå‡Œå€ŒåyŒårŒåkŒådŒå]ŒåVŒåOŒåHŒåAŒå:Œå3Œå,Œå%ŒåŒåŒåŒå ŒåŒåû‹åô‹åí‹åæ‹åߋ娋åÑ‹åÊ‹åË弋嵋宋始堋噋咋勋儋å}‹åv‹åo‹åh‹åa‹åZ‹åS‹åL‹åE‹å>‹å7‹å0‹å)‹å"‹å‹å‹å ‹å‹åÿŠåøŠåñŠåêŠåãŠåÜŠåÕŠåΊåÇŠåÀŠå¹Šå²Šå«Šå¤ŠåŠå–ŠåŠåˆŠåŠåzŠåsŠålŠåeŠå^ŠåWŠåPŠåIŠåBŠå;Šå4Šå-Šå&ŠåŠåŠåŠå ŠåŠåü‰åõ‰åî‰åç‰åà‰åÙ‰åÒ‰åˉåĉ彉嶉寉娉塉嚉哉匉光å~‰åw‰åp‰åi‰åb‰å[‰åT‰åM‰åF‰å?‰å8‰å1‰å*‰å#‰å‰å‰å‰å‰å‰åùˆåòˆåëˆåäˆå݈åÖˆåψåȈåÁˆåºˆå³ˆå¬ˆå¥ˆåžˆå—ˆåˆå‰ˆå‚ˆå{ˆåtˆåmˆåfˆå_ˆåXˆåQˆåJˆåCˆå<ˆå5ˆå.ˆå'ˆå ˆåˆåˆå ˆåˆåý‡åö‡åï‡åè‡åá‡åÚ‡åÓ‡å̇åŇ徇巇將婇墇囇唇å‡å†‡å‡åx‡åq‡åj‡åc‡å\‡åU‡åN‡åG‡å@‡å9‡å2‡å+‡å$‡å‡å‡å‡å‡å‡åú†åó†åì†åå†åÞ†å׆åІåɆå†å»†å´†å­†å¦†åŸ†å˜†å‘†åІåƒ†å|†åu†ån†åg†å`†åY†åR†åK†åD†å=†å6†å/†å(†å!†å†å†å †å†åþ…å÷…åð…åé…åâ…åÛ…åÔ…åÍ…åÆ…å¿…å¸…å±…åª…å£…åœ…å•…åŽ…å‡…å€…åy…år…åk…åd…å]…åV…åO…åH…åA…å:…å3…å,…å%…å…å…å…å …å…åû„åô„åí„åæ„å߄娄åÑ„åÊ„åÄ弄嵄宄姄堄噄咄勄億å}„åv„åo„åh„åa„åZ„åS„åL„åE„å>„å7„å0„å)„å"„å„å„å „å„åÿƒåøƒåñƒåêƒåãƒå܃åÕƒå΃åǃåÀƒå¹ƒå²ƒå«ƒå¤ƒåƒå–ƒåƒåˆƒåƒåzƒåsƒålƒåeƒå^ƒåWƒåPƒåIƒåBƒå;ƒå4ƒå-ƒå&ƒåƒåƒåƒå ƒåƒåü‚åõ‚åî‚åç‚åà‚åÙ‚åÒ‚åË‚åĂ彂嶂寂娂塂嚂哂匂兂å~‚åw‚åp‚åi‚åb‚å[‚åT‚åM‚åF‚å?‚å8‚å1‚å*‚å#‚å‚å‚å‚å‚å‚åùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååý€åö€åï€åè€åá€åÚ€åÓ€åÌ€åŀ往巀尀婀墀囀唀å€å†€å€åx€åq€åj€åc€å\€åU€åN€åG€å@€å9€å2€å+€å$€å€å€å€å€å€åúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþ~å÷~åð~åé~åâ~åÛ~åÔ~åÍ~åÆ~å¿~å¸~å±~åª~å£~åœ~å•~åŽ~å‡~å€~åy~år~åk~åd~å]~åV~åO~åH~åA~å:~å3~å,~å%~å~å~å~å ~å~åû}åô}åí}åæ}åß}åØ}åÑ}åÊ}åÃ}å¼}åµ}å®}å§}å }å™}å’}å‹}å„}å}}åv}åo}åh}åa}åZ}åS}åL}åE}å>}å7}å0}å)}å"}å}å}å }å}åÿ|åø|åñ|åê|åã|åÜ|åÕ|åÎ|åÇ|åÀ|å¹|å²|å«|å¤|å|å–|å|åˆ|å|åz|ås|ål|åe|å^|åW|åP|åI|åB|å;|å4|å-|å&|å|å|å|å |å|åü{åõ{åî{åç{åà{åÙ{åÒ{åË{åÄ{å½{å¶{å¯{å¨{å¡{åš{å“{åŒ{å…{å~{åw{åp{åi{åb{å[{åT{åM{åF{å?{å8{å1{å*{å#{å{å{å{å{å{åùzåòzåëzåäzåÝzåÖzåÏzåÈzåÁzåºzå³zå¬zå¥zåžzå—zåzå‰zå‚zå{zåtzåmzåfzå_zåXzåQzåJzåCzåvå7vå0vå)vå"våvåvå våvåÿuåøuåñuåêuåãuåÜuåÕuåÎuåÇuåÀuå¹uå²uå«uå¤uåuå–uåuåˆuåuåzuåsuåluåeuå^uåWuåPuåIuåBuå;uå4uå-uå&uåuåuåuå uåuåütåõtåîtåçtåàtåÙtåÒtåËtåÄtå½tå¶tå¯tå¨tå¡tåštå“tåŒtå…tå~tåwtåptåitåbtå[tåTtåMtåFtå?tå8tå1tå*tå#tåtåtåtåtåtåùsåòsåësåäsåÝsåÖsåÏsåÈsåÁsåºså³så¬så¥såžså—såså‰så‚så{såtsåmsåfså_såXsåQsåJsåCsåoå7oå0oå)oå"oåoåoå oåoåÿnåønåñnåênåãnåÜnåÕnåÎnåÇnåÀnå¹nå²nå«nå¤nånå–nånåˆnånåznåsnålnåenå^nåWnåPnåInåBnå;nå4nå-nå&nånånånå nånåümåõmåîmåçmåàmåÙmåÒmåËmåÄmå½må¶må¯må¨må¡måšmå“måŒmå…må~måwmåpmåimåbmå[måTmåMmåFmå?må8må1må*må#måmåmåmåmåmåùlåòlåëlåälåÝlåÖlåÏlåÈlåÁlåºlå³lå¬lå¥låžlå—lålå‰lå‚lå{låtlåmlåflå_låXlåQlåJlåClåhå7hå0hå)hå"håhåhå håhåÿgåøgåñgåêgåãgåÜgåÕgåÎgåÇgåÀgå¹gå²gå«gå¤gågå–gågåˆgågåzgåsgålgåegå^gåWgåPgåIgåBgå;gå4gå-gå&gågågågå gågåüfåõfåîfåçfåàfåÙfåÒfåËfåÄfå½få¶få¯få¨få¡fåšfå“fåŒfå…få~fåwfåpfåifåbfå[fåTfåMfåFfå?få8få1få*få#fåfåfåfåfåfåùeåòeåëeåäeåÝeåÖeåÏeåÈeåÁeåºeå³eå¬eå¥eåžeå—eåeå‰eå‚eå{eåteåmeåfeå_eåXeåQeåJeåCeåaå7aå0aå)aå"aåaåaå aåaåÿ`åø`åñ`åê`åã`åÜ`åÕ`åÎ`åÇ`åÀ`å¹`å²`å«`å¤`å`å–`å`åˆ`å`åz`ås`ål`åe`å^`åW`åP`åI`åB`å;`å4`å-`å&`å`å`å`å `å`åü_åõ_åî_åç_åà_åÙ_åÒ_åË_åÄ_å½_å¶_å¯_å¨_å¡_åš_å“_åŒ_å…_å~_åw_åp_åi_åb_å[_åT_åM_åF_å?_å8_å1_å*_å#_å_å_å_å_å_åù^åò^åë^åä^åÝ^åÖ^åÏ^åÈ^åÁ^åº^å³^å¬^å¥^åž^å—^å^å‰^å‚^å{^åt^åm^åf^å_^åX^åQ^åJ^åC^å<^å5^å.^å'^å ^å^å^å ^å^åý]åö]åï]åè]åá]åÚ]åÓ]åÌ]åÅ]å¾]å·]å°]å©]å¢]å›]å”]å]å†]å]åx]åq]åj]åc]å\]åU]åN]åG]å@]å9]å2]å+]å$]å]å]å]å]å]åú\åó\åì\åå\åÞ\å×\åÐ\åÉ\åÂ\å»\å´\å­\å¦\åŸ\å˜\å‘\åŠ\åƒ\å|\åu\ån\åg\å`\åY\åR\åK\åD\å=\å6\å/\å(\å!\å\å\å \å\åþ[å÷[åð[åé[åâ[åÛ[åÔ[åÍ[åÆ[å¿[å¸[å±[åª[å£[åœ[å•[åŽ[å‡[å€[åy[år[åk[åd[å][åV[åO[åH[åA[å:[å3[å,[å%[å[å[å[å [å[åûZåôZåíZåæZåßZåØZåÑZåÊZåÃZå¼ZåµZå®Zå§Zå Zå™Zå’Zå‹Zå„Zå}ZåvZåoZåhZåaZåZZåSZåLZåEZå>Zå7Zå0Zå)Zå"ZåZåZå ZåZåÿYåøYåñYåêYåãYåÜYåÕYåÎYåÇYåÀYå¹Yå²Yå«Yå¤YåYå–YåYåˆYåYåzYåsYålYåeYå^YåWYåPYåIYåBYå;Yå4Yå-Yå&YåYåYåYå YåYåüXåõXåîXåçXåàXåÙXåÒXåËXåÄXå½Xå¶Xå¯Xå¨Xå¡XåšXå“XåŒXå…Xå~XåwXåpXåiXåbXå[XåTXåMXåFXå?Xå8Xå1Xå*Xå#XåXåXåXåXåXåùWåòWåëWåäWåÝWåÖWåÏWåÈWåÁWåºWå³Wå¬Wå¥WåžWå—WåWå‰Wå‚Wå{WåtWåmWåfWå_WåXWåQWåJWåCWåSå7Så0Så)Så"SåSåSå SåSåÿRåøRåñRåêRåãRåÜRåÕRåÎRåÇRåÀRå¹Rå²Rå«Rå¤RåRå–RåRåˆRåRåzRåsRålRåeRå^RåWRåPRåIRåBRå;Rå4Rå-Rå&RåRåRåRå RåRåüQåõQåîQåçQåàQåÙQåÒQåËQåÄQå½Qå¶Qå¯Qå¨Qå¡QåšQå“QåŒQå…Qå~QåwQåpQåiQåbQå[QåTQåMQåFQå?Qå8Qå1Qå*Qå#QåQåQåQåQåQåùPåòPåëPåäPåÝPåÖPåÏPåÈPåÁPåºPå³På¬På¥PåžPå—PåPå‰På‚På{PåtPåmPåfPå_PåXPåQPåJPåCPåLå7Lå0Lå)Lå"LåLåLå LåLåÿKåøKåñKåêKåãKåÜKåÕKåÎKåÇKåÀKå¹Kå²Kå«Kå¤KåKå–KåKåˆKåKåzKåsKålKåeKå^KåWKåPKåIKåBKå;Kå4Kå-Kå&KåKåKåKå KåKåüJåõJåîJåçJåàJåÙJåÒJåËJåÄJå½Jå¶Jå¯Jå¨Jå¡JåšJå“JåŒJå…Jå~JåwJåpJåiJåbJå[JåTJåMJåFJå?Jå8Jå1Jå*Jå#JåJåJåJåJåJåùIåòIåëIåäIåÝIåÖIåÏIåÈIåÁIåºIå³Iå¬Iå¥IåžIå—IåIå‰Iå‚Iå{IåtIåmIåfIå_IåXIåQIåJIåCIåEå7Eå0Eå)Eå"EåEåEå EåEåÿDåøDåñDåêDåãDåÜDåÕDåÎDåÇDåÀDå¹Då²Då«Då¤DåDå–DåDåˆDåDåzDåsDålDåeDå^DåWDåPDåIDåBDå;Då4Då-Då&DåDåDåDå DåDåüCåõCåîCåçCåàCåÙCåÒCåËCåÄCå½Cå¶Cå¯Cå¨Cå¡CåšCå“CåŒCå…Cå~CåwCåpCåiCåbCå[CåTCåMCåFCå?Cå8Cå1Cå*Cå#CåCåCåCåCåCåùBåòBåëBåäBåÝBåÖBåÏBåÈBåÁBåºBå³Bå¬Bå¥BåžBå—BåBå‰Bå‚Bå{BåtBåmBåfBå_BåXBåQBåJBåCBååô>åí>åæ>åß>åØ>åÑ>åÊ>åÃ>å¼>åµ>å®>å§>å >å™>å’>å‹>å„>å}>åv>åo>åh>åa>åZ>åS>åL>åE>å>>å7>å0>å)>å">å>å>å >å>åÿ=åø=åñ=åê=åã=åÜ=åÕ=åÎ=åÇ=åÀ=å¹=å²=å«=å¤=å=å–=å=åˆ=å=åz=ås=ål=åe=å^=åW=åP=åI=åB=å;=å4=å-=å&=å=å=å=å =å=åü<åõ<åî<åç<åà<åÙ<åÒ<åË<åÄ<å½<å¶<å¯<å¨<å¡<åš<å“<åŒ<å…<å~<åw<åp<åi<åb<å[<åT<åM<åF<å?<å8<å1<å*<å#<å<å<å<å<å<åù;åò;åë;åä;åÝ;åÖ;åÏ;åÈ;åÁ;åº;å³;å¬;å¥;åž;å—;å;å‰;å‚;å{;åt;åm;åf;å_;åX;åQ;åJ;åC;å<;å5;å.;å';å ;å;å;å ;å;åý:åö:åï:åè:åá:åÚ:åÓ:åÌ:åÅ:å¾:å·:å°:å©:å¢:å›:å”:å:å†:å:åx:åq:åj:åc:å\:åU:åN:åG:å@:å9:å2:å+:å$:å:å:å:å:å:åú9åó9åì9åå9åÞ9å×9åÐ9åÉ9åÂ9å»9å´9å­9å¦9åŸ9å˜9å‘9åŠ9åƒ9å|9åu9ån9åg9å`9åY9åR9åK9åD9å=9å69å/9å(9å!9å9å9å 9å9åþ8å÷8åð8åé8åâ8åÛ8åÔ8åÍ8åÆ8å¿8å¸8å±8åª8å£8åœ8å•8åŽ8å‡8å€8åy8år8åk8åd8å]8åV8åO8åH8åA8å:8å38å,8å%8å8å8å8å 8å8åû7åô7åí7åæ7åß7åØ7åÑ7åÊ7åÃ7å¼7åµ7å®7å§7å 7å™7å’7å‹7å„7å}7åv7åo7åh7åa7åZ7åS7åL7åE7å>7å77å07å)7å"7å7å7å 7å7åÿ6åø6åñ6åê6åã6åÜ6åÕ6åÎ6åÇ6åÀ6å¹6å²6å«6å¤6å6å–6å6åˆ6å6åz6ås6ål6åe6å^6åW6åP6åI6åB6å;6å46å-6å&6å6å6å6å 6å6åü5åõ5åî5åç5åà5åÙ5åÒ5åË5åÄ5å½5å¶5å¯5å¨5å¡5åš5å“5åŒ5å…5å~5åw5åp5åi5åb5å[5åT5åM5åF5å?5å85å15å*5å#5å5å5å5å5å5åù4åò4åë4åä4åÝ4åÖ4åÏ4åÈ4åÁ4åº4å³4å¬4å¥4åž4å—4å4å‰4å‚4å{4åt4åm4åf4å_4åX4åQ4åJ4åC4å<4å54å.4å'4å 4å4å4å 4å4åý3åö3åï3åè3åá3åÚ3åÓ3åÌ3åÅ3å¾3å·3å°3å©3å¢3å›3å”3å3å†3å3åx3åq3åj3åc3å\3åU3åN3åG3å@3å93å23å+3å$3å3å3å3å3å3åú2åó2åì2åå2åÞ2å×2åÐ2åÉ2åÂ2å»2å´2å­2å¦2åŸ2å˜2å‘2åŠ2åƒ2å|2åu2ån2åg2å`2åY2åR2åK2åD2å=2å62å/2å(2å!2å2å2å 2å2åþ1å÷1åð1åé1åâ1åÛ1åÔ1åÍ1åÆ1å¿1å¸1å±1åª1å£1åœ1å•1åŽ1å‡1å€1åy1år1åk1åd1å]1åV1åO1åH1åA1å:1å31å,1å%1å1å1å1å 1å1åû0åô0åí0åæ0åß0åØ0åÑ0åÊ0åÃ0å¼0åµ0å®0å§0å 0å™0å’0å‹0å„0å}0åv0åo0åh0åa0åZ0åS0åL0åE0å>0å70å00å)0å"0å0å0å 0å0åÿ/åø/åñ/åê/åã/åÜ/åÕ/åÎ/åÇ/åÀ/å¹/å²/å«/å¤/å/å–/å/åˆ/å/åz/ås/ål/åe/å^/åW/åP/åI/åB/å;/å4/å-/å&/å/å/å/å /å/åü.åõ.åî.åç.åà.åÙ.åÒ.åË.åÄ.å½.å¶.å¯.å¨.å¡.åš.å“.åŒ.å….å~.åw.åp.åi.åb.å[.åT.åM.åF.å?.å8.å1.å*.å#.å.å.å.å.å.åù-åò-åë-åä-åÝ-åÖ-åÏ-åÈ-åÁ-åº-å³-å¬-å¥-åž-å—-å-å‰-å‚-å{-åt-åm-åf-å_-åX-åQ-åJ-åC-å<-å5-å.-å'-å -å-å-å -å-åý,åö,åï,åè,åá,åÚ,åÓ,åÌ,åÅ,å¾,å·,å°,å©,å¢,å›,å”,å,å†,å,åx,åq,åj,åc,å\,åU,åN,åG,å@,å9,å2,å+,å$,å,å,å,å,å,åú+åó+åì+åå+åÞ+å×+åÐ+åÉ+åÂ+å»+å´+å­+å¦+åŸ+å˜+å‘+åŠ+åƒ+å|+åu+ån+åg+å`+åY+åR+åK+åD+å=+å6+å/+å(+å!+å+å+å +å+åþ*å÷*åð*åé*åâ*åÛ*åÔ*åÍ*åÆ*å¿*å¸*å±*åª*å£*åœ*å•*åŽ*å‡*å€*åy*år*åk*åd*å]*åV*åO*åH*åA*å:*å3*å,*å%*å*å*å*å *å*åû)åô)åí)åæ)åß)åØ)åÑ)åÊ)åÃ)å¼)åµ)å®)å§)å )å™)å’)å‹)å„)å})åv)åo)åh)åa)åZ)åS)åL)åE)å>)å7)å0)å))å")å)å)å )å)åÿ(åø(åñ(åê(åã(åÜ(åÕ(åÎ(åÇ(åÀ(å¹(å²(å«(å¤(å(å–(å(åˆ(å(åz(ås(ål(åe(å^(åW(åP(åI(åB(å;(å4(å-(å&(å(å(å(å (å(åü'åõ'åî'åç'åà'åÙ'åÒ'åË'åÄ'å½'å¶'å¯'å¨'å¡'åš'å“'åŒ'å…'å~'åw'åp'åi'åb'å['åT'åM'åF'å?'å8'å1'å*'å#'å'å'å'å'å'åù&åò&åë&åä&åÝ&åÖ&åÏ&åÈ&åÁ&åº&å³&å¬&å¥&åž&å—&å&å‰&å‚&å{&åt&åm&åf&å_&åX&åQ&åJ&åC&å<&å5&å.&å'&å &å&å&å &å&åý%åö%åï%åè%åá%åÚ%åÓ%åÌ%åÅ%å¾%å·%å°%å©%å¢%å›%å”%å%å†%å%åx%åq%åj%åc%å\%åU%åN%åG%å@%å9%å2%å+%å$%å%å%å%å%å%åú$åó$åì$åå$åÞ$å×$åÐ$åÉ$åÂ$å»$å´$å­$å¦$åŸ$å˜$å‘$åŠ$åƒ$å|$åu$ån$åg$å`$åY$åR$åK$åD$å=$å6$å/$å($å!$å$å$å $å$åþ#å÷#åð#åé#åâ#åÛ#åÔ#åÍ#åÆ#å¿#å¸#å±#åª#å£#åœ#å•#åŽ#å‡#å€#åy#år#åk#åd#å]#åV#åO#åH#åA#å:#å3#å,#å%#å#å#å#å #å#åû"åô"åí"åæ"åß"åØ"åÑ"åÊ"åÃ"å¼"åµ"å®"å§"å "å™"å’"å‹"å„"å}"åv"åo"åh"åa"åZ"åS"åL"åE"å>"å7"å0"å)"å""å"å"å "å"åÿ!åø!åñ!åê!åã!åÜ!åÕ!åÎ!åÇ!åÀ!å¹!å²!å«!å¤!å!å–!å!åˆ!å!åz!ås!ål!åe!å^!åW!åP!åI!åB!å;!å4!å-!å&!å!å!å!å !å!åü åõ åî åç åà åÙ åÒ åË åÄ å½ å¶ å¯ å¨ å¡ åš å“ åŒ å… å~ åw åp åi åb å[ åT åM åF å? å8 å1 å* å# å å å å å åùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååû åô åí åæ åß åØ åÑ åÊ åà å¼ åµ å® å§ å  å™ å’ å‹ å„ å} åv åo åh åa åZ åS åL åE å> å7 å0 å) å" å å å å åÿ åø åñ åê åã åÜ åÕ åÎ åÇ åÀ å¹ å² å« å¤ å å– å åˆ å åz ås ål åe å^ åW åP åI åB å; å4 å- å& å å å å å åü åõ åî åç åà åÙ åÒ åË åÄ å½ å¶ å¯ å¨ å¡ åš å“ åŒ å… å~ åw åp åi åb å[ åT åM åF å? å8 å1 å* å# å å å å å åù åò åë åä åÝ åÖ åÏ åÈ åÁ åº å³ å¬ å¥ åž å— å å‰ å‚ å{ åt åm åf å_ åX åQ åJ åC å< å5 å. å' å å å å å åý åö åï åè åá åÚ åÓ åÌ åÅ å¾ å· å° å© å¢ å› å” å å† å åx åq åj åc å\ åU åN åG å@ å9 å2 å+ å$ å å å å å åúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûÿäôÿäíÿäæÿäßÿäØÿäÑÿäÊÿäÃÿä¼ÿäµÿä®ÿä§ÿä ÿä™ÿä’ÿä‹ÿä„ÿä}ÿävÿäoÿähÿäaÿäZÿäSÿäLÿäEÿä>ÿä7ÿä0ÿä)ÿä"ÿäÿäÿä ÿäÿäÿþäøþäñþäêþäãþäÜþäÕþäÎþäÇþäÀþä¹þä²þä«þä¤þäþä–þäþäˆþäþäzþäsþälþäeþä^þäWþäPþäIþäBþä;þä4þä-þä&þäþäþäþä þäþäüýäõýäîýäçýäàýäÙýäÒýäËýäÄýä½ýä¶ýä¯ýä¨ýä¡ýäšýä“ýäŒýä…ýä~ýäwýäpýäiýäbýä[ýäTýäMýäFýä?ýä8ýä1ýä*ýä#ýäýäýäýäýäýäùüäòüäëüääüäÝüäÖüäÏüäÈüäÁüäºüä³üä¬üä¥üäžüä—üäüä‰üä‚üä{üätüämüäfüä_üäXüäQüäJüäCüä<üä5üä.üä'üä üäüäüä üäüäýûäöûäïûäèûäáûäÚûäÓûäÌûäÅûä¾ûä·ûä°ûä©ûä¢ûä›ûä”ûäûä†ûäûäxûäqûäjûäcûä\ûäUûäNûäGûä@ûä9ûä2ûä+ûä$ûäûäûäûäûäûäúúäóúäìúäåúäÞúä×úäÐúäÉúäÂúä»úä´úä­úä¦úäŸúä˜úä‘úäŠúäƒúä|úäuúänúägúä`úäYúäRúäKúäDúä=úä6úä/úä(úä!úäúäúä úäúäþùä÷ùäðùäéùäâùäÛùäÔùäÍùäÆùä¿ùä¸ùä±ùäªùä£ùäœùä•ùäŽùä‡ùä€ùäyùärùäkùädùä]ùäVùäOùäHùäAùä:ùä3ùä,ùä%ùäùäùäùä ùäùäûøäôøäíøäæøä߸䨸äÑøäÊøäÃøä¼øäµøä®øä§øä øä™øä’øä‹øä„øä}øävøäoøähøäaøäZøäSøäLøäEøä>øä7øä0øä)øä"øäøäøä øäøäÿ÷äø÷äñ÷äê÷äã÷äÜ÷äÕ÷äÎ÷äÇ÷äÀ÷ä¹÷ä²÷ä«÷ä¤÷ä÷ä–÷ä÷äˆ÷ä÷äz÷äs÷äl÷äe÷ä^÷äW÷äP÷äI÷äB÷ä;÷ä4÷ä-÷ä&÷ä÷ä÷ä÷ä ÷ä÷äüöäõöäîöäçöäàöäÙöäÒöäËöäÄöä½öä¶öä¯öä¨öä¡öäšöä“öäŒöä…öä~öäwöäpöäiöäböä[öäTöäMöäFöä?öä8öä1öä*öä#öäöäöäöäöäöäùõäòõäëõääõäÝõäÖõäÏõäÈõäÁõäºõä³õä¬õä¥õäžõä—õäõä‰õä‚õä{õätõämõäfõä_õäXõäQõäJõäCõä<õä5õä.õä'õä õäõäõä õäõäýôäöôäïôäèôäáôäÚôäÓôäÌôäÅôä¾ôä·ôä°ôä©ôä¢ôä›ôä”ôäôä†ôäôäxôäqôäjôäcôä\ôäUôäNôäGôä@ôä9ôä2ôä+ôä$ôäôäôäôäôäôäúóäóóäìóäåóäÞóä×óäÐóäÉóäÂóä»óä´óä­óä¦óäŸóä˜óä‘óäŠóäƒóä|óäuóänóägóä`óäYóäRóäKóäDóä=óä6óä/óä(óä!óäóäóä óäóäþòä÷òäðòäéòäâòäÛòäÔòäÍòäÆòä¿òä¸òä±òäªòä£òäœòä•òäŽòä‡òä€òäyòäròäkòädòä]òäVòäOòäHòäAòä:òä3òä,òä%òäòäòäòä òäòäûñäôñäíñäæñäßñäØñäÑñäÊñäÃñä¼ñäµñä®ñä§ñä ñä™ñä’ñä‹ñä„ñä}ñävñäoñähñäañäZñäSñäLñäEñä>ñä7ñä0ñä)ñä"ñäñäñä ñäñäÿðäøðäñðäêðäãðäÜðäÕðäÎðäÇðäÀðä¹ðä²ðä«ðä¤ðäðä–ðäðäˆðäðäzðäsðälðäeðä^ðäWðäPðäIðäBðä;ðä4ðä-ðä&ðäðäðäðä ðäðäüïäõïäîïäçïäàïäÙïäÒïäËïäÄïä½ïä¶ïä¯ïä¨ïä¡ïäšïä“ïäŒïä…ïä~ïäwïäpïäiïäbïä[ïäTïäMïäFïä?ïä8ïä1ïä*ïä#ïäïäïäïäïäïäùîäòîäëîääîäÝîäÖîäÏîäÈîäÁîäºîä³îä¬îä¥îäžîä—îäîä‰îä‚îä{îätîämîäfîä_îäXîäQîäJîäCîä<îä5îä.îä'îä îäîäîä îäîäýíäöíäïíäèíäáíäÚíäÓíäÌíäÅíä¾íä·íä°íä©íä¢íä›íä”íäíä†íäíäxíäqíäjíäcíä\íäUíäNíäGíä@íä9íä2íä+íä$íäíäíäíäíäíäúìäóìäììäåìäÞìä×ìäÐìäÉìäÂìä»ìä´ìä­ìä¦ìäŸìä˜ìä‘ìäŠìäƒìä|ìäuìänìägìä`ìäYìäRìäKìäDìä=ìä6ìä/ìä(ìä!ìäìäìä ìäìäþëä÷ëäðëäéëäâëäÛëäÔëäÍëäÆëä¿ëä¸ëä±ëäªëä£ëäœëä•ëäŽëä‡ëä€ëäyëärëäkëädëä]ëäVëäOëäHëäAëä:ëä3ëä,ëä%ëäëäëäëä ëäëäûêäôêäíêäæêäßêäØêäÑêäÊêäÃêä¼êäµêä®êä§êä êä™êä’êä‹êä„êä}êävêäoêähêäaêäZêäSêäLêäEêä>êä7êä0êä)êä"êäêäêä êäêäÿéäøéäñéäêéäãéäÜéäÕéäÎéäÇéäÀéä¹éä²éä«éä¤éäéä–éäéäˆéäéäzéäséäléäeéä^éäWéäPéäIéäBéä;éä4éä-éä&éäéäéäéä éäéäüèäõèäîèäçèäàèäÙèäÒèäËèäÄèä½èä¶èä¯èä¨èä¡èäšèä“èäŒèä…èä~èäwèäpèäièäbèä[èäTèäMèäFèä?èä8èä1èä*èä#èäèäèäèäèäèäùçäòçäëçääçäÝçäÖçäÏçäÈçäÁçäºçä³çä¬çä¥çäžçä—çäçä‰çä‚çä{çätçämçäfçä_çäXçäQçäJçäCçä<çä5çä.çä'çä çäçäçä çäçäýæäöæäïæäèæäáæäÚæäÓæäÌæäſ便䷿䰿䩿䢿䛿䔿äæä†æäæäxæäqæäjæäcæä\æäUæäNæäGæä@æä9æä2æä+æä$æäæäæäæäæäæäúåäóåäìåäååäÞåä×åäÐåäÉåäÂåä»åä´åä­åä¦åäŸåä˜åä‘åäŠåäƒåä|åäuåänåägåä`åäYåäRåäKåäDåä=åä6åä/åä(åä!åäåäåä åäåäþää÷ääðääéääâääÛääÔääÍääÆää¿ää¸ää±ääªää£ääœää•ääŽää‡ää€ääyäärääkäädää]ääVääOääHääAää:ää3ää,ää%ääääääää ääääûãäôãäíãäæãäßãäØãäÑãäÊãäÃãä¼ãäµãä®ãä§ãä ãä™ãä’ãä‹ãä„ãä}ãävãäoãähãäaãäZãäSãäLãäEãä>ãä7ãä0ãä)ãä"ãäãäãä ãäãäÿâäøâäñâäêâäãâäÜâäÕâäÎâäÇâäÀâä¹âä²âä«âä¤âäâä–âäâäˆâäâäzâäsâälâäeâä^âäWâäPâäIâäBâä;âä4âä-âä&âäâäâäâä âäâäüáäõáäîáäçáäàáäÙáäÒáäËáäÄáä½áä¶áä¯áä¨áä¡áäšáä“áäŒáä…áä~áäwáäpáäiáäbáä[áäTáäMáäFáä?áä8áä1áä*áä#áäáäáäáäáäáäùàäòàäëàääàäÝàäÖàäÏàäÈàäÁàäºàä³àä¬àä¥àäžàä—àäàä‰àä‚àä{àätàämàäfàä_àäXàäQàäJàäCàä<àä5àä.àä'àä àäàäàä àäàäýßäößäïßäèßäáßäÚßäÓßäÌßäÅßä¾ßä·ßä°ßä©ßä¢ßä›ßä”ßäßä†ßäßäxßäqßäjßäcßä\ßäUßäNßäGßä@ßä9ßä2ßä+ßä$ßäßäßäßäßäßäúÞäóÞäìÞäåÞäÞÞä×ÞäÐÞäÉÞäÂÞä»Þä´Þä­Þä¦ÞäŸÞä˜Þä‘ÞäŠÞäƒÞä|ÞäuÞänÞägÞä`ÞäYÞäRÞäKÞäDÞä=Þä6Þä/Þä(Þä!ÞäÞäÞä ÞäÞäþÝä÷ÝäðÝäéÝäâÝäÛÝäÔÝäÍÝäÆÝä¿Ýä¸Ýä±ÝäªÝä£ÝäœÝä•ÝäŽÝä‡Ýä€ÝäyÝärÝäkÝädÝä]ÝäVÝäOÝäHÝäAÝä:Ýä3Ýä,Ýä%ÝäÝäÝäÝä ÝäÝäûÜäôÜäíÜäæÜäßÜäØÜäÑÜäÊÜäÃÜä¼ÜäµÜä®Üä§Üä Üä™Üä’Üä‹Üä„Üä}ÜävÜäoÜähÜäaÜäZÜäSÜäLÜäEÜä>Üä7Üä0Üä)Üä"ÜäÜäÜä ÜäÜäÿÛäøÛäñÛäêÛäãÛäÜÛäÕÛäÎÛäÇÛäÀÛä¹Ûä²Ûä«Ûä¤ÛäÛä–ÛäÛäˆÛäÛäzÛäsÛälÛäeÛä^ÛäWÛäPÛäIÛäBÛä;Ûä4Ûä-Ûä&ÛäÛäÛäÛä ÛäÛäüÚäõÚäîÚäçÚäàÚäÙÚäÒÚäËÚäÄÚä½Úä¶Úä¯Úä¨Úä¡ÚäšÚä“ÚäŒÚä…Úä~ÚäwÚäpÚäiÚäbÚä[ÚäTÚäMÚäFÚä?Úä8Úä1Úä*Úä#ÚäÚäÚäÚäÚäÚäùÙäòÙäëÙääÙäÝÙäÖÙäÏÙäÈÙäÁÙäºÙä³Ùä¬Ùä¥ÙäžÙä—ÙäÙä‰Ùä‚Ùä{ÙätÙämÙäfÙä_ÙäXÙäQÙäJÙäCÙä<Ùä5Ùä.Ùä'Ùä ÙäÙäÙä ÙäÙäýØäöØäïØäèØäáØäÚØäÓØäÌØäŨ侨䷨䰨䩨䢨䛨䔨äØä†ØäØäxØäqØäjØäcØä\ØäUØäNØäGØä@Øä9Øä2Øä+Øä$ØäØäØäØäØäØäú×äó×äì×äå×äÞ×ä××äÐ×äÉ×äÂ×ä»×ä´×ä­×ä¦×äŸ×ä˜×ä‘×äŠ×äƒ×ä|×äu×än×äg×ä`×äY×äR×äK×äD×ä=×ä6×ä/×ä(×ä!×ä×ä×ä ×ä×äþÖä÷ÖäðÖäéÖäâÖäÛÖäÔÖäÍÖäÆÖä¿Öä¸Öä±ÖäªÖä£ÖäœÖä•ÖäŽÖä‡Öä€ÖäyÖärÖäkÖädÖä]ÖäVÖäOÖäHÖäAÖä:Öä3Öä,Öä%ÖäÖäÖäÖä ÖäÖäûÕäôÕäíÕäæÕäßÕäØÕäÑÕäÊÕäÃÕä¼ÕäµÕä®Õä§Õä Õä™Õä’Õä‹Õä„Õä}ÕävÕäoÕähÕäaÕäZÕäSÕäLÕäEÕä>Õä7Õä0Õä)Õä"ÕäÕäÕä ÕäÕäÿÔäøÔäñÔäêÔäãÔäÜÔäÕÔäÎÔäÇÔäÀÔä¹Ôä²Ôä«Ôä¤ÔäÔä–ÔäÔäˆÔäÔäzÔäsÔälÔäeÔä^ÔäWÔäPÔäIÔäBÔä;Ôä4Ôä-Ôä&ÔäÔäÔäÔä ÔäÔäüÓäõÓäîÓäçÓäàÓäÙÓäÒÓäËÓäÄÓä½Óä¶Óä¯Óä¨Óä¡ÓäšÓä“ÓäŒÓä…Óä~ÓäwÓäpÓäiÓäbÓä[ÓäTÓäMÓäFÓä?Óä8Óä1Óä*Óä#ÓäÓäÓäÓäÓäÓäùÒäòÒäëÒääÒäÝÒäÖÒäÏÒäÈÒäÁÒäºÒä³Òä¬Òä¥ÒäžÒä—ÒäÒä‰Òä‚Òä{ÒätÒämÒäfÒä_ÒäXÒäQÒäJÒäCÒä<Òä5Òä.Òä'Òä ÒäÒäÒä ÒäÒäýÑäöÑäïÑäèÑäáÑäÚÑäÓÑäÌÑäÅÑä¾Ñä·Ñä°Ñä©Ñä¢Ñä›Ñä”ÑäÑä†ÑäÑäxÑäqÑäjÑäcÑä\ÑäUÑäNÑäGÑä@Ñä9Ñä2Ñä+Ñä$ÑäÑäÑäÑäÑäÑäúÐäóÐäìÐäåÐäÞÐä×ÐäÐÐäÉÐäÂÐä»Ðä´Ðä­Ðä¦ÐäŸÐä˜Ðä‘ÐäŠÐäƒÐä|ÐäuÐänÐägÐä`ÐäYÐäRÐäKÐäDÐä=Ðä6Ðä/Ðä(Ðä!ÐäÐäÐä ÐäÐäþÏä÷ÏäðÏäéÏäâÏäÛÏäÔÏäÍÏäÆÏä¿Ïä¸Ïä±ÏäªÏä£ÏäœÏä•ÏäŽÏä‡Ïä€ÏäyÏärÏäkÏädÏä]ÏäVÏäOÏäHÏäAÏä:Ïä3Ïä,Ïä%ÏäÏäÏäÏä ÏäÏäûÎäôÎäíÎäæÎäßÎäØÎäÑÎäÊÎäÃÎä¼ÎäµÎä®Îä§Îä Îä™Îä’Îä‹Îä„Îä}ÎävÎäoÎähÎäaÎäZÎäSÎäLÎäEÎä>Îä7Îä0Îä)Îä"ÎäÎäÎä ÎäÎäÿÍäøÍäñÍäêÍäãÍäÜÍäÕÍäÎÍäÇÍäÀÍä¹Íä²Íä«Íä¤ÍäÍä–ÍäÍäˆÍäÍäzÍäsÍälÍäeÍä^ÍäWÍäPÍäIÍäBÍä;Íä4Íä-Íä&ÍäÍäÍäÍä ÍäÍäüÌäõÌäîÌäçÌäàÌäÙÌäÒÌäËÌäÄÌä½Ìä¶Ìä¯Ìä¨Ìä¡ÌäšÌä“ÌäŒÌä…Ìä~ÌäwÌäpÌäiÌäbÌä[ÌäTÌäMÌäFÌä?Ìä8Ìä1Ìä*Ìä#ÌäÌäÌäÌäÌäÌäùËäòËäëËääËäÝËäÖËäÏËäÈËäÁËäºËä³Ëä¬Ëä¥ËäžËä—ËäËä‰Ëä‚Ëä{ËätËämËäfËä_ËäXËäQËäJËäCËä<Ëä5Ëä.Ëä'Ëä ËäËäËä ËäËäýÊäöÊäïÊäèÊäáÊäÚÊäÓÊäÌÊäÅÊä¾Êä·Êä°Êä©Êä¢Êä›Êä”ÊäÊä†ÊäÊäxÊäqÊäjÊäcÊä\ÊäUÊäNÊäGÊä@Êä9Êä2Êä+Êä$ÊäÊäÊäÊäÊäÊäúÉäóÉäìÉäåÉäÞÉä×ÉäÐÉäÉÉäÂÉä»Éä´Éä­Éä¦ÉäŸÉä˜Éä‘ÉäŠÉäƒÉä|ÉäuÉänÉägÉä`ÉäYÉäRÉäKÉäDÉä=Éä6Éä/Éä(Éä!ÉäÉäÉä ÉäÉäþÈä÷ÈäðÈäéÈäâÈäÛÈäÔÈäÍÈäÆÈä¿Èä¸Èä±ÈäªÈä£ÈäœÈä•ÈäŽÈä‡Èä€ÈäyÈärÈäkÈädÈä]ÈäVÈäOÈäHÈäAÈä:Èä3Èä,Èä%ÈäÈäÈäÈä ÈäÈäûÇäôÇäíÇäæÇäßÇäØÇäÑÇäÊÇäÃÇä¼ÇäµÇä®Çä§Çä Çä™Çä’Çä‹Çä„Çä}ÇävÇäoÇähÇäaÇäZÇäSÇäLÇäEÇä>Çä7Çä0Çä)Çä"ÇäÇäÇä ÇäÇäÿÆäøÆäñÆäêÆäãÆäÜÆäÕÆäÎÆäÇÆäÀÆä¹Æä²Æä«Æä¤ÆäÆä–ÆäÆäˆÆäÆäzÆäsÆälÆäeÆä^ÆäWÆäPÆäIÆäBÆä;Æä4Æä-Æä&ÆäÆäÆäÆä ÆäÆäüÅäõÅäîÅäçÅäàÅäÙÅäÒÅäËÅäÄÅä½Åä¶Åä¯Åä¨Åä¡ÅäšÅä“ÅäŒÅä…Åä~ÅäwÅäpÅäiÅäbÅä[ÅäTÅäMÅäFÅä?Åä8Åä1Åä*Åä#ÅäÅäÅäÅäÅäÅäùÄäòÄäëÄääÄäÝÄäÖÄäÏÄäÈÄäÁÄäºÄä³Ää¬Ää¥ÄäžÄä—ÄäÄä‰Ää‚Ää{ÄätÄämÄäfÄä_ÄäXÄäQÄäJÄäCÄä<Ää5Ää.Ää'Ää ÄäÄäÄä ÄäÄäýÃäöÃäïÃäèÃäáÃäÚÃäÓÃäÌÃäÅÃä¾Ãä·Ãä°Ãä©Ãä¢Ãä›Ãä”ÃäÃä†ÃäÃäxÃäqÃäjÃäcÃä\ÃäUÃäNÃäGÃä@Ãä9Ãä2Ãä+Ãä$ÃäÃäÃäÃäÃäÃäúÂäóÂäìÂäåÂäÞÂä×ÂäÐÂäÉÂäÂÂä»Âä´Âä­Âä¦ÂäŸÂä˜Âä‘ÂäŠÂäƒÂä|ÂäuÂänÂägÂä`ÂäYÂäRÂäKÂäDÂä=Âä6Âä/Âä(Âä!ÂäÂäÂä ÂäÂäþÁä÷ÁäðÁäéÁäâÁäÛÁäÔÁäÍÁäÆÁä¿Áä¸Áä±ÁäªÁä£ÁäœÁä•ÁäŽÁä‡Áä€ÁäyÁärÁäkÁädÁä]ÁäVÁäOÁäHÁäAÁä:Áä3Áä,Áä%ÁäÁäÁäÁä ÁäÁäûÀäôÀäíÀäæÀäßÀäØÀäÑÀäÊÀäÃÀä¼ÀäµÀä®Àä§Àä Àä™Àä’Àä‹Àä„Àä}ÀävÀäoÀähÀäaÀäZÀäSÀäLÀäEÀä>Àä7Àä0Àä)Àä"ÀäÀäÀä ÀäÀäÿ¿äø¿äñ¿äê¿äã¿äÜ¿äÕ¿äοäÇ¿äÀ¿ä¹¿ä²¿ä«¿ä¤¿ä¿ä–¿ä¿äˆ¿ä¿äz¿äs¿äl¿äe¿ä^¿äW¿äP¿äI¿äB¿ä;¿ä4¿ä-¿ä&¿ä¿ä¿ä¿ä ¿ä¿äü¾äõ¾äî¾äç¾äà¾äÙ¾äÒ¾ä˾äľä½¾ä¶¾ä¯¾ä¨¾ä¡¾äš¾ä“¾äŒ¾ä…¾ä~¾äw¾äp¾äi¾äb¾ä[¾äT¾äM¾äF¾ä?¾ä8¾ä1¾ä*¾ä#¾ä¾ä¾ä¾ä¾ä¾äù½äò½äë½ää½äݽäÖ½äϽäȽäÁ½äº½ä³½ä¬½ä¥½äž½ä—½ä½ä‰½ä‚½ä{½ät½äm½äf½ä_½äX½äQ½äJ½äC½ä<½ä5½ä.½ä'½ä ½ä½ä½ä ½ä½äý¼äö¼äï¼äè¼äá¼äÚ¼äÓ¼ä̼äżä¾¼ä·¼ä°¼ä©¼ä¢¼ä›¼ä”¼ä¼ä†¼ä¼äx¼äq¼äj¼äc¼ä\¼äU¼äN¼äG¼ä@¼ä9¼ä2¼ä+¼ä$¼ä¼ä¼ä¼ä¼ä¼äú»äó»äì»äå»äÞ»ä×»äлäÉ»ä»ä»»ä´»ä­»ä¦»äŸ»ä˜»ä‘»äŠ»äƒ»ä|»äu»än»äg»ä`»äY»äR»äK»äD»ä=»ä6»ä/»ä(»ä!»ä»ä»ä »ä»äþºä÷ºäðºäéºäâºäÛºäÔºäͺäƺ俺为䱺䪺䣺䜺䕺䎺䇺䀺äyºärºäkºädºä]ºäVºäOºäHºäAºä:ºä3ºä,ºä%ºäºäºäºä ºäºäû¹äô¹äí¹äæ¹äß¹äعäѹäʹäù伹䵹䮹䧹䠹䙹䒹䋹䄹ä}¹äv¹äo¹äh¹äa¹äZ¹äS¹äL¹äE¹ä>¹ä7¹ä0¹ä)¹ä"¹ä¹ä¹ä ¹ä¹äÿ¸äø¸äñ¸äê¸äã¸äܸäÕ¸äθäǸäÀ¸ä¹¸ä²¸ä«¸ä¤¸ä¸ä–¸ä¸äˆ¸ä¸äz¸äs¸äl¸äe¸ä^¸äW¸äP¸äI¸äB¸ä;¸ä4¸ä-¸ä&¸ä¸ä¸ä¸ä ¸ä¸äü·äõ·äî·äç·äà·äÙ·äÒ·äË·äķ佷䶷䯷䨷䡷䚷䓷䌷䅷ä~·äw·äp·äi·äb·ä[·äT·äM·äF·ä?·ä8·ä1·ä*·ä#·ä·ä·ä·ä·ä·äù¶äò¶äë¶ää¶äݶäÖ¶ä϶äȶäÁ¶äº¶ä³¶ä¬¶ä¥¶äž¶ä—¶ä¶ä‰¶ä‚¶ä{¶ät¶äm¶äf¶ä_¶äX¶äQ¶äJ¶äC¶ä<¶ä5¶ä.¶ä'¶ä ¶ä¶ä¶ä ¶ä¶äýµäöµäïµäèµäáµäÚµäÓµä̵äŵ侵䷵䰵䩵䢵䛵䔵äµä†µäµäxµäqµäjµäcµä\µäUµäNµäGµä@µä9µä2µä+µä$µäµäµäµäµäµäú´äó´äì´äå´äÞ´ä×´äдäÉ´ä´ä»´ä´´ä­´ä¦´äŸ´ä˜´ä‘´äŠ´äƒ´ä|´äu´än´äg´ä`´äY´äR´äK´äD´ä=´ä6´ä/´ä(´ä!´ä´ä´ä ´ä´äþ³ä÷³äð³äé³äâ³äÛ³äÔ³äͳäƳ俳丳䱳䪳䣳䜳䕳ä޳䇳䀳äy³är³äk³äd³ä]³äV³äO³äH³äA³ä:³ä3³ä,³ä%³ä³ä³ä³ä ³ä³äû²äô²äí²äæ²äß²äزäѲäʲäò伲䵲䮲䧲䠲䙲䒲䋲䄲ä}²äv²äo²äh²äa²äZ²äS²äL²äE²ä>²ä7²ä0²ä)²ä"²ä²ä²ä ²ä²äÿ±äø±äñ±äê±äã±äܱäÕ±äαäDZäÀ±ä¹±ä²±ä«±ä¤±ä±ä–±ä±äˆ±ä±äz±äs±äl±äe±ä^±äW±äP±äI±äB±ä;±ä4±ä-±ä&±ä±ä±ä±ä ±ä±äü°äõ°äî°äç°äà°äÙ°äÒ°ä˰äİ佰䶰䯰䨰䡰䚰䓰䌰䅰ä~°äw°äp°äi°äb°ä[°äT°äM°äF°ä?°ä8°ä1°ä*°ä#°ä°ä°ä°ä°ä°äù¯äò¯äë¯ää¯äݯäÖ¯äϯäȯäÁ¯äº¯ä³¯ä¬¯ä¥¯äž¯ä—¯ä¯ä‰¯ä‚¯ä{¯ät¯äm¯äf¯ä_¯äX¯äQ¯äJ¯äC¯ä<¯ä5¯ä.¯ä'¯ä ¯ä¯ä¯ä ¯ä¯äý®äö®äï®äè®äá®äÚ®äÓ®äÌ®äŮ侮䷮䰮䩮䢮䛮䔮ä®ä†®ä®äx®äq®äj®äc®ä\®äU®äN®äG®ä@®ä9®ä2®ä+®ä$®ä®ä®ä®ä®ä®äú­äó­äì­äå­äÞ­ä×­äЭäÉ­ä­ä»­ä´­ä­­ä¦­äŸ­ä˜­ä‘­äŠ­äƒ­ä|­äu­än­äg­ä`­äY­äR­äK­äD­ä=­ä6­ä/­ä(­ä!­ä­ä­ä ­ä­äþ¬ä÷¬äð¬äé¬äâ¬äÛ¬äÔ¬äͬäƬ俬丬䱬䪬䣬䜬䕬äެ䇬䀬äy¬är¬äk¬äd¬ä]¬äV¬äO¬äH¬äA¬ä:¬ä3¬ä,¬ä%¬ä¬ä¬ä¬ä ¬ä¬äû«äô«äí«äæ«ä߫䨫äÑ«äÊ«äë伫䵫䮫䧫䠫䙫䒫䋫䄫ä}«äv«äo«äh«äa«äZ«äS«äL«äE«ä>«ä7«ä0«ä)«ä"«ä«ä«ä «ä«äÿªäøªäñªäêªäãªäܪäÕªäΪäǪäÀªä¹ªä²ªä«ªä¤ªäªä–ªäªäˆªäªäzªäsªälªäeªä^ªäWªäPªäIªäBªä;ªä4ªä-ªä&ªäªäªäªä ªäªäü©äõ©äî©äç©äà©äÙ©äÒ©äË©äĩ佩䶩䯩䨩䡩䚩䓩䌩䅩ä~©äw©äp©äi©äb©ä[©äT©äM©äF©ä?©ä8©ä1©ä*©ä#©ä©ä©ä©ä©ä©äù¨äò¨äë¨ää¨äݨäÖ¨äϨäȨäÁ¨äº¨ä³¨ä¬¨ä¥¨äž¨ä—¨ä¨ä‰¨ä‚¨ä{¨ät¨äm¨äf¨ä_¨äX¨äQ¨äJ¨äC¨ä<¨ä5¨ä.¨ä'¨ä ¨ä¨ä¨ä ¨ä¨äý§äö§äï§äè§äá§äÚ§äÓ§ä̧äŧ侧䷧䰧䩧䢧䛧䔧ä§ä†§ä§äx§äq§äj§äc§ä\§äU§äN§äG§ä@§ä9§ä2§ä+§ä$§ä§ä§ä§ä§ä§äú¦äó¦äì¦äå¦äÞ¦äצäЦäɦä¦ä»¦ä´¦ä­¦ä¦¦äŸ¦ä˜¦ä‘¦äЦ䃦ä|¦äu¦än¦äg¦ä`¦äY¦äR¦äK¦äD¦ä=¦ä6¦ä/¦ä(¦ä!¦ä¦ä¦ä ¦ä¦äþ¥ä÷¥äð¥äé¥äâ¥äÛ¥äÔ¥äÍ¥äÆ¥ä¿¥ä¸¥ä±¥äª¥ä£¥äœ¥ä•¥äŽ¥ä‡¥ä€¥äy¥är¥äk¥äd¥ä]¥äV¥äO¥äH¥äA¥ä:¥ä3¥ä,¥ä%¥ä¥ä¥ä¥ä ¥ä¥äû¤äô¤äí¤äæ¤äߤäؤäѤäʤää伤䵤䮤䧤䠤䙤䒤䋤䄤ä}¤äv¤äo¤äh¤äa¤äZ¤äS¤äL¤äE¤ä>¤ä7¤ä0¤ä)¤ä"¤ä¤ä¤ä ¤ä¤äÿ£äø£äñ£äê£äã£äÜ£äÕ£äΣäÇ£äÀ£ä¹£ä²£ä«£ä¤£ä£ä–£ä£äˆ£ä£äz£äs£äl£äe£ä^£äW£äP£äI£äB£ä;£ä4£ä-£ä&£ä£ä£ä£ä £ä£äü¢äõ¢äî¢äç¢äà¢äÙ¢äÒ¢äË¢äĢ佢䶢䯢䨢䡢䚢䓢䌢䅢ä~¢äw¢äp¢äi¢äb¢ä[¢äT¢äM¢äF¢ä?¢ä8¢ä1¢ä*¢ä#¢ä¢ä¢ä¢ä¢ä¢äù¡äò¡äë¡ää¡äÝ¡äÖ¡äÏ¡äÈ¡äÁ¡äº¡ä³¡ä¬¡ä¥¡äž¡ä—¡ä¡ä‰¡ä‚¡ä{¡ät¡äm¡äf¡ä_¡äX¡äQ¡äJ¡äC¡ä<¡ä5¡ä.¡ä'¡ä ¡ä¡ä¡ä ¡ä¡äý äö äï äè äá äÚ äÓ äÌ äŠ侠䷠䰠䩠䢠䛠䔠ä ä† ä äx äq äj äc ä\ äU äN äG ä@ ä9 ä2 ä+ ä$ ä ä ä ä ä äúŸäóŸäìŸäåŸäÞŸäןäПäÉŸäŸä»Ÿä´Ÿä­Ÿä¦ŸäŸŸä˜Ÿä‘ŸäŠŸäƒŸä|ŸäuŸänŸägŸä`ŸäYŸäRŸäKŸäDŸä=Ÿä6Ÿä/Ÿä(Ÿä!ŸäŸäŸä ŸäŸäþžä÷žäðžäéžäâžäÛžäÔžäÍžäÆžä¿žä¸žä±žäªžä£žäœžä•žäŽžä‡žä€žäyžäržäkžädžä]žäVžäOžäHžäAžä:žä3žä,žä%žäžäžäžä žäžäûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿœäøœäñœäêœäãœäÜœäÕœäΜäÇœäÀœä¹œä²œä«œä¤œäœä–œäœäˆœäœäzœäsœälœäeœä^œäWœäPœäIœäBœä;œä4œä-œä&œäœäœäœä œäœäü›äõ›äî›äç›äà›äÙ›äÒ›äË›äě佛䶛䯛䨛䡛䚛䓛䌛䅛ä~›äw›äp›äi›äb›ä[›äT›äM›äF›ä?›ä8›ä1›ä*›ä#›ä›ä›ä›ä›ä›äùšäòšäëšääšäÝšäÖšäÏšäÈšäÁšäºšä³šä¬šä¥šäžšä—šäšä‰šä‚šä{šätšämšäfšä_šäXšäQšäJšäCšä<šä5šä.šä'šä šäšäšä šäšäý™äö™äï™äè™äá™äÚ™äÓ™äÌ™äř侙䷙䰙䩙䢙䛙䔙ä™ä†™ä™äx™äq™äj™äc™ä\™äU™äN™äG™ä@™ä9™ä2™ä+™ä$™ä™ä™ä™ä™ä™äú˜äó˜äì˜äå˜äÞ˜äטäИäɘä˜ä»˜ä´˜ä­˜ä¦˜äŸ˜ä˜˜ä‘˜äŠ˜äƒ˜ä|˜äu˜än˜äg˜ä`˜äY˜äR˜äK˜äD˜ä=˜ä6˜ä/˜ä(˜ä!˜ä˜ä˜ä ˜ä˜äþ—ä÷—äð—äé—äâ—äÛ—äÔ—äÍ—äÆ—ä¿—ä¸—ä±—äª—ä£—äœ—ä•—äŽ—ä‡—ä€—äy—är—äk—äd—ä]—äV—äO—äH—äA—ä:—ä3—ä,—ä%—ä—ä—ä—ä —ä—äû–äô–äí–äæ–äߖ䨖äÑ–äÊ–äÖä¼–äµ–ä®–ä§–ä –ä™–ä’–ä‹–ä„–ä}–äv–äo–äh–äa–äZ–äS–äL–äE–ä>–ä7–ä0–ä)–ä"–ä–ä–ä –ä–äÿ•äø•äñ•äê•äã•äÜ•äÕ•äΕäÇ•äÀ•乕䲕䫕䤕ä•ä–•ä•䈕ä•äz•äs•äl•äe•ä^•äW•äP•äI•äB•ä;•ä4•ä-•ä&•ä•ä•ä•ä •ä•äü”äõ”äî”äç”äà”äÙ”äÒ”äË”äĔ佔䶔䯔䨔䡔䚔䓔䌔䅔ä~”äw”äp”äi”äb”ä[”äT”äM”äF”ä?”ä8”ä1”ä*”ä#”ä”ä”ä”ä”ä”äù“äò“äë“ää“äÝ“äÖ“äÏ“äÈ“äÁ“亓䳓䬓䥓䞓䗓ä“䉓䂓ä{“ät“äm“äf“ä_“äX“äQ“äJ“äC“ä<“ä5“ä.“ä'“ä “ä“ä“ä “ä“äý’äö’äï’äè’äá’äÚ’äÓ’äÌ’äŒ侒䷒䰒䩒䢒䛒䔒ä’䆒ä’äx’äq’äj’äc’ä\’äU’äN’äG’ä@’ä9’ä2’ä+’ä$’ä’ä’ä’ä’ä’äú‘äó‘äì‘äå‘äÞ‘äבäБäÉ‘ä‘仑䴑䭑䦑䟑䘑䑑䊑䃑ä|‘äu‘än‘äg‘ä`‘äY‘äR‘äK‘äD‘ä=‘ä6‘ä/‘ä(‘ä!‘ä‘ä‘ä ‘ä‘äþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿŽäøŽäñŽäêŽäãŽäÜŽäÕŽäÎŽäÇŽäÀŽä¹Žä²Žä«Žä¤ŽäŽä–ŽäŽäˆŽäŽäzŽäsŽälŽäeŽä^ŽäWŽäPŽäIŽäBŽä;Žä4Žä-Žä&ŽäŽäŽäŽä ŽäŽäüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùŒäòŒäëŒääŒäÝŒäÖŒäÏŒäÈŒäÁŒäºŒä³Œä¬Œä¥ŒäžŒä—ŒäŒä‰Œä‚Œä{ŒätŒämŒäfŒä_ŒäXŒäQŒäJŒäCŒä<Œä5Œä.Œä'Œä ŒäŒäŒä ŒäŒäý‹äö‹äï‹äè‹äá‹äÚ‹äÓ‹äÌ‹äŋ例䷋䰋䩋䢋䛋䔋ä‹ä†‹ä‹äx‹äq‹äj‹äc‹ä\‹äU‹äN‹äG‹ä@‹ä9‹ä2‹ä+‹ä$‹ä‹ä‹ä‹ä‹ä‹äúŠäóŠäìŠäåŠäÞŠä׊äЊäÉŠäŠä»Šä´Šä­Šä¦ŠäŸŠä˜Šä‘ŠäŠŠäƒŠä|ŠäuŠänŠägŠä`ŠäYŠäRŠäKŠäDŠä=Šä6Šä/Šä(Šä!ŠäŠäŠä ŠäŠäþ‰ä÷‰äð‰äé‰äâ‰äÛ‰äÔ‰ä͉äƉ俉三䱉䪉䣉䜉䕉äމ䇉䀉äy‰är‰äk‰äd‰ä]‰äV‰äO‰äH‰äA‰ä:‰ä3‰ä,‰ä%‰ä‰ä‰ä‰ä ‰ä‰äûˆäôˆäíˆäæˆä߈ä؈äшäʈäÈ伈䵈䮈䧈䠈䙈䒈䋈䄈ä}ˆävˆäoˆähˆäaˆäZˆäSˆäLˆäEˆä>ˆä7ˆä0ˆä)ˆä"ˆäˆäˆä ˆäˆäÿ‡äø‡äñ‡äê‡äã‡ä܇äÕ‡ä·äLJäÀ‡ä¹‡ä²‡ä«‡ä¤‡ä‡ä–‡ä‡äˆ‡ä‡äz‡äs‡äl‡äe‡ä^‡äW‡äP‡äI‡äB‡ä;‡ä4‡ä-‡ä&‡ä‡ä‡ä‡ä ‡ä‡äü†äõ†äî†äç†äà†äÙ†äÒ†äˆäĆ但䶆䯆䨆䡆䚆䓆䌆䅆ä~†äw†äp†äi†äb†ä[†äT†äM†äF†ä?†ä8†ä1†ä*†ä#†ä†ä†ä†ä†ä†äù…äò…äë…ää…äÝ…äÖ…äÏ…äÈ…äÁ…亅䳅䬅䥅䞅䗅ä…䉅䂅ä{…ät…äm…äf…ä_…äX…äQ…äJ…äC…ä<…ä5…ä.…ä'…ä …ä…ä…ä …ä…äý„äö„äï„äè„äá„äÚ„äÓ„äÌ„äń侄䷄䰄䩄䢄䛄䔄ä„䆄ä„äx„äq„äj„äc„ä\„äU„äN„äG„ä@„ä9„ä2„ä+„ä$„ä„ä„ä„ä„ä„äúƒäóƒäìƒäåƒäÞƒä׃äЃäɃäƒä»ƒä´ƒä­ƒä¦ƒäŸƒä˜ƒä‘ƒäŠƒäƒƒä|ƒäuƒänƒägƒä`ƒäYƒäRƒäKƒäDƒä=ƒä6ƒä/ƒä(ƒä!ƒäƒäƒä ƒäƒäþ‚ä÷‚äð‚äé‚äâ‚äÛ‚äÔ‚äÍ‚äÆ‚ä¿‚ä¸‚ä±‚äª‚ä£‚äœ‚ä•‚äŽ‚ä‡‚ä€‚äy‚är‚äk‚äd‚ä]‚äV‚äO‚äH‚äA‚ä:‚ä3‚ä,‚ä%‚ä‚ä‚ä‚ä ‚ä‚äûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿ€äø€äñ€äê€äã€äÜ€äÕ€ä΀äÇ€äÀ€ä¹€ä²€ä«€ä¤€ä€ä–€ä€äˆ€ä€äz€äs€äl€äe€ä^€äW€äP€äI€äB€ä;€ä4€ä-€ä&€ä€ä€ä€ä €ä€äüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääù~äò~äë~ää~äÝ~äÖ~äÏ~äÈ~äÁ~äº~ä³~ä¬~ä¥~äž~ä—~ä~ä‰~ä‚~ä{~ät~äm~äf~ä_~äX~äQ~äJ~äC~ä<~ä5~ä.~ä'~ä ~ä~ä~ä ~ä~äý}äö}äï}äè}äá}äÚ}äÓ}äÌ}äÅ}ä¾}ä·}ä°}ä©}ä¢}ä›}ä”}ä}ä†}ä}äx}äq}äj}äc}ä\}äU}äN}äG}ä@}ä9}ä2}ä+}ä$}ä}ä}ä}ä}ä}äú|äó|äì|äå|äÞ|ä×|äÐ|äÉ|äÂ|ä»|ä´|ä­|ä¦|äŸ|ä˜|ä‘|äŠ|äƒ|ä||äu|än|äg|ä`|äY|äR|äK|äD|ä=|ä6|ä/|ä(|ä!|ä|ä|ä |ä|äþ{ä÷{äð{äé{äâ{äÛ{äÔ{äÍ{äÆ{ä¿{ä¸{ä±{äª{ä£{äœ{ä•{äŽ{ä‡{ä€{äy{är{äk{äd{ä]{äV{äO{äH{äA{ä:{ä3{ä,{ä%{ä{ä{ä{ä {ä{äûzäôzäízäæzäßzäØzäÑzäÊzäÃzä¼zäµzä®zä§zä zä™zä’zä‹zä„zä}zävzäozähzäazäZzäSzäLzäEzä>zä7zä0zä)zä"zäzäzä zäzäÿyäøyäñyäêyäãyäÜyäÕyäÎyäÇyäÀyä¹yä²yä«yä¤yäyä–yäyäˆyäyäzyäsyälyäeyä^yäWyäPyäIyäByä;yä4yä-yä&yäyäyäyä yäyäüxäõxäîxäçxäàxäÙxäÒxäËxäÄxä½xä¶xä¯xä¨xä¡xäšxä“xäŒxä…xä~xäwxäpxäixäbxä[xäTxäMxäFxä?xä8xä1xä*xä#xäxäxäxäxäxäùwäòwäëwääwäÝwäÖwäÏwäÈwäÁwäºwä³wä¬wä¥wäžwä—wäwä‰wä‚wä{wätwämwäfwä_wäXwäQwäJwäCwäsä7sä0sä)sä"säsäsä säsäÿräøräñräêräãräÜräÕräÎräÇräÀrä¹rä²rä«rä¤rärä–räräˆräräzräsrälräerä^räWräPräIräBrä;rä4rä-rä&rärärärä räräüqäõqäîqäçqäàqäÙqäÒqäËqäÄqä½qä¶qä¯qä¨qä¡qäšqä“qäŒqä…qä~qäwqäpqäiqäbqä[qäTqäMqäFqä?qä8qä1qä*qä#qäqäqäqäqäqäùpäòpäëpääpäÝpäÖpäÏpäÈpäÁpäºpä³pä¬pä¥päžpä—päpä‰pä‚pä{pätpämpäfpä_päXpäQpäJpäCpälä7lä0lä)lä"lälälä läläÿkäøkäñkäêkäãkäÜkäÕkäÎkäÇkäÀkä¹kä²kä«kä¤käkä–käkäˆkäkäzkäskälkäekä^käWkäPkäIkäBkä;kä4kä-kä&käkäkäkä käkäüjäõjäîjäçjäàjäÙjäÒjäËjäÄjä½jä¶jä¯jä¨jä¡jäšjä“jäŒjä…jä~jäwjäpjäijäbjä[jäTjäMjäFjä?jä8jä1jä*jä#jäjäjäjäjäjäùiäòiäëiääiäÝiäÖiäÏiäÈiäÁiäºiä³iä¬iä¥iäžiä—iäiä‰iä‚iä{iätiämiäfiä_iäXiäQiäJiäCiäeä7eä0eä)eä"eäeäeä eäeäÿdäødäñdäêdäãdäÜdäÕdäÎdäÇdäÀdä¹dä²dä«dä¤dädä–dädäˆdädäzdäsdäldäedä^däWdäPdäIdäBdä;dä4dä-dä&dädädädä dädäücäõcäîcäçcäàcäÙcäÒcäËcäÄcä½cä¶cä¯cä¨cä¡cäšcä“cäŒcä…cä~cäwcäpcäicäbcä[cäTcäMcäFcä?cä8cä1cä*cä#cäcäcäcäcäcäùbäòbäëbääbäÝbäÖbäÏbäÈbäÁbäºbä³bä¬bä¥bäžbä—bäbä‰bä‚bä{bätbämbäfbä_bäXbäQbäJbäCbä^ä7^ä0^ä)^ä"^ä^ä^ä ^ä^äÿ]äø]äñ]äê]äã]äÜ]äÕ]äÎ]äÇ]äÀ]ä¹]ä²]ä«]ä¤]ä]ä–]ä]äˆ]ä]äz]äs]äl]äe]ä^]äW]äP]äI]äB]ä;]ä4]ä-]ä&]ä]ä]ä]ä ]ä]äü\äõ\äî\äç\äà\äÙ\äÒ\äË\äÄ\ä½\ä¶\ä¯\ä¨\ä¡\äš\ä“\äŒ\ä…\ä~\äw\äp\äi\äb\ä[\äT\äM\äF\ä?\ä8\ä1\ä*\ä#\ä\ä\ä\ä\ä\äù[äò[äë[ää[äÝ[äÖ[äÏ[äÈ[äÁ[äº[ä³[ä¬[ä¥[äž[ä—[ä[ä‰[ä‚[ä{[ät[äm[äf[ä_[äX[äQ[äJ[äC[ä<[ä5[ä.[ä'[ä [ä[ä[ä [ä[äýZäöZäïZäèZäáZäÚZäÓZäÌZäÅZä¾Zä·Zä°Zä©Zä¢Zä›Zä”ZäZä†ZäZäxZäqZäjZäcZä\ZäUZäNZäGZä@Zä9Zä2Zä+Zä$ZäZäZäZäZäZäúYäóYäìYäåYäÞYä×YäÐYäÉYäÂYä»Yä´Yä­Yä¦YäŸYä˜Yä‘YäŠYäƒYä|YäuYänYägYä`YäYYäRYäKYäDYä=Yä6Yä/Yä(Yä!YäYäYä YäYäþXä÷XäðXäéXäâXäÛXäÔXäÍXäÆXä¿Xä¸Xä±XäªXä£XäœXä•XäŽXä‡Xä€XäyXärXäkXädXä]XäVXäOXäHXäAXä:Xä3Xä,Xä%XäXäXäXä XäXäûWäôWäíWäæWäßWäØWäÑWäÊWäÃWä¼WäµWä®Wä§Wä Wä™Wä’Wä‹Wä„Wä}WävWäoWähWäaWäZWäSWäLWäEWä>Wä7Wä0Wä)Wä"WäWäWä WäWäÿVäøVäñVäêVäãVäÜVäÕVäÎVäÇVäÀVä¹Vä²Vä«Vä¤VäVä–VäVäˆVäVäzVäsVälVäeVä^VäWVäPVäIVäBVä;Vä4Vä-Vä&VäVäVäVä VäVäüUäõUäîUäçUäàUäÙUäÒUäËUäÄUä½Uä¶Uä¯Uä¨Uä¡UäšUä“UäŒUä…Uä~UäwUäpUäiUäbUä[UäTUäMUäFUä?Uä8Uä1Uä*Uä#UäUäUäUäUäUäùTäòTäëTääTäÝTäÖTäÏTäÈTäÁTäºTä³Tä¬Tä¥TäžTä—TäTä‰Tä‚Tä{TätTämTäfTä_TäXTäQTäJTäCTäPä7Pä0Pä)Pä"PäPäPä PäPäÿOäøOäñOäêOäãOäÜOäÕOäÎOäÇOäÀOä¹Oä²Oä«Oä¤OäOä–OäOäˆOäOäzOäsOälOäeOä^OäWOäPOäIOäBOä;Oä4Oä-Oä&OäOäOäOä OäOäüNäõNäîNäçNäàNäÙNäÒNäËNäÄNä½Nä¶Nä¯Nä¨Nä¡NäšNä“NäŒNä…Nä~NäwNäpNäiNäbNä[NäTNäMNäFNä?Nä8Nä1Nä*Nä#NäNäNäNäNäNäùMäòMäëMääMäÝMäÖMäÏMäÈMäÁMäºMä³Mä¬Mä¥MäžMä—MäMä‰Mä‚Mä{MätMämMäfMä_MäXMäQMäJMäCMäIä7Iä0Iä)Iä"IäIäIä IäIäÿHäøHäñHäêHäãHäÜHäÕHäÎHäÇHäÀHä¹Hä²Hä«Hä¤HäHä–HäHäˆHäHäzHäsHälHäeHä^HäWHäPHäIHäBHä;Hä4Hä-Hä&HäHäHäHä HäHäüGäõGäîGäçGäàGäÙGäÒGäËGäÄGä½Gä¶Gä¯Gä¨Gä¡GäšGä“GäŒGä…Gä~GäwGäpGäiGäbGä[GäTGäMGäFGä?Gä8Gä1Gä*Gä#GäGäGäGäGäGäùFäòFäëFääFäÝFäÖFäÏFäÈFäÁFäºFä³Fä¬Fä¥FäžFä—FäFä‰Fä‚Fä{FätFämFäfFä_FäXFäQFäJFäCFäBä7Bä0Bä)Bä"BäBäBä BäBäÿAäøAäñAäêAäãAäÜAäÕAäÎAäÇAäÀAä¹Aä²Aä«Aä¤AäAä–AäAäˆAäAäzAäsAälAäeAä^AäWAäPAäIAäBAä;Aä4Aä-Aä&AäAäAäAä AäAäü@äõ@äî@äç@äà@äÙ@äÒ@äË@äÄ@ä½@ä¶@ä¯@ä¨@ä¡@äš@ä“@äŒ@ä…@ä~@äw@äp@äi@äb@ä[@äT@äM@äF@ä?@ä8@ä1@ä*@ä#@ä@ä@ä@ä@ä@äù?äò?äë?ää?äÝ?äÖ?äÏ?äÈ?äÁ?äº?ä³?ä¬?ä¥?äž?ä—?ä?ä‰?ä‚?ä{?ät?äm?äf?ä_?äX?äQ?äJ?äC?ääö>äï>äè>äá>äÚ>äÓ>äÌ>äÅ>ä¾>ä·>ä°>ä©>ä¢>ä›>ä”>ä>ä†>ä>äx>äq>äj>äc>ä\>äU>äN>äG>ä@>ä9>ä2>ä+>ä$>ä>ä>ä>ä>ä>äú=äó=äì=äå=äÞ=ä×=äÐ=äÉ=äÂ=ä»=ä´=ä­=ä¦=äŸ=ä˜=ä‘=äŠ=äƒ=ä|=äu=än=äg=ä`=äY=äR=äK=äD=ä==ä6=ä/=ä(=ä!=ä=ä=ä =ä=äþ<ä÷<äð<äé<äâ<äÛ<äÔ<äÍ<äÆ<ä¿<ä¸<ä±<äª<ä£<äœ<ä•<äŽ<ä‡<ä€<äy<är<äk<äd<ä]<äV<äO<äH<äA<ä:<ä3<ä,<ä%<ä<ä<ä<ä <ä<äû;äô;äí;äæ;äß;äØ;äÑ;äÊ;äÃ;ä¼;äµ;ä®;ä§;ä ;ä™;ä’;ä‹;ä„;ä};äv;äo;äh;äa;äZ;äS;äL;äE;ä>;ä7;ä0;ä);ä";ä;ä;ä ;ä;äÿ:äø:äñ:äê:äã:äÜ:äÕ:äÎ:äÇ:äÀ:ä¹:ä²:ä«:ä¤:ä:ä–:ä:äˆ:ä:äz:äs:äl:äe:ä^:äW:äP:äI:äB:ä;:ä4:ä-:ä&:ä:ä:ä:ä :ä:äü9äõ9äî9äç9äà9äÙ9äÒ9äË9äÄ9ä½9ä¶9ä¯9ä¨9ä¡9äš9ä“9äŒ9ä…9ä~9äw9äp9äi9äb9ä[9äT9äM9äF9ä?9ä89ä19ä*9ä#9ä9ä9ä9ä9ä9äù8äò8äë8ää8äÝ8äÖ8äÏ8äÈ8äÁ8äº8ä³8ä¬8ä¥8äž8ä—8ä8ä‰8ä‚8ä{8ät8äm8äf8ä_8äX8äQ8äJ8äC8ä<8ä58ä.8ä'8ä 8ä8ä8ä 8ä8äý7äö7äï7äè7äá7äÚ7äÓ7äÌ7äÅ7ä¾7ä·7ä°7ä©7ä¢7ä›7ä”7ä7ä†7ä7äx7äq7äj7äc7ä\7äU7äN7äG7ä@7ä97ä27ä+7ä$7ä7ä7ä7ä7ä7äú6äó6äì6äå6äÞ6ä×6äÐ6äÉ6äÂ6ä»6ä´6ä­6ä¦6äŸ6ä˜6ä‘6äŠ6äƒ6ä|6äu6än6äg6ä`6äY6äR6äK6äD6ä=6ä66ä/6ä(6ä!6ä6ä6ä 6ä6äþ5ä÷5äð5äé5äâ5äÛ5äÔ5äÍ5äÆ5ä¿5ä¸5ä±5äª5ä£5äœ5ä•5äŽ5ä‡5ä€5äy5är5äk5äd5ä]5äV5äO5äH5äA5ä:5ä35ä,5ä%5ä5ä5ä5ä 5ä5äû4äô4äí4äæ4äß4äØ4äÑ4äÊ4äÃ4ä¼4äµ4ä®4ä§4ä 4ä™4ä’4ä‹4ä„4ä}4äv4äo4äh4äa4äZ4äS4äL4äE4ä>4ä74ä04ä)4ä"4ä4ä4ä 4ä4äÿ3äø3äñ3äê3äã3äÜ3äÕ3äÎ3äÇ3äÀ3ä¹3ä²3ä«3ä¤3ä3ä–3ä3äˆ3ä3äz3äs3äl3äe3ä^3äW3äP3äI3äB3ä;3ä43ä-3ä&3ä3ä3ä3ä 3ä3äü2äõ2äî2äç2äà2äÙ2äÒ2äË2äÄ2ä½2ä¶2ä¯2ä¨2ä¡2äš2ä“2äŒ2ä…2ä~2äw2äp2äi2äb2ä[2äT2äM2äF2ä?2ä82ä12ä*2ä#2ä2ä2ä2ä2ä2äù1äò1äë1ää1äÝ1äÖ1äÏ1äÈ1äÁ1äº1ä³1ä¬1ä¥1äž1ä—1ä1ä‰1ä‚1ä{1ät1äm1äf1ä_1äX1äQ1äJ1äC1ä<1ä51ä.1ä'1ä 1ä1ä1ä 1ä1äý0äö0äï0äè0äá0äÚ0äÓ0äÌ0äÅ0ä¾0ä·0ä°0ä©0ä¢0ä›0ä”0ä0ä†0ä0äx0äq0äj0äc0ä\0äU0äN0äG0ä@0ä90ä20ä+0ä$0ä0ä0ä0ä0ä0äú/äó/äì/äå/äÞ/ä×/äÐ/äÉ/äÂ/ä»/ä´/ä­/ä¦/äŸ/ä˜/ä‘/äŠ/äƒ/ä|/äu/än/äg/ä`/äY/äR/äK/äD/ä=/ä6/ä//ä(/ä!/ä/ä/ä /ä/äþ.ä÷.äð.äé.äâ.äÛ.äÔ.äÍ.äÆ.ä¿.ä¸.ä±.äª.ä£.äœ.ä•.äŽ.ä‡.ä€.äy.är.äk.äd.ä].äV.äO.äH.äA.ä:.ä3.ä,.ä%.ä.ä.ä.ä .ä.äû-äô-äí-äæ-äß-äØ-äÑ-äÊ-äÃ-ä¼-äµ-ä®-ä§-ä -ä™-ä’-ä‹-ä„-ä}-äv-äo-äh-äa-äZ-äS-äL-äE-ä>-ä7-ä0-ä)-ä"-ä-ä-ä -ä-äÿ,äø,äñ,äê,äã,äÜ,äÕ,äÎ,äÇ,äÀ,ä¹,ä²,ä«,ä¤,ä,ä–,ä,äˆ,ä,äz,äs,äl,äe,ä^,äW,äP,äI,äB,ä;,ä4,ä-,ä&,ä,ä,ä,ä ,ä,äü+äõ+äî+äç+äà+äÙ+äÒ+äË+äÄ+ä½+ä¶+ä¯+ä¨+ä¡+äš+ä“+äŒ+ä…+ä~+äw+äp+äi+äb+ä[+äT+äM+äF+ä?+ä8+ä1+ä*+ä#+ä+ä+ä+ä+ä+äù*äò*äë*ää*äÝ*äÖ*äÏ*äÈ*äÁ*äº*ä³*ä¬*ä¥*äž*ä—*ä*ä‰*ä‚*ä{*ät*äm*äf*ä_*äX*äQ*äJ*äC*ä<*ä5*ä.*ä'*ä *ä*ä*ä *ä*äý)äö)äï)äè)äá)äÚ)äÓ)äÌ)äÅ)ä¾)ä·)ä°)ä©)ä¢)ä›)ä”)ä)ä†)ä)äx)äq)äj)äc)ä\)äU)äN)äG)ä@)ä9)ä2)ä+)ä$)ä)ä)ä)ä)ä)äú(äó(äì(äå(äÞ(ä×(äÐ(äÉ(äÂ(ä»(ä´(ä­(ä¦(äŸ(ä˜(ä‘(äŠ(äƒ(ä|(äu(än(äg(ä`(äY(äR(äK(äD(ä=(ä6(ä/(ä((ä!(ä(ä(ä (ä(äþ'ä÷'äð'äé'äâ'äÛ'äÔ'äÍ'äÆ'ä¿'ä¸'ä±'äª'ä£'äœ'ä•'äŽ'ä‡'ä€'äy'är'äk'äd'ä]'äV'äO'äH'äA'ä:'ä3'ä,'ä%'ä'ä'ä'ä 'ä'äû&äô&äí&äæ&äß&äØ&äÑ&äÊ&äÃ&ä¼&äµ&ä®&ä§&ä &ä™&ä’&ä‹&ä„&ä}&äv&äo&äh&äa&äZ&äS&äL&äE&ä>&ä7&ä0&ä)&ä"&ä&ä&ä &ä&äÿ%äø%äñ%äê%äã%äÜ%äÕ%äÎ%äÇ%äÀ%ä¹%ä²%ä«%ä¤%ä%ä–%ä%äˆ%ä%äz%äs%äl%äe%ä^%äW%äP%äI%äB%ä;%ä4%ä-%ä&%ä%ä%ä%ä %ä%äü$äõ$äî$äç$äà$äÙ$äÒ$äË$äÄ$ä½$ä¶$ä¯$ä¨$ä¡$äš$ä“$äŒ$ä…$ä~$äw$äp$äi$äb$ä[$äT$äM$äF$ä?$ä8$ä1$ä*$ä#$ä$ä$ä$ä$ä$äù#äò#äë#ää#äÝ#äÖ#äÏ#äÈ#äÁ#äº#ä³#ä¬#ä¥#äž#ä—#ä#ä‰#ä‚#ä{#ät#äm#äf#ä_#äX#äQ#äJ#äC#ä<#ä5#ä.#ä'#ä #ä#ä#ä #ä#äý"äö"äï"äè"äá"äÚ"äÓ"äÌ"äÅ"ä¾"ä·"ä°"ä©"ä¢"ä›"ä”"ä"ä†"ä"äx"äq"äj"äc"ä\"äU"äN"äG"ä@"ä9"ä2"ä+"ä$"ä"ä"ä"ä"ä"äú!äó!äì!äå!äÞ!ä×!äÐ!äÉ!äÂ!ä»!ä´!ä­!ä¦!äŸ!ä˜!ä‘!äŠ!äƒ!ä|!äu!än!äg!ä`!äY!äR!äK!äD!ä=!ä6!ä/!ä(!ä!!ä!ä!ä !ä!äþ ä÷ äð äé äâ äÛ äÔ äÍ äÆ ä¿ ä¸ ä± äª ä£ äœ ä• äŽ ä‡ ä€ äy är äk äd ä] äV äO äH äA ä: ä3 ä, ä% ä ä ä ä ä äûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääý äö äï äè äá äÚ äÓ äÌ äÅ ä¾ ä· ä° ä© ä¢ ä› ä” ä ä† ä äx äq äj äc ä\ äU äN äG ä@ ä9 ä2 ä+ ä$ ä ä ä ä ä äú äó äì äå äÞ ä× äÐ äÉ ä ä» ä´ ä­ ä¦ äŸ ä˜ ä‘ äŠ äƒ ä| äu än äg ä` äY äR äK äD ä= ä6 ä/ ä( ä! ä ä ä ä äþ ä÷ äð äé äâ äÛ äÔ äÍ äÆ ä¿ ä¸ ä± äª ä£ äœ ä• äŽ ä‡ ä€ äy är äk äd ä] äV äO äH äA ä: ä3 ä, ä% ä ä ä ä ä äû äô äí äæ äß äØ äÑ äÊ äà ä¼ äµ ä® ä§ ä  ä™ ä’ ä‹ ä„ ä} äv äo äh äa äZ äS äL äE ä> ä7 ä0 ä) ä" ä ä ä ä äÿ äø äñ äê äã äÜ äÕ äÎ äÇ äÀ ä¹ ä² ä« ä¤ ä ä– ä äˆ ä äz äs äl äe ä^ äW äP äI äB ä; ä4 ä- ä& ä ä ä ä ä äüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýÿãöÿãïÿãèÿãáÿãÚÿãÓÿãÌÿãÅÿã¾ÿã·ÿã°ÿã©ÿã¢ÿã›ÿã”ÿãÿã†ÿãÿãxÿãqÿãjÿãcÿã\ÿãUÿãNÿãGÿã@ÿã9ÿã2ÿã+ÿã$ÿãÿãÿãÿãÿãÿãúþãóþãìþãåþãÞþã×þãÐþãÉþãÂþã»þã´þã­þã¦þãŸþã˜þã‘þãŠþãƒþã|þãuþãnþãgþã`þãYþãRþãKþãDþã=þã6þã/þã(þã!þãþãþã þãþãþýã÷ýãðýãéýãâýãÛýãÔýãÍýãÆýã¿ýã¸ýã±ýãªýã£ýãœýã•ýãŽýã‡ýã€ýãyýãrýãkýãdýã]ýãVýãOýãHýãAýã:ýã3ýã,ýã%ýãýãýãýã ýãýãûüãôüãíüãæüãßüãØüãÑüãÊüãÃüã¼üãµüã®üã§üã üã™üã’üã‹üã„üã}üãvüãoüãhüãaüãZüãSüãLüãEüã>üã7üã0üã)üã"üãüãüã üãüãÿûãøûãñûãêûããûãÜûãÕûãÎûãÇûãÀûã¹ûã²ûã«ûã¤ûãûã–ûãûãˆûãûãzûãsûãlûãeûã^ûãWûãPûãIûãBûã;ûã4ûã-ûã&ûãûãûãûã ûãûãüúãõúãîúãçúãàúãÙúãÒúãËúãÄúã½úã¶úã¯úã¨úã¡úãšúã“úãŒúã…úã~úãwúãpúãiúãbúã[úãTúãMúãFúã?úã8úã1úã*úã#úãúãúãúãúãúãùùãòùãëùãäùãÝùãÖùãÏùãÈùãÁùãºùã³ùã¬ùã¥ùãžùã—ùãùã‰ùã‚ùã{ùãtùãmùãfùã_ùãXùãQùãJùãCùã<ùã5ùã.ùã'ùã ùãùãùã ùãùãýøãöøãïøãèøãáøãÚøãÓøãÌøãÅøã¾øã·øã°øã©øã¢øã›øã”øãøã†øãøãxøãqøãjøãcøã\øãUøãNøãGøã@øã9øã2øã+øã$øãøãøãøãøãøãú÷ãó÷ãì÷ãå÷ãÞ÷ã×÷ãÐ÷ãÉ÷ãÂ÷ã»÷ã´÷ã­÷ã¦÷ãŸ÷ã˜÷ã‘÷ãŠ÷ãƒ÷ã|÷ãu÷ãn÷ãg÷ã`÷ãY÷ãR÷ãK÷ãD÷ã=÷ã6÷ã/÷ã(÷ã!÷ã÷ã÷ã ÷ã÷ãþöã÷öãðöãéöãâöãÛöãÔöãÍöãÆöã¿öã¸öã±öãªöã£öãœöã•öãŽöã‡öã€öãyöãröãköãdöã]öãVöãOöãHöãAöã:öã3öã,öã%öãöãöãöã öãöãûõãôõãíõãæõãßõãØõãÑõãÊõãÃõã¼õãµõã®õã§õã õã™õã’õã‹õã„õã}õãvõãoõãhõãaõãZõãSõãLõãEõã>õã7õã0õã)õã"õãõãõã õãõãÿôãøôãñôãêôããôãÜôãÕôãÎôãÇôãÀôã¹ôã²ôã«ôã¤ôãôã–ôãôãˆôãôãzôãsôãlôãeôã^ôãWôãPôãIôãBôã;ôã4ôã-ôã&ôãôãôãôã ôãôãüóãõóãîóãçóãàóãÙóãÒóãËóãÄóã½óã¶óã¯óã¨óã¡óãšóã“óãŒóã…óã~óãwóãpóãióãbóã[óãTóãMóãFóã?óã8óã1óã*óã#óãóãóãóãóãóãùòãòòãëòãäòãÝòãÖòãÏòãÈòãÁòãºòã³òã¬òã¥òãžòã—òãòã‰òã‚òã{òãtòãmòãfòã_òãXòãQòãJòãCòã<òã5òã.òã'òã òãòãòã òãòãýñãöñãïñãèñãáñãÚñãÓñãÌñãÅñã¾ñã·ñã°ñã©ñã¢ñã›ñã”ñãñã†ñãñãxñãqñãjñãcñã\ñãUñãNñãGñã@ñã9ñã2ñã+ñã$ñãñãñãñãñãñãúðãóðãìðãåðãÞðã×ðãÐðãÉðãÂðã»ðã´ðã­ðã¦ðãŸðã˜ðã‘ðãŠðãƒðã|ðãuðãnðãgðã`ðãYðãRðãKðãDðã=ðã6ðã/ðã(ðã!ðãðãðã ðãðãþïã÷ïãðïãéïãâïãÛïãÔïãÍïãÆïã¿ïã¸ïã±ïãªïã£ïãœïã•ïãŽïã‡ïã€ïãyïãrïãkïãdïã]ïãVïãOïãHïãAïã:ïã3ïã,ïã%ïãïãïãïã ïãïãûîãôîãíîãæîãßîãØîãÑîãÊîãÃîã¼îãµîã®îã§îã îã™îã’îã‹îã„îã}îãvîãoîãhîãaîãZîãSîãLîãEîã>îã7îã0îã)îã"îãîãîã îãîãÿíãøíãñíãêíããíãÜíãÕíãÎíãÇíãÀíã¹íã²íã«íã¤íãíã–íãíãˆíãíãzíãsíãlíãeíã^íãWíãPíãIíãBíã;íã4íã-íã&íãíãíãíã íãíãüìãõìãîìãçìãàìãÙìãÒìãËìãÄìã½ìã¶ìã¯ìã¨ìã¡ìãšìã“ìãŒìã…ìã~ìãwìãpìãiìãbìã[ìãTìãMìãFìã?ìã8ìã1ìã*ìã#ìãìãìãìãìãìãùëãòëãëëãäëãÝëãÖëãÏëãÈëãÁëãºëã³ëã¬ëã¥ëãžëã—ëãëã‰ëã‚ëã{ëãtëãmëãfëã_ëãXëãQëãJëãCëã<ëã5ëã.ëã'ëã ëãëãëã ëãëãýêãöêãïêãèêãáêãÚêãÓêãÌêãÅêã¾êã·êã°êã©êã¢êã›êã”êãêã†êãêãxêãqêãjêãcêã\êãUêãNêãGêã@êã9êã2êã+êã$êãêãêãêãêãêãúéãóéãìéãåéãÞéã×éãÐéãÉéãÂéã»éã´éã­éã¦éãŸéã˜éã‘éãŠéãƒéã|éãuéãnéãgéã`éãYéãRéãKéãDéã=éã6éã/éã(éã!éãéãéã éãéãþèã÷èãðèãéèãâèãÛèãÔèãÍèãÆèã¿èã¸èã±èãªèã£èãœèã•èãŽèã‡èã€èãyèãrèãkèãdèã]èãVèãOèãHèãAèã:èã3èã,èã%èãèãèãèã èãèãûçãôçãíçãæçãßçãØçãÑçãÊçãÃçã¼çãµçã®çã§çã çã™çã’çã‹çã„çã}çãvçãoçãhçãaçãZçãSçãLçãEçã>çã7çã0çã)çã"çãçãçã çãçãÿæãøæãñæãêæããæãÜæãÕæãÎæãÇæãÀæã¹æã²æã«æã¤æãæã–æãæãˆæãæãzæãsæãlæãeæã^æãWæãPæãIæãBæã;æã4æã-æã&æãæãæãæã æãæãüåãõåãîåãçåãàåãÙåãÒåãËåãÄåã½åã¶åã¯åã¨åã¡åãšåã“åãŒåã…åã~åãwåãpåãiåãbåã[åãTåãMåãFåã?åã8åã1åã*åã#åãåãåãåãåãåãùäãòäãëäãääãÝäãÖäãÏäãÈäãÁäãºäã³äã¬äã¥äãžäã—äãäã‰äã‚äã{äãtäãmäãfäã_äãXäãQäãJäãCäã<äã5äã.äã'äã äãäãäã äãäãýããöããïããèããáããÚããÓããÌããÅãã¾ãã·ãã°ãã©ãã¢ãã›ãã”ãããã†ããããxããqããjããcãã\ããUããNããGãã@ãã9ãã2ãã+ãã$ããããããããããããúâãóâãìâãåâãÞâã×âãÐâãÉâãÂâã»âã´âã­âã¦âãŸâã˜âã‘âãŠâãƒâã|âãuâãnâãgâã`âãYâãRâãKâãDâã=âã6âã/âã(âã!âãâãâã âãâãþáã÷áãðáãéáãâáãÛáãÔáãÍáãÆáã¿áã¸áã±áãªáã£áãœáã•áãŽáã‡áã€áãyáãráãkáãdáã]áãVáãOáãHáãAáã:áã3áã,áã%áãáãáãáã áãáãûàãôàãíàãæàãßàãØàãÑàãÊàãÃàã¼àãµàã®àã§àã àã™àã’àã‹àã„àã}àãvàãoàãhàãaàãZàãSàãLàãEàã>àã7àã0àã)àã"àãàãàã àãàãÿßãøßãñßãêßããßãÜßãÕßãÎßãÇßãÀßã¹ßã²ßã«ßã¤ßãßã–ßãßãˆßãßãzßãsßãlßãeßã^ßãWßãPßãIßãBßã;ßã4ßã-ßã&ßãßãßãßã ßãßãüÞãõÞãîÞãçÞãàÞãÙÞãÒÞãËÞãÄÞã½Þã¶Þã¯Þã¨Þã¡ÞãšÞã“ÞãŒÞã…Þã~ÞãwÞãpÞãiÞãbÞã[ÞãTÞãMÞãFÞã?Þã8Þã1Þã*Þã#ÞãÞãÞãÞãÞãÞãùÝãòÝãëÝãäÝãÝÝãÖÝãÏÝãÈÝãÁÝãºÝã³Ýã¬Ýã¥ÝãžÝã—ÝãÝã‰Ýã‚Ýã{ÝãtÝãmÝãfÝã_ÝãXÝãQÝãJÝãCÝã<Ýã5Ýã.Ýã'Ýã ÝãÝãÝã ÝãÝãýÜãöÜãïÜãèÜãáÜãÚÜãÓÜãÌÜãÅÜã¾Üã·Üã°Üã©Üã¢Üã›Üã”ÜãÜã†ÜãÜãxÜãqÜãjÜãcÜã\ÜãUÜãNÜãGÜã@Üã9Üã2Üã+Üã$ÜãÜãÜãÜãÜãÜãúÛãóÛãìÛãåÛãÞÛã×ÛãÐÛãÉÛãÂÛã»Ûã´Ûã­Ûã¦ÛãŸÛã˜Ûã‘ÛãŠÛãƒÛã|ÛãuÛãnÛãgÛã`ÛãYÛãRÛãKÛãDÛã=Ûã6Ûã/Ûã(Ûã!ÛãÛãÛã ÛãÛãþÚã÷ÚãðÚãéÚãâÚãÛÚãÔÚãÍÚãÆÚã¿Úã¸Úã±ÚãªÚã£ÚãœÚã•ÚãŽÚã‡Úã€ÚãyÚãrÚãkÚãdÚã]ÚãVÚãOÚãHÚãAÚã:Úã3Úã,Úã%ÚãÚãÚãÚã ÚãÚãûÙãôÙãíÙãæÙãßÙãØÙãÑÙãÊÙãÃÙã¼ÙãµÙã®Ùã§Ùã Ùã™Ùã’Ùã‹Ùã„Ùã}ÙãvÙãoÙãhÙãaÙãZÙãSÙãLÙãEÙã>Ùã7Ùã0Ùã)Ùã"ÙãÙãÙã ÙãÙãÿØãøØãñØãêØããØãÜØãÕØãÎØãÇØãÀØã¹Øã²Øã«Øã¤ØãØã–ØãØãˆØãØãzØãsØãlØãeØã^ØãWØãPØãIØãBØã;Øã4Øã-Øã&ØãØãØãØã ØãØãü×ãõ×ãî×ãç×ãà×ãÙ×ãÒ×ãË×ãÄ×ã½×ã¶×ã¯×ã¨×ã¡×ãš×ã“×ãŒ×ã…×ã~×ãw×ãp×ãi×ãb×ã[×ãT×ãM×ãF×ã?×ã8×ã1×ã*×ã#×ã×ã×ã×ã×ã×ãùÖãòÖãëÖãäÖãÝÖãÖÖãÏÖãÈÖãÁÖãºÖã³Öã¬Öã¥ÖãžÖã—ÖãÖã‰Öã‚Öã{ÖãtÖãmÖãfÖã_ÖãXÖãQÖãJÖãCÖã<Öã5Öã.Öã'Öã ÖãÖãÖã ÖãÖãýÕãöÕãïÕãèÕãáÕãÚÕãÓÕãÌÕãÅÕã¾Õã·Õã°Õã©Õã¢Õã›Õã”ÕãÕã†ÕãÕãxÕãqÕãjÕãcÕã\ÕãUÕãNÕãGÕã@Õã9Õã2Õã+Õã$ÕãÕãÕãÕãÕãÕãúÔãóÔãìÔãåÔãÞÔã×ÔãÐÔãÉÔãÂÔã»Ôã´Ôã­Ôã¦ÔãŸÔã˜Ôã‘ÔãŠÔãƒÔã|ÔãuÔãnÔãgÔã`ÔãYÔãRÔãKÔãDÔã=Ôã6Ôã/Ôã(Ôã!ÔãÔãÔã ÔãÔãþÓã÷ÓãðÓãéÓãâÓãÛÓãÔÓãÍÓãÆÓã¿Óã¸Óã±ÓãªÓã£ÓãœÓã•ÓãŽÓã‡Óã€ÓãyÓãrÓãkÓãdÓã]ÓãVÓãOÓãHÓãAÓã:Óã3Óã,Óã%ÓãÓãÓãÓã ÓãÓãûÒãôÒãíÒãæÒãßÒãØÒãÑÒãÊÒãÃÒã¼ÒãµÒã®Òã§Òã Òã™Òã’Òã‹Òã„Òã}ÒãvÒãoÒãhÒãaÒãZÒãSÒãLÒãEÒã>Òã7Òã0Òã)Òã"ÒãÒãÒã ÒãÒãÿÑãøÑãñÑãêÑããÑãÜÑãÕÑãÎÑãÇÑãÀÑã¹Ñã²Ñã«Ñã¤ÑãÑã–ÑãÑãˆÑãÑãzÑãsÑãlÑãeÑã^ÑãWÑãPÑãIÑãBÑã;Ñã4Ñã-Ñã&ÑãÑãÑãÑã ÑãÑãüÐãõÐãîÐãçÐãàÐãÙÐãÒÐãËÐãÄÐã½Ðã¶Ðã¯Ðã¨Ðã¡ÐãšÐã“ÐãŒÐã…Ðã~ÐãwÐãpÐãiÐãbÐã[ÐãTÐãMÐãFÐã?Ðã8Ðã1Ðã*Ðã#ÐãÐãÐãÐãÐãÐãùÏãòÏãëÏãäÏãÝÏãÖÏãÏÏãÈÏãÁÏãºÏã³Ïã¬Ïã¥ÏãžÏã—ÏãÏã‰Ïã‚Ïã{ÏãtÏãmÏãfÏã_ÏãXÏãQÏãJÏãCÏã<Ïã5Ïã.Ïã'Ïã ÏãÏãÏã ÏãÏãýÎãöÎãïÎãèÎãáÎãÚÎãÓÎãÌÎãÅÎã¾Îã·Îã°Îã©Îã¢Îã›Îã”ÎãÎã†ÎãÎãxÎãqÎãjÎãcÎã\ÎãUÎãNÎãGÎã@Îã9Îã2Îã+Îã$ÎãÎãÎãÎãÎãÎãúÍãóÍãìÍãåÍãÞÍã×ÍãÐÍãÉÍãÂÍã»Íã´Íã­Íã¦ÍãŸÍã˜Íã‘ÍãŠÍãƒÍã|ÍãuÍãnÍãgÍã`ÍãYÍãRÍãKÍãDÍã=Íã6Íã/Íã(Íã!ÍãÍãÍã ÍãÍãþÌã÷ÌãðÌãéÌãâÌãÛÌãÔÌãÍÌãÆÌã¿Ìã¸Ìã±ÌãªÌã£ÌãœÌã•ÌãŽÌã‡Ìã€ÌãyÌãrÌãkÌãdÌã]ÌãVÌãOÌãHÌãAÌã:Ìã3Ìã,Ìã%ÌãÌãÌãÌã ÌãÌãûËãôËãíËãæËãßËãØËãÑËãÊËãÃËã¼ËãµËã®Ëã§Ëã Ëã™Ëã’Ëã‹Ëã„Ëã}ËãvËãoËãhËãaËãZËãSËãLËãEËã>Ëã7Ëã0Ëã)Ëã"ËãËãËã ËãËãÿÊãøÊãñÊãêÊããÊãÜÊãÕÊãÎÊãÇÊãÀÊã¹Êã²Êã«Êã¤ÊãÊã–ÊãÊãˆÊãÊãzÊãsÊãlÊãeÊã^ÊãWÊãPÊãIÊãBÊã;Êã4Êã-Êã&ÊãÊãÊãÊã ÊãÊãüÉãõÉãîÉãçÉãàÉãÙÉãÒÉãËÉãÄÉã½Éã¶Éã¯Éã¨Éã¡ÉãšÉã“ÉãŒÉã…Éã~ÉãwÉãpÉãiÉãbÉã[ÉãTÉãMÉãFÉã?Éã8Éã1Éã*Éã#ÉãÉãÉãÉãÉãÉãùÈãòÈãëÈãäÈãÝÈãÖÈãÏÈãÈÈãÁÈãºÈã³Èã¬Èã¥ÈãžÈã—ÈãÈã‰Èã‚Èã{ÈãtÈãmÈãfÈã_ÈãXÈãQÈãJÈãCÈã<Èã5Èã.Èã'Èã ÈãÈãÈã ÈãÈãýÇãöÇãïÇãèÇãáÇãÚÇãÓÇãÌÇãÅÇã¾Çã·Çã°Çã©Çã¢Çã›Çã”ÇãÇã†ÇãÇãxÇãqÇãjÇãcÇã\ÇãUÇãNÇãGÇã@Çã9Çã2Çã+Çã$ÇãÇãÇãÇãÇãÇãúÆãóÆãìÆãåÆãÞÆãׯãÐÆãÉÆãÂÆã»Æã´Æã­Æã¦ÆãŸÆã˜Æã‘ÆãŠÆãƒÆã|ÆãuÆãnÆãgÆã`ÆãYÆãRÆãKÆãDÆã=Æã6Æã/Æã(Æã!ÆãÆãÆã ÆãÆãþÅã÷ÅãðÅãéÅãâÅãÛÅãÔÅãÍÅãÆÅã¿Åã¸Åã±ÅãªÅã£ÅãœÅã•ÅãŽÅã‡Åã€ÅãyÅãrÅãkÅãdÅã]ÅãVÅãOÅãHÅãAÅã:Åã3Åã,Åã%ÅãÅãÅãÅã ÅãÅãûÄãôÄãíÄãæÄãßÄãØÄãÑÄãÊÄãÃÄã¼ÄãµÄã®Äã§Äã Äã™Äã’Äã‹Äã„Äã}ÄãvÄãoÄãhÄãaÄãZÄãSÄãLÄãEÄã>Äã7Äã0Äã)Äã"ÄãÄãÄã ÄãÄãÿÃãøÃãñÃãêÃããÃãÜÃãÕÃãÎÃãÇÃãÀÃã¹Ãã²Ãã«Ãã¤ÃãÃã–ÃãÃãˆÃãÃãzÃãsÃãlÃãeÃã^ÃãWÃãPÃãIÃãBÃã;Ãã4Ãã-Ãã&ÃãÃãÃãÃã ÃãÃãüÂãõÂãîÂãçÂãàÂãÙÂãÒÂãËÂãÄÂã½Âã¶Âã¯Âã¨Âã¡ÂãšÂã“ÂãŒÂã…Âã~ÂãwÂãpÂãiÂãbÂã[ÂãTÂãMÂãFÂã?Âã8Âã1Âã*Âã#ÂãÂãÂãÂãÂãÂãùÁãòÁãëÁãäÁãÝÁãÖÁãÏÁãÈÁãÁÁãºÁã³Áã¬Áã¥ÁãžÁã—ÁãÁã‰Áã‚Áã{ÁãtÁãmÁãfÁã_ÁãXÁãQÁãJÁãCÁã<Áã5Áã.Áã'Áã ÁãÁãÁã ÁãÁãýÀãöÀãïÀãèÀãáÀãÚÀãÓÀãÌÀãÅÀã¾Àã·Àã°Àã©Àã¢Àã›Àã”ÀãÀã†ÀãÀãxÀãqÀãjÀãcÀã\ÀãUÀãNÀãGÀã@Àã9Àã2Àã+Àã$ÀãÀãÀãÀãÀãÀãú¿ãó¿ãì¿ãå¿ãÞ¿ã׿ãпãÉ¿ã¿ã»¿ã´¿ã­¿ã¦¿ãŸ¿ã˜¿ã‘¿ãŠ¿ãƒ¿ã|¿ãu¿ãn¿ãg¿ã`¿ãY¿ãR¿ãK¿ãD¿ã=¿ã6¿ã/¿ã(¿ã!¿ã¿ã¿ã ¿ã¿ãþ¾ã÷¾ãð¾ãé¾ãâ¾ãÛ¾ãÔ¾ã;ãƾ㿾㸾㱾㪾㣾㜾㕾ã޾ㇾ〾ãy¾ãr¾ãk¾ãd¾ã]¾ãV¾ãO¾ãH¾ãA¾ã:¾ã3¾ã,¾ã%¾ã¾ã¾ã¾ã ¾ã¾ãû½ãô½ãí½ãæ½ãß½ãؽãѽãʽãý㼽㵽㮽㧽㠽㙽㒽㋽ㄽã}½ãv½ão½ãh½ãa½ãZ½ãS½ãL½ãE½ã>½ã7½ã0½ã)½ã"½ã½ã½ã ½ã½ãÿ¼ãø¼ãñ¼ãê¼ãã¼ãܼãÕ¼ãμãǼãÀ¼ã¹¼ã²¼ã«¼ã¤¼ã¼ã–¼ã¼ãˆ¼ã¼ãz¼ãs¼ãl¼ãe¼ã^¼ãW¼ãP¼ãI¼ãB¼ã;¼ã4¼ã-¼ã&¼ã¼ã¼ã¼ã ¼ã¼ãü»ãõ»ãî»ãç»ãà»ãÙ»ãÒ»ãË»ãĻ㽻㶻㯻㨻㡻㚻㓻㌻ㅻã~»ãw»ãp»ãi»ãb»ã[»ãT»ãM»ãF»ã?»ã8»ã1»ã*»ã#»ã»ã»ã»ã»ã»ãùºãòºãëºãäºãݺãÖºãϺãȺãÁºãººã³ºã¬ºã¥ºãžºã—ºãºã‰ºã‚ºã{ºãtºãmºãfºã_ºãXºãQºãJºãCºã<ºã5ºã.ºã'ºã ºãºãºã ºãºãý¹ãö¹ãï¹ãè¹ãá¹ãÚ¹ãÓ¹ã̹ãŹã¾¹ã·¹ã°¹ã©¹ã¢¹ã›¹ã”¹ã¹ã†¹ã¹ãx¹ãq¹ãj¹ãc¹ã\¹ãU¹ãN¹ãG¹ã@¹ã9¹ã2¹ã+¹ã$¹ã¹ã¹ã¹ã¹ã¹ãú¸ãó¸ãì¸ãå¸ãÞ¸ã׸ãиãɸã¸ã»¸ã´¸ã­¸ã¦¸ãŸ¸ã˜¸ã‘¸ãЏãƒ¸ã|¸ãu¸ãn¸ãg¸ã`¸ãY¸ãR¸ãK¸ãD¸ã=¸ã6¸ã/¸ã(¸ã!¸ã¸ã¸ã ¸ã¸ãþ·ã÷·ãð·ãé·ãâ·ãÛ·ãÔ·ãÍ·ãÆ·ã¿·ã¸·ã±·ãª·ã£·ãœ·ã•·ãŽ·ã‡·ã€·ãy·ãr·ãk·ãd·ã]·ãV·ãO·ãH·ãA·ã:·ã3·ã,·ã%·ã·ã·ã·ã ·ã·ãû¶ãô¶ãí¶ãæ¶ãß¶ãضãѶãʶãöã¼¶ãµ¶ã®¶ã§¶ã ¶ã™¶ã’¶ã‹¶ã„¶ã}¶ãv¶ão¶ãh¶ãa¶ãZ¶ãS¶ãL¶ãE¶ã>¶ã7¶ã0¶ã)¶ã"¶ã¶ã¶ã ¶ã¶ãÿµãøµãñµãêµããµãܵãÕµãεãǵãÀµã¹µã²µã«µã¤µãµã–µãµãˆµãµãzµãsµãlµãeµã^µãWµãPµãIµãBµã;µã4µã-µã&µãµãµãµã µãµãü´ãõ´ãî´ãç´ãà´ãÙ´ãÒ´ãË´ãĴ㽴㶴㯴㨴㡴㚴㓴㌴ㅴã~´ãw´ãp´ãi´ãb´ã[´ãT´ãM´ãF´ã?´ã8´ã1´ã*´ã#´ã´ã´ã´ã´ã´ãù³ãò³ãë³ãä³ãݳãÖ³ãϳãȳãÁ³ãº³ã³³ã¬³ã¥³ãž³ã—³ã³ã‰³ã‚³ã{³ãt³ãm³ãf³ã_³ãX³ãQ³ãJ³ãC³ã<³ã5³ã.³ã'³ã ³ã³ã³ã ³ã³ãý²ãö²ãï²ãè²ãá²ãÚ²ãÓ²ã̲ãŲ㾲㷲㰲㩲㢲㛲㔲ã²ã†²ã²ãx²ãq²ãj²ãc²ã\²ãU²ãN²ãG²ã@²ã9²ã2²ã+²ã$²ã²ã²ã²ã²ã²ãú±ãó±ãì±ãå±ãÞ±ã×±ãбãɱã±ã»±ã´±ã­±ã¦±ãŸ±ã˜±ã‘±ãбヱã|±ãu±ãn±ãg±ã`±ãY±ãR±ãK±ãD±ã=±ã6±ã/±ã(±ã!±ã±ã±ã ±ã±ãþ°ã÷°ãð°ãé°ãâ°ãÛ°ãÔ°ãͰãư㿰㸰㱰㪰㣰㜰㕰ãްㇰ〰ãy°ãr°ãk°ãd°ã]°ãV°ãO°ãH°ãA°ã:°ã3°ã,°ã%°ã°ã°ã°ã °ã°ãû¯ãô¯ãí¯ãæ¯ã߯ãدãѯãʯãï㼯㵯㮯㧯㠯㙯㒯㋯ㄯã}¯ãv¯ão¯ãh¯ãa¯ãZ¯ãS¯ãL¯ãE¯ã>¯ã7¯ã0¯ã)¯ã"¯ã¯ã¯ã ¯ã¯ãÿ®ãø®ãñ®ãê®ãã®ãÜ®ãÕ®ãήãÇ®ãÀ®ã¹®ã²®ã«®ã¤®ã®ã–®ã®ãˆ®ã®ãz®ãs®ãl®ãe®ã^®ãW®ãP®ãI®ãB®ã;®ã4®ã-®ã&®ã®ã®ã®ã ®ã®ãü­ãõ­ãî­ãç­ãà­ãÙ­ãÒ­ãË­ãĭ㽭㶭㯭㨭㡭㚭㓭㌭ㅭã~­ãw­ãp­ãi­ãb­ã[­ãT­ãM­ãF­ã?­ã8­ã1­ã*­ã#­ã­ã­ã­ã­ã­ãù¬ãò¬ãë¬ãä¬ãݬãÖ¬ãϬãȬãÁ¬ãº¬ã³¬ã¬¬ã¥¬ãž¬ã—¬ã¬ã‰¬ã‚¬ã{¬ãt¬ãm¬ãf¬ã_¬ãX¬ãQ¬ãJ¬ãC¬ã<¬ã5¬ã.¬ã'¬ã ¬ã¬ã¬ã ¬ã¬ãý«ãö«ãï«ãè«ãá«ãÚ«ãÓ«ãÌ«ãū㾫㷫㰫㩫㢫㛫㔫ã«ã†«ã«ãx«ãq«ãj«ãc«ã\«ãU«ãN«ãG«ã@«ã9«ã2«ã+«ã$«ã«ã«ã«ã«ã«ãúªãóªãìªãåªãÞªãתãЪãɪãªã»ªã´ªã­ªã¦ªãŸªã˜ªã‘ªãŠªãƒªã|ªãuªãnªãgªã`ªãYªãRªãKªãDªã=ªã6ªã/ªã(ªã!ªãªãªã ªãªãþ©ã÷©ãð©ãé©ãâ©ãÛ©ãÔ©ãÍ©ãÆ©ã¿©ã¸©ã±©ãª©ã£©ãœ©ã•©ãŽ©ã‡©ã€©ãy©ãr©ãk©ãd©ã]©ãV©ãO©ãH©ãA©ã:©ã3©ã,©ã%©ã©ã©ã©ã ©ã©ãû¨ãô¨ãí¨ãæ¨ãߨãبãѨãʨãè㼨㵨㮨㧨㠨㙨㒨㋨ㄨã}¨ãv¨ão¨ãh¨ãa¨ãZ¨ãS¨ãL¨ãE¨ã>¨ã7¨ã0¨ã)¨ã"¨ã¨ã¨ã ¨ã¨ãÿ§ãø§ãñ§ãê§ãã§ãܧãÕ§ãΧãǧãÀ§ã¹§ã²§ã«§ã¤§ã§ã–§ã§ãˆ§ã§ãz§ãs§ãl§ãe§ã^§ãW§ãP§ãI§ãB§ã;§ã4§ã-§ã&§ã§ã§ã§ã §ã§ãü¦ãõ¦ãî¦ãç¦ãà¦ãÙ¦ãÒ¦ã˦ãĦ㽦㶦㯦㨦㡦㚦㓦㌦ㅦã~¦ãw¦ãp¦ãi¦ãb¦ã[¦ãT¦ãM¦ãF¦ã?¦ã8¦ã1¦ã*¦ã#¦ã¦ã¦ã¦ã¦ã¦ãù¥ãò¥ãë¥ãä¥ãÝ¥ãÖ¥ãÏ¥ãÈ¥ãÁ¥ãº¥ã³¥ã¬¥ã¥¥ãž¥ã—¥ã¥ã‰¥ã‚¥ã{¥ãt¥ãm¥ãf¥ã_¥ãX¥ãQ¥ãJ¥ãC¥ã<¥ã5¥ã.¥ã'¥ã ¥ã¥ã¥ã ¥ã¥ãý¤ãö¤ãï¤ãè¤ãá¤ãÚ¤ãÓ¤ã̤ãŤã¾¤ã·¤ã°¤ã©¤ã¢¤ã›¤ã”¤ã¤ã†¤ã¤ãx¤ãq¤ãj¤ãc¤ã\¤ãU¤ãN¤ãG¤ã@¤ã9¤ã2¤ã+¤ã$¤ã¤ã¤ã¤ã¤ã¤ãú£ãó£ãì£ãå£ãÞ£ã×£ãУãÉ£ã£ã»£ã´£ã­£ã¦£ãŸ£ã˜£ã‘£ãŠ£ãƒ£ã|£ãu£ãn£ãg£ã`£ãY£ãR£ãK£ãD£ã=£ã6£ã/£ã(£ã!£ã£ã£ã £ã£ãþ¢ã÷¢ãð¢ãé¢ãâ¢ãÛ¢ãÔ¢ãÍ¢ãÆ¢ã¿¢ã¸¢ã±¢ãª¢ã£¢ãœ¢ã•¢ãŽ¢ã‡¢ã€¢ãy¢ãr¢ãk¢ãd¢ã]¢ãV¢ãO¢ãH¢ãA¢ã:¢ã3¢ã,¢ã%¢ã¢ã¢ã¢ã ¢ã¢ãû¡ãô¡ãí¡ãæ¡ãß¡ãØ¡ãÑ¡ãÊ¡ãá㼡㵡㮡㧡㠡㙡㒡㋡ㄡã}¡ãv¡ão¡ãh¡ãa¡ãZ¡ãS¡ãL¡ãE¡ã>¡ã7¡ã0¡ã)¡ã"¡ã¡ã¡ã ¡ã¡ãÿ ãø ãñ ãê ãã ãÜ ãÕ ãΠãÇ ãÀ ã¹ ã² ã« ã¤ ã ã– ã ãˆ ã ãz ãs ãl ãe ã^ ãW ãP ãI ãB ã; ã4 ã- ã& ã ã ã ã  ã ãüŸãõŸãîŸãçŸãàŸãÙŸãÒŸãËŸãğ㽟㶟㯟㨟㡟㚟㓟㌟ㅟã~ŸãwŸãpŸãiŸãbŸã[ŸãTŸãMŸãFŸã?Ÿã8Ÿã1Ÿã*Ÿã#ŸãŸãŸãŸãŸãŸãùžãòžãëžãäžãÝžãÖžãÏžãÈžãÁžãºžã³žã¬žã¥žãžžã—žãžã‰žã‚žã{žãtžãmžãfžã_žãXžãQžãJžãCžã<žã5žã.žã'žã žãžãžã žãžãýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúœãóœãìœãåœãÞœãלãМãÉœãœã»œã´œã­œã¦œãŸœã˜œã‘œãŠœãƒœã|œãuœãnœãgœã`œãYœãRœãKœãDœã=œã6œã/œã(œã!œãœãœã œãœãþ›ã÷›ãð›ãé›ãâ›ãÛ›ãÔ›ãÍ›ãÆ›ã¿›ã¸›ã±›ãª›ã£›ãœ›ã•›ãŽ›ã‡›ã€›ãy›ãr›ãk›ãd›ã]›ãV›ãO›ãH›ãA›ã:›ã3›ã,›ã%›ã›ã›ã›ã ›ã›ãûšãôšãíšãæšãßšãØšãÑšãÊšãÚ㼚㵚㮚㧚㠚㙚㒚㋚ㄚã}šãvšãošãhšãašãZšãSšãLšãEšã>šã7šã0šã)šã"šãšãšã šãšãÿ™ãø™ãñ™ãê™ãã™ãÜ™ãÕ™ãΙãÇ™ãÀ™ã¹™ã²™ã«™ã¤™ã™ã–™ã™ãˆ™ã™ãz™ãs™ãl™ãe™ã^™ãW™ãP™ãI™ãB™ã;™ã4™ã-™ã&™ã™ã™ã™ã ™ã™ãü˜ãõ˜ãî˜ãç˜ãà˜ãÙ˜ãÒ˜ã˘ãĘ㽘㶘㯘㨘㡘㚘㓘㌘ㅘã~˜ãw˜ãp˜ãi˜ãb˜ã[˜ãT˜ãM˜ãF˜ã?˜ã8˜ã1˜ã*˜ã#˜ã˜ã˜ã˜ã˜ã˜ãù—ãò—ãë—ãä—ãÝ—ãÖ—ãÏ—ãÈ—ãÁ—㺗㳗㬗㥗㞗㗗ã—㉗゗ã{—ãt—ãm—ãf—ã_—ãX—ãQ—ãJ—ãC—ã<—ã5—ã.—ã'—ã —ã—ã—ã —ã—ãý–ãö–ãï–ãè–ãá–ãÚ–ãÓ–ãÌ–ãŖ㾖㷖㰖㩖㢖㛖㔖ã–㆖ã–ãx–ãq–ãj–ãc–ã\–ãU–ãN–ãG–ã@–ã9–ã2–ã+–ã$–ã–ã–ã–ã–ã–ãú•ãó•ãì•ãå•ãÞ•ãוãЕãÉ•ã•㻕㴕㭕㦕㟕㘕㑕㊕フã|•ãu•ãn•ãg•ã`•ãY•ãR•ãK•ãD•ã=•ã6•ã/•ã(•ã!•ã•ã•ã •ã•ãþ”ã÷”ãð”ãé”ãâ”ãÛ”ãÔ”ãÍ”ãÆ”ã¿”ã¸”ã±”ãª”ã£”ãœ”ã•”ãŽ”ã‡”ã€”ãy”ãr”ãk”ãd”ã]”ãV”ãO”ãH”ãA”ã:”ã3”ã,”ã%”ã”ã”ã”ã ”ã”ãû“ãô“ãí“ãæ“ãß“ãØ“ãÑ“ãÊ“ãÓ㼓㵓㮓㧓㠓㙓㒓㋓ㄓã}“ãv“ão“ãh“ãa“ãZ“ãS“ãL“ãE“ã>“ã7“ã0“ã)“ã"“ã“ã“ã “ã“ãÿ’ãø’ãñ’ãê’ãã’ãÜ’ãÕ’ãÎ’ãÇ’ãÀ’㹒㲒㫒㤒ã’ã–’ã’㈒ã’ãz’ãs’ãl’ãe’ã^’ãW’ãP’ãI’ãB’ã;’ã4’ã-’ã&’ã’ã’ã’ã ’ã’ãü‘ãõ‘ãî‘ãç‘ãà‘ãÙ‘ãÒ‘ãË‘ãđ㽑㶑㯑㨑㡑㚑㓑㌑ㅑã~‘ãw‘ãp‘ãi‘ãb‘ã[‘ãT‘ãM‘ãF‘ã?‘ã8‘ã1‘ã*‘ã#‘ã‘ã‘ã‘ã‘ã‘ãùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúŽãóŽãìŽãåŽãÞŽã׎ãÐŽãÉŽãŽ㻎㴎㭎㦎㟎㘎㑎㊎ノã|ŽãuŽãnŽãgŽã`ŽãYŽãRŽãKŽãDŽã=Žã6Žã/Žã(Žã!ŽãŽãŽã ŽãŽãþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûŒãôŒãíŒãæŒãߌãØŒãÑŒãÊŒãÌ㼌㵌㮌㧌㠌㙌㒌㋌ㄌã}ŒãvŒãoŒãhŒãaŒãZŒãSŒãLŒãEŒã>Œã7Œã0Œã)Œã"ŒãŒãŒã ŒãŒãÿ‹ãø‹ãñ‹ãê‹ãã‹ãÜ‹ãÕ‹ã΋ãÇ‹ãÀ‹ã¹‹ã²‹ã«‹ã¤‹ã‹ã–‹ã‹ãˆ‹ã‹ãz‹ãs‹ãl‹ãe‹ã^‹ãW‹ãP‹ãI‹ãB‹ã;‹ã4‹ã-‹ã&‹ã‹ã‹ã‹ã ‹ã‹ãüŠãõŠãîŠãçŠãàŠãÙŠãÒŠãËŠãĊ㽊㶊㯊㨊㡊㚊㓊㌊ㅊã~ŠãwŠãpŠãiŠãbŠã[ŠãTŠãMŠãFŠã?Šã8Šã1Šã*Šã#ŠãŠãŠãŠãŠãŠãù‰ãò‰ãë‰ãä‰ã݉ãÖ‰ãωãȉãÁ‰ãº‰ã³‰ã¬‰ã¥‰ãž‰ã—‰ã‰ã‰‰ã‚‰ã{‰ãt‰ãm‰ãf‰ã_‰ãX‰ãQ‰ãJ‰ãC‰ã<‰ã5‰ã.‰ã'‰ã ‰ã‰ã‰ã ‰ã‰ãýˆãöˆãïˆãèˆãáˆãÚˆãÓˆã̈ãň㾈㷈㰈㩈㢈㛈㔈ãˆã†ˆãˆãxˆãqˆãjˆãcˆã\ˆãUˆãNˆãGˆã@ˆã9ˆã2ˆã+ˆã$ˆãˆãˆãˆãˆãˆãú‡ãó‡ãì‡ãå‡ãÞ‡ãׇãЇãɇã‡ã»‡ã´‡ã­‡ã¦‡ãŸ‡ã˜‡ã‘‡ãЇãƒ‡ã|‡ãu‡ãn‡ãg‡ã`‡ãY‡ãR‡ãK‡ãD‡ã=‡ã6‡ã/‡ã(‡ã!‡ã‡ã‡ã ‡ã‡ãþ†ã÷†ãð†ãé†ãâ†ãÛ†ãÔ†ã͆ãƆ㿆㸆㱆㪆㣆㜆㕆ãކ㇆〆ãy†ãr†ãk†ãd†ã]†ãV†ãO†ãH†ãA†ã:†ã3†ã,†ã%†ã†ã†ã†ã †ã†ãû…ãô…ãí…ãæ…ãß…ãØ…ãÑ…ãÊ…ãÃ…ã¼…ãµ…ã®…ã§…ã …ã™…ã’…ã‹…ã„…ã}…ãv…ão…ãh…ãa…ãZ…ãS…ãL…ãE…ã>…ã7…ã0…ã)…ã"…ã…ã…ã …ã…ãÿ„ãø„ãñ„ãê„ãã„ãÜ„ãÕ„ã΄ãÇ„ãÀ„㹄㲄㫄㤄ã„ã–„ã„㈄ã„ãz„ãs„ãl„ãe„ã^„ãW„ãP„ãI„ãB„ã;„ã4„ã-„ã&„ã„ã„ã„ã „ã„ãüƒãõƒãîƒãçƒãàƒãÙƒãÒƒã˃ãă㽃㶃㯃㨃㡃㚃㓃㌃ㅃã~ƒãwƒãpƒãiƒãbƒã[ƒãTƒãMƒãFƒã?ƒã8ƒã1ƒã*ƒã#ƒãƒãƒãƒãƒãƒãù‚ãò‚ãë‚ãä‚ãÝ‚ãÖ‚ãÏ‚ãÈ‚ãÁ‚㺂㳂㬂㥂㞂㗂ã‚㉂もã{‚ãt‚ãm‚ãf‚ã_‚ãX‚ãQ‚ãJ‚ãC‚ã<‚ã5‚ã.‚ã'‚ã ‚ã‚ã‚ã ‚ã‚ãýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããú€ãó€ãì€ãå€ãÞ€ã×€ãЀãÉ€ã€ã»€ã´€ã­€ã¦€ãŸ€ã˜€ã‘€ãŠ€ãƒ€ã|€ãu€ãn€ãg€ã`€ãY€ãR€ãK€ãD€ã=€ã6€ã/€ã(€ã!€ã€ã€ã €ã€ãþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããû~ãô~ãí~ãæ~ãß~ãØ~ãÑ~ãÊ~ãÃ~ã¼~ãµ~ã®~ã§~ã ~ã™~ã’~ã‹~ã„~ã}~ãv~ão~ãh~ãa~ãZ~ãS~ãL~ãE~ã>~ã7~ã0~ã)~ã"~ã~ã~ã ~ã~ãÿ}ãø}ãñ}ãê}ãã}ãÜ}ãÕ}ãÎ}ãÇ}ãÀ}ã¹}ã²}ã«}ã¤}ã}ã–}ã}ãˆ}ã}ãz}ãs}ãl}ãe}ã^}ãW}ãP}ãI}ãB}ã;}ã4}ã-}ã&}ã}ã}ã}ã }ã}ãü|ãõ|ãî|ãç|ãà|ãÙ|ãÒ|ãË|ãÄ|ã½|ã¶|ã¯|ã¨|ã¡|ãš|ã“|ãŒ|ã…|ã~|ãw|ãp|ãi|ãb|ã[|ãT|ãM|ãF|ã?|ã8|ã1|ã*|ã#|ã|ã|ã|ã|ã|ãù{ãò{ãë{ãä{ãÝ{ãÖ{ãÏ{ãÈ{ãÁ{ãº{ã³{ã¬{ã¥{ãž{ã—{ã{ã‰{ã‚{ã{{ãt{ãm{ãf{ã_{ãX{ãQ{ãJ{ãC{ã<{ã5{ã.{ã'{ã {ã{ã{ã {ã{ãýzãözãïzãèzãázãÚzãÓzãÌzãÅzã¾zã·zã°zã©zã¢zã›zã”zãzã†zãzãxzãqzãjzãczã\zãUzãNzãGzã@zã9zã2zã+zã$zãzãzãzãzãzãúyãóyãìyãåyãÞyã×yãÐyãÉyãÂyã»yã´yã­yã¦yãŸyã˜yã‘yãŠyãƒyã|yãuyãnyãgyã`yãYyãRyãKyãDyã=yã6yã/yã(yã!yãyãyã yãyãþxã÷xãðxãéxãâxãÛxãÔxãÍxãÆxã¿xã¸xã±xãªxã£xãœxã•xãŽxã‡xã€xãyxãrxãkxãdxã]xãVxãOxãHxãAxã:xã3xã,xã%xãxãxãxã xãxãûwãôwãíwãæwãßwãØwãÑwãÊwãÃwã¼wãµwã®wã§wã wã™wã’wã‹wã„wã}wãvwãowãhwãawãZwãSwãLwãEwã>wã7wã0wã)wã"wãwãwã wãwãÿvãøvãñvãêvããvãÜvãÕvãÎvãÇvãÀvã¹vã²vã«vã¤vãvã–vãvãˆvãvãzvãsvãlvãevã^vãWvãPvãIvãBvã;vã4vã-vã&vãvãvãvã vãvãüuãõuãîuãçuãàuãÙuãÒuãËuãÄuã½uã¶uã¯uã¨uã¡uãšuã“uãŒuã…uã~uãwuãpuãiuãbuã[uãTuãMuãFuã?uã8uã1uã*uã#uãuãuãuãuãuãùtãòtãëtãätãÝtãÖtãÏtãÈtãÁtãºtã³tã¬tã¥tãžtã—tãtã‰tã‚tã{tãttãmtãftã_tãXtãQtãJtãCtãpã7pã0pã)pã"pãpãpã pãpãÿoãøoãñoãêoããoãÜoãÕoãÎoãÇoãÀoã¹oã²oã«oã¤oãoã–oãoãˆoãoãzoãsoãloãeoã^oãWoãPoãIoãBoã;oã4oã-oã&oãoãoãoã oãoãünãõnãînãçnãànãÙnãÒnãËnãÄnã½nã¶nã¯nã¨nã¡nãšnã“nãŒnã…nã~nãwnãpnãinãbnã[nãTnãMnãFnã?nã8nã1nã*nã#nãnãnãnãnãnãùmãòmãëmãämãÝmãÖmãÏmãÈmãÁmãºmã³mã¬mã¥mãžmã—mãmã‰mã‚mã{mãtmãmmãfmã_mãXmãQmãJmãCmãiã7iã0iã)iã"iãiãiã iãiãÿhãøhãñhãêhããhãÜhãÕhãÎhãÇhãÀhã¹hã²hã«hã¤hãhã–hãhãˆhãhãzhãshãlhãehã^hãWhãPhãIhãBhã;hã4hã-hã&hãhãhãhã hãhãügãõgãîgãçgãàgãÙgãÒgãËgãÄgã½gã¶gã¯gã¨gã¡gãšgã“gãŒgã…gã~gãwgãpgãigãbgã[gãTgãMgãFgã?gã8gã1gã*gã#gãgãgãgãgãgãùfãòfãëfãäfãÝfãÖfãÏfãÈfãÁfãºfã³fã¬fã¥fãžfã—fãfã‰fã‚fã{fãtfãmfãffã_fãXfãQfãJfãCfãbã7bã0bã)bã"bãbãbã bãbãÿaãøaãñaãêaããaãÜaãÕaãÎaãÇaãÀaã¹aã²aã«aã¤aãaã–aãaãˆaãaãzaãsaãlaãeaã^aãWaãPaãIaãBaã;aã4aã-aã&aãaãaãaã aãaãü`ãõ`ãî`ãç`ãà`ãÙ`ãÒ`ãË`ãÄ`ã½`ã¶`ã¯`ã¨`ã¡`ãš`ã“`ãŒ`ã…`ã~`ãw`ãp`ãi`ãb`ã[`ãT`ãM`ãF`ã?`ã8`ã1`ã*`ã#`ã`ã`ã`ã`ã`ãù_ãò_ãë_ãä_ãÝ_ãÖ_ãÏ_ãÈ_ãÁ_ãº_ã³_ã¬_ã¥_ãž_ã—_ã_ã‰_ã‚_ã{_ãt_ãm_ãf_ã__ãX_ãQ_ãJ_ãC_ã<_ã5_ã._ã'_ã _ã_ã_ã _ã_ãý^ãö^ãï^ãè^ãá^ãÚ^ãÓ^ãÌ^ãÅ^ã¾^ã·^ã°^ã©^ã¢^ã›^ã”^ã^ã†^ã^ãx^ãq^ãj^ãc^ã\^ãU^ãN^ãG^ã@^ã9^ã2^ã+^ã$^ã^ã^ã^ã^ã^ãú]ãó]ãì]ãå]ãÞ]ã×]ãÐ]ãÉ]ãÂ]ã»]ã´]ã­]ã¦]ãŸ]ã˜]ã‘]ãŠ]ãƒ]ã|]ãu]ãn]ãg]ã`]ãY]ãR]ãK]ãD]ã=]ã6]ã/]ã(]ã!]ã]ã]ã ]ã]ãþ\ã÷\ãð\ãé\ãâ\ãÛ\ãÔ\ãÍ\ãÆ\ã¿\ã¸\ã±\ãª\ã£\ãœ\ã•\ãŽ\ã‡\ã€\ãy\ãr\ãk\ãd\ã]\ãV\ãO\ãH\ãA\ã:\ã3\ã,\ã%\ã\ã\ã\ã \ã\ãû[ãô[ãí[ãæ[ãß[ãØ[ãÑ[ãÊ[ãÃ[ã¼[ãµ[ã®[ã§[ã [ã™[ã’[ã‹[ã„[ã}[ãv[ão[ãh[ãa[ãZ[ãS[ãL[ãE[ã>[ã7[ã0[ã)[ã"[ã[ã[ã [ã[ãÿZãøZãñZãêZããZãÜZãÕZãÎZãÇZãÀZã¹Zã²Zã«Zã¤ZãZã–ZãZãˆZãZãzZãsZãlZãeZã^ZãWZãPZãIZãBZã;Zã4Zã-Zã&ZãZãZãZã ZãZãüYãõYãîYãçYãàYãÙYãÒYãËYãÄYã½Yã¶Yã¯Yã¨Yã¡YãšYã“YãŒYã…Yã~YãwYãpYãiYãbYã[YãTYãMYãFYã?Yã8Yã1Yã*Yã#YãYãYãYãYãYãùXãòXãëXãäXãÝXãÖXãÏXãÈXãÁXãºXã³Xã¬Xã¥XãžXã—XãXã‰Xã‚Xã{XãtXãmXãfXã_XãXXãQXãJXãCXãTã7Tã0Tã)Tã"TãTãTã TãTãÿSãøSãñSãêSããSãÜSãÕSãÎSãÇSãÀSã¹Sã²Sã«Sã¤SãSã–SãSãˆSãSãzSãsSãlSãeSã^SãWSãPSãISãBSã;Sã4Sã-Sã&SãSãSãSã SãSãüRãõRãîRãçRãàRãÙRãÒRãËRãÄRã½Rã¶Rã¯Rã¨Rã¡RãšRã“RãŒRã…Rã~RãwRãpRãiRãbRã[RãTRãMRãFRã?Rã8Rã1Rã*Rã#RãRãRãRãRãRãùQãòQãëQãäQãÝQãÖQãÏQãÈQãÁQãºQã³Qã¬Qã¥QãžQã—QãQã‰Qã‚Qã{QãtQãmQãfQã_QãXQãQQãJQãCQãMã7Mã0Mã)Mã"MãMãMã MãMãÿLãøLãñLãêLããLãÜLãÕLãÎLãÇLãÀLã¹Lã²Lã«Lã¤LãLã–LãLãˆLãLãzLãsLãlLãeLã^LãWLãPLãILãBLã;Lã4Lã-Lã&LãLãLãLã LãLãüKãõKãîKãçKãàKãÙKãÒKãËKãÄKã½Kã¶Kã¯Kã¨Kã¡KãšKã“KãŒKã…Kã~KãwKãpKãiKãbKã[KãTKãMKãFKã?Kã8Kã1Kã*Kã#KãKãKãKãKãKãùJãòJãëJãäJãÝJãÖJãÏJãÈJãÁJãºJã³Jã¬Jã¥JãžJã—JãJã‰Jã‚Jã{JãtJãmJãfJã_JãXJãQJãJJãCJãFã7Fã0Fã)Fã"FãFãFã FãFãÿEãøEãñEãêEããEãÜEãÕEãÎEãÇEãÀEã¹Eã²Eã«Eã¤EãEã–EãEãˆEãEãzEãsEãlEãeEã^EãWEãPEãIEãBEã;Eã4Eã-Eã&EãEãEãEã EãEãüDãõDãîDãçDãàDãÙDãÒDãËDãÄDã½Dã¶Dã¯Dã¨Dã¡DãšDã“DãŒDã…Dã~DãwDãpDãiDãbDã[DãTDãMDãFDã?Dã8Dã1Dã*Dã#DãDãDãDãDãDãùCãòCãëCãäCãÝCãÖCãÏCãÈCãÁCãºCã³Cã¬Cã¥CãžCã—CãCã‰Cã‚Cã{CãtCãmCãfCã_CãXCãQCãJCãCCã?ã7?ã0?ã)?ã"?ã?ã?ã ?ã?ãÿ>ãø>ãñ>ãê>ãã>ãÜ>ãÕ>ãÎ>ãÇ>ãÀ>ã¹>ã²>ã«>ã¤>ã>ã–>ã>ãˆ>ã>ãz>ãs>ãl>ãe>ã^>ãW>ãP>ãI>ãB>ã;>ã4>ã->ã&>ã>ã>ã>ã >ã>ãü=ãõ=ãî=ãç=ãà=ãÙ=ãÒ=ãË=ãÄ=ã½=ã¶=ã¯=ã¨=ã¡=ãš=ã“=ãŒ=ã…=ã~=ãw=ãp=ãi=ãb=ã[=ãT=ãM=ãF=ã?=ã8=ã1=ã*=ã#=ã=ã=ã=ã=ã=ãù<ãò<ãë<ãä<ãÝ<ãÖ<ãÏ<ãÈ<ãÁ<ãº<ã³<ã¬<ã¥<ãž<ã—<ã<ã‰<ã‚<ã{<ãt<ãm<ãf<ã_<ãX<ãQ<ãJ<ãC<ã<<ã5<ã.<ã'<ã <ã<ã<ã <ã<ãý;ãö;ãï;ãè;ãá;ãÚ;ãÓ;ãÌ;ãÅ;ã¾;ã·;ã°;ã©;ã¢;ã›;ã”;ã;ã†;ã;ãx;ãq;ãj;ãc;ã\;ãU;ãN;ãG;ã@;ã9;ã2;ã+;ã$;ã;ã;ã;ã;ã;ãú:ãó:ãì:ãå:ãÞ:ã×:ãÐ:ãÉ:ãÂ:ã»:ã´:ã­:ã¦:ãŸ:ã˜:ã‘:ãŠ:ãƒ:ã|:ãu:ãn:ãg:ã`:ãY:ãR:ãK:ãD:ã=:ã6:ã/:ã(:ã!:ã:ã:ã :ã:ãþ9ã÷9ãð9ãé9ãâ9ãÛ9ãÔ9ãÍ9ãÆ9ã¿9ã¸9ã±9ãª9ã£9ãœ9ã•9ãŽ9ã‡9ã€9ãy9ãr9ãk9ãd9ã]9ãV9ãO9ãH9ãA9ã:9ã39ã,9ã%9ã9ã9ã9ã 9ã9ãû8ãô8ãí8ãæ8ãß8ãØ8ãÑ8ãÊ8ãÃ8ã¼8ãµ8ã®8ã§8ã 8ã™8ã’8ã‹8ã„8ã}8ãv8ão8ãh8ãa8ãZ8ãS8ãL8ãE8ã>8ã78ã08ã)8ã"8ã8ã8ã 8ã8ãÿ7ãø7ãñ7ãê7ãã7ãÜ7ãÕ7ãÎ7ãÇ7ãÀ7ã¹7ã²7ã«7ã¤7ã7ã–7ã7ãˆ7ã7ãz7ãs7ãl7ãe7ã^7ãW7ãP7ãI7ãB7ã;7ã47ã-7ã&7ã7ã7ã7ã 7ã7ãü6ãõ6ãî6ãç6ãà6ãÙ6ãÒ6ãË6ãÄ6ã½6ã¶6ã¯6ã¨6ã¡6ãš6ã“6ãŒ6ã…6ã~6ãw6ãp6ãi6ãb6ã[6ãT6ãM6ãF6ã?6ã86ã16ã*6ã#6ã6ã6ã6ã6ã6ãù5ãò5ãë5ãä5ãÝ5ãÖ5ãÏ5ãÈ5ãÁ5ãº5ã³5ã¬5ã¥5ãž5ã—5ã5ã‰5ã‚5ã{5ãt5ãm5ãf5ã_5ãX5ãQ5ãJ5ãC5ã<5ã55ã.5ã'5ã 5ã5ã5ã 5ã5ãý4ãö4ãï4ãè4ãá4ãÚ4ãÓ4ãÌ4ãÅ4ã¾4ã·4ã°4ã©4ã¢4ã›4ã”4ã4ã†4ã4ãx4ãq4ãj4ãc4ã\4ãU4ãN4ãG4ã@4ã94ã24ã+4ã$4ã4ã4ã4ã4ã4ãú3ãó3ãì3ãå3ãÞ3ã×3ãÐ3ãÉ3ãÂ3ã»3ã´3ã­3ã¦3ãŸ3ã˜3ã‘3ãŠ3ãƒ3ã|3ãu3ãn3ãg3ã`3ãY3ãR3ãK3ãD3ã=3ã63ã/3ã(3ã!3ã3ã3ã 3ã3ãþ2ã÷2ãð2ãé2ãâ2ãÛ2ãÔ2ãÍ2ãÆ2ã¿2ã¸2ã±2ãª2ã£2ãœ2ã•2ãŽ2ã‡2ã€2ãy2ãr2ãk2ãd2ã]2ãV2ãO2ãH2ãA2ã:2ã32ã,2ã%2ã2ã2ã2ã 2ã2ãû1ãô1ãí1ãæ1ãß1ãØ1ãÑ1ãÊ1ãÃ1ã¼1ãµ1ã®1ã§1ã 1ã™1ã’1ã‹1ã„1ã}1ãv1ão1ãh1ãa1ãZ1ãS1ãL1ãE1ã>1ã71ã01ã)1ã"1ã1ã1ã 1ã1ãÿ0ãø0ãñ0ãê0ãã0ãÜ0ãÕ0ãÎ0ãÇ0ãÀ0ã¹0ã²0ã«0ã¤0ã0ã–0ã0ãˆ0ã0ãz0ãs0ãl0ãe0ã^0ãW0ãP0ãI0ãB0ã;0ã40ã-0ã&0ã0ã0ã0ã 0ã0ãü/ãõ/ãî/ãç/ãà/ãÙ/ãÒ/ãË/ãÄ/ã½/ã¶/ã¯/ã¨/ã¡/ãš/ã“/ãŒ/ã…/ã~/ãw/ãp/ãi/ãb/ã[/ãT/ãM/ãF/ã?/ã8/ã1/ã*/ã#/ã/ã/ã/ã/ã/ãù.ãò.ãë.ãä.ãÝ.ãÖ.ãÏ.ãÈ.ãÁ.ãº.ã³.ã¬.ã¥.ãž.ã—.ã.ã‰.ã‚.ã{.ãt.ãm.ãf.ã_.ãX.ãQ.ãJ.ãC.ã<.ã5.ã..ã'.ã .ã.ã.ã .ã.ãý-ãö-ãï-ãè-ãá-ãÚ-ãÓ-ãÌ-ãÅ-ã¾-ã·-ã°-ã©-ã¢-ã›-ã”-ã-ã†-ã-ãx-ãq-ãj-ãc-ã\-ãU-ãN-ãG-ã@-ã9-ã2-ã+-ã$-ã-ã-ã-ã-ã-ãú,ãó,ãì,ãå,ãÞ,ã×,ãÐ,ãÉ,ãÂ,ã»,ã´,ã­,ã¦,ãŸ,ã˜,ã‘,ãŠ,ãƒ,ã|,ãu,ãn,ãg,ã`,ãY,ãR,ãK,ãD,ã=,ã6,ã/,ã(,ã!,ã,ã,ã ,ã,ãþ+ã÷+ãð+ãé+ãâ+ãÛ+ãÔ+ãÍ+ãÆ+ã¿+ã¸+ã±+ãª+ã£+ãœ+ã•+ãŽ+ã‡+ã€+ãy+ãr+ãk+ãd+ã]+ãV+ãO+ãH+ãA+ã:+ã3+ã,+ã%+ã+ã+ã+ã +ã+ãû*ãô*ãí*ãæ*ãß*ãØ*ãÑ*ãÊ*ãÃ*ã¼*ãµ*ã®*ã§*ã *ã™*ã’*ã‹*ã„*ã}*ãv*ão*ãh*ãa*ãZ*ãS*ãL*ãE*ã>*ã7*ã0*ã)*ã"*ã*ã*ã *ã*ãÿ)ãø)ãñ)ãê)ãã)ãÜ)ãÕ)ãÎ)ãÇ)ãÀ)ã¹)ã²)ã«)ã¤)ã)ã–)ã)ãˆ)ã)ãz)ãs)ãl)ãe)ã^)ãW)ãP)ãI)ãB)ã;)ã4)ã-)ã&)ã)ã)ã)ã )ã)ãü(ãõ(ãî(ãç(ãà(ãÙ(ãÒ(ãË(ãÄ(ã½(ã¶(ã¯(ã¨(ã¡(ãš(ã“(ãŒ(ã…(ã~(ãw(ãp(ãi(ãb(ã[(ãT(ãM(ãF(ã?(ã8(ã1(ã*(ã#(ã(ã(ã(ã(ã(ãù'ãò'ãë'ãä'ãÝ'ãÖ'ãÏ'ãÈ'ãÁ'ãº'ã³'ã¬'ã¥'ãž'ã—'ã'ã‰'ã‚'ã{'ãt'ãm'ãf'ã_'ãX'ãQ'ãJ'ãC'ã<'ã5'ã.'ã''ã 'ã'ã'ã 'ã'ãý&ãö&ãï&ãè&ãá&ãÚ&ãÓ&ãÌ&ãÅ&ã¾&ã·&ã°&ã©&ã¢&ã›&ã”&ã&ã†&ã&ãx&ãq&ãj&ãc&ã\&ãU&ãN&ãG&ã@&ã9&ã2&ã+&ã$&ã&ã&ã&ã&ã&ãú%ãó%ãì%ãå%ãÞ%ã×%ãÐ%ãÉ%ãÂ%ã»%ã´%ã­%ã¦%ãŸ%ã˜%ã‘%ãŠ%ãƒ%ã|%ãu%ãn%ãg%ã`%ãY%ãR%ãK%ãD%ã=%ã6%ã/%ã(%ã!%ã%ã%ã %ã%ãþ$ã÷$ãð$ãé$ãâ$ãÛ$ãÔ$ãÍ$ãÆ$ã¿$ã¸$ã±$ãª$ã£$ãœ$ã•$ãŽ$ã‡$ã€$ãy$ãr$ãk$ãd$ã]$ãV$ãO$ãH$ãA$ã:$ã3$ã,$ã%$ã$ã$ã$ã $ã$ãû#ãô#ãí#ãæ#ãß#ãØ#ãÑ#ãÊ#ãÃ#ã¼#ãµ#ã®#ã§#ã #ã™#ã’#ã‹#ã„#ã}#ãv#ão#ãh#ãa#ãZ#ãS#ãL#ãE#ã>#ã7#ã0#ã)#ã"#ã#ã#ã #ã#ãÿ"ãø"ãñ"ãê"ãã"ãÜ"ãÕ"ãÎ"ãÇ"ãÀ"ã¹"ã²"ã«"ã¤"ã"ã–"ã"ãˆ"ã"ãz"ãs"ãl"ãe"ã^"ãW"ãP"ãI"ãB"ã;"ã4"ã-"ã&"ã"ã"ã"ã "ã"ãü!ãõ!ãî!ãç!ãà!ãÙ!ãÒ!ãË!ãÄ!ã½!ã¶!ã¯!ã¨!ã¡!ãš!ã“!ãŒ!ã…!ã~!ãw!ãp!ãi!ãb!ã[!ãT!ãM!ãF!ã?!ã8!ã1!ã*!ã#!ã!ã!ã!ã!ã!ãù ãò ãë ãä ãÝ ãÖ ãÏ ãÈ ãÁ 㺠㳠㬠㥠㞠㗠ã ㉠゠ã{ ãt ãm ãf ã_ ãX ãQ ãJ ãC ã< ã5 ã. ã' ã ã ã ã ã ãýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿ ãø ãñ ãê ãã ãÜ ãÕ ãÎ ãÇ ãÀ 㹠㲠㫠㤠ã ã– ã ㈠ã ãz ãs ãl ãe ã^ ãW ãP ãI ãB ã; ã4 ã- ã& ã ã ã ã ã ãü ãõ ãî ãç ãà ãÙ ãÒ ãË ãÄ ã½ ã¶ ã¯ ã¨ ã¡ ãš ã“ ãŒ ã… ã~ ãw ãp ãi ãb ã[ ãT ãM ãF ã? ã8 ã1 ã* ã# ã ã ã ã ã ãù ãò ãë ãä ãÝ ãÖ ãÏ ãÈ ãÁ 㺠㳠㬠㥠㞠㗠ã ㉠゠ã{ ãt ãm ãf ã_ ãX ãQ ãJ ãC ã< ã5 ã. ã' ã ã ã ã ã ãý ãö ãï ãè ãá ãÚ ãÓ ãÌ ãŠ㾠㷠㰠㩠㢠㛠㔠ã ㆠã ãx ãq ãj ãc ã\ ãU ãN ãG ã@ ã9 ã2 ã+ ã$ ã ã ã ã ã ãú ãó ãì ãå ãÞ ã× ãÐ ãÉ ã ã» 㴠㭠㦠㟠㘠㑠㊠ムã| ãu ãn ãg ã` ãY ãR ãK ãD ã= ã6 ã/ ã( ã! ã ã ã ã ãþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿÿâøÿâñÿâêÿâãÿâÜÿâÕÿâÎÿâÇÿâÀÿâ¹ÿâ²ÿâ«ÿâ¤ÿâÿâ–ÿâÿâˆÿâÿâzÿâsÿâlÿâeÿâ^ÿâWÿâPÿâIÿâBÿâ;ÿâ4ÿâ-ÿâ&ÿâÿâÿâÿâ ÿâÿâüþâõþâîþâçþâàþâÙþâÒþâËþâÄþâ½þâ¶þâ¯þâ¨þâ¡þâšþâ“þâŒþâ…þâ~þâwþâpþâiþâbþâ[þâTþâMþâFþâ?þâ8þâ1þâ*þâ#þâþâþâþâþâþâùýâòýâëýâäýâÝýâÖýâÏýâÈýâÁýâºýâ³ýâ¬ýâ¥ýâžýâ—ýâýâ‰ýâ‚ýâ{ýâtýâmýâfýâ_ýâXýâQýâJýâCýâ<ýâ5ýâ.ýâ'ýâ ýâýâýâ ýâýâýüâöüâïüâèüâáüâÚüâÓüâÌüâÅüâ¾üâ·üâ°üâ©üâ¢üâ›üâ”üâüâ†üâüâxüâqüâjüâcüâ\üâUüâNüâGüâ@üâ9üâ2üâ+üâ$üâüâüâüâüâüâúûâóûâìûâåûâÞûâ×ûâÐûâÉûâÂûâ»ûâ´ûâ­ûâ¦ûâŸûâ˜ûâ‘ûâŠûâƒûâ|ûâuûânûâgûâ`ûâYûâRûâKûâDûâ=ûâ6ûâ/ûâ(ûâ!ûâûâûâ ûâûâþúâ÷úâðúâéúââúâÛúâÔúâÍúâÆúâ¿úâ¸úâ±úâªúâ£úâœúâ•úâŽúâ‡úâ€úâyúârúâkúâdúâ]úâVúâOúâHúâAúâ:úâ3úâ,úâ%úâúâúâúâ úâúâûùâôùâíùâæùâßùâØùâÑùâÊùâÃùâ¼ùâµùâ®ùâ§ùâ ùâ™ùâ’ùâ‹ùâ„ùâ}ùâvùâoùâhùâaùâZùâSùâLùâEùâ>ùâ7ùâ0ùâ)ùâ"ùâùâùâ ùâùâÿøâøøâñøâêøâãøâÜøâÕøâÎøâÇøâÀøâ¹øâ²øâ«øâ¤øâøâ–øâøâˆøâøâzøâsøâløâeøâ^øâWøâPøâIøâBøâ;øâ4øâ-øâ&øâøâøâøâ øâøâü÷âõ÷âî÷âç÷âà÷âÙ÷âÒ÷âË÷âÄ÷â½÷â¶÷â¯÷â¨÷â¡÷âš÷â“÷âŒ÷â…÷â~÷âw÷âp÷âi÷âb÷â[÷âT÷âM÷âF÷â?÷â8÷â1÷â*÷â#÷â÷â÷â÷â÷â÷âùöâòöâëöâäöâÝöâÖöâÏöâÈöâÁöâºöâ³öâ¬öâ¥öâžöâ—öâöâ‰öâ‚öâ{öâtöâmöâföâ_öâXöâQöâJöâCöâ<öâ5öâ.öâ'öâ öâöâöâ öâöâýõâöõâïõâèõâáõâÚõâÓõâÌõâÅõâ¾õâ·õâ°õâ©õâ¢õâ›õâ”õâõâ†õâõâxõâqõâjõâcõâ\õâUõâNõâGõâ@õâ9õâ2õâ+õâ$õâõâõâõâõâõâúôâóôâìôâåôâÞôâ×ôâÐôâÉôâÂôâ»ôâ´ôâ­ôâ¦ôâŸôâ˜ôâ‘ôâŠôâƒôâ|ôâuôânôâgôâ`ôâYôâRôâKôâDôâ=ôâ6ôâ/ôâ(ôâ!ôâôâôâ ôâôâþóâ÷óâðóâéóââóâÛóâÔóâÍóâÆóâ¿óâ¸óâ±óâªóâ£óâœóâ•óâŽóâ‡óâ€óâyóâróâkóâdóâ]óâVóâOóâHóâAóâ:óâ3óâ,óâ%óâóâóâóâ óâóâûòâôòâíòâæòâßòâØòâÑòâÊòâÃòâ¼òâµòâ®òâ§òâ òâ™òâ’òâ‹òâ„òâ}òâvòâoòâhòâaòâZòâSòâLòâEòâ>òâ7òâ0òâ)òâ"òâòâòâ òâòâÿñâøñâññâêñâãñâÜñâÕñâÎñâÇñâÀñâ¹ñâ²ñâ«ñâ¤ñâñâ–ñâñâˆñâñâzñâsñâlñâeñâ^ñâWñâPñâIñâBñâ;ñâ4ñâ-ñâ&ñâñâñâñâ ñâñâüðâõðâîðâçðâàðâÙðâÒðâËðâÄðâ½ðâ¶ðâ¯ðâ¨ðâ¡ðâšðâ“ðâŒðâ…ðâ~ðâwðâpðâiðâbðâ[ðâTðâMðâFðâ?ðâ8ðâ1ðâ*ðâ#ðâðâðâðâðâðâùïâòïâëïâäïâÝïâÖïâÏïâÈïâÁïâºïâ³ïâ¬ïâ¥ïâžïâ—ïâïâ‰ïâ‚ïâ{ïâtïâmïâfïâ_ïâXïâQïâJïâCïâ<ïâ5ïâ.ïâ'ïâ ïâïâïâ ïâïâýîâöîâïîâèîâáîâÚîâÓîâÌîâÅîâ¾îâ·îâ°îâ©îâ¢îâ›îâ”îâîâ†îâîâxîâqîâjîâcîâ\îâUîâNîâGîâ@îâ9îâ2îâ+îâ$îâîâîâîâîâîâúíâóíâìíâåíâÞíâ×íâÐíâÉíâÂíâ»íâ´íâ­íâ¦íâŸíâ˜íâ‘íâŠíâƒíâ|íâuíâníâgíâ`íâYíâRíâKíâDíâ=íâ6íâ/íâ(íâ!íâíâíâ íâíâþìâ÷ìâðìâéìââìâÛìâÔìâÍìâÆìâ¿ìâ¸ìâ±ìâªìâ£ìâœìâ•ìâŽìâ‡ìâ€ìâyìârìâkìâdìâ]ìâVìâOìâHìâAìâ:ìâ3ìâ,ìâ%ìâìâìâìâ ìâìâûëâôëâíëâæëâßëâØëâÑëâÊëâÃëâ¼ëâµëâ®ëâ§ëâ ëâ™ëâ’ëâ‹ëâ„ëâ}ëâvëâoëâhëâaëâZëâSëâLëâEëâ>ëâ7ëâ0ëâ)ëâ"ëâëâëâ ëâëâÿêâøêâñêâêêâãêâÜêâÕêâÎêâÇêâÀêâ¹êâ²êâ«êâ¤êâêâ–êâêâˆêâêâzêâsêâlêâeêâ^êâWêâPêâIêâBêâ;êâ4êâ-êâ&êâêâêâêâ êâêâüéâõéâîéâçéâàéâÙéâÒéâËéâÄéâ½éâ¶éâ¯éâ¨éâ¡éâšéâ“éâŒéâ…éâ~éâwéâpéâiéâbéâ[éâTéâMéâFéâ?éâ8éâ1éâ*éâ#éâéâéâéâéâéâùèâòèâëèâäèâÝèâÖèâÏèâÈèâÁèâºèâ³èâ¬èâ¥èâžèâ—èâèâ‰èâ‚èâ{èâtèâmèâfèâ_èâXèâQèâJèâCèâ<èâ5èâ.èâ'èâ èâèâèâ èâèâýçâöçâïçâèçâáçâÚçâÓçâÌçâÅçâ¾çâ·çâ°çâ©çâ¢çâ›çâ”çâçâ†çâçâxçâqçâjçâcçâ\çâUçâNçâGçâ@çâ9çâ2çâ+çâ$çâçâçâçâçâçâúæâóæâìæâåæâÞæâ׿âÐæâÉæâÂæâ»æâ´æâ­æâ¦æâŸæâ˜æâ‘æâŠæâƒæâ|æâuæânæâgæâ`æâYæâRæâKæâDæâ=æâ6æâ/æâ(æâ!æâæâæâ æâæâþåâ÷åâðåâéåââåâÛåâÔåâÍåâÆåâ¿åâ¸åâ±åâªåâ£åâœåâ•åâŽåâ‡åâ€åâyåâråâkåâdåâ]åâVåâOåâHåâAåâ:åâ3åâ,åâ%åâåâåâåâ åâåâûäâôäâíäâæäâßäâØäâÑäâÊäâÃäâ¼äâµäâ®äâ§äâ äâ™äâ’äâ‹äâ„äâ}äâväâoäâhäâaäâZäâSäâLäâEäâ>äâ7äâ0äâ)äâ"äâäâäâ äâäâÿãâøãâñãâêãâããâÜãâÕãâÎãâÇãâÀãâ¹ãâ²ãâ«ãâ¤ãâãâ–ãâãâˆãâãâzãâsãâlãâeãâ^ãâWãâPãâIãâBãâ;ãâ4ãâ-ãâ&ãâãâãâãâ ãâãâüââõââîââçââàââÙââÒââËââÄââ½ââ¶ââ¯ââ¨ââ¡ââšââ“ââŒââ…ââ~ââwââpââiââbââ[ââTââMââFââ?ââ8ââ1ââ*ââ#ââââââââââââùáâòáâëáâäáâÝáâÖáâÏáâÈáâÁáâºáâ³áâ¬áâ¥áâžáâ—áâáâ‰áâ‚áâ{áâtáâmáâfáâ_áâXáâQáâJáâCáâ<áâ5áâ.áâ'áâ áâáâáâ áâáâýàâöàâïàâèàâáàâÚàâÓàâÌàâÅàâ¾àâ·àâ°àâ©àâ¢àâ›àâ”àâàâ†àâàâxàâqàâjàâcàâ\àâUàâNàâGàâ@àâ9àâ2àâ+àâ$àâàâàâàâàâàâúßâóßâìßâåßâÞßâ×ßâÐßâÉßâÂßâ»ßâ´ßâ­ßâ¦ßâŸßâ˜ßâ‘ßâŠßâƒßâ|ßâußânßâgßâ`ßâYßâRßâKßâDßâ=ßâ6ßâ/ßâ(ßâ!ßâßâßâ ßâßâþÞâ÷ÞâðÞâéÞââÞâÛÞâÔÞâÍÞâÆÞâ¿Þâ¸Þâ±ÞâªÞâ£ÞâœÞâ•ÞâŽÞâ‡Þâ€ÞâyÞârÞâkÞâdÞâ]ÞâVÞâOÞâHÞâAÞâ:Þâ3Þâ,Þâ%ÞâÞâÞâÞâ ÞâÞâûÝâôÝâíÝâæÝâßÝâØÝâÑÝâÊÝâÃÝâ¼ÝâµÝâ®Ýâ§Ýâ Ýâ™Ýâ’Ýâ‹Ýâ„Ýâ}ÝâvÝâoÝâhÝâaÝâZÝâSÝâLÝâEÝâ>Ýâ7Ýâ0Ýâ)Ýâ"ÝâÝâÝâ ÝâÝâÿÜâøÜâñÜâêÜâãÜâÜÜâÕÜâÎÜâÇÜâÀÜâ¹Üâ²Üâ«Üâ¤ÜâÜâ–ÜâÜâˆÜâÜâzÜâsÜâlÜâeÜâ^ÜâWÜâPÜâIÜâBÜâ;Üâ4Üâ-Üâ&ÜâÜâÜâÜâ ÜâÜâüÛâõÛâîÛâçÛâàÛâÙÛâÒÛâËÛâÄÛâ½Ûâ¶Ûâ¯Ûâ¨Ûâ¡ÛâšÛâ“ÛâŒÛâ…Ûâ~ÛâwÛâpÛâiÛâbÛâ[ÛâTÛâMÛâFÛâ?Ûâ8Ûâ1Ûâ*Ûâ#ÛâÛâÛâÛâÛâÛâùÚâòÚâëÚâäÚâÝÚâÖÚâÏÚâÈÚâÁÚâºÚâ³Úâ¬Úâ¥ÚâžÚâ—ÚâÚâ‰Úâ‚Úâ{ÚâtÚâmÚâfÚâ_ÚâXÚâQÚâJÚâCÚâ<Úâ5Úâ.Úâ'Úâ ÚâÚâÚâ ÚâÚâýÙâöÙâïÙâèÙâáÙâÚÙâÓÙâÌÙâÅÙâ¾Ùâ·Ùâ°Ùâ©Ùâ¢Ùâ›Ùâ”ÙâÙâ†ÙâÙâxÙâqÙâjÙâcÙâ\ÙâUÙâNÙâGÙâ@Ùâ9Ùâ2Ùâ+Ùâ$ÙâÙâÙâÙâÙâÙâúØâóØâìØâåØâÞØâרâÐØâÉØâÂØâ»Øâ´Øâ­Øâ¦ØâŸØâ˜Øâ‘ØâŠØâƒØâ|ØâuØânØâgØâ`ØâYØâRØâKØâDØâ=Øâ6Øâ/Øâ(Øâ!ØâØâØâ ØâØâþ×â÷×âð×âé×ââ×âÛ×âÔ×âÍ×âÆ×â¿×â¸×â±×âª×â£×âœ×â•×âŽ×â‡×â€×ây×âr×âk×âd×â]×âV×âO×âH×âA×â:×â3×â,×â%×â×â×â×â ×â×âûÖâôÖâíÖâæÖâßÖâØÖâÑÖâÊÖâÃÖâ¼ÖâµÖâ®Öâ§Öâ Öâ™Öâ’Öâ‹Öâ„Öâ}ÖâvÖâoÖâhÖâaÖâZÖâSÖâLÖâEÖâ>Öâ7Öâ0Öâ)Öâ"ÖâÖâÖâ ÖâÖâÿÕâøÕâñÕâêÕâãÕâÜÕâÕÕâÎÕâÇÕâÀÕâ¹Õâ²Õâ«Õâ¤ÕâÕâ–ÕâÕâˆÕâÕâzÕâsÕâlÕâeÕâ^ÕâWÕâPÕâIÕâBÕâ;Õâ4Õâ-Õâ&ÕâÕâÕâÕâ ÕâÕâüÔâõÔâîÔâçÔâàÔâÙÔâÒÔâËÔâÄÔâ½Ôâ¶Ôâ¯Ôâ¨Ôâ¡ÔâšÔâ“ÔâŒÔâ…Ôâ~ÔâwÔâpÔâiÔâbÔâ[ÔâTÔâMÔâFÔâ?Ôâ8Ôâ1Ôâ*Ôâ#ÔâÔâÔâÔâÔâÔâùÓâòÓâëÓâäÓâÝÓâÖÓâÏÓâÈÓâÁÓâºÓâ³Óâ¬Óâ¥ÓâžÓâ—ÓâÓâ‰Óâ‚Óâ{ÓâtÓâmÓâfÓâ_ÓâXÓâQÓâJÓâCÓâ<Óâ5Óâ.Óâ'Óâ ÓâÓâÓâ ÓâÓâýÒâöÒâïÒâèÒâáÒâÚÒâÓÒâÌÒâÅÒâ¾Òâ·Òâ°Òâ©Òâ¢Òâ›Òâ”ÒâÒâ†ÒâÒâxÒâqÒâjÒâcÒâ\ÒâUÒâNÒâGÒâ@Òâ9Òâ2Òâ+Òâ$ÒâÒâÒâÒâÒâÒâúÑâóÑâìÑâåÑâÞÑâ×ÑâÐÑâÉÑâÂÑâ»Ñâ´Ñâ­Ñâ¦ÑâŸÑâ˜Ñâ‘ÑâŠÑâƒÑâ|ÑâuÑânÑâgÑâ`ÑâYÑâRÑâKÑâDÑâ=Ñâ6Ñâ/Ñâ(Ñâ!ÑâÑâÑâ ÑâÑâþÐâ÷ÐâðÐâéÐââÐâÛÐâÔÐâÍÐâÆÐâ¿Ðâ¸Ðâ±ÐâªÐâ£ÐâœÐâ•ÐâŽÐâ‡Ðâ€ÐâyÐârÐâkÐâdÐâ]ÐâVÐâOÐâHÐâAÐâ:Ðâ3Ðâ,Ðâ%ÐâÐâÐâÐâ ÐâÐâûÏâôÏâíÏâæÏâßÏâØÏâÑÏâÊÏâÃÏâ¼ÏâµÏâ®Ïâ§Ïâ Ïâ™Ïâ’Ïâ‹Ïâ„Ïâ}ÏâvÏâoÏâhÏâaÏâZÏâSÏâLÏâEÏâ>Ïâ7Ïâ0Ïâ)Ïâ"ÏâÏâÏâ ÏâÏâÿÎâøÎâñÎâêÎâãÎâÜÎâÕÎâÎÎâÇÎâÀÎâ¹Îâ²Îâ«Îâ¤ÎâÎâ–ÎâÎâˆÎâÎâzÎâsÎâlÎâeÎâ^ÎâWÎâPÎâIÎâBÎâ;Îâ4Îâ-Îâ&ÎâÎâÎâÎâ ÎâÎâüÍâõÍâîÍâçÍâàÍâÙÍâÒÍâËÍâÄÍâ½Íâ¶Íâ¯Íâ¨Íâ¡ÍâšÍâ“ÍâŒÍâ…Íâ~ÍâwÍâpÍâiÍâbÍâ[ÍâTÍâMÍâFÍâ?Íâ8Íâ1Íâ*Íâ#ÍâÍâÍâÍâÍâÍâùÌâòÌâëÌâäÌâÝÌâÖÌâÏÌâÈÌâÁÌâºÌâ³Ìâ¬Ìâ¥ÌâžÌâ—ÌâÌâ‰Ìâ‚Ìâ{ÌâtÌâmÌâfÌâ_ÌâXÌâQÌâJÌâCÌâ<Ìâ5Ìâ.Ìâ'Ìâ ÌâÌâÌâ ÌâÌâýËâöËâïËâèËâáËâÚËâÓËâÌËâÅËâ¾Ëâ·Ëâ°Ëâ©Ëâ¢Ëâ›Ëâ”ËâËâ†ËâËâxËâqËâjËâcËâ\ËâUËâNËâGËâ@Ëâ9Ëâ2Ëâ+Ëâ$ËâËâËâËâËâËâúÊâóÊâìÊâåÊâÞÊâ×ÊâÐÊâÉÊâÂÊâ»Êâ´Êâ­Êâ¦ÊâŸÊâ˜Êâ‘ÊâŠÊâƒÊâ|ÊâuÊânÊâgÊâ`ÊâYÊâRÊâKÊâDÊâ=Êâ6Êâ/Êâ(Êâ!ÊâÊâÊâ ÊâÊâþÉâ÷ÉâðÉâéÉââÉâÛÉâÔÉâÍÉâÆÉâ¿Éâ¸Éâ±ÉâªÉâ£ÉâœÉâ•ÉâŽÉâ‡Éâ€ÉâyÉârÉâkÉâdÉâ]ÉâVÉâOÉâHÉâAÉâ:Éâ3Éâ,Éâ%ÉâÉâÉâÉâ ÉâÉâûÈâôÈâíÈâæÈâßÈâØÈâÑÈâÊÈâÃÈâ¼ÈâµÈâ®Èâ§Èâ Èâ™Èâ’Èâ‹Èâ„Èâ}ÈâvÈâoÈâhÈâaÈâZÈâSÈâLÈâEÈâ>Èâ7Èâ0Èâ)Èâ"ÈâÈâÈâ ÈâÈâÿÇâøÇâñÇâêÇâãÇâÜÇâÕÇâÎÇâÇÇâÀÇâ¹Çâ²Çâ«Çâ¤ÇâÇâ–ÇâÇâˆÇâÇâzÇâsÇâlÇâeÇâ^ÇâWÇâPÇâIÇâBÇâ;Çâ4Çâ-Çâ&ÇâÇâÇâÇâ ÇâÇâüÆâõÆâîÆâçÆâàÆâÙÆâÒÆâËÆâÄÆâ½Æâ¶Æâ¯Æâ¨Æâ¡ÆâšÆâ“ÆâŒÆâ…Æâ~ÆâwÆâpÆâiÆâbÆâ[ÆâTÆâMÆâFÆâ?Æâ8Æâ1Æâ*Æâ#ÆâÆâÆâÆâÆâÆâùÅâòÅâëÅâäÅâÝÅâÖÅâÏÅâÈÅâÁÅâºÅâ³Åâ¬Åâ¥ÅâžÅâ—ÅâÅâ‰Åâ‚Åâ{ÅâtÅâmÅâfÅâ_ÅâXÅâQÅâJÅâCÅâ<Åâ5Åâ.Åâ'Åâ ÅâÅâÅâ ÅâÅâýÄâöÄâïÄâèÄâáÄâÚÄâÓÄâÌÄâÅÄâ¾Äâ·Äâ°Äâ©Äâ¢Äâ›Äâ”ÄâÄâ†ÄâÄâxÄâqÄâjÄâcÄâ\ÄâUÄâNÄâGÄâ@Äâ9Äâ2Äâ+Äâ$ÄâÄâÄâÄâÄâÄâúÃâóÃâìÃâåÃâÞÃâ×ÃâÐÃâÉÃâÂÃâ»Ãâ´Ãâ­Ãâ¦ÃâŸÃâ˜Ãâ‘ÃâŠÃâƒÃâ|ÃâuÃânÃâgÃâ`ÃâYÃâRÃâKÃâDÃâ=Ãâ6Ãâ/Ãâ(Ãâ!ÃâÃâÃâ ÃâÃâþÂâ÷ÂâðÂâéÂââÂâÛÂâÔÂâÍÂâÆÂâ¿Ââ¸Ââ±ÂâªÂâ£ÂâœÂâ•ÂâŽÂâ‡Ââ€ÂâyÂârÂâkÂâdÂâ]ÂâVÂâOÂâHÂâAÂâ:Ââ3Ââ,Ââ%ÂâÂâÂâÂâ ÂâÂâûÁâôÁâíÁâæÁâßÁâØÁâÑÁâÊÁâÃÁâ¼ÁâµÁâ®Áâ§Áâ Áâ™Áâ’Áâ‹Áâ„Áâ}ÁâvÁâoÁâhÁâaÁâZÁâSÁâLÁâEÁâ>Áâ7Áâ0Áâ)Áâ"ÁâÁâÁâ ÁâÁâÿÀâøÀâñÀâêÀâãÀâÜÀâÕÀâÎÀâÇÀâÀÀâ¹Àâ²Àâ«Àâ¤ÀâÀâ–ÀâÀâˆÀâÀâzÀâsÀâlÀâeÀâ^ÀâWÀâPÀâIÀâBÀâ;Àâ4Àâ-Àâ&ÀâÀâÀâÀâ ÀâÀâü¿âõ¿âî¿âç¿âà¿âÙ¿âÒ¿âË¿âĿ⽿⶿⯿⨿⡿⚿⓿⌿ⅿâ~¿âw¿âp¿âi¿âb¿â[¿âT¿âM¿âF¿â?¿â8¿â1¿â*¿â#¿â¿â¿â¿â¿â¿âù¾âò¾âë¾âä¾âݾâÖ¾âϾâȾâÁ¾âº¾â³¾â¬¾â¥¾âž¾â—¾â¾â‰¾â‚¾â{¾ât¾âm¾âf¾â_¾âX¾âQ¾âJ¾âC¾â<¾â5¾â.¾â'¾â ¾â¾â¾â ¾â¾âý½âö½âï½âè½âá½âÚ½âÓ½â̽âŽâ¾½â·½â°½â©½â¢½â›½â”½â½â†½â½âx½âq½âj½âc½â\½âU½âN½âG½â@½â9½â2½â+½â$½â½â½â½â½â½âú¼âó¼âì¼âå¼âÞ¼â×¼âмâɼâ¼â»¼â´¼â­¼â¦¼âŸ¼â˜¼â‘¼âм⃼â|¼âu¼ân¼âg¼â`¼âY¼âR¼âK¼âD¼â=¼â6¼â/¼â(¼â!¼â¼â¼â ¼â¼âþ»â÷»âð»âé»ââ»âÛ»âÔ»âÍ»âÆ»â¿»â¸»â±»âª»â£»âœ»â•»âŽ»â‡»â€»ây»âr»âk»âd»â]»âV»âO»âH»âA»â:»â3»â,»â%»â»â»â»â »â»âûºâôºâíºâæºâߺâغâѺâʺâú⼺⵺⮺⧺⠺♺Ⓔ⋺℺â}ºâvºâoºâhºâaºâZºâSºâLºâEºâ>ºâ7ºâ0ºâ)ºâ"ºâºâºâ ºâºâÿ¹âø¹âñ¹âê¹âã¹âܹâÕ¹âιâǹâÀ¹â¹¹â²¹â«¹â¤¹â¹â–¹â¹âˆ¹â¹âz¹âs¹âl¹âe¹â^¹âW¹âP¹âI¹âB¹â;¹â4¹â-¹â&¹â¹â¹â¹â ¹â¹âü¸âõ¸âî¸âç¸âà¸âÙ¸âÒ¸â˸âĸ⽸ⶸ⯸⨸⡸⚸⓸⌸ⅸâ~¸âw¸âp¸âi¸âb¸â[¸âT¸âM¸âF¸â?¸â8¸â1¸â*¸â#¸â¸â¸â¸â¸â¸âù·âò·âë·âä·âÝ·âÖ·âÏ·âÈ·âÁ·âº·â³·â¬·â¥·âž·â—·â·â‰·â‚·â{·ât·âm·âf·â_·âX·âQ·âJ·âC·â<·â5·â.·â'·â ·â·â·â ·â·âý¶âö¶âï¶âè¶âá¶âÚ¶âÓ¶â̶âŶ⾶ⷶⰶ⩶⢶⛶┶â¶â†¶â¶âx¶âq¶âj¶âc¶â\¶âU¶âN¶âG¶â@¶â9¶â2¶â+¶â$¶â¶â¶â¶â¶â¶âúµâóµâìµâåµâÞµâ×µâеâɵâµâ»µâ´µâ­µâ¦µâŸµâ˜µâ‘µâе⃵â|µâuµânµâgµâ`µâYµâRµâKµâDµâ=µâ6µâ/µâ(µâ!µâµâµâ µâµâþ´â÷´âð´âé´ââ´âÛ´âÔ´âÍ´âÆ´â¿´â¸´â±´âª´â£´âœ´â•´âŽ´â‡´â€´ây´âr´âk´âd´â]´âV´âO´âH´âA´â:´â3´â,´â%´â´â´â´â ´â´âû³âô³âí³âæ³âß³âسâѳâʳâó⼳⵳⮳⧳⠳♳⒳⋳ℳâ}³âv³âo³âh³âa³âZ³âS³âL³âE³â>³â7³â0³â)³â"³â³â³â ³â³âÿ²âø²âñ²âê²âã²âܲâÕ²âβâDzâÀ²â¹²â²²â«²â¤²â²â–²â²âˆ²â²âz²âs²âl²âe²â^²âW²âP²âI²âB²â;²â4²â-²â&²â²â²â²â ²â²âü±âõ±âî±âç±âà±âÙ±âÒ±â˱âı⽱ⶱ⯱⨱⡱⚱⓱⌱ⅱâ~±âw±âp±âi±âb±â[±âT±âM±âF±â?±â8±â1±â*±â#±â±â±â±â±â±âù°âò°âë°âä°âݰâÖ°âϰâȰâÁ°âº°â³°â¬°â¥°âž°â—°â°â‰°â‚°â{°ât°âm°âf°â_°âX°âQ°âJ°âC°â<°â5°â.°â'°â °â°â°â °â°âý¯âö¯âï¯âè¯âá¯âÚ¯âÓ¯â̯âů⾯ⷯⰯ⩯⢯⛯┯â¯â†¯â¯âx¯âq¯âj¯âc¯â\¯âU¯âN¯âG¯â@¯â9¯â2¯â+¯â$¯â¯â¯â¯â¯â¯âú®âó®âì®âå®âÞ®â×®âЮâÉ®â®â»®â´®â­®â¦®âŸ®â˜®â‘®âŠ®âƒ®â|®âu®ân®âg®â`®âY®âR®âK®âD®â=®â6®â/®â(®â!®â®â®â ®â®âþ­â÷­âð­âé­ââ­âÛ­âÔ­âÍ­âÆ­â¿­â¸­â±­âª­â£­âœ­â•­âŽ­â‡­â€­ây­âr­âk­âd­â]­âV­âO­âH­âA­â:­â3­â,­â%­â­â­â­â ­â­âû¬âô¬âí¬âæ¬â߬âجâѬâʬâì⼬⵬⮬⧬⠬♬⒬⋬ℬâ}¬âv¬âo¬âh¬âa¬âZ¬âS¬âL¬âE¬â>¬â7¬â0¬â)¬â"¬â¬â¬â ¬â¬âÿ«âø«âñ«âê«âã«âÜ«âÕ«âΫâÇ«âÀ«â¹«â²«â««â¤«â«â–«â«âˆ«â«âz«âs«âl«âe«â^«âW«âP«âI«âB«â;«â4«â-«â&«â«â«â«â «â«âüªâõªâîªâçªâàªâÙªâÒªâ˪âĪ⽪ⶪ⯪⨪⡪⚪⓪〉Ⅺâ~ªâwªâpªâiªâbªâ[ªâTªâMªâFªâ?ªâ8ªâ1ªâ*ªâ#ªâªâªâªâªâªâù©âò©âë©âä©âÝ©âÖ©âÏ©âÈ©âÁ©âº©â³©â¬©â¥©âž©â—©â©â‰©â‚©â{©ât©âm©âf©â_©âX©âQ©âJ©âC©â<©â5©â.©â'©â ©â©â©â ©â©âý¨âö¨âï¨âè¨âá¨âÚ¨âÓ¨ą̂âŨ⾨ⷨⰨ⩨⢨⛨┨â¨â†¨â¨âx¨âq¨âj¨âc¨â\¨âU¨âN¨âG¨â@¨â9¨â2¨â+¨â$¨â¨â¨â¨â¨â¨âú§âó§âì§âå§âÞ§â×§âЧâɧâ§â»§â´§â­§â¦§âŸ§â˜§â‘§âЧ⃧â|§âu§ân§âg§â`§âY§âR§âK§âD§â=§â6§â/§â(§â!§â§â§â §â§âþ¦â÷¦âð¦âé¦ââ¦âÛ¦âÔ¦âͦâƦ⿦⸦ⱦ⪦⣦✦╦âަ⇦…ây¦âr¦âk¦âd¦â]¦âV¦âO¦âH¦âA¦â:¦â3¦â,¦â%¦â¦â¦â¦â ¦â¦âû¥âô¥âí¥âæ¥âߥâØ¥âÑ¥âÊ¥âå⼥ⵥ⮥⧥⠥♥⒥⋥℥â}¥âv¥âo¥âh¥âa¥âZ¥âS¥âL¥âE¥â>¥â7¥â0¥â)¥â"¥â¥â¥â ¥â¥âÿ¤âø¤âñ¤âê¤âã¤âܤâÕ¤âΤâǤâÀ¤â¹¤â²¤â«¤â¤¤â¤â–¤â¤âˆ¤â¤âz¤âs¤âl¤âe¤â^¤âW¤âP¤âI¤âB¤â;¤â4¤â-¤â&¤â¤â¤â¤â ¤â¤âü£âõ£âî£âç£âà£âÙ£âÒ£âË£âģ⽣ⶣ⯣⨣⡣⚣ⓣ⌣Ⅳâ~£âw£âp£âi£âb£â[£âT£âM£âF£â?£â8£â1£â*£â#£â£â£â£â£â£âù¢âò¢âë¢âä¢âÝ¢âÖ¢âÏ¢âÈ¢âÁ¢âº¢â³¢â¬¢â¥¢âž¢â—¢â¢â‰¢â‚¢â{¢ât¢âm¢âf¢â_¢âX¢âQ¢âJ¢âC¢â<¢â5¢â.¢â'¢â ¢â¢â¢â ¢â¢âý¡âö¡âï¡âè¡âá¡âÚ¡âÓ¡âÌ¡âš⾡ⷡⰡ⩡⢡⛡┡â¡â†¡â¡âx¡âq¡âj¡âc¡â\¡âU¡âN¡âG¡â@¡â9¡â2¡â+¡â$¡â¡â¡â¡â¡â¡âú âó âì âå âÞ â× âРâÉ â â» â´ â­ â¦ âŸ â˜ â‘ âŠ âƒ â| âu ân âg â` âY âR âK âD â= â6 â/ â( â! â â â  â âþŸâ÷ŸâðŸâéŸââŸâÛŸâÔŸâÍŸâÆŸâ¿Ÿâ¸Ÿâ±ŸâªŸâ£ŸâœŸâ•ŸâŽŸâ‡Ÿâ€ŸâyŸârŸâkŸâdŸâ]ŸâVŸâOŸâHŸâAŸâ:Ÿâ3Ÿâ,Ÿâ%ŸâŸâŸâŸâ ŸâŸâûžâôžâížâæžâßžâØžâÑžâÊžâÞ⼞ⵞ⮞⧞⠞♞⒞⋞℞â}žâvžâožâhžâažâZžâSžâLžâEžâ>žâ7žâ0žâ)žâ"žâžâžâ žâžâÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüœâõœâîœâçœâàœâÙœâÒœâËœâĜ⽜⶜⯜⨜⡜⚜ⓜ⌜⅜â~œâwœâpœâiœâbœâ[œâTœâMœâFœâ?œâ8œâ1œâ*œâ#œâœâœâœâœâœâù›âò›âë›âä›âÝ›âÖ›âÏ›âÈ›âÁ›âº›â³›â¬›â¥›âž›â—›â›â‰›â‚›â{›ât›âm›âf›â_›âX›âQ›âJ›âC›â<›â5›â.›â'›â ›â›â›â ›â›âýšâöšâïšâèšâášâÚšâÓšâÌšâŚ⾚ⷚⰚ⩚⢚⛚┚âšâ†šâšâxšâqšâjšâcšâ\šâUšâNšâGšâ@šâ9šâ2šâ+šâ$šâšâšâšâšâšâú™âó™âì™âå™âÞ™â×™âЙâÉ™â™â»™â´™â­™â¦™âŸ™â˜™â‘™âŠ™âƒ™â|™âu™ân™âg™â`™âY™âR™âK™âD™â=™â6™â/™â(™â!™â™â™â ™â™âþ˜â÷˜âð˜âé˜ââ˜âÛ˜âÔ˜â͘âƘ⿘⸘ⱘ⪘⣘✘╘⎘⇘‘ây˜âr˜âk˜âd˜â]˜âV˜âO˜âH˜âA˜â:˜â3˜â,˜â%˜â˜â˜â˜â ˜â˜âû—âô—âí—âæ—âß—âØ—âÑ—âÊ—â×â¼—âµ—â®—â§—â —â™—â’—â‹—â„—â}—âv—âo—âh—âa—âZ—âS—âL—âE—â>—â7—â0—â)—â"—â—â—â —â—âÿ–âø–âñ–âê–âã–âÜ–âÕ–âΖâÇ–âÀ–⹖Ⲗ⫖⤖â–â––â–∖â–âz–âs–âl–âe–â^–âW–âP–âI–âB–â;–â4–â-–â&–â–â–â–â –â–âü•âõ•âî•âç•âà•âÙ•âÒ•âË•âĕ⽕ⶕ⯕⨕⡕⚕ⓕ⌕⅕â~•âw•âp•âi•âb•â[•âT•âM•âF•â?•â8•â1•â*•â#•â•â•â•â•â•âù”âò”âë”âä”âÝ”âÖ”âÏ”âÈ”âÁ”⺔Ⳕ⬔⥔➔◔â”≔ₔâ{”ât”âm”âf”â_”âX”âQ”âJ”âC”â<”â5”â.”â'”â ”â”â”â ”â”âý“âö“âï“âè“âá“âÚ“âÓ“âÌ“âœ⾓ⷓⰓ⩓⢓⛓┓â“↓â“âx“âq“âj“âc“â\“âU“âN“âG“â@“â9“â2“â+“â$“â“â“â“â“â“âú’âó’âì’âå’âÞ’â×’âÐ’âÉ’â’⻒ⴒ⭒⦒⟒☒⑒⊒⃒â|’âu’ân’âg’â`’âY’âR’âK’âD’â=’â6’â/’â(’â!’â’â’â ’â’âþ‘â÷‘âð‘âé‘ââ‘âÛ‘âÔ‘âÍ‘âÆ‘â¿‘â¸‘â±‘âª‘â£‘âœ‘â•‘âŽ‘â‡‘â€‘ây‘âr‘âk‘âd‘â]‘âV‘âO‘âH‘âA‘â:‘â3‘â,‘â%‘â‘â‘â‘â ‘â‘âûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüŽâõŽâîŽâçŽâàŽâÙŽâÒŽâËŽâĎ⽎ⶎ⯎⨎⡎⚎Ⓨ⌎ⅎâ~ŽâwŽâpŽâiŽâbŽâ[ŽâTŽâMŽâFŽâ?Žâ8Žâ1Žâ*Žâ#ŽâŽâŽâŽâŽâŽâùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýŒâöŒâïŒâèŒâáŒâÚŒâÓŒâÌŒâŌ⾌ⷌⰌ⩌⢌⛌┌âŒâ†ŒâŒâxŒâqŒâjŒâcŒâ\ŒâUŒâNŒâGŒâ@Œâ9Œâ2Œâ+Œâ$ŒâŒâŒâŒâŒâŒâú‹âó‹âì‹âå‹âÞ‹â׋âЋâÉ‹â‹â»‹â´‹â­‹â¦‹âŸ‹â˜‹â‘‹âŠ‹âƒ‹â|‹âu‹ân‹âg‹â`‹âY‹âR‹âK‹âD‹â=‹â6‹â/‹â(‹â!‹â‹â‹â ‹â‹âþŠâ÷ŠâðŠâéŠââŠâÛŠâÔŠâÍŠâÆŠâ¿Šâ¸Šâ±ŠâªŠâ£ŠâœŠâ•ŠâŽŠâ‡Šâ€ŠâyŠârŠâkŠâdŠâ]ŠâVŠâOŠâHŠâAŠâ:Šâ3Šâ,Šâ%ŠâŠâŠâŠâ ŠâŠâû‰âô‰âí‰âæ‰â߉â؉âщâʉâÉ⼉ⵉ⮉⧉⠉♉⒉⋉℉â}‰âv‰âo‰âh‰âa‰âZ‰âS‰âL‰âE‰â>‰â7‰â0‰â)‰â"‰â‰â‰â ‰â‰âÿˆâøˆâñˆâêˆâãˆâ܈âÕˆâΈâLjâÀˆâ¹ˆâ²ˆâ«ˆâ¤ˆâˆâ–ˆâˆâˆˆâˆâzˆâsˆâlˆâeˆâ^ˆâWˆâPˆâIˆâBˆâ;ˆâ4ˆâ-ˆâ&ˆâˆâˆâˆâ ˆâˆâü‡âõ‡âî‡âç‡âà‡âÙ‡âÒ‡âˇâć⽇ⶇ⯇⨇⡇⚇Ⓡ⌇ⅇâ~‡âw‡âp‡âi‡âb‡â[‡âT‡âM‡âF‡â?‡â8‡â1‡â*‡â#‡â‡â‡â‡â‡â‡âù†âò†âë†âä†â݆âÖ†âφâȆâÁ†âº†â³†â¬†â¥†âž†â—†â†â‰†â‚†â{†ât†âm†âf†â_†âX†âQ†âJ†âC†â<†â5†â.†â'†â †â†â†â †â†âý…âö…âï…âè…âá…âÚ…âÓ…âÌ…âŅ⾅ⷅⰅ⩅⢅⛅┅â…ↅâ…âx…âq…âj…âc…â\…âU…âN…âG…â@…â9…â2…â+…â$…â…â…â…â…â…âú„âó„âì„âå„âÞ„âׄâЄâÉ„â„⻄ⴄ⭄⦄⟄☄⑄⊄⃄â|„âu„ân„âg„â`„âY„âR„âK„âD„â=„â6„â/„â(„â!„â„â„â „â„âþƒâ÷ƒâðƒâéƒââƒâÛƒâÔƒâ̓âƃ⿃⸃ⱃ⪃⣃✃╃⎃⇃ âyƒârƒâkƒâdƒâ]ƒâVƒâOƒâHƒâAƒâ:ƒâ3ƒâ,ƒâ%ƒâƒâƒâƒâ ƒâƒâû‚âô‚âí‚âæ‚âß‚âØ‚âÑ‚âÊ‚âÂ⼂ⵂ⮂⧂⠂♂⒂⋂ℂâ}‚âv‚âo‚âh‚âa‚âZ‚âS‚âL‚âE‚â>‚â7‚â0‚â)‚â"‚â‚â‚â ‚â‚âÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââü€âõ€âî€âç€âà€âÙ€âÒ€âË€âĀ⽀ⶀ⯀⨀⡀⚀Ⓚ⌀⅀â~€âw€âp€âi€âb€â[€âT€âM€âF€â?€â8€â1€â*€â#€â€â€â€â€â€âùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââý~âö~âï~âè~âá~âÚ~âÓ~âÌ~âÅ~â¾~â·~â°~â©~â¢~â›~â”~â~â†~â~âx~âq~âj~âc~â\~âU~âN~âG~â@~â9~â2~â+~â$~â~â~â~â~â~âú}âó}âì}âå}âÞ}â×}âÐ}âÉ}âÂ}â»}â´}â­}â¦}âŸ}â˜}â‘}âŠ}âƒ}â|}âu}ân}âg}â`}âY}âR}âK}âD}â=}â6}â/}â(}â!}â}â}â }â}âþ|â÷|âð|âé|ââ|âÛ|âÔ|âÍ|âÆ|â¿|â¸|â±|âª|â£|âœ|â•|âŽ|â‡|â€|ây|âr|âk|âd|â]|âV|âO|âH|âA|â:|â3|â,|â%|â|â|â|â |â|âû{âô{âí{âæ{âß{âØ{âÑ{âÊ{âÃ{â¼{âµ{â®{â§{â {â™{â’{â‹{â„{â}{âv{âo{âh{âa{âZ{âS{âL{âE{â>{â7{â0{â){â"{â{â{â {â{âÿzâøzâñzâêzâãzâÜzâÕzâÎzâÇzâÀzâ¹zâ²zâ«zâ¤zâzâ–zâzâˆzâzâzzâszâlzâezâ^zâWzâPzâIzâBzâ;zâ4zâ-zâ&zâzâzâzâ zâzâüyâõyâîyâçyâàyâÙyâÒyâËyâÄyâ½yâ¶yâ¯yâ¨yâ¡yâšyâ“yâŒyâ…yâ~yâwyâpyâiyâbyâ[yâTyâMyâFyâ?yâ8yâ1yâ*yâ#yâyâyâyâyâyâùxâòxâëxâäxâÝxâÖxâÏxâÈxâÁxâºxâ³xâ¬xâ¥xâžxâ—xâxâ‰xâ‚xâ{xâtxâmxâfxâ_xâXxâQxâJxâCxâtâ7tâ0tâ)tâ"tâtâtâ tâtâÿsâøsâñsâêsâãsâÜsâÕsâÎsâÇsâÀsâ¹sâ²sâ«sâ¤sâsâ–sâsâˆsâsâzsâssâlsâesâ^sâWsâPsâIsâBsâ;sâ4sâ-sâ&sâsâsâsâ sâsâürâõrâîrâçrâàrâÙrâÒrâËrâÄrâ½râ¶râ¯râ¨râ¡râšrâ“râŒrâ…râ~râwrâprâirâbrâ[râTrâMrâFrâ?râ8râ1râ*râ#rârârârârârâùqâòqâëqâäqâÝqâÖqâÏqâÈqâÁqâºqâ³qâ¬qâ¥qâžqâ—qâqâ‰qâ‚qâ{qâtqâmqâfqâ_qâXqâQqâJqâCqâmâ7mâ0mâ)mâ"mâmâmâ mâmâÿlâølâñlâêlâãlâÜlâÕlâÎlâÇlâÀlâ¹lâ²lâ«lâ¤lâlâ–lâlâˆlâlâzlâslâllâelâ^lâWlâPlâIlâBlâ;lâ4lâ-lâ&lâlâlâlâ lâlâükâõkâîkâçkâàkâÙkâÒkâËkâÄkâ½kâ¶kâ¯kâ¨kâ¡kâškâ“kâŒkâ…kâ~kâwkâpkâikâbkâ[kâTkâMkâFkâ?kâ8kâ1kâ*kâ#kâkâkâkâkâkâùjâòjâëjâäjâÝjâÖjâÏjâÈjâÁjâºjâ³jâ¬jâ¥jâžjâ—jâjâ‰jâ‚jâ{jâtjâmjâfjâ_jâXjâQjâJjâCjâfâ7fâ0fâ)fâ"fâfâfâ fâfâÿeâøeâñeâêeâãeâÜeâÕeâÎeâÇeâÀeâ¹eâ²eâ«eâ¤eâeâ–eâeâˆeâeâzeâseâleâeeâ^eâWeâPeâIeâBeâ;eâ4eâ-eâ&eâeâeâeâ eâeâüdâõdâîdâçdâàdâÙdâÒdâËdâÄdâ½dâ¶dâ¯dâ¨dâ¡dâšdâ“dâŒdâ…dâ~dâwdâpdâidâbdâ[dâTdâMdâFdâ?dâ8dâ1dâ*dâ#dâdâdâdâdâdâùcâòcâëcâäcâÝcâÖcâÏcâÈcâÁcâºcâ³câ¬câ¥câžcâ—câcâ‰câ‚câ{câtcâmcâfcâ_câXcâQcâJcâCcâ_â7_â0_â)_â"_â_â_â _â_âÿ^âø^âñ^âê^âã^âÜ^âÕ^âÎ^âÇ^âÀ^â¹^â²^â«^â¤^â^â–^â^âˆ^â^âz^âs^âl^âe^â^^âW^âP^âI^âB^â;^â4^â-^â&^â^â^â^â ^â^âü]âõ]âî]âç]âà]âÙ]âÒ]âË]âÄ]â½]â¶]â¯]â¨]â¡]âš]â“]âŒ]â…]â~]âw]âp]âi]âb]â[]âT]âM]âF]â?]â8]â1]â*]â#]â]â]â]â]â]âù\âò\âë\âä\âÝ\âÖ\âÏ\âÈ\âÁ\âº\â³\â¬\â¥\âž\â—\â\â‰\â‚\â{\ât\âm\âf\â_\âX\âQ\âJ\âC\â<\â5\â.\â'\â \â\â\â \â\âý[âö[âï[âè[âá[âÚ[âÓ[âÌ[âÅ[â¾[â·[â°[â©[â¢[â›[â”[â[â†[â[âx[âq[âj[âc[â\[âU[âN[âG[â@[â9[â2[â+[â$[â[â[â[â[â[âúZâóZâìZâåZâÞZâ×ZâÐZâÉZâÂZâ»Zâ´Zâ­Zâ¦ZâŸZâ˜Zâ‘ZâŠZâƒZâ|ZâuZânZâgZâ`ZâYZâRZâKZâDZâ=Zâ6Zâ/Zâ(Zâ!ZâZâZâ ZâZâþYâ÷YâðYâéYââYâÛYâÔYâÍYâÆYâ¿Yâ¸Yâ±YâªYâ£YâœYâ•YâŽYâ‡Yâ€YâyYârYâkYâdYâ]YâVYâOYâHYâAYâ:Yâ3Yâ,Yâ%YâYâYâYâ YâYâûXâôXâíXâæXâßXâØXâÑXâÊXâÃXâ¼XâµXâ®Xâ§Xâ Xâ™Xâ’Xâ‹Xâ„Xâ}XâvXâoXâhXâaXâZXâSXâLXâEXâ>Xâ7Xâ0Xâ)Xâ"XâXâXâ XâXâÿWâøWâñWâêWâãWâÜWâÕWâÎWâÇWâÀWâ¹Wâ²Wâ«Wâ¤WâWâ–WâWâˆWâWâzWâsWâlWâeWâ^WâWWâPWâIWâBWâ;Wâ4Wâ-Wâ&WâWâWâWâ WâWâüVâõVâîVâçVâàVâÙVâÒVâËVâÄVâ½Vâ¶Vâ¯Vâ¨Vâ¡VâšVâ“VâŒVâ…Vâ~VâwVâpVâiVâbVâ[VâTVâMVâFVâ?Vâ8Vâ1Vâ*Vâ#VâVâVâVâVâVâùUâòUâëUâäUâÝUâÖUâÏUâÈUâÁUâºUâ³Uâ¬Uâ¥UâžUâ—UâUâ‰Uâ‚Uâ{UâtUâmUâfUâ_UâXUâQUâJUâCUâQâ7Qâ0Qâ)Qâ"QâQâQâ QâQâÿPâøPâñPâêPâãPâÜPâÕPâÎPâÇPâÀPâ¹Pâ²Pâ«Pâ¤PâPâ–PâPâˆPâPâzPâsPâlPâePâ^PâWPâPPâIPâBPâ;Pâ4Pâ-Pâ&PâPâPâPâ PâPâüOâõOâîOâçOâàOâÙOâÒOâËOâÄOâ½Oâ¶Oâ¯Oâ¨Oâ¡OâšOâ“OâŒOâ…Oâ~OâwOâpOâiOâbOâ[OâTOâMOâFOâ?Oâ8Oâ1Oâ*Oâ#OâOâOâOâOâOâùNâòNâëNâäNâÝNâÖNâÏNâÈNâÁNâºNâ³Nâ¬Nâ¥NâžNâ—NâNâ‰Nâ‚Nâ{NâtNâmNâfNâ_NâXNâQNâJNâCNâJâ7Jâ0Jâ)Jâ"JâJâJâ JâJâÿIâøIâñIâêIâãIâÜIâÕIâÎIâÇIâÀIâ¹Iâ²Iâ«Iâ¤IâIâ–IâIâˆIâIâzIâsIâlIâeIâ^IâWIâPIâIIâBIâ;Iâ4Iâ-Iâ&IâIâIâIâ IâIâüHâõHâîHâçHâàHâÙHâÒHâËHâÄHâ½Hâ¶Hâ¯Hâ¨Hâ¡HâšHâ“HâŒHâ…Hâ~HâwHâpHâiHâbHâ[HâTHâMHâFHâ?Hâ8Hâ1Hâ*Hâ#HâHâHâHâHâHâùGâòGâëGâäGâÝGâÖGâÏGâÈGâÁGâºGâ³Gâ¬Gâ¥GâžGâ—GâGâ‰Gâ‚Gâ{GâtGâmGâfGâ_GâXGâQGâJGâCGâCâ7Câ0Câ)Câ"CâCâCâ CâCâÿBâøBâñBâêBâãBâÜBâÕBâÎBâÇBâÀBâ¹Bâ²Bâ«Bâ¤BâBâ–BâBâˆBâBâzBâsBâlBâeBâ^BâWBâPBâIBâBBâ;Bâ4Bâ-Bâ&BâBâBâBâ BâBâüAâõAâîAâçAâàAâÙAâÒAâËAâÄAâ½Aâ¶Aâ¯Aâ¨Aâ¡AâšAâ“AâŒAâ…Aâ~AâwAâpAâiAâbAâ[AâTAâMAâFAâ?Aâ8Aâ1Aâ*Aâ#AâAâAâAâAâAâù@âò@âë@âä@âÝ@âÖ@âÏ@âÈ@âÁ@âº@â³@â¬@â¥@âž@â—@â@â‰@â‚@â{@ât@âm@âf@â_@âX@âQ@âJ@âC@â<@â5@â.@â'@â @â@â@â @â@âý?âö?âï?âè?âá?âÚ?âÓ?âÌ?âÅ?â¾?â·?â°?â©?â¢?â›?â”?â?â†?â?âx?âq?âj?âc?â\?âU?âN?âG?â@?â9?â2?â+?â$?â?â?â?â?â?âú>âó>âì>âå>âÞ>â×>âÐ>âÉ>âÂ>â»>â´>â­>â¦>âŸ>â˜>â‘>âŠ>âƒ>â|>âu>ân>âg>â`>âY>âR>âK>âD>â=>â6>â/>â(>â!>â>â>â >â>âþ=â÷=âð=âé=ââ=âÛ=âÔ=âÍ=âÆ=â¿=â¸=â±=âª=â£=âœ=â•=âŽ=â‡=â€=ây=âr=âk=âd=â]=âV=âO=âH=âA=â:=â3=â,=â%=â=â=â=â =â=âû<âô<âí<âæ<âß<âØ<âÑ<âÊ<âÃ<â¼<âµ<â®<â§<â <â™<â’<â‹<â„<â}<âv<âo<âh<âa<âZ<âS<âL<âE<â><â7<â0<â)<â"<â<â<â <â<âÿ;âø;âñ;âê;âã;âÜ;âÕ;âÎ;âÇ;âÀ;â¹;â²;â«;â¤;â;â–;â;âˆ;â;âz;âs;âl;âe;â^;âW;âP;âI;âB;â;;â4;â-;â&;â;â;â;â ;â;âü:âõ:âî:âç:âà:âÙ:âÒ:âË:âÄ:â½:â¶:â¯:â¨:â¡:âš:â“:âŒ:â…:â~:âw:âp:âi:âb:â[:âT:âM:âF:â?:â8:â1:â*:â#:â:â:â:â:â:âù9âò9âë9âä9âÝ9âÖ9âÏ9âÈ9âÁ9âº9â³9â¬9â¥9âž9â—9â9â‰9â‚9â{9ât9âm9âf9â_9âX9âQ9âJ9âC9â<9â59â.9â'9â 9â9â9â 9â9âý8âö8âï8âè8âá8âÚ8âÓ8âÌ8âÅ8â¾8â·8â°8â©8â¢8â›8â”8â8â†8â8âx8âq8âj8âc8â\8âU8âN8âG8â@8â98â28â+8â$8â8â8â8â8â8âú7âó7âì7âå7âÞ7â×7âÐ7âÉ7âÂ7â»7â´7â­7â¦7âŸ7â˜7â‘7âŠ7âƒ7â|7âu7ân7âg7â`7âY7âR7âK7âD7â=7â67â/7â(7â!7â7â7â 7â7âþ6â÷6âð6âé6ââ6âÛ6âÔ6âÍ6âÆ6â¿6â¸6â±6âª6â£6âœ6â•6âŽ6â‡6â€6ây6âr6âk6âd6â]6âV6âO6âH6âA6â:6â36â,6â%6â6â6â6â 6â6âû5âô5âí5âæ5âß5âØ5âÑ5âÊ5âÃ5â¼5âµ5â®5â§5â 5â™5â’5â‹5â„5â}5âv5âo5âh5âa5âZ5âS5âL5âE5â>5â75â05â)5â"5â5â5â 5â5âÿ4âø4âñ4âê4âã4âÜ4âÕ4âÎ4âÇ4âÀ4â¹4â²4â«4â¤4â4â–4â4âˆ4â4âz4âs4âl4âe4â^4âW4âP4âI4âB4â;4â44â-4â&4â4â4â4â 4â4âü3âõ3âî3âç3âà3âÙ3âÒ3âË3âÄ3â½3â¶3â¯3â¨3â¡3âš3â“3âŒ3â…3â~3âw3âp3âi3âb3â[3âT3âM3âF3â?3â83â13â*3â#3â3â3â3â3â3âù2âò2âë2âä2âÝ2âÖ2âÏ2âÈ2âÁ2âº2â³2â¬2â¥2âž2â—2â2â‰2â‚2â{2ât2âm2âf2â_2âX2âQ2âJ2âC2â<2â52â.2â'2â 2â2â2â 2â2âý1âö1âï1âè1âá1âÚ1âÓ1âÌ1âÅ1â¾1â·1â°1â©1â¢1â›1â”1â1â†1â1âx1âq1âj1âc1â\1âU1âN1âG1â@1â91â21â+1â$1â1â1â1â1â1âú0âó0âì0âå0âÞ0â×0âÐ0âÉ0âÂ0â»0â´0â­0â¦0âŸ0â˜0â‘0âŠ0âƒ0â|0âu0ân0âg0â`0âY0âR0âK0âD0â=0â60â/0â(0â!0â0â0â 0â0âþ/â÷/âð/âé/ââ/âÛ/âÔ/âÍ/âÆ/â¿/â¸/â±/âª/â£/âœ/â•/âŽ/â‡/â€/ây/âr/âk/âd/â]/âV/âO/âH/âA/â:/â3/â,/â%/â/â/â/â /â/âû.âô.âí.âæ.âß.âØ.âÑ.âÊ.âÃ.â¼.âµ.â®.â§.â .â™.â’.â‹.â„.â}.âv.âo.âh.âa.âZ.âS.âL.âE.â>.â7.â0.â).â".â.â.â .â.âÿ-âø-âñ-âê-âã-âÜ-âÕ-âÎ-âÇ-âÀ-â¹-â²-â«-â¤-â-â–-â-âˆ-â-âz-âs-âl-âe-â^-âW-âP-âI-âB-â;-â4-â--â&-â-â-â-â -â-âü,âõ,âî,âç,âà,âÙ,âÒ,âË,âÄ,â½,â¶,â¯,â¨,â¡,âš,â“,âŒ,â…,â~,âw,âp,âi,âb,â[,âT,âM,âF,â?,â8,â1,â*,â#,â,â,â,â,â,âù+âò+âë+âä+âÝ+âÖ+âÏ+âÈ+âÁ+âº+â³+â¬+â¥+âž+â—+â+â‰+â‚+â{+ât+âm+âf+â_+âX+âQ+âJ+âC+â<+â5+â.+â'+â +â+â+â +â+âý*âö*âï*âè*âá*âÚ*âÓ*âÌ*âÅ*â¾*â·*â°*â©*â¢*â›*â”*â*â†*â*âx*âq*âj*âc*â\*âU*âN*âG*â@*â9*â2*â+*â$*â*â*â*â*â*âú)âó)âì)âå)âÞ)â×)âÐ)âÉ)âÂ)â»)â´)â­)â¦)âŸ)â˜)â‘)âŠ)âƒ)â|)âu)ân)âg)â`)âY)âR)âK)âD)â=)â6)â/)â()â!)â)â)â )â)âþ(â÷(âð(âé(ââ(âÛ(âÔ(âÍ(âÆ(â¿(â¸(â±(âª(â£(âœ(â•(âŽ(â‡(â€(ây(âr(âk(âd(â](âV(âO(âH(âA(â:(â3(â,(â%(â(â(â(â (â(âû'âô'âí'âæ'âß'âØ'âÑ'âÊ'âÃ'â¼'âµ'â®'â§'â 'â™'â’'â‹'â„'â}'âv'âo'âh'âa'âZ'âS'âL'âE'â>'â7'â0'â)'â"'â'â'â 'â'âÿ&âø&âñ&âê&âã&âÜ&âÕ&âÎ&âÇ&âÀ&â¹&â²&â«&â¤&â&â–&â&âˆ&â&âz&âs&âl&âe&â^&âW&âP&âI&âB&â;&â4&â-&â&&â&â&â&â &â&âü%âõ%âî%âç%âà%âÙ%âÒ%âË%âÄ%â½%â¶%â¯%â¨%â¡%âš%â“%âŒ%â…%â~%âw%âp%âi%âb%â[%âT%âM%âF%â?%â8%â1%â*%â#%â%â%â%â%â%âù$âò$âë$âä$âÝ$âÖ$âÏ$âÈ$âÁ$âº$â³$â¬$â¥$âž$â—$â$â‰$â‚$â{$ât$âm$âf$â_$âX$âQ$âJ$âC$â<$â5$â.$â'$â $â$â$â $â$âý#âö#âï#âè#âá#âÚ#âÓ#âÌ#âÅ#â¾#â·#â°#â©#â¢#â›#â”#â#â†#â#âx#âq#âj#âc#â\#âU#âN#âG#â@#â9#â2#â+#â$#â#â#â#â#â#âú"âó"âì"âå"âÞ"â×"âÐ"âÉ"âÂ"â»"â´"â­"â¦"âŸ"â˜"â‘"âŠ"âƒ"â|"âu"ân"âg"â`"âY"âR"âK"âD"â="â6"â/"â("â!"â"â"â "â"âþ!â÷!âð!âé!ââ!âÛ!âÔ!âÍ!âÆ!â¿!â¸!â±!âª!â£!âœ!â•!âŽ!â‡!â€!ây!âr!âk!âd!â]!âV!âO!âH!âA!â:!â3!â,!â%!â!â!â!â !â!âû âô âí âæ âß âØ âÑ âÊ âà â¼ âµ â® â§ â  â™ â’ â‹ â„ â} âv âo âh âa âZ âS âL âE â> â7 â0 â) â" â â â â âÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââú âó âì âå âÞ â× âÐ âÉ â â» ⴠ⭠⦠⟠☠①⊠⃠â| âu ân âg â` âY âR âK âD â= â6 â/ â( â! â â â â âþ â÷ âð âé ââ âÛ âÔ âÍ âÆ â¿ â¸ â± âª â£ âœ â• âŽ â‡ â€ ây âr âk âd â] âV âO âH âA â: â3 â, â% â â â â â âû âô âí âæ âß âØ âÑ âÊ âà â¼ âµ â® â§ â  â™ â’ â‹ â„ â} âv âo âh âa âZ âS âL âE â> â7 â0 â) â" â â â â âÿ âø âñ âê âã âÜ âÕ âÎ âÇ âÀ ⹠Ⲡ⫠⤠â â– â ∠â âz âs âl âe â^ âW âP âI âB â; â4 â- â& â â â â â âü âõ âî âç âà âÙ âÒ âË âÄ â½ â¶ â¯ â¨ â¡ âš â“ âŒ â… â~ âw âp âi âb â[ âT âM âF â? â8 â1 â* â# â â â â â âùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúÿáóÿáìÿáåÿáÞÿá×ÿáÐÿáÉÿáÂÿá»ÿá´ÿá­ÿá¦ÿáŸÿá˜ÿá‘ÿáŠÿáƒÿá|ÿáuÿánÿágÿá`ÿáYÿáRÿáKÿáDÿá=ÿá6ÿá/ÿá(ÿá!ÿáÿáÿá ÿáÿáþþá÷þáðþáéþáâþáÛþáÔþáÍþáÆþá¿þá¸þá±þáªþá£þáœþá•þáŽþá‡þá€þáyþárþákþádþá]þáVþáOþáHþáAþá:þá3þá,þá%þáþáþáþá þáþáûýáôýáíýáæýáßýáØýáÑýáÊýáÃýá¼ýáµýá®ýá§ýá ýá™ýá’ýá‹ýá„ýá}ýávýáoýáhýáaýáZýáSýáLýáEýá>ýá7ýá0ýá)ýá"ýáýáýá ýáýáÿüáøüáñüáêüáãüáÜüáÕüáÎüáÇüáÀüá¹üá²üá«üá¤üáüá–üáüáˆüáüázüásüálüáeüá^üáWüáPüáIüáBüá;üá4üá-üá&üáüáüáüá üáüáüûáõûáîûáçûáàûáÙûáÒûáËûáÄûá½ûá¶ûá¯ûá¨ûá¡ûášûá“ûáŒûá…ûá~ûáwûápûáiûábûá[ûáTûáMûáFûá?ûá8ûá1ûá*ûá#ûáûáûáûáûáûáùúáòúáëúáäúáÝúáÖúáÏúáÈúáÁúáºúá³úá¬úá¥úážúá—úáúá‰úá‚úá{úátúámúáfúá_úáXúáQúáJúáCúá<úá5úá.úá'úá úáúáúá úáúáýùáöùáïùáèùááùáÚùáÓùáÌùáÅùá¾ùá·ùá°ùá©ùá¢ùá›ùá”ùáùá†ùáùáxùáqùájùácùá\ùáUùáNùáGùá@ùá9ùá2ùá+ùá$ùáùáùáùáùáùáúøáóøáìøáåøáÞøá×øáÐøáÉøáÂøá»øá´øá­øá¦øáŸøá˜øá‘øáŠøáƒøá|øáuøánøágøá`øáYøáRøáKøáDøá=øá6øá/øá(øá!øáøáøá øáøáþ÷á÷÷áð÷áé÷áâ÷áÛ÷áÔ÷áÍ÷áÆ÷á¿÷á¸÷á±÷áª÷á£÷áœ÷á•÷áŽ÷á‡÷á€÷áy÷ár÷ák÷ád÷á]÷áV÷áO÷áH÷áA÷á:÷á3÷á,÷á%÷á÷á÷á÷á ÷á÷áûöáôöáíöáæöáßöáØöáÑöáÊöáÃöá¼öáµöá®öá§öá öá™öá’öá‹öá„öá}öávöáoöáhöáaöáZöáSöáLöáEöá>öá7öá0öá)öá"öáöáöá öáöáÿõáøõáñõáêõáãõáÜõáÕõáÎõáÇõáÀõá¹õá²õá«õá¤õáõá–õáõáˆõáõázõásõálõáeõá^õáWõáPõáIõáBõá;õá4õá-õá&õáõáõáõá õáõáüôáõôáîôáçôáàôáÙôáÒôáËôáÄôá½ôá¶ôá¯ôá¨ôá¡ôášôá“ôáŒôá…ôá~ôáwôápôáiôábôá[ôáTôáMôáFôá?ôá8ôá1ôá*ôá#ôáôáôáôáôáôáùóáòóáëóáäóáÝóáÖóáÏóáÈóáÁóáºóá³óá¬óá¥óážóá—óáóá‰óá‚óá{óátóámóáfóá_óáXóáQóáJóáCóá<óá5óá.óá'óá óáóáóá óáóáýòáöòáïòáèòááòáÚòáÓòáÌòáÅòá¾òá·òá°òá©òá¢òá›òá”òáòá†òáòáxòáqòájòácòá\òáUòáNòáGòá@òá9òá2òá+òá$òáòáòáòáòáòáúñáóñáìñáåñáÞñá×ñáÐñáÉñáÂñá»ñá´ñá­ñá¦ñáŸñá˜ñá‘ñáŠñáƒñá|ñáuñánñágñá`ñáYñáRñáKñáDñá=ñá6ñá/ñá(ñá!ñáñáñá ñáñáþðá÷ðáððáéðáâðáÛðáÔðáÍðáÆðá¿ðá¸ðá±ðáªðá£ðáœðá•ðáŽðá‡ðá€ðáyðárðákðádðá]ðáVðáOðáHðáAðá:ðá3ðá,ðá%ðáðáðáðá ðáðáûïáôïáíïáæïáßïáØïáÑïáÊïáÃïá¼ïáµïá®ïá§ïá ïá™ïá’ïá‹ïá„ïá}ïávïáoïáhïáaïáZïáSïáLïáEïá>ïá7ïá0ïá)ïá"ïáïáïá ïáïáÿîáøîáñîáêîáãîáÜîáÕîáÎîáÇîáÀîá¹îá²îá«îá¤îáîá–îáîáˆîáîázîásîálîáeîá^îáWîáPîáIîáBîá;îá4îá-îá&îáîáîáîá îáîáüíáõíáîíáçíáàíáÙíáÒíáËíáÄíá½íá¶íá¯íá¨íá¡íášíá“íáŒíá…íá~íáwíápíáiíábíá[íáTíáMíáFíá?íá8íá1íá*íá#íáíáíáíáíáíáùìáòìáëìáäìáÝìáÖìáÏìáÈìáÁìáºìá³ìá¬ìá¥ìážìá—ìáìá‰ìá‚ìá{ìátìámìáfìá_ìáXìáQìáJìáCìá<ìá5ìá.ìá'ìá ìáìáìá ìáìáýëáöëáïëáèëááëáÚëáÓëáÌëáÅëá¾ëá·ëá°ëá©ëá¢ëá›ëá”ëáëá†ëáëáxëáqëájëácëá\ëáUëáNëáGëá@ëá9ëá2ëá+ëá$ëáëáëáëáëáëáúêáóêáìêáåêáÞêá×êáÐêáÉêáÂêá»êá´êá­êá¦êáŸêá˜êá‘êáŠêáƒêá|êáuêánêágêá`êáYêáRêáKêáDêá=êá6êá/êá(êá!êáêáêá êáêáþéá÷éáðéáééáâéáÛéáÔéáÍéáÆéá¿éá¸éá±éáªéá£éáœéá•éáŽéá‡éá€éáyéáréákéádéá]éáVéáOéáHéáAéá:éá3éá,éá%éáéáéáéá éáéáûèáôèáíèáæèáßèáØèáÑèáÊèáÃèá¼èáµèá®èá§èá èá™èá’èá‹èá„èá}èávèáoèáhèáaèáZèáSèáLèáEèá>èá7èá0èá)èá"èáèáèá èáèáÿçáøçáñçáêçáãçáÜçáÕçáÎçáÇçáÀçá¹çá²çá«çá¤çáçá–çáçáˆçáçázçásçálçáeçá^çáWçáPçáIçáBçá;çá4çá-çá&çáçáçáçá çáçáüæáõæáîæáçæáàæáÙæáÒæáËæáÄæá½æá¶æá¯æá¨æá¡æášæá“æáŒæá…æá~æáwæápæáiæábæá[æáTæáMæáFæá?æá8æá1æá*æá#æáæáæáæáæáæáùåáòåáëåáäåáÝåáÖåáÏåáÈåáÁåáºåá³åá¬åá¥åážåá—åáåá‰åá‚åá{åátåámåáfåá_åáXåáQåáJåáCåá<åá5åá.åá'åá åáåáåá åáåáýäáöäáïäáèäááäáÚäáÓäáÌäáÅäá¾äá·äá°äá©äá¢äá›äá”äáäá†äáäáxäáqäájäácäá\äáUäáNäáGäá@äá9äá2äá+äá$äáäáäáäáäáäáúãáóãáìãáåãáÞãá×ãáÐãáÉãáÂãá»ãá´ãá­ãá¦ãáŸãá˜ãá‘ãáŠãáƒãá|ãáuãánãágãá`ãáYãáRãáKãáDãá=ãá6ãá/ãá(ãá!ãáãáãá ãáãáþâá÷âáðâáéâáââáÛâáÔâáÍâáÆâá¿âá¸âá±âáªâá£âáœâá•âáŽâá‡âá€âáyâárâákâádâá]âáVâáOâáHâáAâá:âá3âá,âá%âáâáâáâá âáâáûááôááíááæááßááØááÑááÊááÃáá¼ááµáá®áá§áá áá™áá’áá‹áá„áá}áávááoááhááaááZááSááLááEáá>áá7áá0áá)áá"áááááá ááááÿàáøàáñàáêàáãàáÜàáÕàáÎàáÇàáÀàá¹àá²àá«àá¤àáàá–àáàáˆàáàázàásàálàáeàá^àáWàáPàáIàáBàá;àá4àá-àá&àáàáàáàá àáàáüßáõßáîßáçßáàßáÙßáÒßáËßáÄßá½ßá¶ßá¯ßá¨ßá¡ßášßá“ßáŒßá…ßá~ßáwßápßáißábßá[ßáTßáMßáFßá?ßá8ßá1ßá*ßá#ßáßáßáßáßáßáùÞáòÞáëÞáäÞáÝÞáÖÞáÏÞáÈÞáÁÞáºÞá³Þá¬Þá¥ÞážÞá—ÞáÞá‰Þá‚Þá{ÞátÞámÞáfÞá_ÞáXÞáQÞáJÞáCÞá<Þá5Þá.Þá'Þá ÞáÞáÞá ÞáÞáýÝáöÝáïÝáèÝááÝáÚÝáÓÝáÌÝáÅÝá¾Ýá·Ýá°Ýá©Ýá¢Ýá›Ýá”ÝáÝá†ÝáÝáxÝáqÝájÝácÝá\ÝáUÝáNÝáGÝá@Ýá9Ýá2Ýá+Ýá$ÝáÝáÝáÝáÝáÝáúÜáóÜáìÜáåÜáÞÜá×ÜáÐÜáÉÜáÂÜá»Üá´Üá­Üá¦ÜáŸÜá˜Üá‘ÜáŠÜáƒÜá|ÜáuÜánÜágÜá`ÜáYÜáRÜáKÜáDÜá=Üá6Üá/Üá(Üá!ÜáÜáÜá ÜáÜáþÛá÷ÛáðÛáéÛáâÛáÛÛáÔÛáÍÛáÆÛá¿Ûá¸Ûá±ÛáªÛá£ÛáœÛá•ÛáŽÛá‡Ûá€ÛáyÛárÛákÛádÛá]ÛáVÛáOÛáHÛáAÛá:Ûá3Ûá,Ûá%ÛáÛáÛáÛá ÛáÛáûÚáôÚáíÚáæÚáßÚáØÚáÑÚáÊÚáÃÚá¼ÚáµÚá®Úá§Úá Úá™Úá’Úá‹Úá„Úá}ÚávÚáoÚáhÚáaÚáZÚáSÚáLÚáEÚá>Úá7Úá0Úá)Úá"ÚáÚáÚá ÚáÚáÿÙáøÙáñÙáêÙáãÙáÜÙáÕÙáÎÙáÇÙáÀÙá¹Ùá²Ùá«Ùá¤ÙáÙá–ÙáÙáˆÙáÙázÙásÙálÙáeÙá^ÙáWÙáPÙáIÙáBÙá;Ùá4Ùá-Ùá&ÙáÙáÙáÙá ÙáÙáüØáõØáîØáçØáàØáÙØáÒØáËØáÄØá½Øá¶Øá¯Øá¨Øá¡ØášØá“ØáŒØá…Øá~ØáwØápØáiØábØá[ØáTØáMØáFØá?Øá8Øá1Øá*Øá#ØáØáØáØáØáØáù×áò×áë×áä×áÝ×áÖ×áÏ×áÈ×áÁ×áº×á³×á¬×á¥×áž×á—×á×á‰×á‚×á{×át×ám×áf×á_×áX×áQ×áJ×áC×á<×á5×á.×á'×á ×á×á×á ×á×áýÖáöÖáïÖáèÖááÖáÚÖáÓÖáÌÖáÅÖá¾Öá·Öá°Öá©Öá¢Öá›Öá”ÖáÖá†ÖáÖáxÖáqÖájÖácÖá\ÖáUÖáNÖáGÖá@Öá9Öá2Öá+Öá$ÖáÖáÖáÖáÖáÖáúÕáóÕáìÕáåÕáÞÕá×ÕáÐÕáÉÕáÂÕá»Õá´Õá­Õá¦ÕáŸÕá˜Õá‘ÕáŠÕáƒÕá|ÕáuÕánÕágÕá`ÕáYÕáRÕáKÕáDÕá=Õá6Õá/Õá(Õá!ÕáÕáÕá ÕáÕáþÔá÷ÔáðÔáéÔáâÔáÛÔáÔÔáÍÔáÆÔá¿Ôá¸Ôá±ÔáªÔá£ÔáœÔá•ÔáŽÔá‡Ôá€ÔáyÔárÔákÔádÔá]ÔáVÔáOÔáHÔáAÔá:Ôá3Ôá,Ôá%ÔáÔáÔáÔá ÔáÔáûÓáôÓáíÓáæÓáßÓáØÓáÑÓáÊÓáÃÓá¼ÓáµÓá®Óá§Óá Óá™Óá’Óá‹Óá„Óá}ÓávÓáoÓáhÓáaÓáZÓáSÓáLÓáEÓá>Óá7Óá0Óá)Óá"ÓáÓáÓá ÓáÓáÿÒáøÒáñÒáêÒáãÒáÜÒáÕÒáÎÒáÇÒáÀÒá¹Òá²Òá«Òá¤ÒáÒá–ÒáÒáˆÒáÒázÒásÒálÒáeÒá^ÒáWÒáPÒáIÒáBÒá;Òá4Òá-Òá&ÒáÒáÒáÒá ÒáÒáüÑáõÑáîÑáçÑáàÑáÙÑáÒÑáËÑáÄÑá½Ñá¶Ñá¯Ñá¨Ñá¡ÑášÑá“ÑáŒÑá…Ñá~ÑáwÑápÑáiÑábÑá[ÑáTÑáMÑáFÑá?Ñá8Ñá1Ñá*Ñá#ÑáÑáÑáÑáÑáÑáùÐáòÐáëÐáäÐáÝÐáÖÐáÏÐáÈÐáÁÐáºÐá³Ðá¬Ðá¥ÐážÐá—ÐáÐá‰Ðá‚Ðá{ÐátÐámÐáfÐá_ÐáXÐáQÐáJÐáCÐá<Ðá5Ðá.Ðá'Ðá ÐáÐáÐá ÐáÐáýÏáöÏáïÏáèÏááÏáÚÏáÓÏáÌÏáÅÏá¾Ïá·Ïá°Ïá©Ïá¢Ïá›Ïá”ÏáÏá†ÏáÏáxÏáqÏájÏácÏá\ÏáUÏáNÏáGÏá@Ïá9Ïá2Ïá+Ïá$ÏáÏáÏáÏáÏáÏáúÎáóÎáìÎáåÎáÞÎá×ÎáÐÎáÉÎáÂÎá»Îá´Îá­Îá¦ÎáŸÎá˜Îá‘ÎáŠÎáƒÎá|ÎáuÎánÎágÎá`ÎáYÎáRÎáKÎáDÎá=Îá6Îá/Îá(Îá!ÎáÎáÎá ÎáÎáþÍá÷ÍáðÍáéÍáâÍáÛÍáÔÍáÍÍáÆÍá¿Íá¸Íá±ÍáªÍá£ÍáœÍá•ÍáŽÍá‡Íá€ÍáyÍárÍákÍádÍá]ÍáVÍáOÍáHÍáAÍá:Íá3Íá,Íá%ÍáÍáÍáÍá ÍáÍáûÌáôÌáíÌáæÌáßÌáØÌáÑÌáÊÌáÃÌá¼ÌáµÌá®Ìá§Ìá Ìá™Ìá’Ìá‹Ìá„Ìá}ÌávÌáoÌáhÌáaÌáZÌáSÌáLÌáEÌá>Ìá7Ìá0Ìá)Ìá"ÌáÌáÌá ÌáÌáÿËáøËáñËáêËáãËáÜËáÕËáÎËáÇËáÀËá¹Ëá²Ëá«Ëá¤ËáËá–ËáËáˆËáËázËásËálËáeËá^ËáWËáPËáIËáBËá;Ëá4Ëá-Ëá&ËáËáËáËá ËáËáüÊáõÊáîÊáçÊáàÊáÙÊáÒÊáËÊáÄÊá½Êá¶Êá¯Êá¨Êá¡ÊášÊá“ÊáŒÊá…Êá~ÊáwÊápÊáiÊábÊá[ÊáTÊáMÊáFÊá?Êá8Êá1Êá*Êá#ÊáÊáÊáÊáÊáÊáùÉáòÉáëÉáäÉáÝÉáÖÉáÏÉáÈÉáÁÉáºÉá³Éá¬Éá¥ÉážÉá—ÉáÉá‰Éá‚Éá{ÉátÉámÉáfÉá_ÉáXÉáQÉáJÉáCÉá<Éá5Éá.Éá'Éá ÉáÉáÉá ÉáÉáýÈáöÈáïÈáèÈááÈáÚÈáÓÈáÌÈáÅÈá¾Èá·Èá°Èá©Èá¢Èá›Èá”ÈáÈá†ÈáÈáxÈáqÈájÈácÈá\ÈáUÈáNÈáGÈá@Èá9Èá2Èá+Èá$ÈáÈáÈáÈáÈáÈáúÇáóÇáìÇáåÇáÞÇá×ÇáÐÇáÉÇáÂÇá»Çá´Çá­Çá¦ÇáŸÇá˜Çá‘ÇáŠÇáƒÇá|ÇáuÇánÇágÇá`ÇáYÇáRÇáKÇáDÇá=Çá6Çá/Çá(Çá!ÇáÇáÇá ÇáÇáþÆá÷ÆáðÆáéÆáâÆáÛÆáÔÆáÍÆáÆÆá¿Æá¸Æá±ÆáªÆá£ÆáœÆá•ÆáŽÆá‡Æá€ÆáyÆárÆákÆádÆá]ÆáVÆáOÆáHÆáAÆá:Æá3Æá,Æá%ÆáÆáÆáÆá ÆáÆáûÅáôÅáíÅáæÅáßÅáØÅáÑÅáÊÅáÃÅá¼ÅáµÅá®Åá§Åá Åá™Åá’Åá‹Åá„Åá}ÅávÅáoÅáhÅáaÅáZÅáSÅáLÅáEÅá>Åá7Åá0Åá)Åá"ÅáÅáÅá ÅáÅáÿÄáøÄáñÄáêÄáãÄáÜÄáÕÄáÎÄáÇÄáÀÄá¹Äá²Äá«Äá¤ÄáÄá–ÄáÄáˆÄáÄázÄásÄálÄáeÄá^ÄáWÄáPÄáIÄáBÄá;Äá4Äá-Äá&ÄáÄáÄáÄá ÄáÄáüÃáõÃáîÃáçÃáàÃáÙÃáÒÃáËÃáÄÃá½Ãá¶Ãá¯Ãá¨Ãá¡ÃášÃá“ÃáŒÃá…Ãá~ÃáwÃápÃáiÃábÃá[ÃáTÃáMÃáFÃá?Ãá8Ãá1Ãá*Ãá#ÃáÃáÃáÃáÃáÃáùÂáòÂáëÂáäÂáÝÂáÖÂáÏÂáÈÂáÁÂáºÂá³Âá¬Âá¥ÂážÂá—ÂáÂá‰Âá‚Âá{ÂátÂámÂáfÂá_ÂáXÂáQÂáJÂáCÂá<Âá5Âá.Âá'Âá ÂáÂáÂá ÂáÂáýÁáöÁáïÁáèÁááÁáÚÁáÓÁáÌÁáÅÁá¾Áá·Áá°Áá©Áá¢Áá›Áá”ÁáÁá†ÁáÁáxÁáqÁájÁácÁá\ÁáUÁáNÁáGÁá@Áá9Áá2Áá+Áá$ÁáÁáÁáÁáÁáÁáúÀáóÀáìÀáåÀáÞÀá×ÀáÐÀáÉÀáÂÀá»Àá´Àá­Àá¦ÀáŸÀá˜Àá‘ÀáŠÀáƒÀá|ÀáuÀánÀágÀá`ÀáYÀáRÀáKÀáDÀá=Àá6Àá/Àá(Àá!ÀáÀáÀá ÀáÀáþ¿á÷¿áð¿áé¿áâ¿áÛ¿áÔ¿áÍ¿áÆ¿á¿¿á¸¿á±¿áª¿á£¿áœ¿á•¿áŽ¿á‡¿á€¿áy¿ár¿ák¿ád¿á]¿áV¿áO¿áH¿áA¿á:¿á3¿á,¿á%¿á¿á¿á¿á ¿á¿áû¾áô¾áí¾áæ¾áß¾áؾáѾáʾáþἾᵾᮾ᧾ᠾᙾᒾዾᄾá}¾áv¾áo¾áh¾áa¾áZ¾áS¾áL¾áE¾á>¾á7¾á0¾á)¾á"¾á¾á¾á ¾á¾áÿ½áø½áñ½áê½áã½áܽáÕ½áνáǽáÀ½á¹½á²½á«½á¤½á½á–½á½áˆ½á½áz½ás½ál½áe½á^½áW½áP½áI½áB½á;½á4½á-½á&½á½á½á½á ½á½áü¼áõ¼áî¼áç¼áà¼áÙ¼áÒ¼á˼áļὼᶼ᯼ᨼ᡼ᚼᓼጼᅼá~¼áw¼áp¼ái¼áb¼á[¼áT¼áM¼áF¼á?¼á8¼á1¼á*¼á#¼á¼á¼á¼á¼á¼áù»áò»áë»áä»áÝ»áÖ»áÏ»áÈ»áÁ»áº»á³»á¬»á¥»áž»á—»á»á‰»á‚»á{»át»ám»áf»á_»áX»áQ»áJ»áC»á<»á5»á.»á'»á »á»á»á »á»áýºáöºáïºáèºááºáÚºáÓºá̺áźá¾ºá·ºá°ºá©ºá¢ºá›ºá”ºáºá†ºáºáxºáqºájºácºá\ºáUºáNºáGºá@ºá9ºá2ºá+ºá$ºáºáºáºáºáºáú¹áó¹áì¹áå¹áÞ¹á×¹áйáɹá¹á»¹á´¹á­¹á¦¹áŸ¹á˜¹á‘¹áйჹá|¹áu¹án¹ág¹á`¹áY¹áR¹áK¹áD¹á=¹á6¹á/¹á(¹á!¹á¹á¹á ¹á¹áþ¸á÷¸áð¸áé¸áâ¸áÛ¸áÔ¸á͸áƸῸḸᱸ᪸᣸᜸ᕸáޏᇸးáy¸ár¸ák¸ád¸á]¸áV¸áO¸áH¸áA¸á:¸á3¸á,¸á%¸á¸á¸á¸á ¸á¸áû·áô·áí·áæ·áß·áØ·áÑ·áÊ·á÷á¼·áµ·á®·á§·á ·á™·á’·á‹·á„·á}·áv·áo·áh·áa·áZ·áS·áL·áE·á>·á7·á0·á)·á"·á·á·á ·á·áÿ¶áø¶áñ¶áê¶áã¶áܶáÕ¶áζáǶáÀ¶á¹¶á²¶á«¶á¤¶á¶á–¶á¶áˆ¶á¶áz¶ás¶ál¶áe¶á^¶áW¶áP¶áI¶áB¶á;¶á4¶á-¶á&¶á¶á¶á¶á ¶á¶áüµáõµáîµáçµáàµáÙµáÒµá˵áĵήᶵ᯵ᨵᡵᚵᓵጵᅵá~µáwµápµáiµábµá[µáTµáMµáFµá?µá8µá1µá*µá#µáµáµáµáµáµáù´áò´áë´áä´áÝ´áÖ´áÏ´áÈ´áÁ´áº´á³´á¬´á¥´áž´á—´á´á‰´á‚´á{´át´ám´áf´á_´áX´áQ´áJ´áC´á<´á5´á.´á'´á ´á´á´á ´á´áý³áö³áï³áè³áá³áÚ³áÓ³á̳áųᾳᷳᰳᩳᢳᛳᔳá³á†³á³áx³áq³áj³ác³á\³áU³áN³áG³á@³á9³á2³á+³á$³á³á³á³á³á³áú²áó²áì²áå²áÞ²áײáвáɲá²á»²á´²á­²á¦²áŸ²á˜²á‘²áвჲá|²áu²án²ág²á`²áY²áR²áK²áD²á=²á6²á/²á(²á!²á²á²á ²á²áþ±á÷±áð±áé±áâ±áÛ±áÔ±áͱáƱ῱ḱᱱ᪱ᣱᜱᕱáޱᇱေáy±ár±ák±ád±á]±áV±áO±áH±áA±á:±á3±á,±á%±á±á±á±á ±á±áû°áô°áí°áæ°áß°áذáѰáʰáðá¼°áµ°á®°á§°á °á™°á’°á‹°á„°á}°áv°áo°áh°áa°áZ°áS°áL°áE°á>°á7°á0°á)°á"°á°á°á °á°áÿ¯áø¯áñ¯áê¯áã¯áܯáÕ¯áίáǯáÀ¯á¹¯á²¯á«¯á¤¯á¯á–¯á¯áˆ¯á¯áz¯ás¯ál¯áe¯á^¯áW¯áP¯áI¯áB¯á;¯á4¯á-¯á&¯á¯á¯á¯á ¯á¯áü®áõ®áî®áç®áà®áÙ®áÒ®áË®áĮὮᶮᯮᨮᡮᚮᓮጮᅮá~®áw®áp®ái®áb®á[®áT®áM®áF®á?®á8®á1®á*®á#®á®á®á®á®á®áù­áò­áë­áä­áÝ­áÖ­áÏ­áÈ­áÁ­áº­á³­á¬­á¥­áž­á—­á­á‰­á‚­á{­át­ám­áf­á_­áX­áQ­áJ­áC­á<­á5­á.­á'­á ­á­á­á ­á­áý¬áö¬áï¬áè¬áá¬áÚ¬áÓ¬á̬áŬᾬᷬᰬᩬ᢬᛬ᔬá¬á†¬á¬áx¬áq¬áj¬ác¬á\¬áU¬áN¬áG¬á@¬á9¬á2¬á+¬á$¬á¬á¬á¬á¬á¬áú«áó«áì«áå«áÞ«á׫áЫáÉ«á«á»«á´«á­«á¦«áŸ«á˜«á‘«áŠ«áƒ«á|«áu«án«ág«á`«áY«áR«áK«áD«á=«á6«á/«á(«á!«á«á«á «á«áþªá÷ªáðªáéªáâªáÛªáÔªáͪáƪῪḪᱪ᪪ᣪᜪᕪᎪᇪဪáyªárªákªádªá]ªáVªáOªáHªáAªá:ªá3ªá,ªá%ªáªáªáªá ªáªáû©áô©áí©áæ©áß©áØ©áÑ©áÊ©áéἩᵩᮩ᧩ᠩᙩᒩዩᄩá}©áv©áo©áh©áa©áZ©áS©áL©áE©á>©á7©á0©á)©á"©á©á©á ©á©áÿ¨áø¨áñ¨áê¨áã¨áܨáÕ¨áΨáǨáÀ¨á¹¨á²¨á«¨á¤¨á¨á–¨á¨áˆ¨á¨áz¨ás¨ál¨áe¨á^¨áW¨áP¨áI¨áB¨á;¨á4¨á-¨á&¨á¨á¨á¨á ¨á¨áü§áõ§áî§áç§áà§áÙ§áÒ§á˧áħὧᶧᯧᨧᡧᚧᓧጧᅧá~§áw§áp§ái§áb§á[§áT§áM§áF§á?§á8§á1§á*§á#§á§á§á§á§á§áù¦áò¦áë¦áä¦áݦáÖ¦áϦáȦáÁ¦áº¦á³¦á¬¦á¥¦áž¦á—¦á¦á‰¦á‚¦á{¦át¦ám¦áf¦á_¦áX¦áQ¦áJ¦áC¦á<¦á5¦á.¦á'¦á ¦á¦á¦á ¦á¦áý¥áö¥áï¥áè¥áá¥áÚ¥áÓ¥áÌ¥áťᾥᷥᰥᩥᢥᛥᔥá¥á†¥á¥áx¥áq¥áj¥ác¥á\¥áU¥áN¥áG¥á@¥á9¥á2¥á+¥á$¥á¥á¥á¥á¥á¥áú¤áó¤áì¤áå¤áÞ¤áפáФáɤá¤á»¤á´¤á­¤á¦¤áŸ¤á˜¤á‘¤áФფá|¤áu¤án¤ág¤á`¤áY¤áR¤áK¤áD¤á=¤á6¤á/¤á(¤á!¤á¤á¤á ¤á¤áþ£á÷£áð£áé£áâ£áÛ£áÔ£áÍ£áÆ£á¿£á¸£á±£áª£á££áœ£á•£áŽ£á‡£á€£áy£ár£ák£ád£á]£áV£áO£áH£áA£á:£á3£á,£á%£á£á£á£á £á£áû¢áô¢áí¢áæ¢áߢáØ¢áÑ¢áÊ¢áâἢᵢᮢ᧢ᠢᙢᒢዢᄢá}¢áv¢áo¢áh¢áa¢áZ¢áS¢áL¢áE¢á>¢á7¢á0¢á)¢á"¢á¢á¢á ¢á¢áÿ¡áø¡áñ¡áê¡áã¡áÜ¡áÕ¡áΡáÇ¡áÀ¡á¹¡á²¡á«¡á¤¡á¡á–¡á¡áˆ¡á¡áz¡ás¡ál¡áe¡á^¡áW¡áP¡áI¡áB¡á;¡á4¡á-¡á&¡á¡á¡á¡á ¡á¡áü áõ áî áç áà áÙ áÒ áË áĠὠᶠᯠᨠᡠᚠᓠጠᅠá~ áw áp ái áb á[ áT áM áF á? á8 á1 á* á# á á á á á áùŸáòŸáëŸáäŸáÝŸáÖŸáÏŸáÈŸáÁŸáºŸá³Ÿá¬Ÿá¥ŸážŸá—ŸáŸá‰Ÿá‚Ÿá{ŸátŸámŸáfŸá_ŸáXŸáQŸáJŸáCŸá<Ÿá5Ÿá.Ÿá'Ÿá ŸáŸáŸá ŸáŸáýžáöžáïžáèžáážáÚžáÓžáÌžáŞᾞᷞᰞᩞᢞᛞᔞážá†žážáxžáqžájžácžá\žáUžáNžáGžá@žá9žá2žá+žá$žážážážážážáúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþœá÷œáðœáéœáâœáÛœáÔœáÍœáÆœá¿œá¸œá±œáªœá£œáœœá•œáŽœá‡œá€œáyœárœákœádœá]œáVœáOœáHœáAœá:œá3œá,œá%œáœáœáœá œáœáû›áô›áí›áæ›áß›áØ›áÑ›áÊ›áÛἛᵛᮛ᧛᠛ᙛᒛዛᄛá}›áv›áo›áh›áa›áZ›áS›áL›áE›á>›á7›á0›á)›á"›á›á›á ›á›áÿšáøšáñšáêšáãšáÜšáÕšáΚáÇšáÀšá¹šá²šá«šá¤šášá–šášáˆšášázšásšálšáešá^šáWšáPšáIšáBšá;šá4šá-šá&šášášášá šášáü™áõ™áî™áç™áà™áÙ™áÒ™áË™áęὙᶙᯙᨙᡙᚙᓙጙᅙá~™áw™áp™ái™áb™á[™áT™áM™áF™á?™á8™á1™á*™á#™á™á™á™á™á™áù˜áò˜áë˜áä˜áݘáÖ˜áϘáȘáÁ˜áº˜á³˜á¬˜á¥˜áž˜á—˜á˜á‰˜á‚˜á{˜át˜ám˜áf˜á_˜áX˜áQ˜áJ˜áC˜á<˜á5˜á.˜á'˜á ˜á˜á˜á ˜á˜áý—áö—áï—áè—áá—áÚ—áÓ—áÌ—áŗᾗᷗᰗᩗᢗᛗᔗá—ᆗá—áx—áq—áj—ác—á\—áU—áN—áG—á@—á9—á2—á+—á$—á—á—á—á—á—áú–áó–áì–áå–áÞ–á×–áЖáÉ–á–Ỗᴖ᭖ᦖ៖ᘖᑖኖზá|–áu–án–ág–á`–áY–áR–áK–áD–á=–á6–á/–á(–á!–á–á–á –á–áþ•á÷•áð•áé•áâ•áÛ•áÔ•áÍ•áÆ•á¿•á¸•á±•áª•á£•áœ•á••áŽ•á‡•á€•áy•ár•ák•ád•á]•áV•áO•áH•áA•á:•á3•á,•á%•á•á•á•á •á•áû”áô”áí”áæ”áß”áØ”áÑ”áÊ”áÔἔᵔᮔ᧔᠔ᙔᒔዔᄔá}”áv”áo”áh”áa”áZ”áS”áL”áE”á>”á7”á0”á)”á"”á”á”á ”á”áÿ“áø“áñ“áê“áã“áÜ“áÕ“áΓáÇ“áÀ“ṓᲓ᫓ᤓá“á–“á“ሓá“áz“ás“ál“áe“á^“áW“áP“áI“áB“á;“á4“á-“á&“á“á“á“á “á“áü’áõ’áî’áç’áà’áÙ’áÒ’áË’áĒὒᶒᯒᨒᡒᚒᓒጒᅒá~’áw’áp’ái’áb’á[’áT’áM’áF’á?’á8’á1’á*’á#’á’á’á’á’á’áù‘áò‘áë‘áä‘áÝ‘áÖ‘áÏ‘áÈ‘áÁ‘ẑ᳑ᬑᥑទᗑá‘ቑ႑á{‘át‘ám‘áf‘á_‘áX‘áQ‘áJ‘áC‘á<‘á5‘á.‘á'‘á ‘á‘á‘á ‘á‘áýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþŽá÷ŽáðŽáéŽáâŽáÛŽáÔŽáÍŽáÆŽá¿Žá¸Žá±ŽáªŽá£ŽáœŽá•ŽáŽŽá‡Žá€ŽáyŽárŽákŽádŽá]ŽáVŽáOŽáHŽáAŽá:Žá3Žá,Žá%ŽáŽáŽáŽá ŽáŽáûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿŒáøŒáñŒáêŒáãŒáÜŒáÕŒáÎŒáÇŒáÀŒá¹Œá²Œá«Œá¤ŒáŒá–ŒáŒáˆŒáŒázŒásŒálŒáeŒá^ŒáWŒáPŒáIŒáBŒá;Œá4Œá-Œá&ŒáŒáŒáŒá ŒáŒáü‹áõ‹áî‹áç‹áà‹áÙ‹áÒ‹áË‹áċὋᶋᯋᨋᡋᚋᓋጋᅋá~‹áw‹áp‹ái‹áb‹á[‹áT‹áM‹áF‹á?‹á8‹á1‹á*‹á#‹á‹á‹á‹á‹á‹áùŠáòŠáëŠáäŠáÝŠáÖŠáÏŠáÈŠáÁŠáºŠá³Šá¬Šá¥ŠážŠá—ŠáŠá‰Šá‚Šá{ŠátŠámŠáfŠá_ŠáXŠáQŠáJŠáCŠá<Šá5Šá.Šá'Šá ŠáŠáŠá ŠáŠáý‰áö‰áï‰áè‰áá‰áÚ‰áÓ‰á̉áʼnᾉ᷉ᰉᩉᢉᛉᔉá‰á†‰á‰áx‰áq‰áj‰ác‰á\‰áU‰áN‰áG‰á@‰á9‰á2‰á+‰á$‰á‰á‰á‰á‰á‰áúˆáóˆáìˆáåˆáÞˆá׈áЈáɈáˆá»ˆá´ˆá­ˆá¦ˆáŸˆá˜ˆá‘ˆáŠˆáƒˆá|ˆáuˆánˆágˆá`ˆáYˆáRˆáKˆáDˆá=ˆá6ˆá/ˆá(ˆá!ˆáˆáˆá ˆáˆáþ‡á÷‡áð‡áé‡áâ‡áÛ‡áÔ‡á͇áƇῇḇ᱇᪇ᣇᜇᕇáއᇇဇáy‡ár‡ák‡ád‡á]‡áV‡áO‡áH‡áA‡á:‡á3‡á,‡á%‡á‡á‡á‡á ‡á‡áû†áô†áí†áæ†á߆á؆áцáʆáÆá¼†áµ†á®†á§†á †á™†á’†á‹†á„†á}†áv†áo†áh†áa†áZ†áS†áL†áE†á>†á7†á0†á)†á"†á†á†á †á†áÿ…áø…áñ…áê…áã…áÜ…áÕ…áÎ…áÇ…áÀ…ṅᲅ᫅ᤅá…á–…á…ህá…áz…ás…ál…áe…á^…áW…áP…áI…áB…á;…á4…á-…á&…á…á…á…á …á…áü„áõ„áî„áç„áà„áÙ„áÒ„áË„áĄὄᶄᯄᨄᡄᚄᓄጄᅄá~„áw„áp„ái„áb„á[„áT„áM„áF„á?„á8„á1„á*„á#„á„á„á„á„á„áùƒáòƒáëƒáäƒá݃áÖƒáσáȃáÁƒáºƒá³ƒá¬ƒá¥ƒážƒá—ƒáƒá‰ƒá‚ƒá{ƒátƒámƒáfƒá_ƒáXƒáQƒáJƒáCƒá<ƒá5ƒá.ƒá'ƒá ƒáƒáƒá ƒáƒáý‚áö‚áï‚áè‚áá‚áÚ‚áÓ‚áÌ‚áłᾂ᷂ᰂᩂᢂᛂᔂá‚ᆂá‚áx‚áq‚áj‚ác‚á\‚áU‚áN‚áG‚á@‚á9‚á2‚á+‚á$‚á‚á‚á‚á‚á‚áúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþ€á÷€áð€áé€áâ€áÛ€áÔ€áÍ€áÆ€á¿€á¸€á±€áª€á£€áœ€á•€áŽ€á‡€á€€áy€ár€ák€ád€á]€áV€áO€áH€áA€á:€á3€á,€á%€á€á€á€á €á€áûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿ~áø~áñ~áê~áã~áÜ~áÕ~áÎ~áÇ~áÀ~á¹~á²~á«~á¤~á~á–~á~áˆ~á~áz~ás~ál~áe~á^~áW~áP~áI~áB~á;~á4~á-~á&~á~á~á~á ~á~áü}áõ}áî}áç}áà}áÙ}áÒ}áË}áÄ}á½}á¶}á¯}á¨}á¡}áš}á“}áŒ}á…}á~}áw}áp}ái}áb}á[}áT}áM}áF}á?}á8}á1}á*}á#}á}á}á}á}á}áù|áò|áë|áä|áÝ|áÖ|áÏ|áÈ|áÁ|áº|á³|á¬|á¥|áž|á—|á|á‰|á‚|á{|át|ám|áf|á_|áX|áQ|áJ|áC|á<|á5|á.|á'|á |á|á|á |á|áý{áö{áï{áè{áá{áÚ{áÓ{áÌ{áÅ{á¾{á·{á°{á©{á¢{á›{á”{á{á†{á{áx{áq{áj{ác{á\{áU{áN{áG{á@{á9{á2{á+{á${á{á{á{á{á{áúzáózáìzáåzáÞzá×záÐzáÉzáÂzá»zá´zá­zá¦záŸzá˜zá‘záŠzáƒzá|záuzánzágzá`záYzáRzáKzáDzá=zá6zá/zá(zá!zázázá zázáþyá÷yáðyáéyáâyáÛyáÔyáÍyáÆyá¿yá¸yá±yáªyá£yáœyá•yáŽyá‡yá€yáyyáryákyádyá]yáVyáOyáHyáAyá:yá3yá,yá%yáyáyáyá yáyáûxáôxáíxáæxáßxáØxáÑxáÊxáÃxá¼xáµxá®xá§xá xá™xá’xá‹xá„xá}xávxáoxáhxáaxáZxáSxáLxáExá>xá7xá0xá)xá"xáxáxá xáxáÿwáøwáñwáêwáãwáÜwáÕwáÎwáÇwáÀwá¹wá²wá«wá¤wáwá–wáwáˆwáwázwáswálwáewá^wáWwáPwáIwáBwá;wá4wá-wá&wáwáwáwá wáwáüváõváîváçváàváÙváÒváËváÄvá½vá¶vá¯vá¨vá¡vášvá“váŒvá…vá~váwvápváivábvá[váTváMváFvá?vá8vá1vá*vá#váváváváváváùuáòuáëuáäuáÝuáÖuáÏuáÈuáÁuáºuá³uá¬uá¥uážuá—uáuá‰uá‚uá{uátuámuáfuá_uáXuáQuáJuáCuáqá7qá0qá)qá"qáqáqá qáqáÿpáøpáñpáêpáãpáÜpáÕpáÎpáÇpáÀpá¹pá²pá«pá¤pápá–pápáˆpápázpáspálpáepá^páWpáPpáIpáBpá;pá4pá-pá&pápápápá pápáüoáõoáîoáçoáàoáÙoáÒoáËoáÄoá½oá¶oá¯oá¨oá¡oášoá“oáŒoá…oá~oáwoápoáioáboá[oáToáMoáFoá?oá8oá1oá*oá#oáoáoáoáoáoáùnáònáënáänáÝnáÖnáÏnáÈnáÁnáºná³ná¬ná¥nážná—náná‰ná‚ná{nátnámnáfná_náXnáQnáJnáCnájá7já0já)já"jájájá jájáÿiáøiáñiáêiáãiáÜiáÕiáÎiáÇiáÀiá¹iá²iá«iá¤iáiá–iáiáˆiáiáziásiáliáeiá^iáWiáPiáIiáBiá;iá4iá-iá&iáiáiáiá iáiáüháõháîháçháàháÙháÒháËháÄhá½há¶há¯há¨há¡hášhá“háŒhá…há~háwhápháihábhá[háTháMháFhá?há8há1há*há#háháháháháháùgáògáëgáägáÝgáÖgáÏgáÈgáÁgáºgá³gá¬gá¥gážgá—gágá‰gá‚gá{gátgámgáfgá_gáXgáQgáJgáCgácá7cá0cá)cá"cácácá cácáÿbáøbáñbáêbáãbáÜbáÕbáÎbáÇbáÀbá¹bá²bá«bá¤bábá–bábáˆbábázbásbálbáebá^báWbáPbáIbáBbá;bá4bá-bá&bábábábá bábáüaáõaáîaáçaáàaáÙaáÒaáËaáÄaá½aá¶aá¯aá¨aá¡aášaá“aáŒaá…aá~aáwaápaáiaábaá[aáTaáMaáFaá?aá8aá1aá*aá#aáaáaáaáaáaáù`áò`áë`áä`áÝ`áÖ`áÏ`áÈ`áÁ`áº`á³`á¬`á¥`áž`á—`á`á‰`á‚`á{`át`ám`áf`á_`áX`áQ`áJ`áC`á<`á5`á.`á'`á `á`á`á `á`áý_áö_áï_áè_áá_áÚ_áÓ_áÌ_áÅ_á¾_á·_á°_á©_á¢_á›_á”_á_á†_á_áx_áq_áj_ác_á\_áU_áN_áG_á@_á9_á2_á+_á$_á_á_á_á_á_áú^áó^áì^áå^áÞ^á×^áÐ^áÉ^áÂ^á»^á´^á­^á¦^áŸ^á˜^á‘^áŠ^áƒ^á|^áu^án^ág^á`^áY^áR^áK^áD^á=^á6^á/^á(^á!^á^á^á ^á^áþ]á÷]áð]áé]áâ]áÛ]áÔ]áÍ]áÆ]á¿]á¸]á±]áª]á£]áœ]á•]áŽ]á‡]á€]áy]ár]ák]ád]á]]áV]áO]áH]áA]á:]á3]á,]á%]á]á]á]á ]á]áû\áô\áí\áæ\áß\áØ\áÑ\áÊ\áÃ\á¼\áµ\á®\á§\á \á™\á’\á‹\á„\á}\áv\áo\áh\áa\áZ\áS\áL\áE\á>\á7\á0\á)\á"\á\á\á \á\áÿ[áø[áñ[áê[áã[áÜ[áÕ[áÎ[áÇ[áÀ[á¹[á²[á«[á¤[á[á–[á[áˆ[á[áz[ás[ál[áe[á^[áW[áP[áI[áB[á;[á4[á-[á&[á[á[á[á [á[áüZáõZáîZáçZáàZáÙZáÒZáËZáÄZá½Zá¶Zá¯Zá¨Zá¡ZášZá“ZáŒZá…Zá~ZáwZápZáiZábZá[ZáTZáMZáFZá?Zá8Zá1Zá*Zá#ZáZáZáZáZáZáùYáòYáëYáäYáÝYáÖYáÏYáÈYáÁYáºYá³Yá¬Yá¥YážYá—YáYá‰Yá‚Yá{YátYámYáfYá_YáXYáQYáJYáCYáUá7Uá0Uá)Uá"UáUáUá UáUáÿTáøTáñTáêTáãTáÜTáÕTáÎTáÇTáÀTá¹Tá²Tá«Tá¤TáTá–TáTáˆTáTázTásTálTáeTá^TáWTáPTáITáBTá;Tá4Tá-Tá&TáTáTáTá TáTáüSáõSáîSáçSáàSáÙSáÒSáËSáÄSá½Sá¶Sá¯Sá¨Sá¡SášSá“SáŒSá…Sá~SáwSápSáiSábSá[SáTSáMSáFSá?Sá8Sá1Sá*Sá#SáSáSáSáSáSáùRáòRáëRáäRáÝRáÖRáÏRáÈRáÁRáºRá³Rá¬Rá¥RážRá—RáRá‰Rá‚Rá{RátRámRáfRá_RáXRáQRáJRáCRáNá7Ná0Ná)Ná"NáNáNá NáNáÿMáøMáñMáêMáãMáÜMáÕMáÎMáÇMáÀMá¹Má²Má«Má¤MáMá–MáMáˆMáMázMásMálMáeMá^MáWMáPMáIMáBMá;Má4Má-Má&MáMáMáMá MáMáüLáõLáîLáçLáàLáÙLáÒLáËLáÄLá½Lá¶Lá¯Lá¨Lá¡LášLá“LáŒLá…Lá~LáwLápLáiLábLá[LáTLáMLáFLá?Lá8Lá1Lá*Lá#LáLáLáLáLáLáùKáòKáëKáäKáÝKáÖKáÏKáÈKáÁKáºKá³Ká¬Ká¥KážKá—KáKá‰Ká‚Ká{KátKámKáfKá_KáXKáQKáJKáCKáGá7Gá0Gá)Gá"GáGáGá GáGáÿFáøFáñFáêFáãFáÜFáÕFáÎFáÇFáÀFá¹Fá²Fá«Fá¤FáFá–FáFáˆFáFázFásFálFáeFá^FáWFáPFáIFáBFá;Fá4Fá-Fá&FáFáFáFá FáFáüEáõEáîEáçEáàEáÙEáÒEáËEáÄEá½Eá¶Eá¯Eá¨Eá¡EášEá“EáŒEá…Eá~EáwEápEáiEábEá[EáTEáMEáFEá?Eá8Eá1Eá*Eá#EáEáEáEáEáEáùDáòDáëDáäDáÝDáÖDáÏDáÈDáÁDáºDá³Dá¬Dá¥DážDá—DáDá‰Dá‚Dá{DátDámDáfDá_DáXDáQDáJDáCDá@á7@á0@á)@á"@á@á@á @á@áÿ?áø?áñ?áê?áã?áÜ?áÕ?áÎ?áÇ?áÀ?á¹?á²?á«?á¤?á?á–?á?áˆ?á?áz?ás?ál?áe?á^?áW?áP?áI?áB?á;?á4?á-?á&?á?á?á?á ?á?áü>áõ>áî>áç>áà>áÙ>áÒ>áË>áÄ>á½>á¶>á¯>á¨>á¡>áš>á“>áŒ>á…>á~>áw>áp>ái>áb>á[>áT>áM>áF>á?>á8>á1>á*>á#>á>á>á>á>á>áù=áò=áë=áä=áÝ=áÖ=áÏ=áÈ=áÁ=áº=á³=á¬=á¥=áž=á—=á=á‰=á‚=á{=át=ám=áf=á_=áX=áQ=áJ=áC=á<=á5=á.=á'=á =á=á=á =á=áý<áö<áï<áè<áá<áÚ<áÓ<áÌ<áÅ<á¾<á·<á°<á©<á¢<á›<á”<á<á†<á<áx<áq<áj<ác<á\<áU<áN<áG<á@<á9<á2<á+<á$<á<á<á<á<á<áú;áó;áì;áå;áÞ;á×;áÐ;áÉ;áÂ;á»;á´;á­;á¦;áŸ;á˜;á‘;áŠ;áƒ;á|;áu;án;ág;á`;áY;áR;áK;áD;á=;á6;á/;á(;á!;á;á;á ;á;áþ:á÷:áð:áé:áâ:áÛ:áÔ:áÍ:áÆ:á¿:á¸:á±:áª:á£:áœ:á•:áŽ:á‡:á€:áy:ár:ák:ád:á]:áV:áO:áH:áA:á::á3:á,:á%:á:á:á:á :á:áû9áô9áí9áæ9áß9áØ9áÑ9áÊ9áÃ9á¼9áµ9á®9á§9á 9á™9á’9á‹9á„9á}9áv9áo9áh9áa9áZ9áS9áL9áE9á>9á79á09á)9á"9á9á9á 9á9áÿ8áø8áñ8áê8áã8áÜ8áÕ8áÎ8áÇ8áÀ8á¹8á²8á«8á¤8á8á–8á8áˆ8á8áz8ás8ál8áe8á^8áW8áP8áI8áB8á;8á48á-8á&8á8á8á8á 8á8áü7áõ7áî7áç7áà7áÙ7áÒ7áË7áÄ7á½7á¶7á¯7á¨7á¡7áš7á“7áŒ7á…7á~7áw7áp7ái7áb7á[7áT7áM7áF7á?7á87á17á*7á#7á7á7á7á7á7áù6áò6áë6áä6áÝ6áÖ6áÏ6áÈ6áÁ6áº6á³6á¬6á¥6áž6á—6á6á‰6á‚6á{6át6ám6áf6á_6áX6áQ6áJ6áC6á<6á56á.6á'6á 6á6á6á 6á6áý5áö5áï5áè5áá5áÚ5áÓ5áÌ5áÅ5á¾5á·5á°5á©5á¢5á›5á”5á5á†5á5áx5áq5áj5ác5á\5áU5áN5áG5á@5á95á25á+5á$5á5á5á5á5á5áú4áó4áì4áå4áÞ4á×4áÐ4áÉ4áÂ4á»4á´4á­4á¦4áŸ4á˜4á‘4áŠ4áƒ4á|4áu4án4ág4á`4áY4áR4áK4áD4á=4á64á/4á(4á!4á4á4á 4á4áþ3á÷3áð3áé3áâ3áÛ3áÔ3áÍ3áÆ3á¿3á¸3á±3áª3á£3áœ3á•3áŽ3á‡3á€3áy3ár3ák3ád3á]3áV3áO3áH3áA3á:3á33á,3á%3á3á3á3á 3á3áû2áô2áí2áæ2áß2áØ2áÑ2áÊ2áÃ2á¼2áµ2á®2á§2á 2á™2á’2á‹2á„2á}2áv2áo2áh2áa2áZ2áS2áL2áE2á>2á72á02á)2á"2á2á2á 2á2áÿ1áø1áñ1áê1áã1áÜ1áÕ1áÎ1áÇ1áÀ1á¹1á²1á«1á¤1á1á–1á1áˆ1á1áz1ás1ál1áe1á^1áW1áP1áI1áB1á;1á41á-1á&1á1á1á1á 1á1áü0áõ0áî0áç0áà0áÙ0áÒ0áË0áÄ0á½0á¶0á¯0á¨0á¡0áš0á“0áŒ0á…0á~0áw0áp0ái0áb0á[0áT0áM0áF0á?0á80á10á*0á#0á0á0á0á0á0áù/áò/áë/áä/áÝ/áÖ/áÏ/áÈ/áÁ/áº/á³/á¬/á¥/áž/á—/á/á‰/á‚/á{/át/ám/áf/á_/áX/áQ/áJ/áC/á+á7+á0+á)+á"+á+á+á +á+áÿ*áø*áñ*áê*áã*áÜ*áÕ*áÎ*áÇ*áÀ*á¹*á²*á«*á¤*á*á–*á*áˆ*á*áz*ás*ál*áe*á^*áW*áP*áI*áB*á;*á4*á-*á&*á*á*á*á *á*áü)áõ)áî)áç)áà)áÙ)áÒ)áË)áÄ)á½)á¶)á¯)á¨)á¡)áš)á“)áŒ)á…)á~)áw)áp)ái)áb)á[)áT)áM)áF)á?)á8)á1)á*)á#)á)á)á)á)á)áù(áò(áë(áä(áÝ(áÖ(áÏ(áÈ(áÁ(áº(á³(á¬(á¥(áž(á—(á(á‰(á‚(á{(át(ám(áf(á_(áX(áQ(áJ(áC(á<(á5(á.(á'(á (á(á(á (á(áý'áö'áï'áè'áá'áÚ'áÓ'áÌ'áÅ'á¾'á·'á°'á©'á¢'á›'á”'á'á†'á'áx'áq'áj'ác'á\'áU'áN'áG'á@'á9'á2'á+'á$'á'á'á'á'á'áú&áó&áì&áå&áÞ&á×&áÐ&áÉ&áÂ&á»&á´&á­&á¦&áŸ&á˜&á‘&áŠ&áƒ&á|&áu&án&ág&á`&áY&áR&áK&áD&á=&á6&á/&á(&á!&á&á&á &á&áþ%á÷%áð%áé%áâ%áÛ%áÔ%áÍ%áÆ%á¿%á¸%á±%áª%á£%áœ%á•%áŽ%á‡%á€%áy%ár%ák%ád%á]%áV%áO%áH%áA%á:%á3%á,%á%%á%á%á%á %á%áû$áô$áí$áæ$áß$áØ$áÑ$áÊ$áÃ$á¼$áµ$á®$á§$á $á™$á’$á‹$á„$á}$áv$áo$áh$áa$áZ$áS$áL$áE$á>$á7$á0$á)$á"$á$á$á $á$áÿ#áø#áñ#áê#áã#áÜ#áÕ#áÎ#áÇ#áÀ#á¹#á²#á«#á¤#á#á–#á#áˆ#á#áz#ás#ál#áe#á^#áW#áP#áI#áB#á;#á4#á-#á&#á#á#á#á #á#áü"áõ"áî"áç"áà"áÙ"áÒ"áË"áÄ"á½"á¶"á¯"á¨"á¡"áš"á“"áŒ"á…"á~"áw"áp"ái"áb"á["áT"áM"áF"á?"á8"á1"á*"á#"á"á"á"á"á"áù!áò!áë!áä!áÝ!áÖ!áÏ!áÈ!áÁ!áº!á³!á¬!á¥!áž!á—!á!á‰!á‚!á{!át!ám!áf!á_!áX!áQ!áJ!áC!áá7á0á)á"ááá ááÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááü áõ áî áç áà áÙ áÒ áË áÄ á½ á¶ á¯ á¨ á¡ áš á“ áŒ á… á~ áw áp ái áb á[ áT áM áF á? á8 á1 á* á# á á á á á áù áò áë áä áÝ áÖ áÏ áÈ áÁ Ạ᳠ᬠᥠហᗠá በႠá{ át ám áf á_ áX áQ áJ áC á< á5 á. á' á á á á á áý áö áï áè áá áÚ áÓ áÌ áŠᾠᷠᰠ᩠ᢠᛠᔠá ᆠá áx áq áj ác á\ áU áN áG á@ á9 á2 á+ á$ á á á á á áú áó áì áå áÞ á× áÐ áÉ á á» ᴠ᭠ᦠ០ᘠᑠአრá| áu án ág á` áY áR áK áD á= á6 á/ á( á! á á á á áþ á÷ áð áé áâ áÛ áÔ áÍ áÆ á¿ á¸ á± áª á£ áœ á• áŽ á‡ á€ áy ár ák ád á] áV áO áH áA á: á3 á, á% á á á á á áûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüÿàõÿàîÿàçÿààÿàÙÿàÒÿàËÿàÄÿà½ÿà¶ÿà¯ÿà¨ÿà¡ÿàšÿà“ÿàŒÿà…ÿà~ÿàwÿàpÿàiÿàbÿà[ÿàTÿàMÿàFÿà?ÿà8ÿà1ÿà*ÿà#ÿàÿàÿàÿàÿàÿàùþàòþàëþàäþàÝþàÖþàÏþàÈþàÁþàºþà³þà¬þà¥þàžþà—þàþà‰þà‚þà{þàtþàmþàfþà_þàXþàQþàJþàCþà<þà5þà.þà'þà þàþàþà þàþàýýàöýàïýàèýàáýàÚýàÓýàÌýàÅýà¾ýà·ýà°ýà©ýà¢ýà›ýà”ýàýà†ýàýàxýàqýàjýàcýà\ýàUýàNýàGýà@ýà9ýà2ýà+ýà$ýàýàýàýàýàýàúüàóüàìüàåüàÞüà×üàÐüàÉüàÂüà»üà´üà­üà¦üàŸüà˜üà‘üàŠüàƒüà|üàuüànüàgüà`üàYüàRüàKüàDüà=üà6üà/üà(üà!üàüàüà üàüàþûà÷ûàðûàéûàâûàÛûàÔûàÍûàÆûà¿ûà¸ûà±ûàªûà£ûàœûà•ûàŽûà‡ûà€ûàyûàrûàkûàdûà]ûàVûàOûàHûàAûà:ûà3ûà,ûà%ûàûàûàûà ûàûàûúàôúàíúàæúàßúàØúàÑúàÊúàÃúà¼úàµúà®úà§úà úà™úà’úà‹úà„úà}úàvúàoúàhúàaúàZúàSúàLúàEúà>úà7úà0úà)úà"úàúàúà úàúàÿùàøùàñùàêùàãùàÜùàÕùàÎùàÇùàÀùà¹ùà²ùà«ùà¤ùàùà–ùàùàˆùàùàzùàsùàlùàeùà^ùàWùàPùàIùàBùà;ùà4ùà-ùà&ùàùàùàùà ùàùàüøàõøàîøàçøààøàÙøàÒøàËøàÄøà½øà¶øà¯øà¨øà¡øàšøà“øàŒøà…øà~øàwøàpøàiøàbøà[øàTøàMøàFøà?øà8øà1øà*øà#øàøàøàøàøàøàù÷àò÷àë÷àä÷àÝ÷àÖ÷àÏ÷àÈ÷àÁ÷àº÷à³÷à¬÷à¥÷àž÷à—÷à÷à‰÷à‚÷à{÷àt÷àm÷àf÷à_÷àX÷àQ÷àJ÷àC÷à<÷à5÷à.÷à'÷à ÷à÷à÷à ÷à÷àýöàööàïöàèöàáöàÚöàÓöàÌöàÅöà¾öà·öà°öà©öà¢öà›öà”öàöà†öàöàxöàqöàjöàcöà\öàUöàNöàGöà@öà9öà2öà+öà$öàöàöàöàöàöàúõàóõàìõàåõàÞõà×õàÐõàÉõàÂõà»õà´õà­õà¦õàŸõà˜õà‘õàŠõàƒõà|õàuõànõàgõà`õàYõàRõàKõàDõà=õà6õà/õà(õà!õàõàõà õàõàþôà÷ôàðôàéôàâôàÛôàÔôàÍôàÆôà¿ôà¸ôà±ôàªôà£ôàœôà•ôàŽôà‡ôà€ôàyôàrôàkôàdôà]ôàVôàOôàHôàAôà:ôà3ôà,ôà%ôàôàôàôà ôàôàûóàôóàíóàæóàßóàØóàÑóàÊóàÃóà¼óàµóà®óà§óà óà™óà’óà‹óà„óà}óàvóàoóàhóàaóàZóàSóàLóàEóà>óà7óà0óà)óà"óàóàóà óàóàÿòàøòàñòàêòàãòàÜòàÕòàÎòàÇòàÀòà¹òà²òà«òà¤òàòà–òàòàˆòàòàzòàsòàlòàeòà^òàWòàPòàIòàBòà;òà4òà-òà&òàòàòàòà òàòàüñàõñàîñàçñààñàÙñàÒñàËñàÄñà½ñà¶ñà¯ñà¨ñà¡ñàšñà“ñàŒñà…ñà~ñàwñàpñàiñàbñà[ñàTñàMñàFñà?ñà8ñà1ñà*ñà#ñàñàñàñàñàñàùðàòðàëðàäðàÝðàÖðàÏðàÈðàÁðàºðà³ðà¬ðà¥ðàžðà—ðàðà‰ðà‚ðà{ðàtðàmðàfðà_ðàXðàQðàJðàCðà<ðà5ðà.ðà'ðà ðàðàðà ðàðàýïàöïàïïàèïàáïàÚïàÓïàÌïàÅïà¾ïà·ïà°ïà©ïà¢ïà›ïà”ïàïà†ïàïàxïàqïàjïàcïà\ïàUïàNïàGïà@ïà9ïà2ïà+ïà$ïàïàïàïàïàïàúîàóîàìîàåîàÞîà×îàÐîàÉîàÂîà»îà´îà­îà¦îàŸîà˜îà‘îàŠîàƒîà|îàuîànîàgîà`îàYîàRîàKîàDîà=îà6îà/îà(îà!îàîàîà îàîàþíà÷íàðíàéíàâíàÛíàÔíàÍíàÆíà¿íà¸íà±íàªíà£íàœíà•íàŽíà‡íà€íàyíàríàkíàdíà]íàVíàOíàHíàAíà:íà3íà,íà%íàíàíàíà íàíàûìàôìàíìàæìàßìàØìàÑìàÊìàÃìà¼ìàµìà®ìà§ìà ìà™ìà’ìà‹ìà„ìà}ìàvìàoìàhìàaìàZìàSìàLìàEìà>ìà7ìà0ìà)ìà"ìàìàìà ìàìàÿëàøëàñëàêëàãëàÜëàÕëàÎëàÇëàÀëà¹ëà²ëà«ëà¤ëàëà–ëàëàˆëàëàzëàsëàlëàeëà^ëàWëàPëàIëàBëà;ëà4ëà-ëà&ëàëàëàëà ëàëàüêàõêàîêàçêààêàÙêàÒêàËêàÄêà½êà¶êà¯êà¨êà¡êàšêà“êàŒêà…êà~êàwêàpêàiêàbêà[êàTêàMêàFêà?êà8êà1êà*êà#êàêàêàêàêàêàùéàòéàëéàäéàÝéàÖéàÏéàÈéàÁéàºéà³éà¬éà¥éàžéà—éàéà‰éà‚éà{éàtéàméàféà_éàXéàQéàJéàCéà<éà5éà.éà'éà éàéàéà éàéàýèàöèàïèàèèàáèàÚèàÓèàÌèàÅèà¾èà·èà°èà©èà¢èà›èà”èàèà†èàèàxèàqèàjèàcèà\èàUèàNèàGèà@èà9èà2èà+èà$èàèàèàèàèàèàúçàóçàìçàåçàÞçà×çàÐçàÉçàÂçà»çà´çà­çà¦çàŸçà˜çà‘çàŠçàƒçà|çàuçànçàgçà`çàYçàRçàKçàDçà=çà6çà/çà(çà!çàçàçà çàçàþæà÷æàðæàéæàâæàÛæàÔæàÍæàÆæà¿æà¸æà±æàªæà£æàœæà•æàŽæà‡æà€æàyæàræàkæàdæà]æàVæàOæàHæàAæà:æà3æà,æà%æàæàæàæà æàæàûåàôåàíåàæåàßåàØåàÑåàÊåàÃåà¼åàµåà®åà§åà åà™åà’åà‹åà„åà}åàvåàoåàhåàaåàZåàSåàLåàEåà>åà7åà0åà)åà"åàåàåà åàåàÿäàøäàñäàêäàãäàÜäàÕäàÎäàÇäàÀäà¹äà²äà«äà¤äàäà–äàäàˆäàäàzäàsäàläàeäà^äàWäàPäàIäàBäà;äà4äà-äà&äàäàäàäà äàäàüãàõãàîãàçãààãàÙãàÒãàËãàÄãà½ãà¶ãà¯ãà¨ãà¡ãàšãà“ãàŒãà…ãà~ãàwãàpãàiãàbãà[ãàTãàMãàFãà?ãà8ãà1ãà*ãà#ãàãàãàãàãàãàùâàòâàëâàäâàÝâàÖâàÏâàÈâàÁâàºâà³âà¬âà¥âàžâà—âàâà‰âà‚âà{âàtâàmâàfâà_âàXâàQâàJâàCâà<âà5âà.âà'âà âàâàâà âàâàýáàöáàïáàèáàááàÚáàÓáàÌáàÅáà¾áà·áà°áà©áà¢áà›áà”áàáà†áàáàxáàqáàjáàcáà\áàUáàNáàGáà@áà9áà2áà+áà$áàáàáàáàáàáàúààóààìààåààÞàà×ààÐààÉààÂàà»àà´àà­àà¦ààŸàà˜àà‘ààŠààƒàà|ààuàànààgàà`ààYààRààKààDàà=àà6àà/àà(àà!àààààà ààààþßà÷ßàðßàéßàâßàÛßàÔßàÍßàÆßà¿ßà¸ßà±ßàªßà£ßàœßà•ßàŽßà‡ßà€ßàyßàrßàkßàdßà]ßàVßàOßàHßàAßà:ßà3ßà,ßà%ßàßàßàßà ßàßàûÞàôÞàíÞàæÞàßÞàØÞàÑÞàÊÞàÃÞà¼ÞàµÞà®Þà§Þà Þà™Þà’Þà‹Þà„Þà}ÞàvÞàoÞàhÞàaÞàZÞàSÞàLÞàEÞà>Þà7Þà0Þà)Þà"ÞàÞàÞà ÞàÞàÿÝàøÝàñÝàêÝàãÝàÜÝàÕÝàÎÝàÇÝàÀÝà¹Ýà²Ýà«Ýà¤ÝàÝà–ÝàÝàˆÝàÝàzÝàsÝàlÝàeÝà^ÝàWÝàPÝàIÝàBÝà;Ýà4Ýà-Ýà&ÝàÝàÝàÝà ÝàÝàüÜàõÜàîÜàçÜààÜàÙÜàÒÜàËÜàÄÜà½Üà¶Üà¯Üà¨Üà¡ÜàšÜà“ÜàŒÜà…Üà~ÜàwÜàpÜàiÜàbÜà[ÜàTÜàMÜàFÜà?Üà8Üà1Üà*Üà#ÜàÜàÜàÜàÜàÜàùÛàòÛàëÛàäÛàÝÛàÖÛàÏÛàÈÛàÁÛàºÛà³Ûà¬Ûà¥ÛàžÛà—ÛàÛà‰Ûà‚Ûà{ÛàtÛàmÛàfÛà_ÛàXÛàQÛàJÛàCÛà<Ûà5Ûà.Ûà'Ûà ÛàÛàÛà ÛàÛàýÚàöÚàïÚàèÚàáÚàÚÚàÓÚàÌÚàÅÚà¾Úà·Úà°Úà©Úà¢Úà›Úà”ÚàÚà†ÚàÚàxÚàqÚàjÚàcÚà\ÚàUÚàNÚàGÚà@Úà9Úà2Úà+Úà$ÚàÚàÚàÚàÚàÚàúÙàóÙàìÙàåÙàÞÙà×ÙàÐÙàÉÙàÂÙà»Ùà´Ùà­Ùà¦ÙàŸÙà˜Ùà‘ÙàŠÙàƒÙà|ÙàuÙànÙàgÙà`ÙàYÙàRÙàKÙàDÙà=Ùà6Ùà/Ùà(Ùà!ÙàÙàÙà ÙàÙàþØà÷ØàðØàéØàâØàÛØàÔØàÍØàÆØà¿Øà¸Øà±ØàªØà£ØàœØà•ØàŽØà‡Øà€ØàyØàrØàkØàdØà]ØàVØàOØàHØàAØà:Øà3Øà,Øà%ØàØàØàØà ØàØàû×àô×àí×àæ×àß×àØ×àÑ×àÊ×àÃ×à¼×àµ×à®×à§×à ×à™×à’×à‹×à„×à}×àv×ào×àh×àa×àZ×àS×àL×àE×à>×à7×à0×à)×à"×à×à×à ×à×àÿÖàøÖàñÖàêÖàãÖàÜÖàÕÖàÎÖàÇÖàÀÖà¹Öà²Öà«Öà¤ÖàÖà–ÖàÖàˆÖàÖàzÖàsÖàlÖàeÖà^ÖàWÖàPÖàIÖàBÖà;Öà4Öà-Öà&ÖàÖàÖàÖà ÖàÖàüÕàõÕàîÕàçÕààÕàÙÕàÒÕàËÕàÄÕà½Õà¶Õà¯Õà¨Õà¡ÕàšÕà“ÕàŒÕà…Õà~ÕàwÕàpÕàiÕàbÕà[ÕàTÕàMÕàFÕà?Õà8Õà1Õà*Õà#ÕàÕàÕàÕàÕàÕàùÔàòÔàëÔàäÔàÝÔàÖÔàÏÔàÈÔàÁÔàºÔà³Ôà¬Ôà¥ÔàžÔà—ÔàÔà‰Ôà‚Ôà{ÔàtÔàmÔàfÔà_ÔàXÔàQÔàJÔàCÔà<Ôà5Ôà.Ôà'Ôà ÔàÔàÔà ÔàÔàýÓàöÓàïÓàèÓàáÓàÚÓàÓÓàÌÓàÅÓà¾Óà·Óà°Óà©Óà¢Óà›Óà”ÓàÓà†ÓàÓàxÓàqÓàjÓàcÓà\ÓàUÓàNÓàGÓà@Óà9Óà2Óà+Óà$ÓàÓàÓàÓàÓàÓàúÒàóÒàìÒàåÒàÞÒà×ÒàÐÒàÉÒàÂÒà»Òà´Òà­Òà¦ÒàŸÒà˜Òà‘ÒàŠÒàƒÒà|ÒàuÒànÒàgÒà`ÒàYÒàRÒàKÒàDÒà=Òà6Òà/Òà(Òà!ÒàÒàÒà ÒàÒàþÑà÷ÑàðÑàéÑàâÑàÛÑàÔÑàÍÑàÆÑà¿Ñà¸Ñà±ÑàªÑà£ÑàœÑà•ÑàŽÑà‡Ñà€ÑàyÑàrÑàkÑàdÑà]ÑàVÑàOÑàHÑàAÑà:Ñà3Ñà,Ñà%ÑàÑàÑàÑà ÑàÑàûÐàôÐàíÐàæÐàßÐàØÐàÑÐàÊÐàÃÐà¼ÐàµÐà®Ðà§Ðà Ðà™Ðà’Ðà‹Ðà„Ðà}ÐàvÐàoÐàhÐàaÐàZÐàSÐàLÐàEÐà>Ðà7Ðà0Ðà)Ðà"ÐàÐàÐà ÐàÐàÿÏàøÏàñÏàêÏàãÏàÜÏàÕÏàÎÏàÇÏàÀÏà¹Ïà²Ïà«Ïà¤ÏàÏà–ÏàÏàˆÏàÏàzÏàsÏàlÏàeÏà^ÏàWÏàPÏàIÏàBÏà;Ïà4Ïà-Ïà&ÏàÏàÏàÏà ÏàÏàüÎàõÎàîÎàçÎààÎàÙÎàÒÎàËÎàÄÎà½Îà¶Îà¯Îà¨Îà¡ÎàšÎà“ÎàŒÎà…Îà~ÎàwÎàpÎàiÎàbÎà[ÎàTÎàMÎàFÎà?Îà8Îà1Îà*Îà#ÎàÎàÎàÎàÎàÎàùÍàòÍàëÍàäÍàÝÍàÖÍàÏÍàÈÍàÁÍàºÍà³Íà¬Íà¥ÍàžÍà—ÍàÍà‰Íà‚Íà{ÍàtÍàmÍàfÍà_ÍàXÍàQÍàJÍàCÍà<Íà5Íà.Íà'Íà ÍàÍàÍà ÍàÍàýÌàöÌàïÌàèÌàáÌàÚÌàÓÌàÌÌàÅÌà¾Ìà·Ìà°Ìà©Ìà¢Ìà›Ìà”ÌàÌà†ÌàÌàxÌàqÌàjÌàcÌà\ÌàUÌàNÌàGÌà@Ìà9Ìà2Ìà+Ìà$ÌàÌàÌàÌàÌàÌàúËàóËàìËàåËàÞËà×ËàÐËàÉËàÂËà»Ëà´Ëà­Ëà¦ËàŸËà˜Ëà‘ËàŠËàƒËà|ËàuËànËàgËà`ËàYËàRËàKËàDËà=Ëà6Ëà/Ëà(Ëà!ËàËàËà ËàËàþÊà÷ÊàðÊàéÊàâÊàÛÊàÔÊàÍÊàÆÊà¿Êà¸Êà±ÊàªÊà£ÊàœÊà•ÊàŽÊà‡Êà€ÊàyÊàrÊàkÊàdÊà]ÊàVÊàOÊàHÊàAÊà:Êà3Êà,Êà%ÊàÊàÊàÊà ÊàÊàûÉàôÉàíÉàæÉàßÉàØÉàÑÉàÊÉàÃÉà¼ÉàµÉà®Éà§Éà Éà™Éà’Éà‹Éà„Éà}ÉàvÉàoÉàhÉàaÉàZÉàSÉàLÉàEÉà>Éà7Éà0Éà)Éà"ÉàÉàÉà ÉàÉàÿÈàøÈàñÈàêÈàãÈàÜÈàÕÈàÎÈàÇÈàÀÈà¹Èà²Èà«Èà¤ÈàÈà–ÈàÈàˆÈàÈàzÈàsÈàlÈàeÈà^ÈàWÈàPÈàIÈàBÈà;Èà4Èà-Èà&ÈàÈàÈàÈà ÈàÈàüÇàõÇàîÇàçÇààÇàÙÇàÒÇàËÇàÄÇà½Çà¶Çà¯Çà¨Çà¡ÇàšÇà“ÇàŒÇà…Çà~ÇàwÇàpÇàiÇàbÇà[ÇàTÇàMÇàFÇà?Çà8Çà1Çà*Çà#ÇàÇàÇàÇàÇàÇàùÆàòÆàëÆàäÆàÝÆàÖÆàÏÆàÈÆàÁÆàºÆà³Æà¬Æà¥ÆàžÆà—ÆàÆà‰Æà‚Æà{ÆàtÆàmÆàfÆà_ÆàXÆàQÆàJÆàCÆà<Æà5Æà.Æà'Æà ÆàÆàÆà ÆàÆàýÅàöÅàïÅàèÅàáÅàÚÅàÓÅàÌÅàÅÅà¾Åà·Åà°Åà©Åà¢Åà›Åà”ÅàÅà†ÅàÅàxÅàqÅàjÅàcÅà\ÅàUÅàNÅàGÅà@Åà9Åà2Åà+Åà$ÅàÅàÅàÅàÅàÅàúÄàóÄàìÄàåÄàÞÄà×ÄàÐÄàÉÄàÂÄà»Äà´Äà­Äà¦ÄàŸÄà˜Äà‘ÄàŠÄàƒÄà|ÄàuÄànÄàgÄà`ÄàYÄàRÄàKÄàDÄà=Äà6Äà/Äà(Äà!ÄàÄàÄà ÄàÄàþÃà÷ÃàðÃàéÃàâÃàÛÃàÔÃàÍÃàÆÃà¿Ãà¸Ãà±ÃàªÃà£ÃàœÃà•ÃàŽÃà‡Ãà€ÃàyÃàrÃàkÃàdÃà]ÃàVÃàOÃàHÃàAÃà:Ãà3Ãà,Ãà%ÃàÃàÃàÃà ÃàÃàûÂàôÂàíÂàæÂàßÂàØÂàÑÂàÊÂàÃÂà¼ÂàµÂà®Âà§Âà Âà™Âà’Âà‹Âà„Âà}ÂàvÂàoÂàhÂàaÂàZÂàSÂàLÂàEÂà>Âà7Âà0Âà)Âà"ÂàÂàÂà ÂàÂàÿÁàøÁàñÁàêÁàãÁàÜÁàÕÁàÎÁàÇÁàÀÁà¹Áà²Áà«Áà¤ÁàÁà–ÁàÁàˆÁàÁàzÁàsÁàlÁàeÁà^ÁàWÁàPÁàIÁàBÁà;Áà4Áà-Áà&ÁàÁàÁàÁà ÁàÁàüÀàõÀàîÀàçÀààÀàÙÀàÒÀàËÀàÄÀà½Àà¶Àà¯Àà¨Àà¡ÀàšÀà“ÀàŒÀà…Àà~ÀàwÀàpÀàiÀàbÀà[ÀàTÀàMÀàFÀà?Àà8Àà1Àà*Àà#ÀàÀàÀàÀàÀàÀàù¿àò¿àë¿àä¿àÝ¿àÖ¿àÏ¿àÈ¿àÁ¿àº¿à³¿à¬¿à¥¿àž¿à—¿à¿à‰¿à‚¿à{¿àt¿àm¿àf¿à_¿àX¿àQ¿àJ¿àC¿à<¿à5¿à.¿à'¿à ¿à¿à¿à ¿à¿àý¾àö¾àï¾àè¾àá¾àÚ¾àÓ¾à̾àžà¾¾à·¾à°¾à©¾à¢¾à›¾à”¾à¾à†¾à¾àx¾àq¾àj¾àc¾à\¾àU¾àN¾àG¾à@¾à9¾à2¾à+¾à$¾à¾à¾à¾à¾à¾àú½àó½àì½àå½àÞ½à×½àнàɽà½à»½à´½à­½à¦½àŸ½à˜½à‘½àнàƒ½à|½àu½àn½àg½à`½àY½àR½àK½àD½à=½à6½à/½à(½à!½à½à½à ½à½àþ¼à÷¼àð¼àé¼àâ¼àÛ¼àÔ¼àͼàƼà¿¼à¸¼à±¼àª¼à£¼àœ¼à•¼à޼à‡¼à€¼ày¼àr¼àk¼àd¼à]¼àV¼àO¼àH¼àA¼à:¼à3¼à,¼à%¼à¼à¼à¼à ¼à¼àû»àô»àí»àæ»àß»àØ»àÑ»àÊ»àûà¼»àµ»à®»à§»à »à™»à’»à‹»à„»à}»àv»ào»àh»àa»àZ»àS»àL»àE»à>»à7»à0»à)»à"»à»à»à »à»àÿºàøºàñºàêºàãºàܺàÕºàκàǺàÀºà¹ºà²ºà«ºà¤ºàºà–ºàºàˆºàºàzºàsºàlºàeºà^ºàWºàPºàIºàBºà;ºà4ºà-ºà&ºàºàºàºà ºàºàü¹àõ¹àî¹àç¹àà¹àÙ¹àÒ¹à˹àĹà½¹à¶¹à¯¹à¨¹à¡¹àš¹à“¹àŒ¹à…¹à~¹àw¹àp¹ài¹àb¹à[¹àT¹àM¹àF¹à?¹à8¹à1¹à*¹à#¹à¹à¹à¹à¹à¹àù¸àò¸àë¸àä¸àݸàÖ¸àϸàȸàÁ¸àº¸à³¸à¬¸à¥¸àž¸à—¸à¸à‰¸à‚¸à{¸àt¸àm¸àf¸à_¸àX¸àQ¸àJ¸àC¸à<¸à5¸à.¸à'¸à ¸à¸à¸à ¸à¸àý·àö·àï·àè·àá·àÚ·àÓ·àÌ·àÅ·à¾·à··à°·à©·à¢·à›·à”·à·à†·à·àx·àq·àj·àc·à\·àU·àN·àG·à@·à9·à2·à+·à$·à·à·à·à·à·àú¶àó¶àì¶àå¶àÞ¶à×¶àжàɶà¶à»¶à´¶à­¶à¦¶àŸ¶à˜¶à‘¶àжàƒ¶à|¶àu¶àn¶àg¶à`¶àY¶àR¶àK¶àD¶à=¶à6¶à/¶à(¶à!¶à¶à¶à ¶à¶àþµà÷µàðµàéµàâµàÛµàÔµà͵àƵà¿µà¸µà±µàªµà£µàœµà•µà޵à‡µà€µàyµàrµàkµàdµà]µàVµàOµàHµàAµà:µà3µà,µà%µàµàµàµà µàµàû´àô´àí´àæ´àß´àØ´àÑ´àÊ´àôà¼´àµ´à®´à§´à ´à™´à’´à‹´à„´à}´àv´ào´àh´àa´àZ´àS´àL´àE´à>´à7´à0´à)´à"´à´à´à ´à´àÿ³àø³àñ³àê³àã³àܳàÕ³àγàdzàÀ³à¹³à²³à«³à¤³à³à–³à³àˆ³à³àz³às³àl³àe³à^³àW³àP³àI³àB³à;³à4³à-³à&³à³à³à³à ³à³àü²àõ²àî²àç²àà²àÙ²àÒ²à˲àIJà½²à¶²à¯²à¨²à¡²àš²à“²àŒ²à…²à~²àw²àp²ài²àb²à[²àT²àM²àF²à?²à8²à1²à*²à#²à²à²à²à²à²àù±àò±àë±àä±àݱàÖ±àϱàȱàÁ±àº±à³±à¬±à¥±àž±à—±à±à‰±à‚±à{±àt±àm±àf±à_±àX±àQ±àJ±àC±à<±à5±à.±à'±à ±à±à±à ±à±àý°àö°àï°àè°àá°àÚ°àÓ°à̰àŰà¾°à·°à°°à©°à¢°à›°à”°à°à†°à°àx°àq°àj°àc°à\°àU°àN°àG°à@°à9°à2°à+°à$°à°à°à°à°à°àú¯àó¯àì¯àå¯àÞ¯àׯàЯàɯà¯à»¯à´¯à­¯à¦¯àŸ¯à˜¯à‘¯àНàƒ¯à|¯àu¯àn¯àg¯à`¯àY¯àR¯àK¯àD¯à=¯à6¯à/¯à(¯à!¯à¯à¯à ¯à¯àþ®à÷®àð®àé®àâ®àÛ®àÔ®àÍ®àÆ®à¿®à¸®à±®àª®à£®àœ®à•®àŽ®à‡®à€®ày®àr®àk®àd®à]®àV®àO®àH®àA®à:®à3®à,®à%®à®à®à®à ®à®àû­àô­àí­àæ­àß­àØ­àÑ­àÊ­àíà¼­àµ­à®­à§­à ­à™­à’­à‹­à„­à}­àv­ào­àh­àa­àZ­àS­àL­àE­à>­à7­à0­à)­à"­à­à­à ­à­àÿ¬àø¬àñ¬àê¬àã¬àܬàÕ¬àάàǬàÀ¬à¹¬à²¬à«¬à¤¬à¬à–¬à¬àˆ¬à¬àz¬às¬àl¬àe¬à^¬àW¬àP¬àI¬àB¬à;¬à4¬à-¬à&¬à¬à¬à¬à ¬à¬àü«àõ«àî«àç«àà«àÙ«àÒ«àË«àÄ«à½«à¶«à¯«à¨«à¡«àš«à“«àŒ«à…«à~«àw«àp«ài«àb«à[«àT«àM«àF«à?«à8«à1«à*«à#«à«à«à«à«à«àùªàòªàëªàäªàݪàÖªàϪàȪàÁªàºªà³ªà¬ªà¥ªàžªà—ªàªà‰ªà‚ªà{ªàtªàmªàfªà_ªàXªàQªàJªàCªà<ªà5ªà.ªà'ªà ªàªàªà ªàªàý©àö©àï©àè©àá©àÚ©àÓ©àÌ©àÅ©à¾©à·©à°©à©©à¢©à›©à”©à©à†©à©àx©àq©àj©àc©à\©àU©àN©àG©à@©à9©à2©à+©à$©à©à©à©à©à©àú¨àó¨àì¨àå¨àÞ¨àרàШàɨà¨à»¨à´¨à­¨à¦¨àŸ¨à˜¨à‘¨àЍàƒ¨à|¨àu¨àn¨àg¨à`¨àY¨àR¨àK¨àD¨à=¨à6¨à/¨à(¨à!¨à¨à¨à ¨à¨àþ§à÷§àð§àé§àâ§àÛ§àÔ§àͧàƧà¿§à¸§à±§àª§à£§àœ§à•§àާà‡§à€§ày§àr§àk§àd§à]§àV§àO§àH§àA§à:§à3§à,§à%§à§à§à§à §à§àû¦àô¦àí¦àæ¦àߦàئàѦàʦàæà¼¦àµ¦à®¦à§¦à ¦à™¦à’¦à‹¦à„¦à}¦àv¦ào¦àh¦àa¦àZ¦àS¦àL¦àE¦à>¦à7¦à0¦à)¦à"¦à¦à¦à ¦à¦àÿ¥àø¥àñ¥àê¥àã¥àÜ¥àÕ¥àÎ¥àÇ¥àÀ¥à¹¥à²¥à«¥à¤¥à¥à–¥à¥àˆ¥à¥àz¥às¥àl¥àe¥à^¥àW¥àP¥àI¥àB¥à;¥à4¥à-¥à&¥à¥à¥à¥à ¥à¥àü¤àõ¤àî¤àç¤àà¤àÙ¤àÒ¤àˤàĤà½¤à¶¤à¯¤à¨¤à¡¤àš¤à“¤àŒ¤à…¤à~¤àw¤àp¤ài¤àb¤à[¤àT¤àM¤àF¤à?¤à8¤à1¤à*¤à#¤à¤à¤à¤à¤à¤àù£àò£àë£àä£àÝ£àÖ£àÏ£àÈ£àÁ£àº£à³£à¬£à¥£àž£à—£à£à‰£à‚£à{£àt£àm£àf£à_£àX£àQ£àJ£àC£à<£à5£à.£à'£à £à£à£à £à£àý¢àö¢àï¢àè¢àá¢àÚ¢àÓ¢àÌ¢àÅ¢à¾¢à·¢à°¢à©¢à¢¢à›¢à”¢à¢à†¢à¢àx¢àq¢àj¢àc¢à\¢àU¢àN¢àG¢à@¢à9¢à2¢à+¢à$¢à¢à¢à¢à¢à¢àú¡àó¡àì¡àå¡àÞ¡àסàСàÉ¡à¡à»¡à´¡à­¡à¦¡àŸ¡à˜¡à‘¡àŠ¡àƒ¡à|¡àu¡àn¡àg¡à`¡àY¡àR¡àK¡àD¡à=¡à6¡à/¡à(¡à!¡à¡à¡à ¡à¡àþ à÷ àð àé àâ àÛ àÔ àÍ àÆ à¿ à¸ à± àª à£ àœ à• àŽ à‡ à€ ày àr àk àd à] àV àO àH àA à: à3 à, à% à à à à  à àûŸàôŸàíŸàæŸàߟàØŸàÑŸàÊŸàßà¼ŸàµŸà®Ÿà§Ÿà Ÿà™Ÿà’Ÿà‹Ÿà„Ÿà}ŸàvŸàoŸàhŸàaŸàZŸàSŸàLŸàEŸà>Ÿà7Ÿà0Ÿà)Ÿà"ŸàŸàŸà ŸàŸàÿžàøžàñžàêžàãžàÜžàÕžàΞàÇžàÀžà¹žà²žà«žà¤žàžà–žàžàˆžàžàzžàsžàlžàežà^žàWžàPžàIžàBžà;žà4žà-žà&žàžàžàžà žàžàüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùœàòœàëœàäœàÝœàÖœàÏœàÈœàÁœàºœà³œà¬œà¥œàžœà—œàœà‰œà‚œà{œàtœàmœàfœà_œàXœàQœàJœàCœà<œà5œà.œà'œà œàœàœà œàœàý›àö›àï›àè›àá›àÚ›àÓ›àÌ›àÅ›à¾›à·›à°›à©›à¢›à››à”›à›à†›à›àx›àq›àj›àc›à\›àU›àN›àG›à@›à9›à2›à+›à$›à›à›à›à›à›àúšàóšàìšàåšàÞšàךàКàÉšàšà»šà´šà­šà¦šàŸšà˜šà‘šàŠšàƒšà|šàušànšàgšà`šàYšàRšàKšàDšà=šà6šà/šà(šà!šàšàšà šàšàþ™à÷™àð™àé™àâ™àÛ™àÔ™àÍ™àÆ™à¿™à¸™à±™àª™à£™àœ™à•™àŽ™à‡™à€™ày™àr™àk™àd™à]™àV™àO™àH™àA™à:™à3™à,™à%™à™à™à™à ™à™àû˜àô˜àí˜àæ˜àߘàؘàјàʘàØà¼˜àµ˜à®˜à§˜à ˜à™˜à’˜à‹˜à„˜à}˜àv˜ào˜àh˜àa˜àZ˜àS˜àL˜àE˜à>˜à7˜à0˜à)˜à"˜à˜à˜à ˜à˜àÿ—àø—àñ—àê—àã—àÜ—àÕ—àΗàÇ—àÀ—๗ಗ૗गà—à–—à—àˆ—à—àz—às—àl—àe—à^—àW—àP—àI—àB—à;—à4—à-—à&—à—à—à—à —à—àü–àõ–àî–àç–àà–àÙ–àÒ–àË–àÄ–à½–à¶–à¯–à¨–à¡–àš–à“–àŒ–à…–à~–àw–àp–ài–àb–à[–àT–àM–àF–à?–à8–à1–à*–à#–à–à–à–à–à–àù•àò•àë•àä•àÝ•àÖ•àÏ•àÈ•àÁ•àº•à³•à¬•à¥•àž•à—•à•à‰•à‚•à{•àt•àm•àf•à_•àX•àQ•àJ•àC•à<•à5•à.•à'•à •à•à•à •à•àý”àö”àï”àè”àá”àÚ”àÓ”àÌ”àÅ”à¾”à·”à°”à©”à¢”à›”à””à”à†”à”àx”àq”àj”àc”à\”àU”àN”àG”à@”à9”à2”à+”à$”à”à”à”à”à”àú“àó“àì“àå“àÞ“àדàГàÉ“à“à»“à´“à­“à¦“àŸ“à˜“à‘“àŠ“àƒ“à|“àu“àn“àg“à`“àY“àR“àK“àD“à=“à6“à/“à(“à!“à“à“à “à“àþ’à÷’àð’àé’àâ’àÛ’àÔ’àÍ’àÆ’à¿’à¸’à±’àª’à£’àœ’à•’àŽ’à‡’à€’ày’àr’àk’àd’à]’àV’àO’àH’àA’à:’à3’à,’à%’à’à’à’à ’à’àû‘àô‘àí‘àæ‘àß‘àØ‘àÑ‘àÊ‘àÑà¼‘àµ‘à®‘à§‘à ‘à™‘à’‘à‹‘à„‘à}‘àv‘ào‘àh‘àa‘àZ‘àS‘àL‘àE‘à>‘à7‘à0‘à)‘à"‘à‘à‘à ‘à‘àÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùŽàòŽàëŽàäŽàÝŽàÖŽàÏŽàÈŽàÁŽàºŽà³Žà¬Žà¥ŽàžŽà—ŽàŽà‰Žà‚Žà{ŽàtŽàmŽàfŽà_ŽàXŽàQŽàJŽàCŽà<Žà5Žà.Žà'Žà ŽàŽàŽà ŽàŽàýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúŒàóŒàìŒàåŒàÞŒà׌àÐŒàÉŒàÂŒà»Œà´Œà­Œà¦ŒàŸŒà˜Œà‘ŒàŠŒàƒŒà|ŒàuŒànŒàgŒà`ŒàYŒàRŒàKŒàDŒà=Œà6Œà/Œà(Œà!ŒàŒàŒà ŒàŒàþ‹à÷‹àð‹àé‹àâ‹àÛ‹àÔ‹àÍ‹àÆ‹à¿‹à¸‹à±‹àª‹à£‹àœ‹à•‹àŽ‹à‡‹à€‹ày‹àr‹àk‹àd‹à]‹àV‹àO‹àH‹àA‹à:‹à3‹à,‹à%‹à‹à‹à‹à ‹à‹àûŠàôŠàíŠàæŠàߊàØŠàÑŠàÊŠàÊà¼ŠàµŠà®Šà§Šà Šà™Šà’Šà‹Šà„Šà}ŠàvŠàoŠàhŠàaŠàZŠàSŠàLŠàEŠà>Šà7Šà0Šà)Šà"ŠàŠàŠà ŠàŠàÿ‰àø‰àñ‰àê‰àã‰à܉àÕ‰àΉàljàÀ‰à¹‰à²‰à«‰à¤‰à‰à–‰à‰àˆ‰à‰àz‰às‰àl‰àe‰à^‰àW‰àP‰àI‰àB‰à;‰à4‰à-‰à&‰à‰à‰à‰à ‰à‰àüˆàõˆàîˆàçˆààˆàÙˆàÒˆàˈàĈà½ˆà¶ˆà¯ˆà¨ˆà¡ˆàšˆà“ˆàŒˆà…ˆà~ˆàwˆàpˆàiˆàbˆà[ˆàTˆàMˆàFˆà?ˆà8ˆà1ˆà*ˆà#ˆàˆàˆàˆàˆàˆàù‡àò‡àë‡àä‡à݇àÖ‡àχàȇàÁ‡àº‡à³‡à¬‡à¥‡àž‡à—‡à‡à‰‡à‚‡à{‡àt‡àm‡àf‡à_‡àX‡àQ‡àJ‡àC‡à<‡à5‡à.‡à'‡à ‡à‡à‡à ‡à‡àý†àö†àï†àè†àá†àÚ†àÓ†à̆àņà¾†à·†à°†à©†à¢†à›†à”†à†à††à†àx†àq†àj†àc†à\†àU†àN†àG†à@†à9†à2†à+†à$†à†à†à†à†à†àú…àó…àì…àå…àÞ…à×…àÐ…àÉ…àÂ…à»…à´…à­…à¦…àŸ…à˜…à‘…àŠ…àƒ…à|…àu…àn…àg…à`…àY…àR…àK…àD…à=…à6…à/…à(…à!…à…à…à …à…àþ„à÷„àð„àé„àâ„àÛ„àÔ„àÍ„àÆ„à¿„à¸„à±„àª„à£„àœ„à•„àŽ„à‡„à€„ày„àr„àk„àd„à]„àV„àO„àH„àA„à:„à3„à,„à%„à„à„à„à „à„àûƒàôƒàíƒàæƒà߃à؃àуàʃàÃà¼ƒàµƒà®ƒà§ƒà ƒà™ƒà’ƒà‹ƒà„ƒà}ƒàvƒàoƒàhƒàaƒàZƒàSƒàLƒàEƒà>ƒà7ƒà0ƒà)ƒà"ƒàƒàƒà ƒàƒàÿ‚àø‚àñ‚àê‚àã‚àÜ‚àÕ‚à΂àÇ‚àÀ‚โಂૂंà‚à–‚à‚àˆ‚à‚àz‚às‚àl‚àe‚à^‚àW‚àP‚àI‚àB‚à;‚à4‚à-‚à&‚à‚à‚à‚à ‚à‚àüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààù€àò€àë€àä€àÝ€àÖ€àÏ€àÈ€àÁ€àº€à³€à¬€à¥€àž€à—€à€à‰€à‚€à{€àt€àm€àf€à_€àX€àQ€àJ€àC€à<€à5€à.€à'€à €à€à€à €à€àýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààú~àó~àì~àå~àÞ~à×~àÐ~àÉ~àÂ~à»~à´~à­~à¦~àŸ~à˜~à‘~àŠ~àƒ~à|~àu~àn~àg~à`~àY~àR~àK~àD~à=~à6~à/~à(~à!~à~à~à ~à~àþ}à÷}àð}àé}àâ}àÛ}àÔ}àÍ}àÆ}à¿}à¸}à±}àª}à£}àœ}à•}àŽ}à‡}à€}ày}àr}àk}àd}à]}àV}àO}àH}àA}à:}à3}à,}à%}à}à}à}à }à}àû|àô|àí|àæ|àß|àØ|àÑ|àÊ|àÃ|à¼|àµ|à®|à§|à |à™|à’|à‹|à„|à}|àv|ào|àh|àa|àZ|àS|àL|àE|à>|à7|à0|à)|à"|à|à|à |à|àÿ{àø{àñ{àê{àã{àÜ{àÕ{àÎ{àÇ{àÀ{à¹{à²{à«{à¤{à{à–{à{àˆ{à{àz{às{àl{àe{à^{àW{àP{àI{àB{à;{à4{à-{à&{à{à{à{à {à{àüzàõzàîzàçzààzàÙzàÒzàËzàÄzà½zà¶zà¯zà¨zà¡zàšzà“zàŒzà…zà~zàwzàpzàizàbzà[zàTzàMzàFzà?zà8zà1zà*zà#zàzàzàzàzàzàùyàòyàëyàäyàÝyàÖyàÏyàÈyàÁyàºyà³yà¬yà¥yàžyà—yàyà‰yà‚yà{yàtyàmyàfyà_yàXyàQyàJyàCyàuà7uà0uà)uà"uàuàuà uàuàÿtàøtàñtàêtàãtàÜtàÕtàÎtàÇtàÀtà¹tà²tà«tà¤tàtà–tàtàˆtàtàztàstàltàetà^tàWtàPtàItàBtà;tà4tà-tà&tàtàtàtà tàtàüsàõsàîsàçsààsàÙsàÒsàËsàÄsà½sà¶sà¯sà¨sà¡sàšsà“sàŒsà…sà~sàwsàpsàisàbsà[sàTsàMsàFsà?sà8sà1sà*sà#sàsàsàsàsàsàùràòràëràäràÝràÖràÏràÈràÁràºrà³rà¬rà¥ràžrà—ràrà‰rà‚rà{ràtràmràfrà_ràXràQràJràCrànà7nà0nà)nà"nànànà nànàÿmàømàñmàêmàãmàÜmàÕmàÎmàÇmàÀmà¹mà²mà«mà¤màmà–màmàˆmàmàzmàsmàlmàemà^màWmàPmàImàBmà;mà4mà-mà&màmàmàmà màmàülàõlàîlàçlààlàÙlàÒlàËlàÄlà½là¶là¯là¨là¡làšlà“làŒlà…là~làwlàplàilàblà[làTlàMlàFlà?là8là1là*là#làlàlàlàlàlàùkàòkàëkàäkàÝkàÖkàÏkàÈkàÁkàºkà³kà¬kà¥kàžkà—kàkà‰kà‚kà{kàtkàmkàfkà_kàXkàQkàJkàCkàgà7gà0gà)gà"gàgàgà gàgàÿfàøfàñfàêfàãfàÜfàÕfàÎfàÇfàÀfà¹fà²fà«fà¤fàfà–fàfàˆfàfàzfàsfàlfàefà^fàWfàPfàIfàBfà;fà4fà-fà&fàfàfàfà fàfàüeàõeàîeàçeààeàÙeàÒeàËeàÄeà½eà¶eà¯eà¨eà¡eàšeà“eàŒeà…eà~eàweàpeàieàbeà[eàTeàMeàFeà?eà8eà1eà*eà#eàeàeàeàeàeàùdàòdàëdàädàÝdàÖdàÏdàÈdàÁdàºdà³dà¬dà¥dàždà—dàdà‰dà‚dà{dàtdàmdàfdà_dàXdàQdàJdàCdà`à7`à0`à)`à"`à`à`à `à`àÿ_àø_àñ_àê_àã_àÜ_àÕ_àÎ_àÇ_àÀ_à¹_à²_à«_à¤_à_à–_à_àˆ_à_àz_às_àl_àe_à^_àW_àP_àI_àB_à;_à4_à-_à&_à_à_à_à _à_àü^àõ^àî^àç^àà^àÙ^àÒ^àË^àÄ^à½^à¶^à¯^à¨^à¡^àš^à“^àŒ^à…^à~^àw^àp^ài^àb^à[^àT^àM^àF^à?^à8^à1^à*^à#^à^à^à^à^à^àù]àò]àë]àä]àÝ]àÖ]àÏ]àÈ]àÁ]àº]à³]à¬]à¥]àž]à—]à]à‰]à‚]à{]àt]àm]àf]à_]àX]àQ]àJ]àC]à<]à5]à.]à']à ]à]à]à ]à]àý\àö\àï\àè\àá\àÚ\àÓ\àÌ\àÅ\à¾\à·\à°\à©\à¢\à›\à”\à\à†\à\àx\àq\àj\àc\à\\àU\àN\àG\à@\à9\à2\à+\à$\à\à\à\à\à\àú[àó[àì[àå[àÞ[à×[àÐ[àÉ[àÂ[à»[à´[à­[à¦[àŸ[à˜[à‘[àŠ[àƒ[à|[àu[àn[àg[à`[àY[àR[àK[àD[à=[à6[à/[à([à![à[à[à [à[àþZà÷ZàðZàéZàâZàÛZàÔZàÍZàÆZà¿Zà¸Zà±ZàªZà£ZàœZà•ZàŽZà‡Zà€ZàyZàrZàkZàdZà]ZàVZàOZàHZàAZà:Zà3Zà,Zà%ZàZàZàZà ZàZàûYàôYàíYàæYàßYàØYàÑYàÊYàÃYà¼YàµYà®Yà§Yà Yà™Yà’Yà‹Yà„Yà}YàvYàoYàhYàaYàZYàSYàLYàEYà>Yà7Yà0Yà)Yà"YàYàYà YàYàÿXàøXàñXàêXàãXàÜXàÕXàÎXàÇXàÀXà¹Xà²Xà«Xà¤XàXà–XàXàˆXàXàzXàsXàlXàeXà^XàWXàPXàIXàBXà;Xà4Xà-Xà&XàXàXàXà XàXàüWàõWàîWàçWààWàÙWàÒWàËWàÄWà½Wà¶Wà¯Wà¨Wà¡WàšWà“WàŒWà…Wà~WàwWàpWàiWàbWà[WàTWàMWàFWà?Wà8Wà1Wà*Wà#WàWàWàWàWàWàùVàòVàëVàäVàÝVàÖVàÏVàÈVàÁVàºVà³Và¬Và¥VàžVà—VàVà‰Và‚Và{VàtVàmVàfVà_VàXVàQVàJVàCVàRà7Rà0Rà)Rà"RàRàRà RàRàÿQàøQàñQàêQàãQàÜQàÕQàÎQàÇQàÀQà¹Qà²Qà«Qà¤QàQà–QàQàˆQàQàzQàsQàlQàeQà^QàWQàPQàIQàBQà;Qà4Qà-Qà&QàQàQàQà QàQàüPàõPàîPàçPààPàÙPàÒPàËPàÄPà½Pà¶Pà¯Pà¨Pà¡PàšPà“PàŒPà…Pà~PàwPàpPàiPàbPà[PàTPàMPàFPà?Pà8Pà1Pà*Pà#PàPàPàPàPàPàùOàòOàëOàäOàÝOàÖOàÏOàÈOàÁOàºOà³Oà¬Oà¥OàžOà—OàOà‰Oà‚Oà{OàtOàmOàfOà_OàXOàQOàJOàCOàKà7Kà0Kà)Kà"KàKàKà KàKàÿJàøJàñJàêJàãJàÜJàÕJàÎJàÇJàÀJà¹Jà²Jà«Jà¤JàJà–JàJàˆJàJàzJàsJàlJàeJà^JàWJàPJàIJàBJà;Jà4Jà-Jà&JàJàJàJà JàJàüIàõIàîIàçIààIàÙIàÒIàËIàÄIà½Ià¶Ià¯Ià¨Ià¡IàšIà“IàŒIà…Ià~IàwIàpIàiIàbIà[IàTIàMIàFIà?Ià8Ià1Ià*Ià#IàIàIàIàIàIàùHàòHàëHàäHàÝHàÖHàÏHàÈHàÁHàºHà³Hà¬Hà¥HàžHà—HàHà‰Hà‚Hà{HàtHàmHàfHà_HàXHàQHàJHàCHàDà7Dà0Dà)Dà"DàDàDà DàDàÿCàøCàñCàêCàãCàÜCàÕCàÎCàÇCàÀCà¹Cà²Cà«Cà¤CàCà–CàCàˆCàCàzCàsCàlCàeCà^CàWCàPCàICàBCà;Cà4Cà-Cà&CàCàCàCà CàCàüBàõBàîBàçBààBàÙBàÒBàËBàÄBà½Bà¶Bà¯Bà¨Bà¡BàšBà“BàŒBà…Bà~BàwBàpBàiBàbBà[BàTBàMBàFBà?Bà8Bà1Bà*Bà#BàBàBàBàBàBàùAàòAàëAàäAàÝAàÖAàÏAàÈAàÁAàºAà³Aà¬Aà¥AàžAà—AàAà‰Aà‚Aà{AàtAàmAàfAà_AàXAàQAàJAàCAàà÷>àð>àé>àâ>àÛ>àÔ>àÍ>àÆ>à¿>à¸>à±>àª>à£>àœ>à•>àŽ>à‡>à€>ày>àr>àk>àd>à]>àV>àO>àH>àA>à:>à3>à,>à%>à>à>à>à >à>àû=àô=àí=àæ=àß=àØ=àÑ=àÊ=àÃ=à¼=àµ=à®=à§=à =à™=à’=à‹=à„=à}=àv=ào=àh=àa=àZ=àS=àL=àE=à>=à7=à0=à)=à"=à=à=à =à=àÿ<àø<àñ<àê<àã<àÜ<àÕ<àÎ<àÇ<àÀ<à¹<à²<à«<à¤<à<à–<à<àˆ<à<àz<às<àl<àe<à^<àW<àP<àI<àB<à;<à4<à-<à&<à<à<à<à <à<àü;àõ;àî;àç;àà;àÙ;àÒ;àË;àÄ;à½;à¶;à¯;à¨;à¡;àš;à“;àŒ;à…;à~;àw;àp;ài;àb;à[;àT;àM;àF;à?;à8;à1;à*;à#;à;à;à;à;à;àù:àò:àë:àä:àÝ:àÖ:àÏ:àÈ:àÁ:àº:à³:à¬:à¥:àž:à—:à:à‰:à‚:à{:àt:àm:àf:à_:àX:àQ:àJ:àC:à<:à5:à.:à':à :à:à:à :à:àý9àö9àï9àè9àá9àÚ9àÓ9àÌ9àÅ9à¾9à·9à°9à©9à¢9à›9à”9à9à†9à9àx9àq9àj9àc9à\9àU9àN9àG9à@9à99à29à+9à$9à9à9à9à9à9àú8àó8àì8àå8àÞ8à×8àÐ8àÉ8àÂ8à»8à´8à­8à¦8àŸ8à˜8à‘8àŠ8àƒ8à|8àu8àn8àg8à`8àY8àR8àK8àD8à=8à68à/8à(8à!8à8à8à 8à8àþ7à÷7àð7àé7àâ7àÛ7àÔ7àÍ7àÆ7à¿7à¸7à±7àª7à£7àœ7à•7àŽ7à‡7à€7ày7àr7àk7àd7à]7àV7àO7àH7àA7à:7à37à,7à%7à7à7à7à 7à7àû6àô6àí6àæ6àß6àØ6àÑ6àÊ6àÃ6à¼6àµ6à®6à§6à 6à™6à’6à‹6à„6à}6àv6ào6àh6àa6àZ6àS6àL6àE6à>6à76à06à)6à"6à6à6à 6à6àÿ5àø5àñ5àê5àã5àÜ5àÕ5àÎ5àÇ5àÀ5à¹5à²5à«5à¤5à5à–5à5àˆ5à5àz5às5àl5àe5à^5àW5àP5àI5àB5à;5à45à-5à&5à5à5à5à 5à5àü4àõ4àî4àç4àà4àÙ4àÒ4àË4àÄ4à½4à¶4à¯4à¨4à¡4àš4à“4àŒ4à…4à~4àw4àp4ài4àb4à[4àT4àM4àF4à?4à84à14à*4à#4à4à4à4à4à4àù3àò3àë3àä3àÝ3àÖ3àÏ3àÈ3àÁ3àº3à³3à¬3à¥3àž3à—3à3à‰3à‚3à{3àt3àm3àf3à_3àX3àQ3àJ3àC3à<3à53à.3à'3à 3à3à3à 3à3àý2àö2àï2àè2àá2àÚ2àÓ2àÌ2àÅ2à¾2à·2à°2à©2à¢2à›2à”2à2à†2à2àx2àq2àj2àc2à\2àU2àN2àG2à@2à92à22à+2à$2à2à2à2à2à2àú1àó1àì1àå1àÞ1à×1àÐ1àÉ1àÂ1à»1à´1à­1à¦1àŸ1à˜1à‘1àŠ1àƒ1à|1àu1àn1àg1à`1àY1àR1àK1àD1à=1à61à/1à(1à!1à1à1à 1à1àþ0à÷0àð0àé0àâ0àÛ0àÔ0àÍ0àÆ0à¿0à¸0à±0àª0à£0àœ0à•0àŽ0à‡0à€0ày0àr0àk0àd0à]0àV0àO0àH0àA0à:0à30à,0à%0à0à0à0à 0à0àû/àô/àí/àæ/àß/àØ/àÑ/àÊ/àÃ/à¼/àµ/à®/à§/à /à™/à’/à‹/à„/à}/àv/ào/àh/àa/àZ/àS/àL/àE/à>/à7/à0/à)/à"/à/à/à /à/àÿ.àø.àñ.àê.àã.àÜ.àÕ.àÎ.àÇ.àÀ.à¹.à².à«.à¤.à.à–.à.àˆ.à.àz.às.àl.àe.à^.àW.àP.àI.àB.à;.à4.à-.à&.à.à.à.à .à.àü-àõ-àî-àç-àà-àÙ-àÒ-àË-àÄ-à½-à¶-à¯-à¨-à¡-àš-à“-àŒ-à…-à~-àw-àp-ài-àb-à[-àT-àM-àF-à?-à8-à1-à*-à#-à-à-à-à-à-àù,àò,àë,àä,àÝ,àÖ,àÏ,àÈ,àÁ,àº,à³,à¬,à¥,àž,à—,à,à‰,à‚,à{,àt,àm,àf,à_,àX,àQ,àJ,àC,à<,à5,à.,à',à ,à,à,à ,à,àý+àö+àï+àè+àá+àÚ+àÓ+àÌ+àÅ+à¾+à·+à°+à©+à¢+à›+à”+à+à†+à+àx+àq+àj+àc+à\+àU+àN+àG+à@+à9+à2+à++à$+à+à+à+à+à+àú*àó*àì*àå*àÞ*à×*àÐ*àÉ*àÂ*à»*à´*à­*à¦*àŸ*à˜*à‘*àŠ*àƒ*à|*àu*àn*àg*à`*àY*àR*àK*àD*à=*à6*à/*à(*à!*à*à*à *à*àþ)à÷)àð)àé)àâ)àÛ)àÔ)àÍ)àÆ)à¿)à¸)à±)àª)à£)àœ)à•)àŽ)à‡)à€)ày)àr)àk)àd)à])àV)àO)àH)àA)à:)à3)à,)à%)à)à)à)à )à)àû(àô(àí(àæ(àß(àØ(àÑ(àÊ(àÃ(à¼(àµ(à®(à§(à (à™(à’(à‹(à„(à}(àv(ào(àh(àa(àZ(àS(àL(àE(à>(à7(à0(à)(à"(à(à(à (à(àÿ'àø'àñ'àê'àã'àÜ'àÕ'àÎ'àÇ'àÀ'à¹'à²'à«'à¤'à'à–'à'àˆ'à'àz'às'àl'àe'à^'àW'àP'àI'àB'à;'à4'à-'à&'à'à'à'à 'à'àü&àõ&àî&àç&àà&àÙ&àÒ&àË&àÄ&à½&à¶&à¯&à¨&à¡&àš&à“&àŒ&à…&à~&àw&àp&ài&àb&à[&àT&àM&àF&à?&à8&à1&à*&à#&à&à&à&à&à&àù%àò%àë%àä%àÝ%àÖ%àÏ%àÈ%àÁ%àº%à³%à¬%à¥%àž%à—%à%à‰%à‚%à{%àt%àm%àf%à_%àX%àQ%àJ%àC%à<%à5%à.%à'%à %à%à%à %à%àý$àö$àï$àè$àá$àÚ$àÓ$àÌ$àÅ$à¾$à·$à°$à©$à¢$à›$à”$à$à†$à$àx$àq$àj$àc$à\$àU$àN$àG$à@$à9$à2$à+$à$$à$à$à$à$à$àú#àó#àì#àå#àÞ#à×#àÐ#àÉ#àÂ#à»#à´#à­#à¦#àŸ#à˜#à‘#àŠ#àƒ#à|#àu#àn#àg#à`#àY#àR#àK#àD#à=#à6#à/#à(#à!#à#à#à #à#àþ"à÷"àð"àé"àâ"àÛ"àÔ"àÍ"àÆ"à¿"à¸"à±"àª"à£"àœ"à•"àŽ"à‡"à€"ày"àr"àk"àd"à]"àV"àO"àH"àA"à:"à3"à,"à%"à"à"à"à "à"àû!àô!àí!àæ!àß!àØ!àÑ!àÊ!àÃ!à¼!àµ!à®!à§!à !à™!à’!à‹!à„!à}!àv!ào!àh!àa!àZ!àS!àL!àE!à>!à7!à0!à)!à"!à!à!à !à!àÿ àø àñ àê àã àÜ àÕ àÎ àÇ àÀ ๠ಠૠठà à– à àˆ à àz às àl àe à^ àW àP àI àB à; à4 à- à& à à à à à àüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþ à÷ àð àé àâ àÛ àÔ àÍ àÆ à¿ à¸ à± àª à£ àœ à• àŽ à‡ à€ ày àr àk àd à] àV àO àH àA à: à3 à, à% à à à à à àû àô àí àæ àß àØ àÑ àÊ àà à¼ àµ à® à§ à  à™ à’ à‹ à„ à} àv ào àh àa àZ àS àL àE à> à7 à0 à) à" à à à à àÿ àø àñ àê àã àÜ àÕ àÎ àÇ àÀ ๠ಠૠठà à– à àˆ à àz às àl àe à^ àW àP àI àB à; à4 à- à& à à à à à àü àõ àî àç àà àÙ àÒ àË àÄ à½ à¶ à¯ à¨ à¡ àš à“ àŒ à… à~ àw àp ài àb à[ àT àM àF à? à8 à1 à* à# à à à à à àù àò àë àä àÝ àÖ àÏ àÈ àÁ àº à³ à¬ à¥ àž à— à à‰ à‚ à{ àt àm àf à_ àX àQ àJ àC à< à5 à. à' à à à à à àýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþÿß÷ÿßðÿßéÿßâÿßÛÿßÔÿßÍÿ߯ÿß¿ÿ߸ÿß±ÿߪÿߣÿßœÿß•ÿߎÿ߇ÿ߀ÿßyÿßrÿßkÿßdÿß]ÿßVÿßOÿßHÿßAÿß:ÿß3ÿß,ÿß%ÿßÿßÿßÿß ÿßÿßûþßôþßíþßæþßßþߨþßÑþßÊþßÃþß¼þßµþß®þß§þß þß™þß’þß‹þß„þß}þßvþßoþßhþßaþßZþßSþßLþßEþß>þß7þß0þß)þß"þßþßþß þßþßÿýßøýßñýßêýßãýßÜýßÕýßÎýßÇýßÀýß¹ýß²ýß«ýߤýßýß–ýßý߈ýßýßzýßsýßlýßeýß^ýßWýßPýßIýßBýß;ýß4ýß-ýß&ýßýßýßýß ýßýßüüßõüßîüßçüßàüßÙüßÒüßËüßÄüß½üß¶ü߯üߨüß¡üßšüß“üߌüß…üß~üßwüßpüßiüßbüß[üßTüßMüßFüß?üß8üß1üß*üß#üßüßüßüßüßüßùûßòûßëûßäûßÝûßÖûßÏûßÈûßÁûߺûß³û߬ûߥûßžûß—ûßû߉ûß‚ûß{ûßtûßmûßfûß_ûßXûßQûßJûßCûß<ûß5ûß.ûß'ûß ûßûßûß ûßûßýúßöúßïúßèúßáúßÚúßÓúßÌúßÅúß¾úß·úß°úß©úߢúß›úß”úßú߆úßúßxúßqúßjúßcúß\úßUúßNúßGúß@úß9úß2úß+úß$úßúßúßúßúßúßúùßóùßìùßåùßÞùß×ùßÐùßÉùßÂùß»ùß´ùß­ùߦùߟùߘùß‘ùߊù߃ùß|ùßuùßnùßgùß`ùßYùßRùßKùßDùß=ùß6ùß/ùß(ùß!ùßùßùß ùßùßþøß÷øßðøßéøßâøßÛøßÔøßÍøßÆøß¿øß¸øß±øßªøß£øßœøß•øß޸߇øß€øßyøßrøßkøßdøß]øßVøßOøßHøßAøß:øß3øß,øß%øßøßøßøß øßøßû÷ßô÷ßí÷ßæ÷ßß÷ߨ÷ßÑ÷ßÊ÷ßÃ÷ß¼÷ßµ÷ß®÷ß§÷ß ÷ß™÷ß’÷ß‹÷ß„÷ß}÷ßv÷ßo÷ßh÷ßa÷ßZ÷ßS÷ßL÷ßE÷ß>÷ß7÷ß0÷ß)÷ß"÷ß÷ß÷ß ÷ß÷ßÿößøößñößêößãößÜößÕößÎößÇößÀöß¹öß²öß«öߤößöß–ößö߈ößößzößsößlößeöß^ößWößPößIößBöß;öß4öß-öß&ößößößöß ößößüõßõõßîõßçõßàõßÙõßÒõßËõßÄõß½õß¶õ߯õߨõß¡õßšõß“õߌõß…õß~õßwõßpõßiõßbõß[õßTõßMõßFõß?õß8õß1õß*õß#õßõßõßõßõßõßùôßòôßëôßäôßÝôßÖôßÏôßÈôßÁôߺôß³ô߬ôߥôßžôß—ôßô߉ôß‚ôß{ôßtôßmôßfôß_ôßXôßQôßJôßCôß<ôß5ôß.ôß'ôß ôßôßôß ôßôßýóßöóßïóßèóßáóßÚóßÓóßÌóßÅóß¾óß·óß°óß©óߢóß›óß”óßó߆óßóßxóßqóßjóßcóß\óßUóßNóßGóß@óß9óß2óß+óß$óßóßóßóßóßóßúòßóòßìòßåòßÞòß×òßÐòßÉòßÂòß»òß´òß­òߦòߟòߘòß‘òߊò߃òß|òßuòßnòßgòß`òßYòßRòßKòßDòß=òß6òß/òß(òß!òßòßòß òßòßþñß÷ñßðñßéñßâñßÛñßÔñßÍñ߯ñß¿ñ߸ñß±ñߪñߣñßœñß•ñߎñ߇ñ߀ñßyñßrñßkñßdñß]ñßVñßOñßHñßAñß:ñß3ñß,ñß%ñßñßñßñß ñßñßûðßôðßíðßæðßßðߨðßÑðßÊðßÃðß¼ðßµðß®ðß§ðß ðß™ðß’ðß‹ðß„ðß}ðßvðßoðßhðßaðßZðßSðßLðßEðß>ðß7ðß0ðß)ðß"ðßðßðß ðßðßÿïßøïßñïßêïßãïßÜïßÕïßÎïßÇïßÀïß¹ïß²ïß«ïߤïßïß–ïßï߈ïßïßzïßsïßlïßeïß^ïßWïßPïßIïßBïß;ïß4ïß-ïß&ïßïßïßïß ïßïßüîßõîßîîßçîßàîßÙîßÒîßËîßÄîß½îß¶î߯îߨîß¡îßšîß“îߌîß…îß~îßwîßpîßiîßbîß[îßTîßMîßFîß?îß8îß1îß*îß#îßîßîßîßîßîßùíßòíßëíßäíßÝíßÖíßÏíßÈíßÁíߺíß³í߬íߥíßžíß—íßí߉íß‚íß{íßtíßmíßfíß_íßXíßQíßJíßCíß<íß5íß.íß'íß íßíßíß íßíßýìßöìßïìßèìßáìßÚìßÓìßÌìßÅìß¾ìß·ìß°ìß©ìߢìß›ìß”ìßì߆ìßìßxìßqìßjìßcìß\ìßUìßNìßGìß@ìß9ìß2ìß+ìß$ìßìßìßìßìßìßúëßóëßìëßåëßÞëß×ëßÐëßÉëßÂëß»ëß´ëß­ëߦëߟëߘëß‘ëߊë߃ëß|ëßuëßnëßgëß`ëßYëßRëßKëßDëß=ëß6ëß/ëß(ëß!ëßëßëß ëßëßþêß÷êßðêßéêßâêßÛêßÔêßÍê߯êß¿ê߸êß±êߪêߣêßœêß•êߎê߇ê߀êßyêßrêßkêßdêß]êßVêßOêßHêßAêß:êß3êß,êß%êßêßêßêß êßêßûéßôéßíéßæéßßéߨéßÑéßÊéßÃéß¼éßµéß®éß§éß éß™éß’éß‹éß„éß}éßvéßoéßhéßaéßZéßSéßLéßEéß>éß7éß0éß)éß"éßéßéß éßéßÿèßøèßñèßêèßãèßÜèßÕèßÎèßÇèßÀèß¹èß²èß«èߤèßèß–èßè߈èßèßzèßsèßlèßeèß^èßWèßPèßIèßBèß;èß4èß-èß&èßèßèßèß èßèßüçßõçßîçßççßàçßÙçßÒçßËçßÄçß½çß¶ç߯çߨçß¡çßšçß“çߌçß…çß~çßwçßpçßiçßbçß[çßTçßMçßFçß?çß8çß1çß*çß#çßçßçßçßçßçßùæßòæßëæßäæßÝæßÖæßÏæßÈæßÁæßºæß³æß¬æß¥æßžæß—æßæß‰æß‚æß{æßtæßmæßfæß_æßXæßQæßJæßCæß<æß5æß.æß'æß æßæßæß æßæßýåßöåßïåßèåßáåßÚåßÓåßÌåßÅåß¾åß·åß°åß©åߢåß›åß”åßå߆åßåßxåßqåßjåßcåß\åßUåßNåßGåß@åß9åß2åß+åß$åßåßåßåßåßåßúäßóäßìäßåäßÞäß×äßÐäßÉäßÂäß»äß´äß­äߦäߟäߘäß‘äߊä߃äß|äßuäßnäßgäß`äßYäßRäßKäßDäß=äß6äß/äß(äß!äßäßäß äßäßþãß÷ãßðãßéãßâãßÛãßÔãßÍã߯ãß¿ã߸ãß±ãߪãߣãßœãß•ãߎã߇ã߀ãßyãßrãßkãßdãß]ãßVãßOãßHãßAãß:ãß3ãß,ãß%ãßãßãßãß ãßãßûâßôâßíâßæâßßâߨâßÑâßÊâßÃâß¼âßµâß®âß§âß âß™âß’âß‹âß„âß}âßvâßoâßhâßaâßZâßSâßLâßEâß>âß7âß0âß)âß"âßâßâß âßâßÿáßøáßñáßêáßãáßÜáßÕáßÎáßÇáßÀáß¹áß²áß«áߤáßáß–áßá߈áßáßzáßsáßláßeáß^áßWáßPáßIáßBáß;áß4áß-áß&áßáßáßáß áßáßüàßõàßîàßçàßààßÙàßÒàßËàßÄàß½àß¶à߯àߨàß¡àßšàß“àߌàß…àß~àßwàßpàßiàßbàß[àßTàßMàßFàß?àß8àß1àß*àß#àßàßàßàßàßàßùßßòßßëßßäßßÝßßÖßßÏßßÈßßÁßߺßß³ß߬ßߥßßžßß—ßßß߉ßß‚ßß{ßßtßßmßßfßß_ßßXßßQßßJßßCßß<ßß5ßß.ßß'ßß ßßßßßß ßßßßýÞßöÞßïÞßèÞßáÞßÚÞßÓÞßÌÞßÅÞß¾Þß·Þß°Þß©ÞߢÞß›Þß”ÞßÞ߆ÞßÞßxÞßqÞßjÞßcÞß\ÞßUÞßNÞßGÞß@Þß9Þß2Þß+Þß$ÞßÞßÞßÞßÞßÞßúÝßóÝßìÝßåÝßÞÝß×ÝßÐÝßÉÝßÂÝß»Ýß´Ýß­ÝߦÝߟÝߘÝß‘ÝߊÝ߃Ýß|ÝßuÝßnÝßgÝß`ÝßYÝßRÝßKÝßDÝß=Ýß6Ýß/Ýß(Ýß!ÝßÝßÝß ÝßÝßþÜß÷ÜßðÜßéÜßâÜßÛÜßÔÜßÍÜ߯Üß¿Ü߸Üß±ÜߪÜߣÜßœÜß•ÜߎÜ߇Ü߀ÜßyÜßrÜßkÜßdÜß]ÜßVÜßOÜßHÜßAÜß:Üß3Üß,Üß%ÜßÜßÜßÜß ÜßÜßûÛßôÛßíÛßæÛßßÛߨÛßÑÛßÊÛßÃÛß¼ÛßµÛß®Ûß§Ûß Ûß™Ûß’Ûß‹Ûß„Ûß}ÛßvÛßoÛßhÛßaÛßZÛßSÛßLÛßEÛß>Ûß7Ûß0Ûß)Ûß"ÛßÛßÛß ÛßÛßÿÚßøÚßñÚßêÚßãÚßÜÚßÕÚßÎÚßÇÚßÀÚß¹Úß²Úß«ÚߤÚßÚß–ÚßÚ߈ÚßÚßzÚßsÚßlÚßeÚß^ÚßWÚßPÚßIÚßBÚß;Úß4Úß-Úß&ÚßÚßÚßÚß ÚßÚßüÙßõÙßîÙßçÙßàÙßÙÙßÒÙßËÙßÄÙß½Ùß¶Ù߯ÙߨÙß¡ÙßšÙß“ÙߌÙß…Ùß~ÙßwÙßpÙßiÙßbÙß[ÙßTÙßMÙßFÙß?Ùß8Ùß1Ùß*Ùß#ÙßÙßÙßÙßÙßÙßùØßòØßëØßäØßÝØßÖØßÏØßÈØßÁØßºØß³Øß¬Øß¥ØßžØß—ØßØß‰Øß‚Øß{ØßtØßmØßfØß_ØßXØßQØßJØßCØß<Øß5Øß.Øß'Øß ØßØßØß ØßØßý×ßö×ßï×ßè×ßá×ßÚ×ßÓ×ßÌ×ßÅ×ß¾×ß·×ß°×ß©×ߢ×ß›×ß”×ß×߆×ß×ßx×ßq×ßj×ßc×ß\×ßU×ßN×ßG×ß@×ß9×ß2×ß+×ß$×ß×ß×ß×ß×ß×ßúÖßóÖßìÖßåÖßÞÖß×ÖßÐÖßÉÖßÂÖß»Öß´Öß­ÖߦÖߟÖߘÖß‘ÖߊÖ߃Öß|ÖßuÖßnÖßgÖß`ÖßYÖßRÖßKÖßDÖß=Öß6Öß/Öß(Öß!ÖßÖßÖß ÖßÖßþÕß÷ÕßðÕßéÕßâÕßÛÕßÔÕßÍÕ߯Õß¿Õ߸Õß±ÕߪÕߣÕßœÕß•ÕߎÕ߇Õ߀ÕßyÕßrÕßkÕßdÕß]ÕßVÕßOÕßHÕßAÕß:Õß3Õß,Õß%ÕßÕßÕßÕß ÕßÕßûÔßôÔßíÔßæÔßßÔߨÔßÑÔßÊÔßÃÔß¼ÔßµÔß®Ôß§Ôß Ôß™Ôß’Ôß‹Ôß„Ôß}ÔßvÔßoÔßhÔßaÔßZÔßSÔßLÔßEÔß>Ôß7Ôß0Ôß)Ôß"ÔßÔßÔß ÔßÔßÿÓßøÓßñÓßêÓßãÓßÜÓßÕÓßÎÓßÇÓßÀÓß¹Óß²Óß«ÓߤÓßÓß–ÓßÓ߈ÓßÓßzÓßsÓßlÓßeÓß^ÓßWÓßPÓßIÓßBÓß;Óß4Óß-Óß&ÓßÓßÓßÓß ÓßÓßüÒßõÒßîÒßçÒßàÒßÙÒßÒÒßËÒßÄÒß½Òß¶Ò߯ÒߨÒß¡ÒßšÒß“ÒߌÒß…Òß~ÒßwÒßpÒßiÒßbÒß[ÒßTÒßMÒßFÒß?Òß8Òß1Òß*Òß#ÒßÒßÒßÒßÒßÒßùÑßòÑßëÑßäÑßÝÑßÖÑßÏÑßÈÑßÁÑߺÑß³Ñ߬ÑߥÑßžÑß—ÑßÑ߉Ñß‚Ñß{ÑßtÑßmÑßfÑß_ÑßXÑßQÑßJÑßCÑß<Ñß5Ñß.Ñß'Ñß ÑßÑßÑß ÑßÑßýÐßöÐßïÐßèÐßáÐßÚÐßÓÐßÌÐßÅÐß¾Ðß·Ðß°Ðß©ÐߢÐß›Ðß”ÐßÐ߆ÐßÐßxÐßqÐßjÐßcÐß\ÐßUÐßNÐßGÐß@Ðß9Ðß2Ðß+Ðß$ÐßÐßÐßÐßÐßÐßúÏßóÏßìÏßåÏßÞÏß×ÏßÐÏßÉÏßÂÏß»Ïß´Ïß­ÏߦÏߟÏߘÏß‘ÏߊÏ߃Ïß|ÏßuÏßnÏßgÏß`ÏßYÏßRÏßKÏßDÏß=Ïß6Ïß/Ïß(Ïß!ÏßÏßÏß ÏßÏßþÎß÷ÎßðÎßéÎßâÎßÛÎßÔÎßÍÎ߯Îß¿Î߸Îß±ÎߪÎߣÎßœÎß•ÎߎÎ߇Î߀ÎßyÎßrÎßkÎßdÎß]ÎßVÎßOÎßHÎßAÎß:Îß3Îß,Îß%ÎßÎßÎßÎß ÎßÎßûÍßôÍßíÍßæÍßßÍߨÍßÑÍßÊÍßÃÍß¼ÍßµÍß®Íß§Íß Íß™Íß’Íß‹Íß„Íß}ÍßvÍßoÍßhÍßaÍßZÍßSÍßLÍßEÍß>Íß7Íß0Íß)Íß"ÍßÍßÍß ÍßÍßÿÌßøÌßñÌßêÌßãÌßÜÌßÕÌßÎÌßÇÌßÀÌß¹Ìß²Ìß«ÌߤÌßÌß–ÌßÌ߈ÌßÌßzÌßsÌßlÌßeÌß^ÌßWÌßPÌßIÌßBÌß;Ìß4Ìß-Ìß&ÌßÌßÌßÌß ÌßÌßüËßõËßîËßçËßàËßÙËßÒËßËËßÄËß½Ëß¶Ë߯ËߨËß¡ËßšËß“ËߌËß…Ëß~ËßwËßpËßiËßbËß[ËßTËßMËßFËß?Ëß8Ëß1Ëß*Ëß#ËßËßËßËßËßËßùÊßòÊßëÊßäÊßÝÊßÖÊßÏÊßÈÊßÁÊߺÊß³Ê߬ÊߥÊßžÊß—ÊßÊ߉Êß‚Êß{ÊßtÊßmÊßfÊß_ÊßXÊßQÊßJÊßCÊß<Êß5Êß.Êß'Êß ÊßÊßÊß ÊßÊßýÉßöÉßïÉßèÉßáÉßÚÉßÓÉßÌÉßÅÉß¾Éß·Éß°Éß©ÉߢÉß›Éß”ÉßÉ߆ÉßÉßxÉßqÉßjÉßcÉß\ÉßUÉßNÉßGÉß@Éß9Éß2Éß+Éß$ÉßÉßÉßÉßÉßÉßúÈßóÈßìÈßåÈßÞÈß×ÈßÐÈßÉÈßÂÈß»Èß´Èß­ÈߦÈߟÈߘÈß‘ÈߊÈ߃Èß|ÈßuÈßnÈßgÈß`ÈßYÈßRÈßKÈßDÈß=Èß6Èß/Èß(Èß!ÈßÈßÈß ÈßÈßþÇß÷ÇßðÇßéÇßâÇßÛÇßÔÇßÍÇ߯Çß¿Ç߸Çß±ÇߪÇߣÇßœÇß•ÇߎÇ߇Ç߀ÇßyÇßrÇßkÇßdÇß]ÇßVÇßOÇßHÇßAÇß:Çß3Çß,Çß%ÇßÇßÇßÇß ÇßÇßûÆßôÆßíÆßæÆß߯ߨÆßÑÆßÊÆßÃÆß¼ÆßµÆß®Æß§Æß Æß™Æß’Æß‹Æß„Æß}ÆßvÆßoÆßhÆßaÆßZÆßSÆßLÆßEÆß>Æß7Æß0Æß)Æß"ÆßÆßÆß ÆßÆßÿÅßøÅßñÅßêÅßãÅßÜÅßÕÅßÎÅßÇÅßÀÅß¹Åß²Åß«ÅߤÅßÅß–ÅßÅ߈ÅßÅßzÅßsÅßlÅßeÅß^ÅßWÅßPÅßIÅßBÅß;Åß4Åß-Åß&ÅßÅßÅßÅß ÅßÅßüÄßõÄßîÄßçÄßàÄßÙÄßÒÄßËÄßÄÄß½Äß¶Ä߯ÄߨÄß¡ÄßšÄß“ÄߌÄß…Äß~ÄßwÄßpÄßiÄßbÄß[ÄßTÄßMÄßFÄß?Äß8Äß1Äß*Äß#ÄßÄßÄßÄßÄßÄßùÃßòÃßëÃßäÃßÝÃßÖÃßÏÃßÈÃßÁÃߺÃß³Ã߬ÃߥÃßžÃß—ÃßÃ߉Ãß‚Ãß{ÃßtÃßmÃßfÃß_ÃßXÃßQÃßJÃßCÃß<Ãß5Ãß.Ãß'Ãß ÃßÃßÃß ÃßÃßýÂßöÂßïÂßèÂßáÂßÚÂßÓÂßÌÂßÅÂß¾Âß·Âß°Âß©ÂߢÂß›Âß”ÂßÂ߆ÂßÂßxÂßqÂßjÂßcÂß\ÂßUÂßNÂßGÂß@Âß9Âß2Âß+Âß$ÂßÂßÂßÂßÂßÂßúÁßóÁßìÁßåÁßÞÁß×ÁßÐÁßÉÁßÂÁß»Áß´Áß­ÁߦÁߟÁߘÁß‘ÁߊÁ߃Áß|ÁßuÁßnÁßgÁß`ÁßYÁßRÁßKÁßDÁß=Áß6Áß/Áß(Áß!ÁßÁßÁß ÁßÁßþÀß÷ÀßðÀßéÀßâÀßÛÀßÔÀßÍÀ߯Àß¿À߸Àß±ÀߪÀߣÀßœÀß•ÀߎÀ߇À߀ÀßyÀßrÀßkÀßdÀß]ÀßVÀßOÀßHÀßAÀß:Àß3Àß,Àß%ÀßÀßÀßÀß ÀßÀßû¿ßô¿ßí¿ßæ¿ßß¿ßØ¿ßÑ¿ßÊ¿ßÿß¼¿ßµ¿ß®¿ß§¿ß ¿ß™¿ß’¿ß‹¿ß„¿ß}¿ßv¿ßo¿ßh¿ßa¿ßZ¿ßS¿ßL¿ßE¿ß>¿ß7¿ß0¿ß)¿ß"¿ß¿ß¿ß ¿ß¿ßÿ¾ßø¾ßñ¾ßê¾ßã¾ßܾßÕ¾ßξßǾßÀ¾ß¹¾ß²¾ß«¾ß¤¾ß¾ß–¾ß¾ßˆ¾ß¾ßz¾ßs¾ßl¾ße¾ß^¾ßW¾ßP¾ßI¾ßB¾ß;¾ß4¾ß-¾ß&¾ß¾ß¾ß¾ß ¾ß¾ßü½ßõ½ßî½ßç½ßà½ßÙ½ßÒ½ß˽ßĽß½½ß¶½ß¯½ß¨½ß¡½ßš½ß“½ßŒ½ß…½ß~½ßw½ßp½ßi½ßb½ß[½ßT½ßM½ßF½ß?½ß8½ß1½ß*½ß#½ß½ß½ß½ß½ß½ßù¼ßò¼ßë¼ßä¼ßݼßÖ¼ßϼßȼßÁ¼ßº¼ß³¼ß¬¼ß¥¼ßž¼ß—¼ß¼ß‰¼ß‚¼ß{¼ßt¼ßm¼ßf¼ß_¼ßX¼ßQ¼ßJ¼ßC¼ß<¼ß5¼ß.¼ß'¼ß ¼ß¼ß¼ß ¼ß¼ßý»ßö»ßï»ßè»ßá»ßÚ»ßÓ»ßÌ»ßŻ߾»ß·»ß°»ß©»ß¢»ß›»ß”»ß»ß†»ß»ßx»ßq»ßj»ßc»ß\»ßU»ßN»ßG»ß@»ß9»ß2»ß+»ß$»ß»ß»ß»ß»ß»ßúºßóºßìºßåºßÞºß׺ßкßɺߺ߻ºß´ºß­ºß¦ºßŸºß˜ºß‘ºßŠºßƒºß|ºßuºßnºßgºß`ºßYºßRºßKºßDºß=ºß6ºß/ºß(ºß!ºßºßºß ºßºßþ¹ß÷¹ßð¹ßé¹ßâ¹ßÛ¹ßÔ¹ß͹ßƹß¿¹ß¸¹ß±¹ßª¹ß£¹ßœ¹ß•¹ß޹߇¹ß€¹ßy¹ßr¹ßk¹ßd¹ß]¹ßV¹ßO¹ßH¹ßA¹ß:¹ß3¹ß,¹ß%¹ß¹ß¹ß¹ß ¹ß¹ßû¸ßô¸ßí¸ßæ¸ß߸ßظßѸßʸßøß¼¸ßµ¸ß®¸ß§¸ß ¸ß™¸ß’¸ß‹¸ß„¸ß}¸ßv¸ßo¸ßh¸ßa¸ßZ¸ßS¸ßL¸ßE¸ß>¸ß7¸ß0¸ß)¸ß"¸ß¸ß¸ß ¸ß¸ßÿ·ßø·ßñ·ßê·ßã·ßÜ·ßÕ·ßηßÇ·ßÀ·ß¹·ß²·ß«·ß¤·ß·ß–·ß·ßˆ·ß·ßz·ßs·ßl·ße·ß^·ßW·ßP·ßI·ßB·ß;·ß4·ß-·ß&·ß·ß·ß·ß ·ß·ßü¶ßõ¶ßî¶ßç¶ßà¶ßÙ¶ßÒ¶ß˶ßĶß½¶ß¶¶ß¯¶ß¨¶ß¡¶ßš¶ß“¶ßŒ¶ß…¶ß~¶ßw¶ßp¶ßi¶ßb¶ß[¶ßT¶ßM¶ßF¶ß?¶ß8¶ß1¶ß*¶ß#¶ß¶ß¶ß¶ß¶ß¶ßùµßòµßëµßäµßݵßÖµßϵßȵßÁµßºµß³µß¬µß¥µßžµß—µßµß‰µß‚µß{µßtµßmµßfµß_µßXµßQµßJµßCµß<µß5µß.µß'µß µßµßµß µßµßý´ßö´ßï´ßè´ßá´ßÚ´ßÓ´ßÌ´ßÅ´ß¾´ß·´ß°´ß©´ß¢´ß›´ß”´ß´ß†´ß´ßx´ßq´ßj´ßc´ß\´ßU´ßN´ßG´ß@´ß9´ß2´ß+´ß$´ß´ß´ß´ß´ß´ßú³ßó³ßì³ßå³ßÞ³ß׳ßгßɳ߳߻³ß´³ß­³ß¦³ßŸ³ß˜³ß‘³ßг߃³ß|³ßu³ßn³ßg³ß`³ßY³ßR³ßK³ßD³ß=³ß6³ß/³ß(³ß!³ß³ß³ß ³ß³ßþ²ß÷²ßð²ßé²ßâ²ßÛ²ßÔ²ßͲßƲß¿²ß¸²ß±²ßª²ß£²ßœ²ß•²ß޲߇²ß€²ßy²ßr²ßk²ßd²ß]²ßV²ßO²ßH²ßA²ß:²ß3²ß,²ß%²ß²ß²ß²ß ²ß²ßû±ßô±ßí±ßæ±ßß±ßرßѱßʱßñß¼±ßµ±ß®±ß§±ß ±ß™±ß’±ß‹±ß„±ß}±ßv±ßo±ßh±ßa±ßZ±ßS±ßL±ßE±ß>±ß7±ß0±ß)±ß"±ß±ß±ß ±ß±ßÿ°ßø°ßñ°ßê°ßã°ßܰßÕ°ßΰßǰßÀ°ß¹°ß²°ß«°ß¤°ß°ß–°ß°ßˆ°ß°ßz°ßs°ßl°ße°ß^°ßW°ßP°ßI°ßB°ß;°ß4°ß-°ß&°ß°ß°ß°ß °ß°ßü¯ßõ¯ßî¯ßç¯ßà¯ßÙ¯ßÒ¯ß˯ßįß½¯ß¶¯ß¯¯ß¨¯ß¡¯ßš¯ß“¯ßŒ¯ß…¯ß~¯ßw¯ßp¯ßi¯ßb¯ß[¯ßT¯ßM¯ßF¯ß?¯ß8¯ß1¯ß*¯ß#¯ß¯ß¯ß¯ß¯ß¯ßù®ßò®ßë®ßä®ßÝ®ßÖ®ßÏ®ßÈ®ßÁ®ßº®ß³®ß¬®ß¥®ßž®ß—®ß®ß‰®ß‚®ß{®ßt®ßm®ßf®ß_®ßX®ßQ®ßJ®ßC®ß<®ß5®ß.®ß'®ß ®ß®ß®ß ®ß®ßý­ßö­ßï­ßè­ßá­ßÚ­ßÓ­ßÌ­ßÅ­ß¾­ß·­ß°­ß©­ß¢­ß›­ß”­ß­ß†­ß­ßx­ßq­ßj­ßc­ß\­ßU­ßN­ßG­ß@­ß9­ß2­ß+­ß$­ß­ß­ß­ß­ß­ßú¬ßó¬ßì¬ßå¬ßÞ¬ß׬ßЬßɬ߬߻¬ß´¬ß­¬ß¦¬ßŸ¬ß˜¬ß‘¬ßЬ߃¬ß|¬ßu¬ßn¬ßg¬ß`¬ßY¬ßR¬ßK¬ßD¬ß=¬ß6¬ß/¬ß(¬ß!¬ß¬ß¬ß ¬ß¬ßþ«ß÷«ßð«ßé«ßâ«ßÛ«ßÔ«ßÍ«ßÆ«ß¿«ß¸«ß±«ßª«ß£«ßœ«ß•«ßޫ߇«ß€«ßy«ßr«ßk«ßd«ß]«ßV«ßO«ßH«ßA«ß:«ß3«ß,«ß%«ß«ß«ß«ß «ß«ßûªßôªßíªßæªßߪßتßѪßʪßêß¼ªßµªß®ªß§ªß ªß™ªß’ªß‹ªß„ªß}ªßvªßoªßhªßaªßZªßSªßLªßEªß>ªß7ªß0ªß)ªß"ªßªßªß ªßªßÿ©ßø©ßñ©ßê©ßã©ßÜ©ßÕ©ßΩßÇ©ßÀ©ß¹©ß²©ß«©ß¤©ß©ß–©ß©ßˆ©ß©ßz©ßs©ßl©ße©ß^©ßW©ßP©ßI©ßB©ß;©ß4©ß-©ß&©ß©ß©ß©ß ©ß©ßü¨ßõ¨ßî¨ßç¨ßà¨ßÙ¨ßÒ¨ß˨ßĨß½¨ß¶¨ß¯¨ß¨¨ß¡¨ßš¨ß“¨ßŒ¨ß…¨ß~¨ßw¨ßp¨ßi¨ßb¨ß[¨ßT¨ßM¨ßF¨ß?¨ß8¨ß1¨ß*¨ß#¨ß¨ß¨ß¨ß¨ß¨ßù§ßò§ßë§ßä§ßݧßÖ§ßϧßȧßÁ§ßº§ß³§ß¬§ß¥§ßž§ß—§ß§ß‰§ß‚§ß{§ßt§ßm§ßf§ß_§ßX§ßQ§ßJ§ßC§ß<§ß5§ß.§ß'§ß §ß§ß§ß §ß§ßý¦ßö¦ßï¦ßè¦ßá¦ßÚ¦ßÓ¦ß̦ßŦß¾¦ß·¦ß°¦ß©¦ß¢¦ß›¦ß”¦ß¦ß†¦ß¦ßx¦ßq¦ßj¦ßc¦ß\¦ßU¦ßN¦ßG¦ß@¦ß9¦ß2¦ß+¦ß$¦ß¦ß¦ß¦ß¦ß¦ßú¥ßó¥ßì¥ßå¥ßÞ¥ß×¥ßÐ¥ßɥߥ߻¥ß´¥ß­¥ß¦¥ßŸ¥ß˜¥ß‘¥ßŠ¥ßƒ¥ß|¥ßu¥ßn¥ßg¥ß`¥ßY¥ßR¥ßK¥ßD¥ß=¥ß6¥ß/¥ß(¥ß!¥ß¥ß¥ß ¥ß¥ßþ¤ß÷¤ßð¤ßé¤ßâ¤ßÛ¤ßÔ¤ßͤßƤß¿¤ß¸¤ß±¤ßª¤ß£¤ßœ¤ß•¤ßޤ߇¤ß€¤ßy¤ßr¤ßk¤ßd¤ß]¤ßV¤ßO¤ßH¤ßA¤ß:¤ß3¤ß,¤ß%¤ß¤ß¤ß¤ß ¤ß¤ßû£ßô£ßí£ßæ£ßߣߨ£ßÑ£ßÊ£ßãß¼£ßµ£ß®£ß§£ß £ß™£ß’£ß‹£ß„£ß}£ßv£ßo£ßh£ßa£ßZ£ßS£ßL£ßE£ß>£ß7£ß0£ß)£ß"£ß£ß£ß £ß£ßÿ¢ßø¢ßñ¢ßê¢ßã¢ßÜ¢ßÕ¢ß΢ßÇ¢ßÀ¢ß¹¢ß²¢ß«¢ß¤¢ß¢ß–¢ß¢ßˆ¢ß¢ßz¢ßs¢ßl¢ße¢ß^¢ßW¢ßP¢ßI¢ßB¢ß;¢ß4¢ß-¢ß&¢ß¢ß¢ß¢ß ¢ß¢ßü¡ßõ¡ßî¡ßç¡ßà¡ßÙ¡ßÒ¡ßË¡ßġ߽¡ß¶¡ß¯¡ß¨¡ß¡¡ßš¡ß“¡ßŒ¡ß…¡ß~¡ßw¡ßp¡ßi¡ßb¡ß[¡ßT¡ßM¡ßF¡ß?¡ß8¡ß1¡ß*¡ß#¡ß¡ß¡ß¡ß¡ß¡ßù ßò ßë ßä ßÝ ßÖ ßÏ ßÈ ßÁ ßº ß³ ß¬ ß¥ ßž ß— ß ß‰ ß‚ ß{ ßt ßm ßf ß_ ßX ßQ ßJ ßC ß< ß5 ß. ß' ß  ß ß ß  ß ßýŸßöŸßïŸßèŸßáŸßÚŸßÓŸßÌŸßÅŸß¾Ÿß·Ÿß°Ÿß©Ÿß¢Ÿß›Ÿß”ŸßŸß†ŸßŸßxŸßqŸßjŸßcŸß\ŸßUŸßNŸßGŸß@Ÿß9Ÿß2Ÿß+Ÿß$ŸßŸßŸßŸßŸßŸßúžßóžßìžßåžßÞžßמßОßÉžßžß»žß´žß­žß¦žßŸžß˜žß‘žßŠžßƒžß|žßužßnžßgžß`žßYžßRžßKžßDžß=žß6žß/žß(žß!žßžßžß žßžßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûœßôœßíœßæœßßœßØœßÑœßÊœßÜß¼œßµœß®œß§œß œß™œß’œß‹œß„œß}œßvœßoœßhœßaœßZœßSœßLœßEœß>œß7œß0œß)œß"œßœßœß œßœßÿ›ßø›ßñ›ßê›ßã›ßÜ›ßÕ›ßΛßÇ›ßÀ›ß¹›ß²›ß«›ß¤›ß›ß–›ß›ßˆ›ß›ßz›ßs›ßl›ße›ß^›ßW›ßP›ßI›ßB›ß;›ß4›ß-›ß&›ß›ß›ß›ß ›ß›ßüšßõšßîšßçšßàšßÙšßÒšßËšßÄšß½šß¶šß¯šß¨šß¡šßššß“šßŒšß…šß~šßwšßpšßišßbšß[šßTšßMšßFšß?šß8šß1šß*šß#šßšßšßšßšßšßù™ßò™ßë™ßä™ßÝ™ßÖ™ßÏ™ßÈ™ßÁ™ßº™ß³™ß¬™ß¥™ßž™ß—™ß™ß‰™ß‚™ß{™ßt™ßm™ßf™ß_™ßX™ßQ™ßJ™ßC™ß<™ß5™ß.™ß'™ß ™ß™ß™ß ™ß™ßý˜ßö˜ßï˜ßè˜ßá˜ßÚ˜ßÓ˜ß̘ßŘß¾˜ß·˜ß°˜ß©˜ß¢˜ß›˜ß”˜ß˜ß†˜ß˜ßx˜ßq˜ßj˜ßc˜ß\˜ßU˜ßN˜ßG˜ß@˜ß9˜ß2˜ß+˜ß$˜ß˜ß˜ß˜ß˜ß˜ßú—ßó—ßì—ßå—ßÞ—ß×—ßЗßÉ—ß—ß»—ß´—ß­—ߦ—ߟ—ߘ—ß‘—ߊ—߃—ß|—ßu—ßn—ßg—ß`—ßY—ßR—ßK—ßD—ß=—ß6—ß/—ß(—ß!—ß—ß—ß —ß—ßþ–ß÷–ßð–ßé–ßâ–ßÛ–ßÔ–ßÍ–ßÆ–ß¿–߸–ß±–ߪ–ߣ–ßœ–ß•–ߎ–߇–߀–ßy–ßr–ßk–ßd–ß]–ßV–ßO–ßH–ßA–ß:–ß3–ß,–ß%–ß–ß–ß–ß –ß–ßû•ßô•ßí•ßæ•ßߕߨ•ßÑ•ßÊ•ßÕß¼•ßµ•ß®•ß§•ß •ß™•ß’•ß‹•ß„•ß}•ßv•ßo•ßh•ßa•ßZ•ßS•ßL•ßE•ß>•ß7•ß0•ß)•ß"•ß•ß•ß •ß•ßÿ”ßø”ßñ”ßê”ßã”ßÜ”ßÕ”ßΔßÇ”ßÀ”ß¹”ß²”ß«”ߤ”ߔߖ”ߔ߈”ß”ßz”ßs”ßl”ße”ß^”ßW”ßP”ßI”ßB”ß;”ß4”ß-”ß&”ß”ß”ß”ß ”ß”ßü“ßõ“ßî“ßç“ßà“ßÙ“ßÒ“ßË“ßē߽“ß¶“߯“ߨ“ß¡“ßš“ß““ߌ“ß…“ß~“ßw“ßp“ßi“ßb“ß[“ßT“ßM“ßF“ß?“ß8“ß1“ß*“ß#“ߓߓߓߓߓßù’ßò’ßë’ßä’ßÝ’ßÖ’ßÏ’ßÈ’ßÁ’ߺ’ß³’߬’ߥ’ßž’ß—’ߒ߉’ß‚’ß{’ßt’ßm’ßf’ß_’ßX’ßQ’ßJ’ßC’ß<’ß5’ß.’ß'’ß ’ß’ß’ß ’ß’ßý‘ßö‘ßï‘ßè‘ßá‘ßÚ‘ßÓ‘ßÌ‘ßő߾‘ß·‘ß°‘ß©‘ߢ‘ß›‘ß”‘ߑ߆‘ß‘ßx‘ßq‘ßj‘ßc‘ß\‘ßU‘ßN‘ßG‘ß@‘ß9‘ß2‘ß+‘ß$‘ߑߑߑߑߑßúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûŽßôŽßíŽßæŽßߎߨŽßÑŽßÊŽßÃŽß¼ŽßµŽß®Žß§Žß Žß™Žß’Žß‹Žß„Žß}ŽßvŽßoŽßhŽßaŽßZŽßSŽßLŽßEŽß>Žß7Žß0Žß)Žß"ŽßŽßŽß ŽßŽßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüŒßõŒßîŒßçŒßàŒßÙŒßÒŒßËŒßČ߽Œß¶Œß¯Œß¨Œß¡ŒßšŒß“ŒßŒŒß…Œß~ŒßwŒßpŒßiŒßbŒß[ŒßTŒßMŒßFŒß?Œß8Œß1Œß*Œß#ŒßŒßŒßŒßŒßŒßù‹ßò‹ßë‹ßä‹ßÝ‹ßÖ‹ßÏ‹ßÈ‹ßÁ‹ßº‹ß³‹ß¬‹ß¥‹ßž‹ß—‹ß‹ß‰‹ß‚‹ß{‹ßt‹ßm‹ßf‹ß_‹ßX‹ßQ‹ßJ‹ßC‹ß<‹ß5‹ß.‹ß'‹ß ‹ß‹ß‹ß ‹ß‹ßýŠßöŠßïŠßèŠßáŠßÚŠßÓŠßÌŠßÅŠß¾Šß·Šß°Šß©Šß¢Šß›Šß”ŠßŠß†ŠßŠßxŠßqŠßjŠßcŠß\ŠßUŠßNŠßGŠß@Šß9Šß2Šß+Šß$ŠßŠßŠßŠßŠßŠßú‰ßó‰ßì‰ßå‰ßÞ‰ß׉ßЉßɉ߉߻‰ß´‰ß­‰ß¦‰ßŸ‰ß˜‰ß‘‰ßЉßƒ‰ß|‰ßu‰ßn‰ßg‰ß`‰ßY‰ßR‰ßK‰ßD‰ß=‰ß6‰ß/‰ß(‰ß!‰ß‰ß‰ß ‰ß‰ßþˆß÷ˆßðˆßéˆßâˆßÛˆßÔˆß͈ßƈß¿ˆß¸ˆß±ˆßªˆß£ˆßœˆß•ˆßŽˆß‡ˆß€ˆßyˆßrˆßkˆßdˆß]ˆßVˆßOˆßHˆßAˆß:ˆß3ˆß,ˆß%ˆßˆßˆßˆß ˆßˆßû‡ßô‡ßí‡ßæ‡ß߇ß؇ßчßʇßÇß¼‡ßµ‡ß®‡ß§‡ß ‡ß™‡ß’‡ß‹‡ß„‡ß}‡ßv‡ßo‡ßh‡ßa‡ßZ‡ßS‡ßL‡ßE‡ß>‡ß7‡ß0‡ß)‡ß"‡ß‡ß‡ß ‡ß‡ßÿ†ßø†ßñ†ßê†ßã†ß܆ßÕ†ßΆßdžßÀ†ß¹†ß²†ß«†ß¤†ß†ß–†ß†ßˆ†ß†ßz†ßs†ßl†ße†ß^†ßW†ßP†ßI†ßB†ß;†ß4†ß-†ß&†ß†ß†ß†ß †ß†ßü…ßõ…ßî…ßç…ßà…ßÙ…ßÒ…ßË…ßÄ…ß½…ß¶…߯…ߨ…ß¡…ßš…ß“…ߌ…ß……ß~…ßw…ßp…ßi…ßb…ß[…ßT…ßM…ßF…ß?…ß8…ß1…ß*…ß#…ß…ß…ß…ß…ß…ßù„ßò„ßë„ßä„ßÝ„ßÖ„ßÏ„ßÈ„ßÁ„ߺ„ß³„߬„ߥ„ßž„ß—„߄߉„ß‚„ß{„ßt„ßm„ßf„ß_„ßX„ßQ„ßJ„ßC„ß<„ß5„ß.„ß'„ß „ß„ß„ß „ß„ßýƒßöƒßïƒßèƒßáƒßÚƒßÓƒß̃ßŃß¾ƒß·ƒß°ƒß©ƒß¢ƒß›ƒß”ƒßƒß†ƒßƒßxƒßqƒßjƒßcƒß\ƒßUƒßNƒßGƒß@ƒß9ƒß2ƒß+ƒß$ƒßƒßƒßƒßƒßƒßú‚ßó‚ßì‚ßå‚ßÞ‚ßׂßЂßɂ߂߻‚ß´‚ß­‚ߦ‚ߟ‚ߘ‚ß‘‚ߊ‚߃‚ß|‚ßu‚ßn‚ßg‚ß`‚ßY‚ßR‚ßK‚ßD‚ß=‚ß6‚ß/‚ß(‚ß!‚ß‚ß‚ß ‚ß‚ßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßû€ßô€ßí€ßæ€ß߀ߨ€ßÑ€ßÊ€ßÀß¼€ßµ€ß®€ß§€ß €ß™€ß’€ß‹€ß„€ß}€ßv€ßo€ßh€ßa€ßZ€ßS€ßL€ßE€ß>€ß7€ß0€ß)€ß"€ß€ß€ß €ß€ßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßü~ßõ~ßî~ßç~ßà~ßÙ~ßÒ~ßË~ßÄ~ß½~ß¶~߯~ߨ~ß¡~ßš~ß“~ߌ~ß…~ß~~ßw~ßp~ßi~ßb~ß[~ßT~ßM~ßF~ß?~ß8~ß1~ß*~ß#~ß~ß~ß~ß~ß~ßù}ßò}ßë}ßä}ßÝ}ßÖ}ßÏ}ßÈ}ßÁ}ߺ}ß³}߬}ߥ}ßž}ß—}ß}߉}ß‚}ß{}ßt}ßm}ßf}ß_}ßX}ßQ}ßJ}ßC}ß<}ß5}ß.}ß'}ß }ß}ß}ß }ß}ßý|ßö|ßï|ßè|ßá|ßÚ|ßÓ|ßÌ|ßÅ|ß¾|ß·|ß°|ß©|ߢ|ß›|ß”|ß|߆|ß|ßx|ßq|ßj|ßc|ß\|ßU|ßN|ßG|ß@|ß9|ß2|ß+|ß$|ß|ß|ß|ß|ß|ßú{ßó{ßì{ßå{ßÞ{ß×{ßÐ{ßÉ{ßÂ{ß»{ß´{ß­{ߦ{ߟ{ߘ{ß‘{ߊ{߃{ß|{ßu{ßn{ßg{ß`{ßY{ßR{ßK{ßD{ß={ß6{ß/{ß({ß!{ß{ß{ß {ß{ßþzß÷zßðzßézßâzßÛzßÔzßÍz߯zß¿z߸zß±zߪzߣzßœzß•zߎz߇z߀zßyzßrzßkzßdzß]zßVzßOzßHzßAzß:zß3zß,zß%zßzßzßzß zßzßûyßôyßíyßæyßßyߨyßÑyßÊyßÃyß¼yßµyß®yß§yß yß™yß’yß‹yß„yß}yßvyßoyßhyßayßZyßSyßLyßEyß>yß7yß0yß)yß"yßyßyß yßyßÿxßøxßñxßêxßãxßÜxßÕxßÎxßÇxßÀxß¹xß²xß«xߤxßxß–xßx߈xßxßzxßsxßlxßexß^xßWxßPxßIxßBxß;xß4xß-xß&xßxßxßxß xßxßüwßõwßîwßçwßàwßÙwßÒwßËwßÄwß½wß¶w߯wߨwß¡wßšwß“wߌwß…wß~wßwwßpwßiwßbwß[wßTwßMwßFwß?wß8wß1wß*wß#wßwßwßwßwßwßùvßòvßëvßävßÝvßÖvßÏvßÈvßÁvߺvß³v߬vߥvßžvß—vßv߉vß‚vß{vßtvßmvßfvß_vßXvßQvßJvßCvßrß7rß0rß)rß"rßrßrß rßrßÿqßøqßñqßêqßãqßÜqßÕqßÎqßÇqßÀqß¹qß²qß«qߤqßqß–qßq߈qßqßzqßsqßlqßeqß^qßWqßPqßIqßBqß;qß4qß-qß&qßqßqßqß qßqßüpßõpßîpßçpßàpßÙpßÒpßËpßÄpß½pß¶p߯pߨpß¡pßšpß“pߌpß…pß~pßwpßppßipßbpß[pßTpßMpßFpß?pß8pß1pß*pß#pßpßpßpßpßpßùoßòoßëoßäoßÝoßÖoßÏoßÈoßÁoߺoß³o߬oߥoßžoß—oßo߉oß‚oß{oßtoßmoßfoß_oßXoßQoßJoßCoßkß7kß0kß)kß"kßkßkß kßkßÿjßøjßñjßêjßãjßÜjßÕjßÎjßÇjßÀjß¹jß²jß«jߤjßjß–jßj߈jßjßzjßsjßljßejß^jßWjßPjßIjßBjß;jß4jß-jß&jßjßjßjß jßjßüißõißîißçißàißÙißÒißËißÄiß½iß¶i߯iߨiß¡ißšiß“iߌiß…iß~ißwißpißiißbiß[ißTißMißFiß?iß8iß1iß*iß#ißißißißißißùhßòhßëhßähßÝhßÖhßÏhßÈhßÁhߺhß³h߬hߥhßžhß—hßh߉hß‚hß{hßthßmhßfhß_hßXhßQhßJhßChßdß7dß0dß)dß"dßdßdß dßdßÿcßøcßñcßêcßãcßÜcßÕcßÎcßÇcßÀcß¹cß²cß«cߤcßcß–cßc߈cßcßzcßscßlcßecß^cßWcßPcßIcßBcß;cß4cß-cß&cßcßcßcß cßcßübßõbßîbßçbßàbßÙbßÒbßËbßÄbß½bß¶b߯bߨbß¡bßšbß“bߌbß…bß~bßwbßpbßibßbbß[bßTbßMbßFbß?bß8bß1bß*bß#bßbßbßbßbßbßùaßòaßëaßäaßÝaßÖaßÏaßÈaßÁaߺaß³a߬aߥaßžaß—aßa߉aß‚aß{aßtaßmaßfaß_aßXaßQaßJaßCaß]ß7]ß0]ß)]ß"]ß]ß]ß ]ß]ßÿ\ßø\ßñ\ßê\ßã\ßÜ\ßÕ\ßÎ\ßÇ\ßÀ\ß¹\ß²\ß«\ߤ\ß\ß–\ß\߈\ß\ßz\ßs\ßl\ße\ß^\ßW\ßP\ßI\ßB\ß;\ß4\ß-\ß&\ß\ß\ß\ß \ß\ßü[ßõ[ßî[ßç[ßà[ßÙ[ßÒ[ßË[ßÄ[ß½[ß¶[߯[ߨ[ß¡[ßš[ß“[ߌ[ß…[ß~[ßw[ßp[ßi[ßb[ß[[ßT[ßM[ßF[ß?[ß8[ß1[ß*[ß#[ß[ß[ß[ß[ß[ßùZßòZßëZßäZßÝZßÖZßÏZßÈZßÁZߺZß³Z߬ZߥZßžZß—ZßZ߉Zß‚Zß{ZßtZßmZßfZß_ZßXZßQZßJZßCZßVß7Vß0Vß)Vß"VßVßVß VßVßÿUßøUßñUßêUßãUßÜUßÕUßÎUßÇUßÀUß¹Uß²Uß«UߤUßUß–UßU߈UßUßzUßsUßlUßeUß^UßWUßPUßIUßBUß;Uß4Uß-Uß&UßUßUßUß UßUßüTßõTßîTßçTßàTßÙTßÒTßËTßÄTß½Tß¶T߯TߨTß¡TßšTß“TߌTß…Tß~TßwTßpTßiTßbTß[TßTTßMTßFTß?Tß8Tß1Tß*Tß#TßTßTßTßTßTßùSßòSßëSßäSßÝSßÖSßÏSßÈSßÁSߺSß³S߬SߥSßžSß—SßS߉Sß‚Sß{SßtSßmSßfSß_SßXSßQSßJSßCSßOß7Oß0Oß)Oß"OßOßOß OßOßÿNßøNßñNßêNßãNßÜNßÕNßÎNßÇNßÀNß¹Nß²Nß«NߤNßNß–NßN߈NßNßzNßsNßlNßeNß^NßWNßPNßINßBNß;Nß4Nß-Nß&NßNßNßNß NßNßüMßõMßîMßçMßàMßÙMßÒMßËMßÄMß½Mß¶M߯MߨMß¡MßšMß“MߌMß…Mß~MßwMßpMßiMßbMß[MßTMßMMßFMß?Mß8Mß1Mß*Mß#MßMßMßMßMßMßùLßòLßëLßäLßÝLßÖLßÏLßÈLßÁLߺLß³L߬LߥLßžLß—LßL߉Lß‚Lß{LßtLßmLßfLß_LßXLßQLßJLßCLßHß7Hß0Hß)Hß"HßHßHß HßHßÿGßøGßñGßêGßãGßÜGßÕGßÎGßÇGßÀGß¹Gß²Gß«GߤGßGß–GßG߈GßGßzGßsGßlGßeGß^GßWGßPGßIGßBGß;Gß4Gß-Gß&GßGßGßGß GßGßüFßõFßîFßçFßàFßÙFßÒFßËFßÄFß½Fß¶F߯FߨFß¡FßšFß“FߌFß…Fß~FßwFßpFßiFßbFß[FßTFßMFßFFß?Fß8Fß1Fß*Fß#FßFßFßFßFßFßùEßòEßëEßäEßÝEßÖEßÏEßÈEßÁEߺEß³E߬EߥEßžEß—EßE߉Eß‚Eß{EßtEßmEßfEß_EßXEßQEßJEßCEßAß7Aß0Aß)Aß"AßAßAß AßAßÿ@ßø@ßñ@ßê@ßã@ßÜ@ßÕ@ßÎ@ßÇ@ßÀ@ß¹@ß²@ß«@ߤ@ß@ß–@ß@߈@ß@ßz@ßs@ßl@ße@ß^@ßW@ßP@ßI@ßB@ß;@ß4@ß-@ß&@ß@ß@ß@ß @ß@ßü?ßõ?ßî?ßç?ßà?ßÙ?ßÒ?ßË?ßÄ?ß½?ß¶?߯?ߨ?ß¡?ßš?ß“?ߌ?ß…?ß~?ßw?ßp?ßi?ßb?ß[?ßT?ßM?ßF?ß??ß8?ß1?ß*?ß#?ß?ß?ß?ß?ß?ßù>ßò>ßë>ßä>ßÝ>ßÖ>ßÏ>ßÈ>ßÁ>ߺ>ß³>߬>ߥ>ßž>ß—>ß>߉>ß‚>ß{>ßt>ßm>ßf>ß_>ßX>ßQ>ßJ>ßC>ß<>ß5>ß.>ß'>ß >ß>ß>ß >ß>ßý=ßö=ßï=ßè=ßá=ßÚ=ßÓ=ßÌ=ßÅ=ß¾=ß·=ß°=ß©=ߢ=ß›=ß”=ß=߆=ß=ßx=ßq=ßj=ßc=ß\=ßU=ßN=ßG=ß@=ß9=ß2=ß+=ß$=ß=ß=ß=ß=ß=ßú<ßó<ßì<ßå<ßÞ<ß×<ßÐ<ßÉ<ßÂ<ß»<ß´<ß­<ߦ<ߟ<ߘ<ß‘<ߊ<߃<ß|<ßu<ßn<ßg<ß`<ßY<ßR<ßK<ßD<ß=<ß6<ß/<ß(<ß!<ß<ß<ß <ß<ßþ;ß÷;ßð;ßé;ßâ;ßÛ;ßÔ;ßÍ;߯;ß¿;߸;ß±;ߪ;ߣ;ßœ;ß•;ߎ;߇;߀;ßy;ßr;ßk;ßd;ß];ßV;ßO;ßH;ßA;ß:;ß3;ß,;ß%;ß;ß;ß;ß ;ß;ßû:ßô:ßí:ßæ:ßß:ߨ:ßÑ:ßÊ:ßÃ:ß¼:ßµ:ß®:ß§:ß :ß™:ß’:ß‹:ß„:ß}:ßv:ßo:ßh:ßa:ßZ:ßS:ßL:ßE:ß>:ß7:ß0:ß):ß":ß:ß:ß :ß:ßÿ9ßø9ßñ9ßê9ßã9ßÜ9ßÕ9ßÎ9ßÇ9ßÀ9ß¹9ß²9ß«9ߤ9ß9ß–9ß9߈9ß9ßz9ßs9ßl9ße9ß^9ßW9ßP9ßI9ßB9ß;9ß49ß-9ß&9ß9ß9ß9ß 9ß9ßü8ßõ8ßî8ßç8ßà8ßÙ8ßÒ8ßË8ßÄ8ß½8ß¶8߯8ߨ8ß¡8ßš8ß“8ߌ8ß…8ß~8ßw8ßp8ßi8ßb8ß[8ßT8ßM8ßF8ß?8ß88ß18ß*8ß#8ß8ß8ß8ß8ß8ßù7ßò7ßë7ßä7ßÝ7ßÖ7ßÏ7ßÈ7ßÁ7ߺ7ß³7߬7ߥ7ßž7ß—7ß7߉7ß‚7ß{7ßt7ßm7ßf7ß_7ßX7ßQ7ßJ7ßC7ß<7ß57ß.7ß'7ß 7ß7ß7ß 7ß7ßý6ßö6ßï6ßè6ßá6ßÚ6ßÓ6ßÌ6ßÅ6ß¾6ß·6ß°6ß©6ߢ6ß›6ß”6ß6߆6ß6ßx6ßq6ßj6ßc6ß\6ßU6ßN6ßG6ß@6ß96ß26ß+6ß$6ß6ß6ß6ß6ß6ßú5ßó5ßì5ßå5ßÞ5ß×5ßÐ5ßÉ5ßÂ5ß»5ß´5ß­5ߦ5ߟ5ߘ5ß‘5ߊ5߃5ß|5ßu5ßn5ßg5ß`5ßY5ßR5ßK5ßD5ß=5ß65ß/5ß(5ß!5ß5ß5ß 5ß5ßþ4ß÷4ßð4ßé4ßâ4ßÛ4ßÔ4ßÍ4߯4ß¿4߸4ß±4ߪ4ߣ4ßœ4ß•4ߎ4߇4߀4ßy4ßr4ßk4ßd4ß]4ßV4ßO4ßH4ßA4ß:4ß34ß,4ß%4ß4ß4ß4ß 4ß4ßû3ßô3ßí3ßæ3ßß3ߨ3ßÑ3ßÊ3ßÃ3ß¼3ßµ3ß®3ß§3ß 3ß™3ß’3ß‹3ß„3ß}3ßv3ßo3ßh3ßa3ßZ3ßS3ßL3ßE3ß>3ß73ß03ß)3ß"3ß3ß3ß 3ß3ßÿ2ßø2ßñ2ßê2ßã2ßÜ2ßÕ2ßÎ2ßÇ2ßÀ2ß¹2ß²2ß«2ߤ2ß2ß–2ß2߈2ß2ßz2ßs2ßl2ße2ß^2ßW2ßP2ßI2ßB2ß;2ß42ß-2ß&2ß2ß2ß2ß 2ß2ßü1ßõ1ßî1ßç1ßà1ßÙ1ßÒ1ßË1ßÄ1ß½1ß¶1߯1ߨ1ß¡1ßš1ß“1ߌ1ß…1ß~1ßw1ßp1ßi1ßb1ß[1ßT1ßM1ßF1ß?1ß81ß11ß*1ß#1ß1ß1ß1ß1ß1ßù0ßò0ßë0ßä0ßÝ0ßÖ0ßÏ0ßÈ0ßÁ0ߺ0ß³0߬0ߥ0ßž0ß—0ß0߉0ß‚0ß{0ßt0ßm0ßf0ß_0ßX0ßQ0ßJ0ßC0ß<0ß50ß.0ß'0ß 0ß0ß0ß 0ß0ßý/ßö/ßï/ßè/ßá/ßÚ/ßÓ/ßÌ/ßÅ/ß¾/ß·/ß°/ß©/ߢ/ß›/ß”/ß/߆/ß/ßx/ßq/ßj/ßc/ß\/ßU/ßN/ßG/ß@/ß9/ß2/ß+/ß$/ß/ß/ß/ß/ß/ßú.ßó.ßì.ßå.ßÞ.ß×.ßÐ.ßÉ.ßÂ.ß».ß´.ß­.ߦ.ߟ.ߘ.ß‘.ߊ.߃.ß|.ßu.ßn.ßg.ß`.ßY.ßR.ßK.ßD.ß=.ß6.ß/.ß(.ß!.ß.ß.ß .ß.ßþ-ß÷-ßð-ßé-ßâ-ßÛ-ßÔ-ßÍ-߯-ß¿-߸-ß±-ߪ-ߣ-ßœ-ß•-ߎ-߇-߀-ßy-ßr-ßk-ßd-ß]-ßV-ßO-ßH-ßA-ß:-ß3-ß,-ß%-ß-ß-ß-ß -ß-ßû,ßô,ßí,ßæ,ßß,ߨ,ßÑ,ßÊ,ßÃ,ß¼,ßµ,ß®,ß§,ß ,ß™,ß’,ß‹,ß„,ß},ßv,ßo,ßh,ßa,ßZ,ßS,ßL,ßE,ß>,ß7,ß0,ß),ß",ß,ß,ß ,ß,ßÿ+ßø+ßñ+ßê+ßã+ßÜ+ßÕ+ßÎ+ßÇ+ßÀ+ß¹+ß²+ß«+ߤ+ß+ß–+ß+߈+ß+ßz+ßs+ßl+ße+ß^+ßW+ßP+ßI+ßB+ß;+ß4+ß-+ß&+ß+ß+ß+ß +ß+ßü*ßõ*ßî*ßç*ßà*ßÙ*ßÒ*ßË*ßÄ*ß½*ß¶*߯*ߨ*ß¡*ßš*ß“*ߌ*ß…*ß~*ßw*ßp*ßi*ßb*ß[*ßT*ßM*ßF*ß?*ß8*ß1*ß**ß#*ß*ß*ß*ß*ß*ßù)ßò)ßë)ßä)ßÝ)ßÖ)ßÏ)ßÈ)ßÁ)ߺ)ß³)߬)ߥ)ßž)ß—)ß)߉)ß‚)ß{)ßt)ßm)ßf)ß_)ßX)ßQ)ßJ)ßC)ß<)ß5)ß.)ß')ß )ß)ß)ß )ß)ßý(ßö(ßï(ßè(ßá(ßÚ(ßÓ(ßÌ(ßÅ(ß¾(ß·(ß°(ß©(ߢ(ß›(ß”(ß(߆(ß(ßx(ßq(ßj(ßc(ß\(ßU(ßN(ßG(ß@(ß9(ß2(ß+(ß$(ß(ß(ß(ß(ß(ßú'ßó'ßì'ßå'ßÞ'ß×'ßÐ'ßÉ'ßÂ'ß»'ß´'ß­'ߦ'ߟ'ߘ'ß‘'ߊ'߃'ß|'ßu'ßn'ßg'ß`'ßY'ßR'ßK'ßD'ß='ß6'ß/'ß('ß!'ß'ß'ß 'ß'ßþ&ß÷&ßð&ßé&ßâ&ßÛ&ßÔ&ßÍ&߯&ß¿&߸&ß±&ߪ&ߣ&ßœ&ß•&ߎ&߇&߀&ßy&ßr&ßk&ßd&ß]&ßV&ßO&ßH&ßA&ß:&ß3&ß,&ß%&ß&ß&ß&ß &ß&ßû%ßô%ßí%ßæ%ßß%ߨ%ßÑ%ßÊ%ßÃ%ß¼%ßµ%ß®%ß§%ß %ß™%ß’%ß‹%ß„%ß}%ßv%ßo%ßh%ßa%ßZ%ßS%ßL%ßE%ß>%ß7%ß0%ß)%ß"%ß%ß%ß %ß%ßÿ$ßø$ßñ$ßê$ßã$ßÜ$ßÕ$ßÎ$ßÇ$ßÀ$ß¹$ß²$ß«$ߤ$ß$ß–$ß$߈$ß$ßz$ßs$ßl$ße$ß^$ßW$ßP$ßI$ßB$ß;$ß4$ß-$ß&$ß$ß$ß$ß $ß$ßü#ßõ#ßî#ßç#ßà#ßÙ#ßÒ#ßË#ßÄ#ß½#ß¶#߯#ߨ#ß¡#ßš#ß“#ߌ#ß…#ß~#ßw#ßp#ßi#ßb#ß[#ßT#ßM#ßF#ß?#ß8#ß1#ß*#ß##ß#ß#ß#ß#ß#ßù"ßò"ßë"ßä"ßÝ"ßÖ"ßÏ"ßÈ"ßÁ"ߺ"ß³"߬"ߥ"ßž"ß—"ß"߉"ß‚"ß{"ßt"ßm"ßf"ß_"ßX"ßQ"ßJ"ßC"ß<"ß5"ß."ß'"ß "ß"ß"ß "ß"ßý!ßö!ßï!ßè!ßá!ßÚ!ßÓ!ßÌ!ßÅ!ß¾!ß·!ß°!ß©!ߢ!ß›!ß”!ß!߆!ß!ßx!ßq!ßj!ßc!ß\!ßU!ßN!ßG!ß@!ß9!ß2!ß+!ß$!ß!ß!ß!ß!ß!ßú ßó ßì ßå ßÞ ß× ßÐ ßÉ ß ß» ß´ ß­ ߦ ߟ ߘ ß‘ ߊ ߃ ß| ßu ßn ßg ß` ßY ßR ßK ßD ß= ß6 ß/ ß( ß! ß ß ß ß ßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßù ßò ßë ßä ßÝ ßÖ ßÏ ßÈ ßÁ ߺ ß³ ߬ ߥ ßž ß— ß ß‰ ß‚ ß{ ßt ßm ßf ß_ ßX ßQ ßJ ßC ß< ß5 ß. ß' ß ß ß ß ß ßý ßö ßï ßè ßá ßÚ ßÓ ßÌ ßÅ ß¾ ß· ß° ß© ߢ ß› ß” ß ß† ß ßx ßq ßj ßc ß\ ßU ßN ßG ß@ ß9 ß2 ß+ ß$ ß ß ß ß ß ßú ßó ßì ßå ßÞ ß× ßÐ ßÉ ß ß» ß´ ß­ ߦ ߟ ߘ ß‘ ߊ ߃ ß| ßu ßn ßg ß` ßY ßR ßK ßD ß= ß6 ß/ ß( ß! ß ß ß ß ßþ ß÷ ßð ßé ßâ ßÛ ßÔ ßÍ ßÆ ß¿ ߸ ß± ߪ ߣ ßœ ß• ߎ ߇ ߀ ßy ßr ßk ßd ß] ßV ßO ßH ßA ß: ß3 ß, ß% ß ß ß ß ß ßû ßô ßí ßæ ßß ßØ ßÑ ßÊ ßà ß¼ ßµ ß® ß§ ß  ß™ ß’ ß‹ ß„ ß} ßv ßo ßh ßa ßZ ßS ßL ßE ß> ß7 ß0 ß) ß" ß ß ß ß ßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÿÞòÿÞëÿÞäÿÞÝÿÞÖÿÞÏÿÞÈÿÞÁÿÞºÿÞ³ÿÞ¬ÿÞ¥ÿÞžÿÞ—ÿÞÿÞ‰ÿÞ‚ÿÞ{ÿÞtÿÞmÿÞfÿÞ_ÿÞXÿÞQÿÞJÿÞCÿÞ<ÿÞ5ÿÞ.ÿÞ'ÿÞ ÿÞÿÞÿÞ ÿÞÿÞýþÞöþÞïþÞèþÞáþÞÚþÞÓþÞÌþÞÅþÞ¾þÞ·þÞ°þÞ©þÞ¢þÞ›þÞ”þÞþÞ†þÞþÞxþÞqþÞjþÞcþÞ\þÞUþÞNþÞGþÞ@þÞ9þÞ2þÞ+þÞ$þÞþÞþÞþÞþÞþÞúýÞóýÞìýÞåýÞÞýÞ×ýÞÐýÞÉýÞÂýÞ»ýÞ´ýÞ­ýÞ¦ýÞŸýÞ˜ýÞ‘ýÞŠýÞƒýÞ|ýÞuýÞnýÞgýÞ`ýÞYýÞRýÞKýÞDýÞ=ýÞ6ýÞ/ýÞ(ýÞ!ýÞýÞýÞ ýÞýÞþüÞ÷üÞðüÞéüÞâüÞÛüÞÔüÞÍüÞÆüÞ¿üÞ¸üÞ±üÞªüÞ£üÞœüÞ•üÞŽüÞ‡üÞ€üÞyüÞrüÞküÞdüÞ]üÞVüÞOüÞHüÞAüÞ:üÞ3üÞ,üÞ%üÞüÞüÞüÞ üÞüÞûûÞôûÞíûÞæûÞßûÞØûÞÑûÞÊûÞÃûÞ¼ûÞµûÞ®ûÞ§ûÞ ûÞ™ûÞ’ûÞ‹ûÞ„ûÞ}ûÞvûÞoûÞhûÞaûÞZûÞSûÞLûÞEûÞ>ûÞ7ûÞ0ûÞ)ûÞ"ûÞûÞûÞ ûÞûÞÿúÞøúÞñúÞêúÞãúÞÜúÞÕúÞÎúÞÇúÞÀúÞ¹úÞ²úÞ«úÞ¤úÞúÞ–úÞúÞˆúÞúÞzúÞsúÞlúÞeúÞ^úÞWúÞPúÞIúÞBúÞ;úÞ4úÞ-úÞ&úÞúÞúÞúÞ úÞúÞüùÞõùÞîùÞçùÞàùÞÙùÞÒùÞËùÞÄùÞ½ùÞ¶ùÞ¯ùÞ¨ùÞ¡ùÞšùÞ“ùÞŒùÞ…ùÞ~ùÞwùÞpùÞiùÞbùÞ[ùÞTùÞMùÞFùÞ?ùÞ8ùÞ1ùÞ*ùÞ#ùÞùÞùÞùÞùÞùÞùøÞòøÞëøÞäøÞÝøÞÖøÞÏøÞÈøÞÁøÞºøÞ³øÞ¬øÞ¥øÞžøÞ—øÞøÞ‰øÞ‚øÞ{øÞtøÞmøÞføÞ_øÞXøÞQøÞJøÞCøÞ<øÞ5øÞ.øÞ'øÞ øÞøÞøÞ øÞøÞý÷Þö÷Þï÷Þè÷Þá÷ÞÚ÷ÞÓ÷ÞÌ÷ÞÅ÷Þ¾÷Þ·÷Þ°÷Þ©÷Þ¢÷Þ›÷Þ”÷Þ÷Þ†÷Þ÷Þx÷Þq÷Þj÷Þc÷Þ\÷ÞU÷ÞN÷ÞG÷Þ@÷Þ9÷Þ2÷Þ+÷Þ$÷Þ÷Þ÷Þ÷Þ÷Þ÷ÞúöÞóöÞìöÞåöÞÞöÞ×öÞÐöÞÉöÞÂöÞ»öÞ´öÞ­öÞ¦öÞŸöÞ˜öÞ‘öÞŠöÞƒöÞ|öÞuöÞnöÞgöÞ`öÞYöÞRöÞKöÞDöÞ=öÞ6öÞ/öÞ(öÞ!öÞöÞöÞ öÞöÞþõÞ÷õÞðõÞéõÞâõÞÛõÞÔõÞÍõÞÆõÞ¿õÞ¸õÞ±õÞªõÞ£õÞœõÞ•õÞŽõÞ‡õÞ€õÞyõÞrõÞkõÞdõÞ]õÞVõÞOõÞHõÞAõÞ:õÞ3õÞ,õÞ%õÞõÞõÞõÞ õÞõÞûôÞôôÞíôÞæôÞßôÞØôÞÑôÞÊôÞÃôÞ¼ôÞµôÞ®ôÞ§ôÞ ôÞ™ôÞ’ôÞ‹ôÞ„ôÞ}ôÞvôÞoôÞhôÞaôÞZôÞSôÞLôÞEôÞ>ôÞ7ôÞ0ôÞ)ôÞ"ôÞôÞôÞ ôÞôÞÿóÞøóÞñóÞêóÞãóÞÜóÞÕóÞÎóÞÇóÞÀóÞ¹óÞ²óÞ«óÞ¤óÞóÞ–óÞóÞˆóÞóÞzóÞsóÞlóÞeóÞ^óÞWóÞPóÞIóÞBóÞ;óÞ4óÞ-óÞ&óÞóÞóÞóÞ óÞóÞüòÞõòÞîòÞçòÞàòÞÙòÞÒòÞËòÞÄòÞ½òÞ¶òÞ¯òÞ¨òÞ¡òÞšòÞ“òÞŒòÞ…òÞ~òÞwòÞpòÞiòÞbòÞ[òÞTòÞMòÞFòÞ?òÞ8òÞ1òÞ*òÞ#òÞòÞòÞòÞòÞòÞùñÞòñÞëñÞäñÞÝñÞÖñÞÏñÞÈñÞÁñÞºñÞ³ñÞ¬ñÞ¥ñÞžñÞ—ñÞñÞ‰ñÞ‚ñÞ{ñÞtñÞmñÞfñÞ_ñÞXñÞQñÞJñÞCñÞ<ñÞ5ñÞ.ñÞ'ñÞ ñÞñÞñÞ ñÞñÞýðÞöðÞïðÞèðÞáðÞÚðÞÓðÞÌðÞÅðÞ¾ðÞ·ðÞ°ðÞ©ðÞ¢ðÞ›ðÞ”ðÞðÞ†ðÞðÞxðÞqðÞjðÞcðÞ\ðÞUðÞNðÞGðÞ@ðÞ9ðÞ2ðÞ+ðÞ$ðÞðÞðÞðÞðÞðÞúïÞóïÞìïÞåïÞÞïÞ×ïÞÐïÞÉïÞÂïÞ»ïÞ´ïÞ­ïÞ¦ïÞŸïÞ˜ïÞ‘ïÞŠïÞƒïÞ|ïÞuïÞnïÞgïÞ`ïÞYïÞRïÞKïÞDïÞ=ïÞ6ïÞ/ïÞ(ïÞ!ïÞïÞïÞ ïÞïÞþîÞ÷îÞðîÞéîÞâîÞÛîÞÔîÞÍîÞÆîÞ¿îÞ¸îÞ±îÞªîÞ£îÞœîÞ•îÞŽîÞ‡îÞ€îÞyîÞrîÞkîÞdîÞ]îÞVîÞOîÞHîÞAîÞ:îÞ3îÞ,îÞ%îÞîÞîÞîÞ îÞîÞûíÞôíÞííÞæíÞßíÞØíÞÑíÞÊíÞÃíÞ¼íÞµíÞ®íÞ§íÞ íÞ™íÞ’íÞ‹íÞ„íÞ}íÞvíÞoíÞhíÞaíÞZíÞSíÞLíÞEíÞ>íÞ7íÞ0íÞ)íÞ"íÞíÞíÞ íÞíÞÿìÞøìÞñìÞêìÞãìÞÜìÞÕìÞÎìÞÇìÞÀìÞ¹ìÞ²ìÞ«ìÞ¤ìÞìÞ–ìÞìÞˆìÞìÞzìÞsìÞlìÞeìÞ^ìÞWìÞPìÞIìÞBìÞ;ìÞ4ìÞ-ìÞ&ìÞìÞìÞìÞ ìÞìÞüëÞõëÞîëÞçëÞàëÞÙëÞÒëÞËëÞÄëÞ½ëÞ¶ëÞ¯ëÞ¨ëÞ¡ëÞšëÞ“ëÞŒëÞ…ëÞ~ëÞwëÞpëÞiëÞbëÞ[ëÞTëÞMëÞFëÞ?ëÞ8ëÞ1ëÞ*ëÞ#ëÞëÞëÞëÞëÞëÞùêÞòêÞëêÞäêÞÝêÞÖêÞÏêÞÈêÞÁêÞºêÞ³êÞ¬êÞ¥êÞžêÞ—êÞêÞ‰êÞ‚êÞ{êÞtêÞmêÞfêÞ_êÞXêÞQêÞJêÞCêÞ<êÞ5êÞ.êÞ'êÞ êÞêÞêÞ êÞêÞýéÞöéÞïéÞèéÞáéÞÚéÞÓéÞÌéÞÅéÞ¾éÞ·éÞ°éÞ©éÞ¢éÞ›éÞ”éÞéÞ†éÞéÞxéÞqéÞjéÞcéÞ\éÞUéÞNéÞGéÞ@éÞ9éÞ2éÞ+éÞ$éÞéÞéÞéÞéÞéÞúèÞóèÞìèÞåèÞÞèÞ×èÞÐèÞÉèÞÂèÞ»èÞ´èÞ­èÞ¦èÞŸèÞ˜èÞ‘èÞŠèÞƒèÞ|èÞuèÞnèÞgèÞ`èÞYèÞRèÞKèÞDèÞ=èÞ6èÞ/èÞ(èÞ!èÞèÞèÞ èÞèÞþçÞ÷çÞðçÞéçÞâçÞÛçÞÔçÞÍçÞÆçÞ¿çÞ¸çÞ±çÞªçÞ£çÞœçÞ•çÞŽçÞ‡çÞ€çÞyçÞrçÞkçÞdçÞ]çÞVçÞOçÞHçÞAçÞ:çÞ3çÞ,çÞ%çÞçÞçÞçÞ çÞçÞûæÞôæÞíæÞææÞßæÞØæÞÑæÞÊæÞÃæÞ¼æÞµæÞ®æÞ§æÞ æÞ™æÞ’æÞ‹æÞ„æÞ}æÞvæÞoæÞhæÞaæÞZæÞSæÞLæÞEæÞ>æÞ7æÞ0æÞ)æÞ"æÞæÞæÞ æÞæÞÿåÞøåÞñåÞêåÞãåÞÜåÞÕåÞÎåÞÇåÞÀåÞ¹åÞ²åÞ«åÞ¤åÞåÞ–åÞåÞˆåÞåÞzåÞsåÞlåÞeåÞ^åÞWåÞPåÞIåÞBåÞ;åÞ4åÞ-åÞ&åÞåÞåÞåÞ åÞåÞüäÞõäÞîäÞçäÞàäÞÙäÞÒäÞËäÞÄäÞ½äÞ¶äÞ¯äÞ¨äÞ¡äÞšäÞ“äÞŒäÞ…äÞ~äÞwäÞpäÞiäÞbäÞ[äÞTäÞMäÞFäÞ?äÞ8äÞ1äÞ*äÞ#äÞäÞäÞäÞäÞäÞùãÞòãÞëãÞäãÞÝãÞÖãÞÏãÞÈãÞÁãÞºãÞ³ãÞ¬ãÞ¥ãÞžãÞ—ãÞãÞ‰ãÞ‚ãÞ{ãÞtãÞmãÞfãÞ_ãÞXãÞQãÞJãÞCãÞ<ãÞ5ãÞ.ãÞ'ãÞ ãÞãÞãÞ ãÞãÞýâÞöâÞïâÞèâÞáâÞÚâÞÓâÞÌâÞÅâÞ¾âÞ·âÞ°âÞ©âÞ¢âÞ›âÞ”âÞâÞ†âÞâÞxâÞqâÞjâÞcâÞ\âÞUâÞNâÞGâÞ@âÞ9âÞ2âÞ+âÞ$âÞâÞâÞâÞâÞâÞúáÞóáÞìáÞåáÞÞáÞ×áÞÐáÞÉáÞÂáÞ»áÞ´áÞ­áÞ¦áÞŸáÞ˜áÞ‘áÞŠáÞƒáÞ|áÞuáÞnáÞgáÞ`áÞYáÞRáÞKáÞDáÞ=áÞ6áÞ/áÞ(áÞ!áÞáÞáÞ áÞáÞþàÞ÷àÞðàÞéàÞâàÞÛàÞÔàÞÍàÞÆàÞ¿àÞ¸àÞ±àÞªàÞ£àÞœàÞ•àÞŽàÞ‡àÞ€àÞyàÞràÞkàÞdàÞ]àÞVàÞOàÞHàÞAàÞ:àÞ3àÞ,àÞ%àÞàÞàÞàÞ àÞàÞûßÞôßÞíßÞæßÞßßÞØßÞÑßÞÊßÞÃßÞ¼ßÞµßÞ®ßÞ§ßÞ ßÞ™ßÞ’ßÞ‹ßÞ„ßÞ}ßÞvßÞoßÞhßÞaßÞZßÞSßÞLßÞEßÞ>ßÞ7ßÞ0ßÞ)ßÞ"ßÞßÞßÞ ßÞßÞÿÞÞøÞÞñÞÞêÞÞãÞÞÜÞÞÕÞÞÎÞÞÇÞÞÀÞÞ¹ÞÞ²ÞÞ«ÞÞ¤ÞÞÞÞ–ÞÞÞÞˆÞÞÞÞzÞÞsÞÞlÞÞeÞÞ^ÞÞWÞÞPÞÞIÞÞBÞÞ;ÞÞ4ÞÞ-ÞÞ&ÞÞÞÞÞÞÞÞ ÞÞÞÞüÝÞõÝÞîÝÞçÝÞàÝÞÙÝÞÒÝÞËÝÞÄÝÞ½ÝÞ¶ÝÞ¯ÝÞ¨ÝÞ¡ÝÞšÝÞ“ÝÞŒÝÞ…ÝÞ~ÝÞwÝÞpÝÞiÝÞbÝÞ[ÝÞTÝÞMÝÞFÝÞ?ÝÞ8ÝÞ1ÝÞ*ÝÞ#ÝÞÝÞÝÞÝÞÝÞÝÞùÜÞòÜÞëÜÞäÜÞÝÜÞÖÜÞÏÜÞÈÜÞÁÜÞºÜÞ³ÜÞ¬ÜÞ¥ÜÞžÜÞ—ÜÞÜÞ‰ÜÞ‚ÜÞ{ÜÞtÜÞmÜÞfÜÞ_ÜÞXÜÞQÜÞJÜÞCÜÞ<ÜÞ5ÜÞ.ÜÞ'ÜÞ ÜÞÜÞÜÞ ÜÞÜÞýÛÞöÛÞïÛÞèÛÞáÛÞÚÛÞÓÛÞÌÛÞÅÛÞ¾ÛÞ·ÛÞ°ÛÞ©ÛÞ¢ÛÞ›ÛÞ”ÛÞÛÞ†ÛÞÛÞxÛÞqÛÞjÛÞcÛÞ\ÛÞUÛÞNÛÞGÛÞ@ÛÞ9ÛÞ2ÛÞ+ÛÞ$ÛÞÛÞÛÞÛÞÛÞÛÞúÚÞóÚÞìÚÞåÚÞÞÚÞ×ÚÞÐÚÞÉÚÞÂÚÞ»ÚÞ´ÚÞ­ÚÞ¦ÚÞŸÚÞ˜ÚÞ‘ÚÞŠÚÞƒÚÞ|ÚÞuÚÞnÚÞgÚÞ`ÚÞYÚÞRÚÞKÚÞDÚÞ=ÚÞ6ÚÞ/ÚÞ(ÚÞ!ÚÞÚÞÚÞ ÚÞÚÞþÙÞ÷ÙÞðÙÞéÙÞâÙÞÛÙÞÔÙÞÍÙÞÆÙÞ¿ÙÞ¸ÙÞ±ÙÞªÙÞ£ÙÞœÙÞ•ÙÞŽÙÞ‡ÙÞ€ÙÞyÙÞrÙÞkÙÞdÙÞ]ÙÞVÙÞOÙÞHÙÞAÙÞ:ÙÞ3ÙÞ,ÙÞ%ÙÞÙÞÙÞÙÞ ÙÞÙÞûØÞôØÞíØÞæØÞߨÞØØÞÑØÞÊØÞÃØÞ¼ØÞµØÞ®ØÞ§ØÞ ØÞ™ØÞ’ØÞ‹ØÞ„ØÞ}ØÞvØÞoØÞhØÞaØÞZØÞSØÞLØÞEØÞ>ØÞ7ØÞ0ØÞ)ØÞ"ØÞØÞØÞ ØÞØÞÿ×Þø×Þñ×Þê×Þã×ÞÜ×ÞÕ×ÞÎ×ÞÇ×ÞÀ×Þ¹×Þ²×Þ«×Þ¤×Þ×Þ–×Þ×Þˆ×Þ×Þz×Þs×Þl×Þe×Þ^×ÞW×ÞP×ÞI×ÞB×Þ;×Þ4×Þ-×Þ&×Þ×Þ×Þ×Þ ×Þ×ÞüÖÞõÖÞîÖÞçÖÞàÖÞÙÖÞÒÖÞËÖÞÄÖÞ½ÖÞ¶ÖÞ¯ÖÞ¨ÖÞ¡ÖÞšÖÞ“ÖÞŒÖÞ…ÖÞ~ÖÞwÖÞpÖÞiÖÞbÖÞ[ÖÞTÖÞMÖÞFÖÞ?ÖÞ8ÖÞ1ÖÞ*ÖÞ#ÖÞÖÞÖÞÖÞÖÞÖÞùÕÞòÕÞëÕÞäÕÞÝÕÞÖÕÞÏÕÞÈÕÞÁÕÞºÕÞ³ÕÞ¬ÕÞ¥ÕÞžÕÞ—ÕÞÕÞ‰ÕÞ‚ÕÞ{ÕÞtÕÞmÕÞfÕÞ_ÕÞXÕÞQÕÞJÕÞCÕÞ<ÕÞ5ÕÞ.ÕÞ'ÕÞ ÕÞÕÞÕÞ ÕÞÕÞýÔÞöÔÞïÔÞèÔÞáÔÞÚÔÞÓÔÞÌÔÞÅÔÞ¾ÔÞ·ÔÞ°ÔÞ©ÔÞ¢ÔÞ›ÔÞ”ÔÞÔÞ†ÔÞÔÞxÔÞqÔÞjÔÞcÔÞ\ÔÞUÔÞNÔÞGÔÞ@ÔÞ9ÔÞ2ÔÞ+ÔÞ$ÔÞÔÞÔÞÔÞÔÞÔÞúÓÞóÓÞìÓÞåÓÞÞÓÞ×ÓÞÐÓÞÉÓÞÂÓÞ»ÓÞ´ÓÞ­ÓÞ¦ÓÞŸÓÞ˜ÓÞ‘ÓÞŠÓÞƒÓÞ|ÓÞuÓÞnÓÞgÓÞ`ÓÞYÓÞRÓÞKÓÞDÓÞ=ÓÞ6ÓÞ/ÓÞ(ÓÞ!ÓÞÓÞÓÞ ÓÞÓÞþÒÞ÷ÒÞðÒÞéÒÞâÒÞÛÒÞÔÒÞÍÒÞÆÒÞ¿ÒÞ¸ÒÞ±ÒÞªÒÞ£ÒÞœÒÞ•ÒÞŽÒÞ‡ÒÞ€ÒÞyÒÞrÒÞkÒÞdÒÞ]ÒÞVÒÞOÒÞHÒÞAÒÞ:ÒÞ3ÒÞ,ÒÞ%ÒÞÒÞÒÞÒÞ ÒÞÒÞûÑÞôÑÞíÑÞæÑÞßÑÞØÑÞÑÑÞÊÑÞÃÑÞ¼ÑÞµÑÞ®ÑÞ§ÑÞ ÑÞ™ÑÞ’ÑÞ‹ÑÞ„ÑÞ}ÑÞvÑÞoÑÞhÑÞaÑÞZÑÞSÑÞLÑÞEÑÞ>ÑÞ7ÑÞ0ÑÞ)ÑÞ"ÑÞÑÞÑÞ ÑÞÑÞÿÐÞøÐÞñÐÞêÐÞãÐÞÜÐÞÕÐÞÎÐÞÇÐÞÀÐÞ¹ÐÞ²ÐÞ«ÐÞ¤ÐÞÐÞ–ÐÞÐÞˆÐÞÐÞzÐÞsÐÞlÐÞeÐÞ^ÐÞWÐÞPÐÞIÐÞBÐÞ;ÐÞ4ÐÞ-ÐÞ&ÐÞÐÞÐÞÐÞ ÐÞÐÞüÏÞõÏÞîÏÞçÏÞàÏÞÙÏÞÒÏÞËÏÞÄÏÞ½ÏÞ¶ÏÞ¯ÏÞ¨ÏÞ¡ÏÞšÏÞ“ÏÞŒÏÞ…ÏÞ~ÏÞwÏÞpÏÞiÏÞbÏÞ[ÏÞTÏÞMÏÞFÏÞ?ÏÞ8ÏÞ1ÏÞ*ÏÞ#ÏÞÏÞÏÞÏÞÏÞÏÞùÎÞòÎÞëÎÞäÎÞÝÎÞÖÎÞÏÎÞÈÎÞÁÎÞºÎÞ³ÎÞ¬ÎÞ¥ÎÞžÎÞ—ÎÞÎÞ‰ÎÞ‚ÎÞ{ÎÞtÎÞmÎÞfÎÞ_ÎÞXÎÞQÎÞJÎÞCÎÞ<ÎÞ5ÎÞ.ÎÞ'ÎÞ ÎÞÎÞÎÞ ÎÞÎÞýÍÞöÍÞïÍÞèÍÞáÍÞÚÍÞÓÍÞÌÍÞÅÍÞ¾ÍÞ·ÍÞ°ÍÞ©ÍÞ¢ÍÞ›ÍÞ”ÍÞÍÞ†ÍÞÍÞxÍÞqÍÞjÍÞcÍÞ\ÍÞUÍÞNÍÞGÍÞ@ÍÞ9ÍÞ2ÍÞ+ÍÞ$ÍÞÍÞÍÞÍÞÍÞÍÞúÌÞóÌÞìÌÞåÌÞÞÌÞ×ÌÞÐÌÞÉÌÞÂÌÞ»ÌÞ´ÌÞ­ÌÞ¦ÌÞŸÌÞ˜ÌÞ‘ÌÞŠÌÞƒÌÞ|ÌÞuÌÞnÌÞgÌÞ`ÌÞYÌÞRÌÞKÌÞDÌÞ=ÌÞ6ÌÞ/ÌÞ(ÌÞ!ÌÞÌÞÌÞ ÌÞÌÞþËÞ÷ËÞðËÞéËÞâËÞÛËÞÔËÞÍËÞÆËÞ¿ËÞ¸ËÞ±ËÞªËÞ£ËÞœËÞ•ËÞŽËÞ‡ËÞ€ËÞyËÞrËÞkËÞdËÞ]ËÞVËÞOËÞHËÞAËÞ:ËÞ3ËÞ,ËÞ%ËÞËÞËÞËÞ ËÞËÞûÊÞôÊÞíÊÞæÊÞßÊÞØÊÞÑÊÞÊÊÞÃÊÞ¼ÊÞµÊÞ®ÊÞ§ÊÞ ÊÞ™ÊÞ’ÊÞ‹ÊÞ„ÊÞ}ÊÞvÊÞoÊÞhÊÞaÊÞZÊÞSÊÞLÊÞEÊÞ>ÊÞ7ÊÞ0ÊÞ)ÊÞ"ÊÞÊÞÊÞ ÊÞÊÞÿÉÞøÉÞñÉÞêÉÞãÉÞÜÉÞÕÉÞÎÉÞÇÉÞÀÉÞ¹ÉÞ²ÉÞ«ÉÞ¤ÉÞÉÞ–ÉÞÉÞˆÉÞÉÞzÉÞsÉÞlÉÞeÉÞ^ÉÞWÉÞPÉÞIÉÞBÉÞ;ÉÞ4ÉÞ-ÉÞ&ÉÞÉÞÉÞÉÞ ÉÞÉÞüÈÞõÈÞîÈÞçÈÞàÈÞÙÈÞÒÈÞËÈÞÄÈÞ½ÈÞ¶ÈÞ¯ÈÞ¨ÈÞ¡ÈÞšÈÞ“ÈÞŒÈÞ…ÈÞ~ÈÞwÈÞpÈÞiÈÞbÈÞ[ÈÞTÈÞMÈÞFÈÞ?ÈÞ8ÈÞ1ÈÞ*ÈÞ#ÈÞÈÞÈÞÈÞÈÞÈÞùÇÞòÇÞëÇÞäÇÞÝÇÞÖÇÞÏÇÞÈÇÞÁÇÞºÇÞ³ÇÞ¬ÇÞ¥ÇÞžÇÞ—ÇÞÇÞ‰ÇÞ‚ÇÞ{ÇÞtÇÞmÇÞfÇÞ_ÇÞXÇÞQÇÞJÇÞCÇÞ<ÇÞ5ÇÞ.ÇÞ'ÇÞ ÇÞÇÞÇÞ ÇÞÇÞýÆÞöÆÞïÆÞèÆÞáÆÞÚÆÞÓÆÞÌÆÞÅÆÞ¾ÆÞ·ÆÞ°ÆÞ©ÆÞ¢ÆÞ›ÆÞ”ÆÞÆÞ†ÆÞÆÞxÆÞqÆÞjÆÞcÆÞ\ÆÞUÆÞNÆÞGÆÞ@ÆÞ9ÆÞ2ÆÞ+ÆÞ$ÆÞÆÞÆÞÆÞÆÞÆÞúÅÞóÅÞìÅÞåÅÞÞÅÞ×ÅÞÐÅÞÉÅÞÂÅÞ»ÅÞ´ÅÞ­ÅÞ¦ÅÞŸÅÞ˜ÅÞ‘ÅÞŠÅÞƒÅÞ|ÅÞuÅÞnÅÞgÅÞ`ÅÞYÅÞRÅÞKÅÞDÅÞ=ÅÞ6ÅÞ/ÅÞ(ÅÞ!ÅÞÅÞÅÞ ÅÞÅÞþÄÞ÷ÄÞðÄÞéÄÞâÄÞÛÄÞÔÄÞÍÄÞÆÄÞ¿ÄÞ¸ÄÞ±ÄÞªÄÞ£ÄÞœÄÞ•ÄÞŽÄÞ‡ÄÞ€ÄÞyÄÞrÄÞkÄÞdÄÞ]ÄÞVÄÞOÄÞHÄÞAÄÞ:ÄÞ3ÄÞ,ÄÞ%ÄÞÄÞÄÞÄÞ ÄÞÄÞûÃÞôÃÞíÃÞæÃÞßÃÞØÃÞÑÃÞÊÃÞÃÃÞ¼ÃÞµÃÞ®ÃÞ§ÃÞ ÃÞ™ÃÞ’ÃÞ‹ÃÞ„ÃÞ}ÃÞvÃÞoÃÞhÃÞaÃÞZÃÞSÃÞLÃÞEÃÞ>ÃÞ7ÃÞ0ÃÞ)ÃÞ"ÃÞÃÞÃÞ ÃÞÃÞÿÂÞøÂÞñÂÞêÂÞãÂÞÜÂÞÕÂÞÎÂÞÇÂÞÀÂÞ¹ÂÞ²ÂÞ«ÂÞ¤ÂÞÂÞ–ÂÞÂÞˆÂÞÂÞzÂÞsÂÞlÂÞeÂÞ^ÂÞWÂÞPÂÞIÂÞBÂÞ;ÂÞ4ÂÞ-ÂÞ&ÂÞÂÞÂÞÂÞ ÂÞÂÞüÁÞõÁÞîÁÞçÁÞàÁÞÙÁÞÒÁÞËÁÞÄÁÞ½ÁÞ¶ÁÞ¯ÁÞ¨ÁÞ¡ÁÞšÁÞ“ÁÞŒÁÞ…ÁÞ~ÁÞwÁÞpÁÞiÁÞbÁÞ[ÁÞTÁÞMÁÞFÁÞ?ÁÞ8ÁÞ1ÁÞ*ÁÞ#ÁÞÁÞÁÞÁÞÁÞÁÞùÀÞòÀÞëÀÞäÀÞÝÀÞÖÀÞÏÀÞÈÀÞÁÀÞºÀÞ³ÀÞ¬ÀÞ¥ÀÞžÀÞ—ÀÞÀÞ‰ÀÞ‚ÀÞ{ÀÞtÀÞmÀÞfÀÞ_ÀÞXÀÞQÀÞJÀÞCÀÞ<ÀÞ5ÀÞ.ÀÞ'ÀÞ ÀÞÀÞÀÞ ÀÞÀÞý¿Þö¿Þï¿Þè¿Þá¿ÞÚ¿ÞÓ¿ÞÌ¿Þſ޾¿Þ·¿Þ°¿Þ©¿Þ¢¿Þ›¿Þ”¿Þ¿Þ†¿Þ¿Þx¿Þq¿Þj¿Þc¿Þ\¿ÞU¿ÞN¿ÞG¿Þ@¿Þ9¿Þ2¿Þ+¿Þ$¿Þ¿Þ¿Þ¿Þ¿Þ¿Þú¾Þó¾Þì¾Þå¾ÞÞ¾Þ×¾ÞоÞɾÞ¾Þ»¾Þ´¾Þ­¾Þ¦¾ÞŸ¾Þ˜¾Þ‘¾ÞоÞƒ¾Þ|¾Þu¾Þn¾Þg¾Þ`¾ÞY¾ÞR¾ÞK¾ÞD¾Þ=¾Þ6¾Þ/¾Þ(¾Þ!¾Þ¾Þ¾Þ ¾Þ¾Þþ½Þ÷½Þð½Þé½Þâ½ÞÛ½ÞÔ½ÞͽÞƽÞ¿½Þ¸½Þ±½Þª½Þ£½Þœ½Þ•½Þ޽Þ‡½Þ€½Þy½Þr½Þk½Þd½Þ]½ÞV½ÞO½ÞH½ÞA½Þ:½Þ3½Þ,½Þ%½Þ½Þ½Þ½Þ ½Þ½Þû¼Þô¼Þí¼Þæ¼Þß¼ÞؼÞѼÞʼÞüÞ¼¼Þµ¼Þ®¼Þ§¼Þ ¼Þ™¼Þ’¼Þ‹¼Þ„¼Þ}¼Þv¼Þo¼Þh¼Þa¼ÞZ¼ÞS¼ÞL¼ÞE¼Þ>¼Þ7¼Þ0¼Þ)¼Þ"¼Þ¼Þ¼Þ ¼Þ¼Þÿ»Þø»Þñ»Þê»Þã»ÞÜ»ÞÕ»ÞλÞÇ»ÞÀ»Þ¹»Þ²»Þ«»Þ¤»Þ»Þ–»Þ»Þˆ»Þ»Þz»Þs»Þl»Þe»Þ^»ÞW»ÞP»ÞI»ÞB»Þ;»Þ4»Þ-»Þ&»Þ»Þ»Þ»Þ »Þ»ÞüºÞõºÞîºÞçºÞàºÞÙºÞÒºÞ˺ÞĺÞ½ºÞ¶ºÞ¯ºÞ¨ºÞ¡ºÞšºÞ“ºÞŒºÞ…ºÞ~ºÞwºÞpºÞiºÞbºÞ[ºÞTºÞMºÞFºÞ?ºÞ8ºÞ1ºÞ*ºÞ#ºÞºÞºÞºÞºÞºÞù¹Þò¹Þë¹Þä¹ÞݹÞÖ¹ÞϹÞȹÞÁ¹Þº¹Þ³¹Þ¬¹Þ¥¹Þž¹Þ—¹Þ¹Þ‰¹Þ‚¹Þ{¹Þt¹Þm¹Þf¹Þ_¹ÞX¹ÞQ¹ÞJ¹ÞC¹Þ<¹Þ5¹Þ.¹Þ'¹Þ ¹Þ¹Þ¹Þ ¹Þ¹Þý¸Þö¸Þï¸Þè¸Þá¸ÞÚ¸ÞÓ¸Þ̸ÞŸÞ¾¸Þ·¸Þ°¸Þ©¸Þ¢¸Þ›¸Þ”¸Þ¸Þ†¸Þ¸Þx¸Þq¸Þj¸Þc¸Þ\¸ÞU¸ÞN¸ÞG¸Þ@¸Þ9¸Þ2¸Þ+¸Þ$¸Þ¸Þ¸Þ¸Þ¸Þ¸Þú·Þó·Þì·Þå·ÞÞ·Þ×·ÞзÞÉ·Þ·Þ»·Þ´·Þ­·Þ¦·ÞŸ·Þ˜·Þ‘·ÞŠ·Þƒ·Þ|·Þu·Þn·Þg·Þ`·ÞY·ÞR·ÞK·ÞD·Þ=·Þ6·Þ/·Þ(·Þ!·Þ·Þ·Þ ·Þ·Þþ¶Þ÷¶Þð¶Þé¶Þâ¶ÞÛ¶ÞÔ¶ÞͶÞƶÞ¿¶Þ¸¶Þ±¶Þª¶Þ£¶Þœ¶Þ•¶Þ޶Þ‡¶Þ€¶Þy¶Þr¶Þk¶Þd¶Þ]¶ÞV¶ÞO¶ÞH¶ÞA¶Þ:¶Þ3¶Þ,¶Þ%¶Þ¶Þ¶Þ¶Þ ¶Þ¶ÞûµÞôµÞíµÞæµÞßµÞصÞѵÞʵÞõÞ¼µÞµµÞ®µÞ§µÞ µÞ™µÞ’µÞ‹µÞ„µÞ}µÞvµÞoµÞhµÞaµÞZµÞSµÞLµÞEµÞ>µÞ7µÞ0µÞ)µÞ"µÞµÞµÞ µÞµÞÿ´Þø´Þñ´Þê´Þã´ÞÜ´ÞÕ´ÞδÞÇ´ÞÀ´Þ¹´Þ²´Þ«´Þ¤´Þ´Þ–´Þ´Þˆ´Þ´Þz´Þs´Þl´Þe´Þ^´ÞW´ÞP´ÞI´ÞB´Þ;´Þ4´Þ-´Þ&´Þ´Þ´Þ´Þ ´Þ´Þü³Þõ³Þî³Þç³Þà³ÞÙ³ÞÒ³Þ˳ÞijÞ½³Þ¶³Þ¯³Þ¨³Þ¡³Þš³Þ“³ÞŒ³Þ…³Þ~³Þw³Þp³Þi³Þb³Þ[³ÞT³ÞM³ÞF³Þ?³Þ8³Þ1³Þ*³Þ#³Þ³Þ³Þ³Þ³Þ³Þù²Þò²Þë²Þä²ÞݲÞÖ²ÞϲÞȲÞÁ²Þº²Þ³²Þ¬²Þ¥²Þž²Þ—²Þ²Þ‰²Þ‚²Þ{²Þt²Þm²Þf²Þ_²ÞX²ÞQ²ÞJ²ÞC²Þ<²Þ5²Þ.²Þ'²Þ ²Þ²Þ²Þ ²Þ²Þý±Þö±Þï±Þè±Þá±ÞÚ±ÞÓ±Þ̱ÞűÞ¾±Þ·±Þ°±Þ©±Þ¢±Þ›±Þ”±Þ±Þ†±Þ±Þx±Þq±Þj±Þc±Þ\±ÞU±ÞN±ÞG±Þ@±Þ9±Þ2±Þ+±Þ$±Þ±Þ±Þ±Þ±Þ±Þú°Þó°Þì°Þå°ÞÞ°Þ×°ÞаÞɰÞ°Þ»°Þ´°Þ­°Þ¦°ÞŸ°Þ˜°Þ‘°ÞаÞƒ°Þ|°Þu°Þn°Þg°Þ`°ÞY°ÞR°ÞK°ÞD°Þ=°Þ6°Þ/°Þ(°Þ!°Þ°Þ°Þ °Þ°Þþ¯Þ÷¯Þð¯Þé¯Þâ¯ÞÛ¯ÞÔ¯ÞͯÞƯÞ¿¯Þ¸¯Þ±¯Þª¯Þ£¯Þœ¯Þ•¯ÞޝÞ‡¯Þ€¯Þy¯Þr¯Þk¯Þd¯Þ]¯ÞV¯ÞO¯ÞH¯ÞA¯Þ:¯Þ3¯Þ,¯Þ%¯Þ¯Þ¯Þ¯Þ ¯Þ¯Þû®Þô®Þí®Þæ®Þß®ÞØ®ÞÑ®ÞÊ®ÞîÞ¼®Þµ®Þ®®Þ§®Þ ®Þ™®Þ’®Þ‹®Þ„®Þ}®Þv®Þo®Þh®Þa®ÞZ®ÞS®ÞL®ÞE®Þ>®Þ7®Þ0®Þ)®Þ"®Þ®Þ®Þ ®Þ®Þÿ­Þø­Þñ­Þê­Þã­ÞÜ­ÞÕ­ÞέÞÇ­ÞÀ­Þ¹­Þ²­Þ«­Þ¤­Þ­Þ–­Þ­Þˆ­Þ­Þz­Þs­Þl­Þe­Þ^­ÞW­ÞP­ÞI­ÞB­Þ;­Þ4­Þ-­Þ&­Þ­Þ­Þ­Þ ­Þ­Þü¬Þõ¬Þî¬Þç¬Þà¬ÞÙ¬ÞÒ¬ÞˬÞĬÞ½¬Þ¶¬Þ¯¬Þ¨¬Þ¡¬Þš¬Þ“¬ÞŒ¬Þ…¬Þ~¬Þw¬Þp¬Þi¬Þb¬Þ[¬ÞT¬ÞM¬ÞF¬Þ?¬Þ8¬Þ1¬Þ*¬Þ#¬Þ¬Þ¬Þ¬Þ¬Þ¬Þù«Þò«Þë«Þä«ÞÝ«ÞÖ«ÞÏ«ÞÈ«ÞÁ«Þº«Þ³«Þ¬«Þ¥«Þž«Þ—«Þ«Þ‰«Þ‚«Þ{«Þt«Þm«Þf«Þ_«ÞX«ÞQ«ÞJ«ÞC«Þ<«Þ5«Þ.«Þ'«Þ «Þ«Þ«Þ «Þ«ÞýªÞöªÞïªÞèªÞáªÞÚªÞÓªÞ̪ÞŪÞ¾ªÞ·ªÞ°ªÞ©ªÞ¢ªÞ›ªÞ”ªÞªÞ†ªÞªÞxªÞqªÞjªÞcªÞ\ªÞUªÞNªÞGªÞ@ªÞ9ªÞ2ªÞ+ªÞ$ªÞªÞªÞªÞªÞªÞú©Þó©Þì©Þå©ÞÞ©ÞשÞЩÞɩީ޻©Þ´©Þ­©Þ¦©ÞŸ©Þ˜©Þ‘©ÞŠ©Þƒ©Þ|©Þu©Þn©Þg©Þ`©ÞY©ÞR©ÞK©ÞD©Þ=©Þ6©Þ/©Þ(©Þ!©Þ©Þ©Þ ©Þ©Þþ¨Þ÷¨Þð¨Þé¨Þâ¨ÞÛ¨ÞÔ¨ÞͨÞƨÞ¿¨Þ¸¨Þ±¨Þª¨Þ£¨Þœ¨Þ•¨ÞލÞ‡¨Þ€¨Þy¨Þr¨Þk¨Þd¨Þ]¨ÞV¨ÞO¨ÞH¨ÞA¨Þ:¨Þ3¨Þ,¨Þ%¨Þ¨Þ¨Þ¨Þ ¨Þ¨Þû§Þô§Þí§Þæ§Þß§ÞاÞѧÞʧÞçÞ¼§Þµ§Þ®§Þ§§Þ §Þ™§Þ’§Þ‹§Þ„§Þ}§Þv§Þo§Þh§Þa§ÞZ§ÞS§ÞL§ÞE§Þ>§Þ7§Þ0§Þ)§Þ"§Þ§Þ§Þ §Þ§Þÿ¦Þø¦Þñ¦Þê¦Þã¦ÞܦÞÕ¦ÞΦÞǦÞÀ¦Þ¹¦Þ²¦Þ«¦Þ¤¦Þ¦Þ–¦Þ¦Þˆ¦Þ¦Þz¦Þs¦Þl¦Þe¦Þ^¦ÞW¦ÞP¦ÞI¦ÞB¦Þ;¦Þ4¦Þ-¦Þ&¦Þ¦Þ¦Þ¦Þ ¦Þ¦Þü¥Þõ¥Þî¥Þç¥Þà¥ÞÙ¥ÞÒ¥ÞË¥ÞÄ¥Þ½¥Þ¶¥Þ¯¥Þ¨¥Þ¡¥Þš¥Þ“¥ÞŒ¥Þ…¥Þ~¥Þw¥Þp¥Þi¥Þb¥Þ[¥ÞT¥ÞM¥ÞF¥Þ?¥Þ8¥Þ1¥Þ*¥Þ#¥Þ¥Þ¥Þ¥Þ¥Þ¥Þù¤Þò¤Þë¤Þä¤ÞݤÞÖ¤ÞϤÞȤÞÁ¤Þº¤Þ³¤Þ¬¤Þ¥¤Þž¤Þ—¤Þ¤Þ‰¤Þ‚¤Þ{¤Þt¤Þm¤Þf¤Þ_¤ÞX¤ÞQ¤ÞJ¤ÞC¤Þ<¤Þ5¤Þ.¤Þ'¤Þ ¤Þ¤Þ¤Þ ¤Þ¤Þý£Þö£Þï£Þè£Þá£ÞÚ£ÞÓ£ÞÌ£ÞÅ£Þ¾£Þ·£Þ°£Þ©£Þ¢£Þ›£Þ”£Þ£Þ†£Þ£Þx£Þq£Þj£Þc£Þ\£ÞU£ÞN£ÞG£Þ@£Þ9£Þ2£Þ+£Þ$£Þ£Þ£Þ£Þ£Þ£Þú¢Þó¢Þì¢Þå¢ÞÞ¢Þ×¢ÞТÞÉ¢Þ¢Þ»¢Þ´¢Þ­¢Þ¦¢ÞŸ¢Þ˜¢Þ‘¢ÞŠ¢Þƒ¢Þ|¢Þu¢Þn¢Þg¢Þ`¢ÞY¢ÞR¢ÞK¢ÞD¢Þ=¢Þ6¢Þ/¢Þ(¢Þ!¢Þ¢Þ¢Þ ¢Þ¢Þþ¡Þ÷¡Þð¡Þé¡Þâ¡ÞÛ¡ÞÔ¡ÞÍ¡ÞÆ¡Þ¿¡Þ¸¡Þ±¡Þª¡Þ£¡Þœ¡Þ•¡ÞŽ¡Þ‡¡Þ€¡Þy¡Þr¡Þk¡Þd¡Þ]¡ÞV¡ÞO¡ÞH¡ÞA¡Þ:¡Þ3¡Þ,¡Þ%¡Þ¡Þ¡Þ¡Þ ¡Þ¡Þû Þô Þí Þæ Þß ÞØ ÞÑ ÞÊ ÞàÞ¼ Þµ Þ® Þ§ Þ  Þ™ Þ’ Þ‹ Þ„ Þ} Þv Þo Þh Þa ÞZ ÞS ÞL ÞE Þ> Þ7 Þ0 Þ) Þ" Þ Þ Þ  Þ ÞÿŸÞøŸÞñŸÞêŸÞãŸÞÜŸÞÕŸÞΟÞÇŸÞÀŸÞ¹ŸÞ²ŸÞ«ŸÞ¤ŸÞŸÞ–ŸÞŸÞˆŸÞŸÞzŸÞsŸÞlŸÞeŸÞ^ŸÞWŸÞPŸÞIŸÞBŸÞ;ŸÞ4ŸÞ-ŸÞ&ŸÞŸÞŸÞŸÞ ŸÞŸÞüžÞõžÞîžÞçžÞàžÞÙžÞÒžÞËžÞÄžÞ½žÞ¶žÞ¯žÞ¨žÞ¡žÞšžÞ“žÞŒžÞ…žÞ~žÞwžÞpžÞižÞbžÞ[žÞTžÞMžÞFžÞ?žÞ8žÞ1žÞ*žÞ#žÞžÞžÞžÞžÞžÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýœÞöœÞïœÞèœÞáœÞÚœÞÓœÞÌœÞŜ޾œÞ·œÞ°œÞ©œÞ¢œÞ›œÞ”œÞœÞ†œÞœÞxœÞqœÞjœÞcœÞ\œÞUœÞNœÞGœÞ@œÞ9œÞ2œÞ+œÞ$œÞœÞœÞœÞœÞœÞú›Þó›Þì›Þå›ÞÞ›Þ×›ÞЛÞɛޛ޻›Þ´›Þ­›Þ¦›ÞŸ›Þ˜›Þ‘›ÞŠ›Þƒ›Þ|›Þu›Þn›Þg›Þ`›ÞY›ÞR›ÞK›ÞD›Þ=›Þ6›Þ/›Þ(›Þ!›Þ›Þ›Þ ›Þ›ÞþšÞ÷šÞðšÞéšÞâšÞÛšÞÔšÞÍšÞÆšÞ¿šÞ¸šÞ±šÞªšÞ£šÞœšÞ•šÞŽšÞ‡šÞ€šÞyšÞršÞkšÞdšÞ]šÞVšÞOšÞHšÞAšÞ:šÞ3šÞ,šÞ%šÞšÞšÞšÞ šÞšÞû™Þô™Þí™Þæ™Þß™ÞØ™ÞÑ™ÞÊ™ÞÙÞ¼™Þµ™Þ®™Þ§™Þ ™Þ™™Þ’™Þ‹™Þ„™Þ}™Þv™Þo™Þh™Þa™ÞZ™ÞS™ÞL™ÞE™Þ>™Þ7™Þ0™Þ)™Þ"™Þ™Þ™Þ ™Þ™Þÿ˜Þø˜Þñ˜Þê˜Þã˜ÞܘÞÕ˜ÞΘÞǘÞÀ˜Þ¹˜Þ²˜Þ«˜Þ¤˜Þ˜Þ–˜Þ˜Þˆ˜Þ˜Þz˜Þs˜Þl˜Þe˜Þ^˜ÞW˜ÞP˜ÞI˜ÞB˜Þ;˜Þ4˜Þ-˜Þ&˜Þ˜Þ˜Þ˜Þ ˜Þ˜Þü—Þõ—Þî—Þç—Þà—ÞÙ—ÞÒ—ÞË—ÞÄ—Þ½—Þ¶—Þ¯—Þ¨—Þ¡—Þš—Þ“—ÞŒ—Þ…—Þ~—Þw—Þp—Þi—Þb—Þ[—ÞT—ÞM—ÞF—Þ?—Þ8—Þ1—Þ*—Þ#—Þ—Þ—Þ—Þ—Þ—Þù–Þò–Þë–Þä–ÞÝ–ÞÖ–ÞÏ–ÞÈ–ÞÁ–Þº–Þ³–Þ¬–Þ¥–Þž–Þ—–Þ–Þ‰–Þ‚–Þ{–Þt–Þm–Þf–Þ_–ÞX–ÞQ–ÞJ–ÞC–Þ<–Þ5–Þ.–Þ'–Þ –Þ–Þ–Þ –Þ–Þý•Þö•Þï•Þè•Þá•ÞÚ•ÞÓ•ÞÌ•Þŕ޾•Þ·•Þ°•Þ©•Þ¢•Þ›•Þ”•Þ•Þ†•Þ•Þx•Þq•Þj•Þc•Þ\•ÞU•ÞN•ÞG•Þ@•Þ9•Þ2•Þ+•Þ$•Þ•Þ•Þ•Þ•Þ•Þú”Þó”Þì”Þå”ÞÞ”Þ×”ÞДÞɔޔ޻”Þ´”Þ­”Þ¦”ÞŸ”Þ˜”Þ‘”ÞŠ”Þƒ”Þ|”Þu”Þn”Þg”Þ`”ÞY”ÞR”ÞK”ÞD”Þ=”Þ6”Þ/”Þ(”Þ!”Þ”Þ”Þ ”Þ”Þþ“Þ÷“Þð“Þé“Þâ“ÞÛ“ÞÔ“ÞÍ“ÞÆ“Þ¿“Þ¸“Þ±“Þª“Þ£“Þœ“Þ•“ÞŽ“Þ‡“Þ€“Þy“Þr“Þk“Þd“Þ]“ÞV“ÞO“ÞH“ÞA“Þ:“Þ3“Þ,“Þ%“Þ“Þ“Þ“Þ “Þ“Þû’Þô’Þí’Þæ’Þß’ÞØ’ÞÑ’ÞÊ’ÞÃ’Þ¼’Þµ’Þ®’Þ§’Þ ’Þ™’Þ’’Þ‹’Þ„’Þ}’Þv’Þo’Þh’Þa’ÞZ’ÞS’ÞL’ÞE’Þ>’Þ7’Þ0’Þ)’Þ"’Þ’Þ’Þ ’Þ’Þÿ‘Þø‘Þñ‘Þê‘Þã‘ÞÜ‘ÞÕ‘ÞΑÞÇ‘ÞÀ‘Þ¹‘Þ²‘Þ«‘Þ¤‘Þ‘Þ–‘Þ‘Þˆ‘Þ‘Þz‘Þs‘Þl‘Þe‘Þ^‘ÞW‘ÞP‘ÞI‘ÞB‘Þ;‘Þ4‘Þ-‘Þ&‘Þ‘Þ‘Þ‘Þ ‘Þ‘ÞüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýŽÞöŽÞïŽÞèŽÞáŽÞÚŽÞÓŽÞÌŽÞÅŽÞ¾ŽÞ·ŽÞ°ŽÞ©ŽÞ¢ŽÞ›ŽÞ”ŽÞŽÞ†ŽÞŽÞxŽÞqŽÞjŽÞcŽÞ\ŽÞUŽÞNŽÞGŽÞ@ŽÞ9ŽÞ2ŽÞ+ŽÞ$ŽÞŽÞŽÞŽÞŽÞŽÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþŒÞ÷ŒÞðŒÞéŒÞâŒÞÛŒÞÔŒÞÍŒÞÆŒÞ¿ŒÞ¸ŒÞ±ŒÞªŒÞ£ŒÞœŒÞ•ŒÞŽŒÞ‡ŒÞ€ŒÞyŒÞrŒÞkŒÞdŒÞ]ŒÞVŒÞOŒÞHŒÞAŒÞ:ŒÞ3ŒÞ,ŒÞ%ŒÞŒÞŒÞŒÞ ŒÞŒÞû‹Þô‹Þí‹Þæ‹Þß‹ÞØ‹ÞÑ‹ÞÊ‹ÞËÞ¼‹Þµ‹Þ®‹Þ§‹Þ ‹Þ™‹Þ’‹Þ‹‹Þ„‹Þ}‹Þv‹Þo‹Þh‹Þa‹ÞZ‹ÞS‹ÞL‹ÞE‹Þ>‹Þ7‹Þ0‹Þ)‹Þ"‹Þ‹Þ‹Þ ‹Þ‹ÞÿŠÞøŠÞñŠÞêŠÞãŠÞÜŠÞÕŠÞΊÞÇŠÞÀŠÞ¹ŠÞ²ŠÞ«ŠÞ¤ŠÞŠÞ–ŠÞŠÞˆŠÞŠÞzŠÞsŠÞlŠÞeŠÞ^ŠÞWŠÞPŠÞIŠÞBŠÞ;ŠÞ4ŠÞ-ŠÞ&ŠÞŠÞŠÞŠÞ ŠÞŠÞü‰Þõ‰Þî‰Þç‰Þà‰ÞÙ‰ÞÒ‰ÞˉÞĉÞ½‰Þ¶‰Þ¯‰Þ¨‰Þ¡‰Þš‰Þ“‰ÞŒ‰Þ…‰Þ~‰Þw‰Þp‰Þi‰Þb‰Þ[‰ÞT‰ÞM‰ÞF‰Þ?‰Þ8‰Þ1‰Þ*‰Þ#‰Þ‰Þ‰Þ‰Þ‰Þ‰ÞùˆÞòˆÞëˆÞäˆÞ݈ÞÖˆÞψÞȈÞÁˆÞºˆÞ³ˆÞ¬ˆÞ¥ˆÞžˆÞ—ˆÞˆÞ‰ˆÞ‚ˆÞ{ˆÞtˆÞmˆÞfˆÞ_ˆÞXˆÞQˆÞJˆÞCˆÞ<ˆÞ5ˆÞ.ˆÞ'ˆÞ ˆÞˆÞˆÞ ˆÞˆÞý‡Þö‡Þï‡Þè‡Þá‡ÞÚ‡ÞÓ‡Þ̇ÞŇÞ¾‡Þ·‡Þ°‡Þ©‡Þ¢‡Þ›‡Þ”‡Þ‡Þ†‡Þ‡Þx‡Þq‡Þj‡Þc‡Þ\‡ÞU‡ÞN‡ÞG‡Þ@‡Þ9‡Þ2‡Þ+‡Þ$‡Þ‡Þ‡Þ‡Þ‡Þ‡Þú†Þó†Þì†Þå†ÞÞ†Þ׆ÞІÞɆÞ†Þ»†Þ´†Þ­†Þ¦†ÞŸ†Þ˜†Þ‘†ÞІÞƒ†Þ|†Þu†Þn†Þg†Þ`†ÞY†ÞR†ÞK†ÞD†Þ=†Þ6†Þ/†Þ(†Þ!†Þ†Þ†Þ †Þ†Þþ…Þ÷…Þð…Þé…Þâ…ÞÛ…ÞÔ…ÞÍ…ÞÆ…Þ¿…Þ¸…Þ±…Þª…Þ£…Þœ…Þ•…ÞŽ…Þ‡…Þ€…Þy…Þr…Þk…Þd…Þ]…ÞV…ÞO…ÞH…ÞA…Þ:…Þ3…Þ,…Þ%…Þ…Þ…Þ…Þ …Þ…Þû„Þô„Þí„Þæ„Þß„ÞØ„ÞÑ„ÞÊ„ÞÄÞ¼„Þµ„Þ®„Þ§„Þ „Þ™„Þ’„Þ‹„Þ„„Þ}„Þv„Þo„Þh„Þa„ÞZ„ÞS„ÞL„ÞE„Þ>„Þ7„Þ0„Þ)„Þ"„Þ„Þ„Þ „Þ„ÞÿƒÞøƒÞñƒÞêƒÞãƒÞ܃ÞÕƒÞ΃ÞǃÞÀƒÞ¹ƒÞ²ƒÞ«ƒÞ¤ƒÞƒÞ–ƒÞƒÞˆƒÞƒÞzƒÞsƒÞlƒÞeƒÞ^ƒÞWƒÞPƒÞIƒÞBƒÞ;ƒÞ4ƒÞ-ƒÞ&ƒÞƒÞƒÞƒÞ ƒÞƒÞü‚Þõ‚Þî‚Þç‚Þà‚ÞÙ‚ÞÒ‚ÞË‚ÞĂ޽‚Þ¶‚Þ¯‚Þ¨‚Þ¡‚Þš‚Þ“‚ÞŒ‚Þ…‚Þ~‚Þw‚Þp‚Þi‚Þb‚Þ[‚ÞT‚ÞM‚ÞF‚Þ?‚Þ8‚Þ1‚Þ*‚Þ#‚Þ‚Þ‚Þ‚Þ‚Þ‚ÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞý€Þö€Þï€Þè€Þá€ÞÚ€ÞÓ€ÞÌ€ÞÅ€Þ¾€Þ·€Þ°€Þ©€Þ¢€Þ›€Þ”€Þ€Þ†€Þ€Þx€Þq€Þj€Þc€Þ\€ÞU€ÞN€ÞG€Þ@€Þ9€Þ2€Þ+€Þ$€Þ€Þ€Þ€Þ€Þ€ÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþ~Þ÷~Þð~Þé~Þâ~ÞÛ~ÞÔ~ÞÍ~ÞÆ~Þ¿~Þ¸~Þ±~Þª~Þ£~Þœ~Þ•~ÞŽ~Þ‡~Þ€~Þy~Þr~Þk~Þd~Þ]~ÞV~ÞO~ÞH~ÞA~Þ:~Þ3~Þ,~Þ%~Þ~Þ~Þ~Þ ~Þ~Þû}Þô}Þí}Þæ}Þß}ÞØ}ÞÑ}ÞÊ}ÞÃ}Þ¼}Þµ}Þ®}Þ§}Þ }Þ™}Þ’}Þ‹}Þ„}Þ}}Þv}Þo}Þh}Þa}ÞZ}ÞS}ÞL}ÞE}Þ>}Þ7}Þ0}Þ)}Þ"}Þ}Þ}Þ }Þ}Þÿ|Þø|Þñ|Þê|Þã|ÞÜ|ÞÕ|ÞÎ|ÞÇ|ÞÀ|Þ¹|Þ²|Þ«|Þ¤|Þ|Þ–|Þ|Þˆ|Þ|Þz|Þs|Þl|Þe|Þ^|ÞW|ÞP|ÞI|ÞB|Þ;|Þ4|Þ-|Þ&|Þ|Þ|Þ|Þ |Þ|Þü{Þõ{Þî{Þç{Þà{ÞÙ{ÞÒ{ÞË{ÞÄ{Þ½{Þ¶{Þ¯{Þ¨{Þ¡{Þš{Þ“{ÞŒ{Þ…{Þ~{Þw{Þp{Þi{Þb{Þ[{ÞT{ÞM{ÞF{Þ?{Þ8{Þ1{Þ*{Þ#{Þ{Þ{Þ{Þ{Þ{ÞùzÞòzÞëzÞäzÞÝzÞÖzÞÏzÞÈzÞÁzÞºzÞ³zÞ¬zÞ¥zÞžzÞ—zÞzÞ‰zÞ‚zÞ{zÞtzÞmzÞfzÞ_zÞXzÞQzÞJzÞCzÞvÞ7vÞ0vÞ)vÞ"vÞvÞvÞ vÞvÞÿuÞøuÞñuÞêuÞãuÞÜuÞÕuÞÎuÞÇuÞÀuÞ¹uÞ²uÞ«uÞ¤uÞuÞ–uÞuÞˆuÞuÞzuÞsuÞluÞeuÞ^uÞWuÞPuÞIuÞBuÞ;uÞ4uÞ-uÞ&uÞuÞuÞuÞ uÞuÞütÞõtÞîtÞçtÞàtÞÙtÞÒtÞËtÞÄtÞ½tÞ¶tÞ¯tÞ¨tÞ¡tÞštÞ“tÞŒtÞ…tÞ~tÞwtÞptÞitÞbtÞ[tÞTtÞMtÞFtÞ?tÞ8tÞ1tÞ*tÞ#tÞtÞtÞtÞtÞtÞùsÞòsÞësÞäsÞÝsÞÖsÞÏsÞÈsÞÁsÞºsÞ³sÞ¬sÞ¥sÞžsÞ—sÞsÞ‰sÞ‚sÞ{sÞtsÞmsÞfsÞ_sÞXsÞQsÞJsÞCsÞoÞ7oÞ0oÞ)oÞ"oÞoÞoÞ oÞoÞÿnÞønÞñnÞênÞãnÞÜnÞÕnÞÎnÞÇnÞÀnÞ¹nÞ²nÞ«nÞ¤nÞnÞ–nÞnÞˆnÞnÞznÞsnÞlnÞenÞ^nÞWnÞPnÞInÞBnÞ;nÞ4nÞ-nÞ&nÞnÞnÞnÞ nÞnÞümÞõmÞîmÞçmÞàmÞÙmÞÒmÞËmÞÄmÞ½mÞ¶mÞ¯mÞ¨mÞ¡mÞšmÞ“mÞŒmÞ…mÞ~mÞwmÞpmÞimÞbmÞ[mÞTmÞMmÞFmÞ?mÞ8mÞ1mÞ*mÞ#mÞmÞmÞmÞmÞmÞùlÞòlÞëlÞälÞÝlÞÖlÞÏlÞÈlÞÁlÞºlÞ³lÞ¬lÞ¥lÞžlÞ—lÞlÞ‰lÞ‚lÞ{lÞtlÞmlÞflÞ_lÞXlÞQlÞJlÞClÞhÞ7hÞ0hÞ)hÞ"hÞhÞhÞ hÞhÞÿgÞøgÞñgÞêgÞãgÞÜgÞÕgÞÎgÞÇgÞÀgÞ¹gÞ²gÞ«gÞ¤gÞgÞ–gÞgÞˆgÞgÞzgÞsgÞlgÞegÞ^gÞWgÞPgÞIgÞBgÞ;gÞ4gÞ-gÞ&gÞgÞgÞgÞ gÞgÞüfÞõfÞîfÞçfÞàfÞÙfÞÒfÞËfÞÄfÞ½fÞ¶fÞ¯fÞ¨fÞ¡fÞšfÞ“fÞŒfÞ…fÞ~fÞwfÞpfÞifÞbfÞ[fÞTfÞMfÞFfÞ?fÞ8fÞ1fÞ*fÞ#fÞfÞfÞfÞfÞfÞùeÞòeÞëeÞäeÞÝeÞÖeÞÏeÞÈeÞÁeÞºeÞ³eÞ¬eÞ¥eÞžeÞ—eÞeÞ‰eÞ‚eÞ{eÞteÞmeÞfeÞ_eÞXeÞQeÞJeÞCeÞaÞ7aÞ0aÞ)aÞ"aÞaÞaÞ aÞaÞÿ`Þø`Þñ`Þê`Þã`ÞÜ`ÞÕ`ÞÎ`ÞÇ`ÞÀ`Þ¹`Þ²`Þ«`Þ¤`Þ`Þ–`Þ`Þˆ`Þ`Þz`Þs`Þl`Þe`Þ^`ÞW`ÞP`ÞI`ÞB`Þ;`Þ4`Þ-`Þ&`Þ`Þ`Þ`Þ `Þ`Þü_Þõ_Þî_Þç_Þà_ÞÙ_ÞÒ_ÞË_ÞÄ_Þ½_Þ¶_Þ¯_Þ¨_Þ¡_Þš_Þ“_ÞŒ_Þ…_Þ~_Þw_Þp_Þi_Þb_Þ[_ÞT_ÞM_ÞF_Þ?_Þ8_Þ1_Þ*_Þ#_Þ_Þ_Þ_Þ_Þ_Þù^Þò^Þë^Þä^ÞÝ^ÞÖ^ÞÏ^ÞÈ^ÞÁ^Þº^Þ³^Þ¬^Þ¥^Þž^Þ—^Þ^Þ‰^Þ‚^Þ{^Þt^Þm^Þf^Þ_^ÞX^ÞQ^ÞJ^ÞC^Þ<^Þ5^Þ.^Þ'^Þ ^Þ^Þ^Þ ^Þ^Þý]Þö]Þï]Þè]Þá]ÞÚ]ÞÓ]ÞÌ]ÞÅ]Þ¾]Þ·]Þ°]Þ©]Þ¢]Þ›]Þ”]Þ]Þ†]Þ]Þx]Þq]Þj]Þc]Þ\]ÞU]ÞN]ÞG]Þ@]Þ9]Þ2]Þ+]Þ$]Þ]Þ]Þ]Þ]Þ]Þú\Þó\Þì\Þå\ÞÞ\Þ×\ÞÐ\ÞÉ\ÞÂ\Þ»\Þ´\Þ­\Þ¦\ÞŸ\Þ˜\Þ‘\ÞŠ\Þƒ\Þ|\Þu\Þn\Þg\Þ`\ÞY\ÞR\ÞK\ÞD\Þ=\Þ6\Þ/\Þ(\Þ!\Þ\Þ\Þ \Þ\Þþ[Þ÷[Þð[Þé[Þâ[ÞÛ[ÞÔ[ÞÍ[ÞÆ[Þ¿[Þ¸[Þ±[Þª[Þ£[Þœ[Þ•[ÞŽ[Þ‡[Þ€[Þy[Þr[Þk[Þd[Þ][ÞV[ÞO[ÞH[ÞA[Þ:[Þ3[Þ,[Þ%[Þ[Þ[Þ[Þ [Þ[ÞûZÞôZÞíZÞæZÞßZÞØZÞÑZÞÊZÞÃZÞ¼ZÞµZÞ®ZÞ§ZÞ ZÞ™ZÞ’ZÞ‹ZÞ„ZÞ}ZÞvZÞoZÞhZÞaZÞZZÞSZÞLZÞEZÞ>ZÞ7ZÞ0ZÞ)ZÞ"ZÞZÞZÞ ZÞZÞÿYÞøYÞñYÞêYÞãYÞÜYÞÕYÞÎYÞÇYÞÀYÞ¹YÞ²YÞ«YÞ¤YÞYÞ–YÞYÞˆYÞYÞzYÞsYÞlYÞeYÞ^YÞWYÞPYÞIYÞBYÞ;YÞ4YÞ-YÞ&YÞYÞYÞYÞ YÞYÞüXÞõXÞîXÞçXÞàXÞÙXÞÒXÞËXÞÄXÞ½XÞ¶XÞ¯XÞ¨XÞ¡XÞšXÞ“XÞŒXÞ…XÞ~XÞwXÞpXÞiXÞbXÞ[XÞTXÞMXÞFXÞ?XÞ8XÞ1XÞ*XÞ#XÞXÞXÞXÞXÞXÞùWÞòWÞëWÞäWÞÝWÞÖWÞÏWÞÈWÞÁWÞºWÞ³WÞ¬WÞ¥WÞžWÞ—WÞWÞ‰WÞ‚WÞ{WÞtWÞmWÞfWÞ_WÞXWÞQWÞJWÞCWÞSÞ7SÞ0SÞ)SÞ"SÞSÞSÞ SÞSÞÿRÞøRÞñRÞêRÞãRÞÜRÞÕRÞÎRÞÇRÞÀRÞ¹RÞ²RÞ«RÞ¤RÞRÞ–RÞRÞˆRÞRÞzRÞsRÞlRÞeRÞ^RÞWRÞPRÞIRÞBRÞ;RÞ4RÞ-RÞ&RÞRÞRÞRÞ RÞRÞüQÞõQÞîQÞçQÞàQÞÙQÞÒQÞËQÞÄQÞ½QÞ¶QÞ¯QÞ¨QÞ¡QÞšQÞ“QÞŒQÞ…QÞ~QÞwQÞpQÞiQÞbQÞ[QÞTQÞMQÞFQÞ?QÞ8QÞ1QÞ*QÞ#QÞQÞQÞQÞQÞQÞùPÞòPÞëPÞäPÞÝPÞÖPÞÏPÞÈPÞÁPÞºPÞ³PÞ¬PÞ¥PÞžPÞ—PÞPÞ‰PÞ‚PÞ{PÞtPÞmPÞfPÞ_PÞXPÞQPÞJPÞCPÞLÞ7LÞ0LÞ)LÞ"LÞLÞLÞ LÞLÞÿKÞøKÞñKÞêKÞãKÞÜKÞÕKÞÎKÞÇKÞÀKÞ¹KÞ²KÞ«KÞ¤KÞKÞ–KÞKÞˆKÞKÞzKÞsKÞlKÞeKÞ^KÞWKÞPKÞIKÞBKÞ;KÞ4KÞ-KÞ&KÞKÞKÞKÞ KÞKÞüJÞõJÞîJÞçJÞàJÞÙJÞÒJÞËJÞÄJÞ½JÞ¶JÞ¯JÞ¨JÞ¡JÞšJÞ“JÞŒJÞ…JÞ~JÞwJÞpJÞiJÞbJÞ[JÞTJÞMJÞFJÞ?JÞ8JÞ1JÞ*JÞ#JÞJÞJÞJÞJÞJÞùIÞòIÞëIÞäIÞÝIÞÖIÞÏIÞÈIÞÁIÞºIÞ³IÞ¬IÞ¥IÞžIÞ—IÞIÞ‰IÞ‚IÞ{IÞtIÞmIÞfIÞ_IÞXIÞQIÞJIÞCIÞEÞ7EÞ0EÞ)EÞ"EÞEÞEÞ EÞEÞÿDÞøDÞñDÞêDÞãDÞÜDÞÕDÞÎDÞÇDÞÀDÞ¹DÞ²DÞ«DÞ¤DÞDÞ–DÞDÞˆDÞDÞzDÞsDÞlDÞeDÞ^DÞWDÞPDÞIDÞBDÞ;DÞ4DÞ-DÞ&DÞDÞDÞDÞ DÞDÞüCÞõCÞîCÞçCÞàCÞÙCÞÒCÞËCÞÄCÞ½CÞ¶CÞ¯CÞ¨CÞ¡CÞšCÞ“CÞŒCÞ…CÞ~CÞwCÞpCÞiCÞbCÞ[CÞTCÞMCÞFCÞ?CÞ8CÞ1CÞ*CÞ#CÞCÞCÞCÞCÞCÞùBÞòBÞëBÞäBÞÝBÞÖBÞÏBÞÈBÞÁBÞºBÞ³BÞ¬BÞ¥BÞžBÞ—BÞBÞ‰BÞ‚BÞ{BÞtBÞmBÞfBÞ_BÞXBÞQBÞJBÞCBÞÞô>Þí>Þæ>Þß>ÞØ>ÞÑ>ÞÊ>ÞÃ>Þ¼>Þµ>Þ®>Þ§>Þ >Þ™>Þ’>Þ‹>Þ„>Þ}>Þv>Þo>Þh>Þa>ÞZ>ÞS>ÞL>ÞE>Þ>>Þ7>Þ0>Þ)>Þ">Þ>Þ>Þ >Þ>Þÿ=Þø=Þñ=Þê=Þã=ÞÜ=ÞÕ=ÞÎ=ÞÇ=ÞÀ=Þ¹=Þ²=Þ«=Þ¤=Þ=Þ–=Þ=Þˆ=Þ=Þz=Þs=Þl=Þe=Þ^=ÞW=ÞP=ÞI=ÞB=Þ;=Þ4=Þ-=Þ&=Þ=Þ=Þ=Þ =Þ=Þü<Þõ<Þî<Þç<Þà<ÞÙ<ÞÒ<ÞË<ÞÄ<Þ½<Þ¶<Þ¯<Þ¨<Þ¡<Þš<Þ“<ÞŒ<Þ…<Þ~<Þw<Þp<Þi<Þb<Þ[<ÞT<ÞM<ÞF<Þ?<Þ8<Þ1<Þ*<Þ#<Þ<Þ<Þ<Þ<Þ<Þù;Þò;Þë;Þä;ÞÝ;ÞÖ;ÞÏ;ÞÈ;ÞÁ;Þº;Þ³;Þ¬;Þ¥;Þž;Þ—;Þ;Þ‰;Þ‚;Þ{;Þt;Þm;Þf;Þ_;ÞX;ÞQ;ÞJ;ÞC;Þ<;Þ5;Þ.;Þ';Þ ;Þ;Þ;Þ ;Þ;Þý:Þö:Þï:Þè:Þá:ÞÚ:ÞÓ:ÞÌ:ÞÅ:Þ¾:Þ·:Þ°:Þ©:Þ¢:Þ›:Þ”:Þ:Þ†:Þ:Þx:Þq:Þj:Þc:Þ\:ÞU:ÞN:ÞG:Þ@:Þ9:Þ2:Þ+:Þ$:Þ:Þ:Þ:Þ:Þ:Þú9Þó9Þì9Þå9ÞÞ9Þ×9ÞÐ9ÞÉ9ÞÂ9Þ»9Þ´9Þ­9Þ¦9ÞŸ9Þ˜9Þ‘9ÞŠ9Þƒ9Þ|9Þu9Þn9Þg9Þ`9ÞY9ÞR9ÞK9ÞD9Þ=9Þ69Þ/9Þ(9Þ!9Þ9Þ9Þ 9Þ9Þþ8Þ÷8Þð8Þé8Þâ8ÞÛ8ÞÔ8ÞÍ8ÞÆ8Þ¿8Þ¸8Þ±8Þª8Þ£8Þœ8Þ•8ÞŽ8Þ‡8Þ€8Þy8Þr8Þk8Þd8Þ]8ÞV8ÞO8ÞH8ÞA8Þ:8Þ38Þ,8Þ%8Þ8Þ8Þ8Þ 8Þ8Þû7Þô7Þí7Þæ7Þß7ÞØ7ÞÑ7ÞÊ7ÞÃ7Þ¼7Þµ7Þ®7Þ§7Þ 7Þ™7Þ’7Þ‹7Þ„7Þ}7Þv7Þo7Þh7Þa7ÞZ7ÞS7ÞL7ÞE7Þ>7Þ77Þ07Þ)7Þ"7Þ7Þ7Þ 7Þ7Þÿ6Þø6Þñ6Þê6Þã6ÞÜ6ÞÕ6ÞÎ6ÞÇ6ÞÀ6Þ¹6Þ²6Þ«6Þ¤6Þ6Þ–6Þ6Þˆ6Þ6Þz6Þs6Þl6Þe6Þ^6ÞW6ÞP6ÞI6ÞB6Þ;6Þ46Þ-6Þ&6Þ6Þ6Þ6Þ 6Þ6Þü5Þõ5Þî5Þç5Þà5ÞÙ5ÞÒ5ÞË5ÞÄ5Þ½5Þ¶5Þ¯5Þ¨5Þ¡5Þš5Þ“5ÞŒ5Þ…5Þ~5Þw5Þp5Þi5Þb5Þ[5ÞT5ÞM5ÞF5Þ?5Þ85Þ15Þ*5Þ#5Þ5Þ5Þ5Þ5Þ5Þù4Þò4Þë4Þä4ÞÝ4ÞÖ4ÞÏ4ÞÈ4ÞÁ4Þº4Þ³4Þ¬4Þ¥4Þž4Þ—4Þ4Þ‰4Þ‚4Þ{4Þt4Þm4Þf4Þ_4ÞX4ÞQ4ÞJ4ÞC4Þ<4Þ54Þ.4Þ'4Þ 4Þ4Þ4Þ 4Þ4Þý3Þö3Þï3Þè3Þá3ÞÚ3ÞÓ3ÞÌ3ÞÅ3Þ¾3Þ·3Þ°3Þ©3Þ¢3Þ›3Þ”3Þ3Þ†3Þ3Þx3Þq3Þj3Þc3Þ\3ÞU3ÞN3ÞG3Þ@3Þ93Þ23Þ+3Þ$3Þ3Þ3Þ3Þ3Þ3Þú2Þó2Þì2Þå2ÞÞ2Þ×2ÞÐ2ÞÉ2ÞÂ2Þ»2Þ´2Þ­2Þ¦2ÞŸ2Þ˜2Þ‘2ÞŠ2Þƒ2Þ|2Þu2Þn2Þg2Þ`2ÞY2ÞR2ÞK2ÞD2Þ=2Þ62Þ/2Þ(2Þ!2Þ2Þ2Þ 2Þ2Þþ1Þ÷1Þð1Þé1Þâ1ÞÛ1ÞÔ1ÞÍ1ÞÆ1Þ¿1Þ¸1Þ±1Þª1Þ£1Þœ1Þ•1ÞŽ1Þ‡1Þ€1Þy1Þr1Þk1Þd1Þ]1ÞV1ÞO1ÞH1ÞA1Þ:1Þ31Þ,1Þ%1Þ1Þ1Þ1Þ 1Þ1Þû0Þô0Þí0Þæ0Þß0ÞØ0ÞÑ0ÞÊ0ÞÃ0Þ¼0Þµ0Þ®0Þ§0Þ 0Þ™0Þ’0Þ‹0Þ„0Þ}0Þv0Þo0Þh0Þa0ÞZ0ÞS0ÞL0ÞE0Þ>0Þ70Þ00Þ)0Þ"0Þ0Þ0Þ 0Þ0Þÿ/Þø/Þñ/Þê/Þã/ÞÜ/ÞÕ/ÞÎ/ÞÇ/ÞÀ/Þ¹/Þ²/Þ«/Þ¤/Þ/Þ–/Þ/Þˆ/Þ/Þz/Þs/Þl/Þe/Þ^/ÞW/ÞP/ÞI/ÞB/Þ;/Þ4/Þ-/Þ&/Þ/Þ/Þ/Þ /Þ/Þü.Þõ.Þî.Þç.Þà.ÞÙ.ÞÒ.ÞË.ÞÄ.Þ½.Þ¶.Þ¯.Þ¨.Þ¡.Þš.Þ“.ÞŒ.Þ….Þ~.Þw.Þp.Þi.Þb.Þ[.ÞT.ÞM.ÞF.Þ?.Þ8.Þ1.Þ*.Þ#.Þ.Þ.Þ.Þ.Þ.Þù-Þò-Þë-Þä-ÞÝ-ÞÖ-ÞÏ-ÞÈ-ÞÁ-Þº-Þ³-Þ¬-Þ¥-Þž-Þ—-Þ-Þ‰-Þ‚-Þ{-Þt-Þm-Þf-Þ_-ÞX-ÞQ-ÞJ-ÞC-Þ<-Þ5-Þ.-Þ'-Þ -Þ-Þ-Þ -Þ-Þý,Þö,Þï,Þè,Þá,ÞÚ,ÞÓ,ÞÌ,ÞÅ,Þ¾,Þ·,Þ°,Þ©,Þ¢,Þ›,Þ”,Þ,Þ†,Þ,Þx,Þq,Þj,Þc,Þ\,ÞU,ÞN,ÞG,Þ@,Þ9,Þ2,Þ+,Þ$,Þ,Þ,Þ,Þ,Þ,Þú+Þó+Þì+Þå+ÞÞ+Þ×+ÞÐ+ÞÉ+ÞÂ+Þ»+Þ´+Þ­+Þ¦+ÞŸ+Þ˜+Þ‘+ÞŠ+Þƒ+Þ|+Þu+Þn+Þg+Þ`+ÞY+ÞR+ÞK+ÞD+Þ=+Þ6+Þ/+Þ(+Þ!+Þ+Þ+Þ +Þ+Þþ*Þ÷*Þð*Þé*Þâ*ÞÛ*ÞÔ*ÞÍ*ÞÆ*Þ¿*Þ¸*Þ±*Þª*Þ£*Þœ*Þ•*ÞŽ*Þ‡*Þ€*Þy*Þr*Þk*Þd*Þ]*ÞV*ÞO*ÞH*ÞA*Þ:*Þ3*Þ,*Þ%*Þ*Þ*Þ*Þ *Þ*Þû)Þô)Þí)Þæ)Þß)ÞØ)ÞÑ)ÞÊ)ÞÃ)Þ¼)Þµ)Þ®)Þ§)Þ )Þ™)Þ’)Þ‹)Þ„)Þ})Þv)Þo)Þh)Þa)ÞZ)ÞS)ÞL)ÞE)Þ>)Þ7)Þ0)Þ))Þ")Þ)Þ)Þ )Þ)Þÿ(Þø(Þñ(Þê(Þã(ÞÜ(ÞÕ(ÞÎ(ÞÇ(ÞÀ(Þ¹(Þ²(Þ«(Þ¤(Þ(Þ–(Þ(Þˆ(Þ(Þz(Þs(Þl(Þe(Þ^(ÞW(ÞP(ÞI(ÞB(Þ;(Þ4(Þ-(Þ&(Þ(Þ(Þ(Þ (Þ(Þü'Þõ'Þî'Þç'Þà'ÞÙ'ÞÒ'ÞË'ÞÄ'Þ½'Þ¶'Þ¯'Þ¨'Þ¡'Þš'Þ“'ÞŒ'Þ…'Þ~'Þw'Þp'Þi'Þb'Þ['ÞT'ÞM'ÞF'Þ?'Þ8'Þ1'Þ*'Þ#'Þ'Þ'Þ'Þ'Þ'Þù&Þò&Þë&Þä&ÞÝ&ÞÖ&ÞÏ&ÞÈ&ÞÁ&Þº&Þ³&Þ¬&Þ¥&Þž&Þ—&Þ&Þ‰&Þ‚&Þ{&Þt&Þm&Þf&Þ_&ÞX&ÞQ&ÞJ&ÞC&Þ<&Þ5&Þ.&Þ'&Þ &Þ&Þ&Þ &Þ&Þý%Þö%Þï%Þè%Þá%ÞÚ%ÞÓ%ÞÌ%ÞÅ%Þ¾%Þ·%Þ°%Þ©%Þ¢%Þ›%Þ”%Þ%Þ†%Þ%Þx%Þq%Þj%Þc%Þ\%ÞU%ÞN%ÞG%Þ@%Þ9%Þ2%Þ+%Þ$%Þ%Þ%Þ%Þ%Þ%Þú$Þó$Þì$Þå$ÞÞ$Þ×$ÞÐ$ÞÉ$ÞÂ$Þ»$Þ´$Þ­$Þ¦$ÞŸ$Þ˜$Þ‘$ÞŠ$Þƒ$Þ|$Þu$Þn$Þg$Þ`$ÞY$ÞR$ÞK$ÞD$Þ=$Þ6$Þ/$Þ($Þ!$Þ$Þ$Þ $Þ$Þþ#Þ÷#Þð#Þé#Þâ#ÞÛ#ÞÔ#ÞÍ#ÞÆ#Þ¿#Þ¸#Þ±#Þª#Þ£#Þœ#Þ•#ÞŽ#Þ‡#Þ€#Þy#Þr#Þk#Þd#Þ]#ÞV#ÞO#ÞH#ÞA#Þ:#Þ3#Þ,#Þ%#Þ#Þ#Þ#Þ #Þ#Þû"Þô"Þí"Þæ"Þß"ÞØ"ÞÑ"ÞÊ"ÞÃ"Þ¼"Þµ"Þ®"Þ§"Þ "Þ™"Þ’"Þ‹"Þ„"Þ}"Þv"Þo"Þh"Þa"ÞZ"ÞS"ÞL"ÞE"Þ>"Þ7"Þ0"Þ)"Þ""Þ"Þ"Þ "Þ"Þÿ!Þø!Þñ!Þê!Þã!ÞÜ!ÞÕ!ÞÎ!ÞÇ!ÞÀ!Þ¹!Þ²!Þ«!Þ¤!Þ!Þ–!Þ!Þˆ!Þ!Þz!Þs!Þl!Þe!Þ^!ÞW!ÞP!ÞI!ÞB!Þ;!Þ4!Þ-!Þ&!Þ!Þ!Þ!Þ !Þ!Þü Þõ Þî Þç Þà ÞÙ ÞÒ ÞË ÞÄ Þ½ Þ¶ Þ¯ Þ¨ Þ¡ Þš Þ“ ÞŒ Þ… Þ~ Þw Þp Þi Þb Þ[ ÞT ÞM ÞF Þ? Þ8 Þ1 Þ* Þ# Þ Þ Þ Þ Þ ÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞû Þô Þí Þæ Þß ÞØ ÞÑ ÞÊ Þà Þ¼ Þµ Þ® Þ§ Þ  Þ™ Þ’ Þ‹ Þ„ Þ} Þv Þo Þh Þa ÞZ ÞS ÞL ÞE Þ> Þ7 Þ0 Þ) Þ" Þ Þ Þ Þ Þÿ Þø Þñ Þê Þã ÞÜ ÞÕ ÞÎ ÞÇ ÞÀ Þ¹ Þ² Þ« Þ¤ Þ Þ– Þ Þˆ Þ Þz Þs Þl Þe Þ^ ÞW ÞP ÞI ÞB Þ; Þ4 Þ- Þ& Þ Þ Þ Þ Þ Þü Þõ Þî Þç Þà ÞÙ ÞÒ ÞË ÞÄ Þ½ Þ¶ Þ¯ Þ¨ Þ¡ Þš Þ“ ÞŒ Þ… Þ~ Þw Þp Þi Þb Þ[ ÞT ÞM ÞF Þ? Þ8 Þ1 Þ* Þ# Þ Þ Þ Þ Þ Þù Þò Þë Þä ÞÝ ÞÖ ÞÏ ÞÈ ÞÁ Þº Þ³ Þ¬ Þ¥ Þž Þ— Þ Þ‰ Þ‚ Þ{ Þt Þm Þf Þ_ ÞX ÞQ ÞJ ÞC Þ< Þ5 Þ. Þ' Þ Þ Þ Þ Þ Þý Þö Þï Þè Þá ÞÚ ÞÓ ÞÌ ÞÅ Þ¾ Þ· Þ° Þ© Þ¢ Þ› Þ” Þ Þ† Þ Þx Þq Þj Þc Þ\ ÞU ÞN ÞG Þ@ Þ9 Þ2 Þ+ Þ$ Þ Þ Þ Þ Þ ÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÿÝôÿÝíÿÝæÿÝßÿÝØÿÝÑÿÝÊÿÝÃÿݼÿݵÿÝ®ÿݧÿÝ ÿÝ™ÿÝ’ÿÝ‹ÿÝ„ÿÝ}ÿÝvÿÝoÿÝhÿÝaÿÝZÿÝSÿÝLÿÝEÿÝ>ÿÝ7ÿÝ0ÿÝ)ÿÝ"ÿÝÿÝÿÝ ÿÝÿÝÿþÝøþÝñþÝêþÝãþÝÜþÝÕþÝÎþÝÇþÝÀþݹþݲþÝ«þݤþÝþÝ–þÝþ݈þÝþÝzþÝsþÝlþÝeþÝ^þÝWþÝPþÝIþÝBþÝ;þÝ4þÝ-þÝ&þÝþÝþÝþÝ þÝþÝüýÝõýÝîýÝçýÝàýÝÙýÝÒýÝËýÝÄýݽýݶýݯýݨýÝ¡ýÝšýÝ“ýÝŒýÝ…ýÝ~ýÝwýÝpýÝiýÝbýÝ[ýÝTýÝMýÝFýÝ?ýÝ8ýÝ1ýÝ*ýÝ#ýÝýÝýÝýÝýÝýÝùüÝòüÝëüÝäüÝÝüÝÖüÝÏüÝÈüÝÁüݺüݳüݬüÝ¥üÝžüÝ—üÝü݉üÝ‚üÝ{üÝtüÝmüÝfüÝ_üÝXüÝQüÝJüÝCüÝ<üÝ5üÝ.üÝ'üÝ üÝüÝüÝ üÝüÝýûÝöûÝïûÝèûÝáûÝÚûÝÓûÝÌûÝÅûݾûÝ·ûݰûÝ©ûÝ¢ûÝ›ûÝ”ûÝû݆ûÝûÝxûÝqûÝjûÝcûÝ\ûÝUûÝNûÝGûÝ@ûÝ9ûÝ2ûÝ+ûÝ$ûÝûÝûÝûÝûÝûÝúúÝóúÝìúÝåúÝÞúÝ×úÝÐúÝÉúÝÂúÝ»úÝ´úÝ­úݦúÝŸúݘúÝ‘úÝŠú݃úÝ|úÝuúÝnúÝgúÝ`úÝYúÝRúÝKúÝDúÝ=úÝ6úÝ/úÝ(úÝ!úÝúÝúÝ úÝúÝþùÝ÷ùÝðùÝéùÝâùÝÛùÝÔùÝÍùÝÆùÝ¿ùݸùݱùݪùÝ£ùÝœùÝ•ùÝŽù݇ùÝ€ùÝyùÝrùÝkùÝdùÝ]ùÝVùÝOùÝHùÝAùÝ:ùÝ3ùÝ,ùÝ%ùÝùÝùÝùÝ ùÝùÝûøÝôøÝíøÝæøÝßøÝØøÝÑøÝÊøÝÃøÝ¼øÝµøÝ®øÝ§øÝ øÝ™øÝ’øÝ‹øÝ„øÝ}øÝvøÝoøÝhøÝaøÝZøÝSøÝLøÝEøÝ>øÝ7øÝ0øÝ)øÝ"øÝøÝøÝ øÝøÝÿ÷Ýø÷Ýñ÷Ýê÷Ýã÷ÝÜ÷ÝÕ÷ÝÎ÷ÝÇ÷ÝÀ÷ݹ÷ݲ÷Ý«÷ݤ÷Ý÷Ý–÷Ý÷݈÷Ý÷Ýz÷Ýs÷Ýl÷Ýe÷Ý^÷ÝW÷ÝP÷ÝI÷ÝB÷Ý;÷Ý4÷Ý-÷Ý&÷Ý÷Ý÷Ý÷Ý ÷Ý÷ÝüöÝõöÝîöÝçöÝàöÝÙöÝÒöÝËöÝÄöݽöݶöݯöݨöÝ¡öÝšöÝ“öÝŒöÝ…öÝ~öÝwöÝpöÝiöÝböÝ[öÝTöÝMöÝFöÝ?öÝ8öÝ1öÝ*öÝ#öÝöÝöÝöÝöÝöÝùõÝòõÝëõÝäõÝÝõÝÖõÝÏõÝÈõÝÁõݺõݳõݬõÝ¥õÝžõÝ—õÝõ݉õÝ‚õÝ{õÝtõÝmõÝfõÝ_õÝXõÝQõÝJõÝCõÝ<õÝ5õÝ.õÝ'õÝ õÝõÝõÝ õÝõÝýôÝöôÝïôÝèôÝáôÝÚôÝÓôÝÌôÝÅôݾôÝ·ôݰôÝ©ôÝ¢ôÝ›ôÝ”ôÝô݆ôÝôÝxôÝqôÝjôÝcôÝ\ôÝUôÝNôÝGôÝ@ôÝ9ôÝ2ôÝ+ôÝ$ôÝôÝôÝôÝôÝôÝúóÝóóÝìóÝåóÝÞóÝ×óÝÐóÝÉóÝÂóÝ»óÝ´óÝ­óݦóÝŸóݘóÝ‘óÝŠó݃óÝ|óÝuóÝnóÝgóÝ`óÝYóÝRóÝKóÝDóÝ=óÝ6óÝ/óÝ(óÝ!óÝóÝóÝ óÝóÝþòÝ÷òÝðòÝéòÝâòÝÛòÝÔòÝÍòÝÆòÝ¿òݸòݱòݪòÝ£òÝœòÝ•òÝŽò݇òÝ€òÝyòÝròÝkòÝdòÝ]òÝVòÝOòÝHòÝAòÝ:òÝ3òÝ,òÝ%òÝòÝòÝòÝ òÝòÝûñÝôñÝíñÝæñÝßñÝØñÝÑñÝÊñÝÃñݼñݵñÝ®ñݧñÝ ñÝ™ñÝ’ñÝ‹ñÝ„ñÝ}ñÝvñÝoñÝhñÝañÝZñÝSñÝLñÝEñÝ>ñÝ7ñÝ0ñÝ)ñÝ"ñÝñÝñÝ ñÝñÝÿðÝøðÝñðÝêðÝãðÝÜðÝÕðÝÎðÝÇðÝÀðݹðݲðÝ«ðݤðÝðÝ–ðÝð݈ðÝðÝzðÝsðÝlðÝeðÝ^ðÝWðÝPðÝIðÝBðÝ;ðÝ4ðÝ-ðÝ&ðÝðÝðÝðÝ ðÝðÝüïÝõïÝîïÝçïÝàïÝÙïÝÒïÝËïÝÄïݽïݶïݯïݨïÝ¡ïÝšïÝ“ïÝŒïÝ…ïÝ~ïÝwïÝpïÝiïÝbïÝ[ïÝTïÝMïÝFïÝ?ïÝ8ïÝ1ïÝ*ïÝ#ïÝïÝïÝïÝïÝïÝùîÝòîÝëîÝäîÝÝîÝÖîÝÏîÝÈîÝÁîݺîݳîݬîÝ¥îÝžîÝ—îÝî݉îÝ‚îÝ{îÝtîÝmîÝfîÝ_îÝXîÝQîÝJîÝCîÝ<îÝ5îÝ.îÝ'îÝ îÝîÝîÝ îÝîÝýíÝöíÝïíÝèíÝáíÝÚíÝÓíÝÌíÝÅíݾíÝ·íݰíÝ©íÝ¢íÝ›íÝ”íÝí݆íÝíÝxíÝqíÝjíÝcíÝ\íÝUíÝNíÝGíÝ@íÝ9íÝ2íÝ+íÝ$íÝíÝíÝíÝíÝíÝúìÝóìÝììÝåìÝÞìÝ×ìÝÐìÝÉìÝÂìÝ»ìÝ´ìÝ­ìݦìÝŸìݘìÝ‘ìÝŠì݃ìÝ|ìÝuìÝnìÝgìÝ`ìÝYìÝRìÝKìÝDìÝ=ìÝ6ìÝ/ìÝ(ìÝ!ìÝìÝìÝ ìÝìÝþëÝ÷ëÝðëÝéëÝâëÝÛëÝÔëÝÍëÝÆëÝ¿ëݸëݱëݪëÝ£ëÝœëÝ•ëÝŽë݇ëÝ€ëÝyëÝrëÝkëÝdëÝ]ëÝVëÝOëÝHëÝAëÝ:ëÝ3ëÝ,ëÝ%ëÝëÝëÝëÝ ëÝëÝûêÝôêÝíêÝæêÝßêÝØêÝÑêÝÊêÝÃêݼêݵêÝ®êݧêÝ êÝ™êÝ’êÝ‹êÝ„êÝ}êÝvêÝoêÝhêÝaêÝZêÝSêÝLêÝEêÝ>êÝ7êÝ0êÝ)êÝ"êÝêÝêÝ êÝêÝÿéÝøéÝñéÝêéÝãéÝÜéÝÕéÝÎéÝÇéÝÀéݹéݲéÝ«éݤéÝéÝ–éÝé݈éÝéÝzéÝséÝléÝeéÝ^éÝWéÝPéÝIéÝBéÝ;éÝ4éÝ-éÝ&éÝéÝéÝéÝ éÝéÝüèÝõèÝîèÝçèÝàèÝÙèÝÒèÝËèÝÄèݽèݶèݯèݨèÝ¡èÝšèÝ“èÝŒèÝ…èÝ~èÝwèÝpèÝièÝbèÝ[èÝTèÝMèÝFèÝ?èÝ8èÝ1èÝ*èÝ#èÝèÝèÝèÝèÝèÝùçÝòçÝëçÝäçÝÝçÝÖçÝÏçÝÈçÝÁçݺçݳçݬçÝ¥çÝžçÝ—çÝç݉çÝ‚çÝ{çÝtçÝmçÝfçÝ_çÝXçÝQçÝJçÝCçÝ<çÝ5çÝ.çÝ'çÝ çÝçÝçÝ çÝçÝýæÝöæÝïæÝèæÝáæÝÚæÝÓæÝÌæÝÅæÝ¾æÝ·æÝ°æÝ©æÝ¢æÝ›æÝ”æÝæÝ†æÝæÝxæÝqæÝjæÝcæÝ\æÝUæÝNæÝGæÝ@æÝ9æÝ2æÝ+æÝ$æÝæÝæÝæÝæÝæÝúåÝóåÝìåÝååÝÞåÝ×åÝÐåÝÉåÝÂåÝ»åÝ´åÝ­åݦåÝŸåݘåÝ‘åÝŠå݃åÝ|åÝuåÝnåÝgåÝ`åÝYåÝRåÝKåÝDåÝ=åÝ6åÝ/åÝ(åÝ!åÝåÝåÝ åÝåÝþäÝ÷äÝðäÝéäÝâäÝÛäÝÔäÝÍäÝÆäÝ¿äݸäݱäݪäÝ£äÝœäÝ•äÝŽä݇äÝ€äÝyäÝräÝkäÝdäÝ]äÝVäÝOäÝHäÝAäÝ:äÝ3äÝ,äÝ%äÝäÝäÝäÝ äÝäÝûãÝôãÝíãÝæãÝßãÝØãÝÑãÝÊãÝÃãݼãݵãÝ®ãݧãÝ ãÝ™ãÝ’ãÝ‹ãÝ„ãÝ}ãÝvãÝoãÝhãÝaãÝZãÝSãÝLãÝEãÝ>ãÝ7ãÝ0ãÝ)ãÝ"ãÝãÝãÝ ãÝãÝÿâÝøâÝñâÝêâÝãâÝÜâÝÕâÝÎâÝÇâÝÀâݹâݲâÝ«âݤâÝâÝ–âÝâ݈âÝâÝzâÝsâÝlâÝeâÝ^âÝWâÝPâÝIâÝBâÝ;âÝ4âÝ-âÝ&âÝâÝâÝâÝ âÝâÝüáÝõáÝîáÝçáÝàáÝÙáÝÒáÝËáÝÄáݽáݶáݯáݨáÝ¡áÝšáÝ“áÝŒáÝ…áÝ~áÝwáÝpáÝiáÝbáÝ[áÝTáÝMáÝFáÝ?áÝ8áÝ1áÝ*áÝ#áÝáÝáÝáÝáÝáÝùàÝòàÝëàÝäàÝÝàÝÖàÝÏàÝÈàÝÁàݺàݳàݬàÝ¥àÝžàÝ—àÝà݉àÝ‚àÝ{àÝtàÝmàÝfàÝ_àÝXàÝQàÝJàÝCàÝ<àÝ5àÝ.àÝ'àÝ àÝàÝàÝ àÝàÝýßÝößÝïßÝèßÝáßÝÚßÝÓßÝÌßÝÅßݾßÝ·ßݰßÝ©ßÝ¢ßÝ›ßÝ”ßÝß݆ßÝßÝxßÝqßÝjßÝcßÝ\ßÝUßÝNßÝGßÝ@ßÝ9ßÝ2ßÝ+ßÝ$ßÝßÝßÝßÝßÝßÝúÞÝóÞÝìÞÝåÞÝÞÞÝ×ÞÝÐÞÝÉÞÝÂÞÝ»ÞÝ´ÞÝ­ÞݦÞÝŸÞݘÞÝ‘ÞÝŠÞ݃ÞÝ|ÞÝuÞÝnÞÝgÞÝ`ÞÝYÞÝRÞÝKÞÝDÞÝ=ÞÝ6ÞÝ/ÞÝ(ÞÝ!ÞÝÞÝÞÝ ÞÝÞÝþÝÝ÷ÝÝðÝÝéÝÝâÝÝÛÝÝÔÝÝÍÝÝÆÝÝ¿ÝݸÝݱÝݪÝÝ£ÝÝœÝÝ•ÝÝŽÝ݇ÝÝ€ÝÝyÝÝrÝÝkÝÝdÝÝ]ÝÝVÝÝOÝÝHÝÝAÝÝ:ÝÝ3ÝÝ,ÝÝ%ÝÝÝÝÝÝÝÝ ÝÝÝÝûÜÝôÜÝíÜÝæÜÝßÜÝØÜÝÑÜÝÊÜÝÃÜݼÜݵÜÝ®ÜݧÜÝ ÜÝ™ÜÝ’ÜÝ‹ÜÝ„ÜÝ}ÜÝvÜÝoÜÝhÜÝaÜÝZÜÝSÜÝLÜÝEÜÝ>ÜÝ7ÜÝ0ÜÝ)ÜÝ"ÜÝÜÝÜÝ ÜÝÜÝÿÛÝøÛÝñÛÝêÛÝãÛÝÜÛÝÕÛÝÎÛÝÇÛÝÀÛݹÛݲÛÝ«ÛݤÛÝÛÝ–ÛÝÛ݈ÛÝÛÝzÛÝsÛÝlÛÝeÛÝ^ÛÝWÛÝPÛÝIÛÝBÛÝ;ÛÝ4ÛÝ-ÛÝ&ÛÝÛÝÛÝÛÝ ÛÝÛÝüÚÝõÚÝîÚÝçÚÝàÚÝÙÚÝÒÚÝËÚÝÄÚݽÚݶÚݯÚݨÚÝ¡ÚÝšÚÝ“ÚÝŒÚÝ…ÚÝ~ÚÝwÚÝpÚÝiÚÝbÚÝ[ÚÝTÚÝMÚÝFÚÝ?ÚÝ8ÚÝ1ÚÝ*ÚÝ#ÚÝÚÝÚÝÚÝÚÝÚÝùÙÝòÙÝëÙÝäÙÝÝÙÝÖÙÝÏÙÝÈÙÝÁÙݺÙݳÙݬÙÝ¥ÙÝžÙÝ—ÙÝÙ݉ÙÝ‚ÙÝ{ÙÝtÙÝmÙÝfÙÝ_ÙÝXÙÝQÙÝJÙÝCÙÝ<ÙÝ5ÙÝ.ÙÝ'ÙÝ ÙÝÙÝÙÝ ÙÝÙÝýØÝöØÝïØÝèØÝáØÝÚØÝÓØÝÌØÝÅØÝ¾ØÝ·ØÝ°ØÝ©ØÝ¢ØÝ›ØÝ”ØÝØÝ†ØÝØÝxØÝqØÝjØÝcØÝ\ØÝUØÝNØÝGØÝ@ØÝ9ØÝ2ØÝ+ØÝ$ØÝØÝØÝØÝØÝØÝú×Ýó×Ýì×Ýå×ÝÞ×Ý××ÝÐ×ÝÉ×ÝÂ×Ý»×Ý´×Ý­×ݦ×ÝŸ×ݘ×Ý‘×ÝŠ×݃×Ý|×Ýu×Ýn×Ýg×Ý`×ÝY×ÝR×ÝK×ÝD×Ý=×Ý6×Ý/×Ý(×Ý!×Ý×Ý×Ý ×Ý×ÝþÖÝ÷ÖÝðÖÝéÖÝâÖÝÛÖÝÔÖÝÍÖÝÆÖÝ¿ÖݸÖݱÖݪÖÝ£ÖÝœÖÝ•ÖÝŽÖ݇ÖÝ€ÖÝyÖÝrÖÝkÖÝdÖÝ]ÖÝVÖÝOÖÝHÖÝAÖÝ:ÖÝ3ÖÝ,ÖÝ%ÖÝÖÝÖÝÖÝ ÖÝÖÝûÕÝôÕÝíÕÝæÕÝßÕÝØÕÝÑÕÝÊÕÝÃÕݼÕݵÕÝ®ÕݧÕÝ ÕÝ™ÕÝ’ÕÝ‹ÕÝ„ÕÝ}ÕÝvÕÝoÕÝhÕÝaÕÝZÕÝSÕÝLÕÝEÕÝ>ÕÝ7ÕÝ0ÕÝ)ÕÝ"ÕÝÕÝÕÝ ÕÝÕÝÿÔÝøÔÝñÔÝêÔÝãÔÝÜÔÝÕÔÝÎÔÝÇÔÝÀÔݹÔݲÔÝ«ÔݤÔÝÔÝ–ÔÝÔ݈ÔÝÔÝzÔÝsÔÝlÔÝeÔÝ^ÔÝWÔÝPÔÝIÔÝBÔÝ;ÔÝ4ÔÝ-ÔÝ&ÔÝÔÝÔÝÔÝ ÔÝÔÝüÓÝõÓÝîÓÝçÓÝàÓÝÙÓÝÒÓÝËÓÝÄÓݽÓݶÓݯÓݨÓÝ¡ÓÝšÓÝ“ÓÝŒÓÝ…ÓÝ~ÓÝwÓÝpÓÝiÓÝbÓÝ[ÓÝTÓÝMÓÝFÓÝ?ÓÝ8ÓÝ1ÓÝ*ÓÝ#ÓÝÓÝÓÝÓÝÓÝÓÝùÒÝòÒÝëÒÝäÒÝÝÒÝÖÒÝÏÒÝÈÒÝÁÒݺÒݳÒݬÒÝ¥ÒÝžÒÝ—ÒÝÒ݉ÒÝ‚ÒÝ{ÒÝtÒÝmÒÝfÒÝ_ÒÝXÒÝQÒÝJÒÝCÒÝ<ÒÝ5ÒÝ.ÒÝ'ÒÝ ÒÝÒÝÒÝ ÒÝÒÝýÑÝöÑÝïÑÝèÑÝáÑÝÚÑÝÓÑÝÌÑÝÅÑݾÑÝ·ÑݰÑÝ©ÑÝ¢ÑÝ›ÑÝ”ÑÝÑ݆ÑÝÑÝxÑÝqÑÝjÑÝcÑÝ\ÑÝUÑÝNÑÝGÑÝ@ÑÝ9ÑÝ2ÑÝ+ÑÝ$ÑÝÑÝÑÝÑÝÑÝÑÝúÐÝóÐÝìÐÝåÐÝÞÐÝ×ÐÝÐÐÝÉÐÝÂÐÝ»ÐÝ´ÐÝ­ÐݦÐÝŸÐݘÐÝ‘ÐÝŠÐ݃ÐÝ|ÐÝuÐÝnÐÝgÐÝ`ÐÝYÐÝRÐÝKÐÝDÐÝ=ÐÝ6ÐÝ/ÐÝ(ÐÝ!ÐÝÐÝÐÝ ÐÝÐÝþÏÝ÷ÏÝðÏÝéÏÝâÏÝÛÏÝÔÏÝÍÏÝÆÏÝ¿ÏݸÏݱÏݪÏÝ£ÏÝœÏÝ•ÏÝŽÏ݇ÏÝ€ÏÝyÏÝrÏÝkÏÝdÏÝ]ÏÝVÏÝOÏÝHÏÝAÏÝ:ÏÝ3ÏÝ,ÏÝ%ÏÝÏÝÏÝÏÝ ÏÝÏÝûÎÝôÎÝíÎÝæÎÝßÎÝØÎÝÑÎÝÊÎÝÃÎݼÎݵÎÝ®ÎݧÎÝ ÎÝ™ÎÝ’ÎÝ‹ÎÝ„ÎÝ}ÎÝvÎÝoÎÝhÎÝaÎÝZÎÝSÎÝLÎÝEÎÝ>ÎÝ7ÎÝ0ÎÝ)ÎÝ"ÎÝÎÝÎÝ ÎÝÎÝÿÍÝøÍÝñÍÝêÍÝãÍÝÜÍÝÕÍÝÎÍÝÇÍÝÀÍݹÍݲÍÝ«ÍݤÍÝÍÝ–ÍÝÍ݈ÍÝÍÝzÍÝsÍÝlÍÝeÍÝ^ÍÝWÍÝPÍÝIÍÝBÍÝ;ÍÝ4ÍÝ-ÍÝ&ÍÝÍÝÍÝÍÝ ÍÝÍÝüÌÝõÌÝîÌÝçÌÝàÌÝÙÌÝÒÌÝËÌÝÄÌݽÌݶÌݯÌݨÌÝ¡ÌÝšÌÝ“ÌÝŒÌÝ…ÌÝ~ÌÝwÌÝpÌÝiÌÝbÌÝ[ÌÝTÌÝMÌÝFÌÝ?ÌÝ8ÌÝ1ÌÝ*ÌÝ#ÌÝÌÝÌÝÌÝÌÝÌÝùËÝòËÝëËÝäËÝÝËÝÖËÝÏËÝÈËÝÁËݺËݳËݬËÝ¥ËÝžËÝ—ËÝË݉ËÝ‚ËÝ{ËÝtËÝmËÝfËÝ_ËÝXËÝQËÝJËÝCËÝ<ËÝ5ËÝ.ËÝ'ËÝ ËÝËÝËÝ ËÝËÝýÊÝöÊÝïÊÝèÊÝáÊÝÚÊÝÓÊÝÌÊÝÅÊݾÊÝ·ÊݰÊÝ©ÊÝ¢ÊÝ›ÊÝ”ÊÝÊ݆ÊÝÊÝxÊÝqÊÝjÊÝcÊÝ\ÊÝUÊÝNÊÝGÊÝ@ÊÝ9ÊÝ2ÊÝ+ÊÝ$ÊÝÊÝÊÝÊÝÊÝÊÝúÉÝóÉÝìÉÝåÉÝÞÉÝ×ÉÝÐÉÝÉÉÝÂÉÝ»ÉÝ´ÉÝ­ÉݦÉÝŸÉݘÉÝ‘ÉÝŠÉ݃ÉÝ|ÉÝuÉÝnÉÝgÉÝ`ÉÝYÉÝRÉÝKÉÝDÉÝ=ÉÝ6ÉÝ/ÉÝ(ÉÝ!ÉÝÉÝÉÝ ÉÝÉÝþÈÝ÷ÈÝðÈÝéÈÝâÈÝÛÈÝÔÈÝÍÈÝÆÈÝ¿ÈݸÈݱÈݪÈÝ£ÈÝœÈÝ•ÈÝŽÈ݇ÈÝ€ÈÝyÈÝrÈÝkÈÝdÈÝ]ÈÝVÈÝOÈÝHÈÝAÈÝ:ÈÝ3ÈÝ,ÈÝ%ÈÝÈÝÈÝÈÝ ÈÝÈÝûÇÝôÇÝíÇÝæÇÝßÇÝØÇÝÑÇÝÊÇÝÃÇݼÇݵÇÝ®ÇݧÇÝ ÇÝ™ÇÝ’ÇÝ‹ÇÝ„ÇÝ}ÇÝvÇÝoÇÝhÇÝaÇÝZÇÝSÇÝLÇÝEÇÝ>ÇÝ7ÇÝ0ÇÝ)ÇÝ"ÇÝÇÝÇÝ ÇÝÇÝÿÆÝøÆÝñÆÝêÆÝãÆÝÜÆÝÕÆÝÎÆÝÇÆÝÀÆÝ¹ÆÝ²ÆÝ«ÆÝ¤ÆÝÆÝ–ÆÝÆÝˆÆÝÆÝzÆÝsÆÝlÆÝeÆÝ^ÆÝWÆÝPÆÝIÆÝBÆÝ;ÆÝ4ÆÝ-ÆÝ&ÆÝÆÝÆÝÆÝ ÆÝÆÝüÅÝõÅÝîÅÝçÅÝàÅÝÙÅÝÒÅÝËÅÝÄÅݽÅݶÅݯÅݨÅÝ¡ÅÝšÅÝ“ÅÝŒÅÝ…ÅÝ~ÅÝwÅÝpÅÝiÅÝbÅÝ[ÅÝTÅÝMÅÝFÅÝ?ÅÝ8ÅÝ1ÅÝ*ÅÝ#ÅÝÅÝÅÝÅÝÅÝÅÝùÄÝòÄÝëÄÝäÄÝÝÄÝÖÄÝÏÄÝÈÄÝÁÄݺÄݳÄݬÄÝ¥ÄÝžÄÝ—ÄÝÄ݉ÄÝ‚ÄÝ{ÄÝtÄÝmÄÝfÄÝ_ÄÝXÄÝQÄÝJÄÝCÄÝ<ÄÝ5ÄÝ.ÄÝ'ÄÝ ÄÝÄÝÄÝ ÄÝÄÝýÃÝöÃÝïÃÝèÃÝáÃÝÚÃÝÓÃÝÌÃÝÅÃݾÃÝ·ÃݰÃÝ©ÃÝ¢ÃÝ›ÃÝ”ÃÝÃ݆ÃÝÃÝxÃÝqÃÝjÃÝcÃÝ\ÃÝUÃÝNÃÝGÃÝ@ÃÝ9ÃÝ2ÃÝ+ÃÝ$ÃÝÃÝÃÝÃÝÃÝÃÝúÂÝóÂÝìÂÝåÂÝÞÂÝ×ÂÝÐÂÝÉÂÝÂÂÝ»ÂÝ´ÂÝ­ÂݦÂÝŸÂݘÂÝ‘ÂÝŠÂ݃ÂÝ|ÂÝuÂÝnÂÝgÂÝ`ÂÝYÂÝRÂÝKÂÝDÂÝ=ÂÝ6ÂÝ/ÂÝ(ÂÝ!ÂÝÂÝÂÝ ÂÝÂÝþÁÝ÷ÁÝðÁÝéÁÝâÁÝÛÁÝÔÁÝÍÁÝÆÁÝ¿ÁݸÁݱÁݪÁÝ£ÁÝœÁÝ•ÁÝŽÁ݇ÁÝ€ÁÝyÁÝrÁÝkÁÝdÁÝ]ÁÝVÁÝOÁÝHÁÝAÁÝ:ÁÝ3ÁÝ,ÁÝ%ÁÝÁÝÁÝÁÝ ÁÝÁÝûÀÝôÀÝíÀÝæÀÝßÀÝØÀÝÑÀÝÊÀÝÃÀݼÀݵÀÝ®ÀݧÀÝ ÀÝ™ÀÝ’ÀÝ‹ÀÝ„ÀÝ}ÀÝvÀÝoÀÝhÀÝaÀÝZÀÝSÀÝLÀÝEÀÝ>ÀÝ7ÀÝ0ÀÝ)ÀÝ"ÀÝÀÝÀÝ ÀÝÀÝÿ¿Ýø¿Ýñ¿Ýê¿Ýã¿ÝÜ¿ÝÕ¿ÝοÝÇ¿ÝÀ¿Ý¹¿Ý²¿Ý«¿Ý¤¿Ý¿Ý–¿Ý¿Ýˆ¿Ý¿Ýz¿Ýs¿Ýl¿Ýe¿Ý^¿ÝW¿ÝP¿ÝI¿ÝB¿Ý;¿Ý4¿Ý-¿Ý&¿Ý¿Ý¿Ý¿Ý ¿Ý¿Ýü¾Ýõ¾Ýî¾Ýç¾Ýà¾ÝÙ¾ÝÒ¾Ý˾ÝľÝ½¾Ý¶¾Ý¯¾Ý¨¾Ý¡¾Ýš¾Ý“¾ÝŒ¾Ý…¾Ý~¾Ýw¾Ýp¾Ýi¾Ýb¾Ý[¾ÝT¾ÝM¾ÝF¾Ý?¾Ý8¾Ý1¾Ý*¾Ý#¾Ý¾Ý¾Ý¾Ý¾Ý¾Ýù½Ýò½Ýë½Ýä½ÝݽÝÖ½ÝϽÝȽÝÁ½Ýº½Ý³½Ý¬½Ý¥½Ýž½Ý—½Ý½Ý‰½Ý‚½Ý{½Ýt½Ým½Ýf½Ý_½ÝX½ÝQ½ÝJ½ÝC½Ý<½Ý5½Ý.½Ý'½Ý ½Ý½Ý½Ý ½Ý½Ýý¼Ýö¼Ýï¼Ýè¼Ýá¼ÝÚ¼ÝÓ¼Ý̼ÝżÝ¾¼Ý·¼Ý°¼Ý©¼Ý¢¼Ý›¼Ý”¼Ý¼Ý†¼Ý¼Ýx¼Ýq¼Ýj¼Ýc¼Ý\¼ÝU¼ÝN¼ÝG¼Ý@¼Ý9¼Ý2¼Ý+¼Ý$¼Ý¼Ý¼Ý¼Ý¼Ý¼Ýú»Ýó»Ýì»Ýå»ÝÞ»Ý×»ÝлÝɻݻݻ»Ý´»Ý­»Ý¦»ÝŸ»Ý˜»Ý‘»ÝŠ»Ýƒ»Ý|»Ýu»Ýn»Ýg»Ý`»ÝY»ÝR»ÝK»ÝD»Ý=»Ý6»Ý/»Ý(»Ý!»Ý»Ý»Ý »Ý»ÝþºÝ÷ºÝðºÝéºÝâºÝÛºÝÔºÝͺÝƺÝ¿ºÝ¸ºÝ±ºÝªºÝ£ºÝœºÝ•ºÝŽºÝ‡ºÝ€ºÝyºÝrºÝkºÝdºÝ]ºÝVºÝOºÝHºÝAºÝ:ºÝ3ºÝ,ºÝ%ºÝºÝºÝºÝ ºÝºÝû¹Ýô¹Ýí¹Ýæ¹Ýß¹ÝعÝѹÝʹÝùݼ¹Ýµ¹Ý®¹Ý§¹Ý ¹Ý™¹Ý’¹Ý‹¹Ý„¹Ý}¹Ýv¹Ýo¹Ýh¹Ýa¹ÝZ¹ÝS¹ÝL¹ÝE¹Ý>¹Ý7¹Ý0¹Ý)¹Ý"¹Ý¹Ý¹Ý ¹Ý¹Ýÿ¸Ýø¸Ýñ¸Ýê¸Ýã¸ÝܸÝÕ¸ÝθÝǸÝÀ¸Ý¹¸Ý²¸Ý«¸Ý¤¸Ý¸Ý–¸Ý¸Ýˆ¸Ý¸Ýz¸Ýs¸Ýl¸Ýe¸Ý^¸ÝW¸ÝP¸ÝI¸ÝB¸Ý;¸Ý4¸Ý-¸Ý&¸Ý¸Ý¸Ý¸Ý ¸Ý¸Ýü·Ýõ·Ýî·Ýç·Ýà·ÝÙ·ÝÒ·ÝË·Ýķݽ·Ý¶·Ý¯·Ý¨·Ý¡·Ýš·Ý“·ÝŒ·Ý…·Ý~·Ýw·Ýp·Ýi·Ýb·Ý[·ÝT·ÝM·ÝF·Ý?·Ý8·Ý1·Ý*·Ý#·Ý·Ý·Ý·Ý·Ý·Ýù¶Ýò¶Ýë¶Ýä¶ÝݶÝÖ¶Ý϶ÝȶÝÁ¶Ýº¶Ý³¶Ý¬¶Ý¥¶Ýž¶Ý—¶Ý¶Ý‰¶Ý‚¶Ý{¶Ýt¶Ým¶Ýf¶Ý_¶ÝX¶ÝQ¶ÝJ¶ÝC¶Ý<¶Ý5¶Ý.¶Ý'¶Ý ¶Ý¶Ý¶Ý ¶Ý¶ÝýµÝöµÝïµÝèµÝáµÝÚµÝÓµÝ̵ÝŵݾµÝ·µÝ°µÝ©µÝ¢µÝ›µÝ”µÝµÝ†µÝµÝxµÝqµÝjµÝcµÝ\µÝUµÝNµÝGµÝ@µÝ9µÝ2µÝ+µÝ$µÝµÝµÝµÝµÝµÝú´Ýó´Ýì´Ýå´ÝÞ´Ý×´ÝдÝÉ´Ý´Ý»´Ý´´Ý­´Ý¦´ÝŸ´Ý˜´Ý‘´ÝŠ´Ýƒ´Ý|´Ýu´Ýn´Ýg´Ý`´ÝY´ÝR´ÝK´ÝD´Ý=´Ý6´Ý/´Ý(´Ý!´Ý´Ý´Ý ´Ý´Ýþ³Ý÷³Ýð³Ýé³Ýâ³ÝÛ³ÝÔ³ÝͳÝƳÝ¿³Ý¸³Ý±³Ýª³Ý£³Ýœ³Ý•³Ý޳݇³Ý€³Ýy³Ýr³Ýk³Ýd³Ý]³ÝV³ÝO³ÝH³ÝA³Ý:³Ý3³Ý,³Ý%³Ý³Ý³Ý³Ý ³Ý³Ýû²Ýô²Ýí²Ýæ²Ýß²ÝزÝѲÝʲÝòݼ²Ýµ²Ý®²Ý§²Ý ²Ý™²Ý’²Ý‹²Ý„²Ý}²Ýv²Ýo²Ýh²Ýa²ÝZ²ÝS²ÝL²ÝE²Ý>²Ý7²Ý0²Ý)²Ý"²Ý²Ý²Ý ²Ý²Ýÿ±Ýø±Ýñ±Ýê±Ýã±ÝܱÝÕ±ÝαÝDZÝÀ±Ý¹±Ý²±Ý«±Ý¤±Ý±Ý–±Ý±Ýˆ±Ý±Ýz±Ýs±Ýl±Ýe±Ý^±ÝW±ÝP±ÝI±ÝB±Ý;±Ý4±Ý-±Ý&±Ý±Ý±Ý±Ý ±Ý±Ýü°Ýõ°Ýî°Ýç°Ýà°ÝÙ°ÝÒ°Ý˰Ýİݽ°Ý¶°Ý¯°Ý¨°Ý¡°Ýš°Ý“°ÝŒ°Ý…°Ý~°Ýw°Ýp°Ýi°Ýb°Ý[°ÝT°ÝM°ÝF°Ý?°Ý8°Ý1°Ý*°Ý#°Ý°Ý°Ý°Ý°Ý°Ýù¯Ýò¯Ýë¯Ýä¯ÝݯÝÖ¯ÝϯÝȯÝÁ¯Ýº¯Ý³¯Ý¬¯Ý¥¯Ýž¯Ý—¯Ý¯Ý‰¯Ý‚¯Ý{¯Ýt¯Ým¯Ýf¯Ý_¯ÝX¯ÝQ¯ÝJ¯ÝC¯Ý<¯Ý5¯Ý.¯Ý'¯Ý ¯Ý¯Ý¯Ý ¯Ý¯Ýý®Ýö®Ýï®Ýè®Ýá®ÝÚ®ÝÓ®ÝÌ®ÝŮݾ®Ý·®Ý°®Ý©®Ý¢®Ý›®Ý”®Ý®Ý†®Ý®Ýx®Ýq®Ýj®Ýc®Ý\®ÝU®ÝN®ÝG®Ý@®Ý9®Ý2®Ý+®Ý$®Ý®Ý®Ý®Ý®Ý®Ýú­Ýó­Ýì­Ýå­ÝÞ­Ý×­ÝЭÝÉ­Ý­Ý»­Ý´­Ý­­Ý¦­ÝŸ­Ý˜­Ý‘­ÝŠ­Ýƒ­Ý|­Ýu­Ýn­Ýg­Ý`­ÝY­ÝR­ÝK­ÝD­Ý=­Ý6­Ý/­Ý(­Ý!­Ý­Ý­Ý ­Ý­Ýþ¬Ý÷¬Ýð¬Ýé¬Ýâ¬ÝÛ¬ÝÔ¬ÝͬÝƬÝ¿¬Ý¸¬Ý±¬Ýª¬Ý£¬Ýœ¬Ý•¬Ýެ݇¬Ý€¬Ýy¬Ýr¬Ýk¬Ýd¬Ý]¬ÝV¬ÝO¬ÝH¬ÝA¬Ý:¬Ý3¬Ý,¬Ý%¬Ý¬Ý¬Ý¬Ý ¬Ý¬Ýû«Ýô«Ýí«Ýæ«Ýß«ÝØ«ÝÑ«ÝÊ«Ýëݼ«Ýµ«Ý®«Ý§«Ý «Ý™«Ý’«Ý‹«Ý„«Ý}«Ýv«Ýo«Ýh«Ýa«ÝZ«ÝS«ÝL«ÝE«Ý>«Ý7«Ý0«Ý)«Ý"«Ý«Ý«Ý «Ý«ÝÿªÝøªÝñªÝêªÝãªÝܪÝÕªÝΪÝǪÝÀªÝ¹ªÝ²ªÝ«ªÝ¤ªÝªÝ–ªÝªÝˆªÝªÝzªÝsªÝlªÝeªÝ^ªÝWªÝPªÝIªÝBªÝ;ªÝ4ªÝ-ªÝ&ªÝªÝªÝªÝ ªÝªÝü©Ýõ©Ýî©Ýç©Ýà©ÝÙ©ÝÒ©ÝË©Ýĩݽ©Ý¶©Ý¯©Ý¨©Ý¡©Ýš©Ý“©ÝŒ©Ý…©Ý~©Ýw©Ýp©Ýi©Ýb©Ý[©ÝT©ÝM©ÝF©Ý?©Ý8©Ý1©Ý*©Ý#©Ý©Ý©Ý©Ý©Ý©Ýù¨Ýò¨Ýë¨Ýä¨ÝݨÝÖ¨ÝϨÝȨÝÁ¨Ýº¨Ý³¨Ý¬¨Ý¥¨Ýž¨Ý—¨Ý¨Ý‰¨Ý‚¨Ý{¨Ýt¨Ým¨Ýf¨Ý_¨ÝX¨ÝQ¨ÝJ¨ÝC¨Ý<¨Ý5¨Ý.¨Ý'¨Ý ¨Ý¨Ý¨Ý ¨Ý¨Ýý§Ýö§Ýï§Ýè§Ýá§ÝÚ§ÝÓ§Ý̧Ýŧݾ§Ý·§Ý°§Ý©§Ý¢§Ý›§Ý”§Ý§Ý†§Ý§Ýx§Ýq§Ýj§Ýc§Ý\§ÝU§ÝN§ÝG§Ý@§Ý9§Ý2§Ý+§Ý$§Ý§Ý§Ý§Ý§Ý§Ýú¦Ýó¦Ýì¦Ýå¦ÝÞ¦ÝצÝЦÝɦݦݻ¦Ý´¦Ý­¦Ý¦¦ÝŸ¦Ý˜¦Ý‘¦ÝЦ݃¦Ý|¦Ýu¦Ýn¦Ýg¦Ý`¦ÝY¦ÝR¦ÝK¦ÝD¦Ý=¦Ý6¦Ý/¦Ý(¦Ý!¦Ý¦Ý¦Ý ¦Ý¦Ýþ¥Ý÷¥Ýð¥Ýé¥Ýâ¥ÝÛ¥ÝÔ¥ÝÍ¥ÝÆ¥Ý¿¥Ý¸¥Ý±¥Ýª¥Ý£¥Ýœ¥Ý•¥ÝŽ¥Ý‡¥Ý€¥Ýy¥Ýr¥Ýk¥Ýd¥Ý]¥ÝV¥ÝO¥ÝH¥ÝA¥Ý:¥Ý3¥Ý,¥Ý%¥Ý¥Ý¥Ý¥Ý ¥Ý¥Ýû¤Ýô¤Ýí¤Ýæ¤ÝߤÝؤÝѤÝʤÝäݼ¤Ýµ¤Ý®¤Ý§¤Ý ¤Ý™¤Ý’¤Ý‹¤Ý„¤Ý}¤Ýv¤Ýo¤Ýh¤Ýa¤ÝZ¤ÝS¤ÝL¤ÝE¤Ý>¤Ý7¤Ý0¤Ý)¤Ý"¤Ý¤Ý¤Ý ¤Ý¤Ýÿ£Ýø£Ýñ£Ýê£Ýã£ÝÜ£ÝÕ£ÝΣÝÇ£ÝÀ£Ý¹£Ý²£Ý«£Ý¤£Ý£Ý–£Ý£Ýˆ£Ý£Ýz£Ýs£Ýl£Ýe£Ý^£ÝW£ÝP£ÝI£ÝB£Ý;£Ý4£Ý-£Ý&£Ý£Ý£Ý£Ý £Ý£Ýü¢Ýõ¢Ýî¢Ýç¢Ýà¢ÝÙ¢ÝÒ¢ÝË¢ÝĢݽ¢Ý¶¢Ý¯¢Ý¨¢Ý¡¢Ýš¢Ý“¢ÝŒ¢Ý…¢Ý~¢Ýw¢Ýp¢Ýi¢Ýb¢Ý[¢ÝT¢ÝM¢ÝF¢Ý?¢Ý8¢Ý1¢Ý*¢Ý#¢Ý¢Ý¢Ý¢Ý¢Ý¢Ýù¡Ýò¡Ýë¡Ýä¡ÝÝ¡ÝÖ¡ÝÏ¡ÝÈ¡ÝÁ¡Ýº¡Ý³¡Ý¬¡Ý¥¡Ýž¡Ý—¡Ý¡Ý‰¡Ý‚¡Ý{¡Ýt¡Ým¡Ýf¡Ý_¡ÝX¡ÝQ¡ÝJ¡ÝC¡Ý<¡Ý5¡Ý.¡Ý'¡Ý ¡Ý¡Ý¡Ý ¡Ý¡Ýý Ýö Ýï Ýè Ýá ÝÚ ÝÓ ÝÌ ÝŠݾ Ý· Ý° Ý© Ý¢ Ý› Ý” Ý Ý† Ý Ýx Ýq Ýj Ýc Ý\ ÝU ÝN ÝG Ý@ Ý9 Ý2 Ý+ Ý$ Ý Ý Ý Ý Ý ÝúŸÝóŸÝìŸÝåŸÝÞŸÝןÝПÝÉŸÝŸÝ»ŸÝ´ŸÝ­ŸÝ¦ŸÝŸŸÝ˜ŸÝ‘ŸÝŠŸÝƒŸÝ|ŸÝuŸÝnŸÝgŸÝ`ŸÝYŸÝRŸÝKŸÝDŸÝ=ŸÝ6ŸÝ/ŸÝ(ŸÝ!ŸÝŸÝŸÝ ŸÝŸÝþžÝ÷žÝðžÝéžÝâžÝÛžÝÔžÝÍžÝÆžÝ¿žÝ¸žÝ±žÝªžÝ£žÝœžÝ•žÝŽžÝ‡žÝ€žÝyžÝržÝkžÝdžÝ]žÝVžÝOžÝHžÝAžÝ:žÝ3žÝ,žÝ%žÝžÝžÝžÝ žÝžÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿœÝøœÝñœÝêœÝãœÝÜœÝÕœÝΜÝÇœÝÀœÝ¹œÝ²œÝ«œÝ¤œÝœÝ–œÝœÝˆœÝœÝzœÝsœÝlœÝeœÝ^œÝWœÝPœÝIœÝBœÝ;œÝ4œÝ-œÝ&œÝœÝœÝœÝ œÝœÝü›Ýõ›Ýî›Ýç›Ýà›ÝÙ›ÝÒ›ÝË›Ýěݽ›Ý¶›Ý¯›Ý¨›Ý¡›Ýš›Ý“›ÝŒ›Ý…›Ý~›Ýw›Ýp›Ýi›Ýb›Ý[›ÝT›ÝM›ÝF›Ý?›Ý8›Ý1›Ý*›Ý#›Ý›Ý›Ý›Ý›Ý›ÝùšÝòšÝëšÝäšÝÝšÝÖšÝÏšÝÈšÝÁšÝºšÝ³šÝ¬šÝ¥šÝžšÝ—šÝšÝ‰šÝ‚šÝ{šÝtšÝmšÝfšÝ_šÝXšÝQšÝJšÝCšÝ<šÝ5šÝ.šÝ'šÝ šÝšÝšÝ šÝšÝý™Ýö™Ýï™Ýè™Ýá™ÝÚ™ÝÓ™ÝÌ™Ýřݾ™Ý·™Ý°™Ý©™Ý¢™Ý›™Ý”™Ý™Ý†™Ý™Ýx™Ýq™Ýj™Ýc™Ý\™ÝU™ÝN™ÝG™Ý@™Ý9™Ý2™Ý+™Ý$™Ý™Ý™Ý™Ý™Ý™Ýú˜Ýó˜Ýì˜Ýå˜ÝÞ˜ÝטÝИÝɘݘݻ˜Ý´˜Ý­˜Ý¦˜ÝŸ˜Ý˜˜Ý‘˜ÝŠ˜Ýƒ˜Ý|˜Ýu˜Ýn˜Ýg˜Ý`˜ÝY˜ÝR˜ÝK˜ÝD˜Ý=˜Ý6˜Ý/˜Ý(˜Ý!˜Ý˜Ý˜Ý ˜Ý˜Ýþ—Ý÷—Ýð—Ýé—Ýâ—ÝÛ—ÝÔ—ÝÍ—ÝÆ—Ý¿—ݸ—ݱ—ݪ—Ý£—Ýœ—Ý•—ÝŽ—݇—Ý€—Ýy—Ýr—Ýk—Ýd—Ý]—ÝV—ÝO—ÝH—ÝA—Ý:—Ý3—Ý,—Ý%—Ý—Ý—Ý—Ý —Ý—Ýû–Ýô–Ýí–Ýæ–Ýß–ÝØ–ÝÑ–ÝÊ–ÝÖݼ–ݵ–Ý®–ݧ–Ý –Ý™–Ý’–Ý‹–Ý„–Ý}–Ýv–Ýo–Ýh–Ýa–ÝZ–ÝS–ÝL–ÝE–Ý>–Ý7–Ý0–Ý)–Ý"–Ý–Ý–Ý –Ý–Ýÿ•Ýø•Ýñ•Ýê•Ýã•ÝÜ•ÝÕ•ÝΕÝÇ•ÝÀ•ݹ•ݲ•Ý«•ݤ•ݕݖ•ݕ݈•Ý•Ýz•Ýs•Ýl•Ýe•Ý^•ÝW•ÝP•ÝI•ÝB•Ý;•Ý4•Ý-•Ý&•Ý•Ý•Ý•Ý •Ý•Ýü”Ýõ”Ýî”Ýç”Ýà”ÝÙ”ÝÒ”ÝË”ÝĔݽ”ݶ”ݯ”ݨ”Ý¡”Ýš”Ý“”ÝŒ”Ý…”Ý~”Ýw”Ýp”Ýi”Ýb”Ý[”ÝT”ÝM”ÝF”Ý?”Ý8”Ý1”Ý*”Ý#”ݔݔݔݔݔÝù“Ýò“Ýë“Ýä“ÝÝ“ÝÖ“ÝÏ“ÝÈ“ÝÁ“ݺ“ݳ“ݬ“Ý¥“Ýž“Ý—“ݓ݉“Ý‚“Ý{“Ýt“Ým“Ýf“Ý_“ÝX“ÝQ“ÝJ“ÝC“Ý<“Ý5“Ý.“Ý'“Ý “Ý“Ý“Ý “Ý“Ýý’Ýö’Ýï’Ýè’Ýá’ÝÚ’ÝÓ’ÝÌ’ÝŒݾ’Ý·’ݰ’Ý©’Ý¢’Ý›’Ý”’ݒ݆’Ý’Ýx’Ýq’Ýj’Ýc’Ý\’ÝU’ÝN’ÝG’Ý@’Ý9’Ý2’Ý+’Ý$’Ý’Ý’Ý’Ý’Ý’Ýú‘Ýó‘Ýì‘Ýå‘ÝÞ‘ÝבÝБÝɑݑݻ‘Ý´‘Ý­‘ݦ‘ÝŸ‘ݘ‘Ý‘‘ÝŠ‘݃‘Ý|‘Ýu‘Ýn‘Ýg‘Ý`‘ÝY‘ÝR‘ÝK‘ÝD‘Ý=‘Ý6‘Ý/‘Ý(‘Ý!‘Ý‘Ý‘Ý ‘Ý‘ÝþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿŽÝøŽÝñŽÝêŽÝãŽÝÜŽÝÕŽÝÎŽÝÇŽÝÀŽÝ¹ŽÝ²ŽÝ«ŽÝ¤ŽÝŽÝ–ŽÝŽÝˆŽÝŽÝzŽÝsŽÝlŽÝeŽÝ^ŽÝWŽÝPŽÝIŽÝBŽÝ;ŽÝ4ŽÝ-ŽÝ&ŽÝŽÝŽÝŽÝ ŽÝŽÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùŒÝòŒÝëŒÝäŒÝÝŒÝÖŒÝÏŒÝÈŒÝÁŒÝºŒÝ³ŒÝ¬ŒÝ¥ŒÝžŒÝ—ŒÝŒÝ‰ŒÝ‚ŒÝ{ŒÝtŒÝmŒÝfŒÝ_ŒÝXŒÝQŒÝJŒÝCŒÝ<ŒÝ5ŒÝ.ŒÝ'ŒÝ ŒÝŒÝŒÝ ŒÝŒÝý‹Ýö‹Ýï‹Ýè‹Ýá‹ÝÚ‹ÝÓ‹ÝÌ‹Ýŋݾ‹Ý·‹Ý°‹Ý©‹Ý¢‹Ý›‹Ý”‹Ý‹Ý†‹Ý‹Ýx‹Ýq‹Ýj‹Ýc‹Ý\‹ÝU‹ÝN‹ÝG‹Ý@‹Ý9‹Ý2‹Ý+‹Ý$‹Ý‹Ý‹Ý‹Ý‹Ý‹ÝúŠÝóŠÝìŠÝåŠÝÞŠÝ׊ÝЊÝÉŠÝŠÝ»ŠÝ´ŠÝ­ŠÝ¦ŠÝŸŠÝ˜ŠÝ‘ŠÝŠŠÝƒŠÝ|ŠÝuŠÝnŠÝgŠÝ`ŠÝYŠÝRŠÝKŠÝDŠÝ=ŠÝ6ŠÝ/ŠÝ(ŠÝ!ŠÝŠÝŠÝ ŠÝŠÝþ‰Ý÷‰Ýð‰Ýé‰Ýâ‰ÝÛ‰ÝÔ‰Ý͉ÝƉÝ¿‰Ý¸‰Ý±‰Ýª‰Ý£‰Ýœ‰Ý•‰Ýމ݇‰Ý€‰Ýy‰Ýr‰Ýk‰Ýd‰Ý]‰ÝV‰ÝO‰ÝH‰ÝA‰Ý:‰Ý3‰Ý,‰Ý%‰Ý‰Ý‰Ý‰Ý ‰Ý‰ÝûˆÝôˆÝíˆÝæˆÝ߈Ý؈ÝшÝʈÝÈݼˆÝµˆÝ®ˆÝ§ˆÝ ˆÝ™ˆÝ’ˆÝ‹ˆÝ„ˆÝ}ˆÝvˆÝoˆÝhˆÝaˆÝZˆÝSˆÝLˆÝEˆÝ>ˆÝ7ˆÝ0ˆÝ)ˆÝ"ˆÝˆÝˆÝ ˆÝˆÝÿ‡Ýø‡Ýñ‡Ýê‡Ýã‡Ý܇ÝՇݷÝLJÝÀ‡Ý¹‡Ý²‡Ý«‡Ý¤‡Ý‡Ý–‡Ý‡Ýˆ‡Ý‡Ýz‡Ýs‡Ýl‡Ýe‡Ý^‡ÝW‡ÝP‡ÝI‡ÝB‡Ý;‡Ý4‡Ý-‡Ý&‡Ý‡Ý‡Ý‡Ý ‡Ý‡Ýü†Ýõ†Ýî†Ýç†Ýà†ÝÙ†Ý݈҆ÝĆݽ†Ý¶†Ý¯†Ý¨†Ý¡†Ýš†Ý“†ÝŒ†Ý…†Ý~†Ýw†Ýp†Ýi†Ýb†Ý[†ÝT†ÝM†ÝF†Ý?†Ý8†Ý1†Ý*†Ý#†Ý†Ý†Ý†Ý†Ý†Ýù…Ýò…Ýë…Ýä…ÝÝ…ÝÖ…ÝÏ…ÝÈ…ÝÁ…ݺ…ݳ…ݬ…Ý¥…Ýž…Ý—…݅݉…Ý‚…Ý{…Ýt…Ým…Ýf…Ý_…ÝX…ÝQ…ÝJ…ÝC…Ý<…Ý5…Ý.…Ý'…Ý …Ý…Ý…Ý …Ý…Ýý„Ýö„Ýï„Ýè„Ýá„ÝÚ„ÝÓ„ÝÌ„Ýńݾ„Ý·„ݰ„Ý©„Ý¢„Ý›„Ý”„݄݆„Ý„Ýx„Ýq„Ýj„Ýc„Ý\„ÝU„ÝN„ÝG„Ý@„Ý9„Ý2„Ý+„Ý$„݄݄݄݄݄ÝúƒÝóƒÝìƒÝåƒÝÞƒÝ׃ÝЃÝɃ݃ݻƒÝ´ƒÝ­ƒÝ¦ƒÝŸƒÝ˜ƒÝ‘ƒÝŠƒÝƒƒÝ|ƒÝuƒÝnƒÝgƒÝ`ƒÝYƒÝRƒÝKƒÝDƒÝ=ƒÝ6ƒÝ/ƒÝ(ƒÝ!ƒÝƒÝƒÝ ƒÝƒÝþ‚Ý÷‚Ýð‚Ýé‚Ýâ‚ÝÛ‚ÝÔ‚ÝÍ‚ÝÆ‚Ý¿‚ݸ‚ݱ‚ݪ‚Ý£‚Ýœ‚Ý•‚ÝŽ‚݇‚Ý€‚Ýy‚Ýr‚Ýk‚Ýd‚Ý]‚ÝV‚ÝO‚ÝH‚ÝA‚Ý:‚Ý3‚Ý,‚Ý%‚Ý‚Ý‚Ý‚Ý ‚Ý‚ÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿ€Ýø€Ýñ€Ýê€Ýã€ÝÜ€ÝÕ€Ý΀ÝÇ€ÝÀ€Ý¹€Ý²€Ý«€Ý¤€Ý€Ý–€Ý€Ýˆ€Ý€Ýz€Ýs€Ýl€Ýe€Ý^€ÝW€ÝP€ÝI€ÝB€Ý;€Ý4€Ý-€Ý&€Ý€Ý€Ý€Ý €Ý€ÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝù~Ýò~Ýë~Ýä~ÝÝ~ÝÖ~ÝÏ~ÝÈ~ÝÁ~ݺ~ݳ~ݬ~Ý¥~Ýž~Ý—~Ý~݉~Ý‚~Ý{~Ýt~Ým~Ýf~Ý_~ÝX~ÝQ~ÝJ~ÝC~Ý<~Ý5~Ý.~Ý'~Ý ~Ý~Ý~Ý ~Ý~Ýý}Ýö}Ýï}Ýè}Ýá}ÝÚ}ÝÓ}ÝÌ}ÝÅ}ݾ}Ý·}ݰ}Ý©}Ý¢}Ý›}Ý”}Ý}݆}Ý}Ýx}Ýq}Ýj}Ýc}Ý\}ÝU}ÝN}ÝG}Ý@}Ý9}Ý2}Ý+}Ý$}Ý}Ý}Ý}Ý}Ý}Ýú|Ýó|Ýì|Ýå|ÝÞ|Ý×|ÝÐ|ÝÉ|ÝÂ|Ý»|Ý´|Ý­|ݦ|ÝŸ|ݘ|Ý‘|ÝŠ|݃|Ý||Ýu|Ýn|Ýg|Ý`|ÝY|ÝR|ÝK|ÝD|Ý=|Ý6|Ý/|Ý(|Ý!|Ý|Ý|Ý |Ý|Ýþ{Ý÷{Ýð{Ýé{Ýâ{ÝÛ{ÝÔ{ÝÍ{ÝÆ{Ý¿{ݸ{ݱ{ݪ{Ý£{Ýœ{Ý•{ÝŽ{݇{Ý€{Ýy{Ýr{Ýk{Ýd{Ý]{ÝV{ÝO{ÝH{ÝA{Ý:{Ý3{Ý,{Ý%{Ý{Ý{Ý{Ý {Ý{ÝûzÝôzÝízÝæzÝßzÝØzÝÑzÝÊzÝÃzݼzݵzÝ®zݧzÝ zÝ™zÝ’zÝ‹zÝ„zÝ}zÝvzÝozÝhzÝazÝZzÝSzÝLzÝEzÝ>zÝ7zÝ0zÝ)zÝ"zÝzÝzÝ zÝzÝÿyÝøyÝñyÝêyÝãyÝÜyÝÕyÝÎyÝÇyÝÀyݹyݲyÝ«yݤyÝyÝ–yÝy݈yÝyÝzyÝsyÝlyÝeyÝ^yÝWyÝPyÝIyÝByÝ;yÝ4yÝ-yÝ&yÝyÝyÝyÝ yÝyÝüxÝõxÝîxÝçxÝàxÝÙxÝÒxÝËxÝÄxݽxݶxݯxݨxÝ¡xÝšxÝ“xÝŒxÝ…xÝ~xÝwxÝpxÝixÝbxÝ[xÝTxÝMxÝFxÝ?xÝ8xÝ1xÝ*xÝ#xÝxÝxÝxÝxÝxÝùwÝòwÝëwÝäwÝÝwÝÖwÝÏwÝÈwÝÁwݺwݳwݬwÝ¥wÝžwÝ—wÝw݉wÝ‚wÝ{wÝtwÝmwÝfwÝ_wÝXwÝQwÝJwÝCwÝsÝ7sÝ0sÝ)sÝ"sÝsÝsÝ sÝsÝÿrÝørÝñrÝêrÝãrÝÜrÝÕrÝÎrÝÇrÝÀrݹrݲrÝ«rݤrÝrÝ–rÝr݈rÝrÝzrÝsrÝlrÝerÝ^rÝWrÝPrÝIrÝBrÝ;rÝ4rÝ-rÝ&rÝrÝrÝrÝ rÝrÝüqÝõqÝîqÝçqÝàqÝÙqÝÒqÝËqÝÄqݽqݶqݯqݨqÝ¡qÝšqÝ“qÝŒqÝ…qÝ~qÝwqÝpqÝiqÝbqÝ[qÝTqÝMqÝFqÝ?qÝ8qÝ1qÝ*qÝ#qÝqÝqÝqÝqÝqÝùpÝòpÝëpÝäpÝÝpÝÖpÝÏpÝÈpÝÁpݺpݳpݬpÝ¥pÝžpÝ—pÝp݉pÝ‚pÝ{pÝtpÝmpÝfpÝ_pÝXpÝQpÝJpÝCpÝlÝ7lÝ0lÝ)lÝ"lÝlÝlÝ lÝlÝÿkÝøkÝñkÝêkÝãkÝÜkÝÕkÝÎkÝÇkÝÀkݹkݲkÝ«kݤkÝkÝ–kÝk݈kÝkÝzkÝskÝlkÝekÝ^kÝWkÝPkÝIkÝBkÝ;kÝ4kÝ-kÝ&kÝkÝkÝkÝ kÝkÝüjÝõjÝîjÝçjÝàjÝÙjÝÒjÝËjÝÄjݽjݶjݯjݨjÝ¡jÝšjÝ“jÝŒjÝ…jÝ~jÝwjÝpjÝijÝbjÝ[jÝTjÝMjÝFjÝ?jÝ8jÝ1jÝ*jÝ#jÝjÝjÝjÝjÝjÝùiÝòiÝëiÝäiÝÝiÝÖiÝÏiÝÈiÝÁiݺiݳiݬiÝ¥iÝžiÝ—iÝi݉iÝ‚iÝ{iÝtiÝmiÝfiÝ_iÝXiÝQiÝJiÝCiÝeÝ7eÝ0eÝ)eÝ"eÝeÝeÝ eÝeÝÿdÝødÝñdÝêdÝãdÝÜdÝÕdÝÎdÝÇdÝÀdݹdݲdÝ«dݤdÝdÝ–dÝd݈dÝdÝzdÝsdÝldÝedÝ^dÝWdÝPdÝIdÝBdÝ;dÝ4dÝ-dÝ&dÝdÝdÝdÝ dÝdÝücÝõcÝîcÝçcÝàcÝÙcÝÒcÝËcÝÄcݽcݶcݯcݨcÝ¡cÝšcÝ“cÝŒcÝ…cÝ~cÝwcÝpcÝicÝbcÝ[cÝTcÝMcÝFcÝ?cÝ8cÝ1cÝ*cÝ#cÝcÝcÝcÝcÝcÝùbÝòbÝëbÝäbÝÝbÝÖbÝÏbÝÈbÝÁbݺbݳbݬbÝ¥bÝžbÝ—bÝb݉bÝ‚bÝ{bÝtbÝmbÝfbÝ_bÝXbÝQbÝJbÝCbÝ^Ý7^Ý0^Ý)^Ý"^Ý^Ý^Ý ^Ý^Ýÿ]Ýø]Ýñ]Ýê]Ýã]ÝÜ]ÝÕ]ÝÎ]ÝÇ]ÝÀ]ݹ]ݲ]Ý«]ݤ]Ý]Ý–]Ý]݈]Ý]Ýz]Ýs]Ýl]Ýe]Ý^]ÝW]ÝP]ÝI]ÝB]Ý;]Ý4]Ý-]Ý&]Ý]Ý]Ý]Ý ]Ý]Ýü\Ýõ\Ýî\Ýç\Ýà\ÝÙ\ÝÒ\ÝË\ÝÄ\ݽ\ݶ\ݯ\ݨ\Ý¡\Ýš\Ý“\ÝŒ\Ý…\Ý~\Ýw\Ýp\Ýi\Ýb\Ý[\ÝT\ÝM\ÝF\Ý?\Ý8\Ý1\Ý*\Ý#\Ý\Ý\Ý\Ý\Ý\Ýù[Ýò[Ýë[Ýä[ÝÝ[ÝÖ[ÝÏ[ÝÈ[ÝÁ[ݺ[ݳ[ݬ[Ý¥[Ýž[Ý—[Ý[݉[Ý‚[Ý{[Ýt[Ým[Ýf[Ý_[ÝX[ÝQ[ÝJ[ÝC[Ý<[Ý5[Ý.[Ý'[Ý [Ý[Ý[Ý [Ý[ÝýZÝöZÝïZÝèZÝáZÝÚZÝÓZÝÌZÝÅZݾZÝ·ZݰZÝ©ZÝ¢ZÝ›ZÝ”ZÝZ݆ZÝZÝxZÝqZÝjZÝcZÝ\ZÝUZÝNZÝGZÝ@ZÝ9ZÝ2ZÝ+ZÝ$ZÝZÝZÝZÝZÝZÝúYÝóYÝìYÝåYÝÞYÝ×YÝÐYÝÉYÝÂYÝ»YÝ´YÝ­YݦYÝŸYݘYÝ‘YÝŠY݃YÝ|YÝuYÝnYÝgYÝ`YÝYYÝRYÝKYÝDYÝ=YÝ6YÝ/YÝ(YÝ!YÝYÝYÝ YÝYÝþXÝ÷XÝðXÝéXÝâXÝÛXÝÔXÝÍXÝÆXÝ¿XݸXݱXݪXÝ£XÝœXÝ•XÝŽX݇XÝ€XÝyXÝrXÝkXÝdXÝ]XÝVXÝOXÝHXÝAXÝ:XÝ3XÝ,XÝ%XÝXÝXÝXÝ XÝXÝûWÝôWÝíWÝæWÝßWÝØWÝÑWÝÊWÝÃWݼWݵWÝ®WݧWÝ WÝ™WÝ’WÝ‹WÝ„WÝ}WÝvWÝoWÝhWÝaWÝZWÝSWÝLWÝEWÝ>WÝ7WÝ0WÝ)WÝ"WÝWÝWÝ WÝWÝÿVÝøVÝñVÝêVÝãVÝÜVÝÕVÝÎVÝÇVÝÀVݹVݲVÝ«VݤVÝVÝ–VÝV݈VÝVÝzVÝsVÝlVÝeVÝ^VÝWVÝPVÝIVÝBVÝ;VÝ4VÝ-VÝ&VÝVÝVÝVÝ VÝVÝüUÝõUÝîUÝçUÝàUÝÙUÝÒUÝËUÝÄUݽUݶUݯUݨUÝ¡UÝšUÝ“UÝŒUÝ…UÝ~UÝwUÝpUÝiUÝbUÝ[UÝTUÝMUÝFUÝ?UÝ8UÝ1UÝ*UÝ#UÝUÝUÝUÝUÝUÝùTÝòTÝëTÝäTÝÝTÝÖTÝÏTÝÈTÝÁTݺTݳTݬTÝ¥TÝžTÝ—TÝT݉TÝ‚TÝ{TÝtTÝmTÝfTÝ_TÝXTÝQTÝJTÝCTÝPÝ7PÝ0PÝ)PÝ"PÝPÝPÝ PÝPÝÿOÝøOÝñOÝêOÝãOÝÜOÝÕOÝÎOÝÇOÝÀOݹOݲOÝ«OݤOÝOÝ–OÝO݈OÝOÝzOÝsOÝlOÝeOÝ^OÝWOÝPOÝIOÝBOÝ;OÝ4OÝ-OÝ&OÝOÝOÝOÝ OÝOÝüNÝõNÝîNÝçNÝàNÝÙNÝÒNÝËNÝÄNݽNݶNݯNݨNÝ¡NÝšNÝ“NÝŒNÝ…NÝ~NÝwNÝpNÝiNÝbNÝ[NÝTNÝMNÝFNÝ?NÝ8NÝ1NÝ*NÝ#NÝNÝNÝNÝNÝNÝùMÝòMÝëMÝäMÝÝMÝÖMÝÏMÝÈMÝÁMݺMݳMݬMÝ¥MÝžMÝ—MÝM݉MÝ‚MÝ{MÝtMÝmMÝfMÝ_MÝXMÝQMÝJMÝCMÝIÝ7IÝ0IÝ)IÝ"IÝIÝIÝ IÝIÝÿHÝøHÝñHÝêHÝãHÝÜHÝÕHÝÎHÝÇHÝÀHݹHݲHÝ«HݤHÝHÝ–HÝH݈HÝHÝzHÝsHÝlHÝeHÝ^HÝWHÝPHÝIHÝBHÝ;HÝ4HÝ-HÝ&HÝHÝHÝHÝ HÝHÝüGÝõGÝîGÝçGÝàGÝÙGÝÒGÝËGÝÄGݽGݶGݯGݨGÝ¡GÝšGÝ“GÝŒGÝ…GÝ~GÝwGÝpGÝiGÝbGÝ[GÝTGÝMGÝFGÝ?GÝ8GÝ1GÝ*GÝ#GÝGÝGÝGÝGÝGÝùFÝòFÝëFÝäFÝÝFÝÖFÝÏFÝÈFÝÁFݺFݳFݬFÝ¥FÝžFÝ—FÝF݉FÝ‚FÝ{FÝtFÝmFÝfFÝ_FÝXFÝQFÝJFÝCFÝBÝ7BÝ0BÝ)BÝ"BÝBÝBÝ BÝBÝÿAÝøAÝñAÝêAÝãAÝÜAÝÕAÝÎAÝÇAÝÀAݹAݲAÝ«AݤAÝAÝ–AÝA݈AÝAÝzAÝsAÝlAÝeAÝ^AÝWAÝPAÝIAÝBAÝ;AÝ4AÝ-AÝ&AÝAÝAÝAÝ AÝAÝü@Ýõ@Ýî@Ýç@Ýà@ÝÙ@ÝÒ@ÝË@ÝÄ@ݽ@ݶ@ݯ@ݨ@Ý¡@Ýš@Ý“@ÝŒ@Ý…@Ý~@Ýw@Ýp@Ýi@Ýb@Ý[@ÝT@ÝM@ÝF@Ý?@Ý8@Ý1@Ý*@Ý#@Ý@Ý@Ý@Ý@Ý@Ýù?Ýò?Ýë?Ýä?ÝÝ?ÝÖ?ÝÏ?ÝÈ?ÝÁ?ݺ?ݳ?ݬ?Ý¥?Ýž?Ý—?Ý?݉?Ý‚?Ý{?Ýt?Ým?Ýf?Ý_?ÝX?ÝQ?ÝJ?ÝC?ÝÝö>Ýï>Ýè>Ýá>ÝÚ>ÝÓ>ÝÌ>ÝÅ>ݾ>Ý·>ݰ>Ý©>Ý¢>Ý›>Ý”>Ý>݆>Ý>Ýx>Ýq>Ýj>Ýc>Ý\>ÝU>ÝN>ÝG>Ý@>Ý9>Ý2>Ý+>Ý$>Ý>Ý>Ý>Ý>Ý>Ýú=Ýó=Ýì=Ýå=ÝÞ=Ý×=ÝÐ=ÝÉ=ÝÂ=Ý»=Ý´=Ý­=ݦ=ÝŸ=ݘ=Ý‘=ÝŠ=݃=Ý|=Ýu=Ýn=Ýg=Ý`=ÝY=ÝR=ÝK=ÝD=Ý==Ý6=Ý/=Ý(=Ý!=Ý=Ý=Ý =Ý=Ýþ<Ý÷<Ýð<Ýé<Ýâ<ÝÛ<ÝÔ<ÝÍ<ÝÆ<Ý¿<ݸ<ݱ<ݪ<Ý£<Ýœ<Ý•<ÝŽ<݇<Ý€<Ýy<Ýr<Ýk<Ýd<Ý]<ÝV<ÝO<ÝH<ÝA<Ý:<Ý3<Ý,<Ý%<Ý<Ý<Ý<Ý <Ý<Ýû;Ýô;Ýí;Ýæ;Ýß;ÝØ;ÝÑ;ÝÊ;ÝÃ;ݼ;ݵ;Ý®;ݧ;Ý ;Ý™;Ý’;Ý‹;Ý„;Ý};Ýv;Ýo;Ýh;Ýa;ÝZ;ÝS;ÝL;ÝE;Ý>;Ý7;Ý0;Ý);Ý";Ý;Ý;Ý ;Ý;Ýÿ:Ýø:Ýñ:Ýê:Ýã:ÝÜ:ÝÕ:ÝÎ:ÝÇ:ÝÀ:ݹ:ݲ:Ý«:ݤ:Ý:Ý–:Ý:݈:Ý:Ýz:Ýs:Ýl:Ýe:Ý^:ÝW:ÝP:ÝI:ÝB:Ý;:Ý4:Ý-:Ý&:Ý:Ý:Ý:Ý :Ý:Ýü9Ýõ9Ýî9Ýç9Ýà9ÝÙ9ÝÒ9ÝË9ÝÄ9ݽ9ݶ9ݯ9ݨ9Ý¡9Ýš9Ý“9ÝŒ9Ý…9Ý~9Ýw9Ýp9Ýi9Ýb9Ý[9ÝT9ÝM9ÝF9Ý?9Ý89Ý19Ý*9Ý#9Ý9Ý9Ý9Ý9Ý9Ýù8Ýò8Ýë8Ýä8ÝÝ8ÝÖ8ÝÏ8ÝÈ8ÝÁ8ݺ8ݳ8ݬ8Ý¥8Ýž8Ý—8Ý8݉8Ý‚8Ý{8Ýt8Ým8Ýf8Ý_8ÝX8ÝQ8ÝJ8ÝC8Ý<8Ý58Ý.8Ý'8Ý 8Ý8Ý8Ý 8Ý8Ýý7Ýö7Ýï7Ýè7Ýá7ÝÚ7ÝÓ7ÝÌ7ÝÅ7ݾ7Ý·7ݰ7Ý©7Ý¢7Ý›7Ý”7Ý7݆7Ý7Ýx7Ýq7Ýj7Ýc7Ý\7ÝU7ÝN7ÝG7Ý@7Ý97Ý27Ý+7Ý$7Ý7Ý7Ý7Ý7Ý7Ýú6Ýó6Ýì6Ýå6ÝÞ6Ý×6ÝÐ6ÝÉ6ÝÂ6Ý»6Ý´6Ý­6ݦ6ÝŸ6ݘ6Ý‘6ÝŠ6݃6Ý|6Ýu6Ýn6Ýg6Ý`6ÝY6ÝR6ÝK6ÝD6Ý=6Ý66Ý/6Ý(6Ý!6Ý6Ý6Ý 6Ý6Ýþ5Ý÷5Ýð5Ýé5Ýâ5ÝÛ5ÝÔ5ÝÍ5ÝÆ5Ý¿5ݸ5ݱ5ݪ5Ý£5Ýœ5Ý•5ÝŽ5݇5Ý€5Ýy5Ýr5Ýk5Ýd5Ý]5ÝV5ÝO5ÝH5ÝA5Ý:5Ý35Ý,5Ý%5Ý5Ý5Ý5Ý 5Ý5Ýû4Ýô4Ýí4Ýæ4Ýß4ÝØ4ÝÑ4ÝÊ4ÝÃ4ݼ4ݵ4Ý®4ݧ4Ý 4Ý™4Ý’4Ý‹4Ý„4Ý}4Ýv4Ýo4Ýh4Ýa4ÝZ4ÝS4ÝL4ÝE4Ý>4Ý74Ý04Ý)4Ý"4Ý4Ý4Ý 4Ý4Ýÿ3Ýø3Ýñ3Ýê3Ýã3ÝÜ3ÝÕ3ÝÎ3ÝÇ3ÝÀ3ݹ3ݲ3Ý«3ݤ3Ý3Ý–3Ý3݈3Ý3Ýz3Ýs3Ýl3Ýe3Ý^3ÝW3ÝP3ÝI3ÝB3Ý;3Ý43Ý-3Ý&3Ý3Ý3Ý3Ý 3Ý3Ýü2Ýõ2Ýî2Ýç2Ýà2ÝÙ2ÝÒ2ÝË2ÝÄ2ݽ2ݶ2ݯ2ݨ2Ý¡2Ýš2Ý“2ÝŒ2Ý…2Ý~2Ýw2Ýp2Ýi2Ýb2Ý[2ÝT2ÝM2ÝF2Ý?2Ý82Ý12Ý*2Ý#2Ý2Ý2Ý2Ý2Ý2Ýù1Ýò1Ýë1Ýä1ÝÝ1ÝÖ1ÝÏ1ÝÈ1ÝÁ1ݺ1ݳ1ݬ1Ý¥1Ýž1Ý—1Ý1݉1Ý‚1Ý{1Ýt1Ým1Ýf1Ý_1ÝX1ÝQ1ÝJ1ÝC1Ý<1Ý51Ý.1Ý'1Ý 1Ý1Ý1Ý 1Ý1Ýý0Ýö0Ýï0Ýè0Ýá0ÝÚ0ÝÓ0ÝÌ0ÝÅ0ݾ0Ý·0ݰ0Ý©0Ý¢0Ý›0Ý”0Ý0݆0Ý0Ýx0Ýq0Ýj0Ýc0Ý\0ÝU0ÝN0ÝG0Ý@0Ý90Ý20Ý+0Ý$0Ý0Ý0Ý0Ý0Ý0Ýú/Ýó/Ýì/Ýå/ÝÞ/Ý×/ÝÐ/ÝÉ/ÝÂ/Ý»/Ý´/Ý­/ݦ/ÝŸ/ݘ/Ý‘/ÝŠ/݃/Ý|/Ýu/Ýn/Ýg/Ý`/ÝY/ÝR/ÝK/ÝD/Ý=/Ý6/Ý//Ý(/Ý!/Ý/Ý/Ý /Ý/Ýþ.Ý÷.Ýð.Ýé.Ýâ.ÝÛ.ÝÔ.ÝÍ.ÝÆ.Ý¿.ݸ.ݱ.ݪ.Ý£.Ýœ.Ý•.ÝŽ.݇.Ý€.Ýy.Ýr.Ýk.Ýd.Ý].ÝV.ÝO.ÝH.ÝA.Ý:.Ý3.Ý,.Ý%.Ý.Ý.Ý.Ý .Ý.Ýû-Ýô-Ýí-Ýæ-Ýß-ÝØ-ÝÑ-ÝÊ-ÝÃ-ݼ-ݵ-Ý®-ݧ-Ý -Ý™-Ý’-Ý‹-Ý„-Ý}-Ýv-Ýo-Ýh-Ýa-ÝZ-ÝS-ÝL-ÝE-Ý>-Ý7-Ý0-Ý)-Ý"-Ý-Ý-Ý -Ý-Ýÿ,Ýø,Ýñ,Ýê,Ýã,ÝÜ,ÝÕ,ÝÎ,ÝÇ,ÝÀ,ݹ,ݲ,Ý«,ݤ,Ý,Ý–,Ý,݈,Ý,Ýz,Ýs,Ýl,Ýe,Ý^,ÝW,ÝP,ÝI,ÝB,Ý;,Ý4,Ý-,Ý&,Ý,Ý,Ý,Ý ,Ý,Ýü+Ýõ+Ýî+Ýç+Ýà+ÝÙ+ÝÒ+ÝË+ÝÄ+ݽ+ݶ+ݯ+ݨ+Ý¡+Ýš+Ý“+ÝŒ+Ý…+Ý~+Ýw+Ýp+Ýi+Ýb+Ý[+ÝT+ÝM+ÝF+Ý?+Ý8+Ý1+Ý*+Ý#+Ý+Ý+Ý+Ý+Ý+Ýù*Ýò*Ýë*Ýä*ÝÝ*ÝÖ*ÝÏ*ÝÈ*ÝÁ*ݺ*ݳ*ݬ*Ý¥*Ýž*Ý—*Ý*݉*Ý‚*Ý{*Ýt*Ým*Ýf*Ý_*ÝX*ÝQ*ÝJ*ÝC*Ý<*Ý5*Ý.*Ý'*Ý *Ý*Ý*Ý *Ý*Ýý)Ýö)Ýï)Ýè)Ýá)ÝÚ)ÝÓ)ÝÌ)ÝÅ)ݾ)Ý·)ݰ)Ý©)Ý¢)Ý›)Ý”)Ý)݆)Ý)Ýx)Ýq)Ýj)Ýc)Ý\)ÝU)ÝN)ÝG)Ý@)Ý9)Ý2)Ý+)Ý$)Ý)Ý)Ý)Ý)Ý)Ýú(Ýó(Ýì(Ýå(ÝÞ(Ý×(ÝÐ(ÝÉ(ÝÂ(Ý»(Ý´(Ý­(ݦ(ÝŸ(ݘ(Ý‘(ÝŠ(݃(Ý|(Ýu(Ýn(Ýg(Ý`(ÝY(ÝR(ÝK(ÝD(Ý=(Ý6(Ý/(Ý((Ý!(Ý(Ý(Ý (Ý(Ýþ'Ý÷'Ýð'Ýé'Ýâ'ÝÛ'ÝÔ'ÝÍ'ÝÆ'Ý¿'ݸ'ݱ'ݪ'Ý£'Ýœ'Ý•'ÝŽ'݇'Ý€'Ýy'Ýr'Ýk'Ýd'Ý]'ÝV'ÝO'ÝH'ÝA'Ý:'Ý3'Ý,'Ý%'Ý'Ý'Ý'Ý 'Ý'Ýû&Ýô&Ýí&Ýæ&Ýß&ÝØ&ÝÑ&ÝÊ&ÝÃ&ݼ&ݵ&Ý®&ݧ&Ý &Ý™&Ý’&Ý‹&Ý„&Ý}&Ýv&Ýo&Ýh&Ýa&ÝZ&ÝS&ÝL&ÝE&Ý>&Ý7&Ý0&Ý)&Ý"&Ý&Ý&Ý &Ý&Ýÿ%Ýø%Ýñ%Ýê%Ýã%ÝÜ%ÝÕ%ÝÎ%ÝÇ%ÝÀ%ݹ%ݲ%Ý«%ݤ%Ý%Ý–%Ý%݈%Ý%Ýz%Ýs%Ýl%Ýe%Ý^%ÝW%ÝP%ÝI%ÝB%Ý;%Ý4%Ý-%Ý&%Ý%Ý%Ý%Ý %Ý%Ýü$Ýõ$Ýî$Ýç$Ýà$ÝÙ$ÝÒ$ÝË$ÝÄ$ݽ$ݶ$ݯ$ݨ$Ý¡$Ýš$Ý“$ÝŒ$Ý…$Ý~$Ýw$Ýp$Ýi$Ýb$Ý[$ÝT$ÝM$ÝF$Ý?$Ý8$Ý1$Ý*$Ý#$Ý$Ý$Ý$Ý$Ý$Ýù#Ýò#Ýë#Ýä#ÝÝ#ÝÖ#ÝÏ#ÝÈ#ÝÁ#ݺ#ݳ#ݬ#Ý¥#Ýž#Ý—#Ý#݉#Ý‚#Ý{#Ýt#Ým#Ýf#Ý_#ÝX#ÝQ#ÝJ#ÝC#Ý<#Ý5#Ý.#Ý'#Ý #Ý#Ý#Ý #Ý#Ýý"Ýö"Ýï"Ýè"Ýá"ÝÚ"ÝÓ"ÝÌ"ÝÅ"ݾ"Ý·"ݰ"Ý©"Ý¢"Ý›"Ý”"Ý"݆"Ý"Ýx"Ýq"Ýj"Ýc"Ý\"ÝU"ÝN"ÝG"Ý@"Ý9"Ý2"Ý+"Ý$"Ý"Ý"Ý"Ý"Ý"Ýú!Ýó!Ýì!Ýå!ÝÞ!Ý×!ÝÐ!ÝÉ!ÝÂ!Ý»!Ý´!Ý­!ݦ!ÝŸ!ݘ!Ý‘!ÝŠ!݃!Ý|!Ýu!Ýn!Ýg!Ý`!ÝY!ÝR!ÝK!ÝD!Ý=!Ý6!Ý/!Ý(!Ý!!Ý!Ý!Ý !Ý!Ýþ Ý÷ Ýð Ýé Ýâ ÝÛ ÝÔ ÝÍ ÝÆ Ý¿ ݸ ݱ ݪ Ý£ Ýœ Ý• ÝŽ ݇ Ý€ Ýy Ýr Ýk Ýd Ý] ÝV ÝO ÝH ÝA Ý: Ý3 Ý, Ý% Ý Ý Ý Ý Ý ÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝý Ýö Ýï Ýè Ýá ÝÚ ÝÓ ÝÌ ÝŠݾ Ý· ݰ Ý© Ý¢ Ý› Ý” Ý Ý† Ý Ýx Ýq Ýj Ýc Ý\ ÝU ÝN ÝG Ý@ Ý9 Ý2 Ý+ Ý$ Ý Ý Ý Ý Ý Ýú Ýó Ýì Ýå ÝÞ Ý× ÝÐ ÝÉ Ý Ý» Ý´ Ý­ ݦ ÝŸ ݘ Ý‘ ÝŠ ݃ Ý| Ýu Ýn Ýg Ý` ÝY ÝR ÝK ÝD Ý= Ý6 Ý/ Ý( Ý! Ý Ý Ý Ý Ýþ Ý÷ Ýð Ýé Ýâ ÝÛ ÝÔ ÝÍ ÝÆ Ý¿ ݸ ݱ ݪ Ý£ Ýœ Ý• ÝŽ ݇ Ý€ Ýy Ýr Ýk Ýd Ý] ÝV ÝO ÝH ÝA Ý: Ý3 Ý, Ý% Ý Ý Ý Ý Ý Ýû Ýô Ýí Ýæ Ýß ÝØ ÝÑ ÝÊ Ýà ݼ ݵ Ý® ݧ Ý  Ý™ Ý’ Ý‹ Ý„ Ý} Ýv Ýo Ýh Ýa ÝZ ÝS ÝL ÝE Ý> Ý7 Ý0 Ý) Ý" Ý Ý Ý Ý Ýÿ Ýø Ýñ Ýê Ýã ÝÜ ÝÕ ÝÎ ÝÇ ÝÀ ݹ ݲ Ý« ݤ Ý Ý– Ý Ýˆ Ý Ýz Ýs Ýl Ýe Ý^ ÝW ÝP ÝI ÝB Ý; Ý4 Ý- Ý& Ý Ý Ý Ý Ý ÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÿÜöÿÜïÿÜèÿÜáÿÜÚÿÜÓÿÜÌÿÜÅÿܾÿÜ·ÿܰÿÜ©ÿÜ¢ÿÜ›ÿÜ”ÿÜÿ܆ÿÜÿÜxÿÜqÿÜjÿÜcÿÜ\ÿÜUÿÜNÿÜGÿÜ@ÿÜ9ÿÜ2ÿÜ+ÿÜ$ÿÜÿÜÿÜÿÜÿÜÿÜúþÜóþÜìþÜåþÜÞþÜ×þÜÐþÜÉþÜÂþÜ»þÜ´þÜ­þܦþÜŸþܘþÜ‘þÜŠþ܃þÜ|þÜuþÜnþÜgþÜ`þÜYþÜRþÜKþÜDþÜ=þÜ6þÜ/þÜ(þÜ!þÜþÜþÜ þÜþÜþýÜ÷ýÜðýÜéýÜâýÜÛýÜÔýÜÍýÜÆýÜ¿ýܸýܱýܪýÜ£ýÜœýÜ•ýÜŽý܇ýÜ€ýÜyýÜrýÜkýÜdýÜ]ýÜVýÜOýÜHýÜAýÜ:ýÜ3ýÜ,ýÜ%ýÜýÜýÜýÜ ýÜýÜûüÜôüÜíüÜæüÜßüÜØüÜÑüÜÊüÜÃüܼüܵüÜ®üܧüÜ üÜ™üÜ’üÜ‹üÜ„üÜ}üÜvüÜoüÜhüÜaüÜZüÜSüÜLüÜEüÜ>üÜ7üÜ0üÜ)üÜ"üÜüÜüÜ üÜüÜÿûÜøûÜñûÜêûÜãûÜÜûÜÕûÜÎûÜÇûÜÀûܹûܲûÜ«ûܤûÜûÜ–ûÜû܈ûÜûÜzûÜsûÜlûÜeûÜ^ûÜWûÜPûÜIûÜBûÜ;ûÜ4ûÜ-ûÜ&ûÜûÜûÜûÜ ûÜûÜüúÜõúÜîúÜçúÜàúÜÙúÜÒúÜËúÜÄúܽúܶúܯúܨúÜ¡úÜšúÜ“úÜŒúÜ…úÜ~úÜwúÜpúÜiúÜbúÜ[úÜTúÜMúÜFúÜ?úÜ8úÜ1úÜ*úÜ#úÜúÜúÜúÜúÜúÜùùÜòùÜëùÜäùÜÝùÜÖùÜÏùÜÈùÜÁùܺùܳùܬùÜ¥ùÜžùÜ—ùÜù܉ùÜ‚ùÜ{ùÜtùÜmùÜfùÜ_ùÜXùÜQùÜJùÜCùÜ<ùÜ5ùÜ.ùÜ'ùÜ ùÜùÜùÜ ùÜùÜýøÜöøÜïøÜèøÜáøÜÚøÜÓøÜÌøÜŸܾøÜ·øÜ°øÜ©øÜ¢øÜ›øÜ”øÜøÜ†øÜøÜxøÜqøÜjøÜcøÜ\øÜUøÜNøÜGøÜ@øÜ9øÜ2øÜ+øÜ$øÜøÜøÜøÜøÜøÜú÷Üó÷Üì÷Üå÷ÜÞ÷Ü×÷ÜÐ÷ÜÉ÷ÜÂ÷Ü»÷Ü´÷Ü­÷ܦ÷ÜŸ÷ܘ÷Ü‘÷ÜŠ÷܃÷Ü|÷Üu÷Ün÷Üg÷Ü`÷ÜY÷ÜR÷ÜK÷ÜD÷Ü=÷Ü6÷Ü/÷Ü(÷Ü!÷Ü÷Ü÷Ü ÷Ü÷ÜþöÜ÷öÜðöÜéöÜâöÜÛöÜÔöÜÍöÜÆöÜ¿öܸöܱöܪöÜ£öÜœöÜ•öÜŽö܇öÜ€öÜyöÜröÜköÜdöÜ]öÜVöÜOöÜHöÜAöÜ:öÜ3öÜ,öÜ%öÜöÜöÜöÜ öÜöÜûõÜôõÜíõÜæõÜßõÜØõÜÑõÜÊõÜÃõܼõܵõÜ®õܧõÜ õÜ™õÜ’õÜ‹õÜ„õÜ}õÜvõÜoõÜhõÜaõÜZõÜSõÜLõÜEõÜ>õÜ7õÜ0õÜ)õÜ"õÜõÜõÜ õÜõÜÿôÜøôÜñôÜêôÜãôÜÜôÜÕôÜÎôÜÇôÜÀôܹôܲôÜ«ôܤôÜôÜ–ôÜô܈ôÜôÜzôÜsôÜlôÜeôÜ^ôÜWôÜPôÜIôÜBôÜ;ôÜ4ôÜ-ôÜ&ôÜôÜôÜôÜ ôÜôÜüóÜõóÜîóÜçóÜàóÜÙóÜÒóÜËóÜÄóܽóܶóܯóܨóÜ¡óÜšóÜ“óÜŒóÜ…óÜ~óÜwóÜpóÜióÜbóÜ[óÜTóÜMóÜFóÜ?óÜ8óÜ1óÜ*óÜ#óÜóÜóÜóÜóÜóÜùòÜòòÜëòÜäòÜÝòÜÖòÜÏòÜÈòÜÁòܺòܳòܬòÜ¥òÜžòÜ—òÜò܉òÜ‚òÜ{òÜtòÜmòÜfòÜ_òÜXòÜQòÜJòÜCòÜ<òÜ5òÜ.òÜ'òÜ òÜòÜòÜ òÜòÜýñÜöñÜïñÜèñÜáñÜÚñÜÓñÜÌñÜÅñܾñÜ·ñܰñÜ©ñÜ¢ñÜ›ñÜ”ñÜñ܆ñÜñÜxñÜqñÜjñÜcñÜ\ñÜUñÜNñÜGñÜ@ñÜ9ñÜ2ñÜ+ñÜ$ñÜñÜñÜñÜñÜñÜúðÜóðÜìðÜåðÜÞðÜ×ðÜÐðÜÉðÜÂðÜ»ðÜ´ðÜ­ðܦðÜŸðܘðÜ‘ðÜŠð܃ðÜ|ðÜuðÜnðÜgðÜ`ðÜYðÜRðÜKðÜDðÜ=ðÜ6ðÜ/ðÜ(ðÜ!ðÜðÜðÜ ðÜðÜþïÜ÷ïÜðïÜéïÜâïÜÛïÜÔïÜÍïÜÆïÜ¿ïܸïܱïܪïÜ£ïÜœïÜ•ïÜŽï܇ïÜ€ïÜyïÜrïÜkïÜdïÜ]ïÜVïÜOïÜHïÜAïÜ:ïÜ3ïÜ,ïÜ%ïÜïÜïÜïÜ ïÜïÜûîÜôîÜíîÜæîÜßîÜØîÜÑîÜÊîÜÃîܼîܵîÜ®îܧîÜ îÜ™îÜ’îÜ‹îÜ„îÜ}îÜvîÜoîÜhîÜaîÜZîÜSîÜLîÜEîÜ>îÜ7îÜ0îÜ)îÜ"îÜîÜîÜ îÜîÜÿíÜøíÜñíÜêíÜãíÜÜíÜÕíÜÎíÜÇíÜÀíܹíܲíÜ«íܤíÜíÜ–íÜí܈íÜíÜzíÜsíÜlíÜeíÜ^íÜWíÜPíÜIíÜBíÜ;íÜ4íÜ-íÜ&íÜíÜíÜíÜ íÜíÜüìÜõìÜîìÜçìÜàìÜÙìÜÒìÜËìÜÄìܽìܶìܯìܨìÜ¡ìÜšìÜ“ìÜŒìÜ…ìÜ~ìÜwìÜpìÜiìÜbìÜ[ìÜTìÜMìÜFìÜ?ìÜ8ìÜ1ìÜ*ìÜ#ìÜìÜìÜìÜìÜìÜùëÜòëÜëëÜäëÜÝëÜÖëÜÏëÜÈëÜÁëܺëܳëܬëÜ¥ëÜžëÜ—ëÜë܉ëÜ‚ëÜ{ëÜtëÜmëÜfëÜ_ëÜXëÜQëÜJëÜCëÜ<ëÜ5ëÜ.ëÜ'ëÜ ëÜëÜëÜ ëÜëÜýêÜöêÜïêÜèêÜáêÜÚêÜÓêÜÌêÜÅêܾêÜ·êܰêÜ©êÜ¢êÜ›êÜ”êÜê܆êÜêÜxêÜqêÜjêÜcêÜ\êÜUêÜNêÜGêÜ@êÜ9êÜ2êÜ+êÜ$êÜêÜêÜêÜêÜêÜúéÜóéÜìéÜåéÜÞéÜ×éÜÐéÜÉéÜÂéÜ»éÜ´éÜ­éܦéÜŸéܘéÜ‘éÜŠé܃éÜ|éÜuéÜnéÜgéÜ`éÜYéÜRéÜKéÜDéÜ=éÜ6éÜ/éÜ(éÜ!éÜéÜéÜ éÜéÜþèÜ÷èÜðèÜéèÜâèÜÛèÜÔèÜÍèÜÆèÜ¿èܸèܱèܪèÜ£èÜœèÜ•èÜŽè܇èÜ€èÜyèÜrèÜkèÜdèÜ]èÜVèÜOèÜHèÜAèÜ:èÜ3èÜ,èÜ%èÜèÜèÜèÜ èÜèÜûçÜôçÜíçÜæçÜßçÜØçÜÑçÜÊçÜÃçܼçܵçÜ®çܧçÜ çÜ™çÜ’çÜ‹çÜ„çÜ}çÜvçÜoçÜhçÜaçÜZçÜSçÜLçÜEçÜ>çÜ7çÜ0çÜ)çÜ"çÜçÜçÜ çÜçÜÿæÜøæÜñæÜêæÜãæÜÜæÜÕæÜÎæÜÇæÜÀæÜ¹æÜ²æÜ«æÜ¤æÜæÜ–æÜæÜˆæÜæÜzæÜsæÜlæÜeæÜ^æÜWæÜPæÜIæÜBæÜ;æÜ4æÜ-æÜ&æÜæÜæÜæÜ æÜæÜüåÜõåÜîåÜçåÜàåÜÙåÜÒåÜËåÜÄåܽåܶåܯåܨåÜ¡åÜšåÜ“åÜŒåÜ…åÜ~åÜwåÜpåÜiåÜbåÜ[åÜTåÜMåÜFåÜ?åÜ8åÜ1åÜ*åÜ#åÜåÜåÜåÜåÜåÜùäÜòäÜëäÜääÜÝäÜÖäÜÏäÜÈäÜÁäܺäܳäܬäÜ¥äÜžäÜ—äÜä܉äÜ‚äÜ{äÜtäÜmäÜfäÜ_äÜXäÜQäÜJäÜCäÜ<äÜ5äÜ.äÜ'äÜ äÜäÜäÜ äÜäÜýãÜöãÜïãÜèãÜáãÜÚãÜÓãÜÌãÜÅãܾãÜ·ãܰãÜ©ãÜ¢ãÜ›ãÜ”ãÜã܆ãÜãÜxãÜqãÜjãÜcãÜ\ãÜUãÜNãÜGãÜ@ãÜ9ãÜ2ãÜ+ãÜ$ãÜãÜãÜãÜãÜãÜúâÜóâÜìâÜåâÜÞâÜ×âÜÐâÜÉâÜÂâÜ»âÜ´âÜ­âܦâÜŸâܘâÜ‘âÜŠâ܃âÜ|âÜuâÜnâÜgâÜ`âÜYâÜRâÜKâÜDâÜ=âÜ6âÜ/âÜ(âÜ!âÜâÜâÜ âÜâÜþáÜ÷áÜðáÜéáÜâáÜÛáÜÔáÜÍáÜÆáÜ¿áܸáܱáܪáÜ£áÜœáÜ•áÜŽá܇áÜ€áÜyáÜráÜkáÜdáÜ]áÜVáÜOáÜHáÜAáÜ:áÜ3áÜ,áÜ%áÜáÜáÜáÜ áÜáÜûàÜôàÜíàÜæàÜßàÜØàÜÑàÜÊàÜÃàܼàܵàÜ®àܧàÜ àÜ™àÜ’àÜ‹àÜ„àÜ}àÜvàÜoàÜhàÜaàÜZàÜSàÜLàÜEàÜ>àÜ7àÜ0àÜ)àÜ"àÜàÜàÜ àÜàÜÿßÜøßÜñßÜêßÜãßÜÜßÜÕßÜÎßÜÇßÜÀßܹßܲßÜ«ßܤßÜßÜ–ßÜß܈ßÜßÜzßÜsßÜlßÜeßÜ^ßÜWßÜPßÜIßÜBßÜ;ßÜ4ßÜ-ßÜ&ßÜßÜßÜßÜ ßÜßÜüÞÜõÞÜîÞÜçÞÜàÞÜÙÞÜÒÞÜËÞÜÄÞܽÞܶÞܯÞܨÞÜ¡ÞÜšÞÜ“ÞÜŒÞÜ…ÞÜ~ÞÜwÞÜpÞÜiÞÜbÞÜ[ÞÜTÞÜMÞÜFÞÜ?ÞÜ8ÞÜ1ÞÜ*ÞÜ#ÞÜÞÜÞÜÞÜÞÜÞÜùÝÜòÝÜëÝÜäÝÜÝÝÜÖÝÜÏÝÜÈÝÜÁÝܺÝܳÝܬÝÜ¥ÝÜžÝÜ—ÝÜÝ܉ÝÜ‚ÝÜ{ÝÜtÝÜmÝÜfÝÜ_ÝÜXÝÜQÝÜJÝÜCÝÜ<ÝÜ5ÝÜ.ÝÜ'ÝÜ ÝÜÝÜÝÜ ÝÜÝÜýÜÜöÜÜïÜÜèÜÜáÜÜÚÜÜÓÜÜÌÜÜÅÜܾÜÜ·ÜܰÜÜ©ÜÜ¢ÜÜ›ÜÜ”ÜÜÜ܆ÜÜÜÜxÜÜqÜÜjÜÜcÜÜ\ÜÜUÜÜNÜÜGÜÜ@ÜÜ9ÜÜ2ÜÜ+ÜÜ$ÜÜÜÜÜÜÜÜÜÜÜÜúÛÜóÛÜìÛÜåÛÜÞÛÜ×ÛÜÐÛÜÉÛÜÂÛÜ»ÛÜ´ÛÜ­ÛܦÛÜŸÛܘÛÜ‘ÛÜŠÛ܃ÛÜ|ÛÜuÛÜnÛÜgÛÜ`ÛÜYÛÜRÛÜKÛÜDÛÜ=ÛÜ6ÛÜ/ÛÜ(ÛÜ!ÛÜÛÜÛÜ ÛÜÛÜþÚÜ÷ÚÜðÚÜéÚÜâÚÜÛÚÜÔÚÜÍÚÜÆÚÜ¿ÚܸÚܱÚܪÚÜ£ÚÜœÚÜ•ÚÜŽÚ܇ÚÜ€ÚÜyÚÜrÚÜkÚÜdÚÜ]ÚÜVÚÜOÚÜHÚÜAÚÜ:ÚÜ3ÚÜ,ÚÜ%ÚÜÚÜÚÜÚÜ ÚÜÚÜûÙÜôÙÜíÙÜæÙÜßÙÜØÙÜÑÙÜÊÙÜÃÙܼÙܵÙÜ®ÙܧÙÜ ÙÜ™ÙÜ’ÙÜ‹ÙÜ„ÙÜ}ÙÜvÙÜoÙÜhÙÜaÙÜZÙÜSÙÜLÙÜEÙÜ>ÙÜ7ÙÜ0ÙÜ)ÙÜ"ÙÜÙÜÙÜ ÙÜÙÜÿØÜøØÜñØÜêØÜãØÜÜØÜÕØÜÎØÜÇØÜÀØÜ¹ØÜ²ØÜ«ØÜ¤ØÜØÜ–ØÜØÜˆØÜØÜzØÜsØÜlØÜeØÜ^ØÜWØÜPØÜIØÜBØÜ;ØÜ4ØÜ-ØÜ&ØÜØÜØÜØÜ ØÜØÜü×Üõ×Üî×Üç×Üà×ÜÙ×ÜÒ×ÜË×ÜÄ×ܽ×ܶ×ܯ×ܨ×Ü¡×Üš×Ü“×ÜŒ×Ü…×Ü~×Üw×Üp×Üi×Üb×Ü[×ÜT×ÜM×ÜF×Ü?×Ü8×Ü1×Ü*×Ü#×Ü×Ü×Ü×Ü×Ü×ÜùÖÜòÖÜëÖÜäÖÜÝÖÜÖÖÜÏÖÜÈÖÜÁÖܺÖܳÖܬÖÜ¥ÖÜžÖÜ—ÖÜÖ܉ÖÜ‚ÖÜ{ÖÜtÖÜmÖÜfÖÜ_ÖÜXÖÜQÖÜJÖÜCÖÜ<ÖÜ5ÖÜ.ÖÜ'ÖÜ ÖÜÖÜÖÜ ÖÜÖÜýÕÜöÕÜïÕÜèÕÜáÕÜÚÕÜÓÕÜÌÕÜÅÕܾÕÜ·ÕܰÕÜ©ÕÜ¢ÕÜ›ÕÜ”ÕÜÕ܆ÕÜÕÜxÕÜqÕÜjÕÜcÕÜ\ÕÜUÕÜNÕÜGÕÜ@ÕÜ9ÕÜ2ÕÜ+ÕÜ$ÕÜÕÜÕÜÕÜÕÜÕÜúÔÜóÔÜìÔÜåÔÜÞÔÜ×ÔÜÐÔÜÉÔÜÂÔÜ»ÔÜ´ÔÜ­ÔܦÔÜŸÔܘÔÜ‘ÔÜŠÔ܃ÔÜ|ÔÜuÔÜnÔÜgÔÜ`ÔÜYÔÜRÔÜKÔÜDÔÜ=ÔÜ6ÔÜ/ÔÜ(ÔÜ!ÔÜÔÜÔÜ ÔÜÔÜþÓÜ÷ÓÜðÓÜéÓÜâÓÜÛÓÜÔÓÜÍÓÜÆÓÜ¿ÓܸÓܱÓܪÓÜ£ÓÜœÓÜ•ÓÜŽÓ܇ÓÜ€ÓÜyÓÜrÓÜkÓÜdÓÜ]ÓÜVÓÜOÓÜHÓÜAÓÜ:ÓÜ3ÓÜ,ÓÜ%ÓÜÓÜÓÜÓÜ ÓÜÓÜûÒÜôÒÜíÒÜæÒÜßÒÜØÒÜÑÒÜÊÒÜÃÒܼÒܵÒÜ®ÒܧÒÜ ÒÜ™ÒÜ’ÒÜ‹ÒÜ„ÒÜ}ÒÜvÒÜoÒÜhÒÜaÒÜZÒÜSÒÜLÒÜEÒÜ>ÒÜ7ÒÜ0ÒÜ)ÒÜ"ÒÜÒÜÒÜ ÒÜÒÜÿÑÜøÑÜñÑÜêÑÜãÑÜÜÑÜÕÑÜÎÑÜÇÑÜÀÑܹÑܲÑÜ«ÑܤÑÜÑÜ–ÑÜÑ܈ÑÜÑÜzÑÜsÑÜlÑÜeÑÜ^ÑÜWÑÜPÑÜIÑÜBÑÜ;ÑÜ4ÑÜ-ÑÜ&ÑÜÑÜÑÜÑÜ ÑÜÑÜüÐÜõÐÜîÐÜçÐÜàÐÜÙÐÜÒÐÜËÐÜÄÐܽÐܶÐܯÐܨÐÜ¡ÐÜšÐÜ“ÐÜŒÐÜ…ÐÜ~ÐÜwÐÜpÐÜiÐÜbÐÜ[ÐÜTÐÜMÐÜFÐÜ?ÐÜ8ÐÜ1ÐÜ*ÐÜ#ÐÜÐÜÐÜÐÜÐÜÐÜùÏÜòÏÜëÏÜäÏÜÝÏÜÖÏÜÏÏÜÈÏÜÁÏܺÏܳÏܬÏÜ¥ÏÜžÏÜ—ÏÜÏ܉ÏÜ‚ÏÜ{ÏÜtÏÜmÏÜfÏÜ_ÏÜXÏÜQÏÜJÏÜCÏÜ<ÏÜ5ÏÜ.ÏÜ'ÏÜ ÏÜÏÜÏÜ ÏÜÏÜýÎÜöÎÜïÎÜèÎÜáÎÜÚÎÜÓÎÜÌÎÜÅÎܾÎÜ·ÎܰÎÜ©ÎÜ¢ÎÜ›ÎÜ”ÎÜÎ܆ÎÜÎÜxÎÜqÎÜjÎÜcÎÜ\ÎÜUÎÜNÎÜGÎÜ@ÎÜ9ÎÜ2ÎÜ+ÎÜ$ÎÜÎÜÎÜÎÜÎÜÎÜúÍÜóÍÜìÍÜåÍÜÞÍÜ×ÍÜÐÍÜÉÍÜÂÍÜ»ÍÜ´ÍÜ­ÍܦÍÜŸÍܘÍÜ‘ÍÜŠÍ܃ÍÜ|ÍÜuÍÜnÍÜgÍÜ`ÍÜYÍÜRÍÜKÍÜDÍÜ=ÍÜ6ÍÜ/ÍÜ(ÍÜ!ÍÜÍÜÍÜ ÍÜÍÜþÌÜ÷ÌÜðÌÜéÌÜâÌÜÛÌÜÔÌÜÍÌÜÆÌÜ¿ÌܸÌܱÌܪÌÜ£ÌÜœÌÜ•ÌÜŽÌ܇ÌÜ€ÌÜyÌÜrÌÜkÌÜdÌÜ]ÌÜVÌÜOÌÜHÌÜAÌÜ:ÌÜ3ÌÜ,ÌÜ%ÌÜÌÜÌÜÌÜ ÌÜÌÜûËÜôËÜíËÜæËÜßËÜØËÜÑËÜÊËÜÃËܼËܵËÜ®ËܧËÜ ËÜ™ËÜ’ËÜ‹ËÜ„ËÜ}ËÜvËÜoËÜhËÜaËÜZËÜSËÜLËÜEËÜ>ËÜ7ËÜ0ËÜ)ËÜ"ËÜËÜËÜ ËÜËÜÿÊÜøÊÜñÊÜêÊÜãÊÜÜÊÜÕÊÜÎÊÜÇÊÜÀÊܹÊܲÊÜ«ÊܤÊÜÊÜ–ÊÜÊ܈ÊÜÊÜzÊÜsÊÜlÊÜeÊÜ^ÊÜWÊÜPÊÜIÊÜBÊÜ;ÊÜ4ÊÜ-ÊÜ&ÊÜÊÜÊÜÊÜ ÊÜÊÜüÉÜõÉÜîÉÜçÉÜàÉÜÙÉÜÒÉÜËÉÜÄÉܽÉܶÉܯÉܨÉÜ¡ÉÜšÉÜ“ÉÜŒÉÜ…ÉÜ~ÉÜwÉÜpÉÜiÉÜbÉÜ[ÉÜTÉÜMÉÜFÉÜ?ÉÜ8ÉÜ1ÉÜ*ÉÜ#ÉÜÉÜÉÜÉÜÉÜÉÜùÈÜòÈÜëÈÜäÈÜÝÈÜÖÈÜÏÈÜÈÈÜÁÈܺÈܳÈܬÈÜ¥ÈÜžÈÜ—ÈÜÈ܉ÈÜ‚ÈÜ{ÈÜtÈÜmÈÜfÈÜ_ÈÜXÈÜQÈÜJÈÜCÈÜ<ÈÜ5ÈÜ.ÈÜ'ÈÜ ÈÜÈÜÈÜ ÈÜÈÜýÇÜöÇÜïÇÜèÇÜáÇÜÚÇÜÓÇÜÌÇÜÅÇܾÇÜ·ÇܰÇÜ©ÇÜ¢ÇÜ›ÇÜ”ÇÜÇ܆ÇÜÇÜxÇÜqÇÜjÇÜcÇÜ\ÇÜUÇÜNÇÜGÇÜ@ÇÜ9ÇÜ2ÇÜ+ÇÜ$ÇÜÇÜÇÜÇÜÇÜÇÜúÆÜóÆÜìÆÜåÆÜÞÆÜׯÜÐÆÜÉÆÜÂÆÜ»ÆÜ´ÆÜ­ÆÜ¦ÆÜŸÆÜ˜ÆÜ‘ÆÜŠÆÜƒÆÜ|ÆÜuÆÜnÆÜgÆÜ`ÆÜYÆÜRÆÜKÆÜDÆÜ=ÆÜ6ÆÜ/ÆÜ(ÆÜ!ÆÜÆÜÆÜ ÆÜÆÜþÅÜ÷ÅÜðÅÜéÅÜâÅÜÛÅÜÔÅÜÍÅÜÆÅÜ¿ÅܸÅܱÅܪÅÜ£ÅÜœÅÜ•ÅÜŽÅ܇ÅÜ€ÅÜyÅÜrÅÜkÅÜdÅÜ]ÅÜVÅÜOÅÜHÅÜAÅÜ:ÅÜ3ÅÜ,ÅÜ%ÅÜÅÜÅÜÅÜ ÅÜÅÜûÄÜôÄÜíÄÜæÄÜßÄÜØÄÜÑÄÜÊÄÜÃÄܼÄܵÄÜ®ÄܧÄÜ ÄÜ™ÄÜ’ÄÜ‹ÄÜ„ÄÜ}ÄÜvÄÜoÄÜhÄÜaÄÜZÄÜSÄÜLÄÜEÄÜ>ÄÜ7ÄÜ0ÄÜ)ÄÜ"ÄÜÄÜÄÜ ÄÜÄÜÿÃÜøÃÜñÃÜêÃÜãÃÜÜÃÜÕÃÜÎÃÜÇÃÜÀÃܹÃܲÃÜ«ÃܤÃÜÃÜ–ÃÜÃ܈ÃÜÃÜzÃÜsÃÜlÃÜeÃÜ^ÃÜWÃÜPÃÜIÃÜBÃÜ;ÃÜ4ÃÜ-ÃÜ&ÃÜÃÜÃÜÃÜ ÃÜÃÜüÂÜõÂÜîÂÜçÂÜàÂÜÙÂÜÒÂÜËÂÜÄÂܽÂܶÂܯÂܨÂÜ¡ÂÜšÂÜ“ÂÜŒÂÜ…ÂÜ~ÂÜwÂÜpÂÜiÂÜbÂÜ[ÂÜTÂÜMÂÜFÂÜ?ÂÜ8ÂÜ1ÂÜ*ÂÜ#ÂÜÂÜÂÜÂÜÂÜÂÜùÁÜòÁÜëÁÜäÁÜÝÁÜÖÁÜÏÁÜÈÁÜÁÁܺÁܳÁܬÁÜ¥ÁÜžÁÜ—ÁÜÁ܉ÁÜ‚ÁÜ{ÁÜtÁÜmÁÜfÁÜ_ÁÜXÁÜQÁÜJÁÜCÁÜ<ÁÜ5ÁÜ.ÁÜ'ÁÜ ÁÜÁÜÁÜ ÁÜÁÜýÀÜöÀÜïÀÜèÀÜáÀÜÚÀÜÓÀÜÌÀÜÅÀܾÀÜ·ÀܰÀÜ©ÀÜ¢ÀÜ›ÀÜ”ÀÜÀ܆ÀÜÀÜxÀÜqÀÜjÀÜcÀÜ\ÀÜUÀÜNÀÜGÀÜ@ÀÜ9ÀÜ2ÀÜ+ÀÜ$ÀÜÀÜÀÜÀÜÀÜÀÜú¿Üó¿Üì¿Üå¿ÜÞ¿Ü׿ÜпÜɿܻܿ¿Ü´¿Ü­¿Ü¦¿ÜŸ¿Ü˜¿Ü‘¿ÜŠ¿Üƒ¿Ü|¿Üu¿Ün¿Üg¿Ü`¿ÜY¿ÜR¿ÜK¿ÜD¿Ü=¿Ü6¿Ü/¿Ü(¿Ü!¿Ü¿Ü¿Ü ¿Ü¿Üþ¾Ü÷¾Üð¾Üé¾Üâ¾ÜÛ¾ÜÔ¾Ü;ÜƾÜ¿¾Ü¸¾Ü±¾Üª¾Ü£¾Üœ¾Ü•¾Ü޾܇¾Ü€¾Üy¾Ür¾Ük¾Üd¾Ü]¾ÜV¾ÜO¾ÜH¾ÜA¾Ü:¾Ü3¾Ü,¾Ü%¾Ü¾Ü¾Ü¾Ü ¾Ü¾Üû½Üô½Üí½Üæ½Üß½ÜؽÜѽÜʽÜýܼ½Üµ½Ü®½Ü§½Ü ½Ü™½Ü’½Ü‹½Ü„½Ü}½Üv½Üo½Üh½Üa½ÜZ½ÜS½ÜL½ÜE½Ü>½Ü7½Ü0½Ü)½Ü"½Ü½Ü½Ü ½Ü½Üÿ¼Üø¼Üñ¼Üê¼Üã¼ÜܼÜÕ¼ÜμÜǼÜÀ¼Ü¹¼Ü²¼Ü«¼Ü¤¼Ü¼Ü–¼Ü¼Üˆ¼Ü¼Üz¼Üs¼Ül¼Üe¼Ü^¼ÜW¼ÜP¼ÜI¼ÜB¼Ü;¼Ü4¼Ü-¼Ü&¼Ü¼Ü¼Ü¼Ü ¼Ü¼Üü»Üõ»Üî»Üç»Üà»ÜÙ»ÜÒ»ÜË»ÜĻܽ»Ü¶»Ü¯»Ü¨»Ü¡»Üš»Ü“»ÜŒ»Ü…»Ü~»Üw»Üp»Üi»Üb»Ü[»ÜT»ÜM»ÜF»Ü?»Ü8»Ü1»Ü*»Ü#»Ü»Ü»Ü»Ü»Ü»ÜùºÜòºÜëºÜäºÜݺÜÖºÜϺÜȺÜÁºÜººÜ³ºÜ¬ºÜ¥ºÜžºÜ—ºÜºÜ‰ºÜ‚ºÜ{ºÜtºÜmºÜfºÜ_ºÜXºÜQºÜJºÜCºÜ<ºÜ5ºÜ.ºÜ'ºÜ ºÜºÜºÜ ºÜºÜý¹Üö¹Üï¹Üè¹Üá¹ÜÚ¹ÜÓ¹Ü̹ÜŹÜ¾¹Ü·¹Ü°¹Ü©¹Ü¢¹Ü›¹Ü”¹Ü¹Ü†¹Ü¹Üx¹Üq¹Üj¹Üc¹Ü\¹ÜU¹ÜN¹ÜG¹Ü@¹Ü9¹Ü2¹Ü+¹Ü$¹Ü¹Ü¹Ü¹Ü¹Ü¹Üú¸Üó¸Üì¸Üå¸ÜÞ¸Ü׸ÜиÜɸܸܻ¸Ü´¸Ü­¸Ü¦¸ÜŸ¸Ü˜¸Ü‘¸ÜЏÜƒ¸Ü|¸Üu¸Ün¸Üg¸Ü`¸ÜY¸ÜR¸ÜK¸ÜD¸Ü=¸Ü6¸Ü/¸Ü(¸Ü!¸Ü¸Ü¸Ü ¸Ü¸Üþ·Ü÷·Üð·Üé·Üâ·ÜÛ·ÜÔ·ÜÍ·ÜÆ·Ü¿·Ü¸·Ü±·Üª·Ü£·Üœ·Ü•·Ü޷܇·Ü€·Üy·Ür·Ük·Üd·Ü]·ÜV·ÜO·ÜH·ÜA·Ü:·Ü3·Ü,·Ü%·Ü·Ü·Ü·Ü ·Ü·Üû¶Üô¶Üí¶Üæ¶Üß¶ÜضÜѶÜʶÜöܼ¶Üµ¶Ü®¶Ü§¶Ü ¶Ü™¶Ü’¶Ü‹¶Ü„¶Ü}¶Üv¶Üo¶Üh¶Üa¶ÜZ¶ÜS¶ÜL¶ÜE¶Ü>¶Ü7¶Ü0¶Ü)¶Ü"¶Ü¶Ü¶Ü ¶Ü¶ÜÿµÜøµÜñµÜêµÜãµÜܵÜÕµÜεÜǵÜÀµÜ¹µÜ²µÜ«µÜ¤µÜµÜ–µÜµÜˆµÜµÜzµÜsµÜlµÜeµÜ^µÜWµÜPµÜIµÜBµÜ;µÜ4µÜ-µÜ&µÜµÜµÜµÜ µÜµÜü´Üõ´Üî´Üç´Üà´ÜÙ´ÜÒ´ÜË´ÜĴܽ´Ü¶´Ü¯´Ü¨´Ü¡´Üš´Ü“´ÜŒ´Ü…´Ü~´Üw´Üp´Üi´Üb´Ü[´ÜT´ÜM´ÜF´Ü?´Ü8´Ü1´Ü*´Ü#´Ü´Ü´Ü´Ü´Ü´Üù³Üò³Üë³Üä³ÜݳÜÖ³ÜϳÜȳÜÁ³Üº³Ü³³Ü¬³Ü¥³Üž³Ü—³Ü³Ü‰³Ü‚³Ü{³Üt³Üm³Üf³Ü_³ÜX³ÜQ³ÜJ³ÜC³Ü<³Ü5³Ü.³Ü'³Ü ³Ü³Ü³Ü ³Ü³Üý²Üö²Üï²Üè²Üá²ÜÚ²ÜÓ²Ü̲ÜŲܾ²Ü·²Ü°²Ü©²Ü¢²Ü›²Ü”²Ü²Ü†²Ü²Üx²Üq²Üj²Üc²Ü\²ÜU²ÜN²ÜG²Ü@²Ü9²Ü2²Ü+²Ü$²Ü²Ü²Ü²Ü²Ü²Üú±Üó±Üì±Üå±ÜÞ±Ü×±ÜбÜɱܱܻ±Ü´±Ü­±Ü¦±ÜŸ±Ü˜±Ü‘±Üб܃±Ü|±Üu±Ün±Üg±Ü`±ÜY±ÜR±ÜK±ÜD±Ü=±Ü6±Ü/±Ü(±Ü!±Ü±Ü±Ü ±Ü±Üþ°Ü÷°Üð°Üé°Üâ°ÜÛ°ÜÔ°ÜͰÜưÜ¿°Ü¸°Ü±°Üª°Ü£°Üœ°Ü•°Üް܇°Ü€°Üy°Ür°Ük°Üd°Ü]°ÜV°ÜO°ÜH°ÜA°Ü:°Ü3°Ü,°Ü%°Ü°Ü°Ü°Ü °Ü°Üû¯Üô¯Üí¯Üæ¯Ü߯ÜدÜѯÜʯÜïܼ¯Üµ¯Ü®¯Ü§¯Ü ¯Ü™¯Ü’¯Ü‹¯Ü„¯Ü}¯Üv¯Üo¯Üh¯Üa¯ÜZ¯ÜS¯ÜL¯ÜE¯Ü>¯Ü7¯Ü0¯Ü)¯Ü"¯Ü¯Ü¯Ü ¯Ü¯Üÿ®Üø®Üñ®Üê®Üã®ÜÜ®ÜÕ®ÜήÜÇ®ÜÀ®Ü¹®Ü²®Ü«®Ü¤®Ü®Ü–®Ü®Üˆ®Ü®Üz®Üs®Ül®Üe®Ü^®ÜW®ÜP®ÜI®ÜB®Ü;®Ü4®Ü-®Ü&®Ü®Ü®Ü®Ü ®Ü®Üü­Üõ­Üî­Üç­Üà­ÜÙ­ÜÒ­ÜË­Üĭܽ­Ü¶­Ü¯­Ü¨­Ü¡­Üš­Ü“­ÜŒ­Ü…­Ü~­Üw­Üp­Üi­Üb­Ü[­ÜT­ÜM­ÜF­Ü?­Ü8­Ü1­Ü*­Ü#­Ü­Ü­Ü­Ü­Ü­Üù¬Üò¬Üë¬Üä¬ÜݬÜÖ¬ÜϬÜȬÜÁ¬Üº¬Ü³¬Ü¬¬Ü¥¬Üž¬Ü—¬Ü¬Ü‰¬Ü‚¬Ü{¬Üt¬Üm¬Üf¬Ü_¬ÜX¬ÜQ¬ÜJ¬ÜC¬Ü<¬Ü5¬Ü.¬Ü'¬Ü ¬Ü¬Ü¬Ü ¬Ü¬Üý«Üö«Üï«Üè«Üá«ÜÚ«ÜÓ«ÜÌ«Üūܾ«Ü·«Ü°«Ü©«Ü¢«Ü›«Ü”«Ü«Ü†«Ü«Üx«Üq«Üj«Üc«Ü\«ÜU«ÜN«ÜG«Ü@«Ü9«Ü2«Ü+«Ü$«Ü«Ü«Ü«Ü«Ü«ÜúªÜóªÜìªÜåªÜÞªÜתÜЪÜɪܪܻªÜ´ªÜ­ªÜ¦ªÜŸªÜ˜ªÜ‘ªÜŠªÜƒªÜ|ªÜuªÜnªÜgªÜ`ªÜYªÜRªÜKªÜDªÜ=ªÜ6ªÜ/ªÜ(ªÜ!ªÜªÜªÜ ªÜªÜþ©Ü÷©Üð©Üé©Üâ©ÜÛ©ÜÔ©ÜÍ©ÜÆ©Ü¿©Ü¸©Ü±©Üª©Ü£©Üœ©Ü•©Üީ܇©Ü€©Üy©Ür©Ük©Üd©Ü]©ÜV©ÜO©ÜH©ÜA©Ü:©Ü3©Ü,©Ü%©Ü©Ü©Ü©Ü ©Ü©Üû¨Üô¨Üí¨Üæ¨ÜߨÜبÜѨÜʨÜèܼ¨Üµ¨Ü®¨Ü§¨Ü ¨Ü™¨Ü’¨Ü‹¨Ü„¨Ü}¨Üv¨Üo¨Üh¨Üa¨ÜZ¨ÜS¨ÜL¨ÜE¨Ü>¨Ü7¨Ü0¨Ü)¨Ü"¨Ü¨Ü¨Ü ¨Ü¨Üÿ§Üø§Üñ§Üê§Üã§ÜܧÜÕ§ÜΧÜǧÜÀ§Ü¹§Ü²§Ü«§Ü¤§Ü§Ü–§Ü§Üˆ§Ü§Üz§Üs§Ül§Üe§Ü^§ÜW§ÜP§ÜI§ÜB§Ü;§Ü4§Ü-§Ü&§Ü§Ü§Ü§Ü §Ü§Üü¦Üõ¦Üî¦Üç¦Üà¦ÜÙ¦ÜÒ¦Ü˦ÜĦܽ¦Ü¶¦Ü¯¦Ü¨¦Ü¡¦Üš¦Ü“¦ÜŒ¦Ü…¦Ü~¦Üw¦Üp¦Üi¦Üb¦Ü[¦ÜT¦ÜM¦ÜF¦Ü?¦Ü8¦Ü1¦Ü*¦Ü#¦Ü¦Ü¦Ü¦Ü¦Ü¦Üù¥Üò¥Üë¥Üä¥ÜÝ¥ÜÖ¥ÜÏ¥ÜÈ¥ÜÁ¥Üº¥Ü³¥Ü¬¥Ü¥¥Üž¥Ü—¥Ü¥Ü‰¥Ü‚¥Ü{¥Üt¥Üm¥Üf¥Ü_¥ÜX¥ÜQ¥ÜJ¥ÜC¥Ü<¥Ü5¥Ü.¥Ü'¥Ü ¥Ü¥Ü¥Ü ¥Ü¥Üý¤Üö¤Üï¤Üè¤Üá¤ÜÚ¤ÜÓ¤Ṳ̈ÜŤÜ¾¤Ü·¤Ü°¤Ü©¤Ü¢¤Ü›¤Ü”¤Ü¤Ü†¤Ü¤Üx¤Üq¤Üj¤Üc¤Ü\¤ÜU¤ÜN¤ÜG¤Ü@¤Ü9¤Ü2¤Ü+¤Ü$¤Ü¤Ü¤Ü¤Ü¤Ü¤Üú£Üó£Üì£Üå£ÜÞ£Ü×£ÜУÜɣܣܻ£Ü´£Ü­£Ü¦£ÜŸ£Ü˜£Ü‘£ÜŠ£Üƒ£Ü|£Üu£Ün£Üg£Ü`£ÜY£ÜR£ÜK£ÜD£Ü=£Ü6£Ü/£Ü(£Ü!£Ü£Ü£Ü £Ü£Üþ¢Ü÷¢Üð¢Üé¢Üâ¢ÜÛ¢ÜÔ¢ÜÍ¢ÜÆ¢Ü¿¢Ü¸¢Ü±¢Üª¢Ü£¢Üœ¢Ü•¢Üޢ܇¢Ü€¢Üy¢Ür¢Ük¢Üd¢Ü]¢ÜV¢ÜO¢ÜH¢ÜA¢Ü:¢Ü3¢Ü,¢Ü%¢Ü¢Ü¢Ü¢Ü ¢Ü¢Üû¡Üô¡Üí¡Üæ¡Üߡܨ¡ÜÑ¡ÜÊ¡Üáܼ¡Üµ¡Ü®¡Ü§¡Ü ¡Ü™¡Ü’¡Ü‹¡Ü„¡Ü}¡Üv¡Üo¡Üh¡Üa¡ÜZ¡ÜS¡ÜL¡ÜE¡Ü>¡Ü7¡Ü0¡Ü)¡Ü"¡Ü¡Ü¡Ü ¡Ü¡Üÿ Üø Üñ Üê Üã ÜÜ ÜÕ ÜΠÜÇ ÜÀ Ü¹ Ü² Ü« Ü¤ Ü Ü– Ü Üˆ Ü Üz Üs Ül Üe Ü^ ÜW ÜP ÜI ÜB Ü; Ü4 Ü- Ü& Ü Ü Ü Ü  Ü ÜüŸÜõŸÜîŸÜçŸÜàŸÜÙŸÜÒŸÜËŸÜğܽŸÜ¶ŸÜ¯ŸÜ¨ŸÜ¡ŸÜšŸÜ“ŸÜŒŸÜ…ŸÜ~ŸÜwŸÜpŸÜiŸÜbŸÜ[ŸÜTŸÜMŸÜFŸÜ?ŸÜ8ŸÜ1ŸÜ*ŸÜ#ŸÜŸÜŸÜŸÜŸÜŸÜùžÜòžÜëžÜäžÜÝžÜÖžÜÏžÜÈžÜÁžÜºžÜ³žÜ¬žÜ¥žÜžžÜ—žÜžÜ‰žÜ‚žÜ{žÜtžÜmžÜfžÜ_žÜXžÜQžÜJžÜCžÜ<žÜ5žÜ.žÜ'žÜ žÜžÜžÜ žÜžÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúœÜóœÜìœÜåœÜÞœÜלÜМÜɜܜܻœÜ´œÜ­œÜ¦œÜŸœÜ˜œÜ‘œÜŠœÜƒœÜ|œÜuœÜnœÜgœÜ`œÜYœÜRœÜKœÜDœÜ=œÜ6œÜ/œÜ(œÜ!œÜœÜœÜ œÜœÜþ›Ü÷›Üð›Üé›Üâ›ÜÛ›ÜÔ›ÜÍ›ÜÆ›Ü¿›Ü¸›Ü±›Üª›Ü£›Üœ›Ü•›Üޛ܇›Ü€›Üy›Ür›Ük›Üd›Ü]›ÜV›ÜO›ÜH›ÜA›Ü:›Ü3›Ü,›Ü%›Ü›Ü›Ü›Ü ›Ü›ÜûšÜôšÜíšÜæšÜßšÜØšÜÑšÜÊšÜÚܼšÜµšÜ®šÜ§šÜ šÜ™šÜ’šÜ‹šÜ„šÜ}šÜvšÜošÜhšÜašÜZšÜSšÜLšÜEšÜ>šÜ7šÜ0šÜ)šÜ"šÜšÜšÜ šÜšÜÿ™Üø™Üñ™Üê™Üã™ÜÜ™ÜÕ™ÜΙÜÇ™ÜÀ™Ü¹™Ü²™Ü«™Ü¤™Ü™Ü–™Ü™Üˆ™Ü™Üz™Üs™Ül™Üe™Ü^™ÜW™ÜP™ÜI™ÜB™Ü;™Ü4™Ü-™Ü&™Ü™Ü™Ü™Ü ™Ü™Üü˜Üõ˜Üî˜Üç˜Üà˜ÜÙ˜ÜÒ˜Ü˘ÜĘܽ˜Ü¶˜Ü¯˜Ü¨˜Ü¡˜Üš˜Ü“˜ÜŒ˜Ü…˜Ü~˜Üw˜Üp˜Üi˜Üb˜Ü[˜ÜT˜ÜM˜ÜF˜Ü?˜Ü8˜Ü1˜Ü*˜Ü#˜Ü˜Ü˜Ü˜Ü˜Ü˜Üù—Üò—Üë—Üä—ÜÝ—ÜÖ—ÜÏ—ÜÈ—ÜÁ—ܺ—ܳ—ܬ—Ü¥—Üž—Ü——ܗ܉—Ü‚—Ü{—Üt—Üm—Üf—Ü_—ÜX—ÜQ—ÜJ—ÜC—Ü<—Ü5—Ü.—Ü'—Ü —Ü—Ü—Ü —Ü—Üý–Üö–Üï–Üè–Üá–ÜÚ–ÜÓ–ÜÌ–ÜŖܾ–Ü·–ܰ–Ü©–Ü¢–Ü›–Ü”–ܖ܆–Ü–Üx–Üq–Üj–Üc–Ü\–ÜU–ÜN–ÜG–Ü@–Ü9–Ü2–Ü+–Ü$–Ü–Ü–Ü–Ü–Ü–Üú•Üó•Üì•Üå•ÜÞ•ÜוÜЕÜɕܕܻ•Ü´•Ü­•ܦ•ÜŸ•ܘ•Ü‘•ÜŠ•܃•Ü|•Üu•Ün•Üg•Ü`•ÜY•ÜR•ÜK•ÜD•Ü=•Ü6•Ü/•Ü(•Ü!•Ü•Ü•Ü •Ü•Üþ”Ü÷”Üð”Üé”Üâ”ÜÛ”ÜÔ”ÜÍ”ÜÆ”Ü¿”ܸ”ܱ”ܪ”Ü£”Üœ”Ü•”ÜŽ”܇”Ü€”Üy”Ür”Ük”Üd”Ü]”ÜV”ÜO”ÜH”ÜA”Ü:”Ü3”Ü,”Ü%”Ü”Ü”Ü”Ü ”Ü”Üû“Üô“Üí“Üæ“Üߓܨ“ÜÑ“ÜÊ“ÜÓܼ“ܵ“Ü®“ܧ“Ü “Ü™“Ü’“Ü‹“Ü„“Ü}“Üv“Üo“Üh“Üa“ÜZ“ÜS“ÜL“ÜE“Ü>“Ü7“Ü0“Ü)“Ü"“Ü“Ü“Ü “Ü“Üÿ’Üø’Üñ’Üê’Üã’ÜÜ’ÜÕ’ÜÎ’ÜÇ’ÜÀ’ܹ’ܲ’Ü«’ܤ’Ü’Ü–’ܒ܈’Ü’Üz’Üs’Ül’Üe’Ü^’ÜW’ÜP’ÜI’ÜB’Ü;’Ü4’Ü-’Ü&’Ü’Ü’Ü’Ü ’Ü’Üü‘Üõ‘Üî‘Üç‘Üà‘ÜÙ‘ÜÒ‘ÜË‘Üđܽ‘ܶ‘ܯ‘ܨ‘Ü¡‘Üš‘Ü“‘ÜŒ‘Ü…‘Ü~‘Üw‘Üp‘Üi‘Üb‘Ü[‘ÜT‘ÜM‘ÜF‘Ü?‘Ü8‘Ü1‘Ü*‘Ü#‘ܑܑܑܑܑÜùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúŽÜóŽÜìŽÜåŽÜÞŽÜ׎ÜÐŽÜÉŽÜÂŽÜ»ŽÜ´ŽÜ­ŽÜ¦ŽÜŸŽÜ˜ŽÜ‘ŽÜŠŽÜƒŽÜ|ŽÜuŽÜnŽÜgŽÜ`ŽÜYŽÜRŽÜKŽÜDŽÜ=ŽÜ6ŽÜ/ŽÜ(ŽÜ!ŽÜŽÜŽÜ ŽÜŽÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûŒÜôŒÜíŒÜæŒÜߌÜØŒÜÑŒÜÊŒÜÌܼŒÜµŒÜ®ŒÜ§ŒÜ ŒÜ™ŒÜ’ŒÜ‹ŒÜ„ŒÜ}ŒÜvŒÜoŒÜhŒÜaŒÜZŒÜSŒÜLŒÜEŒÜ>ŒÜ7ŒÜ0ŒÜ)ŒÜ"ŒÜŒÜŒÜ ŒÜŒÜÿ‹Üø‹Üñ‹Üê‹Üã‹ÜÜ‹ÜÕ‹Ü΋ÜÇ‹ÜÀ‹Ü¹‹Ü²‹Ü«‹Ü¤‹Ü‹Ü–‹Ü‹Üˆ‹Ü‹Üz‹Üs‹Ül‹Üe‹Ü^‹ÜW‹ÜP‹ÜI‹ÜB‹Ü;‹Ü4‹Ü-‹Ü&‹Ü‹Ü‹Ü‹Ü ‹Ü‹ÜüŠÜõŠÜîŠÜçŠÜàŠÜÙŠÜÒŠÜËŠÜĊܽŠÜ¶ŠÜ¯ŠÜ¨ŠÜ¡ŠÜšŠÜ“ŠÜŒŠÜ…ŠÜ~ŠÜwŠÜpŠÜiŠÜbŠÜ[ŠÜTŠÜMŠÜFŠÜ?ŠÜ8ŠÜ1ŠÜ*ŠÜ#ŠÜŠÜŠÜŠÜŠÜŠÜù‰Üò‰Üë‰Üä‰Ü݉ÜÖ‰ÜωÜȉÜÁ‰Üº‰Ü³‰Ü¬‰Ü¥‰Üž‰Ü—‰Ü‰Ü‰‰Ü‚‰Ü{‰Üt‰Üm‰Üf‰Ü_‰ÜX‰ÜQ‰ÜJ‰ÜC‰Ü<‰Ü5‰Ü.‰Ü'‰Ü ‰Ü‰Ü‰Ü ‰Ü‰ÜýˆÜöˆÜïˆÜèˆÜáˆÜÚˆÜÓˆÜ̈ÜňܾˆÜ·ˆÜ°ˆÜ©ˆÜ¢ˆÜ›ˆÜ”ˆÜˆÜ†ˆÜˆÜxˆÜqˆÜjˆÜcˆÜ\ˆÜUˆÜNˆÜGˆÜ@ˆÜ9ˆÜ2ˆÜ+ˆÜ$ˆÜˆÜˆÜˆÜˆÜˆÜú‡Üó‡Üì‡Üå‡ÜÞ‡ÜׇÜЇÜɇ܇ܻ‡Ü´‡Ü­‡Ü¦‡ÜŸ‡Ü˜‡Ü‘‡ÜЇÜƒ‡Ü|‡Üu‡Ün‡Üg‡Ü`‡ÜY‡ÜR‡ÜK‡ÜD‡Ü=‡Ü6‡Ü/‡Ü(‡Ü!‡Ü‡Ü‡Ü ‡Ü‡Üþ†Ü÷†Üð†Üé†Üâ†ÜÛ†ÜÔ†Ü͆ÜƆÜ¿†Ü¸†Ü±†Üª†Ü£†Üœ†Ü•†Üކ܇†Ü€†Üy†Ür†Ük†Üd†Ü]†ÜV†ÜO†ÜH†ÜA†Ü:†Ü3†Ü,†Ü%†Ü†Ü†Ü†Ü †Ü†Üû…Üô…Üí…Üæ…Üß…ÜØ…ÜÑ…ÜÊ…ÜÅܼ…ܵ…Ü®…ܧ…Ü …Ü™…Ü’…Ü‹…Ü„…Ü}…Üv…Üo…Üh…Üa…ÜZ…ÜS…ÜL…ÜE…Ü>…Ü7…Ü0…Ü)…Ü"…Ü…Ü…Ü …Ü…Üÿ„Üø„Üñ„Üê„Üã„ÜÜ„ÜÕ„Ü΄ÜÇ„ÜÀ„ܹ„ܲ„Ü«„ܤ„܄ܖ„܄܈„Ü„Üz„Üs„Ül„Üe„Ü^„ÜW„ÜP„ÜI„ÜB„Ü;„Ü4„Ü-„Ü&„Ü„Ü„Ü„Ü „Ü„ÜüƒÜõƒÜîƒÜçƒÜàƒÜÙƒÜÒƒÜ˃ÜăܽƒÜ¶ƒÜ¯ƒÜ¨ƒÜ¡ƒÜšƒÜ“ƒÜŒƒÜ…ƒÜ~ƒÜwƒÜpƒÜiƒÜbƒÜ[ƒÜTƒÜMƒÜFƒÜ?ƒÜ8ƒÜ1ƒÜ*ƒÜ#ƒÜƒÜƒÜƒÜƒÜƒÜù‚Üò‚Üë‚Üä‚ÜÝ‚ÜÖ‚ÜÏ‚ÜÈ‚ÜÁ‚ܺ‚ܳ‚ܬ‚Ü¥‚Üž‚Ü—‚܂܉‚Ü‚‚Ü{‚Üt‚Üm‚Üf‚Ü_‚ÜX‚ÜQ‚ÜJ‚ÜC‚Ü<‚Ü5‚Ü.‚Ü'‚Ü ‚Ü‚Ü‚Ü ‚Ü‚ÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜú€Üó€Üì€Üå€ÜÞ€Ü×€ÜЀÜɀ܀ܻ€Ü´€Ü­€Ü¦€ÜŸ€Ü˜€Ü‘€ÜŠ€Üƒ€Ü|€Üu€Ün€Üg€Ü`€ÜY€ÜR€ÜK€ÜD€Ü=€Ü6€Ü/€Ü(€Ü!€Ü€Ü€Ü €Ü€ÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜû~Üô~Üí~Üæ~Üß~ÜØ~ÜÑ~ÜÊ~ÜÃ~ܼ~ܵ~Ü®~ܧ~Ü ~Ü™~Ü’~Ü‹~Ü„~Ü}~Üv~Üo~Üh~Üa~ÜZ~ÜS~ÜL~ÜE~Ü>~Ü7~Ü0~Ü)~Ü"~Ü~Ü~Ü ~Ü~Üÿ}Üø}Üñ}Üê}Üã}ÜÜ}ÜÕ}ÜÎ}ÜÇ}ÜÀ}ܹ}ܲ}Ü«}ܤ}Ü}Ü–}Ü}܈}Ü}Üz}Üs}Ül}Üe}Ü^}ÜW}ÜP}ÜI}ÜB}Ü;}Ü4}Ü-}Ü&}Ü}Ü}Ü}Ü }Ü}Üü|Üõ|Üî|Üç|Üà|ÜÙ|ÜÒ|ÜË|ÜÄ|ܽ|ܶ|ܯ|ܨ|Ü¡|Üš|Ü“|ÜŒ|Ü…|Ü~|Üw|Üp|Üi|Üb|Ü[|ÜT|ÜM|ÜF|Ü?|Ü8|Ü1|Ü*|Ü#|Ü|Ü|Ü|Ü|Ü|Üù{Üò{Üë{Üä{ÜÝ{ÜÖ{ÜÏ{ÜÈ{ÜÁ{ܺ{ܳ{ܬ{Ü¥{Üž{Ü—{Ü{܉{Ü‚{Ü{{Üt{Üm{Üf{Ü_{ÜX{ÜQ{ÜJ{ÜC{Ü<{Ü5{Ü.{Ü'{Ü {Ü{Ü{Ü {Ü{ÜýzÜözÜïzÜèzÜázÜÚzÜÓzÜÌzÜÅzܾzÜ·zܰzÜ©zÜ¢zÜ›zÜ”zÜz܆zÜzÜxzÜqzÜjzÜczÜ\zÜUzÜNzÜGzÜ@zÜ9zÜ2zÜ+zÜ$zÜzÜzÜzÜzÜzÜúyÜóyÜìyÜåyÜÞyÜ×yÜÐyÜÉyÜÂyÜ»yÜ´yÜ­yܦyÜŸyܘyÜ‘yÜŠy܃yÜ|yÜuyÜnyÜgyÜ`yÜYyÜRyÜKyÜDyÜ=yÜ6yÜ/yÜ(yÜ!yÜyÜyÜ yÜyÜþxÜ÷xÜðxÜéxÜâxÜÛxÜÔxÜÍxÜÆxÜ¿xܸxܱxܪxÜ£xÜœxÜ•xÜŽx܇xÜ€xÜyxÜrxÜkxÜdxÜ]xÜVxÜOxÜHxÜAxÜ:xÜ3xÜ,xÜ%xÜxÜxÜxÜ xÜxÜûwÜôwÜíwÜæwÜßwÜØwÜÑwÜÊwÜÃwܼwܵwÜ®wܧwÜ wÜ™wÜ’wÜ‹wÜ„wÜ}wÜvwÜowÜhwÜawÜZwÜSwÜLwÜEwÜ>wÜ7wÜ0wÜ)wÜ"wÜwÜwÜ wÜwÜÿvÜøvÜñvÜêvÜãvÜÜvÜÕvÜÎvÜÇvÜÀvܹvܲvÜ«vܤvÜvÜ–vÜv܈vÜvÜzvÜsvÜlvÜevÜ^vÜWvÜPvÜIvÜBvÜ;vÜ4vÜ-vÜ&vÜvÜvÜvÜ vÜvÜüuÜõuÜîuÜçuÜàuÜÙuÜÒuÜËuÜÄuܽuܶuܯuܨuÜ¡uÜšuÜ“uÜŒuÜ…uÜ~uÜwuÜpuÜiuÜbuÜ[uÜTuÜMuÜFuÜ?uÜ8uÜ1uÜ*uÜ#uÜuÜuÜuÜuÜuÜùtÜòtÜëtÜätÜÝtÜÖtÜÏtÜÈtÜÁtܺtܳtܬtÜ¥tÜžtÜ—tÜt܉tÜ‚tÜ{tÜttÜmtÜftÜ_tÜXtÜQtÜJtÜCtÜpÜ7pÜ0pÜ)pÜ"pÜpÜpÜ pÜpÜÿoÜøoÜñoÜêoÜãoÜÜoÜÕoÜÎoÜÇoÜÀoܹoܲoÜ«oܤoÜoÜ–oÜo܈oÜoÜzoÜsoÜloÜeoÜ^oÜWoÜPoÜIoÜBoÜ;oÜ4oÜ-oÜ&oÜoÜoÜoÜ oÜoÜünÜõnÜînÜçnÜànÜÙnÜÒnÜËnÜÄnܽnܶnܯnܨnÜ¡nÜšnÜ“nÜŒnÜ…nÜ~nÜwnÜpnÜinÜbnÜ[nÜTnÜMnÜFnÜ?nÜ8nÜ1nÜ*nÜ#nÜnÜnÜnÜnÜnÜùmÜòmÜëmÜämÜÝmÜÖmÜÏmÜÈmÜÁmܺmܳmܬmÜ¥mÜžmÜ—mÜm܉mÜ‚mÜ{mÜtmÜmmÜfmÜ_mÜXmÜQmÜJmÜCmÜiÜ7iÜ0iÜ)iÜ"iÜiÜiÜ iÜiÜÿhÜøhÜñhÜêhÜãhÜÜhÜÕhÜÎhÜÇhÜÀhܹhܲhÜ«hܤhÜhÜ–hÜh܈hÜhÜzhÜshÜlhÜehÜ^hÜWhÜPhÜIhÜBhÜ;hÜ4hÜ-hÜ&hÜhÜhÜhÜ hÜhÜügÜõgÜîgÜçgÜàgÜÙgÜÒgÜËgÜÄgܽgܶgܯgܨgÜ¡gÜšgÜ“gÜŒgÜ…gÜ~gÜwgÜpgÜigÜbgÜ[gÜTgÜMgÜFgÜ?gÜ8gÜ1gÜ*gÜ#gÜgÜgÜgÜgÜgÜùfÜòfÜëfÜäfÜÝfÜÖfÜÏfÜÈfÜÁfܺfܳfܬfÜ¥fÜžfÜ—fÜf܉fÜ‚fÜ{fÜtfÜmfÜffÜ_fÜXfÜQfÜJfÜCfÜbÜ7bÜ0bÜ)bÜ"bÜbÜbÜ bÜbÜÿaÜøaÜñaÜêaÜãaÜÜaÜÕaÜÎaÜÇaÜÀaܹaܲaÜ«aܤaÜaÜ–aÜa܈aÜaÜzaÜsaÜlaÜeaÜ^aÜWaÜPaÜIaÜBaÜ;aÜ4aÜ-aÜ&aÜaÜaÜaÜ aÜaÜü`Üõ`Üî`Üç`Üà`ÜÙ`ÜÒ`ÜË`ÜÄ`ܽ`ܶ`ܯ`ܨ`Ü¡`Üš`Ü“`ÜŒ`Ü…`Ü~`Üw`Üp`Üi`Üb`Ü[`ÜT`ÜM`ÜF`Ü?`Ü8`Ü1`Ü*`Ü#`Ü`Ü`Ü`Ü`Ü`Üù_Üò_Üë_Üä_ÜÝ_ÜÖ_ÜÏ_ÜÈ_ÜÁ_ܺ_ܳ_ܬ_Ü¥_Üž_Ü—_Ü_܉_Ü‚_Ü{_Üt_Üm_Üf_Ü__ÜX_ÜQ_ÜJ_ÜC_Ü<_Ü5_Ü._Ü'_Ü _Ü_Ü_Ü _Ü_Üý^Üö^Üï^Üè^Üá^ÜÚ^ÜÓ^ÜÌ^ÜÅ^ܾ^Ü·^ܰ^Ü©^Ü¢^Ü›^Ü”^Ü^܆^Ü^Üx^Üq^Üj^Üc^Ü\^ÜU^ÜN^ÜG^Ü@^Ü9^Ü2^Ü+^Ü$^Ü^Ü^Ü^Ü^Ü^Üú]Üó]Üì]Üå]ÜÞ]Ü×]ÜÐ]ÜÉ]ÜÂ]Ü»]Ü´]Ü­]ܦ]ÜŸ]ܘ]Ü‘]ÜŠ]܃]Ü|]Üu]Ün]Üg]Ü`]ÜY]ÜR]ÜK]ÜD]Ü=]Ü6]Ü/]Ü(]Ü!]Ü]Ü]Ü ]Ü]Üþ\Ü÷\Üð\Üé\Üâ\ÜÛ\ÜÔ\ÜÍ\ÜÆ\Ü¿\ܸ\ܱ\ܪ\Ü£\Üœ\Ü•\ÜŽ\܇\Ü€\Üy\Ür\Ük\Üd\Ü]\ÜV\ÜO\ÜH\ÜA\Ü:\Ü3\Ü,\Ü%\Ü\Ü\Ü\Ü \Ü\Üû[Üô[Üí[Üæ[Üß[ÜØ[ÜÑ[ÜÊ[ÜÃ[ܼ[ܵ[Ü®[ܧ[Ü [Ü™[Ü’[Ü‹[Ü„[Ü}[Üv[Üo[Üh[Üa[ÜZ[ÜS[ÜL[ÜE[Ü>[Ü7[Ü0[Ü)[Ü"[Ü[Ü[Ü [Ü[ÜÿZÜøZÜñZÜêZÜãZÜÜZÜÕZÜÎZÜÇZÜÀZܹZܲZÜ«ZܤZÜZÜ–ZÜZ܈ZÜZÜzZÜsZÜlZÜeZÜ^ZÜWZÜPZÜIZÜBZÜ;ZÜ4ZÜ-ZÜ&ZÜZÜZÜZÜ ZÜZÜüYÜõYÜîYÜçYÜàYÜÙYÜÒYÜËYÜÄYܽYܶYܯYܨYÜ¡YÜšYÜ“YÜŒYÜ…YÜ~YÜwYÜpYÜiYÜbYÜ[YÜTYÜMYÜFYÜ?YÜ8YÜ1YÜ*YÜ#YÜYÜYÜYÜYÜYÜùXÜòXÜëXÜäXÜÝXÜÖXÜÏXÜÈXÜÁXܺXܳXܬXÜ¥XÜžXÜ—XÜX܉XÜ‚XÜ{XÜtXÜmXÜfXÜ_XÜXXÜQXÜJXÜCXÜTÜ7TÜ0TÜ)TÜ"TÜTÜTÜ TÜTÜÿSÜøSÜñSÜêSÜãSÜÜSÜÕSÜÎSÜÇSÜÀSܹSܲSÜ«SܤSÜSÜ–SÜS܈SÜSÜzSÜsSÜlSÜeSÜ^SÜWSÜPSÜISÜBSÜ;SÜ4SÜ-SÜ&SÜSÜSÜSÜ SÜSÜüRÜõRÜîRÜçRÜàRÜÙRÜÒRÜËRÜÄRܽRܶRܯRܨRÜ¡RÜšRÜ“RÜŒRÜ…RÜ~RÜwRÜpRÜiRÜbRÜ[RÜTRÜMRÜFRÜ?RÜ8RÜ1RÜ*RÜ#RÜRÜRÜRÜRÜRÜùQÜòQÜëQÜäQÜÝQÜÖQÜÏQÜÈQÜÁQܺQܳQܬQÜ¥QÜžQÜ—QÜQ܉QÜ‚QÜ{QÜtQÜmQÜfQÜ_QÜXQÜQQÜJQÜCQÜMÜ7MÜ0MÜ)MÜ"MÜMÜMÜ MÜMÜÿLÜøLÜñLÜêLÜãLÜÜLÜÕLÜÎLÜÇLÜÀLܹLܲLÜ«LܤLÜLÜ–LÜL܈LÜLÜzLÜsLÜlLÜeLÜ^LÜWLÜPLÜILÜBLÜ;LÜ4LÜ-LÜ&LÜLÜLÜLÜ LÜLÜüKÜõKÜîKÜçKÜàKÜÙKÜÒKÜËKÜÄKܽKܶKܯKܨKÜ¡KÜšKÜ“KÜŒKÜ…KÜ~KÜwKÜpKÜiKÜbKÜ[KÜTKÜMKÜFKÜ?KÜ8KÜ1KÜ*KÜ#KÜKÜKÜKÜKÜKÜùJÜòJÜëJÜäJÜÝJÜÖJÜÏJÜÈJÜÁJܺJܳJܬJÜ¥JÜžJÜ—JÜJ܉JÜ‚JÜ{JÜtJÜmJÜfJÜ_JÜXJÜQJÜJJÜCJÜFÜ7FÜ0FÜ)FÜ"FÜFÜFÜ FÜFÜÿEÜøEÜñEÜêEÜãEÜÜEÜÕEÜÎEÜÇEÜÀEܹEܲEÜ«EܤEÜEÜ–EÜE܈EÜEÜzEÜsEÜlEÜeEÜ^EÜWEÜPEÜIEÜBEÜ;EÜ4EÜ-EÜ&EÜEÜEÜEÜ EÜEÜüDÜõDÜîDÜçDÜàDÜÙDÜÒDÜËDÜÄDܽDܶDܯDܨDÜ¡DÜšDÜ“DÜŒDÜ…DÜ~DÜwDÜpDÜiDÜbDÜ[DÜTDÜMDÜFDÜ?DÜ8DÜ1DÜ*DÜ#DÜDÜDÜDÜDÜDÜùCÜòCÜëCÜäCÜÝCÜÖCÜÏCÜÈCÜÁCܺCܳCܬCÜ¥CÜžCÜ—CÜC܉CÜ‚CÜ{CÜtCÜmCÜfCÜ_CÜXCÜQCÜJCÜCCÜ?Ü7?Ü0?Ü)?Ü"?Ü?Ü?Ü ?Ü?Üÿ>Üø>Üñ>Üê>Üã>ÜÜ>ÜÕ>ÜÎ>ÜÇ>ÜÀ>ܹ>ܲ>Ü«>ܤ>Ü>Ü–>Ü>܈>Ü>Üz>Üs>Ül>Üe>Ü^>ÜW>ÜP>ÜI>ÜB>Ü;>Ü4>Ü->Ü&>Ü>Ü>Ü>Ü >Ü>Üü=Üõ=Üî=Üç=Üà=ÜÙ=ÜÒ=ÜË=ÜÄ=ܽ=ܶ=ܯ=ܨ=Ü¡=Üš=Ü“=ÜŒ=Ü…=Ü~=Üw=Üp=Üi=Üb=Ü[=ÜT=ÜM=ÜF=Ü?=Ü8=Ü1=Ü*=Ü#=Ü=Ü=Ü=Ü=Ü=Üù<Üò<Üë<Üä<ÜÝ<ÜÖ<ÜÏ<ÜÈ<ÜÁ<ܺ<ܳ<ܬ<Ü¥<Üž<Ü—<Ü<܉<Ü‚<Ü{<Üt<Üm<Üf<Ü_<ÜX<ÜQ<ÜJ<ÜC<Ü<<Ü5<Ü.<Ü'<Ü <Ü<Ü<Ü <Ü<Üý;Üö;Üï;Üè;Üá;ÜÚ;ÜÓ;ÜÌ;ÜÅ;ܾ;Ü·;ܰ;Ü©;Ü¢;Ü›;Ü”;Ü;܆;Ü;Üx;Üq;Üj;Üc;Ü\;ÜU;ÜN;ÜG;Ü@;Ü9;Ü2;Ü+;Ü$;Ü;Ü;Ü;Ü;Ü;Üú:Üó:Üì:Üå:ÜÞ:Ü×:ÜÐ:ÜÉ:ÜÂ:Ü»:Ü´:Ü­:ܦ:ÜŸ:ܘ:Ü‘:ÜŠ:܃:Ü|:Üu:Ün:Üg:Ü`:ÜY:ÜR:ÜK:ÜD:Ü=:Ü6:Ü/:Ü(:Ü!:Ü:Ü:Ü :Ü:Üþ9Ü÷9Üð9Üé9Üâ9ÜÛ9ÜÔ9ÜÍ9ÜÆ9Ü¿9ܸ9ܱ9ܪ9Ü£9Üœ9Ü•9ÜŽ9܇9Ü€9Üy9Ür9Ük9Üd9Ü]9ÜV9ÜO9ÜH9ÜA9Ü:9Ü39Ü,9Ü%9Ü9Ü9Ü9Ü 9Ü9Üû8Üô8Üí8Üæ8Üß8ÜØ8ÜÑ8ÜÊ8ÜÃ8ܼ8ܵ8Ü®8ܧ8Ü 8Ü™8Ü’8Ü‹8Ü„8Ü}8Üv8Üo8Üh8Üa8ÜZ8ÜS8ÜL8ÜE8Ü>8Ü78Ü08Ü)8Ü"8Ü8Ü8Ü 8Ü8Üÿ7Üø7Üñ7Üê7Üã7ÜÜ7ÜÕ7ÜÎ7ÜÇ7ÜÀ7ܹ7ܲ7Ü«7ܤ7Ü7Ü–7Ü7܈7Ü7Üz7Üs7Ül7Üe7Ü^7ÜW7ÜP7ÜI7ÜB7Ü;7Ü47Ü-7Ü&7Ü7Ü7Ü7Ü 7Ü7Üü6Üõ6Üî6Üç6Üà6ÜÙ6ÜÒ6ÜË6ÜÄ6ܽ6ܶ6ܯ6ܨ6Ü¡6Üš6Ü“6ÜŒ6Ü…6Ü~6Üw6Üp6Üi6Üb6Ü[6ÜT6ÜM6ÜF6Ü?6Ü86Ü16Ü*6Ü#6Ü6Ü6Ü6Ü6Ü6Üù5Üò5Üë5Üä5ÜÝ5ÜÖ5ÜÏ5ÜÈ5ÜÁ5ܺ5ܳ5ܬ5Ü¥5Üž5Ü—5Ü5܉5Ü‚5Ü{5Üt5Üm5Üf5Ü_5ÜX5ÜQ5ÜJ5ÜC5Ü<5Ü55Ü.5Ü'5Ü 5Ü5Ü5Ü 5Ü5Üý4Üö4Üï4Üè4Üá4ÜÚ4ÜÓ4ÜÌ4ÜÅ4ܾ4Ü·4ܰ4Ü©4Ü¢4Ü›4Ü”4Ü4܆4Ü4Üx4Üq4Üj4Üc4Ü\4ÜU4ÜN4ÜG4Ü@4Ü94Ü24Ü+4Ü$4Ü4Ü4Ü4Ü4Ü4Üú3Üó3Üì3Üå3ÜÞ3Ü×3ÜÐ3ÜÉ3ÜÂ3Ü»3Ü´3Ü­3ܦ3ÜŸ3ܘ3Ü‘3ÜŠ3܃3Ü|3Üu3Ün3Üg3Ü`3ÜY3ÜR3ÜK3ÜD3Ü=3Ü63Ü/3Ü(3Ü!3Ü3Ü3Ü 3Ü3Üþ2Ü÷2Üð2Üé2Üâ2ÜÛ2ÜÔ2ÜÍ2ÜÆ2Ü¿2ܸ2ܱ2ܪ2Ü£2Üœ2Ü•2ÜŽ2܇2Ü€2Üy2Ür2Ük2Üd2Ü]2ÜV2ÜO2ÜH2ÜA2Ü:2Ü32Ü,2Ü%2Ü2Ü2Ü2Ü 2Ü2Üû1Üô1Üí1Üæ1Üß1ÜØ1ÜÑ1ÜÊ1ÜÃ1ܼ1ܵ1Ü®1ܧ1Ü 1Ü™1Ü’1Ü‹1Ü„1Ü}1Üv1Üo1Üh1Üa1ÜZ1ÜS1ÜL1ÜE1Ü>1Ü71Ü01Ü)1Ü"1Ü1Ü1Ü 1Ü1Üÿ0Üø0Üñ0Üê0Üã0ÜÜ0ÜÕ0ÜÎ0ÜÇ0ÜÀ0ܹ0ܲ0Ü«0ܤ0Ü0Ü–0Ü0܈0Ü0Üz0Üs0Ül0Üe0Ü^0ÜW0ÜP0ÜI0ÜB0Ü;0Ü40Ü-0Ü&0Ü0Ü0Ü0Ü 0Ü0Üü/Üõ/Üî/Üç/Üà/ÜÙ/ÜÒ/ÜË/ÜÄ/ܽ/ܶ/ܯ/ܨ/Ü¡/Üš/Ü“/ÜŒ/Ü…/Ü~/Üw/Üp/Üi/Üb/Ü[/ÜT/ÜM/ÜF/Ü?/Ü8/Ü1/Ü*/Ü#/Ü/Ü/Ü/Ü/Ü/Üù.Üò.Üë.Üä.ÜÝ.ÜÖ.ÜÏ.ÜÈ.ÜÁ.ܺ.ܳ.ܬ.Ü¥.Üž.Ü—.Ü.܉.Ü‚.Ü{.Üt.Üm.Üf.Ü_.ÜX.ÜQ.ÜJ.ÜC.Ü<.Ü5.Ü..Ü'.Ü .Ü.Ü.Ü .Ü.Üý-Üö-Üï-Üè-Üá-ÜÚ-ÜÓ-ÜÌ-ÜÅ-ܾ-Ü·-ܰ-Ü©-Ü¢-Ü›-Ü”-Ü-܆-Ü-Üx-Üq-Üj-Üc-Ü\-ÜU-ÜN-ÜG-Ü@-Ü9-Ü2-Ü+-Ü$-Ü-Ü-Ü-Ü-Ü-Üú,Üó,Üì,Üå,ÜÞ,Ü×,ÜÐ,ÜÉ,ÜÂ,Ü»,Ü´,Ü­,ܦ,ÜŸ,ܘ,Ü‘,ÜŠ,܃,Ü|,Üu,Ün,Üg,Ü`,ÜY,ÜR,ÜK,ÜD,Ü=,Ü6,Ü/,Ü(,Ü!,Ü,Ü,Ü ,Ü,Üþ+Ü÷+Üð+Üé+Üâ+ÜÛ+ÜÔ+ÜÍ+ÜÆ+Ü¿+ܸ+ܱ+ܪ+Ü£+Üœ+Ü•+ÜŽ+܇+Ü€+Üy+Ür+Ük+Üd+Ü]+ÜV+ÜO+ÜH+ÜA+Ü:+Ü3+Ü,+Ü%+Ü+Ü+Ü+Ü +Ü+Üû*Üô*Üí*Üæ*Üß*ÜØ*ÜÑ*ÜÊ*ÜÃ*ܼ*ܵ*Ü®*ܧ*Ü *Ü™*Ü’*Ü‹*Ü„*Ü}*Üv*Üo*Üh*Üa*ÜZ*ÜS*ÜL*ÜE*Ü>*Ü7*Ü0*Ü)*Ü"*Ü*Ü*Ü *Ü*Üÿ)Üø)Üñ)Üê)Üã)ÜÜ)ÜÕ)ÜÎ)ÜÇ)ÜÀ)ܹ)ܲ)Ü«)ܤ)Ü)Ü–)Ü)܈)Ü)Üz)Üs)Ül)Üe)Ü^)ÜW)ÜP)ÜI)ÜB)Ü;)Ü4)Ü-)Ü&)Ü)Ü)Ü)Ü )Ü)Üü(Üõ(Üî(Üç(Üà(ÜÙ(ÜÒ(ÜË(ÜÄ(ܽ(ܶ(ܯ(ܨ(Ü¡(Üš(Ü“(ÜŒ(Ü…(Ü~(Üw(Üp(Üi(Üb(Ü[(ÜT(ÜM(ÜF(Ü?(Ü8(Ü1(Ü*(Ü#(Ü(Ü(Ü(Ü(Ü(Üù'Üò'Üë'Üä'ÜÝ'ÜÖ'ÜÏ'ÜÈ'ÜÁ'ܺ'ܳ'ܬ'Ü¥'Üž'Ü—'Ü'܉'Ü‚'Ü{'Üt'Üm'Üf'Ü_'ÜX'ÜQ'ÜJ'ÜC'Ü<'Ü5'Ü.'Ü''Ü 'Ü'Ü'Ü 'Ü'Üý&Üö&Üï&Üè&Üá&ÜÚ&ÜÓ&ÜÌ&ÜÅ&ܾ&Ü·&ܰ&Ü©&Ü¢&Ü›&Ü”&Ü&܆&Ü&Üx&Üq&Üj&Üc&Ü\&ÜU&ÜN&ÜG&Ü@&Ü9&Ü2&Ü+&Ü$&Ü&Ü&Ü&Ü&Ü&Üú%Üó%Üì%Üå%ÜÞ%Ü×%ÜÐ%ÜÉ%ÜÂ%Ü»%Ü´%Ü­%ܦ%ÜŸ%ܘ%Ü‘%ÜŠ%܃%Ü|%Üu%Ün%Üg%Ü`%ÜY%ÜR%ÜK%ÜD%Ü=%Ü6%Ü/%Ü(%Ü!%Ü%Ü%Ü %Ü%Üþ$Ü÷$Üð$Üé$Üâ$ÜÛ$ÜÔ$ÜÍ$ÜÆ$Ü¿$ܸ$ܱ$ܪ$Ü£$Üœ$Ü•$ÜŽ$܇$Ü€$Üy$Ür$Ük$Üd$Ü]$ÜV$ÜO$ÜH$ÜA$Ü:$Ü3$Ü,$Ü%$Ü$Ü$Ü$Ü $Ü$Üû#Üô#Üí#Üæ#Üß#ÜØ#ÜÑ#ÜÊ#ÜÃ#ܼ#ܵ#Ü®#ܧ#Ü #Ü™#Ü’#Ü‹#Ü„#Ü}#Üv#Üo#Üh#Üa#ÜZ#ÜS#ÜL#ÜE#Ü>#Ü7#Ü0#Ü)#Ü"#Ü#Ü#Ü #Ü#Üÿ"Üø"Üñ"Üê"Üã"ÜÜ"ÜÕ"ÜÎ"ÜÇ"ÜÀ"ܹ"ܲ"Ü«"ܤ"Ü"Ü–"Ü"܈"Ü"Üz"Üs"Ül"Üe"Ü^"ÜW"ÜP"ÜI"ÜB"Ü;"Ü4"Ü-"Ü&"Ü"Ü"Ü"Ü "Ü"Üü!Üõ!Üî!Üç!Üà!ÜÙ!ÜÒ!ÜË!ÜÄ!ܽ!ܶ!ܯ!ܨ!Ü¡!Üš!Ü“!ÜŒ!Ü…!Ü~!Üw!Üp!Üi!Üb!Ü[!ÜT!ÜM!ÜF!Ü?!Ü8!Ü1!Ü*!Ü#!Ü!Ü!Ü!Ü!Ü!Üù Üò Üë Üä ÜÝ ÜÖ ÜÏ ÜÈ ÜÁ ܺ ܳ ܬ Ü¥ Üž Ü— Ü Ü‰ Ü‚ Ü{ Üt Üm Üf Ü_ ÜX ÜQ ÜJ ÜC Ü< Ü5 Ü. Ü' Ü Ü Ü Ü Ü ÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿ Üø Üñ Üê Üã ÜÜ ÜÕ ÜÎ ÜÇ ÜÀ ܹ ܲ Ü« ܤ Ü Ü– Ü Üˆ Ü Üz Üs Ül Üe Ü^ ÜW ÜP ÜI ÜB Ü; Ü4 Ü- Ü& Ü Ü Ü Ü Ü Üü Üõ Üî Üç Üà ÜÙ ÜÒ ÜË ÜÄ Ü½ ܶ ܯ ܨ Ü¡ Üš Ü“ ÜŒ Ü… Ü~ Üw Üp Üi Üb Ü[ ÜT ÜM ÜF Ü? Ü8 Ü1 Ü* Ü# Ü Ü Ü Ü Ü Üù Üò Üë Üä ÜÝ ÜÖ ÜÏ ÜÈ ÜÁ ܺ ܳ ܬ Ü¥ Üž Ü— Ü Ü‰ Ü‚ Ü{ Üt Üm Üf Ü_ ÜX ÜQ ÜJ ÜC Ü< Ü5 Ü. Ü' Ü Ü Ü Ü Ü Üý Üö Üï Üè Üá ÜÚ ÜÓ ÜÌ ÜŠܾ Ü· ܰ Ü© Ü¢ Ü› Ü” Ü Ü† Ü Üx Üq Üj Üc Ü\ ÜU ÜN ÜG Ü@ Ü9 Ü2 Ü+ Ü$ Ü Ü Ü Ü Ü Üú Üó Üì Üå ÜÞ Ü× ÜÐ ÜÉ Ü Ü» Ü´ Ü­ ܦ ÜŸ ܘ Ü‘ ÜŠ ܃ Ü| Üu Ün Üg Ü` ÜY ÜR ÜK ÜD Ü= Ü6 Ü/ Ü( Ü! Ü Ü Ü Ü ÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÿÛøÿÛñÿÛêÿÛãÿÛÜÿÛÕÿÛÎÿÛÇÿÛÀÿÛ¹ÿÛ²ÿÛ«ÿÛ¤ÿÛÿÛ–ÿÛÿÛˆÿÛÿÛzÿÛsÿÛlÿÛeÿÛ^ÿÛWÿÛPÿÛIÿÛBÿÛ;ÿÛ4ÿÛ-ÿÛ&ÿÛÿÛÿÛÿÛ ÿÛÿÛüþÛõþÛîþÛçþÛàþÛÙþÛÒþÛËþÛÄþÛ½þÛ¶þÛ¯þÛ¨þÛ¡þÛšþÛ“þÛŒþÛ…þÛ~þÛwþÛpþÛiþÛbþÛ[þÛTþÛMþÛFþÛ?þÛ8þÛ1þÛ*þÛ#þÛþÛþÛþÛþÛþÛùýÛòýÛëýÛäýÛÝýÛÖýÛÏýÛÈýÛÁýÛºýÛ³ýÛ¬ýÛ¥ýÛžýÛ—ýÛýÛ‰ýÛ‚ýÛ{ýÛtýÛmýÛfýÛ_ýÛXýÛQýÛJýÛCýÛ<ýÛ5ýÛ.ýÛ'ýÛ ýÛýÛýÛ ýÛýÛýüÛöüÛïüÛèüÛáüÛÚüÛÓüÛÌüÛÅüÛ¾üÛ·üÛ°üÛ©üÛ¢üÛ›üÛ”üÛüÛ†üÛüÛxüÛqüÛjüÛcüÛ\üÛUüÛNüÛGüÛ@üÛ9üÛ2üÛ+üÛ$üÛüÛüÛüÛüÛüÛúûÛóûÛìûÛåûÛÞûÛ×ûÛÐûÛÉûÛÂûÛ»ûÛ´ûÛ­ûÛ¦ûÛŸûÛ˜ûÛ‘ûÛŠûÛƒûÛ|ûÛuûÛnûÛgûÛ`ûÛYûÛRûÛKûÛDûÛ=ûÛ6ûÛ/ûÛ(ûÛ!ûÛûÛûÛ ûÛûÛþúÛ÷úÛðúÛéúÛâúÛÛúÛÔúÛÍúÛÆúÛ¿úÛ¸úÛ±úÛªúÛ£úÛœúÛ•úÛŽúÛ‡úÛ€úÛyúÛrúÛkúÛdúÛ]úÛVúÛOúÛHúÛAúÛ:úÛ3úÛ,úÛ%úÛúÛúÛúÛ úÛúÛûùÛôùÛíùÛæùÛßùÛØùÛÑùÛÊùÛÃùÛ¼ùÛµùÛ®ùÛ§ùÛ ùÛ™ùÛ’ùÛ‹ùÛ„ùÛ}ùÛvùÛoùÛhùÛaùÛZùÛSùÛLùÛEùÛ>ùÛ7ùÛ0ùÛ)ùÛ"ùÛùÛùÛ ùÛùÛÿøÛøøÛñøÛêøÛãøÛÜøÛÕøÛÎøÛÇøÛÀøÛ¹øÛ²øÛ«øÛ¤øÛøÛ–øÛøÛˆøÛøÛzøÛsøÛløÛeøÛ^øÛWøÛPøÛIøÛBøÛ;øÛ4øÛ-øÛ&øÛøÛøÛøÛ øÛøÛü÷Ûõ÷Ûî÷Ûç÷Ûà÷ÛÙ÷ÛÒ÷ÛË÷ÛÄ÷Û½÷Û¶÷Û¯÷Û¨÷Û¡÷Ûš÷Û“÷ÛŒ÷Û…÷Û~÷Ûw÷Ûp÷Ûi÷Ûb÷Û[÷ÛT÷ÛM÷ÛF÷Û?÷Û8÷Û1÷Û*÷Û#÷Û÷Û÷Û÷Û÷Û÷ÛùöÛòöÛëöÛäöÛÝöÛÖöÛÏöÛÈöÛÁöÛºöÛ³öÛ¬öÛ¥öÛžöÛ—öÛöÛ‰öÛ‚öÛ{öÛtöÛmöÛföÛ_öÛXöÛQöÛJöÛCöÛ<öÛ5öÛ.öÛ'öÛ öÛöÛöÛ öÛöÛýõÛöõÛïõÛèõÛáõÛÚõÛÓõÛÌõÛÅõÛ¾õÛ·õÛ°õÛ©õÛ¢õÛ›õÛ”õÛõÛ†õÛõÛxõÛqõÛjõÛcõÛ\õÛUõÛNõÛGõÛ@õÛ9õÛ2õÛ+õÛ$õÛõÛõÛõÛõÛõÛúôÛóôÛìôÛåôÛÞôÛ×ôÛÐôÛÉôÛÂôÛ»ôÛ´ôÛ­ôÛ¦ôÛŸôÛ˜ôÛ‘ôÛŠôÛƒôÛ|ôÛuôÛnôÛgôÛ`ôÛYôÛRôÛKôÛDôÛ=ôÛ6ôÛ/ôÛ(ôÛ!ôÛôÛôÛ ôÛôÛþóÛ÷óÛðóÛéóÛâóÛÛóÛÔóÛÍóÛÆóÛ¿óÛ¸óÛ±óÛªóÛ£óÛœóÛ•óÛŽóÛ‡óÛ€óÛyóÛróÛkóÛdóÛ]óÛVóÛOóÛHóÛAóÛ:óÛ3óÛ,óÛ%óÛóÛóÛóÛ óÛóÛûòÛôòÛíòÛæòÛßòÛØòÛÑòÛÊòÛÃòÛ¼òÛµòÛ®òÛ§òÛ òÛ™òÛ’òÛ‹òÛ„òÛ}òÛvòÛoòÛhòÛaòÛZòÛSòÛLòÛEòÛ>òÛ7òÛ0òÛ)òÛ"òÛòÛòÛ òÛòÛÿñÛøñÛññÛêñÛãñÛÜñÛÕñÛÎñÛÇñÛÀñÛ¹ñÛ²ñÛ«ñÛ¤ñÛñÛ–ñÛñÛˆñÛñÛzñÛsñÛlñÛeñÛ^ñÛWñÛPñÛIñÛBñÛ;ñÛ4ñÛ-ñÛ&ñÛñÛñÛñÛ ñÛñÛüðÛõðÛîðÛçðÛàðÛÙðÛÒðÛËðÛÄðÛ½ðÛ¶ðÛ¯ðÛ¨ðÛ¡ðÛšðÛ“ðÛŒðÛ…ðÛ~ðÛwðÛpðÛiðÛbðÛ[ðÛTðÛMðÛFðÛ?ðÛ8ðÛ1ðÛ*ðÛ#ðÛðÛðÛðÛðÛðÛùïÛòïÛëïÛäïÛÝïÛÖïÛÏïÛÈïÛÁïÛºïÛ³ïÛ¬ïÛ¥ïÛžïÛ—ïÛïÛ‰ïÛ‚ïÛ{ïÛtïÛmïÛfïÛ_ïÛXïÛQïÛJïÛCïÛ<ïÛ5ïÛ.ïÛ'ïÛ ïÛïÛïÛ ïÛïÛýîÛöîÛïîÛèîÛáîÛÚîÛÓîÛÌîÛÅîÛ¾îÛ·îÛ°îÛ©îÛ¢îÛ›îÛ”îÛîÛ†îÛîÛxîÛqîÛjîÛcîÛ\îÛUîÛNîÛGîÛ@îÛ9îÛ2îÛ+îÛ$îÛîÛîÛîÛîÛîÛúíÛóíÛìíÛåíÛÞíÛ×íÛÐíÛÉíÛÂíÛ»íÛ´íÛ­íÛ¦íÛŸíÛ˜íÛ‘íÛŠíÛƒíÛ|íÛuíÛníÛgíÛ`íÛYíÛRíÛKíÛDíÛ=íÛ6íÛ/íÛ(íÛ!íÛíÛíÛ íÛíÛþìÛ÷ìÛðìÛéìÛâìÛÛìÛÔìÛÍìÛÆìÛ¿ìÛ¸ìÛ±ìÛªìÛ£ìÛœìÛ•ìÛŽìÛ‡ìÛ€ìÛyìÛrìÛkìÛdìÛ]ìÛVìÛOìÛHìÛAìÛ:ìÛ3ìÛ,ìÛ%ìÛìÛìÛìÛ ìÛìÛûëÛôëÛíëÛæëÛßëÛØëÛÑëÛÊëÛÃëÛ¼ëÛµëÛ®ëÛ§ëÛ ëÛ™ëÛ’ëÛ‹ëÛ„ëÛ}ëÛvëÛoëÛhëÛaëÛZëÛSëÛLëÛEëÛ>ëÛ7ëÛ0ëÛ)ëÛ"ëÛëÛëÛ ëÛëÛÿêÛøêÛñêÛêêÛãêÛÜêÛÕêÛÎêÛÇêÛÀêÛ¹êÛ²êÛ«êÛ¤êÛêÛ–êÛêÛˆêÛêÛzêÛsêÛlêÛeêÛ^êÛWêÛPêÛIêÛBêÛ;êÛ4êÛ-êÛ&êÛêÛêÛêÛ êÛêÛüéÛõéÛîéÛçéÛàéÛÙéÛÒéÛËéÛÄéÛ½éÛ¶éÛ¯éÛ¨éÛ¡éÛšéÛ“éÛŒéÛ…éÛ~éÛwéÛpéÛiéÛbéÛ[éÛTéÛMéÛFéÛ?éÛ8éÛ1éÛ*éÛ#éÛéÛéÛéÛéÛéÛùèÛòèÛëèÛäèÛÝèÛÖèÛÏèÛÈèÛÁèÛºèÛ³èÛ¬èÛ¥èÛžèÛ—èÛèÛ‰èÛ‚èÛ{èÛtèÛmèÛfèÛ_èÛXèÛQèÛJèÛCèÛ<èÛ5èÛ.èÛ'èÛ èÛèÛèÛ èÛèÛýçÛöçÛïçÛèçÛáçÛÚçÛÓçÛÌçÛÅçÛ¾çÛ·çÛ°çÛ©çÛ¢çÛ›çÛ”çÛçÛ†çÛçÛxçÛqçÛjçÛcçÛ\çÛUçÛNçÛGçÛ@çÛ9çÛ2çÛ+çÛ$çÛçÛçÛçÛçÛçÛúæÛóæÛìæÛåæÛÞæÛ׿ÛÐæÛÉæÛÂæÛ»æÛ´æÛ­æÛ¦æÛŸæÛ˜æÛ‘æÛŠæÛƒæÛ|æÛuæÛnæÛgæÛ`æÛYæÛRæÛKæÛDæÛ=æÛ6æÛ/æÛ(æÛ!æÛæÛæÛ æÛæÛþåÛ÷åÛðåÛéåÛâåÛÛåÛÔåÛÍåÛÆåÛ¿åÛ¸åÛ±åÛªåÛ£åÛœåÛ•åÛŽåÛ‡åÛ€åÛyåÛråÛkåÛdåÛ]åÛVåÛOåÛHåÛAåÛ:åÛ3åÛ,åÛ%åÛåÛåÛåÛ åÛåÛûäÛôäÛíäÛæäÛßäÛØäÛÑäÛÊäÛÃäÛ¼äÛµäÛ®äÛ§äÛ äÛ™äÛ’äÛ‹äÛ„äÛ}äÛväÛoäÛhäÛaäÛZäÛSäÛLäÛEäÛ>äÛ7äÛ0äÛ)äÛ"äÛäÛäÛ äÛäÛÿãÛøãÛñãÛêãÛããÛÜãÛÕãÛÎãÛÇãÛÀãÛ¹ãÛ²ãÛ«ãÛ¤ãÛãÛ–ãÛãÛˆãÛãÛzãÛsãÛlãÛeãÛ^ãÛWãÛPãÛIãÛBãÛ;ãÛ4ãÛ-ãÛ&ãÛãÛãÛãÛ ãÛãÛüâÛõâÛîâÛçâÛàâÛÙâÛÒâÛËâÛÄâÛ½âÛ¶âÛ¯âÛ¨âÛ¡âÛšâÛ“âÛŒâÛ…âÛ~âÛwâÛpâÛiâÛbâÛ[âÛTâÛMâÛFâÛ?âÛ8âÛ1âÛ*âÛ#âÛâÛâÛâÛâÛâÛùáÛòáÛëáÛäáÛÝáÛÖáÛÏáÛÈáÛÁáÛºáÛ³áÛ¬áÛ¥áÛžáÛ—áÛáÛ‰áÛ‚áÛ{áÛtáÛmáÛfáÛ_áÛXáÛQáÛJáÛCáÛ<áÛ5áÛ.áÛ'áÛ áÛáÛáÛ áÛáÛýàÛöàÛïàÛèàÛáàÛÚàÛÓàÛÌàÛÅàÛ¾àÛ·àÛ°àÛ©àÛ¢àÛ›àÛ”àÛàÛ†àÛàÛxàÛqàÛjàÛcàÛ\àÛUàÛNàÛGàÛ@àÛ9àÛ2àÛ+àÛ$àÛàÛàÛàÛàÛàÛúßÛóßÛìßÛåßÛÞßÛ×ßÛÐßÛÉßÛÂßÛ»ßÛ´ßÛ­ßÛ¦ßÛŸßÛ˜ßÛ‘ßÛŠßÛƒßÛ|ßÛußÛnßÛgßÛ`ßÛYßÛRßÛKßÛDßÛ=ßÛ6ßÛ/ßÛ(ßÛ!ßÛßÛßÛ ßÛßÛþÞÛ÷ÞÛðÞÛéÞÛâÞÛÛÞÛÔÞÛÍÞÛÆÞÛ¿ÞÛ¸ÞÛ±ÞÛªÞÛ£ÞÛœÞÛ•ÞÛŽÞÛ‡ÞÛ€ÞÛyÞÛrÞÛkÞÛdÞÛ]ÞÛVÞÛOÞÛHÞÛAÞÛ:ÞÛ3ÞÛ,ÞÛ%ÞÛÞÛÞÛÞÛ ÞÛÞÛûÝÛôÝÛíÝÛæÝÛßÝÛØÝÛÑÝÛÊÝÛÃÝÛ¼ÝÛµÝÛ®ÝÛ§ÝÛ ÝÛ™ÝÛ’ÝÛ‹ÝÛ„ÝÛ}ÝÛvÝÛoÝÛhÝÛaÝÛZÝÛSÝÛLÝÛEÝÛ>ÝÛ7ÝÛ0ÝÛ)ÝÛ"ÝÛÝÛÝÛ ÝÛÝÛÿÜÛøÜÛñÜÛêÜÛãÜÛÜÜÛÕÜÛÎÜÛÇÜÛÀÜÛ¹ÜÛ²ÜÛ«ÜÛ¤ÜÛÜÛ–ÜÛÜÛˆÜÛÜÛzÜÛsÜÛlÜÛeÜÛ^ÜÛWÜÛPÜÛIÜÛBÜÛ;ÜÛ4ÜÛ-ÜÛ&ÜÛÜÛÜÛÜÛ ÜÛÜÛüÛÛõÛÛîÛÛçÛÛàÛÛÙÛÛÒÛÛËÛÛÄÛÛ½ÛÛ¶ÛÛ¯ÛÛ¨ÛÛ¡ÛÛšÛÛ“ÛÛŒÛÛ…ÛÛ~ÛÛwÛÛpÛÛiÛÛbÛÛ[ÛÛTÛÛMÛÛFÛÛ?ÛÛ8ÛÛ1ÛÛ*ÛÛ#ÛÛÛÛÛÛÛÛÛÛÛÛùÚÛòÚÛëÚÛäÚÛÝÚÛÖÚÛÏÚÛÈÚÛÁÚÛºÚÛ³ÚÛ¬ÚÛ¥ÚÛžÚÛ—ÚÛÚÛ‰ÚÛ‚ÚÛ{ÚÛtÚÛmÚÛfÚÛ_ÚÛXÚÛQÚÛJÚÛCÚÛ<ÚÛ5ÚÛ.ÚÛ'ÚÛ ÚÛÚÛÚÛ ÚÛÚÛýÙÛöÙÛïÙÛèÙÛáÙÛÚÙÛÓÙÛÌÙÛÅÙÛ¾ÙÛ·ÙÛ°ÙÛ©ÙÛ¢ÙÛ›ÙÛ”ÙÛÙÛ†ÙÛÙÛxÙÛqÙÛjÙÛcÙÛ\ÙÛUÙÛNÙÛGÙÛ@ÙÛ9ÙÛ2ÙÛ+ÙÛ$ÙÛÙÛÙÛÙÛÙÛÙÛúØÛóØÛìØÛåØÛÞØÛרÛÐØÛÉØÛÂØÛ»ØÛ´ØÛ­ØÛ¦ØÛŸØÛ˜ØÛ‘ØÛŠØÛƒØÛ|ØÛuØÛnØÛgØÛ`ØÛYØÛRØÛKØÛDØÛ=ØÛ6ØÛ/ØÛ(ØÛ!ØÛØÛØÛ ØÛØÛþ×Û÷×Ûð×Ûé×Ûâ×ÛÛ×ÛÔ×ÛÍ×ÛÆ×Û¿×Û¸×Û±×Ûª×Û£×Ûœ×Û•×ÛŽ×Û‡×Û€×Ûy×Ûr×Ûk×Ûd×Û]×ÛV×ÛO×ÛH×ÛA×Û:×Û3×Û,×Û%×Û×Û×Û×Û ×Û×ÛûÖÛôÖÛíÖÛæÖÛßÖÛØÖÛÑÖÛÊÖÛÃÖÛ¼ÖÛµÖÛ®ÖÛ§ÖÛ ÖÛ™ÖÛ’ÖÛ‹ÖÛ„ÖÛ}ÖÛvÖÛoÖÛhÖÛaÖÛZÖÛSÖÛLÖÛEÖÛ>ÖÛ7ÖÛ0ÖÛ)ÖÛ"ÖÛÖÛÖÛ ÖÛÖÛÿÕÛøÕÛñÕÛêÕÛãÕÛÜÕÛÕÕÛÎÕÛÇÕÛÀÕÛ¹ÕÛ²ÕÛ«ÕÛ¤ÕÛÕÛ–ÕÛÕÛˆÕÛÕÛzÕÛsÕÛlÕÛeÕÛ^ÕÛWÕÛPÕÛIÕÛBÕÛ;ÕÛ4ÕÛ-ÕÛ&ÕÛÕÛÕÛÕÛ ÕÛÕÛüÔÛõÔÛîÔÛçÔÛàÔÛÙÔÛÒÔÛËÔÛÄÔÛ½ÔÛ¶ÔÛ¯ÔÛ¨ÔÛ¡ÔÛšÔÛ“ÔÛŒÔÛ…ÔÛ~ÔÛwÔÛpÔÛiÔÛbÔÛ[ÔÛTÔÛMÔÛFÔÛ?ÔÛ8ÔÛ1ÔÛ*ÔÛ#ÔÛÔÛÔÛÔÛÔÛÔÛùÓÛòÓÛëÓÛäÓÛÝÓÛÖÓÛÏÓÛÈÓÛÁÓÛºÓÛ³ÓÛ¬ÓÛ¥ÓÛžÓÛ—ÓÛÓÛ‰ÓÛ‚ÓÛ{ÓÛtÓÛmÓÛfÓÛ_ÓÛXÓÛQÓÛJÓÛCÓÛ<ÓÛ5ÓÛ.ÓÛ'ÓÛ ÓÛÓÛÓÛ ÓÛÓÛýÒÛöÒÛïÒÛèÒÛáÒÛÚÒÛÓÒÛÌÒÛÅÒÛ¾ÒÛ·ÒÛ°ÒÛ©ÒÛ¢ÒÛ›ÒÛ”ÒÛÒÛ†ÒÛÒÛxÒÛqÒÛjÒÛcÒÛ\ÒÛUÒÛNÒÛGÒÛ@ÒÛ9ÒÛ2ÒÛ+ÒÛ$ÒÛÒÛÒÛÒÛÒÛÒÛúÑÛóÑÛìÑÛåÑÛÞÑÛ×ÑÛÐÑÛÉÑÛÂÑÛ»ÑÛ´ÑÛ­ÑÛ¦ÑÛŸÑÛ˜ÑÛ‘ÑÛŠÑÛƒÑÛ|ÑÛuÑÛnÑÛgÑÛ`ÑÛYÑÛRÑÛKÑÛDÑÛ=ÑÛ6ÑÛ/ÑÛ(ÑÛ!ÑÛÑÛÑÛ ÑÛÑÛþÐÛ÷ÐÛðÐÛéÐÛâÐÛÛÐÛÔÐÛÍÐÛÆÐÛ¿ÐÛ¸ÐÛ±ÐÛªÐÛ£ÐÛœÐÛ•ÐÛŽÐÛ‡ÐÛ€ÐÛyÐÛrÐÛkÐÛdÐÛ]ÐÛVÐÛOÐÛHÐÛAÐÛ:ÐÛ3ÐÛ,ÐÛ%ÐÛÐÛÐÛÐÛ ÐÛÐÛûÏÛôÏÛíÏÛæÏÛßÏÛØÏÛÑÏÛÊÏÛÃÏÛ¼ÏÛµÏÛ®ÏÛ§ÏÛ ÏÛ™ÏÛ’ÏÛ‹ÏÛ„ÏÛ}ÏÛvÏÛoÏÛhÏÛaÏÛZÏÛSÏÛLÏÛEÏÛ>ÏÛ7ÏÛ0ÏÛ)ÏÛ"ÏÛÏÛÏÛ ÏÛÏÛÿÎÛøÎÛñÎÛêÎÛãÎÛÜÎÛÕÎÛÎÎÛÇÎÛÀÎÛ¹ÎÛ²ÎÛ«ÎÛ¤ÎÛÎÛ–ÎÛÎÛˆÎÛÎÛzÎÛsÎÛlÎÛeÎÛ^ÎÛWÎÛPÎÛIÎÛBÎÛ;ÎÛ4ÎÛ-ÎÛ&ÎÛÎÛÎÛÎÛ ÎÛÎÛüÍÛõÍÛîÍÛçÍÛàÍÛÙÍÛÒÍÛËÍÛÄÍÛ½ÍÛ¶ÍÛ¯ÍÛ¨ÍÛ¡ÍÛšÍÛ“ÍÛŒÍÛ…ÍÛ~ÍÛwÍÛpÍÛiÍÛbÍÛ[ÍÛTÍÛMÍÛFÍÛ?ÍÛ8ÍÛ1ÍÛ*ÍÛ#ÍÛÍÛÍÛÍÛÍÛÍÛùÌÛòÌÛëÌÛäÌÛÝÌÛÖÌÛÏÌÛÈÌÛÁÌÛºÌÛ³ÌÛ¬ÌÛ¥ÌÛžÌÛ—ÌÛÌÛ‰ÌÛ‚ÌÛ{ÌÛtÌÛmÌÛfÌÛ_ÌÛXÌÛQÌÛJÌÛCÌÛ<ÌÛ5ÌÛ.ÌÛ'ÌÛ ÌÛÌÛÌÛ ÌÛÌÛýËÛöËÛïËÛèËÛáËÛÚËÛÓËÛÌËÛÅËÛ¾ËÛ·ËÛ°ËÛ©ËÛ¢ËÛ›ËÛ”ËÛËÛ†ËÛËÛxËÛqËÛjËÛcËÛ\ËÛUËÛNËÛGËÛ@ËÛ9ËÛ2ËÛ+ËÛ$ËÛËÛËÛËÛËÛËÛúÊÛóÊÛìÊÛåÊÛÞÊÛ×ÊÛÐÊÛÉÊÛÂÊÛ»ÊÛ´ÊÛ­ÊÛ¦ÊÛŸÊÛ˜ÊÛ‘ÊÛŠÊÛƒÊÛ|ÊÛuÊÛnÊÛgÊÛ`ÊÛYÊÛRÊÛKÊÛDÊÛ=ÊÛ6ÊÛ/ÊÛ(ÊÛ!ÊÛÊÛÊÛ ÊÛÊÛþÉÛ÷ÉÛðÉÛéÉÛâÉÛÛÉÛÔÉÛÍÉÛÆÉÛ¿ÉÛ¸ÉÛ±ÉÛªÉÛ£ÉÛœÉÛ•ÉÛŽÉÛ‡ÉÛ€ÉÛyÉÛrÉÛkÉÛdÉÛ]ÉÛVÉÛOÉÛHÉÛAÉÛ:ÉÛ3ÉÛ,ÉÛ%ÉÛÉÛÉÛÉÛ ÉÛÉÛûÈÛôÈÛíÈÛæÈÛßÈÛØÈÛÑÈÛÊÈÛÃÈÛ¼ÈÛµÈÛ®ÈÛ§ÈÛ ÈÛ™ÈÛ’ÈÛ‹ÈÛ„ÈÛ}ÈÛvÈÛoÈÛhÈÛaÈÛZÈÛSÈÛLÈÛEÈÛ>ÈÛ7ÈÛ0ÈÛ)ÈÛ"ÈÛÈÛÈÛ ÈÛÈÛÿÇÛøÇÛñÇÛêÇÛãÇÛÜÇÛÕÇÛÎÇÛÇÇÛÀÇÛ¹ÇÛ²ÇÛ«ÇÛ¤ÇÛÇÛ–ÇÛÇÛˆÇÛÇÛzÇÛsÇÛlÇÛeÇÛ^ÇÛWÇÛPÇÛIÇÛBÇÛ;ÇÛ4ÇÛ-ÇÛ&ÇÛÇÛÇÛÇÛ ÇÛÇÛüÆÛõÆÛîÆÛçÆÛàÆÛÙÆÛÒÆÛËÆÛÄÆÛ½ÆÛ¶ÆÛ¯ÆÛ¨ÆÛ¡ÆÛšÆÛ“ÆÛŒÆÛ…ÆÛ~ÆÛwÆÛpÆÛiÆÛbÆÛ[ÆÛTÆÛMÆÛFÆÛ?ÆÛ8ÆÛ1ÆÛ*ÆÛ#ÆÛÆÛÆÛÆÛÆÛÆÛùÅÛòÅÛëÅÛäÅÛÝÅÛÖÅÛÏÅÛÈÅÛÁÅÛºÅÛ³ÅÛ¬ÅÛ¥ÅÛžÅÛ—ÅÛÅÛ‰ÅÛ‚ÅÛ{ÅÛtÅÛmÅÛfÅÛ_ÅÛXÅÛQÅÛJÅÛCÅÛ<ÅÛ5ÅÛ.ÅÛ'ÅÛ ÅÛÅÛÅÛ ÅÛÅÛýÄÛöÄÛïÄÛèÄÛáÄÛÚÄÛÓÄÛÌÄÛÅÄÛ¾ÄÛ·ÄÛ°ÄÛ©ÄÛ¢ÄÛ›ÄÛ”ÄÛÄÛ†ÄÛÄÛxÄÛqÄÛjÄÛcÄÛ\ÄÛUÄÛNÄÛGÄÛ@ÄÛ9ÄÛ2ÄÛ+ÄÛ$ÄÛÄÛÄÛÄÛÄÛÄÛúÃÛóÃÛìÃÛåÃÛÞÃÛ×ÃÛÐÃÛÉÃÛÂÃÛ»ÃÛ´ÃÛ­ÃÛ¦ÃÛŸÃÛ˜ÃÛ‘ÃÛŠÃÛƒÃÛ|ÃÛuÃÛnÃÛgÃÛ`ÃÛYÃÛRÃÛKÃÛDÃÛ=ÃÛ6ÃÛ/ÃÛ(ÃÛ!ÃÛÃÛÃÛ ÃÛÃÛþÂÛ÷ÂÛðÂÛéÂÛâÂÛÛÂÛÔÂÛÍÂÛÆÂÛ¿ÂÛ¸ÂÛ±ÂÛªÂÛ£ÂÛœÂÛ•ÂÛŽÂÛ‡ÂÛ€ÂÛyÂÛrÂÛkÂÛdÂÛ]ÂÛVÂÛOÂÛHÂÛAÂÛ:ÂÛ3ÂÛ,ÂÛ%ÂÛÂÛÂÛÂÛ ÂÛÂÛûÁÛôÁÛíÁÛæÁÛßÁÛØÁÛÑÁÛÊÁÛÃÁÛ¼ÁÛµÁÛ®ÁÛ§ÁÛ ÁÛ™ÁÛ’ÁÛ‹ÁÛ„ÁÛ}ÁÛvÁÛoÁÛhÁÛaÁÛZÁÛSÁÛLÁÛEÁÛ>ÁÛ7ÁÛ0ÁÛ)ÁÛ"ÁÛÁÛÁÛ ÁÛÁÛÿÀÛøÀÛñÀÛêÀÛãÀÛÜÀÛÕÀÛÎÀÛÇÀÛÀÀÛ¹ÀÛ²ÀÛ«ÀÛ¤ÀÛÀÛ–ÀÛÀÛˆÀÛÀÛzÀÛsÀÛlÀÛeÀÛ^ÀÛWÀÛPÀÛIÀÛBÀÛ;ÀÛ4ÀÛ-ÀÛ&ÀÛÀÛÀÛÀÛ ÀÛÀÛü¿Ûõ¿Ûî¿Ûç¿Ûà¿ÛÙ¿ÛÒ¿ÛË¿ÛĿ۽¿Û¶¿Û¯¿Û¨¿Û¡¿Ûš¿Û“¿ÛŒ¿Û…¿Û~¿Ûw¿Ûp¿Ûi¿Ûb¿Û[¿ÛT¿ÛM¿ÛF¿Û?¿Û8¿Û1¿Û*¿Û#¿Û¿Û¿Û¿Û¿Û¿Ûù¾Ûò¾Ûë¾Ûä¾ÛݾÛÖ¾ÛϾÛȾÛÁ¾Ûº¾Û³¾Û¬¾Û¥¾Ûž¾Û—¾Û¾Û‰¾Û‚¾Û{¾Ût¾Ûm¾Ûf¾Û_¾ÛX¾ÛQ¾ÛJ¾ÛC¾Û<¾Û5¾Û.¾Û'¾Û ¾Û¾Û¾Û ¾Û¾Ûý½Ûö½Ûï½Ûè½Ûá½ÛÚ½ÛÓ½Û̽ÛŽÛ¾½Û·½Û°½Û©½Û¢½Û›½Û”½Û½Û†½Û½Ûx½Ûq½Ûj½Ûc½Û\½ÛU½ÛN½ÛG½Û@½Û9½Û2½Û+½Û$½Û½Û½Û½Û½Û½Ûú¼Ûó¼Ûì¼Ûå¼ÛÞ¼Û×¼ÛмÛɼÛ¼Û»¼Û´¼Û­¼Û¦¼ÛŸ¼Û˜¼Û‘¼ÛмÛƒ¼Û|¼Ûu¼Ûn¼Ûg¼Û`¼ÛY¼ÛR¼ÛK¼ÛD¼Û=¼Û6¼Û/¼Û(¼Û!¼Û¼Û¼Û ¼Û¼Ûþ»Û÷»Ûð»Ûé»Ûâ»ÛÛ»ÛÔ»ÛÍ»ÛÆ»Û¿»Û¸»Û±»Ûª»Û£»Ûœ»Û•»ÛŽ»Û‡»Û€»Ûy»Ûr»Ûk»Ûd»Û]»ÛV»ÛO»ÛH»ÛA»Û:»Û3»Û,»Û%»Û»Û»Û»Û »Û»ÛûºÛôºÛíºÛæºÛߺÛغÛѺÛʺÛúÛ¼ºÛµºÛ®ºÛ§ºÛ ºÛ™ºÛ’ºÛ‹ºÛ„ºÛ}ºÛvºÛoºÛhºÛaºÛZºÛSºÛLºÛEºÛ>ºÛ7ºÛ0ºÛ)ºÛ"ºÛºÛºÛ ºÛºÛÿ¹Ûø¹Ûñ¹Ûê¹Ûã¹ÛܹÛÕ¹ÛιÛǹÛÀ¹Û¹¹Û²¹Û«¹Û¤¹Û¹Û–¹Û¹Ûˆ¹Û¹Ûz¹Ûs¹Ûl¹Ûe¹Û^¹ÛW¹ÛP¹ÛI¹ÛB¹Û;¹Û4¹Û-¹Û&¹Û¹Û¹Û¹Û ¹Û¹Ûü¸Ûõ¸Ûî¸Ûç¸Ûà¸ÛÙ¸ÛÒ¸Û˸ÛĸÛ½¸Û¶¸Û¯¸Û¨¸Û¡¸Ûš¸Û“¸ÛŒ¸Û…¸Û~¸Ûw¸Ûp¸Ûi¸Ûb¸Û[¸ÛT¸ÛM¸ÛF¸Û?¸Û8¸Û1¸Û*¸Û#¸Û¸Û¸Û¸Û¸Û¸Ûù·Ûò·Ûë·Ûä·ÛÝ·ÛÖ·ÛÏ·ÛÈ·ÛÁ·Ûº·Û³·Û¬·Û¥·Ûž·Û—·Û·Û‰·Û‚·Û{·Ût·Ûm·Ûf·Û_·ÛX·ÛQ·ÛJ·ÛC·Û<·Û5·Û.·Û'·Û ·Û·Û·Û ·Û·Ûý¶Ûö¶Ûï¶Ûè¶Ûá¶ÛÚ¶ÛÓ¶Û̶ÛŶÛ¾¶Û·¶Û°¶Û©¶Û¢¶Û›¶Û”¶Û¶Û†¶Û¶Ûx¶Ûq¶Ûj¶Ûc¶Û\¶ÛU¶ÛN¶ÛG¶Û@¶Û9¶Û2¶Û+¶Û$¶Û¶Û¶Û¶Û¶Û¶ÛúµÛóµÛìµÛåµÛÞµÛ×µÛеÛɵÛµÛ»µÛ´µÛ­µÛ¦µÛŸµÛ˜µÛ‘µÛеÛƒµÛ|µÛuµÛnµÛgµÛ`µÛYµÛRµÛKµÛDµÛ=µÛ6µÛ/µÛ(µÛ!µÛµÛµÛ µÛµÛþ´Û÷´Ûð´Ûé´Ûâ´ÛÛ´ÛÔ´ÛÍ´ÛÆ´Û¿´Û¸´Û±´Ûª´Û£´Ûœ´Û•´ÛŽ´Û‡´Û€´Ûy´Ûr´Ûk´Ûd´Û]´ÛV´ÛO´ÛH´ÛA´Û:´Û3´Û,´Û%´Û´Û´Û´Û ´Û´Ûû³Ûô³Ûí³Ûæ³Ûß³ÛسÛѳÛʳÛóÛ¼³Ûµ³Û®³Û§³Û ³Û™³Û’³Û‹³Û„³Û}³Ûv³Ûo³Ûh³Ûa³ÛZ³ÛS³ÛL³ÛE³Û>³Û7³Û0³Û)³Û"³Û³Û³Û ³Û³Ûÿ²Ûø²Ûñ²Ûê²Ûã²ÛܲÛÕ²ÛβÛDzÛÀ²Û¹²Û²²Û«²Û¤²Û²Û–²Û²Ûˆ²Û²Ûz²Ûs²Ûl²Ûe²Û^²ÛW²ÛP²ÛI²ÛB²Û;²Û4²Û-²Û&²Û²Û²Û²Û ²Û²Ûü±Ûõ±Ûî±Ûç±Ûà±ÛÙ±ÛÒ±Û˱ÛıÛ½±Û¶±Û¯±Û¨±Û¡±Ûš±Û“±ÛŒ±Û…±Û~±Ûw±Ûp±Ûi±Ûb±Û[±ÛT±ÛM±ÛF±Û?±Û8±Û1±Û*±Û#±Û±Û±Û±Û±Û±Ûù°Ûò°Ûë°Ûä°ÛݰÛÖ°ÛϰÛȰÛÁ°Ûº°Û³°Û¬°Û¥°Ûž°Û—°Û°Û‰°Û‚°Û{°Ût°Ûm°Ûf°Û_°ÛX°ÛQ°ÛJ°ÛC°Û<°Û5°Û.°Û'°Û °Û°Û°Û °Û°Ûý¯Ûö¯Ûï¯Ûè¯Ûá¯ÛÚ¯ÛÓ¯Û̯ÛůÛ¾¯Û·¯Û°¯Û©¯Û¢¯Û›¯Û”¯Û¯Û†¯Û¯Ûx¯Ûq¯Ûj¯Ûc¯Û\¯ÛU¯ÛN¯ÛG¯Û@¯Û9¯Û2¯Û+¯Û$¯Û¯Û¯Û¯Û¯Û¯Ûú®Ûó®Ûì®Ûå®ÛÞ®Û×®ÛЮÛɮۮۻ®Û´®Û­®Û¦®ÛŸ®Û˜®Û‘®ÛŠ®Ûƒ®Û|®Ûu®Ûn®Ûg®Û`®ÛY®ÛR®ÛK®ÛD®Û=®Û6®Û/®Û(®Û!®Û®Û®Û ®Û®Ûþ­Û÷­Ûð­Ûé­Ûâ­ÛÛ­ÛÔ­ÛÍ­ÛÆ­Û¿­Û¸­Û±­Ûª­Û£­Ûœ­Û•­ÛŽ­Û‡­Û€­Ûy­Ûr­Ûk­Ûd­Û]­ÛV­ÛO­ÛH­ÛA­Û:­Û3­Û,­Û%­Û­Û­Û­Û ­Û­Ûû¬Ûô¬Ûí¬Ûæ¬Û߬ÛجÛѬÛʬÛìÛ¼¬Ûµ¬Û®¬Û§¬Û ¬Û™¬Û’¬Û‹¬Û„¬Û}¬Ûv¬Ûo¬Ûh¬Ûa¬ÛZ¬ÛS¬ÛL¬ÛE¬Û>¬Û7¬Û0¬Û)¬Û"¬Û¬Û¬Û ¬Û¬Ûÿ«Ûø«Ûñ«Ûê«Ûã«ÛÜ«ÛÕ«ÛΫÛÇ«ÛÀ«Û¹«Û²«Û««Û¤«Û«Û–«Û«Ûˆ«Û«Ûz«Ûs«Ûl«Ûe«Û^«ÛW«ÛP«ÛI«ÛB«Û;«Û4«Û-«Û&«Û«Û«Û«Û «Û«ÛüªÛõªÛîªÛçªÛàªÛÙªÛÒªÛ˪ÛĪÛ½ªÛ¶ªÛ¯ªÛ¨ªÛ¡ªÛšªÛ“ªÛŒªÛ…ªÛ~ªÛwªÛpªÛiªÛbªÛ[ªÛTªÛMªÛFªÛ?ªÛ8ªÛ1ªÛ*ªÛ#ªÛªÛªÛªÛªÛªÛù©Ûò©Ûë©Ûä©ÛÝ©ÛÖ©ÛÏ©ÛÈ©ÛÁ©Ûº©Û³©Û¬©Û¥©Ûž©Û—©Û©Û‰©Û‚©Û{©Ût©Ûm©Ûf©Û_©ÛX©ÛQ©ÛJ©ÛC©Û<©Û5©Û.©Û'©Û ©Û©Û©Û ©Û©Ûý¨Ûö¨Ûï¨Ûè¨Ûá¨ÛÚ¨ÛÓ¨Ų̂ÛŨÛ¾¨Û·¨Û°¨Û©¨Û¢¨Û›¨Û”¨Û¨Û†¨Û¨Ûx¨Ûq¨Ûj¨Ûc¨Û\¨ÛU¨ÛN¨ÛG¨Û@¨Û9¨Û2¨Û+¨Û$¨Û¨Û¨Û¨Û¨Û¨Ûú§Ûó§Ûì§Ûå§ÛÞ§Û×§ÛЧÛɧÛ§Û»§Û´§Û­§Û¦§ÛŸ§Û˜§Û‘§ÛЧÛƒ§Û|§Ûu§Ûn§Ûg§Û`§ÛY§ÛR§ÛK§ÛD§Û=§Û6§Û/§Û(§Û!§Û§Û§Û §Û§Ûþ¦Û÷¦Ûð¦Ûé¦Ûâ¦ÛÛ¦ÛÔ¦ÛͦÛƦÛ¿¦Û¸¦Û±¦Ûª¦Û£¦Ûœ¦Û•¦ÛަÛ‡¦Û€¦Ûy¦Ûr¦Ûk¦Ûd¦Û]¦ÛV¦ÛO¦ÛH¦ÛA¦Û:¦Û3¦Û,¦Û%¦Û¦Û¦Û¦Û ¦Û¦Ûû¥Ûô¥Ûí¥Ûæ¥ÛߥÛØ¥ÛÑ¥ÛÊ¥ÛÃ¥Û¼¥Ûµ¥Û®¥Û§¥Û ¥Û™¥Û’¥Û‹¥Û„¥Û}¥Ûv¥Ûo¥Ûh¥Ûa¥ÛZ¥ÛS¥ÛL¥ÛE¥Û>¥Û7¥Û0¥Û)¥Û"¥Û¥Û¥Û ¥Û¥Ûÿ¤Ûø¤Ûñ¤Ûê¤Ûã¤ÛܤÛÕ¤ÛΤÛǤÛÀ¤Û¹¤Û²¤Û«¤Û¤¤Û¤Û–¤Û¤Ûˆ¤Û¤Ûz¤Ûs¤Ûl¤Ûe¤Û^¤ÛW¤ÛP¤ÛI¤ÛB¤Û;¤Û4¤Û-¤Û&¤Û¤Û¤Û¤Û ¤Û¤Ûü£Ûõ£Ûî£Ûç£Ûà£ÛÙ£ÛÒ£ÛË£ÛÄ£Û½£Û¶£Û¯£Û¨£Û¡£Ûš£Û“£ÛŒ£Û…£Û~£Ûw£Ûp£Ûi£Ûb£Û[£ÛT£ÛM£ÛF£Û?£Û8£Û1£Û*£Û#£Û£Û£Û£Û£Û£Ûù¢Ûò¢Ûë¢Ûä¢ÛÝ¢ÛÖ¢ÛÏ¢ÛÈ¢ÛÁ¢Ûº¢Û³¢Û¬¢Û¥¢Ûž¢Û—¢Û¢Û‰¢Û‚¢Û{¢Ût¢Ûm¢Ûf¢Û_¢ÛX¢ÛQ¢ÛJ¢ÛC¢Û<¢Û5¢Û.¢Û'¢Û ¢Û¢Û¢Û ¢Û¢Ûý¡Ûö¡Ûï¡Ûè¡Ûá¡ÛÚ¡ÛÓ¡Û̡ۚ۾¡Û·¡Û°¡Û©¡Û¢¡Û›¡Û”¡Û¡Û†¡Û¡Ûx¡Ûq¡Ûj¡Ûc¡Û\¡ÛU¡ÛN¡ÛG¡Û@¡Û9¡Û2¡Û+¡Û$¡Û¡Û¡Û¡Û¡Û¡Ûú Ûó Ûì Ûå ÛÞ Û× ÛРÛÉ Û Û» Û´ Û­ Û¦ ÛŸ Û˜ Û‘ ÛŠ Ûƒ Û| Ûu Ûn Ûg Û` ÛY ÛR ÛK ÛD Û= Û6 Û/ Û( Û! Û Û Û  Û ÛþŸÛ÷ŸÛðŸÛéŸÛâŸÛÛŸÛÔŸÛÍŸÛÆŸÛ¿ŸÛ¸ŸÛ±ŸÛªŸÛ£ŸÛœŸÛ•ŸÛŽŸÛ‡ŸÛ€ŸÛyŸÛrŸÛkŸÛdŸÛ]ŸÛVŸÛOŸÛHŸÛAŸÛ:ŸÛ3ŸÛ,ŸÛ%ŸÛŸÛŸÛŸÛ ŸÛŸÛûžÛôžÛížÛæžÛßžÛØžÛÑžÛÊžÛÞÛ¼žÛµžÛ®žÛ§žÛ žÛ™žÛ’žÛ‹žÛ„žÛ}žÛvžÛožÛhžÛažÛZžÛSžÛLžÛEžÛ>žÛ7žÛ0žÛ)žÛ"žÛžÛžÛ žÛžÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüœÛõœÛîœÛçœÛàœÛÙœÛÒœÛËœÛĜ۽œÛ¶œÛ¯œÛ¨œÛ¡œÛšœÛ“œÛŒœÛ…œÛ~œÛwœÛpœÛiœÛbœÛ[œÛTœÛMœÛFœÛ?œÛ8œÛ1œÛ*œÛ#œÛœÛœÛœÛœÛœÛù›Ûò›Ûë›Ûä›ÛÝ›ÛÖ›ÛÏ›ÛÈ›ÛÁ›Ûº›Û³›Û¬›Û¥›Ûž›Û—›Û›Û‰›Û‚›Û{›Ût›Ûm›Ûf›Û_›ÛX›ÛQ›ÛJ›ÛC›Û<›Û5›Û.›Û'›Û ›Û›Û›Û ›Û›ÛýšÛöšÛïšÛèšÛášÛÚšÛÓšÛÌšÛÅšÛ¾šÛ·šÛ°šÛ©šÛ¢šÛ›šÛ”šÛšÛ†šÛšÛxšÛqšÛjšÛcšÛ\šÛUšÛNšÛGšÛ@šÛ9šÛ2šÛ+šÛ$šÛšÛšÛšÛšÛšÛú™Ûó™Ûì™Ûå™ÛÞ™Û×™ÛЙÛəۙۻ™Û´™Û­™Û¦™ÛŸ™Û˜™Û‘™ÛŠ™Ûƒ™Û|™Ûu™Ûn™Ûg™Û`™ÛY™ÛR™ÛK™ÛD™Û=™Û6™Û/™Û(™Û!™Û™Û™Û ™Û™Ûþ˜Û÷˜Ûð˜Ûé˜Ûâ˜ÛÛ˜ÛÔ˜Û͘ÛƘÛ¿˜Û¸˜Û±˜Ûª˜Û£˜Ûœ˜Û•˜ÛŽ˜Û‡˜Û€˜Ûy˜Ûr˜Ûk˜Ûd˜Û]˜ÛV˜ÛO˜ÛH˜ÛA˜Û:˜Û3˜Û,˜Û%˜Û˜Û˜Û˜Û ˜Û˜Ûû—Ûô—Ûí—Ûæ—Ûß—ÛØ—ÛÑ—ÛÊ—Û×Û¼—Ûµ—Û®—Û§—Û —Û™—Û’—Û‹—Û„—Û}—Ûv—Ûo—Ûh—Ûa—ÛZ—ÛS—ÛL—ÛE—Û>—Û7—Û0—Û)—Û"—Û—Û—Û —Û—Ûÿ–Ûø–Ûñ–Ûê–Ûã–ÛÜ–ÛÕ–ÛΖÛÇ–ÛÀ–Û¹–Û²–Û«–Û¤–Û–Û––Û–Ûˆ–Û–Ûz–Ûs–Ûl–Ûe–Û^–ÛW–ÛP–ÛI–ÛB–Û;–Û4–Û-–Û&–Û–Û–Û–Û –Û–Ûü•Ûõ•Ûî•Ûç•Ûà•ÛÙ•ÛÒ•ÛË•Ûĕ۽•Û¶•Û¯•Û¨•Û¡•Ûš•Û“•ÛŒ•Û…•Û~•Ûw•Ûp•Ûi•Ûb•Û[•ÛT•ÛM•ÛF•Û?•Û8•Û1•Û*•Û#•Û•Û•Û•Û•Û•Ûù”Ûò”Ûë”Ûä”ÛÝ”ÛÖ”ÛÏ”ÛÈ”ÛÁ”Ûº”Û³”Û¬”Û¥”Ûž”Û—”Û”Û‰”Û‚”Û{”Ût”Ûm”Ûf”Û_”ÛX”ÛQ”ÛJ”ÛC”Û<”Û5”Û.”Û'”Û ”Û”Û”Û ”Û”Ûý“Ûö“Ûï“Ûè“Ûá“ÛÚ“ÛÓ“Û̓ۜ۾“Û·“Û°“Û©“Û¢“Û›“Û”“Û“Û†“Û“Ûx“Ûq“Ûj“Ûc“Û\“ÛU“ÛN“ÛG“Û@“Û9“Û2“Û+“Û$“Û“Û“Û“Û“Û“Ûú’Ûó’Ûì’Ûå’ÛÞ’Û×’ÛÐ’ÛÉ’ÛÂ’Û»’Û´’Û­’Û¦’ÛŸ’Û˜’Û‘’ÛŠ’Ûƒ’Û|’Ûu’Ûn’Ûg’Û`’ÛY’ÛR’ÛK’ÛD’Û=’Û6’Û/’Û(’Û!’Û’Û’Û ’Û’Ûþ‘Û÷‘Ûð‘Ûé‘Ûâ‘ÛÛ‘ÛÔ‘ÛÍ‘ÛÆ‘Û¿‘Û¸‘Û±‘Ûª‘Û£‘Ûœ‘Û•‘ÛŽ‘Û‡‘Û€‘Ûy‘Ûr‘Ûk‘Ûd‘Û]‘ÛV‘ÛO‘ÛH‘ÛA‘Û:‘Û3‘Û,‘Û%‘Û‘Û‘Û‘Û ‘Û‘ÛûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüŽÛõŽÛîŽÛçŽÛàŽÛÙŽÛÒŽÛËŽÛÄŽÛ½ŽÛ¶ŽÛ¯ŽÛ¨ŽÛ¡ŽÛšŽÛ“ŽÛŒŽÛ…ŽÛ~ŽÛwŽÛpŽÛiŽÛbŽÛ[ŽÛTŽÛMŽÛFŽÛ?ŽÛ8ŽÛ1ŽÛ*ŽÛ#ŽÛŽÛŽÛŽÛŽÛŽÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýŒÛöŒÛïŒÛèŒÛáŒÛÚŒÛÓŒÛÌŒÛŌ۾ŒÛ·ŒÛ°ŒÛ©ŒÛ¢ŒÛ›ŒÛ”ŒÛŒÛ†ŒÛŒÛxŒÛqŒÛjŒÛcŒÛ\ŒÛUŒÛNŒÛGŒÛ@ŒÛ9ŒÛ2ŒÛ+ŒÛ$ŒÛŒÛŒÛŒÛŒÛŒÛú‹Ûó‹Ûì‹Ûå‹ÛÞ‹Û׋ÛЋÛɋۋۻ‹Û´‹Û­‹Û¦‹ÛŸ‹Û˜‹Û‘‹ÛŠ‹Ûƒ‹Û|‹Ûu‹Ûn‹Ûg‹Û`‹ÛY‹ÛR‹ÛK‹ÛD‹Û=‹Û6‹Û/‹Û(‹Û!‹Û‹Û‹Û ‹Û‹ÛþŠÛ÷ŠÛðŠÛéŠÛâŠÛÛŠÛÔŠÛÍŠÛÆŠÛ¿ŠÛ¸ŠÛ±ŠÛªŠÛ£ŠÛœŠÛ•ŠÛŽŠÛ‡ŠÛ€ŠÛyŠÛrŠÛkŠÛdŠÛ]ŠÛVŠÛOŠÛHŠÛAŠÛ:ŠÛ3ŠÛ,ŠÛ%ŠÛŠÛŠÛŠÛ ŠÛŠÛû‰Ûô‰Ûí‰Ûæ‰Û߉Û؉ÛщÛʉÛÉÛ¼‰Ûµ‰Û®‰Û§‰Û ‰Û™‰Û’‰Û‹‰Û„‰Û}‰Ûv‰Ûo‰Ûh‰Ûa‰ÛZ‰ÛS‰ÛL‰ÛE‰Û>‰Û7‰Û0‰Û)‰Û"‰Û‰Û‰Û ‰Û‰ÛÿˆÛøˆÛñˆÛêˆÛãˆÛ܈ÛÕˆÛΈÛLjÛÀˆÛ¹ˆÛ²ˆÛ«ˆÛ¤ˆÛˆÛ–ˆÛˆÛˆˆÛˆÛzˆÛsˆÛlˆÛeˆÛ^ˆÛWˆÛPˆÛIˆÛBˆÛ;ˆÛ4ˆÛ-ˆÛ&ˆÛˆÛˆÛˆÛ ˆÛˆÛü‡Ûõ‡Ûî‡Ûç‡Ûà‡ÛÙ‡ÛÒ‡ÛˇÛćÛ½‡Û¶‡Û¯‡Û¨‡Û¡‡Ûš‡Û“‡ÛŒ‡Û…‡Û~‡Ûw‡Ûp‡Ûi‡Ûb‡Û[‡ÛT‡ÛM‡ÛF‡Û?‡Û8‡Û1‡Û*‡Û#‡Û‡Û‡Û‡Û‡Û‡Ûù†Ûò†Ûë†Ûä†Û݆ÛÖ†ÛφÛȆÛÁ†Ûº†Û³†Û¬†Û¥†Ûž†Û—†Û†Û‰†Û‚†Û{†Ût†Ûm†Ûf†Û_†ÛX†ÛQ†ÛJ†ÛC†Û<†Û5†Û.†Û'†Û †Û†Û†Û †Û†Ûý…Ûö…Ûï…Ûè…Ûá…ÛÚ…ÛÓ…ÛÌ…ÛÅ…Û¾…Û·…Û°…Û©…Û¢…Û›…Û”…Û…Û†…Û…Ûx…Ûq…Ûj…Ûc…Û\…ÛU…ÛN…ÛG…Û@…Û9…Û2…Û+…Û$…Û…Û…Û…Û…Û…Ûú„Ûó„Ûì„Ûå„ÛÞ„ÛׄÛЄÛɄۄۻ„Û´„Û­„Û¦„ÛŸ„Û˜„Û‘„ÛŠ„Ûƒ„Û|„Ûu„Ûn„Ûg„Û`„ÛY„ÛR„ÛK„ÛD„Û=„Û6„Û/„Û(„Û!„Û„Û„Û „Û„ÛþƒÛ÷ƒÛðƒÛéƒÛâƒÛÛƒÛÔƒÛ̓ÛƃÛ¿ƒÛ¸ƒÛ±ƒÛªƒÛ£ƒÛœƒÛ•ƒÛŽƒÛ‡ƒÛ€ƒÛyƒÛrƒÛkƒÛdƒÛ]ƒÛVƒÛOƒÛHƒÛAƒÛ:ƒÛ3ƒÛ,ƒÛ%ƒÛƒÛƒÛƒÛ ƒÛƒÛû‚Ûô‚Ûí‚Ûæ‚Ûß‚ÛØ‚ÛÑ‚ÛÊ‚ÛÂÛ¼‚Ûµ‚Û®‚Û§‚Û ‚Û™‚Û’‚Û‹‚Û„‚Û}‚Ûv‚Ûo‚Ûh‚Ûa‚ÛZ‚ÛS‚ÛL‚ÛE‚Û>‚Û7‚Û0‚Û)‚Û"‚Û‚Û‚Û ‚Û‚ÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛü€Ûõ€Ûî€Ûç€Ûà€ÛÙ€ÛÒ€ÛË€ÛÄ€Û½€Û¶€Û¯€Û¨€Û¡€Ûš€Û“€ÛŒ€Û…€Û~€Ûw€Ûp€Ûi€Ûb€Û[€ÛT€ÛM€ÛF€Û?€Û8€Û1€Û*€Û#€Û€Û€Û€Û€Û€ÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛý~Ûö~Ûï~Ûè~Ûá~ÛÚ~ÛÓ~ÛÌ~ÛÅ~Û¾~Û·~Û°~Û©~Û¢~Û›~Û”~Û~Û†~Û~Ûx~Ûq~Ûj~Ûc~Û\~ÛU~ÛN~ÛG~Û@~Û9~Û2~Û+~Û$~Û~Û~Û~Û~Û~Ûú}Ûó}Ûì}Ûå}ÛÞ}Û×}ÛÐ}ÛÉ}ÛÂ}Û»}Û´}Û­}Û¦}ÛŸ}Û˜}Û‘}ÛŠ}Ûƒ}Û|}Ûu}Ûn}Ûg}Û`}ÛY}ÛR}ÛK}ÛD}Û=}Û6}Û/}Û(}Û!}Û}Û}Û }Û}Ûþ|Û÷|Ûð|Ûé|Ûâ|ÛÛ|ÛÔ|ÛÍ|ÛÆ|Û¿|Û¸|Û±|Ûª|Û£|Ûœ|Û•|ÛŽ|Û‡|Û€|Ûy|Ûr|Ûk|Ûd|Û]|ÛV|ÛO|ÛH|ÛA|Û:|Û3|Û,|Û%|Û|Û|Û|Û |Û|Ûû{Ûô{Ûí{Ûæ{Ûß{ÛØ{ÛÑ{ÛÊ{ÛÃ{Û¼{Ûµ{Û®{Û§{Û {Û™{Û’{Û‹{Û„{Û}{Ûv{Ûo{Ûh{Ûa{ÛZ{ÛS{ÛL{ÛE{Û>{Û7{Û0{Û){Û"{Û{Û{Û {Û{ÛÿzÛøzÛñzÛêzÛãzÛÜzÛÕzÛÎzÛÇzÛÀzÛ¹zÛ²zÛ«zÛ¤zÛzÛ–zÛzÛˆzÛzÛzzÛszÛlzÛezÛ^zÛWzÛPzÛIzÛBzÛ;zÛ4zÛ-zÛ&zÛzÛzÛzÛ zÛzÛüyÛõyÛîyÛçyÛàyÛÙyÛÒyÛËyÛÄyÛ½yÛ¶yÛ¯yÛ¨yÛ¡yÛšyÛ“yÛŒyÛ…yÛ~yÛwyÛpyÛiyÛbyÛ[yÛTyÛMyÛFyÛ?yÛ8yÛ1yÛ*yÛ#yÛyÛyÛyÛyÛyÛùxÛòxÛëxÛäxÛÝxÛÖxÛÏxÛÈxÛÁxÛºxÛ³xÛ¬xÛ¥xÛžxÛ—xÛxÛ‰xÛ‚xÛ{xÛtxÛmxÛfxÛ_xÛXxÛQxÛJxÛCxÛtÛ7tÛ0tÛ)tÛ"tÛtÛtÛ tÛtÛÿsÛøsÛñsÛêsÛãsÛÜsÛÕsÛÎsÛÇsÛÀsÛ¹sÛ²sÛ«sÛ¤sÛsÛ–sÛsÛˆsÛsÛzsÛssÛlsÛesÛ^sÛWsÛPsÛIsÛBsÛ;sÛ4sÛ-sÛ&sÛsÛsÛsÛ sÛsÛürÛõrÛîrÛçrÛàrÛÙrÛÒrÛËrÛÄrÛ½rÛ¶rÛ¯rÛ¨rÛ¡rÛšrÛ“rÛŒrÛ…rÛ~rÛwrÛprÛirÛbrÛ[rÛTrÛMrÛFrÛ?rÛ8rÛ1rÛ*rÛ#rÛrÛrÛrÛrÛrÛùqÛòqÛëqÛäqÛÝqÛÖqÛÏqÛÈqÛÁqÛºqÛ³qÛ¬qÛ¥qÛžqÛ—qÛqÛ‰qÛ‚qÛ{qÛtqÛmqÛfqÛ_qÛXqÛQqÛJqÛCqÛmÛ7mÛ0mÛ)mÛ"mÛmÛmÛ mÛmÛÿlÛølÛñlÛêlÛãlÛÜlÛÕlÛÎlÛÇlÛÀlÛ¹lÛ²lÛ«lÛ¤lÛlÛ–lÛlÛˆlÛlÛzlÛslÛllÛelÛ^lÛWlÛPlÛIlÛBlÛ;lÛ4lÛ-lÛ&lÛlÛlÛlÛ lÛlÛükÛõkÛîkÛçkÛàkÛÙkÛÒkÛËkÛÄkÛ½kÛ¶kÛ¯kÛ¨kÛ¡kÛškÛ“kÛŒkÛ…kÛ~kÛwkÛpkÛikÛbkÛ[kÛTkÛMkÛFkÛ?kÛ8kÛ1kÛ*kÛ#kÛkÛkÛkÛkÛkÛùjÛòjÛëjÛäjÛÝjÛÖjÛÏjÛÈjÛÁjÛºjÛ³jÛ¬jÛ¥jÛžjÛ—jÛjÛ‰jÛ‚jÛ{jÛtjÛmjÛfjÛ_jÛXjÛQjÛJjÛCjÛfÛ7fÛ0fÛ)fÛ"fÛfÛfÛ fÛfÛÿeÛøeÛñeÛêeÛãeÛÜeÛÕeÛÎeÛÇeÛÀeÛ¹eÛ²eÛ«eÛ¤eÛeÛ–eÛeÛˆeÛeÛzeÛseÛleÛeeÛ^eÛWeÛPeÛIeÛBeÛ;eÛ4eÛ-eÛ&eÛeÛeÛeÛ eÛeÛüdÛõdÛîdÛçdÛàdÛÙdÛÒdÛËdÛÄdÛ½dÛ¶dÛ¯dÛ¨dÛ¡dÛšdÛ“dÛŒdÛ…dÛ~dÛwdÛpdÛidÛbdÛ[dÛTdÛMdÛFdÛ?dÛ8dÛ1dÛ*dÛ#dÛdÛdÛdÛdÛdÛùcÛòcÛëcÛäcÛÝcÛÖcÛÏcÛÈcÛÁcÛºcÛ³cÛ¬cÛ¥cÛžcÛ—cÛcÛ‰cÛ‚cÛ{cÛtcÛmcÛfcÛ_cÛXcÛQcÛJcÛCcÛ_Û7_Û0_Û)_Û"_Û_Û_Û _Û_Ûÿ^Ûø^Ûñ^Ûê^Ûã^ÛÜ^ÛÕ^ÛÎ^ÛÇ^ÛÀ^Û¹^Û²^Û«^Û¤^Û^Û–^Û^Ûˆ^Û^Ûz^Ûs^Ûl^Ûe^Û^^ÛW^ÛP^ÛI^ÛB^Û;^Û4^Û-^Û&^Û^Û^Û^Û ^Û^Ûü]Ûõ]Ûî]Ûç]Ûà]ÛÙ]ÛÒ]ÛË]ÛÄ]Û½]Û¶]Û¯]Û¨]Û¡]Ûš]Û“]ÛŒ]Û…]Û~]Ûw]Ûp]Ûi]Ûb]Û[]ÛT]ÛM]ÛF]Û?]Û8]Û1]Û*]Û#]Û]Û]Û]Û]Û]Ûù\Ûò\Ûë\Ûä\ÛÝ\ÛÖ\ÛÏ\ÛÈ\ÛÁ\Ûº\Û³\Û¬\Û¥\Ûž\Û—\Û\Û‰\Û‚\Û{\Ût\Ûm\Ûf\Û_\ÛX\ÛQ\ÛJ\ÛC\Û<\Û5\Û.\Û'\Û \Û\Û\Û \Û\Ûý[Ûö[Ûï[Ûè[Ûá[ÛÚ[ÛÓ[ÛÌ[ÛÅ[Û¾[Û·[Û°[Û©[Û¢[Û›[Û”[Û[Û†[Û[Ûx[Ûq[Ûj[Ûc[Û\[ÛU[ÛN[ÛG[Û@[Û9[Û2[Û+[Û$[Û[Û[Û[Û[Û[ÛúZÛóZÛìZÛåZÛÞZÛ×ZÛÐZÛÉZÛÂZÛ»ZÛ´ZÛ­ZÛ¦ZÛŸZÛ˜ZÛ‘ZÛŠZÛƒZÛ|ZÛuZÛnZÛgZÛ`ZÛYZÛRZÛKZÛDZÛ=ZÛ6ZÛ/ZÛ(ZÛ!ZÛZÛZÛ ZÛZÛþYÛ÷YÛðYÛéYÛâYÛÛYÛÔYÛÍYÛÆYÛ¿YÛ¸YÛ±YÛªYÛ£YÛœYÛ•YÛŽYÛ‡YÛ€YÛyYÛrYÛkYÛdYÛ]YÛVYÛOYÛHYÛAYÛ:YÛ3YÛ,YÛ%YÛYÛYÛYÛ YÛYÛûXÛôXÛíXÛæXÛßXÛØXÛÑXÛÊXÛÃXÛ¼XÛµXÛ®XÛ§XÛ XÛ™XÛ’XÛ‹XÛ„XÛ}XÛvXÛoXÛhXÛaXÛZXÛSXÛLXÛEXÛ>XÛ7XÛ0XÛ)XÛ"XÛXÛXÛ XÛXÛÿWÛøWÛñWÛêWÛãWÛÜWÛÕWÛÎWÛÇWÛÀWÛ¹WÛ²WÛ«WÛ¤WÛWÛ–WÛWÛˆWÛWÛzWÛsWÛlWÛeWÛ^WÛWWÛPWÛIWÛBWÛ;WÛ4WÛ-WÛ&WÛWÛWÛWÛ WÛWÛüVÛõVÛîVÛçVÛàVÛÙVÛÒVÛËVÛÄVÛ½VÛ¶VÛ¯VÛ¨VÛ¡VÛšVÛ“VÛŒVÛ…VÛ~VÛwVÛpVÛiVÛbVÛ[VÛTVÛMVÛFVÛ?VÛ8VÛ1VÛ*VÛ#VÛVÛVÛVÛVÛVÛùUÛòUÛëUÛäUÛÝUÛÖUÛÏUÛÈUÛÁUÛºUÛ³UÛ¬UÛ¥UÛžUÛ—UÛUÛ‰UÛ‚UÛ{UÛtUÛmUÛfUÛ_UÛXUÛQUÛJUÛCUÛQÛ7QÛ0QÛ)QÛ"QÛQÛQÛ QÛQÛÿPÛøPÛñPÛêPÛãPÛÜPÛÕPÛÎPÛÇPÛÀPÛ¹PÛ²PÛ«PÛ¤PÛPÛ–PÛPÛˆPÛPÛzPÛsPÛlPÛePÛ^PÛWPÛPPÛIPÛBPÛ;PÛ4PÛ-PÛ&PÛPÛPÛPÛ PÛPÛüOÛõOÛîOÛçOÛàOÛÙOÛÒOÛËOÛÄOÛ½OÛ¶OÛ¯OÛ¨OÛ¡OÛšOÛ“OÛŒOÛ…OÛ~OÛwOÛpOÛiOÛbOÛ[OÛTOÛMOÛFOÛ?OÛ8OÛ1OÛ*OÛ#OÛOÛOÛOÛOÛOÛùNÛòNÛëNÛäNÛÝNÛÖNÛÏNÛÈNÛÁNÛºNÛ³NÛ¬NÛ¥NÛžNÛ—NÛNÛ‰NÛ‚NÛ{NÛtNÛmNÛfNÛ_NÛXNÛQNÛJNÛCNÛJÛ7JÛ0JÛ)JÛ"JÛJÛJÛ JÛJÛÿIÛøIÛñIÛêIÛãIÛÜIÛÕIÛÎIÛÇIÛÀIÛ¹IÛ²IÛ«IÛ¤IÛIÛ–IÛIÛˆIÛIÛzIÛsIÛlIÛeIÛ^IÛWIÛPIÛIIÛBIÛ;IÛ4IÛ-IÛ&IÛIÛIÛIÛ IÛIÛüHÛõHÛîHÛçHÛàHÛÙHÛÒHÛËHÛÄHÛ½HÛ¶HÛ¯HÛ¨HÛ¡HÛšHÛ“HÛŒHÛ…HÛ~HÛwHÛpHÛiHÛbHÛ[HÛTHÛMHÛFHÛ?HÛ8HÛ1HÛ*HÛ#HÛHÛHÛHÛHÛHÛùGÛòGÛëGÛäGÛÝGÛÖGÛÏGÛÈGÛÁGÛºGÛ³GÛ¬GÛ¥GÛžGÛ—GÛGÛ‰GÛ‚GÛ{GÛtGÛmGÛfGÛ_GÛXGÛQGÛJGÛCGÛCÛ7CÛ0CÛ)CÛ"CÛCÛCÛ CÛCÛÿBÛøBÛñBÛêBÛãBÛÜBÛÕBÛÎBÛÇBÛÀBÛ¹BÛ²BÛ«BÛ¤BÛBÛ–BÛBÛˆBÛBÛzBÛsBÛlBÛeBÛ^BÛWBÛPBÛIBÛBBÛ;BÛ4BÛ-BÛ&BÛBÛBÛBÛ BÛBÛüAÛõAÛîAÛçAÛàAÛÙAÛÒAÛËAÛÄAÛ½AÛ¶AÛ¯AÛ¨AÛ¡AÛšAÛ“AÛŒAÛ…AÛ~AÛwAÛpAÛiAÛbAÛ[AÛTAÛMAÛFAÛ?AÛ8AÛ1AÛ*AÛ#AÛAÛAÛAÛAÛAÛù@Ûò@Ûë@Ûä@ÛÝ@ÛÖ@ÛÏ@ÛÈ@ÛÁ@Ûº@Û³@Û¬@Û¥@Ûž@Û—@Û@Û‰@Û‚@Û{@Ût@Ûm@Ûf@Û_@ÛX@ÛQ@ÛJ@ÛC@Û<@Û5@Û.@Û'@Û @Û@Û@Û @Û@Ûý?Ûö?Ûï?Ûè?Ûá?ÛÚ?ÛÓ?ÛÌ?ÛÅ?Û¾?Û·?Û°?Û©?Û¢?Û›?Û”?Û?Û†?Û?Ûx?Ûq?Ûj?Ûc?Û\?ÛU?ÛN?ÛG?Û@?Û9?Û2?Û+?Û$?Û?Û?Û?Û?Û?Ûú>Ûó>Ûì>Ûå>ÛÞ>Û×>ÛÐ>ÛÉ>ÛÂ>Û»>Û´>Û­>Û¦>ÛŸ>Û˜>Û‘>ÛŠ>Ûƒ>Û|>Ûu>Ûn>Ûg>Û`>ÛY>ÛR>ÛK>ÛD>Û=>Û6>Û/>Û(>Û!>Û>Û>Û >Û>Ûþ=Û÷=Ûð=Ûé=Ûâ=ÛÛ=ÛÔ=ÛÍ=ÛÆ=Û¿=Û¸=Û±=Ûª=Û£=Ûœ=Û•=ÛŽ=Û‡=Û€=Ûy=Ûr=Ûk=Ûd=Û]=ÛV=ÛO=ÛH=ÛA=Û:=Û3=Û,=Û%=Û=Û=Û=Û =Û=Ûû<Ûô<Ûí<Ûæ<Ûß<ÛØ<ÛÑ<ÛÊ<ÛÃ<Û¼<Ûµ<Û®<Û§<Û <Û™<Û’<Û‹<Û„<Û}<Ûv<Ûo<Ûh<Ûa<ÛZ<ÛS<ÛL<ÛE<Û><Û7<Û0<Û)<Û"<Û<Û<Û <Û<Ûÿ;Ûø;Ûñ;Ûê;Ûã;ÛÜ;ÛÕ;ÛÎ;ÛÇ;ÛÀ;Û¹;Û²;Û«;Û¤;Û;Û–;Û;Ûˆ;Û;Ûz;Ûs;Ûl;Ûe;Û^;ÛW;ÛP;ÛI;ÛB;Û;;Û4;Û-;Û&;Û;Û;Û;Û ;Û;Ûü:Ûõ:Ûî:Ûç:Ûà:ÛÙ:ÛÒ:ÛË:ÛÄ:Û½:Û¶:Û¯:Û¨:Û¡:Ûš:Û“:ÛŒ:Û…:Û~:Ûw:Ûp:Ûi:Ûb:Û[:ÛT:ÛM:ÛF:Û?:Û8:Û1:Û*:Û#:Û:Û:Û:Û:Û:Ûù9Ûò9Ûë9Ûä9ÛÝ9ÛÖ9ÛÏ9ÛÈ9ÛÁ9Ûº9Û³9Û¬9Û¥9Ûž9Û—9Û9Û‰9Û‚9Û{9Ût9Ûm9Ûf9Û_9ÛX9ÛQ9ÛJ9ÛC9Û<9Û59Û.9Û'9Û 9Û9Û9Û 9Û9Ûý8Ûö8Ûï8Ûè8Ûá8ÛÚ8ÛÓ8ÛÌ8ÛÅ8Û¾8Û·8Û°8Û©8Û¢8Û›8Û”8Û8Û†8Û8Ûx8Ûq8Ûj8Ûc8Û\8ÛU8ÛN8ÛG8Û@8Û98Û28Û+8Û$8Û8Û8Û8Û8Û8Ûú7Ûó7Ûì7Ûå7ÛÞ7Û×7ÛÐ7ÛÉ7ÛÂ7Û»7Û´7Û­7Û¦7ÛŸ7Û˜7Û‘7ÛŠ7Ûƒ7Û|7Ûu7Ûn7Ûg7Û`7ÛY7ÛR7ÛK7ÛD7Û=7Û67Û/7Û(7Û!7Û7Û7Û 7Û7Ûþ6Û÷6Ûð6Ûé6Ûâ6ÛÛ6ÛÔ6ÛÍ6ÛÆ6Û¿6Û¸6Û±6Ûª6Û£6Ûœ6Û•6ÛŽ6Û‡6Û€6Ûy6Ûr6Ûk6Ûd6Û]6ÛV6ÛO6ÛH6ÛA6Û:6Û36Û,6Û%6Û6Û6Û6Û 6Û6Ûû5Ûô5Ûí5Ûæ5Ûß5ÛØ5ÛÑ5ÛÊ5ÛÃ5Û¼5Ûµ5Û®5Û§5Û 5Û™5Û’5Û‹5Û„5Û}5Ûv5Ûo5Ûh5Ûa5ÛZ5ÛS5ÛL5ÛE5Û>5Û75Û05Û)5Û"5Û5Û5Û 5Û5Ûÿ4Ûø4Ûñ4Ûê4Ûã4ÛÜ4ÛÕ4ÛÎ4ÛÇ4ÛÀ4Û¹4Û²4Û«4Û¤4Û4Û–4Û4Ûˆ4Û4Ûz4Ûs4Ûl4Ûe4Û^4ÛW4ÛP4ÛI4ÛB4Û;4Û44Û-4Û&4Û4Û4Û4Û 4Û4Ûü3Ûõ3Ûî3Ûç3Ûà3ÛÙ3ÛÒ3ÛË3ÛÄ3Û½3Û¶3Û¯3Û¨3Û¡3Ûš3Û“3ÛŒ3Û…3Û~3Ûw3Ûp3Ûi3Ûb3Û[3ÛT3ÛM3ÛF3Û?3Û83Û13Û*3Û#3Û3Û3Û3Û3Û3Ûù2Ûò2Ûë2Ûä2ÛÝ2ÛÖ2ÛÏ2ÛÈ2ÛÁ2Ûº2Û³2Û¬2Û¥2Ûž2Û—2Û2Û‰2Û‚2Û{2Ût2Ûm2Ûf2Û_2ÛX2ÛQ2ÛJ2ÛC2Û<2Û52Û.2Û'2Û 2Û2Û2Û 2Û2Ûý1Ûö1Ûï1Ûè1Ûá1ÛÚ1ÛÓ1ÛÌ1ÛÅ1Û¾1Û·1Û°1Û©1Û¢1Û›1Û”1Û1Û†1Û1Ûx1Ûq1Ûj1Ûc1Û\1ÛU1ÛN1ÛG1Û@1Û91Û21Û+1Û$1Û1Û1Û1Û1Û1Ûú0Ûó0Ûì0Ûå0ÛÞ0Û×0ÛÐ0ÛÉ0ÛÂ0Û»0Û´0Û­0Û¦0ÛŸ0Û˜0Û‘0ÛŠ0Ûƒ0Û|0Ûu0Ûn0Ûg0Û`0ÛY0ÛR0ÛK0ÛD0Û=0Û60Û/0Û(0Û!0Û0Û0Û 0Û0Ûþ/Û÷/Ûð/Ûé/Ûâ/ÛÛ/ÛÔ/ÛÍ/ÛÆ/Û¿/Û¸/Û±/Ûª/Û£/Ûœ/Û•/ÛŽ/Û‡/Û€/Ûy/Ûr/Ûk/Ûd/Û]/ÛV/ÛO/ÛH/ÛA/Û:/Û3/Û,/Û%/Û/Û/Û/Û /Û/Ûû.Ûô.Ûí.Ûæ.Ûß.ÛØ.ÛÑ.ÛÊ.ÛÃ.Û¼.Ûµ.Û®.Û§.Û .Û™.Û’.Û‹.Û„.Û}.Ûv.Ûo.Ûh.Ûa.ÛZ.ÛS.ÛL.ÛE.Û>.Û7.Û0.Û).Û".Û.Û.Û .Û.Ûÿ-Ûø-Ûñ-Ûê-Ûã-ÛÜ-ÛÕ-ÛÎ-ÛÇ-ÛÀ-Û¹-Û²-Û«-Û¤-Û-Û–-Û-Ûˆ-Û-Ûz-Ûs-Ûl-Ûe-Û^-ÛW-ÛP-ÛI-ÛB-Û;-Û4-Û--Û&-Û-Û-Û-Û -Û-Ûü,Ûõ,Ûî,Ûç,Ûà,ÛÙ,ÛÒ,ÛË,ÛÄ,Û½,Û¶,Û¯,Û¨,Û¡,Ûš,Û“,ÛŒ,Û…,Û~,Ûw,Ûp,Ûi,Ûb,Û[,ÛT,ÛM,ÛF,Û?,Û8,Û1,Û*,Û#,Û,Û,Û,Û,Û,Ûù+Ûò+Ûë+Ûä+ÛÝ+ÛÖ+ÛÏ+ÛÈ+ÛÁ+Ûº+Û³+Û¬+Û¥+Ûž+Û—+Û+Û‰+Û‚+Û{+Ût+Ûm+Ûf+Û_+ÛX+ÛQ+ÛJ+ÛC+Û<+Û5+Û.+Û'+Û +Û+Û+Û +Û+Ûý*Ûö*Ûï*Ûè*Ûá*ÛÚ*ÛÓ*ÛÌ*ÛÅ*Û¾*Û·*Û°*Û©*Û¢*Û›*Û”*Û*Û†*Û*Ûx*Ûq*Ûj*Ûc*Û\*ÛU*ÛN*ÛG*Û@*Û9*Û2*Û+*Û$*Û*Û*Û*Û*Û*Ûú)Ûó)Ûì)Ûå)ÛÞ)Û×)ÛÐ)ÛÉ)ÛÂ)Û»)Û´)Û­)Û¦)ÛŸ)Û˜)Û‘)ÛŠ)Ûƒ)Û|)Ûu)Ûn)Ûg)Û`)ÛY)ÛR)ÛK)ÛD)Û=)Û6)Û/)Û()Û!)Û)Û)Û )Û)Ûþ(Û÷(Ûð(Ûé(Ûâ(ÛÛ(ÛÔ(ÛÍ(ÛÆ(Û¿(Û¸(Û±(Ûª(Û£(Ûœ(Û•(ÛŽ(Û‡(Û€(Ûy(Ûr(Ûk(Ûd(Û](ÛV(ÛO(ÛH(ÛA(Û:(Û3(Û,(Û%(Û(Û(Û(Û (Û(Ûû'Ûô'Ûí'Ûæ'Ûß'ÛØ'ÛÑ'ÛÊ'ÛÃ'Û¼'Ûµ'Û®'Û§'Û 'Û™'Û’'Û‹'Û„'Û}'Ûv'Ûo'Ûh'Ûa'ÛZ'ÛS'ÛL'ÛE'Û>'Û7'Û0'Û)'Û"'Û'Û'Û 'Û'Ûÿ&Ûø&Ûñ&Ûê&Ûã&ÛÜ&ÛÕ&ÛÎ&ÛÇ&ÛÀ&Û¹&Û²&Û«&Û¤&Û&Û–&Û&Ûˆ&Û&Ûz&Ûs&Ûl&Ûe&Û^&ÛW&ÛP&ÛI&ÛB&Û;&Û4&Û-&Û&&Û&Û&Û&Û &Û&Ûü%Ûõ%Ûî%Ûç%Ûà%ÛÙ%ÛÒ%ÛË%ÛÄ%Û½%Û¶%Û¯%Û¨%Û¡%Ûš%Û“%ÛŒ%Û…%Û~%Ûw%Ûp%Ûi%Ûb%Û[%ÛT%ÛM%ÛF%Û?%Û8%Û1%Û*%Û#%Û%Û%Û%Û%Û%Ûù$Ûò$Ûë$Ûä$ÛÝ$ÛÖ$ÛÏ$ÛÈ$ÛÁ$Ûº$Û³$Û¬$Û¥$Ûž$Û—$Û$Û‰$Û‚$Û{$Ût$Ûm$Ûf$Û_$ÛX$ÛQ$ÛJ$ÛC$Û<$Û5$Û.$Û'$Û $Û$Û$Û $Û$Ûý#Ûö#Ûï#Ûè#Ûá#ÛÚ#ÛÓ#ÛÌ#ÛÅ#Û¾#Û·#Û°#Û©#Û¢#Û›#Û”#Û#Û†#Û#Ûx#Ûq#Ûj#Ûc#Û\#ÛU#ÛN#ÛG#Û@#Û9#Û2#Û+#Û$#Û#Û#Û#Û#Û#Ûú"Ûó"Ûì"Ûå"ÛÞ"Û×"ÛÐ"ÛÉ"ÛÂ"Û»"Û´"Û­"Û¦"ÛŸ"Û˜"Û‘"ÛŠ"Ûƒ"Û|"Ûu"Ûn"Ûg"Û`"ÛY"ÛR"ÛK"ÛD"Û="Û6"Û/"Û("Û!"Û"Û"Û "Û"Ûþ!Û÷!Ûð!Ûé!Ûâ!ÛÛ!ÛÔ!ÛÍ!ÛÆ!Û¿!Û¸!Û±!Ûª!Û£!Ûœ!Û•!ÛŽ!Û‡!Û€!Ûy!Ûr!Ûk!Ûd!Û]!ÛV!ÛO!ÛH!ÛA!Û:!Û3!Û,!Û%!Û!Û!Û!Û !Û!Ûû Ûô Ûí Ûæ Ûß ÛØ ÛÑ ÛÊ Ûà Û¼ Ûµ Û® Û§ Û  Û™ Û’ Û‹ Û„ Û} Ûv Ûo Ûh Ûa ÛZ ÛS ÛL ÛE Û> Û7 Û0 Û) Û" Û Û Û Û ÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛú Ûó Ûì Ûå ÛÞ Û× ÛÐ ÛÉ Û Û» Û´ Û­ Û¦ ÛŸ Û˜ Û‘ ÛŠ Ûƒ Û| Ûu Ûn Ûg Û` ÛY ÛR ÛK ÛD Û= Û6 Û/ Û( Û! Û Û Û Û Ûþ Û÷ Ûð Ûé Ûâ ÛÛ ÛÔ ÛÍ ÛÆ Û¿ Û¸ Û± Ûª Û£ Ûœ Û• ÛŽ Û‡ Û€ Ûy Ûr Ûk Ûd Û] ÛV ÛO ÛH ÛA Û: Û3 Û, Û% Û Û Û Û Û Ûû Ûô Ûí Ûæ Ûß ÛØ ÛÑ ÛÊ Ûà Û¼ Ûµ Û® Û§ Û  Û™ Û’ Û‹ Û„ Û} Ûv Ûo Ûh Ûa ÛZ ÛS ÛL ÛE Û> Û7 Û0 Û) Û" Û Û Û Û Ûÿ Ûø Ûñ Ûê Ûã ÛÜ ÛÕ ÛÎ ÛÇ ÛÀ Û¹ Û² Û« Û¤ Û Û– Û Ûˆ Û Ûz Ûs Ûl Ûe Û^ ÛW ÛP ÛI ÛB Û; Û4 Û- Û& Û Û Û Û Û Ûü Ûõ Ûî Ûç Ûà ÛÙ ÛÒ ÛË ÛÄ Û½ Û¶ Û¯ Û¨ Û¡ Ûš Û“ ÛŒ Û… Û~ Ûw Ûp Ûi Ûb Û[ ÛT ÛM ÛF Û? Û8 Û1 Û* Û# Û Û Û Û Û ÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÿÚóÿÚìÿÚåÿÚÞÿÚ×ÿÚÐÿÚÉÿÚÂÿÚ»ÿÚ´ÿÚ­ÿÚ¦ÿÚŸÿÚ˜ÿÚ‘ÿÚŠÿÚƒÿÚ|ÿÚuÿÚnÿÚgÿÚ`ÿÚYÿÚRÿÚKÿÚDÿÚ=ÿÚ6ÿÚ/ÿÚ(ÿÚ!ÿÚÿÚÿÚ ÿÚÿÚþþÚ÷þÚðþÚéþÚâþÚÛþÚÔþÚÍþÚÆþÚ¿þÚ¸þÚ±þÚªþÚ£þÚœþÚ•þÚŽþÚ‡þÚ€þÚyþÚrþÚkþÚdþÚ]þÚVþÚOþÚHþÚAþÚ:þÚ3þÚ,þÚ%þÚþÚþÚþÚ þÚþÚûýÚôýÚíýÚæýÚßýÚØýÚÑýÚÊýÚÃýÚ¼ýÚµýÚ®ýÚ§ýÚ ýÚ™ýÚ’ýÚ‹ýÚ„ýÚ}ýÚvýÚoýÚhýÚaýÚZýÚSýÚLýÚEýÚ>ýÚ7ýÚ0ýÚ)ýÚ"ýÚýÚýÚ ýÚýÚÿüÚøüÚñüÚêüÚãüÚÜüÚÕüÚÎüÚÇüÚÀüÚ¹üÚ²üÚ«üÚ¤üÚüÚ–üÚüÚˆüÚüÚzüÚsüÚlüÚeüÚ^üÚWüÚPüÚIüÚBüÚ;üÚ4üÚ-üÚ&üÚüÚüÚüÚ üÚüÚüûÚõûÚîûÚçûÚàûÚÙûÚÒûÚËûÚÄûÚ½ûÚ¶ûÚ¯ûÚ¨ûÚ¡ûÚšûÚ“ûÚŒûÚ…ûÚ~ûÚwûÚpûÚiûÚbûÚ[ûÚTûÚMûÚFûÚ?ûÚ8ûÚ1ûÚ*ûÚ#ûÚûÚûÚûÚûÚûÚùúÚòúÚëúÚäúÚÝúÚÖúÚÏúÚÈúÚÁúÚºúÚ³úÚ¬úÚ¥úÚžúÚ—úÚúÚ‰úÚ‚úÚ{úÚtúÚmúÚfúÚ_úÚXúÚQúÚJúÚCúÚ<úÚ5úÚ.úÚ'úÚ úÚúÚúÚ úÚúÚýùÚöùÚïùÚèùÚáùÚÚùÚÓùÚÌùÚÅùÚ¾ùÚ·ùÚ°ùÚ©ùÚ¢ùÚ›ùÚ”ùÚùÚ†ùÚùÚxùÚqùÚjùÚcùÚ\ùÚUùÚNùÚGùÚ@ùÚ9ùÚ2ùÚ+ùÚ$ùÚùÚùÚùÚùÚùÚúøÚóøÚìøÚåøÚÞøÚ×øÚÐøÚÉøÚÂøÚ»øÚ´øÚ­øÚ¦øÚŸøÚ˜øÚ‘øÚŠøÚƒøÚ|øÚuøÚnøÚgøÚ`øÚYøÚRøÚKøÚDøÚ=øÚ6øÚ/øÚ(øÚ!øÚøÚøÚ øÚøÚþ÷Ú÷÷Úð÷Úé÷Úâ÷ÚÛ÷ÚÔ÷ÚÍ÷ÚÆ÷Ú¿÷Ú¸÷Ú±÷Úª÷Ú£÷Úœ÷Ú•÷ÚŽ÷Ú‡÷Ú€÷Úy÷Úr÷Úk÷Úd÷Ú]÷ÚV÷ÚO÷ÚH÷ÚA÷Ú:÷Ú3÷Ú,÷Ú%÷Ú÷Ú÷Ú÷Ú ÷Ú÷ÚûöÚôöÚíöÚæöÚßöÚØöÚÑöÚÊöÚÃöÚ¼öÚµöÚ®öÚ§öÚ öÚ™öÚ’öÚ‹öÚ„öÚ}öÚvöÚoöÚhöÚaöÚZöÚSöÚLöÚEöÚ>öÚ7öÚ0öÚ)öÚ"öÚöÚöÚ öÚöÚÿõÚøõÚñõÚêõÚãõÚÜõÚÕõÚÎõÚÇõÚÀõÚ¹õÚ²õÚ«õÚ¤õÚõÚ–õÚõÚˆõÚõÚzõÚsõÚlõÚeõÚ^õÚWõÚPõÚIõÚBõÚ;õÚ4õÚ-õÚ&õÚõÚõÚõÚ õÚõÚüôÚõôÚîôÚçôÚàôÚÙôÚÒôÚËôÚÄôÚ½ôÚ¶ôÚ¯ôÚ¨ôÚ¡ôÚšôÚ“ôÚŒôÚ…ôÚ~ôÚwôÚpôÚiôÚbôÚ[ôÚTôÚMôÚFôÚ?ôÚ8ôÚ1ôÚ*ôÚ#ôÚôÚôÚôÚôÚôÚùóÚòóÚëóÚäóÚÝóÚÖóÚÏóÚÈóÚÁóÚºóÚ³óÚ¬óÚ¥óÚžóÚ—óÚóÚ‰óÚ‚óÚ{óÚtóÚmóÚfóÚ_óÚXóÚQóÚJóÚCóÚ<óÚ5óÚ.óÚ'óÚ óÚóÚóÚ óÚóÚýòÚöòÚïòÚèòÚáòÚÚòÚÓòÚÌòÚÅòÚ¾òÚ·òÚ°òÚ©òÚ¢òÚ›òÚ”òÚòÚ†òÚòÚxòÚqòÚjòÚcòÚ\òÚUòÚNòÚGòÚ@òÚ9òÚ2òÚ+òÚ$òÚòÚòÚòÚòÚòÚúñÚóñÚìñÚåñÚÞñÚ×ñÚÐñÚÉñÚÂñÚ»ñÚ´ñÚ­ñÚ¦ñÚŸñÚ˜ñÚ‘ñÚŠñÚƒñÚ|ñÚuñÚnñÚgñÚ`ñÚYñÚRñÚKñÚDñÚ=ñÚ6ñÚ/ñÚ(ñÚ!ñÚñÚñÚ ñÚñÚþðÚ÷ðÚððÚéðÚâðÚÛðÚÔðÚÍðÚÆðÚ¿ðÚ¸ðÚ±ðÚªðÚ£ðÚœðÚ•ðÚŽðÚ‡ðÚ€ðÚyðÚrðÚkðÚdðÚ]ðÚVðÚOðÚHðÚAðÚ:ðÚ3ðÚ,ðÚ%ðÚðÚðÚðÚ ðÚðÚûïÚôïÚíïÚæïÚßïÚØïÚÑïÚÊïÚÃïÚ¼ïÚµïÚ®ïÚ§ïÚ ïÚ™ïÚ’ïÚ‹ïÚ„ïÚ}ïÚvïÚoïÚhïÚaïÚZïÚSïÚLïÚEïÚ>ïÚ7ïÚ0ïÚ)ïÚ"ïÚïÚïÚ ïÚïÚÿîÚøîÚñîÚêîÚãîÚÜîÚÕîÚÎîÚÇîÚÀîÚ¹îÚ²îÚ«îÚ¤îÚîÚ–îÚîÚˆîÚîÚzîÚsîÚlîÚeîÚ^îÚWîÚPîÚIîÚBîÚ;îÚ4îÚ-îÚ&îÚîÚîÚîÚ îÚîÚüíÚõíÚîíÚçíÚàíÚÙíÚÒíÚËíÚÄíÚ½íÚ¶íÚ¯íÚ¨íÚ¡íÚšíÚ“íÚŒíÚ…íÚ~íÚwíÚpíÚiíÚbíÚ[íÚTíÚMíÚFíÚ?íÚ8íÚ1íÚ*íÚ#íÚíÚíÚíÚíÚíÚùìÚòìÚëìÚäìÚÝìÚÖìÚÏìÚÈìÚÁìÚºìÚ³ìÚ¬ìÚ¥ìÚžìÚ—ìÚìÚ‰ìÚ‚ìÚ{ìÚtìÚmìÚfìÚ_ìÚXìÚQìÚJìÚCìÚ<ìÚ5ìÚ.ìÚ'ìÚ ìÚìÚìÚ ìÚìÚýëÚöëÚïëÚèëÚáëÚÚëÚÓëÚÌëÚÅëÚ¾ëÚ·ëÚ°ëÚ©ëÚ¢ëÚ›ëÚ”ëÚëÚ†ëÚëÚxëÚqëÚjëÚcëÚ\ëÚUëÚNëÚGëÚ@ëÚ9ëÚ2ëÚ+ëÚ$ëÚëÚëÚëÚëÚëÚúêÚóêÚìêÚåêÚÞêÚ×êÚÐêÚÉêÚÂêÚ»êÚ´êÚ­êÚ¦êÚŸêÚ˜êÚ‘êÚŠêÚƒêÚ|êÚuêÚnêÚgêÚ`êÚYêÚRêÚKêÚDêÚ=êÚ6êÚ/êÚ(êÚ!êÚêÚêÚ êÚêÚþéÚ÷éÚðéÚééÚâéÚÛéÚÔéÚÍéÚÆéÚ¿éÚ¸éÚ±éÚªéÚ£éÚœéÚ•éÚŽéÚ‡éÚ€éÚyéÚréÚkéÚdéÚ]éÚVéÚOéÚHéÚAéÚ:éÚ3éÚ,éÚ%éÚéÚéÚéÚ éÚéÚûèÚôèÚíèÚæèÚßèÚØèÚÑèÚÊèÚÃèÚ¼èÚµèÚ®èÚ§èÚ èÚ™èÚ’èÚ‹èÚ„èÚ}èÚvèÚoèÚhèÚaèÚZèÚSèÚLèÚEèÚ>èÚ7èÚ0èÚ)èÚ"èÚèÚèÚ èÚèÚÿçÚøçÚñçÚêçÚãçÚÜçÚÕçÚÎçÚÇçÚÀçÚ¹çÚ²çÚ«çÚ¤çÚçÚ–çÚçÚˆçÚçÚzçÚsçÚlçÚeçÚ^çÚWçÚPçÚIçÚBçÚ;çÚ4çÚ-çÚ&çÚçÚçÚçÚ çÚçÚüæÚõæÚîæÚçæÚàæÚÙæÚÒæÚËæÚÄæÚ½æÚ¶æÚ¯æÚ¨æÚ¡æÚšæÚ“æÚŒæÚ…æÚ~æÚwæÚpæÚiæÚbæÚ[æÚTæÚMæÚFæÚ?æÚ8æÚ1æÚ*æÚ#æÚæÚæÚæÚæÚæÚùåÚòåÚëåÚäåÚÝåÚÖåÚÏåÚÈåÚÁåÚºåÚ³åÚ¬åÚ¥åÚžåÚ—åÚåÚ‰åÚ‚åÚ{åÚtåÚmåÚfåÚ_åÚXåÚQåÚJåÚCåÚ<åÚ5åÚ.åÚ'åÚ åÚåÚåÚ åÚåÚýäÚöäÚïäÚèäÚáäÚÚäÚÓäÚÌäÚÅäÚ¾äÚ·äÚ°äÚ©äÚ¢äÚ›äÚ”äÚäÚ†äÚäÚxäÚqäÚjäÚcäÚ\äÚUäÚNäÚGäÚ@äÚ9äÚ2äÚ+äÚ$äÚäÚäÚäÚäÚäÚúãÚóãÚìãÚåãÚÞãÚ×ãÚÐãÚÉãÚÂãÚ»ãÚ´ãÚ­ãÚ¦ãÚŸãÚ˜ãÚ‘ãÚŠãÚƒãÚ|ãÚuãÚnãÚgãÚ`ãÚYãÚRãÚKãÚDãÚ=ãÚ6ãÚ/ãÚ(ãÚ!ãÚãÚãÚ ãÚãÚþâÚ÷âÚðâÚéâÚââÚÛâÚÔâÚÍâÚÆâÚ¿âÚ¸âÚ±âÚªâÚ£âÚœâÚ•âÚŽâÚ‡âÚ€âÚyâÚrâÚkâÚdâÚ]âÚVâÚOâÚHâÚAâÚ:âÚ3âÚ,âÚ%âÚâÚâÚâÚ âÚâÚûáÚôáÚíáÚæáÚßáÚØáÚÑáÚÊáÚÃáÚ¼áÚµáÚ®áÚ§áÚ áÚ™áÚ’áÚ‹áÚ„áÚ}áÚváÚoáÚháÚaáÚZáÚSáÚLáÚEáÚ>áÚ7áÚ0áÚ)áÚ"áÚáÚáÚ áÚáÚÿàÚøàÚñàÚêàÚãàÚÜàÚÕàÚÎàÚÇàÚÀàÚ¹àÚ²àÚ«àÚ¤àÚàÚ–àÚàÚˆàÚàÚzàÚsàÚlàÚeàÚ^àÚWàÚPàÚIàÚBàÚ;àÚ4àÚ-àÚ&àÚàÚàÚàÚ àÚàÚüßÚõßÚîßÚçßÚàßÚÙßÚÒßÚËßÚÄßÚ½ßÚ¶ßÚ¯ßÚ¨ßÚ¡ßÚšßÚ“ßÚŒßÚ…ßÚ~ßÚwßÚpßÚißÚbßÚ[ßÚTßÚMßÚFßÚ?ßÚ8ßÚ1ßÚ*ßÚ#ßÚßÚßÚßÚßÚßÚùÞÚòÞÚëÞÚäÞÚÝÞÚÖÞÚÏÞÚÈÞÚÁÞÚºÞÚ³ÞÚ¬ÞÚ¥ÞÚžÞÚ—ÞÚÞÚ‰ÞÚ‚ÞÚ{ÞÚtÞÚmÞÚfÞÚ_ÞÚXÞÚQÞÚJÞÚCÞÚ<ÞÚ5ÞÚ.ÞÚ'ÞÚ ÞÚÞÚÞÚ ÞÚÞÚýÝÚöÝÚïÝÚèÝÚáÝÚÚÝÚÓÝÚÌÝÚÅÝÚ¾ÝÚ·ÝÚ°ÝÚ©ÝÚ¢ÝÚ›ÝÚ”ÝÚÝÚ†ÝÚÝÚxÝÚqÝÚjÝÚcÝÚ\ÝÚUÝÚNÝÚGÝÚ@ÝÚ9ÝÚ2ÝÚ+ÝÚ$ÝÚÝÚÝÚÝÚÝÚÝÚúÜÚóÜÚìÜÚåÜÚÞÜÚ×ÜÚÐÜÚÉÜÚÂÜÚ»ÜÚ´ÜÚ­ÜÚ¦ÜÚŸÜÚ˜ÜÚ‘ÜÚŠÜÚƒÜÚ|ÜÚuÜÚnÜÚgÜÚ`ÜÚYÜÚRÜÚKÜÚDÜÚ=ÜÚ6ÜÚ/ÜÚ(ÜÚ!ÜÚÜÚÜÚ ÜÚÜÚþÛÚ÷ÛÚðÛÚéÛÚâÛÚÛÛÚÔÛÚÍÛÚÆÛÚ¿ÛÚ¸ÛÚ±ÛÚªÛÚ£ÛÚœÛÚ•ÛÚŽÛÚ‡ÛÚ€ÛÚyÛÚrÛÚkÛÚdÛÚ]ÛÚVÛÚOÛÚHÛÚAÛÚ:ÛÚ3ÛÚ,ÛÚ%ÛÚÛÚÛÚÛÚ ÛÚÛÚûÚÚôÚÚíÚÚæÚÚßÚÚØÚÚÑÚÚÊÚÚÃÚÚ¼ÚÚµÚÚ®ÚÚ§ÚÚ ÚÚ™ÚÚ’ÚÚ‹ÚÚ„ÚÚ}ÚÚvÚÚoÚÚhÚÚaÚÚZÚÚSÚÚLÚÚEÚÚ>ÚÚ7ÚÚ0ÚÚ)ÚÚ"ÚÚÚÚÚÚ ÚÚÚÚÿÙÚøÙÚñÙÚêÙÚãÙÚÜÙÚÕÙÚÎÙÚÇÙÚÀÙÚ¹ÙÚ²ÙÚ«ÙÚ¤ÙÚÙÚ–ÙÚÙÚˆÙÚÙÚzÙÚsÙÚlÙÚeÙÚ^ÙÚWÙÚPÙÚIÙÚBÙÚ;ÙÚ4ÙÚ-ÙÚ&ÙÚÙÚÙÚÙÚ ÙÚÙÚüØÚõØÚîØÚçØÚàØÚÙØÚÒØÚËØÚÄØÚ½ØÚ¶ØÚ¯ØÚ¨ØÚ¡ØÚšØÚ“ØÚŒØÚ…ØÚ~ØÚwØÚpØÚiØÚbØÚ[ØÚTØÚMØÚFØÚ?ØÚ8ØÚ1ØÚ*ØÚ#ØÚØÚØÚØÚØÚØÚù×Úò×Úë×Úä×ÚÝ×ÚÖ×ÚÏ×ÚÈ×ÚÁ×Úº×Ú³×Ú¬×Ú¥×Úž×Ú—×Ú×Ú‰×Ú‚×Ú{×Út×Úm×Úf×Ú_×ÚX×ÚQ×ÚJ×ÚC×Ú<×Ú5×Ú.×Ú'×Ú ×Ú×Ú×Ú ×Ú×ÚýÖÚöÖÚïÖÚèÖÚáÖÚÚÖÚÓÖÚÌÖÚÅÖÚ¾ÖÚ·ÖÚ°ÖÚ©ÖÚ¢ÖÚ›ÖÚ”ÖÚÖÚ†ÖÚÖÚxÖÚqÖÚjÖÚcÖÚ\ÖÚUÖÚNÖÚGÖÚ@ÖÚ9ÖÚ2ÖÚ+ÖÚ$ÖÚÖÚÖÚÖÚÖÚÖÚúÕÚóÕÚìÕÚåÕÚÞÕÚ×ÕÚÐÕÚÉÕÚÂÕÚ»ÕÚ´ÕÚ­ÕÚ¦ÕÚŸÕÚ˜ÕÚ‘ÕÚŠÕÚƒÕÚ|ÕÚuÕÚnÕÚgÕÚ`ÕÚYÕÚRÕÚKÕÚDÕÚ=ÕÚ6ÕÚ/ÕÚ(ÕÚ!ÕÚÕÚÕÚ ÕÚÕÚþÔÚ÷ÔÚðÔÚéÔÚâÔÚÛÔÚÔÔÚÍÔÚÆÔÚ¿ÔÚ¸ÔÚ±ÔÚªÔÚ£ÔÚœÔÚ•ÔÚŽÔÚ‡ÔÚ€ÔÚyÔÚrÔÚkÔÚdÔÚ]ÔÚVÔÚOÔÚHÔÚAÔÚ:ÔÚ3ÔÚ,ÔÚ%ÔÚÔÚÔÚÔÚ ÔÚÔÚûÓÚôÓÚíÓÚæÓÚßÓÚØÓÚÑÓÚÊÓÚÃÓÚ¼ÓÚµÓÚ®ÓÚ§ÓÚ ÓÚ™ÓÚ’ÓÚ‹ÓÚ„ÓÚ}ÓÚvÓÚoÓÚhÓÚaÓÚZÓÚSÓÚLÓÚEÓÚ>ÓÚ7ÓÚ0ÓÚ)ÓÚ"ÓÚÓÚÓÚ ÓÚÓÚÿÒÚøÒÚñÒÚêÒÚãÒÚÜÒÚÕÒÚÎÒÚÇÒÚÀÒÚ¹ÒÚ²ÒÚ«ÒÚ¤ÒÚÒÚ–ÒÚÒÚˆÒÚÒÚzÒÚsÒÚlÒÚeÒÚ^ÒÚWÒÚPÒÚIÒÚBÒÚ;ÒÚ4ÒÚ-ÒÚ&ÒÚÒÚÒÚÒÚ ÒÚÒÚüÑÚõÑÚîÑÚçÑÚàÑÚÙÑÚÒÑÚËÑÚÄÑÚ½ÑÚ¶ÑÚ¯ÑÚ¨ÑÚ¡ÑÚšÑÚ“ÑÚŒÑÚ…ÑÚ~ÑÚwÑÚpÑÚiÑÚbÑÚ[ÑÚTÑÚMÑÚFÑÚ?ÑÚ8ÑÚ1ÑÚ*ÑÚ#ÑÚÑÚÑÚÑÚÑÚÑÚùÐÚòÐÚëÐÚäÐÚÝÐÚÖÐÚÏÐÚÈÐÚÁÐÚºÐÚ³ÐÚ¬ÐÚ¥ÐÚžÐÚ—ÐÚÐÚ‰ÐÚ‚ÐÚ{ÐÚtÐÚmÐÚfÐÚ_ÐÚXÐÚQÐÚJÐÚCÐÚ<ÐÚ5ÐÚ.ÐÚ'ÐÚ ÐÚÐÚÐÚ ÐÚÐÚýÏÚöÏÚïÏÚèÏÚáÏÚÚÏÚÓÏÚÌÏÚÅÏÚ¾ÏÚ·ÏÚ°ÏÚ©ÏÚ¢ÏÚ›ÏÚ”ÏÚÏÚ†ÏÚÏÚxÏÚqÏÚjÏÚcÏÚ\ÏÚUÏÚNÏÚGÏÚ@ÏÚ9ÏÚ2ÏÚ+ÏÚ$ÏÚÏÚÏÚÏÚÏÚÏÚúÎÚóÎÚìÎÚåÎÚÞÎÚ×ÎÚÐÎÚÉÎÚÂÎÚ»ÎÚ´ÎÚ­ÎÚ¦ÎÚŸÎÚ˜ÎÚ‘ÎÚŠÎÚƒÎÚ|ÎÚuÎÚnÎÚgÎÚ`ÎÚYÎÚRÎÚKÎÚDÎÚ=ÎÚ6ÎÚ/ÎÚ(ÎÚ!ÎÚÎÚÎÚ ÎÚÎÚþÍÚ÷ÍÚðÍÚéÍÚâÍÚÛÍÚÔÍÚÍÍÚÆÍÚ¿ÍÚ¸ÍÚ±ÍÚªÍÚ£ÍÚœÍÚ•ÍÚŽÍÚ‡ÍÚ€ÍÚyÍÚrÍÚkÍÚdÍÚ]ÍÚVÍÚOÍÚHÍÚAÍÚ:ÍÚ3ÍÚ,ÍÚ%ÍÚÍÚÍÚÍÚ ÍÚÍÚûÌÚôÌÚíÌÚæÌÚßÌÚØÌÚÑÌÚÊÌÚÃÌÚ¼ÌÚµÌÚ®ÌÚ§ÌÚ ÌÚ™ÌÚ’ÌÚ‹ÌÚ„ÌÚ}ÌÚvÌÚoÌÚhÌÚaÌÚZÌÚSÌÚLÌÚEÌÚ>ÌÚ7ÌÚ0ÌÚ)ÌÚ"ÌÚÌÚÌÚ ÌÚÌÚÿËÚøËÚñËÚêËÚãËÚÜËÚÕËÚÎËÚÇËÚÀËÚ¹ËÚ²ËÚ«ËÚ¤ËÚËÚ–ËÚËÚˆËÚËÚzËÚsËÚlËÚeËÚ^ËÚWËÚPËÚIËÚBËÚ;ËÚ4ËÚ-ËÚ&ËÚËÚËÚËÚ ËÚËÚüÊÚõÊÚîÊÚçÊÚàÊÚÙÊÚÒÊÚËÊÚÄÊÚ½ÊÚ¶ÊÚ¯ÊÚ¨ÊÚ¡ÊÚšÊÚ“ÊÚŒÊÚ…ÊÚ~ÊÚwÊÚpÊÚiÊÚbÊÚ[ÊÚTÊÚMÊÚFÊÚ?ÊÚ8ÊÚ1ÊÚ*ÊÚ#ÊÚÊÚÊÚÊÚÊÚÊÚùÉÚòÉÚëÉÚäÉÚÝÉÚÖÉÚÏÉÚÈÉÚÁÉÚºÉÚ³ÉÚ¬ÉÚ¥ÉÚžÉÚ—ÉÚÉÚ‰ÉÚ‚ÉÚ{ÉÚtÉÚmÉÚfÉÚ_ÉÚXÉÚQÉÚJÉÚCÉÚ<ÉÚ5ÉÚ.ÉÚ'ÉÚ ÉÚÉÚÉÚ ÉÚÉÚýÈÚöÈÚïÈÚèÈÚáÈÚÚÈÚÓÈÚÌÈÚÅÈÚ¾ÈÚ·ÈÚ°ÈÚ©ÈÚ¢ÈÚ›ÈÚ”ÈÚÈÚ†ÈÚÈÚxÈÚqÈÚjÈÚcÈÚ\ÈÚUÈÚNÈÚGÈÚ@ÈÚ9ÈÚ2ÈÚ+ÈÚ$ÈÚÈÚÈÚÈÚÈÚÈÚúÇÚóÇÚìÇÚåÇÚÞÇÚ×ÇÚÐÇÚÉÇÚÂÇÚ»ÇÚ´ÇÚ­ÇÚ¦ÇÚŸÇÚ˜ÇÚ‘ÇÚŠÇÚƒÇÚ|ÇÚuÇÚnÇÚgÇÚ`ÇÚYÇÚRÇÚKÇÚDÇÚ=ÇÚ6ÇÚ/ÇÚ(ÇÚ!ÇÚÇÚÇÚ ÇÚÇÚþÆÚ÷ÆÚðÆÚéÆÚâÆÚÛÆÚÔÆÚÍÆÚÆÆÚ¿ÆÚ¸ÆÚ±ÆÚªÆÚ£ÆÚœÆÚ•ÆÚŽÆÚ‡ÆÚ€ÆÚyÆÚrÆÚkÆÚdÆÚ]ÆÚVÆÚOÆÚHÆÚAÆÚ:ÆÚ3ÆÚ,ÆÚ%ÆÚÆÚÆÚÆÚ ÆÚÆÚûÅÚôÅÚíÅÚæÅÚßÅÚØÅÚÑÅÚÊÅÚÃÅÚ¼ÅÚµÅÚ®ÅÚ§ÅÚ ÅÚ™ÅÚ’ÅÚ‹ÅÚ„ÅÚ}ÅÚvÅÚoÅÚhÅÚaÅÚZÅÚSÅÚLÅÚEÅÚ>ÅÚ7ÅÚ0ÅÚ)ÅÚ"ÅÚÅÚÅÚ ÅÚÅÚÿÄÚøÄÚñÄÚêÄÚãÄÚÜÄÚÕÄÚÎÄÚÇÄÚÀÄÚ¹ÄÚ²ÄÚ«ÄÚ¤ÄÚÄÚ–ÄÚÄÚˆÄÚÄÚzÄÚsÄÚlÄÚeÄÚ^ÄÚWÄÚPÄÚIÄÚBÄÚ;ÄÚ4ÄÚ-ÄÚ&ÄÚÄÚÄÚÄÚ ÄÚÄÚüÃÚõÃÚîÃÚçÃÚàÃÚÙÃÚÒÃÚËÃÚÄÃÚ½ÃÚ¶ÃÚ¯ÃÚ¨ÃÚ¡ÃÚšÃÚ“ÃÚŒÃÚ…ÃÚ~ÃÚwÃÚpÃÚiÃÚbÃÚ[ÃÚTÃÚMÃÚFÃÚ?ÃÚ8ÃÚ1ÃÚ*ÃÚ#ÃÚÃÚÃÚÃÚÃÚÃÚùÂÚòÂÚëÂÚäÂÚÝÂÚÖÂÚÏÂÚÈÂÚÁÂÚºÂÚ³ÂÚ¬ÂÚ¥ÂÚžÂÚ—ÂÚÂÚ‰ÂÚ‚ÂÚ{ÂÚtÂÚmÂÚfÂÚ_ÂÚXÂÚQÂÚJÂÚCÂÚ<ÂÚ5ÂÚ.ÂÚ'ÂÚ ÂÚÂÚÂÚ ÂÚÂÚýÁÚöÁÚïÁÚèÁÚáÁÚÚÁÚÓÁÚÌÁÚÅÁÚ¾ÁÚ·ÁÚ°ÁÚ©ÁÚ¢ÁÚ›ÁÚ”ÁÚÁÚ†ÁÚÁÚxÁÚqÁÚjÁÚcÁÚ\ÁÚUÁÚNÁÚGÁÚ@ÁÚ9ÁÚ2ÁÚ+ÁÚ$ÁÚÁÚÁÚÁÚÁÚÁÚúÀÚóÀÚìÀÚåÀÚÞÀÚ×ÀÚÐÀÚÉÀÚÂÀÚ»ÀÚ´ÀÚ­ÀÚ¦ÀÚŸÀÚ˜ÀÚ‘ÀÚŠÀÚƒÀÚ|ÀÚuÀÚnÀÚgÀÚ`ÀÚYÀÚRÀÚKÀÚDÀÚ=ÀÚ6ÀÚ/ÀÚ(ÀÚ!ÀÚÀÚÀÚ ÀÚÀÚþ¿Ú÷¿Úð¿Úé¿Úâ¿ÚÛ¿ÚÔ¿ÚÍ¿ÚÆ¿Ú¿¿Ú¸¿Ú±¿Úª¿Ú£¿Úœ¿Ú•¿ÚŽ¿Ú‡¿Ú€¿Úy¿Úr¿Úk¿Úd¿Ú]¿ÚV¿ÚO¿ÚH¿ÚA¿Ú:¿Ú3¿Ú,¿Ú%¿Ú¿Ú¿Ú¿Ú ¿Ú¿Úû¾Úô¾Úí¾Úæ¾Úß¾ÚؾÚѾÚʾÚþÚ¼¾Úµ¾Ú®¾Ú§¾Ú ¾Ú™¾Ú’¾Ú‹¾Ú„¾Ú}¾Úv¾Úo¾Úh¾Úa¾ÚZ¾ÚS¾ÚL¾ÚE¾Ú>¾Ú7¾Ú0¾Ú)¾Ú"¾Ú¾Ú¾Ú ¾Ú¾Úÿ½Úø½Úñ½Úê½Úã½ÚܽÚÕ½ÚνÚǽÚÀ½Ú¹½Ú²½Ú«½Ú¤½Ú½Ú–½Ú½Úˆ½Ú½Úz½Ús½Úl½Úe½Ú^½ÚW½ÚP½ÚI½ÚB½Ú;½Ú4½Ú-½Ú&½Ú½Ú½Ú½Ú ½Ú½Úü¼Úõ¼Úî¼Úç¼Úà¼ÚÙ¼ÚÒ¼Ú˼ÚļÚ½¼Ú¶¼Ú¯¼Ú¨¼Ú¡¼Úš¼Ú“¼ÚŒ¼Ú…¼Ú~¼Úw¼Úp¼Úi¼Úb¼Ú[¼ÚT¼ÚM¼ÚF¼Ú?¼Ú8¼Ú1¼Ú*¼Ú#¼Ú¼Ú¼Ú¼Ú¼Ú¼Úù»Úò»Úë»Úä»ÚÝ»ÚÖ»ÚÏ»ÚÈ»ÚÁ»Úº»Ú³»Ú¬»Ú¥»Úž»Ú—»Ú»Ú‰»Ú‚»Ú{»Út»Úm»Úf»Ú_»ÚX»ÚQ»ÚJ»ÚC»Ú<»Ú5»Ú.»Ú'»Ú »Ú»Ú»Ú »Ú»ÚýºÚöºÚïºÚèºÚáºÚÚºÚÓºÚ̺ÚźÚ¾ºÚ·ºÚ°ºÚ©ºÚ¢ºÚ›ºÚ”ºÚºÚ†ºÚºÚxºÚqºÚjºÚcºÚ\ºÚUºÚNºÚGºÚ@ºÚ9ºÚ2ºÚ+ºÚ$ºÚºÚºÚºÚºÚºÚú¹Úó¹Úì¹Úå¹ÚÞ¹Ú×¹ÚйÚɹÚ¹Ú»¹Ú´¹Ú­¹Ú¦¹ÚŸ¹Ú˜¹Ú‘¹ÚйÚƒ¹Ú|¹Úu¹Ún¹Úg¹Ú`¹ÚY¹ÚR¹ÚK¹ÚD¹Ú=¹Ú6¹Ú/¹Ú(¹Ú!¹Ú¹Ú¹Ú ¹Ú¹Úþ¸Ú÷¸Úð¸Úé¸Úâ¸ÚÛ¸ÚÔ¸Ú͸ÚƸÚ¿¸Ú¸¸Ú±¸Úª¸Ú£¸Úœ¸Ú•¸ÚޏÚ‡¸Ú€¸Úy¸Úr¸Úk¸Úd¸Ú]¸ÚV¸ÚO¸ÚH¸ÚA¸Ú:¸Ú3¸Ú,¸Ú%¸Ú¸Ú¸Ú¸Ú ¸Ú¸Úû·Úô·Úí·Úæ·Úß·ÚØ·ÚÑ·ÚÊ·Ú÷Ú¼·Úµ·Ú®·Ú§·Ú ·Ú™·Ú’·Ú‹·Ú„·Ú}·Úv·Úo·Úh·Úa·ÚZ·ÚS·ÚL·ÚE·Ú>·Ú7·Ú0·Ú)·Ú"·Ú·Ú·Ú ·Ú·Úÿ¶Úø¶Úñ¶Úê¶Úã¶ÚܶÚÕ¶ÚζÚǶÚÀ¶Ú¹¶Ú²¶Ú«¶Ú¤¶Ú¶Ú–¶Ú¶Úˆ¶Ú¶Úz¶Ús¶Úl¶Úe¶Ú^¶ÚW¶ÚP¶ÚI¶ÚB¶Ú;¶Ú4¶Ú-¶Ú&¶Ú¶Ú¶Ú¶Ú ¶Ú¶ÚüµÚõµÚîµÚçµÚàµÚÙµÚÒµÚ˵ÚĵÚ½µÚ¶µÚ¯µÚ¨µÚ¡µÚšµÚ“µÚŒµÚ…µÚ~µÚwµÚpµÚiµÚbµÚ[µÚTµÚMµÚFµÚ?µÚ8µÚ1µÚ*µÚ#µÚµÚµÚµÚµÚµÚù´Úò´Úë´Úä´ÚÝ´ÚÖ´ÚÏ´ÚÈ´ÚÁ´Úº´Ú³´Ú¬´Ú¥´Úž´Ú—´Ú´Ú‰´Ú‚´Ú{´Út´Úm´Úf´Ú_´ÚX´ÚQ´ÚJ´ÚC´Ú<´Ú5´Ú.´Ú'´Ú ´Ú´Ú´Ú ´Ú´Úý³Úö³Úï³Úè³Úá³ÚÚ³ÚÓ³Ú̳ÚųÚ¾³Ú·³Ú°³Ú©³Ú¢³Ú›³Ú”³Ú³Ú†³Ú³Úx³Úq³Új³Úc³Ú\³ÚU³ÚN³ÚG³Ú@³Ú9³Ú2³Ú+³Ú$³Ú³Ú³Ú³Ú³Ú³Úú²Úó²Úì²Úå²ÚÞ²ÚײÚвÚɲÚ²Ú»²Ú´²Ú­²Ú¦²ÚŸ²Ú˜²Ú‘²ÚвÚƒ²Ú|²Úu²Ún²Úg²Ú`²ÚY²ÚR²ÚK²ÚD²Ú=²Ú6²Ú/²Ú(²Ú!²Ú²Ú²Ú ²Ú²Úþ±Ú÷±Úð±Úé±Úâ±ÚÛ±ÚÔ±ÚͱÚƱÚ¿±Ú¸±Ú±±Úª±Ú£±Úœ±Ú•±ÚޱÚ‡±Ú€±Úy±Úr±Úk±Úd±Ú]±ÚV±ÚO±ÚH±ÚA±Ú:±Ú3±Ú,±Ú%±Ú±Ú±Ú±Ú ±Ú±Úû°Úô°Úí°Úæ°Úß°ÚذÚѰÚʰÚðÚ¼°Úµ°Ú®°Ú§°Ú °Ú™°Ú’°Ú‹°Ú„°Ú}°Úv°Úo°Úh°Úa°ÚZ°ÚS°ÚL°ÚE°Ú>°Ú7°Ú0°Ú)°Ú"°Ú°Ú°Ú °Ú°Úÿ¯Úø¯Úñ¯Úê¯Úã¯ÚܯÚÕ¯ÚίÚǯÚÀ¯Ú¹¯Ú²¯Ú«¯Ú¤¯Ú¯Ú–¯Ú¯Úˆ¯Ú¯Úz¯Ús¯Úl¯Úe¯Ú^¯ÚW¯ÚP¯ÚI¯ÚB¯Ú;¯Ú4¯Ú-¯Ú&¯Ú¯Ú¯Ú¯Ú ¯Ú¯Úü®Úõ®Úî®Úç®Úà®ÚÙ®ÚÒ®ÚË®ÚĮڽ®Ú¶®Ú¯®Ú¨®Ú¡®Úš®Ú“®ÚŒ®Ú…®Ú~®Úw®Úp®Úi®Úb®Ú[®ÚT®ÚM®ÚF®Ú?®Ú8®Ú1®Ú*®Ú#®Ú®Ú®Ú®Ú®Ú®Úù­Úò­Úë­Úä­ÚÝ­ÚÖ­ÚÏ­ÚÈ­ÚÁ­Úº­Ú³­Ú¬­Ú¥­Úž­Ú—­Ú­Ú‰­Ú‚­Ú{­Út­Úm­Úf­Ú_­ÚX­ÚQ­ÚJ­ÚC­Ú<­Ú5­Ú.­Ú'­Ú ­Ú­Ú­Ú ­Ú­Úý¬Úö¬Úï¬Úè¬Úá¬ÚÚ¬ÚÓ¬Ú̬ÚŬÚ¾¬Ú·¬Ú°¬Ú©¬Ú¢¬Ú›¬Ú”¬Ú¬Ú†¬Ú¬Úx¬Úq¬Új¬Úc¬Ú\¬ÚU¬ÚN¬ÚG¬Ú@¬Ú9¬Ú2¬Ú+¬Ú$¬Ú¬Ú¬Ú¬Ú¬Ú¬Úú«Úó«Úì«Úå«ÚÞ«Ú׫ÚЫÚɫګڻ«Ú´«Ú­«Ú¦«ÚŸ«Ú˜«Ú‘«ÚŠ«Úƒ«Ú|«Úu«Ún«Úg«Ú`«ÚY«ÚR«ÚK«ÚD«Ú=«Ú6«Ú/«Ú(«Ú!«Ú«Ú«Ú «Ú«ÚþªÚ÷ªÚðªÚéªÚâªÚÛªÚÔªÚͪÚƪÚ¿ªÚ¸ªÚ±ªÚªªÚ£ªÚœªÚ•ªÚŽªÚ‡ªÚ€ªÚyªÚrªÚkªÚdªÚ]ªÚVªÚOªÚHªÚAªÚ:ªÚ3ªÚ,ªÚ%ªÚªÚªÚªÚ ªÚªÚû©Úô©Úí©Úæ©Úß©ÚØ©ÚÑ©ÚÊ©ÚéÚ¼©Úµ©Ú®©Ú§©Ú ©Ú™©Ú’©Ú‹©Ú„©Ú}©Úv©Úo©Úh©Úa©ÚZ©ÚS©ÚL©ÚE©Ú>©Ú7©Ú0©Ú)©Ú"©Ú©Ú©Ú ©Ú©Úÿ¨Úø¨Úñ¨Úê¨Úã¨ÚܨÚÕ¨ÚΨÚǨÚÀ¨Ú¹¨Ú²¨Ú«¨Ú¤¨Ú¨Ú–¨Ú¨Úˆ¨Ú¨Úz¨Ús¨Úl¨Úe¨Ú^¨ÚW¨ÚP¨ÚI¨ÚB¨Ú;¨Ú4¨Ú-¨Ú&¨Ú¨Ú¨Ú¨Ú ¨Ú¨Úü§Úõ§Úî§Úç§Úà§ÚÙ§ÚÒ§Ú˧ÚħÚ½§Ú¶§Ú¯§Ú¨§Ú¡§Úš§Ú“§ÚŒ§Ú…§Ú~§Úw§Úp§Úi§Úb§Ú[§ÚT§ÚM§ÚF§Ú?§Ú8§Ú1§Ú*§Ú#§Ú§Ú§Ú§Ú§Ú§Úù¦Úò¦Úë¦Úä¦ÚݦÚÖ¦ÚϦÚȦÚÁ¦Úº¦Ú³¦Ú¬¦Ú¥¦Úž¦Ú—¦Ú¦Ú‰¦Ú‚¦Ú{¦Út¦Úm¦Úf¦Ú_¦ÚX¦ÚQ¦ÚJ¦ÚC¦Ú<¦Ú5¦Ú.¦Ú'¦Ú ¦Ú¦Ú¦Ú ¦Ú¦Úý¥Úö¥Úï¥Úè¥Úá¥ÚÚ¥ÚÓ¥ÚÌ¥ÚÅ¥Ú¾¥Ú·¥Ú°¥Ú©¥Ú¢¥Ú›¥Ú”¥Ú¥Ú†¥Ú¥Úx¥Úq¥Új¥Úc¥Ú\¥ÚU¥ÚN¥ÚG¥Ú@¥Ú9¥Ú2¥Ú+¥Ú$¥Ú¥Ú¥Ú¥Ú¥Ú¥Úú¤Úó¤Úì¤Úå¤ÚÞ¤ÚפÚФÚɤÚ¤Ú»¤Ú´¤Ú­¤Ú¦¤ÚŸ¤Ú˜¤Ú‘¤ÚФÚƒ¤Ú|¤Úu¤Ún¤Úg¤Ú`¤ÚY¤ÚR¤ÚK¤ÚD¤Ú=¤Ú6¤Ú/¤Ú(¤Ú!¤Ú¤Ú¤Ú ¤Ú¤Úþ£Ú÷£Úð£Úé£Úâ£ÚÛ£ÚÔ£ÚÍ£ÚÆ£Ú¿£Ú¸£Ú±£Úª£Ú££Úœ£Ú•£ÚŽ£Ú‡£Ú€£Úy£Úr£Úk£Úd£Ú]£ÚV£ÚO£ÚH£ÚA£Ú:£Ú3£Ú,£Ú%£Ú£Ú£Ú£Ú £Ú£Úû¢Úô¢Úí¢Úæ¢ÚߢÚØ¢ÚÑ¢ÚÊ¢ÚâÚ¼¢Úµ¢Ú®¢Ú§¢Ú ¢Ú™¢Ú’¢Ú‹¢Ú„¢Ú}¢Úv¢Úo¢Úh¢Úa¢ÚZ¢ÚS¢ÚL¢ÚE¢Ú>¢Ú7¢Ú0¢Ú)¢Ú"¢Ú¢Ú¢Ú ¢Ú¢Úÿ¡Úø¡Úñ¡Úê¡Úã¡ÚÜ¡ÚÕ¡ÚΡÚÇ¡ÚÀ¡Ú¹¡Ú²¡Ú«¡Ú¤¡Ú¡Ú–¡Ú¡Úˆ¡Ú¡Úz¡Ús¡Úl¡Úe¡Ú^¡ÚW¡ÚP¡ÚI¡ÚB¡Ú;¡Ú4¡Ú-¡Ú&¡Ú¡Ú¡Ú¡Ú ¡Ú¡Úü Úõ Úî Úç Úà ÚÙ ÚÒ ÚË ÚÄ Ú½ Ú¶ Ú¯ Ú¨ Ú¡ Úš Ú“ ÚŒ Ú… Ú~ Úw Úp Úi Úb Ú[ ÚT ÚM ÚF Ú? Ú8 Ú1 Ú* Ú# Ú Ú Ú Ú Ú ÚùŸÚòŸÚëŸÚäŸÚÝŸÚÖŸÚÏŸÚÈŸÚÁŸÚºŸÚ³ŸÚ¬ŸÚ¥ŸÚžŸÚ—ŸÚŸÚ‰ŸÚ‚ŸÚ{ŸÚtŸÚmŸÚfŸÚ_ŸÚXŸÚQŸÚJŸÚCŸÚ<ŸÚ5ŸÚ.ŸÚ'ŸÚ ŸÚŸÚŸÚ ŸÚŸÚýžÚöžÚïžÚèžÚážÚÚžÚÓžÚÌžÚÅžÚ¾žÚ·žÚ°žÚ©žÚ¢žÚ›žÚ”žÚžÚ†žÚžÚxžÚqžÚjžÚcžÚ\žÚUžÚNžÚGžÚ@žÚ9žÚ2žÚ+žÚ$žÚžÚžÚžÚžÚžÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþœÚ÷œÚðœÚéœÚâœÚÛœÚÔœÚÍœÚÆœÚ¿œÚ¸œÚ±œÚªœÚ£œÚœœÚ•œÚŽœÚ‡œÚ€œÚyœÚrœÚkœÚdœÚ]œÚVœÚOœÚHœÚAœÚ:œÚ3œÚ,œÚ%œÚœÚœÚœÚ œÚœÚû›Úô›Úí›Úæ›Úß›ÚØ›ÚÑ›ÚÊ›ÚÛÚ¼›Úµ›Ú®›Ú§›Ú ›Ú™›Ú’›Ú‹›Ú„›Ú}›Úv›Úo›Úh›Úa›ÚZ›ÚS›ÚL›ÚE›Ú>›Ú7›Ú0›Ú)›Ú"›Ú›Ú›Ú ›Ú›ÚÿšÚøšÚñšÚêšÚãšÚÜšÚÕšÚΚÚÇšÚÀšÚ¹šÚ²šÚ«šÚ¤šÚšÚ–šÚšÚˆšÚšÚzšÚsšÚlšÚešÚ^šÚWšÚPšÚIšÚBšÚ;šÚ4šÚ-šÚ&šÚšÚšÚšÚ šÚšÚü™Úõ™Úî™Úç™Úà™ÚÙ™ÚÒ™ÚË™Úęڽ™Ú¶™Ú¯™Ú¨™Ú¡™Úš™Ú“™ÚŒ™Ú…™Ú~™Úw™Úp™Úi™Úb™Ú[™ÚT™ÚM™ÚF™Ú?™Ú8™Ú1™Ú*™Ú#™Ú™Ú™Ú™Ú™Ú™Úù˜Úò˜Úë˜Úä˜ÚݘÚÖ˜ÚϘÚȘÚÁ˜Úº˜Ú³˜Ú¬˜Ú¥˜Úž˜Ú—˜Ú˜Ú‰˜Ú‚˜Ú{˜Út˜Úm˜Úf˜Ú_˜ÚX˜ÚQ˜ÚJ˜ÚC˜Ú<˜Ú5˜Ú.˜Ú'˜Ú ˜Ú˜Ú˜Ú ˜Ú˜Úý—Úö—Úï—Úè—Úá—ÚÚ—ÚÓ—ÚÌ—ÚÅ—Ú¾—Ú·—Ú°—Ú©—Ú¢—Ú›—Ú”—Ú—Ú†—Ú—Úx—Úq—Új—Úc—Ú\—ÚU—ÚN—ÚG—Ú@—Ú9—Ú2—Ú+—Ú$—Ú—Ú—Ú—Ú—Ú—Úú–Úó–Úì–Úå–ÚÞ–Ú×–ÚЖÚÉ–Ú–Ú»–Ú´–Ú­–Ú¦–ÚŸ–Ú˜–Ú‘–ÚŠ–Úƒ–Ú|–Úu–Ún–Úg–Ú`–ÚY–ÚR–ÚK–ÚD–Ú=–Ú6–Ú/–Ú(–Ú!–Ú–Ú–Ú –Ú–Úþ•Ú÷•Úð•Úé•Úâ•ÚÛ•ÚÔ•ÚÍ•ÚÆ•Ú¿•Ú¸•Ú±•Úª•Ú£•Úœ•Ú••ÚŽ•Ú‡•Ú€•Úy•Úr•Úk•Úd•Ú]•ÚV•ÚO•ÚH•ÚA•Ú:•Ú3•Ú,•Ú%•Ú•Ú•Ú•Ú •Ú•Úû”Úô”Úí”Úæ”Úß”ÚØ”ÚÑ”ÚÊ”ÚÔÚ¼”Úµ”Ú®”Ú§”Ú ”Ú™”Ú’”Ú‹”Ú„”Ú}”Úv”Úo”Úh”Úa”ÚZ”ÚS”ÚL”ÚE”Ú>”Ú7”Ú0”Ú)”Ú"”Ú”Ú”Ú ”Ú”Úÿ“Úø“Úñ“Úê“Úã“ÚÜ“ÚÕ“ÚΓÚÇ“ÚÀ“Ú¹“Ú²“Ú«“Ú¤“Ú“Ú–“Ú“Úˆ“Ú“Úz“Ús“Úl“Úe“Ú^“ÚW“ÚP“ÚI“ÚB“Ú;“Ú4“Ú-“Ú&“Ú“Ú“Ú“Ú “Ú“Úü’Úõ’Úî’Úç’Úà’ÚÙ’ÚÒ’ÚË’ÚÄ’Ú½’Ú¶’Ú¯’Ú¨’Ú¡’Úš’Ú“’ÚŒ’Ú…’Ú~’Úw’Úp’Úi’Úb’Ú[’ÚT’ÚM’ÚF’Ú?’Ú8’Ú1’Ú*’Ú#’Ú’Ú’Ú’Ú’Ú’Úù‘Úò‘Úë‘Úä‘ÚÝ‘ÚÖ‘ÚÏ‘ÚÈ‘ÚÁ‘Úº‘Ú³‘Ú¬‘Ú¥‘Úž‘Ú—‘Ú‘Ú‰‘Ú‚‘Ú{‘Út‘Úm‘Úf‘Ú_‘ÚX‘ÚQ‘ÚJ‘ÚC‘Ú<‘Ú5‘Ú.‘Ú'‘Ú ‘Ú‘Ú‘Ú ‘Ú‘ÚýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþŽÚ÷ŽÚðŽÚéŽÚâŽÚÛŽÚÔŽÚÍŽÚÆŽÚ¿ŽÚ¸ŽÚ±ŽÚªŽÚ£ŽÚœŽÚ•ŽÚŽŽÚ‡ŽÚ€ŽÚyŽÚrŽÚkŽÚdŽÚ]ŽÚVŽÚOŽÚHŽÚAŽÚ:ŽÚ3ŽÚ,ŽÚ%ŽÚŽÚŽÚŽÚ ŽÚŽÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿŒÚøŒÚñŒÚêŒÚãŒÚÜŒÚÕŒÚÎŒÚÇŒÚÀŒÚ¹ŒÚ²ŒÚ«ŒÚ¤ŒÚŒÚ–ŒÚŒÚˆŒÚŒÚzŒÚsŒÚlŒÚeŒÚ^ŒÚWŒÚPŒÚIŒÚBŒÚ;ŒÚ4ŒÚ-ŒÚ&ŒÚŒÚŒÚŒÚ ŒÚŒÚü‹Úõ‹Úî‹Úç‹Úà‹ÚÙ‹ÚÒ‹ÚË‹Úċڽ‹Ú¶‹Ú¯‹Ú¨‹Ú¡‹Úš‹Ú“‹ÚŒ‹Ú…‹Ú~‹Úw‹Úp‹Úi‹Úb‹Ú[‹ÚT‹ÚM‹ÚF‹Ú?‹Ú8‹Ú1‹Ú*‹Ú#‹Ú‹Ú‹Ú‹Ú‹Ú‹ÚùŠÚòŠÚëŠÚäŠÚÝŠÚÖŠÚÏŠÚÈŠÚÁŠÚºŠÚ³ŠÚ¬ŠÚ¥ŠÚžŠÚ—ŠÚŠÚ‰ŠÚ‚ŠÚ{ŠÚtŠÚmŠÚfŠÚ_ŠÚXŠÚQŠÚJŠÚCŠÚ<ŠÚ5ŠÚ.ŠÚ'ŠÚ ŠÚŠÚŠÚ ŠÚŠÚý‰Úö‰Úï‰Úè‰Úá‰ÚÚ‰ÚÓ‰Ú̉ÚʼnÚ¾‰Ú·‰Ú°‰Ú©‰Ú¢‰Ú›‰Ú”‰Ú‰Ú†‰Ú‰Úx‰Úq‰Új‰Úc‰Ú\‰ÚU‰ÚN‰ÚG‰Ú@‰Ú9‰Ú2‰Ú+‰Ú$‰Ú‰Ú‰Ú‰Ú‰Ú‰ÚúˆÚóˆÚìˆÚåˆÚÞˆÚ׈ÚЈÚɈÚˆÚ»ˆÚ´ˆÚ­ˆÚ¦ˆÚŸˆÚ˜ˆÚ‘ˆÚŠˆÚƒˆÚ|ˆÚuˆÚnˆÚgˆÚ`ˆÚYˆÚRˆÚKˆÚDˆÚ=ˆÚ6ˆÚ/ˆÚ(ˆÚ!ˆÚˆÚˆÚ ˆÚˆÚþ‡Ú÷‡Úð‡Úé‡Úâ‡ÚÛ‡ÚÔ‡Ú͇ÚƇÚ¿‡Ú¸‡Ú±‡Úª‡Ú£‡Úœ‡Ú•‡ÚއÚ‡‡Ú€‡Úy‡Úr‡Úk‡Úd‡Ú]‡ÚV‡ÚO‡ÚH‡ÚA‡Ú:‡Ú3‡Ú,‡Ú%‡Ú‡Ú‡Ú‡Ú ‡Ú‡Úû†Úô†Úí†Úæ†Ú߆Ú؆ÚцÚʆÚÆÚ¼†Úµ†Ú®†Ú§†Ú †Ú™†Ú’†Ú‹†Ú„†Ú}†Úv†Úo†Úh†Úa†ÚZ†ÚS†ÚL†ÚE†Ú>†Ú7†Ú0†Ú)†Ú"†Ú†Ú†Ú †Ú†Úÿ…Úø…Úñ…Úê…Úã…ÚÜ…ÚÕ…ÚÎ…ÚÇ…ÚÀ…Ú¹…Ú²…Ú«…Ú¤…Ú…Ú–…Ú…Úˆ…Ú…Úz…Ús…Úl…Úe…Ú^…ÚW…ÚP…ÚI…ÚB…Ú;…Ú4…Ú-…Ú&…Ú…Ú…Ú…Ú …Ú…Úü„Úõ„Úî„Úç„Úà„ÚÙ„ÚÒ„Ú˄ڥڽ„Ú¶„Ú¯„Ú¨„Ú¡„Úš„Ú“„ÚŒ„Ú…„Ú~„Úw„Úp„Úi„Úb„Ú[„ÚT„ÚM„ÚF„Ú?„Ú8„Ú1„Ú*„Ú#„Ú„Ú„Ú„Ú„Ú„ÚùƒÚòƒÚëƒÚäƒÚ݃ÚÖƒÚσÚȃÚÁƒÚºƒÚ³ƒÚ¬ƒÚ¥ƒÚžƒÚ—ƒÚƒÚ‰ƒÚ‚ƒÚ{ƒÚtƒÚmƒÚfƒÚ_ƒÚXƒÚQƒÚJƒÚCƒÚ<ƒÚ5ƒÚ.ƒÚ'ƒÚ ƒÚƒÚƒÚ ƒÚƒÚý‚Úö‚Úï‚Úè‚Úá‚ÚÚ‚ÚÓ‚ÚÌ‚Úłھ‚Ú·‚Ú°‚Ú©‚Ú¢‚Ú›‚Ú”‚Ú‚Ú†‚Ú‚Úx‚Úq‚Új‚Úc‚Ú\‚ÚU‚ÚN‚ÚG‚Ú@‚Ú9‚Ú2‚Ú+‚Ú$‚Ú‚Ú‚Ú‚Ú‚Ú‚ÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþ€Ú÷€Úð€Úé€Úâ€ÚÛ€ÚÔ€ÚÍ€ÚÆ€Ú¿€Ú¸€Ú±€Úª€Ú£€Úœ€Ú•€ÚŽ€Ú‡€Ú€€Úy€Úr€Úk€Úd€Ú]€ÚV€ÚO€ÚH€ÚA€Ú:€Ú3€Ú,€Ú%€Ú€Ú€Ú€Ú €Ú€ÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿ~Úø~Úñ~Úê~Úã~ÚÜ~ÚÕ~ÚÎ~ÚÇ~ÚÀ~Ú¹~Ú²~Ú«~Ú¤~Ú~Ú–~Ú~Úˆ~Ú~Úz~Ús~Úl~Úe~Ú^~ÚW~ÚP~ÚI~ÚB~Ú;~Ú4~Ú-~Ú&~Ú~Ú~Ú~Ú ~Ú~Úü}Úõ}Úî}Úç}Úà}ÚÙ}ÚÒ}ÚË}ÚÄ}Ú½}Ú¶}Ú¯}Ú¨}Ú¡}Úš}Ú“}ÚŒ}Ú…}Ú~}Úw}Úp}Úi}Úb}Ú[}ÚT}ÚM}ÚF}Ú?}Ú8}Ú1}Ú*}Ú#}Ú}Ú}Ú}Ú}Ú}Úù|Úò|Úë|Úä|ÚÝ|ÚÖ|ÚÏ|ÚÈ|ÚÁ|Úº|Ú³|Ú¬|Ú¥|Úž|Ú—|Ú|Ú‰|Ú‚|Ú{|Út|Úm|Úf|Ú_|ÚX|ÚQ|ÚJ|ÚC|Ú<|Ú5|Ú.|Ú'|Ú |Ú|Ú|Ú |Ú|Úý{Úö{Úï{Úè{Úá{ÚÚ{ÚÓ{ÚÌ{ÚÅ{Ú¾{Ú·{Ú°{Ú©{Ú¢{Ú›{Ú”{Ú{Ú†{Ú{Úx{Úq{Új{Úc{Ú\{ÚU{ÚN{ÚG{Ú@{Ú9{Ú2{Ú+{Ú${Ú{Ú{Ú{Ú{Ú{ÚúzÚózÚìzÚåzÚÞzÚ×zÚÐzÚÉzÚÂzÚ»zÚ´zÚ­zÚ¦zÚŸzÚ˜zÚ‘zÚŠzÚƒzÚ|zÚuzÚnzÚgzÚ`zÚYzÚRzÚKzÚDzÚ=zÚ6zÚ/zÚ(zÚ!zÚzÚzÚ zÚzÚþyÚ÷yÚðyÚéyÚâyÚÛyÚÔyÚÍyÚÆyÚ¿yÚ¸yÚ±yÚªyÚ£yÚœyÚ•yÚŽyÚ‡yÚ€yÚyyÚryÚkyÚdyÚ]yÚVyÚOyÚHyÚAyÚ:yÚ3yÚ,yÚ%yÚyÚyÚyÚ yÚyÚûxÚôxÚíxÚæxÚßxÚØxÚÑxÚÊxÚÃxÚ¼xÚµxÚ®xÚ§xÚ xÚ™xÚ’xÚ‹xÚ„xÚ}xÚvxÚoxÚhxÚaxÚZxÚSxÚLxÚExÚ>xÚ7xÚ0xÚ)xÚ"xÚxÚxÚ xÚxÚÿwÚøwÚñwÚêwÚãwÚÜwÚÕwÚÎwÚÇwÚÀwÚ¹wÚ²wÚ«wÚ¤wÚwÚ–wÚwÚˆwÚwÚzwÚswÚlwÚewÚ^wÚWwÚPwÚIwÚBwÚ;wÚ4wÚ-wÚ&wÚwÚwÚwÚ wÚwÚüvÚõvÚîvÚçvÚàvÚÙvÚÒvÚËvÚÄvÚ½vÚ¶vÚ¯vÚ¨vÚ¡vÚšvÚ“vÚŒvÚ…vÚ~vÚwvÚpvÚivÚbvÚ[vÚTvÚMvÚFvÚ?vÚ8vÚ1vÚ*vÚ#vÚvÚvÚvÚvÚvÚùuÚòuÚëuÚäuÚÝuÚÖuÚÏuÚÈuÚÁuÚºuÚ³uÚ¬uÚ¥uÚžuÚ—uÚuÚ‰uÚ‚uÚ{uÚtuÚmuÚfuÚ_uÚXuÚQuÚJuÚCuÚqÚ7qÚ0qÚ)qÚ"qÚqÚqÚ qÚqÚÿpÚøpÚñpÚêpÚãpÚÜpÚÕpÚÎpÚÇpÚÀpÚ¹pÚ²pÚ«pÚ¤pÚpÚ–pÚpÚˆpÚpÚzpÚspÚlpÚepÚ^pÚWpÚPpÚIpÚBpÚ;pÚ4pÚ-pÚ&pÚpÚpÚpÚ pÚpÚüoÚõoÚîoÚçoÚàoÚÙoÚÒoÚËoÚÄoÚ½oÚ¶oÚ¯oÚ¨oÚ¡oÚšoÚ“oÚŒoÚ…oÚ~oÚwoÚpoÚioÚboÚ[oÚToÚMoÚFoÚ?oÚ8oÚ1oÚ*oÚ#oÚoÚoÚoÚoÚoÚùnÚònÚënÚänÚÝnÚÖnÚÏnÚÈnÚÁnÚºnÚ³nÚ¬nÚ¥nÚžnÚ—nÚnÚ‰nÚ‚nÚ{nÚtnÚmnÚfnÚ_nÚXnÚQnÚJnÚCnÚjÚ7jÚ0jÚ)jÚ"jÚjÚjÚ jÚjÚÿiÚøiÚñiÚêiÚãiÚÜiÚÕiÚÎiÚÇiÚÀiÚ¹iÚ²iÚ«iÚ¤iÚiÚ–iÚiÚˆiÚiÚziÚsiÚliÚeiÚ^iÚWiÚPiÚIiÚBiÚ;iÚ4iÚ-iÚ&iÚiÚiÚiÚ iÚiÚühÚõhÚîhÚçhÚàhÚÙhÚÒhÚËhÚÄhÚ½hÚ¶hÚ¯hÚ¨hÚ¡hÚšhÚ“hÚŒhÚ…hÚ~hÚwhÚphÚihÚbhÚ[hÚThÚMhÚFhÚ?hÚ8hÚ1hÚ*hÚ#hÚhÚhÚhÚhÚhÚùgÚògÚëgÚägÚÝgÚÖgÚÏgÚÈgÚÁgÚºgÚ³gÚ¬gÚ¥gÚžgÚ—gÚgÚ‰gÚ‚gÚ{gÚtgÚmgÚfgÚ_gÚXgÚQgÚJgÚCgÚcÚ7cÚ0cÚ)cÚ"cÚcÚcÚ cÚcÚÿbÚøbÚñbÚêbÚãbÚÜbÚÕbÚÎbÚÇbÚÀbÚ¹bÚ²bÚ«bÚ¤bÚbÚ–bÚbÚˆbÚbÚzbÚsbÚlbÚebÚ^bÚWbÚPbÚIbÚBbÚ;bÚ4bÚ-bÚ&bÚbÚbÚbÚ bÚbÚüaÚõaÚîaÚçaÚàaÚÙaÚÒaÚËaÚÄaÚ½aÚ¶aÚ¯aÚ¨aÚ¡aÚšaÚ“aÚŒaÚ…aÚ~aÚwaÚpaÚiaÚbaÚ[aÚTaÚMaÚFaÚ?aÚ8aÚ1aÚ*aÚ#aÚaÚaÚaÚaÚaÚù`Úò`Úë`Úä`ÚÝ`ÚÖ`ÚÏ`ÚÈ`ÚÁ`Úº`Ú³`Ú¬`Ú¥`Úž`Ú—`Ú`Ú‰`Ú‚`Ú{`Út`Úm`Úf`Ú_`ÚX`ÚQ`ÚJ`ÚC`Ú<`Ú5`Ú.`Ú'`Ú `Ú`Ú`Ú `Ú`Úý_Úö_Úï_Úè_Úá_ÚÚ_ÚÓ_ÚÌ_ÚÅ_Ú¾_Ú·_Ú°_Ú©_Ú¢_Ú›_Ú”_Ú_Ú†_Ú_Úx_Úq_Új_Úc_Ú\_ÚU_ÚN_ÚG_Ú@_Ú9_Ú2_Ú+_Ú$_Ú_Ú_Ú_Ú_Ú_Úú^Úó^Úì^Úå^ÚÞ^Ú×^ÚÐ^ÚÉ^ÚÂ^Ú»^Ú´^Ú­^Ú¦^ÚŸ^Ú˜^Ú‘^ÚŠ^Úƒ^Ú|^Úu^Ún^Úg^Ú`^ÚY^ÚR^ÚK^ÚD^Ú=^Ú6^Ú/^Ú(^Ú!^Ú^Ú^Ú ^Ú^Úþ]Ú÷]Úð]Úé]Úâ]ÚÛ]ÚÔ]ÚÍ]ÚÆ]Ú¿]Ú¸]Ú±]Úª]Ú£]Úœ]Ú•]ÚŽ]Ú‡]Ú€]Úy]Úr]Úk]Úd]Ú]]ÚV]ÚO]ÚH]ÚA]Ú:]Ú3]Ú,]Ú%]Ú]Ú]Ú]Ú ]Ú]Úû\Úô\Úí\Úæ\Úß\ÚØ\ÚÑ\ÚÊ\ÚÃ\Ú¼\Úµ\Ú®\Ú§\Ú \Ú™\Ú’\Ú‹\Ú„\Ú}\Úv\Úo\Úh\Úa\ÚZ\ÚS\ÚL\ÚE\Ú>\Ú7\Ú0\Ú)\Ú"\Ú\Ú\Ú \Ú\Úÿ[Úø[Úñ[Úê[Úã[ÚÜ[ÚÕ[ÚÎ[ÚÇ[ÚÀ[Ú¹[Ú²[Ú«[Ú¤[Ú[Ú–[Ú[Úˆ[Ú[Úz[Ús[Úl[Úe[Ú^[ÚW[ÚP[ÚI[ÚB[Ú;[Ú4[Ú-[Ú&[Ú[Ú[Ú[Ú [Ú[ÚüZÚõZÚîZÚçZÚàZÚÙZÚÒZÚËZÚÄZÚ½ZÚ¶ZÚ¯ZÚ¨ZÚ¡ZÚšZÚ“ZÚŒZÚ…ZÚ~ZÚwZÚpZÚiZÚbZÚ[ZÚTZÚMZÚFZÚ?ZÚ8ZÚ1ZÚ*ZÚ#ZÚZÚZÚZÚZÚZÚùYÚòYÚëYÚäYÚÝYÚÖYÚÏYÚÈYÚÁYÚºYÚ³YÚ¬YÚ¥YÚžYÚ—YÚYÚ‰YÚ‚YÚ{YÚtYÚmYÚfYÚ_YÚXYÚQYÚJYÚCYÚUÚ7UÚ0UÚ)UÚ"UÚUÚUÚ UÚUÚÿTÚøTÚñTÚêTÚãTÚÜTÚÕTÚÎTÚÇTÚÀTÚ¹TÚ²TÚ«TÚ¤TÚTÚ–TÚTÚˆTÚTÚzTÚsTÚlTÚeTÚ^TÚWTÚPTÚITÚBTÚ;TÚ4TÚ-TÚ&TÚTÚTÚTÚ TÚTÚüSÚõSÚîSÚçSÚàSÚÙSÚÒSÚËSÚÄSÚ½SÚ¶SÚ¯SÚ¨SÚ¡SÚšSÚ“SÚŒSÚ…SÚ~SÚwSÚpSÚiSÚbSÚ[SÚTSÚMSÚFSÚ?SÚ8SÚ1SÚ*SÚ#SÚSÚSÚSÚSÚSÚùRÚòRÚëRÚäRÚÝRÚÖRÚÏRÚÈRÚÁRÚºRÚ³RÚ¬RÚ¥RÚžRÚ—RÚRÚ‰RÚ‚RÚ{RÚtRÚmRÚfRÚ_RÚXRÚQRÚJRÚCRÚNÚ7NÚ0NÚ)NÚ"NÚNÚNÚ NÚNÚÿMÚøMÚñMÚêMÚãMÚÜMÚÕMÚÎMÚÇMÚÀMÚ¹MÚ²MÚ«MÚ¤MÚMÚ–MÚMÚˆMÚMÚzMÚsMÚlMÚeMÚ^MÚWMÚPMÚIMÚBMÚ;MÚ4MÚ-MÚ&MÚMÚMÚMÚ MÚMÚüLÚõLÚîLÚçLÚàLÚÙLÚÒLÚËLÚÄLÚ½LÚ¶LÚ¯LÚ¨LÚ¡LÚšLÚ“LÚŒLÚ…LÚ~LÚwLÚpLÚiLÚbLÚ[LÚTLÚMLÚFLÚ?LÚ8LÚ1LÚ*LÚ#LÚLÚLÚLÚLÚLÚùKÚòKÚëKÚäKÚÝKÚÖKÚÏKÚÈKÚÁKÚºKÚ³KÚ¬KÚ¥KÚžKÚ—KÚKÚ‰KÚ‚KÚ{KÚtKÚmKÚfKÚ_KÚXKÚQKÚJKÚCKÚGÚ7GÚ0GÚ)GÚ"GÚGÚGÚ GÚGÚÿFÚøFÚñFÚêFÚãFÚÜFÚÕFÚÎFÚÇFÚÀFÚ¹FÚ²FÚ«FÚ¤FÚFÚ–FÚFÚˆFÚFÚzFÚsFÚlFÚeFÚ^FÚWFÚPFÚIFÚBFÚ;FÚ4FÚ-FÚ&FÚFÚFÚFÚ FÚFÚüEÚõEÚîEÚçEÚàEÚÙEÚÒEÚËEÚÄEÚ½EÚ¶EÚ¯EÚ¨EÚ¡EÚšEÚ“EÚŒEÚ…EÚ~EÚwEÚpEÚiEÚbEÚ[EÚTEÚMEÚFEÚ?EÚ8EÚ1EÚ*EÚ#EÚEÚEÚEÚEÚEÚùDÚòDÚëDÚäDÚÝDÚÖDÚÏDÚÈDÚÁDÚºDÚ³DÚ¬DÚ¥DÚžDÚ—DÚDÚ‰DÚ‚DÚ{DÚtDÚmDÚfDÚ_DÚXDÚQDÚJDÚCDÚ@Ú7@Ú0@Ú)@Ú"@Ú@Ú@Ú @Ú@Úÿ?Úø?Úñ?Úê?Úã?ÚÜ?ÚÕ?ÚÎ?ÚÇ?ÚÀ?Ú¹?Ú²?Ú«?Ú¤?Ú?Ú–?Ú?Úˆ?Ú?Úz?Ús?Úl?Úe?Ú^?ÚW?ÚP?ÚI?ÚB?Ú;?Ú4?Ú-?Ú&?Ú?Ú?Ú?Ú ?Ú?Úü>Úõ>Úî>Úç>Úà>ÚÙ>ÚÒ>ÚË>ÚÄ>Ú½>Ú¶>Ú¯>Ú¨>Ú¡>Úš>Ú“>ÚŒ>Ú…>Ú~>Úw>Úp>Úi>Úb>Ú[>ÚT>ÚM>ÚF>Ú?>Ú8>Ú1>Ú*>Ú#>Ú>Ú>Ú>Ú>Ú>Úù=Úò=Úë=Úä=ÚÝ=ÚÖ=ÚÏ=ÚÈ=ÚÁ=Úº=Ú³=Ú¬=Ú¥=Úž=Ú—=Ú=Ú‰=Ú‚=Ú{=Út=Úm=Úf=Ú_=ÚX=ÚQ=ÚJ=ÚC=Ú<=Ú5=Ú.=Ú'=Ú =Ú=Ú=Ú =Ú=Úý<Úö<Úï<Úè<Úá<ÚÚ<ÚÓ<ÚÌ<ÚÅ<Ú¾<Ú·<Ú°<Ú©<Ú¢<Ú›<Ú”<Ú<Ú†<Ú<Úx<Úq<Új<Úc<Ú\<ÚU<ÚN<ÚG<Ú@<Ú9<Ú2<Ú+<Ú$<Ú<Ú<Ú<Ú<Ú<Úú;Úó;Úì;Úå;ÚÞ;Ú×;ÚÐ;ÚÉ;ÚÂ;Ú»;Ú´;Ú­;Ú¦;ÚŸ;Ú˜;Ú‘;ÚŠ;Úƒ;Ú|;Úu;Ún;Úg;Ú`;ÚY;ÚR;ÚK;ÚD;Ú=;Ú6;Ú/;Ú(;Ú!;Ú;Ú;Ú ;Ú;Úþ:Ú÷:Úð:Úé:Úâ:ÚÛ:ÚÔ:ÚÍ:ÚÆ:Ú¿:Ú¸:Ú±:Úª:Ú£:Úœ:Ú•:ÚŽ:Ú‡:Ú€:Úy:Úr:Úk:Úd:Ú]:ÚV:ÚO:ÚH:ÚA:Ú::Ú3:Ú,:Ú%:Ú:Ú:Ú:Ú :Ú:Úû9Úô9Úí9Úæ9Úß9ÚØ9ÚÑ9ÚÊ9ÚÃ9Ú¼9Úµ9Ú®9Ú§9Ú 9Ú™9Ú’9Ú‹9Ú„9Ú}9Úv9Úo9Úh9Úa9ÚZ9ÚS9ÚL9ÚE9Ú>9Ú79Ú09Ú)9Ú"9Ú9Ú9Ú 9Ú9Úÿ8Úø8Úñ8Úê8Úã8ÚÜ8ÚÕ8ÚÎ8ÚÇ8ÚÀ8Ú¹8Ú²8Ú«8Ú¤8Ú8Ú–8Ú8Úˆ8Ú8Úz8Ús8Úl8Úe8Ú^8ÚW8ÚP8ÚI8ÚB8Ú;8Ú48Ú-8Ú&8Ú8Ú8Ú8Ú 8Ú8Úü7Úõ7Úî7Úç7Úà7ÚÙ7ÚÒ7ÚË7ÚÄ7Ú½7Ú¶7Ú¯7Ú¨7Ú¡7Úš7Ú“7ÚŒ7Ú…7Ú~7Úw7Úp7Úi7Úb7Ú[7ÚT7ÚM7ÚF7Ú?7Ú87Ú17Ú*7Ú#7Ú7Ú7Ú7Ú7Ú7Úù6Úò6Úë6Úä6ÚÝ6ÚÖ6ÚÏ6ÚÈ6ÚÁ6Úº6Ú³6Ú¬6Ú¥6Úž6Ú—6Ú6Ú‰6Ú‚6Ú{6Út6Úm6Úf6Ú_6ÚX6ÚQ6ÚJ6ÚC6Ú<6Ú56Ú.6Ú'6Ú 6Ú6Ú6Ú 6Ú6Úý5Úö5Úï5Úè5Úá5ÚÚ5ÚÓ5ÚÌ5ÚÅ5Ú¾5Ú·5Ú°5Ú©5Ú¢5Ú›5Ú”5Ú5Ú†5Ú5Úx5Úq5Új5Úc5Ú\5ÚU5ÚN5ÚG5Ú@5Ú95Ú25Ú+5Ú$5Ú5Ú5Ú5Ú5Ú5Úú4Úó4Úì4Úå4ÚÞ4Ú×4ÚÐ4ÚÉ4ÚÂ4Ú»4Ú´4Ú­4Ú¦4ÚŸ4Ú˜4Ú‘4ÚŠ4Úƒ4Ú|4Úu4Ún4Úg4Ú`4ÚY4ÚR4ÚK4ÚD4Ú=4Ú64Ú/4Ú(4Ú!4Ú4Ú4Ú 4Ú4Úþ3Ú÷3Úð3Úé3Úâ3ÚÛ3ÚÔ3ÚÍ3ÚÆ3Ú¿3Ú¸3Ú±3Úª3Ú£3Úœ3Ú•3ÚŽ3Ú‡3Ú€3Úy3Úr3Úk3Úd3Ú]3ÚV3ÚO3ÚH3ÚA3Ú:3Ú33Ú,3Ú%3Ú3Ú3Ú3Ú 3Ú3Úû2Úô2Úí2Úæ2Úß2ÚØ2ÚÑ2ÚÊ2ÚÃ2Ú¼2Úµ2Ú®2Ú§2Ú 2Ú™2Ú’2Ú‹2Ú„2Ú}2Úv2Úo2Úh2Úa2ÚZ2ÚS2ÚL2ÚE2Ú>2Ú72Ú02Ú)2Ú"2Ú2Ú2Ú 2Ú2Úÿ1Úø1Úñ1Úê1Úã1ÚÜ1ÚÕ1ÚÎ1ÚÇ1ÚÀ1Ú¹1Ú²1Ú«1Ú¤1Ú1Ú–1Ú1Úˆ1Ú1Úz1Ús1Úl1Úe1Ú^1ÚW1ÚP1ÚI1ÚB1Ú;1Ú41Ú-1Ú&1Ú1Ú1Ú1Ú 1Ú1Úü0Úõ0Úî0Úç0Úà0ÚÙ0ÚÒ0ÚË0ÚÄ0Ú½0Ú¶0Ú¯0Ú¨0Ú¡0Úš0Ú“0ÚŒ0Ú…0Ú~0Úw0Úp0Úi0Úb0Ú[0ÚT0ÚM0ÚF0Ú?0Ú80Ú10Ú*0Ú#0Ú0Ú0Ú0Ú0Ú0Úù/Úò/Úë/Úä/ÚÝ/ÚÖ/ÚÏ/ÚÈ/ÚÁ/Úº/Ú³/Ú¬/Ú¥/Úž/Ú—/Ú/Ú‰/Ú‚/Ú{/Út/Úm/Úf/Ú_/ÚX/ÚQ/ÚJ/ÚC/Ú+Ú7+Ú0+Ú)+Ú"+Ú+Ú+Ú +Ú+Úÿ*Úø*Úñ*Úê*Úã*ÚÜ*ÚÕ*ÚÎ*ÚÇ*ÚÀ*Ú¹*Ú²*Ú«*Ú¤*Ú*Ú–*Ú*Úˆ*Ú*Úz*Ús*Úl*Úe*Ú^*ÚW*ÚP*ÚI*ÚB*Ú;*Ú4*Ú-*Ú&*Ú*Ú*Ú*Ú *Ú*Úü)Úõ)Úî)Úç)Úà)ÚÙ)ÚÒ)ÚË)ÚÄ)Ú½)Ú¶)Ú¯)Ú¨)Ú¡)Úš)Ú“)ÚŒ)Ú…)Ú~)Úw)Úp)Úi)Úb)Ú[)ÚT)ÚM)ÚF)Ú?)Ú8)Ú1)Ú*)Ú#)Ú)Ú)Ú)Ú)Ú)Úù(Úò(Úë(Úä(ÚÝ(ÚÖ(ÚÏ(ÚÈ(ÚÁ(Úº(Ú³(Ú¬(Ú¥(Úž(Ú—(Ú(Ú‰(Ú‚(Ú{(Út(Úm(Úf(Ú_(ÚX(ÚQ(ÚJ(ÚC(Ú<(Ú5(Ú.(Ú'(Ú (Ú(Ú(Ú (Ú(Úý'Úö'Úï'Úè'Úá'ÚÚ'ÚÓ'ÚÌ'ÚÅ'Ú¾'Ú·'Ú°'Ú©'Ú¢'Ú›'Ú”'Ú'Ú†'Ú'Úx'Úq'Új'Úc'Ú\'ÚU'ÚN'ÚG'Ú@'Ú9'Ú2'Ú+'Ú$'Ú'Ú'Ú'Ú'Ú'Úú&Úó&Úì&Úå&ÚÞ&Ú×&ÚÐ&ÚÉ&ÚÂ&Ú»&Ú´&Ú­&Ú¦&ÚŸ&Ú˜&Ú‘&ÚŠ&Úƒ&Ú|&Úu&Ún&Úg&Ú`&ÚY&ÚR&ÚK&ÚD&Ú=&Ú6&Ú/&Ú(&Ú!&Ú&Ú&Ú &Ú&Úþ%Ú÷%Úð%Úé%Úâ%ÚÛ%ÚÔ%ÚÍ%ÚÆ%Ú¿%Ú¸%Ú±%Úª%Ú£%Úœ%Ú•%ÚŽ%Ú‡%Ú€%Úy%Úr%Úk%Úd%Ú]%ÚV%ÚO%ÚH%ÚA%Ú:%Ú3%Ú,%Ú%%Ú%Ú%Ú%Ú %Ú%Úû$Úô$Úí$Úæ$Úß$ÚØ$ÚÑ$ÚÊ$ÚÃ$Ú¼$Úµ$Ú®$Ú§$Ú $Ú™$Ú’$Ú‹$Ú„$Ú}$Úv$Úo$Úh$Úa$ÚZ$ÚS$ÚL$ÚE$Ú>$Ú7$Ú0$Ú)$Ú"$Ú$Ú$Ú $Ú$Úÿ#Úø#Úñ#Úê#Úã#ÚÜ#ÚÕ#ÚÎ#ÚÇ#ÚÀ#Ú¹#Ú²#Ú«#Ú¤#Ú#Ú–#Ú#Úˆ#Ú#Úz#Ús#Úl#Úe#Ú^#ÚW#ÚP#ÚI#ÚB#Ú;#Ú4#Ú-#Ú&#Ú#Ú#Ú#Ú #Ú#Úü"Úõ"Úî"Úç"Úà"ÚÙ"ÚÒ"ÚË"ÚÄ"Ú½"Ú¶"Ú¯"Ú¨"Ú¡"Úš"Ú“"ÚŒ"Ú…"Ú~"Úw"Úp"Úi"Úb"Ú["ÚT"ÚM"ÚF"Ú?"Ú8"Ú1"Ú*"Ú#"Ú"Ú"Ú"Ú"Ú"Úù!Úò!Úë!Úä!ÚÝ!ÚÖ!ÚÏ!ÚÈ!ÚÁ!Úº!Ú³!Ú¬!Ú¥!Úž!Ú—!Ú!Ú‰!Ú‚!Ú{!Út!Úm!Úf!Ú_!ÚX!ÚQ!ÚJ!ÚC!ÚÚ7Ú0Ú)Ú"ÚÚÚ ÚÚÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚü Úõ Úî Úç Úà ÚÙ ÚÒ ÚË ÚÄ Ú½ Ú¶ Ú¯ Ú¨ Ú¡ Úš Ú“ ÚŒ Ú… Ú~ Úw Úp Úi Úb Ú[ ÚT ÚM ÚF Ú? Ú8 Ú1 Ú* Ú# Ú Ú Ú Ú Ú Úù Úò Úë Úä ÚÝ ÚÖ ÚÏ ÚÈ ÚÁ Úº Ú³ Ú¬ Ú¥ Úž Ú— Ú Ú‰ Ú‚ Ú{ Út Úm Úf Ú_ ÚX ÚQ ÚJ ÚC Ú< Ú5 Ú. Ú' Ú Ú Ú Ú Ú Úý Úö Úï Úè Úá ÚÚ ÚÓ ÚÌ ÚÅ Ú¾ Ú· Ú° Ú© Ú¢ Ú› Ú” Ú Ú† Ú Úx Úq Új Úc Ú\ ÚU ÚN ÚG Ú@ Ú9 Ú2 Ú+ Ú$ Ú Ú Ú Ú Ú Úú Úó Úì Úå ÚÞ Ú× ÚÐ ÚÉ Ú Ú» Ú´ Ú­ Ú¦ ÚŸ Ú˜ Ú‘ ÚŠ Úƒ Ú| Úu Ún Úg Ú` ÚY ÚR ÚK ÚD Ú= Ú6 Ú/ Ú( Ú! Ú Ú Ú Ú Úþ Ú÷ Úð Úé Úâ ÚÛ ÚÔ ÚÍ ÚÆ Ú¿ Ú¸ Ú± Úª Ú£ Úœ Ú• ÚŽ Ú‡ Ú€ Úy Úr Úk Úd Ú] ÚV ÚO ÚH ÚA Ú: Ú3 Ú, Ú% Ú Ú Ú Ú Ú ÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÿÙõÿÙîÿÙçÿÙàÿÙÙÿÙÒÿÙËÿÙÄÿÙ½ÿÙ¶ÿÙ¯ÿÙ¨ÿÙ¡ÿÙšÿÙ“ÿÙŒÿÙ…ÿÙ~ÿÙwÿÙpÿÙiÿÙbÿÙ[ÿÙTÿÙMÿÙFÿÙ?ÿÙ8ÿÙ1ÿÙ*ÿÙ#ÿÙÿÙÿÙÿÙÿÙÿÙùþÙòþÙëþÙäþÙÝþÙÖþÙÏþÙÈþÙÁþÙºþÙ³þÙ¬þÙ¥þÙžþÙ—þÙþÙ‰þÙ‚þÙ{þÙtþÙmþÙfþÙ_þÙXþÙQþÙJþÙCþÙ<þÙ5þÙ.þÙ'þÙ þÙþÙþÙ þÙþÙýýÙöýÙïýÙèýÙáýÙÚýÙÓýÙÌýÙÅýÙ¾ýÙ·ýÙ°ýÙ©ýÙ¢ýÙ›ýÙ”ýÙýÙ†ýÙýÙxýÙqýÙjýÙcýÙ\ýÙUýÙNýÙGýÙ@ýÙ9ýÙ2ýÙ+ýÙ$ýÙýÙýÙýÙýÙýÙúüÙóüÙìüÙåüÙÞüÙ×üÙÐüÙÉüÙÂüÙ»üÙ´üÙ­üÙ¦üÙŸüÙ˜üÙ‘üÙŠüÙƒüÙ|üÙuüÙnüÙgüÙ`üÙYüÙRüÙKüÙDüÙ=üÙ6üÙ/üÙ(üÙ!üÙüÙüÙ üÙüÙþûÙ÷ûÙðûÙéûÙâûÙÛûÙÔûÙÍûÙÆûÙ¿ûÙ¸ûÙ±ûÙªûÙ£ûÙœûÙ•ûÙŽûÙ‡ûÙ€ûÙyûÙrûÙkûÙdûÙ]ûÙVûÙOûÙHûÙAûÙ:ûÙ3ûÙ,ûÙ%ûÙûÙûÙûÙ ûÙûÙûúÙôúÙíúÙæúÙßúÙØúÙÑúÙÊúÙÃúÙ¼úÙµúÙ®úÙ§úÙ úÙ™úÙ’úÙ‹úÙ„úÙ}úÙvúÙoúÙhúÙaúÙZúÙSúÙLúÙEúÙ>úÙ7úÙ0úÙ)úÙ"úÙúÙúÙ úÙúÙÿùÙøùÙñùÙêùÙãùÙÜùÙÕùÙÎùÙÇùÙÀùÙ¹ùÙ²ùÙ«ùÙ¤ùÙùÙ–ùÙùÙˆùÙùÙzùÙsùÙlùÙeùÙ^ùÙWùÙPùÙIùÙBùÙ;ùÙ4ùÙ-ùÙ&ùÙùÙùÙùÙ ùÙùÙüøÙõøÙîøÙçøÙàøÙÙøÙÒøÙËøÙÄøÙ½øÙ¶øÙ¯øÙ¨øÙ¡øÙšøÙ“øÙŒøÙ…øÙ~øÙwøÙpøÙiøÙbøÙ[øÙTøÙMøÙFøÙ?øÙ8øÙ1øÙ*øÙ#øÙøÙøÙøÙøÙøÙù÷Ùò÷Ùë÷Ùä÷ÙÝ÷ÙÖ÷ÙÏ÷ÙÈ÷ÙÁ÷Ùº÷Ù³÷Ù¬÷Ù¥÷Ùž÷Ù—÷Ù÷Ù‰÷Ù‚÷Ù{÷Ùt÷Ùm÷Ùf÷Ù_÷ÙX÷ÙQ÷ÙJ÷ÙC÷Ù<÷Ù5÷Ù.÷Ù'÷Ù ÷Ù÷Ù÷Ù ÷Ù÷ÙýöÙööÙïöÙèöÙáöÙÚöÙÓöÙÌöÙÅöÙ¾öÙ·öÙ°öÙ©öÙ¢öÙ›öÙ”öÙöÙ†öÙöÙxöÙqöÙjöÙcöÙ\öÙUöÙNöÙGöÙ@öÙ9öÙ2öÙ+öÙ$öÙöÙöÙöÙöÙöÙúõÙóõÙìõÙåõÙÞõÙ×õÙÐõÙÉõÙÂõÙ»õÙ´õÙ­õÙ¦õÙŸõÙ˜õÙ‘õÙŠõÙƒõÙ|õÙuõÙnõÙgõÙ`õÙYõÙRõÙKõÙDõÙ=õÙ6õÙ/õÙ(õÙ!õÙõÙõÙ õÙõÙþôÙ÷ôÙðôÙéôÙâôÙÛôÙÔôÙÍôÙÆôÙ¿ôÙ¸ôÙ±ôÙªôÙ£ôÙœôÙ•ôÙŽôÙ‡ôÙ€ôÙyôÙrôÙkôÙdôÙ]ôÙVôÙOôÙHôÙAôÙ:ôÙ3ôÙ,ôÙ%ôÙôÙôÙôÙ ôÙôÙûóÙôóÙíóÙæóÙßóÙØóÙÑóÙÊóÙÃóÙ¼óÙµóÙ®óÙ§óÙ óÙ™óÙ’óÙ‹óÙ„óÙ}óÙvóÙoóÙhóÙaóÙZóÙSóÙLóÙEóÙ>óÙ7óÙ0óÙ)óÙ"óÙóÙóÙ óÙóÙÿòÙøòÙñòÙêòÙãòÙÜòÙÕòÙÎòÙÇòÙÀòÙ¹òÙ²òÙ«òÙ¤òÙòÙ–òÙòÙˆòÙòÙzòÙsòÙlòÙeòÙ^òÙWòÙPòÙIòÙBòÙ;òÙ4òÙ-òÙ&òÙòÙòÙòÙ òÙòÙüñÙõñÙîñÙçñÙàñÙÙñÙÒñÙËñÙÄñÙ½ñÙ¶ñÙ¯ñÙ¨ñÙ¡ñÙšñÙ“ñÙŒñÙ…ñÙ~ñÙwñÙpñÙiñÙbñÙ[ñÙTñÙMñÙFñÙ?ñÙ8ñÙ1ñÙ*ñÙ#ñÙñÙñÙñÙñÙñÙùðÙòðÙëðÙäðÙÝðÙÖðÙÏðÙÈðÙÁðÙºðÙ³ðÙ¬ðÙ¥ðÙžðÙ—ðÙðÙ‰ðÙ‚ðÙ{ðÙtðÙmðÙfðÙ_ðÙXðÙQðÙJðÙCðÙ<ðÙ5ðÙ.ðÙ'ðÙ ðÙðÙðÙ ðÙðÙýïÙöïÙïïÙèïÙáïÙÚïÙÓïÙÌïÙÅïÙ¾ïÙ·ïÙ°ïÙ©ïÙ¢ïÙ›ïÙ”ïÙïÙ†ïÙïÙxïÙqïÙjïÙcïÙ\ïÙUïÙNïÙGïÙ@ïÙ9ïÙ2ïÙ+ïÙ$ïÙïÙïÙïÙïÙïÙúîÙóîÙìîÙåîÙÞîÙ×îÙÐîÙÉîÙÂîÙ»îÙ´îÙ­îÙ¦îÙŸîÙ˜îÙ‘îÙŠîÙƒîÙ|îÙuîÙnîÙgîÙ`îÙYîÙRîÙKîÙDîÙ=îÙ6îÙ/îÙ(îÙ!îÙîÙîÙ îÙîÙþíÙ÷íÙðíÙéíÙâíÙÛíÙÔíÙÍíÙÆíÙ¿íÙ¸íÙ±íÙªíÙ£íÙœíÙ•íÙŽíÙ‡íÙ€íÙyíÙríÙkíÙdíÙ]íÙVíÙOíÙHíÙAíÙ:íÙ3íÙ,íÙ%íÙíÙíÙíÙ íÙíÙûìÙôìÙíìÙæìÙßìÙØìÙÑìÙÊìÙÃìÙ¼ìÙµìÙ®ìÙ§ìÙ ìÙ™ìÙ’ìÙ‹ìÙ„ìÙ}ìÙvìÙoìÙhìÙaìÙZìÙSìÙLìÙEìÙ>ìÙ7ìÙ0ìÙ)ìÙ"ìÙìÙìÙ ìÙìÙÿëÙøëÙñëÙêëÙãëÙÜëÙÕëÙÎëÙÇëÙÀëÙ¹ëÙ²ëÙ«ëÙ¤ëÙëÙ–ëÙëÙˆëÙëÙzëÙsëÙlëÙeëÙ^ëÙWëÙPëÙIëÙBëÙ;ëÙ4ëÙ-ëÙ&ëÙëÙëÙëÙ ëÙëÙüêÙõêÙîêÙçêÙàêÙÙêÙÒêÙËêÙÄêÙ½êÙ¶êÙ¯êÙ¨êÙ¡êÙšêÙ“êÙŒêÙ…êÙ~êÙwêÙpêÙiêÙbêÙ[êÙTêÙMêÙFêÙ?êÙ8êÙ1êÙ*êÙ#êÙêÙêÙêÙêÙêÙùéÙòéÙëéÙäéÙÝéÙÖéÙÏéÙÈéÙÁéÙºéÙ³éÙ¬éÙ¥éÙžéÙ—éÙéÙ‰éÙ‚éÙ{éÙtéÙméÙféÙ_éÙXéÙQéÙJéÙCéÙ<éÙ5éÙ.éÙ'éÙ éÙéÙéÙ éÙéÙýèÙöèÙïèÙèèÙáèÙÚèÙÓèÙÌèÙÅèÙ¾èÙ·èÙ°èÙ©èÙ¢èÙ›èÙ”èÙèÙ†èÙèÙxèÙqèÙjèÙcèÙ\èÙUèÙNèÙGèÙ@èÙ9èÙ2èÙ+èÙ$èÙèÙèÙèÙèÙèÙúçÙóçÙìçÙåçÙÞçÙ×çÙÐçÙÉçÙÂçÙ»çÙ´çÙ­çÙ¦çÙŸçÙ˜çÙ‘çÙŠçÙƒçÙ|çÙuçÙnçÙgçÙ`çÙYçÙRçÙKçÙDçÙ=çÙ6çÙ/çÙ(çÙ!çÙçÙçÙ çÙçÙþæÙ÷æÙðæÙéæÙâæÙÛæÙÔæÙÍæÙÆæÙ¿æÙ¸æÙ±æÙªæÙ£æÙœæÙ•æÙŽæÙ‡æÙ€æÙyæÙræÙkæÙdæÙ]æÙVæÙOæÙHæÙAæÙ:æÙ3æÙ,æÙ%æÙæÙæÙæÙ æÙæÙûåÙôåÙíåÙæåÙßåÙØåÙÑåÙÊåÙÃåÙ¼åÙµåÙ®åÙ§åÙ åÙ™åÙ’åÙ‹åÙ„åÙ}åÙvåÙoåÙhåÙaåÙZåÙSåÙLåÙEåÙ>åÙ7åÙ0åÙ)åÙ"åÙåÙåÙ åÙåÙÿäÙøäÙñäÙêäÙãäÙÜäÙÕäÙÎäÙÇäÙÀäÙ¹äÙ²äÙ«äÙ¤äÙäÙ–äÙäÙˆäÙäÙzäÙsäÙläÙeäÙ^äÙWäÙPäÙIäÙBäÙ;äÙ4äÙ-äÙ&äÙäÙäÙäÙ äÙäÙüãÙõãÙîãÙçãÙàãÙÙãÙÒãÙËãÙÄãÙ½ãÙ¶ãÙ¯ãÙ¨ãÙ¡ãÙšãÙ“ãÙŒãÙ…ãÙ~ãÙwãÙpãÙiãÙbãÙ[ãÙTãÙMãÙFãÙ?ãÙ8ãÙ1ãÙ*ãÙ#ãÙãÙãÙãÙãÙãÙùâÙòâÙëâÙäâÙÝâÙÖâÙÏâÙÈâÙÁâÙºâÙ³âÙ¬âÙ¥âÙžâÙ—âÙâÙ‰âÙ‚âÙ{âÙtâÙmâÙfâÙ_âÙXâÙQâÙJâÙCâÙ<âÙ5âÙ.âÙ'âÙ âÙâÙâÙ âÙâÙýáÙöáÙïáÙèáÙááÙÚáÙÓáÙÌáÙÅáÙ¾áÙ·áÙ°áÙ©áÙ¢áÙ›áÙ”áÙáÙ†áÙáÙxáÙqáÙjáÙcáÙ\áÙUáÙNáÙGáÙ@áÙ9áÙ2áÙ+áÙ$áÙáÙáÙáÙáÙáÙúàÙóàÙìàÙåàÙÞàÙ×àÙÐàÙÉàÙÂàÙ»àÙ´àÙ­àÙ¦àÙŸàÙ˜àÙ‘àÙŠàÙƒàÙ|àÙuàÙnàÙgàÙ`àÙYàÙRàÙKàÙDàÙ=àÙ6àÙ/àÙ(àÙ!àÙàÙàÙ àÙàÙþßÙ÷ßÙðßÙéßÙâßÙÛßÙÔßÙÍßÙÆßÙ¿ßÙ¸ßÙ±ßÙªßÙ£ßÙœßÙ•ßÙŽßÙ‡ßÙ€ßÙyßÙrßÙkßÙdßÙ]ßÙVßÙOßÙHßÙAßÙ:ßÙ3ßÙ,ßÙ%ßÙßÙßÙßÙ ßÙßÙûÞÙôÞÙíÞÙæÞÙßÞÙØÞÙÑÞÙÊÞÙÃÞÙ¼ÞÙµÞÙ®ÞÙ§ÞÙ ÞÙ™ÞÙ’ÞÙ‹ÞÙ„ÞÙ}ÞÙvÞÙoÞÙhÞÙaÞÙZÞÙSÞÙLÞÙEÞÙ>ÞÙ7ÞÙ0ÞÙ)ÞÙ"ÞÙÞÙÞÙ ÞÙÞÙÿÝÙøÝÙñÝÙêÝÙãÝÙÜÝÙÕÝÙÎÝÙÇÝÙÀÝÙ¹ÝÙ²ÝÙ«ÝÙ¤ÝÙÝÙ–ÝÙÝÙˆÝÙÝÙzÝÙsÝÙlÝÙeÝÙ^ÝÙWÝÙPÝÙIÝÙBÝÙ;ÝÙ4ÝÙ-ÝÙ&ÝÙÝÙÝÙÝÙ ÝÙÝÙüÜÙõÜÙîÜÙçÜÙàÜÙÙÜÙÒÜÙËÜÙÄÜÙ½ÜÙ¶ÜÙ¯ÜÙ¨ÜÙ¡ÜÙšÜÙ“ÜÙŒÜÙ…ÜÙ~ÜÙwÜÙpÜÙiÜÙbÜÙ[ÜÙTÜÙMÜÙFÜÙ?ÜÙ8ÜÙ1ÜÙ*ÜÙ#ÜÙÜÙÜÙÜÙÜÙÜÙùÛÙòÛÙëÛÙäÛÙÝÛÙÖÛÙÏÛÙÈÛÙÁÛÙºÛÙ³ÛÙ¬ÛÙ¥ÛÙžÛÙ—ÛÙÛÙ‰ÛÙ‚ÛÙ{ÛÙtÛÙmÛÙfÛÙ_ÛÙXÛÙQÛÙJÛÙCÛÙ<ÛÙ5ÛÙ.ÛÙ'ÛÙ ÛÙÛÙÛÙ ÛÙÛÙýÚÙöÚÙïÚÙèÚÙáÚÙÚÚÙÓÚÙÌÚÙÅÚÙ¾ÚÙ·ÚÙ°ÚÙ©ÚÙ¢ÚÙ›ÚÙ”ÚÙÚÙ†ÚÙÚÙxÚÙqÚÙjÚÙcÚÙ\ÚÙUÚÙNÚÙGÚÙ@ÚÙ9ÚÙ2ÚÙ+ÚÙ$ÚÙÚÙÚÙÚÙÚÙÚÙúÙÙóÙÙìÙÙåÙÙÞÙÙ×ÙÙÐÙÙÉÙÙÂÙÙ»ÙÙ´ÙÙ­ÙÙ¦ÙÙŸÙÙ˜ÙÙ‘ÙÙŠÙÙƒÙÙ|ÙÙuÙÙnÙÙgÙÙ`ÙÙYÙÙRÙÙKÙÙDÙÙ=ÙÙ6ÙÙ/ÙÙ(ÙÙ!ÙÙÙÙÙÙ ÙÙÙÙþØÙ÷ØÙðØÙéØÙâØÙÛØÙÔØÙÍØÙÆØÙ¿ØÙ¸ØÙ±ØÙªØÙ£ØÙœØÙ•ØÙŽØÙ‡ØÙ€ØÙyØÙrØÙkØÙdØÙ]ØÙVØÙOØÙHØÙAØÙ:ØÙ3ØÙ,ØÙ%ØÙØÙØÙØÙ ØÙØÙû×Ùô×Ùí×Ùæ×Ùß×ÙØ×ÙÑ×ÙÊ×ÙÃ×Ù¼×Ùµ×Ù®×Ù§×Ù ×Ù™×Ù’×Ù‹×Ù„×Ù}×Ùv×Ùo×Ùh×Ùa×ÙZ×ÙS×ÙL×ÙE×Ù>×Ù7×Ù0×Ù)×Ù"×Ù×Ù×Ù ×Ù×ÙÿÖÙøÖÙñÖÙêÖÙãÖÙÜÖÙÕÖÙÎÖÙÇÖÙÀÖÙ¹ÖÙ²ÖÙ«ÖÙ¤ÖÙÖÙ–ÖÙÖÙˆÖÙÖÙzÖÙsÖÙlÖÙeÖÙ^ÖÙWÖÙPÖÙIÖÙBÖÙ;ÖÙ4ÖÙ-ÖÙ&ÖÙÖÙÖÙÖÙ ÖÙÖÙüÕÙõÕÙîÕÙçÕÙàÕÙÙÕÙÒÕÙËÕÙÄÕÙ½ÕÙ¶ÕÙ¯ÕÙ¨ÕÙ¡ÕÙšÕÙ“ÕÙŒÕÙ…ÕÙ~ÕÙwÕÙpÕÙiÕÙbÕÙ[ÕÙTÕÙMÕÙFÕÙ?ÕÙ8ÕÙ1ÕÙ*ÕÙ#ÕÙÕÙÕÙÕÙÕÙÕÙùÔÙòÔÙëÔÙäÔÙÝÔÙÖÔÙÏÔÙÈÔÙÁÔÙºÔÙ³ÔÙ¬ÔÙ¥ÔÙžÔÙ—ÔÙÔÙ‰ÔÙ‚ÔÙ{ÔÙtÔÙmÔÙfÔÙ_ÔÙXÔÙQÔÙJÔÙCÔÙ<ÔÙ5ÔÙ.ÔÙ'ÔÙ ÔÙÔÙÔÙ ÔÙÔÙýÓÙöÓÙïÓÙèÓÙáÓÙÚÓÙÓÓÙÌÓÙÅÓÙ¾ÓÙ·ÓÙ°ÓÙ©ÓÙ¢ÓÙ›ÓÙ”ÓÙÓÙ†ÓÙÓÙxÓÙqÓÙjÓÙcÓÙ\ÓÙUÓÙNÓÙGÓÙ@ÓÙ9ÓÙ2ÓÙ+ÓÙ$ÓÙÓÙÓÙÓÙÓÙÓÙúÒÙóÒÙìÒÙåÒÙÞÒÙ×ÒÙÐÒÙÉÒÙÂÒÙ»ÒÙ´ÒÙ­ÒÙ¦ÒÙŸÒÙ˜ÒÙ‘ÒÙŠÒÙƒÒÙ|ÒÙuÒÙnÒÙgÒÙ`ÒÙYÒÙRÒÙKÒÙDÒÙ=ÒÙ6ÒÙ/ÒÙ(ÒÙ!ÒÙÒÙÒÙ ÒÙÒÙþÑÙ÷ÑÙðÑÙéÑÙâÑÙÛÑÙÔÑÙÍÑÙÆÑÙ¿ÑÙ¸ÑÙ±ÑÙªÑÙ£ÑÙœÑÙ•ÑÙŽÑÙ‡ÑÙ€ÑÙyÑÙrÑÙkÑÙdÑÙ]ÑÙVÑÙOÑÙHÑÙAÑÙ:ÑÙ3ÑÙ,ÑÙ%ÑÙÑÙÑÙÑÙ ÑÙÑÙûÐÙôÐÙíÐÙæÐÙßÐÙØÐÙÑÐÙÊÐÙÃÐÙ¼ÐÙµÐÙ®ÐÙ§ÐÙ ÐÙ™ÐÙ’ÐÙ‹ÐÙ„ÐÙ}ÐÙvÐÙoÐÙhÐÙaÐÙZÐÙSÐÙLÐÙEÐÙ>ÐÙ7ÐÙ0ÐÙ)ÐÙ"ÐÙÐÙÐÙ ÐÙÐÙÿÏÙøÏÙñÏÙêÏÙãÏÙÜÏÙÕÏÙÎÏÙÇÏÙÀÏÙ¹ÏÙ²ÏÙ«ÏÙ¤ÏÙÏÙ–ÏÙÏÙˆÏÙÏÙzÏÙsÏÙlÏÙeÏÙ^ÏÙWÏÙPÏÙIÏÙBÏÙ;ÏÙ4ÏÙ-ÏÙ&ÏÙÏÙÏÙÏÙ ÏÙÏÙüÎÙõÎÙîÎÙçÎÙàÎÙÙÎÙÒÎÙËÎÙÄÎÙ½ÎÙ¶ÎÙ¯ÎÙ¨ÎÙ¡ÎÙšÎÙ“ÎÙŒÎÙ…ÎÙ~ÎÙwÎÙpÎÙiÎÙbÎÙ[ÎÙTÎÙMÎÙFÎÙ?ÎÙ8ÎÙ1ÎÙ*ÎÙ#ÎÙÎÙÎÙÎÙÎÙÎÙùÍÙòÍÙëÍÙäÍÙÝÍÙÖÍÙÏÍÙÈÍÙÁÍÙºÍÙ³ÍÙ¬ÍÙ¥ÍÙžÍÙ—ÍÙÍÙ‰ÍÙ‚ÍÙ{ÍÙtÍÙmÍÙfÍÙ_ÍÙXÍÙQÍÙJÍÙCÍÙ<ÍÙ5ÍÙ.ÍÙ'ÍÙ ÍÙÍÙÍÙ ÍÙÍÙýÌÙöÌÙïÌÙèÌÙáÌÙÚÌÙÓÌÙÌÌÙÅÌÙ¾ÌÙ·ÌÙ°ÌÙ©ÌÙ¢ÌÙ›ÌÙ”ÌÙÌÙ†ÌÙÌÙxÌÙqÌÙjÌÙcÌÙ\ÌÙUÌÙNÌÙGÌÙ@ÌÙ9ÌÙ2ÌÙ+ÌÙ$ÌÙÌÙÌÙÌÙÌÙÌÙúËÙóËÙìËÙåËÙÞËÙ×ËÙÐËÙÉËÙÂËÙ»ËÙ´ËÙ­ËÙ¦ËÙŸËÙ˜ËÙ‘ËÙŠËÙƒËÙ|ËÙuËÙnËÙgËÙ`ËÙYËÙRËÙKËÙDËÙ=ËÙ6ËÙ/ËÙ(ËÙ!ËÙËÙËÙ ËÙËÙþÊÙ÷ÊÙðÊÙéÊÙâÊÙÛÊÙÔÊÙÍÊÙÆÊÙ¿ÊÙ¸ÊÙ±ÊÙªÊÙ£ÊÙœÊÙ•ÊÙŽÊÙ‡ÊÙ€ÊÙyÊÙrÊÙkÊÙdÊÙ]ÊÙVÊÙOÊÙHÊÙAÊÙ:ÊÙ3ÊÙ,ÊÙ%ÊÙÊÙÊÙÊÙ ÊÙÊÙûÉÙôÉÙíÉÙæÉÙßÉÙØÉÙÑÉÙÊÉÙÃÉÙ¼ÉÙµÉÙ®ÉÙ§ÉÙ ÉÙ™ÉÙ’ÉÙ‹ÉÙ„ÉÙ}ÉÙvÉÙoÉÙhÉÙaÉÙZÉÙSÉÙLÉÙEÉÙ>ÉÙ7ÉÙ0ÉÙ)ÉÙ"ÉÙÉÙÉÙ ÉÙÉÙÿÈÙøÈÙñÈÙêÈÙãÈÙÜÈÙÕÈÙÎÈÙÇÈÙÀÈÙ¹ÈÙ²ÈÙ«ÈÙ¤ÈÙÈÙ–ÈÙÈÙˆÈÙÈÙzÈÙsÈÙlÈÙeÈÙ^ÈÙWÈÙPÈÙIÈÙBÈÙ;ÈÙ4ÈÙ-ÈÙ&ÈÙÈÙÈÙÈÙ ÈÙÈÙüÇÙõÇÙîÇÙçÇÙàÇÙÙÇÙÒÇÙËÇÙÄÇÙ½ÇÙ¶ÇÙ¯ÇÙ¨ÇÙ¡ÇÙšÇÙ“ÇÙŒÇÙ…ÇÙ~ÇÙwÇÙpÇÙiÇÙbÇÙ[ÇÙTÇÙMÇÙFÇÙ?ÇÙ8ÇÙ1ÇÙ*ÇÙ#ÇÙÇÙÇÙÇÙÇÙÇÙùÆÙòÆÙëÆÙäÆÙÝÆÙÖÆÙÏÆÙÈÆÙÁÆÙºÆÙ³ÆÙ¬ÆÙ¥ÆÙžÆÙ—ÆÙÆÙ‰ÆÙ‚ÆÙ{ÆÙtÆÙmÆÙfÆÙ_ÆÙXÆÙQÆÙJÆÙCÆÙ<ÆÙ5ÆÙ.ÆÙ'ÆÙ ÆÙÆÙÆÙ ÆÙÆÙýÅÙöÅÙïÅÙèÅÙáÅÙÚÅÙÓÅÙÌÅÙÅÅÙ¾ÅÙ·ÅÙ°ÅÙ©ÅÙ¢ÅÙ›ÅÙ”ÅÙÅÙ†ÅÙÅÙxÅÙqÅÙjÅÙcÅÙ\ÅÙUÅÙNÅÙGÅÙ@ÅÙ9ÅÙ2ÅÙ+ÅÙ$ÅÙÅÙÅÙÅÙÅÙÅÙúÄÙóÄÙìÄÙåÄÙÞÄÙ×ÄÙÐÄÙÉÄÙÂÄÙ»ÄÙ´ÄÙ­ÄÙ¦ÄÙŸÄÙ˜ÄÙ‘ÄÙŠÄÙƒÄÙ|ÄÙuÄÙnÄÙgÄÙ`ÄÙYÄÙRÄÙKÄÙDÄÙ=ÄÙ6ÄÙ/ÄÙ(ÄÙ!ÄÙÄÙÄÙ ÄÙÄÙþÃÙ÷ÃÙðÃÙéÃÙâÃÙÛÃÙÔÃÙÍÃÙÆÃÙ¿ÃÙ¸ÃÙ±ÃÙªÃÙ£ÃÙœÃÙ•ÃÙŽÃÙ‡ÃÙ€ÃÙyÃÙrÃÙkÃÙdÃÙ]ÃÙVÃÙOÃÙHÃÙAÃÙ:ÃÙ3ÃÙ,ÃÙ%ÃÙÃÙÃÙÃÙ ÃÙÃÙûÂÙôÂÙíÂÙæÂÙßÂÙØÂÙÑÂÙÊÂÙÃÂÙ¼ÂÙµÂÙ®ÂÙ§ÂÙ ÂÙ™ÂÙ’ÂÙ‹ÂÙ„ÂÙ}ÂÙvÂÙoÂÙhÂÙaÂÙZÂÙSÂÙLÂÙEÂÙ>ÂÙ7ÂÙ0ÂÙ)ÂÙ"ÂÙÂÙÂÙ ÂÙÂÙÿÁÙøÁÙñÁÙêÁÙãÁÙÜÁÙÕÁÙÎÁÙÇÁÙÀÁÙ¹ÁÙ²ÁÙ«ÁÙ¤ÁÙÁÙ–ÁÙÁÙˆÁÙÁÙzÁÙsÁÙlÁÙeÁÙ^ÁÙWÁÙPÁÙIÁÙBÁÙ;ÁÙ4ÁÙ-ÁÙ&ÁÙÁÙÁÙÁÙ ÁÙÁÙüÀÙõÀÙîÀÙçÀÙàÀÙÙÀÙÒÀÙËÀÙÄÀÙ½ÀÙ¶ÀÙ¯ÀÙ¨ÀÙ¡ÀÙšÀÙ“ÀÙŒÀÙ…ÀÙ~ÀÙwÀÙpÀÙiÀÙbÀÙ[ÀÙTÀÙMÀÙFÀÙ?ÀÙ8ÀÙ1ÀÙ*ÀÙ#ÀÙÀÙÀÙÀÙÀÙÀÙù¿Ùò¿Ùë¿Ùä¿ÙÝ¿ÙÖ¿ÙÏ¿ÙÈ¿ÙÁ¿Ùº¿Ù³¿Ù¬¿Ù¥¿Ùž¿Ù—¿Ù¿Ù‰¿Ù‚¿Ù{¿Ùt¿Ùm¿Ùf¿Ù_¿ÙX¿ÙQ¿ÙJ¿ÙC¿Ù<¿Ù5¿Ù.¿Ù'¿Ù ¿Ù¿Ù¿Ù ¿Ù¿Ùý¾Ùö¾Ùï¾Ùè¾Ùá¾ÙÚ¾ÙÓ¾Ù̾ÙžÙ¾¾Ù·¾Ù°¾Ù©¾Ù¢¾Ù›¾Ù”¾Ù¾Ù†¾Ù¾Ùx¾Ùq¾Ùj¾Ùc¾Ù\¾ÙU¾ÙN¾ÙG¾Ù@¾Ù9¾Ù2¾Ù+¾Ù$¾Ù¾Ù¾Ù¾Ù¾Ù¾Ùú½Ùó½Ùì½Ùå½ÙÞ½Ù×½ÙнÙɽٽٻ½Ù´½Ù­½Ù¦½ÙŸ½Ù˜½Ù‘½ÙнÙƒ½Ù|½Ùu½Ùn½Ùg½Ù`½ÙY½ÙR½ÙK½ÙD½Ù=½Ù6½Ù/½Ù(½Ù!½Ù½Ù½Ù ½Ù½Ùþ¼Ù÷¼Ùð¼Ùé¼Ùâ¼ÙÛ¼ÙÔ¼ÙͼÙƼÙ¿¼Ù¸¼Ù±¼Ùª¼Ù£¼Ùœ¼Ù•¼Ù޼Ù‡¼Ù€¼Ùy¼Ùr¼Ùk¼Ùd¼Ù]¼ÙV¼ÙO¼ÙH¼ÙA¼Ù:¼Ù3¼Ù,¼Ù%¼Ù¼Ù¼Ù¼Ù ¼Ù¼Ùû»Ùô»Ùí»Ùæ»Ùß»ÙØ»ÙÑ»ÙÊ»ÙûÙ¼»Ùµ»Ù®»Ù§»Ù »Ù™»Ù’»Ù‹»Ù„»Ù}»Ùv»Ùo»Ùh»Ùa»ÙZ»ÙS»ÙL»ÙE»Ù>»Ù7»Ù0»Ù)»Ù"»Ù»Ù»Ù »Ù»ÙÿºÙøºÙñºÙêºÙãºÙܺÙÕºÙκÙǺÙÀºÙ¹ºÙ²ºÙ«ºÙ¤ºÙºÙ–ºÙºÙˆºÙºÙzºÙsºÙlºÙeºÙ^ºÙWºÙPºÙIºÙBºÙ;ºÙ4ºÙ-ºÙ&ºÙºÙºÙºÙ ºÙºÙü¹Ùõ¹Ùî¹Ùç¹Ùà¹ÙÙ¹ÙÒ¹Ù˹ÙĹÙ½¹Ù¶¹Ù¯¹Ù¨¹Ù¡¹Ùš¹Ù“¹ÙŒ¹Ù…¹Ù~¹Ùw¹Ùp¹Ùi¹Ùb¹Ù[¹ÙT¹ÙM¹ÙF¹Ù?¹Ù8¹Ù1¹Ù*¹Ù#¹Ù¹Ù¹Ù¹Ù¹Ù¹Ùù¸Ùò¸Ùë¸Ùä¸ÙݸÙÖ¸ÙϸÙȸÙÁ¸Ùº¸Ù³¸Ù¬¸Ù¥¸Ùž¸Ù—¸Ù¸Ù‰¸Ù‚¸Ù{¸Ùt¸Ùm¸Ùf¸Ù_¸ÙX¸ÙQ¸ÙJ¸ÙC¸Ù<¸Ù5¸Ù.¸Ù'¸Ù ¸Ù¸Ù¸Ù ¸Ù¸Ùý·Ùö·Ùï·Ùè·Ùá·ÙÚ·ÙÓ·ÙÌ·ÙÅ·Ù¾·Ù··Ù°·Ù©·Ù¢·Ù›·Ù”·Ù·Ù†·Ù·Ùx·Ùq·Ùj·Ùc·Ù\·ÙU·ÙN·ÙG·Ù@·Ù9·Ù2·Ù+·Ù$·Ù·Ù·Ù·Ù·Ù·Ùú¶Ùó¶Ùì¶Ùå¶ÙÞ¶Ù×¶ÙжÙɶÙ¶Ù»¶Ù´¶Ù­¶Ù¦¶ÙŸ¶Ù˜¶Ù‘¶ÙжÙƒ¶Ù|¶Ùu¶Ùn¶Ùg¶Ù`¶ÙY¶ÙR¶ÙK¶ÙD¶Ù=¶Ù6¶Ù/¶Ù(¶Ù!¶Ù¶Ù¶Ù ¶Ù¶ÙþµÙ÷µÙðµÙéµÙâµÙÛµÙÔµÙ͵ÙƵÙ¿µÙ¸µÙ±µÙªµÙ£µÙœµÙ•µÙ޵Ù‡µÙ€µÙyµÙrµÙkµÙdµÙ]µÙVµÙOµÙHµÙAµÙ:µÙ3µÙ,µÙ%µÙµÙµÙµÙ µÙµÙû´Ùô´Ùí´Ùæ´Ùß´ÙØ´ÙÑ´ÙÊ´ÙôÙ¼´Ùµ´Ù®´Ù§´Ù ´Ù™´Ù’´Ù‹´Ù„´Ù}´Ùv´Ùo´Ùh´Ùa´ÙZ´ÙS´ÙL´ÙE´Ù>´Ù7´Ù0´Ù)´Ù"´Ù´Ù´Ù ´Ù´Ùÿ³Ùø³Ùñ³Ùê³Ùã³ÙܳÙÕ³ÙγÙdzÙÀ³Ù¹³Ù²³Ù«³Ù¤³Ù³Ù–³Ù³Ùˆ³Ù³Ùz³Ùs³Ùl³Ùe³Ù^³ÙW³ÙP³ÙI³ÙB³Ù;³Ù4³Ù-³Ù&³Ù³Ù³Ù³Ù ³Ù³Ùü²Ùõ²Ùî²Ùç²Ùà²ÙÙ²ÙÒ²Ù˲ÙIJÙ½²Ù¶²Ù¯²Ù¨²Ù¡²Ùš²Ù“²ÙŒ²Ù…²Ù~²Ùw²Ùp²Ùi²Ùb²Ù[²ÙT²ÙM²ÙF²Ù?²Ù8²Ù1²Ù*²Ù#²Ù²Ù²Ù²Ù²Ù²Ùù±Ùò±Ùë±Ùä±ÙݱÙÖ±ÙϱÙȱÙÁ±Ùº±Ù³±Ù¬±Ù¥±Ùž±Ù—±Ù±Ù‰±Ù‚±Ù{±Ùt±Ùm±Ùf±Ù_±ÙX±ÙQ±ÙJ±ÙC±Ù<±Ù5±Ù.±Ù'±Ù ±Ù±Ù±Ù ±Ù±Ùý°Ùö°Ùï°Ùè°Ùá°ÙÚ°ÙÓ°Ṵ̀ÙŰÙ¾°Ù·°Ù°°Ù©°Ù¢°Ù›°Ù”°Ù°Ù†°Ù°Ùx°Ùq°Ùj°Ùc°Ù\°ÙU°ÙN°ÙG°Ù@°Ù9°Ù2°Ù+°Ù$°Ù°Ù°Ù°Ù°Ù°Ùú¯Ùó¯Ùì¯Ùå¯ÙÞ¯ÙׯÙЯÙɯٯٻ¯Ù´¯Ù­¯Ù¦¯ÙŸ¯Ù˜¯Ù‘¯ÙНÙƒ¯Ù|¯Ùu¯Ùn¯Ùg¯Ù`¯ÙY¯ÙR¯ÙK¯ÙD¯Ù=¯Ù6¯Ù/¯Ù(¯Ù!¯Ù¯Ù¯Ù ¯Ù¯Ùþ®Ù÷®Ùð®Ùé®Ùâ®ÙÛ®ÙÔ®ÙÍ®ÙÆ®Ù¿®Ù¸®Ù±®Ùª®Ù£®Ùœ®Ù•®ÙŽ®Ù‡®Ù€®Ùy®Ùr®Ùk®Ùd®Ù]®ÙV®ÙO®ÙH®ÙA®Ù:®Ù3®Ù,®Ù%®Ù®Ù®Ù®Ù ®Ù®Ùû­Ùô­Ùí­Ùæ­Ùß­ÙØ­ÙÑ­ÙÊ­ÙíÙ¼­Ùµ­Ù®­Ù§­Ù ­Ù™­Ù’­Ù‹­Ù„­Ù}­Ùv­Ùo­Ùh­Ùa­ÙZ­ÙS­ÙL­ÙE­Ù>­Ù7­Ù0­Ù)­Ù"­Ù­Ù­Ù ­Ù­Ùÿ¬Ùø¬Ùñ¬Ùê¬Ùã¬ÙܬÙÕ¬ÙάÙǬÙÀ¬Ù¹¬Ù²¬Ù«¬Ù¤¬Ù¬Ù–¬Ù¬Ùˆ¬Ù¬Ùz¬Ùs¬Ùl¬Ùe¬Ù^¬ÙW¬ÙP¬ÙI¬ÙB¬Ù;¬Ù4¬Ù-¬Ù&¬Ù¬Ù¬Ù¬Ù ¬Ù¬Ùü«Ùõ«Ùî«Ùç«Ùà«ÙÙ«ÙÒ«ÙË«Ùīٽ«Ù¶«Ù¯«Ù¨«Ù¡«Ùš«Ù“«ÙŒ«Ù…«Ù~«Ùw«Ùp«Ùi«Ùb«Ù[«ÙT«ÙM«ÙF«Ù?«Ù8«Ù1«Ù*«Ù#«Ù«Ù«Ù«Ù«Ù«ÙùªÙòªÙëªÙäªÙݪÙÖªÙϪÙȪÙÁªÙºªÙ³ªÙ¬ªÙ¥ªÙžªÙ—ªÙªÙ‰ªÙ‚ªÙ{ªÙtªÙmªÙfªÙ_ªÙXªÙQªÙJªÙCªÙ<ªÙ5ªÙ.ªÙ'ªÙ ªÙªÙªÙ ªÙªÙý©Ùö©Ùï©Ùè©Ùá©ÙÚ©ÙÓ©ÙÌ©Ùũپ©Ù·©Ù°©Ù©©Ù¢©Ù›©Ù”©Ù©Ù†©Ù©Ùx©Ùq©Ùj©Ùc©Ù\©ÙU©ÙN©ÙG©Ù@©Ù9©Ù2©Ù+©Ù$©Ù©Ù©Ù©Ù©Ù©Ùú¨Ùó¨Ùì¨Ùå¨ÙÞ¨ÙרÙШÙɨ٨ٻ¨Ù´¨Ù­¨Ù¦¨ÙŸ¨Ù˜¨Ù‘¨ÙЍÙƒ¨Ù|¨Ùu¨Ùn¨Ùg¨Ù`¨ÙY¨ÙR¨ÙK¨ÙD¨Ù=¨Ù6¨Ù/¨Ù(¨Ù!¨Ù¨Ù¨Ù ¨Ù¨Ùþ§Ù÷§Ùð§Ùé§Ùâ§ÙÛ§ÙÔ§ÙͧÙƧÙ¿§Ù¸§Ù±§Ùª§Ù£§Ùœ§Ù•§ÙާÙ‡§Ù€§Ùy§Ùr§Ùk§Ùd§Ù]§ÙV§ÙO§ÙH§ÙA§Ù:§Ù3§Ù,§Ù%§Ù§Ù§Ù§Ù §Ù§Ùû¦Ùô¦Ùí¦Ùæ¦ÙߦÙئÙѦÙʦÙæÙ¼¦Ùµ¦Ù®¦Ù§¦Ù ¦Ù™¦Ù’¦Ù‹¦Ù„¦Ù}¦Ùv¦Ùo¦Ùh¦Ùa¦ÙZ¦ÙS¦ÙL¦ÙE¦Ù>¦Ù7¦Ù0¦Ù)¦Ù"¦Ù¦Ù¦Ù ¦Ù¦Ùÿ¥Ùø¥Ùñ¥Ùê¥Ùã¥ÙÜ¥ÙÕ¥ÙÎ¥ÙÇ¥ÙÀ¥Ù¹¥Ù²¥Ù«¥Ù¤¥Ù¥Ù–¥Ù¥Ùˆ¥Ù¥Ùz¥Ùs¥Ùl¥Ùe¥Ù^¥ÙW¥ÙP¥ÙI¥ÙB¥Ù;¥Ù4¥Ù-¥Ù&¥Ù¥Ù¥Ù¥Ù ¥Ù¥Ùü¤Ùõ¤Ùî¤Ùç¤Ùà¤ÙÙ¤ÙÒ¤ÙˤÙĤÙ½¤Ù¶¤Ù¯¤Ù¨¤Ù¡¤Ùš¤Ù“¤ÙŒ¤Ù…¤Ù~¤Ùw¤Ùp¤Ùi¤Ùb¤Ù[¤ÙT¤ÙM¤ÙF¤Ù?¤Ù8¤Ù1¤Ù*¤Ù#¤Ù¤Ù¤Ù¤Ù¤Ù¤Ùù£Ùò£Ùë£Ùä£ÙÝ£ÙÖ£ÙÏ£ÙÈ£ÙÁ£Ùº£Ù³£Ù¬£Ù¥£Ùž£Ù—£Ù£Ù‰£Ù‚£Ù{£Ùt£Ùm£Ùf£Ù_£ÙX£ÙQ£ÙJ£ÙC£Ù<£Ù5£Ù.£Ù'£Ù £Ù£Ù£Ù £Ù£Ùý¢Ùö¢Ùï¢Ùè¢Ùá¢ÙÚ¢ÙÓ¢ÙÌ¢ÙÅ¢Ù¾¢Ù·¢Ù°¢Ù©¢Ù¢¢Ù›¢Ù”¢Ù¢Ù†¢Ù¢Ùx¢Ùq¢Ùj¢Ùc¢Ù\¢ÙU¢ÙN¢ÙG¢Ù@¢Ù9¢Ù2¢Ù+¢Ù$¢Ù¢Ù¢Ù¢Ù¢Ù¢Ùú¡Ùó¡Ùì¡Ùå¡ÙÞ¡ÙסÙСÙɡ١ٻ¡Ù´¡Ù­¡Ù¦¡ÙŸ¡Ù˜¡Ù‘¡ÙŠ¡Ùƒ¡Ù|¡Ùu¡Ùn¡Ùg¡Ù`¡ÙY¡ÙR¡ÙK¡ÙD¡Ù=¡Ù6¡Ù/¡Ù(¡Ù!¡Ù¡Ù¡Ù ¡Ù¡Ùþ Ù÷ Ùð Ùé Ùâ ÙÛ ÙÔ ÙÍ ÙÆ Ù¿ Ù¸ Ù± Ùª Ù£ Ùœ Ù• ÙŽ Ù‡ Ù€ Ùy Ùr Ùk Ùd Ù] ÙV ÙO ÙH ÙA Ù: Ù3 Ù, Ù% Ù Ù Ù Ù  Ù ÙûŸÙôŸÙíŸÙæŸÙߟÙØŸÙÑŸÙÊŸÙßÙ¼ŸÙµŸÙ®ŸÙ§ŸÙ ŸÙ™ŸÙ’ŸÙ‹ŸÙ„ŸÙ}ŸÙvŸÙoŸÙhŸÙaŸÙZŸÙSŸÙLŸÙEŸÙ>ŸÙ7ŸÙ0ŸÙ)ŸÙ"ŸÙŸÙŸÙ ŸÙŸÙÿžÙøžÙñžÙêžÙãžÙÜžÙÕžÙΞÙÇžÙÀžÙ¹žÙ²žÙ«žÙ¤žÙžÙ–žÙžÙˆžÙžÙzžÙsžÙlžÙežÙ^žÙWžÙPžÙIžÙBžÙ;žÙ4žÙ-žÙ&žÙžÙžÙžÙ žÙžÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùœÙòœÙëœÙäœÙÝœÙÖœÙÏœÙÈœÙÁœÙºœÙ³œÙ¬œÙ¥œÙžœÙ—œÙœÙ‰œÙ‚œÙ{œÙtœÙmœÙfœÙ_œÙXœÙQœÙJœÙCœÙ<œÙ5œÙ.œÙ'œÙ œÙœÙœÙ œÙœÙý›Ùö›Ùï›Ùè›Ùá›ÙÚ›ÙÓ›ÙÌ›Ùśپ›Ù·›Ù°›Ù©›Ù¢›Ù››Ù”›Ù›Ù†›Ù›Ùx›Ùq›Ùj›Ùc›Ù\›ÙU›ÙN›ÙG›Ù@›Ù9›Ù2›Ù+›Ù$›Ù›Ù›Ù›Ù›Ù›ÙúšÙóšÙìšÙåšÙÞšÙךÙКÙÉšÙšÙ»šÙ´šÙ­šÙ¦šÙŸšÙ˜šÙ‘šÙŠšÙƒšÙ|šÙušÙnšÙgšÙ`šÙYšÙRšÙKšÙDšÙ=šÙ6šÙ/šÙ(šÙ!šÙšÙšÙ šÙšÙþ™Ù÷™Ùð™Ùé™Ùâ™ÙÛ™ÙÔ™ÙÍ™ÙÆ™Ù¿™Ù¸™Ù±™Ùª™Ù£™Ùœ™Ù•™ÙŽ™Ù‡™Ù€™Ùy™Ùr™Ùk™Ùd™Ù]™ÙV™ÙO™ÙH™ÙA™Ù:™Ù3™Ù,™Ù%™Ù™Ù™Ù™Ù ™Ù™Ùû˜Ùô˜Ùí˜Ùæ˜ÙߘÙؘÙјÙʘÙØÙ¼˜Ùµ˜Ù®˜Ù§˜Ù ˜Ù™˜Ù’˜Ù‹˜Ù„˜Ù}˜Ùv˜Ùo˜Ùh˜Ùa˜ÙZ˜ÙS˜ÙL˜ÙE˜Ù>˜Ù7˜Ù0˜Ù)˜Ù"˜Ù˜Ù˜Ù ˜Ù˜Ùÿ—Ùø—Ùñ—Ùê—Ùã—ÙÜ—ÙÕ—ÙΗÙÇ—ÙÀ—Ù¹—Ù²—Ù«—Ù¤—ٖٗ—ٗو—Ù—Ùz—Ùs—Ùl—Ùe—Ù^—ÙW—ÙP—ÙI—ÙB—Ù;—Ù4—Ù-—Ù&—ٗٗٗ٠—Ù—Ùü–Ùõ–Ùî–Ùç–Ùà–ÙÙ–ÙÒ–ÙË–ÙÄ–Ù½–Ù¶–Ù¯–Ù¨–Ù¡–Ùš–Ù“–ÙŒ–Ù…–Ù~–Ùw–Ùp–Ùi–Ùb–Ù[–ÙT–ÙM–ÙF–Ù?–Ù8–Ù1–Ù*–Ù#–ٖٖٖٖٖÙù•Ùò•Ùë•Ùä•ÙÝ•ÙÖ•ÙÏ•ÙÈ•ÙÁ•Ùº•Ù³•Ù¬•Ù¥•Ùž•Ù—•ٕى•Ù‚•Ù{•Ùt•Ùm•Ùf•Ù_•ÙX•ÙQ•ÙJ•ÙC•Ù<•Ù5•Ù.•Ù'•Ù •ٕٕ٠•Ù•Ùý”Ùö”Ùï”Ùè”Ùá”ÙÚ”ÙÓ”ÙÌ”ÙŔپ”Ù·”Ù°”Ù©”Ù¢”Ù›”Ù””Ù”Ù†”Ù”Ùx”Ùq”Ùj”Ùc”Ù\”ÙU”ÙN”ÙG”Ù@”Ù9”Ù2”Ù+”Ù$”Ù”Ù”Ù”Ù”Ù”Ùú“Ùó“Ùì“Ùå“ÙÞ“ÙדÙГÙɓٓٻ“Ù´“Ù­“Ù¦“ÙŸ“Ù˜“Ù‘“ÙŠ“Ùƒ“Ù|“Ùu“Ùn“Ùg“Ù`“ÙY“ÙR“ÙK“ÙD“Ù=“Ù6“Ù/“Ù(“Ù!“ٓٓ٠“Ù“Ùþ’Ù÷’Ùð’Ùé’Ùâ’ÙÛ’ÙÔ’ÙÍ’ÙÆ’Ù¿’Ù¸’Ù±’Ùª’Ù£’Ùœ’Ù•’ÙŽ’Ù‡’Ù€’Ùy’Ùr’Ùk’Ùd’Ù]’ÙV’ÙO’ÙH’ÙA’Ù:’Ù3’Ù,’Ù%’ْْْ٠’Ù’Ùû‘Ùô‘Ùí‘Ùæ‘Ùß‘ÙØ‘ÙÑ‘ÙÊ‘ÙÑÙ¼‘Ùµ‘Ù®‘Ù§‘Ù ‘Ù™‘Ù’‘Ù‹‘Ù„‘Ù}‘Ùv‘Ùo‘Ùh‘Ùa‘ÙZ‘ÙS‘ÙL‘ÙE‘Ù>‘Ù7‘Ù0‘Ù)‘Ù"‘ّّ٠‘Ù‘ÙÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùŽÙòŽÙëŽÙäŽÙÝŽÙÖŽÙÏŽÙÈŽÙÁŽÙºŽÙ³ŽÙ¬ŽÙ¥ŽÙžŽÙ—ŽÙŽÙ‰ŽÙ‚ŽÙ{ŽÙtŽÙmŽÙfŽÙ_ŽÙXŽÙQŽÙJŽÙCŽÙ<ŽÙ5ŽÙ.ŽÙ'ŽÙ ŽÙŽÙŽÙ ŽÙŽÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúŒÙóŒÙìŒÙåŒÙÞŒÙ׌ÙÐŒÙɌٌٻŒÙ´ŒÙ­ŒÙ¦ŒÙŸŒÙ˜ŒÙ‘ŒÙŠŒÙƒŒÙ|ŒÙuŒÙnŒÙgŒÙ`ŒÙYŒÙRŒÙKŒÙDŒÙ=ŒÙ6ŒÙ/ŒÙ(ŒÙ!ŒÙŒÙŒÙ ŒÙŒÙþ‹Ù÷‹Ùð‹Ùé‹Ùâ‹ÙÛ‹ÙÔ‹ÙÍ‹ÙÆ‹Ù¿‹Ù¸‹Ù±‹Ùª‹Ù£‹Ùœ‹Ù•‹ÙŽ‹Ù‡‹Ù€‹Ùy‹Ùr‹Ùk‹Ùd‹Ù]‹ÙV‹ÙO‹ÙH‹ÙA‹Ù:‹Ù3‹Ù,‹Ù%‹Ù‹Ù‹Ù‹Ù ‹Ù‹ÙûŠÙôŠÙíŠÙæŠÙߊÙØŠÙÑŠÙÊŠÙÊÙ¼ŠÙµŠÙ®ŠÙ§ŠÙ ŠÙ™ŠÙ’ŠÙ‹ŠÙ„ŠÙ}ŠÙvŠÙoŠÙhŠÙaŠÙZŠÙSŠÙLŠÙEŠÙ>ŠÙ7ŠÙ0ŠÙ)ŠÙ"ŠÙŠÙŠÙ ŠÙŠÙÿ‰Ùø‰Ùñ‰Ùê‰Ùã‰Ù܉ÙÕ‰ÙΉÙljÙÀ‰Ù¹‰Ù²‰Ù«‰Ù¤‰Ù‰Ù–‰Ù‰Ùˆ‰Ù‰Ùz‰Ùs‰Ùl‰Ùe‰Ù^‰ÙW‰ÙP‰ÙI‰ÙB‰Ù;‰Ù4‰Ù-‰Ù&‰Ù‰Ù‰Ù‰Ù ‰Ù‰ÙüˆÙõˆÙîˆÙçˆÙàˆÙÙˆÙÒˆÙˈÙĈÙ½ˆÙ¶ˆÙ¯ˆÙ¨ˆÙ¡ˆÙšˆÙ“ˆÙŒˆÙ…ˆÙ~ˆÙwˆÙpˆÙiˆÙbˆÙ[ˆÙTˆÙMˆÙFˆÙ?ˆÙ8ˆÙ1ˆÙ*ˆÙ#ˆÙˆÙˆÙˆÙˆÙˆÙù‡Ùò‡Ùë‡Ùä‡Ù݇ÙÖ‡ÙχÙȇÙÁ‡Ùº‡Ù³‡Ù¬‡Ù¥‡Ùž‡Ù—‡Ù‡Ù‰‡Ù‚‡Ù{‡Ùt‡Ùm‡Ùf‡Ù_‡ÙX‡ÙQ‡ÙJ‡ÙC‡Ù<‡Ù5‡Ù.‡Ù'‡Ù ‡Ù‡Ù‡Ù ‡Ù‡Ùý†Ùö†Ùï†Ùè†Ùá†ÙÚ†ÙÓ†Ù̆ÙņÙ¾†Ù·†Ù°†Ù©†Ù¢†Ù›†Ù”†Ù†Ù††Ù†Ùx†Ùq†Ùj†Ùc†Ù\†ÙU†ÙN†ÙG†Ù@†Ù9†Ù2†Ù+†Ù$†Ù†Ù†Ù†Ù†Ù†Ùú…Ùó…Ùì…Ùå…ÙÞ…Ù×…ÙÐ…ÙÉ…ÙÂ…Ù»…Ù´…Ù­…Ù¦…ÙŸ…Ù˜…Ù‘…ÙŠ…Ùƒ…Ù|…Ùu…Ùn…Ùg…Ù`…ÙY…ÙR…ÙK…ÙD…Ù=…Ù6…Ù/…Ù(…Ù!…مم٠…Ù…Ùþ„Ù÷„Ùð„Ùé„Ùâ„ÙÛ„ÙÔ„ÙÍ„ÙÆ„Ù¿„Ù¸„Ù±„Ùª„Ù£„Ùœ„Ù•„ÙŽ„Ù‡„Ù€„Ùy„Ùr„Ùk„Ùd„Ù]„ÙV„ÙO„ÙH„ÙA„Ù:„Ù3„Ù,„Ù%„للل٠„Ù„ÙûƒÙôƒÙíƒÙæƒÙ߃Ù؃ÙуÙʃÙÃÙ¼ƒÙµƒÙ®ƒÙ§ƒÙ ƒÙ™ƒÙ’ƒÙ‹ƒÙ„ƒÙ}ƒÙvƒÙoƒÙhƒÙaƒÙZƒÙSƒÙLƒÙEƒÙ>ƒÙ7ƒÙ0ƒÙ)ƒÙ"ƒÙƒÙƒÙ ƒÙƒÙÿ‚Ùø‚Ùñ‚Ùê‚Ùã‚ÙÜ‚ÙÕ‚Ù΂ÙÇ‚ÙÀ‚Ù¹‚Ù²‚Ù«‚Ù¤‚قٖ‚قو‚Ù‚Ùz‚Ùs‚Ùl‚Ùe‚Ù^‚ÙW‚ÙP‚ÙI‚ÙB‚Ù;‚Ù4‚Ù-‚Ù&‚ققق٠‚Ù‚ÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙù€Ùò€Ùë€Ùä€ÙÝ€ÙÖ€ÙÏ€ÙÈ€ÙÁ€Ùº€Ù³€Ù¬€Ù¥€Ùž€Ù—€Ù€Ù‰€Ù‚€Ù{€Ùt€Ùm€Ùf€Ù_€ÙX€ÙQ€ÙJ€ÙC€Ù<€Ù5€Ù.€Ù'€Ù €Ù€Ù€Ù €Ù€ÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙú~Ùó~Ùì~Ùå~ÙÞ~Ù×~ÙÐ~ÙÉ~ÙÂ~Ù»~Ù´~Ù­~Ù¦~ÙŸ~Ù˜~Ù‘~ÙŠ~Ùƒ~Ù|~Ùu~Ùn~Ùg~Ù`~ÙY~ÙR~ÙK~ÙD~Ù=~Ù6~Ù/~Ù(~Ù!~Ù~Ù~Ù ~Ù~Ùþ}Ù÷}Ùð}Ùé}Ùâ}ÙÛ}ÙÔ}ÙÍ}ÙÆ}Ù¿}Ù¸}Ù±}Ùª}Ù£}Ùœ}Ù•}ÙŽ}Ù‡}Ù€}Ùy}Ùr}Ùk}Ùd}Ù]}ÙV}ÙO}ÙH}ÙA}Ù:}Ù3}Ù,}Ù%}Ù}Ù}Ù}Ù }Ù}Ùû|Ùô|Ùí|Ùæ|Ùß|ÙØ|ÙÑ|ÙÊ|ÙÃ|Ù¼|Ùµ|Ù®|Ù§|Ù |Ù™|Ù’|Ù‹|Ù„|Ù}|Ùv|Ùo|Ùh|Ùa|ÙZ|ÙS|ÙL|ÙE|Ù>|Ù7|Ù0|Ù)|Ù"|Ù|Ù|Ù |Ù|Ùÿ{Ùø{Ùñ{Ùê{Ùã{ÙÜ{ÙÕ{ÙÎ{ÙÇ{ÙÀ{Ù¹{Ù²{Ù«{Ù¤{Ù{Ù–{Ù{Ùˆ{Ù{Ùz{Ùs{Ùl{Ùe{Ù^{ÙW{ÙP{ÙI{ÙB{Ù;{Ù4{Ù-{Ù&{Ù{Ù{Ù{Ù {Ù{ÙüzÙõzÙîzÙçzÙàzÙÙzÙÒzÙËzÙÄzÙ½zÙ¶zÙ¯zÙ¨zÙ¡zÙšzÙ“zÙŒzÙ…zÙ~zÙwzÙpzÙizÙbzÙ[zÙTzÙMzÙFzÙ?zÙ8zÙ1zÙ*zÙ#zÙzÙzÙzÙzÙzÙùyÙòyÙëyÙäyÙÝyÙÖyÙÏyÙÈyÙÁyÙºyÙ³yÙ¬yÙ¥yÙžyÙ—yÙyÙ‰yÙ‚yÙ{yÙtyÙmyÙfyÙ_yÙXyÙQyÙJyÙCyÙuÙ7uÙ0uÙ)uÙ"uÙuÙuÙ uÙuÙÿtÙøtÙñtÙêtÙãtÙÜtÙÕtÙÎtÙÇtÙÀtÙ¹tÙ²tÙ«tÙ¤tÙtÙ–tÙtÙˆtÙtÙztÙstÙltÙetÙ^tÙWtÙPtÙItÙBtÙ;tÙ4tÙ-tÙ&tÙtÙtÙtÙ tÙtÙüsÙõsÙîsÙçsÙàsÙÙsÙÒsÙËsÙÄsÙ½sÙ¶sÙ¯sÙ¨sÙ¡sÙšsÙ“sÙŒsÙ…sÙ~sÙwsÙpsÙisÙbsÙ[sÙTsÙMsÙFsÙ?sÙ8sÙ1sÙ*sÙ#sÙsÙsÙsÙsÙsÙùrÙòrÙërÙärÙÝrÙÖrÙÏrÙÈrÙÁrÙºrÙ³rÙ¬rÙ¥rÙžrÙ—rÙrÙ‰rÙ‚rÙ{rÙtrÙmrÙfrÙ_rÙXrÙQrÙJrÙCrÙnÙ7nÙ0nÙ)nÙ"nÙnÙnÙ nÙnÙÿmÙømÙñmÙêmÙãmÙÜmÙÕmÙÎmÙÇmÙÀmÙ¹mÙ²mÙ«mÙ¤mÙmÙ–mÙmÙˆmÙmÙzmÙsmÙlmÙemÙ^mÙWmÙPmÙImÙBmÙ;mÙ4mÙ-mÙ&mÙmÙmÙmÙ mÙmÙülÙõlÙîlÙçlÙàlÙÙlÙÒlÙËlÙÄlÙ½lÙ¶lÙ¯lÙ¨lÙ¡lÙšlÙ“lÙŒlÙ…lÙ~lÙwlÙplÙilÙblÙ[lÙTlÙMlÙFlÙ?lÙ8lÙ1lÙ*lÙ#lÙlÙlÙlÙlÙlÙùkÙòkÙëkÙäkÙÝkÙÖkÙÏkÙÈkÙÁkÙºkÙ³kÙ¬kÙ¥kÙžkÙ—kÙkÙ‰kÙ‚kÙ{kÙtkÙmkÙfkÙ_kÙXkÙQkÙJkÙCkÙgÙ7gÙ0gÙ)gÙ"gÙgÙgÙ gÙgÙÿfÙøfÙñfÙêfÙãfÙÜfÙÕfÙÎfÙÇfÙÀfÙ¹fÙ²fÙ«fÙ¤fÙfÙ–fÙfÙˆfÙfÙzfÙsfÙlfÙefÙ^fÙWfÙPfÙIfÙBfÙ;fÙ4fÙ-fÙ&fÙfÙfÙfÙ fÙfÙüeÙõeÙîeÙçeÙàeÙÙeÙÒeÙËeÙÄeÙ½eÙ¶eÙ¯eÙ¨eÙ¡eÙšeÙ“eÙŒeÙ…eÙ~eÙweÙpeÙieÙbeÙ[eÙTeÙMeÙFeÙ?eÙ8eÙ1eÙ*eÙ#eÙeÙeÙeÙeÙeÙùdÙòdÙëdÙädÙÝdÙÖdÙÏdÙÈdÙÁdÙºdÙ³dÙ¬dÙ¥dÙždÙ—dÙdÙ‰dÙ‚dÙ{dÙtdÙmdÙfdÙ_dÙXdÙQdÙJdÙCdÙ`Ù7`Ù0`Ù)`Ù"`Ù`Ù`Ù `Ù`Ùÿ_Ùø_Ùñ_Ùê_Ùã_ÙÜ_ÙÕ_ÙÎ_ÙÇ_ÙÀ_Ù¹_Ù²_Ù«_Ù¤_Ù_Ù–_Ù_Ùˆ_Ù_Ùz_Ùs_Ùl_Ùe_Ù^_ÙW_ÙP_ÙI_ÙB_Ù;_Ù4_Ù-_Ù&_Ù_Ù_Ù_Ù _Ù_Ùü^Ùõ^Ùî^Ùç^Ùà^ÙÙ^ÙÒ^ÙË^ÙÄ^Ù½^Ù¶^Ù¯^Ù¨^Ù¡^Ùš^Ù“^ÙŒ^Ù…^Ù~^Ùw^Ùp^Ùi^Ùb^Ù[^ÙT^ÙM^ÙF^Ù?^Ù8^Ù1^Ù*^Ù#^Ù^Ù^Ù^Ù^Ù^Ùù]Ùò]Ùë]Ùä]ÙÝ]ÙÖ]ÙÏ]ÙÈ]ÙÁ]Ùº]Ù³]Ù¬]Ù¥]Ùž]Ù—]Ù]Ù‰]Ù‚]Ù{]Ùt]Ùm]Ùf]Ù_]ÙX]ÙQ]ÙJ]ÙC]Ù<]Ù5]Ù.]Ù']Ù ]Ù]Ù]Ù ]Ù]Ùý\Ùö\Ùï\Ùè\Ùá\ÙÚ\ÙÓ\ÙÌ\ÙÅ\Ù¾\Ù·\Ù°\Ù©\Ù¢\Ù›\Ù”\Ù\Ù†\Ù\Ùx\Ùq\Ùj\Ùc\Ù\\ÙU\ÙN\ÙG\Ù@\Ù9\Ù2\Ù+\Ù$\Ù\Ù\Ù\Ù\Ù\Ùú[Ùó[Ùì[Ùå[ÙÞ[Ù×[ÙÐ[ÙÉ[ÙÂ[Ù»[Ù´[Ù­[Ù¦[ÙŸ[Ù˜[Ù‘[ÙŠ[Ùƒ[Ù|[Ùu[Ùn[Ùg[Ù`[ÙY[ÙR[ÙK[ÙD[Ù=[Ù6[Ù/[Ù([Ù![Ù[Ù[Ù [Ù[ÙþZÙ÷ZÙðZÙéZÙâZÙÛZÙÔZÙÍZÙÆZÙ¿ZÙ¸ZÙ±ZÙªZÙ£ZÙœZÙ•ZÙŽZÙ‡ZÙ€ZÙyZÙrZÙkZÙdZÙ]ZÙVZÙOZÙHZÙAZÙ:ZÙ3ZÙ,ZÙ%ZÙZÙZÙZÙ ZÙZÙûYÙôYÙíYÙæYÙßYÙØYÙÑYÙÊYÙÃYÙ¼YÙµYÙ®YÙ§YÙ YÙ™YÙ’YÙ‹YÙ„YÙ}YÙvYÙoYÙhYÙaYÙZYÙSYÙLYÙEYÙ>YÙ7YÙ0YÙ)YÙ"YÙYÙYÙ YÙYÙÿXÙøXÙñXÙêXÙãXÙÜXÙÕXÙÎXÙÇXÙÀXÙ¹XÙ²XÙ«XÙ¤XÙXÙ–XÙXÙˆXÙXÙzXÙsXÙlXÙeXÙ^XÙWXÙPXÙIXÙBXÙ;XÙ4XÙ-XÙ&XÙXÙXÙXÙ XÙXÙüWÙõWÙîWÙçWÙàWÙÙWÙÒWÙËWÙÄWÙ½WÙ¶WÙ¯WÙ¨WÙ¡WÙšWÙ“WÙŒWÙ…WÙ~WÙwWÙpWÙiWÙbWÙ[WÙTWÙMWÙFWÙ?WÙ8WÙ1WÙ*WÙ#WÙWÙWÙWÙWÙWÙùVÙòVÙëVÙäVÙÝVÙÖVÙÏVÙÈVÙÁVÙºVÙ³VÙ¬VÙ¥VÙžVÙ—VÙVÙ‰VÙ‚VÙ{VÙtVÙmVÙfVÙ_VÙXVÙQVÙJVÙCVÙRÙ7RÙ0RÙ)RÙ"RÙRÙRÙ RÙRÙÿQÙøQÙñQÙêQÙãQÙÜQÙÕQÙÎQÙÇQÙÀQÙ¹QÙ²QÙ«QÙ¤QÙQÙ–QÙQÙˆQÙQÙzQÙsQÙlQÙeQÙ^QÙWQÙPQÙIQÙBQÙ;QÙ4QÙ-QÙ&QÙQÙQÙQÙ QÙQÙüPÙõPÙîPÙçPÙàPÙÙPÙÒPÙËPÙÄPÙ½PÙ¶PÙ¯PÙ¨PÙ¡PÙšPÙ“PÙŒPÙ…PÙ~PÙwPÙpPÙiPÙbPÙ[PÙTPÙMPÙFPÙ?PÙ8PÙ1PÙ*PÙ#PÙPÙPÙPÙPÙPÙùOÙòOÙëOÙäOÙÝOÙÖOÙÏOÙÈOÙÁOÙºOÙ³OÙ¬OÙ¥OÙžOÙ—OÙOÙ‰OÙ‚OÙ{OÙtOÙmOÙfOÙ_OÙXOÙQOÙJOÙCOÙKÙ7KÙ0KÙ)KÙ"KÙKÙKÙ KÙKÙÿJÙøJÙñJÙêJÙãJÙÜJÙÕJÙÎJÙÇJÙÀJÙ¹JÙ²JÙ«JÙ¤JÙJÙ–JÙJÙˆJÙJÙzJÙsJÙlJÙeJÙ^JÙWJÙPJÙIJÙBJÙ;JÙ4JÙ-JÙ&JÙJÙJÙJÙ JÙJÙüIÙõIÙîIÙçIÙàIÙÙIÙÒIÙËIÙÄIÙ½IÙ¶IÙ¯IÙ¨IÙ¡IÙšIÙ“IÙŒIÙ…IÙ~IÙwIÙpIÙiIÙbIÙ[IÙTIÙMIÙFIÙ?IÙ8IÙ1IÙ*IÙ#IÙIÙIÙIÙIÙIÙùHÙòHÙëHÙäHÙÝHÙÖHÙÏHÙÈHÙÁHÙºHÙ³HÙ¬HÙ¥HÙžHÙ—HÙHÙ‰HÙ‚HÙ{HÙtHÙmHÙfHÙ_HÙXHÙQHÙJHÙCHÙDÙ7DÙ0DÙ)DÙ"DÙDÙDÙ DÙDÙÿCÙøCÙñCÙêCÙãCÙÜCÙÕCÙÎCÙÇCÙÀCÙ¹CÙ²CÙ«CÙ¤CÙCÙ–CÙCÙˆCÙCÙzCÙsCÙlCÙeCÙ^CÙWCÙPCÙICÙBCÙ;CÙ4CÙ-CÙ&CÙCÙCÙCÙ CÙCÙüBÙõBÙîBÙçBÙàBÙÙBÙÒBÙËBÙÄBÙ½BÙ¶BÙ¯BÙ¨BÙ¡BÙšBÙ“BÙŒBÙ…BÙ~BÙwBÙpBÙiBÙbBÙ[BÙTBÙMBÙFBÙ?BÙ8BÙ1BÙ*BÙ#BÙBÙBÙBÙBÙBÙùAÙòAÙëAÙäAÙÝAÙÖAÙÏAÙÈAÙÁAÙºAÙ³AÙ¬AÙ¥AÙžAÙ—AÙAÙ‰AÙ‚AÙ{AÙtAÙmAÙfAÙ_AÙXAÙQAÙJAÙCAÙÙ÷>Ùð>Ùé>Ùâ>ÙÛ>ÙÔ>ÙÍ>ÙÆ>Ù¿>Ù¸>Ù±>Ùª>Ù£>Ùœ>Ù•>ÙŽ>Ù‡>Ù€>Ùy>Ùr>Ùk>Ùd>Ù]>ÙV>ÙO>ÙH>ÙA>Ù:>Ù3>Ù,>Ù%>Ù>Ù>Ù>Ù >Ù>Ùû=Ùô=Ùí=Ùæ=Ùß=ÙØ=ÙÑ=ÙÊ=ÙÃ=Ù¼=Ùµ=Ù®=Ù§=Ù =Ù™=Ù’=Ù‹=Ù„=Ù}=Ùv=Ùo=Ùh=Ùa=ÙZ=ÙS=ÙL=ÙE=Ù>=Ù7=Ù0=Ù)=Ù"=Ù=Ù=Ù =Ù=Ùÿ<Ùø<Ùñ<Ùê<Ùã<ÙÜ<ÙÕ<ÙÎ<ÙÇ<ÙÀ<Ù¹<Ù²<Ù«<Ù¤<Ù<Ù–<Ù<Ùˆ<Ù<Ùz<Ùs<Ùl<Ùe<Ù^<ÙW<ÙP<ÙI<ÙB<Ù;<Ù4<Ù-<Ù&<Ù<Ù<Ù<Ù <Ù<Ùü;Ùõ;Ùî;Ùç;Ùà;ÙÙ;ÙÒ;ÙË;ÙÄ;Ù½;Ù¶;Ù¯;Ù¨;Ù¡;Ùš;Ù“;ÙŒ;Ù…;Ù~;Ùw;Ùp;Ùi;Ùb;Ù[;ÙT;ÙM;ÙF;Ù?;Ù8;Ù1;Ù*;Ù#;Ù;Ù;Ù;Ù;Ù;Ùù:Ùò:Ùë:Ùä:ÙÝ:ÙÖ:ÙÏ:ÙÈ:ÙÁ:Ùº:Ù³:Ù¬:Ù¥:Ùž:Ù—:Ù:Ù‰:Ù‚:Ù{:Ùt:Ùm:Ùf:Ù_:ÙX:ÙQ:ÙJ:ÙC:Ù<:Ù5:Ù.:Ù':Ù :Ù:Ù:Ù :Ù:Ùý9Ùö9Ùï9Ùè9Ùá9ÙÚ9ÙÓ9ÙÌ9ÙÅ9Ù¾9Ù·9Ù°9Ù©9Ù¢9Ù›9Ù”9Ù9Ù†9Ù9Ùx9Ùq9Ùj9Ùc9Ù\9ÙU9ÙN9ÙG9Ù@9Ù99Ù29Ù+9Ù$9Ù9Ù9Ù9Ù9Ù9Ùú8Ùó8Ùì8Ùå8ÙÞ8Ù×8ÙÐ8ÙÉ8ÙÂ8Ù»8Ù´8Ù­8Ù¦8ÙŸ8Ù˜8Ù‘8ÙŠ8Ùƒ8Ù|8Ùu8Ùn8Ùg8Ù`8ÙY8ÙR8ÙK8ÙD8Ù=8Ù68Ù/8Ù(8Ù!8Ù8Ù8Ù 8Ù8Ùþ7Ù÷7Ùð7Ùé7Ùâ7ÙÛ7ÙÔ7ÙÍ7ÙÆ7Ù¿7Ù¸7Ù±7Ùª7Ù£7Ùœ7Ù•7ÙŽ7Ù‡7Ù€7Ùy7Ùr7Ùk7Ùd7Ù]7ÙV7ÙO7ÙH7ÙA7Ù:7Ù37Ù,7Ù%7Ù7Ù7Ù7Ù 7Ù7Ùû6Ùô6Ùí6Ùæ6Ùß6ÙØ6ÙÑ6ÙÊ6ÙÃ6Ù¼6Ùµ6Ù®6Ù§6Ù 6Ù™6Ù’6Ù‹6Ù„6Ù}6Ùv6Ùo6Ùh6Ùa6ÙZ6ÙS6ÙL6ÙE6Ù>6Ù76Ù06Ù)6Ù"6Ù6Ù6Ù 6Ù6Ùÿ5Ùø5Ùñ5Ùê5Ùã5ÙÜ5ÙÕ5ÙÎ5ÙÇ5ÙÀ5Ù¹5Ù²5Ù«5Ù¤5Ù5Ù–5Ù5Ùˆ5Ù5Ùz5Ùs5Ùl5Ùe5Ù^5ÙW5ÙP5ÙI5ÙB5Ù;5Ù45Ù-5Ù&5Ù5Ù5Ù5Ù 5Ù5Ùü4Ùõ4Ùî4Ùç4Ùà4ÙÙ4ÙÒ4ÙË4ÙÄ4Ù½4Ù¶4Ù¯4Ù¨4Ù¡4Ùš4Ù“4ÙŒ4Ù…4Ù~4Ùw4Ùp4Ùi4Ùb4Ù[4ÙT4ÙM4ÙF4Ù?4Ù84Ù14Ù*4Ù#4Ù4Ù4Ù4Ù4Ù4Ùù3Ùò3Ùë3Ùä3ÙÝ3ÙÖ3ÙÏ3ÙÈ3ÙÁ3Ùº3Ù³3Ù¬3Ù¥3Ùž3Ù—3Ù3Ù‰3Ù‚3Ù{3Ùt3Ùm3Ùf3Ù_3ÙX3ÙQ3ÙJ3ÙC3Ù<3Ù53Ù.3Ù'3Ù 3Ù3Ù3Ù 3Ù3Ùý2Ùö2Ùï2Ùè2Ùá2ÙÚ2ÙÓ2ÙÌ2ÙÅ2Ù¾2Ù·2Ù°2Ù©2Ù¢2Ù›2Ù”2Ù2Ù†2Ù2Ùx2Ùq2Ùj2Ùc2Ù\2ÙU2ÙN2ÙG2Ù@2Ù92Ù22Ù+2Ù$2Ù2Ù2Ù2Ù2Ù2Ùú1Ùó1Ùì1Ùå1ÙÞ1Ù×1ÙÐ1ÙÉ1ÙÂ1Ù»1Ù´1Ù­1Ù¦1ÙŸ1Ù˜1Ù‘1ÙŠ1Ùƒ1Ù|1Ùu1Ùn1Ùg1Ù`1ÙY1ÙR1ÙK1ÙD1Ù=1Ù61Ù/1Ù(1Ù!1Ù1Ù1Ù 1Ù1Ùþ0Ù÷0Ùð0Ùé0Ùâ0ÙÛ0ÙÔ0ÙÍ0ÙÆ0Ù¿0Ù¸0Ù±0Ùª0Ù£0Ùœ0Ù•0ÙŽ0Ù‡0Ù€0Ùy0Ùr0Ùk0Ùd0Ù]0ÙV0ÙO0ÙH0ÙA0Ù:0Ù30Ù,0Ù%0Ù0Ù0Ù0Ù 0Ù0Ùû/Ùô/Ùí/Ùæ/Ùß/ÙØ/ÙÑ/ÙÊ/ÙÃ/Ù¼/Ùµ/Ù®/Ù§/Ù /Ù™/Ù’/Ù‹/Ù„/Ù}/Ùv/Ùo/Ùh/Ùa/ÙZ/ÙS/ÙL/ÙE/Ù>/Ù7/Ù0/Ù)/Ù"/Ù/Ù/Ù /Ù/Ùÿ.Ùø.Ùñ.Ùê.Ùã.ÙÜ.ÙÕ.ÙÎ.ÙÇ.ÙÀ.Ù¹.Ù².Ù«.Ù¤.Ù.Ù–.Ù.Ùˆ.Ù.Ùz.Ùs.Ùl.Ùe.Ù^.ÙW.ÙP.ÙI.ÙB.Ù;.Ù4.Ù-.Ù&.Ù.Ù.Ù.Ù .Ù.Ùü-Ùõ-Ùî-Ùç-Ùà-ÙÙ-ÙÒ-ÙË-ÙÄ-Ù½-Ù¶-Ù¯-Ù¨-Ù¡-Ùš-Ù“-ÙŒ-Ù…-Ù~-Ùw-Ùp-Ùi-Ùb-Ù[-ÙT-ÙM-ÙF-Ù?-Ù8-Ù1-Ù*-Ù#-Ù-Ù-Ù-Ù-Ù-Ùù,Ùò,Ùë,Ùä,ÙÝ,ÙÖ,ÙÏ,ÙÈ,ÙÁ,Ùº,Ù³,Ù¬,Ù¥,Ùž,Ù—,Ù,Ù‰,Ù‚,Ù{,Ùt,Ùm,Ùf,Ù_,ÙX,ÙQ,ÙJ,ÙC,Ù<,Ù5,Ù.,Ù',Ù ,Ù,Ù,Ù ,Ù,Ùý+Ùö+Ùï+Ùè+Ùá+ÙÚ+ÙÓ+ÙÌ+ÙÅ+Ù¾+Ù·+Ù°+Ù©+Ù¢+Ù›+Ù”+Ù+Ù†+Ù+Ùx+Ùq+Ùj+Ùc+Ù\+ÙU+ÙN+ÙG+Ù@+Ù9+Ù2+Ù++Ù$+Ù+Ù+Ù+Ù+Ù+Ùú*Ùó*Ùì*Ùå*ÙÞ*Ù×*ÙÐ*ÙÉ*ÙÂ*Ù»*Ù´*Ù­*Ù¦*ÙŸ*Ù˜*Ù‘*ÙŠ*Ùƒ*Ù|*Ùu*Ùn*Ùg*Ù`*ÙY*ÙR*ÙK*ÙD*Ù=*Ù6*Ù/*Ù(*Ù!*Ù*Ù*Ù *Ù*Ùþ)Ù÷)Ùð)Ùé)Ùâ)ÙÛ)ÙÔ)ÙÍ)ÙÆ)Ù¿)Ù¸)Ù±)Ùª)Ù£)Ùœ)Ù•)ÙŽ)Ù‡)Ù€)Ùy)Ùr)Ùk)Ùd)Ù])ÙV)ÙO)ÙH)ÙA)Ù:)Ù3)Ù,)Ù%)Ù)Ù)Ù)Ù )Ù)Ùû(Ùô(Ùí(Ùæ(Ùß(ÙØ(ÙÑ(ÙÊ(ÙÃ(Ù¼(Ùµ(Ù®(Ù§(Ù (Ù™(Ù’(Ù‹(Ù„(Ù}(Ùv(Ùo(Ùh(Ùa(ÙZ(ÙS(ÙL(ÙE(Ù>(Ù7(Ù0(Ù)(Ù"(Ù(Ù(Ù (Ù(Ùÿ'Ùø'Ùñ'Ùê'Ùã'ÙÜ'ÙÕ'ÙÎ'ÙÇ'ÙÀ'Ù¹'Ù²'Ù«'Ù¤'Ù'Ù–'Ù'Ùˆ'Ù'Ùz'Ùs'Ùl'Ùe'Ù^'ÙW'ÙP'ÙI'ÙB'Ù;'Ù4'Ù-'Ù&'Ù'Ù'Ù'Ù 'Ù'Ùü&Ùõ&Ùî&Ùç&Ùà&ÙÙ&ÙÒ&ÙË&ÙÄ&Ù½&Ù¶&Ù¯&Ù¨&Ù¡&Ùš&Ù“&ÙŒ&Ù…&Ù~&Ùw&Ùp&Ùi&Ùb&Ù[&ÙT&ÙM&ÙF&Ù?&Ù8&Ù1&Ù*&Ù#&Ù&Ù&Ù&Ù&Ù&Ùù%Ùò%Ùë%Ùä%ÙÝ%ÙÖ%ÙÏ%ÙÈ%ÙÁ%Ùº%Ù³%Ù¬%Ù¥%Ùž%Ù—%Ù%Ù‰%Ù‚%Ù{%Ùt%Ùm%Ùf%Ù_%ÙX%ÙQ%ÙJ%ÙC%Ù<%Ù5%Ù.%Ù'%Ù %Ù%Ù%Ù %Ù%Ùý$Ùö$Ùï$Ùè$Ùá$ÙÚ$ÙÓ$ÙÌ$ÙÅ$Ù¾$Ù·$Ù°$Ù©$Ù¢$Ù›$Ù”$Ù$Ù†$Ù$Ùx$Ùq$Ùj$Ùc$Ù\$ÙU$ÙN$ÙG$Ù@$Ù9$Ù2$Ù+$Ù$$Ù$Ù$Ù$Ù$Ù$Ùú#Ùó#Ùì#Ùå#ÙÞ#Ù×#ÙÐ#ÙÉ#ÙÂ#Ù»#Ù´#Ù­#Ù¦#ÙŸ#Ù˜#Ù‘#ÙŠ#Ùƒ#Ù|#Ùu#Ùn#Ùg#Ù`#ÙY#ÙR#ÙK#ÙD#Ù=#Ù6#Ù/#Ù(#Ù!#Ù#Ù#Ù #Ù#Ùþ"Ù÷"Ùð"Ùé"Ùâ"ÙÛ"ÙÔ"ÙÍ"ÙÆ"Ù¿"Ù¸"Ù±"Ùª"Ù£"Ùœ"Ù•"ÙŽ"Ù‡"Ù€"Ùy"Ùr"Ùk"Ùd"Ù]"ÙV"ÙO"ÙH"ÙA"Ù:"Ù3"Ù,"Ù%"Ù"Ù"Ù"Ù "Ù"Ùû!Ùô!Ùí!Ùæ!Ùß!ÙØ!ÙÑ!ÙÊ!ÙÃ!Ù¼!Ùµ!Ù®!Ù§!Ù !Ù™!Ù’!Ù‹!Ù„!Ù}!Ùv!Ùo!Ùh!Ùa!ÙZ!ÙS!ÙL!ÙE!Ù>!Ù7!Ù0!Ù)!Ù"!Ù!Ù!Ù !Ù!Ùÿ Ùø Ùñ Ùê Ùã ÙÜ ÙÕ ÙÎ ÙÇ ÙÀ Ù¹ Ù² Ù« Ù¤ Ù Ù– Ù Ùˆ Ù Ùz Ùs Ùl Ùe Ù^ ÙW ÙP ÙI ÙB Ù; Ù4 Ù- Ù& Ù Ù Ù Ù Ù ÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþ Ù÷ Ùð Ùé Ùâ ÙÛ ÙÔ ÙÍ ÙÆ Ù¿ Ù¸ Ù± Ùª Ù£ Ùœ Ù• ÙŽ Ù‡ Ù€ Ùy Ùr Ùk Ùd Ù] ÙV ÙO ÙH ÙA Ù: Ù3 Ù, Ù% Ù Ù Ù Ù Ù Ùû Ùô Ùí Ùæ Ùß ÙØ ÙÑ ÙÊ Ùà Ù¼ Ùµ Ù® Ù§ Ù  Ù™ Ù’ Ù‹ Ù„ Ù} Ùv Ùo Ùh Ùa ÙZ ÙS ÙL ÙE Ù> Ù7 Ù0 Ù) Ù" Ù Ù Ù Ù Ùÿ Ùø Ùñ Ùê Ùã ÙÜ ÙÕ ÙÎ ÙÇ ÙÀ Ù¹ Ù² Ù« Ù¤ Ù Ù– Ù Ùˆ Ù Ùz Ùs Ùl Ùe Ù^ ÙW ÙP ÙI ÙB Ù; Ù4 Ù- Ù& Ù Ù Ù Ù Ù Ùü Ùõ Ùî Ùç Ùà ÙÙ ÙÒ ÙË ÙÄ Ù½ Ù¶ Ù¯ Ù¨ Ù¡ Ùš Ù“ ÙŒ Ù… Ù~ Ùw Ùp Ùi Ùb Ù[ ÙT ÙM ÙF Ù? Ù8 Ù1 Ù* Ù# Ù Ù Ù Ù Ù Ùù Ùò Ùë Ùä ÙÝ ÙÖ ÙÏ ÙÈ ÙÁ Ùº Ù³ Ù¬ Ù¥ Ùž Ù— Ù Ù‰ Ù‚ Ù{ Ùt Ùm Ùf Ù_ ÙX ÙQ ÙJ ÙC Ù< Ù5 Ù. Ù' Ù Ù Ù Ù Ù ÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþÿØ÷ÿØðÿØéÿØâÿØÛÿØÔÿØÍÿØÆÿØ¿ÿظÿرÿتÿØ£ÿØœÿØ•ÿØŽÿ؇ÿØ€ÿØyÿØrÿØkÿØdÿØ]ÿØVÿØOÿØHÿØAÿØ:ÿØ3ÿØ,ÿØ%ÿØÿØÿØÿØ ÿØÿØûþØôþØíþØæþØßþØØþØÑþØÊþØÃþؼþصþØ®þاþØ þØ™þØ’þØ‹þØ„þØ}þØvþØoþØhþØaþØZþØSþØLþØEþØ>þØ7þØ0þØ)þØ"þØþØþØ þØþØÿýØøýØñýØêýØãýØÜýØÕýØÎýØÇýØÀýعýزýØ«ýؤýØýØ–ýØý؈ýØýØzýØsýØlýØeýØ^ýØWýØPýØIýØBýØ;ýØ4ýØ-ýØ&ýØýØýØýØ ýØýØüüØõüØîüØçüØàüØÙüØÒüØËüØÄüؽüضüدüبüØ¡üØšüØ“üØŒüØ…üØ~üØwüØpüØiüØbüØ[üØTüØMüØFüØ?üØ8üØ1üØ*üØ#üØüØüØüØüØüØùûØòûØëûØäûØÝûØÖûØÏûØÈûØÁûغûسûجûØ¥ûØžûØ—ûØû؉ûØ‚ûØ{ûØtûØmûØfûØ_ûØXûØQûØJûØCûØ<ûØ5ûØ.ûØ'ûØ ûØûØûØ ûØûØýúØöúØïúØèúØáúØÚúØÓúØÌúØÅúؾúØ·úذúØ©úØ¢úØ›úØ”úØú؆úØúØxúØqúØjúØcúØ\úØUúØNúØGúØ@úØ9úØ2úØ+úØ$úØúØúØúØúØúØúùØóùØìùØåùØÞùØ×ùØÐùØÉùØÂùØ»ùØ´ùØ­ùئùØŸùؘùØ‘ùØŠù؃ùØ|ùØuùØnùØgùØ`ùØYùØRùØKùØDùØ=ùØ6ùØ/ùØ(ùØ!ùØùØùØ ùØùØþøØ÷øØðøØéøØâøØÛøØÔøØÍøØÆøØ¿øØ¸øØ±øØªøØ£øØœøØ•øØŽøØ‡øØ€øØyøØrøØkøØdøØ]øØVøØOøØHøØAøØ:øØ3øØ,øØ%øØøØøØøØ øØøØû÷Øô÷Øí÷Øæ÷Øß÷ØØ÷ØÑ÷ØÊ÷ØÃ÷ؼ÷ص÷Ø®÷ا÷Ø ÷Ø™÷Ø’÷Ø‹÷Ø„÷Ø}÷Øv÷Øo÷Øh÷Øa÷ØZ÷ØS÷ØL÷ØE÷Ø>÷Ø7÷Ø0÷Ø)÷Ø"÷Ø÷Ø÷Ø ÷Ø÷ØÿöØøöØñöØêöØãöØÜöØÕöØÎöØÇöØÀöعöزöØ«öؤöØöØ–öØö؈öØöØzöØsöØlöØeöØ^öØWöØPöØIöØBöØ;öØ4öØ-öØ&öØöØöØöØ öØöØüõØõõØîõØçõØàõØÙõØÒõØËõØÄõؽõضõدõبõØ¡õØšõØ“õØŒõØ…õØ~õØwõØpõØiõØbõØ[õØTõØMõØFõØ?õØ8õØ1õØ*õØ#õØõØõØõØõØõØùôØòôØëôØäôØÝôØÖôØÏôØÈôØÁôغôسôجôØ¥ôØžôØ—ôØô؉ôØ‚ôØ{ôØtôØmôØfôØ_ôØXôØQôØJôØCôØ<ôØ5ôØ.ôØ'ôØ ôØôØôØ ôØôØýóØöóØïóØèóØáóØÚóØÓóØÌóØÅóؾóØ·óذóØ©óØ¢óØ›óØ”óØó؆óØóØxóØqóØjóØcóØ\óØUóØNóØGóØ@óØ9óØ2óØ+óØ$óØóØóØóØóØóØúòØóòØìòØåòØÞòØ×òØÐòØÉòØÂòØ»òØ´òØ­òئòØŸòؘòØ‘òØŠò؃òØ|òØuòØnòØgòØ`òØYòØRòØKòØDòØ=òØ6òØ/òØ(òØ!òØòØòØ òØòØþñØ÷ñØðñØéñØâñØÛñØÔñØÍñØÆñØ¿ñظñرñتñØ£ñØœñØ•ñØŽñ؇ñØ€ñØyñØrñØkñØdñØ]ñØVñØOñØHñØAñØ:ñØ3ñØ,ñØ%ñØñØñØñØ ñØñØûðØôðØíðØæðØßðØØðØÑðØÊðØÃðؼðصðØ®ðاðØ ðØ™ðØ’ðØ‹ðØ„ðØ}ðØvðØoðØhðØaðØZðØSðØLðØEðØ>ðØ7ðØ0ðØ)ðØ"ðØðØðØ ðØðØÿïØøïØñïØêïØãïØÜïØÕïØÎïØÇïØÀïØ¹ïØ²ïØ«ïØ¤ïØïØ–ïØï؈ïØïØzïØsïØlïØeïØ^ïØWïØPïØIïØBïØ;ïØ4ïØ-ïØ&ïØïØïØïØ ïØïØüîØõîØîîØçîØàîØÙîØÒîØËîØÄîØ½îØ¶îØ¯îØ¨îØ¡îØšîØ“îØŒîØ…îØ~îØwîØpîØiîØbîØ[îØTîØMîØFîØ?îØ8îØ1îØ*îØ#îØîØîØîØîØîØùíØòíØëíØäíØÝíØÖíØÏíØÈíØÁíØºíØ³íØ¬íØ¥íØžíØ—íØíØ‰íØ‚íØ{íØtíØmíØfíØ_íØXíØQíØJíØCíØ<íØ5íØ.íØ'íØ íØíØíØ íØíØýìØöìØïìØèìØáìØÚìØÓìØÌìØÅìØ¾ìØ·ìØ°ìØ©ìØ¢ìØ›ìØ”ìØì؆ìØìØxìØqìØjìØcìØ\ìØUìØNìØGìØ@ìØ9ìØ2ìØ+ìØ$ìØìØìØìØìØìØúëØóëØìëØåëØÞëØ×ëØÐëØÉëØÂëØ»ëØ´ëØ­ëØ¦ëØŸëØ˜ëØ‘ëØŠëØƒëØ|ëØuëØnëØgëØ`ëØYëØRëØKëØDëØ=ëØ6ëØ/ëØ(ëØ!ëØëØëØ ëØëØþêØ÷êØðêØéêØâêØÛêØÔêØÍêØÆêØ¿êØ¸êØ±êØªêØ£êØœêØ•êØŽêØ‡êØ€êØyêØrêØkêØdêØ]êØVêØOêØHêØAêØ:êØ3êØ,êØ%êØêØêØêØ êØêØûéØôéØí騿éØß騨éØÑéØÊéØÃ騼騵騮騧騠騙騒騋騄éØ}éØvéØoéØhéØaéØZéØSéØLéØEéØ>éØ7éØ0éØ)éØ"éØéØéØ éØéØÿèØøèØñèØêèØãèØÜèØÕèØÎèØÇèØÀèØ¹èØ²èØ«èØ¤èØèØ–èØè؈èØèØzèØsèØlèØeèØ^èØWèØPèØIèØBèØ;èØ4èØ-èØ&èØèØèØèØ èØèØüçØõçØîçØççØàçØÙçØÒçØËçØÄçØ½çØ¶çØ¯çØ¨çØ¡çØšçØ“çØŒçØ…çØ~çØwçØpçØiçØbçØ[çØTçØMçØFçØ?çØ8çØ1çØ*çØ#çØçØçØçØçØçØùæØòæØëæØ俨ÝæØÖæØÏæØÈæØÁæØºæØ³æØ¬æØ¥æØžæØ—æØæØ‰æØ‚æØ{æØtæØmæØfæØ_æØXæØQæØJæØCæØ<æØ5æØ.æØ'æØ æØæØæØ æØæØýåØöåØïåØèåØáåØÚåØÓåØÌåØÅ娾娷娰娩娢娛娔åØå؆åØåØxåØqåØjåØcåØ\åØUåØNåØGåØ@åØ9åØ2åØ+åØ$åØåØåØåØåØåØúäØóäØìäØåäØÞäØ×äØÐäØÉäØÂäØ»äØ´äØ­äØ¦äØŸäØ˜äØ‘äØŠäØƒäØ|äØuäØnäØgäØ`äØYäØRäØKäØDäØ=äØ6äØ/äØ(äØ!äØäØäØ äØäØþãØ÷ãØðãØéãØâãØÛãØÔãØÍãØÆãØ¿ãØ¸ãØ±ãØªãØ£ãØœãØ•ãØŽãØ‡ãØ€ãØyãØrãØkãØdãØ]ãØVãØOãØHãØAãØ:ãØ3ãØ,ãØ%ãØãØãØãØ ãØãØûâØôâØíâØæâØßâØØâØÑâØÊâØÃâØ¼âØµâØ®âØ§âØ âØ™âØ’âØ‹âØ„âØ}âØvâØoâØhâØaâØZâØSâØLâØEâØ>âØ7âØ0âØ)âØ"âØâØâØ âØâØÿáØøáØñáØêáØãáØÜáØÕáØÎáØÇáØÀáØ¹áØ²áØ«áØ¤áØáØ–áØá؈áØáØzáØsáØláØeáØ^áØWáØPáØIáØBáØ;áØ4áØ-áØ&áØáØáØáØ áØáØüàØõàØîàØçàØààØÙàØÒàØËàØÄàØ½àØ¶àØ¯àØ¨àØ¡àØšàØ“àØŒàØ…àØ~àØwàØpàØiàØbàØ[àØTàØMàØFàØ?àØ8àØ1àØ*àØ#àØàØàØàØàØàØùߨòߨëߨäߨÝߨÖߨÏߨÈߨÁߨºßØ³ßØ¬ßØ¥ßØžßØ—ߨߨ‰ßØ‚ߨ{ߨtߨmߨfߨ_ߨXߨQߨJߨCߨ<ߨ5ߨ.ߨ'ߨ ߨߨߨ ߨߨýÞØöÞØïÞØèÞØáÞØÚÞØÓÞØÌÞØÅÞØ¾ÞØ·ÞØ°ÞØ©ÞØ¢ÞØ›ÞØ”ÞØÞØ†ÞØÞØxÞØqÞØjÞØcÞØ\ÞØUÞØNÞØGÞØ@ÞØ9ÞØ2ÞØ+ÞØ$ÞØÞØÞØÞØÞØÞØúÝØóÝØìÝØåÝØÞÝØ×ÝØÐÝØÉÝØÂÝØ»ÝØ´ÝØ­ÝØ¦ÝØŸÝØ˜ÝØ‘ÝØŠÝØƒÝØ|ÝØuÝØnÝØgÝØ`ÝØYÝØRÝØKÝØDÝØ=ÝØ6ÝØ/ÝØ(ÝØ!ÝØÝØÝØ ÝØÝØþÜØ÷ÜØðÜØéÜØâÜØÛÜØÔÜØÍÜØÆÜØ¿ÜØ¸ÜØ±ÜØªÜØ£ÜØœÜØ•ÜØŽÜØ‡ÜØ€ÜØyÜØrÜØkÜØdÜØ]ÜØVÜØOÜØHÜØAÜØ:ÜØ3ÜØ,ÜØ%ÜØÜØÜØÜØ ÜØÜØûÛØôÛØíÛØæÛØßÛØØÛØÑÛØÊÛØÃÛØ¼ÛØµÛØ®ÛØ§ÛØ ÛØ™ÛØ’ÛØ‹ÛØ„ÛØ}ÛØvÛØoÛØhÛØaÛØZÛØSÛØLÛØEÛØ>ÛØ7ÛØ0ÛØ)ÛØ"ÛØÛØÛØ ÛØÛØÿÚØøÚØñÚØêÚØãÚØÜÚØÕÚØÎÚØÇÚØÀÚØ¹ÚØ²ÚØ«ÚØ¤ÚØÚØ–ÚØÚØˆÚØÚØzÚØsÚØlÚØeÚØ^ÚØWÚØPÚØIÚØBÚØ;ÚØ4ÚØ-ÚØ&ÚØÚØÚØÚØ ÚØÚØüÙØõÙØîÙØçÙØàÙØÙÙØÒÙØËÙØÄÙØ½ÙØ¶ÙØ¯ÙØ¨ÙØ¡ÙØšÙØ“ÙØŒÙØ…ÙØ~ÙØwÙØpÙØiÙØbÙØ[ÙØTÙØMÙØFÙØ?ÙØ8ÙØ1ÙØ*ÙØ#ÙØÙØÙØÙØÙØÙØùØØòØØëØØ䨨ÝØØÖØØÏØØÈØØÁØØºØØ³ØØ¬ØØ¥ØØžØØ—ØØØØ‰ØØ‚ØØ{ØØtØØmØØfØØ_ØØXØØQØØJØØCØØ<ØØ5ØØ.ØØ'ØØ ØØØØØØ ØØØØýרöרïרèרáרÚרÓרÌרÅר¾×Ø·×Ø°×Ø©×Ø¢×Ø›×Ø”רר†×Øרxרqרjרcר\רUרNרGר@ר9ר2ר+ר$ררררררúÖØóÖØìÖØåÖØÞÖØ×ÖØÐÖØÉÖØÂÖØ»ÖØ´ÖØ­ÖØ¦ÖØŸÖØ˜ÖØ‘ÖØŠÖØƒÖØ|ÖØuÖØnÖØgÖØ`ÖØYÖØRÖØKÖØDÖØ=ÖØ6ÖØ/ÖØ(ÖØ!ÖØÖØÖØ ÖØÖØþÕØ÷ÕØðÕØéÕØâÕØÛÕØÔÕØÍÕØÆÕØ¿ÕØ¸ÕØ±ÕØªÕØ£ÕØœÕØ•ÕØŽÕØ‡ÕØ€ÕØyÕØrÕØkÕØdÕØ]ÕØVÕØOÕØHÕØAÕØ:ÕØ3ÕØ,ÕØ%ÕØÕØÕØÕØ ÕØÕØûÔØôÔØíÔØæÔØßÔØØÔØÑÔØÊÔØÃÔØ¼ÔØµÔØ®ÔØ§ÔØ ÔØ™ÔØ’ÔØ‹ÔØ„ÔØ}ÔØvÔØoÔØhÔØaÔØZÔØSÔØLÔØEÔØ>ÔØ7ÔØ0ÔØ)ÔØ"ÔØÔØÔØ ÔØÔØÿÓØøÓØñÓØêÓØãÓØÜÓØÕÓØÎÓØÇÓØÀÓØ¹ÓØ²ÓØ«ÓØ¤ÓØÓØ–ÓØÓØˆÓØÓØzÓØsÓØlÓØeÓØ^ÓØWÓØPÓØIÓØBÓØ;ÓØ4ÓØ-ÓØ&ÓØÓØÓØÓØ ÓØÓØüÒØõÒØîÒØçÒØàÒØÙÒØÒÒØËÒØÄÒØ½ÒØ¶ÒØ¯ÒØ¨ÒØ¡ÒØšÒØ“ÒØŒÒØ…ÒØ~ÒØwÒØpÒØiÒØbÒØ[ÒØTÒØMÒØFÒØ?ÒØ8ÒØ1ÒØ*ÒØ#ÒØÒØÒØÒØÒØÒØùÑØòÑØëÑØäÑØÝÑØÖÑØÏÑØÈÑØÁÑØºÑØ³ÑØ¬ÑØ¥ÑØžÑØ—ÑØÑØ‰ÑØ‚ÑØ{ÑØtÑØmÑØfÑØ_ÑØXÑØQÑØJÑØCÑØ<ÑØ5ÑØ.ÑØ'ÑØ ÑØÑØÑØ ÑØÑØýÐØöÐØïÐØèÐØáÐØÚÐØÓÐØÌÐØÅÐØ¾ÐØ·ÐØ°ÐØ©ÐØ¢ÐØ›ÐØ”ÐØÐØ†ÐØÐØxÐØqÐØjÐØcÐØ\ÐØUÐØNÐØGÐØ@ÐØ9ÐØ2ÐØ+ÐØ$ÐØÐØÐØÐØÐØÐØúÏØóÏØìÏØåÏØÞÏØ×ÏØÐÏØÉÏØÂÏØ»ÏØ´ÏØ­ÏØ¦ÏØŸÏØ˜ÏØ‘ÏØŠÏØƒÏØ|ÏØuÏØnÏØgÏØ`ÏØYÏØRÏØKÏØDÏØ=ÏØ6ÏØ/ÏØ(ÏØ!ÏØÏØÏØ ÏØÏØþÎØ÷ÎØðÎØéÎØâÎØÛÎØÔÎØÍÎØÆÎØ¿ÎØ¸ÎØ±ÎØªÎØ£ÎØœÎØ•ÎØŽÎØ‡ÎØ€ÎØyÎØrÎØkÎØdÎØ]ÎØVÎØOÎØHÎØAÎØ:ÎØ3ÎØ,ÎØ%ÎØÎØÎØÎØ ÎØÎØûÍØôÍØíÍØæÍØßÍØØÍØÑÍØÊÍØÃÍØ¼ÍØµÍØ®ÍØ§ÍØ ÍØ™ÍØ’ÍØ‹ÍØ„ÍØ}ÍØvÍØoÍØhÍØaÍØZÍØSÍØLÍØEÍØ>ÍØ7ÍØ0ÍØ)ÍØ"ÍØÍØÍØ ÍØÍØÿÌØøÌØñÌØêÌØãÌØÜÌØÕÌØÎÌØÇÌØÀÌØ¹ÌØ²ÌØ«ÌØ¤ÌØÌØ–ÌØÌØˆÌØÌØzÌØsÌØlÌØeÌØ^ÌØWÌØPÌØIÌØBÌØ;ÌØ4ÌØ-ÌØ&ÌØÌØÌØÌØ ÌØÌØüËØõËØîËØçËØàËØÙËØÒËØËËØÄËØ½ËØ¶ËØ¯ËØ¨ËØ¡ËØšËØ“ËØŒËØ…ËØ~ËØwËØpËØiËØbËØ[ËØTËØMËØFËØ?ËØ8ËØ1ËØ*ËØ#ËØËØËØËØËØËØùÊØòÊØëÊØäÊØÝÊØÖÊØÏÊØÈÊØÁÊØºÊØ³ÊØ¬ÊØ¥ÊØžÊØ—ÊØÊØ‰ÊØ‚ÊØ{ÊØtÊØmÊØfÊØ_ÊØXÊØQÊØJÊØCÊØ<ÊØ5ÊØ.ÊØ'ÊØ ÊØÊØÊØ ÊØÊØýÉØöÉØïÉØèÉØáÉØÚÉØÓÉØÌÉØÅÉØ¾ÉØ·ÉØ°ÉØ©ÉØ¢ÉØ›ÉØ”ÉØÉØ†ÉØÉØxÉØqÉØjÉØcÉØ\ÉØUÉØNÉØGÉØ@ÉØ9ÉØ2ÉØ+ÉØ$ÉØÉØÉØÉØÉØÉØúÈØóÈØìÈØåÈØÞÈØ×ÈØÐÈØÉÈØÂÈØ»ÈØ´ÈØ­ÈØ¦ÈØŸÈØ˜ÈØ‘ÈØŠÈØƒÈØ|ÈØuÈØnÈØgÈØ`ÈØYÈØRÈØKÈØDÈØ=ÈØ6ÈØ/ÈØ(ÈØ!ÈØÈØÈØ ÈØÈØþÇØ÷ÇØðÇØéÇØâÇØÛÇØÔÇØÍÇØÆÇØ¿ÇØ¸ÇØ±ÇØªÇØ£ÇØœÇØ•ÇØŽÇØ‡ÇØ€ÇØyÇØrÇØkÇØdÇØ]ÇØVÇØOÇØHÇØAÇØ:ÇØ3ÇØ,ÇØ%ÇØÇØÇØÇØ ÇØÇØûÆØôÆØíÆØæÆØ߯ØØÆØÑÆØÊÆØÃÆØ¼ÆØµÆØ®ÆØ§ÆØ ÆØ™ÆØ’ÆØ‹ÆØ„ÆØ}ÆØvÆØoÆØhÆØaÆØZÆØSÆØLÆØEÆØ>ÆØ7ÆØ0ÆØ)ÆØ"ÆØÆØÆØ ÆØÆØÿÅØøÅØñÅØêÅØãÅØÜÅØÕÅØÎÅØÇÅØÀÅØ¹ÅØ²ÅØ«ÅØ¤ÅØÅØ–ÅØÅØˆÅØÅØzÅØsÅØlÅØeÅØ^ÅØWÅØPÅØIÅØBÅØ;ÅØ4ÅØ-ÅØ&ÅØÅØÅØÅØ ÅØÅØüÄØõÄØîÄØçÄØàÄØÙÄØÒÄØËÄØÄÄØ½ÄØ¶ÄØ¯ÄØ¨ÄØ¡ÄØšÄØ“ÄØŒÄØ…ÄØ~ÄØwÄØpÄØiÄØbÄØ[ÄØTÄØMÄØFÄØ?ÄØ8ÄØ1ÄØ*ÄØ#ÄØÄØÄØÄØÄØÄØùÃØòÃØëÃØäÃØÝÃØÖÃØÏÃØÈÃØÁÃØºÃØ³ÃØ¬ÃØ¥ÃØžÃØ—ÃØÃØ‰ÃØ‚ÃØ{ÃØtÃØmÃØfÃØ_ÃØXÃØQÃØJÃØCÃØ<ÃØ5ÃØ.ÃØ'ÃØ ÃØÃØÃØ ÃØÃØýÂØöÂØïÂØèÂØáÂØÚÂØÓÂØÌÂØÅÂØ¾ÂØ·ÂØ°ÂØ©ÂØ¢ÂØ›ÂØ”ÂØÂØ†ÂØÂØxÂØqÂØjÂØcÂØ\ÂØUÂØNÂØGÂØ@ÂØ9ÂØ2ÂØ+ÂØ$ÂØÂØÂØÂØÂØÂØúÁØóÁØìÁØåÁØÞÁØ×ÁØÐÁØÉÁØÂÁØ»ÁØ´ÁØ­ÁئÁØŸÁؘÁØ‘ÁØŠÁ؃ÁØ|ÁØuÁØnÁØgÁØ`ÁØYÁØRÁØKÁØDÁØ=ÁØ6ÁØ/ÁØ(ÁØ!ÁØÁØÁØ ÁØÁØþÀØ÷ÀØðÀØéÀØâÀØÛÀØÔÀØÍÀØÆÀØ¿ÀظÀرÀتÀØ£ÀØœÀØ•ÀØŽÀ؇ÀØ€ÀØyÀØrÀØkÀØdÀØ]ÀØVÀØOÀØHÀØAÀØ:ÀØ3ÀØ,ÀØ%ÀØÀØÀØÀØ ÀØÀØû¿Øô¿Øí¿Øæ¿Øß¿ØØ¿ØÑ¿ØÊ¿Øÿؼ¿Øµ¿Ø®¿Ø§¿Ø ¿Ø™¿Ø’¿Ø‹¿Ø„¿Ø}¿Øv¿Øo¿Øh¿Øa¿ØZ¿ØS¿ØL¿ØE¿Ø>¿Ø7¿Ø0¿Ø)¿Ø"¿Ø¿Ø¿Ø ¿Ø¿Øÿ¾Øø¾Øñ¾Øê¾Øã¾ØܾØÕ¾ØξØǾØÀ¾Ø¹¾Ø²¾Ø«¾Ø¤¾Ø¾Ø–¾Ø¾Øˆ¾Ø¾Øz¾Øs¾Øl¾Øe¾Ø^¾ØW¾ØP¾ØI¾ØB¾Ø;¾Ø4¾Ø-¾Ø&¾Ø¾Ø¾Ø¾Ø ¾Ø¾Øü½Øõ½Øî½Øç½Øà½ØÙ½ØÒ½Ø˽ØĽØ½½Ø¶½Ø¯½Ø¨½Ø¡½Øš½Ø“½ØŒ½Ø…½Ø~½Øw½Øp½Øi½Øb½Ø[½ØT½ØM½ØF½Ø?½Ø8½Ø1½Ø*½Ø#½Ø½Ø½Ø½Ø½Ø½Øù¼Øò¼Øë¼Ø伨ݼØÖ¼ØϼØȼØÁ¼Øº¼Ø³¼Ø¬¼Ø¥¼Øž¼Ø—¼Ø¼Ø‰¼Ø‚¼Ø{¼Øt¼Øm¼Øf¼Ø_¼ØX¼ØQ¼ØJ¼ØC¼Ø<¼Ø5¼Ø.¼Ø'¼Ø ¼Ø¼Ø¼Ø ¼Ø¼Øý»Øö»Øï»Øè»Øá»ØÚ»ØÓ»ØÌ»ØÅ»Ø¾»Ø·»Ø°»Ø©»Ø¢»Ø›»Ø”»Ø»Ø†»Ø»Øx»Øq»Øj»Øc»Ø\»ØU»ØN»ØG»Ø@»Ø9»Ø2»Ø+»Ø$»Ø»Ø»Ø»Ø»Ø»ØúºØóºØìºØåºØÞºØ׺ØкØɺغػºØ´ºØ­ºØ¦ºØŸºØ˜ºØ‘ºØŠºØƒºØ|ºØuºØnºØgºØ`ºØYºØRºØKºØDºØ=ºØ6ºØ/ºØ(ºØ!ºØºØºØ ºØºØþ¹Ø÷¹Øð¹Ø鹨â¹ØÛ¹ØÔ¹Ø͹ØƹØ¿¹Ø¸¹Ø±¹Øª¹Ø£¹Øœ¹Ø•¹Ø޹؇¹Ø€¹Øy¹Ør¹Øk¹Ød¹Ø]¹ØV¹ØO¹ØH¹ØA¹Ø:¹Ø3¹Ø,¹Ø%¹Ø¹Ø¹Ø¹Ø ¹Ø¹Øû¸Øô¸Øí¸Øæ¸Ø߸ØظØѸØʸØøØ¼¸Øµ¸Ø®¸Ø§¸Ø ¸Ø™¸Ø’¸Ø‹¸Ø„¸Ø}¸Øv¸Øo¸Øh¸Øa¸ØZ¸ØS¸ØL¸ØE¸Ø>¸Ø7¸Ø0¸Ø)¸Ø"¸Ø¸Ø¸Ø ¸Ø¸Øÿ·Øø·Øñ·Øê·Øã·ØÜ·ØÕ·ØηØÇ·ØÀ·Ø¹·Ø²·Ø«·Ø¤·Ø·Ø–·Ø·Øˆ·Ø·Øz·Øs·Øl·Øe·Ø^·ØW·ØP·ØI·ØB·Ø;·Ø4·Ø-·Ø&·Ø·Ø·Ø·Ø ·Ø·Øü¶Øõ¶Øî¶Øç¶Øà¶ØÙ¶ØÒ¶Ø˶ØĶؽ¶Ø¶¶Ø¯¶Ø¨¶Ø¡¶Øš¶Ø“¶ØŒ¶Ø…¶Ø~¶Øw¶Øp¶Øi¶Øb¶Ø[¶ØT¶ØM¶ØF¶Ø?¶Ø8¶Ø1¶Ø*¶Ø#¶Ø¶Ø¶Ø¶Ø¶Ø¶ØùµØòµØëµØ䵨ݵØÖµØϵØȵØÁµØºµØ³µØ¬µØ¥µØžµØ—µØµØ‰µØ‚µØ{µØtµØmµØfµØ_µØXµØQµØJµØCµØ<µØ5µØ.µØ'µØ µØµØµØ µØµØý´Øö´Øï´Øè´Øá´ØÚ´ØÓ´ØÌ´ØÅ´Ø¾´Ø·´Ø°´Ø©´Ø¢´Ø›´Ø”´Ø´Ø†´Ø´Øx´Øq´Øj´Øc´Ø\´ØU´ØN´ØG´Ø@´Ø9´Ø2´Ø+´Ø$´Ø´Ø´Ø´Ø´Ø´Øú³Øó³Øì³Ø峨Þ³Ø׳ØгØɳسػ³Ø´³Ø­³Ø¦³ØŸ³Ø˜³Ø‘³Øг؃³Ø|³Øu³Øn³Øg³Ø`³ØY³ØR³ØK³ØD³Ø=³Ø6³Ø/³Ø(³Ø!³Ø³Ø³Ø ³Ø³Øþ²Ø÷²Øð²Ø鲨â²ØÛ²ØÔ²ØͲØƲØ¿²Ø¸²Ø±²Øª²Ø£²Øœ²Ø•²Ø޲؇²Ø€²Øy²Ør²Øk²Ød²Ø]²ØV²ØO²ØH²ØA²Ø:²Ø3²Ø,²Ø%²Ø²Ø²Ø²Ø ²Ø²Øû±Øô±Øí±Øæ±Øß±ØرØѱØʱØñؼ±Øµ±Ø®±Ø§±Ø ±Ø™±Ø’±Ø‹±Ø„±Ø}±Øv±Øo±Øh±Øa±ØZ±ØS±ØL±ØE±Ø>±Ø7±Ø0±Ø)±Ø"±Ø±Ø±Ø ±Ø±Øÿ°Øø°Øñ°Øê°Øã°ØܰØÕ°ØΰØǰØÀ°Ø¹°Ø²°Ø«°Ø¤°Ø°Ø–°Ø°Øˆ°Ø°Øz°Øs°Øl°Øe°Ø^°ØW°ØP°ØI°ØB°Ø;°Ø4°Ø-°Ø&°Ø°Ø°Ø°Ø °Ø°Øü¯Øõ¯Øî¯Øç¯Øà¯ØÙ¯ØÒ¯Ø˯Øįؽ¯Ø¶¯Ø¯¯Ø¨¯Ø¡¯Øš¯Ø“¯ØŒ¯Ø…¯Ø~¯Øw¯Øp¯Øi¯Øb¯Ø[¯ØT¯ØM¯ØF¯Ø?¯Ø8¯Ø1¯Ø*¯Ø#¯Ø¯Ø¯Ø¯Ø¯Ø¯Øù®Øò®Øë®Ø䮨Ý®ØÖ®ØÏ®ØÈ®ØÁ®Øº®Ø³®Ø¬®Ø¥®Øž®Ø—®Ø®Ø‰®Ø‚®Ø{®Øt®Øm®Øf®Ø_®ØX®ØQ®ØJ®ØC®Ø<®Ø5®Ø.®Ø'®Ø ®Ø®Ø®Ø ®Ø®Øý­Øö­Øï­Øè­Øá­ØÚ­ØÓ­ØÌ­ØÅ­Ø¾­Ø·­Ø°­Ø©­Ø¢­Ø›­Ø”­Ø­Ø†­Ø­Øx­Øq­Øj­Øc­Ø\­ØU­ØN­ØG­Ø@­Ø9­Ø2­Ø+­Ø$­Ø­Ø­Ø­Ø­Ø­Øú¬Øó¬Øì¬Ø嬨Þ¬Ø׬ØЬØɬجػ¬Ø´¬Ø­¬Ø¦¬ØŸ¬Ø˜¬Ø‘¬ØЬ؃¬Ø|¬Øu¬Øn¬Øg¬Ø`¬ØY¬ØR¬ØK¬ØD¬Ø=¬Ø6¬Ø/¬Ø(¬Ø!¬Ø¬Ø¬Ø ¬Ø¬Øþ«Ø÷«Øð«Ø髨â«ØÛ«ØÔ«ØÍ«ØÆ«Ø¿«Ø¸«Ø±«Øª«Ø£«Øœ«Ø•«ØŽ«Ø‡«Ø€«Øy«Ør«Øk«Ød«Ø]«ØV«ØO«ØH«ØA«Ø:«Ø3«Ø,«Ø%«Ø«Ø«Ø«Ø «Ø«ØûªØôªØíªØæªØߪØتØѪØʪØêؼªØµªØ®ªØ§ªØ ªØ™ªØ’ªØ‹ªØ„ªØ}ªØvªØoªØhªØaªØZªØSªØLªØEªØ>ªØ7ªØ0ªØ)ªØ"ªØªØªØ ªØªØÿ©Øø©Øñ©Øê©Øã©ØÜ©ØÕ©ØΩØÇ©ØÀ©Ø¹©Ø²©Ø«©Ø¤©Ø©Ø–©Ø©Øˆ©Ø©Øz©Øs©Øl©Øe©Ø^©ØW©ØP©ØI©ØB©Ø;©Ø4©Ø-©Ø&©Ø©Ø©Ø©Ø ©Ø©Øü¨Øõ¨Øî¨Øç¨Øà¨ØÙ¨ØÒ¨Ø˨ØĨؽ¨Ø¶¨Ø¯¨Ø¨¨Ø¡¨Øš¨Ø“¨ØŒ¨Ø…¨Ø~¨Øw¨Øp¨Øi¨Øb¨Ø[¨ØT¨ØM¨ØF¨Ø?¨Ø8¨Ø1¨Ø*¨Ø#¨Ø¨Ø¨Ø¨Ø¨Ø¨Øù§Øò§Øë§Øä§ØݧØÖ§ØϧØȧØÁ§Øº§Ø³§Ø¬§Ø¥§Øž§Ø—§Ø§Ø‰§Ø‚§Ø{§Øt§Øm§Øf§Ø_§ØX§ØQ§ØJ§ØC§Ø<§Ø5§Ø.§Ø'§Ø §Ø§Ø§Ø §Ø§Øý¦Øö¦Øï¦Øè¦Øá¦ØÚ¦ØÓ¦Ø̦ØŦؾ¦Ø·¦Ø°¦Ø©¦Ø¢¦Ø›¦Ø”¦Ø¦Ø†¦Ø¦Øx¦Øq¦Øj¦Øc¦Ø\¦ØU¦ØN¦ØG¦Ø@¦Ø9¦Ø2¦Ø+¦Ø$¦Ø¦Ø¦Ø¦Ø¦Ø¦Øú¥Øó¥Øì¥Ø奨Þ¥Ø×¥ØÐ¥ØÉ¥ØÂ¥Ø»¥Ø´¥Ø­¥Ø¦¥ØŸ¥Ø˜¥Ø‘¥ØŠ¥Øƒ¥Ø|¥Øu¥Øn¥Øg¥Ø`¥ØY¥ØR¥ØK¥ØD¥Ø=¥Ø6¥Ø/¥Ø(¥Ø!¥Ø¥Ø¥Ø ¥Ø¥Øþ¤Ø÷¤Øð¤Ø館â¤ØÛ¤ØÔ¤ØͤØƤØ¿¤Ø¸¤Ø±¤Øª¤Ø£¤Øœ¤Ø•¤Øޤ؇¤Ø€¤Øy¤Ør¤Øk¤Ød¤Ø]¤ØV¤ØO¤ØH¤ØA¤Ø:¤Ø3¤Ø,¤Ø%¤Ø¤Ø¤Ø¤Ø ¤Ø¤Øû£Øô£Øí£Øæ£ØߣØØ£ØÑ£ØÊ£Øãؼ£Øµ£Ø®£Ø§£Ø £Ø™£Ø’£Ø‹£Ø„£Ø}£Øv£Øo£Øh£Øa£ØZ£ØS£ØL£ØE£Ø>£Ø7£Ø0£Ø)£Ø"£Ø£Ø£Ø £Ø£Øÿ¢Øø¢Øñ¢Øê¢Øã¢ØÜ¢ØÕ¢Ø΢ØÇ¢ØÀ¢Ø¹¢Ø²¢Ø«¢Ø¤¢Ø¢Ø–¢Ø¢Øˆ¢Ø¢Øz¢Øs¢Øl¢Øe¢Ø^¢ØW¢ØP¢ØI¢ØB¢Ø;¢Ø4¢Ø-¢Ø&¢Ø¢Ø¢Ø¢Ø ¢Ø¢Øü¡Øõ¡Øî¡Øç¡Øà¡ØÙ¡ØÒ¡ØË¡ØÄ¡Ø½¡Ø¶¡Ø¯¡Ø¨¡Ø¡¡Øš¡Ø“¡ØŒ¡Ø…¡Ø~¡Øw¡Øp¡Øi¡Øb¡Ø[¡ØT¡ØM¡ØF¡Ø?¡Ø8¡Ø1¡Ø*¡Ø#¡Ø¡Ø¡Ø¡Ø¡Ø¡Øù Øò Øë Øä ØÝ ØÖ ØÏ ØÈ ØÁ Øº Ø³ Ø¬ Ø¥ Øž Ø— Ø Ø‰ Ø‚ Ø{ Øt Øm Øf Ø_ ØX ØQ ØJ ØC Ø< Ø5 Ø. Ø' Ø  Ø Ø Ø  Ø ØýŸØöŸØïŸØèŸØáŸØÚŸØÓŸØÌŸØÅŸØ¾ŸØ·ŸØ°ŸØ©ŸØ¢ŸØ›ŸØ”ŸØŸØ†ŸØŸØxŸØqŸØjŸØcŸØ\ŸØUŸØNŸØGŸØ@ŸØ9ŸØ2ŸØ+ŸØ$ŸØŸØŸØŸØŸØŸØúžØóžØìžØåžØÞžØמØОØÉžØžØ»žØ´žØ­žØ¦žØŸžØ˜žØ‘žØŠžØƒžØ|žØužØnžØgžØ`žØYžØRžØKžØDžØ=žØ6žØ/žØ(žØ!žØžØžØ žØžØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûœØôœØíœØæœØßœØØœØÑœØÊœØÜؼœØµœØ®œØ§œØ œØ™œØ’œØ‹œØ„œØ}œØvœØoœØhœØaœØZœØSœØLœØEœØ>œØ7œØ0œØ)œØ"œØœØœØ œØœØÿ›Øø›Øñ›Øê›Øã›ØÜ›ØÕ›ØΛØÇ›ØÀ›Ø¹›Ø²›Ø«›Ø¤›Ø›Ø–›Ø›Øˆ›Ø›Øz›Øs›Øl›Øe›Ø^›ØW›ØP›ØI›ØB›Ø;›Ø4›Ø-›Ø&›Ø›Ø›Ø›Ø ›Ø›ØüšØõšØîšØçšØàšØÙšØÒšØËšØÄšØ½šØ¶šØ¯šØ¨šØ¡šØššØ“šØŒšØ…šØ~šØwšØpšØišØbšØ[šØTšØMšØFšØ?šØ8šØ1šØ*šØ#šØšØšØšØšØšØù™Øò™Øë™Ø䙨Ý™ØÖ™ØÏ™ØÈ™ØÁ™Øº™Ø³™Ø¬™Ø¥™Øž™Ø—™Ø™Ø‰™Ø‚™Ø{™Øt™Øm™Øf™Ø_™ØX™ØQ™ØJ™ØC™Ø<™Ø5™Ø.™Ø'™Ø ™Ø™Ø™Ø ™Ø™Øý˜Øö˜Øï˜Øè˜Øá˜ØÚ˜ØÓ˜Ø̘ØŘؾ˜Ø·˜Ø°˜Ø©˜Ø¢˜Ø›˜Ø”˜Ø˜Ø†˜Ø˜Øx˜Øq˜Øj˜Øc˜Ø\˜ØU˜ØN˜ØG˜Ø@˜Ø9˜Ø2˜Ø+˜Ø$˜Ø˜Ø˜Ø˜Ø˜Ø˜Øú—Øó—Øì—Øå—ØÞ—Ø×—ØЗØÉ—ؗػ—Ø´—Ø­—ئ—ØŸ—ؘ—Ø‘—ØŠ—؃—Ø|—Øu—Øn—Øg—Ø`—ØY—ØR—ØK—ØD—Ø=—Ø6—Ø/—Ø(—Ø!—Ø—Ø—Ø —Ø—Øþ–Ø÷–Øð–Øé–Øâ–ØÛ–ØÔ–ØÍ–ØÆ–Ø¿–ظ–ر–ت–Ø£–Øœ–Ø•–ØŽ–؇–Ø€–Øy–Ør–Øk–Ød–Ø]–ØV–ØO–ØH–ØA–Ø:–Ø3–Ø,–Ø%–Ø–Ø–Ø–Ø –Ø–Øû•Øô•Øí•Øæ•Øß•ØØ•ØÑ•ØÊ•ØÕؼ•ص•Ø®•ا•Ø •Ø™•Ø’•Ø‹•Ø„•Ø}•Øv•Øo•Øh•Øa•ØZ•ØS•ØL•ØE•Ø>•Ø7•Ø0•Ø)•Ø"•Ø•Ø•Ø •Ø•Øÿ”Øø”Øñ”Øê”Øã”ØÜ”ØÕ”ØΔØÇ”ØÀ”ع”ز”Ø«”ؤ”ؔؖ”ؔ؈”Ø”Øz”Øs”Øl”Øe”Ø^”ØW”ØP”ØI”ØB”Ø;”Ø4”Ø-”Ø&”Ø”Ø”Ø”Ø ”Ø”Øü“Øõ“Øî“Øç“Øà“ØÙ“ØÒ“ØË“ØÄ“ؽ“ض“د“ب“Ø¡“Øš“Ø““ØŒ“Ø…“Ø~“Øw“Øp“Øi“Øb“Ø[“ØT“ØM“ØF“Ø?“Ø8“Ø1“Ø*“Ø#“ؓؓؓؓؓØù’Øò’Øë’Øä’ØÝ’ØÖ’ØÏ’ØÈ’ØÁ’غ’س’ج’Ø¥’Øž’Ø—’ؒ؉’Ø‚’Ø{’Øt’Øm’Øf’Ø_’ØX’ØQ’ØJ’ØC’Ø<’Ø5’Ø.’Ø'’Ø ’Ø’Ø’Ø ’Ø’Øý‘Øö‘Øï‘Øè‘Øá‘ØÚ‘ØÓ‘ØÌ‘ØÅ‘ؾ‘Ø·‘ذ‘Ø©‘Ø¢‘Ø›‘Ø”‘ؑ؆‘Ø‘Øx‘Øq‘Øj‘Øc‘Ø\‘ØU‘ØN‘ØG‘Ø@‘Ø9‘Ø2‘Ø+‘Ø$‘ؑؑؑؑؑØúØóØìØåØÞØרÐØÉØÂØ»Ø´Ø­Ø¦ØŸØ˜Ø‘؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûŽØôŽØíŽØæŽØߎØØŽØÑŽØÊŽØÃŽØ¼ŽØµŽØ®ŽØ§ŽØ ŽØ™ŽØ’ŽØ‹ŽØ„ŽØ}ŽØvŽØoŽØhŽØaŽØZŽØSŽØLŽØEŽØ>ŽØ7ŽØ0ŽØ)ŽØ"ŽØŽØŽØ ŽØŽØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüŒØõŒØîŒØçŒØàŒØÙŒØÒŒØËŒØÄŒØ½ŒØ¶ŒØ¯ŒØ¨ŒØ¡ŒØšŒØ“ŒØŒŒØ…ŒØ~ŒØwŒØpŒØiŒØbŒØ[ŒØTŒØMŒØFŒØ?ŒØ8ŒØ1ŒØ*ŒØ#ŒØŒØŒØŒØŒØŒØù‹Øò‹Øë‹Ø䋨Ý‹ØÖ‹ØÏ‹ØÈ‹ØÁ‹Øº‹Ø³‹Ø¬‹Ø¥‹Øž‹Ø—‹Ø‹Ø‰‹Ø‚‹Ø{‹Øt‹Øm‹Øf‹Ø_‹ØX‹ØQ‹ØJ‹ØC‹Ø<‹Ø5‹Ø.‹Ø'‹Ø ‹Ø‹Ø‹Ø ‹Ø‹ØýŠØöŠØïŠØèŠØáŠØÚŠØÓŠØÌŠØÅŠØ¾ŠØ·ŠØ°ŠØ©ŠØ¢ŠØ›ŠØ”ŠØŠØ†ŠØŠØxŠØqŠØjŠØcŠØ\ŠØUŠØNŠØGŠØ@ŠØ9ŠØ2ŠØ+ŠØ$ШШШШШШú‰Øó‰Øì‰Ø剨Þ‰Ø׉ØЉØɉ؉ػ‰Ø´‰Ø­‰Ø¦‰ØŸ‰Ø˜‰Ø‘‰ØЉØƒ‰Ø|‰Øu‰Øn‰Øg‰Ø`‰ØY‰ØR‰ØK‰ØD‰Ø=‰Ø6‰Ø/‰Ø(‰Ø!‰Ø‰Ø‰Ø ‰Ø‰ØþˆØ÷ˆØðˆØéˆØâˆØÛˆØÔˆØ͈ØƈØ¿ˆØ¸ˆØ±ˆØªˆØ£ˆØœˆØ•ˆØŽˆØ‡ˆØ€ˆØyˆØrˆØkˆØdˆØ]ˆØVˆØOˆØHˆØAˆØ:ˆØ3ˆØ,ˆØ%ˆØˆØˆØˆØ ˆØˆØû‡Øô‡Øí‡Øæ‡Ø߇Ø؇ØчØʇØÇؼ‡Øµ‡Ø®‡Ø§‡Ø ‡Ø™‡Ø’‡Ø‹‡Ø„‡Ø}‡Øv‡Øo‡Øh‡Øa‡ØZ‡ØS‡ØL‡ØE‡Ø>‡Ø7‡Ø0‡Ø)‡Ø"‡Ø‡Ø‡Ø ‡Ø‡Øÿ†Øø†Øñ†Øê†Øã†Ø܆ØÕ†ØΆØdžØÀ†Ø¹†Ø²†Ø«†Ø¤†Ø†Ø–†Ø†Øˆ†Ø†Øz†Øs†Øl†Øe†Ø^†ØW†ØP†ØI†ØB†Ø;†Ø4†Ø-†Ø&†Ø†Ø†Ø†Ø †Ø†Øü…Øõ…Øî…Øç…Øà…ØÙ…ØÒ…ØË…ØÄ…ؽ…ض…د…ب…Ø¡…Øš…Ø“…ØŒ…Ø……Ø~…Øw…Øp…Øi…Øb…Ø[…ØT…ØM…ØF…Ø?…Ø8…Ø1…Ø*…Ø#…؅؅؅؅؅Øù„Øò„Øë„Ø䄨Ý„ØÖ„ØÏ„ØÈ„ØÁ„غ„س„ج„Ø¥„Øž„Ø—„؄؉„Ø‚„Ø{„Øt„Øm„Øf„Ø_„ØX„ØQ„ØJ„ØC„Ø<„Ø5„Ø.„Ø'„Ø „Ø„Ø„Ø „Ø„ØýƒØöƒØïƒØèƒØáƒØÚƒØÓƒØ̃ØŃؾƒØ·ƒØ°ƒØ©ƒØ¢ƒØ›ƒØ”ƒØƒØ†ƒØƒØxƒØqƒØjƒØcƒØ\ƒØUƒØNƒØGƒØ@ƒØ9ƒØ2ƒØ+ƒØ$ƒØƒØƒØƒØƒØƒØú‚Øó‚Øì‚Ø储Þ‚ØׂØЂØÉ‚؂ػ‚Ø´‚Ø­‚ئ‚ØŸ‚ؘ‚Ø‘‚ØŠ‚؃‚Ø|‚Øu‚Øn‚Øg‚Ø`‚ØY‚ØR‚ØK‚ØD‚Ø=‚Ø6‚Ø/‚Ø(‚Ø!‚Ø‚Ø‚Ø ‚Ø‚ØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû€Øô€Øí€Øæ€Ø߀ØØ€ØÑ€ØÊ€ØÀؼ€Øµ€Ø®€Ø§€Ø €Ø™€Ø’€Ø‹€Ø„€Ø}€Øv€Øo€Øh€Øa€ØZ€ØS€ØL€ØE€Ø>€Ø7€Ø0€Ø)€Ø"€Ø€Ø€Ø €Ø€ØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü~Øõ~Øî~Øç~Øà~ØÙ~ØÒ~ØË~ØÄ~ؽ~ض~د~ب~Ø¡~Øš~Ø“~ØŒ~Ø…~Ø~~Øw~Øp~Øi~Øb~Ø[~ØT~ØM~ØF~Ø?~Ø8~Ø1~Ø*~Ø#~Ø~Ø~Ø~Ø~Ø~Øù}Øò}Øë}Øä}ØÝ}ØÖ}ØÏ}ØÈ}ØÁ}غ}س}ج}Ø¥}Øž}Ø—}Ø}؉}Ø‚}Ø{}Øt}Øm}Øf}Ø_}ØX}ØQ}ØJ}ØC}Ø<}Ø5}Ø.}Ø'}Ø }Ø}Ø}Ø }Ø}Øý|Øö|Øï|Øè|Øá|ØÚ|ØÓ|ØÌ|ØÅ|ؾ|Ø·|ذ|Ø©|Ø¢|Ø›|Ø”|Ø|؆|Ø|Øx|Øq|Øj|Øc|Ø\|ØU|ØN|ØG|Ø@|Ø9|Ø2|Ø+|Ø$|Ø|Ø|Ø|Ø|Ø|Øú{Øó{Øì{Øå{ØÞ{Ø×{ØÐ{ØÉ{ØÂ{Ø»{Ø´{Ø­{ئ{ØŸ{ؘ{Ø‘{ØŠ{؃{Ø|{Øu{Øn{Øg{Ø`{ØY{ØR{ØK{ØD{Ø={Ø6{Ø/{Ø({Ø!{Ø{Ø{Ø {Ø{ØþzØ÷zØðzØézØâzØÛzØÔzØÍzØÆzØ¿zظzرzتzØ£zØœzØ•zØŽz؇zØ€zØyzØrzØkzØdzØ]zØVzØOzØHzØAzØ:zØ3zØ,zØ%zØzØzØzØ zØzØûyØôyØíyØæyØßyØØyØÑyØÊyØÃyؼyصyØ®yاyØ yØ™yØ’yØ‹yØ„yØ}yØvyØoyØhyØayØZyØSyØLyØEyØ>yØ7yØ0yØ)yØ"yØyØyØ yØyØÿxØøxØñxØêxØãxØÜxØÕxØÎxØÇxØÀxعxزxØ«xؤxØxØ–xØx؈xØxØzxØsxØlxØexØ^xØWxØPxØIxØBxØ;xØ4xØ-xØ&xØxØxØxØ xØxØüwØõwØîwØçwØàwØÙwØÒwØËwØÄwؽwضwدwبwØ¡wØšwØ“wØŒwØ…wØ~wØwwØpwØiwØbwØ[wØTwØMwØFwØ?wØ8wØ1wØ*wØ#wØwØwØwØwØwØùvØòvØëvØävØÝvØÖvØÏvØÈvØÁvغvسvجvØ¥vØžvØ—vØv؉vØ‚vØ{vØtvØmvØfvØ_vØXvØQvØJvØCvØrØ7rØ0rØ)rØ"rØrØrØ rØrØÿqØøqØñqØêqØãqØÜqØÕqØÎqØÇqØÀqعqزqØ«qؤqØqØ–qØq؈qØqØzqØsqØlqØeqØ^qØWqØPqØIqØBqØ;qØ4qØ-qØ&qØqØqØqØ qØqØüpØõpØîpØçpØàpØÙpØÒpØËpØÄpؽpضpدpبpØ¡pØšpØ“pØŒpØ…pØ~pØwpØppØipØbpØ[pØTpØMpØFpØ?pØ8pØ1pØ*pØ#pØpØpØpØpØpØùoØòoØëoØäoØÝoØÖoØÏoØÈoØÁoغoسoجoØ¥oØžoØ—oØo؉oØ‚oØ{oØtoØmoØfoØ_oØXoØQoØJoØCoØkØ7kØ0kØ)kØ"kØkØkØ kØkØÿjØøjØñjØêjØãjØÜjØÕjØÎjØÇjØÀjعjزjØ«jؤjØjØ–jØj؈jØjØzjØsjØljØejØ^jØWjØPjØIjØBjØ;jØ4jØ-jØ&jØjØjØjØ jØjØüiØõiØîiØçiØàiØÙiØÒiØËiØÄiؽiضiدiبiØ¡iØšiØ“iØŒiØ…iØ~iØwiØpiØiiØbiØ[iØTiØMiØFiØ?iØ8iØ1iØ*iØ#iØiØiØiØiØiØùhØòhØëhØähØÝhØÖhØÏhØÈhØÁhغhسhجhØ¥hØžhØ—hØh؉hØ‚hØ{hØthØmhØfhØ_hØXhØQhØJhØChØdØ7dØ0dØ)dØ"dØdØdØ dØdØÿcØøcØñcØêcØãcØÜcØÕcØÎcØÇcØÀcعcزcØ«cؤcØcØ–cØc؈cØcØzcØscØlcØecØ^cØWcØPcØIcØBcØ;cØ4cØ-cØ&cØcØcØcØ cØcØübØõbØîbØçbØàbØÙbØÒbØËbØÄbؽbضbدbبbØ¡bØšbØ“bØŒbØ…bØ~bØwbØpbØibØbbØ[bØTbØMbØFbØ?bØ8bØ1bØ*bØ#bØbØbØbØbØbØùaØòaØëaØäaØÝaØÖaØÏaØÈaØÁaغaسaجaØ¥aØžaØ—aØa؉aØ‚aØ{aØtaØmaØfaØ_aØXaØQaØJaØCaØ]Ø7]Ø0]Ø)]Ø"]Ø]Ø]Ø ]Ø]Øÿ\Øø\Øñ\Øê\Øã\ØÜ\ØÕ\ØÎ\ØÇ\ØÀ\ع\ز\Ø«\ؤ\Ø\Ø–\Ø\؈\Ø\Øz\Øs\Øl\Øe\Ø^\ØW\ØP\ØI\ØB\Ø;\Ø4\Ø-\Ø&\Ø\Ø\Ø\Ø \Ø\Øü[Øõ[Øî[Øç[Øà[ØÙ[ØÒ[ØË[ØÄ[ؽ[ض[د[ب[Ø¡[Øš[Ø“[ØŒ[Ø…[Ø~[Øw[Øp[Øi[Øb[Ø[[ØT[ØM[ØF[Ø?[Ø8[Ø1[Ø*[Ø#[Ø[Ø[Ø[Ø[Ø[ØùZØòZØëZØäZØÝZØÖZØÏZØÈZØÁZغZسZجZØ¥ZØžZØ—ZØZ؉ZØ‚ZØ{ZØtZØmZØfZØ_ZØXZØQZØJZØCZØVØ7VØ0VØ)VØ"VØVØVØ VØVØÿUØøUØñUØêUØãUØÜUØÕUØÎUØÇUØÀUعUزUØ«UؤUØUØ–UØU؈UØUØzUØsUØlUØeUØ^UØWUØPUØIUØBUØ;UØ4UØ-UØ&UØUØUØUØ UØUØüTØõTØîTØçTØàTØÙTØÒTØËTØÄTؽTضTدTبTØ¡TØšTØ“TØŒTØ…TØ~TØwTØpTØiTØbTØ[TØTTØMTØFTØ?TØ8TØ1TØ*TØ#TØTØTØTØTØTØùSØòSØëSØäSØÝSØÖSØÏSØÈSØÁSغSسSجSØ¥SØžSØ—SØS؉SØ‚SØ{SØtSØmSØfSØ_SØXSØQSØJSØCSØOØ7OØ0OØ)OØ"OØOØOØ OØOØÿNØøNØñNØêNØãNØÜNØÕNØÎNØÇNØÀNعNزNØ«NؤNØNØ–NØN؈NØNØzNØsNØlNØeNØ^NØWNØPNØINØBNØ;NØ4NØ-NØ&NØNØNØNØ NØNØüMØõMØîMØçMØàMØÙMØÒMØËMØÄMؽMضMدMبMØ¡MØšMØ“MØŒMØ…MØ~MØwMØpMØiMØbMØ[MØTMØMMØFMØ?MØ8MØ1MØ*MØ#MØMØMØMØMØMØùLØòLØëLØäLØÝLØÖLØÏLØÈLØÁLغLسLجLØ¥LØžLØ—LØL؉LØ‚LØ{LØtLØmLØfLØ_LØXLØQLØJLØCLØHØ7HØ0HØ)HØ"HØHØHØ HØHØÿGØøGØñGØêGØãGØÜGØÕGØÎGØÇGØÀGعGزGØ«GؤGØGØ–GØG؈GØGØzGØsGØlGØeGØ^GØWGØPGØIGØBGØ;GØ4GØ-GØ&GØGØGØGØ GØGØüFØõFØîFØçFØàFØÙFØÒFØËFØÄFؽFضFدFبFØ¡FØšFØ“FØŒFØ…FØ~FØwFØpFØiFØbFØ[FØTFØMFØFFØ?FØ8FØ1FØ*FØ#FØFØFØFØFØFØùEØòEØëEØäEØÝEØÖEØÏEØÈEØÁEغEسEجEØ¥EØžEØ—EØE؉EØ‚EØ{EØtEØmEØfEØ_EØXEØQEØJEØCEØAØ7AØ0AØ)AØ"AØAØAØ AØAØÿ@Øø@Øñ@Øê@Øã@ØÜ@ØÕ@ØÎ@ØÇ@ØÀ@ع@ز@Ø«@ؤ@Ø@Ø–@Ø@؈@Ø@Øz@Øs@Øl@Øe@Ø^@ØW@ØP@ØI@ØB@Ø;@Ø4@Ø-@Ø&@Ø@Ø@Ø@Ø @Ø@Øü?Øõ?Øî?Øç?Øà?ØÙ?ØÒ?ØË?ØÄ?ؽ?ض?د?ب?Ø¡?Øš?Ø“?ØŒ?Ø…?Ø~?Øw?Øp?Øi?Øb?Ø[?ØT?ØM?ØF?Ø??Ø8?Ø1?Ø*?Ø#?Ø?Ø?Ø?Ø?Ø?Øù>Øò>Øë>Øä>ØÝ>ØÖ>ØÏ>ØÈ>ØÁ>غ>س>ج>Ø¥>Øž>Ø—>Ø>؉>Ø‚>Ø{>Øt>Øm>Øf>Ø_>ØX>ØQ>ØJ>ØC>Ø<>Ø5>Ø.>Ø'>Ø >Ø>Ø>Ø >Ø>Øý=Øö=Øï=Øè=Øá=ØÚ=ØÓ=ØÌ=ØÅ=ؾ=Ø·=ذ=Ø©=Ø¢=Ø›=Ø”=Ø=؆=Ø=Øx=Øq=Øj=Øc=Ø\=ØU=ØN=ØG=Ø@=Ø9=Ø2=Ø+=Ø$=Ø=Ø=Ø=Ø=Ø=Øú<Øó<Øì<Øå<ØÞ<Ø×<ØÐ<ØÉ<ØÂ<Ø»<Ø´<Ø­<ئ<ØŸ<ؘ<Ø‘<ØŠ<؃<Ø|<Øu<Øn<Øg<Ø`<ØY<ØR<ØK<ØD<Ø=<Ø6<Ø/<Ø(<Ø!<Ø<Ø<Ø <Ø<Øþ;Ø÷;Øð;Øé;Øâ;ØÛ;ØÔ;ØÍ;ØÆ;Ø¿;ظ;ر;ت;Ø£;Øœ;Ø•;ØŽ;؇;Ø€;Øy;Ør;Øk;Ød;Ø];ØV;ØO;ØH;ØA;Ø:;Ø3;Ø,;Ø%;Ø;Ø;Ø;Ø ;Ø;Øû:Øô:Øí:Øæ:Øß:ØØ:ØÑ:ØÊ:ØÃ:ؼ:ص:Ø®:ا:Ø :Ø™:Ø’:Ø‹:Ø„:Ø}:Øv:Øo:Øh:Øa:ØZ:ØS:ØL:ØE:Ø>:Ø7:Ø0:Ø):Ø":Ø:Ø:Ø :Ø:Øÿ9Øø9Øñ9Øê9Øã9ØÜ9ØÕ9ØÎ9ØÇ9ØÀ9ع9ز9Ø«9ؤ9Ø9Ø–9Ø9؈9Ø9Øz9Øs9Øl9Øe9Ø^9ØW9ØP9ØI9ØB9Ø;9Ø49Ø-9Ø&9Ø9Ø9Ø9Ø 9Ø9Øü8Øõ8Øî8Øç8Øà8ØÙ8ØÒ8ØË8ØÄ8ؽ8ض8د8ب8Ø¡8Øš8Ø“8ØŒ8Ø…8Ø~8Øw8Øp8Øi8Øb8Ø[8ØT8ØM8ØF8Ø?8Ø88Ø18Ø*8Ø#8Ø8Ø8Ø8Ø8Ø8Øù7Øò7Øë7Øä7ØÝ7ØÖ7ØÏ7ØÈ7ØÁ7غ7س7ج7Ø¥7Øž7Ø—7Ø7؉7Ø‚7Ø{7Øt7Øm7Øf7Ø_7ØX7ØQ7ØJ7ØC7Ø<7Ø57Ø.7Ø'7Ø 7Ø7Ø7Ø 7Ø7Øý6Øö6Øï6Øè6Øá6ØÚ6ØÓ6ØÌ6ØÅ6ؾ6Ø·6ذ6Ø©6Ø¢6Ø›6Ø”6Ø6؆6Ø6Øx6Øq6Øj6Øc6Ø\6ØU6ØN6ØG6Ø@6Ø96Ø26Ø+6Ø$6Ø6Ø6Ø6Ø6Ø6Øú5Øó5Øì5Øå5ØÞ5Ø×5ØÐ5ØÉ5ØÂ5Ø»5Ø´5Ø­5ئ5ØŸ5ؘ5Ø‘5ØŠ5؃5Ø|5Øu5Øn5Øg5Ø`5ØY5ØR5ØK5ØD5Ø=5Ø65Ø/5Ø(5Ø!5Ø5Ø5Ø 5Ø5Øþ4Ø÷4Øð4Øé4Øâ4ØÛ4ØÔ4ØÍ4ØÆ4Ø¿4ظ4ر4ت4Ø£4Øœ4Ø•4ØŽ4؇4Ø€4Øy4Ør4Øk4Ød4Ø]4ØV4ØO4ØH4ØA4Ø:4Ø34Ø,4Ø%4Ø4Ø4Ø4Ø 4Ø4Øû3Øô3Øí3Øæ3Øß3ØØ3ØÑ3ØÊ3ØÃ3ؼ3ص3Ø®3ا3Ø 3Ø™3Ø’3Ø‹3Ø„3Ø}3Øv3Øo3Øh3Øa3ØZ3ØS3ØL3ØE3Ø>3Ø73Ø03Ø)3Ø"3Ø3Ø3Ø 3Ø3Øÿ2Øø2Øñ2Øê2Øã2ØÜ2ØÕ2ØÎ2ØÇ2ØÀ2ع2ز2Ø«2ؤ2Ø2Ø–2Ø2؈2Ø2Øz2Øs2Øl2Øe2Ø^2ØW2ØP2ØI2ØB2Ø;2Ø42Ø-2Ø&2Ø2Ø2Ø2Ø 2Ø2Øü1Øõ1Øî1Øç1Øà1ØÙ1ØÒ1ØË1ØÄ1ؽ1ض1د1ب1Ø¡1Øš1Ø“1ØŒ1Ø…1Ø~1Øw1Øp1Øi1Øb1Ø[1ØT1ØM1ØF1Ø?1Ø81Ø11Ø*1Ø#1Ø1Ø1Ø1Ø1Ø1Øù0Øò0Øë0Øä0ØÝ0ØÖ0ØÏ0ØÈ0ØÁ0غ0س0ج0Ø¥0Øž0Ø—0Ø0؉0Ø‚0Ø{0Øt0Øm0Øf0Ø_0ØX0ØQ0ØJ0ØC0Ø<0Ø50Ø.0Ø'0Ø 0Ø0Ø0Ø 0Ø0Øý/Øö/Øï/Øè/Øá/ØÚ/ØÓ/ØÌ/ØÅ/ؾ/Ø·/ذ/Ø©/Ø¢/Ø›/Ø”/Ø/؆/Ø/Øx/Øq/Øj/Øc/Ø\/ØU/ØN/ØG/Ø@/Ø9/Ø2/Ø+/Ø$/Ø/Ø/Ø/Ø/Ø/Øú.Øó.Øì.Øå.ØÞ.Ø×.ØÐ.ØÉ.ØÂ.Ø».Ø´.Ø­.ئ.ØŸ.ؘ.Ø‘.ØŠ.؃.Ø|.Øu.Øn.Øg.Ø`.ØY.ØR.ØK.ØD.Ø=.Ø6.Ø/.Ø(.Ø!.Ø.Ø.Ø .Ø.Øþ-Ø÷-Øð-Øé-Øâ-ØÛ-ØÔ-ØÍ-ØÆ-Ø¿-ظ-ر-ت-Ø£-Øœ-Ø•-ØŽ-؇-Ø€-Øy-Ør-Øk-Ød-Ø]-ØV-ØO-ØH-ØA-Ø:-Ø3-Ø,-Ø%-Ø-Ø-Ø-Ø -Ø-Øû,Øô,Øí,Øæ,Øß,ØØ,ØÑ,ØÊ,ØÃ,ؼ,ص,Ø®,ا,Ø ,Ø™,Ø’,Ø‹,Ø„,Ø},Øv,Øo,Øh,Øa,ØZ,ØS,ØL,ØE,Ø>,Ø7,Ø0,Ø),Ø",Ø,Ø,Ø ,Ø,Øÿ+Øø+Øñ+Øê+Øã+ØÜ+ØÕ+ØÎ+ØÇ+ØÀ+ع+ز+Ø«+ؤ+Ø+Ø–+Ø+؈+Ø+Øz+Øs+Øl+Øe+Ø^+ØW+ØP+ØI+ØB+Ø;+Ø4+Ø-+Ø&+Ø+Ø+Ø+Ø +Ø+Øü*Øõ*Øî*Øç*Øà*ØÙ*ØÒ*ØË*ØÄ*ؽ*ض*د*ب*Ø¡*Øš*Ø“*ØŒ*Ø…*Ø~*Øw*Øp*Øi*Øb*Ø[*ØT*ØM*ØF*Ø?*Ø8*Ø1*Ø**Ø#*Ø*Ø*Ø*Ø*Ø*Øù)Øò)Øë)Øä)ØÝ)ØÖ)ØÏ)ØÈ)ØÁ)غ)س)ج)Ø¥)Øž)Ø—)Ø)؉)Ø‚)Ø{)Øt)Øm)Øf)Ø_)ØX)ØQ)ØJ)ØC)Ø<)Ø5)Ø.)Ø')Ø )Ø)Ø)Ø )Ø)Øý(Øö(Øï(Øè(Øá(ØÚ(ØÓ(ØÌ(ØÅ(ؾ(Ø·(ذ(Ø©(Ø¢(Ø›(Ø”(Ø(؆(Ø(Øx(Øq(Øj(Øc(Ø\(ØU(ØN(ØG(Ø@(Ø9(Ø2(Ø+(Ø$(Ø(Ø(Ø(Ø(Ø(Øú'Øó'Øì'Øå'ØÞ'Ø×'ØÐ'ØÉ'ØÂ'Ø»'Ø´'Ø­'ئ'ØŸ'ؘ'Ø‘'ØŠ'؃'Ø|'Øu'Øn'Øg'Ø`'ØY'ØR'ØK'ØD'Ø='Ø6'Ø/'Ø('Ø!'Ø'Ø'Ø 'Ø'Øþ&Ø÷&Øð&Øé&Øâ&ØÛ&ØÔ&ØÍ&ØÆ&Ø¿&ظ&ر&ت&Ø£&Øœ&Ø•&ØŽ&؇&Ø€&Øy&Ør&Øk&Ød&Ø]&ØV&ØO&ØH&ØA&Ø:&Ø3&Ø,&Ø%&Ø&Ø&Ø&Ø &Ø&Øû%Øô%Øí%Øæ%Øß%ØØ%ØÑ%ØÊ%ØÃ%ؼ%ص%Ø®%ا%Ø %Ø™%Ø’%Ø‹%Ø„%Ø}%Øv%Øo%Øh%Øa%ØZ%ØS%ØL%ØE%Ø>%Ø7%Ø0%Ø)%Ø"%Ø%Ø%Ø %Ø%Øÿ$Øø$Øñ$Øê$Øã$ØÜ$ØÕ$ØÎ$ØÇ$ØÀ$ع$ز$Ø«$ؤ$Ø$Ø–$Ø$؈$Ø$Øz$Øs$Øl$Øe$Ø^$ØW$ØP$ØI$ØB$Ø;$Ø4$Ø-$Ø&$Ø$Ø$Ø$Ø $Ø$Øü#Øõ#Øî#Øç#Øà#ØÙ#ØÒ#ØË#ØÄ#ؽ#ض#د#ب#Ø¡#Øš#Ø“#ØŒ#Ø…#Ø~#Øw#Øp#Øi#Øb#Ø[#ØT#ØM#ØF#Ø?#Ø8#Ø1#Ø*#Ø##Ø#Ø#Ø#Ø#Ø#Øù"Øò"Øë"Øä"ØÝ"ØÖ"ØÏ"ØÈ"ØÁ"غ"س"ج"Ø¥"Øž"Ø—"Ø"؉"Ø‚"Ø{"Øt"Øm"Øf"Ø_"ØX"ØQ"ØJ"ØC"Ø<"Ø5"Ø."Ø'"Ø "Ø"Ø"Ø "Ø"Øý!Øö!Øï!Øè!Øá!ØÚ!ØÓ!ØÌ!ØÅ!ؾ!Ø·!ذ!Ø©!Ø¢!Ø›!Ø”!Ø!؆!Ø!Øx!Øq!Øj!Øc!Ø\!ØU!ØN!ØG!Ø@!Ø9!Ø2!Ø+!Ø$!Ø!Ø!Ø!Ø!Ø!Øú Øó Øì Øå ØÞ Ø× ØÐ ØÉ ؠػ Ø´ Ø­ ئ ØŸ ؘ Ø‘ ØŠ ؃ Ø| Øu Øn Øg Ø` ØY ØR ØK ØD Ø= Ø6 Ø/ Ø( Ø! Ø Ø Ø Ø ØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûØôØíØæØßØØØÑØÊØÃؼصخاؠؙؒ؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØúØóØìØåØÞØ×ØÐØÉØÂػشحئ؟ؘؑ؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûØôØíØæØßØØØÑØÊØÃؼصخاؠؙؒ؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØúØóØìØåØÞØ×ØÐØÉØÂػشحئ؟ؘؑ؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûØôØíØæØßØØØÑØÊØÃؼصخاؠؙؒ؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù Øò Øë Øä ØÝ ØÖ ØÏ ØÈ ØÁ غ س ج Ø¥ Øž Ø— Ø Ø‰ Ø‚ Ø{ Øt Øm Øf Ø_ ØX ØQ ØJ ØC Ø< Ø5 Ø. Ø' Ø Ø Ø Ø Ø Øý Øö Øï Øè Øá ØÚ ØÓ ØÌ ØÅ ؾ Ø· ذ Ø© Ø¢ Ø› Ø” Ø Ø† Ø Øx Øq Øj Øc Ø\ ØU ØN ØG Ø@ Ø9 Ø2 Ø+ Ø$ Ø Ø Ø Ø Ø Øú Øó Øì Øå ØÞ Ø× ØÐ ØÉ ؠػ Ø´ Ø­ ئ ØŸ ؘ Ø‘ ØŠ ؃ Ø| Øu Øn Øg Ø` ØY ØR ØK ØD Ø= Ø6 Ø/ Ø( Ø! Ø Ø Ø Ø Øþ Ø÷ Øð Øé Øâ ØÛ ØÔ ØÍ ØÆ Ø¿ ظ ر ت Ø£ Øœ Ø• ØŽ ؇ Ø€ Øy Ør Øk Ød Ø] ØV ØO ØH ØA Ø: Ø3 Ø, Ø% Ø Ø Ø Ø Ø Øû Øô Øí Øæ Øß ØØ ØÑ ØÊ Øà ؼ ص Ø® ا Ø  Ø™ Ø’ Ø‹ Ø„ Ø} Øv Øo Øh Øa ØZ ØS ØL ØE Ø> Ø7 Ø0 Ø) Ø" Ø Ø Ø Ø ØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØúØóØìØåØÞØ×ØÐØÉØÂػشحئ؟ؘؑ؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØûØôØíØæØßØØØÑØÊØÃؼصخاؠؙؒ؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØùÿ×òÿ×ëÿ×äÿ×Ýÿ×Öÿ×Ïÿ×Èÿ×Áÿ׺ÿ׳ÿ׬ÿ×¥ÿמÿ×—ÿ×ÿ׉ÿׂÿ×{ÿ×tÿ×mÿ×fÿ×_ÿ×Xÿ×Qÿ×Jÿ×Cÿ×<ÿ×5ÿ×.ÿ×'ÿ× ÿ×ÿ×ÿ× ÿ×ÿ×ýþ×öþ×ïþ×èþ×áþ×Úþ×Óþ×Ìþ×Åþ×¾þ×·þ×°þשþ×¢þ×›þ×”þ×þ׆þ×þ×xþ×qþ×jþ×cþ×\þ×Uþ×Nþ×Gþ×@þ×9þ×2þ×+þ×$þ×þ×þ×þ×þ×þ×úý×óý×ìý×åý×Þý××ý×Ðý×Éý×Âý×»ý×´ý×­ýצýןýטýבý׊ý׃ý×|ý×uý×ný×gý×`ý×Yý×Rý×Ký×Dý×=ý×6ý×/ý×(ý×!ý×ý×ý× ý×ý×þü×÷ü×ðü×éü×âü×Ûü×Ôü×Íüׯü׿ü׸ü×±üתü×£üלüוü׎üׇü×€ü×yü×rü×kü×dü×]ü×Vü×Oü×Hü×Aü×:ü×3ü×,ü×%ü×ü×ü×ü× ü×ü×ûû×ôû×íû׿û×ßûרû×Ñû×Êû×Ãû×¼û×µû×®û×§û× û×™û×’û׋ûׄû×}û×vû×oû×hû×aû×Zû×Sû×Lû×Eû×>û×7û×0û×)û×"û×û×û× û×û×ÿú×øú×ñú×êú×ãú×Üú×Õú×Îú×Çú×Àú×¹úײú׫úפú×ú×–ú×ú׈ú×ú×zú×sú×lú×eú×^ú×Wú×Pú×Iú×Bú×;ú×4ú×-ú×&ú×ú×ú×ú× ú×ú×üù×õù×îù×çù×àù×Ùù×Òù×Ëù×Äù×½ù×¶ùׯùרùסùךùדù׌ù×…ù×~ù×wù×pù×iù×bù×[ù×Tù×Mù×Fù×?ù×8ù×1ù×*ù×#ù×ù×ù×ù×ù×ù×ùø×òø×ëø×äø×Ýø×Öø×Ïø×Èø×Áø×ºø×³ø×¬ø×¥ø×žø×—ø×ø×‰ø×‚ø×{ø×tø×mø×fø×_ø×Xø×Qø×Jø×Cø×<ø×5ø×.ø×'ø× ø×ø×ø× ø×ø×ý÷×ö÷×ï÷×è÷×á÷×Ú÷×Ó÷×Ì÷×Å÷×¾÷×·÷×°÷ש÷×¢÷×›÷×”÷×÷׆÷×÷×x÷×q÷×j÷×c÷×\÷×U÷×N÷×G÷×@÷×9÷×2÷×+÷×$÷×÷×÷×÷×÷×÷×úö×óö×ìö×åö×Þö××ö×Ðö×Éö×Âö×»ö×´ö×­öצöןöטöבö׊ö׃ö×|ö×uö×nö×gö×`ö×Yö×Rö×Kö×Dö×=ö×6ö×/ö×(ö×!ö×ö×ö× ö×ö×þõ×÷õ×ðõ×éõ×âõ×Ûõ×Ôõ×Íõׯõ׿õ׸õ×±õתõ×£õלõוõ׎õׇõ×€õ×yõ×rõ×kõ×dõ×]õ×Võ×Oõ×Hõ×Aõ×:õ×3õ×,õ×%õ×õ×õ×õ× õ×õ×ûô×ôô×íô׿ô×ßôרô×Ñô×Êô×Ãô×¼ô×µô×®ô×§ô× ô×™ô×’ô׋ôׄô×}ô×vô×oô×hô×aô×Zô×Sô×Lô×Eô×>ô×7ô×0ô×)ô×"ô×ô×ô× ô×ô×ÿó×øó×ñó×êó×ãó×Üó×Õó×Îó×Çó×Àó×¹óײó׫óפó×ó×–ó×ó׈ó×ó×zó×só×ló×eó×^ó×Wó×Pó×Ió×Bó×;ó×4ó×-ó×&ó×ó×ó×ó× ó×ó×üò×õò×îò×çò×àò×Ùò×Òò×Ëò×Äò×½ò×¶òׯòרòסòךòדò׌ò×…ò×~ò×wò×pò×iò×bò×[ò×Tò×Mò×Fò×?ò×8ò×1ò×*ò×#ò×ò×ò×ò×ò×ò×ùñ×òñ×ëñ×äñ×Ýñ×Öñ×Ïñ×Èñ×Áñ׺ñ׳ñ׬ñ×¥ñמñ×—ñ×ñ׉ñׂñ×{ñ×tñ×mñ×fñ×_ñ×Xñ×Qñ×Jñ×Cñ×<ñ×5ñ×.ñ×'ñ× ñ×ñ×ñ× ñ×ñ×ýð×öð×ïð×èð×áð×Úð×Óð×Ìð×Åð×¾ð×·ð×°ðשð×¢ð×›ð×”ð×ð׆ð×ð×xð×qð×jð×cð×\ð×Uð×Nð×Gð×@ð×9ð×2ð×+ð×$ð×ð×ð×ð×ð×ð×úï×óï×ìï×åï×Þï××ï×Ðï×Éï×Âï×»ï×´ï×­ïצïןïטïבï׊ï׃ï×|ï×uï×nï×gï×`ï×Yï×Rï×Kï×Dï×=ï×6ï×/ï×(ï×!ï×ï×ï× ï×ï×þî×÷î×ðî×éî×âî×Ûî×Ôî×Íîׯî׿î׸î×±îתî×£îלîוî׎îׇî×€î×yî×rî×kî×dî×]î×Vî×Oî×Hî×Aî×:î×3î×,î×%î×î×î×î× î×î×ûí×ôí×íí׿í×ßíרí×Ñí×Êí×Ãí×¼í×µí×®í×§í× í×™í×’í׋íׄí×}í×ví×oí×hí×aí×Zí×Sí×Lí×Eí×>í×7í×0í×)í×"í×í×í× í×í×ÿì×øì×ñì×êì×ãì×Üì×Õì×Îì×Çì×Àì×¹ìײì׫ìפì×ì×–ì×ì׈ì×ì×zì×sì×lì×eì×^ì×Wì×Pì×Iì×Bì×;ì×4ì×-ì×&ì×ì×ì×ì× ì×ì×üë×õë×îë×çë×àë×Ùë×Òë×Ëë×Äë×½ë×¶ëׯëרëסëךëדë׌ë×…ë×~ë×wë×pë×ië×bë×[ë×Të×Më×Fë×?ë×8ë×1ë×*ë×#ë×ë×ë×ë×ë×ë×ùê×òê×ëê×äê×Ýê×Öê×Ïê×Èê×Áê׺ê׳ê׬ê×¥êמê×—ê×ê׉êׂê×{ê×tê×mê×fê×_ê×Xê×Qê×Jê×Cê×<ê×5ê×.ê×'ê× ê×ê×ê× ê×ê×ýé×öé×ïé×èé×áé×Úé×Óé×Ìé×Åé×¾é×·é×°éשé×¢é×›é×”é×é׆é×é×xé×qé×jé×cé×\é×Ué×Né×Gé×@é×9é×2é×+é×$é×é×é×é×é×é×úè×óè×ìè×åè×Þè××è×Ðè×Éè×Âè×»è×´è×­èצèןèטèבè׊è׃è×|è×uè×nè×gè×`è×Yè×Rè×Kè×Dè×=è×6è×/è×(è×!è×è×è× è×è×þç×÷ç×ðç×éç×âç×Ûç×Ôç×Íçׯç׿ç׸ç×±çתç×£çלçוç׎çׇç×€ç×yç×rç×kç×dç×]ç×Vç×Oç×Hç×Aç×:ç×3ç×,ç×%ç×ç×ç×ç× ç×ç×ûæ×ôæ×íæ×ææ×߿רæ×Ñæ×Êæ×Ãæ×¼æ×µæ×®æ×§æ× æ×™æ×’æ×‹æ×„æ×}æ×væ×oæ×hæ×aæ×Zæ×Sæ×Læ×Eæ×>æ×7æ×0æ×)æ×"æ×æ×æ× æ×æ×ÿå×øå×ñå×êå×ãå×Üå×Õå×Îå×Çå×Àå×¹åײå׫åפå×å×–å×å׈å×å×zå×så×lå×eå×^å×Wå×På×Iå×Bå×;å×4å×-å×&å×å×å×å× å×å×üä×õä×îä×çä×àä×Ùä×Òä×Ëä×Ää×½ä×¶äׯäרäסäךäדä׌ä×…ä×~ä×wä×pä×iä×bä×[ä×Tä×Mä×Fä×?ä×8ä×1ä×*ä×#ä×ä×ä×ä×ä×ä×ùã×òã×ëã×äã×Ýã×Öã×Ïã×Èã×Áã׺ã׳ã׬ã×¥ãמã×—ã×ã׉ãׂã×{ã×tã×mã×fã×_ã×Xã×Qã×Jã×Cã×<ã×5ã×.ã×'ã× ã×ã×ã× ã×ã×ýâ×öâ×ïâ×èâ×áâ×Úâ×Óâ×Ìâ×Åâ×¾â×·â×°âשâ×¢â×›â×”â×â׆â×â×xâ×qâ×jâ×câ×\â×Uâ×Nâ×Gâ×@â×9â×2â×+â×$â×â×â×â×â×â×úá×óá×ìá×åá×Þá××á×Ðá×Éá×Âá×»á×´á×­áצáןáטáבá׊á׃á×|á×uá×ná×gá×`á×Yá×Rá×Ká×Dá×=á×6á×/á×(á×!á×á×á× á×á×þà×÷à×ðà×éà×âà×Ûà×Ôà×Íàׯà׿à׸à×±àתà×£àלàוà׎àׇà×€à×yà×rà×kà×dà×]à×Và×Oà×Hà×Aà×:à×3à×,à×%à×à×à×à× à×à×ûß×ôß×íß׿ß×ßßרß×Ñß×Êß×Ãß×¼ß×µß×®ß×§ß× ß×™ß×’ß׋ßׄß×}ß×vß×oß×hß×aß×Zß×Sß×Lß×Eß×>ß×7ß×0ß×)ß×"ß×ß×ß× ß×ß×ÿÞ×øÞ×ñÞ×êÞ×ãÞ×ÜÞ×ÕÞ×ÎÞ×ÇÞ×ÀÞ×¹ÞײÞ׫ÞפÞ×Þ×–Þ×Þ׈Þ×Þ×zÞ×sÞ×lÞ×eÞ×^Þ×WÞ×PÞ×IÞ×BÞ×;Þ×4Þ×-Þ×&Þ×Þ×Þ×Þ× Þ×Þ×üÝ×õÝ×îÝ×çÝ×àÝ×ÙÝ×ÒÝ×ËÝ×ÄÝ×½Ý×¶ÝׯÝרÝסÝךÝדÝ׌Ý×…Ý×~Ý×wÝ×pÝ×iÝ×bÝ×[Ý×TÝ×MÝ×FÝ×?Ý×8Ý×1Ý×*Ý×#Ý×Ý×Ý×Ý×Ý×Ý×ùÜ×òÜ×ëÜ×äÜ×ÝÜ×ÖÜ×ÏÜ×ÈÜ×ÁÜ׺Ü׳Ü׬Ü×¥ÜמÜ×—Ü×Ü׉ÜׂÜ×{Ü×tÜ×mÜ×fÜ×_Ü×XÜ×QÜ×JÜ×CÜ×<Ü×5Ü×.Ü×'Ü× Ü×Ü×Ü× Ü×Ü×ýÛ×öÛ×ïÛ×èÛ×áÛ×ÚÛ×ÓÛ×ÌÛ×ÅÛ×¾Û×·Û×°ÛשÛ×¢Û×›Û×”Û×Û׆Û×Û×xÛ×qÛ×jÛ×cÛ×\Û×UÛ×NÛ×GÛ×@Û×9Û×2Û×+Û×$Û×Û×Û×Û×Û×Û×úÚ×óÚ×ìÚ×åÚ×ÞÚ××Ú×ÐÚ×ÉÚ×ÂÚ×»Ú×´Ú×­ÚצÚןÚטÚבÚ׊Ú׃Ú×|Ú×uÚ×nÚ×gÚ×`Ú×YÚ×RÚ×KÚ×DÚ×=Ú×6Ú×/Ú×(Ú×!Ú×Ú×Ú× Ú×Ú×þÙ×÷Ù×ðÙ×éÙ×âÙ×ÛÙ×ÔÙ×ÍÙׯÙ׿Ù׸Ù×±ÙתÙ×£ÙלÙוÙ׎ÙׇÙ×€Ù×yÙ×rÙ×kÙ×dÙ×]Ù×VÙ×OÙ×HÙ×AÙ×:Ù×3Ù×,Ù×%Ù×Ù×Ù×Ù× Ù×Ù×ûØ×ôØ×íØ×æØ×ߨרØ×ÑØ×ÊØ×ÃØ×¼Ø×µØ×®Ø×§Ø× Ø×™Ø×’Ø×‹Ø×„Ø×}Ø×vØ×oØ×hØ×aØ×ZØ×SØ×LØ×EØ×>Ø×7Ø×0Ø×)Ø×"Ø×Ø×Ø× Ø×Ø×ÿ××ø××ñ××ê××ã××Ü××Õ××Î××Ç××À××¹×ײ×׫×פ××××–×××׈××××z××s××l××e××^××W××P××I××B××;××4××-××&×××××××× ××××üÖ×õÖ×îÖ×çÖ×àÖ×ÙÖ×ÒÖ×ËÖ×ÄÖ×½Ö×¶ÖׯÖרÖסÖךÖדÖ׌Ö×…Ö×~Ö×wÖ×pÖ×iÖ×bÖ×[Ö×TÖ×MÖ×FÖ×?Ö×8Ö×1Ö×*Ö×#Ö×Ö×Ö×Ö×Ö×Ö×ùÕ×òÕ×ëÕ×äÕ×ÝÕ×ÖÕ×ÏÕ×ÈÕ×ÁÕ׺Õ׳Õ׬Õ×¥ÕמÕ×—Õ×Õ׉ÕׂÕ×{Õ×tÕ×mÕ×fÕ×_Õ×XÕ×QÕ×JÕ×CÕ×<Õ×5Õ×.Õ×'Õ× Õ×Õ×Õ× Õ×Õ×ýÔ×öÔ×ïÔ×èÔ×áÔ×ÚÔ×ÓÔ×ÌÔ×ÅÔ×¾Ô×·Ô×°ÔשÔ×¢Ô×›Ô×”Ô×Ô׆Ô×Ô×xÔ×qÔ×jÔ×cÔ×\Ô×UÔ×NÔ×GÔ×@Ô×9Ô×2Ô×+Ô×$Ô×Ô×Ô×Ô×Ô×Ô×úÓ×óÓ×ìÓ×åÓ×ÞÓ××Ó×ÐÓ×ÉÓ×ÂÓ×»Ó×´Ó×­ÓצÓןÓטÓבÓ׊Ó׃Ó×|Ó×uÓ×nÓ×gÓ×`Ó×YÓ×RÓ×KÓ×DÓ×=Ó×6Ó×/Ó×(Ó×!Ó×Ó×Ó× Ó×Ó×þÒ×÷Ò×ðÒ×éÒ×âÒ×ÛÒ×ÔÒ×ÍÒׯÒ׿Ò׸Ò×±ÒתÒ×£ÒלÒוÒ׎ÒׇÒ×€Ò×yÒ×rÒ×kÒ×dÒ×]Ò×VÒ×OÒ×HÒ×AÒ×:Ò×3Ò×,Ò×%Ò×Ò×Ò×Ò× Ò×Ò×ûÑ×ôÑ×íÑ׿Ñ×ßÑרÑ×ÑÑ×ÊÑ×ÃÑ×¼Ñ×µÑ×®Ñ×§Ñ× Ñ×™Ñ×’Ñ׋ÑׄÑ×}Ñ×vÑ×oÑ×hÑ×aÑ×ZÑ×SÑ×LÑ×EÑ×>Ñ×7Ñ×0Ñ×)Ñ×"Ñ×Ñ×Ñ× Ñ×Ñ×ÿÐ×øÐ×ñÐ×êÐ×ãÐ×ÜÐ×ÕÐ×ÎÐ×ÇÐ×ÀÐ×¹ÐײÐ׫ÐפÐ×Ð×–Ð×Ð׈Ð×Ð×zÐ×sÐ×lÐ×eÐ×^Ð×WÐ×PÐ×IÐ×BÐ×;Ð×4Ð×-Ð×&Ð×Ð×Ð×Ð× Ð×Ð×üÏ×õÏ×îÏ×çÏ×àÏ×ÙÏ×ÒÏ×ËÏ×ÄÏ×½Ï×¶ÏׯÏרÏסÏךÏדÏ׌Ï×…Ï×~Ï×wÏ×pÏ×iÏ×bÏ×[Ï×TÏ×MÏ×FÏ×?Ï×8Ï×1Ï×*Ï×#Ï×Ï×Ï×Ï×Ï×Ï×ùÎ×òÎ×ëÎ×äÎ×ÝÎ×ÖÎ×ÏÎ×ÈÎ×ÁÎ׺Î׳Î׬Î×¥ÎמÎ×—Î×Î׉ÎׂÎ×{Î×tÎ×mÎ×fÎ×_Î×XÎ×QÎ×JÎ×CÎ×<Î×5Î×.Î×'Î× Î×Î×Î× Î×Î×ýÍ×öÍ×ïÍ×èÍ×áÍ×ÚÍ×ÓÍ×ÌÍ×ÅÍ×¾Í×·Í×°ÍשÍ×¢Í×›Í×”Í×Í׆Í×Í×xÍ×qÍ×jÍ×cÍ×\Í×UÍ×NÍ×GÍ×@Í×9Í×2Í×+Í×$Í×Í×Í×Í×Í×Í×úÌ×óÌ×ìÌ×åÌ×ÞÌ××Ì×ÐÌ×ÉÌ×ÂÌ×»Ì×´Ì×­ÌצÌןÌטÌבÌ׊Ì׃Ì×|Ì×uÌ×nÌ×gÌ×`Ì×YÌ×RÌ×KÌ×DÌ×=Ì×6Ì×/Ì×(Ì×!Ì×Ì×Ì× Ì×Ì×þË×÷Ë×ðË×éË×âË×ÛË×ÔË×ÍËׯË׿Ë׸Ë×±ËתË×£ËלËוË׎ËׇË×€Ë×yË×rË×kË×dË×]Ë×VË×OË×HË×AË×:Ë×3Ë×,Ë×%Ë×Ë×Ë×Ë× Ë×Ë×ûÊ×ôÊ×íÊ׿Ê×ßÊרÊ×ÑÊ×ÊÊ×ÃÊ×¼Ê×µÊ×®Ê×§Ê× Ê×™Ê×’Ê׋ÊׄÊ×}Ê×vÊ×oÊ×hÊ×aÊ×ZÊ×SÊ×LÊ×EÊ×>Ê×7Ê×0Ê×)Ê×"Ê×Ê×Ê× Ê×Ê×ÿÉ×øÉ×ñÉ×êÉ×ãÉ×ÜÉ×ÕÉ×ÎÉ×ÇÉ×ÀÉ×¹ÉײÉ׫ÉפÉ×É×–É×É׈É×É×zÉ×sÉ×lÉ×eÉ×^É×WÉ×PÉ×IÉ×BÉ×;É×4É×-É×&É×É×É×É× É×É×üÈ×õÈ×îÈ×çÈ×àÈ×ÙÈ×ÒÈ×ËÈ×ÄÈ×½È×¶ÈׯÈרÈסÈךÈדÈ׌È×…È×~È×wÈ×pÈ×iÈ×bÈ×[È×TÈ×MÈ×FÈ×?È×8È×1È×*È×#È×È×È×È×È×È×ùÇ×òÇ×ëÇ×äÇ×ÝÇ×ÖÇ×ÏÇ×ÈÇ×ÁÇ׺Ç׳Ç׬Ç×¥ÇמÇ×—Ç×Ç׉ÇׂÇ×{Ç×tÇ×mÇ×fÇ×_Ç×XÇ×QÇ×JÇ×CÇ×<Ç×5Ç×.Ç×'Ç× Ç×Ç×Ç× Ç×Ç×ýÆ×öÆ×ïÆ×èÆ×áÆ×ÚÆ×ÓÆ×ÌÆ×ů׾Æ×·Æ×°Æ×©Æ×¢Æ×›Æ×”Æ×Æ×†Æ×Æ×xÆ×qÆ×jÆ×cÆ×\Æ×UÆ×NÆ×GÆ×@Æ×9Æ×2Æ×+Æ×$Æ×Æ×Æ×Æ×Æ×Æ×úÅ×óÅ×ìÅ×åÅ×ÞÅ××Å×ÐÅ×ÉÅ×ÂÅ×»Å×´Å×­ÅצÅןÅטÅבÅ׊Å׃Å×|Å×uÅ×nÅ×gÅ×`Å×YÅ×RÅ×KÅ×DÅ×=Å×6Å×/Å×(Å×!Å×Å×Å× Å×Å×þÄ×÷Ä×ðÄ×éÄ×âÄ×ÛÄ×ÔÄ×ÍÄׯÄ׿Ä׸Ä×±ÄתÄ×£ÄלÄוÄ׎ÄׇÄ×€Ä×yÄ×rÄ×kÄ×dÄ×]Ä×VÄ×OÄ×HÄ×AÄ×:Ä×3Ä×,Ä×%Ä×Ä×Ä×Ä× Ä×Ä×ûÃ×ôÃ×íÃ׿Ã×ßÃרÃ×ÑÃ×ÊÃ×ÃÃ×¼Ã×µÃ×®Ã×§Ã× Ã×™Ã×’Ã׋ÃׄÃ×}Ã×vÃ×oÃ×hÃ×aÃ×ZÃ×SÃ×LÃ×EÃ×>Ã×7Ã×0Ã×)Ã×"Ã×Ã×Ã× Ã×Ã×ÿÂ×øÂ×ñÂ×êÂ×ãÂ×ÜÂ×ÕÂ×ÎÂ×ÇÂ×ÀÂ×¹ÂײÂ׫ÂפÂ×Â×–Â×Â׈Â×Â×zÂ×sÂ×lÂ×eÂ×^Â×WÂ×PÂ×IÂ×BÂ×;Â×4Â×-Â×&Â×Â×Â×Â× Â×Â×üÁ×õÁ×îÁ×çÁ×àÁ×ÙÁ×ÒÁ×ËÁ×ÄÁ×½Á×¶ÁׯÁרÁסÁךÁדÁ׌Á×…Á×~Á×wÁ×pÁ×iÁ×bÁ×[Á×TÁ×MÁ×FÁ×?Á×8Á×1Á×*Á×#Á×Á×Á×Á×Á×Á×ùÀ×òÀ×ëÀ×äÀ×ÝÀ×ÖÀ×ÏÀ×ÈÀ×ÁÀ׺À׳À׬À×¥ÀמÀ×—À×À׉ÀׂÀ×{À×tÀ×mÀ×fÀ×_À×XÀ×QÀ×JÀ×CÀ×<À×5À×.À×'À× À×À×À× À×À×ý¿×ö¿×ï¿×è¿×á¿×Ú¿×Ó¿×Ì¿×ſ׾¿×·¿×°¿×©¿×¢¿×›¿×”¿×¿×†¿×¿×x¿×q¿×j¿×c¿×\¿×U¿×N¿×G¿×@¿×9¿×2¿×+¿×$¿×¿×¿×¿×¿×¿×ú¾×ó¾×ì¾×å¾×Þ¾××¾×о×ɾ×¾×»¾×´¾×­¾×¦¾×Ÿ¾×˜¾×‘¾×о׃¾×|¾×u¾×n¾×g¾×`¾×Y¾×R¾×K¾×D¾×=¾×6¾×/¾×(¾×!¾×¾×¾× ¾×¾×þ½×÷½×ð½×é½×â½×Û½×Ô½×ͽ×ƽ׿½×¸½×±½×ª½×£½×œ½×•½×޽ׇ½×€½×y½×r½×k½×d½×]½×V½×O½×H½×A½×:½×3½×,½×%½×½×½×½× ½×½×û¼×ô¼×í¼×æ¼×ß¼×ؼ×Ѽ×ʼ×ü×¼¼×µ¼×®¼×§¼× ¼×™¼×’¼×‹¼×„¼×}¼×v¼×o¼×h¼×a¼×Z¼×S¼×L¼×E¼×>¼×7¼×0¼×)¼×"¼×¼×¼× ¼×¼×ÿ»×ø»×ñ»×ê»×ã»×Ü»×Õ»×λ×Ç»×À»×¹»×²»×«»×¤»×»×–»×»×ˆ»×»×z»×s»×l»×e»×^»×W»×P»×I»×B»×;»×4»×-»×&»×»×»×»× »×»×üº×õº×îº×çº×àº×Ùº×Òº×˺×ĺ×½º×¶º×¯º×¨º×¡º×šº×“º×Œº×…º×~º×wº×pº×iº×bº×[º×Tº×Mº×Fº×?º×8º×1º×*º×#º×º×º×º×º×º×ù¹×ò¹×ë¹×ä¹×ݹ×Ö¹×Ϲ×ȹ×Á¹×º¹×³¹×¬¹×¥¹×ž¹×—¹×¹×‰¹×‚¹×{¹×t¹×m¹×f¹×_¹×X¹×Q¹×J¹×C¹×<¹×5¹×.¹×'¹× ¹×¹×¹× ¹×¹×ý¸×ö¸×ï¸×è¸×á¸×Ú¸×Ó¸×̸ן׾¸×·¸×°¸×©¸×¢¸×›¸×”¸×¸×†¸×¸×x¸×q¸×j¸×c¸×\¸×U¸×N¸×G¸×@¸×9¸×2¸×+¸×$¸×¸×¸×¸×¸×¸×ú·×ó·×ì·×å·×Þ·××·×з×É·×·×»·×´·×­·×¦·×Ÿ·×˜·×‘·×Š·×ƒ·×|·×u·×n·×g·×`·×Y·×R·×K·×D·×=·×6·×/·×(·×!·×·×·× ·×·×þ¶×÷¶×ð¶×é¶×â¶×Û¶×Ô¶×Ͷ×ƶ׿¶×¸¶×±¶×ª¶×£¶×œ¶×•¶×޶ׇ¶×€¶×y¶×r¶×k¶×d¶×]¶×V¶×O¶×H¶×A¶×:¶×3¶×,¶×%¶×¶×¶×¶× ¶×¶×ûµ×ôµ×íµ×æµ×ßµ×ص×ѵ×ʵ×õ×¼µ×µµ×®µ×§µ× µ×™µ×’µ×‹µ×„µ×}µ×vµ×oµ×hµ×aµ×Zµ×Sµ×Lµ×Eµ×>µ×7µ×0µ×)µ×"µ×µ×µ× µ×µ×ÿ´×ø´×ñ´×ê´×ã´×Ü´×Õ´×δ×Ç´×À´×¹´×²´×«´×¤´×´×–´×´×ˆ´×´×z´×s´×l´×e´×^´×W´×P´×I´×B´×;´×4´×-´×&´×´×´×´× ´×´×ü³×õ³×î³×ç³×à³×Ù³×Ò³×˳×ij×½³×¶³×¯³×¨³×¡³×š³×“³×Œ³×…³×~³×w³×p³×i³×b³×[³×T³×M³×F³×?³×8³×1³×*³×#³×³×³×³×³×³×ù²×ò²×ë²×ä²×ݲ×Ö²×ϲ×Ȳ×Á²×º²×³²×¬²×¥²×ž²×—²×²×‰²×‚²×{²×t²×m²×f²×_²×X²×Q²×J²×C²×<²×5²×.²×'²× ²×²×²× ²×²×ý±×ö±×ï±×è±×á±×Ú±×Ó±×̱×ű×¾±×·±×°±×©±×¢±×›±×”±×±×†±×±×x±×q±×j±×c±×\±×U±×N±×G±×@±×9±×2±×+±×$±×±×±×±×±×±×ú°×ó°×ì°×å°×Þ°××°×а×ɰ×°×»°×´°×­°×¦°×Ÿ°×˜°×‘°×а׃°×|°×u°×n°×g°×`°×Y°×R°×K°×D°×=°×6°×/°×(°×!°×°×°× °×°×þ¯×÷¯×ð¯×é¯×â¯×Û¯×Ô¯×ͯ×Ư׿¯×¸¯×±¯×ª¯×£¯×œ¯×•¯×ޝׇ¯×€¯×y¯×r¯×k¯×d¯×]¯×V¯×O¯×H¯×A¯×:¯×3¯×,¯×%¯×¯×¯×¯× ¯×¯×û®×ô®×í®×æ®×߮ר®×Ñ®×Ê®×î×¼®×µ®×®®×§®× ®×™®×’®×‹®×„®×}®×v®×o®×h®×a®×Z®×S®×L®×E®×>®×7®×0®×)®×"®×®×®× ®×®×ÿ­×ø­×ñ­×ê­×ã­×Ü­×Õ­×έ×Ç­×À­×¹­×²­×«­×¤­×­×–­×­×ˆ­×­×z­×s­×l­×e­×^­×W­×P­×I­×B­×;­×4­×-­×&­×­×­×­× ­×­×ü¬×õ¬×î¬×ç¬×à¬×Ù¬×Ò¬×ˬ×Ĭ×½¬×¶¬×¯¬×¨¬×¡¬×š¬×“¬×Œ¬×…¬×~¬×w¬×p¬×i¬×b¬×[¬×T¬×M¬×F¬×?¬×8¬×1¬×*¬×#¬×¬×¬×¬×¬×¬×ù«×ò«×ë«×ä«×Ý«×Ö«×Ï«×È«×Á«×º«×³«×¬«×¥«×ž«×—«×«×‰«×‚«×{«×t«×m«×f«×_«×X«×Q«×J«×C«×<«×5«×.«×'«× «×«×«× «×«×ýª×öª×ïª×èª×áª×Úª×Óª×̪×Ū×¾ª×·ª×°ª×©ª×¢ª×›ª×”ª×ª×†ª×ª×xª×qª×jª×cª×\ª×Uª×Nª×Gª×@ª×9ª×2ª×+ª×$ª×ª×ª×ª×ª×ª×ú©×ó©×ì©×å©×Þ©×ש×Щ×ɩש׻©×´©×­©×¦©×Ÿ©×˜©×‘©×Š©×ƒ©×|©×u©×n©×g©×`©×Y©×R©×K©×D©×=©×6©×/©×(©×!©×©×©× ©×©×þ¨×÷¨×ð¨×é¨×â¨×Û¨×Ô¨×ͨ×ƨ׿¨×¸¨×±¨×ª¨×£¨×œ¨×•¨×ލׇ¨×€¨×y¨×r¨×k¨×d¨×]¨×V¨×O¨×H¨×A¨×:¨×3¨×,¨×%¨×¨×¨×¨× ¨×¨×û§×ô§×í§×æ§×ß§×ا×ѧ×ʧ×ç×¼§×µ§×®§×§§× §×™§×’§×‹§×„§×}§×v§×o§×h§×a§×Z§×S§×L§×E§×>§×7§×0§×)§×"§×§×§× §×§×ÿ¦×ø¦×ñ¦×ê¦×ã¦×ܦ×Õ¦×Φ×Ǧ×À¦×¹¦×²¦×«¦×¤¦×¦×–¦×¦×ˆ¦×¦×z¦×s¦×l¦×e¦×^¦×W¦×P¦×I¦×B¦×;¦×4¦×-¦×&¦×¦×¦×¦× ¦×¦×ü¥×õ¥×î¥×ç¥×à¥×Ù¥×Ò¥×Ë¥×Ä¥×½¥×¶¥×¯¥×¨¥×¡¥×š¥×“¥×Œ¥×…¥×~¥×w¥×p¥×i¥×b¥×[¥×T¥×M¥×F¥×?¥×8¥×1¥×*¥×#¥×¥×¥×¥×¥×¥×ù¤×ò¤×ë¤×ä¤×ݤ×Ö¤×Ϥ×Ȥ×Á¤×º¤×³¤×¬¤×¥¤×ž¤×—¤×¤×‰¤×‚¤×{¤×t¤×m¤×f¤×_¤×X¤×Q¤×J¤×C¤×<¤×5¤×.¤×'¤× ¤×¤×¤× ¤×¤×ý£×ö£×ï£×è£×á£×Ú£×Ó£×Ì£×Å£×¾£×·£×°£×©£×¢£×›£×”£×£×†£×£×x£×q£×j£×c£×\£×U£×N£×G£×@£×9£×2£×+£×$£×£×£×£×£×£×ú¢×ó¢×ì¢×å¢×Þ¢××¢×Т×É¢×¢×»¢×´¢×­¢×¦¢×Ÿ¢×˜¢×‘¢×Š¢×ƒ¢×|¢×u¢×n¢×g¢×`¢×Y¢×R¢×K¢×D¢×=¢×6¢×/¢×(¢×!¢×¢×¢× ¢×¢×þ¡×÷¡×ð¡×é¡×â¡×Û¡×Ô¡×Í¡×Æ¡×¿¡×¸¡×±¡×ª¡×£¡×œ¡×•¡×ޡׇ¡×€¡×y¡×r¡×k¡×d¡×]¡×V¡×O¡×H¡×A¡×:¡×3¡×,¡×%¡×¡×¡×¡× ¡×¡×û ×ô ×í ×æ ×ߠר ×Ñ ×Ê ×à×¼ ×µ ×® ×§ ×  ×™ ×’ ×‹ ×„ ×} ×v ×o ×h ×a ×Z ×S ×L ×E ×> ×7 ×0 ×) ×" × × ×  × ×ÿŸ×øŸ×ñŸ×êŸ×ãŸ×ÜŸ×ÕŸ×Ο×ÇŸ×ÀŸ×¹Ÿ×²Ÿ×«Ÿ×¤Ÿ×Ÿ×–Ÿ×Ÿ×ˆŸ×Ÿ×zŸ×sŸ×lŸ×eŸ×^Ÿ×WŸ×PŸ×IŸ×BŸ×;Ÿ×4Ÿ×-Ÿ×&Ÿ×Ÿ×Ÿ×Ÿ× Ÿ×Ÿ×üž×õž×îž×çž×àž×Ùž×Òž×Ëž×Äž×½ž×¶ž×¯ž×¨ž×¡ž×šž×“ž×Œž×…ž×~ž×wž×pž×iž×bž×[ž×Tž×Mž×Fž×?ž×8ž×1ž×*ž×#ž×ž×ž×ž×ž×ž×ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýœ×öœ×ïœ×èœ×áœ×Úœ×Óœ×Ìœ×Ŝ׾œ×·œ×°œ×©œ×¢œ×›œ×”œ×œ×†œ×œ×xœ×qœ×jœ×cœ×\œ×Uœ×Nœ×Gœ×@œ×9œ×2œ×+œ×$œ×œ×œ×œ×œ×œ×ú›×ó›×ì›×å›×Þ›××›×Л×É›×›×»›×´›×­›×¦›×Ÿ›×˜›×‘›×Š›×ƒ›×|›×u›×n›×g›×`›×Y›×R›×K›×D›×=›×6›×/›×(›×!›×›×›× ›×›×þš×÷š×ðš×éš×âš×Ûš×Ôš×Íš×Æš×¿š×¸š×±š×ªš×£š×œš×•š×Žš×‡š×€š×yš×rš×kš×dš×]š×Vš×Oš×Hš×Aš×:š×3š×,š×%š×š×š×š× š×š×û™×ô™×í™×æ™×ߙר™×Ñ™×Ê™×Ù×¼™×µ™×®™×§™× ™×™™×’™×‹™×„™×}™×v™×o™×h™×a™×Z™×S™×L™×E™×>™×7™×0™×)™×"™×™×™× ™×™×ÿ˜×ø˜×ñ˜×ê˜×ã˜×ܘ×Õ˜×Θ×ǘ×À˜×¹˜×²˜×«˜×¤˜×˜×–˜×˜×ˆ˜×˜×z˜×s˜×l˜×e˜×^˜×W˜×P˜×I˜×B˜×;˜×4˜×-˜×&˜×˜×˜×˜× ˜×˜×ü—×õ—×î—×ç—×à—×Ù—×Ò—×Ë—×Ä—×½—×¶—ׯ—ר—ס—ך—ד—׌—×…—×~—×w—×p—×i—×b—×[—×T—×M—×F—×?—×8—×1—×*—×#—×—×—×—×—×—×ù–×ò–×ë–×ä–×Ý–×Ö–×Ï–×È–×Á–׺–׳–׬–×¥–מ–×—–ז׉–ׂ–×{–×t–×m–×f–×_–×X–×Q–×J–×C–×<–×5–×.–×'–× –×–×–× –×–×ý•×ö•×ï•×è•×á•×Ú•×Ó•×Ì•×ŕ׾•×·•×°•ש•×¢•×›•×”•ו׆•ו×x•×q•×j•×c•×\•×U•×N•×G•×@•×9•×2•×+•×$•ווווו×ú”×ó”×ì”×å”×Þ”××”×Д×É”×”×»”×´”×­”צ”ן”ט”ב”׊”׃”×|”×u”×n”×g”×`”×Y”×R”×K”×D”×=”×6”×/”×(”×!”×”×”× ”×”×þ“×÷“×ð“×é“×â“×Û“×Ô“×Í“×Æ“׿“׸“×±“ת“×£“ל“ו“׎“ׇ“×€“×y“×r“×k“×d“×]“×V“×O“×H“×A“×:“×3“×,“×%“×“×“×“× “ד×û’×ô’×í’׿’×ߒר’×Ñ’×Ê’×Ã’×¼’×µ’×®’×§’× ’×™’×’’׋’ׄ’×}’×v’×o’×h’×a’×Z’×S’×L’×E’×>’×7’×0’×)’×"’×’×’× ’×’×ÿ‘×ø‘×ñ‘×ê‘×ã‘×Ü‘×Õ‘×Α×Ç‘×À‘×¹‘ײ‘׫‘פ‘בז‘ב׈‘ב×z‘×s‘×l‘×e‘×^‘×W‘×P‘×I‘×B‘×;‘×4‘×-‘×&‘×‘×‘×‘× ‘ב×ü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýŽ×öŽ×ïŽ×èŽ×áŽ×ÚŽ×ÓŽ×ÌŽ×Ŏ׾Ž×·Ž×°Ž×©Ž×¢Ž×›Ž×”Ž×Ž×†Ž×Ž×xŽ×qŽ×jŽ×cŽ×\Ž×UŽ×NŽ×GŽ×@Ž×9Ž×2Ž×+Ž×$Ž×Ž×Ž×Ž×Ž×Ž×ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þŒ×÷Œ×ðŒ×éŒ×âŒ×ÛŒ×ÔŒ×ÍŒ×ÆŒ×¿Œ×¸Œ×±Œ×ªŒ×£Œ×œŒ×•Œ×ŽŒ×‡Œ×€Œ×yŒ×rŒ×kŒ×dŒ×]Œ×VŒ×OŒ×HŒ×AŒ×:Œ×3Œ×,Œ×%Œ×Œ×Œ×Œ× Œ×Œ×û‹×ô‹×í‹×æ‹×ߋר‹×Ñ‹×Ê‹×Ë×¼‹×µ‹×®‹×§‹× ‹×™‹×’‹×‹‹×„‹×}‹×v‹×o‹×h‹×a‹×Z‹×S‹×L‹×E‹×>‹×7‹×0‹×)‹×"‹×‹×‹× ‹×‹×ÿŠ×øŠ×ñŠ×êŠ×ãŠ×ÜŠ×ÕŠ×Ί×ÇŠ×ÀŠ×¹Š×²Š×«Š×¤Š×Š×–Š×Š×ˆŠ×Š×zŠ×sŠ×lŠ×eŠ×^Š×WŠ×PŠ×IŠ×BŠ×;Š×4Š×-Š×&Š×Š×Š×Š× Š×Š×ü‰×õ‰×î‰×ç‰×à‰×Ù‰×Ò‰×ˉ×ĉ×½‰×¶‰×¯‰×¨‰×¡‰×š‰×“‰×Œ‰×…‰×~‰×w‰×p‰×i‰×b‰×[‰×T‰×M‰×F‰×?‰×8‰×1‰×*‰×#‰×‰×‰×‰×‰×‰×ùˆ×òˆ×ëˆ×äˆ×݈×Öˆ×ψ×Ȉ×Áˆ×ºˆ×³ˆ×¬ˆ×¥ˆ×žˆ×—ˆ×ˆ×‰ˆ×‚ˆ×{ˆ×tˆ×mˆ×fˆ×_ˆ×Xˆ×Qˆ×Jˆ×Cˆ×<ˆ×5ˆ×.ˆ×'ˆ× ˆ×ˆ×ˆ× ˆ×ˆ×ý‡×ö‡×ï‡×è‡×á‡×Ú‡×Ó‡×̇×Ň×¾‡×·‡×°‡×©‡×¢‡×›‡×”‡×‡×†‡×‡×x‡×q‡×j‡×c‡×\‡×U‡×N‡×G‡×@‡×9‡×2‡×+‡×$‡×‡×‡×‡×‡×‡×ú†×ó†×ì†×å†×Þ†×׆×І×Ɇ׆׻†×´†×­†×¦†×Ÿ†×˜†×‘†×І×ƒ†×|†×u†×n†×g†×`†×Y†×R†×K†×D†×=†×6†×/†×(†×!†×†×†× †×†×þ…×÷…×ð…×é…×â…×Û…×Ô…×Í…×Æ…׿…׸…×±…ת…×£…ל…ו…׎…ׇ…×€…×y…×r…×k…×d…×]…×V…×O…×H…×A…×:…×3…×,…×%…×…×…×…× …×…×û„×ô„×í„׿„×߄ר„×Ñ„×Ê„×Ä×¼„×µ„×®„×§„× „×™„×’„׋„ׄ„×}„×v„×o„×h„×a„×Z„×S„×L„×E„×>„×7„×0„×)„×"„×„×„× „ׄ×ÿƒ×øƒ×ñƒ×êƒ×ãƒ×܃×Õƒ×΃×ǃ×Àƒ×¹ƒ×²ƒ×«ƒ×¤ƒ×ƒ×–ƒ×ƒ×ˆƒ×ƒ×zƒ×sƒ×lƒ×eƒ×^ƒ×Wƒ×Pƒ×Iƒ×Bƒ×;ƒ×4ƒ×-ƒ×&ƒ×ƒ×ƒ×ƒ× ƒ×ƒ×ü‚×õ‚×î‚×ç‚×à‚×Ù‚×Ò‚×Ë‚×Ă׽‚×¶‚ׯ‚ר‚ס‚ך‚ד‚׌‚×…‚×~‚×w‚×p‚×i‚×b‚×[‚×T‚×M‚×F‚×?‚×8‚×1‚×*‚×#‚ׂׂׂׂׂ×ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ý€×ö€×ï€×è€×á€×Ú€×Ó€×Ì€×Å€×¾€×·€×°€×©€×¢€×›€×”€×€×†€×€×x€×q€×j€×c€×\€×U€×N€×G€×@€×9€×2€×+€×$€×€×€×€×€×€×ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ~×÷~×ð~×é~×â~×Û~×Ô~×Í~ׯ~׿~׸~×±~ת~×£~ל~ו~׎~ׇ~×€~×y~×r~×k~×d~×]~×V~×O~×H~×A~×:~×3~×,~×%~×~×~×~× ~×~×û}×ô}×í}׿}×ß}ר}×Ñ}×Ê}×Ã}×¼}×µ}×®}×§}× }×™}×’}׋}ׄ}×}}×v}×o}×h}×a}×Z}×S}×L}×E}×>}×7}×0}×)}×"}×}×}× }×}×ÿ|×ø|×ñ|×ê|×ã|×Ü|×Õ|×Î|×Ç|×À|×¹|ײ|׫|פ|×|×–|×|׈|×|×z|×s|×l|×e|×^|×W|×P|×I|×B|×;|×4|×-|×&|×|×|×|× |×|×ü{×õ{×î{×ç{×à{×Ù{×Ò{×Ë{×Ä{×½{×¶{ׯ{ר{ס{ך{ד{׌{×…{×~{×w{×p{×i{×b{×[{×T{×M{×F{×?{×8{×1{×*{×#{×{×{×{×{×{×ùz×òz×ëz×äz×Ýz×Öz×Ïz×Èz×Áz׺z׳z׬z×¥zמz×—z×z׉zׂz×{z×tz×mz×fz×_z×Xz×Qz×Jz×Cz×v×7v×0v×)v×"v×v×v× v×v×ÿu×øu×ñu×êu×ãu×Üu×Õu×Îu×Çu×Àu×¹uײu׫uפu×u×–u×u׈u×u×zu×su×lu×eu×^u×Wu×Pu×Iu×Bu×;u×4u×-u×&u×u×u×u× u×u×üt×õt×ît×çt×àt×Ùt×Òt×Ët×Ät×½t×¶tׯtרtסtךtדt׌t×…t×~t×wt×pt×it×bt×[t×Tt×Mt×Ft×?t×8t×1t×*t×#t×t×t×t×t×t×ùs×òs×ës×äs×Ýs×Ös×Ïs×Ès×Ás׺s׳s׬s×¥sמs×—s×s׉sׂs×{s×ts×ms×fs×_s×Xs×Qs×Js×Cs×o×7o×0o×)o×"o×o×o× o×o×ÿn×øn×ñn×ên×ãn×Ün×Õn×În×Çn×Àn×¹nײn׫nפn×n×–n×n׈n×n×zn×sn×ln×en×^n×Wn×Pn×In×Bn×;n×4n×-n×&n×n×n×n× n×n×üm×õm×îm×çm×àm×Ùm×Òm×Ëm×Äm×½m×¶mׯmרmסmךmדm׌m×…m×~m×wm×pm×im×bm×[m×Tm×Mm×Fm×?m×8m×1m×*m×#m×m×m×m×m×m×ùl×òl×ël×äl×Ýl×Öl×Ïl×Èl×Ál׺l׳l׬l×¥lמl×—l×l׉lׂl×{l×tl×ml×fl×_l×Xl×Ql×Jl×Cl×h×7h×0h×)h×"h×h×h× h×h×ÿg×øg×ñg×êg×ãg×Üg×Õg×Îg×Çg×Àg×¹gײg׫gפg×g×–g×g׈g×g×zg×sg×lg×eg×^g×Wg×Pg×Ig×Bg×;g×4g×-g×&g×g×g×g× g×g×üf×õf×îf×çf×àf×Ùf×Òf×Ëf×Äf×½f×¶fׯfרfסfךfדf׌f×…f×~f×wf×pf×if×bf×[f×Tf×Mf×Ff×?f×8f×1f×*f×#f×f×f×f×f×f×ùe×òe×ëe×äe×Ýe×Öe×Ïe×Èe×Áe׺e׳e׬e×¥eמe×—e×e׉eׂe×{e×te×me×fe×_e×Xe×Qe×Je×Ce×a×7a×0a×)a×"a×a×a× a×a×ÿ`×ø`×ñ`×ê`×ã`×Ü`×Õ`×Î`×Ç`×À`×¹`ײ`׫`פ`×`×–`×`׈`×`×z`×s`×l`×e`×^`×W`×P`×I`×B`×;`×4`×-`×&`×`×`×`× `×`×ü_×õ_×î_×ç_×à_×Ù_×Ò_×Ë_×Ä_×½_×¶_ׯ_ר_ס_ך_ד_׌_×…_×~_×w_×p_×i_×b_×[_×T_×M_×F_×?_×8_×1_×*_×#_×_×_×_×_×_×ù^×ò^×ë^×ä^×Ý^×Ö^×Ï^×È^×Á^׺^׳^׬^×¥^מ^×—^×^׉^ׂ^×{^×t^×m^×f^×_^×X^×Q^×J^×C^×<^×5^×.^×'^× ^×^×^× ^×^×ý]×ö]×ï]×è]×á]×Ú]×Ó]×Ì]×Å]×¾]×·]×°]ש]×¢]×›]×”]×]׆]×]×x]×q]×j]×c]×\]×U]×N]×G]×@]×9]×2]×+]×$]×]×]×]×]×]×ú\×ó\×ì\×å\×Þ\××\×Ð\×É\×Â\×»\×´\×­\צ\ן\ט\ב\׊\׃\×|\×u\×n\×g\×`\×Y\×R\×K\×D\×=\×6\×/\×(\×!\×\×\× \×\×þ[×÷[×ð[×é[×â[×Û[×Ô[×Í[ׯ[׿[׸[×±[ת[×£[ל[ו[׎[ׇ[×€[×y[×r[×k[×d[×][×V[×O[×H[×A[×:[×3[×,[×%[×[×[×[× [×[×ûZ×ôZ×íZ׿Z×ßZרZ×ÑZ×ÊZ×ÃZ×¼Z×µZ×®Z×§Z× Z×™Z×’Z׋ZׄZ×}Z×vZ×oZ×hZ×aZ×ZZ×SZ×LZ×EZ×>Z×7Z×0Z×)Z×"Z×Z×Z× Z×Z×ÿY×øY×ñY×êY×ãY×ÜY×ÕY×ÎY×ÇY×ÀY×¹YײY׫YפY×Y×–Y×Y׈Y×Y×zY×sY×lY×eY×^Y×WY×PY×IY×BY×;Y×4Y×-Y×&Y×Y×Y×Y× Y×Y×üX×õX×îX×çX×àX×ÙX×ÒX×ËX×ÄX×½X×¶XׯXרXסXךXדX׌X×…X×~X×wX×pX×iX×bX×[X×TX×MX×FX×?X×8X×1X×*X×#X×X×X×X×X×X×ùW×òW×ëW×äW×ÝW×ÖW×ÏW×ÈW×ÁW׺W׳W׬W×¥WמW×—W×W׉WׂW×{W×tW×mW×fW×_W×XW×QW×JW×CW×S×7S×0S×)S×"S×S×S× S×S×ÿR×øR×ñR×êR×ãR×ÜR×ÕR×ÎR×ÇR×ÀR×¹RײR׫RפR×R×–R×R׈R×R×zR×sR×lR×eR×^R×WR×PR×IR×BR×;R×4R×-R×&R×R×R×R× R×R×üQ×õQ×îQ×çQ×àQ×ÙQ×ÒQ×ËQ×ÄQ×½Q×¶QׯQרQסQךQדQ׌Q×…Q×~Q×wQ×pQ×iQ×bQ×[Q×TQ×MQ×FQ×?Q×8Q×1Q×*Q×#Q×Q×Q×Q×Q×Q×ùP×òP×ëP×äP×ÝP×ÖP×ÏP×ÈP×ÁP׺P׳P׬P×¥PמP×—P×P׉PׂP×{P×tP×mP×fP×_P×XP×QP×JP×CP×L×7L×0L×)L×"L×L×L× L×L×ÿK×øK×ñK×êK×ãK×ÜK×ÕK×ÎK×ÇK×ÀK×¹KײK׫KפK×K×–K×K׈K×K×zK×sK×lK×eK×^K×WK×PK×IK×BK×;K×4K×-K×&K×K×K×K× K×K×üJ×õJ×îJ×çJ×àJ×ÙJ×ÒJ×ËJ×ÄJ×½J×¶JׯJרJסJךJדJ׌J×…J×~J×wJ×pJ×iJ×bJ×[J×TJ×MJ×FJ×?J×8J×1J×*J×#J×J×J×J×J×J×ùI×òI×ëI×äI×ÝI×ÖI×ÏI×ÈI×ÁI׺I׳I׬I×¥IמI×—I×I׉IׂI×{I×tI×mI×fI×_I×XI×QI×JI×CI×E×7E×0E×)E×"E×E×E× E×E×ÿD×øD×ñD×êD×ãD×ÜD×ÕD×ÎD×ÇD×ÀD×¹DײD׫DפD×D×–D×D׈D×D×zD×sD×lD×eD×^D×WD×PD×ID×BD×;D×4D×-D×&D×D×D×D× D×D×üC×õC×îC×çC×àC×ÙC×ÒC×ËC×ÄC×½C×¶CׯCרCסCךCדC׌C×…C×~C×wC×pC×iC×bC×[C×TC×MC×FC×?C×8C×1C×*C×#C×C×C×C×C×C×ùB×òB×ëB×äB×ÝB×ÖB×ÏB×ÈB×ÁB׺B׳B׬B×¥BמB×—B×B׉BׂB×{B×tB×mB×fB×_B×XB×QB×JB×CB××ô>×í>׿>×ß>ר>×Ñ>×Ê>×Ã>×¼>×µ>×®>×§>× >×™>×’>׋>ׄ>×}>×v>×o>×h>×a>×Z>×S>×L>×E>×>>×7>×0>×)>×">×>×>× >×>×ÿ=×ø=×ñ=×ê=×ã=×Ü=×Õ=×Î=×Ç=×À=×¹=ײ=׫=פ=×=×–=×=׈=×=×z=×s=×l=×e=×^=×W=×P=×I=×B=×;=×4=×-=×&=×=×=×=× =×=×ü<×õ<×î<×ç<×à<×Ù<×Ò<×Ë<×Ä<×½<×¶<ׯ<ר<ס<ך<ד<׌<×…<×~<×w<×p<×i<×b<×[<×T<×M<×F<×?<×8<×1<×*<×#<×<×<×<×<×<×ù;×ò;×ë;×ä;×Ý;×Ö;×Ï;×È;×Á;׺;׳;׬;×¥;מ;×—;×;׉;ׂ;×{;×t;×m;×f;×_;×X;×Q;×J;×C;×<;×5;×.;×';× ;×;×;× ;×;×ý:×ö:×ï:×è:×á:×Ú:×Ó:×Ì:×Å:×¾:×·:×°:ש:×¢:×›:×”:×:׆:×:×x:×q:×j:×c:×\:×U:×N:×G:×@:×9:×2:×+:×$:×:×:×:×:×:×ú9×ó9×ì9×å9×Þ9××9×Ð9×É9×Â9×»9×´9×­9צ9ן9ט9ב9׊9׃9×|9×u9×n9×g9×`9×Y9×R9×K9×D9×=9×69×/9×(9×!9×9×9× 9×9×þ8×÷8×ð8×é8×â8×Û8×Ô8×Í8ׯ8׿8׸8×±8ת8×£8ל8ו8׎8ׇ8×€8×y8×r8×k8×d8×]8×V8×O8×H8×A8×:8×38×,8×%8×8×8×8× 8×8×û7×ô7×í7׿7×ß7ר7×Ñ7×Ê7×Ã7×¼7×µ7×®7×§7× 7×™7×’7׋7ׄ7×}7×v7×o7×h7×a7×Z7×S7×L7×E7×>7×77×07×)7×"7×7×7× 7×7×ÿ6×ø6×ñ6×ê6×ã6×Ü6×Õ6×Î6×Ç6×À6×¹6ײ6׫6פ6×6×–6×6׈6×6×z6×s6×l6×e6×^6×W6×P6×I6×B6×;6×46×-6×&6×6×6×6× 6×6×ü5×õ5×î5×ç5×à5×Ù5×Ò5×Ë5×Ä5×½5×¶5ׯ5ר5ס5ך5ד5׌5×…5×~5×w5×p5×i5×b5×[5×T5×M5×F5×?5×85×15×*5×#5×5×5×5×5×5×ù4×ò4×ë4×ä4×Ý4×Ö4×Ï4×È4×Á4׺4׳4׬4×¥4מ4×—4×4׉4ׂ4×{4×t4×m4×f4×_4×X4×Q4×J4×C4×<4×54×.4×'4× 4×4×4× 4×4×ý3×ö3×ï3×è3×á3×Ú3×Ó3×Ì3×Å3×¾3×·3×°3ש3×¢3×›3×”3×3׆3×3×x3×q3×j3×c3×\3×U3×N3×G3×@3×93×23×+3×$3×3×3×3×3×3×ú2×ó2×ì2×å2×Þ2××2×Ð2×É2×Â2×»2×´2×­2צ2ן2ט2ב2׊2׃2×|2×u2×n2×g2×`2×Y2×R2×K2×D2×=2×62×/2×(2×!2×2×2× 2×2×þ1×÷1×ð1×é1×â1×Û1×Ô1×Í1ׯ1׿1׸1×±1ת1×£1ל1ו1׎1ׇ1×€1×y1×r1×k1×d1×]1×V1×O1×H1×A1×:1×31×,1×%1×1×1×1× 1×1×û0×ô0×í0׿0×ß0ר0×Ñ0×Ê0×Ã0×¼0×µ0×®0×§0× 0×™0×’0׋0ׄ0×}0×v0×o0×h0×a0×Z0×S0×L0×E0×>0×70×00×)0×"0×0×0× 0×0×ÿ/×ø/×ñ/×ê/×ã/×Ü/×Õ/×Î/×Ç/×À/×¹/ײ/׫/פ/×/×–/×/׈/×/×z/×s/×l/×e/×^/×W/×P/×I/×B/×;/×4/×-/×&/×/×/×/× /×/×ü.×õ.×î.×ç.×à.×Ù.×Ò.×Ë.×Ä.×½.×¶.ׯ.ר.ס.ך.ד.׌.×….×~.×w.×p.×i.×b.×[.×T.×M.×F.×?.×8.×1.×*.×#.×.×.×.×.×.×ù-×ò-×ë-×ä-×Ý-×Ö-×Ï-×È-×Á-׺-׳-׬-×¥-מ-×—-×-׉-ׂ-×{-×t-×m-×f-×_-×X-×Q-×J-×C-×<-×5-×.-×'-× -×-×-× -×-×ý,×ö,×ï,×è,×á,×Ú,×Ó,×Ì,×Å,×¾,×·,×°,ש,×¢,×›,×”,×,׆,×,×x,×q,×j,×c,×\,×U,×N,×G,×@,×9,×2,×+,×$,×,×,×,×,×,×ú+×ó+×ì+×å+×Þ+××+×Ð+×É+×Â+×»+×´+×­+צ+ן+ט+ב+׊+׃+×|+×u+×n+×g+×`+×Y+×R+×K+×D+×=+×6+×/+×(+×!+×+×+× +×+×þ*×÷*×ð*×é*×â*×Û*×Ô*×Í*ׯ*׿*׸*×±*ת*×£*ל*ו*׎*ׇ*×€*×y*×r*×k*×d*×]*×V*×O*×H*×A*×:*×3*×,*×%*×*×*×*× *×*×û)×ô)×í)׿)×ß)ר)×Ñ)×Ê)×Ã)×¼)×µ)×®)×§)× )×™)×’)׋)ׄ)×})×v)×o)×h)×a)×Z)×S)×L)×E)×>)×7)×0)×))×")×)×)× )×)×ÿ(×ø(×ñ(×ê(×ã(×Ü(×Õ(×Î(×Ç(×À(×¹(ײ(׫(פ(×(×–(×(׈(×(×z(×s(×l(×e(×^(×W(×P(×I(×B(×;(×4(×-(×&(×(×(×(× (×(×ü'×õ'×î'×ç'×à'×Ù'×Ò'×Ë'×Ä'×½'×¶'ׯ'ר'ס'ך'ד'׌'×…'×~'×w'×p'×i'×b'×['×T'×M'×F'×?'×8'×1'×*'×#'×'×'×'×'×'×ù&×ò&×ë&×ä&×Ý&×Ö&×Ï&×È&×Á&׺&׳&׬&×¥&מ&×—&×&׉&ׂ&×{&×t&×m&×f&×_&×X&×Q&×J&×C&×<&×5&×.&×'&× &×&×&× &×&×ý%×ö%×ï%×è%×á%×Ú%×Ó%×Ì%×Å%×¾%×·%×°%ש%×¢%×›%×”%×%׆%×%×x%×q%×j%×c%×\%×U%×N%×G%×@%×9%×2%×+%×$%×%×%×%×%×%×ú$×ó$×ì$×å$×Þ$××$×Ð$×É$×Â$×»$×´$×­$צ$ן$ט$ב$׊$׃$×|$×u$×n$×g$×`$×Y$×R$×K$×D$×=$×6$×/$×($×!$×$×$× $×$×þ#×÷#×ð#×é#×â#×Û#×Ô#×Í#ׯ#׿#׸#×±#ת#×£#ל#ו#׎#ׇ#×€#×y#×r#×k#×d#×]#×V#×O#×H#×A#×:#×3#×,#×%#×#×#×#× #×#×û"×ô"×í"׿"×ß"ר"×Ñ"×Ê"×Ã"×¼"×µ"×®"×§"× "×™"×’"׋"ׄ"×}"×v"×o"×h"×a"×Z"×S"×L"×E"×>"×7"×0"×)"×""×"×"× "×"×ÿ!×ø!×ñ!×ê!×ã!×Ü!×Õ!×Î!×Ç!×À!×¹!ײ!׫!פ!×!×–!×!׈!×!×z!×s!×l!×e!×^!×W!×P!×I!×B!×;!×4!×-!×&!×!×!×!× !×!×ü ×õ ×î ×ç ×à ×Ù ×Ò ×Ë ×Ä ×½ ×¶ ׯ ר ס ך ד ׌ ×… ×~ ×w ×p ×i ×b ×[ ×T ×M ×F ×? ×8 ×1 ×* ×# × × × × × ×ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××û×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××ü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××û×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××ü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××û ×ô ×í ׿ ×ß ×Ø ×Ñ ×Ê ×à ×¼ ×µ ×® ×§ ×  ×™ ×’ ׋ ׄ ×} ×v ×o ×h ×a ×Z ×S ×L ×E ×> ×7 ×0 ×) ×" × × × × ×ÿ ×ø ×ñ ×ê ×ã ×Ü ×Õ ×Î ×Ç ×À ×¹ ײ ׫ פ × ×– × ×ˆ × ×z ×s ×l ×e ×^ ×W ×P ×I ×B ×; ×4 ×- ×& × × × × × ×ü ×õ ×î ×ç ×à ×Ù ×Ò ×Ë ×Ä ×½ ×¶ ׯ ר ס ך ד ׌ ×… ×~ ×w ×p ×i ×b ×[ ×T ×M ×F ×? ×8 ×1 ×* ×# × × × × × ×ù ×ò ×ë ×ä ×Ý ×Ö ×Ï ×È ×Á ׺ ׳ ׬ ×¥ מ ×— × ×‰ ׂ ×{ ×t ×m ×f ×_ ×X ×Q ×J ×C ×< ×5 ×. ×' × × × × × ×ý ×ö ×ï ×è ×á ×Ú ×Ó ×Ì ×Å ×¾ ×· ×° ש ×¢ ×› ×” × ×† × ×x ×q ×j ×c ×\ ×U ×N ×G ×@ ×9 ×2 ×+ ×$ × × × × × ×ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××û×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××ü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××ú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××ûÿÖôÿÖíÿÖæÿÖßÿÖØÿÖÑÿÖÊÿÖÃÿÖ¼ÿÖµÿÖ®ÿÖ§ÿÖ ÿÖ™ÿÖ’ÿÖ‹ÿÖ„ÿÖ}ÿÖvÿÖoÿÖhÿÖaÿÖZÿÖSÿÖLÿÖEÿÖ>ÿÖ7ÿÖ0ÿÖ)ÿÖ"ÿÖÿÖÿÖ ÿÖÿÖÿþÖøþÖñþÖêþÖãþÖÜþÖÕþÖÎþÖÇþÖÀþÖ¹þÖ²þÖ«þÖ¤þÖþÖ–þÖþÖˆþÖþÖzþÖsþÖlþÖeþÖ^þÖWþÖPþÖIþÖBþÖ;þÖ4þÖ-þÖ&þÖþÖþÖþÖ þÖþÖüýÖõýÖîýÖçýÖàýÖÙýÖÒýÖËýÖÄýÖ½ýÖ¶ýÖ¯ýÖ¨ýÖ¡ýÖšýÖ“ýÖŒýÖ…ýÖ~ýÖwýÖpýÖiýÖbýÖ[ýÖTýÖMýÖFýÖ?ýÖ8ýÖ1ýÖ*ýÖ#ýÖýÖýÖýÖýÖýÖùüÖòüÖëüÖäüÖÝüÖÖüÖÏüÖÈüÖÁüÖºüÖ³üÖ¬üÖ¥üÖžüÖ—üÖüÖ‰üÖ‚üÖ{üÖtüÖmüÖfüÖ_üÖXüÖQüÖJüÖCüÖ<üÖ5üÖ.üÖ'üÖ üÖüÖüÖ üÖüÖýûÖöûÖïûÖèûÖáûÖÚûÖÓûÖÌûÖÅûÖ¾ûÖ·ûÖ°ûÖ©ûÖ¢ûÖ›ûÖ”ûÖûÖ†ûÖûÖxûÖqûÖjûÖcûÖ\ûÖUûÖNûÖGûÖ@ûÖ9ûÖ2ûÖ+ûÖ$ûÖûÖûÖûÖûÖûÖúúÖóúÖìúÖåúÖÞúÖ×úÖÐúÖÉúÖÂúÖ»úÖ´úÖ­úÖ¦úÖŸúÖ˜úÖ‘úÖŠúÖƒúÖ|úÖuúÖnúÖgúÖ`úÖYúÖRúÖKúÖDúÖ=úÖ6úÖ/úÖ(úÖ!úÖúÖúÖ úÖúÖþùÖ÷ùÖðùÖéùÖâùÖÛùÖÔùÖÍùÖÆùÖ¿ùÖ¸ùÖ±ùÖªùÖ£ùÖœùÖ•ùÖŽùÖ‡ùÖ€ùÖyùÖrùÖkùÖdùÖ]ùÖVùÖOùÖHùÖAùÖ:ùÖ3ùÖ,ùÖ%ùÖùÖùÖùÖ ùÖùÖûøÖôøÖíøÖæøÖßøÖØøÖÑøÖÊøÖÃøÖ¼øÖµøÖ®øÖ§øÖ øÖ™øÖ’øÖ‹øÖ„øÖ}øÖvøÖoøÖhøÖaøÖZøÖSøÖLøÖEøÖ>øÖ7øÖ0øÖ)øÖ"øÖøÖøÖ øÖøÖÿ÷Öø÷Öñ÷Öê÷Öã÷ÖÜ÷ÖÕ÷ÖÎ÷ÖÇ÷ÖÀ÷Ö¹÷Ö²÷Ö«÷Ö¤÷Ö÷Ö–÷Ö÷Öˆ÷Ö÷Öz÷Ös÷Öl÷Öe÷Ö^÷ÖW÷ÖP÷ÖI÷ÖB÷Ö;÷Ö4÷Ö-÷Ö&÷Ö÷Ö÷Ö÷Ö ÷Ö÷ÖüöÖõöÖîöÖçöÖàöÖÙöÖÒöÖËöÖÄöÖ½öÖ¶öÖ¯öÖ¨öÖ¡öÖšöÖ“öÖŒöÖ…öÖ~öÖwöÖpöÖiöÖböÖ[öÖTöÖMöÖFöÖ?öÖ8öÖ1öÖ*öÖ#öÖöÖöÖöÖöÖöÖùõÖòõÖëõÖäõÖÝõÖÖõÖÏõÖÈõÖÁõÖºõÖ³õÖ¬õÖ¥õÖžõÖ—õÖõÖ‰õÖ‚õÖ{õÖtõÖmõÖfõÖ_õÖXõÖQõÖJõÖCõÖ<õÖ5õÖ.õÖ'õÖ õÖõÖõÖ õÖõÖýôÖöôÖïôÖèôÖáôÖÚôÖÓôÖÌôÖÅôÖ¾ôÖ·ôÖ°ôÖ©ôÖ¢ôÖ›ôÖ”ôÖôÖ†ôÖôÖxôÖqôÖjôÖcôÖ\ôÖUôÖNôÖGôÖ@ôÖ9ôÖ2ôÖ+ôÖ$ôÖôÖôÖôÖôÖôÖúóÖóóÖìóÖåóÖÞóÖ×óÖÐóÖÉóÖÂóÖ»óÖ´óÖ­óÖ¦óÖŸóÖ˜óÖ‘óÖŠóÖƒóÖ|óÖuóÖnóÖgóÖ`óÖYóÖRóÖKóÖDóÖ=óÖ6óÖ/óÖ(óÖ!óÖóÖóÖ óÖóÖþòÖ÷òÖðòÖéòÖâòÖÛòÖÔòÖÍòÖÆòÖ¿òÖ¸òÖ±òÖªòÖ£òÖœòÖ•òÖŽòÖ‡òÖ€òÖyòÖròÖkòÖdòÖ]òÖVòÖOòÖHòÖAòÖ:òÖ3òÖ,òÖ%òÖòÖòÖòÖ òÖòÖûñÖôñÖíñÖæñÖßñÖØñÖÑñÖÊñÖÃñÖ¼ñÖµñÖ®ñÖ§ñÖ ñÖ™ñÖ’ñÖ‹ñÖ„ñÖ}ñÖvñÖoñÖhñÖañÖZñÖSñÖLñÖEñÖ>ñÖ7ñÖ0ñÖ)ñÖ"ñÖñÖñÖ ñÖñÖÿðÖøðÖñðÖêðÖãðÖÜðÖÕðÖÎðÖÇðÖÀðÖ¹ðÖ²ðÖ«ðÖ¤ðÖðÖ–ðÖðÖˆðÖðÖzðÖsðÖlðÖeðÖ^ðÖWðÖPðÖIðÖBðÖ;ðÖ4ðÖ-ðÖ&ðÖðÖðÖðÖ ðÖðÖüïÖõïÖîïÖçïÖàïÖÙïÖÒïÖËïÖÄïÖ½ïÖ¶ïÖ¯ïÖ¨ïÖ¡ïÖšïÖ“ïÖŒïÖ…ïÖ~ïÖwïÖpïÖiïÖbïÖ[ïÖTïÖMïÖFïÖ?ïÖ8ïÖ1ïÖ*ïÖ#ïÖïÖïÖïÖïÖïÖùîÖòîÖëîÖäîÖÝîÖÖîÖÏîÖÈîÖÁîÖºîÖ³îÖ¬îÖ¥îÖžîÖ—îÖîÖ‰îÖ‚îÖ{îÖtîÖmîÖfîÖ_îÖXîÖQîÖJîÖCîÖ<îÖ5îÖ.îÖ'îÖ îÖîÖîÖ îÖîÖýíÖöíÖïíÖèíÖáíÖÚíÖÓíÖÌíÖÅíÖ¾íÖ·íÖ°íÖ©íÖ¢íÖ›íÖ”íÖíÖ†íÖíÖxíÖqíÖjíÖcíÖ\íÖUíÖNíÖGíÖ@íÖ9íÖ2íÖ+íÖ$íÖíÖíÖíÖíÖíÖúìÖóìÖììÖåìÖÞìÖ×ìÖÐìÖÉìÖÂìÖ»ìÖ´ìÖ­ìÖ¦ìÖŸìÖ˜ìÖ‘ìÖŠìÖƒìÖ|ìÖuìÖnìÖgìÖ`ìÖYìÖRìÖKìÖDìÖ=ìÖ6ìÖ/ìÖ(ìÖ!ìÖìÖìÖ ìÖìÖþëÖ÷ëÖðëÖéëÖâëÖÛëÖÔëÖÍëÖÆëÖ¿ëÖ¸ëÖ±ëÖªëÖ£ëÖœëÖ•ëÖŽëÖ‡ëÖ€ëÖyëÖrëÖkëÖdëÖ]ëÖVëÖOëÖHëÖAëÖ:ëÖ3ëÖ,ëÖ%ëÖëÖëÖëÖ ëÖëÖûêÖôêÖíêÖæêÖßêÖØêÖÑêÖÊêÖÃêÖ¼êÖµêÖ®êÖ§êÖ êÖ™êÖ’êÖ‹êÖ„êÖ}êÖvêÖoêÖhêÖaêÖZêÖSêÖLêÖEêÖ>êÖ7êÖ0êÖ)êÖ"êÖêÖêÖ êÖêÖÿéÖøéÖñéÖêéÖãéÖÜéÖÕéÖÎéÖÇéÖÀéÖ¹éÖ²éÖ«éÖ¤éÖéÖ–éÖéÖˆéÖéÖzéÖséÖléÖeéÖ^éÖWéÖPéÖIéÖBéÖ;éÖ4éÖ-éÖ&éÖéÖéÖéÖ éÖéÖüèÖõèÖîèÖçèÖàèÖÙèÖÒèÖËèÖÄèÖ½èÖ¶èÖ¯èÖ¨èÖ¡èÖšèÖ“èÖŒèÖ…èÖ~èÖwèÖpèÖièÖbèÖ[èÖTèÖMèÖFèÖ?èÖ8èÖ1èÖ*èÖ#èÖèÖèÖèÖèÖèÖùçÖòçÖëçÖäçÖÝçÖÖçÖÏçÖÈçÖÁçÖºçÖ³çÖ¬çÖ¥çÖžçÖ—çÖçÖ‰çÖ‚çÖ{çÖtçÖmçÖfçÖ_çÖXçÖQçÖJçÖCçÖ<çÖ5çÖ.çÖ'çÖ çÖçÖçÖ çÖçÖýæÖöæÖïæÖèæÖáæÖÚæÖÓæÖÌæÖÅæÖ¾æÖ·æÖ°æÖ©æÖ¢æÖ›æÖ”æÖæÖ†æÖæÖxæÖqæÖjæÖcæÖ\æÖUæÖNæÖGæÖ@æÖ9æÖ2æÖ+æÖ$æÖæÖæÖæÖæÖæÖúåÖóåÖìåÖååÖÞåÖ×åÖÐåÖÉåÖÂåÖ»åÖ´åÖ­åÖ¦åÖŸåÖ˜åÖ‘åÖŠåÖƒåÖ|åÖuåÖnåÖgåÖ`åÖYåÖRåÖKåÖDåÖ=åÖ6åÖ/åÖ(åÖ!åÖåÖåÖ åÖåÖþäÖ÷äÖðäÖéäÖâäÖÛäÖÔäÖÍäÖÆäÖ¿äÖ¸äÖ±äÖªäÖ£äÖœäÖ•äÖŽäÖ‡äÖ€äÖyäÖräÖkäÖdäÖ]äÖVäÖOäÖHäÖAäÖ:äÖ3äÖ,äÖ%äÖäÖäÖäÖ äÖäÖûãÖôãÖíãÖæãÖßãÖØãÖÑãÖÊãÖÃãÖ¼ãÖµãÖ®ãÖ§ãÖ ãÖ™ãÖ’ãÖ‹ãÖ„ãÖ}ãÖvãÖoãÖhãÖaãÖZãÖSãÖLãÖEãÖ>ãÖ7ãÖ0ãÖ)ãÖ"ãÖãÖãÖ ãÖãÖÿâÖøâÖñâÖêâÖãâÖÜâÖÕâÖÎâÖÇâÖÀâÖ¹âÖ²âÖ«âÖ¤âÖâÖ–âÖâÖˆâÖâÖzâÖsâÖlâÖeâÖ^âÖWâÖPâÖIâÖBâÖ;âÖ4âÖ-âÖ&âÖâÖâÖâÖ âÖâÖüáÖõáÖîáÖçáÖàáÖÙáÖÒáÖËáÖÄáÖ½áÖ¶áÖ¯áÖ¨áÖ¡áÖšáÖ“áÖŒáÖ…áÖ~áÖwáÖpáÖiáÖbáÖ[áÖTáÖMáÖFáÖ?áÖ8áÖ1áÖ*áÖ#áÖáÖáÖáÖáÖáÖùàÖòàÖëàÖäàÖÝàÖÖàÖÏàÖÈàÖÁàÖºàÖ³àÖ¬àÖ¥àÖžàÖ—àÖàÖ‰àÖ‚àÖ{àÖtàÖmàÖfàÖ_àÖXàÖQàÖJàÖCàÖ<àÖ5àÖ.àÖ'àÖ àÖàÖàÖ àÖàÖýßÖößÖïßÖèßÖáßÖÚßÖÓßÖÌßÖÅßÖ¾ßÖ·ßÖ°ßÖ©ßÖ¢ßÖ›ßÖ”ßÖßÖ†ßÖßÖxßÖqßÖjßÖcßÖ\ßÖUßÖNßÖGßÖ@ßÖ9ßÖ2ßÖ+ßÖ$ßÖßÖßÖßÖßÖßÖúÞÖóÞÖìÞÖåÞÖÞÞÖ×ÞÖÐÞÖÉÞÖÂÞÖ»ÞÖ´ÞÖ­ÞÖ¦ÞÖŸÞÖ˜ÞÖ‘ÞÖŠÞÖƒÞÖ|ÞÖuÞÖnÞÖgÞÖ`ÞÖYÞÖRÞÖKÞÖDÞÖ=ÞÖ6ÞÖ/ÞÖ(ÞÖ!ÞÖÞÖÞÖ ÞÖÞÖþÝÖ÷ÝÖðÝÖéÝÖâÝÖÛÝÖÔÝÖÍÝÖÆÝÖ¿ÝÖ¸ÝÖ±ÝÖªÝÖ£ÝÖœÝÖ•ÝÖŽÝÖ‡ÝÖ€ÝÖyÝÖrÝÖkÝÖdÝÖ]ÝÖVÝÖOÝÖHÝÖAÝÖ:ÝÖ3ÝÖ,ÝÖ%ÝÖÝÖÝÖÝÖ ÝÖÝÖûÜÖôÜÖíÜÖæÜÖßÜÖØÜÖÑÜÖÊÜÖÃÜÖ¼ÜÖµÜÖ®ÜÖ§ÜÖ ÜÖ™ÜÖ’ÜÖ‹ÜÖ„ÜÖ}ÜÖvÜÖoÜÖhÜÖaÜÖZÜÖSÜÖLÜÖEÜÖ>ÜÖ7ÜÖ0ÜÖ)ÜÖ"ÜÖÜÖÜÖ ÜÖÜÖÿÛÖøÛÖñÛÖêÛÖãÛÖÜÛÖÕÛÖÎÛÖÇÛÖÀÛÖ¹ÛÖ²ÛÖ«ÛÖ¤ÛÖÛÖ–ÛÖÛÖˆÛÖÛÖzÛÖsÛÖlÛÖeÛÖ^ÛÖWÛÖPÛÖIÛÖBÛÖ;ÛÖ4ÛÖ-ÛÖ&ÛÖÛÖÛÖÛÖ ÛÖÛÖüÚÖõÚÖîÚÖçÚÖàÚÖÙÚÖÒÚÖËÚÖÄÚÖ½ÚÖ¶ÚÖ¯ÚÖ¨ÚÖ¡ÚÖšÚÖ“ÚÖŒÚÖ…ÚÖ~ÚÖwÚÖpÚÖiÚÖbÚÖ[ÚÖTÚÖMÚÖFÚÖ?ÚÖ8ÚÖ1ÚÖ*ÚÖ#ÚÖÚÖÚÖÚÖÚÖÚÖùÙÖòÙÖëÙÖäÙÖÝÙÖÖÙÖÏÙÖÈÙÖÁÙÖºÙÖ³ÙÖ¬ÙÖ¥ÙÖžÙÖ—ÙÖÙÖ‰ÙÖ‚ÙÖ{ÙÖtÙÖmÙÖfÙÖ_ÙÖXÙÖQÙÖJÙÖCÙÖ<ÙÖ5ÙÖ.ÙÖ'ÙÖ ÙÖÙÖÙÖ ÙÖÙÖýØÖöØÖïØÖèØÖáØÖÚØÖÓØÖÌØÖÅØÖ¾ØÖ·ØÖ°ØÖ©ØÖ¢ØÖ›ØÖ”ØÖØÖ†ØÖØÖxØÖqØÖjØÖcØÖ\ØÖUØÖNØÖGØÖ@ØÖ9ØÖ2ØÖ+ØÖ$ØÖØÖØÖØÖØÖØÖú×Öó×Öì×Öå×ÖÞ×Ö××ÖÐ×ÖÉ×ÖÂ×Ö»×Ö´×Ö­×Ö¦×ÖŸ×Ö˜×Ö‘×ÖŠ×Öƒ×Ö|×Öu×Ön×Ög×Ö`×ÖY×ÖR×ÖK×ÖD×Ö=×Ö6×Ö/×Ö(×Ö!×Ö×Ö×Ö ×Ö×ÖþÖÖ÷ÖÖðÖÖéÖÖâÖÖÛÖÖÔÖÖÍÖÖÆÖÖ¿ÖÖ¸ÖÖ±ÖÖªÖÖ£ÖÖœÖÖ•ÖÖŽÖÖ‡ÖÖ€ÖÖyÖÖrÖÖkÖÖdÖÖ]ÖÖVÖÖOÖÖHÖÖAÖÖ:ÖÖ3ÖÖ,ÖÖ%ÖÖÖÖÖÖÖÖ ÖÖÖÖûÕÖôÕÖíÕÖæÕÖßÕÖØÕÖÑÕÖÊÕÖÃÕÖ¼ÕÖµÕÖ®ÕÖ§ÕÖ ÕÖ™ÕÖ’ÕÖ‹ÕÖ„ÕÖ}ÕÖvÕÖoÕÖhÕÖaÕÖZÕÖSÕÖLÕÖEÕÖ>ÕÖ7ÕÖ0ÕÖ)ÕÖ"ÕÖÕÖÕÖ ÕÖÕÖÿÔÖøÔÖñÔÖêÔÖãÔÖÜÔÖÕÔÖÎÔÖÇÔÖÀÔÖ¹ÔÖ²ÔÖ«ÔÖ¤ÔÖÔÖ–ÔÖÔÖˆÔÖÔÖzÔÖsÔÖlÔÖeÔÖ^ÔÖWÔÖPÔÖIÔÖBÔÖ;ÔÖ4ÔÖ-ÔÖ&ÔÖÔÖÔÖÔÖ ÔÖÔÖüÓÖõÓÖîÓÖçÓÖàÓÖÙÓÖÒÓÖËÓÖÄÓÖ½ÓÖ¶ÓÖ¯ÓÖ¨ÓÖ¡ÓÖšÓÖ“ÓÖŒÓÖ…ÓÖ~ÓÖwÓÖpÓÖiÓÖbÓÖ[ÓÖTÓÖMÓÖFÓÖ?ÓÖ8ÓÖ1ÓÖ*ÓÖ#ÓÖÓÖÓÖÓÖÓÖÓÖùÒÖòÒÖëÒÖäÒÖÝÒÖÖÒÖÏÒÖÈÒÖÁÒÖºÒÖ³ÒÖ¬ÒÖ¥ÒÖžÒÖ—ÒÖÒÖ‰ÒÖ‚ÒÖ{ÒÖtÒÖmÒÖfÒÖ_ÒÖXÒÖQÒÖJÒÖCÒÖ<ÒÖ5ÒÖ.ÒÖ'ÒÖ ÒÖÒÖÒÖ ÒÖÒÖýÑÖöÑÖïÑÖèÑÖáÑÖÚÑÖÓÑÖÌÑÖÅÑÖ¾ÑÖ·ÑÖ°ÑÖ©ÑÖ¢ÑÖ›ÑÖ”ÑÖÑÖ†ÑÖÑÖxÑÖqÑÖjÑÖcÑÖ\ÑÖUÑÖNÑÖGÑÖ@ÑÖ9ÑÖ2ÑÖ+ÑÖ$ÑÖÑÖÑÖÑÖÑÖÑÖúÐÖóÐÖìÐÖåÐÖÞÐÖ×ÐÖÐÐÖÉÐÖÂÐÖ»ÐÖ´ÐÖ­ÐÖ¦ÐÖŸÐÖ˜ÐÖ‘ÐÖŠÐÖƒÐÖ|ÐÖuÐÖnÐÖgÐÖ`ÐÖYÐÖRÐÖKÐÖDÐÖ=ÐÖ6ÐÖ/ÐÖ(ÐÖ!ÐÖÐÖÐÖ ÐÖÐÖþÏÖ÷ÏÖðÏÖéÏÖâÏÖÛÏÖÔÏÖÍÏÖÆÏÖ¿ÏÖ¸ÏÖ±ÏÖªÏÖ£ÏÖœÏÖ•ÏÖŽÏÖ‡ÏÖ€ÏÖyÏÖrÏÖkÏÖdÏÖ]ÏÖVÏÖOÏÖHÏÖAÏÖ:ÏÖ3ÏÖ,ÏÖ%ÏÖÏÖÏÖÏÖ ÏÖÏÖûÎÖôÎÖíÎÖæÎÖßÎÖØÎÖÑÎÖÊÎÖÃÎÖ¼ÎÖµÎÖ®ÎÖ§ÎÖ ÎÖ™ÎÖ’ÎÖ‹ÎÖ„ÎÖ}ÎÖvÎÖoÎÖhÎÖaÎÖZÎÖSÎÖLÎÖEÎÖ>ÎÖ7ÎÖ0ÎÖ)ÎÖ"ÎÖÎÖÎÖ ÎÖÎÖÿÍÖøÍÖñÍÖêÍÖãÍÖÜÍÖÕÍÖÎÍÖÇÍÖÀÍÖ¹ÍÖ²ÍÖ«ÍÖ¤ÍÖÍÖ–ÍÖÍÖˆÍÖÍÖzÍÖsÍÖlÍÖeÍÖ^ÍÖWÍÖPÍÖIÍÖBÍÖ;ÍÖ4ÍÖ-ÍÖ&ÍÖÍÖÍÖÍÖ ÍÖÍÖüÌÖõÌÖîÌÖçÌÖàÌÖÙÌÖÒÌÖËÌÖÄÌÖ½ÌÖ¶ÌÖ¯ÌÖ¨ÌÖ¡ÌÖšÌÖ“ÌÖŒÌÖ…ÌÖ~ÌÖwÌÖpÌÖiÌÖbÌÖ[ÌÖTÌÖMÌÖFÌÖ?ÌÖ8ÌÖ1ÌÖ*ÌÖ#ÌÖÌÖÌÖÌÖÌÖÌÖùËÖòËÖëËÖäËÖÝËÖÖËÖÏËÖÈËÖÁËÖºËÖ³ËÖ¬ËÖ¥ËÖžËÖ—ËÖËÖ‰ËÖ‚ËÖ{ËÖtËÖmËÖfËÖ_ËÖXËÖQËÖJËÖCËÖ<ËÖ5ËÖ.ËÖ'ËÖ ËÖËÖËÖ ËÖËÖýÊÖöÊÖïÊÖèÊÖáÊÖÚÊÖÓÊÖÌÊÖÅÊÖ¾ÊÖ·ÊÖ°ÊÖ©ÊÖ¢ÊÖ›ÊÖ”ÊÖÊÖ†ÊÖÊÖxÊÖqÊÖjÊÖcÊÖ\ÊÖUÊÖNÊÖGÊÖ@ÊÖ9ÊÖ2ÊÖ+ÊÖ$ÊÖÊÖÊÖÊÖÊÖÊÖúÉÖóÉÖìÉÖåÉÖÞÉÖ×ÉÖÐÉÖÉÉÖÂÉÖ»ÉÖ´ÉÖ­ÉÖ¦ÉÖŸÉÖ˜ÉÖ‘ÉÖŠÉÖƒÉÖ|ÉÖuÉÖnÉÖgÉÖ`ÉÖYÉÖRÉÖKÉÖDÉÖ=ÉÖ6ÉÖ/ÉÖ(ÉÖ!ÉÖÉÖÉÖ ÉÖÉÖþÈÖ÷ÈÖðÈÖéÈÖâÈÖÛÈÖÔÈÖÍÈÖÆÈÖ¿ÈÖ¸ÈÖ±ÈÖªÈÖ£ÈÖœÈÖ•ÈÖŽÈÖ‡ÈÖ€ÈÖyÈÖrÈÖkÈÖdÈÖ]ÈÖVÈÖOÈÖHÈÖAÈÖ:ÈÖ3ÈÖ,ÈÖ%ÈÖÈÖÈÖÈÖ ÈÖÈÖûÇÖôÇÖíÇÖæÇÖßÇÖØÇÖÑÇÖÊÇÖÃÇÖ¼ÇÖµÇÖ®ÇÖ§ÇÖ ÇÖ™ÇÖ’ÇÖ‹ÇÖ„ÇÖ}ÇÖvÇÖoÇÖhÇÖaÇÖZÇÖSÇÖLÇÖEÇÖ>ÇÖ7ÇÖ0ÇÖ)ÇÖ"ÇÖÇÖÇÖ ÇÖÇÖÿÆÖøÆÖñÆÖêÆÖãÆÖÜÆÖÕÆÖÎÆÖÇÆÖÀÆÖ¹ÆÖ²ÆÖ«ÆÖ¤ÆÖÆÖ–ÆÖÆÖˆÆÖÆÖzÆÖsÆÖlÆÖeÆÖ^ÆÖWÆÖPÆÖIÆÖBÆÖ;ÆÖ4ÆÖ-ÆÖ&ÆÖÆÖÆÖÆÖ ÆÖÆÖüÅÖõÅÖîÅÖçÅÖàÅÖÙÅÖÒÅÖËÅÖÄÅÖ½ÅÖ¶ÅÖ¯ÅÖ¨ÅÖ¡ÅÖšÅÖ“ÅÖŒÅÖ…ÅÖ~ÅÖwÅÖpÅÖiÅÖbÅÖ[ÅÖTÅÖMÅÖFÅÖ?ÅÖ8ÅÖ1ÅÖ*ÅÖ#ÅÖÅÖÅÖÅÖÅÖÅÖùÄÖòÄÖëÄÖäÄÖÝÄÖÖÄÖÏÄÖÈÄÖÁÄÖºÄÖ³ÄÖ¬ÄÖ¥ÄÖžÄÖ—ÄÖÄÖ‰ÄÖ‚ÄÖ{ÄÖtÄÖmÄÖfÄÖ_ÄÖXÄÖQÄÖJÄÖCÄÖ<ÄÖ5ÄÖ.ÄÖ'ÄÖ ÄÖÄÖÄÖ ÄÖÄÖýÃÖöÃÖïÃÖèÃÖáÃÖÚÃÖÓÃÖÌÃÖÅÃÖ¾ÃÖ·ÃÖ°ÃÖ©ÃÖ¢ÃÖ›ÃÖ”ÃÖÃÖ†ÃÖÃÖxÃÖqÃÖjÃÖcÃÖ\ÃÖUÃÖNÃÖGÃÖ@ÃÖ9ÃÖ2ÃÖ+ÃÖ$ÃÖÃÖÃÖÃÖÃÖÃÖúÂÖóÂÖìÂÖåÂÖÞÂÖ×ÂÖÐÂÖÉÂÖÂÂÖ»ÂÖ´ÂÖ­ÂÖ¦ÂÖŸÂÖ˜ÂÖ‘ÂÖŠÂÖƒÂÖ|ÂÖuÂÖnÂÖgÂÖ`ÂÖYÂÖRÂÖKÂÖDÂÖ=ÂÖ6ÂÖ/ÂÖ(ÂÖ!ÂÖÂÖÂÖ ÂÖÂÖþÁÖ÷ÁÖðÁÖéÁÖâÁÖÛÁÖÔÁÖÍÁÖÆÁÖ¿ÁÖ¸ÁÖ±ÁÖªÁÖ£ÁÖœÁÖ•ÁÖŽÁÖ‡ÁÖ€ÁÖyÁÖrÁÖkÁÖdÁÖ]ÁÖVÁÖOÁÖHÁÖAÁÖ:ÁÖ3ÁÖ,ÁÖ%ÁÖÁÖÁÖÁÖ ÁÖÁÖûÀÖôÀÖíÀÖæÀÖßÀÖØÀÖÑÀÖÊÀÖÃÀÖ¼ÀÖµÀÖ®ÀÖ§ÀÖ ÀÖ™ÀÖ’ÀÖ‹ÀÖ„ÀÖ}ÀÖvÀÖoÀÖhÀÖaÀÖZÀÖSÀÖLÀÖEÀÖ>ÀÖ7ÀÖ0ÀÖ)ÀÖ"ÀÖÀÖÀÖ ÀÖÀÖÿ¿Öø¿Öñ¿Öê¿Öã¿ÖÜ¿ÖÕ¿ÖοÖÇ¿ÖÀ¿Ö¹¿Ö²¿Ö«¿Ö¤¿Ö¿Ö–¿Ö¿Öˆ¿Ö¿Öz¿Ös¿Öl¿Öe¿Ö^¿ÖW¿ÖP¿ÖI¿ÖB¿Ö;¿Ö4¿Ö-¿Ö&¿Ö¿Ö¿Ö¿Ö ¿Ö¿Öü¾Öõ¾Öî¾Öç¾Öà¾ÖÙ¾ÖÒ¾Ö˾ÖľÖ½¾Ö¶¾Ö¯¾Ö¨¾Ö¡¾Öš¾Ö“¾ÖŒ¾Ö…¾Ö~¾Öw¾Öp¾Öi¾Öb¾Ö[¾ÖT¾ÖM¾ÖF¾Ö?¾Ö8¾Ö1¾Ö*¾Ö#¾Ö¾Ö¾Ö¾Ö¾Ö¾Öù½Öò½Öë½Öä½ÖݽÖÖ½ÖϽÖȽÖÁ½Öº½Ö³½Ö¬½Ö¥½Öž½Ö—½Ö½Ö‰½Ö‚½Ö{½Öt½Öm½Öf½Ö_½ÖX½ÖQ½ÖJ½ÖC½Ö<½Ö5½Ö.½Ö'½Ö ½Ö½Ö½Ö ½Ö½Öý¼Öö¼Öï¼Öè¼Öá¼ÖÚ¼ÖÓ¼Ö̼ÖżÖ¾¼Ö·¼Ö°¼Ö©¼Ö¢¼Ö›¼Ö”¼Ö¼Ö†¼Ö¼Öx¼Öq¼Öj¼Öc¼Ö\¼ÖU¼ÖN¼ÖG¼Ö@¼Ö9¼Ö2¼Ö+¼Ö$¼Ö¼Ö¼Ö¼Ö¼Ö¼Öú»Öó»Öì»Öå»ÖÞ»Ö×»ÖлÖɻֻֻ»Ö´»Ö­»Ö¦»ÖŸ»Ö˜»Ö‘»ÖŠ»Öƒ»Ö|»Öu»Ön»Ög»Ö`»ÖY»ÖR»ÖK»ÖD»Ö=»Ö6»Ö/»Ö(»Ö!»Ö»Ö»Ö »Ö»ÖþºÖ÷ºÖðºÖéºÖâºÖÛºÖÔºÖͺÖƺÖ¿ºÖ¸ºÖ±ºÖªºÖ£ºÖœºÖ•ºÖŽºÖ‡ºÖ€ºÖyºÖrºÖkºÖdºÖ]ºÖVºÖOºÖHºÖAºÖ:ºÖ3ºÖ,ºÖ%ºÖºÖºÖºÖ ºÖºÖû¹Öô¹Öí¹Öæ¹Öß¹ÖعÖѹÖʹÖùÖ¼¹Öµ¹Ö®¹Ö§¹Ö ¹Ö™¹Ö’¹Ö‹¹Ö„¹Ö}¹Öv¹Öo¹Öh¹Öa¹ÖZ¹ÖS¹ÖL¹ÖE¹Ö>¹Ö7¹Ö0¹Ö)¹Ö"¹Ö¹Ö¹Ö ¹Ö¹Öÿ¸Öø¸Öñ¸Öê¸Öã¸ÖܸÖÕ¸ÖθÖǸÖÀ¸Ö¹¸Ö²¸Ö«¸Ö¤¸Ö¸Ö–¸Ö¸Öˆ¸Ö¸Öz¸Ös¸Öl¸Öe¸Ö^¸ÖW¸ÖP¸ÖI¸ÖB¸Ö;¸Ö4¸Ö-¸Ö&¸Ö¸Ö¸Ö¸Ö ¸Ö¸Öü·Öõ·Öî·Öç·Öà·ÖÙ·ÖÒ·ÖË·ÖÄ·Ö½·Ö¶·Ö¯·Ö¨·Ö¡·Öš·Ö“·ÖŒ·Ö…·Ö~·Öw·Öp·Öi·Öb·Ö[·ÖT·ÖM·ÖF·Ö?·Ö8·Ö1·Ö*·Ö#·Ö·Ö·Ö·Ö·Ö·Öù¶Öò¶Öë¶Öä¶ÖݶÖÖ¶Ö϶ÖȶÖÁ¶Öº¶Ö³¶Ö¬¶Ö¥¶Öž¶Ö—¶Ö¶Ö‰¶Ö‚¶Ö{¶Öt¶Öm¶Öf¶Ö_¶ÖX¶ÖQ¶ÖJ¶ÖC¶Ö<¶Ö5¶Ö.¶Ö'¶Ö ¶Ö¶Ö¶Ö ¶Ö¶ÖýµÖöµÖïµÖèµÖáµÖÚµÖÓµÖ̵ÖŵÖ¾µÖ·µÖ°µÖ©µÖ¢µÖ›µÖ”µÖµÖ†µÖµÖxµÖqµÖjµÖcµÖ\µÖUµÖNµÖGµÖ@µÖ9µÖ2µÖ+µÖ$µÖµÖµÖµÖµÖµÖú´Öó´Öì´Öå´ÖÞ´Ö×´ÖдÖÉ´Ö´Ö»´Ö´´Ö­´Ö¦´ÖŸ´Ö˜´Ö‘´ÖŠ´Öƒ´Ö|´Öu´Ön´Ög´Ö`´ÖY´ÖR´ÖK´ÖD´Ö=´Ö6´Ö/´Ö(´Ö!´Ö´Ö´Ö ´Ö´Öþ³Ö÷³Öð³Öé³Öâ³ÖÛ³ÖÔ³ÖͳÖƳÖ¿³Ö¸³Ö±³Öª³Ö£³Öœ³Ö•³Ö޳Ö‡³Ö€³Öy³Ör³Ök³Öd³Ö]³ÖV³ÖO³ÖH³ÖA³Ö:³Ö3³Ö,³Ö%³Ö³Ö³Ö³Ö ³Ö³Öû²Öô²Öí²Öæ²Öß²ÖزÖѲÖʲÖòÖ¼²Öµ²Ö®²Ö§²Ö ²Ö™²Ö’²Ö‹²Ö„²Ö}²Öv²Öo²Öh²Öa²ÖZ²ÖS²ÖL²ÖE²Ö>²Ö7²Ö0²Ö)²Ö"²Ö²Ö²Ö ²Ö²Öÿ±Öø±Öñ±Öê±Öã±ÖܱÖÕ±ÖαÖDZÖÀ±Ö¹±Ö²±Ö«±Ö¤±Ö±Ö–±Ö±Öˆ±Ö±Öz±Ös±Öl±Öe±Ö^±ÖW±ÖP±ÖI±ÖB±Ö;±Ö4±Ö-±Ö&±Ö±Ö±Ö±Ö ±Ö±Öü°Öõ°Öî°Öç°Öà°ÖÙ°ÖÒ°Ö˰ÖİÖ½°Ö¶°Ö¯°Ö¨°Ö¡°Öš°Ö“°ÖŒ°Ö…°Ö~°Öw°Öp°Öi°Öb°Ö[°ÖT°ÖM°ÖF°Ö?°Ö8°Ö1°Ö*°Ö#°Ö°Ö°Ö°Ö°Ö°Öù¯Öò¯Öë¯Öä¯ÖݯÖÖ¯ÖϯÖȯÖÁ¯Öº¯Ö³¯Ö¬¯Ö¥¯Öž¯Ö—¯Ö¯Ö‰¯Ö‚¯Ö{¯Öt¯Öm¯Öf¯Ö_¯ÖX¯ÖQ¯ÖJ¯ÖC¯Ö<¯Ö5¯Ö.¯Ö'¯Ö ¯Ö¯Ö¯Ö ¯Ö¯Öý®Öö®Öï®Öè®Öá®ÖÚ®ÖÓ®ÖÌ®ÖŮ־®Ö·®Ö°®Ö©®Ö¢®Ö›®Ö”®Ö®Ö†®Ö®Öx®Öq®Öj®Öc®Ö\®ÖU®ÖN®ÖG®Ö@®Ö9®Ö2®Ö+®Ö$®Ö®Ö®Ö®Ö®Ö®Öú­Öó­Öì­Öå­ÖÞ­Ö×­ÖЭÖÉ­Ö­Ö»­Ö´­Ö­­Ö¦­ÖŸ­Ö˜­Ö‘­ÖŠ­Öƒ­Ö|­Öu­Ön­Ög­Ö`­ÖY­ÖR­ÖK­ÖD­Ö=­Ö6­Ö/­Ö(­Ö!­Ö­Ö­Ö ­Ö­Öþ¬Ö÷¬Öð¬Öé¬Öâ¬ÖÛ¬ÖÔ¬ÖͬÖƬÖ¿¬Ö¸¬Ö±¬Öª¬Ö£¬Öœ¬Ö•¬ÖެÖ‡¬Ö€¬Öy¬Ör¬Ök¬Öd¬Ö]¬ÖV¬ÖO¬ÖH¬ÖA¬Ö:¬Ö3¬Ö,¬Ö%¬Ö¬Ö¬Ö¬Ö ¬Ö¬Öû«Öô«Öí«Öæ«Ö߫֨«ÖÑ«ÖÊ«ÖëÖ¼«Öµ«Ö®«Ö§«Ö «Ö™«Ö’«Ö‹«Ö„«Ö}«Öv«Öo«Öh«Öa«ÖZ«ÖS«ÖL«ÖE«Ö>«Ö7«Ö0«Ö)«Ö"«Ö«Ö«Ö «Ö«ÖÿªÖøªÖñªÖêªÖãªÖܪÖÕªÖΪÖǪÖÀªÖ¹ªÖ²ªÖ«ªÖ¤ªÖªÖ–ªÖªÖˆªÖªÖzªÖsªÖlªÖeªÖ^ªÖWªÖPªÖIªÖBªÖ;ªÖ4ªÖ-ªÖ&ªÖªÖªÖªÖ ªÖªÖü©Öõ©Öî©Öç©Öà©ÖÙ©ÖÒ©ÖË©Öĩֽ©Ö¶©Ö¯©Ö¨©Ö¡©Öš©Ö“©ÖŒ©Ö…©Ö~©Öw©Öp©Öi©Öb©Ö[©ÖT©ÖM©ÖF©Ö?©Ö8©Ö1©Ö*©Ö#©Ö©Ö©Ö©Ö©Ö©Öù¨Öò¨Öë¨Öä¨ÖݨÖÖ¨ÖϨÖȨÖÁ¨Öº¨Ö³¨Ö¬¨Ö¥¨Öž¨Ö—¨Ö¨Ö‰¨Ö‚¨Ö{¨Öt¨Öm¨Öf¨Ö_¨ÖX¨ÖQ¨ÖJ¨ÖC¨Ö<¨Ö5¨Ö.¨Ö'¨Ö ¨Ö¨Ö¨Ö ¨Ö¨Öý§Öö§Öï§Öè§Öá§ÖÚ§ÖÓ§Ö̧ÖŧÖ¾§Ö·§Ö°§Ö©§Ö¢§Ö›§Ö”§Ö§Ö†§Ö§Öx§Öq§Öj§Öc§Ö\§ÖU§ÖN§ÖG§Ö@§Ö9§Ö2§Ö+§Ö$§Ö§Ö§Ö§Ö§Ö§Öú¦Öó¦Öì¦Öå¦ÖÞ¦ÖצÖЦÖɦÖ¦Ö»¦Ö´¦Ö­¦Ö¦¦ÖŸ¦Ö˜¦Ö‘¦ÖЦÖƒ¦Ö|¦Öu¦Ön¦Ög¦Ö`¦ÖY¦ÖR¦ÖK¦ÖD¦Ö=¦Ö6¦Ö/¦Ö(¦Ö!¦Ö¦Ö¦Ö ¦Ö¦Öþ¥Ö÷¥Öð¥Öé¥Öâ¥ÖÛ¥ÖÔ¥ÖÍ¥ÖÆ¥Ö¿¥Ö¸¥Ö±¥Öª¥Ö£¥Öœ¥Ö•¥ÖŽ¥Ö‡¥Ö€¥Öy¥Ör¥Ök¥Öd¥Ö]¥ÖV¥ÖO¥ÖH¥ÖA¥Ö:¥Ö3¥Ö,¥Ö%¥Ö¥Ö¥Ö¥Ö ¥Ö¥Öû¤Öô¤Öí¤Öæ¤ÖߤÖؤÖѤÖʤÖäÖ¼¤Öµ¤Ö®¤Ö§¤Ö ¤Ö™¤Ö’¤Ö‹¤Ö„¤Ö}¤Öv¤Öo¤Öh¤Öa¤ÖZ¤ÖS¤ÖL¤ÖE¤Ö>¤Ö7¤Ö0¤Ö)¤Ö"¤Ö¤Ö¤Ö ¤Ö¤Öÿ£Öø£Öñ£Öê£Öã£ÖÜ£ÖÕ£ÖΣÖÇ£ÖÀ£Ö¹£Ö²£Ö«£Ö¤£Ö£Ö–£Ö£Öˆ£Ö£Öz£Ös£Öl£Öe£Ö^£ÖW£ÖP£ÖI£ÖB£Ö;£Ö4£Ö-£Ö&£Ö£Ö£Ö£Ö £Ö£Öü¢Öõ¢Öî¢Öç¢Öà¢ÖÙ¢ÖÒ¢ÖË¢ÖÄ¢Ö½¢Ö¶¢Ö¯¢Ö¨¢Ö¡¢Öš¢Ö“¢ÖŒ¢Ö…¢Ö~¢Öw¢Öp¢Öi¢Öb¢Ö[¢ÖT¢ÖM¢ÖF¢Ö?¢Ö8¢Ö1¢Ö*¢Ö#¢Ö¢Ö¢Ö¢Ö¢Ö¢Öù¡Öò¡Öë¡Öä¡ÖÝ¡ÖÖ¡ÖÏ¡ÖÈ¡ÖÁ¡Öº¡Ö³¡Ö¬¡Ö¥¡Öž¡Ö—¡Ö¡Ö‰¡Ö‚¡Ö{¡Öt¡Öm¡Öf¡Ö_¡ÖX¡ÖQ¡ÖJ¡ÖC¡Ö<¡Ö5¡Ö.¡Ö'¡Ö ¡Ö¡Ö¡Ö ¡Ö¡Öý Öö Öï Öè Öá ÖÚ ÖÓ ÖÌ ÖÅ Ö¾ Ö· Ö° Ö© Ö¢ Ö› Ö” Ö Ö† Ö Öx Öq Öj Öc Ö\ ÖU ÖN ÖG Ö@ Ö9 Ö2 Ö+ Ö$ Ö Ö Ö Ö Ö ÖúŸÖóŸÖìŸÖåŸÖÞŸÖןÖПÖÉŸÖŸÖ»ŸÖ´ŸÖ­ŸÖ¦ŸÖŸŸÖ˜ŸÖ‘ŸÖŠŸÖƒŸÖ|ŸÖuŸÖnŸÖgŸÖ`ŸÖYŸÖRŸÖKŸÖDŸÖ=ŸÖ6ŸÖ/ŸÖ(ŸÖ!ŸÖŸÖŸÖ ŸÖŸÖþžÖ÷žÖðžÖéžÖâžÖÛžÖÔžÖÍžÖÆžÖ¿žÖ¸žÖ±žÖªžÖ£žÖœžÖ•žÖŽžÖ‡žÖ€žÖyžÖržÖkžÖdžÖ]žÖVžÖOžÖHžÖAžÖ:žÖ3žÖ,žÖ%žÖžÖžÖžÖ žÖžÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿœÖøœÖñœÖêœÖãœÖÜœÖÕœÖΜÖÇœÖÀœÖ¹œÖ²œÖ«œÖ¤œÖœÖ–œÖœÖˆœÖœÖzœÖsœÖlœÖeœÖ^œÖWœÖPœÖIœÖBœÖ;œÖ4œÖ-œÖ&œÖœÖœÖœÖ œÖœÖü›Öõ›Öî›Öç›Öà›ÖÙ›ÖÒ›ÖË›Öěֽ›Ö¶›Ö¯›Ö¨›Ö¡›Öš›Ö“›ÖŒ›Ö…›Ö~›Öw›Öp›Öi›Öb›Ö[›ÖT›ÖM›ÖF›Ö?›Ö8›Ö1›Ö*›Ö#›Ö›Ö›Ö›Ö›Ö›ÖùšÖòšÖëšÖäšÖÝšÖÖšÖÏšÖÈšÖÁšÖºšÖ³šÖ¬šÖ¥šÖžšÖ—šÖšÖ‰šÖ‚šÖ{šÖtšÖmšÖfšÖ_šÖXšÖQšÖJšÖCšÖ<šÖ5šÖ.šÖ'šÖ šÖšÖšÖ šÖšÖý™Öö™Öï™Öè™Öá™ÖÚ™ÖÓ™ÖÌ™Öř־™Ö·™Ö°™Ö©™Ö¢™Ö›™Ö”™Ö™Ö†™Ö™Öx™Öq™Öj™Öc™Ö\™ÖU™ÖN™ÖG™Ö@™Ö9™Ö2™Ö+™Ö$™Ö™Ö™Ö™Ö™Ö™Öú˜Öó˜Öì˜Öå˜ÖÞ˜ÖטÖИÖɘÖ˜Ö»˜Ö´˜Ö­˜Ö¦˜ÖŸ˜Ö˜˜Ö‘˜ÖŠ˜Öƒ˜Ö|˜Öu˜Ön˜Ög˜Ö`˜ÖY˜ÖR˜ÖK˜ÖD˜Ö=˜Ö6˜Ö/˜Ö(˜Ö!˜Ö˜Ö˜Ö ˜Ö˜Öþ—Ö÷—Öð—Öé—Öâ—ÖÛ—ÖÔ—ÖÍ—ÖÆ—Ö¿—Ö¸—Ö±—Öª—Ö£—Öœ—Ö•—ÖŽ—Ö‡—Ö€—Öy—Ör—Ök—Öd—Ö]—ÖV—ÖO—ÖH—ÖA—Ö:—Ö3—Ö,—Ö%—Ö—Ö—Ö—Ö —Ö—Öû–Öô–Öí–Öæ–Öß–ÖØ–ÖÑ–ÖÊ–ÖÖÖ¼–Öµ–Ö®–Ö§–Ö –Ö™–Ö’–Ö‹–Ö„–Ö}–Öv–Öo–Öh–Öa–ÖZ–ÖS–ÖL–ÖE–Ö>–Ö7–Ö0–Ö)–Ö"–Ö–Ö–Ö –Ö–Öÿ•Öø•Öñ•Öê•Öã•ÖÜ•ÖÕ•ÖΕÖÇ•ÖÀ•Ö¹•Ö²•Ö«•Ö¤•Ö•Ö–•Ö•Öˆ•Ö•Öz•Ös•Öl•Öe•Ö^•ÖW•ÖP•ÖI•ÖB•Ö;•Ö4•Ö-•Ö&•Ö•Ö•Ö•Ö •Ö•Öü”Öõ”Öî”Öç”Öà”ÖÙ”ÖÒ”ÖË”ÖĔֽ”Ö¶”Ö¯”Ö¨”Ö¡”Öš”Ö“”ÖŒ”Ö…”Ö~”Öw”Öp”Öi”Öb”Ö[”ÖT”ÖM”ÖF”Ö?”Ö8”Ö1”Ö*”Ö#”Ö”Ö”Ö”Ö”Ö”Öù“Öò“Öë“Öä“ÖÝ“ÖÖ“ÖÏ“ÖÈ“ÖÁ“Öº“Ö³“Ö¬“Ö¥“Öž“Ö—“Ö“Ö‰“Ö‚“Ö{“Öt“Öm“Öf“Ö_“ÖX“ÖQ“ÖJ“ÖC“Ö<“Ö5“Ö.“Ö'“Ö “Ö“Ö“Ö “Ö“Öý’Öö’Öï’Öè’Öá’ÖÚ’ÖÓ’ÖÌ’ÖÅ’Ö¾’Ö·’Ö°’Ö©’Ö¢’Ö›’Ö”’Ö’Ö†’Ö’Öx’Öq’Öj’Öc’Ö\’ÖU’ÖN’ÖG’Ö@’Ö9’Ö2’Ö+’Ö$’Ö’Ö’Ö’Ö’Ö’Öú‘Öó‘Öì‘Öå‘ÖÞ‘ÖבÖБÖɑֻ֑‘Ö´‘Ö­‘Ö¦‘ÖŸ‘Ö˜‘Ö‘‘ÖŠ‘Öƒ‘Ö|‘Öu‘Ön‘Ög‘Ö`‘ÖY‘ÖR‘ÖK‘ÖD‘Ö=‘Ö6‘Ö/‘Ö(‘Ö!‘Ö‘Ö‘Ö ‘Ö‘ÖþÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿŽÖøŽÖñŽÖêŽÖãŽÖÜŽÖÕŽÖÎŽÖÇŽÖÀŽÖ¹ŽÖ²ŽÖ«ŽÖ¤ŽÖŽÖ–ŽÖŽÖˆŽÖŽÖzŽÖsŽÖlŽÖeŽÖ^ŽÖWŽÖPŽÖIŽÖBŽÖ;ŽÖ4ŽÖ-ŽÖ&ŽÖŽÖŽÖŽÖ ŽÖŽÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùŒÖòŒÖëŒÖäŒÖÝŒÖÖŒÖÏŒÖÈŒÖÁŒÖºŒÖ³ŒÖ¬ŒÖ¥ŒÖžŒÖ—ŒÖŒÖ‰ŒÖ‚ŒÖ{ŒÖtŒÖmŒÖfŒÖ_ŒÖXŒÖQŒÖJŒÖCŒÖ<ŒÖ5ŒÖ.ŒÖ'ŒÖ ŒÖŒÖŒÖ ŒÖŒÖý‹Öö‹Öï‹Öè‹Öá‹ÖÚ‹ÖÓ‹ÖÌ‹Öŋ־‹Ö·‹Ö°‹Ö©‹Ö¢‹Ö›‹Ö”‹Ö‹Ö†‹Ö‹Öx‹Öq‹Öj‹Öc‹Ö\‹ÖU‹ÖN‹ÖG‹Ö@‹Ö9‹Ö2‹Ö+‹Ö$‹Ö‹Ö‹Ö‹Ö‹Ö‹ÖúŠÖóŠÖìŠÖåŠÖÞŠÖ׊ÖЊÖÉŠÖŠÖ»ŠÖ´ŠÖ­ŠÖ¦ŠÖŸŠÖ˜ŠÖ‘ŠÖŠŠÖƒŠÖ|ŠÖuŠÖnŠÖgŠÖ`ŠÖYŠÖRŠÖKŠÖDŠÖ=ŠÖ6ŠÖ/ŠÖ(ŠÖ!ŠÖŠÖŠÖ ŠÖŠÖþ‰Ö÷‰Öð‰Öé‰Öâ‰ÖÛ‰ÖÔ‰Ö͉ÖƉÖ¿‰Ö¸‰Ö±‰Öª‰Ö£‰Öœ‰Ö•‰ÖމÖ‡‰Ö€‰Öy‰Ör‰Ök‰Öd‰Ö]‰ÖV‰ÖO‰ÖH‰ÖA‰Ö:‰Ö3‰Ö,‰Ö%‰Ö‰Ö‰Ö‰Ö ‰Ö‰ÖûˆÖôˆÖíˆÖæˆÖ߈Ö؈ÖшÖʈÖÈÖ¼ˆÖµˆÖ®ˆÖ§ˆÖ ˆÖ™ˆÖ’ˆÖ‹ˆÖ„ˆÖ}ˆÖvˆÖoˆÖhˆÖaˆÖZˆÖSˆÖLˆÖEˆÖ>ˆÖ7ˆÖ0ˆÖ)ˆÖ"ˆÖˆÖˆÖ ˆÖˆÖÿ‡Öø‡Öñ‡Öê‡Öã‡Ö܇ÖÕ‡Ö·ÖLJÖÀ‡Ö¹‡Ö²‡Ö«‡Ö¤‡Ö‡Ö–‡Ö‡Öˆ‡Ö‡Öz‡Ös‡Öl‡Öe‡Ö^‡ÖW‡ÖP‡ÖI‡ÖB‡Ö;‡Ö4‡Ö-‡Ö&‡Ö‡Ö‡Ö‡Ö ‡Ö‡Öü†Öõ†Öî†Öç†Öà†ÖÙ†ÖÒ†ÖˆÖĆÖ½†Ö¶†Ö¯†Ö¨†Ö¡†Öš†Ö“†ÖŒ†Ö…†Ö~†Öw†Öp†Öi†Öb†Ö[†ÖT†ÖM†ÖF†Ö?†Ö8†Ö1†Ö*†Ö#†Ö†Ö†Ö†Ö†Ö†Öù…Öò…Öë…Öä…ÖÝ…ÖÖ…ÖÏ…ÖÈ…ÖÁ…Öº…Ö³…Ö¬…Ö¥…Öž…Ö—…Ö…Ö‰…Ö‚…Ö{…Öt…Öm…Öf…Ö_…ÖX…ÖQ…ÖJ…ÖC…Ö<…Ö5…Ö.…Ö'…Ö …Ö…Ö…Ö …Ö…Öý„Öö„Öï„Öè„Öá„ÖÚ„ÖÓ„ÖÌ„Öń־„Ö·„Ö°„Ö©„Ö¢„Ö›„Ö”„Ö„Ö†„Ö„Öx„Öq„Öj„Öc„Ö\„ÖU„ÖN„ÖG„Ö@„Ö9„Ö2„Ö+„Ö$„Ö„Ö„Ö„Ö„Ö„ÖúƒÖóƒÖìƒÖåƒÖÞƒÖ׃ÖЃÖɃÖƒÖ»ƒÖ´ƒÖ­ƒÖ¦ƒÖŸƒÖ˜ƒÖ‘ƒÖŠƒÖƒƒÖ|ƒÖuƒÖnƒÖgƒÖ`ƒÖYƒÖRƒÖKƒÖDƒÖ=ƒÖ6ƒÖ/ƒÖ(ƒÖ!ƒÖƒÖƒÖ ƒÖƒÖþ‚Ö÷‚Öð‚Öé‚Öâ‚ÖÛ‚ÖÔ‚ÖÍ‚ÖÆ‚Ö¿‚Ö¸‚Ö±‚Öª‚Ö£‚Öœ‚Ö•‚ÖŽ‚Ö‡‚Ö€‚Öy‚Ör‚Ök‚Öd‚Ö]‚ÖV‚ÖO‚ÖH‚ÖA‚Ö:‚Ö3‚Ö,‚Ö%‚Ö‚Ö‚Ö‚Ö ‚Ö‚ÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿ€Öø€Öñ€Öê€Öã€ÖÜ€ÖÕ€Ö΀ÖÇ€ÖÀ€Ö¹€Ö²€Ö«€Ö¤€Ö€Ö–€Ö€Öˆ€Ö€Öz€Ös€Öl€Öe€Ö^€ÖW€ÖP€ÖI€ÖB€Ö;€Ö4€Ö-€Ö&€Ö€Ö€Ö€Ö €Ö€ÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖù~Öò~Öë~Öä~ÖÝ~ÖÖ~ÖÏ~ÖÈ~ÖÁ~Öº~Ö³~Ö¬~Ö¥~Öž~Ö—~Ö~Ö‰~Ö‚~Ö{~Öt~Öm~Öf~Ö_~ÖX~ÖQ~ÖJ~ÖC~Ö<~Ö5~Ö.~Ö'~Ö ~Ö~Ö~Ö ~Ö~Öý}Öö}Öï}Öè}Öá}ÖÚ}ÖÓ}ÖÌ}ÖÅ}Ö¾}Ö·}Ö°}Ö©}Ö¢}Ö›}Ö”}Ö}Ö†}Ö}Öx}Öq}Öj}Öc}Ö\}ÖU}ÖN}ÖG}Ö@}Ö9}Ö2}Ö+}Ö$}Ö}Ö}Ö}Ö}Ö}Öú|Öó|Öì|Öå|ÖÞ|Ö×|ÖÐ|ÖÉ|ÖÂ|Ö»|Ö´|Ö­|Ö¦|ÖŸ|Ö˜|Ö‘|ÖŠ|Öƒ|Ö||Öu|Ön|Ög|Ö`|ÖY|ÖR|ÖK|ÖD|Ö=|Ö6|Ö/|Ö(|Ö!|Ö|Ö|Ö |Ö|Öþ{Ö÷{Öð{Öé{Öâ{ÖÛ{ÖÔ{ÖÍ{ÖÆ{Ö¿{Ö¸{Ö±{Öª{Ö£{Öœ{Ö•{ÖŽ{Ö‡{Ö€{Öy{Ör{Ök{Öd{Ö]{ÖV{ÖO{ÖH{ÖA{Ö:{Ö3{Ö,{Ö%{Ö{Ö{Ö{Ö {Ö{ÖûzÖôzÖízÖæzÖßzÖØzÖÑzÖÊzÖÃzÖ¼zÖµzÖ®zÖ§zÖ zÖ™zÖ’zÖ‹zÖ„zÖ}zÖvzÖozÖhzÖazÖZzÖSzÖLzÖEzÖ>zÖ7zÖ0zÖ)zÖ"zÖzÖzÖ zÖzÖÿyÖøyÖñyÖêyÖãyÖÜyÖÕyÖÎyÖÇyÖÀyÖ¹yÖ²yÖ«yÖ¤yÖyÖ–yÖyÖˆyÖyÖzyÖsyÖlyÖeyÖ^yÖWyÖPyÖIyÖByÖ;yÖ4yÖ-yÖ&yÖyÖyÖyÖ yÖyÖüxÖõxÖîxÖçxÖàxÖÙxÖÒxÖËxÖÄxÖ½xÖ¶xÖ¯xÖ¨xÖ¡xÖšxÖ“xÖŒxÖ…xÖ~xÖwxÖpxÖixÖbxÖ[xÖTxÖMxÖFxÖ?xÖ8xÖ1xÖ*xÖ#xÖxÖxÖxÖxÖxÖùwÖòwÖëwÖäwÖÝwÖÖwÖÏwÖÈwÖÁwÖºwÖ³wÖ¬wÖ¥wÖžwÖ—wÖwÖ‰wÖ‚wÖ{wÖtwÖmwÖfwÖ_wÖXwÖQwÖJwÖCwÖsÖ7sÖ0sÖ)sÖ"sÖsÖsÖ sÖsÖÿrÖørÖñrÖêrÖãrÖÜrÖÕrÖÎrÖÇrÖÀrÖ¹rÖ²rÖ«rÖ¤rÖrÖ–rÖrÖˆrÖrÖzrÖsrÖlrÖerÖ^rÖWrÖPrÖIrÖBrÖ;rÖ4rÖ-rÖ&rÖrÖrÖrÖ rÖrÖüqÖõqÖîqÖçqÖàqÖÙqÖÒqÖËqÖÄqÖ½qÖ¶qÖ¯qÖ¨qÖ¡qÖšqÖ“qÖŒqÖ…qÖ~qÖwqÖpqÖiqÖbqÖ[qÖTqÖMqÖFqÖ?qÖ8qÖ1qÖ*qÖ#qÖqÖqÖqÖqÖqÖùpÖòpÖëpÖäpÖÝpÖÖpÖÏpÖÈpÖÁpÖºpÖ³pÖ¬pÖ¥pÖžpÖ—pÖpÖ‰pÖ‚pÖ{pÖtpÖmpÖfpÖ_pÖXpÖQpÖJpÖCpÖlÖ7lÖ0lÖ)lÖ"lÖlÖlÖ lÖlÖÿkÖøkÖñkÖêkÖãkÖÜkÖÕkÖÎkÖÇkÖÀkÖ¹kÖ²kÖ«kÖ¤kÖkÖ–kÖkÖˆkÖkÖzkÖskÖlkÖekÖ^kÖWkÖPkÖIkÖBkÖ;kÖ4kÖ-kÖ&kÖkÖkÖkÖ kÖkÖüjÖõjÖîjÖçjÖàjÖÙjÖÒjÖËjÖÄjÖ½jÖ¶jÖ¯jÖ¨jÖ¡jÖšjÖ“jÖŒjÖ…jÖ~jÖwjÖpjÖijÖbjÖ[jÖTjÖMjÖFjÖ?jÖ8jÖ1jÖ*jÖ#jÖjÖjÖjÖjÖjÖùiÖòiÖëiÖäiÖÝiÖÖiÖÏiÖÈiÖÁiÖºiÖ³iÖ¬iÖ¥iÖžiÖ—iÖiÖ‰iÖ‚iÖ{iÖtiÖmiÖfiÖ_iÖXiÖQiÖJiÖCiÖeÖ7eÖ0eÖ)eÖ"eÖeÖeÖ eÖeÖÿdÖødÖñdÖêdÖãdÖÜdÖÕdÖÎdÖÇdÖÀdÖ¹dÖ²dÖ«dÖ¤dÖdÖ–dÖdÖˆdÖdÖzdÖsdÖldÖedÖ^dÖWdÖPdÖIdÖBdÖ;dÖ4dÖ-dÖ&dÖdÖdÖdÖ dÖdÖücÖõcÖîcÖçcÖàcÖÙcÖÒcÖËcÖÄcÖ½cÖ¶cÖ¯cÖ¨cÖ¡cÖšcÖ“cÖŒcÖ…cÖ~cÖwcÖpcÖicÖbcÖ[cÖTcÖMcÖFcÖ?cÖ8cÖ1cÖ*cÖ#cÖcÖcÖcÖcÖcÖùbÖòbÖëbÖäbÖÝbÖÖbÖÏbÖÈbÖÁbÖºbÖ³bÖ¬bÖ¥bÖžbÖ—bÖbÖ‰bÖ‚bÖ{bÖtbÖmbÖfbÖ_bÖXbÖQbÖJbÖCbÖ^Ö7^Ö0^Ö)^Ö"^Ö^Ö^Ö ^Ö^Öÿ]Öø]Öñ]Öê]Öã]ÖÜ]ÖÕ]ÖÎ]ÖÇ]ÖÀ]Ö¹]Ö²]Ö«]Ö¤]Ö]Ö–]Ö]Öˆ]Ö]Öz]Ös]Öl]Öe]Ö^]ÖW]ÖP]ÖI]ÖB]Ö;]Ö4]Ö-]Ö&]Ö]Ö]Ö]Ö ]Ö]Öü\Öõ\Öî\Öç\Öà\ÖÙ\ÖÒ\ÖË\ÖÄ\Ö½\Ö¶\Ö¯\Ö¨\Ö¡\Öš\Ö“\ÖŒ\Ö…\Ö~\Öw\Öp\Öi\Öb\Ö[\ÖT\ÖM\ÖF\Ö?\Ö8\Ö1\Ö*\Ö#\Ö\Ö\Ö\Ö\Ö\Öù[Öò[Öë[Öä[ÖÝ[ÖÖ[ÖÏ[ÖÈ[ÖÁ[Öº[Ö³[Ö¬[Ö¥[Öž[Ö—[Ö[Ö‰[Ö‚[Ö{[Öt[Öm[Öf[Ö_[ÖX[ÖQ[ÖJ[ÖC[Ö<[Ö5[Ö.[Ö'[Ö [Ö[Ö[Ö [Ö[ÖýZÖöZÖïZÖèZÖáZÖÚZÖÓZÖÌZÖÅZÖ¾ZÖ·ZÖ°ZÖ©ZÖ¢ZÖ›ZÖ”ZÖZÖ†ZÖZÖxZÖqZÖjZÖcZÖ\ZÖUZÖNZÖGZÖ@ZÖ9ZÖ2ZÖ+ZÖ$ZÖZÖZÖZÖZÖZÖúYÖóYÖìYÖåYÖÞYÖ×YÖÐYÖÉYÖÂYÖ»YÖ´YÖ­YÖ¦YÖŸYÖ˜YÖ‘YÖŠYÖƒYÖ|YÖuYÖnYÖgYÖ`YÖYYÖRYÖKYÖDYÖ=YÖ6YÖ/YÖ(YÖ!YÖYÖYÖ YÖYÖþXÖ÷XÖðXÖéXÖâXÖÛXÖÔXÖÍXÖÆXÖ¿XÖ¸XÖ±XÖªXÖ£XÖœXÖ•XÖŽXÖ‡XÖ€XÖyXÖrXÖkXÖdXÖ]XÖVXÖOXÖHXÖAXÖ:XÖ3XÖ,XÖ%XÖXÖXÖXÖ XÖXÖûWÖôWÖíWÖæWÖßWÖØWÖÑWÖÊWÖÃWÖ¼WÖµWÖ®WÖ§WÖ WÖ™WÖ’WÖ‹WÖ„WÖ}WÖvWÖoWÖhWÖaWÖZWÖSWÖLWÖEWÖ>WÖ7WÖ0WÖ)WÖ"WÖWÖWÖ WÖWÖÿVÖøVÖñVÖêVÖãVÖÜVÖÕVÖÎVÖÇVÖÀVÖ¹VÖ²VÖ«VÖ¤VÖVÖ–VÖVÖˆVÖVÖzVÖsVÖlVÖeVÖ^VÖWVÖPVÖIVÖBVÖ;VÖ4VÖ-VÖ&VÖVÖVÖVÖ VÖVÖüUÖõUÖîUÖçUÖàUÖÙUÖÒUÖËUÖÄUÖ½UÖ¶UÖ¯UÖ¨UÖ¡UÖšUÖ“UÖŒUÖ…UÖ~UÖwUÖpUÖiUÖbUÖ[UÖTUÖMUÖFUÖ?UÖ8UÖ1UÖ*UÖ#UÖUÖUÖUÖUÖUÖùTÖòTÖëTÖäTÖÝTÖÖTÖÏTÖÈTÖÁTÖºTÖ³TÖ¬TÖ¥TÖžTÖ—TÖTÖ‰TÖ‚TÖ{TÖtTÖmTÖfTÖ_TÖXTÖQTÖJTÖCTÖPÖ7PÖ0PÖ)PÖ"PÖPÖPÖ PÖPÖÿOÖøOÖñOÖêOÖãOÖÜOÖÕOÖÎOÖÇOÖÀOÖ¹OÖ²OÖ«OÖ¤OÖOÖ–OÖOÖˆOÖOÖzOÖsOÖlOÖeOÖ^OÖWOÖPOÖIOÖBOÖ;OÖ4OÖ-OÖ&OÖOÖOÖOÖ OÖOÖüNÖõNÖîNÖçNÖàNÖÙNÖÒNÖËNÖÄNÖ½NÖ¶NÖ¯NÖ¨NÖ¡NÖšNÖ“NÖŒNÖ…NÖ~NÖwNÖpNÖiNÖbNÖ[NÖTNÖMNÖFNÖ?NÖ8NÖ1NÖ*NÖ#NÖNÖNÖNÖNÖNÖùMÖòMÖëMÖäMÖÝMÖÖMÖÏMÖÈMÖÁMÖºMÖ³MÖ¬MÖ¥MÖžMÖ—MÖMÖ‰MÖ‚MÖ{MÖtMÖmMÖfMÖ_MÖXMÖQMÖJMÖCMÖIÖ7IÖ0IÖ)IÖ"IÖIÖIÖ IÖIÖÿHÖøHÖñHÖêHÖãHÖÜHÖÕHÖÎHÖÇHÖÀHÖ¹HÖ²HÖ«HÖ¤HÖHÖ–HÖHÖˆHÖHÖzHÖsHÖlHÖeHÖ^HÖWHÖPHÖIHÖBHÖ;HÖ4HÖ-HÖ&HÖHÖHÖHÖ HÖHÖüGÖõGÖîGÖçGÖàGÖÙGÖÒGÖËGÖÄGÖ½GÖ¶GÖ¯GÖ¨GÖ¡GÖšGÖ“GÖŒGÖ…GÖ~GÖwGÖpGÖiGÖbGÖ[GÖTGÖMGÖFGÖ?GÖ8GÖ1GÖ*GÖ#GÖGÖGÖGÖGÖGÖùFÖòFÖëFÖäFÖÝFÖÖFÖÏFÖÈFÖÁFÖºFÖ³FÖ¬FÖ¥FÖžFÖ—FÖFÖ‰FÖ‚FÖ{FÖtFÖmFÖfFÖ_FÖXFÖQFÖJFÖCFÖBÖ7BÖ0BÖ)BÖ"BÖBÖBÖ BÖBÖÿAÖøAÖñAÖêAÖãAÖÜAÖÕAÖÎAÖÇAÖÀAÖ¹AÖ²AÖ«AÖ¤AÖAÖ–AÖAÖˆAÖAÖzAÖsAÖlAÖeAÖ^AÖWAÖPAÖIAÖBAÖ;AÖ4AÖ-AÖ&AÖAÖAÖAÖ AÖAÖü@Öõ@Öî@Öç@Öà@ÖÙ@ÖÒ@ÖË@ÖÄ@Ö½@Ö¶@Ö¯@Ö¨@Ö¡@Öš@Ö“@ÖŒ@Ö…@Ö~@Öw@Öp@Öi@Öb@Ö[@ÖT@ÖM@ÖF@Ö?@Ö8@Ö1@Ö*@Ö#@Ö@Ö@Ö@Ö@Ö@Öù?Öò?Öë?Öä?ÖÝ?ÖÖ?ÖÏ?ÖÈ?ÖÁ?Öº?Ö³?Ö¬?Ö¥?Öž?Ö—?Ö?Ö‰?Ö‚?Ö{?Öt?Öm?Öf?Ö_?ÖX?ÖQ?ÖJ?ÖC?ÖÖö>Öï>Öè>Öá>ÖÚ>ÖÓ>ÖÌ>ÖÅ>Ö¾>Ö·>Ö°>Ö©>Ö¢>Ö›>Ö”>Ö>Ö†>Ö>Öx>Öq>Öj>Öc>Ö\>ÖU>ÖN>ÖG>Ö@>Ö9>Ö2>Ö+>Ö$>Ö>Ö>Ö>Ö>Ö>Öú=Öó=Öì=Öå=ÖÞ=Ö×=ÖÐ=ÖÉ=ÖÂ=Ö»=Ö´=Ö­=Ö¦=ÖŸ=Ö˜=Ö‘=ÖŠ=Öƒ=Ö|=Öu=Ön=Ög=Ö`=ÖY=ÖR=ÖK=ÖD=Ö==Ö6=Ö/=Ö(=Ö!=Ö=Ö=Ö =Ö=Öþ<Ö÷<Öð<Öé<Öâ<ÖÛ<ÖÔ<ÖÍ<ÖÆ<Ö¿<Ö¸<Ö±<Öª<Ö£<Öœ<Ö•<ÖŽ<Ö‡<Ö€<Öy<Ör<Ök<Öd<Ö]<ÖV<ÖO<ÖH<ÖA<Ö:<Ö3<Ö,<Ö%<Ö<Ö<Ö<Ö <Ö<Öû;Öô;Öí;Öæ;Öß;ÖØ;ÖÑ;ÖÊ;ÖÃ;Ö¼;Öµ;Ö®;Ö§;Ö ;Ö™;Ö’;Ö‹;Ö„;Ö};Öv;Öo;Öh;Öa;ÖZ;ÖS;ÖL;ÖE;Ö>;Ö7;Ö0;Ö);Ö";Ö;Ö;Ö ;Ö;Öÿ:Öø:Öñ:Öê:Öã:ÖÜ:ÖÕ:ÖÎ:ÖÇ:ÖÀ:Ö¹:Ö²:Ö«:Ö¤:Ö:Ö–:Ö:Öˆ:Ö:Öz:Ös:Öl:Öe:Ö^:ÖW:ÖP:ÖI:ÖB:Ö;:Ö4:Ö-:Ö&:Ö:Ö:Ö:Ö :Ö:Öü9Öõ9Öî9Öç9Öà9ÖÙ9ÖÒ9ÖË9ÖÄ9Ö½9Ö¶9Ö¯9Ö¨9Ö¡9Öš9Ö“9ÖŒ9Ö…9Ö~9Öw9Öp9Öi9Öb9Ö[9ÖT9ÖM9ÖF9Ö?9Ö89Ö19Ö*9Ö#9Ö9Ö9Ö9Ö9Ö9Öù8Öò8Öë8Öä8ÖÝ8ÖÖ8ÖÏ8ÖÈ8ÖÁ8Öº8Ö³8Ö¬8Ö¥8Öž8Ö—8Ö8Ö‰8Ö‚8Ö{8Öt8Öm8Öf8Ö_8ÖX8ÖQ8ÖJ8ÖC8Ö<8Ö58Ö.8Ö'8Ö 8Ö8Ö8Ö 8Ö8Öý7Öö7Öï7Öè7Öá7ÖÚ7ÖÓ7ÖÌ7ÖÅ7Ö¾7Ö·7Ö°7Ö©7Ö¢7Ö›7Ö”7Ö7Ö†7Ö7Öx7Öq7Öj7Öc7Ö\7ÖU7ÖN7ÖG7Ö@7Ö97Ö27Ö+7Ö$7Ö7Ö7Ö7Ö7Ö7Öú6Öó6Öì6Öå6ÖÞ6Ö×6ÖÐ6ÖÉ6ÖÂ6Ö»6Ö´6Ö­6Ö¦6ÖŸ6Ö˜6Ö‘6ÖŠ6Öƒ6Ö|6Öu6Ön6Ög6Ö`6ÖY6ÖR6ÖK6ÖD6Ö=6Ö66Ö/6Ö(6Ö!6Ö6Ö6Ö 6Ö6Öþ5Ö÷5Öð5Öé5Öâ5ÖÛ5ÖÔ5ÖÍ5ÖÆ5Ö¿5Ö¸5Ö±5Öª5Ö£5Öœ5Ö•5ÖŽ5Ö‡5Ö€5Öy5Ör5Ök5Öd5Ö]5ÖV5ÖO5ÖH5ÖA5Ö:5Ö35Ö,5Ö%5Ö5Ö5Ö5Ö 5Ö5Öû4Öô4Öí4Öæ4Öß4ÖØ4ÖÑ4ÖÊ4ÖÃ4Ö¼4Öµ4Ö®4Ö§4Ö 4Ö™4Ö’4Ö‹4Ö„4Ö}4Öv4Öo4Öh4Öa4ÖZ4ÖS4ÖL4ÖE4Ö>4Ö74Ö04Ö)4Ö"4Ö4Ö4Ö 4Ö4Öÿ3Öø3Öñ3Öê3Öã3ÖÜ3ÖÕ3ÖÎ3ÖÇ3ÖÀ3Ö¹3Ö²3Ö«3Ö¤3Ö3Ö–3Ö3Öˆ3Ö3Öz3Ös3Öl3Öe3Ö^3ÖW3ÖP3ÖI3ÖB3Ö;3Ö43Ö-3Ö&3Ö3Ö3Ö3Ö 3Ö3Öü2Öõ2Öî2Öç2Öà2ÖÙ2ÖÒ2ÖË2ÖÄ2Ö½2Ö¶2Ö¯2Ö¨2Ö¡2Öš2Ö“2ÖŒ2Ö…2Ö~2Öw2Öp2Öi2Öb2Ö[2ÖT2ÖM2ÖF2Ö?2Ö82Ö12Ö*2Ö#2Ö2Ö2Ö2Ö2Ö2Öù1Öò1Öë1Öä1ÖÝ1ÖÖ1ÖÏ1ÖÈ1ÖÁ1Öº1Ö³1Ö¬1Ö¥1Öž1Ö—1Ö1Ö‰1Ö‚1Ö{1Öt1Öm1Öf1Ö_1ÖX1ÖQ1ÖJ1ÖC1Ö<1Ö51Ö.1Ö'1Ö 1Ö1Ö1Ö 1Ö1Öý0Öö0Öï0Öè0Öá0ÖÚ0ÖÓ0ÖÌ0ÖÅ0Ö¾0Ö·0Ö°0Ö©0Ö¢0Ö›0Ö”0Ö0Ö†0Ö0Öx0Öq0Öj0Öc0Ö\0ÖU0ÖN0ÖG0Ö@0Ö90Ö20Ö+0Ö$0Ö0Ö0Ö0Ö0Ö0Öú/Öó/Öì/Öå/ÖÞ/Ö×/ÖÐ/ÖÉ/ÖÂ/Ö»/Ö´/Ö­/Ö¦/ÖŸ/Ö˜/Ö‘/ÖŠ/Öƒ/Ö|/Öu/Ön/Ög/Ö`/ÖY/ÖR/ÖK/ÖD/Ö=/Ö6/Ö//Ö(/Ö!/Ö/Ö/Ö /Ö/Öþ.Ö÷.Öð.Öé.Öâ.ÖÛ.ÖÔ.ÖÍ.ÖÆ.Ö¿.Ö¸.Ö±.Öª.Ö£.Öœ.Ö•.ÖŽ.Ö‡.Ö€.Öy.Ör.Ök.Öd.Ö].ÖV.ÖO.ÖH.ÖA.Ö:.Ö3.Ö,.Ö%.Ö.Ö.Ö.Ö .Ö.Öû-Öô-Öí-Öæ-Öß-ÖØ-ÖÑ-ÖÊ-ÖÃ-Ö¼-Öµ-Ö®-Ö§-Ö -Ö™-Ö’-Ö‹-Ö„-Ö}-Öv-Öo-Öh-Öa-ÖZ-ÖS-ÖL-ÖE-Ö>-Ö7-Ö0-Ö)-Ö"-Ö-Ö-Ö -Ö-Öÿ,Öø,Öñ,Öê,Öã,ÖÜ,ÖÕ,ÖÎ,ÖÇ,ÖÀ,Ö¹,Ö²,Ö«,Ö¤,Ö,Ö–,Ö,Öˆ,Ö,Öz,Ös,Öl,Öe,Ö^,ÖW,ÖP,ÖI,ÖB,Ö;,Ö4,Ö-,Ö&,Ö,Ö,Ö,Ö ,Ö,Öü+Öõ+Öî+Öç+Öà+ÖÙ+ÖÒ+ÖË+ÖÄ+Ö½+Ö¶+Ö¯+Ö¨+Ö¡+Öš+Ö“+ÖŒ+Ö…+Ö~+Öw+Öp+Öi+Öb+Ö[+ÖT+ÖM+ÖF+Ö?+Ö8+Ö1+Ö*+Ö#+Ö+Ö+Ö+Ö+Ö+Öù*Öò*Öë*Öä*ÖÝ*ÖÖ*ÖÏ*ÖÈ*ÖÁ*Öº*Ö³*Ö¬*Ö¥*Öž*Ö—*Ö*Ö‰*Ö‚*Ö{*Öt*Öm*Öf*Ö_*ÖX*ÖQ*ÖJ*ÖC*Ö<*Ö5*Ö.*Ö'*Ö *Ö*Ö*Ö *Ö*Öý)Öö)Öï)Öè)Öá)ÖÚ)ÖÓ)ÖÌ)ÖÅ)Ö¾)Ö·)Ö°)Ö©)Ö¢)Ö›)Ö”)Ö)Ö†)Ö)Öx)Öq)Öj)Öc)Ö\)ÖU)ÖN)ÖG)Ö@)Ö9)Ö2)Ö+)Ö$)Ö)Ö)Ö)Ö)Ö)Öú(Öó(Öì(Öå(ÖÞ(Ö×(ÖÐ(ÖÉ(ÖÂ(Ö»(Ö´(Ö­(Ö¦(ÖŸ(Ö˜(Ö‘(ÖŠ(Öƒ(Ö|(Öu(Ön(Ög(Ö`(ÖY(ÖR(ÖK(ÖD(Ö=(Ö6(Ö/(Ö((Ö!(Ö(Ö(Ö (Ö(Öþ'Ö÷'Öð'Öé'Öâ'ÖÛ'ÖÔ'ÖÍ'ÖÆ'Ö¿'Ö¸'Ö±'Öª'Ö£'Öœ'Ö•'ÖŽ'Ö‡'Ö€'Öy'Ör'Ök'Öd'Ö]'ÖV'ÖO'ÖH'ÖA'Ö:'Ö3'Ö,'Ö%'Ö'Ö'Ö'Ö 'Ö'Öû&Öô&Öí&Öæ&Öß&ÖØ&ÖÑ&ÖÊ&ÖÃ&Ö¼&Öµ&Ö®&Ö§&Ö &Ö™&Ö’&Ö‹&Ö„&Ö}&Öv&Öo&Öh&Öa&ÖZ&ÖS&ÖL&ÖE&Ö>&Ö7&Ö0&Ö)&Ö"&Ö&Ö&Ö &Ö&Öÿ%Öø%Öñ%Öê%Öã%ÖÜ%ÖÕ%ÖÎ%ÖÇ%ÖÀ%Ö¹%Ö²%Ö«%Ö¤%Ö%Ö–%Ö%Öˆ%Ö%Öz%Ös%Öl%Öe%Ö^%ÖW%ÖP%ÖI%ÖB%Ö;%Ö4%Ö-%Ö&%Ö%Ö%Ö%Ö %Ö%Öü$Öõ$Öî$Öç$Öà$ÖÙ$ÖÒ$ÖË$ÖÄ$Ö½$Ö¶$Ö¯$Ö¨$Ö¡$Öš$Ö“$ÖŒ$Ö…$Ö~$Öw$Öp$Öi$Öb$Ö[$ÖT$ÖM$ÖF$Ö?$Ö8$Ö1$Ö*$Ö#$Ö$Ö$Ö$Ö$Ö$Öù#Öò#Öë#Öä#ÖÝ#ÖÖ#ÖÏ#ÖÈ#ÖÁ#Öº#Ö³#Ö¬#Ö¥#Öž#Ö—#Ö#Ö‰#Ö‚#Ö{#Öt#Öm#Öf#Ö_#ÖX#ÖQ#ÖJ#ÖC#Ö<#Ö5#Ö.#Ö'#Ö #Ö#Ö#Ö #Ö#Öý"Öö"Öï"Öè"Öá"ÖÚ"ÖÓ"ÖÌ"ÖÅ"Ö¾"Ö·"Ö°"Ö©"Ö¢"Ö›"Ö”"Ö"Ö†"Ö"Öx"Öq"Öj"Öc"Ö\"ÖU"ÖN"ÖG"Ö@"Ö9"Ö2"Ö+"Ö$"Ö"Ö"Ö"Ö"Ö"Öú!Öó!Öì!Öå!ÖÞ!Ö×!ÖÐ!ÖÉ!ÖÂ!Ö»!Ö´!Ö­!Ö¦!ÖŸ!Ö˜!Ö‘!ÖŠ!Öƒ!Ö|!Öu!Ön!Ög!Ö`!ÖY!ÖR!ÖK!ÖD!Ö=!Ö6!Ö/!Ö(!Ö!!Ö!Ö!Ö !Ö!Öþ Ö÷ Öð Öé Öâ ÖÛ ÖÔ ÖÍ ÖÆ Ö¿ Ö¸ Ö± Öª Ö£ Öœ Ö• ÖŽ Ö‡ Ö€ Öy Ör Ök Öd Ö] ÖV ÖO ÖH ÖA Ö: Ö3 Ö, Ö% Ö Ö Ö Ö Ö ÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖý Öö Öï Öè Öá ÖÚ ÖÓ ÖÌ ÖÅ Ö¾ Ö· Ö° Ö© Ö¢ Ö› Ö” Ö Ö† Ö Öx Öq Öj Öc Ö\ ÖU ÖN ÖG Ö@ Ö9 Ö2 Ö+ Ö$ Ö Ö Ö Ö Ö Öú Öó Öì Öå ÖÞ Ö× ÖÐ ÖÉ Ö Ö» Ö´ Ö­ Ö¦ ÖŸ Ö˜ Ö‘ ÖŠ Öƒ Ö| Öu Ön Ög Ö` ÖY ÖR ÖK ÖD Ö= Ö6 Ö/ Ö( Ö! Ö Ö Ö Ö Öþ Ö÷ Öð Öé Öâ ÖÛ ÖÔ ÖÍ ÖÆ Ö¿ Ö¸ Ö± Öª Ö£ Öœ Ö• ÖŽ Ö‡ Ö€ Öy Ör Ök Öd Ö] ÖV ÖO ÖH ÖA Ö: Ö3 Ö, Ö% Ö Ö Ö Ö Ö Öû Öô Öí Öæ Öß ÖØ ÖÑ ÖÊ Öà Ö¼ Öµ Ö® Ö§ Ö  Ö™ Ö’ Ö‹ Ö„ Ö} Öv Öo Öh Öa ÖZ ÖS ÖL ÖE Ö> Ö7 Ö0 Ö) Ö" Ö Ö Ö Ö Öÿ Öø Öñ Öê Öã ÖÜ ÖÕ ÖÎ ÖÇ ÖÀ Ö¹ Ö² Ö« Ö¤ Ö Ö– Ö Öˆ Ö Öz Ös Öl Öe Ö^ ÖW ÖP ÖI ÖB Ö; Ö4 Ö- Ö& Ö Ö Ö Ö Ö ÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÿÕöÿÕïÿÕèÿÕáÿÕÚÿÕÓÿÕÌÿÕÅÿÕ¾ÿÕ·ÿÕ°ÿÕ©ÿÕ¢ÿÕ›ÿÕ”ÿÕÿÕ†ÿÕÿÕxÿÕqÿÕjÿÕcÿÕ\ÿÕUÿÕNÿÕGÿÕ@ÿÕ9ÿÕ2ÿÕ+ÿÕ$ÿÕÿÕÿÕÿÕÿÕÿÕúþÕóþÕìþÕåþÕÞþÕ×þÕÐþÕÉþÕÂþÕ»þÕ´þÕ­þÕ¦þÕŸþÕ˜þÕ‘þÕŠþÕƒþÕ|þÕuþÕnþÕgþÕ`þÕYþÕRþÕKþÕDþÕ=þÕ6þÕ/þÕ(þÕ!þÕþÕþÕ þÕþÕþýÕ÷ýÕðýÕéýÕâýÕÛýÕÔýÕÍýÕÆýÕ¿ýÕ¸ýÕ±ýÕªýÕ£ýÕœýÕ•ýÕŽýÕ‡ýÕ€ýÕyýÕrýÕkýÕdýÕ]ýÕVýÕOýÕHýÕAýÕ:ýÕ3ýÕ,ýÕ%ýÕýÕýÕýÕ ýÕýÕûüÕôüÕíüÕæüÕßüÕØüÕÑüÕÊüÕÃüÕ¼üÕµüÕ®üÕ§üÕ üÕ™üÕ’üÕ‹üÕ„üÕ}üÕvüÕoüÕhüÕaüÕZüÕSüÕLüÕEüÕ>üÕ7üÕ0üÕ)üÕ"üÕüÕüÕ üÕüÕÿûÕøûÕñûÕêûÕãûÕÜûÕÕûÕÎûÕÇûÕÀûÕ¹ûÕ²ûÕ«ûÕ¤ûÕûÕ–ûÕûÕˆûÕûÕzûÕsûÕlûÕeûÕ^ûÕWûÕPûÕIûÕBûÕ;ûÕ4ûÕ-ûÕ&ûÕûÕûÕûÕ ûÕûÕüúÕõúÕîúÕçúÕàúÕÙúÕÒúÕËúÕÄúÕ½úÕ¶úÕ¯úÕ¨úÕ¡úÕšúÕ“úÕŒúÕ…úÕ~úÕwúÕpúÕiúÕbúÕ[úÕTúÕMúÕFúÕ?úÕ8úÕ1úÕ*úÕ#úÕúÕúÕúÕúÕúÕùùÕòùÕëùÕäùÕÝùÕÖùÕÏùÕÈùÕÁùÕºùÕ³ùÕ¬ùÕ¥ùÕžùÕ—ùÕùÕ‰ùÕ‚ùÕ{ùÕtùÕmùÕfùÕ_ùÕXùÕQùÕJùÕCùÕ<ùÕ5ùÕ.ùÕ'ùÕ ùÕùÕùÕ ùÕùÕýøÕöøÕïøÕèøÕáøÕÚøÕÓøÕÌøÕÅøÕ¾øÕ·øÕ°øÕ©øÕ¢øÕ›øÕ”øÕøÕ†øÕøÕxøÕqøÕjøÕcøÕ\øÕUøÕNøÕGøÕ@øÕ9øÕ2øÕ+øÕ$øÕøÕøÕøÕøÕøÕú÷Õó÷Õì÷Õå÷ÕÞ÷Õ×÷ÕÐ÷ÕÉ÷ÕÂ÷Õ»÷Õ´÷Õ­÷Õ¦÷ÕŸ÷Õ˜÷Õ‘÷ÕŠ÷Õƒ÷Õ|÷Õu÷Õn÷Õg÷Õ`÷ÕY÷ÕR÷ÕK÷ÕD÷Õ=÷Õ6÷Õ/÷Õ(÷Õ!÷Õ÷Õ÷Õ ÷Õ÷ÕþöÕ÷öÕðöÕéöÕâöÕÛöÕÔöÕÍöÕÆöÕ¿öÕ¸öÕ±öÕªöÕ£öÕœöÕ•öÕŽöÕ‡öÕ€öÕyöÕröÕköÕdöÕ]öÕVöÕOöÕHöÕAöÕ:öÕ3öÕ,öÕ%öÕöÕöÕöÕ öÕöÕûõÕôõÕíõÕæõÕßõÕØõÕÑõÕÊõÕÃõÕ¼õÕµõÕ®õÕ§õÕ õÕ™õÕ’õÕ‹õÕ„õÕ}õÕvõÕoõÕhõÕaõÕZõÕSõÕLõÕEõÕ>õÕ7õÕ0õÕ)õÕ"õÕõÕõÕ õÕõÕÿôÕøôÕñôÕêôÕãôÕÜôÕÕôÕÎôÕÇôÕÀôÕ¹ôÕ²ôÕ«ôÕ¤ôÕôÕ–ôÕôÕˆôÕôÕzôÕsôÕlôÕeôÕ^ôÕWôÕPôÕIôÕBôÕ;ôÕ4ôÕ-ôÕ&ôÕôÕôÕôÕ ôÕôÕüóÕõóÕîóÕçóÕàóÕÙóÕÒóÕËóÕÄóÕ½óÕ¶óÕ¯óÕ¨óÕ¡óÕšóÕ“óÕŒóÕ…óÕ~óÕwóÕpóÕióÕbóÕ[óÕTóÕMóÕFóÕ?óÕ8óÕ1óÕ*óÕ#óÕóÕóÕóÕóÕóÕùòÕòòÕëòÕäòÕÝòÕÖòÕÏòÕÈòÕÁòÕºòÕ³òÕ¬òÕ¥òÕžòÕ—òÕòÕ‰òÕ‚òÕ{òÕtòÕmòÕfòÕ_òÕXòÕQòÕJòÕCòÕ<òÕ5òÕ.òÕ'òÕ òÕòÕòÕ òÕòÕýñÕöñÕïñÕèñÕáñÕÚñÕÓñÕÌñÕÅñÕ¾ñÕ·ñÕ°ñÕ©ñÕ¢ñÕ›ñÕ”ñÕñÕ†ñÕñÕxñÕqñÕjñÕcñÕ\ñÕUñÕNñÕGñÕ@ñÕ9ñÕ2ñÕ+ñÕ$ñÕñÕñÕñÕñÕñÕúðÕóðÕìðÕåðÕÞðÕ×ðÕÐðÕÉðÕÂðÕ»ðÕ´ðÕ­ðÕ¦ðÕŸðÕ˜ðÕ‘ðÕŠðÕƒðÕ|ðÕuðÕnðÕgðÕ`ðÕYðÕRðÕKðÕDðÕ=ðÕ6ðÕ/ðÕ(ðÕ!ðÕðÕðÕ ðÕðÕþïÕ÷ïÕðïÕéïÕâïÕÛïÕÔïÕÍïÕÆïÕ¿ïÕ¸ïÕ±ïÕªïÕ£ïÕœïÕ•ïÕŽïÕ‡ïÕ€ïÕyïÕrïÕkïÕdïÕ]ïÕVïÕOïÕHïÕAïÕ:ïÕ3ïÕ,ïÕ%ïÕïÕïÕïÕ ïÕïÕûîÕôîÕíîÕæîÕßîÕØîÕÑîÕÊîÕÃîÕ¼îÕµîÕ®îÕ§îÕ îÕ™îÕ’îÕ‹îÕ„îÕ}îÕvîÕoîÕhîÕaîÕZîÕSîÕLîÕEîÕ>îÕ7îÕ0îÕ)îÕ"îÕîÕîÕ îÕîÕÿíÕøíÕñíÕêíÕãíÕÜíÕÕíÕÎíÕÇíÕÀíÕ¹íÕ²íÕ«íÕ¤íÕíÕ–íÕíÕˆíÕíÕzíÕsíÕlíÕeíÕ^íÕWíÕPíÕIíÕBíÕ;íÕ4íÕ-íÕ&íÕíÕíÕíÕ íÕíÕüìÕõìÕîìÕçìÕàìÕÙìÕÒìÕËìÕÄìÕ½ìÕ¶ìÕ¯ìÕ¨ìÕ¡ìÕšìÕ“ìÕŒìÕ…ìÕ~ìÕwìÕpìÕiìÕbìÕ[ìÕTìÕMìÕFìÕ?ìÕ8ìÕ1ìÕ*ìÕ#ìÕìÕìÕìÕìÕìÕùëÕòëÕëëÕäëÕÝëÕÖëÕÏëÕÈëÕÁëÕºëÕ³ëÕ¬ëÕ¥ëÕžëÕ—ëÕëÕ‰ëÕ‚ëÕ{ëÕtëÕmëÕfëÕ_ëÕXëÕQëÕJëÕCëÕ<ëÕ5ëÕ.ëÕ'ëÕ ëÕëÕëÕ ëÕëÕýêÕöêÕïêÕèêÕáêÕÚêÕÓêÕÌêÕÅêÕ¾êÕ·êÕ°êÕ©êÕ¢êÕ›êÕ”êÕêÕ†êÕêÕxêÕqêÕjêÕcêÕ\êÕUêÕNêÕGêÕ@êÕ9êÕ2êÕ+êÕ$êÕêÕêÕêÕêÕêÕúéÕóéÕìéÕåéÕÞéÕ×éÕÐéÕÉéÕÂéÕ»éÕ´éÕ­éÕ¦éÕŸéÕ˜éÕ‘éÕŠéÕƒéÕ|éÕuéÕnéÕgéÕ`éÕYéÕRéÕKéÕDéÕ=éÕ6éÕ/éÕ(éÕ!éÕéÕéÕ éÕéÕþèÕ÷èÕðèÕéèÕâèÕÛèÕÔèÕÍèÕÆèÕ¿èÕ¸èÕ±èÕªèÕ£èÕœèÕ•èÕŽèÕ‡èÕ€èÕyèÕrèÕkèÕdèÕ]èÕVèÕOèÕHèÕAèÕ:èÕ3èÕ,èÕ%èÕèÕèÕèÕ èÕèÕûçÕôçÕíçÕæçÕßçÕØçÕÑçÕÊçÕÃçÕ¼çÕµçÕ®çÕ§çÕ çÕ™çÕ’çÕ‹çÕ„çÕ}çÕvçÕoçÕhçÕaçÕZçÕSçÕLçÕEçÕ>çÕ7çÕ0çÕ)çÕ"çÕçÕçÕ çÕçÕÿæÕøæÕñæÕêæÕãæÕÜæÕÕæÕÎæÕÇæÕÀæÕ¹æÕ²æÕ«æÕ¤æÕæÕ–æÕæÕˆæÕæÕzæÕsæÕlæÕeæÕ^æÕWæÕPæÕIæÕBæÕ;æÕ4æÕ-æÕ&æÕæÕæÕæÕ æÕæÕüåÕõåÕîåÕçåÕàåÕÙåÕÒåÕËåÕÄåÕ½åÕ¶åÕ¯åÕ¨åÕ¡åÕšåÕ“åÕŒåÕ…åÕ~åÕwåÕpåÕiåÕbåÕ[åÕTåÕMåÕFåÕ?åÕ8åÕ1åÕ*åÕ#åÕåÕåÕåÕåÕåÕùäÕòäÕëäÕääÕÝäÕÖäÕÏäÕÈäÕÁäÕºäÕ³äÕ¬äÕ¥äÕžäÕ—äÕäÕ‰äÕ‚äÕ{äÕtäÕmäÕfäÕ_äÕXäÕQäÕJäÕCäÕ<äÕ5äÕ.äÕ'äÕ äÕäÕäÕ äÕäÕýãÕöãÕïãÕèãÕáãÕÚãÕÓãÕÌãÕÅãÕ¾ãÕ·ãÕ°ãÕ©ãÕ¢ãÕ›ãÕ”ãÕãÕ†ãÕãÕxãÕqãÕjãÕcãÕ\ãÕUãÕNãÕGãÕ@ãÕ9ãÕ2ãÕ+ãÕ$ãÕãÕãÕãÕãÕãÕúâÕóâÕìâÕåâÕÞâÕ×âÕÐâÕÉâÕÂâÕ»âÕ´âÕ­âÕ¦âÕŸâÕ˜âÕ‘âÕŠâÕƒâÕ|âÕuâÕnâÕgâÕ`âÕYâÕRâÕKâÕDâÕ=âÕ6âÕ/âÕ(âÕ!âÕâÕâÕ âÕâÕþáÕ÷áÕðáÕéáÕâáÕÛáÕÔáÕÍáÕÆáÕ¿áÕ¸áÕ±áÕªáÕ£áÕœáÕ•áÕŽáÕ‡áÕ€áÕyáÕráÕkáÕdáÕ]áÕVáÕOáÕHáÕAáÕ:áÕ3áÕ,áÕ%áÕáÕáÕáÕ áÕáÕûàÕôàÕíàÕæàÕßàÕØàÕÑàÕÊàÕÃàÕ¼àÕµàÕ®àÕ§àÕ àÕ™àÕ’àÕ‹àÕ„àÕ}àÕvàÕoàÕhàÕaàÕZàÕSàÕLàÕEàÕ>àÕ7àÕ0àÕ)àÕ"àÕàÕàÕ àÕàÕÿßÕøßÕñßÕêßÕãßÕÜßÕÕßÕÎßÕÇßÕÀßÕ¹ßÕ²ßÕ«ßÕ¤ßÕßÕ–ßÕßÕˆßÕßÕzßÕsßÕlßÕeßÕ^ßÕWßÕPßÕIßÕBßÕ;ßÕ4ßÕ-ßÕ&ßÕßÕßÕßÕ ßÕßÕüÞÕõÞÕîÞÕçÞÕàÞÕÙÞÕÒÞÕËÞÕÄÞÕ½ÞÕ¶ÞÕ¯ÞÕ¨ÞÕ¡ÞÕšÞÕ“ÞÕŒÞÕ…ÞÕ~ÞÕwÞÕpÞÕiÞÕbÞÕ[ÞÕTÞÕMÞÕFÞÕ?ÞÕ8ÞÕ1ÞÕ*ÞÕ#ÞÕÞÕÞÕÞÕÞÕÞÕùÝÕòÝÕëÝÕäÝÕÝÝÕÖÝÕÏÝÕÈÝÕÁÝÕºÝÕ³ÝÕ¬ÝÕ¥ÝÕžÝÕ—ÝÕÝÕ‰ÝÕ‚ÝÕ{ÝÕtÝÕmÝÕfÝÕ_ÝÕXÝÕQÝÕJÝÕCÝÕ<ÝÕ5ÝÕ.ÝÕ'ÝÕ ÝÕÝÕÝÕ ÝÕÝÕýÜÕöÜÕïÜÕèÜÕáÜÕÚÜÕÓÜÕÌÜÕÅÜÕ¾ÜÕ·ÜÕ°ÜÕ©ÜÕ¢ÜÕ›ÜÕ”ÜÕÜÕ†ÜÕÜÕxÜÕqÜÕjÜÕcÜÕ\ÜÕUÜÕNÜÕGÜÕ@ÜÕ9ÜÕ2ÜÕ+ÜÕ$ÜÕÜÕÜÕÜÕÜÕÜÕúÛÕóÛÕìÛÕåÛÕÞÛÕ×ÛÕÐÛÕÉÛÕÂÛÕ»ÛÕ´ÛÕ­ÛÕ¦ÛÕŸÛÕ˜ÛÕ‘ÛÕŠÛÕƒÛÕ|ÛÕuÛÕnÛÕgÛÕ`ÛÕYÛÕRÛÕKÛÕDÛÕ=ÛÕ6ÛÕ/ÛÕ(ÛÕ!ÛÕÛÕÛÕ ÛÕÛÕþÚÕ÷ÚÕðÚÕéÚÕâÚÕÛÚÕÔÚÕÍÚÕÆÚÕ¿ÚÕ¸ÚÕ±ÚÕªÚÕ£ÚÕœÚÕ•ÚÕŽÚÕ‡ÚÕ€ÚÕyÚÕrÚÕkÚÕdÚÕ]ÚÕVÚÕOÚÕHÚÕAÚÕ:ÚÕ3ÚÕ,ÚÕ%ÚÕÚÕÚÕÚÕ ÚÕÚÕûÙÕôÙÕíÙÕæÙÕßÙÕØÙÕÑÙÕÊÙÕÃÙÕ¼ÙÕµÙÕ®ÙÕ§ÙÕ ÙÕ™ÙÕ’ÙÕ‹ÙÕ„ÙÕ}ÙÕvÙÕoÙÕhÙÕaÙÕZÙÕSÙÕLÙÕEÙÕ>ÙÕ7ÙÕ0ÙÕ)ÙÕ"ÙÕÙÕÙÕ ÙÕÙÕÿØÕøØÕñØÕêØÕãØÕÜØÕÕØÕÎØÕÇØÕÀØÕ¹ØÕ²ØÕ«ØÕ¤ØÕØÕ–ØÕØÕˆØÕØÕzØÕsØÕlØÕeØÕ^ØÕWØÕPØÕIØÕBØÕ;ØÕ4ØÕ-ØÕ&ØÕØÕØÕØÕ ØÕØÕü×Õõ×Õî×Õç×Õà×ÕÙ×ÕÒ×ÕË×ÕÄ×Õ½×Õ¶×Õ¯×Õ¨×Õ¡×Õš×Õ“×ÕŒ×Õ…×Õ~×Õw×Õp×Õi×Õb×Õ[×ÕT×ÕM×ÕF×Õ?×Õ8×Õ1×Õ*×Õ#×Õ×Õ×Õ×Õ×Õ×ÕùÖÕòÖÕëÖÕäÖÕÝÖÕÖÖÕÏÖÕÈÖÕÁÖÕºÖÕ³ÖÕ¬ÖÕ¥ÖÕžÖÕ—ÖÕÖÕ‰ÖÕ‚ÖÕ{ÖÕtÖÕmÖÕfÖÕ_ÖÕXÖÕQÖÕJÖÕCÖÕ<ÖÕ5ÖÕ.ÖÕ'ÖÕ ÖÕÖÕÖÕ ÖÕÖÕýÕÕöÕÕïÕÕèÕÕáÕÕÚÕÕÓÕÕÌÕÕÅÕÕ¾ÕÕ·ÕÕ°ÕÕ©ÕÕ¢ÕÕ›ÕÕ”ÕÕÕÕ†ÕÕÕÕxÕÕqÕÕjÕÕcÕÕ\ÕÕUÕÕNÕÕGÕÕ@ÕÕ9ÕÕ2ÕÕ+ÕÕ$ÕÕÕÕÕÕÕÕÕÕÕÕúÔÕóÔÕìÔÕåÔÕÞÔÕ×ÔÕÐÔÕÉÔÕÂÔÕ»ÔÕ´ÔÕ­ÔÕ¦ÔÕŸÔÕ˜ÔÕ‘ÔÕŠÔÕƒÔÕ|ÔÕuÔÕnÔÕgÔÕ`ÔÕYÔÕRÔÕKÔÕDÔÕ=ÔÕ6ÔÕ/ÔÕ(ÔÕ!ÔÕÔÕÔÕ ÔÕÔÕþÓÕ÷ÓÕðÓÕéÓÕâÓÕÛÓÕÔÓÕÍÓÕÆÓÕ¿ÓÕ¸ÓÕ±ÓÕªÓÕ£ÓÕœÓÕ•ÓÕŽÓÕ‡ÓÕ€ÓÕyÓÕrÓÕkÓÕdÓÕ]ÓÕVÓÕOÓÕHÓÕAÓÕ:ÓÕ3ÓÕ,ÓÕ%ÓÕÓÕÓÕÓÕ ÓÕÓÕûÒÕôÒÕíÒÕæÒÕßÒÕØÒÕÑÒÕÊÒÕÃÒÕ¼ÒÕµÒÕ®ÒÕ§ÒÕ ÒÕ™ÒÕ’ÒÕ‹ÒÕ„ÒÕ}ÒÕvÒÕoÒÕhÒÕaÒÕZÒÕSÒÕLÒÕEÒÕ>ÒÕ7ÒÕ0ÒÕ)ÒÕ"ÒÕÒÕÒÕ ÒÕÒÕÿÑÕøÑÕñÑÕêÑÕãÑÕÜÑÕÕÑÕÎÑÕÇÑÕÀÑÕ¹ÑÕ²ÑÕ«ÑÕ¤ÑÕÑÕ–ÑÕÑÕˆÑÕÑÕzÑÕsÑÕlÑÕeÑÕ^ÑÕWÑÕPÑÕIÑÕBÑÕ;ÑÕ4ÑÕ-ÑÕ&ÑÕÑÕÑÕÑÕ ÑÕÑÕüÐÕõÐÕîÐÕçÐÕàÐÕÙÐÕÒÐÕËÐÕÄÐÕ½ÐÕ¶ÐÕ¯ÐÕ¨ÐÕ¡ÐÕšÐÕ“ÐÕŒÐÕ…ÐÕ~ÐÕwÐÕpÐÕiÐÕbÐÕ[ÐÕTÐÕMÐÕFÐÕ?ÐÕ8ÐÕ1ÐÕ*ÐÕ#ÐÕÐÕÐÕÐÕÐÕÐÕùÏÕòÏÕëÏÕäÏÕÝÏÕÖÏÕÏÏÕÈÏÕÁÏÕºÏÕ³ÏÕ¬ÏÕ¥ÏÕžÏÕ—ÏÕÏÕ‰ÏÕ‚ÏÕ{ÏÕtÏÕmÏÕfÏÕ_ÏÕXÏÕQÏÕJÏÕCÏÕ<ÏÕ5ÏÕ.ÏÕ'ÏÕ ÏÕÏÕÏÕ ÏÕÏÕýÎÕöÎÕïÎÕèÎÕáÎÕÚÎÕÓÎÕÌÎÕÅÎÕ¾ÎÕ·ÎÕ°ÎÕ©ÎÕ¢ÎÕ›ÎÕ”ÎÕÎÕ†ÎÕÎÕxÎÕqÎÕjÎÕcÎÕ\ÎÕUÎÕNÎÕGÎÕ@ÎÕ9ÎÕ2ÎÕ+ÎÕ$ÎÕÎÕÎÕÎÕÎÕÎÕúÍÕóÍÕìÍÕåÍÕÞÍÕ×ÍÕÐÍÕÉÍÕÂÍÕ»ÍÕ´ÍÕ­ÍÕ¦ÍÕŸÍÕ˜ÍÕ‘ÍÕŠÍÕƒÍÕ|ÍÕuÍÕnÍÕgÍÕ`ÍÕYÍÕRÍÕKÍÕDÍÕ=ÍÕ6ÍÕ/ÍÕ(ÍÕ!ÍÕÍÕÍÕ ÍÕÍÕþÌÕ÷ÌÕðÌÕéÌÕâÌÕÛÌÕÔÌÕÍÌÕÆÌÕ¿ÌÕ¸ÌÕ±ÌÕªÌÕ£ÌÕœÌÕ•ÌÕŽÌÕ‡ÌÕ€ÌÕyÌÕrÌÕkÌÕdÌÕ]ÌÕVÌÕOÌÕHÌÕAÌÕ:ÌÕ3ÌÕ,ÌÕ%ÌÕÌÕÌÕÌÕ ÌÕÌÕûËÕôËÕíËÕæËÕßËÕØËÕÑËÕÊËÕÃËÕ¼ËÕµËÕ®ËÕ§ËÕ ËÕ™ËÕ’ËÕ‹ËÕ„ËÕ}ËÕvËÕoËÕhËÕaËÕZËÕSËÕLËÕEËÕ>ËÕ7ËÕ0ËÕ)ËÕ"ËÕËÕËÕ ËÕËÕÿÊÕøÊÕñÊÕêÊÕãÊÕÜÊÕÕÊÕÎÊÕÇÊÕÀÊÕ¹ÊÕ²ÊÕ«ÊÕ¤ÊÕÊÕ–ÊÕÊÕˆÊÕÊÕzÊÕsÊÕlÊÕeÊÕ^ÊÕWÊÕPÊÕIÊÕBÊÕ;ÊÕ4ÊÕ-ÊÕ&ÊÕÊÕÊÕÊÕ ÊÕÊÕüÉÕõÉÕîÉÕçÉÕàÉÕÙÉÕÒÉÕËÉÕÄÉÕ½ÉÕ¶ÉÕ¯ÉÕ¨ÉÕ¡ÉÕšÉÕ“ÉÕŒÉÕ…ÉÕ~ÉÕwÉÕpÉÕiÉÕbÉÕ[ÉÕTÉÕMÉÕFÉÕ?ÉÕ8ÉÕ1ÉÕ*ÉÕ#ÉÕÉÕÉÕÉÕÉÕÉÕùÈÕòÈÕëÈÕäÈÕÝÈÕÖÈÕÏÈÕÈÈÕÁÈÕºÈÕ³ÈÕ¬ÈÕ¥ÈÕžÈÕ—ÈÕÈÕ‰ÈÕ‚ÈÕ{ÈÕtÈÕmÈÕfÈÕ_ÈÕXÈÕQÈÕJÈÕCÈÕ<ÈÕ5ÈÕ.ÈÕ'ÈÕ ÈÕÈÕÈÕ ÈÕÈÕýÇÕöÇÕïÇÕèÇÕáÇÕÚÇÕÓÇÕÌÇÕÅÇÕ¾ÇÕ·ÇÕ°ÇÕ©ÇÕ¢ÇÕ›ÇÕ”ÇÕÇÕ†ÇÕÇÕxÇÕqÇÕjÇÕcÇÕ\ÇÕUÇÕNÇÕGÇÕ@ÇÕ9ÇÕ2ÇÕ+ÇÕ$ÇÕÇÕÇÕÇÕÇÕÇÕúÆÕóÆÕìÆÕåÆÕÞÆÕׯÕÐÆÕÉÆÕÂÆÕ»ÆÕ´ÆÕ­ÆÕ¦ÆÕŸÆÕ˜ÆÕ‘ÆÕŠÆÕƒÆÕ|ÆÕuÆÕnÆÕgÆÕ`ÆÕYÆÕRÆÕKÆÕDÆÕ=ÆÕ6ÆÕ/ÆÕ(ÆÕ!ÆÕÆÕÆÕ ÆÕÆÕþÅÕ÷ÅÕðÅÕéÅÕâÅÕÛÅÕÔÅÕÍÅÕÆÅÕ¿ÅÕ¸ÅÕ±ÅÕªÅÕ£ÅÕœÅÕ•ÅÕŽÅÕ‡ÅÕ€ÅÕyÅÕrÅÕkÅÕdÅÕ]ÅÕVÅÕOÅÕHÅÕAÅÕ:ÅÕ3ÅÕ,ÅÕ%ÅÕÅÕÅÕÅÕ ÅÕÅÕûÄÕôÄÕíÄÕæÄÕßÄÕØÄÕÑÄÕÊÄÕÃÄÕ¼ÄÕµÄÕ®ÄÕ§ÄÕ ÄÕ™ÄÕ’ÄÕ‹ÄÕ„ÄÕ}ÄÕvÄÕoÄÕhÄÕaÄÕZÄÕSÄÕLÄÕEÄÕ>ÄÕ7ÄÕ0ÄÕ)ÄÕ"ÄÕÄÕÄÕ ÄÕÄÕÿÃÕøÃÕñÃÕêÃÕãÃÕÜÃÕÕÃÕÎÃÕÇÃÕÀÃÕ¹ÃÕ²ÃÕ«ÃÕ¤ÃÕÃÕ–ÃÕÃÕˆÃÕÃÕzÃÕsÃÕlÃÕeÃÕ^ÃÕWÃÕPÃÕIÃÕBÃÕ;ÃÕ4ÃÕ-ÃÕ&ÃÕÃÕÃÕÃÕ ÃÕÃÕüÂÕõÂÕîÂÕçÂÕàÂÕÙÂÕÒÂÕËÂÕÄÂÕ½ÂÕ¶ÂÕ¯ÂÕ¨ÂÕ¡ÂÕšÂÕ“ÂÕŒÂÕ…ÂÕ~ÂÕwÂÕpÂÕiÂÕbÂÕ[ÂÕTÂÕMÂÕFÂÕ?ÂÕ8ÂÕ1ÂÕ*ÂÕ#ÂÕÂÕÂÕÂÕÂÕÂÕùÁÕòÁÕëÁÕäÁÕÝÁÕÖÁÕÏÁÕÈÁÕÁÁÕºÁÕ³ÁÕ¬ÁÕ¥ÁÕžÁÕ—ÁÕÁÕ‰ÁÕ‚ÁÕ{ÁÕtÁÕmÁÕfÁÕ_ÁÕXÁÕQÁÕJÁÕCÁÕ<ÁÕ5ÁÕ.ÁÕ'ÁÕ ÁÕÁÕÁÕ ÁÕÁÕýÀÕöÀÕïÀÕèÀÕáÀÕÚÀÕÓÀÕÌÀÕÅÀÕ¾ÀÕ·ÀÕ°ÀÕ©ÀÕ¢ÀÕ›ÀÕ”ÀÕÀÕ†ÀÕÀÕxÀÕqÀÕjÀÕcÀÕ\ÀÕUÀÕNÀÕGÀÕ@ÀÕ9ÀÕ2ÀÕ+ÀÕ$ÀÕÀÕÀÕÀÕÀÕÀÕú¿Õó¿Õì¿Õå¿ÕÞ¿Õ׿ÕпÕɿտջ¿Õ´¿Õ­¿Õ¦¿ÕŸ¿Õ˜¿Õ‘¿ÕŠ¿Õƒ¿Õ|¿Õu¿Õn¿Õg¿Õ`¿ÕY¿ÕR¿ÕK¿ÕD¿Õ=¿Õ6¿Õ/¿Õ(¿Õ!¿Õ¿Õ¿Õ ¿Õ¿Õþ¾Õ÷¾Õð¾Õé¾Õâ¾ÕÛ¾ÕÔ¾Õ;ÕƾÕ¿¾Õ¸¾Õ±¾Õª¾Õ£¾Õœ¾Õ•¾Õ޾Õ‡¾Õ€¾Õy¾Õr¾Õk¾Õd¾Õ]¾ÕV¾ÕO¾ÕH¾ÕA¾Õ:¾Õ3¾Õ,¾Õ%¾Õ¾Õ¾Õ¾Õ ¾Õ¾Õû½Õô½Õí½Õæ½Õß½ÕؽÕѽÕʽÕýÕ¼½Õµ½Õ®½Õ§½Õ ½Õ™½Õ’½Õ‹½Õ„½Õ}½Õv½Õo½Õh½Õa½ÕZ½ÕS½ÕL½ÕE½Õ>½Õ7½Õ0½Õ)½Õ"½Õ½Õ½Õ ½Õ½Õÿ¼Õø¼Õñ¼Õê¼Õã¼ÕܼÕÕ¼ÕμÕǼÕÀ¼Õ¹¼Õ²¼Õ«¼Õ¤¼Õ¼Õ–¼Õ¼Õˆ¼Õ¼Õz¼Õs¼Õl¼Õe¼Õ^¼ÕW¼ÕP¼ÕI¼ÕB¼Õ;¼Õ4¼Õ-¼Õ&¼Õ¼Õ¼Õ¼Õ ¼Õ¼Õü»Õõ»Õî»Õç»Õà»ÕÙ»ÕÒ»ÕË»ÕĻս»Õ¶»Õ¯»Õ¨»Õ¡»Õš»Õ“»ÕŒ»Õ…»Õ~»Õw»Õp»Õi»Õb»Õ[»ÕT»ÕM»ÕF»Õ?»Õ8»Õ1»Õ*»Õ#»Õ»Õ»Õ»Õ»Õ»ÕùºÕòºÕëºÕäºÕݺÕÖºÕϺÕȺÕÁºÕººÕ³ºÕ¬ºÕ¥ºÕžºÕ—ºÕºÕ‰ºÕ‚ºÕ{ºÕtºÕmºÕfºÕ_ºÕXºÕQºÕJºÕCºÕ<ºÕ5ºÕ.ºÕ'ºÕ ºÕºÕºÕ ºÕºÕý¹Õö¹Õï¹Õè¹Õá¹ÕÚ¹ÕÓ¹Õ̹ÕŹÕ¾¹Õ·¹Õ°¹Õ©¹Õ¢¹Õ›¹Õ”¹Õ¹Õ†¹Õ¹Õx¹Õq¹Õj¹Õc¹Õ\¹ÕU¹ÕN¹ÕG¹Õ@¹Õ9¹Õ2¹Õ+¹Õ$¹Õ¹Õ¹Õ¹Õ¹Õ¹Õú¸Õó¸Õì¸Õå¸ÕÞ¸Õ׸ÕиÕɸÕ¸Õ»¸Õ´¸Õ­¸Õ¦¸ÕŸ¸Õ˜¸Õ‘¸ÕЏÕƒ¸Õ|¸Õu¸Õn¸Õg¸Õ`¸ÕY¸ÕR¸ÕK¸ÕD¸Õ=¸Õ6¸Õ/¸Õ(¸Õ!¸Õ¸Õ¸Õ ¸Õ¸Õþ·Õ÷·Õð·Õé·Õâ·ÕÛ·ÕÔ·ÕÍ·ÕÆ·Õ¿·Õ¸·Õ±·Õª·Õ£·Õœ·Õ•·ÕŽ·Õ‡·Õ€·Õy·Õr·Õk·Õd·Õ]·ÕV·ÕO·ÕH·ÕA·Õ:·Õ3·Õ,·Õ%·Õ·Õ·Õ·Õ ·Õ·Õû¶Õô¶Õí¶Õæ¶Õß¶ÕضÕѶÕʶÕöÕ¼¶Õµ¶Õ®¶Õ§¶Õ ¶Õ™¶Õ’¶Õ‹¶Õ„¶Õ}¶Õv¶Õo¶Õh¶Õa¶ÕZ¶ÕS¶ÕL¶ÕE¶Õ>¶Õ7¶Õ0¶Õ)¶Õ"¶Õ¶Õ¶Õ ¶Õ¶ÕÿµÕøµÕñµÕêµÕãµÕܵÕÕµÕεÕǵÕÀµÕ¹µÕ²µÕ«µÕ¤µÕµÕ–µÕµÕˆµÕµÕzµÕsµÕlµÕeµÕ^µÕWµÕPµÕIµÕBµÕ;µÕ4µÕ-µÕ&µÕµÕµÕµÕ µÕµÕü´Õõ´Õî´Õç´Õà´ÕÙ´ÕÒ´ÕË´ÕÄ´Õ½´Õ¶´Õ¯´Õ¨´Õ¡´Õš´Õ“´ÕŒ´Õ…´Õ~´Õw´Õp´Õi´Õb´Õ[´ÕT´ÕM´ÕF´Õ?´Õ8´Õ1´Õ*´Õ#´Õ´Õ´Õ´Õ´Õ´Õù³Õò³Õë³Õä³ÕݳÕÖ³ÕϳÕȳÕÁ³Õº³Õ³³Õ¬³Õ¥³Õž³Õ—³Õ³Õ‰³Õ‚³Õ{³Õt³Õm³Õf³Õ_³ÕX³ÕQ³ÕJ³ÕC³Õ<³Õ5³Õ.³Õ'³Õ ³Õ³Õ³Õ ³Õ³Õý²Õö²Õï²Õè²Õá²ÕÚ²ÕÓ²Õ̲ÕŲÕ¾²Õ·²Õ°²Õ©²Õ¢²Õ›²Õ”²Õ²Õ†²Õ²Õx²Õq²Õj²Õc²Õ\²ÕU²ÕN²ÕG²Õ@²Õ9²Õ2²Õ+²Õ$²Õ²Õ²Õ²Õ²Õ²Õú±Õó±Õì±Õå±ÕÞ±Õ×±ÕбÕɱÕ±Õ»±Õ´±Õ­±Õ¦±ÕŸ±Õ˜±Õ‘±ÕбÕƒ±Õ|±Õu±Õn±Õg±Õ`±ÕY±ÕR±ÕK±ÕD±Õ=±Õ6±Õ/±Õ(±Õ!±Õ±Õ±Õ ±Õ±Õþ°Õ÷°Õð°Õé°Õâ°ÕÛ°ÕÔ°ÕͰÕưÕ¿°Õ¸°Õ±°Õª°Õ£°Õœ°Õ•°ÕްÕ‡°Õ€°Õy°Õr°Õk°Õd°Õ]°ÕV°ÕO°ÕH°ÕA°Õ:°Õ3°Õ,°Õ%°Õ°Õ°Õ°Õ °Õ°Õû¯Õô¯Õí¯Õæ¯Õ߯ÕدÕѯÕʯÕïÕ¼¯Õµ¯Õ®¯Õ§¯Õ ¯Õ™¯Õ’¯Õ‹¯Õ„¯Õ}¯Õv¯Õo¯Õh¯Õa¯ÕZ¯ÕS¯ÕL¯ÕE¯Õ>¯Õ7¯Õ0¯Õ)¯Õ"¯Õ¯Õ¯Õ ¯Õ¯Õÿ®Õø®Õñ®Õê®Õã®ÕÜ®ÕÕ®ÕήÕÇ®ÕÀ®Õ¹®Õ²®Õ«®Õ¤®Õ®Õ–®Õ®Õˆ®Õ®Õz®Õs®Õl®Õe®Õ^®ÕW®ÕP®ÕI®ÕB®Õ;®Õ4®Õ-®Õ&®Õ®Õ®Õ®Õ ®Õ®Õü­Õõ­Õî­Õç­Õà­ÕÙ­ÕÒ­ÕË­ÕÄ­Õ½­Õ¶­Õ¯­Õ¨­Õ¡­Õš­Õ“­ÕŒ­Õ…­Õ~­Õw­Õp­Õi­Õb­Õ[­ÕT­ÕM­ÕF­Õ?­Õ8­Õ1­Õ*­Õ#­Õ­Õ­Õ­Õ­Õ­Õù¬Õò¬Õë¬Õä¬ÕݬÕÖ¬ÕϬÕȬÕÁ¬Õº¬Õ³¬Õ¬¬Õ¥¬Õž¬Õ—¬Õ¬Õ‰¬Õ‚¬Õ{¬Õt¬Õm¬Õf¬Õ_¬ÕX¬ÕQ¬ÕJ¬ÕC¬Õ<¬Õ5¬Õ.¬Õ'¬Õ ¬Õ¬Õ¬Õ ¬Õ¬Õý«Õö«Õï«Õè«Õá«ÕÚ«ÕÓ«ÕÌ«Õūվ«Õ·«Õ°«Õ©«Õ¢«Õ›«Õ”«Õ«Õ†«Õ«Õx«Õq«Õj«Õc«Õ\«ÕU«ÕN«ÕG«Õ@«Õ9«Õ2«Õ+«Õ$«Õ«Õ«Õ«Õ«Õ«ÕúªÕóªÕìªÕåªÕÞªÕתÕЪÕɪÕªÕ»ªÕ´ªÕ­ªÕ¦ªÕŸªÕ˜ªÕ‘ªÕŠªÕƒªÕ|ªÕuªÕnªÕgªÕ`ªÕYªÕRªÕKªÕDªÕ=ªÕ6ªÕ/ªÕ(ªÕ!ªÕªÕªÕ ªÕªÕþ©Õ÷©Õð©Õé©Õâ©ÕÛ©ÕÔ©ÕÍ©ÕÆ©Õ¿©Õ¸©Õ±©Õª©Õ£©Õœ©Õ•©ÕީՇ©Õ€©Õy©Õr©Õk©Õd©Õ]©ÕV©ÕO©ÕH©ÕA©Õ:©Õ3©Õ,©Õ%©Õ©Õ©Õ©Õ ©Õ©Õû¨Õô¨Õí¨Õæ¨ÕߨÕبÕѨÕʨÕèÕ¼¨Õµ¨Õ®¨Õ§¨Õ ¨Õ™¨Õ’¨Õ‹¨Õ„¨Õ}¨Õv¨Õo¨Õh¨Õa¨ÕZ¨ÕS¨ÕL¨ÕE¨Õ>¨Õ7¨Õ0¨Õ)¨Õ"¨Õ¨Õ¨Õ ¨Õ¨Õÿ§Õø§Õñ§Õê§Õã§ÕܧÕÕ§ÕΧÕǧÕÀ§Õ¹§Õ²§Õ«§Õ¤§Õ§Õ–§Õ§Õˆ§Õ§Õz§Õs§Õl§Õe§Õ^§ÕW§ÕP§ÕI§ÕB§Õ;§Õ4§Õ-§Õ&§Õ§Õ§Õ§Õ §Õ§Õü¦Õõ¦Õî¦Õç¦Õà¦ÕÙ¦ÕÒ¦Õ˦ÕĦÕ½¦Õ¶¦Õ¯¦Õ¨¦Õ¡¦Õš¦Õ“¦ÕŒ¦Õ…¦Õ~¦Õw¦Õp¦Õi¦Õb¦Õ[¦ÕT¦ÕM¦ÕF¦Õ?¦Õ8¦Õ1¦Õ*¦Õ#¦Õ¦Õ¦Õ¦Õ¦Õ¦Õù¥Õò¥Õë¥Õä¥ÕÝ¥ÕÖ¥ÕÏ¥ÕÈ¥ÕÁ¥Õº¥Õ³¥Õ¬¥Õ¥¥Õž¥Õ—¥Õ¥Õ‰¥Õ‚¥Õ{¥Õt¥Õm¥Õf¥Õ_¥ÕX¥ÕQ¥ÕJ¥ÕC¥Õ<¥Õ5¥Õ.¥Õ'¥Õ ¥Õ¥Õ¥Õ ¥Õ¥Õý¤Õö¤Õï¤Õè¤Õá¤ÕÚ¤ÕÓ¤Õ̤ÕŤÕ¾¤Õ·¤Õ°¤Õ©¤Õ¢¤Õ›¤Õ”¤Õ¤Õ†¤Õ¤Õx¤Õq¤Õj¤Õc¤Õ\¤ÕU¤ÕN¤ÕG¤Õ@¤Õ9¤Õ2¤Õ+¤Õ$¤Õ¤Õ¤Õ¤Õ¤Õ¤Õú£Õó£Õì£Õå£ÕÞ£Õ×£ÕУÕÉ£Õ£Õ»£Õ´£Õ­£Õ¦£ÕŸ£Õ˜£Õ‘£ÕŠ£Õƒ£Õ|£Õu£Õn£Õg£Õ`£ÕY£ÕR£ÕK£ÕD£Õ=£Õ6£Õ/£Õ(£Õ!£Õ£Õ£Õ £Õ£Õþ¢Õ÷¢Õð¢Õé¢Õâ¢ÕÛ¢ÕÔ¢ÕÍ¢ÕÆ¢Õ¿¢Õ¸¢Õ±¢Õª¢Õ£¢Õœ¢Õ•¢ÕŽ¢Õ‡¢Õ€¢Õy¢Õr¢Õk¢Õd¢Õ]¢ÕV¢ÕO¢ÕH¢ÕA¢Õ:¢Õ3¢Õ,¢Õ%¢Õ¢Õ¢Õ¢Õ ¢Õ¢Õû¡Õô¡Õí¡Õæ¡Õߡը¡ÕÑ¡ÕÊ¡ÕáÕ¼¡Õµ¡Õ®¡Õ§¡Õ ¡Õ™¡Õ’¡Õ‹¡Õ„¡Õ}¡Õv¡Õo¡Õh¡Õa¡ÕZ¡ÕS¡ÕL¡ÕE¡Õ>¡Õ7¡Õ0¡Õ)¡Õ"¡Õ¡Õ¡Õ ¡Õ¡Õÿ Õø Õñ Õê Õã ÕÜ ÕÕ ÕΠÕÇ ÕÀ Õ¹ Õ² Õ« Õ¤ Õ Õ– Õ Õˆ Õ Õz Õs Õl Õe Õ^ ÕW ÕP ÕI ÕB Õ; Õ4 Õ- Õ& Õ Õ Õ Õ  Õ ÕüŸÕõŸÕîŸÕçŸÕàŸÕÙŸÕÒŸÕËŸÕÄŸÕ½ŸÕ¶ŸÕ¯ŸÕ¨ŸÕ¡ŸÕšŸÕ“ŸÕŒŸÕ…ŸÕ~ŸÕwŸÕpŸÕiŸÕbŸÕ[ŸÕTŸÕMŸÕFŸÕ?ŸÕ8ŸÕ1ŸÕ*ŸÕ#ŸÕŸÕŸÕŸÕŸÕŸÕùžÕòžÕëžÕäžÕÝžÕÖžÕÏžÕÈžÕÁžÕºžÕ³žÕ¬žÕ¥žÕžžÕ—žÕžÕ‰žÕ‚žÕ{žÕtžÕmžÕfžÕ_žÕXžÕQžÕJžÕCžÕ<žÕ5žÕ.žÕ'žÕ žÕžÕžÕ žÕžÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúœÕóœÕìœÕåœÕÞœÕלÕМÕɜ՜ջœÕ´œÕ­œÕ¦œÕŸœÕ˜œÕ‘œÕŠœÕƒœÕ|œÕuœÕnœÕgœÕ`œÕYœÕRœÕKœÕDœÕ=œÕ6œÕ/œÕ(œÕ!œÕœÕœÕ œÕœÕþ›Õ÷›Õð›Õé›Õâ›ÕÛ›ÕÔ›ÕÍ›ÕÆ›Õ¿›Õ¸›Õ±›Õª›Õ£›Õœ›Õ•›ÕޛՇ›Õ€›Õy›Õr›Õk›Õd›Õ]›ÕV›ÕO›ÕH›ÕA›Õ:›Õ3›Õ,›Õ%›Õ›Õ›Õ›Õ ›Õ›ÕûšÕôšÕíšÕæšÕßšÕØšÕÑšÕÊšÕÚÕ¼šÕµšÕ®šÕ§šÕ šÕ™šÕ’šÕ‹šÕ„šÕ}šÕvšÕošÕhšÕašÕZšÕSšÕLšÕEšÕ>šÕ7šÕ0šÕ)šÕ"šÕšÕšÕ šÕšÕÿ™Õø™Õñ™Õê™Õã™ÕÜ™ÕÕ™ÕΙÕÇ™ÕÀ™Õ¹™Õ²™Õ«™Õ¤™Õ™Õ–™Õ™Õˆ™Õ™Õz™Õs™Õl™Õe™Õ^™ÕW™ÕP™ÕI™ÕB™Õ;™Õ4™Õ-™Õ&™Õ™Õ™Õ™Õ ™Õ™Õü˜Õõ˜Õî˜Õç˜Õà˜ÕÙ˜ÕÒ˜Õ˘ÕĘÕ½˜Õ¶˜Õ¯˜Õ¨˜Õ¡˜Õš˜Õ“˜ÕŒ˜Õ…˜Õ~˜Õw˜Õp˜Õi˜Õb˜Õ[˜ÕT˜ÕM˜ÕF˜Õ?˜Õ8˜Õ1˜Õ*˜Õ#˜Õ˜Õ˜Õ˜Õ˜Õ˜Õù—Õò—Õë—Õä—ÕÝ—ÕÖ—ÕÏ—ÕÈ—ÕÁ—Õº—Õ³—Õ¬—Õ¥—Õž—Õ——Õ—Õ‰—Õ‚—Õ{—Õt—Õm—Õf—Õ_—ÕX—ÕQ—ÕJ—ÕC—Õ<—Õ5—Õ.—Õ'—Õ —Õ—Õ—Õ —Õ—Õý–Õö–Õï–Õè–Õá–ÕÚ–ÕÓ–ÕÌ–ÕÅ–Õ¾–Õ·–Õ°–Õ©–Õ¢–Õ›–Õ”–Õ–Õ†–Õ–Õx–Õq–Õj–Õc–Õ\–ÕU–ÕN–ÕG–Õ@–Õ9–Õ2–Õ+–Õ$–Õ–Õ–Õ–Õ–Õ–Õú•Õó•Õì•Õå•ÕÞ•ÕוÕЕÕɕՕջ•Õ´•Õ­•Õ¦•ÕŸ•Õ˜•Õ‘•ÕŠ•Õƒ•Õ|•Õu•Õn•Õg•Õ`•ÕY•ÕR•ÕK•ÕD•Õ=•Õ6•Õ/•Õ(•Õ!•Õ•Õ•Õ •Õ•Õþ”Õ÷”Õð”Õé”Õâ”ÕÛ”ÕÔ”ÕÍ”ÕÆ”Õ¿”Õ¸”Õ±”Õª”Õ£”Õœ”Õ•”ÕŽ”Õ‡”Õ€”Õy”Õr”Õk”Õd”Õ]”ÕV”ÕO”ÕH”ÕA”Õ:”Õ3”Õ,”Õ%”Õ”Õ”Õ”Õ ”Õ”Õû“Õô“Õí“Õæ“Õߓը“ÕÑ“ÕÊ“ÕÓÕ¼“Õµ“Õ®“Õ§“Õ “Õ™“Õ’“Õ‹“Õ„“Õ}“Õv“Õo“Õh“Õa“ÕZ“ÕS“ÕL“ÕE“Õ>“Õ7“Õ0“Õ)“Õ"“Õ“Õ“Õ “Õ“Õÿ’Õø’Õñ’Õê’Õã’ÕÜ’ÕÕ’ÕÎ’ÕÇ’ÕÀ’Õ¹’Õ²’Õ«’Õ¤’Õ’Õ–’Õ’Õˆ’Õ’Õz’Õs’Õl’Õe’Õ^’ÕW’ÕP’ÕI’ÕB’Õ;’Õ4’Õ-’Õ&’Õ’Õ’Õ’Õ ’Õ’Õü‘Õõ‘Õî‘Õç‘Õà‘ÕÙ‘ÕÒ‘ÕË‘Õđս‘Õ¶‘Õ¯‘Õ¨‘Õ¡‘Õš‘Õ“‘ÕŒ‘Õ…‘Õ~‘Õw‘Õp‘Õi‘Õb‘Õ[‘ÕT‘ÕM‘ÕF‘Õ?‘Õ8‘Õ1‘Õ*‘Õ#‘Õ‘Õ‘Õ‘Õ‘Õ‘ÕùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúŽÕóŽÕìŽÕåŽÕÞŽÕ׎ÕÐŽÕÉŽÕÂŽÕ»ŽÕ´ŽÕ­ŽÕ¦ŽÕŸŽÕ˜ŽÕ‘ŽÕŠŽÕƒŽÕ|ŽÕuŽÕnŽÕgŽÕ`ŽÕYŽÕRŽÕKŽÕDŽÕ=ŽÕ6ŽÕ/ŽÕ(ŽÕ!ŽÕŽÕŽÕ ŽÕŽÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûŒÕôŒÕíŒÕæŒÕߌÕØŒÕÑŒÕÊŒÕÌռŒÕµŒÕ®ŒÕ§ŒÕ ŒÕ™ŒÕ’ŒÕ‹ŒÕ„ŒÕ}ŒÕvŒÕoŒÕhŒÕaŒÕZŒÕSŒÕLŒÕEŒÕ>ŒÕ7ŒÕ0ŒÕ)ŒÕ"ŒÕŒÕŒÕ ŒÕŒÕÿ‹Õø‹Õñ‹Õê‹Õã‹ÕÜ‹ÕÕ‹Õ΋ÕÇ‹ÕÀ‹Õ¹‹Õ²‹Õ«‹Õ¤‹Õ‹Õ–‹Õ‹Õˆ‹Õ‹Õz‹Õs‹Õl‹Õe‹Õ^‹ÕW‹ÕP‹ÕI‹ÕB‹Õ;‹Õ4‹Õ-‹Õ&‹Õ‹Õ‹Õ‹Õ ‹Õ‹ÕüŠÕõŠÕîŠÕçŠÕàŠÕÙŠÕÒŠÕËŠÕÄŠÕ½ŠÕ¶ŠÕ¯ŠÕ¨ŠÕ¡ŠÕšŠÕ“ŠÕŒŠÕ…ŠÕ~ŠÕwŠÕpŠÕiŠÕbŠÕ[ŠÕTŠÕMŠÕFŠÕ?ŠÕ8ŠÕ1ŠÕ*ŠÕ#ŠÕŠÕŠÕŠÕŠÕŠÕù‰Õò‰Õë‰Õä‰Õ݉ÕÖ‰ÕωÕȉÕÁ‰Õº‰Õ³‰Õ¬‰Õ¥‰Õž‰Õ—‰Õ‰Õ‰‰Õ‚‰Õ{‰Õt‰Õm‰Õf‰Õ_‰ÕX‰ÕQ‰ÕJ‰ÕC‰Õ<‰Õ5‰Õ.‰Õ'‰Õ ‰Õ‰Õ‰Õ ‰Õ‰ÕýˆÕöˆÕïˆÕèˆÕáˆÕÚˆÕÓˆṎÕňÕ¾ˆÕ·ˆÕ°ˆÕ©ˆÕ¢ˆÕ›ˆÕ”ˆÕˆÕ†ˆÕˆÕxˆÕqˆÕjˆÕcˆÕ\ˆÕUˆÕNˆÕGˆÕ@ˆÕ9ˆÕ2ˆÕ+ˆÕ$ˆÕˆÕˆÕˆÕˆÕˆÕú‡Õó‡Õì‡Õå‡ÕÞ‡ÕׇÕЇÕɇÕ‡Õ»‡Õ´‡Õ­‡Õ¦‡ÕŸ‡Õ˜‡Õ‘‡ÕЇÕƒ‡Õ|‡Õu‡Õn‡Õg‡Õ`‡ÕY‡ÕR‡ÕK‡ÕD‡Õ=‡Õ6‡Õ/‡Õ(‡Õ!‡Õ‡Õ‡Õ ‡Õ‡Õþ†Õ÷†Õð†Õé†Õâ†ÕÛ†ÕÔ†Õ͆ÕƆÕ¿†Õ¸†Õ±†Õª†Õ£†Õœ†Õ•†ÕކÕ‡†Õ€†Õy†Õr†Õk†Õd†Õ]†ÕV†ÕO†ÕH†ÕA†Õ:†Õ3†Õ,†Õ%†Õ†Õ†Õ†Õ †Õ†Õû…Õô…Õí…Õæ…Õß…ÕØ…ÕÑ…ÕÊ…ÕÃ…Õ¼…Õµ…Õ®…Õ§…Õ …Õ™…Õ’…Õ‹…Õ„…Õ}…Õv…Õo…Õh…Õa…ÕZ…ÕS…ÕL…ÕE…Õ>…Õ7…Õ0…Õ)…Õ"…Õ…Õ…Õ …Õ…Õÿ„Õø„Õñ„Õê„Õã„ÕÜ„ÕÕ„Õ΄ÕÇ„ÕÀ„Õ¹„Õ²„Õ«„Õ¤„Õ„Õ–„Õ„Õˆ„Õ„Õz„Õs„Õl„Õe„Õ^„ÕW„ÕP„ÕI„ÕB„Õ;„Õ4„Õ-„Õ&„Õ„Õ„Õ„Õ „Õ„ÕüƒÕõƒÕîƒÕçƒÕàƒÕÙƒÕÒƒÕ˃ÕăÕ½ƒÕ¶ƒÕ¯ƒÕ¨ƒÕ¡ƒÕšƒÕ“ƒÕŒƒÕ…ƒÕ~ƒÕwƒÕpƒÕiƒÕbƒÕ[ƒÕTƒÕMƒÕFƒÕ?ƒÕ8ƒÕ1ƒÕ*ƒÕ#ƒÕƒÕƒÕƒÕƒÕƒÕù‚Õò‚Õë‚Õä‚ÕÝ‚ÕÖ‚ÕÏ‚ÕÈ‚ÕÁ‚Õº‚Õ³‚Õ¬‚Õ¥‚Õž‚Õ—‚Õ‚Õ‰‚Õ‚‚Õ{‚Õt‚Õm‚Õf‚Õ_‚ÕX‚ÕQ‚ÕJ‚ÕC‚Õ<‚Õ5‚Õ.‚Õ'‚Õ ‚Õ‚Õ‚Õ ‚Õ‚ÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕú€Õó€Õì€Õå€ÕÞ€Õ×€ÕЀÕÉ€Õ€Õ»€Õ´€Õ­€Õ¦€ÕŸ€Õ˜€Õ‘€ÕŠ€Õƒ€Õ|€Õu€Õn€Õg€Õ`€ÕY€ÕR€ÕK€ÕD€Õ=€Õ6€Õ/€Õ(€Õ!€Õ€Õ€Õ €Õ€ÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕû~Õô~Õí~Õæ~Õß~ÕØ~ÕÑ~ÕÊ~ÕÃ~Õ¼~Õµ~Õ®~Õ§~Õ ~Õ™~Õ’~Õ‹~Õ„~Õ}~Õv~Õo~Õh~Õa~ÕZ~ÕS~ÕL~ÕE~Õ>~Õ7~Õ0~Õ)~Õ"~Õ~Õ~Õ ~Õ~Õÿ}Õø}Õñ}Õê}Õã}ÕÜ}ÕÕ}ÕÎ}ÕÇ}ÕÀ}Õ¹}Õ²}Õ«}Õ¤}Õ}Õ–}Õ}Õˆ}Õ}Õz}Õs}Õl}Õe}Õ^}ÕW}ÕP}ÕI}ÕB}Õ;}Õ4}Õ-}Õ&}Õ}Õ}Õ}Õ }Õ}Õü|Õõ|Õî|Õç|Õà|ÕÙ|ÕÒ|ÕË|ÕÄ|Õ½|Õ¶|Õ¯|Õ¨|Õ¡|Õš|Õ“|ÕŒ|Õ…|Õ~|Õw|Õp|Õi|Õb|Õ[|ÕT|ÕM|ÕF|Õ?|Õ8|Õ1|Õ*|Õ#|Õ|Õ|Õ|Õ|Õ|Õù{Õò{Õë{Õä{ÕÝ{ÕÖ{ÕÏ{ÕÈ{ÕÁ{Õº{Õ³{Õ¬{Õ¥{Õž{Õ—{Õ{Õ‰{Õ‚{Õ{{Õt{Õm{Õf{Õ_{ÕX{ÕQ{ÕJ{ÕC{Õ<{Õ5{Õ.{Õ'{Õ {Õ{Õ{Õ {Õ{ÕýzÕözÕïzÕèzÕázÕÚzÕÓzÕÌzÕÅzÕ¾zÕ·zÕ°zÕ©zÕ¢zÕ›zÕ”zÕzÕ†zÕzÕxzÕqzÕjzÕczÕ\zÕUzÕNzÕGzÕ@zÕ9zÕ2zÕ+zÕ$zÕzÕzÕzÕzÕzÕúyÕóyÕìyÕåyÕÞyÕ×yÕÐyÕÉyÕÂyÕ»yÕ´yÕ­yÕ¦yÕŸyÕ˜yÕ‘yÕŠyÕƒyÕ|yÕuyÕnyÕgyÕ`yÕYyÕRyÕKyÕDyÕ=yÕ6yÕ/yÕ(yÕ!yÕyÕyÕ yÕyÕþxÕ÷xÕðxÕéxÕâxÕÛxÕÔxÕÍxÕÆxÕ¿xÕ¸xÕ±xÕªxÕ£xÕœxÕ•xÕŽxÕ‡xÕ€xÕyxÕrxÕkxÕdxÕ]xÕVxÕOxÕHxÕAxÕ:xÕ3xÕ,xÕ%xÕxÕxÕxÕ xÕxÕûwÕôwÕíwÕæwÕßwÕØwÕÑwÕÊwÕÃwÕ¼wÕµwÕ®wÕ§wÕ wÕ™wÕ’wÕ‹wÕ„wÕ}wÕvwÕowÕhwÕawÕZwÕSwÕLwÕEwÕ>wÕ7wÕ0wÕ)wÕ"wÕwÕwÕ wÕwÕÿvÕøvÕñvÕêvÕãvÕÜvÕÕvÕÎvÕÇvÕÀvÕ¹vÕ²vÕ«vÕ¤vÕvÕ–vÕvÕˆvÕvÕzvÕsvÕlvÕevÕ^vÕWvÕPvÕIvÕBvÕ;vÕ4vÕ-vÕ&vÕvÕvÕvÕ vÕvÕüuÕõuÕîuÕçuÕàuÕÙuÕÒuÕËuÕÄuÕ½uÕ¶uÕ¯uÕ¨uÕ¡uÕšuÕ“uÕŒuÕ…uÕ~uÕwuÕpuÕiuÕbuÕ[uÕTuÕMuÕFuÕ?uÕ8uÕ1uÕ*uÕ#uÕuÕuÕuÕuÕuÕùtÕòtÕëtÕätÕÝtÕÖtÕÏtÕÈtÕÁtÕºtÕ³tÕ¬tÕ¥tÕžtÕ—tÕtÕ‰tÕ‚tÕ{tÕttÕmtÕftÕ_tÕXtÕQtÕJtÕCtÕpÕ7pÕ0pÕ)pÕ"pÕpÕpÕ pÕpÕÿoÕøoÕñoÕêoÕãoÕÜoÕÕoÕÎoÕÇoÕÀoÕ¹oÕ²oÕ«oÕ¤oÕoÕ–oÕoÕˆoÕoÕzoÕsoÕloÕeoÕ^oÕWoÕPoÕIoÕBoÕ;oÕ4oÕ-oÕ&oÕoÕoÕoÕ oÕoÕünÕõnÕînÕçnÕànÕÙnÕÒnÕËnÕÄnÕ½nÕ¶nÕ¯nÕ¨nÕ¡nÕšnÕ“nÕŒnÕ…nÕ~nÕwnÕpnÕinÕbnÕ[nÕTnÕMnÕFnÕ?nÕ8nÕ1nÕ*nÕ#nÕnÕnÕnÕnÕnÕùmÕòmÕëmÕämÕÝmÕÖmÕÏmÕÈmÕÁmÕºmÕ³mÕ¬mÕ¥mÕžmÕ—mÕmÕ‰mÕ‚mÕ{mÕtmÕmmÕfmÕ_mÕXmÕQmÕJmÕCmÕiÕ7iÕ0iÕ)iÕ"iÕiÕiÕ iÕiÕÿhÕøhÕñhÕêhÕãhÕÜhÕÕhÕÎhÕÇhÕÀhÕ¹hÕ²hÕ«hÕ¤hÕhÕ–hÕhÕˆhÕhÕzhÕshÕlhÕehÕ^hÕWhÕPhÕIhÕBhÕ;hÕ4hÕ-hÕ&hÕhÕhÕhÕ hÕhÕügÕõgÕîgÕçgÕàgÕÙgÕÒgÕËgÕÄgÕ½gÕ¶gÕ¯gÕ¨gÕ¡gÕšgÕ“gÕŒgÕ…gÕ~gÕwgÕpgÕigÕbgÕ[gÕTgÕMgÕFgÕ?gÕ8gÕ1gÕ*gÕ#gÕgÕgÕgÕgÕgÕùfÕòfÕëfÕäfÕÝfÕÖfÕÏfÕÈfÕÁfÕºfÕ³fÕ¬fÕ¥fÕžfÕ—fÕfÕ‰fÕ‚fÕ{fÕtfÕmfÕffÕ_fÕXfÕQfÕJfÕCfÕbÕ7bÕ0bÕ)bÕ"bÕbÕbÕ bÕbÕÿaÕøaÕñaÕêaÕãaÕÜaÕÕaÕÎaÕÇaÕÀaÕ¹aÕ²aÕ«aÕ¤aÕaÕ–aÕaÕˆaÕaÕzaÕsaÕlaÕeaÕ^aÕWaÕPaÕIaÕBaÕ;aÕ4aÕ-aÕ&aÕaÕaÕaÕ aÕaÕü`Õõ`Õî`Õç`Õà`ÕÙ`ÕÒ`ÕË`ÕÄ`Õ½`Õ¶`Õ¯`Õ¨`Õ¡`Õš`Õ“`ÕŒ`Õ…`Õ~`Õw`Õp`Õi`Õb`Õ[`ÕT`ÕM`ÕF`Õ?`Õ8`Õ1`Õ*`Õ#`Õ`Õ`Õ`Õ`Õ`Õù_Õò_Õë_Õä_ÕÝ_ÕÖ_ÕÏ_ÕÈ_ÕÁ_Õº_Õ³_Õ¬_Õ¥_Õž_Õ—_Õ_Õ‰_Õ‚_Õ{_Õt_Õm_Õf_Õ__ÕX_ÕQ_ÕJ_ÕC_Õ<_Õ5_Õ._Õ'_Õ _Õ_Õ_Õ _Õ_Õý^Õö^Õï^Õè^Õá^ÕÚ^ÕÓ^ÕÌ^ÕÅ^Õ¾^Õ·^Õ°^Õ©^Õ¢^Õ›^Õ”^Õ^Õ†^Õ^Õx^Õq^Õj^Õc^Õ\^ÕU^ÕN^ÕG^Õ@^Õ9^Õ2^Õ+^Õ$^Õ^Õ^Õ^Õ^Õ^Õú]Õó]Õì]Õå]ÕÞ]Õ×]ÕÐ]ÕÉ]ÕÂ]Õ»]Õ´]Õ­]Õ¦]ÕŸ]Õ˜]Õ‘]ÕŠ]Õƒ]Õ|]Õu]Õn]Õg]Õ`]ÕY]ÕR]ÕK]ÕD]Õ=]Õ6]Õ/]Õ(]Õ!]Õ]Õ]Õ ]Õ]Õþ\Õ÷\Õð\Õé\Õâ\ÕÛ\ÕÔ\ÕÍ\ÕÆ\Õ¿\Õ¸\Õ±\Õª\Õ£\Õœ\Õ•\ÕŽ\Õ‡\Õ€\Õy\Õr\Õk\Õd\Õ]\ÕV\ÕO\ÕH\ÕA\Õ:\Õ3\Õ,\Õ%\Õ\Õ\Õ\Õ \Õ\Õû[Õô[Õí[Õæ[Õß[ÕØ[ÕÑ[ÕÊ[ÕÃ[Õ¼[Õµ[Õ®[Õ§[Õ [Õ™[Õ’[Õ‹[Õ„[Õ}[Õv[Õo[Õh[Õa[ÕZ[ÕS[ÕL[ÕE[Õ>[Õ7[Õ0[Õ)[Õ"[Õ[Õ[Õ [Õ[ÕÿZÕøZÕñZÕêZÕãZÕÜZÕÕZÕÎZÕÇZÕÀZÕ¹ZÕ²ZÕ«ZÕ¤ZÕZÕ–ZÕZÕˆZÕZÕzZÕsZÕlZÕeZÕ^ZÕWZÕPZÕIZÕBZÕ;ZÕ4ZÕ-ZÕ&ZÕZÕZÕZÕ ZÕZÕüYÕõYÕîYÕçYÕàYÕÙYÕÒYÕËYÕÄYÕ½YÕ¶YÕ¯YÕ¨YÕ¡YÕšYÕ“YÕŒYÕ…YÕ~YÕwYÕpYÕiYÕbYÕ[YÕTYÕMYÕFYÕ?YÕ8YÕ1YÕ*YÕ#YÕYÕYÕYÕYÕYÕùXÕòXÕëXÕäXÕÝXÕÖXÕÏXÕÈXÕÁXÕºXÕ³XÕ¬XÕ¥XÕžXÕ—XÕXÕ‰XÕ‚XÕ{XÕtXÕmXÕfXÕ_XÕXXÕQXÕJXÕCXÕTÕ7TÕ0TÕ)TÕ"TÕTÕTÕ TÕTÕÿSÕøSÕñSÕêSÕãSÕÜSÕÕSÕÎSÕÇSÕÀSÕ¹SÕ²SÕ«SÕ¤SÕSÕ–SÕSÕˆSÕSÕzSÕsSÕlSÕeSÕ^SÕWSÕPSÕISÕBSÕ;SÕ4SÕ-SÕ&SÕSÕSÕSÕ SÕSÕüRÕõRÕîRÕçRÕàRÕÙRÕÒRÕËRÕÄRÕ½RÕ¶RÕ¯RÕ¨RÕ¡RÕšRÕ“RÕŒRÕ…RÕ~RÕwRÕpRÕiRÕbRÕ[RÕTRÕMRÕFRÕ?RÕ8RÕ1RÕ*RÕ#RÕRÕRÕRÕRÕRÕùQÕòQÕëQÕäQÕÝQÕÖQÕÏQÕÈQÕÁQÕºQÕ³QÕ¬QÕ¥QÕžQÕ—QÕQÕ‰QÕ‚QÕ{QÕtQÕmQÕfQÕ_QÕXQÕQQÕJQÕCQÕMÕ7MÕ0MÕ)MÕ"MÕMÕMÕ MÕMÕÿLÕøLÕñLÕêLÕãLÕÜLÕÕLÕÎLÕÇLÕÀLÕ¹LÕ²LÕ«LÕ¤LÕLÕ–LÕLÕˆLÕLÕzLÕsLÕlLÕeLÕ^LÕWLÕPLÕILÕBLÕ;LÕ4LÕ-LÕ&LÕLÕLÕLÕ LÕLÕüKÕõKÕîKÕçKÕàKÕÙKÕÒKÕËKÕÄKÕ½KÕ¶KÕ¯KÕ¨KÕ¡KÕšKÕ“KÕŒKÕ…KÕ~KÕwKÕpKÕiKÕbKÕ[KÕTKÕMKÕFKÕ?KÕ8KÕ1KÕ*KÕ#KÕKÕKÕKÕKÕKÕùJÕòJÕëJÕäJÕÝJÕÖJÕÏJÕÈJÕÁJÕºJÕ³JÕ¬JÕ¥JÕžJÕ—JÕJÕ‰JÕ‚JÕ{JÕtJÕmJÕfJÕ_JÕXJÕQJÕJJÕCJÕFÕ7FÕ0FÕ)FÕ"FÕFÕFÕ FÕFÕÿEÕøEÕñEÕêEÕãEÕÜEÕÕEÕÎEÕÇEÕÀEÕ¹EÕ²EÕ«EÕ¤EÕEÕ–EÕEÕˆEÕEÕzEÕsEÕlEÕeEÕ^EÕWEÕPEÕIEÕBEÕ;EÕ4EÕ-EÕ&EÕEÕEÕEÕ EÕEÕüDÕõDÕîDÕçDÕàDÕÙDÕÒDÕËDÕÄDÕ½DÕ¶DÕ¯DÕ¨DÕ¡DÕšDÕ“DÕŒDÕ…DÕ~DÕwDÕpDÕiDÕbDÕ[DÕTDÕMDÕFDÕ?DÕ8DÕ1DÕ*DÕ#DÕDÕDÕDÕDÕDÕùCÕòCÕëCÕäCÕÝCÕÖCÕÏCÕÈCÕÁCÕºCÕ³CÕ¬CÕ¥CÕžCÕ—CÕCÕ‰CÕ‚CÕ{CÕtCÕmCÕfCÕ_CÕXCÕQCÕJCÕCCÕ?Õ7?Õ0?Õ)?Õ"?Õ?Õ?Õ ?Õ?Õÿ>Õø>Õñ>Õê>Õã>ÕÜ>ÕÕ>ÕÎ>ÕÇ>ÕÀ>Õ¹>Õ²>Õ«>Õ¤>Õ>Õ–>Õ>Õˆ>Õ>Õz>Õs>Õl>Õe>Õ^>ÕW>ÕP>ÕI>ÕB>Õ;>Õ4>Õ->Õ&>Õ>Õ>Õ>Õ >Õ>Õü=Õõ=Õî=Õç=Õà=ÕÙ=ÕÒ=ÕË=ÕÄ=Õ½=Õ¶=Õ¯=Õ¨=Õ¡=Õš=Õ“=ÕŒ=Õ…=Õ~=Õw=Õp=Õi=Õb=Õ[=ÕT=ÕM=ÕF=Õ?=Õ8=Õ1=Õ*=Õ#=Õ=Õ=Õ=Õ=Õ=Õù<Õò<Õë<Õä<ÕÝ<ÕÖ<ÕÏ<ÕÈ<ÕÁ<Õº<Õ³<Õ¬<Õ¥<Õž<Õ—<Õ<Õ‰<Õ‚<Õ{<Õt<Õm<Õf<Õ_<ÕX<ÕQ<ÕJ<ÕC<Õ<<Õ5<Õ.<Õ'<Õ <Õ<Õ<Õ <Õ<Õý;Õö;Õï;Õè;Õá;ÕÚ;ÕÓ;ÕÌ;ÕÅ;Õ¾;Õ·;Õ°;Õ©;Õ¢;Õ›;Õ”;Õ;Õ†;Õ;Õx;Õq;Õj;Õc;Õ\;ÕU;ÕN;ÕG;Õ@;Õ9;Õ2;Õ+;Õ$;Õ;Õ;Õ;Õ;Õ;Õú:Õó:Õì:Õå:ÕÞ:Õ×:ÕÐ:ÕÉ:ÕÂ:Õ»:Õ´:Õ­:Õ¦:ÕŸ:Õ˜:Õ‘:ÕŠ:Õƒ:Õ|:Õu:Õn:Õg:Õ`:ÕY:ÕR:ÕK:ÕD:Õ=:Õ6:Õ/:Õ(:Õ!:Õ:Õ:Õ :Õ:Õþ9Õ÷9Õð9Õé9Õâ9ÕÛ9ÕÔ9ÕÍ9ÕÆ9Õ¿9Õ¸9Õ±9Õª9Õ£9Õœ9Õ•9ÕŽ9Õ‡9Õ€9Õy9Õr9Õk9Õd9Õ]9ÕV9ÕO9ÕH9ÕA9Õ:9Õ39Õ,9Õ%9Õ9Õ9Õ9Õ 9Õ9Õû8Õô8Õí8Õæ8Õß8ÕØ8ÕÑ8ÕÊ8ÕÃ8Õ¼8Õµ8Õ®8Õ§8Õ 8Õ™8Õ’8Õ‹8Õ„8Õ}8Õv8Õo8Õh8Õa8ÕZ8ÕS8ÕL8ÕE8Õ>8Õ78Õ08Õ)8Õ"8Õ8Õ8Õ 8Õ8Õÿ7Õø7Õñ7Õê7Õã7ÕÜ7ÕÕ7ÕÎ7ÕÇ7ÕÀ7Õ¹7Õ²7Õ«7Õ¤7Õ7Õ–7Õ7Õˆ7Õ7Õz7Õs7Õl7Õe7Õ^7ÕW7ÕP7ÕI7ÕB7Õ;7Õ47Õ-7Õ&7Õ7Õ7Õ7Õ 7Õ7Õü6Õõ6Õî6Õç6Õà6ÕÙ6ÕÒ6ÕË6ÕÄ6Õ½6Õ¶6Õ¯6Õ¨6Õ¡6Õš6Õ“6ÕŒ6Õ…6Õ~6Õw6Õp6Õi6Õb6Õ[6ÕT6ÕM6ÕF6Õ?6Õ86Õ16Õ*6Õ#6Õ6Õ6Õ6Õ6Õ6Õù5Õò5Õë5Õä5ÕÝ5ÕÖ5ÕÏ5ÕÈ5ÕÁ5Õº5Õ³5Õ¬5Õ¥5Õž5Õ—5Õ5Õ‰5Õ‚5Õ{5Õt5Õm5Õf5Õ_5ÕX5ÕQ5ÕJ5ÕC5Õ<5Õ55Õ.5Õ'5Õ 5Õ5Õ5Õ 5Õ5Õý4Õö4Õï4Õè4Õá4ÕÚ4ÕÓ4ÕÌ4ÕÅ4Õ¾4Õ·4Õ°4Õ©4Õ¢4Õ›4Õ”4Õ4Õ†4Õ4Õx4Õq4Õj4Õc4Õ\4ÕU4ÕN4ÕG4Õ@4Õ94Õ24Õ+4Õ$4Õ4Õ4Õ4Õ4Õ4Õú3Õó3Õì3Õå3ÕÞ3Õ×3ÕÐ3ÕÉ3ÕÂ3Õ»3Õ´3Õ­3Õ¦3ÕŸ3Õ˜3Õ‘3ÕŠ3Õƒ3Õ|3Õu3Õn3Õg3Õ`3ÕY3ÕR3ÕK3ÕD3Õ=3Õ63Õ/3Õ(3Õ!3Õ3Õ3Õ 3Õ3Õþ2Õ÷2Õð2Õé2Õâ2ÕÛ2ÕÔ2ÕÍ2ÕÆ2Õ¿2Õ¸2Õ±2Õª2Õ£2Õœ2Õ•2ÕŽ2Õ‡2Õ€2Õy2Õr2Õk2Õd2Õ]2ÕV2ÕO2ÕH2ÕA2Õ:2Õ32Õ,2Õ%2Õ2Õ2Õ2Õ 2Õ2Õû1Õô1Õí1Õæ1Õß1ÕØ1ÕÑ1ÕÊ1ÕÃ1Õ¼1Õµ1Õ®1Õ§1Õ 1Õ™1Õ’1Õ‹1Õ„1Õ}1Õv1Õo1Õh1Õa1ÕZ1ÕS1ÕL1ÕE1Õ>1Õ71Õ01Õ)1Õ"1Õ1Õ1Õ 1Õ1Õÿ0Õø0Õñ0Õê0Õã0ÕÜ0ÕÕ0ÕÎ0ÕÇ0ÕÀ0Õ¹0Õ²0Õ«0Õ¤0Õ0Õ–0Õ0Õˆ0Õ0Õz0Õs0Õl0Õe0Õ^0ÕW0ÕP0ÕI0ÕB0Õ;0Õ40Õ-0Õ&0Õ0Õ0Õ0Õ 0Õ0Õü/Õõ/Õî/Õç/Õà/ÕÙ/ÕÒ/ÕË/ÕÄ/Õ½/Õ¶/Õ¯/Õ¨/Õ¡/Õš/Õ“/ÕŒ/Õ…/Õ~/Õw/Õp/Õi/Õb/Õ[/ÕT/ÕM/ÕF/Õ?/Õ8/Õ1/Õ*/Õ#/Õ/Õ/Õ/Õ/Õ/Õù.Õò.Õë.Õä.ÕÝ.ÕÖ.ÕÏ.ÕÈ.ÕÁ.Õº.Õ³.Õ¬.Õ¥.Õž.Õ—.Õ.Õ‰.Õ‚.Õ{.Õt.Õm.Õf.Õ_.ÕX.ÕQ.ÕJ.ÕC.Õ<.Õ5.Õ..Õ'.Õ .Õ.Õ.Õ .Õ.Õý-Õö-Õï-Õè-Õá-ÕÚ-ÕÓ-ÕÌ-ÕÅ-Õ¾-Õ·-Õ°-Õ©-Õ¢-Õ›-Õ”-Õ-Õ†-Õ-Õx-Õq-Õj-Õc-Õ\-ÕU-ÕN-ÕG-Õ@-Õ9-Õ2-Õ+-Õ$-Õ-Õ-Õ-Õ-Õ-Õú,Õó,Õì,Õå,ÕÞ,Õ×,ÕÐ,ÕÉ,ÕÂ,Õ»,Õ´,Õ­,Õ¦,ÕŸ,Õ˜,Õ‘,ÕŠ,Õƒ,Õ|,Õu,Õn,Õg,Õ`,ÕY,ÕR,ÕK,ÕD,Õ=,Õ6,Õ/,Õ(,Õ!,Õ,Õ,Õ ,Õ,Õþ+Õ÷+Õð+Õé+Õâ+ÕÛ+ÕÔ+ÕÍ+ÕÆ+Õ¿+Õ¸+Õ±+Õª+Õ£+Õœ+Õ•+ÕŽ+Õ‡+Õ€+Õy+Õr+Õk+Õd+Õ]+ÕV+ÕO+ÕH+ÕA+Õ:+Õ3+Õ,+Õ%+Õ+Õ+Õ+Õ +Õ+Õû*Õô*Õí*Õæ*Õß*ÕØ*ÕÑ*ÕÊ*ÕÃ*Õ¼*Õµ*Õ®*Õ§*Õ *Õ™*Õ’*Õ‹*Õ„*Õ}*Õv*Õo*Õh*Õa*ÕZ*ÕS*ÕL*ÕE*Õ>*Õ7*Õ0*Õ)*Õ"*Õ*Õ*Õ *Õ*Õÿ)Õø)Õñ)Õê)Õã)ÕÜ)ÕÕ)ÕÎ)ÕÇ)ÕÀ)Õ¹)Õ²)Õ«)Õ¤)Õ)Õ–)Õ)Õˆ)Õ)Õz)Õs)Õl)Õe)Õ^)ÕW)ÕP)ÕI)ÕB)Õ;)Õ4)Õ-)Õ&)Õ)Õ)Õ)Õ )Õ)Õü(Õõ(Õî(Õç(Õà(ÕÙ(ÕÒ(ÕË(ÕÄ(Õ½(Õ¶(Õ¯(Õ¨(Õ¡(Õš(Õ“(ÕŒ(Õ…(Õ~(Õw(Õp(Õi(Õb(Õ[(ÕT(ÕM(ÕF(Õ?(Õ8(Õ1(Õ*(Õ#(Õ(Õ(Õ(Õ(Õ(Õù'Õò'Õë'Õä'ÕÝ'ÕÖ'ÕÏ'ÕÈ'ÕÁ'Õº'Õ³'Õ¬'Õ¥'Õž'Õ—'Õ'Õ‰'Õ‚'Õ{'Õt'Õm'Õf'Õ_'ÕX'ÕQ'ÕJ'ÕC'Õ<'Õ5'Õ.'Õ''Õ 'Õ'Õ'Õ 'Õ'Õý&Õö&Õï&Õè&Õá&ÕÚ&ÕÓ&ÕÌ&ÕÅ&Õ¾&Õ·&Õ°&Õ©&Õ¢&Õ›&Õ”&Õ&Õ†&Õ&Õx&Õq&Õj&Õc&Õ\&ÕU&ÕN&ÕG&Õ@&Õ9&Õ2&Õ+&Õ$&Õ&Õ&Õ&Õ&Õ&Õú%Õó%Õì%Õå%ÕÞ%Õ×%ÕÐ%ÕÉ%ÕÂ%Õ»%Õ´%Õ­%Õ¦%ÕŸ%Õ˜%Õ‘%ÕŠ%Õƒ%Õ|%Õu%Õn%Õg%Õ`%ÕY%ÕR%ÕK%ÕD%Õ=%Õ6%Õ/%Õ(%Õ!%Õ%Õ%Õ %Õ%Õþ$Õ÷$Õð$Õé$Õâ$ÕÛ$ÕÔ$ÕÍ$ÕÆ$Õ¿$Õ¸$Õ±$Õª$Õ£$Õœ$Õ•$ÕŽ$Õ‡$Õ€$Õy$Õr$Õk$Õd$Õ]$ÕV$ÕO$ÕH$ÕA$Õ:$Õ3$Õ,$Õ%$Õ$Õ$Õ$Õ $Õ$Õû#Õô#Õí#Õæ#Õß#ÕØ#ÕÑ#ÕÊ#ÕÃ#Õ¼#Õµ#Õ®#Õ§#Õ #Õ™#Õ’#Õ‹#Õ„#Õ}#Õv#Õo#Õh#Õa#ÕZ#ÕS#ÕL#ÕE#Õ>#Õ7#Õ0#Õ)#Õ"#Õ#Õ#Õ #Õ#Õÿ"Õø"Õñ"Õê"Õã"ÕÜ"ÕÕ"ÕÎ"ÕÇ"ÕÀ"Õ¹"Õ²"Õ«"Õ¤"Õ"Õ–"Õ"Õˆ"Õ"Õz"Õs"Õl"Õe"Õ^"ÕW"ÕP"ÕI"ÕB"Õ;"Õ4"Õ-"Õ&"Õ"Õ"Õ"Õ "Õ"Õü!Õõ!Õî!Õç!Õà!ÕÙ!ÕÒ!ÕË!ÕÄ!Õ½!Õ¶!Õ¯!Õ¨!Õ¡!Õš!Õ“!ÕŒ!Õ…!Õ~!Õw!Õp!Õi!Õb!Õ[!ÕT!ÕM!ÕF!Õ?!Õ8!Õ1!Õ*!Õ#!Õ!Õ!Õ!Õ!Õ!Õù Õò Õë Õä ÕÝ ÕÖ ÕÏ ÕÈ ÕÁ Õº Õ³ Õ¬ Õ¥ Õž Õ— Õ Õ‰ Õ‚ Õ{ Õt Õm Õf Õ_ ÕX ÕQ ÕJ ÕC Õ< Õ5 Õ. Õ' Õ Õ Õ Õ Õ ÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿ Õø Õñ Õê Õã ÕÜ ÕÕ ÕÎ ÕÇ ÕÀ Õ¹ Õ² Õ« Õ¤ Õ Õ– Õ Õˆ Õ Õz Õs Õl Õe Õ^ ÕW ÕP ÕI ÕB Õ; Õ4 Õ- Õ& Õ Õ Õ Õ Õ Õü Õõ Õî Õç Õà ÕÙ ÕÒ ÕË ÕÄ Õ½ Õ¶ Õ¯ Õ¨ Õ¡ Õš Õ“ ÕŒ Õ… Õ~ Õw Õp Õi Õb Õ[ ÕT ÕM ÕF Õ? Õ8 Õ1 Õ* Õ# Õ Õ Õ Õ Õ Õù Õò Õë Õä ÕÝ ÕÖ ÕÏ ÕÈ ÕÁ Õº Õ³ Õ¬ Õ¥ Õž Õ— Õ Õ‰ Õ‚ Õ{ Õt Õm Õf Õ_ ÕX ÕQ ÕJ ÕC Õ< Õ5 Õ. Õ' Õ Õ Õ Õ Õ Õý Õö Õï Õè Õá ÕÚ ÕÓ ÕÌ ÕÅ Õ¾ Õ· Õ° Õ© Õ¢ Õ› Õ” Õ Õ† Õ Õx Õq Õj Õc Õ\ ÕU ÕN ÕG Õ@ Õ9 Õ2 Õ+ Õ$ Õ Õ Õ Õ Õ Õú Õó Õì Õå ÕÞ Õ× ÕÐ ÕÉ Õ Õ» Õ´ Õ­ Õ¦ ÕŸ Õ˜ Õ‘ ÕŠ Õƒ Õ| Õu Õn Õg Õ` ÕY ÕR ÕK ÕD Õ= Õ6 Õ/ Õ( Õ! Õ Õ Õ Õ ÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÿÔøÿÔñÿÔêÿÔãÿÔÜÿÔÕÿÔÎÿÔÇÿÔÀÿÔ¹ÿÔ²ÿÔ«ÿÔ¤ÿÔÿÔ–ÿÔÿÔˆÿÔÿÔzÿÔsÿÔlÿÔeÿÔ^ÿÔWÿÔPÿÔIÿÔBÿÔ;ÿÔ4ÿÔ-ÿÔ&ÿÔÿÔÿÔÿÔ ÿÔÿÔüþÔõþÔîþÔçþÔàþÔÙþÔÒþÔËþÔÄþÔ½þÔ¶þÔ¯þÔ¨þÔ¡þÔšþÔ“þÔŒþÔ…þÔ~þÔwþÔpþÔiþÔbþÔ[þÔTþÔMþÔFþÔ?þÔ8þÔ1þÔ*þÔ#þÔþÔþÔþÔþÔþÔùýÔòýÔëýÔäýÔÝýÔÖýÔÏýÔÈýÔÁýÔºýÔ³ýÔ¬ýÔ¥ýÔžýÔ—ýÔýÔ‰ýÔ‚ýÔ{ýÔtýÔmýÔfýÔ_ýÔXýÔQýÔJýÔCýÔ<ýÔ5ýÔ.ýÔ'ýÔ ýÔýÔýÔ ýÔýÔýüÔöüÔïüÔèüÔáüÔÚüÔÓüÔÌüÔÅüÔ¾üÔ·üÔ°üÔ©üÔ¢üÔ›üÔ”üÔüÔ†üÔüÔxüÔqüÔjüÔcüÔ\üÔUüÔNüÔGüÔ@üÔ9üÔ2üÔ+üÔ$üÔüÔüÔüÔüÔüÔúûÔóûÔìûÔåûÔÞûÔ×ûÔÐûÔÉûÔÂûÔ»ûÔ´ûÔ­ûÔ¦ûÔŸûÔ˜ûÔ‘ûÔŠûÔƒûÔ|ûÔuûÔnûÔgûÔ`ûÔYûÔRûÔKûÔDûÔ=ûÔ6ûÔ/ûÔ(ûÔ!ûÔûÔûÔ ûÔûÔþúÔ÷úÔðúÔéúÔâúÔÛúÔÔúÔÍúÔÆúÔ¿úÔ¸úÔ±úÔªúÔ£úÔœúÔ•úÔŽúÔ‡úÔ€úÔyúÔrúÔkúÔdúÔ]úÔVúÔOúÔHúÔAúÔ:úÔ3úÔ,úÔ%úÔúÔúÔúÔ úÔúÔûùÔôùÔíùÔæùÔßùÔØùÔÑùÔÊùÔÃùÔ¼ùÔµùÔ®ùÔ§ùÔ ùÔ™ùÔ’ùÔ‹ùÔ„ùÔ}ùÔvùÔoùÔhùÔaùÔZùÔSùÔLùÔEùÔ>ùÔ7ùÔ0ùÔ)ùÔ"ùÔùÔùÔ ùÔùÔÿøÔøøÔñøÔêøÔãøÔÜøÔÕøÔÎøÔÇøÔÀøÔ¹øÔ²øÔ«øÔ¤øÔøÔ–øÔøÔˆøÔøÔzøÔsøÔløÔeøÔ^øÔWøÔPøÔIøÔBøÔ;øÔ4øÔ-øÔ&øÔøÔøÔøÔ øÔøÔü÷Ôõ÷Ôî÷Ôç÷Ôà÷ÔÙ÷ÔÒ÷ÔË÷ÔÄ÷Ô½÷Ô¶÷Ô¯÷Ô¨÷Ô¡÷Ôš÷Ô“÷ÔŒ÷Ô…÷Ô~÷Ôw÷Ôp÷Ôi÷Ôb÷Ô[÷ÔT÷ÔM÷ÔF÷Ô?÷Ô8÷Ô1÷Ô*÷Ô#÷Ô÷Ô÷Ô÷Ô÷Ô÷ÔùöÔòöÔëöÔäöÔÝöÔÖöÔÏöÔÈöÔÁöÔºöÔ³öÔ¬öÔ¥öÔžöÔ—öÔöÔ‰öÔ‚öÔ{öÔtöÔmöÔföÔ_öÔXöÔQöÔJöÔCöÔ<öÔ5öÔ.öÔ'öÔ öÔöÔöÔ öÔöÔýõÔöõÔïõÔèõÔáõÔÚõÔÓõÔÌõÔÅõÔ¾õÔ·õÔ°õÔ©õÔ¢õÔ›õÔ”õÔõÔ†õÔõÔxõÔqõÔjõÔcõÔ\õÔUõÔNõÔGõÔ@õÔ9õÔ2õÔ+õÔ$õÔõÔõÔõÔõÔõÔúôÔóôÔìôÔåôÔÞôÔ×ôÔÐôÔÉôÔÂôÔ»ôÔ´ôÔ­ôÔ¦ôÔŸôÔ˜ôÔ‘ôÔŠôÔƒôÔ|ôÔuôÔnôÔgôÔ`ôÔYôÔRôÔKôÔDôÔ=ôÔ6ôÔ/ôÔ(ôÔ!ôÔôÔôÔ ôÔôÔþóÔ÷óÔðóÔéóÔâóÔÛóÔÔóÔÍóÔÆóÔ¿óÔ¸óÔ±óÔªóÔ£óÔœóÔ•óÔŽóÔ‡óÔ€óÔyóÔróÔkóÔdóÔ]óÔVóÔOóÔHóÔAóÔ:óÔ3óÔ,óÔ%óÔóÔóÔóÔ óÔóÔûòÔôòÔíòÔæòÔßòÔØòÔÑòÔÊòÔÃòÔ¼òÔµòÔ®òÔ§òÔ òÔ™òÔ’òÔ‹òÔ„òÔ}òÔvòÔoòÔhòÔaòÔZòÔSòÔLòÔEòÔ>òÔ7òÔ0òÔ)òÔ"òÔòÔòÔ òÔòÔÿñÔøñÔññÔêñÔãñÔÜñÔÕñÔÎñÔÇñÔÀñÔ¹ñÔ²ñÔ«ñÔ¤ñÔñÔ–ñÔñÔˆñÔñÔzñÔsñÔlñÔeñÔ^ñÔWñÔPñÔIñÔBñÔ;ñÔ4ñÔ-ñÔ&ñÔñÔñÔñÔ ñÔñÔüðÔõðÔîðÔçðÔàðÔÙðÔÒðÔËðÔÄðÔ½ðÔ¶ðÔ¯ðÔ¨ðÔ¡ðÔšðÔ“ðÔŒðÔ…ðÔ~ðÔwðÔpðÔiðÔbðÔ[ðÔTðÔMðÔFðÔ?ðÔ8ðÔ1ðÔ*ðÔ#ðÔðÔðÔðÔðÔðÔùïÔòïÔëïÔäïÔÝïÔÖïÔÏïÔÈïÔÁïÔºïÔ³ïÔ¬ïÔ¥ïÔžïÔ—ïÔïÔ‰ïÔ‚ïÔ{ïÔtïÔmïÔfïÔ_ïÔXïÔQïÔJïÔCïÔ<ïÔ5ïÔ.ïÔ'ïÔ ïÔïÔïÔ ïÔïÔýîÔöîÔïîÔèîÔáîÔÚîÔÓîÔÌîÔÅîÔ¾îÔ·îÔ°îÔ©îÔ¢îÔ›îÔ”îÔîÔ†îÔîÔxîÔqîÔjîÔcîÔ\îÔUîÔNîÔGîÔ@îÔ9îÔ2îÔ+îÔ$îÔîÔîÔîÔîÔîÔúíÔóíÔìíÔåíÔÞíÔ×íÔÐíÔÉíÔÂíÔ»íÔ´íÔ­íÔ¦íÔŸíÔ˜íÔ‘íÔŠíÔƒíÔ|íÔuíÔníÔgíÔ`íÔYíÔRíÔKíÔDíÔ=íÔ6íÔ/íÔ(íÔ!íÔíÔíÔ íÔíÔþìÔ÷ìÔðìÔéìÔâìÔÛìÔÔìÔÍìÔÆìÔ¿ìÔ¸ìÔ±ìÔªìÔ£ìÔœìÔ•ìÔŽìÔ‡ìÔ€ìÔyìÔrìÔkìÔdìÔ]ìÔVìÔOìÔHìÔAìÔ:ìÔ3ìÔ,ìÔ%ìÔìÔìÔìÔ ìÔìÔûëÔôëÔíëÔæëÔßëÔØëÔÑëÔÊëÔÃëÔ¼ëÔµëÔ®ëÔ§ëÔ ëÔ™ëÔ’ëÔ‹ëÔ„ëÔ}ëÔvëÔoëÔhëÔaëÔZëÔSëÔLëÔEëÔ>ëÔ7ëÔ0ëÔ)ëÔ"ëÔëÔëÔ ëÔëÔÿêÔøêÔñêÔêêÔãêÔÜêÔÕêÔÎêÔÇêÔÀêÔ¹êÔ²êÔ«êÔ¤êÔêÔ–êÔêÔˆêÔêÔzêÔsêÔlêÔeêÔ^êÔWêÔPêÔIêÔBêÔ;êÔ4êÔ-êÔ&êÔêÔêÔêÔ êÔêÔüéÔõéÔîéÔçéÔàéÔÙéÔÒéÔËéÔÄéÔ½éÔ¶éÔ¯éÔ¨éÔ¡éÔšéÔ“éÔŒéÔ…éÔ~éÔwéÔpéÔiéÔbéÔ[éÔTéÔMéÔFéÔ?éÔ8éÔ1éÔ*éÔ#éÔéÔéÔéÔéÔéÔùèÔòèÔëèÔäèÔÝèÔÖèÔÏèÔÈèÔÁèÔºèÔ³èÔ¬èÔ¥èÔžèÔ—èÔèÔ‰èÔ‚èÔ{èÔtèÔmèÔfèÔ_èÔXèÔQèÔJèÔCèÔ<èÔ5èÔ.èÔ'èÔ èÔèÔèÔ èÔèÔýçÔöçÔïçÔèçÔáçÔÚçÔÓçÔÌçÔÅçÔ¾çÔ·çÔ°çÔ©çÔ¢çÔ›çÔ”çÔçÔ†çÔçÔxçÔqçÔjçÔcçÔ\çÔUçÔNçÔGçÔ@çÔ9çÔ2çÔ+çÔ$çÔçÔçÔçÔçÔçÔúæÔóæÔìæÔåæÔÞæÔ׿ÔÐæÔÉæÔÂæÔ»æÔ´æÔ­æÔ¦æÔŸæÔ˜æÔ‘æÔŠæÔƒæÔ|æÔuæÔnæÔgæÔ`æÔYæÔRæÔKæÔDæÔ=æÔ6æÔ/æÔ(æÔ!æÔæÔæÔ æÔæÔþåÔ÷åÔðåÔéåÔâåÔÛåÔÔåÔÍåÔÆåÔ¿åÔ¸åÔ±åÔªåÔ£åÔœåÔ•åÔŽåÔ‡åÔ€åÔyåÔråÔkåÔdåÔ]åÔVåÔOåÔHåÔAåÔ:åÔ3åÔ,åÔ%åÔåÔåÔåÔ åÔåÔûäÔôäÔíäÔæäÔßäÔØäÔÑäÔÊäÔÃäÔ¼äÔµäÔ®äÔ§äÔ äÔ™äÔ’äÔ‹äÔ„äÔ}äÔväÔoäÔhäÔaäÔZäÔSäÔLäÔEäÔ>äÔ7äÔ0äÔ)äÔ"äÔäÔäÔ äÔäÔÿãÔøãÔñãÔêãÔããÔÜãÔÕãÔÎãÔÇãÔÀãÔ¹ãÔ²ãÔ«ãÔ¤ãÔãÔ–ãÔãÔˆãÔãÔzãÔsãÔlãÔeãÔ^ãÔWãÔPãÔIãÔBãÔ;ãÔ4ãÔ-ãÔ&ãÔãÔãÔãÔ ãÔãÔüâÔõâÔîâÔçâÔàâÔÙâÔÒâÔËâÔÄâÔ½âÔ¶âÔ¯âÔ¨âÔ¡âÔšâÔ“âÔŒâÔ…âÔ~âÔwâÔpâÔiâÔbâÔ[âÔTâÔMâÔFâÔ?âÔ8âÔ1âÔ*âÔ#âÔâÔâÔâÔâÔâÔùáÔòáÔëáÔäáÔÝáÔÖáÔÏáÔÈáÔÁáÔºáÔ³áÔ¬áÔ¥áÔžáÔ—áÔáÔ‰áÔ‚áÔ{áÔtáÔmáÔfáÔ_áÔXáÔQáÔJáÔCáÔ<áÔ5áÔ.áÔ'áÔ áÔáÔáÔ áÔáÔýàÔöàÔïàÔèàÔáàÔÚàÔÓàÔÌàÔÅàÔ¾àÔ·àÔ°àÔ©àÔ¢àÔ›àÔ”àÔàÔ†àÔàÔxàÔqàÔjàÔcàÔ\àÔUàÔNàÔGàÔ@àÔ9àÔ2àÔ+àÔ$àÔàÔàÔàÔàÔàÔúßÔóßÔìßÔåßÔÞßÔ×ßÔÐßÔÉßÔÂßÔ»ßÔ´ßÔ­ßÔ¦ßÔŸßÔ˜ßÔ‘ßÔŠßÔƒßÔ|ßÔußÔnßÔgßÔ`ßÔYßÔRßÔKßÔDßÔ=ßÔ6ßÔ/ßÔ(ßÔ!ßÔßÔßÔ ßÔßÔþÞÔ÷ÞÔðÞÔéÞÔâÞÔÛÞÔÔÞÔÍÞÔÆÞÔ¿ÞÔ¸ÞÔ±ÞÔªÞÔ£ÞÔœÞÔ•ÞÔŽÞÔ‡ÞÔ€ÞÔyÞÔrÞÔkÞÔdÞÔ]ÞÔVÞÔOÞÔHÞÔAÞÔ:ÞÔ3ÞÔ,ÞÔ%ÞÔÞÔÞÔÞÔ ÞÔÞÔûÝÔôÝÔíÝÔæÝÔßÝÔØÝÔÑÝÔÊÝÔÃÝÔ¼ÝÔµÝÔ®ÝÔ§ÝÔ ÝÔ™ÝÔ’ÝÔ‹ÝÔ„ÝÔ}ÝÔvÝÔoÝÔhÝÔaÝÔZÝÔSÝÔLÝÔEÝÔ>ÝÔ7ÝÔ0ÝÔ)ÝÔ"ÝÔÝÔÝÔ ÝÔÝÔÿÜÔøÜÔñÜÔêÜÔãÜÔÜÜÔÕÜÔÎÜÔÇÜÔÀÜÔ¹ÜÔ²ÜÔ«ÜÔ¤ÜÔÜÔ–ÜÔÜÔˆÜÔÜÔzÜÔsÜÔlÜÔeÜÔ^ÜÔWÜÔPÜÔIÜÔBÜÔ;ÜÔ4ÜÔ-ÜÔ&ÜÔÜÔÜÔÜÔ ÜÔÜÔüÛÔõÛÔîÛÔçÛÔàÛÔÙÛÔÒÛÔËÛÔÄÛÔ½ÛÔ¶ÛÔ¯ÛÔ¨ÛÔ¡ÛÔšÛÔ“ÛÔŒÛÔ…ÛÔ~ÛÔwÛÔpÛÔiÛÔbÛÔ[ÛÔTÛÔMÛÔFÛÔ?ÛÔ8ÛÔ1ÛÔ*ÛÔ#ÛÔÛÔÛÔÛÔÛÔÛÔùÚÔòÚÔëÚÔäÚÔÝÚÔÖÚÔÏÚÔÈÚÔÁÚÔºÚÔ³ÚÔ¬ÚÔ¥ÚÔžÚÔ—ÚÔÚÔ‰ÚÔ‚ÚÔ{ÚÔtÚÔmÚÔfÚÔ_ÚÔXÚÔQÚÔJÚÔCÚÔ<ÚÔ5ÚÔ.ÚÔ'ÚÔ ÚÔÚÔÚÔ ÚÔÚÔýÙÔöÙÔïÙÔèÙÔáÙÔÚÙÔÓÙÔÌÙÔÅÙÔ¾ÙÔ·ÙÔ°ÙÔ©ÙÔ¢ÙÔ›ÙÔ”ÙÔÙÔ†ÙÔÙÔxÙÔqÙÔjÙÔcÙÔ\ÙÔUÙÔNÙÔGÙÔ@ÙÔ9ÙÔ2ÙÔ+ÙÔ$ÙÔÙÔÙÔÙÔÙÔÙÔúØÔóØÔìØÔåØÔÞØÔרÔÐØÔÉØÔÂØÔ»ØÔ´ØÔ­ØÔ¦ØÔŸØÔ˜ØÔ‘ØÔŠØÔƒØÔ|ØÔuØÔnØÔgØÔ`ØÔYØÔRØÔKØÔDØÔ=ØÔ6ØÔ/ØÔ(ØÔ!ØÔØÔØÔ ØÔØÔþ×Ô÷×Ôð×Ôé×Ôâ×ÔÛ×ÔÔ×ÔÍ×ÔÆ×Ô¿×Ô¸×Ô±×Ôª×Ô£×Ôœ×Ô•×ÔŽ×Ô‡×Ô€×Ôy×Ôr×Ôk×Ôd×Ô]×ÔV×ÔO×ÔH×ÔA×Ô:×Ô3×Ô,×Ô%×Ô×Ô×Ô×Ô ×Ô×ÔûÖÔôÖÔíÖÔæÖÔßÖÔØÖÔÑÖÔÊÖÔÃÖÔ¼ÖÔµÖÔ®ÖÔ§ÖÔ ÖÔ™ÖÔ’ÖÔ‹ÖÔ„ÖÔ}ÖÔvÖÔoÖÔhÖÔaÖÔZÖÔSÖÔLÖÔEÖÔ>ÖÔ7ÖÔ0ÖÔ)ÖÔ"ÖÔÖÔÖÔ ÖÔÖÔÿÕÔøÕÔñÕÔêÕÔãÕÔÜÕÔÕÕÔÎÕÔÇÕÔÀÕÔ¹ÕÔ²ÕÔ«ÕÔ¤ÕÔÕÔ–ÕÔÕÔˆÕÔÕÔzÕÔsÕÔlÕÔeÕÔ^ÕÔWÕÔPÕÔIÕÔBÕÔ;ÕÔ4ÕÔ-ÕÔ&ÕÔÕÔÕÔÕÔ ÕÔÕÔüÔÔõÔÔîÔÔçÔÔàÔÔÙÔÔÒÔÔËÔÔÄÔÔ½ÔÔ¶ÔÔ¯ÔÔ¨ÔÔ¡ÔÔšÔÔ“ÔÔŒÔÔ…ÔÔ~ÔÔwÔÔpÔÔiÔÔbÔÔ[ÔÔTÔÔMÔÔFÔÔ?ÔÔ8ÔÔ1ÔÔ*ÔÔ#ÔÔÔÔÔÔÔÔÔÔÔÔùÓÔòÓÔëÓÔäÓÔÝÓÔÖÓÔÏÓÔÈÓÔÁÓÔºÓÔ³ÓÔ¬ÓÔ¥ÓÔžÓÔ—ÓÔÓÔ‰ÓÔ‚ÓÔ{ÓÔtÓÔmÓÔfÓÔ_ÓÔXÓÔQÓÔJÓÔCÓÔ<ÓÔ5ÓÔ.ÓÔ'ÓÔ ÓÔÓÔÓÔ ÓÔÓÔýÒÔöÒÔïÒÔèÒÔáÒÔÚÒÔÓÒÔÌÒÔÅÒÔ¾ÒÔ·ÒÔ°ÒÔ©ÒÔ¢ÒÔ›ÒÔ”ÒÔÒÔ†ÒÔÒÔxÒÔqÒÔjÒÔcÒÔ\ÒÔUÒÔNÒÔGÒÔ@ÒÔ9ÒÔ2ÒÔ+ÒÔ$ÒÔÒÔÒÔÒÔÒÔÒÔúÑÔóÑÔìÑÔåÑÔÞÑÔ×ÑÔÐÑÔÉÑÔÂÑÔ»ÑÔ´ÑÔ­ÑÔ¦ÑÔŸÑÔ˜ÑÔ‘ÑÔŠÑÔƒÑÔ|ÑÔuÑÔnÑÔgÑÔ`ÑÔYÑÔRÑÔKÑÔDÑÔ=ÑÔ6ÑÔ/ÑÔ(ÑÔ!ÑÔÑÔÑÔ ÑÔÑÔþÐÔ÷ÐÔðÐÔéÐÔâÐÔÛÐÔÔÐÔÍÐÔÆÐÔ¿ÐÔ¸ÐÔ±ÐÔªÐÔ£ÐÔœÐÔ•ÐÔŽÐÔ‡ÐÔ€ÐÔyÐÔrÐÔkÐÔdÐÔ]ÐÔVÐÔOÐÔHÐÔAÐÔ:ÐÔ3ÐÔ,ÐÔ%ÐÔÐÔÐÔÐÔ ÐÔÐÔûÏÔôÏÔíÏÔæÏÔßÏÔØÏÔÑÏÔÊÏÔÃÏÔ¼ÏÔµÏÔ®ÏÔ§ÏÔ ÏÔ™ÏÔ’ÏÔ‹ÏÔ„ÏÔ}ÏÔvÏÔoÏÔhÏÔaÏÔZÏÔSÏÔLÏÔEÏÔ>ÏÔ7ÏÔ0ÏÔ)ÏÔ"ÏÔÏÔÏÔ ÏÔÏÔÿÎÔøÎÔñÎÔêÎÔãÎÔÜÎÔÕÎÔÎÎÔÇÎÔÀÎÔ¹ÎÔ²ÎÔ«ÎÔ¤ÎÔÎÔ–ÎÔÎÔˆÎÔÎÔzÎÔsÎÔlÎÔeÎÔ^ÎÔWÎÔPÎÔIÎÔBÎÔ;ÎÔ4ÎÔ-ÎÔ&ÎÔÎÔÎÔÎÔ ÎÔÎÔüÍÔõÍÔîÍÔçÍÔàÍÔÙÍÔÒÍÔËÍÔÄÍÔ½ÍÔ¶ÍÔ¯ÍÔ¨ÍÔ¡ÍÔšÍÔ“ÍÔŒÍÔ…ÍÔ~ÍÔwÍÔpÍÔiÍÔbÍÔ[ÍÔTÍÔMÍÔFÍÔ?ÍÔ8ÍÔ1ÍÔ*ÍÔ#ÍÔÍÔÍÔÍÔÍÔÍÔùÌÔòÌÔëÌÔäÌÔÝÌÔÖÌÔÏÌÔÈÌÔÁÌÔºÌÔ³ÌÔ¬ÌÔ¥ÌÔžÌÔ—ÌÔÌÔ‰ÌÔ‚ÌÔ{ÌÔtÌÔmÌÔfÌÔ_ÌÔXÌÔQÌÔJÌÔCÌÔ<ÌÔ5ÌÔ.ÌÔ'ÌÔ ÌÔÌÔÌÔ ÌÔÌÔýËÔöËÔïËÔèËÔáËÔÚËÔÓËÔÌËÔÅËÔ¾ËÔ·ËÔ°ËÔ©ËÔ¢ËÔ›ËÔ”ËÔËÔ†ËÔËÔxËÔqËÔjËÔcËÔ\ËÔUËÔNËÔGËÔ@ËÔ9ËÔ2ËÔ+ËÔ$ËÔËÔËÔËÔËÔËÔúÊÔóÊÔìÊÔåÊÔÞÊÔ×ÊÔÐÊÔÉÊÔÂÊÔ»ÊÔ´ÊÔ­ÊÔ¦ÊÔŸÊÔ˜ÊÔ‘ÊÔŠÊÔƒÊÔ|ÊÔuÊÔnÊÔgÊÔ`ÊÔYÊÔRÊÔKÊÔDÊÔ=ÊÔ6ÊÔ/ÊÔ(ÊÔ!ÊÔÊÔÊÔ ÊÔÊÔþÉÔ÷ÉÔðÉÔéÉÔâÉÔÛÉÔÔÉÔÍÉÔÆÉÔ¿ÉÔ¸ÉÔ±ÉÔªÉÔ£ÉÔœÉÔ•ÉÔŽÉÔ‡ÉÔ€ÉÔyÉÔrÉÔkÉÔdÉÔ]ÉÔVÉÔOÉÔHÉÔAÉÔ:ÉÔ3ÉÔ,ÉÔ%ÉÔÉÔÉÔÉÔ ÉÔÉÔûÈÔôÈÔíÈÔæÈÔßÈÔØÈÔÑÈÔÊÈÔÃÈÔ¼ÈÔµÈÔ®ÈÔ§ÈÔ ÈÔ™ÈÔ’ÈÔ‹ÈÔ„ÈÔ}ÈÔvÈÔoÈÔhÈÔaÈÔZÈÔSÈÔLÈÔEÈÔ>ÈÔ7ÈÔ0ÈÔ)ÈÔ"ÈÔÈÔÈÔ ÈÔÈÔÿÇÔøÇÔñÇÔêÇÔãÇÔÜÇÔÕÇÔÎÇÔÇÇÔÀÇÔ¹ÇÔ²ÇÔ«ÇÔ¤ÇÔÇÔ–ÇÔÇÔˆÇÔÇÔzÇÔsÇÔlÇÔeÇÔ^ÇÔWÇÔPÇÔIÇÔBÇÔ;ÇÔ4ÇÔ-ÇÔ&ÇÔÇÔÇÔÇÔ ÇÔÇÔüÆÔõÆÔîÆÔçÆÔàÆÔÙÆÔÒÆÔËÆÔÄÆÔ½ÆÔ¶ÆÔ¯ÆÔ¨ÆÔ¡ÆÔšÆÔ“ÆÔŒÆÔ…ÆÔ~ÆÔwÆÔpÆÔiÆÔbÆÔ[ÆÔTÆÔMÆÔFÆÔ?ÆÔ8ÆÔ1ÆÔ*ÆÔ#ÆÔÆÔÆÔÆÔÆÔÆÔùÅÔòÅÔëÅÔäÅÔÝÅÔÖÅÔÏÅÔÈÅÔÁÅÔºÅÔ³ÅÔ¬ÅÔ¥ÅÔžÅÔ—ÅÔÅÔ‰ÅÔ‚ÅÔ{ÅÔtÅÔmÅÔfÅÔ_ÅÔXÅÔQÅÔJÅÔCÅÔ<ÅÔ5ÅÔ.ÅÔ'ÅÔ ÅÔÅÔÅÔ ÅÔÅÔýÄÔöÄÔïÄÔèÄÔáÄÔÚÄÔÓÄÔÌÄÔÅÄÔ¾ÄÔ·ÄÔ°ÄÔ©ÄÔ¢ÄÔ›ÄÔ”ÄÔÄÔ†ÄÔÄÔxÄÔqÄÔjÄÔcÄÔ\ÄÔUÄÔNÄÔGÄÔ@ÄÔ9ÄÔ2ÄÔ+ÄÔ$ÄÔÄÔÄÔÄÔÄÔÄÔúÃÔóÃÔìÃÔåÃÔÞÃÔ×ÃÔÐÃÔÉÃÔÂÃÔ»ÃÔ´ÃÔ­ÃÔ¦ÃÔŸÃÔ˜ÃÔ‘ÃÔŠÃÔƒÃÔ|ÃÔuÃÔnÃÔgÃÔ`ÃÔYÃÔRÃÔKÃÔDÃÔ=ÃÔ6ÃÔ/ÃÔ(ÃÔ!ÃÔÃÔÃÔ ÃÔÃÔþÂÔ÷ÂÔðÂÔéÂÔâÂÔÛÂÔÔÂÔÍÂÔÆÂÔ¿ÂÔ¸ÂÔ±ÂÔªÂÔ£ÂÔœÂÔ•ÂÔŽÂÔ‡ÂÔ€ÂÔyÂÔrÂÔkÂÔdÂÔ]ÂÔVÂÔOÂÔHÂÔAÂÔ:ÂÔ3ÂÔ,ÂÔ%ÂÔÂÔÂÔÂÔ ÂÔÂÔûÁÔôÁÔíÁÔæÁÔßÁÔØÁÔÑÁÔÊÁÔÃÁÔ¼ÁÔµÁÔ®ÁÔ§ÁÔ ÁÔ™ÁÔ’ÁÔ‹ÁÔ„ÁÔ}ÁÔvÁÔoÁÔhÁÔaÁÔZÁÔSÁÔLÁÔEÁÔ>ÁÔ7ÁÔ0ÁÔ)ÁÔ"ÁÔÁÔÁÔ ÁÔÁÔÿÀÔøÀÔñÀÔêÀÔãÀÔÜÀÔÕÀÔÎÀÔÇÀÔÀÀÔ¹ÀÔ²ÀÔ«ÀÔ¤ÀÔÀÔ–ÀÔÀÔˆÀÔÀÔzÀÔsÀÔlÀÔeÀÔ^ÀÔWÀÔPÀÔIÀÔBÀÔ;ÀÔ4ÀÔ-ÀÔ&ÀÔÀÔÀÔÀÔ ÀÔÀÔü¿Ôõ¿Ôî¿Ôç¿Ôà¿ÔÙ¿ÔÒ¿ÔË¿ÔĿԽ¿Ô¶¿Ô¯¿Ô¨¿Ô¡¿Ôš¿Ô“¿ÔŒ¿Ô…¿Ô~¿Ôw¿Ôp¿Ôi¿Ôb¿Ô[¿ÔT¿ÔM¿ÔF¿Ô?¿Ô8¿Ô1¿Ô*¿Ô#¿Ô¿Ô¿Ô¿Ô¿Ô¿Ôù¾Ôò¾Ôë¾Ôä¾ÔݾÔÖ¾ÔϾÔȾÔÁ¾Ôº¾Ô³¾Ô¬¾Ô¥¾Ôž¾Ô—¾Ô¾Ô‰¾Ô‚¾Ô{¾Ôt¾Ôm¾Ôf¾Ô_¾ÔX¾ÔQ¾ÔJ¾ÔC¾Ô<¾Ô5¾Ô.¾Ô'¾Ô ¾Ô¾Ô¾Ô ¾Ô¾Ôý½Ôö½Ôï½Ôè½Ôá½ÔÚ½ÔÓ½Ô̽ÔŽÔ¾½Ô·½Ô°½Ô©½Ô¢½Ô›½Ô”½Ô½Ô†½Ô½Ôx½Ôq½Ôj½Ôc½Ô\½ÔU½ÔN½ÔG½Ô@½Ô9½Ô2½Ô+½Ô$½Ô½Ô½Ô½Ô½Ô½Ôú¼Ôó¼Ôì¼Ôå¼ÔÞ¼Ô×¼ÔмÔɼÔ¼Ô»¼Ô´¼Ô­¼Ô¦¼ÔŸ¼Ô˜¼Ô‘¼ÔмÔƒ¼Ô|¼Ôu¼Ôn¼Ôg¼Ô`¼ÔY¼ÔR¼ÔK¼ÔD¼Ô=¼Ô6¼Ô/¼Ô(¼Ô!¼Ô¼Ô¼Ô ¼Ô¼Ôþ»Ô÷»Ôð»Ôé»Ôâ»ÔÛ»ÔÔ»ÔÍ»ÔÆ»Ô¿»Ô¸»Ô±»Ôª»Ô£»Ôœ»Ô•»ÔŽ»Ô‡»Ô€»Ôy»Ôr»Ôk»Ôd»Ô]»ÔV»ÔO»ÔH»ÔA»Ô:»Ô3»Ô,»Ô%»Ô»Ô»Ô»Ô »Ô»ÔûºÔôºÔíºÔæºÔߺÔغÔѺÔʺÔúÔ¼ºÔµºÔ®ºÔ§ºÔ ºÔ™ºÔ’ºÔ‹ºÔ„ºÔ}ºÔvºÔoºÔhºÔaºÔZºÔSºÔLºÔEºÔ>ºÔ7ºÔ0ºÔ)ºÔ"ºÔºÔºÔ ºÔºÔÿ¹Ôø¹Ôñ¹Ôê¹Ôã¹ÔܹÔÕ¹ÔιÔǹÔÀ¹Ô¹¹Ô²¹Ô«¹Ô¤¹Ô¹Ô–¹Ô¹Ôˆ¹Ô¹Ôz¹Ôs¹Ôl¹Ôe¹Ô^¹ÔW¹ÔP¹ÔI¹ÔB¹Ô;¹Ô4¹Ô-¹Ô&¹Ô¹Ô¹Ô¹Ô ¹Ô¹Ôü¸Ôõ¸Ôî¸Ôç¸Ôà¸ÔÙ¸ÔÒ¸Ô˸ÔĸÔ½¸Ô¶¸Ô¯¸Ô¨¸Ô¡¸Ôš¸Ô“¸ÔŒ¸Ô…¸Ô~¸Ôw¸Ôp¸Ôi¸Ôb¸Ô[¸ÔT¸ÔM¸ÔF¸Ô?¸Ô8¸Ô1¸Ô*¸Ô#¸Ô¸Ô¸Ô¸Ô¸Ô¸Ôù·Ôò·Ôë·Ôä·ÔÝ·ÔÖ·ÔÏ·ÔÈ·ÔÁ·Ôº·Ô³·Ô¬·Ô¥·Ôž·Ô—·Ô·Ô‰·Ô‚·Ô{·Ôt·Ôm·Ôf·Ô_·ÔX·ÔQ·ÔJ·ÔC·Ô<·Ô5·Ô.·Ô'·Ô ·Ô·Ô·Ô ·Ô·Ôý¶Ôö¶Ôï¶Ôè¶Ôá¶ÔÚ¶ÔÓ¶Ô̶ÔŶÔ¾¶Ô·¶Ô°¶Ô©¶Ô¢¶Ô›¶Ô”¶Ô¶Ô†¶Ô¶Ôx¶Ôq¶Ôj¶Ôc¶Ô\¶ÔU¶ÔN¶ÔG¶Ô@¶Ô9¶Ô2¶Ô+¶Ô$¶Ô¶Ô¶Ô¶Ô¶Ô¶ÔúµÔóµÔìµÔåµÔÞµÔ×µÔеÔɵÔµÔ»µÔ´µÔ­µÔ¦µÔŸµÔ˜µÔ‘µÔеÔƒµÔ|µÔuµÔnµÔgµÔ`µÔYµÔRµÔKµÔDµÔ=µÔ6µÔ/µÔ(µÔ!µÔµÔµÔ µÔµÔþ´Ô÷´Ôð´Ôé´Ôâ´ÔÛ´ÔÔ´ÔÍ´ÔÆ´Ô¿´Ô¸´Ô±´Ôª´Ô£´Ôœ´Ô•´ÔŽ´Ô‡´Ô€´Ôy´Ôr´Ôk´Ôd´Ô]´ÔV´ÔO´ÔH´ÔA´Ô:´Ô3´Ô,´Ô%´Ô´Ô´Ô´Ô ´Ô´Ôû³Ôô³Ôí³Ôæ³Ôß³ÔسÔѳÔʳÔóÔ¼³Ôµ³Ô®³Ô§³Ô ³Ô™³Ô’³Ô‹³Ô„³Ô}³Ôv³Ôo³Ôh³Ôa³ÔZ³ÔS³ÔL³ÔE³Ô>³Ô7³Ô0³Ô)³Ô"³Ô³Ô³Ô ³Ô³Ôÿ²Ôø²Ôñ²Ôê²Ôã²ÔܲÔÕ²ÔβÔDzÔÀ²Ô¹²Ô²²Ô«²Ô¤²Ô²Ô–²Ô²Ôˆ²Ô²Ôz²Ôs²Ôl²Ôe²Ô^²ÔW²ÔP²ÔI²ÔB²Ô;²Ô4²Ô-²Ô&²Ô²Ô²Ô²Ô ²Ô²Ôü±Ôõ±Ôî±Ôç±Ôà±ÔÙ±ÔÒ±Ô˱ÔıÔ½±Ô¶±Ô¯±Ô¨±Ô¡±Ôš±Ô“±ÔŒ±Ô…±Ô~±Ôw±Ôp±Ôi±Ôb±Ô[±ÔT±ÔM±ÔF±Ô?±Ô8±Ô1±Ô*±Ô#±Ô±Ô±Ô±Ô±Ô±Ôù°Ôò°Ôë°Ôä°ÔݰÔÖ°ÔϰÔȰÔÁ°Ôº°Ô³°Ô¬°Ô¥°Ôž°Ô—°Ô°Ô‰°Ô‚°Ô{°Ôt°Ôm°Ôf°Ô_°ÔX°ÔQ°ÔJ°ÔC°Ô<°Ô5°Ô.°Ô'°Ô °Ô°Ô°Ô °Ô°Ôý¯Ôö¯Ôï¯Ôè¯Ôá¯ÔÚ¯ÔÓ¯Ô̯ÔůÔ¾¯Ô·¯Ô°¯Ô©¯Ô¢¯Ô›¯Ô”¯Ô¯Ô†¯Ô¯Ôx¯Ôq¯Ôj¯Ôc¯Ô\¯ÔU¯ÔN¯ÔG¯Ô@¯Ô9¯Ô2¯Ô+¯Ô$¯Ô¯Ô¯Ô¯Ô¯Ô¯Ôú®Ôó®Ôì®Ôå®ÔÞ®Ô×®ÔЮÔɮԮԻ®Ô´®Ô­®Ô¦®ÔŸ®Ô˜®Ô‘®ÔŠ®Ôƒ®Ô|®Ôu®Ôn®Ôg®Ô`®ÔY®ÔR®ÔK®ÔD®Ô=®Ô6®Ô/®Ô(®Ô!®Ô®Ô®Ô ®Ô®Ôþ­Ô÷­Ôð­Ôé­Ôâ­ÔÛ­ÔÔ­ÔÍ­ÔÆ­Ô¿­Ô¸­Ô±­Ôª­Ô£­Ôœ­Ô•­ÔŽ­Ô‡­Ô€­Ôy­Ôr­Ôk­Ôd­Ô]­ÔV­ÔO­ÔH­ÔA­Ô:­Ô3­Ô,­Ô%­Ô­Ô­Ô­Ô ­Ô­Ôû¬Ôô¬Ôí¬Ôæ¬Ô߬ÔجÔѬÔʬÔìÔ¼¬Ôµ¬Ô®¬Ô§¬Ô ¬Ô™¬Ô’¬Ô‹¬Ô„¬Ô}¬Ôv¬Ôo¬Ôh¬Ôa¬ÔZ¬ÔS¬ÔL¬ÔE¬Ô>¬Ô7¬Ô0¬Ô)¬Ô"¬Ô¬Ô¬Ô ¬Ô¬Ôÿ«Ôø«Ôñ«Ôê«Ôã«ÔÜ«ÔÕ«ÔΫÔÇ«ÔÀ«Ô¹«Ô²«Ô««Ô¤«Ô«Ô–«Ô«Ôˆ«Ô«Ôz«Ôs«Ôl«Ôe«Ô^«ÔW«ÔP«ÔI«ÔB«Ô;«Ô4«Ô-«Ô&«Ô«Ô«Ô«Ô «Ô«ÔüªÔõªÔîªÔçªÔàªÔÙªÔÒªÔ˪ÔĪÔ½ªÔ¶ªÔ¯ªÔ¨ªÔ¡ªÔšªÔ“ªÔŒªÔ…ªÔ~ªÔwªÔpªÔiªÔbªÔ[ªÔTªÔMªÔFªÔ?ªÔ8ªÔ1ªÔ*ªÔ#ªÔªÔªÔªÔªÔªÔù©Ôò©Ôë©Ôä©ÔÝ©ÔÖ©ÔÏ©ÔÈ©ÔÁ©Ôº©Ô³©Ô¬©Ô¥©Ôž©Ô—©Ô©Ô‰©Ô‚©Ô{©Ôt©Ôm©Ôf©Ô_©ÔX©ÔQ©ÔJ©ÔC©Ô<©Ô5©Ô.©Ô'©Ô ©Ô©Ô©Ô ©Ô©Ôý¨Ôö¨Ôï¨Ôè¨Ôá¨ÔÚ¨ÔÓ¨Ǫ̂ÔŨÔ¾¨Ô·¨Ô°¨Ô©¨Ô¢¨Ô›¨Ô”¨Ô¨Ô†¨Ô¨Ôx¨Ôq¨Ôj¨Ôc¨Ô\¨ÔU¨ÔN¨ÔG¨Ô@¨Ô9¨Ô2¨Ô+¨Ô$¨Ô¨Ô¨Ô¨Ô¨Ô¨Ôú§Ôó§Ôì§Ôå§ÔÞ§Ô×§ÔЧÔɧÔ§Ô»§Ô´§Ô­§Ô¦§ÔŸ§Ô˜§Ô‘§ÔЧÔƒ§Ô|§Ôu§Ôn§Ôg§Ô`§ÔY§ÔR§ÔK§ÔD§Ô=§Ô6§Ô/§Ô(§Ô!§Ô§Ô§Ô §Ô§Ôþ¦Ô÷¦Ôð¦Ôé¦Ôâ¦ÔÛ¦ÔÔ¦ÔͦÔƦÔ¿¦Ô¸¦Ô±¦Ôª¦Ô£¦Ôœ¦Ô•¦ÔަÔ‡¦Ô€¦Ôy¦Ôr¦Ôk¦Ôd¦Ô]¦ÔV¦ÔO¦ÔH¦ÔA¦Ô:¦Ô3¦Ô,¦Ô%¦Ô¦Ô¦Ô¦Ô ¦Ô¦Ôû¥Ôô¥Ôí¥Ôæ¥ÔߥÔØ¥ÔÑ¥ÔÊ¥ÔÃ¥Ô¼¥Ôµ¥Ô®¥Ô§¥Ô ¥Ô™¥Ô’¥Ô‹¥Ô„¥Ô}¥Ôv¥Ôo¥Ôh¥Ôa¥ÔZ¥ÔS¥ÔL¥ÔE¥Ô>¥Ô7¥Ô0¥Ô)¥Ô"¥Ô¥Ô¥Ô ¥Ô¥Ôÿ¤Ôø¤Ôñ¤Ôê¤Ôã¤ÔܤÔÕ¤ÔΤÔǤÔÀ¤Ô¹¤Ô²¤Ô«¤Ô¤¤Ô¤Ô–¤Ô¤Ôˆ¤Ô¤Ôz¤Ôs¤Ôl¤Ôe¤Ô^¤ÔW¤ÔP¤ÔI¤ÔB¤Ô;¤Ô4¤Ô-¤Ô&¤Ô¤Ô¤Ô¤Ô ¤Ô¤Ôü£Ôõ£Ôî£Ôç£Ôà£ÔÙ£ÔÒ£ÔË£ÔÄ£Ô½£Ô¶£Ô¯£Ô¨£Ô¡£Ôš£Ô“£ÔŒ£Ô…£Ô~£Ôw£Ôp£Ôi£Ôb£Ô[£ÔT£ÔM£ÔF£Ô?£Ô8£Ô1£Ô*£Ô#£Ô£Ô£Ô£Ô£Ô£Ôù¢Ôò¢Ôë¢Ôä¢ÔÝ¢ÔÖ¢ÔÏ¢ÔÈ¢ÔÁ¢Ôº¢Ô³¢Ô¬¢Ô¥¢Ôž¢Ô—¢Ô¢Ô‰¢Ô‚¢Ô{¢Ôt¢Ôm¢Ôf¢Ô_¢ÔX¢ÔQ¢ÔJ¢ÔC¢Ô<¢Ô5¢Ô.¢Ô'¢Ô ¢Ô¢Ô¢Ô ¢Ô¢Ôý¡Ôö¡Ôï¡Ôè¡Ôá¡ÔÚ¡ÔÓ¡Ô̡ԚԾ¡Ô·¡Ô°¡Ô©¡Ô¢¡Ô›¡Ô”¡Ô¡Ô†¡Ô¡Ôx¡Ôq¡Ôj¡Ôc¡Ô\¡ÔU¡ÔN¡ÔG¡Ô@¡Ô9¡Ô2¡Ô+¡Ô$¡Ô¡Ô¡Ô¡Ô¡Ô¡Ôú Ôó Ôì Ôå ÔÞ Ô× ÔРÔÉ Ô Ô» Ô´ Ô­ Ô¦ ÔŸ Ô˜ Ô‘ ÔŠ Ôƒ Ô| Ôu Ôn Ôg Ô` ÔY ÔR ÔK ÔD Ô= Ô6 Ô/ Ô( Ô! Ô Ô Ô  Ô ÔþŸÔ÷ŸÔðŸÔéŸÔâŸÔÛŸÔÔŸÔÍŸÔÆŸÔ¿ŸÔ¸ŸÔ±ŸÔªŸÔ£ŸÔœŸÔ•ŸÔŽŸÔ‡ŸÔ€ŸÔyŸÔrŸÔkŸÔdŸÔ]ŸÔVŸÔOŸÔHŸÔAŸÔ:ŸÔ3ŸÔ,ŸÔ%ŸÔŸÔŸÔŸÔ ŸÔŸÔûžÔôžÔížÔæžÔßžÔØžÔÑžÔÊžÔÞÔ¼žÔµžÔ®žÔ§žÔ žÔ™žÔ’žÔ‹žÔ„žÔ}žÔvžÔožÔhžÔažÔZžÔSžÔLžÔEžÔ>žÔ7žÔ0žÔ)žÔ"žÔžÔžÔ žÔžÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüœÔõœÔîœÔçœÔàœÔÙœÔÒœÔËœÔĜԽœÔ¶œÔ¯œÔ¨œÔ¡œÔšœÔ“œÔŒœÔ…œÔ~œÔwœÔpœÔiœÔbœÔ[œÔTœÔMœÔFœÔ?œÔ8œÔ1œÔ*œÔ#œÔœÔœÔœÔœÔœÔù›Ôò›Ôë›Ôä›ÔÝ›ÔÖ›ÔÏ›ÔÈ›ÔÁ›Ôº›Ô³›Ô¬›Ô¥›Ôž›Ô—›Ô›Ô‰›Ô‚›Ô{›Ôt›Ôm›Ôf›Ô_›ÔX›ÔQ›ÔJ›ÔC›Ô<›Ô5›Ô.›Ô'›Ô ›Ô›Ô›Ô ›Ô›ÔýšÔöšÔïšÔèšÔášÔÚšÔÓšÔÌšÔÅšÔ¾šÔ·šÔ°šÔ©šÔ¢šÔ›šÔ”šÔšÔ†šÔšÔxšÔqšÔjšÔcšÔ\šÔUšÔNšÔGšÔ@šÔ9šÔ2šÔ+šÔ$šÔšÔšÔšÔšÔšÔú™Ôó™Ôì™Ôå™ÔÞ™Ô×™ÔЙÔəԙԻ™Ô´™Ô­™Ô¦™ÔŸ™Ô˜™Ô‘™ÔŠ™Ôƒ™Ô|™Ôu™Ôn™Ôg™Ô`™ÔY™ÔR™ÔK™ÔD™Ô=™Ô6™Ô/™Ô(™Ô!™Ô™Ô™Ô ™Ô™Ôþ˜Ô÷˜Ôð˜Ôé˜Ôâ˜ÔÛ˜ÔÔ˜Ô͘ÔƘÔ¿˜Ô¸˜Ô±˜Ôª˜Ô£˜Ôœ˜Ô•˜ÔŽ˜Ô‡˜Ô€˜Ôy˜Ôr˜Ôk˜Ôd˜Ô]˜ÔV˜ÔO˜ÔH˜ÔA˜Ô:˜Ô3˜Ô,˜Ô%˜Ô˜Ô˜Ô˜Ô ˜Ô˜Ôû—Ôô—Ôí—Ôæ—Ôß—ÔØ—ÔÑ—ÔÊ—Ô×Ô¼—Ôµ—Ô®—Ô§—Ô —Ô™—Ô’—Ô‹—Ô„—Ô}—Ôv—Ôo—Ôh—Ôa—ÔZ—ÔS—ÔL—ÔE—Ô>—Ô7—Ô0—Ô)—Ô"—Ô—Ô—Ô —Ô—Ôÿ–Ôø–Ôñ–Ôê–Ôã–ÔÜ–ÔÕ–ÔΖÔÇ–ÔÀ–Ô¹–Ô²–Ô«–Ô¤–Ô–Ô––Ô–Ôˆ–Ô–Ôz–Ôs–Ôl–Ôe–Ô^–ÔW–ÔP–ÔI–ÔB–Ô;–Ô4–Ô-–Ô&–Ô–Ô–Ô–Ô –Ô–Ôü•Ôõ•Ôî•Ôç•Ôà•ÔÙ•ÔÒ•ÔË•ÔĕԽ•Ô¶•Ô¯•Ô¨•Ô¡•Ôš•Ô“•ÔŒ•Ô…•Ô~•Ôw•Ôp•Ôi•Ôb•Ô[•ÔT•ÔM•ÔF•Ô?•Ô8•Ô1•Ô*•Ô#•Ô•Ô•Ô•Ô•Ô•Ôù”Ôò”Ôë”Ôä”ÔÝ”ÔÖ”ÔÏ”ÔÈ”ÔÁ”Ôº”Ô³”Ô¬”Ô¥”Ôž”Ô—”Ô”Ô‰”Ô‚”Ô{”Ôt”Ôm”Ôf”Ô_”ÔX”ÔQ”ÔJ”ÔC”Ô<”Ô5”Ô.”Ô'”Ô ”Ô”Ô”Ô ”Ô”Ôý“Ôö“Ôï“Ôè“Ôá“ÔÚ“ÔÓ“Ô̓ԜԾ“Ô·“Ô°“Ô©“Ô¢“Ô›“Ô”“Ô“Ô†“Ô“Ôx“Ôq“Ôj“Ôc“Ô\“ÔU“ÔN“ÔG“Ô@“Ô9“Ô2“Ô+“Ô$“Ô“Ô“Ô“Ô“Ô“Ôú’Ôó’Ôì’Ôå’ÔÞ’Ô×’ÔÐ’ÔÉ’ÔÂ’Ô»’Ô´’Ô­’Ô¦’ÔŸ’Ô˜’Ô‘’ÔŠ’Ôƒ’Ô|’Ôu’Ôn’Ôg’Ô`’ÔY’ÔR’ÔK’ÔD’Ô=’Ô6’Ô/’Ô(’Ô!’Ô’Ô’Ô ’Ô’Ôþ‘Ô÷‘Ôð‘Ôé‘Ôâ‘ÔÛ‘ÔÔ‘ÔÍ‘ÔÆ‘Ô¿‘Ô¸‘Ô±‘Ôª‘Ô£‘Ôœ‘Ô•‘ÔŽ‘Ô‡‘Ô€‘Ôy‘Ôr‘Ôk‘Ôd‘Ô]‘ÔV‘ÔO‘ÔH‘ÔA‘Ô:‘Ô3‘Ô,‘Ô%‘Ô‘Ô‘Ô‘Ô ‘Ô‘ÔûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüŽÔõŽÔîŽÔçŽÔàŽÔÙŽÔÒŽÔËŽÔÄŽÔ½ŽÔ¶ŽÔ¯ŽÔ¨ŽÔ¡ŽÔšŽÔ“ŽÔŒŽÔ…ŽÔ~ŽÔwŽÔpŽÔiŽÔbŽÔ[ŽÔTŽÔMŽÔFŽÔ?ŽÔ8ŽÔ1ŽÔ*ŽÔ#ŽÔŽÔŽÔŽÔŽÔŽÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýŒÔöŒÔïŒÔèŒÔáŒÔÚŒÔÓŒÔÌŒÔŌԾŒÔ·ŒÔ°ŒÔ©ŒÔ¢ŒÔ›ŒÔ”ŒÔŒÔ†ŒÔŒÔxŒÔqŒÔjŒÔcŒÔ\ŒÔUŒÔNŒÔGŒÔ@ŒÔ9ŒÔ2ŒÔ+ŒÔ$ŒÔŒÔŒÔŒÔŒÔŒÔú‹Ôó‹Ôì‹Ôå‹ÔÞ‹Ô׋ÔЋÔɋԋԻ‹Ô´‹Ô­‹Ô¦‹ÔŸ‹Ô˜‹Ô‘‹ÔŠ‹Ôƒ‹Ô|‹Ôu‹Ôn‹Ôg‹Ô`‹ÔY‹ÔR‹ÔK‹ÔD‹Ô=‹Ô6‹Ô/‹Ô(‹Ô!‹Ô‹Ô‹Ô ‹Ô‹ÔþŠÔ÷ŠÔðŠÔéŠÔâŠÔÛŠÔÔŠÔÍŠÔÆŠÔ¿ŠÔ¸ŠÔ±ŠÔªŠÔ£ŠÔœŠÔ•ŠÔŽŠÔ‡ŠÔ€ŠÔyŠÔrŠÔkŠÔdŠÔ]ŠÔVŠÔOŠÔHŠÔAŠÔ:ŠÔ3ŠÔ,ŠÔ%ŠÔŠÔŠÔŠÔ ŠÔŠÔû‰Ôô‰Ôí‰Ôæ‰Ô߉Ô؉ÔщÔʉÔÉÔ¼‰Ôµ‰Ô®‰Ô§‰Ô ‰Ô™‰Ô’‰Ô‹‰Ô„‰Ô}‰Ôv‰Ôo‰Ôh‰Ôa‰ÔZ‰ÔS‰ÔL‰ÔE‰Ô>‰Ô7‰Ô0‰Ô)‰Ô"‰Ô‰Ô‰Ô ‰Ô‰ÔÿˆÔøˆÔñˆÔêˆÔãˆÔ܈ÔÕˆÔΈÔLjÔÀˆÔ¹ˆÔ²ˆÔ«ˆÔ¤ˆÔˆÔ–ˆÔˆÔˆˆÔˆÔzˆÔsˆÔlˆÔeˆÔ^ˆÔWˆÔPˆÔIˆÔBˆÔ;ˆÔ4ˆÔ-ˆÔ&ˆÔˆÔˆÔˆÔ ˆÔˆÔü‡Ôõ‡Ôî‡Ôç‡Ôà‡ÔÙ‡ÔÒ‡ÔˇÔćÔ½‡Ô¶‡Ô¯‡Ô¨‡Ô¡‡Ôš‡Ô“‡ÔŒ‡Ô…‡Ô~‡Ôw‡Ôp‡Ôi‡Ôb‡Ô[‡ÔT‡ÔM‡ÔF‡Ô?‡Ô8‡Ô1‡Ô*‡Ô#‡Ô‡Ô‡Ô‡Ô‡Ô‡Ôù†Ôò†Ôë†Ôä†Ô݆ÔÖ†ÔφÔȆÔÁ†Ôº†Ô³†Ô¬†Ô¥†Ôž†Ô—†Ô†Ô‰†Ô‚†Ô{†Ôt†Ôm†Ôf†Ô_†ÔX†ÔQ†ÔJ†ÔC†Ô<†Ô5†Ô.†Ô'†Ô †Ô†Ô†Ô †Ô†Ôý…Ôö…Ôï…Ôè…Ôá…ÔÚ…ÔÓ…ÔÌ…ÔÅ…Ô¾…Ô·…Ô°…Ô©…Ô¢…Ô›…Ô”…Ô…Ô†…Ô…Ôx…Ôq…Ôj…Ôc…Ô\…ÔU…ÔN…ÔG…Ô@…Ô9…Ô2…Ô+…Ô$…Ô…Ô…Ô…Ô…Ô…Ôú„Ôó„Ôì„Ôå„ÔÞ„ÔׄÔЄÔɄԄԻ„Ô´„Ô­„Ô¦„ÔŸ„Ô˜„Ô‘„ÔŠ„Ôƒ„Ô|„Ôu„Ôn„Ôg„Ô`„ÔY„ÔR„ÔK„ÔD„Ô=„Ô6„Ô/„Ô(„Ô!„Ô„Ô„Ô „Ô„ÔþƒÔ÷ƒÔðƒÔéƒÔâƒÔÛƒÔÔƒÔ̓ÔƃÔ¿ƒÔ¸ƒÔ±ƒÔªƒÔ£ƒÔœƒÔ•ƒÔŽƒÔ‡ƒÔ€ƒÔyƒÔrƒÔkƒÔdƒÔ]ƒÔVƒÔOƒÔHƒÔAƒÔ:ƒÔ3ƒÔ,ƒÔ%ƒÔƒÔƒÔƒÔ ƒÔƒÔû‚Ôô‚Ôí‚Ôæ‚Ôß‚ÔØ‚ÔÑ‚ÔÊ‚ÔÂÔ¼‚Ôµ‚Ô®‚Ô§‚Ô ‚Ô™‚Ô’‚Ô‹‚Ô„‚Ô}‚Ôv‚Ôo‚Ôh‚Ôa‚ÔZ‚ÔS‚ÔL‚ÔE‚Ô>‚Ô7‚Ô0‚Ô)‚Ô"‚Ô‚Ô‚Ô ‚Ô‚ÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔü€Ôõ€Ôî€Ôç€Ôà€ÔÙ€ÔÒ€ÔË€ÔÄ€Ô½€Ô¶€Ô¯€Ô¨€Ô¡€Ôš€Ô“€ÔŒ€Ô…€Ô~€Ôw€Ôp€Ôi€Ôb€Ô[€ÔT€ÔM€ÔF€Ô?€Ô8€Ô1€Ô*€Ô#€Ô€Ô€Ô€Ô€Ô€ÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔý~Ôö~Ôï~Ôè~Ôá~ÔÚ~ÔÓ~ÔÌ~ÔÅ~Ô¾~Ô·~Ô°~Ô©~Ô¢~Ô›~Ô”~Ô~Ô†~Ô~Ôx~Ôq~Ôj~Ôc~Ô\~ÔU~ÔN~ÔG~Ô@~Ô9~Ô2~Ô+~Ô$~Ô~Ô~Ô~Ô~Ô~Ôú}Ôó}Ôì}Ôå}ÔÞ}Ô×}ÔÐ}ÔÉ}ÔÂ}Ô»}Ô´}Ô­}Ô¦}ÔŸ}Ô˜}Ô‘}ÔŠ}Ôƒ}Ô|}Ôu}Ôn}Ôg}Ô`}ÔY}ÔR}ÔK}ÔD}Ô=}Ô6}Ô/}Ô(}Ô!}Ô}Ô}Ô }Ô}Ôþ|Ô÷|Ôð|Ôé|Ôâ|ÔÛ|ÔÔ|ÔÍ|ÔÆ|Ô¿|Ô¸|Ô±|Ôª|Ô£|Ôœ|Ô•|ÔŽ|Ô‡|Ô€|Ôy|Ôr|Ôk|Ôd|Ô]|ÔV|ÔO|ÔH|ÔA|Ô:|Ô3|Ô,|Ô%|Ô|Ô|Ô|Ô |Ô|Ôû{Ôô{Ôí{Ôæ{Ôß{ÔØ{ÔÑ{ÔÊ{ÔÃ{Ô¼{Ôµ{Ô®{Ô§{Ô {Ô™{Ô’{Ô‹{Ô„{Ô}{Ôv{Ôo{Ôh{Ôa{ÔZ{ÔS{ÔL{ÔE{Ô>{Ô7{Ô0{Ô){Ô"{Ô{Ô{Ô {Ô{ÔÿzÔøzÔñzÔêzÔãzÔÜzÔÕzÔÎzÔÇzÔÀzÔ¹zÔ²zÔ«zÔ¤zÔzÔ–zÔzÔˆzÔzÔzzÔszÔlzÔezÔ^zÔWzÔPzÔIzÔBzÔ;zÔ4zÔ-zÔ&zÔzÔzÔzÔ zÔzÔüyÔõyÔîyÔçyÔàyÔÙyÔÒyÔËyÔÄyÔ½yÔ¶yÔ¯yÔ¨yÔ¡yÔšyÔ“yÔŒyÔ…yÔ~yÔwyÔpyÔiyÔbyÔ[yÔTyÔMyÔFyÔ?yÔ8yÔ1yÔ*yÔ#yÔyÔyÔyÔyÔyÔùxÔòxÔëxÔäxÔÝxÔÖxÔÏxÔÈxÔÁxÔºxÔ³xÔ¬xÔ¥xÔžxÔ—xÔxÔ‰xÔ‚xÔ{xÔtxÔmxÔfxÔ_xÔXxÔQxÔJxÔCxÔtÔ7tÔ0tÔ)tÔ"tÔtÔtÔ tÔtÔÿsÔøsÔñsÔêsÔãsÔÜsÔÕsÔÎsÔÇsÔÀsÔ¹sÔ²sÔ«sÔ¤sÔsÔ–sÔsÔˆsÔsÔzsÔssÔlsÔesÔ^sÔWsÔPsÔIsÔBsÔ;sÔ4sÔ-sÔ&sÔsÔsÔsÔ sÔsÔürÔõrÔîrÔçrÔàrÔÙrÔÒrÔËrÔÄrÔ½rÔ¶rÔ¯rÔ¨rÔ¡rÔšrÔ“rÔŒrÔ…rÔ~rÔwrÔprÔirÔbrÔ[rÔTrÔMrÔFrÔ?rÔ8rÔ1rÔ*rÔ#rÔrÔrÔrÔrÔrÔùqÔòqÔëqÔäqÔÝqÔÖqÔÏqÔÈqÔÁqÔºqÔ³qÔ¬qÔ¥qÔžqÔ—qÔqÔ‰qÔ‚qÔ{qÔtqÔmqÔfqÔ_qÔXqÔQqÔJqÔCqÔmÔ7mÔ0mÔ)mÔ"mÔmÔmÔ mÔmÔÿlÔølÔñlÔêlÔãlÔÜlÔÕlÔÎlÔÇlÔÀlÔ¹lÔ²lÔ«lÔ¤lÔlÔ–lÔlÔˆlÔlÔzlÔslÔllÔelÔ^lÔWlÔPlÔIlÔBlÔ;lÔ4lÔ-lÔ&lÔlÔlÔlÔ lÔlÔükÔõkÔîkÔçkÔàkÔÙkÔÒkÔËkÔÄkÔ½kÔ¶kÔ¯kÔ¨kÔ¡kÔškÔ“kÔŒkÔ…kÔ~kÔwkÔpkÔikÔbkÔ[kÔTkÔMkÔFkÔ?kÔ8kÔ1kÔ*kÔ#kÔkÔkÔkÔkÔkÔùjÔòjÔëjÔäjÔÝjÔÖjÔÏjÔÈjÔÁjÔºjÔ³jÔ¬jÔ¥jÔžjÔ—jÔjÔ‰jÔ‚jÔ{jÔtjÔmjÔfjÔ_jÔXjÔQjÔJjÔCjÔfÔ7fÔ0fÔ)fÔ"fÔfÔfÔ fÔfÔÿeÔøeÔñeÔêeÔãeÔÜeÔÕeÔÎeÔÇeÔÀeÔ¹eÔ²eÔ«eÔ¤eÔeÔ–eÔeÔˆeÔeÔzeÔseÔleÔeeÔ^eÔWeÔPeÔIeÔBeÔ;eÔ4eÔ-eÔ&eÔeÔeÔeÔ eÔeÔüdÔõdÔîdÔçdÔàdÔÙdÔÒdÔËdÔÄdÔ½dÔ¶dÔ¯dÔ¨dÔ¡dÔšdÔ“dÔŒdÔ…dÔ~dÔwdÔpdÔidÔbdÔ[dÔTdÔMdÔFdÔ?dÔ8dÔ1dÔ*dÔ#dÔdÔdÔdÔdÔdÔùcÔòcÔëcÔäcÔÝcÔÖcÔÏcÔÈcÔÁcÔºcÔ³cÔ¬cÔ¥cÔžcÔ—cÔcÔ‰cÔ‚cÔ{cÔtcÔmcÔfcÔ_cÔXcÔQcÔJcÔCcÔ_Ô7_Ô0_Ô)_Ô"_Ô_Ô_Ô _Ô_Ôÿ^Ôø^Ôñ^Ôê^Ôã^ÔÜ^ÔÕ^ÔÎ^ÔÇ^ÔÀ^Ô¹^Ô²^Ô«^Ô¤^Ô^Ô–^Ô^Ôˆ^Ô^Ôz^Ôs^Ôl^Ôe^Ô^^ÔW^ÔP^ÔI^ÔB^Ô;^Ô4^Ô-^Ô&^Ô^Ô^Ô^Ô ^Ô^Ôü]Ôõ]Ôî]Ôç]Ôà]ÔÙ]ÔÒ]ÔË]ÔÄ]Ô½]Ô¶]Ô¯]Ô¨]Ô¡]Ôš]Ô“]ÔŒ]Ô…]Ô~]Ôw]Ôp]Ôi]Ôb]Ô[]ÔT]ÔM]ÔF]Ô?]Ô8]Ô1]Ô*]Ô#]Ô]Ô]Ô]Ô]Ô]Ôù\Ôò\Ôë\Ôä\ÔÝ\ÔÖ\ÔÏ\ÔÈ\ÔÁ\Ôº\Ô³\Ô¬\Ô¥\Ôž\Ô—\Ô\Ô‰\Ô‚\Ô{\Ôt\Ôm\Ôf\Ô_\ÔX\ÔQ\ÔJ\ÔC\Ô<\Ô5\Ô.\Ô'\Ô \Ô\Ô\Ô \Ô\Ôý[Ôö[Ôï[Ôè[Ôá[ÔÚ[ÔÓ[ÔÌ[ÔÅ[Ô¾[Ô·[Ô°[Ô©[Ô¢[Ô›[Ô”[Ô[Ô†[Ô[Ôx[Ôq[Ôj[Ôc[Ô\[ÔU[ÔN[ÔG[Ô@[Ô9[Ô2[Ô+[Ô$[Ô[Ô[Ô[Ô[Ô[ÔúZÔóZÔìZÔåZÔÞZÔ×ZÔÐZÔÉZÔÂZÔ»ZÔ´ZÔ­ZÔ¦ZÔŸZÔ˜ZÔ‘ZÔŠZÔƒZÔ|ZÔuZÔnZÔgZÔ`ZÔYZÔRZÔKZÔDZÔ=ZÔ6ZÔ/ZÔ(ZÔ!ZÔZÔZÔ ZÔZÔþYÔ÷YÔðYÔéYÔâYÔÛYÔÔYÔÍYÔÆYÔ¿YÔ¸YÔ±YÔªYÔ£YÔœYÔ•YÔŽYÔ‡YÔ€YÔyYÔrYÔkYÔdYÔ]YÔVYÔOYÔHYÔAYÔ:YÔ3YÔ,YÔ%YÔYÔYÔYÔ YÔYÔûXÔôXÔíXÔæXÔßXÔØXÔÑXÔÊXÔÃXÔ¼XÔµXÔ®XÔ§XÔ XÔ™XÔ’XÔ‹XÔ„XÔ}XÔvXÔoXÔhXÔaXÔZXÔSXÔLXÔEXÔ>XÔ7XÔ0XÔ)XÔ"XÔXÔXÔ XÔXÔÿWÔøWÔñWÔêWÔãWÔÜWÔÕWÔÎWÔÇWÔÀWÔ¹WÔ²WÔ«WÔ¤WÔWÔ–WÔWÔˆWÔWÔzWÔsWÔlWÔeWÔ^WÔWWÔPWÔIWÔBWÔ;WÔ4WÔ-WÔ&WÔWÔWÔWÔ WÔWÔüVÔõVÔîVÔçVÔàVÔÙVÔÒVÔËVÔÄVÔ½VÔ¶VÔ¯VÔ¨VÔ¡VÔšVÔ“VÔŒVÔ…VÔ~VÔwVÔpVÔiVÔbVÔ[VÔTVÔMVÔFVÔ?VÔ8VÔ1VÔ*VÔ#VÔVÔVÔVÔVÔVÔùUÔòUÔëUÔäUÔÝUÔÖUÔÏUÔÈUÔÁUÔºUÔ³UÔ¬UÔ¥UÔžUÔ—UÔUÔ‰UÔ‚UÔ{UÔtUÔmUÔfUÔ_UÔXUÔQUÔJUÔCUÔQÔ7QÔ0QÔ)QÔ"QÔQÔQÔ QÔQÔÿPÔøPÔñPÔêPÔãPÔÜPÔÕPÔÎPÔÇPÔÀPÔ¹PÔ²PÔ«PÔ¤PÔPÔ–PÔPÔˆPÔPÔzPÔsPÔlPÔePÔ^PÔWPÔPPÔIPÔBPÔ;PÔ4PÔ-PÔ&PÔPÔPÔPÔ PÔPÔüOÔõOÔîOÔçOÔàOÔÙOÔÒOÔËOÔÄOÔ½OÔ¶OÔ¯OÔ¨OÔ¡OÔšOÔ“OÔŒOÔ…OÔ~OÔwOÔpOÔiOÔbOÔ[OÔTOÔMOÔFOÔ?OÔ8OÔ1OÔ*OÔ#OÔOÔOÔOÔOÔOÔùNÔòNÔëNÔäNÔÝNÔÖNÔÏNÔÈNÔÁNÔºNÔ³NÔ¬NÔ¥NÔžNÔ—NÔNÔ‰NÔ‚NÔ{NÔtNÔmNÔfNÔ_NÔXNÔQNÔJNÔCNÔJÔ7JÔ0JÔ)JÔ"JÔJÔJÔ JÔJÔÿIÔøIÔñIÔêIÔãIÔÜIÔÕIÔÎIÔÇIÔÀIÔ¹IÔ²IÔ«IÔ¤IÔIÔ–IÔIÔˆIÔIÔzIÔsIÔlIÔeIÔ^IÔWIÔPIÔIIÔBIÔ;IÔ4IÔ-IÔ&IÔIÔIÔIÔ IÔIÔüHÔõHÔîHÔçHÔàHÔÙHÔÒHÔËHÔÄHÔ½HÔ¶HÔ¯HÔ¨HÔ¡HÔšHÔ“HÔŒHÔ…HÔ~HÔwHÔpHÔiHÔbHÔ[HÔTHÔMHÔFHÔ?HÔ8HÔ1HÔ*HÔ#HÔHÔHÔHÔHÔHÔùGÔòGÔëGÔäGÔÝGÔÖGÔÏGÔÈGÔÁGÔºGÔ³GÔ¬GÔ¥GÔžGÔ—GÔGÔ‰GÔ‚GÔ{GÔtGÔmGÔfGÔ_GÔXGÔQGÔJGÔCGÔCÔ7CÔ0CÔ)CÔ"CÔCÔCÔ CÔCÔÿBÔøBÔñBÔêBÔãBÔÜBÔÕBÔÎBÔÇBÔÀBÔ¹BÔ²BÔ«BÔ¤BÔBÔ–BÔBÔˆBÔBÔzBÔsBÔlBÔeBÔ^BÔWBÔPBÔIBÔBBÔ;BÔ4BÔ-BÔ&BÔBÔBÔBÔ BÔBÔüAÔõAÔîAÔçAÔàAÔÙAÔÒAÔËAÔÄAÔ½AÔ¶AÔ¯AÔ¨AÔ¡AÔšAÔ“AÔŒAÔ…AÔ~AÔwAÔpAÔiAÔbAÔ[AÔTAÔMAÔFAÔ?AÔ8AÔ1AÔ*AÔ#AÔAÔAÔAÔAÔAÔù@Ôò@Ôë@Ôä@ÔÝ@ÔÖ@ÔÏ@ÔÈ@ÔÁ@Ôº@Ô³@Ô¬@Ô¥@Ôž@Ô—@Ô@Ô‰@Ô‚@Ô{@Ôt@Ôm@Ôf@Ô_@ÔX@ÔQ@ÔJ@ÔC@Ô<@Ô5@Ô.@Ô'@Ô @Ô@Ô@Ô @Ô@Ôý?Ôö?Ôï?Ôè?Ôá?ÔÚ?ÔÓ?ÔÌ?ÔÅ?Ô¾?Ô·?Ô°?Ô©?Ô¢?Ô›?Ô”?Ô?Ô†?Ô?Ôx?Ôq?Ôj?Ôc?Ô\?ÔU?ÔN?ÔG?Ô@?Ô9?Ô2?Ô+?Ô$?Ô?Ô?Ô?Ô?Ô?Ôú>Ôó>Ôì>Ôå>ÔÞ>Ô×>ÔÐ>ÔÉ>ÔÂ>Ô»>Ô´>Ô­>Ô¦>ÔŸ>Ô˜>Ô‘>ÔŠ>Ôƒ>Ô|>Ôu>Ôn>Ôg>Ô`>ÔY>ÔR>ÔK>ÔD>Ô=>Ô6>Ô/>Ô(>Ô!>Ô>Ô>Ô >Ô>Ôþ=Ô÷=Ôð=Ôé=Ôâ=ÔÛ=ÔÔ=ÔÍ=ÔÆ=Ô¿=Ô¸=Ô±=Ôª=Ô£=Ôœ=Ô•=ÔŽ=Ô‡=Ô€=Ôy=Ôr=Ôk=Ôd=Ô]=ÔV=ÔO=ÔH=ÔA=Ô:=Ô3=Ô,=Ô%=Ô=Ô=Ô=Ô =Ô=Ôû<Ôô<Ôí<Ôæ<Ôß<ÔØ<ÔÑ<ÔÊ<ÔÃ<Ô¼<Ôµ<Ô®<Ô§<Ô <Ô™<Ô’<Ô‹<Ô„<Ô}<Ôv<Ôo<Ôh<Ôa<ÔZ<ÔS<ÔL<ÔE<Ô><Ô7<Ô0<Ô)<Ô"<Ô<Ô<Ô <Ô<Ôÿ;Ôø;Ôñ;Ôê;Ôã;ÔÜ;ÔÕ;ÔÎ;ÔÇ;ÔÀ;Ô¹;Ô²;Ô«;Ô¤;Ô;Ô–;Ô;Ôˆ;Ô;Ôz;Ôs;Ôl;Ôe;Ô^;ÔW;ÔP;ÔI;ÔB;Ô;;Ô4;Ô-;Ô&;Ô;Ô;Ô;Ô ;Ô;Ôü:Ôõ:Ôî:Ôç:Ôà:ÔÙ:ÔÒ:ÔË:ÔÄ:Ô½:Ô¶:Ô¯:Ô¨:Ô¡:Ôš:Ô“:ÔŒ:Ô…:Ô~:Ôw:Ôp:Ôi:Ôb:Ô[:ÔT:ÔM:ÔF:Ô?:Ô8:Ô1:Ô*:Ô#:Ô:Ô:Ô:Ô:Ô:Ôù9Ôò9Ôë9Ôä9ÔÝ9ÔÖ9ÔÏ9ÔÈ9ÔÁ9Ôº9Ô³9Ô¬9Ô¥9Ôž9Ô—9Ô9Ô‰9Ô‚9Ô{9Ôt9Ôm9Ôf9Ô_9ÔX9ÔQ9ÔJ9ÔC9Ô<9Ô59Ô.9Ô'9Ô 9Ô9Ô9Ô 9Ô9Ôý8Ôö8Ôï8Ôè8Ôá8ÔÚ8ÔÓ8ÔÌ8ÔÅ8Ô¾8Ô·8Ô°8Ô©8Ô¢8Ô›8Ô”8Ô8Ô†8Ô8Ôx8Ôq8Ôj8Ôc8Ô\8ÔU8ÔN8ÔG8Ô@8Ô98Ô28Ô+8Ô$8Ô8Ô8Ô8Ô8Ô8Ôú7Ôó7Ôì7Ôå7ÔÞ7Ô×7ÔÐ7ÔÉ7ÔÂ7Ô»7Ô´7Ô­7Ô¦7ÔŸ7Ô˜7Ô‘7ÔŠ7Ôƒ7Ô|7Ôu7Ôn7Ôg7Ô`7ÔY7ÔR7ÔK7ÔD7Ô=7Ô67Ô/7Ô(7Ô!7Ô7Ô7Ô 7Ô7Ôþ6Ô÷6Ôð6Ôé6Ôâ6ÔÛ6ÔÔ6ÔÍ6ÔÆ6Ô¿6Ô¸6Ô±6Ôª6Ô£6Ôœ6Ô•6ÔŽ6Ô‡6Ô€6Ôy6Ôr6Ôk6Ôd6Ô]6ÔV6ÔO6ÔH6ÔA6Ô:6Ô36Ô,6Ô%6Ô6Ô6Ô6Ô 6Ô6Ôû5Ôô5Ôí5Ôæ5Ôß5ÔØ5ÔÑ5ÔÊ5ÔÃ5Ô¼5Ôµ5Ô®5Ô§5Ô 5Ô™5Ô’5Ô‹5Ô„5Ô}5Ôv5Ôo5Ôh5Ôa5ÔZ5ÔS5ÔL5ÔE5Ô>5Ô75Ô05Ô)5Ô"5Ô5Ô5Ô 5Ô5Ôÿ4Ôø4Ôñ4Ôê4Ôã4ÔÜ4ÔÕ4ÔÎ4ÔÇ4ÔÀ4Ô¹4Ô²4Ô«4Ô¤4Ô4Ô–4Ô4Ôˆ4Ô4Ôz4Ôs4Ôl4Ôe4Ô^4ÔW4ÔP4ÔI4ÔB4Ô;4Ô44Ô-4Ô&4Ô4Ô4Ô4Ô 4Ô4Ôü3Ôõ3Ôî3Ôç3Ôà3ÔÙ3ÔÒ3ÔË3ÔÄ3Ô½3Ô¶3Ô¯3Ô¨3Ô¡3Ôš3Ô“3ÔŒ3Ô…3Ô~3Ôw3Ôp3Ôi3Ôb3Ô[3ÔT3ÔM3ÔF3Ô?3Ô83Ô13Ô*3Ô#3Ô3Ô3Ô3Ô3Ô3Ôù2Ôò2Ôë2Ôä2ÔÝ2ÔÖ2ÔÏ2ÔÈ2ÔÁ2Ôº2Ô³2Ô¬2Ô¥2Ôž2Ô—2Ô2Ô‰2Ô‚2Ô{2Ôt2Ôm2Ôf2Ô_2ÔX2ÔQ2ÔJ2ÔC2Ô<2Ô52Ô.2Ô'2Ô 2Ô2Ô2Ô 2Ô2Ôý1Ôö1Ôï1Ôè1Ôá1ÔÚ1ÔÓ1ÔÌ1ÔÅ1Ô¾1Ô·1Ô°1Ô©1Ô¢1Ô›1Ô”1Ô1Ô†1Ô1Ôx1Ôq1Ôj1Ôc1Ô\1ÔU1ÔN1ÔG1Ô@1Ô91Ô21Ô+1Ô$1Ô1Ô1Ô1Ô1Ô1Ôú0Ôó0Ôì0Ôå0ÔÞ0Ô×0ÔÐ0ÔÉ0ÔÂ0Ô»0Ô´0Ô­0Ô¦0ÔŸ0Ô˜0Ô‘0ÔŠ0Ôƒ0Ô|0Ôu0Ôn0Ôg0Ô`0ÔY0ÔR0ÔK0ÔD0Ô=0Ô60Ô/0Ô(0Ô!0Ô0Ô0Ô 0Ô0Ôþ/Ô÷/Ôð/Ôé/Ôâ/ÔÛ/ÔÔ/ÔÍ/ÔÆ/Ô¿/Ô¸/Ô±/Ôª/Ô£/Ôœ/Ô•/ÔŽ/Ô‡/Ô€/Ôy/Ôr/Ôk/Ôd/Ô]/ÔV/ÔO/ÔH/ÔA/Ô:/Ô3/Ô,/Ô%/Ô/Ô/Ô/Ô /Ô/Ôû.Ôô.Ôí.Ôæ.Ôß.ÔØ.ÔÑ.ÔÊ.ÔÃ.Ô¼.Ôµ.Ô®.Ô§.Ô .Ô™.Ô’.Ô‹.Ô„.Ô}.Ôv.Ôo.Ôh.Ôa.ÔZ.ÔS.ÔL.ÔE.Ô>.Ô7.Ô0.Ô).Ô".Ô.Ô.Ô .Ô.Ôÿ-Ôø-Ôñ-Ôê-Ôã-ÔÜ-ÔÕ-ÔÎ-ÔÇ-ÔÀ-Ô¹-Ô²-Ô«-Ô¤-Ô-Ô–-Ô-Ôˆ-Ô-Ôz-Ôs-Ôl-Ôe-Ô^-ÔW-ÔP-ÔI-ÔB-Ô;-Ô4-Ô--Ô&-Ô-Ô-Ô-Ô -Ô-Ôü,Ôõ,Ôî,Ôç,Ôà,ÔÙ,ÔÒ,ÔË,ÔÄ,Ô½,Ô¶,Ô¯,Ô¨,Ô¡,Ôš,Ô“,ÔŒ,Ô…,Ô~,Ôw,Ôp,Ôi,Ôb,Ô[,ÔT,ÔM,ÔF,Ô?,Ô8,Ô1,Ô*,Ô#,Ô,Ô,Ô,Ô,Ô,Ôù+Ôò+Ôë+Ôä+ÔÝ+ÔÖ+ÔÏ+ÔÈ+ÔÁ+Ôº+Ô³+Ô¬+Ô¥+Ôž+Ô—+Ô+Ô‰+Ô‚+Ô{+Ôt+Ôm+Ôf+Ô_+ÔX+ÔQ+ÔJ+ÔC+Ô<+Ô5+Ô.+Ô'+Ô +Ô+Ô+Ô +Ô+Ôý*Ôö*Ôï*Ôè*Ôá*ÔÚ*ÔÓ*ÔÌ*ÔÅ*Ô¾*Ô·*Ô°*Ô©*Ô¢*Ô›*Ô”*Ô*Ô†*Ô*Ôx*Ôq*Ôj*Ôc*Ô\*ÔU*ÔN*ÔG*Ô@*Ô9*Ô2*Ô+*Ô$*Ô*Ô*Ô*Ô*Ô*Ôú)Ôó)Ôì)Ôå)ÔÞ)Ô×)ÔÐ)ÔÉ)ÔÂ)Ô»)Ô´)Ô­)Ô¦)ÔŸ)Ô˜)Ô‘)ÔŠ)Ôƒ)Ô|)Ôu)Ôn)Ôg)Ô`)ÔY)ÔR)ÔK)ÔD)Ô=)Ô6)Ô/)Ô()Ô!)Ô)Ô)Ô )Ô)Ôþ(Ô÷(Ôð(Ôé(Ôâ(ÔÛ(ÔÔ(ÔÍ(ÔÆ(Ô¿(Ô¸(Ô±(Ôª(Ô£(Ôœ(Ô•(ÔŽ(Ô‡(Ô€(Ôy(Ôr(Ôk(Ôd(Ô](ÔV(ÔO(ÔH(ÔA(Ô:(Ô3(Ô,(Ô%(Ô(Ô(Ô(Ô (Ô(Ôû'Ôô'Ôí'Ôæ'Ôß'ÔØ'ÔÑ'ÔÊ'ÔÃ'Ô¼'Ôµ'Ô®'Ô§'Ô 'Ô™'Ô’'Ô‹'Ô„'Ô}'Ôv'Ôo'Ôh'Ôa'ÔZ'ÔS'ÔL'ÔE'Ô>'Ô7'Ô0'Ô)'Ô"'Ô'Ô'Ô 'Ô'Ôÿ&Ôø&Ôñ&Ôê&Ôã&ÔÜ&ÔÕ&ÔÎ&ÔÇ&ÔÀ&Ô¹&Ô²&Ô«&Ô¤&Ô&Ô–&Ô&Ôˆ&Ô&Ôz&Ôs&Ôl&Ôe&Ô^&ÔW&ÔP&ÔI&ÔB&Ô;&Ô4&Ô-&Ô&&Ô&Ô&Ô&Ô &Ô&Ôü%Ôõ%Ôî%Ôç%Ôà%ÔÙ%ÔÒ%ÔË%ÔÄ%Ô½%Ô¶%Ô¯%Ô¨%Ô¡%Ôš%Ô“%ÔŒ%Ô…%Ô~%Ôw%Ôp%Ôi%Ôb%Ô[%ÔT%ÔM%ÔF%Ô?%Ô8%Ô1%Ô*%Ô#%Ô%Ô%Ô%Ô%Ô%Ôù$Ôò$Ôë$Ôä$ÔÝ$ÔÖ$ÔÏ$ÔÈ$ÔÁ$Ôº$Ô³$Ô¬$Ô¥$Ôž$Ô—$Ô$Ô‰$Ô‚$Ô{$Ôt$Ôm$Ôf$Ô_$ÔX$ÔQ$ÔJ$ÔC$Ô<$Ô5$Ô.$Ô'$Ô $Ô$Ô$Ô $Ô$Ôý#Ôö#Ôï#Ôè#Ôá#ÔÚ#ÔÓ#ÔÌ#ÔÅ#Ô¾#Ô·#Ô°#Ô©#Ô¢#Ô›#Ô”#Ô#Ô†#Ô#Ôx#Ôq#Ôj#Ôc#Ô\#ÔU#ÔN#ÔG#Ô@#Ô9#Ô2#Ô+#Ô$#Ô#Ô#Ô#Ô#Ô#Ôú"Ôó"Ôì"Ôå"ÔÞ"Ô×"ÔÐ"ÔÉ"ÔÂ"Ô»"Ô´"Ô­"Ô¦"ÔŸ"Ô˜"Ô‘"ÔŠ"Ôƒ"Ô|"Ôu"Ôn"Ôg"Ô`"ÔY"ÔR"ÔK"ÔD"Ô="Ô6"Ô/"Ô("Ô!"Ô"Ô"Ô "Ô"Ôþ!Ô÷!Ôð!Ôé!Ôâ!ÔÛ!ÔÔ!ÔÍ!ÔÆ!Ô¿!Ô¸!Ô±!Ôª!Ô£!Ôœ!Ô•!ÔŽ!Ô‡!Ô€!Ôy!Ôr!Ôk!Ôd!Ô]!ÔV!ÔO!ÔH!ÔA!Ô:!Ô3!Ô,!Ô%!Ô!Ô!Ô!Ô !Ô!Ôû Ôô Ôí Ôæ Ôß ÔØ ÔÑ ÔÊ Ôà Ô¼ Ôµ Ô® Ô§ Ô  Ô™ Ô’ Ô‹ Ô„ Ô} Ôv Ôo Ôh Ôa ÔZ ÔS ÔL ÔE Ô> Ô7 Ô0 Ô) Ô" Ô Ô Ô Ô ÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔú Ôó Ôì Ôå ÔÞ Ô× ÔÐ ÔÉ Ô Ô» Ô´ Ô­ Ô¦ ÔŸ Ô˜ Ô‘ ÔŠ Ôƒ Ô| Ôu Ôn Ôg Ô` ÔY ÔR ÔK ÔD Ô= Ô6 Ô/ Ô( Ô! Ô Ô Ô Ô Ôþ Ô÷ Ôð Ôé Ôâ ÔÛ ÔÔ ÔÍ ÔÆ Ô¿ Ô¸ Ô± Ôª Ô£ Ôœ Ô• ÔŽ Ô‡ Ô€ Ôy Ôr Ôk Ôd Ô] ÔV ÔO ÔH ÔA Ô: Ô3 Ô, Ô% Ô Ô Ô Ô Ô Ôû Ôô Ôí Ôæ Ôß ÔØ ÔÑ ÔÊ Ôà Ô¼ Ôµ Ô® Ô§ Ô  Ô™ Ô’ Ô‹ Ô„ Ô} Ôv Ôo Ôh Ôa ÔZ ÔS ÔL ÔE Ô> Ô7 Ô0 Ô) Ô" Ô Ô Ô Ô Ôÿ Ôø Ôñ Ôê Ôã ÔÜ ÔÕ ÔÎ ÔÇ ÔÀ Ô¹ Ô² Ô« Ô¤ Ô Ô– Ô Ôˆ Ô Ôz Ôs Ôl Ôe Ô^ ÔW ÔP ÔI ÔB Ô; Ô4 Ô- Ô& Ô Ô Ô Ô Ô Ôü Ôõ Ôî Ôç Ôà ÔÙ ÔÒ ÔË ÔÄ Ô½ Ô¶ Ô¯ Ô¨ Ô¡ Ôš Ô“ ÔŒ Ô… Ô~ Ôw Ôp Ôi Ôb Ô[ ÔT ÔM ÔF Ô? Ô8 Ô1 Ô* Ô# Ô Ô Ô Ô Ô ÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÿÓóÿÓìÿÓåÿÓÞÿÓ×ÿÓÐÿÓÉÿÓÂÿÓ»ÿÓ´ÿÓ­ÿÓ¦ÿÓŸÿÓ˜ÿÓ‘ÿÓŠÿÓƒÿÓ|ÿÓuÿÓnÿÓgÿÓ`ÿÓYÿÓRÿÓKÿÓDÿÓ=ÿÓ6ÿÓ/ÿÓ(ÿÓ!ÿÓÿÓÿÓ ÿÓÿÓþþÓ÷þÓðþÓéþÓâþÓÛþÓÔþÓÍþÓÆþÓ¿þÓ¸þÓ±þÓªþÓ£þÓœþÓ•þÓŽþÓ‡þÓ€þÓyþÓrþÓkþÓdþÓ]þÓVþÓOþÓHþÓAþÓ:þÓ3þÓ,þÓ%þÓþÓþÓþÓ þÓþÓûýÓôýÓíýÓæýÓßýÓØýÓÑýÓÊýÓÃýÓ¼ýÓµýÓ®ýÓ§ýÓ ýÓ™ýÓ’ýÓ‹ýÓ„ýÓ}ýÓvýÓoýÓhýÓaýÓZýÓSýÓLýÓEýÓ>ýÓ7ýÓ0ýÓ)ýÓ"ýÓýÓýÓ ýÓýÓÿüÓøüÓñüÓêüÓãüÓÜüÓÕüÓÎüÓÇüÓÀüÓ¹üÓ²üÓ«üÓ¤üÓüÓ–üÓüÓˆüÓüÓzüÓsüÓlüÓeüÓ^üÓWüÓPüÓIüÓBüÓ;üÓ4üÓ-üÓ&üÓüÓüÓüÓ üÓüÓüûÓõûÓîûÓçûÓàûÓÙûÓÒûÓËûÓÄûÓ½ûÓ¶ûÓ¯ûÓ¨ûÓ¡ûÓšûÓ“ûÓŒûÓ…ûÓ~ûÓwûÓpûÓiûÓbûÓ[ûÓTûÓMûÓFûÓ?ûÓ8ûÓ1ûÓ*ûÓ#ûÓûÓûÓûÓûÓûÓùúÓòúÓëúÓäúÓÝúÓÖúÓÏúÓÈúÓÁúÓºúÓ³úÓ¬úÓ¥úÓžúÓ—úÓúÓ‰úÓ‚úÓ{úÓtúÓmúÓfúÓ_úÓXúÓQúÓJúÓCúÓ<úÓ5úÓ.úÓ'úÓ úÓúÓúÓ úÓúÓýùÓöùÓïùÓèùÓáùÓÚùÓÓùÓÌùÓÅùÓ¾ùÓ·ùÓ°ùÓ©ùÓ¢ùÓ›ùÓ”ùÓùÓ†ùÓùÓxùÓqùÓjùÓcùÓ\ùÓUùÓNùÓGùÓ@ùÓ9ùÓ2ùÓ+ùÓ$ùÓùÓùÓùÓùÓùÓúøÓóøÓìøÓåøÓÞøÓ×øÓÐøÓÉøÓÂøÓ»øÓ´øÓ­øÓ¦øÓŸøÓ˜øÓ‘øÓŠøÓƒøÓ|øÓuøÓnøÓgøÓ`øÓYøÓRøÓKøÓDøÓ=øÓ6øÓ/øÓ(øÓ!øÓøÓøÓ øÓøÓþ÷Ó÷÷Óð÷Óé÷Óâ÷ÓÛ÷ÓÔ÷ÓÍ÷ÓÆ÷Ó¿÷Ó¸÷Ó±÷Óª÷Ó£÷Óœ÷Ó•÷ÓŽ÷Ó‡÷Ó€÷Óy÷Ór÷Ók÷Ód÷Ó]÷ÓV÷ÓO÷ÓH÷ÓA÷Ó:÷Ó3÷Ó,÷Ó%÷Ó÷Ó÷Ó÷Ó ÷Ó÷ÓûöÓôöÓíöÓæöÓßöÓØöÓÑöÓÊöÓÃöÓ¼öÓµöÓ®öÓ§öÓ öÓ™öÓ’öÓ‹öÓ„öÓ}öÓvöÓoöÓhöÓaöÓZöÓSöÓLöÓEöÓ>öÓ7öÓ0öÓ)öÓ"öÓöÓöÓ öÓöÓÿõÓøõÓñõÓêõÓãõÓÜõÓÕõÓÎõÓÇõÓÀõÓ¹õÓ²õÓ«õÓ¤õÓõÓ–õÓõÓˆõÓõÓzõÓsõÓlõÓeõÓ^õÓWõÓPõÓIõÓBõÓ;õÓ4õÓ-õÓ&õÓõÓõÓõÓ õÓõÓüôÓõôÓîôÓçôÓàôÓÙôÓÒôÓËôÓÄôÓ½ôÓ¶ôÓ¯ôÓ¨ôÓ¡ôÓšôÓ“ôÓŒôÓ…ôÓ~ôÓwôÓpôÓiôÓbôÓ[ôÓTôÓMôÓFôÓ?ôÓ8ôÓ1ôÓ*ôÓ#ôÓôÓôÓôÓôÓôÓùóÓòóÓëóÓäóÓÝóÓÖóÓÏóÓÈóÓÁóÓºóÓ³óÓ¬óÓ¥óÓžóÓ—óÓóÓ‰óÓ‚óÓ{óÓtóÓmóÓfóÓ_óÓXóÓQóÓJóÓCóÓ<óÓ5óÓ.óÓ'óÓ óÓóÓóÓ óÓóÓýòÓöòÓïòÓèòÓáòÓÚòÓÓòÓÌòÓÅòÓ¾òÓ·òÓ°òÓ©òÓ¢òÓ›òÓ”òÓòÓ†òÓòÓxòÓqòÓjòÓcòÓ\òÓUòÓNòÓGòÓ@òÓ9òÓ2òÓ+òÓ$òÓòÓòÓòÓòÓòÓúñÓóñÓìñÓåñÓÞñÓ×ñÓÐñÓÉñÓÂñÓ»ñÓ´ñÓ­ñÓ¦ñÓŸñÓ˜ñÓ‘ñÓŠñÓƒñÓ|ñÓuñÓnñÓgñÓ`ñÓYñÓRñÓKñÓDñÓ=ñÓ6ñÓ/ñÓ(ñÓ!ñÓñÓñÓ ñÓñÓþðÓ÷ðÓððÓéðÓâðÓÛðÓÔðÓÍðÓÆðÓ¿ðÓ¸ðÓ±ðÓªðÓ£ðÓœðÓ•ðÓŽðÓ‡ðÓ€ðÓyðÓrðÓkðÓdðÓ]ðÓVðÓOðÓHðÓAðÓ:ðÓ3ðÓ,ðÓ%ðÓðÓðÓðÓ ðÓðÓûïÓôïÓíïÓæïÓßïÓØïÓÑïÓÊïÓÃïÓ¼ïÓµïÓ®ïÓ§ïÓ ïÓ™ïÓ’ïÓ‹ïÓ„ïÓ}ïÓvïÓoïÓhïÓaïÓZïÓSïÓLïÓEïÓ>ïÓ7ïÓ0ïÓ)ïÓ"ïÓïÓïÓ ïÓïÓÿîÓøîÓñîÓêîÓãîÓÜîÓÕîÓÎîÓÇîÓÀîÓ¹îÓ²îÓ«îÓ¤îÓîÓ–îÓîÓˆîÓîÓzîÓsîÓlîÓeîÓ^îÓWîÓPîÓIîÓBîÓ;îÓ4îÓ-îÓ&îÓîÓîÓîÓ îÓîÓüíÓõíÓîíÓçíÓàíÓÙíÓÒíÓËíÓÄíÓ½íÓ¶íÓ¯íÓ¨íÓ¡íÓšíÓ“íÓŒíÓ…íÓ~íÓwíÓpíÓiíÓbíÓ[íÓTíÓMíÓFíÓ?íÓ8íÓ1íÓ*íÓ#íÓíÓíÓíÓíÓíÓùìÓòìÓëìÓäìÓÝìÓÖìÓÏìÓÈìÓÁìÓºìÓ³ìÓ¬ìÓ¥ìÓžìÓ—ìÓìÓ‰ìÓ‚ìÓ{ìÓtìÓmìÓfìÓ_ìÓXìÓQìÓJìÓCìÓ<ìÓ5ìÓ.ìÓ'ìÓ ìÓìÓìÓ ìÓìÓýëÓöëÓïëÓèëÓáëÓÚëÓÓëÓÌëÓÅëÓ¾ëÓ·ëÓ°ëÓ©ëÓ¢ëÓ›ëÓ”ëÓëÓ†ëÓëÓxëÓqëÓjëÓcëÓ\ëÓUëÓNëÓGëÓ@ëÓ9ëÓ2ëÓ+ëÓ$ëÓëÓëÓëÓëÓëÓúêÓóêÓìêÓåêÓÞêÓ×êÓÐêÓÉêÓÂêÓ»êÓ´êÓ­êÓ¦êÓŸêÓ˜êÓ‘êÓŠêÓƒêÓ|êÓuêÓnêÓgêÓ`êÓYêÓRêÓKêÓDêÓ=êÓ6êÓ/êÓ(êÓ!êÓêÓêÓ êÓêÓþéÓ÷éÓðéÓééÓâéÓÛéÓÔéÓÍéÓÆéÓ¿éÓ¸éÓ±éÓªéÓ£éÓœéÓ•éÓŽéÓ‡éÓ€éÓyéÓréÓkéÓdéÓ]éÓVéÓOéÓHéÓAéÓ:éÓ3éÓ,éÓ%éÓéÓéÓéÓ éÓéÓûèÓôèÓíèÓæèÓßèÓØèÓÑèÓÊèÓÃèÓ¼èÓµèÓ®èÓ§èÓ èÓ™èÓ’èÓ‹èÓ„èÓ}èÓvèÓoèÓhèÓaèÓZèÓSèÓLèÓEèÓ>èÓ7èÓ0èÓ)èÓ"èÓèÓèÓ èÓèÓÿçÓøçÓñçÓêçÓãçÓÜçÓÕçÓÎçÓÇçÓÀçÓ¹çÓ²çÓ«çÓ¤çÓçÓ–çÓçÓˆçÓçÓzçÓsçÓlçÓeçÓ^çÓWçÓPçÓIçÓBçÓ;çÓ4çÓ-çÓ&çÓçÓçÓçÓ çÓçÓüæÓõæÓîæÓçæÓàæÓÙæÓÒæÓËæÓÄæÓ½æÓ¶æÓ¯æÓ¨æÓ¡æÓšæÓ“æÓŒæÓ…æÓ~æÓwæÓpæÓiæÓbæÓ[æÓTæÓMæÓFæÓ?æÓ8æÓ1æÓ*æÓ#æÓæÓæÓæÓæÓæÓùåÓòåÓëåÓäåÓÝåÓÖåÓÏåÓÈåÓÁåÓºåÓ³åÓ¬åÓ¥åÓžåÓ—åÓåÓ‰åÓ‚åÓ{åÓtåÓmåÓfåÓ_åÓXåÓQåÓJåÓCåÓ<åÓ5åÓ.åÓ'åÓ åÓåÓåÓ åÓåÓýäÓöäÓïäÓèäÓáäÓÚäÓÓäÓÌäÓÅäÓ¾äÓ·äÓ°äÓ©äÓ¢äÓ›äÓ”äÓäÓ†äÓäÓxäÓqäÓjäÓcäÓ\äÓUäÓNäÓGäÓ@äÓ9äÓ2äÓ+äÓ$äÓäÓäÓäÓäÓäÓúãÓóãÓìãÓåãÓÞãÓ×ãÓÐãÓÉãÓÂãÓ»ãÓ´ãÓ­ãÓ¦ãÓŸãÓ˜ãÓ‘ãÓŠãÓƒãÓ|ãÓuãÓnãÓgãÓ`ãÓYãÓRãÓKãÓDãÓ=ãÓ6ãÓ/ãÓ(ãÓ!ãÓãÓãÓ ãÓãÓþâÓ÷âÓðâÓéâÓââÓÛâÓÔâÓÍâÓÆâÓ¿âÓ¸âÓ±âÓªâÓ£âÓœâÓ•âÓŽâÓ‡âÓ€âÓyâÓrâÓkâÓdâÓ]âÓVâÓOâÓHâÓAâÓ:âÓ3âÓ,âÓ%âÓâÓâÓâÓ âÓâÓûáÓôáÓíáÓæáÓßáÓØáÓÑáÓÊáÓÃáÓ¼áÓµáÓ®áÓ§áÓ áÓ™áÓ’áÓ‹áÓ„áÓ}áÓváÓoáÓháÓaáÓZáÓSáÓLáÓEáÓ>áÓ7áÓ0áÓ)áÓ"áÓáÓáÓ áÓáÓÿàÓøàÓñàÓêàÓãàÓÜàÓÕàÓÎàÓÇàÓÀàÓ¹àÓ²àÓ«àÓ¤àÓàÓ–àÓàÓˆàÓàÓzàÓsàÓlàÓeàÓ^àÓWàÓPàÓIàÓBàÓ;àÓ4àÓ-àÓ&àÓàÓàÓàÓ àÓàÓüßÓõßÓîßÓçßÓàßÓÙßÓÒßÓËßÓÄßÓ½ßÓ¶ßÓ¯ßÓ¨ßÓ¡ßÓšßÓ“ßÓŒßÓ…ßÓ~ßÓwßÓpßÓißÓbßÓ[ßÓTßÓMßÓFßÓ?ßÓ8ßÓ1ßÓ*ßÓ#ßÓßÓßÓßÓßÓßÓùÞÓòÞÓëÞÓäÞÓÝÞÓÖÞÓÏÞÓÈÞÓÁÞÓºÞÓ³ÞÓ¬ÞÓ¥ÞÓžÞÓ—ÞÓÞÓ‰ÞÓ‚ÞÓ{ÞÓtÞÓmÞÓfÞÓ_ÞÓXÞÓQÞÓJÞÓCÞÓ<ÞÓ5ÞÓ.ÞÓ'ÞÓ ÞÓÞÓÞÓ ÞÓÞÓýÝÓöÝÓïÝÓèÝÓáÝÓÚÝÓÓÝÓÌÝÓÅÝÓ¾ÝÓ·ÝÓ°ÝÓ©ÝÓ¢ÝÓ›ÝÓ”ÝÓÝÓ†ÝÓÝÓxÝÓqÝÓjÝÓcÝÓ\ÝÓUÝÓNÝÓGÝÓ@ÝÓ9ÝÓ2ÝÓ+ÝÓ$ÝÓÝÓÝÓÝÓÝÓÝÓúÜÓóÜÓìÜÓåÜÓÞÜÓ×ÜÓÐÜÓÉÜÓÂÜÓ»ÜÓ´ÜÓ­ÜÓ¦ÜÓŸÜÓ˜ÜÓ‘ÜÓŠÜÓƒÜÓ|ÜÓuÜÓnÜÓgÜÓ`ÜÓYÜÓRÜÓKÜÓDÜÓ=ÜÓ6ÜÓ/ÜÓ(ÜÓ!ÜÓÜÓÜÓ ÜÓÜÓþÛÓ÷ÛÓðÛÓéÛÓâÛÓÛÛÓÔÛÓÍÛÓÆÛÓ¿ÛÓ¸ÛÓ±ÛÓªÛÓ£ÛÓœÛÓ•ÛÓŽÛÓ‡ÛÓ€ÛÓyÛÓrÛÓkÛÓdÛÓ]ÛÓVÛÓOÛÓHÛÓAÛÓ:ÛÓ3ÛÓ,ÛÓ%ÛÓÛÓÛÓÛÓ ÛÓÛÓûÚÓôÚÓíÚÓæÚÓßÚÓØÚÓÑÚÓÊÚÓÃÚÓ¼ÚÓµÚÓ®ÚÓ§ÚÓ ÚÓ™ÚÓ’ÚÓ‹ÚÓ„ÚÓ}ÚÓvÚÓoÚÓhÚÓaÚÓZÚÓSÚÓLÚÓEÚÓ>ÚÓ7ÚÓ0ÚÓ)ÚÓ"ÚÓÚÓÚÓ ÚÓÚÓÿÙÓøÙÓñÙÓêÙÓãÙÓÜÙÓÕÙÓÎÙÓÇÙÓÀÙÓ¹ÙÓ²ÙÓ«ÙÓ¤ÙÓÙÓ–ÙÓÙÓˆÙÓÙÓzÙÓsÙÓlÙÓeÙÓ^ÙÓWÙÓPÙÓIÙÓBÙÓ;ÙÓ4ÙÓ-ÙÓ&ÙÓÙÓÙÓÙÓ ÙÓÙÓüØÓõØÓîØÓçØÓàØÓÙØÓÒØÓËØÓÄØÓ½ØÓ¶ØÓ¯ØÓ¨ØÓ¡ØÓšØÓ“ØÓŒØÓ…ØÓ~ØÓwØÓpØÓiØÓbØÓ[ØÓTØÓMØÓFØÓ?ØÓ8ØÓ1ØÓ*ØÓ#ØÓØÓØÓØÓØÓØÓù×Óò×Óë×Óä×ÓÝ×ÓÖ×ÓÏ×ÓÈ×ÓÁ×Óº×Ó³×Ó¬×Ó¥×Óž×Ó—×Ó×Ó‰×Ó‚×Ó{×Ót×Óm×Óf×Ó_×ÓX×ÓQ×ÓJ×ÓC×Ó<×Ó5×Ó.×Ó'×Ó ×Ó×Ó×Ó ×Ó×ÓýÖÓöÖÓïÖÓèÖÓáÖÓÚÖÓÓÖÓÌÖÓÅÖÓ¾ÖÓ·ÖÓ°ÖÓ©ÖÓ¢ÖÓ›ÖÓ”ÖÓÖÓ†ÖÓÖÓxÖÓqÖÓjÖÓcÖÓ\ÖÓUÖÓNÖÓGÖÓ@ÖÓ9ÖÓ2ÖÓ+ÖÓ$ÖÓÖÓÖÓÖÓÖÓÖÓúÕÓóÕÓìÕÓåÕÓÞÕÓ×ÕÓÐÕÓÉÕÓÂÕÓ»ÕÓ´ÕÓ­ÕÓ¦ÕÓŸÕÓ˜ÕÓ‘ÕÓŠÕÓƒÕÓ|ÕÓuÕÓnÕÓgÕÓ`ÕÓYÕÓRÕÓKÕÓDÕÓ=ÕÓ6ÕÓ/ÕÓ(ÕÓ!ÕÓÕÓÕÓ ÕÓÕÓþÔÓ÷ÔÓðÔÓéÔÓâÔÓÛÔÓÔÔÓÍÔÓÆÔÓ¿ÔÓ¸ÔÓ±ÔÓªÔÓ£ÔÓœÔÓ•ÔÓŽÔÓ‡ÔÓ€ÔÓyÔÓrÔÓkÔÓdÔÓ]ÔÓVÔÓOÔÓHÔÓAÔÓ:ÔÓ3ÔÓ,ÔÓ%ÔÓÔÓÔÓÔÓ ÔÓÔÓûÓÓôÓÓíÓÓæÓÓßÓÓØÓÓÑÓÓÊÓÓÃÓÓ¼ÓÓµÓÓ®ÓÓ§ÓÓ ÓÓ™ÓÓ’ÓÓ‹ÓÓ„ÓÓ}ÓÓvÓÓoÓÓhÓÓaÓÓZÓÓSÓÓLÓÓEÓÓ>ÓÓ7ÓÓ0ÓÓ)ÓÓ"ÓÓÓÓÓÓ ÓÓÓÓÿÒÓøÒÓñÒÓêÒÓãÒÓÜÒÓÕÒÓÎÒÓÇÒÓÀÒÓ¹ÒÓ²ÒÓ«ÒÓ¤ÒÓÒÓ–ÒÓÒÓˆÒÓÒÓzÒÓsÒÓlÒÓeÒÓ^ÒÓWÒÓPÒÓIÒÓBÒÓ;ÒÓ4ÒÓ-ÒÓ&ÒÓÒÓÒÓÒÓ ÒÓÒÓüÑÓõÑÓîÑÓçÑÓàÑÓÙÑÓÒÑÓËÑÓÄÑÓ½ÑÓ¶ÑÓ¯ÑÓ¨ÑÓ¡ÑÓšÑÓ“ÑÓŒÑÓ…ÑÓ~ÑÓwÑÓpÑÓiÑÓbÑÓ[ÑÓTÑÓMÑÓFÑÓ?ÑÓ8ÑÓ1ÑÓ*ÑÓ#ÑÓÑÓÑÓÑÓÑÓÑÓùÐÓòÐÓëÐÓäÐÓÝÐÓÖÐÓÏÐÓÈÐÓÁÐÓºÐÓ³ÐÓ¬ÐÓ¥ÐÓžÐÓ—ÐÓÐÓ‰ÐÓ‚ÐÓ{ÐÓtÐÓmÐÓfÐÓ_ÐÓXÐÓQÐÓJÐÓCÐÓ<ÐÓ5ÐÓ.ÐÓ'ÐÓ ÐÓÐÓÐÓ ÐÓÐÓýÏÓöÏÓïÏÓèÏÓáÏÓÚÏÓÓÏÓÌÏÓÅÏÓ¾ÏÓ·ÏÓ°ÏÓ©ÏÓ¢ÏÓ›ÏÓ”ÏÓÏÓ†ÏÓÏÓxÏÓqÏÓjÏÓcÏÓ\ÏÓUÏÓNÏÓGÏÓ@ÏÓ9ÏÓ2ÏÓ+ÏÓ$ÏÓÏÓÏÓÏÓÏÓÏÓúÎÓóÎÓìÎÓåÎÓÞÎÓ×ÎÓÐÎÓÉÎÓÂÎÓ»ÎÓ´ÎÓ­ÎÓ¦ÎÓŸÎÓ˜ÎÓ‘ÎÓŠÎÓƒÎÓ|ÎÓuÎÓnÎÓgÎÓ`ÎÓYÎÓRÎÓKÎÓDÎÓ=ÎÓ6ÎÓ/ÎÓ(ÎÓ!ÎÓÎÓÎÓ ÎÓÎÓþÍÓ÷ÍÓðÍÓéÍÓâÍÓÛÍÓÔÍÓÍÍÓÆÍÓ¿ÍÓ¸ÍÓ±ÍÓªÍÓ£ÍÓœÍÓ•ÍÓŽÍÓ‡ÍÓ€ÍÓyÍÓrÍÓkÍÓdÍÓ]ÍÓVÍÓOÍÓHÍÓAÍÓ:ÍÓ3ÍÓ,ÍÓ%ÍÓÍÓÍÓÍÓ ÍÓÍÓûÌÓôÌÓíÌÓæÌÓßÌÓØÌÓÑÌÓÊÌÓÃÌÓ¼ÌÓµÌÓ®ÌÓ§ÌÓ ÌÓ™ÌÓ’ÌÓ‹ÌÓ„ÌÓ}ÌÓvÌÓoÌÓhÌÓaÌÓZÌÓSÌÓLÌÓEÌÓ>ÌÓ7ÌÓ0ÌÓ)ÌÓ"ÌÓÌÓÌÓ ÌÓÌÓÿËÓøËÓñËÓêËÓãËÓÜËÓÕËÓÎËÓÇËÓÀËÓ¹ËÓ²ËÓ«ËÓ¤ËÓËÓ–ËÓËÓˆËÓËÓzËÓsËÓlËÓeËÓ^ËÓWËÓPËÓIËÓBËÓ;ËÓ4ËÓ-ËÓ&ËÓËÓËÓËÓ ËÓËÓüÊÓõÊÓîÊÓçÊÓàÊÓÙÊÓÒÊÓËÊÓÄÊÓ½ÊÓ¶ÊÓ¯ÊÓ¨ÊÓ¡ÊÓšÊÓ“ÊÓŒÊÓ…ÊÓ~ÊÓwÊÓpÊÓiÊÓbÊÓ[ÊÓTÊÓMÊÓFÊÓ?ÊÓ8ÊÓ1ÊÓ*ÊÓ#ÊÓÊÓÊÓÊÓÊÓÊÓùÉÓòÉÓëÉÓäÉÓÝÉÓÖÉÓÏÉÓÈÉÓÁÉÓºÉÓ³ÉÓ¬ÉÓ¥ÉÓžÉÓ—ÉÓÉÓ‰ÉÓ‚ÉÓ{ÉÓtÉÓmÉÓfÉÓ_ÉÓXÉÓQÉÓJÉÓCÉÓ<ÉÓ5ÉÓ.ÉÓ'ÉÓ ÉÓÉÓÉÓ ÉÓÉÓýÈÓöÈÓïÈÓèÈÓáÈÓÚÈÓÓÈÓÌÈÓÅÈÓ¾ÈÓ·ÈÓ°ÈÓ©ÈÓ¢ÈÓ›ÈÓ”ÈÓÈÓ†ÈÓÈÓxÈÓqÈÓjÈÓcÈÓ\ÈÓUÈÓNÈÓGÈÓ@ÈÓ9ÈÓ2ÈÓ+ÈÓ$ÈÓÈÓÈÓÈÓÈÓÈÓúÇÓóÇÓìÇÓåÇÓÞÇÓ×ÇÓÐÇÓÉÇÓÂÇÓ»ÇÓ´ÇÓ­ÇÓ¦ÇÓŸÇÓ˜ÇÓ‘ÇÓŠÇÓƒÇÓ|ÇÓuÇÓnÇÓgÇÓ`ÇÓYÇÓRÇÓKÇÓDÇÓ=ÇÓ6ÇÓ/ÇÓ(ÇÓ!ÇÓÇÓÇÓ ÇÓÇÓþÆÓ÷ÆÓðÆÓéÆÓâÆÓÛÆÓÔÆÓÍÆÓÆÆÓ¿ÆÓ¸ÆÓ±ÆÓªÆÓ£ÆÓœÆÓ•ÆÓŽÆÓ‡ÆÓ€ÆÓyÆÓrÆÓkÆÓdÆÓ]ÆÓVÆÓOÆÓHÆÓAÆÓ:ÆÓ3ÆÓ,ÆÓ%ÆÓÆÓÆÓÆÓ ÆÓÆÓûÅÓôÅÓíÅÓæÅÓßÅÓØÅÓÑÅÓÊÅÓÃÅÓ¼ÅÓµÅÓ®ÅÓ§ÅÓ ÅÓ™ÅÓ’ÅÓ‹ÅÓ„ÅÓ}ÅÓvÅÓoÅÓhÅÓaÅÓZÅÓSÅÓLÅÓEÅÓ>ÅÓ7ÅÓ0ÅÓ)ÅÓ"ÅÓÅÓÅÓ ÅÓÅÓÿÄÓøÄÓñÄÓêÄÓãÄÓÜÄÓÕÄÓÎÄÓÇÄÓÀÄÓ¹ÄÓ²ÄÓ«ÄÓ¤ÄÓÄÓ–ÄÓÄÓˆÄÓÄÓzÄÓsÄÓlÄÓeÄÓ^ÄÓWÄÓPÄÓIÄÓBÄÓ;ÄÓ4ÄÓ-ÄÓ&ÄÓÄÓÄÓÄÓ ÄÓÄÓüÃÓõÃÓîÃÓçÃÓàÃÓÙÃÓÒÃÓËÃÓÄÃÓ½ÃÓ¶ÃÓ¯ÃÓ¨ÃÓ¡ÃÓšÃÓ“ÃÓŒÃÓ…ÃÓ~ÃÓwÃÓpÃÓiÃÓbÃÓ[ÃÓTÃÓMÃÓFÃÓ?ÃÓ8ÃÓ1ÃÓ*ÃÓ#ÃÓÃÓÃÓÃÓÃÓÃÓùÂÓòÂÓëÂÓäÂÓÝÂÓÖÂÓÏÂÓÈÂÓÁÂÓºÂÓ³ÂÓ¬ÂÓ¥ÂÓžÂÓ—ÂÓÂÓ‰ÂÓ‚ÂÓ{ÂÓtÂÓmÂÓfÂÓ_ÂÓXÂÓQÂÓJÂÓCÂÓ<ÂÓ5ÂÓ.ÂÓ'ÂÓ ÂÓÂÓÂÓ ÂÓÂÓýÁÓöÁÓïÁÓèÁÓáÁÓÚÁÓÓÁÓÌÁÓÅÁÓ¾ÁÓ·ÁÓ°ÁÓ©ÁÓ¢ÁÓ›ÁÓ”ÁÓÁÓ†ÁÓÁÓxÁÓqÁÓjÁÓcÁÓ\ÁÓUÁÓNÁÓGÁÓ@ÁÓ9ÁÓ2ÁÓ+ÁÓ$ÁÓÁÓÁÓÁÓÁÓÁÓúÀÓóÀÓìÀÓåÀÓÞÀÓ×ÀÓÐÀÓÉÀÓÂÀÓ»ÀÓ´ÀÓ­ÀÓ¦ÀÓŸÀÓ˜ÀÓ‘ÀÓŠÀÓƒÀÓ|ÀÓuÀÓnÀÓgÀÓ`ÀÓYÀÓRÀÓKÀÓDÀÓ=ÀÓ6ÀÓ/ÀÓ(ÀÓ!ÀÓÀÓÀÓ ÀÓÀÓþ¿Ó÷¿Óð¿Óé¿Óâ¿ÓÛ¿ÓÔ¿ÓÍ¿ÓÆ¿Ó¿¿Ó¸¿Ó±¿Óª¿Ó£¿Óœ¿Ó•¿ÓŽ¿Ó‡¿Ó€¿Óy¿Ór¿Ók¿Ód¿Ó]¿ÓV¿ÓO¿ÓH¿ÓA¿Ó:¿Ó3¿Ó,¿Ó%¿Ó¿Ó¿Ó¿Ó ¿Ó¿Óû¾Óô¾Óí¾Óæ¾Óß¾ÓؾÓѾÓʾÓþÓ¼¾Óµ¾Ó®¾Ó§¾Ó ¾Ó™¾Ó’¾Ó‹¾Ó„¾Ó}¾Óv¾Óo¾Óh¾Óa¾ÓZ¾ÓS¾ÓL¾ÓE¾Ó>¾Ó7¾Ó0¾Ó)¾Ó"¾Ó¾Ó¾Ó ¾Ó¾Óÿ½Óø½Óñ½Óê½Óã½ÓܽÓÕ½ÓνÓǽÓÀ½Ó¹½Ó²½Ó«½Ó¤½Ó½Ó–½Ó½Óˆ½Ó½Óz½Ós½Ól½Óe½Ó^½ÓW½ÓP½ÓI½ÓB½Ó;½Ó4½Ó-½Ó&½Ó½Ó½Ó½Ó ½Ó½Óü¼Óõ¼Óî¼Óç¼Óà¼ÓÙ¼ÓÒ¼Ó˼ÓļÓ½¼Ó¶¼Ó¯¼Ó¨¼Ó¡¼Óš¼Ó“¼ÓŒ¼Ó…¼Ó~¼Ów¼Óp¼Ói¼Ób¼Ó[¼ÓT¼ÓM¼ÓF¼Ó?¼Ó8¼Ó1¼Ó*¼Ó#¼Ó¼Ó¼Ó¼Ó¼Ó¼Óù»Óò»Óë»Óä»ÓÝ»ÓÖ»ÓÏ»ÓÈ»ÓÁ»Óº»Ó³»Ó¬»Ó¥»Óž»Ó—»Ó»Ó‰»Ó‚»Ó{»Ót»Óm»Óf»Ó_»ÓX»ÓQ»ÓJ»ÓC»Ó<»Ó5»Ó.»Ó'»Ó »Ó»Ó»Ó »Ó»ÓýºÓöºÓïºÓèºÓáºÓÚºÓÓºÓ̺ÓźÓ¾ºÓ·ºÓ°ºÓ©ºÓ¢ºÓ›ºÓ”ºÓºÓ†ºÓºÓxºÓqºÓjºÓcºÓ\ºÓUºÓNºÓGºÓ@ºÓ9ºÓ2ºÓ+ºÓ$ºÓºÓºÓºÓºÓºÓú¹Óó¹Óì¹Óå¹ÓÞ¹Ó×¹ÓйÓɹÓ¹Ó»¹Ó´¹Ó­¹Ó¦¹ÓŸ¹Ó˜¹Ó‘¹ÓйÓƒ¹Ó|¹Óu¹Ón¹Óg¹Ó`¹ÓY¹ÓR¹ÓK¹ÓD¹Ó=¹Ó6¹Ó/¹Ó(¹Ó!¹Ó¹Ó¹Ó ¹Ó¹Óþ¸Ó÷¸Óð¸Óé¸Óâ¸ÓÛ¸ÓÔ¸Ó͸ÓƸÓ¿¸Ó¸¸Ó±¸Óª¸Ó£¸Óœ¸Ó•¸ÓޏÓ‡¸Ó€¸Óy¸Ór¸Ók¸Ód¸Ó]¸ÓV¸ÓO¸ÓH¸ÓA¸Ó:¸Ó3¸Ó,¸Ó%¸Ó¸Ó¸Ó¸Ó ¸Ó¸Óû·Óô·Óí·Óæ·Óß·ÓØ·ÓÑ·ÓÊ·Ó÷Ó¼·Óµ·Ó®·Ó§·Ó ·Ó™·Ó’·Ó‹·Ó„·Ó}·Óv·Óo·Óh·Óa·ÓZ·ÓS·ÓL·ÓE·Ó>·Ó7·Ó0·Ó)·Ó"·Ó·Ó·Ó ·Ó·Óÿ¶Óø¶Óñ¶Óê¶Óã¶ÓܶÓÕ¶ÓζÓǶÓÀ¶Ó¹¶Ó²¶Ó«¶Ó¤¶Ó¶Ó–¶Ó¶Óˆ¶Ó¶Óz¶Ós¶Ól¶Óe¶Ó^¶ÓW¶ÓP¶ÓI¶ÓB¶Ó;¶Ó4¶Ó-¶Ó&¶Ó¶Ó¶Ó¶Ó ¶Ó¶ÓüµÓõµÓîµÓçµÓàµÓÙµÓÒµÓ˵ÓĵÓ½µÓ¶µÓ¯µÓ¨µÓ¡µÓšµÓ“µÓŒµÓ…µÓ~µÓwµÓpµÓiµÓbµÓ[µÓTµÓMµÓFµÓ?µÓ8µÓ1µÓ*µÓ#µÓµÓµÓµÓµÓµÓù´Óò´Óë´Óä´ÓÝ´ÓÖ´ÓÏ´ÓÈ´ÓÁ´Óº´Ó³´Ó¬´Ó¥´Óž´Ó—´Ó´Ó‰´Ó‚´Ó{´Ót´Óm´Óf´Ó_´ÓX´ÓQ´ÓJ´ÓC´Ó<´Ó5´Ó.´Ó'´Ó ´Ó´Ó´Ó ´Ó´Óý³Óö³Óï³Óè³Óá³ÓÚ³ÓÓ³Ó̳ÓųÓ¾³Ó·³Ó°³Ó©³Ó¢³Ó›³Ó”³Ó³Ó†³Ó³Óx³Óq³Ój³Óc³Ó\³ÓU³ÓN³ÓG³Ó@³Ó9³Ó2³Ó+³Ó$³Ó³Ó³Ó³Ó³Ó³Óú²Óó²Óì²Óå²ÓÞ²ÓײÓвÓɲÓ²Ó»²Ó´²Ó­²Ó¦²ÓŸ²Ó˜²Ó‘²ÓвÓƒ²Ó|²Óu²Ón²Óg²Ó`²ÓY²ÓR²ÓK²ÓD²Ó=²Ó6²Ó/²Ó(²Ó!²Ó²Ó²Ó ²Ó²Óþ±Ó÷±Óð±Óé±Óâ±ÓÛ±ÓÔ±ÓͱÓƱÓ¿±Ó¸±Ó±±Óª±Ó£±Óœ±Ó•±ÓޱÓ‡±Ó€±Óy±Ór±Ók±Ód±Ó]±ÓV±ÓO±ÓH±ÓA±Ó:±Ó3±Ó,±Ó%±Ó±Ó±Ó±Ó ±Ó±Óû°Óô°Óí°Óæ°Óß°ÓذÓѰÓʰÓðÓ¼°Óµ°Ó®°Ó§°Ó °Ó™°Ó’°Ó‹°Ó„°Ó}°Óv°Óo°Óh°Óa°ÓZ°ÓS°ÓL°ÓE°Ó>°Ó7°Ó0°Ó)°Ó"°Ó°Ó°Ó °Ó°Óÿ¯Óø¯Óñ¯Óê¯Óã¯ÓܯÓÕ¯ÓίÓǯÓÀ¯Ó¹¯Ó²¯Ó«¯Ó¤¯Ó¯Ó–¯Ó¯Óˆ¯Ó¯Óz¯Ós¯Ól¯Óe¯Ó^¯ÓW¯ÓP¯ÓI¯ÓB¯Ó;¯Ó4¯Ó-¯Ó&¯Ó¯Ó¯Ó¯Ó ¯Ó¯Óü®Óõ®Óî®Óç®Óà®ÓÙ®ÓÒ®ÓË®ÓĮӽ®Ó¶®Ó¯®Ó¨®Ó¡®Óš®Ó“®ÓŒ®Ó…®Ó~®Ów®Óp®Ói®Ób®Ó[®ÓT®ÓM®ÓF®Ó?®Ó8®Ó1®Ó*®Ó#®Ó®Ó®Ó®Ó®Ó®Óù­Óò­Óë­Óä­ÓÝ­ÓÖ­ÓÏ­ÓÈ­ÓÁ­Óº­Ó³­Ó¬­Ó¥­Óž­Ó—­Ó­Ó‰­Ó‚­Ó{­Ót­Óm­Óf­Ó_­ÓX­ÓQ­ÓJ­ÓC­Ó<­Ó5­Ó.­Ó'­Ó ­Ó­Ó­Ó ­Ó­Óý¬Óö¬Óï¬Óè¬Óá¬ÓÚ¬ÓÓ¬Ó̬ÓŬÓ¾¬Ó·¬Ó°¬Ó©¬Ó¢¬Ó›¬Ó”¬Ó¬Ó†¬Ó¬Óx¬Óq¬Ój¬Óc¬Ó\¬ÓU¬ÓN¬ÓG¬Ó@¬Ó9¬Ó2¬Ó+¬Ó$¬Ó¬Ó¬Ó¬Ó¬Ó¬Óú«Óó«Óì«Óå«ÓÞ«Ó׫ÓЫÓɫӫӻ«Ó´«Ó­«Ó¦«ÓŸ«Ó˜«Ó‘«ÓŠ«Óƒ«Ó|«Óu«Ón«Óg«Ó`«ÓY«ÓR«ÓK«ÓD«Ó=«Ó6«Ó/«Ó(«Ó!«Ó«Ó«Ó «Ó«ÓþªÓ÷ªÓðªÓéªÓâªÓÛªÓÔªÓͪÓƪÓ¿ªÓ¸ªÓ±ªÓªªÓ£ªÓœªÓ•ªÓŽªÓ‡ªÓ€ªÓyªÓrªÓkªÓdªÓ]ªÓVªÓOªÓHªÓAªÓ:ªÓ3ªÓ,ªÓ%ªÓªÓªÓªÓ ªÓªÓû©Óô©Óí©Óæ©ÓߩӨ©ÓÑ©ÓÊ©ÓéÓ¼©Óµ©Ó®©Ó§©Ó ©Ó™©Ó’©Ó‹©Ó„©Ó}©Óv©Óo©Óh©Óa©ÓZ©ÓS©ÓL©ÓE©Ó>©Ó7©Ó0©Ó)©Ó"©Ó©Ó©Ó ©Ó©Óÿ¨Óø¨Óñ¨Óê¨Óã¨ÓܨÓÕ¨ÓΨÓǨÓÀ¨Ó¹¨Ó²¨Ó«¨Ó¤¨Ó¨Ó–¨Ó¨Óˆ¨Ó¨Óz¨Ós¨Ól¨Óe¨Ó^¨ÓW¨ÓP¨ÓI¨ÓB¨Ó;¨Ó4¨Ó-¨Ó&¨Ó¨Ó¨Ó¨Ó ¨Ó¨Óü§Óõ§Óî§Óç§Óà§ÓÙ§ÓÒ§Ó˧ÓħÓ½§Ó¶§Ó¯§Ó¨§Ó¡§Óš§Ó“§ÓŒ§Ó…§Ó~§Ów§Óp§Ói§Ób§Ó[§ÓT§ÓM§ÓF§Ó?§Ó8§Ó1§Ó*§Ó#§Ó§Ó§Ó§Ó§Ó§Óù¦Óò¦Óë¦Óä¦ÓݦÓÖ¦ÓϦÓȦÓÁ¦Óº¦Ó³¦Ó¬¦Ó¥¦Óž¦Ó—¦Ó¦Ó‰¦Ó‚¦Ó{¦Ót¦Óm¦Óf¦Ó_¦ÓX¦ÓQ¦ÓJ¦ÓC¦Ó<¦Ó5¦Ó.¦Ó'¦Ó ¦Ó¦Ó¦Ó ¦Ó¦Óý¥Óö¥Óï¥Óè¥Óá¥ÓÚ¥ÓÓ¥ÓÌ¥ÓÅ¥Ó¾¥Ó·¥Ó°¥Ó©¥Ó¢¥Ó›¥Ó”¥Ó¥Ó†¥Ó¥Óx¥Óq¥Ój¥Óc¥Ó\¥ÓU¥ÓN¥ÓG¥Ó@¥Ó9¥Ó2¥Ó+¥Ó$¥Ó¥Ó¥Ó¥Ó¥Ó¥Óú¤Óó¤Óì¤Óå¤ÓÞ¤ÓפÓФÓɤÓ¤Ó»¤Ó´¤Ó­¤Ó¦¤ÓŸ¤Ó˜¤Ó‘¤ÓФÓƒ¤Ó|¤Óu¤Ón¤Óg¤Ó`¤ÓY¤ÓR¤ÓK¤ÓD¤Ó=¤Ó6¤Ó/¤Ó(¤Ó!¤Ó¤Ó¤Ó ¤Ó¤Óþ£Ó÷£Óð£Óé£Óâ£ÓÛ£ÓÔ£ÓÍ£ÓÆ£Ó¿£Ó¸£Ó±£Óª£Ó££Óœ£Ó•£ÓŽ£Ó‡£Ó€£Óy£Ór£Ók£Ód£Ó]£ÓV£ÓO£ÓH£ÓA£Ó:£Ó3£Ó,£Ó%£Ó£Ó£Ó£Ó £Ó£Óû¢Óô¢Óí¢Óæ¢ÓߢÓØ¢ÓÑ¢ÓÊ¢ÓâÓ¼¢Óµ¢Ó®¢Ó§¢Ó ¢Ó™¢Ó’¢Ó‹¢Ó„¢Ó}¢Óv¢Óo¢Óh¢Óa¢ÓZ¢ÓS¢ÓL¢ÓE¢Ó>¢Ó7¢Ó0¢Ó)¢Ó"¢Ó¢Ó¢Ó ¢Ó¢Óÿ¡Óø¡Óñ¡Óê¡Óã¡ÓÜ¡ÓÕ¡ÓΡÓÇ¡ÓÀ¡Ó¹¡Ó²¡Ó«¡Ó¤¡Ó¡Ó–¡Ó¡Óˆ¡Ó¡Óz¡Ós¡Ól¡Óe¡Ó^¡ÓW¡ÓP¡ÓI¡ÓB¡Ó;¡Ó4¡Ó-¡Ó&¡Ó¡Ó¡Ó¡Ó ¡Ó¡Óü Óõ Óî Óç Óà ÓÙ ÓÒ ÓË ÓÄ Ó½ Ó¶ Ó¯ Ó¨ Ó¡ Óš Ó“ ÓŒ Ó… Ó~ Ów Óp Ói Ób Ó[ ÓT ÓM ÓF Ó? Ó8 Ó1 Ó* Ó# Ó Ó Ó Ó Ó ÓùŸÓòŸÓëŸÓäŸÓÝŸÓÖŸÓÏŸÓÈŸÓÁŸÓºŸÓ³ŸÓ¬ŸÓ¥ŸÓžŸÓ—ŸÓŸÓ‰ŸÓ‚ŸÓ{ŸÓtŸÓmŸÓfŸÓ_ŸÓXŸÓQŸÓJŸÓCŸÓ<ŸÓ5ŸÓ.ŸÓ'ŸÓ ŸÓŸÓŸÓ ŸÓŸÓýžÓöžÓïžÓèžÓážÓÚžÓÓžÓÌžÓÅžÓ¾žÓ·žÓ°žÓ©žÓ¢žÓ›žÓ”žÓžÓ†žÓžÓxžÓqžÓjžÓcžÓ\žÓUžÓNžÓGžÓ@žÓ9žÓ2žÓ+žÓ$žÓžÓžÓžÓžÓžÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþœÓ÷œÓðœÓéœÓâœÓÛœÓÔœÓÍœÓÆœÓ¿œÓ¸œÓ±œÓªœÓ£œÓœœÓ•œÓŽœÓ‡œÓ€œÓyœÓrœÓkœÓdœÓ]œÓVœÓOœÓHœÓAœÓ:œÓ3œÓ,œÓ%œÓœÓœÓœÓ œÓœÓû›Óô›Óí›Óæ›ÓߛӨ›ÓÑ›ÓÊ›ÓÛÓ¼›Óµ›Ó®›Ó§›Ó ›Ó™›Ó’›Ó‹›Ó„›Ó}›Óv›Óo›Óh›Óa›ÓZ›ÓS›ÓL›ÓE›Ó>›Ó7›Ó0›Ó)›Ó"›Ó›Ó›Ó ›Ó›ÓÿšÓøšÓñšÓêšÓãšÓÜšÓÕšÓΚÓÇšÓÀšÓ¹šÓ²šÓ«šÓ¤šÓšÓ–šÓšÓˆšÓšÓzšÓsšÓlšÓešÓ^šÓWšÓPšÓIšÓBšÓ;šÓ4šÓ-šÓ&šÓšÓšÓšÓ šÓšÓü™Óõ™Óî™Óç™Óà™ÓÙ™ÓÒ™ÓË™Óęӽ™Ó¶™Ó¯™Ó¨™Ó¡™Óš™Ó“™ÓŒ™Ó…™Ó~™Ów™Óp™Ói™Ób™Ó[™ÓT™ÓM™ÓF™Ó?™Ó8™Ó1™Ó*™Ó#™Ó™Ó™Ó™Ó™Ó™Óù˜Óò˜Óë˜Óä˜ÓݘÓÖ˜ÓϘÓȘÓÁ˜Óº˜Ó³˜Ó¬˜Ó¥˜Óž˜Ó—˜Ó˜Ó‰˜Ó‚˜Ó{˜Ót˜Óm˜Óf˜Ó_˜ÓX˜ÓQ˜ÓJ˜ÓC˜Ó<˜Ó5˜Ó.˜Ó'˜Ó ˜Ó˜Ó˜Ó ˜Ó˜Óý—Óö—Óï—Óè—Óá—ÓÚ—ÓÓ—ÓÌ—ÓÅ—Ó¾—Ó·—Ó°—Ó©—Ó¢—Ó›—Ó”—Ó—Ó†—Ó—Óx—Óq—Ój—Óc—Ó\—ÓU—ÓN—ÓG—Ó@—Ó9—Ó2—Ó+—Ó$—Ó—Ó—Ó—Ó—Ó—Óú–Óó–Óì–Óå–ÓÞ–Ó×–ÓЖÓÉ–Ó–Ó»–Ó´–Ó­–Ó¦–ÓŸ–Ó˜–Ó‘–ÓŠ–Óƒ–Ó|–Óu–Ón–Óg–Ó`–ÓY–ÓR–ÓK–ÓD–Ó=–Ó6–Ó/–Ó(–Ó!–Ó–Ó–Ó –Ó–Óþ•Ó÷•Óð•Óé•Óâ•ÓÛ•ÓÔ•ÓÍ•ÓÆ•Ó¿•Ó¸•Ó±•Óª•Ó£•Óœ•Ó••ÓŽ•Ó‡•Ó€•Óy•Ór•Ók•Ód•Ó]•ÓV•ÓO•ÓH•ÓA•Ó:•Ó3•Ó,•Ó%•Ó•Ó•Ó•Ó •Ó•Óû”Óô”Óí”Óæ”ÓߔӨ”ÓÑ”ÓÊ”ÓÔÓ¼”Óµ”Ó®”Ó§”Ó ”Ó™”Ó’”Ó‹”Ó„”Ó}”Óv”Óo”Óh”Óa”ÓZ”ÓS”ÓL”ÓE”Ó>”Ó7”Ó0”Ó)”Ó"”Ó”Ó”Ó ”Ó”Óÿ“Óø“Óñ“Óê“Óã“ÓÜ“ÓÕ“ÓΓÓÇ“ÓÀ“Ó¹“Ó²“Ó«“Ó¤“Ó“Ó–“Ó“Óˆ“Ó“Óz“Ós“Ól“Óe“Ó^“ÓW“ÓP“ÓI“ÓB“Ó;“Ó4“Ó-“Ó&“Ó“Ó“Ó“Ó “Ó“Óü’Óõ’Óî’Óç’Óà’ÓÙ’ÓÒ’ÓË’ÓÄ’Ó½’Ó¶’Ó¯’Ó¨’Ó¡’Óš’Ó“’ÓŒ’Ó…’Ó~’Ów’Óp’Ói’Ób’Ó[’ÓT’ÓM’ÓF’Ó?’Ó8’Ó1’Ó*’Ó#’Ó’Ó’Ó’Ó’Ó’Óù‘Óò‘Óë‘Óä‘ÓÝ‘ÓÖ‘ÓÏ‘ÓÈ‘ÓÁ‘Óº‘Ó³‘Ó¬‘Ó¥‘Óž‘Ó—‘Ó‘Ó‰‘Ó‚‘Ó{‘Ót‘Óm‘Óf‘Ó_‘ÓX‘ÓQ‘ÓJ‘ÓC‘Ó<‘Ó5‘Ó.‘Ó'‘Ó ‘Ó‘Ó‘Ó ‘Ó‘ÓýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþŽÓ÷ŽÓðŽÓéŽÓâŽÓÛŽÓÔŽÓÍŽÓÆŽÓ¿ŽÓ¸ŽÓ±ŽÓªŽÓ£ŽÓœŽÓ•ŽÓŽŽÓ‡ŽÓ€ŽÓyŽÓrŽÓkŽÓdŽÓ]ŽÓVŽÓOŽÓHŽÓAŽÓ:ŽÓ3ŽÓ,ŽÓ%ŽÓŽÓŽÓŽÓ ŽÓŽÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿŒÓøŒÓñŒÓêŒÓãŒÓÜŒÓÕŒÓÎŒÓÇŒÓÀŒÓ¹ŒÓ²ŒÓ«ŒÓ¤ŒÓŒÓ–ŒÓŒÓˆŒÓŒÓzŒÓsŒÓlŒÓeŒÓ^ŒÓWŒÓPŒÓIŒÓBŒÓ;ŒÓ4ŒÓ-ŒÓ&ŒÓŒÓŒÓŒÓ ŒÓŒÓü‹Óõ‹Óî‹Óç‹Óà‹ÓÙ‹ÓÒ‹ÓË‹Óċӽ‹Ó¶‹Ó¯‹Ó¨‹Ó¡‹Óš‹Ó“‹ÓŒ‹Ó…‹Ó~‹Ów‹Óp‹Ói‹Ób‹Ó[‹ÓT‹ÓM‹ÓF‹Ó?‹Ó8‹Ó1‹Ó*‹Ó#‹Ó‹Ó‹Ó‹Ó‹Ó‹ÓùŠÓòŠÓëŠÓäŠÓÝŠÓÖŠÓÏŠÓÈŠÓÁŠÓºŠÓ³ŠÓ¬ŠÓ¥ŠÓžŠÓ—ŠÓŠÓ‰ŠÓ‚ŠÓ{ŠÓtŠÓmŠÓfŠÓ_ŠÓXŠÓQŠÓJŠÓCŠÓ<ŠÓ5ŠÓ.ŠÓ'ŠÓ ŠÓŠÓŠÓ ŠÓŠÓý‰Óö‰Óï‰Óè‰Óá‰ÓÚ‰ÓÓ‰Ó̉ÓʼnÓ¾‰Ó·‰Ó°‰Ó©‰Ó¢‰Ó›‰Ó”‰Ó‰Ó†‰Ó‰Óx‰Óq‰Ój‰Óc‰Ó\‰ÓU‰ÓN‰ÓG‰Ó@‰Ó9‰Ó2‰Ó+‰Ó$‰Ó‰Ó‰Ó‰Ó‰Ó‰ÓúˆÓóˆÓìˆÓåˆÓÞˆÓ׈ÓЈÓɈÓˆÓ»ˆÓ´ˆÓ­ˆÓ¦ˆÓŸˆÓ˜ˆÓ‘ˆÓŠˆÓƒˆÓ|ˆÓuˆÓnˆÓgˆÓ`ˆÓYˆÓRˆÓKˆÓDˆÓ=ˆÓ6ˆÓ/ˆÓ(ˆÓ!ˆÓˆÓˆÓ ˆÓˆÓþ‡Ó÷‡Óð‡Óé‡Óâ‡ÓÛ‡ÓÔ‡Ó͇ÓƇÓ¿‡Ó¸‡Ó±‡Óª‡Ó£‡Óœ‡Ó•‡ÓއÓ‡‡Ó€‡Óy‡Ór‡Ók‡Ód‡Ó]‡ÓV‡ÓO‡ÓH‡ÓA‡Ó:‡Ó3‡Ó,‡Ó%‡Ó‡Ó‡Ó‡Ó ‡Ó‡Óû†Óô†Óí†Óæ†Ó߆Ó؆ÓцÓʆÓÆÓ¼†Óµ†Ó®†Ó§†Ó †Ó™†Ó’†Ó‹†Ó„†Ó}†Óv†Óo†Óh†Óa†ÓZ†ÓS†ÓL†ÓE†Ó>†Ó7†Ó0†Ó)†Ó"†Ó†Ó†Ó †Ó†Óÿ…Óø…Óñ…Óê…Óã…ÓÜ…ÓÕ…ÓÎ…ÓÇ…ÓÀ…Ó¹…Ó²…Ó«…Ó¤…Ó…Ó–…Ó…Óˆ…Ó…Óz…Ós…Ól…Óe…Ó^…ÓW…ÓP…ÓI…ÓB…Ó;…Ó4…Ó-…Ó&…Ó…Ó…Ó…Ó …Ó…Óü„Óõ„Óî„Óç„Óà„ÓÙ„ÓÒ„Ó˄ӥӽ„Ó¶„Ó¯„Ó¨„Ó¡„Óš„Ó“„ÓŒ„Ó…„Ó~„Ów„Óp„Ói„Ób„Ó[„ÓT„ÓM„ÓF„Ó?„Ó8„Ó1„Ó*„Ó#„Ó„Ó„Ó„Ó„Ó„ÓùƒÓòƒÓëƒÓäƒÓ݃ÓÖƒÓσÓȃÓÁƒÓºƒÓ³ƒÓ¬ƒÓ¥ƒÓžƒÓ—ƒÓƒÓ‰ƒÓ‚ƒÓ{ƒÓtƒÓmƒÓfƒÓ_ƒÓXƒÓQƒÓJƒÓCƒÓ<ƒÓ5ƒÓ.ƒÓ'ƒÓ ƒÓƒÓƒÓ ƒÓƒÓý‚Óö‚Óï‚Óè‚Óá‚ÓÚ‚ÓÓ‚ÓÌ‚ÓłӾ‚Ó·‚Ó°‚Ó©‚Ó¢‚Ó›‚Ó”‚Ó‚Ó†‚Ó‚Óx‚Óq‚Ój‚Óc‚Ó\‚ÓU‚ÓN‚ÓG‚Ó@‚Ó9‚Ó2‚Ó+‚Ó$‚Ó‚Ó‚Ó‚Ó‚Ó‚ÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþ€Ó÷€Óð€Óé€Óâ€ÓÛ€ÓÔ€ÓÍ€ÓÆ€Ó¿€Ó¸€Ó±€Óª€Ó£€Óœ€Ó•€ÓŽ€Ó‡€Ó€€Óy€Ór€Ók€Ód€Ó]€ÓV€ÓO€ÓH€ÓA€Ó:€Ó3€Ó,€Ó%€Ó€Ó€Ó€Ó €Ó€ÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿ~Óø~Óñ~Óê~Óã~ÓÜ~ÓÕ~ÓÎ~ÓÇ~ÓÀ~Ó¹~Ó²~Ó«~Ó¤~Ó~Ó–~Ó~Óˆ~Ó~Óz~Ós~Ól~Óe~Ó^~ÓW~ÓP~ÓI~ÓB~Ó;~Ó4~Ó-~Ó&~Ó~Ó~Ó~Ó ~Ó~Óü}Óõ}Óî}Óç}Óà}ÓÙ}ÓÒ}ÓË}ÓÄ}Ó½}Ó¶}Ó¯}Ó¨}Ó¡}Óš}Ó“}ÓŒ}Ó…}Ó~}Ów}Óp}Ói}Ób}Ó[}ÓT}ÓM}ÓF}Ó?}Ó8}Ó1}Ó*}Ó#}Ó}Ó}Ó}Ó}Ó}Óù|Óò|Óë|Óä|ÓÝ|ÓÖ|ÓÏ|ÓÈ|ÓÁ|Óº|Ó³|Ó¬|Ó¥|Óž|Ó—|Ó|Ó‰|Ó‚|Ó{|Ót|Óm|Óf|Ó_|ÓX|ÓQ|ÓJ|ÓC|Ó<|Ó5|Ó.|Ó'|Ó |Ó|Ó|Ó |Ó|Óý{Óö{Óï{Óè{Óá{ÓÚ{ÓÓ{ÓÌ{ÓÅ{Ó¾{Ó·{Ó°{Ó©{Ó¢{Ó›{Ó”{Ó{Ó†{Ó{Óx{Óq{Ój{Óc{Ó\{ÓU{ÓN{ÓG{Ó@{Ó9{Ó2{Ó+{Ó${Ó{Ó{Ó{Ó{Ó{ÓúzÓózÓìzÓåzÓÞzÓ×zÓÐzÓÉzÓÂzÓ»zÓ´zÓ­zÓ¦zÓŸzÓ˜zÓ‘zÓŠzÓƒzÓ|zÓuzÓnzÓgzÓ`zÓYzÓRzÓKzÓDzÓ=zÓ6zÓ/zÓ(zÓ!zÓzÓzÓ zÓzÓþyÓ÷yÓðyÓéyÓâyÓÛyÓÔyÓÍyÓÆyÓ¿yÓ¸yÓ±yÓªyÓ£yÓœyÓ•yÓŽyÓ‡yÓ€yÓyyÓryÓkyÓdyÓ]yÓVyÓOyÓHyÓAyÓ:yÓ3yÓ,yÓ%yÓyÓyÓyÓ yÓyÓûxÓôxÓíxÓæxÓßxÓØxÓÑxÓÊxÓÃxÓ¼xÓµxÓ®xÓ§xÓ xÓ™xÓ’xÓ‹xÓ„xÓ}xÓvxÓoxÓhxÓaxÓZxÓSxÓLxÓExÓ>xÓ7xÓ0xÓ)xÓ"xÓxÓxÓ xÓxÓÿwÓøwÓñwÓêwÓãwÓÜwÓÕwÓÎwÓÇwÓÀwÓ¹wÓ²wÓ«wÓ¤wÓwÓ–wÓwÓˆwÓwÓzwÓswÓlwÓewÓ^wÓWwÓPwÓIwÓBwÓ;wÓ4wÓ-wÓ&wÓwÓwÓwÓ wÓwÓüvÓõvÓîvÓçvÓàvÓÙvÓÒvÓËvÓÄvÓ½vÓ¶vÓ¯vÓ¨vÓ¡vÓšvÓ“vÓŒvÓ…vÓ~vÓwvÓpvÓivÓbvÓ[vÓTvÓMvÓFvÓ?vÓ8vÓ1vÓ*vÓ#vÓvÓvÓvÓvÓvÓùuÓòuÓëuÓäuÓÝuÓÖuÓÏuÓÈuÓÁuÓºuÓ³uÓ¬uÓ¥uÓžuÓ—uÓuÓ‰uÓ‚uÓ{uÓtuÓmuÓfuÓ_uÓXuÓQuÓJuÓCuÓqÓ7qÓ0qÓ)qÓ"qÓqÓqÓ qÓqÓÿpÓøpÓñpÓêpÓãpÓÜpÓÕpÓÎpÓÇpÓÀpÓ¹pÓ²pÓ«pÓ¤pÓpÓ–pÓpÓˆpÓpÓzpÓspÓlpÓepÓ^pÓWpÓPpÓIpÓBpÓ;pÓ4pÓ-pÓ&pÓpÓpÓpÓ pÓpÓüoÓõoÓîoÓçoÓàoÓÙoÓÒoÓËoÓÄoÓ½oÓ¶oÓ¯oÓ¨oÓ¡oÓšoÓ“oÓŒoÓ…oÓ~oÓwoÓpoÓioÓboÓ[oÓToÓMoÓFoÓ?oÓ8oÓ1oÓ*oÓ#oÓoÓoÓoÓoÓoÓùnÓònÓënÓänÓÝnÓÖnÓÏnÓÈnÓÁnÓºnÓ³nÓ¬nÓ¥nÓžnÓ—nÓnÓ‰nÓ‚nÓ{nÓtnÓmnÓfnÓ_nÓXnÓQnÓJnÓCnÓjÓ7jÓ0jÓ)jÓ"jÓjÓjÓ jÓjÓÿiÓøiÓñiÓêiÓãiÓÜiÓÕiÓÎiÓÇiÓÀiÓ¹iÓ²iÓ«iÓ¤iÓiÓ–iÓiÓˆiÓiÓziÓsiÓliÓeiÓ^iÓWiÓPiÓIiÓBiÓ;iÓ4iÓ-iÓ&iÓiÓiÓiÓ iÓiÓühÓõhÓîhÓçhÓàhÓÙhÓÒhÓËhÓÄhÓ½hÓ¶hÓ¯hÓ¨hÓ¡hÓšhÓ“hÓŒhÓ…hÓ~hÓwhÓphÓihÓbhÓ[hÓThÓMhÓFhÓ?hÓ8hÓ1hÓ*hÓ#hÓhÓhÓhÓhÓhÓùgÓògÓëgÓägÓÝgÓÖgÓÏgÓÈgÓÁgÓºgÓ³gÓ¬gÓ¥gÓžgÓ—gÓgÓ‰gÓ‚gÓ{gÓtgÓmgÓfgÓ_gÓXgÓQgÓJgÓCgÓcÓ7cÓ0cÓ)cÓ"cÓcÓcÓ cÓcÓÿbÓøbÓñbÓêbÓãbÓÜbÓÕbÓÎbÓÇbÓÀbÓ¹bÓ²bÓ«bÓ¤bÓbÓ–bÓbÓˆbÓbÓzbÓsbÓlbÓebÓ^bÓWbÓPbÓIbÓBbÓ;bÓ4bÓ-bÓ&bÓbÓbÓbÓ bÓbÓüaÓõaÓîaÓçaÓàaÓÙaÓÒaÓËaÓÄaÓ½aÓ¶aÓ¯aÓ¨aÓ¡aÓšaÓ“aÓŒaÓ…aÓ~aÓwaÓpaÓiaÓbaÓ[aÓTaÓMaÓFaÓ?aÓ8aÓ1aÓ*aÓ#aÓaÓaÓaÓaÓaÓù`Óò`Óë`Óä`ÓÝ`ÓÖ`ÓÏ`ÓÈ`ÓÁ`Óº`Ó³`Ó¬`Ó¥`Óž`Ó—`Ó`Ó‰`Ó‚`Ó{`Ót`Óm`Óf`Ó_`ÓX`ÓQ`ÓJ`ÓC`Ó<`Ó5`Ó.`Ó'`Ó `Ó`Ó`Ó `Ó`Óý_Óö_Óï_Óè_Óá_ÓÚ_ÓÓ_ÓÌ_ÓÅ_Ó¾_Ó·_Ó°_Ó©_Ó¢_Ó›_Ó”_Ó_Ó†_Ó_Óx_Óq_Ój_Óc_Ó\_ÓU_ÓN_ÓG_Ó@_Ó9_Ó2_Ó+_Ó$_Ó_Ó_Ó_Ó_Ó_Óú^Óó^Óì^Óå^ÓÞ^Ó×^ÓÐ^ÓÉ^ÓÂ^Ó»^Ó´^Ó­^Ó¦^ÓŸ^Ó˜^Ó‘^ÓŠ^Óƒ^Ó|^Óu^Ón^Óg^Ó`^ÓY^ÓR^ÓK^ÓD^Ó=^Ó6^Ó/^Ó(^Ó!^Ó^Ó^Ó ^Ó^Óþ]Ó÷]Óð]Óé]Óâ]ÓÛ]ÓÔ]ÓÍ]ÓÆ]Ó¿]Ó¸]Ó±]Óª]Ó£]Óœ]Ó•]ÓŽ]Ó‡]Ó€]Óy]Ór]Ók]Ód]Ó]]ÓV]ÓO]ÓH]ÓA]Ó:]Ó3]Ó,]Ó%]Ó]Ó]Ó]Ó ]Ó]Óû\Óô\Óí\Óæ\Óß\ÓØ\ÓÑ\ÓÊ\ÓÃ\Ó¼\Óµ\Ó®\Ó§\Ó \Ó™\Ó’\Ó‹\Ó„\Ó}\Óv\Óo\Óh\Óa\ÓZ\ÓS\ÓL\ÓE\Ó>\Ó7\Ó0\Ó)\Ó"\Ó\Ó\Ó \Ó\Óÿ[Óø[Óñ[Óê[Óã[ÓÜ[ÓÕ[ÓÎ[ÓÇ[ÓÀ[Ó¹[Ó²[Ó«[Ó¤[Ó[Ó–[Ó[Óˆ[Ó[Óz[Ós[Ól[Óe[Ó^[ÓW[ÓP[ÓI[ÓB[Ó;[Ó4[Ó-[Ó&[Ó[Ó[Ó[Ó [Ó[ÓüZÓõZÓîZÓçZÓàZÓÙZÓÒZÓËZÓÄZÓ½ZÓ¶ZÓ¯ZÓ¨ZÓ¡ZÓšZÓ“ZÓŒZÓ…ZÓ~ZÓwZÓpZÓiZÓbZÓ[ZÓTZÓMZÓFZÓ?ZÓ8ZÓ1ZÓ*ZÓ#ZÓZÓZÓZÓZÓZÓùYÓòYÓëYÓäYÓÝYÓÖYÓÏYÓÈYÓÁYÓºYÓ³YÓ¬YÓ¥YÓžYÓ—YÓYÓ‰YÓ‚YÓ{YÓtYÓmYÓfYÓ_YÓXYÓQYÓJYÓCYÓUÓ7UÓ0UÓ)UÓ"UÓUÓUÓ UÓUÓÿTÓøTÓñTÓêTÓãTÓÜTÓÕTÓÎTÓÇTÓÀTÓ¹TÓ²TÓ«TÓ¤TÓTÓ–TÓTÓˆTÓTÓzTÓsTÓlTÓeTÓ^TÓWTÓPTÓITÓBTÓ;TÓ4TÓ-TÓ&TÓTÓTÓTÓ TÓTÓüSÓõSÓîSÓçSÓàSÓÙSÓÒSÓËSÓÄSÓ½SÓ¶SÓ¯SÓ¨SÓ¡SÓšSÓ“SÓŒSÓ…SÓ~SÓwSÓpSÓiSÓbSÓ[SÓTSÓMSÓFSÓ?SÓ8SÓ1SÓ*SÓ#SÓSÓSÓSÓSÓSÓùRÓòRÓëRÓäRÓÝRÓÖRÓÏRÓÈRÓÁRÓºRÓ³RÓ¬RÓ¥RÓžRÓ—RÓRÓ‰RÓ‚RÓ{RÓtRÓmRÓfRÓ_RÓXRÓQRÓJRÓCRÓNÓ7NÓ0NÓ)NÓ"NÓNÓNÓ NÓNÓÿMÓøMÓñMÓêMÓãMÓÜMÓÕMÓÎMÓÇMÓÀMÓ¹MÓ²MÓ«MÓ¤MÓMÓ–MÓMÓˆMÓMÓzMÓsMÓlMÓeMÓ^MÓWMÓPMÓIMÓBMÓ;MÓ4MÓ-MÓ&MÓMÓMÓMÓ MÓMÓüLÓõLÓîLÓçLÓàLÓÙLÓÒLÓËLÓÄLÓ½LÓ¶LÓ¯LÓ¨LÓ¡LÓšLÓ“LÓŒLÓ…LÓ~LÓwLÓpLÓiLÓbLÓ[LÓTLÓMLÓFLÓ?LÓ8LÓ1LÓ*LÓ#LÓLÓLÓLÓLÓLÓùKÓòKÓëKÓäKÓÝKÓÖKÓÏKÓÈKÓÁKÓºKÓ³KÓ¬KÓ¥KÓžKÓ—KÓKÓ‰KÓ‚KÓ{KÓtKÓmKÓfKÓ_KÓXKÓQKÓJKÓCKÓGÓ7GÓ0GÓ)GÓ"GÓGÓGÓ GÓGÓÿFÓøFÓñFÓêFÓãFÓÜFÓÕFÓÎFÓÇFÓÀFÓ¹FÓ²FÓ«FÓ¤FÓFÓ–FÓFÓˆFÓFÓzFÓsFÓlFÓeFÓ^FÓWFÓPFÓIFÓBFÓ;FÓ4FÓ-FÓ&FÓFÓFÓFÓ FÓFÓüEÓõEÓîEÓçEÓàEÓÙEÓÒEÓËEÓÄEÓ½EÓ¶EÓ¯EÓ¨EÓ¡EÓšEÓ“EÓŒEÓ…EÓ~EÓwEÓpEÓiEÓbEÓ[EÓTEÓMEÓFEÓ?EÓ8EÓ1EÓ*EÓ#EÓEÓEÓEÓEÓEÓùDÓòDÓëDÓäDÓÝDÓÖDÓÏDÓÈDÓÁDÓºDÓ³DÓ¬DÓ¥DÓžDÓ—DÓDÓ‰DÓ‚DÓ{DÓtDÓmDÓfDÓ_DÓXDÓQDÓJDÓCDÓ@Ó7@Ó0@Ó)@Ó"@Ó@Ó@Ó @Ó@Óÿ?Óø?Óñ?Óê?Óã?ÓÜ?ÓÕ?ÓÎ?ÓÇ?ÓÀ?Ó¹?Ó²?Ó«?Ó¤?Ó?Ó–?Ó?Óˆ?Ó?Óz?Ós?Ól?Óe?Ó^?ÓW?ÓP?ÓI?ÓB?Ó;?Ó4?Ó-?Ó&?Ó?Ó?Ó?Ó ?Ó?Óü>Óõ>Óî>Óç>Óà>ÓÙ>ÓÒ>ÓË>ÓÄ>Ó½>Ó¶>Ó¯>Ó¨>Ó¡>Óš>Ó“>ÓŒ>Ó…>Ó~>Ów>Óp>Ói>Ób>Ó[>ÓT>ÓM>ÓF>Ó?>Ó8>Ó1>Ó*>Ó#>Ó>Ó>Ó>Ó>Ó>Óù=Óò=Óë=Óä=ÓÝ=ÓÖ=ÓÏ=ÓÈ=ÓÁ=Óº=Ó³=Ó¬=Ó¥=Óž=Ó—=Ó=Ó‰=Ó‚=Ó{=Ót=Óm=Óf=Ó_=ÓX=ÓQ=ÓJ=ÓC=Ó<=Ó5=Ó.=Ó'=Ó =Ó=Ó=Ó =Ó=Óý<Óö<Óï<Óè<Óá<ÓÚ<ÓÓ<ÓÌ<ÓÅ<Ó¾<Ó·<Ó°<Ó©<Ó¢<Ó›<Ó”<Ó<Ó†<Ó<Óx<Óq<Ój<Óc<Ó\<ÓU<ÓN<ÓG<Ó@<Ó9<Ó2<Ó+<Ó$<Ó<Ó<Ó<Ó<Ó<Óú;Óó;Óì;Óå;ÓÞ;Ó×;ÓÐ;ÓÉ;ÓÂ;Ó»;Ó´;Ó­;Ó¦;ÓŸ;Ó˜;Ó‘;ÓŠ;Óƒ;Ó|;Óu;Ón;Óg;Ó`;ÓY;ÓR;ÓK;ÓD;Ó=;Ó6;Ó/;Ó(;Ó!;Ó;Ó;Ó ;Ó;Óþ:Ó÷:Óð:Óé:Óâ:ÓÛ:ÓÔ:ÓÍ:ÓÆ:Ó¿:Ó¸:Ó±:Óª:Ó£:Óœ:Ó•:ÓŽ:Ó‡:Ó€:Óy:Ór:Ók:Ód:Ó]:ÓV:ÓO:ÓH:ÓA:Ó::Ó3:Ó,:Ó%:Ó:Ó:Ó:Ó :Ó:Óû9Óô9Óí9Óæ9Óß9ÓØ9ÓÑ9ÓÊ9ÓÃ9Ó¼9Óµ9Ó®9Ó§9Ó 9Ó™9Ó’9Ó‹9Ó„9Ó}9Óv9Óo9Óh9Óa9ÓZ9ÓS9ÓL9ÓE9Ó>9Ó79Ó09Ó)9Ó"9Ó9Ó9Ó 9Ó9Óÿ8Óø8Óñ8Óê8Óã8ÓÜ8ÓÕ8ÓÎ8ÓÇ8ÓÀ8Ó¹8Ó²8Ó«8Ó¤8Ó8Ó–8Ó8Óˆ8Ó8Óz8Ós8Ól8Óe8Ó^8ÓW8ÓP8ÓI8ÓB8Ó;8Ó48Ó-8Ó&8Ó8Ó8Ó8Ó 8Ó8Óü7Óõ7Óî7Óç7Óà7ÓÙ7ÓÒ7ÓË7ÓÄ7Ó½7Ó¶7Ó¯7Ó¨7Ó¡7Óš7Ó“7ÓŒ7Ó…7Ó~7Ów7Óp7Ói7Ób7Ó[7ÓT7ÓM7ÓF7Ó?7Ó87Ó17Ó*7Ó#7Ó7Ó7Ó7Ó7Ó7Óù6Óò6Óë6Óä6ÓÝ6ÓÖ6ÓÏ6ÓÈ6ÓÁ6Óº6Ó³6Ó¬6Ó¥6Óž6Ó—6Ó6Ó‰6Ó‚6Ó{6Ót6Óm6Óf6Ó_6ÓX6ÓQ6ÓJ6ÓC6Ó<6Ó56Ó.6Ó'6Ó 6Ó6Ó6Ó 6Ó6Óý5Óö5Óï5Óè5Óá5ÓÚ5ÓÓ5ÓÌ5ÓÅ5Ó¾5Ó·5Ó°5Ó©5Ó¢5Ó›5Ó”5Ó5Ó†5Ó5Óx5Óq5Ój5Óc5Ó\5ÓU5ÓN5ÓG5Ó@5Ó95Ó25Ó+5Ó$5Ó5Ó5Ó5Ó5Ó5Óú4Óó4Óì4Óå4ÓÞ4Ó×4ÓÐ4ÓÉ4ÓÂ4Ó»4Ó´4Ó­4Ó¦4ÓŸ4Ó˜4Ó‘4ÓŠ4Óƒ4Ó|4Óu4Ón4Óg4Ó`4ÓY4ÓR4ÓK4ÓD4Ó=4Ó64Ó/4Ó(4Ó!4Ó4Ó4Ó 4Ó4Óþ3Ó÷3Óð3Óé3Óâ3ÓÛ3ÓÔ3ÓÍ3ÓÆ3Ó¿3Ó¸3Ó±3Óª3Ó£3Óœ3Ó•3ÓŽ3Ó‡3Ó€3Óy3Ór3Ók3Ód3Ó]3ÓV3ÓO3ÓH3ÓA3Ó:3Ó33Ó,3Ó%3Ó3Ó3Ó3Ó 3Ó3Óû2Óô2Óí2Óæ2Óß2ÓØ2ÓÑ2ÓÊ2ÓÃ2Ó¼2Óµ2Ó®2Ó§2Ó 2Ó™2Ó’2Ó‹2Ó„2Ó}2Óv2Óo2Óh2Óa2ÓZ2ÓS2ÓL2ÓE2Ó>2Ó72Ó02Ó)2Ó"2Ó2Ó2Ó 2Ó2Óÿ1Óø1Óñ1Óê1Óã1ÓÜ1ÓÕ1ÓÎ1ÓÇ1ÓÀ1Ó¹1Ó²1Ó«1Ó¤1Ó1Ó–1Ó1Óˆ1Ó1Óz1Ós1Ól1Óe1Ó^1ÓW1ÓP1ÓI1ÓB1Ó;1Ó41Ó-1Ó&1Ó1Ó1Ó1Ó 1Ó1Óü0Óõ0Óî0Óç0Óà0ÓÙ0ÓÒ0ÓË0ÓÄ0Ó½0Ó¶0Ó¯0Ó¨0Ó¡0Óš0Ó“0ÓŒ0Ó…0Ó~0Ów0Óp0Ói0Ób0Ó[0ÓT0ÓM0ÓF0Ó?0Ó80Ó10Ó*0Ó#0Ó0Ó0Ó0Ó0Ó0Óù/Óò/Óë/Óä/ÓÝ/ÓÖ/ÓÏ/ÓÈ/ÓÁ/Óº/Ó³/Ó¬/Ó¥/Óž/Ó—/Ó/Ó‰/Ó‚/Ó{/Ót/Óm/Óf/Ó_/ÓX/ÓQ/ÓJ/ÓC/Ó+Ó7+Ó0+Ó)+Ó"+Ó+Ó+Ó +Ó+Óÿ*Óø*Óñ*Óê*Óã*ÓÜ*ÓÕ*ÓÎ*ÓÇ*ÓÀ*Ó¹*Ó²*Ó«*Ó¤*Ó*Ó–*Ó*Óˆ*Ó*Óz*Ós*Ól*Óe*Ó^*ÓW*ÓP*ÓI*ÓB*Ó;*Ó4*Ó-*Ó&*Ó*Ó*Ó*Ó *Ó*Óü)Óõ)Óî)Óç)Óà)ÓÙ)ÓÒ)ÓË)ÓÄ)Ó½)Ó¶)Ó¯)Ó¨)Ó¡)Óš)Ó“)ÓŒ)Ó…)Ó~)Ów)Óp)Ói)Ób)Ó[)ÓT)ÓM)ÓF)Ó?)Ó8)Ó1)Ó*)Ó#)Ó)Ó)Ó)Ó)Ó)Óù(Óò(Óë(Óä(ÓÝ(ÓÖ(ÓÏ(ÓÈ(ÓÁ(Óº(Ó³(Ó¬(Ó¥(Óž(Ó—(Ó(Ó‰(Ó‚(Ó{(Ót(Óm(Óf(Ó_(ÓX(ÓQ(ÓJ(ÓC(Ó<(Ó5(Ó.(Ó'(Ó (Ó(Ó(Ó (Ó(Óý'Óö'Óï'Óè'Óá'ÓÚ'ÓÓ'ÓÌ'ÓÅ'Ó¾'Ó·'Ó°'Ó©'Ó¢'Ó›'Ó”'Ó'Ó†'Ó'Óx'Óq'Ój'Óc'Ó\'ÓU'ÓN'ÓG'Ó@'Ó9'Ó2'Ó+'Ó$'Ó'Ó'Ó'Ó'Ó'Óú&Óó&Óì&Óå&ÓÞ&Ó×&ÓÐ&ÓÉ&ÓÂ&Ó»&Ó´&Ó­&Ó¦&ÓŸ&Ó˜&Ó‘&ÓŠ&Óƒ&Ó|&Óu&Ón&Óg&Ó`&ÓY&ÓR&ÓK&ÓD&Ó=&Ó6&Ó/&Ó(&Ó!&Ó&Ó&Ó &Ó&Óþ%Ó÷%Óð%Óé%Óâ%ÓÛ%ÓÔ%ÓÍ%ÓÆ%Ó¿%Ó¸%Ó±%Óª%Ó£%Óœ%Ó•%ÓŽ%Ó‡%Ó€%Óy%Ór%Ók%Ód%Ó]%ÓV%ÓO%ÓH%ÓA%Ó:%Ó3%Ó,%Ó%%Ó%Ó%Ó%Ó %Ó%Óû$Óô$Óí$Óæ$Óß$ÓØ$ÓÑ$ÓÊ$ÓÃ$Ó¼$Óµ$Ó®$Ó§$Ó $Ó™$Ó’$Ó‹$Ó„$Ó}$Óv$Óo$Óh$Óa$ÓZ$ÓS$ÓL$ÓE$Ó>$Ó7$Ó0$Ó)$Ó"$Ó$Ó$Ó $Ó$Óÿ#Óø#Óñ#Óê#Óã#ÓÜ#ÓÕ#ÓÎ#ÓÇ#ÓÀ#Ó¹#Ó²#Ó«#Ó¤#Ó#Ó–#Ó#Óˆ#Ó#Óz#Ós#Ól#Óe#Ó^#ÓW#ÓP#ÓI#ÓB#Ó;#Ó4#Ó-#Ó&#Ó#Ó#Ó#Ó #Ó#Óü"Óõ"Óî"Óç"Óà"ÓÙ"ÓÒ"ÓË"ÓÄ"Ó½"Ó¶"Ó¯"Ó¨"Ó¡"Óš"Ó“"ÓŒ"Ó…"Ó~"Ów"Óp"Ói"Ób"Ó["ÓT"ÓM"ÓF"Ó?"Ó8"Ó1"Ó*"Ó#"Ó"Ó"Ó"Ó"Ó"Óù!Óò!Óë!Óä!ÓÝ!ÓÖ!ÓÏ!ÓÈ!ÓÁ!Óº!Ó³!Ó¬!Ó¥!Óž!Ó—!Ó!Ó‰!Ó‚!Ó{!Ót!Óm!Óf!Ó_!ÓX!ÓQ!ÓJ!ÓC!ÓÓ7Ó0Ó)Ó"ÓÓÓ ÓÓÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓü Óõ Óî Óç Óà ÓÙ ÓÒ ÓË ÓÄ Ó½ Ó¶ Ó¯ Ó¨ Ó¡ Óš Ó“ ÓŒ Ó… Ó~ Ów Óp Ói Ób Ó[ ÓT ÓM ÓF Ó? Ó8 Ó1 Ó* Ó# Ó Ó Ó Ó Ó Óù Óò Óë Óä ÓÝ ÓÖ ÓÏ ÓÈ ÓÁ Óº Ó³ Ó¬ Ó¥ Óž Ó— Ó Ó‰ Ó‚ Ó{ Ót Óm Óf Ó_ ÓX ÓQ ÓJ ÓC Ó< Ó5 Ó. Ó' Ó Ó Ó Ó Ó Óý Óö Óï Óè Óá ÓÚ ÓÓ ÓÌ ÓÅ Ó¾ Ó· Ó° Ó© Ó¢ Ó› Ó” Ó Ó† Ó Óx Óq Ój Óc Ó\ ÓU ÓN ÓG Ó@ Ó9 Ó2 Ó+ Ó$ Ó Ó Ó Ó Ó Óú Óó Óì Óå ÓÞ Ó× ÓÐ ÓÉ Ó Ó» Ó´ Ó­ Ó¦ ÓŸ Ó˜ Ó‘ ÓŠ Óƒ Ó| Óu Ón Óg Ó` ÓY ÓR ÓK ÓD Ó= Ó6 Ó/ Ó( Ó! Ó Ó Ó Ó Óþ Ó÷ Óð Óé Óâ ÓÛ ÓÔ ÓÍ ÓÆ Ó¿ Ó¸ Ó± Óª Ó£ Óœ Ó• ÓŽ Ó‡ Ó€ Óy Ór Ók Ód Ó] ÓV ÓO ÓH ÓA Ó: Ó3 Ó, Ó% Ó Ó Ó Ó Ó ÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÿÒõÿÒîÿÒçÿÒàÿÒÙÿÒÒÿÒËÿÒÄÿÒ½ÿÒ¶ÿÒ¯ÿÒ¨ÿÒ¡ÿÒšÿÒ“ÿÒŒÿÒ…ÿÒ~ÿÒwÿÒpÿÒiÿÒbÿÒ[ÿÒTÿÒMÿÒFÿÒ?ÿÒ8ÿÒ1ÿÒ*ÿÒ#ÿÒÿÒÿÒÿÒÿÒÿÒùþÒòþÒëþÒäþÒÝþÒÖþÒÏþÒÈþÒÁþÒºþÒ³þÒ¬þÒ¥þÒžþÒ—þÒþÒ‰þÒ‚þÒ{þÒtþÒmþÒfþÒ_þÒXþÒQþÒJþÒCþÒ<þÒ5þÒ.þÒ'þÒ þÒþÒþÒ þÒþÒýýÒöýÒïýÒèýÒáýÒÚýÒÓýÒÌýÒÅýÒ¾ýÒ·ýÒ°ýÒ©ýÒ¢ýÒ›ýÒ”ýÒýÒ†ýÒýÒxýÒqýÒjýÒcýÒ\ýÒUýÒNýÒGýÒ@ýÒ9ýÒ2ýÒ+ýÒ$ýÒýÒýÒýÒýÒýÒúüÒóüÒìüÒåüÒÞüÒ×üÒÐüÒÉüÒÂüÒ»üÒ´üÒ­üÒ¦üÒŸüÒ˜üÒ‘üÒŠüÒƒüÒ|üÒuüÒnüÒgüÒ`üÒYüÒRüÒKüÒDüÒ=üÒ6üÒ/üÒ(üÒ!üÒüÒüÒ üÒüÒþûÒ÷ûÒðûÒéûÒâûÒÛûÒÔûÒÍûÒÆûÒ¿ûÒ¸ûÒ±ûÒªûÒ£ûÒœûÒ•ûÒŽûÒ‡ûÒ€ûÒyûÒrûÒkûÒdûÒ]ûÒVûÒOûÒHûÒAûÒ:ûÒ3ûÒ,ûÒ%ûÒûÒûÒûÒ ûÒûÒûúÒôúÒíúÒæúÒßúÒØúÒÑúÒÊúÒÃúÒ¼úÒµúÒ®úÒ§úÒ úÒ™úÒ’úÒ‹úÒ„úÒ}úÒvúÒoúÒhúÒaúÒZúÒSúÒLúÒEúÒ>úÒ7úÒ0úÒ)úÒ"úÒúÒúÒ úÒúÒÿùÒøùÒñùÒêùÒãùÒÜùÒÕùÒÎùÒÇùÒÀùÒ¹ùÒ²ùÒ«ùÒ¤ùÒùÒ–ùÒùÒˆùÒùÒzùÒsùÒlùÒeùÒ^ùÒWùÒPùÒIùÒBùÒ;ùÒ4ùÒ-ùÒ&ùÒùÒùÒùÒ ùÒùÒüøÒõøÒîøÒçøÒàøÒÙøÒÒøÒËøÒÄøÒ½øÒ¶øÒ¯øÒ¨øÒ¡øÒšøÒ“øÒŒøÒ…øÒ~øÒwøÒpøÒiøÒbøÒ[øÒTøÒMøÒFøÒ?øÒ8øÒ1øÒ*øÒ#øÒøÒøÒøÒøÒøÒù÷Òò÷Òë÷Òä÷ÒÝ÷ÒÖ÷ÒÏ÷ÒÈ÷ÒÁ÷Òº÷Ò³÷Ò¬÷Ò¥÷Òž÷Ò—÷Ò÷Ò‰÷Ò‚÷Ò{÷Òt÷Òm÷Òf÷Ò_÷ÒX÷ÒQ÷ÒJ÷ÒC÷Ò<÷Ò5÷Ò.÷Ò'÷Ò ÷Ò÷Ò÷Ò ÷Ò÷ÒýöÒööÒïöÒèöÒáöÒÚöÒÓöÒÌöÒÅöÒ¾öÒ·öÒ°öÒ©öÒ¢öÒ›öÒ”öÒöÒ†öÒöÒxöÒqöÒjöÒcöÒ\öÒUöÒNöÒGöÒ@öÒ9öÒ2öÒ+öÒ$öÒöÒöÒöÒöÒöÒúõÒóõÒìõÒåõÒÞõÒ×õÒÐõÒÉõÒÂõÒ»õÒ´õÒ­õÒ¦õÒŸõÒ˜õÒ‘õÒŠõÒƒõÒ|õÒuõÒnõÒgõÒ`õÒYõÒRõÒKõÒDõÒ=õÒ6õÒ/õÒ(õÒ!õÒõÒõÒ õÒõÒþôÒ÷ôÒðôÒéôÒâôÒÛôÒÔôÒÍôÒÆôÒ¿ôÒ¸ôÒ±ôÒªôÒ£ôÒœôÒ•ôÒŽôÒ‡ôÒ€ôÒyôÒrôÒkôÒdôÒ]ôÒVôÒOôÒHôÒAôÒ:ôÒ3ôÒ,ôÒ%ôÒôÒôÒôÒ ôÒôÒûóÒôóÒíóÒæóÒßóÒØóÒÑóÒÊóÒÃóÒ¼óÒµóÒ®óÒ§óÒ óÒ™óÒ’óÒ‹óÒ„óÒ}óÒvóÒoóÒhóÒaóÒZóÒSóÒLóÒEóÒ>óÒ7óÒ0óÒ)óÒ"óÒóÒóÒ óÒóÒÿòÒøòÒñòÒêòÒãòÒÜòÒÕòÒÎòÒÇòÒÀòÒ¹òÒ²òÒ«òÒ¤òÒòÒ–òÒòÒˆòÒòÒzòÒsòÒlòÒeòÒ^òÒWòÒPòÒIòÒBòÒ;òÒ4òÒ-òÒ&òÒòÒòÒòÒ òÒòÒüñÒõñÒîñÒçñÒàñÒÙñÒÒñÒËñÒÄñÒ½ñÒ¶ñÒ¯ñÒ¨ñÒ¡ñÒšñÒ“ñÒŒñÒ…ñÒ~ñÒwñÒpñÒiñÒbñÒ[ñÒTñÒMñÒFñÒ?ñÒ8ñÒ1ñÒ*ñÒ#ñÒñÒñÒñÒñÒñÒùðÒòðÒëðÒäðÒÝðÒÖðÒÏðÒÈðÒÁðÒºðÒ³ðÒ¬ðÒ¥ðÒžðÒ—ðÒðÒ‰ðÒ‚ðÒ{ðÒtðÒmðÒfðÒ_ðÒXðÒQðÒJðÒCðÒ<ðÒ5ðÒ.ðÒ'ðÒ ðÒðÒðÒ ðÒðÒýïÒöïÒïïÒèïÒáïÒÚïÒÓïÒÌïÒÅïÒ¾ïÒ·ïÒ°ïÒ©ïÒ¢ïÒ›ïÒ”ïÒïÒ†ïÒïÒxïÒqïÒjïÒcïÒ\ïÒUïÒNïÒGïÒ@ïÒ9ïÒ2ïÒ+ïÒ$ïÒïÒïÒïÒïÒïÒúîÒóîÒìîÒåîÒÞîÒ×îÒÐîÒÉîÒÂîÒ»îÒ´îÒ­îÒ¦îÒŸîÒ˜îÒ‘îÒŠîÒƒîÒ|îÒuîÒnîÒgîÒ`îÒYîÒRîÒKîÒDîÒ=îÒ6îÒ/îÒ(îÒ!îÒîÒîÒ îÒîÒþíÒ÷íÒðíÒéíÒâíÒÛíÒÔíÒÍíÒÆíÒ¿íÒ¸íÒ±íÒªíÒ£íÒœíÒ•íÒŽíÒ‡íÒ€íÒyíÒríÒkíÒdíÒ]íÒVíÒOíÒHíÒAíÒ:íÒ3íÒ,íÒ%íÒíÒíÒíÒ íÒíÒûìÒôìÒíìÒæìÒßìÒØìÒÑìÒÊìÒÃìÒ¼ìÒµìÒ®ìÒ§ìÒ ìÒ™ìÒ’ìÒ‹ìÒ„ìÒ}ìÒvìÒoìÒhìÒaìÒZìÒSìÒLìÒEìÒ>ìÒ7ìÒ0ìÒ)ìÒ"ìÒìÒìÒ ìÒìÒÿëÒøëÒñëÒêëÒãëÒÜëÒÕëÒÎëÒÇëÒÀëÒ¹ëÒ²ëÒ«ëÒ¤ëÒëÒ–ëÒëÒˆëÒëÒzëÒsëÒlëÒeëÒ^ëÒWëÒPëÒIëÒBëÒ;ëÒ4ëÒ-ëÒ&ëÒëÒëÒëÒ ëÒëÒüêÒõêÒîêÒçêÒàêÒÙêÒÒêÒËêÒÄêÒ½êÒ¶êÒ¯êÒ¨êÒ¡êÒšêÒ“êÒŒêÒ…êÒ~êÒwêÒpêÒiêÒbêÒ[êÒTêÒMêÒFêÒ?êÒ8êÒ1êÒ*êÒ#êÒêÒêÒêÒêÒêÒùéÒòéÒëéÒäéÒÝéÒÖéÒÏéÒÈéÒÁéÒºéÒ³éÒ¬éÒ¥éÒžéÒ—éÒéÒ‰éÒ‚éÒ{éÒtéÒméÒféÒ_éÒXéÒQéÒJéÒCéÒ<éÒ5éÒ.éÒ'éÒ éÒéÒéÒ éÒéÒýèÒöèÒïèÒèèÒáèÒÚèÒÓèÒÌèÒÅèÒ¾èÒ·èÒ°èÒ©èÒ¢èÒ›èÒ”èÒèÒ†èÒèÒxèÒqèÒjèÒcèÒ\èÒUèÒNèÒGèÒ@èÒ9èÒ2èÒ+èÒ$èÒèÒèÒèÒèÒèÒúçÒóçÒìçÒåçÒÞçÒ×çÒÐçÒÉçÒÂçÒ»çÒ´çÒ­çÒ¦çÒŸçÒ˜çÒ‘çÒŠçÒƒçÒ|çÒuçÒnçÒgçÒ`çÒYçÒRçÒKçÒDçÒ=çÒ6çÒ/çÒ(çÒ!çÒçÒçÒ çÒçÒþæÒ÷æÒðæÒéæÒâæÒÛæÒÔæÒÍæÒÆæÒ¿æÒ¸æÒ±æÒªæÒ£æÒœæÒ•æÒŽæÒ‡æÒ€æÒyæÒræÒkæÒdæÒ]æÒVæÒOæÒHæÒAæÒ:æÒ3æÒ,æÒ%æÒæÒæÒæÒ æÒæÒûåÒôåÒíåÒæåÒßåÒØåÒÑåÒÊåÒÃåÒ¼åÒµåÒ®åÒ§åÒ åÒ™åÒ’åÒ‹åÒ„åÒ}åÒvåÒoåÒhåÒaåÒZåÒSåÒLåÒEåÒ>åÒ7åÒ0åÒ)åÒ"åÒåÒåÒ åÒåÒÿäÒøäÒñäÒêäÒãäÒÜäÒÕäÒÎäÒÇäÒÀäÒ¹äÒ²äÒ«äÒ¤äÒäÒ–äÒäÒˆäÒäÒzäÒsäÒläÒeäÒ^äÒWäÒPäÒIäÒBäÒ;äÒ4äÒ-äÒ&äÒäÒäÒäÒ äÒäÒüãÒõãÒîãÒçãÒàãÒÙãÒÒãÒËãÒÄãÒ½ãÒ¶ãÒ¯ãÒ¨ãÒ¡ãÒšãÒ“ãÒŒãÒ…ãÒ~ãÒwãÒpãÒiãÒbãÒ[ãÒTãÒMãÒFãÒ?ãÒ8ãÒ1ãÒ*ãÒ#ãÒãÒãÒãÒãÒãÒùâÒòâÒëâÒäâÒÝâÒÖâÒÏâÒÈâÒÁâÒºâÒ³âÒ¬âÒ¥âÒžâÒ—âÒâÒ‰âÒ‚âÒ{âÒtâÒmâÒfâÒ_âÒXâÒQâÒJâÒCâÒ<âÒ5âÒ.âÒ'âÒ âÒâÒâÒ âÒâÒýáÒöáÒïáÒèáÒááÒÚáÒÓáÒÌáÒÅáÒ¾áÒ·áÒ°áÒ©áÒ¢áÒ›áÒ”áÒáÒ†áÒáÒxáÒqáÒjáÒcáÒ\áÒUáÒNáÒGáÒ@áÒ9áÒ2áÒ+áÒ$áÒáÒáÒáÒáÒáÒúàÒóàÒìàÒåàÒÞàÒ×àÒÐàÒÉàÒÂàÒ»àÒ´àÒ­àÒ¦àÒŸàÒ˜àÒ‘àÒŠàÒƒàÒ|àÒuàÒnàÒgàÒ`àÒYàÒRàÒKàÒDàÒ=àÒ6àÒ/àÒ(àÒ!àÒàÒàÒ àÒàÒþßÒ÷ßÒðßÒéßÒâßÒÛßÒÔßÒÍßÒÆßÒ¿ßÒ¸ßÒ±ßÒªßÒ£ßÒœßÒ•ßÒŽßÒ‡ßÒ€ßÒyßÒrßÒkßÒdßÒ]ßÒVßÒOßÒHßÒAßÒ:ßÒ3ßÒ,ßÒ%ßÒßÒßÒßÒ ßÒßÒûÞÒôÞÒíÞÒæÞÒßÞÒØÞÒÑÞÒÊÞÒÃÞÒ¼ÞÒµÞÒ®ÞÒ§ÞÒ ÞÒ™ÞÒ’ÞÒ‹ÞÒ„ÞÒ}ÞÒvÞÒoÞÒhÞÒaÞÒZÞÒSÞÒLÞÒEÞÒ>ÞÒ7ÞÒ0ÞÒ)ÞÒ"ÞÒÞÒÞÒ ÞÒÞÒÿÝÒøÝÒñÝÒêÝÒãÝÒÜÝÒÕÝÒÎÝÒÇÝÒÀÝÒ¹ÝÒ²ÝÒ«ÝÒ¤ÝÒÝÒ–ÝÒÝÒˆÝÒÝÒzÝÒsÝÒlÝÒeÝÒ^ÝÒWÝÒPÝÒIÝÒBÝÒ;ÝÒ4ÝÒ-ÝÒ&ÝÒÝÒÝÒÝÒ ÝÒÝÒüÜÒõÜÒîÜÒçÜÒàÜÒÙÜÒÒÜÒËÜÒÄÜÒ½ÜÒ¶ÜÒ¯ÜÒ¨ÜÒ¡ÜÒšÜÒ“ÜÒŒÜÒ…ÜÒ~ÜÒwÜÒpÜÒiÜÒbÜÒ[ÜÒTÜÒMÜÒFÜÒ?ÜÒ8ÜÒ1ÜÒ*ÜÒ#ÜÒÜÒÜÒÜÒÜÒÜÒùÛÒòÛÒëÛÒäÛÒÝÛÒÖÛÒÏÛÒÈÛÒÁÛÒºÛÒ³ÛÒ¬ÛÒ¥ÛÒžÛÒ—ÛÒÛÒ‰ÛÒ‚ÛÒ{ÛÒtÛÒmÛÒfÛÒ_ÛÒXÛÒQÛÒJÛÒCÛÒ<ÛÒ5ÛÒ.ÛÒ'ÛÒ ÛÒÛÒÛÒ ÛÒÛÒýÚÒöÚÒïÚÒèÚÒáÚÒÚÚÒÓÚÒÌÚÒÅÚÒ¾ÚÒ·ÚÒ°ÚÒ©ÚÒ¢ÚÒ›ÚÒ”ÚÒÚÒ†ÚÒÚÒxÚÒqÚÒjÚÒcÚÒ\ÚÒUÚÒNÚÒGÚÒ@ÚÒ9ÚÒ2ÚÒ+ÚÒ$ÚÒÚÒÚÒÚÒÚÒÚÒúÙÒóÙÒìÙÒåÙÒÞÙÒ×ÙÒÐÙÒÉÙÒÂÙÒ»ÙÒ´ÙÒ­ÙÒ¦ÙÒŸÙÒ˜ÙÒ‘ÙÒŠÙÒƒÙÒ|ÙÒuÙÒnÙÒgÙÒ`ÙÒYÙÒRÙÒKÙÒDÙÒ=ÙÒ6ÙÒ/ÙÒ(ÙÒ!ÙÒÙÒÙÒ ÙÒÙÒþØÒ÷ØÒðØÒéØÒâØÒÛØÒÔØÒÍØÒÆØÒ¿ØÒ¸ØÒ±ØÒªØÒ£ØÒœØÒ•ØÒŽØÒ‡ØÒ€ØÒyØÒrØÒkØÒdØÒ]ØÒVØÒOØÒHØÒAØÒ:ØÒ3ØÒ,ØÒ%ØÒØÒØÒØÒ ØÒØÒû×Òô×Òí×Òæ×Òß×ÒØ×ÒÑ×ÒÊ×ÒÃ×Ò¼×Òµ×Ò®×Ò§×Ò ×Ò™×Ò’×Ò‹×Ò„×Ò}×Òv×Òo×Òh×Òa×ÒZ×ÒS×ÒL×ÒE×Ò>×Ò7×Ò0×Ò)×Ò"×Ò×Ò×Ò ×Ò×ÒÿÖÒøÖÒñÖÒêÖÒãÖÒÜÖÒÕÖÒÎÖÒÇÖÒÀÖÒ¹ÖÒ²ÖÒ«ÖÒ¤ÖÒÖÒ–ÖÒÖÒˆÖÒÖÒzÖÒsÖÒlÖÒeÖÒ^ÖÒWÖÒPÖÒIÖÒBÖÒ;ÖÒ4ÖÒ-ÖÒ&ÖÒÖÒÖÒÖÒ ÖÒÖÒüÕÒõÕÒîÕÒçÕÒàÕÒÙÕÒÒÕÒËÕÒÄÕÒ½ÕÒ¶ÕÒ¯ÕÒ¨ÕÒ¡ÕÒšÕÒ“ÕÒŒÕÒ…ÕÒ~ÕÒwÕÒpÕÒiÕÒbÕÒ[ÕÒTÕÒMÕÒFÕÒ?ÕÒ8ÕÒ1ÕÒ*ÕÒ#ÕÒÕÒÕÒÕÒÕÒÕÒùÔÒòÔÒëÔÒäÔÒÝÔÒÖÔÒÏÔÒÈÔÒÁÔÒºÔÒ³ÔÒ¬ÔÒ¥ÔÒžÔÒ—ÔÒÔÒ‰ÔÒ‚ÔÒ{ÔÒtÔÒmÔÒfÔÒ_ÔÒXÔÒQÔÒJÔÒCÔÒ<ÔÒ5ÔÒ.ÔÒ'ÔÒ ÔÒÔÒÔÒ ÔÒÔÒýÓÒöÓÒïÓÒèÓÒáÓÒÚÓÒÓÓÒÌÓÒÅÓÒ¾ÓÒ·ÓÒ°ÓÒ©ÓÒ¢ÓÒ›ÓÒ”ÓÒÓÒ†ÓÒÓÒxÓÒqÓÒjÓÒcÓÒ\ÓÒUÓÒNÓÒGÓÒ@ÓÒ9ÓÒ2ÓÒ+ÓÒ$ÓÒÓÒÓÒÓÒÓÒÓÒúÒÒóÒÒìÒÒåÒÒÞÒÒ×ÒÒÐÒÒÉÒÒÂÒÒ»ÒÒ´ÒÒ­ÒÒ¦ÒÒŸÒÒ˜ÒÒ‘ÒÒŠÒÒƒÒÒ|ÒÒuÒÒnÒÒgÒÒ`ÒÒYÒÒRÒÒKÒÒDÒÒ=ÒÒ6ÒÒ/ÒÒ(ÒÒ!ÒÒÒÒÒÒ ÒÒÒÒþÑÒ÷ÑÒðÑÒéÑÒâÑÒÛÑÒÔÑÒÍÑÒÆÑÒ¿ÑÒ¸ÑÒ±ÑÒªÑÒ£ÑÒœÑÒ•ÑÒŽÑÒ‡ÑÒ€ÑÒyÑÒrÑÒkÑÒdÑÒ]ÑÒVÑÒOÑÒHÑÒAÑÒ:ÑÒ3ÑÒ,ÑÒ%ÑÒÑÒÑÒÑÒ ÑÒÑÒûÐÒôÐÒíÐÒæÐÒßÐÒØÐÒÑÐÒÊÐÒÃÐÒ¼ÐÒµÐÒ®ÐÒ§ÐÒ ÐÒ™ÐÒ’ÐÒ‹ÐÒ„ÐÒ}ÐÒvÐÒoÐÒhÐÒaÐÒZÐÒSÐÒLÐÒEÐÒ>ÐÒ7ÐÒ0ÐÒ)ÐÒ"ÐÒÐÒÐÒ ÐÒÐÒÿÏÒøÏÒñÏÒêÏÒãÏÒÜÏÒÕÏÒÎÏÒÇÏÒÀÏÒ¹ÏÒ²ÏÒ«ÏÒ¤ÏÒÏÒ–ÏÒÏÒˆÏÒÏÒzÏÒsÏÒlÏÒeÏÒ^ÏÒWÏÒPÏÒIÏÒBÏÒ;ÏÒ4ÏÒ-ÏÒ&ÏÒÏÒÏÒÏÒ ÏÒÏÒüÎÒõÎÒîÎÒçÎÒàÎÒÙÎÒÒÎÒËÎÒÄÎÒ½ÎÒ¶ÎÒ¯ÎÒ¨ÎÒ¡ÎÒšÎÒ“ÎÒŒÎÒ…ÎÒ~ÎÒwÎÒpÎÒiÎÒbÎÒ[ÎÒTÎÒMÎÒFÎÒ?ÎÒ8ÎÒ1ÎÒ*ÎÒ#ÎÒÎÒÎÒÎÒÎÒÎÒùÍÒòÍÒëÍÒäÍÒÝÍÒÖÍÒÏÍÒÈÍÒÁÍÒºÍÒ³ÍÒ¬ÍÒ¥ÍÒžÍÒ—ÍÒÍÒ‰ÍÒ‚ÍÒ{ÍÒtÍÒmÍÒfÍÒ_ÍÒXÍÒQÍÒJÍÒCÍÒ<ÍÒ5ÍÒ.ÍÒ'ÍÒ ÍÒÍÒÍÒ ÍÒÍÒýÌÒöÌÒïÌÒèÌÒáÌÒÚÌÒÓÌÒÌÌÒÅÌÒ¾ÌÒ·ÌÒ°ÌÒ©ÌÒ¢ÌÒ›ÌÒ”ÌÒÌÒ†ÌÒÌÒxÌÒqÌÒjÌÒcÌÒ\ÌÒUÌÒNÌÒGÌÒ@ÌÒ9ÌÒ2ÌÒ+ÌÒ$ÌÒÌÒÌÒÌÒÌÒÌÒúËÒóËÒìËÒåËÒÞËÒ×ËÒÐËÒÉËÒÂËÒ»ËÒ´ËÒ­ËÒ¦ËÒŸËÒ˜ËÒ‘ËÒŠËÒƒËÒ|ËÒuËÒnËÒgËÒ`ËÒYËÒRËÒKËÒDËÒ=ËÒ6ËÒ/ËÒ(ËÒ!ËÒËÒËÒ ËÒËÒþÊÒ÷ÊÒðÊÒéÊÒâÊÒÛÊÒÔÊÒÍÊÒÆÊÒ¿ÊÒ¸ÊÒ±ÊÒªÊÒ£ÊÒœÊÒ•ÊÒŽÊÒ‡ÊÒ€ÊÒyÊÒrÊÒkÊÒdÊÒ]ÊÒVÊÒOÊÒHÊÒAÊÒ:ÊÒ3ÊÒ,ÊÒ%ÊÒÊÒÊÒÊÒ ÊÒÊÒûÉÒôÉÒíÉÒæÉÒßÉÒØÉÒÑÉÒÊÉÒÃÉÒ¼ÉÒµÉÒ®ÉÒ§ÉÒ ÉÒ™ÉÒ’ÉÒ‹ÉÒ„ÉÒ}ÉÒvÉÒoÉÒhÉÒaÉÒZÉÒSÉÒLÉÒEÉÒ>ÉÒ7ÉÒ0ÉÒ)ÉÒ"ÉÒÉÒÉÒ ÉÒÉÒÿÈÒøÈÒñÈÒêÈÒãÈÒÜÈÒÕÈÒÎÈÒÇÈÒÀÈÒ¹ÈÒ²ÈÒ«ÈÒ¤ÈÒÈÒ–ÈÒÈÒˆÈÒÈÒzÈÒsÈÒlÈÒeÈÒ^ÈÒWÈÒPÈÒIÈÒBÈÒ;ÈÒ4ÈÒ-ÈÒ&ÈÒÈÒÈÒÈÒ ÈÒÈÒüÇÒõÇÒîÇÒçÇÒàÇÒÙÇÒÒÇÒËÇÒÄÇÒ½ÇÒ¶ÇÒ¯ÇÒ¨ÇÒ¡ÇÒšÇÒ“ÇÒŒÇÒ…ÇÒ~ÇÒwÇÒpÇÒiÇÒbÇÒ[ÇÒTÇÒMÇÒFÇÒ?ÇÒ8ÇÒ1ÇÒ*ÇÒ#ÇÒÇÒÇÒÇÒÇÒÇÒùÆÒòÆÒëÆÒäÆÒÝÆÒÖÆÒÏÆÒÈÆÒÁÆÒºÆÒ³ÆÒ¬ÆÒ¥ÆÒžÆÒ—ÆÒÆÒ‰ÆÒ‚ÆÒ{ÆÒtÆÒmÆÒfÆÒ_ÆÒXÆÒQÆÒJÆÒCÆÒ<ÆÒ5ÆÒ.ÆÒ'ÆÒ ÆÒÆÒÆÒ ÆÒÆÒýÅÒöÅÒïÅÒèÅÒáÅÒÚÅÒÓÅÒÌÅÒÅÅÒ¾ÅÒ·ÅÒ°ÅÒ©ÅÒ¢ÅÒ›ÅÒ”ÅÒÅÒ†ÅÒÅÒxÅÒqÅÒjÅÒcÅÒ\ÅÒUÅÒNÅÒGÅÒ@ÅÒ9ÅÒ2ÅÒ+ÅÒ$ÅÒÅÒÅÒÅÒÅÒÅÒúÄÒóÄÒìÄÒåÄÒÞÄÒ×ÄÒÐÄÒÉÄÒÂÄÒ»ÄÒ´ÄÒ­ÄÒ¦ÄÒŸÄÒ˜ÄÒ‘ÄÒŠÄÒƒÄÒ|ÄÒuÄÒnÄÒgÄÒ`ÄÒYÄÒRÄÒKÄÒDÄÒ=ÄÒ6ÄÒ/ÄÒ(ÄÒ!ÄÒÄÒÄÒ ÄÒÄÒþÃÒ÷ÃÒðÃÒéÃÒâÃÒÛÃÒÔÃÒÍÃÒÆÃÒ¿ÃÒ¸ÃÒ±ÃÒªÃÒ£ÃÒœÃÒ•ÃÒŽÃÒ‡ÃÒ€ÃÒyÃÒrÃÒkÃÒdÃÒ]ÃÒVÃÒOÃÒHÃÒAÃÒ:ÃÒ3ÃÒ,ÃÒ%ÃÒÃÒÃÒÃÒ ÃÒÃÒûÂÒôÂÒíÂÒæÂÒßÂÒØÂÒÑÂÒÊÂÒÃÂÒ¼ÂÒµÂÒ®ÂÒ§ÂÒ ÂÒ™ÂÒ’ÂÒ‹ÂÒ„ÂÒ}ÂÒvÂÒoÂÒhÂÒaÂÒZÂÒSÂÒLÂÒEÂÒ>ÂÒ7ÂÒ0ÂÒ)ÂÒ"ÂÒÂÒÂÒ ÂÒÂÒÿÁÒøÁÒñÁÒêÁÒãÁÒÜÁÒÕÁÒÎÁÒÇÁÒÀÁÒ¹ÁÒ²ÁÒ«ÁÒ¤ÁÒÁÒ–ÁÒÁÒˆÁÒÁÒzÁÒsÁÒlÁÒeÁÒ^ÁÒWÁÒPÁÒIÁÒBÁÒ;ÁÒ4ÁÒ-ÁÒ&ÁÒÁÒÁÒÁÒ ÁÒÁÒüÀÒõÀÒîÀÒçÀÒàÀÒÙÀÒÒÀÒËÀÒÄÀÒ½ÀÒ¶ÀÒ¯ÀÒ¨ÀÒ¡ÀÒšÀÒ“ÀÒŒÀÒ…ÀÒ~ÀÒwÀÒpÀÒiÀÒbÀÒ[ÀÒTÀÒMÀÒFÀÒ?ÀÒ8ÀÒ1ÀÒ*ÀÒ#ÀÒÀÒÀÒÀÒÀÒÀÒù¿Òò¿Òë¿Òä¿ÒÝ¿ÒÖ¿ÒÏ¿ÒÈ¿ÒÁ¿Òº¿Ò³¿Ò¬¿Ò¥¿Òž¿Ò—¿Ò¿Ò‰¿Ò‚¿Ò{¿Òt¿Òm¿Òf¿Ò_¿ÒX¿ÒQ¿ÒJ¿ÒC¿Ò<¿Ò5¿Ò.¿Ò'¿Ò ¿Ò¿Ò¿Ò ¿Ò¿Òý¾Òö¾Òï¾Òè¾Òá¾ÒÚ¾ÒÓ¾Ò̾ÒžÒ¾¾Ò·¾Ò°¾Ò©¾Ò¢¾Ò›¾Ò”¾Ò¾Ò†¾Ò¾Òx¾Òq¾Òj¾Òc¾Ò\¾ÒU¾ÒN¾ÒG¾Ò@¾Ò9¾Ò2¾Ò+¾Ò$¾Ò¾Ò¾Ò¾Ò¾Ò¾Òú½Òó½Òì½Òå½ÒÞ½Ò×½ÒнÒɽÒ½Ò»½Ò´½Ò­½Ò¦½ÒŸ½Ò˜½Ò‘½ÒнÒƒ½Ò|½Òu½Òn½Òg½Ò`½ÒY½ÒR½ÒK½ÒD½Ò=½Ò6½Ò/½Ò(½Ò!½Ò½Ò½Ò ½Ò½Òþ¼Ò÷¼Òð¼Òé¼Òâ¼ÒÛ¼ÒÔ¼ÒͼÒƼÒ¿¼Ò¸¼Ò±¼Òª¼Ò£¼Òœ¼Ò•¼Ò޼Ò‡¼Ò€¼Òy¼Òr¼Òk¼Òd¼Ò]¼ÒV¼ÒO¼ÒH¼ÒA¼Ò:¼Ò3¼Ò,¼Ò%¼Ò¼Ò¼Ò¼Ò ¼Ò¼Òû»Òô»Òí»Òæ»Òß»ÒØ»ÒÑ»ÒÊ»ÒûÒ¼»Òµ»Ò®»Ò§»Ò »Ò™»Ò’»Ò‹»Ò„»Ò}»Òv»Òo»Òh»Òa»ÒZ»ÒS»ÒL»ÒE»Ò>»Ò7»Ò0»Ò)»Ò"»Ò»Ò»Ò »Ò»ÒÿºÒøºÒñºÒêºÒãºÒܺÒÕºÒκÒǺÒÀºÒ¹ºÒ²ºÒ«ºÒ¤ºÒºÒ–ºÒºÒˆºÒºÒzºÒsºÒlºÒeºÒ^ºÒWºÒPºÒIºÒBºÒ;ºÒ4ºÒ-ºÒ&ºÒºÒºÒºÒ ºÒºÒü¹Òõ¹Òî¹Òç¹Òà¹ÒÙ¹ÒÒ¹Ò˹ÒĹÒ½¹Ò¶¹Ò¯¹Ò¨¹Ò¡¹Òš¹Ò“¹ÒŒ¹Ò…¹Ò~¹Òw¹Òp¹Òi¹Òb¹Ò[¹ÒT¹ÒM¹ÒF¹Ò?¹Ò8¹Ò1¹Ò*¹Ò#¹Ò¹Ò¹Ò¹Ò¹Ò¹Òù¸Òò¸Òë¸Òä¸ÒݸÒÖ¸ÒϸÒȸÒÁ¸Òº¸Ò³¸Ò¬¸Ò¥¸Òž¸Ò—¸Ò¸Ò‰¸Ò‚¸Ò{¸Òt¸Òm¸Òf¸Ò_¸ÒX¸ÒQ¸ÒJ¸ÒC¸Ò<¸Ò5¸Ò.¸Ò'¸Ò ¸Ò¸Ò¸Ò ¸Ò¸Òý·Òö·Òï·Òè·Òá·ÒÚ·ÒÓ·ÒÌ·ÒÅ·Ò¾·Ò··Ò°·Ò©·Ò¢·Ò›·Ò”·Ò·Ò†·Ò·Òx·Òq·Òj·Òc·Ò\·ÒU·ÒN·ÒG·Ò@·Ò9·Ò2·Ò+·Ò$·Ò·Ò·Ò·Ò·Ò·Òú¶Òó¶Òì¶Òå¶ÒÞ¶Ò×¶ÒжÒɶÒ¶Ò»¶Ò´¶Ò­¶Ò¦¶ÒŸ¶Ò˜¶Ò‘¶ÒжÒƒ¶Ò|¶Òu¶Òn¶Òg¶Ò`¶ÒY¶ÒR¶ÒK¶ÒD¶Ò=¶Ò6¶Ò/¶Ò(¶Ò!¶Ò¶Ò¶Ò ¶Ò¶ÒþµÒ÷µÒðµÒéµÒâµÒÛµÒÔµÒ͵ÒƵÒ¿µÒ¸µÒ±µÒªµÒ£µÒœµÒ•µÒ޵Ò‡µÒ€µÒyµÒrµÒkµÒdµÒ]µÒVµÒOµÒHµÒAµÒ:µÒ3µÒ,µÒ%µÒµÒµÒµÒ µÒµÒû´Òô´Òí´Òæ´Òß´ÒØ´ÒÑ´ÒÊ´ÒôÒ¼´Òµ´Ò®´Ò§´Ò ´Ò™´Ò’´Ò‹´Ò„´Ò}´Òv´Òo´Òh´Òa´ÒZ´ÒS´ÒL´ÒE´Ò>´Ò7´Ò0´Ò)´Ò"´Ò´Ò´Ò ´Ò´Òÿ³Òø³Òñ³Òê³Òã³ÒܳÒÕ³ÒγÒdzÒÀ³Ò¹³Ò²³Ò«³Ò¤³Ò³Ò–³Ò³Òˆ³Ò³Òz³Òs³Òl³Òe³Ò^³ÒW³ÒP³ÒI³ÒB³Ò;³Ò4³Ò-³Ò&³Ò³Ò³Ò³Ò ³Ò³Òü²Òõ²Òî²Òç²Òà²ÒÙ²ÒÒ²Ò˲ÒIJÒ½²Ò¶²Ò¯²Ò¨²Ò¡²Òš²Ò“²ÒŒ²Ò…²Ò~²Òw²Òp²Òi²Òb²Ò[²ÒT²ÒM²ÒF²Ò?²Ò8²Ò1²Ò*²Ò#²Ò²Ò²Ò²Ò²Ò²Òù±Òò±Òë±Òä±ÒݱÒÖ±ÒϱÒȱÒÁ±Òº±Ò³±Ò¬±Ò¥±Òž±Ò—±Ò±Ò‰±Ò‚±Ò{±Òt±Òm±Òf±Ò_±ÒX±ÒQ±ÒJ±ÒC±Ò<±Ò5±Ò.±Ò'±Ò ±Ò±Ò±Ò ±Ò±Òý°Òö°Òï°Òè°Òá°ÒÚ°ÒÓ°Ò̰ÒŰÒ¾°Ò·°Ò°°Ò©°Ò¢°Ò›°Ò”°Ò°Ò†°Ò°Òx°Òq°Òj°Òc°Ò\°ÒU°ÒN°ÒG°Ò@°Ò9°Ò2°Ò+°Ò$°Ò°Ò°Ò°Ò°Ò°Òú¯Òó¯Òì¯Òå¯ÒÞ¯ÒׯÒЯÒɯÒ¯Ò»¯Ò´¯Ò­¯Ò¦¯ÒŸ¯Ò˜¯Ò‘¯ÒНÒƒ¯Ò|¯Òu¯Òn¯Òg¯Ò`¯ÒY¯ÒR¯ÒK¯ÒD¯Ò=¯Ò6¯Ò/¯Ò(¯Ò!¯Ò¯Ò¯Ò ¯Ò¯Òþ®Ò÷®Òð®Òé®Òâ®ÒÛ®ÒÔ®ÒÍ®ÒÆ®Ò¿®Ò¸®Ò±®Òª®Ò£®Òœ®Ò•®ÒŽ®Ò‡®Ò€®Òy®Òr®Òk®Òd®Ò]®ÒV®ÒO®ÒH®ÒA®Ò:®Ò3®Ò,®Ò%®Ò®Ò®Ò®Ò ®Ò®Òû­Òô­Òí­Òæ­Òß­ÒØ­ÒÑ­ÒÊ­ÒíÒ¼­Òµ­Ò®­Ò§­Ò ­Ò™­Ò’­Ò‹­Ò„­Ò}­Òv­Òo­Òh­Òa­ÒZ­ÒS­ÒL­ÒE­Ò>­Ò7­Ò0­Ò)­Ò"­Ò­Ò­Ò ­Ò­Òÿ¬Òø¬Òñ¬Òê¬Òã¬ÒܬÒÕ¬ÒάÒǬÒÀ¬Ò¹¬Ò²¬Ò«¬Ò¤¬Ò¬Ò–¬Ò¬Òˆ¬Ò¬Òz¬Òs¬Òl¬Òe¬Ò^¬ÒW¬ÒP¬ÒI¬ÒB¬Ò;¬Ò4¬Ò-¬Ò&¬Ò¬Ò¬Ò¬Ò ¬Ò¬Òü«Òõ«Òî«Òç«Òà«ÒÙ«ÒÒ«ÒË«Òīҽ«Ò¶«Ò¯«Ò¨«Ò¡«Òš«Ò“«ÒŒ«Ò…«Ò~«Òw«Òp«Òi«Òb«Ò[«ÒT«ÒM«ÒF«Ò?«Ò8«Ò1«Ò*«Ò#«Ò«Ò«Ò«Ò«Ò«ÒùªÒòªÒëªÒäªÒݪÒÖªÒϪÒȪÒÁªÒºªÒ³ªÒ¬ªÒ¥ªÒžªÒ—ªÒªÒ‰ªÒ‚ªÒ{ªÒtªÒmªÒfªÒ_ªÒXªÒQªÒJªÒCªÒ<ªÒ5ªÒ.ªÒ'ªÒ ªÒªÒªÒ ªÒªÒý©Òö©Òï©Òè©Òá©ÒÚ©ÒÓ©ÒÌ©ÒũҾ©Ò·©Ò°©Ò©©Ò¢©Ò›©Ò”©Ò©Ò†©Ò©Òx©Òq©Òj©Òc©Ò\©ÒU©ÒN©ÒG©Ò@©Ò9©Ò2©Ò+©Ò$©Ò©Ò©Ò©Ò©Ò©Òú¨Òó¨Òì¨Òå¨ÒÞ¨ÒרÒШÒɨÒ¨Ò»¨Ò´¨Ò­¨Ò¦¨ÒŸ¨Ò˜¨Ò‘¨ÒЍÒƒ¨Ò|¨Òu¨Òn¨Òg¨Ò`¨ÒY¨ÒR¨ÒK¨ÒD¨Ò=¨Ò6¨Ò/¨Ò(¨Ò!¨Ò¨Ò¨Ò ¨Ò¨Òþ§Ò÷§Òð§Òé§Òâ§ÒÛ§ÒÔ§ÒͧÒƧÒ¿§Ò¸§Ò±§Òª§Ò£§Òœ§Ò•§ÒާÒ‡§Ò€§Òy§Òr§Òk§Òd§Ò]§ÒV§ÒO§ÒH§ÒA§Ò:§Ò3§Ò,§Ò%§Ò§Ò§Ò§Ò §Ò§Òû¦Òô¦Òí¦Òæ¦ÒߦÒئÒѦÒʦÒæÒ¼¦Òµ¦Ò®¦Ò§¦Ò ¦Ò™¦Ò’¦Ò‹¦Ò„¦Ò}¦Òv¦Òo¦Òh¦Òa¦ÒZ¦ÒS¦ÒL¦ÒE¦Ò>¦Ò7¦Ò0¦Ò)¦Ò"¦Ò¦Ò¦Ò ¦Ò¦Òÿ¥Òø¥Òñ¥Òê¥Òã¥ÒÜ¥ÒÕ¥ÒÎ¥ÒÇ¥ÒÀ¥Ò¹¥Ò²¥Ò«¥Ò¤¥Ò¥Ò–¥Ò¥Òˆ¥Ò¥Òz¥Òs¥Òl¥Òe¥Ò^¥ÒW¥ÒP¥ÒI¥ÒB¥Ò;¥Ò4¥Ò-¥Ò&¥Ò¥Ò¥Ò¥Ò ¥Ò¥Òü¤Òõ¤Òî¤Òç¤Òà¤ÒÙ¤ÒÒ¤ÒˤÒĤÒ½¤Ò¶¤Ò¯¤Ò¨¤Ò¡¤Òš¤Ò“¤ÒŒ¤Ò…¤Ò~¤Òw¤Òp¤Òi¤Òb¤Ò[¤ÒT¤ÒM¤ÒF¤Ò?¤Ò8¤Ò1¤Ò*¤Ò#¤Ò¤Ò¤Ò¤Ò¤Ò¤Òù£Òò£Òë£Òä£ÒÝ£ÒÖ£ÒÏ£ÒÈ£ÒÁ£Òº£Ò³£Ò¬£Ò¥£Òž£Ò—£Ò£Ò‰£Ò‚£Ò{£Òt£Òm£Òf£Ò_£ÒX£ÒQ£ÒJ£ÒC£Ò<£Ò5£Ò.£Ò'£Ò £Ò£Ò£Ò £Ò£Òý¢Òö¢Òï¢Òè¢Òá¢ÒÚ¢ÒÓ¢ÒÌ¢ÒÅ¢Ò¾¢Ò·¢Ò°¢Ò©¢Ò¢¢Ò›¢Ò”¢Ò¢Ò†¢Ò¢Òx¢Òq¢Òj¢Òc¢Ò\¢ÒU¢ÒN¢ÒG¢Ò@¢Ò9¢Ò2¢Ò+¢Ò$¢Ò¢Ò¢Ò¢Ò¢Ò¢Òú¡Òó¡Òì¡Òå¡ÒÞ¡ÒסÒСÒɡҡһ¡Ò´¡Ò­¡Ò¦¡ÒŸ¡Ò˜¡Ò‘¡ÒŠ¡Òƒ¡Ò|¡Òu¡Òn¡Òg¡Ò`¡ÒY¡ÒR¡ÒK¡ÒD¡Ò=¡Ò6¡Ò/¡Ò(¡Ò!¡Ò¡Ò¡Ò ¡Ò¡Òþ Ò÷ Òð Òé Òâ ÒÛ ÒÔ ÒÍ ÒÆ Ò¿ Ò¸ Ò± Òª Ò£ Òœ Ò• ÒŽ Ò‡ Ò€ Òy Òr Òk Òd Ò] ÒV ÒO ÒH ÒA Ò: Ò3 Ò, Ò% Ò Ò Ò Ò  Ò ÒûŸÒôŸÒíŸÒæŸÒߟÒØŸÒÑŸÒÊŸÒßÒ¼ŸÒµŸÒ®ŸÒ§ŸÒ ŸÒ™ŸÒ’ŸÒ‹ŸÒ„ŸÒ}ŸÒvŸÒoŸÒhŸÒaŸÒZŸÒSŸÒLŸÒEŸÒ>ŸÒ7ŸÒ0ŸÒ)ŸÒ"ŸÒŸÒŸÒ ŸÒŸÒÿžÒøžÒñžÒêžÒãžÒÜžÒÕžÒΞÒÇžÒÀžÒ¹žÒ²žÒ«žÒ¤žÒžÒ–žÒžÒˆžÒžÒzžÒsžÒlžÒežÒ^žÒWžÒPžÒIžÒBžÒ;žÒ4žÒ-žÒ&žÒžÒžÒžÒ žÒžÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùœÒòœÒëœÒäœÒÝœÒÖœÒÏœÒÈœÒÁœÒºœÒ³œÒ¬œÒ¥œÒžœÒ—œÒœÒ‰œÒ‚œÒ{œÒtœÒmœÒfœÒ_œÒXœÒQœÒJœÒCœÒ<œÒ5œÒ.œÒ'œÒ œÒœÒœÒ œÒœÒý›Òö›Òï›Òè›Òá›ÒÚ›ÒÓ›ÒÌ›ÒśҾ›Ò·›Ò°›Ò©›Ò¢›Ò››Ò”›Ò›Ò†›Ò›Òx›Òq›Òj›Òc›Ò\›ÒU›ÒN›ÒG›Ò@›Ò9›Ò2›Ò+›Ò$›Ò›Ò›Ò›Ò›Ò›ÒúšÒóšÒìšÒåšÒÞšÒךÒКÒÉšÒšÒ»šÒ´šÒ­šÒ¦šÒŸšÒ˜šÒ‘šÒŠšÒƒšÒ|šÒušÒnšÒgšÒ`šÒYšÒRšÒKšÒDšÒ=šÒ6šÒ/šÒ(šÒ!šÒšÒšÒ šÒšÒþ™Ò÷™Òð™Òé™Òâ™ÒÛ™ÒÔ™ÒÍ™ÒÆ™Ò¿™Ò¸™Ò±™Òª™Ò£™Òœ™Ò•™ÒŽ™Ò‡™Ò€™Òy™Òr™Òk™Òd™Ò]™ÒV™ÒO™ÒH™ÒA™Ò:™Ò3™Ò,™Ò%™Ò™Ò™Ò™Ò ™Ò™Òû˜Òô˜Òí˜Òæ˜ÒߘÒؘÒјÒʘÒØÒ¼˜Òµ˜Ò®˜Ò§˜Ò ˜Ò™˜Ò’˜Ò‹˜Ò„˜Ò}˜Òv˜Òo˜Òh˜Òa˜ÒZ˜ÒS˜ÒL˜ÒE˜Ò>˜Ò7˜Ò0˜Ò)˜Ò"˜Ò˜Ò˜Ò ˜Ò˜Òÿ—Òø—Òñ—Òê—Òã—ÒÜ—ÒÕ—ÒΗÒÇ—ÒÀ—Ò¹—Ò²—Ò«—Ò¤—Ò—Ò–—Ò—Òˆ—Ò—Òz—Òs—Òl—Òe—Ò^—ÒW—ÒP—ÒI—ÒB—Ò;—Ò4—Ò-—Ò&—Ò—Ò—Ò—Ò —Ò—Òü–Òõ–Òî–Òç–Òà–ÒÙ–ÒÒ–ÒË–ÒÄ–Ò½–Ò¶–Ò¯–Ò¨–Ò¡–Òš–Ò“–ÒŒ–Ò…–Ò~–Òw–Òp–Òi–Òb–Ò[–ÒT–ÒM–ÒF–Ò?–Ò8–Ò1–Ò*–Ò#–Ò–Ò–Ò–Ò–Ò–Òù•Òò•Òë•Òä•ÒÝ•ÒÖ•ÒÏ•ÒÈ•ÒÁ•Òº•Ò³•Ò¬•Ò¥•Òž•Ò—•Ò•Ò‰•Ò‚•Ò{•Òt•Òm•Òf•Ò_•ÒX•ÒQ•ÒJ•ÒC•Ò<•Ò5•Ò.•Ò'•Ò •Ò•Ò•Ò •Ò•Òý”Òö”Òï”Òè”Òá”ÒÚ”ÒÓ”ÒÌ”ÒŔҾ”Ò·”Ò°”Ò©”Ò¢”Ò›”Ò””Ò”Ò†”Ò”Òx”Òq”Òj”Òc”Ò\”ÒU”ÒN”ÒG”Ò@”Ò9”Ò2”Ò+”Ò$”Ò”Ò”Ò”Ò”Ò”Òú“Òó“Òì“Òå“ÒÞ“ÒדÒГÒɓғһ“Ò´“Ò­“Ò¦“ÒŸ“Ò˜“Ò‘“ÒŠ“Òƒ“Ò|“Òu“Òn“Òg“Ò`“ÒY“ÒR“ÒK“ÒD“Ò=“Ò6“Ò/“Ò(“Ò!“Ò“Ò“Ò “Ò“Òþ’Ò÷’Òð’Òé’Òâ’ÒÛ’ÒÔ’ÒÍ’ÒÆ’Ò¿’Ò¸’Ò±’Òª’Ò£’Òœ’Ò•’ÒŽ’Ò‡’Ò€’Òy’Òr’Òk’Òd’Ò]’ÒV’ÒO’ÒH’ÒA’Ò:’Ò3’Ò,’Ò%’Ò’Ò’Ò’Ò ’Ò’Òû‘Òô‘Òí‘Òæ‘Òß‘ÒØ‘ÒÑ‘ÒÊ‘ÒÑÒ¼‘Òµ‘Ò®‘Ò§‘Ò ‘Ò™‘Ò’‘Ò‹‘Ò„‘Ò}‘Òv‘Òo‘Òh‘Òa‘ÒZ‘ÒS‘ÒL‘ÒE‘Ò>‘Ò7‘Ò0‘Ò)‘Ò"‘Ò‘Ò‘Ò ‘Ò‘ÒÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùŽÒòŽÒëŽÒäŽÒÝŽÒÖŽÒÏŽÒÈŽÒÁŽÒºŽÒ³ŽÒ¬ŽÒ¥ŽÒžŽÒ—ŽÒŽÒ‰ŽÒ‚ŽÒ{ŽÒtŽÒmŽÒfŽÒ_ŽÒXŽÒQŽÒJŽÒCŽÒ<ŽÒ5ŽÒ.ŽÒ'ŽÒ ŽÒŽÒŽÒ ŽÒŽÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúŒÒóŒÒìŒÒåŒÒÞŒÒ׌ÒÐŒÒɌҌһŒÒ´ŒÒ­ŒÒ¦ŒÒŸŒÒ˜ŒÒ‘ŒÒŠŒÒƒŒÒ|ŒÒuŒÒnŒÒgŒÒ`ŒÒYŒÒRŒÒKŒÒDŒÒ=ŒÒ6ŒÒ/ŒÒ(ŒÒ!ŒÒŒÒŒÒ ŒÒŒÒþ‹Ò÷‹Òð‹Òé‹Òâ‹ÒÛ‹ÒÔ‹ÒÍ‹ÒÆ‹Ò¿‹Ò¸‹Ò±‹Òª‹Ò£‹Òœ‹Ò•‹ÒŽ‹Ò‡‹Ò€‹Òy‹Òr‹Òk‹Òd‹Ò]‹ÒV‹ÒO‹ÒH‹ÒA‹Ò:‹Ò3‹Ò,‹Ò%‹Ò‹Ò‹Ò‹Ò ‹Ò‹ÒûŠÒôŠÒíŠÒæŠÒߊÒØŠÒÑŠÒÊŠÒÊÒ¼ŠÒµŠÒ®ŠÒ§ŠÒ ŠÒ™ŠÒ’ŠÒ‹ŠÒ„ŠÒ}ŠÒvŠÒoŠÒhŠÒaŠÒZŠÒSŠÒLŠÒEŠÒ>ŠÒ7ŠÒ0ŠÒ)ŠÒ"ŠÒŠÒŠÒ ŠÒŠÒÿ‰Òø‰Òñ‰Òê‰Òã‰Ò܉ÒÕ‰ÒΉÒljÒÀ‰Ò¹‰Ò²‰Ò«‰Ò¤‰Ò‰Ò–‰Ò‰Òˆ‰Ò‰Òz‰Òs‰Òl‰Òe‰Ò^‰ÒW‰ÒP‰ÒI‰ÒB‰Ò;‰Ò4‰Ò-‰Ò&‰Ò‰Ò‰Ò‰Ò ‰Ò‰ÒüˆÒõˆÒîˆÒçˆÒàˆÒÙˆÒÒˆÒˈÒĈÒ½ˆÒ¶ˆÒ¯ˆÒ¨ˆÒ¡ˆÒšˆÒ“ˆÒŒˆÒ…ˆÒ~ˆÒwˆÒpˆÒiˆÒbˆÒ[ˆÒTˆÒMˆÒFˆÒ?ˆÒ8ˆÒ1ˆÒ*ˆÒ#ˆÒˆÒˆÒˆÒˆÒˆÒù‡Òò‡Òë‡Òä‡Ò݇ÒÖ‡ÒχÒȇÒÁ‡Òº‡Ò³‡Ò¬‡Ò¥‡Òž‡Ò—‡Ò‡Ò‰‡Ò‚‡Ò{‡Òt‡Òm‡Òf‡Ò_‡ÒX‡ÒQ‡ÒJ‡ÒC‡Ò<‡Ò5‡Ò.‡Ò'‡Ò ‡Ò‡Ò‡Ò ‡Ò‡Òý†Òö†Òï†Òè†Òá†ÒÚ†ÒÓ†Ò̆ÒņÒ¾†Ò·†Ò°†Ò©†Ò¢†Ò›†Ò”†Ò†Ò††Ò†Òx†Òq†Òj†Òc†Ò\†ÒU†ÒN†ÒG†Ò@†Ò9†Ò2†Ò+†Ò$†Ò†Ò†Ò†Ò†Ò†Òú…Òó…Òì…Òå…ÒÞ…Ò×…ÒÐ…ÒÉ…ÒÂ…Ò»…Ò´…Ò­…Ò¦…ÒŸ…Ò˜…Ò‘…ÒŠ…Òƒ…Ò|…Òu…Òn…Òg…Ò`…ÒY…ÒR…ÒK…ÒD…Ò=…Ò6…Ò/…Ò(…Ò!…Ò…Ò…Ò …Ò…Òþ„Ò÷„Òð„Òé„Òâ„ÒÛ„ÒÔ„ÒÍ„ÒÆ„Ò¿„Ò¸„Ò±„Òª„Ò£„Òœ„Ò•„ÒŽ„Ò‡„Ò€„Òy„Òr„Òk„Òd„Ò]„ÒV„ÒO„ÒH„ÒA„Ò:„Ò3„Ò,„Ò%„Ò„Ò„Ò„Ò „Ò„ÒûƒÒôƒÒíƒÒæƒÒ߃Ò؃ÒуÒʃÒÃÒ¼ƒÒµƒÒ®ƒÒ§ƒÒ ƒÒ™ƒÒ’ƒÒ‹ƒÒ„ƒÒ}ƒÒvƒÒoƒÒhƒÒaƒÒZƒÒSƒÒLƒÒEƒÒ>ƒÒ7ƒÒ0ƒÒ)ƒÒ"ƒÒƒÒƒÒ ƒÒƒÒÿ‚Òø‚Òñ‚Òê‚Òã‚ÒÜ‚ÒÕ‚Ò΂ÒÇ‚ÒÀ‚Ò¹‚Ò²‚Ò«‚Ò¤‚Ò‚Ò–‚Ò‚Òˆ‚Ò‚Òz‚Òs‚Òl‚Òe‚Ò^‚ÒW‚ÒP‚ÒI‚ÒB‚Ò;‚Ò4‚Ò-‚Ò&‚Ò‚Ò‚Ò‚Ò ‚Ò‚ÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒù€Òò€Òë€Òä€ÒÝ€ÒÖ€ÒÏ€ÒÈ€ÒÁ€Òº€Ò³€Ò¬€Ò¥€Òž€Ò—€Ò€Ò‰€Ò‚€Ò{€Òt€Òm€Òf€Ò_€ÒX€ÒQ€ÒJ€ÒC€Ò<€Ò5€Ò.€Ò'€Ò €Ò€Ò€Ò €Ò€ÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒú~Òó~Òì~Òå~ÒÞ~Ò×~ÒÐ~ÒÉ~ÒÂ~Ò»~Ò´~Ò­~Ò¦~ÒŸ~Ò˜~Ò‘~ÒŠ~Òƒ~Ò|~Òu~Òn~Òg~Ò`~ÒY~ÒR~ÒK~ÒD~Ò=~Ò6~Ò/~Ò(~Ò!~Ò~Ò~Ò ~Ò~Òþ}Ò÷}Òð}Òé}Òâ}ÒÛ}ÒÔ}ÒÍ}ÒÆ}Ò¿}Ò¸}Ò±}Òª}Ò£}Òœ}Ò•}ÒŽ}Ò‡}Ò€}Òy}Òr}Òk}Òd}Ò]}ÒV}ÒO}ÒH}ÒA}Ò:}Ò3}Ò,}Ò%}Ò}Ò}Ò}Ò }Ò}Òû|Òô|Òí|Òæ|Òß|ÒØ|ÒÑ|ÒÊ|ÒÃ|Ò¼|Òµ|Ò®|Ò§|Ò |Ò™|Ò’|Ò‹|Ò„|Ò}|Òv|Òo|Òh|Òa|ÒZ|ÒS|ÒL|ÒE|Ò>|Ò7|Ò0|Ò)|Ò"|Ò|Ò|Ò |Ò|Òÿ{Òø{Òñ{Òê{Òã{ÒÜ{ÒÕ{ÒÎ{ÒÇ{ÒÀ{Ò¹{Ò²{Ò«{Ò¤{Ò{Ò–{Ò{Òˆ{Ò{Òz{Òs{Òl{Òe{Ò^{ÒW{ÒP{ÒI{ÒB{Ò;{Ò4{Ò-{Ò&{Ò{Ò{Ò{Ò {Ò{ÒüzÒõzÒîzÒçzÒàzÒÙzÒÒzÒËzÒÄzÒ½zÒ¶zÒ¯zÒ¨zÒ¡zÒšzÒ“zÒŒzÒ…zÒ~zÒwzÒpzÒizÒbzÒ[zÒTzÒMzÒFzÒ?zÒ8zÒ1zÒ*zÒ#zÒzÒzÒzÒzÒzÒùyÒòyÒëyÒäyÒÝyÒÖyÒÏyÒÈyÒÁyÒºyÒ³yÒ¬yÒ¥yÒžyÒ—yÒyÒ‰yÒ‚yÒ{yÒtyÒmyÒfyÒ_yÒXyÒQyÒJyÒCyÒuÒ7uÒ0uÒ)uÒ"uÒuÒuÒ uÒuÒÿtÒøtÒñtÒêtÒãtÒÜtÒÕtÒÎtÒÇtÒÀtÒ¹tÒ²tÒ«tÒ¤tÒtÒ–tÒtÒˆtÒtÒztÒstÒltÒetÒ^tÒWtÒPtÒItÒBtÒ;tÒ4tÒ-tÒ&tÒtÒtÒtÒ tÒtÒüsÒõsÒîsÒçsÒàsÒÙsÒÒsÒËsÒÄsÒ½sÒ¶sÒ¯sÒ¨sÒ¡sÒšsÒ“sÒŒsÒ…sÒ~sÒwsÒpsÒisÒbsÒ[sÒTsÒMsÒFsÒ?sÒ8sÒ1sÒ*sÒ#sÒsÒsÒsÒsÒsÒùrÒòrÒërÒärÒÝrÒÖrÒÏrÒÈrÒÁrÒºrÒ³rÒ¬rÒ¥rÒžrÒ—rÒrÒ‰rÒ‚rÒ{rÒtrÒmrÒfrÒ_rÒXrÒQrÒJrÒCrÒnÒ7nÒ0nÒ)nÒ"nÒnÒnÒ nÒnÒÿmÒømÒñmÒêmÒãmÒÜmÒÕmÒÎmÒÇmÒÀmÒ¹mÒ²mÒ«mÒ¤mÒmÒ–mÒmÒˆmÒmÒzmÒsmÒlmÒemÒ^mÒWmÒPmÒImÒBmÒ;mÒ4mÒ-mÒ&mÒmÒmÒmÒ mÒmÒülÒõlÒîlÒçlÒàlÒÙlÒÒlÒËlÒÄlÒ½lÒ¶lÒ¯lÒ¨lÒ¡lÒšlÒ“lÒŒlÒ…lÒ~lÒwlÒplÒilÒblÒ[lÒTlÒMlÒFlÒ?lÒ8lÒ1lÒ*lÒ#lÒlÒlÒlÒlÒlÒùkÒòkÒëkÒäkÒÝkÒÖkÒÏkÒÈkÒÁkÒºkÒ³kÒ¬kÒ¥kÒžkÒ—kÒkÒ‰kÒ‚kÒ{kÒtkÒmkÒfkÒ_kÒXkÒQkÒJkÒCkÒgÒ7gÒ0gÒ)gÒ"gÒgÒgÒ gÒgÒÿfÒøfÒñfÒêfÒãfÒÜfÒÕfÒÎfÒÇfÒÀfÒ¹fÒ²fÒ«fÒ¤fÒfÒ–fÒfÒˆfÒfÒzfÒsfÒlfÒefÒ^fÒWfÒPfÒIfÒBfÒ;fÒ4fÒ-fÒ&fÒfÒfÒfÒ fÒfÒüeÒõeÒîeÒçeÒàeÒÙeÒÒeÒËeÒÄeÒ½eÒ¶eÒ¯eÒ¨eÒ¡eÒšeÒ“eÒŒeÒ…eÒ~eÒweÒpeÒieÒbeÒ[eÒTeÒMeÒFeÒ?eÒ8eÒ1eÒ*eÒ#eÒeÒeÒeÒeÒeÒùdÒòdÒëdÒädÒÝdÒÖdÒÏdÒÈdÒÁdÒºdÒ³dÒ¬dÒ¥dÒždÒ—dÒdÒ‰dÒ‚dÒ{dÒtdÒmdÒfdÒ_dÒXdÒQdÒJdÒCdÒ`Ò7`Ò0`Ò)`Ò"`Ò`Ò`Ò `Ò`Òÿ_Òø_Òñ_Òê_Òã_ÒÜ_ÒÕ_ÒÎ_ÒÇ_ÒÀ_Ò¹_Ò²_Ò«_Ò¤_Ò_Ò–_Ò_Òˆ_Ò_Òz_Òs_Òl_Òe_Ò^_ÒW_ÒP_ÒI_ÒB_Ò;_Ò4_Ò-_Ò&_Ò_Ò_Ò_Ò _Ò_Òü^Òõ^Òî^Òç^Òà^ÒÙ^ÒÒ^ÒË^ÒÄ^Ò½^Ò¶^Ò¯^Ò¨^Ò¡^Òš^Ò“^ÒŒ^Ò…^Ò~^Òw^Òp^Òi^Òb^Ò[^ÒT^ÒM^ÒF^Ò?^Ò8^Ò1^Ò*^Ò#^Ò^Ò^Ò^Ò^Ò^Òù]Òò]Òë]Òä]ÒÝ]ÒÖ]ÒÏ]ÒÈ]ÒÁ]Òº]Ò³]Ò¬]Ò¥]Òž]Ò—]Ò]Ò‰]Ò‚]Ò{]Òt]Òm]Òf]Ò_]ÒX]ÒQ]ÒJ]ÒC]Ò<]Ò5]Ò.]Ò']Ò ]Ò]Ò]Ò ]Ò]Òý\Òö\Òï\Òè\Òá\ÒÚ\ÒÓ\ÒÌ\ÒÅ\Ò¾\Ò·\Ò°\Ò©\Ò¢\Ò›\Ò”\Ò\Ò†\Ò\Òx\Òq\Òj\Òc\Ò\\ÒU\ÒN\ÒG\Ò@\Ò9\Ò2\Ò+\Ò$\Ò\Ò\Ò\Ò\Ò\Òú[Òó[Òì[Òå[ÒÞ[Ò×[ÒÐ[ÒÉ[ÒÂ[Ò»[Ò´[Ò­[Ò¦[ÒŸ[Ò˜[Ò‘[ÒŠ[Òƒ[Ò|[Òu[Òn[Òg[Ò`[ÒY[ÒR[ÒK[ÒD[Ò=[Ò6[Ò/[Ò([Ò![Ò[Ò[Ò [Ò[ÒþZÒ÷ZÒðZÒéZÒâZÒÛZÒÔZÒÍZÒÆZÒ¿ZÒ¸ZÒ±ZÒªZÒ£ZÒœZÒ•ZÒŽZÒ‡ZÒ€ZÒyZÒrZÒkZÒdZÒ]ZÒVZÒOZÒHZÒAZÒ:ZÒ3ZÒ,ZÒ%ZÒZÒZÒZÒ ZÒZÒûYÒôYÒíYÒæYÒßYÒØYÒÑYÒÊYÒÃYÒ¼YÒµYÒ®YÒ§YÒ YÒ™YÒ’YÒ‹YÒ„YÒ}YÒvYÒoYÒhYÒaYÒZYÒSYÒLYÒEYÒ>YÒ7YÒ0YÒ)YÒ"YÒYÒYÒ YÒYÒÿXÒøXÒñXÒêXÒãXÒÜXÒÕXÒÎXÒÇXÒÀXÒ¹XÒ²XÒ«XÒ¤XÒXÒ–XÒXÒˆXÒXÒzXÒsXÒlXÒeXÒ^XÒWXÒPXÒIXÒBXÒ;XÒ4XÒ-XÒ&XÒXÒXÒXÒ XÒXÒüWÒõWÒîWÒçWÒàWÒÙWÒÒWÒËWÒÄWÒ½WÒ¶WÒ¯WÒ¨WÒ¡WÒšWÒ“WÒŒWÒ…WÒ~WÒwWÒpWÒiWÒbWÒ[WÒTWÒMWÒFWÒ?WÒ8WÒ1WÒ*WÒ#WÒWÒWÒWÒWÒWÒùVÒòVÒëVÒäVÒÝVÒÖVÒÏVÒÈVÒÁVÒºVÒ³VÒ¬VÒ¥VÒžVÒ—VÒVÒ‰VÒ‚VÒ{VÒtVÒmVÒfVÒ_VÒXVÒQVÒJVÒCVÒRÒ7RÒ0RÒ)RÒ"RÒRÒRÒ RÒRÒÿQÒøQÒñQÒêQÒãQÒÜQÒÕQÒÎQÒÇQÒÀQÒ¹QÒ²QÒ«QÒ¤QÒQÒ–QÒQÒˆQÒQÒzQÒsQÒlQÒeQÒ^QÒWQÒPQÒIQÒBQÒ;QÒ4QÒ-QÒ&QÒQÒQÒQÒ QÒQÒüPÒõPÒîPÒçPÒàPÒÙPÒÒPÒËPÒÄPÒ½PÒ¶PÒ¯PÒ¨PÒ¡PÒšPÒ“PÒŒPÒ…PÒ~PÒwPÒpPÒiPÒbPÒ[PÒTPÒMPÒFPÒ?PÒ8PÒ1PÒ*PÒ#PÒPÒPÒPÒPÒPÒùOÒòOÒëOÒäOÒÝOÒÖOÒÏOÒÈOÒÁOÒºOÒ³OÒ¬OÒ¥OÒžOÒ—OÒOÒ‰OÒ‚OÒ{OÒtOÒmOÒfOÒ_OÒXOÒQOÒJOÒCOÒKÒ7KÒ0KÒ)KÒ"KÒKÒKÒ KÒKÒÿJÒøJÒñJÒêJÒãJÒÜJÒÕJÒÎJÒÇJÒÀJÒ¹JÒ²JÒ«JÒ¤JÒJÒ–JÒJÒˆJÒJÒzJÒsJÒlJÒeJÒ^JÒWJÒPJÒIJÒBJÒ;JÒ4JÒ-JÒ&JÒJÒJÒJÒ JÒJÒüIÒõIÒîIÒçIÒàIÒÙIÒÒIÒËIÒÄIÒ½IÒ¶IÒ¯IÒ¨IÒ¡IÒšIÒ“IÒŒIÒ…IÒ~IÒwIÒpIÒiIÒbIÒ[IÒTIÒMIÒFIÒ?IÒ8IÒ1IÒ*IÒ#IÒIÒIÒIÒIÒIÒùHÒòHÒëHÒäHÒÝHÒÖHÒÏHÒÈHÒÁHÒºHÒ³HÒ¬HÒ¥HÒžHÒ—HÒHÒ‰HÒ‚HÒ{HÒtHÒmHÒfHÒ_HÒXHÒQHÒJHÒCHÒDÒ7DÒ0DÒ)DÒ"DÒDÒDÒ DÒDÒÿCÒøCÒñCÒêCÒãCÒÜCÒÕCÒÎCÒÇCÒÀCÒ¹CÒ²CÒ«CÒ¤CÒCÒ–CÒCÒˆCÒCÒzCÒsCÒlCÒeCÒ^CÒWCÒPCÒICÒBCÒ;CÒ4CÒ-CÒ&CÒCÒCÒCÒ CÒCÒüBÒõBÒîBÒçBÒàBÒÙBÒÒBÒËBÒÄBÒ½BÒ¶BÒ¯BÒ¨BÒ¡BÒšBÒ“BÒŒBÒ…BÒ~BÒwBÒpBÒiBÒbBÒ[BÒTBÒMBÒFBÒ?BÒ8BÒ1BÒ*BÒ#BÒBÒBÒBÒBÒBÒùAÒòAÒëAÒäAÒÝAÒÖAÒÏAÒÈAÒÁAÒºAÒ³AÒ¬AÒ¥AÒžAÒ—AÒAÒ‰AÒ‚AÒ{AÒtAÒmAÒfAÒ_AÒXAÒQAÒJAÒCAÒÒ÷>Òð>Òé>Òâ>ÒÛ>ÒÔ>ÒÍ>ÒÆ>Ò¿>Ò¸>Ò±>Òª>Ò£>Òœ>Ò•>ÒŽ>Ò‡>Ò€>Òy>Òr>Òk>Òd>Ò]>ÒV>ÒO>ÒH>ÒA>Ò:>Ò3>Ò,>Ò%>Ò>Ò>Ò>Ò >Ò>Òû=Òô=Òí=Òæ=Òß=ÒØ=ÒÑ=ÒÊ=ÒÃ=Ò¼=Òµ=Ò®=Ò§=Ò =Ò™=Ò’=Ò‹=Ò„=Ò}=Òv=Òo=Òh=Òa=ÒZ=ÒS=ÒL=ÒE=Ò>=Ò7=Ò0=Ò)=Ò"=Ò=Ò=Ò =Ò=Òÿ<Òø<Òñ<Òê<Òã<ÒÜ<ÒÕ<ÒÎ<ÒÇ<ÒÀ<Ò¹<Ò²<Ò«<Ò¤<Ò<Ò–<Ò<Òˆ<Ò<Òz<Òs<Òl<Òe<Ò^<ÒW<ÒP<ÒI<ÒB<Ò;<Ò4<Ò-<Ò&<Ò<Ò<Ò<Ò <Ò<Òü;Òõ;Òî;Òç;Òà;ÒÙ;ÒÒ;ÒË;ÒÄ;Ò½;Ò¶;Ò¯;Ò¨;Ò¡;Òš;Ò“;ÒŒ;Ò…;Ò~;Òw;Òp;Òi;Òb;Ò[;ÒT;ÒM;ÒF;Ò?;Ò8;Ò1;Ò*;Ò#;Ò;Ò;Ò;Ò;Ò;Òù:Òò:Òë:Òä:ÒÝ:ÒÖ:ÒÏ:ÒÈ:ÒÁ:Òº:Ò³:Ò¬:Ò¥:Òž:Ò—:Ò:Ò‰:Ò‚:Ò{:Òt:Òm:Òf:Ò_:ÒX:ÒQ:ÒJ:ÒC:Ò<:Ò5:Ò.:Ò':Ò :Ò:Ò:Ò :Ò:Òý9Òö9Òï9Òè9Òá9ÒÚ9ÒÓ9ÒÌ9ÒÅ9Ò¾9Ò·9Ò°9Ò©9Ò¢9Ò›9Ò”9Ò9Ò†9Ò9Òx9Òq9Òj9Òc9Ò\9ÒU9ÒN9ÒG9Ò@9Ò99Ò29Ò+9Ò$9Ò9Ò9Ò9Ò9Ò9Òú8Òó8Òì8Òå8ÒÞ8Ò×8ÒÐ8ÒÉ8ÒÂ8Ò»8Ò´8Ò­8Ò¦8ÒŸ8Ò˜8Ò‘8ÒŠ8Òƒ8Ò|8Òu8Òn8Òg8Ò`8ÒY8ÒR8ÒK8ÒD8Ò=8Ò68Ò/8Ò(8Ò!8Ò8Ò8Ò 8Ò8Òþ7Ò÷7Òð7Òé7Òâ7ÒÛ7ÒÔ7ÒÍ7ÒÆ7Ò¿7Ò¸7Ò±7Òª7Ò£7Òœ7Ò•7ÒŽ7Ò‡7Ò€7Òy7Òr7Òk7Òd7Ò]7ÒV7ÒO7ÒH7ÒA7Ò:7Ò37Ò,7Ò%7Ò7Ò7Ò7Ò 7Ò7Òû6Òô6Òí6Òæ6Òß6ÒØ6ÒÑ6ÒÊ6ÒÃ6Ò¼6Òµ6Ò®6Ò§6Ò 6Ò™6Ò’6Ò‹6Ò„6Ò}6Òv6Òo6Òh6Òa6ÒZ6ÒS6ÒL6ÒE6Ò>6Ò76Ò06Ò)6Ò"6Ò6Ò6Ò 6Ò6Òÿ5Òø5Òñ5Òê5Òã5ÒÜ5ÒÕ5ÒÎ5ÒÇ5ÒÀ5Ò¹5Ò²5Ò«5Ò¤5Ò5Ò–5Ò5Òˆ5Ò5Òz5Òs5Òl5Òe5Ò^5ÒW5ÒP5ÒI5ÒB5Ò;5Ò45Ò-5Ò&5Ò5Ò5Ò5Ò 5Ò5Òü4Òõ4Òî4Òç4Òà4ÒÙ4ÒÒ4ÒË4ÒÄ4Ò½4Ò¶4Ò¯4Ò¨4Ò¡4Òš4Ò“4ÒŒ4Ò…4Ò~4Òw4Òp4Òi4Òb4Ò[4ÒT4ÒM4ÒF4Ò?4Ò84Ò14Ò*4Ò#4Ò4Ò4Ò4Ò4Ò4Òù3Òò3Òë3Òä3ÒÝ3ÒÖ3ÒÏ3ÒÈ3ÒÁ3Òº3Ò³3Ò¬3Ò¥3Òž3Ò—3Ò3Ò‰3Ò‚3Ò{3Òt3Òm3Òf3Ò_3ÒX3ÒQ3ÒJ3ÒC3Ò<3Ò53Ò.3Ò'3Ò 3Ò3Ò3Ò 3Ò3Òý2Òö2Òï2Òè2Òá2ÒÚ2ÒÓ2ÒÌ2ÒÅ2Ò¾2Ò·2Ò°2Ò©2Ò¢2Ò›2Ò”2Ò2Ò†2Ò2Òx2Òq2Òj2Òc2Ò\2ÒU2ÒN2ÒG2Ò@2Ò92Ò22Ò+2Ò$2Ò2Ò2Ò2Ò2Ò2Òú1Òó1Òì1Òå1ÒÞ1Ò×1ÒÐ1ÒÉ1ÒÂ1Ò»1Ò´1Ò­1Ò¦1ÒŸ1Ò˜1Ò‘1ÒŠ1Òƒ1Ò|1Òu1Òn1Òg1Ò`1ÒY1ÒR1ÒK1ÒD1Ò=1Ò61Ò/1Ò(1Ò!1Ò1Ò1Ò 1Ò1Òþ0Ò÷0Òð0Òé0Òâ0ÒÛ0ÒÔ0ÒÍ0ÒÆ0Ò¿0Ò¸0Ò±0Òª0Ò£0Òœ0Ò•0ÒŽ0Ò‡0Ò€0Òy0Òr0Òk0Òd0Ò]0ÒV0ÒO0ÒH0ÒA0Ò:0Ò30Ò,0Ò%0Ò0Ò0Ò0Ò 0Ò0Òû/Òô/Òí/Òæ/Òß/ÒØ/ÒÑ/ÒÊ/ÒÃ/Ò¼/Òµ/Ò®/Ò§/Ò /Ò™/Ò’/Ò‹/Ò„/Ò}/Òv/Òo/Òh/Òa/ÒZ/ÒS/ÒL/ÒE/Ò>/Ò7/Ò0/Ò)/Ò"/Ò/Ò/Ò /Ò/Òÿ.Òø.Òñ.Òê.Òã.ÒÜ.ÒÕ.ÒÎ.ÒÇ.ÒÀ.Ò¹.Ò².Ò«.Ò¤.Ò.Ò–.Ò.Òˆ.Ò.Òz.Òs.Òl.Òe.Ò^.ÒW.ÒP.ÒI.ÒB.Ò;.Ò4.Ò-.Ò&.Ò.Ò.Ò.Ò .Ò.Òü-Òõ-Òî-Òç-Òà-ÒÙ-ÒÒ-ÒË-ÒÄ-Ò½-Ò¶-Ò¯-Ò¨-Ò¡-Òš-Ò“-ÒŒ-Ò…-Ò~-Òw-Òp-Òi-Òb-Ò[-ÒT-ÒM-ÒF-Ò?-Ò8-Ò1-Ò*-Ò#-Ò-Ò-Ò-Ò-Ò-Òù,Òò,Òë,Òä,ÒÝ,ÒÖ,ÒÏ,ÒÈ,ÒÁ,Òº,Ò³,Ò¬,Ò¥,Òž,Ò—,Ò,Ò‰,Ò‚,Ò{,Òt,Òm,Òf,Ò_,ÒX,ÒQ,ÒJ,ÒC,Ò<,Ò5,Ò.,Ò',Ò ,Ò,Ò,Ò ,Ò,Òý+Òö+Òï+Òè+Òá+ÒÚ+ÒÓ+ÒÌ+ÒÅ+Ò¾+Ò·+Ò°+Ò©+Ò¢+Ò›+Ò”+Ò+Ò†+Ò+Òx+Òq+Òj+Òc+Ò\+ÒU+ÒN+ÒG+Ò@+Ò9+Ò2+Ò++Ò$+Ò+Ò+Ò+Ò+Ò+Òú*Òó*Òì*Òå*ÒÞ*Ò×*ÒÐ*ÒÉ*ÒÂ*Ò»*Ò´*Ò­*Ò¦*ÒŸ*Ò˜*Ò‘*ÒŠ*Òƒ*Ò|*Òu*Òn*Òg*Ò`*ÒY*ÒR*ÒK*ÒD*Ò=*Ò6*Ò/*Ò(*Ò!*Ò*Ò*Ò *Ò*Òþ)Ò÷)Òð)Òé)Òâ)ÒÛ)ÒÔ)ÒÍ)ÒÆ)Ò¿)Ò¸)Ò±)Òª)Ò£)Òœ)Ò•)ÒŽ)Ò‡)Ò€)Òy)Òr)Òk)Òd)Ò])ÒV)ÒO)ÒH)ÒA)Ò:)Ò3)Ò,)Ò%)Ò)Ò)Ò)Ò )Ò)Òû(Òô(Òí(Òæ(Òß(ÒØ(ÒÑ(ÒÊ(ÒÃ(Ò¼(Òµ(Ò®(Ò§(Ò (Ò™(Ò’(Ò‹(Ò„(Ò}(Òv(Òo(Òh(Òa(ÒZ(ÒS(ÒL(ÒE(Ò>(Ò7(Ò0(Ò)(Ò"(Ò(Ò(Ò (Ò(Òÿ'Òø'Òñ'Òê'Òã'ÒÜ'ÒÕ'ÒÎ'ÒÇ'ÒÀ'Ò¹'Ò²'Ò«'Ò¤'Ò'Ò–'Ò'Òˆ'Ò'Òz'Òs'Òl'Òe'Ò^'ÒW'ÒP'ÒI'ÒB'Ò;'Ò4'Ò-'Ò&'Ò'Ò'Ò'Ò 'Ò'Òü&Òõ&Òî&Òç&Òà&ÒÙ&ÒÒ&ÒË&ÒÄ&Ò½&Ò¶&Ò¯&Ò¨&Ò¡&Òš&Ò“&ÒŒ&Ò…&Ò~&Òw&Òp&Òi&Òb&Ò[&ÒT&ÒM&ÒF&Ò?&Ò8&Ò1&Ò*&Ò#&Ò&Ò&Ò&Ò&Ò&Òù%Òò%Òë%Òä%ÒÝ%ÒÖ%ÒÏ%ÒÈ%ÒÁ%Òº%Ò³%Ò¬%Ò¥%Òž%Ò—%Ò%Ò‰%Ò‚%Ò{%Òt%Òm%Òf%Ò_%ÒX%ÒQ%ÒJ%ÒC%Ò<%Ò5%Ò.%Ò'%Ò %Ò%Ò%Ò %Ò%Òý$Òö$Òï$Òè$Òá$ÒÚ$ÒÓ$ÒÌ$ÒÅ$Ò¾$Ò·$Ò°$Ò©$Ò¢$Ò›$Ò”$Ò$Ò†$Ò$Òx$Òq$Òj$Òc$Ò\$ÒU$ÒN$ÒG$Ò@$Ò9$Ò2$Ò+$Ò$$Ò$Ò$Ò$Ò$Ò$Òú#Òó#Òì#Òå#ÒÞ#Ò×#ÒÐ#ÒÉ#ÒÂ#Ò»#Ò´#Ò­#Ò¦#ÒŸ#Ò˜#Ò‘#ÒŠ#Òƒ#Ò|#Òu#Òn#Òg#Ò`#ÒY#ÒR#ÒK#ÒD#Ò=#Ò6#Ò/#Ò(#Ò!#Ò#Ò#Ò #Ò#Òþ"Ò÷"Òð"Òé"Òâ"ÒÛ"ÒÔ"ÒÍ"ÒÆ"Ò¿"Ò¸"Ò±"Òª"Ò£"Òœ"Ò•"ÒŽ"Ò‡"Ò€"Òy"Òr"Òk"Òd"Ò]"ÒV"ÒO"ÒH"ÒA"Ò:"Ò3"Ò,"Ò%"Ò"Ò"Ò"Ò "Ò"Òû!Òô!Òí!Òæ!Òß!ÒØ!ÒÑ!ÒÊ!ÒÃ!Ò¼!Òµ!Ò®!Ò§!Ò !Ò™!Ò’!Ò‹!Ò„!Ò}!Òv!Òo!Òh!Òa!ÒZ!ÒS!ÒL!ÒE!Ò>!Ò7!Ò0!Ò)!Ò"!Ò!Ò!Ò !Ò!Òÿ Òø Òñ Òê Òã ÒÜ ÒÕ ÒÎ ÒÇ ÒÀ Ò¹ Ò² Ò« Ò¤ Ò Ò– Ò Òˆ Ò Òz Òs Òl Òe Ò^ ÒW ÒP ÒI ÒB Ò; Ò4 Ò- Ò& Ò Ò Ò Ò Ò ÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþ Ò÷ Òð Òé Òâ ÒÛ ÒÔ ÒÍ ÒÆ Ò¿ Ò¸ Ò± Òª Ò£ Òœ Ò• ÒŽ Ò‡ Ò€ Òy Òr Òk Òd Ò] ÒV ÒO ÒH ÒA Ò: Ò3 Ò, Ò% Ò Ò Ò Ò Ò Òû Òô Òí Òæ Òß ÒØ ÒÑ ÒÊ Òà Ò¼ Òµ Ò® Ò§ Ò  Ò™ Ò’ Ò‹ Ò„ Ò} Òv Òo Òh Òa ÒZ ÒS ÒL ÒE Ò> Ò7 Ò0 Ò) Ò" Ò Ò Ò Ò Òÿ Òø Òñ Òê Òã ÒÜ ÒÕ ÒÎ ÒÇ ÒÀ Ò¹ Ò² Ò« Ò¤ Ò Ò– Ò Òˆ Ò Òz Òs Òl Òe Ò^ ÒW ÒP ÒI ÒB Ò; Ò4 Ò- Ò& Ò Ò Ò Ò Ò Òü Òõ Òî Òç Òà ÒÙ ÒÒ ÒË ÒÄ Ò½ Ò¶ Ò¯ Ò¨ Ò¡ Òš Ò“ ÒŒ Ò… Ò~ Òw Òp Òi Òb Ò[ ÒT ÒM ÒF Ò? Ò8 Ò1 Ò* Ò# Ò Ò Ò Ò Ò Òù Òò Òë Òä ÒÝ ÒÖ ÒÏ ÒÈ ÒÁ Òº Ò³ Ò¬ Ò¥ Òž Ò— Ò Ò‰ Ò‚ Ò{ Òt Òm Òf Ò_ ÒX ÒQ ÒJ ÒC Ò< Ò5 Ò. Ò' Ò Ò Ò Ò Ò ÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÿÑ÷ÿÑðÿÑéÿÑâÿÑÛÿÑÔÿÑÍÿÑÆÿÑ¿ÿѸÿѱÿѪÿÑ£ÿÑœÿÑ•ÿÑŽÿчÿÑ€ÿÑyÿÑrÿÑkÿÑdÿÑ]ÿÑVÿÑOÿÑHÿÑAÿÑ:ÿÑ3ÿÑ,ÿÑ%ÿÑÿÑÿÑÿÑ ÿÑÿÑûþÑôþÑíþÑæþÑßþÑØþÑÑþÑÊþÑÃþѼþѵþÑ®þѧþÑ þÑ™þÑ’þÑ‹þÑ„þÑ}þÑvþÑoþÑhþÑaþÑZþÑSþÑLþÑEþÑ>þÑ7þÑ0þÑ)þÑ"þÑþÑþÑ þÑþÑÿýÑøýÑñýÑêýÑãýÑÜýÑÕýÑÎýÑÇýÑÀýѹýѲýÑ«ýѤýÑýÑ–ýÑýшýÑýÑzýÑsýÑlýÑeýÑ^ýÑWýÑPýÑIýÑBýÑ;ýÑ4ýÑ-ýÑ&ýÑýÑýÑýÑ ýÑýÑüüÑõüÑîüÑçüÑàüÑÙüÑÒüÑËüÑÄüѽüѶüѯüѨüÑ¡üÑšüÑ“üÑŒüÑ…üÑ~üÑwüÑpüÑiüÑbüÑ[üÑTüÑMüÑFüÑ?üÑ8üÑ1üÑ*üÑ#üÑüÑüÑüÑüÑüÑùûÑòûÑëûÑäûÑÝûÑÖûÑÏûÑÈûÑÁûѺûѳûѬûÑ¥ûÑžûÑ—ûÑûщûÑ‚ûÑ{ûÑtûÑmûÑfûÑ_ûÑXûÑQûÑJûÑCûÑ<ûÑ5ûÑ.ûÑ'ûÑ ûÑûÑûÑ ûÑûÑýúÑöúÑïúÑèúÑáúÑÚúÑÓúÑÌúÑÅúѾúÑ·úѰúÑ©úÑ¢úÑ›úÑ”úÑúцúÑúÑxúÑqúÑjúÑcúÑ\úÑUúÑNúÑGúÑ@úÑ9úÑ2úÑ+úÑ$úÑúÑúÑúÑúÑúÑúùÑóùÑìùÑåùÑÞùÑ×ùÑÐùÑÉùÑÂùÑ»ùÑ´ùÑ­ùѦùÑŸùјùÑ‘ùÑŠùуùÑ|ùÑuùÑnùÑgùÑ`ùÑYùÑRùÑKùÑDùÑ=ùÑ6ùÑ/ùÑ(ùÑ!ùÑùÑùÑ ùÑùÑþøÑ÷øÑðøÑéøÑâøÑÛøÑÔøÑÍøÑÆøÑ¿øÑ¸øÑ±øÑªøÑ£øÑœøÑ•øÑŽøÑ‡øÑ€øÑyøÑrøÑkøÑdøÑ]øÑVøÑOøÑHøÑAøÑ:øÑ3øÑ,øÑ%øÑøÑøÑøÑ øÑøÑû÷Ñô÷Ñí÷Ñæ÷Ñß÷ÑØ÷ÑÑ÷ÑÊ÷ÑÃ÷Ѽ÷ѵ÷Ñ®÷ѧ÷Ñ ÷Ñ™÷Ñ’÷Ñ‹÷Ñ„÷Ñ}÷Ñv÷Ño÷Ñh÷Ña÷ÑZ÷ÑS÷ÑL÷ÑE÷Ñ>÷Ñ7÷Ñ0÷Ñ)÷Ñ"÷Ñ÷Ñ÷Ñ ÷Ñ÷ÑÿöÑøöÑñöÑêöÑãöÑÜöÑÕöÑÎöÑÇöÑÀöѹöѲöÑ«öѤöÑöÑ–öÑöшöÑöÑzöÑsöÑlöÑeöÑ^öÑWöÑPöÑIöÑBöÑ;öÑ4öÑ-öÑ&öÑöÑöÑöÑ öÑöÑüõÑõõÑîõÑçõÑàõÑÙõÑÒõÑËõÑÄõѽõѶõѯõѨõÑ¡õÑšõÑ“õÑŒõÑ…õÑ~õÑwõÑpõÑiõÑbõÑ[õÑTõÑMõÑFõÑ?õÑ8õÑ1õÑ*õÑ#õÑõÑõÑõÑõÑõÑùôÑòôÑëôÑäôÑÝôÑÖôÑÏôÑÈôÑÁôѺôѳôѬôÑ¥ôÑžôÑ—ôÑôщôÑ‚ôÑ{ôÑtôÑmôÑfôÑ_ôÑXôÑQôÑJôÑCôÑ<ôÑ5ôÑ.ôÑ'ôÑ ôÑôÑôÑ ôÑôÑýóÑöóÑïóÑèóÑáóÑÚóÑÓóÑÌóÑÅóѾóÑ·óѰóÑ©óÑ¢óÑ›óÑ”óÑóцóÑóÑxóÑqóÑjóÑcóÑ\óÑUóÑNóÑGóÑ@óÑ9óÑ2óÑ+óÑ$óÑóÑóÑóÑóÑóÑúòÑóòÑìòÑåòÑÞòÑ×òÑÐòÑÉòÑÂòÑ»òÑ´òÑ­òѦòÑŸòјòÑ‘òÑŠòуòÑ|òÑuòÑnòÑgòÑ`òÑYòÑRòÑKòÑDòÑ=òÑ6òÑ/òÑ(òÑ!òÑòÑòÑ òÑòÑþñÑ÷ñÑðñÑéñÑâñÑÛñÑÔñÑÍñÑÆñÑ¿ñѸñѱñѪñÑ£ñÑœñÑ•ñÑŽñчñÑ€ñÑyñÑrñÑkñÑdñÑ]ñÑVñÑOñÑHñÑAñÑ:ñÑ3ñÑ,ñÑ%ñÑñÑñÑñÑ ñÑñÑûðÑôðÑíðÑæðÑßðÑØðÑÑðÑÊðÑÃðѼðѵðÑ®ðѧðÑ ðÑ™ðÑ’ðÑ‹ðÑ„ðÑ}ðÑvðÑoðÑhðÑaðÑZðÑSðÑLðÑEðÑ>ðÑ7ðÑ0ðÑ)ðÑ"ðÑðÑðÑ ðÑðÑÿïÑøïÑñïÑêïÑãïÑÜïÑÕïÑÎïÑÇïÑÀïѹïѲïÑ«ïѤïÑïÑ–ïÑïшïÑïÑzïÑsïÑlïÑeïÑ^ïÑWïÑPïÑIïÑBïÑ;ïÑ4ïÑ-ïÑ&ïÑïÑïÑïÑ ïÑïÑüîÑõîÑîîÑçîÑàîÑÙîÑÒîÑËîÑÄîѽîѶîѯîѨîÑ¡îÑšîÑ“îÑŒîÑ…îÑ~îÑwîÑpîÑiîÑbîÑ[îÑTîÑMîÑFîÑ?îÑ8îÑ1îÑ*îÑ#îÑîÑîÑîÑîÑîÑùíÑòíÑëíÑäíÑÝíÑÖíÑÏíÑÈíÑÁíѺíѳíѬíÑ¥íÑžíÑ—íÑíщíÑ‚íÑ{íÑtíÑmíÑfíÑ_íÑXíÑQíÑJíÑCíÑ<íÑ5íÑ.íÑ'íÑ íÑíÑíÑ íÑíÑýìÑöìÑïìÑèìÑáìÑÚìÑÓìÑÌìÑÅìѾìÑ·ìѰìÑ©ìÑ¢ìÑ›ìÑ”ìÑìцìÑìÑxìÑqìÑjìÑcìÑ\ìÑUìÑNìÑGìÑ@ìÑ9ìÑ2ìÑ+ìÑ$ìÑìÑìÑìÑìÑìÑúëÑóëÑìëÑåëÑÞëÑ×ëÑÐëÑÉëÑÂëÑ»ëÑ´ëÑ­ëѦëÑŸëјëÑ‘ëÑŠëуëÑ|ëÑuëÑnëÑgëÑ`ëÑYëÑRëÑKëÑDëÑ=ëÑ6ëÑ/ëÑ(ëÑ!ëÑëÑëÑ ëÑëÑþêÑ÷êÑðêÑéêÑâêÑÛêÑÔêÑÍêÑÆêÑ¿êѸêѱêѪêÑ£êÑœêÑ•êÑŽêчêÑ€êÑyêÑrêÑkêÑdêÑ]êÑVêÑOêÑHêÑAêÑ:êÑ3êÑ,êÑ%êÑêÑêÑêÑ êÑêÑûéÑôéÑíéÑæéÑßéÑØéÑÑéÑÊéÑÃéѼéѵéÑ®éѧéÑ éÑ™éÑ’éÑ‹éÑ„éÑ}éÑvéÑoéÑhéÑaéÑZéÑSéÑLéÑEéÑ>éÑ7éÑ0éÑ)éÑ"éÑéÑéÑ éÑéÑÿèÑøèÑñèÑêèÑãèÑÜèÑÕèÑÎèÑÇèÑÀèѹèѲèÑ«èѤèÑèÑ–èÑèшèÑèÑzèÑsèÑlèÑeèÑ^èÑWèÑPèÑIèÑBèÑ;èÑ4èÑ-èÑ&èÑèÑèÑèÑ èÑèÑüçÑõçÑîçÑççÑàçÑÙçÑÒçÑËçÑÄçѽçѶçѯçѨçÑ¡çÑšçÑ“çÑŒçÑ…çÑ~çÑwçÑpçÑiçÑbçÑ[çÑTçÑMçÑFçÑ?çÑ8çÑ1çÑ*çÑ#çÑçÑçÑçÑçÑçÑùæÑòæÑëæÑäæÑÝæÑÖæÑÏæÑÈæÑÁæÑºæÑ³æÑ¬æÑ¥æÑžæÑ—æÑæÑ‰æÑ‚æÑ{æÑtæÑmæÑfæÑ_æÑXæÑQæÑJæÑCæÑ<æÑ5æÑ.æÑ'æÑ æÑæÑæÑ æÑæÑýåÑöåÑïåÑèåÑáåÑÚåÑÓåÑÌåÑÅåѾåÑ·åѰåÑ©åÑ¢åÑ›åÑ”åÑåцåÑåÑxåÑqåÑjåÑcåÑ\åÑUåÑNåÑGåÑ@åÑ9åÑ2åÑ+åÑ$åÑåÑåÑåÑåÑåÑúäÑóäÑìäÑåäÑÞäÑ×äÑÐäÑÉäÑÂäÑ»äÑ´äÑ­äѦäÑŸäјäÑ‘äÑŠäуäÑ|äÑuäÑnäÑgäÑ`äÑYäÑRäÑKäÑDäÑ=äÑ6äÑ/äÑ(äÑ!äÑäÑäÑ äÑäÑþãÑ÷ãÑðãÑéãÑâãÑÛãÑÔãÑÍãÑÆãÑ¿ãѸãѱãѪãÑ£ãÑœãÑ•ãÑŽãчãÑ€ãÑyãÑrãÑkãÑdãÑ]ãÑVãÑOãÑHãÑAãÑ:ãÑ3ãÑ,ãÑ%ãÑãÑãÑãÑ ãÑãÑûâÑôâÑíâÑæâÑßâÑØâÑÑâÑÊâÑÃâѼâѵâÑ®âѧâÑ âÑ™âÑ’âÑ‹âÑ„âÑ}âÑvâÑoâÑhâÑaâÑZâÑSâÑLâÑEâÑ>âÑ7âÑ0âÑ)âÑ"âÑâÑâÑ âÑâÑÿáÑøáÑñáÑêáÑãáÑÜáÑÕáÑÎáÑÇáÑÀáѹáѲáÑ«áѤáÑáÑ–áÑáшáÑáÑzáÑsáÑláÑeáÑ^áÑWáÑPáÑIáÑBáÑ;áÑ4áÑ-áÑ&áÑáÑáÑáÑ áÑáÑüàÑõàÑîàÑçàÑààÑÙàÑÒàÑËàÑÄàѽàѶàѯàѨàÑ¡àÑšàÑ“àÑŒàÑ…àÑ~àÑwàÑpàÑiàÑbàÑ[àÑTàÑMàÑFàÑ?àÑ8àÑ1àÑ*àÑ#àÑàÑàÑàÑàÑàÑùßÑòßÑëßÑäßÑÝßÑÖßÑÏßÑÈßÑÁßѺßѳßѬßÑ¥ßÑžßÑ—ßÑßщßÑ‚ßÑ{ßÑtßÑmßÑfßÑ_ßÑXßÑQßÑJßÑCßÑ<ßÑ5ßÑ.ßÑ'ßÑ ßÑßÑßÑ ßÑßÑýÞÑöÞÑïÞÑèÞÑáÞÑÚÞÑÓÞÑÌÞÑÅÞѾÞÑ·ÞѰÞÑ©ÞÑ¢ÞÑ›ÞÑ”ÞÑÞцÞÑÞÑxÞÑqÞÑjÞÑcÞÑ\ÞÑUÞÑNÞÑGÞÑ@ÞÑ9ÞÑ2ÞÑ+ÞÑ$ÞÑÞÑÞÑÞÑÞÑÞÑúÝÑóÝÑìÝÑåÝÑÞÝÑ×ÝÑÐÝÑÉÝÑÂÝÑ»ÝÑ´ÝÑ­ÝѦÝÑŸÝјÝÑ‘ÝÑŠÝуÝÑ|ÝÑuÝÑnÝÑgÝÑ`ÝÑYÝÑRÝÑKÝÑDÝÑ=ÝÑ6ÝÑ/ÝÑ(ÝÑ!ÝÑÝÑÝÑ ÝÑÝÑþÜÑ÷ÜÑðÜÑéÜÑâÜÑÛÜÑÔÜÑÍÜÑÆÜÑ¿ÜѸÜѱÜѪÜÑ£ÜÑœÜÑ•ÜÑŽÜчÜÑ€ÜÑyÜÑrÜÑkÜÑdÜÑ]ÜÑVÜÑOÜÑHÜÑAÜÑ:ÜÑ3ÜÑ,ÜÑ%ÜÑÜÑÜÑÜÑ ÜÑÜÑûÛÑôÛÑíÛÑæÛÑßÛÑØÛÑÑÛÑÊÛÑÃÛѼÛѵÛÑ®ÛѧÛÑ ÛÑ™ÛÑ’ÛÑ‹ÛÑ„ÛÑ}ÛÑvÛÑoÛÑhÛÑaÛÑZÛÑSÛÑLÛÑEÛÑ>ÛÑ7ÛÑ0ÛÑ)ÛÑ"ÛÑÛÑÛÑ ÛÑÛÑÿÚÑøÚÑñÚÑêÚÑãÚÑÜÚÑÕÚÑÎÚÑÇÚÑÀÚѹÚѲÚÑ«ÚѤÚÑÚÑ–ÚÑÚшÚÑÚÑzÚÑsÚÑlÚÑeÚÑ^ÚÑWÚÑPÚÑIÚÑBÚÑ;ÚÑ4ÚÑ-ÚÑ&ÚÑÚÑÚÑÚÑ ÚÑÚÑüÙÑõÙÑîÙÑçÙÑàÙÑÙÙÑÒÙÑËÙÑÄÙѽÙѶÙѯÙѨÙÑ¡ÙÑšÙÑ“ÙÑŒÙÑ…ÙÑ~ÙÑwÙÑpÙÑiÙÑbÙÑ[ÙÑTÙÑMÙÑFÙÑ?ÙÑ8ÙÑ1ÙÑ*ÙÑ#ÙÑÙÑÙÑÙÑÙÑÙÑùØÑòØÑëØÑäØÑÝØÑÖØÑÏØÑÈØÑÁØÑºØÑ³ØÑ¬ØÑ¥ØÑžØÑ—ØÑØÑ‰ØÑ‚ØÑ{ØÑtØÑmØÑfØÑ_ØÑXØÑQØÑJØÑCØÑ<ØÑ5ØÑ.ØÑ'ØÑ ØÑØÑØÑ ØÑØÑý×Ñö×Ñï×Ñè×Ñá×ÑÚ×ÑÓ×ÑÌ×ÑÅ×Ѿ×Ñ·×Ѱ×Ñ©×Ñ¢×Ñ›×Ñ”×Ñ×ц×Ñ×Ñx×Ñq×Ñj×Ñc×Ñ\×ÑU×ÑN×ÑG×Ñ@×Ñ9×Ñ2×Ñ+×Ñ$×Ñ×Ñ×Ñ×Ñ×Ñ×ÑúÖÑóÖÑìÖÑåÖÑÞÖÑ×ÖÑÐÖÑÉÖÑÂÖÑ»ÖÑ´ÖÑ­ÖѦÖÑŸÖјÖÑ‘ÖÑŠÖуÖÑ|ÖÑuÖÑnÖÑgÖÑ`ÖÑYÖÑRÖÑKÖÑDÖÑ=ÖÑ6ÖÑ/ÖÑ(ÖÑ!ÖÑÖÑÖÑ ÖÑÖÑþÕÑ÷ÕÑðÕÑéÕÑâÕÑÛÕÑÔÕÑÍÕÑÆÕÑ¿ÕѸÕѱÕѪÕÑ£ÕÑœÕÑ•ÕÑŽÕчÕÑ€ÕÑyÕÑrÕÑkÕÑdÕÑ]ÕÑVÕÑOÕÑHÕÑAÕÑ:ÕÑ3ÕÑ,ÕÑ%ÕÑÕÑÕÑÕÑ ÕÑÕÑûÔÑôÔÑíÔÑæÔÑßÔÑØÔÑÑÔÑÊÔÑÃÔѼÔѵÔÑ®ÔѧÔÑ ÔÑ™ÔÑ’ÔÑ‹ÔÑ„ÔÑ}ÔÑvÔÑoÔÑhÔÑaÔÑZÔÑSÔÑLÔÑEÔÑ>ÔÑ7ÔÑ0ÔÑ)ÔÑ"ÔÑÔÑÔÑ ÔÑÔÑÿÓÑøÓÑñÓÑêÓÑãÓÑÜÓÑÕÓÑÎÓÑÇÓÑÀÓѹÓѲÓÑ«ÓѤÓÑÓÑ–ÓÑÓшÓÑÓÑzÓÑsÓÑlÓÑeÓÑ^ÓÑWÓÑPÓÑIÓÑBÓÑ;ÓÑ4ÓÑ-ÓÑ&ÓÑÓÑÓÑÓÑ ÓÑÓÑüÒÑõÒÑîÒÑçÒÑàÒÑÙÒÑÒÒÑËÒÑÄÒѽÒѶÒѯÒѨÒÑ¡ÒÑšÒÑ“ÒÑŒÒÑ…ÒÑ~ÒÑwÒÑpÒÑiÒÑbÒÑ[ÒÑTÒÑMÒÑFÒÑ?ÒÑ8ÒÑ1ÒÑ*ÒÑ#ÒÑÒÑÒÑÒÑÒÑÒÑùÑÑòÑÑëÑÑäÑÑÝÑÑÖÑÑÏÑÑÈÑÑÁÑѺÑѳÑѬÑÑ¥ÑÑžÑÑ—ÑÑÑщÑÑ‚ÑÑ{ÑÑtÑÑmÑÑfÑÑ_ÑÑXÑÑQÑÑJÑÑCÑÑ<ÑÑ5ÑÑ.ÑÑ'ÑÑ ÑÑÑÑÑÑ ÑÑÑÑýÐÑöÐÑïÐÑèÐÑáÐÑÚÐÑÓÐÑÌÐÑÅÐѾÐÑ·ÐѰÐÑ©ÐÑ¢ÐÑ›ÐÑ”ÐÑÐцÐÑÐÑxÐÑqÐÑjÐÑcÐÑ\ÐÑUÐÑNÐÑGÐÑ@ÐÑ9ÐÑ2ÐÑ+ÐÑ$ÐÑÐÑÐÑÐÑÐÑÐÑúÏÑóÏÑìÏÑåÏÑÞÏÑ×ÏÑÐÏÑÉÏÑÂÏÑ»ÏÑ´ÏÑ­ÏѦÏÑŸÏјÏÑ‘ÏÑŠÏуÏÑ|ÏÑuÏÑnÏÑgÏÑ`ÏÑYÏÑRÏÑKÏÑDÏÑ=ÏÑ6ÏÑ/ÏÑ(ÏÑ!ÏÑÏÑÏÑ ÏÑÏÑþÎÑ÷ÎÑðÎÑéÎÑâÎÑÛÎÑÔÎÑÍÎÑÆÎÑ¿ÎѸÎѱÎѪÎÑ£ÎÑœÎÑ•ÎÑŽÎчÎÑ€ÎÑyÎÑrÎÑkÎÑdÎÑ]ÎÑVÎÑOÎÑHÎÑAÎÑ:ÎÑ3ÎÑ,ÎÑ%ÎÑÎÑÎÑÎÑ ÎÑÎÑûÍÑôÍÑíÍÑæÍÑßÍÑØÍÑÑÍÑÊÍÑÃÍѼÍѵÍÑ®ÍѧÍÑ ÍÑ™ÍÑ’ÍÑ‹ÍÑ„ÍÑ}ÍÑvÍÑoÍÑhÍÑaÍÑZÍÑSÍÑLÍÑEÍÑ>ÍÑ7ÍÑ0ÍÑ)ÍÑ"ÍÑÍÑÍÑ ÍÑÍÑÿÌÑøÌÑñÌÑêÌÑãÌÑÜÌÑÕÌÑÎÌÑÇÌÑÀÌѹÌѲÌÑ«ÌѤÌÑÌÑ–ÌÑÌшÌÑÌÑzÌÑsÌÑlÌÑeÌÑ^ÌÑWÌÑPÌÑIÌÑBÌÑ;ÌÑ4ÌÑ-ÌÑ&ÌÑÌÑÌÑÌÑ ÌÑÌÑüËÑõËÑîËÑçËÑàËÑÙËÑÒËÑËËÑÄËѽËѶËѯËѨËÑ¡ËÑšËÑ“ËÑŒËÑ…ËÑ~ËÑwËÑpËÑiËÑbËÑ[ËÑTËÑMËÑFËÑ?ËÑ8ËÑ1ËÑ*ËÑ#ËÑËÑËÑËÑËÑËÑùÊÑòÊÑëÊÑäÊÑÝÊÑÖÊÑÏÊÑÈÊÑÁÊѺÊѳÊѬÊÑ¥ÊÑžÊÑ—ÊÑÊщÊÑ‚ÊÑ{ÊÑtÊÑmÊÑfÊÑ_ÊÑXÊÑQÊÑJÊÑCÊÑ<ÊÑ5ÊÑ.ÊÑ'ÊÑ ÊÑÊÑÊÑ ÊÑÊÑýÉÑöÉÑïÉÑèÉÑáÉÑÚÉÑÓÉÑÌÉÑÅÉѾÉÑ·ÉѰÉÑ©ÉÑ¢ÉÑ›ÉÑ”ÉÑÉцÉÑÉÑxÉÑqÉÑjÉÑcÉÑ\ÉÑUÉÑNÉÑGÉÑ@ÉÑ9ÉÑ2ÉÑ+ÉÑ$ÉÑÉÑÉÑÉÑÉÑÉÑúÈÑóÈÑìÈÑåÈÑÞÈÑ×ÈÑÐÈÑÉÈÑÂÈÑ»ÈÑ´ÈÑ­ÈѦÈÑŸÈјÈÑ‘ÈÑŠÈуÈÑ|ÈÑuÈÑnÈÑgÈÑ`ÈÑYÈÑRÈÑKÈÑDÈÑ=ÈÑ6ÈÑ/ÈÑ(ÈÑ!ÈÑÈÑÈÑ ÈÑÈÑþÇÑ÷ÇÑðÇÑéÇÑâÇÑÛÇÑÔÇÑÍÇÑÆÇÑ¿ÇѸÇѱÇѪÇÑ£ÇÑœÇÑ•ÇÑŽÇчÇÑ€ÇÑyÇÑrÇÑkÇÑdÇÑ]ÇÑVÇÑOÇÑHÇÑAÇÑ:ÇÑ3ÇÑ,ÇÑ%ÇÑÇÑÇÑÇÑ ÇÑÇÑûÆÑôÆÑíÆÑæÆÑ߯ÑØÆÑÑÆÑÊÆÑÃÆÑ¼ÆÑµÆÑ®ÆÑ§ÆÑ ÆÑ™ÆÑ’ÆÑ‹ÆÑ„ÆÑ}ÆÑvÆÑoÆÑhÆÑaÆÑZÆÑSÆÑLÆÑEÆÑ>ÆÑ7ÆÑ0ÆÑ)ÆÑ"ÆÑÆÑÆÑ ÆÑÆÑÿÅÑøÅÑñÅÑêÅÑãÅÑÜÅÑÕÅÑÎÅÑÇÅÑÀÅѹÅѲÅÑ«ÅѤÅÑÅÑ–ÅÑÅшÅÑÅÑzÅÑsÅÑlÅÑeÅÑ^ÅÑWÅÑPÅÑIÅÑBÅÑ;ÅÑ4ÅÑ-ÅÑ&ÅÑÅÑÅÑÅÑ ÅÑÅÑüÄÑõÄÑîÄÑçÄÑàÄÑÙÄÑÒÄÑËÄÑÄÄѽÄѶÄѯÄѨÄÑ¡ÄÑšÄÑ“ÄÑŒÄÑ…ÄÑ~ÄÑwÄÑpÄÑiÄÑbÄÑ[ÄÑTÄÑMÄÑFÄÑ?ÄÑ8ÄÑ1ÄÑ*ÄÑ#ÄÑÄÑÄÑÄÑÄÑÄÑùÃÑòÃÑëÃÑäÃÑÝÃÑÖÃÑÏÃÑÈÃÑÁÃѺÃѳÃѬÃÑ¥ÃÑžÃÑ—ÃÑÃщÃÑ‚ÃÑ{ÃÑtÃÑmÃÑfÃÑ_ÃÑXÃÑQÃÑJÃÑCÃÑ<ÃÑ5ÃÑ.ÃÑ'ÃÑ ÃÑÃÑÃÑ ÃÑÃÑýÂÑöÂÑïÂÑèÂÑáÂÑÚÂÑÓÂÑÌÂÑÅÂѾÂÑ·ÂѰÂÑ©ÂÑ¢ÂÑ›ÂÑ”ÂÑÂцÂÑÂÑxÂÑqÂÑjÂÑcÂÑ\ÂÑUÂÑNÂÑGÂÑ@ÂÑ9ÂÑ2ÂÑ+ÂÑ$ÂÑÂÑÂÑÂÑÂÑÂÑúÁÑóÁÑìÁÑåÁÑÞÁÑ×ÁÑÐÁÑÉÁÑÂÁÑ»ÁÑ´ÁÑ­ÁѦÁÑŸÁјÁÑ‘ÁÑŠÁуÁÑ|ÁÑuÁÑnÁÑgÁÑ`ÁÑYÁÑRÁÑKÁÑDÁÑ=ÁÑ6ÁÑ/ÁÑ(ÁÑ!ÁÑÁÑÁÑ ÁÑÁÑþÀÑ÷ÀÑðÀÑéÀÑâÀÑÛÀÑÔÀÑÍÀÑÆÀÑ¿ÀѸÀѱÀѪÀÑ£ÀÑœÀÑ•ÀÑŽÀчÀÑ€ÀÑyÀÑrÀÑkÀÑdÀÑ]ÀÑVÀÑOÀÑHÀÑAÀÑ:ÀÑ3ÀÑ,ÀÑ%ÀÑÀÑÀÑÀÑ ÀÑÀÑû¿Ñô¿Ñí¿Ñæ¿Ñß¿ÑØ¿ÑÑ¿ÑÊ¿ÑÿѼ¿Ñµ¿Ñ®¿Ñ§¿Ñ ¿Ñ™¿Ñ’¿Ñ‹¿Ñ„¿Ñ}¿Ñv¿Ño¿Ñh¿Ña¿ÑZ¿ÑS¿ÑL¿ÑE¿Ñ>¿Ñ7¿Ñ0¿Ñ)¿Ñ"¿Ñ¿Ñ¿Ñ ¿Ñ¿Ñÿ¾Ñø¾Ññ¾Ñê¾Ñã¾ÑܾÑÕ¾ÑξÑǾÑÀ¾Ñ¹¾Ñ²¾Ñ«¾Ñ¤¾Ñ¾Ñ–¾Ñ¾Ñˆ¾Ñ¾Ñz¾Ñs¾Ñl¾Ñe¾Ñ^¾ÑW¾ÑP¾ÑI¾ÑB¾Ñ;¾Ñ4¾Ñ-¾Ñ&¾Ñ¾Ñ¾Ñ¾Ñ ¾Ñ¾Ñü½Ñõ½Ñî½Ñç½Ñà½ÑÙ½ÑÒ½Ñ˽ÑĽÑ½½Ñ¶½Ñ¯½Ñ¨½Ñ¡½Ñš½Ñ“½ÑŒ½Ñ…½Ñ~½Ñw½Ñp½Ñi½Ñb½Ñ[½ÑT½ÑM½ÑF½Ñ?½Ñ8½Ñ1½Ñ*½Ñ#½Ñ½Ñ½Ñ½Ñ½Ñ½Ñù¼Ñò¼Ñë¼Ñä¼ÑݼÑÖ¼ÑϼÑȼÑÁ¼Ñº¼Ñ³¼Ñ¬¼Ñ¥¼Ñž¼Ñ—¼Ñ¼Ñ‰¼Ñ‚¼Ñ{¼Ñt¼Ñm¼Ñf¼Ñ_¼ÑX¼ÑQ¼ÑJ¼ÑC¼Ñ<¼Ñ5¼Ñ.¼Ñ'¼Ñ ¼Ñ¼Ñ¼Ñ ¼Ñ¼Ñý»Ñö»Ñï»Ñè»Ñá»ÑÚ»ÑÓ»ÑÌ»ÑŻѾ»Ñ·»Ñ°»Ñ©»Ñ¢»Ñ›»Ñ”»Ñ»Ñ†»Ñ»Ñx»Ñq»Ñj»Ñc»Ñ\»ÑU»ÑN»ÑG»Ñ@»Ñ9»Ñ2»Ñ+»Ñ$»Ñ»Ñ»Ñ»Ñ»Ñ»ÑúºÑóºÑìºÑåºÑÞºÑ׺ÑкÑɺѺѻºÑ´ºÑ­ºÑ¦ºÑŸºÑ˜ºÑ‘ºÑŠºÑƒºÑ|ºÑuºÑnºÑgºÑ`ºÑYºÑRºÑKºÑDºÑ=ºÑ6ºÑ/ºÑ(ºÑ!ºÑºÑºÑ ºÑºÑþ¹Ñ÷¹Ñð¹Ñé¹Ñâ¹ÑÛ¹ÑÔ¹Ñ͹ÑƹÑ¿¹Ñ¸¹Ñ±¹Ñª¹Ñ£¹Ñœ¹Ñ•¹Ñ޹ч¹Ñ€¹Ñy¹Ñr¹Ñk¹Ñd¹Ñ]¹ÑV¹ÑO¹ÑH¹ÑA¹Ñ:¹Ñ3¹Ñ,¹Ñ%¹Ñ¹Ñ¹Ñ¹Ñ ¹Ñ¹Ñû¸Ñô¸Ñí¸Ñæ¸Ñ߸ÑظÑѸÑʸÑøÑ¼¸Ñµ¸Ñ®¸Ñ§¸Ñ ¸Ñ™¸Ñ’¸Ñ‹¸Ñ„¸Ñ}¸Ñv¸Ño¸Ñh¸Ña¸ÑZ¸ÑS¸ÑL¸ÑE¸Ñ>¸Ñ7¸Ñ0¸Ñ)¸Ñ"¸Ñ¸Ñ¸Ñ ¸Ñ¸Ñÿ·Ñø·Ññ·Ñê·Ñã·ÑÜ·ÑÕ·ÑηÑÇ·ÑÀ·Ñ¹·Ñ²·Ñ«·Ñ¤·Ñ·Ñ–·Ñ·Ñˆ·Ñ·Ñz·Ñs·Ñl·Ñe·Ñ^·ÑW·ÑP·ÑI·ÑB·Ñ;·Ñ4·Ñ-·Ñ&·Ñ·Ñ·Ñ·Ñ ·Ñ·Ñü¶Ñõ¶Ñî¶Ñç¶Ñà¶ÑÙ¶ÑÒ¶Ñ˶ÑĶѽ¶Ñ¶¶Ñ¯¶Ñ¨¶Ñ¡¶Ñš¶Ñ“¶ÑŒ¶Ñ…¶Ñ~¶Ñw¶Ñp¶Ñi¶Ñb¶Ñ[¶ÑT¶ÑM¶ÑF¶Ñ?¶Ñ8¶Ñ1¶Ñ*¶Ñ#¶Ñ¶Ñ¶Ñ¶Ñ¶Ñ¶ÑùµÑòµÑëµÑäµÑݵÑÖµÑϵÑȵÑÁµÑºµÑ³µÑ¬µÑ¥µÑžµÑ—µÑµÑ‰µÑ‚µÑ{µÑtµÑmµÑfµÑ_µÑXµÑQµÑJµÑCµÑ<µÑ5µÑ.µÑ'µÑ µÑµÑµÑ µÑµÑý´Ñö´Ñï´Ñè´Ñá´ÑÚ´ÑÓ´ÑÌ´ÑŴѾ´Ñ·´Ñ°´Ñ©´Ñ¢´Ñ›´Ñ”´Ñ´Ñ†´Ñ´Ñx´Ñq´Ñj´Ñc´Ñ\´ÑU´ÑN´ÑG´Ñ@´Ñ9´Ñ2´Ñ+´Ñ$´Ñ´Ñ´Ñ´Ñ´Ñ´Ñú³Ñó³Ñì³Ñå³ÑÞ³Ñ׳ÑгÑɳѳѻ³Ñ´³Ñ­³Ñ¦³ÑŸ³Ñ˜³Ñ‘³Ñгу³Ñ|³Ñu³Ñn³Ñg³Ñ`³ÑY³ÑR³ÑK³ÑD³Ñ=³Ñ6³Ñ/³Ñ(³Ñ!³Ñ³Ñ³Ñ ³Ñ³Ñþ²Ñ÷²Ñð²Ñé²Ñâ²ÑÛ²ÑÔ²ÑͲÑƲÑ¿²Ñ¸²Ñ±²Ñª²Ñ£²Ñœ²Ñ•²Ñ޲ч²Ñ€²Ñy²Ñr²Ñk²Ñd²Ñ]²ÑV²ÑO²ÑH²ÑA²Ñ:²Ñ3²Ñ,²Ñ%²Ñ²Ñ²Ñ²Ñ ²Ñ²Ñû±Ñô±Ñí±Ñæ±Ñß±ÑرÑѱÑʱÑñѼ±Ñµ±Ñ®±Ñ§±Ñ ±Ñ™±Ñ’±Ñ‹±Ñ„±Ñ}±Ñv±Ño±Ñh±Ña±ÑZ±ÑS±ÑL±ÑE±Ñ>±Ñ7±Ñ0±Ñ)±Ñ"±Ñ±Ñ±Ñ ±Ñ±Ñÿ°Ñø°Ññ°Ñê°Ñã°ÑܰÑÕ°ÑΰÑǰÑÀ°Ñ¹°Ñ²°Ñ«°Ñ¤°Ñ°Ñ–°Ñ°Ñˆ°Ñ°Ñz°Ñs°Ñl°Ñe°Ñ^°ÑW°ÑP°ÑI°ÑB°Ñ;°Ñ4°Ñ-°Ñ&°Ñ°Ñ°Ñ°Ñ °Ñ°Ñü¯Ñõ¯Ñî¯Ñç¯Ñà¯ÑÙ¯ÑÒ¯Ñ˯Ñįѽ¯Ñ¶¯Ñ¯¯Ñ¨¯Ñ¡¯Ñš¯Ñ“¯ÑŒ¯Ñ…¯Ñ~¯Ñw¯Ñp¯Ñi¯Ñb¯Ñ[¯ÑT¯ÑM¯ÑF¯Ñ?¯Ñ8¯Ñ1¯Ñ*¯Ñ#¯Ñ¯Ñ¯Ñ¯Ñ¯Ñ¯Ñù®Ñò®Ñë®Ñä®ÑÝ®ÑÖ®ÑÏ®ÑÈ®ÑÁ®Ñº®Ñ³®Ñ¬®Ñ¥®Ñž®Ñ—®Ñ®Ñ‰®Ñ‚®Ñ{®Ñt®Ñm®Ñf®Ñ_®ÑX®ÑQ®ÑJ®ÑC®Ñ<®Ñ5®Ñ.®Ñ'®Ñ ®Ñ®Ñ®Ñ ®Ñ®Ñý­Ñö­Ñï­Ñè­Ñá­ÑÚ­ÑÓ­ÑÌ­ÑŭѾ­Ñ·­Ñ°­Ñ©­Ñ¢­Ñ›­Ñ”­Ñ­Ñ†­Ñ­Ñx­Ñq­Ñj­Ñc­Ñ\­ÑU­ÑN­ÑG­Ñ@­Ñ9­Ñ2­Ñ+­Ñ$­Ñ­Ñ­Ñ­Ñ­Ñ­Ñú¬Ñó¬Ñì¬Ñå¬ÑÞ¬Ñ׬ÑЬÑɬѬѻ¬Ñ´¬Ñ­¬Ñ¦¬ÑŸ¬Ñ˜¬Ñ‘¬ÑЬу¬Ñ|¬Ñu¬Ñn¬Ñg¬Ñ`¬ÑY¬ÑR¬ÑK¬ÑD¬Ñ=¬Ñ6¬Ñ/¬Ñ(¬Ñ!¬Ñ¬Ñ¬Ñ ¬Ñ¬Ñþ«Ñ÷«Ñð«Ñé«Ñâ«ÑÛ«ÑÔ«ÑÍ«ÑÆ«Ñ¿«Ñ¸«Ñ±«Ñª«Ñ£«Ñœ«Ñ•«ÑŽ«Ñ‡«Ñ€«Ñy«Ñr«Ñk«Ñd«Ñ]«ÑV«ÑO«ÑH«ÑA«Ñ:«Ñ3«Ñ,«Ñ%«Ñ«Ñ«Ñ«Ñ «Ñ«ÑûªÑôªÑíªÑæªÑߪÑتÑѪÑʪÑêѼªÑµªÑ®ªÑ§ªÑ ªÑ™ªÑ’ªÑ‹ªÑ„ªÑ}ªÑvªÑoªÑhªÑaªÑZªÑSªÑLªÑEªÑ>ªÑ7ªÑ0ªÑ)ªÑ"ªÑªÑªÑ ªÑªÑÿ©Ñø©Ññ©Ñê©Ñã©ÑÜ©ÑÕ©ÑΩÑÇ©ÑÀ©Ñ¹©Ñ²©Ñ«©Ñ¤©Ñ©Ñ–©Ñ©Ñˆ©Ñ©Ñz©Ñs©Ñl©Ñe©Ñ^©ÑW©ÑP©ÑI©ÑB©Ñ;©Ñ4©Ñ-©Ñ&©Ñ©Ñ©Ñ©Ñ ©Ñ©Ñü¨Ñõ¨Ñî¨Ñç¨Ñà¨ÑÙ¨ÑÒ¨Ñ˨ÑĨѽ¨Ñ¶¨Ñ¯¨Ñ¨¨Ñ¡¨Ñš¨Ñ“¨ÑŒ¨Ñ…¨Ñ~¨Ñw¨Ñp¨Ñi¨Ñb¨Ñ[¨ÑT¨ÑM¨ÑF¨Ñ?¨Ñ8¨Ñ1¨Ñ*¨Ñ#¨Ñ¨Ñ¨Ñ¨Ñ¨Ñ¨Ñù§Ñò§Ñë§Ñä§ÑݧÑÖ§ÑϧÑȧÑÁ§Ñº§Ñ³§Ñ¬§Ñ¥§Ñž§Ñ—§Ñ§Ñ‰§Ñ‚§Ñ{§Ñt§Ñm§Ñf§Ñ_§ÑX§ÑQ§ÑJ§ÑC§Ñ<§Ñ5§Ñ.§Ñ'§Ñ §Ñ§Ñ§Ñ §Ñ§Ñý¦Ñö¦Ñï¦Ñè¦Ñá¦ÑÚ¦ÑÓ¦Ñ̦ÑŦѾ¦Ñ·¦Ñ°¦Ñ©¦Ñ¢¦Ñ›¦Ñ”¦Ñ¦Ñ†¦Ñ¦Ñx¦Ñq¦Ñj¦Ñc¦Ñ\¦ÑU¦ÑN¦ÑG¦Ñ@¦Ñ9¦Ñ2¦Ñ+¦Ñ$¦Ñ¦Ñ¦Ñ¦Ñ¦Ñ¦Ñú¥Ñó¥Ñì¥Ñå¥ÑÞ¥Ñ×¥ÑÐ¥Ñɥѥѻ¥Ñ´¥Ñ­¥Ñ¦¥ÑŸ¥Ñ˜¥Ñ‘¥ÑŠ¥Ñƒ¥Ñ|¥Ñu¥Ñn¥Ñg¥Ñ`¥ÑY¥ÑR¥ÑK¥ÑD¥Ñ=¥Ñ6¥Ñ/¥Ñ(¥Ñ!¥Ñ¥Ñ¥Ñ ¥Ñ¥Ñþ¤Ñ÷¤Ñð¤Ñé¤Ñâ¤ÑÛ¤ÑÔ¤ÑͤÑƤÑ¿¤Ñ¸¤Ñ±¤Ñª¤Ñ£¤Ñœ¤Ñ•¤Ñޤч¤Ñ€¤Ñy¤Ñr¤Ñk¤Ñd¤Ñ]¤ÑV¤ÑO¤ÑH¤ÑA¤Ñ:¤Ñ3¤Ñ,¤Ñ%¤Ñ¤Ñ¤Ñ¤Ñ ¤Ñ¤Ñû£Ñô£Ñí£Ñæ£ÑߣÑØ£ÑÑ£ÑÊ£ÑãѼ£Ñµ£Ñ®£Ñ§£Ñ £Ñ™£Ñ’£Ñ‹£Ñ„£Ñ}£Ñv£Ño£Ñh£Ña£ÑZ£ÑS£ÑL£ÑE£Ñ>£Ñ7£Ñ0£Ñ)£Ñ"£Ñ£Ñ£Ñ £Ñ£Ñÿ¢Ñø¢Ññ¢Ñê¢Ñã¢ÑÜ¢ÑÕ¢Ñ΢ÑÇ¢ÑÀ¢Ñ¹¢Ñ²¢Ñ«¢Ñ¤¢Ñ¢Ñ–¢Ñ¢Ñˆ¢Ñ¢Ñz¢Ñs¢Ñl¢Ñe¢Ñ^¢ÑW¢ÑP¢ÑI¢ÑB¢Ñ;¢Ñ4¢Ñ-¢Ñ&¢Ñ¢Ñ¢Ñ¢Ñ ¢Ñ¢Ñü¡Ñõ¡Ñî¡Ñç¡Ñà¡ÑÙ¡ÑÒ¡ÑË¡Ñġѽ¡Ñ¶¡Ñ¯¡Ñ¨¡Ñ¡¡Ñš¡Ñ“¡ÑŒ¡Ñ…¡Ñ~¡Ñw¡Ñp¡Ñi¡Ñb¡Ñ[¡ÑT¡ÑM¡ÑF¡Ñ?¡Ñ8¡Ñ1¡Ñ*¡Ñ#¡Ñ¡Ñ¡Ñ¡Ñ¡Ñ¡Ñù Ñò Ñë Ñä ÑÝ ÑÖ ÑÏ ÑÈ ÑÁ Ñº Ñ³ Ñ¬ Ñ¥ Ñž Ñ— Ñ Ñ‰ Ñ‚ Ñ{ Ñt Ñm Ñf Ñ_ ÑX ÑQ ÑJ ÑC Ñ< Ñ5 Ñ. Ñ' Ñ  Ñ Ñ Ñ  Ñ ÑýŸÑöŸÑïŸÑèŸÑáŸÑÚŸÑÓŸÑÌŸÑşѾŸÑ·ŸÑ°ŸÑ©ŸÑ¢ŸÑ›ŸÑ”ŸÑŸÑ†ŸÑŸÑxŸÑqŸÑjŸÑcŸÑ\ŸÑUŸÑNŸÑGŸÑ@ŸÑ9ŸÑ2ŸÑ+ŸÑ$ŸÑŸÑŸÑŸÑŸÑŸÑúžÑóžÑìžÑåžÑÞžÑמÑОÑɞўѻžÑ´žÑ­žÑ¦žÑŸžÑ˜žÑ‘žÑŠžÑƒžÑ|žÑužÑnžÑgžÑ`žÑYžÑRžÑKžÑDžÑ=žÑ6žÑ/žÑ(žÑ!žÑžÑžÑ žÑžÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûœÑôœÑíœÑæœÑßœÑØœÑÑœÑÊœÑÜѼœÑµœÑ®œÑ§œÑ œÑ™œÑ’œÑ‹œÑ„œÑ}œÑvœÑoœÑhœÑaœÑZœÑSœÑLœÑEœÑ>œÑ7œÑ0œÑ)œÑ"œÑœÑœÑ œÑœÑÿ›Ñø›Ññ›Ñê›Ñã›ÑÜ›ÑÕ›ÑΛÑÇ›ÑÀ›Ñ¹›Ñ²›Ñ«›Ñ¤›Ñ›Ñ–›Ñ›Ñˆ›Ñ›Ñz›Ñs›Ñl›Ñe›Ñ^›ÑW›ÑP›ÑI›ÑB›Ñ;›Ñ4›Ñ-›Ñ&›Ñ›Ñ›Ñ›Ñ ›Ñ›ÑüšÑõšÑîšÑçšÑàšÑÙšÑÒšÑËšÑĚѽšÑ¶šÑ¯šÑ¨šÑ¡šÑššÑ“šÑŒšÑ…šÑ~šÑwšÑpšÑišÑbšÑ[šÑTšÑMšÑFšÑ?šÑ8šÑ1šÑ*šÑ#šÑšÑšÑšÑšÑšÑù™Ñò™Ñë™Ñä™ÑÝ™ÑÖ™ÑÏ™ÑÈ™ÑÁ™Ñº™Ñ³™Ñ¬™Ñ¥™Ñž™Ñ—™Ñ™Ñ‰™Ñ‚™Ñ{™Ñt™Ñm™Ñf™Ñ_™ÑX™ÑQ™ÑJ™ÑC™Ñ<™Ñ5™Ñ.™Ñ'™Ñ ™Ñ™Ñ™Ñ ™Ñ™Ñý˜Ñö˜Ñï˜Ñè˜Ñá˜ÑÚ˜ÑÓ˜Ñ̘ÑŘѾ˜Ñ·˜Ñ°˜Ñ©˜Ñ¢˜Ñ›˜Ñ”˜Ñ˜Ñ†˜Ñ˜Ñx˜Ñq˜Ñj˜Ñc˜Ñ\˜ÑU˜ÑN˜ÑG˜Ñ@˜Ñ9˜Ñ2˜Ñ+˜Ñ$˜Ñ˜Ñ˜Ñ˜Ñ˜Ñ˜Ñú—Ñó—Ñì—Ñå—ÑÞ—Ñ×—ÑЗÑÉ—Ñ—Ñ»—Ñ´—Ñ­—Ѧ—ÑŸ—ј—Ñ‘—ÑŠ—у—Ñ|—Ñu—Ñn—Ñg—Ñ`—ÑY—ÑR—ÑK—ÑD—Ñ=—Ñ6—Ñ/—Ñ(—Ñ!—Ñ—Ñ—Ñ —Ñ—Ñþ–Ñ÷–Ñð–Ñé–Ñâ–ÑÛ–ÑÔ–ÑÍ–ÑÆ–Ñ¿–Ѹ–ѱ–Ѫ–Ñ£–Ñœ–Ñ•–ÑŽ–ч–Ñ€–Ñy–Ñr–Ñk–Ñd–Ñ]–ÑV–ÑO–ÑH–ÑA–Ñ:–Ñ3–Ñ,–Ñ%–Ñ–Ñ–Ñ–Ñ –Ñ–Ñû•Ñô•Ñí•Ñæ•Ñß•ÑØ•ÑÑ•ÑÊ•ÑÕѼ•ѵ•Ñ®•ѧ•Ñ •Ñ™•Ñ’•Ñ‹•Ñ„•Ñ}•Ñv•Ño•Ñh•Ña•ÑZ•ÑS•ÑL•ÑE•Ñ>•Ñ7•Ñ0•Ñ)•Ñ"•Ñ•Ñ•Ñ •Ñ•Ñÿ”Ñø”Ññ”Ñê”Ñã”ÑÜ”ÑÕ”ÑΔÑÇ”ÑÀ”ѹ”Ѳ”Ñ«”Ѥ”єі”єш”Ñ”Ñz”Ñs”Ñl”Ñe”Ñ^”ÑW”ÑP”ÑI”ÑB”Ñ;”Ñ4”Ñ-”Ñ&”Ñ”Ñ”Ñ”Ñ ”Ñ”Ñü“Ñõ“Ñî“Ñç“Ñà“ÑÙ“ÑÒ“ÑË“Ñēѽ“Ѷ“ѯ“Ѩ“Ñ¡“Ñš“Ñ““ÑŒ“Ñ…“Ñ~“Ñw“Ñp“Ñi“Ñb“Ñ[“ÑT“ÑM“ÑF“Ñ?“Ñ8“Ñ1“Ñ*“Ñ#“ѓѓѓѓѓÑù’Ñò’Ñë’Ñä’ÑÝ’ÑÖ’ÑÏ’ÑÈ’ÑÁ’Ѻ’ѳ’Ѭ’Ñ¥’Ñž’Ñ—’ђщ’Ñ‚’Ñ{’Ñt’Ñm’Ñf’Ñ_’ÑX’ÑQ’ÑJ’ÑC’Ñ<’Ñ5’Ñ.’Ñ'’Ñ ’Ñ’Ñ’Ñ ’Ñ’Ñý‘Ñö‘Ñï‘Ñè‘Ñá‘ÑÚ‘ÑÓ‘ÑÌ‘ÑőѾ‘Ñ·‘Ѱ‘Ñ©‘Ñ¢‘Ñ›‘Ñ”‘ёц‘Ñ‘Ñx‘Ñq‘Ñj‘Ñc‘Ñ\‘ÑU‘ÑN‘ÑG‘Ñ@‘Ñ9‘Ñ2‘Ñ+‘Ñ$‘ёёёёёÑúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûŽÑôŽÑíŽÑæŽÑߎÑØŽÑÑŽÑÊŽÑÎѼŽÑµŽÑ®ŽÑ§ŽÑ ŽÑ™ŽÑ’ŽÑ‹ŽÑ„ŽÑ}ŽÑvŽÑoŽÑhŽÑaŽÑZŽÑSŽÑLŽÑEŽÑ>ŽÑ7ŽÑ0ŽÑ)ŽÑ"ŽÑŽÑŽÑ ŽÑŽÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüŒÑõŒÑîŒÑçŒÑàŒÑÙŒÑÒŒÑËŒÑČѽŒÑ¶ŒÑ¯ŒÑ¨ŒÑ¡ŒÑšŒÑ“ŒÑŒŒÑ…ŒÑ~ŒÑwŒÑpŒÑiŒÑbŒÑ[ŒÑTŒÑMŒÑFŒÑ?ŒÑ8ŒÑ1ŒÑ*ŒÑ#ŒÑŒÑŒÑŒÑŒÑŒÑù‹Ñò‹Ñë‹Ñä‹ÑÝ‹ÑÖ‹ÑÏ‹ÑÈ‹ÑÁ‹Ñº‹Ñ³‹Ñ¬‹Ñ¥‹Ñž‹Ñ—‹Ñ‹Ñ‰‹Ñ‚‹Ñ{‹Ñt‹Ñm‹Ñf‹Ñ_‹ÑX‹ÑQ‹ÑJ‹ÑC‹Ñ<‹Ñ5‹Ñ.‹Ñ'‹Ñ ‹Ñ‹Ñ‹Ñ ‹Ñ‹ÑýŠÑöŠÑïŠÑèŠÑáŠÑÚŠÑÓŠÑÌŠÑŊѾŠÑ·ŠÑ°ŠÑ©ŠÑ¢ŠÑ›ŠÑ”ŠÑŠÑ†ŠÑŠÑxŠÑqŠÑjŠÑcŠÑ\ŠÑUŠÑNŠÑGŠÑ@ŠÑ9ŠÑ2ŠÑ+ŠÑ$ŠÑŠÑŠÑŠÑŠÑŠÑú‰Ñó‰Ñì‰Ñå‰ÑÞ‰Ñ׉ÑЉÑɉщѻ‰Ñ´‰Ñ­‰Ñ¦‰ÑŸ‰Ñ˜‰Ñ‘‰ÑЉÑƒ‰Ñ|‰Ñu‰Ñn‰Ñg‰Ñ`‰ÑY‰ÑR‰ÑK‰ÑD‰Ñ=‰Ñ6‰Ñ/‰Ñ(‰Ñ!‰Ñ‰Ñ‰Ñ ‰Ñ‰ÑþˆÑ÷ˆÑðˆÑéˆÑâˆÑÛˆÑÔˆÑ͈ÑƈÑ¿ˆÑ¸ˆÑ±ˆÑªˆÑ£ˆÑœˆÑ•ˆÑŽˆÑ‡ˆÑ€ˆÑyˆÑrˆÑkˆÑdˆÑ]ˆÑVˆÑOˆÑHˆÑAˆÑ:ˆÑ3ˆÑ,ˆÑ%ˆÑˆÑˆÑˆÑ ˆÑˆÑû‡Ñô‡Ñí‡Ñæ‡Ñ߇Ñ؇ÑчÑʇÑÇѼ‡Ñµ‡Ñ®‡Ñ§‡Ñ ‡Ñ™‡Ñ’‡Ñ‹‡Ñ„‡Ñ}‡Ñv‡Ño‡Ñh‡Ña‡ÑZ‡ÑS‡ÑL‡ÑE‡Ñ>‡Ñ7‡Ñ0‡Ñ)‡Ñ"‡Ñ‡Ñ‡Ñ ‡Ñ‡Ñÿ†Ñø†Ññ†Ñê†Ñã†Ñ܆ÑÕ†ÑΆÑdžÑÀ†Ñ¹†Ñ²†Ñ«†Ñ¤†Ñ†Ñ–†Ñ†Ñˆ†Ñ†Ñz†Ñs†Ñl†Ñe†Ñ^†ÑW†ÑP†ÑI†ÑB†Ñ;†Ñ4†Ñ-†Ñ&†Ñ†Ñ†Ñ†Ñ †Ñ†Ñü…Ñõ…Ñî…Ñç…Ñà…ÑÙ…ÑÒ…ÑË…Ñąѽ…Ѷ…ѯ…Ѩ…Ñ¡…Ñš…Ñ“…ÑŒ…Ñ……Ñ~…Ñw…Ñp…Ñi…Ñb…Ñ[…ÑT…ÑM…ÑF…Ñ?…Ñ8…Ñ1…Ñ*…Ñ#…Ñ…Ñ…Ñ…Ñ…Ñ…Ñù„Ñò„Ñë„Ñä„ÑÝ„ÑÖ„ÑÏ„ÑÈ„ÑÁ„Ѻ„ѳ„Ѭ„Ñ¥„Ñž„Ñ—„фщ„Ñ‚„Ñ{„Ñt„Ñm„Ñf„Ñ_„ÑX„ÑQ„ÑJ„ÑC„Ñ<„Ñ5„Ñ.„Ñ'„Ñ „Ñ„Ñ„Ñ „Ñ„ÑýƒÑöƒÑïƒÑèƒÑáƒÑÚƒÑÓƒÑ̃ÑŃѾƒÑ·ƒÑ°ƒÑ©ƒÑ¢ƒÑ›ƒÑ”ƒÑƒÑ†ƒÑƒÑxƒÑqƒÑjƒÑcƒÑ\ƒÑUƒÑNƒÑGƒÑ@ƒÑ9ƒÑ2ƒÑ+ƒÑ$ƒÑƒÑƒÑƒÑƒÑƒÑú‚Ñó‚Ñì‚Ñå‚ÑÞ‚ÑׂÑЂÑɂтѻ‚Ñ´‚Ñ­‚Ѧ‚ÑŸ‚ј‚Ñ‘‚ÑŠ‚у‚Ñ|‚Ñu‚Ñn‚Ñg‚Ñ`‚ÑY‚ÑR‚ÑK‚ÑD‚Ñ=‚Ñ6‚Ñ/‚Ñ(‚Ñ!‚Ñ‚Ñ‚Ñ ‚Ñ‚ÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑû€Ñô€Ñí€Ñæ€Ñ߀ÑØ€ÑÑ€ÑÊ€ÑÀѼ€Ñµ€Ñ®€Ñ§€Ñ €Ñ™€Ñ’€Ñ‹€Ñ„€Ñ}€Ñv€Ño€Ñh€Ña€ÑZ€ÑS€ÑL€ÑE€Ñ>€Ñ7€Ñ0€Ñ)€Ñ"€Ñ€Ñ€Ñ €Ñ€ÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑü~Ñõ~Ñî~Ñç~Ñà~ÑÙ~ÑÒ~ÑË~ÑÄ~ѽ~Ѷ~ѯ~Ѩ~Ñ¡~Ñš~Ñ“~ÑŒ~Ñ…~Ñ~~Ñw~Ñp~Ñi~Ñb~Ñ[~ÑT~ÑM~ÑF~Ñ?~Ñ8~Ñ1~Ñ*~Ñ#~Ñ~Ñ~Ñ~Ñ~Ñ~Ñù}Ñò}Ñë}Ñä}ÑÝ}ÑÖ}ÑÏ}ÑÈ}ÑÁ}Ѻ}ѳ}Ѭ}Ñ¥}Ñž}Ñ—}Ñ}щ}Ñ‚}Ñ{}Ñt}Ñm}Ñf}Ñ_}ÑX}ÑQ}ÑJ}ÑC}Ñ<}Ñ5}Ñ.}Ñ'}Ñ }Ñ}Ñ}Ñ }Ñ}Ñý|Ñö|Ñï|Ñè|Ñá|ÑÚ|ÑÓ|ÑÌ|ÑÅ|Ѿ|Ñ·|Ѱ|Ñ©|Ñ¢|Ñ›|Ñ”|Ñ|ц|Ñ|Ñx|Ñq|Ñj|Ñc|Ñ\|ÑU|ÑN|ÑG|Ñ@|Ñ9|Ñ2|Ñ+|Ñ$|Ñ|Ñ|Ñ|Ñ|Ñ|Ñú{Ñó{Ñì{Ñå{ÑÞ{Ñ×{ÑÐ{ÑÉ{ÑÂ{Ñ»{Ñ´{Ñ­{Ѧ{ÑŸ{ј{Ñ‘{ÑŠ{у{Ñ|{Ñu{Ñn{Ñg{Ñ`{ÑY{ÑR{ÑK{ÑD{Ñ={Ñ6{Ñ/{Ñ({Ñ!{Ñ{Ñ{Ñ {Ñ{ÑþzÑ÷zÑðzÑézÑâzÑÛzÑÔzÑÍzÑÆzÑ¿zѸzѱzѪzÑ£zÑœzÑ•zÑŽzчzÑ€zÑyzÑrzÑkzÑdzÑ]zÑVzÑOzÑHzÑAzÑ:zÑ3zÑ,zÑ%zÑzÑzÑzÑ zÑzÑûyÑôyÑíyÑæyÑßyÑØyÑÑyÑÊyÑÃyѼyѵyÑ®yѧyÑ yÑ™yÑ’yÑ‹yÑ„yÑ}yÑvyÑoyÑhyÑayÑZyÑSyÑLyÑEyÑ>yÑ7yÑ0yÑ)yÑ"yÑyÑyÑ yÑyÑÿxÑøxÑñxÑêxÑãxÑÜxÑÕxÑÎxÑÇxÑÀxѹxѲxÑ«xѤxÑxÑ–xÑxшxÑxÑzxÑsxÑlxÑexÑ^xÑWxÑPxÑIxÑBxÑ;xÑ4xÑ-xÑ&xÑxÑxÑxÑ xÑxÑüwÑõwÑîwÑçwÑàwÑÙwÑÒwÑËwÑÄwѽwѶwѯwѨwÑ¡wÑšwÑ“wÑŒwÑ…wÑ~wÑwwÑpwÑiwÑbwÑ[wÑTwÑMwÑFwÑ?wÑ8wÑ1wÑ*wÑ#wÑwÑwÑwÑwÑwÑùvÑòvÑëvÑävÑÝvÑÖvÑÏvÑÈvÑÁvѺvѳvѬvÑ¥vÑžvÑ—vÑvщvÑ‚vÑ{vÑtvÑmvÑfvÑ_vÑXvÑQvÑJvÑCvÑrÑ7rÑ0rÑ)rÑ"rÑrÑrÑ rÑrÑÿqÑøqÑñqÑêqÑãqÑÜqÑÕqÑÎqÑÇqÑÀqѹqѲqÑ«qѤqÑqÑ–qÑqшqÑqÑzqÑsqÑlqÑeqÑ^qÑWqÑPqÑIqÑBqÑ;qÑ4qÑ-qÑ&qÑqÑqÑqÑ qÑqÑüpÑõpÑîpÑçpÑàpÑÙpÑÒpÑËpÑÄpѽpѶpѯpѨpÑ¡pÑšpÑ“pÑŒpÑ…pÑ~pÑwpÑppÑipÑbpÑ[pÑTpÑMpÑFpÑ?pÑ8pÑ1pÑ*pÑ#pÑpÑpÑpÑpÑpÑùoÑòoÑëoÑäoÑÝoÑÖoÑÏoÑÈoÑÁoѺoѳoѬoÑ¥oÑžoÑ—oÑoщoÑ‚oÑ{oÑtoÑmoÑfoÑ_oÑXoÑQoÑJoÑCoÑkÑ7kÑ0kÑ)kÑ"kÑkÑkÑ kÑkÑÿjÑøjÑñjÑêjÑãjÑÜjÑÕjÑÎjÑÇjÑÀjѹjѲjÑ«jѤjÑjÑ–jÑjшjÑjÑzjÑsjÑljÑejÑ^jÑWjÑPjÑIjÑBjÑ;jÑ4jÑ-jÑ&jÑjÑjÑjÑ jÑjÑüiÑõiÑîiÑçiÑàiÑÙiÑÒiÑËiÑÄiѽiѶiѯiѨiÑ¡iÑšiÑ“iÑŒiÑ…iÑ~iÑwiÑpiÑiiÑbiÑ[iÑTiÑMiÑFiÑ?iÑ8iÑ1iÑ*iÑ#iÑiÑiÑiÑiÑiÑùhÑòhÑëhÑähÑÝhÑÖhÑÏhÑÈhÑÁhѺhѳhѬhÑ¥hÑžhÑ—hÑhщhÑ‚hÑ{hÑthÑmhÑfhÑ_hÑXhÑQhÑJhÑChÑdÑ7dÑ0dÑ)dÑ"dÑdÑdÑ dÑdÑÿcÑøcÑñcÑêcÑãcÑÜcÑÕcÑÎcÑÇcÑÀcѹcѲcÑ«cѤcÑcÑ–cÑcшcÑcÑzcÑscÑlcÑecÑ^cÑWcÑPcÑIcÑBcÑ;cÑ4cÑ-cÑ&cÑcÑcÑcÑ cÑcÑübÑõbÑîbÑçbÑàbÑÙbÑÒbÑËbÑÄbѽbѶbѯbѨbÑ¡bÑšbÑ“bÑŒbÑ…bÑ~bÑwbÑpbÑibÑbbÑ[bÑTbÑMbÑFbÑ?bÑ8bÑ1bÑ*bÑ#bÑbÑbÑbÑbÑbÑùaÑòaÑëaÑäaÑÝaÑÖaÑÏaÑÈaÑÁaѺaѳaѬaÑ¥aÑžaÑ—aÑaщaÑ‚aÑ{aÑtaÑmaÑfaÑ_aÑXaÑQaÑJaÑCaÑ]Ñ7]Ñ0]Ñ)]Ñ"]Ñ]Ñ]Ñ ]Ñ]Ñÿ\Ñø\Ññ\Ñê\Ñã\ÑÜ\ÑÕ\ÑÎ\ÑÇ\ÑÀ\ѹ\Ѳ\Ñ«\Ѥ\Ñ\Ñ–\Ñ\ш\Ñ\Ñz\Ñs\Ñl\Ñe\Ñ^\ÑW\ÑP\ÑI\ÑB\Ñ;\Ñ4\Ñ-\Ñ&\Ñ\Ñ\Ñ\Ñ \Ñ\Ñü[Ñõ[Ñî[Ñç[Ñà[ÑÙ[ÑÒ[ÑË[ÑÄ[ѽ[Ѷ[ѯ[Ѩ[Ñ¡[Ñš[Ñ“[ÑŒ[Ñ…[Ñ~[Ñw[Ñp[Ñi[Ñb[Ñ[[ÑT[ÑM[ÑF[Ñ?[Ñ8[Ñ1[Ñ*[Ñ#[Ñ[Ñ[Ñ[Ñ[Ñ[ÑùZÑòZÑëZÑäZÑÝZÑÖZÑÏZÑÈZÑÁZѺZѳZѬZÑ¥ZÑžZÑ—ZÑZщZÑ‚ZÑ{ZÑtZÑmZÑfZÑ_ZÑXZÑQZÑJZÑCZÑVÑ7VÑ0VÑ)VÑ"VÑVÑVÑ VÑVÑÿUÑøUÑñUÑêUÑãUÑÜUÑÕUÑÎUÑÇUÑÀUѹUѲUÑ«UѤUÑUÑ–UÑUшUÑUÑzUÑsUÑlUÑeUÑ^UÑWUÑPUÑIUÑBUÑ;UÑ4UÑ-UÑ&UÑUÑUÑUÑ UÑUÑüTÑõTÑîTÑçTÑàTÑÙTÑÒTÑËTÑÄTѽTѶTѯTѨTÑ¡TÑšTÑ“TÑŒTÑ…TÑ~TÑwTÑpTÑiTÑbTÑ[TÑTTÑMTÑFTÑ?TÑ8TÑ1TÑ*TÑ#TÑTÑTÑTÑTÑTÑùSÑòSÑëSÑäSÑÝSÑÖSÑÏSÑÈSÑÁSѺSѳSѬSÑ¥SÑžSÑ—SÑSщSÑ‚SÑ{SÑtSÑmSÑfSÑ_SÑXSÑQSÑJSÑCSÑOÑ7OÑ0OÑ)OÑ"OÑOÑOÑ OÑOÑÿNÑøNÑñNÑêNÑãNÑÜNÑÕNÑÎNÑÇNÑÀNѹNѲNÑ«NѤNÑNÑ–NÑNшNÑNÑzNÑsNÑlNÑeNÑ^NÑWNÑPNÑINÑBNÑ;NÑ4NÑ-NÑ&NÑNÑNÑNÑ NÑNÑüMÑõMÑîMÑçMÑàMÑÙMÑÒMÑËMÑÄMѽMѶMѯMѨMÑ¡MÑšMÑ“MÑŒMÑ…MÑ~MÑwMÑpMÑiMÑbMÑ[MÑTMÑMMÑFMÑ?MÑ8MÑ1MÑ*MÑ#MÑMÑMÑMÑMÑMÑùLÑòLÑëLÑäLÑÝLÑÖLÑÏLÑÈLÑÁLѺLѳLѬLÑ¥LÑžLÑ—LÑLщLÑ‚LÑ{LÑtLÑmLÑfLÑ_LÑXLÑQLÑJLÑCLÑHÑ7HÑ0HÑ)HÑ"HÑHÑHÑ HÑHÑÿGÑøGÑñGÑêGÑãGÑÜGÑÕGÑÎGÑÇGÑÀGѹGѲGÑ«GѤGÑGÑ–GÑGшGÑGÑzGÑsGÑlGÑeGÑ^GÑWGÑPGÑIGÑBGÑ;GÑ4GÑ-GÑ&GÑGÑGÑGÑ GÑGÑüFÑõFÑîFÑçFÑàFÑÙFÑÒFÑËFÑÄFѽFѶFѯFѨFÑ¡FÑšFÑ“FÑŒFÑ…FÑ~FÑwFÑpFÑiFÑbFÑ[FÑTFÑMFÑFFÑ?FÑ8FÑ1FÑ*FÑ#FÑFÑFÑFÑFÑFÑùEÑòEÑëEÑäEÑÝEÑÖEÑÏEÑÈEÑÁEѺEѳEѬEÑ¥EÑžEÑ—EÑEщEÑ‚EÑ{EÑtEÑmEÑfEÑ_EÑXEÑQEÑJEÑCEÑAÑ7AÑ0AÑ)AÑ"AÑAÑAÑ AÑAÑÿ@Ñø@Ññ@Ñê@Ñã@ÑÜ@ÑÕ@ÑÎ@ÑÇ@ÑÀ@ѹ@Ѳ@Ñ«@Ѥ@Ñ@Ñ–@Ñ@ш@Ñ@Ñz@Ñs@Ñl@Ñe@Ñ^@ÑW@ÑP@ÑI@ÑB@Ñ;@Ñ4@Ñ-@Ñ&@Ñ@Ñ@Ñ@Ñ @Ñ@Ñü?Ñõ?Ñî?Ñç?Ñà?ÑÙ?ÑÒ?ÑË?ÑÄ?ѽ?Ѷ?ѯ?Ѩ?Ñ¡?Ñš?Ñ“?ÑŒ?Ñ…?Ñ~?Ñw?Ñp?Ñi?Ñb?Ñ[?ÑT?ÑM?ÑF?Ñ??Ñ8?Ñ1?Ñ*?Ñ#?Ñ?Ñ?Ñ?Ñ?Ñ?Ñù>Ñò>Ñë>Ñä>ÑÝ>ÑÖ>ÑÏ>ÑÈ>ÑÁ>Ѻ>ѳ>Ѭ>Ñ¥>Ñž>Ñ—>Ñ>щ>Ñ‚>Ñ{>Ñt>Ñm>Ñf>Ñ_>ÑX>ÑQ>ÑJ>ÑC>Ñ<>Ñ5>Ñ.>Ñ'>Ñ >Ñ>Ñ>Ñ >Ñ>Ñý=Ñö=Ñï=Ñè=Ñá=ÑÚ=ÑÓ=ÑÌ=ÑÅ=Ѿ=Ñ·=Ѱ=Ñ©=Ñ¢=Ñ›=Ñ”=Ñ=ц=Ñ=Ñx=Ñq=Ñj=Ñc=Ñ\=ÑU=ÑN=ÑG=Ñ@=Ñ9=Ñ2=Ñ+=Ñ$=Ñ=Ñ=Ñ=Ñ=Ñ=Ñú<Ñó<Ñì<Ñå<ÑÞ<Ñ×<ÑÐ<ÑÉ<ÑÂ<Ñ»<Ñ´<Ñ­<Ѧ<ÑŸ<ј<Ñ‘<ÑŠ<у<Ñ|<Ñu<Ñn<Ñg<Ñ`<ÑY<ÑR<ÑK<ÑD<Ñ=<Ñ6<Ñ/<Ñ(<Ñ!<Ñ<Ñ<Ñ <Ñ<Ñþ;Ñ÷;Ñð;Ñé;Ñâ;ÑÛ;ÑÔ;ÑÍ;ÑÆ;Ñ¿;Ѹ;ѱ;Ѫ;Ñ£;Ñœ;Ñ•;ÑŽ;ч;Ñ€;Ñy;Ñr;Ñk;Ñd;Ñ];ÑV;ÑO;ÑH;ÑA;Ñ:;Ñ3;Ñ,;Ñ%;Ñ;Ñ;Ñ;Ñ ;Ñ;Ñû:Ñô:Ñí:Ñæ:Ñß:ÑØ:ÑÑ:ÑÊ:ÑÃ:Ѽ:ѵ:Ñ®:ѧ:Ñ :Ñ™:Ñ’:Ñ‹:Ñ„:Ñ}:Ñv:Ño:Ñh:Ña:ÑZ:ÑS:ÑL:ÑE:Ñ>:Ñ7:Ñ0:Ñ):Ñ":Ñ:Ñ:Ñ :Ñ:Ñÿ9Ñø9Ññ9Ñê9Ñã9ÑÜ9ÑÕ9ÑÎ9ÑÇ9ÑÀ9ѹ9Ѳ9Ñ«9Ѥ9Ñ9Ñ–9Ñ9ш9Ñ9Ñz9Ñs9Ñl9Ñe9Ñ^9ÑW9ÑP9ÑI9ÑB9Ñ;9Ñ49Ñ-9Ñ&9Ñ9Ñ9Ñ9Ñ 9Ñ9Ñü8Ñõ8Ñî8Ñç8Ñà8ÑÙ8ÑÒ8ÑË8ÑÄ8ѽ8Ѷ8ѯ8Ѩ8Ñ¡8Ñš8Ñ“8ÑŒ8Ñ…8Ñ~8Ñw8Ñp8Ñi8Ñb8Ñ[8ÑT8ÑM8ÑF8Ñ?8Ñ88Ñ18Ñ*8Ñ#8Ñ8Ñ8Ñ8Ñ8Ñ8Ñù7Ñò7Ñë7Ñä7ÑÝ7ÑÖ7ÑÏ7ÑÈ7ÑÁ7Ѻ7ѳ7Ѭ7Ñ¥7Ñž7Ñ—7Ñ7щ7Ñ‚7Ñ{7Ñt7Ñm7Ñf7Ñ_7ÑX7ÑQ7ÑJ7ÑC7Ñ<7Ñ57Ñ.7Ñ'7Ñ 7Ñ7Ñ7Ñ 7Ñ7Ñý6Ñö6Ñï6Ñè6Ñá6ÑÚ6ÑÓ6ÑÌ6ÑÅ6Ѿ6Ñ·6Ѱ6Ñ©6Ñ¢6Ñ›6Ñ”6Ñ6ц6Ñ6Ñx6Ñq6Ñj6Ñc6Ñ\6ÑU6ÑN6ÑG6Ñ@6Ñ96Ñ26Ñ+6Ñ$6Ñ6Ñ6Ñ6Ñ6Ñ6Ñú5Ñó5Ñì5Ñå5ÑÞ5Ñ×5ÑÐ5ÑÉ5ÑÂ5Ñ»5Ñ´5Ñ­5Ѧ5ÑŸ5ј5Ñ‘5ÑŠ5у5Ñ|5Ñu5Ñn5Ñg5Ñ`5ÑY5ÑR5ÑK5ÑD5Ñ=5Ñ65Ñ/5Ñ(5Ñ!5Ñ5Ñ5Ñ 5Ñ5Ñþ4Ñ÷4Ñð4Ñé4Ñâ4ÑÛ4ÑÔ4ÑÍ4ÑÆ4Ñ¿4Ѹ4ѱ4Ѫ4Ñ£4Ñœ4Ñ•4ÑŽ4ч4Ñ€4Ñy4Ñr4Ñk4Ñd4Ñ]4ÑV4ÑO4ÑH4ÑA4Ñ:4Ñ34Ñ,4Ñ%4Ñ4Ñ4Ñ4Ñ 4Ñ4Ñû3Ñô3Ñí3Ñæ3Ñß3ÑØ3ÑÑ3ÑÊ3ÑÃ3Ѽ3ѵ3Ñ®3ѧ3Ñ 3Ñ™3Ñ’3Ñ‹3Ñ„3Ñ}3Ñv3Ño3Ñh3Ña3ÑZ3ÑS3ÑL3ÑE3Ñ>3Ñ73Ñ03Ñ)3Ñ"3Ñ3Ñ3Ñ 3Ñ3Ñÿ2Ñø2Ññ2Ñê2Ñã2ÑÜ2ÑÕ2ÑÎ2ÑÇ2ÑÀ2ѹ2Ѳ2Ñ«2Ѥ2Ñ2Ñ–2Ñ2ш2Ñ2Ñz2Ñs2Ñl2Ñe2Ñ^2ÑW2ÑP2ÑI2ÑB2Ñ;2Ñ42Ñ-2Ñ&2Ñ2Ñ2Ñ2Ñ 2Ñ2Ñü1Ñõ1Ñî1Ñç1Ñà1ÑÙ1ÑÒ1ÑË1ÑÄ1ѽ1Ѷ1ѯ1Ѩ1Ñ¡1Ñš1Ñ“1ÑŒ1Ñ…1Ñ~1Ñw1Ñp1Ñi1Ñb1Ñ[1ÑT1ÑM1ÑF1Ñ?1Ñ81Ñ11Ñ*1Ñ#1Ñ1Ñ1Ñ1Ñ1Ñ1Ñù0Ñò0Ñë0Ñä0ÑÝ0ÑÖ0ÑÏ0ÑÈ0ÑÁ0Ѻ0ѳ0Ѭ0Ñ¥0Ñž0Ñ—0Ñ0щ0Ñ‚0Ñ{0Ñt0Ñm0Ñf0Ñ_0ÑX0ÑQ0ÑJ0ÑC0Ñ<0Ñ50Ñ.0Ñ'0Ñ 0Ñ0Ñ0Ñ 0Ñ0Ñý/Ñö/Ñï/Ñè/Ñá/ÑÚ/ÑÓ/ÑÌ/ÑÅ/Ѿ/Ñ·/Ѱ/Ñ©/Ñ¢/Ñ›/Ñ”/Ñ/ц/Ñ/Ñx/Ñq/Ñj/Ñc/Ñ\/ÑU/ÑN/ÑG/Ñ@/Ñ9/Ñ2/Ñ+/Ñ$/Ñ/Ñ/Ñ/Ñ/Ñ/Ñú.Ñó.Ñì.Ñå.ÑÞ.Ñ×.ÑÐ.ÑÉ.ÑÂ.Ñ».Ñ´.Ñ­.Ѧ.ÑŸ.ј.Ñ‘.ÑŠ.у.Ñ|.Ñu.Ñn.Ñg.Ñ`.ÑY.ÑR.ÑK.ÑD.Ñ=.Ñ6.Ñ/.Ñ(.Ñ!.Ñ.Ñ.Ñ .Ñ.Ñþ-Ñ÷-Ñð-Ñé-Ñâ-ÑÛ-ÑÔ-ÑÍ-ÑÆ-Ñ¿-Ѹ-ѱ-Ѫ-Ñ£-Ñœ-Ñ•-ÑŽ-ч-Ñ€-Ñy-Ñr-Ñk-Ñd-Ñ]-ÑV-ÑO-ÑH-ÑA-Ñ:-Ñ3-Ñ,-Ñ%-Ñ-Ñ-Ñ-Ñ -Ñ-Ñû,Ñô,Ñí,Ñæ,Ñß,ÑØ,ÑÑ,ÑÊ,ÑÃ,Ѽ,ѵ,Ñ®,ѧ,Ñ ,Ñ™,Ñ’,Ñ‹,Ñ„,Ñ},Ñv,Ño,Ñh,Ña,ÑZ,ÑS,ÑL,ÑE,Ñ>,Ñ7,Ñ0,Ñ),Ñ",Ñ,Ñ,Ñ ,Ñ,Ñÿ+Ñø+Ññ+Ñê+Ñã+ÑÜ+ÑÕ+ÑÎ+ÑÇ+ÑÀ+ѹ+Ѳ+Ñ«+Ѥ+Ñ+Ñ–+Ñ+ш+Ñ+Ñz+Ñs+Ñl+Ñe+Ñ^+ÑW+ÑP+ÑI+ÑB+Ñ;+Ñ4+Ñ-+Ñ&+Ñ+Ñ+Ñ+Ñ +Ñ+Ñü*Ñõ*Ñî*Ñç*Ñà*ÑÙ*ÑÒ*ÑË*ÑÄ*ѽ*Ѷ*ѯ*Ѩ*Ñ¡*Ñš*Ñ“*ÑŒ*Ñ…*Ñ~*Ñw*Ñp*Ñi*Ñb*Ñ[*ÑT*ÑM*ÑF*Ñ?*Ñ8*Ñ1*Ñ**Ñ#*Ñ*Ñ*Ñ*Ñ*Ñ*Ñù)Ñò)Ñë)Ñä)ÑÝ)ÑÖ)ÑÏ)ÑÈ)ÑÁ)Ѻ)ѳ)Ѭ)Ñ¥)Ñž)Ñ—)Ñ)щ)Ñ‚)Ñ{)Ñt)Ñm)Ñf)Ñ_)ÑX)ÑQ)ÑJ)ÑC)Ñ<)Ñ5)Ñ.)Ñ')Ñ )Ñ)Ñ)Ñ )Ñ)Ñý(Ñö(Ñï(Ñè(Ñá(ÑÚ(ÑÓ(ÑÌ(ÑÅ(Ѿ(Ñ·(Ѱ(Ñ©(Ñ¢(Ñ›(Ñ”(Ñ(ц(Ñ(Ñx(Ñq(Ñj(Ñc(Ñ\(ÑU(ÑN(ÑG(Ñ@(Ñ9(Ñ2(Ñ+(Ñ$(Ñ(Ñ(Ñ(Ñ(Ñ(Ñú'Ñó'Ñì'Ñå'ÑÞ'Ñ×'ÑÐ'ÑÉ'ÑÂ'Ñ»'Ñ´'Ñ­'Ѧ'ÑŸ'ј'Ñ‘'ÑŠ'у'Ñ|'Ñu'Ñn'Ñg'Ñ`'ÑY'ÑR'ÑK'ÑD'Ñ='Ñ6'Ñ/'Ñ('Ñ!'Ñ'Ñ'Ñ 'Ñ'Ñþ&Ñ÷&Ñð&Ñé&Ñâ&ÑÛ&ÑÔ&ÑÍ&ÑÆ&Ñ¿&Ѹ&ѱ&Ѫ&Ñ£&Ñœ&Ñ•&ÑŽ&ч&Ñ€&Ñy&Ñr&Ñk&Ñd&Ñ]&ÑV&ÑO&ÑH&ÑA&Ñ:&Ñ3&Ñ,&Ñ%&Ñ&Ñ&Ñ&Ñ &Ñ&Ñû%Ñô%Ñí%Ñæ%Ñß%ÑØ%ÑÑ%ÑÊ%ÑÃ%Ѽ%ѵ%Ñ®%ѧ%Ñ %Ñ™%Ñ’%Ñ‹%Ñ„%Ñ}%Ñv%Ño%Ñh%Ña%ÑZ%ÑS%ÑL%ÑE%Ñ>%Ñ7%Ñ0%Ñ)%Ñ"%Ñ%Ñ%Ñ %Ñ%Ñÿ$Ñø$Ññ$Ñê$Ñã$ÑÜ$ÑÕ$ÑÎ$ÑÇ$ÑÀ$ѹ$Ѳ$Ñ«$Ѥ$Ñ$Ñ–$Ñ$ш$Ñ$Ñz$Ñs$Ñl$Ñe$Ñ^$ÑW$ÑP$ÑI$ÑB$Ñ;$Ñ4$Ñ-$Ñ&$Ñ$Ñ$Ñ$Ñ $Ñ$Ñü#Ñõ#Ñî#Ñç#Ñà#ÑÙ#ÑÒ#ÑË#ÑÄ#ѽ#Ѷ#ѯ#Ѩ#Ñ¡#Ñš#Ñ“#ÑŒ#Ñ…#Ñ~#Ñw#Ñp#Ñi#Ñb#Ñ[#ÑT#ÑM#ÑF#Ñ?#Ñ8#Ñ1#Ñ*#Ñ##Ñ#Ñ#Ñ#Ñ#Ñ#Ñù"Ñò"Ñë"Ñä"ÑÝ"ÑÖ"ÑÏ"ÑÈ"ÑÁ"Ѻ"ѳ"Ѭ"Ñ¥"Ñž"Ñ—"Ñ"щ"Ñ‚"Ñ{"Ñt"Ñm"Ñf"Ñ_"ÑX"ÑQ"ÑJ"ÑC"Ñ<"Ñ5"Ñ."Ñ'"Ñ "Ñ"Ñ"Ñ "Ñ"Ñý!Ñö!Ñï!Ñè!Ñá!ÑÚ!ÑÓ!ÑÌ!ÑÅ!Ѿ!Ñ·!Ѱ!Ñ©!Ñ¢!Ñ›!Ñ”!Ñ!ц!Ñ!Ñx!Ñq!Ñj!Ñc!Ñ\!ÑU!ÑN!ÑG!Ñ@!Ñ9!Ñ2!Ñ+!Ñ$!Ñ!Ñ!Ñ!Ñ!Ñ!Ñú Ñó Ñì Ñå ÑÞ Ñ× ÑÐ ÑÉ Ñ Ñ» Ñ´ Ñ­ Ѧ ÑŸ ј Ñ‘ ÑŠ у Ñ| Ñu Ñn Ñg Ñ` ÑY ÑR ÑK ÑD Ñ= Ñ6 Ñ/ Ñ( Ñ! Ñ Ñ Ñ Ñ ÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑù Ñò Ñë Ñä ÑÝ ÑÖ ÑÏ ÑÈ ÑÁ Ѻ ѳ Ѭ Ñ¥ Ñž Ñ— Ñ Ñ‰ Ñ‚ Ñ{ Ñt Ñm Ñf Ñ_ ÑX ÑQ ÑJ ÑC Ñ< Ñ5 Ñ. Ñ' Ñ Ñ Ñ Ñ Ñ Ñý Ñö Ñï Ñè Ñá ÑÚ ÑÓ ÑÌ ÑŠѾ Ñ· Ѱ Ñ© Ñ¢ Ñ› Ñ” Ñ Ñ† Ñ Ñx Ñq Ñj Ñc Ñ\ ÑU ÑN ÑG Ñ@ Ñ9 Ñ2 Ñ+ Ñ$ Ñ Ñ Ñ Ñ Ñ Ñú Ñó Ñì Ñå ÑÞ Ñ× ÑÐ ÑÉ Ñ Ñ» Ñ´ Ñ­ Ѧ ÑŸ ј Ñ‘ ÑŠ у Ñ| Ñu Ñn Ñg Ñ` ÑY ÑR ÑK ÑD Ñ= Ñ6 Ñ/ Ñ( Ñ! Ñ Ñ Ñ Ñ Ñþ Ñ÷ Ñð Ñé Ñâ ÑÛ ÑÔ ÑÍ ÑÆ Ñ¿ Ѹ ѱ Ѫ Ñ£ Ñœ Ñ• ÑŽ ч Ñ€ Ñy Ñr Ñk Ñd Ñ] ÑV ÑO ÑH ÑA Ñ: Ñ3 Ñ, Ñ% Ñ Ñ Ñ Ñ Ñ Ñû Ñô Ñí Ñæ Ñß ÑØ ÑÑ ÑÊ Ñà Ѽ ѵ Ñ® ѧ Ñ  Ñ™ Ñ’ Ñ‹ Ñ„ Ñ} Ñv Ño Ñh Ña ÑZ ÑS ÑL ÑE Ñ> Ñ7 Ñ0 Ñ) Ñ" Ñ Ñ Ñ Ñ ÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÿÐòÿÐëÿÐäÿÐÝÿÐÖÿÐÏÿÐÈÿÐÁÿкÿгÿЬÿÐ¥ÿОÿЗÿÐÿЉÿЂÿÐ{ÿÐtÿÐmÿÐfÿÐ_ÿÐXÿÐQÿÐJÿÐCÿÐ<ÿÐ5ÿÐ.ÿÐ'ÿÐ ÿÐÿÐÿÐ ÿÐÿÐýþÐöþÐïþÐèþÐáþÐÚþÐÓþÐÌþÐÅþоþзþаþЩþТþЛþДþÐþІþÐþÐxþÐqþÐjþÐcþÐ\þÐUþÐNþÐGþÐ@þÐ9þÐ2þÐ+þÐ$þÐþÐþÐþÐþÐþÐúýÐóýÐìýÐåýÐÞýÐ×ýÐÐýÐÉýÐÂýлýдýЭýЦýПýИýБýЊýЃýÐ|ýÐuýÐnýÐgýÐ`ýÐYýÐRýÐKýÐDýÐ=ýÐ6ýÐ/ýÐ(ýÐ!ýÐýÐýÐ ýÐýÐþüÐ÷üÐðüÐéüÐâüÐÛüÐÔüÐÍüÐÆüпüиüбüЪüУüМüЕüÐŽüЇüЀüÐyüÐrüÐküÐdüÐ]üÐVüÐOüÐHüÐAüÐ:üÐ3üÐ,üÐ%üÐüÐüÐüÐ üÐüÐûûÐôûÐíûÐæûÐßûÐØûÐÑûÐÊûÐÃûмûеûЮûЧûРûЙûÐ’ûЋûЄûÐ}ûÐvûÐoûÐhûÐaûÐZûÐSûÐLûÐEûÐ>ûÐ7ûÐ0ûÐ)ûÐ"ûÐûÐûÐ ûÐûÐÿúÐøúÐñúÐêúÐãúÐÜúÐÕúÐÎúÐÇúÐÀúйúвúЫúФúÐúЖúÐúЈúÐúÐzúÐsúÐlúÐeúÐ^úÐWúÐPúÐIúÐBúÐ;úÐ4úÐ-úÐ&úÐúÐúÐúÐ úÐúÐüùÐõùÐîùÐçùÐàùÐÙùÐÒùÐËùÐÄùнùжùЯùШùСùКùГùÐŒùÐ…ùÐ~ùÐwùÐpùÐiùÐbùÐ[ùÐTùÐMùÐFùÐ?ùÐ8ùÐ1ùÐ*ùÐ#ùÐùÐùÐùÐùÐùÐùøÐòøÐëøÐäøÐÝøÐÖøÐÏøÐÈøÐÁøÐºøÐ³øÐ¬øÐ¥øÐžøÐ—øÐøÐ‰øÐ‚øÐ{øÐtøÐmøÐføÐ_øÐXøÐQøÐJøÐCøÐ<øÐ5øÐ.øÐ'øÐ øÐøÐøÐ øÐøÐý÷Ðö÷Ðï÷Ðè÷Ðá÷ÐÚ÷ÐÓ÷ÐÌ÷ÐÅ÷о÷з÷а÷Щ÷Т÷Л÷Д÷Ð÷І÷Ð÷Ðx÷Ðq÷Ðj÷Ðc÷Ð\÷ÐU÷ÐN÷ÐG÷Ð@÷Ð9÷Ð2÷Ð+÷Ð$÷Ð÷Ð÷Ð÷Ð÷Ð÷ÐúöÐóöÐìöÐåöÐÞöÐ×öÐÐöÐÉöÐÂöлöдöЭöЦöПöИöБöЊöЃöÐ|öÐuöÐnöÐgöÐ`öÐYöÐRöÐKöÐDöÐ=öÐ6öÐ/öÐ(öÐ!öÐöÐöÐ öÐöÐþõÐ÷õÐðõÐéõÐâõÐÛõÐÔõÐÍõÐÆõпõиõбõЪõУõМõЕõÐŽõЇõЀõÐyõÐrõÐkõÐdõÐ]õÐVõÐOõÐHõÐAõÐ:õÐ3õÐ,õÐ%õÐõÐõÐõÐ õÐõÐûôÐôôÐíôÐæôÐßôÐØôÐÑôÐÊôÐÃôмôеôЮôЧôРôЙôÐ’ôЋôЄôÐ}ôÐvôÐoôÐhôÐaôÐZôÐSôÐLôÐEôÐ>ôÐ7ôÐ0ôÐ)ôÐ"ôÐôÐôÐ ôÐôÐÿóÐøóÐñóÐêóÐãóÐÜóÐÕóÐÎóÐÇóÐÀóйóвóЫóФóÐóЖóÐóЈóÐóÐzóÐsóÐlóÐeóÐ^óÐWóÐPóÐIóÐBóÐ;óÐ4óÐ-óÐ&óÐóÐóÐóÐ óÐóÐüòÐõòÐîòÐçòÐàòÐÙòÐÒòÐËòÐÄòнòжòЯòШòСòКòГòÐŒòÐ…òÐ~òÐwòÐpòÐiòÐbòÐ[òÐTòÐMòÐFòÐ?òÐ8òÐ1òÐ*òÐ#òÐòÐòÐòÐòÐòÐùñÐòñÐëñÐäñÐÝñÐÖñÐÏñÐÈñÐÁñкñгñЬñÐ¥ñОñЗñÐñЉñЂñÐ{ñÐtñÐmñÐfñÐ_ñÐXñÐQñÐJñÐCñÐ<ñÐ5ñÐ.ñÐ'ñÐ ñÐñÐñÐ ñÐñÐýðÐöðÐïðÐèðÐáðÐÚðÐÓðÐÌðÐÅðоðзðаðЩðТðЛðДðÐðІðÐðÐxðÐqðÐjðÐcðÐ\ðÐUðÐNðÐGðÐ@ðÐ9ðÐ2ðÐ+ðÐ$ðÐðÐðÐðÐðÐðÐúïÐóïÐìïÐåïÐÞïÐ×ïÐÐïÐÉïÐÂïлïдïЭïЦïПïИïБïЊïЃïÐ|ïÐuïÐnïÐgïÐ`ïÐYïÐRïÐKïÐDïÐ=ïÐ6ïÐ/ïÐ(ïÐ!ïÐïÐïÐ ïÐïÐþîÐ÷îÐðîÐéîÐâîÐÛîÐÔîÐÍîÐÆîпîиîбîЪîУîМîЕîÐŽîЇîЀîÐyîÐrîÐkîÐdîÐ]îÐVîÐOîÐHîÐAîÐ:îÐ3îÐ,îÐ%îÐîÐîÐîÐ îÐîÐûíÐôíÐííÐæíÐßíÐØíÐÑíÐÊíÐÃíмíеíЮíЧíРíЙíÐ’íЋíЄíÐ}íÐvíÐoíÐhíÐaíÐZíÐSíÐLíÐEíÐ>íÐ7íÐ0íÐ)íÐ"íÐíÐíÐ íÐíÐÿìÐøìÐñìÐêìÐãìÐÜìÐÕìÐÎìÐÇìÐÀìйìвìЫìФìÐìЖìÐìЈìÐìÐzìÐsìÐlìÐeìÐ^ìÐWìÐPìÐIìÐBìÐ;ìÐ4ìÐ-ìÐ&ìÐìÐìÐìÐ ìÐìÐüëÐõëÐîëÐçëÐàëÐÙëÐÒëÐËëÐÄëнëжëЯëШëСëКëГëÐŒëÐ…ëÐ~ëÐwëÐpëÐiëÐbëÐ[ëÐTëÐMëÐFëÐ?ëÐ8ëÐ1ëÐ*ëÐ#ëÐëÐëÐëÐëÐëÐùêÐòêÐëêÐäêÐÝêÐÖêÐÏêÐÈêÐÁêкêгêЬêÐ¥êОêЗêÐêЉêЂêÐ{êÐtêÐmêÐfêÐ_êÐXêÐQêÐJêÐCêÐ<êÐ5êÐ.êÐ'êÐ êÐêÐêÐ êÐêÐýéÐöéÐïéÐèéÐáéÐÚéÐÓéÐÌéÐÅéоéзéаéЩéТéЛéДéÐéІéÐéÐxéÐqéÐjéÐcéÐ\éÐUéÐNéÐGéÐ@éÐ9éÐ2éÐ+éÐ$éÐéÐéÐéÐéÐéÐúèÐóèÐìèÐåèÐÞèÐ×èÐÐèÐÉèÐÂèлèдèЭèЦèПèИèБèЊèЃèÐ|èÐuèÐnèÐgèÐ`èÐYèÐRèÐKèÐDèÐ=èÐ6èÐ/èÐ(èÐ!èÐèÐèÐ èÐèÐþçÐ÷çÐðçÐéçÐâçÐÛçÐÔçÐÍçÐÆçпçиçбçЪçУçМçЕçÐŽçЇçЀçÐyçÐrçÐkçÐdçÐ]çÐVçÐOçÐHçÐAçÐ:çÐ3çÐ,çÐ%çÐçÐçÐçÐ çÐçÐûæÐôæÐíæÐææÐßæÐØæÐÑæÐÊæÐÃæÐ¼æÐµæÐ®æÐ§æÐ æÐ™æÐ’æÐ‹æÐ„æÐ}æÐvæÐoæÐhæÐaæÐZæÐSæÐLæÐEæÐ>æÐ7æÐ0æÐ)æÐ"æÐæÐæÐ æÐæÐÿåÐøåÐñåÐêåÐãåÐÜåÐÕåÐÎåÐÇåÐÀåйåвåЫåФåÐåЖåÐåЈåÐåÐzåÐsåÐlåÐeåÐ^åÐWåÐPåÐIåÐBåÐ;åÐ4åÐ-åÐ&åÐåÐåÐåÐ åÐåÐüäÐõäÐîäÐçäÐàäÐÙäÐÒäÐËäÐÄäнäжäЯäШäСäКäГäÐŒäÐ…äÐ~äÐwäÐpäÐiäÐbäÐ[äÐTäÐMäÐFäÐ?äÐ8äÐ1äÐ*äÐ#äÐäÐäÐäÐäÐäÐùãÐòãÐëãÐäãÐÝãÐÖãÐÏãÐÈãÐÁãкãгãЬãÐ¥ãОãЗãÐãЉãЂãÐ{ãÐtãÐmãÐfãÐ_ãÐXãÐQãÐJãÐCãÐ<ãÐ5ãÐ.ãÐ'ãÐ ãÐãÐãÐ ãÐãÐýâÐöâÐïâÐèâÐáâÐÚâÐÓâÐÌâÐÅâоâзâаâЩâТâЛâДâÐâІâÐâÐxâÐqâÐjâÐcâÐ\âÐUâÐNâÐGâÐ@âÐ9âÐ2âÐ+âÐ$âÐâÐâÐâÐâÐâÐúáÐóáÐìáÐåáÐÞáÐ×áÐÐáÐÉáÐÂáлáдáЭáЦáПáИáБáЊáЃáÐ|áÐuáÐnáÐgáÐ`áÐYáÐRáÐKáÐDáÐ=áÐ6áÐ/áÐ(áÐ!áÐáÐáÐ áÐáÐþàÐ÷àÐðàÐéàÐâàÐÛàÐÔàÐÍàÐÆàпàиàбàЪàУàМàЕàÐŽàЇàЀàÐyàÐràÐkàÐdàÐ]àÐVàÐOàÐHàÐAàÐ:àÐ3àÐ,àÐ%àÐàÐàÐàÐ àÐàÐûßÐôßÐíßÐæßÐßßÐØßÐÑßÐÊßÐÃßмßеßЮßЧßРßЙßÐ’ßЋßЄßÐ}ßÐvßÐoßÐhßÐaßÐZßÐSßÐLßÐEßÐ>ßÐ7ßÐ0ßÐ)ßÐ"ßÐßÐßÐ ßÐßÐÿÞÐøÞÐñÞÐêÞÐãÞÐÜÞÐÕÞÐÎÞÐÇÞÐÀÞйÞвÞЫÞФÞÐÞЖÞÐÞЈÞÐÞÐzÞÐsÞÐlÞÐeÞÐ^ÞÐWÞÐPÞÐIÞÐBÞÐ;ÞÐ4ÞÐ-ÞÐ&ÞÐÞÐÞÐÞÐ ÞÐÞÐüÝÐõÝÐîÝÐçÝÐàÝÐÙÝÐÒÝÐËÝÐÄÝнÝжÝЯÝШÝСÝКÝГÝÐŒÝÐ…ÝÐ~ÝÐwÝÐpÝÐiÝÐbÝÐ[ÝÐTÝÐMÝÐFÝÐ?ÝÐ8ÝÐ1ÝÐ*ÝÐ#ÝÐÝÐÝÐÝÐÝÐÝÐùÜÐòÜÐëÜÐäÜÐÝÜÐÖÜÐÏÜÐÈÜÐÁÜкÜгÜЬÜÐ¥ÜОÜЗÜÐÜЉÜЂÜÐ{ÜÐtÜÐmÜÐfÜÐ_ÜÐXÜÐQÜÐJÜÐCÜÐ<ÜÐ5ÜÐ.ÜÐ'ÜÐ ÜÐÜÐÜÐ ÜÐÜÐýÛÐöÛÐïÛÐèÛÐáÛÐÚÛÐÓÛÐÌÛÐÅÛоÛзÛаÛЩÛТÛЛÛДÛÐÛІÛÐÛÐxÛÐqÛÐjÛÐcÛÐ\ÛÐUÛÐNÛÐGÛÐ@ÛÐ9ÛÐ2ÛÐ+ÛÐ$ÛÐÛÐÛÐÛÐÛÐÛÐúÚÐóÚÐìÚÐåÚÐÞÚÐ×ÚÐÐÚÐÉÚÐÂÚлÚдÚЭÚЦÚПÚИÚБÚЊÚЃÚÐ|ÚÐuÚÐnÚÐgÚÐ`ÚÐYÚÐRÚÐKÚÐDÚÐ=ÚÐ6ÚÐ/ÚÐ(ÚÐ!ÚÐÚÐÚÐ ÚÐÚÐþÙÐ÷ÙÐðÙÐéÙÐâÙÐÛÙÐÔÙÐÍÙÐÆÙпÙиÙбÙЪÙУÙМÙЕÙÐŽÙЇÙЀÙÐyÙÐrÙÐkÙÐdÙÐ]ÙÐVÙÐOÙÐHÙÐAÙÐ:ÙÐ3ÙÐ,ÙÐ%ÙÐÙÐÙÐÙÐ ÙÐÙÐûØÐôØÐíØÐæØÐߨÐØØÐÑØÐÊØÐÃØÐ¼ØÐµØÐ®ØÐ§ØÐ ØÐ™ØÐ’ØÐ‹ØÐ„ØÐ}ØÐvØÐoØÐhØÐaØÐZØÐSØÐLØÐEØÐ>ØÐ7ØÐ0ØÐ)ØÐ"ØÐØÐØÐ ØÐØÐÿ×Ðø×Ðñ×Ðê×Ðã×ÐÜ×ÐÕ×ÐÎ×ÐÇ×ÐÀ×й×в×Ы×Ф×Ð×Ж×Ð×Ј×Ð×Ðz×Ðs×Ðl×Ðe×Ð^×ÐW×ÐP×ÐI×ÐB×Ð;×Ð4×Ð-×Ð&×Ð×Ð×Ð×Ð ×Ð×ÐüÖÐõÖÐîÖÐçÖÐàÖÐÙÖÐÒÖÐËÖÐÄÖнÖжÖЯÖШÖСÖКÖГÖÐŒÖÐ…ÖÐ~ÖÐwÖÐpÖÐiÖÐbÖÐ[ÖÐTÖÐMÖÐFÖÐ?ÖÐ8ÖÐ1ÖÐ*ÖÐ#ÖÐÖÐÖÐÖÐÖÐÖÐùÕÐòÕÐëÕÐäÕÐÝÕÐÖÕÐÏÕÐÈÕÐÁÕкÕгÕЬÕÐ¥ÕОÕЗÕÐÕЉÕЂÕÐ{ÕÐtÕÐmÕÐfÕÐ_ÕÐXÕÐQÕÐJÕÐCÕÐ<ÕÐ5ÕÐ.ÕÐ'ÕÐ ÕÐÕÐÕÐ ÕÐÕÐýÔÐöÔÐïÔÐèÔÐáÔÐÚÔÐÓÔÐÌÔÐÅÔоÔзÔаÔЩÔТÔЛÔДÔÐÔІÔÐÔÐxÔÐqÔÐjÔÐcÔÐ\ÔÐUÔÐNÔÐGÔÐ@ÔÐ9ÔÐ2ÔÐ+ÔÐ$ÔÐÔÐÔÐÔÐÔÐÔÐúÓÐóÓÐìÓÐåÓÐÞÓÐ×ÓÐÐÓÐÉÓÐÂÓлÓдÓЭÓЦÓПÓИÓБÓЊÓЃÓÐ|ÓÐuÓÐnÓÐgÓÐ`ÓÐYÓÐRÓÐKÓÐDÓÐ=ÓÐ6ÓÐ/ÓÐ(ÓÐ!ÓÐÓÐÓÐ ÓÐÓÐþÒÐ÷ÒÐðÒÐéÒÐâÒÐÛÒÐÔÒÐÍÒÐÆÒпÒиÒбÒЪÒУÒМÒЕÒÐŽÒЇÒЀÒÐyÒÐrÒÐkÒÐdÒÐ]ÒÐVÒÐOÒÐHÒÐAÒÐ:ÒÐ3ÒÐ,ÒÐ%ÒÐÒÐÒÐÒÐ ÒÐÒÐûÑÐôÑÐíÑÐæÑÐßÑÐØÑÐÑÑÐÊÑÐÃÑмÑеÑЮÑЧÑРÑЙÑÐ’ÑЋÑЄÑÐ}ÑÐvÑÐoÑÐhÑÐaÑÐZÑÐSÑÐLÑÐEÑÐ>ÑÐ7ÑÐ0ÑÐ)ÑÐ"ÑÐÑÐÑÐ ÑÐÑÐÿÐÐøÐÐñÐÐêÐÐãÐÐÜÐÐÕÐÐÎÐÐÇÐÐÀÐйÐвÐЫÐФÐÐÐЖÐÐÐЈÐÐÐÐzÐÐsÐÐlÐÐeÐÐ^ÐÐWÐÐPÐÐIÐÐBÐÐ;ÐÐ4ÐÐ-ÐÐ&ÐÐÐÐÐÐÐÐ ÐÐÐÐüÏÐõÏÐîÏÐçÏÐàÏÐÙÏÐÒÏÐËÏÐÄÏнÏжÏЯÏШÏСÏКÏГÏÐŒÏÐ…ÏÐ~ÏÐwÏÐpÏÐiÏÐbÏÐ[ÏÐTÏÐMÏÐFÏÐ?ÏÐ8ÏÐ1ÏÐ*ÏÐ#ÏÐÏÐÏÐÏÐÏÐÏÐùÎÐòÎÐëÎÐäÎÐÝÎÐÖÎÐÏÎÐÈÎÐÁÎкÎгÎЬÎÐ¥ÎОÎЗÎÐÎЉÎЂÎÐ{ÎÐtÎÐmÎÐfÎÐ_ÎÐXÎÐQÎÐJÎÐCÎÐ<ÎÐ5ÎÐ.ÎÐ'ÎÐ ÎÐÎÐÎÐ ÎÐÎÐýÍÐöÍÐïÍÐèÍÐáÍÐÚÍÐÓÍÐÌÍÐÅÍоÍзÍаÍЩÍТÍЛÍДÍÐÍІÍÐÍÐxÍÐqÍÐjÍÐcÍÐ\ÍÐUÍÐNÍÐGÍÐ@ÍÐ9ÍÐ2ÍÐ+ÍÐ$ÍÐÍÐÍÐÍÐÍÐÍÐúÌÐóÌÐìÌÐåÌÐÞÌÐ×ÌÐÐÌÐÉÌÐÂÌлÌдÌЭÌЦÌПÌИÌБÌЊÌЃÌÐ|ÌÐuÌÐnÌÐgÌÐ`ÌÐYÌÐRÌÐKÌÐDÌÐ=ÌÐ6ÌÐ/ÌÐ(ÌÐ!ÌÐÌÐÌÐ ÌÐÌÐþËÐ÷ËÐðËÐéËÐâËÐÛËÐÔËÐÍËÐÆËпËиËбËЪËУËМËЕËÐŽËЇËЀËÐyËÐrËÐkËÐdËÐ]ËÐVËÐOËÐHËÐAËÐ:ËÐ3ËÐ,ËÐ%ËÐËÐËÐËÐ ËÐËÐûÊÐôÊÐíÊÐæÊÐßÊÐØÊÐÑÊÐÊÊÐÃÊмÊеÊЮÊЧÊРÊЙÊÐ’ÊЋÊЄÊÐ}ÊÐvÊÐoÊÐhÊÐaÊÐZÊÐSÊÐLÊÐEÊÐ>ÊÐ7ÊÐ0ÊÐ)ÊÐ"ÊÐÊÐÊÐ ÊÐÊÐÿÉÐøÉÐñÉÐêÉÐãÉÐÜÉÐÕÉÐÎÉÐÇÉÐÀÉйÉвÉЫÉФÉÐÉЖÉÐÉЈÉÐÉÐzÉÐsÉÐlÉÐeÉÐ^ÉÐWÉÐPÉÐIÉÐBÉÐ;ÉÐ4ÉÐ-ÉÐ&ÉÐÉÐÉÐÉÐ ÉÐÉÐüÈÐõÈÐîÈÐçÈÐàÈÐÙÈÐÒÈÐËÈÐÄÈнÈжÈЯÈШÈСÈКÈГÈÐŒÈÐ…ÈÐ~ÈÐwÈÐpÈÐiÈÐbÈÐ[ÈÐTÈÐMÈÐFÈÐ?ÈÐ8ÈÐ1ÈÐ*ÈÐ#ÈÐÈÐÈÐÈÐÈÐÈÐùÇÐòÇÐëÇÐäÇÐÝÇÐÖÇÐÏÇÐÈÇÐÁÇкÇгÇЬÇÐ¥ÇОÇЗÇÐÇЉÇЂÇÐ{ÇÐtÇÐmÇÐfÇÐ_ÇÐXÇÐQÇÐJÇÐCÇÐ<ÇÐ5ÇÐ.ÇÐ'ÇÐ ÇÐÇÐÇÐ ÇÐÇÐýÆÐöÆÐïÆÐèÆÐáÆÐÚÆÐÓÆÐÌÆÐÅÆÐ¾ÆÐ·ÆÐ°ÆÐ©ÆÐ¢ÆÐ›ÆÐ”ÆÐÆÐ†ÆÐÆÐxÆÐqÆÐjÆÐcÆÐ\ÆÐUÆÐNÆÐGÆÐ@ÆÐ9ÆÐ2ÆÐ+ÆÐ$ÆÐÆÐÆÐÆÐÆÐÆÐúÅÐóÅÐìÅÐåÅÐÞÅÐ×ÅÐÐÅÐÉÅÐÂÅлÅдÅЭÅЦÅПÅИÅБÅЊÅЃÅÐ|ÅÐuÅÐnÅÐgÅÐ`ÅÐYÅÐRÅÐKÅÐDÅÐ=ÅÐ6ÅÐ/ÅÐ(ÅÐ!ÅÐÅÐÅÐ ÅÐÅÐþÄÐ÷ÄÐðÄÐéÄÐâÄÐÛÄÐÔÄÐÍÄÐÆÄпÄиÄбÄЪÄУÄМÄЕÄÐŽÄЇÄЀÄÐyÄÐrÄÐkÄÐdÄÐ]ÄÐVÄÐOÄÐHÄÐAÄÐ:ÄÐ3ÄÐ,ÄÐ%ÄÐÄÐÄÐÄÐ ÄÐÄÐûÃÐôÃÐíÃÐæÃÐßÃÐØÃÐÑÃÐÊÃÐÃÃмÃеÃЮÃЧÃРÃЙÃÐ’ÃЋÃЄÃÐ}ÃÐvÃÐoÃÐhÃÐaÃÐZÃÐSÃÐLÃÐEÃÐ>ÃÐ7ÃÐ0ÃÐ)ÃÐ"ÃÐÃÐÃÐ ÃÐÃÐÿÂÐøÂÐñÂÐêÂÐãÂÐÜÂÐÕÂÐÎÂÐÇÂÐÀÂйÂвÂЫÂФÂÐÂЖÂÐÂЈÂÐÂÐzÂÐsÂÐlÂÐeÂÐ^ÂÐWÂÐPÂÐIÂÐBÂÐ;ÂÐ4ÂÐ-ÂÐ&ÂÐÂÐÂÐÂÐ ÂÐÂÐüÁÐõÁÐîÁÐçÁÐàÁÐÙÁÐÒÁÐËÁÐÄÁнÁжÁЯÁШÁСÁКÁГÁÐŒÁÐ…ÁÐ~ÁÐwÁÐpÁÐiÁÐbÁÐ[ÁÐTÁÐMÁÐFÁÐ?ÁÐ8ÁÐ1ÁÐ*ÁÐ#ÁÐÁÐÁÐÁÐÁÐÁÐùÀÐòÀÐëÀÐäÀÐÝÀÐÖÀÐÏÀÐÈÀÐÁÀкÀгÀЬÀÐ¥ÀОÀЗÀÐÀЉÀЂÀÐ{ÀÐtÀÐmÀÐfÀÐ_ÀÐXÀÐQÀÐJÀÐCÀÐ<ÀÐ5ÀÐ.ÀÐ'ÀÐ ÀÐÀÐÀÐ ÀÐÀÐý¿Ðö¿Ðï¿Ðè¿Ðá¿ÐÚ¿ÐÓ¿ÐÌ¿Ðſо¿Ð·¿Ð°¿Ð©¿Ð¢¿Ð›¿Ð”¿Ð¿Ð†¿Ð¿Ðx¿Ðq¿Ðj¿Ðc¿Ð\¿ÐU¿ÐN¿ÐG¿Ð@¿Ð9¿Ð2¿Ð+¿Ð$¿Ð¿Ð¿Ð¿Ð¿Ð¿Ðú¾Ðó¾Ðì¾Ðå¾ÐÞ¾Ð×¾ÐоÐɾол¾Ð´¾Ð­¾Ð¦¾ÐŸ¾Ð˜¾Ð‘¾ÐоЃ¾Ð|¾Ðu¾Ðn¾Ðg¾Ð`¾ÐY¾ÐR¾ÐK¾ÐD¾Ð=¾Ð6¾Ð/¾Ð(¾Ð!¾Ð¾Ð¾Ð ¾Ð¾Ðþ½Ð÷½Ðð½Ðé½Ðâ½ÐÛ½ÐÔ½ÐͽÐƽп½Ð¸½Ð±½Ðª½Ð£½Ðœ½Ð•½Ð޽Ї½Ð€½Ðy½Ðr½Ðk½Ðd½Ð]½ÐV½ÐO½ÐH½ÐA½Ð:½Ð3½Ð,½Ð%½Ð½Ð½Ð½Ð ½Ð½Ðû¼Ðô¼Ðí¼Ðæ¼Ðß¼ÐؼÐѼÐʼÐüм¼Ðµ¼Ð®¼Ð§¼Ð ¼Ð™¼Ð’¼Ð‹¼Ð„¼Ð}¼Ðv¼Ðo¼Ðh¼Ða¼ÐZ¼ÐS¼ÐL¼ÐE¼Ð>¼Ð7¼Ð0¼Ð)¼Ð"¼Ð¼Ð¼Ð ¼Ð¼Ðÿ»Ðø»Ðñ»Ðê»Ðã»ÐÜ»ÐÕ»ÐλÐÇ»ÐÀ»Ð¹»Ð²»Ð«»Ð¤»Ð»Ð–»Ð»Ðˆ»Ð»Ðz»Ðs»Ðl»Ðe»Ð^»ÐW»ÐP»ÐI»ÐB»Ð;»Ð4»Ð-»Ð&»Ð»Ð»Ð»Ð »Ð»ÐüºÐõºÐîºÐçºÐàºÐÙºÐÒºÐ˺ÐĺнºÐ¶ºÐ¯ºÐ¨ºÐ¡ºÐšºÐ“ºÐŒºÐ…ºÐ~ºÐwºÐpºÐiºÐbºÐ[ºÐTºÐMºÐFºÐ?ºÐ8ºÐ1ºÐ*ºÐ#ºÐºÐºÐºÐºÐºÐù¹Ðò¹Ðë¹Ðä¹ÐݹÐÖ¹ÐϹÐȹÐÁ¹Ðº¹Ð³¹Ð¬¹Ð¥¹Ðž¹Ð—¹Ð¹Ð‰¹Ð‚¹Ð{¹Ðt¹Ðm¹Ðf¹Ð_¹ÐX¹ÐQ¹ÐJ¹ÐC¹Ð<¹Ð5¹Ð.¹Ð'¹Ð ¹Ð¹Ð¹Ð ¹Ð¹Ðý¸Ðö¸Ðï¸Ðè¸Ðá¸ÐÚ¸ÐÓ¸Ð̸По¸Ð·¸Ð°¸Ð©¸Ð¢¸Ð›¸Ð”¸Ð¸Ð†¸Ð¸Ðx¸Ðq¸Ðj¸Ðc¸Ð\¸ÐU¸ÐN¸ÐG¸Ð@¸Ð9¸Ð2¸Ð+¸Ð$¸Ð¸Ð¸Ð¸Ð¸Ð¸Ðú·Ðó·Ðì·Ðå·ÐÞ·Ð×·ÐзÐɷзл·Ð´·Ð­·Ð¦·ÐŸ·Ð˜·Ð‘·ÐŠ·Ðƒ·Ð|·Ðu·Ðn·Ðg·Ð`·ÐY·ÐR·ÐK·ÐD·Ð=·Ð6·Ð/·Ð(·Ð!·Ð·Ð·Ð ·Ð·Ðþ¶Ð÷¶Ðð¶Ðé¶Ðâ¶ÐÛ¶ÐÔ¶ÐͶÐƶп¶Ð¸¶Ð±¶Ðª¶Ð£¶Ðœ¶Ð•¶Ð޶Ї¶Ð€¶Ðy¶Ðr¶Ðk¶Ðd¶Ð]¶ÐV¶ÐO¶ÐH¶ÐA¶Ð:¶Ð3¶Ð,¶Ð%¶Ð¶Ð¶Ð¶Ð ¶Ð¶ÐûµÐôµÐíµÐæµÐßµÐصÐѵÐʵÐõмµÐµµÐ®µÐ§µÐ µÐ™µÐ’µÐ‹µÐ„µÐ}µÐvµÐoµÐhµÐaµÐZµÐSµÐLµÐEµÐ>µÐ7µÐ0µÐ)µÐ"µÐµÐµÐ µÐµÐÿ´Ðø´Ðñ´Ðê´Ðã´ÐÜ´ÐÕ´ÐδÐÇ´ÐÀ´Ð¹´Ð²´Ð«´Ð¤´Ð´Ð–´Ð´Ðˆ´Ð´Ðz´Ðs´Ðl´Ðe´Ð^´ÐW´ÐP´ÐI´ÐB´Ð;´Ð4´Ð-´Ð&´Ð´Ð´Ð´Ð ´Ð´Ðü³Ðõ³Ðî³Ðç³Ðà³ÐÙ³ÐÒ³Ð˳Ðijн³Ð¶³Ð¯³Ð¨³Ð¡³Ðš³Ð“³ÐŒ³Ð…³Ð~³Ðw³Ðp³Ði³Ðb³Ð[³ÐT³ÐM³ÐF³Ð?³Ð8³Ð1³Ð*³Ð#³Ð³Ð³Ð³Ð³Ð³Ðù²Ðò²Ðë²Ðä²ÐݲÐÖ²ÐϲÐȲÐÁ²Ðº²Ð³²Ð¬²Ð¥²Ðž²Ð—²Ð²Ð‰²Ð‚²Ð{²Ðt²Ðm²Ðf²Ð_²ÐX²ÐQ²ÐJ²ÐC²Ð<²Ð5²Ð.²Ð'²Ð ²Ð²Ð²Ð ²Ð²Ðý±Ðö±Ðï±Ðè±Ðá±ÐÚ±ÐÓ±Ð̱Ðűо±Ð·±Ð°±Ð©±Ð¢±Ð›±Ð”±Ð±Ð†±Ð±Ðx±Ðq±Ðj±Ðc±Ð\±ÐU±ÐN±ÐG±Ð@±Ð9±Ð2±Ð+±Ð$±Ð±Ð±Ð±Ð±Ð±Ðú°Ðó°Ðì°Ðå°ÐÞ°Ð×°ÐаÐɰал°Ð´°Ð­°Ð¦°ÐŸ°Ð˜°Ð‘°ÐаЃ°Ð|°Ðu°Ðn°Ðg°Ð`°ÐY°ÐR°ÐK°ÐD°Ð=°Ð6°Ð/°Ð(°Ð!°Ð°Ð°Ð °Ð°Ðþ¯Ð÷¯Ðð¯Ðé¯Ðâ¯ÐÛ¯ÐÔ¯ÐͯÐƯп¯Ð¸¯Ð±¯Ðª¯Ð£¯Ðœ¯Ð•¯ÐޝЇ¯Ð€¯Ðy¯Ðr¯Ðk¯Ðd¯Ð]¯ÐV¯ÐO¯ÐH¯ÐA¯Ð:¯Ð3¯Ð,¯Ð%¯Ð¯Ð¯Ð¯Ð ¯Ð¯Ðû®Ðô®Ðí®Ðæ®Ðß®ÐØ®ÐÑ®ÐÊ®Ðîм®Ðµ®Ð®®Ð§®Ð ®Ð™®Ð’®Ð‹®Ð„®Ð}®Ðv®Ðo®Ðh®Ða®ÐZ®ÐS®ÐL®ÐE®Ð>®Ð7®Ð0®Ð)®Ð"®Ð®Ð®Ð ®Ð®Ðÿ­Ðø­Ðñ­Ðê­Ðã­ÐÜ­ÐÕ­ÐέÐÇ­ÐÀ­Ð¹­Ð²­Ð«­Ð¤­Ð­Ð–­Ð­Ðˆ­Ð­Ðz­Ðs­Ðl­Ðe­Ð^­ÐW­ÐP­ÐI­ÐB­Ð;­Ð4­Ð-­Ð&­Ð­Ð­Ð­Ð ­Ð­Ðü¬Ðõ¬Ðî¬Ðç¬Ðà¬ÐÙ¬ÐÒ¬ÐˬÐĬн¬Ð¶¬Ð¯¬Ð¨¬Ð¡¬Ðš¬Ð“¬ÐŒ¬Ð…¬Ð~¬Ðw¬Ðp¬Ði¬Ðb¬Ð[¬ÐT¬ÐM¬ÐF¬Ð?¬Ð8¬Ð1¬Ð*¬Ð#¬Ð¬Ð¬Ð¬Ð¬Ð¬Ðù«Ðò«Ðë«Ðä«ÐÝ«ÐÖ«ÐÏ«ÐÈ«ÐÁ«Ðº«Ð³«Ð¬«Ð¥«Ðž«Ð—«Ð«Ð‰«Ð‚«Ð{«Ðt«Ðm«Ðf«Ð_«ÐX«ÐQ«ÐJ«ÐC«Ð<«Ð5«Ð.«Ð'«Ð «Ð«Ð«Ð «Ð«ÐýªÐöªÐïªÐèªÐáªÐÚªÐÓªÐ̪ÐŪоªÐ·ªÐ°ªÐ©ªÐ¢ªÐ›ªÐ”ªÐªÐ†ªÐªÐxªÐqªÐjªÐcªÐ\ªÐUªÐNªÐGªÐ@ªÐ9ªÐ2ªÐ+ªÐ$ªÐªÐªÐªÐªÐªÐú©Ðó©Ðì©Ðå©ÐÞ©ÐשÐЩÐɩЩл©Ð´©Ð­©Ð¦©ÐŸ©Ð˜©Ð‘©ÐŠ©Ðƒ©Ð|©Ðu©Ðn©Ðg©Ð`©ÐY©ÐR©ÐK©ÐD©Ð=©Ð6©Ð/©Ð(©Ð!©Ð©Ð©Ð ©Ð©Ðþ¨Ð÷¨Ðð¨Ðé¨Ðâ¨ÐÛ¨ÐÔ¨ÐͨÐƨп¨Ð¸¨Ð±¨Ðª¨Ð£¨Ðœ¨Ð•¨ÐލЇ¨Ð€¨Ðy¨Ðr¨Ðk¨Ðd¨Ð]¨ÐV¨ÐO¨ÐH¨ÐA¨Ð:¨Ð3¨Ð,¨Ð%¨Ð¨Ð¨Ð¨Ð ¨Ð¨Ðû§Ðô§Ðí§Ðæ§Ðß§ÐاÐѧÐʧÐçм§Ðµ§Ð®§Ð§§Ð §Ð™§Ð’§Ð‹§Ð„§Ð}§Ðv§Ðo§Ðh§Ða§ÐZ§ÐS§ÐL§ÐE§Ð>§Ð7§Ð0§Ð)§Ð"§Ð§Ð§Ð §Ð§Ðÿ¦Ðø¦Ðñ¦Ðê¦Ðã¦ÐܦÐÕ¦ÐΦÐǦÐÀ¦Ð¹¦Ð²¦Ð«¦Ð¤¦Ð¦Ð–¦Ð¦Ðˆ¦Ð¦Ðz¦Ðs¦Ðl¦Ðe¦Ð^¦ÐW¦ÐP¦ÐI¦ÐB¦Ð;¦Ð4¦Ð-¦Ð&¦Ð¦Ð¦Ð¦Ð ¦Ð¦Ðü¥Ðõ¥Ðî¥Ðç¥Ðà¥ÐÙ¥ÐÒ¥ÐË¥Ðĥн¥Ð¶¥Ð¯¥Ð¨¥Ð¡¥Ðš¥Ð“¥ÐŒ¥Ð…¥Ð~¥Ðw¥Ðp¥Ði¥Ðb¥Ð[¥ÐT¥ÐM¥ÐF¥Ð?¥Ð8¥Ð1¥Ð*¥Ð#¥Ð¥Ð¥Ð¥Ð¥Ð¥Ðù¤Ðò¤Ðë¤Ðä¤ÐݤÐÖ¤ÐϤÐȤÐÁ¤Ðº¤Ð³¤Ð¬¤Ð¥¤Ðž¤Ð—¤Ð¤Ð‰¤Ð‚¤Ð{¤Ðt¤Ðm¤Ðf¤Ð_¤ÐX¤ÐQ¤ÐJ¤ÐC¤Ð<¤Ð5¤Ð.¤Ð'¤Ð ¤Ð¤Ð¤Ð ¤Ð¤Ðý£Ðö£Ðï£Ðè£Ðá£ÐÚ£ÐÓ£ÐÌ£Ðţо£Ð·£Ð°£Ð©£Ð¢£Ð›£Ð”£Ð£Ð†£Ð£Ðx£Ðq£Ðj£Ðc£Ð\£ÐU£ÐN£ÐG£Ð@£Ð9£Ð2£Ð+£Ð$£Ð£Ð£Ð£Ð£Ð£Ðú¢Ðó¢Ðì¢Ðå¢ÐÞ¢Ð×¢ÐТÐɢТл¢Ð´¢Ð­¢Ð¦¢ÐŸ¢Ð˜¢Ð‘¢ÐŠ¢Ðƒ¢Ð|¢Ðu¢Ðn¢Ðg¢Ð`¢ÐY¢ÐR¢ÐK¢ÐD¢Ð=¢Ð6¢Ð/¢Ð(¢Ð!¢Ð¢Ð¢Ð ¢Ð¢Ðþ¡Ð÷¡Ðð¡Ðé¡Ðâ¡ÐÛ¡ÐÔ¡ÐÍ¡ÐÆ¡Ð¿¡Ð¸¡Ð±¡Ðª¡Ð£¡Ðœ¡Ð•¡ÐŽ¡Ð‡¡Ð€¡Ðy¡Ðr¡Ðk¡Ðd¡Ð]¡ÐV¡ÐO¡ÐH¡ÐA¡Ð:¡Ð3¡Ð,¡Ð%¡Ð¡Ð¡Ð¡Ð ¡Ð¡Ðû Ðô Ðí Ðæ Ðß ÐØ ÐÑ ÐÊ Ðàм Ðµ Ð® Ð§ Ð  Ð™ Ð’ Ð‹ Ð„ Ð} Ðv Ðo Ðh Ða ÐZ ÐS ÐL ÐE Ð> Ð7 Ð0 Ð) Ð" Ð Ð Ð  Ð ÐÿŸÐøŸÐñŸÐêŸÐãŸÐÜŸÐÕŸÐΟÐÇŸÐÀŸÐ¹ŸÐ²ŸÐ«ŸÐ¤ŸÐŸÐ–ŸÐŸÐˆŸÐŸÐzŸÐsŸÐlŸÐeŸÐ^ŸÐWŸÐPŸÐIŸÐBŸÐ;ŸÐ4ŸÐ-ŸÐ&ŸÐŸÐŸÐŸÐ ŸÐŸÐüžÐõžÐîžÐçžÐàžÐÙžÐÒžÐËžÐĞнžÐ¶žÐ¯žÐ¨žÐ¡žÐšžÐ“žÐŒžÐ…žÐ~žÐwžÐpžÐižÐbžÐ[žÐTžÐMžÐFžÐ?žÐ8žÐ1žÐ*žÐ#žÐžÐžÐžÐžÐžÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýœÐöœÐïœÐèœÐáœÐÚœÐÓœÐÌœÐŜоœÐ·œÐ°œÐ©œÐ¢œÐ›œÐ”œÐœÐ†œÐœÐxœÐqœÐjœÐcœÐ\œÐUœÐNœÐGœÐ@œÐ9œÐ2œÐ+œÐ$œÐœÐœÐœÐœÐœÐú›Ðó›Ðì›Ðå›ÐÞ›Ð×›ÐЛÐɛЛл›Ð´›Ð­›Ð¦›ÐŸ›Ð˜›Ð‘›ÐŠ›Ðƒ›Ð|›Ðu›Ðn›Ðg›Ð`›ÐY›ÐR›ÐK›ÐD›Ð=›Ð6›Ð/›Ð(›Ð!›Ð›Ð›Ð ›Ð›ÐþšÐ÷šÐðšÐéšÐâšÐÛšÐÔšÐÍšÐÆšÐ¿šÐ¸šÐ±šÐªšÐ£šÐœšÐ•šÐŽšÐ‡šÐ€šÐyšÐršÐkšÐdšÐ]šÐVšÐOšÐHšÐAšÐ:šÐ3šÐ,šÐ%šÐšÐšÐšÐ šÐšÐû™Ðô™Ðí™Ðæ™Ðß™ÐØ™ÐÑ™ÐÊ™ÐÙм™Ðµ™Ð®™Ð§™Ð ™Ð™™Ð’™Ð‹™Ð„™Ð}™Ðv™Ðo™Ðh™Ða™ÐZ™ÐS™ÐL™ÐE™Ð>™Ð7™Ð0™Ð)™Ð"™Ð™Ð™Ð ™Ð™Ðÿ˜Ðø˜Ðñ˜Ðê˜Ðã˜ÐܘÐÕ˜ÐΘÐǘÐÀ˜Ð¹˜Ð²˜Ð«˜Ð¤˜Ð˜Ð–˜Ð˜Ðˆ˜Ð˜Ðz˜Ðs˜Ðl˜Ðe˜Ð^˜ÐW˜ÐP˜ÐI˜ÐB˜Ð;˜Ð4˜Ð-˜Ð&˜Ð˜Ð˜Ð˜Ð ˜Ð˜Ðü—Ðõ—Ðî—Ðç—Ðà—ÐÙ—ÐÒ—ÐË—Ðėн—ж—Я—Ш—С—К—Г—ÐŒ—Ð…—Ð~—Ðw—Ðp—Ði—Ðb—Ð[—ÐT—ÐM—ÐF—Ð?—Ð8—Ð1—Ð*—Ð#—ЗЗЗЗЗÐù–Ðò–Ðë–Ðä–ÐÝ–ÐÖ–ÐÏ–ÐÈ–ÐÁ–к–г–Ь–Ð¥–О–З–ЖЉ–Ђ–Ð{–Ðt–Ðm–Ðf–Ð_–ÐX–ÐQ–ÐJ–ÐC–Ð<–Ð5–Ð.–Ð'–Ð –ЖЖР–ЖÐý•Ðö•Ðï•Ðè•Ðá•ÐÚ•ÐÓ•ÐÌ•Ðŕо•з•а•Щ•Т•Л•Д•ЕІ•ЕÐx•Ðq•Ðj•Ðc•Ð\•ÐU•ÐN•ÐG•Ð@•Ð9•Ð2•Ð+•Ð$•ЕЕЕЕЕÐú”Ðó”Ðì”Ðå”ÐÞ”Ð×”ÐДÐɔДл”д”Э”Ц”П”И”Б”Њ”Ѓ”Ð|”Ðu”Ðn”Ðg”Ð`”ÐY”ÐR”ÐK”ÐD”Ð=”Ð6”Ð/”Ð(”Ð!”ДДР”ДÐþ“Ð÷“Ðð“Ðé“Ðâ“ÐÛ“ÐÔ“ÐÍ“ÐÆ“п“и“б“Ъ“У“М“Е“ÐŽ“Ї“Ѐ“Ðy“Ðr“Ðk“Ðd“Ð]“ÐV“ÐO“ÐH“ÐA“Ð:“Ð3“Ð,“Ð%“ГГГР“ГÐû’Ðô’Ðí’Ðæ’Ðß’ÐØ’ÐÑ’ÐÊ’ÐÒм’е’Ю’Ч’Р’Й’Ð’’Ћ’Є’Ð}’Ðv’Ðo’Ðh’Ða’ÐZ’ÐS’ÐL’ÐE’Ð>’Ð7’Ð0’Ð)’Ð"’Ð’Ð’Ð ’Ð’Ðÿ‘Ðø‘Ðñ‘Ðê‘Ðã‘ÐÜ‘ÐÕ‘ÐΑÐÇ‘ÐÀ‘й‘в‘Ы‘Ф‘БЖ‘БЈ‘БÐz‘Ðs‘Ðl‘Ðe‘Ð^‘ÐW‘ÐP‘ÐI‘ÐB‘Ð;‘Ð4‘Ð-‘Ð&‘БББР‘БÐüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýŽÐöŽÐïŽÐèŽÐáŽÐÚŽÐÓŽÐÌŽÐŎоŽÐ·ŽÐ°ŽÐ©ŽÐ¢ŽÐ›ŽÐ”ŽÐŽÐ†ŽÐŽÐxŽÐqŽÐjŽÐcŽÐ\ŽÐUŽÐNŽÐGŽÐ@ŽÐ9ŽÐ2ŽÐ+ŽÐ$ŽÐŽÐŽÐŽÐŽÐŽÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþŒÐ÷ŒÐðŒÐéŒÐâŒÐÛŒÐÔŒÐÍŒÐÆŒÐ¿ŒÐ¸ŒÐ±ŒÐªŒÐ£ŒÐœŒÐ•ŒÐŽŒÐ‡ŒÐ€ŒÐyŒÐrŒÐkŒÐdŒÐ]ŒÐVŒÐOŒÐHŒÐAŒÐ:ŒÐ3ŒÐ,ŒÐ%ŒÐŒÐŒÐŒÐ ŒÐŒÐû‹Ðô‹Ðí‹Ðæ‹Ðß‹ÐØ‹ÐÑ‹ÐÊ‹ÐËм‹Ðµ‹Ð®‹Ð§‹Ð ‹Ð™‹Ð’‹Ð‹‹Ð„‹Ð}‹Ðv‹Ðo‹Ðh‹Ða‹ÐZ‹ÐS‹ÐL‹ÐE‹Ð>‹Ð7‹Ð0‹Ð)‹Ð"‹Ð‹Ð‹Ð ‹Ð‹ÐÿŠÐøŠÐñŠÐêŠÐãŠÐÜŠÐÕŠÐΊÐÇŠÐÀŠÐ¹ŠÐ²ŠÐ«ŠÐ¤ŠÐŠÐ–ŠÐŠÐˆŠÐŠÐzŠÐsŠÐlŠÐeŠÐ^ŠÐWŠÐPŠÐIŠÐBŠÐ;ŠÐ4ŠÐ-ŠÐ&ŠÐŠÐŠÐŠÐ ŠÐŠÐü‰Ðõ‰Ðî‰Ðç‰Ðà‰ÐÙ‰ÐÒ‰ÐˉÐĉн‰Ð¶‰Ð¯‰Ð¨‰Ð¡‰Ðš‰Ð“‰ÐŒ‰Ð…‰Ð~‰Ðw‰Ðp‰Ði‰Ðb‰Ð[‰ÐT‰ÐM‰ÐF‰Ð?‰Ð8‰Ð1‰Ð*‰Ð#‰Ð‰Ð‰Ð‰Ð‰Ð‰ÐùˆÐòˆÐëˆÐäˆÐ݈ÐÖˆÐψÐȈÐÁˆÐºˆÐ³ˆÐ¬ˆÐ¥ˆÐžˆÐ—ˆÐˆÐ‰ˆÐ‚ˆÐ{ˆÐtˆÐmˆÐfˆÐ_ˆÐXˆÐQˆÐJˆÐCˆÐ<ˆÐ5ˆÐ.ˆÐ'ˆÐ ˆÐˆÐˆÐ ˆÐˆÐý‡Ðö‡Ðï‡Ðè‡Ðá‡ÐÚ‡ÐÓ‡Ð̇ÐŇо‡Ð·‡Ð°‡Ð©‡Ð¢‡Ð›‡Ð”‡Ð‡Ð†‡Ð‡Ðx‡Ðq‡Ðj‡Ðc‡Ð\‡ÐU‡ÐN‡ÐG‡Ð@‡Ð9‡Ð2‡Ð+‡Ð$‡Ð‡Ð‡Ð‡Ð‡Ð‡Ðú†Ðó†Ðì†Ðå†ÐÞ†Ð׆ÐІÐɆІл†Ð´†Ð­†Ð¦†ÐŸ†Ð˜†Ð‘†ÐІÐƒ†Ð|†Ðu†Ðn†Ðg†Ð`†ÐY†ÐR†ÐK†ÐD†Ð=†Ð6†Ð/†Ð(†Ð!†Ð†Ð†Ð †Ð†Ðþ…Ð÷…Ðð…Ðé…Ðâ…ÐÛ…ÐÔ…ÐÍ…ÐÆ…п…и…б…Ъ…У…М…Е…ÐŽ…Ї…Ѐ…Ðy…Ðr…Ðk…Ðd…Ð]…ÐV…ÐO…ÐH…ÐA…Ð:…Ð3…Ð,…Ð%…Ð…Ð…Ð…Ð …Ð…Ðû„Ðô„Ðí„Ðæ„Ðß„ÐØ„ÐÑ„ÐÊ„ÐÄм„е„Ю„Ч„Р„Й„Ð’„Ћ„Є„Ð}„Ðv„Ðo„Ðh„Ða„ÐZ„ÐS„ÐL„ÐE„Ð>„Ð7„Ð0„Ð)„Ð"„ЄЄР„ЄÐÿƒÐøƒÐñƒÐêƒÐãƒÐ܃ÐÕƒÐ΃ÐǃÐÀƒÐ¹ƒÐ²ƒÐ«ƒÐ¤ƒÐƒÐ–ƒÐƒÐˆƒÐƒÐzƒÐsƒÐlƒÐeƒÐ^ƒÐWƒÐPƒÐIƒÐBƒÐ;ƒÐ4ƒÐ-ƒÐ&ƒÐƒÐƒÐƒÐ ƒÐƒÐü‚Ðõ‚Ðî‚Ðç‚Ðà‚ÐÙ‚ÐÒ‚ÐË‚ÐĂн‚ж‚Я‚Ш‚С‚К‚Г‚ÐŒ‚Ð…‚Ð~‚Ðw‚Ðp‚Ði‚Ðb‚Ð[‚ÐT‚ÐM‚ÐF‚Ð?‚Ð8‚Ð1‚Ð*‚Ð#‚ЂЂЂЂЂÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐý€Ðö€Ðï€Ðè€Ðá€ÐÚ€ÐÓ€ÐÌ€Ðŀо€Ð·€Ð°€Ð©€Ð¢€Ð›€Ð”€Ð€Ð†€Ð€Ðx€Ðq€Ðj€Ðc€Ð\€ÐU€ÐN€ÐG€Ð@€Ð9€Ð2€Ð+€Ð$€Ð€Ð€Ð€Ð€Ð€ÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþ~Ð÷~Ðð~Ðé~Ðâ~ÐÛ~ÐÔ~ÐÍ~ÐÆ~п~и~б~Ъ~У~М~Е~ÐŽ~Ї~Ѐ~Ðy~Ðr~Ðk~Ðd~Ð]~ÐV~ÐO~ÐH~ÐA~Ð:~Ð3~Ð,~Ð%~Ð~Ð~Ð~Ð ~Ð~Ðû}Ðô}Ðí}Ðæ}Ðß}ÐØ}ÐÑ}ÐÊ}ÐÃ}м}е}Ю}Ч}Р}Й}Ð’}Ћ}Є}Ð}}Ðv}Ðo}Ðh}Ða}ÐZ}ÐS}ÐL}ÐE}Ð>}Ð7}Ð0}Ð)}Ð"}Ð}Ð}Ð }Ð}Ðÿ|Ðø|Ðñ|Ðê|Ðã|ÐÜ|ÐÕ|ÐÎ|ÐÇ|ÐÀ|й|в|Ы|Ф|Ð|Ж|Ð|Ј|Ð|Ðz|Ðs|Ðl|Ðe|Ð^|ÐW|ÐP|ÐI|ÐB|Ð;|Ð4|Ð-|Ð&|Ð|Ð|Ð|Ð |Ð|Ðü{Ðõ{Ðî{Ðç{Ðà{ÐÙ{ÐÒ{ÐË{ÐÄ{н{ж{Я{Ш{С{К{Г{ÐŒ{Ð…{Ð~{Ðw{Ðp{Ði{Ðb{Ð[{ÐT{ÐM{ÐF{Ð?{Ð8{Ð1{Ð*{Ð#{Ð{Ð{Ð{Ð{Ð{ÐùzÐòzÐëzÐäzÐÝzÐÖzÐÏzÐÈzÐÁzкzгzЬzÐ¥zОzЗzÐzЉzЂzÐ{zÐtzÐmzÐfzÐ_zÐXzÐQzÐJzÐCzÐvÐ7vÐ0vÐ)vÐ"vÐvÐvÐ vÐvÐÿuÐøuÐñuÐêuÐãuÐÜuÐÕuÐÎuÐÇuÐÀuйuвuЫuФuÐuЖuÐuЈuÐuÐzuÐsuÐluÐeuÐ^uÐWuÐPuÐIuÐBuÐ;uÐ4uÐ-uÐ&uÐuÐuÐuÐ uÐuÐütÐõtÐîtÐçtÐàtÐÙtÐÒtÐËtÐÄtнtжtЯtШtСtКtГtÐŒtÐ…tÐ~tÐwtÐptÐitÐbtÐ[tÐTtÐMtÐFtÐ?tÐ8tÐ1tÐ*tÐ#tÐtÐtÐtÐtÐtÐùsÐòsÐësÐäsÐÝsÐÖsÐÏsÐÈsÐÁsкsгsЬsÐ¥sОsЗsÐsЉsЂsÐ{sÐtsÐmsÐfsÐ_sÐXsÐQsÐJsÐCsÐoÐ7oÐ0oÐ)oÐ"oÐoÐoÐ oÐoÐÿnÐønÐñnÐênÐãnÐÜnÐÕnÐÎnÐÇnÐÀnйnвnЫnФnÐnЖnÐnЈnÐnÐznÐsnÐlnÐenÐ^nÐWnÐPnÐInÐBnÐ;nÐ4nÐ-nÐ&nÐnÐnÐnÐ nÐnÐümÐõmÐîmÐçmÐàmÐÙmÐÒmÐËmÐÄmнmжmЯmШmСmКmГmÐŒmÐ…mÐ~mÐwmÐpmÐimÐbmÐ[mÐTmÐMmÐFmÐ?mÐ8mÐ1mÐ*mÐ#mÐmÐmÐmÐmÐmÐùlÐòlÐëlÐälÐÝlÐÖlÐÏlÐÈlÐÁlкlгlЬlÐ¥lОlЗlÐlЉlЂlÐ{lÐtlÐmlÐflÐ_lÐXlÐQlÐJlÐClÐhÐ7hÐ0hÐ)hÐ"hÐhÐhÐ hÐhÐÿgÐøgÐñgÐêgÐãgÐÜgÐÕgÐÎgÐÇgÐÀgйgвgЫgФgÐgЖgÐgЈgÐgÐzgÐsgÐlgÐegÐ^gÐWgÐPgÐIgÐBgÐ;gÐ4gÐ-gÐ&gÐgÐgÐgÐ gÐgÐüfÐõfÐîfÐçfÐàfÐÙfÐÒfÐËfÐÄfнfжfЯfШfСfКfГfÐŒfÐ…fÐ~fÐwfÐpfÐifÐbfÐ[fÐTfÐMfÐFfÐ?fÐ8fÐ1fÐ*fÐ#fÐfÐfÐfÐfÐfÐùeÐòeÐëeÐäeÐÝeÐÖeÐÏeÐÈeÐÁeкeгeЬeÐ¥eОeЗeÐeЉeЂeÐ{eÐteÐmeÐfeÐ_eÐXeÐQeÐJeÐCeÐaÐ7aÐ0aÐ)aÐ"aÐaÐaÐ aÐaÐÿ`Ðø`Ðñ`Ðê`Ðã`ÐÜ`ÐÕ`ÐÎ`ÐÇ`ÐÀ`й`в`Ы`Ф`Ð`Ж`Ð`Ј`Ð`Ðz`Ðs`Ðl`Ðe`Ð^`ÐW`ÐP`ÐI`ÐB`Ð;`Ð4`Ð-`Ð&`Ð`Ð`Ð`Ð `Ð`Ðü_Ðõ_Ðî_Ðç_Ðà_ÐÙ_ÐÒ_ÐË_ÐÄ_н_ж_Я_Ш_С_К_Г_ÐŒ_Ð…_Ð~_Ðw_Ðp_Ði_Ðb_Ð[_ÐT_ÐM_ÐF_Ð?_Ð8_Ð1_Ð*_Ð#_Ð_Ð_Ð_Ð_Ð_Ðù^Ðò^Ðë^Ðä^ÐÝ^ÐÖ^ÐÏ^ÐÈ^ÐÁ^к^г^Ь^Ð¥^О^З^Ð^Љ^Ђ^Ð{^Ðt^Ðm^Ðf^Ð_^ÐX^ÐQ^ÐJ^ÐC^Ð<^Ð5^Ð.^Ð'^Ð ^Ð^Ð^Ð ^Ð^Ðý]Ðö]Ðï]Ðè]Ðá]ÐÚ]ÐÓ]ÐÌ]ÐÅ]о]з]а]Щ]Т]Л]Д]Ð]І]Ð]Ðx]Ðq]Ðj]Ðc]Ð\]ÐU]ÐN]ÐG]Ð@]Ð9]Ð2]Ð+]Ð$]Ð]Ð]Ð]Ð]Ð]Ðú\Ðó\Ðì\Ðå\ÐÞ\Ð×\ÐÐ\ÐÉ\ÐÂ\л\д\Э\Ц\П\И\Б\Њ\Ѓ\Ð|\Ðu\Ðn\Ðg\Ð`\ÐY\ÐR\ÐK\ÐD\Ð=\Ð6\Ð/\Ð(\Ð!\Ð\Ð\Ð \Ð\Ðþ[Ð÷[Ðð[Ðé[Ðâ[ÐÛ[ÐÔ[ÐÍ[ÐÆ[п[и[б[Ъ[У[М[Е[ÐŽ[Ї[Ѐ[Ðy[Ðr[Ðk[Ðd[Ð][ÐV[ÐO[ÐH[ÐA[Ð:[Ð3[Ð,[Ð%[Ð[Ð[Ð[Ð [Ð[ÐûZÐôZÐíZÐæZÐßZÐØZÐÑZÐÊZÐÃZмZеZЮZЧZРZЙZÐ’ZЋZЄZÐ}ZÐvZÐoZÐhZÐaZÐZZÐSZÐLZÐEZÐ>ZÐ7ZÐ0ZÐ)ZÐ"ZÐZÐZÐ ZÐZÐÿYÐøYÐñYÐêYÐãYÐÜYÐÕYÐÎYÐÇYÐÀYйYвYЫYФYÐYЖYÐYЈYÐYÐzYÐsYÐlYÐeYÐ^YÐWYÐPYÐIYÐBYÐ;YÐ4YÐ-YÐ&YÐYÐYÐYÐ YÐYÐüXÐõXÐîXÐçXÐàXÐÙXÐÒXÐËXÐÄXнXжXЯXШXСXКXГXÐŒXÐ…XÐ~XÐwXÐpXÐiXÐbXÐ[XÐTXÐMXÐFXÐ?XÐ8XÐ1XÐ*XÐ#XÐXÐXÐXÐXÐXÐùWÐòWÐëWÐäWÐÝWÐÖWÐÏWÐÈWÐÁWкWгWЬWÐ¥WОWЗWÐWЉWЂWÐ{WÐtWÐmWÐfWÐ_WÐXWÐQWÐJWÐCWÐSÐ7SÐ0SÐ)SÐ"SÐSÐSÐ SÐSÐÿRÐøRÐñRÐêRÐãRÐÜRÐÕRÐÎRÐÇRÐÀRйRвRЫRФRÐRЖRÐRЈRÐRÐzRÐsRÐlRÐeRÐ^RÐWRÐPRÐIRÐBRÐ;RÐ4RÐ-RÐ&RÐRÐRÐRÐ RÐRÐüQÐõQÐîQÐçQÐàQÐÙQÐÒQÐËQÐÄQнQжQЯQШQСQКQГQÐŒQÐ…QÐ~QÐwQÐpQÐiQÐbQÐ[QÐTQÐMQÐFQÐ?QÐ8QÐ1QÐ*QÐ#QÐQÐQÐQÐQÐQÐùPÐòPÐëPÐäPÐÝPÐÖPÐÏPÐÈPÐÁPкPгPЬPÐ¥PОPЗPÐPЉPЂPÐ{PÐtPÐmPÐfPÐ_PÐXPÐQPÐJPÐCPÐLÐ7LÐ0LÐ)LÐ"LÐLÐLÐ LÐLÐÿKÐøKÐñKÐêKÐãKÐÜKÐÕKÐÎKÐÇKÐÀKйKвKЫKФKÐKЖKÐKЈKÐKÐzKÐsKÐlKÐeKÐ^KÐWKÐPKÐIKÐBKÐ;KÐ4KÐ-KÐ&KÐKÐKÐKÐ KÐKÐüJÐõJÐîJÐçJÐàJÐÙJÐÒJÐËJÐÄJнJжJЯJШJСJКJГJÐŒJÐ…JÐ~JÐwJÐpJÐiJÐbJÐ[JÐTJÐMJÐFJÐ?JÐ8JÐ1JÐ*JÐ#JÐJÐJÐJÐJÐJÐùIÐòIÐëIÐäIÐÝIÐÖIÐÏIÐÈIÐÁIкIгIЬIÐ¥IОIЗIÐIЉIЂIÐ{IÐtIÐmIÐfIÐ_IÐXIÐQIÐJIÐCIÐEÐ7EÐ0EÐ)EÐ"EÐEÐEÐ EÐEÐÿDÐøDÐñDÐêDÐãDÐÜDÐÕDÐÎDÐÇDÐÀDйDвDЫDФDÐDЖDÐDЈDÐDÐzDÐsDÐlDÐeDÐ^DÐWDÐPDÐIDÐBDÐ;DÐ4DÐ-DÐ&DÐDÐDÐDÐ DÐDÐüCÐõCÐîCÐçCÐàCÐÙCÐÒCÐËCÐÄCнCжCЯCШCСCКCГCÐŒCÐ…CÐ~CÐwCÐpCÐiCÐbCÐ[CÐTCÐMCÐFCÐ?CÐ8CÐ1CÐ*CÐ#CÐCÐCÐCÐCÐCÐùBÐòBÐëBÐäBÐÝBÐÖBÐÏBÐÈBÐÁBкBгBЬBÐ¥BОBЗBÐBЉBЂBÐ{BÐtBÐmBÐfBÐ_BÐXBÐQBÐJBÐCBÐÐô>Ðí>Ðæ>Ðß>ÐØ>ÐÑ>ÐÊ>ÐÃ>м>е>Ю>Ч>Р>Й>Ð’>Ћ>Є>Ð}>Ðv>Ðo>Ðh>Ða>ÐZ>ÐS>ÐL>ÐE>Ð>>Ð7>Ð0>Ð)>Ð">Ð>Ð>Ð >Ð>Ðÿ=Ðø=Ðñ=Ðê=Ðã=ÐÜ=ÐÕ=ÐÎ=ÐÇ=ÐÀ=й=в=Ы=Ф=Ð=Ж=Ð=Ј=Ð=Ðz=Ðs=Ðl=Ðe=Ð^=ÐW=ÐP=ÐI=ÐB=Ð;=Ð4=Ð-=Ð&=Ð=Ð=Ð=Ð =Ð=Ðü<Ðõ<Ðî<Ðç<Ðà<ÐÙ<ÐÒ<ÐË<ÐÄ<н<ж<Я<Ш<С<К<Г<ÐŒ<Ð…<Ð~<Ðw<Ðp<Ði<Ðb<Ð[<ÐT<ÐM<ÐF<Ð?<Ð8<Ð1<Ð*<Ð#<Ð<Ð<Ð<Ð<Ð<Ðù;Ðò;Ðë;Ðä;ÐÝ;ÐÖ;ÐÏ;ÐÈ;ÐÁ;к;г;Ь;Ð¥;О;З;Ð;Љ;Ђ;Ð{;Ðt;Ðm;Ðf;Ð_;ÐX;ÐQ;ÐJ;ÐC;Ð<;Ð5;Ð.;Ð';Ð ;Ð;Ð;Ð ;Ð;Ðý:Ðö:Ðï:Ðè:Ðá:ÐÚ:ÐÓ:ÐÌ:ÐÅ:о:з:а:Щ:Т:Л:Д:Ð:І:Ð:Ðx:Ðq:Ðj:Ðc:Ð\:ÐU:ÐN:ÐG:Ð@:Ð9:Ð2:Ð+:Ð$:Ð:Ð:Ð:Ð:Ð:Ðú9Ðó9Ðì9Ðå9ÐÞ9Ð×9ÐÐ9ÐÉ9ÐÂ9л9д9Э9Ц9П9И9Б9Њ9Ѓ9Ð|9Ðu9Ðn9Ðg9Ð`9ÐY9ÐR9ÐK9ÐD9Ð=9Ð69Ð/9Ð(9Ð!9Ð9Ð9Ð 9Ð9Ðþ8Ð÷8Ðð8Ðé8Ðâ8ÐÛ8ÐÔ8ÐÍ8ÐÆ8п8и8б8Ъ8У8М8Е8ÐŽ8Ї8Ѐ8Ðy8Ðr8Ðk8Ðd8Ð]8ÐV8ÐO8ÐH8ÐA8Ð:8Ð38Ð,8Ð%8Ð8Ð8Ð8Ð 8Ð8Ðû7Ðô7Ðí7Ðæ7Ðß7ÐØ7ÐÑ7ÐÊ7ÐÃ7м7е7Ю7Ч7Р7Й7Ð’7Ћ7Є7Ð}7Ðv7Ðo7Ðh7Ða7ÐZ7ÐS7ÐL7ÐE7Ð>7Ð77Ð07Ð)7Ð"7Ð7Ð7Ð 7Ð7Ðÿ6Ðø6Ðñ6Ðê6Ðã6ÐÜ6ÐÕ6ÐÎ6ÐÇ6ÐÀ6й6в6Ы6Ф6Ð6Ж6Ð6Ј6Ð6Ðz6Ðs6Ðl6Ðe6Ð^6ÐW6ÐP6ÐI6ÐB6Ð;6Ð46Ð-6Ð&6Ð6Ð6Ð6Ð 6Ð6Ðü5Ðõ5Ðî5Ðç5Ðà5ÐÙ5ÐÒ5ÐË5ÐÄ5н5ж5Я5Ш5С5К5Г5ÐŒ5Ð…5Ð~5Ðw5Ðp5Ði5Ðb5Ð[5ÐT5ÐM5ÐF5Ð?5Ð85Ð15Ð*5Ð#5Ð5Ð5Ð5Ð5Ð5Ðù4Ðò4Ðë4Ðä4ÐÝ4ÐÖ4ÐÏ4ÐÈ4ÐÁ4к4г4Ь4Ð¥4О4З4Ð4Љ4Ђ4Ð{4Ðt4Ðm4Ðf4Ð_4ÐX4ÐQ4ÐJ4ÐC4Ð<4Ð54Ð.4Ð'4Ð 4Ð4Ð4Ð 4Ð4Ðý3Ðö3Ðï3Ðè3Ðá3ÐÚ3ÐÓ3ÐÌ3ÐÅ3о3з3а3Щ3Т3Л3Д3Ð3І3Ð3Ðx3Ðq3Ðj3Ðc3Ð\3ÐU3ÐN3ÐG3Ð@3Ð93Ð23Ð+3Ð$3Ð3Ð3Ð3Ð3Ð3Ðú2Ðó2Ðì2Ðå2ÐÞ2Ð×2ÐÐ2ÐÉ2ÐÂ2л2д2Э2Ц2П2И2Б2Њ2Ѓ2Ð|2Ðu2Ðn2Ðg2Ð`2ÐY2ÐR2ÐK2ÐD2Ð=2Ð62Ð/2Ð(2Ð!2Ð2Ð2Ð 2Ð2Ðþ1Ð÷1Ðð1Ðé1Ðâ1ÐÛ1ÐÔ1ÐÍ1ÐÆ1п1и1б1Ъ1У1М1Е1ÐŽ1Ї1Ѐ1Ðy1Ðr1Ðk1Ðd1Ð]1ÐV1ÐO1ÐH1ÐA1Ð:1Ð31Ð,1Ð%1Ð1Ð1Ð1Ð 1Ð1Ðû0Ðô0Ðí0Ðæ0Ðß0ÐØ0ÐÑ0ÐÊ0ÐÃ0м0е0Ю0Ч0Р0Й0Ð’0Ћ0Є0Ð}0Ðv0Ðo0Ðh0Ða0ÐZ0ÐS0ÐL0ÐE0Ð>0Ð70Ð00Ð)0Ð"0Ð0Ð0Ð 0Ð0Ðÿ/Ðø/Ðñ/Ðê/Ðã/ÐÜ/ÐÕ/ÐÎ/ÐÇ/ÐÀ/й/в/Ы/Ф/Ð/Ж/Ð/Ј/Ð/Ðz/Ðs/Ðl/Ðe/Ð^/ÐW/ÐP/ÐI/ÐB/Ð;/Ð4/Ð-/Ð&/Ð/Ð/Ð/Ð /Ð/Ðü.Ðõ.Ðî.Ðç.Ðà.ÐÙ.ÐÒ.ÐË.ÐÄ.н.ж.Я.Ш.С.К.Г.ÐŒ.Ð….Ð~.Ðw.Ðp.Ði.Ðb.Ð[.ÐT.ÐM.ÐF.Ð?.Ð8.Ð1.Ð*.Ð#.Ð.Ð.Ð.Ð.Ð.Ðù-Ðò-Ðë-Ðä-ÐÝ-ÐÖ-ÐÏ-ÐÈ-ÐÁ-к-г-Ь-Ð¥-О-З-Ð-Љ-Ђ-Ð{-Ðt-Ðm-Ðf-Ð_-ÐX-ÐQ-ÐJ-ÐC-Ð<-Ð5-Ð.-Ð'-Ð -Ð-Ð-Ð -Ð-Ðý,Ðö,Ðï,Ðè,Ðá,ÐÚ,ÐÓ,ÐÌ,ÐÅ,о,з,а,Щ,Т,Л,Д,Ð,І,Ð,Ðx,Ðq,Ðj,Ðc,Ð\,ÐU,ÐN,ÐG,Ð@,Ð9,Ð2,Ð+,Ð$,Ð,Ð,Ð,Ð,Ð,Ðú+Ðó+Ðì+Ðå+ÐÞ+Ð×+ÐÐ+ÐÉ+ÐÂ+л+д+Э+Ц+П+И+Б+Њ+Ѓ+Ð|+Ðu+Ðn+Ðg+Ð`+ÐY+ÐR+ÐK+ÐD+Ð=+Ð6+Ð/+Ð(+Ð!+Ð+Ð+Ð +Ð+Ðþ*Ð÷*Ðð*Ðé*Ðâ*ÐÛ*ÐÔ*ÐÍ*ÐÆ*п*и*б*Ъ*У*М*Е*ÐŽ*Ї*Ѐ*Ðy*Ðr*Ðk*Ðd*Ð]*ÐV*ÐO*ÐH*ÐA*Ð:*Ð3*Ð,*Ð%*Ð*Ð*Ð*Ð *Ð*Ðû)Ðô)Ðí)Ðæ)Ðß)ÐØ)ÐÑ)ÐÊ)ÐÃ)м)е)Ю)Ч)Р)Й)Ð’)Ћ)Є)Ð})Ðv)Ðo)Ðh)Ða)ÐZ)ÐS)ÐL)ÐE)Ð>)Ð7)Ð0)Ð))Ð")Ð)Ð)Ð )Ð)Ðÿ(Ðø(Ðñ(Ðê(Ðã(ÐÜ(ÐÕ(ÐÎ(ÐÇ(ÐÀ(й(в(Ы(Ф(Ð(Ж(Ð(Ј(Ð(Ðz(Ðs(Ðl(Ðe(Ð^(ÐW(ÐP(ÐI(ÐB(Ð;(Ð4(Ð-(Ð&(Ð(Ð(Ð(Ð (Ð(Ðü'Ðõ'Ðî'Ðç'Ðà'ÐÙ'ÐÒ'ÐË'ÐÄ'н'ж'Я'Ш'С'К'Г'ÐŒ'Ð…'Ð~'Ðw'Ðp'Ði'Ðb'Ð['ÐT'ÐM'ÐF'Ð?'Ð8'Ð1'Ð*'Ð#'Ð'Ð'Ð'Ð'Ð'Ðù&Ðò&Ðë&Ðä&ÐÝ&ÐÖ&ÐÏ&ÐÈ&ÐÁ&к&г&Ь&Ð¥&О&З&Ð&Љ&Ђ&Ð{&Ðt&Ðm&Ðf&Ð_&ÐX&ÐQ&ÐJ&ÐC&Ð<&Ð5&Ð.&Ð'&Ð &Ð&Ð&Ð &Ð&Ðý%Ðö%Ðï%Ðè%Ðá%ÐÚ%ÐÓ%ÐÌ%ÐÅ%о%з%а%Щ%Т%Л%Д%Ð%І%Ð%Ðx%Ðq%Ðj%Ðc%Ð\%ÐU%ÐN%ÐG%Ð@%Ð9%Ð2%Ð+%Ð$%Ð%Ð%Ð%Ð%Ð%Ðú$Ðó$Ðì$Ðå$ÐÞ$Ð×$ÐÐ$ÐÉ$ÐÂ$л$д$Э$Ц$П$И$Б$Њ$Ѓ$Ð|$Ðu$Ðn$Ðg$Ð`$ÐY$ÐR$ÐK$ÐD$Ð=$Ð6$Ð/$Ð($Ð!$Ð$Ð$Ð $Ð$Ðþ#Ð÷#Ðð#Ðé#Ðâ#ÐÛ#ÐÔ#ÐÍ#ÐÆ#п#и#б#Ъ#У#М#Е#ÐŽ#Ї#Ѐ#Ðy#Ðr#Ðk#Ðd#Ð]#ÐV#ÐO#ÐH#ÐA#Ð:#Ð3#Ð,#Ð%#Ð#Ð#Ð#Ð #Ð#Ðû"Ðô"Ðí"Ðæ"Ðß"ÐØ"ÐÑ"ÐÊ"ÐÃ"м"е"Ю"Ч"Р"Й"Ð’"Ћ"Є"Ð}"Ðv"Ðo"Ðh"Ða"ÐZ"ÐS"ÐL"ÐE"Ð>"Ð7"Ð0"Ð)"Ð""Ð"Ð"Ð "Ð"Ðÿ!Ðø!Ðñ!Ðê!Ðã!ÐÜ!ÐÕ!ÐÎ!ÐÇ!ÐÀ!й!в!Ы!Ф!Ð!Ж!Ð!Ј!Ð!Ðz!Ðs!Ðl!Ðe!Ð^!ÐW!ÐP!ÐI!ÐB!Ð;!Ð4!Ð-!Ð&!Ð!Ð!Ð!Ð !Ð!Ðü Ðõ Ðî Ðç Ðà ÐÙ ÐÒ ÐË ÐÄ Ð½ ж Я Ш С К Г ÐŒ Ð… Ð~ Ðw Ðp Ði Ðb Ð[ ÐT ÐM ÐF Ð? Ð8 Ð1 Ð* Ð# Ð Ð Ð Ð Ð ÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐû Ðô Ðí Ðæ Ðß ÐØ ÐÑ ÐÊ Ðà м е Ю Ч Р Й Ð’ Ћ Є Ð} Ðv Ðo Ðh Ða ÐZ ÐS ÐL ÐE Ð> Ð7 Ð0 Ð) Ð" Ð Ð Ð Ð Ðÿ Ðø Ðñ Ðê Ðã ÐÜ ÐÕ ÐÎ ÐÇ ÐÀ й в Ы Ф РЖ РЈ Ð Ðz Ðs Ðl Ðe Ð^ ÐW ÐP ÐI ÐB Ð; Ð4 Ð- Ð& Ð Ð Ð Ð Ð Ðü Ðõ Ðî Ðç Ðà ÐÙ ÐÒ ÐË ÐÄ Ð½ ж Я Ш С К Г ÐŒ Ð… Ð~ Ðw Ðp Ði Ðb Ð[ ÐT ÐM ÐF Ð? Ð8 Ð1 Ð* Ð# Ð Ð Ð Ð Ð Ðù Ðò Ðë Ðä ÐÝ ÐÖ ÐÏ ÐÈ ÐÁ к г Ь Ð¥ О З РЉ Ђ Ð{ Ðt Ðm Ðf Ð_ ÐX ÐQ ÐJ ÐC Ð< Ð5 Ð. Ð' Ð Ð Ð Ð Ð Ðý Ðö Ðï Ðè Ðá ÐÚ ÐÓ ÐÌ ÐŠо з а Щ Т Л Д РІ Ð Ðx Ðq Ðj Ðc Ð\ ÐU ÐN ÐG Ð@ Ð9 Ð2 Ð+ Ð$ Ð Ð Ð Ð Ð ÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÿÏôÿÏíÿÏæÿÏßÿÏØÿÏÑÿÏÊÿÏÃÿϼÿϵÿÏ®ÿϧÿÏ ÿÏ™ÿÏ’ÿÏ‹ÿÏ„ÿÏ}ÿÏvÿÏoÿÏhÿÏaÿÏZÿÏSÿÏLÿÏEÿÏ>ÿÏ7ÿÏ0ÿÏ)ÿÏ"ÿÏÿÏÿÏ ÿÏÿÏÿþÏøþÏñþÏêþÏãþÏÜþÏÕþÏÎþÏÇþÏÀþϹþϲþÏ«þϤþÏþÏ–þÏþψþÏþÏzþÏsþÏlþÏeþÏ^þÏWþÏPþÏIþÏBþÏ;þÏ4þÏ-þÏ&þÏþÏþÏþÏ þÏþÏüýÏõýÏîýÏçýÏàýÏÙýÏÒýÏËýÏÄýϽý϶ýϯýϨýÏ¡ýÏšýÏ“ýÏŒýÏ…ýÏ~ýÏwýÏpýÏiýÏbýÏ[ýÏTýÏMýÏFýÏ?ýÏ8ýÏ1ýÏ*ýÏ#ýÏýÏýÏýÏýÏýÏùüÏòüÏëüÏäüÏÝüÏÖüÏÏüÏÈüÏÁüϺüϳüϬüÏ¥üÏžüÏ—üÏüωüÏ‚üÏ{üÏtüÏmüÏfüÏ_üÏXüÏQüÏJüÏCüÏ<üÏ5üÏ.üÏ'üÏ üÏüÏüÏ üÏüÏýûÏöûÏïûÏèûÏáûÏÚûÏÓûÏÌûÏÅûϾûÏ·ûϰûÏ©ûÏ¢ûÏ›ûÏ”ûÏûφûÏûÏxûÏqûÏjûÏcûÏ\ûÏUûÏNûÏGûÏ@ûÏ9ûÏ2ûÏ+ûÏ$ûÏûÏûÏûÏûÏûÏúúÏóúÏìúÏåúÏÞúÏ×úÏÐúÏÉúÏÂúÏ»úÏ´úÏ­úϦúÏŸúϘúÏ‘úÏŠúσúÏ|úÏuúÏnúÏgúÏ`úÏYúÏRúÏKúÏDúÏ=úÏ6úÏ/úÏ(úÏ!úÏúÏúÏ úÏúÏþùÏ÷ùÏðùÏéùÏâùÏÛùÏÔùÏÍùÏÆùÏ¿ùϸùϱùϪùÏ£ùÏœùÏ•ùÏŽùχùÏ€ùÏyùÏrùÏkùÏdùÏ]ùÏVùÏOùÏHùÏAùÏ:ùÏ3ùÏ,ùÏ%ùÏùÏùÏùÏ ùÏùÏûøÏôøÏíøÏæøÏßøÏØøÏÑøÏÊøÏÃøÏ¼øÏµøÏ®øÏ§øÏ øÏ™øÏ’øÏ‹øÏ„øÏ}øÏvøÏoøÏhøÏaøÏZøÏSøÏLøÏEøÏ>øÏ7øÏ0øÏ)øÏ"øÏøÏøÏ øÏøÏÿ÷Ïø÷Ïñ÷Ïê÷Ïã÷ÏÜ÷ÏÕ÷ÏÎ÷ÏÇ÷ÏÀ÷Ϲ÷ϲ÷Ï«÷Ϥ÷Ï÷Ï–÷Ï÷ψ÷Ï÷Ïz÷Ïs÷Ïl÷Ïe÷Ï^÷ÏW÷ÏP÷ÏI÷ÏB÷Ï;÷Ï4÷Ï-÷Ï&÷Ï÷Ï÷Ï÷Ï ÷Ï÷ÏüöÏõöÏîöÏçöÏàöÏÙöÏÒöÏËöÏÄöϽö϶öϯöϨöÏ¡öÏšöÏ“öÏŒöÏ…öÏ~öÏwöÏpöÏiöÏböÏ[öÏTöÏMöÏFöÏ?öÏ8öÏ1öÏ*öÏ#öÏöÏöÏöÏöÏöÏùõÏòõÏëõÏäõÏÝõÏÖõÏÏõÏÈõÏÁõϺõϳõϬõÏ¥õÏžõÏ—õÏõωõÏ‚õÏ{õÏtõÏmõÏfõÏ_õÏXõÏQõÏJõÏCõÏ<õÏ5õÏ.õÏ'õÏ õÏõÏõÏ õÏõÏýôÏöôÏïôÏèôÏáôÏÚôÏÓôÏÌôÏÅôϾôÏ·ôϰôÏ©ôÏ¢ôÏ›ôÏ”ôÏôφôÏôÏxôÏqôÏjôÏcôÏ\ôÏUôÏNôÏGôÏ@ôÏ9ôÏ2ôÏ+ôÏ$ôÏôÏôÏôÏôÏôÏúóÏóóÏìóÏåóÏÞóÏ×óÏÐóÏÉóÏÂóÏ»óÏ´óÏ­óϦóÏŸóϘóÏ‘óÏŠóσóÏ|óÏuóÏnóÏgóÏ`óÏYóÏRóÏKóÏDóÏ=óÏ6óÏ/óÏ(óÏ!óÏóÏóÏ óÏóÏþòÏ÷òÏðòÏéòÏâòÏÛòÏÔòÏÍòÏÆòÏ¿òϸòϱòϪòÏ£òÏœòÏ•òÏŽòχòÏ€òÏyòÏròÏkòÏdòÏ]òÏVòÏOòÏHòÏAòÏ:òÏ3òÏ,òÏ%òÏòÏòÏòÏ òÏòÏûñÏôñÏíñÏæñÏßñÏØñÏÑñÏÊñÏÃñϼñϵñÏ®ñϧñÏ ñÏ™ñÏ’ñÏ‹ñÏ„ñÏ}ñÏvñÏoñÏhñÏañÏZñÏSñÏLñÏEñÏ>ñÏ7ñÏ0ñÏ)ñÏ"ñÏñÏñÏ ñÏñÏÿðÏøðÏñðÏêðÏãðÏÜðÏÕðÏÎðÏÇðÏÀðϹðϲðÏ«ðϤðÏðÏ–ðÏðψðÏðÏzðÏsðÏlðÏeðÏ^ðÏWðÏPðÏIðÏBðÏ;ðÏ4ðÏ-ðÏ&ðÏðÏðÏðÏ ðÏðÏüïÏõïÏîïÏçïÏàïÏÙïÏÒïÏËïÏÄïϽï϶ïϯïϨïÏ¡ïÏšïÏ“ïÏŒïÏ…ïÏ~ïÏwïÏpïÏiïÏbïÏ[ïÏTïÏMïÏFïÏ?ïÏ8ïÏ1ïÏ*ïÏ#ïÏïÏïÏïÏïÏïÏùîÏòîÏëîÏäîÏÝîÏÖîÏÏîÏÈîÏÁîϺîϳîϬîÏ¥îÏžîÏ—îÏîωîÏ‚îÏ{îÏtîÏmîÏfîÏ_îÏXîÏQîÏJîÏCîÏ<îÏ5îÏ.îÏ'îÏ îÏîÏîÏ îÏîÏýíÏöíÏïíÏèíÏáíÏÚíÏÓíÏÌíÏÅíϾíÏ·íϰíÏ©íÏ¢íÏ›íÏ”íÏíφíÏíÏxíÏqíÏjíÏcíÏ\íÏUíÏNíÏGíÏ@íÏ9íÏ2íÏ+íÏ$íÏíÏíÏíÏíÏíÏúìÏóìÏììÏåìÏÞìÏ×ìÏÐìÏÉìÏÂìÏ»ìÏ´ìÏ­ìϦìÏŸìϘìÏ‘ìÏŠìσìÏ|ìÏuìÏnìÏgìÏ`ìÏYìÏRìÏKìÏDìÏ=ìÏ6ìÏ/ìÏ(ìÏ!ìÏìÏìÏ ìÏìÏþëÏ÷ëÏðëÏéëÏâëÏÛëÏÔëÏÍëÏÆëÏ¿ëϸëϱëϪëÏ£ëÏœëÏ•ëÏŽëχëÏ€ëÏyëÏrëÏkëÏdëÏ]ëÏVëÏOëÏHëÏAëÏ:ëÏ3ëÏ,ëÏ%ëÏëÏëÏëÏ ëÏëÏûêÏôêÏíêÏæêÏßêÏØêÏÑêÏÊêÏÃêϼêϵêÏ®êϧêÏ êÏ™êÏ’êÏ‹êÏ„êÏ}êÏvêÏoêÏhêÏaêÏZêÏSêÏLêÏEêÏ>êÏ7êÏ0êÏ)êÏ"êÏêÏêÏ êÏêÏÿéÏøéÏñéÏêéÏãéÏÜéÏÕéÏÎéÏÇéÏÀéϹéϲéÏ«éϤéÏéÏ–éÏéψéÏéÏzéÏséÏléÏeéÏ^éÏWéÏPéÏIéÏBéÏ;éÏ4éÏ-éÏ&éÏéÏéÏéÏ éÏéÏüèÏõèÏîèÏçèÏàèÏÙèÏÒèÏËèÏÄèϽè϶èϯèϨèÏ¡èÏšèÏ“èÏŒèÏ…èÏ~èÏwèÏpèÏièÏbèÏ[èÏTèÏMèÏFèÏ?èÏ8èÏ1èÏ*èÏ#èÏèÏèÏèÏèÏèÏùçÏòçÏëçÏäçÏÝçÏÖçÏÏçÏÈçÏÁçϺçϳçϬçÏ¥çÏžçÏ—çÏçωçÏ‚çÏ{çÏtçÏmçÏfçÏ_çÏXçÏQçÏJçÏCçÏ<çÏ5çÏ.çÏ'çÏ çÏçÏçÏ çÏçÏýæÏöæÏïæÏèæÏáæÏÚæÏÓæÏÌæÏÅæÏ¾æÏ·æÏ°æÏ©æÏ¢æÏ›æÏ”æÏæÏ†æÏæÏxæÏqæÏjæÏcæÏ\æÏUæÏNæÏGæÏ@æÏ9æÏ2æÏ+æÏ$æÏæÏæÏæÏæÏæÏúåÏóåÏìåÏååÏÞåÏ×åÏÐåÏÉåÏÂåÏ»åÏ´åÏ­åϦåÏŸåϘåÏ‘åÏŠåσåÏ|åÏuåÏnåÏgåÏ`åÏYåÏRåÏKåÏDåÏ=åÏ6åÏ/åÏ(åÏ!åÏåÏåÏ åÏåÏþäÏ÷äÏðäÏéäÏâäÏÛäÏÔäÏÍäÏÆäÏ¿äϸäϱäϪäÏ£äÏœäÏ•äÏŽäχäÏ€äÏyäÏräÏkäÏdäÏ]äÏVäÏOäÏHäÏAäÏ:äÏ3äÏ,äÏ%äÏäÏäÏäÏ äÏäÏûãÏôãÏíãÏæãÏßãÏØãÏÑãÏÊãÏÃãϼãϵãÏ®ãϧãÏ ãÏ™ãÏ’ãÏ‹ãÏ„ãÏ}ãÏvãÏoãÏhãÏaãÏZãÏSãÏLãÏEãÏ>ãÏ7ãÏ0ãÏ)ãÏ"ãÏãÏãÏ ãÏãÏÿâÏøâÏñâÏêâÏãâÏÜâÏÕâÏÎâÏÇâÏÀâϹâϲâÏ«âϤâÏâÏ–âÏâψâÏâÏzâÏsâÏlâÏeâÏ^âÏWâÏPâÏIâÏBâÏ;âÏ4âÏ-âÏ&âÏâÏâÏâÏ âÏâÏüáÏõáÏîáÏçáÏàáÏÙáÏÒáÏËáÏÄáϽá϶áϯáϨáÏ¡áÏšáÏ“áÏŒáÏ…áÏ~áÏwáÏpáÏiáÏbáÏ[áÏTáÏMáÏFáÏ?áÏ8áÏ1áÏ*áÏ#áÏáÏáÏáÏáÏáÏùàÏòàÏëàÏäàÏÝàÏÖàÏÏàÏÈàÏÁàϺàϳàϬàÏ¥àÏžàÏ—àÏàωàÏ‚àÏ{àÏtàÏmàÏfàÏ_àÏXàÏQàÏJàÏCàÏ<àÏ5àÏ.àÏ'àÏ àÏàÏàÏ àÏàÏýßÏößÏïßÏèßÏáßÏÚßÏÓßÏÌßÏÅßϾßÏ·ßϰßÏ©ßÏ¢ßÏ›ßÏ”ßÏßφßÏßÏxßÏqßÏjßÏcßÏ\ßÏUßÏNßÏGßÏ@ßÏ9ßÏ2ßÏ+ßÏ$ßÏßÏßÏßÏßÏßÏúÞÏóÞÏìÞÏåÞÏÞÞÏ×ÞÏÐÞÏÉÞÏÂÞÏ»ÞÏ´ÞÏ­ÞϦÞÏŸÞϘÞÏ‘ÞÏŠÞσÞÏ|ÞÏuÞÏnÞÏgÞÏ`ÞÏYÞÏRÞÏKÞÏDÞÏ=ÞÏ6ÞÏ/ÞÏ(ÞÏ!ÞÏÞÏÞÏ ÞÏÞÏþÝÏ÷ÝÏðÝÏéÝÏâÝÏÛÝÏÔÝÏÍÝÏÆÝÏ¿ÝϸÝϱÝϪÝÏ£ÝÏœÝÏ•ÝÏŽÝχÝÏ€ÝÏyÝÏrÝÏkÝÏdÝÏ]ÝÏVÝÏOÝÏHÝÏAÝÏ:ÝÏ3ÝÏ,ÝÏ%ÝÏÝÏÝÏÝÏ ÝÏÝÏûÜÏôÜÏíÜÏæÜÏßÜÏØÜÏÑÜÏÊÜÏÃÜϼÜϵÜÏ®ÜϧÜÏ ÜÏ™ÜÏ’ÜÏ‹ÜÏ„ÜÏ}ÜÏvÜÏoÜÏhÜÏaÜÏZÜÏSÜÏLÜÏEÜÏ>ÜÏ7ÜÏ0ÜÏ)ÜÏ"ÜÏÜÏÜÏ ÜÏÜÏÿÛÏøÛÏñÛÏêÛÏãÛÏÜÛÏÕÛÏÎÛÏÇÛÏÀÛϹÛϲÛÏ«ÛϤÛÏÛÏ–ÛÏÛψÛÏÛÏzÛÏsÛÏlÛÏeÛÏ^ÛÏWÛÏPÛÏIÛÏBÛÏ;ÛÏ4ÛÏ-ÛÏ&ÛÏÛÏÛÏÛÏ ÛÏÛÏüÚÏõÚÏîÚÏçÚÏàÚÏÙÚÏÒÚÏËÚÏÄÚϽÚ϶ÚϯÚϨÚÏ¡ÚÏšÚÏ“ÚÏŒÚÏ…ÚÏ~ÚÏwÚÏpÚÏiÚÏbÚÏ[ÚÏTÚÏMÚÏFÚÏ?ÚÏ8ÚÏ1ÚÏ*ÚÏ#ÚÏÚÏÚÏÚÏÚÏÚÏùÙÏòÙÏëÙÏäÙÏÝÙÏÖÙÏÏÙÏÈÙÏÁÙϺÙϳÙϬÙÏ¥ÙÏžÙÏ—ÙÏÙωÙÏ‚ÙÏ{ÙÏtÙÏmÙÏfÙÏ_ÙÏXÙÏQÙÏJÙÏCÙÏ<ÙÏ5ÙÏ.ÙÏ'ÙÏ ÙÏÙÏÙÏ ÙÏÙÏýØÏöØÏïØÏèØÏáØÏÚØÏÓØÏÌØÏÅØÏ¾ØÏ·ØÏ°ØÏ©ØÏ¢ØÏ›ØÏ”ØÏØÏ†ØÏØÏxØÏqØÏjØÏcØÏ\ØÏUØÏNØÏGØÏ@ØÏ9ØÏ2ØÏ+ØÏ$ØÏØÏØÏØÏØÏØÏú×Ïó×Ïì×Ïå×ÏÞ×Ï××ÏÐ×ÏÉ×ÏÂ×Ï»×Ï´×Ï­×Ϧ×ÏŸ×Ϙ×Ï‘×ÏŠ×σ×Ï|×Ïu×Ïn×Ïg×Ï`×ÏY×ÏR×ÏK×ÏD×Ï=×Ï6×Ï/×Ï(×Ï!×Ï×Ï×Ï ×Ï×ÏþÖÏ÷ÖÏðÖÏéÖÏâÖÏÛÖÏÔÖÏÍÖÏÆÖÏ¿ÖϸÖϱÖϪÖÏ£ÖÏœÖÏ•ÖÏŽÖχÖÏ€ÖÏyÖÏrÖÏkÖÏdÖÏ]ÖÏVÖÏOÖÏHÖÏAÖÏ:ÖÏ3ÖÏ,ÖÏ%ÖÏÖÏÖÏÖÏ ÖÏÖÏûÕÏôÕÏíÕÏæÕÏßÕÏØÕÏÑÕÏÊÕÏÃÕϼÕϵÕÏ®ÕϧÕÏ ÕÏ™ÕÏ’ÕÏ‹ÕÏ„ÕÏ}ÕÏvÕÏoÕÏhÕÏaÕÏZÕÏSÕÏLÕÏEÕÏ>ÕÏ7ÕÏ0ÕÏ)ÕÏ"ÕÏÕÏÕÏ ÕÏÕÏÿÔÏøÔÏñÔÏêÔÏãÔÏÜÔÏÕÔÏÎÔÏÇÔÏÀÔϹÔϲÔÏ«ÔϤÔÏÔÏ–ÔÏÔψÔÏÔÏzÔÏsÔÏlÔÏeÔÏ^ÔÏWÔÏPÔÏIÔÏBÔÏ;ÔÏ4ÔÏ-ÔÏ&ÔÏÔÏÔÏÔÏ ÔÏÔÏüÓÏõÓÏîÓÏçÓÏàÓÏÙÓÏÒÓÏËÓÏÄÓϽÓ϶ÓϯÓϨÓÏ¡ÓÏšÓÏ“ÓÏŒÓÏ…ÓÏ~ÓÏwÓÏpÓÏiÓÏbÓÏ[ÓÏTÓÏMÓÏFÓÏ?ÓÏ8ÓÏ1ÓÏ*ÓÏ#ÓÏÓÏÓÏÓÏÓÏÓÏùÒÏòÒÏëÒÏäÒÏÝÒÏÖÒÏÏÒÏÈÒÏÁÒϺÒϳÒϬÒÏ¥ÒÏžÒÏ—ÒÏÒωÒÏ‚ÒÏ{ÒÏtÒÏmÒÏfÒÏ_ÒÏXÒÏQÒÏJÒÏCÒÏ<ÒÏ5ÒÏ.ÒÏ'ÒÏ ÒÏÒÏÒÏ ÒÏÒÏýÑÏöÑÏïÑÏèÑÏáÑÏÚÑÏÓÑÏÌÑÏÅÑϾÑÏ·ÑϰÑÏ©ÑÏ¢ÑÏ›ÑÏ”ÑÏÑφÑÏÑÏxÑÏqÑÏjÑÏcÑÏ\ÑÏUÑÏNÑÏGÑÏ@ÑÏ9ÑÏ2ÑÏ+ÑÏ$ÑÏÑÏÑÏÑÏÑÏÑÏúÐÏóÐÏìÐÏåÐÏÞÐÏ×ÐÏÐÐÏÉÐÏÂÐÏ»ÐÏ´ÐÏ­ÐϦÐÏŸÐϘÐÏ‘ÐÏŠÐσÐÏ|ÐÏuÐÏnÐÏgÐÏ`ÐÏYÐÏRÐÏKÐÏDÐÏ=ÐÏ6ÐÏ/ÐÏ(ÐÏ!ÐÏÐÏÐÏ ÐÏÐÏþÏÏ÷ÏÏðÏÏéÏÏâÏÏÛÏÏÔÏÏÍÏÏÆÏÏ¿ÏϸÏϱÏϪÏÏ£ÏÏœÏÏ•ÏÏŽÏχÏÏ€ÏÏyÏÏrÏÏkÏÏdÏÏ]ÏÏVÏÏOÏÏHÏÏAÏÏ:ÏÏ3ÏÏ,ÏÏ%ÏÏÏÏÏÏÏÏ ÏÏÏÏûÎÏôÎÏíÎÏæÎÏßÎÏØÎÏÑÎÏÊÎÏÃÎϼÎϵÎÏ®ÎϧÎÏ ÎÏ™ÎÏ’ÎÏ‹ÎÏ„ÎÏ}ÎÏvÎÏoÎÏhÎÏaÎÏZÎÏSÎÏLÎÏEÎÏ>ÎÏ7ÎÏ0ÎÏ)ÎÏ"ÎÏÎÏÎÏ ÎÏÎÏÿÍÏøÍÏñÍÏêÍÏãÍÏÜÍÏÕÍÏÎÍÏÇÍÏÀÍϹÍϲÍÏ«ÍϤÍÏÍÏ–ÍÏÍψÍÏÍÏzÍÏsÍÏlÍÏeÍÏ^ÍÏWÍÏPÍÏIÍÏBÍÏ;ÍÏ4ÍÏ-ÍÏ&ÍÏÍÏÍÏÍÏ ÍÏÍÏüÌÏõÌÏîÌÏçÌÏàÌÏÙÌÏÒÌÏËÌÏÄÌϽÌ϶ÌϯÌϨÌÏ¡ÌÏšÌÏ“ÌÏŒÌÏ…ÌÏ~ÌÏwÌÏpÌÏiÌÏbÌÏ[ÌÏTÌÏMÌÏFÌÏ?ÌÏ8ÌÏ1ÌÏ*ÌÏ#ÌÏÌÏÌÏÌÏÌÏÌÏùËÏòËÏëËÏäËÏÝËÏÖËÏÏËÏÈËÏÁËϺËϳËϬËÏ¥ËÏžËÏ—ËÏËωËÏ‚ËÏ{ËÏtËÏmËÏfËÏ_ËÏXËÏQËÏJËÏCËÏ<ËÏ5ËÏ.ËÏ'ËÏ ËÏËÏËÏ ËÏËÏýÊÏöÊÏïÊÏèÊÏáÊÏÚÊÏÓÊÏÌÊÏÅÊϾÊÏ·ÊϰÊÏ©ÊÏ¢ÊÏ›ÊÏ”ÊÏÊφÊÏÊÏxÊÏqÊÏjÊÏcÊÏ\ÊÏUÊÏNÊÏGÊÏ@ÊÏ9ÊÏ2ÊÏ+ÊÏ$ÊÏÊÏÊÏÊÏÊÏÊÏúÉÏóÉÏìÉÏåÉÏÞÉÏ×ÉÏÐÉÏÉÉÏÂÉÏ»ÉÏ´ÉÏ­ÉϦÉÏŸÉϘÉÏ‘ÉÏŠÉσÉÏ|ÉÏuÉÏnÉÏgÉÏ`ÉÏYÉÏRÉÏKÉÏDÉÏ=ÉÏ6ÉÏ/ÉÏ(ÉÏ!ÉÏÉÏÉÏ ÉÏÉÏþÈÏ÷ÈÏðÈÏéÈÏâÈÏÛÈÏÔÈÏÍÈÏÆÈÏ¿ÈϸÈϱÈϪÈÏ£ÈÏœÈÏ•ÈÏŽÈχÈÏ€ÈÏyÈÏrÈÏkÈÏdÈÏ]ÈÏVÈÏOÈÏHÈÏAÈÏ:ÈÏ3ÈÏ,ÈÏ%ÈÏÈÏÈÏÈÏ ÈÏÈÏûÇÏôÇÏíÇÏæÇÏßÇÏØÇÏÑÇÏÊÇÏÃÇϼÇϵÇÏ®ÇϧÇÏ ÇÏ™ÇÏ’ÇÏ‹ÇÏ„ÇÏ}ÇÏvÇÏoÇÏhÇÏaÇÏZÇÏSÇÏLÇÏEÇÏ>ÇÏ7ÇÏ0ÇÏ)ÇÏ"ÇÏÇÏÇÏ ÇÏÇÏÿÆÏøÆÏñÆÏêÆÏãÆÏÜÆÏÕÆÏÎÆÏÇÆÏÀÆÏ¹ÆÏ²ÆÏ«ÆÏ¤ÆÏÆÏ–ÆÏÆÏˆÆÏÆÏzÆÏsÆÏlÆÏeÆÏ^ÆÏWÆÏPÆÏIÆÏBÆÏ;ÆÏ4ÆÏ-ÆÏ&ÆÏÆÏÆÏÆÏ ÆÏÆÏüÅÏõÅÏîÅÏçÅÏàÅÏÙÅÏÒÅÏËÅÏÄÅϽÅ϶ÅϯÅϨÅÏ¡ÅÏšÅÏ“ÅÏŒÅÏ…ÅÏ~ÅÏwÅÏpÅÏiÅÏbÅÏ[ÅÏTÅÏMÅÏFÅÏ?ÅÏ8ÅÏ1ÅÏ*ÅÏ#ÅÏÅÏÅÏÅÏÅÏÅÏùÄÏòÄÏëÄÏäÄÏÝÄÏÖÄÏÏÄÏÈÄÏÁÄϺÄϳÄϬÄÏ¥ÄÏžÄÏ—ÄÏÄωÄÏ‚ÄÏ{ÄÏtÄÏmÄÏfÄÏ_ÄÏXÄÏQÄÏJÄÏCÄÏ<ÄÏ5ÄÏ.ÄÏ'ÄÏ ÄÏÄÏÄÏ ÄÏÄÏýÃÏöÃÏïÃÏèÃÏáÃÏÚÃÏÓÃÏÌÃÏÅÃϾÃÏ·ÃϰÃÏ©ÃÏ¢ÃÏ›ÃÏ”ÃÏÃφÃÏÃÏxÃÏqÃÏjÃÏcÃÏ\ÃÏUÃÏNÃÏGÃÏ@ÃÏ9ÃÏ2ÃÏ+ÃÏ$ÃÏÃÏÃÏÃÏÃÏÃÏúÂÏóÂÏìÂÏåÂÏÞÂÏ×ÂÏÐÂÏÉÂÏÂÂÏ»ÂÏ´ÂÏ­ÂϦÂÏŸÂϘÂÏ‘ÂÏŠÂσÂÏ|ÂÏuÂÏnÂÏgÂÏ`ÂÏYÂÏRÂÏKÂÏDÂÏ=ÂÏ6ÂÏ/ÂÏ(ÂÏ!ÂÏÂÏÂÏ ÂÏÂÏþÁÏ÷ÁÏðÁÏéÁÏâÁÏÛÁÏÔÁÏÍÁÏÆÁÏ¿ÁϸÁϱÁϪÁÏ£ÁÏœÁÏ•ÁÏŽÁχÁÏ€ÁÏyÁÏrÁÏkÁÏdÁÏ]ÁÏVÁÏOÁÏHÁÏAÁÏ:ÁÏ3ÁÏ,ÁÏ%ÁÏÁÏÁÏÁÏ ÁÏÁÏûÀÏôÀÏíÀÏæÀÏßÀÏØÀÏÑÀÏÊÀÏÃÀϼÀϵÀÏ®ÀϧÀÏ ÀÏ™ÀÏ’ÀÏ‹ÀÏ„ÀÏ}ÀÏvÀÏoÀÏhÀÏaÀÏZÀÏSÀÏLÀÏEÀÏ>ÀÏ7ÀÏ0ÀÏ)ÀÏ"ÀÏÀÏÀÏ ÀÏÀÏÿ¿Ïø¿Ïñ¿Ïê¿Ïã¿ÏÜ¿ÏÕ¿ÏοÏÇ¿ÏÀ¿Ï¹¿Ï²¿Ï«¿Ï¤¿Ï¿Ï–¿Ï¿Ïˆ¿Ï¿Ïz¿Ïs¿Ïl¿Ïe¿Ï^¿ÏW¿ÏP¿ÏI¿ÏB¿Ï;¿Ï4¿Ï-¿Ï&¿Ï¿Ï¿Ï¿Ï ¿Ï¿Ïü¾Ïõ¾Ïî¾Ïç¾Ïà¾ÏÙ¾ÏÒ¾Ï˾ÏľÏ½¾Ï¶¾Ï¯¾Ï¨¾Ï¡¾Ïš¾Ï“¾ÏŒ¾Ï…¾Ï~¾Ïw¾Ïp¾Ïi¾Ïb¾Ï[¾ÏT¾ÏM¾ÏF¾Ï?¾Ï8¾Ï1¾Ï*¾Ï#¾Ï¾Ï¾Ï¾Ï¾Ï¾Ïù½Ïò½Ïë½Ïä½ÏݽÏÖ½ÏϽÏȽÏÁ½Ïº½Ï³½Ï¬½Ï¥½Ïž½Ï—½Ï½Ï‰½Ï‚½Ï{½Ït½Ïm½Ïf½Ï_½ÏX½ÏQ½ÏJ½ÏC½Ï<½Ï5½Ï.½Ï'½Ï ½Ï½Ï½Ï ½Ï½Ïý¼Ïö¼Ïï¼Ïè¼Ïá¼ÏÚ¼ÏÓ¼Ï̼ÏżÏ¾¼Ï·¼Ï°¼Ï©¼Ï¢¼Ï›¼Ï”¼Ï¼Ï†¼Ï¼Ïx¼Ïq¼Ïj¼Ïc¼Ï\¼ÏU¼ÏN¼ÏG¼Ï@¼Ï9¼Ï2¼Ï+¼Ï$¼Ï¼Ï¼Ï¼Ï¼Ï¼Ïú»Ïó»Ïì»Ïå»ÏÞ»Ï×»ÏлÏɻϻϻ»Ï´»Ï­»Ï¦»ÏŸ»Ï˜»Ï‘»ÏŠ»Ïƒ»Ï|»Ïu»Ïn»Ïg»Ï`»ÏY»ÏR»ÏK»ÏD»Ï=»Ï6»Ï/»Ï(»Ï!»Ï»Ï»Ï »Ï»ÏþºÏ÷ºÏðºÏéºÏâºÏÛºÏÔºÏͺÏƺÏ¿ºÏ¸ºÏ±ºÏªºÏ£ºÏœºÏ•ºÏŽºÏ‡ºÏ€ºÏyºÏrºÏkºÏdºÏ]ºÏVºÏOºÏHºÏAºÏ:ºÏ3ºÏ,ºÏ%ºÏºÏºÏºÏ ºÏºÏû¹Ïô¹Ïí¹Ïæ¹Ïß¹ÏعÏѹÏʹÏùϼ¹Ïµ¹Ï®¹Ï§¹Ï ¹Ï™¹Ï’¹Ï‹¹Ï„¹Ï}¹Ïv¹Ïo¹Ïh¹Ïa¹ÏZ¹ÏS¹ÏL¹ÏE¹Ï>¹Ï7¹Ï0¹Ï)¹Ï"¹Ï¹Ï¹Ï ¹Ï¹Ïÿ¸Ïø¸Ïñ¸Ïê¸Ïã¸ÏܸÏÕ¸ÏθÏǸÏÀ¸Ï¹¸Ï²¸Ï«¸Ï¤¸Ï¸Ï–¸Ï¸Ïˆ¸Ï¸Ïz¸Ïs¸Ïl¸Ïe¸Ï^¸ÏW¸ÏP¸ÏI¸ÏB¸Ï;¸Ï4¸Ï-¸Ï&¸Ï¸Ï¸Ï¸Ï ¸Ï¸Ïü·Ïõ·Ïî·Ïç·Ïà·ÏÙ·ÏÒ·ÏË·ÏķϽ·Ï¶·Ï¯·Ï¨·Ï¡·Ïš·Ï“·ÏŒ·Ï…·Ï~·Ïw·Ïp·Ïi·Ïb·Ï[·ÏT·ÏM·ÏF·Ï?·Ï8·Ï1·Ï*·Ï#·Ï·Ï·Ï·Ï·Ï·Ïù¶Ïò¶Ïë¶Ïä¶ÏݶÏÖ¶Ï϶ÏȶÏÁ¶Ïº¶Ï³¶Ï¬¶Ï¥¶Ïž¶Ï—¶Ï¶Ï‰¶Ï‚¶Ï{¶Ït¶Ïm¶Ïf¶Ï_¶ÏX¶ÏQ¶ÏJ¶ÏC¶Ï<¶Ï5¶Ï.¶Ï'¶Ï ¶Ï¶Ï¶Ï ¶Ï¶ÏýµÏöµÏïµÏèµÏáµÏÚµÏÓµÏ̵ÏŵϾµÏ·µÏ°µÏ©µÏ¢µÏ›µÏ”µÏµÏ†µÏµÏxµÏqµÏjµÏcµÏ\µÏUµÏNµÏGµÏ@µÏ9µÏ2µÏ+µÏ$µÏµÏµÏµÏµÏµÏú´Ïó´Ïì´Ïå´ÏÞ´Ï×´ÏдÏÉ´Ï´Ï»´Ï´´Ï­´Ï¦´ÏŸ´Ï˜´Ï‘´ÏŠ´Ïƒ´Ï|´Ïu´Ïn´Ïg´Ï`´ÏY´ÏR´ÏK´ÏD´Ï=´Ï6´Ï/´Ï(´Ï!´Ï´Ï´Ï ´Ï´Ïþ³Ï÷³Ïð³Ïé³Ïâ³ÏÛ³ÏÔ³ÏͳÏƳÏ¿³Ï¸³Ï±³Ïª³Ï£³Ïœ³Ï•³Ï޳χ³Ï€³Ïy³Ïr³Ïk³Ïd³Ï]³ÏV³ÏO³ÏH³ÏA³Ï:³Ï3³Ï,³Ï%³Ï³Ï³Ï³Ï ³Ï³Ïû²Ïô²Ïí²Ïæ²Ïß²ÏزÏѲÏʲÏòϼ²Ïµ²Ï®²Ï§²Ï ²Ï™²Ï’²Ï‹²Ï„²Ï}²Ïv²Ïo²Ïh²Ïa²ÏZ²ÏS²ÏL²ÏE²Ï>²Ï7²Ï0²Ï)²Ï"²Ï²Ï²Ï ²Ï²Ïÿ±Ïø±Ïñ±Ïê±Ïã±ÏܱÏÕ±ÏαÏDZÏÀ±Ï¹±Ï²±Ï«±Ï¤±Ï±Ï–±Ï±Ïˆ±Ï±Ïz±Ïs±Ïl±Ïe±Ï^±ÏW±ÏP±ÏI±ÏB±Ï;±Ï4±Ï-±Ï&±Ï±Ï±Ï±Ï ±Ï±Ïü°Ïõ°Ïî°Ïç°Ïà°ÏÙ°ÏÒ°Ï˰ÏİϽ°Ï¶°Ï¯°Ï¨°Ï¡°Ïš°Ï“°ÏŒ°Ï…°Ï~°Ïw°Ïp°Ïi°Ïb°Ï[°ÏT°ÏM°ÏF°Ï?°Ï8°Ï1°Ï*°Ï#°Ï°Ï°Ï°Ï°Ï°Ïù¯Ïò¯Ïë¯Ïä¯ÏݯÏÖ¯ÏϯÏȯÏÁ¯Ïº¯Ï³¯Ï¬¯Ï¥¯Ïž¯Ï—¯Ï¯Ï‰¯Ï‚¯Ï{¯Ït¯Ïm¯Ïf¯Ï_¯ÏX¯ÏQ¯ÏJ¯ÏC¯Ï<¯Ï5¯Ï.¯Ï'¯Ï ¯Ï¯Ï¯Ï ¯Ï¯Ïý®Ïö®Ïï®Ïè®Ïá®ÏÚ®ÏÓ®ÏÌ®ÏŮϾ®Ï·®Ï°®Ï©®Ï¢®Ï›®Ï”®Ï®Ï†®Ï®Ïx®Ïq®Ïj®Ïc®Ï\®ÏU®ÏN®ÏG®Ï@®Ï9®Ï2®Ï+®Ï$®Ï®Ï®Ï®Ï®Ï®Ïú­Ïó­Ïì­Ïå­ÏÞ­Ï×­ÏЭÏÉ­Ï­Ï»­Ï´­Ï­­Ï¦­ÏŸ­Ï˜­Ï‘­ÏŠ­Ïƒ­Ï|­Ïu­Ïn­Ïg­Ï`­ÏY­ÏR­ÏK­ÏD­Ï=­Ï6­Ï/­Ï(­Ï!­Ï­Ï­Ï ­Ï­Ïþ¬Ï÷¬Ïð¬Ïé¬Ïâ¬ÏÛ¬ÏÔ¬ÏͬÏƬÏ¿¬Ï¸¬Ï±¬Ïª¬Ï£¬Ïœ¬Ï•¬Ïެχ¬Ï€¬Ïy¬Ïr¬Ïk¬Ïd¬Ï]¬ÏV¬ÏO¬ÏH¬ÏA¬Ï:¬Ï3¬Ï,¬Ï%¬Ï¬Ï¬Ï¬Ï ¬Ï¬Ïû«Ïô«Ïí«Ïæ«Ïß«ÏØ«ÏÑ«ÏÊ«Ïëϼ«Ïµ«Ï®«Ï§«Ï «Ï™«Ï’«Ï‹«Ï„«Ï}«Ïv«Ïo«Ïh«Ïa«ÏZ«ÏS«ÏL«ÏE«Ï>«Ï7«Ï0«Ï)«Ï"«Ï«Ï«Ï «Ï«ÏÿªÏøªÏñªÏêªÏãªÏܪÏÕªÏΪÏǪÏÀªÏ¹ªÏ²ªÏ«ªÏ¤ªÏªÏ–ªÏªÏˆªÏªÏzªÏsªÏlªÏeªÏ^ªÏWªÏPªÏIªÏBªÏ;ªÏ4ªÏ-ªÏ&ªÏªÏªÏªÏ ªÏªÏü©Ïõ©Ïî©Ïç©Ïà©ÏÙ©ÏÒ©ÏË©ÏĩϽ©Ï¶©Ï¯©Ï¨©Ï¡©Ïš©Ï“©ÏŒ©Ï…©Ï~©Ïw©Ïp©Ïi©Ïb©Ï[©ÏT©ÏM©ÏF©Ï?©Ï8©Ï1©Ï*©Ï#©Ï©Ï©Ï©Ï©Ï©Ïù¨Ïò¨Ïë¨Ïä¨ÏݨÏÖ¨ÏϨÏȨÏÁ¨Ïº¨Ï³¨Ï¬¨Ï¥¨Ïž¨Ï—¨Ï¨Ï‰¨Ï‚¨Ï{¨Ït¨Ïm¨Ïf¨Ï_¨ÏX¨ÏQ¨ÏJ¨ÏC¨Ï<¨Ï5¨Ï.¨Ï'¨Ï ¨Ï¨Ï¨Ï ¨Ï¨Ïý§Ïö§Ïï§Ïè§Ïá§ÏÚ§ÏÓ§Ï̧ÏŧϾ§Ï·§Ï°§Ï©§Ï¢§Ï›§Ï”§Ï§Ï†§Ï§Ïx§Ïq§Ïj§Ïc§Ï\§ÏU§ÏN§ÏG§Ï@§Ï9§Ï2§Ï+§Ï$§Ï§Ï§Ï§Ï§Ï§Ïú¦Ïó¦Ïì¦Ïå¦ÏÞ¦ÏצÏЦÏɦϦϻ¦Ï´¦Ï­¦Ï¦¦ÏŸ¦Ï˜¦Ï‘¦ÏЦσ¦Ï|¦Ïu¦Ïn¦Ïg¦Ï`¦ÏY¦ÏR¦ÏK¦ÏD¦Ï=¦Ï6¦Ï/¦Ï(¦Ï!¦Ï¦Ï¦Ï ¦Ï¦Ïþ¥Ï÷¥Ïð¥Ïé¥Ïâ¥ÏÛ¥ÏÔ¥ÏÍ¥ÏÆ¥Ï¿¥Ï¸¥Ï±¥Ïª¥Ï£¥Ïœ¥Ï•¥ÏŽ¥Ï‡¥Ï€¥Ïy¥Ïr¥Ïk¥Ïd¥Ï]¥ÏV¥ÏO¥ÏH¥ÏA¥Ï:¥Ï3¥Ï,¥Ï%¥Ï¥Ï¥Ï¥Ï ¥Ï¥Ïû¤Ïô¤Ïí¤Ïæ¤ÏߤÏؤÏѤÏʤÏäϼ¤Ïµ¤Ï®¤Ï§¤Ï ¤Ï™¤Ï’¤Ï‹¤Ï„¤Ï}¤Ïv¤Ïo¤Ïh¤Ïa¤ÏZ¤ÏS¤ÏL¤ÏE¤Ï>¤Ï7¤Ï0¤Ï)¤Ï"¤Ï¤Ï¤Ï ¤Ï¤Ïÿ£Ïø£Ïñ£Ïê£Ïã£ÏÜ£ÏÕ£ÏΣÏÇ£ÏÀ£Ï¹£Ï²£Ï«£Ï¤£Ï£Ï–£Ï£Ïˆ£Ï£Ïz£Ïs£Ïl£Ïe£Ï^£ÏW£ÏP£ÏI£ÏB£Ï;£Ï4£Ï-£Ï&£Ï£Ï£Ï£Ï £Ï£Ïü¢Ïõ¢Ïî¢Ïç¢Ïà¢ÏÙ¢ÏÒ¢ÏË¢ÏĢϽ¢Ï¶¢Ï¯¢Ï¨¢Ï¡¢Ïš¢Ï“¢ÏŒ¢Ï…¢Ï~¢Ïw¢Ïp¢Ïi¢Ïb¢Ï[¢ÏT¢ÏM¢ÏF¢Ï?¢Ï8¢Ï1¢Ï*¢Ï#¢Ï¢Ï¢Ï¢Ï¢Ï¢Ïù¡Ïò¡Ïë¡Ïä¡ÏÝ¡ÏÖ¡ÏÏ¡ÏÈ¡ÏÁ¡Ïº¡Ï³¡Ï¬¡Ï¥¡Ïž¡Ï—¡Ï¡Ï‰¡Ï‚¡Ï{¡Ït¡Ïm¡Ïf¡Ï_¡ÏX¡ÏQ¡ÏJ¡ÏC¡Ï<¡Ï5¡Ï.¡Ï'¡Ï ¡Ï¡Ï¡Ï ¡Ï¡Ïý Ïö Ïï Ïè Ïá ÏÚ ÏÓ ÏÌ ÏŠϾ Ï· Ï° Ï© Ï¢ Ï› Ï” Ï Ï† Ï Ïx Ïq Ïj Ïc Ï\ ÏU ÏN ÏG Ï@ Ï9 Ï2 Ï+ Ï$ Ï Ï Ï Ï Ï ÏúŸÏóŸÏìŸÏåŸÏÞŸÏןÏПÏÉŸÏŸÏ»ŸÏ´ŸÏ­ŸÏ¦ŸÏŸŸÏ˜ŸÏ‘ŸÏŠŸÏƒŸÏ|ŸÏuŸÏnŸÏgŸÏ`ŸÏYŸÏRŸÏKŸÏDŸÏ=ŸÏ6ŸÏ/ŸÏ(ŸÏ!ŸÏŸÏŸÏ ŸÏŸÏþžÏ÷žÏðžÏéžÏâžÏÛžÏÔžÏÍžÏÆžÏ¿žÏ¸žÏ±žÏªžÏ£žÏœžÏ•žÏŽžÏ‡žÏ€žÏyžÏržÏkžÏdžÏ]žÏVžÏOžÏHžÏAžÏ:žÏ3žÏ,žÏ%žÏžÏžÏžÏ žÏžÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿœÏøœÏñœÏêœÏãœÏÜœÏÕœÏΜÏÇœÏÀœÏ¹œÏ²œÏ«œÏ¤œÏœÏ–œÏœÏˆœÏœÏzœÏsœÏlœÏeœÏ^œÏWœÏPœÏIœÏBœÏ;œÏ4œÏ-œÏ&œÏœÏœÏœÏ œÏœÏü›Ïõ›Ïî›Ïç›Ïà›ÏÙ›ÏÒ›ÏË›ÏěϽ›Ï¶›Ï¯›Ï¨›Ï¡›Ïš›Ï“›ÏŒ›Ï…›Ï~›Ïw›Ïp›Ïi›Ïb›Ï[›ÏT›ÏM›ÏF›Ï?›Ï8›Ï1›Ï*›Ï#›Ï›Ï›Ï›Ï›Ï›ÏùšÏòšÏëšÏäšÏÝšÏÖšÏÏšÏÈšÏÁšÏºšÏ³šÏ¬šÏ¥šÏžšÏ—šÏšÏ‰šÏ‚šÏ{šÏtšÏmšÏfšÏ_šÏXšÏQšÏJšÏCšÏ<šÏ5šÏ.šÏ'šÏ šÏšÏšÏ šÏšÏý™Ïö™Ïï™Ïè™Ïá™ÏÚ™ÏÓ™ÏÌ™ÏřϾ™Ï·™Ï°™Ï©™Ï¢™Ï›™Ï”™Ï™Ï†™Ï™Ïx™Ïq™Ïj™Ïc™Ï\™ÏU™ÏN™ÏG™Ï@™Ï9™Ï2™Ï+™Ï$™Ï™Ï™Ï™Ï™Ï™Ïú˜Ïó˜Ïì˜Ïå˜ÏÞ˜ÏטÏИÏɘϘϻ˜Ï´˜Ï­˜Ï¦˜ÏŸ˜Ï˜˜Ï‘˜ÏŠ˜Ïƒ˜Ï|˜Ïu˜Ïn˜Ïg˜Ï`˜ÏY˜ÏR˜ÏK˜ÏD˜Ï=˜Ï6˜Ï/˜Ï(˜Ï!˜Ï˜Ï˜Ï ˜Ï˜Ïþ—Ï÷—Ïð—Ïé—Ïâ—ÏÛ—ÏÔ—ÏÍ—ÏÆ—Ï¿—ϸ—ϱ—Ϫ—Ï£—Ïœ—Ï•—ÏŽ—χ—Ï€—Ïy—Ïr—Ïk—Ïd—Ï]—ÏV—ÏO—ÏH—ÏA—Ï:—Ï3—Ï,—Ï%—Ï—Ï—Ï—Ï —Ï—Ïû–Ïô–Ïí–Ïæ–Ïß–ÏØ–ÏÑ–ÏÊ–ÏÖϼ–ϵ–Ï®–ϧ–Ï –Ï™–Ï’–Ï‹–Ï„–Ï}–Ïv–Ïo–Ïh–Ïa–ÏZ–ÏS–ÏL–ÏE–Ï>–Ï7–Ï0–Ï)–Ï"–Ï–Ï–Ï –Ï–Ïÿ•Ïø•Ïñ•Ïê•Ïã•ÏÜ•ÏÕ•ÏΕÏÇ•ÏÀ•Ϲ•ϲ•Ï«•Ϥ•ϕϖ•ϕψ•Ï•Ïz•Ïs•Ïl•Ïe•Ï^•ÏW•ÏP•ÏI•ÏB•Ï;•Ï4•Ï-•Ï&•Ï•Ï•Ï•Ï •Ï•Ïü”Ïõ”Ïî”Ïç”Ïà”ÏÙ”ÏÒ”ÏË”ÏĔϽ”϶”ϯ”Ϩ”Ï¡”Ïš”Ï“”ÏŒ”Ï…”Ï~”Ïw”Ïp”Ïi”Ïb”Ï[”ÏT”ÏM”ÏF”Ï?”Ï8”Ï1”Ï*”Ï#”ϔϔϔϔϔÏù“Ïò“Ïë“Ïä“ÏÝ“ÏÖ“ÏÏ“ÏÈ“ÏÁ“Ϻ“ϳ“Ϭ“Ï¥“Ïž“Ï—“ϓω“Ï‚“Ï{“Ït“Ïm“Ïf“Ï_“ÏX“ÏQ“ÏJ“ÏC“Ï<“Ï5“Ï.“Ï'“Ï “Ï“Ï“Ï “Ï“Ïý’Ïö’Ïï’Ïè’Ïá’ÏÚ’ÏÓ’ÏÌ’ÏŒϾ’Ï·’ϰ’Ï©’Ï¢’Ï›’Ï”’ϒφ’Ï’Ïx’Ïq’Ïj’Ïc’Ï\’ÏU’ÏN’ÏG’Ï@’Ï9’Ï2’Ï+’Ï$’Ï’Ï’Ï’Ï’Ï’Ïú‘Ïó‘Ïì‘Ïå‘ÏÞ‘ÏבÏБÏɑϑϻ‘Ï´‘Ï­‘Ϧ‘ÏŸ‘Ϙ‘Ï‘‘ÏŠ‘σ‘Ï|‘Ïu‘Ïn‘Ïg‘Ï`‘ÏY‘ÏR‘ÏK‘ÏD‘Ï=‘Ï6‘Ï/‘Ï(‘Ï!‘Ï‘Ï‘Ï ‘Ï‘ÏþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿŽÏøŽÏñŽÏêŽÏãŽÏÜŽÏÕŽÏÎŽÏÇŽÏÀŽÏ¹ŽÏ²ŽÏ«ŽÏ¤ŽÏŽÏ–ŽÏŽÏˆŽÏŽÏzŽÏsŽÏlŽÏeŽÏ^ŽÏWŽÏPŽÏIŽÏBŽÏ;ŽÏ4ŽÏ-ŽÏ&ŽÏŽÏŽÏŽÏ ŽÏŽÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùŒÏòŒÏëŒÏäŒÏÝŒÏÖŒÏÏŒÏÈŒÏÁŒÏºŒÏ³ŒÏ¬ŒÏ¥ŒÏžŒÏ—ŒÏŒÏ‰ŒÏ‚ŒÏ{ŒÏtŒÏmŒÏfŒÏ_ŒÏXŒÏQŒÏJŒÏCŒÏ<ŒÏ5ŒÏ.ŒÏ'ŒÏ ŒÏŒÏŒÏ ŒÏŒÏý‹Ïö‹Ïï‹Ïè‹Ïá‹ÏÚ‹ÏÓ‹ÏÌ‹ÏŋϾ‹Ï·‹Ï°‹Ï©‹Ï¢‹Ï›‹Ï”‹Ï‹Ï†‹Ï‹Ïx‹Ïq‹Ïj‹Ïc‹Ï\‹ÏU‹ÏN‹ÏG‹Ï@‹Ï9‹Ï2‹Ï+‹Ï$‹Ï‹Ï‹Ï‹Ï‹Ï‹ÏúŠÏóŠÏìŠÏåŠÏÞŠÏ׊ÏЊÏÉŠÏŠÏ»ŠÏ´ŠÏ­ŠÏ¦ŠÏŸŠÏ˜ŠÏ‘ŠÏŠŠÏƒŠÏ|ŠÏuŠÏnŠÏgŠÏ`ŠÏYŠÏRŠÏKŠÏDŠÏ=ŠÏ6ŠÏ/ŠÏ(ŠÏ!ŠÏŠÏŠÏ ŠÏŠÏþ‰Ï÷‰Ïð‰Ïé‰Ïâ‰ÏÛ‰ÏÔ‰Ï͉ÏƉÏ¿‰Ï¸‰Ï±‰Ïª‰Ï£‰Ïœ‰Ï•‰Ïމχ‰Ï€‰Ïy‰Ïr‰Ïk‰Ïd‰Ï]‰ÏV‰ÏO‰ÏH‰ÏA‰Ï:‰Ï3‰Ï,‰Ï%‰Ï‰Ï‰Ï‰Ï ‰Ï‰ÏûˆÏôˆÏíˆÏæˆÏ߈Ï؈ÏшÏʈÏÈϼˆÏµˆÏ®ˆÏ§ˆÏ ˆÏ™ˆÏ’ˆÏ‹ˆÏ„ˆÏ}ˆÏvˆÏoˆÏhˆÏaˆÏZˆÏSˆÏLˆÏEˆÏ>ˆÏ7ˆÏ0ˆÏ)ˆÏ"ˆÏˆÏˆÏ ˆÏˆÏÿ‡Ïø‡Ïñ‡Ïê‡Ïã‡Ï܇ÏՇϷÏLJÏÀ‡Ï¹‡Ï²‡Ï«‡Ï¤‡Ï‡Ï–‡Ï‡Ïˆ‡Ï‡Ïz‡Ïs‡Ïl‡Ïe‡Ï^‡ÏW‡ÏP‡ÏI‡ÏB‡Ï;‡Ï4‡Ï-‡Ï&‡Ï‡Ï‡Ï‡Ï ‡Ï‡Ïü†Ïõ†Ïî†Ïç†Ïà†ÏÙ†Ï҆ψÏĆϽ†Ï¶†Ï¯†Ï¨†Ï¡†Ïš†Ï“†ÏŒ†Ï…†Ï~†Ïw†Ïp†Ïi†Ïb†Ï[†ÏT†ÏM†ÏF†Ï?†Ï8†Ï1†Ï*†Ï#†Ï†Ï†Ï†Ï†Ï†Ïù…Ïò…Ïë…Ïä…ÏÝ…ÏÖ…ÏÏ…ÏÈ…ÏÁ…Ϻ…ϳ…Ϭ…Ï¥…Ïž…Ï—…υω…Ï‚…Ï{…Ït…Ïm…Ïf…Ï_…ÏX…ÏQ…ÏJ…ÏC…Ï<…Ï5…Ï.…Ï'…Ï …Ï…Ï…Ï …Ï…Ïý„Ïö„Ïï„Ïè„Ïá„ÏÚ„ÏÓ„ÏÌ„ÏńϾ„Ï·„ϰ„Ï©„Ï¢„Ï›„Ï”„τφ„Ï„Ïx„Ïq„Ïj„Ïc„Ï\„ÏU„ÏN„ÏG„Ï@„Ï9„Ï2„Ï+„Ï$„τττττÏúƒÏóƒÏìƒÏåƒÏÞƒÏ׃ÏЃÏɃσϻƒÏ´ƒÏ­ƒÏ¦ƒÏŸƒÏ˜ƒÏ‘ƒÏŠƒÏƒƒÏ|ƒÏuƒÏnƒÏgƒÏ`ƒÏYƒÏRƒÏKƒÏDƒÏ=ƒÏ6ƒÏ/ƒÏ(ƒÏ!ƒÏƒÏƒÏ ƒÏƒÏþ‚Ï÷‚Ïð‚Ïé‚Ïâ‚ÏÛ‚ÏÔ‚ÏÍ‚ÏÆ‚Ï¿‚ϸ‚ϱ‚Ϫ‚Ï£‚Ïœ‚Ï•‚ÏŽ‚χ‚Ï€‚Ïy‚Ïr‚Ïk‚Ïd‚Ï]‚ÏV‚ÏO‚ÏH‚ÏA‚Ï:‚Ï3‚Ï,‚Ï%‚Ï‚Ï‚Ï‚Ï ‚Ï‚ÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿ€Ïø€Ïñ€Ïê€Ïã€ÏÜ€ÏÕ€Ï΀ÏÇ€ÏÀ€Ï¹€Ï²€Ï«€Ï¤€Ï€Ï–€Ï€Ïˆ€Ï€Ïz€Ïs€Ïl€Ïe€Ï^€ÏW€ÏP€ÏI€ÏB€Ï;€Ï4€Ï-€Ï&€Ï€Ï€Ï€Ï €Ï€ÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏù~Ïò~Ïë~Ïä~ÏÝ~ÏÖ~ÏÏ~ÏÈ~ÏÁ~Ϻ~ϳ~Ϭ~Ï¥~Ïž~Ï—~Ï~ω~Ï‚~Ï{~Ït~Ïm~Ïf~Ï_~ÏX~ÏQ~ÏJ~ÏC~Ï<~Ï5~Ï.~Ï'~Ï ~Ï~Ï~Ï ~Ï~Ïý}Ïö}Ïï}Ïè}Ïá}ÏÚ}ÏÓ}ÏÌ}ÏÅ}Ͼ}Ï·}ϰ}Ï©}Ï¢}Ï›}Ï”}Ï}φ}Ï}Ïx}Ïq}Ïj}Ïc}Ï\}ÏU}ÏN}ÏG}Ï@}Ï9}Ï2}Ï+}Ï$}Ï}Ï}Ï}Ï}Ï}Ïú|Ïó|Ïì|Ïå|ÏÞ|Ï×|ÏÐ|ÏÉ|ÏÂ|Ï»|Ï´|Ï­|Ϧ|ÏŸ|Ϙ|Ï‘|ÏŠ|σ|Ï||Ïu|Ïn|Ïg|Ï`|ÏY|ÏR|ÏK|ÏD|Ï=|Ï6|Ï/|Ï(|Ï!|Ï|Ï|Ï |Ï|Ïþ{Ï÷{Ïð{Ïé{Ïâ{ÏÛ{ÏÔ{ÏÍ{ÏÆ{Ï¿{ϸ{ϱ{Ϫ{Ï£{Ïœ{Ï•{ÏŽ{χ{Ï€{Ïy{Ïr{Ïk{Ïd{Ï]{ÏV{ÏO{ÏH{ÏA{Ï:{Ï3{Ï,{Ï%{Ï{Ï{Ï{Ï {Ï{ÏûzÏôzÏízÏæzÏßzÏØzÏÑzÏÊzÏÃzϼzϵzÏ®zϧzÏ zÏ™zÏ’zÏ‹zÏ„zÏ}zÏvzÏozÏhzÏazÏZzÏSzÏLzÏEzÏ>zÏ7zÏ0zÏ)zÏ"zÏzÏzÏ zÏzÏÿyÏøyÏñyÏêyÏãyÏÜyÏÕyÏÎyÏÇyÏÀyϹyϲyÏ«yϤyÏyÏ–yÏyψyÏyÏzyÏsyÏlyÏeyÏ^yÏWyÏPyÏIyÏByÏ;yÏ4yÏ-yÏ&yÏyÏyÏyÏ yÏyÏüxÏõxÏîxÏçxÏàxÏÙxÏÒxÏËxÏÄxϽx϶xϯxϨxÏ¡xÏšxÏ“xÏŒxÏ…xÏ~xÏwxÏpxÏixÏbxÏ[xÏTxÏMxÏFxÏ?xÏ8xÏ1xÏ*xÏ#xÏxÏxÏxÏxÏxÏùwÏòwÏëwÏäwÏÝwÏÖwÏÏwÏÈwÏÁwϺwϳwϬwÏ¥wÏžwÏ—wÏwωwÏ‚wÏ{wÏtwÏmwÏfwÏ_wÏXwÏQwÏJwÏCwÏsÏ7sÏ0sÏ)sÏ"sÏsÏsÏ sÏsÏÿrÏørÏñrÏêrÏãrÏÜrÏÕrÏÎrÏÇrÏÀrϹrϲrÏ«rϤrÏrÏ–rÏrψrÏrÏzrÏsrÏlrÏerÏ^rÏWrÏPrÏIrÏBrÏ;rÏ4rÏ-rÏ&rÏrÏrÏrÏ rÏrÏüqÏõqÏîqÏçqÏàqÏÙqÏÒqÏËqÏÄqϽq϶qϯqϨqÏ¡qÏšqÏ“qÏŒqÏ…qÏ~qÏwqÏpqÏiqÏbqÏ[qÏTqÏMqÏFqÏ?qÏ8qÏ1qÏ*qÏ#qÏqÏqÏqÏqÏqÏùpÏòpÏëpÏäpÏÝpÏÖpÏÏpÏÈpÏÁpϺpϳpϬpÏ¥pÏžpÏ—pÏpωpÏ‚pÏ{pÏtpÏmpÏfpÏ_pÏXpÏQpÏJpÏCpÏlÏ7lÏ0lÏ)lÏ"lÏlÏlÏ lÏlÏÿkÏøkÏñkÏêkÏãkÏÜkÏÕkÏÎkÏÇkÏÀkϹkϲkÏ«kϤkÏkÏ–kÏkψkÏkÏzkÏskÏlkÏekÏ^kÏWkÏPkÏIkÏBkÏ;kÏ4kÏ-kÏ&kÏkÏkÏkÏ kÏkÏüjÏõjÏîjÏçjÏàjÏÙjÏÒjÏËjÏÄjϽj϶jϯjϨjÏ¡jÏšjÏ“jÏŒjÏ…jÏ~jÏwjÏpjÏijÏbjÏ[jÏTjÏMjÏFjÏ?jÏ8jÏ1jÏ*jÏ#jÏjÏjÏjÏjÏjÏùiÏòiÏëiÏäiÏÝiÏÖiÏÏiÏÈiÏÁiϺiϳiϬiÏ¥iÏžiÏ—iÏiωiÏ‚iÏ{iÏtiÏmiÏfiÏ_iÏXiÏQiÏJiÏCiÏeÏ7eÏ0eÏ)eÏ"eÏeÏeÏ eÏeÏÿdÏødÏñdÏêdÏãdÏÜdÏÕdÏÎdÏÇdÏÀdϹdϲdÏ«dϤdÏdÏ–dÏdψdÏdÏzdÏsdÏldÏedÏ^dÏWdÏPdÏIdÏBdÏ;dÏ4dÏ-dÏ&dÏdÏdÏdÏ dÏdÏücÏõcÏîcÏçcÏàcÏÙcÏÒcÏËcÏÄcϽc϶cϯcϨcÏ¡cÏšcÏ“cÏŒcÏ…cÏ~cÏwcÏpcÏicÏbcÏ[cÏTcÏMcÏFcÏ?cÏ8cÏ1cÏ*cÏ#cÏcÏcÏcÏcÏcÏùbÏòbÏëbÏäbÏÝbÏÖbÏÏbÏÈbÏÁbϺbϳbϬbÏ¥bÏžbÏ—bÏbωbÏ‚bÏ{bÏtbÏmbÏfbÏ_bÏXbÏQbÏJbÏCbÏ^Ï7^Ï0^Ï)^Ï"^Ï^Ï^Ï ^Ï^Ïÿ]Ïø]Ïñ]Ïê]Ïã]ÏÜ]ÏÕ]ÏÎ]ÏÇ]ÏÀ]Ϲ]ϲ]Ï«]Ϥ]Ï]Ï–]Ï]ψ]Ï]Ïz]Ïs]Ïl]Ïe]Ï^]ÏW]ÏP]ÏI]ÏB]Ï;]Ï4]Ï-]Ï&]Ï]Ï]Ï]Ï ]Ï]Ïü\Ïõ\Ïî\Ïç\Ïà\ÏÙ\ÏÒ\ÏË\ÏÄ\Ͻ\϶\ϯ\Ϩ\Ï¡\Ïš\Ï“\ÏŒ\Ï…\Ï~\Ïw\Ïp\Ïi\Ïb\Ï[\ÏT\ÏM\ÏF\Ï?\Ï8\Ï1\Ï*\Ï#\Ï\Ï\Ï\Ï\Ï\Ïù[Ïò[Ïë[Ïä[ÏÝ[ÏÖ[ÏÏ[ÏÈ[ÏÁ[Ϻ[ϳ[Ϭ[Ï¥[Ïž[Ï—[Ï[ω[Ï‚[Ï{[Ït[Ïm[Ïf[Ï_[ÏX[ÏQ[ÏJ[ÏC[Ï<[Ï5[Ï.[Ï'[Ï [Ï[Ï[Ï [Ï[ÏýZÏöZÏïZÏèZÏáZÏÚZÏÓZÏÌZÏÅZϾZÏ·ZϰZÏ©ZÏ¢ZÏ›ZÏ”ZÏZφZÏZÏxZÏqZÏjZÏcZÏ\ZÏUZÏNZÏGZÏ@ZÏ9ZÏ2ZÏ+ZÏ$ZÏZÏZÏZÏZÏZÏúYÏóYÏìYÏåYÏÞYÏ×YÏÐYÏÉYÏÂYÏ»YÏ´YÏ­YϦYÏŸYϘYÏ‘YÏŠYσYÏ|YÏuYÏnYÏgYÏ`YÏYYÏRYÏKYÏDYÏ=YÏ6YÏ/YÏ(YÏ!YÏYÏYÏ YÏYÏþXÏ÷XÏðXÏéXÏâXÏÛXÏÔXÏÍXÏÆXÏ¿XϸXϱXϪXÏ£XÏœXÏ•XÏŽXχXÏ€XÏyXÏrXÏkXÏdXÏ]XÏVXÏOXÏHXÏAXÏ:XÏ3XÏ,XÏ%XÏXÏXÏXÏ XÏXÏûWÏôWÏíWÏæWÏßWÏØWÏÑWÏÊWÏÃWϼWϵWÏ®WϧWÏ WÏ™WÏ’WÏ‹WÏ„WÏ}WÏvWÏoWÏhWÏaWÏZWÏSWÏLWÏEWÏ>WÏ7WÏ0WÏ)WÏ"WÏWÏWÏ WÏWÏÿVÏøVÏñVÏêVÏãVÏÜVÏÕVÏÎVÏÇVÏÀVϹVϲVÏ«VϤVÏVÏ–VÏVψVÏVÏzVÏsVÏlVÏeVÏ^VÏWVÏPVÏIVÏBVÏ;VÏ4VÏ-VÏ&VÏVÏVÏVÏ VÏVÏüUÏõUÏîUÏçUÏàUÏÙUÏÒUÏËUÏÄUϽU϶UϯUϨUÏ¡UÏšUÏ“UÏŒUÏ…UÏ~UÏwUÏpUÏiUÏbUÏ[UÏTUÏMUÏFUÏ?UÏ8UÏ1UÏ*UÏ#UÏUÏUÏUÏUÏUÏùTÏòTÏëTÏäTÏÝTÏÖTÏÏTÏÈTÏÁTϺTϳTϬTÏ¥TÏžTÏ—TÏTωTÏ‚TÏ{TÏtTÏmTÏfTÏ_TÏXTÏQTÏJTÏCTÏPÏ7PÏ0PÏ)PÏ"PÏPÏPÏ PÏPÏÿOÏøOÏñOÏêOÏãOÏÜOÏÕOÏÎOÏÇOÏÀOϹOϲOÏ«OϤOÏOÏ–OÏOψOÏOÏzOÏsOÏlOÏeOÏ^OÏWOÏPOÏIOÏBOÏ;OÏ4OÏ-OÏ&OÏOÏOÏOÏ OÏOÏüNÏõNÏîNÏçNÏàNÏÙNÏÒNÏËNÏÄNϽN϶NϯNϨNÏ¡NÏšNÏ“NÏŒNÏ…NÏ~NÏwNÏpNÏiNÏbNÏ[NÏTNÏMNÏFNÏ?NÏ8NÏ1NÏ*NÏ#NÏNÏNÏNÏNÏNÏùMÏòMÏëMÏäMÏÝMÏÖMÏÏMÏÈMÏÁMϺMϳMϬMÏ¥MÏžMÏ—MÏMωMÏ‚MÏ{MÏtMÏmMÏfMÏ_MÏXMÏQMÏJMÏCMÏIÏ7IÏ0IÏ)IÏ"IÏIÏIÏ IÏIÏÿHÏøHÏñHÏêHÏãHÏÜHÏÕHÏÎHÏÇHÏÀHϹHϲHÏ«HϤHÏHÏ–HÏHψHÏHÏzHÏsHÏlHÏeHÏ^HÏWHÏPHÏIHÏBHÏ;HÏ4HÏ-HÏ&HÏHÏHÏHÏ HÏHÏüGÏõGÏîGÏçGÏàGÏÙGÏÒGÏËGÏÄGϽG϶GϯGϨGÏ¡GÏšGÏ“GÏŒGÏ…GÏ~GÏwGÏpGÏiGÏbGÏ[GÏTGÏMGÏFGÏ?GÏ8GÏ1GÏ*GÏ#GÏGÏGÏGÏGÏGÏùFÏòFÏëFÏäFÏÝFÏÖFÏÏFÏÈFÏÁFϺFϳFϬFÏ¥FÏžFÏ—FÏFωFÏ‚FÏ{FÏtFÏmFÏfFÏ_FÏXFÏQFÏJFÏCFÏBÏ7BÏ0BÏ)BÏ"BÏBÏBÏ BÏBÏÿAÏøAÏñAÏêAÏãAÏÜAÏÕAÏÎAÏÇAÏÀAϹAϲAÏ«AϤAÏAÏ–AÏAψAÏAÏzAÏsAÏlAÏeAÏ^AÏWAÏPAÏIAÏBAÏ;AÏ4AÏ-AÏ&AÏAÏAÏAÏ AÏAÏü@Ïõ@Ïî@Ïç@Ïà@ÏÙ@ÏÒ@ÏË@ÏÄ@Ͻ@϶@ϯ@Ϩ@Ï¡@Ïš@Ï“@ÏŒ@Ï…@Ï~@Ïw@Ïp@Ïi@Ïb@Ï[@ÏT@ÏM@ÏF@Ï?@Ï8@Ï1@Ï*@Ï#@Ï@Ï@Ï@Ï@Ï@Ïù?Ïò?Ïë?Ïä?ÏÝ?ÏÖ?ÏÏ?ÏÈ?ÏÁ?Ϻ?ϳ?Ϭ?Ï¥?Ïž?Ï—?Ï?ω?Ï‚?Ï{?Ït?Ïm?Ïf?Ï_?ÏX?ÏQ?ÏJ?ÏC?ÏÏö>Ïï>Ïè>Ïá>ÏÚ>ÏÓ>ÏÌ>ÏÅ>Ͼ>Ï·>ϰ>Ï©>Ï¢>Ï›>Ï”>Ï>φ>Ï>Ïx>Ïq>Ïj>Ïc>Ï\>ÏU>ÏN>ÏG>Ï@>Ï9>Ï2>Ï+>Ï$>Ï>Ï>Ï>Ï>Ï>Ïú=Ïó=Ïì=Ïå=ÏÞ=Ï×=ÏÐ=ÏÉ=ÏÂ=Ï»=Ï´=Ï­=Ϧ=ÏŸ=Ϙ=Ï‘=ÏŠ=σ=Ï|=Ïu=Ïn=Ïg=Ï`=ÏY=ÏR=ÏK=ÏD=Ï==Ï6=Ï/=Ï(=Ï!=Ï=Ï=Ï =Ï=Ïþ<Ï÷<Ïð<Ïé<Ïâ<ÏÛ<ÏÔ<ÏÍ<ÏÆ<Ï¿<ϸ<ϱ<Ϫ<Ï£<Ïœ<Ï•<ÏŽ<χ<Ï€<Ïy<Ïr<Ïk<Ïd<Ï]<ÏV<ÏO<ÏH<ÏA<Ï:<Ï3<Ï,<Ï%<Ï<Ï<Ï<Ï <Ï<Ïû;Ïô;Ïí;Ïæ;Ïß;ÏØ;ÏÑ;ÏÊ;ÏÃ;ϼ;ϵ;Ï®;ϧ;Ï ;Ï™;Ï’;Ï‹;Ï„;Ï};Ïv;Ïo;Ïh;Ïa;ÏZ;ÏS;ÏL;ÏE;Ï>;Ï7;Ï0;Ï);Ï";Ï;Ï;Ï ;Ï;Ïÿ:Ïø:Ïñ:Ïê:Ïã:ÏÜ:ÏÕ:ÏÎ:ÏÇ:ÏÀ:Ϲ:ϲ:Ï«:Ϥ:Ï:Ï–:Ï:ψ:Ï:Ïz:Ïs:Ïl:Ïe:Ï^:ÏW:ÏP:ÏI:ÏB:Ï;:Ï4:Ï-:Ï&:Ï:Ï:Ï:Ï :Ï:Ïü9Ïõ9Ïî9Ïç9Ïà9ÏÙ9ÏÒ9ÏË9ÏÄ9Ͻ9϶9ϯ9Ϩ9Ï¡9Ïš9Ï“9ÏŒ9Ï…9Ï~9Ïw9Ïp9Ïi9Ïb9Ï[9ÏT9ÏM9ÏF9Ï?9Ï89Ï19Ï*9Ï#9Ï9Ï9Ï9Ï9Ï9Ïù8Ïò8Ïë8Ïä8ÏÝ8ÏÖ8ÏÏ8ÏÈ8ÏÁ8Ϻ8ϳ8Ϭ8Ï¥8Ïž8Ï—8Ï8ω8Ï‚8Ï{8Ït8Ïm8Ïf8Ï_8ÏX8ÏQ8ÏJ8ÏC8Ï<8Ï58Ï.8Ï'8Ï 8Ï8Ï8Ï 8Ï8Ïý7Ïö7Ïï7Ïè7Ïá7ÏÚ7ÏÓ7ÏÌ7ÏÅ7Ͼ7Ï·7ϰ7Ï©7Ï¢7Ï›7Ï”7Ï7φ7Ï7Ïx7Ïq7Ïj7Ïc7Ï\7ÏU7ÏN7ÏG7Ï@7Ï97Ï27Ï+7Ï$7Ï7Ï7Ï7Ï7Ï7Ïú6Ïó6Ïì6Ïå6ÏÞ6Ï×6ÏÐ6ÏÉ6ÏÂ6Ï»6Ï´6Ï­6Ϧ6ÏŸ6Ϙ6Ï‘6ÏŠ6σ6Ï|6Ïu6Ïn6Ïg6Ï`6ÏY6ÏR6ÏK6ÏD6Ï=6Ï66Ï/6Ï(6Ï!6Ï6Ï6Ï 6Ï6Ïþ5Ï÷5Ïð5Ïé5Ïâ5ÏÛ5ÏÔ5ÏÍ5ÏÆ5Ï¿5ϸ5ϱ5Ϫ5Ï£5Ïœ5Ï•5ÏŽ5χ5Ï€5Ïy5Ïr5Ïk5Ïd5Ï]5ÏV5ÏO5ÏH5ÏA5Ï:5Ï35Ï,5Ï%5Ï5Ï5Ï5Ï 5Ï5Ïû4Ïô4Ïí4Ïæ4Ïß4ÏØ4ÏÑ4ÏÊ4ÏÃ4ϼ4ϵ4Ï®4ϧ4Ï 4Ï™4Ï’4Ï‹4Ï„4Ï}4Ïv4Ïo4Ïh4Ïa4ÏZ4ÏS4ÏL4ÏE4Ï>4Ï74Ï04Ï)4Ï"4Ï4Ï4Ï 4Ï4Ïÿ3Ïø3Ïñ3Ïê3Ïã3ÏÜ3ÏÕ3ÏÎ3ÏÇ3ÏÀ3Ϲ3ϲ3Ï«3Ϥ3Ï3Ï–3Ï3ψ3Ï3Ïz3Ïs3Ïl3Ïe3Ï^3ÏW3ÏP3ÏI3ÏB3Ï;3Ï43Ï-3Ï&3Ï3Ï3Ï3Ï 3Ï3Ïü2Ïõ2Ïî2Ïç2Ïà2ÏÙ2ÏÒ2ÏË2ÏÄ2Ͻ2϶2ϯ2Ϩ2Ï¡2Ïš2Ï“2ÏŒ2Ï…2Ï~2Ïw2Ïp2Ïi2Ïb2Ï[2ÏT2ÏM2ÏF2Ï?2Ï82Ï12Ï*2Ï#2Ï2Ï2Ï2Ï2Ï2Ïù1Ïò1Ïë1Ïä1ÏÝ1ÏÖ1ÏÏ1ÏÈ1ÏÁ1Ϻ1ϳ1Ϭ1Ï¥1Ïž1Ï—1Ï1ω1Ï‚1Ï{1Ït1Ïm1Ïf1Ï_1ÏX1ÏQ1ÏJ1ÏC1Ï<1Ï51Ï.1Ï'1Ï 1Ï1Ï1Ï 1Ï1Ïý0Ïö0Ïï0Ïè0Ïá0ÏÚ0ÏÓ0ÏÌ0ÏÅ0Ͼ0Ï·0ϰ0Ï©0Ï¢0Ï›0Ï”0Ï0φ0Ï0Ïx0Ïq0Ïj0Ïc0Ï\0ÏU0ÏN0ÏG0Ï@0Ï90Ï20Ï+0Ï$0Ï0Ï0Ï0Ï0Ï0Ïú/Ïó/Ïì/Ïå/ÏÞ/Ï×/ÏÐ/ÏÉ/ÏÂ/Ï»/Ï´/Ï­/Ϧ/ÏŸ/Ϙ/Ï‘/ÏŠ/σ/Ï|/Ïu/Ïn/Ïg/Ï`/ÏY/ÏR/ÏK/ÏD/Ï=/Ï6/Ï//Ï(/Ï!/Ï/Ï/Ï /Ï/Ïþ.Ï÷.Ïð.Ïé.Ïâ.ÏÛ.ÏÔ.ÏÍ.ÏÆ.Ï¿.ϸ.ϱ.Ϫ.Ï£.Ïœ.Ï•.ÏŽ.χ.Ï€.Ïy.Ïr.Ïk.Ïd.Ï].ÏV.ÏO.ÏH.ÏA.Ï:.Ï3.Ï,.Ï%.Ï.Ï.Ï.Ï .Ï.Ïû-Ïô-Ïí-Ïæ-Ïß-ÏØ-ÏÑ-ÏÊ-ÏÃ-ϼ-ϵ-Ï®-ϧ-Ï -Ï™-Ï’-Ï‹-Ï„-Ï}-Ïv-Ïo-Ïh-Ïa-ÏZ-ÏS-ÏL-ÏE-Ï>-Ï7-Ï0-Ï)-Ï"-Ï-Ï-Ï -Ï-Ïÿ,Ïø,Ïñ,Ïê,Ïã,ÏÜ,ÏÕ,ÏÎ,ÏÇ,ÏÀ,Ϲ,ϲ,Ï«,Ϥ,Ï,Ï–,Ï,ψ,Ï,Ïz,Ïs,Ïl,Ïe,Ï^,ÏW,ÏP,ÏI,ÏB,Ï;,Ï4,Ï-,Ï&,Ï,Ï,Ï,Ï ,Ï,Ïü+Ïõ+Ïî+Ïç+Ïà+ÏÙ+ÏÒ+ÏË+ÏÄ+Ͻ+϶+ϯ+Ϩ+Ï¡+Ïš+Ï“+ÏŒ+Ï…+Ï~+Ïw+Ïp+Ïi+Ïb+Ï[+ÏT+ÏM+ÏF+Ï?+Ï8+Ï1+Ï*+Ï#+Ï+Ï+Ï+Ï+Ï+Ïù*Ïò*Ïë*Ïä*ÏÝ*ÏÖ*ÏÏ*ÏÈ*ÏÁ*Ϻ*ϳ*Ϭ*Ï¥*Ïž*Ï—*Ï*ω*Ï‚*Ï{*Ït*Ïm*Ïf*Ï_*ÏX*ÏQ*ÏJ*ÏC*Ï<*Ï5*Ï.*Ï'*Ï *Ï*Ï*Ï *Ï*Ïý)Ïö)Ïï)Ïè)Ïá)ÏÚ)ÏÓ)ÏÌ)ÏÅ)Ͼ)Ï·)ϰ)Ï©)Ï¢)Ï›)Ï”)Ï)φ)Ï)Ïx)Ïq)Ïj)Ïc)Ï\)ÏU)ÏN)ÏG)Ï@)Ï9)Ï2)Ï+)Ï$)Ï)Ï)Ï)Ï)Ï)Ïú(Ïó(Ïì(Ïå(ÏÞ(Ï×(ÏÐ(ÏÉ(ÏÂ(Ï»(Ï´(Ï­(Ϧ(ÏŸ(Ϙ(Ï‘(ÏŠ(σ(Ï|(Ïu(Ïn(Ïg(Ï`(ÏY(ÏR(ÏK(ÏD(Ï=(Ï6(Ï/(Ï((Ï!(Ï(Ï(Ï (Ï(Ïþ'Ï÷'Ïð'Ïé'Ïâ'ÏÛ'ÏÔ'ÏÍ'ÏÆ'Ï¿'ϸ'ϱ'Ϫ'Ï£'Ïœ'Ï•'ÏŽ'χ'Ï€'Ïy'Ïr'Ïk'Ïd'Ï]'ÏV'ÏO'ÏH'ÏA'Ï:'Ï3'Ï,'Ï%'Ï'Ï'Ï'Ï 'Ï'Ïû&Ïô&Ïí&Ïæ&Ïß&ÏØ&ÏÑ&ÏÊ&ÏÃ&ϼ&ϵ&Ï®&ϧ&Ï &Ï™&Ï’&Ï‹&Ï„&Ï}&Ïv&Ïo&Ïh&Ïa&ÏZ&ÏS&ÏL&ÏE&Ï>&Ï7&Ï0&Ï)&Ï"&Ï&Ï&Ï &Ï&Ïÿ%Ïø%Ïñ%Ïê%Ïã%ÏÜ%ÏÕ%ÏÎ%ÏÇ%ÏÀ%Ϲ%ϲ%Ï«%Ϥ%Ï%Ï–%Ï%ψ%Ï%Ïz%Ïs%Ïl%Ïe%Ï^%ÏW%ÏP%ÏI%ÏB%Ï;%Ï4%Ï-%Ï&%Ï%Ï%Ï%Ï %Ï%Ïü$Ïõ$Ïî$Ïç$Ïà$ÏÙ$ÏÒ$ÏË$ÏÄ$Ͻ$϶$ϯ$Ϩ$Ï¡$Ïš$Ï“$ÏŒ$Ï…$Ï~$Ïw$Ïp$Ïi$Ïb$Ï[$ÏT$ÏM$ÏF$Ï?$Ï8$Ï1$Ï*$Ï#$Ï$Ï$Ï$Ï$Ï$Ïù#Ïò#Ïë#Ïä#ÏÝ#ÏÖ#ÏÏ#ÏÈ#ÏÁ#Ϻ#ϳ#Ϭ#Ï¥#Ïž#Ï—#Ï#ω#Ï‚#Ï{#Ït#Ïm#Ïf#Ï_#ÏX#ÏQ#ÏJ#ÏC#Ï<#Ï5#Ï.#Ï'#Ï #Ï#Ï#Ï #Ï#Ïý"Ïö"Ïï"Ïè"Ïá"ÏÚ"ÏÓ"ÏÌ"ÏÅ"Ͼ"Ï·"ϰ"Ï©"Ï¢"Ï›"Ï”"Ï"φ"Ï"Ïx"Ïq"Ïj"Ïc"Ï\"ÏU"ÏN"ÏG"Ï@"Ï9"Ï2"Ï+"Ï$"Ï"Ï"Ï"Ï"Ï"Ïú!Ïó!Ïì!Ïå!ÏÞ!Ï×!ÏÐ!ÏÉ!ÏÂ!Ï»!Ï´!Ï­!Ϧ!ÏŸ!Ϙ!Ï‘!ÏŠ!σ!Ï|!Ïu!Ïn!Ïg!Ï`!ÏY!ÏR!ÏK!ÏD!Ï=!Ï6!Ï/!Ï(!Ï!!Ï!Ï!Ï !Ï!Ïþ Ï÷ Ïð Ïé Ïâ ÏÛ ÏÔ ÏÍ ÏÆ Ï¿ ϸ ϱ Ϫ Ï£ Ïœ Ï• ÏŽ χ Ï€ Ïy Ïr Ïk Ïd Ï] ÏV ÏO ÏH ÏA Ï: Ï3 Ï, Ï% Ï Ï Ï Ï Ï ÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏý Ïö Ïï Ïè Ïá ÏÚ ÏÓ ÏÌ ÏŠϾ Ï· ϰ Ï© Ï¢ Ï› Ï” Ï Ï† Ï Ïx Ïq Ïj Ïc Ï\ ÏU ÏN ÏG Ï@ Ï9 Ï2 Ï+ Ï$ Ï Ï Ï Ï Ï Ïú Ïó Ïì Ïå ÏÞ Ï× ÏÐ ÏÉ Ï Ï» Ï´ Ï­ Ϧ ÏŸ Ϙ Ï‘ ÏŠ σ Ï| Ïu Ïn Ïg Ï` ÏY ÏR ÏK ÏD Ï= Ï6 Ï/ Ï( Ï! Ï Ï Ï Ï Ïþ Ï÷ Ïð Ïé Ïâ ÏÛ ÏÔ ÏÍ ÏÆ Ï¿ ϸ ϱ Ϫ Ï£ Ïœ Ï• ÏŽ χ Ï€ Ïy Ïr Ïk Ïd Ï] ÏV ÏO ÏH ÏA Ï: Ï3 Ï, Ï% Ï Ï Ï Ï Ï Ïû Ïô Ïí Ïæ Ïß ÏØ ÏÑ ÏÊ Ïà ϼ ϵ Ï® ϧ Ï  Ï™ Ï’ Ï‹ Ï„ Ï} Ïv Ïo Ïh Ïa ÏZ ÏS ÏL ÏE Ï> Ï7 Ï0 Ï) Ï" Ï Ï Ï Ï Ïÿ Ïø Ïñ Ïê Ïã ÏÜ ÏÕ ÏÎ ÏÇ ÏÀ Ϲ ϲ Ï« Ϥ Ï Ï– Ï Ïˆ Ï Ïz Ïs Ïl Ïe Ï^ ÏW ÏP ÏI ÏB Ï; Ï4 Ï- Ï& Ï Ï Ï Ï Ï ÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÿÎöÿÎïÿÎèÿÎáÿÎÚÿÎÓÿÎÌÿÎÅÿξÿηÿΰÿΩÿ΢ÿΛÿΔÿÎÿΆÿÎÿÎxÿÎqÿÎjÿÎcÿÎ\ÿÎUÿÎNÿÎGÿÎ@ÿÎ9ÿÎ2ÿÎ+ÿÎ$ÿÎÿÎÿÎÿÎÿÎÿÎúþÎóþÎìþÎåþÎÞþÎ×þÎÐþÎÉþÎÂþλþδþέþΦþΟþΘþΑþΊþ΃þÎ|þÎuþÎnþÎgþÎ`þÎYþÎRþÎKþÎDþÎ=þÎ6þÎ/þÎ(þÎ!þÎþÎþÎ þÎþÎþýÎ÷ýÎðýÎéýÎâýÎÛýÎÔýÎÍýÎÆýοýθýαýΪýΣýΜýΕýÎŽý·ý΀ýÎyýÎrýÎkýÎdýÎ]ýÎVýÎOýÎHýÎAýÎ:ýÎ3ýÎ,ýÎ%ýÎýÎýÎýÎ ýÎýÎûüÎôüÎíüÎæüÎßüÎØüÎÑüÎÊüÎÃüμüεüήüΧüΠüΙüÎ’ü΋ü΄üÎ}üÎvüÎoüÎhüÎaüÎZüÎSüÎLüÎEüÎ>üÎ7üÎ0üÎ)üÎ"üÎüÎüÎ üÎüÎÿûÎøûÎñûÎêûÎãûÎÜûÎÕûÎÎûÎÇûÎÀûιûβûΫûΤûÎûΖûÎûΈûÎûÎzûÎsûÎlûÎeûÎ^ûÎWûÎPûÎIûÎBûÎ;ûÎ4ûÎ-ûÎ&ûÎûÎûÎûÎ ûÎûÎüúÎõúÎîúÎçúÎàúÎÙúÎÒúÎËúÎÄúνúζúίúΨúΡúΚúΓúÎŒúÎ…úÎ~úÎwúÎpúÎiúÎbúÎ[úÎTúÎMúÎFúÎ?úÎ8úÎ1úÎ*úÎ#úÎúÎúÎúÎúÎúÎùùÎòùÎëùÎäùÎÝùÎÖùÎÏùÎÈùÎÁùκùγùάùÎ¥ùΞùΗùÎùΉù΂ùÎ{ùÎtùÎmùÎfùÎ_ùÎXùÎQùÎJùÎCùÎ<ùÎ5ùÎ.ùÎ'ùÎ ùÎùÎùÎ ùÎùÎýøÎöøÎïøÎèøÎáøÎÚøÎÓøÎÌøÎÅøÎ¾øÎ·øÎ°øÎ©øÎ¢øÎ›øÎ”øÎøÎ†øÎøÎxøÎqøÎjøÎcøÎ\øÎUøÎNøÎGøÎ@øÎ9øÎ2øÎ+øÎ$øÎøÎøÎøÎøÎøÎú÷Îó÷Îì÷Îå÷ÎÞ÷Î×÷ÎÐ÷ÎÉ÷ÎÂ÷λ÷δ÷έ÷Φ÷Ο÷Θ÷Α÷Ί÷΃÷Î|÷Îu÷În÷Îg÷Î`÷ÎY÷ÎR÷ÎK÷ÎD÷Î=÷Î6÷Î/÷Î(÷Î!÷Î÷Î÷Î ÷Î÷ÎþöÎ÷öÎðöÎéöÎâöÎÛöÎÔöÎÍöÎÆöοöθöαöΪöΣöΜöΕöÎŽö·ö΀öÎyöÎröÎköÎdöÎ]öÎVöÎOöÎHöÎAöÎ:öÎ3öÎ,öÎ%öÎöÎöÎöÎ öÎöÎûõÎôõÎíõÎæõÎßõÎØõÎÑõÎÊõÎÃõμõεõήõΧõΠõΙõÎ’õ΋õ΄õÎ}õÎvõÎoõÎhõÎaõÎZõÎSõÎLõÎEõÎ>õÎ7õÎ0õÎ)õÎ"õÎõÎõÎ õÎõÎÿôÎøôÎñôÎêôÎãôÎÜôÎÕôÎÎôÎÇôÎÀôιôβôΫôΤôÎôΖôÎôΈôÎôÎzôÎsôÎlôÎeôÎ^ôÎWôÎPôÎIôÎBôÎ;ôÎ4ôÎ-ôÎ&ôÎôÎôÎôÎ ôÎôÎüóÎõóÎîóÎçóÎàóÎÙóÎÒóÎËóÎÄóνóζóίóΨóΡóΚóΓóÎŒóÎ…óÎ~óÎwóÎpóÎióÎbóÎ[óÎTóÎMóÎFóÎ?óÎ8óÎ1óÎ*óÎ#óÎóÎóÎóÎóÎóÎùòÎòòÎëòÎäòÎÝòÎÖòÎÏòÎÈòÎÁòκòγòάòÎ¥òΞòΗòÎòΉò΂òÎ{òÎtòÎmòÎfòÎ_òÎXòÎQòÎJòÎCòÎ<òÎ5òÎ.òÎ'òÎ òÎòÎòÎ òÎòÎýñÎöñÎïñÎèñÎáñÎÚñÎÓñÎÌñÎÅñξñηñΰñΩñ΢ñΛñΔñÎñΆñÎñÎxñÎqñÎjñÎcñÎ\ñÎUñÎNñÎGñÎ@ñÎ9ñÎ2ñÎ+ñÎ$ñÎñÎñÎñÎñÎñÎúðÎóðÎìðÎåðÎÞðÎ×ðÎÐðÎÉðÎÂðλðδðέðΦðΟðΘðΑðΊð΃ðÎ|ðÎuðÎnðÎgðÎ`ðÎYðÎRðÎKðÎDðÎ=ðÎ6ðÎ/ðÎ(ðÎ!ðÎðÎðÎ ðÎðÎþïÎ÷ïÎðïÎéïÎâïÎÛïÎÔïÎÍïÎÆïοïθïαïΪïΣïΜïΕïÎŽï·ï΀ïÎyïÎrïÎkïÎdïÎ]ïÎVïÎOïÎHïÎAïÎ:ïÎ3ïÎ,ïÎ%ïÎïÎïÎïÎ ïÎïÎûîÎôîÎíîÎæîÎßîÎØîÎÑîÎÊîÎÃîμîεîήîΧîΠîΙîÎ’î΋î΄îÎ}îÎvîÎoîÎhîÎaîÎZîÎSîÎLîÎEîÎ>îÎ7îÎ0îÎ)îÎ"îÎîÎîÎ îÎîÎÿíÎøíÎñíÎêíÎãíÎÜíÎÕíÎÎíÎÇíÎÀíιíβíΫíΤíÎíΖíÎíΈíÎíÎzíÎsíÎlíÎeíÎ^íÎWíÎPíÎIíÎBíÎ;íÎ4íÎ-íÎ&íÎíÎíÎíÎ íÎíÎüìÎõìÎîìÎçìÎàìÎÙìÎÒìÎËìÎÄìνìζìίìΨìΡìΚìΓìÎŒìÎ…ìÎ~ìÎwìÎpìÎiìÎbìÎ[ìÎTìÎMìÎFìÎ?ìÎ8ìÎ1ìÎ*ìÎ#ìÎìÎìÎìÎìÎìÎùëÎòëÎëëÎäëÎÝëÎÖëÎÏëÎÈëÎÁëκëγëάëÎ¥ëΞëΗëÎëΉë΂ëÎ{ëÎtëÎmëÎfëÎ_ëÎXëÎQëÎJëÎCëÎ<ëÎ5ëÎ.ëÎ'ëÎ ëÎëÎëÎ ëÎëÎýêÎöêÎïêÎèêÎáêÎÚêÎÓêÎÌêÎÅêξêηêΰêΩê΢êΛêΔêÎêΆêÎêÎxêÎqêÎjêÎcêÎ\êÎUêÎNêÎGêÎ@êÎ9êÎ2êÎ+êÎ$êÎêÎêÎêÎêÎêÎúéÎóéÎìéÎåéÎÞéÎ×éÎÐéÎÉéÎÂéλéδéέéΦéΟéΘéΑéΊé΃éÎ|éÎuéÎnéÎgéÎ`éÎYéÎRéÎKéÎDéÎ=éÎ6éÎ/éÎ(éÎ!éÎéÎéÎ éÎéÎþèÎ÷èÎðèÎéèÎâèÎÛèÎÔèÎÍèÎÆèοèθèαèΪèΣèΜèΕèÎŽè·è΀èÎyèÎrèÎkèÎdèÎ]èÎVèÎOèÎHèÎAèÎ:èÎ3èÎ,èÎ%èÎèÎèÎèÎ èÎèÎûçÎôçÎíçÎæçÎßçÎØçÎÑçÎÊçÎÃçμçεçήçΧçΠçΙçÎ’ç΋ç΄çÎ}çÎvçÎoçÎhçÎaçÎZçÎSçÎLçÎEçÎ>çÎ7çÎ0çÎ)çÎ"çÎçÎçÎ çÎçÎÿæÎøæÎñæÎêæÎãæÎÜæÎÕæÎÎæÎÇæÎÀæÎ¹æÎ²æÎ«æÎ¤æÎæÎ–æÎæÎˆæÎæÎzæÎsæÎlæÎeæÎ^æÎWæÎPæÎIæÎBæÎ;æÎ4æÎ-æÎ&æÎæÎæÎæÎ æÎæÎüåÎõåÎîåÎçåÎàåÎÙåÎÒåÎËåÎÄåνåζåίåΨåΡåΚåΓåÎŒåÎ…åÎ~åÎwåÎpåÎiåÎbåÎ[åÎTåÎMåÎFåÎ?åÎ8åÎ1åÎ*åÎ#åÎåÎåÎåÎåÎåÎùäÎòäÎëäÎääÎÝäÎÖäÎÏäÎÈäÎÁäκäγäάäÎ¥äΞäΗäÎäΉä΂äÎ{äÎtäÎmäÎfäÎ_äÎXäÎQäÎJäÎCäÎ<äÎ5äÎ.äÎ'äÎ äÎäÎäÎ äÎäÎýãÎöãÎïãÎèãÎáãÎÚãÎÓãÎÌãÎÅãξãηãΰãΩã΢ãΛãΔãÎãΆãÎãÎxãÎqãÎjãÎcãÎ\ãÎUãÎNãÎGãÎ@ãÎ9ãÎ2ãÎ+ãÎ$ãÎãÎãÎãÎãÎãÎúâÎóâÎìâÎåâÎÞâÎ×âÎÐâÎÉâÎÂâλâδâέâΦâΟâΘâΑâΊâ΃âÎ|âÎuâÎnâÎgâÎ`âÎYâÎRâÎKâÎDâÎ=âÎ6âÎ/âÎ(âÎ!âÎâÎâÎ âÎâÎþáÎ÷áÎðáÎéáÎâáÎÛáÎÔáÎÍáÎÆáοáθáαáΪáΣáΜáΕáÎŽá·á΀áÎyáÎráÎkáÎdáÎ]áÎVáÎOáÎHáÎAáÎ:áÎ3áÎ,áÎ%áÎáÎáÎáÎ áÎáÎûàÎôàÎíàÎæàÎßàÎØàÎÑàÎÊàÎÃàμàεàήàΧàΠàΙàÎ’à΋à΄àÎ}àÎvàÎoàÎhàÎaàÎZàÎSàÎLàÎEàÎ>àÎ7àÎ0àÎ)àÎ"àÎàÎàÎ àÎàÎÿßÎøßÎñßÎêßÎãßÎÜßÎÕßÎÎßÎÇßÎÀßιßβßΫßΤßÎßΖßÎßΈßÎßÎzßÎsßÎlßÎeßÎ^ßÎWßÎPßÎIßÎBßÎ;ßÎ4ßÎ-ßÎ&ßÎßÎßÎßÎ ßÎßÎüÞÎõÞÎîÞÎçÞÎàÞÎÙÞÎÒÞÎËÞÎÄÞνÞζÞίÞΨÞΡÞΚÞΓÞÎŒÞÎ…ÞÎ~ÞÎwÞÎpÞÎiÞÎbÞÎ[ÞÎTÞÎMÞÎFÞÎ?ÞÎ8ÞÎ1ÞÎ*ÞÎ#ÞÎÞÎÞÎÞÎÞÎÞÎùÝÎòÝÎëÝÎäÝÎÝÝÎÖÝÎÏÝÎÈÝÎÁÝκÝγÝάÝÎ¥ÝΞÝΗÝÎÝΉÝ΂ÝÎ{ÝÎtÝÎmÝÎfÝÎ_ÝÎXÝÎQÝÎJÝÎCÝÎ<ÝÎ5ÝÎ.ÝÎ'ÝÎ ÝÎÝÎÝÎ ÝÎÝÎýÜÎöÜÎïÜÎèÜÎáÜÎÚÜÎÓÜÎÌÜÎÅÜξÜηÜΰÜΩÜ΢ÜΛÜΔÜÎÜΆÜÎÜÎxÜÎqÜÎjÜÎcÜÎ\ÜÎUÜÎNÜÎGÜÎ@ÜÎ9ÜÎ2ÜÎ+ÜÎ$ÜÎÜÎÜÎÜÎÜÎÜÎúÛÎóÛÎìÛÎåÛÎÞÛÎ×ÛÎÐÛÎÉÛÎÂÛλÛδÛέÛΦÛΟÛΘÛΑÛΊÛ΃ÛÎ|ÛÎuÛÎnÛÎgÛÎ`ÛÎYÛÎRÛÎKÛÎDÛÎ=ÛÎ6ÛÎ/ÛÎ(ÛÎ!ÛÎÛÎÛÎ ÛÎÛÎþÚÎ÷ÚÎðÚÎéÚÎâÚÎÛÚÎÔÚÎÍÚÎÆÚοÚθÚαÚΪÚΣÚΜÚΕÚÎŽÚ·Ú΀ÚÎyÚÎrÚÎkÚÎdÚÎ]ÚÎVÚÎOÚÎHÚÎAÚÎ:ÚÎ3ÚÎ,ÚÎ%ÚÎÚÎÚÎÚÎ ÚÎÚÎûÙÎôÙÎíÙÎæÙÎßÙÎØÙÎÑÙÎÊÙÎÃÙμÙεÙήÙΧÙΠÙΙÙÎ’Ù΋Ù΄ÙÎ}ÙÎvÙÎoÙÎhÙÎaÙÎZÙÎSÙÎLÙÎEÙÎ>ÙÎ7ÙÎ0ÙÎ)ÙÎ"ÙÎÙÎÙÎ ÙÎÙÎÿØÎøØÎñØÎêØÎãØÎÜØÎÕØÎÎØÎÇØÎÀØÎ¹ØÎ²ØÎ«ØÎ¤ØÎØÎ–ØÎØÎˆØÎØÎzØÎsØÎlØÎeØÎ^ØÎWØÎPØÎIØÎBØÎ;ØÎ4ØÎ-ØÎ&ØÎØÎØÎØÎ ØÎØÎü×Îõ×Îî×Îç×Îà×ÎÙ×ÎÒ×ÎË×ÎÄ×ν×ζ×ί×Ψ×Ρ×Κ×Γ×ÎŒ×Î…×Î~×Îw×Îp×Îi×Îb×Î[×ÎT×ÎM×ÎF×Î?×Î8×Î1×Î*×Î#×Î×Î×Î×Î×Î×ÎùÖÎòÖÎëÖÎäÖÎÝÖÎÖÖÎÏÖÎÈÖÎÁÖκÖγÖάÖÎ¥ÖΞÖΗÖÎÖΉÖ΂ÖÎ{ÖÎtÖÎmÖÎfÖÎ_ÖÎXÖÎQÖÎJÖÎCÖÎ<ÖÎ5ÖÎ.ÖÎ'ÖÎ ÖÎÖÎÖÎ ÖÎÖÎýÕÎöÕÎïÕÎèÕÎáÕÎÚÕÎÓÕÎÌÕÎÅÕξÕηÕΰÕΩÕ΢ÕΛÕΔÕÎÕΆÕÎÕÎxÕÎqÕÎjÕÎcÕÎ\ÕÎUÕÎNÕÎGÕÎ@ÕÎ9ÕÎ2ÕÎ+ÕÎ$ÕÎÕÎÕÎÕÎÕÎÕÎúÔÎóÔÎìÔÎåÔÎÞÔÎ×ÔÎÐÔÎÉÔÎÂÔλÔδÔέÔΦÔΟÔΘÔΑÔΊÔ΃ÔÎ|ÔÎuÔÎnÔÎgÔÎ`ÔÎYÔÎRÔÎKÔÎDÔÎ=ÔÎ6ÔÎ/ÔÎ(ÔÎ!ÔÎÔÎÔÎ ÔÎÔÎþÓÎ÷ÓÎðÓÎéÓÎâÓÎÛÓÎÔÓÎÍÓÎÆÓοÓθÓαÓΪÓΣÓΜÓΕÓÎŽÓ·Ó΀ÓÎyÓÎrÓÎkÓÎdÓÎ]ÓÎVÓÎOÓÎHÓÎAÓÎ:ÓÎ3ÓÎ,ÓÎ%ÓÎÓÎÓÎÓÎ ÓÎÓÎûÒÎôÒÎíÒÎæÒÎßÒÎØÒÎÑÒÎÊÒÎÃÒμÒεÒήÒΧÒΠÒΙÒÎ’Ò΋Ò΄ÒÎ}ÒÎvÒÎoÒÎhÒÎaÒÎZÒÎSÒÎLÒÎEÒÎ>ÒÎ7ÒÎ0ÒÎ)ÒÎ"ÒÎÒÎÒÎ ÒÎÒÎÿÑÎøÑÎñÑÎêÑÎãÑÎÜÑÎÕÑÎÎÑÎÇÑÎÀÑιÑβÑΫÑΤÑÎÑΖÑÎÑΈÑÎÑÎzÑÎsÑÎlÑÎeÑÎ^ÑÎWÑÎPÑÎIÑÎBÑÎ;ÑÎ4ÑÎ-ÑÎ&ÑÎÑÎÑÎÑÎ ÑÎÑÎüÐÎõÐÎîÐÎçÐÎàÐÎÙÐÎÒÐÎËÐÎÄÐνÐζÐίÐΨÐΡÐΚÐΓÐÎŒÐÎ…ÐÎ~ÐÎwÐÎpÐÎiÐÎbÐÎ[ÐÎTÐÎMÐÎFÐÎ?ÐÎ8ÐÎ1ÐÎ*ÐÎ#ÐÎÐÎÐÎÐÎÐÎÐÎùÏÎòÏÎëÏÎäÏÎÝÏÎÖÏÎÏÏÎÈÏÎÁÏκÏγÏάÏÎ¥ÏΞÏΗÏÎÏΉÏ΂ÏÎ{ÏÎtÏÎmÏÎfÏÎ_ÏÎXÏÎQÏÎJÏÎCÏÎ<ÏÎ5ÏÎ.ÏÎ'ÏÎ ÏÎÏÎÏÎ ÏÎÏÎýÎÎöÎÎïÎÎèÎÎáÎÎÚÎÎÓÎÎÌÎÎÅÎξÎηÎΰÎΩÎ΢ÎΛÎΔÎÎÎΆÎÎÎÎxÎÎqÎÎjÎÎcÎÎ\ÎÎUÎÎNÎÎGÎÎ@ÎÎ9ÎÎ2ÎÎ+ÎÎ$ÎÎÎÎÎÎÎÎÎÎÎÎúÍÎóÍÎìÍÎåÍÎÞÍÎ×ÍÎÐÍÎÉÍÎÂÍλÍδÍέÍΦÍΟÍΘÍΑÍΊÍ΃ÍÎ|ÍÎuÍÎnÍÎgÍÎ`ÍÎYÍÎRÍÎKÍÎDÍÎ=ÍÎ6ÍÎ/ÍÎ(ÍÎ!ÍÎÍÎÍÎ ÍÎÍÎþÌÎ÷ÌÎðÌÎéÌÎâÌÎÛÌÎÔÌÎÍÌÎÆÌοÌθÌαÌΪÌΣÌΜÌΕÌÎŽÌ·Ì΀ÌÎyÌÎrÌÎkÌÎdÌÎ]ÌÎVÌÎOÌÎHÌÎAÌÎ:ÌÎ3ÌÎ,ÌÎ%ÌÎÌÎÌÎÌÎ ÌÎÌÎûËÎôËÎíËÎæËÎßËÎØËÎÑËÎÊËÎÃËμËεËήËΧËΠËΙËÎ’Ë΋Ë΄ËÎ}ËÎvËÎoËÎhËÎaËÎZËÎSËÎLËÎEËÎ>ËÎ7ËÎ0ËÎ)ËÎ"ËÎËÎËÎ ËÎËÎÿÊÎøÊÎñÊÎêÊÎãÊÎÜÊÎÕÊÎÎÊÎÇÊÎÀÊιÊβÊΫÊΤÊÎÊΖÊÎÊΈÊÎÊÎzÊÎsÊÎlÊÎeÊÎ^ÊÎWÊÎPÊÎIÊÎBÊÎ;ÊÎ4ÊÎ-ÊÎ&ÊÎÊÎÊÎÊÎ ÊÎÊÎüÉÎõÉÎîÉÎçÉÎàÉÎÙÉÎÒÉÎËÉÎÄÉνÉζÉίÉΨÉΡÉΚÉΓÉÎŒÉÎ…ÉÎ~ÉÎwÉÎpÉÎiÉÎbÉÎ[ÉÎTÉÎMÉÎFÉÎ?ÉÎ8ÉÎ1ÉÎ*ÉÎ#ÉÎÉÎÉÎÉÎÉÎÉÎùÈÎòÈÎëÈÎäÈÎÝÈÎÖÈÎÏÈÎÈÈÎÁÈκÈγÈάÈÎ¥ÈΞÈΗÈÎÈΉÈ΂ÈÎ{ÈÎtÈÎmÈÎfÈÎ_ÈÎXÈÎQÈÎJÈÎCÈÎ<ÈÎ5ÈÎ.ÈÎ'ÈÎ ÈÎÈÎÈÎ ÈÎÈÎýÇÎöÇÎïÇÎèÇÎáÇÎÚÇÎÓÇÎÌÇÎÅÇξÇηÇΰÇΩÇ΢ÇΛÇΔÇÎÇΆÇÎÇÎxÇÎqÇÎjÇÎcÇÎ\ÇÎUÇÎNÇÎGÇÎ@ÇÎ9ÇÎ2ÇÎ+ÇÎ$ÇÎÇÎÇÎÇÎÇÎÇÎúÆÎóÆÎìÆÎåÆÎÞÆÎׯÎÐÆÎÉÆÎÂÆÎ»ÆÎ´ÆÎ­ÆÎ¦ÆÎŸÆÎ˜ÆÎ‘ÆÎŠÆÎƒÆÎ|ÆÎuÆÎnÆÎgÆÎ`ÆÎYÆÎRÆÎKÆÎDÆÎ=ÆÎ6ÆÎ/ÆÎ(ÆÎ!ÆÎÆÎÆÎ ÆÎÆÎþÅÎ÷ÅÎðÅÎéÅÎâÅÎÛÅÎÔÅÎÍÅÎÆÅοÅθÅαÅΪÅΣÅΜÅΕÅÎŽÅ·Å΀ÅÎyÅÎrÅÎkÅÎdÅÎ]ÅÎVÅÎOÅÎHÅÎAÅÎ:ÅÎ3ÅÎ,ÅÎ%ÅÎÅÎÅÎÅÎ ÅÎÅÎûÄÎôÄÎíÄÎæÄÎßÄÎØÄÎÑÄÎÊÄÎÃÄμÄεÄήÄΧÄΠÄΙÄÎ’Ä΋Ä΄ÄÎ}ÄÎvÄÎoÄÎhÄÎaÄÎZÄÎSÄÎLÄÎEÄÎ>ÄÎ7ÄÎ0ÄÎ)ÄÎ"ÄÎÄÎÄÎ ÄÎÄÎÿÃÎøÃÎñÃÎêÃÎãÃÎÜÃÎÕÃÎÎÃÎÇÃÎÀÃιÃβÃΫÃΤÃÎÃΖÃÎÃΈÃÎÃÎzÃÎsÃÎlÃÎeÃÎ^ÃÎWÃÎPÃÎIÃÎBÃÎ;ÃÎ4ÃÎ-ÃÎ&ÃÎÃÎÃÎÃÎ ÃÎÃÎüÂÎõÂÎîÂÎçÂÎàÂÎÙÂÎÒÂÎËÂÎÄÂνÂζÂίÂΨÂΡÂΚÂΓÂÎŒÂÎ…ÂÎ~ÂÎwÂÎpÂÎiÂÎbÂÎ[ÂÎTÂÎMÂÎFÂÎ?ÂÎ8ÂÎ1ÂÎ*ÂÎ#ÂÎÂÎÂÎÂÎÂÎÂÎùÁÎòÁÎëÁÎäÁÎÝÁÎÖÁÎÏÁÎÈÁÎÁÁκÁγÁάÁÎ¥ÁΞÁΗÁÎÁΉÁ΂ÁÎ{ÁÎtÁÎmÁÎfÁÎ_ÁÎXÁÎQÁÎJÁÎCÁÎ<ÁÎ5ÁÎ.ÁÎ'ÁÎ ÁÎÁÎÁÎ ÁÎÁÎýÀÎöÀÎïÀÎèÀÎáÀÎÚÀÎÓÀÎÌÀÎÅÀξÀηÀΰÀΩÀ΢ÀΛÀΔÀÎÀΆÀÎÀÎxÀÎqÀÎjÀÎcÀÎ\ÀÎUÀÎNÀÎGÀÎ@ÀÎ9ÀÎ2ÀÎ+ÀÎ$ÀÎÀÎÀÎÀÎÀÎÀÎú¿Îó¿Îì¿Îå¿ÎÞ¿Î׿ÎпÎɿολ¿Î´¿Î­¿Î¦¿ÎŸ¿Î˜¿Î‘¿ÎŠ¿Îƒ¿Î|¿Îu¿În¿Îg¿Î`¿ÎY¿ÎR¿ÎK¿ÎD¿Î=¿Î6¿Î/¿Î(¿Î!¿Î¿Î¿Î ¿Î¿Îþ¾Î÷¾Îð¾Îé¾Îâ¾ÎÛ¾ÎÔ¾Î;Îƾο¾Î¸¾Î±¾Îª¾Î£¾Îœ¾Î•¾Î޾·¾Î€¾Îy¾Îr¾Îk¾Îd¾Î]¾ÎV¾ÎO¾ÎH¾ÎA¾Î:¾Î3¾Î,¾Î%¾Î¾Î¾Î¾Î ¾Î¾Îû½Îô½Îí½Îæ½Îß½ÎؽÎѽÎʽÎýμ½Îµ½Î®½Î§½Î ½Î™½Î’½Î‹½Î„½Î}½Îv½Îo½Îh½Îa½ÎZ½ÎS½ÎL½ÎE½Î>½Î7½Î0½Î)½Î"½Î½Î½Î ½Î½Îÿ¼Îø¼Îñ¼Îê¼Îã¼ÎܼÎÕ¼ÎμÎǼÎÀ¼Î¹¼Î²¼Î«¼Î¤¼Î¼Î–¼Î¼Îˆ¼Î¼Îz¼Îs¼Îl¼Îe¼Î^¼ÎW¼ÎP¼ÎI¼ÎB¼Î;¼Î4¼Î-¼Î&¼Î¼Î¼Î¼Î ¼Î¼Îü»Îõ»Îî»Îç»Îà»ÎÙ»ÎÒ»ÎË»ÎĻν»Î¶»Î¯»Î¨»Î¡»Îš»Î“»ÎŒ»Î…»Î~»Îw»Îp»Îi»Îb»Î[»ÎT»ÎM»ÎF»Î?»Î8»Î1»Î*»Î#»Î»Î»Î»Î»Î»ÎùºÎòºÎëºÎäºÎݺÎÖºÎϺÎȺÎÁºÎººÎ³ºÎ¬ºÎ¥ºÎžºÎ—ºÎºÎ‰ºÎ‚ºÎ{ºÎtºÎmºÎfºÎ_ºÎXºÎQºÎJºÎCºÎ<ºÎ5ºÎ.ºÎ'ºÎ ºÎºÎºÎ ºÎºÎý¹Îö¹Îï¹Îè¹Îá¹ÎÚ¹ÎÓ¹Î̹ÎŹÎ¾¹Î·¹Î°¹Î©¹Î¢¹Î›¹Î”¹Î¹Î†¹Î¹Îx¹Îq¹Îj¹Îc¹Î\¹ÎU¹ÎN¹ÎG¹Î@¹Î9¹Î2¹Î+¹Î$¹Î¹Î¹Î¹Î¹Î¹Îú¸Îó¸Îì¸Îå¸ÎÞ¸Î׸ÎиÎɸθλ¸Î´¸Î­¸Î¦¸ÎŸ¸Î˜¸Î‘¸ÎЏÎƒ¸Î|¸Îu¸În¸Îg¸Î`¸ÎY¸ÎR¸ÎK¸ÎD¸Î=¸Î6¸Î/¸Î(¸Î!¸Î¸Î¸Î ¸Î¸Îþ·Î÷·Îð·Îé·Îâ·ÎÛ·ÎÔ·ÎÍ·ÎÆ·Î¿·Î¸·Î±·Îª·Î£·Îœ·Î•·ÎŽ·Î‡·Î€·Îy·Îr·Îk·Îd·Î]·ÎV·ÎO·ÎH·ÎA·Î:·Î3·Î,·Î%·Î·Î·Î·Î ·Î·Îû¶Îô¶Îí¶Îæ¶Îß¶ÎضÎѶÎʶÎöμ¶Îµ¶Î®¶Î§¶Î ¶Î™¶Î’¶Î‹¶Î„¶Î}¶Îv¶Îo¶Îh¶Îa¶ÎZ¶ÎS¶ÎL¶ÎE¶Î>¶Î7¶Î0¶Î)¶Î"¶Î¶Î¶Î ¶Î¶ÎÿµÎøµÎñµÎêµÎãµÎܵÎÕµÎεÎǵÎÀµÎ¹µÎ²µÎ«µÎ¤µÎµÎ–µÎµÎˆµÎµÎzµÎsµÎlµÎeµÎ^µÎWµÎPµÎIµÎBµÎ;µÎ4µÎ-µÎ&µÎµÎµÎµÎ µÎµÎü´Îõ´Îî´Îç´Îà´ÎÙ´ÎÒ´ÎË´ÎĴν´Î¶´Î¯´Î¨´Î¡´Îš´Î“´ÎŒ´Î…´Î~´Îw´Îp´Îi´Îb´Î[´ÎT´ÎM´ÎF´Î?´Î8´Î1´Î*´Î#´Î´Î´Î´Î´Î´Îù³Îò³Îë³Îä³ÎݳÎÖ³ÎϳÎȳÎÁ³Îº³Î³³Î¬³Î¥³Îž³Î—³Î³Î‰³Î‚³Î{³Ît³Îm³Îf³Î_³ÎX³ÎQ³ÎJ³ÎC³Î<³Î5³Î.³Î'³Î ³Î³Î³Î ³Î³Îý²Îö²Îï²Îè²Îá²ÎÚ²ÎÓ²Î̲ÎŲξ²Î·²Î°²Î©²Î¢²Î›²Î”²Î²Î†²Î²Îx²Îq²Îj²Îc²Î\²ÎU²ÎN²ÎG²Î@²Î9²Î2²Î+²Î$²Î²Î²Î²Î²Î²Îú±Îó±Îì±Îå±ÎÞ±Î×±ÎбÎɱαλ±Î´±Î­±Î¦±ÎŸ±Î˜±Î‘±Îб΃±Î|±Îu±În±Îg±Î`±ÎY±ÎR±ÎK±ÎD±Î=±Î6±Î/±Î(±Î!±Î±Î±Î ±Î±Îþ°Î÷°Îð°Îé°Îâ°ÎÛ°ÎÔ°ÎͰÎưο°Î¸°Î±°Îª°Î£°Îœ°Î•°Îް·°Î€°Îy°Îr°Îk°Îd°Î]°ÎV°ÎO°ÎH°ÎA°Î:°Î3°Î,°Î%°Î°Î°Î°Î °Î°Îû¯Îô¯Îí¯Îæ¯Î߯ÎدÎѯÎʯÎïμ¯Îµ¯Î®¯Î§¯Î ¯Î™¯Î’¯Î‹¯Î„¯Î}¯Îv¯Îo¯Îh¯Îa¯ÎZ¯ÎS¯ÎL¯ÎE¯Î>¯Î7¯Î0¯Î)¯Î"¯Î¯Î¯Î ¯Î¯Îÿ®Îø®Îñ®Îê®Îã®ÎÜ®ÎÕ®ÎήÎÇ®ÎÀ®Î¹®Î²®Î«®Î¤®Î®Î–®Î®Îˆ®Î®Îz®Îs®Îl®Îe®Î^®ÎW®ÎP®ÎI®ÎB®Î;®Î4®Î-®Î&®Î®Î®Î®Î ®Î®Îü­Îõ­Îî­Îç­Îà­ÎÙ­ÎÒ­ÎË­Îĭν­Î¶­Î¯­Î¨­Î¡­Îš­Î“­ÎŒ­Î…­Î~­Îw­Îp­Îi­Îb­Î[­ÎT­ÎM­ÎF­Î?­Î8­Î1­Î*­Î#­Î­Î­Î­Î­Î­Îù¬Îò¬Îë¬Îä¬ÎݬÎÖ¬ÎϬÎȬÎÁ¬Îº¬Î³¬Î¬¬Î¥¬Îž¬Î—¬Î¬Î‰¬Î‚¬Î{¬Ît¬Îm¬Îf¬Î_¬ÎX¬ÎQ¬ÎJ¬ÎC¬Î<¬Î5¬Î.¬Î'¬Î ¬Î¬Î¬Î ¬Î¬Îý«Îö«Îï«Îè«Îá«ÎÚ«ÎÓ«ÎÌ«Îūξ«Î·«Î°«Î©«Î¢«Î›«Î”«Î«Î†«Î«Îx«Îq«Îj«Îc«Î\«ÎU«ÎN«ÎG«Î@«Î9«Î2«Î+«Î$«Î«Î«Î«Î«Î«ÎúªÎóªÎìªÎåªÎÞªÎתÎЪÎɪΪλªÎ´ªÎ­ªÎ¦ªÎŸªÎ˜ªÎ‘ªÎŠªÎƒªÎ|ªÎuªÎnªÎgªÎ`ªÎYªÎRªÎKªÎDªÎ=ªÎ6ªÎ/ªÎ(ªÎ!ªÎªÎªÎ ªÎªÎþ©Î÷©Îð©Îé©Îâ©ÎÛ©ÎÔ©ÎÍ©ÎÆ©Î¿©Î¸©Î±©Îª©Î£©Îœ©Î•©ÎŽ©Î‡©Î€©Îy©Îr©Îk©Îd©Î]©ÎV©ÎO©ÎH©ÎA©Î:©Î3©Î,©Î%©Î©Î©Î©Î ©Î©Îû¨Îô¨Îí¨Îæ¨ÎߨÎبÎѨÎʨÎèμ¨Îµ¨Î®¨Î§¨Î ¨Î™¨Î’¨Î‹¨Î„¨Î}¨Îv¨Îo¨Îh¨Îa¨ÎZ¨ÎS¨ÎL¨ÎE¨Î>¨Î7¨Î0¨Î)¨Î"¨Î¨Î¨Î ¨Î¨Îÿ§Îø§Îñ§Îê§Îã§ÎܧÎÕ§ÎΧÎǧÎÀ§Î¹§Î²§Î«§Î¤§Î§Î–§Î§Îˆ§Î§Îz§Îs§Îl§Îe§Î^§ÎW§ÎP§ÎI§ÎB§Î;§Î4§Î-§Î&§Î§Î§Î§Î §Î§Îü¦Îõ¦Îî¦Îç¦Îà¦ÎÙ¦ÎÒ¦Î˦ÎĦν¦Î¶¦Î¯¦Î¨¦Î¡¦Îš¦Î“¦ÎŒ¦Î…¦Î~¦Îw¦Îp¦Îi¦Îb¦Î[¦ÎT¦ÎM¦ÎF¦Î?¦Î8¦Î1¦Î*¦Î#¦Î¦Î¦Î¦Î¦Î¦Îù¥Îò¥Îë¥Îä¥ÎÝ¥ÎÖ¥ÎÏ¥ÎÈ¥ÎÁ¥Îº¥Î³¥Î¬¥Î¥¥Îž¥Î—¥Î¥Î‰¥Î‚¥Î{¥Ît¥Îm¥Îf¥Î_¥ÎX¥ÎQ¥ÎJ¥ÎC¥Î<¥Î5¥Î.¥Î'¥Î ¥Î¥Î¥Î ¥Î¥Îý¤Îö¤Îï¤Îè¤Îá¤ÎÚ¤ÎÓ¤Î̤ÎŤÎ¾¤Î·¤Î°¤Î©¤Î¢¤Î›¤Î”¤Î¤Î†¤Î¤Îx¤Îq¤Îj¤Îc¤Î\¤ÎU¤ÎN¤ÎG¤Î@¤Î9¤Î2¤Î+¤Î$¤Î¤Î¤Î¤Î¤Î¤Îú£Îó£Îì£Îå£ÎÞ£Î×£ÎУÎɣΣλ£Î´£Î­£Î¦£ÎŸ£Î˜£Î‘£ÎŠ£Îƒ£Î|£Îu£În£Îg£Î`£ÎY£ÎR£ÎK£ÎD£Î=£Î6£Î/£Î(£Î!£Î£Î£Î £Î£Îþ¢Î÷¢Îð¢Îé¢Îâ¢ÎÛ¢ÎÔ¢ÎÍ¢ÎÆ¢Î¿¢Î¸¢Î±¢Îª¢Î£¢Îœ¢Î•¢ÎŽ¢Î‡¢Î€¢Îy¢Îr¢Îk¢Îd¢Î]¢ÎV¢ÎO¢ÎH¢ÎA¢Î:¢Î3¢Î,¢Î%¢Î¢Î¢Î¢Î ¢Î¢Îû¡Îô¡Îí¡Îæ¡Îß¡ÎØ¡ÎÑ¡ÎÊ¡Îáμ¡Îµ¡Î®¡Î§¡Î ¡Î™¡Î’¡Î‹¡Î„¡Î}¡Îv¡Îo¡Îh¡Îa¡ÎZ¡ÎS¡ÎL¡ÎE¡Î>¡Î7¡Î0¡Î)¡Î"¡Î¡Î¡Î ¡Î¡Îÿ Îø Îñ Îê Îã ÎÜ ÎÕ ÎΠÎÇ ÎÀ Î¹ Î² Î« Î¤ Î Î– Î Îˆ Î Îz Îs Îl Îe Î^ ÎW ÎP ÎI ÎB Î; Î4 Î- Î& Î Î Î Î  Î ÎüŸÎõŸÎîŸÎçŸÎàŸÎÙŸÎÒŸÎËŸÎğνŸÎ¶ŸÎ¯ŸÎ¨ŸÎ¡ŸÎšŸÎ“ŸÎŒŸÎ…ŸÎ~ŸÎwŸÎpŸÎiŸÎbŸÎ[ŸÎTŸÎMŸÎFŸÎ?ŸÎ8ŸÎ1ŸÎ*ŸÎ#ŸÎŸÎŸÎŸÎŸÎŸÎùžÎòžÎëžÎäžÎÝžÎÖžÎÏžÎÈžÎÁžÎºžÎ³žÎ¬žÎ¥žÎžžÎ—žÎžÎ‰žÎ‚žÎ{žÎtžÎmžÎfžÎ_žÎXžÎQžÎJžÎCžÎ<žÎ5žÎ.žÎ'žÎ žÎžÎžÎ žÎžÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúœÎóœÎìœÎåœÎÞœÎלÎМÎɜΜλœÎ´œÎ­œÎ¦œÎŸœÎ˜œÎ‘œÎŠœÎƒœÎ|œÎuœÎnœÎgœÎ`œÎYœÎRœÎKœÎDœÎ=œÎ6œÎ/œÎ(œÎ!œÎœÎœÎ œÎœÎþ›Î÷›Îð›Îé›Îâ›ÎÛ›ÎÔ›ÎÍ›ÎÆ›Î¿›Î¸›Î±›Îª›Î£›Îœ›Î•›ÎŽ›Î‡›Î€›Îy›Îr›Îk›Îd›Î]›ÎV›ÎO›ÎH›ÎA›Î:›Î3›Î,›Î%›Î›Î›Î›Î ›Î›ÎûšÎôšÎíšÎæšÎßšÎØšÎÑšÎÊšÎÚμšÎµšÎ®šÎ§šÎ šÎ™šÎ’šÎ‹šÎ„šÎ}šÎvšÎošÎhšÎašÎZšÎSšÎLšÎEšÎ>šÎ7šÎ0šÎ)šÎ"šÎšÎšÎ šÎšÎÿ™Îø™Îñ™Îê™Îã™ÎÜ™ÎÕ™ÎΙÎÇ™ÎÀ™Î¹™Î²™Î«™Î¤™Î™Î–™Î™Îˆ™Î™Îz™Îs™Îl™Îe™Î^™ÎW™ÎP™ÎI™ÎB™Î;™Î4™Î-™Î&™Î™Î™Î™Î ™Î™Îü˜Îõ˜Îî˜Îç˜Îà˜ÎÙ˜ÎÒ˜Î˘ÎĘν˜Î¶˜Î¯˜Î¨˜Î¡˜Îš˜Î“˜ÎŒ˜Î…˜Î~˜Îw˜Îp˜Îi˜Îb˜Î[˜ÎT˜ÎM˜ÎF˜Î?˜Î8˜Î1˜Î*˜Î#˜Î˜Î˜Î˜Î˜Î˜Îù—Îò—Îë—Îä—ÎÝ—ÎÖ—ÎÏ—ÎÈ—ÎÁ—κ—γ—ά—Î¥—Ξ—Η—ΗΉ—΂—Î{—Ît—Îm—Îf—Î_—ÎX—ÎQ—ÎJ—ÎC—Î<—Î5—Î.—Î'—Î —ΗΗΠ—ΗÎý–Îö–Îï–Îè–Îá–ÎÚ–ÎÓ–ÎÌ–ÎŖξ–η–ΰ–Ω–΢–Λ–Δ–ΖΆ–ΖÎx–Îq–Îj–Îc–Î\–ÎU–ÎN–ÎG–Î@–Î9–Î2–Î+–Î$–ΖΖΖΖΖÎú•Îó•Îì•Îå•ÎÞ•ÎוÎЕÎɕΕλ•δ•έ•Φ•Ο•Θ•Α•Ί•΃•Î|•Îu•În•Îg•Î`•ÎY•ÎR•ÎK•ÎD•Î=•Î6•Î/•Î(•Î!•ΕΕΠ•ΕÎþ”Î÷”Îð”Îé”Îâ”ÎÛ”ÎÔ”ÎÍ”ÎÆ”ο”θ”α”Ϊ”Σ”Μ”Ε”ÎŽ”·”΀”Îy”Îr”Îk”Îd”Î]”ÎV”ÎO”ÎH”ÎA”Î:”Î3”Î,”Î%”ΔΔΔΠ”ΔÎû“Îô“Îí“Îæ“Îß“ÎØ“ÎÑ“ÎÊ“ÎÓμ“ε“ή“Χ“Π“Ι“Î’“΋“΄“Î}“Îv“Îo“Îh“Îa“ÎZ“ÎS“ÎL“ÎE“Î>“Î7“Î0“Î)“Î"“ΓΓΠ“ΓÎÿ’Îø’Îñ’Îê’Îã’ÎÜ’ÎÕ’ÎÎ’ÎÇ’ÎÀ’ι’β’Ϋ’Τ’ΒΖ’ΒΈ’Î’Îz’Îs’Îl’Îe’Î^’ÎW’ÎP’ÎI’ÎB’Î;’Î4’Î-’Î&’Î’Î’Î’Î ’Î’Îü‘Îõ‘Îî‘Îç‘Îà‘ÎÙ‘ÎÒ‘ÎË‘Îđν‘ζ‘ί‘Ψ‘Ρ‘Κ‘Γ‘ÎŒ‘Î…‘Î~‘Îw‘Îp‘Îi‘Îb‘Î[‘ÎT‘ÎM‘ÎF‘Î?‘Î8‘Î1‘Î*‘Î#‘ΑΑΑΑΑÎùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúŽÎóŽÎìŽÎåŽÎÞŽÎ׎ÎÐŽÎÉŽÎŽλŽÎ´ŽÎ­ŽÎ¦ŽÎŸŽÎ˜ŽÎ‘ŽÎŠŽÎƒŽÎ|ŽÎuŽÎnŽÎgŽÎ`ŽÎYŽÎRŽÎKŽÎDŽÎ=ŽÎ6ŽÎ/ŽÎ(ŽÎ!ŽÎŽÎŽÎ ŽÎŽÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûŒÎôŒÎíŒÎæŒÎߌÎØŒÎÑŒÎÊŒÎÌμŒÎµŒÎ®ŒÎ§ŒÎ ŒÎ™ŒÎ’ŒÎ‹ŒÎ„ŒÎ}ŒÎvŒÎoŒÎhŒÎaŒÎZŒÎSŒÎLŒÎEŒÎ>ŒÎ7ŒÎ0ŒÎ)ŒÎ"ŒÎŒÎŒÎ ŒÎŒÎÿ‹Îø‹Îñ‹Îê‹Îã‹ÎÜ‹ÎÕ‹Î΋ÎÇ‹ÎÀ‹Î¹‹Î²‹Î«‹Î¤‹Î‹Î–‹Î‹Îˆ‹Î‹Îz‹Îs‹Îl‹Îe‹Î^‹ÎW‹ÎP‹ÎI‹ÎB‹Î;‹Î4‹Î-‹Î&‹Î‹Î‹Î‹Î ‹Î‹ÎüŠÎõŠÎîŠÎçŠÎàŠÎÙŠÎÒŠÎËŠÎĊνŠÎ¶ŠÎ¯ŠÎ¨ŠÎ¡ŠÎšŠÎ“ŠÎŒŠÎ…ŠÎ~ŠÎwŠÎpŠÎiŠÎbŠÎ[ŠÎTŠÎMŠÎFŠÎ?ŠÎ8ŠÎ1ŠÎ*ŠÎ#ŠÎŠÎŠÎŠÎŠÎŠÎù‰Îò‰Îë‰Îä‰Î݉ÎÖ‰ÎωÎȉÎÁ‰Îº‰Î³‰Î¬‰Î¥‰Îž‰Î—‰Î‰Î‰‰Î‚‰Î{‰Ît‰Îm‰Îf‰Î_‰ÎX‰ÎQ‰ÎJ‰ÎC‰Î<‰Î5‰Î.‰Î'‰Î ‰Î‰Î‰Î ‰Î‰ÎýˆÎöˆÎïˆÎèˆÎáˆÎÚˆÎÓˆÎ̈ÎňξˆÎ·ˆÎ°ˆÎ©ˆÎ¢ˆÎ›ˆÎ”ˆÎˆÎ†ˆÎˆÎxˆÎqˆÎjˆÎcˆÎ\ˆÎUˆÎNˆÎGˆÎ@ˆÎ9ˆÎ2ˆÎ+ˆÎ$ˆÎˆÎˆÎˆÎˆÎˆÎú‡Îó‡Îì‡Îå‡ÎÞ‡ÎׇÎЇÎɇ·λ‡Î´‡Î­‡Î¦‡ÎŸ‡Î˜‡Î‘‡ÎЇÎƒ‡Î|‡Îu‡În‡Îg‡Î`‡ÎY‡ÎR‡ÎK‡ÎD‡Î=‡Î6‡Î/‡Î(‡Î!‡Î‡Î‡Î ‡Î‡Îþ†Î÷†Îð†Îé†Îâ†ÎÛ†ÎÔ†Î͆ÎƆο†Î¸†Î±†Îª†Î£†Îœ†Î•†Îކ·†Î€†Îy†Îr†Îk†Îd†Î]†ÎV†ÎO†ÎH†ÎA†Î:†Î3†Î,†Î%†Î†Î†Î†Î †Î†Îû…Îô…Îí…Îæ…Îß…ÎØ…ÎÑ…ÎÊ…ÎÅμ…ε…ή…Χ…Π…Ι…Î’…΋…΄…Î}…Îv…Îo…Îh…Îa…ÎZ…ÎS…ÎL…ÎE…Î>…Î7…Î0…Î)…Î"…Î…Î…Î …Î…Îÿ„Îø„Îñ„Îê„Îã„ÎÜ„ÎÕ„Î΄ÎÇ„ÎÀ„ι„β„Ϋ„Τ„΄Ζ„΄Έ„΄Îz„Îs„Îl„Îe„Î^„ÎW„ÎP„ÎI„ÎB„Î;„Î4„Î-„Î&„΄΄΄Π„΄ÎüƒÎõƒÎîƒÎçƒÎàƒÎÙƒÎÒƒÎ˃ÎăνƒÎ¶ƒÎ¯ƒÎ¨ƒÎ¡ƒÎšƒÎ“ƒÎŒƒÎ…ƒÎ~ƒÎwƒÎpƒÎiƒÎbƒÎ[ƒÎTƒÎMƒÎFƒÎ?ƒÎ8ƒÎ1ƒÎ*ƒÎ#ƒÎƒÎƒÎƒÎƒÎƒÎù‚Îò‚Îë‚Îä‚ÎÝ‚ÎÖ‚ÎÏ‚ÎÈ‚ÎÁ‚κ‚γ‚ά‚Î¥‚Ξ‚Η‚΂Ή‚΂‚Î{‚Ît‚Îm‚Îf‚Î_‚ÎX‚ÎQ‚ÎJ‚ÎC‚Î<‚Î5‚Î.‚Î'‚Î ‚΂΂Π‚΂ÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎú€Îó€Îì€Îå€ÎÞ€Î×€ÎЀÎɀ΀λ€Î´€Î­€Î¦€ÎŸ€Î˜€Î‘€ÎŠ€Îƒ€Î|€Îu€În€Îg€Î`€ÎY€ÎR€ÎK€ÎD€Î=€Î6€Î/€Î(€Î!€Î€Î€Î €Î€ÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎû~Îô~Îí~Îæ~Îß~ÎØ~ÎÑ~ÎÊ~ÎÃ~μ~ε~ή~Χ~Π~Ι~Î’~΋~΄~Î}~Îv~Îo~Îh~Îa~ÎZ~ÎS~ÎL~ÎE~Î>~Î7~Î0~Î)~Î"~Î~Î~Î ~Î~Îÿ}Îø}Îñ}Îê}Îã}ÎÜ}ÎÕ}ÎÎ}ÎÇ}ÎÀ}ι}β}Ϋ}Τ}Î}Ζ}Î}Έ}Î}Îz}Îs}Îl}Îe}Î^}ÎW}ÎP}ÎI}ÎB}Î;}Î4}Î-}Î&}Î}Î}Î}Î }Î}Îü|Îõ|Îî|Îç|Îà|ÎÙ|ÎÒ|ÎË|ÎÄ|ν|ζ|ί|Ψ|Ρ|Κ|Γ|ÎŒ|Î…|Î~|Îw|Îp|Îi|Îb|Î[|ÎT|ÎM|ÎF|Î?|Î8|Î1|Î*|Î#|Î|Î|Î|Î|Î|Îù{Îò{Îë{Îä{ÎÝ{ÎÖ{ÎÏ{ÎÈ{ÎÁ{κ{γ{ά{Î¥{Ξ{Η{Î{Ή{΂{Î{{Ît{Îm{Îf{Î_{ÎX{ÎQ{ÎJ{ÎC{Î<{Î5{Î.{Î'{Î {Î{Î{Î {Î{ÎýzÎözÎïzÎèzÎázÎÚzÎÓzÎÌzÎÅzξzηzΰzΩz΢zΛzΔzÎzΆzÎzÎxzÎqzÎjzÎczÎ\zÎUzÎNzÎGzÎ@zÎ9zÎ2zÎ+zÎ$zÎzÎzÎzÎzÎzÎúyÎóyÎìyÎåyÎÞyÎ×yÎÐyÎÉyÎÂyλyδyέyΦyΟyΘyΑyΊy΃yÎ|yÎuyÎnyÎgyÎ`yÎYyÎRyÎKyÎDyÎ=yÎ6yÎ/yÎ(yÎ!yÎyÎyÎ yÎyÎþxÎ÷xÎðxÎéxÎâxÎÛxÎÔxÎÍxÎÆxοxθxαxΪxΣxΜxΕxÎŽx·x΀xÎyxÎrxÎkxÎdxÎ]xÎVxÎOxÎHxÎAxÎ:xÎ3xÎ,xÎ%xÎxÎxÎxÎ xÎxÎûwÎôwÎíwÎæwÎßwÎØwÎÑwÎÊwÎÃwμwεwήwΧwΠwΙwÎ’w΋w΄wÎ}wÎvwÎowÎhwÎawÎZwÎSwÎLwÎEwÎ>wÎ7wÎ0wÎ)wÎ"wÎwÎwÎ wÎwÎÿvÎøvÎñvÎêvÎãvÎÜvÎÕvÎÎvÎÇvÎÀvιvβvΫvΤvÎvΖvÎvΈvÎvÎzvÎsvÎlvÎevÎ^vÎWvÎPvÎIvÎBvÎ;vÎ4vÎ-vÎ&vÎvÎvÎvÎ vÎvÎüuÎõuÎîuÎçuÎàuÎÙuÎÒuÎËuÎÄuνuζuίuΨuΡuΚuΓuÎŒuÎ…uÎ~uÎwuÎpuÎiuÎbuÎ[uÎTuÎMuÎFuÎ?uÎ8uÎ1uÎ*uÎ#uÎuÎuÎuÎuÎuÎùtÎòtÎëtÎätÎÝtÎÖtÎÏtÎÈtÎÁtκtγtάtÎ¥tΞtΗtÎtΉt΂tÎ{tÎttÎmtÎftÎ_tÎXtÎQtÎJtÎCtÎpÎ7pÎ0pÎ)pÎ"pÎpÎpÎ pÎpÎÿoÎøoÎñoÎêoÎãoÎÜoÎÕoÎÎoÎÇoÎÀoιoβoΫoΤoÎoΖoÎoΈoÎoÎzoÎsoÎloÎeoÎ^oÎWoÎPoÎIoÎBoÎ;oÎ4oÎ-oÎ&oÎoÎoÎoÎ oÎoÎünÎõnÎînÎçnÎànÎÙnÎÒnÎËnÎÄnνnζnίnΨnΡnΚnΓnÎŒnÎ…nÎ~nÎwnÎpnÎinÎbnÎ[nÎTnÎMnÎFnÎ?nÎ8nÎ1nÎ*nÎ#nÎnÎnÎnÎnÎnÎùmÎòmÎëmÎämÎÝmÎÖmÎÏmÎÈmÎÁmκmγmάmÎ¥mΞmΗmÎmΉm΂mÎ{mÎtmÎmmÎfmÎ_mÎXmÎQmÎJmÎCmÎiÎ7iÎ0iÎ)iÎ"iÎiÎiÎ iÎiÎÿhÎøhÎñhÎêhÎãhÎÜhÎÕhÎÎhÎÇhÎÀhιhβhΫhΤhÎhΖhÎhΈhÎhÎzhÎshÎlhÎehÎ^hÎWhÎPhÎIhÎBhÎ;hÎ4hÎ-hÎ&hÎhÎhÎhÎ hÎhÎügÎõgÎîgÎçgÎàgÎÙgÎÒgÎËgÎÄgνgζgίgΨgΡgΚgΓgÎŒgÎ…gÎ~gÎwgÎpgÎigÎbgÎ[gÎTgÎMgÎFgÎ?gÎ8gÎ1gÎ*gÎ#gÎgÎgÎgÎgÎgÎùfÎòfÎëfÎäfÎÝfÎÖfÎÏfÎÈfÎÁfκfγfάfÎ¥fΞfΗfÎfΉf΂fÎ{fÎtfÎmfÎffÎ_fÎXfÎQfÎJfÎCfÎbÎ7bÎ0bÎ)bÎ"bÎbÎbÎ bÎbÎÿaÎøaÎñaÎêaÎãaÎÜaÎÕaÎÎaÎÇaÎÀaιaβaΫaΤaÎaΖaÎaΈaÎaÎzaÎsaÎlaÎeaÎ^aÎWaÎPaÎIaÎBaÎ;aÎ4aÎ-aÎ&aÎaÎaÎaÎ aÎaÎü`Îõ`Îî`Îç`Îà`ÎÙ`ÎÒ`ÎË`ÎÄ`ν`ζ`ί`Ψ`Ρ`Κ`Γ`ÎŒ`Î…`Î~`Îw`Îp`Îi`Îb`Î[`ÎT`ÎM`ÎF`Î?`Î8`Î1`Î*`Î#`Î`Î`Î`Î`Î`Îù_Îò_Îë_Îä_ÎÝ_ÎÖ_ÎÏ_ÎÈ_ÎÁ_κ_γ_ά_Î¥_Ξ_Η_Î_Ή_΂_Î{_Ît_Îm_Îf_Î__ÎX_ÎQ_ÎJ_ÎC_Î<_Î5_Î._Î'_Î _Î_Î_Î _Î_Îý^Îö^Îï^Îè^Îá^ÎÚ^ÎÓ^ÎÌ^ÎÅ^ξ^η^ΰ^Ω^΢^Λ^Δ^Î^Ά^Î^Îx^Îq^Îj^Îc^Î\^ÎU^ÎN^ÎG^Î@^Î9^Î2^Î+^Î$^Î^Î^Î^Î^Î^Îú]Îó]Îì]Îå]ÎÞ]Î×]ÎÐ]ÎÉ]ÎÂ]λ]δ]έ]Φ]Ο]Θ]Α]Ί]΃]Î|]Îu]În]Îg]Î`]ÎY]ÎR]ÎK]ÎD]Î=]Î6]Î/]Î(]Î!]Î]Î]Î ]Î]Îþ\Î÷\Îð\Îé\Îâ\ÎÛ\ÎÔ\ÎÍ\ÎÆ\ο\θ\α\Ϊ\Σ\Μ\Ε\ÎŽ\·\΀\Îy\Îr\Îk\Îd\Î]\ÎV\ÎO\ÎH\ÎA\Î:\Î3\Î,\Î%\Î\Î\Î\Î \Î\Îû[Îô[Îí[Îæ[Îß[ÎØ[ÎÑ[ÎÊ[ÎÃ[μ[ε[ή[Χ[Π[Ι[Î’[΋[΄[Î}[Îv[Îo[Îh[Îa[ÎZ[ÎS[ÎL[ÎE[Î>[Î7[Î0[Î)[Î"[Î[Î[Î [Î[ÎÿZÎøZÎñZÎêZÎãZÎÜZÎÕZÎÎZÎÇZÎÀZιZβZΫZΤZÎZΖZÎZΈZÎZÎzZÎsZÎlZÎeZÎ^ZÎWZÎPZÎIZÎBZÎ;ZÎ4ZÎ-ZÎ&ZÎZÎZÎZÎ ZÎZÎüYÎõYÎîYÎçYÎàYÎÙYÎÒYÎËYÎÄYνYζYίYΨYΡYΚYΓYÎŒYÎ…YÎ~YÎwYÎpYÎiYÎbYÎ[YÎTYÎMYÎFYÎ?YÎ8YÎ1YÎ*YÎ#YÎYÎYÎYÎYÎYÎùXÎòXÎëXÎäXÎÝXÎÖXÎÏXÎÈXÎÁXκXγXάXÎ¥XΞXΗXÎXΉX΂XÎ{XÎtXÎmXÎfXÎ_XÎXXÎQXÎJXÎCXÎTÎ7TÎ0TÎ)TÎ"TÎTÎTÎ TÎTÎÿSÎøSÎñSÎêSÎãSÎÜSÎÕSÎÎSÎÇSÎÀSιSβSΫSΤSÎSΖSÎSΈSÎSÎzSÎsSÎlSÎeSÎ^SÎWSÎPSÎISÎBSÎ;SÎ4SÎ-SÎ&SÎSÎSÎSÎ SÎSÎüRÎõRÎîRÎçRÎàRÎÙRÎÒRÎËRÎÄRνRζRίRΨRΡRΚRΓRÎŒRÎ…RÎ~RÎwRÎpRÎiRÎbRÎ[RÎTRÎMRÎFRÎ?RÎ8RÎ1RÎ*RÎ#RÎRÎRÎRÎRÎRÎùQÎòQÎëQÎäQÎÝQÎÖQÎÏQÎÈQÎÁQκQγQάQÎ¥QΞQΗQÎQΉQ΂QÎ{QÎtQÎmQÎfQÎ_QÎXQÎQQÎJQÎCQÎMÎ7MÎ0MÎ)MÎ"MÎMÎMÎ MÎMÎÿLÎøLÎñLÎêLÎãLÎÜLÎÕLÎÎLÎÇLÎÀLιLβLΫLΤLÎLΖLÎLΈLÎLÎzLÎsLÎlLÎeLÎ^LÎWLÎPLÎILÎBLÎ;LÎ4LÎ-LÎ&LÎLÎLÎLÎ LÎLÎüKÎõKÎîKÎçKÎàKÎÙKÎÒKÎËKÎÄKνKζKίKΨKΡKΚKΓKÎŒKÎ…KÎ~KÎwKÎpKÎiKÎbKÎ[KÎTKÎMKÎFKÎ?KÎ8KÎ1KÎ*KÎ#KÎKÎKÎKÎKÎKÎùJÎòJÎëJÎäJÎÝJÎÖJÎÏJÎÈJÎÁJκJγJάJÎ¥JΞJΗJÎJΉJ΂JÎ{JÎtJÎmJÎfJÎ_JÎXJÎQJÎJJÎCJÎFÎ7FÎ0FÎ)FÎ"FÎFÎFÎ FÎFÎÿEÎøEÎñEÎêEÎãEÎÜEÎÕEÎÎEÎÇEÎÀEιEβEΫEΤEÎEΖEÎEΈEÎEÎzEÎsEÎlEÎeEÎ^EÎWEÎPEÎIEÎBEÎ;EÎ4EÎ-EÎ&EÎEÎEÎEÎ EÎEÎüDÎõDÎîDÎçDÎàDÎÙDÎÒDÎËDÎÄDνDζDίDΨDΡDΚDΓDÎŒDÎ…DÎ~DÎwDÎpDÎiDÎbDÎ[DÎTDÎMDÎFDÎ?DÎ8DÎ1DÎ*DÎ#DÎDÎDÎDÎDÎDÎùCÎòCÎëCÎäCÎÝCÎÖCÎÏCÎÈCÎÁCκCγCάCÎ¥CΞCΗCÎCΉC΂CÎ{CÎtCÎmCÎfCÎ_CÎXCÎQCÎJCÎCCÎ?Î7?Î0?Î)?Î"?Î?Î?Î ?Î?Îÿ>Îø>Îñ>Îê>Îã>ÎÜ>ÎÕ>ÎÎ>ÎÇ>ÎÀ>ι>β>Ϋ>Τ>Î>Ζ>Î>Έ>Î>Îz>Îs>Îl>Îe>Î^>ÎW>ÎP>ÎI>ÎB>Î;>Î4>Î->Î&>Î>Î>Î>Î >Î>Îü=Îõ=Îî=Îç=Îà=ÎÙ=ÎÒ=ÎË=ÎÄ=ν=ζ=ί=Ψ=Ρ=Κ=Γ=ÎŒ=Î…=Î~=Îw=Îp=Îi=Îb=Î[=ÎT=ÎM=ÎF=Î?=Î8=Î1=Î*=Î#=Î=Î=Î=Î=Î=Îù<Îò<Îë<Îä<ÎÝ<ÎÖ<ÎÏ<ÎÈ<ÎÁ<κ<γ<ά<Î¥<Ξ<Η<Î<Ή<΂<Î{<Ît<Îm<Îf<Î_<ÎX<ÎQ<ÎJ<ÎC<Î<<Î5<Î.<Î'<Î <Î<Î<Î <Î<Îý;Îö;Îï;Îè;Îá;ÎÚ;ÎÓ;ÎÌ;ÎÅ;ξ;η;ΰ;Ω;΢;Λ;Δ;Î;Ά;Î;Îx;Îq;Îj;Îc;Î\;ÎU;ÎN;ÎG;Î@;Î9;Î2;Î+;Î$;Î;Î;Î;Î;Î;Îú:Îó:Îì:Îå:ÎÞ:Î×:ÎÐ:ÎÉ:ÎÂ:λ:δ:έ:Φ:Ο:Θ:Α:Ί:΃:Î|:Îu:În:Îg:Î`:ÎY:ÎR:ÎK:ÎD:Î=:Î6:Î/:Î(:Î!:Î:Î:Î :Î:Îþ9Î÷9Îð9Îé9Îâ9ÎÛ9ÎÔ9ÎÍ9ÎÆ9ο9θ9α9Ϊ9Σ9Μ9Ε9ÎŽ9·9΀9Îy9Îr9Îk9Îd9Î]9ÎV9ÎO9ÎH9ÎA9Î:9Î39Î,9Î%9Î9Î9Î9Î 9Î9Îû8Îô8Îí8Îæ8Îß8ÎØ8ÎÑ8ÎÊ8ÎÃ8μ8ε8ή8Χ8Π8Ι8Î’8΋8΄8Î}8Îv8Îo8Îh8Îa8ÎZ8ÎS8ÎL8ÎE8Î>8Î78Î08Î)8Î"8Î8Î8Î 8Î8Îÿ7Îø7Îñ7Îê7Îã7ÎÜ7ÎÕ7ÎÎ7ÎÇ7ÎÀ7ι7β7Ϋ7Τ7Î7Ζ7Î7Έ7Î7Îz7Îs7Îl7Îe7Î^7ÎW7ÎP7ÎI7ÎB7Î;7Î47Î-7Î&7Î7Î7Î7Î 7Î7Îü6Îõ6Îî6Îç6Îà6ÎÙ6ÎÒ6ÎË6ÎÄ6ν6ζ6ί6Ψ6Ρ6Κ6Γ6ÎŒ6Î…6Î~6Îw6Îp6Îi6Îb6Î[6ÎT6ÎM6ÎF6Î?6Î86Î16Î*6Î#6Î6Î6Î6Î6Î6Îù5Îò5Îë5Îä5ÎÝ5ÎÖ5ÎÏ5ÎÈ5ÎÁ5κ5γ5ά5Î¥5Ξ5Η5Î5Ή5΂5Î{5Ît5Îm5Îf5Î_5ÎX5ÎQ5ÎJ5ÎC5Î<5Î55Î.5Î'5Î 5Î5Î5Î 5Î5Îý4Îö4Îï4Îè4Îá4ÎÚ4ÎÓ4ÎÌ4ÎÅ4ξ4η4ΰ4Ω4΢4Λ4Δ4Î4Ά4Î4Îx4Îq4Îj4Îc4Î\4ÎU4ÎN4ÎG4Î@4Î94Î24Î+4Î$4Î4Î4Î4Î4Î4Îú3Îó3Îì3Îå3ÎÞ3Î×3ÎÐ3ÎÉ3ÎÂ3λ3δ3έ3Φ3Ο3Θ3Α3Ί3΃3Î|3Îu3În3Îg3Î`3ÎY3ÎR3ÎK3ÎD3Î=3Î63Î/3Î(3Î!3Î3Î3Î 3Î3Îþ2Î÷2Îð2Îé2Îâ2ÎÛ2ÎÔ2ÎÍ2ÎÆ2ο2θ2α2Ϊ2Σ2Μ2Ε2ÎŽ2·2΀2Îy2Îr2Îk2Îd2Î]2ÎV2ÎO2ÎH2ÎA2Î:2Î32Î,2Î%2Î2Î2Î2Î 2Î2Îû1Îô1Îí1Îæ1Îß1ÎØ1ÎÑ1ÎÊ1ÎÃ1μ1ε1ή1Χ1Π1Ι1Î’1΋1΄1Î}1Îv1Îo1Îh1Îa1ÎZ1ÎS1ÎL1ÎE1Î>1Î71Î01Î)1Î"1Î1Î1Î 1Î1Îÿ0Îø0Îñ0Îê0Îã0ÎÜ0ÎÕ0ÎÎ0ÎÇ0ÎÀ0ι0β0Ϋ0Τ0Î0Ζ0Î0Έ0Î0Îz0Îs0Îl0Îe0Î^0ÎW0ÎP0ÎI0ÎB0Î;0Î40Î-0Î&0Î0Î0Î0Î 0Î0Îü/Îõ/Îî/Îç/Îà/ÎÙ/ÎÒ/ÎË/ÎÄ/ν/ζ/ί/Ψ/Ρ/Κ/Γ/ÎŒ/Î…/Î~/Îw/Îp/Îi/Îb/Î[/ÎT/ÎM/ÎF/Î?/Î8/Î1/Î*/Î#/Î/Î/Î/Î/Î/Îù.Îò.Îë.Îä.ÎÝ.ÎÖ.ÎÏ.ÎÈ.ÎÁ.κ.γ.ά.Î¥.Ξ.Η.Î.Ή.΂.Î{.Ît.Îm.Îf.Î_.ÎX.ÎQ.ÎJ.ÎC.Î<.Î5.Î..Î'.Î .Î.Î.Î .Î.Îý-Îö-Îï-Îè-Îá-ÎÚ-ÎÓ-ÎÌ-ÎÅ-ξ-η-ΰ-Ω-΢-Λ-Δ-Î-Ά-Î-Îx-Îq-Îj-Îc-Î\-ÎU-ÎN-ÎG-Î@-Î9-Î2-Î+-Î$-Î-Î-Î-Î-Î-Îú,Îó,Îì,Îå,ÎÞ,Î×,ÎÐ,ÎÉ,ÎÂ,λ,δ,έ,Φ,Ο,Θ,Α,Ί,΃,Î|,Îu,În,Îg,Î`,ÎY,ÎR,ÎK,ÎD,Î=,Î6,Î/,Î(,Î!,Î,Î,Î ,Î,Îþ+Î÷+Îð+Îé+Îâ+ÎÛ+ÎÔ+ÎÍ+ÎÆ+ο+θ+α+Ϊ+Σ+Μ+Ε+ÎŽ+·+΀+Îy+Îr+Îk+Îd+Î]+ÎV+ÎO+ÎH+ÎA+Î:+Î3+Î,+Î%+Î+Î+Î+Î +Î+Îû*Îô*Îí*Îæ*Îß*ÎØ*ÎÑ*ÎÊ*ÎÃ*μ*ε*ή*Χ*Π*Ι*Î’*΋*΄*Î}*Îv*Îo*Îh*Îa*ÎZ*ÎS*ÎL*ÎE*Î>*Î7*Î0*Î)*Î"*Î*Î*Î *Î*Îÿ)Îø)Îñ)Îê)Îã)ÎÜ)ÎÕ)ÎÎ)ÎÇ)ÎÀ)ι)β)Ϋ)Τ)Î)Ζ)Î)Έ)Î)Îz)Îs)Îl)Îe)Î^)ÎW)ÎP)ÎI)ÎB)Î;)Î4)Î-)Î&)Î)Î)Î)Î )Î)Îü(Îõ(Îî(Îç(Îà(ÎÙ(ÎÒ(ÎË(ÎÄ(ν(ζ(ί(Ψ(Ρ(Κ(Γ(ÎŒ(Î…(Î~(Îw(Îp(Îi(Îb(Î[(ÎT(ÎM(ÎF(Î?(Î8(Î1(Î*(Î#(Î(Î(Î(Î(Î(Îù'Îò'Îë'Îä'ÎÝ'ÎÖ'ÎÏ'ÎÈ'ÎÁ'κ'γ'ά'Î¥'Ξ'Η'Î'Ή'΂'Î{'Ît'Îm'Îf'Î_'ÎX'ÎQ'ÎJ'ÎC'Î<'Î5'Î.'Î''Î 'Î'Î'Î 'Î'Îý&Îö&Îï&Îè&Îá&ÎÚ&ÎÓ&ÎÌ&ÎÅ&ξ&η&ΰ&Ω&΢&Λ&Δ&Î&Ά&Î&Îx&Îq&Îj&Îc&Î\&ÎU&ÎN&ÎG&Î@&Î9&Î2&Î+&Î$&Î&Î&Î&Î&Î&Îú%Îó%Îì%Îå%ÎÞ%Î×%ÎÐ%ÎÉ%ÎÂ%λ%δ%έ%Φ%Ο%Θ%Α%Ί%΃%Î|%Îu%În%Îg%Î`%ÎY%ÎR%ÎK%ÎD%Î=%Î6%Î/%Î(%Î!%Î%Î%Î %Î%Îþ$Î÷$Îð$Îé$Îâ$ÎÛ$ÎÔ$ÎÍ$ÎÆ$ο$θ$α$Ϊ$Σ$Μ$Ε$ÎŽ$·$΀$Îy$Îr$Îk$Îd$Î]$ÎV$ÎO$ÎH$ÎA$Î:$Î3$Î,$Î%$Î$Î$Î$Î $Î$Îû#Îô#Îí#Îæ#Îß#ÎØ#ÎÑ#ÎÊ#ÎÃ#μ#ε#ή#Χ#Π#Ι#Î’#΋#΄#Î}#Îv#Îo#Îh#Îa#ÎZ#ÎS#ÎL#ÎE#Î>#Î7#Î0#Î)#Î"#Î#Î#Î #Î#Îÿ"Îø"Îñ"Îê"Îã"ÎÜ"ÎÕ"ÎÎ"ÎÇ"ÎÀ"ι"β"Ϋ"Τ"Î"Ζ"Î"Έ"Î"Îz"Îs"Îl"Îe"Î^"ÎW"ÎP"ÎI"ÎB"Î;"Î4"Î-"Î&"Î"Î"Î"Î "Î"Îü!Îõ!Îî!Îç!Îà!ÎÙ!ÎÒ!ÎË!ÎÄ!ν!ζ!ί!Ψ!Ρ!Κ!Γ!ÎŒ!Î…!Î~!Îw!Îp!Îi!Îb!Î[!ÎT!ÎM!ÎF!Î?!Î8!Î1!Î*!Î#!Î!Î!Î!Î!Î!Îù Îò Îë Îä ÎÝ ÎÖ ÎÏ ÎÈ ÎÁ κ γ ά Î¥ Ξ Η ΠΉ ΂ Î{ Ît Îm Îf Î_ ÎX ÎQ ÎJ ÎC Î< Î5 Î. Î' Î Î Î Î Î ÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿ Îø Îñ Îê Îã ÎÜ ÎÕ ÎÎ ÎÇ ÎÀ ι β Ϋ Τ ΠΖ ΠΈ Î Îz Îs Îl Îe Î^ ÎW ÎP ÎI ÎB Î; Î4 Î- Î& Î Î Î Î Î Îü Îõ Îî Îç Îà ÎÙ ÎÒ ÎË ÎÄ Î½ ζ ί Ψ Ρ Κ Γ ÎŒ Î… Î~ Îw Îp Îi Îb Î[ ÎT ÎM ÎF Î? Î8 Î1 Î* Î# Î Î Î Î Î Îù Îò Îë Îä ÎÝ ÎÖ ÎÏ ÎÈ ÎÁ κ γ ά Î¥ Ξ Η ΠΉ ΂ Î{ Ît Îm Îf Î_ ÎX ÎQ ÎJ ÎC Î< Î5 Î. Î' Î Î Î Î Î Îý Îö Îï Îè Îá ÎÚ ÎÓ ÎÌ ÎŠξ η ΰ Ω ΢ Λ Δ ΠΆ Î Îx Îq Îj Îc Î\ ÎU ÎN ÎG Î@ Î9 Î2 Î+ Î$ Î Î Î Î Î Îú Îó Îì Îå ÎÞ Î× ÎÐ ÎÉ Î Î» δ έ Φ Ο Θ Α Ί ΃ Î| Îu În Îg Î` ÎY ÎR ÎK ÎD Î= Î6 Î/ Î( Î! Î Î Î Î ÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÿÍøÿÍñÿÍêÿÍãÿÍÜÿÍÕÿÍÎÿÍÇÿÍÀÿ͹ÿͲÿÍ«ÿͤÿÍÿÍ–ÿÍÿ͈ÿÍÿÍzÿÍsÿÍlÿÍeÿÍ^ÿÍWÿÍPÿÍIÿÍBÿÍ;ÿÍ4ÿÍ-ÿÍ&ÿÍÿÍÿÍÿÍ ÿÍÿÍüþÍõþÍîþÍçþÍàþÍÙþÍÒþÍËþÍÄþͽþͶþͯþͨþÍ¡þÍšþÍ“þÍŒþÍ…þÍ~þÍwþÍpþÍiþÍbþÍ[þÍTþÍMþÍFþÍ?þÍ8þÍ1þÍ*þÍ#þÍþÍþÍþÍþÍþÍùýÍòýÍëýÍäýÍÝýÍÖýÍÏýÍÈýÍÁýͺýͳýͬýÍ¥ýÍžýÍ—ýÍý͉ýÍ‚ýÍ{ýÍtýÍmýÍfýÍ_ýÍXýÍQýÍJýÍCýÍ<ýÍ5ýÍ.ýÍ'ýÍ ýÍýÍýÍ ýÍýÍýüÍöüÍïüÍèüÍáüÍÚüÍÓüÍÌüÍÅü;üÍ·üͰüÍ©üÍ¢üÍ›üÍ”üÍü͆üÍüÍxüÍqüÍjüÍcüÍ\üÍUüÍNüÍGüÍ@üÍ9üÍ2üÍ+üÍ$üÍüÍüÍüÍüÍüÍúûÍóûÍìûÍåûÍÞûÍ×ûÍÐûÍÉûÍÂûÍ»ûÍ´ûÍ­ûͦûÍŸû͘ûÍ‘ûÍŠû̓ûÍ|ûÍuûÍnûÍgûÍ`ûÍYûÍRûÍKûÍDûÍ=ûÍ6ûÍ/ûÍ(ûÍ!ûÍûÍûÍ ûÍûÍþúÍ÷úÍðúÍéúÍâúÍÛúÍÔúÍÍúÍÆúÍ¿ú͸úͱúͪúÍ£úÍœúÍ•úÍŽú͇úÍ€úÍyúÍrúÍkúÍdúÍ]úÍVúÍOúÍHúÍAúÍ:úÍ3úÍ,úÍ%úÍúÍúÍúÍ úÍúÍûùÍôùÍíùÍæùÍßùÍØùÍÑùÍÊùÍÃùͼù͵ùÍ®ùͧùÍ ùÍ™ùÍ’ùÍ‹ùÍ„ùÍ}ùÍvùÍoùÍhùÍaùÍZùÍSùÍLùÍEùÍ>ùÍ7ùÍ0ùÍ)ùÍ"ùÍùÍùÍ ùÍùÍÿøÍøøÍñøÍêøÍãøÍÜøÍÕøÍÎøÍÇøÍÀøÍ¹øÍ²øÍ«øÍ¤øÍøÍ–øÍøÍˆøÍøÍzøÍsøÍløÍeøÍ^øÍWøÍPøÍIøÍBøÍ;øÍ4øÍ-øÍ&øÍøÍøÍøÍ øÍøÍü÷Íõ÷Íî÷Íç÷Íà÷ÍÙ÷ÍÒ÷ÍË÷ÍÄ÷ͽ÷Ͷ÷ͯ÷ͨ÷Í¡÷Íš÷Í“÷ÍŒ÷Í…÷Í~÷Íw÷Íp÷Íi÷Íb÷Í[÷ÍT÷ÍM÷ÍF÷Í?÷Í8÷Í1÷Í*÷Í#÷Í÷Í÷Í÷Í÷Í÷ÍùöÍòöÍëöÍäöÍÝöÍÖöÍÏöÍÈöÍÁöͺöͳöͬöÍ¥öÍžöÍ—öÍö͉öÍ‚öÍ{öÍtöÍmöÍföÍ_öÍXöÍQöÍJöÍCöÍ<öÍ5öÍ.öÍ'öÍ öÍöÍöÍ öÍöÍýõÍöõÍïõÍèõÍáõÍÚõÍÓõÍÌõÍÅõ;õÍ·õͰõÍ©õÍ¢õÍ›õÍ”õÍõ͆õÍõÍxõÍqõÍjõÍcõÍ\õÍUõÍNõÍGõÍ@õÍ9õÍ2õÍ+õÍ$õÍõÍõÍõÍõÍõÍúôÍóôÍìôÍåôÍÞôÍ×ôÍÐôÍÉôÍÂôÍ»ôÍ´ôÍ­ôͦôÍŸô͘ôÍ‘ôÍŠô̓ôÍ|ôÍuôÍnôÍgôÍ`ôÍYôÍRôÍKôÍDôÍ=ôÍ6ôÍ/ôÍ(ôÍ!ôÍôÍôÍ ôÍôÍþóÍ÷óÍðóÍéóÍâóÍÛóÍÔóÍÍóÍÆóÍ¿ó͸óͱóͪóÍ£óÍœóÍ•óÍŽó͇óÍ€óÍyóÍróÍkóÍdóÍ]óÍVóÍOóÍHóÍAóÍ:óÍ3óÍ,óÍ%óÍóÍóÍóÍ óÍóÍûòÍôòÍíòÍæòÍßòÍØòÍÑòÍÊòÍÃòͼò͵òÍ®òͧòÍ òÍ™òÍ’òÍ‹òÍ„òÍ}òÍvòÍoòÍhòÍaòÍZòÍSòÍLòÍEòÍ>òÍ7òÍ0òÍ)òÍ"òÍòÍòÍ òÍòÍÿñÍøñÍññÍêñÍãñÍÜñÍÕñÍÎñÍÇñÍÀñ͹ñͲñÍ«ñͤñÍñÍ–ñÍñ͈ñÍñÍzñÍsñÍlñÍeñÍ^ñÍWñÍPñÍIñÍBñÍ;ñÍ4ñÍ-ñÍ&ñÍñÍñÍñÍ ñÍñÍüðÍõðÍîðÍçðÍàðÍÙðÍÒðÍËðÍÄðͽðͶðͯðͨðÍ¡ðÍšðÍ“ðÍŒðÍ…ðÍ~ðÍwðÍpðÍiðÍbðÍ[ðÍTðÍMðÍFðÍ?ðÍ8ðÍ1ðÍ*ðÍ#ðÍðÍðÍðÍðÍðÍùïÍòïÍëïÍäïÍÝïÍÖïÍÏïÍÈïÍÁïͺïͳïͬïÍ¥ïÍžïÍ—ïÍï͉ïÍ‚ïÍ{ïÍtïÍmïÍfïÍ_ïÍXïÍQïÍJïÍCïÍ<ïÍ5ïÍ.ïÍ'ïÍ ïÍïÍïÍ ïÍïÍýîÍöîÍïîÍèîÍáîÍÚîÍÓîÍÌîÍÅî;îÍ·îͰîÍ©îÍ¢îÍ›îÍ”îÍî͆îÍîÍxîÍqîÍjîÍcîÍ\îÍUîÍNîÍGîÍ@îÍ9îÍ2îÍ+îÍ$îÍîÍîÍîÍîÍîÍúíÍóíÍìíÍåíÍÞíÍ×íÍÐíÍÉíÍÂíÍ»íÍ´íÍ­íͦíÍŸí͘íÍ‘íÍŠí̓íÍ|íÍuíÍníÍgíÍ`íÍYíÍRíÍKíÍDíÍ=íÍ6íÍ/íÍ(íÍ!íÍíÍíÍ íÍíÍþìÍ÷ìÍðìÍéìÍâìÍÛìÍÔìÍÍìÍÆìÍ¿ì͸ìͱìͪìÍ£ìÍœìÍ•ìÍŽì͇ìÍ€ìÍyìÍrìÍkìÍdìÍ]ìÍVìÍOìÍHìÍAìÍ:ìÍ3ìÍ,ìÍ%ìÍìÍìÍìÍ ìÍìÍûëÍôëÍíëÍæëÍßëÍØëÍÑëÍÊëÍÃëͼë͵ëÍ®ëͧëÍ ëÍ™ëÍ’ëÍ‹ëÍ„ëÍ}ëÍvëÍoëÍhëÍaëÍZëÍSëÍLëÍEëÍ>ëÍ7ëÍ0ëÍ)ëÍ"ëÍëÍëÍ ëÍëÍÿêÍøêÍñêÍêêÍãêÍÜêÍÕêÍÎêÍÇêÍÀê͹êͲêÍ«êͤêÍêÍ–êÍê͈êÍêÍzêÍsêÍlêÍeêÍ^êÍWêÍPêÍIêÍBêÍ;êÍ4êÍ-êÍ&êÍêÍêÍêÍ êÍêÍüéÍõéÍîéÍçéÍàéÍÙéÍÒéÍËéÍÄéͽéͶéͯéͨéÍ¡éÍšéÍ“éÍŒéÍ…éÍ~éÍwéÍpéÍiéÍbéÍ[éÍTéÍMéÍFéÍ?éÍ8éÍ1éÍ*éÍ#éÍéÍéÍéÍéÍéÍùèÍòèÍëèÍäèÍÝèÍÖèÍÏèÍÈèÍÁèͺèͳèͬèÍ¥èÍžèÍ—èÍè͉èÍ‚èÍ{èÍtèÍmèÍfèÍ_èÍXèÍQèÍJèÍCèÍ<èÍ5èÍ.èÍ'èÍ èÍèÍèÍ èÍèÍýçÍöçÍïçÍèçÍáçÍÚçÍÓçÍÌçÍÅç;çÍ·çͰçÍ©çÍ¢çÍ›çÍ”çÍç͆çÍçÍxçÍqçÍjçÍcçÍ\çÍUçÍNçÍGçÍ@çÍ9çÍ2çÍ+çÍ$çÍçÍçÍçÍçÍçÍúæÍóæÍìæÍåæÍÞæÍ׿ÍÐæÍÉæÍÂæÍ»æÍ´æÍ­æÍ¦æÍŸæÍ˜æÍ‘æÍŠæÍƒæÍ|æÍuæÍnæÍgæÍ`æÍYæÍRæÍKæÍDæÍ=æÍ6æÍ/æÍ(æÍ!æÍæÍæÍ æÍæÍþåÍ÷åÍðåÍéåÍâåÍÛåÍÔåÍÍåÍÆåÍ¿å͸åͱåͪåÍ£åÍœåÍ•åÍŽå͇åÍ€åÍyåÍråÍkåÍdåÍ]åÍVåÍOåÍHåÍAåÍ:åÍ3åÍ,åÍ%åÍåÍåÍåÍ åÍåÍûäÍôäÍíäÍæäÍßäÍØäÍÑäÍÊäÍÃäͼä͵äÍ®äͧäÍ äÍ™äÍ’äÍ‹äÍ„äÍ}äÍväÍoäÍhäÍaäÍZäÍSäÍLäÍEäÍ>äÍ7äÍ0äÍ)äÍ"äÍäÍäÍ äÍäÍÿãÍøãÍñãÍêãÍããÍÜãÍÕãÍÎãÍÇãÍÀã͹ãͲãÍ«ãͤãÍãÍ–ãÍã͈ãÍãÍzãÍsãÍlãÍeãÍ^ãÍWãÍPãÍIãÍBãÍ;ãÍ4ãÍ-ãÍ&ãÍãÍãÍãÍ ãÍãÍüâÍõâÍîâÍçâÍàâÍÙâÍÒâÍËâÍÄâͽâͶâͯâͨâÍ¡âÍšâÍ“âÍŒâÍ…âÍ~âÍwâÍpâÍiâÍbâÍ[âÍTâÍMâÍFâÍ?âÍ8âÍ1âÍ*âÍ#âÍâÍâÍâÍâÍâÍùáÍòáÍëáÍäáÍÝáÍÖáÍÏáÍÈáÍÁáͺáͳáͬáÍ¥áÍžáÍ—áÍá͉áÍ‚áÍ{áÍtáÍmáÍfáÍ_áÍXáÍQáÍJáÍCáÍ<áÍ5áÍ.áÍ'áÍ áÍáÍáÍ áÍáÍýàÍöàÍïàÍèàÍáàÍÚàÍÓàÍÌàÍÅà;àÍ·àͰàÍ©àÍ¢àÍ›àÍ”àÍà͆àÍàÍxàÍqàÍjàÍcàÍ\àÍUàÍNàÍGàÍ@àÍ9àÍ2àÍ+àÍ$àÍàÍàÍàÍàÍàÍúßÍóßÍìßÍåßÍÞßÍ×ßÍÐßÍÉßÍÂßÍ»ßÍ´ßÍ­ßͦßÍŸß͘ßÍ‘ßÍŠß̓ßÍ|ßÍußÍnßÍgßÍ`ßÍYßÍRßÍKßÍDßÍ=ßÍ6ßÍ/ßÍ(ßÍ!ßÍßÍßÍ ßÍßÍþÞÍ÷ÞÍðÞÍéÞÍâÞÍÛÞÍÔÞÍÍÞÍÆÞÍ¿Þ͸ÞͱÞͪÞÍ£ÞÍœÞÍ•ÞÍŽÞ͇ÞÍ€ÞÍyÞÍrÞÍkÞÍdÞÍ]ÞÍVÞÍOÞÍHÞÍAÞÍ:ÞÍ3ÞÍ,ÞÍ%ÞÍÞÍÞÍÞÍ ÞÍÞÍûÝÍôÝÍíÝÍæÝÍßÝÍØÝÍÑÝÍÊÝÍÃÝͼÝ͵ÝÍ®ÝͧÝÍ ÝÍ™ÝÍ’ÝÍ‹ÝÍ„ÝÍ}ÝÍvÝÍoÝÍhÝÍaÝÍZÝÍSÝÍLÝÍEÝÍ>ÝÍ7ÝÍ0ÝÍ)ÝÍ"ÝÍÝÍÝÍ ÝÍÝÍÿÜÍøÜÍñÜÍêÜÍãÜÍÜÜÍÕÜÍÎÜÍÇÜÍÀÜ͹ÜͲÜÍ«ÜͤÜÍÜÍ–ÜÍÜ͈ÜÍÜÍzÜÍsÜÍlÜÍeÜÍ^ÜÍWÜÍPÜÍIÜÍBÜÍ;ÜÍ4ÜÍ-ÜÍ&ÜÍÜÍÜÍÜÍ ÜÍÜÍüÛÍõÛÍîÛÍçÛÍàÛÍÙÛÍÒÛÍËÛÍÄÛͽÛͶÛͯÛͨÛÍ¡ÛÍšÛÍ“ÛÍŒÛÍ…ÛÍ~ÛÍwÛÍpÛÍiÛÍbÛÍ[ÛÍTÛÍMÛÍFÛÍ?ÛÍ8ÛÍ1ÛÍ*ÛÍ#ÛÍÛÍÛÍÛÍÛÍÛÍùÚÍòÚÍëÚÍäÚÍÝÚÍÖÚÍÏÚÍÈÚÍÁÚͺÚͳÚͬÚÍ¥ÚÍžÚÍ—ÚÍÚ͉ÚÍ‚ÚÍ{ÚÍtÚÍmÚÍfÚÍ_ÚÍXÚÍQÚÍJÚÍCÚÍ<ÚÍ5ÚÍ.ÚÍ'ÚÍ ÚÍÚÍÚÍ ÚÍÚÍýÙÍöÙÍïÙÍèÙÍáÙÍÚÙÍÓÙÍÌÙÍÅÙ;ÙÍ·ÙͰÙÍ©ÙÍ¢ÙÍ›ÙÍ”ÙÍÙ͆ÙÍÙÍxÙÍqÙÍjÙÍcÙÍ\ÙÍUÙÍNÙÍGÙÍ@ÙÍ9ÙÍ2ÙÍ+ÙÍ$ÙÍÙÍÙÍÙÍÙÍÙÍúØÍóØÍìØÍåØÍÞØÍרÍÐØÍÉØÍÂØÍ»ØÍ´ØÍ­ØÍ¦ØÍŸØÍ˜ØÍ‘ØÍŠØÍƒØÍ|ØÍuØÍnØÍgØÍ`ØÍYØÍRØÍKØÍDØÍ=ØÍ6ØÍ/ØÍ(ØÍ!ØÍØÍØÍ ØÍØÍþ×Í÷×Íð×Íé×Íâ×ÍÛ×ÍÔ×ÍÍ×ÍÆ×Í¿×͸×ͱ×ͪ×Í£×Íœ×Í•×ÍŽ×͇×Í€×Íy×Ír×Ík×Íd×Í]×ÍV×ÍO×ÍH×ÍA×Í:×Í3×Í,×Í%×Í×Í×Í×Í ×Í×ÍûÖÍôÖÍíÖÍæÖÍßÖÍØÖÍÑÖÍÊÖÍÃÖͼÖ͵ÖÍ®ÖͧÖÍ ÖÍ™ÖÍ’ÖÍ‹ÖÍ„ÖÍ}ÖÍvÖÍoÖÍhÖÍaÖÍZÖÍSÖÍLÖÍEÖÍ>ÖÍ7ÖÍ0ÖÍ)ÖÍ"ÖÍÖÍÖÍ ÖÍÖÍÿÕÍøÕÍñÕÍêÕÍãÕÍÜÕÍÕÕÍÎÕÍÇÕÍÀÕ͹ÕͲÕÍ«ÕͤÕÍÕÍ–ÕÍÕ͈ÕÍÕÍzÕÍsÕÍlÕÍeÕÍ^ÕÍWÕÍPÕÍIÕÍBÕÍ;ÕÍ4ÕÍ-ÕÍ&ÕÍÕÍÕÍÕÍ ÕÍÕÍüÔÍõÔÍîÔÍçÔÍàÔÍÙÔÍÒÔÍËÔÍÄÔͽÔͶÔͯÔͨÔÍ¡ÔÍšÔÍ“ÔÍŒÔÍ…ÔÍ~ÔÍwÔÍpÔÍiÔÍbÔÍ[ÔÍTÔÍMÔÍFÔÍ?ÔÍ8ÔÍ1ÔÍ*ÔÍ#ÔÍÔÍÔÍÔÍÔÍÔÍùÓÍòÓÍëÓÍäÓÍÝÓÍÖÓÍÏÓÍÈÓÍÁÓͺÓͳÓͬÓÍ¥ÓÍžÓÍ—ÓÍÓ͉ÓÍ‚ÓÍ{ÓÍtÓÍmÓÍfÓÍ_ÓÍXÓÍQÓÍJÓÍCÓÍ<ÓÍ5ÓÍ.ÓÍ'ÓÍ ÓÍÓÍÓÍ ÓÍÓÍýÒÍöÒÍïÒÍèÒÍáÒÍÚÒÍÓÒÍÌÒÍÅÒ;ÒÍ·ÒͰÒÍ©ÒÍ¢ÒÍ›ÒÍ”ÒÍÒ͆ÒÍÒÍxÒÍqÒÍjÒÍcÒÍ\ÒÍUÒÍNÒÍGÒÍ@ÒÍ9ÒÍ2ÒÍ+ÒÍ$ÒÍÒÍÒÍÒÍÒÍÒÍúÑÍóÑÍìÑÍåÑÍÞÑÍ×ÑÍÐÑÍÉÑÍÂÑÍ»ÑÍ´ÑÍ­ÑͦÑÍŸÑ͘ÑÍ‘ÑÍŠÑ̓ÑÍ|ÑÍuÑÍnÑÍgÑÍ`ÑÍYÑÍRÑÍKÑÍDÑÍ=ÑÍ6ÑÍ/ÑÍ(ÑÍ!ÑÍÑÍÑÍ ÑÍÑÍþÐÍ÷ÐÍðÐÍéÐÍâÐÍÛÐÍÔÐÍÍÐÍÆÐÍ¿Ð͸ÐͱÐͪÐÍ£ÐÍœÐÍ•ÐÍŽÐ͇ÐÍ€ÐÍyÐÍrÐÍkÐÍdÐÍ]ÐÍVÐÍOÐÍHÐÍAÐÍ:ÐÍ3ÐÍ,ÐÍ%ÐÍÐÍÐÍÐÍ ÐÍÐÍûÏÍôÏÍíÏÍæÏÍßÏÍØÏÍÑÏÍÊÏÍÃÏͼÏ͵ÏÍ®ÏͧÏÍ ÏÍ™ÏÍ’ÏÍ‹ÏÍ„ÏÍ}ÏÍvÏÍoÏÍhÏÍaÏÍZÏÍSÏÍLÏÍEÏÍ>ÏÍ7ÏÍ0ÏÍ)ÏÍ"ÏÍÏÍÏÍ ÏÍÏÍÿÎÍøÎÍñÎÍêÎÍãÎÍÜÎÍÕÎÍÎÎÍÇÎÍÀÎ͹ÎͲÎÍ«ÎͤÎÍÎÍ–ÎÍÎ͈ÎÍÎÍzÎÍsÎÍlÎÍeÎÍ^ÎÍWÎÍPÎÍIÎÍBÎÍ;ÎÍ4ÎÍ-ÎÍ&ÎÍÎÍÎÍÎÍ ÎÍÎÍüÍÍõÍÍîÍÍçÍÍàÍÍÙÍÍÒÍÍËÍÍÄÍͽÍͶÍͯÍͨÍÍ¡ÍÍšÍÍ“ÍÍŒÍÍ…ÍÍ~ÍÍwÍÍpÍÍiÍÍbÍÍ[ÍÍTÍÍMÍÍFÍÍ?ÍÍ8ÍÍ1ÍÍ*ÍÍ#ÍÍÍÍÍÍÍÍÍÍÍÍùÌÍòÌÍëÌÍäÌÍÝÌÍÖÌÍÏÌÍÈÌÍÁÌͺÌͳÌͬÌÍ¥ÌÍžÌÍ—ÌÍÌ͉ÌÍ‚ÌÍ{ÌÍtÌÍmÌÍfÌÍ_ÌÍXÌÍQÌÍJÌÍCÌÍ<ÌÍ5ÌÍ.ÌÍ'ÌÍ ÌÍÌÍÌÍ ÌÍÌÍýËÍöËÍïËÍèËÍáËÍÚËÍÓËÍÌËÍÅË;ËÍ·ËͰËÍ©ËÍ¢ËÍ›ËÍ”ËÍË͆ËÍËÍxËÍqËÍjËÍcËÍ\ËÍUËÍNËÍGËÍ@ËÍ9ËÍ2ËÍ+ËÍ$ËÍËÍËÍËÍËÍËÍúÊÍóÊÍìÊÍåÊÍÞÊÍ×ÊÍÐÊÍÉÊÍÂÊÍ»ÊÍ´ÊÍ­ÊͦÊÍŸÊ͘ÊÍ‘ÊÍŠÊ̓ÊÍ|ÊÍuÊÍnÊÍgÊÍ`ÊÍYÊÍRÊÍKÊÍDÊÍ=ÊÍ6ÊÍ/ÊÍ(ÊÍ!ÊÍÊÍÊÍ ÊÍÊÍþÉÍ÷ÉÍðÉÍéÉÍâÉÍÛÉÍÔÉÍÍÉÍÆÉÍ¿É͸ÉͱÉͪÉÍ£ÉÍœÉÍ•ÉÍŽÉ͇ÉÍ€ÉÍyÉÍrÉÍkÉÍdÉÍ]ÉÍVÉÍOÉÍHÉÍAÉÍ:ÉÍ3ÉÍ,ÉÍ%ÉÍÉÍÉÍÉÍ ÉÍÉÍûÈÍôÈÍíÈÍæÈÍßÈÍØÈÍÑÈÍÊÈÍÃÈͼÈ͵ÈÍ®ÈͧÈÍ ÈÍ™ÈÍ’ÈÍ‹ÈÍ„ÈÍ}ÈÍvÈÍoÈÍhÈÍaÈÍZÈÍSÈÍLÈÍEÈÍ>ÈÍ7ÈÍ0ÈÍ)ÈÍ"ÈÍÈÍÈÍ ÈÍÈÍÿÇÍøÇÍñÇÍêÇÍãÇÍÜÇÍÕÇÍÎÇÍÇÇÍÀÇ͹ÇͲÇÍ«ÇͤÇÍÇÍ–ÇÍÇ͈ÇÍÇÍzÇÍsÇÍlÇÍeÇÍ^ÇÍWÇÍPÇÍIÇÍBÇÍ;ÇÍ4ÇÍ-ÇÍ&ÇÍÇÍÇÍÇÍ ÇÍÇÍüÆÍõÆÍîÆÍçÆÍàÆÍÙÆÍÒÆÍËÆÍÄÆÍ½ÆÍ¶ÆÍ¯ÆÍ¨ÆÍ¡ÆÍšÆÍ“ÆÍŒÆÍ…ÆÍ~ÆÍwÆÍpÆÍiÆÍbÆÍ[ÆÍTÆÍMÆÍFÆÍ?ÆÍ8ÆÍ1ÆÍ*ÆÍ#ÆÍÆÍÆÍÆÍÆÍÆÍùÅÍòÅÍëÅÍäÅÍÝÅÍÖÅÍÏÅÍÈÅÍÁÅͺÅͳÅͬÅÍ¥ÅÍžÅÍ—ÅÍÅ͉ÅÍ‚ÅÍ{ÅÍtÅÍmÅÍfÅÍ_ÅÍXÅÍQÅÍJÅÍCÅÍ<ÅÍ5ÅÍ.ÅÍ'ÅÍ ÅÍÅÍÅÍ ÅÍÅÍýÄÍöÄÍïÄÍèÄÍáÄÍÚÄÍÓÄÍÌÄÍÅÄ;ÄÍ·ÄͰÄÍ©ÄÍ¢ÄÍ›ÄÍ”ÄÍÄ͆ÄÍÄÍxÄÍqÄÍjÄÍcÄÍ\ÄÍUÄÍNÄÍGÄÍ@ÄÍ9ÄÍ2ÄÍ+ÄÍ$ÄÍÄÍÄÍÄÍÄÍÄÍúÃÍóÃÍìÃÍåÃÍÞÃÍ×ÃÍÐÃÍÉÃÍÂÃÍ»ÃÍ´ÃÍ­ÃͦÃÍŸÃ͘ÃÍ‘ÃÍŠÃ̓ÃÍ|ÃÍuÃÍnÃÍgÃÍ`ÃÍYÃÍRÃÍKÃÍDÃÍ=ÃÍ6ÃÍ/ÃÍ(ÃÍ!ÃÍÃÍÃÍ ÃÍÃÍþÂÍ÷ÂÍðÂÍéÂÍâÂÍÛÂÍÔÂÍÍÂÍÆÂÍ¿Â͸ÂͱÂͪÂÍ£ÂÍœÂÍ•ÂÍŽÂ͇ÂÍ€ÂÍyÂÍrÂÍkÂÍdÂÍ]ÂÍVÂÍOÂÍHÂÍAÂÍ:ÂÍ3ÂÍ,ÂÍ%ÂÍÂÍÂÍÂÍ ÂÍÂÍûÁÍôÁÍíÁÍæÁÍßÁÍØÁÍÑÁÍÊÁÍÃÁͼÁ͵ÁÍ®ÁͧÁÍ ÁÍ™ÁÍ’ÁÍ‹ÁÍ„ÁÍ}ÁÍvÁÍoÁÍhÁÍaÁÍZÁÍSÁÍLÁÍEÁÍ>ÁÍ7ÁÍ0ÁÍ)ÁÍ"ÁÍÁÍÁÍ ÁÍÁÍÿÀÍøÀÍñÀÍêÀÍãÀÍÜÀÍÕÀÍÎÀÍÇÀÍÀÀ͹ÀͲÀÍ«ÀͤÀÍÀÍ–ÀÍÀ͈ÀÍÀÍzÀÍsÀÍlÀÍeÀÍ^ÀÍWÀÍPÀÍIÀÍBÀÍ;ÀÍ4ÀÍ-ÀÍ&ÀÍÀÍÀÍÀÍ ÀÍÀÍü¿Íõ¿Íî¿Íç¿Íà¿ÍÙ¿ÍÒ¿ÍË¿ÍĿͽ¿Í¶¿Í¯¿Í¨¿Í¡¿Íš¿Í“¿ÍŒ¿Í…¿Í~¿Íw¿Íp¿Íi¿Íb¿Í[¿ÍT¿ÍM¿ÍF¿Í?¿Í8¿Í1¿Í*¿Í#¿Í¿Í¿Í¿Í¿Í¿Íù¾Íò¾Íë¾Íä¾ÍݾÍÖ¾ÍϾÍȾÍÁ¾Íº¾Í³¾Í¬¾Í¥¾Íž¾Í—¾Í¾Í‰¾Í‚¾Í{¾Ít¾Ím¾Íf¾Í_¾ÍX¾ÍQ¾ÍJ¾ÍC¾Í<¾Í5¾Í.¾Í'¾Í ¾Í¾Í¾Í ¾Í¾Íý½Íö½Íï½Íè½Íá½ÍÚ½ÍÓ½Í͎̽;½Í·½Í°½Í©½Í¢½Í›½Í”½Í½Í†½Í½Íx½Íq½Íj½Íc½Í\½ÍU½ÍN½ÍG½Í@½Í9½Í2½Í+½Í$½Í½Í½Í½Í½Í½Íú¼Íó¼Íì¼Íå¼ÍÞ¼Í×¼ÍмÍɼͼͻ¼Í´¼Í­¼Í¦¼ÍŸ¼Í˜¼Í‘¼Íм̓¼Í|¼Íu¼Ín¼Íg¼Í`¼ÍY¼ÍR¼ÍK¼ÍD¼Í=¼Í6¼Í/¼Í(¼Í!¼Í¼Í¼Í ¼Í¼Íþ»Í÷»Íð»Íé»Íâ»ÍÛ»ÍÔ»ÍÍ»ÍÆ»Í¿»Í¸»Í±»Íª»Í£»Íœ»Í•»ÍŽ»Í‡»Í€»Íy»Ír»Ík»Íd»Í]»ÍV»ÍO»ÍH»ÍA»Í:»Í3»Í,»Í%»Í»Í»Í»Í »Í»ÍûºÍôºÍíºÍæºÍߺÍغÍѺÍʺÍúͼºÍµºÍ®ºÍ§ºÍ ºÍ™ºÍ’ºÍ‹ºÍ„ºÍ}ºÍvºÍoºÍhºÍaºÍZºÍSºÍLºÍEºÍ>ºÍ7ºÍ0ºÍ)ºÍ"ºÍºÍºÍ ºÍºÍÿ¹Íø¹Íñ¹Íê¹Íã¹ÍܹÍÕ¹ÍιÍǹÍÀ¹Í¹¹Í²¹Í«¹Í¤¹Í¹Í–¹Í¹Íˆ¹Í¹Íz¹Ís¹Íl¹Íe¹Í^¹ÍW¹ÍP¹ÍI¹ÍB¹Í;¹Í4¹Í-¹Í&¹Í¹Í¹Í¹Í ¹Í¹Íü¸Íõ¸Íî¸Íç¸Íà¸ÍÙ¸ÍÒ¸Í˸Íĸͽ¸Í¶¸Í¯¸Í¨¸Í¡¸Íš¸Í“¸ÍŒ¸Í…¸Í~¸Íw¸Íp¸Íi¸Íb¸Í[¸ÍT¸ÍM¸ÍF¸Í?¸Í8¸Í1¸Í*¸Í#¸Í¸Í¸Í¸Í¸Í¸Íù·Íò·Íë·Íä·ÍÝ·ÍÖ·ÍÏ·ÍÈ·ÍÁ·Íº·Í³·Í¬·Í¥·Íž·Í—·Í·Í‰·Í‚·Í{·Ít·Ím·Íf·Í_·ÍX·ÍQ·ÍJ·ÍC·Í<·Í5·Í.·Í'·Í ·Í·Í·Í ·Í·Íý¶Íö¶Íï¶Íè¶Íá¶ÍÚ¶ÍÓ¶Í̶ÍŶ;¶Í·¶Í°¶Í©¶Í¢¶Í›¶Í”¶Í¶Í†¶Í¶Íx¶Íq¶Íj¶Íc¶Í\¶ÍU¶ÍN¶ÍG¶Í@¶Í9¶Í2¶Í+¶Í$¶Í¶Í¶Í¶Í¶Í¶ÍúµÍóµÍìµÍåµÍÞµÍ×µÍеÍɵ͵ͻµÍ´µÍ­µÍ¦µÍŸµÍ˜µÍ‘µÍе̓µÍ|µÍuµÍnµÍgµÍ`µÍYµÍRµÍKµÍDµÍ=µÍ6µÍ/µÍ(µÍ!µÍµÍµÍ µÍµÍþ´Í÷´Íð´Íé´Íâ´ÍÛ´ÍÔ´ÍÍ´ÍÆ´Í¿´Í¸´Í±´Íª´Í£´Íœ´Í•´ÍŽ´Í‡´Í€´Íy´Ír´Ík´Íd´Í]´ÍV´ÍO´ÍH´ÍA´Í:´Í3´Í,´Í%´Í´Í´Í´Í ´Í´Íû³Íô³Íí³Íæ³Íß³ÍسÍѳÍʳÍóͼ³Íµ³Í®³Í§³Í ³Í™³Í’³Í‹³Í„³Í}³Ív³Ío³Íh³Ía³ÍZ³ÍS³ÍL³ÍE³Í>³Í7³Í0³Í)³Í"³Í³Í³Í ³Í³Íÿ²Íø²Íñ²Íê²Íã²ÍܲÍÕ²ÍβÍDzÍÀ²Í¹²Í²²Í«²Í¤²Í²Í–²Í²Íˆ²Í²Íz²Ís²Íl²Íe²Í^²ÍW²ÍP²ÍI²ÍB²Í;²Í4²Í-²Í&²Í²Í²Í²Í ²Í²Íü±Íõ±Íî±Íç±Íà±ÍÙ±ÍÒ±Í˱Íıͽ±Í¶±Í¯±Í¨±Í¡±Íš±Í“±ÍŒ±Í…±Í~±Íw±Íp±Íi±Íb±Í[±ÍT±ÍM±ÍF±Í?±Í8±Í1±Í*±Í#±Í±Í±Í±Í±Í±Íù°Íò°Íë°Íä°ÍݰÍÖ°ÍϰÍȰÍÁ°Íº°Í³°Í¬°Í¥°Íž°Í—°Í°Í‰°Í‚°Í{°Ít°Ím°Íf°Í_°ÍX°ÍQ°ÍJ°ÍC°Í<°Í5°Í.°Í'°Í °Í°Í°Í °Í°Íý¯Íö¯Íï¯Íè¯Íá¯ÍÚ¯ÍÓ¯Í̯Íů;¯Í·¯Í°¯Í©¯Í¢¯Í›¯Í”¯Í¯Í†¯Í¯Íx¯Íq¯Íj¯Íc¯Í\¯ÍU¯ÍN¯ÍG¯Í@¯Í9¯Í2¯Í+¯Í$¯Í¯Í¯Í¯Í¯Í¯Íú®Íó®Íì®Íå®ÍÞ®Í×®ÍЮÍɮͮͻ®Í´®Í­®Í¦®ÍŸ®Í˜®Í‘®ÍŠ®Íƒ®Í|®Íu®Ín®Íg®Í`®ÍY®ÍR®ÍK®ÍD®Í=®Í6®Í/®Í(®Í!®Í®Í®Í ®Í®Íþ­Í÷­Íð­Íé­Íâ­ÍÛ­ÍÔ­ÍÍ­ÍÆ­Í¿­Í¸­Í±­Íª­Í£­Íœ­Í•­ÍŽ­Í‡­Í€­Íy­Ír­Ík­Íd­Í]­ÍV­ÍO­ÍH­ÍA­Í:­Í3­Í,­Í%­Í­Í­Í­Í ­Í­Íû¬Íô¬Íí¬Íæ¬Í߬ÍجÍѬÍʬÍìͼ¬Íµ¬Í®¬Í§¬Í ¬Í™¬Í’¬Í‹¬Í„¬Í}¬Ív¬Ío¬Íh¬Ía¬ÍZ¬ÍS¬ÍL¬ÍE¬Í>¬Í7¬Í0¬Í)¬Í"¬Í¬Í¬Í ¬Í¬Íÿ«Íø«Íñ«Íê«Íã«ÍÜ«ÍÕ«ÍΫÍÇ«ÍÀ«Í¹«Í²«Í««Í¤«Í«Í–«Í«Íˆ«Í«Íz«Ís«Íl«Íe«Í^«ÍW«ÍP«ÍI«ÍB«Í;«Í4«Í-«Í&«Í«Í«Í«Í «Í«ÍüªÍõªÍîªÍçªÍàªÍÙªÍÒªÍ˪ÍĪͽªÍ¶ªÍ¯ªÍ¨ªÍ¡ªÍšªÍ“ªÍŒªÍ…ªÍ~ªÍwªÍpªÍiªÍbªÍ[ªÍTªÍMªÍFªÍ?ªÍ8ªÍ1ªÍ*ªÍ#ªÍªÍªÍªÍªÍªÍù©Íò©Íë©Íä©ÍÝ©ÍÖ©ÍÏ©ÍÈ©ÍÁ©Íº©Í³©Í¬©Í¥©Íž©Í—©Í©Í‰©Í‚©Í{©Ít©Ím©Íf©Í_©ÍX©ÍQ©ÍJ©ÍC©Í<©Í5©Í.©Í'©Í ©Í©Í©Í ©Í©Íý¨Íö¨Íï¨Íè¨Íá¨ÍÚ¨ÍÓ¨Į́ÍŨ;¨Í·¨Í°¨Í©¨Í¢¨Í›¨Í”¨Í¨Í†¨Í¨Íx¨Íq¨Íj¨Íc¨Í\¨ÍU¨ÍN¨ÍG¨Í@¨Í9¨Í2¨Í+¨Í$¨Í¨Í¨Í¨Í¨Í¨Íú§Íó§Íì§Íå§ÍÞ§Í×§ÍЧÍɧͧͻ§Í´§Í­§Í¦§ÍŸ§Í˜§Í‘§ÍЧ̓§Í|§Íu§Ín§Íg§Í`§ÍY§ÍR§ÍK§ÍD§Í=§Í6§Í/§Í(§Í!§Í§Í§Í §Í§Íþ¦Í÷¦Íð¦Íé¦Íâ¦ÍÛ¦ÍÔ¦ÍͦÍƦÍ¿¦Í¸¦Í±¦Íª¦Í£¦Íœ¦Í•¦Íަ͇¦Í€¦Íy¦Ír¦Ík¦Íd¦Í]¦ÍV¦ÍO¦ÍH¦ÍA¦Í:¦Í3¦Í,¦Í%¦Í¦Í¦Í¦Í ¦Í¦Íû¥Íô¥Íí¥Íæ¥ÍߥÍØ¥ÍÑ¥ÍÊ¥Íåͼ¥Íµ¥Í®¥Í§¥Í ¥Í™¥Í’¥Í‹¥Í„¥Í}¥Ív¥Ío¥Íh¥Ía¥ÍZ¥ÍS¥ÍL¥ÍE¥Í>¥Í7¥Í0¥Í)¥Í"¥Í¥Í¥Í ¥Í¥Íÿ¤Íø¤Íñ¤Íê¤Íã¤ÍܤÍÕ¤ÍΤÍǤÍÀ¤Í¹¤Í²¤Í«¤Í¤¤Í¤Í–¤Í¤Íˆ¤Í¤Íz¤Ís¤Íl¤Íe¤Í^¤ÍW¤ÍP¤ÍI¤ÍB¤Í;¤Í4¤Í-¤Í&¤Í¤Í¤Í¤Í ¤Í¤Íü£Íõ£Íî£Íç£Íà£ÍÙ£ÍÒ£ÍË£Íģͽ£Í¶£Í¯£Í¨£Í¡£Íš£Í“£ÍŒ£Í…£Í~£Íw£Íp£Íi£Íb£Í[£ÍT£ÍM£ÍF£Í?£Í8£Í1£Í*£Í#£Í£Í£Í£Í£Í£Íù¢Íò¢Íë¢Íä¢ÍÝ¢ÍÖ¢ÍÏ¢ÍÈ¢ÍÁ¢Íº¢Í³¢Í¬¢Í¥¢Íž¢Í—¢Í¢Í‰¢Í‚¢Í{¢Ít¢Ím¢Íf¢Í_¢ÍX¢ÍQ¢ÍJ¢ÍC¢Í<¢Í5¢Í.¢Í'¢Í ¢Í¢Í¢Í ¢Í¢Íý¡Íö¡Íï¡Íè¡Íá¡ÍÚ¡ÍÓ¡Í̡͚;¡Í·¡Í°¡Í©¡Í¢¡Í›¡Í”¡Í¡Í†¡Í¡Íx¡Íq¡Íj¡Íc¡Í\¡ÍU¡ÍN¡ÍG¡Í@¡Í9¡Í2¡Í+¡Í$¡Í¡Í¡Í¡Í¡Í¡Íú Íó Íì Íå ÍÞ Í× ÍРÍÉ Í Í» Í´ Í­ Í¦ ÍŸ Í˜ Í‘ ÍŠ Íƒ Í| Íu Ín Íg Í` ÍY ÍR ÍK ÍD Í= Í6 Í/ Í( Í! Í Í Í  Í ÍþŸÍ÷ŸÍðŸÍéŸÍâŸÍÛŸÍÔŸÍÍŸÍÆŸÍ¿ŸÍ¸ŸÍ±ŸÍªŸÍ£ŸÍœŸÍ•ŸÍŽŸÍ‡ŸÍ€ŸÍyŸÍrŸÍkŸÍdŸÍ]ŸÍVŸÍOŸÍHŸÍAŸÍ:ŸÍ3ŸÍ,ŸÍ%ŸÍŸÍŸÍŸÍ ŸÍŸÍûžÍôžÍížÍæžÍßžÍØžÍÑžÍÊžÍÞͼžÍµžÍ®žÍ§žÍ žÍ™žÍ’žÍ‹žÍ„žÍ}žÍvžÍožÍhžÍažÍZžÍSžÍLžÍEžÍ>žÍ7žÍ0žÍ)žÍ"žÍžÍžÍ žÍžÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüœÍõœÍîœÍçœÍàœÍÙœÍÒœÍËœÍĜͽœÍ¶œÍ¯œÍ¨œÍ¡œÍšœÍ“œÍŒœÍ…œÍ~œÍwœÍpœÍiœÍbœÍ[œÍTœÍMœÍFœÍ?œÍ8œÍ1œÍ*œÍ#œÍœÍœÍœÍœÍœÍù›Íò›Íë›Íä›ÍÝ›ÍÖ›ÍÏ›ÍÈ›ÍÁ›Íº›Í³›Í¬›Í¥›Íž›Í—›Í›Í‰›Í‚›Í{›Ít›Ím›Íf›Í_›ÍX›ÍQ›ÍJ›ÍC›Í<›Í5›Í.›Í'›Í ›Í›Í›Í ›Í›ÍýšÍöšÍïšÍèšÍášÍÚšÍÓšÍÌšÍŚ;šÍ·šÍ°šÍ©šÍ¢šÍ›šÍ”šÍšÍ†šÍšÍxšÍqšÍjšÍcšÍ\šÍUšÍNšÍGšÍ@šÍ9šÍ2šÍ+šÍ$šÍšÍšÍšÍšÍšÍú™Íó™Íì™Íå™ÍÞ™Í×™ÍЙÍə͙ͻ™Í´™Í­™Í¦™ÍŸ™Í˜™Í‘™ÍŠ™Íƒ™Í|™Íu™Ín™Íg™Í`™ÍY™ÍR™ÍK™ÍD™Í=™Í6™Í/™Í(™Í!™Í™Í™Í ™Í™Íþ˜Í÷˜Íð˜Íé˜Íâ˜ÍÛ˜ÍÔ˜Í͘ÍƘÍ¿˜Í¸˜Í±˜Íª˜Í£˜Íœ˜Í•˜ÍŽ˜Í‡˜Í€˜Íy˜Ír˜Ík˜Íd˜Í]˜ÍV˜ÍO˜ÍH˜ÍA˜Í:˜Í3˜Í,˜Í%˜Í˜Í˜Í˜Í ˜Í˜Íû—Íô—Íí—Íæ—Íß—ÍØ—ÍÑ—ÍÊ—Í×ͼ—͵—Í®—ͧ—Í —Í™—Í’—Í‹—Í„—Í}—Ív—Ío—Íh—Ía—ÍZ—ÍS—ÍL—ÍE—Í>—Í7—Í0—Í)—Í"—Í—Í—Í —Í—Íÿ–Íø–Íñ–Íê–Íã–ÍÜ–ÍÕ–ÍΖÍÇ–ÍÀ–͹–Ͳ–Í«–ͤ–Í–Í––͖͈–Í–Íz–Ís–Íl–Íe–Í^–ÍW–ÍP–ÍI–ÍB–Í;–Í4–Í-–Í&–Í–Í–Í–Í –Í–Íü•Íõ•Íî•Íç•Íà•ÍÙ•ÍÒ•ÍË•Íĕͽ•Ͷ•ͯ•ͨ•Í¡•Íš•Í“•ÍŒ•Í…•Í~•Íw•Íp•Íi•Íb•Í[•ÍT•ÍM•ÍF•Í?•Í8•Í1•Í*•Í#•͕͕͕͕͕Íù”Íò”Íë”Íä”ÍÝ”ÍÖ”ÍÏ”ÍÈ”ÍÁ”ͺ”ͳ”ͬ”Í¥”Íž”Í—”͔͉”Í‚”Í{”Ít”Ím”Íf”Í_”ÍX”ÍQ”ÍJ”ÍC”Í<”Í5”Í.”Í'”Í ”Í”Í”Í ”Í”Íý“Íö“Íï“Íè“Íá“ÍÚ“ÍÓ“Í̓͜;“Í·“Ͱ“Í©“Í¢“Í›“Í”“͓͆“Í“Íx“Íq“Íj“Íc“Í\“ÍU“ÍN“ÍG“Í@“Í9“Í2“Í+“Í$“͓͓͓͓͓Íú’Íó’Íì’Íå’ÍÞ’Í×’ÍÐ’ÍÉ’ÍÂ’Í»’Í´’Í­’ͦ’ÍŸ’͘’Í‘’ÍŠ’̓’Í|’Íu’Ín’Íg’Í`’ÍY’ÍR’ÍK’ÍD’Í=’Í6’Í/’Í(’Í!’Í’Í’Í ’Í’Íþ‘Í÷‘Íð‘Íé‘Íâ‘ÍÛ‘ÍÔ‘ÍÍ‘ÍÆ‘Í¿‘͸‘ͱ‘ͪ‘Í£‘Íœ‘Í•‘ÍŽ‘͇‘Í€‘Íy‘Ír‘Ík‘Íd‘Í]‘ÍV‘ÍO‘ÍH‘ÍA‘Í:‘Í3‘Í,‘Í%‘Í‘Í‘Í‘Í ‘Í‘ÍûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüŽÍõŽÍîŽÍçŽÍàŽÍÙŽÍÒŽÍËŽÍĎͽŽÍ¶ŽÍ¯ŽÍ¨ŽÍ¡ŽÍšŽÍ“ŽÍŒŽÍ…ŽÍ~ŽÍwŽÍpŽÍiŽÍbŽÍ[ŽÍTŽÍMŽÍFŽÍ?ŽÍ8ŽÍ1ŽÍ*ŽÍ#ŽÍŽÍŽÍŽÍŽÍŽÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýŒÍöŒÍïŒÍèŒÍáŒÍÚŒÍÓŒÍÌŒÍŌ;ŒÍ·ŒÍ°ŒÍ©ŒÍ¢ŒÍ›ŒÍ”ŒÍŒÍ†ŒÍŒÍxŒÍqŒÍjŒÍcŒÍ\ŒÍUŒÍNŒÍGŒÍ@ŒÍ9ŒÍ2ŒÍ+ŒÍ$ŒÍŒÍŒÍŒÍŒÍŒÍú‹Íó‹Íì‹Íå‹ÍÞ‹Í׋ÍЋÍɋ͋ͻ‹Í´‹Í­‹Í¦‹ÍŸ‹Í˜‹Í‘‹ÍŠ‹Íƒ‹Í|‹Íu‹Ín‹Íg‹Í`‹ÍY‹ÍR‹ÍK‹ÍD‹Í=‹Í6‹Í/‹Í(‹Í!‹Í‹Í‹Í ‹Í‹ÍþŠÍ÷ŠÍðŠÍéŠÍâŠÍÛŠÍÔŠÍÍŠÍÆŠÍ¿ŠÍ¸ŠÍ±ŠÍªŠÍ£ŠÍœŠÍ•ŠÍŽŠÍ‡ŠÍ€ŠÍyŠÍrŠÍkŠÍdŠÍ]ŠÍVŠÍOŠÍHŠÍAŠÍ:ŠÍ3ŠÍ,ŠÍ%ŠÍŠÍŠÍŠÍ ŠÍŠÍû‰Íô‰Íí‰Íæ‰Í߉Í؉ÍщÍʉÍÉͼ‰Íµ‰Í®‰Í§‰Í ‰Í™‰Í’‰Í‹‰Í„‰Í}‰Ív‰Ío‰Íh‰Ía‰ÍZ‰ÍS‰ÍL‰ÍE‰Í>‰Í7‰Í0‰Í)‰Í"‰Í‰Í‰Í ‰Í‰ÍÿˆÍøˆÍñˆÍêˆÍãˆÍ܈ÍÕˆÍΈÍLjÍÀˆÍ¹ˆÍ²ˆÍ«ˆÍ¤ˆÍˆÍ–ˆÍˆÍˆˆÍˆÍzˆÍsˆÍlˆÍeˆÍ^ˆÍWˆÍPˆÍIˆÍBˆÍ;ˆÍ4ˆÍ-ˆÍ&ˆÍˆÍˆÍˆÍ ˆÍˆÍü‡Íõ‡Íî‡Íç‡Íà‡ÍÙ‡ÍÒ‡ÍˇÍćͽ‡Í¶‡Í¯‡Í¨‡Í¡‡Íš‡Í“‡ÍŒ‡Í…‡Í~‡Íw‡Íp‡Íi‡Íb‡Í[‡ÍT‡ÍM‡ÍF‡Í?‡Í8‡Í1‡Í*‡Í#‡Í‡Í‡Í‡Í‡Í‡Íù†Íò†Íë†Íä†Í݆ÍÖ†ÍφÍȆÍÁ†Íº†Í³†Í¬†Í¥†Íž†Í—†Í†Í‰†Í‚†Í{†Ít†Ím†Íf†Í_†ÍX†ÍQ†ÍJ†ÍC†Í<†Í5†Í.†Í'†Í †Í†Í†Í †Í†Íý…Íö…Íï…Íè…Íá…ÍÚ…ÍÓ…ÍÌ…ÍŅ;…Í·…Ͱ…Í©…Í¢…Í›…Í”…͆ͅ…Í…Íx…Íq…Íj…Íc…Í\…ÍU…ÍN…ÍG…Í@…Í9…Í2…Í+…Í$…Í…Í…Í…Í…Í…Íú„Íó„Íì„Íå„ÍÞ„ÍׄÍЄÍɄ̈́ͻ„Í´„Í­„ͦ„ÍŸ„͘„Í‘„ÍŠ„̓„Í|„Íu„Ín„Íg„Í`„ÍY„ÍR„ÍK„ÍD„Í=„Í6„Í/„Í(„Í!„Í„Í„Í „Í„ÍþƒÍ÷ƒÍðƒÍéƒÍâƒÍÛƒÍÔƒÍ̓ÍƃÍ¿ƒÍ¸ƒÍ±ƒÍªƒÍ£ƒÍœƒÍ•ƒÍŽƒÍ‡ƒÍ€ƒÍyƒÍrƒÍkƒÍdƒÍ]ƒÍVƒÍOƒÍHƒÍAƒÍ:ƒÍ3ƒÍ,ƒÍ%ƒÍƒÍƒÍƒÍ ƒÍƒÍû‚Íô‚Íí‚Íæ‚Íß‚ÍØ‚ÍÑ‚ÍÊ‚ÍÂͼ‚͵‚Í®‚ͧ‚Í ‚Í™‚Í’‚Í‹‚Í„‚Í}‚Ív‚Ío‚Íh‚Ía‚ÍZ‚ÍS‚ÍL‚ÍE‚Í>‚Í7‚Í0‚Í)‚Í"‚Í‚Í‚Í ‚Í‚ÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍü€Íõ€Íî€Íç€Íà€ÍÙ€ÍÒ€ÍË€ÍĀͽ€Í¶€Í¯€Í¨€Í¡€Íš€Í“€ÍŒ€Í…€Í~€Íw€Íp€Íi€Íb€Í[€ÍT€ÍM€ÍF€Í?€Í8€Í1€Í*€Í#€Í€Í€Í€Í€Í€ÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍý~Íö~Íï~Íè~Íá~ÍÚ~ÍÓ~ÍÌ~ÍÅ~;~Í·~Ͱ~Í©~Í¢~Í›~Í”~Í~͆~Í~Íx~Íq~Íj~Íc~Í\~ÍU~ÍN~ÍG~Í@~Í9~Í2~Í+~Í$~Í~Í~Í~Í~Í~Íú}Íó}Íì}Íå}ÍÞ}Í×}ÍÐ}ÍÉ}ÍÂ}Í»}Í´}Í­}ͦ}ÍŸ}͘}Í‘}ÍŠ}̓}Í|}Íu}Ín}Íg}Í`}ÍY}ÍR}ÍK}ÍD}Í=}Í6}Í/}Í(}Í!}Í}Í}Í }Í}Íþ|Í÷|Íð|Íé|Íâ|ÍÛ|ÍÔ|ÍÍ|ÍÆ|Í¿|͸|ͱ|ͪ|Í£|Íœ|Í•|ÍŽ|͇|Í€|Íy|Ír|Ík|Íd|Í]|ÍV|ÍO|ÍH|ÍA|Í:|Í3|Í,|Í%|Í|Í|Í|Í |Í|Íû{Íô{Íí{Íæ{Íß{ÍØ{ÍÑ{ÍÊ{ÍÃ{ͼ{͵{Í®{ͧ{Í {Í™{Í’{Í‹{Í„{Í}{Ív{Ío{Íh{Ía{ÍZ{ÍS{ÍL{ÍE{Í>{Í7{Í0{Í){Í"{Í{Í{Í {Í{ÍÿzÍøzÍñzÍêzÍãzÍÜzÍÕzÍÎzÍÇzÍÀz͹zͲzÍ«zͤzÍzÍ–zÍz͈zÍzÍzzÍszÍlzÍezÍ^zÍWzÍPzÍIzÍBzÍ;zÍ4zÍ-zÍ&zÍzÍzÍzÍ zÍzÍüyÍõyÍîyÍçyÍàyÍÙyÍÒyÍËyÍÄyͽyͶyͯyͨyÍ¡yÍšyÍ“yÍŒyÍ…yÍ~yÍwyÍpyÍiyÍbyÍ[yÍTyÍMyÍFyÍ?yÍ8yÍ1yÍ*yÍ#yÍyÍyÍyÍyÍyÍùxÍòxÍëxÍäxÍÝxÍÖxÍÏxÍÈxÍÁxͺxͳxͬxÍ¥xÍžxÍ—xÍx͉xÍ‚xÍ{xÍtxÍmxÍfxÍ_xÍXxÍQxÍJxÍCxÍtÍ7tÍ0tÍ)tÍ"tÍtÍtÍ tÍtÍÿsÍøsÍñsÍêsÍãsÍÜsÍÕsÍÎsÍÇsÍÀs͹sͲsÍ«sͤsÍsÍ–sÍs͈sÍsÍzsÍssÍlsÍesÍ^sÍWsÍPsÍIsÍBsÍ;sÍ4sÍ-sÍ&sÍsÍsÍsÍ sÍsÍürÍõrÍîrÍçrÍàrÍÙrÍÒrÍËrÍÄrͽrͶrͯrͨrÍ¡rÍšrÍ“rÍŒrÍ…rÍ~rÍwrÍprÍirÍbrÍ[rÍTrÍMrÍFrÍ?rÍ8rÍ1rÍ*rÍ#rÍrÍrÍrÍrÍrÍùqÍòqÍëqÍäqÍÝqÍÖqÍÏqÍÈqÍÁqͺqͳqͬqÍ¥qÍžqÍ—qÍq͉qÍ‚qÍ{qÍtqÍmqÍfqÍ_qÍXqÍQqÍJqÍCqÍmÍ7mÍ0mÍ)mÍ"mÍmÍmÍ mÍmÍÿlÍølÍñlÍêlÍãlÍÜlÍÕlÍÎlÍÇlÍÀl͹lͲlÍ«lͤlÍlÍ–lÍl͈lÍlÍzlÍslÍllÍelÍ^lÍWlÍPlÍIlÍBlÍ;lÍ4lÍ-lÍ&lÍlÍlÍlÍ lÍlÍükÍõkÍîkÍçkÍàkÍÙkÍÒkÍËkÍÄkͽkͶkͯkͨkÍ¡kÍškÍ“kÍŒkÍ…kÍ~kÍwkÍpkÍikÍbkÍ[kÍTkÍMkÍFkÍ?kÍ8kÍ1kÍ*kÍ#kÍkÍkÍkÍkÍkÍùjÍòjÍëjÍäjÍÝjÍÖjÍÏjÍÈjÍÁjͺjͳjͬjÍ¥jÍžjÍ—jÍj͉jÍ‚jÍ{jÍtjÍmjÍfjÍ_jÍXjÍQjÍJjÍCjÍfÍ7fÍ0fÍ)fÍ"fÍfÍfÍ fÍfÍÿeÍøeÍñeÍêeÍãeÍÜeÍÕeÍÎeÍÇeÍÀe͹eͲeÍ«eͤeÍeÍ–eÍe͈eÍeÍzeÍseÍleÍeeÍ^eÍWeÍPeÍIeÍBeÍ;eÍ4eÍ-eÍ&eÍeÍeÍeÍ eÍeÍüdÍõdÍîdÍçdÍàdÍÙdÍÒdÍËdÍÄdͽdͶdͯdͨdÍ¡dÍšdÍ“dÍŒdÍ…dÍ~dÍwdÍpdÍidÍbdÍ[dÍTdÍMdÍFdÍ?dÍ8dÍ1dÍ*dÍ#dÍdÍdÍdÍdÍdÍùcÍòcÍëcÍäcÍÝcÍÖcÍÏcÍÈcÍÁcͺcͳcͬcÍ¥cÍžcÍ—cÍc͉cÍ‚cÍ{cÍtcÍmcÍfcÍ_cÍXcÍQcÍJcÍCcÍ_Í7_Í0_Í)_Í"_Í_Í_Í _Í_Íÿ^Íø^Íñ^Íê^Íã^ÍÜ^ÍÕ^ÍÎ^ÍÇ^ÍÀ^͹^Ͳ^Í«^ͤ^Í^Í–^Í^͈^Í^Íz^Ís^Íl^Íe^Í^^ÍW^ÍP^ÍI^ÍB^Í;^Í4^Í-^Í&^Í^Í^Í^Í ^Í^Íü]Íõ]Íî]Íç]Íà]ÍÙ]ÍÒ]ÍË]ÍÄ]ͽ]Ͷ]ͯ]ͨ]Í¡]Íš]Í“]ÍŒ]Í…]Í~]Íw]Íp]Íi]Íb]Í[]ÍT]ÍM]ÍF]Í?]Í8]Í1]Í*]Í#]Í]Í]Í]Í]Í]Íù\Íò\Íë\Íä\ÍÝ\ÍÖ\ÍÏ\ÍÈ\ÍÁ\ͺ\ͳ\ͬ\Í¥\Íž\Í—\Í\͉\Í‚\Í{\Ít\Ím\Íf\Í_\ÍX\ÍQ\ÍJ\ÍC\Í<\Í5\Í.\Í'\Í \Í\Í\Í \Í\Íý[Íö[Íï[Íè[Íá[ÍÚ[ÍÓ[ÍÌ[ÍÅ[;[Í·[Ͱ[Í©[Í¢[Í›[Í”[Í[͆[Í[Íx[Íq[Íj[Íc[Í\[ÍU[ÍN[ÍG[Í@[Í9[Í2[Í+[Í$[Í[Í[Í[Í[Í[ÍúZÍóZÍìZÍåZÍÞZÍ×ZÍÐZÍÉZÍÂZÍ»ZÍ´ZÍ­ZͦZÍŸZ͘ZÍ‘ZÍŠZ̓ZÍ|ZÍuZÍnZÍgZÍ`ZÍYZÍRZÍKZÍDZÍ=ZÍ6ZÍ/ZÍ(ZÍ!ZÍZÍZÍ ZÍZÍþYÍ÷YÍðYÍéYÍâYÍÛYÍÔYÍÍYÍÆYÍ¿Y͸YͱYͪYÍ£YÍœYÍ•YÍŽY͇YÍ€YÍyYÍrYÍkYÍdYÍ]YÍVYÍOYÍHYÍAYÍ:YÍ3YÍ,YÍ%YÍYÍYÍYÍ YÍYÍûXÍôXÍíXÍæXÍßXÍØXÍÑXÍÊXÍÃXͼX͵XÍ®XͧXÍ XÍ™XÍ’XÍ‹XÍ„XÍ}XÍvXÍoXÍhXÍaXÍZXÍSXÍLXÍEXÍ>XÍ7XÍ0XÍ)XÍ"XÍXÍXÍ XÍXÍÿWÍøWÍñWÍêWÍãWÍÜWÍÕWÍÎWÍÇWÍÀW͹WͲWÍ«WͤWÍWÍ–WÍW͈WÍWÍzWÍsWÍlWÍeWÍ^WÍWWÍPWÍIWÍBWÍ;WÍ4WÍ-WÍ&WÍWÍWÍWÍ WÍWÍüVÍõVÍîVÍçVÍàVÍÙVÍÒVÍËVÍÄVͽVͶVͯVͨVÍ¡VÍšVÍ“VÍŒVÍ…VÍ~VÍwVÍpVÍiVÍbVÍ[VÍTVÍMVÍFVÍ?VÍ8VÍ1VÍ*VÍ#VÍVÍVÍVÍVÍVÍùUÍòUÍëUÍäUÍÝUÍÖUÍÏUÍÈUÍÁUͺUͳUͬUÍ¥UÍžUÍ—UÍU͉UÍ‚UÍ{UÍtUÍmUÍfUÍ_UÍXUÍQUÍJUÍCUÍQÍ7QÍ0QÍ)QÍ"QÍQÍQÍ QÍQÍÿPÍøPÍñPÍêPÍãPÍÜPÍÕPÍÎPÍÇPÍÀP͹PͲPÍ«PͤPÍPÍ–PÍP͈PÍPÍzPÍsPÍlPÍePÍ^PÍWPÍPPÍIPÍBPÍ;PÍ4PÍ-PÍ&PÍPÍPÍPÍ PÍPÍüOÍõOÍîOÍçOÍàOÍÙOÍÒOÍËOÍÄOͽOͶOͯOͨOÍ¡OÍšOÍ“OÍŒOÍ…OÍ~OÍwOÍpOÍiOÍbOÍ[OÍTOÍMOÍFOÍ?OÍ8OÍ1OÍ*OÍ#OÍOÍOÍOÍOÍOÍùNÍòNÍëNÍäNÍÝNÍÖNÍÏNÍÈNÍÁNͺNͳNͬNÍ¥NÍžNÍ—NÍN͉NÍ‚NÍ{NÍtNÍmNÍfNÍ_NÍXNÍQNÍJNÍCNÍJÍ7JÍ0JÍ)JÍ"JÍJÍJÍ JÍJÍÿIÍøIÍñIÍêIÍãIÍÜIÍÕIÍÎIÍÇIÍÀI͹IͲIÍ«IͤIÍIÍ–IÍI͈IÍIÍzIÍsIÍlIÍeIÍ^IÍWIÍPIÍIIÍBIÍ;IÍ4IÍ-IÍ&IÍIÍIÍIÍ IÍIÍüHÍõHÍîHÍçHÍàHÍÙHÍÒHÍËHÍÄHͽHͶHͯHͨHÍ¡HÍšHÍ“HÍŒHÍ…HÍ~HÍwHÍpHÍiHÍbHÍ[HÍTHÍMHÍFHÍ?HÍ8HÍ1HÍ*HÍ#HÍHÍHÍHÍHÍHÍùGÍòGÍëGÍäGÍÝGÍÖGÍÏGÍÈGÍÁGͺGͳGͬGÍ¥GÍžGÍ—GÍG͉GÍ‚GÍ{GÍtGÍmGÍfGÍ_GÍXGÍQGÍJGÍCGÍCÍ7CÍ0CÍ)CÍ"CÍCÍCÍ CÍCÍÿBÍøBÍñBÍêBÍãBÍÜBÍÕBÍÎBÍÇBÍÀB͹BͲBÍ«BͤBÍBÍ–BÍB͈BÍBÍzBÍsBÍlBÍeBÍ^BÍWBÍPBÍIBÍBBÍ;BÍ4BÍ-BÍ&BÍBÍBÍBÍ BÍBÍüAÍõAÍîAÍçAÍàAÍÙAÍÒAÍËAÍÄAͽAͶAͯAͨAÍ¡AÍšAÍ“AÍŒAÍ…AÍ~AÍwAÍpAÍiAÍbAÍ[AÍTAÍMAÍFAÍ?AÍ8AÍ1AÍ*AÍ#AÍAÍAÍAÍAÍAÍù@Íò@Íë@Íä@ÍÝ@ÍÖ@ÍÏ@ÍÈ@ÍÁ@ͺ@ͳ@ͬ@Í¥@Íž@Í—@Í@͉@Í‚@Í{@Ít@Ím@Íf@Í_@ÍX@ÍQ@ÍJ@ÍC@Í<@Í5@Í.@Í'@Í @Í@Í@Í @Í@Íý?Íö?Íï?Íè?Íá?ÍÚ?ÍÓ?ÍÌ?ÍÅ?;?Í·?Ͱ?Í©?Í¢?Í›?Í”?Í?͆?Í?Íx?Íq?Íj?Íc?Í\?ÍU?ÍN?ÍG?Í@?Í9?Í2?Í+?Í$?Í?Í?Í?Í?Í?Íú>Íó>Íì>Íå>ÍÞ>Í×>ÍÐ>ÍÉ>ÍÂ>Í»>Í´>Í­>ͦ>ÍŸ>͘>Í‘>ÍŠ>̓>Í|>Íu>Ín>Íg>Í`>ÍY>ÍR>ÍK>ÍD>Í=>Í6>Í/>Í(>Í!>Í>Í>Í >Í>Íþ=Í÷=Íð=Íé=Íâ=ÍÛ=ÍÔ=ÍÍ=ÍÆ=Í¿=͸=ͱ=ͪ=Í£=Íœ=Í•=ÍŽ=͇=Í€=Íy=Ír=Ík=Íd=Í]=ÍV=ÍO=ÍH=ÍA=Í:=Í3=Í,=Í%=Í=Í=Í=Í =Í=Íû<Íô<Íí<Íæ<Íß<ÍØ<ÍÑ<ÍÊ<ÍÃ<ͼ<͵<Í®<ͧ<Í <Í™<Í’<Í‹<Í„<Í}<Ív<Ío<Íh<Ía<ÍZ<ÍS<ÍL<ÍE<Í><Í7<Í0<Í)<Í"<Í<Í<Í <Í<Íÿ;Íø;Íñ;Íê;Íã;ÍÜ;ÍÕ;ÍÎ;ÍÇ;ÍÀ;͹;Ͳ;Í«;ͤ;Í;Í–;Í;͈;Í;Íz;Ís;Íl;Íe;Í^;ÍW;ÍP;ÍI;ÍB;Í;;Í4;Í-;Í&;Í;Í;Í;Í ;Í;Íü:Íõ:Íî:Íç:Íà:ÍÙ:ÍÒ:ÍË:ÍÄ:ͽ:Ͷ:ͯ:ͨ:Í¡:Íš:Í“:ÍŒ:Í…:Í~:Íw:Íp:Íi:Íb:Í[:ÍT:ÍM:ÍF:Í?:Í8:Í1:Í*:Í#:Í:Í:Í:Í:Í:Íù9Íò9Íë9Íä9ÍÝ9ÍÖ9ÍÏ9ÍÈ9ÍÁ9ͺ9ͳ9ͬ9Í¥9Íž9Í—9Í9͉9Í‚9Í{9Ít9Ím9Íf9Í_9ÍX9ÍQ9ÍJ9ÍC9Í<9Í59Í.9Í'9Í 9Í9Í9Í 9Í9Íý8Íö8Íï8Íè8Íá8ÍÚ8ÍÓ8ÍÌ8ÍÅ8;8Í·8Ͱ8Í©8Í¢8Í›8Í”8Í8͆8Í8Íx8Íq8Íj8Íc8Í\8ÍU8ÍN8ÍG8Í@8Í98Í28Í+8Í$8Í8Í8Í8Í8Í8Íú7Íó7Íì7Íå7ÍÞ7Í×7ÍÐ7ÍÉ7ÍÂ7Í»7Í´7Í­7ͦ7ÍŸ7͘7Í‘7ÍŠ7̓7Í|7Íu7Ín7Íg7Í`7ÍY7ÍR7ÍK7ÍD7Í=7Í67Í/7Í(7Í!7Í7Í7Í 7Í7Íþ6Í÷6Íð6Íé6Íâ6ÍÛ6ÍÔ6ÍÍ6ÍÆ6Í¿6͸6ͱ6ͪ6Í£6Íœ6Í•6ÍŽ6͇6Í€6Íy6Ír6Ík6Íd6Í]6ÍV6ÍO6ÍH6ÍA6Í:6Í36Í,6Í%6Í6Í6Í6Í 6Í6Íû5Íô5Íí5Íæ5Íß5ÍØ5ÍÑ5ÍÊ5ÍÃ5ͼ5͵5Í®5ͧ5Í 5Í™5Í’5Í‹5Í„5Í}5Ív5Ío5Íh5Ía5ÍZ5ÍS5ÍL5ÍE5Í>5Í75Í05Í)5Í"5Í5Í5Í 5Í5Íÿ4Íø4Íñ4Íê4Íã4ÍÜ4ÍÕ4ÍÎ4ÍÇ4ÍÀ4͹4Ͳ4Í«4ͤ4Í4Í–4Í4͈4Í4Íz4Ís4Íl4Íe4Í^4ÍW4ÍP4ÍI4ÍB4Í;4Í44Í-4Í&4Í4Í4Í4Í 4Í4Íü3Íõ3Íî3Íç3Íà3ÍÙ3ÍÒ3ÍË3ÍÄ3ͽ3Ͷ3ͯ3ͨ3Í¡3Íš3Í“3ÍŒ3Í…3Í~3Íw3Íp3Íi3Íb3Í[3ÍT3ÍM3ÍF3Í?3Í83Í13Í*3Í#3Í3Í3Í3Í3Í3Íù2Íò2Íë2Íä2ÍÝ2ÍÖ2ÍÏ2ÍÈ2ÍÁ2ͺ2ͳ2ͬ2Í¥2Íž2Í—2Í2͉2Í‚2Í{2Ít2Ím2Íf2Í_2ÍX2ÍQ2ÍJ2ÍC2Í<2Í52Í.2Í'2Í 2Í2Í2Í 2Í2Íý1Íö1Íï1Íè1Íá1ÍÚ1ÍÓ1ÍÌ1ÍÅ1;1Í·1Ͱ1Í©1Í¢1Í›1Í”1Í1͆1Í1Íx1Íq1Íj1Íc1Í\1ÍU1ÍN1ÍG1Í@1Í91Í21Í+1Í$1Í1Í1Í1Í1Í1Íú0Íó0Íì0Íå0ÍÞ0Í×0ÍÐ0ÍÉ0ÍÂ0Í»0Í´0Í­0ͦ0ÍŸ0͘0Í‘0ÍŠ0̓0Í|0Íu0Ín0Íg0Í`0ÍY0ÍR0ÍK0ÍD0Í=0Í60Í/0Í(0Í!0Í0Í0Í 0Í0Íþ/Í÷/Íð/Íé/Íâ/ÍÛ/ÍÔ/ÍÍ/ÍÆ/Í¿/͸/ͱ/ͪ/Í£/Íœ/Í•/ÍŽ/͇/Í€/Íy/Ír/Ík/Íd/Í]/ÍV/ÍO/ÍH/ÍA/Í:/Í3/Í,/Í%/Í/Í/Í/Í /Í/Íû.Íô.Íí.Íæ.Íß.ÍØ.ÍÑ.ÍÊ.ÍÃ.ͼ.͵.Í®.ͧ.Í .Í™.Í’.Í‹.Í„.Í}.Ív.Ío.Íh.Ía.ÍZ.ÍS.ÍL.ÍE.Í>.Í7.Í0.Í).Í".Í.Í.Í .Í.Íÿ-Íø-Íñ-Íê-Íã-ÍÜ-ÍÕ-ÍÎ-ÍÇ-ÍÀ-͹-Ͳ-Í«-ͤ-Í-Í–-Í-͈-Í-Íz-Ís-Íl-Íe-Í^-ÍW-ÍP-ÍI-ÍB-Í;-Í4-Í--Í&-Í-Í-Í-Í -Í-Íü,Íõ,Íî,Íç,Íà,ÍÙ,ÍÒ,ÍË,ÍÄ,ͽ,Ͷ,ͯ,ͨ,Í¡,Íš,Í“,ÍŒ,Í…,Í~,Íw,Íp,Íi,Íb,Í[,ÍT,ÍM,ÍF,Í?,Í8,Í1,Í*,Í#,Í,Í,Í,Í,Í,Íù+Íò+Íë+Íä+ÍÝ+ÍÖ+ÍÏ+ÍÈ+ÍÁ+ͺ+ͳ+ͬ+Í¥+Íž+Í—+Í+͉+Í‚+Í{+Ít+Ím+Íf+Í_+ÍX+ÍQ+ÍJ+ÍC+Í<+Í5+Í.+Í'+Í +Í+Í+Í +Í+Íý*Íö*Íï*Íè*Íá*ÍÚ*ÍÓ*ÍÌ*ÍÅ*;*Í·*Ͱ*Í©*Í¢*Í›*Í”*Í*͆*Í*Íx*Íq*Íj*Íc*Í\*ÍU*ÍN*ÍG*Í@*Í9*Í2*Í+*Í$*Í*Í*Í*Í*Í*Íú)Íó)Íì)Íå)ÍÞ)Í×)ÍÐ)ÍÉ)ÍÂ)Í»)Í´)Í­)ͦ)ÍŸ)͘)Í‘)ÍŠ)̓)Í|)Íu)Ín)Íg)Í`)ÍY)ÍR)ÍK)ÍD)Í=)Í6)Í/)Í()Í!)Í)Í)Í )Í)Íþ(Í÷(Íð(Íé(Íâ(ÍÛ(ÍÔ(ÍÍ(ÍÆ(Í¿(͸(ͱ(ͪ(Í£(Íœ(Í•(ÍŽ(͇(Í€(Íy(Ír(Ík(Íd(Í](ÍV(ÍO(ÍH(ÍA(Í:(Í3(Í,(Í%(Í(Í(Í(Í (Í(Íû'Íô'Íí'Íæ'Íß'ÍØ'ÍÑ'ÍÊ'ÍÃ'ͼ'͵'Í®'ͧ'Í 'Í™'Í’'Í‹'Í„'Í}'Ív'Ío'Íh'Ía'ÍZ'ÍS'ÍL'ÍE'Í>'Í7'Í0'Í)'Í"'Í'Í'Í 'Í'Íÿ&Íø&Íñ&Íê&Íã&ÍÜ&ÍÕ&ÍÎ&ÍÇ&ÍÀ&͹&Ͳ&Í«&ͤ&Í&Í–&Í&͈&Í&Íz&Ís&Íl&Íe&Í^&ÍW&ÍP&ÍI&ÍB&Í;&Í4&Í-&Í&&Í&Í&Í&Í &Í&Íü%Íõ%Íî%Íç%Íà%ÍÙ%ÍÒ%ÍË%ÍÄ%ͽ%Ͷ%ͯ%ͨ%Í¡%Íš%Í“%ÍŒ%Í…%Í~%Íw%Íp%Íi%Íb%Í[%ÍT%ÍM%ÍF%Í?%Í8%Í1%Í*%Í#%Í%Í%Í%Í%Í%Íù$Íò$Íë$Íä$ÍÝ$ÍÖ$ÍÏ$ÍÈ$ÍÁ$ͺ$ͳ$ͬ$Í¥$Íž$Í—$Í$͉$Í‚$Í{$Ít$Ím$Íf$Í_$ÍX$ÍQ$ÍJ$ÍC$Í<$Í5$Í.$Í'$Í $Í$Í$Í $Í$Íý#Íö#Íï#Íè#Íá#ÍÚ#ÍÓ#ÍÌ#ÍÅ#;#Í·#Ͱ#Í©#Í¢#Í›#Í”#Í#͆#Í#Íx#Íq#Íj#Íc#Í\#ÍU#ÍN#ÍG#Í@#Í9#Í2#Í+#Í$#Í#Í#Í#Í#Í#Íú"Íó"Íì"Íå"ÍÞ"Í×"ÍÐ"ÍÉ"ÍÂ"Í»"Í´"Í­"ͦ"ÍŸ"͘"Í‘"ÍŠ"̓"Í|"Íu"Ín"Íg"Í`"ÍY"ÍR"ÍK"ÍD"Í="Í6"Í/"Í("Í!"Í"Í"Í "Í"Íþ!Í÷!Íð!Íé!Íâ!ÍÛ!ÍÔ!ÍÍ!ÍÆ!Í¿!͸!ͱ!ͪ!Í£!Íœ!Í•!ÍŽ!͇!Í€!Íy!Ír!Ík!Íd!Í]!ÍV!ÍO!ÍH!ÍA!Í:!Í3!Í,!Í%!Í!Í!Í!Í !Í!Íû Íô Íí Íæ Íß ÍØ ÍÑ ÍÊ Íà ͼ ͵ Í® ͧ Í  Í™ Í’ Í‹ Í„ Í} Ív Ío Íh Ía ÍZ ÍS ÍL ÍE Í> Í7 Í0 Í) Í" Í Í Í Í ÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍú Íó Íì Íå ÍÞ Í× ÍÐ ÍÉ Í Í» Í´ Í­ ͦ ÍŸ ͘ Í‘ ÍŠ ̓ Í| Íu Ín Íg Í` ÍY ÍR ÍK ÍD Í= Í6 Í/ Í( Í! Í Í Í Í Íþ Í÷ Íð Íé Íâ ÍÛ ÍÔ ÍÍ ÍÆ Í¿ ͸ ͱ ͪ Í£ Íœ Í• ÍŽ ͇ Í€ Íy Ír Ík Íd Í] ÍV ÍO ÍH ÍA Í: Í3 Í, Í% Í Í Í Í Í Íû Íô Íí Íæ Íß ÍØ ÍÑ ÍÊ Íà ͼ ͵ Í® ͧ Í  Í™ Í’ Í‹ Í„ Í} Ív Ío Íh Ía ÍZ ÍS ÍL ÍE Í> Í7 Í0 Í) Í" Í Í Í Í Íÿ Íø Íñ Íê Íã ÍÜ ÍÕ ÍÎ ÍÇ ÍÀ ͹ Ͳ Í« ͤ Í Í– Í Íˆ Í Íz Ís Íl Íe Í^ ÍW ÍP ÍI ÍB Í; Í4 Í- Í& Í Í Í Í Í Íü Íõ Íî Íç Íà ÍÙ ÍÒ ÍË ÍÄ Í½ Ͷ ͯ ͨ Í¡ Íš Í“ ÍŒ Í… Í~ Íw Íp Íi Íb Í[ ÍT ÍM ÍF Í? Í8 Í1 Í* Í# Í Í Í Í Í ÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÿÌóÿÌìÿÌåÿÌÞÿÌ×ÿÌÐÿÌÉÿÌÂÿÌ»ÿÌ´ÿÌ­ÿ̦ÿÌŸÿ̘ÿÌ‘ÿÌŠÿ̃ÿÌ|ÿÌuÿÌnÿÌgÿÌ`ÿÌYÿÌRÿÌKÿÌDÿÌ=ÿÌ6ÿÌ/ÿÌ(ÿÌ!ÿÌÿÌÿÌ ÿÌÿÌþþÌ÷þÌðþÌéþÌâþÌÛþÌÔþÌÍþÌÆþÌ¿þ̸þ̱þ̪þÌ£þÌœþÌ•þÌŽþ̇þÌ€þÌyþÌrþÌkþÌdþÌ]þÌVþÌOþÌHþÌAþÌ:þÌ3þÌ,þÌ%þÌþÌþÌþÌ þÌþÌûýÌôýÌíýÌæýÌßýÌØýÌÑýÌÊýÌÃý̼ý̵ýÌ®ý̧ýÌ ýÌ™ýÌ’ýÌ‹ýÌ„ýÌ}ýÌvýÌoýÌhýÌaýÌZýÌSýÌLýÌEýÌ>ýÌ7ýÌ0ýÌ)ýÌ"ýÌýÌýÌ ýÌýÌÿüÌøüÌñüÌêüÌãüÌÜüÌÕüÌÎüÌÇüÌÀü̹ü̲üÌ«ṳ̈üÌüÌ–üÌü̈üÌüÌzüÌsüÌlüÌeüÌ^üÌWüÌPüÌIüÌBüÌ;üÌ4üÌ-üÌ&üÌüÌüÌüÌ üÌüÌüûÌõûÌîûÌçûÌàûÌÙûÌÒûÌËûÌÄû̽û̶û̯ų̂ûÌ¡ûÌšûÌ“ûÌŒûÌ…ûÌ~ûÌwûÌpûÌiûÌbûÌ[ûÌTûÌMûÌFûÌ?ûÌ8ûÌ1ûÌ*ûÌ#ûÌûÌûÌûÌûÌûÌùúÌòúÌëúÌäúÌÝúÌÖúÌÏúÌÈúÌÁú̺ú̳ú̬úÌ¥úÌžúÌ—úÌú̉úÌ‚úÌ{úÌtúÌmúÌfúÌ_úÌXúÌQúÌJúÌCúÌ<úÌ5úÌ.úÌ'úÌ úÌúÌúÌ úÌúÌýùÌöùÌïùÌèùÌáùÌÚùÌÓùÌÌùÌÅù̾ùÌ·ṵ̀ùÌ©ùÌ¢ùÌ›ùÌ”ùÌù̆ùÌùÌxùÌqùÌjùÌcùÌ\ùÌUùÌNùÌGùÌ@ùÌ9ùÌ2ùÌ+ùÌ$ùÌùÌùÌùÌùÌùÌúøÌóøÌìøÌåøÌÞøÌ×øÌÐøÌÉøÌÂøÌ»øÌ´øÌ­øÌ¦øÌŸøÌ˜øÌ‘øÌŠøÌƒøÌ|øÌuøÌnøÌgøÌ`øÌYøÌRøÌKøÌDøÌ=øÌ6øÌ/øÌ(øÌ!øÌøÌøÌ øÌøÌþ÷Ì÷÷Ìð÷Ìé÷Ìâ÷ÌÛ÷ÌÔ÷ÌÍ÷ÌÆ÷Ì¿÷̸÷̱÷̪÷Ì£÷Ìœ÷Ì•÷ÌŽ÷̇÷Ì€÷Ìy÷Ìr÷Ìk÷Ìd÷Ì]÷ÌV÷ÌO÷ÌH÷ÌA÷Ì:÷Ì3÷Ì,÷Ì%÷Ì÷Ì÷Ì÷Ì ÷Ì÷ÌûöÌôöÌíöÌæöÌßöÌØöÌÑöÌÊöÌÃö̼ö̵öÌ®ö̧öÌ öÌ™öÌ’öÌ‹öÌ„öÌ}öÌvöÌoöÌhöÌaöÌZöÌSöÌLöÌEöÌ>öÌ7öÌ0öÌ)öÌ"öÌöÌöÌ öÌöÌÿõÌøõÌñõÌêõÌãõÌÜõÌÕõÌÎõÌÇõÌÀõ̹õ̲õÌ«õ̤õÌõÌ–õÌṏõÌõÌzõÌsõÌlõÌeõÌ^õÌWõÌPõÌIõÌBõÌ;õÌ4õÌ-õÌ&õÌõÌõÌõÌ õÌõÌüôÌõôÌîôÌçôÌàôÌÙôÌÒôÌËôÌÄô̽ô̶ô̯ǫ̂ôÌ¡ôÌšôÌ“ôÌŒôÌ…ôÌ~ôÌwôÌpôÌiôÌbôÌ[ôÌTôÌMôÌFôÌ?ôÌ8ôÌ1ôÌ*ôÌ#ôÌôÌôÌôÌôÌôÌùóÌòóÌëóÌäóÌÝóÌÖóÌÏóÌÈóÌÁó̺ó̳ó̬óÌ¥óÌžóÌ—óÌó̉óÌ‚óÌ{óÌtóÌmóÌfóÌ_óÌXóÌQóÌJóÌCóÌ<óÌ5óÌ.óÌ'óÌ óÌóÌóÌ óÌóÌýòÌöòÌïòÌèòÌáòÌÚòÌÓòÌÌòÌÅò̾òÌ·ò̰òÌ©òÌ¢òÌ›òÌ”òÌò̆òÌòÌxòÌqòÌjòÌcòÌ\òÌUòÌNòÌGòÌ@òÌ9òÌ2òÌ+òÌ$òÌòÌòÌòÌòÌòÌúñÌóñÌìñÌåñÌÞñÌ×ñÌÐñÌÉñÌÂñÌ»ñÌ´ñÌ­ñ̦ñÌŸñ̘ñÌ‘ñÌŠñ̃ñÌ|ñÌuñÌnñÌgñÌ`ñÌYñÌRñÌKñÌDñÌ=ñÌ6ñÌ/ñÌ(ñÌ!ñÌñÌñÌ ñÌñÌþðÌ÷ðÌððÌéðÌâðÌÛðÌÔðÌÍðÌÆðÌ¿ð̸ð̱ð̪ðÌ£ðÌœðÌ•ðÌŽð̇ðÌ€ðÌyðÌrðÌkðÌdðÌ]ðÌVðÌOðÌHðÌAðÌ:ðÌ3ðÌ,ðÌ%ðÌðÌðÌðÌ ðÌðÌûïÌôïÌíïÌæïÌßïÌØïÌÑïÌÊïÌÃï̼ï̵ïÌ®ï̧ïÌ ïÌ™ïÌ’ïÌ‹ïÌ„ïÌ}ïÌvïÌoïÌhïÌaïÌZïÌSïÌLïÌEïÌ>ïÌ7ïÌ0ïÌ)ïÌ"ïÌïÌïÌ ïÌïÌÿîÌøîÌñîÌêîÌãîÌÜîÌÕîÌÎîÌÇîÌÀî̹î̲îÌ«î̤îÌîÌ–îÌî̈îÌîÌzîÌsîÌlîÌeîÌ^îÌWîÌPîÌIîÌBîÌ;îÌ4îÌ-îÌ&îÌîÌîÌîÌ îÌîÌüíÌõíÌîíÌçíÌàíÌÙíÌÒíÌËíÌÄí̽í̶í̯į́íÌ¡íÌšíÌ“íÌŒíÌ…íÌ~íÌwíÌpíÌiíÌbíÌ[íÌTíÌMíÌFíÌ?íÌ8íÌ1íÌ*íÌ#íÌíÌíÌíÌíÌíÌùìÌòìÌëìÌäìÌÝìÌÖìÌÏìÌÈìÌÁì̺ì̳ì̬ìÌ¥ìÌžìÌ—ìÌì̉ìÌ‚ìÌ{ìÌtìÌmìÌfìÌ_ìÌXìÌQìÌJìÌCìÌ<ìÌ5ìÌ.ìÌ'ìÌ ìÌìÌìÌ ìÌìÌýëÌöëÌïëÌèëÌáëÌÚëÌÓëÌÌëÌÅë̾ëÌ·ḛ̈ëÌ©ëÌ¢ëÌ›ëÌ”ëÌë̆ëÌëÌxëÌqëÌjëÌcëÌ\ëÌUëÌNëÌGëÌ@ëÌ9ëÌ2ëÌ+ëÌ$ëÌëÌëÌëÌëÌëÌúêÌóêÌìêÌåêÌÞêÌ×êÌÐêÌÉêÌÂêÌ»êÌ´êÌ­ê̦êÌŸê̘êÌ‘êÌŠễêÌ|êÌuêÌnêÌgêÌ`êÌYêÌRêÌKêÌDêÌ=êÌ6êÌ/êÌ(êÌ!êÌêÌêÌ êÌêÌþéÌ÷éÌðéÌééÌâéÌÛéÌÔéÌÍéÌÆéÌ¿é̸é̱é̪éÌ£éÌœéÌ•éÌŽé̇éÌ€éÌyéÌréÌkéÌdéÌ]éÌVéÌOéÌHéÌAéÌ:éÌ3éÌ,éÌ%éÌéÌéÌéÌ éÌéÌûèÌôèÌíèÌæèÌßèÌØèÌÑèÌÊèÌÃè̼è̵èÌ®ȩ̀èÌ èÌ™èÌ’èÌ‹èÌ„èÌ}èÌvèÌoèÌhèÌaèÌZèÌSèÌLèÌEèÌ>èÌ7èÌ0èÌ)èÌ"èÌèÌèÌ èÌèÌÿçÌøçÌñçÌêçÌãçÌÜçÌÕçÌÎçÌÇçÌÀç̹ç̲çÌ«ç̤çÌçÌ–çÌç̈çÌçÌzçÌsçÌlçÌeçÌ^çÌWçÌPçÌIçÌBçÌ;çÌ4çÌ-çÌ&çÌçÌçÌçÌ çÌçÌüæÌõæÌîæÌçæÌàæÌÙæÌÒæÌËæÌÄæÌ½æÌ¶æÌ¯æÌ¨æÌ¡æÌšæÌ“æÌŒæÌ…æÌ~æÌwæÌpæÌiæÌbæÌ[æÌTæÌMæÌFæÌ?æÌ8æÌ1æÌ*æÌ#æÌæÌæÌæÌæÌæÌùåÌòåÌëåÌäåÌÝåÌÖåÌÏåÌÈåÌÁå̺å̳å̬åÌ¥åÌžåÌ—åÌå̉åÌ‚åÌ{åÌtåÌmåÌfåÌ_åÌXåÌQåÌJåÌCåÌ<åÌ5åÌ.åÌ'åÌ åÌåÌåÌ åÌåÌýäÌöäÌïäÌèäÌáäÌÚäÌÓäÌÌäÌÅä̾äÌ·ä̰äÌ©äÌ¢äÌ›äÌ”äÌä̆äÌäÌxäÌqäÌjäÌcäÌ\äÌUäÌNäÌGäÌ@äÌ9äÌ2äÌ+äÌ$äÌäÌäÌäÌäÌäÌúãÌóãÌìãÌåãÌÞãÌ×ãÌÐãÌÉãÌÂãÌ»ãÌ´ãÌ­ã̦ãÌŸã̘ãÌ‘ãÌŠã̃ãÌ|ãÌuãÌnãÌgãÌ`ãÌYãÌRãÌKãÌDãÌ=ãÌ6ãÌ/ãÌ(ãÌ!ãÌãÌãÌ ãÌãÌþâÌ÷âÌðâÌéâÌââÌÛâÌÔâÌÍâÌÆâÌ¿â̸â̱â̪âÌ£âÌœâÌ•âÌŽâ̇âÌ€âÌyâÌrâÌkâÌdâÌ]âÌVâÌOâÌHâÌAâÌ:âÌ3âÌ,âÌ%âÌâÌâÌâÌ âÌâÌûáÌôáÌíáÌæáÌßáÌØáÌÑáÌÊáÌÃá̼á̵áÌ®á̧áÌ áÌ™áÌ’áÌ‹áÌ„áÌ}áÌváÌoáÌháÌaáÌZáÌSáÌLáÌEáÌ>áÌ7áÌ0áÌ)áÌ"áÌáÌáÌ áÌáÌÿàÌøàÌñàÌêàÌãàÌÜàÌÕàÌÎàÌÇàÌÀà̹à̲àÌ«à̤àÌàÌ–àÌà̈àÌàÌzàÌsàÌlàÌeàÌ^àÌWàÌPàÌIàÌBàÌ;àÌ4àÌ-àÌ&àÌàÌàÌàÌ àÌàÌüßÌõßÌîßÌçßÌàßÌÙßÌÒßÌËßÌÄß̽ß̶ß̯ß̨ßÌ¡ßÌšßÌ“ßÌŒßÌ…ßÌ~ßÌwßÌpßÌißÌbßÌ[ßÌTßÌMßÌFßÌ?ßÌ8ßÌ1ßÌ*ßÌ#ßÌßÌßÌßÌßÌßÌùÞÌòÞÌëÞÌäÞÌÝÞÌÖÞÌÏÞÌÈÞÌÁÞ̺Þ̳Þ̬ÞÌ¥ÞÌžÞÌ—ÞÌÞ̉ÞÌ‚ÞÌ{ÞÌtÞÌmÞÌfÞÌ_ÞÌXÞÌQÞÌJÞÌCÞÌ<ÞÌ5ÞÌ.ÞÌ'ÞÌ ÞÌÞÌÞÌ ÞÌÞÌýÝÌöÝÌïÝÌèÝÌáÝÌÚÝÌÓÝÌÌÝÌÅÝ̾ÝÌ·Ý̰ÝÌ©ÝÌ¢ÝÌ›ÝÌ”ÝÌÝ̆ÝÌÝÌxÝÌqÝÌjÝÌcÝÌ\ÝÌUÝÌNÝÌGÝÌ@ÝÌ9ÝÌ2ÝÌ+ÝÌ$ÝÌÝÌÝÌÝÌÝÌÝÌúÜÌóÜÌìÜÌåÜÌÞÜÌ×ÜÌÐÜÌÉÜÌÂÜÌ»ÜÌ´ÜÌ­Ü̦ÜÌŸÜ̘ÜÌ‘ÜÌŠÜ̃ÜÌ|ÜÌuÜÌnÜÌgÜÌ`ÜÌYÜÌRÜÌKÜÌDÜÌ=ÜÌ6ÜÌ/ÜÌ(ÜÌ!ÜÌÜÌÜÌ ÜÌÜÌþÛÌ÷ÛÌðÛÌéÛÌâÛÌÛÛÌÔÛÌÍÛÌÆÛÌ¿Û̸Û̱Û̪ÛÌ£ÛÌœÛÌ•ÛÌŽÛ̇ÛÌ€ÛÌyÛÌrÛÌkÛÌdÛÌ]ÛÌVÛÌOÛÌHÛÌAÛÌ:ÛÌ3ÛÌ,ÛÌ%ÛÌÛÌÛÌÛÌ ÛÌÛÌûÚÌôÚÌíÚÌæÚÌßÚÌØÚÌÑÚÌÊÚÌÃÚ̼Ú̵ÚÌ®Ú̧ÚÌ ÚÌ™ÚÌ’ÚÌ‹ÚÌ„ÚÌ}ÚÌvÚÌoÚÌhÚÌaÚÌZÚÌSÚÌLÚÌEÚÌ>ÚÌ7ÚÌ0ÚÌ)ÚÌ"ÚÌÚÌÚÌ ÚÌÚÌÿÙÌøÙÌñÙÌêÙÌãÙÌÜÙÌÕÙÌÎÙÌÇÙÌÀÙ̹Ù̲ÙÌ«Ṳ̀ÙÌÙÌ–ÙÌÙ̈ÙÌÙÌzÙÌsÙÌlÙÌeÙÌ^ÙÌWÙÌPÙÌIÙÌBÙÌ;ÙÌ4ÙÌ-ÙÌ&ÙÌÙÌÙÌÙÌ ÙÌÙÌüØÌõØÌîØÌçØÌàØÌÙØÌÒØÌËØÌÄØÌ½ØÌ¶ØÌ¯ØÌ¨ØÌ¡ØÌšØÌ“ØÌŒØÌ…ØÌ~ØÌwØÌpØÌiØÌbØÌ[ØÌTØÌMØÌFØÌ?ØÌ8ØÌ1ØÌ*ØÌ#ØÌØÌØÌØÌØÌØÌù×Ìò×Ìë×Ìä×ÌÝ×ÌÖ×ÌÏ×ÌÈ×ÌÁ×̺×̳×̬×Ì¥×Ìž×Ì—×Ì×̉×Ì‚×Ì{×Ìt×Ìm×Ìf×Ì_×ÌX×ÌQ×ÌJ×ÌC×Ì<×Ì5×Ì.×Ì'×Ì ×Ì×Ì×Ì ×Ì×ÌýÖÌöÖÌïÖÌèÖÌáÖÌÚÖÌÓÖÌÌÖÌÅÖ̾ÖÌ·Ö̰ÖÌ©ÖÌ¢ÖÌ›ÖÌ”ÖÌÖ̆ÖÌÖÌxÖÌqÖÌjÖÌcÖÌ\ÖÌUÖÌNÖÌGÖÌ@ÖÌ9ÖÌ2ÖÌ+ÖÌ$ÖÌÖÌÖÌÖÌÖÌÖÌúÕÌóÕÌìÕÌåÕÌÞÕÌ×ÕÌÐÕÌÉÕÌÂÕÌ»ÕÌ´ÕÌ­Õ̦ÕÌŸÕ̘ÕÌ‘ÕÌŠÕ̃ÕÌ|ÕÌuÕÌnÕÌgÕÌ`ÕÌYÕÌRÕÌKÕÌDÕÌ=ÕÌ6ÕÌ/ÕÌ(ÕÌ!ÕÌÕÌÕÌ ÕÌÕÌþÔÌ÷ÔÌðÔÌéÔÌâÔÌÛÔÌÔÔÌÍÔÌÆÔÌ¿Ô̸Ô̱Ô̪ÔÌ£ÔÌœÔÌ•ÔÌŽÔ̇ÔÌ€ÔÌyÔÌrÔÌkÔÌdÔÌ]ÔÌVÔÌOÔÌHÔÌAÔÌ:ÔÌ3ÔÌ,ÔÌ%ÔÌÔÌÔÌÔÌ ÔÌÔÌûÓÌôÓÌíÓÌæÓÌßÓÌØÓÌÑÓÌÊÓÌÃÓ̼Ó̵ÓÌ®Ó̧ÓÌ ÓÌ™ÓÌ’ÓÌ‹ÓÌ„ÓÌ}ÓÌvÓÌoÓÌhÓÌaÓÌZÓÌSÓÌLÓÌEÓÌ>ÓÌ7ÓÌ0ÓÌ)ÓÌ"ÓÌÓÌÓÌ ÓÌÓÌÿÒÌøÒÌñÒÌêÒÌãÒÌÜÒÌÕÒÌÎÒÌÇÒÌÀÒ̹Ò̲ÒÌ«Ò̤ÒÌÒÌ–ÒÌÒ̈ÒÌÒÌzÒÌsÒÌlÒÌeÒÌ^ÒÌWÒÌPÒÌIÒÌBÒÌ;ÒÌ4ÒÌ-ÒÌ&ÒÌÒÌÒÌÒÌ ÒÌÒÌüÑÌõÑÌîÑÌçÑÌàÑÌÙÑÌÒÑÌËÑÌÄÑ̽Ñ̶Ñ̯Ñ̨ÑÌ¡ÑÌšÑÌ“ÑÌŒÑÌ…ÑÌ~ÑÌwÑÌpÑÌiÑÌbÑÌ[ÑÌTÑÌMÑÌFÑÌ?ÑÌ8ÑÌ1ÑÌ*ÑÌ#ÑÌÑÌÑÌÑÌÑÌÑÌùÐÌòÐÌëÐÌäÐÌÝÐÌÖÐÌÏÐÌÈÐÌÁÐ̺Ð̳Ð̬ÐÌ¥ÐÌžÐÌ—ÐÌÐ̉ÐÌ‚ÐÌ{ÐÌtÐÌmÐÌfÐÌ_ÐÌXÐÌQÐÌJÐÌCÐÌ<ÐÌ5ÐÌ.ÐÌ'ÐÌ ÐÌÐÌÐÌ ÐÌÐÌýÏÌöÏÌïÏÌèÏÌáÏÌÚÏÌÓÏÌÌÏÌÅÏ̾ÏÌ·Ḭ̈ÏÌ©ÏÌ¢ÏÌ›ÏÌ”ÏÌÏ̆ÏÌÏÌxÏÌqÏÌjÏÌcÏÌ\ÏÌUÏÌNÏÌGÏÌ@ÏÌ9ÏÌ2ÏÌ+ÏÌ$ÏÌÏÌÏÌÏÌÏÌÏÌúÎÌóÎÌìÎÌåÎÌÞÎÌ×ÎÌÐÎÌÉÎÌÂÎÌ»ÎÌ´ÎÌ­Î̦ÎÌŸÎ̘ÎÌ‘ÎÌŠÎ̃ÎÌ|ÎÌuÎÌnÎÌgÎÌ`ÎÌYÎÌRÎÌKÎÌDÎÌ=ÎÌ6ÎÌ/ÎÌ(ÎÌ!ÎÌÎÌÎÌ ÎÌÎÌþÍÌ÷ÍÌðÍÌéÍÌâÍÌÛÍÌÔÍÌÍÍÌÆÍÌ¿Í̸Í̱Í̪ÍÌ£ÍÌœÍÌ•ÍÌŽÍ̇ÍÌ€ÍÌyÍÌrÍÌkÍÌdÍÌ]ÍÌVÍÌOÍÌHÍÌAÍÌ:ÍÌ3ÍÌ,ÍÌ%ÍÌÍÌÍÌÍÌ ÍÌÍÌûÌÌôÌÌíÌÌæÌÌßÌÌØÌÌÑÌÌÊÌÌÃÌ̼Ì̵ÌÌ®Ì̧ÌÌ ÌÌ™ÌÌ’ÌÌ‹ÌÌ„ÌÌ}ÌÌvÌÌoÌÌhÌÌaÌÌZÌÌSÌÌLÌÌEÌÌ>ÌÌ7ÌÌ0ÌÌ)ÌÌ"ÌÌÌÌÌÌ ÌÌÌÌÿËÌøËÌñËÌêËÌãËÌÜËÌÕËÌÎËÌÇËÌÀË̹Ë̲ËÌ«Ë̤ËÌËÌ–ËÌË̈ËÌËÌzËÌsËÌlËÌeËÌ^ËÌWËÌPËÌIËÌBËÌ;ËÌ4ËÌ-ËÌ&ËÌËÌËÌËÌ ËÌËÌüÊÌõÊÌîÊÌçÊÌàÊÌÙÊÌÒÊÌËÊÌÄÊ̽Ê̶Ê̯Ę̂ÊÌ¡ÊÌšÊÌ“ÊÌŒÊÌ…ÊÌ~ÊÌwÊÌpÊÌiÊÌbÊÌ[ÊÌTÊÌMÊÌFÊÌ?ÊÌ8ÊÌ1ÊÌ*ÊÌ#ÊÌÊÌÊÌÊÌÊÌÊÌùÉÌòÉÌëÉÌäÉÌÝÉÌÖÉÌÏÉÌÈÉÌÁÉ̺É̳É̬ÉÌ¥ÉÌžÉÌ—ÉÌÉ̉ÉÌ‚ÉÌ{ÉÌtÉÌmÉÌfÉÌ_ÉÌXÉÌQÉÌJÉÌCÉÌ<ÉÌ5ÉÌ.ÉÌ'ÉÌ ÉÌÉÌÉÌ ÉÌÉÌýÈÌöÈÌïÈÌèÈÌáÈÌÚÈÌÓÈÌÌÈÌÅÈ̾ÈÌ·Ḛ̀ÈÌ©ÈÌ¢ÈÌ›ÈÌ”ÈÌÈ̆ÈÌÈÌxÈÌqÈÌjÈÌcÈÌ\ÈÌUÈÌNÈÌGÈÌ@ÈÌ9ÈÌ2ÈÌ+ÈÌ$ÈÌÈÌÈÌÈÌÈÌÈÌúÇÌóÇÌìÇÌåÇÌÞÇÌ×ÇÌÐÇÌÉÇÌÂÇÌ»ÇÌ´ÇÌ­Ç̦ÇÌŸÇ̘ÇÌ‘ÇÌŠÇ̃ÇÌ|ÇÌuÇÌnÇÌgÇÌ`ÇÌYÇÌRÇÌKÇÌDÇÌ=ÇÌ6ÇÌ/ÇÌ(ÇÌ!ÇÌÇÌÇÌ ÇÌÇÌþÆÌ÷ÆÌðÆÌéÆÌâÆÌÛÆÌÔÆÌÍÆÌÆÆÌ¿ÆÌ¸ÆÌ±ÆÌªÆÌ£ÆÌœÆÌ•ÆÌŽÆÌ‡ÆÌ€ÆÌyÆÌrÆÌkÆÌdÆÌ]ÆÌVÆÌOÆÌHÆÌAÆÌ:ÆÌ3ÆÌ,ÆÌ%ÆÌÆÌÆÌÆÌ ÆÌÆÌûÅÌôÅÌíÅÌæÅÌßÅÌØÅÌÑÅÌÊÅÌÃÅ̼Å̵ÅÌ®Å̧ÅÌ ÅÌ™ÅÌ’ÅÌ‹ÅÌ„ÅÌ}ÅÌvÅÌoÅÌhÅÌaÅÌZÅÌSÅÌLÅÌEÅÌ>ÅÌ7ÅÌ0ÅÌ)ÅÌ"ÅÌÅÌÅÌ ÅÌÅÌÿÄÌøÄÌñÄÌêÄÌãÄÌÜÄÌÕÄÌÎÄÌÇÄÌÀÄ̹Ä̲ÄÌ«Ä̤ÄÌÄÌ–ÄÌÄ̈ÄÌÄÌzÄÌsÄÌlÄÌeÄÌ^ÄÌWÄÌPÄÌIÄÌBÄÌ;ÄÌ4ÄÌ-ÄÌ&ÄÌÄÌÄÌÄÌ ÄÌÄÌüÃÌõÃÌîÃÌçÃÌàÃÌÙÃÌÒÃÌËÃÌÄÃ̽Ã̶Ã̯Ą̃ÃÌ¡ÃÌšÃÌ“ÃÌŒÃÌ…ÃÌ~ÃÌwÃÌpÃÌiÃÌbÃÌ[ÃÌTÃÌMÃÌFÃÌ?ÃÌ8ÃÌ1ÃÌ*ÃÌ#ÃÌÃÌÃÌÃÌÃÌÃÌùÂÌòÂÌëÂÌäÂÌÝÂÌÖÂÌÏÂÌÈÂÌÁÂ̺Â̳Â̬ÂÌ¥ÂÌžÂÌ—ÂÌẨÂÌ‚ÂÌ{ÂÌtÂÌmÂÌfÂÌ_ÂÌXÂÌQÂÌJÂÌCÂÌ<ÂÌ5ÂÌ.ÂÌ'ÂÌ ÂÌÂÌÂÌ ÂÌÂÌýÁÌöÁÌïÁÌèÁÌáÁÌÚÁÌÓÁÌÌÁÌÅÁ̾ÁÌ·Á̰ÁÌ©ÁÌ¢ÁÌ›ÁÌ”ÁÌÁ̆ÁÌÁÌxÁÌqÁÌjÁÌcÁÌ\ÁÌUÁÌNÁÌGÁÌ@ÁÌ9ÁÌ2ÁÌ+ÁÌ$ÁÌÁÌÁÌÁÌÁÌÁÌúÀÌóÀÌìÀÌåÀÌÞÀÌ×ÀÌÐÀÌÉÀÌÂÀÌ»ÀÌ´ÀÌ­À̦ÀÌŸÀ̘ÀÌ‘ÀÌŠÀ̃ÀÌ|ÀÌuÀÌnÀÌgÀÌ`ÀÌYÀÌRÀÌKÀÌDÀÌ=ÀÌ6ÀÌ/ÀÌ(ÀÌ!ÀÌÀÌÀÌ ÀÌÀÌþ¿Ì÷¿Ìð¿Ìé¿Ìâ¿ÌÛ¿ÌÔ¿ÌÍ¿ÌÆ¿Ì¿¿Ì¸¿Ì±¿Ìª¿Ì£¿Ìœ¿Ì•¿ÌŽ¿Ì‡¿Ì€¿Ìy¿Ìr¿Ìk¿Ìd¿Ì]¿ÌV¿ÌO¿ÌH¿ÌA¿Ì:¿Ì3¿Ì,¿Ì%¿Ì¿Ì¿Ì¿Ì ¿Ì¿Ìû¾Ìô¾Ìí¾Ìæ¾Ìß¾ÌؾÌѾÌʾÌþ̼¾Ìµ¾Ì®¾Ì§¾Ì ¾Ì™¾Ì’¾Ì‹¾Ì„¾Ì}¾Ìv¾Ìo¾Ìh¾Ìa¾ÌZ¾ÌS¾ÌL¾ÌE¾Ì>¾Ì7¾Ì0¾Ì)¾Ì"¾Ì¾Ì¾Ì ¾Ì¾Ìÿ½Ìø½Ìñ½Ìê½Ìã½ÌܽÌÕ½ÌνÌǽÌÀ½Ì¹½Ì²½Ì«½Ì¤½Ì½Ì–½Ì½Ìˆ½Ì½Ìz½Ìs½Ìl½Ìe½Ì^½ÌW½ÌP½ÌI½ÌB½Ì;½Ì4½Ì-½Ì&½Ì½Ì½Ì½Ì ½Ì½Ìü¼Ìõ¼Ìî¼Ìç¼Ìà¼ÌÙ¼ÌÒ¼Ì˼Ìļ̽¼Ì¶¼Ì¯¼Ì¨¼Ì¡¼Ìš¼Ì“¼ÌŒ¼Ì…¼Ì~¼Ìw¼Ìp¼Ìi¼Ìb¼Ì[¼ÌT¼ÌM¼ÌF¼Ì?¼Ì8¼Ì1¼Ì*¼Ì#¼Ì¼Ì¼Ì¼Ì¼Ì¼Ìù»Ìò»Ìë»Ìä»ÌÝ»ÌÖ»ÌÏ»ÌÈ»ÌÁ»Ìº»Ì³»Ì¬»Ì¥»Ìž»Ì—»Ì»Ì‰»Ì‚»Ì{»Ìt»Ìm»Ìf»Ì_»ÌX»ÌQ»ÌJ»ÌC»Ì<»Ì5»Ì.»Ì'»Ì »Ì»Ì»Ì »Ì»ÌýºÌöºÌïºÌèºÌáºÌÚºÌÓºÌ̺ÌźÌ¾ºÌ·ºÌ°ºÌ©ºÌ¢ºÌ›ºÌ”ºÌºÌ†ºÌºÌxºÌqºÌjºÌcºÌ\ºÌUºÌNºÌGºÌ@ºÌ9ºÌ2ºÌ+ºÌ$ºÌºÌºÌºÌºÌºÌú¹Ìó¹Ìì¹Ìå¹ÌÞ¹Ì×¹ÌйÌɹ̹̻¹Ì´¹Ì­¹Ì¦¹ÌŸ¹Ì˜¹Ì‘¹Ìй̃¹Ì|¹Ìu¹Ìn¹Ìg¹Ì`¹ÌY¹ÌR¹ÌK¹ÌD¹Ì=¹Ì6¹Ì/¹Ì(¹Ì!¹Ì¹Ì¹Ì ¹Ì¹Ìþ¸Ì÷¸Ìð¸Ìé¸Ìâ¸ÌÛ¸ÌÔ¸Ì͸ÌƸÌ¿¸Ì¸¸Ì±¸Ìª¸Ì£¸Ìœ¸Ì•¸Ìޏ̇¸Ì€¸Ìy¸Ìr¸Ìk¸Ìd¸Ì]¸ÌV¸ÌO¸ÌH¸ÌA¸Ì:¸Ì3¸Ì,¸Ì%¸Ì¸Ì¸Ì¸Ì ¸Ì¸Ìû·Ìô·Ìí·Ìæ·Ìß·ÌØ·ÌÑ·ÌÊ·Ì÷̼·Ìµ·Ì®·Ì§·Ì ·Ì™·Ì’·Ì‹·Ì„·Ì}·Ìv·Ìo·Ìh·Ìa·ÌZ·ÌS·ÌL·ÌE·Ì>·Ì7·Ì0·Ì)·Ì"·Ì·Ì·Ì ·Ì·Ìÿ¶Ìø¶Ìñ¶Ìê¶Ìã¶ÌܶÌÕ¶ÌζÌǶÌÀ¶Ì¹¶Ì²¶Ì«¶Ì¤¶Ì¶Ì–¶Ì¶Ìˆ¶Ì¶Ìz¶Ìs¶Ìl¶Ìe¶Ì^¶ÌW¶ÌP¶ÌI¶ÌB¶Ì;¶Ì4¶Ì-¶Ì&¶Ì¶Ì¶Ì¶Ì ¶Ì¶ÌüµÌõµÌîµÌçµÌàµÌÙµÌÒµÌ˵Ìĵ̽µÌ¶µÌ¯µÌ¨µÌ¡µÌšµÌ“µÌŒµÌ…µÌ~µÌwµÌpµÌiµÌbµÌ[µÌTµÌMµÌFµÌ?µÌ8µÌ1µÌ*µÌ#µÌµÌµÌµÌµÌµÌù´Ìò´Ìë´Ìä´ÌÝ´ÌÖ´ÌÏ´ÌÈ´ÌÁ´Ìº´Ì³´Ì¬´Ì¥´Ìž´Ì—´Ì´Ì‰´Ì‚´Ì{´Ìt´Ìm´Ìf´Ì_´ÌX´ÌQ´ÌJ´ÌC´Ì<´Ì5´Ì.´Ì'´Ì ´Ì´Ì´Ì ´Ì´Ìý³Ìö³Ìï³Ìè³Ìá³ÌÚ³ÌÓ³Ì̳Ìų̾³Ì·³Ì°³Ì©³Ì¢³Ì›³Ì”³Ì³Ì†³Ì³Ìx³Ìq³Ìj³Ìc³Ì\³ÌU³ÌN³ÌG³Ì@³Ì9³Ì2³Ì+³Ì$³Ì³Ì³Ì³Ì³Ì³Ìú²Ìó²Ìì²Ìå²ÌÞ²ÌײÌвÌɲ̲̻²Ì´²Ì­²Ì¦²ÌŸ²Ì˜²Ì‘²Ìв̃²Ì|²Ìu²Ìn²Ìg²Ì`²ÌY²ÌR²ÌK²ÌD²Ì=²Ì6²Ì/²Ì(²Ì!²Ì²Ì²Ì ²Ì²Ìþ±Ì÷±Ìð±Ìé±Ìâ±ÌÛ±ÌÔ±ÌͱÌƱÌ¿±Ì¸±Ì±±Ìª±Ì£±Ìœ±Ì•±Ìޱ̇±Ì€±Ìy±Ìr±Ìk±Ìd±Ì]±ÌV±ÌO±ÌH±ÌA±Ì:±Ì3±Ì,±Ì%±Ì±Ì±Ì±Ì ±Ì±Ìû°Ìô°Ìí°Ìæ°Ìß°ÌذÌѰÌʰÌð̼°Ìµ°Ì®°Ì§°Ì °Ì™°Ì’°Ì‹°Ì„°Ì}°Ìv°Ìo°Ìh°Ìa°ÌZ°ÌS°ÌL°ÌE°Ì>°Ì7°Ì0°Ì)°Ì"°Ì°Ì°Ì °Ì°Ìÿ¯Ìø¯Ìñ¯Ìê¯Ìã¯ÌܯÌÕ¯ÌίÌǯÌÀ¯Ì¹¯Ì²¯Ì«¯Ì¤¯Ì¯Ì–¯Ì¯Ìˆ¯Ì¯Ìz¯Ìs¯Ìl¯Ìe¯Ì^¯ÌW¯ÌP¯ÌI¯ÌB¯Ì;¯Ì4¯Ì-¯Ì&¯Ì¯Ì¯Ì¯Ì ¯Ì¯Ìü®Ìõ®Ìî®Ìç®Ìà®ÌÙ®ÌÒ®ÌË®ÌĮ̽®Ì¶®Ì¯®Ì¨®Ì¡®Ìš®Ì“®ÌŒ®Ì…®Ì~®Ìw®Ìp®Ìi®Ìb®Ì[®ÌT®ÌM®ÌF®Ì?®Ì8®Ì1®Ì*®Ì#®Ì®Ì®Ì®Ì®Ì®Ìù­Ìò­Ìë­Ìä­ÌÝ­ÌÖ­ÌÏ­ÌÈ­ÌÁ­Ìº­Ì³­Ì¬­Ì¥­Ìž­Ì—­Ì­Ì‰­Ì‚­Ì{­Ìt­Ìm­Ìf­Ì_­ÌX­ÌQ­ÌJ­ÌC­Ì<­Ì5­Ì.­Ì'­Ì ­Ì­Ì­Ì ­Ì­Ìý¬Ìö¬Ìï¬Ìè¬Ìá¬ÌÚ¬ÌÓ¬Ì̬ÌŬ̾¬Ì·¬Ì°¬Ì©¬Ì¢¬Ì›¬Ì”¬Ì¬Ì†¬Ì¬Ìx¬Ìq¬Ìj¬Ìc¬Ì\¬ÌU¬ÌN¬ÌG¬Ì@¬Ì9¬Ì2¬Ì+¬Ì$¬Ì¬Ì¬Ì¬Ì¬Ì¬Ìú«Ìó«Ìì«Ìå«ÌÞ«Ì׫ÌЫÌɫ̫̻«Ì´«Ì­«Ì¦«ÌŸ«Ì˜«Ì‘«ÌŠ«Ìƒ«Ì|«Ìu«Ìn«Ìg«Ì`«ÌY«ÌR«ÌK«ÌD«Ì=«Ì6«Ì/«Ì(«Ì!«Ì«Ì«Ì «Ì«ÌþªÌ÷ªÌðªÌéªÌâªÌÛªÌÔªÌͪÌƪÌ¿ªÌ¸ªÌ±ªÌªªÌ£ªÌœªÌ•ªÌŽªÌ‡ªÌ€ªÌyªÌrªÌkªÌdªÌ]ªÌVªÌOªÌHªÌAªÌ:ªÌ3ªÌ,ªÌ%ªÌªÌªÌªÌ ªÌªÌû©Ìô©Ìí©Ìæ©Ìß©ÌØ©ÌÑ©ÌÊ©Ìé̼©Ìµ©Ì®©Ì§©Ì ©Ì™©Ì’©Ì‹©Ì„©Ì}©Ìv©Ìo©Ìh©Ìa©ÌZ©ÌS©ÌL©ÌE©Ì>©Ì7©Ì0©Ì)©Ì"©Ì©Ì©Ì ©Ì©Ìÿ¨Ìø¨Ìñ¨Ìê¨Ìã¨ÌܨÌÕ¨ÌΨÌǨÌÀ¨Ì¹¨Ì²¨Ì«¨Ì¤¨Ì¨Ì–¨Ì¨Ìˆ¨Ì¨Ìz¨Ìs¨Ìl¨Ìe¨Ì^¨ÌW¨ÌP¨ÌI¨ÌB¨Ì;¨Ì4¨Ì-¨Ì&¨Ì¨Ì¨Ì¨Ì ¨Ì¨Ìü§Ìõ§Ìî§Ìç§Ìà§ÌÙ§ÌÒ§Ì˧Ìħ̽§Ì¶§Ì¯§Ì¨§Ì¡§Ìš§Ì“§ÌŒ§Ì…§Ì~§Ìw§Ìp§Ìi§Ìb§Ì[§ÌT§ÌM§ÌF§Ì?§Ì8§Ì1§Ì*§Ì#§Ì§Ì§Ì§Ì§Ì§Ìù¦Ìò¦Ìë¦Ìä¦ÌݦÌÖ¦ÌϦÌȦÌÁ¦Ìº¦Ì³¦Ì¬¦Ì¥¦Ìž¦Ì—¦Ì¦Ì‰¦Ì‚¦Ì{¦Ìt¦Ìm¦Ìf¦Ì_¦ÌX¦ÌQ¦ÌJ¦ÌC¦Ì<¦Ì5¦Ì.¦Ì'¦Ì ¦Ì¦Ì¦Ì ¦Ì¦Ìý¥Ìö¥Ìï¥Ìè¥Ìá¥ÌÚ¥ÌÓ¥ÌÌ¥Ìť̾¥Ì·¥Ì°¥Ì©¥Ì¢¥Ì›¥Ì”¥Ì¥Ì†¥Ì¥Ìx¥Ìq¥Ìj¥Ìc¥Ì\¥ÌU¥ÌN¥ÌG¥Ì@¥Ì9¥Ì2¥Ì+¥Ì$¥Ì¥Ì¥Ì¥Ì¥Ì¥Ìú¤Ìó¤Ìì¤Ìå¤ÌÞ¤ÌפÌФÌɤ̤̻¤Ì´¤Ì­¤Ì¦¤ÌŸ¤Ì˜¤Ì‘¤ÌФ̃¤Ì|¤Ìu¤Ìn¤Ìg¤Ì`¤ÌY¤ÌR¤ÌK¤ÌD¤Ì=¤Ì6¤Ì/¤Ì(¤Ì!¤Ì¤Ì¤Ì ¤Ì¤Ìþ£Ì÷£Ìð£Ìé£Ìâ£ÌÛ£ÌÔ£ÌÍ£ÌÆ£Ì¿£Ì¸£Ì±£Ìª£Ì££Ìœ£Ì•£ÌŽ£Ì‡£Ì€£Ìy£Ìr£Ìk£Ìd£Ì]£ÌV£ÌO£ÌH£ÌA£Ì:£Ì3£Ì,£Ì%£Ì£Ì£Ì£Ì £Ì£Ìû¢Ìô¢Ìí¢Ìæ¢ÌߢÌØ¢ÌÑ¢ÌÊ¢Ìâ̼¢Ìµ¢Ì®¢Ì§¢Ì ¢Ì™¢Ì’¢Ì‹¢Ì„¢Ì}¢Ìv¢Ìo¢Ìh¢Ìa¢ÌZ¢ÌS¢ÌL¢ÌE¢Ì>¢Ì7¢Ì0¢Ì)¢Ì"¢Ì¢Ì¢Ì ¢Ì¢Ìÿ¡Ìø¡Ìñ¡Ìê¡Ìã¡ÌÜ¡ÌÕ¡ÌΡÌÇ¡ÌÀ¡Ì¹¡Ì²¡Ì«¡Ì¤¡Ì¡Ì–¡Ì¡Ìˆ¡Ì¡Ìz¡Ìs¡Ìl¡Ìe¡Ì^¡ÌW¡ÌP¡ÌI¡ÌB¡Ì;¡Ì4¡Ì-¡Ì&¡Ì¡Ì¡Ì¡Ì ¡Ì¡Ìü Ìõ Ìî Ìç Ìà ÌÙ ÌÒ ÌË ÌĠ̽ Ì¶ Ì¯ Ì¨ Ì¡ Ìš Ì“ ÌŒ Ì… Ì~ Ìw Ìp Ìi Ìb Ì[ ÌT ÌM ÌF Ì? Ì8 Ì1 Ì* Ì# Ì Ì Ì Ì Ì ÌùŸÌòŸÌëŸÌäŸÌÝŸÌÖŸÌÏŸÌÈŸÌÁŸÌºŸÌ³ŸÌ¬ŸÌ¥ŸÌžŸÌ—ŸÌŸÌ‰ŸÌ‚ŸÌ{ŸÌtŸÌmŸÌfŸÌ_ŸÌXŸÌQŸÌJŸÌCŸÌ<ŸÌ5ŸÌ.ŸÌ'ŸÌ ŸÌŸÌŸÌ ŸÌŸÌýžÌöžÌïžÌèžÌážÌÚžÌÓžÌÌžÌŞ̾žÌ·žÌ°žÌ©žÌ¢žÌ›žÌ”žÌžÌ†žÌžÌxžÌqžÌjžÌcžÌ\žÌUžÌNžÌGžÌ@žÌ9žÌ2žÌ+žÌ$žÌžÌžÌžÌžÌžÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþœÌ÷œÌðœÌéœÌâœÌÛœÌÔœÌÍœÌÆœÌ¿œÌ¸œÌ±œÌªœÌ£œÌœœÌ•œÌŽœÌ‡œÌ€œÌyœÌrœÌkœÌdœÌ]œÌVœÌOœÌHœÌAœÌ:œÌ3œÌ,œÌ%œÌœÌœÌœÌ œÌœÌû›Ìô›Ìí›Ìæ›Ìß›ÌØ›ÌÑ›ÌÊ›ÌÛ̼›Ìµ›Ì®›Ì§›Ì ›Ì™›Ì’›Ì‹›Ì„›Ì}›Ìv›Ìo›Ìh›Ìa›ÌZ›ÌS›ÌL›ÌE›Ì>›Ì7›Ì0›Ì)›Ì"›Ì›Ì›Ì ›Ì›ÌÿšÌøšÌñšÌêšÌãšÌÜšÌÕšÌΚÌÇšÌÀšÌ¹šÌ²šÌ«šÌ¤šÌšÌ–šÌšÌˆšÌšÌzšÌsšÌlšÌešÌ^šÌWšÌPšÌIšÌBšÌ;šÌ4šÌ-šÌ&šÌšÌšÌšÌ šÌšÌü™Ìõ™Ìî™Ìç™Ìà™ÌÙ™ÌÒ™ÌË™Ìę̽™Ì¶™Ì¯™Ì¨™Ì¡™Ìš™Ì“™ÌŒ™Ì…™Ì~™Ìw™Ìp™Ìi™Ìb™Ì[™ÌT™ÌM™ÌF™Ì?™Ì8™Ì1™Ì*™Ì#™Ì™Ì™Ì™Ì™Ì™Ìù˜Ìò˜Ìë˜Ìä˜ÌݘÌÖ˜ÌϘÌȘÌÁ˜Ìº˜Ì³˜Ì¬˜Ì¥˜Ìž˜Ì—˜Ì˜Ì‰˜Ì‚˜Ì{˜Ìt˜Ìm˜Ìf˜Ì_˜ÌX˜ÌQ˜ÌJ˜ÌC˜Ì<˜Ì5˜Ì.˜Ì'˜Ì ˜Ì˜Ì˜Ì ˜Ì˜Ìý—Ìö—Ìï—Ìè—Ìá—ÌÚ—ÌÓ—ÌÌ—Ìŗ̾—Ì·—̰—Ì©—Ì¢—Ì›—Ì”—̗̆—Ì—Ìx—Ìq—Ìj—Ìc—Ì\—ÌU—ÌN—ÌG—Ì@—Ì9—Ì2—Ì+—Ì$—Ì—Ì—Ì—Ì—Ì—Ìú–Ìó–Ìì–Ìå–ÌÞ–Ì×–ÌЖÌÉ–Ì–Ì»–Ì´–Ì­–̦–ÌŸ–̘–Ì‘–ÌŠ–̃–Ì|–Ìu–Ìn–Ìg–Ì`–ÌY–ÌR–ÌK–ÌD–Ì=–Ì6–Ì/–Ì(–Ì!–Ì–Ì–Ì –Ì–Ìþ•Ì÷•Ìð•Ìé•Ìâ•ÌÛ•ÌÔ•ÌÍ•ÌÆ•Ì¿•̸•̱•̪•Ì£•Ìœ•Ì••ÌŽ•̇•Ì€•Ìy•Ìr•Ìk•Ìd•Ì]•ÌV•ÌO•ÌH•ÌA•Ì:•Ì3•Ì,•Ì%•Ì•Ì•Ì•Ì •Ì•Ìû”Ìô”Ìí”Ìæ”Ìß”ÌØ”ÌÑ”ÌÊ”ÌÔ̼”̵”Ì®”̧”Ì ”Ì™”Ì’”Ì‹”Ì„”Ì}”Ìv”Ìo”Ìh”Ìa”ÌZ”ÌS”ÌL”ÌE”Ì>”Ì7”Ì0”Ì)”Ì"”Ì”Ì”Ì ”Ì”Ìÿ“Ìø“Ìñ“Ìê“Ìã“ÌÜ“ÌÕ“ÌΓÌÇ“ÌÀ“̹“̲“Ì«“̤“̖̓“̓̈“Ì“Ìz“Ìs“Ìl“Ìe“Ì^“ÌW“ÌP“ÌI“ÌB“Ì;“Ì4“Ì-“Ì&“Ì“Ì“Ì“Ì “Ì“Ìü’Ìõ’Ìî’Ìç’Ìà’ÌÙ’ÌÒ’ÌË’ÌĒ̽’̶’̯’̨’Ì¡’Ìš’Ì“’ÌŒ’Ì…’Ì~’Ìw’Ìp’Ìi’Ìb’Ì[’ÌT’ÌM’ÌF’Ì?’Ì8’Ì1’Ì*’Ì#’Ì’Ì’Ì’Ì’Ì’Ìù‘Ìò‘Ìë‘Ìä‘ÌÝ‘ÌÖ‘ÌÏ‘ÌÈ‘ÌÁ‘̺‘̳‘̬‘Ì¥‘Ìž‘Ì—‘̑̉‘Ì‚‘Ì{‘Ìt‘Ìm‘Ìf‘Ì_‘ÌX‘ÌQ‘ÌJ‘ÌC‘Ì<‘Ì5‘Ì.‘Ì'‘Ì ‘Ì‘Ì‘Ì ‘Ì‘ÌýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþŽÌ÷ŽÌðŽÌéŽÌâŽÌÛŽÌÔŽÌÍŽÌÆŽÌ¿ŽÌ¸ŽÌ±ŽÌªŽÌ£ŽÌœŽÌ•ŽÌŽŽÌ‡ŽÌ€ŽÌyŽÌrŽÌkŽÌdŽÌ]ŽÌVŽÌOŽÌHŽÌAŽÌ:ŽÌ3ŽÌ,ŽÌ%ŽÌŽÌŽÌŽÌ ŽÌŽÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿŒÌøŒÌñŒÌêŒÌãŒÌÜŒÌÕŒÌÎŒÌÇŒÌÀŒÌ¹ŒÌ²ŒÌ«ŒÌ¤ŒÌŒÌ–ŒÌŒÌˆŒÌŒÌzŒÌsŒÌlŒÌeŒÌ^ŒÌWŒÌPŒÌIŒÌBŒÌ;ŒÌ4ŒÌ-ŒÌ&ŒÌŒÌŒÌŒÌ ŒÌŒÌü‹Ìõ‹Ìî‹Ìç‹Ìà‹ÌÙ‹ÌÒ‹ÌË‹Ìċ̽‹Ì¶‹Ì¯‹Ì¨‹Ì¡‹Ìš‹Ì“‹ÌŒ‹Ì…‹Ì~‹Ìw‹Ìp‹Ìi‹Ìb‹Ì[‹ÌT‹ÌM‹ÌF‹Ì?‹Ì8‹Ì1‹Ì*‹Ì#‹Ì‹Ì‹Ì‹Ì‹Ì‹ÌùŠÌòŠÌëŠÌäŠÌÝŠÌÖŠÌÏŠÌÈŠÌÁŠÌºŠÌ³ŠÌ¬ŠÌ¥ŠÌžŠÌ—ŠÌŠÌ‰ŠÌ‚ŠÌ{ŠÌtŠÌmŠÌfŠÌ_ŠÌXŠÌQŠÌJŠÌCŠÌ<ŠÌ5ŠÌ.ŠÌ'ŠÌ ŠÌŠÌŠÌ ŠÌŠÌý‰Ìö‰Ìï‰Ìè‰Ìá‰ÌÚ‰ÌÓ‰Ì̉Ìʼn̾‰Ì·‰Ì°‰Ì©‰Ì¢‰Ì›‰Ì”‰Ì‰Ì†‰Ì‰Ìx‰Ìq‰Ìj‰Ìc‰Ì\‰ÌU‰ÌN‰ÌG‰Ì@‰Ì9‰Ì2‰Ì+‰Ì$‰Ì‰Ì‰Ì‰Ì‰Ì‰ÌúˆÌóˆÌìˆÌåˆÌÞˆÌ׈ÌЈÌɈ̻̈ˆÌ´ˆÌ­ˆÌ¦ˆÌŸˆÌ˜ˆÌ‘ˆÌŠˆÌƒˆÌ|ˆÌuˆÌnˆÌgˆÌ`ˆÌYˆÌRˆÌKˆÌDˆÌ=ˆÌ6ˆÌ/ˆÌ(ˆÌ!ˆÌˆÌˆÌ ˆÌˆÌþ‡Ì÷‡Ìð‡Ìé‡Ìâ‡ÌÛ‡ÌÔ‡Ì͇ÌƇÌ¿‡Ì¸‡Ì±‡Ìª‡Ì£‡Ìœ‡Ì•‡Ìއ̇‡Ì€‡Ìy‡Ìr‡Ìk‡Ìd‡Ì]‡ÌV‡ÌO‡ÌH‡ÌA‡Ì:‡Ì3‡Ì,‡Ì%‡Ì‡Ì‡Ì‡Ì ‡Ì‡Ìû†Ìô†Ìí†Ìæ†Ì߆Ì؆ÌцÌʆÌÆÌ¼†Ìµ†Ì®†Ì§†Ì †Ì™†Ì’†Ì‹†Ì„†Ì}†Ìv†Ìo†Ìh†Ìa†ÌZ†ÌS†ÌL†ÌE†Ì>†Ì7†Ì0†Ì)†Ì"†Ì†Ì†Ì †Ì†Ìÿ…Ìø…Ìñ…Ìê…Ìã…ÌÜ…ÌÕ…ÌÎ…ÌÇ…ÌÀ…̹…̲…Ì«…̤…Ì…Ì–…̅̈…Ì…Ìz…Ìs…Ìl…Ìe…Ì^…ÌW…ÌP…ÌI…ÌB…Ì;…Ì4…Ì-…Ì&…Ì…Ì…Ì…Ì …Ì…Ìü„Ìõ„Ìî„Ìç„Ìà„ÌÙ„ÌÒ„ÌË„ÌĄ̽„̶„̯„̨„Ì¡„Ìš„Ì“„ÌŒ„Ì…„Ì~„Ìw„Ìp„Ìi„Ìb„Ì[„ÌT„ÌM„ÌF„Ì?„Ì8„Ì1„Ì*„Ì#„̄̄̄̄̄ÌùƒÌòƒÌëƒÌäƒÌ݃ÌÖƒÌσÌȃÌÁƒÌºƒÌ³ƒÌ¬ƒÌ¥ƒÌžƒÌ—ƒÌƒÌ‰ƒÌ‚ƒÌ{ƒÌtƒÌmƒÌfƒÌ_ƒÌXƒÌQƒÌJƒÌCƒÌ<ƒÌ5ƒÌ.ƒÌ'ƒÌ ƒÌƒÌƒÌ ƒÌƒÌý‚Ìö‚Ìï‚Ìè‚Ìá‚ÌÚ‚ÌÓ‚ÌÌ‚Ìł̾‚Ì·‚̰‚Ì©‚Ì¢‚Ì›‚Ì”‚̂̆‚Ì‚Ìx‚Ìq‚Ìj‚Ìc‚Ì\‚ÌU‚ÌN‚ÌG‚Ì@‚Ì9‚Ì2‚Ì+‚Ì$‚̂̂̂̂̂ÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþ€Ì÷€Ìð€Ìé€Ìâ€ÌÛ€ÌÔ€ÌÍ€ÌÆ€Ì¿€Ì¸€Ì±€Ìª€Ì£€Ìœ€Ì•€ÌŽ€Ì‡€Ì€€Ìy€Ìr€Ìk€Ìd€Ì]€ÌV€ÌO€ÌH€ÌA€Ì:€Ì3€Ì,€Ì%€Ì€Ì€Ì€Ì €Ì€ÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿ~Ìø~Ìñ~Ìê~Ìã~ÌÜ~ÌÕ~ÌÎ~ÌÇ~ÌÀ~̹~̲~Ì«~̤~Ì~Ì–~Ì~̈~Ì~Ìz~Ìs~Ìl~Ìe~Ì^~ÌW~ÌP~ÌI~ÌB~Ì;~Ì4~Ì-~Ì&~Ì~Ì~Ì~Ì ~Ì~Ìü}Ìõ}Ìî}Ìç}Ìà}ÌÙ}ÌÒ}ÌË}ÌÄ}̽}̶}̯}̨}Ì¡}Ìš}Ì“}ÌŒ}Ì…}Ì~}Ìw}Ìp}Ìi}Ìb}Ì[}ÌT}ÌM}ÌF}Ì?}Ì8}Ì1}Ì*}Ì#}Ì}Ì}Ì}Ì}Ì}Ìù|Ìò|Ìë|Ìä|ÌÝ|ÌÖ|ÌÏ|ÌÈ|ÌÁ|̺|̳|̬|Ì¥|Ìž|Ì—|Ì|̉|Ì‚|Ì{|Ìt|Ìm|Ìf|Ì_|ÌX|ÌQ|ÌJ|ÌC|Ì<|Ì5|Ì.|Ì'|Ì |Ì|Ì|Ì |Ì|Ìý{Ìö{Ìï{Ìè{Ìá{ÌÚ{ÌÓ{ÌÌ{ÌÅ{̾{Ì·{̰{Ì©{Ì¢{Ì›{Ì”{Ì{̆{Ì{Ìx{Ìq{Ìj{Ìc{Ì\{ÌU{ÌN{ÌG{Ì@{Ì9{Ì2{Ì+{Ì${Ì{Ì{Ì{Ì{Ì{ÌúzÌózÌìzÌåzÌÞzÌ×zÌÐzÌÉzÌÂzÌ»zÌ´zÌ­z̦zÌŸz̘zÌ‘zÌŠz̃zÌ|zÌuzÌnzÌgzÌ`zÌYzÌRzÌKzÌDzÌ=zÌ6zÌ/zÌ(zÌ!zÌzÌzÌ zÌzÌþyÌ÷yÌðyÌéyÌâyÌÛyÌÔyÌÍyÌÆyÌ¿y̸y̱y̪yÌ£yÌœyÌ•yÌŽẏyÌ€yÌyyÌryÌkyÌdyÌ]yÌVyÌOyÌHyÌAyÌ:yÌ3yÌ,yÌ%yÌyÌyÌyÌ yÌyÌûxÌôxÌíxÌæxÌßxÌØxÌÑxÌÊxÌÃx̼x̵xÌ®x̧xÌ xÌ™xÌ’xÌ‹xÌ„xÌ}xÌvxÌoxÌhxÌaxÌZxÌSxÌLxÌExÌ>xÌ7xÌ0xÌ)xÌ"xÌxÌxÌ xÌxÌÿwÌøwÌñwÌêwÌãwÌÜwÌÕwÌÎwÌÇwÌÀw̹w̲wÌ«w̤wÌwÌ–wÌẅwÌwÌzwÌswÌlwÌewÌ^wÌWwÌPwÌIwÌBwÌ;wÌ4wÌ-wÌ&wÌwÌwÌwÌ wÌwÌüvÌõvÌîvÌçvÌàvÌÙvÌÒvÌËvÌÄv̽v̶v̯v̨vÌ¡vÌšvÌ“vÌŒvÌ…vÌ~vÌwvÌpvÌivÌbvÌ[vÌTvÌMvÌFvÌ?vÌ8vÌ1vÌ*vÌ#vÌvÌvÌvÌvÌvÌùuÌòuÌëuÌäuÌÝuÌÖuÌÏuÌÈuÌÁu̺u̳u̬uÌ¥uÌžuÌ—uÌủuÌ‚uÌ{uÌtuÌmuÌfuÌ_uÌXuÌQuÌJuÌCuÌqÌ7qÌ0qÌ)qÌ"qÌqÌqÌ qÌqÌÿpÌøpÌñpÌêpÌãpÌÜpÌÕpÌÎpÌÇpÌÀp̹p̲pÌ«p̤pÌpÌ–pÌp̈pÌpÌzpÌspÌlpÌepÌ^pÌWpÌPpÌIpÌBpÌ;pÌ4pÌ-pÌ&pÌpÌpÌpÌ pÌpÌüoÌõoÌîoÌçoÌàoÌÙoÌÒoÌËoÌÄo̽o̶o̯ǫoÌ¡oÌšoÌ“oÌŒoÌ…oÌ~oÌwoÌpoÌioÌboÌ[oÌToÌMoÌFoÌ?oÌ8oÌ1oÌ*oÌ#oÌoÌoÌoÌoÌoÌùnÌònÌënÌänÌÝnÌÖnÌÏnÌÈnÌÁn̺n̳n̬nÌ¥nÌžnÌ—nÌn̉nÌ‚nÌ{nÌtnÌmnÌfnÌ_nÌXnÌQnÌJnÌCnÌjÌ7jÌ0jÌ)jÌ"jÌjÌjÌ jÌjÌÿiÌøiÌñiÌêiÌãiÌÜiÌÕiÌÎiÌÇiÌÀi̹i̲iÌ«i̤iÌiÌ–iÌïiÌiÌziÌsiÌliÌeiÌ^iÌWiÌPiÌIiÌBiÌ;iÌ4iÌ-iÌ&iÌiÌiÌiÌ iÌiÌühÌõhÌîhÌçhÌàhÌÙhÌÒhÌËhÌÄh̽h̶h̯h̨hÌ¡hÌšhÌ“hÌŒhÌ…hÌ~hÌwhÌphÌihÌbhÌ[hÌThÌMhÌFhÌ?hÌ8hÌ1hÌ*hÌ#hÌhÌhÌhÌhÌhÌùgÌògÌëgÌägÌÝgÌÖgÌÏgÌÈgÌÁg̺g̳g̬gÌ¥gÌžgÌ—gÌg̉gÌ‚gÌ{gÌtgÌmgÌfgÌ_gÌXgÌQgÌJgÌCgÌcÌ7cÌ0cÌ)cÌ"cÌcÌcÌ cÌcÌÿbÌøbÌñbÌêbÌãbÌÜbÌÕbÌÎbÌÇbÌÀb̹b̲bÌ«b̤bÌbÌ–bÌb̈bÌbÌzbÌsbÌlbÌebÌ^bÌWbÌPbÌIbÌBbÌ;bÌ4bÌ-bÌ&bÌbÌbÌbÌ bÌbÌüaÌõaÌîaÌçaÌàaÌÙaÌÒaÌËaÌÄa̽a̶a̯ąaÌ¡aÌšaÌ“aÌŒaÌ…aÌ~aÌwaÌpaÌiaÌbaÌ[aÌTaÌMaÌFaÌ?aÌ8aÌ1aÌ*aÌ#aÌaÌaÌaÌaÌaÌù`Ìò`Ìë`Ìä`ÌÝ`ÌÖ`ÌÏ`ÌÈ`ÌÁ`̺`̳`̬`Ì¥`Ìž`Ì—`Ì`̉`Ì‚`Ì{`Ìt`Ìm`Ìf`Ì_`ÌX`ÌQ`ÌJ`ÌC`Ì<`Ì5`Ì.`Ì'`Ì `Ì`Ì`Ì `Ì`Ìý_Ìö_Ìï_Ìè_Ìá_ÌÚ_ÌÓ_ÌÌ_ÌÅ_̾_Ì·_̰_Ì©_Ì¢_Ì›_Ì”_Ì_̆_Ì_Ìx_Ìq_Ìj_Ìc_Ì\_ÌU_ÌN_ÌG_Ì@_Ì9_Ì2_Ì+_Ì$_Ì_Ì_Ì_Ì_Ì_Ìú^Ìó^Ìì^Ìå^ÌÞ^Ì×^ÌÐ^ÌÉ^ÌÂ^Ì»^Ì´^Ì­^̦^ÌŸ^̘^Ì‘^ÌŠ^̃^Ì|^Ìu^Ìn^Ìg^Ì`^ÌY^ÌR^ÌK^ÌD^Ì=^Ì6^Ì/^Ì(^Ì!^Ì^Ì^Ì ^Ì^Ìþ]Ì÷]Ìð]Ìé]Ìâ]ÌÛ]ÌÔ]ÌÍ]ÌÆ]Ì¿]̸]̱]̪]Ì£]Ìœ]Ì•]ÌŽ]̇]Ì€]Ìy]Ìr]Ìk]Ìd]Ì]]ÌV]ÌO]ÌH]ÌA]Ì:]Ì3]Ì,]Ì%]Ì]Ì]Ì]Ì ]Ì]Ìû\Ìô\Ìí\Ìæ\Ìß\ÌØ\ÌÑ\ÌÊ\ÌÃ\̼\̵\Ì®\̧\Ì \Ì™\Ì’\Ì‹\Ì„\Ì}\Ìv\Ìo\Ìh\Ìa\ÌZ\ÌS\ÌL\ÌE\Ì>\Ì7\Ì0\Ì)\Ì"\Ì\Ì\Ì \Ì\Ìÿ[Ìø[Ìñ[Ìê[Ìã[ÌÜ[ÌÕ[ÌÎ[ÌÇ[ÌÀ[̹[̲[Ì«[̤[Ì[Ì–[Ì[̈[Ì[Ìz[Ìs[Ìl[Ìe[Ì^[ÌW[ÌP[ÌI[ÌB[Ì;[Ì4[Ì-[Ì&[Ì[Ì[Ì[Ì [Ì[ÌüZÌõZÌîZÌçZÌàZÌÙZÌÒZÌËZÌÄZ̽Z̶Z̯Z̨ZÌ¡ZÌšZÌ“ZÌŒZÌ…ZÌ~ZÌwZÌpZÌiZÌbZÌ[ZÌTZÌMZÌFZÌ?ZÌ8ZÌ1ZÌ*ZÌ#ZÌZÌZÌZÌZÌZÌùYÌòYÌëYÌäYÌÝYÌÖYÌÏYÌÈYÌÁY̺Y̳Y̬YÌ¥YÌžYÌ—YÌỶYÌ‚YÌ{YÌtYÌmYÌfYÌ_YÌXYÌQYÌJYÌCYÌUÌ7UÌ0UÌ)UÌ"UÌUÌUÌ UÌUÌÿTÌøTÌñTÌêTÌãTÌÜTÌÕTÌÎTÌÇTÌÀT̹T̲TÌ«T̤TÌTÌ–TÌT̈TÌTÌzTÌsTÌlTÌeTÌ^TÌWTÌPTÌITÌBTÌ;TÌ4TÌ-TÌ&TÌTÌTÌTÌ TÌTÌüSÌõSÌîSÌçSÌàSÌÙSÌÒSÌËSÌÄS̽S̶S̯S̨SÌ¡SÌšSÌ“SÌŒSÌ…SÌ~SÌwSÌpSÌiSÌbSÌ[SÌTSÌMSÌFSÌ?SÌ8SÌ1SÌ*SÌ#SÌSÌSÌSÌSÌSÌùRÌòRÌëRÌäRÌÝRÌÖRÌÏRÌÈRÌÁR̺R̳R̬RÌ¥RÌžRÌ—RÌR̉RÌ‚RÌ{RÌtRÌmRÌfRÌ_RÌXRÌQRÌJRÌCRÌNÌ7NÌ0NÌ)NÌ"NÌNÌNÌ NÌNÌÿMÌøMÌñMÌêMÌãMÌÜMÌÕMÌÎMÌÇMÌÀM̹M̲MÌ«M̤MÌMÌ–MÌM̈MÌMÌzMÌsMÌlMÌeMÌ^MÌWMÌPMÌIMÌBMÌ;MÌ4MÌ-MÌ&MÌMÌMÌMÌ MÌMÌüLÌõLÌîLÌçLÌàLÌÙLÌÒLÌËLÌÄL̽L̶L̯L̨LÌ¡LÌšLÌ“LÌŒLÌ…LÌ~LÌwLÌpLÌiLÌbLÌ[LÌTLÌMLÌFLÌ?LÌ8LÌ1LÌ*LÌ#LÌLÌLÌLÌLÌLÌùKÌòKÌëKÌäKÌÝKÌÖKÌÏKÌÈKÌÁK̺K̳K̬KÌ¥KÌžKÌ—KÌK̉KÌ‚KÌ{KÌtKÌmKÌfKÌ_KÌXKÌQKÌJKÌCKÌGÌ7GÌ0GÌ)GÌ"GÌGÌGÌ GÌGÌÿFÌøFÌñFÌêFÌãFÌÜFÌÕFÌÎFÌÇFÌÀF̹F̲FÌ«F̤FÌFÌ–FÌF̈FÌFÌzFÌsFÌlFÌeFÌ^FÌWFÌPFÌIFÌBFÌ;FÌ4FÌ-FÌ&FÌFÌFÌFÌ FÌFÌüEÌõEÌîEÌçEÌàEÌÙEÌÒEÌËEÌÄE̽E̶E̯ĘEÌ¡EÌšEÌ“EÌŒEÌ…EÌ~EÌwEÌpEÌiEÌbEÌ[EÌTEÌMEÌFEÌ?EÌ8EÌ1EÌ*EÌ#EÌEÌEÌEÌEÌEÌùDÌòDÌëDÌäDÌÝDÌÖDÌÏDÌÈDÌÁD̺D̳D̬DÌ¥DÌžDÌ—DÌD̉DÌ‚DÌ{DÌtDÌmDÌfDÌ_DÌXDÌQDÌJDÌCDÌ@Ì7@Ì0@Ì)@Ì"@Ì@Ì@Ì @Ì@Ìÿ?Ìø?Ìñ?Ìê?Ìã?ÌÜ?ÌÕ?ÌÎ?ÌÇ?ÌÀ?̹?̲?Ì«?̤?Ì?Ì–?Ì?̈?Ì?Ìz?Ìs?Ìl?Ìe?Ì^?ÌW?ÌP?ÌI?ÌB?Ì;?Ì4?Ì-?Ì&?Ì?Ì?Ì?Ì ?Ì?Ìü>Ìõ>Ìî>Ìç>Ìà>ÌÙ>ÌÒ>ÌË>ÌÄ>̽>̶>̯>̨>Ì¡>Ìš>Ì“>ÌŒ>Ì…>Ì~>Ìw>Ìp>Ìi>Ìb>Ì[>ÌT>ÌM>ÌF>Ì?>Ì8>Ì1>Ì*>Ì#>Ì>Ì>Ì>Ì>Ì>Ìù=Ìò=Ìë=Ìä=ÌÝ=ÌÖ=ÌÏ=ÌÈ=ÌÁ=̺=̳=̬=Ì¥=Ìž=Ì—=Ì=̉=Ì‚=Ì{=Ìt=Ìm=Ìf=Ì_=ÌX=ÌQ=ÌJ=ÌC=Ì<=Ì5=Ì.=Ì'=Ì =Ì=Ì=Ì =Ì=Ìý<Ìö<Ìï<Ìè<Ìá<ÌÚ<ÌÓ<ÌÌ<ÌÅ<̾<Ì·<̰<Ì©<Ì¢<Ì›<Ì”<Ì<̆<Ì<Ìx<Ìq<Ìj<Ìc<Ì\<ÌU<ÌN<ÌG<Ì@<Ì9<Ì2<Ì+<Ì$<Ì<Ì<Ì<Ì<Ì<Ìú;Ìó;Ìì;Ìå;ÌÞ;Ì×;ÌÐ;ÌÉ;ÌÂ;Ì»;Ì´;Ì­;̦;ÌŸ;̘;Ì‘;ÌŠ;̃;Ì|;Ìu;Ìn;Ìg;Ì`;ÌY;ÌR;ÌK;ÌD;Ì=;Ì6;Ì/;Ì(;Ì!;Ì;Ì;Ì ;Ì;Ìþ:Ì÷:Ìð:Ìé:Ìâ:ÌÛ:ÌÔ:ÌÍ:ÌÆ:Ì¿:̸:̱:̪:Ì£:Ìœ:Ì•:ÌŽ:̇:Ì€:Ìy:Ìr:Ìk:Ìd:Ì]:ÌV:ÌO:ÌH:ÌA:Ì::Ì3:Ì,:Ì%:Ì:Ì:Ì:Ì :Ì:Ìû9Ìô9Ìí9Ìæ9Ìß9ÌØ9ÌÑ9ÌÊ9ÌÃ9̼9̵9Ì®9̧9Ì 9Ì™9Ì’9Ì‹9Ì„9Ì}9Ìv9Ìo9Ìh9Ìa9ÌZ9ÌS9ÌL9ÌE9Ì>9Ì79Ì09Ì)9Ì"9Ì9Ì9Ì 9Ì9Ìÿ8Ìø8Ìñ8Ìê8Ìã8ÌÜ8ÌÕ8ÌÎ8ÌÇ8ÌÀ8̹8̲8Ì«8̤8Ì8Ì–8Ì8̈8Ì8Ìz8Ìs8Ìl8Ìe8Ì^8ÌW8ÌP8ÌI8ÌB8Ì;8Ì48Ì-8Ì&8Ì8Ì8Ì8Ì 8Ì8Ìü7Ìõ7Ìî7Ìç7Ìà7ÌÙ7ÌÒ7ÌË7ÌÄ7̽7̶7̯7̨7Ì¡7Ìš7Ì“7ÌŒ7Ì…7Ì~7Ìw7Ìp7Ìi7Ìb7Ì[7ÌT7ÌM7ÌF7Ì?7Ì87Ì17Ì*7Ì#7Ì7Ì7Ì7Ì7Ì7Ìù6Ìò6Ìë6Ìä6ÌÝ6ÌÖ6ÌÏ6ÌÈ6ÌÁ6̺6̳6̬6Ì¥6Ìž6Ì—6Ì6̉6Ì‚6Ì{6Ìt6Ìm6Ìf6Ì_6ÌX6ÌQ6ÌJ6ÌC6Ì<6Ì56Ì.6Ì'6Ì 6Ì6Ì6Ì 6Ì6Ìý5Ìö5Ìï5Ìè5Ìá5ÌÚ5ÌÓ5ÌÌ5ÌÅ5̾5Ì·5̰5Ì©5Ì¢5Ì›5Ì”5Ì5̆5Ì5Ìx5Ìq5Ìj5Ìc5Ì\5ÌU5ÌN5ÌG5Ì@5Ì95Ì25Ì+5Ì$5Ì5Ì5Ì5Ì5Ì5Ìú4Ìó4Ìì4Ìå4ÌÞ4Ì×4ÌÐ4ÌÉ4ÌÂ4Ì»4Ì´4Ì­4̦4ÌŸ4̘4Ì‘4ÌŠ4̃4Ì|4Ìu4Ìn4Ìg4Ì`4ÌY4ÌR4ÌK4ÌD4Ì=4Ì64Ì/4Ì(4Ì!4Ì4Ì4Ì 4Ì4Ìþ3Ì÷3Ìð3Ìé3Ìâ3ÌÛ3ÌÔ3ÌÍ3ÌÆ3Ì¿3̸3̱3̪3Ì£3Ìœ3Ì•3ÌŽ3̇3Ì€3Ìy3Ìr3Ìk3Ìd3Ì]3ÌV3ÌO3ÌH3ÌA3Ì:3Ì33Ì,3Ì%3Ì3Ì3Ì3Ì 3Ì3Ìû2Ìô2Ìí2Ìæ2Ìß2ÌØ2ÌÑ2ÌÊ2ÌÃ2̼2̵2Ì®2̧2Ì 2Ì™2Ì’2Ì‹2Ì„2Ì}2Ìv2Ìo2Ìh2Ìa2ÌZ2ÌS2ÌL2ÌE2Ì>2Ì72Ì02Ì)2Ì"2Ì2Ì2Ì 2Ì2Ìÿ1Ìø1Ìñ1Ìê1Ìã1ÌÜ1ÌÕ1ÌÎ1ÌÇ1ÌÀ1̹1̲1Ì«1̤1Ì1Ì–1Ì1̈1Ì1Ìz1Ìs1Ìl1Ìe1Ì^1ÌW1ÌP1ÌI1ÌB1Ì;1Ì41Ì-1Ì&1Ì1Ì1Ì1Ì 1Ì1Ìü0Ìõ0Ìî0Ìç0Ìà0ÌÙ0ÌÒ0ÌË0ÌÄ0̽0̶0̯0̨0Ì¡0Ìš0Ì“0ÌŒ0Ì…0Ì~0Ìw0Ìp0Ìi0Ìb0Ì[0ÌT0ÌM0ÌF0Ì?0Ì80Ì10Ì*0Ì#0Ì0Ì0Ì0Ì0Ì0Ìù/Ìò/Ìë/Ìä/ÌÝ/ÌÖ/ÌÏ/ÌÈ/ÌÁ/̺/̳/̬/Ì¥/Ìž/Ì—/Ì/̉/Ì‚/Ì{/Ìt/Ìm/Ìf/Ì_/ÌX/ÌQ/ÌJ/ÌC/Ì+Ì7+Ì0+Ì)+Ì"+Ì+Ì+Ì +Ì+Ìÿ*Ìø*Ìñ*Ìê*Ìã*ÌÜ*ÌÕ*ÌÎ*ÌÇ*ÌÀ*̹*̲*Ì«*̤*Ì*Ì–*Ì*̈*Ì*Ìz*Ìs*Ìl*Ìe*Ì^*ÌW*ÌP*ÌI*ÌB*Ì;*Ì4*Ì-*Ì&*Ì*Ì*Ì*Ì *Ì*Ìü)Ìõ)Ìî)Ìç)Ìà)ÌÙ)ÌÒ)ÌË)ÌÄ)̽)̶)̯)̨)Ì¡)Ìš)Ì“)ÌŒ)Ì…)Ì~)Ìw)Ìp)Ìi)Ìb)Ì[)ÌT)ÌM)ÌF)Ì?)Ì8)Ì1)Ì*)Ì#)Ì)Ì)Ì)Ì)Ì)Ìù(Ìò(Ìë(Ìä(ÌÝ(ÌÖ(ÌÏ(ÌÈ(ÌÁ(̺(̳(̬(Ì¥(Ìž(Ì—(Ì(̉(Ì‚(Ì{(Ìt(Ìm(Ìf(Ì_(ÌX(ÌQ(ÌJ(ÌC(Ì<(Ì5(Ì.(Ì'(Ì (Ì(Ì(Ì (Ì(Ìý'Ìö'Ìï'Ìè'Ìá'ÌÚ'ÌÓ'ÌÌ'ÌÅ'̾'Ì·'̰'Ì©'Ì¢'Ì›'Ì”'Ì'̆'Ì'Ìx'Ìq'Ìj'Ìc'Ì\'ÌU'ÌN'ÌG'Ì@'Ì9'Ì2'Ì+'Ì$'Ì'Ì'Ì'Ì'Ì'Ìú&Ìó&Ìì&Ìå&ÌÞ&Ì×&ÌÐ&ÌÉ&ÌÂ&Ì»&Ì´&Ì­&̦&ÌŸ&̘&Ì‘&ÌŠ&̃&Ì|&Ìu&Ìn&Ìg&Ì`&ÌY&ÌR&ÌK&ÌD&Ì=&Ì6&Ì/&Ì(&Ì!&Ì&Ì&Ì &Ì&Ìþ%Ì÷%Ìð%Ìé%Ìâ%ÌÛ%ÌÔ%ÌÍ%ÌÆ%Ì¿%̸%̱%̪%Ì£%Ìœ%Ì•%ÌŽ%̇%Ì€%Ìy%Ìr%Ìk%Ìd%Ì]%ÌV%ÌO%ÌH%ÌA%Ì:%Ì3%Ì,%Ì%%Ì%Ì%Ì%Ì %Ì%Ìû$Ìô$Ìí$Ìæ$Ìß$ÌØ$ÌÑ$ÌÊ$ÌÃ$̼$̵$Ì®$̧$Ì $Ì™$Ì’$Ì‹$Ì„$Ì}$Ìv$Ìo$Ìh$Ìa$ÌZ$ÌS$ÌL$ÌE$Ì>$Ì7$Ì0$Ì)$Ì"$Ì$Ì$Ì $Ì$Ìÿ#Ìø#Ìñ#Ìê#Ìã#ÌÜ#ÌÕ#ÌÎ#ÌÇ#ÌÀ#̹#̲#Ì«#̤#Ì#Ì–#Ì#̈#Ì#Ìz#Ìs#Ìl#Ìe#Ì^#ÌW#ÌP#ÌI#ÌB#Ì;#Ì4#Ì-#Ì&#Ì#Ì#Ì#Ì #Ì#Ìü"Ìõ"Ìî"Ìç"Ìà"ÌÙ"ÌÒ"ÌË"ÌÄ"̽"̶"̯"̨"Ì¡"Ìš"Ì“"ÌŒ"Ì…"Ì~"Ìw"Ìp"Ìi"Ìb"Ì["ÌT"ÌM"ÌF"Ì?"Ì8"Ì1"Ì*"Ì#"Ì"Ì"Ì"Ì"Ì"Ìù!Ìò!Ìë!Ìä!ÌÝ!ÌÖ!ÌÏ!ÌÈ!ÌÁ!̺!̳!̬!Ì¥!Ìž!Ì—!Ì!̉!Ì‚!Ì{!Ìt!Ìm!Ìf!Ì_!ÌX!ÌQ!ÌJ!ÌC!ÌÌ7Ì0Ì)Ì"ÌÌÌ ÌÌÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌü Ìõ Ìî Ìç Ìà ÌÙ ÌÒ ÌË ÌÄ Ì½ ̶ ̯ ̨ Ì¡ Ìš Ì“ ÌŒ Ì… Ì~ Ìw Ìp Ìi Ìb Ì[ ÌT ÌM ÌF Ì? Ì8 Ì1 Ì* Ì# Ì Ì Ì Ì Ì Ìù Ìò Ìë Ìä ÌÝ ÌÖ ÌÏ ÌÈ ÌÁ ̺ ̳ ̬ Ì¥ Ìž Ì— Ì Ì‰ Ì‚ Ì{ Ìt Ìm Ìf Ì_ ÌX ÌQ ÌJ ÌC Ì< Ì5 Ì. Ì' Ì Ì Ì Ì Ì Ìý Ìö Ìï Ìè Ìá ÌÚ ÌÓ ÌÌ ÌŠ̾ Ì· ̰ Ì© Ì¢ Ì› Ì” Ì Ì† Ì Ìx Ìq Ìj Ìc Ì\ ÌU ÌN ÌG Ì@ Ì9 Ì2 Ì+ Ì$ Ì Ì Ì Ì Ì Ìú Ìó Ìì Ìå ÌÞ Ì× ÌÐ ÌÉ Ì Ì» Ì´ Ì­ ̦ ÌŸ ̘ Ì‘ ÌŠ ̃ Ì| Ìu Ìn Ìg Ì` ÌY ÌR ÌK ÌD Ì= Ì6 Ì/ Ì( Ì! Ì Ì Ì Ì Ìþ Ì÷ Ìð Ìé Ìâ ÌÛ ÌÔ ÌÍ ÌÆ Ì¿ ̸ ̱ ̪ Ì£ Ìœ Ì• ÌŽ ̇ Ì€ Ìy Ìr Ìk Ìd Ì] ÌV ÌO ÌH ÌA Ì: Ì3 Ì, Ì% Ì Ì Ì Ì Ì ÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüÿËõÿËîÿËçÿËàÿËÙÿËÒÿËËÿËÄÿ˽ÿ˶ÿ˯ÿ˨ÿË¡ÿËšÿË“ÿËŒÿË…ÿË~ÿËwÿËpÿËiÿËbÿË[ÿËTÿËMÿËFÿË?ÿË8ÿË1ÿË*ÿË#ÿËÿËÿËÿËÿËÿËùþËòþËëþËäþËÝþËÖþËÏþËÈþËÁþ˺þ˳þˬþË¥þËžþË—þËþˉþË‚þË{þËtþËmþËfþË_þËXþËQþËJþËCþË<þË5þË.þË'þË þËþËþË þËþËýýËöýËïýËèýËáýËÚýËÓýËÌýËÅý˾ýË·ý˰ýË©ýË¢ýË›ýË”ýËýˆýËýËxýËqýËjýËcýË\ýËUýËNýËGýË@ýË9ýË2ýË+ýË$ýËýËýËýËýËýËúüËóüËìüËåüËÞüË×üËÐüËÉüËÂüË»üË´üË­ü˦üËŸü˘üË‘üËŠü˃üË|üËuüËnüËgüË`üËYüËRüËKüËDüË=üË6üË/üË(üË!üËüËüË üËüËþûË÷ûËðûËéûËâûËÛûËÔûËÍûËÆûË¿û˸û˱û˪ûË£ûËœûË•ûËŽûˇûË€ûËyûËrûËkûËdûË]ûËVûËOûËHûËAûË:ûË3ûË,ûË%ûËûËûËûË ûËûËûúËôúËíúËæúËßúËØúËÑúËÊúËÃú˼ú˵úË®ú˧úË úË™úË’úË‹úË„úË}úËvúËoúËhúËaúËZúËSúËLúËEúË>úË7úË0úË)úË"úËúËúË úËúËÿùËøùËñùËêùËãùËÜùËÕùËÎùËÇùËÀù˹ù˲ùË«ùˤùËùË–ùËùˈùËùËzùËsùËlùËeùË^ùËWùËPùËIùËBùË;ùË4ùË-ùË&ùËùËùËùË ùËùËüøËõøËîøËçøËàøËÙøËÒøËËøËÄøË½øË¶øË¯øË¨øË¡øËšøË“øËŒøË…øË~øËwøËpøËiøËbøË[øËTøËMøËFøË?øË8øË1øË*øË#øËøËøËøËøËøËù÷Ëò÷Ëë÷Ëä÷ËÝ÷ËÖ÷ËÏ÷ËÈ÷ËÁ÷˺÷˳÷ˬ÷Ë¥÷Ëž÷Ë—÷Ë÷ˉ÷Ë‚÷Ë{÷Ët÷Ëm÷Ëf÷Ë_÷ËX÷ËQ÷ËJ÷ËC÷Ë<÷Ë5÷Ë.÷Ë'÷Ë ÷Ë÷Ë÷Ë ÷Ë÷ËýöËööËïöËèöËáöËÚöËÓöËÌöËÅö˾öË·ö˰öË©öË¢öË›öË”öËöˆöËöËxöËqöËjöËcöË\öËUöËNöËGöË@öË9öË2öË+öË$öËöËöËöËöËöËúõËóõËìõËåõËÞõË×õËÐõËÉõËÂõË»õË´õË­õ˦õËŸõ˘õË‘õËŠõ˃õË|õËuõËnõËgõË`õËYõËRõËKõËDõË=õË6õË/õË(õË!õËõËõË õËõËþôË÷ôËðôËéôËâôËÛôËÔôËÍôËÆôË¿ô˸ô˱ô˪ôË£ôËœôË•ôËŽôˇôË€ôËyôËrôËkôËdôË]ôËVôËOôËHôËAôË:ôË3ôË,ôË%ôËôËôËôË ôËôËûóËôóËíóËæóËßóËØóËÑóËÊóËÃó˼ó˵óË®ó˧óË óË™óË’óË‹óË„óË}óËvóËoóËhóËaóËZóËSóËLóËEóË>óË7óË0óË)óË"óËóËóË óËóËÿòËøòËñòËêòËãòËÜòËÕòËÎòËÇòËÀò˹ò˲òË«òˤòËòË–òËòˈòËòËzòËsòËlòËeòË^òËWòËPòËIòËBòË;òË4òË-òË&òËòËòËòË òËòËüñËõñËîñËçñËàñËÙñËÒñËËñËÄñ˽ñ˶ñ˯ñ˨ñË¡ñËšñË“ñËŒñË…ñË~ñËwñËpñËiñËbñË[ñËTñËMñËFñË?ñË8ñË1ñË*ñË#ñËñËñËñËñËñËùðËòðËëðËäðËÝðËÖðËÏðËÈðËÁð˺ð˳ðˬðË¥ðËžðË—ðËðˉðË‚ðË{ðËtðËmðËfðË_ðËXðËQðËJðËCðË<ðË5ðË.ðË'ðË ðËðËðË ðËðËýïËöïËïïËèïËáïËÚïËÓïËÌïËÅï˾ïË·ï˰ïË©ïË¢ïË›ïË”ïËïˆïËïËxïËqïËjïËcïË\ïËUïËNïËGïË@ïË9ïË2ïË+ïË$ïËïËïËïËïËïËúîËóîËìîËåîËÞîË×îËÐîËÉîËÂîË»îË´îË­î˦îËŸî˘îË‘îËŠî˃îË|îËuîËnîËgîË`îËYîËRîËKîËDîË=îË6îË/îË(îË!îËîËîË îËîËþíË÷íËðíËéíËâíËÛíËÔíËÍíËÆíË¿í˸í˱í˪íË£íËœíË•íËŽíˇíË€íËyíËríËkíËdíË]íËVíËOíËHíËAíË:íË3íË,íË%íËíËíËíË íËíËûìËôìËíìËæìËßìËØìËÑìËÊìËÃì˼ì˵ìË®ì˧ìË ìË™ìË’ìË‹ìË„ìË}ìËvìËoìËhìËaìËZìËSìËLìËEìË>ìË7ìË0ìË)ìË"ìËìËìË ìËìËÿëËøëËñëËêëËãëËÜëËÕëËÎëËÇëËÀë˹ë˲ëË«ëˤëËëË–ëËëˈëËëËzëËsëËlëËeëË^ëËWëËPëËIëËBëË;ëË4ëË-ëË&ëËëËëËëË ëËëËüêËõêËîêËçêËàêËÙêËÒêËËêËÄê˽ê˶ê˯ê˨êË¡êËšêË“êËŒêË…êË~êËwêËpêËiêËbêË[êËTêËMêËFêË?êË8êË1êË*êË#êËêËêËêËêËêËùéËòéËëéËäéËÝéËÖéËÏéËÈéËÁé˺é˳éˬéË¥éËžéË—éËéˉéË‚éË{éËtéËméËféË_éËXéËQéËJéËCéË<éË5éË.éË'éË éËéËéË éËéËýèËöèËïèËèèËáèËÚèËÓèËÌèËÅè˾èË·è˰èË©èË¢èË›èË”èËèˆèËèËxèËqèËjèËcèË\èËUèËNèËGèË@èË9èË2èË+èË$èËèËèËèËèËèËúçËóçËìçËåçËÞçË×çËÐçËÉçËÂçË»çË´çË­ç˦çËŸç˘çË‘çËŠç˃çË|çËuçËnçËgçË`çËYçËRçËKçËDçË=çË6çË/çË(çË!çËçËçË çËçËþæË÷æËðæËéæËâæËÛæËÔæËÍæËÆæË¿æË¸æË±æËªæË£æËœæË•æËŽæË‡æË€æËyæËræËkæËdæË]æËVæËOæËHæËAæË:æË3æË,æË%æËæËæËæË æËæËûåËôåËíåËæåËßåËØåËÑåËÊåËÃå˼å˵åË®å˧åË åË™åË’åË‹åË„åË}åËvåËoåËhåËaåËZåËSåËLåËEåË>åË7åË0åË)åË"åËåËåË åËåËÿäËøäËñäËêäËãäËÜäËÕäËÎäËÇäËÀä˹ä˲äË«äˤäËäË–äËäˈäËäËzäËsäËläËeäË^äËWäËPäËIäËBäË;äË4äË-äË&äËäËäËäË äËäËüãËõãËîãËçãËàãËÙãËÒãËËãËÄã˽ã˶ã˯ã˨ãË¡ãËšãË“ãËŒãË…ãË~ãËwãËpãËiãËbãË[ãËTãËMãËFãË?ãË8ãË1ãË*ãË#ãËãËãËãËãËãËùâËòâËëâËäâËÝâËÖâËÏâËÈâËÁâ˺â˳âˬâË¥âËžâË—âËâˉâË‚âË{âËtâËmâËfâË_âËXâËQâËJâËCâË<âË5âË.âË'âË âËâËâË âËâËýáËöáËïáËèáËááËÚáËÓáËÌáËÅá˾áË·á˰áË©áË¢áË›áË”áËáˆáËáËxáËqáËjáËcáË\áËUáËNáËGáË@áË9áË2áË+áË$áËáËáËáËáËáËúàËóàËìàËåàËÞàË×àËÐàËÉàËÂàË»àË´àË­à˦àËŸà˘àË‘àËŠà˃àË|àËuàËnàËgàË`àËYàËRàËKàËDàË=àË6àË/àË(àË!àËàËàË àËàËþßË÷ßËðßËéßËâßËÛßËÔßËÍßËÆßË¿ß˸ß˱ß˪ßË£ßËœßË•ßˎߡßË€ßËyßËrßËkßËdßË]ßËVßËOßËHßËAßË:ßË3ßË,ßË%ßËßËßËßË ßËßËûÞËôÞËíÞËæÞËßÞËØÞËÑÞËÊÞËÃÞ˼Þ˵ÞË®Þ˧ÞË ÞË™ÞË’ÞË‹ÞË„ÞË}ÞËvÞËoÞËhÞËaÞËZÞËSÞËLÞËEÞË>ÞË7ÞË0ÞË)ÞË"ÞËÞËÞË ÞËÞËÿÝËøÝËñÝËêÝËãÝËÜÝËÕÝËÎÝËÇÝËÀÝ˹Ý˲ÝË«ÝˤÝËÝË–ÝËÝˈÝËÝËzÝËsÝËlÝËeÝË^ÝËWÝËPÝËIÝËBÝË;ÝË4ÝË-ÝË&ÝËÝËÝËÝË ÝËÝËüÜËõÜËîÜËçÜËàÜËÙÜËÒÜËËÜËÄÜ˽Ü˶Ü˯Ü˨ÜË¡ÜËšÜË“ÜËŒÜË…ÜË~ÜËwÜËpÜËiÜËbÜË[ÜËTÜËMÜËFÜË?ÜË8ÜË1ÜË*ÜË#ÜËÜËÜËÜËÜËÜËùÛËòÛËëÛËäÛËÝÛËÖÛËÏÛËÈÛËÁÛ˺Û˳ÛˬÛË¥ÛËžÛË—ÛËÛˉÛË‚ÛË{ÛËtÛËmÛËfÛË_ÛËXÛËQÛËJÛËCÛË<ÛË5ÛË.ÛË'ÛË ÛËÛËÛË ÛËÛËýÚËöÚËïÚËèÚËáÚËÚÚËÓÚËÌÚËÅÚ˾ÚË·Ú˰ÚË©ÚË¢ÚË›ÚË”ÚËÚˆÚËÚËxÚËqÚËjÚËcÚË\ÚËUÚËNÚËGÚË@ÚË9ÚË2ÚË+ÚË$ÚËÚËÚËÚËÚËÚËúÙËóÙËìÙËåÙËÞÙË×ÙËÐÙËÉÙËÂÙË»ÙË´ÙË­Ù˦ÙËŸÙ˘ÙË‘ÙËŠÙ˃ÙË|ÙËuÙËnÙËgÙË`ÙËYÙËRÙËKÙËDÙË=ÙË6ÙË/ÙË(ÙË!ÙËÙËÙË ÙËÙËþØË÷ØËðØËéØËâØËÛØËÔØËÍØËÆØË¿ØË¸ØË±ØËªØË£ØËœØË•ØËŽØË‡ØË€ØËyØËrØËkØËdØË]ØËVØËOØËHØËAØË:ØË3ØË,ØË%ØËØËØËØË ØËØËû×Ëô×Ëí×Ëæ×Ëß×ËØ×ËÑ×ËÊ×ËÃ×˼×˵×Ë®×˧×Ë ×Ë™×Ë’×Ë‹×Ë„×Ë}×Ëv×Ëo×Ëh×Ëa×ËZ×ËS×ËL×ËE×Ë>×Ë7×Ë0×Ë)×Ë"×Ë×Ë×Ë ×Ë×ËÿÖËøÖËñÖËêÖËãÖËÜÖËÕÖËÎÖËÇÖËÀÖ˹Ö˲ÖË«ÖˤÖËÖË–ÖËÖˈÖËÖËzÖËsÖËlÖËeÖË^ÖËWÖËPÖËIÖËBÖË;ÖË4ÖË-ÖË&ÖËÖËÖËÖË ÖËÖËüÕËõÕËîÕËçÕËàÕËÙÕËÒÕËËÕËÄÕ˽Õ˶Õ˯Õ˨ÕË¡ÕËšÕË“ÕËŒÕË…ÕË~ÕËwÕËpÕËiÕËbÕË[ÕËTÕËMÕËFÕË?ÕË8ÕË1ÕË*ÕË#ÕËÕËÕËÕËÕËÕËùÔËòÔËëÔËäÔËÝÔËÖÔËÏÔËÈÔËÁÔ˺Ô˳ÔˬÔË¥ÔËžÔË—ÔËÔˉÔË‚ÔË{ÔËtÔËmÔËfÔË_ÔËXÔËQÔËJÔËCÔË<ÔË5ÔË.ÔË'ÔË ÔËÔËÔË ÔËÔËýÓËöÓËïÓËèÓËáÓËÚÓËÓÓËÌÓËÅÓ˾ÓË·Ó˰ÓË©ÓË¢ÓË›ÓË”ÓËÓˆÓËÓËxÓËqÓËjÓËcÓË\ÓËUÓËNÓËGÓË@ÓË9ÓË2ÓË+ÓË$ÓËÓËÓËÓËÓËÓËúÒËóÒËìÒËåÒËÞÒË×ÒËÐÒËÉÒËÂÒË»ÒË´ÒË­Ò˦ÒËŸÒ˘ÒË‘ÒËŠÒ˃ÒË|ÒËuÒËnÒËgÒË`ÒËYÒËRÒËKÒËDÒË=ÒË6ÒË/ÒË(ÒË!ÒËÒËÒË ÒËÒËþÑË÷ÑËðÑËéÑËâÑËÛÑËÔÑËÍÑËÆÑË¿Ñ˸Ñ˱Ñ˪ÑË£ÑËœÑË•ÑËŽÑˇÑË€ÑËyÑËrÑËkÑËdÑË]ÑËVÑËOÑËHÑËAÑË:ÑË3ÑË,ÑË%ÑËÑËÑËÑË ÑËÑËûÐËôÐËíÐËæÐËßÐËØÐËÑÐËÊÐËÃÐ˼Ð˵ÐË®Ð˧ÐË ÐË™ÐË’ÐË‹ÐË„ÐË}ÐËvÐËoÐËhÐËaÐËZÐËSÐËLÐËEÐË>ÐË7ÐË0ÐË)ÐË"ÐËÐËÐË ÐËÐËÿÏËøÏËñÏËêÏËãÏËÜÏËÕÏËÎÏËÇÏËÀÏ˹Ï˲ÏË«ÏˤÏËÏË–ÏËÏˈÏËÏËzÏËsÏËlÏËeÏË^ÏËWÏËPÏËIÏËBÏË;ÏË4ÏË-ÏË&ÏËÏËÏËÏË ÏËÏËüÎËõÎËîÎËçÎËàÎËÙÎËÒÎËËÎËÄÎ˽Î˶Î˯Î˨ÎË¡ÎËšÎË“ÎËŒÎË…ÎË~ÎËwÎËpÎËiÎËbÎË[ÎËTÎËMÎËFÎË?ÎË8ÎË1ÎË*ÎË#ÎËÎËÎËÎËÎËÎËùÍËòÍËëÍËäÍËÝÍËÖÍËÏÍËÈÍËÁÍ˺Í˳ÍˬÍË¥ÍËžÍË—ÍËÍˉÍË‚ÍË{ÍËtÍËmÍËfÍË_ÍËXÍËQÍËJÍËCÍË<ÍË5ÍË.ÍË'ÍË ÍËÍËÍË ÍËÍËýÌËöÌËïÌËèÌËáÌËÚÌËÓÌËÌÌËÅÌ˾ÌË·Ì˰ÌË©ÌË¢ÌË›ÌË”ÌË̈ÌËÌËxÌËqÌËjÌËcÌË\ÌËUÌËNÌËGÌË@ÌË9ÌË2ÌË+ÌË$ÌËÌËÌËÌËÌËÌËúËËóËËìËËåËËÞËË×ËËÐËËÉËËÂËË»ËË´ËË­Ë˦ËËŸË˘ËË‘ËËŠË˃ËË|ËËuËËnËËgËË`ËËYËËRËËKËËDËË=ËË6ËË/ËË(ËË!ËËËËËË ËËËËþÊË÷ÊËðÊËéÊËâÊËÛÊËÔÊËÍÊËÆÊË¿Ê˸Ê˱Ê˪ÊË£ÊËœÊË•ÊËŽÊˇÊË€ÊËyÊËrÊËkÊËdÊË]ÊËVÊËOÊËHÊËAÊË:ÊË3ÊË,ÊË%ÊËÊËÊËÊË ÊËÊËûÉËôÉËíÉËæÉËßÉËØÉËÑÉËÊÉËÃÉ˼É˵ÉË®É˧ÉË ÉË™ÉË’ÉË‹ÉË„ÉË}ÉËvÉËoÉËhÉËaÉËZÉËSÉËLÉËEÉË>ÉË7ÉË0ÉË)ÉË"ÉËÉËÉË ÉËÉËÿÈËøÈËñÈËêÈËãÈËÜÈËÕÈËÎÈËÇÈËÀÈ˹È˲ÈË«ÈˤÈËÈË–ÈËÈˈÈËÈËzÈËsÈËlÈËeÈË^ÈËWÈËPÈËIÈËBÈË;ÈË4ÈË-ÈË&ÈËÈËÈËÈË ÈËÈËüÇËõÇËîÇËçÇËàÇËÙÇËÒÇËËÇËÄÇ˽Ç˶Ç˯Ç˨ÇË¡ÇËšÇË“ÇËŒÇË…ÇË~ÇËwÇËpÇËiÇËbÇË[ÇËTÇËMÇËFÇË?ÇË8ÇË1ÇË*ÇË#ÇËÇËÇËÇËÇËÇËùÆËòÆËëÆËäÆËÝÆËÖÆËÏÆËÈÆËÁÆËºÆË³ÆË¬ÆË¥ÆËžÆË—ÆËÆË‰ÆË‚ÆË{ÆËtÆËmÆËfÆË_ÆËXÆËQÆËJÆËCÆË<ÆË5ÆË.ÆË'ÆË ÆËÆËÆË ÆËÆËýÅËöÅËïÅËèÅËáÅËÚÅËÓÅËÌÅËÅÅ˾ÅË·Å˰ÅË©ÅË¢ÅË›ÅË”ÅËňÅËÅËxÅËqÅËjÅËcÅË\ÅËUÅËNÅËGÅË@ÅË9ÅË2ÅË+ÅË$ÅËÅËÅËÅËÅËÅËúÄËóÄËìÄËåÄËÞÄË×ÄËÐÄËÉÄËÂÄË»ÄË´ÄË­Ä˦ÄËŸÄ˘ÄË‘ÄËŠÄ˃ÄË|ÄËuÄËnÄËgÄË`ÄËYÄËRÄËKÄËDÄË=ÄË6ÄË/ÄË(ÄË!ÄËÄËÄË ÄËÄËþÃË÷ÃËðÃËéÃËâÃËÛÃËÔÃËÍÃËÆÃË¿Ã˸Ã˱Ã˪ÃË£ÃËœÃË•ÃËŽÃˇÃË€ÃËyÃËrÃËkÃËdÃË]ÃËVÃËOÃËHÃËAÃË:ÃË3ÃË,ÃË%ÃËÃËÃËÃË ÃËÃËûÂËôÂËíÂËæÂËßÂËØÂËÑÂËÊÂËÃÂ˼Â˵ÂË®Â˧ÂË ÂË™ÂË’ÂË‹ÂË„ÂË}ÂËvÂËoÂËhÂËaÂËZÂËSÂËLÂËEÂË>ÂË7ÂË0ÂË)ÂË"ÂËÂËÂË ÂËÂËÿÁËøÁËñÁËêÁËãÁËÜÁËÕÁËÎÁËÇÁËÀÁ˹Á˲ÁË«ÁˤÁËÁË–ÁËÁˈÁËÁËzÁËsÁËlÁËeÁË^ÁËWÁËPÁËIÁËBÁË;ÁË4ÁË-ÁË&ÁËÁËÁËÁË ÁËÁËüÀËõÀËîÀËçÀËàÀËÙÀËÒÀËËÀËÄÀ˽À˶À˯À˨ÀË¡ÀËšÀË“ÀËŒÀË…ÀË~ÀËwÀËpÀËiÀËbÀË[ÀËTÀËMÀËFÀË?ÀË8ÀË1ÀË*ÀË#ÀËÀËÀËÀËÀËÀËù¿Ëò¿Ëë¿Ëä¿ËÝ¿ËÖ¿ËÏ¿ËÈ¿ËÁ¿Ëº¿Ë³¿Ë¬¿Ë¥¿Ëž¿Ë—¿Ë¿Ë‰¿Ë‚¿Ë{¿Ët¿Ëm¿Ëf¿Ë_¿ËX¿ËQ¿ËJ¿ËC¿Ë<¿Ë5¿Ë.¿Ë'¿Ë ¿Ë¿Ë¿Ë ¿Ë¿Ëý¾Ëö¾Ëï¾Ëè¾Ëá¾ËÚ¾ËÓ¾Ë̾˞˾¾Ë·¾Ë°¾Ë©¾Ë¢¾Ë›¾Ë”¾Ë¾Ë†¾Ë¾Ëx¾Ëq¾Ëj¾Ëc¾Ë\¾ËU¾ËN¾ËG¾Ë@¾Ë9¾Ë2¾Ë+¾Ë$¾Ë¾Ë¾Ë¾Ë¾Ë¾Ëú½Ëó½Ëì½Ëå½ËÞ½Ë×½ËнËɽ˽˻½Ë´½Ë­½Ë¦½ËŸ½Ë˜½Ë‘½Ëн˃½Ë|½Ëu½Ën½Ëg½Ë`½ËY½ËR½ËK½ËD½Ë=½Ë6½Ë/½Ë(½Ë!½Ë½Ë½Ë ½Ë½Ëþ¼Ë÷¼Ëð¼Ëé¼Ëâ¼ËÛ¼ËÔ¼ËͼËƼË¿¼Ë¸¼Ë±¼Ëª¼Ë£¼Ëœ¼Ë•¼Ë޼ˇ¼Ë€¼Ëy¼Ër¼Ëk¼Ëd¼Ë]¼ËV¼ËO¼ËH¼ËA¼Ë:¼Ë3¼Ë,¼Ë%¼Ë¼Ë¼Ë¼Ë ¼Ë¼Ëû»Ëô»Ëí»Ëæ»Ëß»ËØ»ËÑ»ËÊ»Ëû˼»Ëµ»Ë®»Ë§»Ë »Ë™»Ë’»Ë‹»Ë„»Ë}»Ëv»Ëo»Ëh»Ëa»ËZ»ËS»ËL»ËE»Ë>»Ë7»Ë0»Ë)»Ë"»Ë»Ë»Ë »Ë»ËÿºËøºËñºËêºËãºËܺËÕºËκËǺËÀºË¹ºË²ºË«ºË¤ºËºË–ºËºËˆºËºËzºËsºËlºËeºË^ºËWºËPºËIºËBºË;ºË4ºË-ºË&ºËºËºËºË ºËºËü¹Ëõ¹Ëî¹Ëç¹Ëà¹ËÙ¹ËÒ¹Ë˹ËĹ˽¹Ë¶¹Ë¯¹Ë¨¹Ë¡¹Ëš¹Ë“¹ËŒ¹Ë…¹Ë~¹Ëw¹Ëp¹Ëi¹Ëb¹Ë[¹ËT¹ËM¹ËF¹Ë?¹Ë8¹Ë1¹Ë*¹Ë#¹Ë¹Ë¹Ë¹Ë¹Ë¹Ëù¸Ëò¸Ëë¸Ëä¸ËݸËÖ¸ËϸËȸËÁ¸Ëº¸Ë³¸Ë¬¸Ë¥¸Ëž¸Ë—¸Ë¸Ë‰¸Ë‚¸Ë{¸Ët¸Ëm¸Ëf¸Ë_¸ËX¸ËQ¸ËJ¸ËC¸Ë<¸Ë5¸Ë.¸Ë'¸Ë ¸Ë¸Ë¸Ë ¸Ë¸Ëý·Ëö·Ëï·Ëè·Ëá·ËÚ·ËÓ·ËÌ·Ëŷ˾·Ë··Ë°·Ë©·Ë¢·Ë›·Ë”·Ë·Ë†·Ë·Ëx·Ëq·Ëj·Ëc·Ë\·ËU·ËN·ËG·Ë@·Ë9·Ë2·Ë+·Ë$·Ë·Ë·Ë·Ë·Ë·Ëú¶Ëó¶Ëì¶Ëå¶ËÞ¶Ë×¶ËжËɶ˶˻¶Ë´¶Ë­¶Ë¦¶ËŸ¶Ë˜¶Ë‘¶Ëж˃¶Ë|¶Ëu¶Ën¶Ëg¶Ë`¶ËY¶ËR¶ËK¶ËD¶Ë=¶Ë6¶Ë/¶Ë(¶Ë!¶Ë¶Ë¶Ë ¶Ë¶ËþµË÷µËðµËéµËâµËÛµËÔµË͵ËƵË¿µË¸µË±µËªµË£µËœµË•µË޵ˇµË€µËyµËrµËkµËdµË]µËVµËOµËHµËAµË:µË3µË,µË%µËµËµËµË µËµËû´Ëô´Ëí´Ëæ´Ëß´ËØ´ËÑ´ËÊ´Ëô˼´Ëµ´Ë®´Ë§´Ë ´Ë™´Ë’´Ë‹´Ë„´Ë}´Ëv´Ëo´Ëh´Ëa´ËZ´ËS´ËL´ËE´Ë>´Ë7´Ë0´Ë)´Ë"´Ë´Ë´Ë ´Ë´Ëÿ³Ëø³Ëñ³Ëê³Ëã³ËܳËÕ³ËγËdzËÀ³Ë¹³Ë²³Ë«³Ë¤³Ë³Ë–³Ë³Ëˆ³Ë³Ëz³Ës³Ël³Ëe³Ë^³ËW³ËP³ËI³ËB³Ë;³Ë4³Ë-³Ë&³Ë³Ë³Ë³Ë ³Ë³Ëü²Ëõ²Ëî²Ëç²Ëà²ËÙ²ËÒ²Ë˲ËIJ˽²Ë¶²Ë¯²Ë¨²Ë¡²Ëš²Ë“²ËŒ²Ë…²Ë~²Ëw²Ëp²Ëi²Ëb²Ë[²ËT²ËM²ËF²Ë?²Ë8²Ë1²Ë*²Ë#²Ë²Ë²Ë²Ë²Ë²Ëù±Ëò±Ëë±Ëä±ËݱËÖ±ËϱËȱËÁ±Ëº±Ë³±Ë¬±Ë¥±Ëž±Ë—±Ë±Ë‰±Ë‚±Ë{±Ët±Ëm±Ëf±Ë_±ËX±ËQ±ËJ±ËC±Ë<±Ë5±Ë.±Ë'±Ë ±Ë±Ë±Ë ±Ë±Ëý°Ëö°Ëï°Ëè°Ëá°ËÚ°ËÓ°Ḛ̈ËŰ˾°Ë·°Ë°°Ë©°Ë¢°Ë›°Ë”°Ë°Ë†°Ë°Ëx°Ëq°Ëj°Ëc°Ë\°ËU°ËN°ËG°Ë@°Ë9°Ë2°Ë+°Ë$°Ë°Ë°Ë°Ë°Ë°Ëú¯Ëó¯Ëì¯Ëå¯ËÞ¯ËׯËЯËɯ˯˻¯Ë´¯Ë­¯Ë¦¯ËŸ¯Ë˜¯Ë‘¯ËН˃¯Ë|¯Ëu¯Ën¯Ëg¯Ë`¯ËY¯ËR¯ËK¯ËD¯Ë=¯Ë6¯Ë/¯Ë(¯Ë!¯Ë¯Ë¯Ë ¯Ë¯Ëþ®Ë÷®Ëð®Ëé®Ëâ®ËÛ®ËÔ®ËÍ®ËÆ®Ë¿®Ë¸®Ë±®Ëª®Ë£®Ëœ®Ë•®ËŽ®Ë‡®Ë€®Ëy®Ër®Ëk®Ëd®Ë]®ËV®ËO®ËH®ËA®Ë:®Ë3®Ë,®Ë%®Ë®Ë®Ë®Ë ®Ë®Ëû­Ëô­Ëí­Ëæ­Ëß­ËØ­ËÑ­ËÊ­Ëí˼­Ëµ­Ë®­Ë§­Ë ­Ë™­Ë’­Ë‹­Ë„­Ë}­Ëv­Ëo­Ëh­Ëa­ËZ­ËS­ËL­ËE­Ë>­Ë7­Ë0­Ë)­Ë"­Ë­Ë­Ë ­Ë­Ëÿ¬Ëø¬Ëñ¬Ëê¬Ëã¬ËܬËÕ¬ËάËǬËÀ¬Ë¹¬Ë²¬Ë«¬Ë¤¬Ë¬Ë–¬Ë¬Ëˆ¬Ë¬Ëz¬Ës¬Ël¬Ëe¬Ë^¬ËW¬ËP¬ËI¬ËB¬Ë;¬Ë4¬Ë-¬Ë&¬Ë¬Ë¬Ë¬Ë ¬Ë¬Ëü«Ëõ«Ëî«Ëç«Ëà«ËÙ«ËÒ«ËË«Ëī˽«Ë¶«Ë¯«Ë¨«Ë¡«Ëš«Ë“«ËŒ«Ë…«Ë~«Ëw«Ëp«Ëi«Ëb«Ë[«ËT«ËM«ËF«Ë?«Ë8«Ë1«Ë*«Ë#«Ë«Ë«Ë«Ë«Ë«ËùªËòªËëªËäªËݪËÖªËϪËȪËÁªËºªË³ªË¬ªË¥ªËžªË—ªËªË‰ªË‚ªË{ªËtªËmªËfªË_ªËXªËQªËJªËCªË<ªË5ªË.ªË'ªË ªËªËªË ªËªËý©Ëö©Ëï©Ëè©Ëá©ËÚ©ËÓ©ËÌ©Ëũ˾©Ë·©Ë°©Ë©©Ë¢©Ë›©Ë”©Ë©Ë†©Ë©Ëx©Ëq©Ëj©Ëc©Ë\©ËU©ËN©ËG©Ë@©Ë9©Ë2©Ë+©Ë$©Ë©Ë©Ë©Ë©Ë©Ëú¨Ëó¨Ëì¨Ëå¨ËÞ¨ËרËШËɨ˨˻¨Ë´¨Ë­¨Ë¦¨ËŸ¨Ë˜¨Ë‘¨ËЍ˃¨Ë|¨Ëu¨Ën¨Ëg¨Ë`¨ËY¨ËR¨ËK¨ËD¨Ë=¨Ë6¨Ë/¨Ë(¨Ë!¨Ë¨Ë¨Ë ¨Ë¨Ëþ§Ë÷§Ëð§Ëé§Ëâ§ËÛ§ËÔ§ËͧËƧË¿§Ë¸§Ë±§Ëª§Ë£§Ëœ§Ë•§Ëާˇ§Ë€§Ëy§Ër§Ëk§Ëd§Ë]§ËV§ËO§ËH§ËA§Ë:§Ë3§Ë,§Ë%§Ë§Ë§Ë§Ë §Ë§Ëû¦Ëô¦Ëí¦Ëæ¦ËߦËئËѦËʦËæË¼¦Ëµ¦Ë®¦Ë§¦Ë ¦Ë™¦Ë’¦Ë‹¦Ë„¦Ë}¦Ëv¦Ëo¦Ëh¦Ëa¦ËZ¦ËS¦ËL¦ËE¦Ë>¦Ë7¦Ë0¦Ë)¦Ë"¦Ë¦Ë¦Ë ¦Ë¦Ëÿ¥Ëø¥Ëñ¥Ëê¥Ëã¥ËÜ¥ËÕ¥ËÎ¥ËÇ¥ËÀ¥Ë¹¥Ë²¥Ë«¥Ë¤¥Ë¥Ë–¥Ë¥Ëˆ¥Ë¥Ëz¥Ës¥Ël¥Ëe¥Ë^¥ËW¥ËP¥ËI¥ËB¥Ë;¥Ë4¥Ë-¥Ë&¥Ë¥Ë¥Ë¥Ë ¥Ë¥Ëü¤Ëõ¤Ëî¤Ëç¤Ëà¤ËÙ¤ËÒ¤ËˤËĤ˽¤Ë¶¤Ë¯¤Ë¨¤Ë¡¤Ëš¤Ë“¤ËŒ¤Ë…¤Ë~¤Ëw¤Ëp¤Ëi¤Ëb¤Ë[¤ËT¤ËM¤ËF¤Ë?¤Ë8¤Ë1¤Ë*¤Ë#¤Ë¤Ë¤Ë¤Ë¤Ë¤Ëù£Ëò£Ëë£Ëä£ËÝ£ËÖ£ËÏ£ËÈ£ËÁ£Ëº£Ë³£Ë¬£Ë¥£Ëž£Ë—£Ë£Ë‰£Ë‚£Ë{£Ët£Ëm£Ëf£Ë_£ËX£ËQ£ËJ£ËC£Ë<£Ë5£Ë.£Ë'£Ë £Ë£Ë£Ë £Ë£Ëý¢Ëö¢Ëï¢Ëè¢Ëá¢ËÚ¢ËÓ¢ËÌ¢ËŢ˾¢Ë·¢Ë°¢Ë©¢Ë¢¢Ë›¢Ë”¢Ë¢Ë†¢Ë¢Ëx¢Ëq¢Ëj¢Ëc¢Ë\¢ËU¢ËN¢ËG¢Ë@¢Ë9¢Ë2¢Ë+¢Ë$¢Ë¢Ë¢Ë¢Ë¢Ë¢Ëú¡Ëó¡Ëì¡Ëå¡ËÞ¡ËסËСËɡˡ˻¡Ë´¡Ë­¡Ë¦¡ËŸ¡Ë˜¡Ë‘¡ËŠ¡Ëƒ¡Ë|¡Ëu¡Ën¡Ëg¡Ë`¡ËY¡ËR¡ËK¡ËD¡Ë=¡Ë6¡Ë/¡Ë(¡Ë!¡Ë¡Ë¡Ë ¡Ë¡Ëþ Ë÷ Ëð Ëé Ëâ ËÛ ËÔ ËÍ ËÆ Ë¿ Ë¸ Ë± Ëª Ë£ Ëœ Ë• ËŽ Ë‡ Ë€ Ëy Ër Ëk Ëd Ë] ËV ËO ËH ËA Ë: Ë3 Ë, Ë% Ë Ë Ë Ë  Ë ËûŸËôŸËíŸËæŸËߟËØŸËÑŸËÊŸËß˼ŸËµŸË®ŸË§ŸË ŸË™ŸË’ŸË‹ŸË„ŸË}ŸËvŸËoŸËhŸËaŸËZŸËSŸËLŸËEŸË>ŸË7ŸË0ŸË)ŸË"ŸËŸËŸË ŸËŸËÿžËøžËñžËêžËãžËÜžËÕžËΞËÇžËÀžË¹žË²žË«žË¤žËžË–žËžËˆžËžËzžËsžËlžËežË^žËWžËPžËIžËBžË;žË4žË-žË&žËžËžËžË žËžËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùœËòœËëœËäœËÝœËÖœËÏœËÈœËÁœËºœË³œË¬œË¥œËžœË—œËœË‰œË‚œË{œËtœËmœËfœË_œËXœËQœËJœËCœË<œË5œË.œË'œË œËœËœË œËœËý›Ëö›Ëï›Ëè›Ëá›ËÚ›ËÓ›ËÌ›Ëś˾›Ë·›Ë°›Ë©›Ë¢›Ë››Ë”›Ë›Ë†›Ë›Ëx›Ëq›Ëj›Ëc›Ë\›ËU›ËN›ËG›Ë@›Ë9›Ë2›Ë+›Ë$›Ë›Ë›Ë›Ë›Ë›ËúšËóšËìšËåšËÞšËךËКËɚ˚˻šË´šË­šË¦šËŸšË˜šË‘šËŠšËƒšË|šËušËnšËgšË`šËYšËRšËKšËDšË=šË6šË/šË(šË!šËšËšË šËšËþ™Ë÷™Ëð™Ëé™Ëâ™ËÛ™ËÔ™ËÍ™ËÆ™Ë¿™Ë¸™Ë±™Ëª™Ë£™Ëœ™Ë•™ËŽ™Ë‡™Ë€™Ëy™Ër™Ëk™Ëd™Ë]™ËV™ËO™ËH™ËA™Ë:™Ë3™Ë,™Ë%™Ë™Ë™Ë™Ë ™Ë™Ëû˜Ëô˜Ëí˜Ëæ˜ËߘËؘËјËʘËØË¼˜Ëµ˜Ë®˜Ë§˜Ë ˜Ë™˜Ë’˜Ë‹˜Ë„˜Ë}˜Ëv˜Ëo˜Ëh˜Ëa˜ËZ˜ËS˜ËL˜ËE˜Ë>˜Ë7˜Ë0˜Ë)˜Ë"˜Ë˜Ë˜Ë ˜Ë˜Ëÿ—Ëø—Ëñ—Ëê—Ëã—ËÜ—ËÕ—ËΗËÇ—ËÀ—˹—˲—Ë«—ˤ—Ë—Ë–—˗ˈ—Ë—Ëz—Ës—Ël—Ëe—Ë^—ËW—ËP—ËI—ËB—Ë;—Ë4—Ë-—Ë&—Ë—Ë—Ë—Ë —Ë—Ëü–Ëõ–Ëî–Ëç–Ëà–ËÙ–ËÒ–ËË–ËĖ˽–˶–˯–˨–Ë¡–Ëš–Ë“–ËŒ–Ë…–Ë~–Ëw–Ëp–Ëi–Ëb–Ë[–ËT–ËM–ËF–Ë?–Ë8–Ë1–Ë*–Ë#–Ë–Ë–Ë–Ë–Ë–Ëù•Ëò•Ëë•Ëä•ËÝ•ËÖ•ËÏ•ËÈ•ËÁ•˺•˳•ˬ•Ë¥•Ëž•Ë—•˕ˉ•Ë‚•Ë{•Ët•Ëm•Ëf•Ë_•ËX•ËQ•ËJ•ËC•Ë<•Ë5•Ë.•Ë'•Ë •Ë•Ë•Ë •Ë•Ëý”Ëö”Ëï”Ëè”Ëá”ËÚ”ËÓ”ËÌ”ËŔ˾”Ë·”˰”Ë©”Ë¢”Ë›”Ë””˔ˆ”Ë”Ëx”Ëq”Ëj”Ëc”Ë\”ËU”ËN”ËG”Ë@”Ë9”Ë2”Ë+”Ë$”˔˔˔˔˔Ëú“Ëó“Ëì“Ëå“ËÞ“ËדËГËɓ˓˻“Ë´“Ë­“˦“ËŸ“˘“Ë‘“ËŠ“˃“Ë|“Ëu“Ën“Ëg“Ë`“ËY“ËR“ËK“ËD“Ë=“Ë6“Ë/“Ë(“Ë!“Ë“Ë“Ë “Ë“Ëþ’Ë÷’Ëð’Ëé’Ëâ’ËÛ’ËÔ’ËÍ’ËÆ’Ë¿’˸’˱’˪’Ë£’Ëœ’Ë•’ËŽ’ˇ’Ë€’Ëy’Ër’Ëk’Ëd’Ë]’ËV’ËO’ËH’ËA’Ë:’Ë3’Ë,’Ë%’Ë’Ë’Ë’Ë ’Ë’Ëû‘Ëô‘Ëí‘Ëæ‘Ëß‘ËØ‘ËÑ‘ËÊ‘ËÑ˼‘˵‘Ë®‘˧‘Ë ‘Ë™‘Ë’‘Ë‹‘Ë„‘Ë}‘Ëv‘Ëo‘Ëh‘Ëa‘ËZ‘ËS‘ËL‘ËE‘Ë>‘Ë7‘Ë0‘Ë)‘Ë"‘Ë‘Ë‘Ë ‘Ë‘ËÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùŽËòŽËëŽËäŽËÝŽËÖŽËÏŽËÈŽËÁŽËºŽË³ŽË¬ŽË¥ŽËžŽË—ŽËŽË‰ŽË‚ŽË{ŽËtŽËmŽËfŽË_ŽËXŽËQŽËJŽËCŽË<ŽË5ŽË.ŽË'ŽË ŽËŽËŽË ŽËŽËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúŒËóŒËìŒËåŒËÞŒË׌ËÐŒËɌˌ˻ŒË´ŒË­ŒË¦ŒËŸŒË˜ŒË‘ŒËŠŒËƒŒË|ŒËuŒËnŒËgŒË`ŒËYŒËRŒËKŒËDŒË=ŒË6ŒË/ŒË(ŒË!ŒËŒËŒË ŒËŒËþ‹Ë÷‹Ëð‹Ëé‹Ëâ‹ËÛ‹ËÔ‹ËÍ‹ËÆ‹Ë¿‹Ë¸‹Ë±‹Ëª‹Ë£‹Ëœ‹Ë•‹ËŽ‹Ë‡‹Ë€‹Ëy‹Ër‹Ëk‹Ëd‹Ë]‹ËV‹ËO‹ËH‹ËA‹Ë:‹Ë3‹Ë,‹Ë%‹Ë‹Ë‹Ë‹Ë ‹Ë‹ËûŠËôŠËíŠËæŠËߊËØŠËÑŠËÊŠËÊ˼ŠËµŠË®ŠË§ŠË ŠË™ŠË’ŠË‹ŠË„ŠË}ŠËvŠËoŠËhŠËaŠËZŠËSŠËLŠËEŠË>ŠË7ŠË0ŠË)ŠË"ŠËŠËŠË ŠËŠËÿ‰Ëø‰Ëñ‰Ëê‰Ëã‰Ë܉ËÕ‰ËΉËljËÀ‰Ë¹‰Ë²‰Ë«‰Ë¤‰Ë‰Ë–‰Ë‰Ëˆ‰Ë‰Ëz‰Ës‰Ël‰Ëe‰Ë^‰ËW‰ËP‰ËI‰ËB‰Ë;‰Ë4‰Ë-‰Ë&‰Ë‰Ë‰Ë‰Ë ‰Ë‰ËüˆËõˆËîˆËçˆËàˆËÙˆËÒˆËˈËĈ˽ˆË¶ˆË¯ˆË¨ˆË¡ˆËšˆË“ˆËŒˆË…ˆË~ˆËwˆËpˆËiˆËbˆË[ˆËTˆËMˆËFˆË?ˆË8ˆË1ˆË*ˆË#ˆËˆËˆËˆËˆËˆËù‡Ëò‡Ëë‡Ëä‡Ë݇ËÖ‡ËχËȇËÁ‡Ëº‡Ë³‡Ë¬‡Ë¥‡Ëž‡Ë—‡Ë‡Ë‰‡Ë‚‡Ë{‡Ët‡Ëm‡Ëf‡Ë_‡ËX‡ËQ‡ËJ‡ËC‡Ë<‡Ë5‡Ë.‡Ë'‡Ë ‡Ë‡Ë‡Ë ‡Ë‡Ëý†Ëö†Ëï†Ëè†Ëá†ËÚ†ËÓ†Ë̆Ëņ˾†Ë·†Ë°†Ë©†Ë¢†Ë›†Ë”†Ë†Ë††Ë†Ëx†Ëq†Ëj†Ëc†Ë\†ËU†ËN†ËG†Ë@†Ë9†Ë2†Ë+†Ë$†Ë†Ë†Ë†Ë†Ë†Ëú…Ëó…Ëì…Ëå…ËÞ…Ë×…ËÐ…ËÉ…ËÂ…Ë»…Ë´…Ë­…˦…ËŸ…˘…Ë‘…ËŠ…˃…Ë|…Ëu…Ën…Ëg…Ë`…ËY…ËR…ËK…ËD…Ë=…Ë6…Ë/…Ë(…Ë!…Ë…Ë…Ë …Ë…Ëþ„Ë÷„Ëð„Ëé„Ëâ„ËÛ„ËÔ„ËÍ„ËÆ„Ë¿„˸„˱„˪„Ë£„Ëœ„Ë•„ËŽ„ˇ„Ë€„Ëy„Ër„Ëk„Ëd„Ë]„ËV„ËO„ËH„ËA„Ë:„Ë3„Ë,„Ë%„Ë„Ë„Ë„Ë „Ë„ËûƒËôƒËíƒËæƒË߃Ë؃ËуËʃËÃ˼ƒËµƒË®ƒË§ƒË ƒË™ƒË’ƒË‹ƒË„ƒË}ƒËvƒËoƒËhƒËaƒËZƒËSƒËLƒËEƒË>ƒË7ƒË0ƒË)ƒË"ƒËƒËƒË ƒËƒËÿ‚Ëø‚Ëñ‚Ëê‚Ëã‚ËÜ‚ËÕ‚Ë΂ËÇ‚ËÀ‚˹‚˲‚Ë«‚ˤ‚˂˖‚˂ˈ‚Ë‚Ëz‚Ës‚Ël‚Ëe‚Ë^‚ËW‚ËP‚ËI‚ËB‚Ë;‚Ë4‚Ë-‚Ë&‚Ë‚Ë‚Ë‚Ë ‚Ë‚ËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËù€Ëò€Ëë€Ëä€ËÝ€ËÖ€ËÏ€ËÈ€ËÁ€Ëº€Ë³€Ë¬€Ë¥€Ëž€Ë—€Ë€Ë‰€Ë‚€Ë{€Ët€Ëm€Ëf€Ë_€ËX€ËQ€ËJ€ËC€Ë<€Ë5€Ë.€Ë'€Ë €Ë€Ë€Ë €Ë€ËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËú~Ëó~Ëì~Ëå~ËÞ~Ë×~ËÐ~ËÉ~ËÂ~Ë»~Ë´~Ë­~˦~ËŸ~˘~Ë‘~ËŠ~˃~Ë|~Ëu~Ën~Ëg~Ë`~ËY~ËR~ËK~ËD~Ë=~Ë6~Ë/~Ë(~Ë!~Ë~Ë~Ë ~Ë~Ëþ}Ë÷}Ëð}Ëé}Ëâ}ËÛ}ËÔ}ËÍ}ËÆ}Ë¿}˸}˱}˪}Ë£}Ëœ}Ë•}ËŽ}ˇ}Ë€}Ëy}Ër}Ëk}Ëd}Ë]}ËV}ËO}ËH}ËA}Ë:}Ë3}Ë,}Ë%}Ë}Ë}Ë}Ë }Ë}Ëû|Ëô|Ëí|Ëæ|Ëß|ËØ|ËÑ|ËÊ|ËÃ|˼|˵|Ë®|˧|Ë |Ë™|Ë’|Ë‹|Ë„|Ë}|Ëv|Ëo|Ëh|Ëa|ËZ|ËS|ËL|ËE|Ë>|Ë7|Ë0|Ë)|Ë"|Ë|Ë|Ë |Ë|Ëÿ{Ëø{Ëñ{Ëê{Ëã{ËÜ{ËÕ{ËÎ{ËÇ{ËÀ{˹{˲{Ë«{ˤ{Ë{Ë–{Ë{ˈ{Ë{Ëz{Ës{Ël{Ëe{Ë^{ËW{ËP{ËI{ËB{Ë;{Ë4{Ë-{Ë&{Ë{Ë{Ë{Ë {Ë{ËüzËõzËîzËçzËàzËÙzËÒzËËzËÄz˽z˶z˯z˨zË¡zËšzË“zËŒzË…zË~zËwzËpzËizËbzË[zËTzËMzËFzË?zË8zË1zË*zË#zËzËzËzËzËzËùyËòyËëyËäyËÝyËÖyËÏyËÈyËÁy˺y˳yˬyË¥yËžyË—yËyˉyË‚yË{yËtyËmyËfyË_yËXyËQyËJyËCyËuË7uË0uË)uË"uËuËuË uËuËÿtËøtËñtËêtËãtËÜtËÕtËÎtËÇtËÀt˹t˲tË«tˤtËtË–tËtˈtËtËztËstËltËetË^tËWtËPtËItËBtË;tË4tË-tË&tËtËtËtË tËtËüsËõsËîsËçsËàsËÙsËÒsËËsËÄs˽s˶s˯s˨sË¡sËšsË“sËŒsË…sË~sËwsËpsËisËbsË[sËTsËMsËFsË?sË8sË1sË*sË#sËsËsËsËsËsËùrËòrËërËärËÝrËÖrËÏrËÈrËÁr˺r˳rˬrË¥rËžrË—rËrˉrË‚rË{rËtrËmrËfrË_rËXrËQrËJrËCrËnË7nË0nË)nË"nËnËnË nËnËÿmËømËñmËêmËãmËÜmËÕmËÎmËÇmËÀm˹m˲mË«mˤmËmË–mËmˈmËmËzmËsmËlmËemË^mËWmËPmËImËBmË;mË4mË-mË&mËmËmËmË mËmËülËõlËîlËçlËàlËÙlËÒlËËlËÄl˽l˶l˯l˨lË¡lËšlË“lËŒlË…lË~lËwlËplËilËblË[lËTlËMlËFlË?lË8lË1lË*lË#lËlËlËlËlËlËùkËòkËëkËäkËÝkËÖkËÏkËÈkËÁk˺k˳kˬkË¥kËžkË—kËkˉkË‚kË{kËtkËmkËfkË_kËXkËQkËJkËCkËgË7gË0gË)gË"gËgËgË gËgËÿfËøfËñfËêfËãfËÜfËÕfËÎfËÇfËÀf˹f˲fË«fˤfËfË–fËfˈfËfËzfËsfËlfËefË^fËWfËPfËIfËBfË;fË4fË-fË&fËfËfËfË fËfËüeËõeËîeËçeËàeËÙeËÒeËËeËÄe˽e˶e˯e˨eË¡eËšeË“eËŒeË…eË~eËweËpeËieËbeË[eËTeËMeËFeË?eË8eË1eË*eË#eËeËeËeËeËeËùdËòdËëdËädËÝdËÖdËÏdËÈdËÁd˺d˳dˬdË¥dËždË—dËdˉdË‚dË{dËtdËmdËfdË_dËXdËQdËJdËCdË`Ë7`Ë0`Ë)`Ë"`Ë`Ë`Ë `Ë`Ëÿ_Ëø_Ëñ_Ëê_Ëã_ËÜ_ËÕ_ËÎ_ËÇ_ËÀ_˹_˲_Ë«_ˤ_Ë_Ë–_Ë_ˈ_Ë_Ëz_Ës_Ël_Ëe_Ë^_ËW_ËP_ËI_ËB_Ë;_Ë4_Ë-_Ë&_Ë_Ë_Ë_Ë _Ë_Ëü^Ëõ^Ëî^Ëç^Ëà^ËÙ^ËÒ^ËË^ËÄ^˽^˶^˯^˨^Ë¡^Ëš^Ë“^ËŒ^Ë…^Ë~^Ëw^Ëp^Ëi^Ëb^Ë[^ËT^ËM^ËF^Ë?^Ë8^Ë1^Ë*^Ë#^Ë^Ë^Ë^Ë^Ë^Ëù]Ëò]Ëë]Ëä]ËÝ]ËÖ]ËÏ]ËÈ]ËÁ]˺]˳]ˬ]Ë¥]Ëž]Ë—]Ë]ˉ]Ë‚]Ë{]Ët]Ëm]Ëf]Ë_]ËX]ËQ]ËJ]ËC]Ë<]Ë5]Ë.]Ë']Ë ]Ë]Ë]Ë ]Ë]Ëý\Ëö\Ëï\Ëè\Ëá\ËÚ\ËÓ\ËÌ\ËÅ\˾\Ë·\˰\Ë©\Ë¢\Ë›\Ë”\Ë\ˆ\Ë\Ëx\Ëq\Ëj\Ëc\Ë\\ËU\ËN\ËG\Ë@\Ë9\Ë2\Ë+\Ë$\Ë\Ë\Ë\Ë\Ë\Ëú[Ëó[Ëì[Ëå[ËÞ[Ë×[ËÐ[ËÉ[ËÂ[Ë»[Ë´[Ë­[˦[ËŸ[˘[Ë‘[ËŠ[˃[Ë|[Ëu[Ën[Ëg[Ë`[ËY[ËR[ËK[ËD[Ë=[Ë6[Ë/[Ë([Ë![Ë[Ë[Ë [Ë[ËþZË÷ZËðZËéZËâZËÛZËÔZËÍZËÆZË¿Z˸Z˱Z˪ZË£ZËœZË•ZËŽZˇZË€ZËyZËrZËkZËdZË]ZËVZËOZËHZËAZË:ZË3ZË,ZË%ZËZËZËZË ZËZËûYËôYËíYËæYËßYËØYËÑYËÊYËÃY˼Y˵YË®Y˧YË YË™YË’YË‹YË„YË}YËvYËoYËhYËaYËZYËSYËLYËEYË>YË7YË0YË)YË"YËYËYË YËYËÿXËøXËñXËêXËãXËÜXËÕXËÎXËÇXËÀX˹X˲XË«XˤXËXË–XËXˈXËXËzXËsXËlXËeXË^XËWXËPXËIXËBXË;XË4XË-XË&XËXËXËXË XËXËüWËõWËîWËçWËàWËÙWËÒWËËWËÄW˽W˶W˯W˨WË¡WËšWË“WËŒWË…WË~WËwWËpWËiWËbWË[WËTWËMWËFWË?WË8WË1WË*WË#WËWËWËWËWËWËùVËòVËëVËäVËÝVËÖVËÏVËÈVËÁV˺V˳VˬVË¥VËžVË—VËVˉVË‚VË{VËtVËmVËfVË_VËXVËQVËJVËCVËRË7RË0RË)RË"RËRËRË RËRËÿQËøQËñQËêQËãQËÜQËÕQËÎQËÇQËÀQ˹Q˲QË«QˤQËQË–QËQˈQËQËzQËsQËlQËeQË^QËWQËPQËIQËBQË;QË4QË-QË&QËQËQËQË QËQËüPËõPËîPËçPËàPËÙPËÒPËËPËÄP˽P˶P˯P˨PË¡PËšPË“PËŒPË…PË~PËwPËpPËiPËbPË[PËTPËMPËFPË?PË8PË1PË*PË#PËPËPËPËPËPËùOËòOËëOËäOËÝOËÖOËÏOËÈOËÁO˺O˳OˬOË¥OËžOË—OËOˉOË‚OË{OËtOËmOËfOË_OËXOËQOËJOËCOËKË7KË0KË)KË"KËKËKË KËKËÿJËøJËñJËêJËãJËÜJËÕJËÎJËÇJËÀJ˹J˲JË«JˤJËJË–JËJˈJËJËzJËsJËlJËeJË^JËWJËPJËIJËBJË;JË4JË-JË&JËJËJËJË JËJËüIËõIËîIËçIËàIËÙIËÒIËËIËÄI˽I˶I˯I˨IË¡IËšIË“IËŒIË…IË~IËwIËpIËiIËbIË[IËTIËMIËFIË?IË8IË1IË*IË#IËIËIËIËIËIËùHËòHËëHËäHËÝHËÖHËÏHËÈHËÁH˺H˳HˬHË¥HËžHË—HËHˉHË‚HË{HËtHËmHËfHË_HËXHËQHËJHËCHËDË7DË0DË)DË"DËDËDË DËDËÿCËøCËñCËêCËãCËÜCËÕCËÎCËÇCËÀC˹C˲CË«CˤCËCË–CËCˈCËCËzCËsCËlCËeCË^CËWCËPCËICËBCË;CË4CË-CË&CËCËCËCË CËCËüBËõBËîBËçBËàBËÙBËÒBËËBËÄB˽B˶B˯B˨BË¡BËšBË“BËŒBË…BË~BËwBËpBËiBËbBË[BËTBËMBËFBË?BË8BË1BË*BË#BËBËBËBËBËBËùAËòAËëAËäAËÝAËÖAËÏAËÈAËÁA˺A˳AˬAË¥AËžAË—AËAˉAË‚AË{AËtAËmAËfAË_AËXAËQAËJAËCAËË÷>Ëð>Ëé>Ëâ>ËÛ>ËÔ>ËÍ>ËÆ>Ë¿>˸>˱>˪>Ë£>Ëœ>Ë•>ËŽ>ˇ>Ë€>Ëy>Ër>Ëk>Ëd>Ë]>ËV>ËO>ËH>ËA>Ë:>Ë3>Ë,>Ë%>Ë>Ë>Ë>Ë >Ë>Ëû=Ëô=Ëí=Ëæ=Ëß=ËØ=ËÑ=ËÊ=ËÃ=˼=˵=Ë®=˧=Ë =Ë™=Ë’=Ë‹=Ë„=Ë}=Ëv=Ëo=Ëh=Ëa=ËZ=ËS=ËL=ËE=Ë>=Ë7=Ë0=Ë)=Ë"=Ë=Ë=Ë =Ë=Ëÿ<Ëø<Ëñ<Ëê<Ëã<ËÜ<ËÕ<ËÎ<ËÇ<ËÀ<˹<˲<Ë«<ˤ<Ë<Ë–<Ë<ˈ<Ë<Ëz<Ës<Ël<Ëe<Ë^<ËW<ËP<ËI<ËB<Ë;<Ë4<Ë-<Ë&<Ë<Ë<Ë<Ë <Ë<Ëü;Ëõ;Ëî;Ëç;Ëà;ËÙ;ËÒ;ËË;ËÄ;˽;˶;˯;˨;Ë¡;Ëš;Ë“;ËŒ;Ë…;Ë~;Ëw;Ëp;Ëi;Ëb;Ë[;ËT;ËM;ËF;Ë?;Ë8;Ë1;Ë*;Ë#;Ë;Ë;Ë;Ë;Ë;Ëù:Ëò:Ëë:Ëä:ËÝ:ËÖ:ËÏ:ËÈ:ËÁ:˺:˳:ˬ:Ë¥:Ëž:Ë—:Ë:ˉ:Ë‚:Ë{:Ët:Ëm:Ëf:Ë_:ËX:ËQ:ËJ:ËC:Ë<:Ë5:Ë.:Ë':Ë :Ë:Ë:Ë :Ë:Ëý9Ëö9Ëï9Ëè9Ëá9ËÚ9ËÓ9ËÌ9ËÅ9˾9Ë·9˰9Ë©9Ë¢9Ë›9Ë”9Ë9ˆ9Ë9Ëx9Ëq9Ëj9Ëc9Ë\9ËU9ËN9ËG9Ë@9Ë99Ë29Ë+9Ë$9Ë9Ë9Ë9Ë9Ë9Ëú8Ëó8Ëì8Ëå8ËÞ8Ë×8ËÐ8ËÉ8ËÂ8Ë»8Ë´8Ë­8˦8ËŸ8˘8Ë‘8ËŠ8˃8Ë|8Ëu8Ën8Ëg8Ë`8ËY8ËR8ËK8ËD8Ë=8Ë68Ë/8Ë(8Ë!8Ë8Ë8Ë 8Ë8Ëþ7Ë÷7Ëð7Ëé7Ëâ7ËÛ7ËÔ7ËÍ7ËÆ7Ë¿7˸7˱7˪7Ë£7Ëœ7Ë•7ËŽ7ˇ7Ë€7Ëy7Ër7Ëk7Ëd7Ë]7ËV7ËO7ËH7ËA7Ë:7Ë37Ë,7Ë%7Ë7Ë7Ë7Ë 7Ë7Ëû6Ëô6Ëí6Ëæ6Ëß6ËØ6ËÑ6ËÊ6ËÃ6˼6˵6Ë®6˧6Ë 6Ë™6Ë’6Ë‹6Ë„6Ë}6Ëv6Ëo6Ëh6Ëa6ËZ6ËS6ËL6ËE6Ë>6Ë76Ë06Ë)6Ë"6Ë6Ë6Ë 6Ë6Ëÿ5Ëø5Ëñ5Ëê5Ëã5ËÜ5ËÕ5ËÎ5ËÇ5ËÀ5˹5˲5Ë«5ˤ5Ë5Ë–5Ë5ˈ5Ë5Ëz5Ës5Ël5Ëe5Ë^5ËW5ËP5ËI5ËB5Ë;5Ë45Ë-5Ë&5Ë5Ë5Ë5Ë 5Ë5Ëü4Ëõ4Ëî4Ëç4Ëà4ËÙ4ËÒ4ËË4ËÄ4˽4˶4˯4˨4Ë¡4Ëš4Ë“4ËŒ4Ë…4Ë~4Ëw4Ëp4Ëi4Ëb4Ë[4ËT4ËM4ËF4Ë?4Ë84Ë14Ë*4Ë#4Ë4Ë4Ë4Ë4Ë4Ëù3Ëò3Ëë3Ëä3ËÝ3ËÖ3ËÏ3ËÈ3ËÁ3˺3˳3ˬ3Ë¥3Ëž3Ë—3Ë3ˉ3Ë‚3Ë{3Ët3Ëm3Ëf3Ë_3ËX3ËQ3ËJ3ËC3Ë<3Ë53Ë.3Ë'3Ë 3Ë3Ë3Ë 3Ë3Ëý2Ëö2Ëï2Ëè2Ëá2ËÚ2ËÓ2ËÌ2ËÅ2˾2Ë·2˰2Ë©2Ë¢2Ë›2Ë”2Ë2ˆ2Ë2Ëx2Ëq2Ëj2Ëc2Ë\2ËU2ËN2ËG2Ë@2Ë92Ë22Ë+2Ë$2Ë2Ë2Ë2Ë2Ë2Ëú1Ëó1Ëì1Ëå1ËÞ1Ë×1ËÐ1ËÉ1ËÂ1Ë»1Ë´1Ë­1˦1ËŸ1˘1Ë‘1ËŠ1˃1Ë|1Ëu1Ën1Ëg1Ë`1ËY1ËR1ËK1ËD1Ë=1Ë61Ë/1Ë(1Ë!1Ë1Ë1Ë 1Ë1Ëþ0Ë÷0Ëð0Ëé0Ëâ0ËÛ0ËÔ0ËÍ0ËÆ0Ë¿0˸0˱0˪0Ë£0Ëœ0Ë•0ËŽ0ˇ0Ë€0Ëy0Ër0Ëk0Ëd0Ë]0ËV0ËO0ËH0ËA0Ë:0Ë30Ë,0Ë%0Ë0Ë0Ë0Ë 0Ë0Ëû/Ëô/Ëí/Ëæ/Ëß/ËØ/ËÑ/ËÊ/ËÃ/˼/˵/Ë®/˧/Ë /Ë™/Ë’/Ë‹/Ë„/Ë}/Ëv/Ëo/Ëh/Ëa/ËZ/ËS/ËL/ËE/Ë>/Ë7/Ë0/Ë)/Ë"/Ë/Ë/Ë /Ë/Ëÿ.Ëø.Ëñ.Ëê.Ëã.ËÜ.ËÕ.ËÎ.ËÇ.ËÀ.˹.˲.Ë«.ˤ.Ë.Ë–.Ë.ˈ.Ë.Ëz.Ës.Ël.Ëe.Ë^.ËW.ËP.ËI.ËB.Ë;.Ë4.Ë-.Ë&.Ë.Ë.Ë.Ë .Ë.Ëü-Ëõ-Ëî-Ëç-Ëà-ËÙ-ËÒ-ËË-ËÄ-˽-˶-˯-˨-Ë¡-Ëš-Ë“-ËŒ-Ë…-Ë~-Ëw-Ëp-Ëi-Ëb-Ë[-ËT-ËM-ËF-Ë?-Ë8-Ë1-Ë*-Ë#-Ë-Ë-Ë-Ë-Ë-Ëù,Ëò,Ëë,Ëä,ËÝ,ËÖ,ËÏ,ËÈ,ËÁ,˺,˳,ˬ,Ë¥,Ëž,Ë—,Ë,ˉ,Ë‚,Ë{,Ët,Ëm,Ëf,Ë_,ËX,ËQ,ËJ,ËC,Ë<,Ë5,Ë.,Ë',Ë ,Ë,Ë,Ë ,Ë,Ëý+Ëö+Ëï+Ëè+Ëá+ËÚ+ËÓ+ËÌ+ËÅ+˾+Ë·+˰+Ë©+Ë¢+Ë›+Ë”+Ë+ˆ+Ë+Ëx+Ëq+Ëj+Ëc+Ë\+ËU+ËN+ËG+Ë@+Ë9+Ë2+Ë++Ë$+Ë+Ë+Ë+Ë+Ë+Ëú*Ëó*Ëì*Ëå*ËÞ*Ë×*ËÐ*ËÉ*ËÂ*Ë»*Ë´*Ë­*˦*ËŸ*˘*Ë‘*ËŠ*˃*Ë|*Ëu*Ën*Ëg*Ë`*ËY*ËR*ËK*ËD*Ë=*Ë6*Ë/*Ë(*Ë!*Ë*Ë*Ë *Ë*Ëþ)Ë÷)Ëð)Ëé)Ëâ)ËÛ)ËÔ)ËÍ)ËÆ)Ë¿)˸)˱)˪)Ë£)Ëœ)Ë•)ËŽ)ˇ)Ë€)Ëy)Ër)Ëk)Ëd)Ë])ËV)ËO)ËH)ËA)Ë:)Ë3)Ë,)Ë%)Ë)Ë)Ë)Ë )Ë)Ëû(Ëô(Ëí(Ëæ(Ëß(ËØ(ËÑ(ËÊ(ËÃ(˼(˵(Ë®(˧(Ë (Ë™(Ë’(Ë‹(Ë„(Ë}(Ëv(Ëo(Ëh(Ëa(ËZ(ËS(ËL(ËE(Ë>(Ë7(Ë0(Ë)(Ë"(Ë(Ë(Ë (Ë(Ëÿ'Ëø'Ëñ'Ëê'Ëã'ËÜ'ËÕ'ËÎ'ËÇ'ËÀ'˹'˲'Ë«'ˤ'Ë'Ë–'Ë'ˈ'Ë'Ëz'Ës'Ël'Ëe'Ë^'ËW'ËP'ËI'ËB'Ë;'Ë4'Ë-'Ë&'Ë'Ë'Ë'Ë 'Ë'Ëü&Ëõ&Ëî&Ëç&Ëà&ËÙ&ËÒ&ËË&ËÄ&˽&˶&˯&˨&Ë¡&Ëš&Ë“&ËŒ&Ë…&Ë~&Ëw&Ëp&Ëi&Ëb&Ë[&ËT&ËM&ËF&Ë?&Ë8&Ë1&Ë*&Ë#&Ë&Ë&Ë&Ë&Ë&Ëù%Ëò%Ëë%Ëä%ËÝ%ËÖ%ËÏ%ËÈ%ËÁ%˺%˳%ˬ%Ë¥%Ëž%Ë—%Ë%ˉ%Ë‚%Ë{%Ët%Ëm%Ëf%Ë_%ËX%ËQ%ËJ%ËC%Ë<%Ë5%Ë.%Ë'%Ë %Ë%Ë%Ë %Ë%Ëý$Ëö$Ëï$Ëè$Ëá$ËÚ$ËÓ$ËÌ$ËÅ$˾$Ë·$˰$Ë©$Ë¢$Ë›$Ë”$Ë$ˆ$Ë$Ëx$Ëq$Ëj$Ëc$Ë\$ËU$ËN$ËG$Ë@$Ë9$Ë2$Ë+$Ë$$Ë$Ë$Ë$Ë$Ë$Ëú#Ëó#Ëì#Ëå#ËÞ#Ë×#ËÐ#ËÉ#ËÂ#Ë»#Ë´#Ë­#˦#ËŸ#˘#Ë‘#ËŠ#˃#Ë|#Ëu#Ën#Ëg#Ë`#ËY#ËR#ËK#ËD#Ë=#Ë6#Ë/#Ë(#Ë!#Ë#Ë#Ë #Ë#Ëþ"Ë÷"Ëð"Ëé"Ëâ"ËÛ"ËÔ"ËÍ"ËÆ"Ë¿"˸"˱"˪"Ë£"Ëœ"Ë•"ËŽ"ˇ"Ë€"Ëy"Ër"Ëk"Ëd"Ë]"ËV"ËO"ËH"ËA"Ë:"Ë3"Ë,"Ë%"Ë"Ë"Ë"Ë "Ë"Ëû!Ëô!Ëí!Ëæ!Ëß!ËØ!ËÑ!ËÊ!ËÃ!˼!˵!Ë®!˧!Ë !Ë™!Ë’!Ë‹!Ë„!Ë}!Ëv!Ëo!Ëh!Ëa!ËZ!ËS!ËL!ËE!Ë>!Ë7!Ë0!Ë)!Ë"!Ë!Ë!Ë !Ë!Ëÿ Ëø Ëñ Ëê Ëã ËÜ ËÕ ËÎ ËÇ ËÀ ˹ ˲ Ë« ˤ Ë Ë– Ë Ëˆ Ë Ëz Ës Ël Ëe Ë^ ËW ËP ËI ËB Ë; Ë4 Ë- Ë& Ë Ë Ë Ë Ë ËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþ Ë÷ Ëð Ëé Ëâ ËÛ ËÔ ËÍ ËÆ Ë¿ ˸ ˱ ˪ Ë£ Ëœ Ë• ËŽ ˇ Ë€ Ëy Ër Ëk Ëd Ë] ËV ËO ËH ËA Ë: Ë3 Ë, Ë% Ë Ë Ë Ë Ë Ëû Ëô Ëí Ëæ Ëß ËØ ËÑ ËÊ Ëà ˼ ˵ Ë® ˧ Ë  Ë™ Ë’ Ë‹ Ë„ Ë} Ëv Ëo Ëh Ëa ËZ ËS ËL ËE Ë> Ë7 Ë0 Ë) Ë" Ë Ë Ë Ë Ëÿ Ëø Ëñ Ëê Ëã ËÜ ËÕ ËÎ ËÇ ËÀ ˹ ˲ Ë« ˤ Ë Ë– Ë Ëˆ Ë Ëz Ës Ël Ëe Ë^ ËW ËP ËI ËB Ë; Ë4 Ë- Ë& Ë Ë Ë Ë Ë Ëü Ëõ Ëî Ëç Ëà ËÙ ËÒ ËË ËÄ Ë½ ˶ ˯ ˨ Ë¡ Ëš Ë“ ËŒ Ë… Ë~ Ëw Ëp Ëi Ëb Ë[ ËT ËM ËF Ë? Ë8 Ë1 Ë* Ë# Ë Ë Ë Ë Ë Ëù Ëò Ëë Ëä ËÝ ËÖ ËÏ ËÈ ËÁ ˺ ˳ ˬ Ë¥ Ëž Ë— Ë Ë‰ Ë‚ Ë{ Ët Ëm Ëf Ë_ ËX ËQ ËJ ËC Ë< Ë5 Ë. Ë' Ë Ë Ë Ë Ë ËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÿÊ÷ÿÊðÿÊéÿÊâÿÊÛÿÊÔÿÊÍÿÊÆÿÊ¿ÿʸÿʱÿʪÿÊ£ÿÊœÿÊ•ÿÊŽÿʇÿÊ€ÿÊyÿÊrÿÊkÿÊdÿÊ]ÿÊVÿÊOÿÊHÿÊAÿÊ:ÿÊ3ÿÊ,ÿÊ%ÿÊÿÊÿÊÿÊ ÿÊÿÊûþÊôþÊíþÊæþÊßþÊØþÊÑþÊÊþÊÃþʼþʵþÊ®þʧþÊ þÊ™þÊ’þÊ‹þÊ„þÊ}þÊvþÊoþÊhþÊaþÊZþÊSþÊLþÊEþÊ>þÊ7þÊ0þÊ)þÊ"þÊþÊþÊ þÊþÊÿýÊøýÊñýÊêýÊãýÊÜýÊÕýÊÎýÊÇýÊÀýʹýʲýÊ«ýʤýÊýÊ–ýÊýʈýÊýÊzýÊsýÊlýÊeýÊ^ýÊWýÊPýÊIýÊBýÊ;ýÊ4ýÊ-ýÊ&ýÊýÊýÊýÊ ýÊýÊüüÊõüÊîüÊçüÊàüÊÙüÊÒüÊËüÊÄüʽüʶüʯüʨüÊ¡üÊšüÊ“üÊŒüÊ…üÊ~üÊwüÊpüÊiüÊbüÊ[üÊTüÊMüÊFüÊ?üÊ8üÊ1üÊ*üÊ#üÊüÊüÊüÊüÊüÊùûÊòûÊëûÊäûÊÝûÊÖûÊÏûÊÈûÊÁûʺûʳûʬûÊ¥ûÊžûÊ—ûÊûʉûÊ‚ûÊ{ûÊtûÊmûÊfûÊ_ûÊXûÊQûÊJûÊCûÊ<ûÊ5ûÊ.ûÊ'ûÊ ûÊûÊûÊ ûÊûÊýúÊöúÊïúÊèúÊáúÊÚúÊÓúÊÌúÊÅúʾúÊ·úʰúÊ©úÊ¢úÊ›úÊ”úÊúʆúÊúÊxúÊqúÊjúÊcúÊ\úÊUúÊNúÊGúÊ@úÊ9úÊ2úÊ+úÊ$úÊúÊúÊúÊúÊúÊúùÊóùÊìùÊåùÊÞùÊ×ùÊÐùÊÉùÊÂùÊ»ùÊ´ùÊ­ùʦùÊŸùʘùÊ‘ùÊŠùʃùÊ|ùÊuùÊnùÊgùÊ`ùÊYùÊRùÊKùÊDùÊ=ùÊ6ùÊ/ùÊ(ùÊ!ùÊùÊùÊ ùÊùÊþøÊ÷øÊðøÊéøÊâøÊÛøÊÔøÊÍøÊÆøÊ¿øÊ¸øÊ±øÊªøÊ£øÊœøÊ•øÊŽøÊ‡øÊ€øÊyøÊrøÊkøÊdøÊ]øÊVøÊOøÊHøÊAøÊ:øÊ3øÊ,øÊ%øÊøÊøÊøÊ øÊøÊû÷Êô÷Êí÷Êæ÷Êß÷ÊØ÷ÊÑ÷ÊÊ÷ÊÃ÷ʼ÷ʵ÷Ê®÷ʧ÷Ê ÷Ê™÷Ê’÷Ê‹÷Ê„÷Ê}÷Êv÷Êo÷Êh÷Êa÷ÊZ÷ÊS÷ÊL÷ÊE÷Ê>÷Ê7÷Ê0÷Ê)÷Ê"÷Ê÷Ê÷Ê ÷Ê÷ÊÿöÊøöÊñöÊêöÊãöÊÜöÊÕöÊÎöÊÇöÊÀöʹöʲöÊ«öʤöÊöÊ–öÊöʈöÊöÊzöÊsöÊlöÊeöÊ^öÊWöÊPöÊIöÊBöÊ;öÊ4öÊ-öÊ&öÊöÊöÊöÊ öÊöÊüõÊõõÊîõÊçõÊàõÊÙõÊÒõÊËõÊÄõʽõʶõʯõʨõÊ¡õÊšõÊ“õÊŒõÊ…õÊ~õÊwõÊpõÊiõÊbõÊ[õÊTõÊMõÊFõÊ?õÊ8õÊ1õÊ*õÊ#õÊõÊõÊõÊõÊõÊùôÊòôÊëôÊäôÊÝôÊÖôÊÏôÊÈôÊÁôʺôʳôʬôÊ¥ôÊžôÊ—ôÊôʉôÊ‚ôÊ{ôÊtôÊmôÊfôÊ_ôÊXôÊQôÊJôÊCôÊ<ôÊ5ôÊ.ôÊ'ôÊ ôÊôÊôÊ ôÊôÊýóÊöóÊïóÊèóÊáóÊÚóÊÓóÊÌóÊÅóʾóÊ·óʰóÊ©óÊ¢óÊ›óÊ”óÊóʆóÊóÊxóÊqóÊjóÊcóÊ\óÊUóÊNóÊGóÊ@óÊ9óÊ2óÊ+óÊ$óÊóÊóÊóÊóÊóÊúòÊóòÊìòÊåòÊÞòÊ×òÊÐòÊÉòÊÂòÊ»òÊ´òÊ­òʦòÊŸòʘòÊ‘òÊŠòʃòÊ|òÊuòÊnòÊgòÊ`òÊYòÊRòÊKòÊDòÊ=òÊ6òÊ/òÊ(òÊ!òÊòÊòÊ òÊòÊþñÊ÷ñÊðñÊéñÊâñÊÛñÊÔñÊÍñÊÆñÊ¿ñʸñʱñʪñÊ£ñÊœñÊ•ñÊŽñʇñÊ€ñÊyñÊrñÊkñÊdñÊ]ñÊVñÊOñÊHñÊAñÊ:ñÊ3ñÊ,ñÊ%ñÊñÊñÊñÊ ñÊñÊûðÊôðÊíðÊæðÊßðÊØðÊÑðÊÊðÊÃðʼðʵðÊ®ðʧðÊ ðÊ™ðÊ’ðÊ‹ðÊ„ðÊ}ðÊvðÊoðÊhðÊaðÊZðÊSðÊLðÊEðÊ>ðÊ7ðÊ0ðÊ)ðÊ"ðÊðÊðÊ ðÊðÊÿïÊøïÊñïÊêïÊãïÊÜïÊÕïÊÎïÊÇïÊÀïʹïʲïÊ«ïʤïÊïÊ–ïÊïʈïÊïÊzïÊsïÊlïÊeïÊ^ïÊWïÊPïÊIïÊBïÊ;ïÊ4ïÊ-ïÊ&ïÊïÊïÊïÊ ïÊïÊüîÊõîÊîîÊçîÊàîÊÙîÊÒîÊËîÊÄîʽîʶîʯîʨîÊ¡îÊšîÊ“îÊŒîÊ…îÊ~îÊwîÊpîÊiîÊbîÊ[îÊTîÊMîÊFîÊ?îÊ8îÊ1îÊ*îÊ#îÊîÊîÊîÊîÊîÊùíÊòíÊëíÊäíÊÝíÊÖíÊÏíÊÈíÊÁíʺíʳíʬíÊ¥íÊžíÊ—íÊíʉíÊ‚íÊ{íÊtíÊmíÊfíÊ_íÊXíÊQíÊJíÊCíÊ<íÊ5íÊ.íÊ'íÊ íÊíÊíÊ íÊíÊýìÊöìÊïìÊèìÊáìÊÚìÊÓìÊÌìÊÅìʾìÊ·ìʰìÊ©ìÊ¢ìÊ›ìÊ”ìÊìʆìÊìÊxìÊqìÊjìÊcìÊ\ìÊUìÊNìÊGìÊ@ìÊ9ìÊ2ìÊ+ìÊ$ìÊìÊìÊìÊìÊìÊúëÊóëÊìëÊåëÊÞëÊ×ëÊÐëÊÉëÊÂëÊ»ëÊ´ëÊ­ëʦëÊŸëʘëÊ‘ëÊŠëʃëÊ|ëÊuëÊnëÊgëÊ`ëÊYëÊRëÊKëÊDëÊ=ëÊ6ëÊ/ëÊ(ëÊ!ëÊëÊëÊ ëÊëÊþêÊ÷êÊðêÊéêÊâêÊÛêÊÔêÊÍêÊÆêÊ¿êʸêʱêʪêÊ£êÊœêÊ•êÊŽêʇêÊ€êÊyêÊrêÊkêÊdêÊ]êÊVêÊOêÊHêÊAêÊ:êÊ3êÊ,êÊ%êÊêÊêÊêÊ êÊêÊûéÊôéÊíéÊæéÊßéÊØéÊÑéÊÊéÊÃéʼéʵéÊ®éʧéÊ éÊ™éÊ’éÊ‹éÊ„éÊ}éÊvéÊoéÊhéÊaéÊZéÊSéÊLéÊEéÊ>éÊ7éÊ0éÊ)éÊ"éÊéÊéÊ éÊéÊÿèÊøèÊñèÊêèÊãèÊÜèÊÕèÊÎèÊÇèÊÀèʹèʲèÊ«èʤèÊèÊ–èÊèʈèÊèÊzèÊsèÊlèÊeèÊ^èÊWèÊPèÊIèÊBèÊ;èÊ4èÊ-èÊ&èÊèÊèÊèÊ èÊèÊüçÊõçÊîçÊççÊàçÊÙçÊÒçÊËçÊÄçʽçʶçʯçʨçÊ¡çÊšçÊ“çÊŒçÊ…çÊ~çÊwçÊpçÊiçÊbçÊ[çÊTçÊMçÊFçÊ?çÊ8çÊ1çÊ*çÊ#çÊçÊçÊçÊçÊçÊùæÊòæÊëæÊäæÊÝæÊÖæÊÏæÊÈæÊÁæÊºæÊ³æÊ¬æÊ¥æÊžæÊ—æÊæÊ‰æÊ‚æÊ{æÊtæÊmæÊfæÊ_æÊXæÊQæÊJæÊCæÊ<æÊ5æÊ.æÊ'æÊ æÊæÊæÊ æÊæÊýåÊöåÊïåÊèåÊáåÊÚåÊÓåÊÌåÊÅåʾåÊ·åʰåÊ©åÊ¢åÊ›åÊ”åÊåʆåÊåÊxåÊqåÊjåÊcåÊ\åÊUåÊNåÊGåÊ@åÊ9åÊ2åÊ+åÊ$åÊåÊåÊåÊåÊåÊúäÊóäÊìäÊåäÊÞäÊ×äÊÐäÊÉäÊÂäÊ»äÊ´äÊ­äʦäÊŸäʘäÊ‘äÊŠäʃäÊ|äÊuäÊnäÊgäÊ`äÊYäÊRäÊKäÊDäÊ=äÊ6äÊ/äÊ(äÊ!äÊäÊäÊ äÊäÊþãÊ÷ãÊðãÊéãÊâãÊÛãÊÔãÊÍãÊÆãÊ¿ãʸãʱãʪãÊ£ãÊœãÊ•ãÊŽãʇãÊ€ãÊyãÊrãÊkãÊdãÊ]ãÊVãÊOãÊHãÊAãÊ:ãÊ3ãÊ,ãÊ%ãÊãÊãÊãÊ ãÊãÊûâÊôâÊíâÊæâÊßâÊØâÊÑâÊÊâÊÃâʼâʵâÊ®âʧâÊ âÊ™âÊ’âÊ‹âÊ„âÊ}âÊvâÊoâÊhâÊaâÊZâÊSâÊLâÊEâÊ>âÊ7âÊ0âÊ)âÊ"âÊâÊâÊ âÊâÊÿáÊøáÊñáÊêáÊãáÊÜáÊÕáÊÎáÊÇáÊÀáʹáʲáÊ«áʤáÊáÊ–áÊáʈáÊáÊzáÊsáÊláÊeáÊ^áÊWáÊPáÊIáÊBáÊ;áÊ4áÊ-áÊ&áÊáÊáÊáÊ áÊáÊüàÊõàÊîàÊçàÊààÊÙàÊÒàÊËàÊÄàʽàʶàʯàʨàÊ¡àÊšàÊ“àÊŒàÊ…àÊ~àÊwàÊpàÊiàÊbàÊ[àÊTàÊMàÊFàÊ?àÊ8àÊ1àÊ*àÊ#àÊàÊàÊàÊàÊàÊùßÊòßÊëßÊäßÊÝßÊÖßÊÏßÊÈßÊÁßʺßʳßʬßÊ¥ßÊžßÊ—ßÊßʉßÊ‚ßÊ{ßÊtßÊmßÊfßÊ_ßÊXßÊQßÊJßÊCßÊ<ßÊ5ßÊ.ßÊ'ßÊ ßÊßÊßÊ ßÊßÊýÞÊöÞÊïÞÊèÞÊáÞÊÚÞÊÓÞÊÌÞÊÅÞʾÞÊ·ÞʰÞÊ©ÞÊ¢ÞÊ›ÞÊ”ÞÊÞʆÞÊÞÊxÞÊqÞÊjÞÊcÞÊ\ÞÊUÞÊNÞÊGÞÊ@ÞÊ9ÞÊ2ÞÊ+ÞÊ$ÞÊÞÊÞÊÞÊÞÊÞÊúÝÊóÝÊìÝÊåÝÊÞÝÊ×ÝÊÐÝÊÉÝÊÂÝÊ»ÝÊ´ÝÊ­ÝʦÝÊŸÝʘÝÊ‘ÝÊŠÝʃÝÊ|ÝÊuÝÊnÝÊgÝÊ`ÝÊYÝÊRÝÊKÝÊDÝÊ=ÝÊ6ÝÊ/ÝÊ(ÝÊ!ÝÊÝÊÝÊ ÝÊÝÊþÜÊ÷ÜÊðÜÊéÜÊâÜÊÛÜÊÔÜÊÍÜÊÆÜÊ¿ÜʸÜʱÜʪÜÊ£ÜÊœÜÊ•ÜÊŽÜʇÜÊ€ÜÊyÜÊrÜÊkÜÊdÜÊ]ÜÊVÜÊOÜÊHÜÊAÜÊ:ÜÊ3ÜÊ,ÜÊ%ÜÊÜÊÜÊÜÊ ÜÊÜÊûÛÊôÛÊíÛÊæÛÊßÛÊØÛÊÑÛÊÊÛÊÃÛʼÛʵÛÊ®ÛʧÛÊ ÛÊ™ÛÊ’ÛÊ‹ÛÊ„ÛÊ}ÛÊvÛÊoÛÊhÛÊaÛÊZÛÊSÛÊLÛÊEÛÊ>ÛÊ7ÛÊ0ÛÊ)ÛÊ"ÛÊÛÊÛÊ ÛÊÛÊÿÚÊøÚÊñÚÊêÚÊãÚÊÜÚÊÕÚÊÎÚÊÇÚÊÀÚʹÚʲÚÊ«ÚʤÚÊÚÊ–ÚÊÚʈÚÊÚÊzÚÊsÚÊlÚÊeÚÊ^ÚÊWÚÊPÚÊIÚÊBÚÊ;ÚÊ4ÚÊ-ÚÊ&ÚÊÚÊÚÊÚÊ ÚÊÚÊüÙÊõÙÊîÙÊçÙÊàÙÊÙÙÊÒÙÊËÙÊÄÙʽÙʶÙʯÙʨÙÊ¡ÙÊšÙÊ“ÙÊŒÙÊ…ÙÊ~ÙÊwÙÊpÙÊiÙÊbÙÊ[ÙÊTÙÊMÙÊFÙÊ?ÙÊ8ÙÊ1ÙÊ*ÙÊ#ÙÊÙÊÙÊÙÊÙÊÙÊùØÊòØÊëØÊäØÊÝØÊÖØÊÏØÊÈØÊÁØÊºØÊ³ØÊ¬ØÊ¥ØÊžØÊ—ØÊØÊ‰ØÊ‚ØÊ{ØÊtØÊmØÊfØÊ_ØÊXØÊQØÊJØÊCØÊ<ØÊ5ØÊ.ØÊ'ØÊ ØÊØÊØÊ ØÊØÊý×Êö×Êï×Êè×Êá×ÊÚ×ÊÓ×ÊÌ×ÊÅ×ʾ×Ê·×ʰ×Ê©×Ê¢×Ê›×Ê”×Ê×ʆ×Ê×Êx×Êq×Êj×Êc×Ê\×ÊU×ÊN×ÊG×Ê@×Ê9×Ê2×Ê+×Ê$×Ê×Ê×Ê×Ê×Ê×ÊúÖÊóÖÊìÖÊåÖÊÞÖÊ×ÖÊÐÖÊÉÖÊÂÖÊ»ÖÊ´ÖÊ­ÖʦÖÊŸÖʘÖÊ‘ÖÊŠÖʃÖÊ|ÖÊuÖÊnÖÊgÖÊ`ÖÊYÖÊRÖÊKÖÊDÖÊ=ÖÊ6ÖÊ/ÖÊ(ÖÊ!ÖÊÖÊÖÊ ÖÊÖÊþÕÊ÷ÕÊðÕÊéÕÊâÕÊÛÕÊÔÕÊÍÕÊÆÕÊ¿ÕʸÕʱÕʪÕÊ£ÕÊœÕÊ•ÕÊŽÕʇÕÊ€ÕÊyÕÊrÕÊkÕÊdÕÊ]ÕÊVÕÊOÕÊHÕÊAÕÊ:ÕÊ3ÕÊ,ÕÊ%ÕÊÕÊÕÊÕÊ ÕÊÕÊûÔÊôÔÊíÔÊæÔÊßÔÊØÔÊÑÔÊÊÔÊÃÔʼÔʵÔÊ®ÔʧÔÊ ÔÊ™ÔÊ’ÔÊ‹ÔÊ„ÔÊ}ÔÊvÔÊoÔÊhÔÊaÔÊZÔÊSÔÊLÔÊEÔÊ>ÔÊ7ÔÊ0ÔÊ)ÔÊ"ÔÊÔÊÔÊ ÔÊÔÊÿÓÊøÓÊñÓÊêÓÊãÓÊÜÓÊÕÓÊÎÓÊÇÓÊÀÓʹÓʲÓÊ«ÓʤÓÊÓÊ–ÓÊÓʈÓÊÓÊzÓÊsÓÊlÓÊeÓÊ^ÓÊWÓÊPÓÊIÓÊBÓÊ;ÓÊ4ÓÊ-ÓÊ&ÓÊÓÊÓÊÓÊ ÓÊÓÊüÒÊõÒÊîÒÊçÒÊàÒÊÙÒÊÒÒÊËÒÊÄÒʽÒʶÒʯÒʨÒÊ¡ÒÊšÒÊ“ÒÊŒÒÊ…ÒÊ~ÒÊwÒÊpÒÊiÒÊbÒÊ[ÒÊTÒÊMÒÊFÒÊ?ÒÊ8ÒÊ1ÒÊ*ÒÊ#ÒÊÒÊÒÊÒÊÒÊÒÊùÑÊòÑÊëÑÊäÑÊÝÑÊÖÑÊÏÑÊÈÑÊÁÑʺÑʳÑʬÑÊ¥ÑÊžÑÊ—ÑÊÑʉÑÊ‚ÑÊ{ÑÊtÑÊmÑÊfÑÊ_ÑÊXÑÊQÑÊJÑÊCÑÊ<ÑÊ5ÑÊ.ÑÊ'ÑÊ ÑÊÑÊÑÊ ÑÊÑÊýÐÊöÐÊïÐÊèÐÊáÐÊÚÐÊÓÐÊÌÐÊÅÐʾÐÊ·ÐʰÐÊ©ÐÊ¢ÐÊ›ÐÊ”ÐÊÐʆÐÊÐÊxÐÊqÐÊjÐÊcÐÊ\ÐÊUÐÊNÐÊGÐÊ@ÐÊ9ÐÊ2ÐÊ+ÐÊ$ÐÊÐÊÐÊÐÊÐÊÐÊúÏÊóÏÊìÏÊåÏÊÞÏÊ×ÏÊÐÏÊÉÏÊÂÏÊ»ÏÊ´ÏÊ­ÏʦÏÊŸÏʘÏÊ‘ÏÊŠÏʃÏÊ|ÏÊuÏÊnÏÊgÏÊ`ÏÊYÏÊRÏÊKÏÊDÏÊ=ÏÊ6ÏÊ/ÏÊ(ÏÊ!ÏÊÏÊÏÊ ÏÊÏÊþÎÊ÷ÎÊðÎÊéÎÊâÎÊÛÎÊÔÎÊÍÎÊÆÎÊ¿ÎʸÎʱÎʪÎÊ£ÎÊœÎÊ•ÎÊŽÎʇÎÊ€ÎÊyÎÊrÎÊkÎÊdÎÊ]ÎÊVÎÊOÎÊHÎÊAÎÊ:ÎÊ3ÎÊ,ÎÊ%ÎÊÎÊÎÊÎÊ ÎÊÎÊûÍÊôÍÊíÍÊæÍÊßÍÊØÍÊÑÍÊÊÍÊÃÍʼÍʵÍÊ®ÍʧÍÊ ÍÊ™ÍÊ’ÍÊ‹ÍÊ„ÍÊ}ÍÊvÍÊoÍÊhÍÊaÍÊZÍÊSÍÊLÍÊEÍÊ>ÍÊ7ÍÊ0ÍÊ)ÍÊ"ÍÊÍÊÍÊ ÍÊÍÊÿÌÊøÌÊñÌÊêÌÊãÌÊÜÌÊÕÌÊÎÌÊÇÌÊÀÌʹÌʲÌÊ«ÌʤÌÊÌÊ–ÌÊÌʈÌÊÌÊzÌÊsÌÊlÌÊeÌÊ^ÌÊWÌÊPÌÊIÌÊBÌÊ;ÌÊ4ÌÊ-ÌÊ&ÌÊÌÊÌÊÌÊ ÌÊÌÊüËÊõËÊîËÊçËÊàËÊÙËÊÒËÊËËÊÄËʽËʶËʯËʨËÊ¡ËÊšËÊ“ËÊŒËÊ…ËÊ~ËÊwËÊpËÊiËÊbËÊ[ËÊTËÊMËÊFËÊ?ËÊ8ËÊ1ËÊ*ËÊ#ËÊËÊËÊËÊËÊËÊùÊÊòÊÊëÊÊäÊÊÝÊÊÖÊÊÏÊÊÈÊÊÁÊʺÊʳÊʬÊÊ¥ÊÊžÊÊ—ÊÊÊʉÊÊ‚ÊÊ{ÊÊtÊÊmÊÊfÊÊ_ÊÊXÊÊQÊÊJÊÊCÊÊ<ÊÊ5ÊÊ.ÊÊ'ÊÊ ÊÊÊÊÊÊ ÊÊÊÊýÉÊöÉÊïÉÊèÉÊáÉÊÚÉÊÓÉÊÌÉÊÅÉʾÉÊ·ÉʰÉÊ©ÉÊ¢ÉÊ›ÉÊ”ÉÊÉʆÉÊÉÊxÉÊqÉÊjÉÊcÉÊ\ÉÊUÉÊNÉÊGÉÊ@ÉÊ9ÉÊ2ÉÊ+ÉÊ$ÉÊÉÊÉÊÉÊÉÊÉÊúÈÊóÈÊìÈÊåÈÊÞÈÊ×ÈÊÐÈÊÉÈÊÂÈÊ»ÈÊ´ÈÊ­ÈʦÈÊŸÈʘÈÊ‘ÈÊŠÈʃÈÊ|ÈÊuÈÊnÈÊgÈÊ`ÈÊYÈÊRÈÊKÈÊDÈÊ=ÈÊ6ÈÊ/ÈÊ(ÈÊ!ÈÊÈÊÈÊ ÈÊÈÊþÇÊ÷ÇÊðÇÊéÇÊâÇÊÛÇÊÔÇÊÍÇÊÆÇÊ¿ÇʸÇʱÇʪÇÊ£ÇÊœÇÊ•ÇÊŽÇʇÇÊ€ÇÊyÇÊrÇÊkÇÊdÇÊ]ÇÊVÇÊOÇÊHÇÊAÇÊ:ÇÊ3ÇÊ,ÇÊ%ÇÊÇÊÇÊÇÊ ÇÊÇÊûÆÊôÆÊíÆÊæÆÊ߯ÊØÆÊÑÆÊÊÆÊÃÆÊ¼ÆÊµÆÊ®ÆÊ§ÆÊ ÆÊ™ÆÊ’ÆÊ‹ÆÊ„ÆÊ}ÆÊvÆÊoÆÊhÆÊaÆÊZÆÊSÆÊLÆÊEÆÊ>ÆÊ7ÆÊ0ÆÊ)ÆÊ"ÆÊÆÊÆÊ ÆÊÆÊÿÅÊøÅÊñÅÊêÅÊãÅÊÜÅÊÕÅÊÎÅÊÇÅÊÀÅʹÅʲÅÊ«ÅʤÅÊÅÊ–ÅÊÅʈÅÊÅÊzÅÊsÅÊlÅÊeÅÊ^ÅÊWÅÊPÅÊIÅÊBÅÊ;ÅÊ4ÅÊ-ÅÊ&ÅÊÅÊÅÊÅÊ ÅÊÅÊüÄÊõÄÊîÄÊçÄÊàÄÊÙÄÊÒÄÊËÄÊÄÄʽÄʶÄʯÄʨÄÊ¡ÄÊšÄÊ“ÄÊŒÄÊ…ÄÊ~ÄÊwÄÊpÄÊiÄÊbÄÊ[ÄÊTÄÊMÄÊFÄÊ?ÄÊ8ÄÊ1ÄÊ*ÄÊ#ÄÊÄÊÄÊÄÊÄÊÄÊùÃÊòÃÊëÃÊäÃÊÝÃÊÖÃÊÏÃÊÈÃÊÁÃʺÃʳÃʬÃÊ¥ÃÊžÃÊ—ÃÊÃʉÃÊ‚ÃÊ{ÃÊtÃÊmÃÊfÃÊ_ÃÊXÃÊQÃÊJÃÊCÃÊ<ÃÊ5ÃÊ.ÃÊ'ÃÊ ÃÊÃÊÃÊ ÃÊÃÊýÂÊöÂÊïÂÊèÂÊáÂÊÚÂÊÓÂÊÌÂÊÅÂʾÂÊ·ÂʰÂÊ©ÂÊ¢ÂÊ›ÂÊ”ÂÊÂʆÂÊÂÊxÂÊqÂÊjÂÊcÂÊ\ÂÊUÂÊNÂÊGÂÊ@ÂÊ9ÂÊ2ÂÊ+ÂÊ$ÂÊÂÊÂÊÂÊÂÊÂÊúÁÊóÁÊìÁÊåÁÊÞÁÊ×ÁÊÐÁÊÉÁÊÂÁÊ»ÁÊ´ÁÊ­ÁʦÁÊŸÁʘÁÊ‘ÁÊŠÁʃÁÊ|ÁÊuÁÊnÁÊgÁÊ`ÁÊYÁÊRÁÊKÁÊDÁÊ=ÁÊ6ÁÊ/ÁÊ(ÁÊ!ÁÊÁÊÁÊ ÁÊÁÊþÀÊ÷ÀÊðÀÊéÀÊâÀÊÛÀÊÔÀÊÍÀÊÆÀÊ¿ÀʸÀʱÀʪÀÊ£ÀÊœÀÊ•ÀÊŽÀʇÀÊ€ÀÊyÀÊrÀÊkÀÊdÀÊ]ÀÊVÀÊOÀÊHÀÊAÀÊ:ÀÊ3ÀÊ,ÀÊ%ÀÊÀÊÀÊÀÊ ÀÊÀÊû¿Êô¿Êí¿Êæ¿Êß¿ÊØ¿ÊÑ¿ÊÊ¿Êÿʼ¿Êµ¿Ê®¿Ê§¿Ê ¿Ê™¿Ê’¿Ê‹¿Ê„¿Ê}¿Êv¿Êo¿Êh¿Êa¿ÊZ¿ÊS¿ÊL¿ÊE¿Ê>¿Ê7¿Ê0¿Ê)¿Ê"¿Ê¿Ê¿Ê ¿Ê¿Êÿ¾Êø¾Êñ¾Êê¾Êã¾ÊܾÊÕ¾ÊξÊǾÊÀ¾Ê¹¾Ê²¾Ê«¾Ê¤¾Ê¾Ê–¾Ê¾Êˆ¾Ê¾Êz¾Ês¾Êl¾Êe¾Ê^¾ÊW¾ÊP¾ÊI¾ÊB¾Ê;¾Ê4¾Ê-¾Ê&¾Ê¾Ê¾Ê¾Ê ¾Ê¾Êü½Êõ½Êî½Êç½Êà½ÊÙ½ÊÒ½Ê˽ÊĽÊ½½Ê¶½Ê¯½Ê¨½Ê¡½Êš½Ê“½ÊŒ½Ê…½Ê~½Êw½Êp½Êi½Êb½Ê[½ÊT½ÊM½ÊF½Ê?½Ê8½Ê1½Ê*½Ê#½Ê½Ê½Ê½Ê½Ê½Êù¼Êò¼Êë¼Êä¼ÊݼÊÖ¼ÊϼÊȼÊÁ¼Êº¼Ê³¼Ê¬¼Ê¥¼Êž¼Ê—¼Ê¼Ê‰¼Ê‚¼Ê{¼Êt¼Êm¼Êf¼Ê_¼ÊX¼ÊQ¼ÊJ¼ÊC¼Ê<¼Ê5¼Ê.¼Ê'¼Ê ¼Ê¼Ê¼Ê ¼Ê¼Êý»Êö»Êï»Êè»Êá»ÊÚ»ÊÓ»ÊÌ»ÊŻʾ»Ê·»Ê°»Ê©»Ê¢»Ê›»Ê”»Ê»Ê†»Ê»Êx»Êq»Êj»Êc»Ê\»ÊU»ÊN»ÊG»Ê@»Ê9»Ê2»Ê+»Ê$»Ê»Ê»Ê»Ê»Ê»ÊúºÊóºÊìºÊåºÊÞºÊ׺ÊкÊɺʺʻºÊ´ºÊ­ºÊ¦ºÊŸºÊ˜ºÊ‘ºÊŠºÊƒºÊ|ºÊuºÊnºÊgºÊ`ºÊYºÊRºÊKºÊDºÊ=ºÊ6ºÊ/ºÊ(ºÊ!ºÊºÊºÊ ºÊºÊþ¹Ê÷¹Êð¹Êé¹Êâ¹ÊÛ¹ÊÔ¹Ê͹ÊƹÊ¿¹Ê¸¹Ê±¹Êª¹Ê£¹Êœ¹Ê•¹Ê޹ʇ¹Ê€¹Êy¹Êr¹Êk¹Êd¹Ê]¹ÊV¹ÊO¹ÊH¹ÊA¹Ê:¹Ê3¹Ê,¹Ê%¹Ê¹Ê¹Ê¹Ê ¹Ê¹Êû¸Êô¸Êí¸Êæ¸Ê߸ÊظÊѸÊʸÊøÊ¼¸Êµ¸Ê®¸Ê§¸Ê ¸Ê™¸Ê’¸Ê‹¸Ê„¸Ê}¸Êv¸Êo¸Êh¸Êa¸ÊZ¸ÊS¸ÊL¸ÊE¸Ê>¸Ê7¸Ê0¸Ê)¸Ê"¸Ê¸Ê¸Ê ¸Ê¸Êÿ·Êø·Êñ·Êê·Êã·ÊÜ·ÊÕ·ÊηÊÇ·ÊÀ·Ê¹·Ê²·Ê«·Ê¤·Ê·Ê–·Ê·Êˆ·Ê·Êz·Ês·Êl·Êe·Ê^·ÊW·ÊP·ÊI·ÊB·Ê;·Ê4·Ê-·Ê&·Ê·Ê·Ê·Ê ·Ê·Êü¶Êõ¶Êî¶Êç¶Êà¶ÊÙ¶ÊÒ¶Ê˶ÊĶʽ¶Ê¶¶Ê¯¶Ê¨¶Ê¡¶Êš¶Ê“¶ÊŒ¶Ê…¶Ê~¶Êw¶Êp¶Êi¶Êb¶Ê[¶ÊT¶ÊM¶ÊF¶Ê?¶Ê8¶Ê1¶Ê*¶Ê#¶Ê¶Ê¶Ê¶Ê¶Ê¶ÊùµÊòµÊëµÊäµÊݵÊÖµÊϵÊȵÊÁµÊºµÊ³µÊ¬µÊ¥µÊžµÊ—µÊµÊ‰µÊ‚µÊ{µÊtµÊmµÊfµÊ_µÊXµÊQµÊJµÊCµÊ<µÊ5µÊ.µÊ'µÊ µÊµÊµÊ µÊµÊý´Êö´Êï´Êè´Êá´ÊÚ´ÊÓ´ÊÌ´ÊŴʾ´Ê·´Ê°´Ê©´Ê¢´Ê›´Ê”´Ê´Ê†´Ê´Êx´Êq´Êj´Êc´Ê\´ÊU´ÊN´ÊG´Ê@´Ê9´Ê2´Ê+´Ê$´Ê´Ê´Ê´Ê´Ê´Êú³Êó³Êì³Êå³ÊÞ³Ê׳ÊгÊɳʳʻ³Ê´³Ê­³Ê¦³ÊŸ³Ê˜³Ê‘³Êгʃ³Ê|³Êu³Ên³Êg³Ê`³ÊY³ÊR³ÊK³ÊD³Ê=³Ê6³Ê/³Ê(³Ê!³Ê³Ê³Ê ³Ê³Êþ²Ê÷²Êð²Êé²Êâ²ÊÛ²ÊÔ²ÊͲÊƲÊ¿²Ê¸²Ê±²Êª²Ê£²Êœ²Ê•²Ê޲ʇ²Ê€²Êy²Êr²Êk²Êd²Ê]²ÊV²ÊO²ÊH²ÊA²Ê:²Ê3²Ê,²Ê%²Ê²Ê²Ê²Ê ²Ê²Êû±Êô±Êí±Êæ±Êß±ÊرÊѱÊʱÊñʼ±Êµ±Ê®±Ê§±Ê ±Ê™±Ê’±Ê‹±Ê„±Ê}±Êv±Êo±Êh±Êa±ÊZ±ÊS±ÊL±ÊE±Ê>±Ê7±Ê0±Ê)±Ê"±Ê±Ê±Ê ±Ê±Êÿ°Êø°Êñ°Êê°Êã°ÊܰÊÕ°ÊΰÊǰÊÀ°Ê¹°Ê²°Ê«°Ê¤°Ê°Ê–°Ê°Êˆ°Ê°Êz°Ês°Êl°Êe°Ê^°ÊW°ÊP°ÊI°ÊB°Ê;°Ê4°Ê-°Ê&°Ê°Ê°Ê°Ê °Ê°Êü¯Êõ¯Êî¯Êç¯Êà¯ÊÙ¯ÊÒ¯Ê˯Êįʽ¯Ê¶¯Ê¯¯Ê¨¯Ê¡¯Êš¯Ê“¯ÊŒ¯Ê…¯Ê~¯Êw¯Êp¯Êi¯Êb¯Ê[¯ÊT¯ÊM¯ÊF¯Ê?¯Ê8¯Ê1¯Ê*¯Ê#¯Ê¯Ê¯Ê¯Ê¯Ê¯Êù®Êò®Êë®Êä®ÊÝ®ÊÖ®ÊÏ®ÊÈ®ÊÁ®Êº®Ê³®Ê¬®Ê¥®Êž®Ê—®Ê®Ê‰®Ê‚®Ê{®Êt®Êm®Êf®Ê_®ÊX®ÊQ®ÊJ®ÊC®Ê<®Ê5®Ê.®Ê'®Ê ®Ê®Ê®Ê ®Ê®Êý­Êö­Êï­Êè­Êá­ÊÚ­ÊÓ­ÊÌ­Êŭʾ­Ê·­Ê°­Ê©­Ê¢­Ê›­Ê”­Ê­Ê†­Ê­Êx­Êq­Êj­Êc­Ê\­ÊU­ÊN­ÊG­Ê@­Ê9­Ê2­Ê+­Ê$­Ê­Ê­Ê­Ê­Ê­Êú¬Êó¬Êì¬Êå¬ÊÞ¬Ê׬ÊЬÊɬʬʻ¬Ê´¬Ê­¬Ê¦¬ÊŸ¬Ê˜¬Ê‘¬ÊЬʃ¬Ê|¬Êu¬Ên¬Êg¬Ê`¬ÊY¬ÊR¬ÊK¬ÊD¬Ê=¬Ê6¬Ê/¬Ê(¬Ê!¬Ê¬Ê¬Ê ¬Ê¬Êþ«Ê÷«Êð«Êé«Êâ«ÊÛ«ÊÔ«ÊÍ«ÊÆ«Ê¿«Ê¸«Ê±«Êª«Ê£«Êœ«Ê•«ÊŽ«Ê‡«Ê€«Êy«Êr«Êk«Êd«Ê]«ÊV«ÊO«ÊH«ÊA«Ê:«Ê3«Ê,«Ê%«Ê«Ê«Ê«Ê «Ê«ÊûªÊôªÊíªÊæªÊߪÊتÊѪÊʪÊêʼªÊµªÊ®ªÊ§ªÊ ªÊ™ªÊ’ªÊ‹ªÊ„ªÊ}ªÊvªÊoªÊhªÊaªÊZªÊSªÊLªÊEªÊ>ªÊ7ªÊ0ªÊ)ªÊ"ªÊªÊªÊ ªÊªÊÿ©Êø©Êñ©Êê©Êã©ÊÜ©ÊÕ©ÊΩÊÇ©ÊÀ©Ê¹©Ê²©Ê«©Ê¤©Ê©Ê–©Ê©Êˆ©Ê©Êz©Ês©Êl©Êe©Ê^©ÊW©ÊP©ÊI©ÊB©Ê;©Ê4©Ê-©Ê&©Ê©Ê©Ê©Ê ©Ê©Êü¨Êõ¨Êî¨Êç¨Êà¨ÊÙ¨ÊÒ¨Ê˨ÊĨʽ¨Ê¶¨Ê¯¨Ê¨¨Ê¡¨Êš¨Ê“¨ÊŒ¨Ê…¨Ê~¨Êw¨Êp¨Êi¨Êb¨Ê[¨ÊT¨ÊM¨ÊF¨Ê?¨Ê8¨Ê1¨Ê*¨Ê#¨Ê¨Ê¨Ê¨Ê¨Ê¨Êù§Êò§Êë§Êä§ÊݧÊÖ§ÊϧÊȧÊÁ§Êº§Ê³§Ê¬§Ê¥§Êž§Ê—§Ê§Ê‰§Ê‚§Ê{§Êt§Êm§Êf§Ê_§ÊX§ÊQ§ÊJ§ÊC§Ê<§Ê5§Ê.§Ê'§Ê §Ê§Ê§Ê §Ê§Êý¦Êö¦Êï¦Êè¦Êá¦ÊÚ¦ÊÓ¦Ê̦ÊŦʾ¦Ê·¦Ê°¦Ê©¦Ê¢¦Ê›¦Ê”¦Ê¦Ê†¦Ê¦Êx¦Êq¦Êj¦Êc¦Ê\¦ÊU¦ÊN¦ÊG¦Ê@¦Ê9¦Ê2¦Ê+¦Ê$¦Ê¦Ê¦Ê¦Ê¦Ê¦Êú¥Êó¥Êì¥Êå¥ÊÞ¥Ê×¥ÊÐ¥Êɥʥʻ¥Ê´¥Ê­¥Ê¦¥ÊŸ¥Ê˜¥Ê‘¥ÊŠ¥Êƒ¥Ê|¥Êu¥Ên¥Êg¥Ê`¥ÊY¥ÊR¥ÊK¥ÊD¥Ê=¥Ê6¥Ê/¥Ê(¥Ê!¥Ê¥Ê¥Ê ¥Ê¥Êþ¤Ê÷¤Êð¤Êé¤Êâ¤ÊÛ¤ÊÔ¤ÊͤÊƤÊ¿¤Ê¸¤Ê±¤Êª¤Ê£¤Êœ¤Ê•¤Êޤʇ¤Ê€¤Êy¤Êr¤Êk¤Êd¤Ê]¤ÊV¤ÊO¤ÊH¤ÊA¤Ê:¤Ê3¤Ê,¤Ê%¤Ê¤Ê¤Ê¤Ê ¤Ê¤Êû£Êô£Êí£Êæ£ÊߣÊØ£ÊÑ£ÊÊ£Êãʼ£Êµ£Ê®£Ê§£Ê £Ê™£Ê’£Ê‹£Ê„£Ê}£Êv£Êo£Êh£Êa£ÊZ£ÊS£ÊL£ÊE£Ê>£Ê7£Ê0£Ê)£Ê"£Ê£Ê£Ê £Ê£Êÿ¢Êø¢Êñ¢Êê¢Êã¢ÊÜ¢ÊÕ¢Ê΢ÊÇ¢ÊÀ¢Ê¹¢Ê²¢Ê«¢Ê¤¢Ê¢Ê–¢Ê¢Êˆ¢Ê¢Êz¢Ês¢Êl¢Êe¢Ê^¢ÊW¢ÊP¢ÊI¢ÊB¢Ê;¢Ê4¢Ê-¢Ê&¢Ê¢Ê¢Ê¢Ê ¢Ê¢Êü¡Êõ¡Êî¡Êç¡Êà¡ÊÙ¡ÊÒ¡ÊË¡Êġʽ¡Ê¶¡Ê¯¡Ê¨¡Ê¡¡Êš¡Ê“¡ÊŒ¡Ê…¡Ê~¡Êw¡Êp¡Êi¡Êb¡Ê[¡ÊT¡ÊM¡ÊF¡Ê?¡Ê8¡Ê1¡Ê*¡Ê#¡Ê¡Ê¡Ê¡Ê¡Ê¡Êù Êò Êë Êä ÊÝ ÊÖ ÊÏ ÊÈ ÊÁ Êº Ê³ Ê¬ Ê¥ Êž Ê— Ê Ê‰ Ê‚ Ê{ Êt Êm Êf Ê_ ÊX ÊQ ÊJ ÊC Ê< Ê5 Ê. Ê' Ê  Ê Ê Ê  Ê ÊýŸÊöŸÊïŸÊèŸÊáŸÊÚŸÊÓŸÊÌŸÊşʾŸÊ·ŸÊ°ŸÊ©ŸÊ¢ŸÊ›ŸÊ”ŸÊŸÊ†ŸÊŸÊxŸÊqŸÊjŸÊcŸÊ\ŸÊUŸÊNŸÊGŸÊ@ŸÊ9ŸÊ2ŸÊ+ŸÊ$ŸÊŸÊŸÊŸÊŸÊŸÊúžÊóžÊìžÊåžÊÞžÊמÊОÊɞʞʻžÊ´žÊ­žÊ¦žÊŸžÊ˜žÊ‘žÊŠžÊƒžÊ|žÊužÊnžÊgžÊ`žÊYžÊRžÊKžÊDžÊ=žÊ6žÊ/žÊ(žÊ!žÊžÊžÊ žÊžÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûœÊôœÊíœÊæœÊßœÊØœÊÑœÊÊœÊÜʼœÊµœÊ®œÊ§œÊ œÊ™œÊ’œÊ‹œÊ„œÊ}œÊvœÊoœÊhœÊaœÊZœÊSœÊLœÊEœÊ>œÊ7œÊ0œÊ)œÊ"œÊœÊœÊ œÊœÊÿ›Êø›Êñ›Êê›Êã›ÊÜ›ÊÕ›ÊΛÊÇ›ÊÀ›Ê¹›Ê²›Ê«›Ê¤›Ê›Ê–›Ê›Êˆ›Ê›Êz›Ês›Êl›Êe›Ê^›ÊW›ÊP›ÊI›ÊB›Ê;›Ê4›Ê-›Ê&›Ê›Ê›Ê›Ê ›Ê›ÊüšÊõšÊîšÊçšÊàšÊÙšÊÒšÊËšÊĚʽšÊ¶šÊ¯šÊ¨šÊ¡šÊššÊ“šÊŒšÊ…šÊ~šÊwšÊpšÊišÊbšÊ[šÊTšÊMšÊFšÊ?šÊ8šÊ1šÊ*šÊ#šÊšÊšÊšÊšÊšÊù™Êò™Êë™Êä™ÊÝ™ÊÖ™ÊÏ™ÊÈ™ÊÁ™Êº™Ê³™Ê¬™Ê¥™Êž™Ê—™Ê™Ê‰™Ê‚™Ê{™Êt™Êm™Êf™Ê_™ÊX™ÊQ™ÊJ™ÊC™Ê<™Ê5™Ê.™Ê'™Ê ™Ê™Ê™Ê ™Ê™Êý˜Êö˜Êï˜Êè˜Êá˜ÊÚ˜ÊÓ˜Ê̘ÊŘʾ˜Ê·˜Ê°˜Ê©˜Ê¢˜Ê›˜Ê”˜Ê˜Ê†˜Ê˜Êx˜Êq˜Êj˜Êc˜Ê\˜ÊU˜ÊN˜ÊG˜Ê@˜Ê9˜Ê2˜Ê+˜Ê$˜Ê˜Ê˜Ê˜Ê˜Ê˜Êú—Êó—Êì—Êå—ÊÞ—Ê×—ÊЗÊÉ—Ê—Ê»—Ê´—Ê­—ʦ—ÊŸ—ʘ—Ê‘—ÊŠ—ʃ—Ê|—Êu—Ên—Êg—Ê`—ÊY—ÊR—ÊK—ÊD—Ê=—Ê6—Ê/—Ê(—Ê!—Ê—Ê—Ê —Ê—Êþ–Ê÷–Êð–Êé–Êâ–ÊÛ–ÊÔ–ÊÍ–ÊÆ–Ê¿–ʸ–ʱ–ʪ–Ê£–Êœ–Ê•–ÊŽ–ʇ–Ê€–Êy–Êr–Êk–Êd–Ê]–ÊV–ÊO–ÊH–ÊA–Ê:–Ê3–Ê,–Ê%–Ê–Ê–Ê–Ê –Ê–Êû•Êô•Êí•Êæ•Êß•ÊØ•ÊÑ•ÊÊ•ÊÕʼ•ʵ•Ê®•ʧ•Ê •Ê™•Ê’•Ê‹•Ê„•Ê}•Êv•Êo•Êh•Êa•ÊZ•ÊS•ÊL•ÊE•Ê>•Ê7•Ê0•Ê)•Ê"•Ê•Ê•Ê •Ê•Êÿ”Êø”Êñ”Êê”Êã”ÊÜ”ÊÕ”ÊΔÊÇ”ÊÀ”ʹ”ʲ”Ê«”ʤ”ʔʖ”ʔʈ”Ê”Êz”Ês”Êl”Êe”Ê^”ÊW”ÊP”ÊI”ÊB”Ê;”Ê4”Ê-”Ê&”Ê”Ê”Ê”Ê ”Ê”Êü“Êõ“Êî“Êç“Êà“ÊÙ“ÊÒ“ÊË“Êēʽ“ʶ“ʯ“ʨ“Ê¡“Êš“Ê““ÊŒ“Ê…“Ê~“Êw“Êp“Êi“Êb“Ê[“ÊT“ÊM“ÊF“Ê?“Ê8“Ê1“Ê*“Ê#“ʓʓʓʓʓÊù’Êò’Êë’Êä’ÊÝ’ÊÖ’ÊÏ’ÊÈ’ÊÁ’ʺ’ʳ’ʬ’Ê¥’Êž’Ê—’ʒʉ’Ê‚’Ê{’Êt’Êm’Êf’Ê_’ÊX’ÊQ’ÊJ’ÊC’Ê<’Ê5’Ê.’Ê'’Ê ’Ê’Ê’Ê ’Ê’Êý‘Êö‘Êï‘Êè‘Êá‘ÊÚ‘ÊÓ‘ÊÌ‘Êőʾ‘Ê·‘ʰ‘Ê©‘Ê¢‘Ê›‘Ê”‘ʑʆ‘Ê‘Êx‘Êq‘Êj‘Êc‘Ê\‘ÊU‘ÊN‘ÊG‘Ê@‘Ê9‘Ê2‘Ê+‘Ê$‘ʑʑʑʑʑÊúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûŽÊôŽÊíŽÊæŽÊߎÊØŽÊÑŽÊÊŽÊÎʼŽÊµŽÊ®ŽÊ§ŽÊ ŽÊ™ŽÊ’ŽÊ‹ŽÊ„ŽÊ}ŽÊvŽÊoŽÊhŽÊaŽÊZŽÊSŽÊLŽÊEŽÊ>ŽÊ7ŽÊ0ŽÊ)ŽÊ"ŽÊŽÊŽÊ ŽÊŽÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüŒÊõŒÊîŒÊçŒÊàŒÊÙŒÊÒŒÊËŒÊČʽŒÊ¶ŒÊ¯ŒÊ¨ŒÊ¡ŒÊšŒÊ“ŒÊŒŒÊ…ŒÊ~ŒÊwŒÊpŒÊiŒÊbŒÊ[ŒÊTŒÊMŒÊFŒÊ?ŒÊ8ŒÊ1ŒÊ*ŒÊ#ŒÊŒÊŒÊŒÊŒÊŒÊù‹Êò‹Êë‹Êä‹ÊÝ‹ÊÖ‹ÊÏ‹ÊÈ‹ÊÁ‹Êº‹Ê³‹Ê¬‹Ê¥‹Êž‹Ê—‹Ê‹Ê‰‹Ê‚‹Ê{‹Êt‹Êm‹Êf‹Ê_‹ÊX‹ÊQ‹ÊJ‹ÊC‹Ê<‹Ê5‹Ê.‹Ê'‹Ê ‹Ê‹Ê‹Ê ‹Ê‹ÊýŠÊöŠÊïŠÊèŠÊáŠÊÚŠÊÓŠÊÌŠÊŊʾŠÊ·ŠÊ°ŠÊ©ŠÊ¢ŠÊ›ŠÊ”ŠÊŠÊ†ŠÊŠÊxŠÊqŠÊjŠÊcŠÊ\ŠÊUŠÊNŠÊGŠÊ@ŠÊ9ŠÊ2ŠÊ+ŠÊ$ŠÊŠÊŠÊŠÊŠÊŠÊú‰Êó‰Êì‰Êå‰ÊÞ‰Ê׉ÊЉÊɉʉʻ‰Ê´‰Ê­‰Ê¦‰ÊŸ‰Ê˜‰Ê‘‰ÊЉÊƒ‰Ê|‰Êu‰Ên‰Êg‰Ê`‰ÊY‰ÊR‰ÊK‰ÊD‰Ê=‰Ê6‰Ê/‰Ê(‰Ê!‰Ê‰Ê‰Ê ‰Ê‰ÊþˆÊ÷ˆÊðˆÊéˆÊâˆÊÛˆÊÔˆÊ͈ÊƈÊ¿ˆÊ¸ˆÊ±ˆÊªˆÊ£ˆÊœˆÊ•ˆÊŽˆÊ‡ˆÊ€ˆÊyˆÊrˆÊkˆÊdˆÊ]ˆÊVˆÊOˆÊHˆÊAˆÊ:ˆÊ3ˆÊ,ˆÊ%ˆÊˆÊˆÊˆÊ ˆÊˆÊû‡Êô‡Êí‡Êæ‡Ê߇Ê؇ÊчÊʇÊÇʼ‡Êµ‡Ê®‡Ê§‡Ê ‡Ê™‡Ê’‡Ê‹‡Ê„‡Ê}‡Êv‡Êo‡Êh‡Êa‡ÊZ‡ÊS‡ÊL‡ÊE‡Ê>‡Ê7‡Ê0‡Ê)‡Ê"‡Ê‡Ê‡Ê ‡Ê‡Êÿ†Êø†Êñ†Êê†Êã†Ê܆ÊÕ†ÊΆÊdžÊÀ†Ê¹†Ê²†Ê«†Ê¤†Ê†Ê–†Ê†Êˆ†Ê†Êz†Ês†Êl†Êe†Ê^†ÊW†ÊP†ÊI†ÊB†Ê;†Ê4†Ê-†Ê&†Ê†Ê†Ê†Ê †Ê†Êü…Êõ…Êî…Êç…Êà…ÊÙ…ÊÒ…ÊË…Êąʽ…ʶ…ʯ…ʨ…Ê¡…Êš…Ê“…ÊŒ…Ê……Ê~…Êw…Êp…Êi…Êb…Ê[…ÊT…ÊM…ÊF…Ê?…Ê8…Ê1…Ê*…Ê#…Ê…Ê…Ê…Ê…Ê…Êù„Êò„Êë„Êä„ÊÝ„ÊÖ„ÊÏ„ÊÈ„ÊÁ„ʺ„ʳ„ʬ„Ê¥„Êž„Ê—„ʄʉ„Ê‚„Ê{„Êt„Êm„Êf„Ê_„ÊX„ÊQ„ÊJ„ÊC„Ê<„Ê5„Ê.„Ê'„Ê „Ê„Ê„Ê „Ê„ÊýƒÊöƒÊïƒÊèƒÊáƒÊÚƒÊÓƒỄÊŃʾƒÊ·ƒÊ°ƒÊ©ƒÊ¢ƒÊ›ƒÊ”ƒÊƒÊ†ƒÊƒÊxƒÊqƒÊjƒÊcƒÊ\ƒÊUƒÊNƒÊGƒÊ@ƒÊ9ƒÊ2ƒÊ+ƒÊ$ƒÊƒÊƒÊƒÊƒÊƒÊú‚Êó‚Êì‚Êå‚ÊÞ‚ÊׂÊЂÊɂʂʻ‚Ê´‚Ê­‚ʦ‚ÊŸ‚ʘ‚Ê‘‚ÊŠ‚ʃ‚Ê|‚Êu‚Ên‚Êg‚Ê`‚ÊY‚ÊR‚ÊK‚ÊD‚Ê=‚Ê6‚Ê/‚Ê(‚Ê!‚Ê‚Ê‚Ê ‚Ê‚ÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊû€Êô€Êí€Êæ€Ê߀ÊØ€ÊÑ€ÊÊ€ÊÀʼ€Êµ€Ê®€Ê§€Ê €Ê™€Ê’€Ê‹€Ê„€Ê}€Êv€Êo€Êh€Êa€ÊZ€ÊS€ÊL€ÊE€Ê>€Ê7€Ê0€Ê)€Ê"€Ê€Ê€Ê €Ê€ÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊü~Êõ~Êî~Êç~Êà~ÊÙ~ÊÒ~ÊË~ÊÄ~ʽ~ʶ~ʯ~ʨ~Ê¡~Êš~Ê“~ÊŒ~Ê…~Ê~~Êw~Êp~Êi~Êb~Ê[~ÊT~ÊM~ÊF~Ê?~Ê8~Ê1~Ê*~Ê#~Ê~Ê~Ê~Ê~Ê~Êù}Êò}Êë}Êä}ÊÝ}ÊÖ}ÊÏ}ÊÈ}ÊÁ}ʺ}ʳ}ʬ}Ê¥}Êž}Ê—}Ê}ʉ}Ê‚}Ê{}Êt}Êm}Êf}Ê_}ÊX}ÊQ}ÊJ}ÊC}Ê<}Ê5}Ê.}Ê'}Ê }Ê}Ê}Ê }Ê}Êý|Êö|Êï|Êè|Êá|ÊÚ|ÊÓ|ÊÌ|ÊÅ|ʾ|Ê·|ʰ|Ê©|Ê¢|Ê›|Ê”|Ê|ʆ|Ê|Êx|Êq|Êj|Êc|Ê\|ÊU|ÊN|ÊG|Ê@|Ê9|Ê2|Ê+|Ê$|Ê|Ê|Ê|Ê|Ê|Êú{Êó{Êì{Êå{ÊÞ{Ê×{ÊÐ{ÊÉ{ÊÂ{Ê»{Ê´{Ê­{ʦ{ÊŸ{ʘ{Ê‘{ÊŠ{ʃ{Ê|{Êu{Ên{Êg{Ê`{ÊY{ÊR{ÊK{ÊD{Ê={Ê6{Ê/{Ê({Ê!{Ê{Ê{Ê {Ê{ÊþzÊ÷zÊðzÊézÊâzÊÛzÊÔzÊÍzÊÆzÊ¿zʸzʱzʪzÊ£zÊœzÊ•zÊŽzʇzÊ€zÊyzÊrzÊkzÊdzÊ]zÊVzÊOzÊHzÊAzÊ:zÊ3zÊ,zÊ%zÊzÊzÊzÊ zÊzÊûyÊôyÊíyÊæyÊßyÊØyÊÑyÊÊyÊÃyʼyʵyÊ®yʧyÊ yÊ™yÊ’yÊ‹yÊ„yÊ}yÊvyÊoyÊhyÊayÊZyÊSyÊLyÊEyÊ>yÊ7yÊ0yÊ)yÊ"yÊyÊyÊ yÊyÊÿxÊøxÊñxÊêxÊãxÊÜxÊÕxÊÎxÊÇxÊÀxʹxʲxÊ«xʤxÊxÊ–xÊxʈxÊxÊzxÊsxÊlxÊexÊ^xÊWxÊPxÊIxÊBxÊ;xÊ4xÊ-xÊ&xÊxÊxÊxÊ xÊxÊüwÊõwÊîwÊçwÊàwÊÙwÊÒwÊËwÊÄwʽwʶwʯwʨwÊ¡wÊšwÊ“wÊŒwÊ…wÊ~wÊwwÊpwÊiwÊbwÊ[wÊTwÊMwÊFwÊ?wÊ8wÊ1wÊ*wÊ#wÊwÊwÊwÊwÊwÊùvÊòvÊëvÊävÊÝvÊÖvÊÏvÊÈvÊÁvʺvʳvʬvÊ¥vÊžvÊ—vÊvʉvÊ‚vÊ{vÊtvÊmvÊfvÊ_vÊXvÊQvÊJvÊCvÊrÊ7rÊ0rÊ)rÊ"rÊrÊrÊ rÊrÊÿqÊøqÊñqÊêqÊãqÊÜqÊÕqÊÎqÊÇqÊÀqʹqʲqÊ«qʤqÊqÊ–qÊqʈqÊqÊzqÊsqÊlqÊeqÊ^qÊWqÊPqÊIqÊBqÊ;qÊ4qÊ-qÊ&qÊqÊqÊqÊ qÊqÊüpÊõpÊîpÊçpÊàpÊÙpÊÒpÊËpÊÄpʽpʶpʯpʨpÊ¡pÊšpÊ“pÊŒpÊ…pÊ~pÊwpÊppÊipÊbpÊ[pÊTpÊMpÊFpÊ?pÊ8pÊ1pÊ*pÊ#pÊpÊpÊpÊpÊpÊùoÊòoÊëoÊäoÊÝoÊÖoÊÏoÊÈoÊÁoʺoʳoʬoÊ¥oÊžoÊ—oÊoʉoÊ‚oÊ{oÊtoÊmoÊfoÊ_oÊXoÊQoÊJoÊCoÊkÊ7kÊ0kÊ)kÊ"kÊkÊkÊ kÊkÊÿjÊøjÊñjÊêjÊãjÊÜjÊÕjÊÎjÊÇjÊÀjʹjʲjÊ«jʤjÊjÊ–jÊjʈjÊjÊzjÊsjÊljÊejÊ^jÊWjÊPjÊIjÊBjÊ;jÊ4jÊ-jÊ&jÊjÊjÊjÊ jÊjÊüiÊõiÊîiÊçiÊàiÊÙiÊÒiÊËiÊÄiʽiʶiʯiʨiÊ¡iÊšiÊ“iÊŒiÊ…iÊ~iÊwiÊpiÊiiÊbiÊ[iÊTiÊMiÊFiÊ?iÊ8iÊ1iÊ*iÊ#iÊiÊiÊiÊiÊiÊùhÊòhÊëhÊähÊÝhÊÖhÊÏhÊÈhÊÁhʺhʳhʬhÊ¥hÊžhÊ—hÊhʉhÊ‚hÊ{hÊthÊmhÊfhÊ_hÊXhÊQhÊJhÊChÊdÊ7dÊ0dÊ)dÊ"dÊdÊdÊ dÊdÊÿcÊøcÊñcÊêcÊãcÊÜcÊÕcÊÎcÊÇcÊÀcʹcʲcÊ«cʤcÊcÊ–cÊcʈcÊcÊzcÊscÊlcÊecÊ^cÊWcÊPcÊIcÊBcÊ;cÊ4cÊ-cÊ&cÊcÊcÊcÊ cÊcÊübÊõbÊîbÊçbÊàbÊÙbÊÒbÊËbÊÄbʽbʶbʯbʨbÊ¡bÊšbÊ“bÊŒbÊ…bÊ~bÊwbÊpbÊibÊbbÊ[bÊTbÊMbÊFbÊ?bÊ8bÊ1bÊ*bÊ#bÊbÊbÊbÊbÊbÊùaÊòaÊëaÊäaÊÝaÊÖaÊÏaÊÈaÊÁaʺaʳaʬaÊ¥aÊžaÊ—aÊaʉaÊ‚aÊ{aÊtaÊmaÊfaÊ_aÊXaÊQaÊJaÊCaÊ]Ê7]Ê0]Ê)]Ê"]Ê]Ê]Ê ]Ê]Êÿ\Êø\Êñ\Êê\Êã\ÊÜ\ÊÕ\ÊÎ\ÊÇ\ÊÀ\ʹ\ʲ\Ê«\ʤ\Ê\Ê–\Ê\ʈ\Ê\Êz\Ês\Êl\Êe\Ê^\ÊW\ÊP\ÊI\ÊB\Ê;\Ê4\Ê-\Ê&\Ê\Ê\Ê\Ê \Ê\Êü[Êõ[Êî[Êç[Êà[ÊÙ[ÊÒ[ÊË[ÊÄ[ʽ[ʶ[ʯ[ʨ[Ê¡[Êš[Ê“[ÊŒ[Ê…[Ê~[Êw[Êp[Êi[Êb[Ê[[ÊT[ÊM[ÊF[Ê?[Ê8[Ê1[Ê*[Ê#[Ê[Ê[Ê[Ê[Ê[ÊùZÊòZÊëZÊäZÊÝZÊÖZÊÏZÊÈZÊÁZʺZʳZʬZÊ¥ZÊžZÊ—ZÊZʉZÊ‚ZÊ{ZÊtZÊmZÊfZÊ_ZÊXZÊQZÊJZÊCZÊVÊ7VÊ0VÊ)VÊ"VÊVÊVÊ VÊVÊÿUÊøUÊñUÊêUÊãUÊÜUÊÕUÊÎUÊÇUÊÀUʹUʲUÊ«UʤUÊUÊ–UÊUʈUÊUÊzUÊsUÊlUÊeUÊ^UÊWUÊPUÊIUÊBUÊ;UÊ4UÊ-UÊ&UÊUÊUÊUÊ UÊUÊüTÊõTÊîTÊçTÊàTÊÙTÊÒTÊËTÊÄTʽTʶTʯTʨTÊ¡TÊšTÊ“TÊŒTÊ…TÊ~TÊwTÊpTÊiTÊbTÊ[TÊTTÊMTÊFTÊ?TÊ8TÊ1TÊ*TÊ#TÊTÊTÊTÊTÊTÊùSÊòSÊëSÊäSÊÝSÊÖSÊÏSÊÈSÊÁSʺSʳSʬSÊ¥SÊžSÊ—SÊSʉSÊ‚SÊ{SÊtSÊmSÊfSÊ_SÊXSÊQSÊJSÊCSÊOÊ7OÊ0OÊ)OÊ"OÊOÊOÊ OÊOÊÿNÊøNÊñNÊêNÊãNÊÜNÊÕNÊÎNÊÇNÊÀNʹNʲNÊ«NʤNÊNÊ–NÊNʈNÊNÊzNÊsNÊlNÊeNÊ^NÊWNÊPNÊINÊBNÊ;NÊ4NÊ-NÊ&NÊNÊNÊNÊ NÊNÊüMÊõMÊîMÊçMÊàMÊÙMÊÒMÊËMÊÄMʽMʶMʯMʨMÊ¡MÊšMÊ“MÊŒMÊ…MÊ~MÊwMÊpMÊiMÊbMÊ[MÊTMÊMMÊFMÊ?MÊ8MÊ1MÊ*MÊ#MÊMÊMÊMÊMÊMÊùLÊòLÊëLÊäLÊÝLÊÖLÊÏLÊÈLÊÁLʺLʳLʬLÊ¥LÊžLÊ—LÊLʉLÊ‚LÊ{LÊtLÊmLÊfLÊ_LÊXLÊQLÊJLÊCLÊHÊ7HÊ0HÊ)HÊ"HÊHÊHÊ HÊHÊÿGÊøGÊñGÊêGÊãGÊÜGÊÕGÊÎGÊÇGÊÀGʹGʲGÊ«GʤGÊGÊ–GÊGʈGÊGÊzGÊsGÊlGÊeGÊ^GÊWGÊPGÊIGÊBGÊ;GÊ4GÊ-GÊ&GÊGÊGÊGÊ GÊGÊüFÊõFÊîFÊçFÊàFÊÙFÊÒFÊËFÊÄFʽFʶFʯFʨFÊ¡FÊšFÊ“FÊŒFÊ…FÊ~FÊwFÊpFÊiFÊbFÊ[FÊTFÊMFÊFFÊ?FÊ8FÊ1FÊ*FÊ#FÊFÊFÊFÊFÊFÊùEÊòEÊëEÊäEÊÝEÊÖEÊÏEÊÈEÊÁEʺEʳEʬEÊ¥EÊžEÊ—EÊEʉEÊ‚EÊ{EÊtEÊmEÊfEÊ_EÊXEÊQEÊJEÊCEÊAÊ7AÊ0AÊ)AÊ"AÊAÊAÊ AÊAÊÿ@Êø@Êñ@Êê@Êã@ÊÜ@ÊÕ@ÊÎ@ÊÇ@ÊÀ@ʹ@ʲ@Ê«@ʤ@Ê@Ê–@Ê@ʈ@Ê@Êz@Ês@Êl@Êe@Ê^@ÊW@ÊP@ÊI@ÊB@Ê;@Ê4@Ê-@Ê&@Ê@Ê@Ê@Ê @Ê@Êü?Êõ?Êî?Êç?Êà?ÊÙ?ÊÒ?ÊË?ÊÄ?ʽ?ʶ?ʯ?ʨ?Ê¡?Êš?Ê“?ÊŒ?Ê…?Ê~?Êw?Êp?Êi?Êb?Ê[?ÊT?ÊM?ÊF?Ê??Ê8?Ê1?Ê*?Ê#?Ê?Ê?Ê?Ê?Ê?Êù>Êò>Êë>Êä>ÊÝ>ÊÖ>ÊÏ>ÊÈ>ÊÁ>ʺ>ʳ>ʬ>Ê¥>Êž>Ê—>Ê>ʉ>Ê‚>Ê{>Êt>Êm>Êf>Ê_>ÊX>ÊQ>ÊJ>ÊC>Ê<>Ê5>Ê.>Ê'>Ê >Ê>Ê>Ê >Ê>Êý=Êö=Êï=Êè=Êá=ÊÚ=ÊÓ=ÊÌ=ÊÅ=ʾ=Ê·=ʰ=Ê©=Ê¢=Ê›=Ê”=Ê=ʆ=Ê=Êx=Êq=Êj=Êc=Ê\=ÊU=ÊN=ÊG=Ê@=Ê9=Ê2=Ê+=Ê$=Ê=Ê=Ê=Ê=Ê=Êú<Êó<Êì<Êå<ÊÞ<Ê×<ÊÐ<ÊÉ<ÊÂ<Ê»<Ê´<Ê­<ʦ<ÊŸ<ʘ<Ê‘<ÊŠ<ʃ<Ê|<Êu<Ên<Êg<Ê`<ÊY<ÊR<ÊK<ÊD<Ê=<Ê6<Ê/<Ê(<Ê!<Ê<Ê<Ê <Ê<Êþ;Ê÷;Êð;Êé;Êâ;ÊÛ;ÊÔ;ÊÍ;ÊÆ;Ê¿;ʸ;ʱ;ʪ;Ê£;Êœ;Ê•;ÊŽ;ʇ;Ê€;Êy;Êr;Êk;Êd;Ê];ÊV;ÊO;ÊH;ÊA;Ê:;Ê3;Ê,;Ê%;Ê;Ê;Ê;Ê ;Ê;Êû:Êô:Êí:Êæ:Êß:ÊØ:ÊÑ:ÊÊ:ÊÃ:ʼ:ʵ:Ê®:ʧ:Ê :Ê™:Ê’:Ê‹:Ê„:Ê}:Êv:Êo:Êh:Êa:ÊZ:ÊS:ÊL:ÊE:Ê>:Ê7:Ê0:Ê):Ê":Ê:Ê:Ê :Ê:Êÿ9Êø9Êñ9Êê9Êã9ÊÜ9ÊÕ9ÊÎ9ÊÇ9ÊÀ9ʹ9ʲ9Ê«9ʤ9Ê9Ê–9Ê9ʈ9Ê9Êz9Ês9Êl9Êe9Ê^9ÊW9ÊP9ÊI9ÊB9Ê;9Ê49Ê-9Ê&9Ê9Ê9Ê9Ê 9Ê9Êü8Êõ8Êî8Êç8Êà8ÊÙ8ÊÒ8ÊË8ÊÄ8ʽ8ʶ8ʯ8ʨ8Ê¡8Êš8Ê“8ÊŒ8Ê…8Ê~8Êw8Êp8Êi8Êb8Ê[8ÊT8ÊM8ÊF8Ê?8Ê88Ê18Ê*8Ê#8Ê8Ê8Ê8Ê8Ê8Êù7Êò7Êë7Êä7ÊÝ7ÊÖ7ÊÏ7ÊÈ7ÊÁ7ʺ7ʳ7ʬ7Ê¥7Êž7Ê—7Ê7ʉ7Ê‚7Ê{7Êt7Êm7Êf7Ê_7ÊX7ÊQ7ÊJ7ÊC7Ê<7Ê57Ê.7Ê'7Ê 7Ê7Ê7Ê 7Ê7Êý6Êö6Êï6Êè6Êá6ÊÚ6ÊÓ6ÊÌ6ÊÅ6ʾ6Ê·6ʰ6Ê©6Ê¢6Ê›6Ê”6Ê6ʆ6Ê6Êx6Êq6Êj6Êc6Ê\6ÊU6ÊN6ÊG6Ê@6Ê96Ê26Ê+6Ê$6Ê6Ê6Ê6Ê6Ê6Êú5Êó5Êì5Êå5ÊÞ5Ê×5ÊÐ5ÊÉ5ÊÂ5Ê»5Ê´5Ê­5ʦ5ÊŸ5ʘ5Ê‘5ÊŠ5ʃ5Ê|5Êu5Ên5Êg5Ê`5ÊY5ÊR5ÊK5ÊD5Ê=5Ê65Ê/5Ê(5Ê!5Ê5Ê5Ê 5Ê5Êþ4Ê÷4Êð4Êé4Êâ4ÊÛ4ÊÔ4ÊÍ4ÊÆ4Ê¿4ʸ4ʱ4ʪ4Ê£4Êœ4Ê•4ÊŽ4ʇ4Ê€4Êy4Êr4Êk4Êd4Ê]4ÊV4ÊO4ÊH4ÊA4Ê:4Ê34Ê,4Ê%4Ê4Ê4Ê4Ê 4Ê4Êû3Êô3Êí3Êæ3Êß3ÊØ3ÊÑ3ÊÊ3ÊÃ3ʼ3ʵ3Ê®3ʧ3Ê 3Ê™3Ê’3Ê‹3Ê„3Ê}3Êv3Êo3Êh3Êa3ÊZ3ÊS3ÊL3ÊE3Ê>3Ê73Ê03Ê)3Ê"3Ê3Ê3Ê 3Ê3Êÿ2Êø2Êñ2Êê2Êã2ÊÜ2ÊÕ2ÊÎ2ÊÇ2ÊÀ2ʹ2ʲ2Ê«2ʤ2Ê2Ê–2Ê2ʈ2Ê2Êz2Ês2Êl2Êe2Ê^2ÊW2ÊP2ÊI2ÊB2Ê;2Ê42Ê-2Ê&2Ê2Ê2Ê2Ê 2Ê2Êü1Êõ1Êî1Êç1Êà1ÊÙ1ÊÒ1ÊË1ÊÄ1ʽ1ʶ1ʯ1ʨ1Ê¡1Êš1Ê“1ÊŒ1Ê…1Ê~1Êw1Êp1Êi1Êb1Ê[1ÊT1ÊM1ÊF1Ê?1Ê81Ê11Ê*1Ê#1Ê1Ê1Ê1Ê1Ê1Êù0Êò0Êë0Êä0ÊÝ0ÊÖ0ÊÏ0ÊÈ0ÊÁ0ʺ0ʳ0ʬ0Ê¥0Êž0Ê—0Ê0ʉ0Ê‚0Ê{0Êt0Êm0Êf0Ê_0ÊX0ÊQ0ÊJ0ÊC0Ê<0Ê50Ê.0Ê'0Ê 0Ê0Ê0Ê 0Ê0Êý/Êö/Êï/Êè/Êá/ÊÚ/ÊÓ/ÊÌ/ÊÅ/ʾ/Ê·/ʰ/Ê©/Ê¢/Ê›/Ê”/Ê/ʆ/Ê/Êx/Êq/Êj/Êc/Ê\/ÊU/ÊN/ÊG/Ê@/Ê9/Ê2/Ê+/Ê$/Ê/Ê/Ê/Ê/Ê/Êú.Êó.Êì.Êå.ÊÞ.Ê×.ÊÐ.ÊÉ.ÊÂ.Ê».Ê´.Ê­.ʦ.ÊŸ.ʘ.Ê‘.ÊŠ.ʃ.Ê|.Êu.Ên.Êg.Ê`.ÊY.ÊR.ÊK.ÊD.Ê=.Ê6.Ê/.Ê(.Ê!.Ê.Ê.Ê .Ê.Êþ-Ê÷-Êð-Êé-Êâ-ÊÛ-ÊÔ-ÊÍ-ÊÆ-Ê¿-ʸ-ʱ-ʪ-Ê£-Êœ-Ê•-ÊŽ-ʇ-Ê€-Êy-Êr-Êk-Êd-Ê]-ÊV-ÊO-ÊH-ÊA-Ê:-Ê3-Ê,-Ê%-Ê-Ê-Ê-Ê -Ê-Êû,Êô,Êí,Êæ,Êß,ÊØ,ÊÑ,ÊÊ,ÊÃ,ʼ,ʵ,Ê®,ʧ,Ê ,Ê™,Ê’,Ê‹,Ê„,Ê},Êv,Êo,Êh,Êa,ÊZ,ÊS,ÊL,ÊE,Ê>,Ê7,Ê0,Ê),Ê",Ê,Ê,Ê ,Ê,Êÿ+Êø+Êñ+Êê+Êã+ÊÜ+ÊÕ+ÊÎ+ÊÇ+ÊÀ+ʹ+ʲ+Ê«+ʤ+Ê+Ê–+Ê+ʈ+Ê+Êz+Ês+Êl+Êe+Ê^+ÊW+ÊP+ÊI+ÊB+Ê;+Ê4+Ê-+Ê&+Ê+Ê+Ê+Ê +Ê+Êü*Êõ*Êî*Êç*Êà*ÊÙ*ÊÒ*ÊË*ÊÄ*ʽ*ʶ*ʯ*ʨ*Ê¡*Êš*Ê“*ÊŒ*Ê…*Ê~*Êw*Êp*Êi*Êb*Ê[*ÊT*ÊM*ÊF*Ê?*Ê8*Ê1*Ê**Ê#*Ê*Ê*Ê*Ê*Ê*Êù)Êò)Êë)Êä)ÊÝ)ÊÖ)ÊÏ)ÊÈ)ÊÁ)ʺ)ʳ)ʬ)Ê¥)Êž)Ê—)Ê)ʉ)Ê‚)Ê{)Êt)Êm)Êf)Ê_)ÊX)ÊQ)ÊJ)ÊC)Ê<)Ê5)Ê.)Ê')Ê )Ê)Ê)Ê )Ê)Êý(Êö(Êï(Êè(Êá(ÊÚ(ÊÓ(ÊÌ(ÊÅ(ʾ(Ê·(ʰ(Ê©(Ê¢(Ê›(Ê”(Ê(ʆ(Ê(Êx(Êq(Êj(Êc(Ê\(ÊU(ÊN(ÊG(Ê@(Ê9(Ê2(Ê+(Ê$(Ê(Ê(Ê(Ê(Ê(Êú'Êó'Êì'Êå'ÊÞ'Ê×'ÊÐ'ÊÉ'ÊÂ'Ê»'Ê´'Ê­'ʦ'ÊŸ'ʘ'Ê‘'ÊŠ'ʃ'Ê|'Êu'Ên'Êg'Ê`'ÊY'ÊR'ÊK'ÊD'Ê='Ê6'Ê/'Ê('Ê!'Ê'Ê'Ê 'Ê'Êþ&Ê÷&Êð&Êé&Êâ&ÊÛ&ÊÔ&ÊÍ&ÊÆ&Ê¿&ʸ&ʱ&ʪ&Ê£&Êœ&Ê•&ÊŽ&ʇ&Ê€&Êy&Êr&Êk&Êd&Ê]&ÊV&ÊO&ÊH&ÊA&Ê:&Ê3&Ê,&Ê%&Ê&Ê&Ê&Ê &Ê&Êû%Êô%Êí%Êæ%Êß%ÊØ%ÊÑ%ÊÊ%ÊÃ%ʼ%ʵ%Ê®%ʧ%Ê %Ê™%Ê’%Ê‹%Ê„%Ê}%Êv%Êo%Êh%Êa%ÊZ%ÊS%ÊL%ÊE%Ê>%Ê7%Ê0%Ê)%Ê"%Ê%Ê%Ê %Ê%Êÿ$Êø$Êñ$Êê$Êã$ÊÜ$ÊÕ$ÊÎ$ÊÇ$ÊÀ$ʹ$ʲ$Ê«$ʤ$Ê$Ê–$Ê$ʈ$Ê$Êz$Ês$Êl$Êe$Ê^$ÊW$ÊP$ÊI$ÊB$Ê;$Ê4$Ê-$Ê&$Ê$Ê$Ê$Ê $Ê$Êü#Êõ#Êî#Êç#Êà#ÊÙ#ÊÒ#ÊË#ÊÄ#ʽ#ʶ#ʯ#ʨ#Ê¡#Êš#Ê“#ÊŒ#Ê…#Ê~#Êw#Êp#Êi#Êb#Ê[#ÊT#ÊM#ÊF#Ê?#Ê8#Ê1#Ê*#Ê##Ê#Ê#Ê#Ê#Ê#Êù"Êò"Êë"Êä"ÊÝ"ÊÖ"ÊÏ"ÊÈ"ÊÁ"ʺ"ʳ"ʬ"Ê¥"Êž"Ê—"Ê"ʉ"Ê‚"Ê{"Êt"Êm"Êf"Ê_"ÊX"ÊQ"ÊJ"ÊC"Ê<"Ê5"Ê."Ê'"Ê "Ê"Ê"Ê "Ê"Êý!Êö!Êï!Êè!Êá!ÊÚ!ÊÓ!ÊÌ!ÊÅ!ʾ!Ê·!ʰ!Ê©!Ê¢!Ê›!Ê”!Ê!ʆ!Ê!Êx!Êq!Êj!Êc!Ê\!ÊU!ÊN!ÊG!Ê@!Ê9!Ê2!Ê+!Ê$!Ê!Ê!Ê!Ê!Ê!Êú Êó Êì Êå ÊÞ Ê× ÊÐ ÊÉ Ê Ê» Ê´ Ê­ ʦ ÊŸ ʘ Ê‘ ÊŠ ʃ Ê| Êu Ên Êg Ê` ÊY ÊR ÊK ÊD Ê= Ê6 Ê/ Ê( Ê! Ê Ê Ê Ê ÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊù Êò Êë Êä ÊÝ ÊÖ ÊÏ ÊÈ ÊÁ ʺ ʳ ʬ Ê¥ Êž Ê— Ê Ê‰ Ê‚ Ê{ Êt Êm Êf Ê_ ÊX ÊQ ÊJ ÊC Ê< Ê5 Ê. Ê' Ê Ê Ê Ê Ê Êý Êö Êï Êè Êá ÊÚ ÊÓ ÊÌ ÊŠʾ Ê· ʰ Ê© Ê¢ Ê› Ê” Ê Ê† Ê Êx Êq Êj Êc Ê\ ÊU ÊN ÊG Ê@ Ê9 Ê2 Ê+ Ê$ Ê Ê Ê Ê Ê Êú Êó Êì Êå ÊÞ Ê× ÊÐ ÊÉ Ê Ê» Ê´ Ê­ ʦ ÊŸ ʘ Ê‘ ÊŠ ʃ Ê| Êu Ên Êg Ê` ÊY ÊR ÊK ÊD Ê= Ê6 Ê/ Ê( Ê! Ê Ê Ê Ê Êþ Ê÷ Êð Êé Êâ ÊÛ ÊÔ ÊÍ ÊÆ Ê¿ ʸ ʱ ʪ Ê£ Êœ Ê• ÊŽ ʇ Ê€ Êy Êr Êk Êd Ê] ÊV ÊO ÊH ÊA Ê: Ê3 Ê, Ê% Ê Ê Ê Ê Ê Êû Êô Êí Êæ Êß ÊØ ÊÑ ÊÊ Êà ʼ ʵ Ê® ʧ Ê  Ê™ Ê’ Ê‹ Ê„ Ê} Êv Êo Êh Êa ÊZ ÊS ÊL ÊE Ê> Ê7 Ê0 Ê) Ê" Ê Ê Ê Ê ÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÿÉòÿÉëÿÉäÿÉÝÿÉÖÿÉÏÿÉÈÿÉÁÿɺÿɳÿɬÿÉ¥ÿÉžÿÉ—ÿÉÿɉÿÉ‚ÿÉ{ÿÉtÿÉmÿÉfÿÉ_ÿÉXÿÉQÿÉJÿÉCÿÉ<ÿÉ5ÿÉ.ÿÉ'ÿÉ ÿÉÿÉÿÉ ÿÉÿÉýþÉöþÉïþÉèþÉáþÉÚþÉÓþÉÌþÉÅþɾþÉ·þɰþÉ©þÉ¢þÉ›þÉ”þÉþɆþÉþÉxþÉqþÉjþÉcþÉ\þÉUþÉNþÉGþÉ@þÉ9þÉ2þÉ+þÉ$þÉþÉþÉþÉþÉþÉúýÉóýÉìýÉåýÉÞýÉ×ýÉÐýÉÉýÉÂýÉ»ýÉ´ýÉ­ýɦýÉŸýɘýÉ‘ýÉŠýɃýÉ|ýÉuýÉnýÉgýÉ`ýÉYýÉRýÉKýÉDýÉ=ýÉ6ýÉ/ýÉ(ýÉ!ýÉýÉýÉ ýÉýÉþüÉ÷üÉðüÉéüÉâüÉÛüÉÔüÉÍüÉÆüÉ¿üɸüɱüɪüÉ£üÉœüÉ•üÉŽüɇüÉ€üÉyüÉrüÉküÉdüÉ]üÉVüÉOüÉHüÉAüÉ:üÉ3üÉ,üÉ%üÉüÉüÉüÉ üÉüÉûûÉôûÉíûÉæûÉßûÉØûÉÑûÉÊûÉÃûɼûɵûÉ®ûɧûÉ ûÉ™ûÉ’ûÉ‹ûÉ„ûÉ}ûÉvûÉoûÉhûÉaûÉZûÉSûÉLûÉEûÉ>ûÉ7ûÉ0ûÉ)ûÉ"ûÉûÉûÉ ûÉûÉÿúÉøúÉñúÉêúÉãúÉÜúÉÕúÉÎúÉÇúÉÀúɹúɲúÉ«úɤúÉúÉ–úÉúɈúÉúÉzúÉsúÉlúÉeúÉ^úÉWúÉPúÉIúÉBúÉ;úÉ4úÉ-úÉ&úÉúÉúÉúÉ úÉúÉüùÉõùÉîùÉçùÉàùÉÙùÉÒùÉËùÉÄùɽùɶùɯùɨùÉ¡ùÉšùÉ“ùÉŒùÉ…ùÉ~ùÉwùÉpùÉiùÉbùÉ[ùÉTùÉMùÉFùÉ?ùÉ8ùÉ1ùÉ*ùÉ#ùÉùÉùÉùÉùÉùÉùøÉòøÉëøÉäøÉÝøÉÖøÉÏøÉÈøÉÁøÉºøÉ³øÉ¬øÉ¥øÉžøÉ—øÉøÉ‰øÉ‚øÉ{øÉtøÉmøÉføÉ_øÉXøÉQøÉJøÉCøÉ<øÉ5øÉ.øÉ'øÉ øÉøÉøÉ øÉøÉý÷Éö÷Éï÷Éè÷Éá÷ÉÚ÷ÉÓ÷ÉÌ÷ÉÅ÷ɾ÷É·÷ɰ÷É©÷É¢÷É›÷É”÷É÷Ɇ÷É÷Éx÷Éq÷Éj÷Éc÷É\÷ÉU÷ÉN÷ÉG÷É@÷É9÷É2÷É+÷É$÷É÷É÷É÷É÷É÷ÉúöÉóöÉìöÉåöÉÞöÉ×öÉÐöÉÉöÉÂöÉ»öÉ´öÉ­öɦöÉŸöɘöÉ‘öÉŠöɃöÉ|öÉuöÉnöÉgöÉ`öÉYöÉRöÉKöÉDöÉ=öÉ6öÉ/öÉ(öÉ!öÉöÉöÉ öÉöÉþõÉ÷õÉðõÉéõÉâõÉÛõÉÔõÉÍõÉÆõÉ¿õɸõɱõɪõÉ£õÉœõÉ•õÉŽõɇõÉ€õÉyõÉrõÉkõÉdõÉ]õÉVõÉOõÉHõÉAõÉ:õÉ3õÉ,õÉ%õÉõÉõÉõÉ õÉõÉûôÉôôÉíôÉæôÉßôÉØôÉÑôÉÊôÉÃôɼôɵôÉ®ôɧôÉ ôÉ™ôÉ’ôÉ‹ôÉ„ôÉ}ôÉvôÉoôÉhôÉaôÉZôÉSôÉLôÉEôÉ>ôÉ7ôÉ0ôÉ)ôÉ"ôÉôÉôÉ ôÉôÉÿóÉøóÉñóÉêóÉãóÉÜóÉÕóÉÎóÉÇóÉÀóɹóɲóÉ«óɤóÉóÉ–óÉóɈóÉóÉzóÉsóÉlóÉeóÉ^óÉWóÉPóÉIóÉBóÉ;óÉ4óÉ-óÉ&óÉóÉóÉóÉ óÉóÉüòÉõòÉîòÉçòÉàòÉÙòÉÒòÉËòÉÄòɽòɶòɯòɨòÉ¡òÉšòÉ“òÉŒòÉ…òÉ~òÉwòÉpòÉiòÉbòÉ[òÉTòÉMòÉFòÉ?òÉ8òÉ1òÉ*òÉ#òÉòÉòÉòÉòÉòÉùñÉòñÉëñÉäñÉÝñÉÖñÉÏñÉÈñÉÁñɺñɳñɬñÉ¥ñÉžñÉ—ñÉñɉñÉ‚ñÉ{ñÉtñÉmñÉfñÉ_ñÉXñÉQñÉJñÉCñÉ<ñÉ5ñÉ.ñÉ'ñÉ ñÉñÉñÉ ñÉñÉýðÉöðÉïðÉèðÉáðÉÚðÉÓðÉÌðÉÅðɾðÉ·ðɰðÉ©ðÉ¢ðÉ›ðÉ”ðÉðɆðÉðÉxðÉqðÉjðÉcðÉ\ðÉUðÉNðÉGðÉ@ðÉ9ðÉ2ðÉ+ðÉ$ðÉðÉðÉðÉðÉðÉúïÉóïÉìïÉåïÉÞïÉ×ïÉÐïÉÉïÉÂïÉ»ïÉ´ïÉ­ïɦïÉŸïɘïÉ‘ïÉŠïɃïÉ|ïÉuïÉnïÉgïÉ`ïÉYïÉRïÉKïÉDïÉ=ïÉ6ïÉ/ïÉ(ïÉ!ïÉïÉïÉ ïÉïÉþîÉ÷îÉðîÉéîÉâîÉÛîÉÔîÉÍîÉÆîÉ¿îɸîɱîɪîÉ£îÉœîÉ•îÉŽîɇîÉ€îÉyîÉrîÉkîÉdîÉ]îÉVîÉOîÉHîÉAîÉ:îÉ3îÉ,îÉ%îÉîÉîÉîÉ îÉîÉûíÉôíÉííÉæíÉßíÉØíÉÑíÉÊíÉÃíɼíɵíÉ®íɧíÉ íÉ™íÉ’íÉ‹íÉ„íÉ}íÉvíÉoíÉhíÉaíÉZíÉSíÉLíÉEíÉ>íÉ7íÉ0íÉ)íÉ"íÉíÉíÉ íÉíÉÿìÉøìÉñìÉêìÉãìÉÜìÉÕìÉÎìÉÇìÉÀìɹìɲìÉ«ìɤìÉìÉ–ìÉìɈìÉìÉzìÉsìÉlìÉeìÉ^ìÉWìÉPìÉIìÉBìÉ;ìÉ4ìÉ-ìÉ&ìÉìÉìÉìÉ ìÉìÉüëÉõëÉîëÉçëÉàëÉÙëÉÒëÉËëÉÄëɽëɶëɯëɨëÉ¡ëÉšëÉ“ëÉŒëÉ…ëÉ~ëÉwëÉpëÉiëÉbëÉ[ëÉTëÉMëÉFëÉ?ëÉ8ëÉ1ëÉ*ëÉ#ëÉëÉëÉëÉëÉëÉùêÉòêÉëêÉäêÉÝêÉÖêÉÏêÉÈêÉÁêɺêɳêɬêÉ¥êÉžêÉ—êÉêɉêÉ‚êÉ{êÉtêÉmêÉfêÉ_êÉXêÉQêÉJêÉCêÉ<êÉ5êÉ.êÉ'êÉ êÉêÉêÉ êÉêÉýéÉöéÉïéÉèéÉáéÉÚéÉÓéÉÌéÉÅéɾéÉ·éɰéÉ©éÉ¢éÉ›éÉ”éÉéɆéÉéÉxéÉqéÉjéÉcéÉ\éÉUéÉNéÉGéÉ@éÉ9éÉ2éÉ+éÉ$éÉéÉéÉéÉéÉéÉúèÉóèÉìèÉåèÉÞèÉ×èÉÐèÉÉèÉÂèÉ»èÉ´èÉ­èɦèÉŸèɘèÉ‘èÉŠèɃèÉ|èÉuèÉnèÉgèÉ`èÉYèÉRèÉKèÉDèÉ=èÉ6èÉ/èÉ(èÉ!èÉèÉèÉ èÉèÉþçÉ÷çÉðçÉéçÉâçÉÛçÉÔçÉÍçÉÆçÉ¿çɸçɱçɪçÉ£çÉœçÉ•çÉŽçɇçÉ€çÉyçÉrçÉkçÉdçÉ]çÉVçÉOçÉHçÉAçÉ:çÉ3çÉ,çÉ%çÉçÉçÉçÉ çÉçÉûæÉôæÉíæÉææÉ߿ɨæÉÑæÉÊæÉÃæÉ¼æÉµæÉ®æÉ§æÉ æÉ™æÉ’æÉ‹æÉ„æÉ}æÉvæÉoæÉhæÉaæÉZæÉSæÉLæÉEæÉ>æÉ7æÉ0æÉ)æÉ"æÉæÉæÉ æÉæÉÿåÉøåÉñåÉêåÉãåÉÜåÉÕåÉÎåÉÇåÉÀåɹåɲåÉ«åɤåÉåÉ–åÉåɈåÉåÉzåÉsåÉlåÉeåÉ^åÉWåÉPåÉIåÉBåÉ;åÉ4åÉ-åÉ&åÉåÉåÉåÉ åÉåÉüäÉõäÉîäÉçäÉàäÉÙäÉÒäÉËäÉÄäɽäɶäɯäɨäÉ¡äÉšäÉ“äÉŒäÉ…äÉ~äÉwäÉpäÉiäÉbäÉ[äÉTäÉMäÉFäÉ?äÉ8äÉ1äÉ*äÉ#äÉäÉäÉäÉäÉäÉùãÉòãÉëãÉäãÉÝãÉÖãÉÏãÉÈãÉÁãɺãɳãɬãÉ¥ãÉžãÉ—ãÉãɉãÉ‚ãÉ{ãÉtãÉmãÉfãÉ_ãÉXãÉQãÉJãÉCãÉ<ãÉ5ãÉ.ãÉ'ãÉ ãÉãÉãÉ ãÉãÉýâÉöâÉïâÉèâÉáâÉÚâÉÓâÉÌâÉÅâɾâÉ·âɰâÉ©âÉ¢âÉ›âÉ”âÉâɆâÉâÉxâÉqâÉjâÉcâÉ\âÉUâÉNâÉGâÉ@âÉ9âÉ2âÉ+âÉ$âÉâÉâÉâÉâÉâÉúáÉóáÉìáÉåáÉÞáÉ×áÉÐáÉÉáÉÂáÉ»áÉ´áÉ­áɦáÉŸáɘáÉ‘áÉŠáɃáÉ|áÉuáÉnáÉgáÉ`áÉYáÉRáÉKáÉDáÉ=áÉ6áÉ/áÉ(áÉ!áÉáÉáÉ áÉáÉþàÉ÷àÉðàÉéàÉâàÉÛàÉÔàÉÍàÉÆàÉ¿àɸàɱàɪàÉ£àÉœàÉ•àÉŽàɇàÉ€àÉyàÉràÉkàÉdàÉ]àÉVàÉOàÉHàÉAàÉ:àÉ3àÉ,àÉ%àÉàÉàÉàÉ àÉàÉûßÉôßÉíßÉæßÉßßÉØßÉÑßÉÊßÉÃßɼßɵßÉ®ßɧßÉ ßÉ™ßÉ’ßÉ‹ßÉ„ßÉ}ßÉvßÉoßÉhßÉaßÉZßÉSßÉLßÉEßÉ>ßÉ7ßÉ0ßÉ)ßÉ"ßÉßÉßÉ ßÉßÉÿÞÉøÞÉñÞÉêÞÉãÞÉÜÞÉÕÞÉÎÞÉÇÞÉÀÞɹÞɲÞÉ«ÞɤÞÉÞÉ–ÞÉÞɈÞÉÞÉzÞÉsÞÉlÞÉeÞÉ^ÞÉWÞÉPÞÉIÞÉBÞÉ;ÞÉ4ÞÉ-ÞÉ&ÞÉÞÉÞÉÞÉ ÞÉÞÉüÝÉõÝÉîÝÉçÝÉàÝÉÙÝÉÒÝÉËÝÉÄÝɽÝɶÝɯÝɨÝÉ¡ÝÉšÝÉ“ÝÉŒÝÉ…ÝÉ~ÝÉwÝÉpÝÉiÝÉbÝÉ[ÝÉTÝÉMÝÉFÝÉ?ÝÉ8ÝÉ1ÝÉ*ÝÉ#ÝÉÝÉÝÉÝÉÝÉÝÉùÜÉòÜÉëÜÉäÜÉÝÜÉÖÜÉÏÜÉÈÜÉÁÜɺÜɳÜɬÜÉ¥ÜÉžÜÉ—ÜÉÜɉÜÉ‚ÜÉ{ÜÉtÜÉmÜÉfÜÉ_ÜÉXÜÉQÜÉJÜÉCÜÉ<ÜÉ5ÜÉ.ÜÉ'ÜÉ ÜÉÜÉÜÉ ÜÉÜÉýÛÉöÛÉïÛÉèÛÉáÛÉÚÛÉÓÛÉÌÛÉÅÛɾÛÉ·ÛɰÛÉ©ÛÉ¢ÛÉ›ÛÉ”ÛÉÛɆÛÉÛÉxÛÉqÛÉjÛÉcÛÉ\ÛÉUÛÉNÛÉGÛÉ@ÛÉ9ÛÉ2ÛÉ+ÛÉ$ÛÉÛÉÛÉÛÉÛÉÛÉúÚÉóÚÉìÚÉåÚÉÞÚÉ×ÚÉÐÚÉÉÚÉÂÚÉ»ÚÉ´ÚÉ­ÚɦÚÉŸÚɘÚÉ‘ÚÉŠÚɃÚÉ|ÚÉuÚÉnÚÉgÚÉ`ÚÉYÚÉRÚÉKÚÉDÚÉ=ÚÉ6ÚÉ/ÚÉ(ÚÉ!ÚÉÚÉÚÉ ÚÉÚÉþÙÉ÷ÙÉðÙÉéÙÉâÙÉÛÙÉÔÙÉÍÙÉÆÙÉ¿ÙɸÙɱÙɪÙÉ£ÙÉœÙÉ•ÙÉŽÙɇÙÉ€ÙÉyÙÉrÙÉkÙÉdÙÉ]ÙÉVÙÉOÙÉHÙÉAÙÉ:ÙÉ3ÙÉ,ÙÉ%ÙÉÙÉÙÉÙÉ ÙÉÙÉûØÉôØÉíØÉæØÉߨÉØØÉÑØÉÊØÉÃØÉ¼ØÉµØÉ®ØÉ§ØÉ ØÉ™ØÉ’ØÉ‹ØÉ„ØÉ}ØÉvØÉoØÉhØÉaØÉZØÉSØÉLØÉEØÉ>ØÉ7ØÉ0ØÉ)ØÉ"ØÉØÉØÉ ØÉØÉÿ×Éø×Éñ×Éê×Éã×ÉÜ×ÉÕ×ÉÎ×ÉÇ×ÉÀ×ɹ×ɲ×É«×ɤ×É×É–×É×Ɉ×É×Éz×És×Él×Ée×É^×ÉW×ÉP×ÉI×ÉB×É;×É4×É-×É&×É×É×É×É ×É×ÉüÖÉõÖÉîÖÉçÖÉàÖÉÙÖÉÒÖÉËÖÉÄÖɽÖɶÖɯÖɨÖÉ¡ÖÉšÖÉ“ÖÉŒÖÉ…ÖÉ~ÖÉwÖÉpÖÉiÖÉbÖÉ[ÖÉTÖÉMÖÉFÖÉ?ÖÉ8ÖÉ1ÖÉ*ÖÉ#ÖÉÖÉÖÉÖÉÖÉÖÉùÕÉòÕÉëÕÉäÕÉÝÕÉÖÕÉÏÕÉÈÕÉÁÕɺÕɳÕɬÕÉ¥ÕÉžÕÉ—ÕÉÕɉÕÉ‚ÕÉ{ÕÉtÕÉmÕÉfÕÉ_ÕÉXÕÉQÕÉJÕÉCÕÉ<ÕÉ5ÕÉ.ÕÉ'ÕÉ ÕÉÕÉÕÉ ÕÉÕÉýÔÉöÔÉïÔÉèÔÉáÔÉÚÔÉÓÔÉÌÔÉÅÔɾÔÉ·ÔɰÔÉ©ÔÉ¢ÔÉ›ÔÉ”ÔÉÔɆÔÉÔÉxÔÉqÔÉjÔÉcÔÉ\ÔÉUÔÉNÔÉGÔÉ@ÔÉ9ÔÉ2ÔÉ+ÔÉ$ÔÉÔÉÔÉÔÉÔÉÔÉúÓÉóÓÉìÓÉåÓÉÞÓÉ×ÓÉÐÓÉÉÓÉÂÓÉ»ÓÉ´ÓÉ­ÓɦÓÉŸÓɘÓÉ‘ÓÉŠÓɃÓÉ|ÓÉuÓÉnÓÉgÓÉ`ÓÉYÓÉRÓÉKÓÉDÓÉ=ÓÉ6ÓÉ/ÓÉ(ÓÉ!ÓÉÓÉÓÉ ÓÉÓÉþÒÉ÷ÒÉðÒÉéÒÉâÒÉÛÒÉÔÒÉÍÒÉÆÒÉ¿ÒɸÒɱÒɪÒÉ£ÒÉœÒÉ•ÒÉŽÒɇÒÉ€ÒÉyÒÉrÒÉkÒÉdÒÉ]ÒÉVÒÉOÒÉHÒÉAÒÉ:ÒÉ3ÒÉ,ÒÉ%ÒÉÒÉÒÉÒÉ ÒÉÒÉûÑÉôÑÉíÑÉæÑÉßÑÉØÑÉÑÑÉÊÑÉÃÑɼÑɵÑÉ®ÑɧÑÉ ÑÉ™ÑÉ’ÑÉ‹ÑÉ„ÑÉ}ÑÉvÑÉoÑÉhÑÉaÑÉZÑÉSÑÉLÑÉEÑÉ>ÑÉ7ÑÉ0ÑÉ)ÑÉ"ÑÉÑÉÑÉ ÑÉÑÉÿÐÉøÐÉñÐÉêÐÉãÐÉÜÐÉÕÐÉÎÐÉÇÐÉÀÐɹÐɲÐÉ«ÐɤÐÉÐÉ–ÐÉÐɈÐÉÐÉzÐÉsÐÉlÐÉeÐÉ^ÐÉWÐÉPÐÉIÐÉBÐÉ;ÐÉ4ÐÉ-ÐÉ&ÐÉÐÉÐÉÐÉ ÐÉÐÉüÏÉõÏÉîÏÉçÏÉàÏÉÙÏÉÒÏÉËÏÉÄÏɽÏɶÏɯÏɨÏÉ¡ÏÉšÏÉ“ÏÉŒÏÉ…ÏÉ~ÏÉwÏÉpÏÉiÏÉbÏÉ[ÏÉTÏÉMÏÉFÏÉ?ÏÉ8ÏÉ1ÏÉ*ÏÉ#ÏÉÏÉÏÉÏÉÏÉÏÉùÎÉòÎÉëÎÉäÎÉÝÎÉÖÎÉÏÎÉÈÎÉÁÎɺÎɳÎɬÎÉ¥ÎÉžÎÉ—ÎÉÎɉÎÉ‚ÎÉ{ÎÉtÎÉmÎÉfÎÉ_ÎÉXÎÉQÎÉJÎÉCÎÉ<ÎÉ5ÎÉ.ÎÉ'ÎÉ ÎÉÎÉÎÉ ÎÉÎÉýÍÉöÍÉïÍÉèÍÉáÍÉÚÍÉÓÍÉÌÍÉÅÍɾÍÉ·ÍɰÍÉ©ÍÉ¢ÍÉ›ÍÉ”ÍÉÍɆÍÉÍÉxÍÉqÍÉjÍÉcÍÉ\ÍÉUÍÉNÍÉGÍÉ@ÍÉ9ÍÉ2ÍÉ+ÍÉ$ÍÉÍÉÍÉÍÉÍÉÍÉúÌÉóÌÉìÌÉåÌÉÞÌÉ×ÌÉÐÌÉÉÌÉÂÌÉ»ÌÉ´ÌÉ­ÌɦÌÉŸÌɘÌÉ‘ÌÉŠÌɃÌÉ|ÌÉuÌÉnÌÉgÌÉ`ÌÉYÌÉRÌÉKÌÉDÌÉ=ÌÉ6ÌÉ/ÌÉ(ÌÉ!ÌÉÌÉÌÉ ÌÉÌÉþËÉ÷ËÉðËÉéËÉâËÉÛËÉÔËÉÍËÉÆËÉ¿ËɸËɱËɪËÉ£ËÉœËÉ•ËÉŽËɇËÉ€ËÉyËÉrËÉkËÉdËÉ]ËÉVËÉOËÉHËÉAËÉ:ËÉ3ËÉ,ËÉ%ËÉËÉËÉËÉ ËÉËÉûÊÉôÊÉíÊÉæÊÉßÊÉØÊÉÑÊÉÊÊÉÃÊɼÊɵÊÉ®ÊɧÊÉ ÊÉ™ÊÉ’ÊÉ‹ÊÉ„ÊÉ}ÊÉvÊÉoÊÉhÊÉaÊÉZÊÉSÊÉLÊÉEÊÉ>ÊÉ7ÊÉ0ÊÉ)ÊÉ"ÊÉÊÉÊÉ ÊÉÊÉÿÉÉøÉÉñÉÉêÉÉãÉÉÜÉÉÕÉÉÎÉÉÇÉÉÀÉɹÉɲÉÉ«ÉɤÉÉÉÉ–ÉÉÉɈÉÉÉÉzÉÉsÉÉlÉÉeÉÉ^ÉÉWÉÉPÉÉIÉÉBÉÉ;ÉÉ4ÉÉ-ÉÉ&ÉÉÉÉÉÉÉÉ ÉÉÉÉüÈÉõÈÉîÈÉçÈÉàÈÉÙÈÉÒÈÉËÈÉÄÈɽÈɶÈɯÈɨÈÉ¡ÈÉšÈÉ“ÈÉŒÈÉ…ÈÉ~ÈÉwÈÉpÈÉiÈÉbÈÉ[ÈÉTÈÉMÈÉFÈÉ?ÈÉ8ÈÉ1ÈÉ*ÈÉ#ÈÉÈÉÈÉÈÉÈÉÈÉùÇÉòÇÉëÇÉäÇÉÝÇÉÖÇÉÏÇÉÈÇÉÁÇɺÇɳÇɬÇÉ¥ÇÉžÇÉ—ÇÉÇɉÇÉ‚ÇÉ{ÇÉtÇÉmÇÉfÇÉ_ÇÉXÇÉQÇÉJÇÉCÇÉ<ÇÉ5ÇÉ.ÇÉ'ÇÉ ÇÉÇÉÇÉ ÇÉÇÉýÆÉöÆÉïÆÉèÆÉáÆÉÚÆÉÓÆÉÌÆÉůɾÆÉ·ÆÉ°ÆÉ©ÆÉ¢ÆÉ›ÆÉ”ÆÉÆÉ†ÆÉÆÉxÆÉqÆÉjÆÉcÆÉ\ÆÉUÆÉNÆÉGÆÉ@ÆÉ9ÆÉ2ÆÉ+ÆÉ$ÆÉÆÉÆÉÆÉÆÉÆÉúÅÉóÅÉìÅÉåÅÉÞÅÉ×ÅÉÐÅÉÉÅÉÂÅÉ»ÅÉ´ÅÉ­ÅɦÅÉŸÅɘÅÉ‘ÅÉŠÅɃÅÉ|ÅÉuÅÉnÅÉgÅÉ`ÅÉYÅÉRÅÉKÅÉDÅÉ=ÅÉ6ÅÉ/ÅÉ(ÅÉ!ÅÉÅÉÅÉ ÅÉÅÉþÄÉ÷ÄÉðÄÉéÄÉâÄÉÛÄÉÔÄÉÍÄÉÆÄÉ¿ÄɸÄɱÄɪÄÉ£ÄÉœÄÉ•ÄÉŽÄɇÄÉ€ÄÉyÄÉrÄÉkÄÉdÄÉ]ÄÉVÄÉOÄÉHÄÉAÄÉ:ÄÉ3ÄÉ,ÄÉ%ÄÉÄÉÄÉÄÉ ÄÉÄÉûÃÉôÃÉíÃÉæÃÉßÃÉØÃÉÑÃÉÊÃÉÃÃɼÃɵÃÉ®ÃɧÃÉ ÃÉ™ÃÉ’ÃÉ‹ÃÉ„ÃÉ}ÃÉvÃÉoÃÉhÃÉaÃÉZÃÉSÃÉLÃÉEÃÉ>ÃÉ7ÃÉ0ÃÉ)ÃÉ"ÃÉÃÉÃÉ ÃÉÃÉÿÂÉøÂÉñÂÉêÂÉãÂÉÜÂÉÕÂÉÎÂÉÇÂÉÀÂɹÂɲÂÉ«ÂɤÂÉÂÉ–ÂÉÂɈÂÉÂÉzÂÉsÂÉlÂÉeÂÉ^ÂÉWÂÉPÂÉIÂÉBÂÉ;ÂÉ4ÂÉ-ÂÉ&ÂÉÂÉÂÉÂÉ ÂÉÂÉüÁÉõÁÉîÁÉçÁÉàÁÉÙÁÉÒÁÉËÁÉÄÁɽÁɶÁɯÁɨÁÉ¡ÁÉšÁÉ“ÁÉŒÁÉ…ÁÉ~ÁÉwÁÉpÁÉiÁÉbÁÉ[ÁÉTÁÉMÁÉFÁÉ?ÁÉ8ÁÉ1ÁÉ*ÁÉ#ÁÉÁÉÁÉÁÉÁÉÁÉùÀÉòÀÉëÀÉäÀÉÝÀÉÖÀÉÏÀÉÈÀÉÁÀɺÀɳÀɬÀÉ¥ÀÉžÀÉ—ÀÉÀɉÀÉ‚ÀÉ{ÀÉtÀÉmÀÉfÀÉ_ÀÉXÀÉQÀÉJÀÉCÀÉ<ÀÉ5ÀÉ.ÀÉ'ÀÉ ÀÉÀÉÀÉ ÀÉÀÉý¿Éö¿Éï¿Éè¿Éá¿ÉÚ¿ÉÓ¿ÉÌ¿Éſɾ¿É·¿É°¿É©¿É¢¿É›¿É”¿É¿É†¿É¿Éx¿Éq¿Éj¿Éc¿É\¿ÉU¿ÉN¿ÉG¿É@¿É9¿É2¿É+¿É$¿É¿É¿É¿É¿É¿Éú¾Éó¾Éì¾Éå¾ÉÞ¾É×¾ÉоÉɾɾɻ¾É´¾É­¾É¦¾ÉŸ¾É˜¾É‘¾ÉоɃ¾É|¾Éu¾Én¾Ég¾É`¾ÉY¾ÉR¾ÉK¾ÉD¾É=¾É6¾É/¾É(¾É!¾É¾É¾É ¾É¾Éþ½É÷½Éð½Éé½Éâ½ÉÛ½ÉÔ½ÉͽÉƽÉ¿½É¸½É±½Éª½É£½Éœ½É•½É޽ɇ½É€½Éy½Ér½Ék½Éd½É]½ÉV½ÉO½ÉH½ÉA½É:½É3½É,½É%½É½É½É½É ½É½Éû¼Éô¼Éí¼Éæ¼Éß¼ÉؼÉѼÉʼÉüɼ¼Éµ¼É®¼É§¼É ¼É™¼É’¼É‹¼É„¼É}¼Év¼Éo¼Éh¼Éa¼ÉZ¼ÉS¼ÉL¼ÉE¼É>¼É7¼É0¼É)¼É"¼É¼É¼É ¼É¼Éÿ»Éø»Éñ»Éê»Éã»ÉÜ»ÉÕ»ÉλÉÇ»ÉÀ»É¹»É²»É«»É¤»É»É–»É»Éˆ»É»Éz»És»Él»Ée»É^»ÉW»ÉP»ÉI»ÉB»É;»É4»É-»É&»É»É»É»É »É»ÉüºÉõºÉîºÉçºÉàºÉÙºÉÒºÉ˺ÉĺɽºÉ¶ºÉ¯ºÉ¨ºÉ¡ºÉšºÉ“ºÉŒºÉ…ºÉ~ºÉwºÉpºÉiºÉbºÉ[ºÉTºÉMºÉFºÉ?ºÉ8ºÉ1ºÉ*ºÉ#ºÉºÉºÉºÉºÉºÉù¹Éò¹Éë¹Éä¹ÉݹÉÖ¹ÉϹÉȹÉÁ¹Éº¹É³¹É¬¹É¥¹Éž¹É—¹É¹É‰¹É‚¹É{¹Ét¹Ém¹Éf¹É_¹ÉX¹ÉQ¹ÉJ¹ÉC¹É<¹É5¹É.¹É'¹É ¹É¹É¹É ¹É¹Éý¸Éö¸Éï¸Éè¸Éá¸ÉÚ¸ÉÓ¸É̸ɟɾ¸É·¸É°¸É©¸É¢¸É›¸É”¸É¸É†¸É¸Éx¸Éq¸Éj¸Éc¸É\¸ÉU¸ÉN¸ÉG¸É@¸É9¸É2¸É+¸É$¸É¸É¸É¸É¸É¸Éú·Éó·Éì·Éå·ÉÞ·É×·ÉзÉÉ·É·É»·É´·É­·É¦·ÉŸ·É˜·É‘·ÉŠ·Éƒ·É|·Éu·Én·Ég·É`·ÉY·ÉR·ÉK·ÉD·É=·É6·É/·É(·É!·É·É·É ·É·Éþ¶É÷¶Éð¶Éé¶Éâ¶ÉÛ¶ÉÔ¶ÉͶÉƶÉ¿¶É¸¶É±¶Éª¶É£¶Éœ¶É•¶É޶ɇ¶É€¶Éy¶Ér¶Ék¶Éd¶É]¶ÉV¶ÉO¶ÉH¶ÉA¶É:¶É3¶É,¶É%¶É¶É¶É¶É ¶É¶ÉûµÉôµÉíµÉæµÉßµÉصÉѵÉʵÉõɼµÉµµÉ®µÉ§µÉ µÉ™µÉ’µÉ‹µÉ„µÉ}µÉvµÉoµÉhµÉaµÉZµÉSµÉLµÉEµÉ>µÉ7µÉ0µÉ)µÉ"µÉµÉµÉ µÉµÉÿ´Éø´Éñ´Éê´Éã´ÉÜ´ÉÕ´ÉδÉÇ´ÉÀ´É¹´É²´É«´É¤´É´É–´É´Éˆ´É´Éz´És´Él´Ée´É^´ÉW´ÉP´ÉI´ÉB´É;´É4´É-´É&´É´É´É´É ´É´Éü³Éõ³Éî³Éç³Éà³ÉÙ³ÉÒ³É˳Éijɽ³É¶³É¯³É¨³É¡³Éš³É“³ÉŒ³É…³É~³Éw³Ép³Éi³Éb³É[³ÉT³ÉM³ÉF³É?³É8³É1³É*³É#³É³É³É³É³É³Éù²Éò²Éë²Éä²ÉݲÉÖ²ÉϲÉȲÉÁ²Éº²É³²É¬²É¥²Éž²É—²É²É‰²É‚²É{²Ét²Ém²Éf²É_²ÉX²ÉQ²ÉJ²ÉC²É<²É5²É.²É'²É ²É²É²É ²É²Éý±Éö±Éï±Éè±Éá±ÉÚ±ÉÓ±É̱Éűɾ±É·±É°±É©±É¢±É›±É”±É±É†±É±Éx±Éq±Éj±Éc±É\±ÉU±ÉN±ÉG±É@±É9±É2±É+±É$±É±É±É±É±É±Éú°Éó°Éì°Éå°ÉÞ°É×°ÉаÉɰɰɻ°É´°É­°É¦°ÉŸ°É˜°É‘°ÉаɃ°É|°Éu°Én°Ég°É`°ÉY°ÉR°ÉK°ÉD°É=°É6°É/°É(°É!°É°É°É °É°Éþ¯É÷¯Éð¯Éé¯Éâ¯ÉÛ¯ÉÔ¯ÉͯÉƯÉ¿¯É¸¯É±¯Éª¯É£¯Éœ¯É•¯Éޝɇ¯É€¯Éy¯Ér¯Ék¯Éd¯É]¯ÉV¯ÉO¯ÉH¯ÉA¯É:¯É3¯É,¯É%¯É¯É¯É¯É ¯É¯Éû®Éô®Éí®Éæ®É߮ɨ®ÉÑ®ÉÊ®Éîɼ®Éµ®É®®É§®É ®É™®É’®É‹®É„®É}®Év®Éo®Éh®Éa®ÉZ®ÉS®ÉL®ÉE®É>®É7®É0®É)®É"®É®É®É ®É®Éÿ­Éø­Éñ­Éê­Éã­ÉÜ­ÉÕ­ÉέÉÇ­ÉÀ­É¹­É²­É«­É¤­É­É–­É­Éˆ­É­Éz­És­Él­Ée­É^­ÉW­ÉP­ÉI­ÉB­É;­É4­É-­É&­É­É­É­É ­É­Éü¬Éõ¬Éî¬Éç¬Éà¬ÉÙ¬ÉÒ¬ÉˬÉĬɽ¬É¶¬É¯¬É¨¬É¡¬Éš¬É“¬ÉŒ¬É…¬É~¬Éw¬Ép¬Éi¬Éb¬É[¬ÉT¬ÉM¬ÉF¬É?¬É8¬É1¬É*¬É#¬É¬É¬É¬É¬É¬Éù«Éò«Éë«Éä«ÉÝ«ÉÖ«ÉÏ«ÉÈ«ÉÁ«Éº«É³«É¬«É¥«Éž«É—«É«É‰«É‚«É{«Ét«Ém«Éf«É_«ÉX«ÉQ«ÉJ«ÉC«É<«É5«É.«É'«É «É«É«É «É«ÉýªÉöªÉïªÉèªÉáªÉÚªÉÓªÉ̪ÉŪɾªÉ·ªÉ°ªÉ©ªÉ¢ªÉ›ªÉ”ªÉªÉ†ªÉªÉxªÉqªÉjªÉcªÉ\ªÉUªÉNªÉGªÉ@ªÉ9ªÉ2ªÉ+ªÉ$ªÉªÉªÉªÉªÉªÉú©Éó©Éì©Éå©ÉÞ©ÉשÉЩÉɩɩɻ©É´©É­©É¦©ÉŸ©É˜©É‘©ÉŠ©Éƒ©É|©Éu©Én©Ég©É`©ÉY©ÉR©ÉK©ÉD©É=©É6©É/©É(©É!©É©É©É ©É©Éþ¨É÷¨Éð¨Éé¨Éâ¨ÉÛ¨ÉÔ¨ÉͨÉƨÉ¿¨É¸¨É±¨Éª¨É£¨Éœ¨É•¨Éލɇ¨É€¨Éy¨Ér¨Ék¨Éd¨É]¨ÉV¨ÉO¨ÉH¨ÉA¨É:¨É3¨É,¨É%¨É¨É¨É¨É ¨É¨Éû§Éô§Éí§Éæ§Éß§ÉاÉѧÉʧÉçɼ§Éµ§É®§É§§É §É™§É’§É‹§É„§É}§Év§Éo§Éh§Éa§ÉZ§ÉS§ÉL§ÉE§É>§É7§É0§É)§É"§É§É§É §É§Éÿ¦Éø¦Éñ¦Éê¦Éã¦ÉܦÉÕ¦ÉΦÉǦÉÀ¦É¹¦É²¦É«¦É¤¦É¦É–¦É¦Éˆ¦É¦Éz¦És¦Él¦Ée¦É^¦ÉW¦ÉP¦ÉI¦ÉB¦É;¦É4¦É-¦É&¦É¦É¦É¦É ¦É¦Éü¥Éõ¥Éî¥Éç¥Éà¥ÉÙ¥ÉÒ¥ÉË¥Éĥɽ¥É¶¥É¯¥É¨¥É¡¥Éš¥É“¥ÉŒ¥É…¥É~¥Éw¥Ép¥Éi¥Éb¥É[¥ÉT¥ÉM¥ÉF¥É?¥É8¥É1¥É*¥É#¥É¥É¥É¥É¥É¥Éù¤Éò¤Éë¤Éä¤ÉݤÉÖ¤ÉϤÉȤÉÁ¤Éº¤É³¤É¬¤É¥¤Éž¤É—¤É¤É‰¤É‚¤É{¤Ét¤Ém¤Éf¤É_¤ÉX¤ÉQ¤ÉJ¤ÉC¤É<¤É5¤É.¤É'¤É ¤É¤É¤É ¤É¤Éý£Éö£Éï£Éè£Éá£ÉÚ£ÉÓ£ÉÌ£Éţɾ£É·£É°£É©£É¢£É›£É”£É£É†£É£Éx£Éq£Éj£Éc£É\£ÉU£ÉN£ÉG£É@£É9£É2£É+£É$£É£É£É£É£É£Éú¢Éó¢Éì¢Éå¢ÉÞ¢É×¢ÉТÉɢɢɻ¢É´¢É­¢É¦¢ÉŸ¢É˜¢É‘¢ÉŠ¢Éƒ¢É|¢Éu¢Én¢Ég¢É`¢ÉY¢ÉR¢ÉK¢ÉD¢É=¢É6¢É/¢É(¢É!¢É¢É¢É ¢É¢Éþ¡É÷¡Éð¡Éé¡Éâ¡ÉÛ¡ÉÔ¡ÉÍ¡ÉÆ¡É¿¡É¸¡É±¡Éª¡É£¡Éœ¡É•¡Éޡɇ¡É€¡Éy¡Ér¡Ék¡Éd¡É]¡ÉV¡ÉO¡ÉH¡ÉA¡É:¡É3¡É,¡É%¡É¡É¡É¡É ¡É¡Éû Éô Éí Éæ Éß ÉØ ÉÑ ÉÊ Éàɼ Éµ É® É§ É  É™ É’ É‹ É„ É} Év Éo Éh Éa ÉZ ÉS ÉL ÉE É> É7 É0 É) É" É É É  É ÉÿŸÉøŸÉñŸÉêŸÉãŸÉÜŸÉÕŸÉΟÉÇŸÉÀŸÉ¹ŸÉ²ŸÉ«ŸÉ¤ŸÉŸÉ–ŸÉŸÉˆŸÉŸÉzŸÉsŸÉlŸÉeŸÉ^ŸÉWŸÉPŸÉIŸÉBŸÉ;ŸÉ4ŸÉ-ŸÉ&ŸÉŸÉŸÉŸÉ ŸÉŸÉüžÉõžÉîžÉçžÉàžÉÙžÉÒžÉËžÉĞɽžÉ¶žÉ¯žÉ¨žÉ¡žÉšžÉ“žÉŒžÉ…žÉ~žÉwžÉpžÉižÉbžÉ[žÉTžÉMžÉFžÉ?žÉ8žÉ1žÉ*žÉ#žÉžÉžÉžÉžÉžÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýœÉöœÉïœÉèœÉáœÉÚœÉÓœÉÌœÉŜɾœÉ·œÉ°œÉ©œÉ¢œÉ›œÉ”œÉœÉ†œÉœÉxœÉqœÉjœÉcœÉ\œÉUœÉNœÉGœÉ@œÉ9œÉ2œÉ+œÉ$œÉœÉœÉœÉœÉœÉú›Éó›Éì›Éå›ÉÞ›É×›ÉЛÉɛɛɻ›É´›É­›É¦›ÉŸ›É˜›É‘›ÉŠ›Éƒ›É|›Éu›Én›Ég›É`›ÉY›ÉR›ÉK›ÉD›É=›É6›É/›É(›É!›É›É›É ›É›ÉþšÉ÷šÉðšÉéšÉâšÉÛšÉÔšÉÍšÉÆšÉ¿šÉ¸šÉ±šÉªšÉ£šÉœšÉ•šÉŽšÉ‡šÉ€šÉyšÉršÉkšÉdšÉ]šÉVšÉOšÉHšÉAšÉ:šÉ3šÉ,šÉ%šÉšÉšÉšÉ šÉšÉû™Éô™Éí™Éæ™Éߙɨ™ÉÑ™ÉÊ™ÉÙɼ™Éµ™É®™É§™É ™É™™É’™É‹™É„™É}™Év™Éo™Éh™Éa™ÉZ™ÉS™ÉL™ÉE™É>™É7™É0™É)™É"™É™É™É ™É™Éÿ˜Éø˜Éñ˜Éê˜Éã˜ÉܘÉÕ˜ÉΘÉǘÉÀ˜É¹˜É²˜É«˜É¤˜É˜É–˜É˜Éˆ˜É˜Éz˜És˜Él˜Ée˜É^˜ÉW˜ÉP˜ÉI˜ÉB˜É;˜É4˜É-˜É&˜É˜É˜É˜É ˜É˜Éü—Éõ—Éî—Éç—Éà—ÉÙ—ÉÒ—ÉË—Éėɽ—ɶ—ɯ—ɨ—É¡—Éš—É“—ÉŒ—É…—É~—Éw—Ép—Éi—Éb—É[—ÉT—ÉM—ÉF—É?—É8—É1—É*—É#—É—É—É—É—É—Éù–Éò–Éë–Éä–ÉÝ–ÉÖ–ÉÏ–ÉÈ–ÉÁ–ɺ–ɳ–ɬ–É¥–Éž–É—–ɖɉ–É‚–É{–Ét–Ém–Éf–É_–ÉX–ÉQ–ÉJ–ÉC–É<–É5–É.–É'–É –É–É–É –É–Éý•Éö•Éï•Éè•Éá•ÉÚ•ÉÓ•ÉÌ•Éŕɾ•É·•ɰ•É©•É¢•É›•É”•ɕɆ•É•Éx•Éq•Éj•Éc•É\•ÉU•ÉN•ÉG•É@•É9•É2•É+•É$•ɕɕɕɕɕÉú”Éó”Éì”Éå”ÉÞ”É×”ÉДÉɔɔɻ”É´”É­”ɦ”ÉŸ”ɘ”É‘”ÉŠ”Ƀ”É|”Éu”Én”Ég”É`”ÉY”ÉR”ÉK”ÉD”É=”É6”É/”É(”É!”É”É”É ”É”Éþ“É÷“Éð“Éé“Éâ“ÉÛ“ÉÔ“ÉÍ“ÉÆ“É¿“ɸ“ɱ“ɪ“É£“Éœ“É•“ÉŽ“ɇ“É€“Éy“Ér“Ék“Éd“É]“ÉV“ÉO“ÉH“ÉA“É:“É3“É,“É%“É“É“É“É “É“Éû’Éô’Éí’Éæ’Éß’ÉØ’ÉÑ’ÉÊ’ÉÒɼ’ɵ’É®’ɧ’É ’É™’É’’É‹’É„’É}’Év’Éo’Éh’Éa’ÉZ’ÉS’ÉL’ÉE’É>’É7’É0’É)’É"’É’É’É ’É’Éÿ‘Éø‘Éñ‘Éê‘Éã‘ÉÜ‘ÉÕ‘ÉΑÉÇ‘ÉÀ‘ɹ‘ɲ‘É«‘ɤ‘ɑɖ‘ɑɈ‘É‘Éz‘És‘Él‘Ée‘É^‘ÉW‘ÉP‘ÉI‘ÉB‘É;‘É4‘É-‘É&‘É‘É‘É‘É ‘É‘ÉüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýŽÉöŽÉïŽÉèŽÉáŽÉÚŽÉÓŽÉÌŽÉŎɾŽÉ·ŽÉ°ŽÉ©ŽÉ¢ŽÉ›ŽÉ”ŽÉŽÉ†ŽÉŽÉxŽÉqŽÉjŽÉcŽÉ\ŽÉUŽÉNŽÉGŽÉ@ŽÉ9ŽÉ2ŽÉ+ŽÉ$ŽÉŽÉŽÉŽÉŽÉŽÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþŒÉ÷ŒÉðŒÉéŒÉâŒÉÛŒÉÔŒÉÍŒÉÆŒÉ¿ŒÉ¸ŒÉ±ŒÉªŒÉ£ŒÉœŒÉ•ŒÉŽŒÉ‡ŒÉ€ŒÉyŒÉrŒÉkŒÉdŒÉ]ŒÉVŒÉOŒÉHŒÉAŒÉ:ŒÉ3ŒÉ,ŒÉ%ŒÉŒÉŒÉŒÉ ŒÉŒÉû‹Éô‹Éí‹Éæ‹Éߋɨ‹ÉÑ‹ÉÊ‹ÉËɼ‹Éµ‹É®‹É§‹É ‹É™‹É’‹É‹‹É„‹É}‹Év‹Éo‹Éh‹Éa‹ÉZ‹ÉS‹ÉL‹ÉE‹É>‹É7‹É0‹É)‹É"‹É‹É‹É ‹É‹ÉÿŠÉøŠÉñŠÉêŠÉãŠÉÜŠÉÕŠÉΊÉÇŠÉÀŠÉ¹ŠÉ²ŠÉ«ŠÉ¤ŠÉŠÉ–ŠÉŠÉˆŠÉŠÉzŠÉsŠÉlŠÉeŠÉ^ŠÉWŠÉPŠÉIŠÉBŠÉ;ŠÉ4ŠÉ-ŠÉ&ŠÉŠÉŠÉŠÉ ŠÉŠÉü‰Éõ‰Éî‰Éç‰Éà‰ÉÙ‰ÉÒ‰ÉˉÉĉɽ‰É¶‰É¯‰É¨‰É¡‰Éš‰É“‰ÉŒ‰É…‰É~‰Éw‰Ép‰Éi‰Éb‰É[‰ÉT‰ÉM‰ÉF‰É?‰É8‰É1‰É*‰É#‰É‰É‰É‰É‰É‰ÉùˆÉòˆÉëˆÉäˆÉ݈ÉÖˆÉψÉȈÉÁˆÉºˆÉ³ˆÉ¬ˆÉ¥ˆÉžˆÉ—ˆÉˆÉ‰ˆÉ‚ˆÉ{ˆÉtˆÉmˆÉfˆÉ_ˆÉXˆÉQˆÉJˆÉCˆÉ<ˆÉ5ˆÉ.ˆÉ'ˆÉ ˆÉˆÉˆÉ ˆÉˆÉý‡Éö‡Éï‡Éè‡Éá‡ÉÚ‡ÉÓ‡É̇ÉŇɾ‡É·‡É°‡É©‡É¢‡É›‡É”‡É‡É†‡É‡Éx‡Éq‡Éj‡Éc‡É\‡ÉU‡ÉN‡ÉG‡É@‡É9‡É2‡É+‡É$‡É‡É‡É‡É‡É‡Éú†Éó†Éì†Éå†ÉÞ†É׆ÉІÉɆɆɻ†É´†É­†É¦†ÉŸ†É˜†É‘†ÉІÉƒ†É|†Éu†Én†Ég†É`†ÉY†ÉR†ÉK†ÉD†É=†É6†É/†É(†É!†É†É†É †É†Éþ…É÷…Éð…Éé…Éâ…ÉÛ…ÉÔ…ÉÍ…ÉÆ…É¿…ɸ…ɱ…ɪ…É£…Éœ…É•…ÉŽ…ɇ…É€…Éy…Ér…Ék…Éd…É]…ÉV…ÉO…ÉH…ÉA…É:…É3…É,…É%…É…É…É…É …É…Éû„Éô„Éí„Éæ„É߄ɨ„ÉÑ„ÉÊ„ÉÄɼ„ɵ„É®„ɧ„É „É™„É’„É‹„É„„É}„Év„Éo„Éh„Éa„ÉZ„ÉS„ÉL„ÉE„É>„É7„É0„É)„É"„É„É„É „É„ÉÿƒÉøƒÉñƒÉêƒÉãƒÉ܃ÉÕƒÉ΃ÉǃÉÀƒÉ¹ƒÉ²ƒÉ«ƒÉ¤ƒÉƒÉ–ƒÉƒÉˆƒÉƒÉzƒÉsƒÉlƒÉeƒÉ^ƒÉWƒÉPƒÉIƒÉBƒÉ;ƒÉ4ƒÉ-ƒÉ&ƒÉƒÉƒÉƒÉ ƒÉƒÉü‚Éõ‚Éî‚Éç‚Éà‚ÉÙ‚ÉÒ‚ÉË‚ÉĂɽ‚ɶ‚ɯ‚ɨ‚É¡‚Éš‚É“‚ÉŒ‚É…‚É~‚Éw‚Ép‚Éi‚Éb‚É[‚ÉT‚ÉM‚ÉF‚É?‚É8‚É1‚É*‚É#‚ɂɂɂɂɂÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉý€Éö€Éï€Éè€Éá€ÉÚ€ÉÓ€ÉÌ€Éŀɾ€É·€É°€É©€É¢€É›€É”€É€É†€É€Éx€Éq€Éj€Éc€É\€ÉU€ÉN€ÉG€É@€É9€É2€É+€É$€É€É€É€É€É€ÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþ~É÷~Éð~Éé~Éâ~ÉÛ~ÉÔ~ÉÍ~ÉÆ~É¿~ɸ~ɱ~ɪ~É£~Éœ~É•~ÉŽ~ɇ~É€~Éy~Ér~Ék~Éd~É]~ÉV~ÉO~ÉH~ÉA~É:~É3~É,~É%~É~É~É~É ~É~Éû}Éô}Éí}Éæ}Éß}ÉØ}ÉÑ}ÉÊ}ÉÃ}ɼ}ɵ}É®}ɧ}É }É™}É’}É‹}É„}É}}Év}Éo}Éh}Éa}ÉZ}ÉS}ÉL}ÉE}É>}É7}É0}É)}É"}É}É}É }É}Éÿ|Éø|Éñ|Éê|Éã|ÉÜ|ÉÕ|ÉÎ|ÉÇ|ÉÀ|ɹ|ɲ|É«|ɤ|É|É–|É|Ɉ|É|Éz|És|Él|Ée|É^|ÉW|ÉP|ÉI|ÉB|É;|É4|É-|É&|É|É|É|É |É|Éü{Éõ{Éî{Éç{Éà{ÉÙ{ÉÒ{ÉË{ÉÄ{ɽ{ɶ{ɯ{ɨ{É¡{Éš{É“{ÉŒ{É…{É~{Éw{Ép{Éi{Éb{É[{ÉT{ÉM{ÉF{É?{É8{É1{É*{É#{É{É{É{É{É{ÉùzÉòzÉëzÉäzÉÝzÉÖzÉÏzÉÈzÉÁzɺzɳzɬzÉ¥zÉžzÉ—zÉzɉzÉ‚zÉ{zÉtzÉmzÉfzÉ_zÉXzÉQzÉJzÉCzÉvÉ7vÉ0vÉ)vÉ"vÉvÉvÉ vÉvÉÿuÉøuÉñuÉêuÉãuÉÜuÉÕuÉÎuÉÇuÉÀuɹuɲuÉ«uɤuÉuÉ–uÉuɈuÉuÉzuÉsuÉluÉeuÉ^uÉWuÉPuÉIuÉBuÉ;uÉ4uÉ-uÉ&uÉuÉuÉuÉ uÉuÉütÉõtÉîtÉçtÉàtÉÙtÉÒtÉËtÉÄtɽtɶtɯtɨtÉ¡tÉštÉ“tÉŒtÉ…tÉ~tÉwtÉptÉitÉbtÉ[tÉTtÉMtÉFtÉ?tÉ8tÉ1tÉ*tÉ#tÉtÉtÉtÉtÉtÉùsÉòsÉësÉäsÉÝsÉÖsÉÏsÉÈsÉÁsɺsɳsɬsÉ¥sÉžsÉ—sÉsɉsÉ‚sÉ{sÉtsÉmsÉfsÉ_sÉXsÉQsÉJsÉCsÉoÉ7oÉ0oÉ)oÉ"oÉoÉoÉ oÉoÉÿnÉønÉñnÉênÉãnÉÜnÉÕnÉÎnÉÇnÉÀnɹnɲnÉ«nɤnÉnÉ–nÉnɈnÉnÉznÉsnÉlnÉenÉ^nÉWnÉPnÉInÉBnÉ;nÉ4nÉ-nÉ&nÉnÉnÉnÉ nÉnÉümÉõmÉîmÉçmÉàmÉÙmÉÒmÉËmÉÄmɽmɶmɯmɨmÉ¡mÉšmÉ“mÉŒmÉ…mÉ~mÉwmÉpmÉimÉbmÉ[mÉTmÉMmÉFmÉ?mÉ8mÉ1mÉ*mÉ#mÉmÉmÉmÉmÉmÉùlÉòlÉëlÉälÉÝlÉÖlÉÏlÉÈlÉÁlɺlɳlɬlÉ¥lÉžlÉ—lÉlɉlÉ‚lÉ{lÉtlÉmlÉflÉ_lÉXlÉQlÉJlÉClÉhÉ7hÉ0hÉ)hÉ"hÉhÉhÉ hÉhÉÿgÉøgÉñgÉêgÉãgÉÜgÉÕgÉÎgÉÇgÉÀgɹgɲgÉ«gɤgÉgÉ–gÉgɈgÉgÉzgÉsgÉlgÉegÉ^gÉWgÉPgÉIgÉBgÉ;gÉ4gÉ-gÉ&gÉgÉgÉgÉ gÉgÉüfÉõfÉîfÉçfÉàfÉÙfÉÒfÉËfÉÄfɽfɶfɯfɨfÉ¡fÉšfÉ“fÉŒfÉ…fÉ~fÉwfÉpfÉifÉbfÉ[fÉTfÉMfÉFfÉ?fÉ8fÉ1fÉ*fÉ#fÉfÉfÉfÉfÉfÉùeÉòeÉëeÉäeÉÝeÉÖeÉÏeÉÈeÉÁeɺeɳeɬeÉ¥eÉžeÉ—eÉeɉeÉ‚eÉ{eÉteÉmeÉfeÉ_eÉXeÉQeÉJeÉCeÉaÉ7aÉ0aÉ)aÉ"aÉaÉaÉ aÉaÉÿ`Éø`Éñ`Éê`Éã`ÉÜ`ÉÕ`ÉÎ`ÉÇ`ÉÀ`ɹ`ɲ`É«`ɤ`É`É–`É`Ɉ`É`Éz`És`Él`Ée`É^`ÉW`ÉP`ÉI`ÉB`É;`É4`É-`É&`É`É`É`É `É`Éü_Éõ_Éî_Éç_Éà_ÉÙ_ÉÒ_ÉË_ÉÄ_ɽ_ɶ_ɯ_ɨ_É¡_Éš_É“_ÉŒ_É…_É~_Éw_Ép_Éi_Éb_É[_ÉT_ÉM_ÉF_É?_É8_É1_É*_É#_É_É_É_É_É_Éù^Éò^Éë^Éä^ÉÝ^ÉÖ^ÉÏ^ÉÈ^ÉÁ^ɺ^ɳ^ɬ^É¥^Éž^É—^É^ɉ^É‚^É{^Ét^Ém^Éf^É_^ÉX^ÉQ^ÉJ^ÉC^É<^É5^É.^É'^É ^É^É^É ^É^Éý]Éö]Éï]Éè]Éá]ÉÚ]ÉÓ]ÉÌ]ÉÅ]ɾ]É·]ɰ]É©]É¢]É›]É”]É]Ɇ]É]Éx]Éq]Éj]Éc]É\]ÉU]ÉN]ÉG]É@]É9]É2]É+]É$]É]É]É]É]É]Éú\Éó\Éì\Éå\ÉÞ\É×\ÉÐ\ÉÉ\ÉÂ\É»\É´\É­\ɦ\ÉŸ\ɘ\É‘\ÉŠ\Ƀ\É|\Éu\Én\Ég\É`\ÉY\ÉR\ÉK\ÉD\É=\É6\É/\É(\É!\É\É\É \É\Éþ[É÷[Éð[Éé[Éâ[ÉÛ[ÉÔ[ÉÍ[ÉÆ[É¿[ɸ[ɱ[ɪ[É£[Éœ[É•[ÉŽ[ɇ[É€[Éy[Ér[Ék[Éd[É][ÉV[ÉO[ÉH[ÉA[É:[É3[É,[É%[É[É[É[É [É[ÉûZÉôZÉíZÉæZÉßZÉØZÉÑZÉÊZÉÃZɼZɵZÉ®ZɧZÉ ZÉ™ZÉ’ZÉ‹ZÉ„ZÉ}ZÉvZÉoZÉhZÉaZÉZZÉSZÉLZÉEZÉ>ZÉ7ZÉ0ZÉ)ZÉ"ZÉZÉZÉ ZÉZÉÿYÉøYÉñYÉêYÉãYÉÜYÉÕYÉÎYÉÇYÉÀYɹYɲYÉ«YɤYÉYÉ–YÉYɈYÉYÉzYÉsYÉlYÉeYÉ^YÉWYÉPYÉIYÉBYÉ;YÉ4YÉ-YÉ&YÉYÉYÉYÉ YÉYÉüXÉõXÉîXÉçXÉàXÉÙXÉÒXÉËXÉÄXɽXɶXɯXɨXÉ¡XÉšXÉ“XÉŒXÉ…XÉ~XÉwXÉpXÉiXÉbXÉ[XÉTXÉMXÉFXÉ?XÉ8XÉ1XÉ*XÉ#XÉXÉXÉXÉXÉXÉùWÉòWÉëWÉäWÉÝWÉÖWÉÏWÉÈWÉÁWɺWɳWɬWÉ¥WÉžWÉ—WÉWɉWÉ‚WÉ{WÉtWÉmWÉfWÉ_WÉXWÉQWÉJWÉCWÉSÉ7SÉ0SÉ)SÉ"SÉSÉSÉ SÉSÉÿRÉøRÉñRÉêRÉãRÉÜRÉÕRÉÎRÉÇRÉÀRɹRɲRÉ«RɤRÉRÉ–RÉRɈRÉRÉzRÉsRÉlRÉeRÉ^RÉWRÉPRÉIRÉBRÉ;RÉ4RÉ-RÉ&RÉRÉRÉRÉ RÉRÉüQÉõQÉîQÉçQÉàQÉÙQÉÒQÉËQÉÄQɽQɶQɯQɨQÉ¡QÉšQÉ“QÉŒQÉ…QÉ~QÉwQÉpQÉiQÉbQÉ[QÉTQÉMQÉFQÉ?QÉ8QÉ1QÉ*QÉ#QÉQÉQÉQÉQÉQÉùPÉòPÉëPÉäPÉÝPÉÖPÉÏPÉÈPÉÁPɺPɳPɬPÉ¥PÉžPÉ—PÉPɉPÉ‚PÉ{PÉtPÉmPÉfPÉ_PÉXPÉQPÉJPÉCPÉLÉ7LÉ0LÉ)LÉ"LÉLÉLÉ LÉLÉÿKÉøKÉñKÉêKÉãKÉÜKÉÕKÉÎKÉÇKÉÀKɹKɲKÉ«KɤKÉKÉ–KÉKɈKÉKÉzKÉsKÉlKÉeKÉ^KÉWKÉPKÉIKÉBKÉ;KÉ4KÉ-KÉ&KÉKÉKÉKÉ KÉKÉüJÉõJÉîJÉçJÉàJÉÙJÉÒJÉËJÉÄJɽJɶJɯJɨJÉ¡JÉšJÉ“JÉŒJÉ…JÉ~JÉwJÉpJÉiJÉbJÉ[JÉTJÉMJÉFJÉ?JÉ8JÉ1JÉ*JÉ#JÉJÉJÉJÉJÉJÉùIÉòIÉëIÉäIÉÝIÉÖIÉÏIÉÈIÉÁIɺIɳIɬIÉ¥IÉžIÉ—IÉIɉIÉ‚IÉ{IÉtIÉmIÉfIÉ_IÉXIÉQIÉJIÉCIÉEÉ7EÉ0EÉ)EÉ"EÉEÉEÉ EÉEÉÿDÉøDÉñDÉêDÉãDÉÜDÉÕDÉÎDÉÇDÉÀDɹDɲDÉ«DɤDÉDÉ–DÉDɈDÉDÉzDÉsDÉlDÉeDÉ^DÉWDÉPDÉIDÉBDÉ;DÉ4DÉ-DÉ&DÉDÉDÉDÉ DÉDÉüCÉõCÉîCÉçCÉàCÉÙCÉÒCÉËCÉÄCɽCɶCɯCɨCÉ¡CÉšCÉ“CÉŒCÉ…CÉ~CÉwCÉpCÉiCÉbCÉ[CÉTCÉMCÉFCÉ?CÉ8CÉ1CÉ*CÉ#CÉCÉCÉCÉCÉCÉùBÉòBÉëBÉäBÉÝBÉÖBÉÏBÉÈBÉÁBɺBɳBɬBÉ¥BÉžBÉ—BÉBɉBÉ‚BÉ{BÉtBÉmBÉfBÉ_BÉXBÉQBÉJBÉCBÉÉô>Éí>Éæ>Éß>ÉØ>ÉÑ>ÉÊ>ÉÃ>ɼ>ɵ>É®>ɧ>É >É™>É’>É‹>É„>É}>Év>Éo>Éh>Éa>ÉZ>ÉS>ÉL>ÉE>É>>É7>É0>É)>É">É>É>É >É>Éÿ=Éø=Éñ=Éê=Éã=ÉÜ=ÉÕ=ÉÎ=ÉÇ=ÉÀ=ɹ=ɲ=É«=ɤ=É=É–=É=Ɉ=É=Éz=És=Él=Ée=É^=ÉW=ÉP=ÉI=ÉB=É;=É4=É-=É&=É=É=É=É =É=Éü<Éõ<Éî<Éç<Éà<ÉÙ<ÉÒ<ÉË<ÉÄ<ɽ<ɶ<ɯ<ɨ<É¡<Éš<É“<ÉŒ<É…<É~<Éw<Ép<Éi<Éb<É[<ÉT<ÉM<ÉF<É?<É8<É1<É*<É#<É<É<É<É<É<Éù;Éò;Éë;Éä;ÉÝ;ÉÖ;ÉÏ;ÉÈ;ÉÁ;ɺ;ɳ;ɬ;É¥;Éž;É—;É;ɉ;É‚;É{;Ét;Ém;Éf;É_;ÉX;ÉQ;ÉJ;ÉC;É<;É5;É.;É';É ;É;É;É ;É;Éý:Éö:Éï:Éè:Éá:ÉÚ:ÉÓ:ÉÌ:ÉÅ:ɾ:É·:ɰ:É©:É¢:É›:É”:É:Ɇ:É:Éx:Éq:Éj:Éc:É\:ÉU:ÉN:ÉG:É@:É9:É2:É+:É$:É:É:É:É:É:Éú9Éó9Éì9Éå9ÉÞ9É×9ÉÐ9ÉÉ9ÉÂ9É»9É´9É­9ɦ9ÉŸ9ɘ9É‘9ÉŠ9Ƀ9É|9Éu9Én9Ég9É`9ÉY9ÉR9ÉK9ÉD9É=9É69É/9É(9É!9É9É9É 9É9Éþ8É÷8Éð8Éé8Éâ8ÉÛ8ÉÔ8ÉÍ8ÉÆ8É¿8ɸ8ɱ8ɪ8É£8Éœ8É•8ÉŽ8ɇ8É€8Éy8Ér8Ék8Éd8É]8ÉV8ÉO8ÉH8ÉA8É:8É38É,8É%8É8É8É8É 8É8Éû7Éô7Éí7Éæ7Éß7ÉØ7ÉÑ7ÉÊ7ÉÃ7ɼ7ɵ7É®7ɧ7É 7É™7É’7É‹7É„7É}7Év7Éo7Éh7Éa7ÉZ7ÉS7ÉL7ÉE7É>7É77É07É)7É"7É7É7É 7É7Éÿ6Éø6Éñ6Éê6Éã6ÉÜ6ÉÕ6ÉÎ6ÉÇ6ÉÀ6ɹ6ɲ6É«6ɤ6É6É–6É6Ɉ6É6Éz6És6Él6Ée6É^6ÉW6ÉP6ÉI6ÉB6É;6É46É-6É&6É6É6É6É 6É6Éü5Éõ5Éî5Éç5Éà5ÉÙ5ÉÒ5ÉË5ÉÄ5ɽ5ɶ5ɯ5ɨ5É¡5Éš5É“5ÉŒ5É…5É~5Éw5Ép5Éi5Éb5É[5ÉT5ÉM5ÉF5É?5É85É15É*5É#5É5É5É5É5É5Éù4Éò4Éë4Éä4ÉÝ4ÉÖ4ÉÏ4ÉÈ4ÉÁ4ɺ4ɳ4ɬ4É¥4Éž4É—4É4ɉ4É‚4É{4Ét4Ém4Éf4É_4ÉX4ÉQ4ÉJ4ÉC4É<4É54É.4É'4É 4É4É4É 4É4Éý3Éö3Éï3Éè3Éá3ÉÚ3ÉÓ3ÉÌ3ÉÅ3ɾ3É·3ɰ3É©3É¢3É›3É”3É3Ɇ3É3Éx3Éq3Éj3Éc3É\3ÉU3ÉN3ÉG3É@3É93É23É+3É$3É3É3É3É3É3Éú2Éó2Éì2Éå2ÉÞ2É×2ÉÐ2ÉÉ2ÉÂ2É»2É´2É­2ɦ2ÉŸ2ɘ2É‘2ÉŠ2Ƀ2É|2Éu2Én2Ég2É`2ÉY2ÉR2ÉK2ÉD2É=2É62É/2É(2É!2É2É2É 2É2Éþ1É÷1Éð1Éé1Éâ1ÉÛ1ÉÔ1ÉÍ1ÉÆ1É¿1ɸ1ɱ1ɪ1É£1Éœ1É•1ÉŽ1ɇ1É€1Éy1Ér1Ék1Éd1É]1ÉV1ÉO1ÉH1ÉA1É:1É31É,1É%1É1É1É1É 1É1Éû0Éô0Éí0Éæ0Éß0ÉØ0ÉÑ0ÉÊ0ÉÃ0ɼ0ɵ0É®0ɧ0É 0É™0É’0É‹0É„0É}0Év0Éo0Éh0Éa0ÉZ0ÉS0ÉL0ÉE0É>0É70É00É)0É"0É0É0É 0É0Éÿ/Éø/Éñ/Éê/Éã/ÉÜ/ÉÕ/ÉÎ/ÉÇ/ÉÀ/ɹ/ɲ/É«/ɤ/É/É–/É/Ɉ/É/Éz/És/Él/Ée/É^/ÉW/ÉP/ÉI/ÉB/É;/É4/É-/É&/É/É/É/É /É/Éü.Éõ.Éî.Éç.Éà.ÉÙ.ÉÒ.ÉË.ÉÄ.ɽ.ɶ.ɯ.ɨ.É¡.Éš.É“.ÉŒ.É….É~.Éw.Ép.Éi.Éb.É[.ÉT.ÉM.ÉF.É?.É8.É1.É*.É#.É.É.É.É.É.Éù-Éò-Éë-Éä-ÉÝ-ÉÖ-ÉÏ-ÉÈ-ÉÁ-ɺ-ɳ-ɬ-É¥-Éž-É—-É-ɉ-É‚-É{-Ét-Ém-Éf-É_-ÉX-ÉQ-ÉJ-ÉC-É<-É5-É.-É'-É -É-É-É -É-Éý,Éö,Éï,Éè,Éá,ÉÚ,ÉÓ,ÉÌ,ÉÅ,ɾ,É·,ɰ,É©,É¢,É›,É”,É,Ɇ,É,Éx,Éq,Éj,Éc,É\,ÉU,ÉN,ÉG,É@,É9,É2,É+,É$,É,É,É,É,É,Éú+Éó+Éì+Éå+ÉÞ+É×+ÉÐ+ÉÉ+ÉÂ+É»+É´+É­+ɦ+ÉŸ+ɘ+É‘+ÉŠ+Ƀ+É|+Éu+Én+Ég+É`+ÉY+ÉR+ÉK+ÉD+É=+É6+É/+É(+É!+É+É+É +É+Éþ*É÷*Éð*Éé*Éâ*ÉÛ*ÉÔ*ÉÍ*ÉÆ*É¿*ɸ*ɱ*ɪ*É£*Éœ*É•*ÉŽ*ɇ*É€*Éy*Ér*Ék*Éd*É]*ÉV*ÉO*ÉH*ÉA*É:*É3*É,*É%*É*É*É*É *É*Éû)Éô)Éí)Éæ)Éß)ÉØ)ÉÑ)ÉÊ)ÉÃ)ɼ)ɵ)É®)ɧ)É )É™)É’)É‹)É„)É})Év)Éo)Éh)Éa)ÉZ)ÉS)ÉL)ÉE)É>)É7)É0)É))É")É)É)É )É)Éÿ(Éø(Éñ(Éê(Éã(ÉÜ(ÉÕ(ÉÎ(ÉÇ(ÉÀ(ɹ(ɲ(É«(ɤ(É(É–(É(Ɉ(É(Éz(És(Él(Ée(É^(ÉW(ÉP(ÉI(ÉB(É;(É4(É-(É&(É(É(É(É (É(Éü'Éõ'Éî'Éç'Éà'ÉÙ'ÉÒ'ÉË'ÉÄ'ɽ'ɶ'ɯ'ɨ'É¡'Éš'É“'ÉŒ'É…'É~'Éw'Ép'Éi'Éb'É['ÉT'ÉM'ÉF'É?'É8'É1'É*'É#'É'É'É'É'É'Éù&Éò&Éë&Éä&ÉÝ&ÉÖ&ÉÏ&ÉÈ&ÉÁ&ɺ&ɳ&ɬ&É¥&Éž&É—&É&ɉ&É‚&É{&Ét&Ém&Éf&É_&ÉX&ÉQ&ÉJ&ÉC&É<&É5&É.&É'&É &É&É&É &É&Éý%Éö%Éï%Éè%Éá%ÉÚ%ÉÓ%ÉÌ%ÉÅ%ɾ%É·%ɰ%É©%É¢%É›%É”%É%Ɇ%É%Éx%Éq%Éj%Éc%É\%ÉU%ÉN%ÉG%É@%É9%É2%É+%É$%É%É%É%É%É%Éú$Éó$Éì$Éå$ÉÞ$É×$ÉÐ$ÉÉ$ÉÂ$É»$É´$É­$ɦ$ÉŸ$ɘ$É‘$ÉŠ$Ƀ$É|$Éu$Én$Ég$É`$ÉY$ÉR$ÉK$ÉD$É=$É6$É/$É($É!$É$É$É $É$Éþ#É÷#Éð#Éé#Éâ#ÉÛ#ÉÔ#ÉÍ#ÉÆ#É¿#ɸ#ɱ#ɪ#É£#Éœ#É•#ÉŽ#ɇ#É€#Éy#Ér#Ék#Éd#É]#ÉV#ÉO#ÉH#ÉA#É:#É3#É,#É%#É#É#É#É #É#Éû"Éô"Éí"Éæ"Éß"ÉØ"ÉÑ"ÉÊ"ÉÃ"ɼ"ɵ"É®"ɧ"É "É™"É’"É‹"É„"É}"Év"Éo"Éh"Éa"ÉZ"ÉS"ÉL"ÉE"É>"É7"É0"É)"É""É"É"É "É"Éÿ!Éø!Éñ!Éê!Éã!ÉÜ!ÉÕ!ÉÎ!ÉÇ!ÉÀ!ɹ!ɲ!É«!ɤ!É!É–!É!Ɉ!É!Éz!És!Él!Ée!É^!ÉW!ÉP!ÉI!ÉB!É;!É4!É-!É&!É!É!É!É !É!Éü Éõ Éî Éç Éà ÉÙ ÉÒ ÉË ÉÄ É½ ɶ ɯ ɨ É¡ Éš É“ ÉŒ É… É~ Éw Ép Éi Éb É[ ÉT ÉM ÉF É? É8 É1 É* É# É É É É É ÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉû Éô Éí Éæ Éß ÉØ ÉÑ ÉÊ Éà ɼ ɵ É® ɧ É  É™ É’ É‹ É„ É} Év Éo Éh Éa ÉZ ÉS ÉL ÉE É> É7 É0 É) É" É É É É Éÿ Éø Éñ Éê Éã ÉÜ ÉÕ ÉÎ ÉÇ ÉÀ ɹ ɲ É« ɤ É É– É Éˆ É Éz És Él Ée É^ ÉW ÉP ÉI ÉB É; É4 É- É& É É É É É Éü Éõ Éî Éç Éà ÉÙ ÉÒ ÉË ÉÄ É½ ɶ ɯ ɨ É¡ Éš É“ ÉŒ É… É~ Éw Ép Éi Éb É[ ÉT ÉM ÉF É? É8 É1 É* É# É É É É É Éù Éò Éë Éä ÉÝ ÉÖ ÉÏ ÉÈ ÉÁ ɺ ɳ ɬ É¥ Éž É— É É‰ É‚ É{ Ét Ém Éf É_ ÉX ÉQ ÉJ ÉC É< É5 É. É' É É É É É Éý Éö Éï Éè Éá ÉÚ ÉÓ ÉÌ ÉŠɾ É· ɰ É© É¢ É› É” É É† É Éx Éq Éj Éc É\ ÉU ÉN ÉG É@ É9 É2 É+ É$ É É É É É ÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÿÈôÿÈíÿÈæÿÈßÿÈØÿÈÑÿÈÊÿÈÃÿȼÿȵÿÈ®ÿȧÿÈ ÿÈ™ÿÈ’ÿÈ‹ÿÈ„ÿÈ}ÿÈvÿÈoÿÈhÿÈaÿÈZÿÈSÿÈLÿÈEÿÈ>ÿÈ7ÿÈ0ÿÈ)ÿÈ"ÿÈÿÈÿÈ ÿÈÿÈÿþÈøþÈñþÈêþÈãþÈÜþÈÕþÈÎþÈÇþÈÀþȹþȲþÈ«þȤþÈþÈ–þÈþȈþÈþÈzþÈsþÈlþÈeþÈ^þÈWþÈPþÈIþÈBþÈ;þÈ4þÈ-þÈ&þÈþÈþÈþÈ þÈþÈüýÈõýÈîýÈçýÈàýÈÙýÈÒýÈËýÈÄýȽýȶýȯýȨýÈ¡ýÈšýÈ“ýÈŒýÈ…ýÈ~ýÈwýÈpýÈiýÈbýÈ[ýÈTýÈMýÈFýÈ?ýÈ8ýÈ1ýÈ*ýÈ#ýÈýÈýÈýÈýÈýÈùüÈòüÈëüÈäüÈÝüÈÖüÈÏüÈÈüÈÁüȺüȳüȬüÈ¥üÈžüÈ—üÈüȉüÈ‚üÈ{üÈtüÈmüÈfüÈ_üÈXüÈQüÈJüÈCüÈ<üÈ5üÈ.üÈ'üÈ üÈüÈüÈ üÈüÈýûÈöûÈïûÈèûÈáûÈÚûÈÓûÈÌûÈÅûȾûÈ·ûȰûÈ©ûÈ¢ûÈ›ûÈ”ûÈûȆûÈûÈxûÈqûÈjûÈcûÈ\ûÈUûÈNûÈGûÈ@ûÈ9ûÈ2ûÈ+ûÈ$ûÈûÈûÈûÈûÈûÈúúÈóúÈìúÈåúÈÞúÈ×úÈÐúÈÉúÈÂúÈ»úÈ´úÈ­úȦúÈŸúȘúÈ‘úÈŠúȃúÈ|úÈuúÈnúÈgúÈ`úÈYúÈRúÈKúÈDúÈ=úÈ6úÈ/úÈ(úÈ!úÈúÈúÈ úÈúÈþùÈ÷ùÈðùÈéùÈâùÈÛùÈÔùÈÍùÈÆùÈ¿ùȸùȱùȪùÈ£ùÈœùÈ•ùÈŽùȇùÈ€ùÈyùÈrùÈkùÈdùÈ]ùÈVùÈOùÈHùÈAùÈ:ùÈ3ùÈ,ùÈ%ùÈùÈùÈùÈ ùÈùÈûøÈôøÈíøÈæøÈßøÈØøÈÑøÈÊøÈÃøÈ¼øÈµøÈ®øÈ§øÈ øÈ™øÈ’øÈ‹øÈ„øÈ}øÈvøÈoøÈhøÈaøÈZøÈSøÈLøÈEøÈ>øÈ7øÈ0øÈ)øÈ"øÈøÈøÈ øÈøÈÿ÷Èø÷Èñ÷Èê÷Èã÷ÈÜ÷ÈÕ÷ÈÎ÷ÈÇ÷ÈÀ÷ȹ÷Ȳ÷È«÷Ȥ÷È÷È–÷È÷Ȉ÷È÷Èz÷Ès÷Èl÷Èe÷È^÷ÈW÷ÈP÷ÈI÷ÈB÷È;÷È4÷È-÷È&÷È÷È÷È÷È ÷È÷ÈüöÈõöÈîöÈçöÈàöÈÙöÈÒöÈËöÈÄöȽöȶöȯöȨöÈ¡öÈšöÈ“öÈŒöÈ…öÈ~öÈwöÈpöÈiöÈböÈ[öÈTöÈMöÈFöÈ?öÈ8öÈ1öÈ*öÈ#öÈöÈöÈöÈöÈöÈùõÈòõÈëõÈäõÈÝõÈÖõÈÏõÈÈõÈÁõȺõȳõȬõÈ¥õÈžõÈ—õÈõȉõÈ‚õÈ{õÈtõÈmõÈfõÈ_õÈXõÈQõÈJõÈCõÈ<õÈ5õÈ.õÈ'õÈ õÈõÈõÈ õÈõÈýôÈöôÈïôÈèôÈáôÈÚôÈÓôÈÌôÈÅôȾôÈ·ôȰôÈ©ôÈ¢ôÈ›ôÈ”ôÈôȆôÈôÈxôÈqôÈjôÈcôÈ\ôÈUôÈNôÈGôÈ@ôÈ9ôÈ2ôÈ+ôÈ$ôÈôÈôÈôÈôÈôÈúóÈóóÈìóÈåóÈÞóÈ×óÈÐóÈÉóÈÂóÈ»óÈ´óÈ­óȦóÈŸóȘóÈ‘óÈŠóȃóÈ|óÈuóÈnóÈgóÈ`óÈYóÈRóÈKóÈDóÈ=óÈ6óÈ/óÈ(óÈ!óÈóÈóÈ óÈóÈþòÈ÷òÈðòÈéòÈâòÈÛòÈÔòÈÍòÈÆòÈ¿òȸòȱòȪòÈ£òÈœòÈ•òÈŽòȇòÈ€òÈyòÈròÈkòÈdòÈ]òÈVòÈOòÈHòÈAòÈ:òÈ3òÈ,òÈ%òÈòÈòÈòÈ òÈòÈûñÈôñÈíñÈæñÈßñÈØñÈÑñÈÊñÈÃñȼñȵñÈ®ñȧñÈ ñÈ™ñÈ’ñÈ‹ñÈ„ñÈ}ñÈvñÈoñÈhñÈañÈZñÈSñÈLñÈEñÈ>ñÈ7ñÈ0ñÈ)ñÈ"ñÈñÈñÈ ñÈñÈÿðÈøðÈñðÈêðÈãðÈÜðÈÕðÈÎðÈÇðÈÀðȹðȲðÈ«ðȤðÈðÈ–ðÈðȈðÈðÈzðÈsðÈlðÈeðÈ^ðÈWðÈPðÈIðÈBðÈ;ðÈ4ðÈ-ðÈ&ðÈðÈðÈðÈ ðÈðÈüïÈõïÈîïÈçïÈàïÈÙïÈÒïÈËïÈÄïȽïȶïȯïȨïÈ¡ïÈšïÈ“ïÈŒïÈ…ïÈ~ïÈwïÈpïÈiïÈbïÈ[ïÈTïÈMïÈFïÈ?ïÈ8ïÈ1ïÈ*ïÈ#ïÈïÈïÈïÈïÈïÈùîÈòîÈëîÈäîÈÝîÈÖîÈÏîÈÈîÈÁîȺîȳîȬîÈ¥îÈžîÈ—îÈîȉîÈ‚îÈ{îÈtîÈmîÈfîÈ_îÈXîÈQîÈJîÈCîÈ<îÈ5îÈ.îÈ'îÈ îÈîÈîÈ îÈîÈýíÈöíÈïíÈèíÈáíÈÚíÈÓíÈÌíÈÅíȾíÈ·íȰíÈ©íÈ¢íÈ›íÈ”íÈíȆíÈíÈxíÈqíÈjíÈcíÈ\íÈUíÈNíÈGíÈ@íÈ9íÈ2íÈ+íÈ$íÈíÈíÈíÈíÈíÈúìÈóìÈììÈåìÈÞìÈ×ìÈÐìÈÉìÈÂìÈ»ìÈ´ìÈ­ìȦìÈŸìȘìÈ‘ìÈŠìȃìÈ|ìÈuìÈnìÈgìÈ`ìÈYìÈRìÈKìÈDìÈ=ìÈ6ìÈ/ìÈ(ìÈ!ìÈìÈìÈ ìÈìÈþëÈ÷ëÈðëÈéëÈâëÈÛëÈÔëÈÍëÈÆëÈ¿ëȸëȱëȪëÈ£ëÈœëÈ•ëÈŽëȇëÈ€ëÈyëÈrëÈkëÈdëÈ]ëÈVëÈOëÈHëÈAëÈ:ëÈ3ëÈ,ëÈ%ëÈëÈëÈëÈ ëÈëÈûêÈôêÈíêÈæêÈßêÈØêÈÑêÈÊêÈÃêȼêȵêÈ®êȧêÈ êÈ™êÈ’êÈ‹êÈ„êÈ}êÈvêÈoêÈhêÈaêÈZêÈSêÈLêÈEêÈ>êÈ7êÈ0êÈ)êÈ"êÈêÈêÈ êÈêÈÿéÈøéÈñéÈêéÈãéÈÜéÈÕéÈÎéÈÇéÈÀéȹéȲéÈ«éȤéÈéÈ–éÈéȈéÈéÈzéÈséÈléÈeéÈ^éÈWéÈPéÈIéÈBéÈ;éÈ4éÈ-éÈ&éÈéÈéÈéÈ éÈéÈüèÈõèÈîèÈçèÈàèÈÙèÈÒèÈËèÈÄèȽèȶèȯèȨèÈ¡èÈšèÈ“èÈŒèÈ…èÈ~èÈwèÈpèÈièÈbèÈ[èÈTèÈMèÈFèÈ?èÈ8èÈ1èÈ*èÈ#èÈèÈèÈèÈèÈèÈùçÈòçÈëçÈäçÈÝçÈÖçÈÏçÈÈçÈÁçȺçȳçȬçÈ¥çÈžçÈ—çÈçȉçÈ‚çÈ{çÈtçÈmçÈfçÈ_çÈXçÈQçÈJçÈCçÈ<çÈ5çÈ.çÈ'çÈ çÈçÈçÈ çÈçÈýæÈöæÈïæÈèæÈáæÈÚæÈÓæÈÌæÈÅæÈ¾æÈ·æÈ°æÈ©æÈ¢æÈ›æÈ”æÈæÈ†æÈæÈxæÈqæÈjæÈcæÈ\æÈUæÈNæÈGæÈ@æÈ9æÈ2æÈ+æÈ$æÈæÈæÈæÈæÈæÈúåÈóåÈìåÈååÈÞåÈ×åÈÐåÈÉåÈÂåÈ»åÈ´åÈ­åȦåÈŸåȘåÈ‘åÈŠåȃåÈ|åÈuåÈnåÈgåÈ`åÈYåÈRåÈKåÈDåÈ=åÈ6åÈ/åÈ(åÈ!åÈåÈåÈ åÈåÈþäÈ÷äÈðäÈéäÈâäÈÛäÈÔäÈÍäÈÆäÈ¿äȸäȱäȪäÈ£äÈœäÈ•äÈŽäȇäÈ€äÈyäÈräÈkäÈdäÈ]äÈVäÈOäÈHäÈAäÈ:äÈ3äÈ,äÈ%äÈäÈäÈäÈ äÈäÈûãÈôãÈíãÈæãÈßãÈØãÈÑãÈÊãÈÃãȼãȵãÈ®ãȧãÈ ãÈ™ãÈ’ãÈ‹ãÈ„ãÈ}ãÈvãÈoãÈhãÈaãÈZãÈSãÈLãÈEãÈ>ãÈ7ãÈ0ãÈ)ãÈ"ãÈãÈãÈ ãÈãÈÿâÈøâÈñâÈêâÈãâÈÜâÈÕâÈÎâÈÇâÈÀâȹâȲâÈ«âȤâÈâÈ–âÈâȈâÈâÈzâÈsâÈlâÈeâÈ^âÈWâÈPâÈIâÈBâÈ;âÈ4âÈ-âÈ&âÈâÈâÈâÈ âÈâÈüáÈõáÈîáÈçáÈàáÈÙáÈÒáÈËáÈÄáȽáȶáȯáȨáÈ¡áÈšáÈ“áÈŒáÈ…áÈ~áÈwáÈpáÈiáÈbáÈ[áÈTáÈMáÈFáÈ?áÈ8áÈ1áÈ*áÈ#áÈáÈáÈáÈáÈáÈùàÈòàÈëàÈäàÈÝàÈÖàÈÏàÈÈàÈÁàȺàȳàȬàÈ¥àÈžàÈ—àÈàȉàÈ‚àÈ{àÈtàÈmàÈfàÈ_àÈXàÈQàÈJàÈCàÈ<àÈ5àÈ.àÈ'àÈ àÈàÈàÈ àÈàÈýßÈößÈïßÈèßÈáßÈÚßÈÓßÈÌßÈÅßȾßÈ·ßȰßÈ©ßÈ¢ßÈ›ßÈ”ßÈßȆßÈßÈxßÈqßÈjßÈcßÈ\ßÈUßÈNßÈGßÈ@ßÈ9ßÈ2ßÈ+ßÈ$ßÈßÈßÈßÈßÈßÈúÞÈóÞÈìÞÈåÞÈÞÞÈ×ÞÈÐÞÈÉÞÈÂÞÈ»ÞÈ´ÞÈ­ÞȦÞÈŸÞȘÞÈ‘ÞÈŠÞȃÞÈ|ÞÈuÞÈnÞÈgÞÈ`ÞÈYÞÈRÞÈKÞÈDÞÈ=ÞÈ6ÞÈ/ÞÈ(ÞÈ!ÞÈÞÈÞÈ ÞÈÞÈþÝÈ÷ÝÈðÝÈéÝÈâÝÈÛÝÈÔÝÈÍÝÈÆÝÈ¿ÝȸÝȱÝȪÝÈ£ÝÈœÝÈ•ÝÈŽÝȇÝÈ€ÝÈyÝÈrÝÈkÝÈdÝÈ]ÝÈVÝÈOÝÈHÝÈAÝÈ:ÝÈ3ÝÈ,ÝÈ%ÝÈÝÈÝÈÝÈ ÝÈÝÈûÜÈôÜÈíÜÈæÜÈßÜÈØÜÈÑÜÈÊÜÈÃÜȼÜȵÜÈ®ÜȧÜÈ ÜÈ™ÜÈ’ÜÈ‹ÜÈ„ÜÈ}ÜÈvÜÈoÜÈhÜÈaÜÈZÜÈSÜÈLÜÈEÜÈ>ÜÈ7ÜÈ0ÜÈ)ÜÈ"ÜÈÜÈÜÈ ÜÈÜÈÿÛÈøÛÈñÛÈêÛÈãÛÈÜÛÈÕÛÈÎÛÈÇÛÈÀÛȹÛȲÛÈ«ÛȤÛÈÛÈ–ÛÈÛȈÛÈÛÈzÛÈsÛÈlÛÈeÛÈ^ÛÈWÛÈPÛÈIÛÈBÛÈ;ÛÈ4ÛÈ-ÛÈ&ÛÈÛÈÛÈÛÈ ÛÈÛÈüÚÈõÚÈîÚÈçÚÈàÚÈÙÚÈÒÚÈËÚÈÄÚȽÚȶÚȯÚȨÚÈ¡ÚÈšÚÈ“ÚÈŒÚÈ…ÚÈ~ÚÈwÚÈpÚÈiÚÈbÚÈ[ÚÈTÚÈMÚÈFÚÈ?ÚÈ8ÚÈ1ÚÈ*ÚÈ#ÚÈÚÈÚÈÚÈÚÈÚÈùÙÈòÙÈëÙÈäÙÈÝÙÈÖÙÈÏÙÈÈÙÈÁÙȺÙȳÙȬÙÈ¥ÙÈžÙÈ—ÙÈÙȉÙÈ‚ÙÈ{ÙÈtÙÈmÙÈfÙÈ_ÙÈXÙÈQÙÈJÙÈCÙÈ<ÙÈ5ÙÈ.ÙÈ'ÙÈ ÙÈÙÈÙÈ ÙÈÙÈýØÈöØÈïØÈèØÈáØÈÚØÈÓØÈÌØÈÅØÈ¾ØÈ·ØÈ°ØÈ©ØÈ¢ØÈ›ØÈ”ØÈØÈ†ØÈØÈxØÈqØÈjØÈcØÈ\ØÈUØÈNØÈGØÈ@ØÈ9ØÈ2ØÈ+ØÈ$ØÈØÈØÈØÈØÈØÈú×Èó×Èì×Èå×ÈÞ×È××ÈÐ×ÈÉ×ÈÂ×È»×È´×È­×Ȧ×ÈŸ×Ș×È‘×ÈŠ×ȃ×È|×Èu×Èn×Èg×È`×ÈY×ÈR×ÈK×ÈD×È=×È6×È/×È(×È!×È×È×È ×È×ÈþÖÈ÷ÖÈðÖÈéÖÈâÖÈÛÖÈÔÖÈÍÖÈÆÖÈ¿ÖȸÖȱÖȪÖÈ£ÖÈœÖÈ•ÖÈŽÖȇÖÈ€ÖÈyÖÈrÖÈkÖÈdÖÈ]ÖÈVÖÈOÖÈHÖÈAÖÈ:ÖÈ3ÖÈ,ÖÈ%ÖÈÖÈÖÈÖÈ ÖÈÖÈûÕÈôÕÈíÕÈæÕÈßÕÈØÕÈÑÕÈÊÕÈÃÕȼÕȵÕÈ®ÕȧÕÈ ÕÈ™ÕÈ’ÕÈ‹ÕÈ„ÕÈ}ÕÈvÕÈoÕÈhÕÈaÕÈZÕÈSÕÈLÕÈEÕÈ>ÕÈ7ÕÈ0ÕÈ)ÕÈ"ÕÈÕÈÕÈ ÕÈÕÈÿÔÈøÔÈñÔÈêÔÈãÔÈÜÔÈÕÔÈÎÔÈÇÔÈÀÔȹÔȲÔÈ«ÔȤÔÈÔÈ–ÔÈÔȈÔÈÔÈzÔÈsÔÈlÔÈeÔÈ^ÔÈWÔÈPÔÈIÔÈBÔÈ;ÔÈ4ÔÈ-ÔÈ&ÔÈÔÈÔÈÔÈ ÔÈÔÈüÓÈõÓÈîÓÈçÓÈàÓÈÙÓÈÒÓÈËÓÈÄÓȽÓȶÓȯÓȨÓÈ¡ÓÈšÓÈ“ÓÈŒÓÈ…ÓÈ~ÓÈwÓÈpÓÈiÓÈbÓÈ[ÓÈTÓÈMÓÈFÓÈ?ÓÈ8ÓÈ1ÓÈ*ÓÈ#ÓÈÓÈÓÈÓÈÓÈÓÈùÒÈòÒÈëÒÈäÒÈÝÒÈÖÒÈÏÒÈÈÒÈÁÒȺÒȳÒȬÒÈ¥ÒÈžÒÈ—ÒÈÒȉÒÈ‚ÒÈ{ÒÈtÒÈmÒÈfÒÈ_ÒÈXÒÈQÒÈJÒÈCÒÈ<ÒÈ5ÒÈ.ÒÈ'ÒÈ ÒÈÒÈÒÈ ÒÈÒÈýÑÈöÑÈïÑÈèÑÈáÑÈÚÑÈÓÑÈÌÑÈÅÑȾÑÈ·ÑȰÑÈ©ÑÈ¢ÑÈ›ÑÈ”ÑÈÑȆÑÈÑÈxÑÈqÑÈjÑÈcÑÈ\ÑÈUÑÈNÑÈGÑÈ@ÑÈ9ÑÈ2ÑÈ+ÑÈ$ÑÈÑÈÑÈÑÈÑÈÑÈúÐÈóÐÈìÐÈåÐÈÞÐÈ×ÐÈÐÐÈÉÐÈÂÐÈ»ÐÈ´ÐÈ­ÐȦÐÈŸÐȘÐÈ‘ÐÈŠÐȃÐÈ|ÐÈuÐÈnÐÈgÐÈ`ÐÈYÐÈRÐÈKÐÈDÐÈ=ÐÈ6ÐÈ/ÐÈ(ÐÈ!ÐÈÐÈÐÈ ÐÈÐÈþÏÈ÷ÏÈðÏÈéÏÈâÏÈÛÏÈÔÏÈÍÏÈÆÏÈ¿ÏȸÏȱÏȪÏÈ£ÏÈœÏÈ•ÏÈŽÏȇÏÈ€ÏÈyÏÈrÏÈkÏÈdÏÈ]ÏÈVÏÈOÏÈHÏÈAÏÈ:ÏÈ3ÏÈ,ÏÈ%ÏÈÏÈÏÈÏÈ ÏÈÏÈûÎÈôÎÈíÎÈæÎÈßÎÈØÎÈÑÎÈÊÎÈÃÎȼÎȵÎÈ®ÎȧÎÈ ÎÈ™ÎÈ’ÎÈ‹ÎÈ„ÎÈ}ÎÈvÎÈoÎÈhÎÈaÎÈZÎÈSÎÈLÎÈEÎÈ>ÎÈ7ÎÈ0ÎÈ)ÎÈ"ÎÈÎÈÎÈ ÎÈÎÈÿÍÈøÍÈñÍÈêÍÈãÍÈÜÍÈÕÍÈÎÍÈÇÍÈÀÍȹÍȲÍÈ«ÍȤÍÈÍÈ–ÍÈÍȈÍÈÍÈzÍÈsÍÈlÍÈeÍÈ^ÍÈWÍÈPÍÈIÍÈBÍÈ;ÍÈ4ÍÈ-ÍÈ&ÍÈÍÈÍÈÍÈ ÍÈÍÈüÌÈõÌÈîÌÈçÌÈàÌÈÙÌÈÒÌÈËÌÈÄÌȽÌȶÌȯÌȨÌÈ¡ÌÈšÌÈ“ÌÈŒÌÈ…ÌÈ~ÌÈwÌÈpÌÈiÌÈbÌÈ[ÌÈTÌÈMÌÈFÌÈ?ÌÈ8ÌÈ1ÌÈ*ÌÈ#ÌÈÌÈÌÈÌÈÌÈÌÈùËÈòËÈëËÈäËÈÝËÈÖËÈÏËÈÈËÈÁËȺËȳËȬËÈ¥ËÈžËÈ—ËÈËȉËÈ‚ËÈ{ËÈtËÈmËÈfËÈ_ËÈXËÈQËÈJËÈCËÈ<ËÈ5ËÈ.ËÈ'ËÈ ËÈËÈËÈ ËÈËÈýÊÈöÊÈïÊÈèÊÈáÊÈÚÊÈÓÊÈÌÊÈÅÊȾÊÈ·ÊȰÊÈ©ÊÈ¢ÊÈ›ÊÈ”ÊÈÊȆÊÈÊÈxÊÈqÊÈjÊÈcÊÈ\ÊÈUÊÈNÊÈGÊÈ@ÊÈ9ÊÈ2ÊÈ+ÊÈ$ÊÈÊÈÊÈÊÈÊÈÊÈúÉÈóÉÈìÉÈåÉÈÞÉÈ×ÉÈÐÉÈÉÉÈÂÉÈ»ÉÈ´ÉÈ­ÉȦÉÈŸÉȘÉÈ‘ÉÈŠÉȃÉÈ|ÉÈuÉÈnÉÈgÉÈ`ÉÈYÉÈRÉÈKÉÈDÉÈ=ÉÈ6ÉÈ/ÉÈ(ÉÈ!ÉÈÉÈÉÈ ÉÈÉÈþÈÈ÷ÈÈðÈÈéÈÈâÈÈÛÈÈÔÈÈÍÈÈÆÈÈ¿ÈȸÈȱÈȪÈÈ£ÈÈœÈÈ•ÈÈŽÈȇÈÈ€ÈÈyÈÈrÈÈkÈÈdÈÈ]ÈÈVÈÈOÈÈHÈÈAÈÈ:ÈÈ3ÈÈ,ÈÈ%ÈÈÈÈÈÈÈÈ ÈÈÈÈûÇÈôÇÈíÇÈæÇÈßÇÈØÇÈÑÇÈÊÇÈÃÇȼÇȵÇÈ®ÇȧÇÈ ÇÈ™ÇÈ’ÇÈ‹ÇÈ„ÇÈ}ÇÈvÇÈoÇÈhÇÈaÇÈZÇÈSÇÈLÇÈEÇÈ>ÇÈ7ÇÈ0ÇÈ)ÇÈ"ÇÈÇÈÇÈ ÇÈÇÈÿÆÈøÆÈñÆÈêÆÈãÆÈÜÆÈÕÆÈÎÆÈÇÆÈÀÆÈ¹ÆÈ²ÆÈ«ÆÈ¤ÆÈÆÈ–ÆÈÆÈˆÆÈÆÈzÆÈsÆÈlÆÈeÆÈ^ÆÈWÆÈPÆÈIÆÈBÆÈ;ÆÈ4ÆÈ-ÆÈ&ÆÈÆÈÆÈÆÈ ÆÈÆÈüÅÈõÅÈîÅÈçÅÈàÅÈÙÅÈÒÅÈËÅÈÄÅȽÅȶÅȯÅȨÅÈ¡ÅÈšÅÈ“ÅÈŒÅÈ…ÅÈ~ÅÈwÅÈpÅÈiÅÈbÅÈ[ÅÈTÅÈMÅÈFÅÈ?ÅÈ8ÅÈ1ÅÈ*ÅÈ#ÅÈÅÈÅÈÅÈÅÈÅÈùÄÈòÄÈëÄÈäÄÈÝÄÈÖÄÈÏÄÈÈÄÈÁÄȺÄȳÄȬÄÈ¥ÄÈžÄÈ—ÄÈÄȉÄÈ‚ÄÈ{ÄÈtÄÈmÄÈfÄÈ_ÄÈXÄÈQÄÈJÄÈCÄÈ<ÄÈ5ÄÈ.ÄÈ'ÄÈ ÄÈÄÈÄÈ ÄÈÄÈýÃÈöÃÈïÃÈèÃÈáÃÈÚÃÈÓÃÈÌÃÈÅÃȾÃÈ·ÃȰÃÈ©ÃÈ¢ÃÈ›ÃÈ”ÃÈÃȆÃÈÃÈxÃÈqÃÈjÃÈcÃÈ\ÃÈUÃÈNÃÈGÃÈ@ÃÈ9ÃÈ2ÃÈ+ÃÈ$ÃÈÃÈÃÈÃÈÃÈÃÈúÂÈóÂÈìÂÈåÂÈÞÂÈ×ÂÈÐÂÈÉÂÈÂÂÈ»ÂÈ´ÂÈ­ÂȦÂÈŸÂȘÂÈ‘ÂÈŠÂȃÂÈ|ÂÈuÂÈnÂÈgÂÈ`ÂÈYÂÈRÂÈKÂÈDÂÈ=ÂÈ6ÂÈ/ÂÈ(ÂÈ!ÂÈÂÈÂÈ ÂÈÂÈþÁÈ÷ÁÈðÁÈéÁÈâÁÈÛÁÈÔÁÈÍÁÈÆÁÈ¿ÁȸÁȱÁȪÁÈ£ÁÈœÁÈ•ÁÈŽÁȇÁÈ€ÁÈyÁÈrÁÈkÁÈdÁÈ]ÁÈVÁÈOÁÈHÁÈAÁÈ:ÁÈ3ÁÈ,ÁÈ%ÁÈÁÈÁÈÁÈ ÁÈÁÈûÀÈôÀÈíÀÈæÀÈßÀÈØÀÈÑÀÈÊÀÈÃÀȼÀȵÀÈ®ÀȧÀÈ ÀÈ™ÀÈ’ÀÈ‹ÀÈ„ÀÈ}ÀÈvÀÈoÀÈhÀÈaÀÈZÀÈSÀÈLÀÈEÀÈ>ÀÈ7ÀÈ0ÀÈ)ÀÈ"ÀÈÀÈÀÈ ÀÈÀÈÿ¿Èø¿Èñ¿Èê¿Èã¿ÈÜ¿ÈÕ¿ÈοÈÇ¿ÈÀ¿È¹¿È²¿È«¿È¤¿È¿È–¿È¿Èˆ¿È¿Èz¿Ès¿Èl¿Èe¿È^¿ÈW¿ÈP¿ÈI¿ÈB¿È;¿È4¿È-¿È&¿È¿È¿È¿È ¿È¿Èü¾Èõ¾Èî¾Èç¾Èà¾ÈÙ¾ÈÒ¾È˾ÈľÈ½¾È¶¾È¯¾È¨¾È¡¾Èš¾È“¾ÈŒ¾È…¾È~¾Èw¾Èp¾Èi¾Èb¾È[¾ÈT¾ÈM¾ÈF¾È?¾È8¾È1¾È*¾È#¾È¾È¾È¾È¾È¾Èù½Èò½Èë½Èä½ÈݽÈÖ½ÈϽÈȽÈÁ½Èº½È³½È¬½È¥½Èž½È—½È½È‰½È‚½È{½Èt½Èm½Èf½È_½ÈX½ÈQ½ÈJ½ÈC½È<½È5½È.½È'½È ½È½È½È ½È½Èý¼Èö¼Èï¼Èè¼Èá¼ÈÚ¼ÈÓ¼È̼ÈżÈ¾¼È·¼È°¼È©¼È¢¼È›¼È”¼È¼È†¼È¼Èx¼Èq¼Èj¼Èc¼È\¼ÈU¼ÈN¼ÈG¼È@¼È9¼È2¼È+¼È$¼È¼È¼È¼È¼È¼Èú»Èó»Èì»Èå»ÈÞ»È×»ÈлÈɻȻȻ»È´»È­»È¦»ÈŸ»È˜»È‘»ÈŠ»Èƒ»È|»Èu»Èn»Èg»È`»ÈY»ÈR»ÈK»ÈD»È=»È6»È/»È(»È!»È»È»È »È»ÈþºÈ÷ºÈðºÈéºÈâºÈÛºÈÔºÈͺÈƺÈ¿ºÈ¸ºÈ±ºÈªºÈ£ºÈœºÈ•ºÈŽºÈ‡ºÈ€ºÈyºÈrºÈkºÈdºÈ]ºÈVºÈOºÈHºÈAºÈ:ºÈ3ºÈ,ºÈ%ºÈºÈºÈºÈ ºÈºÈû¹Èô¹Èí¹Èæ¹Èß¹ÈعÈѹÈʹÈùȼ¹Èµ¹È®¹È§¹È ¹È™¹È’¹È‹¹È„¹È}¹Èv¹Èo¹Èh¹Èa¹ÈZ¹ÈS¹ÈL¹ÈE¹È>¹È7¹È0¹È)¹È"¹È¹È¹È ¹È¹Èÿ¸Èø¸Èñ¸Èê¸Èã¸ÈܸÈÕ¸ÈθÈǸÈÀ¸È¹¸È²¸È«¸È¤¸È¸È–¸È¸Èˆ¸È¸Èz¸Ès¸Èl¸Èe¸È^¸ÈW¸ÈP¸ÈI¸ÈB¸È;¸È4¸È-¸È&¸È¸È¸È¸È ¸È¸Èü·Èõ·Èî·Èç·Èà·ÈÙ·ÈÒ·ÈË·ÈķȽ·È¶·È¯·È¨·È¡·Èš·È“·ÈŒ·È…·È~·Èw·Èp·Èi·Èb·È[·ÈT·ÈM·ÈF·È?·È8·È1·È*·È#·È·È·È·È·È·Èù¶Èò¶Èë¶Èä¶ÈݶÈÖ¶È϶ÈȶÈÁ¶Èº¶È³¶È¬¶È¥¶Èž¶È—¶È¶È‰¶È‚¶È{¶Èt¶Èm¶Èf¶È_¶ÈX¶ÈQ¶ÈJ¶ÈC¶È<¶È5¶È.¶È'¶È ¶È¶È¶È ¶È¶ÈýµÈöµÈïµÈèµÈáµÈÚµÈÓµÈ̵ÈŵȾµÈ·µÈ°µÈ©µÈ¢µÈ›µÈ”µÈµÈ†µÈµÈxµÈqµÈjµÈcµÈ\µÈUµÈNµÈGµÈ@µÈ9µÈ2µÈ+µÈ$µÈµÈµÈµÈµÈµÈú´Èó´Èì´Èå´ÈÞ´È×´ÈдÈÉ´È´È»´È´´È­´È¦´ÈŸ´È˜´È‘´ÈŠ´Èƒ´È|´Èu´Èn´Èg´È`´ÈY´ÈR´ÈK´ÈD´È=´È6´È/´È(´È!´È´È´È ´È´Èþ³È÷³Èð³Èé³Èâ³ÈÛ³ÈÔ³ÈͳÈƳÈ¿³È¸³È±³Èª³È£³Èœ³È•³È޳ȇ³È€³Èy³Èr³Èk³Èd³È]³ÈV³ÈO³ÈH³ÈA³È:³È3³È,³È%³È³È³È³È ³È³Èû²Èô²Èí²Èæ²Èß²ÈزÈѲÈʲÈòȼ²Èµ²È®²È§²È ²È™²È’²È‹²È„²È}²Èv²Èo²Èh²Èa²ÈZ²ÈS²ÈL²ÈE²È>²È7²È0²È)²È"²È²È²È ²È²Èÿ±Èø±Èñ±Èê±Èã±ÈܱÈÕ±ÈαÈDZÈÀ±È¹±È²±È«±È¤±È±È–±È±Èˆ±È±Èz±Ès±Èl±Èe±È^±ÈW±ÈP±ÈI±ÈB±È;±È4±È-±È&±È±È±È±È ±È±Èü°Èõ°Èî°Èç°Èà°ÈÙ°ÈÒ°È˰ÈİȽ°È¶°È¯°È¨°È¡°Èš°È“°ÈŒ°È…°È~°Èw°Èp°Èi°Èb°È[°ÈT°ÈM°ÈF°È?°È8°È1°È*°È#°È°È°È°È°È°Èù¯Èò¯Èë¯Èä¯ÈݯÈÖ¯ÈϯÈȯÈÁ¯Èº¯È³¯È¬¯È¥¯Èž¯È—¯È¯È‰¯È‚¯È{¯Èt¯Èm¯Èf¯È_¯ÈX¯ÈQ¯ÈJ¯ÈC¯È<¯È5¯È.¯È'¯È ¯È¯È¯È ¯È¯Èý®Èö®Èï®Èè®Èá®ÈÚ®ÈÓ®ÈÌ®ÈŮȾ®È·®È°®È©®È¢®È›®È”®È®È†®È®Èx®Èq®Èj®Èc®È\®ÈU®ÈN®ÈG®È@®È9®È2®È+®È$®È®È®È®È®È®Èú­Èó­Èì­Èå­ÈÞ­È×­ÈЭÈÉ­È­È»­È´­È­­È¦­ÈŸ­È˜­È‘­ÈŠ­Èƒ­È|­Èu­Èn­Èg­È`­ÈY­ÈR­ÈK­ÈD­È=­È6­È/­È(­È!­È­È­È ­È­Èþ¬È÷¬Èð¬Èé¬Èâ¬ÈÛ¬ÈÔ¬ÈͬÈƬÈ¿¬È¸¬È±¬Èª¬È£¬Èœ¬È•¬Èެȇ¬È€¬Èy¬Èr¬Èk¬Èd¬È]¬ÈV¬ÈO¬ÈH¬ÈA¬È:¬È3¬È,¬È%¬È¬È¬È¬È ¬È¬Èû«Èô«Èí«Èæ«Èß«ÈØ«ÈÑ«ÈÊ«Èëȼ«Èµ«È®«È§«È «È™«È’«È‹«È„«È}«Èv«Èo«Èh«Èa«ÈZ«ÈS«ÈL«ÈE«È>«È7«È0«È)«È"«È«È«È «È«ÈÿªÈøªÈñªÈêªÈãªÈܪÈÕªÈΪÈǪÈÀªÈ¹ªÈ²ªÈ«ªÈ¤ªÈªÈ–ªÈªÈˆªÈªÈzªÈsªÈlªÈeªÈ^ªÈWªÈPªÈIªÈBªÈ;ªÈ4ªÈ-ªÈ&ªÈªÈªÈªÈ ªÈªÈü©Èõ©Èî©Èç©Èà©ÈÙ©ÈÒ©ÈË©ÈĩȽ©È¶©È¯©È¨©È¡©Èš©È“©ÈŒ©È…©È~©Èw©Èp©Èi©Èb©È[©ÈT©ÈM©ÈF©È?©È8©È1©È*©È#©È©È©È©È©È©Èù¨Èò¨Èë¨Èä¨ÈݨÈÖ¨ÈϨÈȨÈÁ¨Èº¨È³¨È¬¨È¥¨Èž¨È—¨È¨È‰¨È‚¨È{¨Èt¨Èm¨Èf¨È_¨ÈX¨ÈQ¨ÈJ¨ÈC¨È<¨È5¨È.¨È'¨È ¨È¨È¨È ¨È¨Èý§Èö§Èï§Èè§Èá§ÈÚ§ÈÓ§Ȩ̀ÈŧȾ§È·§È°§È©§È¢§È›§È”§È§È†§È§Èx§Èq§Èj§Èc§È\§ÈU§ÈN§ÈG§È@§È9§È2§È+§È$§È§È§È§È§È§Èú¦Èó¦Èì¦Èå¦ÈÞ¦ÈצÈЦÈɦȦȻ¦È´¦È­¦È¦¦ÈŸ¦È˜¦È‘¦ÈЦȃ¦È|¦Èu¦Èn¦Èg¦È`¦ÈY¦ÈR¦ÈK¦ÈD¦È=¦È6¦È/¦È(¦È!¦È¦È¦È ¦È¦Èþ¥È÷¥Èð¥Èé¥Èâ¥ÈÛ¥ÈÔ¥ÈÍ¥ÈÆ¥È¿¥È¸¥È±¥Èª¥È£¥Èœ¥È•¥ÈŽ¥È‡¥È€¥Èy¥Èr¥Èk¥Èd¥È]¥ÈV¥ÈO¥ÈH¥ÈA¥È:¥È3¥È,¥È%¥È¥È¥È¥È ¥È¥Èû¤Èô¤Èí¤Èæ¤ÈߤÈؤÈѤÈʤÈäȼ¤Èµ¤È®¤È§¤È ¤È™¤È’¤È‹¤È„¤È}¤Èv¤Èo¤Èh¤Èa¤ÈZ¤ÈS¤ÈL¤ÈE¤È>¤È7¤È0¤È)¤È"¤È¤È¤È ¤È¤Èÿ£Èø£Èñ£Èê£Èã£ÈÜ£ÈÕ£ÈΣÈÇ£ÈÀ£È¹£È²£È«£È¤£È£È–£È£Èˆ£È£Èz£Ès£Èl£Èe£È^£ÈW£ÈP£ÈI£ÈB£È;£È4£È-£È&£È£È£È£È £È£Èü¢Èõ¢Èî¢Èç¢Èà¢ÈÙ¢ÈÒ¢ÈË¢ÈĢȽ¢È¶¢È¯¢È¨¢È¡¢Èš¢È“¢ÈŒ¢È…¢È~¢Èw¢Èp¢Èi¢Èb¢È[¢ÈT¢ÈM¢ÈF¢È?¢È8¢È1¢È*¢È#¢È¢È¢È¢È¢È¢Èù¡Èò¡Èë¡Èä¡ÈÝ¡ÈÖ¡ÈÏ¡ÈÈ¡ÈÁ¡Èº¡È³¡È¬¡È¥¡Èž¡È—¡È¡È‰¡È‚¡È{¡Èt¡Èm¡Èf¡È_¡ÈX¡ÈQ¡ÈJ¡ÈC¡È<¡È5¡È.¡È'¡È ¡È¡È¡È ¡È¡Èý Èö Èï Èè Èá ÈÚ ÈÓ ÈÌ ÈŠȾ È· È° È© È¢ È› È” È È† È Èx Èq Èj Èc È\ ÈU ÈN ÈG È@ È9 È2 È+ È$ È È È È È ÈúŸÈóŸÈìŸÈåŸÈÞŸÈןÈПÈÉŸÈŸÈ»ŸÈ´ŸÈ­ŸÈ¦ŸÈŸŸÈ˜ŸÈ‘ŸÈŠŸÈƒŸÈ|ŸÈuŸÈnŸÈgŸÈ`ŸÈYŸÈRŸÈKŸÈDŸÈ=ŸÈ6ŸÈ/ŸÈ(ŸÈ!ŸÈŸÈŸÈ ŸÈŸÈþžÈ÷žÈðžÈéžÈâžÈÛžÈÔžÈÍžÈÆžÈ¿žÈ¸žÈ±žÈªžÈ£žÈœžÈ•žÈŽžÈ‡žÈ€žÈyžÈržÈkžÈdžÈ]žÈVžÈOžÈHžÈAžÈ:žÈ3žÈ,žÈ%žÈžÈžÈžÈ žÈžÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿœÈøœÈñœÈêœÈãœÈÜœÈÕœÈΜÈÇœÈÀœÈ¹œÈ²œÈ«œÈ¤œÈœÈ–œÈœÈˆœÈœÈzœÈsœÈlœÈeœÈ^œÈWœÈPœÈIœÈBœÈ;œÈ4œÈ-œÈ&œÈœÈœÈœÈ œÈœÈü›Èõ›Èî›Èç›Èà›ÈÙ›ÈÒ›ÈË›ÈěȽ›È¶›È¯›È¨›È¡›Èš›È“›ÈŒ›È…›È~›Èw›Èp›Èi›Èb›È[›ÈT›ÈM›ÈF›È?›È8›È1›È*›È#›È›È›È›È›È›ÈùšÈòšÈëšÈäšÈÝšÈÖšÈÏšÈÈšÈÁšÈºšÈ³šÈ¬šÈ¥šÈžšÈ—šÈšÈ‰šÈ‚šÈ{šÈtšÈmšÈfšÈ_šÈXšÈQšÈJšÈCšÈ<šÈ5šÈ.šÈ'šÈ šÈšÈšÈ šÈšÈý™Èö™Èï™Èè™Èá™ÈÚ™ÈÓ™ÈÌ™ÈřȾ™È·™È°™È©™È¢™È›™È”™È™È†™È™Èx™Èq™Èj™Èc™È\™ÈU™ÈN™ÈG™È@™È9™È2™È+™È$™È™È™È™È™È™Èú˜Èó˜Èì˜Èå˜ÈÞ˜ÈטÈИÈɘȘȻ˜È´˜È­˜È¦˜ÈŸ˜È˜˜È‘˜ÈŠ˜Èƒ˜È|˜Èu˜Èn˜Èg˜È`˜ÈY˜ÈR˜ÈK˜ÈD˜È=˜È6˜È/˜È(˜È!˜È˜È˜È ˜È˜Èþ—È÷—Èð—Èé—Èâ—ÈÛ—ÈÔ—ÈÍ—ÈÆ—È¿—ȸ—ȱ—Ȫ—È£—Èœ—È•—ÈŽ—ȇ—È€—Èy—Èr—Èk—Èd—È]—ÈV—ÈO—ÈH—ÈA—È:—È3—È,—È%—È—È—È—È —È—Èû–Èô–Èí–Èæ–Èß–ÈØ–ÈÑ–ÈÊ–ÈÖȼ–ȵ–È®–ȧ–È –È™–È’–È‹–È„–È}–Èv–Èo–Èh–Èa–ÈZ–ÈS–ÈL–ÈE–È>–È7–È0–È)–È"–È–È–È –È–Èÿ•Èø•Èñ•Èê•Èã•ÈÜ•ÈÕ•ÈΕÈÇ•ÈÀ•ȹ•Ȳ•È«•Ȥ•ȕȖ•ȕȈ•È•Èz•Ès•Èl•Èe•È^•ÈW•ÈP•ÈI•ÈB•È;•È4•È-•È&•È•È•È•È •È•Èü”Èõ”Èî”Èç”Èà”ÈÙ”ÈÒ”ÈË”ÈĔȽ”ȶ”ȯ”Ȩ”È¡”Èš”È“”ÈŒ”È…”È~”Èw”Èp”Èi”Èb”È[”ÈT”ÈM”ÈF”È?”È8”È1”È*”È#”ȔȔȔȔȔÈù“Èò“Èë“Èä“ÈÝ“ÈÖ“ÈÏ“ÈÈ“ÈÁ“Ⱥ“ȳ“Ȭ“È¥“Èž“È—“ȓȉ“È‚“È{“Èt“Èm“Èf“È_“ÈX“ÈQ“ÈJ“ÈC“È<“È5“È.“È'“È “È“È“È “È“Èý’Èö’Èï’Èè’Èá’ÈÚ’ÈÓ’ÈÌ’ÈŒȾ’È·’Ȱ’È©’È¢’È›’È”’ȒȆ’È’Èx’Èq’Èj’Èc’È\’ÈU’ÈN’ÈG’È@’È9’È2’È+’È$’È’È’È’È’È’Èú‘Èó‘Èì‘Èå‘ÈÞ‘ÈבÈБÈɑȑȻ‘È´‘È­‘Ȧ‘ÈŸ‘Ș‘È‘‘ÈŠ‘ȃ‘È|‘Èu‘Èn‘Èg‘È`‘ÈY‘ÈR‘ÈK‘ÈD‘È=‘È6‘È/‘È(‘È!‘È‘È‘È ‘È‘ÈþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿŽÈøŽÈñŽÈêŽÈãŽÈÜŽÈÕŽÈÎŽÈÇŽÈÀŽÈ¹ŽÈ²ŽÈ«ŽÈ¤ŽÈŽÈ–ŽÈŽÈˆŽÈŽÈzŽÈsŽÈlŽÈeŽÈ^ŽÈWŽÈPŽÈIŽÈBŽÈ;ŽÈ4ŽÈ-ŽÈ&ŽÈŽÈŽÈŽÈ ŽÈŽÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùŒÈòŒÈëŒÈäŒÈÝŒÈÖŒÈÏŒÈÈŒÈÁŒÈºŒÈ³ŒÈ¬ŒÈ¥ŒÈžŒÈ—ŒÈŒÈ‰ŒÈ‚ŒÈ{ŒÈtŒÈmŒÈfŒÈ_ŒÈXŒÈQŒÈJŒÈCŒÈ<ŒÈ5ŒÈ.ŒÈ'ŒÈ ŒÈŒÈŒÈ ŒÈŒÈý‹Èö‹Èï‹Èè‹Èá‹ÈÚ‹ÈÓ‹ÈÌ‹ÈŋȾ‹È·‹È°‹È©‹È¢‹È›‹È”‹È‹È†‹È‹Èx‹Èq‹Èj‹Èc‹È\‹ÈU‹ÈN‹ÈG‹È@‹È9‹È2‹È+‹È$‹È‹È‹È‹È‹È‹ÈúŠÈóŠÈìŠÈåŠÈÞŠÈ׊ÈЊÈÉŠÈŠÈ»ŠÈ´ŠÈ­ŠÈ¦ŠÈŸŠÈ˜ŠÈ‘ŠÈŠŠÈƒŠÈ|ŠÈuŠÈnŠÈgŠÈ`ŠÈYŠÈRŠÈKŠÈDŠÈ=ŠÈ6ŠÈ/ŠÈ(ŠÈ!ŠÈŠÈŠÈ ŠÈŠÈþ‰È÷‰Èð‰Èé‰Èâ‰ÈÛ‰ÈÔ‰È͉ÈƉÈ¿‰È¸‰È±‰Èª‰È£‰Èœ‰È•‰Èމȇ‰È€‰Èy‰Èr‰Èk‰Èd‰È]‰ÈV‰ÈO‰ÈH‰ÈA‰È:‰È3‰È,‰È%‰È‰È‰È‰È ‰È‰ÈûˆÈôˆÈíˆÈæˆÈ߈È؈ÈшÈʈÈÈȼˆÈµˆÈ®ˆÈ§ˆÈ ˆÈ™ˆÈ’ˆÈ‹ˆÈ„ˆÈ}ˆÈvˆÈoˆÈhˆÈaˆÈZˆÈSˆÈLˆÈEˆÈ>ˆÈ7ˆÈ0ˆÈ)ˆÈ"ˆÈˆÈˆÈ ˆÈˆÈÿ‡Èø‡Èñ‡Èê‡Èã‡È܇ÈՇȷÈLJÈÀ‡È¹‡È²‡È«‡È¤‡È‡È–‡È‡Èˆ‡È‡Èz‡Ès‡Èl‡Èe‡È^‡ÈW‡ÈP‡ÈI‡ÈB‡È;‡È4‡È-‡È&‡È‡È‡È‡È ‡È‡Èü†Èõ†Èî†Èç†Èà†ÈÙ†È҆ȈÈĆȽ†È¶†È¯†È¨†È¡†Èš†È“†ÈŒ†È…†È~†Èw†Èp†Èi†Èb†È[†ÈT†ÈM†ÈF†È?†È8†È1†È*†È#†È†È†È†È†È†Èù…Èò…Èë…Èä…ÈÝ…ÈÖ…ÈÏ…ÈÈ…ÈÁ…Ⱥ…ȳ…Ȭ…È¥…Èž…È—…ȅȉ…È‚…È{…Èt…Èm…Èf…È_…ÈX…ÈQ…ÈJ…ÈC…È<…È5…È.…È'…È …È…È…È …È…Èý„Èö„Èï„Èè„Èá„ÈÚ„ÈÓ„ÈÌ„ÈńȾ„È·„Ȱ„È©„È¢„È›„È”„ȄȆ„È„Èx„Èq„Èj„Èc„È\„ÈU„ÈN„ÈG„È@„È9„È2„È+„È$„ȄȄȄȄȄÈúƒÈóƒÈìƒÈåƒÈÞƒÈ׃ÈЃÈɃȃȻƒÈ´ƒÈ­ƒÈ¦ƒÈŸƒÈ˜ƒÈ‘ƒÈŠƒÈƒƒÈ|ƒÈuƒÈnƒÈgƒÈ`ƒÈYƒÈRƒÈKƒÈDƒÈ=ƒÈ6ƒÈ/ƒÈ(ƒÈ!ƒÈƒÈƒÈ ƒÈƒÈþ‚È÷‚Èð‚Èé‚Èâ‚ÈÛ‚ÈÔ‚ÈÍ‚ÈÆ‚È¿‚ȸ‚ȱ‚Ȫ‚È£‚Èœ‚È•‚ÈŽ‚ȇ‚È€‚Èy‚Èr‚Èk‚Èd‚È]‚ÈV‚ÈO‚ÈH‚ÈA‚È:‚È3‚È,‚È%‚È‚È‚È‚È ‚È‚ÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿ€Èø€Èñ€Èê€Èã€ÈÜ€ÈÕ€È΀ÈÇ€ÈÀ€È¹€È²€È«€È¤€È€È–€È€Èˆ€È€Èz€Ès€Èl€Èe€È^€ÈW€ÈP€ÈI€ÈB€È;€È4€È-€È&€È€È€È€È €È€ÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈù~Èò~Èë~Èä~ÈÝ~ÈÖ~ÈÏ~ÈÈ~ÈÁ~Ⱥ~ȳ~Ȭ~È¥~Èž~È—~È~ȉ~È‚~È{~Èt~Èm~Èf~È_~ÈX~ÈQ~ÈJ~ÈC~È<~È5~È.~È'~È ~È~È~È ~È~Èý}Èö}Èï}Èè}Èá}ÈÚ}ÈÓ}ÈÌ}ÈÅ}Ⱦ}È·}Ȱ}È©}È¢}È›}È”}È}Ȇ}È}Èx}Èq}Èj}Èc}È\}ÈU}ÈN}ÈG}È@}È9}È2}È+}È$}È}È}È}È}È}Èú|Èó|Èì|Èå|ÈÞ|È×|ÈÐ|ÈÉ|ÈÂ|È»|È´|È­|Ȧ|ÈŸ|Ș|È‘|ÈŠ|ȃ|È||Èu|Èn|Èg|È`|ÈY|ÈR|ÈK|ÈD|È=|È6|È/|È(|È!|È|È|È |È|Èþ{È÷{Èð{Èé{Èâ{ÈÛ{ÈÔ{ÈÍ{ÈÆ{È¿{ȸ{ȱ{Ȫ{È£{Èœ{È•{ÈŽ{ȇ{È€{Èy{Èr{Èk{Èd{È]{ÈV{ÈO{ÈH{ÈA{È:{È3{È,{È%{È{È{È{È {È{ÈûzÈôzÈízÈæzÈßzÈØzÈÑzÈÊzÈÃzȼzȵzÈ®zȧzÈ zÈ™zÈ’zÈ‹zÈ„zÈ}zÈvzÈozÈhzÈazÈZzÈSzÈLzÈEzÈ>zÈ7zÈ0zÈ)zÈ"zÈzÈzÈ zÈzÈÿyÈøyÈñyÈêyÈãyÈÜyÈÕyÈÎyÈÇyÈÀyȹyȲyÈ«yȤyÈyÈ–yÈyȈyÈyÈzyÈsyÈlyÈeyÈ^yÈWyÈPyÈIyÈByÈ;yÈ4yÈ-yÈ&yÈyÈyÈyÈ yÈyÈüxÈõxÈîxÈçxÈàxÈÙxÈÒxÈËxÈÄxȽxȶxȯxȨxÈ¡xÈšxÈ“xÈŒxÈ…xÈ~xÈwxÈpxÈixÈbxÈ[xÈTxÈMxÈFxÈ?xÈ8xÈ1xÈ*xÈ#xÈxÈxÈxÈxÈxÈùwÈòwÈëwÈäwÈÝwÈÖwÈÏwÈÈwÈÁwȺwȳwȬwÈ¥wÈžwÈ—wÈwȉwÈ‚wÈ{wÈtwÈmwÈfwÈ_wÈXwÈQwÈJwÈCwÈsÈ7sÈ0sÈ)sÈ"sÈsÈsÈ sÈsÈÿrÈørÈñrÈêrÈãrÈÜrÈÕrÈÎrÈÇrÈÀrȹrȲrÈ«rȤrÈrÈ–rÈrȈrÈrÈzrÈsrÈlrÈerÈ^rÈWrÈPrÈIrÈBrÈ;rÈ4rÈ-rÈ&rÈrÈrÈrÈ rÈrÈüqÈõqÈîqÈçqÈàqÈÙqÈÒqÈËqÈÄqȽqȶqȯqȨqÈ¡qÈšqÈ“qÈŒqÈ…qÈ~qÈwqÈpqÈiqÈbqÈ[qÈTqÈMqÈFqÈ?qÈ8qÈ1qÈ*qÈ#qÈqÈqÈqÈqÈqÈùpÈòpÈëpÈäpÈÝpÈÖpÈÏpÈÈpÈÁpȺpȳpȬpÈ¥pÈžpÈ—pÈpȉpÈ‚pÈ{pÈtpÈmpÈfpÈ_pÈXpÈQpÈJpÈCpÈlÈ7lÈ0lÈ)lÈ"lÈlÈlÈ lÈlÈÿkÈøkÈñkÈêkÈãkÈÜkÈÕkÈÎkÈÇkÈÀkȹkȲkÈ«kȤkÈkÈ–kÈkȈkÈkÈzkÈskÈlkÈekÈ^kÈWkÈPkÈIkÈBkÈ;kÈ4kÈ-kÈ&kÈkÈkÈkÈ kÈkÈüjÈõjÈîjÈçjÈàjÈÙjÈÒjÈËjÈÄjȽjȶjȯjȨjÈ¡jÈšjÈ“jÈŒjÈ…jÈ~jÈwjÈpjÈijÈbjÈ[jÈTjÈMjÈFjÈ?jÈ8jÈ1jÈ*jÈ#jÈjÈjÈjÈjÈjÈùiÈòiÈëiÈäiÈÝiÈÖiÈÏiÈÈiÈÁiȺiȳiȬiÈ¥iÈžiÈ—iÈiȉiÈ‚iÈ{iÈtiÈmiÈfiÈ_iÈXiÈQiÈJiÈCiÈeÈ7eÈ0eÈ)eÈ"eÈeÈeÈ eÈeÈÿdÈødÈñdÈêdÈãdÈÜdÈÕdÈÎdÈÇdÈÀdȹdȲdÈ«dȤdÈdÈ–dÈdȈdÈdÈzdÈsdÈldÈedÈ^dÈWdÈPdÈIdÈBdÈ;dÈ4dÈ-dÈ&dÈdÈdÈdÈ dÈdÈücÈõcÈîcÈçcÈàcÈÙcÈÒcÈËcÈÄcȽcȶcȯcȨcÈ¡cÈšcÈ“cÈŒcÈ…cÈ~cÈwcÈpcÈicÈbcÈ[cÈTcÈMcÈFcÈ?cÈ8cÈ1cÈ*cÈ#cÈcÈcÈcÈcÈcÈùbÈòbÈëbÈäbÈÝbÈÖbÈÏbÈÈbÈÁbȺbȳbȬbÈ¥bÈžbÈ—bÈbȉbÈ‚bÈ{bÈtbÈmbÈfbÈ_bÈXbÈQbÈJbÈCbÈ^È7^È0^È)^È"^È^È^È ^È^Èÿ]Èø]Èñ]Èê]Èã]ÈÜ]ÈÕ]ÈÎ]ÈÇ]ÈÀ]ȹ]Ȳ]È«]Ȥ]È]È–]È]Ȉ]È]Èz]Ès]Èl]Èe]È^]ÈW]ÈP]ÈI]ÈB]È;]È4]È-]È&]È]È]È]È ]È]Èü\Èõ\Èî\Èç\Èà\ÈÙ\ÈÒ\ÈË\ÈÄ\Ƚ\ȶ\ȯ\Ȩ\È¡\Èš\È“\ÈŒ\È…\È~\Èw\Èp\Èi\Èb\È[\ÈT\ÈM\ÈF\È?\È8\È1\È*\È#\È\È\È\È\È\Èù[Èò[Èë[Èä[ÈÝ[ÈÖ[ÈÏ[ÈÈ[ÈÁ[Ⱥ[ȳ[Ȭ[È¥[Èž[È—[È[ȉ[È‚[È{[Èt[Èm[Èf[È_[ÈX[ÈQ[ÈJ[ÈC[È<[È5[È.[È'[È [È[È[È [È[ÈýZÈöZÈïZÈèZÈáZÈÚZÈÓZÈÌZÈÅZȾZÈ·ZȰZÈ©ZÈ¢ZÈ›ZÈ”ZÈZȆZÈZÈxZÈqZÈjZÈcZÈ\ZÈUZÈNZÈGZÈ@ZÈ9ZÈ2ZÈ+ZÈ$ZÈZÈZÈZÈZÈZÈúYÈóYÈìYÈåYÈÞYÈ×YÈÐYÈÉYÈÂYÈ»YÈ´YÈ­YȦYÈŸYȘYÈ‘YÈŠYȃYÈ|YÈuYÈnYÈgYÈ`YÈYYÈRYÈKYÈDYÈ=YÈ6YÈ/YÈ(YÈ!YÈYÈYÈ YÈYÈþXÈ÷XÈðXÈéXÈâXÈÛXÈÔXÈÍXÈÆXÈ¿XȸXȱXȪXÈ£XÈœXÈ•XÈŽXȇXÈ€XÈyXÈrXÈkXÈdXÈ]XÈVXÈOXÈHXÈAXÈ:XÈ3XÈ,XÈ%XÈXÈXÈXÈ XÈXÈûWÈôWÈíWÈæWÈßWÈØWÈÑWÈÊWÈÃWȼWȵWÈ®WȧWÈ WÈ™WÈ’WÈ‹WÈ„WÈ}WÈvWÈoWÈhWÈaWÈZWÈSWÈLWÈEWÈ>WÈ7WÈ0WÈ)WÈ"WÈWÈWÈ WÈWÈÿVÈøVÈñVÈêVÈãVÈÜVÈÕVÈÎVÈÇVÈÀVȹVȲVÈ«VȤVÈVÈ–VÈVȈVÈVÈzVÈsVÈlVÈeVÈ^VÈWVÈPVÈIVÈBVÈ;VÈ4VÈ-VÈ&VÈVÈVÈVÈ VÈVÈüUÈõUÈîUÈçUÈàUÈÙUÈÒUÈËUÈÄUȽUȶUȯUȨUÈ¡UÈšUÈ“UÈŒUÈ…UÈ~UÈwUÈpUÈiUÈbUÈ[UÈTUÈMUÈFUÈ?UÈ8UÈ1UÈ*UÈ#UÈUÈUÈUÈUÈUÈùTÈòTÈëTÈäTÈÝTÈÖTÈÏTÈÈTÈÁTȺTȳTȬTÈ¥TÈžTÈ—TÈTȉTÈ‚TÈ{TÈtTÈmTÈfTÈ_TÈXTÈQTÈJTÈCTÈPÈ7PÈ0PÈ)PÈ"PÈPÈPÈ PÈPÈÿOÈøOÈñOÈêOÈãOÈÜOÈÕOÈÎOÈÇOÈÀOȹOȲOÈ«OȤOÈOÈ–OÈOȈOÈOÈzOÈsOÈlOÈeOÈ^OÈWOÈPOÈIOÈBOÈ;OÈ4OÈ-OÈ&OÈOÈOÈOÈ OÈOÈüNÈõNÈîNÈçNÈàNÈÙNÈÒNÈËNÈÄNȽNȶNȯNȨNÈ¡NÈšNÈ“NÈŒNÈ…NÈ~NÈwNÈpNÈiNÈbNÈ[NÈTNÈMNÈFNÈ?NÈ8NÈ1NÈ*NÈ#NÈNÈNÈNÈNÈNÈùMÈòMÈëMÈäMÈÝMÈÖMÈÏMÈÈMÈÁMȺMȳMȬMÈ¥MÈžMÈ—MÈMȉMÈ‚MÈ{MÈtMÈmMÈfMÈ_MÈXMÈQMÈJMÈCMÈIÈ7IÈ0IÈ)IÈ"IÈIÈIÈ IÈIÈÿHÈøHÈñHÈêHÈãHÈÜHÈÕHÈÎHÈÇHÈÀHȹHȲHÈ«HȤHÈHÈ–HÈHȈHÈHÈzHÈsHÈlHÈeHÈ^HÈWHÈPHÈIHÈBHÈ;HÈ4HÈ-HÈ&HÈHÈHÈHÈ HÈHÈüGÈõGÈîGÈçGÈàGÈÙGÈÒGÈËGÈÄGȽGȶGȯGȨGÈ¡GÈšGÈ“GÈŒGÈ…GÈ~GÈwGÈpGÈiGÈbGÈ[GÈTGÈMGÈFGÈ?GÈ8GÈ1GÈ*GÈ#GÈGÈGÈGÈGÈGÈùFÈòFÈëFÈäFÈÝFÈÖFÈÏFÈÈFÈÁFȺFȳFȬFÈ¥FÈžFÈ—FÈFȉFÈ‚FÈ{FÈtFÈmFÈfFÈ_FÈXFÈQFÈJFÈCFÈBÈ7BÈ0BÈ)BÈ"BÈBÈBÈ BÈBÈÿAÈøAÈñAÈêAÈãAÈÜAÈÕAÈÎAÈÇAÈÀAȹAȲAÈ«AȤAÈAÈ–AÈAȈAÈAÈzAÈsAÈlAÈeAÈ^AÈWAÈPAÈIAÈBAÈ;AÈ4AÈ-AÈ&AÈAÈAÈAÈ AÈAÈü@Èõ@Èî@Èç@Èà@ÈÙ@ÈÒ@ÈË@ÈÄ@Ƚ@ȶ@ȯ@Ȩ@È¡@Èš@È“@ÈŒ@È…@È~@Èw@Èp@Èi@Èb@È[@ÈT@ÈM@ÈF@È?@È8@È1@È*@È#@È@È@È@È@È@Èù?Èò?Èë?Èä?ÈÝ?ÈÖ?ÈÏ?ÈÈ?ÈÁ?Ⱥ?ȳ?Ȭ?È¥?Èž?È—?È?ȉ?È‚?È{?Èt?Èm?Èf?È_?ÈX?ÈQ?ÈJ?ÈC?ÈÈö>Èï>Èè>Èá>ÈÚ>ÈÓ>ÈÌ>ÈÅ>Ⱦ>È·>Ȱ>È©>È¢>È›>È”>È>Ȇ>È>Èx>Èq>Èj>Èc>È\>ÈU>ÈN>ÈG>È@>È9>È2>È+>È$>È>È>È>È>È>Èú=Èó=Èì=Èå=ÈÞ=È×=ÈÐ=ÈÉ=ÈÂ=È»=È´=È­=Ȧ=ÈŸ=Ș=È‘=ÈŠ=ȃ=È|=Èu=Èn=Èg=È`=ÈY=ÈR=ÈK=ÈD=È==È6=È/=È(=È!=È=È=È =È=Èþ<È÷<Èð<Èé<Èâ<ÈÛ<ÈÔ<ÈÍ<ÈÆ<È¿<ȸ<ȱ<Ȫ<È£<Èœ<È•<ÈŽ<ȇ<È€<Èy<Èr<Èk<Èd<È]<ÈV<ÈO<ÈH<ÈA<È:<È3<È,<È%<È<È<È<È <È<Èû;Èô;Èí;Èæ;Èß;ÈØ;ÈÑ;ÈÊ;ÈÃ;ȼ;ȵ;È®;ȧ;È ;È™;È’;È‹;È„;È};Èv;Èo;Èh;Èa;ÈZ;ÈS;ÈL;ÈE;È>;È7;È0;È);È";È;È;È ;È;Èÿ:Èø:Èñ:Èê:Èã:ÈÜ:ÈÕ:ÈÎ:ÈÇ:ÈÀ:ȹ:Ȳ:È«:Ȥ:È:È–:È:Ȉ:È:Èz:Ès:Èl:Èe:È^:ÈW:ÈP:ÈI:ÈB:È;:È4:È-:È&:È:È:È:È :È:Èü9Èõ9Èî9Èç9Èà9ÈÙ9ÈÒ9ÈË9ÈÄ9Ƚ9ȶ9ȯ9Ȩ9È¡9Èš9È“9ÈŒ9È…9È~9Èw9Èp9Èi9Èb9È[9ÈT9ÈM9ÈF9È?9È89È19È*9È#9È9È9È9È9È9Èù8Èò8Èë8Èä8ÈÝ8ÈÖ8ÈÏ8ÈÈ8ÈÁ8Ⱥ8ȳ8Ȭ8È¥8Èž8È—8È8ȉ8È‚8È{8Èt8Èm8Èf8È_8ÈX8ÈQ8ÈJ8ÈC8È<8È58È.8È'8È 8È8È8È 8È8Èý7Èö7Èï7Èè7Èá7ÈÚ7ÈÓ7ÈÌ7ÈÅ7Ⱦ7È·7Ȱ7È©7È¢7È›7È”7È7Ȇ7È7Èx7Èq7Èj7Èc7È\7ÈU7ÈN7ÈG7È@7È97È27È+7È$7È7È7È7È7È7Èú6Èó6Èì6Èå6ÈÞ6È×6ÈÐ6ÈÉ6ÈÂ6È»6È´6È­6Ȧ6ÈŸ6Ș6È‘6ÈŠ6ȃ6È|6Èu6Èn6Èg6È`6ÈY6ÈR6ÈK6ÈD6È=6È66È/6È(6È!6È6È6È 6È6Èþ5È÷5Èð5Èé5Èâ5ÈÛ5ÈÔ5ÈÍ5ÈÆ5È¿5ȸ5ȱ5Ȫ5È£5Èœ5È•5ÈŽ5ȇ5È€5Èy5Èr5Èk5Èd5È]5ÈV5ÈO5ÈH5ÈA5È:5È35È,5È%5È5È5È5È 5È5Èû4Èô4Èí4Èæ4Èß4ÈØ4ÈÑ4ÈÊ4ÈÃ4ȼ4ȵ4È®4ȧ4È 4È™4È’4È‹4È„4È}4Èv4Èo4Èh4Èa4ÈZ4ÈS4ÈL4ÈE4È>4È74È04È)4È"4È4È4È 4È4Èÿ3Èø3Èñ3Èê3Èã3ÈÜ3ÈÕ3ÈÎ3ÈÇ3ÈÀ3ȹ3Ȳ3È«3Ȥ3È3È–3È3Ȉ3È3Èz3Ès3Èl3Èe3È^3ÈW3ÈP3ÈI3ÈB3È;3È43È-3È&3È3È3È3È 3È3Èü2Èõ2Èî2Èç2Èà2ÈÙ2ÈÒ2ÈË2ÈÄ2Ƚ2ȶ2ȯ2Ȩ2È¡2Èš2È“2ÈŒ2È…2È~2Èw2Èp2Èi2Èb2È[2ÈT2ÈM2ÈF2È?2È82È12È*2È#2È2È2È2È2È2Èù1Èò1Èë1Èä1ÈÝ1ÈÖ1ÈÏ1ÈÈ1ÈÁ1Ⱥ1ȳ1Ȭ1È¥1Èž1È—1È1ȉ1È‚1È{1Èt1Èm1Èf1È_1ÈX1ÈQ1ÈJ1ÈC1È<1È51È.1È'1È 1È1È1È 1È1Èý0Èö0Èï0Èè0Èá0ÈÚ0ÈÓ0ÈÌ0ÈÅ0Ⱦ0È·0Ȱ0È©0È¢0È›0È”0È0Ȇ0È0Èx0Èq0Èj0Èc0È\0ÈU0ÈN0ÈG0È@0È90È20È+0È$0È0È0È0È0È0Èú/Èó/Èì/Èå/ÈÞ/È×/ÈÐ/ÈÉ/ÈÂ/È»/È´/È­/Ȧ/ÈŸ/Ș/È‘/ÈŠ/ȃ/È|/Èu/Èn/Èg/È`/ÈY/ÈR/ÈK/ÈD/È=/È6/È//È(/È!/È/È/È /È/Èþ.È÷.Èð.Èé.Èâ.ÈÛ.ÈÔ.ÈÍ.ÈÆ.È¿.ȸ.ȱ.Ȫ.È£.Èœ.È•.ÈŽ.ȇ.È€.Èy.Èr.Èk.Èd.È].ÈV.ÈO.ÈH.ÈA.È:.È3.È,.È%.È.È.È.È .È.Èû-Èô-Èí-Èæ-Èß-ÈØ-ÈÑ-ÈÊ-ÈÃ-ȼ-ȵ-È®-ȧ-È -È™-È’-È‹-È„-È}-Èv-Èo-Èh-Èa-ÈZ-ÈS-ÈL-ÈE-È>-È7-È0-È)-È"-È-È-È -È-Èÿ,Èø,Èñ,Èê,Èã,ÈÜ,ÈÕ,ÈÎ,ÈÇ,ÈÀ,ȹ,Ȳ,È«,Ȥ,È,È–,È,Ȉ,È,Èz,Ès,Èl,Èe,È^,ÈW,ÈP,ÈI,ÈB,È;,È4,È-,È&,È,È,È,È ,È,Èü+Èõ+Èî+Èç+Èà+ÈÙ+ÈÒ+ÈË+ÈÄ+Ƚ+ȶ+ȯ+Ȩ+È¡+Èš+È“+ÈŒ+È…+È~+Èw+Èp+Èi+Èb+È[+ÈT+ÈM+ÈF+È?+È8+È1+È*+È#+È+È+È+È+È+Èù*Èò*Èë*Èä*ÈÝ*ÈÖ*ÈÏ*ÈÈ*ÈÁ*Ⱥ*ȳ*Ȭ*È¥*Èž*È—*È*ȉ*È‚*È{*Èt*Èm*Èf*È_*ÈX*ÈQ*ÈJ*ÈC*È<*È5*È.*È'*È *È*È*È *È*Èý)Èö)Èï)Èè)Èá)ÈÚ)ÈÓ)ÈÌ)ÈÅ)Ⱦ)È·)Ȱ)È©)È¢)È›)È”)È)Ȇ)È)Èx)Èq)Èj)Èc)È\)ÈU)ÈN)ÈG)È@)È9)È2)È+)È$)È)È)È)È)È)Èú(Èó(Èì(Èå(ÈÞ(È×(ÈÐ(ÈÉ(ÈÂ(È»(È´(È­(Ȧ(ÈŸ(Ș(È‘(ÈŠ(ȃ(È|(Èu(Èn(Èg(È`(ÈY(ÈR(ÈK(ÈD(È=(È6(È/(È((È!(È(È(È (È(Èþ'È÷'Èð'Èé'Èâ'ÈÛ'ÈÔ'ÈÍ'ÈÆ'È¿'ȸ'ȱ'Ȫ'È£'Èœ'È•'ÈŽ'ȇ'È€'Èy'Èr'Èk'Èd'È]'ÈV'ÈO'ÈH'ÈA'È:'È3'È,'È%'È'È'È'È 'È'Èû&Èô&Èí&Èæ&Èß&ÈØ&ÈÑ&ÈÊ&ÈÃ&ȼ&ȵ&È®&ȧ&È &È™&È’&È‹&È„&È}&Èv&Èo&Èh&Èa&ÈZ&ÈS&ÈL&ÈE&È>&È7&È0&È)&È"&È&È&È &È&Èÿ%Èø%Èñ%Èê%Èã%ÈÜ%ÈÕ%ÈÎ%ÈÇ%ÈÀ%ȹ%Ȳ%È«%Ȥ%È%È–%È%Ȉ%È%Èz%Ès%Èl%Èe%È^%ÈW%ÈP%ÈI%ÈB%È;%È4%È-%È&%È%È%È%È %È%Èü$Èõ$Èî$Èç$Èà$ÈÙ$ÈÒ$ÈË$ÈÄ$Ƚ$ȶ$ȯ$Ȩ$È¡$Èš$È“$ÈŒ$È…$È~$Èw$Èp$Èi$Èb$È[$ÈT$ÈM$ÈF$È?$È8$È1$È*$È#$È$È$È$È$È$Èù#Èò#Èë#Èä#ÈÝ#ÈÖ#ÈÏ#ÈÈ#ÈÁ#Ⱥ#ȳ#Ȭ#È¥#Èž#È—#È#ȉ#È‚#È{#Èt#Èm#Èf#È_#ÈX#ÈQ#ÈJ#ÈC#È<#È5#È.#È'#È #È#È#È #È#Èý"Èö"Èï"Èè"Èá"ÈÚ"ÈÓ"ÈÌ"ÈÅ"Ⱦ"È·"Ȱ"È©"È¢"È›"È”"È"Ȇ"È"Èx"Èq"Èj"Èc"È\"ÈU"ÈN"ÈG"È@"È9"È2"È+"È$"È"È"È"È"È"Èú!Èó!Èì!Èå!ÈÞ!È×!ÈÐ!ÈÉ!ÈÂ!È»!È´!È­!Ȧ!ÈŸ!Ș!È‘!ÈŠ!ȃ!È|!Èu!Èn!Èg!È`!ÈY!ÈR!ÈK!ÈD!È=!È6!È/!È(!È!!È!È!È !È!Èþ È÷ Èð Èé Èâ ÈÛ ÈÔ ÈÍ ÈÆ È¿ ȸ ȱ Ȫ È£ Èœ È• ÈŽ ȇ È€ Èy Èr Èk Èd È] ÈV ÈO ÈH ÈA È: È3 È, È% È È È È È ÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈý Èö Èï Èè Èá ÈÚ ÈÓ ÈÌ ÈŠȾ È· Ȱ È© È¢ È› È” È È† È Èx Èq Èj Èc È\ ÈU ÈN ÈG È@ È9 È2 È+ È$ È È È È È Èú Èó Èì Èå ÈÞ È× ÈÐ ÈÉ È È» È´ È­ Ȧ ÈŸ Ș È‘ ÈŠ ȃ È| Èu Èn Èg È` ÈY ÈR ÈK ÈD È= È6 È/ È( È! È È È È Èþ È÷ Èð Èé Èâ ÈÛ ÈÔ ÈÍ ÈÆ È¿ ȸ ȱ Ȫ È£ Èœ È• ÈŽ ȇ È€ Èy Èr Èk Èd È] ÈV ÈO ÈH ÈA È: È3 È, È% È È È È È Èû Èô Èí Èæ Èß ÈØ ÈÑ ÈÊ Èà ȼ ȵ È® ȧ È  È™ È’ È‹ È„ È} Èv Èo Èh Èa ÈZ ÈS ÈL ÈE È> È7 È0 È) È" È È È È Èÿ Èø Èñ Èê Èã ÈÜ ÈÕ ÈÎ ÈÇ ÈÀ ȹ Ȳ È« Ȥ È È– È Èˆ È Èz Ès Èl Èe È^ ÈW ÈP ÈI ÈB È; È4 È- È& È È È È È ÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÿÇöÿÇïÿÇèÿÇáÿÇÚÿÇÓÿÇÌÿÇÅÿǾÿÇ·ÿǰÿÇ©ÿÇ¢ÿÇ›ÿÇ”ÿÇÿdžÿÇÿÇxÿÇqÿÇjÿÇcÿÇ\ÿÇUÿÇNÿÇGÿÇ@ÿÇ9ÿÇ2ÿÇ+ÿÇ$ÿÇÿÇÿÇÿÇÿÇÿÇúþÇóþÇìþÇåþÇÞþÇ×þÇÐþÇÉþÇÂþÇ»þÇ´þÇ­þǦþÇŸþǘþÇ‘þÇŠþǃþÇ|þÇuþÇnþÇgþÇ`þÇYþÇRþÇKþÇDþÇ=þÇ6þÇ/þÇ(þÇ!þÇþÇþÇ þÇþÇþýÇ÷ýÇðýÇéýÇâýÇÛýÇÔýÇÍýÇÆýÇ¿ýǸýDZýǪýÇ£ýÇœýÇ•ýÇŽýLJýÇ€ýÇyýÇrýÇkýÇdýÇ]ýÇVýÇOýÇHýÇAýÇ:ýÇ3ýÇ,ýÇ%ýÇýÇýÇýÇ ýÇýÇûüÇôüÇíüÇæüÇßüÇØüÇÑüÇÊüÇÃüǼüǵüÇ®üǧüÇ üÇ™üÇ’üÇ‹üÇ„üÇ}üÇvüÇoüÇhüÇaüÇZüÇSüÇLüÇEüÇ>üÇ7üÇ0üÇ)üÇ"üÇüÇüÇ üÇüÇÿûÇøûÇñûÇêûÇãûÇÜûÇÕûÇÎûÇÇûÇÀûǹûDzûÇ«ûǤûÇûÇ–ûÇûLjûÇûÇzûÇsûÇlûÇeûÇ^ûÇWûÇPûÇIûÇBûÇ;ûÇ4ûÇ-ûÇ&ûÇûÇûÇûÇ ûÇûÇüúÇõúÇîúÇçúÇàúÇÙúÇÒúÇËúÇÄúǽúǶúǯúǨúÇ¡úÇšúÇ“úÇŒúÇ…úÇ~úÇwúÇpúÇiúÇbúÇ[úÇTúÇMúÇFúÇ?úÇ8úÇ1úÇ*úÇ#úÇúÇúÇúÇúÇúÇùùÇòùÇëùÇäùÇÝùÇÖùÇÏùÇÈùÇÁùǺùdzùǬùÇ¥ùÇžùÇ—ùÇùljùÇ‚ùÇ{ùÇtùÇmùÇfùÇ_ùÇXùÇQùÇJùÇCùÇ<ùÇ5ùÇ.ùÇ'ùÇ ùÇùÇùÇ ùÇùÇýøÇöøÇïøÇèøÇáøÇÚøÇÓøÇÌøÇÅøÇ¾øÇ·øÇ°øÇ©øÇ¢øÇ›øÇ”øÇøÇ†øÇøÇxøÇqøÇjøÇcøÇ\øÇUøÇNøÇGøÇ@øÇ9øÇ2øÇ+øÇ$øÇøÇøÇøÇøÇøÇú÷Çó÷Çì÷Çå÷ÇÞ÷Ç×÷ÇÐ÷ÇÉ÷ÇÂ÷Ç»÷Ç´÷Ç­÷Ǧ÷ÇŸ÷ǘ÷Ç‘÷ÇŠ÷ǃ÷Ç|÷Çu÷Çn÷Çg÷Ç`÷ÇY÷ÇR÷ÇK÷ÇD÷Ç=÷Ç6÷Ç/÷Ç(÷Ç!÷Ç÷Ç÷Ç ÷Ç÷ÇþöÇ÷öÇðöÇéöÇâöÇÛöÇÔöÇÍöÇÆöÇ¿öǸöDZöǪöÇ£öÇœöÇ•öÇŽöLJöÇ€öÇyöÇröÇköÇdöÇ]öÇVöÇOöÇHöÇAöÇ:öÇ3öÇ,öÇ%öÇöÇöÇöÇ öÇöÇûõÇôõÇíõÇæõÇßõÇØõÇÑõÇÊõÇÃõǼõǵõÇ®õǧõÇ õÇ™õÇ’õÇ‹õÇ„õÇ}õÇvõÇoõÇhõÇaõÇZõÇSõÇLõÇEõÇ>õÇ7õÇ0õÇ)õÇ"õÇõÇõÇ õÇõÇÿôÇøôÇñôÇêôÇãôÇÜôÇÕôÇÎôÇÇôÇÀôǹôDzôÇ«ôǤôÇôÇ–ôÇôLjôÇôÇzôÇsôÇlôÇeôÇ^ôÇWôÇPôÇIôÇBôÇ;ôÇ4ôÇ-ôÇ&ôÇôÇôÇôÇ ôÇôÇüóÇõóÇîóÇçóÇàóÇÙóÇÒóÇËóÇÄóǽóǶóǯóǨóÇ¡óÇšóÇ“óÇŒóÇ…óÇ~óÇwóÇpóÇióÇbóÇ[óÇTóÇMóÇFóÇ?óÇ8óÇ1óÇ*óÇ#óÇóÇóÇóÇóÇóÇùòÇòòÇëòÇäòÇÝòÇÖòÇÏòÇÈòÇÁòǺòdzòǬòÇ¥òÇžòÇ—òÇòljòÇ‚òÇ{òÇtòÇmòÇfòÇ_òÇXòÇQòÇJòÇCòÇ<òÇ5òÇ.òÇ'òÇ òÇòÇòÇ òÇòÇýñÇöñÇïñÇèñÇáñÇÚñÇÓñÇÌñÇÅñǾñÇ·ñǰñÇ©ñÇ¢ñÇ›ñÇ”ñÇñdžñÇñÇxñÇqñÇjñÇcñÇ\ñÇUñÇNñÇGñÇ@ñÇ9ñÇ2ñÇ+ñÇ$ñÇñÇñÇñÇñÇñÇúðÇóðÇìðÇåðÇÞðÇ×ðÇÐðÇÉðÇÂðÇ»ðÇ´ðÇ­ðǦðÇŸðǘðÇ‘ðÇŠðǃðÇ|ðÇuðÇnðÇgðÇ`ðÇYðÇRðÇKðÇDðÇ=ðÇ6ðÇ/ðÇ(ðÇ!ðÇðÇðÇ ðÇðÇþïÇ÷ïÇðïÇéïÇâïÇÛïÇÔïÇÍïÇÆïÇ¿ïǸïDZïǪïÇ£ïÇœïÇ•ïÇŽïLJïÇ€ïÇyïÇrïÇkïÇdïÇ]ïÇVïÇOïÇHïÇAïÇ:ïÇ3ïÇ,ïÇ%ïÇïÇïÇïÇ ïÇïÇûîÇôîÇíîÇæîÇßîÇØîÇÑîÇÊîÇÃîǼîǵîÇ®îǧîÇ îÇ™îÇ’îÇ‹îÇ„îÇ}îÇvîÇoîÇhîÇaîÇZîÇSîÇLîÇEîÇ>îÇ7îÇ0îÇ)îÇ"îÇîÇîÇ îÇîÇÿíÇøíÇñíÇêíÇãíÇÜíÇÕíÇÎíÇÇíÇÀíǹíDzíÇ«íǤíÇíÇ–íÇíLjíÇíÇzíÇsíÇlíÇeíÇ^íÇWíÇPíÇIíÇBíÇ;íÇ4íÇ-íÇ&íÇíÇíÇíÇ íÇíÇüìÇõìÇîìÇçìÇàìÇÙìÇÒìÇËìÇÄìǽìǶìǯìǨìÇ¡ìÇšìÇ“ìÇŒìÇ…ìÇ~ìÇwìÇpìÇiìÇbìÇ[ìÇTìÇMìÇFìÇ?ìÇ8ìÇ1ìÇ*ìÇ#ìÇìÇìÇìÇìÇìÇùëÇòëÇëëÇäëÇÝëÇÖëÇÏëÇÈëÇÁëǺëdzëǬëÇ¥ëÇžëÇ—ëÇëljëÇ‚ëÇ{ëÇtëÇmëÇfëÇ_ëÇXëÇQëÇJëÇCëÇ<ëÇ5ëÇ.ëÇ'ëÇ ëÇëÇëÇ ëÇëÇýêÇöêÇïêÇèêÇáêÇÚêÇÓêÇÌêÇÅêǾêÇ·êǰêÇ©êÇ¢êÇ›êÇ”êÇêdžêÇêÇxêÇqêÇjêÇcêÇ\êÇUêÇNêÇGêÇ@êÇ9êÇ2êÇ+êÇ$êÇêÇêÇêÇêÇêÇúéÇóéÇìéÇåéÇÞéÇ×éÇÐéÇÉéÇÂéÇ»éÇ´éÇ­éǦéÇŸéǘéÇ‘éÇŠéǃéÇ|éÇuéÇnéÇgéÇ`éÇYéÇRéÇKéÇDéÇ=éÇ6éÇ/éÇ(éÇ!éÇéÇéÇ éÇéÇþèÇ÷èÇðèÇéèÇâèÇÛèÇÔèÇÍèÇÆèÇ¿èǸèDZèǪèÇ£èÇœèÇ•èÇŽèLJèÇ€èÇyèÇrèÇkèÇdèÇ]èÇVèÇOèÇHèÇAèÇ:èÇ3èÇ,èÇ%èÇèÇèÇèÇ èÇèÇûçÇôçÇíçÇæçÇßçÇØçÇÑçÇÊçÇÃçǼçǵçÇ®çǧçÇ çÇ™çÇ’çÇ‹çÇ„çÇ}çÇvçÇoçÇhçÇaçÇZçÇSçÇLçÇEçÇ>çÇ7çÇ0çÇ)çÇ"çÇçÇçÇ çÇçÇÿæÇøæÇñæÇêæÇãæÇÜæÇÕæÇÎæÇÇæÇÀæÇ¹æÇ²æÇ«æÇ¤æÇæÇ–æÇæÇˆæÇæÇzæÇsæÇlæÇeæÇ^æÇWæÇPæÇIæÇBæÇ;æÇ4æÇ-æÇ&æÇæÇæÇæÇ æÇæÇüåÇõåÇîåÇçåÇàåÇÙåÇÒåÇËåÇÄåǽåǶåǯåǨåÇ¡åÇšåÇ“åÇŒåÇ…åÇ~åÇwåÇpåÇiåÇbåÇ[åÇTåÇMåÇFåÇ?åÇ8åÇ1åÇ*åÇ#åÇåÇåÇåÇåÇåÇùäÇòäÇëäÇääÇÝäÇÖäÇÏäÇÈäÇÁäǺädzäǬäÇ¥äÇžäÇ—äÇäljäÇ‚äÇ{äÇtäÇmäÇfäÇ_äÇXäÇQäÇJäÇCäÇ<äÇ5äÇ.äÇ'äÇ äÇäÇäÇ äÇäÇýãÇöãÇïãÇèãÇáãÇÚãÇÓãÇÌãÇÅãǾãÇ·ãǰãÇ©ãÇ¢ãÇ›ãÇ”ãÇãdžãÇãÇxãÇqãÇjãÇcãÇ\ãÇUãÇNãÇGãÇ@ãÇ9ãÇ2ãÇ+ãÇ$ãÇãÇãÇãÇãÇãÇúâÇóâÇìâÇåâÇÞâÇ×âÇÐâÇÉâÇÂâÇ»âÇ´âÇ­âǦâÇŸâǘâÇ‘âÇŠâǃâÇ|âÇuâÇnâÇgâÇ`âÇYâÇRâÇKâÇDâÇ=âÇ6âÇ/âÇ(âÇ!âÇâÇâÇ âÇâÇþáÇ÷áÇðáÇéáÇâáÇÛáÇÔáÇÍáÇÆáÇ¿áǸáDZáǪáÇ£áÇœáÇ•áÇŽáLJáÇ€áÇyáÇráÇkáÇdáÇ]áÇVáÇOáÇHáÇAáÇ:áÇ3áÇ,áÇ%áÇáÇáÇáÇ áÇáÇûàÇôàÇíàÇæàÇßàÇØàÇÑàÇÊàÇÃàǼàǵàÇ®àǧàÇ àÇ™àÇ’àÇ‹àÇ„àÇ}àÇvàÇoàÇhàÇaàÇZàÇSàÇLàÇEàÇ>àÇ7àÇ0àÇ)àÇ"àÇàÇàÇ àÇàÇÿßÇøßÇñßÇêßÇãßÇÜßÇÕßÇÎßÇÇßÇÀßǹßDzßÇ«ßǤßÇßÇ–ßÇßLjßÇßÇzßÇsßÇlßÇeßÇ^ßÇWßÇPßÇIßÇBßÇ;ßÇ4ßÇ-ßÇ&ßÇßÇßÇßÇ ßÇßÇüÞÇõÞÇîÞÇçÞÇàÞÇÙÞÇÒÞÇËÞÇÄÞǽÞǶÞǯÞǨÞÇ¡ÞÇšÞÇ“ÞÇŒÞÇ…ÞÇ~ÞÇwÞÇpÞÇiÞÇbÞÇ[ÞÇTÞÇMÞÇFÞÇ?ÞÇ8ÞÇ1ÞÇ*ÞÇ#ÞÇÞÇÞÇÞÇÞÇÞÇùÝÇòÝÇëÝÇäÝÇÝÝÇÖÝÇÏÝÇÈÝÇÁÝǺÝdzÝǬÝÇ¥ÝÇžÝÇ—ÝÇÝljÝÇ‚ÝÇ{ÝÇtÝÇmÝÇfÝÇ_ÝÇXÝÇQÝÇJÝÇCÝÇ<ÝÇ5ÝÇ.ÝÇ'ÝÇ ÝÇÝÇÝÇ ÝÇÝÇýÜÇöÜÇïÜÇèÜÇáÜÇÚÜÇÓÜÇÌÜÇÅÜǾÜÇ·ÜǰÜÇ©ÜÇ¢ÜÇ›ÜÇ”ÜÇÜdžÜÇÜÇxÜÇqÜÇjÜÇcÜÇ\ÜÇUÜÇNÜÇGÜÇ@ÜÇ9ÜÇ2ÜÇ+ÜÇ$ÜÇÜÇÜÇÜÇÜÇÜÇúÛÇóÛÇìÛÇåÛÇÞÛÇ×ÛÇÐÛÇÉÛÇÂÛÇ»ÛÇ´ÛÇ­ÛǦÛÇŸÛǘÛÇ‘ÛÇŠÛǃÛÇ|ÛÇuÛÇnÛÇgÛÇ`ÛÇYÛÇRÛÇKÛÇDÛÇ=ÛÇ6ÛÇ/ÛÇ(ÛÇ!ÛÇÛÇÛÇ ÛÇÛÇþÚÇ÷ÚÇðÚÇéÚÇâÚÇÛÚÇÔÚÇÍÚÇÆÚÇ¿ÚǸÚDZÚǪÚÇ£ÚÇœÚÇ•ÚÇŽÚLJÚÇ€ÚÇyÚÇrÚÇkÚÇdÚÇ]ÚÇVÚÇOÚÇHÚÇAÚÇ:ÚÇ3ÚÇ,ÚÇ%ÚÇÚÇÚÇÚÇ ÚÇÚÇûÙÇôÙÇíÙÇæÙÇßÙÇØÙÇÑÙÇÊÙÇÃÙǼÙǵÙÇ®ÙǧÙÇ ÙÇ™ÙÇ’ÙÇ‹ÙÇ„ÙÇ}ÙÇvÙÇoÙÇhÙÇaÙÇZÙÇSÙÇLÙÇEÙÇ>ÙÇ7ÙÇ0ÙÇ)ÙÇ"ÙÇÙÇÙÇ ÙÇÙÇÿØÇøØÇñØÇêØÇãØÇÜØÇÕØÇÎØÇÇØÇÀØÇ¹ØÇ²ØÇ«ØÇ¤ØÇØÇ–ØÇØÇˆØÇØÇzØÇsØÇlØÇeØÇ^ØÇWØÇPØÇIØÇBØÇ;ØÇ4ØÇ-ØÇ&ØÇØÇØÇØÇ ØÇØÇü×Çõ×Çî×Çç×Çà×ÇÙ×ÇÒ×ÇË×ÇÄ×ǽ×Ƕ×ǯ×Ǩ×Ç¡×Çš×Ç“×ÇŒ×Ç…×Ç~×Çw×Çp×Çi×Çb×Ç[×ÇT×ÇM×ÇF×Ç?×Ç8×Ç1×Ç*×Ç#×Ç×Ç×Ç×Ç×Ç×ÇùÖÇòÖÇëÖÇäÖÇÝÖÇÖÖÇÏÖÇÈÖÇÁÖǺÖdzÖǬÖÇ¥ÖÇžÖÇ—ÖÇÖljÖÇ‚ÖÇ{ÖÇtÖÇmÖÇfÖÇ_ÖÇXÖÇQÖÇJÖÇCÖÇ<ÖÇ5ÖÇ.ÖÇ'ÖÇ ÖÇÖÇÖÇ ÖÇÖÇýÕÇöÕÇïÕÇèÕÇáÕÇÚÕÇÓÕÇÌÕÇÅÕǾÕÇ·ÕǰÕÇ©ÕÇ¢ÕÇ›ÕÇ”ÕÇÕdžÕÇÕÇxÕÇqÕÇjÕÇcÕÇ\ÕÇUÕÇNÕÇGÕÇ@ÕÇ9ÕÇ2ÕÇ+ÕÇ$ÕÇÕÇÕÇÕÇÕÇÕÇúÔÇóÔÇìÔÇåÔÇÞÔÇ×ÔÇÐÔÇÉÔÇÂÔÇ»ÔÇ´ÔÇ­ÔǦÔÇŸÔǘÔÇ‘ÔÇŠÔǃÔÇ|ÔÇuÔÇnÔÇgÔÇ`ÔÇYÔÇRÔÇKÔÇDÔÇ=ÔÇ6ÔÇ/ÔÇ(ÔÇ!ÔÇÔÇÔÇ ÔÇÔÇþÓÇ÷ÓÇðÓÇéÓÇâÓÇÛÓÇÔÓÇÍÓÇÆÓÇ¿ÓǸÓDZÓǪÓÇ£ÓÇœÓÇ•ÓÇŽÓLJÓÇ€ÓÇyÓÇrÓÇkÓÇdÓÇ]ÓÇVÓÇOÓÇHÓÇAÓÇ:ÓÇ3ÓÇ,ÓÇ%ÓÇÓÇÓÇÓÇ ÓÇÓÇûÒÇôÒÇíÒÇæÒÇßÒÇØÒÇÑÒÇÊÒÇÃÒǼÒǵÒÇ®ÒǧÒÇ ÒÇ™ÒÇ’ÒÇ‹ÒÇ„ÒÇ}ÒÇvÒÇoÒÇhÒÇaÒÇZÒÇSÒÇLÒÇEÒÇ>ÒÇ7ÒÇ0ÒÇ)ÒÇ"ÒÇÒÇÒÇ ÒÇÒÇÿÑÇøÑÇñÑÇêÑÇãÑÇÜÑÇÕÑÇÎÑÇÇÑÇÀÑǹÑDzÑÇ«ÑǤÑÇÑÇ–ÑÇÑLjÑÇÑÇzÑÇsÑÇlÑÇeÑÇ^ÑÇWÑÇPÑÇIÑÇBÑÇ;ÑÇ4ÑÇ-ÑÇ&ÑÇÑÇÑÇÑÇ ÑÇÑÇüÐÇõÐÇîÐÇçÐÇàÐÇÙÐÇÒÐÇËÐÇÄÐǽÐǶÐǯÐǨÐÇ¡ÐÇšÐÇ“ÐÇŒÐÇ…ÐÇ~ÐÇwÐÇpÐÇiÐÇbÐÇ[ÐÇTÐÇMÐÇFÐÇ?ÐÇ8ÐÇ1ÐÇ*ÐÇ#ÐÇÐÇÐÇÐÇÐÇÐÇùÏÇòÏÇëÏÇäÏÇÝÏÇÖÏÇÏÏÇÈÏÇÁÏǺÏdzÏǬÏÇ¥ÏÇžÏÇ—ÏÇÏljÏÇ‚ÏÇ{ÏÇtÏÇmÏÇfÏÇ_ÏÇXÏÇQÏÇJÏÇCÏÇ<ÏÇ5ÏÇ.ÏÇ'ÏÇ ÏÇÏÇÏÇ ÏÇÏÇýÎÇöÎÇïÎÇèÎÇáÎÇÚÎÇÓÎÇÌÎÇÅÎǾÎÇ·ÎǰÎÇ©ÎÇ¢ÎÇ›ÎÇ”ÎÇÎdžÎÇÎÇxÎÇqÎÇjÎÇcÎÇ\ÎÇUÎÇNÎÇGÎÇ@ÎÇ9ÎÇ2ÎÇ+ÎÇ$ÎÇÎÇÎÇÎÇÎÇÎÇúÍÇóÍÇìÍÇåÍÇÞÍÇ×ÍÇÐÍÇÉÍÇÂÍÇ»ÍÇ´ÍÇ­ÍǦÍÇŸÍǘÍÇ‘ÍÇŠÍǃÍÇ|ÍÇuÍÇnÍÇgÍÇ`ÍÇYÍÇRÍÇKÍÇDÍÇ=ÍÇ6ÍÇ/ÍÇ(ÍÇ!ÍÇÍÇÍÇ ÍÇÍÇþÌÇ÷ÌÇðÌÇéÌÇâÌÇÛÌÇÔÌÇÍÌÇÆÌÇ¿ÌǸÌDZÌǪÌÇ£ÌÇœÌÇ•ÌÇŽÌLJÌÇ€ÌÇyÌÇrÌÇkÌÇdÌÇ]ÌÇVÌÇOÌÇHÌÇAÌÇ:ÌÇ3ÌÇ,ÌÇ%ÌÇÌÇÌÇÌÇ ÌÇÌÇûËÇôËÇíËÇæËÇßËÇØËÇÑËÇÊËÇÃËǼËǵËÇ®ËǧËÇ ËÇ™ËÇ’ËÇ‹ËÇ„ËÇ}ËÇvËÇoËÇhËÇaËÇZËÇSËÇLËÇEËÇ>ËÇ7ËÇ0ËÇ)ËÇ"ËÇËÇËÇ ËÇËÇÿÊÇøÊÇñÊÇêÊÇãÊÇÜÊÇÕÊÇÎÊÇÇÊÇÀÊǹÊDzÊÇ«ÊǤÊÇÊÇ–ÊÇÊLjÊÇÊÇzÊÇsÊÇlÊÇeÊÇ^ÊÇWÊÇPÊÇIÊÇBÊÇ;ÊÇ4ÊÇ-ÊÇ&ÊÇÊÇÊÇÊÇ ÊÇÊÇüÉÇõÉÇîÉÇçÉÇàÉÇÙÉÇÒÉÇËÉÇÄÉǽÉǶÉǯÉǨÉÇ¡ÉÇšÉÇ“ÉÇŒÉÇ…ÉÇ~ÉÇwÉÇpÉÇiÉÇbÉÇ[ÉÇTÉÇMÉÇFÉÇ?ÉÇ8ÉÇ1ÉÇ*ÉÇ#ÉÇÉÇÉÇÉÇÉÇÉÇùÈÇòÈÇëÈÇäÈÇÝÈÇÖÈÇÏÈÇÈÈÇÁÈǺÈdzÈǬÈÇ¥ÈÇžÈÇ—ÈÇÈljÈÇ‚ÈÇ{ÈÇtÈÇmÈÇfÈÇ_ÈÇXÈÇQÈÇJÈÇCÈÇ<ÈÇ5ÈÇ.ÈÇ'ÈÇ ÈÇÈÇÈÇ ÈÇÈÇýÇÇöÇÇïÇÇèÇÇáÇÇÚÇÇÓÇÇÌÇÇÅÇǾÇÇ·ÇǰÇÇ©ÇÇ¢ÇÇ›ÇÇ”ÇÇÇdžÇÇÇÇxÇÇqÇÇjÇÇcÇÇ\ÇÇUÇÇNÇÇGÇÇ@ÇÇ9ÇÇ2ÇÇ+ÇÇ$ÇÇÇÇÇÇÇÇÇÇÇÇúÆÇóÆÇìÆÇåÆÇÞÆÇׯÇÐÆÇÉÆÇÂÆÇ»ÆÇ´ÆÇ­ÆÇ¦ÆÇŸÆÇ˜ÆÇ‘ÆÇŠÆÇƒÆÇ|ÆÇuÆÇnÆÇgÆÇ`ÆÇYÆÇRÆÇKÆÇDÆÇ=ÆÇ6ÆÇ/ÆÇ(ÆÇ!ÆÇÆÇÆÇ ÆÇÆÇþÅÇ÷ÅÇðÅÇéÅÇâÅÇÛÅÇÔÅÇÍÅÇÆÅÇ¿ÅǸÅDZÅǪÅÇ£ÅÇœÅÇ•ÅÇŽÅLJÅÇ€ÅÇyÅÇrÅÇkÅÇdÅÇ]ÅÇVÅÇOÅÇHÅÇAÅÇ:ÅÇ3ÅÇ,ÅÇ%ÅÇÅÇÅÇÅÇ ÅÇÅÇûÄÇôÄÇíÄÇæÄÇßÄÇØÄÇÑÄÇÊÄÇÃÄǼÄǵÄÇ®ÄǧÄÇ ÄÇ™ÄÇ’ÄÇ‹ÄÇ„ÄÇ}ÄÇvÄÇoÄÇhÄÇaÄÇZÄÇSÄÇLÄÇEÄÇ>ÄÇ7ÄÇ0ÄÇ)ÄÇ"ÄÇÄÇÄÇ ÄÇÄÇÿÃÇøÃÇñÃÇêÃÇãÃÇÜÃÇÕÃÇÎÃÇÇÃÇÀÃǹÃDzÃÇ«ÃǤÃÇÃÇ–ÃÇÃLjÃÇÃÇzÃÇsÃÇlÃÇeÃÇ^ÃÇWÃÇPÃÇIÃÇBÃÇ;ÃÇ4ÃÇ-ÃÇ&ÃÇÃÇÃÇÃÇ ÃÇÃÇüÂÇõÂÇîÂÇçÂÇàÂÇÙÂÇÒÂÇËÂÇÄÂǽÂǶÂǯÂǨÂÇ¡ÂÇšÂÇ“ÂÇŒÂÇ…ÂÇ~ÂÇwÂÇpÂÇiÂÇbÂÇ[ÂÇTÂÇMÂÇFÂÇ?ÂÇ8ÂÇ1ÂÇ*ÂÇ#ÂÇÂÇÂÇÂÇÂÇÂÇùÁÇòÁÇëÁÇäÁÇÝÁÇÖÁÇÏÁÇÈÁÇÁÁǺÁdzÁǬÁÇ¥ÁÇžÁÇ—ÁÇÁljÁÇ‚ÁÇ{ÁÇtÁÇmÁÇfÁÇ_ÁÇXÁÇQÁÇJÁÇCÁÇ<ÁÇ5ÁÇ.ÁÇ'ÁÇ ÁÇÁÇÁÇ ÁÇÁÇýÀÇöÀÇïÀÇèÀÇáÀÇÚÀÇÓÀÇÌÀÇÅÀǾÀÇ·ÀǰÀÇ©ÀÇ¢ÀÇ›ÀÇ”ÀÇÀdžÀÇÀÇxÀÇqÀÇjÀÇcÀÇ\ÀÇUÀÇNÀÇGÀÇ@ÀÇ9ÀÇ2ÀÇ+ÀÇ$ÀÇÀÇÀÇÀÇÀÇÀÇú¿Çó¿Çì¿Çå¿ÇÞ¿Ç׿ÇпÇɿǿǻ¿Ç´¿Ç­¿Ç¦¿ÇŸ¿Ç˜¿Ç‘¿ÇŠ¿Çƒ¿Ç|¿Çu¿Çn¿Çg¿Ç`¿ÇY¿ÇR¿ÇK¿ÇD¿Ç=¿Ç6¿Ç/¿Ç(¿Ç!¿Ç¿Ç¿Ç ¿Ç¿Çþ¾Ç÷¾Çð¾Çé¾Çâ¾ÇÛ¾ÇÔ¾Ç;ÇƾÇ¿¾Ç¸¾Ç±¾Çª¾Ç£¾Çœ¾Ç•¾Ç޾LJ¾Ç€¾Çy¾Çr¾Çk¾Çd¾Ç]¾ÇV¾ÇO¾ÇH¾ÇA¾Ç:¾Ç3¾Ç,¾Ç%¾Ç¾Ç¾Ç¾Ç ¾Ç¾Çû½Çô½Çí½Çæ½Çß½ÇؽÇѽÇʽÇýǼ½Çµ½Ç®½Ç§½Ç ½Ç™½Ç’½Ç‹½Ç„½Ç}½Çv½Ço½Çh½Ça½ÇZ½ÇS½ÇL½ÇE½Ç>½Ç7½Ç0½Ç)½Ç"½Ç½Ç½Ç ½Ç½Çÿ¼Çø¼Çñ¼Çê¼Çã¼ÇܼÇÕ¼ÇμÇǼÇÀ¼Ç¹¼Ç²¼Ç«¼Ç¤¼Ç¼Ç–¼Ç¼Çˆ¼Ç¼Çz¼Çs¼Çl¼Çe¼Ç^¼ÇW¼ÇP¼ÇI¼ÇB¼Ç;¼Ç4¼Ç-¼Ç&¼Ç¼Ç¼Ç¼Ç ¼Ç¼Çü»Çõ»Çî»Çç»Çà»ÇÙ»ÇÒ»ÇË»ÇĻǽ»Ç¶»Ç¯»Ç¨»Ç¡»Çš»Ç“»ÇŒ»Ç…»Ç~»Çw»Çp»Çi»Çb»Ç[»ÇT»ÇM»ÇF»Ç?»Ç8»Ç1»Ç*»Ç#»Ç»Ç»Ç»Ç»Ç»ÇùºÇòºÇëºÇäºÇݺÇÖºÇϺÇȺÇÁºÇººÇ³ºÇ¬ºÇ¥ºÇžºÇ—ºÇºÇ‰ºÇ‚ºÇ{ºÇtºÇmºÇfºÇ_ºÇXºÇQºÇJºÇCºÇ<ºÇ5ºÇ.ºÇ'ºÇ ºÇºÇºÇ ºÇºÇý¹Çö¹Çï¹Çè¹Çá¹ÇÚ¹ÇÓ¹Ç̹ÇŹÇ¾¹Ç·¹Ç°¹Ç©¹Ç¢¹Ç›¹Ç”¹Ç¹Ç†¹Ç¹Çx¹Çq¹Çj¹Çc¹Ç\¹ÇU¹ÇN¹ÇG¹Ç@¹Ç9¹Ç2¹Ç+¹Ç$¹Ç¹Ç¹Ç¹Ç¹Ç¹Çú¸Çó¸Çì¸Çå¸ÇÞ¸Ç׸ÇиÇɸǸǻ¸Ç´¸Ç­¸Ç¦¸ÇŸ¸Ç˜¸Ç‘¸ÇЏÇƒ¸Ç|¸Çu¸Çn¸Çg¸Ç`¸ÇY¸ÇR¸ÇK¸ÇD¸Ç=¸Ç6¸Ç/¸Ç(¸Ç!¸Ç¸Ç¸Ç ¸Ç¸Çþ·Ç÷·Çð·Çé·Çâ·ÇÛ·ÇÔ·ÇÍ·ÇÆ·Ç¿·Ç¸·Ç±·Çª·Ç£·Çœ·Ç•·ÇŽ·Ç‡·Ç€·Çy·Çr·Çk·Çd·Ç]·ÇV·ÇO·ÇH·ÇA·Ç:·Ç3·Ç,·Ç%·Ç·Ç·Ç·Ç ·Ç·Çû¶Çô¶Çí¶Çæ¶Çß¶ÇضÇѶÇʶÇöǼ¶Çµ¶Ç®¶Ç§¶Ç ¶Ç™¶Ç’¶Ç‹¶Ç„¶Ç}¶Çv¶Ço¶Çh¶Ça¶ÇZ¶ÇS¶ÇL¶ÇE¶Ç>¶Ç7¶Ç0¶Ç)¶Ç"¶Ç¶Ç¶Ç ¶Ç¶ÇÿµÇøµÇñµÇêµÇãµÇܵÇÕµÇεÇǵÇÀµÇ¹µÇ²µÇ«µÇ¤µÇµÇ–µÇµÇˆµÇµÇzµÇsµÇlµÇeµÇ^µÇWµÇPµÇIµÇBµÇ;µÇ4µÇ-µÇ&µÇµÇµÇµÇ µÇµÇü´Çõ´Çî´Çç´Çà´ÇÙ´ÇÒ´ÇË´ÇĴǽ´Ç¶´Ç¯´Ç¨´Ç¡´Çš´Ç“´ÇŒ´Ç…´Ç~´Çw´Çp´Çi´Çb´Ç[´ÇT´ÇM´ÇF´Ç?´Ç8´Ç1´Ç*´Ç#´Ç´Ç´Ç´Ç´Ç´Çù³Çò³Çë³Çä³ÇݳÇÖ³ÇϳÇȳÇÁ³Çº³Ç³³Ç¬³Ç¥³Çž³Ç—³Ç³Ç‰³Ç‚³Ç{³Çt³Çm³Çf³Ç_³ÇX³ÇQ³ÇJ³ÇC³Ç<³Ç5³Ç.³Ç'³Ç ³Ç³Ç³Ç ³Ç³Çý²Çö²Çï²Çè²Çá²ÇÚ²ÇÓ²Ç̲ÇŲǾ²Ç·²Ç°²Ç©²Ç¢²Ç›²Ç”²Ç²Ç†²Ç²Çx²Çq²Çj²Çc²Ç\²ÇU²ÇN²ÇG²Ç@²Ç9²Ç2²Ç+²Ç$²Ç²Ç²Ç²Ç²Ç²Çú±Çó±Çì±Çå±ÇÞ±Ç×±ÇбÇɱDZǻ±Ç´±Ç­±Ç¦±ÇŸ±Ç˜±Ç‘±Çбǃ±Ç|±Çu±Çn±Çg±Ç`±ÇY±ÇR±ÇK±ÇD±Ç=±Ç6±Ç/±Ç(±Ç!±Ç±Ç±Ç ±Ç±Çþ°Ç÷°Çð°Çé°Çâ°ÇÛ°ÇÔ°ÇͰÇưÇ¿°Ç¸°Ç±°Çª°Ç£°Çœ°Ç•°ÇްLJ°Ç€°Çy°Çr°Çk°Çd°Ç]°ÇV°ÇO°ÇH°ÇA°Ç:°Ç3°Ç,°Ç%°Ç°Ç°Ç°Ç °Ç°Çû¯Çô¯Çí¯Çæ¯Ç߯ÇدÇѯÇʯÇïǼ¯Çµ¯Ç®¯Ç§¯Ç ¯Ç™¯Ç’¯Ç‹¯Ç„¯Ç}¯Çv¯Ço¯Çh¯Ça¯ÇZ¯ÇS¯ÇL¯ÇE¯Ç>¯Ç7¯Ç0¯Ç)¯Ç"¯Ç¯Ç¯Ç ¯Ç¯Çÿ®Çø®Çñ®Çê®Çã®ÇÜ®ÇÕ®ÇήÇÇ®ÇÀ®Ç¹®Ç²®Ç«®Ç¤®Ç®Ç–®Ç®Çˆ®Ç®Çz®Çs®Çl®Çe®Ç^®ÇW®ÇP®ÇI®ÇB®Ç;®Ç4®Ç-®Ç&®Ç®Ç®Ç®Ç ®Ç®Çü­Çõ­Çî­Çç­Çà­ÇÙ­ÇÒ­ÇË­Çĭǽ­Ç¶­Ç¯­Ç¨­Ç¡­Çš­Ç“­ÇŒ­Ç…­Ç~­Çw­Çp­Çi­Çb­Ç[­ÇT­ÇM­ÇF­Ç?­Ç8­Ç1­Ç*­Ç#­Ç­Ç­Ç­Ç­Ç­Çù¬Çò¬Çë¬Çä¬ÇݬÇÖ¬ÇϬÇȬÇÁ¬Çº¬Ç³¬Ç¬¬Ç¥¬Çž¬Ç—¬Ç¬Ç‰¬Ç‚¬Ç{¬Çt¬Çm¬Çf¬Ç_¬ÇX¬ÇQ¬ÇJ¬ÇC¬Ç<¬Ç5¬Ç.¬Ç'¬Ç ¬Ç¬Ç¬Ç ¬Ç¬Çý«Çö«Çï«Çè«Çá«ÇÚ«ÇÓ«ÇÌ«ÇūǾ«Ç·«Ç°«Ç©«Ç¢«Ç›«Ç”«Ç«Ç†«Ç«Çx«Çq«Çj«Çc«Ç\«ÇU«ÇN«ÇG«Ç@«Ç9«Ç2«Ç+«Ç$«Ç«Ç«Ç«Ç«Ç«ÇúªÇóªÇìªÇåªÇÞªÇתÇЪÇɪǪǻªÇ´ªÇ­ªÇ¦ªÇŸªÇ˜ªÇ‘ªÇŠªÇƒªÇ|ªÇuªÇnªÇgªÇ`ªÇYªÇRªÇKªÇDªÇ=ªÇ6ªÇ/ªÇ(ªÇ!ªÇªÇªÇ ªÇªÇþ©Ç÷©Çð©Çé©Çâ©ÇÛ©ÇÔ©ÇÍ©ÇÆ©Ç¿©Ç¸©Ç±©Çª©Ç£©Çœ©Ç•©ÇŽ©Ç‡©Ç€©Çy©Çr©Çk©Çd©Ç]©ÇV©ÇO©ÇH©ÇA©Ç:©Ç3©Ç,©Ç%©Ç©Ç©Ç©Ç ©Ç©Çû¨Çô¨Çí¨Çæ¨ÇߨÇبÇѨÇʨÇèǼ¨Çµ¨Ç®¨Ç§¨Ç ¨Ç™¨Ç’¨Ç‹¨Ç„¨Ç}¨Çv¨Ço¨Çh¨Ça¨ÇZ¨ÇS¨ÇL¨ÇE¨Ç>¨Ç7¨Ç0¨Ç)¨Ç"¨Ç¨Ç¨Ç ¨Ç¨Çÿ§Çø§Çñ§Çê§Çã§ÇܧÇÕ§ÇΧÇǧÇÀ§Ç¹§Ç²§Ç«§Ç¤§Ç§Ç–§Ç§Çˆ§Ç§Çz§Çs§Çl§Çe§Ç^§ÇW§ÇP§ÇI§ÇB§Ç;§Ç4§Ç-§Ç&§Ç§Ç§Ç§Ç §Ç§Çü¦Çõ¦Çî¦Çç¦Çà¦ÇÙ¦ÇÒ¦Ç˦ÇĦǽ¦Ç¶¦Ç¯¦Ç¨¦Ç¡¦Çš¦Ç“¦ÇŒ¦Ç…¦Ç~¦Çw¦Çp¦Çi¦Çb¦Ç[¦ÇT¦ÇM¦ÇF¦Ç?¦Ç8¦Ç1¦Ç*¦Ç#¦Ç¦Ç¦Ç¦Ç¦Ç¦Çù¥Çò¥Çë¥Çä¥ÇÝ¥ÇÖ¥ÇÏ¥ÇÈ¥ÇÁ¥Çº¥Ç³¥Ç¬¥Ç¥¥Çž¥Ç—¥Ç¥Ç‰¥Ç‚¥Ç{¥Çt¥Çm¥Çf¥Ç_¥ÇX¥ÇQ¥ÇJ¥ÇC¥Ç<¥Ç5¥Ç.¥Ç'¥Ç ¥Ç¥Ç¥Ç ¥Ç¥Çý¤Çö¤Çï¤Çè¤Çá¤ÇÚ¤ÇÓ¤Ç̤ÇŤÇ¾¤Ç·¤Ç°¤Ç©¤Ç¢¤Ç›¤Ç”¤Ç¤Ç†¤Ç¤Çx¤Çq¤Çj¤Çc¤Ç\¤ÇU¤ÇN¤ÇG¤Ç@¤Ç9¤Ç2¤Ç+¤Ç$¤Ç¤Ç¤Ç¤Ç¤Ç¤Çú£Çó£Çì£Çå£ÇÞ£Ç×£ÇУÇɣǣǻ£Ç´£Ç­£Ç¦£ÇŸ£Ç˜£Ç‘£ÇŠ£Çƒ£Ç|£Çu£Çn£Çg£Ç`£ÇY£ÇR£ÇK£ÇD£Ç=£Ç6£Ç/£Ç(£Ç!£Ç£Ç£Ç £Ç£Çþ¢Ç÷¢Çð¢Çé¢Çâ¢ÇÛ¢ÇÔ¢ÇÍ¢ÇÆ¢Ç¿¢Ç¸¢Ç±¢Çª¢Ç£¢Çœ¢Ç•¢ÇŽ¢Ç‡¢Ç€¢Çy¢Çr¢Çk¢Çd¢Ç]¢ÇV¢ÇO¢ÇH¢ÇA¢Ç:¢Ç3¢Ç,¢Ç%¢Ç¢Ç¢Ç¢Ç ¢Ç¢Çû¡Çô¡Çí¡Çæ¡Çß¡ÇØ¡ÇÑ¡ÇÊ¡ÇáǼ¡Çµ¡Ç®¡Ç§¡Ç ¡Ç™¡Ç’¡Ç‹¡Ç„¡Ç}¡Çv¡Ço¡Çh¡Ça¡ÇZ¡ÇS¡ÇL¡ÇE¡Ç>¡Ç7¡Ç0¡Ç)¡Ç"¡Ç¡Ç¡Ç ¡Ç¡Çÿ Çø Çñ Çê Çã ÇÜ ÇÕ ÇΠÇÇ ÇÀ Ç¹ Ç² Ç« Ç¤ Ç Ç– Ç Çˆ Ç Çz Çs Çl Çe Ç^ ÇW ÇP ÇI ÇB Ç; Ç4 Ç- Ç& Ç Ç Ç Ç  Ç ÇüŸÇõŸÇîŸÇçŸÇàŸÇÙŸÇÒŸÇËŸÇğǽŸÇ¶ŸÇ¯ŸÇ¨ŸÇ¡ŸÇšŸÇ“ŸÇŒŸÇ…ŸÇ~ŸÇwŸÇpŸÇiŸÇbŸÇ[ŸÇTŸÇMŸÇFŸÇ?ŸÇ8ŸÇ1ŸÇ*ŸÇ#ŸÇŸÇŸÇŸÇŸÇŸÇùžÇòžÇëžÇäžÇÝžÇÖžÇÏžÇÈžÇÁžÇºžÇ³žÇ¬žÇ¥žÇžžÇ—žÇžÇ‰žÇ‚žÇ{žÇtžÇmžÇfžÇ_žÇXžÇQžÇJžÇCžÇ<žÇ5žÇ.žÇ'žÇ žÇžÇžÇ žÇžÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúœÇóœÇìœÇåœÇÞœÇלÇМÇɜǜǻœÇ´œÇ­œÇ¦œÇŸœÇ˜œÇ‘œÇŠœÇƒœÇ|œÇuœÇnœÇgœÇ`œÇYœÇRœÇKœÇDœÇ=œÇ6œÇ/œÇ(œÇ!œÇœÇœÇ œÇœÇþ›Ç÷›Çð›Çé›Çâ›ÇÛ›ÇÔ›ÇÍ›ÇÆ›Ç¿›Ç¸›Ç±›Çª›Ç£›Çœ›Ç•›ÇŽ›Ç‡›Ç€›Çy›Çr›Çk›Çd›Ç]›ÇV›ÇO›ÇH›ÇA›Ç:›Ç3›Ç,›Ç%›Ç›Ç›Ç›Ç ›Ç›ÇûšÇôšÇíšÇæšÇßšÇØšÇÑšÇÊšÇÚǼšÇµšÇ®šÇ§šÇ šÇ™šÇ’šÇ‹šÇ„šÇ}šÇvšÇošÇhšÇašÇZšÇSšÇLšÇEšÇ>šÇ7šÇ0šÇ)šÇ"šÇšÇšÇ šÇšÇÿ™Çø™Çñ™Çê™Çã™ÇÜ™ÇÕ™ÇΙÇÇ™ÇÀ™Ç¹™Ç²™Ç«™Ç¤™Ç™Ç–™Ç™Çˆ™Ç™Çz™Çs™Çl™Çe™Ç^™ÇW™ÇP™ÇI™ÇB™Ç;™Ç4™Ç-™Ç&™Ç™Ç™Ç™Ç ™Ç™Çü˜Çõ˜Çî˜Çç˜Çà˜ÇÙ˜ÇÒ˜Ç˘ÇĘǽ˜Ç¶˜Ç¯˜Ç¨˜Ç¡˜Çš˜Ç“˜ÇŒ˜Ç…˜Ç~˜Çw˜Çp˜Çi˜Çb˜Ç[˜ÇT˜ÇM˜ÇF˜Ç?˜Ç8˜Ç1˜Ç*˜Ç#˜Ç˜Ç˜Ç˜Ç˜Ç˜Çù—Çò—Çë—Çä—ÇÝ—ÇÖ—ÇÏ—ÇÈ—ÇÁ—Ǻ—dz—Ǭ—Ç¥—Çž—Ç——Ǘlj—Ç‚—Ç{—Çt—Çm—Çf—Ç_—ÇX—ÇQ—ÇJ—ÇC—Ç<—Ç5—Ç.—Ç'—Ç —Ç—Ç—Ç —Ç—Çý–Çö–Çï–Çè–Çá–ÇÚ–ÇÓ–ÇÌ–ÇŖǾ–Ç·–ǰ–Ç©–Ç¢–Ç›–Ç”–ǖdž–Ç–Çx–Çq–Çj–Çc–Ç\–ÇU–ÇN–ÇG–Ç@–Ç9–Ç2–Ç+–Ç$–Ç–Ç–Ç–Ç–Ç–Çú•Çó•Çì•Çå•ÇÞ•ÇוÇЕÇɕǕǻ•Ç´•Ç­•Ǧ•ÇŸ•ǘ•Ç‘•ÇŠ•ǃ•Ç|•Çu•Çn•Çg•Ç`•ÇY•ÇR•ÇK•ÇD•Ç=•Ç6•Ç/•Ç(•Ç!•Ç•Ç•Ç •Ç•Çþ”Ç÷”Çð”Çé”Çâ”ÇÛ”ÇÔ”ÇÍ”ÇÆ”Ç¿”Ǹ”DZ”Ǫ”Ç£”Çœ”Ç•”ÇŽ”LJ”Ç€”Çy”Çr”Çk”Çd”Ç]”ÇV”ÇO”ÇH”ÇA”Ç:”Ç3”Ç,”Ç%”Ç”Ç”Ç”Ç ”Ç”Çû“Çô“Çí“Çæ“Çß“ÇØ“ÇÑ“ÇÊ“ÇÓǼ“ǵ“Ç®“ǧ“Ç “Ç™“Ç’“Ç‹“Ç„“Ç}“Çv“Ço“Çh“Ça“ÇZ“ÇS“ÇL“ÇE“Ç>“Ç7“Ç0“Ç)“Ç"“Ç“Ç“Ç “Ç“Çÿ’Çø’Çñ’Çê’Çã’ÇÜ’ÇÕ’ÇÎ’ÇÇ’ÇÀ’ǹ’Dz’Ç«’Ǥ’Ç’Ç–’ǒLj’Ç’Çz’Çs’Çl’Çe’Ç^’ÇW’ÇP’ÇI’ÇB’Ç;’Ç4’Ç-’Ç&’Ç’Ç’Ç’Ç ’Ç’Çü‘Çõ‘Çî‘Çç‘Çà‘ÇÙ‘ÇÒ‘ÇË‘Çđǽ‘Ƕ‘ǯ‘Ǩ‘Ç¡‘Çš‘Ç“‘ÇŒ‘Ç…‘Ç~‘Çw‘Çp‘Çi‘Çb‘Ç[‘ÇT‘ÇM‘ÇF‘Ç?‘Ç8‘Ç1‘Ç*‘Ç#‘ǑǑǑǑǑÇùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúŽÇóŽÇìŽÇåŽÇÞŽÇ׎ÇÐŽÇÉŽÇÂŽÇ»ŽÇ´ŽÇ­ŽÇ¦ŽÇŸŽÇ˜ŽÇ‘ŽÇŠŽÇƒŽÇ|ŽÇuŽÇnŽÇgŽÇ`ŽÇYŽÇRŽÇKŽÇDŽÇ=ŽÇ6ŽÇ/ŽÇ(ŽÇ!ŽÇŽÇŽÇ ŽÇŽÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûŒÇôŒÇíŒÇæŒÇߌÇØŒÇÑŒÇÊŒÇÌǼŒÇµŒÇ®ŒÇ§ŒÇ ŒÇ™ŒÇ’ŒÇ‹ŒÇ„ŒÇ}ŒÇvŒÇoŒÇhŒÇaŒÇZŒÇSŒÇLŒÇEŒÇ>ŒÇ7ŒÇ0ŒÇ)ŒÇ"ŒÇŒÇŒÇ ŒÇŒÇÿ‹Çø‹Çñ‹Çê‹Çã‹ÇÜ‹ÇÕ‹Ç΋ÇÇ‹ÇÀ‹Ç¹‹Ç²‹Ç«‹Ç¤‹Ç‹Ç–‹Ç‹Çˆ‹Ç‹Çz‹Çs‹Çl‹Çe‹Ç^‹ÇW‹ÇP‹ÇI‹ÇB‹Ç;‹Ç4‹Ç-‹Ç&‹Ç‹Ç‹Ç‹Ç ‹Ç‹ÇüŠÇõŠÇîŠÇçŠÇàŠÇÙŠÇÒŠÇËŠÇĊǽŠÇ¶ŠÇ¯ŠÇ¨ŠÇ¡ŠÇšŠÇ“ŠÇŒŠÇ…ŠÇ~ŠÇwŠÇpŠÇiŠÇbŠÇ[ŠÇTŠÇMŠÇFŠÇ?ŠÇ8ŠÇ1ŠÇ*ŠÇ#ŠÇŠÇŠÇŠÇŠÇŠÇù‰Çò‰Çë‰Çä‰Ç݉ÇÖ‰ÇωÇȉÇÁ‰Çº‰Ç³‰Ç¬‰Ç¥‰Çž‰Ç—‰Ç‰Ç‰‰Ç‚‰Ç{‰Çt‰Çm‰Çf‰Ç_‰ÇX‰ÇQ‰ÇJ‰ÇC‰Ç<‰Ç5‰Ç.‰Ç'‰Ç ‰Ç‰Ç‰Ç ‰Ç‰ÇýˆÇöˆÇïˆÇèˆÇáˆÇÚˆÇÓˆÇ̈ÇňǾˆÇ·ˆÇ°ˆÇ©ˆÇ¢ˆÇ›ˆÇ”ˆÇˆÇ†ˆÇˆÇxˆÇqˆÇjˆÇcˆÇ\ˆÇUˆÇNˆÇGˆÇ@ˆÇ9ˆÇ2ˆÇ+ˆÇ$ˆÇˆÇˆÇˆÇˆÇˆÇú‡Çó‡Çì‡Çå‡ÇÞ‡ÇׇÇЇÇɇLJǻ‡Ç´‡Ç­‡Ç¦‡ÇŸ‡Ç˜‡Ç‘‡ÇЇÇƒ‡Ç|‡Çu‡Çn‡Çg‡Ç`‡ÇY‡ÇR‡ÇK‡ÇD‡Ç=‡Ç6‡Ç/‡Ç(‡Ç!‡Ç‡Ç‡Ç ‡Ç‡Çþ†Ç÷†Çð†Çé†Çâ†ÇÛ†ÇÔ†Ç͆ÇƆÇ¿†Ç¸†Ç±†Çª†Ç£†Çœ†Ç•†ÇކLJ†Ç€†Çy†Çr†Çk†Çd†Ç]†ÇV†ÇO†ÇH†ÇA†Ç:†Ç3†Ç,†Ç%†Ç†Ç†Ç†Ç †Ç†Çû…Çô…Çí…Çæ…Çß…ÇØ…ÇÑ…ÇÊ…ÇÅǼ…ǵ…Ç®…ǧ…Ç …Ç™…Ç’…Ç‹…Ç„…Ç}…Çv…Ço…Çh…Ça…ÇZ…ÇS…ÇL…ÇE…Ç>…Ç7…Ç0…Ç)…Ç"…Ç…Ç…Ç …Ç…Çÿ„Çø„Çñ„Çê„Çã„ÇÜ„ÇÕ„Ç΄ÇÇ„ÇÀ„ǹ„Dz„Ç«„Ǥ„DŽǖ„DŽLj„Ç„Çz„Çs„Çl„Çe„Ç^„ÇW„ÇP„ÇI„ÇB„Ç;„Ç4„Ç-„Ç&„Ç„Ç„Ç„Ç „Ç„ÇüƒÇõƒÇîƒÇçƒÇàƒÇÙƒÇÒƒÇ˃ÇăǽƒÇ¶ƒÇ¯ƒÇ¨ƒÇ¡ƒÇšƒÇ“ƒÇŒƒÇ…ƒÇ~ƒÇwƒÇpƒÇiƒÇbƒÇ[ƒÇTƒÇMƒÇFƒÇ?ƒÇ8ƒÇ1ƒÇ*ƒÇ#ƒÇƒÇƒÇƒÇƒÇƒÇù‚Çò‚Çë‚Çä‚ÇÝ‚ÇÖ‚ÇÏ‚ÇÈ‚ÇÁ‚Ǻ‚dz‚Ǭ‚Ç¥‚Çž‚Ç—‚ǂlj‚Ç‚‚Ç{‚Çt‚Çm‚Çf‚Ç_‚ÇX‚ÇQ‚ÇJ‚ÇC‚Ç<‚Ç5‚Ç.‚Ç'‚Ç ‚Ç‚Ç‚Ç ‚Ç‚ÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇú€Çó€Çì€Çå€ÇÞ€Ç×€ÇЀÇɀǀǻ€Ç´€Ç­€Ç¦€ÇŸ€Ç˜€Ç‘€ÇŠ€Çƒ€Ç|€Çu€Çn€Çg€Ç`€ÇY€ÇR€ÇK€ÇD€Ç=€Ç6€Ç/€Ç(€Ç!€Ç€Ç€Ç €Ç€ÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇû~Çô~Çí~Çæ~Çß~ÇØ~ÇÑ~ÇÊ~ÇÃ~Ǽ~ǵ~Ç®~ǧ~Ç ~Ç™~Ç’~Ç‹~Ç„~Ç}~Çv~Ço~Çh~Ça~ÇZ~ÇS~ÇL~ÇE~Ç>~Ç7~Ç0~Ç)~Ç"~Ç~Ç~Ç ~Ç~Çÿ}Çø}Çñ}Çê}Çã}ÇÜ}ÇÕ}ÇÎ}ÇÇ}ÇÀ}ǹ}Dz}Ç«}Ǥ}Ç}Ç–}Ç}Lj}Ç}Çz}Çs}Çl}Çe}Ç^}ÇW}ÇP}ÇI}ÇB}Ç;}Ç4}Ç-}Ç&}Ç}Ç}Ç}Ç }Ç}Çü|Çõ|Çî|Çç|Çà|ÇÙ|ÇÒ|ÇË|ÇÄ|ǽ|Ƕ|ǯ|Ǩ|Ç¡|Çš|Ç“|ÇŒ|Ç…|Ç~|Çw|Çp|Çi|Çb|Ç[|ÇT|ÇM|ÇF|Ç?|Ç8|Ç1|Ç*|Ç#|Ç|Ç|Ç|Ç|Ç|Çù{Çò{Çë{Çä{ÇÝ{ÇÖ{ÇÏ{ÇÈ{ÇÁ{Ǻ{dz{Ǭ{Ç¥{Çž{Ç—{Ç{lj{Ç‚{Ç{{Çt{Çm{Çf{Ç_{ÇX{ÇQ{ÇJ{ÇC{Ç<{Ç5{Ç.{Ç'{Ç {Ç{Ç{Ç {Ç{ÇýzÇözÇïzÇèzÇázÇÚzÇÓzÇÌzÇÅzǾzÇ·zǰzÇ©zÇ¢zÇ›zÇ”zÇzdžzÇzÇxzÇqzÇjzÇczÇ\zÇUzÇNzÇGzÇ@zÇ9zÇ2zÇ+zÇ$zÇzÇzÇzÇzÇzÇúyÇóyÇìyÇåyÇÞyÇ×yÇÐyÇÉyÇÂyÇ»yÇ´yÇ­yǦyÇŸyǘyÇ‘yÇŠyǃyÇ|yÇuyÇnyÇgyÇ`yÇYyÇRyÇKyÇDyÇ=yÇ6yÇ/yÇ(yÇ!yÇyÇyÇ yÇyÇþxÇ÷xÇðxÇéxÇâxÇÛxÇÔxÇÍxÇÆxÇ¿xǸxDZxǪxÇ£xÇœxÇ•xÇŽxLJxÇ€xÇyxÇrxÇkxÇdxÇ]xÇVxÇOxÇHxÇAxÇ:xÇ3xÇ,xÇ%xÇxÇxÇxÇ xÇxÇûwÇôwÇíwÇæwÇßwÇØwÇÑwÇÊwÇÃwǼwǵwÇ®wǧwÇ wÇ™wÇ’wÇ‹wÇ„wÇ}wÇvwÇowÇhwÇawÇZwÇSwÇLwÇEwÇ>wÇ7wÇ0wÇ)wÇ"wÇwÇwÇ wÇwÇÿvÇøvÇñvÇêvÇãvÇÜvÇÕvÇÎvÇÇvÇÀvǹvDzvÇ«vǤvÇvÇ–vÇvLjvÇvÇzvÇsvÇlvÇevÇ^vÇWvÇPvÇIvÇBvÇ;vÇ4vÇ-vÇ&vÇvÇvÇvÇ vÇvÇüuÇõuÇîuÇçuÇàuÇÙuÇÒuÇËuÇÄuǽuǶuǯuǨuÇ¡uÇšuÇ“uÇŒuÇ…uÇ~uÇwuÇpuÇiuÇbuÇ[uÇTuÇMuÇFuÇ?uÇ8uÇ1uÇ*uÇ#uÇuÇuÇuÇuÇuÇùtÇòtÇëtÇätÇÝtÇÖtÇÏtÇÈtÇÁtǺtdztǬtÇ¥tÇžtÇ—tÇtljtÇ‚tÇ{tÇttÇmtÇftÇ_tÇXtÇQtÇJtÇCtÇpÇ7pÇ0pÇ)pÇ"pÇpÇpÇ pÇpÇÿoÇøoÇñoÇêoÇãoÇÜoÇÕoÇÎoÇÇoÇÀoǹoDzoÇ«oǤoÇoÇ–oÇoLjoÇoÇzoÇsoÇloÇeoÇ^oÇWoÇPoÇIoÇBoÇ;oÇ4oÇ-oÇ&oÇoÇoÇoÇ oÇoÇünÇõnÇînÇçnÇànÇÙnÇÒnÇËnÇÄnǽnǶnǯnǨnÇ¡nÇšnÇ“nÇŒnÇ…nÇ~nÇwnÇpnÇinÇbnÇ[nÇTnÇMnÇFnÇ?nÇ8nÇ1nÇ*nÇ#nÇnÇnÇnÇnÇnÇùmÇòmÇëmÇämÇÝmÇÖmÇÏmÇÈmÇÁmǺmdzmǬmÇ¥mÇžmÇ—mÇmljmÇ‚mÇ{mÇtmÇmmÇfmÇ_mÇXmÇQmÇJmÇCmÇiÇ7iÇ0iÇ)iÇ"iÇiÇiÇ iÇiÇÿhÇøhÇñhÇêhÇãhÇÜhÇÕhÇÎhÇÇhÇÀhǹhDzhÇ«hǤhÇhÇ–hÇhLjhÇhÇzhÇshÇlhÇehÇ^hÇWhÇPhÇIhÇBhÇ;hÇ4hÇ-hÇ&hÇhÇhÇhÇ hÇhÇügÇõgÇîgÇçgÇàgÇÙgÇÒgÇËgÇÄgǽgǶgǯgǨgÇ¡gÇšgÇ“gÇŒgÇ…gÇ~gÇwgÇpgÇigÇbgÇ[gÇTgÇMgÇFgÇ?gÇ8gÇ1gÇ*gÇ#gÇgÇgÇgÇgÇgÇùfÇòfÇëfÇäfÇÝfÇÖfÇÏfÇÈfÇÁfǺfdzfǬfÇ¥fÇžfÇ—fÇfljfÇ‚fÇ{fÇtfÇmfÇffÇ_fÇXfÇQfÇJfÇCfÇbÇ7bÇ0bÇ)bÇ"bÇbÇbÇ bÇbÇÿaÇøaÇñaÇêaÇãaÇÜaÇÕaÇÎaÇÇaÇÀaǹaDzaÇ«aǤaÇaÇ–aÇaLjaÇaÇzaÇsaÇlaÇeaÇ^aÇWaÇPaÇIaÇBaÇ;aÇ4aÇ-aÇ&aÇaÇaÇaÇ aÇaÇü`Çõ`Çî`Çç`Çà`ÇÙ`ÇÒ`ÇË`ÇÄ`ǽ`Ƕ`ǯ`Ǩ`Ç¡`Çš`Ç“`ÇŒ`Ç…`Ç~`Çw`Çp`Çi`Çb`Ç[`ÇT`ÇM`ÇF`Ç?`Ç8`Ç1`Ç*`Ç#`Ç`Ç`Ç`Ç`Ç`Çù_Çò_Çë_Çä_ÇÝ_ÇÖ_ÇÏ_ÇÈ_ÇÁ_Ǻ_dz_Ǭ_Ç¥_Çž_Ç—_Ç_lj_Ç‚_Ç{_Çt_Çm_Çf_Ç__ÇX_ÇQ_ÇJ_ÇC_Ç<_Ç5_Ç._Ç'_Ç _Ç_Ç_Ç _Ç_Çý^Çö^Çï^Çè^Çá^ÇÚ^ÇÓ^ÇÌ^ÇÅ^Ǿ^Ç·^ǰ^Ç©^Ç¢^Ç›^Ç”^Ç^dž^Ç^Çx^Çq^Çj^Çc^Ç\^ÇU^ÇN^ÇG^Ç@^Ç9^Ç2^Ç+^Ç$^Ç^Ç^Ç^Ç^Ç^Çú]Çó]Çì]Çå]ÇÞ]Ç×]ÇÐ]ÇÉ]ÇÂ]Ç»]Ç´]Ç­]Ǧ]ÇŸ]ǘ]Ç‘]ÇŠ]ǃ]Ç|]Çu]Çn]Çg]Ç`]ÇY]ÇR]ÇK]ÇD]Ç=]Ç6]Ç/]Ç(]Ç!]Ç]Ç]Ç ]Ç]Çþ\Ç÷\Çð\Çé\Çâ\ÇÛ\ÇÔ\ÇÍ\ÇÆ\Ç¿\Ǹ\DZ\Ǫ\Ç£\Çœ\Ç•\ÇŽ\LJ\Ç€\Çy\Çr\Çk\Çd\Ç]\ÇV\ÇO\ÇH\ÇA\Ç:\Ç3\Ç,\Ç%\Ç\Ç\Ç\Ç \Ç\Çû[Çô[Çí[Çæ[Çß[ÇØ[ÇÑ[ÇÊ[ÇÃ[Ǽ[ǵ[Ç®[ǧ[Ç [Ç™[Ç’[Ç‹[Ç„[Ç}[Çv[Ço[Çh[Ça[ÇZ[ÇS[ÇL[ÇE[Ç>[Ç7[Ç0[Ç)[Ç"[Ç[Ç[Ç [Ç[ÇÿZÇøZÇñZÇêZÇãZÇÜZÇÕZÇÎZÇÇZÇÀZǹZDzZÇ«ZǤZÇZÇ–ZÇZLjZÇZÇzZÇsZÇlZÇeZÇ^ZÇWZÇPZÇIZÇBZÇ;ZÇ4ZÇ-ZÇ&ZÇZÇZÇZÇ ZÇZÇüYÇõYÇîYÇçYÇàYÇÙYÇÒYÇËYÇÄYǽYǶYǯYǨYÇ¡YÇšYÇ“YÇŒYÇ…YÇ~YÇwYÇpYÇiYÇbYÇ[YÇTYÇMYÇFYÇ?YÇ8YÇ1YÇ*YÇ#YÇYÇYÇYÇYÇYÇùXÇòXÇëXÇäXÇÝXÇÖXÇÏXÇÈXÇÁXǺXdzXǬXÇ¥XÇžXÇ—XÇXljXÇ‚XÇ{XÇtXÇmXÇfXÇ_XÇXXÇQXÇJXÇCXÇTÇ7TÇ0TÇ)TÇ"TÇTÇTÇ TÇTÇÿSÇøSÇñSÇêSÇãSÇÜSÇÕSÇÎSÇÇSÇÀSǹSDzSÇ«SǤSÇSÇ–SÇSLjSÇSÇzSÇsSÇlSÇeSÇ^SÇWSÇPSÇISÇBSÇ;SÇ4SÇ-SÇ&SÇSÇSÇSÇ SÇSÇüRÇõRÇîRÇçRÇàRÇÙRÇÒRÇËRÇÄRǽRǶRǯRǨRÇ¡RÇšRÇ“RÇŒRÇ…RÇ~RÇwRÇpRÇiRÇbRÇ[RÇTRÇMRÇFRÇ?RÇ8RÇ1RÇ*RÇ#RÇRÇRÇRÇRÇRÇùQÇòQÇëQÇäQÇÝQÇÖQÇÏQÇÈQÇÁQǺQdzQǬQÇ¥QÇžQÇ—QÇQljQÇ‚QÇ{QÇtQÇmQÇfQÇ_QÇXQÇQQÇJQÇCQÇMÇ7MÇ0MÇ)MÇ"MÇMÇMÇ MÇMÇÿLÇøLÇñLÇêLÇãLÇÜLÇÕLÇÎLÇÇLÇÀLǹLDzLÇ«LǤLÇLÇ–LÇLLjLÇLÇzLÇsLÇlLÇeLÇ^LÇWLÇPLÇILÇBLÇ;LÇ4LÇ-LÇ&LÇLÇLÇLÇ LÇLÇüKÇõKÇîKÇçKÇàKÇÙKÇÒKÇËKÇÄKǽKǶKǯKǨKÇ¡KÇšKÇ“KÇŒKÇ…KÇ~KÇwKÇpKÇiKÇbKÇ[KÇTKÇMKÇFKÇ?KÇ8KÇ1KÇ*KÇ#KÇKÇKÇKÇKÇKÇùJÇòJÇëJÇäJÇÝJÇÖJÇÏJÇÈJÇÁJǺJdzJǬJÇ¥JÇžJÇ—JÇJljJÇ‚JÇ{JÇtJÇmJÇfJÇ_JÇXJÇQJÇJJÇCJÇFÇ7FÇ0FÇ)FÇ"FÇFÇFÇ FÇFÇÿEÇøEÇñEÇêEÇãEÇÜEÇÕEÇÎEÇÇEÇÀEǹEDzEÇ«EǤEÇEÇ–EÇELjEÇEÇzEÇsEÇlEÇeEÇ^EÇWEÇPEÇIEÇBEÇ;EÇ4EÇ-EÇ&EÇEÇEÇEÇ EÇEÇüDÇõDÇîDÇçDÇàDÇÙDÇÒDÇËDÇÄDǽDǶDǯDǨDÇ¡DÇšDÇ“DÇŒDÇ…DÇ~DÇwDÇpDÇiDÇbDÇ[DÇTDÇMDÇFDÇ?DÇ8DÇ1DÇ*DÇ#DÇDÇDÇDÇDÇDÇùCÇòCÇëCÇäCÇÝCÇÖCÇÏCÇÈCÇÁCǺCdzCǬCÇ¥CÇžCÇ—CÇCljCÇ‚CÇ{CÇtCÇmCÇfCÇ_CÇXCÇQCÇJCÇCCÇ?Ç7?Ç0?Ç)?Ç"?Ç?Ç?Ç ?Ç?Çÿ>Çø>Çñ>Çê>Çã>ÇÜ>ÇÕ>ÇÎ>ÇÇ>ÇÀ>ǹ>Dz>Ç«>Ǥ>Ç>Ç–>Ç>Lj>Ç>Çz>Çs>Çl>Çe>Ç^>ÇW>ÇP>ÇI>ÇB>Ç;>Ç4>Ç->Ç&>Ç>Ç>Ç>Ç >Ç>Çü=Çõ=Çî=Çç=Çà=ÇÙ=ÇÒ=ÇË=ÇÄ=ǽ=Ƕ=ǯ=Ǩ=Ç¡=Çš=Ç“=ÇŒ=Ç…=Ç~=Çw=Çp=Çi=Çb=Ç[=ÇT=ÇM=ÇF=Ç?=Ç8=Ç1=Ç*=Ç#=Ç=Ç=Ç=Ç=Ç=Çù<Çò<Çë<Çä<ÇÝ<ÇÖ<ÇÏ<ÇÈ<ÇÁ<Ǻ<dz<Ǭ<Ç¥<Çž<Ç—<Ç<lj<Ç‚<Ç{<Çt<Çm<Çf<Ç_<ÇX<ÇQ<ÇJ<ÇC<Ç<<Ç5<Ç.<Ç'<Ç <Ç<Ç<Ç <Ç<Çý;Çö;Çï;Çè;Çá;ÇÚ;ÇÓ;ÇÌ;ÇÅ;Ǿ;Ç·;ǰ;Ç©;Ç¢;Ç›;Ç”;Ç;dž;Ç;Çx;Çq;Çj;Çc;Ç\;ÇU;ÇN;ÇG;Ç@;Ç9;Ç2;Ç+;Ç$;Ç;Ç;Ç;Ç;Ç;Çú:Çó:Çì:Çå:ÇÞ:Ç×:ÇÐ:ÇÉ:ÇÂ:Ç»:Ç´:Ç­:Ǧ:ÇŸ:ǘ:Ç‘:ÇŠ:ǃ:Ç|:Çu:Çn:Çg:Ç`:ÇY:ÇR:ÇK:ÇD:Ç=:Ç6:Ç/:Ç(:Ç!:Ç:Ç:Ç :Ç:Çþ9Ç÷9Çð9Çé9Çâ9ÇÛ9ÇÔ9ÇÍ9ÇÆ9Ç¿9Ǹ9DZ9Ǫ9Ç£9Çœ9Ç•9ÇŽ9LJ9Ç€9Çy9Çr9Çk9Çd9Ç]9ÇV9ÇO9ÇH9ÇA9Ç:9Ç39Ç,9Ç%9Ç9Ç9Ç9Ç 9Ç9Çû8Çô8Çí8Çæ8Çß8ÇØ8ÇÑ8ÇÊ8ÇÃ8Ǽ8ǵ8Ç®8ǧ8Ç 8Ç™8Ç’8Ç‹8Ç„8Ç}8Çv8Ço8Çh8Ça8ÇZ8ÇS8ÇL8ÇE8Ç>8Ç78Ç08Ç)8Ç"8Ç8Ç8Ç 8Ç8Çÿ7Çø7Çñ7Çê7Çã7ÇÜ7ÇÕ7ÇÎ7ÇÇ7ÇÀ7ǹ7Dz7Ç«7Ǥ7Ç7Ç–7Ç7Lj7Ç7Çz7Çs7Çl7Çe7Ç^7ÇW7ÇP7ÇI7ÇB7Ç;7Ç47Ç-7Ç&7Ç7Ç7Ç7Ç 7Ç7Çü6Çõ6Çî6Çç6Çà6ÇÙ6ÇÒ6ÇË6ÇÄ6ǽ6Ƕ6ǯ6Ǩ6Ç¡6Çš6Ç“6ÇŒ6Ç…6Ç~6Çw6Çp6Çi6Çb6Ç[6ÇT6ÇM6ÇF6Ç?6Ç86Ç16Ç*6Ç#6Ç6Ç6Ç6Ç6Ç6Çù5Çò5Çë5Çä5ÇÝ5ÇÖ5ÇÏ5ÇÈ5ÇÁ5Ǻ5dz5Ǭ5Ç¥5Çž5Ç—5Ç5lj5Ç‚5Ç{5Çt5Çm5Çf5Ç_5ÇX5ÇQ5ÇJ5ÇC5Ç<5Ç55Ç.5Ç'5Ç 5Ç5Ç5Ç 5Ç5Çý4Çö4Çï4Çè4Çá4ÇÚ4ÇÓ4ÇÌ4ÇÅ4Ǿ4Ç·4ǰ4Ç©4Ç¢4Ç›4Ç”4Ç4dž4Ç4Çx4Çq4Çj4Çc4Ç\4ÇU4ÇN4ÇG4Ç@4Ç94Ç24Ç+4Ç$4Ç4Ç4Ç4Ç4Ç4Çú3Çó3Çì3Çå3ÇÞ3Ç×3ÇÐ3ÇÉ3ÇÂ3Ç»3Ç´3Ç­3Ǧ3ÇŸ3ǘ3Ç‘3ÇŠ3ǃ3Ç|3Çu3Çn3Çg3Ç`3ÇY3ÇR3ÇK3ÇD3Ç=3Ç63Ç/3Ç(3Ç!3Ç3Ç3Ç 3Ç3Çþ2Ç÷2Çð2Çé2Çâ2ÇÛ2ÇÔ2ÇÍ2ÇÆ2Ç¿2Ǹ2DZ2Ǫ2Ç£2Çœ2Ç•2ÇŽ2LJ2Ç€2Çy2Çr2Çk2Çd2Ç]2ÇV2ÇO2ÇH2ÇA2Ç:2Ç32Ç,2Ç%2Ç2Ç2Ç2Ç 2Ç2Çû1Çô1Çí1Çæ1Çß1ÇØ1ÇÑ1ÇÊ1ÇÃ1Ǽ1ǵ1Ç®1ǧ1Ç 1Ç™1Ç’1Ç‹1Ç„1Ç}1Çv1Ço1Çh1Ça1ÇZ1ÇS1ÇL1ÇE1Ç>1Ç71Ç01Ç)1Ç"1Ç1Ç1Ç 1Ç1Çÿ0Çø0Çñ0Çê0Çã0ÇÜ0ÇÕ0ÇÎ0ÇÇ0ÇÀ0ǹ0Dz0Ç«0Ǥ0Ç0Ç–0Ç0Lj0Ç0Çz0Çs0Çl0Çe0Ç^0ÇW0ÇP0ÇI0ÇB0Ç;0Ç40Ç-0Ç&0Ç0Ç0Ç0Ç 0Ç0Çü/Çõ/Çî/Çç/Çà/ÇÙ/ÇÒ/ÇË/ÇÄ/ǽ/Ƕ/ǯ/Ǩ/Ç¡/Çš/Ç“/ÇŒ/Ç…/Ç~/Çw/Çp/Çi/Çb/Ç[/ÇT/ÇM/ÇF/Ç?/Ç8/Ç1/Ç*/Ç#/Ç/Ç/Ç/Ç/Ç/Çù.Çò.Çë.Çä.ÇÝ.ÇÖ.ÇÏ.ÇÈ.ÇÁ.Ǻ.dz.Ǭ.Ç¥.Çž.Ç—.Ç.lj.Ç‚.Ç{.Çt.Çm.Çf.Ç_.ÇX.ÇQ.ÇJ.ÇC.Ç<.Ç5.Ç..Ç'.Ç .Ç.Ç.Ç .Ç.Çý-Çö-Çï-Çè-Çá-ÇÚ-ÇÓ-ÇÌ-ÇÅ-Ǿ-Ç·-ǰ-Ç©-Ç¢-Ç›-Ç”-Ç-dž-Ç-Çx-Çq-Çj-Çc-Ç\-ÇU-ÇN-ÇG-Ç@-Ç9-Ç2-Ç+-Ç$-Ç-Ç-Ç-Ç-Ç-Çú,Çó,Çì,Çå,ÇÞ,Ç×,ÇÐ,ÇÉ,ÇÂ,Ç»,Ç´,Ç­,Ǧ,ÇŸ,ǘ,Ç‘,ÇŠ,ǃ,Ç|,Çu,Çn,Çg,Ç`,ÇY,ÇR,ÇK,ÇD,Ç=,Ç6,Ç/,Ç(,Ç!,Ç,Ç,Ç ,Ç,Çþ+Ç÷+Çð+Çé+Çâ+ÇÛ+ÇÔ+ÇÍ+ÇÆ+Ç¿+Ǹ+DZ+Ǫ+Ç£+Çœ+Ç•+ÇŽ+LJ+Ç€+Çy+Çr+Çk+Çd+Ç]+ÇV+ÇO+ÇH+ÇA+Ç:+Ç3+Ç,+Ç%+Ç+Ç+Ç+Ç +Ç+Çû*Çô*Çí*Çæ*Çß*ÇØ*ÇÑ*ÇÊ*ÇÃ*Ǽ*ǵ*Ç®*ǧ*Ç *Ç™*Ç’*Ç‹*Ç„*Ç}*Çv*Ço*Çh*Ça*ÇZ*ÇS*ÇL*ÇE*Ç>*Ç7*Ç0*Ç)*Ç"*Ç*Ç*Ç *Ç*Çÿ)Çø)Çñ)Çê)Çã)ÇÜ)ÇÕ)ÇÎ)ÇÇ)ÇÀ)ǹ)Dz)Ç«)Ǥ)Ç)Ç–)Ç)Lj)Ç)Çz)Çs)Çl)Çe)Ç^)ÇW)ÇP)ÇI)ÇB)Ç;)Ç4)Ç-)Ç&)Ç)Ç)Ç)Ç )Ç)Çü(Çõ(Çî(Çç(Çà(ÇÙ(ÇÒ(ÇË(ÇÄ(ǽ(Ƕ(ǯ(Ǩ(Ç¡(Çš(Ç“(ÇŒ(Ç…(Ç~(Çw(Çp(Çi(Çb(Ç[(ÇT(ÇM(ÇF(Ç?(Ç8(Ç1(Ç*(Ç#(Ç(Ç(Ç(Ç(Ç(Çù'Çò'Çë'Çä'ÇÝ'ÇÖ'ÇÏ'ÇÈ'ÇÁ'Ǻ'dz'Ǭ'Ç¥'Çž'Ç—'Ç'lj'Ç‚'Ç{'Çt'Çm'Çf'Ç_'ÇX'ÇQ'ÇJ'ÇC'Ç<'Ç5'Ç.'Ç''Ç 'Ç'Ç'Ç 'Ç'Çý&Çö&Çï&Çè&Çá&ÇÚ&ÇÓ&ÇÌ&ÇÅ&Ǿ&Ç·&ǰ&Ç©&Ç¢&Ç›&Ç”&Ç&dž&Ç&Çx&Çq&Çj&Çc&Ç\&ÇU&ÇN&ÇG&Ç@&Ç9&Ç2&Ç+&Ç$&Ç&Ç&Ç&Ç&Ç&Çú%Çó%Çì%Çå%ÇÞ%Ç×%ÇÐ%ÇÉ%ÇÂ%Ç»%Ç´%Ç­%Ǧ%ÇŸ%ǘ%Ç‘%ÇŠ%ǃ%Ç|%Çu%Çn%Çg%Ç`%ÇY%ÇR%ÇK%ÇD%Ç=%Ç6%Ç/%Ç(%Ç!%Ç%Ç%Ç %Ç%Çþ$Ç÷$Çð$Çé$Çâ$ÇÛ$ÇÔ$ÇÍ$ÇÆ$Ç¿$Ǹ$DZ$Ǫ$Ç£$Çœ$Ç•$ÇŽ$LJ$Ç€$Çy$Çr$Çk$Çd$Ç]$ÇV$ÇO$ÇH$ÇA$Ç:$Ç3$Ç,$Ç%$Ç$Ç$Ç$Ç $Ç$Çû#Çô#Çí#Çæ#Çß#ÇØ#ÇÑ#ÇÊ#ÇÃ#Ǽ#ǵ#Ç®#ǧ#Ç #Ç™#Ç’#Ç‹#Ç„#Ç}#Çv#Ço#Çh#Ça#ÇZ#ÇS#ÇL#ÇE#Ç>#Ç7#Ç0#Ç)#Ç"#Ç#Ç#Ç #Ç#Çÿ"Çø"Çñ"Çê"Çã"ÇÜ"ÇÕ"ÇÎ"ÇÇ"ÇÀ"ǹ"Dz"Ç«"Ǥ"Ç"Ç–"Ç"Lj"Ç"Çz"Çs"Çl"Çe"Ç^"ÇW"ÇP"ÇI"ÇB"Ç;"Ç4"Ç-"Ç&"Ç"Ç"Ç"Ç "Ç"Çü!Çõ!Çî!Çç!Çà!ÇÙ!ÇÒ!ÇË!ÇÄ!ǽ!Ƕ!ǯ!Ǩ!Ç¡!Çš!Ç“!ÇŒ!Ç…!Ç~!Çw!Çp!Çi!Çb!Ç[!ÇT!ÇM!ÇF!Ç?!Ç8!Ç1!Ç*!Ç#!Ç!Ç!Ç!Ç!Ç!Çù Çò Çë Çä ÇÝ ÇÖ ÇÏ ÇÈ ÇÁ Ǻ dz Ǭ Ç¥ Çž Ç— Ç Ç‰ Ç‚ Ç{ Çt Çm Çf Ç_ ÇX ÇQ ÇJ ÇC Ç< Ç5 Ç. Ç' Ç Ç Ç Ç Ç ÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿ Çø Çñ Çê Çã ÇÜ ÇÕ ÇÎ ÇÇ ÇÀ ǹ Dz Ç« Ǥ Ç Ç– Ç Çˆ Ç Çz Çs Çl Çe Ç^ ÇW ÇP ÇI ÇB Ç; Ç4 Ç- Ç& Ç Ç Ç Ç Ç Çü Çõ Çî Çç Çà ÇÙ ÇÒ ÇË ÇÄ Ç½ Ƕ ǯ Ǩ Ç¡ Çš Ç“ ÇŒ Ç… Ç~ Çw Çp Çi Çb Ç[ ÇT ÇM ÇF Ç? Ç8 Ç1 Ç* Ç# Ç Ç Ç Ç Ç Çù Çò Çë Çä ÇÝ ÇÖ ÇÏ ÇÈ ÇÁ Ǻ dz Ǭ Ç¥ Çž Ç— Ç Ç‰ Ç‚ Ç{ Çt Çm Çf Ç_ ÇX ÇQ ÇJ ÇC Ç< Ç5 Ç. Ç' Ç Ç Ç Ç Ç Çý Çö Çï Çè Çá ÇÚ ÇÓ ÇÌ ÇŠǾ Ç· ǰ Ç© Ç¢ Ç› Ç” Ç Ç† Ç Çx Çq Çj Çc Ç\ ÇU ÇN ÇG Ç@ Ç9 Ç2 Ç+ Ç$ Ç Ç Ç Ç Ç Çú Çó Çì Çå ÇÞ Ç× ÇÐ ÇÉ Ç Ç» Ç´ Ç­ Ǧ ÇŸ ǘ Ç‘ ÇŠ ǃ Ç| Çu Çn Çg Ç` ÇY ÇR ÇK ÇD Ç= Ç6 Ç/ Ç( Ç! Ç Ç Ç Ç ÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÿÆøÿÆñÿÆêÿÆãÿÆÜÿÆÕÿÆÎÿÆÇÿÆÀÿƹÿƲÿÆ«ÿƤÿÆÿÆ–ÿÆÿƈÿÆÿÆzÿÆsÿÆlÿÆeÿÆ^ÿÆWÿÆPÿÆIÿÆBÿÆ;ÿÆ4ÿÆ-ÿÆ&ÿÆÿÆÿÆÿÆ ÿÆÿÆüþÆõþÆîþÆçþÆàþÆÙþÆÒþÆËþÆÄþƽþƶþƯþƨþÆ¡þÆšþÆ“þÆŒþÆ…þÆ~þÆwþÆpþÆiþÆbþÆ[þÆTþÆMþÆFþÆ?þÆ8þÆ1þÆ*þÆ#þÆþÆþÆþÆþÆþÆùýÆòýÆëýÆäýÆÝýÆÖýÆÏýÆÈýÆÁýƺýƳýƬýÆ¥ýÆžýÆ—ýÆýƉýÆ‚ýÆ{ýÆtýÆmýÆfýÆ_ýÆXýÆQýÆJýÆCýÆ<ýÆ5ýÆ.ýÆ'ýÆ ýÆýÆýÆ ýÆýÆýüÆöüÆïüÆèüÆáüÆÚüÆÓüÆÌüÆÅüƾüÆ·üưüÆ©üÆ¢üÆ›üÆ”üÆüƆüÆüÆxüÆqüÆjüÆcüÆ\üÆUüÆNüÆGüÆ@üÆ9üÆ2üÆ+üÆ$üÆüÆüÆüÆüÆüÆúûÆóûÆìûÆåûÆÞûÆ×ûÆÐûÆÉûÆÂûÆ»ûÆ´ûÆ­ûƦûÆŸûƘûÆ‘ûÆŠûƃûÆ|ûÆuûÆnûÆgûÆ`ûÆYûÆRûÆKûÆDûÆ=ûÆ6ûÆ/ûÆ(ûÆ!ûÆûÆûÆ ûÆûÆþúÆ÷úÆðúÆéúÆâúÆÛúÆÔúÆÍúÆÆúÆ¿úƸúƱúƪúÆ£úÆœúÆ•úÆŽúƇúÆ€úÆyúÆrúÆkúÆdúÆ]úÆVúÆOúÆHúÆAúÆ:úÆ3úÆ,úÆ%úÆúÆúÆúÆ úÆúÆûùÆôùÆíùÆæùÆßùÆØùÆÑùÆÊùÆÃùƼùƵùÆ®ùƧùÆ ùÆ™ùÆ’ùÆ‹ùÆ„ùÆ}ùÆvùÆoùÆhùÆaùÆZùÆSùÆLùÆEùÆ>ùÆ7ùÆ0ùÆ)ùÆ"ùÆùÆùÆ ùÆùÆÿøÆøøÆñøÆêøÆãøÆÜøÆÕøÆÎøÆÇøÆÀøÆ¹øÆ²øÆ«øÆ¤øÆøÆ–øÆøÆˆøÆøÆzøÆsøÆløÆeøÆ^øÆWøÆPøÆIøÆBøÆ;øÆ4øÆ-øÆ&øÆøÆøÆøÆ øÆøÆü÷Æõ÷Æî÷Æç÷Æà÷ÆÙ÷ÆÒ÷ÆË÷ÆÄ÷ƽ÷ƶ÷Ư÷ƨ÷Æ¡÷Æš÷Æ“÷ÆŒ÷Æ…÷Æ~÷Æw÷Æp÷Æi÷Æb÷Æ[÷ÆT÷ÆM÷ÆF÷Æ?÷Æ8÷Æ1÷Æ*÷Æ#÷Æ÷Æ÷Æ÷Æ÷Æ÷ÆùöÆòöÆëöÆäöÆÝöÆÖöÆÏöÆÈöÆÁöƺöƳöƬöÆ¥öÆžöÆ—öÆöƉöÆ‚öÆ{öÆtöÆmöÆföÆ_öÆXöÆQöÆJöÆCöÆ<öÆ5öÆ.öÆ'öÆ öÆöÆöÆ öÆöÆýõÆöõÆïõÆèõÆáõÆÚõÆÓõÆÌõÆÅõƾõÆ·õưõÆ©õÆ¢õÆ›õÆ”õÆõƆõÆõÆxõÆqõÆjõÆcõÆ\õÆUõÆNõÆGõÆ@õÆ9õÆ2õÆ+õÆ$õÆõÆõÆõÆõÆõÆúôÆóôÆìôÆåôÆÞôÆ×ôÆÐôÆÉôÆÂôÆ»ôÆ´ôÆ­ôƦôÆŸôƘôÆ‘ôÆŠôƃôÆ|ôÆuôÆnôÆgôÆ`ôÆYôÆRôÆKôÆDôÆ=ôÆ6ôÆ/ôÆ(ôÆ!ôÆôÆôÆ ôÆôÆþóÆ÷óÆðóÆéóÆâóÆÛóÆÔóÆÍóÆÆóÆ¿óƸóƱóƪóÆ£óÆœóÆ•óÆŽóƇóÆ€óÆyóÆróÆkóÆdóÆ]óÆVóÆOóÆHóÆAóÆ:óÆ3óÆ,óÆ%óÆóÆóÆóÆ óÆóÆûòÆôòÆíòÆæòÆßòÆØòÆÑòÆÊòÆÃòƼòƵòÆ®òƧòÆ òÆ™òÆ’òÆ‹òÆ„òÆ}òÆvòÆoòÆhòÆaòÆZòÆSòÆLòÆEòÆ>òÆ7òÆ0òÆ)òÆ"òÆòÆòÆ òÆòÆÿñÆøñÆññÆêñÆãñÆÜñÆÕñÆÎñÆÇñÆÀñƹñƲñÆ«ñƤñÆñÆ–ñÆñƈñÆñÆzñÆsñÆlñÆeñÆ^ñÆWñÆPñÆIñÆBñÆ;ñÆ4ñÆ-ñÆ&ñÆñÆñÆñÆ ñÆñÆüðÆõðÆîðÆçðÆàðÆÙðÆÒðÆËðÆÄðƽðƶðƯðƨðÆ¡ðÆšðÆ“ðÆŒðÆ…ðÆ~ðÆwðÆpðÆiðÆbðÆ[ðÆTðÆMðÆFðÆ?ðÆ8ðÆ1ðÆ*ðÆ#ðÆðÆðÆðÆðÆðÆùïÆòïÆëïÆäïÆÝïÆÖïÆÏïÆÈïÆÁïÆºïÆ³ïÆ¬ïÆ¥ïÆžïÆ—ïÆïÆ‰ïÆ‚ïÆ{ïÆtïÆmïÆfïÆ_ïÆXïÆQïÆJïÆCïÆ<ïÆ5ïÆ.ïÆ'ïÆ ïÆïÆïÆ ïÆïÆýîÆöîÆïîÆèîÆáîÆÚîÆÓîÆÌîÆÅîÆ¾îÆ·îÆ°îÆ©îÆ¢îÆ›îÆ”îÆîƆîÆîÆxîÆqîÆjîÆcîÆ\îÆUîÆNîÆGîÆ@îÆ9îÆ2îÆ+îÆ$îÆîÆîÆîÆîÆîÆúíÆóíÆìíÆåíÆÞíÆ×íÆÐíÆÉíÆÂíÆ»íÆ´íÆ­íÆ¦íÆŸíÆ˜íÆ‘íÆŠíÆƒíÆ|íÆuíÆníÆgíÆ`íÆYíÆRíÆKíÆDíÆ=íÆ6íÆ/íÆ(íÆ!íÆíÆíÆ íÆíÆþìÆ÷ìÆðìÆéìÆâìÆÛìÆÔìÆÍìÆÆìÆ¿ìÆ¸ìÆ±ìÆªìÆ£ìÆœìÆ•ìÆŽìÆ‡ìÆ€ìÆyìÆrìÆkìÆdìÆ]ìÆVìÆOìÆHìÆAìÆ:ìÆ3ìÆ,ìÆ%ìÆìÆìÆìÆ ìÆìÆûëÆôëÆíëÆæëÆßëÆØëÆÑëÆÊëÆÃëÆ¼ëÆµëÆ®ëÆ§ëÆ ëÆ™ëÆ’ëÆ‹ëÆ„ëÆ}ëÆvëÆoëÆhëÆaëÆZëÆSëÆLëÆEëÆ>ëÆ7ëÆ0ëÆ)ëÆ"ëÆëÆëÆ ëÆëÆÿêÆøêÆñêÆêêÆãêÆÜêÆÕêÆÎêÆÇêÆÀêÆ¹êÆ²êÆ«êÆ¤êÆêÆ–êÆêƈêÆêÆzêÆsêÆlêÆeêÆ^êÆWêÆPêÆIêÆBêÆ;êÆ4êÆ-êÆ&êÆêÆêÆêÆ êÆêÆüéÆõéÆîéÆçéÆàéÆÙéÆÒéÆËéÆÄéÆ½éÆ¶éÆ¯éÆ¨éÆ¡éÆšéÆ“éÆŒéÆ…éÆ~éÆwéÆpéÆiéÆbéÆ[éÆTéÆMéÆFéÆ?éÆ8éÆ1éÆ*éÆ#éÆéÆéÆéÆéÆéÆùèÆòèÆëèÆäèÆÝèÆÖèÆÏèÆÈèÆÁèÆºèÆ³èÆ¬èÆ¥èÆžèÆ—èÆèÆ‰èÆ‚èÆ{èÆtèÆmèÆfèÆ_èÆXèÆQèÆJèÆCèÆ<èÆ5èÆ.èÆ'èÆ èÆèÆèÆ èÆèÆýçÆöçÆïçÆèçÆáçÆÚçÆÓçÆÌçÆÅçÆ¾çÆ·çÆ°çÆ©çÆ¢çÆ›çÆ”çÆçƆçÆçÆxçÆqçÆjçÆcçÆ\çÆUçÆNçÆGçÆ@çÆ9çÆ2çÆ+çÆ$çÆçÆçÆçÆçÆçÆúæÆóæÆìæÆ忯ÞæÆ׿ÆÐæÆÉæÆÂæÆ»æÆ´æÆ­æÆ¦æÆŸæÆ˜æÆ‘æÆŠæÆƒæÆ|æÆuæÆnæÆgæÆ`æÆYæÆRæÆKæÆDæÆ=æÆ6æÆ/æÆ(æÆ!æÆæÆæÆ æÆæÆþåÆ÷åÆðåÆéåÆâåÆÛåÆÔåÆÍåÆÆåÆ¿åÆ¸åÆ±åÆªåÆ£åÆœåÆ•åÆŽåÆ‡åÆ€åÆyåÆråÆkåÆdåÆ]åÆVåÆOåÆHåÆAåÆ:åÆ3åÆ,åÆ%åÆåÆåÆåÆ åÆåÆûäÆôäÆí䯿äÆß䯨äÆÑäÆÊäÆÃ䯼䯵䯮䯧䯠䯙䯒䯋䯄äÆ}äÆväÆoäÆhäÆaäÆZäÆSäÆLäÆEäÆ>äÆ7äÆ0äÆ)äÆ"äÆäÆäÆ äÆäÆÿãÆøãÆñãÆêãÆããÆÜãÆÕãÆÎãÆÇãÆÀãÆ¹ãÆ²ãÆ«ãÆ¤ãÆãÆ–ãÆãƈãÆãÆzãÆsãÆlãÆeãÆ^ãÆWãÆPãÆIãÆBãÆ;ãÆ4ãÆ-ãÆ&ãÆãÆãÆãÆ ãÆãÆüâÆõâÆîâÆçâÆàâÆÙâÆÒâÆËâÆÄâÆ½âÆ¶âÆ¯âÆ¨âÆ¡âÆšâÆ“âÆŒâÆ…âÆ~âÆwâÆpâÆiâÆbâÆ[âÆTâÆMâÆFâÆ?âÆ8âÆ1âÆ*âÆ#âÆâÆâÆâÆâÆâÆùáÆòáÆëáÆäáÆÝáÆÖáÆÏáÆÈáÆÁáÆºáÆ³áÆ¬áÆ¥áÆžáÆ—áÆáÆ‰áÆ‚áÆ{áÆtáÆmáÆfáÆ_áÆXáÆQáÆJáÆCáÆ<áÆ5áÆ.áÆ'áÆ áÆáÆáÆ áÆáÆýàÆöàÆïàÆèàÆáàÆÚàÆÓàÆÌàÆÅàÆ¾àÆ·àÆ°àÆ©àÆ¢àÆ›àÆ”àÆàƆàÆàÆxàÆqàÆjàÆcàÆ\àÆUàÆNàÆGàÆ@àÆ9àÆ2àÆ+àÆ$àÆàÆàÆàÆàÆàÆú߯ó߯ì߯å߯Þ߯×߯Ð߯É߯Â߯»ßÆ´ßÆ­ßÆ¦ßÆŸßÆ˜ßÆ‘߯ŠßÆƒßÆ|߯u߯n߯g߯`߯Y߯R߯K߯D߯=߯6߯/߯(߯!߯߯߯ ߯߯þÞÆ÷ÞÆðÞÆéÞÆâÞÆÛÞÆÔÞÆÍÞÆÆÞÆ¿ÞÆ¸ÞÆ±ÞÆªÞÆ£ÞÆœÞÆ•ÞÆŽÞÆ‡ÞÆ€ÞÆyÞÆrÞÆkÞÆdÞÆ]ÞÆVÞÆOÞÆHÞÆAÞÆ:ÞÆ3ÞÆ,ÞÆ%ÞÆÞÆÞÆÞÆ ÞÆÞÆûÝÆôÝÆíÝÆæÝÆßÝÆØÝÆÑÝÆÊÝÆÃÝÆ¼ÝÆµÝÆ®ÝÆ§ÝÆ ÝÆ™ÝÆ’ÝÆ‹ÝÆ„ÝÆ}ÝÆvÝÆoÝÆhÝÆaÝÆZÝÆSÝÆLÝÆEÝÆ>ÝÆ7ÝÆ0ÝÆ)ÝÆ"ÝÆÝÆÝÆ ÝÆÝÆÿÜÆøÜÆñÜÆêÜÆãÜÆÜÜÆÕÜÆÎÜÆÇÜÆÀÜÆ¹ÜÆ²ÜÆ«ÜÆ¤ÜÆÜÆ–ÜÆÜÆˆÜÆÜÆzÜÆsÜÆlÜÆeÜÆ^ÜÆWÜÆPÜÆIÜÆBÜÆ;ÜÆ4ÜÆ-ÜÆ&ÜÆÜÆÜÆÜÆ ÜÆÜÆüÛÆõÛÆîÛÆçÛÆàÛÆÙÛÆÒÛÆËÛÆÄÛÆ½ÛÆ¶ÛÆ¯ÛÆ¨ÛÆ¡ÛÆšÛÆ“ÛÆŒÛÆ…ÛÆ~ÛÆwÛÆpÛÆiÛÆbÛÆ[ÛÆTÛÆMÛÆFÛÆ?ÛÆ8ÛÆ1ÛÆ*ÛÆ#ÛÆÛÆÛÆÛÆÛÆÛÆùÚÆòÚÆëÚÆäÚÆÝÚÆÖÚÆÏÚÆÈÚÆÁÚÆºÚÆ³ÚÆ¬ÚÆ¥ÚÆžÚÆ—ÚÆÚÆ‰ÚÆ‚ÚÆ{ÚÆtÚÆmÚÆfÚÆ_ÚÆXÚÆQÚÆJÚÆCÚÆ<ÚÆ5ÚÆ.ÚÆ'ÚÆ ÚÆÚÆÚÆ ÚÆÚÆýÙÆöÙÆïÙÆèÙÆáÙÆÚÙÆÓÙÆÌÙÆÅÙÆ¾ÙÆ·ÙÆ°ÙÆ©ÙÆ¢ÙÆ›ÙÆ”ÙÆÙÆ†ÙÆÙÆxÙÆqÙÆjÙÆcÙÆ\ÙÆUÙÆNÙÆGÙÆ@ÙÆ9ÙÆ2ÙÆ+ÙÆ$ÙÆÙÆÙÆÙÆÙÆÙÆúØÆóØÆìØÆ娯ÞØÆרÆÐØÆÉØÆÂØÆ»ØÆ´ØÆ­ØÆ¦ØÆŸØÆ˜ØÆ‘ØÆŠØÆƒØÆ|ØÆuØÆnØÆgØÆ`ØÆYØÆRØÆKØÆDØÆ=ØÆ6ØÆ/ØÆ(ØÆ!ØÆØÆØÆ ØÆØÆþׯ÷ׯðׯéׯâׯÛׯÔׯÍׯÆ×Æ¿×Æ¸×Æ±×Æª×Æ£×Æœ×Æ•ׯŽ×Æ‡×Æ€×Æyׯrׯkׯdׯ]ׯVׯOׯHׯAׯ:ׯ3ׯ,ׯ%ׯׯׯׯ ׯׯûÖÆôÖÆíÖÆæÖÆßÖÆØÖÆÑÖÆÊÖÆÃÖÆ¼ÖÆµÖÆ®ÖÆ§ÖÆ ÖÆ™ÖÆ’ÖÆ‹ÖÆ„ÖÆ}ÖÆvÖÆoÖÆhÖÆaÖÆZÖÆSÖÆLÖÆEÖÆ>ÖÆ7ÖÆ0ÖÆ)ÖÆ"ÖÆÖÆÖÆ ÖÆÖÆÿÕÆøÕÆñÕÆêÕÆãÕÆÜÕÆÕÕÆÎÕÆÇÕÆÀÕÆ¹ÕÆ²ÕÆ«ÕÆ¤ÕÆÕÆ–ÕÆÕÆˆÕÆÕÆzÕÆsÕÆlÕÆeÕÆ^ÕÆWÕÆPÕÆIÕÆBÕÆ;ÕÆ4ÕÆ-ÕÆ&ÕÆÕÆÕÆÕÆ ÕÆÕÆüÔÆõÔÆîÔÆçÔÆàÔÆÙÔÆÒÔÆËÔÆÄÔÆ½ÔÆ¶ÔÆ¯ÔÆ¨ÔÆ¡ÔÆšÔÆ“ÔÆŒÔÆ…ÔÆ~ÔÆwÔÆpÔÆiÔÆbÔÆ[ÔÆTÔÆMÔÆFÔÆ?ÔÆ8ÔÆ1ÔÆ*ÔÆ#ÔÆÔÆÔÆÔÆÔÆÔÆùÓÆòÓÆëÓÆäÓÆÝÓÆÖÓÆÏÓÆÈÓÆÁÓÆºÓÆ³ÓÆ¬ÓÆ¥ÓÆžÓÆ—ÓÆÓÆ‰ÓÆ‚ÓÆ{ÓÆtÓÆmÓÆfÓÆ_ÓÆXÓÆQÓÆJÓÆCÓÆ<ÓÆ5ÓÆ.ÓÆ'ÓÆ ÓÆÓÆÓÆ ÓÆÓÆýÒÆöÒÆïÒÆèÒÆáÒÆÚÒÆÓÒÆÌÒÆÅÒÆ¾ÒÆ·ÒÆ°ÒÆ©ÒÆ¢ÒÆ›ÒÆ”ÒÆÒÆ†ÒÆÒÆxÒÆqÒÆjÒÆcÒÆ\ÒÆUÒÆNÒÆGÒÆ@ÒÆ9ÒÆ2ÒÆ+ÒÆ$ÒÆÒÆÒÆÒÆÒÆÒÆúÑÆóÑÆìÑÆåÑÆÞÑÆ×ÑÆÐÑÆÉÑÆÂÑÆ»ÑÆ´ÑÆ­ÑÆ¦ÑÆŸÑÆ˜ÑÆ‘ÑÆŠÑÆƒÑÆ|ÑÆuÑÆnÑÆgÑÆ`ÑÆYÑÆRÑÆKÑÆDÑÆ=ÑÆ6ÑÆ/ÑÆ(ÑÆ!ÑÆÑÆÑÆ ÑÆÑÆþÐÆ÷ÐÆðÐÆéÐÆâÐÆÛÐÆÔÐÆÍÐÆÆÐÆ¿ÐÆ¸ÐÆ±ÐÆªÐÆ£ÐÆœÐÆ•ÐÆŽÐÆ‡ÐÆ€ÐÆyÐÆrÐÆkÐÆdÐÆ]ÐÆVÐÆOÐÆHÐÆAÐÆ:ÐÆ3ÐÆ,ÐÆ%ÐÆÐÆÐÆÐÆ ÐÆÐÆûÏÆôÏÆíÏÆæÏÆßÏÆØÏÆÑÏÆÊÏÆÃÏÆ¼ÏÆµÏÆ®ÏÆ§ÏÆ ÏÆ™ÏÆ’ÏÆ‹ÏÆ„ÏÆ}ÏÆvÏÆoÏÆhÏÆaÏÆZÏÆSÏÆLÏÆEÏÆ>ÏÆ7ÏÆ0ÏÆ)ÏÆ"ÏÆÏÆÏÆ ÏÆÏÆÿÎÆøÎÆñÎÆêÎÆãÎÆÜÎÆÕÎÆÎÎÆÇÎÆÀÎÆ¹ÎÆ²ÎÆ«ÎÆ¤ÎÆÎÆ–ÎÆÎÆˆÎÆÎÆzÎÆsÎÆlÎÆeÎÆ^ÎÆWÎÆPÎÆIÎÆBÎÆ;ÎÆ4ÎÆ-ÎÆ&ÎÆÎÆÎÆÎÆ ÎÆÎÆüÍÆõÍÆîÍÆçÍÆàÍÆÙÍÆÒÍÆËÍÆÄÍÆ½ÍÆ¶ÍÆ¯ÍÆ¨ÍÆ¡ÍÆšÍÆ“ÍÆŒÍÆ…ÍÆ~ÍÆwÍÆpÍÆiÍÆbÍÆ[ÍÆTÍÆMÍÆFÍÆ?ÍÆ8ÍÆ1ÍÆ*ÍÆ#ÍÆÍÆÍÆÍÆÍÆÍÆùÌÆòÌÆëÌÆäÌÆÝÌÆÖÌÆÏÌÆÈÌÆÁÌÆºÌÆ³ÌÆ¬ÌÆ¥ÌÆžÌÆ—ÌÆÌÆ‰ÌÆ‚ÌÆ{ÌÆtÌÆmÌÆfÌÆ_ÌÆXÌÆQÌÆJÌÆCÌÆ<ÌÆ5ÌÆ.ÌÆ'ÌÆ ÌÆÌÆÌÆ ÌÆÌÆýËÆöËÆïËÆèËÆáËÆÚËÆÓËÆÌËÆÅËÆ¾ËÆ·ËÆ°ËÆ©ËÆ¢ËÆ›ËÆ”ËÆËÆ†ËÆËÆxËÆqËÆjËÆcËÆ\ËÆUËÆNËÆGËÆ@ËÆ9ËÆ2ËÆ+ËÆ$ËÆËÆËÆËÆËÆËÆúÊÆóÊÆìÊÆåÊÆÞÊÆ×ÊÆÐÊÆÉÊÆÂÊÆ»ÊÆ´ÊÆ­ÊÆ¦ÊÆŸÊÆ˜ÊÆ‘ÊÆŠÊÆƒÊÆ|ÊÆuÊÆnÊÆgÊÆ`ÊÆYÊÆRÊÆKÊÆDÊÆ=ÊÆ6ÊÆ/ÊÆ(ÊÆ!ÊÆÊÆÊÆ ÊÆÊÆþÉÆ÷ÉÆðÉÆéÉÆâÉÆÛÉÆÔÉÆÍÉÆÆÉÆ¿ÉÆ¸ÉÆ±ÉÆªÉÆ£ÉÆœÉÆ•ÉÆŽÉÆ‡ÉÆ€ÉÆyÉÆrÉÆkÉÆdÉÆ]ÉÆVÉÆOÉÆHÉÆAÉÆ:ÉÆ3ÉÆ,ÉÆ%ÉÆÉÆÉÆÉÆ ÉÆÉÆûÈÆôÈÆíÈÆæÈÆßÈÆØÈÆÑÈÆÊÈÆÃÈÆ¼ÈÆµÈÆ®ÈÆ§ÈÆ ÈÆ™ÈÆ’ÈÆ‹ÈÆ„ÈÆ}ÈÆvÈÆoÈÆhÈÆaÈÆZÈÆSÈÆLÈÆEÈÆ>ÈÆ7ÈÆ0ÈÆ)ÈÆ"ÈÆÈÆÈÆ ÈÆÈÆÿÇÆøÇÆñÇÆêÇÆãÇÆÜÇÆÕÇÆÎÇÆÇÇÆÀÇÆ¹ÇÆ²ÇÆ«ÇÆ¤ÇÆÇÆ–ÇÆÇÆˆÇÆÇÆzÇÆsÇÆlÇÆeÇÆ^ÇÆWÇÆPÇÆIÇÆBÇÆ;ÇÆ4ÇÆ-ÇÆ&ÇÆÇÆÇÆÇÆ ÇÆÇÆüÆÆõÆÆîÆÆçÆÆàÆÆÙÆÆÒÆÆËÆÆÄÆÆ½ÆÆ¶ÆÆ¯ÆÆ¨ÆÆ¡ÆÆšÆÆ“ÆÆŒÆÆ…ÆÆ~ÆÆwÆÆpÆÆiÆÆbÆÆ[ÆÆTÆÆMÆÆFÆÆ?ÆÆ8ÆÆ1ÆÆ*ÆÆ#ÆÆÆÆÆÆÆÆÆÆÆÆùÅÆòÅÆëÅÆäÅÆÝÅÆÖÅÆÏÅÆÈÅÆÁÅÆºÅÆ³ÅÆ¬ÅÆ¥ÅÆžÅÆ—ÅÆÅÆ‰ÅÆ‚ÅÆ{ÅÆtÅÆmÅÆfÅÆ_ÅÆXÅÆQÅÆJÅÆCÅÆ<ÅÆ5ÅÆ.ÅÆ'ÅÆ ÅÆÅÆÅÆ ÅÆÅÆýÄÆöÄÆïÄÆèÄÆáÄÆÚÄÆÓÄÆÌÄÆÅÄÆ¾ÄÆ·ÄÆ°ÄÆ©ÄÆ¢ÄÆ›ÄÆ”ÄÆÄÆ†ÄÆÄÆxÄÆqÄÆjÄÆcÄÆ\ÄÆUÄÆNÄÆGÄÆ@ÄÆ9ÄÆ2ÄÆ+ÄÆ$ÄÆÄÆÄÆÄÆÄÆÄÆúÃÆóÃÆìÃÆåÃÆÞÃÆ×ÃÆÐÃÆÉÃÆÂÃÆ»ÃÆ´ÃÆ­ÃÆ¦ÃÆŸÃÆ˜ÃÆ‘ÃÆŠÃÆƒÃÆ|ÃÆuÃÆnÃÆgÃÆ`ÃÆYÃÆRÃÆKÃÆDÃÆ=ÃÆ6ÃÆ/ÃÆ(ÃÆ!ÃÆÃÆÃÆ ÃÆÃÆþÂÆ÷ÂÆðÂÆéÂÆâÂÆÛÂÆÔÂÆÍÂÆÆÂÆ¿ÂÆ¸ÂÆ±ÂÆªÂÆ£ÂÆœÂÆ•ÂÆŽÂÆ‡ÂÆ€ÂÆyÂÆrÂÆkÂÆdÂÆ]ÂÆVÂÆOÂÆHÂÆAÂÆ:ÂÆ3ÂÆ,ÂÆ%ÂÆÂÆÂÆÂÆ ÂÆÂÆûÁÆôÁÆíÁÆæÁÆßÁÆØÁÆÑÁÆÊÁÆÃÁƼÁƵÁÆ®ÁƧÁÆ ÁÆ™ÁÆ’ÁÆ‹ÁÆ„ÁÆ}ÁÆvÁÆoÁÆhÁÆaÁÆZÁÆSÁÆLÁÆEÁÆ>ÁÆ7ÁÆ0ÁÆ)ÁÆ"ÁÆÁÆÁÆ ÁÆÁÆÿÀÆøÀÆñÀÆêÀÆãÀÆÜÀÆÕÀÆÎÀÆÇÀÆÀÀƹÀƲÀÆ«ÀƤÀÆÀÆ–ÀÆÀƈÀÆÀÆzÀÆsÀÆlÀÆeÀÆ^ÀÆWÀÆPÀÆIÀÆBÀÆ;ÀÆ4ÀÆ-ÀÆ&ÀÆÀÆÀÆÀÆ ÀÆÀÆü¿Æõ¿Æî¿Æç¿Æà¿ÆÙ¿ÆÒ¿ÆË¿ÆÄ¿Æ½¿Æ¶¿Æ¯¿Æ¨¿Æ¡¿Æš¿Æ“¿ÆŒ¿Æ…¿Æ~¿Æw¿Æp¿Æi¿Æb¿Æ[¿ÆT¿ÆM¿ÆF¿Æ?¿Æ8¿Æ1¿Æ*¿Æ#¿Æ¿Æ¿Æ¿Æ¿Æ¿Æù¾Æò¾Æë¾Æ侯ݾÆÖ¾ÆϾÆȾÆÁ¾Æº¾Æ³¾Æ¬¾Æ¥¾Æž¾Æ—¾Æ¾Æ‰¾Æ‚¾Æ{¾Æt¾Æm¾Æf¾Æ_¾ÆX¾ÆQ¾ÆJ¾ÆC¾Æ<¾Æ5¾Æ.¾Æ'¾Æ ¾Æ¾Æ¾Æ ¾Æ¾Æý½Æö½Æï½Æè½Æá½ÆÚ½ÆÓ½Æ̽Ǝƾ½Æ·½Æ°½Æ©½Æ¢½Æ›½Æ”½Æ½Æ†½Æ½Æx½Æq½Æj½Æc½Æ\½ÆU½ÆN½ÆG½Æ@½Æ9½Æ2½Æ+½Æ$½Æ½Æ½Æ½Æ½Æ½Æú¼Æó¼Æì¼Æ弯Þ¼Æ×¼ÆмÆɼƼƻ¼Æ´¼Æ­¼Æ¦¼ÆŸ¼Æ˜¼Æ‘¼Æмƃ¼Æ|¼Æu¼Æn¼Æg¼Æ`¼ÆY¼ÆR¼ÆK¼ÆD¼Æ=¼Æ6¼Æ/¼Æ(¼Æ!¼Æ¼Æ¼Æ ¼Æ¼Æþ»Æ÷»Æð»Æ黯â»ÆÛ»ÆÔ»ÆÍ»ÆÆ»Æ¿»Æ¸»Æ±»Æª»Æ£»Æœ»Æ•»ÆŽ»Æ‡»Æ€»Æy»Ær»Æk»Æd»Æ]»ÆV»ÆO»ÆH»ÆA»Æ:»Æ3»Æ,»Æ%»Æ»Æ»Æ»Æ »Æ»ÆûºÆôºÆíºÆæºÆߺÆغÆѺÆʺÆúƼºÆµºÆ®ºÆ§ºÆ ºÆ™ºÆ’ºÆ‹ºÆ„ºÆ}ºÆvºÆoºÆhºÆaºÆZºÆSºÆLºÆEºÆ>ºÆ7ºÆ0ºÆ)ºÆ"ºÆºÆºÆ ºÆºÆÿ¹Æø¹Æñ¹Æê¹Æã¹ÆܹÆÕ¹ÆιÆǹÆÀ¹Æ¹¹Æ²¹Æ«¹Æ¤¹Æ¹Æ–¹Æ¹Æˆ¹Æ¹Æz¹Æs¹Æl¹Æe¹Æ^¹ÆW¹ÆP¹ÆI¹ÆB¹Æ;¹Æ4¹Æ-¹Æ&¹Æ¹Æ¹Æ¹Æ ¹Æ¹Æü¸Æõ¸Æî¸Æç¸Æà¸ÆÙ¸ÆÒ¸Æ˸Æĸƽ¸Æ¶¸Æ¯¸Æ¨¸Æ¡¸Æš¸Æ“¸ÆŒ¸Æ…¸Æ~¸Æw¸Æp¸Æi¸Æb¸Æ[¸ÆT¸ÆM¸ÆF¸Æ?¸Æ8¸Æ1¸Æ*¸Æ#¸Æ¸Æ¸Æ¸Æ¸Æ¸Æù·Æò·Æë·Æä·ÆÝ·ÆÖ·ÆÏ·ÆÈ·ÆÁ·Æº·Æ³·Æ¬·Æ¥·Æž·Æ—·Æ·Æ‰·Æ‚·Æ{·Æt·Æm·Æf·Æ_·ÆX·ÆQ·ÆJ·ÆC·Æ<·Æ5·Æ.·Æ'·Æ ·Æ·Æ·Æ ·Æ·Æý¶Æö¶Æï¶Æè¶Æá¶ÆÚ¶ÆÓ¶Æ̶ÆŶƾ¶Æ·¶Æ°¶Æ©¶Æ¢¶Æ›¶Æ”¶Æ¶Æ†¶Æ¶Æx¶Æq¶Æj¶Æc¶Æ\¶ÆU¶ÆN¶ÆG¶Æ@¶Æ9¶Æ2¶Æ+¶Æ$¶Æ¶Æ¶Æ¶Æ¶Æ¶ÆúµÆóµÆìµÆ嵯ÞµÆ×µÆеÆɵƵƻµÆ´µÆ­µÆ¦µÆŸµÆ˜µÆ‘µÆеƃµÆ|µÆuµÆnµÆgµÆ`µÆYµÆRµÆKµÆDµÆ=µÆ6µÆ/µÆ(µÆ!µÆµÆµÆ µÆµÆþ´Æ÷´Æð´Æé´Æâ´ÆÛ´ÆÔ´ÆÍ´ÆÆ´Æ¿´Æ¸´Æ±´Æª´Æ£´Æœ´Æ•´ÆŽ´Æ‡´Æ€´Æy´Ær´Æk´Æd´Æ]´ÆV´ÆO´ÆH´ÆA´Æ:´Æ3´Æ,´Æ%´Æ´Æ´Æ´Æ ´Æ´Æû³Æô³Æí³Ææ³Æß³ÆسÆѳÆʳÆóƼ³Æµ³Æ®³Æ§³Æ ³Æ™³Æ’³Æ‹³Æ„³Æ}³Æv³Æo³Æh³Æa³ÆZ³ÆS³ÆL³ÆE³Æ>³Æ7³Æ0³Æ)³Æ"³Æ³Æ³Æ ³Æ³Æÿ²Æø²Æñ²Æê²Æã²ÆܲÆÕ²ÆβÆDzÆÀ²Æ¹²Æ²²Æ«²Æ¤²Æ²Æ–²Æ²Æˆ²Æ²Æz²Æs²Æl²Æe²Æ^²ÆW²ÆP²ÆI²ÆB²Æ;²Æ4²Æ-²Æ&²Æ²Æ²Æ²Æ ²Æ²Æü±Æõ±Æî±Æç±Æà±ÆÙ±ÆÒ±Æ˱Æıƽ±Æ¶±Æ¯±Æ¨±Æ¡±Æš±Æ“±ÆŒ±Æ…±Æ~±Æw±Æp±Æi±Æb±Æ[±ÆT±ÆM±ÆF±Æ?±Æ8±Æ1±Æ*±Æ#±Æ±Æ±Æ±Æ±Æ±Æù°Æò°Æë°Æä°ÆݰÆÖ°ÆϰÆȰÆÁ°Æº°Æ³°Æ¬°Æ¥°Æž°Æ—°Æ°Æ‰°Æ‚°Æ{°Æt°Æm°Æf°Æ_°ÆX°ÆQ°ÆJ°ÆC°Æ<°Æ5°Æ.°Æ'°Æ °Æ°Æ°Æ °Æ°Æý¯Æö¯Æï¯Æè¯Æá¯ÆÚ¯ÆÓ¯Æ̯Æůƾ¯Æ·¯Æ°¯Æ©¯Æ¢¯Æ›¯Æ”¯Æ¯Æ†¯Æ¯Æx¯Æq¯Æj¯Æc¯Æ\¯ÆU¯ÆN¯ÆG¯Æ@¯Æ9¯Æ2¯Æ+¯Æ$¯Æ¯Æ¯Æ¯Æ¯Æ¯Æú®Æó®Æì®Æ宯Þ®Æ×®ÆЮÆÉ®Æ®Æ»®Æ´®Æ­®Æ¦®ÆŸ®Æ˜®Æ‘®ÆŠ®Æƒ®Æ|®Æu®Æn®Æg®Æ`®ÆY®ÆR®ÆK®ÆD®Æ=®Æ6®Æ/®Æ(®Æ!®Æ®Æ®Æ ®Æ®Æþ­Æ÷­Æð­Æé­Æâ­ÆÛ­ÆÔ­ÆÍ­ÆÆ­Æ¿­Æ¸­Æ±­Æª­Æ£­Æœ­Æ•­ÆŽ­Æ‡­Æ€­Æy­Ær­Æk­Æd­Æ]­ÆV­ÆO­ÆH­ÆA­Æ:­Æ3­Æ,­Æ%­Æ­Æ­Æ­Æ ­Æ­Æû¬Æô¬Æí¬Ææ¬Æ߬ÆجÆѬÆʬÆìƼ¬Æµ¬Æ®¬Æ§¬Æ ¬Æ™¬Æ’¬Æ‹¬Æ„¬Æ}¬Æv¬Æo¬Æh¬Æa¬ÆZ¬ÆS¬ÆL¬ÆE¬Æ>¬Æ7¬Æ0¬Æ)¬Æ"¬Æ¬Æ¬Æ ¬Æ¬Æÿ«Æø«Æñ«Æê«Æã«ÆÜ«ÆÕ«ÆΫÆÇ«ÆÀ«Æ¹«Æ²«Æ««Æ¤«Æ«Æ–«Æ«Æˆ«Æ«Æz«Æs«Æl«Æe«Æ^«ÆW«ÆP«ÆI«ÆB«Æ;«Æ4«Æ-«Æ&«Æ«Æ«Æ«Æ «Æ«ÆüªÆõªÆîªÆçªÆàªÆÙªÆÒªÆ˪ÆĪƽªÆ¶ªÆ¯ªÆ¨ªÆ¡ªÆšªÆ“ªÆŒªÆ…ªÆ~ªÆwªÆpªÆiªÆbªÆ[ªÆTªÆMªÆFªÆ?ªÆ8ªÆ1ªÆ*ªÆ#ªÆªÆªÆªÆªÆªÆù©Æò©Æë©Æ䩯Ý©ÆÖ©ÆÏ©ÆÈ©ÆÁ©Æº©Æ³©Æ¬©Æ¥©Æž©Æ—©Æ©Æ‰©Æ‚©Æ{©Æt©Æm©Æf©Æ_©ÆX©ÆQ©ÆJ©ÆC©Æ<©Æ5©Æ.©Æ'©Æ ©Æ©Æ©Æ ©Æ©Æý¨Æö¨Æï¨Æè¨Æá¨ÆÚ¨ÆÓ¨Æ̨ÆŨƾ¨Æ·¨Æ°¨Æ©¨Æ¢¨Æ›¨Æ”¨Æ¨Æ†¨Æ¨Æx¨Æq¨Æj¨Æc¨Æ\¨ÆU¨ÆN¨ÆG¨Æ@¨Æ9¨Æ2¨Æ+¨Æ$¨Æ¨Æ¨Æ¨Æ¨Æ¨Æú§Æó§Æì§Æå§ÆÞ§Æ×§ÆЧÆɧƧƻ§Æ´§Æ­§Æ¦§ÆŸ§Æ˜§Æ‘§ÆЧƃ§Æ|§Æu§Æn§Æg§Æ`§ÆY§ÆR§ÆK§ÆD§Æ=§Æ6§Æ/§Æ(§Æ!§Æ§Æ§Æ §Æ§Æþ¦Æ÷¦Æð¦Æ馯â¦ÆÛ¦ÆÔ¦ÆͦÆƦÆ¿¦Æ¸¦Æ±¦Æª¦Æ£¦Æœ¦Æ•¦ÆަƇ¦Æ€¦Æy¦Ær¦Æk¦Æd¦Æ]¦ÆV¦ÆO¦ÆH¦ÆA¦Æ:¦Æ3¦Æ,¦Æ%¦Æ¦Æ¦Æ¦Æ ¦Æ¦Æû¥Æô¥Æí¥Ææ¥ÆߥÆØ¥ÆÑ¥ÆÊ¥ÆÃ¥Æ¼¥Æµ¥Æ®¥Æ§¥Æ ¥Æ™¥Æ’¥Æ‹¥Æ„¥Æ}¥Æv¥Æo¥Æh¥Æa¥ÆZ¥ÆS¥ÆL¥ÆE¥Æ>¥Æ7¥Æ0¥Æ)¥Æ"¥Æ¥Æ¥Æ ¥Æ¥Æÿ¤Æø¤Æñ¤Æê¤Æã¤ÆܤÆÕ¤ÆΤÆǤÆÀ¤Æ¹¤Æ²¤Æ«¤Æ¤¤Æ¤Æ–¤Æ¤Æˆ¤Æ¤Æz¤Æs¤Æl¤Æe¤Æ^¤ÆW¤ÆP¤ÆI¤ÆB¤Æ;¤Æ4¤Æ-¤Æ&¤Æ¤Æ¤Æ¤Æ ¤Æ¤Æü£Æõ£Æî£Æç£Æà£ÆÙ£ÆÒ£ÆË£ÆÄ£Æ½£Æ¶£Æ¯£Æ¨£Æ¡£Æš£Æ“£ÆŒ£Æ…£Æ~£Æw£Æp£Æi£Æb£Æ[£ÆT£ÆM£ÆF£Æ?£Æ8£Æ1£Æ*£Æ#£Æ£Æ£Æ£Æ£Æ£Æù¢Æò¢Æë¢Æ䢯Ý¢ÆÖ¢ÆÏ¢ÆÈ¢ÆÁ¢Æº¢Æ³¢Æ¬¢Æ¥¢Æž¢Æ—¢Æ¢Æ‰¢Æ‚¢Æ{¢Æt¢Æm¢Æf¢Æ_¢ÆX¢ÆQ¢ÆJ¢ÆC¢Æ<¢Æ5¢Æ.¢Æ'¢Æ ¢Æ¢Æ¢Æ ¢Æ¢Æý¡Æö¡Æï¡Æè¡Æá¡ÆÚ¡ÆÓ¡ÆÌ¡ÆÅ¡Æ¾¡Æ·¡Æ°¡Æ©¡Æ¢¡Æ›¡Æ”¡Æ¡Æ†¡Æ¡Æx¡Æq¡Æj¡Æc¡Æ\¡ÆU¡ÆN¡ÆG¡Æ@¡Æ9¡Æ2¡Æ+¡Æ$¡Æ¡Æ¡Æ¡Æ¡Æ¡Æú Æó Æì Æå ÆÞ Æ× ÆРÆÉ Æ Æ» Æ´ Æ­ Æ¦ ÆŸ Æ˜ Æ‘ ÆŠ Æƒ Æ| Æu Æn Æg Æ` ÆY ÆR ÆK ÆD Æ= Æ6 Æ/ Æ( Æ! Æ Æ Æ  Æ ÆþŸÆ÷ŸÆðŸÆéŸÆâŸÆÛŸÆÔŸÆÍŸÆÆŸÆ¿ŸÆ¸ŸÆ±ŸÆªŸÆ£ŸÆœŸÆ•ŸÆŽŸÆ‡ŸÆ€ŸÆyŸÆrŸÆkŸÆdŸÆ]ŸÆVŸÆOŸÆHŸÆAŸÆ:ŸÆ3ŸÆ,ŸÆ%ŸÆŸÆŸÆŸÆ ŸÆŸÆûžÆôžÆížÆæžÆßžÆØžÆÑžÆÊžÆÞƼžÆµžÆ®žÆ§žÆ žÆ™žÆ’žÆ‹žÆ„žÆ}žÆvžÆožÆhžÆažÆZžÆSžÆLžÆEžÆ>žÆ7žÆ0žÆ)žÆ"žÆžÆžÆ žÆžÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüœÆõœÆîœÆçœÆàœÆÙœÆÒœÆËœÆÄœÆ½œÆ¶œÆ¯œÆ¨œÆ¡œÆšœÆ“œÆŒœÆ…œÆ~œÆwœÆpœÆiœÆbœÆ[œÆTœÆMœÆFœÆ?œÆ8œÆ1œÆ*œÆ#œÆœÆœÆœÆœÆœÆù›Æò›Æë›Æ䛯Ý›ÆÖ›ÆÏ›ÆÈ›ÆÁ›Æº›Æ³›Æ¬›Æ¥›Æž›Æ—›Æ›Æ‰›Æ‚›Æ{›Æt›Æm›Æf›Æ_›ÆX›ÆQ›ÆJ›ÆC›Æ<›Æ5›Æ.›Æ'›Æ ›Æ›Æ›Æ ›Æ›ÆýšÆöšÆïšÆèšÆášÆÚšÆÓšÆÌšÆÅšÆ¾šÆ·šÆ°šÆ©šÆ¢šÆ›šÆ”šÆšÆ†šÆšÆxšÆqšÆjšÆcšÆ\šÆUšÆNšÆGšÆ@šÆ9šÆ2šÆ+šÆ$šÆšÆšÆšÆšÆšÆú™Æó™Æì™Æ噯Þ™Æ×™ÆЙÆÉ™Æ™Æ»™Æ´™Æ­™Æ¦™ÆŸ™Æ˜™Æ‘™ÆŠ™Æƒ™Æ|™Æu™Æn™Æg™Æ`™ÆY™ÆR™ÆK™ÆD™Æ=™Æ6™Æ/™Æ(™Æ!™Æ™Æ™Æ ™Æ™Æþ˜Æ÷˜Æð˜Æé˜Æâ˜ÆÛ˜ÆÔ˜Æ͘ÆƘÆ¿˜Æ¸˜Æ±˜Æª˜Æ£˜Æœ˜Æ•˜ÆŽ˜Æ‡˜Æ€˜Æy˜Ær˜Æk˜Æd˜Æ]˜ÆV˜ÆO˜ÆH˜ÆA˜Æ:˜Æ3˜Æ,˜Æ%˜Æ˜Æ˜Æ˜Æ ˜Æ˜Æû—Æô—Æí—Ææ—Æß—ÆØ—ÆÑ—ÆÊ—Æׯ¼—Ƶ—Æ®—Ƨ—Æ —Æ™—Æ’—Æ‹—Æ„—Æ}—Æv—Æo—Æh—Æa—ÆZ—ÆS—ÆL—ÆE—Æ>—Æ7—Æ0—Æ)—Æ"—Æ—Æ—Æ —Æ—Æÿ–Æø–Æñ–Æê–Æã–ÆÜ–ÆÕ–ÆΖÆÇ–ÆÀ–ƹ–Ʋ–Æ«–Ƥ–Æ–Æ––Ɩƈ–Æ–Æz–Æs–Æl–Æe–Æ^–ÆW–ÆP–ÆI–ÆB–Æ;–Æ4–Æ-–Æ&–Æ–Æ–Æ–Æ –Æ–Æü•Æõ•Æî•Æç•Æà•ÆÙ•ÆÒ•ÆË•ÆÄ•ƽ•ƶ•Ư•ƨ•Æ¡•Æš•Æ“•ÆŒ•Æ…•Æ~•Æw•Æp•Æi•Æb•Æ[•ÆT•ÆM•ÆF•Æ?•Æ8•Æ1•Æ*•Æ#•ƕƕƕƕƕÆù”Æò”Æë”Æ䔯Ý”ÆÖ”ÆÏ”ÆÈ”ÆÁ”ƺ”Ƴ”Ƭ”Æ¥”Æž”Æ—”ƔƉ”Æ‚”Æ{”Æt”Æm”Æf”Æ_”ÆX”ÆQ”ÆJ”ÆC”Æ<”Æ5”Æ.”Æ'”Æ ”Æ”Æ”Æ ”Æ”Æý“Æö“Æï“Æè“Æá“ÆÚ“ÆÓ“ÆÌ“ÆÅ“ƾ“Æ·“ư“Æ©“Æ¢“Æ›“Æ”“ƓƆ“Æ“Æx“Æq“Æj“Æc“Æ\“ÆU“ÆN“ÆG“Æ@“Æ9“Æ2“Æ+“Æ$“ƓƓƓƓƓÆú’Æó’Æì’Æå’ÆÞ’Æ×’ÆÐ’ÆÉ’ÆÂ’Æ»’Æ´’Æ­’Ʀ’ÆŸ’Ƙ’Æ‘’ÆŠ’ƃ’Æ|’Æu’Æn’Æg’Æ`’ÆY’ÆR’ÆK’ÆD’Æ=’Æ6’Æ/’Æ(’Æ!’Æ’Æ’Æ ’Æ’Æþ‘Æ÷‘Æð‘Æ鑯â‘ÆÛ‘ÆÔ‘ÆÍ‘ÆÆ‘Æ¿‘Ƹ‘Ʊ‘ƪ‘Æ£‘Æœ‘Æ•‘ÆŽ‘Ƈ‘Æ€‘Æy‘Ær‘Æk‘Æd‘Æ]‘ÆV‘ÆO‘ÆH‘ÆA‘Æ:‘Æ3‘Æ,‘Æ%‘Æ‘Æ‘Æ‘Æ ‘Æ‘ÆûÆôÆíÆæÆ߯ØÆÑÆÊÆÃÆ¼ÆµÆ®Æ§Æ Æ™Æ’ƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüŽÆõŽÆîŽÆçŽÆàŽÆÙŽÆÒŽÆËŽÆÄŽÆ½ŽÆ¶ŽÆ¯ŽÆ¨ŽÆ¡ŽÆšŽÆ“ŽÆŒŽÆ…ŽÆ~ŽÆwŽÆpŽÆiŽÆbŽÆ[ŽÆTŽÆMŽÆFŽÆ?ŽÆ8ŽÆ1ŽÆ*ŽÆ#ŽÆŽÆŽÆŽÆŽÆŽÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýŒÆöŒÆïŒÆèŒÆáŒÆÚŒÆÓŒÆÌŒÆÅŒÆ¾ŒÆ·ŒÆ°ŒÆ©ŒÆ¢ŒÆ›ŒÆ”ŒÆŒÆ†ŒÆŒÆxŒÆqŒÆjŒÆcŒÆ\ŒÆUŒÆNŒÆGŒÆ@ŒÆ9ŒÆ2ŒÆ+ŒÆ$ŒÆŒÆŒÆŒÆŒÆŒÆú‹Æó‹Æì‹Æ勯Þ‹Æ׋ÆЋÆÉ‹Æ‹Æ»‹Æ´‹Æ­‹Æ¦‹ÆŸ‹Æ˜‹Æ‘‹ÆŠ‹Æƒ‹Æ|‹Æu‹Æn‹Æg‹Æ`‹ÆY‹ÆR‹ÆK‹ÆD‹Æ=‹Æ6‹Æ/‹Æ(‹Æ!‹Æ‹Æ‹Æ ‹Æ‹ÆþŠÆ÷ŠÆðŠÆéŠÆâŠÆÛŠÆÔŠÆÍŠÆÆŠÆ¿ŠÆ¸ŠÆ±ŠÆªŠÆ£ŠÆœŠÆ•ŠÆŽŠÆ‡ŠÆ€ŠÆyŠÆrŠÆkŠÆdŠÆ]ŠÆVŠÆOŠÆHŠÆAŠÆ:ŠÆ3ŠÆ,ŠÆ%ŠÆŠÆŠÆŠÆ ŠÆŠÆû‰Æô‰Æí‰Ææ‰Æ߉Æ؉ÆщÆʉÆÉƼ‰Æµ‰Æ®‰Æ§‰Æ ‰Æ™‰Æ’‰Æ‹‰Æ„‰Æ}‰Æv‰Æo‰Æh‰Æa‰ÆZ‰ÆS‰ÆL‰ÆE‰Æ>‰Æ7‰Æ0‰Æ)‰Æ"‰Æ‰Æ‰Æ ‰Æ‰ÆÿˆÆøˆÆñˆÆêˆÆãˆÆ܈ÆÕˆÆΈÆLjÆÀˆÆ¹ˆÆ²ˆÆ«ˆÆ¤ˆÆˆÆ–ˆÆˆÆˆˆÆˆÆzˆÆsˆÆlˆÆeˆÆ^ˆÆWˆÆPˆÆIˆÆBˆÆ;ˆÆ4ˆÆ-ˆÆ&ˆÆˆÆˆÆˆÆ ˆÆˆÆü‡Æõ‡Æî‡Æç‡Æà‡ÆÙ‡ÆÒ‡ÆˇÆćƽ‡Æ¶‡Æ¯‡Æ¨‡Æ¡‡Æš‡Æ“‡ÆŒ‡Æ…‡Æ~‡Æw‡Æp‡Æi‡Æb‡Æ[‡ÆT‡ÆM‡ÆF‡Æ?‡Æ8‡Æ1‡Æ*‡Æ#‡Æ‡Æ‡Æ‡Æ‡Æ‡Æù†Æò†Æë†Æ䆯݆ÆÖ†ÆφÆȆÆÁ†Æº†Æ³†Æ¬†Æ¥†Æž†Æ—†Æ†Æ‰†Æ‚†Æ{†Æt†Æm†Æf†Æ_†ÆX†ÆQ†ÆJ†ÆC†Æ<†Æ5†Æ.†Æ'†Æ †Æ†Æ†Æ †Æ†Æý…Æö…Æï…Æè…Æá…ÆÚ…ÆÓ…ÆÌ…ÆÅ…ƾ…Æ·…ư…Æ©…Æ¢…Æ›…Æ”…ƅƆ…Æ…Æx…Æq…Æj…Æc…Æ\…ÆU…ÆN…ÆG…Æ@…Æ9…Æ2…Æ+…Æ$…Æ…Æ…Æ…Æ…Æ…Æú„Æó„Æì„Æ儯Þ„ÆׄÆЄÆÉ„Ƅƻ„Æ´„Æ­„Ʀ„ÆŸ„Ƙ„Æ‘„ÆŠ„ƃ„Æ|„Æu„Æn„Æg„Æ`„ÆY„ÆR„ÆK„ÆD„Æ=„Æ6„Æ/„Æ(„Æ!„Æ„Æ„Æ „Æ„ÆþƒÆ÷ƒÆðƒÆéƒÆâƒÆÛƒÆÔƒÆ̓ÆƃÆ¿ƒÆ¸ƒÆ±ƒÆªƒÆ£ƒÆœƒÆ•ƒÆŽƒÆ‡ƒÆ€ƒÆyƒÆrƒÆkƒÆdƒÆ]ƒÆVƒÆOƒÆHƒÆAƒÆ:ƒÆ3ƒÆ,ƒÆ%ƒÆƒÆƒÆƒÆ ƒÆƒÆû‚Æô‚Æí‚Ææ‚Æß‚ÆØ‚ÆÑ‚ÆÊ‚ÆÂƼ‚Ƶ‚Æ®‚Ƨ‚Æ ‚Æ™‚Æ’‚Æ‹‚Æ„‚Æ}‚Æv‚Æo‚Æh‚Æa‚ÆZ‚ÆS‚ÆL‚ÆE‚Æ>‚Æ7‚Æ0‚Æ)‚Æ"‚Æ‚Æ‚Æ ‚Æ‚ÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆü€Æõ€Æî€Æç€Æà€ÆÙ€ÆÒ€ÆË€ÆÄ€Æ½€Æ¶€Æ¯€Æ¨€Æ¡€Æš€Æ“€ÆŒ€Æ…€Æ~€Æw€Æp€Æi€Æb€Æ[€ÆT€ÆM€ÆF€Æ?€Æ8€Æ1€Æ*€Æ#€Æ€Æ€Æ€Æ€Æ€ÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆý~Æö~Æï~Æè~Æá~ÆÚ~ÆÓ~ÆÌ~ÆÅ~ƾ~Æ·~ư~Æ©~Æ¢~Æ›~Æ”~Æ~Ɔ~Æ~Æx~Æq~Æj~Æc~Æ\~ÆU~ÆN~ÆG~Æ@~Æ9~Æ2~Æ+~Æ$~Æ~Æ~Æ~Æ~Æ~Æú}Æó}Æì}Æå}ÆÞ}Æ×}ÆÐ}ÆÉ}ÆÂ}Æ»}Æ´}Æ­}Ʀ}ÆŸ}Ƙ}Æ‘}ÆŠ}ƃ}Æ|}Æu}Æn}Æg}Æ`}ÆY}ÆR}ÆK}ÆD}Æ=}Æ6}Æ/}Æ(}Æ!}Æ}Æ}Æ }Æ}Æþ|Æ÷|Æð|Æé|Æâ|ÆÛ|ÆÔ|ÆÍ|ÆÆ|Æ¿|Ƹ|Ʊ|ƪ|Æ£|Æœ|Æ•|ÆŽ|Ƈ|Æ€|Æy|Ær|Æk|Æd|Æ]|ÆV|ÆO|ÆH|ÆA|Æ:|Æ3|Æ,|Æ%|Æ|Æ|Æ|Æ |Æ|Æû{Æô{Æí{Ææ{Æß{ÆØ{ÆÑ{ÆÊ{ÆÃ{Ƽ{Ƶ{Æ®{Ƨ{Æ {Æ™{Æ’{Æ‹{Æ„{Æ}{Æv{Æo{Æh{Æa{ÆZ{ÆS{ÆL{ÆE{Æ>{Æ7{Æ0{Æ){Æ"{Æ{Æ{Æ {Æ{ÆÿzÆøzÆñzÆêzÆãzÆÜzÆÕzÆÎzÆÇzÆÀzƹzƲzÆ«zƤzÆzÆ–zÆzƈzÆzÆzzÆszÆlzÆezÆ^zÆWzÆPzÆIzÆBzÆ;zÆ4zÆ-zÆ&zÆzÆzÆzÆ zÆzÆüyÆõyÆîyÆçyÆàyÆÙyÆÒyÆËyÆÄyƽyƶyƯyƨyÆ¡yÆšyÆ“yÆŒyÆ…yÆ~yÆwyÆpyÆiyÆbyÆ[yÆTyÆMyÆFyÆ?yÆ8yÆ1yÆ*yÆ#yÆyÆyÆyÆyÆyÆùxÆòxÆëxÆäxÆÝxÆÖxÆÏxÆÈxÆÁxƺxƳxƬxÆ¥xÆžxÆ—xÆxƉxÆ‚xÆ{xÆtxÆmxÆfxÆ_xÆXxÆQxÆJxÆCxÆtÆ7tÆ0tÆ)tÆ"tÆtÆtÆ tÆtÆÿsÆøsÆñsÆêsÆãsÆÜsÆÕsÆÎsÆÇsÆÀsƹsƲsÆ«sƤsÆsÆ–sÆsƈsÆsÆzsÆssÆlsÆesÆ^sÆWsÆPsÆIsÆBsÆ;sÆ4sÆ-sÆ&sÆsÆsÆsÆ sÆsÆürÆõrÆîrÆçrÆàrÆÙrÆÒrÆËrÆÄrƽrƶrƯrƨrÆ¡rÆšrÆ“rÆŒrÆ…rÆ~rÆwrÆprÆirÆbrÆ[rÆTrÆMrÆFrÆ?rÆ8rÆ1rÆ*rÆ#rÆrÆrÆrÆrÆrÆùqÆòqÆëqÆäqÆÝqÆÖqÆÏqÆÈqÆÁqƺqƳqƬqÆ¥qÆžqÆ—qÆqƉqÆ‚qÆ{qÆtqÆmqÆfqÆ_qÆXqÆQqÆJqÆCqÆmÆ7mÆ0mÆ)mÆ"mÆmÆmÆ mÆmÆÿlÆølÆñlÆêlÆãlÆÜlÆÕlÆÎlÆÇlÆÀlƹlƲlÆ«lƤlÆlÆ–lÆlƈlÆlÆzlÆslÆllÆelÆ^lÆWlÆPlÆIlÆBlÆ;lÆ4lÆ-lÆ&lÆlÆlÆlÆ lÆlÆükÆõkÆîkÆçkÆàkÆÙkÆÒkÆËkÆÄkƽkƶkƯkƨkÆ¡kÆškÆ“kÆŒkÆ…kÆ~kÆwkÆpkÆikÆbkÆ[kÆTkÆMkÆFkÆ?kÆ8kÆ1kÆ*kÆ#kÆkÆkÆkÆkÆkÆùjÆòjÆëjÆäjÆÝjÆÖjÆÏjÆÈjÆÁjƺjƳjƬjÆ¥jÆžjÆ—jÆjƉjÆ‚jÆ{jÆtjÆmjÆfjÆ_jÆXjÆQjÆJjÆCjÆfÆ7fÆ0fÆ)fÆ"fÆfÆfÆ fÆfÆÿeÆøeÆñeÆêeÆãeÆÜeÆÕeÆÎeÆÇeÆÀeƹeƲeÆ«eƤeÆeÆ–eÆeƈeÆeÆzeÆseÆleÆeeÆ^eÆWeÆPeÆIeÆBeÆ;eÆ4eÆ-eÆ&eÆeÆeÆeÆ eÆeÆüdÆõdÆîdÆçdÆàdÆÙdÆÒdÆËdÆÄdƽdƶdƯdƨdÆ¡dÆšdÆ“dÆŒdÆ…dÆ~dÆwdÆpdÆidÆbdÆ[dÆTdÆMdÆFdÆ?dÆ8dÆ1dÆ*dÆ#dÆdÆdÆdÆdÆdÆùcÆòcÆëcÆäcÆÝcÆÖcÆÏcÆÈcÆÁcƺcƳcƬcÆ¥cÆžcÆ—cÆcƉcÆ‚cÆ{cÆtcÆmcÆfcÆ_cÆXcÆQcÆJcÆCcÆ_Æ7_Æ0_Æ)_Æ"_Æ_Æ_Æ _Æ_Æÿ^Æø^Æñ^Æê^Æã^ÆÜ^ÆÕ^ÆÎ^ÆÇ^ÆÀ^ƹ^Ʋ^Æ«^Ƥ^Æ^Æ–^Æ^ƈ^Æ^Æz^Æs^Æl^Æe^Æ^^ÆW^ÆP^ÆI^ÆB^Æ;^Æ4^Æ-^Æ&^Æ^Æ^Æ^Æ ^Æ^Æü]Æõ]Æî]Æç]Æà]ÆÙ]ÆÒ]ÆË]ÆÄ]ƽ]ƶ]Ư]ƨ]Æ¡]Æš]Æ“]ÆŒ]Æ…]Æ~]Æw]Æp]Æi]Æb]Æ[]ÆT]ÆM]ÆF]Æ?]Æ8]Æ1]Æ*]Æ#]Æ]Æ]Æ]Æ]Æ]Æù\Æò\Æë\Æä\ÆÝ\ÆÖ\ÆÏ\ÆÈ\ÆÁ\ƺ\Ƴ\Ƭ\Æ¥\Æž\Æ—\Æ\Ɖ\Æ‚\Æ{\Æt\Æm\Æf\Æ_\ÆX\ÆQ\ÆJ\ÆC\Æ<\Æ5\Æ.\Æ'\Æ \Æ\Æ\Æ \Æ\Æý[Æö[Æï[Æè[Æá[ÆÚ[ÆÓ[ÆÌ[ÆÅ[ƾ[Æ·[ư[Æ©[Æ¢[Æ›[Æ”[Æ[Ɔ[Æ[Æx[Æq[Æj[Æc[Æ\[ÆU[ÆN[ÆG[Æ@[Æ9[Æ2[Æ+[Æ$[Æ[Æ[Æ[Æ[Æ[ÆúZÆóZÆìZÆåZÆÞZÆ×ZÆÐZÆÉZÆÂZÆ»ZÆ´ZÆ­ZƦZÆŸZƘZÆ‘ZÆŠZƃZÆ|ZÆuZÆnZÆgZÆ`ZÆYZÆRZÆKZÆDZÆ=ZÆ6ZÆ/ZÆ(ZÆ!ZÆZÆZÆ ZÆZÆþYÆ÷YÆðYÆéYÆâYÆÛYÆÔYÆÍYÆÆYÆ¿YƸYƱYƪYÆ£YÆœYÆ•YÆŽYƇYÆ€YÆyYÆrYÆkYÆdYÆ]YÆVYÆOYÆHYÆAYÆ:YÆ3YÆ,YÆ%YÆYÆYÆYÆ YÆYÆûXÆôXÆíXÆæXÆßXÆØXÆÑXÆÊXÆÃXƼXƵXÆ®XƧXÆ XÆ™XÆ’XÆ‹XÆ„XÆ}XÆvXÆoXÆhXÆaXÆZXÆSXÆLXÆEXÆ>XÆ7XÆ0XÆ)XÆ"XÆXÆXÆ XÆXÆÿWÆøWÆñWÆêWÆãWÆÜWÆÕWÆÎWÆÇWÆÀWƹWƲWÆ«WƤWÆWÆ–WÆWƈWÆWÆzWÆsWÆlWÆeWÆ^WÆWWÆPWÆIWÆBWÆ;WÆ4WÆ-WÆ&WÆWÆWÆWÆ WÆWÆüVÆõVÆîVÆçVÆàVÆÙVÆÒVÆËVÆÄVƽVƶVƯVƨVÆ¡VÆšVÆ“VÆŒVÆ…VÆ~VÆwVÆpVÆiVÆbVÆ[VÆTVÆMVÆFVÆ?VÆ8VÆ1VÆ*VÆ#VÆVÆVÆVÆVÆVÆùUÆòUÆëUÆäUÆÝUÆÖUÆÏUÆÈUÆÁUƺUƳUƬUÆ¥UÆžUÆ—UÆUƉUÆ‚UÆ{UÆtUÆmUÆfUÆ_UÆXUÆQUÆJUÆCUÆQÆ7QÆ0QÆ)QÆ"QÆQÆQÆ QÆQÆÿPÆøPÆñPÆêPÆãPÆÜPÆÕPÆÎPÆÇPÆÀPƹPƲPÆ«PƤPÆPÆ–PÆPƈPÆPÆzPÆsPÆlPÆePÆ^PÆWPÆPPÆIPÆBPÆ;PÆ4PÆ-PÆ&PÆPÆPÆPÆ PÆPÆüOÆõOÆîOÆçOÆàOÆÙOÆÒOÆËOÆÄOƽOƶOƯOƨOÆ¡OÆšOÆ“OÆŒOÆ…OÆ~OÆwOÆpOÆiOÆbOÆ[OÆTOÆMOÆFOÆ?OÆ8OÆ1OÆ*OÆ#OÆOÆOÆOÆOÆOÆùNÆòNÆëNÆäNÆÝNÆÖNÆÏNÆÈNÆÁNƺNƳNƬNÆ¥NÆžNÆ—NÆNƉNÆ‚NÆ{NÆtNÆmNÆfNÆ_NÆXNÆQNÆJNÆCNÆJÆ7JÆ0JÆ)JÆ"JÆJÆJÆ JÆJÆÿIÆøIÆñIÆêIÆãIÆÜIÆÕIÆÎIÆÇIÆÀIƹIƲIÆ«IƤIÆIÆ–IÆIƈIÆIÆzIÆsIÆlIÆeIÆ^IÆWIÆPIÆIIÆBIÆ;IÆ4IÆ-IÆ&IÆIÆIÆIÆ IÆIÆüHÆõHÆîHÆçHÆàHÆÙHÆÒHÆËHÆÄHƽHƶHƯHƨHÆ¡HÆšHÆ“HÆŒHÆ…HÆ~HÆwHÆpHÆiHÆbHÆ[HÆTHÆMHÆFHÆ?HÆ8HÆ1HÆ*HÆ#HÆHÆHÆHÆHÆHÆùGÆòGÆëGÆäGÆÝGÆÖGÆÏGÆÈGÆÁGƺGƳGƬGÆ¥GÆžGÆ—GÆGƉGÆ‚GÆ{GÆtGÆmGÆfGÆ_GÆXGÆQGÆJGÆCGÆCÆ7CÆ0CÆ)CÆ"CÆCÆCÆ CÆCÆÿBÆøBÆñBÆêBÆãBÆÜBÆÕBÆÎBÆÇBÆÀBƹBƲBÆ«BƤBÆBÆ–BÆBƈBÆBÆzBÆsBÆlBÆeBÆ^BÆWBÆPBÆIBÆBBÆ;BÆ4BÆ-BÆ&BÆBÆBÆBÆ BÆBÆüAÆõAÆîAÆçAÆàAÆÙAÆÒAÆËAÆÄAƽAƶAƯAƨAÆ¡AÆšAÆ“AÆŒAÆ…AÆ~AÆwAÆpAÆiAÆbAÆ[AÆTAÆMAÆFAÆ?AÆ8AÆ1AÆ*AÆ#AÆAÆAÆAÆAÆAÆù@Æò@Æë@Æä@ÆÝ@ÆÖ@ÆÏ@ÆÈ@ÆÁ@ƺ@Ƴ@Ƭ@Æ¥@Æž@Æ—@Æ@Ɖ@Æ‚@Æ{@Æt@Æm@Æf@Æ_@ÆX@ÆQ@ÆJ@ÆC@Æ<@Æ5@Æ.@Æ'@Æ @Æ@Æ@Æ @Æ@Æý?Æö?Æï?Æè?Æá?ÆÚ?ÆÓ?ÆÌ?ÆÅ?ƾ?Æ·?ư?Æ©?Æ¢?Æ›?Æ”?Æ?Ɔ?Æ?Æx?Æq?Æj?Æc?Æ\?ÆU?ÆN?ÆG?Æ@?Æ9?Æ2?Æ+?Æ$?Æ?Æ?Æ?Æ?Æ?Æú>Æó>Æì>Æå>ÆÞ>Æ×>ÆÐ>ÆÉ>ÆÂ>Æ»>Æ´>Æ­>Ʀ>ÆŸ>Ƙ>Æ‘>ÆŠ>ƃ>Æ|>Æu>Æn>Æg>Æ`>ÆY>ÆR>ÆK>ÆD>Æ=>Æ6>Æ/>Æ(>Æ!>Æ>Æ>Æ >Æ>Æþ=Æ÷=Æð=Æé=Æâ=ÆÛ=ÆÔ=ÆÍ=ÆÆ=Æ¿=Ƹ=Ʊ=ƪ=Æ£=Æœ=Æ•=ÆŽ=Ƈ=Æ€=Æy=Ær=Æk=Æd=Æ]=ÆV=ÆO=ÆH=ÆA=Æ:=Æ3=Æ,=Æ%=Æ=Æ=Æ=Æ =Æ=Æû<Æô<Æí<Ææ<Æß<ÆØ<ÆÑ<ÆÊ<ÆÃ<Ƽ<Ƶ<Æ®<Ƨ<Æ <Æ™<Æ’<Æ‹<Æ„<Æ}<Æv<Æo<Æh<Æa<ÆZ<ÆS<ÆL<ÆE<Æ><Æ7<Æ0<Æ)<Æ"<Æ<Æ<Æ <Æ<Æÿ;Æø;Æñ;Æê;Æã;ÆÜ;ÆÕ;ÆÎ;ÆÇ;ÆÀ;ƹ;Ʋ;Æ«;Ƥ;Æ;Æ–;Æ;ƈ;Æ;Æz;Æs;Æl;Æe;Æ^;ÆW;ÆP;ÆI;ÆB;Æ;;Æ4;Æ-;Æ&;Æ;Æ;Æ;Æ ;Æ;Æü:Æõ:Æî:Æç:Æà:ÆÙ:ÆÒ:ÆË:ÆÄ:ƽ:ƶ:Ư:ƨ:Æ¡:Æš:Æ“:ÆŒ:Æ…:Æ~:Æw:Æp:Æi:Æb:Æ[:ÆT:ÆM:ÆF:Æ?:Æ8:Æ1:Æ*:Æ#:Æ:Æ:Æ:Æ:Æ:Æù9Æò9Æë9Æä9ÆÝ9ÆÖ9ÆÏ9ÆÈ9ÆÁ9ƺ9Ƴ9Ƭ9Æ¥9Æž9Æ—9Æ9Ɖ9Æ‚9Æ{9Æt9Æm9Æf9Æ_9ÆX9ÆQ9ÆJ9ÆC9Æ<9Æ59Æ.9Æ'9Æ 9Æ9Æ9Æ 9Æ9Æý8Æö8Æï8Æè8Æá8ÆÚ8ÆÓ8ÆÌ8ÆÅ8ƾ8Æ·8ư8Æ©8Æ¢8Æ›8Æ”8Æ8Ɔ8Æ8Æx8Æq8Æj8Æc8Æ\8ÆU8ÆN8ÆG8Æ@8Æ98Æ28Æ+8Æ$8Æ8Æ8Æ8Æ8Æ8Æú7Æó7Æì7Æå7ÆÞ7Æ×7ÆÐ7ÆÉ7ÆÂ7Æ»7Æ´7Æ­7Ʀ7ÆŸ7Ƙ7Æ‘7ÆŠ7ƃ7Æ|7Æu7Æn7Æg7Æ`7ÆY7ÆR7ÆK7ÆD7Æ=7Æ67Æ/7Æ(7Æ!7Æ7Æ7Æ 7Æ7Æþ6Æ÷6Æð6Æé6Æâ6ÆÛ6ÆÔ6ÆÍ6ÆÆ6Æ¿6Ƹ6Ʊ6ƪ6Æ£6Æœ6Æ•6ÆŽ6Ƈ6Æ€6Æy6Ær6Æk6Æd6Æ]6ÆV6ÆO6ÆH6ÆA6Æ:6Æ36Æ,6Æ%6Æ6Æ6Æ6Æ 6Æ6Æû5Æô5Æí5Ææ5Æß5ÆØ5ÆÑ5ÆÊ5ÆÃ5Ƽ5Ƶ5Æ®5Ƨ5Æ 5Æ™5Æ’5Æ‹5Æ„5Æ}5Æv5Æo5Æh5Æa5ÆZ5ÆS5ÆL5ÆE5Æ>5Æ75Æ05Æ)5Æ"5Æ5Æ5Æ 5Æ5Æÿ4Æø4Æñ4Æê4Æã4ÆÜ4ÆÕ4ÆÎ4ÆÇ4ÆÀ4ƹ4Ʋ4Æ«4Ƥ4Æ4Æ–4Æ4ƈ4Æ4Æz4Æs4Æl4Æe4Æ^4ÆW4ÆP4ÆI4ÆB4Æ;4Æ44Æ-4Æ&4Æ4Æ4Æ4Æ 4Æ4Æü3Æõ3Æî3Æç3Æà3ÆÙ3ÆÒ3ÆË3ÆÄ3ƽ3ƶ3Ư3ƨ3Æ¡3Æš3Æ“3ÆŒ3Æ…3Æ~3Æw3Æp3Æi3Æb3Æ[3ÆT3ÆM3ÆF3Æ?3Æ83Æ13Æ*3Æ#3Æ3Æ3Æ3Æ3Æ3Æù2Æò2Æë2Æä2ÆÝ2ÆÖ2ÆÏ2ÆÈ2ÆÁ2ƺ2Ƴ2Ƭ2Æ¥2Æž2Æ—2Æ2Ɖ2Æ‚2Æ{2Æt2Æm2Æf2Æ_2ÆX2ÆQ2ÆJ2ÆC2Æ<2Æ52Æ.2Æ'2Æ 2Æ2Æ2Æ 2Æ2Æý1Æö1Æï1Æè1Æá1ÆÚ1ÆÓ1ÆÌ1ÆÅ1ƾ1Æ·1ư1Æ©1Æ¢1Æ›1Æ”1Æ1Ɔ1Æ1Æx1Æq1Æj1Æc1Æ\1ÆU1ÆN1ÆG1Æ@1Æ91Æ21Æ+1Æ$1Æ1Æ1Æ1Æ1Æ1Æú0Æó0Æì0Æå0ÆÞ0Æ×0ÆÐ0ÆÉ0ÆÂ0Æ»0Æ´0Æ­0Ʀ0ÆŸ0Ƙ0Æ‘0ÆŠ0ƃ0Æ|0Æu0Æn0Æg0Æ`0ÆY0ÆR0ÆK0ÆD0Æ=0Æ60Æ/0Æ(0Æ!0Æ0Æ0Æ 0Æ0Æþ/Æ÷/Æð/Æé/Æâ/ÆÛ/ÆÔ/ÆÍ/ÆÆ/Æ¿/Ƹ/Ʊ/ƪ/Æ£/Æœ/Æ•/ÆŽ/Ƈ/Æ€/Æy/Ær/Æk/Æd/Æ]/ÆV/ÆO/ÆH/ÆA/Æ:/Æ3/Æ,/Æ%/Æ/Æ/Æ/Æ /Æ/Æû.Æô.Æí.Ææ.Æß.ÆØ.ÆÑ.ÆÊ.ÆÃ.Ƽ.Ƶ.Æ®.Ƨ.Æ .Æ™.Æ’.Æ‹.Æ„.Æ}.Æv.Æo.Æh.Æa.ÆZ.ÆS.ÆL.ÆE.Æ>.Æ7.Æ0.Æ).Æ".Æ.Æ.Æ .Æ.Æÿ-Æø-Æñ-Æê-Æã-ÆÜ-ÆÕ-ÆÎ-ÆÇ-ÆÀ-ƹ-Ʋ-Æ«-Ƥ-Æ-Æ–-Æ-ƈ-Æ-Æz-Æs-Æl-Æe-Æ^-ÆW-ÆP-ÆI-ÆB-Æ;-Æ4-Æ--Æ&-Æ-Æ-Æ-Æ -Æ-Æü,Æõ,Æî,Æç,Æà,ÆÙ,ÆÒ,ÆË,ÆÄ,ƽ,ƶ,Ư,ƨ,Æ¡,Æš,Æ“,ÆŒ,Æ…,Æ~,Æw,Æp,Æi,Æb,Æ[,ÆT,ÆM,ÆF,Æ?,Æ8,Æ1,Æ*,Æ#,Æ,Æ,Æ,Æ,Æ,Æù+Æò+Æë+Æä+ÆÝ+ÆÖ+ÆÏ+ÆÈ+ÆÁ+ƺ+Ƴ+Ƭ+Æ¥+Æž+Æ—+Æ+Ɖ+Æ‚+Æ{+Æt+Æm+Æf+Æ_+ÆX+ÆQ+ÆJ+ÆC+Æ<+Æ5+Æ.+Æ'+Æ +Æ+Æ+Æ +Æ+Æý*Æö*Æï*Æè*Æá*ÆÚ*ÆÓ*ÆÌ*ÆÅ*ƾ*Æ·*ư*Æ©*Æ¢*Æ›*Æ”*Æ*Ɔ*Æ*Æx*Æq*Æj*Æc*Æ\*ÆU*ÆN*ÆG*Æ@*Æ9*Æ2*Æ+*Æ$*Æ*Æ*Æ*Æ*Æ*Æú)Æó)Æì)Æå)ÆÞ)Æ×)ÆÐ)ÆÉ)ÆÂ)Æ»)Æ´)Æ­)Ʀ)ÆŸ)Ƙ)Æ‘)ÆŠ)ƃ)Æ|)Æu)Æn)Æg)Æ`)ÆY)ÆR)ÆK)ÆD)Æ=)Æ6)Æ/)Æ()Æ!)Æ)Æ)Æ )Æ)Æþ(Æ÷(Æð(Æé(Æâ(ÆÛ(ÆÔ(ÆÍ(ÆÆ(Æ¿(Ƹ(Ʊ(ƪ(Æ£(Æœ(Æ•(ÆŽ(Ƈ(Æ€(Æy(Ær(Æk(Æd(Æ](ÆV(ÆO(ÆH(ÆA(Æ:(Æ3(Æ,(Æ%(Æ(Æ(Æ(Æ (Æ(Æû'Æô'Æí'Ææ'Æß'ÆØ'ÆÑ'ÆÊ'ÆÃ'Ƽ'Ƶ'Æ®'Ƨ'Æ 'Æ™'Æ’'Æ‹'Æ„'Æ}'Æv'Æo'Æh'Æa'ÆZ'ÆS'ÆL'ÆE'Æ>'Æ7'Æ0'Æ)'Æ"'Æ'Æ'Æ 'Æ'Æÿ&Æø&Æñ&Æê&Æã&ÆÜ&ÆÕ&ÆÎ&ÆÇ&ÆÀ&ƹ&Ʋ&Æ«&Ƥ&Æ&Æ–&Æ&ƈ&Æ&Æz&Æs&Æl&Æe&Æ^&ÆW&ÆP&ÆI&ÆB&Æ;&Æ4&Æ-&Æ&&Æ&Æ&Æ&Æ &Æ&Æü%Æõ%Æî%Æç%Æà%ÆÙ%ÆÒ%ÆË%ÆÄ%ƽ%ƶ%Ư%ƨ%Æ¡%Æš%Æ“%ÆŒ%Æ…%Æ~%Æw%Æp%Æi%Æb%Æ[%ÆT%ÆM%ÆF%Æ?%Æ8%Æ1%Æ*%Æ#%Æ%Æ%Æ%Æ%Æ%Æù$Æò$Æë$Æä$ÆÝ$ÆÖ$ÆÏ$ÆÈ$ÆÁ$ƺ$Ƴ$Ƭ$Æ¥$Æž$Æ—$Æ$Ɖ$Æ‚$Æ{$Æt$Æm$Æf$Æ_$ÆX$ÆQ$ÆJ$ÆC$Æ<$Æ5$Æ.$Æ'$Æ $Æ$Æ$Æ $Æ$Æý#Æö#Æï#Æè#Æá#ÆÚ#ÆÓ#ÆÌ#ÆÅ#ƾ#Æ·#ư#Æ©#Æ¢#Æ›#Æ”#Æ#Ɔ#Æ#Æx#Æq#Æj#Æc#Æ\#ÆU#ÆN#ÆG#Æ@#Æ9#Æ2#Æ+#Æ$#Æ#Æ#Æ#Æ#Æ#Æú"Æó"Æì"Æå"ÆÞ"Æ×"ÆÐ"ÆÉ"ÆÂ"Æ»"Æ´"Æ­"Ʀ"ÆŸ"Ƙ"Æ‘"ÆŠ"ƃ"Æ|"Æu"Æn"Æg"Æ`"ÆY"ÆR"ÆK"ÆD"Æ="Æ6"Æ/"Æ("Æ!"Æ"Æ"Æ "Æ"Æþ!Æ÷!Æð!Æé!Æâ!ÆÛ!ÆÔ!ÆÍ!ÆÆ!Æ¿!Ƹ!Ʊ!ƪ!Æ£!Æœ!Æ•!ÆŽ!Ƈ!Æ€!Æy!Ær!Æk!Æd!Æ]!ÆV!ÆO!ÆH!ÆA!Æ:!Æ3!Æ,!Æ%!Æ!Æ!Æ!Æ !Æ!Æû Æô Æí Ææ Æß ÆØ ÆÑ ÆÊ Æà Ƽ Ƶ Æ® Ƨ Æ  Æ™ Æ’ Æ‹ Æ„ Æ} Æv Æo Æh Æa ÆZ ÆS ÆL ÆE Æ> Æ7 Æ0 Æ) Æ" Æ Æ Æ Æ ÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÆóÆìÆåÆÞÆ×ÆÐÆÉÆÂƻƴƭƦƟƘƑƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÆôÆíÆæÆßÆØÆÑÆÊÆÃƼƵƮƧƠƙƒƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÆóÆìÆåÆÞÆ×ÆÐÆÉÆÂƻƴƭƦƟƘƑƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÆôÆíÆæÆßÆØÆÑÆÊÆÃƼƵƮƧƠƙƒƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆú Æó Æì Æå ÆÞ Æ× ÆÐ ÆÉ Æ Æ» Æ´ Æ­ Ʀ ÆŸ Ƙ Æ‘ ÆŠ ƃ Æ| Æu Æn Æg Æ` ÆY ÆR ÆK ÆD Æ= Æ6 Æ/ Æ( Æ! Æ Æ Æ Æ Æþ Æ÷ Æð Æé Æâ ÆÛ ÆÔ ÆÍ ÆÆ Æ¿ Ƹ Ʊ ƪ Æ£ Æœ Æ• ÆŽ Ƈ Æ€ Æy Ær Æk Æd Æ] ÆV ÆO ÆH ÆA Æ: Æ3 Æ, Æ% Æ Æ Æ Æ Æ Æû Æô Æí Ææ Æß ÆØ ÆÑ ÆÊ Æà Ƽ Ƶ Æ® Ƨ Æ  Æ™ Æ’ Æ‹ Æ„ Æ} Æv Æo Æh Æa ÆZ ÆS ÆL ÆE Æ> Æ7 Æ0 Æ) Æ" Æ Æ Æ Æ Æÿ Æø Æñ Æê Æã ÆÜ ÆÕ ÆÎ ÆÇ ÆÀ ƹ Ʋ Æ« Ƥ Æ Æ– Æ Æˆ Æ Æz Æs Æl Æe Æ^ ÆW ÆP ÆI ÆB Æ; Æ4 Æ- Æ& Æ Æ Æ Æ Æ Æü Æõ Æî Æç Æà ÆÙ ÆÒ ÆË ÆÄ ƽ ƶ Ư ƨ Æ¡ Æš Æ“ ÆŒ Æ… Æ~ Æw Æp Æi Æb Æ[ ÆT ÆM ÆF Æ? Æ8 Æ1 Æ* Æ# Æ Æ Æ Æ Æ ÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÆóÆìÆåÆÞÆ×ÆÐÆÉÆÂƻƴƭƦƟƘƑƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÆôÆíÆæÆßÆØÆÑÆÊÆÃƼƵƮƧƠƙƒƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÿÅóÿÅìÿÅåÿÅÞÿÅ×ÿÅÐÿÅÉÿÅÂÿÅ»ÿÅ´ÿÅ­ÿŦÿÅŸÿŘÿÅ‘ÿÅŠÿŃÿÅ|ÿÅuÿÅnÿÅgÿÅ`ÿÅYÿÅRÿÅKÿÅDÿÅ=ÿÅ6ÿÅ/ÿÅ(ÿÅ!ÿÅÿÅÿÅ ÿÅÿÅþþÅ÷þÅðþÅéþÅâþÅÛþÅÔþÅÍþÅÆþÅ¿þŸþűþŪþÅ£þÅœþÅ•þÅŽþŇþÅ€þÅyþÅrþÅkþÅdþÅ]þÅVþÅOþÅHþÅAþÅ:þÅ3þÅ,þÅ%þÅþÅþÅþÅ þÅþÅûýÅôýÅíýÅæýÅßýÅØýÅÑýÅÊýÅÃýżýŵýÅ®ýŧýÅ ýÅ™ýÅ’ýÅ‹ýÅ„ýÅ}ýÅvýÅoýÅhýÅaýÅZýÅSýÅLýÅEýÅ>ýÅ7ýÅ0ýÅ)ýÅ"ýÅýÅýÅ ýÅýÅÿüÅøüÅñüÅêüÅãüÅÜüÅÕüÅÎüÅÇüÅÀüŹüŲüÅ«üŤüÅüÅ–üÅüňüÅüÅzüÅsüÅlüÅeüÅ^üÅWüÅPüÅIüÅBüÅ;üÅ4üÅ-üÅ&üÅüÅüÅüÅ üÅüÅüûÅõûÅîûÅçûÅàûÅÙûÅÒûÅËûÅÄûŽûŶûůûŨûÅ¡ûÅšûÅ“ûÅŒûÅ…ûÅ~ûÅwûÅpûÅiûÅbûÅ[ûÅTûÅMûÅFûÅ?ûÅ8ûÅ1ûÅ*ûÅ#ûÅûÅûÅûÅûÅûÅùúÅòúÅëúÅäúÅÝúÅÖúÅÏúÅÈúÅÁúźúųúŬúÅ¥úÅžúÅ—úÅúʼnúÅ‚úÅ{úÅtúÅmúÅfúÅ_úÅXúÅQúÅJúÅCúÅ<úÅ5úÅ.úÅ'úÅ úÅúÅúÅ úÅúÅýùÅöùÅïùÅèùÅáùÅÚùÅÓùÅÌùÅÅùžùÅ·ùŰùÅ©ùÅ¢ùÅ›ùÅ”ùÅùņùÅùÅxùÅqùÅjùÅcùÅ\ùÅUùÅNùÅGùÅ@ùÅ9ùÅ2ùÅ+ùÅ$ùÅùÅùÅùÅùÅùÅúøÅóøÅìøÅåøÅÞøÅ×øÅÐøÅÉøÅÂøÅ»øÅ´øÅ­øÅ¦øÅŸøÅ˜øÅ‘øÅŠøÅƒøÅ|øÅuøÅnøÅgøÅ`øÅYøÅRøÅKøÅDøÅ=øÅ6øÅ/øÅ(øÅ!øÅøÅøÅ øÅøÅþ÷Å÷÷Åð÷Åé÷Åâ÷ÅÛ÷ÅÔ÷ÅÍ÷ÅÆ÷Å¿÷Ÿ÷ű÷Ū÷Å£÷Åœ÷Å•÷ÅŽ÷Ň÷Å€÷Åy÷År÷Åk÷Åd÷Å]÷ÅV÷ÅO÷ÅH÷ÅA÷Å:÷Å3÷Å,÷Å%÷Å÷Å÷Å÷Å ÷Å÷ÅûöÅôöÅíöÅæöÅßöÅØöÅÑöÅÊöÅÃöżöŵöÅ®öŧöÅ öÅ™öÅ’öÅ‹öÅ„öÅ}öÅvöÅoöÅhöÅaöÅZöÅSöÅLöÅEöÅ>öÅ7öÅ0öÅ)öÅ"öÅöÅöÅ öÅöÅÿõÅøõÅñõÅêõÅãõÅÜõÅÕõÅÎõÅÇõÅÀõŹõŲõÅ«õŤõÅõÅ–õÅõňõÅõÅzõÅsõÅlõÅeõÅ^õÅWõÅPõÅIõÅBõÅ;õÅ4õÅ-õÅ&õÅõÅõÅõÅ õÅõÅüôÅõôÅîôÅçôÅàôÅÙôÅÒôÅËôÅÄôŽôŶôůôŨôÅ¡ôÅšôÅ“ôÅŒôÅ…ôÅ~ôÅwôÅpôÅiôÅbôÅ[ôÅTôÅMôÅFôÅ?ôÅ8ôÅ1ôÅ*ôÅ#ôÅôÅôÅôÅôÅôÅùóÅòóÅëóÅäóÅÝóÅÖóÅÏóÅÈóÅÁóźóųóŬóÅ¥óÅžóÅ—óÅóʼnóÅ‚óÅ{óÅtóÅmóÅfóÅ_óÅXóÅQóÅJóÅCóÅ<óÅ5óÅ.óÅ'óÅ óÅóÅóÅ óÅóÅýòÅöòÅïòÅèòÅáòÅÚòÅÓòÅÌòÅÅòžòÅ·òŰòÅ©òÅ¢òÅ›òÅ”òÅòņòÅòÅxòÅqòÅjòÅcòÅ\òÅUòÅNòÅGòÅ@òÅ9òÅ2òÅ+òÅ$òÅòÅòÅòÅòÅòÅúñÅóñÅìñÅåñÅÞñÅ×ñÅÐñÅÉñÅÂñÅ»ñÅ´ñÅ­ñŦñÅŸñŘñÅ‘ñÅŠñŃñÅ|ñÅuñÅnñÅgñÅ`ñÅYñÅRñÅKñÅDñÅ=ñÅ6ñÅ/ñÅ(ñÅ!ñÅñÅñÅ ñÅñÅþðÅ÷ðÅððÅéðÅâðÅÛðÅÔðÅÍðÅÆðÅ¿ðŸðűðŪðÅ£ðÅœðÅ•ðÅŽðŇðÅ€ðÅyðÅrðÅkðÅdðÅ]ðÅVðÅOðÅHðÅAðÅ:ðÅ3ðÅ,ðÅ%ðÅðÅðÅðÅ ðÅðÅûïÅôïÅíïÅæïÅßïÅØïÅÑïÅÊïÅÃïżïŵïÅ®ïŧïÅ ïÅ™ïÅ’ïÅ‹ïÅ„ïÅ}ïÅvïÅoïÅhïÅaïÅZïÅSïÅLïÅEïÅ>ïÅ7ïÅ0ïÅ)ïÅ"ïÅïÅïÅ ïÅïÅÿîÅøîÅñîÅêîÅãîÅÜîÅÕîÅÎîÅÇîÅÀîŹîŲîÅ«îŤîÅîÅ–îÅîňîÅîÅzîÅsîÅlîÅeîÅ^îÅWîÅPîÅIîÅBîÅ;îÅ4îÅ-îÅ&îÅîÅîÅîÅ îÅîÅüíÅõíÅîíÅçíÅàíÅÙíÅÒíÅËíÅÄíŽíŶíůíŨíÅ¡íÅšíÅ“íÅŒíÅ…íÅ~íÅwíÅpíÅiíÅbíÅ[íÅTíÅMíÅFíÅ?íÅ8íÅ1íÅ*íÅ#íÅíÅíÅíÅíÅíÅùìÅòìÅëìÅäìÅÝìÅÖìÅÏìÅÈìÅÁìźìųìŬìÅ¥ìÅžìÅ—ìÅìʼnìÅ‚ìÅ{ìÅtìÅmìÅfìÅ_ìÅXìÅQìÅJìÅCìÅ<ìÅ5ìÅ.ìÅ'ìÅ ìÅìÅìÅ ìÅìÅýëÅöëÅïëÅèëÅáëÅÚëÅÓëÅÌëÅÅëžëÅ·ëŰëÅ©ëÅ¢ëÅ›ëÅ”ëÅëņëÅëÅxëÅqëÅjëÅcëÅ\ëÅUëÅNëÅGëÅ@ëÅ9ëÅ2ëÅ+ëÅ$ëÅëÅëÅëÅëÅëÅúêÅóêÅìêÅåêÅÞêÅ×êÅÐêÅÉêÅÂêÅ»êÅ´êÅ­êŦêÅŸêŘêÅ‘êÅŠêŃêÅ|êÅuêÅnêÅgêÅ`êÅYêÅRêÅKêÅDêÅ=êÅ6êÅ/êÅ(êÅ!êÅêÅêÅ êÅêÅþéÅ÷éÅðéÅééÅâéÅÛéÅÔéÅÍéÅÆéÅ¿éŸéűéŪéÅ£éÅœéÅ•éÅŽéŇéÅ€éÅyéÅréÅkéÅdéÅ]éÅVéÅOéÅHéÅAéÅ:éÅ3éÅ,éÅ%éÅéÅéÅéÅ éÅéÅûèÅôèÅíèÅæèÅßèÅØèÅÑèÅÊèÅÃèżèŵèÅ®èŧèÅ èÅ™èÅ’èÅ‹èÅ„èÅ}èÅvèÅoèÅhèÅaèÅZèÅSèÅLèÅEèÅ>èÅ7èÅ0èÅ)èÅ"èÅèÅèÅ èÅèÅÿçÅøçÅñçÅêçÅãçÅÜçÅÕçÅÎçÅÇçÅÀçŹçŲçÅ«çŤçÅçÅ–çÅçňçÅçÅzçÅsçÅlçÅeçÅ^çÅWçÅPçÅIçÅBçÅ;çÅ4çÅ-çÅ&çÅçÅçÅçÅ çÅçÅüæÅõæÅîæÅçæÅàæÅÙæÅÒæÅËæÅĿ޿ŶæÅ¯æÅ¨æÅ¡æÅšæÅ“æÅŒæÅ…æÅ~æÅwæÅpæÅiæÅbæÅ[æÅTæÅMæÅFæÅ?æÅ8æÅ1æÅ*æÅ#æÅæÅæÅæÅæÅæÅùåÅòåÅëåÅäåÅÝåÅÖåÅÏåÅÈåÅÁåźåųåŬåÅ¥åÅžåÅ—åÅåʼnåÅ‚åÅ{åÅtåÅmåÅfåÅ_åÅXåÅQåÅJåÅCåÅ<åÅ5åÅ.åÅ'åÅ åÅåÅåÅ åÅåÅýäÅöäÅïäÅèäÅáäÅÚäÅÓäÅÌäÅÅäžäÅ·äŰäÅ©äÅ¢äÅ›äÅ”äÅäņäÅäÅxäÅqäÅjäÅcäÅ\äÅUäÅNäÅGäÅ@äÅ9äÅ2äÅ+äÅ$äÅäÅäÅäÅäÅäÅúãÅóãÅìãÅåãÅÞãÅ×ãÅÐãÅÉãÅÂãÅ»ãÅ´ãÅ­ãŦãÅŸãŘãÅ‘ãÅŠãŃãÅ|ãÅuãÅnãÅgãÅ`ãÅYãÅRãÅKãÅDãÅ=ãÅ6ãÅ/ãÅ(ãÅ!ãÅãÅãÅ ãÅãÅþâÅ÷âÅðâÅéâÅââÅÛâÅÔâÅÍâÅÆâÅ¿âŸâűâŪâÅ£âÅœâÅ•âÅŽâŇâÅ€âÅyâÅrâÅkâÅdâÅ]âÅVâÅOâÅHâÅAâÅ:âÅ3âÅ,âÅ%âÅâÅâÅâÅ âÅâÅûáÅôáÅíáÅæáÅßáÅØáÅÑáÅÊáÅÃáżáŵáÅ®áŧáÅ áÅ™áÅ’áÅ‹áÅ„áÅ}áÅváÅoáÅháÅaáÅZáÅSáÅLáÅEáÅ>áÅ7áÅ0áÅ)áÅ"áÅáÅáÅ áÅáÅÿàÅøàÅñàÅêàÅãàÅÜàÅÕàÅÎàÅÇàÅÀàŹàŲàÅ«àŤàÅàÅ–àÅàňàÅàÅzàÅsàÅlàÅeàÅ^àÅWàÅPàÅIàÅBàÅ;àÅ4àÅ-àÅ&àÅàÅàÅàÅ àÅàÅüßÅõßÅîßÅçßÅàßÅÙßÅÒßÅËßÅÄߎßŶßůßŨßÅ¡ßÅšßÅ“ßÅŒßÅ…ßÅ~ßÅwßÅpßÅißÅbßÅ[ßÅTßÅMßÅFßÅ?ßÅ8ßÅ1ßÅ*ßÅ#ßÅßÅßÅßÅßÅßÅùÞÅòÞÅëÞÅäÞÅÝÞÅÖÞÅÏÞÅÈÞÅÁÞźÞųÞŬÞÅ¥ÞÅžÞÅ—ÞÅÞʼnÞÅ‚ÞÅ{ÞÅtÞÅmÞÅfÞÅ_ÞÅXÞÅQÞÅJÞÅCÞÅ<ÞÅ5ÞÅ.ÞÅ'ÞÅ ÞÅÞÅÞÅ ÞÅÞÅýÝÅöÝÅïÝÅèÝÅáÝÅÚÝÅÓÝÅÌÝÅÅÝžÝÅ·ÝŰÝÅ©ÝÅ¢ÝÅ›ÝÅ”ÝÅÝņÝÅÝÅxÝÅqÝÅjÝÅcÝÅ\ÝÅUÝÅNÝÅGÝÅ@ÝÅ9ÝÅ2ÝÅ+ÝÅ$ÝÅÝÅÝÅÝÅÝÅÝÅúÜÅóÜÅìÜÅåÜÅÞÜÅ×ÜÅÐÜÅÉÜÅÂÜÅ»ÜÅ´ÜÅ­ÜŦÜÅŸÜŘÜÅ‘ÜÅŠÜŃÜÅ|ÜÅuÜÅnÜÅgÜÅ`ÜÅYÜÅRÜÅKÜÅDÜÅ=ÜÅ6ÜÅ/ÜÅ(ÜÅ!ÜÅÜÅÜÅ ÜÅÜÅþÛÅ÷ÛÅðÛÅéÛÅâÛÅÛÛÅÔÛÅÍÛÅÆÛſ۟ÛűÛŪÛÅ£ÛÅœÛÅ•ÛÅŽÛŇÛÅ€ÛÅyÛÅrÛÅkÛÅdÛÅ]ÛÅVÛÅOÛÅHÛÅAÛÅ:ÛÅ3ÛÅ,ÛÅ%ÛÅÛÅÛÅÛÅ ÛÅÛÅûÚÅôÚÅíÚÅæÚÅßÚÅØÚÅÑÚÅÊÚÅÃÚżÚŵÚÅ®ÚŧÚÅ ÚÅ™ÚÅ’ÚÅ‹ÚÅ„ÚÅ}ÚÅvÚÅoÚÅhÚÅaÚÅZÚÅSÚÅLÚÅEÚÅ>ÚÅ7ÚÅ0ÚÅ)ÚÅ"ÚÅÚÅÚÅ ÚÅÚÅÿÙÅøÙÅñÙÅêÙÅãÙÅÜÙÅÕÙÅÎÙÅÇÙÅÀÙŹÙŲÙÅ«ÙŤÙÅÙÅ–ÙÅÙňÙÅÙÅzÙÅsÙÅlÙÅeÙÅ^ÙÅWÙÅPÙÅIÙÅBÙÅ;ÙÅ4ÙÅ-ÙÅ&ÙÅÙÅÙÅÙÅ ÙÅÙÅüØÅõØÅîØÅçØÅàØÅÙØÅÒØÅËØÅĨިŶØÅ¯ØÅ¨ØÅ¡ØÅšØÅ“ØÅŒØÅ…ØÅ~ØÅwØÅpØÅiØÅbØÅ[ØÅTØÅMØÅFØÅ?ØÅ8ØÅ1ØÅ*ØÅ#ØÅØÅØÅØÅØÅØÅù×Åò×Åë×Åä×ÅÝ×ÅÖ×ÅÏ×ÅÈ×ÅÁן×ų×Ŭ×Å¥×Åž×Å—×Å×ʼn×Å‚×Å{×Åt×Åm×Åf×Å_×ÅX×ÅQ×ÅJ×ÅC×Å<×Å5×Å.×Å'×Å ×Å×Å×Å ×Å×ÅýÖÅöÖÅïÖÅèÖÅáÖÅÚÖÅÓÖÅÌÖÅÅÖžÖÅ·ÖŰÖÅ©ÖÅ¢ÖÅ›ÖÅ”ÖÅÖņÖÅÖÅxÖÅqÖÅjÖÅcÖÅ\ÖÅUÖÅNÖÅGÖÅ@ÖÅ9ÖÅ2ÖÅ+ÖÅ$ÖÅÖÅÖÅÖÅÖÅÖÅúÕÅóÕÅìÕÅåÕÅÞÕÅ×ÕÅÐÕÅÉÕÅÂÕÅ»ÕÅ´ÕÅ­ÕŦÕÅŸÕŘÕÅ‘ÕÅŠÕŃÕÅ|ÕÅuÕÅnÕÅgÕÅ`ÕÅYÕÅRÕÅKÕÅDÕÅ=ÕÅ6ÕÅ/ÕÅ(ÕÅ!ÕÅÕÅÕÅ ÕÅÕÅþÔÅ÷ÔÅðÔÅéÔÅâÔÅÛÔÅÔÔÅÍÔÅÆÔſԟÔűÔŪÔÅ£ÔÅœÔÅ•ÔÅŽÔŇÔÅ€ÔÅyÔÅrÔÅkÔÅdÔÅ]ÔÅVÔÅOÔÅHÔÅAÔÅ:ÔÅ3ÔÅ,ÔÅ%ÔÅÔÅÔÅÔÅ ÔÅÔÅûÓÅôÓÅíÓÅæÓÅßÓÅØÓÅÑÓÅÊÓÅÃÓżÓŵÓÅ®ÓŧÓÅ ÓÅ™ÓÅ’ÓÅ‹ÓÅ„ÓÅ}ÓÅvÓÅoÓÅhÓÅaÓÅZÓÅSÓÅLÓÅEÓÅ>ÓÅ7ÓÅ0ÓÅ)ÓÅ"ÓÅÓÅÓÅ ÓÅÓÅÿÒÅøÒÅñÒÅêÒÅãÒÅÜÒÅÕÒÅÎÒÅÇÒÅÀÒŹÒŲÒÅ«ÒŤÒÅÒÅ–ÒÅÒňÒÅÒÅzÒÅsÒÅlÒÅeÒÅ^ÒÅWÒÅPÒÅIÒÅBÒÅ;ÒÅ4ÒÅ-ÒÅ&ÒÅÒÅÒÅÒÅ ÒÅÒÅüÑÅõÑÅîÑÅçÑÅàÑÅÙÑÅÒÑÅËÑÅÄÑŽÑŶÑůÑŨÑÅ¡ÑÅšÑÅ“ÑÅŒÑÅ…ÑÅ~ÑÅwÑÅpÑÅiÑÅbÑÅ[ÑÅTÑÅMÑÅFÑÅ?ÑÅ8ÑÅ1ÑÅ*ÑÅ#ÑÅÑÅÑÅÑÅÑÅÑÅùÐÅòÐÅëÐÅäÐÅÝÐÅÖÐÅÏÐÅÈÐÅÁÐźÐųÐŬÐÅ¥ÐÅžÐÅ—ÐÅÐʼnÐÅ‚ÐÅ{ÐÅtÐÅmÐÅfÐÅ_ÐÅXÐÅQÐÅJÐÅCÐÅ<ÐÅ5ÐÅ.ÐÅ'ÐÅ ÐÅÐÅÐÅ ÐÅÐÅýÏÅöÏÅïÏÅèÏÅáÏÅÚÏÅÓÏÅÌÏÅÅÏžÏÅ·ÏŰÏÅ©ÏÅ¢ÏÅ›ÏÅ”ÏÅÏņÏÅÏÅxÏÅqÏÅjÏÅcÏÅ\ÏÅUÏÅNÏÅGÏÅ@ÏÅ9ÏÅ2ÏÅ+ÏÅ$ÏÅÏÅÏÅÏÅÏÅÏÅúÎÅóÎÅìÎÅåÎÅÞÎÅ×ÎÅÐÎÅÉÎÅÂÎÅ»ÎÅ´ÎÅ­ÎŦÎÅŸÎŘÎÅ‘ÎÅŠÎŃÎÅ|ÎÅuÎÅnÎÅgÎÅ`ÎÅYÎÅRÎÅKÎÅDÎÅ=ÎÅ6ÎÅ/ÎÅ(ÎÅ!ÎÅÎÅÎÅ ÎÅÎÅþÍÅ÷ÍÅðÍÅéÍÅâÍÅÛÍÅÔÍÅÍÍÅÆÍſ͟ÍűÍŪÍÅ£ÍÅœÍÅ•ÍÅŽÍŇÍÅ€ÍÅyÍÅrÍÅkÍÅdÍÅ]ÍÅVÍÅOÍÅHÍÅAÍÅ:ÍÅ3ÍÅ,ÍÅ%ÍÅÍÅÍÅÍÅ ÍÅÍÅûÌÅôÌÅíÌÅæÌÅßÌÅØÌÅÑÌÅÊÌÅÃÌżÌŵÌÅ®ÌŧÌÅ ÌÅ™ÌÅ’ÌÅ‹ÌÅ„ÌÅ}ÌÅvÌÅoÌÅhÌÅaÌÅZÌÅSÌÅLÌÅEÌÅ>ÌÅ7ÌÅ0ÌÅ)ÌÅ"ÌÅÌÅÌÅ ÌÅÌÅÿËÅøËÅñËÅêËÅãËÅÜËÅÕËÅÎËÅÇËÅÀËŹËŲËÅ«ËŤËÅËÅ–ËÅËňËÅËÅzËÅsËÅlËÅeËÅ^ËÅWËÅPËÅIËÅBËÅ;ËÅ4ËÅ-ËÅ&ËÅËÅËÅËÅ ËÅËÅüÊÅõÊÅîÊÅçÊÅàÊÅÙÊÅÒÊÅËÊÅÄÊŽÊŶÊůÊŨÊÅ¡ÊÅšÊÅ“ÊÅŒÊÅ…ÊÅ~ÊÅwÊÅpÊÅiÊÅbÊÅ[ÊÅTÊÅMÊÅFÊÅ?ÊÅ8ÊÅ1ÊÅ*ÊÅ#ÊÅÊÅÊÅÊÅÊÅÊÅùÉÅòÉÅëÉÅäÉÅÝÉÅÖÉÅÏÉÅÈÉÅÁÉźÉųÉŬÉÅ¥ÉÅžÉÅ—ÉÅÉʼnÉÅ‚ÉÅ{ÉÅtÉÅmÉÅfÉÅ_ÉÅXÉÅQÉÅJÉÅCÉÅ<ÉÅ5ÉÅ.ÉÅ'ÉÅ ÉÅÉÅÉÅ ÉÅÉÅýÈÅöÈÅïÈÅèÈÅáÈÅÚÈÅÓÈÅÌÈÅÅÈžÈÅ·ÈŰÈÅ©ÈÅ¢ÈÅ›ÈÅ”ÈÅÈņÈÅÈÅxÈÅqÈÅjÈÅcÈÅ\ÈÅUÈÅNÈÅGÈÅ@ÈÅ9ÈÅ2ÈÅ+ÈÅ$ÈÅÈÅÈÅÈÅÈÅÈÅúÇÅóÇÅìÇÅåÇÅÞÇÅ×ÇÅÐÇÅÉÇÅÂÇÅ»ÇÅ´ÇÅ­ÇŦÇÅŸÇŘÇÅ‘ÇÅŠÇŃÇÅ|ÇÅuÇÅnÇÅgÇÅ`ÇÅYÇÅRÇÅKÇÅDÇÅ=ÇÅ6ÇÅ/ÇÅ(ÇÅ!ÇÅÇÅÇÅ ÇÅÇÅþÆÅ÷ÆÅðÆÅéÆÅâÆÅÛÆÅÔÆÅÍÆÅÆÆÅ¿ÆÅ¸ÆÅ±ÆÅªÆÅ£ÆÅœÆÅ•ÆÅޯŇÆÅ€ÆÅyÆÅrÆÅkÆÅdÆÅ]ÆÅVÆÅOÆÅHÆÅAÆÅ:ÆÅ3ÆÅ,ÆÅ%ÆÅÆÅÆÅÆÅ ÆÅÆÅûÅÅôÅÅíÅÅæÅÅßÅÅØÅÅÑÅÅÊÅÅÃÅżÅŵÅÅ®ÅŧÅÅ ÅÅ™ÅÅ’ÅÅ‹ÅÅ„ÅÅ}ÅÅvÅÅoÅÅhÅÅaÅÅZÅÅSÅÅLÅÅEÅÅ>ÅÅ7ÅÅ0ÅÅ)ÅÅ"ÅÅÅÅÅÅ ÅÅÅÅÿÄÅøÄÅñÄÅêÄÅãÄÅÜÄÅÕÄÅÎÄÅÇÄÅÀÄŹÄŲÄÅ«ÄŤÄÅÄÅ–ÄÅÄňÄÅÄÅzÄÅsÄÅlÄÅeÄÅ^ÄÅWÄÅPÄÅIÄÅBÄÅ;ÄÅ4ÄÅ-ÄÅ&ÄÅÄÅÄÅÄÅ ÄÅÄÅüÃÅõÃÅîÃÅçÃÅàÃÅÙÃÅÒÃÅËÃÅÄÃŽÃŶÃůÃŨÃÅ¡ÃÅšÃÅ“ÃÅŒÃÅ…ÃÅ~ÃÅwÃÅpÃÅiÃÅbÃÅ[ÃÅTÃÅMÃÅFÃÅ?ÃÅ8ÃÅ1ÃÅ*ÃÅ#ÃÅÃÅÃÅÃÅÃÅÃÅùÂÅòÂÅëÂÅäÂÅÝÂÅÖÂÅÏÂÅÈÂÅÁÂźÂųÂŬÂÅ¥ÂÅžÂÅ—ÂÅÂʼnÂÅ‚ÂÅ{ÂÅtÂÅmÂÅfÂÅ_ÂÅXÂÅQÂÅJÂÅCÂÅ<ÂÅ5ÂÅ.ÂÅ'ÂÅ ÂÅÂÅÂÅ ÂÅÂÅýÁÅöÁÅïÁÅèÁÅáÁÅÚÁÅÓÁÅÌÁÅÅÁžÁÅ·ÁŰÁÅ©ÁÅ¢ÁÅ›ÁÅ”ÁÅÁņÁÅÁÅxÁÅqÁÅjÁÅcÁÅ\ÁÅUÁÅNÁÅGÁÅ@ÁÅ9ÁÅ2ÁÅ+ÁÅ$ÁÅÁÅÁÅÁÅÁÅÁÅúÀÅóÀÅìÀÅåÀÅÞÀÅ×ÀÅÐÀÅÉÀÅÂÀÅ»ÀÅ´ÀÅ­ÀŦÀÅŸÀŘÀÅ‘ÀÅŠÀŃÀÅ|ÀÅuÀÅnÀÅgÀÅ`ÀÅYÀÅRÀÅKÀÅDÀÅ=ÀÅ6ÀÅ/ÀÅ(ÀÅ!ÀÅÀÅÀÅ ÀÅÀÅþ¿Å÷¿Åð¿Åé¿Åâ¿ÅÛ¿ÅÔ¿ÅÍ¿ÅÆ¿Å¿¿Å¸¿Å±¿Åª¿Å£¿Åœ¿Å•¿ÅŽ¿Å‡¿Å€¿Åy¿År¿Åk¿Åd¿Å]¿ÅV¿ÅO¿ÅH¿ÅA¿Å:¿Å3¿Å,¿Å%¿Å¿Å¿Å¿Å ¿Å¿Åû¾Åô¾Åí¾Åæ¾Åß¾ÅؾÅѾÅʾÅþż¾Åµ¾Å®¾Å§¾Å ¾Å™¾Å’¾Å‹¾Å„¾Å}¾Åv¾Åo¾Åh¾Åa¾ÅZ¾ÅS¾ÅL¾ÅE¾Å>¾Å7¾Å0¾Å)¾Å"¾Å¾Å¾Å ¾Å¾Åÿ½Åø½Åñ½Åê½Åã½ÅܽÅÕ½ÅνÅǽÅÀ½Å¹½Å²½Å«½Å¤½Å½Å–½Å½Åˆ½Å½Åz½Ås½Ål½Åe½Å^½ÅW½ÅP½ÅI½ÅB½Å;½Å4½Å-½Å&½Å½Å½Å½Å ½Å½Åü¼Åõ¼Åî¼Åç¼Åà¼ÅÙ¼ÅÒ¼Å˼ÅļŽ¼Å¶¼Å¯¼Å¨¼Å¡¼Åš¼Å“¼ÅŒ¼Å…¼Å~¼Åw¼Åp¼Åi¼Åb¼Å[¼ÅT¼ÅM¼ÅF¼Å?¼Å8¼Å1¼Å*¼Å#¼Å¼Å¼Å¼Å¼Å¼Åù»Åò»Åë»Åä»ÅÝ»ÅÖ»ÅÏ»ÅÈ»ÅÁ»Åº»Å³»Å¬»Å¥»Åž»Å—»Å»Å‰»Å‚»Å{»Åt»Åm»Åf»Å_»ÅX»ÅQ»ÅJ»ÅC»Å<»Å5»Å.»Å'»Å »Å»Å»Å »Å»ÅýºÅöºÅïºÅèºÅáºÅÚºÅÓºÅ̺ÅźÅ¾ºÅ·ºÅ°ºÅ©ºÅ¢ºÅ›ºÅ”ºÅºÅ†ºÅºÅxºÅqºÅjºÅcºÅ\ºÅUºÅNºÅGºÅ@ºÅ9ºÅ2ºÅ+ºÅ$ºÅºÅºÅºÅºÅºÅú¹Åó¹Åì¹Åå¹ÅÞ¹Å×¹ÅйÅɹŹŻ¹Å´¹Å­¹Å¦¹ÅŸ¹Å˜¹Å‘¹ÅйѹÅ|¹Åu¹Ån¹Åg¹Å`¹ÅY¹ÅR¹ÅK¹ÅD¹Å=¹Å6¹Å/¹Å(¹Å!¹Å¹Å¹Å ¹Å¹Åþ¸Å÷¸Åð¸Åé¸Åâ¸ÅÛ¸ÅÔ¸Å͸ÅƸÅ¿¸Å¸¸Å±¸Åª¸Å£¸Åœ¸Å•¸ÅޏŇ¸Å€¸Åy¸År¸Åk¸Åd¸Å]¸ÅV¸ÅO¸ÅH¸ÅA¸Å:¸Å3¸Å,¸Å%¸Å¸Å¸Å¸Å ¸Å¸Åû·Åô·Åí·Åæ·Åß·ÅØ·ÅÑ·ÅÊ·Å÷ż·Åµ·Å®·Å§·Å ·Å™·Å’·Å‹·Å„·Å}·Åv·Åo·Åh·Åa·ÅZ·ÅS·ÅL·ÅE·Å>·Å7·Å0·Å)·Å"·Å·Å·Å ·Å·Åÿ¶Åø¶Åñ¶Åê¶Åã¶ÅܶÅÕ¶ÅζÅǶÅÀ¶Å¹¶Å²¶Å«¶Å¤¶Å¶Å–¶Å¶Åˆ¶Å¶Åz¶Ås¶Ål¶Åe¶Å^¶ÅW¶ÅP¶ÅI¶ÅB¶Å;¶Å4¶Å-¶Å&¶Å¶Å¶Å¶Å ¶Å¶ÅüµÅõµÅîµÅçµÅàµÅÙµÅÒµÅ˵Åĵ޵ŶµÅ¯µÅ¨µÅ¡µÅšµÅ“µÅŒµÅ…µÅ~µÅwµÅpµÅiµÅbµÅ[µÅTµÅMµÅFµÅ?µÅ8µÅ1µÅ*µÅ#µÅµÅµÅµÅµÅµÅù´Åò´Åë´Åä´ÅÝ´ÅÖ´ÅÏ´ÅÈ´ÅÁ´Åº´Å³´Å¬´Å¥´Åž´Å—´Å´Å‰´Å‚´Å{´Åt´Åm´Åf´Å_´ÅX´ÅQ´ÅJ´ÅC´Å<´Å5´Å.´Å'´Å ´Å´Å´Å ´Å´Åý³Åö³Åï³Åè³Åá³ÅÚ³ÅÓ³Å̳Åųž³Å·³Å°³Å©³Å¢³Å›³Å”³Å³Å†³Å³Åx³Åq³Åj³Åc³Å\³ÅU³ÅN³ÅG³Å@³Å9³Å2³Å+³Å$³Å³Å³Å³Å³Å³Åú²Åó²Åì²Åå²ÅÞ²ÅײÅвÅɲŲŻ²Å´²Å­²Å¦²ÅŸ²Å˜²Å‘²ÅвѲÅ|²Åu²Ån²Åg²Å`²ÅY²ÅR²ÅK²ÅD²Å=²Å6²Å/²Å(²Å!²Å²Å²Å ²Å²Åþ±Å÷±Åð±Åé±Åâ±ÅÛ±ÅÔ±ÅͱÅƱÅ¿±Å¸±Å±±Åª±Å£±Åœ±Å•±ÅޱŇ±Å€±Åy±År±Åk±Åd±Å]±ÅV±ÅO±ÅH±ÅA±Å:±Å3±Å,±Å%±Å±Å±Å±Å ±Å±Åû°Åô°Åí°Åæ°Åß°ÅذÅѰÅʰÅðż°Åµ°Å®°Å§°Å °Å™°Å’°Å‹°Å„°Å}°Åv°Åo°Åh°Åa°ÅZ°ÅS°ÅL°ÅE°Å>°Å7°Å0°Å)°Å"°Å°Å°Å °Å°Åÿ¯Åø¯Åñ¯Åê¯Åã¯ÅܯÅÕ¯ÅίÅǯÅÀ¯Å¹¯Å²¯Å«¯Å¤¯Å¯Å–¯Å¯Åˆ¯Å¯Åz¯Ås¯Ål¯Åe¯Å^¯ÅW¯ÅP¯ÅI¯ÅB¯Å;¯Å4¯Å-¯Å&¯Å¯Å¯Å¯Å ¯Å¯Åü®Åõ®Åî®Åç®Åà®ÅÙ®ÅÒ®ÅË®ÅĮޮŶ®Å¯®Å¨®Å¡®Åš®Å“®ÅŒ®Å…®Å~®Åw®Åp®Åi®Åb®Å[®ÅT®ÅM®ÅF®Å?®Å8®Å1®Å*®Å#®Å®Å®Å®Å®Å®Åù­Åò­Åë­Åä­ÅÝ­ÅÖ­ÅÏ­ÅÈ­ÅÁ­Åº­Å³­Å¬­Å¥­Åž­Å—­Å­Å‰­Å‚­Å{­Åt­Åm­Åf­Å_­ÅX­ÅQ­ÅJ­ÅC­Å<­Å5­Å.­Å'­Å ­Å­Å­Å ­Å­Åý¬Åö¬Åï¬Åè¬Åá¬ÅÚ¬ÅÓ¬Å̬ÅŬž¬Å·¬Å°¬Å©¬Å¢¬Å›¬Å”¬Å¬Å†¬Å¬Åx¬Åq¬Åj¬Åc¬Å\¬ÅU¬ÅN¬ÅG¬Å@¬Å9¬Å2¬Å+¬Å$¬Å¬Å¬Å¬Å¬Å¬Åú«Åó«Åì«Åå«ÅÞ«Å׫ÅЫÅɫūݫŴ«Å­«Å¦«ÅŸ«Å˜«Å‘«ÅŠ«Åƒ«Å|«Åu«Ån«Åg«Å`«ÅY«ÅR«ÅK«ÅD«Å=«Å6«Å/«Å(«Å!«Å«Å«Å «Å«ÅþªÅ÷ªÅðªÅéªÅâªÅÛªÅÔªÅͪÅƪÅ¿ªÅ¸ªÅ±ªÅªªÅ£ªÅœªÅ•ªÅŽªÅ‡ªÅ€ªÅyªÅrªÅkªÅdªÅ]ªÅVªÅOªÅHªÅAªÅ:ªÅ3ªÅ,ªÅ%ªÅªÅªÅªÅ ªÅªÅû©Åô©Åí©Åæ©ÅߩŨ©ÅÑ©ÅÊ©Åéż©Åµ©Å®©Å§©Å ©Å™©Å’©Å‹©Å„©Å}©Åv©Åo©Åh©Åa©ÅZ©ÅS©ÅL©ÅE©Å>©Å7©Å0©Å)©Å"©Å©Å©Å ©Å©Åÿ¨Åø¨Åñ¨Åê¨Åã¨ÅܨÅÕ¨ÅΨÅǨÅÀ¨Å¹¨Å²¨Å«¨Å¤¨Å¨Å–¨Å¨Åˆ¨Å¨Åz¨Ås¨Ål¨Åe¨Å^¨ÅW¨ÅP¨ÅI¨ÅB¨Å;¨Å4¨Å-¨Å&¨Å¨Å¨Å¨Å ¨Å¨Åü§Åõ§Åî§Åç§Åà§ÅÙ§ÅÒ§Å˧ÅħާŶ§Å¯§Å¨§Å¡§Åš§Å“§ÅŒ§Å…§Å~§Åw§Åp§Åi§Åb§Å[§ÅT§ÅM§ÅF§Å?§Å8§Å1§Å*§Å#§Å§Å§Å§Å§Å§Åù¦Åò¦Åë¦Åä¦ÅݦÅÖ¦ÅϦÅȦÅÁ¦Åº¦Å³¦Å¬¦Å¥¦Åž¦Å—¦Å¦Å‰¦Å‚¦Å{¦Åt¦Åm¦Åf¦Å_¦ÅX¦ÅQ¦ÅJ¦ÅC¦Å<¦Å5¦Å.¦Å'¦Å ¦Å¦Å¦Å ¦Å¦Åý¥Åö¥Åï¥Åè¥Åá¥ÅÚ¥ÅÓ¥ÅÌ¥Åťž¥Å·¥Å°¥Å©¥Å¢¥Å›¥Å”¥Å¥Å†¥Å¥Åx¥Åq¥Åj¥Åc¥Å\¥ÅU¥ÅN¥ÅG¥Å@¥Å9¥Å2¥Å+¥Å$¥Å¥Å¥Å¥Å¥Å¥Åú¤Åó¤Åì¤Åå¤ÅÞ¤ÅפÅФÅɤŤŻ¤Å´¤Å­¤Å¦¤ÅŸ¤Å˜¤Å‘¤ÅФѤÅ|¤Åu¤Ån¤Åg¤Å`¤ÅY¤ÅR¤ÅK¤ÅD¤Å=¤Å6¤Å/¤Å(¤Å!¤Å¤Å¤Å ¤Å¤Åþ£Å÷£Åð£Åé£Åâ£ÅÛ£ÅÔ£ÅÍ£ÅÆ£Å¿£Å¸£Å±£Åª£Å££Åœ£Å•£ÅޣŇ£Å€£Åy£År£Åk£Åd£Å]£ÅV£ÅO£ÅH£ÅA£Å:£Å3£Å,£Å%£Å£Å£Å£Å £Å£Åû¢Åô¢Åí¢Åæ¢ÅߢÅØ¢ÅÑ¢ÅÊ¢Åâż¢Åµ¢Å®¢Å§¢Å ¢Å™¢Å’¢Å‹¢Å„¢Å}¢Åv¢Åo¢Åh¢Åa¢ÅZ¢ÅS¢ÅL¢ÅE¢Å>¢Å7¢Å0¢Å)¢Å"¢Å¢Å¢Å ¢Å¢Åÿ¡Åø¡Åñ¡Åê¡Åã¡ÅÜ¡ÅÕ¡ÅΡÅÇ¡ÅÀ¡Å¹¡Å²¡Å«¡Å¤¡Å¡Å–¡Å¡Åˆ¡Å¡Åz¡Ås¡Ål¡Åe¡Å^¡ÅW¡ÅP¡ÅI¡ÅB¡Å;¡Å4¡Å-¡Å&¡Å¡Å¡Å¡Å ¡Å¡Åü Åõ Åî Åç Åà ÅÙ ÅÒ ÅË ÅĠޠŶ Å¯ Å¨ Å¡ Åš Å“ ÅŒ Å… Å~ Åw Åp Åi Åb Å[ ÅT ÅM ÅF Å? Å8 Å1 Å* Å# Å Å Å Å Å ÅùŸÅòŸÅëŸÅäŸÅÝŸÅÖŸÅÏŸÅÈŸÅÁŸÅºŸÅ³ŸÅ¬ŸÅ¥ŸÅžŸÅ—ŸÅŸÅ‰ŸÅ‚ŸÅ{ŸÅtŸÅmŸÅfŸÅ_ŸÅXŸÅQŸÅJŸÅCŸÅ<ŸÅ5ŸÅ.ŸÅ'ŸÅ ŸÅŸÅŸÅ ŸÅŸÅýžÅöžÅïžÅèžÅážÅÚžÅÓžÅÌžÅŞžžÅ·žÅ°žÅ©žÅ¢žÅ›žÅ”žÅžÅ†žÅžÅxžÅqžÅjžÅcžÅ\žÅUžÅNžÅGžÅ@žÅ9žÅ2žÅ+žÅ$žÅžÅžÅžÅžÅžÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþœÅ÷œÅðœÅéœÅâœÅÛœÅÔœÅÍœÅÆœÅ¿œÅ¸œÅ±œÅªœÅ£œÅœœÅ•œÅŽœÅ‡œÅ€œÅyœÅrœÅkœÅdœÅ]œÅVœÅOœÅHœÅAœÅ:œÅ3œÅ,œÅ%œÅœÅœÅœÅ œÅœÅû›Åô›Åí›Åæ›ÅߛŨ›ÅÑ›ÅÊ›ÅÛż›Åµ›Å®›Å§›Å ›Å™›Å’›Å‹›Å„›Å}›Åv›Åo›Åh›Åa›ÅZ›ÅS›ÅL›ÅE›Å>›Å7›Å0›Å)›Å"›Å›Å›Å ›Å›ÅÿšÅøšÅñšÅêšÅãšÅÜšÅÕšÅΚÅÇšÅÀšÅ¹šÅ²šÅ«šÅ¤šÅšÅ–šÅšÅˆšÅšÅzšÅsšÅlšÅešÅ^šÅWšÅPšÅIšÅBšÅ;šÅ4šÅ-šÅ&šÅšÅšÅšÅ šÅšÅü™Åõ™Åî™Åç™Åà™ÅÙ™ÅÒ™ÅË™ÅęŽ™Å¶™Å¯™Å¨™Å¡™Åš™Å“™ÅŒ™Å…™Å~™Åw™Åp™Åi™Åb™Å[™ÅT™ÅM™ÅF™Å?™Å8™Å1™Å*™Å#™Å™Å™Å™Å™Å™Åù˜Åò˜Åë˜Åä˜ÅݘÅÖ˜ÅϘÅȘÅÁ˜Åº˜Å³˜Å¬˜Å¥˜Åž˜Å—˜Å˜Å‰˜Å‚˜Å{˜Åt˜Åm˜Åf˜Å_˜ÅX˜ÅQ˜ÅJ˜ÅC˜Å<˜Å5˜Å.˜Å'˜Å ˜Å˜Å˜Å ˜Å˜Åý—Åö—Åï—Åè—Åá—ÅÚ—ÅÓ—ÅÌ—Åŗž—Å·—Ű—Å©—Å¢—Å›—Å”—ŗņ—Å—Åx—Åq—Åj—Åc—Å\—ÅU—ÅN—ÅG—Å@—Å9—Å2—Å+—Å$—Å—Å—Å—Å—Å—Åú–Åó–Åì–Åå–ÅÞ–Å×–ÅЖÅÉ–Å–Å»–Å´–Å­–Ŧ–ÅŸ–Ř–Å‘–ÅŠ–Ń–Å|–Åu–Ån–Åg–Å`–ÅY–ÅR–ÅK–ÅD–Å=–Å6–Å/–Å(–Å!–Å–Å–Å –Å–Åþ•Å÷•Åð•Åé•Åâ•ÅÛ•ÅÔ•ÅÍ•ÅÆ•Å¿•Ÿ•ű•Ū•Å£•Åœ•Å••ÅŽ•Ň•Å€•Åy•År•Åk•Åd•Å]•ÅV•ÅO•ÅH•ÅA•Å:•Å3•Å,•Å%•ŕŕŕŠ•Å•Åû”Åô”Åí”Åæ”ÅߔŨ”ÅÑ”ÅÊ”ÅÔż”ŵ”Å®”ŧ”Å ”Å™”Å’”Å‹”Å„”Å}”Åv”Åo”Åh”Åa”ÅZ”ÅS”ÅL”ÅE”Å>”Å7”Å0”Å)”Å"”ŔŔДŔÅÿ“Åø“Åñ“Åê“Åã“ÅÜ“ÅÕ“ÅΓÅÇ“ÅÀ“ʓؓū“Ť“œŖ“œň“Å“Åz“Ås“Ål“Åe“Å^“ÅW“ÅP“ÅI“ÅB“Å;“Å4“Å-“Å&“œœœŠ“Å“Åü’Åõ’Åî’Åç’Åà’ÅÙ’ÅÒ’ÅË’ÅĒŽ’Ŷ’ů’Ũ’Å¡’Åš’Å“’ÅŒ’Å…’Å~’Åw’Åp’Åi’Åb’Å[’ÅT’ÅM’ÅF’Å?’Å8’Å1’Å*’Å#’Å’Å’Å’Å’Å’Åù‘Åò‘Åë‘Åä‘ÅÝ‘ÅÖ‘ÅÏ‘ÅÈ‘ÅÁ‘ź‘ų‘Ŭ‘Å¥‘Åž‘Å—‘őʼn‘Å‚‘Å{‘Åt‘Åm‘Åf‘Å_‘ÅX‘ÅQ‘ÅJ‘ÅC‘Å<‘Å5‘Å.‘Å'‘Å ‘őőБőÅýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþŽÅ÷ŽÅðŽÅéŽÅâŽÅÛŽÅÔŽÅÍŽÅÆŽÅ¿ŽÅ¸ŽÅ±ŽÅªŽÅ£ŽÅœŽÅ•ŽÅŽŽÅ‡ŽÅ€ŽÅyŽÅrŽÅkŽÅdŽÅ]ŽÅVŽÅOŽÅHŽÅAŽÅ:ŽÅ3ŽÅ,ŽÅ%ŽÅŽÅŽÅŽÅ ŽÅŽÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿŒÅøŒÅñŒÅêŒÅãŒÅÜŒÅÕŒÅÎŒÅÇŒÅÀŒÅ¹ŒÅ²ŒÅ«ŒÅ¤ŒÅŒÅ–ŒÅŒÅˆŒÅŒÅzŒÅsŒÅlŒÅeŒÅ^ŒÅWŒÅPŒÅIŒÅBŒÅ;ŒÅ4ŒÅ-ŒÅ&ŒÅŒÅŒÅŒÅ ŒÅŒÅü‹Åõ‹Åî‹Åç‹Åà‹ÅÙ‹ÅÒ‹ÅË‹ÅċދŶ‹Å¯‹Å¨‹Å¡‹Åš‹Å“‹ÅŒ‹Å…‹Å~‹Åw‹Åp‹Åi‹Åb‹Å[‹ÅT‹ÅM‹ÅF‹Å?‹Å8‹Å1‹Å*‹Å#‹Å‹Å‹Å‹Å‹Å‹ÅùŠÅòŠÅëŠÅäŠÅÝŠÅÖŠÅÏŠÅÈŠÅÁŠÅºŠÅ³ŠÅ¬ŠÅ¥ŠÅžŠÅ—ŠÅŠÅ‰ŠÅ‚ŠÅ{ŠÅtŠÅmŠÅfŠÅ_ŠÅXŠÅQŠÅJŠÅCŠÅ<ŠÅ5ŠÅ.ŠÅ'ŠÅ ŠÅŠÅŠÅ ŠÅŠÅý‰Åö‰Åï‰Åè‰Åá‰ÅÚ‰ÅÓ‰Å̉Åʼnž‰Å·‰Å°‰Å©‰Å¢‰Å›‰Å”‰Å‰Å†‰Å‰Åx‰Åq‰Åj‰Åc‰Å\‰ÅU‰ÅN‰ÅG‰Å@‰Å9‰Å2‰Å+‰Å$‰Å‰Å‰Å‰Å‰Å‰ÅúˆÅóˆÅìˆÅåˆÅÞˆÅ׈ÅЈÅɈňŻˆÅ´ˆÅ­ˆÅ¦ˆÅŸˆÅ˜ˆÅ‘ˆÅŠˆÅƒˆÅ|ˆÅuˆÅnˆÅgˆÅ`ˆÅYˆÅRˆÅKˆÅDˆÅ=ˆÅ6ˆÅ/ˆÅ(ˆÅ!ˆÅˆÅˆÅ ˆÅˆÅþ‡Å÷‡Åð‡Åé‡Åâ‡ÅÛ‡ÅÔ‡Å͇ÅƇÅ¿‡Å¸‡Å±‡Åª‡Å£‡Åœ‡Å•‡ÅއŇ‡Å€‡Åy‡År‡Åk‡Åd‡Å]‡ÅV‡ÅO‡ÅH‡ÅA‡Å:‡Å3‡Å,‡Å%‡Å‡Å‡Å‡Å ‡Å‡Åû†Åô†Åí†Åæ†Å߆Å؆ÅцÅʆůż†Åµ†Å®†Å§†Å †Å™†Å’†Å‹†Å„†Å}†Åv†Åo†Åh†Åa†ÅZ†ÅS†ÅL†ÅE†Å>†Å7†Å0†Å)†Å"†Å†Å†Å †Å†Åÿ…Åø…Åñ…Åê…Åã…ÅÜ…ÅÕ…ÅÎ…ÅÇ…ÅÀ…Ź…Ų…Å«…Ť…Å…Å–…Ņň…Å…Åz…Ås…Ål…Åe…Å^…ÅW…ÅP…ÅI…ÅB…Å;…Å4…Å-…Å&…Å…Å…Å…Å …Å…Åü„Åõ„Åî„Åç„Åà„ÅÙ„ÅÒ„ÅË„ÅĄŽ„Ŷ„ů„Ũ„Å¡„Åš„Å“„ÅŒ„Å…„Å~„Åw„Åp„Åi„Åb„Å[„ÅT„ÅM„ÅF„Å?„Å8„Å1„Å*„Å#„ńńńńńÅùƒÅòƒÅëƒÅäƒÅ݃ÅÖƒÅσÅȃÅÁƒÅºƒÅ³ƒÅ¬ƒÅ¥ƒÅžƒÅ—ƒÅƒÅ‰ƒÅ‚ƒÅ{ƒÅtƒÅmƒÅfƒÅ_ƒÅXƒÅQƒÅJƒÅCƒÅ<ƒÅ5ƒÅ.ƒÅ'ƒÅ ƒÅƒÅƒÅ ƒÅƒÅý‚Åö‚Åï‚Åè‚Åá‚ÅÚ‚ÅÓ‚ÅÌ‚Åłž‚Å·‚Ű‚Å©‚Å¢‚Å›‚Å”‚łņ‚Å‚Åx‚Åq‚Åj‚Åc‚Å\‚ÅU‚ÅN‚ÅG‚Å@‚Å9‚Å2‚Å+‚Å$‚łłłłłÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþ€Å÷€Åð€Åé€Åâ€ÅÛ€ÅÔ€ÅÍ€ÅÆ€Å¿€Å¸€Å±€Åª€Å£€Åœ€Å•€ÅހŇ€Å€€Åy€År€Åk€Åd€Å]€ÅV€ÅO€ÅH€ÅA€Å:€Å3€Å,€Å%€Å€Å€Å€Å €Å€ÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿ~Åø~Åñ~Åê~Åã~ÅÜ~ÅÕ~ÅÎ~ÅÇ~ÅÀ~Ź~Ų~Å«~Ť~Å~Å–~Å~ň~Å~Åz~Ås~Ål~Åe~Å^~ÅW~ÅP~ÅI~ÅB~Å;~Å4~Å-~Å&~Å~Å~Å~Å ~Å~Åü}Åõ}Åî}Åç}Åà}ÅÙ}ÅÒ}ÅË}ÅÄ}Ž}Ŷ}ů}Ũ}Å¡}Åš}Å“}ÅŒ}Å…}Å~}Åw}Åp}Åi}Åb}Å[}ÅT}ÅM}ÅF}Å?}Å8}Å1}Å*}Å#}Å}Å}Å}Å}Å}Åù|Åò|Åë|Åä|ÅÝ|ÅÖ|ÅÏ|ÅÈ|ÅÁ|ź|ų|Ŭ|Å¥|Åž|Å—|Å|ʼn|Å‚|Å{|Åt|Åm|Åf|Å_|ÅX|ÅQ|ÅJ|ÅC|Å<|Å5|Å.|Å'|Å |Å|Å|Å |Å|Åý{Åö{Åï{Åè{Åá{ÅÚ{ÅÓ{ÅÌ{ÅÅ{ž{Å·{Ű{Å©{Å¢{Å›{Å”{Å{ņ{Å{Åx{Åq{Åj{Åc{Å\{ÅU{ÅN{ÅG{Å@{Å9{Å2{Å+{Å${Å{Å{Å{Å{Å{ÅúzÅózÅìzÅåzÅÞzÅ×zÅÐzÅÉzÅÂzÅ»zÅ´zÅ­zŦzÅŸzŘzÅ‘zÅŠzŃzÅ|zÅuzÅnzÅgzÅ`zÅYzÅRzÅKzÅDzÅ=zÅ6zÅ/zÅ(zÅ!zÅzÅzÅ zÅzÅþyÅ÷yÅðyÅéyÅâyÅÛyÅÔyÅÍyÅÆyÅ¿yŸyűyŪyÅ£yÅœyÅ•yÅŽyŇyÅ€yÅyyÅryÅkyÅdyÅ]yÅVyÅOyÅHyÅAyÅ:yÅ3yÅ,yÅ%yÅyÅyÅyÅ yÅyÅûxÅôxÅíxÅæxÅßxÅØxÅÑxÅÊxÅÃxżxŵxÅ®xŧxÅ xÅ™xÅ’xÅ‹xÅ„xÅ}xÅvxÅoxÅhxÅaxÅZxÅSxÅLxÅExÅ>xÅ7xÅ0xÅ)xÅ"xÅxÅxÅ xÅxÅÿwÅøwÅñwÅêwÅãwÅÜwÅÕwÅÎwÅÇwÅÀwŹwŲwÅ«wŤwÅwÅ–wÅwňwÅwÅzwÅswÅlwÅewÅ^wÅWwÅPwÅIwÅBwÅ;wÅ4wÅ-wÅ&wÅwÅwÅwÅ wÅwÅüvÅõvÅîvÅçvÅàvÅÙvÅÒvÅËvÅÄvŽvŶvůvŨvÅ¡vÅšvÅ“vÅŒvÅ…vÅ~vÅwvÅpvÅivÅbvÅ[vÅTvÅMvÅFvÅ?vÅ8vÅ1vÅ*vÅ#vÅvÅvÅvÅvÅvÅùuÅòuÅëuÅäuÅÝuÅÖuÅÏuÅÈuÅÁuźuųuŬuÅ¥uÅžuÅ—uÅuʼnuÅ‚uÅ{uÅtuÅmuÅfuÅ_uÅXuÅQuÅJuÅCuÅqÅ7qÅ0qÅ)qÅ"qÅqÅqÅ qÅqÅÿpÅøpÅñpÅêpÅãpÅÜpÅÕpÅÎpÅÇpÅÀpŹpŲpÅ«pŤpÅpÅ–pÅpňpÅpÅzpÅspÅlpÅepÅ^pÅWpÅPpÅIpÅBpÅ;pÅ4pÅ-pÅ&pÅpÅpÅpÅ pÅpÅüoÅõoÅîoÅçoÅàoÅÙoÅÒoÅËoÅÄoŽoŶoůoŨoÅ¡oÅšoÅ“oÅŒoÅ…oÅ~oÅwoÅpoÅioÅboÅ[oÅToÅMoÅFoÅ?oÅ8oÅ1oÅ*oÅ#oÅoÅoÅoÅoÅoÅùnÅònÅënÅänÅÝnÅÖnÅÏnÅÈnÅÁnźnųnŬnÅ¥nÅžnÅ—nÅnʼnnÅ‚nÅ{nÅtnÅmnÅfnÅ_nÅXnÅQnÅJnÅCnÅjÅ7jÅ0jÅ)jÅ"jÅjÅjÅ jÅjÅÿiÅøiÅñiÅêiÅãiÅÜiÅÕiÅÎiÅÇiÅÀiŹiŲiÅ«iŤiÅiÅ–iÅiňiÅiÅziÅsiÅliÅeiÅ^iÅWiÅPiÅIiÅBiÅ;iÅ4iÅ-iÅ&iÅiÅiÅiÅ iÅiÅühÅõhÅîhÅçhÅàhÅÙhÅÒhÅËhÅÄhŽhŶhůhŨhÅ¡hÅšhÅ“hÅŒhÅ…hÅ~hÅwhÅphÅihÅbhÅ[hÅThÅMhÅFhÅ?hÅ8hÅ1hÅ*hÅ#hÅhÅhÅhÅhÅhÅùgÅògÅëgÅägÅÝgÅÖgÅÏgÅÈgÅÁgźgųgŬgÅ¥gÅžgÅ—gÅgʼngÅ‚gÅ{gÅtgÅmgÅfgÅ_gÅXgÅQgÅJgÅCgÅcÅ7cÅ0cÅ)cÅ"cÅcÅcÅ cÅcÅÿbÅøbÅñbÅêbÅãbÅÜbÅÕbÅÎbÅÇbÅÀbŹbŲbÅ«bŤbÅbÅ–bÅbňbÅbÅzbÅsbÅlbÅebÅ^bÅWbÅPbÅIbÅBbÅ;bÅ4bÅ-bÅ&bÅbÅbÅbÅ bÅbÅüaÅõaÅîaÅçaÅàaÅÙaÅÒaÅËaÅÄaŽaŶaůaŨaÅ¡aÅšaÅ“aÅŒaÅ…aÅ~aÅwaÅpaÅiaÅbaÅ[aÅTaÅMaÅFaÅ?aÅ8aÅ1aÅ*aÅ#aÅaÅaÅaÅaÅaÅù`Åò`Åë`Åä`ÅÝ`ÅÖ`ÅÏ`ÅÈ`ÅÁ`ź`ų`Ŭ`Å¥`Åž`Å—`Å`ʼn`Å‚`Å{`Åt`Åm`Åf`Å_`ÅX`ÅQ`ÅJ`ÅC`Å<`Å5`Å.`Å'`Å `Å`Å`Å `Å`Åý_Åö_Åï_Åè_Åá_ÅÚ_ÅÓ_ÅÌ_ÅÅ_ž_Å·_Ű_Å©_Å¢_Å›_Å”_Å_ņ_Å_Åx_Åq_Åj_Åc_Å\_ÅU_ÅN_ÅG_Å@_Å9_Å2_Å+_Å$_Å_Å_Å_Å_Å_Åú^Åó^Åì^Åå^ÅÞ^Å×^ÅÐ^ÅÉ^ÅÂ^Å»^Å´^Å­^Ŧ^ÅŸ^Ř^Å‘^ÅŠ^Ń^Å|^Åu^Ån^Åg^Å`^ÅY^ÅR^ÅK^ÅD^Å=^Å6^Å/^Å(^Å!^Å^Å^Å ^Å^Åþ]Å÷]Åð]Åé]Åâ]ÅÛ]ÅÔ]ÅÍ]ÅÆ]Å¿]Ÿ]ű]Ū]Å£]Åœ]Å•]ÅŽ]Ň]Å€]Åy]År]Åk]Åd]Å]]ÅV]ÅO]ÅH]ÅA]Å:]Å3]Å,]Å%]Å]Å]Å]Å ]Å]Åû\Åô\Åí\Åæ\Åß\ÅØ\ÅÑ\ÅÊ\ÅÃ\ż\ŵ\Å®\ŧ\Å \Å™\Å’\Å‹\Å„\Å}\Åv\Åo\Åh\Åa\ÅZ\ÅS\ÅL\ÅE\Å>\Å7\Å0\Å)\Å"\Å\Å\Å \Å\Åÿ[Åø[Åñ[Åê[Åã[ÅÜ[ÅÕ[ÅÎ[ÅÇ[ÅÀ[Ź[Ų[Å«[Ť[Å[Å–[Å[ň[Å[Åz[Ås[Ål[Åe[Å^[ÅW[ÅP[ÅI[ÅB[Å;[Å4[Å-[Å&[Å[Å[Å[Å [Å[ÅüZÅõZÅîZÅçZÅàZÅÙZÅÒZÅËZÅÄZŽZŶZůZŨZÅ¡ZÅšZÅ“ZÅŒZÅ…ZÅ~ZÅwZÅpZÅiZÅbZÅ[ZÅTZÅMZÅFZÅ?ZÅ8ZÅ1ZÅ*ZÅ#ZÅZÅZÅZÅZÅZÅùYÅòYÅëYÅäYÅÝYÅÖYÅÏYÅÈYÅÁYźYųYŬYÅ¥YÅžYÅ—YÅYʼnYÅ‚YÅ{YÅtYÅmYÅfYÅ_YÅXYÅQYÅJYÅCYÅUÅ7UÅ0UÅ)UÅ"UÅUÅUÅ UÅUÅÿTÅøTÅñTÅêTÅãTÅÜTÅÕTÅÎTÅÇTÅÀTŹTŲTÅ«TŤTÅTÅ–TÅTňTÅTÅzTÅsTÅlTÅeTÅ^TÅWTÅPTÅITÅBTÅ;TÅ4TÅ-TÅ&TÅTÅTÅTÅ TÅTÅüSÅõSÅîSÅçSÅàSÅÙSÅÒSÅËSÅÄSŽSŶSůSŨSÅ¡SÅšSÅ“SÅŒSÅ…SÅ~SÅwSÅpSÅiSÅbSÅ[SÅTSÅMSÅFSÅ?SÅ8SÅ1SÅ*SÅ#SÅSÅSÅSÅSÅSÅùRÅòRÅëRÅäRÅÝRÅÖRÅÏRÅÈRÅÁRźRųRŬRÅ¥RÅžRÅ—RÅRʼnRÅ‚RÅ{RÅtRÅmRÅfRÅ_RÅXRÅQRÅJRÅCRÅNÅ7NÅ0NÅ)NÅ"NÅNÅNÅ NÅNÅÿMÅøMÅñMÅêMÅãMÅÜMÅÕMÅÎMÅÇMÅÀMŹMŲMÅ«MŤMÅMÅ–MÅMňMÅMÅzMÅsMÅlMÅeMÅ^MÅWMÅPMÅIMÅBMÅ;MÅ4MÅ-MÅ&MÅMÅMÅMÅ MÅMÅüLÅõLÅîLÅçLÅàLÅÙLÅÒLÅËLÅÄLŽLŶLůLŨLÅ¡LÅšLÅ“LÅŒLÅ…LÅ~LÅwLÅpLÅiLÅbLÅ[LÅTLÅMLÅFLÅ?LÅ8LÅ1LÅ*LÅ#LÅLÅLÅLÅLÅLÅùKÅòKÅëKÅäKÅÝKÅÖKÅÏKÅÈKÅÁKźKųKŬKÅ¥KÅžKÅ—KÅKʼnKÅ‚KÅ{KÅtKÅmKÅfKÅ_KÅXKÅQKÅJKÅCKÅGÅ7GÅ0GÅ)GÅ"GÅGÅGÅ GÅGÅÿFÅøFÅñFÅêFÅãFÅÜFÅÕFÅÎFÅÇFÅÀFŹFŲFÅ«FŤFÅFÅ–FÅFňFÅFÅzFÅsFÅlFÅeFÅ^FÅWFÅPFÅIFÅBFÅ;FÅ4FÅ-FÅ&FÅFÅFÅFÅ FÅFÅüEÅõEÅîEÅçEÅàEÅÙEÅÒEÅËEÅÄEŽEŶEůEŨEÅ¡EÅšEÅ“EÅŒEÅ…EÅ~EÅwEÅpEÅiEÅbEÅ[EÅTEÅMEÅFEÅ?EÅ8EÅ1EÅ*EÅ#EÅEÅEÅEÅEÅEÅùDÅòDÅëDÅäDÅÝDÅÖDÅÏDÅÈDÅÁDźDųDŬDÅ¥DÅžDÅ—DÅDʼnDÅ‚DÅ{DÅtDÅmDÅfDÅ_DÅXDÅQDÅJDÅCDÅ@Å7@Å0@Å)@Å"@Å@Å@Å @Å@Åÿ?Åø?Åñ?Åê?Åã?ÅÜ?ÅÕ?ÅÎ?ÅÇ?ÅÀ?Ź?Ų?Å«?Ť?Å?Å–?Å?ň?Å?Åz?Ås?Ål?Åe?Å^?ÅW?ÅP?ÅI?ÅB?Å;?Å4?Å-?Å&?Å?Å?Å?Å ?Å?Åü>Åõ>Åî>Åç>Åà>ÅÙ>ÅÒ>ÅË>ÅÄ>Ž>Ŷ>ů>Ũ>Å¡>Åš>Å“>ÅŒ>Å…>Å~>Åw>Åp>Åi>Åb>Å[>ÅT>ÅM>ÅF>Å?>Å8>Å1>Å*>Å#>Å>Å>Å>Å>Å>Åù=Åò=Åë=Åä=ÅÝ=ÅÖ=ÅÏ=ÅÈ=ÅÁ=ź=ų=Ŭ=Å¥=Åž=Å—=Å=ʼn=Å‚=Å{=Åt=Åm=Åf=Å_=ÅX=ÅQ=ÅJ=ÅC=Å<=Å5=Å.=Å'=Å =Å=Å=Å =Å=Åý<Åö<Åï<Åè<Åá<ÅÚ<ÅÓ<ÅÌ<ÅÅ<ž<Å·<Ű<Å©<Å¢<Å›<Å”<Å<ņ<Å<Åx<Åq<Åj<Åc<Å\<ÅU<ÅN<ÅG<Å@<Å9<Å2<Å+<Å$<Å<Å<Å<Å<Å<Åú;Åó;Åì;Åå;ÅÞ;Å×;ÅÐ;ÅÉ;ÅÂ;Å»;Å´;Å­;Ŧ;ÅŸ;Ř;Å‘;ÅŠ;Ń;Å|;Åu;Ån;Åg;Å`;ÅY;ÅR;ÅK;ÅD;Å=;Å6;Å/;Å(;Å!;Å;Å;Å ;Å;Åþ:Å÷:Åð:Åé:Åâ:ÅÛ:ÅÔ:ÅÍ:ÅÆ:Å¿:Ÿ:ű:Ū:Å£:Åœ:Å•:ÅŽ:Ň:Å€:Åy:År:Åk:Åd:Å]:ÅV:ÅO:ÅH:ÅA:Å::Å3:Å,:Å%:Å:Å:Å:Å :Å:Åû9Åô9Åí9Åæ9Åß9ÅØ9ÅÑ9ÅÊ9ÅÃ9ż9ŵ9Å®9ŧ9Å 9Å™9Å’9Å‹9Å„9Å}9Åv9Åo9Åh9Åa9ÅZ9ÅS9ÅL9ÅE9Å>9Å79Å09Å)9Å"9Å9Å9Å 9Å9Åÿ8Åø8Åñ8Åê8Åã8ÅÜ8ÅÕ8ÅÎ8ÅÇ8ÅÀ8Ź8Ų8Å«8Ť8Å8Å–8Å8ň8Å8Åz8Ås8Ål8Åe8Å^8ÅW8ÅP8ÅI8ÅB8Å;8Å48Å-8Å&8Å8Å8Å8Å 8Å8Åü7Åõ7Åî7Åç7Åà7ÅÙ7ÅÒ7ÅË7ÅÄ7Ž7Ŷ7ů7Ũ7Å¡7Åš7Å“7ÅŒ7Å…7Å~7Åw7Åp7Åi7Åb7Å[7ÅT7ÅM7ÅF7Å?7Å87Å17Å*7Å#7Å7Å7Å7Å7Å7Åù6Åò6Åë6Åä6ÅÝ6ÅÖ6ÅÏ6ÅÈ6ÅÁ6ź6ų6Ŭ6Å¥6Åž6Å—6Å6ʼn6Å‚6Å{6Åt6Åm6Åf6Å_6ÅX6ÅQ6ÅJ6ÅC6Å<6Å56Å.6Å'6Å 6Å6Å6Å 6Å6Åý5Åö5Åï5Åè5Åá5ÅÚ5ÅÓ5ÅÌ5ÅÅ5ž5Å·5Ű5Å©5Å¢5Å›5Å”5Å5ņ5Å5Åx5Åq5Åj5Åc5Å\5ÅU5ÅN5ÅG5Å@5Å95Å25Å+5Å$5Å5Å5Å5Å5Å5Åú4Åó4Åì4Åå4ÅÞ4Å×4ÅÐ4ÅÉ4ÅÂ4Å»4Å´4Å­4Ŧ4ÅŸ4Ř4Å‘4ÅŠ4Ń4Å|4Åu4Ån4Åg4Å`4ÅY4ÅR4ÅK4ÅD4Å=4Å64Å/4Å(4Å!4Å4Å4Å 4Å4Åþ3Å÷3Åð3Åé3Åâ3ÅÛ3ÅÔ3ÅÍ3ÅÆ3Å¿3Ÿ3ű3Ū3Å£3Åœ3Å•3ÅŽ3Ň3Å€3Åy3År3Åk3Åd3Å]3ÅV3ÅO3ÅH3ÅA3Å:3Å33Å,3Å%3Å3Å3Å3Å 3Å3Åû2Åô2Åí2Åæ2Åß2ÅØ2ÅÑ2ÅÊ2ÅÃ2ż2ŵ2Å®2ŧ2Å 2Å™2Å’2Å‹2Å„2Å}2Åv2Åo2Åh2Åa2ÅZ2ÅS2ÅL2ÅE2Å>2Å72Å02Å)2Å"2Å2Å2Å 2Å2Åÿ1Åø1Åñ1Åê1Åã1ÅÜ1ÅÕ1ÅÎ1ÅÇ1ÅÀ1Ź1Ų1Å«1Ť1Å1Å–1Å1ň1Å1Åz1Ås1Ål1Åe1Å^1ÅW1ÅP1ÅI1ÅB1Å;1Å41Å-1Å&1Å1Å1Å1Å 1Å1Åü0Åõ0Åî0Åç0Åà0ÅÙ0ÅÒ0ÅË0ÅÄ0Ž0Ŷ0ů0Ũ0Å¡0Åš0Å“0ÅŒ0Å…0Å~0Åw0Åp0Åi0Åb0Å[0ÅT0ÅM0ÅF0Å?0Å80Å10Å*0Å#0Å0Å0Å0Å0Å0Åù/Åò/Åë/Åä/ÅÝ/ÅÖ/ÅÏ/ÅÈ/ÅÁ/ź/ų/Ŭ/Å¥/Åž/Å—/Å/ʼn/Å‚/Å{/Åt/Åm/Åf/Å_/ÅX/ÅQ/ÅJ/ÅC/Å+Å7+Å0+Å)+Å"+Å+Å+Å +Å+Åÿ*Åø*Åñ*Åê*Åã*ÅÜ*ÅÕ*ÅÎ*ÅÇ*ÅÀ*Ź*Ų*Å«*Ť*Å*Å–*Å*ň*Å*Åz*Ås*Ål*Åe*Å^*ÅW*ÅP*ÅI*ÅB*Å;*Å4*Å-*Å&*Å*Å*Å*Å *Å*Åü)Åõ)Åî)Åç)Åà)ÅÙ)ÅÒ)ÅË)ÅÄ)Ž)Ŷ)ů)Ũ)Å¡)Åš)Å“)ÅŒ)Å…)Å~)Åw)Åp)Åi)Åb)Å[)ÅT)ÅM)ÅF)Å?)Å8)Å1)Å*)Å#)Å)Å)Å)Å)Å)Åù(Åò(Åë(Åä(ÅÝ(ÅÖ(ÅÏ(ÅÈ(ÅÁ(ź(ų(Ŭ(Å¥(Åž(Å—(Å(ʼn(Å‚(Å{(Åt(Åm(Åf(Å_(ÅX(ÅQ(ÅJ(ÅC(Å<(Å5(Å.(Å'(Å (Å(Å(Å (Å(Åý'Åö'Åï'Åè'Åá'ÅÚ'ÅÓ'ÅÌ'ÅÅ'ž'Å·'Ű'Å©'Å¢'Å›'Å”'Å'ņ'Å'Åx'Åq'Åj'Åc'Å\'ÅU'ÅN'ÅG'Å@'Å9'Å2'Å+'Å$'Å'Å'Å'Å'Å'Åú&Åó&Åì&Åå&ÅÞ&Å×&ÅÐ&ÅÉ&ÅÂ&Å»&Å´&Å­&Ŧ&ÅŸ&Ř&Å‘&ÅŠ&Ń&Å|&Åu&Ån&Åg&Å`&ÅY&ÅR&ÅK&ÅD&Å=&Å6&Å/&Å(&Å!&Å&Å&Å &Å&Åþ%Å÷%Åð%Åé%Åâ%ÅÛ%ÅÔ%ÅÍ%ÅÆ%Å¿%Ÿ%ű%Ū%Å£%Åœ%Å•%ÅŽ%Ň%Å€%Åy%År%Åk%Åd%Å]%ÅV%ÅO%ÅH%ÅA%Å:%Å3%Å,%Å%%Å%Å%Å%Å %Å%Åû$Åô$Åí$Åæ$Åß$ÅØ$ÅÑ$ÅÊ$ÅÃ$ż$ŵ$Å®$ŧ$Å $Å™$Å’$Å‹$Å„$Å}$Åv$Åo$Åh$Åa$ÅZ$ÅS$ÅL$ÅE$Å>$Å7$Å0$Å)$Å"$Å$Å$Å $Å$Åÿ#Åø#Åñ#Åê#Åã#ÅÜ#ÅÕ#ÅÎ#ÅÇ#ÅÀ#Ź#Ų#Å«#Ť#Å#Å–#Å#ň#Å#Åz#Ås#Ål#Åe#Å^#ÅW#ÅP#ÅI#ÅB#Å;#Å4#Å-#Å&#Å#Å#Å#Å #Å#Åü"Åõ"Åî"Åç"Åà"ÅÙ"ÅÒ"ÅË"ÅÄ"Ž"Ŷ"ů"Ũ"Å¡"Åš"Å“"ÅŒ"Å…"Å~"Åw"Åp"Åi"Åb"Å["ÅT"ÅM"ÅF"Å?"Å8"Å1"Å*"Å#"Å"Å"Å"Å"Å"Åù!Åò!Åë!Åä!ÅÝ!ÅÖ!ÅÏ!ÅÈ!ÅÁ!ź!ų!Ŭ!Å¥!Åž!Å—!Å!ʼn!Å‚!Å{!Åt!Åm!Åf!Å_!ÅX!ÅQ!ÅJ!ÅC!ÅÅ7Å0Å)Å"ÅÅÅ ÅÅÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅü Åõ Åî Åç Åà ÅÙ ÅÒ ÅË ÅÄ Å½ Ŷ ů Ũ Å¡ Åš Å“ ÅŒ Å… Å~ Åw Åp Åi Åb Å[ ÅT ÅM ÅF Å? Å8 Å1 Å* Å# Å Å Å Å Å Åù Åò Åë Åä ÅÝ ÅÖ ÅÏ ÅÈ ÅÁ ź ų Ŭ Å¥ Åž Å— Šʼn Å‚ Å{ Åt Åm Åf Å_ ÅX ÅQ ÅJ ÅC Å< Å5 Å. Å' Å Å Å Å Å Åý Åö Åï Åè Åá ÅÚ ÅÓ ÅÌ ÅŠž Å· Ű Å© Å¢ Å› Å” Šņ Å Åx Åq Åj Åc Å\ ÅU ÅN ÅG Å@ Å9 Å2 Å+ Å$ Å Å Å Å Å Åú Åó Åì Åå ÅÞ Å× ÅÐ ÅÉ Å Å» Å´ Å­ Ŧ ÅŸ Ř Å‘ ÅŠ Ń Å| Åu Ån Åg Å` ÅY ÅR ÅK ÅD Å= Å6 Å/ Å( Å! Å Å Å Å Åþ Å÷ Åð Åé Åâ ÅÛ ÅÔ ÅÍ ÅÆ Å¿ Ÿ ű Ū Å£ Åœ Å• ÅŽ Ň Å€ Åy År Åk Åd Å] ÅV ÅO ÅH ÅA Å: Å3 Å, Å% Å Å Å Å Å ÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÿÄõÿÄîÿÄçÿÄàÿÄÙÿÄÒÿÄËÿÄÄÿĽÿĶÿįÿĨÿÄ¡ÿÄšÿÄ“ÿÄŒÿÄ…ÿÄ~ÿÄwÿÄpÿÄiÿÄbÿÄ[ÿÄTÿÄMÿÄFÿÄ?ÿÄ8ÿÄ1ÿÄ*ÿÄ#ÿÄÿÄÿÄÿÄÿÄÿÄùþÄòþÄëþÄäþÄÝþÄÖþÄÏþÄÈþÄÁþĺþijþĬþÄ¥þÄžþÄ—þÄþĉþÄ‚þÄ{þÄtþÄmþÄfþÄ_þÄXþÄQþÄJþÄCþÄ<þÄ5þÄ.þÄ'þÄ þÄþÄþÄ þÄþÄýýÄöýÄïýÄèýÄáýÄÚýÄÓýÄÌýÄÅýľýÄ·ýİýÄ©ýÄ¢ýÄ›ýÄ”ýÄýĆýÄýÄxýÄqýÄjýÄcýÄ\ýÄUýÄNýÄGýÄ@ýÄ9ýÄ2ýÄ+ýÄ$ýÄýÄýÄýÄýÄýÄúüÄóüÄìüÄåüÄÞüÄ×üÄÐüÄÉüÄÂüÄ»üÄ´üÄ­üĦüÄŸüĘüÄ‘üÄŠüăüÄ|üÄuüÄnüÄgüÄ`üÄYüÄRüÄKüÄDüÄ=üÄ6üÄ/üÄ(üÄ!üÄüÄüÄ üÄüÄþûÄ÷ûÄðûÄéûÄâûÄÛûÄÔûÄÍûÄÆûÄ¿ûĸûıûĪûÄ£ûÄœûÄ•ûÄŽûćûÄ€ûÄyûÄrûÄkûÄdûÄ]ûÄVûÄOûÄHûÄAûÄ:ûÄ3ûÄ,ûÄ%ûÄûÄûÄûÄ ûÄûÄûúÄôúÄíúÄæúÄßúÄØúÄÑúÄÊúÄÃúļúĵúÄ®úħúÄ úÄ™úÄ’úÄ‹úÄ„úÄ}úÄvúÄoúÄhúÄaúÄZúÄSúÄLúÄEúÄ>úÄ7úÄ0úÄ)úÄ"úÄúÄúÄ úÄúÄÿùÄøùÄñùÄêùÄãùÄÜùÄÕùÄÎùÄÇùÄÀùĹùIJùÄ«ùĤùÄùÄ–ùÄùĈùÄùÄzùÄsùÄlùÄeùÄ^ùÄWùÄPùÄIùÄBùÄ;ùÄ4ùÄ-ùÄ&ùÄùÄùÄùÄ ùÄùÄüøÄõøÄîøÄçøÄàøÄÙøÄÒøÄËøÄĸĽøÄ¶øÄ¯øÄ¨øÄ¡øÄšøÄ“øÄŒøÄ…øÄ~øÄwøÄpøÄiøÄbøÄ[øÄTøÄMøÄFøÄ?øÄ8øÄ1øÄ*øÄ#øÄøÄøÄøÄøÄøÄù÷Äò÷Äë÷Ää÷ÄÝ÷ÄÖ÷ÄÏ÷ÄÈ÷ÄÁ÷ĺ÷ij÷Ĭ÷Ä¥÷Äž÷Ä—÷Ä÷ĉ÷Ä‚÷Ä{÷Ät÷Äm÷Äf÷Ä_÷ÄX÷ÄQ÷ÄJ÷ÄC÷Ä<÷Ä5÷Ä.÷Ä'÷Ä ÷Ä÷Ä÷Ä ÷Ä÷ÄýöÄööÄïöÄèöÄáöÄÚöÄÓöÄÌöÄÅöľöÄ·öİöÄ©öÄ¢öÄ›öÄ”öÄöĆöÄöÄxöÄqöÄjöÄcöÄ\öÄUöÄNöÄGöÄ@öÄ9öÄ2öÄ+öÄ$öÄöÄöÄöÄöÄöÄúõÄóõÄìõÄåõÄÞõÄ×õÄÐõÄÉõÄÂõÄ»õÄ´õÄ­õĦõÄŸõĘõÄ‘õÄŠõăõÄ|õÄuõÄnõÄgõÄ`õÄYõÄRõÄKõÄDõÄ=õÄ6õÄ/õÄ(õÄ!õÄõÄõÄ õÄõÄþôÄ÷ôÄðôÄéôÄâôÄÛôÄÔôÄÍôÄÆôÄ¿ôĸôıôĪôÄ£ôÄœôÄ•ôÄŽôćôÄ€ôÄyôÄrôÄkôÄdôÄ]ôÄVôÄOôÄHôÄAôÄ:ôÄ3ôÄ,ôÄ%ôÄôÄôÄôÄ ôÄôÄûóÄôóÄíóÄæóÄßóÄØóÄÑóÄÊóÄÃóļóĵóÄ®óħóÄ óÄ™óÄ’óÄ‹óÄ„óÄ}óÄvóÄoóÄhóÄaóÄZóÄSóÄLóÄEóÄ>óÄ7óÄ0óÄ)óÄ"óÄóÄóÄ óÄóÄÿòÄøòÄñòÄêòÄãòÄÜòÄÕòÄÎòÄÇòÄÀòĹòIJòÄ«òĤòÄòÄ–òÄòĈòÄòÄzòÄsòÄlòÄeòÄ^òÄWòÄPòÄIòÄBòÄ;òÄ4òÄ-òÄ&òÄòÄòÄòÄ òÄòÄüñÄõñÄîñÄçñÄàñÄÙñÄÒñÄËñÄÄñĽñĶñįñĨñÄ¡ñÄšñÄ“ñÄŒñÄ…ñÄ~ñÄwñÄpñÄiñÄbñÄ[ñÄTñÄMñÄFñÄ?ñÄ8ñÄ1ñÄ*ñÄ#ñÄñÄñÄñÄñÄñÄùðÄòðÄëðÄäðÄÝðÄÖðÄÏðÄÈðÄÁðĺðijðĬðÄ¥ðÄžðÄ—ðÄðĉðÄ‚ðÄ{ðÄtðÄmðÄfðÄ_ðÄXðÄQðÄJðÄCðÄ<ðÄ5ðÄ.ðÄ'ðÄ ðÄðÄðÄ ðÄðÄýïÄöïÄïïÄèïÄáïÄÚïÄÓïÄÌïÄÅïľïÄ·ïİïÄ©ïÄ¢ïÄ›ïÄ”ïÄïĆïÄïÄxïÄqïÄjïÄcïÄ\ïÄUïÄNïÄGïÄ@ïÄ9ïÄ2ïÄ+ïÄ$ïÄïÄïÄïÄïÄïÄúîÄóîÄìîÄåîÄÞîÄ×îÄÐîÄÉîÄÂîÄ»îÄ´îÄ­îĦîÄŸîĘîÄ‘îÄŠîăîÄ|îÄuîÄnîÄgîÄ`îÄYîÄRîÄKîÄDîÄ=îÄ6îÄ/îÄ(îÄ!îÄîÄîÄ îÄîÄþíÄ÷íÄðíÄéíÄâíÄÛíÄÔíÄÍíÄÆíÄ¿íĸíıíĪíÄ£íÄœíÄ•íÄŽíćíÄ€íÄyíÄríÄkíÄdíÄ]íÄVíÄOíÄHíÄAíÄ:íÄ3íÄ,íÄ%íÄíÄíÄíÄ íÄíÄûìÄôìÄíìÄæìÄßìÄØìÄÑìÄÊìÄÃìļìĵìÄ®ìħìÄ ìÄ™ìÄ’ìÄ‹ìÄ„ìÄ}ìÄvìÄoìÄhìÄaìÄZìÄSìÄLìÄEìÄ>ìÄ7ìÄ0ìÄ)ìÄ"ìÄìÄìÄ ìÄìÄÿëÄøëÄñëÄêëÄãëÄÜëÄÕëÄÎëÄÇëÄÀëĹëIJëÄ«ëĤëÄëÄ–ëÄëĈëÄëÄzëÄsëÄlëÄeëÄ^ëÄWëÄPëÄIëÄBëÄ;ëÄ4ëÄ-ëÄ&ëÄëÄëÄëÄ ëÄëÄüêÄõêÄîêÄçêÄàêÄÙêÄÒêÄËêÄÄêĽêĶêįêĨêÄ¡êÄšêÄ“êÄŒêÄ…êÄ~êÄwêÄpêÄiêÄbêÄ[êÄTêÄMêÄFêÄ?êÄ8êÄ1êÄ*êÄ#êÄêÄêÄêÄêÄêÄùéÄòéÄëéÄäéÄÝéÄÖéÄÏéÄÈéÄÁéĺéijéĬéÄ¥éÄžéÄ—éÄéĉéÄ‚éÄ{éÄtéÄméÄféÄ_éÄXéÄQéÄJéÄCéÄ<éÄ5éÄ.éÄ'éÄ éÄéÄéÄ éÄéÄýèÄöèÄïèÄèèÄáèÄÚèÄÓèÄÌèÄÅèľèÄ·èİèÄ©èÄ¢èÄ›èÄ”èÄèĆèÄèÄxèÄqèÄjèÄcèÄ\èÄUèÄNèÄGèÄ@èÄ9èÄ2èÄ+èÄ$èÄèÄèÄèÄèÄèÄúçÄóçÄìçÄåçÄÞçÄ×çÄÐçÄÉçÄÂçÄ»çÄ´çÄ­çĦçÄŸçĘçÄ‘çÄŠçăçÄ|çÄuçÄnçÄgçÄ`çÄYçÄRçÄKçÄDçÄ=çÄ6çÄ/çÄ(çÄ!çÄçÄçÄ çÄçÄþæÄ÷æÄðæÄéæÄâæÄÛæÄÔæÄÍæÄÆæÄ¿æÄ¸æÄ±æÄªæÄ£æÄœæÄ•æÄ޿ćæÄ€æÄyæÄræÄkæÄdæÄ]æÄVæÄOæÄHæÄAæÄ:æÄ3æÄ,æÄ%æÄæÄæÄæÄ æÄæÄûåÄôåÄíåÄæåÄßåÄØåÄÑåÄÊåÄÃåļåĵåÄ®åħåÄ åÄ™åÄ’åÄ‹åÄ„åÄ}åÄvåÄoåÄhåÄaåÄZåÄSåÄLåÄEåÄ>åÄ7åÄ0åÄ)åÄ"åÄåÄåÄ åÄåÄÿäÄøäÄñäÄêäÄãäÄÜäÄÕäÄÎäÄÇäÄÀäĹäIJäÄ«äĤäÄäÄ–äÄäĈäÄäÄzäÄsäÄläÄeäÄ^äÄWäÄPäÄIäÄBäÄ;äÄ4äÄ-äÄ&äÄäÄäÄäÄ äÄäÄüãÄõãÄîãÄçãÄàãÄÙãÄÒãÄËãÄÄãĽãĶãįãĨãÄ¡ãÄšãÄ“ãÄŒãÄ…ãÄ~ãÄwãÄpãÄiãÄbãÄ[ãÄTãÄMãÄFãÄ?ãÄ8ãÄ1ãÄ*ãÄ#ãÄãÄãÄãÄãÄãÄùâÄòâÄëâÄäâÄÝâÄÖâÄÏâÄÈâÄÁâĺâijâĬâÄ¥âÄžâÄ—âÄâĉâÄ‚âÄ{âÄtâÄmâÄfâÄ_âÄXâÄQâÄJâÄCâÄ<âÄ5âÄ.âÄ'âÄ âÄâÄâÄ âÄâÄýáÄöáÄïáÄèáÄááÄÚáÄÓáÄÌáÄÅáľáÄ·áİáÄ©áÄ¢áÄ›áÄ”áÄáĆáÄáÄxáÄqáÄjáÄcáÄ\áÄUáÄNáÄGáÄ@áÄ9áÄ2áÄ+áÄ$áÄáÄáÄáÄáÄáÄúàÄóàÄìàÄåàÄÞàÄ×àÄÐàÄÉàÄÂàÄ»àÄ´àÄ­àĦàÄŸàĘàÄ‘àÄŠàăàÄ|àÄuàÄnàÄgàÄ`àÄYàÄRàÄKàÄDàÄ=àÄ6àÄ/àÄ(àÄ!àÄàÄàÄ àÄàÄþßÄ÷ßÄðßÄéßÄâßÄÛßÄÔßÄÍßÄÆßÄ¿ßĸßıßĪßÄ£ßÄœßÄ•ßÄŽßćßÄ€ßÄyßÄrßÄkßÄdßÄ]ßÄVßÄOßÄHßÄAßÄ:ßÄ3ßÄ,ßÄ%ßÄßÄßÄßÄ ßÄßÄûÞÄôÞÄíÞÄæÞÄßÞÄØÞÄÑÞÄÊÞÄÃÞļÞĵÞÄ®ÞħÞÄ ÞÄ™ÞÄ’ÞÄ‹ÞÄ„ÞÄ}ÞÄvÞÄoÞÄhÞÄaÞÄZÞÄSÞÄLÞÄEÞÄ>ÞÄ7ÞÄ0ÞÄ)ÞÄ"ÞÄÞÄÞÄ ÞÄÞÄÿÝÄøÝÄñÝÄêÝÄãÝÄÜÝÄÕÝÄÎÝÄÇÝÄÀÝĹÝIJÝÄ«ÝĤÝÄÝÄ–ÝÄÝĈÝÄÝÄzÝÄsÝÄlÝÄeÝÄ^ÝÄWÝÄPÝÄIÝÄBÝÄ;ÝÄ4ÝÄ-ÝÄ&ÝÄÝÄÝÄÝÄ ÝÄÝÄüÜÄõÜÄîÜÄçÜÄàÜÄÙÜÄÒÜÄËÜÄÄÜĽÜĶÜįÜĨÜÄ¡ÜÄšÜÄ“ÜÄŒÜÄ…ÜÄ~ÜÄwÜÄpÜÄiÜÄbÜÄ[ÜÄTÜÄMÜÄFÜÄ?ÜÄ8ÜÄ1ÜÄ*ÜÄ#ÜÄÜÄÜÄÜÄÜÄÜÄùÛÄòÛÄëÛÄäÛÄÝÛÄÖÛÄÏÛÄÈÛÄÁÛĺÛijÛĬÛÄ¥ÛÄžÛÄ—ÛÄÛĉÛÄ‚ÛÄ{ÛÄtÛÄmÛÄfÛÄ_ÛÄXÛÄQÛÄJÛÄCÛÄ<ÛÄ5ÛÄ.ÛÄ'ÛÄ ÛÄÛÄÛÄ ÛÄÛÄýÚÄöÚÄïÚÄèÚÄáÚÄÚÚÄÓÚÄÌÚÄÅÚľÚÄ·ÚİÚÄ©ÚÄ¢ÚÄ›ÚÄ”ÚÄÚĆÚÄÚÄxÚÄqÚÄjÚÄcÚÄ\ÚÄUÚÄNÚÄGÚÄ@ÚÄ9ÚÄ2ÚÄ+ÚÄ$ÚÄÚÄÚÄÚÄÚÄÚÄúÙÄóÙÄìÙÄåÙÄÞÙÄ×ÙÄÐÙÄÉÙÄÂÙÄ»ÙÄ´ÙÄ­ÙĦÙÄŸÙĘÙÄ‘ÙÄŠÙăÙÄ|ÙÄuÙÄnÙÄgÙÄ`ÙÄYÙÄRÙÄKÙÄDÙÄ=ÙÄ6ÙÄ/ÙÄ(ÙÄ!ÙÄÙÄÙÄ ÙÄÙÄþØÄ÷ØÄðØÄéØÄâØÄÛØÄÔØÄÍØÄÆØÄ¿ØÄ¸ØÄ±ØÄªØÄ£ØÄœØÄ•ØÄިćØÄ€ØÄyØÄrØÄkØÄdØÄ]ØÄVØÄOØÄHØÄAØÄ:ØÄ3ØÄ,ØÄ%ØÄØÄØÄØÄ ØÄØÄû×Äô×Äí×Äæ×Äß×ÄØ×ÄÑ×ÄÊ×ÄÃ×ļ×ĵ×Ä®×ħ×Ä ×Ä™×Ä’×Ä‹×Ä„×Ä}×Äv×Äo×Äh×Äa×ÄZ×ÄS×ÄL×ÄE×Ä>×Ä7×Ä0×Ä)×Ä"×Ä×Ä×Ä ×Ä×ÄÿÖÄøÖÄñÖÄêÖÄãÖÄÜÖÄÕÖÄÎÖÄÇÖÄÀÖĹÖIJÖÄ«ÖĤÖÄÖÄ–ÖÄÖĈÖÄÖÄzÖÄsÖÄlÖÄeÖÄ^ÖÄWÖÄPÖÄIÖÄBÖÄ;ÖÄ4ÖÄ-ÖÄ&ÖÄÖÄÖÄÖÄ ÖÄÖÄüÕÄõÕÄîÕÄçÕÄàÕÄÙÕÄÒÕÄËÕÄÄÕĽÕĶÕįÕĨÕÄ¡ÕÄšÕÄ“ÕÄŒÕÄ…ÕÄ~ÕÄwÕÄpÕÄiÕÄbÕÄ[ÕÄTÕÄMÕÄFÕÄ?ÕÄ8ÕÄ1ÕÄ*ÕÄ#ÕÄÕÄÕÄÕÄÕÄÕÄùÔÄòÔÄëÔÄäÔÄÝÔÄÖÔÄÏÔÄÈÔÄÁÔĺÔijÔĬÔÄ¥ÔÄžÔÄ—ÔÄÔĉÔÄ‚ÔÄ{ÔÄtÔÄmÔÄfÔÄ_ÔÄXÔÄQÔÄJÔÄCÔÄ<ÔÄ5ÔÄ.ÔÄ'ÔÄ ÔÄÔÄÔÄ ÔÄÔÄýÓÄöÓÄïÓÄèÓÄáÓÄÚÓÄÓÓÄÌÓÄÅÓľÓÄ·ÓİÓÄ©ÓÄ¢ÓÄ›ÓÄ”ÓÄÓĆÓÄÓÄxÓÄqÓÄjÓÄcÓÄ\ÓÄUÓÄNÓÄGÓÄ@ÓÄ9ÓÄ2ÓÄ+ÓÄ$ÓÄÓÄÓÄÓÄÓÄÓÄúÒÄóÒÄìÒÄåÒÄÞÒÄ×ÒÄÐÒÄÉÒÄÂÒÄ»ÒÄ´ÒÄ­ÒĦÒÄŸÒĘÒÄ‘ÒÄŠÒăÒÄ|ÒÄuÒÄnÒÄgÒÄ`ÒÄYÒÄRÒÄKÒÄDÒÄ=ÒÄ6ÒÄ/ÒÄ(ÒÄ!ÒÄÒÄÒÄ ÒÄÒÄþÑÄ÷ÑÄðÑÄéÑÄâÑÄÛÑÄÔÑÄÍÑÄÆÑÄ¿ÑĸÑıÑĪÑÄ£ÑÄœÑÄ•ÑÄŽÑćÑÄ€ÑÄyÑÄrÑÄkÑÄdÑÄ]ÑÄVÑÄOÑÄHÑÄAÑÄ:ÑÄ3ÑÄ,ÑÄ%ÑÄÑÄÑÄÑÄ ÑÄÑÄûÐÄôÐÄíÐÄæÐÄßÐÄØÐÄÑÐÄÊÐÄÃÐļÐĵÐÄ®ÐħÐÄ ÐÄ™ÐÄ’ÐÄ‹ÐÄ„ÐÄ}ÐÄvÐÄoÐÄhÐÄaÐÄZÐÄSÐÄLÐÄEÐÄ>ÐÄ7ÐÄ0ÐÄ)ÐÄ"ÐÄÐÄÐÄ ÐÄÐÄÿÏÄøÏÄñÏÄêÏÄãÏÄÜÏÄÕÏÄÎÏÄÇÏÄÀÏĹÏIJÏÄ«ÏĤÏÄÏÄ–ÏÄÏĈÏÄÏÄzÏÄsÏÄlÏÄeÏÄ^ÏÄWÏÄPÏÄIÏÄBÏÄ;ÏÄ4ÏÄ-ÏÄ&ÏÄÏÄÏÄÏÄ ÏÄÏÄüÎÄõÎÄîÎÄçÎÄàÎÄÙÎÄÒÎÄËÎÄÄÎĽÎĶÎįÎĨÎÄ¡ÎÄšÎÄ“ÎÄŒÎÄ…ÎÄ~ÎÄwÎÄpÎÄiÎÄbÎÄ[ÎÄTÎÄMÎÄFÎÄ?ÎÄ8ÎÄ1ÎÄ*ÎÄ#ÎÄÎÄÎÄÎÄÎÄÎÄùÍÄòÍÄëÍÄäÍÄÝÍÄÖÍÄÏÍÄÈÍÄÁÍĺÍijÍĬÍÄ¥ÍÄžÍÄ—ÍÄÍĉÍÄ‚ÍÄ{ÍÄtÍÄmÍÄfÍÄ_ÍÄXÍÄQÍÄJÍÄCÍÄ<ÍÄ5ÍÄ.ÍÄ'ÍÄ ÍÄÍÄÍÄ ÍÄÍÄýÌÄöÌÄïÌÄèÌÄáÌÄÚÌÄÓÌÄÌÌÄÅÌľÌÄ·ÌİÌÄ©ÌÄ¢ÌÄ›ÌÄ”ÌÄÌĆÌÄÌÄxÌÄqÌÄjÌÄcÌÄ\ÌÄUÌÄNÌÄGÌÄ@ÌÄ9ÌÄ2ÌÄ+ÌÄ$ÌÄÌÄÌÄÌÄÌÄÌÄúËÄóËÄìËÄåËÄÞËÄ×ËÄÐËÄÉËÄÂËÄ»ËÄ´ËÄ­ËĦËÄŸËĘËÄ‘ËÄŠËăËÄ|ËÄuËÄnËÄgËÄ`ËÄYËÄRËÄKËÄDËÄ=ËÄ6ËÄ/ËÄ(ËÄ!ËÄËÄËÄ ËÄËÄþÊÄ÷ÊÄðÊÄéÊÄâÊÄÛÊÄÔÊÄÍÊÄÆÊÄ¿ÊĸÊıÊĪÊÄ£ÊÄœÊÄ•ÊÄŽÊćÊÄ€ÊÄyÊÄrÊÄkÊÄdÊÄ]ÊÄVÊÄOÊÄHÊÄAÊÄ:ÊÄ3ÊÄ,ÊÄ%ÊÄÊÄÊÄÊÄ ÊÄÊÄûÉÄôÉÄíÉÄæÉÄßÉÄØÉÄÑÉÄÊÉÄÃÉļÉĵÉÄ®ÉħÉÄ ÉÄ™ÉÄ’ÉÄ‹ÉÄ„ÉÄ}ÉÄvÉÄoÉÄhÉÄaÉÄZÉÄSÉÄLÉÄEÉÄ>ÉÄ7ÉÄ0ÉÄ)ÉÄ"ÉÄÉÄÉÄ ÉÄÉÄÿÈÄøÈÄñÈÄêÈÄãÈÄÜÈÄÕÈÄÎÈÄÇÈÄÀÈĹÈIJÈÄ«ÈĤÈÄÈÄ–ÈÄÈĈÈÄÈÄzÈÄsÈÄlÈÄeÈÄ^ÈÄWÈÄPÈÄIÈÄBÈÄ;ÈÄ4ÈÄ-ÈÄ&ÈÄÈÄÈÄÈÄ ÈÄÈÄüÇÄõÇÄîÇÄçÇÄàÇÄÙÇÄÒÇÄËÇÄÄÇĽÇĶÇįÇĨÇÄ¡ÇÄšÇÄ“ÇÄŒÇÄ…ÇÄ~ÇÄwÇÄpÇÄiÇÄbÇÄ[ÇÄTÇÄMÇÄFÇÄ?ÇÄ8ÇÄ1ÇÄ*ÇÄ#ÇÄÇÄÇÄÇÄÇÄÇÄùÆÄòÆÄëÆÄäÆÄÝÆÄÖÆÄÏÆÄÈÆÄÁÆÄºÆÄ³ÆÄ¬ÆÄ¥ÆÄžÆÄ—ÆÄÆÄ‰ÆÄ‚ÆÄ{ÆÄtÆÄmÆÄfÆÄ_ÆÄXÆÄQÆÄJÆÄCÆÄ<ÆÄ5ÆÄ.ÆÄ'ÆÄ ÆÄÆÄÆÄ ÆÄÆÄýÅÄöÅÄïÅÄèÅÄáÅÄÚÅÄÓÅÄÌÅÄÅÅľÅÄ·ÅİÅÄ©ÅÄ¢ÅÄ›ÅÄ”ÅÄÅĆÅÄÅÄxÅÄqÅÄjÅÄcÅÄ\ÅÄUÅÄNÅÄGÅÄ@ÅÄ9ÅÄ2ÅÄ+ÅÄ$ÅÄÅÄÅÄÅÄÅÄÅÄúÄÄóÄÄìÄÄåÄÄÞÄÄ×ÄÄÐÄÄÉÄÄÂÄÄ»ÄÄ´ÄÄ­ÄĦÄÄŸÄĘÄÄ‘ÄÄŠÄăÄÄ|ÄÄuÄÄnÄÄgÄÄ`ÄÄYÄÄRÄÄKÄÄDÄÄ=ÄÄ6ÄÄ/ÄÄ(ÄÄ!ÄÄÄÄÄÄ ÄÄÄÄþÃÄ÷ÃÄðÃÄéÃÄâÃÄÛÃÄÔÃÄÍÃÄÆÃÄ¿ÃĸÃıÃĪÃÄ£ÃÄœÃÄ•ÃÄŽÃćÃÄ€ÃÄyÃÄrÃÄkÃÄdÃÄ]ÃÄVÃÄOÃÄHÃÄAÃÄ:ÃÄ3ÃÄ,ÃÄ%ÃÄÃÄÃÄÃÄ ÃÄÃÄûÂÄôÂÄíÂÄæÂÄßÂÄØÂÄÑÂÄÊÂÄÃÂļÂĵÂÄ®ÂħÂÄ ÂÄ™ÂÄ’ÂÄ‹ÂÄ„ÂÄ}ÂÄvÂÄoÂÄhÂÄaÂÄZÂÄSÂÄLÂÄEÂÄ>ÂÄ7ÂÄ0ÂÄ)ÂÄ"ÂÄÂÄÂÄ ÂÄÂÄÿÁÄøÁÄñÁÄêÁÄãÁÄÜÁÄÕÁÄÎÁÄÇÁÄÀÁĹÁIJÁÄ«ÁĤÁÄÁÄ–ÁÄÁĈÁÄÁÄzÁÄsÁÄlÁÄeÁÄ^ÁÄWÁÄPÁÄIÁÄBÁÄ;ÁÄ4ÁÄ-ÁÄ&ÁÄÁÄÁÄÁÄ ÁÄÁÄüÀÄõÀÄîÀÄçÀÄàÀÄÙÀÄÒÀÄËÀÄÄÀĽÀĶÀįÀĨÀÄ¡ÀÄšÀÄ“ÀÄŒÀÄ…ÀÄ~ÀÄwÀÄpÀÄiÀÄbÀÄ[ÀÄTÀÄMÀÄFÀÄ?ÀÄ8ÀÄ1ÀÄ*ÀÄ#ÀÄÀÄÀÄÀÄÀÄÀÄù¿Äò¿Äë¿Ää¿ÄÝ¿ÄÖ¿ÄÏ¿ÄÈ¿ÄÁ¿Äº¿Ä³¿Ä¬¿Ä¥¿Äž¿Ä—¿Ä¿Ä‰¿Ä‚¿Ä{¿Ät¿Äm¿Äf¿Ä_¿ÄX¿ÄQ¿ÄJ¿ÄC¿Ä<¿Ä5¿Ä.¿Ä'¿Ä ¿Ä¿Ä¿Ä ¿Ä¿Äý¾Äö¾Äï¾Äè¾Äá¾ÄÚ¾ÄÓ¾Ä̾Ğľ¾Ä·¾Ä°¾Ä©¾Ä¢¾Ä›¾Ä”¾Ä¾Ä†¾Ä¾Äx¾Äq¾Äj¾Äc¾Ä\¾ÄU¾ÄN¾ÄG¾Ä@¾Ä9¾Ä2¾Ä+¾Ä$¾Ä¾Ä¾Ä¾Ä¾Ä¾Äú½Äó½Äì½Äå½ÄÞ½Ä×½ÄнÄɽĽĻ½Ä´½Ä­½Ä¦½ÄŸ½Ä˜½Ä‘½Äнă½Ä|½Äu½Än½Äg½Ä`½ÄY½ÄR½ÄK½ÄD½Ä=½Ä6½Ä/½Ä(½Ä!½Ä½Ä½Ä ½Ä½Äþ¼Ä÷¼Äð¼Äé¼Äâ¼ÄÛ¼ÄÔ¼ÄͼÄƼÄ¿¼Ä¸¼Ä±¼Äª¼Ä£¼Äœ¼Ä•¼Ä޼ć¼Ä€¼Äy¼Är¼Äk¼Äd¼Ä]¼ÄV¼ÄO¼ÄH¼ÄA¼Ä:¼Ä3¼Ä,¼Ä%¼Ä¼Ä¼Ä¼Ä ¼Ä¼Äû»Äô»Äí»Äæ»Ä߻Ĩ»ÄÑ»ÄÊ»Äûļ»Äµ»Ä®»Ä§»Ä »Ä™»Ä’»Ä‹»Ä„»Ä}»Äv»Äo»Äh»Äa»ÄZ»ÄS»ÄL»ÄE»Ä>»Ä7»Ä0»Ä)»Ä"»Ä»Ä»Ä »Ä»ÄÿºÄøºÄñºÄêºÄãºÄܺÄÕºÄκÄǺÄÀºÄ¹ºÄ²ºÄ«ºÄ¤ºÄºÄ–ºÄºÄˆºÄºÄzºÄsºÄlºÄeºÄ^ºÄWºÄPºÄIºÄBºÄ;ºÄ4ºÄ-ºÄ&ºÄºÄºÄºÄ ºÄºÄü¹Äõ¹Äî¹Äç¹Äà¹ÄÙ¹ÄÒ¹Ä˹ÄĹĽ¹Ä¶¹Ä¯¹Ä¨¹Ä¡¹Äš¹Ä“¹ÄŒ¹Ä…¹Ä~¹Äw¹Äp¹Äi¹Äb¹Ä[¹ÄT¹ÄM¹ÄF¹Ä?¹Ä8¹Ä1¹Ä*¹Ä#¹Ä¹Ä¹Ä¹Ä¹Ä¹Äù¸Äò¸Äë¸Ää¸ÄݸÄÖ¸ÄϸÄȸÄÁ¸Äº¸Ä³¸Ä¬¸Ä¥¸Äž¸Ä—¸Ä¸Ä‰¸Ä‚¸Ä{¸Ät¸Äm¸Äf¸Ä_¸ÄX¸ÄQ¸ÄJ¸ÄC¸Ä<¸Ä5¸Ä.¸Ä'¸Ä ¸Ä¸Ä¸Ä ¸Ä¸Äý·Äö·Äï·Äè·Äá·ÄÚ·ÄÓ·ÄÌ·Äŷľ·Ä··Ä°·Ä©·Ä¢·Ä›·Ä”·Ä·Ä†·Ä·Äx·Äq·Äj·Äc·Ä\·ÄU·ÄN·ÄG·Ä@·Ä9·Ä2·Ä+·Ä$·Ä·Ä·Ä·Ä·Ä·Äú¶Äó¶Äì¶Äå¶ÄÞ¶Ä×¶ÄжÄɶĶ϶Ĵ¶Ä­¶Ä¦¶ÄŸ¶Ä˜¶Ä‘¶Äжă¶Ä|¶Äu¶Än¶Äg¶Ä`¶ÄY¶ÄR¶ÄK¶ÄD¶Ä=¶Ä6¶Ä/¶Ä(¶Ä!¶Ä¶Ä¶Ä ¶Ä¶ÄþµÄ÷µÄðµÄéµÄâµÄÛµÄÔµÄ͵ÄƵÄ¿µÄ¸µÄ±µÄªµÄ£µÄœµÄ•µÄ޵ćµÄ€µÄyµÄrµÄkµÄdµÄ]µÄVµÄOµÄHµÄAµÄ:µÄ3µÄ,µÄ%µÄµÄµÄµÄ µÄµÄû´Äô´Äí´Äæ´Äß´ÄØ´ÄÑ´ÄÊ´Äôļ´Äµ´Ä®´Ä§´Ä ´Ä™´Ä’´Ä‹´Ä„´Ä}´Äv´Äo´Äh´Äa´ÄZ´ÄS´ÄL´ÄE´Ä>´Ä7´Ä0´Ä)´Ä"´Ä´Ä´Ä ´Ä´Äÿ³Äø³Äñ³Äê³Äã³ÄܳÄÕ³ÄγÄdzÄÀ³Ä¹³Ä²³Ä«³Ä¤³Ä³Ä–³Ä³Äˆ³Ä³Äz³Äs³Äl³Äe³Ä^³ÄW³ÄP³ÄI³ÄB³Ä;³Ä4³Ä-³Ä&³Ä³Ä³Ä³Ä ³Ä³Äü²Äõ²Äî²Äç²Äà²ÄÙ²ÄÒ²Ä˲ÄIJĽ²Ä¶²Ä¯²Ä¨²Ä¡²Äš²Ä“²ÄŒ²Ä…²Ä~²Äw²Äp²Äi²Äb²Ä[²ÄT²ÄM²ÄF²Ä?²Ä8²Ä1²Ä*²Ä#²Ä²Ä²Ä²Ä²Ä²Äù±Äò±Äë±Ää±ÄݱÄÖ±ÄϱÄȱÄÁ±Äº±Ä³±Ä¬±Ä¥±Äž±Ä—±Ä±Ä‰±Ä‚±Ä{±Ät±Äm±Äf±Ä_±ÄX±ÄQ±ÄJ±ÄC±Ä<±Ä5±Ä.±Ä'±Ä ±Ä±Ä±Ä ±Ä±Äý°Äö°Äï°Äè°Äá°ÄÚ°ÄÓ°Ä̰ÄŰľ°Ä·°Ä°°Ä©°Ä¢°Ä›°Ä”°Ä°Ä†°Ä°Äx°Äq°Äj°Äc°Ä\°ÄU°ÄN°ÄG°Ä@°Ä9°Ä2°Ä+°Ä$°Ä°Ä°Ä°Ä°Ä°Äú¯Äó¯Äì¯Äå¯ÄÞ¯ÄׯÄЯÄɯįϝĴ¯Ä­¯Ä¦¯ÄŸ¯Ä˜¯Ä‘¯ÄНă¯Ä|¯Äu¯Än¯Äg¯Ä`¯ÄY¯ÄR¯ÄK¯ÄD¯Ä=¯Ä6¯Ä/¯Ä(¯Ä!¯Ä¯Ä¯Ä ¯Ä¯Äþ®Ä÷®Äð®Äé®Äâ®ÄÛ®ÄÔ®ÄÍ®ÄÆ®Ä¿®Ä¸®Ä±®Äª®Ä£®Äœ®Ä•®Äޮć®Ä€®Äy®Är®Äk®Äd®Ä]®ÄV®ÄO®ÄH®ÄA®Ä:®Ä3®Ä,®Ä%®Ä®Ä®Ä®Ä ®Ä®Äû­Äô­Äí­Äæ­Äß­ÄØ­ÄÑ­ÄÊ­Äíļ­Äµ­Ä®­Ä§­Ä ­Ä™­Ä’­Ä‹­Ä„­Ä}­Äv­Äo­Äh­Äa­ÄZ­ÄS­ÄL­ÄE­Ä>­Ä7­Ä0­Ä)­Ä"­Ä­Ä­Ä ­Ä­Äÿ¬Äø¬Äñ¬Äê¬Äã¬ÄܬÄÕ¬ÄάÄǬÄÀ¬Ä¹¬Ä²¬Ä«¬Ä¤¬Ä¬Ä–¬Ä¬Äˆ¬Ä¬Äz¬Äs¬Äl¬Äe¬Ä^¬ÄW¬ÄP¬ÄI¬ÄB¬Ä;¬Ä4¬Ä-¬Ä&¬Ä¬Ä¬Ä¬Ä ¬Ä¬Äü«Äõ«Äî«Äç«Äà«ÄÙ«ÄÒ«ÄË«ÄīĽ«Ä¶«Ä¯«Ä¨«Ä¡«Äš«Ä“«ÄŒ«Ä…«Ä~«Äw«Äp«Äi«Äb«Ä[«ÄT«ÄM«ÄF«Ä?«Ä8«Ä1«Ä*«Ä#«Ä«Ä«Ä«Ä«Ä«ÄùªÄòªÄëªÄäªÄݪÄÖªÄϪÄȪÄÁªÄºªÄ³ªÄ¬ªÄ¥ªÄžªÄ—ªÄªÄ‰ªÄ‚ªÄ{ªÄtªÄmªÄfªÄ_ªÄXªÄQªÄJªÄCªÄ<ªÄ5ªÄ.ªÄ'ªÄ ªÄªÄªÄ ªÄªÄý©Äö©Äï©Äè©Äá©ÄÚ©ÄÓ©ÄÌ©Äũľ©Ä·©Ä°©Ä©©Ä¢©Ä›©Ä”©Ä©Ä†©Ä©Äx©Äq©Äj©Äc©Ä\©ÄU©ÄN©ÄG©Ä@©Ä9©Ä2©Ä+©Ä$©Ä©Ä©Ä©Ä©Ä©Äú¨Äó¨Äì¨Äå¨ÄÞ¨ÄרÄШÄɨĨύĴ¨Ä­¨Ä¦¨ÄŸ¨Ä˜¨Ä‘¨ÄЍă¨Ä|¨Äu¨Än¨Äg¨Ä`¨ÄY¨ÄR¨ÄK¨ÄD¨Ä=¨Ä6¨Ä/¨Ä(¨Ä!¨Ä¨Ä¨Ä ¨Ä¨Äþ§Ä÷§Äð§Äé§Äâ§ÄÛ§ÄÔ§ÄͧÄƧÄ¿§Ä¸§Ä±§Äª§Ä£§Äœ§Ä•§Äާć§Ä€§Äy§Är§Äk§Äd§Ä]§ÄV§ÄO§ÄH§ÄA§Ä:§Ä3§Ä,§Ä%§Ä§Ä§Ä§Ä §Ä§Äû¦Äô¦Äí¦Äæ¦ÄߦÄئÄѦÄʦĿļ¦Äµ¦Ä®¦Ä§¦Ä ¦Ä™¦Ä’¦Ä‹¦Ä„¦Ä}¦Äv¦Äo¦Äh¦Äa¦ÄZ¦ÄS¦ÄL¦ÄE¦Ä>¦Ä7¦Ä0¦Ä)¦Ä"¦Ä¦Ä¦Ä ¦Ä¦Äÿ¥Äø¥Äñ¥Äê¥Äã¥ÄÜ¥ÄÕ¥ÄÎ¥ÄÇ¥ÄÀ¥Ä¹¥Ä²¥Ä«¥Ä¤¥Ä¥Ä–¥Ä¥Äˆ¥Ä¥Äz¥Äs¥Äl¥Äe¥Ä^¥ÄW¥ÄP¥ÄI¥ÄB¥Ä;¥Ä4¥Ä-¥Ä&¥Ä¥Ä¥Ä¥Ä ¥Ä¥Äü¤Äõ¤Äî¤Äç¤Äà¤ÄÙ¤ÄÒ¤ÄˤÄĤĽ¤Ä¶¤Ä¯¤Ä¨¤Ä¡¤Äš¤Ä“¤ÄŒ¤Ä…¤Ä~¤Äw¤Äp¤Äi¤Äb¤Ä[¤ÄT¤ÄM¤ÄF¤Ä?¤Ä8¤Ä1¤Ä*¤Ä#¤Ä¤Ä¤Ä¤Ä¤Ä¤Äù£Äò£Äë£Ää£ÄÝ£ÄÖ£ÄÏ£ÄÈ£ÄÁ£Äº£Ä³£Ä¬£Ä¥£Äž£Ä—£Ä£Ä‰£Ä‚£Ä{£Ät£Äm£Äf£Ä_£ÄX£ÄQ£ÄJ£ÄC£Ä<£Ä5£Ä.£Ä'£Ä £Ä£Ä£Ä £Ä£Äý¢Äö¢Äï¢Äè¢Äá¢ÄÚ¢ÄÓ¢ÄÌ¢ÄŢľ¢Ä·¢Ä°¢Ä©¢Ä¢¢Ä›¢Ä”¢Ä¢Ä†¢Ä¢Äx¢Äq¢Äj¢Äc¢Ä\¢ÄU¢ÄN¢ÄG¢Ä@¢Ä9¢Ä2¢Ä+¢Ä$¢Ä¢Ä¢Ä¢Ä¢Ä¢Äú¡Äó¡Äì¡Äå¡ÄÞ¡ÄסÄСÄɡġϡĴ¡Ä­¡Ä¦¡ÄŸ¡Ä˜¡Ä‘¡ÄŠ¡Äƒ¡Ä|¡Äu¡Än¡Äg¡Ä`¡ÄY¡ÄR¡ÄK¡ÄD¡Ä=¡Ä6¡Ä/¡Ä(¡Ä!¡Ä¡Ä¡Ä ¡Ä¡Äþ Ä÷ Äð Äé Äâ ÄÛ ÄÔ ÄÍ ÄÆ Ä¿ Ä¸ Ä± Äª Ä£ Äœ Ä• Äޠć Ä€ Äy Är Äk Äd Ä] ÄV ÄO ÄH ÄA Ä: Ä3 Ä, Ä% Ä Ä Ä Ä  Ä ÄûŸÄôŸÄíŸÄæŸÄߟÄØŸÄÑŸÄÊŸÄßļŸÄµŸÄ®ŸÄ§ŸÄ ŸÄ™ŸÄ’ŸÄ‹ŸÄ„ŸÄ}ŸÄvŸÄoŸÄhŸÄaŸÄZŸÄSŸÄLŸÄEŸÄ>ŸÄ7ŸÄ0ŸÄ)ŸÄ"ŸÄŸÄŸÄ ŸÄŸÄÿžÄøžÄñžÄêžÄãžÄÜžÄÕžÄΞÄÇžÄÀžÄ¹žÄ²žÄ«žÄ¤žÄžÄ–žÄžÄˆžÄžÄzžÄsžÄlžÄežÄ^žÄWžÄPžÄIžÄBžÄ;žÄ4žÄ-žÄ&žÄžÄžÄžÄ žÄžÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùœÄòœÄëœÄäœÄÝœÄÖœÄÏœÄÈœÄÁœÄºœÄ³œÄ¬œÄ¥œÄžœÄ—œÄœÄ‰œÄ‚œÄ{œÄtœÄmœÄfœÄ_œÄXœÄQœÄJœÄCœÄ<œÄ5œÄ.œÄ'œÄ œÄœÄœÄ œÄœÄý›Äö›Äï›Äè›Äá›ÄÚ›ÄÓ›ÄÌ›Äśľ›Ä·›Ä°›Ä©›Ä¢›Ä››Ä”›Ä›Ä†›Ä›Äx›Äq›Äj›Äc›Ä\›ÄU›ÄN›ÄG›Ä@›Ä9›Ä2›Ä+›Ä$›Ä›Ä›Ä›Ä›Ä›ÄúšÄóšÄìšÄåšÄÞšÄךÄКÄɚĚĻšÄ´šÄ­šÄ¦šÄŸšÄ˜šÄ‘šÄŠšÄƒšÄ|šÄušÄnšÄgšÄ`šÄYšÄRšÄKšÄDšÄ=šÄ6šÄ/šÄ(šÄ!šÄšÄšÄ šÄšÄþ™Ä÷™Äð™Äé™Äâ™ÄÛ™ÄÔ™ÄÍ™ÄÆ™Ä¿™Ä¸™Ä±™Äª™Ä£™Äœ™Ä•™Äޙć™Ä€™Äy™Är™Äk™Äd™Ä]™ÄV™ÄO™ÄH™ÄA™Ä:™Ä3™Ä,™Ä%™Ä™Ä™Ä™Ä ™Ä™Äû˜Äô˜Äí˜Äæ˜ÄߘÄؘÄјÄʘĨļ˜Äµ˜Ä®˜Ä§˜Ä ˜Ä™˜Ä’˜Ä‹˜Ä„˜Ä}˜Äv˜Äo˜Äh˜Äa˜ÄZ˜ÄS˜ÄL˜ÄE˜Ä>˜Ä7˜Ä0˜Ä)˜Ä"˜Ä˜Ä˜Ä ˜Ä˜Äÿ—Äø—Äñ—Äê—Äã—ÄÜ—ÄÕ—ÄΗÄÇ—ÄÀ—Ĺ—IJ—Ä«—Ĥ—Ä—Ä–—ėĈ—Ä—Äz—Äs—Äl—Äe—Ä^—ÄW—ÄP—ÄI—ÄB—Ä;—Ä4—Ä-—Ä&—Ä—Ä—Ä—Ä —Ä—Äü–Äõ–Äî–Äç–Äà–ÄÙ–ÄÒ–ÄË–ÄĖĽ–Ķ–į–Ĩ–Ä¡–Äš–Ä“–ÄŒ–Ä…–Ä~–Äw–Äp–Äi–Äb–Ä[–ÄT–ÄM–ÄF–Ä?–Ä8–Ä1–Ä*–Ä#–Ä–Ä–Ä–Ä–Ä–Äù•Äò•Äë•Ää•ÄÝ•ÄÖ•ÄÏ•ÄÈ•ÄÁ•ĺ•ij•Ĭ•Ä¥•Äž•Ä—•ĕĉ•Ä‚•Ä{•Ät•Äm•Äf•Ä_•ÄX•ÄQ•ÄJ•ÄC•Ä<•Ä5•Ä.•Ä'•Ä •Ä•Ä•Ä •Ä•Äý”Äö”Äï”Äè”Äá”ÄÚ”ÄÓ”ÄÌ”ÄŔľ”Ä·”ݔĩ”Ä¢”Ä›”Ä””ĔƔĔÄx”Äq”Äj”Äc”Ä\”ÄU”ÄN”ÄG”Ä@”Ä9”Ä2”Ä+”Ä$”ĔĔĔĔĔÄú“Äó“Äì“Äå“ÄÞ“ÄדÄГÄɓēϓĴ“Ä­“Ħ“ÄŸ“ʓđ“ÄŠ“ă“Ä|“Äu“Än“Äg“Ä`“ÄY“ÄR“ÄK“ÄD“Ä=“Ä6“Ä/“Ä(“Ä!“Ä“Ä“Ä “Ä“Äþ’Ä÷’Äð’Äé’Äâ’ÄÛ’ÄÔ’ÄÍ’ÄÆ’Ä¿’ĸ’ı’Ī’Ä£’Äœ’Ä•’ÄŽ’ć’Ä€’Äy’Är’Äk’Äd’Ä]’ÄV’ÄO’ÄH’ÄA’Ä:’Ä3’Ä,’Ä%’Ä’Ä’Ä’Ä ’Ä’Äû‘Äô‘Äí‘Äæ‘ÄߑĨ‘ÄÑ‘ÄÊ‘ÄÑļ‘ĵ‘Ä®‘ħ‘Ä ‘Ä™‘Ä’‘Ä‹‘Ä„‘Ä}‘Äv‘Äo‘Äh‘Äa‘ÄZ‘ÄS‘ÄL‘ÄE‘Ä>‘Ä7‘Ä0‘Ä)‘Ä"‘Ä‘Ä‘Ä ‘Ä‘ÄÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùŽÄòŽÄëŽÄäŽÄÝŽÄÖŽÄÏŽÄÈŽÄÁŽÄºŽÄ³ŽÄ¬ŽÄ¥ŽÄžŽÄ—ŽÄŽÄ‰ŽÄ‚ŽÄ{ŽÄtŽÄmŽÄfŽÄ_ŽÄXŽÄQŽÄJŽÄCŽÄ<ŽÄ5ŽÄ.ŽÄ'ŽÄ ŽÄŽÄŽÄ ŽÄŽÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúŒÄóŒÄìŒÄåŒÄÞŒÄ׌ÄÐŒÄÉŒÄŒĻŒÄ´ŒÄ­ŒÄ¦ŒÄŸŒÄ˜ŒÄ‘ŒÄŠŒÄƒŒÄ|ŒÄuŒÄnŒÄgŒÄ`ŒÄYŒÄRŒÄKŒÄDŒÄ=ŒÄ6ŒÄ/ŒÄ(ŒÄ!ŒÄŒÄŒÄ ŒÄŒÄþ‹Ä÷‹Äð‹Äé‹Äâ‹ÄÛ‹ÄÔ‹ÄÍ‹ÄÆ‹Ä¿‹Ä¸‹Ä±‹Äª‹Ä£‹Äœ‹Ä•‹Äދć‹Ä€‹Äy‹Är‹Äk‹Äd‹Ä]‹ÄV‹ÄO‹ÄH‹ÄA‹Ä:‹Ä3‹Ä,‹Ä%‹Ä‹Ä‹Ä‹Ä ‹Ä‹ÄûŠÄôŠÄíŠÄæŠÄߊÄØŠÄÑŠÄÊŠÄÊļŠÄµŠÄ®ŠÄ§ŠÄ ŠÄ™ŠÄ’ŠÄ‹ŠÄ„ŠÄ}ŠÄvŠÄoŠÄhŠÄaŠÄZŠÄSŠÄLŠÄEŠÄ>ŠÄ7ŠÄ0ŠÄ)ŠÄ"ŠÄŠÄŠÄ ŠÄŠÄÿ‰Äø‰Äñ‰Äê‰Äã‰Ä܉ÄÕ‰ÄΉÄljÄÀ‰Ä¹‰Ä²‰Ä«‰Ä¤‰Ä‰Ä–‰Ä‰Äˆ‰Ä‰Äz‰Äs‰Äl‰Äe‰Ä^‰ÄW‰ÄP‰ÄI‰ÄB‰Ä;‰Ä4‰Ä-‰Ä&‰Ä‰Ä‰Ä‰Ä ‰Ä‰ÄüˆÄõˆÄîˆÄçˆÄàˆÄÙˆÄÒˆÄˈÄĈĽˆÄ¶ˆÄ¯ˆÄ¨ˆÄ¡ˆÄšˆÄ“ˆÄŒˆÄ…ˆÄ~ˆÄwˆÄpˆÄiˆÄbˆÄ[ˆÄTˆÄMˆÄFˆÄ?ˆÄ8ˆÄ1ˆÄ*ˆÄ#ˆÄˆÄˆÄˆÄˆÄˆÄù‡Äò‡Äë‡Ää‡Ä݇ÄÖ‡ÄχÄȇÄÁ‡Äº‡Ä³‡Ä¬‡Ä¥‡Äž‡Ä—‡Ä‡Ä‰‡Ä‚‡Ä{‡Ät‡Äm‡Äf‡Ä_‡ÄX‡ÄQ‡ÄJ‡ÄC‡Ä<‡Ä5‡Ä.‡Ä'‡Ä ‡Ä‡Ä‡Ä ‡Ä‡Äý†Äö†Äï†Äè†Äá†ÄÚ†ÄÓ†Ä̆Äņľ†Ä·†Ä°†Ä©†Ä¢†Ä›†Ä”†Ä†Ä††Ä†Äx†Äq†Äj†Äc†Ä\†ÄU†ÄN†ÄG†Ä@†Ä9†Ä2†Ä+†Ä$†Ä†Ä†Ä†Ä†Ä†Äú…Äó…Äì…Äå…ÄÞ…Ä×…ÄÐ…ÄÉ…ÄÂ…Ä»…Ä´…Ä­…Ħ…ÄŸ…Ę…Ä‘…ÄŠ…ă…Ä|…Äu…Än…Äg…Ä`…ÄY…ÄR…ÄK…ÄD…Ä=…Ä6…Ä/…Ä(…Ä!…Ä…Ä…Ä …Ä…Äþ„Ä÷„Äð„Äé„Äâ„ÄÛ„ÄÔ„ÄÍ„ÄÆ„Ä¿„ĸ„ı„΄ģ„Äœ„Ä•„ÄŽ„ć„Ä€„Äy„Är„Äk„Äd„Ä]„ÄV„ÄO„ÄH„ÄA„Ä:„Ä3„Ä,„Ä%„Ä„Ä„Ä„Ä „Ä„ÄûƒÄôƒÄíƒÄæƒÄ߃Ä؃ÄуÄʃÄÃļƒÄµƒÄ®ƒÄ§ƒÄ ƒÄ™ƒÄ’ƒÄ‹ƒÄ„ƒÄ}ƒÄvƒÄoƒÄhƒÄaƒÄZƒÄSƒÄLƒÄEƒÄ>ƒÄ7ƒÄ0ƒÄ)ƒÄ"ƒÄƒÄƒÄ ƒÄƒÄÿ‚Äø‚Äñ‚Äê‚Äã‚ÄÜ‚ÄÕ‚Ä΂ÄÇ‚ÄÀ‚Ĺ‚IJ‚Ä«‚Ĥ‚ĂĖ‚ĂĈ‚Ä‚Äz‚Äs‚Äl‚Äe‚Ä^‚ÄW‚ÄP‚ÄI‚ÄB‚Ä;‚Ä4‚Ä-‚Ä&‚Ä‚Ä‚Ä‚Ä ‚Ä‚ÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄù€Äò€Äë€Ää€ÄÝ€ÄÖ€ÄÏ€ÄÈ€ÄÁ€Äº€Ä³€Ä¬€Ä¥€Äž€Ä—€Ä€Ä‰€Ä‚€Ä{€Ät€Äm€Äf€Ä_€ÄX€ÄQ€ÄJ€ÄC€Ä<€Ä5€Ä.€Ä'€Ä €Ä€Ä€Ä €Ä€ÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄú~Äó~Äì~Äå~ÄÞ~Ä×~ÄÐ~ÄÉ~ÄÂ~Ä»~Ä´~Ä­~Ħ~ÄŸ~Ę~Ä‘~ÄŠ~ă~Ä|~Äu~Än~Äg~Ä`~ÄY~ÄR~ÄK~ÄD~Ä=~Ä6~Ä/~Ä(~Ä!~Ä~Ä~Ä ~Ä~Äþ}Ä÷}Äð}Äé}Äâ}ÄÛ}ÄÔ}ÄÍ}ÄÆ}Ä¿}ĸ}ı}Ī}Ä£}Äœ}Ä•}ÄŽ}ć}Ä€}Äy}Är}Äk}Äd}Ä]}ÄV}ÄO}ÄH}ÄA}Ä:}Ä3}Ä,}Ä%}Ä}Ä}Ä}Ä }Ä}Äû|Äô|Äí|Äæ|Äß|ÄØ|ÄÑ|ÄÊ|ÄÃ|ļ|ĵ|Ä®|ħ|Ä |Ä™|Ä’|Ä‹|Ä„|Ä}|Äv|Äo|Äh|Äa|ÄZ|ÄS|ÄL|ÄE|Ä>|Ä7|Ä0|Ä)|Ä"|Ä|Ä|Ä |Ä|Äÿ{Äø{Äñ{Äê{Äã{ÄÜ{ÄÕ{ÄÎ{ÄÇ{ÄÀ{Ĺ{IJ{Ä«{Ĥ{Ä{Ä–{Ä{Ĉ{Ä{Äz{Äs{Äl{Äe{Ä^{ÄW{ÄP{ÄI{ÄB{Ä;{Ä4{Ä-{Ä&{Ä{Ä{Ä{Ä {Ä{ÄüzÄõzÄîzÄçzÄàzÄÙzÄÒzÄËzÄÄzĽzĶzįzĨzÄ¡zÄšzÄ“zÄŒzÄ…zÄ~zÄwzÄpzÄizÄbzÄ[zÄTzÄMzÄFzÄ?zÄ8zÄ1zÄ*zÄ#zÄzÄzÄzÄzÄzÄùyÄòyÄëyÄäyÄÝyÄÖyÄÏyÄÈyÄÁyĺyijyĬyÄ¥yÄžyÄ—yÄyĉyÄ‚yÄ{yÄtyÄmyÄfyÄ_yÄXyÄQyÄJyÄCyÄuÄ7uÄ0uÄ)uÄ"uÄuÄuÄ uÄuÄÿtÄøtÄñtÄêtÄãtÄÜtÄÕtÄÎtÄÇtÄÀtĹtIJtÄ«tĤtÄtÄ–tÄtĈtÄtÄztÄstÄltÄetÄ^tÄWtÄPtÄItÄBtÄ;tÄ4tÄ-tÄ&tÄtÄtÄtÄ tÄtÄüsÄõsÄîsÄçsÄàsÄÙsÄÒsÄËsÄÄsĽsĶsįsĨsÄ¡sÄšsÄ“sÄŒsÄ…sÄ~sÄwsÄpsÄisÄbsÄ[sÄTsÄMsÄFsÄ?sÄ8sÄ1sÄ*sÄ#sÄsÄsÄsÄsÄsÄùrÄòrÄërÄärÄÝrÄÖrÄÏrÄÈrÄÁrĺrijrĬrÄ¥rÄžrÄ—rÄrĉrÄ‚rÄ{rÄtrÄmrÄfrÄ_rÄXrÄQrÄJrÄCrÄnÄ7nÄ0nÄ)nÄ"nÄnÄnÄ nÄnÄÿmÄømÄñmÄêmÄãmÄÜmÄÕmÄÎmÄÇmÄÀmĹmIJmÄ«mĤmÄmÄ–mÄmĈmÄmÄzmÄsmÄlmÄemÄ^mÄWmÄPmÄImÄBmÄ;mÄ4mÄ-mÄ&mÄmÄmÄmÄ mÄmÄülÄõlÄîlÄçlÄàlÄÙlÄÒlÄËlÄÄlĽlĶlįlĨlÄ¡lÄšlÄ“lÄŒlÄ…lÄ~lÄwlÄplÄilÄblÄ[lÄTlÄMlÄFlÄ?lÄ8lÄ1lÄ*lÄ#lÄlÄlÄlÄlÄlÄùkÄòkÄëkÄäkÄÝkÄÖkÄÏkÄÈkÄÁkĺkijkĬkÄ¥kÄžkÄ—kÄkĉkÄ‚kÄ{kÄtkÄmkÄfkÄ_kÄXkÄQkÄJkÄCkÄgÄ7gÄ0gÄ)gÄ"gÄgÄgÄ gÄgÄÿfÄøfÄñfÄêfÄãfÄÜfÄÕfÄÎfÄÇfÄÀfĹfIJfÄ«fĤfÄfÄ–fÄfĈfÄfÄzfÄsfÄlfÄefÄ^fÄWfÄPfÄIfÄBfÄ;fÄ4fÄ-fÄ&fÄfÄfÄfÄ fÄfÄüeÄõeÄîeÄçeÄàeÄÙeÄÒeÄËeÄÄeĽeĶeįeĨeÄ¡eÄšeÄ“eÄŒeÄ…eÄ~eÄweÄpeÄieÄbeÄ[eÄTeÄMeÄFeÄ?eÄ8eÄ1eÄ*eÄ#eÄeÄeÄeÄeÄeÄùdÄòdÄëdÄädÄÝdÄÖdÄÏdÄÈdÄÁdĺdijdĬdÄ¥dÄždÄ—dÄdĉdÄ‚dÄ{dÄtdÄmdÄfdÄ_dÄXdÄQdÄJdÄCdÄ`Ä7`Ä0`Ä)`Ä"`Ä`Ä`Ä `Ä`Äÿ_Äø_Äñ_Äê_Äã_ÄÜ_ÄÕ_ÄÎ_ÄÇ_ÄÀ_Ĺ_IJ_Ä«_Ĥ_Ä_Ä–_Ä_Ĉ_Ä_Äz_Äs_Äl_Äe_Ä^_ÄW_ÄP_ÄI_ÄB_Ä;_Ä4_Ä-_Ä&_Ä_Ä_Ä_Ä _Ä_Äü^Äõ^Äî^Äç^Äà^ÄÙ^ÄÒ^ÄË^ÄÄ^Ľ^Ķ^į^Ĩ^Ä¡^Äš^Ä“^ÄŒ^Ä…^Ä~^Äw^Äp^Äi^Äb^Ä[^ÄT^ÄM^ÄF^Ä?^Ä8^Ä1^Ä*^Ä#^Ä^Ä^Ä^Ä^Ä^Äù]Äò]Äë]Ää]ÄÝ]ÄÖ]ÄÏ]ÄÈ]ÄÁ]ĺ]ij]Ĭ]Ä¥]Äž]Ä—]Ä]ĉ]Ä‚]Ä{]Ät]Äm]Äf]Ä_]ÄX]ÄQ]ÄJ]ÄC]Ä<]Ä5]Ä.]Ä']Ä ]Ä]Ä]Ä ]Ä]Äý\Äö\Äï\Äè\Äá\ÄÚ\ÄÓ\ÄÌ\ÄÅ\ľ\Ä·\İ\Ä©\Ä¢\Ä›\Ä”\Ä\Ć\Ä\Äx\Äq\Äj\Äc\Ä\\ÄU\ÄN\ÄG\Ä@\Ä9\Ä2\Ä+\Ä$\Ä\Ä\Ä\Ä\Ä\Äú[Äó[Äì[Äå[ÄÞ[Ä×[ÄÐ[ÄÉ[ÄÂ[Ä»[Ä´[Ä­[Ħ[ÄŸ[Ę[Ä‘[ÄŠ[ă[Ä|[Äu[Än[Äg[Ä`[ÄY[ÄR[ÄK[ÄD[Ä=[Ä6[Ä/[Ä([Ä![Ä[Ä[Ä [Ä[ÄþZÄ÷ZÄðZÄéZÄâZÄÛZÄÔZÄÍZÄÆZÄ¿ZĸZıZĪZÄ£ZÄœZÄ•ZÄŽZćZÄ€ZÄyZÄrZÄkZÄdZÄ]ZÄVZÄOZÄHZÄAZÄ:ZÄ3ZÄ,ZÄ%ZÄZÄZÄZÄ ZÄZÄûYÄôYÄíYÄæYÄßYÄØYÄÑYÄÊYÄÃYļYĵYÄ®YħYÄ YÄ™YÄ’YÄ‹YÄ„YÄ}YÄvYÄoYÄhYÄaYÄZYÄSYÄLYÄEYÄ>YÄ7YÄ0YÄ)YÄ"YÄYÄYÄ YÄYÄÿXÄøXÄñXÄêXÄãXÄÜXÄÕXÄÎXÄÇXÄÀXĹXIJXÄ«XĤXÄXÄ–XÄXĈXÄXÄzXÄsXÄlXÄeXÄ^XÄWXÄPXÄIXÄBXÄ;XÄ4XÄ-XÄ&XÄXÄXÄXÄ XÄXÄüWÄõWÄîWÄçWÄàWÄÙWÄÒWÄËWÄÄWĽWĶWįWĨWÄ¡WÄšWÄ“WÄŒWÄ…WÄ~WÄwWÄpWÄiWÄbWÄ[WÄTWÄMWÄFWÄ?WÄ8WÄ1WÄ*WÄ#WÄWÄWÄWÄWÄWÄùVÄòVÄëVÄäVÄÝVÄÖVÄÏVÄÈVÄÁVĺVijVĬVÄ¥VÄžVÄ—VÄVĉVÄ‚VÄ{VÄtVÄmVÄfVÄ_VÄXVÄQVÄJVÄCVÄRÄ7RÄ0RÄ)RÄ"RÄRÄRÄ RÄRÄÿQÄøQÄñQÄêQÄãQÄÜQÄÕQÄÎQÄÇQÄÀQĹQIJQÄ«QĤQÄQÄ–QÄQĈQÄQÄzQÄsQÄlQÄeQÄ^QÄWQÄPQÄIQÄBQÄ;QÄ4QÄ-QÄ&QÄQÄQÄQÄ QÄQÄüPÄõPÄîPÄçPÄàPÄÙPÄÒPÄËPÄÄPĽPĶPįPĨPÄ¡PÄšPÄ“PÄŒPÄ…PÄ~PÄwPÄpPÄiPÄbPÄ[PÄTPÄMPÄFPÄ?PÄ8PÄ1PÄ*PÄ#PÄPÄPÄPÄPÄPÄùOÄòOÄëOÄäOÄÝOÄÖOÄÏOÄÈOÄÁOĺOijOĬOÄ¥OÄžOÄ—OÄOĉOÄ‚OÄ{OÄtOÄmOÄfOÄ_OÄXOÄQOÄJOÄCOÄKÄ7KÄ0KÄ)KÄ"KÄKÄKÄ KÄKÄÿJÄøJÄñJÄêJÄãJÄÜJÄÕJÄÎJÄÇJÄÀJĹJIJJÄ«JĤJÄJÄ–JÄJĈJÄJÄzJÄsJÄlJÄeJÄ^JÄWJÄPJÄIJÄBJÄ;JÄ4JÄ-JÄ&JÄJÄJÄJÄ JÄJÄüIÄõIÄîIÄçIÄàIÄÙIÄÒIÄËIÄÄIĽIĶIįIĨIÄ¡IÄšIÄ“IÄŒIÄ…IÄ~IÄwIÄpIÄiIÄbIÄ[IÄTIÄMIÄFIÄ?IÄ8IÄ1IÄ*IÄ#IÄIÄIÄIÄIÄIÄùHÄòHÄëHÄäHÄÝHÄÖHÄÏHÄÈHÄÁHĺHijHĬHÄ¥HÄžHÄ—HÄHĉHÄ‚HÄ{HÄtHÄmHÄfHÄ_HÄXHÄQHÄJHÄCHÄDÄ7DÄ0DÄ)DÄ"DÄDÄDÄ DÄDÄÿCÄøCÄñCÄêCÄãCÄÜCÄÕCÄÎCÄÇCÄÀCĹCIJCÄ«CĤCÄCÄ–CÄCĈCÄCÄzCÄsCÄlCÄeCÄ^CÄWCÄPCÄICÄBCÄ;CÄ4CÄ-CÄ&CÄCÄCÄCÄ CÄCÄüBÄõBÄîBÄçBÄàBÄÙBÄÒBÄËBÄÄBĽBĶBįBĨBÄ¡BÄšBÄ“BÄŒBÄ…BÄ~BÄwBÄpBÄiBÄbBÄ[BÄTBÄMBÄFBÄ?BÄ8BÄ1BÄ*BÄ#BÄBÄBÄBÄBÄBÄùAÄòAÄëAÄäAÄÝAÄÖAÄÏAÄÈAÄÁAĺAijAĬAÄ¥AÄžAÄ—AÄAĉAÄ‚AÄ{AÄtAÄmAÄfAÄ_AÄXAÄQAÄJAÄCAÄÄ÷>Äð>Äé>Äâ>ÄÛ>ÄÔ>ÄÍ>ÄÆ>Ä¿>ĸ>ı>Ī>Ä£>Äœ>Ä•>ÄŽ>ć>Ä€>Äy>Är>Äk>Äd>Ä]>ÄV>ÄO>ÄH>ÄA>Ä:>Ä3>Ä,>Ä%>Ä>Ä>Ä>Ä >Ä>Äû=Äô=Äí=Äæ=Äß=ÄØ=ÄÑ=ÄÊ=ÄÃ=ļ=ĵ=Ä®=ħ=Ä =Ä™=Ä’=Ä‹=Ä„=Ä}=Äv=Äo=Äh=Äa=ÄZ=ÄS=ÄL=ÄE=Ä>=Ä7=Ä0=Ä)=Ä"=Ä=Ä=Ä =Ä=Äÿ<Äø<Äñ<Äê<Äã<ÄÜ<ÄÕ<ÄÎ<ÄÇ<ÄÀ<Ĺ<IJ<Ä«<Ĥ<Ä<Ä–<Ä<Ĉ<Ä<Äz<Äs<Äl<Äe<Ä^<ÄW<ÄP<ÄI<ÄB<Ä;<Ä4<Ä-<Ä&<Ä<Ä<Ä<Ä <Ä<Äü;Äõ;Äî;Äç;Äà;ÄÙ;ÄÒ;ÄË;ÄÄ;Ľ;Ķ;į;Ĩ;Ä¡;Äš;Ä“;ÄŒ;Ä…;Ä~;Äw;Äp;Äi;Äb;Ä[;ÄT;ÄM;ÄF;Ä?;Ä8;Ä1;Ä*;Ä#;Ä;Ä;Ä;Ä;Ä;Äù:Äò:Äë:Ää:ÄÝ:ÄÖ:ÄÏ:ÄÈ:ÄÁ:ĺ:ij:Ĭ:Ä¥:Äž:Ä—:Ä:ĉ:Ä‚:Ä{:Ät:Äm:Äf:Ä_:ÄX:ÄQ:ÄJ:ÄC:Ä<:Ä5:Ä.:Ä':Ä :Ä:Ä:Ä :Ä:Äý9Äö9Äï9Äè9Äá9ÄÚ9ÄÓ9ÄÌ9ÄÅ9ľ9Ä·9İ9Ä©9Ä¢9Ä›9Ä”9Ä9Ć9Ä9Äx9Äq9Äj9Äc9Ä\9ÄU9ÄN9ÄG9Ä@9Ä99Ä29Ä+9Ä$9Ä9Ä9Ä9Ä9Ä9Äú8Äó8Äì8Äå8ÄÞ8Ä×8ÄÐ8ÄÉ8ÄÂ8Ä»8Ä´8Ä­8Ħ8ÄŸ8Ę8Ä‘8ÄŠ8ă8Ä|8Äu8Än8Äg8Ä`8ÄY8ÄR8ÄK8ÄD8Ä=8Ä68Ä/8Ä(8Ä!8Ä8Ä8Ä 8Ä8Äþ7Ä÷7Äð7Äé7Äâ7ÄÛ7ÄÔ7ÄÍ7ÄÆ7Ä¿7ĸ7ı7Ī7Ä£7Äœ7Ä•7ÄŽ7ć7Ä€7Äy7Är7Äk7Äd7Ä]7ÄV7ÄO7ÄH7ÄA7Ä:7Ä37Ä,7Ä%7Ä7Ä7Ä7Ä 7Ä7Äû6Äô6Äí6Äæ6Äß6ÄØ6ÄÑ6ÄÊ6ÄÃ6ļ6ĵ6Ä®6ħ6Ä 6Ä™6Ä’6Ä‹6Ä„6Ä}6Äv6Äo6Äh6Äa6ÄZ6ÄS6ÄL6ÄE6Ä>6Ä76Ä06Ä)6Ä"6Ä6Ä6Ä 6Ä6Äÿ5Äø5Äñ5Äê5Äã5ÄÜ5ÄÕ5ÄÎ5ÄÇ5ÄÀ5Ĺ5IJ5Ä«5Ĥ5Ä5Ä–5Ä5Ĉ5Ä5Äz5Äs5Äl5Äe5Ä^5ÄW5ÄP5ÄI5ÄB5Ä;5Ä45Ä-5Ä&5Ä5Ä5Ä5Ä 5Ä5Äü4Äõ4Äî4Äç4Äà4ÄÙ4ÄÒ4ÄË4ÄÄ4Ľ4Ķ4į4Ĩ4Ä¡4Äš4Ä“4ÄŒ4Ä…4Ä~4Äw4Äp4Äi4Äb4Ä[4ÄT4ÄM4ÄF4Ä?4Ä84Ä14Ä*4Ä#4Ä4Ä4Ä4Ä4Ä4Äù3Äò3Äë3Ää3ÄÝ3ÄÖ3ÄÏ3ÄÈ3ÄÁ3ĺ3ij3Ĭ3Ä¥3Äž3Ä—3Ä3ĉ3Ä‚3Ä{3Ät3Äm3Äf3Ä_3ÄX3ÄQ3ÄJ3ÄC3Ä<3Ä53Ä.3Ä'3Ä 3Ä3Ä3Ä 3Ä3Äý2Äö2Äï2Äè2Äá2ÄÚ2ÄÓ2ÄÌ2ÄÅ2ľ2Ä·2İ2Ä©2Ä¢2Ä›2Ä”2Ä2Ć2Ä2Äx2Äq2Äj2Äc2Ä\2ÄU2ÄN2ÄG2Ä@2Ä92Ä22Ä+2Ä$2Ä2Ä2Ä2Ä2Ä2Äú1Äó1Äì1Äå1ÄÞ1Ä×1ÄÐ1ÄÉ1ÄÂ1Ä»1Ä´1Ä­1Ħ1ÄŸ1Ę1Ä‘1ÄŠ1ă1Ä|1Äu1Än1Äg1Ä`1ÄY1ÄR1ÄK1ÄD1Ä=1Ä61Ä/1Ä(1Ä!1Ä1Ä1Ä 1Ä1Äþ0Ä÷0Äð0Äé0Äâ0ÄÛ0ÄÔ0ÄÍ0ÄÆ0Ä¿0ĸ0ı0Ī0Ä£0Äœ0Ä•0ÄŽ0ć0Ä€0Äy0Är0Äk0Äd0Ä]0ÄV0ÄO0ÄH0ÄA0Ä:0Ä30Ä,0Ä%0Ä0Ä0Ä0Ä 0Ä0Äû/Äô/Äí/Äæ/Äß/ÄØ/ÄÑ/ÄÊ/ÄÃ/ļ/ĵ/Ä®/ħ/Ä /Ä™/Ä’/Ä‹/Ä„/Ä}/Äv/Äo/Äh/Äa/ÄZ/ÄS/ÄL/ÄE/Ä>/Ä7/Ä0/Ä)/Ä"/Ä/Ä/Ä /Ä/Äÿ.Äø.Äñ.Äê.Äã.ÄÜ.ÄÕ.ÄÎ.ÄÇ.ÄÀ.Ĺ.IJ.Ä«.Ĥ.Ä.Ä–.Ä.Ĉ.Ä.Äz.Äs.Äl.Äe.Ä^.ÄW.ÄP.ÄI.ÄB.Ä;.Ä4.Ä-.Ä&.Ä.Ä.Ä.Ä .Ä.Äü-Äõ-Äî-Äç-Äà-ÄÙ-ÄÒ-ÄË-ÄÄ-Ľ-Ķ-į-Ĩ-Ä¡-Äš-Ä“-ÄŒ-Ä…-Ä~-Äw-Äp-Äi-Äb-Ä[-ÄT-ÄM-ÄF-Ä?-Ä8-Ä1-Ä*-Ä#-Ä-Ä-Ä-Ä-Ä-Äù,Äò,Äë,Ää,ÄÝ,ÄÖ,ÄÏ,ÄÈ,ÄÁ,ĺ,ij,Ĭ,Ä¥,Äž,Ä—,Ä,ĉ,Ä‚,Ä{,Ät,Äm,Äf,Ä_,ÄX,ÄQ,ÄJ,ÄC,Ä<,Ä5,Ä.,Ä',Ä ,Ä,Ä,Ä ,Ä,Äý+Äö+Äï+Äè+Äá+ÄÚ+ÄÓ+ÄÌ+ÄÅ+ľ+Ä·+İ+Ä©+Ä¢+Ä›+Ä”+Ä+Ć+Ä+Äx+Äq+Äj+Äc+Ä\+ÄU+ÄN+ÄG+Ä@+Ä9+Ä2+Ä++Ä$+Ä+Ä+Ä+Ä+Ä+Äú*Äó*Äì*Äå*ÄÞ*Ä×*ÄÐ*ÄÉ*ÄÂ*Ä»*Ä´*Ä­*Ħ*ÄŸ*Ę*Ä‘*ÄŠ*ă*Ä|*Äu*Än*Äg*Ä`*ÄY*ÄR*ÄK*ÄD*Ä=*Ä6*Ä/*Ä(*Ä!*Ä*Ä*Ä *Ä*Äþ)Ä÷)Äð)Äé)Äâ)ÄÛ)ÄÔ)ÄÍ)ÄÆ)Ä¿)ĸ)ı)Ī)Ä£)Äœ)Ä•)ÄŽ)ć)Ä€)Äy)Är)Äk)Äd)Ä])ÄV)ÄO)ÄH)ÄA)Ä:)Ä3)Ä,)Ä%)Ä)Ä)Ä)Ä )Ä)Äû(Äô(Äí(Äæ(Äß(ÄØ(ÄÑ(ÄÊ(ÄÃ(ļ(ĵ(Ä®(ħ(Ä (Ä™(Ä’(Ä‹(Ä„(Ä}(Äv(Äo(Äh(Äa(ÄZ(ÄS(ÄL(ÄE(Ä>(Ä7(Ä0(Ä)(Ä"(Ä(Ä(Ä (Ä(Äÿ'Äø'Äñ'Äê'Äã'ÄÜ'ÄÕ'ÄÎ'ÄÇ'ÄÀ'Ĺ'IJ'Ä«'Ĥ'Ä'Ä–'Ä'Ĉ'Ä'Äz'Äs'Äl'Äe'Ä^'ÄW'ÄP'ÄI'ÄB'Ä;'Ä4'Ä-'Ä&'Ä'Ä'Ä'Ä 'Ä'Äü&Äõ&Äî&Äç&Äà&ÄÙ&ÄÒ&ÄË&ÄÄ&Ľ&Ķ&į&Ĩ&Ä¡&Äš&Ä“&ÄŒ&Ä…&Ä~&Äw&Äp&Äi&Äb&Ä[&ÄT&ÄM&ÄF&Ä?&Ä8&Ä1&Ä*&Ä#&Ä&Ä&Ä&Ä&Ä&Äù%Äò%Äë%Ää%ÄÝ%ÄÖ%ÄÏ%ÄÈ%ÄÁ%ĺ%ij%Ĭ%Ä¥%Äž%Ä—%Ä%ĉ%Ä‚%Ä{%Ät%Äm%Äf%Ä_%ÄX%ÄQ%ÄJ%ÄC%Ä<%Ä5%Ä.%Ä'%Ä %Ä%Ä%Ä %Ä%Äý$Äö$Äï$Äè$Äá$ÄÚ$ÄÓ$ÄÌ$ÄÅ$ľ$Ä·$İ$Ä©$Ä¢$Ä›$Ä”$Ä$Ć$Ä$Äx$Äq$Äj$Äc$Ä\$ÄU$ÄN$ÄG$Ä@$Ä9$Ä2$Ä+$Ä$$Ä$Ä$Ä$Ä$Ä$Äú#Äó#Äì#Äå#ÄÞ#Ä×#ÄÐ#ÄÉ#ÄÂ#Ä»#Ä´#Ä­#Ħ#ÄŸ#Ę#Ä‘#ÄŠ#ă#Ä|#Äu#Än#Äg#Ä`#ÄY#ÄR#ÄK#ÄD#Ä=#Ä6#Ä/#Ä(#Ä!#Ä#Ä#Ä #Ä#Äþ"Ä÷"Äð"Äé"Äâ"ÄÛ"ÄÔ"ÄÍ"ÄÆ"Ä¿"ĸ"ı"Ī"Ä£"Äœ"Ä•"ÄŽ"ć"Ä€"Äy"Är"Äk"Äd"Ä]"ÄV"ÄO"ÄH"ÄA"Ä:"Ä3"Ä,"Ä%"Ä"Ä"Ä"Ä "Ä"Äû!Äô!Äí!Äæ!Äß!ÄØ!ÄÑ!ÄÊ!ÄÃ!ļ!ĵ!Ä®!ħ!Ä !Ä™!Ä’!Ä‹!Ä„!Ä}!Äv!Äo!Äh!Äa!ÄZ!ÄS!ÄL!ÄE!Ä>!Ä7!Ä0!Ä)!Ä"!Ä!Ä!Ä !Ä!Äÿ Äø Äñ Äê Äã ÄÜ ÄÕ ÄÎ ÄÇ ÄÀ Ĺ IJ Ä« Ĥ Ä Ä– Ä Äˆ Ä Äz Äs Äl Äe Ä^ ÄW ÄP ÄI ÄB Ä; Ä4 Ä- Ä& Ä Ä Ä Ä Ä ÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþ Ä÷ Äð Äé Äâ ÄÛ ÄÔ ÄÍ ÄÆ Ä¿ ĸ ı Πģ Äœ Ä• ÄŽ ć Ä€ Äy Är Äk Äd Ä] ÄV ÄO ÄH ÄA Ä: Ä3 Ä, Ä% Ä Ä Ä Ä Ä Äû Äô Äí Äæ Äß ÄØ ÄÑ ÄÊ Äà ļ ĵ Ä® ħ Ä  Ä™ Ä’ Ä‹ Ä„ Ä} Äv Äo Äh Äa ÄZ ÄS ÄL ÄE Ä> Ä7 Ä0 Ä) Ä" Ä Ä Ä Ä Äÿ Äø Äñ Äê Äã ÄÜ ÄÕ ÄÎ ÄÇ ÄÀ Ĺ IJ Ä« Ĥ Ä Ä– Ä Äˆ Ä Äz Äs Äl Äe Ä^ ÄW ÄP ÄI ÄB Ä; Ä4 Ä- Ä& Ä Ä Ä Ä Ä Äü Äõ Äî Äç Äà ÄÙ ÄÒ ÄË ÄÄ Ä½ Ķ į Ĩ Ä¡ Äš Ä“ ÄŒ Ä… Ä~ Äw Äp Äi Äb Ä[ ÄT ÄM ÄF Ä? Ä8 Ä1 Ä* Ä# Ä Ä Ä Ä Ä Äù Äò Äë Ää ÄÝ ÄÖ ÄÏ ÄÈ ÄÁ ĺ ij Ĭ Ä¥ Äž Ä— Ä Ä‰ Ä‚ Ä{ Ät Äm Äf Ä_ ÄX ÄQ ÄJ ÄC Ä< Ä5 Ä. Ä' Ä Ä Ä Ä Ä ÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÿÃ÷ÿÃðÿÃéÿÃâÿÃÛÿÃÔÿÃÍÿÃÆÿÿÿøÿñÿêÿãÿÜÿÕÿÃŽÿÇÿÀÿÃyÿÃrÿÃkÿÃdÿÃ]ÿÃVÿÃOÿÃHÿÃAÿÃ:ÿÃ3ÿÃ,ÿÃ%ÿÃÿÃÿÃÿà ÿÃÿÃûþÃôþÃíþÃæþÃßþÃØþÃÑþÃÊþÃÃþüþõþîþçþàþÙþÃ’þËþÄþÃ}þÃvþÃoþÃhþÃaþÃZþÃSþÃLþÃEþÃ>þÃ7þÃ0þÃ)þÃ"þÃþÃþà þÃþÃÿýÃøýÃñýÃêýÃãýÃÜýÃÕýÃÎýÃÇýÃÀýùýòýëýäýÃýÖýÃýÈýÃýÃzýÃsýÃlýÃeýÃ^ýÃWýÃPýÃIýÃBýÃ;ýÃ4ýÃ-ýÃ&ýÃýÃýÃýà ýÃýÃüüÃõüÃîüÃçüÃàüÃÙüÃÒüÃËüÃÄüýüöüïüèüáüÚüÓüÃŒüÃ…üÃ~üÃwüÃpüÃiüÃbüÃ[üÃTüÃMüÃFüÃ?üÃ8üÃ1üÃ*üÃ#üÃüÃüÃüÃüÃüÃùûÃòûÃëûÃäûÃÝûÃÖûÃÏûÃÈûÃÁûúûóûìûÃ¥ûÞû×ûÃûÉûÂûÃ{ûÃtûÃmûÃfûÃ_ûÃXûÃQûÃJûÃCûÃ<ûÃ5ûÃ.ûÃ'ûà ûÃûÃûà ûÃûÃýúÃöúÃïúÃèúÃáúÃÚúÃÓúÃÌúÃÅúþú÷úðúéúâúÛúÔúÃúÆúÃúÃxúÃqúÃjúÃcúÃ\úÃUúÃNúÃGúÃ@úÃ9úÃ2úÃ+úÃ$úÃúÃúÃúÃúÃúÃúùÃóùÃìùÃåùÃÞùÃ×ùÃÐùÃÉùÃÂùûùôùíùæùßùØùÑùÊùÃùÃ|ùÃuùÃnùÃgùÃ`ùÃYùÃRùÃKùÃDùÃ=ùÃ6ùÃ/ùÃ(ùÃ!ùÃùÃùà ùÃùÃþøÃ÷øÃðøÃéøÃâøÃÛøÃÔøÃÍøÃÆøÃ¿øÃ¸øÃ±øÃªøÃ£øÃœøÃ•øÃŽøÃ‡øÃ€øÃyøÃrøÃkøÃdøÃ]øÃVøÃOøÃHøÃAøÃ:øÃ3øÃ,øÃ%øÃøÃøÃøÃ øÃøÃû÷Ãô÷Ãí÷Ãæ÷Ãß÷ÃØ÷ÃÑ÷ÃÊ÷ÃÃ÷ü÷õ÷î÷ç÷à÷Ù÷Ã’÷Ë÷Ä÷Ã}÷Ãv÷Ão÷Ãh÷Ãa÷ÃZ÷ÃS÷ÃL÷ÃE÷Ã>÷Ã7÷Ã0÷Ã)÷Ã"÷Ã÷Ã÷à ÷Ã÷ÃÿöÃøöÃñöÃêöÃãöÃÜöÃÕöÃÎöÃÇöÃÀöùöòöëöäöÃöÖöÃöÈöÃöÃzöÃsöÃlöÃeöÃ^öÃWöÃPöÃIöÃBöÃ;öÃ4öÃ-öÃ&öÃöÃöÃöà öÃöÃüõÃõõÃîõÃçõÃàõÃÙõÃÒõÃËõÃÄõýõöõïõèõáõÚõÓõÃŒõÃ…õÃ~õÃwõÃpõÃiõÃbõÃ[õÃTõÃMõÃFõÃ?õÃ8õÃ1õÃ*õÃ#õÃõÃõÃõÃõÃõÃùôÃòôÃëôÃäôÃÝôÃÖôÃÏôÃÈôÃÁôúôóôìôÃ¥ôÞô×ôÃôÉôÂôÃ{ôÃtôÃmôÃfôÃ_ôÃXôÃQôÃJôÃCôÃ<ôÃ5ôÃ.ôÃ'ôà ôÃôÃôà ôÃôÃýóÃöóÃïóÃèóÃáóÃÚóÃÓóÃÌóÃÅóþó÷óðóéóâóÛóÔóÃóÆóÃóÃxóÃqóÃjóÃcóÃ\óÃUóÃNóÃGóÃ@óÃ9óÃ2óÃ+óÃ$óÃóÃóÃóÃóÃóÃúòÃóòÃìòÃåòÃÞòÃ×òÃÐòÃÉòÃÂòûòôòíòæòßòØòÑòÊòÃòÃ|òÃuòÃnòÃgòÃ`òÃYòÃRòÃKòÃDòÃ=òÃ6òÃ/òÃ(òÃ!òÃòÃòà òÃòÃþñÃ÷ñÃðñÃéñÃâñÃÛñÃÔñÃÍñÃÆñÿñøñññêñãñÜñÕñÃŽñÇñÀñÃyñÃrñÃkñÃdñÃ]ñÃVñÃOñÃHñÃAñÃ:ñÃ3ñÃ,ñÃ%ñÃñÃñÃñà ñÃñÃûðÃôðÃíðÃæðÃßðÃØðÃÑðÃÊðÃÃðüðõðîðçðàðÙðÃ’ðËðÄðÃ}ðÃvðÃoðÃhðÃaðÃZðÃSðÃLðÃEðÃ>ðÃ7ðÃ0ðÃ)ðÃ"ðÃðÃðà ðÃðÃÿïÃøïÃñïÃêïÃãïÃÜïÃÕïÃÎïÃÇïÃÀïùïòïëïäïÃïÖïÃïÈïÃïÃzïÃsïÃlïÃeïÃ^ïÃWïÃPïÃIïÃBïÃ;ïÃ4ïÃ-ïÃ&ïÃïÃïÃïà ïÃïÃüîÃõîÃîîÃçîÃàîÃÙîÃÒîÃËîÃÄîýîöîïîèîáîÚîÓîÃŒîÃ…îÃ~îÃwîÃpîÃiîÃbîÃ[îÃTîÃMîÃFîÃ?îÃ8îÃ1îÃ*îÃ#îÃîÃîÃîÃîÃîÃùíÃòíÃëíÃäíÃÝíÃÖíÃÏíÃÈíÃÁíúíóíìíÃ¥íÞí×íÃíÉíÂíÃ{íÃtíÃmíÃfíÃ_íÃXíÃQíÃJíÃCíÃ<íÃ5íÃ.íÃ'íà íÃíÃíà íÃíÃýìÃöìÃïìÃèìÃáìÃÚìÃÓìÃÌìÃÅìþì÷ìðìéìâìÛìÔìÃìÆìÃìÃxìÃqìÃjìÃcìÃ\ìÃUìÃNìÃGìÃ@ìÃ9ìÃ2ìÃ+ìÃ$ìÃìÃìÃìÃìÃìÃúëÃóëÃìëÃåëÃÞëÃ×ëÃÐëÃÉëÃÂëûëôëíëæëßëØëÑëÊëÃëÃ|ëÃuëÃnëÃgëÃ`ëÃYëÃRëÃKëÃDëÃ=ëÃ6ëÃ/ëÃ(ëÃ!ëÃëÃëà ëÃëÃþêÃ÷êÃðêÃéêÃâêÃÛêÃÔêÃÍêÃÆêÿêøêñêêêãêÜêÕêÃŽêÇêÀêÃyêÃrêÃkêÃdêÃ]êÃVêÃOêÃHêÃAêÃ:êÃ3êÃ,êÃ%êÃêÃêÃêà êÃêÃûéÃôéÃíéÃæéÃßéÃØéÃÑéÃÊéÃÃéüéõéîéçéàéÙéÃ’éËéÄéÃ}éÃvéÃoéÃhéÃaéÃZéÃSéÃLéÃEéÃ>éÃ7éÃ0éÃ)éÃ"éÃéÃéà éÃéÃÿèÃøèÃñèÃêèÃãèÃÜèÃÕèÃÎèÃÇèÃÀèùèòèëèäèÃèÖèÃèÈèÃèÃzèÃsèÃlèÃeèÃ^èÃWèÃPèÃIèÃBèÃ;èÃ4èÃ-èÃ&èÃèÃèÃèà èÃèÃüçÃõçÃîçÃççÃàçÃÙçÃÒçÃËçÃÄçýçöçïçèçáçÚçÓçÃŒçÃ…çÃ~çÃwçÃpçÃiçÃbçÃ[çÃTçÃMçÃFçÃ?çÃ8çÃ1çÃ*çÃ#çÃçÃçÃçÃçÃçÃùæÃòæÃëæÃäæÃÝæÃÖæÃÏæÃÈæÃÁæÃºæÃ³æÃ¬æÃ¥æÃžæÃ—æÃæÃ‰æÃ‚æÃ{æÃtæÃmæÃfæÃ_æÃXæÃQæÃJæÃCæÃ<æÃ5æÃ.æÃ'æÃ æÃæÃæÃ æÃæÃýåÃöåÃïåÃèåÃáåÃÚåÃÓåÃÌåÃÅåþå÷åðåéåâåÛåÔåÃåÆåÃåÃxåÃqåÃjåÃcåÃ\åÃUåÃNåÃGåÃ@åÃ9åÃ2åÃ+åÃ$åÃåÃåÃåÃåÃåÃúäÃóäÃìäÃåäÃÞäÃ×äÃÐäÃÉäÃÂäûäôäíäæäßäØäÑäÊäÃäÃ|äÃuäÃnäÃgäÃ`äÃYäÃRäÃKäÃDäÃ=äÃ6äÃ/äÃ(äÃ!äÃäÃäà äÃäÃþãÃ÷ãÃðãÃéãÃâãÃÛãÃÔãÃÍãÃÆãÿãøãñãêãããÜãÕãÃŽãÇãÀãÃyãÃrãÃkãÃdãÃ]ãÃVãÃOãÃHãÃAãÃ:ãÃ3ãÃ,ãÃ%ãÃãÃãÃãà ãÃãÃûâÃôâÃíâÃæâÃßâÃØâÃÑâÃÊâÃÃâüâõâîâçâàâÙâÃ’âËâÄâÃ}âÃvâÃoâÃhâÃaâÃZâÃSâÃLâÃEâÃ>âÃ7âÃ0âÃ)âÃ"âÃâÃâà âÃâÃÿáÃøáÃñáÃêáÃãáÃÜáÃÕáÃÎáÃÇáÃÀáùáòáëáäáÃáÖáÃáÈáÃáÃzáÃsáÃláÃeáÃ^áÃWáÃPáÃIáÃBáÃ;áÃ4áÃ-áÃ&áÃáÃáÃáà áÃáÃüàÃõàÃîàÃçàÃààÃÙàÃÒàÃËàÃÄàýàöàïàèàáàÚàÓàÃŒàÃ…àÃ~àÃwàÃpàÃiàÃbàÃ[àÃTàÃMàÃFàÃ?àÃ8àÃ1àÃ*àÃ#àÃàÃàÃàÃàÃàÃùßÃòßÃëßÃäßÃÝßÃÖßÃÏßÃÈßÃÁßúßóßìßÃ¥ßÞß×ßÃßÉßÂßÃ{ßÃtßÃmßÃfßÃ_ßÃXßÃQßÃJßÃCßÃ<ßÃ5ßÃ.ßÃ'ßà ßÃßÃßà ßÃßÃýÞÃöÞÃïÞÃèÞÃáÞÃÚÞÃÓÞÃÌÞÃÅÞþÞ÷ÞðÞéÞâÞÛÞÔÞÃÞÆÞÃÞÃxÞÃqÞÃjÞÃcÞÃ\ÞÃUÞÃNÞÃGÞÃ@ÞÃ9ÞÃ2ÞÃ+ÞÃ$ÞÃÞÃÞÃÞÃÞÃÞÃúÝÃóÝÃìÝÃåÝÃÞÝÃ×ÝÃÐÝÃÉÝÃÂÝûÝôÝíÝæÝßÝØÝÑÝÊÝÃÝÃ|ÝÃuÝÃnÝÃgÝÃ`ÝÃYÝÃRÝÃKÝÃDÝÃ=ÝÃ6ÝÃ/ÝÃ(ÝÃ!ÝÃÝÃÝà ÝÃÝÃþÜÃ÷ÜÃðÜÃéÜÃâÜÃÛÜÃÔÜÃÍÜÃÆÜÿÜøÜñÜêÜãÜÜÜÕÜÃŽÜÇÜÀÜÃyÜÃrÜÃkÜÃdÜÃ]ÜÃVÜÃOÜÃHÜÃAÜÃ:ÜÃ3ÜÃ,ÜÃ%ÜÃÜÃÜÃÜà ÜÃÜÃûÛÃôÛÃíÛÃæÛÃßÛÃØÛÃÑÛÃÊÛÃÃÛüÛõÛîÛçÛàÛÙÛÃ’ÛËÛÄÛÃ}ÛÃvÛÃoÛÃhÛÃaÛÃZÛÃSÛÃLÛÃEÛÃ>ÛÃ7ÛÃ0ÛÃ)ÛÃ"ÛÃÛÃÛà ÛÃÛÃÿÚÃøÚÃñÚÃêÚÃãÚÃÜÚÃÕÚÃÎÚÃÇÚÃÀÚùÚòÚëÚäÚÃÚÖÚÃÚÈÚÃÚÃzÚÃsÚÃlÚÃeÚÃ^ÚÃWÚÃPÚÃIÚÃBÚÃ;ÚÃ4ÚÃ-ÚÃ&ÚÃÚÃÚÃÚà ÚÃÚÃüÙÃõÙÃîÙÃçÙÃàÙÃÙÙÃÒÙÃËÙÃÄÙýÙöÙïÙèÙáÙÚÙÓÙÃŒÙÃ…ÙÃ~ÙÃwÙÃpÙÃiÙÃbÙÃ[ÙÃTÙÃMÙÃFÙÃ?ÙÃ8ÙÃ1ÙÃ*ÙÃ#ÙÃÙÃÙÃÙÃÙÃÙÃùØÃòØÃëØÃäØÃÝØÃÖØÃÏØÃÈØÃÁØÃºØÃ³ØÃ¬ØÃ¥ØÃžØÃ—ØÃØÃ‰ØÃ‚ØÃ{ØÃtØÃmØÃfØÃ_ØÃXØÃQØÃJØÃCØÃ<ØÃ5ØÃ.ØÃ'ØÃ ØÃØÃØÃ ØÃØÃý×Ãö×Ãï×Ãè×Ãá×ÃÚ×ÃÓ×ÃÌ×ÃÅ×þ×÷×ð×é×â×Û×Ô×Ãׯ×Ã×Ãx×Ãq×Ãj×Ãc×Ã\×ÃU×ÃN×ÃG×Ã@×Ã9×Ã2×Ã+×Ã$×Ã×Ã×Ã×Ã×Ã×ÃúÖÃóÖÃìÖÃåÖÃÞÖÃ×ÖÃÐÖÃÉÖÃÂÖûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖÃ|ÖÃuÖÃnÖÃgÖÃ`ÖÃYÖÃRÖÃKÖÃDÖÃ=ÖÃ6ÖÃ/ÖÃ(ÖÃ!ÖÃÖÃÖà ÖÃÖÃþÕÃ÷ÕÃðÕÃéÕÃâÕÃÛÕÃÔÕÃÍÕÃÆÕÿÕøÕñÕêÕãÕÜÕÕÕÃŽÕÇÕÀÕÃyÕÃrÕÃkÕÃdÕÃ]ÕÃVÕÃOÕÃHÕÃAÕÃ:ÕÃ3ÕÃ,ÕÃ%ÕÃÕÃÕÃÕà ÕÃÕÃûÔÃôÔÃíÔÃæÔÃßÔÃØÔÃÑÔÃÊÔÃÃÔüÔõÔîÔçÔàÔÙÔÃ’ÔËÔÄÔÃ}ÔÃvÔÃoÔÃhÔÃaÔÃZÔÃSÔÃLÔÃEÔÃ>ÔÃ7ÔÃ0ÔÃ)ÔÃ"ÔÃÔÃÔà ÔÃÔÃÿÓÃøÓÃñÓÃêÓÃãÓÃÜÓÃÕÓÃÎÓÃÇÓÃÀÓùÓòÓëÓäÓÃÓÖÓÃÓÈÓÃÓÃzÓÃsÓÃlÓÃeÓÃ^ÓÃWÓÃPÓÃIÓÃBÓÃ;ÓÃ4ÓÃ-ÓÃ&ÓÃÓÃÓÃÓà ÓÃÓÃüÒÃõÒÃîÒÃçÒÃàÒÃÙÒÃÒÒÃËÒÃÄÒýÒöÒïÒèÒáÒÚÒÓÒÃŒÒÃ…ÒÃ~ÒÃwÒÃpÒÃiÒÃbÒÃ[ÒÃTÒÃMÒÃFÒÃ?ÒÃ8ÒÃ1ÒÃ*ÒÃ#ÒÃÒÃÒÃÒÃÒÃÒÃùÑÃòÑÃëÑÃäÑÃÝÑÃÖÑÃÏÑÃÈÑÃÁÑúÑóÑìÑÃ¥ÑÞÑ×ÑÃÑÉÑÂÑÃ{ÑÃtÑÃmÑÃfÑÃ_ÑÃXÑÃQÑÃJÑÃCÑÃ<ÑÃ5ÑÃ.ÑÃ'Ñà ÑÃÑÃÑà ÑÃÑÃýÐÃöÐÃïÐÃèÐÃáÐÃÚÐÃÓÐÃÌÐÃÅÐþÐ÷ÐðÐéÐâÐÛÐÔÐÃÐÆÐÃÐÃxÐÃqÐÃjÐÃcÐÃ\ÐÃUÐÃNÐÃGÐÃ@ÐÃ9ÐÃ2ÐÃ+ÐÃ$ÐÃÐÃÐÃÐÃÐÃÐÃúÏÃóÏÃìÏÃåÏÃÞÏÃ×ÏÃÐÏÃÉÏÃÂÏûÏôÏíÏæÏßÏØÏÑÏÊÏÃÏÃ|ÏÃuÏÃnÏÃgÏÃ`ÏÃYÏÃRÏÃKÏÃDÏÃ=ÏÃ6ÏÃ/ÏÃ(ÏÃ!ÏÃÏÃÏà ÏÃÏÃþÎÃ÷ÎÃðÎÃéÎÃâÎÃÛÎÃÔÎÃÍÎÃÆÎÿÎøÎñÎêÎãÎÜÎÕÎÃŽÎÇÎÀÎÃyÎÃrÎÃkÎÃdÎÃ]ÎÃVÎÃOÎÃHÎÃAÎÃ:ÎÃ3ÎÃ,ÎÃ%ÎÃÎÃÎÃÎà ÎÃÎÃûÍÃôÍÃíÍÃæÍÃßÍÃØÍÃÑÍÃÊÍÃÃÍüÍõÍîÍçÍàÍÙÍÃ’ÍËÍÄÍÃ}ÍÃvÍÃoÍÃhÍÃaÍÃZÍÃSÍÃLÍÃEÍÃ>ÍÃ7ÍÃ0ÍÃ)ÍÃ"ÍÃÍÃÍà ÍÃÍÃÿÌÃøÌÃñÌÃêÌÃãÌÃÜÌÃÕÌÃÎÌÃÇÌÃÀÌùÌòÌëÌäÌÃÌÖÌÃÌÈÌÃÌÃzÌÃsÌÃlÌÃeÌÃ^ÌÃWÌÃPÌÃIÌÃBÌÃ;ÌÃ4ÌÃ-ÌÃ&ÌÃÌÃÌÃÌà ÌÃÌÃüËÃõËÃîËÃçËÃàËÃÙËÃÒËÃËËÃÄËýËöËïËèËáËÚËÓËÃŒËÃ…ËÃ~ËÃwËÃpËÃiËÃbËÃ[ËÃTËÃMËÃFËÃ?ËÃ8ËÃ1ËÃ*ËÃ#ËÃËÃËÃËÃËÃËÃùÊÃòÊÃëÊÃäÊÃÝÊÃÖÊÃÏÊÃÈÊÃÁÊúÊóÊìÊÃ¥ÊÞÊ×ÊÃÊÉÊÂÊÃ{ÊÃtÊÃmÊÃfÊÃ_ÊÃXÊÃQÊÃJÊÃCÊÃ<ÊÃ5ÊÃ.ÊÃ'Êà ÊÃÊÃÊà ÊÃÊÃýÉÃöÉÃïÉÃèÉÃáÉÃÚÉÃÓÉÃÌÉÃÅÉþÉ÷ÉðÉéÉâÉÛÉÔÉÃÉÆÉÃÉÃxÉÃqÉÃjÉÃcÉÃ\ÉÃUÉÃNÉÃGÉÃ@ÉÃ9ÉÃ2ÉÃ+ÉÃ$ÉÃÉÃÉÃÉÃÉÃÉÃúÈÃóÈÃìÈÃåÈÃÞÈÃ×ÈÃÐÈÃÉÈÃÂÈûÈôÈíÈæÈßÈØÈÑÈÊÈÃÈÃ|ÈÃuÈÃnÈÃgÈÃ`ÈÃYÈÃRÈÃKÈÃDÈÃ=ÈÃ6ÈÃ/ÈÃ(ÈÃ!ÈÃÈÃÈà ÈÃÈÃþÇÃ÷ÇÃðÇÃéÇÃâÇÃÛÇÃÔÇÃÍÇÃÆÇÿÇøÇñÇêÇãÇÜÇÕÇÃŽÇÇÇÀÇÃyÇÃrÇÃkÇÃdÇÃ]ÇÃVÇÃOÇÃHÇÃAÇÃ:ÇÃ3ÇÃ,ÇÃ%ÇÃÇÃÇÃÇà ÇÃÇÃûÆÃôÆÃíÆÃæÆÃ߯ÃØÆÃÑÆÃÊÆÃÃÆÃ¼ÆÃµÆÃ®ÆÃ§ÆÃ ÆÃ™ÆÃ’ÆÃ‹ÆÃ„ÆÃ}ÆÃvÆÃoÆÃhÆÃaÆÃZÆÃSÆÃLÆÃEÆÃ>ÆÃ7ÆÃ0ÆÃ)ÆÃ"ÆÃÆÃÆÃ ÆÃÆÃÿÅÃøÅÃñÅÃêÅÃãÅÃÜÅÃÕÅÃÎÅÃÇÅÃÀÅùÅòÅëÅäÅÃÅÖÅÃÅÈÅÃÅÃzÅÃsÅÃlÅÃeÅÃ^ÅÃWÅÃPÅÃIÅÃBÅÃ;ÅÃ4ÅÃ-ÅÃ&ÅÃÅÃÅÃÅà ÅÃÅÃüÄÃõÄÃîÄÃçÄÃàÄÃÙÄÃÒÄÃËÄÃÄÄýÄöÄïÄèÄáÄÚÄÓÄÃŒÄÃ…ÄÃ~ÄÃwÄÃpÄÃiÄÃbÄÃ[ÄÃTÄÃMÄÃFÄÃ?ÄÃ8ÄÃ1ÄÃ*ÄÃ#ÄÃÄÃÄÃÄÃÄÃÄÃùÃÃòÃÃëÃÃäÃÃÝÃÃÖÃÃÏÃÃÈÃÃÁÃúÃóÃìÃÃ¥ÃÞÃ×ÃÃÃÉÃÂÃÃ{ÃÃtÃÃmÃÃfÃÃ_ÃÃXÃÃQÃÃJÃÃCÃÃ<ÃÃ5ÃÃ.ÃÃ'Ãà ÃÃÃÃÃà ÃÃÃÃýÂÃöÂÃïÂÃèÂÃáÂÃÚÂÃÓÂÃÌÂÃÅÂþÂ÷ÂðÂéÂâÂÛÂÔÂÃÂÆÂÃÂÃxÂÃqÂÃjÂÃcÂÃ\ÂÃUÂÃNÂÃGÂÃ@ÂÃ9ÂÃ2ÂÃ+ÂÃ$ÂÃÂÃÂÃÂÃÂÃÂÃúÁÃóÁÃìÁÃåÁÃÞÁÃ×ÁÃÐÁÃÉÁÃÂÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁÃ|ÁÃuÁÃnÁÃgÁÃ`ÁÃYÁÃRÁÃKÁÃDÁÃ=ÁÃ6ÁÃ/ÁÃ(ÁÃ!ÁÃÁÃÁà ÁÃÁÃþÀÃ÷ÀÃðÀÃéÀÃâÀÃÛÀÃÔÀÃÍÀÃÆÀÿÀøÀñÀêÀãÀÜÀÕÀÃŽÀÇÀÀÀÃyÀÃrÀÃkÀÃdÀÃ]ÀÃVÀÃOÀÃHÀÃAÀÃ:ÀÃ3ÀÃ,ÀÃ%ÀÃÀÃÀÃÀà ÀÃÀÃû¿Ãô¿Ãí¿Ãæ¿Ãß¿ÃØ¿ÃÑ¿ÃÊ¿Ãÿü¿Ãµ¿Ã®¿Ã§¿Ã ¿Ã™¿Ã’¿Ã‹¿Ã„¿Ã}¿Ãv¿Ão¿Ãh¿Ãa¿ÃZ¿ÃS¿ÃL¿ÃE¿Ã>¿Ã7¿Ã0¿Ã)¿Ã"¿Ã¿Ã¿Ã ¿Ã¿Ãÿ¾Ãø¾Ãñ¾Ãê¾Ãã¾ÃܾÃÕ¾ÃξÃǾÃÀ¾Ã¹¾Ã²¾Ã«¾Ã¤¾Ã¾Ã–¾Ã¾Ãˆ¾Ã¾Ãz¾Ãs¾Ãl¾Ãe¾Ã^¾ÃW¾ÃP¾ÃI¾ÃB¾Ã;¾Ã4¾Ã-¾Ã&¾Ã¾Ã¾Ã¾Ã ¾Ã¾Ãü½Ãõ½Ãî½Ãç½Ãà½ÃÙ½ÃÒ½Ã˽ÃĽÃ½½Ã¶½Ã¯½Ã¨½Ã¡½Ãš½Ã“½ÃŒ½Ã…½Ã~½Ãw½Ãp½Ãi½Ãb½Ã[½ÃT½ÃM½ÃF½Ã?½Ã8½Ã1½Ã*½Ã#½Ã½Ã½Ã½Ã½Ã½Ãù¼Ãò¼Ãë¼Ãä¼ÃݼÃÖ¼ÃϼÃȼÃÁ¼Ãº¼Ã³¼Ã¬¼Ã¥¼Ãž¼Ã—¼Ã¼Ã‰¼Ã‚¼Ã{¼Ãt¼Ãm¼Ãf¼Ã_¼ÃX¼ÃQ¼ÃJ¼ÃC¼Ã<¼Ã5¼Ã.¼Ã'¼Ã ¼Ã¼Ã¼Ã ¼Ã¼Ãý»Ãö»Ãï»Ãè»Ãá»ÃÚ»ÃÓ»ÃÌ»ÃŻþ»Ã·»Ã°»Ã©»Ã¢»Ã›»Ã”»Ã»Ã†»Ã»Ãx»Ãq»Ãj»Ãc»Ã\»ÃU»ÃN»ÃG»Ã@»Ã9»Ã2»Ã+»Ã$»Ã»Ã»Ã»Ã»Ã»ÃúºÃóºÃìºÃåºÃÞºÃ׺ÃкÃɺúûºÃ´ºÃ­ºÃ¦ºÃŸºÃ˜ºÃ‘ºÃŠºÃƒºÃ|ºÃuºÃnºÃgºÃ`ºÃYºÃRºÃKºÃDºÃ=ºÃ6ºÃ/ºÃ(ºÃ!ºÃºÃºÃ ºÃºÃþ¹Ã÷¹Ãð¹Ãé¹Ãâ¹ÃÛ¹ÃÔ¹Ã͹Ãƹÿ¹Ã¸¹Ã±¹Ãª¹Ã£¹Ãœ¹Ã•¹Ã޹ǹÀ¹Ãy¹Ãr¹Ãk¹Ãd¹Ã]¹ÃV¹ÃO¹ÃH¹ÃA¹Ã:¹Ã3¹Ã,¹Ã%¹Ã¹Ã¹Ã¹Ã ¹Ã¹Ãû¸Ãô¸Ãí¸Ãæ¸Ã߸ÃظÃѸÃʸÃøÃ¼¸Ãµ¸Ã®¸Ã§¸Ã ¸Ã™¸Ã’¸Ã‹¸Ã„¸Ã}¸Ãv¸Ão¸Ãh¸Ãa¸ÃZ¸ÃS¸ÃL¸ÃE¸Ã>¸Ã7¸Ã0¸Ã)¸Ã"¸Ã¸Ã¸Ã ¸Ã¸Ãÿ·Ãø·Ãñ·Ãê·Ãã·ÃÜ·ÃÕ·ÃηÃÇ·ÃÀ·Ã¹·Ã²·Ã«·Ã¤·Ã·Ã–·Ã·Ãˆ·Ã·Ãz·Ãs·Ãl·Ãe·Ã^·ÃW·ÃP·ÃI·ÃB·Ã;·Ã4·Ã-·Ã&·Ã·Ã·Ã·Ã ·Ã·Ãü¶Ãõ¶Ãî¶Ãç¶Ãà¶ÃÙ¶ÃÒ¶Ã˶ÃĶý¶Ã¶¶Ã¯¶Ã¨¶Ã¡¶Ãš¶Ã“¶ÃŒ¶Ã…¶Ã~¶Ãw¶Ãp¶Ãi¶Ãb¶Ã[¶ÃT¶ÃM¶ÃF¶Ã?¶Ã8¶Ã1¶Ã*¶Ã#¶Ã¶Ã¶Ã¶Ã¶Ã¶ÃùµÃòµÃëµÃäµÃݵÃÖµÃϵÃȵÃÁµÃºµÃ³µÃ¬µÃ¥µÃžµÃ—µÃµÃ‰µÃ‚µÃ{µÃtµÃmµÃfµÃ_µÃXµÃQµÃJµÃCµÃ<µÃ5µÃ.µÃ'µÃ µÃµÃµÃ µÃµÃý´Ãö´Ãï´Ãè´Ãá´ÃÚ´ÃÓ´ÃÌ´ÃŴþ´Ã·´Ã°´Ã©´Ã¢´Ã›´Ã”´Ã´Ã†´Ã´Ãx´Ãq´Ãj´Ãc´Ã\´ÃU´ÃN´ÃG´Ã@´Ã9´Ã2´Ã+´Ã$´Ã´Ã´Ã´Ã´Ã´Ãú³Ãó³Ãì³Ãå³ÃÞ³Ã׳ÃгÃɳóû³Ã´³Ã­³Ã¦³ÃŸ³Ã˜³Ã‘³ÃгóÃ|³Ãu³Ãn³Ãg³Ã`³ÃY³ÃR³ÃK³ÃD³Ã=³Ã6³Ã/³Ã(³Ã!³Ã³Ã³Ã ³Ã³Ãþ²Ã÷²Ãð²Ãé²Ãâ²ÃÛ²ÃÔ²ÃͲÃƲÿ²Ã¸²Ã±²Ãª²Ã£²Ãœ²Ã•²Ã޲DzÀ²Ãy²Ãr²Ãk²Ãd²Ã]²ÃV²ÃO²ÃH²ÃA²Ã:²Ã3²Ã,²Ã%²Ã²Ã²Ã²Ã ²Ã²Ãû±Ãô±Ãí±Ãæ±Ãß±ÃرÃѱÃʱÃñü±Ãµ±Ã®±Ã§±Ã ±Ã™±Ã’±Ã‹±Ã„±Ã}±Ãv±Ão±Ãh±Ãa±ÃZ±ÃS±ÃL±ÃE±Ã>±Ã7±Ã0±Ã)±Ã"±Ã±Ã±Ã ±Ã±Ãÿ°Ãø°Ãñ°Ãê°Ãã°ÃܰÃÕ°ÃΰÃǰÃÀ°Ã¹°Ã²°Ã«°Ã¤°Ã°Ã–°Ã°Ãˆ°Ã°Ãz°Ãs°Ãl°Ãe°Ã^°ÃW°ÃP°ÃI°ÃB°Ã;°Ã4°Ã-°Ã&°Ã°Ã°Ã°Ã °Ã°Ãü¯Ãõ¯Ãî¯Ãç¯Ãà¯ÃÙ¯ÃÒ¯Ã˯Ãįý¯Ã¶¯Ã¯¯Ã¨¯Ã¡¯Ãš¯Ã“¯ÃŒ¯Ã…¯Ã~¯Ãw¯Ãp¯Ãi¯Ãb¯Ã[¯ÃT¯ÃM¯ÃF¯Ã?¯Ã8¯Ã1¯Ã*¯Ã#¯Ã¯Ã¯Ã¯Ã¯Ã¯Ãù®Ãò®Ãë®Ãä®ÃÝ®ÃÖ®ÃÏ®ÃÈ®ÃÁ®Ãº®Ã³®Ã¬®Ã¥®Ãž®Ã—®Ã®Ã‰®Ã‚®Ã{®Ãt®Ãm®Ãf®Ã_®ÃX®ÃQ®ÃJ®ÃC®Ã<®Ã5®Ã.®Ã'®Ã ®Ã®Ã®Ã ®Ã®Ãý­Ãö­Ãï­Ãè­Ãá­ÃÚ­ÃÓ­ÃÌ­Ãŭþ­Ã·­Ã°­Ã©­Ã¢­Ã›­Ã”­Ã­Ã†­Ã­Ãx­Ãq­Ãj­Ãc­Ã\­ÃU­ÃN­ÃG­Ã@­Ã9­Ã2­Ã+­Ã$­Ã­Ã­Ã­Ã­Ã­Ãú¬Ãó¬Ãì¬Ãå¬ÃÞ¬Ã׬ÃЬÃɬìû¬Ã´¬Ã­¬Ã¦¬ÃŸ¬Ã˜¬Ã‘¬ÃЬìÃ|¬Ãu¬Ãn¬Ãg¬Ã`¬ÃY¬ÃR¬ÃK¬ÃD¬Ã=¬Ã6¬Ã/¬Ã(¬Ã!¬Ã¬Ã¬Ã ¬Ã¬Ãþ«Ã÷«Ãð«Ãé«Ãâ«ÃÛ«ÃÔ«ÃÍ«ÃÆ«Ã¿«Ã¸«Ã±«Ãª«Ã£«Ãœ«Ã•«ÃŽ«Ã‡«Ã€«Ãy«Ãr«Ãk«Ãd«Ã]«ÃV«ÃO«ÃH«ÃA«Ã:«Ã3«Ã,«Ã%«Ã«Ã«Ã«Ã «Ã«ÃûªÃôªÃíªÃæªÃߪÃتÃѪÃʪÃêüªÃµªÃ®ªÃ§ªÃ ªÃ™ªÃ’ªÃ‹ªÃ„ªÃ}ªÃvªÃoªÃhªÃaªÃZªÃSªÃLªÃEªÃ>ªÃ7ªÃ0ªÃ)ªÃ"ªÃªÃªÃ ªÃªÃÿ©Ãø©Ãñ©Ãê©Ãã©ÃÜ©ÃÕ©ÃΩÃÇ©ÃÀ©Ã¹©Ã²©Ã«©Ã¤©Ã©Ã–©Ã©Ãˆ©Ã©Ãz©Ãs©Ãl©Ãe©Ã^©ÃW©ÃP©ÃI©ÃB©Ã;©Ã4©Ã-©Ã&©Ã©Ã©Ã©Ã ©Ã©Ãü¨Ãõ¨Ãî¨Ãç¨Ãà¨ÃÙ¨ÃÒ¨Ã˨ÃĨý¨Ã¶¨Ã¯¨Ã¨¨Ã¡¨Ãš¨Ã“¨ÃŒ¨Ã…¨Ã~¨Ãw¨Ãp¨Ãi¨Ãb¨Ã[¨ÃT¨ÃM¨ÃF¨Ã?¨Ã8¨Ã1¨Ã*¨Ã#¨Ã¨Ã¨Ã¨Ã¨Ã¨Ãù§Ãò§Ãë§Ãä§ÃݧÃÖ§ÃϧÃȧÃÁ§Ãº§Ã³§Ã¬§Ã¥§Ãž§Ã—§Ã§Ã‰§Ã‚§Ã{§Ãt§Ãm§Ãf§Ã_§ÃX§ÃQ§ÃJ§ÃC§Ã<§Ã5§Ã.§Ã'§Ã §Ã§Ã§Ã §Ã§Ãý¦Ãö¦Ãï¦Ãè¦Ãá¦ÃÚ¦ÃÓ¦Ã̦ÃŦþ¦Ã·¦Ã°¦Ã©¦Ã¢¦Ã›¦Ã”¦Ã¦Ã†¦Ã¦Ãx¦Ãq¦Ãj¦Ãc¦Ã\¦ÃU¦ÃN¦ÃG¦Ã@¦Ã9¦Ã2¦Ã+¦Ã$¦Ã¦Ã¦Ã¦Ã¦Ã¦Ãú¥Ãó¥Ãì¥Ãå¥ÃÞ¥Ã×¥ÃÐ¥Ãɥåû¥Ã´¥Ã­¥Ã¦¥ÃŸ¥Ã˜¥Ã‘¥ÃŠ¥Ãƒ¥Ã|¥Ãu¥Ãn¥Ãg¥Ã`¥ÃY¥ÃR¥ÃK¥ÃD¥Ã=¥Ã6¥Ã/¥Ã(¥Ã!¥Ã¥Ã¥Ã ¥Ã¥Ãþ¤Ã÷¤Ãð¤Ãé¤Ãâ¤ÃÛ¤ÃÔ¤ÃͤÃƤÿ¤Ã¸¤Ã±¤Ãª¤Ã£¤Ãœ¤Ã•¤ÃޤǤÀ¤Ãy¤Ãr¤Ãk¤Ãd¤Ã]¤ÃV¤ÃO¤ÃH¤ÃA¤Ã:¤Ã3¤Ã,¤Ã%¤Ã¤Ã¤Ã¤Ã ¤Ã¤Ãû£Ãô£Ãí£Ãæ£ÃߣÃØ£ÃÑ£ÃÊ£Ããü£Ãµ£Ã®£Ã§£Ã £Ã™£Ã’£Ã‹£Ã„£Ã}£Ãv£Ão£Ãh£Ãa£ÃZ£ÃS£ÃL£ÃE£Ã>£Ã7£Ã0£Ã)£Ã"£Ã£Ã£Ã £Ã£Ãÿ¢Ãø¢Ãñ¢Ãê¢Ãã¢ÃÜ¢ÃÕ¢Ã΢ÃÇ¢ÃÀ¢Ã¹¢Ã²¢Ã«¢Ã¤¢Ã¢Ã–¢Ã¢Ãˆ¢Ã¢Ãz¢Ãs¢Ãl¢Ãe¢Ã^¢ÃW¢ÃP¢ÃI¢ÃB¢Ã;¢Ã4¢Ã-¢Ã&¢Ã¢Ã¢Ã¢Ã ¢Ã¢Ãü¡Ãõ¡Ãî¡Ãç¡Ãà¡ÃÙ¡ÃÒ¡ÃË¡Ãġý¡Ã¶¡Ã¯¡Ã¨¡Ã¡¡Ãš¡Ã“¡ÃŒ¡Ã…¡Ã~¡Ãw¡Ãp¡Ãi¡Ãb¡Ã[¡ÃT¡ÃM¡ÃF¡Ã?¡Ã8¡Ã1¡Ã*¡Ã#¡Ã¡Ã¡Ã¡Ã¡Ã¡Ãù Ãò Ãë Ãä ÃÝ ÃÖ ÃÏ ÃÈ ÃÁ Ãº Ã³ Ã¬ Ã¥ Ãž Ã— Ã Ã‰ Ã‚ Ã{ Ãt Ãm Ãf Ã_ ÃX ÃQ ÃJ ÃC Ã< Ã5 Ã. Ã' Ã  Ã Ã Ã  Ã ÃýŸÃöŸÃïŸÃèŸÃáŸÃÚŸÃÓŸÃÌŸÃşþŸÃ·ŸÃ°ŸÃ©ŸÃ¢ŸÃ›ŸÃ”ŸÃŸÃ†ŸÃŸÃxŸÃqŸÃjŸÃcŸÃ\ŸÃUŸÃNŸÃGŸÃ@ŸÃ9ŸÃ2ŸÃ+ŸÃ$ŸÃŸÃŸÃŸÃŸÃŸÃúžÃóžÃìžÃåžÃÞžÃמÃОÃɞÞûžÃ´žÃ­žÃ¦žÃŸžÃ˜žÃ‘žÃŠžÃƒžÃ|žÃužÃnžÃgžÃ`žÃYžÃRžÃKžÃDžÃ=žÃ6žÃ/žÃ(žÃ!žÃžÃžÃ žÃžÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûœÃôœÃíœÃæœÃßœÃØœÃÑœÃÊœÃÜüœÃµœÃ®œÃ§œÃ œÃ™œÃ’œÃ‹œÃ„œÃ}œÃvœÃoœÃhœÃaœÃZœÃSœÃLœÃEœÃ>œÃ7œÃ0œÃ)œÃ"œÃœÃœÃ œÃœÃÿ›Ãø›Ãñ›Ãê›Ãã›ÃÜ›ÃÕ›ÃΛÃÇ›ÃÀ›Ã¹›Ã²›Ã«›Ã¤›Ã›Ã–›Ã›Ãˆ›Ã›Ãz›Ãs›Ãl›Ãe›Ã^›ÃW›ÃP›ÃI›ÃB›Ã;›Ã4›Ã-›Ã&›Ã›Ã›Ã›Ã ›Ã›ÃüšÃõšÃîšÃçšÃàšÃÙšÃÒšÃËšÃĚýšÃ¶šÃ¯šÃ¨šÃ¡šÃššÃ“šÃŒšÃ…šÃ~šÃwšÃpšÃišÃbšÃ[šÃTšÃMšÃFšÃ?šÃ8šÃ1šÃ*šÃ#šÃšÃšÃšÃšÃšÃù™Ãò™Ãë™Ãä™ÃÝ™ÃÖ™ÃÏ™ÃÈ™ÃÁ™Ãº™Ã³™Ã¬™Ã¥™Ãž™Ã—™Ã™Ã‰™Ã‚™Ã{™Ãt™Ãm™Ãf™Ã_™ÃX™ÃQ™ÃJ™ÃC™Ã<™Ã5™Ã.™Ã'™Ã ™Ã™Ã™Ã ™Ã™Ãý˜Ãö˜Ãï˜Ãè˜Ãá˜ÃÚ˜ÃÓ˜Ã̘ÃŘþ˜Ã·˜Ã°˜Ã©˜Ã¢˜Ã›˜Ã”˜Ã˜Ã†˜Ã˜Ãx˜Ãq˜Ãj˜Ãc˜Ã\˜ÃU˜ÃN˜ÃG˜Ã@˜Ã9˜Ã2˜Ã+˜Ã$˜Ã˜Ã˜Ã˜Ã˜Ã˜Ãú—Ãó—Ãì—Ãå—ÃÞ—Ã×—ÃЗÃɗ×û—ô—í—æ—ߗؗїʗ×Ã|—Ãu—Ãn—Ãg—Ã`—ÃY—ÃR—ÃK—ÃD—Ã=—Ã6—Ã/—Ã(—Ã!—××à —×Ãþ–Ã÷–Ãð–Ãé–Ãâ–ÃÛ–ÃÔ–ÃÍ–ÃÆ–ÿ–ø–ñ–ê–ã–Ü–Õ–ÃŽ–Ç–À–Ãy–Ãr–Ãk–Ãd–Ã]–ÃV–ÃO–ÃH–ÃA–Ã:–Ã3–Ã,–Ã%–ÖÖÖà –ÖÃû•Ãô•Ãí•Ãæ•Ãß•ÃØ•ÃÑ•ÃÊ•ÃÕü•õ•î•ç•à•Ù•Ã’•˕ĕÃ}•Ãv•Ão•Ãh•Ãa•ÃZ•ÃS•ÃL•ÃE•Ã>•Ã7•Ã0•Ã)•Ã"•ÕÕà •ÕÃÿ”Ãø”Ãñ”Ãê”Ãã”ÃÜ”ÃÕ”ÃΔÃÇ”ÃÀ”ù”ò”ë”ä”ÔÖ”ÔÈ”ÔÃz”Ãs”Ãl”Ãe”Ã^”ÃW”ÃP”ÃI”ÃB”Ã;”Ã4”Ã-”Ã&”ÔÔÔà ”ÔÃü“Ãõ“Ãî“Ãç“Ãà“ÃÙ“ÃÒ“ÃË“Ãēý“ö“ï“è“á“Ú“Ó“ÃŒ“Ã…“Ã~“Ãw“Ãp“Ãi“Ãb“Ã[“ÃT“ÃM“ÃF“Ã?“Ã8“Ã1“Ã*“Ã#“ÓÓÓÓÓÃù’Ãò’Ãë’Ãä’ÃÝ’ÃÖ’ÃÏ’ÃÈ’ÃÁ’ú’ó’ì’Ã¥’Þ’×’ÒÉ’Â’Ã{’Ãt’Ãm’Ãf’Ã_’ÃX’ÃQ’ÃJ’ÃC’Ã<’Ã5’Ã.’Ã'’à ’Ã’Ã’Ã ’Ã’Ãý‘Ãö‘Ãï‘Ãè‘Ãá‘ÃÚ‘ÃÓ‘ÃÌ‘Ãőþ‘÷‘ð‘é‘â‘Û‘Ô‘ÑÆ‘ÑÃx‘Ãq‘Ãj‘Ãc‘Ã\‘ÃU‘ÃN‘ÃG‘Ã@‘Ã9‘Ã2‘Ã+‘Ã$‘ÑÑÑÑÑÃúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûŽÃôŽÃíŽÃæŽÃߎÃØŽÃÑŽÃÊŽÃÎüŽÃµŽÃ®ŽÃ§ŽÃ ŽÃ™ŽÃ’ŽÃ‹ŽÃ„ŽÃ}ŽÃvŽÃoŽÃhŽÃaŽÃZŽÃSŽÃLŽÃEŽÃ>ŽÃ7ŽÃ0ŽÃ)ŽÃ"ŽÃŽÃŽÃ ŽÃŽÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüŒÃõŒÃîŒÃçŒÃàŒÃÙŒÃÒŒÃËŒÃČýŒÃ¶ŒÃ¯ŒÃ¨ŒÃ¡ŒÃšŒÃ“ŒÃŒŒÃ…ŒÃ~ŒÃwŒÃpŒÃiŒÃbŒÃ[ŒÃTŒÃMŒÃFŒÃ?ŒÃ8ŒÃ1ŒÃ*ŒÃ#ŒÃŒÃŒÃŒÃŒÃŒÃù‹Ãò‹Ãë‹Ãä‹ÃÝ‹ÃÖ‹ÃÏ‹ÃÈ‹ÃÁ‹Ãº‹Ã³‹Ã¬‹Ã¥‹Ãž‹Ã—‹Ã‹Ã‰‹Ã‚‹Ã{‹Ãt‹Ãm‹Ãf‹Ã_‹ÃX‹ÃQ‹ÃJ‹ÃC‹Ã<‹Ã5‹Ã.‹Ã'‹Ã ‹Ã‹Ã‹Ã ‹Ã‹ÃýŠÃöŠÃïŠÃèŠÃáŠÃÚŠÃÓŠÃÌŠÃŊþŠÃ·ŠÃ°ŠÃ©ŠÃ¢ŠÃ›ŠÃ”ŠÃŠÃ†ŠÃŠÃxŠÃqŠÃjŠÃcŠÃ\ŠÃUŠÃNŠÃGŠÃ@ŠÃ9ŠÃ2ŠÃ+ŠÃ$ŠÃŠÃŠÃŠÃŠÃŠÃú‰Ãó‰Ãì‰Ãå‰ÃÞ‰Ã׉ÃЉÃɉÉû‰Ã´‰Ã­‰Ã¦‰ÃŸ‰Ã˜‰Ã‘‰ÃЉÃƒ‰Ã|‰Ãu‰Ãn‰Ãg‰Ã`‰ÃY‰ÃR‰ÃK‰ÃD‰Ã=‰Ã6‰Ã/‰Ã(‰Ã!‰Ã‰Ã‰Ã ‰Ã‰ÃþˆÃ÷ˆÃðˆÃéˆÃâˆÃÛˆÃÔˆÃ͈ÃƈÿˆÃ¸ˆÃ±ˆÃªˆÃ£ˆÃœˆÃ•ˆÃŽˆÃ‡ˆÃ€ˆÃyˆÃrˆÃkˆÃdˆÃ]ˆÃVˆÃOˆÃHˆÃAˆÃ:ˆÃ3ˆÃ,ˆÃ%ˆÃˆÃˆÃˆÃ ˆÃˆÃû‡Ãô‡Ãí‡Ãæ‡Ã߇Ã؇ÃчÃʇÃÇü‡Ãµ‡Ã®‡Ã§‡Ã ‡Ã™‡Ã’‡Ã‹‡Ã„‡Ã}‡Ãv‡Ão‡Ãh‡Ãa‡ÃZ‡ÃS‡ÃL‡ÃE‡Ã>‡Ã7‡Ã0‡Ã)‡Ã"‡Ã‡Ã‡Ã ‡Ã‡Ãÿ†Ãø†Ãñ†Ãê†Ãã†Ã܆ÃÕ†ÃΆÃdžÃÀ†Ã¹†Ã²†Ã«†Ã¤†Ã†Ã–†Ã†Ãˆ†Ã†Ãz†Ãs†Ãl†Ãe†Ã^†ÃW†ÃP†ÃI†ÃB†Ã;†Ã4†Ã-†Ã&†Ã†Ã†Ã†Ã †Ã†Ãü…Ãõ…Ãî…Ãç…Ãà…ÃÙ…ÃÒ…ÃË…Ãąý…ö…ï…è…á…Ú…Ó…ÃŒ…Ã……Ã~…Ãw…Ãp…Ãi…Ãb…Ã[…ÃT…ÃM…ÃF…Ã?…Ã8…Ã1…Ã*…Ã#…Ã…Ã…Ã…Ã…Ã…Ãù„Ãò„Ãë„Ãä„ÃÝ„ÃÖ„ÃÏ„ÃÈ„ÃÁ„ú„ó„ì„Ã¥„ބׄÄɄ„Ã{„Ãt„Ãm„Ãf„Ã_„ÃX„ÃQ„ÃJ„ÃC„Ã<„Ã5„Ã.„Ã'„à „ÄÄà „ÄÃýƒÃöƒÃïƒÃèƒÃáƒÃÚƒÃÓƒÃ̃ÃŃþƒÃ·ƒÃ°ƒÃ©ƒÃ¢ƒÃ›ƒÃ”ƒÃƒÃ†ƒÃƒÃxƒÃqƒÃjƒÃcƒÃ\ƒÃUƒÃNƒÃGƒÃ@ƒÃ9ƒÃ2ƒÃ+ƒÃ$ƒÃƒÃƒÃƒÃƒÃƒÃú‚Ãó‚Ãì‚Ãå‚ÃÞ‚ÃׂÃЂÃɂÂû‚ô‚í‚æ‚߂؂тʂÂÃ|‚Ãu‚Ãn‚Ãg‚Ã`‚ÃY‚ÃR‚ÃK‚ÃD‚Ã=‚Ã6‚Ã/‚Ã(‚Ã!‚ÂÂà ‚ÂÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃû€Ãô€Ãí€Ãæ€Ã߀ÃØ€ÃÑ€ÃÊ€ÃÀü€Ãµ€Ã®€Ã§€Ã €Ã™€Ã’€Ã‹€Ã„€Ã}€Ãv€Ão€Ãh€Ãa€ÃZ€ÃS€ÃL€ÃE€Ã>€Ã7€Ã0€Ã)€Ã"€Ã€Ã€Ã €Ã€ÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃü~Ãõ~Ãî~Ãç~Ãà~ÃÙ~ÃÒ~ÃË~ÃÄ~ý~ö~ï~è~á~Ú~Ó~ÃŒ~Ã…~Ã~~Ãw~Ãp~Ãi~Ãb~Ã[~ÃT~ÃM~ÃF~Ã?~Ã8~Ã1~Ã*~Ã#~Ã~Ã~Ã~Ã~Ã~Ãù}Ãò}Ãë}Ãä}ÃÝ}ÃÖ}ÃÏ}ÃÈ}ÃÁ}ú}ó}ì}Ã¥}Þ}×}Ã}É}Â}Ã{}Ãt}Ãm}Ãf}Ã_}ÃX}ÃQ}ÃJ}ÃC}Ã<}Ã5}Ã.}Ã'}à }Ã}Ã}à }Ã}Ãý|Ãö|Ãï|Ãè|Ãá|ÃÚ|ÃÓ|ÃÌ|ÃÅ|þ|÷|ð|é|â|Û|Ô|Ã|Æ|Ã|Ãx|Ãq|Ãj|Ãc|Ã\|ÃU|ÃN|ÃG|Ã@|Ã9|Ã2|Ã+|Ã$|Ã|Ã|Ã|Ã|Ã|Ãú{Ãó{Ãì{Ãå{ÃÞ{Ã×{ÃÐ{ÃÉ{ÃÂ{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{Ã|{Ãu{Ãn{Ãg{Ã`{ÃY{ÃR{ÃK{ÃD{Ã={Ã6{Ã/{Ã({Ã!{Ã{Ã{à {Ã{ÃþzÃ÷zÃðzÃézÃâzÃÛzÃÔzÃÍzÃÆzÿzøzñzêzãzÜzÕzÃŽzÇzÀzÃyzÃrzÃkzÃdzÃ]zÃVzÃOzÃHzÃAzÃ:zÃ3zÃ,zÃ%zÃzÃzÃzà zÃzÃûyÃôyÃíyÃæyÃßyÃØyÃÑyÃÊyÃÃyüyõyîyçyàyÙyÃ’yËyÄyÃ}yÃvyÃoyÃhyÃayÃZyÃSyÃLyÃEyÃ>yÃ7yÃ0yÃ)yÃ"yÃyÃyà yÃyÃÿxÃøxÃñxÃêxÃãxÃÜxÃÕxÃÎxÃÇxÃÀxùxòxëxäxÃxÖxÃxÈxÃxÃzxÃsxÃlxÃexÃ^xÃWxÃPxÃIxÃBxÃ;xÃ4xÃ-xÃ&xÃxÃxÃxà xÃxÃüwÃõwÃîwÃçwÃàwÃÙwÃÒwÃËwÃÄwýwöwïwèwáwÚwÓwÃŒwÃ…wÃ~wÃwwÃpwÃiwÃbwÃ[wÃTwÃMwÃFwÃ?wÃ8wÃ1wÃ*wÃ#wÃwÃwÃwÃwÃwÃùvÃòvÃëvÃävÃÝvÃÖvÃÏvÃÈvÃÁvúvóvìvÃ¥vÞv×vÃvÉvÂvÃ{vÃtvÃmvÃfvÃ_vÃXvÃQvÃJvÃCvÃrÃ7rÃ0rÃ)rÃ"rÃrÃrà rÃrÃÿqÃøqÃñqÃêqÃãqÃÜqÃÕqÃÎqÃÇqÃÀqùqòqëqäqÃqÖqÃqÈqÃqÃzqÃsqÃlqÃeqÃ^qÃWqÃPqÃIqÃBqÃ;qÃ4qÃ-qÃ&qÃqÃqÃqà qÃqÃüpÃõpÃîpÃçpÃàpÃÙpÃÒpÃËpÃÄpýpöpïpèpápÚpÓpÃŒpÃ…pÃ~pÃwpÃppÃipÃbpÃ[pÃTpÃMpÃFpÃ?pÃ8pÃ1pÃ*pÃ#pÃpÃpÃpÃpÃpÃùoÃòoÃëoÃäoÃÝoÃÖoÃÏoÃÈoÃÁoúoóoìoÃ¥oÞo×oÃoÉoÂoÃ{oÃtoÃmoÃfoÃ_oÃXoÃQoÃJoÃCoÃkÃ7kÃ0kÃ)kÃ"kÃkÃkà kÃkÃÿjÃøjÃñjÃêjÃãjÃÜjÃÕjÃÎjÃÇjÃÀjùjòjëjäjÃjÖjÃjÈjÃjÃzjÃsjÃljÃejÃ^jÃWjÃPjÃIjÃBjÃ;jÃ4jÃ-jÃ&jÃjÃjÃjà jÃjÃüiÃõiÃîiÃçiÃàiÃÙiÃÒiÃËiÃÄiýiöiïièiáiÚiÓiÃŒiÃ…iÃ~iÃwiÃpiÃiiÃbiÃ[iÃTiÃMiÃFiÃ?iÃ8iÃ1iÃ*iÃ#iÃiÃiÃiÃiÃiÃùhÃòhÃëhÃähÃÝhÃÖhÃÏhÃÈhÃÁhúhóhìhÃ¥hÞh×hÃhÉhÂhÃ{hÃthÃmhÃfhÃ_hÃXhÃQhÃJhÃChÃdÃ7dÃ0dÃ)dÃ"dÃdÃdà dÃdÃÿcÃøcÃñcÃêcÃãcÃÜcÃÕcÃÎcÃÇcÃÀcùcòcëcäcÃcÖcÃcÈcÃcÃzcÃscÃlcÃecÃ^cÃWcÃPcÃIcÃBcÃ;cÃ4cÃ-cÃ&cÃcÃcÃcà cÃcÃübÃõbÃîbÃçbÃàbÃÙbÃÒbÃËbÃÄbýböbïbèbábÚbÓbÃŒbÃ…bÃ~bÃwbÃpbÃibÃbbÃ[bÃTbÃMbÃFbÃ?bÃ8bÃ1bÃ*bÃ#bÃbÃbÃbÃbÃbÃùaÃòaÃëaÃäaÃÝaÃÖaÃÏaÃÈaÃÁaúaóaìaÃ¥aÞa×aÃaÉaÂaÃ{aÃtaÃmaÃfaÃ_aÃXaÃQaÃJaÃCaÃ]Ã7]Ã0]Ã)]Ã"]Ã]Ã]à ]Ã]Ãÿ\Ãø\Ãñ\Ãê\Ãã\ÃÜ\ÃÕ\ÃÎ\ÃÇ\ÃÀ\ù\ò\ë\ä\Ã\Ö\Ã\È\Ã\Ãz\Ãs\Ãl\Ãe\Ã^\ÃW\ÃP\ÃI\ÃB\Ã;\Ã4\Ã-\Ã&\Ã\Ã\Ã\à \Ã\Ãü[Ãõ[Ãî[Ãç[Ãà[ÃÙ[ÃÒ[ÃË[ÃÄ[ý[ö[ï[è[á[Ú[Ó[ÃŒ[Ã…[Ã~[Ãw[Ãp[Ãi[Ãb[Ã[[ÃT[ÃM[ÃF[Ã?[Ã8[Ã1[Ã*[Ã#[Ã[Ã[Ã[Ã[Ã[ÃùZÃòZÃëZÃäZÃÝZÃÖZÃÏZÃÈZÃÁZúZóZìZÃ¥ZÞZ×ZÃZÉZÂZÃ{ZÃtZÃmZÃfZÃ_ZÃXZÃQZÃJZÃCZÃVÃ7VÃ0VÃ)VÃ"VÃVÃVà VÃVÃÿUÃøUÃñUÃêUÃãUÃÜUÃÕUÃÎUÃÇUÃÀUùUòUëUäUÃUÖUÃUÈUÃUÃzUÃsUÃlUÃeUÃ^UÃWUÃPUÃIUÃBUÃ;UÃ4UÃ-UÃ&UÃUÃUÃUà UÃUÃüTÃõTÃîTÃçTÃàTÃÙTÃÒTÃËTÃÄTýTöTïTèTáTÚTÓTÃŒTÃ…TÃ~TÃwTÃpTÃiTÃbTÃ[TÃTTÃMTÃFTÃ?TÃ8TÃ1TÃ*TÃ#TÃTÃTÃTÃTÃTÃùSÃòSÃëSÃäSÃÝSÃÖSÃÏSÃÈSÃÁSúSóSìSÃ¥SÞS×SÃSÉSÂSÃ{SÃtSÃmSÃfSÃ_SÃXSÃQSÃJSÃCSÃOÃ7OÃ0OÃ)OÃ"OÃOÃOà OÃOÃÿNÃøNÃñNÃêNÃãNÃÜNÃÕNÃÎNÃÇNÃÀNùNòNëNäNÃNÖNÃNÈNÃNÃzNÃsNÃlNÃeNÃ^NÃWNÃPNÃINÃBNÃ;NÃ4NÃ-NÃ&NÃNÃNÃNà NÃNÃüMÃõMÃîMÃçMÃàMÃÙMÃÒMÃËMÃÄMýMöMïMèMáMÚMÓMÃŒMÃ…MÃ~MÃwMÃpMÃiMÃbMÃ[MÃTMÃMMÃFMÃ?MÃ8MÃ1MÃ*MÃ#MÃMÃMÃMÃMÃMÃùLÃòLÃëLÃäLÃÝLÃÖLÃÏLÃÈLÃÁLúLóLìLÃ¥LÞL×LÃLÉLÂLÃ{LÃtLÃmLÃfLÃ_LÃXLÃQLÃJLÃCLÃHÃ7HÃ0HÃ)HÃ"HÃHÃHà HÃHÃÿGÃøGÃñGÃêGÃãGÃÜGÃÕGÃÎGÃÇGÃÀGùGòGëGäGÃGÖGÃGÈGÃGÃzGÃsGÃlGÃeGÃ^GÃWGÃPGÃIGÃBGÃ;GÃ4GÃ-GÃ&GÃGÃGÃGà GÃGÃüFÃõFÃîFÃçFÃàFÃÙFÃÒFÃËFÃÄFýFöFïFèFáFÚFÓFÃŒFÃ…FÃ~FÃwFÃpFÃiFÃbFÃ[FÃTFÃMFÃFFÃ?FÃ8FÃ1FÃ*FÃ#FÃFÃFÃFÃFÃFÃùEÃòEÃëEÃäEÃÝEÃÖEÃÏEÃÈEÃÁEúEóEìEÃ¥EÞE×EÃEÉEÂEÃ{EÃtEÃmEÃfEÃ_EÃXEÃQEÃJEÃCEÃAÃ7AÃ0AÃ)AÃ"AÃAÃAà AÃAÃÿ@Ãø@Ãñ@Ãê@Ãã@ÃÜ@ÃÕ@ÃÎ@ÃÇ@ÃÀ@ù@ò@ë@ä@Ã@Ö@Ã@È@Ã@Ãz@Ãs@Ãl@Ãe@Ã^@ÃW@ÃP@ÃI@ÃB@Ã;@Ã4@Ã-@Ã&@Ã@Ã@Ã@à @Ã@Ãü?Ãõ?Ãî?Ãç?Ãà?ÃÙ?ÃÒ?ÃË?ÃÄ?ý?ö?ï?è?á?Ú?Ó?ÃŒ?Ã…?Ã~?Ãw?Ãp?Ãi?Ãb?Ã[?ÃT?ÃM?ÃF?Ã??Ã8?Ã1?Ã*?Ã#?Ã?Ã?Ã?Ã?Ã?Ãù>Ãò>Ãë>Ãä>ÃÝ>ÃÖ>ÃÏ>ÃÈ>ÃÁ>ú>ó>ì>Ã¥>Þ>×>Ã>É>Â>Ã{>Ãt>Ãm>Ãf>Ã_>ÃX>ÃQ>ÃJ>ÃC>Ã<>Ã5>Ã.>Ã'>à >Ã>Ã>à >Ã>Ãý=Ãö=Ãï=Ãè=Ãá=ÃÚ=ÃÓ=ÃÌ=ÃÅ=þ=÷=ð=é=â=Û=Ô=Ã=Æ=Ã=Ãx=Ãq=Ãj=Ãc=Ã\=ÃU=ÃN=ÃG=Ã@=Ã9=Ã2=Ã+=Ã$=Ã=Ã=Ã=Ã=Ã=Ãú<Ãó<Ãì<Ãå<ÃÞ<Ã×<ÃÐ<ÃÉ<ÃÂ<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<Ã|<Ãu<Ãn<Ãg<Ã`<ÃY<ÃR<ÃK<ÃD<Ã=<Ã6<Ã/<Ã(<Ã!<Ã<Ã<à <Ã<Ãþ;Ã÷;Ãð;Ãé;Ãâ;ÃÛ;ÃÔ;ÃÍ;ÃÆ;ÿ;ø;ñ;ê;ã;Ü;Õ;ÃŽ;Ç;À;Ãy;Ãr;Ãk;Ãd;Ã];ÃV;ÃO;ÃH;ÃA;Ã:;Ã3;Ã,;Ã%;Ã;Ã;Ã;à ;Ã;Ãû:Ãô:Ãí:Ãæ:Ãß:ÃØ:ÃÑ:ÃÊ:ÃÃ:ü:õ:î:ç:à:Ù:Ã’:Ë:Ä:Ã}:Ãv:Ão:Ãh:Ãa:ÃZ:ÃS:ÃL:ÃE:Ã>:Ã7:Ã0:Ã):Ã":Ã:Ã:à :Ã:Ãÿ9Ãø9Ãñ9Ãê9Ãã9ÃÜ9ÃÕ9ÃÎ9ÃÇ9ÃÀ9ù9ò9ë9ä9Ã9Ö9Ã9È9Ã9Ãz9Ãs9Ãl9Ãe9Ã^9ÃW9ÃP9ÃI9ÃB9Ã;9Ã49Ã-9Ã&9Ã9Ã9Ã9à 9Ã9Ãü8Ãõ8Ãî8Ãç8Ãà8ÃÙ8ÃÒ8ÃË8ÃÄ8ý8ö8ï8è8á8Ú8Ó8ÃŒ8Ã…8Ã~8Ãw8Ãp8Ãi8Ãb8Ã[8ÃT8ÃM8ÃF8Ã?8Ã88Ã18Ã*8Ã#8Ã8Ã8Ã8Ã8Ã8Ãù7Ãò7Ãë7Ãä7ÃÝ7ÃÖ7ÃÏ7ÃÈ7ÃÁ7ú7ó7ì7Ã¥7Þ7×7Ã7É7Â7Ã{7Ãt7Ãm7Ãf7Ã_7ÃX7ÃQ7ÃJ7ÃC7Ã<7Ã57Ã.7Ã'7à 7Ã7Ã7à 7Ã7Ãý6Ãö6Ãï6Ãè6Ãá6ÃÚ6ÃÓ6ÃÌ6ÃÅ6þ6÷6ð6é6â6Û6Ô6Ã6Æ6Ã6Ãx6Ãq6Ãj6Ãc6Ã\6ÃU6ÃN6ÃG6Ã@6Ã96Ã26Ã+6Ã$6Ã6Ã6Ã6Ã6Ã6Ãú5Ãó5Ãì5Ãå5ÃÞ5Ã×5ÃÐ5ÃÉ5ÃÂ5û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5Ã|5Ãu5Ãn5Ãg5Ã`5ÃY5ÃR5ÃK5ÃD5Ã=5Ã65Ã/5Ã(5Ã!5Ã5Ã5à 5Ã5Ãþ4Ã÷4Ãð4Ãé4Ãâ4ÃÛ4ÃÔ4ÃÍ4ÃÆ4ÿ4ø4ñ4ê4ã4Ü4Õ4ÃŽ4Ç4À4Ãy4Ãr4Ãk4Ãd4Ã]4ÃV4ÃO4ÃH4ÃA4Ã:4Ã34Ã,4Ã%4Ã4Ã4Ã4à 4Ã4Ãû3Ãô3Ãí3Ãæ3Ãß3ÃØ3ÃÑ3ÃÊ3ÃÃ3ü3õ3î3ç3à3Ù3Ã’3Ë3Ä3Ã}3Ãv3Ão3Ãh3Ãa3ÃZ3ÃS3ÃL3ÃE3Ã>3Ã73Ã03Ã)3Ã"3Ã3Ã3à 3Ã3Ãÿ2Ãø2Ãñ2Ãê2Ãã2ÃÜ2ÃÕ2ÃÎ2ÃÇ2ÃÀ2ù2ò2ë2ä2Ã2Ö2Ã2È2Ã2Ãz2Ãs2Ãl2Ãe2Ã^2ÃW2ÃP2ÃI2ÃB2Ã;2Ã42Ã-2Ã&2Ã2Ã2Ã2à 2Ã2Ãü1Ãõ1Ãî1Ãç1Ãà1ÃÙ1ÃÒ1ÃË1ÃÄ1ý1ö1ï1è1á1Ú1Ó1ÃŒ1Ã…1Ã~1Ãw1Ãp1Ãi1Ãb1Ã[1ÃT1ÃM1ÃF1Ã?1Ã81Ã11Ã*1Ã#1Ã1Ã1Ã1Ã1Ã1Ãù0Ãò0Ãë0Ãä0ÃÝ0ÃÖ0ÃÏ0ÃÈ0ÃÁ0ú0ó0ì0Ã¥0Þ0×0Ã0É0Â0Ã{0Ãt0Ãm0Ãf0Ã_0ÃX0ÃQ0ÃJ0ÃC0Ã<0Ã50Ã.0Ã'0à 0Ã0Ã0à 0Ã0Ãý/Ãö/Ãï/Ãè/Ãá/ÃÚ/ÃÓ/ÃÌ/ÃÅ/þ/÷/ð/é/â/Û/Ô/Ã/Æ/Ã/Ãx/Ãq/Ãj/Ãc/Ã\/ÃU/ÃN/ÃG/Ã@/Ã9/Ã2/Ã+/Ã$/Ã/Ã/Ã/Ã/Ã/Ãú.Ãó.Ãì.Ãå.ÃÞ.Ã×.ÃÐ.ÃÉ.ÃÂ.û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.Ã|.Ãu.Ãn.Ãg.Ã`.ÃY.ÃR.ÃK.ÃD.Ã=.Ã6.Ã/.Ã(.Ã!.Ã.Ã.à .Ã.Ãþ-Ã÷-Ãð-Ãé-Ãâ-ÃÛ-ÃÔ-ÃÍ-ÃÆ-ÿ-ø-ñ-ê-ã-Ü-Õ-ÃŽ-Ç-À-Ãy-Ãr-Ãk-Ãd-Ã]-ÃV-ÃO-ÃH-ÃA-Ã:-Ã3-Ã,-Ã%-Ã-Ã-Ã-à -Ã-Ãû,Ãô,Ãí,Ãæ,Ãß,ÃØ,ÃÑ,ÃÊ,ÃÃ,ü,õ,î,ç,à,Ù,Ã’,Ë,Ä,Ã},Ãv,Ão,Ãh,Ãa,ÃZ,ÃS,ÃL,ÃE,Ã>,Ã7,Ã0,Ã),Ã",Ã,Ã,à ,Ã,Ãÿ+Ãø+Ãñ+Ãê+Ãã+ÃÜ+ÃÕ+ÃÎ+ÃÇ+ÃÀ+ù+ò+ë+ä+Ã+Ö+Ã+È+Ã+Ãz+Ãs+Ãl+Ãe+Ã^+ÃW+ÃP+ÃI+ÃB+Ã;+Ã4+Ã-+Ã&+Ã+Ã+Ã+à +Ã+Ãü*Ãõ*Ãî*Ãç*Ãà*ÃÙ*ÃÒ*ÃË*ÃÄ*ý*ö*ï*è*á*Ú*Ó*ÃŒ*Ã…*Ã~*Ãw*Ãp*Ãi*Ãb*Ã[*ÃT*ÃM*ÃF*Ã?*Ã8*Ã1*Ã**Ã#*Ã*Ã*Ã*Ã*Ã*Ãù)Ãò)Ãë)Ãä)ÃÝ)ÃÖ)ÃÏ)ÃÈ)ÃÁ)ú)ó)ì)Ã¥)Þ)×)Ã)É)Â)Ã{)Ãt)Ãm)Ãf)Ã_)ÃX)ÃQ)ÃJ)ÃC)Ã<)Ã5)Ã.)Ã')à )Ã)Ã)à )Ã)Ãý(Ãö(Ãï(Ãè(Ãá(ÃÚ(ÃÓ(ÃÌ(ÃÅ(þ(÷(ð(é(â(Û(Ô(Ã(Æ(Ã(Ãx(Ãq(Ãj(Ãc(Ã\(ÃU(ÃN(ÃG(Ã@(Ã9(Ã2(Ã+(Ã$(Ã(Ã(Ã(Ã(Ã(Ãú'Ãó'Ãì'Ãå'ÃÞ'Ã×'ÃÐ'ÃÉ'ÃÂ'û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'Ã|'Ãu'Ãn'Ãg'Ã`'ÃY'ÃR'ÃK'ÃD'Ã='Ã6'Ã/'Ã('Ã!'Ã'Ã'à 'Ã'Ãþ&Ã÷&Ãð&Ãé&Ãâ&ÃÛ&ÃÔ&ÃÍ&ÃÆ&ÿ&ø&ñ&ê&ã&Ü&Õ&ÃŽ&Ç&À&Ãy&Ãr&Ãk&Ãd&Ã]&ÃV&ÃO&ÃH&ÃA&Ã:&Ã3&Ã,&Ã%&Ã&Ã&Ã&à &Ã&Ãû%Ãô%Ãí%Ãæ%Ãß%ÃØ%ÃÑ%ÃÊ%ÃÃ%ü%õ%î%ç%à%Ù%Ã’%Ë%Ä%Ã}%Ãv%Ão%Ãh%Ãa%ÃZ%ÃS%ÃL%ÃE%Ã>%Ã7%Ã0%Ã)%Ã"%Ã%Ã%à %Ã%Ãÿ$Ãø$Ãñ$Ãê$Ãã$ÃÜ$ÃÕ$ÃÎ$ÃÇ$ÃÀ$ù$ò$ë$ä$Ã$Ö$Ã$È$Ã$Ãz$Ãs$Ãl$Ãe$Ã^$ÃW$ÃP$ÃI$ÃB$Ã;$Ã4$Ã-$Ã&$Ã$Ã$Ã$à $Ã$Ãü#Ãõ#Ãî#Ãç#Ãà#ÃÙ#ÃÒ#ÃË#ÃÄ#ý#ö#ï#è#á#Ú#Ó#ÃŒ#Ã…#Ã~#Ãw#Ãp#Ãi#Ãb#Ã[#ÃT#ÃM#ÃF#Ã?#Ã8#Ã1#Ã*#Ã##Ã#Ã#Ã#Ã#Ã#Ãù"Ãò"Ãë"Ãä"ÃÝ"ÃÖ"ÃÏ"ÃÈ"ÃÁ"ú"ó"ì"Ã¥"Þ"×"Ã"É"Â"Ã{"Ãt"Ãm"Ãf"Ã_"ÃX"ÃQ"ÃJ"ÃC"Ã<"Ã5"Ã."Ã'"à "Ã"Ã"à "Ã"Ãý!Ãö!Ãï!Ãè!Ãá!ÃÚ!ÃÓ!ÃÌ!ÃÅ!þ!÷!ð!é!â!Û!Ô!Ã!Æ!Ã!Ãx!Ãq!Ãj!Ãc!Ã\!ÃU!ÃN!ÃG!Ã@!Ã9!Ã2!Ã+!Ã$!Ã!Ã!Ã!Ã!Ã!Ãú Ãó Ãì Ãå ÃÞ Ã× ÃÐ ÃÉ Ã Ã» ô í æ ß Ø Ñ Ê Ã Ã| Ãu Ãn Ãg Ã` ÃY ÃR ÃK ÃD Ã= Ã6 Ã/ Ã( Ã! à à à à ÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃù Ãò Ãë Ãä ÃÝ ÃÖ ÃÏ ÃÈ ÃÁ ú ó ì Ã¥ Þ × à É Â Ã{ Ãt Ãm Ãf Ã_ ÃX ÃQ ÃJ ÃC Ã< Ã5 Ã. Ã' à à à à à Ãý Ãö Ãï Ãè Ãá ÃÚ ÃÓ ÃÌ ÃŠþ ÷ ð é â Û Ô à Æ à Ãx Ãq Ãj Ãc Ã\ ÃU ÃN ÃG Ã@ Ã9 Ã2 Ã+ Ã$ à à à à à Ãú Ãó Ãì Ãå ÃÞ Ã× ÃÐ ÃÉ Ã Ã» ô í æ ß Ø Ñ Ê Ã Ã| Ãu Ãn Ãg Ã` ÃY ÃR ÃK ÃD Ã= Ã6 Ã/ Ã( Ã! à à à à Ãþ Ã÷ Ãð Ãé Ãâ ÃÛ ÃÔ ÃÍ ÃÆ ÿ ø ñ ê ã Ü Õ ÃŽ Ç À Ãy Ãr Ãk Ãd Ã] ÃV ÃO ÃH ÃA Ã: Ã3 Ã, Ã% à à à à à Ãû Ãô Ãí Ãæ Ãß ÃØ ÃÑ ÃÊ Ãà ü õ î ç à Ù Ã’ Ë Ä Ã} Ãv Ão Ãh Ãa ÃZ ÃS ÃL ÃE Ã> Ã7 Ã0 Ã) Ã" à à à à ÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÿÂòÿÂëÿÂäÿÂÝÿÂÖÿÂÏÿÂÈÿÂÁÿºÿ³ÿ¬ÿÂ¥ÿžÿ—ÿÂÿ‰ÿ‚ÿÂ{ÿÂtÿÂmÿÂfÿÂ_ÿÂXÿÂQÿÂJÿÂCÿÂ<ÿÂ5ÿÂ.ÿÂ'ÿ ÿÂÿÂÿ ÿÂÿÂýþÂöþÂïþÂèþÂáþÂÚþÂÓþÂÌþÂÅþ¾þ·þ°þ©þ¢þ›þ”þÂþ†þÂþÂxþÂqþÂjþÂcþÂ\þÂUþÂNþÂGþÂ@þÂ9þÂ2þÂ+þÂ$þÂþÂþÂþÂþÂþÂúýÂóýÂìýÂåýÂÞýÂ×ýÂÐýÂÉýÂÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒýÂ|ýÂuýÂnýÂgýÂ`ýÂYýÂRýÂKýÂDýÂ=ýÂ6ýÂ/ýÂ(ýÂ!ýÂýÂý ýÂýÂþüÂ÷üÂðüÂéüÂâüÂÛüÂÔüÂÍüÂÆü¿ü¸ü±üªü£üœü•üÂŽü‡ü€üÂyüÂrüÂküÂdüÂ]üÂVüÂOüÂHüÂAüÂ:üÂ3üÂ,üÂ%üÂüÂüÂü üÂüÂûûÂôûÂíûÂæûÂßûÂØûÂÑûÂÊûÂÃû¼ûµû®û§û û™ûÂ’û‹û„ûÂ}ûÂvûÂoûÂhûÂaûÂZûÂSûÂLûÂEûÂ>ûÂ7ûÂ0ûÂ)ûÂ"ûÂûÂû ûÂûÂÿúÂøúÂñúÂêúÂãúÂÜúÂÕúÂÎúÂÇúÂÀú¹ú²ú«ú¤úÂú–úÂúˆúÂúÂzúÂsúÂlúÂeúÂ^úÂWúÂPúÂIúÂBúÂ;úÂ4úÂ-úÂ&úÂúÂúÂú úÂúÂüùÂõùÂîùÂçùÂàùÂÙùÂÒùÂËùÂÄù½ù¶ù¯ù¨ù¡ùšù“ùÂŒùÂ…ùÂ~ùÂwùÂpùÂiùÂbùÂ[ùÂTùÂMùÂFùÂ?ùÂ8ùÂ1ùÂ*ùÂ#ùÂùÂùÂùÂùÂùÂùøÂòøÂëøÂäøÂÝøÂÖøÂÏøÂÈøÂÁøÂºøÂ³øÂ¬øÂ¥øÂžøÂ—øÂøÂ‰øÂ‚øÂ{øÂtøÂmøÂføÂ_øÂXøÂQøÂJøÂCøÂ<øÂ5øÂ.øÂ'øÂ øÂøÂøÂ øÂøÂý÷Âö÷Âï÷Âè÷Âá÷ÂÚ÷ÂÓ÷ÂÌ÷ÂÅ÷¾÷·÷°÷©÷¢÷›÷”÷Â÷†÷Â÷Âx÷Âq÷Âj÷Âc÷Â\÷ÂU÷ÂN÷ÂG÷Â@÷Â9÷Â2÷Â+÷Â$÷Â÷Â÷Â÷Â÷Â÷ÂúöÂóöÂìöÂåöÂÞöÂ×öÂÐöÂÉöÂÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒöÂ|öÂuöÂnöÂgöÂ`öÂYöÂRöÂKöÂDöÂ=öÂ6öÂ/öÂ(öÂ!öÂöÂö öÂöÂþõÂ÷õÂðõÂéõÂâõÂÛõÂÔõÂÍõÂÆõ¿õ¸õ±õªõ£õœõ•õÂŽõ‡õ€õÂyõÂrõÂkõÂdõÂ]õÂVõÂOõÂHõÂAõÂ:õÂ3õÂ,õÂ%õÂõÂõÂõ õÂõÂûôÂôôÂíôÂæôÂßôÂØôÂÑôÂÊôÂÃô¼ôµô®ô§ô ô™ôÂ’ô‹ô„ôÂ}ôÂvôÂoôÂhôÂaôÂZôÂSôÂLôÂEôÂ>ôÂ7ôÂ0ôÂ)ôÂ"ôÂôÂô ôÂôÂÿóÂøóÂñóÂêóÂãóÂÜóÂÕóÂÎóÂÇóÂÀó¹ó²ó«ó¤óÂó–óÂóˆóÂóÂzóÂsóÂlóÂeóÂ^óÂWóÂPóÂIóÂBóÂ;óÂ4óÂ-óÂ&óÂóÂóÂó óÂóÂüòÂõòÂîòÂçòÂàòÂÙòÂÒòÂËòÂÄò½ò¶ò¯ò¨ò¡òšò“òÂŒòÂ…òÂ~òÂwòÂpòÂiòÂbòÂ[òÂTòÂMòÂFòÂ?òÂ8òÂ1òÂ*òÂ#òÂòÂòÂòÂòÂòÂùñÂòñÂëñÂäñÂÝñÂÖñÂÏñÂÈñÂÁñºñ³ñ¬ñÂ¥ñžñ—ñÂñ‰ñ‚ñÂ{ñÂtñÂmñÂfñÂ_ñÂXñÂQñÂJñÂCñÂ<ñÂ5ñÂ.ñÂ'ñ ñÂñÂñ ñÂñÂýðÂöðÂïðÂèðÂáðÂÚðÂÓðÂÌðÂÅð¾ð·ð°ð©ð¢ð›ð”ðÂð†ðÂðÂxðÂqðÂjðÂcðÂ\ðÂUðÂNðÂGðÂ@ðÂ9ðÂ2ðÂ+ðÂ$ðÂðÂðÂðÂðÂðÂúïÂóïÂìïÂåïÂÞïÂ×ïÂÐïÂÉïÂÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒïÂ|ïÂuïÂnïÂgïÂ`ïÂYïÂRïÂKïÂDïÂ=ïÂ6ïÂ/ïÂ(ïÂ!ïÂïÂï ïÂïÂþîÂ÷îÂðîÂéîÂâîÂÛîÂÔîÂÍîÂÆî¿î¸î±îªî£îœî•îÂŽî‡î€îÂyîÂrîÂkîÂdîÂ]îÂVîÂOîÂHîÂAîÂ:îÂ3îÂ,îÂ%îÂîÂîÂî îÂîÂûíÂôíÂííÂæíÂßíÂØíÂÑíÂÊíÂÃí¼íµí®í§í í™íÂ’í‹í„íÂ}íÂvíÂoíÂhíÂaíÂZíÂSíÂLíÂEíÂ>íÂ7íÂ0íÂ)íÂ"íÂíÂí íÂíÂÿìÂøìÂñìÂêìÂãìÂÜìÂÕìÂÎìÂÇìÂÀì¹ì²ì«ì¤ìÂì–ìÂìˆìÂìÂzìÂsìÂlìÂeìÂ^ìÂWìÂPìÂIìÂBìÂ;ìÂ4ìÂ-ìÂ&ìÂìÂìÂì ìÂìÂüëÂõëÂîëÂçëÂàëÂÙëÂÒëÂËëÂÄë½ë¶ë¯ë¨ë¡ëšë“ëÂŒëÂ…ëÂ~ëÂwëÂpëÂiëÂbëÂ[ëÂTëÂMëÂFëÂ?ëÂ8ëÂ1ëÂ*ëÂ#ëÂëÂëÂëÂëÂëÂùêÂòêÂëêÂäêÂÝêÂÖêÂÏêÂÈêÂÁêºê³ê¬êÂ¥êžê—êÂê‰ê‚êÂ{êÂtêÂmêÂfêÂ_êÂXêÂQêÂJêÂCêÂ<êÂ5êÂ.êÂ'ê êÂêÂê êÂêÂýéÂöéÂïéÂèéÂáéÂÚéÂÓéÂÌéÂÅé¾é·é°é©é¢é›é”éÂé†éÂéÂxéÂqéÂjéÂcéÂ\éÂUéÂNéÂGéÂ@éÂ9éÂ2éÂ+éÂ$éÂéÂéÂéÂéÂéÂúèÂóèÂìèÂåèÂÞèÂ×èÂÐèÂÉèÂÂè»è´è­è¦èŸè˜è‘èŠèƒèÂ|èÂuèÂnèÂgèÂ`èÂYèÂRèÂKèÂDèÂ=èÂ6èÂ/èÂ(èÂ!èÂèÂè èÂèÂþçÂ÷çÂðçÂéçÂâçÂÛçÂÔçÂÍçÂÆç¿ç¸ç±çªç£çœç•çÂŽç‡ç€çÂyçÂrçÂkçÂdçÂ]çÂVçÂOçÂHçÂAçÂ:çÂ3çÂ,çÂ%çÂçÂçÂç çÂçÂûæÂôæÂíæÂææÂßæÂØæÂÑæÂÊæÂÃæÂ¼æÂµæÂ®æÂ§æÂ æÂ™æÂ’æÂ‹æÂ„æÂ}æÂvæÂoæÂhæÂaæÂZæÂSæÂLæÂEæÂ>æÂ7æÂ0æÂ)æÂ"æÂæÂæÂ æÂæÂÿåÂøåÂñåÂêåÂãåÂÜåÂÕåÂÎåÂÇåÂÀå¹å²å«å¤åÂå–åÂåˆåÂåÂzåÂsåÂlåÂeåÂ^åÂWåÂPåÂIåÂBåÂ;åÂ4åÂ-åÂ&åÂåÂåÂå åÂåÂüäÂõäÂîäÂçäÂàäÂÙäÂÒäÂËäÂÄä½ä¶ä¯ä¨ä¡äšä“äÂŒäÂ…äÂ~äÂwäÂpäÂiäÂbäÂ[äÂTäÂMäÂFäÂ?äÂ8äÂ1äÂ*äÂ#äÂäÂäÂäÂäÂäÂùãÂòãÂëãÂäãÂÝãÂÖãÂÏãÂÈãÂÁãºã³ã¬ãÂ¥ãžã—ãÂã‰ã‚ãÂ{ãÂtãÂmãÂfãÂ_ãÂXãÂQãÂJãÂCãÂ<ãÂ5ãÂ.ãÂ'ã ãÂãÂã ãÂãÂýâÂöâÂïâÂèâÂáâÂÚâÂÓâÂÌâÂÅâ¾â·â°â©â¢â›â”âÂâ†âÂâÂxâÂqâÂjâÂcâÂ\âÂUâÂNâÂGâÂ@âÂ9âÂ2âÂ+âÂ$âÂâÂâÂâÂâÂâÂúáÂóáÂìáÂåáÂÞáÂ×áÂÐáÂÉáÂÂá»á´á­á¦áŸá˜á‘áŠáƒáÂ|áÂuáÂnáÂgáÂ`áÂYáÂRáÂKáÂDáÂ=áÂ6áÂ/áÂ(áÂ!áÂáÂá áÂáÂþàÂ÷àÂðàÂéàÂâàÂÛàÂÔàÂÍàÂÆà¿à¸à±àªà£àœà•àÂŽà‡à€àÂyàÂràÂkàÂdàÂ]àÂVàÂOàÂHàÂAàÂ:àÂ3àÂ,àÂ%àÂàÂàÂà àÂàÂûßÂôßÂíßÂæßÂßßÂØßÂÑßÂÊßÂÃ߼ߵ߮ߧߠߙß’ߋ߄ßÂ}ßÂvßÂoßÂhßÂaßÂZßÂSßÂLßÂEßÂ>ßÂ7ßÂ0ßÂ)ßÂ"ßÂßÂß ßÂßÂÿÞÂøÞÂñÞÂêÞÂãÞÂÜÞÂÕÞÂÎÞÂÇÞÂÀÞ¹Þ²Þ«Þ¤ÞÂÞ–ÞÂÞˆÞÂÞÂzÞÂsÞÂlÞÂeÞÂ^ÞÂWÞÂPÞÂIÞÂBÞÂ;ÞÂ4ÞÂ-ÞÂ&ÞÂÞÂÞÂÞ ÞÂÞÂüÝÂõÝÂîÝÂçÝÂàÝÂÙÝÂÒÝÂËÝÂÄݽݶݯݨݡݚݓÝÂŒÝÂ…ÝÂ~ÝÂwÝÂpÝÂiÝÂbÝÂ[ÝÂTÝÂMÝÂFÝÂ?ÝÂ8ÝÂ1ÝÂ*ÝÂ#ÝÂÝÂÝÂÝÂÝÂÝÂùÜÂòÜÂëÜÂäÜÂÝÜÂÖÜÂÏÜÂÈÜÂÁܺܳܬÜ¥ܞܗÜÂ܉܂ÜÂ{ÜÂtÜÂmÜÂfÜÂ_ÜÂXÜÂQÜÂJÜÂCÜÂ<ÜÂ5ÜÂ.ÜÂ'Ü ÜÂÜÂÜ ÜÂÜÂýÛÂöÛÂïÛÂèÛÂáÛÂÚÛÂÓÛÂÌÛÂÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÂÛ†ÛÂÛÂxÛÂqÛÂjÛÂcÛÂ\ÛÂUÛÂNÛÂGÛÂ@ÛÂ9ÛÂ2ÛÂ+ÛÂ$ÛÂÛÂÛÂÛÂÛÂÛÂúÚÂóÚÂìÚÂåÚÂÞÚÂ×ÚÂÐÚÂÉÚÂÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚÂ|ÚÂuÚÂnÚÂgÚÂ`ÚÂYÚÂRÚÂKÚÂDÚÂ=ÚÂ6ÚÂ/ÚÂ(ÚÂ!ÚÂÚÂÚ ÚÂÚÂþÙÂ÷ÙÂðÙÂéÙÂâÙÂÛÙÂÔÙÂÍÙÂÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽهـÙÂyÙÂrÙÂkÙÂdÙÂ]ÙÂVÙÂOÙÂHÙÂAÙÂ:ÙÂ3ÙÂ,ÙÂ%ÙÂÙÂÙÂÙ ÙÂÙÂûØÂôØÂíØÂæØÂߨÂØØÂÑØÂÊØÂÃØÂ¼ØÂµØÂ®ØÂ§ØÂ ØÂ™ØÂ’ØÂ‹ØÂ„ØÂ}ØÂvØÂoØÂhØÂaØÂZØÂSØÂLØÂEØÂ>ØÂ7ØÂ0ØÂ)ØÂ"ØÂØÂØÂ ØÂØÂÿ×Âø×Âñ×Âê×Âã×ÂÜ×ÂÕ×ÂÎ×ÂÇ×ÂÀ׹ײ׫פ×Â×–×Â׈×Â×Âz×Âs×Âl×Âe×Â^×ÂW×ÂP×ÂI×ÂB×Â;×Â4×Â-×Â&×Â×Â×Â× ×Â×ÂüÖÂõÖÂîÖÂçÖÂàÖÂÙÖÂÒÖÂËÖÂÄÖ½Ö¶Ö¯Ö¨Ö¡ÖšÖ“ÖÂŒÖÂ…ÖÂ~ÖÂwÖÂpÖÂiÖÂbÖÂ[ÖÂTÖÂMÖÂFÖÂ?ÖÂ8ÖÂ1ÖÂ*ÖÂ#ÖÂÖÂÖÂÖÂÖÂÖÂùÕÂòÕÂëÕÂäÕÂÝÕÂÖÕÂÏÕÂÈÕÂÁÕºÕ³Õ¬ÕÂ¥ÕžÕ—ÕÂÕ‰Õ‚ÕÂ{ÕÂtÕÂmÕÂfÕÂ_ÕÂXÕÂQÕÂJÕÂCÕÂ<ÕÂ5ÕÂ.ÕÂ'Õ ÕÂÕÂÕ ÕÂÕÂýÔÂöÔÂïÔÂèÔÂáÔÂÚÔÂÓÔÂÌÔÂÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÂÔ†ÔÂÔÂxÔÂqÔÂjÔÂcÔÂ\ÔÂUÔÂNÔÂGÔÂ@ÔÂ9ÔÂ2ÔÂ+ÔÂ$ÔÂÔÂÔÂÔÂÔÂÔÂúÓÂóÓÂìÓÂåÓÂÞÓÂ×ÓÂÐÓÂÉÓÂÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓÂ|ÓÂuÓÂnÓÂgÓÂ`ÓÂYÓÂRÓÂKÓÂDÓÂ=ÓÂ6ÓÂ/ÓÂ(ÓÂ!ÓÂÓÂÓ ÓÂÓÂþÒÂ÷ÒÂðÒÂéÒÂâÒÂÛÒÂÔÒÂÍÒÂÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒÂŽÒ‡Ò€ÒÂyÒÂrÒÂkÒÂdÒÂ]ÒÂVÒÂOÒÂHÒÂAÒÂ:ÒÂ3ÒÂ,ÒÂ%ÒÂÒÂÒÂÒ ÒÂÒÂûÑÂôÑÂíÑÂæÑÂßÑÂØÑÂÑÑÂÊÑÂÃѼѵѮѧѠљÑ’ыфÑÂ}ÑÂvÑÂoÑÂhÑÂaÑÂZÑÂSÑÂLÑÂEÑÂ>ÑÂ7ÑÂ0ÑÂ)ÑÂ"ÑÂÑÂÑ ÑÂÑÂÿÐÂøÐÂñÐÂêÐÂãÐÂÜÐÂÕÐÂÎÐÂÇÐÂÀйвЫФÐÂЖÐÂЈÐÂÐÂzÐÂsÐÂlÐÂeÐÂ^ÐÂWÐÂPÐÂIÐÂBÐÂ;ÐÂ4ÐÂ-ÐÂ&ÐÂÐÂÐÂРÐÂÐÂüÏÂõÏÂîÏÂçÏÂàÏÂÙÏÂÒÏÂËÏÂÄϽ϶ϯϨϡϚϓÏÂŒÏÂ…ÏÂ~ÏÂwÏÂpÏÂiÏÂbÏÂ[ÏÂTÏÂMÏÂFÏÂ?ÏÂ8ÏÂ1ÏÂ*ÏÂ#ÏÂÏÂÏÂÏÂÏÂÏÂùÎÂòÎÂëÎÂäÎÂÝÎÂÖÎÂÏÎÂÈÎÂÁκγάÎ¥ΞΗÎÂΉ΂ÎÂ{ÎÂtÎÂmÎÂfÎÂ_ÎÂXÎÂQÎÂJÎÂCÎÂ<ÎÂ5ÎÂ.ÎÂ'ΠÎÂÎÂΠÎÂÎÂýÍÂöÍÂïÍÂèÍÂáÍÂÚÍÂÓÍÂÌÍÂÅ;ͷͰ͔ͩ͛͢ÍÂ͆ÍÂÍÂxÍÂqÍÂjÍÂcÍÂ\ÍÂUÍÂNÍÂGÍÂ@ÍÂ9ÍÂ2ÍÂ+ÍÂ$ÍÂÍÂÍÂÍÂÍÂÍÂúÌÂóÌÂìÌÂåÌÂÞÌÂ×ÌÂÐÌÂÉÌÂÂ̴̻̭̦̟̘̑̊̃ÌÂ|ÌÂuÌÂnÌÂgÌÂ`ÌÂYÌÂRÌÂKÌÂDÌÂ=ÌÂ6ÌÂ/ÌÂ(ÌÂ!ÌÂÌÂÌ ÌÂÌÂþËÂ÷ËÂðËÂéËÂâËÂÛËÂÔËÂÍËÂÆË¿Ë¸Ë±ËªË£ËœË•ËގˀËÂyËÂrËÂkËÂdËÂ]ËÂVËÂOËÂHËÂAËÂ:ËÂ3ËÂ,ËÂ%ËÂËÂËÂË ËÂËÂûÊÂôÊÂíÊÂæÊÂßÊÂØÊÂÑÊÂÊÊÂÃʼʵʮʧʠʙÊ’ʋʄÊÂ}ÊÂvÊÂoÊÂhÊÂaÊÂZÊÂSÊÂLÊÂEÊÂ>ÊÂ7ÊÂ0ÊÂ)ÊÂ"ÊÂÊÂÊ ÊÂÊÂÿÉÂøÉÂñÉÂêÉÂãÉÂÜÉÂÕÉÂÎÉÂÇÉÂÀɹɲɫɤÉÂÉ–ÉÂɈÉÂÉÂzÉÂsÉÂlÉÂeÉÂ^ÉÂWÉÂPÉÂIÉÂBÉÂ;ÉÂ4ÉÂ-ÉÂ&ÉÂÉÂÉÂÉ ÉÂÉÂüÈÂõÈÂîÈÂçÈÂàÈÂÙÈÂÒÈÂËÈÂÄȽȶȯȨȡȚȓÈÂŒÈÂ…ÈÂ~ÈÂwÈÂpÈÂiÈÂbÈÂ[ÈÂTÈÂMÈÂFÈÂ?ÈÂ8ÈÂ1ÈÂ*ÈÂ#ÈÂÈÂÈÂÈÂÈÂÈÂùÇÂòÇÂëÇÂäÇÂÝÇÂÖÇÂÏÇÂÈÇÂÁǺdzǬÇ¥ǞǗÇÂljǂÇÂ{ÇÂtÇÂmÇÂfÇÂ_ÇÂXÇÂQÇÂJÇÂCÇÂ<ÇÂ5ÇÂ.ÇÂ'Ç ÇÂÇÂÇ ÇÂÇÂýÆÂöÆÂïÆÂèÆÂáÆÂÚÆÂÓÆÂÌÆÂÅÆÂ¾ÆÂ·ÆÂ°ÆÂ©ÆÂ¢ÆÂ›ÆÂ”ÆÂÆÂ†ÆÂÆÂxÆÂqÆÂjÆÂcÆÂ\ÆÂUÆÂNÆÂGÆÂ@ÆÂ9ÆÂ2ÆÂ+ÆÂ$ÆÂÆÂÆÂÆÂÆÂÆÂúÅÂóÅÂìÅÂåÅÂÞÅÂ×ÅÂÐÅÂÉÅÂÂŻŴŭŦşŘőŊŃÅÂ|ÅÂuÅÂnÅÂgÅÂ`ÅÂYÅÂRÅÂKÅÂDÅÂ=ÅÂ6ÅÂ/ÅÂ(ÅÂ!ÅÂÅÂÅ ÅÂÅÂþÄÂ÷ÄÂðÄÂéÄÂâÄÂÛÄÂÔÄÂÍÄÂÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽćĀÄÂyÄÂrÄÂkÄÂdÄÂ]ÄÂVÄÂOÄÂHÄÂAÄÂ:ÄÂ3ÄÂ,ÄÂ%ÄÂÄÂÄÂÄ ÄÂÄÂûÃÂôÃÂíÃÂæÃÂßÃÂØÃÂÑÃÂÊÃÂÃüõîçàÙÃ’ËÄÃÂ}ÃÂvÃÂoÃÂhÃÂaÃÂZÃÂSÃÂLÃÂEÃÂ>ÃÂ7ÃÂ0ÃÂ)ÃÂ"ÃÂÃÂàÃÂÃÂÿÂÂøÂÂñÂÂêÂÂãÂÂÜÂÂÕÂÂÎÂÂÇÂÂÀ¹²«¤Â–ˆÂÂÂÂzÂÂsÂÂlÂÂeÂÂ^ÂÂWÂÂPÂÂIÂÂBÂÂ;ÂÂ4ÂÂ-ÂÂ& ÂÂÂÂüÁÂõÁÂîÁÂçÁÂàÁÂÙÁÂÒÁÂËÁÂÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁÂŒÁÂ…ÁÂ~ÁÂwÁÂpÁÂiÁÂbÁÂ[ÁÂTÁÂMÁÂFÁÂ?ÁÂ8ÁÂ1ÁÂ*ÁÂ#ÁÂÁÂÁÂÁÂÁÂÁÂùÀÂòÀÂëÀÂäÀÂÝÀÂÖÀÂÏÀÂÈÀÂÁÀºÀ³À¬ÀÂ¥ÀžÀ—ÀÂÀ‰À‚ÀÂ{ÀÂtÀÂmÀÂfÀÂ_ÀÂXÀÂQÀÂJÀÂCÀÂ<ÀÂ5ÀÂ.ÀÂ'À ÀÂÀÂÀ ÀÂÀÂý¿Âö¿Âï¿Âè¿Âá¿ÂÚ¿ÂÓ¿ÂÌ¿Âſ¾¿Â·¿Â°¿Â©¿Â¢¿Â›¿Â”¿Â¿Â†¿Â¿Âx¿Âq¿Âj¿Âc¿Â\¿ÂU¿ÂN¿ÂG¿Â@¿Â9¿Â2¿Â+¿Â$¿Â¿Â¿Â¿Â¿Â¿Âú¾Âó¾Âì¾Âå¾ÂÞ¾Â×¾ÂоÂɾ¾»¾Â´¾Â­¾Â¦¾ÂŸ¾Â˜¾Â‘¾Âоƒ¾Â|¾Âu¾Ân¾Âg¾Â`¾ÂY¾ÂR¾ÂK¾ÂD¾Â=¾Â6¾Â/¾Â(¾Â!¾Â¾Â¾Â ¾Â¾Âþ½Â÷½Âð½Âé½Ââ½ÂÛ½ÂÔ½ÂͽÂƽ¿½Â¸½Â±½Âª½Â£½Âœ½Â•½Â޽‡½Â€½Ây½Âr½Âk½Âd½Â]½ÂV½ÂO½ÂH½ÂA½Â:½Â3½Â,½Â%½Â½Â½Â½Â ½Â½Âû¼Âô¼Âí¼Âæ¼Âß¼ÂؼÂѼÂʼÂü¼¼Âµ¼Â®¼Â§¼Â ¼Â™¼Â’¼Â‹¼Â„¼Â}¼Âv¼Âo¼Âh¼Âa¼ÂZ¼ÂS¼ÂL¼ÂE¼Â>¼Â7¼Â0¼Â)¼Â"¼Â¼Â¼Â ¼Â¼Âÿ»Âø»Âñ»Âê»Âã»ÂÜ»ÂÕ»ÂλÂÇ»ÂÀ»Â¹»Â²»Â«»Â¤»Â»Â–»Â»Âˆ»Â»Âz»Âs»Âl»Âe»Â^»ÂW»ÂP»ÂI»ÂB»Â;»Â4»Â-»Â&»Â»Â»Â»Â »Â»ÂüºÂõºÂîºÂçºÂàºÂÙºÂÒºÂ˺Âĺ½ºÂ¶ºÂ¯ºÂ¨ºÂ¡ºÂšºÂ“ºÂŒºÂ…ºÂ~ºÂwºÂpºÂiºÂbºÂ[ºÂTºÂMºÂFºÂ?ºÂ8ºÂ1ºÂ*ºÂ#ºÂºÂºÂºÂºÂºÂù¹Âò¹Âë¹Âä¹ÂݹÂÖ¹ÂϹÂȹÂÁ¹Âº¹Â³¹Â¬¹Â¥¹Âž¹Â—¹Â¹Â‰¹Â‚¹Â{¹Ât¹Âm¹Âf¹Â_¹ÂX¹ÂQ¹ÂJ¹ÂC¹Â<¹Â5¹Â.¹Â'¹Â ¹Â¹Â¹Â ¹Â¹Âý¸Âö¸Âï¸Âè¸Âá¸ÂÚ¸ÂÓ¸Â̸Ÿ¾¸Â·¸Â°¸Â©¸Â¢¸Â›¸Â”¸Â¸Â†¸Â¸Âx¸Âq¸Âj¸Âc¸Â\¸ÂU¸ÂN¸ÂG¸Â@¸Â9¸Â2¸Â+¸Â$¸Â¸Â¸Â¸Â¸Â¸Âú·Âó·Âì·Âå·ÂÞ·Â×·ÂзÂɷ·»·Â´·Â­·Â¦·ÂŸ·Â˜·Â‘·ÂŠ·Âƒ·Â|·Âu·Ân·Âg·Â`·ÂY·ÂR·ÂK·ÂD·Â=·Â6·Â/·Â(·Â!·Â·Â·Â ·Â·Âþ¶Â÷¶Âð¶Âé¶Ââ¶ÂÛ¶ÂÔ¶ÂͶÂƶ¿¶Â¸¶Â±¶Âª¶Â£¶Âœ¶Â•¶Â޶‡¶Â€¶Ây¶Âr¶Âk¶Âd¶Â]¶ÂV¶ÂO¶ÂH¶ÂA¶Â:¶Â3¶Â,¶Â%¶Â¶Â¶Â¶Â ¶Â¶ÂûµÂôµÂíµÂæµÂßµÂصÂѵÂʵÂõ¼µÂµµÂ®µÂ§µÂ µÂ™µÂ’µÂ‹µÂ„µÂ}µÂvµÂoµÂhµÂaµÂZµÂSµÂLµÂEµÂ>µÂ7µÂ0µÂ)µÂ"µÂµÂµÂ µÂµÂÿ´Âø´Âñ´Âê´Âã´ÂÜ´ÂÕ´ÂδÂÇ´ÂÀ´Â¹´Â²´Â«´Â¤´Â´Â–´Â´Âˆ´Â´Âz´Âs´Âl´Âe´Â^´ÂW´ÂP´ÂI´ÂB´Â;´Â4´Â-´Â&´Â´Â´Â´Â ´Â´Âü³Âõ³Âî³Âç³Âà³ÂÙ³ÂÒ³Â˳Âij½³Â¶³Â¯³Â¨³Â¡³Âš³Â“³ÂŒ³Â…³Â~³Âw³Âp³Âi³Âb³Â[³ÂT³ÂM³ÂF³Â?³Â8³Â1³Â*³Â#³Â³Â³Â³Â³Â³Âù²Âò²Âë²Âä²ÂݲÂÖ²ÂϲÂȲÂÁ²Âº²Â³²Â¬²Â¥²Âž²Â—²Â²Â‰²Â‚²Â{²Ât²Âm²Âf²Â_²ÂX²ÂQ²ÂJ²ÂC²Â<²Â5²Â.²Â'²Â ²Â²Â²Â ²Â²Âý±Âö±Âï±Âè±Âá±ÂÚ±ÂÓ±Â̱Âű¾±Â·±Â°±Â©±Â¢±Â›±Â”±Â±Â†±Â±Âx±Âq±Âj±Âc±Â\±ÂU±ÂN±ÂG±Â@±Â9±Â2±Â+±Â$±Â±Â±Â±Â±Â±Âú°Âó°Âì°Âå°ÂÞ°Â×°ÂаÂɰ°»°Â´°Â­°Â¦°ÂŸ°Â˜°Â‘°Âаƒ°Â|°Âu°Ân°Âg°Â`°ÂY°ÂR°ÂK°ÂD°Â=°Â6°Â/°Â(°Â!°Â°Â°Â °Â°Âþ¯Â÷¯Âð¯Âé¯Ââ¯ÂÛ¯ÂÔ¯ÂͯÂƯ¿¯Â¸¯Â±¯Âª¯Â£¯Âœ¯Â•¯Âޝ‡¯Â€¯Ây¯Âr¯Âk¯Âd¯Â]¯ÂV¯ÂO¯ÂH¯ÂA¯Â:¯Â3¯Â,¯Â%¯Â¯Â¯Â¯Â ¯Â¯Âû®Âô®Âí®Âæ®Âß®ÂØ®ÂÑ®ÂÊ®Âµ®Â®®Â§®Â ®Â™®Â’®Â‹®Â„®Â}®Âv®Âo®Âh®Âa®ÂZ®ÂS®ÂL®ÂE®Â>®Â7®Â0®Â)®Â"®Â®Â®Â ®Â®Âÿ­Âø­Âñ­Âê­Âã­ÂÜ­ÂÕ­ÂέÂÇ­ÂÀ­Â¹­Â²­Â«­Â¤­Â­Â–­Â­Âˆ­Â­Âz­Âs­Âl­Âe­Â^­ÂW­ÂP­ÂI­ÂB­Â;­Â4­Â-­Â&­Â­Â­Â­Â ­Â­Âü¬Âõ¬Âî¬Âç¬Âà¬ÂÙ¬ÂÒ¬ÂˬÂĬ½¬Â¶¬Â¯¬Â¨¬Â¡¬Âš¬Â“¬ÂŒ¬Â…¬Â~¬Âw¬Âp¬Âi¬Âb¬Â[¬ÂT¬ÂM¬ÂF¬Â?¬Â8¬Â1¬Â*¬Â#¬Â¬Â¬Â¬Â¬Â¬Âù«Âò«Âë«Âä«ÂÝ«ÂÖ«ÂÏ«ÂÈ«ÂÁ«Âº«Â³«Â¬«Â¥«Âž«Â—«Â«Â‰«Â‚«Â{«Ât«Âm«Âf«Â_«ÂX«ÂQ«ÂJ«ÂC«Â<«Â5«Â.«Â'«Â «Â«Â«Â «Â«ÂýªÂöªÂïªÂèªÂáªÂÚªÂÓªÂ̪ÂŪ¾ªÂ·ªÂ°ªÂ©ªÂ¢ªÂ›ªÂ”ªÂªÂ†ªÂªÂxªÂqªÂjªÂcªÂ\ªÂUªÂNªÂGªÂ@ªÂ9ªÂ2ªÂ+ªÂ$ªÂªÂªÂªÂªÂªÂú©Âó©Âì©Âå©ÂÞ©ÂשÂЩÂɩ©»©Â´©Â­©Â¦©ÂŸ©Â˜©Â‘©ÂŠ©Âƒ©Â|©Âu©Ân©Âg©Â`©ÂY©ÂR©ÂK©ÂD©Â=©Â6©Â/©Â(©Â!©Â©Â©Â ©Â©Âþ¨Â÷¨Âð¨Âé¨Ââ¨ÂÛ¨ÂÔ¨ÂͨÂƨ¿¨Â¸¨Â±¨Âª¨Â£¨Âœ¨Â•¨Âލ‡¨Â€¨Ây¨Âr¨Âk¨Âd¨Â]¨ÂV¨ÂO¨ÂH¨ÂA¨Â:¨Â3¨Â,¨Â%¨Â¨Â¨Â¨Â ¨Â¨Âû§Âô§Âí§Âæ§Âß§ÂاÂѧÂʧÂ缧µ§Â®§Â§§Â §Â™§Â’§Â‹§Â„§Â}§Âv§Âo§Âh§Âa§ÂZ§ÂS§ÂL§ÂE§Â>§Â7§Â0§Â)§Â"§Â§Â§Â §Â§Âÿ¦Âø¦Âñ¦Âê¦Âã¦ÂܦÂÕ¦ÂΦÂǦÂÀ¦Â¹¦Â²¦Â«¦Â¤¦Â¦Â–¦Â¦Âˆ¦Â¦Âz¦Âs¦Âl¦Âe¦Â^¦ÂW¦ÂP¦ÂI¦ÂB¦Â;¦Â4¦Â-¦Â&¦Â¦Â¦Â¦Â ¦Â¦Âü¥Âõ¥Âî¥Âç¥Âà¥ÂÙ¥ÂÒ¥ÂË¥Âĥ½¥Â¶¥Â¯¥Â¨¥Â¡¥Âš¥Â“¥ÂŒ¥Â…¥Â~¥Âw¥Âp¥Âi¥Âb¥Â[¥ÂT¥ÂM¥ÂF¥Â?¥Â8¥Â1¥Â*¥Â#¥Â¥Â¥Â¥Â¥Â¥Âù¤Âò¤Âë¤Âä¤ÂݤÂÖ¤ÂϤÂȤÂÁ¤Âº¤Â³¤Â¬¤Â¥¤Âž¤Â—¤Â¤Â‰¤Â‚¤Â{¤Ât¤Âm¤Âf¤Â_¤ÂX¤ÂQ¤ÂJ¤ÂC¤Â<¤Â5¤Â.¤Â'¤Â ¤Â¤Â¤Â ¤Â¤Âý£Âö£Âï£Âè£Âá£ÂÚ£ÂÓ£ÂÌ£Âţ¾£Â·£Â°£Â©£Â¢£Â›£Â”£Â£Â†£Â£Âx£Âq£Âj£Âc£Â\£ÂU£ÂN£ÂG£Â@£Â9£Â2£Â+£Â$£Â£Â£Â£Â£Â£Âú¢Âó¢Âì¢Âå¢ÂÞ¢Â×¢ÂТÂɢ¢»¢Â´¢Â­¢Â¦¢ÂŸ¢Â˜¢Â‘¢ÂŠ¢Âƒ¢Â|¢Âu¢Ân¢Âg¢Â`¢ÂY¢ÂR¢ÂK¢ÂD¢Â=¢Â6¢Â/¢Â(¢Â!¢Â¢Â¢Â ¢Â¢Âþ¡Â÷¡Âð¡Âé¡Ââ¡ÂÛ¡ÂÔ¡ÂÍ¡ÂÆ¡Â¿¡Â¸¡Â±¡Âª¡Â£¡Âœ¡Â•¡ÂŽ¡Â‡¡Â€¡Ây¡Âr¡Âk¡Âd¡Â]¡ÂV¡ÂO¡ÂH¡ÂA¡Â:¡Â3¡Â,¡Â%¡Â¡Â¡Â¡Â ¡Â¡Âû Âô Âí Âæ Âß ÂØ ÂÑ ÂÊ Â༠µ Â® Â§ Â  Â™ Â’ Â‹ Â„ Â} Âv Âo Âh Âa ÂZ ÂS ÂL ÂE Â> Â7 Â0 Â) Â" Â Â Â  Â ÂÿŸÂøŸÂñŸÂêŸÂãŸÂÜŸÂÕŸÂΟÂÇŸÂÀŸÂ¹ŸÂ²ŸÂ«ŸÂ¤ŸÂŸÂ–ŸÂŸÂˆŸÂŸÂzŸÂsŸÂlŸÂeŸÂ^ŸÂWŸÂPŸÂIŸÂBŸÂ;ŸÂ4ŸÂ-ŸÂ&ŸÂŸÂŸÂŸÂ ŸÂŸÂüžÂõžÂîžÂçžÂàžÂÙžÂÒžÂËžÂнžÂ¶žÂ¯žÂ¨žÂ¡žÂšžÂ“žÂŒžÂ…žÂ~žÂwžÂpžÂižÂbžÂ[žÂTžÂMžÂFžÂ?žÂ8žÂ1žÂ*žÂ#žÂžÂžÂžÂžÂžÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýœÂöœÂïœÂèœÂáœÂÚœÂÓœÂÌœÂŜ¾œÂ·œÂ°œÂ©œÂ¢œÂ›œÂ”œÂœÂ†œÂœÂxœÂqœÂjœÂcœÂ\œÂUœÂNœÂGœÂ@œÂ9œÂ2œÂ+œÂ$œÂœÂœÂœÂœÂœÂú›Âó›Âì›Âå›ÂÞ›Â×›ÂЛÂɛ›»›Â´›Â­›Â¦›ÂŸ›Â˜›Â‘›ÂŠ›Âƒ›Â|›Âu›Ân›Âg›Â`›ÂY›ÂR›ÂK›ÂD›Â=›Â6›Â/›Â(›Â!›Â›Â›Â ›Â›ÂþšÂ÷šÂðšÂéšÂâšÂÛšÂÔšÂÍšÂÆšÂ¿šÂ¸šÂ±šÂªšÂ£šÂœšÂ•šÂŽšÂ‡šÂ€šÂyšÂršÂkšÂdšÂ]šÂVšÂOšÂHšÂAšÂ:šÂ3šÂ,šÂ%šÂšÂšÂšÂ šÂšÂû™Âô™Âí™Âæ™Âß™ÂØ™ÂÑ™ÂÊ™ÂÙ¼™Âµ™Â®™Â§™Â ™Â™™Â’™Â‹™Â„™Â}™Âv™Âo™Âh™Âa™ÂZ™ÂS™ÂL™ÂE™Â>™Â7™Â0™Â)™Â"™Â™Â™Â ™Â™Âÿ˜Âø˜Âñ˜Âê˜Âã˜ÂܘÂÕ˜ÂΘÂǘÂÀ˜Â¹˜Â²˜Â«˜Â¤˜Â˜Â–˜Â˜Âˆ˜Â˜Âz˜Âs˜Âl˜Âe˜Â^˜ÂW˜ÂP˜ÂI˜ÂB˜Â;˜Â4˜Â-˜Â&˜Â˜Â˜Â˜Â ˜Â˜Âü—Âõ—Âî—Âç—Âà—ÂÙ—ÂÒ—ÂË—Âė½—¶—¯—¨—¡—š—“—ÂŒ—Â…—Â~—Âw—Âp—Âi—Âb—Â[—ÂT—ÂM—ÂF—Â?—Â8—Â1—Â*—Â#——————Âù–Âò–Âë–Âä–ÂÝ–ÂÖ–ÂÏ–ÂÈ–ÂÁ–º–³–¬–Â¥–ž–—––‰–‚–Â{–Ât–Âm–Âf–Â_–ÂX–ÂQ–ÂJ–ÂC–Â<–Â5–Â.–Â'– ––– ––Âý•Âö•Âï•Âè•Âá•ÂÚ•ÂÓ•ÂÌ•Âŕ¾•·•°•©•¢•›•”••†••Âx•Âq•Âj•Âc•Â\•ÂU•ÂN•ÂG•Â@•Â9•Â2•Â+•Â$••••••Âú”Âó”Âì”Âå”ÂÞ”Â×”ÂДÂɔ”»”´”­”¦”Ÿ”˜”‘”Š”ƒ”Â|”Âu”Ân”Âg”Â`”ÂY”ÂR”ÂK”ÂD”Â=”Â6”Â/”Â(”Â!””” ””Âþ“Â÷“Âð“Âé“Ââ“ÂÛ“ÂÔ“ÂÍ“ÂÆ“¿“¸“±“ª“£“œ“•“ÂŽ“‡“€“Ây“Âr“Âk“Âd“Â]“ÂV“ÂO“ÂH“ÂA“Â:“Â3“Â,“Â%““““ ““Âû’Âô’Âí’Âæ’Âß’ÂØ’ÂÑ’ÂÊ’ÂÒ¼’µ’®’§’ ’™’Â’’‹’„’Â}’Âv’Âo’Âh’Âa’ÂZ’ÂS’ÂL’ÂE’Â>’Â7’Â0’Â)’Â"’Â’Â’Â ’Â’Âÿ‘Âø‘Âñ‘Âê‘Âã‘ÂÜ‘ÂÕ‘ÂΑÂÇ‘ÂÀ‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘Âz‘Âs‘Âl‘Âe‘Â^‘ÂW‘ÂP‘ÂI‘ÂB‘Â;‘Â4‘Â-‘Â&‘‘‘‘ ‘‘ÂüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýŽÂöŽÂïŽÂèŽÂáŽÂÚŽÂÓŽÂÌŽÂŎ¾ŽÂ·ŽÂ°ŽÂ©ŽÂ¢ŽÂ›ŽÂ”ŽÂŽÂ†ŽÂŽÂxŽÂqŽÂjŽÂcŽÂ\ŽÂUŽÂNŽÂGŽÂ@ŽÂ9ŽÂ2ŽÂ+ŽÂ$ŽÂŽÂŽÂŽÂŽÂŽÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþŒÂ÷ŒÂðŒÂéŒÂâŒÂÛŒÂÔŒÂÍŒÂÆŒÂ¿ŒÂ¸ŒÂ±ŒÂªŒÂ£ŒÂœŒÂ•ŒÂŽŒÂ‡ŒÂ€ŒÂyŒÂrŒÂkŒÂdŒÂ]ŒÂVŒÂOŒÂHŒÂAŒÂ:ŒÂ3ŒÂ,ŒÂ%ŒÂŒÂŒÂŒÂ ŒÂŒÂû‹Âô‹Âí‹Âæ‹Âß‹ÂØ‹ÂÑ‹ÂÊ‹Â˼‹Âµ‹Â®‹Â§‹Â ‹Â™‹Â’‹Â‹‹Â„‹Â}‹Âv‹Âo‹Âh‹Âa‹ÂZ‹ÂS‹ÂL‹ÂE‹Â>‹Â7‹Â0‹Â)‹Â"‹Â‹Â‹Â ‹Â‹ÂÿŠÂøŠÂñŠÂêŠÂãŠÂÜŠÂÕŠÂΊÂÇŠÂÀŠÂ¹ŠÂ²ŠÂ«ŠÂ¤ŠÂŠÂ–ŠÂŠÂˆŠÂŠÂzŠÂsŠÂlŠÂeŠÂ^ŠÂWŠÂPŠÂIŠÂBŠÂ;ŠÂ4ŠÂ-ŠÂ&ŠÂŠÂŠÂŠÂ ŠÂŠÂü‰Âõ‰Âî‰Âç‰Âà‰ÂÙ‰ÂÒ‰ÂˉÂĉ½‰Â¶‰Â¯‰Â¨‰Â¡‰Âš‰Â“‰ÂŒ‰Â…‰Â~‰Âw‰Âp‰Âi‰Âb‰Â[‰ÂT‰ÂM‰ÂF‰Â?‰Â8‰Â1‰Â*‰Â#‰Â‰Â‰Â‰Â‰Â‰ÂùˆÂòˆÂëˆÂäˆÂ݈ÂÖˆÂψÂȈÂÁˆÂºˆÂ³ˆÂ¬ˆÂ¥ˆÂžˆÂ—ˆÂˆÂ‰ˆÂ‚ˆÂ{ˆÂtˆÂmˆÂfˆÂ_ˆÂXˆÂQˆÂJˆÂCˆÂ<ˆÂ5ˆÂ.ˆÂ'ˆÂ ˆÂˆÂˆÂ ˆÂˆÂý‡Âö‡Âï‡Âè‡Âá‡ÂÚ‡ÂÓ‡Â̇ÂŇ¾‡Â·‡Â°‡Â©‡Â¢‡Â›‡Â”‡Â‡Â†‡Â‡Âx‡Âq‡Âj‡Âc‡Â\‡ÂU‡ÂN‡ÂG‡Â@‡Â9‡Â2‡Â+‡Â$‡Â‡Â‡Â‡Â‡Â‡Âú†Âó†Âì†Âå†ÂÞ†Â׆ÂІÂɆ†»†Â´†Â­†Â¦†ÂŸ†Â˜†Â‘†ÂІÂƒ†Â|†Âu†Ân†Âg†Â`†ÂY†ÂR†ÂK†ÂD†Â=†Â6†Â/†Â(†Â!†Â†Â†Â †Â†Âþ…Â÷…Âð…Âé…Ââ…ÂÛ…ÂÔ…ÂÍ…ÂÆ…¿…¸…±…ª…£…œ…•…ÂŽ…‡…€…Ây…Âr…Âk…Âd…Â]…ÂV…ÂO…ÂH…ÂA…Â:…Â3…Â,…Â%…Â…Â…Â…Â …Â…Âû„Âô„Âí„Âæ„Âß„ÂØ„ÂÑ„ÂÊ„Â„®„§„ „™„Â’„‹„„„Â}„Âv„Âo„Âh„Âa„ÂZ„ÂS„ÂL„ÂE„Â>„Â7„Â0„Â)„Â"„„„ „„ÂÿƒÂøƒÂñƒÂêƒÂãƒÂ܃ÂÕƒÂ΃ÂǃÂÀƒÂ¹ƒÂ²ƒÂ«ƒÂ¤ƒÂƒÂ–ƒÂƒÂˆƒÂƒÂzƒÂsƒÂlƒÂeƒÂ^ƒÂWƒÂPƒÂIƒÂBƒÂ;ƒÂ4ƒÂ-ƒÂ&ƒÂƒÂƒÂƒÂ ƒÂƒÂü‚Âõ‚Âî‚Âç‚Âà‚ÂÙ‚ÂÒ‚ÂË‚ÂĂ½‚¶‚¯‚¨‚¡‚š‚“‚ÂŒ‚Â…‚Â~‚Âw‚Âp‚Âi‚Âb‚Â[‚ÂT‚ÂM‚ÂF‚Â?‚Â8‚Â1‚Â*‚Â#‚‚‚‚‚‚ÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂý€Âö€Âï€Âè€Âá€ÂÚ€ÂÓ€ÂÌ€Âŀ¾€Â·€Â°€Â©€Â¢€Â›€Â”€Â€Â†€Â€Âx€Âq€Âj€Âc€Â\€ÂU€ÂN€ÂG€Â@€Â9€Â2€Â+€Â$€Â€Â€Â€Â€Â€ÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþ~Â÷~Âð~Âé~Ââ~ÂÛ~ÂÔ~ÂÍ~ÂÆ~¿~¸~±~ª~£~œ~•~ÂŽ~‡~€~Ây~Âr~Âk~Âd~Â]~ÂV~ÂO~ÂH~ÂA~Â:~Â3~Â,~Â%~Â~Â~Â~ ~Â~Âû}Âô}Âí}Âæ}Âß}ÂØ}ÂÑ}ÂÊ}ÂÃ}¼}µ}®}§} }™}Â’}‹}„}Â}}Âv}Âo}Âh}Âa}ÂZ}ÂS}ÂL}ÂE}Â>}Â7}Â0}Â)}Â"}Â}Â} }Â}Âÿ|Âø|Âñ|Âê|Âã|ÂÜ|ÂÕ|ÂÎ|ÂÇ|ÂÀ|¹|²|«|¤|Â|–|Â|ˆ|Â|Âz|Âs|Âl|Âe|Â^|ÂW|ÂP|ÂI|ÂB|Â;|Â4|Â-|Â&|Â|Â|Â| |Â|Âü{Âõ{Âî{Âç{Âà{ÂÙ{ÂÒ{ÂË{ÂÄ{½{¶{¯{¨{¡{š{“{ÂŒ{Â…{Â~{Âw{Âp{Âi{Âb{Â[{ÂT{ÂM{ÂF{Â?{Â8{Â1{Â*{Â#{Â{Â{Â{Â{Â{ÂùzÂòzÂëzÂäzÂÝzÂÖzÂÏzÂÈzÂÁzºz³z¬zÂ¥zžz—zÂz‰z‚zÂ{zÂtzÂmzÂfzÂ_zÂXzÂQzÂJzÂCzÂvÂ7vÂ0vÂ)vÂ"vÂvÂv vÂvÂÿuÂøuÂñuÂêuÂãuÂÜuÂÕuÂÎuÂÇuÂÀu¹u²u«u¤uÂu–uÂuˆuÂuÂzuÂsuÂluÂeuÂ^uÂWuÂPuÂIuÂBuÂ;uÂ4uÂ-uÂ&uÂuÂuÂu uÂuÂütÂõtÂîtÂçtÂàtÂÙtÂÒtÂËtÂÄt½t¶t¯t¨t¡tšt“tÂŒtÂ…tÂ~tÂwtÂptÂitÂbtÂ[tÂTtÂMtÂFtÂ?tÂ8tÂ1tÂ*tÂ#tÂtÂtÂtÂtÂtÂùsÂòsÂësÂäsÂÝsÂÖsÂÏsÂÈsÂÁsºs³s¬sÂ¥sžs—sÂs‰s‚sÂ{sÂtsÂmsÂfsÂ_sÂXsÂQsÂJsÂCsÂoÂ7oÂ0oÂ)oÂ"oÂoÂo oÂoÂÿnÂønÂñnÂênÂãnÂÜnÂÕnÂÎnÂÇnÂÀn¹n²n«n¤nÂn–nÂnˆnÂnÂznÂsnÂlnÂenÂ^nÂWnÂPnÂInÂBnÂ;nÂ4nÂ-nÂ&nÂnÂnÂn nÂnÂümÂõmÂîmÂçmÂàmÂÙmÂÒmÂËmÂÄm½m¶m¯m¨m¡mšm“mÂŒmÂ…mÂ~mÂwmÂpmÂimÂbmÂ[mÂTmÂMmÂFmÂ?mÂ8mÂ1mÂ*mÂ#mÂmÂmÂmÂmÂmÂùlÂòlÂëlÂälÂÝlÂÖlÂÏlÂÈlÂÁlºl³l¬lÂ¥lžl—lÂl‰l‚lÂ{lÂtlÂmlÂflÂ_lÂXlÂQlÂJlÂClÂhÂ7hÂ0hÂ)hÂ"hÂhÂh hÂhÂÿgÂøgÂñgÂêgÂãgÂÜgÂÕgÂÎgÂÇgÂÀg¹g²g«g¤gÂg–gÂgˆgÂgÂzgÂsgÂlgÂegÂ^gÂWgÂPgÂIgÂBgÂ;gÂ4gÂ-gÂ&gÂgÂgÂg gÂgÂüfÂõfÂîfÂçfÂàfÂÙfÂÒfÂËfÂÄf½f¶f¯f¨f¡fšf“fÂŒfÂ…fÂ~fÂwfÂpfÂifÂbfÂ[fÂTfÂMfÂFfÂ?fÂ8fÂ1fÂ*fÂ#fÂfÂfÂfÂfÂfÂùeÂòeÂëeÂäeÂÝeÂÖeÂÏeÂÈeÂÁeºe³e¬eÂ¥eže—eÂe‰e‚eÂ{eÂteÂmeÂfeÂ_eÂXeÂQeÂJeÂCeÂaÂ7aÂ0aÂ)aÂ"aÂaÂa aÂaÂÿ`Âø`Âñ`Âê`Âã`ÂÜ`ÂÕ`ÂÎ`ÂÇ`ÂÀ`¹`²`«`¤`Â`–`Â`ˆ`Â`Âz`Âs`Âl`Âe`Â^`ÂW`ÂP`ÂI`ÂB`Â;`Â4`Â-`Â&`Â`Â`Â` `Â`Âü_Âõ_Âî_Âç_Âà_ÂÙ_ÂÒ_ÂË_ÂÄ_½_¶_¯_¨_¡_š_“_ÂŒ_Â…_Â~_Âw_Âp_Âi_Âb_Â[_ÂT_ÂM_ÂF_Â?_Â8_Â1_Â*_Â#_Â_Â_Â_Â_Â_Âù^Âò^Âë^Âä^ÂÝ^ÂÖ^ÂÏ^ÂÈ^ÂÁ^º^³^¬^Â¥^ž^—^Â^‰^‚^Â{^Ât^Âm^Âf^Â_^ÂX^ÂQ^ÂJ^ÂC^Â<^Â5^Â.^Â'^ ^Â^Â^ ^Â^Âý]Âö]Âï]Âè]Âá]ÂÚ]ÂÓ]ÂÌ]ÂÅ]¾]·]°]©]¢]›]”]Â]†]Â]Âx]Âq]Âj]Âc]Â\]ÂU]ÂN]ÂG]Â@]Â9]Â2]Â+]Â$]Â]Â]Â]Â]Â]Âú\Âó\Âì\Âå\ÂÞ\Â×\ÂÐ\ÂÉ\ÂÂ\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\Â|\Âu\Ân\Âg\Â`\ÂY\ÂR\ÂK\ÂD\Â=\Â6\Â/\Â(\Â!\Â\Â\ \Â\Âþ[Â÷[Âð[Âé[Ââ[ÂÛ[ÂÔ[ÂÍ[ÂÆ[¿[¸[±[ª[£[œ[•[ÂŽ[‡[€[Ây[Âr[Âk[Âd[Â][ÂV[ÂO[ÂH[ÂA[Â:[Â3[Â,[Â%[Â[Â[Â[ [Â[ÂûZÂôZÂíZÂæZÂßZÂØZÂÑZÂÊZÂÃZ¼ZµZ®Z§Z Z™ZÂ’Z‹Z„ZÂ}ZÂvZÂoZÂhZÂaZÂZZÂSZÂLZÂEZÂ>ZÂ7ZÂ0ZÂ)ZÂ"ZÂZÂZ ZÂZÂÿYÂøYÂñYÂêYÂãYÂÜYÂÕYÂÎYÂÇYÂÀY¹Y²Y«Y¤YÂY–YÂYˆYÂYÂzYÂsYÂlYÂeYÂ^YÂWYÂPYÂIYÂBYÂ;YÂ4YÂ-YÂ&YÂYÂYÂY YÂYÂüXÂõXÂîXÂçXÂàXÂÙXÂÒXÂËXÂÄX½X¶X¯X¨X¡XšX“XÂŒXÂ…XÂ~XÂwXÂpXÂiXÂbXÂ[XÂTXÂMXÂFXÂ?XÂ8XÂ1XÂ*XÂ#XÂXÂXÂXÂXÂXÂùWÂòWÂëWÂäWÂÝWÂÖWÂÏWÂÈWÂÁWºW³W¬WÂ¥WžW—WÂW‰W‚WÂ{WÂtWÂmWÂfWÂ_WÂXWÂQWÂJWÂCWÂSÂ7SÂ0SÂ)SÂ"SÂSÂS SÂSÂÿRÂøRÂñRÂêRÂãRÂÜRÂÕRÂÎRÂÇRÂÀR¹R²R«R¤RÂR–RÂRˆRÂRÂzRÂsRÂlRÂeRÂ^RÂWRÂPRÂIRÂBRÂ;RÂ4RÂ-RÂ&RÂRÂRÂR RÂRÂüQÂõQÂîQÂçQÂàQÂÙQÂÒQÂËQÂÄQ½Q¶Q¯Q¨Q¡QšQ“QÂŒQÂ…QÂ~QÂwQÂpQÂiQÂbQÂ[QÂTQÂMQÂFQÂ?QÂ8QÂ1QÂ*QÂ#QÂQÂQÂQÂQÂQÂùPÂòPÂëPÂäPÂÝPÂÖPÂÏPÂÈPÂÁPºP³P¬PÂ¥PžP—PÂP‰P‚PÂ{PÂtPÂmPÂfPÂ_PÂXPÂQPÂJPÂCPÂLÂ7LÂ0LÂ)LÂ"LÂLÂL LÂLÂÿKÂøKÂñKÂêKÂãKÂÜKÂÕKÂÎKÂÇKÂÀK¹K²K«K¤KÂK–KÂKˆKÂKÂzKÂsKÂlKÂeKÂ^KÂWKÂPKÂIKÂBKÂ;KÂ4KÂ-KÂ&KÂKÂKÂK KÂKÂüJÂõJÂîJÂçJÂàJÂÙJÂÒJÂËJÂÄJ½J¶J¯J¨J¡JšJ“JÂŒJÂ…JÂ~JÂwJÂpJÂiJÂbJÂ[JÂTJÂMJÂFJÂ?JÂ8JÂ1JÂ*JÂ#JÂJÂJÂJÂJÂJÂùIÂòIÂëIÂäIÂÝIÂÖIÂÏIÂÈIÂÁIºI³I¬IÂ¥IžI—IÂI‰I‚IÂ{IÂtIÂmIÂfIÂ_IÂXIÂQIÂJIÂCIÂEÂ7EÂ0EÂ)EÂ"EÂEÂE EÂEÂÿDÂøDÂñDÂêDÂãDÂÜDÂÕDÂÎDÂÇDÂÀD¹D²D«D¤DÂD–DÂDˆDÂDÂzDÂsDÂlDÂeDÂ^DÂWDÂPDÂIDÂBDÂ;DÂ4DÂ-DÂ&DÂDÂDÂD DÂDÂüCÂõCÂîCÂçCÂàCÂÙCÂÒCÂËCÂÄC½C¶C¯C¨C¡CšC“CÂŒCÂ…CÂ~CÂwCÂpCÂiCÂbCÂ[CÂTCÂMCÂFCÂ?CÂ8CÂ1CÂ*CÂ#CÂCÂCÂCÂCÂCÂùBÂòBÂëBÂäBÂÝBÂÖBÂÏBÂÈBÂÁBºB³B¬BÂ¥BžB—BÂB‰B‚BÂ{BÂtBÂmBÂfBÂ_BÂXBÂQBÂJBÂCBÂÂô>Âí>Âæ>Âß>ÂØ>ÂÑ>ÂÊ>ÂÃ>¼>µ>®>§> >™>Â’>‹>„>Â}>Âv>Âo>Âh>Âa>ÂZ>ÂS>ÂL>ÂE>Â>>Â7>Â0>Â)>Â">Â>Â> >Â>Âÿ=Âø=Âñ=Âê=Âã=ÂÜ=ÂÕ=ÂÎ=ÂÇ=ÂÀ=¹=²=«=¤=Â=–=Â=ˆ=Â=Âz=Âs=Âl=Âe=Â^=ÂW=ÂP=ÂI=ÂB=Â;=Â4=Â-=Â&=Â=Â=Â= =Â=Âü<Âõ<Âî<Âç<Âà<ÂÙ<ÂÒ<ÂË<ÂÄ<½<¶<¯<¨<¡<š<“<ÂŒ<Â…<Â~<Âw<Âp<Âi<Âb<Â[<ÂT<ÂM<ÂF<Â?<Â8<Â1<Â*<Â#<Â<Â<Â<Â<Â<Âù;Âò;Âë;Âä;ÂÝ;ÂÖ;ÂÏ;ÂÈ;ÂÁ;º;³;¬;Â¥;ž;—;Â;‰;‚;Â{;Ât;Âm;Âf;Â_;ÂX;ÂQ;ÂJ;ÂC;Â<;Â5;Â.;Â'; ;Â;Â; ;Â;Âý:Âö:Âï:Âè:Âá:ÂÚ:ÂÓ:ÂÌ:ÂÅ:¾:·:°:©:¢:›:”:Â:†:Â:Âx:Âq:Âj:Âc:Â\:ÂU:ÂN:ÂG:Â@:Â9:Â2:Â+:Â$:Â:Â:Â:Â:Â:Âú9Âó9Âì9Âå9ÂÞ9Â×9ÂÐ9ÂÉ9ÂÂ9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9Â|9Âu9Ân9Âg9Â`9ÂY9ÂR9ÂK9ÂD9Â=9Â69Â/9Â(9Â!9Â9Â9 9Â9Âþ8Â÷8Âð8Âé8Ââ8ÂÛ8ÂÔ8ÂÍ8ÂÆ8¿8¸8±8ª8£8œ8•8ÂŽ8‡8€8Ây8Âr8Âk8Âd8Â]8ÂV8ÂO8ÂH8ÂA8Â:8Â38Â,8Â%8Â8Â8Â8 8Â8Âû7Âô7Âí7Âæ7Âß7ÂØ7ÂÑ7ÂÊ7ÂÃ7¼7µ7®7§7 7™7Â’7‹7„7Â}7Âv7Âo7Âh7Âa7ÂZ7ÂS7ÂL7ÂE7Â>7Â77Â07Â)7Â"7Â7Â7 7Â7Âÿ6Âø6Âñ6Âê6Âã6ÂÜ6ÂÕ6ÂÎ6ÂÇ6ÂÀ6¹6²6«6¤6Â6–6Â6ˆ6Â6Âz6Âs6Âl6Âe6Â^6ÂW6ÂP6ÂI6ÂB6Â;6Â46Â-6Â&6Â6Â6Â6 6Â6Âü5Âõ5Âî5Âç5Âà5ÂÙ5ÂÒ5ÂË5ÂÄ5½5¶5¯5¨5¡5š5“5ÂŒ5Â…5Â~5Âw5Âp5Âi5Âb5Â[5ÂT5ÂM5ÂF5Â?5Â85Â15Â*5Â#5Â5Â5Â5Â5Â5Âù4Âò4Âë4Âä4ÂÝ4ÂÖ4ÂÏ4ÂÈ4ÂÁ4º4³4¬4Â¥4ž4—4Â4‰4‚4Â{4Ât4Âm4Âf4Â_4ÂX4ÂQ4ÂJ4ÂC4Â<4Â54Â.4Â'4 4Â4Â4 4Â4Âý3Âö3Âï3Âè3Âá3ÂÚ3ÂÓ3ÂÌ3ÂÅ3¾3·3°3©3¢3›3”3Â3†3Â3Âx3Âq3Âj3Âc3Â\3ÂU3ÂN3ÂG3Â@3Â93Â23Â+3Â$3Â3Â3Â3Â3Â3Âú2Âó2Âì2Âå2ÂÞ2Â×2ÂÐ2ÂÉ2ÂÂ2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2Â|2Âu2Ân2Âg2Â`2ÂY2ÂR2ÂK2ÂD2Â=2Â62Â/2Â(2Â!2Â2Â2 2Â2Âþ1Â÷1Âð1Âé1Ââ1ÂÛ1ÂÔ1ÂÍ1ÂÆ1¿1¸1±1ª1£1œ1•1ÂŽ1‡1€1Ây1Âr1Âk1Âd1Â]1ÂV1ÂO1ÂH1ÂA1Â:1Â31Â,1Â%1Â1Â1Â1 1Â1Âû0Âô0Âí0Âæ0Âß0ÂØ0ÂÑ0ÂÊ0ÂÃ0¼0µ0®0§0 0™0Â’0‹0„0Â}0Âv0Âo0Âh0Âa0ÂZ0ÂS0ÂL0ÂE0Â>0Â70Â00Â)0Â"0Â0Â0 0Â0Âÿ/Âø/Âñ/Âê/Âã/ÂÜ/ÂÕ/ÂÎ/ÂÇ/ÂÀ/¹/²/«/¤/Â/–/Â/ˆ/Â/Âz/Âs/Âl/Âe/Â^/ÂW/ÂP/ÂI/ÂB/Â;/Â4/Â-/Â&/Â/Â/Â/ /Â/Âü.Âõ.Âî.Âç.Âà.ÂÙ.ÂÒ.ÂË.ÂÄ.½.¶.¯.¨.¡.š.“.ÂŒ.Â….Â~.Âw.Âp.Âi.Âb.Â[.ÂT.ÂM.ÂF.Â?.Â8.Â1.Â*.Â#.Â.Â.Â.Â.Â.Âù-Âò-Âë-Âä-ÂÝ-ÂÖ-ÂÏ-ÂÈ-ÂÁ-º-³-¬-Â¥-ž-—-Â-‰-‚-Â{-Ât-Âm-Âf-Â_-ÂX-ÂQ-ÂJ-ÂC-Â<-Â5-Â.-Â'- -Â-Â- -Â-Âý,Âö,Âï,Âè,Âá,ÂÚ,ÂÓ,ÂÌ,ÂÅ,¾,·,°,©,¢,›,”,Â,†,Â,Âx,Âq,Âj,Âc,Â\,ÂU,ÂN,ÂG,Â@,Â9,Â2,Â+,Â$,Â,Â,Â,Â,Â,Âú+Âó+Âì+Âå+ÂÞ+Â×+ÂÐ+ÂÉ+ÂÂ+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+Â|+Âu+Ân+Âg+Â`+ÂY+ÂR+ÂK+ÂD+Â=+Â6+Â/+Â(+Â!+Â+Â+ +Â+Âþ*Â÷*Âð*Âé*Ââ*ÂÛ*ÂÔ*ÂÍ*ÂÆ*¿*¸*±*ª*£*œ*•*ÂŽ*‡*€*Ây*Âr*Âk*Âd*Â]*ÂV*ÂO*ÂH*ÂA*Â:*Â3*Â,*Â%*Â*Â*Â* *Â*Âû)Âô)Âí)Âæ)Âß)ÂØ)ÂÑ)ÂÊ)ÂÃ)¼)µ)®)§) )™)Â’)‹)„)Â})Âv)Âo)Âh)Âa)ÂZ)ÂS)ÂL)ÂE)Â>)Â7)Â0)Â))Â")Â)Â) )Â)Âÿ(Âø(Âñ(Âê(Âã(ÂÜ(ÂÕ(ÂÎ(ÂÇ(ÂÀ(¹(²(«(¤(Â(–(Â(ˆ(Â(Âz(Âs(Âl(Âe(Â^(ÂW(ÂP(ÂI(ÂB(Â;(Â4(Â-(Â&(Â(Â(Â( (Â(Âü'Âõ'Âî'Âç'Âà'ÂÙ'ÂÒ'ÂË'ÂÄ'½'¶'¯'¨'¡'š'“'ÂŒ'Â…'Â~'Âw'Âp'Âi'Âb'Â['ÂT'ÂM'ÂF'Â?'Â8'Â1'Â*'Â#'Â'Â'Â'Â'Â'Âù&Âò&Âë&Âä&ÂÝ&ÂÖ&ÂÏ&ÂÈ&ÂÁ&º&³&¬&Â¥&ž&—&Â&‰&‚&Â{&Ât&Âm&Âf&Â_&ÂX&ÂQ&ÂJ&ÂC&Â<&Â5&Â.&Â'& &Â&Â& &Â&Âý%Âö%Âï%Âè%Âá%ÂÚ%ÂÓ%ÂÌ%ÂÅ%¾%·%°%©%¢%›%”%Â%†%Â%Âx%Âq%Âj%Âc%Â\%ÂU%ÂN%ÂG%Â@%Â9%Â2%Â+%Â$%Â%Â%Â%Â%Â%Âú$Âó$Âì$Âå$ÂÞ$Â×$ÂÐ$ÂÉ$ÂÂ$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$Â|$Âu$Ân$Âg$Â`$ÂY$ÂR$ÂK$ÂD$Â=$Â6$Â/$Â($Â!$Â$Â$ $Â$Âþ#Â÷#Âð#Âé#Ââ#ÂÛ#ÂÔ#ÂÍ#ÂÆ#¿#¸#±#ª#£#œ#•#ÂŽ#‡#€#Ây#Âr#Âk#Âd#Â]#ÂV#ÂO#ÂH#ÂA#Â:#Â3#Â,#Â%#Â#Â#Â# #Â#Âû"Âô"Âí"Âæ"Âß"ÂØ"ÂÑ"ÂÊ"ÂÃ"¼"µ"®"§" "™"Â’"‹"„"Â}"Âv"Âo"Âh"Âa"ÂZ"ÂS"ÂL"ÂE"Â>"Â7"Â0"Â)"Â""Â"Â" "Â"Âÿ!Âø!Âñ!Âê!Âã!ÂÜ!ÂÕ!ÂÎ!ÂÇ!ÂÀ!¹!²!«!¤!Â!–!Â!ˆ!Â!Âz!Âs!Âl!Âe!Â^!ÂW!ÂP!ÂI!ÂB!Â;!Â4!Â-!Â&!Â!Â!Â! !Â!Âü Âõ Âî Âç Âà ÂÙ ÂÒ ÂË ÂÄ Â½ ¶ ¯ ¨ ¡ š “ ÂŒ Â… Â~ Âw Âp Âi Âb Â[ ÂT ÂM ÂF Â? Â8 Â1 Â* Â#      ÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂû Âô Âí Âæ Âß ÂØ ÂÑ ÂÊ Âà ¼ µ ® §   ™ Â’ ‹ „ Â} Âv Âo Âh Âa ÂZ ÂS ÂL ÂE Â> Â7 Â0 Â) Â"     Âÿ Âø Âñ Âê Âã ÂÜ ÂÕ ÂÎ ÂÇ ÂÀ ¹ ² « ¤  –  ˆ  Âz Âs Âl Âe Â^ ÂW ÂP ÂI ÂB Â; Â4 Â- Â&      Âü Âõ Âî Âç Âà ÂÙ ÂÒ ÂË ÂÄ Â½ ¶ ¯ ¨ ¡ š “ ÂŒ Â… Â~ Âw Âp Âi Âb Â[ ÂT ÂM ÂF Â? Â8 Â1 Â* Â#      Âù Âò Âë Âä ÂÝ ÂÖ ÂÏ ÂÈ ÂÁ º ³ ¬ Â¥ ž —  ‰ ‚ Â{ Ât Âm Âf Â_ ÂX ÂQ ÂJ ÂC Â< Â5 Â. Â'      Âý Âö Âï Âè Âá ÂÚ ÂÓ ÂÌ Âо · ° © ¢ › ”  †  Âx Âq Âj Âc Â\ ÂU ÂN ÂG Â@ Â9 Â2 Â+ Â$      ÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÿÁôÿÁíÿÁæÿÁßÿÁØÿÁÑÿÁÊÿÁÃÿÁ¼ÿÁµÿÁ®ÿÁ§ÿÁ ÿÁ™ÿÁ’ÿÁ‹ÿÁ„ÿÁ}ÿÁvÿÁoÿÁhÿÁaÿÁZÿÁSÿÁLÿÁEÿÁ>ÿÁ7ÿÁ0ÿÁ)ÿÁ"ÿÁÿÁÿÁ ÿÁÿÁÿþÁøþÁñþÁêþÁãþÁÜþÁÕþÁÎþÁÇþÁÀþÁ¹þÁ²þÁ«þÁ¤þÁþÁ–þÁþÁˆþÁþÁzþÁsþÁlþÁeþÁ^þÁWþÁPþÁIþÁBþÁ;þÁ4þÁ-þÁ&þÁþÁþÁþÁ þÁþÁüýÁõýÁîýÁçýÁàýÁÙýÁÒýÁËýÁÄýÁ½ýÁ¶ýÁ¯ýÁ¨ýÁ¡ýÁšýÁ“ýÁŒýÁ…ýÁ~ýÁwýÁpýÁiýÁbýÁ[ýÁTýÁMýÁFýÁ?ýÁ8ýÁ1ýÁ*ýÁ#ýÁýÁýÁýÁýÁýÁùüÁòüÁëüÁäüÁÝüÁÖüÁÏüÁÈüÁÁüÁºüÁ³üÁ¬üÁ¥üÁžüÁ—üÁüÁ‰üÁ‚üÁ{üÁtüÁmüÁfüÁ_üÁXüÁQüÁJüÁCüÁ<üÁ5üÁ.üÁ'üÁ üÁüÁüÁ üÁüÁýûÁöûÁïûÁèûÁáûÁÚûÁÓûÁÌûÁÅûÁ¾ûÁ·ûÁ°ûÁ©ûÁ¢ûÁ›ûÁ”ûÁûÁ†ûÁûÁxûÁqûÁjûÁcûÁ\ûÁUûÁNûÁGûÁ@ûÁ9ûÁ2ûÁ+ûÁ$ûÁûÁûÁûÁûÁûÁúúÁóúÁìúÁåúÁÞúÁ×úÁÐúÁÉúÁÂúÁ»úÁ´úÁ­úÁ¦úÁŸúÁ˜úÁ‘úÁŠúÁƒúÁ|úÁuúÁnúÁgúÁ`úÁYúÁRúÁKúÁDúÁ=úÁ6úÁ/úÁ(úÁ!úÁúÁúÁ úÁúÁþùÁ÷ùÁðùÁéùÁâùÁÛùÁÔùÁÍùÁÆùÁ¿ùÁ¸ùÁ±ùÁªùÁ£ùÁœùÁ•ùÁŽùÁ‡ùÁ€ùÁyùÁrùÁkùÁdùÁ]ùÁVùÁOùÁHùÁAùÁ:ùÁ3ùÁ,ùÁ%ùÁùÁùÁùÁ ùÁùÁûøÁôøÁíøÁæøÁßøÁØøÁÑøÁÊøÁÃøÁ¼øÁµøÁ®øÁ§øÁ øÁ™øÁ’øÁ‹øÁ„øÁ}øÁvøÁoøÁhøÁaøÁZøÁSøÁLøÁEøÁ>øÁ7øÁ0øÁ)øÁ"øÁøÁøÁ øÁøÁÿ÷Áø÷Áñ÷Áê÷Áã÷ÁÜ÷ÁÕ÷ÁÎ÷ÁÇ÷ÁÀ÷Á¹÷Á²÷Á«÷Á¤÷Á÷Á–÷Á÷Áˆ÷Á÷Áz÷Ás÷Ál÷Áe÷Á^÷ÁW÷ÁP÷ÁI÷ÁB÷Á;÷Á4÷Á-÷Á&÷Á÷Á÷Á÷Á ÷Á÷ÁüöÁõöÁîöÁçöÁàöÁÙöÁÒöÁËöÁÄöÁ½öÁ¶öÁ¯öÁ¨öÁ¡öÁšöÁ“öÁŒöÁ…öÁ~öÁwöÁpöÁiöÁböÁ[öÁTöÁMöÁFöÁ?öÁ8öÁ1öÁ*öÁ#öÁöÁöÁöÁöÁöÁùõÁòõÁëõÁäõÁÝõÁÖõÁÏõÁÈõÁÁõÁºõÁ³õÁ¬õÁ¥õÁžõÁ—õÁõÁ‰õÁ‚õÁ{õÁtõÁmõÁfõÁ_õÁXõÁQõÁJõÁCõÁ<õÁ5õÁ.õÁ'õÁ õÁõÁõÁ õÁõÁýôÁöôÁïôÁèôÁáôÁÚôÁÓôÁÌôÁÅôÁ¾ôÁ·ôÁ°ôÁ©ôÁ¢ôÁ›ôÁ”ôÁôÁ†ôÁôÁxôÁqôÁjôÁcôÁ\ôÁUôÁNôÁGôÁ@ôÁ9ôÁ2ôÁ+ôÁ$ôÁôÁôÁôÁôÁôÁúóÁóóÁìóÁåóÁÞóÁ×óÁÐóÁÉóÁÂóÁ»óÁ´óÁ­óÁ¦óÁŸóÁ˜óÁ‘óÁŠóÁƒóÁ|óÁuóÁnóÁgóÁ`óÁYóÁRóÁKóÁDóÁ=óÁ6óÁ/óÁ(óÁ!óÁóÁóÁ óÁóÁþòÁ÷òÁðòÁéòÁâòÁÛòÁÔòÁÍòÁÆòÁ¿òÁ¸òÁ±òÁªòÁ£òÁœòÁ•òÁŽòÁ‡òÁ€òÁyòÁròÁkòÁdòÁ]òÁVòÁOòÁHòÁAòÁ:òÁ3òÁ,òÁ%òÁòÁòÁòÁ òÁòÁûñÁôñÁíñÁæñÁßñÁØñÁÑñÁÊñÁÃñÁ¼ñÁµñÁ®ñÁ§ñÁ ñÁ™ñÁ’ñÁ‹ñÁ„ñÁ}ñÁvñÁoñÁhñÁañÁZñÁSñÁLñÁEñÁ>ñÁ7ñÁ0ñÁ)ñÁ"ñÁñÁñÁ ñÁñÁÿðÁøðÁñðÁêðÁãðÁÜðÁÕðÁÎðÁÇðÁÀðÁ¹ðÁ²ðÁ«ðÁ¤ðÁðÁ–ðÁðÁˆðÁðÁzðÁsðÁlðÁeðÁ^ðÁWðÁPðÁIðÁBðÁ;ðÁ4ðÁ-ðÁ&ðÁðÁðÁðÁ ðÁðÁüïÁõïÁîïÁçïÁàïÁÙïÁÒïÁËïÁÄïÁ½ïÁ¶ïÁ¯ïÁ¨ïÁ¡ïÁšïÁ“ïÁŒïÁ…ïÁ~ïÁwïÁpïÁiïÁbïÁ[ïÁTïÁMïÁFïÁ?ïÁ8ïÁ1ïÁ*ïÁ#ïÁïÁïÁïÁïÁïÁùîÁòîÁëîÁäîÁÝîÁÖîÁÏîÁÈîÁÁîÁºîÁ³îÁ¬îÁ¥îÁžîÁ—îÁîÁ‰îÁ‚îÁ{îÁtîÁmîÁfîÁ_îÁXîÁQîÁJîÁCîÁ<îÁ5îÁ.îÁ'îÁ îÁîÁîÁ îÁîÁýíÁöíÁïíÁèíÁáíÁÚíÁÓíÁÌíÁÅíÁ¾íÁ·íÁ°íÁ©íÁ¢íÁ›íÁ”íÁíÁ†íÁíÁxíÁqíÁjíÁcíÁ\íÁUíÁNíÁGíÁ@íÁ9íÁ2íÁ+íÁ$íÁíÁíÁíÁíÁíÁúìÁóìÁììÁåìÁÞìÁ×ìÁÐìÁÉìÁÂìÁ»ìÁ´ìÁ­ìÁ¦ìÁŸìÁ˜ìÁ‘ìÁŠìÁƒìÁ|ìÁuìÁnìÁgìÁ`ìÁYìÁRìÁKìÁDìÁ=ìÁ6ìÁ/ìÁ(ìÁ!ìÁìÁìÁ ìÁìÁþëÁ÷ëÁðëÁéëÁâëÁÛëÁÔëÁÍëÁÆëÁ¿ëÁ¸ëÁ±ëÁªëÁ£ëÁœëÁ•ëÁŽëÁ‡ëÁ€ëÁyëÁrëÁkëÁdëÁ]ëÁVëÁOëÁHëÁAëÁ:ëÁ3ëÁ,ëÁ%ëÁëÁëÁëÁ ëÁëÁûêÁôêÁíêÁæêÁßêÁØêÁÑêÁÊêÁÃêÁ¼êÁµêÁ®êÁ§êÁ êÁ™êÁ’êÁ‹êÁ„êÁ}êÁvêÁoêÁhêÁaêÁZêÁSêÁLêÁEêÁ>êÁ7êÁ0êÁ)êÁ"êÁêÁêÁ êÁêÁÿéÁøéÁñéÁêéÁãéÁÜéÁÕéÁÎéÁÇéÁÀéÁ¹éÁ²éÁ«éÁ¤éÁéÁ–éÁéÁˆéÁéÁzéÁséÁléÁeéÁ^éÁWéÁPéÁIéÁBéÁ;éÁ4éÁ-éÁ&éÁéÁéÁéÁ éÁéÁüèÁõèÁîèÁçèÁàèÁÙèÁÒèÁËèÁÄèÁ½èÁ¶èÁ¯èÁ¨èÁ¡èÁšèÁ“èÁŒèÁ…èÁ~èÁwèÁpèÁièÁbèÁ[èÁTèÁMèÁFèÁ?èÁ8èÁ1èÁ*èÁ#èÁèÁèÁèÁèÁèÁùçÁòçÁëçÁäçÁÝçÁÖçÁÏçÁÈçÁÁçÁºçÁ³çÁ¬çÁ¥çÁžçÁ—çÁçÁ‰çÁ‚çÁ{çÁtçÁmçÁfçÁ_çÁXçÁQçÁJçÁCçÁ<çÁ5çÁ.çÁ'çÁ çÁçÁçÁ çÁçÁýæÁöæÁïæÁèæÁáæÁÚæÁÓæÁÌæÁÅæÁ¾æÁ·æÁ°æÁ©æÁ¢æÁ›æÁ”æÁæÁ†æÁæÁxæÁqæÁjæÁcæÁ\æÁUæÁNæÁGæÁ@æÁ9æÁ2æÁ+æÁ$æÁæÁæÁæÁæÁæÁúåÁóåÁìåÁååÁÞåÁ×åÁÐåÁÉåÁÂåÁ»åÁ´åÁ­åÁ¦åÁŸåÁ˜åÁ‘åÁŠåÁƒåÁ|åÁuåÁnåÁgåÁ`åÁYåÁRåÁKåÁDåÁ=åÁ6åÁ/åÁ(åÁ!åÁåÁåÁ åÁåÁþäÁ÷äÁðäÁéäÁâäÁÛäÁÔäÁÍäÁÆäÁ¿äÁ¸äÁ±äÁªäÁ£äÁœäÁ•äÁŽäÁ‡äÁ€äÁyäÁräÁkäÁdäÁ]äÁVäÁOäÁHäÁAäÁ:äÁ3äÁ,äÁ%äÁäÁäÁäÁ äÁäÁûãÁôãÁíãÁæãÁßãÁØãÁÑãÁÊãÁÃãÁ¼ãÁµãÁ®ãÁ§ãÁ ãÁ™ãÁ’ãÁ‹ãÁ„ãÁ}ãÁvãÁoãÁhãÁaãÁZãÁSãÁLãÁEãÁ>ãÁ7ãÁ0ãÁ)ãÁ"ãÁãÁãÁ ãÁãÁÿâÁøâÁñâÁêâÁãâÁÜâÁÕâÁÎâÁÇâÁÀâÁ¹âÁ²âÁ«âÁ¤âÁâÁ–âÁâÁˆâÁâÁzâÁsâÁlâÁeâÁ^âÁWâÁPâÁIâÁBâÁ;âÁ4âÁ-âÁ&âÁâÁâÁâÁ âÁâÁüáÁõáÁîáÁçáÁàáÁÙáÁÒáÁËáÁÄáÁ½áÁ¶áÁ¯áÁ¨áÁ¡áÁšáÁ“áÁŒáÁ…áÁ~áÁwáÁpáÁiáÁbáÁ[áÁTáÁMáÁFáÁ?áÁ8áÁ1áÁ*áÁ#áÁáÁáÁáÁáÁáÁùàÁòàÁëàÁäàÁÝàÁÖàÁÏàÁÈàÁÁàÁºàÁ³àÁ¬àÁ¥àÁžàÁ—àÁàÁ‰àÁ‚àÁ{àÁtàÁmàÁfàÁ_àÁXàÁQàÁJàÁCàÁ<àÁ5àÁ.àÁ'àÁ àÁàÁàÁ àÁàÁýßÁößÁïßÁèßÁáßÁÚßÁÓßÁÌßÁÅßÁ¾ßÁ·ßÁ°ßÁ©ßÁ¢ßÁ›ßÁ”ßÁßÁ†ßÁßÁxßÁqßÁjßÁcßÁ\ßÁUßÁNßÁGßÁ@ßÁ9ßÁ2ßÁ+ßÁ$ßÁßÁßÁßÁßÁßÁúÞÁóÞÁìÞÁåÞÁÞÞÁ×ÞÁÐÞÁÉÞÁÂÞÁ»ÞÁ´ÞÁ­ÞÁ¦ÞÁŸÞÁ˜ÞÁ‘ÞÁŠÞÁƒÞÁ|ÞÁuÞÁnÞÁgÞÁ`ÞÁYÞÁRÞÁKÞÁDÞÁ=ÞÁ6ÞÁ/ÞÁ(ÞÁ!ÞÁÞÁÞÁ ÞÁÞÁþÝÁ÷ÝÁðÝÁéÝÁâÝÁÛÝÁÔÝÁÍÝÁÆÝÁ¿ÝÁ¸ÝÁ±ÝÁªÝÁ£ÝÁœÝÁ•ÝÁŽÝÁ‡ÝÁ€ÝÁyÝÁrÝÁkÝÁdÝÁ]ÝÁVÝÁOÝÁHÝÁAÝÁ:ÝÁ3ÝÁ,ÝÁ%ÝÁÝÁÝÁÝÁ ÝÁÝÁûÜÁôÜÁíÜÁæÜÁßÜÁØÜÁÑÜÁÊÜÁÃÜÁ¼ÜÁµÜÁ®ÜÁ§ÜÁ ÜÁ™ÜÁ’ÜÁ‹ÜÁ„ÜÁ}ÜÁvÜÁoÜÁhÜÁaÜÁZÜÁSÜÁLÜÁEÜÁ>ÜÁ7ÜÁ0ÜÁ)ÜÁ"ÜÁÜÁÜÁ ÜÁÜÁÿÛÁøÛÁñÛÁêÛÁãÛÁÜÛÁÕÛÁÎÛÁÇÛÁÀÛÁ¹ÛÁ²ÛÁ«ÛÁ¤ÛÁÛÁ–ÛÁÛÁˆÛÁÛÁzÛÁsÛÁlÛÁeÛÁ^ÛÁWÛÁPÛÁIÛÁBÛÁ;ÛÁ4ÛÁ-ÛÁ&ÛÁÛÁÛÁÛÁ ÛÁÛÁüÚÁõÚÁîÚÁçÚÁàÚÁÙÚÁÒÚÁËÚÁÄÚÁ½ÚÁ¶ÚÁ¯ÚÁ¨ÚÁ¡ÚÁšÚÁ“ÚÁŒÚÁ…ÚÁ~ÚÁwÚÁpÚÁiÚÁbÚÁ[ÚÁTÚÁMÚÁFÚÁ?ÚÁ8ÚÁ1ÚÁ*ÚÁ#ÚÁÚÁÚÁÚÁÚÁÚÁùÙÁòÙÁëÙÁäÙÁÝÙÁÖÙÁÏÙÁÈÙÁÁÙÁºÙÁ³ÙÁ¬ÙÁ¥ÙÁžÙÁ—ÙÁÙÁ‰ÙÁ‚ÙÁ{ÙÁtÙÁmÙÁfÙÁ_ÙÁXÙÁQÙÁJÙÁCÙÁ<ÙÁ5ÙÁ.ÙÁ'ÙÁ ÙÁÙÁÙÁ ÙÁÙÁýØÁöØÁïØÁèØÁáØÁÚØÁÓØÁÌØÁÅØÁ¾ØÁ·ØÁ°ØÁ©ØÁ¢ØÁ›ØÁ”ØÁØÁ†ØÁØÁxØÁqØÁjØÁcØÁ\ØÁUØÁNØÁGØÁ@ØÁ9ØÁ2ØÁ+ØÁ$ØÁØÁØÁØÁØÁØÁú×Áó×Áì×Áå×ÁÞ×Á××ÁÐ×ÁÉ×ÁÂ×Á»×Á´×Á­×Á¦×ÁŸ×Á˜×Á‘×ÁŠ×Áƒ×Á|×Áu×Án×Ág×Á`×ÁY×ÁR×ÁK×ÁD×Á=×Á6×Á/×Á(×Á!×Á×Á×Á ×Á×ÁþÖÁ÷ÖÁðÖÁéÖÁâÖÁÛÖÁÔÖÁÍÖÁÆÖÁ¿ÖÁ¸ÖÁ±ÖÁªÖÁ£ÖÁœÖÁ•ÖÁŽÖÁ‡ÖÁ€ÖÁyÖÁrÖÁkÖÁdÖÁ]ÖÁVÖÁOÖÁHÖÁAÖÁ:ÖÁ3ÖÁ,ÖÁ%ÖÁÖÁÖÁÖÁ ÖÁÖÁûÕÁôÕÁíÕÁæÕÁßÕÁØÕÁÑÕÁÊÕÁÃÕÁ¼ÕÁµÕÁ®ÕÁ§ÕÁ ÕÁ™ÕÁ’ÕÁ‹ÕÁ„ÕÁ}ÕÁvÕÁoÕÁhÕÁaÕÁZÕÁSÕÁLÕÁEÕÁ>ÕÁ7ÕÁ0ÕÁ)ÕÁ"ÕÁÕÁÕÁ ÕÁÕÁÿÔÁøÔÁñÔÁêÔÁãÔÁÜÔÁÕÔÁÎÔÁÇÔÁÀÔÁ¹ÔÁ²ÔÁ«ÔÁ¤ÔÁÔÁ–ÔÁÔÁˆÔÁÔÁzÔÁsÔÁlÔÁeÔÁ^ÔÁWÔÁPÔÁIÔÁBÔÁ;ÔÁ4ÔÁ-ÔÁ&ÔÁÔÁÔÁÔÁ ÔÁÔÁüÓÁõÓÁîÓÁçÓÁàÓÁÙÓÁÒÓÁËÓÁÄÓÁ½ÓÁ¶ÓÁ¯ÓÁ¨ÓÁ¡ÓÁšÓÁ“ÓÁŒÓÁ…ÓÁ~ÓÁwÓÁpÓÁiÓÁbÓÁ[ÓÁTÓÁMÓÁFÓÁ?ÓÁ8ÓÁ1ÓÁ*ÓÁ#ÓÁÓÁÓÁÓÁÓÁÓÁùÒÁòÒÁëÒÁäÒÁÝÒÁÖÒÁÏÒÁÈÒÁÁÒÁºÒÁ³ÒÁ¬ÒÁ¥ÒÁžÒÁ—ÒÁÒÁ‰ÒÁ‚ÒÁ{ÒÁtÒÁmÒÁfÒÁ_ÒÁXÒÁQÒÁJÒÁCÒÁ<ÒÁ5ÒÁ.ÒÁ'ÒÁ ÒÁÒÁÒÁ ÒÁÒÁýÑÁöÑÁïÑÁèÑÁáÑÁÚÑÁÓÑÁÌÑÁÅÑÁ¾ÑÁ·ÑÁ°ÑÁ©ÑÁ¢ÑÁ›ÑÁ”ÑÁÑÁ†ÑÁÑÁxÑÁqÑÁjÑÁcÑÁ\ÑÁUÑÁNÑÁGÑÁ@ÑÁ9ÑÁ2ÑÁ+ÑÁ$ÑÁÑÁÑÁÑÁÑÁÑÁúÐÁóÐÁìÐÁåÐÁÞÐÁ×ÐÁÐÐÁÉÐÁÂÐÁ»ÐÁ´ÐÁ­ÐÁ¦ÐÁŸÐÁ˜ÐÁ‘ÐÁŠÐÁƒÐÁ|ÐÁuÐÁnÐÁgÐÁ`ÐÁYÐÁRÐÁKÐÁDÐÁ=ÐÁ6ÐÁ/ÐÁ(ÐÁ!ÐÁÐÁÐÁ ÐÁÐÁþÏÁ÷ÏÁðÏÁéÏÁâÏÁÛÏÁÔÏÁÍÏÁÆÏÁ¿ÏÁ¸ÏÁ±ÏÁªÏÁ£ÏÁœÏÁ•ÏÁŽÏÁ‡ÏÁ€ÏÁyÏÁrÏÁkÏÁdÏÁ]ÏÁVÏÁOÏÁHÏÁAÏÁ:ÏÁ3ÏÁ,ÏÁ%ÏÁÏÁÏÁÏÁ ÏÁÏÁûÎÁôÎÁíÎÁæÎÁßÎÁØÎÁÑÎÁÊÎÁÃÎÁ¼ÎÁµÎÁ®ÎÁ§ÎÁ ÎÁ™ÎÁ’ÎÁ‹ÎÁ„ÎÁ}ÎÁvÎÁoÎÁhÎÁaÎÁZÎÁSÎÁLÎÁEÎÁ>ÎÁ7ÎÁ0ÎÁ)ÎÁ"ÎÁÎÁÎÁ ÎÁÎÁÿÍÁøÍÁñÍÁêÍÁãÍÁÜÍÁÕÍÁÎÍÁÇÍÁÀÍÁ¹ÍÁ²ÍÁ«ÍÁ¤ÍÁÍÁ–ÍÁÍÁˆÍÁÍÁzÍÁsÍÁlÍÁeÍÁ^ÍÁWÍÁPÍÁIÍÁBÍÁ;ÍÁ4ÍÁ-ÍÁ&ÍÁÍÁÍÁÍÁ ÍÁÍÁüÌÁõÌÁîÌÁçÌÁàÌÁÙÌÁÒÌÁËÌÁÄÌÁ½ÌÁ¶ÌÁ¯ÌÁ¨ÌÁ¡ÌÁšÌÁ“ÌÁŒÌÁ…ÌÁ~ÌÁwÌÁpÌÁiÌÁbÌÁ[ÌÁTÌÁMÌÁFÌÁ?ÌÁ8ÌÁ1ÌÁ*ÌÁ#ÌÁÌÁÌÁÌÁÌÁÌÁùËÁòËÁëËÁäËÁÝËÁÖËÁÏËÁÈËÁÁËÁºËÁ³ËÁ¬ËÁ¥ËÁžËÁ—ËÁËÁ‰ËÁ‚ËÁ{ËÁtËÁmËÁfËÁ_ËÁXËÁQËÁJËÁCËÁ<ËÁ5ËÁ.ËÁ'ËÁ ËÁËÁËÁ ËÁËÁýÊÁöÊÁïÊÁèÊÁáÊÁÚÊÁÓÊÁÌÊÁÅÊÁ¾ÊÁ·ÊÁ°ÊÁ©ÊÁ¢ÊÁ›ÊÁ”ÊÁÊÁ†ÊÁÊÁxÊÁqÊÁjÊÁcÊÁ\ÊÁUÊÁNÊÁGÊÁ@ÊÁ9ÊÁ2ÊÁ+ÊÁ$ÊÁÊÁÊÁÊÁÊÁÊÁúÉÁóÉÁìÉÁåÉÁÞÉÁ×ÉÁÐÉÁÉÉÁÂÉÁ»ÉÁ´ÉÁ­ÉÁ¦ÉÁŸÉÁ˜ÉÁ‘ÉÁŠÉÁƒÉÁ|ÉÁuÉÁnÉÁgÉÁ`ÉÁYÉÁRÉÁKÉÁDÉÁ=ÉÁ6ÉÁ/ÉÁ(ÉÁ!ÉÁÉÁÉÁ ÉÁÉÁþÈÁ÷ÈÁðÈÁéÈÁâÈÁÛÈÁÔÈÁÍÈÁÆÈÁ¿ÈÁ¸ÈÁ±ÈÁªÈÁ£ÈÁœÈÁ•ÈÁŽÈÁ‡ÈÁ€ÈÁyÈÁrÈÁkÈÁdÈÁ]ÈÁVÈÁOÈÁHÈÁAÈÁ:ÈÁ3ÈÁ,ÈÁ%ÈÁÈÁÈÁÈÁ ÈÁÈÁûÇÁôÇÁíÇÁæÇÁßÇÁØÇÁÑÇÁÊÇÁÃÇÁ¼ÇÁµÇÁ®ÇÁ§ÇÁ ÇÁ™ÇÁ’ÇÁ‹ÇÁ„ÇÁ}ÇÁvÇÁoÇÁhÇÁaÇÁZÇÁSÇÁLÇÁEÇÁ>ÇÁ7ÇÁ0ÇÁ)ÇÁ"ÇÁÇÁÇÁ ÇÁÇÁÿÆÁøÆÁñÆÁêÆÁãÆÁÜÆÁÕÆÁÎÆÁÇÆÁÀÆÁ¹ÆÁ²ÆÁ«ÆÁ¤ÆÁÆÁ–ÆÁÆÁˆÆÁÆÁzÆÁsÆÁlÆÁeÆÁ^ÆÁWÆÁPÆÁIÆÁBÆÁ;ÆÁ4ÆÁ-ÆÁ&ÆÁÆÁÆÁÆÁ ÆÁÆÁüÅÁõÅÁîÅÁçÅÁàÅÁÙÅÁÒÅÁËÅÁÄÅÁ½ÅÁ¶ÅÁ¯ÅÁ¨ÅÁ¡ÅÁšÅÁ“ÅÁŒÅÁ…ÅÁ~ÅÁwÅÁpÅÁiÅÁbÅÁ[ÅÁTÅÁMÅÁFÅÁ?ÅÁ8ÅÁ1ÅÁ*ÅÁ#ÅÁÅÁÅÁÅÁÅÁÅÁùÄÁòÄÁëÄÁäÄÁÝÄÁÖÄÁÏÄÁÈÄÁÁÄÁºÄÁ³ÄÁ¬ÄÁ¥ÄÁžÄÁ—ÄÁÄÁ‰ÄÁ‚ÄÁ{ÄÁtÄÁmÄÁfÄÁ_ÄÁXÄÁQÄÁJÄÁCÄÁ<ÄÁ5ÄÁ.ÄÁ'ÄÁ ÄÁÄÁÄÁ ÄÁÄÁýÃÁöÃÁïÃÁèÃÁáÃÁÚÃÁÓÃÁÌÃÁÅÃÁ¾ÃÁ·ÃÁ°ÃÁ©ÃÁ¢ÃÁ›ÃÁ”ÃÁÃÁ†ÃÁÃÁxÃÁqÃÁjÃÁcÃÁ\ÃÁUÃÁNÃÁGÃÁ@ÃÁ9ÃÁ2ÃÁ+ÃÁ$ÃÁÃÁÃÁÃÁÃÁÃÁúÂÁóÂÁìÂÁåÂÁÞÂÁ×ÂÁÐÂÁÉÂÁÂÂÁ»ÂÁ´ÂÁ­ÂÁ¦ÂÁŸÂÁ˜ÂÁ‘ÂÁŠÂÁƒÂÁ|ÂÁuÂÁnÂÁgÂÁ`ÂÁYÂÁRÂÁKÂÁDÂÁ=ÂÁ6ÂÁ/ÂÁ(ÂÁ!ÂÁÂÁÂÁ ÂÁÂÁþÁÁ÷ÁÁðÁÁéÁÁâÁÁÛÁÁÔÁÁÍÁÁÆÁÁ¿ÁÁ¸ÁÁ±ÁÁªÁÁ£ÁÁœÁÁ•ÁÁŽÁÁ‡ÁÁ€ÁÁyÁÁrÁÁkÁÁdÁÁ]ÁÁVÁÁOÁÁHÁÁAÁÁ:ÁÁ3ÁÁ,ÁÁ%ÁÁÁÁÁÁÁÁ ÁÁÁÁûÀÁôÀÁíÀÁæÀÁßÀÁØÀÁÑÀÁÊÀÁÃÀÁ¼ÀÁµÀÁ®ÀÁ§ÀÁ ÀÁ™ÀÁ’ÀÁ‹ÀÁ„ÀÁ}ÀÁvÀÁoÀÁhÀÁaÀÁZÀÁSÀÁLÀÁEÀÁ>ÀÁ7ÀÁ0ÀÁ)ÀÁ"ÀÁÀÁÀÁ ÀÁÀÁÿ¿Áø¿Áñ¿Áê¿Áã¿ÁÜ¿ÁÕ¿ÁοÁÇ¿ÁÀ¿Á¹¿Á²¿Á«¿Á¤¿Á¿Á–¿Á¿Áˆ¿Á¿Áz¿Ás¿Ál¿Áe¿Á^¿ÁW¿ÁP¿ÁI¿ÁB¿Á;¿Á4¿Á-¿Á&¿Á¿Á¿Á¿Á ¿Á¿Áü¾Áõ¾Áî¾Áç¾Áà¾ÁÙ¾ÁÒ¾Á˾ÁľÁ½¾Á¶¾Á¯¾Á¨¾Á¡¾Áš¾Á“¾ÁŒ¾Á…¾Á~¾Áw¾Áp¾Ái¾Áb¾Á[¾ÁT¾ÁM¾ÁF¾Á?¾Á8¾Á1¾Á*¾Á#¾Á¾Á¾Á¾Á¾Á¾Áù½Áò½Áë½Áä½ÁݽÁÖ½ÁϽÁȽÁÁ½Áº½Á³½Á¬½Á¥½Áž½Á—½Á½Á‰½Á‚½Á{½Át½Ám½Áf½Á_½ÁX½ÁQ½ÁJ½ÁC½Á<½Á5½Á.½Á'½Á ½Á½Á½Á ½Á½Áý¼Áö¼Áï¼Áè¼Áá¼ÁÚ¼ÁÓ¼Á̼ÁżÁ¾¼Á·¼Á°¼Á©¼Á¢¼Á›¼Á”¼Á¼Á†¼Á¼Áx¼Áq¼Áj¼Ác¼Á\¼ÁU¼ÁN¼ÁG¼Á@¼Á9¼Á2¼Á+¼Á$¼Á¼Á¼Á¼Á¼Á¼Áú»Áó»Áì»Áå»ÁÞ»Á×»ÁлÁÉ»Á»Á»»Á´»Á­»Á¦»ÁŸ»Á˜»Á‘»ÁŠ»Áƒ»Á|»Áu»Án»Ág»Á`»ÁY»ÁR»ÁK»ÁD»Á=»Á6»Á/»Á(»Á!»Á»Á»Á »Á»ÁþºÁ÷ºÁðºÁéºÁâºÁÛºÁÔºÁͺÁƺÁ¿ºÁ¸ºÁ±ºÁªºÁ£ºÁœºÁ•ºÁŽºÁ‡ºÁ€ºÁyºÁrºÁkºÁdºÁ]ºÁVºÁOºÁHºÁAºÁ:ºÁ3ºÁ,ºÁ%ºÁºÁºÁºÁ ºÁºÁû¹Áô¹Áí¹Áæ¹Áß¹ÁعÁѹÁʹÁùÁ¼¹Áµ¹Á®¹Á§¹Á ¹Á™¹Á’¹Á‹¹Á„¹Á}¹Áv¹Áo¹Áh¹Áa¹ÁZ¹ÁS¹ÁL¹ÁE¹Á>¹Á7¹Á0¹Á)¹Á"¹Á¹Á¹Á ¹Á¹Áÿ¸Áø¸Áñ¸Áê¸Áã¸ÁܸÁÕ¸ÁθÁǸÁÀ¸Á¹¸Á²¸Á«¸Á¤¸Á¸Á–¸Á¸Áˆ¸Á¸Áz¸Ás¸Ál¸Áe¸Á^¸ÁW¸ÁP¸ÁI¸ÁB¸Á;¸Á4¸Á-¸Á&¸Á¸Á¸Á¸Á ¸Á¸Áü·Áõ·Áî·Áç·Áà·ÁÙ·ÁÒ·ÁË·ÁÄ·Á½·Á¶·Á¯·Á¨·Á¡·Áš·Á“·ÁŒ·Á…·Á~·Áw·Áp·Ái·Áb·Á[·ÁT·ÁM·ÁF·Á?·Á8·Á1·Á*·Á#·Á·Á·Á·Á·Á·Áù¶Áò¶Áë¶Áä¶ÁݶÁÖ¶Á϶ÁȶÁÁ¶Áº¶Á³¶Á¬¶Á¥¶Áž¶Á—¶Á¶Á‰¶Á‚¶Á{¶Át¶Ám¶Áf¶Á_¶ÁX¶ÁQ¶ÁJ¶ÁC¶Á<¶Á5¶Á.¶Á'¶Á ¶Á¶Á¶Á ¶Á¶ÁýµÁöµÁïµÁèµÁáµÁÚµÁÓµÁ̵ÁŵÁ¾µÁ·µÁ°µÁ©µÁ¢µÁ›µÁ”µÁµÁ†µÁµÁxµÁqµÁjµÁcµÁ\µÁUµÁNµÁGµÁ@µÁ9µÁ2µÁ+µÁ$µÁµÁµÁµÁµÁµÁú´Áó´Áì´Áå´ÁÞ´Á×´ÁдÁÉ´Á´Á»´Á´´Á­´Á¦´ÁŸ´Á˜´Á‘´ÁŠ´Áƒ´Á|´Áu´Án´Ág´Á`´ÁY´ÁR´ÁK´ÁD´Á=´Á6´Á/´Á(´Á!´Á´Á´Á ´Á´Áþ³Á÷³Áð³Áé³Áâ³ÁÛ³ÁÔ³ÁͳÁƳÁ¿³Á¸³Á±³Áª³Á£³Áœ³Á•³Á޳Á‡³Á€³Áy³Ár³Ák³Ád³Á]³ÁV³ÁO³ÁH³ÁA³Á:³Á3³Á,³Á%³Á³Á³Á³Á ³Á³Áû²Áô²Áí²Áæ²Áß²ÁزÁѲÁʲÁòÁ¼²Áµ²Á®²Á§²Á ²Á™²Á’²Á‹²Á„²Á}²Áv²Áo²Áh²Áa²ÁZ²ÁS²ÁL²ÁE²Á>²Á7²Á0²Á)²Á"²Á²Á²Á ²Á²Áÿ±Áø±Áñ±Áê±Áã±ÁܱÁÕ±ÁαÁDZÁÀ±Á¹±Á²±Á«±Á¤±Á±Á–±Á±Áˆ±Á±Áz±Ás±Ál±Áe±Á^±ÁW±ÁP±ÁI±ÁB±Á;±Á4±Á-±Á&±Á±Á±Á±Á ±Á±Áü°Áõ°Áî°Áç°Áà°ÁÙ°ÁÒ°Á˰ÁİÁ½°Á¶°Á¯°Á¨°Á¡°Áš°Á“°ÁŒ°Á…°Á~°Áw°Áp°Ái°Áb°Á[°ÁT°ÁM°ÁF°Á?°Á8°Á1°Á*°Á#°Á°Á°Á°Á°Á°Áù¯Áò¯Áë¯Áä¯ÁݯÁÖ¯ÁϯÁȯÁÁ¯Áº¯Á³¯Á¬¯Á¥¯Áž¯Á—¯Á¯Á‰¯Á‚¯Á{¯Át¯Ám¯Áf¯Á_¯ÁX¯ÁQ¯ÁJ¯ÁC¯Á<¯Á5¯Á.¯Á'¯Á ¯Á¯Á¯Á ¯Á¯Áý®Áö®Áï®Áè®Áá®ÁÚ®ÁÓ®ÁÌ®ÁÅ®Á¾®Á·®Á°®Á©®Á¢®Á›®Á”®Á®Á†®Á®Áx®Áq®Áj®Ác®Á\®ÁU®ÁN®ÁG®Á@®Á9®Á2®Á+®Á$®Á®Á®Á®Á®Á®Áú­Áó­Áì­Áå­ÁÞ­Á×­ÁЭÁÉ­Á­Á»­Á´­Á­­Á¦­ÁŸ­Á˜­Á‘­ÁŠ­Áƒ­Á|­Áu­Án­Ág­Á`­ÁY­ÁR­ÁK­ÁD­Á=­Á6­Á/­Á(­Á!­Á­Á­Á ­Á­Áþ¬Á÷¬Áð¬Áé¬Áâ¬ÁÛ¬ÁÔ¬ÁͬÁƬÁ¿¬Á¸¬Á±¬Áª¬Á£¬Áœ¬Á•¬ÁެÁ‡¬Á€¬Áy¬Ár¬Ák¬Ád¬Á]¬ÁV¬ÁO¬ÁH¬ÁA¬Á:¬Á3¬Á,¬Á%¬Á¬Á¬Á¬Á ¬Á¬Áû«Áô«Áí«Áæ«Áß«ÁØ«ÁÑ«ÁÊ«ÁëÁ¼«Áµ«Á®«Á§«Á «Á™«Á’«Á‹«Á„«Á}«Áv«Áo«Áh«Áa«ÁZ«ÁS«ÁL«ÁE«Á>«Á7«Á0«Á)«Á"«Á«Á«Á «Á«ÁÿªÁøªÁñªÁêªÁãªÁܪÁÕªÁΪÁǪÁÀªÁ¹ªÁ²ªÁ«ªÁ¤ªÁªÁ–ªÁªÁˆªÁªÁzªÁsªÁlªÁeªÁ^ªÁWªÁPªÁIªÁBªÁ;ªÁ4ªÁ-ªÁ&ªÁªÁªÁªÁ ªÁªÁü©Áõ©Áî©Áç©Áà©ÁÙ©ÁÒ©ÁË©ÁÄ©Á½©Á¶©Á¯©Á¨©Á¡©Áš©Á“©ÁŒ©Á…©Á~©Áw©Áp©Ái©Áb©Á[©ÁT©ÁM©ÁF©Á?©Á8©Á1©Á*©Á#©Á©Á©Á©Á©Á©Áù¨Áò¨Áë¨Áä¨ÁݨÁÖ¨ÁϨÁȨÁÁ¨Áº¨Á³¨Á¬¨Á¥¨Áž¨Á—¨Á¨Á‰¨Á‚¨Á{¨Át¨Ám¨Áf¨Á_¨ÁX¨ÁQ¨ÁJ¨ÁC¨Á<¨Á5¨Á.¨Á'¨Á ¨Á¨Á¨Á ¨Á¨Áý§Áö§Áï§Áè§Áá§ÁÚ§ÁÓ§Á̧ÁŧÁ¾§Á·§Á°§Á©§Á¢§Á›§Á”§Á§Á†§Á§Áx§Áq§Áj§Ác§Á\§ÁU§ÁN§ÁG§Á@§Á9§Á2§Á+§Á$§Á§Á§Á§Á§Á§Áú¦Áó¦Áì¦Áå¦ÁÞ¦ÁצÁЦÁɦÁ¦Á»¦Á´¦Á­¦Á¦¦ÁŸ¦Á˜¦Á‘¦ÁЦÁƒ¦Á|¦Áu¦Án¦Ág¦Á`¦ÁY¦ÁR¦ÁK¦ÁD¦Á=¦Á6¦Á/¦Á(¦Á!¦Á¦Á¦Á ¦Á¦Áþ¥Á÷¥Áð¥Áé¥Áâ¥ÁÛ¥ÁÔ¥ÁÍ¥ÁÆ¥Á¿¥Á¸¥Á±¥Áª¥Á£¥Áœ¥Á•¥ÁŽ¥Á‡¥Á€¥Áy¥Ár¥Ák¥Ád¥Á]¥ÁV¥ÁO¥ÁH¥ÁA¥Á:¥Á3¥Á,¥Á%¥Á¥Á¥Á¥Á ¥Á¥Áû¤Áô¤Áí¤Áæ¤ÁߤÁؤÁѤÁʤÁäÁ¼¤Áµ¤Á®¤Á§¤Á ¤Á™¤Á’¤Á‹¤Á„¤Á}¤Áv¤Áo¤Áh¤Áa¤ÁZ¤ÁS¤ÁL¤ÁE¤Á>¤Á7¤Á0¤Á)¤Á"¤Á¤Á¤Á ¤Á¤Áÿ£Áø£Áñ£Áê£Áã£ÁÜ£ÁÕ£ÁΣÁÇ£ÁÀ£Á¹£Á²£Á«£Á¤£Á£Á–£Á£Áˆ£Á£Áz£Ás£Ál£Áe£Á^£ÁW£ÁP£ÁI£ÁB£Á;£Á4£Á-£Á&£Á£Á£Á£Á £Á£Áü¢Áõ¢Áî¢Áç¢Áà¢ÁÙ¢ÁÒ¢ÁË¢ÁÄ¢Á½¢Á¶¢Á¯¢Á¨¢Á¡¢Áš¢Á“¢ÁŒ¢Á…¢Á~¢Áw¢Áp¢Ái¢Áb¢Á[¢ÁT¢ÁM¢ÁF¢Á?¢Á8¢Á1¢Á*¢Á#¢Á¢Á¢Á¢Á¢Á¢Áù¡Áò¡Áë¡Áä¡ÁÝ¡ÁÖ¡ÁÏ¡ÁÈ¡ÁÁ¡Áº¡Á³¡Á¬¡Á¥¡Áž¡Á—¡Á¡Á‰¡Á‚¡Á{¡Át¡Ám¡Áf¡Á_¡ÁX¡ÁQ¡ÁJ¡ÁC¡Á<¡Á5¡Á.¡Á'¡Á ¡Á¡Á¡Á ¡Á¡Áý Áö Áï Áè Áá ÁÚ ÁÓ ÁÌ ÁÅ Á¾ Á· Á° Á© Á¢ Á› Á” Á Á† Á Áx Áq Áj Ác Á\ ÁU ÁN ÁG Á@ Á9 Á2 Á+ Á$ Á Á Á Á Á ÁúŸÁóŸÁìŸÁåŸÁÞŸÁןÁПÁÉŸÁŸÁ»ŸÁ´ŸÁ­ŸÁ¦ŸÁŸŸÁ˜ŸÁ‘ŸÁŠŸÁƒŸÁ|ŸÁuŸÁnŸÁgŸÁ`ŸÁYŸÁRŸÁKŸÁDŸÁ=ŸÁ6ŸÁ/ŸÁ(ŸÁ!ŸÁŸÁŸÁ ŸÁŸÁþžÁ÷žÁðžÁéžÁâžÁÛžÁÔžÁÍžÁÆžÁ¿žÁ¸žÁ±žÁªžÁ£žÁœžÁ•žÁŽžÁ‡žÁ€žÁyžÁržÁkžÁdžÁ]žÁVžÁOžÁHžÁAžÁ:žÁ3žÁ,žÁ%žÁžÁžÁžÁ žÁžÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿœÁøœÁñœÁêœÁãœÁÜœÁÕœÁΜÁÇœÁÀœÁ¹œÁ²œÁ«œÁ¤œÁœÁ–œÁœÁˆœÁœÁzœÁsœÁlœÁeœÁ^œÁWœÁPœÁIœÁBœÁ;œÁ4œÁ-œÁ&œÁœÁœÁœÁ œÁœÁü›Áõ›Áî›Áç›Áà›ÁÙ›ÁÒ›ÁË›ÁÄ›Á½›Á¶›Á¯›Á¨›Á¡›Áš›Á“›ÁŒ›Á…›Á~›Áw›Áp›Ái›Áb›Á[›ÁT›ÁM›ÁF›Á?›Á8›Á1›Á*›Á#›Á›Á›Á›Á›Á›ÁùšÁòšÁëšÁäšÁÝšÁÖšÁÏšÁÈšÁÁšÁºšÁ³šÁ¬šÁ¥šÁžšÁ—šÁšÁ‰šÁ‚šÁ{šÁtšÁmšÁfšÁ_šÁXšÁQšÁJšÁCšÁ<šÁ5šÁ.šÁ'šÁ šÁšÁšÁ šÁšÁý™Áö™Áï™Áè™Áá™ÁÚ™ÁÓ™ÁÌ™ÁÅ™Á¾™Á·™Á°™Á©™Á¢™Á›™Á”™Á™Á†™Á™Áx™Áq™Áj™Ác™Á\™ÁU™ÁN™ÁG™Á@™Á9™Á2™Á+™Á$™Á™Á™Á™Á™Á™Áú˜Áó˜Áì˜Áå˜ÁÞ˜ÁטÁИÁɘÁ˜Á»˜Á´˜Á­˜Á¦˜ÁŸ˜Á˜˜Á‘˜ÁŠ˜Áƒ˜Á|˜Áu˜Án˜Ág˜Á`˜ÁY˜ÁR˜ÁK˜ÁD˜Á=˜Á6˜Á/˜Á(˜Á!˜Á˜Á˜Á ˜Á˜Áþ—Á÷—Áð—Áé—Áâ—ÁÛ—ÁÔ—ÁÍ—ÁÆ—Á¿—Á¸—Á±—Áª—Á£—Áœ—Á•—ÁŽ—Á‡—Á€—Áy—Ár—Ák—Ád—Á]—ÁV—ÁO—ÁH—ÁA—Á:—Á3—Á,—Á%—Á—Á—Á—Á —Á—Áû–Áô–Áí–Áæ–Áß–ÁØ–ÁÑ–ÁÊ–ÁÖÁ¼–Áµ–Á®–Á§–Á –Á™–Á’–Á‹–Á„–Á}–Áv–Áo–Áh–Áa–ÁZ–ÁS–ÁL–ÁE–Á>–Á7–Á0–Á)–Á"–Á–Á–Á –Á–Áÿ•Áø•Áñ•Áê•Áã•ÁÜ•ÁÕ•ÁΕÁÇ•ÁÀ•Á¹•Á²•Á«•Á¤•Á•Á–•Á•Áˆ•Á•Áz•Ás•Ál•Áe•Á^•ÁW•ÁP•ÁI•ÁB•Á;•Á4•Á-•Á&•Á•Á•Á•Á •Á•Áü”Áõ”Áî”Áç”Áà”ÁÙ”ÁÒ”ÁË”ÁÄ”Á½”Á¶”Á¯”Á¨”Á¡”Áš”Á“”ÁŒ”Á…”Á~”Áw”Áp”Ái”Áb”Á[”ÁT”ÁM”ÁF”Á?”Á8”Á1”Á*”Á#”Á”Á”Á”Á”Á”Áù“Áò“Áë“Áä“ÁÝ“ÁÖ“ÁÏ“ÁÈ“ÁÁ“Áº“Á³“Á¬“Á¥“Áž“Á—“Á“Á‰“Á‚“Á{“Át“Ám“Áf“Á_“ÁX“ÁQ“ÁJ“ÁC“Á<“Á5“Á.“Á'“Á “Á“Á“Á “Á“Áý’Áö’Áï’Áè’Áá’ÁÚ’ÁÓ’ÁÌ’ÁÅ’Á¾’Á·’Á°’Á©’Á¢’Á›’Á”’Á’Á†’Á’Áx’Áq’Áj’Ác’Á\’ÁU’ÁN’ÁG’Á@’Á9’Á2’Á+’Á$’Á’Á’Á’Á’Á’Áú‘Áó‘Áì‘Áå‘ÁÞ‘ÁבÁБÁÉ‘Á‘Á»‘Á´‘Á­‘Á¦‘ÁŸ‘Á˜‘Á‘‘ÁŠ‘Áƒ‘Á|‘Áu‘Án‘Ág‘Á`‘ÁY‘ÁR‘ÁK‘ÁD‘Á=‘Á6‘Á/‘Á(‘Á!‘Á‘Á‘Á ‘Á‘ÁþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿŽÁøŽÁñŽÁêŽÁãŽÁÜŽÁÕŽÁÎŽÁÇŽÁÀŽÁ¹ŽÁ²ŽÁ«ŽÁ¤ŽÁŽÁ–ŽÁŽÁˆŽÁŽÁzŽÁsŽÁlŽÁeŽÁ^ŽÁWŽÁPŽÁIŽÁBŽÁ;ŽÁ4ŽÁ-ŽÁ&ŽÁŽÁŽÁŽÁ ŽÁŽÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùŒÁòŒÁëŒÁäŒÁÝŒÁÖŒÁÏŒÁÈŒÁÁŒÁºŒÁ³ŒÁ¬ŒÁ¥ŒÁžŒÁ—ŒÁŒÁ‰ŒÁ‚ŒÁ{ŒÁtŒÁmŒÁfŒÁ_ŒÁXŒÁQŒÁJŒÁCŒÁ<ŒÁ5ŒÁ.ŒÁ'ŒÁ ŒÁŒÁŒÁ ŒÁŒÁý‹Áö‹Áï‹Áè‹Áá‹ÁÚ‹ÁÓ‹ÁÌ‹ÁÅ‹Á¾‹Á·‹Á°‹Á©‹Á¢‹Á›‹Á”‹Á‹Á†‹Á‹Áx‹Áq‹Áj‹Ác‹Á\‹ÁU‹ÁN‹ÁG‹Á@‹Á9‹Á2‹Á+‹Á$‹Á‹Á‹Á‹Á‹Á‹ÁúŠÁóŠÁìŠÁåŠÁÞŠÁ׊ÁЊÁÉŠÁŠÁ»ŠÁ´ŠÁ­ŠÁ¦ŠÁŸŠÁ˜ŠÁ‘ŠÁŠŠÁƒŠÁ|ŠÁuŠÁnŠÁgŠÁ`ŠÁYŠÁRŠÁKŠÁDŠÁ=ŠÁ6ŠÁ/ŠÁ(ŠÁ!ŠÁŠÁŠÁ ŠÁŠÁþ‰Á÷‰Áð‰Áé‰Áâ‰ÁÛ‰ÁÔ‰Á͉ÁƉÁ¿‰Á¸‰Á±‰Áª‰Á£‰Áœ‰Á•‰ÁމÁ‡‰Á€‰Áy‰Ár‰Ák‰Ád‰Á]‰ÁV‰ÁO‰ÁH‰ÁA‰Á:‰Á3‰Á,‰Á%‰Á‰Á‰Á‰Á ‰Á‰ÁûˆÁôˆÁíˆÁæˆÁ߈Á؈ÁшÁʈÁÈÁ¼ˆÁµˆÁ®ˆÁ§ˆÁ ˆÁ™ˆÁ’ˆÁ‹ˆÁ„ˆÁ}ˆÁvˆÁoˆÁhˆÁaˆÁZˆÁSˆÁLˆÁEˆÁ>ˆÁ7ˆÁ0ˆÁ)ˆÁ"ˆÁˆÁˆÁ ˆÁˆÁÿ‡Áø‡Áñ‡Áê‡Áã‡Á܇ÁÕ‡Á·ÁLJÁÀ‡Á¹‡Á²‡Á«‡Á¤‡Á‡Á–‡Á‡Áˆ‡Á‡Áz‡Ás‡Ál‡Áe‡Á^‡ÁW‡ÁP‡ÁI‡ÁB‡Á;‡Á4‡Á-‡Á&‡Á‡Á‡Á‡Á ‡Á‡Áü†Áõ†Áî†Áç†Áà†ÁÙ†ÁÒ†ÁˆÁĆÁ½†Á¶†Á¯†Á¨†Á¡†Áš†Á“†ÁŒ†Á…†Á~†Áw†Áp†Ái†Áb†Á[†ÁT†ÁM†ÁF†Á?†Á8†Á1†Á*†Á#†Á†Á†Á†Á†Á†Áù…Áò…Áë…Áä…ÁÝ…ÁÖ…ÁÏ…ÁÈ…ÁÁ…Áº…Á³…Á¬…Á¥…Áž…Á—…Á…Á‰…Á‚…Á{…Át…Ám…Áf…Á_…ÁX…ÁQ…ÁJ…ÁC…Á<…Á5…Á.…Á'…Á …Á…Á…Á …Á…Áý„Áö„Áï„Áè„Áá„ÁÚ„ÁÓ„ÁÌ„ÁÅ„Á¾„Á·„Á°„Á©„Á¢„Á›„Á”„Á„Á†„Á„Áx„Áq„Áj„Ác„Á\„ÁU„ÁN„ÁG„Á@„Á9„Á2„Á+„Á$„Á„Á„Á„Á„Á„ÁúƒÁóƒÁìƒÁåƒÁÞƒÁ׃ÁЃÁɃÁƒÁ»ƒÁ´ƒÁ­ƒÁ¦ƒÁŸƒÁ˜ƒÁ‘ƒÁŠƒÁƒƒÁ|ƒÁuƒÁnƒÁgƒÁ`ƒÁYƒÁRƒÁKƒÁDƒÁ=ƒÁ6ƒÁ/ƒÁ(ƒÁ!ƒÁƒÁƒÁ ƒÁƒÁþ‚Á÷‚Áð‚Áé‚Áâ‚ÁÛ‚ÁÔ‚ÁÍ‚ÁÆ‚Á¿‚Á¸‚Á±‚Áª‚Á£‚Áœ‚Á•‚ÁŽ‚Á‡‚Á€‚Áy‚Ár‚Ák‚Ád‚Á]‚ÁV‚ÁO‚ÁH‚ÁA‚Á:‚Á3‚Á,‚Á%‚Á‚Á‚Á‚Á ‚Á‚ÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿ€Áø€Áñ€Áê€Áã€ÁÜ€ÁÕ€Á΀ÁÇ€ÁÀ€Á¹€Á²€Á«€Á¤€Á€Á–€Á€Áˆ€Á€Áz€Ás€Ál€Áe€Á^€ÁW€ÁP€ÁI€ÁB€Á;€Á4€Á-€Á&€Á€Á€Á€Á €Á€ÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁù~Áò~Áë~Áä~ÁÝ~ÁÖ~ÁÏ~ÁÈ~ÁÁ~Áº~Á³~Á¬~Á¥~Áž~Á—~Á~Á‰~Á‚~Á{~Át~Ám~Áf~Á_~ÁX~ÁQ~ÁJ~ÁC~Á<~Á5~Á.~Á'~Á ~Á~Á~Á ~Á~Áý}Áö}Áï}Áè}Áá}ÁÚ}ÁÓ}ÁÌ}ÁÅ}Á¾}Á·}Á°}Á©}Á¢}Á›}Á”}Á}Á†}Á}Áx}Áq}Áj}Ác}Á\}ÁU}ÁN}ÁG}Á@}Á9}Á2}Á+}Á$}Á}Á}Á}Á}Á}Áú|Áó|Áì|Áå|ÁÞ|Á×|ÁÐ|ÁÉ|ÁÂ|Á»|Á´|Á­|Á¦|ÁŸ|Á˜|Á‘|ÁŠ|Áƒ|Á||Áu|Án|Ág|Á`|ÁY|ÁR|ÁK|ÁD|Á=|Á6|Á/|Á(|Á!|Á|Á|Á |Á|Áþ{Á÷{Áð{Áé{Áâ{ÁÛ{ÁÔ{ÁÍ{ÁÆ{Á¿{Á¸{Á±{Áª{Á£{Áœ{Á•{ÁŽ{Á‡{Á€{Áy{Ár{Ák{Ád{Á]{ÁV{ÁO{ÁH{ÁA{Á:{Á3{Á,{Á%{Á{Á{Á{Á {Á{ÁûzÁôzÁízÁæzÁßzÁØzÁÑzÁÊzÁÃzÁ¼zÁµzÁ®zÁ§zÁ zÁ™zÁ’zÁ‹zÁ„zÁ}zÁvzÁozÁhzÁazÁZzÁSzÁLzÁEzÁ>zÁ7zÁ0zÁ)zÁ"zÁzÁzÁ zÁzÁÿyÁøyÁñyÁêyÁãyÁÜyÁÕyÁÎyÁÇyÁÀyÁ¹yÁ²yÁ«yÁ¤yÁyÁ–yÁyÁˆyÁyÁzyÁsyÁlyÁeyÁ^yÁWyÁPyÁIyÁByÁ;yÁ4yÁ-yÁ&yÁyÁyÁyÁ yÁyÁüxÁõxÁîxÁçxÁàxÁÙxÁÒxÁËxÁÄxÁ½xÁ¶xÁ¯xÁ¨xÁ¡xÁšxÁ“xÁŒxÁ…xÁ~xÁwxÁpxÁixÁbxÁ[xÁTxÁMxÁFxÁ?xÁ8xÁ1xÁ*xÁ#xÁxÁxÁxÁxÁxÁùwÁòwÁëwÁäwÁÝwÁÖwÁÏwÁÈwÁÁwÁºwÁ³wÁ¬wÁ¥wÁžwÁ—wÁwÁ‰wÁ‚wÁ{wÁtwÁmwÁfwÁ_wÁXwÁQwÁJwÁCwÁsÁ7sÁ0sÁ)sÁ"sÁsÁsÁ sÁsÁÿrÁørÁñrÁêrÁãrÁÜrÁÕrÁÎrÁÇrÁÀrÁ¹rÁ²rÁ«rÁ¤rÁrÁ–rÁrÁˆrÁrÁzrÁsrÁlrÁerÁ^rÁWrÁPrÁIrÁBrÁ;rÁ4rÁ-rÁ&rÁrÁrÁrÁ rÁrÁüqÁõqÁîqÁçqÁàqÁÙqÁÒqÁËqÁÄqÁ½qÁ¶qÁ¯qÁ¨qÁ¡qÁšqÁ“qÁŒqÁ…qÁ~qÁwqÁpqÁiqÁbqÁ[qÁTqÁMqÁFqÁ?qÁ8qÁ1qÁ*qÁ#qÁqÁqÁqÁqÁqÁùpÁòpÁëpÁäpÁÝpÁÖpÁÏpÁÈpÁÁpÁºpÁ³pÁ¬pÁ¥pÁžpÁ—pÁpÁ‰pÁ‚pÁ{pÁtpÁmpÁfpÁ_pÁXpÁQpÁJpÁCpÁlÁ7lÁ0lÁ)lÁ"lÁlÁlÁ lÁlÁÿkÁøkÁñkÁêkÁãkÁÜkÁÕkÁÎkÁÇkÁÀkÁ¹kÁ²kÁ«kÁ¤kÁkÁ–kÁkÁˆkÁkÁzkÁskÁlkÁekÁ^kÁWkÁPkÁIkÁBkÁ;kÁ4kÁ-kÁ&kÁkÁkÁkÁ kÁkÁüjÁõjÁîjÁçjÁàjÁÙjÁÒjÁËjÁÄjÁ½jÁ¶jÁ¯jÁ¨jÁ¡jÁšjÁ“jÁŒjÁ…jÁ~jÁwjÁpjÁijÁbjÁ[jÁTjÁMjÁFjÁ?jÁ8jÁ1jÁ*jÁ#jÁjÁjÁjÁjÁjÁùiÁòiÁëiÁäiÁÝiÁÖiÁÏiÁÈiÁÁiÁºiÁ³iÁ¬iÁ¥iÁžiÁ—iÁiÁ‰iÁ‚iÁ{iÁtiÁmiÁfiÁ_iÁXiÁQiÁJiÁCiÁeÁ7eÁ0eÁ)eÁ"eÁeÁeÁ eÁeÁÿdÁødÁñdÁêdÁãdÁÜdÁÕdÁÎdÁÇdÁÀdÁ¹dÁ²dÁ«dÁ¤dÁdÁ–dÁdÁˆdÁdÁzdÁsdÁldÁedÁ^dÁWdÁPdÁIdÁBdÁ;dÁ4dÁ-dÁ&dÁdÁdÁdÁ dÁdÁücÁõcÁîcÁçcÁàcÁÙcÁÒcÁËcÁÄcÁ½cÁ¶cÁ¯cÁ¨cÁ¡cÁšcÁ“cÁŒcÁ…cÁ~cÁwcÁpcÁicÁbcÁ[cÁTcÁMcÁFcÁ?cÁ8cÁ1cÁ*cÁ#cÁcÁcÁcÁcÁcÁùbÁòbÁëbÁäbÁÝbÁÖbÁÏbÁÈbÁÁbÁºbÁ³bÁ¬bÁ¥bÁžbÁ—bÁbÁ‰bÁ‚bÁ{bÁtbÁmbÁfbÁ_bÁXbÁQbÁJbÁCbÁ^Á7^Á0^Á)^Á"^Á^Á^Á ^Á^Áÿ]Áø]Áñ]Áê]Áã]ÁÜ]ÁÕ]ÁÎ]ÁÇ]ÁÀ]Á¹]Á²]Á«]Á¤]Á]Á–]Á]Áˆ]Á]Áz]Ás]Ál]Áe]Á^]ÁW]ÁP]ÁI]ÁB]Á;]Á4]Á-]Á&]Á]Á]Á]Á ]Á]Áü\Áõ\Áî\Áç\Áà\ÁÙ\ÁÒ\ÁË\ÁÄ\Á½\Á¶\Á¯\Á¨\Á¡\Áš\Á“\ÁŒ\Á…\Á~\Áw\Áp\Ái\Áb\Á[\ÁT\ÁM\ÁF\Á?\Á8\Á1\Á*\Á#\Á\Á\Á\Á\Á\Áù[Áò[Áë[Áä[ÁÝ[ÁÖ[ÁÏ[ÁÈ[ÁÁ[Áº[Á³[Á¬[Á¥[Áž[Á—[Á[Á‰[Á‚[Á{[Át[Ám[Áf[Á_[ÁX[ÁQ[ÁJ[ÁC[Á<[Á5[Á.[Á'[Á [Á[Á[Á [Á[ÁýZÁöZÁïZÁèZÁáZÁÚZÁÓZÁÌZÁÅZÁ¾ZÁ·ZÁ°ZÁ©ZÁ¢ZÁ›ZÁ”ZÁZÁ†ZÁZÁxZÁqZÁjZÁcZÁ\ZÁUZÁNZÁGZÁ@ZÁ9ZÁ2ZÁ+ZÁ$ZÁZÁZÁZÁZÁZÁúYÁóYÁìYÁåYÁÞYÁ×YÁÐYÁÉYÁÂYÁ»YÁ´YÁ­YÁ¦YÁŸYÁ˜YÁ‘YÁŠYÁƒYÁ|YÁuYÁnYÁgYÁ`YÁYYÁRYÁKYÁDYÁ=YÁ6YÁ/YÁ(YÁ!YÁYÁYÁ YÁYÁþXÁ÷XÁðXÁéXÁâXÁÛXÁÔXÁÍXÁÆXÁ¿XÁ¸XÁ±XÁªXÁ£XÁœXÁ•XÁŽXÁ‡XÁ€XÁyXÁrXÁkXÁdXÁ]XÁVXÁOXÁHXÁAXÁ:XÁ3XÁ,XÁ%XÁXÁXÁXÁ XÁXÁûWÁôWÁíWÁæWÁßWÁØWÁÑWÁÊWÁÃWÁ¼WÁµWÁ®WÁ§WÁ WÁ™WÁ’WÁ‹WÁ„WÁ}WÁvWÁoWÁhWÁaWÁZWÁSWÁLWÁEWÁ>WÁ7WÁ0WÁ)WÁ"WÁWÁWÁ WÁWÁÿVÁøVÁñVÁêVÁãVÁÜVÁÕVÁÎVÁÇVÁÀVÁ¹VÁ²VÁ«VÁ¤VÁVÁ–VÁVÁˆVÁVÁzVÁsVÁlVÁeVÁ^VÁWVÁPVÁIVÁBVÁ;VÁ4VÁ-VÁ&VÁVÁVÁVÁ VÁVÁüUÁõUÁîUÁçUÁàUÁÙUÁÒUÁËUÁÄUÁ½UÁ¶UÁ¯UÁ¨UÁ¡UÁšUÁ“UÁŒUÁ…UÁ~UÁwUÁpUÁiUÁbUÁ[UÁTUÁMUÁFUÁ?UÁ8UÁ1UÁ*UÁ#UÁUÁUÁUÁUÁUÁùTÁòTÁëTÁäTÁÝTÁÖTÁÏTÁÈTÁÁTÁºTÁ³TÁ¬TÁ¥TÁžTÁ—TÁTÁ‰TÁ‚TÁ{TÁtTÁmTÁfTÁ_TÁXTÁQTÁJTÁCTÁPÁ7PÁ0PÁ)PÁ"PÁPÁPÁ PÁPÁÿOÁøOÁñOÁêOÁãOÁÜOÁÕOÁÎOÁÇOÁÀOÁ¹OÁ²OÁ«OÁ¤OÁOÁ–OÁOÁˆOÁOÁzOÁsOÁlOÁeOÁ^OÁWOÁPOÁIOÁBOÁ;OÁ4OÁ-OÁ&OÁOÁOÁOÁ OÁOÁüNÁõNÁîNÁçNÁàNÁÙNÁÒNÁËNÁÄNÁ½NÁ¶NÁ¯NÁ¨NÁ¡NÁšNÁ“NÁŒNÁ…NÁ~NÁwNÁpNÁiNÁbNÁ[NÁTNÁMNÁFNÁ?NÁ8NÁ1NÁ*NÁ#NÁNÁNÁNÁNÁNÁùMÁòMÁëMÁäMÁÝMÁÖMÁÏMÁÈMÁÁMÁºMÁ³MÁ¬MÁ¥MÁžMÁ—MÁMÁ‰MÁ‚MÁ{MÁtMÁmMÁfMÁ_MÁXMÁQMÁJMÁCMÁIÁ7IÁ0IÁ)IÁ"IÁIÁIÁ IÁIÁÿHÁøHÁñHÁêHÁãHÁÜHÁÕHÁÎHÁÇHÁÀHÁ¹HÁ²HÁ«HÁ¤HÁHÁ–HÁHÁˆHÁHÁzHÁsHÁlHÁeHÁ^HÁWHÁPHÁIHÁBHÁ;HÁ4HÁ-HÁ&HÁHÁHÁHÁ HÁHÁüGÁõGÁîGÁçGÁàGÁÙGÁÒGÁËGÁÄGÁ½GÁ¶GÁ¯GÁ¨GÁ¡GÁšGÁ“GÁŒGÁ…GÁ~GÁwGÁpGÁiGÁbGÁ[GÁTGÁMGÁFGÁ?GÁ8GÁ1GÁ*GÁ#GÁGÁGÁGÁGÁGÁùFÁòFÁëFÁäFÁÝFÁÖFÁÏFÁÈFÁÁFÁºFÁ³FÁ¬FÁ¥FÁžFÁ—FÁFÁ‰FÁ‚FÁ{FÁtFÁmFÁfFÁ_FÁXFÁQFÁJFÁCFÁBÁ7BÁ0BÁ)BÁ"BÁBÁBÁ BÁBÁÿAÁøAÁñAÁêAÁãAÁÜAÁÕAÁÎAÁÇAÁÀAÁ¹AÁ²AÁ«AÁ¤AÁAÁ–AÁAÁˆAÁAÁzAÁsAÁlAÁeAÁ^AÁWAÁPAÁIAÁBAÁ;AÁ4AÁ-AÁ&AÁAÁAÁAÁ AÁAÁü@Áõ@Áî@Áç@Áà@ÁÙ@ÁÒ@ÁË@ÁÄ@Á½@Á¶@Á¯@Á¨@Á¡@Áš@Á“@ÁŒ@Á…@Á~@Áw@Áp@Ái@Áb@Á[@ÁT@ÁM@ÁF@Á?@Á8@Á1@Á*@Á#@Á@Á@Á@Á@Á@Áù?Áò?Áë?Áä?ÁÝ?ÁÖ?ÁÏ?ÁÈ?ÁÁ?Áº?Á³?Á¬?Á¥?Áž?Á—?Á?Á‰?Á‚?Á{?Át?Ám?Áf?Á_?ÁX?ÁQ?ÁJ?ÁC?ÁÁö>Áï>Áè>Áá>ÁÚ>ÁÓ>ÁÌ>ÁÅ>Á¾>Á·>Á°>Á©>Á¢>Á›>Á”>Á>Á†>Á>Áx>Áq>Áj>Ác>Á\>ÁU>ÁN>ÁG>Á@>Á9>Á2>Á+>Á$>Á>Á>Á>Á>Á>Áú=Áó=Áì=Áå=ÁÞ=Á×=ÁÐ=ÁÉ=ÁÂ=Á»=Á´=Á­=Á¦=ÁŸ=Á˜=Á‘=ÁŠ=Áƒ=Á|=Áu=Án=Ág=Á`=ÁY=ÁR=ÁK=ÁD=Á==Á6=Á/=Á(=Á!=Á=Á=Á =Á=Áþ<Á÷<Áð<Áé<Áâ<ÁÛ<ÁÔ<ÁÍ<ÁÆ<Á¿<Á¸<Á±<Áª<Á£<Áœ<Á•<ÁŽ<Á‡<Á€<Áy<Ár<Ák<Ád<Á]<ÁV<ÁO<ÁH<ÁA<Á:<Á3<Á,<Á%<Á<Á<Á<Á <Á<Áû;Áô;Áí;Áæ;Áß;ÁØ;ÁÑ;ÁÊ;ÁÃ;Á¼;Áµ;Á®;Á§;Á ;Á™;Á’;Á‹;Á„;Á};Áv;Áo;Áh;Áa;ÁZ;ÁS;ÁL;ÁE;Á>;Á7;Á0;Á);Á";Á;Á;Á ;Á;Áÿ:Áø:Áñ:Áê:Áã:ÁÜ:ÁÕ:ÁÎ:ÁÇ:ÁÀ:Á¹:Á²:Á«:Á¤:Á:Á–:Á:Áˆ:Á:Áz:Ás:Ál:Áe:Á^:ÁW:ÁP:ÁI:ÁB:Á;:Á4:Á-:Á&:Á:Á:Á:Á :Á:Áü9Áõ9Áî9Áç9Áà9ÁÙ9ÁÒ9ÁË9ÁÄ9Á½9Á¶9Á¯9Á¨9Á¡9Áš9Á“9ÁŒ9Á…9Á~9Áw9Áp9Ái9Áb9Á[9ÁT9ÁM9ÁF9Á?9Á89Á19Á*9Á#9Á9Á9Á9Á9Á9Áù8Áò8Áë8Áä8ÁÝ8ÁÖ8ÁÏ8ÁÈ8ÁÁ8Áº8Á³8Á¬8Á¥8Áž8Á—8Á8Á‰8Á‚8Á{8Át8Ám8Áf8Á_8ÁX8ÁQ8ÁJ8ÁC8Á<8Á58Á.8Á'8Á 8Á8Á8Á 8Á8Áý7Áö7Áï7Áè7Áá7ÁÚ7ÁÓ7ÁÌ7ÁÅ7Á¾7Á·7Á°7Á©7Á¢7Á›7Á”7Á7Á†7Á7Áx7Áq7Áj7Ác7Á\7ÁU7ÁN7ÁG7Á@7Á97Á27Á+7Á$7Á7Á7Á7Á7Á7Áú6Áó6Áì6Áå6ÁÞ6Á×6ÁÐ6ÁÉ6ÁÂ6Á»6Á´6Á­6Á¦6ÁŸ6Á˜6Á‘6ÁŠ6Áƒ6Á|6Áu6Án6Ág6Á`6ÁY6ÁR6ÁK6ÁD6Á=6Á66Á/6Á(6Á!6Á6Á6Á 6Á6Áþ5Á÷5Áð5Áé5Áâ5ÁÛ5ÁÔ5ÁÍ5ÁÆ5Á¿5Á¸5Á±5Áª5Á£5Áœ5Á•5ÁŽ5Á‡5Á€5Áy5Ár5Ák5Ád5Á]5ÁV5ÁO5ÁH5ÁA5Á:5Á35Á,5Á%5Á5Á5Á5Á 5Á5Áû4Áô4Áí4Áæ4Áß4ÁØ4ÁÑ4ÁÊ4ÁÃ4Á¼4Áµ4Á®4Á§4Á 4Á™4Á’4Á‹4Á„4Á}4Áv4Áo4Áh4Áa4ÁZ4ÁS4ÁL4ÁE4Á>4Á74Á04Á)4Á"4Á4Á4Á 4Á4Áÿ3Áø3Áñ3Áê3Áã3ÁÜ3ÁÕ3ÁÎ3ÁÇ3ÁÀ3Á¹3Á²3Á«3Á¤3Á3Á–3Á3Áˆ3Á3Áz3Ás3Ál3Áe3Á^3ÁW3ÁP3ÁI3ÁB3Á;3Á43Á-3Á&3Á3Á3Á3Á 3Á3Áü2Áõ2Áî2Áç2Áà2ÁÙ2ÁÒ2ÁË2ÁÄ2Á½2Á¶2Á¯2Á¨2Á¡2Áš2Á“2ÁŒ2Á…2Á~2Áw2Áp2Ái2Áb2Á[2ÁT2ÁM2ÁF2Á?2Á82Á12Á*2Á#2Á2Á2Á2Á2Á2Áù1Áò1Áë1Áä1ÁÝ1ÁÖ1ÁÏ1ÁÈ1ÁÁ1Áº1Á³1Á¬1Á¥1Áž1Á—1Á1Á‰1Á‚1Á{1Át1Ám1Áf1Á_1ÁX1ÁQ1ÁJ1ÁC1Á<1Á51Á.1Á'1Á 1Á1Á1Á 1Á1Áý0Áö0Áï0Áè0Áá0ÁÚ0ÁÓ0ÁÌ0ÁÅ0Á¾0Á·0Á°0Á©0Á¢0Á›0Á”0Á0Á†0Á0Áx0Áq0Áj0Ác0Á\0ÁU0ÁN0ÁG0Á@0Á90Á20Á+0Á$0Á0Á0Á0Á0Á0Áú/Áó/Áì/Áå/ÁÞ/Á×/ÁÐ/ÁÉ/ÁÂ/Á»/Á´/Á­/Á¦/ÁŸ/Á˜/Á‘/ÁŠ/Áƒ/Á|/Áu/Án/Ág/Á`/ÁY/ÁR/ÁK/ÁD/Á=/Á6/Á//Á(/Á!/Á/Á/Á /Á/Áþ.Á÷.Áð.Áé.Áâ.ÁÛ.ÁÔ.ÁÍ.ÁÆ.Á¿.Á¸.Á±.Áª.Á£.Áœ.Á•.ÁŽ.Á‡.Á€.Áy.Ár.Ák.Ád.Á].ÁV.ÁO.ÁH.ÁA.Á:.Á3.Á,.Á%.Á.Á.Á.Á .Á.Áû-Áô-Áí-Áæ-Áß-ÁØ-ÁÑ-ÁÊ-ÁÃ-Á¼-Áµ-Á®-Á§-Á -Á™-Á’-Á‹-Á„-Á}-Áv-Áo-Áh-Áa-ÁZ-ÁS-ÁL-ÁE-Á>-Á7-Á0-Á)-Á"-Á-Á-Á -Á-Áÿ,Áø,Áñ,Áê,Áã,ÁÜ,ÁÕ,ÁÎ,ÁÇ,ÁÀ,Á¹,Á²,Á«,Á¤,Á,Á–,Á,Áˆ,Á,Áz,Ás,Ál,Áe,Á^,ÁW,ÁP,ÁI,ÁB,Á;,Á4,Á-,Á&,Á,Á,Á,Á ,Á,Áü+Áõ+Áî+Áç+Áà+ÁÙ+ÁÒ+ÁË+ÁÄ+Á½+Á¶+Á¯+Á¨+Á¡+Áš+Á“+ÁŒ+Á…+Á~+Áw+Áp+Ái+Áb+Á[+ÁT+ÁM+ÁF+Á?+Á8+Á1+Á*+Á#+Á+Á+Á+Á+Á+Áù*Áò*Áë*Áä*ÁÝ*ÁÖ*ÁÏ*ÁÈ*ÁÁ*Áº*Á³*Á¬*Á¥*Áž*Á—*Á*Á‰*Á‚*Á{*Át*Ám*Áf*Á_*ÁX*ÁQ*ÁJ*ÁC*Á<*Á5*Á.*Á'*Á *Á*Á*Á *Á*Áý)Áö)Áï)Áè)Áá)ÁÚ)ÁÓ)ÁÌ)ÁÅ)Á¾)Á·)Á°)Á©)Á¢)Á›)Á”)Á)Á†)Á)Áx)Áq)Áj)Ác)Á\)ÁU)ÁN)ÁG)Á@)Á9)Á2)Á+)Á$)Á)Á)Á)Á)Á)Áú(Áó(Áì(Áå(ÁÞ(Á×(ÁÐ(ÁÉ(ÁÂ(Á»(Á´(Á­(Á¦(ÁŸ(Á˜(Á‘(ÁŠ(Áƒ(Á|(Áu(Án(Ág(Á`(ÁY(ÁR(ÁK(ÁD(Á=(Á6(Á/(Á((Á!(Á(Á(Á (Á(Áþ'Á÷'Áð'Áé'Áâ'ÁÛ'ÁÔ'ÁÍ'ÁÆ'Á¿'Á¸'Á±'Áª'Á£'Áœ'Á•'ÁŽ'Á‡'Á€'Áy'Ár'Ák'Ád'Á]'ÁV'ÁO'ÁH'ÁA'Á:'Á3'Á,'Á%'Á'Á'Á'Á 'Á'Áû&Áô&Áí&Áæ&Áß&ÁØ&ÁÑ&ÁÊ&ÁÃ&Á¼&Áµ&Á®&Á§&Á &Á™&Á’&Á‹&Á„&Á}&Áv&Áo&Áh&Áa&ÁZ&ÁS&ÁL&ÁE&Á>&Á7&Á0&Á)&Á"&Á&Á&Á &Á&Áÿ%Áø%Áñ%Áê%Áã%ÁÜ%ÁÕ%ÁÎ%ÁÇ%ÁÀ%Á¹%Á²%Á«%Á¤%Á%Á–%Á%Áˆ%Á%Áz%Ás%Ál%Áe%Á^%ÁW%ÁP%ÁI%ÁB%Á;%Á4%Á-%Á&%Á%Á%Á%Á %Á%Áü$Áõ$Áî$Áç$Áà$ÁÙ$ÁÒ$ÁË$ÁÄ$Á½$Á¶$Á¯$Á¨$Á¡$Áš$Á“$ÁŒ$Á…$Á~$Áw$Áp$Ái$Áb$Á[$ÁT$ÁM$ÁF$Á?$Á8$Á1$Á*$Á#$Á$Á$Á$Á$Á$Áù#Áò#Áë#Áä#ÁÝ#ÁÖ#ÁÏ#ÁÈ#ÁÁ#Áº#Á³#Á¬#Á¥#Áž#Á—#Á#Á‰#Á‚#Á{#Át#Ám#Áf#Á_#ÁX#ÁQ#ÁJ#ÁC#Á<#Á5#Á.#Á'#Á #Á#Á#Á #Á#Áý"Áö"Áï"Áè"Áá"ÁÚ"ÁÓ"ÁÌ"ÁÅ"Á¾"Á·"Á°"Á©"Á¢"Á›"Á”"Á"Á†"Á"Áx"Áq"Áj"Ác"Á\"ÁU"ÁN"ÁG"Á@"Á9"Á2"Á+"Á$"Á"Á"Á"Á"Á"Áú!Áó!Áì!Áå!ÁÞ!Á×!ÁÐ!ÁÉ!ÁÂ!Á»!Á´!Á­!Á¦!ÁŸ!Á˜!Á‘!ÁŠ!Áƒ!Á|!Áu!Án!Ág!Á`!ÁY!ÁR!ÁK!ÁD!Á=!Á6!Á/!Á(!Á!!Á!Á!Á !Á!Áþ Á÷ Áð Áé Áâ ÁÛ ÁÔ ÁÍ ÁÆ Á¿ Á¸ Á± Áª Á£ Áœ Á• ÁŽ Á‡ Á€ Áy Ár Ák Ád Á] ÁV ÁO ÁH ÁA Á: Á3 Á, Á% Á Á Á Á Á ÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁý Áö Áï Áè Áá ÁÚ ÁÓ ÁÌ ÁÅ Á¾ Á· Á° Á© Á¢ Á› Á” Á Á† Á Áx Áq Áj Ác Á\ ÁU ÁN ÁG Á@ Á9 Á2 Á+ Á$ Á Á Á Á Á Áú Áó Áì Áå ÁÞ Á× ÁÐ ÁÉ Á Á» Á´ Á­ Á¦ ÁŸ Á˜ Á‘ ÁŠ Áƒ Á| Áu Án Ág Á` ÁY ÁR ÁK ÁD Á= Á6 Á/ Á( Á! Á Á Á Á Áþ Á÷ Áð Áé Áâ ÁÛ ÁÔ ÁÍ ÁÆ Á¿ Á¸ Á± Áª Á£ Áœ Á• ÁŽ Á‡ Á€ Áy Ár Ák Ád Á] ÁV ÁO ÁH ÁA Á: Á3 Á, Á% Á Á Á Á Á Áû Áô Áí Áæ Áß ÁØ ÁÑ ÁÊ Áà Á¼ Áµ Á® Á§ Á  Á™ Á’ Á‹ Á„ Á} Áv Áo Áh Áa ÁZ ÁS ÁL ÁE Á> Á7 Á0 Á) Á" Á Á Á Á Áÿ Áø Áñ Áê Áã ÁÜ ÁÕ ÁÎ ÁÇ ÁÀ Á¹ Á² Á« Á¤ Á Á– Á Áˆ Á Áz Ás Ál Áe Á^ ÁW ÁP ÁI ÁB Á; Á4 Á- Á& Á Á Á Á Á ÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÿÀöÿÀïÿÀèÿÀáÿÀÚÿÀÓÿÀÌÿÀÅÿÀ¾ÿÀ·ÿÀ°ÿÀ©ÿÀ¢ÿÀ›ÿÀ”ÿÀÿÀ†ÿÀÿÀxÿÀqÿÀjÿÀcÿÀ\ÿÀUÿÀNÿÀGÿÀ@ÿÀ9ÿÀ2ÿÀ+ÿÀ$ÿÀÿÀÿÀÿÀÿÀÿÀúþÀóþÀìþÀåþÀÞþÀ×þÀÐþÀÉþÀÂþÀ»þÀ´þÀ­þÀ¦þÀŸþÀ˜þÀ‘þÀŠþÀƒþÀ|þÀuþÀnþÀgþÀ`þÀYþÀRþÀKþÀDþÀ=þÀ6þÀ/þÀ(þÀ!þÀþÀþÀ þÀþÀþýÀ÷ýÀðýÀéýÀâýÀÛýÀÔýÀÍýÀÆýÀ¿ýÀ¸ýÀ±ýÀªýÀ£ýÀœýÀ•ýÀŽýÀ‡ýÀ€ýÀyýÀrýÀkýÀdýÀ]ýÀVýÀOýÀHýÀAýÀ:ýÀ3ýÀ,ýÀ%ýÀýÀýÀýÀ ýÀýÀûüÀôüÀíüÀæüÀßüÀØüÀÑüÀÊüÀÃüÀ¼üÀµüÀ®üÀ§üÀ üÀ™üÀ’üÀ‹üÀ„üÀ}üÀvüÀoüÀhüÀaüÀZüÀSüÀLüÀEüÀ>üÀ7üÀ0üÀ)üÀ"üÀüÀüÀ üÀüÀÿûÀøûÀñûÀêûÀãûÀÜûÀÕûÀÎûÀÇûÀÀûÀ¹ûÀ²ûÀ«ûÀ¤ûÀûÀ–ûÀûÀˆûÀûÀzûÀsûÀlûÀeûÀ^ûÀWûÀPûÀIûÀBûÀ;ûÀ4ûÀ-ûÀ&ûÀûÀûÀûÀ ûÀûÀüúÀõúÀîúÀçúÀàúÀÙúÀÒúÀËúÀÄúÀ½úÀ¶úÀ¯úÀ¨úÀ¡úÀšúÀ“úÀŒúÀ…úÀ~úÀwúÀpúÀiúÀbúÀ[úÀTúÀMúÀFúÀ?úÀ8úÀ1úÀ*úÀ#úÀúÀúÀúÀúÀúÀùùÀòùÀëùÀäùÀÝùÀÖùÀÏùÀÈùÀÁùÀºùÀ³ùÀ¬ùÀ¥ùÀžùÀ—ùÀùÀ‰ùÀ‚ùÀ{ùÀtùÀmùÀfùÀ_ùÀXùÀQùÀJùÀCùÀ<ùÀ5ùÀ.ùÀ'ùÀ ùÀùÀùÀ ùÀùÀýøÀöøÀïøÀèøÀáøÀÚøÀÓøÀÌøÀÅøÀ¾øÀ·øÀ°øÀ©øÀ¢øÀ›øÀ”øÀøÀ†øÀøÀxøÀqøÀjøÀcøÀ\øÀUøÀNøÀGøÀ@øÀ9øÀ2øÀ+øÀ$øÀøÀøÀøÀøÀøÀú÷Àó÷Àì÷Àå÷ÀÞ÷À×÷ÀÐ÷ÀÉ÷ÀÂ÷À»÷À´÷À­÷À¦÷ÀŸ÷À˜÷À‘÷ÀŠ÷Àƒ÷À|÷Àu÷Àn÷Àg÷À`÷ÀY÷ÀR÷ÀK÷ÀD÷À=÷À6÷À/÷À(÷À!÷À÷À÷À ÷À÷ÀþöÀ÷öÀðöÀéöÀâöÀÛöÀÔöÀÍöÀÆöÀ¿öÀ¸öÀ±öÀªöÀ£öÀœöÀ•öÀŽöÀ‡öÀ€öÀyöÀröÀköÀdöÀ]öÀVöÀOöÀHöÀAöÀ:öÀ3öÀ,öÀ%öÀöÀöÀöÀ öÀöÀûõÀôõÀíõÀæõÀßõÀØõÀÑõÀÊõÀÃõÀ¼õÀµõÀ®õÀ§õÀ õÀ™õÀ’õÀ‹õÀ„õÀ}õÀvõÀoõÀhõÀaõÀZõÀSõÀLõÀEõÀ>õÀ7õÀ0õÀ)õÀ"õÀõÀõÀ õÀõÀÿôÀøôÀñôÀêôÀãôÀÜôÀÕôÀÎôÀÇôÀÀôÀ¹ôÀ²ôÀ«ôÀ¤ôÀôÀ–ôÀôÀˆôÀôÀzôÀsôÀlôÀeôÀ^ôÀWôÀPôÀIôÀBôÀ;ôÀ4ôÀ-ôÀ&ôÀôÀôÀôÀ ôÀôÀüóÀõóÀîóÀçóÀàóÀÙóÀÒóÀËóÀÄóÀ½óÀ¶óÀ¯óÀ¨óÀ¡óÀšóÀ“óÀŒóÀ…óÀ~óÀwóÀpóÀióÀbóÀ[óÀTóÀMóÀFóÀ?óÀ8óÀ1óÀ*óÀ#óÀóÀóÀóÀóÀóÀùòÀòòÀëòÀäòÀÝòÀÖòÀÏòÀÈòÀÁòÀºòÀ³òÀ¬òÀ¥òÀžòÀ—òÀòÀ‰òÀ‚òÀ{òÀtòÀmòÀfòÀ_òÀXòÀQòÀJòÀCòÀ<òÀ5òÀ.òÀ'òÀ òÀòÀòÀ òÀòÀýñÀöñÀïñÀèñÀáñÀÚñÀÓñÀÌñÀÅñÀ¾ñÀ·ñÀ°ñÀ©ñÀ¢ñÀ›ñÀ”ñÀñÀ†ñÀñÀxñÀqñÀjñÀcñÀ\ñÀUñÀNñÀGñÀ@ñÀ9ñÀ2ñÀ+ñÀ$ñÀñÀñÀñÀñÀñÀúðÀóðÀìðÀåðÀÞðÀ×ðÀÐðÀÉðÀÂðÀ»ðÀ´ðÀ­ðÀ¦ðÀŸðÀ˜ðÀ‘ðÀŠðÀƒðÀ|ðÀuðÀnðÀgðÀ`ðÀYðÀRðÀKðÀDðÀ=ðÀ6ðÀ/ðÀ(ðÀ!ðÀðÀðÀ ðÀðÀþïÀ÷ïÀðïÀéïÀâïÀÛïÀÔïÀÍïÀÆïÀ¿ïÀ¸ïÀ±ïÀªïÀ£ïÀœïÀ•ïÀŽïÀ‡ïÀ€ïÀyïÀrïÀkïÀdïÀ]ïÀVïÀOïÀHïÀAïÀ:ïÀ3ïÀ,ïÀ%ïÀïÀïÀïÀ ïÀïÀûîÀôîÀíîÀæîÀßîÀØîÀÑîÀÊîÀÃîÀ¼îÀµîÀ®îÀ§îÀ îÀ™îÀ’îÀ‹îÀ„îÀ}îÀvîÀoîÀhîÀaîÀZîÀSîÀLîÀEîÀ>îÀ7îÀ0îÀ)îÀ"îÀîÀîÀ îÀîÀÿíÀøíÀñíÀêíÀãíÀÜíÀÕíÀÎíÀÇíÀÀíÀ¹íÀ²íÀ«íÀ¤íÀíÀ–íÀíÀˆíÀíÀzíÀsíÀlíÀeíÀ^íÀWíÀPíÀIíÀBíÀ;íÀ4íÀ-íÀ&íÀíÀíÀíÀ íÀíÀüìÀõìÀîìÀçìÀàìÀÙìÀÒìÀËìÀÄìÀ½ìÀ¶ìÀ¯ìÀ¨ìÀ¡ìÀšìÀ“ìÀŒìÀ…ìÀ~ìÀwìÀpìÀiìÀbìÀ[ìÀTìÀMìÀFìÀ?ìÀ8ìÀ1ìÀ*ìÀ#ìÀìÀìÀìÀìÀìÀùëÀòëÀëëÀäëÀÝëÀÖëÀÏëÀÈëÀÁëÀºëÀ³ëÀ¬ëÀ¥ëÀžëÀ—ëÀëÀ‰ëÀ‚ëÀ{ëÀtëÀmëÀfëÀ_ëÀXëÀQëÀJëÀCëÀ<ëÀ5ëÀ.ëÀ'ëÀ ëÀëÀëÀ ëÀëÀýêÀöêÀïêÀèêÀáêÀÚêÀÓêÀÌêÀÅêÀ¾êÀ·êÀ°êÀ©êÀ¢êÀ›êÀ”êÀêÀ†êÀêÀxêÀqêÀjêÀcêÀ\êÀUêÀNêÀGêÀ@êÀ9êÀ2êÀ+êÀ$êÀêÀêÀêÀêÀêÀúéÀóéÀìéÀåéÀÞéÀ×éÀÐéÀÉéÀÂéÀ»éÀ´éÀ­éÀ¦éÀŸéÀ˜éÀ‘éÀŠéÀƒéÀ|éÀuéÀnéÀgéÀ`éÀYéÀRéÀKéÀDéÀ=éÀ6éÀ/éÀ(éÀ!éÀéÀéÀ éÀéÀþèÀ÷èÀðèÀéèÀâèÀÛèÀÔèÀÍèÀÆèÀ¿èÀ¸èÀ±èÀªèÀ£èÀœèÀ•èÀŽèÀ‡èÀ€èÀyèÀrèÀkèÀdèÀ]èÀVèÀOèÀHèÀAèÀ:èÀ3èÀ,èÀ%èÀèÀèÀèÀ èÀèÀûçÀôçÀíçÀæçÀßçÀØçÀÑçÀÊçÀÃçÀ¼çÀµçÀ®çÀ§çÀ çÀ™çÀ’çÀ‹çÀ„çÀ}çÀvçÀoçÀhçÀaçÀZçÀSçÀLçÀEçÀ>çÀ7çÀ0çÀ)çÀ"çÀçÀçÀ çÀçÀÿæÀøæÀñæÀêæÀãæÀÜæÀÕæÀÎæÀÇæÀÀæÀ¹æÀ²æÀ«æÀ¤æÀæÀ–æÀæÀˆæÀæÀzæÀsæÀlæÀeæÀ^æÀWæÀPæÀIæÀBæÀ;æÀ4æÀ-æÀ&æÀæÀæÀæÀ æÀæÀüåÀõåÀîåÀçåÀàåÀÙåÀÒåÀËåÀÄåÀ½åÀ¶åÀ¯åÀ¨åÀ¡åÀšåÀ“åÀŒåÀ…åÀ~åÀwåÀpåÀiåÀbåÀ[åÀTåÀMåÀFåÀ?åÀ8åÀ1åÀ*åÀ#åÀåÀåÀåÀåÀåÀùäÀòäÀëäÀääÀÝäÀÖäÀÏäÀÈäÀÁäÀºäÀ³äÀ¬äÀ¥äÀžäÀ—äÀäÀ‰äÀ‚äÀ{äÀtäÀmäÀfäÀ_äÀXäÀQäÀJäÀCäÀ<äÀ5äÀ.äÀ'äÀ äÀäÀäÀ äÀäÀýãÀöãÀïãÀèãÀáãÀÚãÀÓãÀÌãÀÅãÀ¾ãÀ·ãÀ°ãÀ©ãÀ¢ãÀ›ãÀ”ãÀãÀ†ãÀãÀxãÀqãÀjãÀcãÀ\ãÀUãÀNãÀGãÀ@ãÀ9ãÀ2ãÀ+ãÀ$ãÀãÀãÀãÀãÀãÀúâÀóâÀìâÀåâÀÞâÀ×âÀÐâÀÉâÀÂâÀ»âÀ´âÀ­âÀ¦âÀŸâÀ˜âÀ‘âÀŠâÀƒâÀ|âÀuâÀnâÀgâÀ`âÀYâÀRâÀKâÀDâÀ=âÀ6âÀ/âÀ(âÀ!âÀâÀâÀ âÀâÀþáÀ÷áÀðáÀéáÀâáÀÛáÀÔáÀÍáÀÆáÀ¿áÀ¸áÀ±áÀªáÀ£áÀœáÀ•áÀŽáÀ‡áÀ€áÀyáÀráÀkáÀdáÀ]áÀVáÀOáÀHáÀAáÀ:áÀ3áÀ,áÀ%áÀáÀáÀáÀ áÀáÀûàÀôàÀíàÀæàÀßàÀØàÀÑàÀÊàÀÃàÀ¼àÀµàÀ®àÀ§àÀ àÀ™àÀ’àÀ‹àÀ„àÀ}àÀvàÀoàÀhàÀaàÀZàÀSàÀLàÀEàÀ>àÀ7àÀ0àÀ)àÀ"àÀàÀàÀ àÀàÀÿßÀøßÀñßÀêßÀãßÀÜßÀÕßÀÎßÀÇßÀÀßÀ¹ßÀ²ßÀ«ßÀ¤ßÀßÀ–ßÀßÀˆßÀßÀzßÀsßÀlßÀeßÀ^ßÀWßÀPßÀIßÀBßÀ;ßÀ4ßÀ-ßÀ&ßÀßÀßÀßÀ ßÀßÀüÞÀõÞÀîÞÀçÞÀàÞÀÙÞÀÒÞÀËÞÀÄÞÀ½ÞÀ¶ÞÀ¯ÞÀ¨ÞÀ¡ÞÀšÞÀ“ÞÀŒÞÀ…ÞÀ~ÞÀwÞÀpÞÀiÞÀbÞÀ[ÞÀTÞÀMÞÀFÞÀ?ÞÀ8ÞÀ1ÞÀ*ÞÀ#ÞÀÞÀÞÀÞÀÞÀÞÀùÝÀòÝÀëÝÀäÝÀÝÝÀÖÝÀÏÝÀÈÝÀÁÝÀºÝÀ³ÝÀ¬ÝÀ¥ÝÀžÝÀ—ÝÀÝÀ‰ÝÀ‚ÝÀ{ÝÀtÝÀmÝÀfÝÀ_ÝÀXÝÀQÝÀJÝÀCÝÀ<ÝÀ5ÝÀ.ÝÀ'ÝÀ ÝÀÝÀÝÀ ÝÀÝÀýÜÀöÜÀïÜÀèÜÀáÜÀÚÜÀÓÜÀÌÜÀÅÜÀ¾ÜÀ·ÜÀ°ÜÀ©ÜÀ¢ÜÀ›ÜÀ”ÜÀÜÀ†ÜÀÜÀxÜÀqÜÀjÜÀcÜÀ\ÜÀUÜÀNÜÀGÜÀ@ÜÀ9ÜÀ2ÜÀ+ÜÀ$ÜÀÜÀÜÀÜÀÜÀÜÀúÛÀóÛÀìÛÀåÛÀÞÛÀ×ÛÀÐÛÀÉÛÀÂÛÀ»ÛÀ´ÛÀ­ÛÀ¦ÛÀŸÛÀ˜ÛÀ‘ÛÀŠÛÀƒÛÀ|ÛÀuÛÀnÛÀgÛÀ`ÛÀYÛÀRÛÀKÛÀDÛÀ=ÛÀ6ÛÀ/ÛÀ(ÛÀ!ÛÀÛÀÛÀ ÛÀÛÀþÚÀ÷ÚÀðÚÀéÚÀâÚÀÛÚÀÔÚÀÍÚÀÆÚÀ¿ÚÀ¸ÚÀ±ÚÀªÚÀ£ÚÀœÚÀ•ÚÀŽÚÀ‡ÚÀ€ÚÀyÚÀrÚÀkÚÀdÚÀ]ÚÀVÚÀOÚÀHÚÀAÚÀ:ÚÀ3ÚÀ,ÚÀ%ÚÀÚÀÚÀÚÀ ÚÀÚÀûÙÀôÙÀíÙÀæÙÀßÙÀØÙÀÑÙÀÊÙÀÃÙÀ¼ÙÀµÙÀ®ÙÀ§ÙÀ ÙÀ™ÙÀ’ÙÀ‹ÙÀ„ÙÀ}ÙÀvÙÀoÙÀhÙÀaÙÀZÙÀSÙÀLÙÀEÙÀ>ÙÀ7ÙÀ0ÙÀ)ÙÀ"ÙÀÙÀÙÀ ÙÀÙÀÿØÀøØÀñØÀêØÀãØÀÜØÀÕØÀÎØÀÇØÀÀØÀ¹ØÀ²ØÀ«ØÀ¤ØÀØÀ–ØÀØÀˆØÀØÀzØÀsØÀlØÀeØÀ^ØÀWØÀPØÀIØÀBØÀ;ØÀ4ØÀ-ØÀ&ØÀØÀØÀØÀ ØÀØÀü×Àõ×Àî×Àç×Àà×ÀÙ×ÀÒ×ÀË×ÀÄ×À½×À¶×À¯×À¨×À¡×Àš×À“×ÀŒ×À…×À~×Àw×Àp×Ài×Àb×À[×ÀT×ÀM×ÀF×À?×À8×À1×À*×À#×À×À×À×À×À×ÀùÖÀòÖÀëÖÀäÖÀÝÖÀÖÖÀÏÖÀÈÖÀÁÖÀºÖÀ³ÖÀ¬ÖÀ¥ÖÀžÖÀ—ÖÀÖÀ‰ÖÀ‚ÖÀ{ÖÀtÖÀmÖÀfÖÀ_ÖÀXÖÀQÖÀJÖÀCÖÀ<ÖÀ5ÖÀ.ÖÀ'ÖÀ ÖÀÖÀÖÀ ÖÀÖÀýÕÀöÕÀïÕÀèÕÀáÕÀÚÕÀÓÕÀÌÕÀÅÕÀ¾ÕÀ·ÕÀ°ÕÀ©ÕÀ¢ÕÀ›ÕÀ”ÕÀÕÀ†ÕÀÕÀxÕÀqÕÀjÕÀcÕÀ\ÕÀUÕÀNÕÀGÕÀ@ÕÀ9ÕÀ2ÕÀ+ÕÀ$ÕÀÕÀÕÀÕÀÕÀÕÀúÔÀóÔÀìÔÀåÔÀÞÔÀ×ÔÀÐÔÀÉÔÀÂÔÀ»ÔÀ´ÔÀ­ÔÀ¦ÔÀŸÔÀ˜ÔÀ‘ÔÀŠÔÀƒÔÀ|ÔÀuÔÀnÔÀgÔÀ`ÔÀYÔÀRÔÀKÔÀDÔÀ=ÔÀ6ÔÀ/ÔÀ(ÔÀ!ÔÀÔÀÔÀ ÔÀÔÀþÓÀ÷ÓÀðÓÀéÓÀâÓÀÛÓÀÔÓÀÍÓÀÆÓÀ¿ÓÀ¸ÓÀ±ÓÀªÓÀ£ÓÀœÓÀ•ÓÀŽÓÀ‡ÓÀ€ÓÀyÓÀrÓÀkÓÀdÓÀ]ÓÀVÓÀOÓÀHÓÀAÓÀ:ÓÀ3ÓÀ,ÓÀ%ÓÀÓÀÓÀÓÀ ÓÀÓÀûÒÀôÒÀíÒÀæÒÀßÒÀØÒÀÑÒÀÊÒÀÃÒÀ¼ÒÀµÒÀ®ÒÀ§ÒÀ ÒÀ™ÒÀ’ÒÀ‹ÒÀ„ÒÀ}ÒÀvÒÀoÒÀhÒÀaÒÀZÒÀSÒÀLÒÀEÒÀ>ÒÀ7ÒÀ0ÒÀ)ÒÀ"ÒÀÒÀÒÀ ÒÀÒÀÿÑÀøÑÀñÑÀêÑÀãÑÀÜÑÀÕÑÀÎÑÀÇÑÀÀÑÀ¹ÑÀ²ÑÀ«ÑÀ¤ÑÀÑÀ–ÑÀÑÀˆÑÀÑÀzÑÀsÑÀlÑÀeÑÀ^ÑÀWÑÀPÑÀIÑÀBÑÀ;ÑÀ4ÑÀ-ÑÀ&ÑÀÑÀÑÀÑÀ ÑÀÑÀüÐÀõÐÀîÐÀçÐÀàÐÀÙÐÀÒÐÀËÐÀÄÐÀ½ÐÀ¶ÐÀ¯ÐÀ¨ÐÀ¡ÐÀšÐÀ“ÐÀŒÐÀ…ÐÀ~ÐÀwÐÀpÐÀiÐÀbÐÀ[ÐÀTÐÀMÐÀFÐÀ?ÐÀ8ÐÀ1ÐÀ*ÐÀ#ÐÀÐÀÐÀÐÀÐÀÐÀùÏÀòÏÀëÏÀäÏÀÝÏÀÖÏÀÏÏÀÈÏÀÁÏÀºÏÀ³ÏÀ¬ÏÀ¥ÏÀžÏÀ—ÏÀÏÀ‰ÏÀ‚ÏÀ{ÏÀtÏÀmÏÀfÏÀ_ÏÀXÏÀQÏÀJÏÀCÏÀ<ÏÀ5ÏÀ.ÏÀ'ÏÀ ÏÀÏÀÏÀ ÏÀÏÀýÎÀöÎÀïÎÀèÎÀáÎÀÚÎÀÓÎÀÌÎÀÅÎÀ¾ÎÀ·ÎÀ°ÎÀ©ÎÀ¢ÎÀ›ÎÀ”ÎÀÎÀ†ÎÀÎÀxÎÀqÎÀjÎÀcÎÀ\ÎÀUÎÀNÎÀGÎÀ@ÎÀ9ÎÀ2ÎÀ+ÎÀ$ÎÀÎÀÎÀÎÀÎÀÎÀúÍÀóÍÀìÍÀåÍÀÞÍÀ×ÍÀÐÍÀÉÍÀÂÍÀ»ÍÀ´ÍÀ­ÍÀ¦ÍÀŸÍÀ˜ÍÀ‘ÍÀŠÍÀƒÍÀ|ÍÀuÍÀnÍÀgÍÀ`ÍÀYÍÀRÍÀKÍÀDÍÀ=ÍÀ6ÍÀ/ÍÀ(ÍÀ!ÍÀÍÀÍÀ ÍÀÍÀþÌÀ÷ÌÀðÌÀéÌÀâÌÀÛÌÀÔÌÀÍÌÀÆÌÀ¿ÌÀ¸ÌÀ±ÌÀªÌÀ£ÌÀœÌÀ•ÌÀŽÌÀ‡ÌÀ€ÌÀyÌÀrÌÀkÌÀdÌÀ]ÌÀVÌÀOÌÀHÌÀAÌÀ:ÌÀ3ÌÀ,ÌÀ%ÌÀÌÀÌÀÌÀ ÌÀÌÀûËÀôËÀíËÀæËÀßËÀØËÀÑËÀÊËÀÃËÀ¼ËÀµËÀ®ËÀ§ËÀ ËÀ™ËÀ’ËÀ‹ËÀ„ËÀ}ËÀvËÀoËÀhËÀaËÀZËÀSËÀLËÀEËÀ>ËÀ7ËÀ0ËÀ)ËÀ"ËÀËÀËÀ ËÀËÀÿÊÀøÊÀñÊÀêÊÀãÊÀÜÊÀÕÊÀÎÊÀÇÊÀÀÊÀ¹ÊÀ²ÊÀ«ÊÀ¤ÊÀÊÀ–ÊÀÊÀˆÊÀÊÀzÊÀsÊÀlÊÀeÊÀ^ÊÀWÊÀPÊÀIÊÀBÊÀ;ÊÀ4ÊÀ-ÊÀ&ÊÀÊÀÊÀÊÀ ÊÀÊÀüÉÀõÉÀîÉÀçÉÀàÉÀÙÉÀÒÉÀËÉÀÄÉÀ½ÉÀ¶ÉÀ¯ÉÀ¨ÉÀ¡ÉÀšÉÀ“ÉÀŒÉÀ…ÉÀ~ÉÀwÉÀpÉÀiÉÀbÉÀ[ÉÀTÉÀMÉÀFÉÀ?ÉÀ8ÉÀ1ÉÀ*ÉÀ#ÉÀÉÀÉÀÉÀÉÀÉÀùÈÀòÈÀëÈÀäÈÀÝÈÀÖÈÀÏÈÀÈÈÀÁÈÀºÈÀ³ÈÀ¬ÈÀ¥ÈÀžÈÀ—ÈÀÈÀ‰ÈÀ‚ÈÀ{ÈÀtÈÀmÈÀfÈÀ_ÈÀXÈÀQÈÀJÈÀCÈÀ<ÈÀ5ÈÀ.ÈÀ'ÈÀ ÈÀÈÀÈÀ ÈÀÈÀýÇÀöÇÀïÇÀèÇÀáÇÀÚÇÀÓÇÀÌÇÀÅÇÀ¾ÇÀ·ÇÀ°ÇÀ©ÇÀ¢ÇÀ›ÇÀ”ÇÀÇÀ†ÇÀÇÀxÇÀqÇÀjÇÀcÇÀ\ÇÀUÇÀNÇÀGÇÀ@ÇÀ9ÇÀ2ÇÀ+ÇÀ$ÇÀÇÀÇÀÇÀÇÀÇÀúÆÀóÆÀìÆÀåÆÀÞÆÀׯÀÐÆÀÉÆÀÂÆÀ»ÆÀ´ÆÀ­ÆÀ¦ÆÀŸÆÀ˜ÆÀ‘ÆÀŠÆÀƒÆÀ|ÆÀuÆÀnÆÀgÆÀ`ÆÀYÆÀRÆÀKÆÀDÆÀ=ÆÀ6ÆÀ/ÆÀ(ÆÀ!ÆÀÆÀÆÀ ÆÀÆÀþÅÀ÷ÅÀðÅÀéÅÀâÅÀÛÅÀÔÅÀÍÅÀÆÅÀ¿ÅÀ¸ÅÀ±ÅÀªÅÀ£ÅÀœÅÀ•ÅÀŽÅÀ‡ÅÀ€ÅÀyÅÀrÅÀkÅÀdÅÀ]ÅÀVÅÀOÅÀHÅÀAÅÀ:ÅÀ3ÅÀ,ÅÀ%ÅÀÅÀÅÀÅÀ ÅÀÅÀûÄÀôÄÀíÄÀæÄÀßÄÀØÄÀÑÄÀÊÄÀÃÄÀ¼ÄÀµÄÀ®ÄÀ§ÄÀ ÄÀ™ÄÀ’ÄÀ‹ÄÀ„ÄÀ}ÄÀvÄÀoÄÀhÄÀaÄÀZÄÀSÄÀLÄÀEÄÀ>ÄÀ7ÄÀ0ÄÀ)ÄÀ"ÄÀÄÀÄÀ ÄÀÄÀÿÃÀøÃÀñÃÀêÃÀãÃÀÜÃÀÕÃÀÎÃÀÇÃÀÀÃÀ¹ÃÀ²ÃÀ«ÃÀ¤ÃÀÃÀ–ÃÀÃÀˆÃÀÃÀzÃÀsÃÀlÃÀeÃÀ^ÃÀWÃÀPÃÀIÃÀBÃÀ;ÃÀ4ÃÀ-ÃÀ&ÃÀÃÀÃÀÃÀ ÃÀÃÀüÂÀõÂÀîÂÀçÂÀàÂÀÙÂÀÒÂÀËÂÀÄÂÀ½ÂÀ¶ÂÀ¯ÂÀ¨ÂÀ¡ÂÀšÂÀ“ÂÀŒÂÀ…ÂÀ~ÂÀwÂÀpÂÀiÂÀbÂÀ[ÂÀTÂÀMÂÀFÂÀ?ÂÀ8ÂÀ1ÂÀ*ÂÀ#ÂÀÂÀÂÀÂÀÂÀÂÀùÁÀòÁÀëÁÀäÁÀÝÁÀÖÁÀÏÁÀÈÁÀÁÁÀºÁÀ³ÁÀ¬ÁÀ¥ÁÀžÁÀ—ÁÀÁÀ‰ÁÀ‚ÁÀ{ÁÀtÁÀmÁÀfÁÀ_ÁÀXÁÀQÁÀJÁÀCÁÀ<ÁÀ5ÁÀ.ÁÀ'ÁÀ ÁÀÁÀÁÀ ÁÀÁÀýÀÀöÀÀïÀÀèÀÀáÀÀÚÀÀÓÀÀÌÀÀÅÀÀ¾ÀÀ·ÀÀ°ÀÀ©ÀÀ¢ÀÀ›ÀÀ”ÀÀÀÀ†ÀÀÀÀxÀÀqÀÀjÀÀcÀÀ\ÀÀUÀÀNÀÀGÀÀ@ÀÀ9ÀÀ2ÀÀ+ÀÀ$ÀÀÀÀÀÀÀÀÀÀÀÀú¿Àó¿Àì¿Àå¿ÀÞ¿À׿ÀпÀÉ¿À¿À»¿À´¿À­¿À¦¿ÀŸ¿À˜¿À‘¿ÀŠ¿Àƒ¿À|¿Àu¿Àn¿Àg¿À`¿ÀY¿ÀR¿ÀK¿ÀD¿À=¿À6¿À/¿À(¿À!¿À¿À¿À ¿À¿Àþ¾À÷¾Àð¾Àé¾Àâ¾ÀÛ¾ÀÔ¾À;ÀƾÀ¿¾À¸¾À±¾Àª¾À£¾Àœ¾À•¾À޾À‡¾À€¾Ày¾Àr¾Àk¾Àd¾À]¾ÀV¾ÀO¾ÀH¾ÀA¾À:¾À3¾À,¾À%¾À¾À¾À¾À ¾À¾Àû½Àô½Àí½Àæ½Àß½ÀؽÀѽÀʽÀýÀ¼½Àµ½À®½À§½À ½À™½À’½À‹½À„½À}½Àv½Ào½Àh½Àa½ÀZ½ÀS½ÀL½ÀE½À>½À7½À0½À)½À"½À½À½À ½À½Àÿ¼Àø¼Àñ¼Àê¼Àã¼ÀܼÀÕ¼ÀμÀǼÀÀ¼À¹¼À²¼À«¼À¤¼À¼À–¼À¼Àˆ¼À¼Àz¼Às¼Àl¼Àe¼À^¼ÀW¼ÀP¼ÀI¼ÀB¼À;¼À4¼À-¼À&¼À¼À¼À¼À ¼À¼Àü»Àõ»Àî»Àç»Àà»ÀÙ»ÀÒ»ÀË»ÀÄ»À½»À¶»À¯»À¨»À¡»Àš»À“»ÀŒ»À…»À~»Àw»Àp»Ài»Àb»À[»ÀT»ÀM»ÀF»À?»À8»À1»À*»À#»À»À»À»À»À»ÀùºÀòºÀëºÀäºÀݺÀÖºÀϺÀȺÀÁºÀººÀ³ºÀ¬ºÀ¥ºÀžºÀ—ºÀºÀ‰ºÀ‚ºÀ{ºÀtºÀmºÀfºÀ_ºÀXºÀQºÀJºÀCºÀ<ºÀ5ºÀ.ºÀ'ºÀ ºÀºÀºÀ ºÀºÀý¹Àö¹Àï¹Àè¹Àá¹ÀÚ¹ÀÓ¹À̹ÀŹÀ¾¹À·¹À°¹À©¹À¢¹À›¹À”¹À¹À†¹À¹Àx¹Àq¹Àj¹Àc¹À\¹ÀU¹ÀN¹ÀG¹À@¹À9¹À2¹À+¹À$¹À¹À¹À¹À¹À¹Àú¸Àó¸Àì¸Àå¸ÀÞ¸À׸ÀиÀɸÀ¸À»¸À´¸À­¸À¦¸ÀŸ¸À˜¸À‘¸ÀЏÀƒ¸À|¸Àu¸Àn¸Àg¸À`¸ÀY¸ÀR¸ÀK¸ÀD¸À=¸À6¸À/¸À(¸À!¸À¸À¸À ¸À¸Àþ·À÷·Àð·Àé·Àâ·ÀÛ·ÀÔ·ÀÍ·ÀÆ·À¿·À¸·À±·Àª·À£·Àœ·À•·ÀŽ·À‡·À€·Ày·Àr·Àk·Àd·À]·ÀV·ÀO·ÀH·ÀA·À:·À3·À,·À%·À·À·À·À ·À·Àû¶Àô¶Àí¶Àæ¶Àß¶ÀضÀѶÀʶÀöÀ¼¶Àµ¶À®¶À§¶À ¶À™¶À’¶À‹¶À„¶À}¶Àv¶Ào¶Àh¶Àa¶ÀZ¶ÀS¶ÀL¶ÀE¶À>¶À7¶À0¶À)¶À"¶À¶À¶À ¶À¶ÀÿµÀøµÀñµÀêµÀãµÀܵÀÕµÀεÀǵÀÀµÀ¹µÀ²µÀ«µÀ¤µÀµÀ–µÀµÀˆµÀµÀzµÀsµÀlµÀeµÀ^µÀWµÀPµÀIµÀBµÀ;µÀ4µÀ-µÀ&µÀµÀµÀµÀ µÀµÀü´Àõ´Àî´Àç´Àà´ÀÙ´ÀÒ´ÀË´ÀÄ´À½´À¶´À¯´À¨´À¡´Àš´À“´ÀŒ´À…´À~´Àw´Àp´Ài´Àb´À[´ÀT´ÀM´ÀF´À?´À8´À1´À*´À#´À´À´À´À´À´Àù³Àò³Àë³Àä³ÀݳÀÖ³ÀϳÀȳÀÁ³Àº³À³³À¬³À¥³Àž³À—³À³À‰³À‚³À{³Àt³Àm³Àf³À_³ÀX³ÀQ³ÀJ³ÀC³À<³À5³À.³À'³À ³À³À³À ³À³Àý²Àö²Àï²Àè²Àá²ÀÚ²ÀÓ²À̲ÀŲÀ¾²À·²À°²À©²À¢²À›²À”²À²À†²À²Àx²Àq²Àj²Àc²À\²ÀU²ÀN²ÀG²À@²À9²À2²À+²À$²À²À²À²À²À²Àú±Àó±Àì±Àå±ÀÞ±À×±ÀбÀɱÀ±À»±À´±À­±À¦±ÀŸ±À˜±À‘±ÀбÀƒ±À|±Àu±Àn±Àg±À`±ÀY±ÀR±ÀK±ÀD±À=±À6±À/±À(±À!±À±À±À ±À±Àþ°À÷°Àð°Àé°Àâ°ÀÛ°ÀÔ°ÀͰÀưÀ¿°À¸°À±°Àª°À£°Àœ°À•°ÀްÀ‡°À€°Ày°Àr°Àk°Àd°À]°ÀV°ÀO°ÀH°ÀA°À:°À3°À,°À%°À°À°À°À °À°Àû¯Àô¯Àí¯Àæ¯À߯ÀدÀѯÀʯÀïÀ¼¯Àµ¯À®¯À§¯À ¯À™¯À’¯À‹¯À„¯À}¯Àv¯Ào¯Àh¯Àa¯ÀZ¯ÀS¯ÀL¯ÀE¯À>¯À7¯À0¯À)¯À"¯À¯À¯À ¯À¯Àÿ®Àø®Àñ®Àê®Àã®ÀÜ®ÀÕ®ÀήÀÇ®ÀÀ®À¹®À²®À«®À¤®À®À–®À®Àˆ®À®Àz®Às®Àl®Àe®À^®ÀW®ÀP®ÀI®ÀB®À;®À4®À-®À&®À®À®À®À ®À®Àü­Àõ­Àî­Àç­Àà­ÀÙ­ÀÒ­ÀË­ÀÄ­À½­À¶­À¯­À¨­À¡­Àš­À“­ÀŒ­À…­À~­Àw­Àp­Ài­Àb­À[­ÀT­ÀM­ÀF­À?­À8­À1­À*­À#­À­À­À­À­À­Àù¬Àò¬Àë¬Àä¬ÀݬÀÖ¬ÀϬÀȬÀÁ¬Àº¬À³¬À¬¬À¥¬Àž¬À—¬À¬À‰¬À‚¬À{¬Àt¬Àm¬Àf¬À_¬ÀX¬ÀQ¬ÀJ¬ÀC¬À<¬À5¬À.¬À'¬À ¬À¬À¬À ¬À¬Àý«Àö«Àï«Àè«Àá«ÀÚ«ÀÓ«ÀÌ«ÀÅ«À¾«À·«À°«À©«À¢«À›«À”«À«À†«À«Àx«Àq«Àj«Àc«À\«ÀU«ÀN«ÀG«À@«À9«À2«À+«À$«À«À«À«À«À«ÀúªÀóªÀìªÀåªÀÞªÀתÀЪÀɪÀªÀ»ªÀ´ªÀ­ªÀ¦ªÀŸªÀ˜ªÀ‘ªÀŠªÀƒªÀ|ªÀuªÀnªÀgªÀ`ªÀYªÀRªÀKªÀDªÀ=ªÀ6ªÀ/ªÀ(ªÀ!ªÀªÀªÀ ªÀªÀþ©À÷©Àð©Àé©Àâ©ÀÛ©ÀÔ©ÀÍ©ÀÆ©À¿©À¸©À±©Àª©À£©Àœ©À•©ÀŽ©À‡©À€©Ày©Àr©Àk©Àd©À]©ÀV©ÀO©ÀH©ÀA©À:©À3©À,©À%©À©À©À©À ©À©Àû¨Àô¨Àí¨Àæ¨ÀߨÀبÀѨÀʨÀèÀ¼¨Àµ¨À®¨À§¨À ¨À™¨À’¨À‹¨À„¨À}¨Àv¨Ào¨Àh¨Àa¨ÀZ¨ÀS¨ÀL¨ÀE¨À>¨À7¨À0¨À)¨À"¨À¨À¨À ¨À¨Àÿ§Àø§Àñ§Àê§Àã§ÀܧÀÕ§ÀΧÀǧÀÀ§À¹§À²§À«§À¤§À§À–§À§Àˆ§À§Àz§Às§Àl§Àe§À^§ÀW§ÀP§ÀI§ÀB§À;§À4§À-§À&§À§À§À§À §À§Àü¦Àõ¦Àî¦Àç¦Àà¦ÀÙ¦ÀÒ¦À˦ÀĦÀ½¦À¶¦À¯¦À¨¦À¡¦Àš¦À“¦ÀŒ¦À…¦À~¦Àw¦Àp¦Ài¦Àb¦À[¦ÀT¦ÀM¦ÀF¦À?¦À8¦À1¦À*¦À#¦À¦À¦À¦À¦À¦Àù¥Àò¥Àë¥Àä¥ÀÝ¥ÀÖ¥ÀÏ¥ÀÈ¥ÀÁ¥Àº¥À³¥À¬¥À¥¥Àž¥À—¥À¥À‰¥À‚¥À{¥Àt¥Àm¥Àf¥À_¥ÀX¥ÀQ¥ÀJ¥ÀC¥À<¥À5¥À.¥À'¥À ¥À¥À¥À ¥À¥Àý¤Àö¤Àï¤Àè¤Àá¤ÀÚ¤ÀÓ¤À̤ÀŤÀ¾¤À·¤À°¤À©¤À¢¤À›¤À”¤À¤À†¤À¤Àx¤Àq¤Àj¤Àc¤À\¤ÀU¤ÀN¤ÀG¤À@¤À9¤À2¤À+¤À$¤À¤À¤À¤À¤À¤Àú£Àó£Àì£Àå£ÀÞ£À×£ÀУÀÉ£À£À»£À´£À­£À¦£ÀŸ£À˜£À‘£ÀŠ£Àƒ£À|£Àu£Àn£Àg£À`£ÀY£ÀR£ÀK£ÀD£À=£À6£À/£À(£À!£À£À£À £À£Àþ¢À÷¢Àð¢Àé¢Àâ¢ÀÛ¢ÀÔ¢ÀÍ¢ÀÆ¢À¿¢À¸¢À±¢Àª¢À£¢Àœ¢À•¢ÀŽ¢À‡¢À€¢Ày¢Àr¢Àk¢Àd¢À]¢ÀV¢ÀO¢ÀH¢ÀA¢À:¢À3¢À,¢À%¢À¢À¢À¢À ¢À¢Àû¡Àô¡Àí¡Àæ¡Àß¡ÀØ¡ÀÑ¡ÀÊ¡ÀáÀ¼¡Àµ¡À®¡À§¡À ¡À™¡À’¡À‹¡À„¡À}¡Àv¡Ào¡Àh¡Àa¡ÀZ¡ÀS¡ÀL¡ÀE¡À>¡À7¡À0¡À)¡À"¡À¡À¡À ¡À¡Àÿ Àø Àñ Àê Àã ÀÜ ÀÕ ÀΠÀÇ ÀÀ À¹ À² À« À¤ À À– À Àˆ À Àz Às Àl Àe À^ ÀW ÀP ÀI ÀB À; À4 À- À& À À À À  À ÀüŸÀõŸÀîŸÀçŸÀàŸÀÙŸÀÒŸÀËŸÀÄŸÀ½ŸÀ¶ŸÀ¯ŸÀ¨ŸÀ¡ŸÀšŸÀ“ŸÀŒŸÀ…ŸÀ~ŸÀwŸÀpŸÀiŸÀbŸÀ[ŸÀTŸÀMŸÀFŸÀ?ŸÀ8ŸÀ1ŸÀ*ŸÀ#ŸÀŸÀŸÀŸÀŸÀŸÀùžÀòžÀëžÀäžÀÝžÀÖžÀÏžÀÈžÀÁžÀºžÀ³žÀ¬žÀ¥žÀžžÀ—žÀžÀ‰žÀ‚žÀ{žÀtžÀmžÀfžÀ_žÀXžÀQžÀJžÀCžÀ<žÀ5žÀ.žÀ'žÀ žÀžÀžÀ žÀžÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúœÀóœÀìœÀåœÀÞœÀלÀМÀÉœÀœÀ»œÀ´œÀ­œÀ¦œÀŸœÀ˜œÀ‘œÀŠœÀƒœÀ|œÀuœÀnœÀgœÀ`œÀYœÀRœÀKœÀDœÀ=œÀ6œÀ/œÀ(œÀ!œÀœÀœÀ œÀœÀþ›À÷›Àð›Àé›Àâ›ÀÛ›ÀÔ›ÀÍ›ÀÆ›À¿›À¸›À±›Àª›À£›Àœ›À•›ÀŽ›À‡›À€›Ày›Àr›Àk›Àd›À]›ÀV›ÀO›ÀH›ÀA›À:›À3›À,›À%›À›À›À›À ›À›ÀûšÀôšÀíšÀæšÀßšÀØšÀÑšÀÊšÀÚÀ¼šÀµšÀ®šÀ§šÀ šÀ™šÀ’šÀ‹šÀ„šÀ}šÀvšÀošÀhšÀašÀZšÀSšÀLšÀEšÀ>šÀ7šÀ0šÀ)šÀ"šÀšÀšÀ šÀšÀÿ™Àø™Àñ™Àê™Àã™ÀÜ™ÀÕ™ÀΙÀÇ™ÀÀ™À¹™À²™À«™À¤™À™À–™À™Àˆ™À™Àz™Às™Àl™Àe™À^™ÀW™ÀP™ÀI™ÀB™À;™À4™À-™À&™À™À™À™À ™À™Àü˜Àõ˜Àî˜Àç˜Àà˜ÀÙ˜ÀÒ˜À˘ÀĘÀ½˜À¶˜À¯˜À¨˜À¡˜Àš˜À“˜ÀŒ˜À…˜À~˜Àw˜Àp˜Ài˜Àb˜À[˜ÀT˜ÀM˜ÀF˜À?˜À8˜À1˜À*˜À#˜À˜À˜À˜À˜À˜Àù—Àò—Àë—Àä—ÀÝ—ÀÖ—ÀÏ—ÀÈ—ÀÁ—Àº—À³—À¬—À¥—Àž—À——À—À‰—À‚—À{—Àt—Àm—Àf—À_—ÀX—ÀQ—ÀJ—ÀC—À<—À5—À.—À'—À —À—À—À —À—Àý–Àö–Àï–Àè–Àá–ÀÚ–ÀÓ–ÀÌ–ÀÅ–À¾–À·–À°–À©–À¢–À›–À”–À–À†–À–Àx–Àq–Àj–Àc–À\–ÀU–ÀN–ÀG–À@–À9–À2–À+–À$–À–À–À–À–À–Àú•Àó•Àì•Àå•ÀÞ•ÀוÀЕÀÉ•À•À»•À´•À­•À¦•ÀŸ•À˜•À‘•ÀŠ•Àƒ•À|•Àu•Àn•Àg•À`•ÀY•ÀR•ÀK•ÀD•À=•À6•À/•À(•À!•À•À•À •À•Àþ”À÷”Àð”Àé”Àâ”ÀÛ”ÀÔ”ÀÍ”ÀÆ”À¿”À¸”À±”Àª”À£”Àœ”À•”ÀŽ”À‡”À€”Ày”Àr”Àk”Àd”À]”ÀV”ÀO”ÀH”ÀA”À:”À3”À,”À%”À”À”À”À ”À”Àû“Àô“Àí“Àæ“Àß“ÀØ“ÀÑ“ÀÊ“ÀÓÀ¼“Àµ“À®“À§“À “À™“À’“À‹“À„“À}“Àv“Ào“Àh“Àa“ÀZ“ÀS“ÀL“ÀE“À>“À7“À0“À)“À"“À“À“À “À“Àÿ’Àø’Àñ’Àê’Àã’ÀÜ’ÀÕ’ÀÎ’ÀÇ’ÀÀ’À¹’À²’À«’À¤’À’À–’À’Àˆ’À’Àz’Às’Àl’Àe’À^’ÀW’ÀP’ÀI’ÀB’À;’À4’À-’À&’À’À’À’À ’À’Àü‘Àõ‘Àî‘Àç‘Àà‘ÀÙ‘ÀÒ‘ÀË‘ÀÄ‘À½‘À¶‘À¯‘À¨‘À¡‘Àš‘À“‘ÀŒ‘À…‘À~‘Àw‘Àp‘Ài‘Àb‘À[‘ÀT‘ÀM‘ÀF‘À?‘À8‘À1‘À*‘À#‘À‘À‘À‘À‘À‘ÀùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúŽÀóŽÀìŽÀåŽÀÞŽÀ׎ÀÐŽÀÉŽÀÂŽÀ»ŽÀ´ŽÀ­ŽÀ¦ŽÀŸŽÀ˜ŽÀ‘ŽÀŠŽÀƒŽÀ|ŽÀuŽÀnŽÀgŽÀ`ŽÀYŽÀRŽÀKŽÀDŽÀ=ŽÀ6ŽÀ/ŽÀ(ŽÀ!ŽÀŽÀŽÀ ŽÀŽÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûŒÀôŒÀíŒÀæŒÀߌÀØŒÀÑŒÀÊŒÀÃŒÀ¼ŒÀµŒÀ®ŒÀ§ŒÀ ŒÀ™ŒÀ’ŒÀ‹ŒÀ„ŒÀ}ŒÀvŒÀoŒÀhŒÀaŒÀZŒÀSŒÀLŒÀEŒÀ>ŒÀ7ŒÀ0ŒÀ)ŒÀ"ŒÀŒÀŒÀ ŒÀŒÀÿ‹Àø‹Àñ‹Àê‹Àã‹ÀÜ‹ÀÕ‹À΋ÀÇ‹ÀÀ‹À¹‹À²‹À«‹À¤‹À‹À–‹À‹Àˆ‹À‹Àz‹Às‹Àl‹Àe‹À^‹ÀW‹ÀP‹ÀI‹ÀB‹À;‹À4‹À-‹À&‹À‹À‹À‹À ‹À‹ÀüŠÀõŠÀîŠÀçŠÀàŠÀÙŠÀÒŠÀËŠÀÄŠÀ½ŠÀ¶ŠÀ¯ŠÀ¨ŠÀ¡ŠÀšŠÀ“ŠÀŒŠÀ…ŠÀ~ŠÀwŠÀpŠÀiŠÀbŠÀ[ŠÀTŠÀMŠÀFŠÀ?ŠÀ8ŠÀ1ŠÀ*ŠÀ#ŠÀŠÀŠÀŠÀŠÀŠÀù‰Àò‰Àë‰Àä‰À݉ÀÖ‰ÀωÀȉÀÁ‰Àº‰À³‰À¬‰À¥‰Àž‰À—‰À‰À‰‰À‚‰À{‰Àt‰Àm‰Àf‰À_‰ÀX‰ÀQ‰ÀJ‰ÀC‰À<‰À5‰À.‰À'‰À ‰À‰À‰À ‰À‰ÀýˆÀöˆÀïˆÀèˆÀáˆÀÚˆÀÓˆÀ̈ÀňÀ¾ˆÀ·ˆÀ°ˆÀ©ˆÀ¢ˆÀ›ˆÀ”ˆÀˆÀ†ˆÀˆÀxˆÀqˆÀjˆÀcˆÀ\ˆÀUˆÀNˆÀGˆÀ@ˆÀ9ˆÀ2ˆÀ+ˆÀ$ˆÀˆÀˆÀˆÀˆÀˆÀú‡Àó‡Àì‡Àå‡ÀÞ‡ÀׇÀЇÀɇÀ‡À»‡À´‡À­‡À¦‡ÀŸ‡À˜‡À‘‡ÀЇÀƒ‡À|‡Àu‡Àn‡Àg‡À`‡ÀY‡ÀR‡ÀK‡ÀD‡À=‡À6‡À/‡À(‡À!‡À‡À‡À ‡À‡Àþ†À÷†Àð†Àé†Àâ†ÀÛ†ÀÔ†À͆ÀƆÀ¿†À¸†À±†Àª†À£†Àœ†À•†ÀކÀ‡†À€†Ày†Àr†Àk†Àd†À]†ÀV†ÀO†ÀH†ÀA†À:†À3†À,†À%†À†À†À†À †À†Àû…Àô…Àí…Àæ…Àß…ÀØ…ÀÑ…ÀÊ…ÀÃ…À¼…Àµ…À®…À§…À …À™…À’…À‹…À„…À}…Àv…Ào…Àh…Àa…ÀZ…ÀS…ÀL…ÀE…À>…À7…À0…À)…À"…À…À…À …À…Àÿ„Àø„Àñ„Àê„Àã„ÀÜ„ÀÕ„À΄ÀÇ„ÀÀ„À¹„À²„À«„À¤„À„À–„À„Àˆ„À„Àz„Às„Àl„Àe„À^„ÀW„ÀP„ÀI„ÀB„À;„À4„À-„À&„À„À„À„À „À„ÀüƒÀõƒÀîƒÀçƒÀàƒÀÙƒÀÒƒÀ˃ÀăÀ½ƒÀ¶ƒÀ¯ƒÀ¨ƒÀ¡ƒÀšƒÀ“ƒÀŒƒÀ…ƒÀ~ƒÀwƒÀpƒÀiƒÀbƒÀ[ƒÀTƒÀMƒÀFƒÀ?ƒÀ8ƒÀ1ƒÀ*ƒÀ#ƒÀƒÀƒÀƒÀƒÀƒÀù‚Àò‚Àë‚Àä‚ÀÝ‚ÀÖ‚ÀÏ‚ÀÈ‚ÀÁ‚Àº‚À³‚À¬‚À¥‚Àž‚À—‚À‚À‰‚À‚‚À{‚Àt‚Àm‚Àf‚À_‚ÀX‚ÀQ‚ÀJ‚ÀC‚À<‚À5‚À.‚À'‚À ‚À‚À‚À ‚À‚ÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú€Àó€Àì€Àå€ÀÞ€À×€ÀЀÀÉ€À€À»€À´€À­€À¦€ÀŸ€À˜€À‘€ÀŠ€Àƒ€À|€Àu€Àn€Àg€À`€ÀY€ÀR€ÀK€ÀD€À=€À6€À/€À(€À!€À€À€À €À€ÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀû~Àô~Àí~Àæ~Àß~ÀØ~ÀÑ~ÀÊ~ÀÃ~À¼~Àµ~À®~À§~À ~À™~À’~À‹~À„~À}~Àv~Ào~Àh~Àa~ÀZ~ÀS~ÀL~ÀE~À>~À7~À0~À)~À"~À~À~À ~À~Àÿ}Àø}Àñ}Àê}Àã}ÀÜ}ÀÕ}ÀÎ}ÀÇ}ÀÀ}À¹}À²}À«}À¤}À}À–}À}Àˆ}À}Àz}Às}Àl}Àe}À^}ÀW}ÀP}ÀI}ÀB}À;}À4}À-}À&}À}À}À}À }À}Àü|Àõ|Àî|Àç|Àà|ÀÙ|ÀÒ|ÀË|ÀÄ|À½|À¶|À¯|À¨|À¡|Àš|À“|ÀŒ|À…|À~|Àw|Àp|Ài|Àb|À[|ÀT|ÀM|ÀF|À?|À8|À1|À*|À#|À|À|À|À|À|Àù{Àò{Àë{Àä{ÀÝ{ÀÖ{ÀÏ{ÀÈ{ÀÁ{Àº{À³{À¬{À¥{Àž{À—{À{À‰{À‚{À{{Àt{Àm{Àf{À_{ÀX{ÀQ{ÀJ{ÀC{À<{À5{À.{À'{À {À{À{À {À{ÀýzÀözÀïzÀèzÀázÀÚzÀÓzÀÌzÀÅzÀ¾zÀ·zÀ°zÀ©zÀ¢zÀ›zÀ”zÀzÀ†zÀzÀxzÀqzÀjzÀczÀ\zÀUzÀNzÀGzÀ@zÀ9zÀ2zÀ+zÀ$zÀzÀzÀzÀzÀzÀúyÀóyÀìyÀåyÀÞyÀ×yÀÐyÀÉyÀÂyÀ»yÀ´yÀ­yÀ¦yÀŸyÀ˜yÀ‘yÀŠyÀƒyÀ|yÀuyÀnyÀgyÀ`yÀYyÀRyÀKyÀDyÀ=yÀ6yÀ/yÀ(yÀ!yÀyÀyÀ yÀyÀþxÀ÷xÀðxÀéxÀâxÀÛxÀÔxÀÍxÀÆxÀ¿xÀ¸xÀ±xÀªxÀ£xÀœxÀ•xÀŽxÀ‡xÀ€xÀyxÀrxÀkxÀdxÀ]xÀVxÀOxÀHxÀAxÀ:xÀ3xÀ,xÀ%xÀxÀxÀxÀ xÀxÀûwÀôwÀíwÀæwÀßwÀØwÀÑwÀÊwÀÃwÀ¼wÀµwÀ®wÀ§wÀ wÀ™wÀ’wÀ‹wÀ„wÀ}wÀvwÀowÀhwÀawÀZwÀSwÀLwÀEwÀ>wÀ7wÀ0wÀ)wÀ"wÀwÀwÀ wÀwÀÿvÀøvÀñvÀêvÀãvÀÜvÀÕvÀÎvÀÇvÀÀvÀ¹vÀ²vÀ«vÀ¤vÀvÀ–vÀvÀˆvÀvÀzvÀsvÀlvÀevÀ^vÀWvÀPvÀIvÀBvÀ;vÀ4vÀ-vÀ&vÀvÀvÀvÀ vÀvÀüuÀõuÀîuÀçuÀàuÀÙuÀÒuÀËuÀÄuÀ½uÀ¶uÀ¯uÀ¨uÀ¡uÀšuÀ“uÀŒuÀ…uÀ~uÀwuÀpuÀiuÀbuÀ[uÀTuÀMuÀFuÀ?uÀ8uÀ1uÀ*uÀ#uÀuÀuÀuÀuÀuÀùtÀòtÀëtÀätÀÝtÀÖtÀÏtÀÈtÀÁtÀºtÀ³tÀ¬tÀ¥tÀžtÀ—tÀtÀ‰tÀ‚tÀ{tÀttÀmtÀftÀ_tÀXtÀQtÀJtÀCtÀpÀ7pÀ0pÀ)pÀ"pÀpÀpÀ pÀpÀÿoÀøoÀñoÀêoÀãoÀÜoÀÕoÀÎoÀÇoÀÀoÀ¹oÀ²oÀ«oÀ¤oÀoÀ–oÀoÀˆoÀoÀzoÀsoÀloÀeoÀ^oÀWoÀPoÀIoÀBoÀ;oÀ4oÀ-oÀ&oÀoÀoÀoÀ oÀoÀünÀõnÀînÀçnÀànÀÙnÀÒnÀËnÀÄnÀ½nÀ¶nÀ¯nÀ¨nÀ¡nÀšnÀ“nÀŒnÀ…nÀ~nÀwnÀpnÀinÀbnÀ[nÀTnÀMnÀFnÀ?nÀ8nÀ1nÀ*nÀ#nÀnÀnÀnÀnÀnÀùmÀòmÀëmÀämÀÝmÀÖmÀÏmÀÈmÀÁmÀºmÀ³mÀ¬mÀ¥mÀžmÀ—mÀmÀ‰mÀ‚mÀ{mÀtmÀmmÀfmÀ_mÀXmÀQmÀJmÀCmÀiÀ7iÀ0iÀ)iÀ"iÀiÀiÀ iÀiÀÿhÀøhÀñhÀêhÀãhÀÜhÀÕhÀÎhÀÇhÀÀhÀ¹hÀ²hÀ«hÀ¤hÀhÀ–hÀhÀˆhÀhÀzhÀshÀlhÀehÀ^hÀWhÀPhÀIhÀBhÀ;hÀ4hÀ-hÀ&hÀhÀhÀhÀ hÀhÀügÀõgÀîgÀçgÀàgÀÙgÀÒgÀËgÀÄgÀ½gÀ¶gÀ¯gÀ¨gÀ¡gÀšgÀ“gÀŒgÀ…gÀ~gÀwgÀpgÀigÀbgÀ[gÀTgÀMgÀFgÀ?gÀ8gÀ1gÀ*gÀ#gÀgÀgÀgÀgÀgÀùfÀòfÀëfÀäfÀÝfÀÖfÀÏfÀÈfÀÁfÀºfÀ³fÀ¬fÀ¥fÀžfÀ—fÀfÀ‰fÀ‚fÀ{fÀtfÀmfÀffÀ_fÀXfÀQfÀJfÀCfÀbÀ7bÀ0bÀ)bÀ"bÀbÀbÀ bÀbÀÿaÀøaÀñaÀêaÀãaÀÜaÀÕaÀÎaÀÇaÀÀaÀ¹aÀ²aÀ«aÀ¤aÀaÀ–aÀaÀˆaÀaÀzaÀsaÀlaÀeaÀ^aÀWaÀPaÀIaÀBaÀ;aÀ4aÀ-aÀ&aÀaÀaÀaÀ aÀaÀü`Àõ`Àî`Àç`Àà`ÀÙ`ÀÒ`ÀË`ÀÄ`À½`À¶`À¯`À¨`À¡`Àš`À“`ÀŒ`À…`À~`Àw`Àp`Ài`Àb`À[`ÀT`ÀM`ÀF`À?`À8`À1`À*`À#`À`À`À`À`À`Àù_Àò_Àë_Àä_ÀÝ_ÀÖ_ÀÏ_ÀÈ_ÀÁ_Àº_À³_À¬_À¥_Àž_À—_À_À‰_À‚_À{_Àt_Àm_Àf_À__ÀX_ÀQ_ÀJ_ÀC_À<_À5_À._À'_À _À_À_À _À_Àý^Àö^Àï^Àè^Àá^ÀÚ^ÀÓ^ÀÌ^ÀÅ^À¾^À·^À°^À©^À¢^À›^À”^À^À†^À^Àx^Àq^Àj^Àc^À\^ÀU^ÀN^ÀG^À@^À9^À2^À+^À$^À^À^À^À^À^Àú]Àó]Àì]Àå]ÀÞ]À×]ÀÐ]ÀÉ]ÀÂ]À»]À´]À­]À¦]ÀŸ]À˜]À‘]ÀŠ]Àƒ]À|]Àu]Àn]Àg]À`]ÀY]ÀR]ÀK]ÀD]À=]À6]À/]À(]À!]À]À]À ]À]Àþ\À÷\Àð\Àé\Àâ\ÀÛ\ÀÔ\ÀÍ\ÀÆ\À¿\À¸\À±\Àª\À£\Àœ\À•\ÀŽ\À‡\À€\Ày\Àr\Àk\Àd\À]\ÀV\ÀO\ÀH\ÀA\À:\À3\À,\À%\À\À\À\À \À\Àû[Àô[Àí[Àæ[Àß[ÀØ[ÀÑ[ÀÊ[ÀÃ[À¼[Àµ[À®[À§[À [À™[À’[À‹[À„[À}[Àv[Ào[Àh[Àa[ÀZ[ÀS[ÀL[ÀE[À>[À7[À0[À)[À"[À[À[À [À[ÀÿZÀøZÀñZÀêZÀãZÀÜZÀÕZÀÎZÀÇZÀÀZÀ¹ZÀ²ZÀ«ZÀ¤ZÀZÀ–ZÀZÀˆZÀZÀzZÀsZÀlZÀeZÀ^ZÀWZÀPZÀIZÀBZÀ;ZÀ4ZÀ-ZÀ&ZÀZÀZÀZÀ ZÀZÀüYÀõYÀîYÀçYÀàYÀÙYÀÒYÀËYÀÄYÀ½YÀ¶YÀ¯YÀ¨YÀ¡YÀšYÀ“YÀŒYÀ…YÀ~YÀwYÀpYÀiYÀbYÀ[YÀTYÀMYÀFYÀ?YÀ8YÀ1YÀ*YÀ#YÀYÀYÀYÀYÀYÀùXÀòXÀëXÀäXÀÝXÀÖXÀÏXÀÈXÀÁXÀºXÀ³XÀ¬XÀ¥XÀžXÀ—XÀXÀ‰XÀ‚XÀ{XÀtXÀmXÀfXÀ_XÀXXÀQXÀJXÀCXÀTÀ7TÀ0TÀ)TÀ"TÀTÀTÀ TÀTÀÿSÀøSÀñSÀêSÀãSÀÜSÀÕSÀÎSÀÇSÀÀSÀ¹SÀ²SÀ«SÀ¤SÀSÀ–SÀSÀˆSÀSÀzSÀsSÀlSÀeSÀ^SÀWSÀPSÀISÀBSÀ;SÀ4SÀ-SÀ&SÀSÀSÀSÀ SÀSÀüRÀõRÀîRÀçRÀàRÀÙRÀÒRÀËRÀÄRÀ½RÀ¶RÀ¯RÀ¨RÀ¡RÀšRÀ“RÀŒRÀ…RÀ~RÀwRÀpRÀiRÀbRÀ[RÀTRÀMRÀFRÀ?RÀ8RÀ1RÀ*RÀ#RÀRÀRÀRÀRÀRÀùQÀòQÀëQÀäQÀÝQÀÖQÀÏQÀÈQÀÁQÀºQÀ³QÀ¬QÀ¥QÀžQÀ—QÀQÀ‰QÀ‚QÀ{QÀtQÀmQÀfQÀ_QÀXQÀQQÀJQÀCQÀMÀ7MÀ0MÀ)MÀ"MÀMÀMÀ MÀMÀÿLÀøLÀñLÀêLÀãLÀÜLÀÕLÀÎLÀÇLÀÀLÀ¹LÀ²LÀ«LÀ¤LÀLÀ–LÀLÀˆLÀLÀzLÀsLÀlLÀeLÀ^LÀWLÀPLÀILÀBLÀ;LÀ4LÀ-LÀ&LÀLÀLÀLÀ LÀLÀüKÀõKÀîKÀçKÀàKÀÙKÀÒKÀËKÀÄKÀ½KÀ¶KÀ¯KÀ¨KÀ¡KÀšKÀ“KÀŒKÀ…KÀ~KÀwKÀpKÀiKÀbKÀ[KÀTKÀMKÀFKÀ?KÀ8KÀ1KÀ*KÀ#KÀKÀKÀKÀKÀKÀùJÀòJÀëJÀäJÀÝJÀÖJÀÏJÀÈJÀÁJÀºJÀ³JÀ¬JÀ¥JÀžJÀ—JÀJÀ‰JÀ‚JÀ{JÀtJÀmJÀfJÀ_JÀXJÀQJÀJJÀCJÀFÀ7FÀ0FÀ)FÀ"FÀFÀFÀ FÀFÀÿEÀøEÀñEÀêEÀãEÀÜEÀÕEÀÎEÀÇEÀÀEÀ¹EÀ²EÀ«EÀ¤EÀEÀ–EÀEÀˆEÀEÀzEÀsEÀlEÀeEÀ^EÀWEÀPEÀIEÀBEÀ;EÀ4EÀ-EÀ&EÀEÀEÀEÀ EÀEÀüDÀõDÀîDÀçDÀàDÀÙDÀÒDÀËDÀÄDÀ½DÀ¶DÀ¯DÀ¨DÀ¡DÀšDÀ“DÀŒDÀ…DÀ~DÀwDÀpDÀiDÀbDÀ[DÀTDÀMDÀFDÀ?DÀ8DÀ1DÀ*DÀ#DÀDÀDÀDÀDÀDÀùCÀòCÀëCÀäCÀÝCÀÖCÀÏCÀÈCÀÁCÀºCÀ³CÀ¬CÀ¥CÀžCÀ—CÀCÀ‰CÀ‚CÀ{CÀtCÀmCÀfCÀ_CÀXCÀQCÀJCÀCCÀ?À7?À0?À)?À"?À?À?À ?À?Àÿ>Àø>Àñ>Àê>Àã>ÀÜ>ÀÕ>ÀÎ>ÀÇ>ÀÀ>À¹>À²>À«>À¤>À>À–>À>Àˆ>À>Àz>Às>Àl>Àe>À^>ÀW>ÀP>ÀI>ÀB>À;>À4>À->À&>À>À>À>À >À>Àü=Àõ=Àî=Àç=Àà=ÀÙ=ÀÒ=ÀË=ÀÄ=À½=À¶=À¯=À¨=À¡=Àš=À“=ÀŒ=À…=À~=Àw=Àp=Ài=Àb=À[=ÀT=ÀM=ÀF=À?=À8=À1=À*=À#=À=À=À=À=À=Àù<Àò<Àë<Àä<ÀÝ<ÀÖ<ÀÏ<ÀÈ<ÀÁ<Àº<À³<À¬<À¥<Àž<À—<À<À‰<À‚<À{<Àt<Àm<Àf<À_<ÀX<ÀQ<ÀJ<ÀC<À<<À5<À.<À'<À <À<À<À <À<Àý;Àö;Àï;Àè;Àá;ÀÚ;ÀÓ;ÀÌ;ÀÅ;À¾;À·;À°;À©;À¢;À›;À”;À;À†;À;Àx;Àq;Àj;Àc;À\;ÀU;ÀN;ÀG;À@;À9;À2;À+;À$;À;À;À;À;À;Àú:Àó:Àì:Àå:ÀÞ:À×:ÀÐ:ÀÉ:ÀÂ:À»:À´:À­:À¦:ÀŸ:À˜:À‘:ÀŠ:Àƒ:À|:Àu:Àn:Àg:À`:ÀY:ÀR:ÀK:ÀD:À=:À6:À/:À(:À!:À:À:À :À:Àþ9À÷9Àð9Àé9Àâ9ÀÛ9ÀÔ9ÀÍ9ÀÆ9À¿9À¸9À±9Àª9À£9Àœ9À•9ÀŽ9À‡9À€9Ày9Àr9Àk9Àd9À]9ÀV9ÀO9ÀH9ÀA9À:9À39À,9À%9À9À9À9À 9À9Àû8Àô8Àí8Àæ8Àß8ÀØ8ÀÑ8ÀÊ8ÀÃ8À¼8Àµ8À®8À§8À 8À™8À’8À‹8À„8À}8Àv8Ào8Àh8Àa8ÀZ8ÀS8ÀL8ÀE8À>8À78À08À)8À"8À8À8À 8À8Àÿ7Àø7Àñ7Àê7Àã7ÀÜ7ÀÕ7ÀÎ7ÀÇ7ÀÀ7À¹7À²7À«7À¤7À7À–7À7Àˆ7À7Àz7Às7Àl7Àe7À^7ÀW7ÀP7ÀI7ÀB7À;7À47À-7À&7À7À7À7À 7À7Àü6Àõ6Àî6Àç6Àà6ÀÙ6ÀÒ6ÀË6ÀÄ6À½6À¶6À¯6À¨6À¡6Àš6À“6ÀŒ6À…6À~6Àw6Àp6Ài6Àb6À[6ÀT6ÀM6ÀF6À?6À86À16À*6À#6À6À6À6À6À6Àù5Àò5Àë5Àä5ÀÝ5ÀÖ5ÀÏ5ÀÈ5ÀÁ5Àº5À³5À¬5À¥5Àž5À—5À5À‰5À‚5À{5Àt5Àm5Àf5À_5ÀX5ÀQ5ÀJ5ÀC5À<5À55À.5À'5À 5À5À5À 5À5Àý4Àö4Àï4Àè4Àá4ÀÚ4ÀÓ4ÀÌ4ÀÅ4À¾4À·4À°4À©4À¢4À›4À”4À4À†4À4Àx4Àq4Àj4Àc4À\4ÀU4ÀN4ÀG4À@4À94À24À+4À$4À4À4À4À4À4Àú3Àó3Àì3Àå3ÀÞ3À×3ÀÐ3ÀÉ3ÀÂ3À»3À´3À­3À¦3ÀŸ3À˜3À‘3ÀŠ3Àƒ3À|3Àu3Àn3Àg3À`3ÀY3ÀR3ÀK3ÀD3À=3À63À/3À(3À!3À3À3À 3À3Àþ2À÷2Àð2Àé2Àâ2ÀÛ2ÀÔ2ÀÍ2ÀÆ2À¿2À¸2À±2Àª2À£2Àœ2À•2ÀŽ2À‡2À€2Ày2Àr2Àk2Àd2À]2ÀV2ÀO2ÀH2ÀA2À:2À32À,2À%2À2À2À2À 2À2Àû1Àô1Àí1Àæ1Àß1ÀØ1ÀÑ1ÀÊ1ÀÃ1À¼1Àµ1À®1À§1À 1À™1À’1À‹1À„1À}1Àv1Ào1Àh1Àa1ÀZ1ÀS1ÀL1ÀE1À>1À71À01À)1À"1À1À1À 1À1Àÿ0Àø0Àñ0Àê0Àã0ÀÜ0ÀÕ0ÀÎ0ÀÇ0ÀÀ0À¹0À²0À«0À¤0À0À–0À0Àˆ0À0Àz0Às0Àl0Àe0À^0ÀW0ÀP0ÀI0ÀB0À;0À40À-0À&0À0À0À0À 0À0Àü/Àõ/Àî/Àç/Àà/ÀÙ/ÀÒ/ÀË/ÀÄ/À½/À¶/À¯/À¨/À¡/Àš/À“/ÀŒ/À…/À~/Àw/Àp/Ài/Àb/À[/ÀT/ÀM/ÀF/À?/À8/À1/À*/À#/À/À/À/À/À/Àù.Àò.Àë.Àä.ÀÝ.ÀÖ.ÀÏ.ÀÈ.ÀÁ.Àº.À³.À¬.À¥.Àž.À—.À.À‰.À‚.À{.Àt.Àm.Àf.À_.ÀX.ÀQ.ÀJ.ÀC.À<.À5.À..À'.À .À.À.À .À.Àý-Àö-Àï-Àè-Àá-ÀÚ-ÀÓ-ÀÌ-ÀÅ-À¾-À·-À°-À©-À¢-À›-À”-À-À†-À-Àx-Àq-Àj-Àc-À\-ÀU-ÀN-ÀG-À@-À9-À2-À+-À$-À-À-À-À-À-Àú,Àó,Àì,Àå,ÀÞ,À×,ÀÐ,ÀÉ,ÀÂ,À»,À´,À­,À¦,ÀŸ,À˜,À‘,ÀŠ,Àƒ,À|,Àu,Àn,Àg,À`,ÀY,ÀR,ÀK,ÀD,À=,À6,À/,À(,À!,À,À,À ,À,Àþ+À÷+Àð+Àé+Àâ+ÀÛ+ÀÔ+ÀÍ+ÀÆ+À¿+À¸+À±+Àª+À£+Àœ+À•+ÀŽ+À‡+À€+Ày+Àr+Àk+Àd+À]+ÀV+ÀO+ÀH+ÀA+À:+À3+À,+À%+À+À+À+À +À+Àû*Àô*Àí*Àæ*Àß*ÀØ*ÀÑ*ÀÊ*ÀÃ*À¼*Àµ*À®*À§*À *À™*À’*À‹*À„*À}*Àv*Ào*Àh*Àa*ÀZ*ÀS*ÀL*ÀE*À>*À7*À0*À)*À"*À*À*À *À*Àÿ)Àø)Àñ)Àê)Àã)ÀÜ)ÀÕ)ÀÎ)ÀÇ)ÀÀ)À¹)À²)À«)À¤)À)À–)À)Àˆ)À)Àz)Às)Àl)Àe)À^)ÀW)ÀP)ÀI)ÀB)À;)À4)À-)À&)À)À)À)À )À)Àü(Àõ(Àî(Àç(Àà(ÀÙ(ÀÒ(ÀË(ÀÄ(À½(À¶(À¯(À¨(À¡(Àš(À“(ÀŒ(À…(À~(Àw(Àp(Ài(Àb(À[(ÀT(ÀM(ÀF(À?(À8(À1(À*(À#(À(À(À(À(À(Àù'Àò'Àë'Àä'ÀÝ'ÀÖ'ÀÏ'ÀÈ'ÀÁ'Àº'À³'À¬'À¥'Àž'À—'À'À‰'À‚'À{'Àt'Àm'Àf'À_'ÀX'ÀQ'ÀJ'ÀC'À<'À5'À.'À''À 'À'À'À 'À'Àý&Àö&Àï&Àè&Àá&ÀÚ&ÀÓ&ÀÌ&ÀÅ&À¾&À·&À°&À©&À¢&À›&À”&À&À†&À&Àx&Àq&Àj&Àc&À\&ÀU&ÀN&ÀG&À@&À9&À2&À+&À$&À&À&À&À&À&Àú%Àó%Àì%Àå%ÀÞ%À×%ÀÐ%ÀÉ%ÀÂ%À»%À´%À­%À¦%ÀŸ%À˜%À‘%ÀŠ%Àƒ%À|%Àu%Àn%Àg%À`%ÀY%ÀR%ÀK%ÀD%À=%À6%À/%À(%À!%À%À%À %À%Àþ$À÷$Àð$Àé$Àâ$ÀÛ$ÀÔ$ÀÍ$ÀÆ$À¿$À¸$À±$Àª$À£$Àœ$À•$ÀŽ$À‡$À€$Ày$Àr$Àk$Àd$À]$ÀV$ÀO$ÀH$ÀA$À:$À3$À,$À%$À$À$À$À $À$Àû#Àô#Àí#Àæ#Àß#ÀØ#ÀÑ#ÀÊ#ÀÃ#À¼#Àµ#À®#À§#À #À™#À’#À‹#À„#À}#Àv#Ào#Àh#Àa#ÀZ#ÀS#ÀL#ÀE#À>#À7#À0#À)#À"#À#À#À #À#Àÿ"Àø"Àñ"Àê"Àã"ÀÜ"ÀÕ"ÀÎ"ÀÇ"ÀÀ"À¹"À²"À«"À¤"À"À–"À"Àˆ"À"Àz"Às"Àl"Àe"À^"ÀW"ÀP"ÀI"ÀB"À;"À4"À-"À&"À"À"À"À "À"Àü!Àõ!Àî!Àç!Àà!ÀÙ!ÀÒ!ÀË!ÀÄ!À½!À¶!À¯!À¨!À¡!Àš!À“!ÀŒ!À…!À~!Àw!Àp!Ài!Àb!À[!ÀT!ÀM!ÀF!À?!À8!À1!À*!À#!À!À!À!À!À!Àù Àò Àë Àä ÀÝ ÀÖ ÀÏ ÀÈ ÀÁ Àº À³ À¬ À¥ Àž À— À À‰ À‚ À{ Àt Àm Àf À_ ÀX ÀQ ÀJ ÀC À< À5 À. À' À À À À À ÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿ Àø Àñ Àê Àã ÀÜ ÀÕ ÀÎ ÀÇ ÀÀ À¹ À² À« À¤ À À– À Àˆ À Àz Às Àl Àe À^ ÀW ÀP ÀI ÀB À; À4 À- À& À À À À À Àü Àõ Àî Àç Àà ÀÙ ÀÒ ÀË ÀÄ À½ À¶ À¯ À¨ À¡ Àš À“ ÀŒ À… À~ Àw Àp Ài Àb À[ ÀT ÀM ÀF À? À8 À1 À* À# À À À À À Àù Àò Àë Àä ÀÝ ÀÖ ÀÏ ÀÈ ÀÁ Àº À³ À¬ À¥ Àž À— À À‰ À‚ À{ Àt Àm Àf À_ ÀX ÀQ ÀJ ÀC À< À5 À. À' À À À À À Àý Àö Àï Àè Àá ÀÚ ÀÓ ÀÌ ÀÅ À¾ À· À° À© À¢ À› À” À À† À Àx Àq Àj Àc À\ ÀU ÀN ÀG À@ À9 À2 À+ À$ À À À À À Àú Àó Àì Àå ÀÞ À× ÀÐ ÀÉ À À» À´ À­ À¦ ÀŸ À˜ À‘ ÀŠ Àƒ À| Àu Àn Àg À` ÀY ÀR ÀK ÀD À= À6 À/ À( À! À À À À ÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿÿ¿øÿ¿ñÿ¿êÿ¿ãÿ¿Üÿ¿Õÿ¿Îÿ¿Çÿ¿Àÿ¿¹ÿ¿²ÿ¿«ÿ¿¤ÿ¿ÿ¿–ÿ¿ÿ¿ˆÿ¿ÿ¿zÿ¿sÿ¿lÿ¿eÿ¿^ÿ¿Wÿ¿Pÿ¿Iÿ¿Bÿ¿;ÿ¿4ÿ¿-ÿ¿&ÿ¿ÿ¿ÿ¿ÿ¿ ÿ¿ÿ¿üþ¿õþ¿îþ¿çþ¿àþ¿Ùþ¿Òþ¿Ëþ¿Äþ¿½þ¿¶þ¿¯þ¿¨þ¿¡þ¿šþ¿“þ¿Œþ¿…þ¿~þ¿wþ¿pþ¿iþ¿bþ¿[þ¿Tþ¿Mþ¿Fþ¿?þ¿8þ¿1þ¿*þ¿#þ¿þ¿þ¿þ¿þ¿þ¿ùý¿òý¿ëý¿äý¿Ýý¿Öý¿Ïý¿Èý¿Áý¿ºý¿³ý¿¬ý¿¥ý¿žý¿—ý¿ý¿‰ý¿‚ý¿{ý¿tý¿mý¿fý¿_ý¿Xý¿Qý¿Jý¿Cý¿<ý¿5ý¿.ý¿'ý¿ ý¿ý¿ý¿ ý¿ý¿ýü¿öü¿ïü¿èü¿áü¿Úü¿Óü¿Ìü¿Åü¿¾ü¿·ü¿°ü¿©ü¿¢ü¿›ü¿”ü¿ü¿†ü¿ü¿xü¿qü¿jü¿cü¿\ü¿Uü¿Nü¿Gü¿@ü¿9ü¿2ü¿+ü¿$ü¿ü¿ü¿ü¿ü¿ü¿úû¿óû¿ìû¿åû¿Þû¿×û¿Ðû¿Éû¿Âû¿»û¿´û¿­û¿¦û¿Ÿû¿˜û¿‘û¿Šû¿ƒû¿|û¿uû¿nû¿gû¿`û¿Yû¿Rû¿Kû¿Dû¿=û¿6û¿/û¿(û¿!û¿û¿û¿ û¿û¿þú¿÷ú¿ðú¿éú¿âú¿Ûú¿Ôú¿Íú¿Æú¿¿ú¿¸ú¿±ú¿ªú¿£ú¿œú¿•ú¿Žú¿‡ú¿€ú¿yú¿rú¿kú¿dú¿]ú¿Vú¿Oú¿Hú¿Aú¿:ú¿3ú¿,ú¿%ú¿ú¿ú¿ú¿ ú¿ú¿ûù¿ôù¿íù¿æù¿ßù¿Øù¿Ñù¿Êù¿Ãù¿¼ù¿µù¿®ù¿§ù¿ ù¿™ù¿’ù¿‹ù¿„ù¿}ù¿vù¿où¿hù¿aù¿Zù¿Sù¿Lù¿Eù¿>ù¿7ù¿0ù¿)ù¿"ù¿ù¿ù¿ ù¿ù¿ÿø¿øø¿ñø¿êø¿ãø¿Üø¿Õø¿Îø¿Çø¿Àø¿¹ø¿²ø¿«ø¿¤ø¿ø¿–ø¿ø¿ˆø¿ø¿zø¿sø¿lø¿eø¿^ø¿Wø¿Pø¿Iø¿Bø¿;ø¿4ø¿-ø¿&ø¿ø¿ø¿ø¿ ø¿ø¿ü÷¿õ÷¿î÷¿ç÷¿à÷¿Ù÷¿Ò÷¿Ë÷¿Ä÷¿½÷¿¶÷¿¯÷¿¨÷¿¡÷¿š÷¿“÷¿Œ÷¿…÷¿~÷¿w÷¿p÷¿i÷¿b÷¿[÷¿T÷¿M÷¿F÷¿?÷¿8÷¿1÷¿*÷¿#÷¿÷¿÷¿÷¿÷¿÷¿ùö¿òö¿ëö¿äö¿Ýö¿Öö¿Ïö¿Èö¿Áö¿ºö¿³ö¿¬ö¿¥ö¿žö¿—ö¿ö¿‰ö¿‚ö¿{ö¿tö¿mö¿fö¿_ö¿Xö¿Qö¿Jö¿Cö¿<ö¿5ö¿.ö¿'ö¿ ö¿ö¿ö¿ ö¿ö¿ýõ¿öõ¿ïõ¿èõ¿áõ¿Úõ¿Óõ¿Ìõ¿Åõ¿¾õ¿·õ¿°õ¿©õ¿¢õ¿›õ¿”õ¿õ¿†õ¿õ¿xõ¿qõ¿jõ¿cõ¿\õ¿Uõ¿Nõ¿Gõ¿@õ¿9õ¿2õ¿+õ¿$õ¿õ¿õ¿õ¿õ¿õ¿úô¿óô¿ìô¿åô¿Þô¿×ô¿Ðô¿Éô¿Âô¿»ô¿´ô¿­ô¿¦ô¿Ÿô¿˜ô¿‘ô¿Šô¿ƒô¿|ô¿uô¿nô¿gô¿`ô¿Yô¿Rô¿Kô¿Dô¿=ô¿6ô¿/ô¿(ô¿!ô¿ô¿ô¿ ô¿ô¿þó¿÷ó¿ðó¿éó¿âó¿Ûó¿Ôó¿Íó¿Æó¿¿ó¿¸ó¿±ó¿ªó¿£ó¿œó¿•ó¿Žó¿‡ó¿€ó¿yó¿ró¿kó¿dó¿]ó¿Vó¿Oó¿Hó¿Aó¿:ó¿3ó¿,ó¿%ó¿ó¿ó¿ó¿ ó¿ó¿ûò¿ôò¿íò¿æò¿ßò¿Øò¿Ñò¿Êò¿Ãò¿¼ò¿µò¿®ò¿§ò¿ ò¿™ò¿’ò¿‹ò¿„ò¿}ò¿vò¿oò¿hò¿aò¿Zò¿Sò¿Lò¿Eò¿>ò¿7ò¿0ò¿)ò¿"ò¿ò¿ò¿ ò¿ò¿ÿñ¿øñ¿ññ¿êñ¿ãñ¿Üñ¿Õñ¿Îñ¿Çñ¿Àñ¿¹ñ¿²ñ¿«ñ¿¤ñ¿ñ¿–ñ¿ñ¿ˆñ¿ñ¿zñ¿sñ¿lñ¿eñ¿^ñ¿Wñ¿Pñ¿Iñ¿Bñ¿;ñ¿4ñ¿-ñ¿&ñ¿ñ¿ñ¿ñ¿ ñ¿ñ¿üð¿õð¿îð¿çð¿àð¿Ùð¿Òð¿Ëð¿Äð¿½ð¿¶ð¿¯ð¿¨ð¿¡ð¿šð¿“ð¿Œð¿…ð¿~ð¿wð¿pð¿ið¿bð¿[ð¿Tð¿Mð¿Fð¿?ð¿8ð¿1ð¿*ð¿#ð¿ð¿ð¿ð¿ð¿ð¿ùï¿òï¿ëï¿äï¿Ýï¿Öï¿Ïï¿Èï¿Á￳↓¥￞ᅲï¿ï¿‰ï¿‚ï¿{ï¿tï¿mï¿fï¿_ï¿Xï¿Qï¿Jï¿Cï¿<ï¿5ï¿.ï¿'ï¿ ï¿ï¿ï¿ ï¿ï¿ýî¿öî¿ïî¿èî¿áî¿Úî¿Óî¿Ìî¿Åî¿î¿†î¿î¿xî¿qî¿jî¿cî¿\î¿Uî¿Nî¿Gî¿@î¿9î¿2î¿+î¿$î¿î¿î¿î¿î¿î¿úí¿óí¿ìí¿åí¿Þí¿×í¿Ðí¿Éí¿Âí¿»í¿´í¿­í¿¦í¿Ÿí¿˜í¿‘í¿Ší¿ƒí¿|í¿uí¿ní¿gí¿`í¿Yí¿Rí¿Kí¿Dí¿=í¿6í¿/í¿(í¿!í¿í¿í¿ í¿í¿þì¿÷ì¿ðì¿éì¿âì¿Ûì¿Ôì¿Íì¿Æì¿¿ì¿¸ì¿±ì¿ªì¿£ì¿œì¿•ì¿Žì¿‡ì¿€ì¿yì¿rì¿kì¿dì¿]ì¿Vì¿Oì¿Hì¿Aì¿:ì¿3ì¿,ì¿%ì¿ì¿ì¿ì¿ ì¿ì¿ûë¿ôë¿íë¿æë¿ßë¿Øë¿Ñë¿Êë¿Ã뿼뿵뿮뿧뿠뿙뿒뿋뿄ë¿}ë¿vë¿oë¿hë¿aë¿Zë¿Së¿Lë¿Eë¿>ë¿7ë¿0ë¿)ë¿"ë¿ë¿ë¿ ë¿ë¿ÿê¿øê¿ñê¿êê¿ãê¿Üê¿Õê¿Îê¿Çê¿À꿹꿲꿫꿤ê¿ê¿–ê¿ê¿ˆê¿ê¿zê¿sê¿lê¿eê¿^ê¿Wê¿Pê¿Iê¿Bê¿;ê¿4ê¿-ê¿&ê¿ê¿ê¿ê¿ ê¿ê¿üé¿õé¿îé¿çé¿àé¿Ùé¿Òé¿Ëé¿Ä鿽鿶鿯鿨鿡鿚鿓鿌鿅é¿~é¿wé¿pé¿ié¿bé¿[é¿Té¿Mé¿Fé¿?é¿8é¿1é¿*é¿#é¿é¿é¿é¿é¿é¿ùè¿òè¿ëè¿äè¿Ýè¿Öè¿Ïè¿Èè¿Á迺迳迬迥连迗è¿è¿‰è¿‚è¿{è¿tè¿mè¿fè¿_è¿Xè¿Qè¿Jè¿Cè¿<è¿5è¿.è¿'è¿ è¿è¿è¿ è¿è¿ýç¿öç¿ïç¿èç¿áç¿Úç¿Óç¿Ìç¿Å翾翷翰翩翢翛翔ç¿ç¿†ç¿ç¿xç¿qç¿jç¿cç¿\ç¿Uç¿Nç¿Gç¿@ç¿9ç¿2ç¿+ç¿$ç¿ç¿ç¿ç¿ç¿ç¿úæ¿óæ¿ìæ¿åæ¿Þæ¿׿¿Ðæ¿Éæ¿Â濻濴濭濦濟濘濑濊濃æ¿|æ¿uæ¿næ¿gæ¿`æ¿Yæ¿Ræ¿Kæ¿Dæ¿=æ¿6æ¿/æ¿(æ¿!æ¿æ¿æ¿ æ¿æ¿þå¿÷å¿ðå¿éå¿âå¿Ûå¿Ôå¿Íå¿Æå¿¿å¿¸å¿±å¿ªå¿£å¿œå¿•å¿Žå¿‡å¿€å¿yå¿rå¿kå¿då¿]å¿Vå¿Oå¿Hå¿Aå¿:å¿3å¿,å¿%å¿å¿å¿å¿ å¿å¿ûä¿ôä¿íä¿æä¿ßä¿Øä¿Ñä¿Êä¿Ã俼俵修俧俠俙俒俋俄ä¿}ä¿vä¿oä¿hä¿aä¿Zä¿Sä¿Lä¿Eä¿>ä¿7ä¿0ä¿)ä¿"ä¿ä¿ä¿ ä¿ä¿ÿã¿øã¿ñã¿êã¿ãã¿Üã¿Õã¿Îã¿Çã¿À㿹㿲㿫㿤ã¿ã¿–ã¿ã¿ˆã¿ã¿zã¿sã¿lã¿eã¿^ã¿Wã¿Pã¿Iã¿Bã¿;ã¿4ã¿-ã¿&ã¿ã¿ã¿ã¿ ã¿ã¿üâ¿õâ¿îâ¿çâ¿àâ¿Ùâ¿Òâ¿Ëâ¿Ä⿽⿶⿯⿨⿡⿚⿓⿌⿅â¿~â¿wâ¿pâ¿iâ¿bâ¿[â¿Tâ¿Mâ¿Fâ¿?â¿8â¿1â¿*â¿#â¿â¿â¿â¿â¿â¿ùá¿òá¿ëá¿äá¿Ýá¿Öá¿Ïá¿Èá¿ÁῺῳῬῥ῞ῗá¿á¿‰á¿‚á¿{á¿tá¿má¿fá¿_á¿Xá¿Qá¿Já¿Cá¿<á¿5á¿.á¿'á¿ á¿á¿á¿ á¿á¿ýà¿öà¿ïà¿èà¿áà¿Úà¿Óà¿Ìà¿Å࿾࿷࿰࿩࿢࿛࿔à¿à¿†à¿à¿xà¿qà¿jà¿cà¿\à¿Uà¿Nà¿Gà¿@à¿9à¿2à¿+à¿$à¿à¿à¿à¿à¿à¿úß¿óß¿ìß¿åß¿Þß¿×ß¿Ðß¿Éß¿Âß¿»ß¿´ß¿­ß¿¦ß¿Ÿß¿˜ß¿‘ß¿Šß¿ƒß¿|ß¿uß¿nß¿gß¿`ß¿Yß¿Rß¿Kß¿Dß¿=ß¿6ß¿/ß¿(ß¿!߿߿߿ ߿߿þÞ¿÷Þ¿ðÞ¿éÞ¿âÞ¿ÛÞ¿ÔÞ¿ÍÞ¿ÆÞ¿¿Þ¿¸Þ¿±Þ¿ªÞ¿£Þ¿œÞ¿•Þ¿ŽÞ¿‡Þ¿€Þ¿yÞ¿rÞ¿kÞ¿dÞ¿]Þ¿VÞ¿OÞ¿HÞ¿AÞ¿:Þ¿3Þ¿,Þ¿%Þ¿Þ¿Þ¿Þ¿ Þ¿Þ¿ûÝ¿ôÝ¿íÝ¿æÝ¿ßÝ¿ØÝ¿ÑÝ¿ÊÝ¿ÃÝ¿¼Ý¿µÝ¿®Ý¿§Ý¿ Ý¿™Ý¿’Ý¿‹Ý¿„Ý¿}Ý¿vÝ¿oÝ¿hÝ¿aÝ¿ZÝ¿SÝ¿LÝ¿EÝ¿>Ý¿7Ý¿0Ý¿)Ý¿"ݿݿݿ ݿݿÿÜ¿øÜ¿ñÜ¿êÜ¿ãÜ¿ÜÜ¿ÕÜ¿ÎÜ¿ÇÜ¿ÀÜ¿¹Ü¿²Ü¿«Ü¿¤Ü¿Ü¿–ܿܿˆÜ¿Ü¿zÜ¿sÜ¿lÜ¿eÜ¿^Ü¿WÜ¿PÜ¿IÜ¿BÜ¿;Ü¿4Ü¿-Ü¿&ܿܿܿܿ ܿܿüÛ¿õÛ¿îÛ¿çÛ¿àÛ¿ÙÛ¿ÒÛ¿ËÛ¿ÄÛ¿½Û¿¶Û¿¯Û¿¨Û¿¡Û¿šÛ¿“Û¿ŒÛ¿…Û¿~Û¿wÛ¿pÛ¿iÛ¿bÛ¿[Û¿TÛ¿MÛ¿FÛ¿?Û¿8Û¿1Û¿*Û¿#Û¿Û¿Û¿Û¿Û¿Û¿ùÚ¿òÚ¿ëÚ¿äÚ¿ÝÚ¿ÖÚ¿ÏÚ¿ÈÚ¿ÁÚ¿ºÚ¿³Ú¿¬Ú¿¥Ú¿žÚ¿—Ú¿Ú¿‰Ú¿‚Ú¿{Ú¿tÚ¿mÚ¿fÚ¿_Ú¿XÚ¿QÚ¿JÚ¿CÚ¿<Ú¿5Ú¿.Ú¿'Ú¿ Ú¿Ú¿Ú¿ Ú¿Ú¿ýÙ¿öÙ¿ïÙ¿èÙ¿áÙ¿ÚÙ¿ÓÙ¿ÌÙ¿ÅÙ¿¾Ù¿·Ù¿°Ù¿©Ù¿¢Ù¿›Ù¿”ٿٿ†Ù¿Ù¿xÙ¿qÙ¿jÙ¿cÙ¿\Ù¿UÙ¿NÙ¿GÙ¿@Ù¿9Ù¿2Ù¿+Ù¿$ٿٿٿٿٿٿúØ¿óØ¿ìØ¿åØ¿ÞØ¿ר¿ÐØ¿ÉØ¿ÂØ¿»Ø¿´Ø¿­Ø¿¦Ø¿ŸØ¿˜Ø¿‘Ø¿ŠØ¿ƒØ¿|Ø¿uØ¿nØ¿gØ¿`Ø¿YØ¿RØ¿KØ¿DØ¿=Ø¿6Ø¿/Ø¿(Ø¿!ؿؿؿ ؿؿþ׿÷׿ð׿é׿â׿Û׿Ô׿Í׿Æ×¿¿×¿¸×¿±×¿ª×¿£×¿œ×¿•׿Ž×¿‡×¿€×¿y׿r׿k׿d׿]׿V׿O׿H׿A׿:׿3׿,׿%׿׿׿׿ ׿׿ûÖ¿ôÖ¿íÖ¿æÖ¿ßÖ¿ØÖ¿ÑÖ¿ÊÖ¿ÃÖ¿¼Ö¿µÖ¿®Ö¿§Ö¿ Ö¿™Ö¿’Ö¿‹Ö¿„Ö¿}Ö¿vÖ¿oÖ¿hÖ¿aÖ¿ZÖ¿SÖ¿LÖ¿EÖ¿>Ö¿7Ö¿0Ö¿)Ö¿"Ö¿Ö¿Ö¿ Ö¿Ö¿ÿÕ¿øÕ¿ñÕ¿êÕ¿ãÕ¿ÜÕ¿ÕÕ¿ÎÕ¿ÇÕ¿ÀÕ¿¹Õ¿²Õ¿«Õ¿¤Õ¿Õ¿–Õ¿Õ¿ˆÕ¿Õ¿zÕ¿sÕ¿lÕ¿eÕ¿^Õ¿WÕ¿PÕ¿IÕ¿BÕ¿;Õ¿4Õ¿-Õ¿&Õ¿Õ¿Õ¿Õ¿ Õ¿Õ¿üÔ¿õÔ¿îÔ¿çÔ¿àÔ¿ÙÔ¿ÒÔ¿ËÔ¿ÄÔ¿½Ô¿¶Ô¿¯Ô¿¨Ô¿¡Ô¿šÔ¿“Ô¿ŒÔ¿…Ô¿~Ô¿wÔ¿pÔ¿iÔ¿bÔ¿[Ô¿TÔ¿MÔ¿FÔ¿?Ô¿8Ô¿1Ô¿*Ô¿#Ô¿Ô¿Ô¿Ô¿Ô¿Ô¿ùÓ¿òÓ¿ëÓ¿äÓ¿ÝÓ¿ÖÓ¿ÏÓ¿ÈÓ¿ÁÓ¿ºÓ¿³Ó¿¬Ó¿¥Ó¿žÓ¿—Ó¿Ó¿‰Ó¿‚Ó¿{Ó¿tÓ¿mÓ¿fÓ¿_Ó¿XÓ¿QÓ¿JÓ¿CÓ¿<Ó¿5Ó¿.Ó¿'Ó¿ Ó¿Ó¿Ó¿ Ó¿Ó¿ýÒ¿öÒ¿ïÒ¿èÒ¿áÒ¿ÚÒ¿ÓÒ¿ÌÒ¿ÅÒ¿¾Ò¿·Ò¿°Ò¿©Ò¿¢Ò¿›Ò¿”Ò¿Ò¿†Ò¿Ò¿xÒ¿qÒ¿jÒ¿cÒ¿\Ò¿UÒ¿NÒ¿GÒ¿@Ò¿9Ò¿2Ò¿+Ò¿$Ò¿Ò¿Ò¿Ò¿Ò¿Ò¿úÑ¿óÑ¿ìÑ¿åÑ¿ÞÑ¿×Ñ¿ÐÑ¿ÉÑ¿ÂÑ¿»Ñ¿´Ñ¿­Ñ¿¦Ñ¿ŸÑ¿˜Ñ¿‘Ñ¿ŠÑ¿ƒÑ¿|Ñ¿uÑ¿nÑ¿gÑ¿`Ñ¿YÑ¿RÑ¿KÑ¿DÑ¿=Ñ¿6Ñ¿/Ñ¿(Ñ¿!ѿѿѿ ѿѿþп÷пðпéпâпÛпÔпÍпÆÐ¿¿Ð¿¸Ð¿±Ð¿ªÐ¿£Ð¿œÐ¿•пŽÐ¿‡Ð¿€Ð¿yпrпkпdп]пVпOпHпAп:п3п,п%пппп ппûÏ¿ôÏ¿íÏ¿æÏ¿ßÏ¿ØÏ¿ÑÏ¿ÊÏ¿ÃÏ¿¼Ï¿µÏ¿®Ï¿§Ï¿ Ï¿™Ï¿’Ï¿‹Ï¿„Ï¿}Ï¿vÏ¿oÏ¿hÏ¿aÏ¿ZÏ¿SÏ¿LÏ¿EÏ¿>Ï¿7Ï¿0Ï¿)Ï¿"ϿϿϿ ϿϿÿοøÎ¿ñοêοãοÜοÕοÎοÇοÀο¹Î¿²Î¿«Î¿¤Î¿ο–οοˆÎ¿οzοsοlοeο^οWοPοIοBο;ο4ο-ο&οοοο οοüÍ¿õÍ¿îÍ¿çÍ¿àÍ¿ÙÍ¿ÒÍ¿ËÍ¿ÄÍ¿½Í¿¶Í¿¯Í¿¨Í¿¡Í¿šÍ¿“Í¿ŒÍ¿…Í¿~Í¿wÍ¿pÍ¿iÍ¿bÍ¿[Í¿TÍ¿MÍ¿FÍ¿?Í¿8Í¿1Í¿*Í¿#ͿͿͿͿͿͿùÌ¿òÌ¿ëÌ¿äÌ¿ÝÌ¿ÖÌ¿ÏÌ¿ÈÌ¿ÁÌ¿ºÌ¿³Ì¿¬Ì¿¥Ì¿žÌ¿—̿̿‰Ì¿‚Ì¿{Ì¿tÌ¿mÌ¿fÌ¿_Ì¿XÌ¿QÌ¿JÌ¿CÌ¿<Ì¿5Ì¿.Ì¿'Ì¿ ̿̿̿ ̿̿ýË¿öË¿ïË¿èË¿áË¿ÚË¿ÓË¿ÌË¿ÅË¿¾Ë¿·Ë¿°Ë¿©Ë¿¢Ë¿›Ë¿”˿˿†Ë¿Ë¿xË¿qË¿jË¿cË¿\Ë¿UË¿NË¿GË¿@Ë¿9Ë¿2Ë¿+Ë¿$˿˿˿˿˿˿úÊ¿óÊ¿ìÊ¿åÊ¿ÞÊ¿×Ê¿ÐÊ¿ÉÊ¿ÂÊ¿»Ê¿´Ê¿­Ê¿¦Ê¿ŸÊ¿˜Ê¿‘Ê¿ŠÊ¿ƒÊ¿|Ê¿uÊ¿nÊ¿gÊ¿`Ê¿YÊ¿RÊ¿KÊ¿DÊ¿=Ê¿6Ê¿/Ê¿(Ê¿!ʿʿʿ ʿʿþÉ¿÷É¿ðÉ¿éÉ¿âÉ¿ÛÉ¿ÔÉ¿ÍÉ¿ÆÉ¿¿É¿¸É¿±É¿ªÉ¿£É¿œÉ¿•É¿ŽÉ¿‡É¿€É¿yÉ¿rÉ¿kÉ¿dÉ¿]É¿VÉ¿OÉ¿HÉ¿AÉ¿:É¿3É¿,É¿%ɿɿɿɿ ɿɿûÈ¿ôÈ¿íÈ¿æÈ¿ßÈ¿ØÈ¿ÑÈ¿ÊÈ¿ÃÈ¿¼È¿µÈ¿®È¿§È¿ È¿™È¿’È¿‹È¿„È¿}È¿vÈ¿oÈ¿hÈ¿aÈ¿ZÈ¿SÈ¿LÈ¿EÈ¿>È¿7È¿0È¿)È¿"ȿȿȿ ȿȿÿÇ¿øÇ¿ñÇ¿êÇ¿ãÇ¿ÜÇ¿ÕÇ¿ÎÇ¿ÇÇ¿ÀÇ¿¹Ç¿²Ç¿«Ç¿¤Ç¿Ç¿–ǿǿˆÇ¿Ç¿zÇ¿sÇ¿lÇ¿eÇ¿^Ç¿WÇ¿PÇ¿IÇ¿BÇ¿;Ç¿4Ç¿-Ç¿&ǿǿǿǿ ǿǿüÆ¿õÆ¿îÆ¿çÆ¿àÆ¿ÙÆ¿ÒÆ¿ËÆ¿ÄÆ¿½Æ¿¶Æ¿¯Æ¿¨Æ¿¡Æ¿šÆ¿“Æ¿ŒÆ¿…Æ¿~Æ¿wÆ¿pÆ¿iÆ¿bÆ¿[Æ¿TÆ¿MÆ¿FÆ¿?Æ¿8Æ¿1Æ¿*Æ¿#ƿƿƿƿƿƿùÅ¿òÅ¿ëÅ¿äÅ¿ÝÅ¿ÖÅ¿ÏÅ¿ÈÅ¿ÁÅ¿ºÅ¿³Å¿¬Å¿¥Å¿žÅ¿—ſſ‰Å¿‚Å¿{Å¿tÅ¿mÅ¿fÅ¿_Å¿XÅ¿QÅ¿JÅ¿CÅ¿<Å¿5Å¿.Å¿'Å¿ ſſſ ſſýÄ¿öÄ¿ïÄ¿èÄ¿áÄ¿ÚÄ¿ÓÄ¿ÌÄ¿ÅÄ¿¾Ä¿·Ä¿°Ä¿©Ä¿¢Ä¿›Ä¿”ĿĿ†Ä¿Ä¿xÄ¿qÄ¿jÄ¿cÄ¿\Ä¿UÄ¿NÄ¿GÄ¿@Ä¿9Ä¿2Ä¿+Ä¿$ĿĿĿĿĿĿúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»Ã¿´Ã¿­Ã¿¦Ã¿ŸÃ¿˜Ã¿‘ÿŠÃ¿ƒÃ¿|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿ÆÂ¿¿Â¿¸Â¿±Â¿ªÂ¿£Â¿œÂ¿•¿ŽÂ¿‡Â¿€Â¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿ûÁ¿ôÁ¿íÁ¿æÁ¿ßÁ¿ØÁ¿ÑÁ¿ÊÁ¿ÃÁ¿¼Á¿µÁ¿®Á¿§Á¿ Á¿™Á¿’Á¿‹Á¿„Á¿}Á¿vÁ¿oÁ¿hÁ¿aÁ¿ZÁ¿SÁ¿LÁ¿EÁ¿>Á¿7Á¿0Á¿)Á¿"Á¿Á¿Á¿ Á¿Á¿ÿÀ¿øÀ¿ñÀ¿êÀ¿ãÀ¿ÜÀ¿ÕÀ¿ÎÀ¿ÇÀ¿ÀÀ¿¹À¿²À¿«À¿¤À¿À¿–À¿À¿ˆÀ¿À¿zÀ¿sÀ¿lÀ¿eÀ¿^À¿WÀ¿PÀ¿IÀ¿BÀ¿;À¿4À¿-À¿&À¿À¿À¿À¿ À¿À¿ü¿¿õ¿¿î¿¿ç¿¿à¿¿Ù¿¿Ò¿¿Ë¿¿Ä¿¿½¿¿¶¿¿¯¿¿¨¿¿¡¿¿š¿¿“¿¿Œ¿¿…¿¿~¿¿w¿¿p¿¿i¿¿b¿¿[¿¿T¿¿M¿¿F¿¿?¿¿8¿¿1¿¿*¿¿#¿¿¿¿¿¿¿¿¿¿¿¿ù¾¿ò¾¿뾿便ݾ¿Ö¾¿Ͼ¿Ⱦ¿Á¾¿º¾¿³¾¿¬¾¿¥¾¿ž¾¿—¾¿¾¿‰¾¿‚¾¿{¾¿t¾¿m¾¿f¾¿_¾¿X¾¿Q¾¿J¾¿C¾¿<¾¿5¾¿.¾¿'¾¿ ¾¿¾¿¾¿ ¾¿¾¿ý½¿ö½¿ソ轿὿Ú½¿Ó½¿̽¿Ž¿¾½¿·½¿°½¿©½¿¢½¿›½¿”½¿½¿†½¿½¿x½¿q½¿j½¿c½¿\½¿U½¿N½¿G½¿@½¿9½¿2½¿+½¿$½¿½¿½¿½¿½¿½¿ú¼¿ó¼¿켿弿Þ¼¿×¼¿м¿ɼ¿¼¿»¼¿´¼¿­¼¿¦¼¿Ÿ¼¿˜¼¿‘¼¿м¿ƒ¼¿|¼¿u¼¿n¼¿g¼¿`¼¿Y¼¿R¼¿K¼¿D¼¿=¼¿6¼¿/¼¿(¼¿!¼¿¼¿¼¿ ¼¿¼¿þ»¿÷»¿ð»¿黿⻿Û»¿Ô»¿Í»¿Æ»¿¿»¿¸»¿±»¿ª»¿£»¿œ»¿•»¿Ž»¿‡»¿€»¿y»¿r»¿k»¿d»¿]»¿V»¿O»¿H»¿A»¿:»¿3»¿,»¿%»¿»¿»¿»¿ »¿»¿ûº¿ôº¿íº¿溿ߺ¿غ¿Ѻ¿ʺ¿ú¿¼º¿µº¿®º¿§º¿ º¿™º¿’º¿‹º¿„º¿}º¿vº¿oº¿hº¿aº¿Zº¿Sº¿Lº¿Eº¿>º¿7º¿0º¿)º¿"º¿º¿º¿ º¿º¿ÿ¹¿ø¹¿ñ¹¿깿㹿ܹ¿Õ¹¿ι¿ǹ¿À¹¿¹¹¿²¹¿«¹¿¤¹¿¹¿–¹¿¹¿ˆ¹¿¹¿z¹¿s¹¿l¹¿e¹¿^¹¿W¹¿P¹¿I¹¿B¹¿;¹¿4¹¿-¹¿&¹¿¹¿¹¿¹¿ ¹¿¹¿ü¸¿õ¸¿縿฿Ù¸¿Ò¸¿˸¿ĸ¿½¸¿¶¸¿¯¸¿¨¸¿¡¸¿š¸¿“¸¿Œ¸¿…¸¿~¸¿w¸¿p¸¿i¸¿b¸¿[¸¿T¸¿M¸¿F¸¿?¸¿8¸¿1¸¿*¸¿#¸¿¸¿¸¿¸¿¸¿¸¿ù·¿ò·¿ë·¿ä·¿Ý·¿Ö·¿Ï·¿È·¿Á·¿º·¿³·¿¬·¿¥·¿ž·¿—·¿·¿‰·¿‚·¿{·¿t·¿m·¿f·¿_·¿X·¿Q·¿J·¿C·¿<·¿5·¿.·¿'·¿ ·¿·¿·¿ ·¿·¿ý¶¿ö¶¿ï¶¿è¶¿á¶¿Ú¶¿Ó¶¿̶¿Ŷ¿¾¶¿·¶¿°¶¿©¶¿¢¶¿›¶¿”¶¿¶¿†¶¿¶¿x¶¿q¶¿j¶¿c¶¿\¶¿U¶¿N¶¿G¶¿@¶¿9¶¿2¶¿+¶¿$¶¿¶¿¶¿¶¿¶¿¶¿úµ¿óµ¿쵿嵿Þµ¿×µ¿е¿ɵ¿µ¿»µ¿´µ¿­µ¿¦µ¿Ÿµ¿˜µ¿‘µ¿е¿ƒµ¿|µ¿uµ¿nµ¿gµ¿`µ¿Yµ¿Rµ¿Kµ¿Dµ¿=µ¿6µ¿/µ¿(µ¿!µ¿µ¿µ¿ µ¿µ¿þ´¿÷´¿ð´¿é´¿â´¿Û´¿Ô´¿Í´¿Æ´¿¿´¿¸´¿±´¿ª´¿£´¿œ´¿•´¿Ž´¿‡´¿€´¿y´¿r´¿k´¿d´¿]´¿V´¿O´¿H´¿A´¿:´¿3´¿,´¿%´¿´¿´¿´¿ ´¿´¿û³¿ô³¿í³¿泿ß³¿س¿ѳ¿ʳ¿ó¿¼³¿µ³¿®³¿§³¿ ³¿™³¿’³¿‹³¿„³¿}³¿v³¿o³¿h³¿a³¿Z³¿S³¿L³¿E³¿>³¿7³¿0³¿)³¿"³¿³¿³¿ ³¿³¿ÿ²¿ø²¿ñ²¿겿㲿ܲ¿Õ²¿β¿Dz¿À²¿¹²¿²²¿«²¿¤²¿²¿–²¿²¿ˆ²¿²¿z²¿s²¿l²¿e²¿^²¿W²¿P²¿I²¿B²¿;²¿4²¿-²¿&²¿²¿²¿²¿ ²¿²¿ü±¿õ±¿籿౿Ù±¿Ò±¿˱¿ı¿½±¿¶±¿¯±¿¨±¿¡±¿š±¿“±¿Œ±¿…±¿~±¿w±¿p±¿i±¿b±¿[±¿T±¿M±¿F±¿?±¿8±¿1±¿*±¿#±¿±¿±¿±¿±¿±¿ù°¿ò°¿ë°¿ä°¿ݰ¿Ö°¿ϰ¿Ȱ¿Á°¿º°¿³°¿¬°¿¥°¿ž°¿—°¿°¿‰°¿‚°¿{°¿t°¿m°¿f°¿_°¿X°¿Q°¿J°¿C°¿<°¿5°¿.°¿'°¿ °¿°¿°¿ °¿°¿ý¯¿ö¯¿ﯿ诿᯿Ú¯¿Ó¯¿̯¿ů¿¾¯¿·¯¿°¯¿©¯¿¢¯¿›¯¿”¯¿¯¿†¯¿¯¿x¯¿q¯¿j¯¿c¯¿\¯¿U¯¿N¯¿G¯¿@¯¿9¯¿2¯¿+¯¿$¯¿¯¿¯¿¯¿¯¿¯¿ú®¿ó®¿쮿宿Þ®¿×®¿Ю¿É®¿®¿»®¿´®¿­®¿¦®¿Ÿ®¿˜®¿‘®¿Š®¿ƒ®¿|®¿u®¿n®¿g®¿`®¿Y®¿R®¿K®¿D®¿=®¿6®¿/®¿(®¿!®¿®¿®¿ ®¿®¿þ­¿÷­¿ð­¿é­¿â­¿Û­¿Ô­¿Í­¿Æ­¿¿­¿¸­¿±­¿ª­¿£­¿œ­¿•­¿Ž­¿‡­¿€­¿y­¿r­¿k­¿d­¿]­¿V­¿O­¿H­¿A­¿:­¿3­¿,­¿%­¿­¿­¿­¿ ­¿­¿û¬¿ô¬¿í¬¿欿߬¿ج¿Ѭ¿ʬ¿ì¿¼¬¿µ¬¿®¬¿§¬¿ ¬¿™¬¿’¬¿‹¬¿„¬¿}¬¿v¬¿o¬¿h¬¿a¬¿Z¬¿S¬¿L¬¿E¬¿>¬¿7¬¿0¬¿)¬¿"¬¿¬¿¬¿ ¬¿¬¿ÿ«¿ø«¿ñ«¿ê«¿ã«¿Ü«¿Õ«¿Ϋ¿Ç«¿À«¿¹«¿²«¿««¿¤«¿«¿–«¿«¿ˆ«¿«¿z«¿s«¿l«¿e«¿^«¿W«¿P«¿I«¿B«¿;«¿4«¿-«¿&«¿«¿«¿«¿ «¿«¿üª¿õª¿窿િÙª¿Òª¿˪¿Ī¿½ª¿¶ª¿¯ª¿¨ª¿¡ª¿šª¿“ª¿Œª¿…ª¿~ª¿wª¿pª¿iª¿bª¿[ª¿Tª¿Mª¿Fª¿?ª¿8ª¿1ª¿*ª¿#ª¿ª¿ª¿ª¿ª¿ª¿ù©¿ò©¿ë©¿ä©¿Ý©¿Ö©¿Ï©¿È©¿Á©¿º©¿³©¿¬©¿¥©¿ž©¿—©¿©¿‰©¿‚©¿{©¿t©¿m©¿f©¿_©¿X©¿Q©¿J©¿C©¿<©¿5©¿.©¿'©¿ ©¿©¿©¿ ©¿©¿ý¨¿ö¨¿憎訿ᨿÚ¨¿Ó¨¿̨¿Ũ¿¾¨¿·¨¿°¨¿©¨¿¢¨¿›¨¿”¨¿¨¿†¨¿¨¿x¨¿q¨¿j¨¿c¨¿\¨¿U¨¿N¨¿G¨¿@¨¿9¨¿2¨¿+¨¿$¨¿¨¿¨¿¨¿¨¿¨¿ú§¿ó§¿ì§¿å§¿Þ§¿×§¿Ч¿ɧ¿§¿»§¿´§¿­§¿¦§¿Ÿ§¿˜§¿‘§¿Ч¿ƒ§¿|§¿u§¿n§¿g§¿`§¿Y§¿R§¿K§¿D§¿=§¿6§¿/§¿(§¿!§¿§¿§¿ §¿§¿þ¦¿÷¦¿ð¦¿馿⦿Û¦¿Ô¦¿ͦ¿Ʀ¿¿¦¿¸¦¿±¦¿ª¦¿£¦¿œ¦¿•¦¿ަ¿‡¦¿€¦¿y¦¿r¦¿k¦¿d¦¿]¦¿V¦¿O¦¿H¦¿A¦¿:¦¿3¦¿,¦¿%¦¿¦¿¦¿¦¿ ¦¿¦¿û¥¿ô¥¿í¥¿楿ߥ¿Ø¥¿Ñ¥¿Ê¥¿Ã¥¿¼¥¿µ¥¿®¥¿§¥¿ ¥¿™¥¿’¥¿‹¥¿„¥¿}¥¿v¥¿o¥¿h¥¿a¥¿Z¥¿S¥¿L¥¿E¥¿>¥¿7¥¿0¥¿)¥¿"¥¿¥¿¥¿ ¥¿¥¿ÿ¤¿ø¤¿ñ¤¿ꤿ㤿ܤ¿Õ¤¿Τ¿Ǥ¿À¤¿¹¤¿²¤¿«¤¿¤¤¿¤¿–¤¿¤¿ˆ¤¿¤¿z¤¿s¤¿l¤¿e¤¿^¤¿W¤¿P¤¿I¤¿B¤¿;¤¿4¤¿-¤¿&¤¿¤¿¤¿¤¿ ¤¿¤¿ü£¿õ£¿磿ࣿÙ£¿Ò£¿Ë£¿Ä£¿½£¿¶£¿¯£¿¨£¿¡£¿š£¿“£¿Œ£¿…£¿~£¿w£¿p£¿i£¿b£¿[£¿T£¿M£¿F£¿?£¿8£¿1£¿*£¿#£¿£¿£¿£¿£¿£¿ù¢¿ò¢¿뢿䢿Ý¢¿Ö¢¿Ï¢¿È¢¿Á¢¿º¢¿³¢¿¬¢¿¥¢¿ž¢¿—¢¿¢¿‰¢¿‚¢¿{¢¿t¢¿m¢¿f¢¿_¢¿X¢¿Q¢¿J¢¿C¢¿<¢¿5¢¿.¢¿'¢¿ ¢¿¢¿¢¿ ¢¿¢¿ý¡¿ö¡¿ï¡¿è¡¿á¡¿Ú¡¿Ó¡¿Ì¡¿Å¡¿¾¡¿·¡¿°¡¿©¡¿¢¡¿›¡¿”¡¿¡¿†¡¿¡¿x¡¿q¡¿j¡¿c¡¿\¡¿U¡¿N¡¿G¡¿@¡¿9¡¿2¡¿+¡¿$¡¿¡¿¡¿¡¿¡¿¡¿ú ¿ó ¿ì ¿å ¿Þ ¿× ¿Р¿É ¿ ¿» ¿´ ¿­ ¿¦ ¿Ÿ ¿˜ ¿‘ ¿Š ¿ƒ ¿| ¿u ¿n ¿g ¿` ¿Y ¿R ¿K ¿D ¿= ¿6 ¿/ ¿( ¿! ¿ ¿ ¿  ¿ ¿þŸ¿÷Ÿ¿ðŸ¿響⟿ÛŸ¿ÔŸ¿ÍŸ¿ÆŸ¿¿Ÿ¿¸Ÿ¿±Ÿ¿ªŸ¿£Ÿ¿œŸ¿•Ÿ¿ŽŸ¿‡Ÿ¿€Ÿ¿yŸ¿rŸ¿kŸ¿dŸ¿]Ÿ¿VŸ¿OŸ¿HŸ¿AŸ¿:Ÿ¿3Ÿ¿,Ÿ¿%Ÿ¿Ÿ¿Ÿ¿Ÿ¿ Ÿ¿Ÿ¿ûž¿ôž¿íž¿æž¿ßž¿Øž¿Ñž¿Êž¿Þ¿¼ž¿µž¿®ž¿§ž¿ ž¿™ž¿’ž¿‹ž¿„ž¿}ž¿vž¿ož¿hž¿až¿Zž¿Sž¿Lž¿Ež¿>ž¿7ž¿0ž¿)ž¿"ž¿ž¿ž¿ ž¿ž¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿üœ¿õœ¿眿àœ¿Ùœ¿Òœ¿Ëœ¿Äœ¿½œ¿¶œ¿¯œ¿¨œ¿¡œ¿šœ¿“œ¿Œœ¿…œ¿~œ¿wœ¿pœ¿iœ¿bœ¿[œ¿Tœ¿Mœ¿Fœ¿?œ¿8œ¿1œ¿*œ¿#œ¿œ¿œ¿œ¿œ¿œ¿ù›¿ò›¿뛿䛿Ý›¿Ö›¿Ï›¿È›¿Á›¿º›¿³›¿¬›¿¥›¿ž›¿—›¿›¿‰›¿‚›¿{›¿t›¿m›¿f›¿_›¿X›¿Q›¿J›¿C›¿<›¿5›¿.›¿'›¿ ›¿›¿›¿ ›¿›¿ýš¿öš¿ïš¿èš¿áš¿Úš¿Óš¿Ìš¿Åš¿¾š¿·š¿°š¿©š¿¢š¿›š¿”š¿š¿†š¿š¿xš¿qš¿jš¿cš¿\š¿Uš¿Nš¿Gš¿@š¿9š¿2š¿+š¿$š¿š¿š¿š¿š¿š¿ú™¿ó™¿왿噿Þ™¿×™¿Й¿É™¿™¿»™¿´™¿­™¿¦™¿Ÿ™¿˜™¿‘™¿Š™¿ƒ™¿|™¿u™¿n™¿g™¿`™¿Y™¿R™¿K™¿D™¿=™¿6™¿/™¿(™¿!™¿™¿™¿ ™¿™¿þ˜¿÷˜¿ð˜¿阿☿Û˜¿Ô˜¿͘¿Ƙ¿¿˜¿¸˜¿±˜¿ª˜¿£˜¿œ˜¿•˜¿Ž˜¿‡˜¿€˜¿y˜¿r˜¿k˜¿d˜¿]˜¿V˜¿O˜¿H˜¿A˜¿:˜¿3˜¿,˜¿%˜¿˜¿˜¿˜¿ ˜¿˜¿û—¿ô—¿í—¿æ—¿ß—¿Ø—¿Ñ—¿Ê—¿׿¼—¿µ—¿®—¿§—¿ —¿™—¿’—¿‹—¿„—¿}—¿v—¿o—¿h—¿a—¿Z—¿S—¿L—¿E—¿>—¿7—¿0—¿)—¿"—¿—¿—¿ —¿—¿ÿ–¿ø–¿ñ–¿ê–¿ã–¿Ü–¿Õ–¿Ζ¿Ç–¿À–¿¹–¿²–¿«–¿¤–¿–¿––¿–¿ˆ–¿–¿z–¿s–¿l–¿e–¿^–¿W–¿P–¿I–¿B–¿;–¿4–¿-–¿&–¿–¿–¿–¿ –¿–¿ü•¿õ•¿î•¿ç•¿à•¿Ù•¿Ò•¿Ë•¿Ä•¿½•¿¶•¿¯•¿¨•¿¡•¿š•¿“•¿Œ•¿…•¿~•¿w•¿p•¿i•¿b•¿[•¿T•¿M•¿F•¿?•¿8•¿1•¿*•¿#•¿•¿•¿•¿•¿•¿ù”¿ò”¿딿䔿Ý”¿Ö”¿Ï”¿È”¿Á”¿º”¿³”¿¬”¿¥”¿ž”¿—”¿”¿‰”¿‚”¿{”¿t”¿m”¿f”¿_”¿X”¿Q”¿J”¿C”¿<”¿5”¿.”¿'”¿ ”¿”¿”¿ ”¿”¿ý“¿ö“¿ï“¿è“¿á“¿Ú“¿Ó“¿Ì“¿Å“¿¾“¿·“¿°“¿©“¿¢“¿›“¿”“¿“¿†“¿“¿x“¿q“¿j“¿c“¿\“¿U“¿N“¿G“¿@“¿9“¿2“¿+“¿$“¿“¿“¿“¿“¿“¿ú’¿ó’¿ì’¿å’¿Þ’¿×’¿Ð’¿É’¿Â’¿»’¿´’¿­’¿¦’¿Ÿ’¿˜’¿‘’¿Š’¿ƒ’¿|’¿u’¿n’¿g’¿`’¿Y’¿R’¿K’¿D’¿=’¿6’¿/’¿(’¿!’¿’¿’¿ ’¿’¿þ‘¿÷‘¿ð‘¿é‘¿â‘¿Û‘¿Ô‘¿Í‘¿Æ‘¿¿‘¿¸‘¿±‘¿ª‘¿£‘¿œ‘¿•‘¿Ž‘¿‡‘¿€‘¿y‘¿r‘¿k‘¿d‘¿]‘¿V‘¿O‘¿H‘¿A‘¿:‘¿3‘¿,‘¿%‘¿‘¿‘¿‘¿ ‘¿‘¿û¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿ÿ¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿üŽ¿õŽ¿玿àŽ¿ÙŽ¿ÒŽ¿ËŽ¿ÄŽ¿½Ž¿¶Ž¿¯Ž¿¨Ž¿¡Ž¿šŽ¿“Ž¿ŒŽ¿…Ž¿~Ž¿wŽ¿pŽ¿iŽ¿bŽ¿[Ž¿TŽ¿MŽ¿FŽ¿?Ž¿8Ž¿1Ž¿*Ž¿#Ž¿Ž¿Ž¿Ž¿Ž¿Ž¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ýŒ¿öŒ¿茿ጿÚŒ¿ÓŒ¿ÌŒ¿ÅŒ¿¾Œ¿·Œ¿°Œ¿©Œ¿¢Œ¿›Œ¿”Œ¿Œ¿†Œ¿Œ¿xŒ¿qŒ¿jŒ¿cŒ¿\Œ¿UŒ¿NŒ¿GŒ¿@Œ¿9Œ¿2Œ¿+Œ¿$Œ¿Œ¿Œ¿Œ¿Œ¿Œ¿ú‹¿ó‹¿ì‹¿å‹¿Þ‹¿׋¿Ћ¿É‹¿‹¿»‹¿´‹¿­‹¿¦‹¿Ÿ‹¿˜‹¿‘‹¿Š‹¿ƒ‹¿|‹¿u‹¿n‹¿g‹¿`‹¿Y‹¿R‹¿K‹¿D‹¿=‹¿6‹¿/‹¿(‹¿!‹¿‹¿‹¿ ‹¿‹¿þŠ¿÷Š¿ðŠ¿銿⊿ÛŠ¿ÔŠ¿ÍŠ¿ÆŠ¿¿Š¿¸Š¿±Š¿ªŠ¿£Š¿œŠ¿•Š¿ŽŠ¿‡Š¿€Š¿yŠ¿rŠ¿kŠ¿dŠ¿]Š¿VŠ¿OŠ¿HŠ¿AŠ¿:Š¿3Š¿,Š¿%Š¿Š¿Š¿Š¿ Š¿Š¿û‰¿ô‰¿퉿承߉¿؉¿щ¿ʉ¿É¿¼‰¿µ‰¿®‰¿§‰¿ ‰¿™‰¿’‰¿‹‰¿„‰¿}‰¿v‰¿o‰¿h‰¿a‰¿Z‰¿S‰¿L‰¿E‰¿>‰¿7‰¿0‰¿)‰¿"‰¿‰¿‰¿ ‰¿‰¿ÿˆ¿øˆ¿ñˆ¿ꈿ㈿܈¿Õˆ¿Έ¿Lj¿Àˆ¿¹ˆ¿²ˆ¿«ˆ¿¤ˆ¿ˆ¿–ˆ¿ˆ¿ˆˆ¿ˆ¿zˆ¿sˆ¿lˆ¿eˆ¿^ˆ¿Wˆ¿Pˆ¿Iˆ¿Bˆ¿;ˆ¿4ˆ¿-ˆ¿&ˆ¿ˆ¿ˆ¿ˆ¿ ˆ¿ˆ¿ü‡¿õ‡¿燿à‡¿Ù‡¿Ò‡¿ˇ¿ć¿½‡¿¶‡¿¯‡¿¨‡¿¡‡¿š‡¿“‡¿Œ‡¿…‡¿~‡¿w‡¿p‡¿i‡¿b‡¿[‡¿T‡¿M‡¿F‡¿?‡¿8‡¿1‡¿*‡¿#‡¿‡¿‡¿‡¿‡¿‡¿ù†¿ò†¿놿䆿݆¿Ö†¿φ¿Ȇ¿Á†¿º†¿³†¿¬†¿¥†¿ž†¿—†¿†¿‰†¿‚†¿{†¿t†¿m†¿f†¿_†¿X†¿Q†¿J†¿C†¿<†¿5†¿.†¿'†¿ †¿†¿†¿ †¿†¿ý…¿ö…¿ï…¿è…¿á…¿Ú…¿Ó…¿Ì…¿Å…¿¾…¿·…¿°…¿©…¿¢…¿›…¿”…¿…¿†…¿…¿x…¿q…¿j…¿c…¿\…¿U…¿N…¿G…¿@…¿9…¿2…¿+…¿$…¿…¿…¿…¿…¿…¿ú„¿ó„¿ì„¿å„¿Þ„¿ׄ¿Є¿É„¿„¿»„¿´„¿­„¿¦„¿Ÿ„¿˜„¿‘„¿Š„¿ƒ„¿|„¿u„¿n„¿g„¿`„¿Y„¿R„¿K„¿D„¿=„¿6„¿/„¿(„¿!„¿„¿„¿ „¿„¿þƒ¿÷ƒ¿ðƒ¿郿⃿Ûƒ¿Ôƒ¿̓¿ƃ¿¿ƒ¿¸ƒ¿±ƒ¿ªƒ¿£ƒ¿œƒ¿•ƒ¿Žƒ¿‡ƒ¿€ƒ¿yƒ¿rƒ¿kƒ¿dƒ¿]ƒ¿Vƒ¿Oƒ¿Hƒ¿Aƒ¿:ƒ¿3ƒ¿,ƒ¿%ƒ¿ƒ¿ƒ¿ƒ¿ ƒ¿ƒ¿û‚¿ô‚¿í‚¿æ‚¿ß‚¿Ø‚¿Ñ‚¿Ê‚¿¿¼‚¿µ‚¿®‚¿§‚¿ ‚¿™‚¿’‚¿‹‚¿„‚¿}‚¿v‚¿o‚¿h‚¿a‚¿Z‚¿S‚¿L‚¿E‚¿>‚¿7‚¿0‚¿)‚¿"‚¿‚¿‚¿ ‚¿‚¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü€¿õ€¿瀿à€¿Ù€¿Ò€¿Ë€¿Ä€¿½€¿¶€¿¯€¿¨€¿¡€¿š€¿“€¿Œ€¿…€¿~€¿w€¿p€¿i€¿b€¿[€¿T€¿M€¿F€¿?€¿8€¿1€¿*€¿#€¿€¿€¿€¿€¿€¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý~¿ö~¿ï~¿è~¿á~¿Ú~¿Ó~¿Ì~¿Å~¿¾~¿·~¿°~¿©~¿¢~¿›~¿”~¿~¿†~¿~¿x~¿q~¿j~¿c~¿\~¿U~¿N~¿G~¿@~¿9~¿2~¿+~¿$~¿~¿~¿~¿~¿~¿ú}¿ó}¿ì}¿å}¿Þ}¿×}¿Ð}¿É}¿Â}¿»}¿´}¿­}¿¦}¿Ÿ}¿˜}¿‘}¿Š}¿ƒ}¿|}¿u}¿n}¿g}¿`}¿Y}¿R}¿K}¿D}¿=}¿6}¿/}¿(}¿!}¿}¿}¿ }¿}¿þ|¿÷|¿ð|¿é|¿â|¿Û|¿Ô|¿Í|¿Æ|¿¿|¿¸|¿±|¿ª|¿£|¿œ|¿•|¿Ž|¿‡|¿€|¿y|¿r|¿k|¿d|¿]|¿V|¿O|¿H|¿A|¿:|¿3|¿,|¿%|¿|¿|¿|¿ |¿|¿û{¿ô{¿í{¿æ{¿ß{¿Ø{¿Ñ{¿Ê{¿Ã{¿¼{¿µ{¿®{¿§{¿ {¿™{¿’{¿‹{¿„{¿}{¿v{¿o{¿h{¿a{¿Z{¿S{¿L{¿E{¿>{¿7{¿0{¿){¿"{¿{¿{¿ {¿{¿ÿz¿øz¿ñz¿êz¿ãz¿Üz¿Õz¿Îz¿Çz¿Àz¿¹z¿²z¿«z¿¤z¿z¿–z¿z¿ˆz¿z¿zz¿sz¿lz¿ez¿^z¿Wz¿Pz¿Iz¿Bz¿;z¿4z¿-z¿&z¿z¿z¿z¿ z¿z¿üy¿õy¿îy¿çy¿ày¿Ùy¿Òy¿Ëy¿Äy¿½y¿¶y¿¯y¿¨y¿¡y¿šy¿“y¿Œy¿…y¿~y¿wy¿py¿iy¿by¿[y¿Ty¿My¿Fy¿?y¿8y¿1y¿*y¿#y¿y¿y¿y¿y¿y¿ùx¿òx¿ëx¿äx¿Ýx¿Öx¿Ïx¿Èx¿Áx¿ºx¿³x¿¬x¿¥x¿žx¿—x¿x¿‰x¿‚x¿{x¿tx¿mx¿fx¿_x¿Xx¿Qx¿Jx¿Cx¿t¿7t¿0t¿)t¿"t¿t¿t¿ t¿t¿ÿs¿øs¿ñs¿ês¿ãs¿Üs¿Õs¿Îs¿Çs¿Às¿¹s¿²s¿«s¿¤s¿s¿–s¿s¿ˆs¿s¿zs¿ss¿ls¿es¿^s¿Ws¿Ps¿Is¿Bs¿;s¿4s¿-s¿&s¿s¿s¿s¿ s¿s¿ür¿õr¿îr¿çr¿àr¿Ùr¿Òr¿Ër¿Är¿½r¿¶r¿¯r¿¨r¿¡r¿šr¿“r¿Œr¿…r¿~r¿wr¿pr¿ir¿br¿[r¿Tr¿Mr¿Fr¿?r¿8r¿1r¿*r¿#r¿r¿r¿r¿r¿r¿ùq¿òq¿ëq¿äq¿Ýq¿Öq¿Ïq¿Èq¿Áq¿ºq¿³q¿¬q¿¥q¿žq¿—q¿q¿‰q¿‚q¿{q¿tq¿mq¿fq¿_q¿Xq¿Qq¿Jq¿Cq¿m¿7m¿0m¿)m¿"m¿m¿m¿ m¿m¿ÿl¿øl¿ñl¿êl¿ãl¿Ül¿Õl¿Îl¿Çl¿Àl¿¹l¿²l¿«l¿¤l¿l¿–l¿l¿ˆl¿l¿zl¿sl¿ll¿el¿^l¿Wl¿Pl¿Il¿Bl¿;l¿4l¿-l¿&l¿l¿l¿l¿ l¿l¿ük¿õk¿îk¿çk¿àk¿Ùk¿Òk¿Ëk¿Äk¿½k¿¶k¿¯k¿¨k¿¡k¿šk¿“k¿Œk¿…k¿~k¿wk¿pk¿ik¿bk¿[k¿Tk¿Mk¿Fk¿?k¿8k¿1k¿*k¿#k¿k¿k¿k¿k¿k¿ùj¿òj¿ëj¿äj¿Ýj¿Öj¿Ïj¿Èj¿Áj¿ºj¿³j¿¬j¿¥j¿žj¿—j¿j¿‰j¿‚j¿{j¿tj¿mj¿fj¿_j¿Xj¿Qj¿Jj¿Cj¿f¿7f¿0f¿)f¿"f¿f¿f¿ f¿f¿ÿe¿øe¿ñe¿êe¿ãe¿Üe¿Õe¿Îe¿Çe¿Àe¿¹e¿²e¿«e¿¤e¿e¿–e¿e¿ˆe¿e¿ze¿se¿le¿ee¿^e¿We¿Pe¿Ie¿Be¿;e¿4e¿-e¿&e¿e¿e¿e¿ e¿e¿üd¿õd¿îd¿çd¿àd¿Ùd¿Òd¿Ëd¿Äd¿½d¿¶d¿¯d¿¨d¿¡d¿šd¿“d¿Œd¿…d¿~d¿wd¿pd¿id¿bd¿[d¿Td¿Md¿Fd¿?d¿8d¿1d¿*d¿#d¿d¿d¿d¿d¿d¿ùc¿òc¿ëc¿äc¿Ýc¿Öc¿Ïc¿Èc¿Ác¿ºc¿³c¿¬c¿¥c¿žc¿—c¿c¿‰c¿‚c¿{c¿tc¿mc¿fc¿_c¿Xc¿Qc¿Jc¿Cc¿_¿7_¿0_¿)_¿"_¿_¿_¿ _¿_¿ÿ^¿ø^¿ñ^¿ê^¿ã^¿Ü^¿Õ^¿Î^¿Ç^¿À^¿¹^¿²^¿«^¿¤^¿^¿–^¿^¿ˆ^¿^¿z^¿s^¿l^¿e^¿^^¿W^¿P^¿I^¿B^¿;^¿4^¿-^¿&^¿^¿^¿^¿ ^¿^¿ü]¿õ]¿î]¿ç]¿à]¿Ù]¿Ò]¿Ë]¿Ä]¿½]¿¶]¿¯]¿¨]¿¡]¿š]¿“]¿Œ]¿…]¿~]¿w]¿p]¿i]¿b]¿[]¿T]¿M]¿F]¿?]¿8]¿1]¿*]¿#]¿]¿]¿]¿]¿]¿ù\¿ò\¿ë\¿ä\¿Ý\¿Ö\¿Ï\¿È\¿Á\¿º\¿³\¿¬\¿¥\¿ž\¿—\¿\¿‰\¿‚\¿{\¿t\¿m\¿f\¿_\¿X\¿Q\¿J\¿C\¿<\¿5\¿.\¿'\¿ \¿\¿\¿ \¿\¿ý[¿ö[¿ï[¿è[¿á[¿Ú[¿Ó[¿Ì[¿Å[¿¾[¿·[¿°[¿©[¿¢[¿›[¿”[¿[¿†[¿[¿x[¿q[¿j[¿c[¿\[¿U[¿N[¿G[¿@[¿9[¿2[¿+[¿$[¿[¿[¿[¿[¿[¿úZ¿óZ¿ìZ¿åZ¿ÞZ¿×Z¿ÐZ¿ÉZ¿ÂZ¿»Z¿´Z¿­Z¿¦Z¿ŸZ¿˜Z¿‘Z¿ŠZ¿ƒZ¿|Z¿uZ¿nZ¿gZ¿`Z¿YZ¿RZ¿KZ¿DZ¿=Z¿6Z¿/Z¿(Z¿!Z¿Z¿Z¿ Z¿Z¿þY¿÷Y¿ðY¿éY¿âY¿ÛY¿ÔY¿ÍY¿ÆY¿¿Y¿¸Y¿±Y¿ªY¿£Y¿œY¿•Y¿ŽY¿‡Y¿€Y¿yY¿rY¿kY¿dY¿]Y¿VY¿OY¿HY¿AY¿:Y¿3Y¿,Y¿%Y¿Y¿Y¿Y¿ Y¿Y¿ûX¿ôX¿íX¿æX¿ßX¿ØX¿ÑX¿ÊX¿ÃX¿¼X¿µX¿®X¿§X¿ X¿™X¿’X¿‹X¿„X¿}X¿vX¿oX¿hX¿aX¿ZX¿SX¿LX¿EX¿>X¿7X¿0X¿)X¿"X¿X¿X¿ X¿X¿ÿW¿øW¿ñW¿êW¿ãW¿ÜW¿ÕW¿ÎW¿ÇW¿ÀW¿¹W¿²W¿«W¿¤W¿W¿–W¿W¿ˆW¿W¿zW¿sW¿lW¿eW¿^W¿WW¿PW¿IW¿BW¿;W¿4W¿-W¿&W¿W¿W¿W¿ W¿W¿üV¿õV¿îV¿çV¿àV¿ÙV¿ÒV¿ËV¿ÄV¿½V¿¶V¿¯V¿¨V¿¡V¿šV¿“V¿ŒV¿…V¿~V¿wV¿pV¿iV¿bV¿[V¿TV¿MV¿FV¿?V¿8V¿1V¿*V¿#V¿V¿V¿V¿V¿V¿ùU¿òU¿ëU¿äU¿ÝU¿ÖU¿ÏU¿ÈU¿ÁU¿ºU¿³U¿¬U¿¥U¿žU¿—U¿U¿‰U¿‚U¿{U¿tU¿mU¿fU¿_U¿XU¿QU¿JU¿CU¿Q¿7Q¿0Q¿)Q¿"Q¿Q¿Q¿ Q¿Q¿ÿP¿øP¿ñP¿êP¿ãP¿ÜP¿ÕP¿ÎP¿ÇP¿ÀP¿¹P¿²P¿«P¿¤P¿P¿–P¿P¿ˆP¿P¿zP¿sP¿lP¿eP¿^P¿WP¿PP¿IP¿BP¿;P¿4P¿-P¿&P¿P¿P¿P¿ P¿P¿üO¿õO¿îO¿çO¿àO¿ÙO¿ÒO¿ËO¿ÄO¿½O¿¶O¿¯O¿¨O¿¡O¿šO¿“O¿ŒO¿…O¿~O¿wO¿pO¿iO¿bO¿[O¿TO¿MO¿FO¿?O¿8O¿1O¿*O¿#O¿O¿O¿O¿O¿O¿ùN¿òN¿ëN¿äN¿ÝN¿ÖN¿ÏN¿ÈN¿ÁN¿ºN¿³N¿¬N¿¥N¿žN¿—N¿N¿‰N¿‚N¿{N¿tN¿mN¿fN¿_N¿XN¿QN¿JN¿CN¿J¿7J¿0J¿)J¿"J¿J¿J¿ J¿J¿ÿI¿øI¿ñI¿êI¿ãI¿ÜI¿ÕI¿ÎI¿ÇI¿ÀI¿¹I¿²I¿«I¿¤I¿I¿–I¿I¿ˆI¿I¿zI¿sI¿lI¿eI¿^I¿WI¿PI¿II¿BI¿;I¿4I¿-I¿&I¿I¿I¿I¿ I¿I¿üH¿õH¿îH¿çH¿àH¿ÙH¿ÒH¿ËH¿ÄH¿½H¿¶H¿¯H¿¨H¿¡H¿šH¿“H¿ŒH¿…H¿~H¿wH¿pH¿iH¿bH¿[H¿TH¿MH¿FH¿?H¿8H¿1H¿*H¿#H¿H¿H¿H¿H¿H¿ùG¿òG¿ëG¿äG¿ÝG¿ÖG¿ÏG¿ÈG¿ÁG¿ºG¿³G¿¬G¿¥G¿žG¿—G¿G¿‰G¿‚G¿{G¿tG¿mG¿fG¿_G¿XG¿QG¿JG¿CG¿C¿7C¿0C¿)C¿"C¿C¿C¿ C¿C¿ÿB¿øB¿ñB¿êB¿ãB¿ÜB¿ÕB¿ÎB¿ÇB¿ÀB¿¹B¿²B¿«B¿¤B¿B¿–B¿B¿ˆB¿B¿zB¿sB¿lB¿eB¿^B¿WB¿PB¿IB¿BB¿;B¿4B¿-B¿&B¿B¿B¿B¿ B¿B¿üA¿õA¿îA¿çA¿àA¿ÙA¿ÒA¿ËA¿ÄA¿½A¿¶A¿¯A¿¨A¿¡A¿šA¿“A¿ŒA¿…A¿~A¿wA¿pA¿iA¿bA¿[A¿TA¿MA¿FA¿?A¿8A¿1A¿*A¿#A¿A¿A¿A¿A¿A¿ù@¿ò@¿ë@¿ä@¿Ý@¿Ö@¿Ï@¿È@¿Á@¿º@¿³@¿¬@¿¥@¿ž@¿—@¿@¿‰@¿‚@¿{@¿t@¿m@¿f@¿_@¿X@¿Q@¿J@¿C@¿<@¿5@¿.@¿'@¿ @¿@¿@¿ @¿@¿ý?¿ö?¿ï?¿è?¿á?¿Ú?¿Ó?¿Ì?¿Å?¿¾?¿·?¿°?¿©?¿¢?¿›?¿”?¿?¿†?¿?¿x?¿q?¿j?¿c?¿\?¿U?¿N?¿G?¿@?¿9?¿2?¿+?¿$?¿?¿?¿?¿?¿?¿ú>¿ó>¿ì>¿å>¿Þ>¿×>¿Ð>¿É>¿Â>¿»>¿´>¿­>¿¦>¿Ÿ>¿˜>¿‘>¿Š>¿ƒ>¿|>¿u>¿n>¿g>¿`>¿Y>¿R>¿K>¿D>¿=>¿6>¿/>¿(>¿!>¿>¿>¿ >¿>¿þ=¿÷=¿ð=¿é=¿â=¿Û=¿Ô=¿Í=¿Æ=¿¿=¿¸=¿±=¿ª=¿£=¿œ=¿•=¿Ž=¿‡=¿€=¿y=¿r=¿k=¿d=¿]=¿V=¿O=¿H=¿A=¿:=¿3=¿,=¿%=¿=¿=¿=¿ =¿=¿û<¿ô<¿í<¿æ<¿ß<¿Ø<¿Ñ<¿Ê<¿Ã<¿¼<¿µ<¿®<¿§<¿ <¿™<¿’<¿‹<¿„<¿}<¿v<¿o<¿h<¿a<¿Z<¿S<¿L<¿E<¿><¿7<¿0<¿)<¿"<¿<¿<¿ <¿<¿ÿ;¿ø;¿ñ;¿ê;¿ã;¿Ü;¿Õ;¿Î;¿Ç;¿À;¿¹;¿²;¿«;¿¤;¿;¿–;¿;¿ˆ;¿;¿z;¿s;¿l;¿e;¿^;¿W;¿P;¿I;¿B;¿;;¿4;¿-;¿&;¿;¿;¿;¿ ;¿;¿ü:¿õ:¿î:¿ç:¿à:¿Ù:¿Ò:¿Ë:¿Ä:¿½:¿¶:¿¯:¿¨:¿¡:¿š:¿“:¿Œ:¿…:¿~:¿w:¿p:¿i:¿b:¿[:¿T:¿M:¿F:¿?:¿8:¿1:¿*:¿#:¿:¿:¿:¿:¿:¿ù9¿ò9¿ë9¿ä9¿Ý9¿Ö9¿Ï9¿È9¿Á9¿º9¿³9¿¬9¿¥9¿ž9¿—9¿9¿‰9¿‚9¿{9¿t9¿m9¿f9¿_9¿X9¿Q9¿J9¿C9¿<9¿59¿.9¿'9¿ 9¿9¿9¿ 9¿9¿ý8¿ö8¿ï8¿è8¿á8¿Ú8¿Ó8¿Ì8¿Å8¿¾8¿·8¿°8¿©8¿¢8¿›8¿”8¿8¿†8¿8¿x8¿q8¿j8¿c8¿\8¿U8¿N8¿G8¿@8¿98¿28¿+8¿$8¿8¿8¿8¿8¿8¿ú7¿ó7¿ì7¿å7¿Þ7¿×7¿Ð7¿É7¿Â7¿»7¿´7¿­7¿¦7¿Ÿ7¿˜7¿‘7¿Š7¿ƒ7¿|7¿u7¿n7¿g7¿`7¿Y7¿R7¿K7¿D7¿=7¿67¿/7¿(7¿!7¿7¿7¿ 7¿7¿þ6¿÷6¿ð6¿é6¿â6¿Û6¿Ô6¿Í6¿Æ6¿¿6¿¸6¿±6¿ª6¿£6¿œ6¿•6¿Ž6¿‡6¿€6¿y6¿r6¿k6¿d6¿]6¿V6¿O6¿H6¿A6¿:6¿36¿,6¿%6¿6¿6¿6¿ 6¿6¿û5¿ô5¿í5¿æ5¿ß5¿Ø5¿Ñ5¿Ê5¿Ã5¿¼5¿µ5¿®5¿§5¿ 5¿™5¿’5¿‹5¿„5¿}5¿v5¿o5¿h5¿a5¿Z5¿S5¿L5¿E5¿>5¿75¿05¿)5¿"5¿5¿5¿ 5¿5¿ÿ4¿ø4¿ñ4¿ê4¿ã4¿Ü4¿Õ4¿Î4¿Ç4¿À4¿¹4¿²4¿«4¿¤4¿4¿–4¿4¿ˆ4¿4¿z4¿s4¿l4¿e4¿^4¿W4¿P4¿I4¿B4¿;4¿44¿-4¿&4¿4¿4¿4¿ 4¿4¿ü3¿õ3¿î3¿ç3¿à3¿Ù3¿Ò3¿Ë3¿Ä3¿½3¿¶3¿¯3¿¨3¿¡3¿š3¿“3¿Œ3¿…3¿~3¿w3¿p3¿i3¿b3¿[3¿T3¿M3¿F3¿?3¿83¿13¿*3¿#3¿3¿3¿3¿3¿3¿ù2¿ò2¿ë2¿ä2¿Ý2¿Ö2¿Ï2¿È2¿Á2¿º2¿³2¿¬2¿¥2¿ž2¿—2¿2¿‰2¿‚2¿{2¿t2¿m2¿f2¿_2¿X2¿Q2¿J2¿C2¿<2¿52¿.2¿'2¿ 2¿2¿2¿ 2¿2¿ý1¿ö1¿ï1¿è1¿á1¿Ú1¿Ó1¿Ì1¿Å1¿¾1¿·1¿°1¿©1¿¢1¿›1¿”1¿1¿†1¿1¿x1¿q1¿j1¿c1¿\1¿U1¿N1¿G1¿@1¿91¿21¿+1¿$1¿1¿1¿1¿1¿1¿ú0¿ó0¿ì0¿å0¿Þ0¿×0¿Ð0¿É0¿Â0¿»0¿´0¿­0¿¦0¿Ÿ0¿˜0¿‘0¿Š0¿ƒ0¿|0¿u0¿n0¿g0¿`0¿Y0¿R0¿K0¿D0¿=0¿60¿/0¿(0¿!0¿0¿0¿ 0¿0¿þ/¿÷/¿ð/¿é/¿â/¿Û/¿Ô/¿Í/¿Æ/¿¿/¿¸/¿±/¿ª/¿£/¿œ/¿•/¿Ž/¿‡/¿€/¿y/¿r/¿k/¿d/¿]/¿V/¿O/¿H/¿A/¿:/¿3/¿,/¿%/¿/¿/¿/¿ /¿/¿û.¿ô.¿í.¿æ.¿ß.¿Ø.¿Ñ.¿Ê.¿Ã.¿¼.¿µ.¿®.¿§.¿ .¿™.¿’.¿‹.¿„.¿}.¿v.¿o.¿h.¿a.¿Z.¿S.¿L.¿E.¿>.¿7.¿0.¿).¿".¿.¿.¿ .¿.¿ÿ-¿ø-¿ñ-¿ê-¿ã-¿Ü-¿Õ-¿Î-¿Ç-¿À-¿¹-¿²-¿«-¿¤-¿-¿–-¿-¿ˆ-¿-¿z-¿s-¿l-¿e-¿^-¿W-¿P-¿I-¿B-¿;-¿4-¿--¿&-¿-¿-¿-¿ -¿-¿ü,¿õ,¿î,¿ç,¿à,¿Ù,¿Ò,¿Ë,¿Ä,¿½,¿¶,¿¯,¿¨,¿¡,¿š,¿“,¿Œ,¿…,¿~,¿w,¿p,¿i,¿b,¿[,¿T,¿M,¿F,¿?,¿8,¿1,¿*,¿#,¿,¿,¿,¿,¿,¿ù+¿ò+¿ë+¿ä+¿Ý+¿Ö+¿Ï+¿È+¿Á+¿º+¿³+¿¬+¿¥+¿ž+¿—+¿+¿‰+¿‚+¿{+¿t+¿m+¿f+¿_+¿X+¿Q+¿J+¿C+¿<+¿5+¿.+¿'+¿ +¿+¿+¿ +¿+¿ý*¿ö*¿ï*¿è*¿á*¿Ú*¿Ó*¿Ì*¿Å*¿¾*¿·*¿°*¿©*¿¢*¿›*¿”*¿*¿†*¿*¿x*¿q*¿j*¿c*¿\*¿U*¿N*¿G*¿@*¿9*¿2*¿+*¿$*¿*¿*¿*¿*¿*¿ú)¿ó)¿ì)¿å)¿Þ)¿×)¿Ð)¿É)¿Â)¿»)¿´)¿­)¿¦)¿Ÿ)¿˜)¿‘)¿Š)¿ƒ)¿|)¿u)¿n)¿g)¿`)¿Y)¿R)¿K)¿D)¿=)¿6)¿/)¿()¿!)¿)¿)¿ )¿)¿þ(¿÷(¿ð(¿é(¿â(¿Û(¿Ô(¿Í(¿Æ(¿¿(¿¸(¿±(¿ª(¿£(¿œ(¿•(¿Ž(¿‡(¿€(¿y(¿r(¿k(¿d(¿](¿V(¿O(¿H(¿A(¿:(¿3(¿,(¿%(¿(¿(¿(¿ (¿(¿û'¿ô'¿í'¿æ'¿ß'¿Ø'¿Ñ'¿Ê'¿Ã'¿¼'¿µ'¿®'¿§'¿ '¿™'¿’'¿‹'¿„'¿}'¿v'¿o'¿h'¿a'¿Z'¿S'¿L'¿E'¿>'¿7'¿0'¿)'¿"'¿'¿'¿ '¿'¿ÿ&¿ø&¿ñ&¿ê&¿ã&¿Ü&¿Õ&¿Î&¿Ç&¿À&¿¹&¿²&¿«&¿¤&¿&¿–&¿&¿ˆ&¿&¿z&¿s&¿l&¿e&¿^&¿W&¿P&¿I&¿B&¿;&¿4&¿-&¿&&¿&¿&¿&¿ &¿&¿ü%¿õ%¿î%¿ç%¿à%¿Ù%¿Ò%¿Ë%¿Ä%¿½%¿¶%¿¯%¿¨%¿¡%¿š%¿“%¿Œ%¿…%¿~%¿w%¿p%¿i%¿b%¿[%¿T%¿M%¿F%¿?%¿8%¿1%¿*%¿#%¿%¿%¿%¿%¿%¿ù$¿ò$¿ë$¿ä$¿Ý$¿Ö$¿Ï$¿È$¿Á$¿º$¿³$¿¬$¿¥$¿ž$¿—$¿$¿‰$¿‚$¿{$¿t$¿m$¿f$¿_$¿X$¿Q$¿J$¿C$¿<$¿5$¿.$¿'$¿ $¿$¿$¿ $¿$¿ý#¿ö#¿ï#¿è#¿á#¿Ú#¿Ó#¿Ì#¿Å#¿¾#¿·#¿°#¿©#¿¢#¿›#¿”#¿#¿†#¿#¿x#¿q#¿j#¿c#¿\#¿U#¿N#¿G#¿@#¿9#¿2#¿+#¿$#¿#¿#¿#¿#¿#¿ú"¿ó"¿ì"¿å"¿Þ"¿×"¿Ð"¿É"¿Â"¿»"¿´"¿­"¿¦"¿Ÿ"¿˜"¿‘"¿Š"¿ƒ"¿|"¿u"¿n"¿g"¿`"¿Y"¿R"¿K"¿D"¿="¿6"¿/"¿("¿!"¿"¿"¿ "¿"¿þ!¿÷!¿ð!¿é!¿â!¿Û!¿Ô!¿Í!¿Æ!¿¿!¿¸!¿±!¿ª!¿£!¿œ!¿•!¿Ž!¿‡!¿€!¿y!¿r!¿k!¿d!¿]!¿V!¿O!¿H!¿A!¿:!¿3!¿,!¿%!¿!¿!¿!¿ !¿!¿û ¿ô ¿í ¿æ ¿ß ¿Ø ¿Ñ ¿Ê ¿à ¿¼ ¿µ ¿® ¿§ ¿  ¿™ ¿’ ¿‹ ¿„ ¿} ¿v ¿o ¿h ¿a ¿Z ¿S ¿L ¿E ¿> ¿7 ¿0 ¿) ¿" ¿ ¿ ¿ ¿ ¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿Î¿Ç¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¿ó¿ì¿å¿Þ¿×¿Ð¿É¿Â¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿Ã¿¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿Î¿Ç¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¿ó¿ì¿å¿Þ¿×¿Ð¿É¿Â¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿Ã¿¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿Î¿Ç¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú ¿ó ¿ì ¿å ¿Þ ¿× ¿Ð ¿É ¿ ¿» ¿´ ¿­ ¿¦ ¿Ÿ ¿˜ ¿‘ ¿Š ¿ƒ ¿| ¿u ¿n ¿g ¿` ¿Y ¿R ¿K ¿D ¿= ¿6 ¿/ ¿( ¿! ¿ ¿ ¿ ¿ ¿þ ¿÷ ¿ð ¿é ¿â ¿Û ¿Ô ¿Í ¿Æ ¿¿ ¿¸ ¿± ¿ª ¿£ ¿œ ¿• ¿Ž ¿‡ ¿€ ¿y ¿r ¿k ¿d ¿] ¿V ¿O ¿H ¿A ¿: ¿3 ¿, ¿% ¿ ¿ ¿ ¿ ¿ ¿û ¿ô ¿í ¿æ ¿ß ¿Ø ¿Ñ ¿Ê ¿à ¿¼ ¿µ ¿® ¿§ ¿  ¿™ ¿’ ¿‹ ¿„ ¿} ¿v ¿o ¿h ¿a ¿Z ¿S ¿L ¿E ¿> ¿7 ¿0 ¿) ¿" ¿ ¿ ¿ ¿ ¿ÿ ¿ø ¿ñ ¿ê ¿ã ¿Ü ¿Õ ¿Î ¿Ç ¿À ¿¹ ¿² ¿« ¿¤ ¿ ¿– ¿ ¿ˆ ¿ ¿z ¿s ¿l ¿e ¿^ ¿W ¿P ¿I ¿B ¿; ¿4 ¿- ¿& ¿ ¿ ¿ ¿ ¿ ¿ü ¿õ ¿î ¿ç ¿à ¿Ù ¿Ò ¿Ë ¿Ä ¿½ ¿¶ ¿¯ ¿¨ ¿¡ ¿š ¿“ ¿Œ ¿… ¿~ ¿w ¿p ¿i ¿b ¿[ ¿T ¿M ¿F ¿? ¿8 ¿1 ¿* ¿# ¿ ¿ ¿ ¿ ¿ ¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¿ó¿ì¿å¿Þ¿×¿Ð¿É¿Â¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿Ã¿¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿Î¿Ç¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿úÿ¾óÿ¾ìÿ¾åÿ¾Þÿ¾×ÿ¾Ðÿ¾Éÿ¾Âÿ¾»ÿ¾´ÿ¾­ÿ¾¦ÿ¾Ÿÿ¾˜ÿ¾‘ÿ¾Šÿ¾ƒÿ¾|ÿ¾uÿ¾nÿ¾gÿ¾`ÿ¾Yÿ¾Rÿ¾Kÿ¾Dÿ¾=ÿ¾6ÿ¾/ÿ¾(ÿ¾!ÿ¾ÿ¾ÿ¾ ÿ¾ÿ¾þþ¾÷þ¾ðþ¾éþ¾âþ¾Ûþ¾Ôþ¾Íþ¾Æþ¾¿þ¾¸þ¾±þ¾ªþ¾£þ¾œþ¾•þ¾Žþ¾‡þ¾€þ¾yþ¾rþ¾kþ¾dþ¾]þ¾Vþ¾Oþ¾Hþ¾Aþ¾:þ¾3þ¾,þ¾%þ¾þ¾þ¾þ¾ þ¾þ¾ûý¾ôý¾íý¾æý¾ßý¾Øý¾Ñý¾Êý¾Ãý¾¼ý¾µý¾®ý¾§ý¾ ý¾™ý¾’ý¾‹ý¾„ý¾}ý¾vý¾oý¾hý¾aý¾Zý¾Sý¾Lý¾Eý¾>ý¾7ý¾0ý¾)ý¾"ý¾ý¾ý¾ ý¾ý¾ÿü¾øü¾ñü¾êü¾ãü¾Üü¾Õü¾Îü¾Çü¾Àü¾¹ü¾²ü¾«ü¾¤ü¾ü¾–ü¾ü¾ˆü¾ü¾zü¾sü¾lü¾eü¾^ü¾Wü¾Pü¾Iü¾Bü¾;ü¾4ü¾-ü¾&ü¾ü¾ü¾ü¾ ü¾ü¾üû¾õû¾îû¾çû¾àû¾Ùû¾Òû¾Ëû¾Äû¾½û¾¶û¾¯û¾¨û¾¡û¾šû¾“û¾Œû¾…û¾~û¾wû¾pû¾iû¾bû¾[û¾Tû¾Mû¾Fû¾?û¾8û¾1û¾*û¾#û¾û¾û¾û¾û¾û¾ùú¾òú¾ëú¾äú¾Ýú¾Öú¾Ïú¾Èú¾Áú¾ºú¾³ú¾¬ú¾¥ú¾žú¾—ú¾ú¾‰ú¾‚ú¾{ú¾tú¾mú¾fú¾_ú¾Xú¾Qú¾Jú¾Cú¾<ú¾5ú¾.ú¾'ú¾ ú¾ú¾ú¾ ú¾ú¾ýù¾öù¾ïù¾èù¾áù¾Úù¾Óù¾Ìù¾Åù¾¾ù¾·ù¾°ù¾©ù¾¢ù¾›ù¾”ù¾ù¾†ù¾ù¾xù¾qù¾jù¾cù¾\ù¾Uù¾Nù¾Gù¾@ù¾9ù¾2ù¾+ù¾$ù¾ù¾ù¾ù¾ù¾ù¾úø¾óø¾ìø¾åø¾Þø¾×ø¾Ðø¾Éø¾Âø¾»ø¾´ø¾­ø¾¦ø¾Ÿø¾˜ø¾‘ø¾Šø¾ƒø¾|ø¾uø¾nø¾gø¾`ø¾Yø¾Rø¾Kø¾Dø¾=ø¾6ø¾/ø¾(ø¾!ø¾ø¾ø¾ ø¾ø¾þ÷¾÷÷¾ð÷¾é÷¾â÷¾Û÷¾Ô÷¾Í÷¾Æ÷¾¿÷¾¸÷¾±÷¾ª÷¾£÷¾œ÷¾•÷¾Ž÷¾‡÷¾€÷¾y÷¾r÷¾k÷¾d÷¾]÷¾V÷¾O÷¾H÷¾A÷¾:÷¾3÷¾,÷¾%÷¾÷¾÷¾÷¾ ÷¾÷¾ûö¾ôö¾íö¾æö¾ßö¾Øö¾Ñö¾Êö¾Ãö¾¼ö¾µö¾®ö¾§ö¾ ö¾™ö¾’ö¾‹ö¾„ö¾}ö¾vö¾oö¾hö¾aö¾Zö¾Sö¾Lö¾Eö¾>ö¾7ö¾0ö¾)ö¾"ö¾ö¾ö¾ ö¾ö¾ÿõ¾øõ¾ñõ¾êõ¾ãõ¾Üõ¾Õõ¾Îõ¾Çõ¾Àõ¾¹õ¾²õ¾«õ¾¤õ¾õ¾–õ¾õ¾ˆõ¾õ¾zõ¾sõ¾lõ¾eõ¾^õ¾Wõ¾Põ¾Iõ¾Bõ¾;õ¾4õ¾-õ¾&õ¾õ¾õ¾õ¾ õ¾õ¾üô¾õô¾îô¾çô¾àô¾Ùô¾Òô¾Ëô¾Äô¾½ô¾¶ô¾¯ô¾¨ô¾¡ô¾šô¾“ô¾Œô¾…ô¾~ô¾wô¾pô¾iô¾bô¾[ô¾Tô¾Mô¾Fô¾?ô¾8ô¾1ô¾*ô¾#ô¾ô¾ô¾ô¾ô¾ô¾ùó¾òó¾ëó¾äó¾Ýó¾Öó¾Ïó¾Èó¾Áó¾ºó¾³ó¾¬ó¾¥ó¾žó¾—ó¾ó¾‰ó¾‚ó¾{ó¾tó¾mó¾fó¾_ó¾Xó¾Qó¾Jó¾Có¾<ó¾5ó¾.ó¾'ó¾ ó¾ó¾ó¾ ó¾ó¾ýò¾öò¾ïò¾èò¾áò¾Úò¾Óò¾Ìò¾Åò¾¾ò¾·ò¾°ò¾©ò¾¢ò¾›ò¾”ò¾ò¾†ò¾ò¾xò¾qò¾jò¾cò¾\ò¾Uò¾Nò¾Gò¾@ò¾9ò¾2ò¾+ò¾$ò¾ò¾ò¾ò¾ò¾ò¾úñ¾óñ¾ìñ¾åñ¾Þñ¾×ñ¾Ðñ¾Éñ¾Âñ¾»ñ¾´ñ¾­ñ¾¦ñ¾Ÿñ¾˜ñ¾‘ñ¾Šñ¾ƒñ¾|ñ¾uñ¾nñ¾gñ¾`ñ¾Yñ¾Rñ¾Kñ¾Dñ¾=ñ¾6ñ¾/ñ¾(ñ¾!ñ¾ñ¾ñ¾ ñ¾ñ¾þð¾÷ð¾ðð¾éð¾âð¾Ûð¾Ôð¾Íð¾Æð¾¿ð¾¸ð¾±ð¾ªð¾£ð¾œð¾•ð¾Žð¾‡ð¾€ð¾yð¾rð¾kð¾dð¾]ð¾Vð¾Oð¾Hð¾Að¾:ð¾3ð¾,ð¾%ð¾ð¾ð¾ð¾ ð¾ð¾ûï¾ôï¾íï¾æï¾ßï¾Øï¾Ñï¾Êï¾Ãᄐᄉᆴᄃᅠルメヒトï¾}ï¾vï¾oï¾hï¾aï¾Zï¾Sï¾Lï¾Eï¾>ï¾7ï¾0ï¾)ï¾"ï¾ï¾ï¾ ï¾ï¾ÿî¾øî¾ñî¾êî¾ãî¾Üî¾Õî¾Îî¾Çî¾Àî¾î¾–î¾î¾ˆî¾î¾zî¾sî¾lî¾eî¾^î¾Wî¾Pî¾Iî¾Bî¾;î¾4î¾-î¾&î¾î¾î¾î¾ î¾î¾üí¾õí¾îí¾çí¾àí¾Ùí¾Òí¾Ëí¾Äí¾½í¾¶í¾¯í¾¨í¾¡í¾ší¾“í¾Œí¾…í¾~í¾wí¾pí¾ií¾bí¾[í¾Tí¾Mí¾Fí¾?í¾8í¾1í¾*í¾#í¾í¾í¾í¾í¾í¾ùì¾òì¾ëì¾äì¾Ýì¾Öì¾Ïì¾Èì¾Á쾺쾳쾬쾥쾞쾗ì¾ì¾‰ì¾‚ì¾{ì¾tì¾mì¾fì¾_ì¾Xì¾Qì¾Jì¾Cì¾<ì¾5ì¾.ì¾'ì¾ ì¾ì¾ì¾ ì¾ì¾ýë¾öë¾ïë¾èë¾áë¾Úë¾Óë¾Ìë¾Å뾾뾷뾰뾩뾢뾛뾔ë¾ë¾†ë¾ë¾xë¾që¾jë¾cë¾\ë¾Uë¾Në¾Gë¾@ë¾9ë¾2ë¾+ë¾$ë¾ë¾ë¾ë¾ë¾ë¾úê¾óê¾ìê¾åê¾Þê¾×ê¾Ðê¾Éê¾Â꾻꾴꾭꾦꾟꾘꾑꾊꾃ê¾|ê¾uê¾nê¾gê¾`ê¾Yê¾Rê¾Kê¾Dê¾=ê¾6ê¾/ê¾(ê¾!ê¾ê¾ê¾ ê¾ê¾þé¾÷é¾ðé¾éé¾âé¾Ûé¾Ôé¾Íé¾Æé¾¿é¾¸é¾±é¾ªé¾£é¾œé¾•é¾Žé¾‡é¾€é¾yé¾ré¾ké¾dé¾]é¾Vé¾Oé¾Hé¾Aé¾:é¾3é¾,é¾%é¾é¾é¾é¾ é¾é¾ûè¾ôè¾íè¾æè¾ßè¾Øè¾Ñè¾Êè¾Ã込辵辮辧辠辙辒辋辄è¾}è¾vè¾oè¾hè¾aè¾Zè¾Sè¾Lè¾Eè¾>è¾7è¾0è¾)è¾"è¾è¾è¾ è¾è¾ÿç¾øç¾ñç¾êç¾ãç¾Üç¾Õç¾Îç¾Çç¾À羹羲羫群ç¾ç¾–ç¾ç¾ˆç¾ç¾zç¾sç¾lç¾eç¾^ç¾Wç¾Pç¾Iç¾Bç¾;ç¾4ç¾-ç¾&ç¾ç¾ç¾ç¾ ç¾ç¾üæ¾õæ¾îæ¾çæ¾àæ¾Ùæ¾Òæ¾Ëæ¾Ä澽澶澯澨澡澚澓澌澅æ¾~æ¾wæ¾pæ¾iæ¾bæ¾[æ¾Tæ¾Mæ¾Fæ¾?æ¾8æ¾1æ¾*æ¾#æ¾æ¾æ¾æ¾æ¾æ¾ùå¾òå¾ëå¾äå¾Ýå¾Öå¾Ïå¾Èå¾Á徺徳徬徥從得å¾å¾‰å¾‚å¾{å¾tå¾må¾få¾_å¾Xå¾Qå¾Jå¾Cå¾<å¾5å¾.å¾'å¾ å¾å¾å¾ å¾å¾ýä¾öä¾ïä¾èä¾áä¾Úä¾Óä¾Ìä¾Å侾侷侰侩侢供侔ä¾ä¾†ä¾ä¾xä¾qä¾jä¾cä¾\ä¾Uä¾Nä¾Gä¾@ä¾9ä¾2ä¾+ä¾$ä¾ä¾ä¾ä¾ä¾ä¾úã¾óã¾ìã¾åã¾Þã¾×ã¾Ðã¾Éã¾Â㾻㾴㾭㾦㾟㾘㾑㾊㾃ã¾|ã¾uã¾nã¾gã¾`ã¾Yã¾Rã¾Kã¾Dã¾=ã¾6ã¾/ã¾(ã¾!ã¾ã¾ã¾ ã¾ã¾þâ¾÷â¾ðâ¾éâ¾ââ¾Ûâ¾Ôâ¾Íâ¾Æâ¾¿â¾¸â¾±â¾ªâ¾£â¾œâ¾•â¾Žâ¾‡â¾€â¾yâ¾râ¾kâ¾dâ¾]â¾Vâ¾Oâ¾Hâ¾Aâ¾:â¾3â¾,â¾%â¾â¾â¾â¾ â¾â¾ûá¾ôá¾íá¾æá¾ßá¾Øá¾Ñá¾Êá¾Ãᾼ᾵ᾮᾧᾠᾙᾒᾋᾄá¾}á¾vá¾oá¾há¾aá¾Zá¾Sá¾Lá¾Eá¾>á¾7á¾0á¾)á¾"á¾á¾á¾ á¾á¾ÿà¾øà¾ñà¾êà¾ãà¾Üà¾Õà¾Îà¾Çà¾Àྐྵྲྫྤà¾à¾–à¾à¾ˆà¾à¾zà¾sà¾là¾eà¾^à¾Wà¾Pà¾Ià¾Bà¾;à¾4à¾-à¾&à¾à¾à¾à¾ à¾à¾üß¾õß¾îß¾çß¾àß¾Ùß¾Òß¾Ëß¾Äß¾½ß¾¶ß¾¯ß¾¨ß¾¡ß¾šß¾“ß¾Œß¾…ß¾~ß¾wß¾pß¾iß¾bß¾[ß¾Tß¾Mß¾Fß¾?ß¾8ß¾1ß¾*ß¾#߾߾߾߾߾߾ùÞ¾òÞ¾ëÞ¾äÞ¾ÝÞ¾ÖÞ¾ÏÞ¾ÈÞ¾ÁÞ¾ºÞ¾³Þ¾¬Þ¾¥Þ¾žÞ¾—Þ¾Þ¾‰Þ¾‚Þ¾{Þ¾tÞ¾mÞ¾fÞ¾_Þ¾XÞ¾QÞ¾JÞ¾CÞ¾<Þ¾5Þ¾.Þ¾'Þ¾ Þ¾Þ¾Þ¾ Þ¾Þ¾ýݾöݾïݾèݾáݾÚݾÓݾÌݾÅݾ¾Ý¾·Ý¾°Ý¾©Ý¾¢Ý¾›Ý¾”ݾݾ†Ý¾ݾxݾqݾjݾcݾ\ݾUݾNݾGݾ@ݾ9ݾ2ݾ+ݾ$ݾݾݾݾݾݾúܾóܾìܾåܾÞܾ×ܾÐܾÉܾÂܾ»Ü¾´Ü¾­Ü¾¦Ü¾ŸÜ¾˜Ü¾‘ܾŠÜ¾ƒÜ¾|ܾuܾnܾgܾ`ܾYܾRܾKܾDܾ=ܾ6ܾ/ܾ(ܾ!ܾܾܾ ܾܾþÛ¾÷Û¾ðÛ¾éÛ¾âÛ¾ÛÛ¾ÔÛ¾ÍÛ¾ÆÛ¾¿Û¾¸Û¾±Û¾ªÛ¾£Û¾œÛ¾•Û¾ŽÛ¾‡Û¾€Û¾yÛ¾rÛ¾kÛ¾dÛ¾]Û¾VÛ¾OÛ¾HÛ¾AÛ¾:Û¾3Û¾,Û¾%Û¾Û¾Û¾Û¾ Û¾Û¾ûÚ¾ôÚ¾íÚ¾æÚ¾ßÚ¾ØÚ¾ÑÚ¾ÊÚ¾ÃÚ¾¼Ú¾µÚ¾®Ú¾§Ú¾ Ú¾™Ú¾’Ú¾‹Ú¾„Ú¾}Ú¾vÚ¾oÚ¾hÚ¾aÚ¾ZÚ¾SÚ¾LÚ¾EÚ¾>Ú¾7Ú¾0Ú¾)Ú¾"Ú¾Ú¾Ú¾ Ú¾Ú¾ÿÙ¾øÙ¾ñÙ¾êÙ¾ãÙ¾ÜÙ¾ÕÙ¾ÎÙ¾ÇÙ¾ÀÙ¾¹Ù¾²Ù¾«Ù¾¤Ù¾Ù¾–پپˆÙ¾Ù¾zÙ¾sÙ¾lÙ¾eÙ¾^Ù¾WÙ¾PÙ¾IÙ¾BÙ¾;Ù¾4Ù¾-Ù¾&پپپپ پپüؾõؾîØ¾çØ¾àØ¾ÙØ¾ÒØ¾ËØ¾Äؾ½Ø¾¶Ø¾¯Ø¾¨Ø¾¡Ø¾šØ¾“ؾŒØ¾…ؾ~ؾwؾpؾiؾbؾ[ؾTؾMؾFؾ?ؾ8ؾ1ؾ*ؾ#ؾؾؾؾؾؾù×¾ò×¾ë×¾ä×¾Ý×¾Ö×¾Ï×¾È×¾Á×¾º×¾³×¾¬×¾¥×¾ž×¾—×¾×¾‰×¾‚×¾{×¾t×¾m×¾f×¾_×¾X×¾Q×¾J×¾C×¾<×¾5×¾.×¾'×¾ ×¾×¾×¾ ×¾×¾ýÖ¾öÖ¾ïÖ¾èÖ¾áÖ¾ÚÖ¾ÓÖ¾ÌÖ¾ÅÖ¾¾Ö¾·Ö¾°Ö¾©Ö¾¢Ö¾›Ö¾”Ö¾Ö¾†Ö¾Ö¾xÖ¾qÖ¾jÖ¾cÖ¾\Ö¾UÖ¾NÖ¾GÖ¾@Ö¾9Ö¾2Ö¾+Ö¾$Ö¾Ö¾Ö¾Ö¾Ö¾Ö¾úÕ¾óÕ¾ìÕ¾åÕ¾ÞÕ¾×Õ¾ÐÕ¾ÉÕ¾ÂÕ¾»Õ¾´Õ¾­Õ¾¦Õ¾ŸÕ¾˜Õ¾‘Õ¾ŠÕ¾ƒÕ¾|Õ¾uÕ¾nÕ¾gÕ¾`Õ¾YÕ¾RÕ¾KÕ¾DÕ¾=Õ¾6Õ¾/Õ¾(Õ¾!Õ¾Õ¾Õ¾ Õ¾Õ¾þÔ¾÷Ô¾ðÔ¾éÔ¾âÔ¾ÛÔ¾ÔÔ¾ÍÔ¾ÆÔ¾¿Ô¾¸Ô¾±Ô¾ªÔ¾£Ô¾œÔ¾•Ô¾ŽÔ¾‡Ô¾€Ô¾yÔ¾rÔ¾kÔ¾dÔ¾]Ô¾VÔ¾OÔ¾HÔ¾AÔ¾:Ô¾3Ô¾,Ô¾%Ô¾Ô¾Ô¾Ô¾ Ô¾Ô¾ûÓ¾ôÓ¾íÓ¾æÓ¾ßÓ¾ØÓ¾ÑÓ¾ÊÓ¾ÃÓ¾¼Ó¾µÓ¾®Ó¾§Ó¾ Ó¾™Ó¾’Ó¾‹Ó¾„Ó¾}Ó¾vÓ¾oÓ¾hÓ¾aÓ¾ZÓ¾SÓ¾LÓ¾EÓ¾>Ó¾7Ó¾0Ó¾)Ó¾"Ó¾Ó¾Ó¾ Ó¾Ó¾ÿÒ¾øÒ¾ñÒ¾êÒ¾ãÒ¾ÜÒ¾ÕÒ¾ÎÒ¾ÇÒ¾ÀÒ¾¹Ò¾²Ò¾«Ò¾¤Ò¾Ò¾–Ò¾Ò¾ˆÒ¾Ò¾zÒ¾sÒ¾lÒ¾eÒ¾^Ò¾WÒ¾PÒ¾IÒ¾BÒ¾;Ò¾4Ò¾-Ò¾&Ò¾Ò¾Ò¾Ò¾ Ò¾Ò¾üѾõѾîѾçѾàѾÙѾÒѾËѾÄѾ½Ñ¾¶Ñ¾¯Ñ¾¨Ñ¾¡Ñ¾šÑ¾“ѾŒÑ¾…Ѿ~ѾwѾpѾiѾbѾ[ѾTѾMѾFѾ?Ѿ8Ѿ1Ѿ*Ѿ#ѾѾѾѾѾѾùоòоëоäоÝоÖоÏоÈоÁоºÐ¾³Ð¾¬Ð¾¥Ð¾žÐ¾—оо‰Ð¾‚о{оtоmоfо_оXоQоJоCо<о5о.о'о ооо ооýϾöϾïϾèϾáϾÚϾÓϾÌϾÅϾ¾Ï¾·Ï¾°Ï¾©Ï¾¢Ï¾›Ï¾”ϾϾ†Ï¾ϾxϾqϾjϾcϾ\ϾUϾNϾGϾ@Ͼ9Ͼ2Ͼ+Ͼ$ϾϾϾϾϾϾúξóξìξåξÞξ×ξÐξÉξÂξ»Î¾´Î¾­Î¾¦Î¾ŸÎ¾˜Î¾‘ξŠÎ¾ƒÎ¾|ξuξnξgξ`ξYξRξKξDξ=ξ6ξ/ξ(ξ!ξξξ ξξþ;÷;ð;é;â;Û;Ô;Í;ÆÍ¾¿Í¾¸Í¾±Í¾ªÍ¾£Í¾œÍ¾•;ŽÍ¾‡Í¾€Í¾y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û̾ô̾í̾æÌ¾ß̾ØÌ¾Ñ̾Ê̾Ã̾¼Ì¾µÌ¾®Ì¾§Ì¾ Ì¾™Ì¾’̾‹Ì¾„̾}̾v̾o̾h̾a̾Z̾S̾L̾E̾>̾7̾0̾)̾"̾̾̾ ̾̾ÿ˾øË¾ñ˾ê˾ã˾Ü˾Õ˾Î˾Ç˾À˾¹Ë¾²Ë¾«Ë¾¤Ë¾˾–˾˾ˆË¾˾z˾s˾l˾e˾^˾W˾P˾I˾B˾;˾4˾-˾&˾˾˾˾ ˾˾üʾõʾîʾçʾàʾÙʾÒʾËʾÄʾ½Ê¾¶Ê¾¯Ê¾¨Ê¾¡Ê¾šÊ¾“ʾŒÊ¾…ʾ~ʾwʾpʾiʾbʾ[ʾTʾMʾFʾ?ʾ8ʾ1ʾ*ʾ#ʾʾʾʾʾʾùɾòɾëɾäɾÝɾÖɾÏɾÈɾÁɾºÉ¾³É¾¬É¾¥É¾žÉ¾—ɾɾ‰É¾‚ɾ{ɾtɾmɾfɾ_ɾXɾQɾJɾCɾ<ɾ5ɾ.ɾ'ɾ ɾɾɾ ɾɾýȾöȾïȾèȾáȾÚȾÓȾÌȾÅȾ¾È¾·È¾°È¾©È¾¢È¾›È¾”ȾȾ†È¾ȾxȾqȾjȾcȾ\ȾUȾNȾGȾ@Ⱦ9Ⱦ2Ⱦ+Ⱦ$ȾȾȾȾȾȾúǾóǾìǾåǾÞǾ×ǾÐǾÉǾÂǾ»Ç¾´Ç¾­Ç¾¦Ç¾ŸÇ¾˜Ç¾‘ǾŠÇ¾ƒÇ¾|ǾuǾnǾgǾ`ǾYǾRǾKǾDǾ=Ǿ6Ǿ/Ǿ(Ǿ!ǾǾǾ ǾǾþƾ÷ƾðƾ鯾âÆ¾ÛÆ¾ÔÆ¾ÍÆ¾ÆÆ¾¿Æ¾¸Æ¾±Æ¾ªÆ¾£Æ¾œÆ¾•ƾŽÆ¾‡Æ¾€Æ¾yƾrƾkƾdƾ]ƾVƾOƾHƾAƾ:ƾ3ƾ,ƾ%ƾƾƾƾ ƾƾûžôžížæÅ¾ßžØÅ¾ÑžÊžÞ¼Å¾µÅ¾®Å¾§Å¾ Å¾™Å¾’ž‹Å¾„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿľøÄ¾ñľêľãľÜľÕľÎľÇľÀľ¹Ä¾²Ä¾«Ä¾¤Ä¾ľ–ľľˆÄ¾ľzľsľlľeľ^ľWľPľIľBľ;ľ4ľ-ľ&ľľľľ ľľüþõþîþçþàþÙþÒþËþÄþ½Ã¾¶Ã¾¯Ã¾¨Ã¾¡Ã¾šÃ¾“þŒÃ¾…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþù¾ò¾ë¾ä¾ݾÖ¾ϾȾÁ¾ºÂ¾³Â¾¬Â¾¥Â¾žÂ¾—¾¾‰Â¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ýÁ¾öÁ¾ïÁ¾èÁ¾áÁ¾ÚÁ¾ÓÁ¾ÌÁ¾ÅÁ¾¾Á¾·Á¾°Á¾©Á¾¢Á¾›Á¾”Á¾Á¾†Á¾Á¾xÁ¾qÁ¾jÁ¾cÁ¾\Á¾UÁ¾NÁ¾GÁ¾@Á¾9Á¾2Á¾+Á¾$Á¾Á¾Á¾Á¾Á¾Á¾úÀ¾óÀ¾ìÀ¾åÀ¾ÞÀ¾×À¾ÐÀ¾ÉÀ¾ÂÀ¾»À¾´À¾­À¾¦À¾ŸÀ¾˜À¾‘À¾ŠÀ¾ƒÀ¾|À¾uÀ¾nÀ¾gÀ¾`À¾YÀ¾RÀ¾KÀ¾DÀ¾=À¾6À¾/À¾(À¾!À¾À¾À¾ À¾À¾þ¿¾÷¿¾ð¿¾鿾⿾Û¿¾Ô¿¾Í¿¾Æ¿¾¿¿¾¸¿¾±¿¾ª¿¾£¿¾œ¿¾•¿¾Ž¿¾‡¿¾€¿¾y¿¾r¿¾k¿¾d¿¾]¿¾V¿¾O¿¾H¿¾A¿¾:¿¾3¿¾,¿¾%¿¾¿¾¿¾¿¾ ¿¾¿¾û¾¾ô¾¾í¾¾æ¾¾ß¾¾ؾ¾Ѿ¾ʾ¾þ¾¼¾¾µ¾¾®¾¾§¾¾ ¾¾™¾¾’¾¾‹¾¾„¾¾}¾¾v¾¾o¾¾h¾¾a¾¾Z¾¾S¾¾L¾¾E¾¾>¾¾7¾¾0¾¾)¾¾"¾¾¾¾¾¾ ¾¾¾¾ÿ½¾ø½¾ñ½¾ê½¾ã½¾ܽ¾Õ½¾ν¾ǽ¾À½¾¹½¾²½¾«½¾¤½¾½¾–½¾½¾ˆ½¾½¾z½¾s½¾l½¾e½¾^½¾W½¾P½¾I½¾B½¾;½¾4½¾-½¾&½¾½¾½¾½¾ ½¾½¾ü¼¾õ¼¾î¼¾ç¼¾༾Ù¼¾Ò¼¾˼¾ļ¾½¼¾¶¼¾¯¼¾¨¼¾¡¼¾š¼¾“¼¾Œ¼¾…¼¾~¼¾w¼¾p¼¾i¼¾b¼¾[¼¾T¼¾M¼¾F¼¾?¼¾8¼¾1¼¾*¼¾#¼¾¼¾¼¾¼¾¼¾¼¾ù»¾ò»¾뻾仾Ý»¾Ö»¾Ï»¾È»¾Á»¾º»¾³»¾¬»¾¥»¾ž»¾—»¾»¾‰»¾‚»¾{»¾t»¾m»¾f»¾_»¾X»¾Q»¾J»¾C»¾<»¾5»¾.»¾'»¾ »¾»¾»¾ »¾»¾ýº¾öº¾ﺾ躾ẾÚº¾Óº¾̺¾ź¾¾º¾·º¾°º¾©º¾¢º¾›º¾”º¾º¾†º¾º¾xº¾qº¾jº¾cº¾\º¾Uº¾Nº¾Gº¾@º¾9º¾2º¾+º¾$º¾º¾º¾º¾º¾º¾ú¹¾ó¹¾ì¹¾å¹¾Þ¹¾×¹¾й¾ɹ¾¹¾»¹¾´¹¾­¹¾¦¹¾Ÿ¹¾˜¹¾‘¹¾й¾ƒ¹¾|¹¾u¹¾n¹¾g¹¾`¹¾Y¹¾R¹¾K¹¾D¹¾=¹¾6¹¾/¹¾(¹¾!¹¾¹¾¹¾ ¹¾¹¾þ¸¾÷¸¾ð¸¾鸾⸾Û¸¾Ô¸¾͸¾Ƹ¾¿¸¾¸¸¾±¸¾ª¸¾£¸¾œ¸¾•¸¾ޏ¾‡¸¾€¸¾y¸¾r¸¾k¸¾d¸¾]¸¾V¸¾O¸¾H¸¾A¸¾:¸¾3¸¾,¸¾%¸¾¸¾¸¾¸¾ ¸¾¸¾û·¾ô·¾í·¾æ·¾ß·¾Ø·¾Ñ·¾Ê·¾÷¾¼·¾µ·¾®·¾§·¾ ·¾™·¾’·¾‹·¾„·¾}·¾v·¾o·¾h·¾a·¾Z·¾S·¾L·¾E·¾>·¾7·¾0·¾)·¾"·¾·¾·¾ ·¾·¾ÿ¶¾ø¶¾ñ¶¾ê¶¾ã¶¾ܶ¾Õ¶¾ζ¾Ƕ¾À¶¾¹¶¾²¶¾«¶¾¤¶¾¶¾–¶¾¶¾ˆ¶¾¶¾z¶¾s¶¾l¶¾e¶¾^¶¾W¶¾P¶¾I¶¾B¶¾;¶¾4¶¾-¶¾&¶¾¶¾¶¾¶¾ ¶¾¶¾üµ¾õµ¾îµ¾çµ¾ൾÙµ¾Òµ¾˵¾ĵ¾½µ¾¶µ¾¯µ¾¨µ¾¡µ¾šµ¾“µ¾Œµ¾…µ¾~µ¾wµ¾pµ¾iµ¾bµ¾[µ¾Tµ¾Mµ¾Fµ¾?µ¾8µ¾1µ¾*µ¾#µ¾µ¾µ¾µ¾µ¾µ¾ù´¾ò´¾ë´¾ä´¾Ý´¾Ö´¾Ï´¾È´¾Á´¾º´¾³´¾¬´¾¥´¾ž´¾—´¾´¾‰´¾‚´¾{´¾t´¾m´¾f´¾_´¾X´¾Q´¾J´¾C´¾<´¾5´¾.´¾'´¾ ´¾´¾´¾ ´¾´¾ý³¾ö³¾ï³¾è³¾á³¾Ú³¾Ó³¾̳¾ų¾¾³¾·³¾°³¾©³¾¢³¾›³¾”³¾³¾†³¾³¾x³¾q³¾j³¾c³¾\³¾U³¾N³¾G³¾@³¾9³¾2³¾+³¾$³¾³¾³¾³¾³¾³¾ú²¾ó²¾ì²¾å²¾Þ²¾ײ¾в¾ɲ¾²¾»²¾´²¾­²¾¦²¾Ÿ²¾˜²¾‘²¾в¾ƒ²¾|²¾u²¾n²¾g²¾`²¾Y²¾R²¾K²¾D²¾=²¾6²¾/²¾(²¾!²¾²¾²¾ ²¾²¾þ±¾÷±¾ð±¾é±¾â±¾Û±¾Ô±¾ͱ¾Ʊ¾¿±¾¸±¾±±¾ª±¾£±¾œ±¾•±¾ޱ¾‡±¾€±¾y±¾r±¾k±¾d±¾]±¾V±¾O±¾H±¾A±¾:±¾3±¾,±¾%±¾±¾±¾±¾ ±¾±¾û°¾ô°¾í°¾æ°¾ß°¾ذ¾Ѱ¾ʰ¾ð¾¼°¾µ°¾®°¾§°¾ °¾™°¾’°¾‹°¾„°¾}°¾v°¾o°¾h°¾a°¾Z°¾S°¾L°¾E°¾>°¾7°¾0°¾)°¾"°¾°¾°¾ °¾°¾ÿ¯¾ø¯¾ñ¯¾꯾㯾ܯ¾Õ¯¾ί¾ǯ¾À¯¾¹¯¾²¯¾«¯¾¤¯¾¯¾–¯¾¯¾ˆ¯¾¯¾z¯¾s¯¾l¯¾e¯¾^¯¾W¯¾P¯¾I¯¾B¯¾;¯¾4¯¾-¯¾&¯¾¯¾¯¾¯¾ ¯¾¯¾ü®¾õ®¾箾ாÙ®¾Ò®¾Ë®¾Ä®¾½®¾¶®¾¯®¾¨®¾¡®¾š®¾“®¾Œ®¾…®¾~®¾w®¾p®¾i®¾b®¾[®¾T®¾M®¾F®¾?®¾8®¾1®¾*®¾#®¾®¾®¾®¾®¾®¾ù­¾ò­¾ë­¾ä­¾Ý­¾Ö­¾Ï­¾È­¾Á­¾º­¾³­¾¬­¾¥­¾ž­¾—­¾­¾‰­¾‚­¾{­¾t­¾m­¾f­¾_­¾X­¾Q­¾J­¾C­¾<­¾5­¾.­¾'­¾ ­¾­¾­¾ ­¾­¾ý¬¾ö¬¾מּ謾ᬾÚ¬¾Ó¬¾̬¾Ŭ¾¾¬¾·¬¾°¬¾©¬¾¢¬¾›¬¾”¬¾¬¾†¬¾¬¾x¬¾q¬¾j¬¾c¬¾\¬¾U¬¾N¬¾G¬¾@¬¾9¬¾2¬¾+¬¾$¬¾¬¾¬¾¬¾¬¾¬¾ú«¾ó«¾쫾嫾Þ«¾׫¾Ы¾É«¾«¾»«¾´«¾­«¾¦«¾Ÿ«¾˜«¾‘«¾Š«¾ƒ«¾|«¾u«¾n«¾g«¾`«¾Y«¾R«¾K«¾D«¾=«¾6«¾/«¾(«¾!«¾«¾«¾ «¾«¾þª¾÷ª¾ðª¾骾⪾Ûª¾Ôª¾ͪ¾ƪ¾¿ª¾¸ª¾±ª¾ªª¾£ª¾œª¾•ª¾Žª¾‡ª¾€ª¾yª¾rª¾kª¾dª¾]ª¾Vª¾Oª¾Hª¾Aª¾:ª¾3ª¾,ª¾%ª¾ª¾ª¾ª¾ ª¾ª¾û©¾ô©¾í©¾橾ß©¾Ø©¾Ñ©¾Ê©¾é¾¼©¾µ©¾®©¾§©¾ ©¾™©¾’©¾‹©¾„©¾}©¾v©¾o©¾h©¾a©¾Z©¾S©¾L©¾E©¾>©¾7©¾0©¾)©¾"©¾©¾©¾ ©¾©¾ÿ¨¾ø¨¾ñ¨¾꨾㨾ܨ¾Õ¨¾Ψ¾Ǩ¾À¨¾¹¨¾²¨¾«¨¾¤¨¾¨¾–¨¾¨¾ˆ¨¾¨¾z¨¾s¨¾l¨¾e¨¾^¨¾W¨¾P¨¾I¨¾B¨¾;¨¾4¨¾-¨¾&¨¾¨¾¨¾¨¾ ¨¾¨¾ü§¾õ§¾î§¾ç§¾à§¾Ù§¾Ò§¾˧¾ħ¾½§¾¶§¾¯§¾¨§¾¡§¾š§¾“§¾Œ§¾…§¾~§¾w§¾p§¾i§¾b§¾[§¾T§¾M§¾F§¾?§¾8§¾1§¾*§¾#§¾§¾§¾§¾§¾§¾ù¦¾ò¦¾릾䦾ݦ¾Ö¦¾Ϧ¾Ȧ¾Á¦¾º¦¾³¦¾¬¦¾¥¦¾ž¦¾—¦¾¦¾‰¦¾‚¦¾{¦¾t¦¾m¦¾f¦¾_¦¾X¦¾Q¦¾J¦¾C¦¾<¦¾5¦¾.¦¾'¦¾ ¦¾¦¾¦¾ ¦¾¦¾ý¥¾ö¥¾量襾᥾Ú¥¾Ó¥¾Ì¥¾Å¥¾¾¥¾·¥¾°¥¾©¥¾¢¥¾›¥¾”¥¾¥¾†¥¾¥¾x¥¾q¥¾j¥¾c¥¾\¥¾U¥¾N¥¾G¥¾@¥¾9¥¾2¥¾+¥¾$¥¾¥¾¥¾¥¾¥¾¥¾ú¤¾ó¤¾줾夾Þ¤¾פ¾Ф¾ɤ¾¤¾»¤¾´¤¾­¤¾¦¤¾Ÿ¤¾˜¤¾‘¤¾Ф¾ƒ¤¾|¤¾u¤¾n¤¾g¤¾`¤¾Y¤¾R¤¾K¤¾D¤¾=¤¾6¤¾/¤¾(¤¾!¤¾¤¾¤¾ ¤¾¤¾þ£¾÷£¾ð£¾飾⣾Û£¾Ô£¾Í£¾Æ£¾¿£¾¸£¾±£¾ª£¾££¾œ£¾•£¾Ž£¾‡£¾€£¾y£¾r£¾k£¾d£¾]£¾V£¾O£¾H£¾A£¾:£¾3£¾,£¾%£¾£¾£¾£¾ £¾£¾û¢¾ô¢¾í¢¾梾ߢ¾Ø¢¾Ñ¢¾Ê¢¾â¾¼¢¾µ¢¾®¢¾§¢¾ ¢¾™¢¾’¢¾‹¢¾„¢¾}¢¾v¢¾o¢¾h¢¾a¢¾Z¢¾S¢¾L¢¾E¢¾>¢¾7¢¾0¢¾)¢¾"¢¾¢¾¢¾ ¢¾¢¾ÿ¡¾ø¡¾ñ¡¾꡾㡾Ü¡¾Õ¡¾Ρ¾Ç¡¾À¡¾¹¡¾²¡¾«¡¾¤¡¾¡¾–¡¾¡¾ˆ¡¾¡¾z¡¾s¡¾l¡¾e¡¾^¡¾W¡¾P¡¾I¡¾B¡¾;¡¾4¡¾-¡¾&¡¾¡¾¡¾¡¾ ¡¾¡¾ü ¾õ ¾î ¾ç ¾à ¾Ù ¾Ò ¾Ë ¾Ä ¾½ ¾¶ ¾¯ ¾¨ ¾¡ ¾š ¾“ ¾Œ ¾… ¾~ ¾w ¾p ¾i ¾b ¾[ ¾T ¾M ¾F ¾? ¾8 ¾1 ¾* ¾# ¾ ¾ ¾ ¾ ¾ ¾ùŸ¾òŸ¾럾䟾ÝŸ¾ÖŸ¾ÏŸ¾ÈŸ¾ÁŸ¾ºŸ¾³Ÿ¾¬Ÿ¾¥Ÿ¾žŸ¾—Ÿ¾Ÿ¾‰Ÿ¾‚Ÿ¾{Ÿ¾tŸ¾mŸ¾fŸ¾_Ÿ¾XŸ¾QŸ¾JŸ¾CŸ¾<Ÿ¾5Ÿ¾.Ÿ¾'Ÿ¾ Ÿ¾Ÿ¾Ÿ¾ Ÿ¾Ÿ¾ýž¾öž¾ïž¾èž¾áž¾Úž¾Óž¾Ìž¾Åž¾¾ž¾·ž¾°ž¾©ž¾¢ž¾›ž¾”ž¾ž¾†ž¾ž¾xž¾qž¾jž¾cž¾\ž¾Už¾Nž¾Gž¾@ž¾9ž¾2ž¾+ž¾$ž¾ž¾ž¾ž¾ž¾ž¾ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þœ¾÷œ¾ðœ¾霾✾Ûœ¾Ôœ¾Íœ¾Æœ¾¿œ¾¸œ¾±œ¾ªœ¾£œ¾œœ¾•œ¾Žœ¾‡œ¾€œ¾yœ¾rœ¾kœ¾dœ¾]œ¾Vœ¾Oœ¾Hœ¾Aœ¾:œ¾3œ¾,œ¾%œ¾œ¾œ¾œ¾ œ¾œ¾û›¾ô›¾훾曾ß›¾Ø›¾Ñ›¾Ê›¾Û¾¼›¾µ›¾®›¾§›¾ ›¾™›¾’›¾‹›¾„›¾}›¾v›¾o›¾h›¾a›¾Z›¾S›¾L›¾E›¾>›¾7›¾0›¾)›¾"›¾›¾›¾ ›¾›¾ÿš¾øš¾ñš¾êš¾ãš¾Üš¾Õš¾Κ¾Çš¾Àš¾¹š¾²š¾«š¾¤š¾š¾–š¾š¾ˆš¾š¾zš¾sš¾lš¾eš¾^š¾Wš¾Pš¾Iš¾Bš¾;š¾4š¾-š¾&š¾š¾š¾š¾ š¾š¾ü™¾õ™¾百à™¾Ù™¾Ò™¾Ë™¾Ä™¾½™¾¶™¾¯™¾¨™¾¡™¾š™¾“™¾Œ™¾…™¾~™¾w™¾p™¾i™¾b™¾[™¾T™¾M™¾F™¾?™¾8™¾1™¾*™¾#™¾™¾™¾™¾™¾™¾ù˜¾ò˜¾똾䘾ݘ¾Ö˜¾Ϙ¾Ș¾Á˜¾º˜¾³˜¾¬˜¾¥˜¾ž˜¾—˜¾˜¾‰˜¾‚˜¾{˜¾t˜¾m˜¾f˜¾_˜¾X˜¾Q˜¾J˜¾C˜¾<˜¾5˜¾.˜¾'˜¾ ˜¾˜¾˜¾ ˜¾˜¾ý—¾ö—¾ï—¾è—¾á—¾Ú—¾Ó—¾Ì—¾Å—¾¾—¾·—¾°—¾©—¾¢—¾›—¾”—¾—¾†—¾—¾x—¾q—¾j—¾c—¾\—¾U—¾N—¾G—¾@—¾9—¾2—¾+—¾$—¾—¾—¾—¾—¾—¾ú–¾ó–¾ì–¾å–¾Þ–¾×–¾Ж¾É–¾–¾»–¾´–¾­–¾¦–¾Ÿ–¾˜–¾‘–¾Š–¾ƒ–¾|–¾u–¾n–¾g–¾`–¾Y–¾R–¾K–¾D–¾=–¾6–¾/–¾(–¾!–¾–¾–¾ –¾–¾þ•¾÷•¾ð•¾镾╾Û•¾Ô•¾Í•¾Æ•¾¿•¾¸•¾±•¾ª•¾£•¾œ•¾••¾Ž•¾‡•¾€•¾y•¾r•¾k•¾d•¾]•¾V•¾O•¾H•¾A•¾:•¾3•¾,•¾%•¾•¾•¾•¾ •¾•¾û”¾ô”¾픾放ß”¾Ø”¾Ñ”¾Ê”¾Ô¾¼”¾µ”¾®”¾§”¾ ”¾™”¾’”¾‹”¾„”¾}”¾v”¾o”¾h”¾a”¾Z”¾S”¾L”¾E”¾>”¾7”¾0”¾)”¾"”¾”¾”¾ ”¾”¾ÿ“¾ø“¾ñ“¾꓾㓾Ü“¾Õ“¾Γ¾Ç“¾À“¾¹“¾²“¾«“¾¤“¾“¾–“¾“¾ˆ“¾“¾z“¾s“¾l“¾e“¾^“¾W“¾P“¾I“¾B“¾;“¾4“¾-“¾&“¾“¾“¾“¾ “¾“¾ü’¾õ’¾î’¾ç’¾à’¾Ù’¾Ò’¾Ë’¾Ä’¾½’¾¶’¾¯’¾¨’¾¡’¾š’¾“’¾Œ’¾…’¾~’¾w’¾p’¾i’¾b’¾[’¾T’¾M’¾F’¾?’¾8’¾1’¾*’¾#’¾’¾’¾’¾’¾’¾ù‘¾ò‘¾둾䑾Ý‘¾Ö‘¾Ï‘¾È‘¾Á‘¾º‘¾³‘¾¬‘¾¥‘¾ž‘¾—‘¾‘¾‰‘¾‚‘¾{‘¾t‘¾m‘¾f‘¾_‘¾X‘¾Q‘¾J‘¾C‘¾<‘¾5‘¾.‘¾'‘¾ ‘¾‘¾‘¾ ‘¾‘¾ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ޾÷޾ð޾鎾⎾ÛŽ¾ÔŽ¾ÍŽ¾ÆŽ¾¿Ž¾¸Ž¾±Ž¾ªŽ¾£Ž¾œŽ¾•޾ŽŽ¾‡Ž¾€Ž¾y޾r޾k޾d޾]޾V޾O޾H޾A޾:޾3޾,޾%޾޾޾޾ ޾޾û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿŒ¾øŒ¾ñŒ¾ꌾ㌾ÜŒ¾ÕŒ¾ÎŒ¾ÇŒ¾ÀŒ¾¹Œ¾²Œ¾«Œ¾¤Œ¾Œ¾–Œ¾Œ¾ˆŒ¾Œ¾zŒ¾sŒ¾lŒ¾eŒ¾^Œ¾WŒ¾PŒ¾IŒ¾BŒ¾;Œ¾4Œ¾-Œ¾&Œ¾Œ¾Œ¾Œ¾ Œ¾Œ¾ü‹¾õ‹¾狾à‹¾Ù‹¾Ò‹¾Ë‹¾Ä‹¾½‹¾¶‹¾¯‹¾¨‹¾¡‹¾š‹¾“‹¾Œ‹¾…‹¾~‹¾w‹¾p‹¾i‹¾b‹¾[‹¾T‹¾M‹¾F‹¾?‹¾8‹¾1‹¾*‹¾#‹¾‹¾‹¾‹¾‹¾‹¾ùоòо늾䊾ÝŠ¾ÖŠ¾ÏŠ¾ÈоÁоºŠ¾³Š¾¬Š¾¥Š¾žŠ¾—оо‰Š¾‚о{оtоmоfо_оXоQоJоCо<о5о.о'о ооо ооý‰¾ö‰¾艾ቾÚ‰¾Ó‰¾̉¾ʼn¾¾‰¾·‰¾°‰¾©‰¾¢‰¾›‰¾”‰¾‰¾†‰¾‰¾x‰¾q‰¾j‰¾c‰¾\‰¾U‰¾N‰¾G‰¾@‰¾9‰¾2‰¾+‰¾$‰¾‰¾‰¾‰¾‰¾‰¾úˆ¾óˆ¾숾刾Þˆ¾׈¾Ј¾Ɉ¾ˆ¾»ˆ¾´ˆ¾­ˆ¾¦ˆ¾Ÿˆ¾˜ˆ¾‘ˆ¾Šˆ¾ƒˆ¾|ˆ¾uˆ¾nˆ¾gˆ¾`ˆ¾Yˆ¾Rˆ¾Kˆ¾Dˆ¾=ˆ¾6ˆ¾/ˆ¾(ˆ¾!ˆ¾ˆ¾ˆ¾ ˆ¾ˆ¾þ‡¾÷‡¾ð‡¾釾⇾Û‡¾Ô‡¾͇¾Ƈ¾¿‡¾¸‡¾±‡¾ª‡¾£‡¾œ‡¾•‡¾އ¾‡‡¾€‡¾y‡¾r‡¾k‡¾d‡¾]‡¾V‡¾O‡¾H‡¾A‡¾:‡¾3‡¾,‡¾%‡¾‡¾‡¾‡¾ ‡¾‡¾û†¾ô†¾톾憾߆¾؆¾ц¾ʆ¾ƾ¼†¾µ†¾®†¾§†¾ †¾™†¾’†¾‹†¾„†¾}†¾v†¾o†¾h†¾a†¾Z†¾S†¾L†¾E†¾>†¾7†¾0†¾)†¾"†¾†¾†¾ †¾†¾ÿ…¾ø…¾ñ…¾ê…¾ã…¾Ü…¾Õ…¾Î…¾Ç…¾À…¾¹…¾²…¾«…¾¤…¾…¾–…¾…¾ˆ…¾…¾z…¾s…¾l…¾e…¾^…¾W…¾P…¾I…¾B…¾;…¾4…¾-…¾&…¾…¾…¾…¾ …¾…¾ü„¾õ„¾焾à„¾Ù„¾Ò„¾Ë„¾Ä„¾½„¾¶„¾¯„¾¨„¾¡„¾š„¾“„¾Œ„¾…„¾~„¾w„¾p„¾i„¾b„¾[„¾T„¾M„¾F„¾?„¾8„¾1„¾*„¾#„¾„¾„¾„¾„¾„¾ùƒ¾òƒ¾냾䃾݃¾Öƒ¾σ¾ȃ¾Áƒ¾ºƒ¾³ƒ¾¬ƒ¾¥ƒ¾žƒ¾—ƒ¾ƒ¾‰ƒ¾‚ƒ¾{ƒ¾tƒ¾mƒ¾fƒ¾_ƒ¾Xƒ¾Qƒ¾Jƒ¾Cƒ¾<ƒ¾5ƒ¾.ƒ¾'ƒ¾ ƒ¾ƒ¾ƒ¾ ƒ¾ƒ¾ý‚¾ö‚¾肾ႾÚ‚¾Ó‚¾Ì‚¾Å‚¾¾‚¾·‚¾°‚¾©‚¾¢‚¾›‚¾”‚¾‚¾†‚¾‚¾x‚¾q‚¾j‚¾c‚¾\‚¾U‚¾N‚¾G‚¾@‚¾9‚¾2‚¾+‚¾$‚¾‚¾‚¾‚¾‚¾‚¾ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ€¾÷€¾ð€¾逾‾Û€¾Ô€¾Í€¾Æ€¾¿€¾¸€¾±€¾ª€¾£€¾œ€¾•€¾Ž€¾‡€¾€€¾y€¾r€¾k€¾d€¾]€¾V€¾O€¾H€¾A€¾:€¾3€¾,€¾%€¾€¾€¾€¾ €¾€¾û¾ô¾í¾æ¾ß¾Ø¾Ñ¾Ê¾Ã¾¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ~¾ø~¾ñ~¾ê~¾ã~¾Ü~¾Õ~¾Î~¾Ç~¾À~¾¹~¾²~¾«~¾¤~¾~¾–~¾~¾ˆ~¾~¾z~¾s~¾l~¾e~¾^~¾W~¾P~¾I~¾B~¾;~¾4~¾-~¾&~¾~¾~¾~¾ ~¾~¾ü}¾õ}¾î}¾ç}¾à}¾Ù}¾Ò}¾Ë}¾Ä}¾½}¾¶}¾¯}¾¨}¾¡}¾š}¾“}¾Œ}¾…}¾~}¾w}¾p}¾i}¾b}¾[}¾T}¾M}¾F}¾?}¾8}¾1}¾*}¾#}¾}¾}¾}¾}¾}¾ù|¾ò|¾ë|¾ä|¾Ý|¾Ö|¾Ï|¾È|¾Á|¾º|¾³|¾¬|¾¥|¾ž|¾—|¾|¾‰|¾‚|¾{|¾t|¾m|¾f|¾_|¾X|¾Q|¾J|¾C|¾<|¾5|¾.|¾'|¾ |¾|¾|¾ |¾|¾ý{¾ö{¾ï{¾è{¾á{¾Ú{¾Ó{¾Ì{¾Å{¾¾{¾·{¾°{¾©{¾¢{¾›{¾”{¾{¾†{¾{¾x{¾q{¾j{¾c{¾\{¾U{¾N{¾G{¾@{¾9{¾2{¾+{¾${¾{¾{¾{¾{¾{¾úz¾óz¾ìz¾åz¾Þz¾×z¾Ðz¾Éz¾Âz¾»z¾´z¾­z¾¦z¾Ÿz¾˜z¾‘z¾Šz¾ƒz¾|z¾uz¾nz¾gz¾`z¾Yz¾Rz¾Kz¾Dz¾=z¾6z¾/z¾(z¾!z¾z¾z¾ z¾z¾þy¾÷y¾ðy¾éy¾ây¾Ûy¾Ôy¾Íy¾Æy¾¿y¾¸y¾±y¾ªy¾£y¾œy¾•y¾Žy¾‡y¾€y¾yy¾ry¾ky¾dy¾]y¾Vy¾Oy¾Hy¾Ay¾:y¾3y¾,y¾%y¾y¾y¾y¾ y¾y¾ûx¾ôx¾íx¾æx¾ßx¾Øx¾Ñx¾Êx¾Ãx¾¼x¾µx¾®x¾§x¾ x¾™x¾’x¾‹x¾„x¾}x¾vx¾ox¾hx¾ax¾Zx¾Sx¾Lx¾Ex¾>x¾7x¾0x¾)x¾"x¾x¾x¾ x¾x¾ÿw¾øw¾ñw¾êw¾ãw¾Üw¾Õw¾Îw¾Çw¾Àw¾¹w¾²w¾«w¾¤w¾w¾–w¾w¾ˆw¾w¾zw¾sw¾lw¾ew¾^w¾Ww¾Pw¾Iw¾Bw¾;w¾4w¾-w¾&w¾w¾w¾w¾ w¾w¾üv¾õv¾îv¾çv¾àv¾Ùv¾Òv¾Ëv¾Äv¾½v¾¶v¾¯v¾¨v¾¡v¾šv¾“v¾Œv¾…v¾~v¾wv¾pv¾iv¾bv¾[v¾Tv¾Mv¾Fv¾?v¾8v¾1v¾*v¾#v¾v¾v¾v¾v¾v¾ùu¾òu¾ëu¾äu¾Ýu¾Öu¾Ïu¾Èu¾Áu¾ºu¾³u¾¬u¾¥u¾žu¾—u¾u¾‰u¾‚u¾{u¾tu¾mu¾fu¾_u¾Xu¾Qu¾Ju¾Cu¾q¾7q¾0q¾)q¾"q¾q¾q¾ q¾q¾ÿp¾øp¾ñp¾êp¾ãp¾Üp¾Õp¾Îp¾Çp¾Àp¾¹p¾²p¾«p¾¤p¾p¾–p¾p¾ˆp¾p¾zp¾sp¾lp¾ep¾^p¾Wp¾Pp¾Ip¾Bp¾;p¾4p¾-p¾&p¾p¾p¾p¾ p¾p¾üo¾õo¾îo¾ço¾ào¾Ùo¾Òo¾Ëo¾Äo¾½o¾¶o¾¯o¾¨o¾¡o¾šo¾“o¾Œo¾…o¾~o¾wo¾po¾io¾bo¾[o¾To¾Mo¾Fo¾?o¾8o¾1o¾*o¾#o¾o¾o¾o¾o¾o¾ùn¾òn¾ën¾än¾Ýn¾Ön¾Ïn¾Èn¾Án¾ºn¾³n¾¬n¾¥n¾žn¾—n¾n¾‰n¾‚n¾{n¾tn¾mn¾fn¾_n¾Xn¾Qn¾Jn¾Cn¾j¾7j¾0j¾)j¾"j¾j¾j¾ j¾j¾ÿi¾øi¾ñi¾êi¾ãi¾Üi¾Õi¾Îi¾Çi¾Ài¾¹i¾²i¾«i¾¤i¾i¾–i¾i¾ˆi¾i¾zi¾si¾li¾ei¾^i¾Wi¾Pi¾Ii¾Bi¾;i¾4i¾-i¾&i¾i¾i¾i¾ i¾i¾üh¾õh¾îh¾çh¾àh¾Ùh¾Òh¾Ëh¾Äh¾½h¾¶h¾¯h¾¨h¾¡h¾šh¾“h¾Œh¾…h¾~h¾wh¾ph¾ih¾bh¾[h¾Th¾Mh¾Fh¾?h¾8h¾1h¾*h¾#h¾h¾h¾h¾h¾h¾ùg¾òg¾ëg¾äg¾Ýg¾Ög¾Ïg¾Èg¾Ág¾ºg¾³g¾¬g¾¥g¾žg¾—g¾g¾‰g¾‚g¾{g¾tg¾mg¾fg¾_g¾Xg¾Qg¾Jg¾Cg¾c¾7c¾0c¾)c¾"c¾c¾c¾ c¾c¾ÿb¾øb¾ñb¾êb¾ãb¾Üb¾Õb¾Îb¾Çb¾Àb¾¹b¾²b¾«b¾¤b¾b¾–b¾b¾ˆb¾b¾zb¾sb¾lb¾eb¾^b¾Wb¾Pb¾Ib¾Bb¾;b¾4b¾-b¾&b¾b¾b¾b¾ b¾b¾üa¾õa¾îa¾ça¾àa¾Ùa¾Òa¾Ëa¾Äa¾½a¾¶a¾¯a¾¨a¾¡a¾ša¾“a¾Œa¾…a¾~a¾wa¾pa¾ia¾ba¾[a¾Ta¾Ma¾Fa¾?a¾8a¾1a¾*a¾#a¾a¾a¾a¾a¾a¾ù`¾ò`¾ë`¾ä`¾Ý`¾Ö`¾Ï`¾È`¾Á`¾º`¾³`¾¬`¾¥`¾ž`¾—`¾`¾‰`¾‚`¾{`¾t`¾m`¾f`¾_`¾X`¾Q`¾J`¾C`¾<`¾5`¾.`¾'`¾ `¾`¾`¾ `¾`¾ý_¾ö_¾ï_¾è_¾á_¾Ú_¾Ó_¾Ì_¾Å_¾¾_¾·_¾°_¾©_¾¢_¾›_¾”_¾_¾†_¾_¾x_¾q_¾j_¾c_¾\_¾U_¾N_¾G_¾@_¾9_¾2_¾+_¾$_¾_¾_¾_¾_¾_¾ú^¾ó^¾ì^¾å^¾Þ^¾×^¾Ð^¾É^¾Â^¾»^¾´^¾­^¾¦^¾Ÿ^¾˜^¾‘^¾Š^¾ƒ^¾|^¾u^¾n^¾g^¾`^¾Y^¾R^¾K^¾D^¾=^¾6^¾/^¾(^¾!^¾^¾^¾ ^¾^¾þ]¾÷]¾ð]¾é]¾â]¾Û]¾Ô]¾Í]¾Æ]¾¿]¾¸]¾±]¾ª]¾£]¾œ]¾•]¾Ž]¾‡]¾€]¾y]¾r]¾k]¾d]¾]]¾V]¾O]¾H]¾A]¾:]¾3]¾,]¾%]¾]¾]¾]¾ ]¾]¾û\¾ô\¾í\¾æ\¾ß\¾Ø\¾Ñ\¾Ê\¾Ã\¾¼\¾µ\¾®\¾§\¾ \¾™\¾’\¾‹\¾„\¾}\¾v\¾o\¾h\¾a\¾Z\¾S\¾L\¾E\¾>\¾7\¾0\¾)\¾"\¾\¾\¾ \¾\¾ÿ[¾ø[¾ñ[¾ê[¾ã[¾Ü[¾Õ[¾Î[¾Ç[¾À[¾¹[¾²[¾«[¾¤[¾[¾–[¾[¾ˆ[¾[¾z[¾s[¾l[¾e[¾^[¾W[¾P[¾I[¾B[¾;[¾4[¾-[¾&[¾[¾[¾[¾ [¾[¾üZ¾õZ¾îZ¾çZ¾àZ¾ÙZ¾ÒZ¾ËZ¾ÄZ¾½Z¾¶Z¾¯Z¾¨Z¾¡Z¾šZ¾“Z¾ŒZ¾…Z¾~Z¾wZ¾pZ¾iZ¾bZ¾[Z¾TZ¾MZ¾FZ¾?Z¾8Z¾1Z¾*Z¾#Z¾Z¾Z¾Z¾Z¾Z¾ùY¾òY¾ëY¾äY¾ÝY¾ÖY¾ÏY¾ÈY¾ÁY¾ºY¾³Y¾¬Y¾¥Y¾žY¾—Y¾Y¾‰Y¾‚Y¾{Y¾tY¾mY¾fY¾_Y¾XY¾QY¾JY¾CY¾U¾7U¾0U¾)U¾"U¾U¾U¾ U¾U¾ÿT¾øT¾ñT¾êT¾ãT¾ÜT¾ÕT¾ÎT¾ÇT¾ÀT¾¹T¾²T¾«T¾¤T¾T¾–T¾T¾ˆT¾T¾zT¾sT¾lT¾eT¾^T¾WT¾PT¾IT¾BT¾;T¾4T¾-T¾&T¾T¾T¾T¾ T¾T¾üS¾õS¾îS¾çS¾àS¾ÙS¾ÒS¾ËS¾ÄS¾½S¾¶S¾¯S¾¨S¾¡S¾šS¾“S¾ŒS¾…S¾~S¾wS¾pS¾iS¾bS¾[S¾TS¾MS¾FS¾?S¾8S¾1S¾*S¾#S¾S¾S¾S¾S¾S¾ùR¾òR¾ëR¾äR¾ÝR¾ÖR¾ÏR¾ÈR¾ÁR¾ºR¾³R¾¬R¾¥R¾žR¾—R¾R¾‰R¾‚R¾{R¾tR¾mR¾fR¾_R¾XR¾QR¾JR¾CR¾N¾7N¾0N¾)N¾"N¾N¾N¾ N¾N¾ÿM¾øM¾ñM¾êM¾ãM¾ÜM¾ÕM¾ÎM¾ÇM¾ÀM¾¹M¾²M¾«M¾¤M¾M¾–M¾M¾ˆM¾M¾zM¾sM¾lM¾eM¾^M¾WM¾PM¾IM¾BM¾;M¾4M¾-M¾&M¾M¾M¾M¾ M¾M¾üL¾õL¾îL¾çL¾àL¾ÙL¾ÒL¾ËL¾ÄL¾½L¾¶L¾¯L¾¨L¾¡L¾šL¾“L¾ŒL¾…L¾~L¾wL¾pL¾iL¾bL¾[L¾TL¾ML¾FL¾?L¾8L¾1L¾*L¾#L¾L¾L¾L¾L¾L¾ùK¾òK¾ëK¾äK¾ÝK¾ÖK¾ÏK¾ÈK¾ÁK¾ºK¾³K¾¬K¾¥K¾žK¾—K¾K¾‰K¾‚K¾{K¾tK¾mK¾fK¾_K¾XK¾QK¾JK¾CK¾G¾7G¾0G¾)G¾"G¾G¾G¾ G¾G¾ÿF¾øF¾ñF¾êF¾ãF¾ÜF¾ÕF¾ÎF¾ÇF¾ÀF¾¹F¾²F¾«F¾¤F¾F¾–F¾F¾ˆF¾F¾zF¾sF¾lF¾eF¾^F¾WF¾PF¾IF¾BF¾;F¾4F¾-F¾&F¾F¾F¾F¾ F¾F¾üE¾õE¾îE¾çE¾àE¾ÙE¾ÒE¾ËE¾ÄE¾½E¾¶E¾¯E¾¨E¾¡E¾šE¾“E¾ŒE¾…E¾~E¾wE¾pE¾iE¾bE¾[E¾TE¾ME¾FE¾?E¾8E¾1E¾*E¾#E¾E¾E¾E¾E¾E¾ùD¾òD¾ëD¾äD¾ÝD¾ÖD¾ÏD¾ÈD¾ÁD¾ºD¾³D¾¬D¾¥D¾žD¾—D¾D¾‰D¾‚D¾{D¾tD¾mD¾fD¾_D¾XD¾QD¾JD¾CD¾@¾7@¾0@¾)@¾"@¾@¾@¾ @¾@¾ÿ?¾ø?¾ñ?¾ê?¾ã?¾Ü?¾Õ?¾Î?¾Ç?¾À?¾¹?¾²?¾«?¾¤?¾?¾–?¾?¾ˆ?¾?¾z?¾s?¾l?¾e?¾^?¾W?¾P?¾I?¾B?¾;?¾4?¾-?¾&?¾?¾?¾?¾ ?¾?¾ü>¾õ>¾î>¾ç>¾à>¾Ù>¾Ò>¾Ë>¾Ä>¾½>¾¶>¾¯>¾¨>¾¡>¾š>¾“>¾Œ>¾…>¾~>¾w>¾p>¾i>¾b>¾[>¾T>¾M>¾F>¾?>¾8>¾1>¾*>¾#>¾>¾>¾>¾>¾>¾ù=¾ò=¾ë=¾ä=¾Ý=¾Ö=¾Ï=¾È=¾Á=¾º=¾³=¾¬=¾¥=¾ž=¾—=¾=¾‰=¾‚=¾{=¾t=¾m=¾f=¾_=¾X=¾Q=¾J=¾C=¾<=¾5=¾.=¾'=¾ =¾=¾=¾ =¾=¾ý<¾ö<¾ï<¾è<¾á<¾Ú<¾Ó<¾Ì<¾Å<¾¾<¾·<¾°<¾©<¾¢<¾›<¾”<¾<¾†<¾<¾x<¾q<¾j<¾c<¾\<¾U<¾N<¾G<¾@<¾9<¾2<¾+<¾$<¾<¾<¾<¾<¾<¾ú;¾ó;¾ì;¾å;¾Þ;¾×;¾Ð;¾É;¾Â;¾»;¾´;¾­;¾¦;¾Ÿ;¾˜;¾‘;¾Š;¾ƒ;¾|;¾u;¾n;¾g;¾`;¾Y;¾R;¾K;¾D;¾=;¾6;¾/;¾(;¾!;¾;¾;¾ ;¾;¾þ:¾÷:¾ð:¾é:¾â:¾Û:¾Ô:¾Í:¾Æ:¾¿:¾¸:¾±:¾ª:¾£:¾œ:¾•:¾Ž:¾‡:¾€:¾y:¾r:¾k:¾d:¾]:¾V:¾O:¾H:¾A:¾::¾3:¾,:¾%:¾:¾:¾:¾ :¾:¾û9¾ô9¾í9¾æ9¾ß9¾Ø9¾Ñ9¾Ê9¾Ã9¾¼9¾µ9¾®9¾§9¾ 9¾™9¾’9¾‹9¾„9¾}9¾v9¾o9¾h9¾a9¾Z9¾S9¾L9¾E9¾>9¾79¾09¾)9¾"9¾9¾9¾ 9¾9¾ÿ8¾ø8¾ñ8¾ê8¾ã8¾Ü8¾Õ8¾Î8¾Ç8¾À8¾¹8¾²8¾«8¾¤8¾8¾–8¾8¾ˆ8¾8¾z8¾s8¾l8¾e8¾^8¾W8¾P8¾I8¾B8¾;8¾48¾-8¾&8¾8¾8¾8¾ 8¾8¾ü7¾õ7¾î7¾ç7¾à7¾Ù7¾Ò7¾Ë7¾Ä7¾½7¾¶7¾¯7¾¨7¾¡7¾š7¾“7¾Œ7¾…7¾~7¾w7¾p7¾i7¾b7¾[7¾T7¾M7¾F7¾?7¾87¾17¾*7¾#7¾7¾7¾7¾7¾7¾ù6¾ò6¾ë6¾ä6¾Ý6¾Ö6¾Ï6¾È6¾Á6¾º6¾³6¾¬6¾¥6¾ž6¾—6¾6¾‰6¾‚6¾{6¾t6¾m6¾f6¾_6¾X6¾Q6¾J6¾C6¾<6¾56¾.6¾'6¾ 6¾6¾6¾ 6¾6¾ý5¾ö5¾ï5¾è5¾á5¾Ú5¾Ó5¾Ì5¾Å5¾¾5¾·5¾°5¾©5¾¢5¾›5¾”5¾5¾†5¾5¾x5¾q5¾j5¾c5¾\5¾U5¾N5¾G5¾@5¾95¾25¾+5¾$5¾5¾5¾5¾5¾5¾ú4¾ó4¾ì4¾å4¾Þ4¾×4¾Ð4¾É4¾Â4¾»4¾´4¾­4¾¦4¾Ÿ4¾˜4¾‘4¾Š4¾ƒ4¾|4¾u4¾n4¾g4¾`4¾Y4¾R4¾K4¾D4¾=4¾64¾/4¾(4¾!4¾4¾4¾ 4¾4¾þ3¾÷3¾ð3¾é3¾â3¾Û3¾Ô3¾Í3¾Æ3¾¿3¾¸3¾±3¾ª3¾£3¾œ3¾•3¾Ž3¾‡3¾€3¾y3¾r3¾k3¾d3¾]3¾V3¾O3¾H3¾A3¾:3¾33¾,3¾%3¾3¾3¾3¾ 3¾3¾û2¾ô2¾í2¾æ2¾ß2¾Ø2¾Ñ2¾Ê2¾Ã2¾¼2¾µ2¾®2¾§2¾ 2¾™2¾’2¾‹2¾„2¾}2¾v2¾o2¾h2¾a2¾Z2¾S2¾L2¾E2¾>2¾72¾02¾)2¾"2¾2¾2¾ 2¾2¾ÿ1¾ø1¾ñ1¾ê1¾ã1¾Ü1¾Õ1¾Î1¾Ç1¾À1¾¹1¾²1¾«1¾¤1¾1¾–1¾1¾ˆ1¾1¾z1¾s1¾l1¾e1¾^1¾W1¾P1¾I1¾B1¾;1¾41¾-1¾&1¾1¾1¾1¾ 1¾1¾ü0¾õ0¾î0¾ç0¾à0¾Ù0¾Ò0¾Ë0¾Ä0¾½0¾¶0¾¯0¾¨0¾¡0¾š0¾“0¾Œ0¾…0¾~0¾w0¾p0¾i0¾b0¾[0¾T0¾M0¾F0¾?0¾80¾10¾*0¾#0¾0¾0¾0¾0¾0¾ù/¾ò/¾ë/¾ä/¾Ý/¾Ö/¾Ï/¾È/¾Á/¾º/¾³/¾¬/¾¥/¾ž/¾—/¾/¾‰/¾‚/¾{/¾t/¾m/¾f/¾_/¾X/¾Q/¾J/¾C/¾+¾7+¾0+¾)+¾"+¾+¾+¾ +¾+¾ÿ*¾ø*¾ñ*¾ê*¾ã*¾Ü*¾Õ*¾Î*¾Ç*¾À*¾¹*¾²*¾«*¾¤*¾*¾–*¾*¾ˆ*¾*¾z*¾s*¾l*¾e*¾^*¾W*¾P*¾I*¾B*¾;*¾4*¾-*¾&*¾*¾*¾*¾ *¾*¾ü)¾õ)¾î)¾ç)¾à)¾Ù)¾Ò)¾Ë)¾Ä)¾½)¾¶)¾¯)¾¨)¾¡)¾š)¾“)¾Œ)¾…)¾~)¾w)¾p)¾i)¾b)¾[)¾T)¾M)¾F)¾?)¾8)¾1)¾*)¾#)¾)¾)¾)¾)¾)¾ù(¾ò(¾ë(¾ä(¾Ý(¾Ö(¾Ï(¾È(¾Á(¾º(¾³(¾¬(¾¥(¾ž(¾—(¾(¾‰(¾‚(¾{(¾t(¾m(¾f(¾_(¾X(¾Q(¾J(¾C(¾<(¾5(¾.(¾'(¾ (¾(¾(¾ (¾(¾ý'¾ö'¾ï'¾è'¾á'¾Ú'¾Ó'¾Ì'¾Å'¾¾'¾·'¾°'¾©'¾¢'¾›'¾”'¾'¾†'¾'¾x'¾q'¾j'¾c'¾\'¾U'¾N'¾G'¾@'¾9'¾2'¾+'¾$'¾'¾'¾'¾'¾'¾ú&¾ó&¾ì&¾å&¾Þ&¾×&¾Ð&¾É&¾Â&¾»&¾´&¾­&¾¦&¾Ÿ&¾˜&¾‘&¾Š&¾ƒ&¾|&¾u&¾n&¾g&¾`&¾Y&¾R&¾K&¾D&¾=&¾6&¾/&¾(&¾!&¾&¾&¾ &¾&¾þ%¾÷%¾ð%¾é%¾â%¾Û%¾Ô%¾Í%¾Æ%¾¿%¾¸%¾±%¾ª%¾£%¾œ%¾•%¾Ž%¾‡%¾€%¾y%¾r%¾k%¾d%¾]%¾V%¾O%¾H%¾A%¾:%¾3%¾,%¾%%¾%¾%¾%¾ %¾%¾û$¾ô$¾í$¾æ$¾ß$¾Ø$¾Ñ$¾Ê$¾Ã$¾¼$¾µ$¾®$¾§$¾ $¾™$¾’$¾‹$¾„$¾}$¾v$¾o$¾h$¾a$¾Z$¾S$¾L$¾E$¾>$¾7$¾0$¾)$¾"$¾$¾$¾ $¾$¾ÿ#¾ø#¾ñ#¾ê#¾ã#¾Ü#¾Õ#¾Î#¾Ç#¾À#¾¹#¾²#¾«#¾¤#¾#¾–#¾#¾ˆ#¾#¾z#¾s#¾l#¾e#¾^#¾W#¾P#¾I#¾B#¾;#¾4#¾-#¾&#¾#¾#¾#¾ #¾#¾ü"¾õ"¾î"¾ç"¾à"¾Ù"¾Ò"¾Ë"¾Ä"¾½"¾¶"¾¯"¾¨"¾¡"¾š"¾“"¾Œ"¾…"¾~"¾w"¾p"¾i"¾b"¾["¾T"¾M"¾F"¾?"¾8"¾1"¾*"¾#"¾"¾"¾"¾"¾"¾ù!¾ò!¾ë!¾ä!¾Ý!¾Ö!¾Ï!¾È!¾Á!¾º!¾³!¾¬!¾¥!¾ž!¾—!¾!¾‰!¾‚!¾{!¾t!¾m!¾f!¾_!¾X!¾Q!¾J!¾C!¾¾7¾0¾)¾"¾¾¾ ¾¾ÿ¾ø¾ñ¾ê¾ã¾Ü¾Õ¾Î¾Ç¾À¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü¾õ¾î¾ç¾à¾Ù¾Ò¾Ë¾Ä¾½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù¾ò¾ë¾ä¾Ý¾Ö¾Ï¾È¾Á¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý¾ö¾ï¾è¾á¾Ú¾Ó¾Ì¾Å¾¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú¾ó¾ì¾å¾Þ¾×¾Ð¾É¾Â¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾Š¾ƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ¾÷¾ð¾é¾â¾Û¾Ô¾Í¾Æ¾¿¾¸¾±¾ª¾£¾œ¾•¾Ž¾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û¾ô¾í¾æ¾ß¾Ø¾Ñ¾Ê¾Ã¾¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ¾ø¾ñ¾ê¾ã¾Ü¾Õ¾Î¾Ç¾À¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü¾õ¾î¾ç¾à¾Ù¾Ò¾Ë¾Ä¾½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù¾ò¾ë¾ä¾Ý¾Ö¾Ï¾È¾Á¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý¾ö¾ï¾è¾á¾Ú¾Ó¾Ì¾Å¾¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú¾ó¾ì¾å¾Þ¾×¾Ð¾É¾Â¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾Š¾ƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ¾÷¾ð¾é¾â¾Û¾Ô¾Í¾Æ¾¿¾¸¾±¾ª¾£¾œ¾•¾Ž¾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û¾ô¾í¾æ¾ß¾Ø¾Ñ¾Ê¾Ã¾¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ¾ø¾ñ¾ê¾ã¾Ü¾Õ¾Î¾Ç¾À¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü ¾õ ¾î ¾ç ¾à ¾Ù ¾Ò ¾Ë ¾Ä ¾½ ¾¶ ¾¯ ¾¨ ¾¡ ¾š ¾“ ¾Œ ¾… ¾~ ¾w ¾p ¾i ¾b ¾[ ¾T ¾M ¾F ¾? ¾8 ¾1 ¾* ¾# ¾ ¾ ¾ ¾ ¾ ¾ù ¾ò ¾ë ¾ä ¾Ý ¾Ö ¾Ï ¾È ¾Á ¾º ¾³ ¾¬ ¾¥ ¾ž ¾— ¾ ¾‰ ¾‚ ¾{ ¾t ¾m ¾f ¾_ ¾X ¾Q ¾J ¾C ¾< ¾5 ¾. ¾' ¾ ¾ ¾ ¾ ¾ ¾ý ¾ö ¾ï ¾è ¾á ¾Ú ¾Ó ¾Ì ¾Å ¾¾ ¾· ¾° ¾© ¾¢ ¾› ¾” ¾ ¾† ¾ ¾x ¾q ¾j ¾c ¾\ ¾U ¾N ¾G ¾@ ¾9 ¾2 ¾+ ¾$ ¾ ¾ ¾ ¾ ¾ ¾ú ¾ó ¾ì ¾å ¾Þ ¾× ¾Ð ¾É ¾ ¾» ¾´ ¾­ ¾¦ ¾Ÿ ¾˜ ¾‘ ¾Š ¾ƒ ¾| ¾u ¾n ¾g ¾` ¾Y ¾R ¾K ¾D ¾= ¾6 ¾/ ¾( ¾! ¾ ¾ ¾ ¾ ¾þ ¾÷ ¾ð ¾é ¾â ¾Û ¾Ô ¾Í ¾Æ ¾¿ ¾¸ ¾± ¾ª ¾£ ¾œ ¾• ¾Ž ¾‡ ¾€ ¾y ¾r ¾k ¾d ¾] ¾V ¾O ¾H ¾A ¾: ¾3 ¾, ¾% ¾ ¾ ¾ ¾ ¾ ¾û¾ô¾í¾æ¾ß¾Ø¾Ñ¾Ê¾Ã¾¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ¾ø¾ñ¾ê¾ã¾Ü¾Õ¾Î¾Ç¾À¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü¾õ¾î¾ç¾à¾Ù¾Ò¾Ë¾Ä¾½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù¾ò¾ë¾ä¾Ý¾Ö¾Ï¾È¾Á¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý¾ö¾ï¾è¾á¾Ú¾Ó¾Ì¾Å¾¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú¾ó¾ì¾å¾Þ¾×¾Ð¾É¾Â¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾Š¾ƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ¾÷¾ð¾é¾â¾Û¾Ô¾Í¾Æ¾¿¾¸¾±¾ª¾£¾œ¾•¾Ž¾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û¾ô¾í¾æ¾ß¾Ø¾Ñ¾Ê¾Ã¾¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ¾ø¾ñ¾ê¾ã¾ܾÕ¾ξǾÀ¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾üÿ½õÿ½îÿ½çÿ½àÿ½Ùÿ½Òÿ½Ëÿ½Äÿ½½ÿ½¶ÿ½¯ÿ½¨ÿ½¡ÿ½šÿ½“ÿ½Œÿ½…ÿ½~ÿ½wÿ½pÿ½iÿ½bÿ½[ÿ½Tÿ½Mÿ½Fÿ½?ÿ½8ÿ½1ÿ½*ÿ½#ÿ½ÿ½ÿ½ÿ½ÿ½ÿ½ùþ½òþ½ëþ½äþ½Ýþ½Öþ½Ïþ½Èþ½Áþ½ºþ½³þ½¬þ½¥þ½žþ½—þ½þ½‰þ½‚þ½{þ½tþ½mþ½fþ½_þ½Xþ½Qþ½Jþ½Cþ½<þ½5þ½.þ½'þ½ þ½þ½þ½ þ½þ½ýý½öý½ïý½èý½áý½Úý½Óý½Ìý½Åý½¾ý½·ý½°ý½©ý½¢ý½›ý½”ý½ý½†ý½ý½xý½qý½jý½cý½\ý½Uý½Ný½Gý½@ý½9ý½2ý½+ý½$ý½ý½ý½ý½ý½ý½úü½óü½ìü½åü½Þü½×ü½Ðü½Éü½Âü½»ü½´ü½­ü½¦ü½Ÿü½˜ü½‘ü½Šü½ƒü½|ü½uü½nü½gü½`ü½Yü½Rü½Kü½Dü½=ü½6ü½/ü½(ü½!ü½ü½ü½ ü½ü½þû½÷û½ðû½éû½âû½Ûû½Ôû½Íû½Æû½¿û½¸û½±û½ªû½£û½œû½•û½Žû½‡û½€û½yû½rû½kû½dû½]û½Vû½Oû½Hû½Aû½:û½3û½,û½%û½û½û½û½ û½û½ûú½ôú½íú½æú½ßú½Øú½Ñú½Êú½Ãú½¼ú½µú½®ú½§ú½ ú½™ú½’ú½‹ú½„ú½}ú½vú½oú½hú½aú½Zú½Sú½Lú½Eú½>ú½7ú½0ú½)ú½"ú½ú½ú½ ú½ú½ÿù½øù½ñù½êù½ãù½Üù½Õù½Îù½Çù½Àù½¹ù½²ù½«ù½¤ù½ù½–ù½ù½ˆù½ù½zù½sù½lù½eù½^ù½Wù½Pù½Iù½Bù½;ù½4ù½-ù½&ù½ù½ù½ù½ ù½ù½üø½õø½îø½çø½àø½Ùø½Òø½Ëø½Äø½½ø½¶ø½¯ø½¨ø½¡ø½šø½“ø½Œø½…ø½~ø½wø½pø½iø½bø½[ø½Tø½Mø½Fø½?ø½8ø½1ø½*ø½#ø½ø½ø½ø½ø½ø½ù÷½ò÷½ë÷½ä÷½Ý÷½Ö÷½Ï÷½È÷½Á÷½º÷½³÷½¬÷½¥÷½ž÷½—÷½÷½‰÷½‚÷½{÷½t÷½m÷½f÷½_÷½X÷½Q÷½J÷½C÷½<÷½5÷½.÷½'÷½ ÷½÷½÷½ ÷½÷½ýö½öö½ïö½èö½áö½Úö½Óö½Ìö½Åö½¾ö½·ö½°ö½©ö½¢ö½›ö½”ö½ö½†ö½ö½xö½qö½jö½cö½\ö½Uö½Nö½Gö½@ö½9ö½2ö½+ö½$ö½ö½ö½ö½ö½ö½úõ½óõ½ìõ½åõ½Þõ½×õ½Ðõ½Éõ½Âõ½»õ½´õ½­õ½¦õ½Ÿõ½˜õ½‘õ½Šõ½ƒõ½|õ½uõ½nõ½gõ½`õ½Yõ½Rõ½Kõ½Dõ½=õ½6õ½/õ½(õ½!õ½õ½õ½ õ½õ½þô½÷ô½ðô½éô½âô½Ûô½Ôô½Íô½Æô½¿ô½¸ô½±ô½ªô½£ô½œô½•ô½Žô½‡ô½€ô½yô½rô½kô½dô½]ô½Vô½Oô½Hô½Aô½:ô½3ô½,ô½%ô½ô½ô½ô½ ô½ô½ûó½ôó½íó½æó½ßó½Øó½Ñó½Êó½Ãó½¼ó½µó½®ó½§ó½ ó½™ó½’ó½‹ó½„ó½}ó½vó½oó½hó½aó½Zó½Só½Ló½Eó½>ó½7ó½0ó½)ó½"ó½ó½ó½ ó½ó½ÿò½øò½ñò½êò½ãò½Üò½Õò½Îò½Çò½Àò½¹ò½²ò½«ò½¤ò½ò½–ò½ò½ˆò½ò½zò½sò½lò½eò½^ò½Wò½Pò½Iò½Bò½;ò½4ò½-ò½&ò½ò½ò½ò½ ò½ò½üñ½õñ½îñ½çñ½àñ½Ùñ½Òñ½Ëñ½Äñ½½ñ½¶ñ½¯ñ½¨ñ½¡ñ½šñ½“ñ½Œñ½…ñ½~ñ½wñ½pñ½iñ½bñ½[ñ½Tñ½Mñ½Fñ½?ñ½8ñ½1ñ½*ñ½#ñ½ñ½ñ½ñ½ñ½ñ½ùð½òð½ëð½äð½Ýð½Öð½Ïð½Èð½Áð½ºð½³ð½¬ð½¥ð½žð½—ð½ð½‰ð½‚ð½{ð½tð½mð½fð½_ð½Xð½Qð½Jð½Cð½<ð½5ð½.ð½'ð½ ð½ð½ð½ ð½ð½ýï½öï½ïï½èï½áï½Úï½Óï½Ìï½Åセキーゥ「{tï½ï½†ï½ï½xï½qï½jï½cï½\ï½Uï½Nï½Gï½@ï½9ï½2ï½+ï½$ï½ï½ï½ï½ï½ï½úî½óî½ìî½åî½Þî½×î½Ðî½Éî½Âî½|î½uî½nî½gî½`î½Yî½Rî½Kî½Dî½=î½6î½/î½(î½!î½î½î½ î½î½þí½÷í½ðí½éí½âí½Ûí½Ôí½Íí½Æí½¿í½¸í½±í½ªí½£í½œí½•í½Ží½‡í½€í½yí½rí½kí½dí½]í½Ví½Oí½Hí½Aí½:í½3í½,í½%í½í½í½í½ í½í½ûì½ôì½íì½æì½ßì½Øì½Ñì½Êì½Ã콼콵콮콧콠콙콒콋콄ì½}ì½vì½oì½hì½aì½Zì½Sì½Lì½Eì½>ì½7ì½0ì½)ì½"ì½ì½ì½ ì½ì½ÿë½øë½ñë½êë½ãë½Üë½Õë½Îë½Çë½À뽹뽲뽫뽤ë½ë½–ë½ë½ˆë½ë½zë½së½lë½eë½^ë½Wë½Pë½Ië½Bë½;ë½4ë½-ë½&ë½ë½ë½ë½ ë½ë½üê½õê½îê½çê½àê½Ùê½Òê½Ëê½Ä꽽꽶꽯꽨꽡꽚꽓꽌꽅ê½~ê½wê½pê½iê½bê½[ê½Tê½Mê½Fê½?ê½8ê½1ê½*ê½#ê½ê½ê½ê½ê½ê½ùé½òé½ëé½äé½Ýé½Öé½Ïé½Èé½Á齺齳齬齥齞齗é½é½‰é½‚é½{é½té½mé½fé½_é½Xé½Qé½Jé½Cé½<é½5é½.é½'é½ é½é½é½ é½é½ýè½öè½ïè½èè½áè½Úè½Óè½Ìè½Å轾轷轰轩轢轛轔è½è½†è½è½xè½qè½jè½cè½\è½Uè½Nè½Gè½@è½9è½2è½+è½$è½è½è½è½è½è½úç½óç½ìç½åç½Þç½×ç½Ðç½Éç½Â罻罴罭罦罟罘网罊罃ç½|ç½uç½nç½gç½`ç½Yç½Rç½Kç½Dç½=ç½6ç½/ç½(ç½!ç½ç½ç½ ç½ç½þæ½÷æ½ðæ½éæ½âæ½Ûæ½Ôæ½Íæ½Ææ½¿æ½¸æ½±æ½ªæ½£æ½œæ½•æ½Žæ½‡æ½€æ½yæ½ræ½kæ½dæ½]æ½Væ½Oæ½Hæ½Aæ½:æ½3æ½,æ½%æ½æ½æ½æ½ æ½æ½ûå½ôå½í彿å½ß彨å½Ñå½Êå½Ã彼彵彮彧彠彙归彋彄å½}å½vå½oå½hå½aå½Zå½Så½Lå½Eå½>å½7å½0å½)å½"å½å½å½ å½å½ÿä½øä½ñä½êä½ãä½Üä½Õä½Îä½Çä½À佹佲佫佤ä½ä½–ä½ä½ˆä½ä½zä½sä½lä½eä½^ä½Wä½Pä½Iä½Bä½;ä½4ä½-ä½&ä½ä½ä½ä½ ä½ä½üã½õã½îã½çã½àã½Ùã½Òã½Ëã½Ä㽽㽶㽯㽨㽡㽚㽓㽌㽅ã½~ã½wã½pã½iã½bã½[ã½Tã½Mã½Fã½?ã½8ã½1ã½*ã½#ã½ã½ã½ã½ã½ã½ùâ½òâ½ëâ½äâ½Ýâ½Öâ½Ïâ½Èâ½Á⽺⽳⽬⽥⽞⽗â½â½‰â½‚â½{â½tâ½mâ½fâ½_â½Xâ½Qâ½Jâ½Câ½<â½5â½.â½'â½ â½â½â½ â½â½ýá½öá½ïá½èá½áá½Úá½Óá½Ìá½Å὾ίὰὩὢὛὔá½á½†á½á½xá½qá½já½cá½\á½Uá½Ná½Gá½@á½9á½2á½+á½$á½á½á½á½á½á½úà½óà½ìà½åà½Þà½×à½Ðà½Éà½Âཻུ཭སཟམདཊགྷà½|à½uà½nà½gà½`à½Yà½Rà½Kà½Dà½=à½6à½/à½(à½!à½à½à½ à½à½þß½÷ß½ðß½éß½âß½Ûß½Ôß½Íß½Æß½¿ß½¸ß½±ß½ªß½£ß½œß½•ß½Žß½‡ß½€ß½yß½rß½kß½dß½]ß½Vß½Oß½Hß½Aß½:ß½3ß½,ß½%߽߽߽߽ ߽߽ûÞ½ôÞ½íÞ½æÞ½ßÞ½ØÞ½ÑÞ½ÊÞ½ÃÞ½¼Þ½µÞ½®Þ½§Þ½ Þ½™Þ½’Þ½‹Þ½„Þ½}Þ½vÞ½oÞ½hÞ½aÞ½ZÞ½SÞ½LÞ½EÞ½>Þ½7Þ½0Þ½)Þ½"Þ½Þ½Þ½ Þ½Þ½ÿݽøÝ½ñݽêݽãݽÜݽÕݽÎݽÇݽÀݽ¹Ý½²Ý½«Ý½¤Ý½ݽ–ݽݽˆÝ½ݽzݽsݽlݽeݽ^ݽWݽPݽIݽBݽ;ݽ4ݽ-ݽ&ݽݽݽݽ ݽݽüܽõܽîܽçܽàܽÙܽÒܽËܽÄܽ½Ü½¶Ü½¯Ü½¨Ü½¡Ü½šÜ½“ܽŒÜ½…ܽ~ܽwܽpܽiܽbܽ[ܽTܽMܽFܽ?ܽ8ܽ1ܽ*ܽ#ܽܽܽܽܽܽùÛ½òÛ½ëÛ½äÛ½ÝÛ½ÖÛ½ÏÛ½ÈÛ½ÁÛ½ºÛ½³Û½¬Û½¥Û½žÛ½—Û½Û½‰Û½‚Û½{Û½tÛ½mÛ½fÛ½_Û½XÛ½QÛ½JÛ½CÛ½<Û½5Û½.Û½'Û½ Û½Û½Û½ Û½Û½ýÚ½öÚ½ïÚ½èÚ½áÚ½ÚÚ½ÓÚ½ÌÚ½ÅÚ½¾Ú½·Ú½°Ú½©Ú½¢Ú½›Ú½”Ú½Ú½†Ú½Ú½xÚ½qÚ½jÚ½cÚ½\Ú½UÚ½NÚ½GÚ½@Ú½9Ú½2Ú½+Ú½$Ú½Ú½Ú½Ú½Ú½Ú½úÙ½óÙ½ìÙ½åÙ½ÞÙ½×Ù½ÐÙ½ÉÙ½ÂÙ½»Ù½´Ù½­Ù½¦Ù½ŸÙ½˜Ù½‘Ù½ŠÙ½ƒÙ½|Ù½uÙ½nÙ½gÙ½`Ù½YÙ½RÙ½KÙ½DÙ½=Ù½6Ù½/Ù½(Ù½!ٽٽٽ ٽٽþؽ÷ؽðؽ騽âØ½ÛØ½ÔØ½ÍØ½ÆØ½¿Ø½¸Ø½±Ø½ªØ½£Ø½œØ½•ؽŽØ½‡Ø½€Ø½yؽrؽkؽdؽ]ؽVؽOؽHؽAؽ:ؽ3ؽ,ؽ%ؽؽؽؽ ؽؽû×½ô×½í×½æ×½ß×½Ø×½Ñ×½Ê×½Ã×½¼×½µ×½®×½§×½ ×½™×½’×½‹×½„×½}×½v×½o×½h×½a×½Z×½S×½L×½E×½>×½7×½0×½)×½"×½×½×½ ×½×½ÿÖ½øÖ½ñÖ½êÖ½ãÖ½ÜÖ½ÕÖ½ÎÖ½ÇÖ½ÀÖ½¹Ö½²Ö½«Ö½¤Ö½Ö½–Ö½Ö½ˆÖ½Ö½zÖ½sÖ½lÖ½eÖ½^Ö½WÖ½PÖ½IÖ½BÖ½;Ö½4Ö½-Ö½&Ö½Ö½Ö½Ö½ Ö½Ö½üÕ½õÕ½îÕ½çÕ½àÕ½ÙÕ½ÒÕ½ËÕ½ÄÕ½½Õ½¶Õ½¯Õ½¨Õ½¡Õ½šÕ½“Õ½ŒÕ½…Õ½~Õ½wÕ½pÕ½iÕ½bÕ½[Õ½TÕ½MÕ½FÕ½?Õ½8Õ½1Õ½*Õ½#Õ½Õ½Õ½Õ½Õ½Õ½ùÔ½òÔ½ëÔ½äÔ½ÝÔ½ÖÔ½ÏÔ½ÈÔ½ÁÔ½ºÔ½³Ô½¬Ô½¥Ô½žÔ½—Ô½Ô½‰Ô½‚Ô½{Ô½tÔ½mÔ½fÔ½_Ô½XÔ½QÔ½JÔ½CÔ½<Ô½5Ô½.Ô½'Ô½ Ô½Ô½Ô½ Ô½Ô½ýÓ½öÓ½ïÓ½èÓ½áÓ½ÚÓ½ÓÓ½ÌÓ½ÅÓ½¾Ó½·Ó½°Ó½©Ó½¢Ó½›Ó½”Ó½Ó½†Ó½Ó½xÓ½qÓ½jÓ½cÓ½\Ó½UÓ½NÓ½GÓ½@Ó½9Ó½2Ó½+Ó½$Ó½Ó½Ó½Ó½Ó½Ó½úÒ½óÒ½ìÒ½åÒ½ÞÒ½×Ò½ÐÒ½ÉÒ½ÂÒ½»Ò½´Ò½­Ò½¦Ò½ŸÒ½˜Ò½‘Ò½ŠÒ½ƒÒ½|Ò½uÒ½nÒ½gÒ½`Ò½YÒ½RÒ½KÒ½DÒ½=Ò½6Ò½/Ò½(Ò½!Ò½Ò½Ò½ Ò½Ò½þѽ÷ѽðѽéѽâѽÛѽÔѽÍѽÆÑ½¿Ñ½¸Ñ½±Ñ½ªÑ½£Ñ½œÑ½•ѽŽÑ½‡Ñ½€Ñ½yѽrѽkѽdѽ]ѽVѽOѽHѽAѽ:ѽ3ѽ,ѽ%ѽѽѽѽ ѽѽûнôнíнæÐ½ßнØÐ½ÑнÊнÃн¼Ð½µÐ½®Ð½§Ð½ Ð½™Ð½’н‹Ð½„н}нvнoнhнaнZнSнLнEн>н7н0н)н"ннн ннÿϽøÏ½ñϽêϽãϽÜϽÕϽÎϽÇϽÀϽ¹Ï½²Ï½«Ï½¤Ï½Ͻ–ϽϽˆÏ½ϽzϽsϽlϽeϽ^ϽWϽPϽIϽBϽ;Ͻ4Ͻ-Ͻ&ϽϽϽϽ ϽϽüνõνîνçνàνÙνÒνËνÄν½Î½¶Î½¯Î½¨Î½¡Î½šÎ½“νŒÎ½…ν~νwνpνiνbν[νTνMνFν?ν8ν1ν*ν#ννννννùͽòͽëͽäͽÝͽÖͽÏͽÈͽÁͽºÍ½³Í½¬Í½¥Í½žÍ½—ͽͽ‰Í½‚ͽ{ͽtͽmͽfͽ_ͽXͽQͽJͽCͽ<ͽ5ͽ.ͽ'ͽ ͽͽͽ ͽͽý̽ö̽ï̽è̽á̽Ú̽Ó̽Ì̽Å̽¾Ì½·Ì½°Ì½©Ì½¢Ì½›Ì½”̽̽†Ì½̽x̽q̽j̽c̽\̽U̽N̽G̽@̽9̽2̽+̽$̽̽̽̽̽̽ú˽ó˽ì˽å˽Þ˽×˽Ð˽É˽Â˽»Ë½´Ë½­Ë½¦Ë½ŸË½˜Ë½‘˽ŠË½ƒË½|˽u˽n˽g˽`˽Y˽R˽K˽D˽=˽6˽/˽(˽!˽˽˽ ˽˽þʽ÷ʽðʽéʽâʽÛʽÔʽÍʽÆÊ½¿Ê½¸Ê½±Ê½ªÊ½£Ê½œÊ½•ʽŽÊ½‡Ê½€Ê½yʽrʽkʽdʽ]ʽVʽOʽHʽAʽ:ʽ3ʽ,ʽ%ʽʽʽʽ ʽʽûɽôɽíɽæÉ½ßɽØÉ½ÑɽÊɽÃɽ¼É½µÉ½®É½§É½ É½™É½’ɽ‹É½„ɽ}ɽvɽoɽhɽaɽZɽSɽLɽEɽ>ɽ7ɽ0ɽ)ɽ"ɽɽɽ ɽɽÿȽøÈ½ñȽêȽãȽÜȽÕȽÎȽÇȽÀȽ¹È½²È½«È½¤È½Ƚ–ȽȽˆÈ½ȽzȽsȽlȽeȽ^ȽWȽPȽIȽBȽ;Ƚ4Ƚ-Ƚ&ȽȽȽȽ ȽȽüǽõǽîǽçǽàǽÙǽÒǽËǽÄǽ½Ç½¶Ç½¯Ç½¨Ç½¡Ç½šÇ½“ǽŒÇ½…ǽ~ǽwǽpǽiǽbǽ[ǽTǽMǽFǽ?ǽ8ǽ1ǽ*ǽ#ǽǽǽǽǽǽùƽòƽëÆ½䯽ÝÆ½ÖÆ½ÏÆ½ÈƽÁƽºÆ½³Æ½¬Æ½¥Æ½žÆ½—ƽƽ‰Æ½‚ƽ{ƽtƽmƽfƽ_ƽXƽQƽJƽCƽ<ƽ5ƽ.ƽ'ƽ ƽƽƽ ƽƽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅ޾޷ްީޢޛŽ”ŽŽ†Å½ŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúĽóĽìĽåĽÞĽ׼ÐĽÉĽÂĽ»Ä½´Ä½­Ä½¦Ä½ŸÄ½˜Ä½‘ĽŠÄ½ƒÄ½|ĽuĽnĽgĽ`ĽYĽRĽKĽDĽ=Ľ6Ľ/Ľ(Ľ!ĽĽĽ ĽĽþý÷ýðýéýâýÛýÔýÍýÆÃ½¿Ã½¸Ã½±Ã½ªÃ½£Ã½œÃ½•ýŽÃ½‡Ã½€Ã½yýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýû½ô½í½æÂ½ß½ØÂ½ѽʽý¼Â½µÂ½®Â½§Â½ Â½™Â½’½‹Â½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿÁ½øÁ½ñÁ½êÁ½ãÁ½ÜÁ½ÕÁ½ÎÁ½ÇÁ½ÀÁ½¹Á½²Á½«Á½¤Á½Á½–Á½Á½ˆÁ½Á½zÁ½sÁ½lÁ½eÁ½^Á½WÁ½PÁ½IÁ½BÁ½;Á½4Á½-Á½&Á½Á½Á½Á½ Á½Á½üÀ½õÀ½îÀ½çÀ½àÀ½ÙÀ½ÒÀ½ËÀ½ÄÀ½½À½¶À½¯À½¨À½¡À½šÀ½“À½ŒÀ½…À½~À½wÀ½pÀ½iÀ½bÀ½[À½TÀ½MÀ½FÀ½?À½8À½1À½*À½#À½À½À½À½À½À½ù¿½ò¿½뿽俽Ý¿½Ö¿½Ï¿½È¿½Á¿½º¿½³¿½¬¿½¥¿½ž¿½—¿½¿½‰¿½‚¿½{¿½t¿½m¿½f¿½_¿½X¿½Q¿½J¿½C¿½<¿½5¿½.¿½'¿½ ¿½¿½¿½ ¿½¿½ý¾½ö¾½ï¾½è¾½á¾½Ú¾½Ó¾½̾½ž½¾¾½·¾½°¾½©¾½¢¾½›¾½”¾½¾½†¾½¾½x¾½q¾½j¾½c¾½\¾½U¾½N¾½G¾½@¾½9¾½2¾½+¾½$¾½¾½¾½¾½¾½¾½ú½½ó½½ì½½å½½Þ½½×½½н½ɽ½½½»½½´½½­½½¦½½Ÿ½½˜½½‘½½н½ƒ½½|½½u½½n½½g½½`½½Y½½R½½K½½D½½=½½6½½/½½(½½!½½½½½½ ½½½½þ¼½÷¼½ð¼½é¼½â¼½Û¼½Ô¼½ͼ½Ƽ½¿¼½¸¼½±¼½ª¼½£¼½œ¼½•¼½޼½‡¼½€¼½y¼½r¼½k¼½d¼½]¼½V¼½O¼½H¼½A¼½:¼½3¼½,¼½%¼½¼½¼½¼½ ¼½¼½û»½ô»½í»½滽ß»½Ø»½Ñ»½Ê»½û½¼»½µ»½®»½§»½ »½™»½’»½‹»½„»½}»½v»½o»½h»½a»½Z»½S»½L»½E»½>»½7»½0»½)»½"»½»½»½ »½»½ÿº½øº½ñº½꺽㺽ܺ½Õº½κ½Ǻ½Àº½¹º½²º½«º½¤º½º½–º½º½ˆº½º½zº½sº½lº½eº½^º½Wº½Pº½Iº½Bº½;º½4º½-º½&º½º½º½º½ º½º½ü¹½õ¹½î¹½ç¹½๽Ù¹½Ò¹½˹½Ĺ½½¹½¶¹½¯¹½¨¹½¡¹½š¹½“¹½Œ¹½…¹½~¹½w¹½p¹½i¹½b¹½[¹½T¹½M¹½F¹½?¹½8¹½1¹½*¹½#¹½¹½¹½¹½¹½¹½ù¸½ò¸½븽丽ݸ½Ö¸½ϸ½ȸ½Á¸½º¸½³¸½¬¸½¥¸½ž¸½—¸½¸½‰¸½‚¸½{¸½t¸½m¸½f¸½_¸½X¸½Q¸½J¸½C¸½<¸½5¸½.¸½'¸½ ¸½¸½¸½ ¸½¸½ý·½ö·½ï·½è·½á·½Ú·½Ó·½Ì·½Å·½¾·½··½°·½©·½¢·½›·½”·½·½†·½·½x·½q·½j·½c·½\·½U·½N·½G·½@·½9·½2·½+·½$·½·½·½·½·½·½ú¶½ó¶½ì¶½å¶½Þ¶½×¶½ж½ɶ½¶½»¶½´¶½­¶½¦¶½Ÿ¶½˜¶½‘¶½ж½ƒ¶½|¶½u¶½n¶½g¶½`¶½Y¶½R¶½K¶½D¶½=¶½6¶½/¶½(¶½!¶½¶½¶½ ¶½¶½þµ½÷µ½ðµ½éµ½âµ½Ûµ½Ôµ½͵½Ƶ½¿µ½¸µ½±µ½ªµ½£µ½œµ½•µ½޵½‡µ½€µ½yµ½rµ½kµ½dµ½]µ½Vµ½Oµ½Hµ½Aµ½:µ½3µ½,µ½%µ½µ½µ½µ½ µ½µ½û´½ô´½í´½æ´½ß´½Ø´½Ñ´½Ê´½ô½¼´½µ´½®´½§´½ ´½™´½’´½‹´½„´½}´½v´½o´½h´½a´½Z´½S´½L´½E´½>´½7´½0´½)´½"´½´½´½ ´½´½ÿ³½ø³½ñ³½ê³½ã³½ܳ½Õ³½γ½dz½À³½¹³½²³½«³½¤³½³½–³½³½ˆ³½³½z³½s³½l³½e³½^³½W³½P³½I³½B³½;³½4³½-³½&³½³½³½³½ ³½³½ü²½õ²½î²½ç²½ಽÙ²½Ò²½˲½IJ½½²½¶²½¯²½¨²½¡²½š²½“²½Œ²½…²½~²½w²½p²½i²½b²½[²½T²½M²½F²½?²½8²½1²½*²½#²½²½²½²½²½²½ù±½ò±½ë±½ä±½ݱ½Ö±½ϱ½ȱ½Á±½º±½³±½¬±½¥±½ž±½—±½±½‰±½‚±½{±½t±½m±½f±½_±½X±½Q±½J±½C±½<±½5±½.±½'±½ ±½±½±½ ±½±½ý°½ö°½ï°½è°½á°½Ú°½Ó°½̰½Ű½¾°½·°½°°½©°½¢°½›°½”°½°½†°½°½x°½q°½j°½c°½\°½U°½N°½G°½@°½9°½2°½+°½$°½°½°½°½°½°½ú¯½ó¯½쯽寽Þ¯½ׯ½Я½ɯ½¯½»¯½´¯½­¯½¦¯½Ÿ¯½˜¯½‘¯½Н½ƒ¯½|¯½u¯½n¯½g¯½`¯½Y¯½R¯½K¯½D¯½=¯½6¯½/¯½(¯½!¯½¯½¯½ ¯½¯½þ®½÷®½ð®½鮽⮽Û®½Ô®½Í®½Æ®½¿®½¸®½±®½ª®½£®½œ®½•®½Ž®½‡®½€®½y®½r®½k®½d®½]®½V®½O®½H®½A®½:®½3®½,®½%®½®½®½®½ ®½®½û­½ô­½í­½æ­½ß­½Ø­½Ñ­½Ê­½í½¼­½µ­½®­½§­½ ­½™­½’­½‹­½„­½}­½v­½o­½h­½a­½Z­½S­½L­½E­½>­½7­½0­½)­½"­½­½­½ ­½­½ÿ¬½ø¬½ñ¬½ꬽ㬽ܬ½Õ¬½ά½Ǭ½À¬½¹¬½²¬½«¬½¤¬½¬½–¬½¬½ˆ¬½¬½z¬½s¬½l¬½e¬½^¬½W¬½P¬½I¬½B¬½;¬½4¬½-¬½&¬½¬½¬½¬½ ¬½¬½ü«½õ«½竽૽Ù«½Ò«½Ë«½Ä«½½«½¶«½¯«½¨«½¡«½š«½“«½Œ«½…«½~«½w«½p«½i«½b«½[«½T«½M«½F«½?«½8«½1«½*«½#«½«½«½«½«½«½ùª½òª½몽䪽ݪ½Öª½Ϫ½Ȫ½Áª½ºª½³ª½¬ª½¥ª½žª½—ª½ª½‰ª½‚ª½{ª½tª½mª½fª½_ª½Xª½Qª½Jª½Cª½<ª½5ª½.ª½'ª½ ª½ª½ª½ ª½ª½ý©½ö©½墳詽᩽Ú©½Ó©½Ì©½Å©½¾©½·©½°©½©©½¢©½›©½”©½©½†©½©½x©½q©½j©½c©½\©½U©½N©½G©½@©½9©½2©½+©½$©½©½©½©½©½©½ú¨½ó¨½쨽娽Þ¨½ר½Ш½ɨ½¨½»¨½´¨½­¨½¦¨½Ÿ¨½˜¨½‘¨½Ѝ½ƒ¨½|¨½u¨½n¨½g¨½`¨½Y¨½R¨½K¨½D¨½=¨½6¨½/¨½(¨½!¨½¨½¨½ ¨½¨½þ§½÷§½ð§½é§½â§½Û§½Ô§½ͧ½Ƨ½¿§½¸§½±§½ª§½£§½œ§½•§½ާ½‡§½€§½y§½r§½k§½d§½]§½V§½O§½H§½A§½:§½3§½,§½%§½§½§½§½ §½§½û¦½ô¦½í¦½榽ߦ½ئ½Ѧ½ʦ½æ½¼¦½µ¦½®¦½§¦½ ¦½™¦½’¦½‹¦½„¦½}¦½v¦½o¦½h¦½a¦½Z¦½S¦½L¦½E¦½>¦½7¦½0¦½)¦½"¦½¦½¦½ ¦½¦½ÿ¥½ø¥½ñ¥½꥽㥽Ü¥½Õ¥½Î¥½Ç¥½À¥½¹¥½²¥½«¥½¤¥½¥½–¥½¥½ˆ¥½¥½z¥½s¥½l¥½e¥½^¥½W¥½P¥½I¥½B¥½;¥½4¥½-¥½&¥½¥½¥½¥½ ¥½¥½ü¤½õ¤½礽ऽÙ¤½Ò¤½ˤ½Ĥ½½¤½¶¤½¯¤½¨¤½¡¤½š¤½“¤½Œ¤½…¤½~¤½w¤½p¤½i¤½b¤½[¤½T¤½M¤½F¤½?¤½8¤½1¤½*¤½#¤½¤½¤½¤½¤½¤½ù£½ò£½룽䣽Ý£½Ö£½Ï£½È£½Á£½º£½³£½¬£½¥£½ž£½—£½£½‰£½‚£½{£½t£½m£½f£½_£½X£½Q£½J£½C£½<£½5£½.£½'£½ £½£½£½ £½£½ý¢½ö¢½袽ᢽÚ¢½Ó¢½Ì¢½Å¢½¾¢½·¢½°¢½©¢½¢¢½›¢½”¢½¢½†¢½¢½x¢½q¢½j¢½c¢½\¢½U¢½N¢½G¢½@¢½9¢½2¢½+¢½$¢½¢½¢½¢½¢½¢½ú¡½ó¡½졽塽Þ¡½ס½С½É¡½¡½»¡½´¡½­¡½¦¡½Ÿ¡½˜¡½‘¡½Š¡½ƒ¡½|¡½u¡½n¡½g¡½`¡½Y¡½R¡½K¡½D¡½=¡½6¡½/¡½(¡½!¡½¡½¡½ ¡½¡½þ ½÷ ½ð ½é ½â ½Û ½Ô ½Í ½Æ ½¿ ½¸ ½± ½ª ½£ ½œ ½• ½Ž ½‡ ½€ ½y ½r ½k ½d ½] ½V ½O ½H ½A ½: ½3 ½, ½% ½ ½ ½ ½  ½ ½ûŸ½ôŸ½퟽柽ߟ½ØŸ½ÑŸ½ÊŸ½ß½¼Ÿ½µŸ½®Ÿ½§Ÿ½ Ÿ½™Ÿ½’Ÿ½‹Ÿ½„Ÿ½}Ÿ½vŸ½oŸ½hŸ½aŸ½ZŸ½SŸ½LŸ½EŸ½>Ÿ½7Ÿ½0Ÿ½)Ÿ½"Ÿ½Ÿ½Ÿ½ Ÿ½Ÿ½ÿž½øž½ñž½êž½ãž½Üž½Õž½Ξ½Çž½Àž½¹ž½²ž½«ž½¤ž½ž½–ž½ž½ˆž½ž½zž½sž½lž½ež½^ž½Wž½Pž½Iž½Bž½;ž½4ž½-ž½&ž½ž½ž½ž½ ž½ž½ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ùœ½òœ½뜽䜽Ýœ½Öœ½Ïœ½Èœ½Áœ½ºœ½³œ½¬œ½¥œ½žœ½—œ½œ½‰œ½‚œ½{œ½tœ½mœ½fœ½_œ½Xœ½Qœ½Jœ½Cœ½<œ½5œ½.œ½'œ½ œ½œ½œ½ œ½œ½ý›½ö›½蛽᛽Ú›½Ó›½Ì›½Å›½¾›½·›½°›½©›½¢›½››½”›½›½†›½›½x›½q›½j›½c›½\›½U›½N›½G›½@›½9›½2›½+›½$›½›½›½›½›½›½úš½óš½ìš½åš½Þš½ך½К½Éš½š½»š½´š½­š½¦š½Ÿš½˜š½‘š½Šš½ƒš½|š½uš½nš½gš½`š½Yš½Rš½Kš½Dš½=š½6š½/š½(š½!š½š½š½ š½š½þ™½÷™½ð™½陽♽Û™½Ô™½Í™½Æ™½¿™½¸™½±™½ª™½£™½œ™½•™½Ž™½‡™½€™½y™½r™½k™½d™½]™½V™½O™½H™½A™½:™½3™½,™½%™½™½™½™½ ™½™½û˜½ô˜½혽昽ߘ½ؘ½ј½ʘ½ؽ¼˜½µ˜½®˜½§˜½ ˜½™˜½’˜½‹˜½„˜½}˜½v˜½o˜½h˜½a˜½Z˜½S˜½L˜½E˜½>˜½7˜½0˜½)˜½"˜½˜½˜½ ˜½˜½ÿ—½ø—½ñ—½ê—½ã—½Ü—½Õ—½Η½Ç—½À—½¹—½²—½«—½¤—½—½–—½—½ˆ—½—½z—½s—½l—½e—½^—½W—½P—½I—½B—½;—½4—½-—½&—½—½—½—½ —½—½ü–½õ–½î–½ç–½à–½Ù–½Ò–½Ë–½Ä–½½–½¶–½¯–½¨–½¡–½š–½“–½Œ–½…–½~–½w–½p–½i–½b–½[–½T–½M–½F–½?–½8–½1–½*–½#–½–½–½–½–½–½ù•½ò•½땽䕽Ý•½Ö•½Ï•½È•½Á•½º•½³•½¬•½¥•½ž•½—•½•½‰•½‚•½{•½t•½m•½f•½_•½X•½Q•½J•½C•½<•½5•½.•½'•½ •½•½•½ •½•½ý”½ö”½蔽ᔽÚ”½Ó”½Ì”½Å”½¾”½·”½°”½©”½¢”½›”½””½”½†”½”½x”½q”½j”½c”½\”½U”½N”½G”½@”½9”½2”½+”½$”½”½”½”½”½”½ú“½ó“½쓽哽Þ“½ד½Г½É“½“½»“½´“½­“½¦“½Ÿ“½˜“½‘“½Š“½ƒ“½|“½u“½n“½g“½`“½Y“½R“½K“½D“½=“½6“½/“½(“½!“½“½“½ “½“½þ’½÷’½ð’½é’½â’½Û’½Ô’½Í’½Æ’½¿’½¸’½±’½ª’½£’½œ’½•’½Ž’½‡’½€’½y’½r’½k’½d’½]’½V’½O’½H’½A’½:’½3’½,’½%’½’½’½’½ ’½’½û‘½ô‘½푽摽ß‘½Ø‘½Ñ‘½Ê‘½ѽ¼‘½µ‘½®‘½§‘½ ‘½™‘½’‘½‹‘½„‘½}‘½v‘½o‘½h‘½a‘½Z‘½S‘½L‘½E‘½>‘½7‘½0‘½)‘½"‘½‘½‘½ ‘½‘½ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù޽ò޽뎽䎽ÝŽ½ÖŽ½ÏŽ½È޽Á޽ºŽ½³Ž½¬Ž½¥Ž½žŽ½—޽޽‰Ž½‚޽{޽t޽m޽f޽_޽X޽Q޽J޽C޽<޽5޽.޽'޽ ޽޽޽ ޽޽ý½ö½ï½è½á½Ú½Ó½̽޾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½úŒ½óŒ½쌽匽ÞŒ½׌½ÐŒ½ÉŒ½ÂŒ½»Œ½´Œ½­Œ½¦Œ½ŸŒ½˜Œ½‘Œ½ŠŒ½ƒŒ½|Œ½uŒ½nŒ½gŒ½`Œ½YŒ½RŒ½KŒ½DŒ½=Œ½6Œ½/Œ½(Œ½!Œ½Œ½Œ½ Œ½Œ½þ‹½÷‹½ð‹½鋽⋽Û‹½Ô‹½Í‹½Æ‹½¿‹½¸‹½±‹½ª‹½£‹½œ‹½•‹½Ž‹½‡‹½€‹½y‹½r‹½k‹½d‹½]‹½V‹½O‹½H‹½A‹½:‹½3‹½,‹½%‹½‹½‹½‹½ ‹½‹½ûнôн튽抽ߊ½ØŠ½ÑŠ½ÊŠ½ʽ¼Š½µŠ½®Š½§Š½ Š½™Š½’н‹Š½„н}нvнoнhнaнZнSнLнEн>н7н0н)н"ннн ннÿ‰½ø‰½ñ‰½ꉽ㉽܉½Õ‰½Ή½lj½À‰½¹‰½²‰½«‰½¤‰½‰½–‰½‰½ˆ‰½‰½z‰½s‰½l‰½e‰½^‰½W‰½P‰½I‰½B‰½;‰½4‰½-‰½&‰½‰½‰½‰½ ‰½‰½üˆ½õˆ½爽àˆ½Ùˆ½Òˆ½ˈ½Ĉ½½ˆ½¶ˆ½¯ˆ½¨ˆ½¡ˆ½šˆ½“ˆ½Œˆ½…ˆ½~ˆ½wˆ½pˆ½iˆ½bˆ½[ˆ½Tˆ½Mˆ½Fˆ½?ˆ½8ˆ½1ˆ½*ˆ½#ˆ½ˆ½ˆ½ˆ½ˆ½ˆ½ù‡½ò‡½뇽䇽݇½Ö‡½χ½ȇ½Á‡½º‡½³‡½¬‡½¥‡½ž‡½—‡½‡½‰‡½‚‡½{‡½t‡½m‡½f‡½_‡½X‡½Q‡½J‡½C‡½<‡½5‡½.‡½'‡½ ‡½‡½‡½ ‡½‡½ý†½ö†½膽ᆽÚ†½Ó†½̆½ņ½¾†½·†½°†½©†½¢†½›†½”†½†½††½†½x†½q†½j†½c†½\†½U†½N†½G†½@†½9†½2†½+†½$†½†½†½†½†½†½ú…½ó…½ì…½å…½Þ…½×…½Ð…½É…½Â…½»…½´…½­…½¦…½Ÿ…½˜…½‘…½Š…½ƒ…½|…½u…½n…½g…½`…½Y…½R…½K…½D…½=…½6…½/…½(…½!…½…½…½ …½…½þ„½÷„½ð„½鄽ℽÛ„½Ô„½Í„½Æ„½¿„½¸„½±„½ª„½£„½œ„½•„½Ž„½‡„½€„½y„½r„½k„½d„½]„½V„½O„½H„½A„½:„½3„½,„½%„½„½„½„½ „½„½ûƒ½ôƒ½탽惽߃½؃½у½ʃ½ý¼ƒ½µƒ½®ƒ½§ƒ½ ƒ½™ƒ½’ƒ½‹ƒ½„ƒ½}ƒ½vƒ½oƒ½hƒ½aƒ½Zƒ½Sƒ½Lƒ½Eƒ½>ƒ½7ƒ½0ƒ½)ƒ½"ƒ½ƒ½ƒ½ ƒ½ƒ½ÿ‚½ø‚½ñ‚½ꂽソÜ‚½Õ‚½΂½Ç‚½À‚½¹‚½²‚½«‚½¤‚½‚½–‚½‚½ˆ‚½‚½z‚½s‚½l‚½e‚½^‚½W‚½P‚½I‚½B‚½;‚½4‚½-‚½&‚½‚½‚½‚½ ‚½‚½ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù€½ò€½뀽䀽Ý€½Ö€½Ï€½È€½Á€½º€½³€½¬€½¥€½ž€½—€½€½‰€½‚€½{€½t€½m€½f€½_€½X€½Q€½J€½C€½<€½5€½.€½'€½ €½€½€½ €½€½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú~½ó~½ì~½å~½Þ~½×~½Ð~½É~½Â~½»~½´~½­~½¦~½Ÿ~½˜~½‘~½Š~½ƒ~½|~½u~½n~½g~½`~½Y~½R~½K~½D~½=~½6~½/~½(~½!~½~½~½ ~½~½þ}½÷}½ð}½é}½â}½Û}½Ô}½Í}½Æ}½¿}½¸}½±}½ª}½£}½œ}½•}½Ž}½‡}½€}½y}½r}½k}½d}½]}½V}½O}½H}½A}½:}½3}½,}½%}½}½}½}½ }½}½û|½ô|½í|½æ|½ß|½Ø|½Ñ|½Ê|½Ã|½¼|½µ|½®|½§|½ |½™|½’|½‹|½„|½}|½v|½o|½h|½a|½Z|½S|½L|½E|½>|½7|½0|½)|½"|½|½|½ |½|½ÿ{½ø{½ñ{½ê{½ã{½Ü{½Õ{½Î{½Ç{½À{½¹{½²{½«{½¤{½{½–{½{½ˆ{½{½z{½s{½l{½e{½^{½W{½P{½I{½B{½;{½4{½-{½&{½{½{½{½ {½{½üz½õz½îz½çz½àz½Ùz½Òz½Ëz½Äz½½z½¶z½¯z½¨z½¡z½šz½“z½Œz½…z½~z½wz½pz½iz½bz½[z½Tz½Mz½Fz½?z½8z½1z½*z½#z½z½z½z½z½z½ùy½òy½ëy½äy½Ýy½Öy½Ïy½Èy½Áy½ºy½³y½¬y½¥y½žy½—y½y½‰y½‚y½{y½ty½my½fy½_y½Xy½Qy½Jy½Cy½u½7u½0u½)u½"u½u½u½ u½u½ÿt½øt½ñt½êt½ãt½Üt½Õt½Ît½Çt½Àt½¹t½²t½«t½¤t½t½–t½t½ˆt½t½zt½st½lt½et½^t½Wt½Pt½It½Bt½;t½4t½-t½&t½t½t½t½ t½t½üs½õs½îs½çs½às½Ùs½Òs½Ës½Äs½½s½¶s½¯s½¨s½¡s½šs½“s½Œs½…s½~s½ws½ps½is½bs½[s½Ts½Ms½Fs½?s½8s½1s½*s½#s½s½s½s½s½s½ùr½òr½ër½är½Ýr½Ör½Ïr½Èr½Ár½ºr½³r½¬r½¥r½žr½—r½r½‰r½‚r½{r½tr½mr½fr½_r½Xr½Qr½Jr½Cr½n½7n½0n½)n½"n½n½n½ n½n½ÿm½øm½ñm½êm½ãm½Üm½Õm½Îm½Çm½Àm½¹m½²m½«m½¤m½m½–m½m½ˆm½m½zm½sm½lm½em½^m½Wm½Pm½Im½Bm½;m½4m½-m½&m½m½m½m½ m½m½ül½õl½îl½çl½àl½Ùl½Òl½Ël½Äl½½l½¶l½¯l½¨l½¡l½šl½“l½Œl½…l½~l½wl½pl½il½bl½[l½Tl½Ml½Fl½?l½8l½1l½*l½#l½l½l½l½l½l½ùk½òk½ëk½äk½Ýk½Ök½Ïk½Èk½Ák½ºk½³k½¬k½¥k½žk½—k½k½‰k½‚k½{k½tk½mk½fk½_k½Xk½Qk½Jk½Ck½g½7g½0g½)g½"g½g½g½ g½g½ÿf½øf½ñf½êf½ãf½Üf½Õf½Îf½Çf½Àf½¹f½²f½«f½¤f½f½–f½f½ˆf½f½zf½sf½lf½ef½^f½Wf½Pf½If½Bf½;f½4f½-f½&f½f½f½f½ f½f½üe½õe½îe½çe½àe½Ùe½Òe½Ëe½Äe½½e½¶e½¯e½¨e½¡e½še½“e½Œe½…e½~e½we½pe½ie½be½[e½Te½Me½Fe½?e½8e½1e½*e½#e½e½e½e½e½e½ùd½òd½ëd½äd½Ýd½Öd½Ïd½Èd½Ád½ºd½³d½¬d½¥d½žd½—d½d½‰d½‚d½{d½td½md½fd½_d½Xd½Qd½Jd½Cd½`½7`½0`½)`½"`½`½`½ `½`½ÿ_½ø_½ñ_½ê_½ã_½Ü_½Õ_½Î_½Ç_½À_½¹_½²_½«_½¤_½_½–_½_½ˆ_½_½z_½s_½l_½e_½^_½W_½P_½I_½B_½;_½4_½-_½&_½_½_½_½ _½_½ü^½õ^½î^½ç^½à^½Ù^½Ò^½Ë^½Ä^½½^½¶^½¯^½¨^½¡^½š^½“^½Œ^½…^½~^½w^½p^½i^½b^½[^½T^½M^½F^½?^½8^½1^½*^½#^½^½^½^½^½^½ù]½ò]½ë]½ä]½Ý]½Ö]½Ï]½È]½Á]½º]½³]½¬]½¥]½ž]½—]½]½‰]½‚]½{]½t]½m]½f]½_]½X]½Q]½J]½C]½<]½5]½.]½']½ ]½]½]½ ]½]½ý\½ö\½ï\½è\½á\½Ú\½Ó\½Ì\½Å\½¾\½·\½°\½©\½¢\½›\½”\½\½†\½\½x\½q\½j\½c\½\\½U\½N\½G\½@\½9\½2\½+\½$\½\½\½\½\½\½ú[½ó[½ì[½å[½Þ[½×[½Ð[½É[½Â[½»[½´[½­[½¦[½Ÿ[½˜[½‘[½Š[½ƒ[½|[½u[½n[½g[½`[½Y[½R[½K[½D[½=[½6[½/[½([½![½[½[½ [½[½þZ½÷Z½ðZ½éZ½âZ½ÛZ½ÔZ½ÍZ½ÆZ½¿Z½¸Z½±Z½ªZ½£Z½œZ½•Z½ŽZ½‡Z½€Z½yZ½rZ½kZ½dZ½]Z½VZ½OZ½HZ½AZ½:Z½3Z½,Z½%Z½Z½Z½Z½ Z½Z½ûY½ôY½íY½æY½ßY½ØY½ÑY½ÊY½ÃY½¼Y½µY½®Y½§Y½ Y½™Y½’Y½‹Y½„Y½}Y½vY½oY½hY½aY½ZY½SY½LY½EY½>Y½7Y½0Y½)Y½"Y½Y½Y½ Y½Y½ÿX½øX½ñX½êX½ãX½ÜX½ÕX½ÎX½ÇX½ÀX½¹X½²X½«X½¤X½X½–X½X½ˆX½X½zX½sX½lX½eX½^X½WX½PX½IX½BX½;X½4X½-X½&X½X½X½X½ X½X½üW½õW½îW½çW½àW½ÙW½ÒW½ËW½ÄW½½W½¶W½¯W½¨W½¡W½šW½“W½ŒW½…W½~W½wW½pW½iW½bW½[W½TW½MW½FW½?W½8W½1W½*W½#W½W½W½W½W½W½ùV½òV½ëV½äV½ÝV½ÖV½ÏV½ÈV½ÁV½ºV½³V½¬V½¥V½žV½—V½V½‰V½‚V½{V½tV½mV½fV½_V½XV½QV½JV½CV½R½7R½0R½)R½"R½R½R½ R½R½ÿQ½øQ½ñQ½êQ½ãQ½ÜQ½ÕQ½ÎQ½ÇQ½ÀQ½¹Q½²Q½«Q½¤Q½Q½–Q½Q½ˆQ½Q½zQ½sQ½lQ½eQ½^Q½WQ½PQ½IQ½BQ½;Q½4Q½-Q½&Q½Q½Q½Q½ Q½Q½üP½õP½îP½çP½àP½ÙP½ÒP½ËP½ÄP½½P½¶P½¯P½¨P½¡P½šP½“P½ŒP½…P½~P½wP½pP½iP½bP½[P½TP½MP½FP½?P½8P½1P½*P½#P½P½P½P½P½P½ùO½òO½ëO½äO½ÝO½ÖO½ÏO½ÈO½ÁO½ºO½³O½¬O½¥O½žO½—O½O½‰O½‚O½{O½tO½mO½fO½_O½XO½QO½JO½CO½K½7K½0K½)K½"K½K½K½ K½K½ÿJ½øJ½ñJ½êJ½ãJ½ÜJ½ÕJ½ÎJ½ÇJ½ÀJ½¹J½²J½«J½¤J½J½–J½J½ˆJ½J½zJ½sJ½lJ½eJ½^J½WJ½PJ½IJ½BJ½;J½4J½-J½&J½J½J½J½ J½J½üI½õI½îI½çI½àI½ÙI½ÒI½ËI½ÄI½½I½¶I½¯I½¨I½¡I½šI½“I½ŒI½…I½~I½wI½pI½iI½bI½[I½TI½MI½FI½?I½8I½1I½*I½#I½I½I½I½I½I½ùH½òH½ëH½äH½ÝH½ÖH½ÏH½ÈH½ÁH½ºH½³H½¬H½¥H½žH½—H½H½‰H½‚H½{H½tH½mH½fH½_H½XH½QH½JH½CH½D½7D½0D½)D½"D½D½D½ D½D½ÿC½øC½ñC½êC½ãC½ÜC½ÕC½ÎC½ÇC½ÀC½¹C½²C½«C½¤C½C½–C½C½ˆC½C½zC½sC½lC½eC½^C½WC½PC½IC½BC½;C½4C½-C½&C½C½C½C½ C½C½üB½õB½îB½çB½àB½ÙB½ÒB½ËB½ÄB½½B½¶B½¯B½¨B½¡B½šB½“B½ŒB½…B½~B½wB½pB½iB½bB½[B½TB½MB½FB½?B½8B½1B½*B½#B½B½B½B½B½B½ùA½òA½ëA½äA½ÝA½ÖA½ÏA½ÈA½ÁA½ºA½³A½¬A½¥A½žA½—A½A½‰A½‚A½{A½tA½mA½fA½_A½XA½QA½JA½CA½½÷>½ð>½é>½â>½Û>½Ô>½Í>½Æ>½¿>½¸>½±>½ª>½£>½œ>½•>½Ž>½‡>½€>½y>½r>½k>½d>½]>½V>½O>½H>½A>½:>½3>½,>½%>½>½>½>½ >½>½û=½ô=½í=½æ=½ß=½Ø=½Ñ=½Ê=½Ã=½¼=½µ=½®=½§=½ =½™=½’=½‹=½„=½}=½v=½o=½h=½a=½Z=½S=½L=½E=½>=½7=½0=½)=½"=½=½=½ =½=½ÿ<½ø<½ñ<½ê<½ã<½Ü<½Õ<½Î<½Ç<½À<½¹<½²<½«<½¤<½<½–<½<½ˆ<½<½z<½s<½l<½e<½^<½W<½P<½I<½B<½;<½4<½-<½&<½<½<½<½ <½<½ü;½õ;½î;½ç;½à;½Ù;½Ò;½Ë;½Ä;½½;½¶;½¯;½¨;½¡;½š;½“;½Œ;½…;½~;½w;½p;½i;½b;½[;½T;½M;½F;½?;½8;½1;½*;½#;½;½;½;½;½;½ù:½ò:½ë:½ä:½Ý:½Ö:½Ï:½È:½Á:½º:½³:½¬:½¥:½ž:½—:½:½‰:½‚:½{:½t:½m:½f:½_:½X:½Q:½J:½C:½<:½5:½.:½':½ :½:½:½ :½:½ý9½ö9½ï9½è9½á9½Ú9½Ó9½Ì9½Å9½¾9½·9½°9½©9½¢9½›9½”9½9½†9½9½x9½q9½j9½c9½\9½U9½N9½G9½@9½99½29½+9½$9½9½9½9½9½9½ú8½ó8½ì8½å8½Þ8½×8½Ð8½É8½Â8½»8½´8½­8½¦8½Ÿ8½˜8½‘8½Š8½ƒ8½|8½u8½n8½g8½`8½Y8½R8½K8½D8½=8½68½/8½(8½!8½8½8½ 8½8½þ7½÷7½ð7½é7½â7½Û7½Ô7½Í7½Æ7½¿7½¸7½±7½ª7½£7½œ7½•7½Ž7½‡7½€7½y7½r7½k7½d7½]7½V7½O7½H7½A7½:7½37½,7½%7½7½7½7½ 7½7½û6½ô6½í6½æ6½ß6½Ø6½Ñ6½Ê6½Ã6½¼6½µ6½®6½§6½ 6½™6½’6½‹6½„6½}6½v6½o6½h6½a6½Z6½S6½L6½E6½>6½76½06½)6½"6½6½6½ 6½6½ÿ5½ø5½ñ5½ê5½ã5½Ü5½Õ5½Î5½Ç5½À5½¹5½²5½«5½¤5½5½–5½5½ˆ5½5½z5½s5½l5½e5½^5½W5½P5½I5½B5½;5½45½-5½&5½5½5½5½ 5½5½ü4½õ4½î4½ç4½à4½Ù4½Ò4½Ë4½Ä4½½4½¶4½¯4½¨4½¡4½š4½“4½Œ4½…4½~4½w4½p4½i4½b4½[4½T4½M4½F4½?4½84½14½*4½#4½4½4½4½4½4½ù3½ò3½ë3½ä3½Ý3½Ö3½Ï3½È3½Á3½º3½³3½¬3½¥3½ž3½—3½3½‰3½‚3½{3½t3½m3½f3½_3½X3½Q3½J3½C3½<3½53½.3½'3½ 3½3½3½ 3½3½ý2½ö2½ï2½è2½á2½Ú2½Ó2½Ì2½Å2½¾2½·2½°2½©2½¢2½›2½”2½2½†2½2½x2½q2½j2½c2½\2½U2½N2½G2½@2½92½22½+2½$2½2½2½2½2½2½ú1½ó1½ì1½å1½Þ1½×1½Ð1½É1½Â1½»1½´1½­1½¦1½Ÿ1½˜1½‘1½Š1½ƒ1½|1½u1½n1½g1½`1½Y1½R1½K1½D1½=1½61½/1½(1½!1½1½1½ 1½1½þ0½÷0½ð0½é0½â0½Û0½Ô0½Í0½Æ0½¿0½¸0½±0½ª0½£0½œ0½•0½Ž0½‡0½€0½y0½r0½k0½d0½]0½V0½O0½H0½A0½:0½30½,0½%0½0½0½0½ 0½0½û/½ô/½í/½æ/½ß/½Ø/½Ñ/½Ê/½Ã/½¼/½µ/½®/½§/½ /½™/½’/½‹/½„/½}/½v/½o/½h/½a/½Z/½S/½L/½E/½>/½7/½0/½)/½"/½/½/½ /½/½ÿ.½ø.½ñ.½ê.½ã.½Ü.½Õ.½Î.½Ç.½À.½¹.½².½«.½¤.½.½–.½.½ˆ.½.½z.½s.½l.½e.½^.½W.½P.½I.½B.½;.½4.½-.½&.½.½.½.½ .½.½ü-½õ-½î-½ç-½à-½Ù-½Ò-½Ë-½Ä-½½-½¶-½¯-½¨-½¡-½š-½“-½Œ-½…-½~-½w-½p-½i-½b-½[-½T-½M-½F-½?-½8-½1-½*-½#-½-½-½-½-½-½ù,½ò,½ë,½ä,½Ý,½Ö,½Ï,½È,½Á,½º,½³,½¬,½¥,½ž,½—,½,½‰,½‚,½{,½t,½m,½f,½_,½X,½Q,½J,½C,½<,½5,½.,½',½ ,½,½,½ ,½,½ý+½ö+½ï+½è+½á+½Ú+½Ó+½Ì+½Å+½¾+½·+½°+½©+½¢+½›+½”+½+½†+½+½x+½q+½j+½c+½\+½U+½N+½G+½@+½9+½2+½++½$+½+½+½+½+½+½ú*½ó*½ì*½å*½Þ*½×*½Ð*½É*½Â*½»*½´*½­*½¦*½Ÿ*½˜*½‘*½Š*½ƒ*½|*½u*½n*½g*½`*½Y*½R*½K*½D*½=*½6*½/*½(*½!*½*½*½ *½*½þ)½÷)½ð)½é)½â)½Û)½Ô)½Í)½Æ)½¿)½¸)½±)½ª)½£)½œ)½•)½Ž)½‡)½€)½y)½r)½k)½d)½])½V)½O)½H)½A)½:)½3)½,)½%)½)½)½)½ )½)½û(½ô(½í(½æ(½ß(½Ø(½Ñ(½Ê(½Ã(½¼(½µ(½®(½§(½ (½™(½’(½‹(½„(½}(½v(½o(½h(½a(½Z(½S(½L(½E(½>(½7(½0(½)(½"(½(½(½ (½(½ÿ'½ø'½ñ'½ê'½ã'½Ü'½Õ'½Î'½Ç'½À'½¹'½²'½«'½¤'½'½–'½'½ˆ'½'½z'½s'½l'½e'½^'½W'½P'½I'½B'½;'½4'½-'½&'½'½'½'½ '½'½ü&½õ&½î&½ç&½à&½Ù&½Ò&½Ë&½Ä&½½&½¶&½¯&½¨&½¡&½š&½“&½Œ&½…&½~&½w&½p&½i&½b&½[&½T&½M&½F&½?&½8&½1&½*&½#&½&½&½&½&½&½ù%½ò%½ë%½ä%½Ý%½Ö%½Ï%½È%½Á%½º%½³%½¬%½¥%½ž%½—%½%½‰%½‚%½{%½t%½m%½f%½_%½X%½Q%½J%½C%½<%½5%½.%½'%½ %½%½%½ %½%½ý$½ö$½ï$½è$½á$½Ú$½Ó$½Ì$½Å$½¾$½·$½°$½©$½¢$½›$½”$½$½†$½$½x$½q$½j$½c$½\$½U$½N$½G$½@$½9$½2$½+$½$$½$½$½$½$½$½ú#½ó#½ì#½å#½Þ#½×#½Ð#½É#½Â#½»#½´#½­#½¦#½Ÿ#½˜#½‘#½Š#½ƒ#½|#½u#½n#½g#½`#½Y#½R#½K#½D#½=#½6#½/#½(#½!#½#½#½ #½#½þ"½÷"½ð"½é"½â"½Û"½Ô"½Í"½Æ"½¿"½¸"½±"½ª"½£"½œ"½•"½Ž"½‡"½€"½y"½r"½k"½d"½]"½V"½O"½H"½A"½:"½3"½,"½%"½"½"½"½ "½"½û!½ô!½í!½æ!½ß!½Ø!½Ñ!½Ê!½Ã!½¼!½µ!½®!½§!½ !½™!½’!½‹!½„!½}!½v!½o!½h!½a!½Z!½S!½L!½E!½>!½7!½0!½)!½"!½!½!½ !½!½ÿ ½ø ½ñ ½ê ½ã ½Ü ½Õ ½Î ½Ç ½À ½¹ ½² ½« ½¤ ½ ½– ½ ½ˆ ½ ½z ½s ½l ½e ½^ ½W ½P ½I ½B ½; ½4 ½- ½& ½ ½ ½ ½ ½ ½ü½õ½î½ç½à½Ù½Ò½Ë½Ä½½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù½ò½ë½ä½Ý½Ö½Ï½È½Á½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú½ó½ì½å½Þ½×½Ð½É½Â½»½´½­½¦½Ÿ½˜½‘½Š½ƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ½÷½ð½é½â½Û½Ô½Í½Æ½¿½¸½±½ª½£½œ½•½Ž½‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û½ô½í½æ½ß½Ø½Ñ½Ê½Ã½¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ½ø½ñ½ê½ã½Ü½Õ½Î½Ç½À½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü½õ½î½ç½à½Ù½Ò½Ë½Ä½½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù½ò½ë½ä½Ý½Ö½Ï½È½Á½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú½ó½ì½å½Þ½×½Ð½É½Â½»½´½­½¦½Ÿ½˜½‘½Š½ƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ½÷½ð½é½â½Û½Ô½Í½Æ½¿½¸½±½ª½£½œ½•½Ž½‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û½ô½í½æ½ß½Ø½Ñ½Ê½Ã½¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ½ø½ñ½ê½ã½Ü½Õ½Î½Ç½À½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü½õ½î½ç½à½Ù½Ò½Ë½Ä½½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù½ò½ë½ä½Ý½Ö½Ï½È½Á½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú½ó½ì½å½Þ½×½Ð½É½Â½»½´½­½¦½Ÿ½˜½‘½Š½ƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ ½÷ ½ð ½é ½â ½Û ½Ô ½Í ½Æ ½¿ ½¸ ½± ½ª ½£ ½œ ½• ½Ž ½‡ ½€ ½y ½r ½k ½d ½] ½V ½O ½H ½A ½: ½3 ½, ½% ½ ½ ½ ½ ½ ½û ½ô ½í ½æ ½ß ½Ø ½Ñ ½Ê ½à ½¼ ½µ ½® ½§ ½  ½™ ½’ ½‹ ½„ ½} ½v ½o ½h ½a ½Z ½S ½L ½E ½> ½7 ½0 ½) ½" ½ ½ ½ ½ ½ÿ ½ø ½ñ ½ê ½ã ½Ü ½Õ ½Î ½Ç ½À ½¹ ½² ½« ½¤ ½ ½– ½ ½ˆ ½ ½z ½s ½l ½e ½^ ½W ½P ½I ½B ½; ½4 ½- ½& ½ ½ ½ ½ ½ ½ü ½õ ½î ½ç ½à ½Ù ½Ò ½Ë ½Ä ½½ ½¶ ½¯ ½¨ ½¡ ½š ½“ ½Œ ½… ½~ ½w ½p ½i ½b ½[ ½T ½M ½F ½? ½8 ½1 ½* ½# ½ ½ ½ ½ ½ ½ù ½ò ½ë ½ä ½Ý ½Ö ½Ï ½È ½Á ½º ½³ ½¬ ½¥ ½ž ½— ½ ½‰ ½‚ ½{ ½t ½m ½f ½_ ½X ½Q ½J ½C ½< ½5 ½. ½' ½ ½ ½ ½ ½ ½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú½ó½ì½å½Þ½×½Ð½É½Â½»½´½­½¦½Ÿ½˜½‘½Š½ƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ½÷½ð½é½â½Û½Ô½Í½Æ½¿½¸½±½ª½£½œ½•½Ž½‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û½ô½í½æ½ß½Ø½Ñ½Ê½Ã½¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ½ø½ñ½ê½ã½Ü½Õ½Î½Ç½À½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü½õ½î½ç½à½Ù½Ò½Ë½Ä½½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù½ò½ë½ä½Ý½Ö½Ï½È½Á½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý½ö½ï½è½á½Ú½Ó½Ì½Å½¾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þÿ¼÷ÿ¼ðÿ¼éÿ¼âÿ¼Ûÿ¼Ôÿ¼Íÿ¼Æÿ¼¿ÿ¼¸ÿ¼±ÿ¼ªÿ¼£ÿ¼œÿ¼•ÿ¼Žÿ¼‡ÿ¼€ÿ¼yÿ¼rÿ¼kÿ¼dÿ¼]ÿ¼Vÿ¼Oÿ¼Hÿ¼Aÿ¼:ÿ¼3ÿ¼,ÿ¼%ÿ¼ÿ¼ÿ¼ÿ¼ ÿ¼ÿ¼ûþ¼ôþ¼íþ¼æþ¼ßþ¼Øþ¼Ñþ¼Êþ¼Ãþ¼¼þ¼µþ¼®þ¼§þ¼ þ¼™þ¼’þ¼‹þ¼„þ¼}þ¼vþ¼oþ¼hþ¼aþ¼Zþ¼Sþ¼Lþ¼Eþ¼>þ¼7þ¼0þ¼)þ¼"þ¼þ¼þ¼ þ¼þ¼ÿý¼øý¼ñý¼êý¼ãý¼Üý¼Õý¼Îý¼Çý¼Àý¼¹ý¼²ý¼«ý¼¤ý¼ý¼–ý¼ý¼ˆý¼ý¼zý¼sý¼lý¼eý¼^ý¼Wý¼Pý¼Iý¼Bý¼;ý¼4ý¼-ý¼&ý¼ý¼ý¼ý¼ ý¼ý¼üü¼õü¼îü¼çü¼àü¼Ùü¼Òü¼Ëü¼Äü¼½ü¼¶ü¼¯ü¼¨ü¼¡ü¼šü¼“ü¼Œü¼…ü¼~ü¼wü¼pü¼iü¼bü¼[ü¼Tü¼Mü¼Fü¼?ü¼8ü¼1ü¼*ü¼#ü¼ü¼ü¼ü¼ü¼ü¼ùû¼òû¼ëû¼äû¼Ýû¼Öû¼Ïû¼Èû¼Áû¼ºû¼³û¼¬û¼¥û¼žû¼—û¼û¼‰û¼‚û¼{û¼tû¼mû¼fû¼_û¼Xû¼Qû¼Jû¼Cû¼<û¼5û¼.û¼'û¼ û¼û¼û¼ û¼û¼ýú¼öú¼ïú¼èú¼áú¼Úú¼Óú¼Ìú¼Åú¼¾ú¼·ú¼°ú¼©ú¼¢ú¼›ú¼”ú¼ú¼†ú¼ú¼xú¼qú¼jú¼cú¼\ú¼Uú¼Nú¼Gú¼@ú¼9ú¼2ú¼+ú¼$ú¼ú¼ú¼ú¼ú¼ú¼úù¼óù¼ìù¼åù¼Þù¼×ù¼Ðù¼Éù¼Âù¼»ù¼´ù¼­ù¼¦ù¼Ÿù¼˜ù¼‘ù¼Šù¼ƒù¼|ù¼uù¼nù¼gù¼`ù¼Yù¼Rù¼Kù¼Dù¼=ù¼6ù¼/ù¼(ù¼!ù¼ù¼ù¼ ù¼ù¼þø¼÷ø¼ðø¼éø¼âø¼Ûø¼Ôø¼Íø¼Æø¼¿ø¼¸ø¼±ø¼ªø¼£ø¼œø¼•ø¼Žø¼‡ø¼€ø¼yø¼rø¼kø¼dø¼]ø¼Vø¼Oø¼Hø¼Aø¼:ø¼3ø¼,ø¼%ø¼ø¼ø¼ø¼ ø¼ø¼û÷¼ô÷¼í÷¼æ÷¼ß÷¼Ø÷¼Ñ÷¼Ê÷¼Ã÷¼¼÷¼µ÷¼®÷¼§÷¼ ÷¼™÷¼’÷¼‹÷¼„÷¼}÷¼v÷¼o÷¼h÷¼a÷¼Z÷¼S÷¼L÷¼E÷¼>÷¼7÷¼0÷¼)÷¼"÷¼÷¼÷¼ ÷¼÷¼ÿö¼øö¼ñö¼êö¼ãö¼Üö¼Õö¼Îö¼Çö¼Àö¼¹ö¼²ö¼«ö¼¤ö¼ö¼–ö¼ö¼ˆö¼ö¼zö¼sö¼lö¼eö¼^ö¼Wö¼Pö¼Iö¼Bö¼;ö¼4ö¼-ö¼&ö¼ö¼ö¼ö¼ ö¼ö¼üõ¼õõ¼îõ¼çõ¼àõ¼Ùõ¼Òõ¼Ëõ¼Äõ¼½õ¼¶õ¼¯õ¼¨õ¼¡õ¼šõ¼“õ¼Œõ¼…õ¼~õ¼wõ¼põ¼iõ¼bõ¼[õ¼Tõ¼Mõ¼Fõ¼?õ¼8õ¼1õ¼*õ¼#õ¼õ¼õ¼õ¼õ¼õ¼ùô¼òô¼ëô¼äô¼Ýô¼Öô¼Ïô¼Èô¼Áô¼ºô¼³ô¼¬ô¼¥ô¼žô¼—ô¼ô¼‰ô¼‚ô¼{ô¼tô¼mô¼fô¼_ô¼Xô¼Qô¼Jô¼Cô¼<ô¼5ô¼.ô¼'ô¼ ô¼ô¼ô¼ ô¼ô¼ýó¼öó¼ïó¼èó¼áó¼Úó¼Óó¼Ìó¼Åó¼¾ó¼·ó¼°ó¼©ó¼¢ó¼›ó¼”ó¼ó¼†ó¼ó¼xó¼qó¼jó¼có¼\ó¼Uó¼Nó¼Gó¼@ó¼9ó¼2ó¼+ó¼$ó¼ó¼ó¼ó¼ó¼ó¼úò¼óò¼ìò¼åò¼Þò¼×ò¼Ðò¼Éò¼Âò¼»ò¼´ò¼­ò¼¦ò¼Ÿò¼˜ò¼‘ò¼Šò¼ƒò¼|ò¼uò¼nò¼gò¼`ò¼Yò¼Rò¼Kò¼Dò¼=ò¼6ò¼/ò¼(ò¼!ò¼ò¼ò¼ ò¼ò¼þñ¼÷ñ¼ðñ¼éñ¼âñ¼Ûñ¼Ôñ¼Íñ¼Æñ¼¿ñ¼¸ñ¼±ñ¼ªñ¼£ñ¼œñ¼•ñ¼Žñ¼‡ñ¼€ñ¼yñ¼rñ¼kñ¼dñ¼]ñ¼Vñ¼Oñ¼Hñ¼Añ¼:ñ¼3ñ¼,ñ¼%ñ¼ñ¼ñ¼ñ¼ ñ¼ñ¼ûð¼ôð¼íð¼æð¼ßð¼Øð¼Ñð¼Êð¼Ãð¼¼ð¼µð¼®ð¼§ð¼ ð¼™ð¼’ð¼‹ð¼„ð¼}ð¼vð¼oð¼hð¼að¼Zð¼Sð¼Lð¼Eð¼>ð¼7ð¼0ð¼)ð¼"ð¼ð¼ð¼ ð¼ð¼ÿï¼øï¼ñï¼êï¼ãï¼Üï¼Õï¼Îï¼Çï¼ÀYRKDï¼ï¼–ï¼ï¼ˆï¼ï¼zï¼sï¼lï¼eï¼^ï¼Wï¼Pï¼Iï¼Bï¼;ï¼4ï¼-ï¼&ï¼ï¼ï¼ï¼ ï¼ï¼üî¼õî¼îî¼çî¼àî¼Ùî¼Òî¼Ëî¼Äî¼~î¼wî¼pî¼iî¼bî¼[î¼Tî¼Mî¼Fî¼?î¼8î¼1î¼*î¼#î¼î¼î¼î¼î¼î¼ùí¼òí¼ëí¼äí¼Ýí¼Öí¼Ïí¼Èí¼Áí¼ºí¼³í¼¬í¼¥í¼ží¼—í¼í¼‰í¼‚í¼{í¼tí¼mí¼fí¼_í¼Xí¼Qí¼Jí¼Cí¼<í¼5í¼.í¼'í¼ í¼í¼í¼ í¼í¼ýì¼öì¼ïì¼èì¼áì¼Úì¼Óì¼Ìì¼Å켾켷켰켩켢켛켔ì¼ì¼†ì¼ì¼xì¼qì¼jì¼cì¼\ì¼Uì¼Nì¼Gì¼@ì¼9ì¼2ì¼+ì¼$ì¼ì¼ì¼ì¼ì¼ì¼úë¼óë¼ìë¼åë¼Þë¼×ë¼Ðë¼Éë¼Â뼻뼴뼭뼦뼟뼘뼑뼊뼃ë¼|ë¼uë¼në¼gë¼`ë¼Yë¼Rë¼Kë¼Dë¼=ë¼6ë¼/ë¼(ë¼!ë¼ë¼ë¼ ë¼ë¼þê¼÷ê¼ðê¼éê¼âê¼Ûê¼Ôê¼Íê¼Æê¼¿ê¼¸ê¼±ê¼ªê¼£ê¼œê¼•ê¼Žê¼‡ê¼€ê¼yê¼rê¼kê¼dê¼]ê¼Vê¼Oê¼Hê¼Aê¼:ê¼3ê¼,ê¼%ê¼ê¼ê¼ê¼ ê¼ê¼ûé¼ôé¼í鼿é¼ß鼨é¼Ñé¼Êé¼Ã鼼鼵鼮鼧鼠鼙鼒鼋鼄é¼}é¼vé¼oé¼hé¼aé¼Zé¼Sé¼Lé¼Eé¼>é¼7é¼0é¼)é¼"é¼é¼é¼ é¼é¼ÿè¼øè¼ñè¼êè¼ãè¼Üè¼Õè¼Îè¼Çè¼À輹輲輫輤è¼è¼–è¼è¼ˆè¼è¼zè¼sè¼lè¼eè¼^è¼Wè¼Pè¼Iè¼Bè¼;è¼4è¼-è¼&è¼è¼è¼è¼ è¼è¼üç¼õç¼îç¼çç¼àç¼Ùç¼Òç¼Ëç¼Ä缽缶缯缨缡缚缓缌缅ç¼~ç¼wç¼pç¼iç¼bç¼[ç¼Tç¼Mç¼Fç¼?ç¼8ç¼1ç¼*ç¼#ç¼ç¼ç¼ç¼ç¼ç¼ùæ¼òæ¼ëæ¼äæ¼Ýæ¼Öæ¼Ïæ¼Èæ¼Áæ¼ºæ¼³æ¼¬æ¼¥æ¼žæ¼—æ¼æ¼‰æ¼‚æ¼{æ¼tæ¼mæ¼fæ¼_æ¼Xæ¼Qæ¼Jæ¼Cæ¼<æ¼5æ¼.æ¼'æ¼ æ¼æ¼æ¼ æ¼æ¼ýå¼öå¼ïå¼èå¼áå¼Úå¼Óå¼Ìå¼Å弾強弰弩弢弛弔å¼å¼†å¼å¼xå¼qå¼jå¼cå¼\å¼Uå¼Nå¼Gå¼@å¼9å¼2å¼+å¼$å¼å¼å¼å¼å¼å¼úä¼óä¼ìä¼åä¼Þä¼×ä¼Ðä¼Éä¼Â伻伴伭伦伟优休伊伃ä¼|ä¼uä¼nä¼gä¼`ä¼Yä¼Rä¼Kä¼Dä¼=ä¼6ä¼/ä¼(ä¼!ä¼ä¼ä¼ ä¼ä¼þã¼÷ã¼ðã¼éã¼âã¼Ûã¼Ôã¼Íã¼Æã¼¿ã¼¸ã¼±ã¼ªã¼£ã¼œã¼•ã¼Žã¼‡ã¼€ã¼yã¼rã¼kã¼dã¼]ã¼Vã¼Oã¼Hã¼Aã¼:ã¼3ã¼,ã¼%ã¼ã¼ã¼ã¼ ã¼ã¼ûâ¼ôâ¼íâ¼æâ¼ßâ¼Øâ¼Ñâ¼Êâ¼Ã⼼⼵⼮⼧⼠⼙⼒⼋⼄â¼}â¼vâ¼oâ¼hâ¼aâ¼Zâ¼Sâ¼Lâ¼Eâ¼>â¼7â¼0â¼)â¼"â¼â¼â¼ â¼â¼ÿá¼øá¼ñá¼êá¼ãá¼Üá¼Õá¼Îá¼Çá¼ÀἹἲἫἤá¼á¼–á¼á¼ˆá¼á¼zá¼sá¼lá¼eá¼^á¼Wá¼Pá¼Iá¼Bá¼;á¼4á¼-á¼&á¼á¼á¼á¼ á¼á¼üà¼õà¼îà¼çà¼àà¼Ùà¼Òà¼Ëà¼Ä༽༶༯༨༡༚༓༌༅à¼~à¼wà¼pà¼ià¼bà¼[à¼Tà¼Mà¼Fà¼?à¼8à¼1à¼*à¼#à¼à¼à¼à¼à¼à¼ùß¼òß¼ëß¼äß¼Ýß¼Öß¼Ïß¼Èß¼Áß¼ºß¼³ß¼¬ß¼¥ß¼žß¼—߼߼‰ß¼‚ß¼{ß¼tß¼mß¼fß¼_ß¼Xß¼Qß¼Jß¼Cß¼<ß¼5ß¼.ß¼'ß¼ ߼߼߼ ߼߼ýÞ¼öÞ¼ïÞ¼èÞ¼áÞ¼ÚÞ¼ÓÞ¼ÌÞ¼ÅÞ¼¾Þ¼·Þ¼°Þ¼©Þ¼¢Þ¼›Þ¼”Þ¼Þ¼†Þ¼Þ¼xÞ¼qÞ¼jÞ¼cÞ¼\Þ¼UÞ¼NÞ¼GÞ¼@Þ¼9Þ¼2Þ¼+Þ¼$Þ¼Þ¼Þ¼Þ¼Þ¼Þ¼úݼóݼìݼåݼÞݼ×ݼÐݼÉݼÂݼ»Ý¼´Ý¼­Ý¼¦Ý¼ŸÝ¼˜Ý¼‘ݼŠÝ¼ƒÝ¼|ݼuݼnݼgݼ`ݼYݼRݼKݼDݼ=ݼ6ݼ/ݼ(ݼ!ݼݼݼ ݼݼþܼ÷ܼðܼéܼâܼÛܼÔܼÍܼÆÜ¼¿Ü¼¸Ü¼±Ü¼ªÜ¼£Ü¼œÜ¼•ܼŽÜ¼‡Ü¼€Ü¼yܼrܼkܼdܼ]ܼVܼOܼHܼAܼ:ܼ3ܼ,ܼ%ܼܼܼܼ ܼܼûÛ¼ôÛ¼íÛ¼æÛ¼ßÛ¼ØÛ¼ÑÛ¼ÊÛ¼ÃÛ¼¼Û¼µÛ¼®Û¼§Û¼ Û¼™Û¼’Û¼‹Û¼„Û¼}Û¼vÛ¼oÛ¼hÛ¼aÛ¼ZÛ¼SÛ¼LÛ¼EÛ¼>Û¼7Û¼0Û¼)Û¼"Û¼Û¼Û¼ Û¼Û¼ÿÚ¼øÚ¼ñÚ¼êÚ¼ãÚ¼ÜÚ¼ÕÚ¼ÎÚ¼ÇÚ¼ÀÚ¼¹Ú¼²Ú¼«Ú¼¤Ú¼Ú¼–Ú¼Ú¼ˆÚ¼Ú¼zÚ¼sÚ¼lÚ¼eÚ¼^Ú¼WÚ¼PÚ¼IÚ¼BÚ¼;Ú¼4Ú¼-Ú¼&Ú¼Ú¼Ú¼Ú¼ Ú¼Ú¼üÙ¼õÙ¼îÙ¼çÙ¼àÙ¼ÙÙ¼ÒÙ¼ËÙ¼ÄÙ¼½Ù¼¶Ù¼¯Ù¼¨Ù¼¡Ù¼šÙ¼“Ù¼ŒÙ¼…Ù¼~Ù¼wÙ¼pÙ¼iÙ¼bÙ¼[Ù¼TÙ¼MÙ¼FÙ¼?Ù¼8Ù¼1Ù¼*Ù¼#ټټټټټټùؼòؼëØ¼䨼ÝØ¼ÖØ¼ÏØ¼ÈؼÁؼºØ¼³Ø¼¬Ø¼¥Ø¼žØ¼—ؼؼ‰Ø¼‚ؼ{ؼtؼmؼfؼ_ؼXؼQؼJؼCؼ<ؼ5ؼ.ؼ'ؼ ؼؼؼ ؼؼý×¼ö×¼ï×¼è×¼á×¼Ú×¼Ó×¼Ì×¼Å×¼¾×¼·×¼°×¼©×¼¢×¼›×¼”×¼×¼†×¼×¼x×¼q×¼j×¼c×¼\×¼U×¼N×¼G×¼@×¼9×¼2×¼+×¼$×¼×¼×¼×¼×¼×¼úÖ¼óÖ¼ìÖ¼åÖ¼ÞÖ¼×Ö¼ÐÖ¼ÉÖ¼ÂÖ¼»Ö¼´Ö¼­Ö¼¦Ö¼ŸÖ¼˜Ö¼‘Ö¼ŠÖ¼ƒÖ¼|Ö¼uÖ¼nÖ¼gÖ¼`Ö¼YÖ¼RÖ¼KÖ¼DÖ¼=Ö¼6Ö¼/Ö¼(Ö¼!Ö¼Ö¼Ö¼ Ö¼Ö¼þÕ¼÷Õ¼ðÕ¼éÕ¼âÕ¼ÛÕ¼ÔÕ¼ÍÕ¼ÆÕ¼¿Õ¼¸Õ¼±Õ¼ªÕ¼£Õ¼œÕ¼•Õ¼ŽÕ¼‡Õ¼€Õ¼yÕ¼rÕ¼kÕ¼dÕ¼]Õ¼VÕ¼OÕ¼HÕ¼AÕ¼:Õ¼3Õ¼,Õ¼%Õ¼Õ¼Õ¼Õ¼ Õ¼Õ¼ûÔ¼ôÔ¼íÔ¼æÔ¼ßÔ¼ØÔ¼ÑÔ¼ÊÔ¼ÃÔ¼¼Ô¼µÔ¼®Ô¼§Ô¼ Ô¼™Ô¼’Ô¼‹Ô¼„Ô¼}Ô¼vÔ¼oÔ¼hÔ¼aÔ¼ZÔ¼SÔ¼LÔ¼EÔ¼>Ô¼7Ô¼0Ô¼)Ô¼"Ô¼Ô¼Ô¼ Ô¼Ô¼ÿÓ¼øÓ¼ñÓ¼êÓ¼ãÓ¼ÜÓ¼ÕÓ¼ÎÓ¼ÇÓ¼ÀÓ¼¹Ó¼²Ó¼«Ó¼¤Ó¼Ó¼–Ó¼Ó¼ˆÓ¼Ó¼zÓ¼sÓ¼lÓ¼eÓ¼^Ó¼WÓ¼PÓ¼IÓ¼BÓ¼;Ó¼4Ó¼-Ó¼&Ó¼Ó¼Ó¼Ó¼ Ó¼Ó¼üÒ¼õÒ¼îÒ¼çÒ¼àÒ¼ÙÒ¼ÒÒ¼ËÒ¼ÄÒ¼½Ò¼¶Ò¼¯Ò¼¨Ò¼¡Ò¼šÒ¼“Ò¼ŒÒ¼…Ò¼~Ò¼wÒ¼pÒ¼iÒ¼bÒ¼[Ò¼TÒ¼MÒ¼FÒ¼?Ò¼8Ò¼1Ò¼*Ò¼#Ò¼Ò¼Ò¼Ò¼Ò¼Ò¼ùѼòѼëѼäѼÝѼÖѼÏѼÈѼÁѼºÑ¼³Ñ¼¬Ñ¼¥Ñ¼žÑ¼—ѼѼ‰Ñ¼‚Ѽ{ѼtѼmѼfѼ_ѼXѼQѼJѼCѼ<Ѽ5Ѽ.Ѽ'Ѽ ѼѼѼ ѼѼýмöмïмèмáмÚмÓмÌмÅм¾Ð¼·Ð¼°Ð¼©Ð¼¢Ð¼›Ð¼”мм†Ð¼мxмqмjмcм\мUмNмGм@м9м2м+м$ммммммúϼóϼìϼåϼÞϼ×ϼÐϼÉϼÂϼ»Ï¼´Ï¼­Ï¼¦Ï¼ŸÏ¼˜Ï¼‘ϼŠÏ¼ƒÏ¼|ϼuϼnϼgϼ`ϼYϼRϼKϼDϼ=ϼ6ϼ/ϼ(ϼ!ϼϼϼ ϼϼþμ÷μðμéμâμÛμÔμÍμÆÎ¼¿Î¼¸Î¼±Î¼ªÎ¼£Î¼œÎ¼•μŽÎ¼‡Î¼€Î¼yμrμkμdμ]μVμOμHμAμ:μ3μ,μ%μμμμ μμûͼôͼíͼæÍ¼ßͼØÍ¼ÑͼÊͼÃͼ¼Í¼µÍ¼®Í¼§Í¼ Í¼™Í¼’ͼ‹Í¼„ͼ}ͼvͼoͼhͼaͼZͼSͼLͼEͼ>ͼ7ͼ0ͼ)ͼ"ͼͼͼ ͼͼÿ̼øÌ¼ñ̼ê̼ã̼Ü̼Õ̼Î̼Ç̼À̼¹Ì¼²Ì¼«Ì¼¤Ì¼̼–̼̼ˆÌ¼̼z̼s̼l̼e̼^̼W̼P̼I̼B̼;̼4̼-̼&̼̼̼̼ ̼̼ü˼õ˼î˼ç˼à˼Ù˼Ò˼Ë˼Ä˼½Ë¼¶Ë¼¯Ë¼¨Ë¼¡Ë¼šË¼“˼ŒË¼…˼~˼w˼p˼i˼b˼[˼T˼M˼F˼?˼8˼1˼*˼#˼˼˼˼˼˼ùʼòʼëʼäʼÝʼÖʼÏʼÈʼÁʼºÊ¼³Ê¼¬Ê¼¥Ê¼žÊ¼—ʼʼ‰Ê¼‚ʼ{ʼtʼmʼfʼ_ʼXʼQʼJʼCʼ<ʼ5ʼ.ʼ'ʼ ʼʼʼ ʼʼýɼöɼïɼèɼáɼÚɼÓɼÌɼÅɼ¾É¼·É¼°É¼©É¼¢É¼›É¼”ɼɼ†É¼ɼxɼqɼjɼcɼ\ɼUɼNɼGɼ@ɼ9ɼ2ɼ+ɼ$ɼɼɼɼɼɼúȼóȼìȼåȼÞȼ×ȼÐȼÉȼÂȼ»È¼´È¼­È¼¦È¼ŸÈ¼˜È¼‘ȼŠÈ¼ƒÈ¼|ȼuȼnȼgȼ`ȼYȼRȼKȼDȼ=ȼ6ȼ/ȼ(ȼ!ȼȼȼ ȼȼþǼ÷ǼðǼéǼâǼÛǼÔǼÍǼÆÇ¼¿Ç¼¸Ç¼±Ç¼ªÇ¼£Ç¼œÇ¼•ǼŽÇ¼‡Ç¼€Ç¼yǼrǼkǼdǼ]ǼVǼOǼHǼAǼ:Ǽ3Ǽ,Ǽ%ǼǼǼǼ ǼǼûƼôƼíÆ¼æÆ¼߯¼ØÆ¼ÑÆ¼ÊÆ¼ÃƼ¼Æ¼µÆ¼®Æ¼§Æ¼ Æ¼™Æ¼’Ƽ‹Æ¼„Ƽ}ƼvƼoƼhƼaƼZƼSƼLƼEƼ>Ƽ7Ƽ0Ƽ)Ƽ"ƼƼƼ ƼƼÿżøÅ¼ñżêżãżÜżÕżÎżÇżÀż¹Å¼²Å¼«Å¼¤Å¼ż–żżˆÅ¼żzżsżlżeż^żWżPżIżBż;ż4ż-ż&żżżż żżüļõļîļçļàļÙļÒļËļÄļ½Ä¼¶Ä¼¯Ä¼¨Ä¼¡Ä¼šÄ¼“ļŒÄ¼…ļ~ļwļpļiļbļ[ļTļMļFļ?ļ8ļ1ļ*ļ#ļļļļļļùüòüëüäüÝüÖüÏüÈüÁüºÃ¼³Ã¼¬Ã¼¥Ã¼žÃ¼—üü‰Ã¼‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüý¼ö¼ï¼è¼á¼Ú¼Ó¼̼ż¾Â¼·Â¼°Â¼©Â¼¢Â¼›Â¼”¼¼†Â¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼úÁ¼óÁ¼ìÁ¼åÁ¼ÞÁ¼×Á¼ÐÁ¼ÉÁ¼ÂÁ¼»Á¼´Á¼­Á¼¦Á¼ŸÁ¼˜Á¼‘Á¼ŠÁ¼ƒÁ¼|Á¼uÁ¼nÁ¼gÁ¼`Á¼YÁ¼RÁ¼KÁ¼DÁ¼=Á¼6Á¼/Á¼(Á¼!Á¼Á¼Á¼ Á¼Á¼þÀ¼÷À¼ðÀ¼éÀ¼âÀ¼ÛÀ¼ÔÀ¼ÍÀ¼ÆÀ¼¿À¼¸À¼±À¼ªÀ¼£À¼œÀ¼•À¼ŽÀ¼‡À¼€À¼yÀ¼rÀ¼kÀ¼dÀ¼]À¼VÀ¼OÀ¼HÀ¼AÀ¼:À¼3À¼,À¼%À¼À¼À¼À¼ À¼À¼û¿¼ô¿¼í¿¼濼ß¿¼Ø¿¼Ñ¿¼Ê¿¼ÿ¼¼¿¼µ¿¼®¿¼§¿¼ ¿¼™¿¼’¿¼‹¿¼„¿¼}¿¼v¿¼o¿¼h¿¼a¿¼Z¿¼S¿¼L¿¼E¿¼>¿¼7¿¼0¿¼)¿¼"¿¼¿¼¿¼ ¿¼¿¼ÿ¾¼ø¾¼ñ¾¼ê¾¼ã¾¼ܾ¼Õ¾¼ξ¼Ǿ¼À¾¼¹¾¼²¾¼«¾¼¤¾¼¾¼–¾¼¾¼ˆ¾¼¾¼z¾¼s¾¼l¾¼e¾¼^¾¼W¾¼P¾¼I¾¼B¾¼;¾¼4¾¼-¾¼&¾¼¾¼¾¼¾¼ ¾¼¾¼ü½¼õ½¼î½¼ç½¼ོÙ½¼Ò½¼˽¼Ľ¼½½¼¶½¼¯½¼¨½¼¡½¼š½¼“½¼Œ½¼…½¼~½¼w½¼p½¼i½¼b½¼[½¼T½¼M½¼F½¼?½¼8½¼1½¼*½¼#½¼½¼½¼½¼½¼½¼ù¼¼ò¼¼ë¼¼ä¼¼ݼ¼Ö¼¼ϼ¼ȼ¼Á¼¼º¼¼³¼¼¬¼¼¥¼¼ž¼¼—¼¼¼¼‰¼¼‚¼¼{¼¼t¼¼m¼¼f¼¼_¼¼X¼¼Q¼¼J¼¼C¼¼<¼¼5¼¼.¼¼'¼¼ ¼¼¼¼¼¼ ¼¼¼¼ý»¼ö»¼ﻼ軼ỼÚ»¼Ó»¼Ì»¼Å»¼¾»¼·»¼°»¼©»¼¢»¼›»¼”»¼»¼†»¼»¼x»¼q»¼j»¼c»¼\»¼U»¼N»¼G»¼@»¼9»¼2»¼+»¼$»¼»¼»¼»¼»¼»¼úº¼óº¼캼庼Þº¼׺¼к¼ɺ¼º¼»º¼´º¼­º¼¦º¼Ÿº¼˜º¼‘º¼Šº¼ƒº¼|º¼uº¼nº¼gº¼`º¼Yº¼Rº¼Kº¼Dº¼=º¼6º¼/º¼(º¼!º¼º¼º¼ º¼º¼þ¹¼÷¹¼ð¹¼é¹¼â¹¼Û¹¼Ô¹¼͹¼ƹ¼¿¹¼¸¹¼±¹¼ª¹¼£¹¼œ¹¼•¹¼޹¼‡¹¼€¹¼y¹¼r¹¼k¹¼d¹¼]¹¼V¹¼O¹¼H¹¼A¹¼:¹¼3¹¼,¹¼%¹¼¹¼¹¼¹¼ ¹¼¹¼û¸¼ô¸¼í¸¼渼߸¼ظ¼Ѹ¼ʸ¼ø¼¼¸¼µ¸¼®¸¼§¸¼ ¸¼™¸¼’¸¼‹¸¼„¸¼}¸¼v¸¼o¸¼h¸¼a¸¼Z¸¼S¸¼L¸¼E¸¼>¸¼7¸¼0¸¼)¸¼"¸¼¸¼¸¼ ¸¼¸¼ÿ·¼ø·¼ñ·¼ê·¼ã·¼Ü·¼Õ·¼η¼Ç·¼À·¼¹·¼²·¼«·¼¤·¼·¼–·¼·¼ˆ·¼·¼z·¼s·¼l·¼e·¼^·¼W·¼P·¼I·¼B·¼;·¼4·¼-·¼&·¼·¼·¼·¼ ·¼·¼ü¶¼õ¶¼î¶¼ç¶¼à¶¼Ù¶¼Ò¶¼˶¼ͼ½¶¼¶¶¼¯¶¼¨¶¼¡¶¼š¶¼“¶¼Œ¶¼…¶¼~¶¼w¶¼p¶¼i¶¼b¶¼[¶¼T¶¼M¶¼F¶¼?¶¼8¶¼1¶¼*¶¼#¶¼¶¼¶¼¶¼¶¼¶¼ùµ¼òµ¼ëµ¼äµ¼ݵ¼Öµ¼ϵ¼ȵ¼Áµ¼ºµ¼³µ¼¬µ¼¥µ¼žµ¼—µ¼µ¼‰µ¼‚µ¼{µ¼tµ¼mµ¼fµ¼_µ¼Xµ¼Qµ¼Jµ¼Cµ¼<µ¼5µ¼.µ¼'µ¼ µ¼µ¼µ¼ µ¼µ¼ý´¼ö´¼ï´¼è´¼á´¼Ú´¼Ó´¼Ì´¼Å´¼¾´¼·´¼°´¼©´¼¢´¼›´¼”´¼´¼†´¼´¼x´¼q´¼j´¼c´¼\´¼U´¼N´¼G´¼@´¼9´¼2´¼+´¼$´¼´¼´¼´¼´¼´¼ú³¼ó³¼ì³¼å³¼Þ³¼׳¼г¼ɳ¼³¼»³¼´³¼­³¼¦³¼Ÿ³¼˜³¼‘³¼г¼ƒ³¼|³¼u³¼n³¼g³¼`³¼Y³¼R³¼K³¼D³¼=³¼6³¼/³¼(³¼!³¼³¼³¼ ³¼³¼þ²¼÷²¼ð²¼é²¼â²¼Û²¼Ô²¼Ͳ¼Ʋ¼¿²¼¸²¼±²¼ª²¼£²¼œ²¼•²¼޲¼‡²¼€²¼y²¼r²¼k²¼d²¼]²¼V²¼O²¼H²¼A²¼:²¼3²¼,²¼%²¼²¼²¼²¼ ²¼²¼û±¼ô±¼í±¼æ±¼ß±¼ر¼ѱ¼ʱ¼ñ¼¼±¼µ±¼®±¼§±¼ ±¼™±¼’±¼‹±¼„±¼}±¼v±¼o±¼h±¼a±¼Z±¼S±¼L±¼E±¼>±¼7±¼0±¼)±¼"±¼±¼±¼ ±¼±¼ÿ°¼ø°¼ñ°¼ê°¼ã°¼ܰ¼Õ°¼ΰ¼ǰ¼À°¼¹°¼²°¼«°¼¤°¼°¼–°¼°¼ˆ°¼°¼z°¼s°¼l°¼e°¼^°¼W°¼P°¼I°¼B°¼;°¼4°¼-°¼&°¼°¼°¼°¼ °¼°¼ü¯¼õ¯¼篼௼Ù¯¼Ò¯¼˯¼į¼½¯¼¶¯¼¯¯¼¨¯¼¡¯¼š¯¼“¯¼Œ¯¼…¯¼~¯¼w¯¼p¯¼i¯¼b¯¼[¯¼T¯¼M¯¼F¯¼?¯¼8¯¼1¯¼*¯¼#¯¼¯¼¯¼¯¼¯¼¯¼ù®¼ò®¼뮼䮼Ý®¼Ö®¼Ï®¼È®¼Á®¼º®¼³®¼¬®¼¥®¼ž®¼—®¼®¼‰®¼‚®¼{®¼t®¼m®¼f®¼_®¼X®¼Q®¼J®¼C®¼<®¼5®¼.®¼'®¼ ®¼®¼®¼ ®¼®¼ý­¼ö­¼ï­¼è­¼á­¼Ú­¼Ó­¼Ì­¼Å­¼¾­¼·­¼°­¼©­¼¢­¼›­¼”­¼­¼†­¼­¼x­¼q­¼j­¼c­¼\­¼U­¼N­¼G­¼@­¼9­¼2­¼+­¼$­¼­¼­¼­¼­¼­¼ú¬¼ó¬¼쬼嬼Þ¬¼׬¼Ь¼ɬ¼¬¼»¬¼´¬¼­¬¼¦¬¼Ÿ¬¼˜¬¼‘¬¼Ь¼ƒ¬¼|¬¼u¬¼n¬¼g¬¼`¬¼Y¬¼R¬¼K¬¼D¬¼=¬¼6¬¼/¬¼(¬¼!¬¼¬¼¬¼ ¬¼¬¼þ«¼÷«¼ð«¼髼⫼Û«¼Ô«¼Í«¼Æ«¼¿«¼¸«¼±«¼ª«¼£«¼œ«¼•«¼Ž«¼‡«¼€«¼y«¼r«¼k«¼d«¼]«¼V«¼O«¼H«¼A«¼:«¼3«¼,«¼%«¼«¼«¼«¼ «¼«¼ûª¼ôª¼íª¼檼ߪ¼ت¼Ѫ¼ʪ¼ê¼¼ª¼µª¼®ª¼§ª¼ ª¼™ª¼’ª¼‹ª¼„ª¼}ª¼vª¼oª¼hª¼aª¼Zª¼Sª¼Lª¼Eª¼>ª¼7ª¼0ª¼)ª¼"ª¼ª¼ª¼ ª¼ª¼ÿ©¼ø©¼ñ©¼ꩼ㩼Ü©¼Õ©¼Ω¼Ç©¼À©¼¹©¼²©¼«©¼¤©¼©¼–©¼©¼ˆ©¼©¼z©¼s©¼l©¼e©¼^©¼W©¼P©¼I©¼B©¼;©¼4©¼-©¼&©¼©¼©¼©¼ ©¼©¼ü¨¼õ¨¼稼਼Ù¨¼Ò¨¼˨¼Ĩ¼½¨¼¶¨¼¯¨¼¨¨¼¡¨¼š¨¼“¨¼Œ¨¼…¨¼~¨¼w¨¼p¨¼i¨¼b¨¼[¨¼T¨¼M¨¼F¨¼?¨¼8¨¼1¨¼*¨¼#¨¼¨¼¨¼¨¼¨¼¨¼ù§¼ò§¼ë§¼ä§¼ݧ¼Ö§¼ϧ¼ȧ¼Á§¼º§¼³§¼¬§¼¥§¼ž§¼—§¼§¼‰§¼‚§¼{§¼t§¼m§¼f§¼_§¼X§¼Q§¼J§¼C§¼<§¼5§¼.§¼'§¼ §¼§¼§¼ §¼§¼ý¦¼ö¦¼寮覼ᦼÚ¦¼Ó¦¼̦¼Ŧ¼¾¦¼·¦¼°¦¼©¦¼¢¦¼›¦¼”¦¼¦¼†¦¼¦¼x¦¼q¦¼j¦¼c¦¼\¦¼U¦¼N¦¼G¦¼@¦¼9¦¼2¦¼+¦¼$¦¼¦¼¦¼¦¼¦¼¦¼ú¥¼ó¥¼쥼奼Þ¥¼×¥¼Ð¥¼É¥¼Â¥¼»¥¼´¥¼­¥¼¦¥¼Ÿ¥¼˜¥¼‘¥¼Š¥¼ƒ¥¼|¥¼u¥¼n¥¼g¥¼`¥¼Y¥¼R¥¼K¥¼D¥¼=¥¼6¥¼/¥¼(¥¼!¥¼¥¼¥¼ ¥¼¥¼þ¤¼÷¤¼ð¤¼餼⤼Û¤¼Ô¤¼ͤ¼Ƥ¼¿¤¼¸¤¼±¤¼ª¤¼£¤¼œ¤¼•¤¼ޤ¼‡¤¼€¤¼y¤¼r¤¼k¤¼d¤¼]¤¼V¤¼O¤¼H¤¼A¤¼:¤¼3¤¼,¤¼%¤¼¤¼¤¼¤¼ ¤¼¤¼û£¼ô£¼í£¼棼ߣ¼Ø£¼Ñ£¼Ê£¼ã¼¼£¼µ£¼®£¼§£¼ £¼™£¼’£¼‹£¼„£¼}£¼v£¼o£¼h£¼a£¼Z£¼S£¼L£¼E£¼>£¼7£¼0£¼)£¼"£¼£¼£¼ £¼£¼ÿ¢¼ø¢¼ñ¢¼ꢼ㢼Ü¢¼Õ¢¼΢¼Ç¢¼À¢¼¹¢¼²¢¼«¢¼¤¢¼¢¼–¢¼¢¼ˆ¢¼¢¼z¢¼s¢¼l¢¼e¢¼^¢¼W¢¼P¢¼I¢¼B¢¼;¢¼4¢¼-¢¼&¢¼¢¼¢¼¢¼ ¢¼¢¼ü¡¼õ¡¼硼ࡼÙ¡¼Ò¡¼Ë¡¼Ä¡¼½¡¼¶¡¼¯¡¼¨¡¼¡¡¼š¡¼“¡¼Œ¡¼…¡¼~¡¼w¡¼p¡¼i¡¼b¡¼[¡¼T¡¼M¡¼F¡¼?¡¼8¡¼1¡¼*¡¼#¡¼¡¼¡¼¡¼¡¼¡¼ù ¼ò ¼ë ¼ä ¼Ý ¼Ö ¼Ï ¼È ¼Á ¼º ¼³ ¼¬ ¼¥ ¼ž ¼— ¼ ¼‰ ¼‚ ¼{ ¼t ¼m ¼f ¼_ ¼X ¼Q ¼J ¼C ¼< ¼5 ¼. ¼' ¼  ¼ ¼ ¼  ¼ ¼ýŸ¼öŸ¼蟼៼ÚŸ¼ÓŸ¼ÌŸ¼ÅŸ¼¾Ÿ¼·Ÿ¼°Ÿ¼©Ÿ¼¢Ÿ¼›Ÿ¼”Ÿ¼Ÿ¼†Ÿ¼Ÿ¼xŸ¼qŸ¼jŸ¼cŸ¼\Ÿ¼UŸ¼NŸ¼GŸ¼@Ÿ¼9Ÿ¼2Ÿ¼+Ÿ¼$Ÿ¼Ÿ¼Ÿ¼Ÿ¼Ÿ¼Ÿ¼úž¼óž¼ìž¼åž¼Þž¼מ¼О¼Éž¼ž¼»ž¼´ž¼­ž¼¦ž¼Ÿž¼˜ž¼‘ž¼Šž¼ƒž¼|ž¼už¼nž¼gž¼`ž¼Yž¼Rž¼Kž¼Dž¼=ž¼6ž¼/ž¼(ž¼!ž¼ž¼ž¼ ž¼ž¼þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼ûœ¼ôœ¼휼朼ßœ¼Øœ¼Ñœ¼Êœ¼ܼ¼œ¼µœ¼®œ¼§œ¼ œ¼™œ¼’œ¼‹œ¼„œ¼}œ¼vœ¼oœ¼hœ¼aœ¼Zœ¼Sœ¼Lœ¼Eœ¼>œ¼7œ¼0œ¼)œ¼"œ¼œ¼œ¼ œ¼œ¼ÿ›¼ø›¼ñ›¼꛼㛼Ü›¼Õ›¼Λ¼Ç›¼À›¼¹›¼²›¼«›¼¤›¼›¼–›¼›¼ˆ›¼›¼z›¼s›¼l›¼e›¼^›¼W›¼P›¼I›¼B›¼;›¼4›¼-›¼&›¼›¼›¼›¼ ›¼›¼üš¼õš¼îš¼çš¼àš¼Ùš¼Òš¼Ëš¼Äš¼½š¼¶š¼¯š¼¨š¼¡š¼šš¼“š¼Œš¼…š¼~š¼wš¼pš¼iš¼bš¼[š¼Tš¼Mš¼Fš¼?š¼8š¼1š¼*š¼#š¼š¼š¼š¼š¼š¼ù™¼ò™¼뙼䙼Ý™¼Ö™¼Ï™¼È™¼Á™¼º™¼³™¼¬™¼¥™¼ž™¼—™¼™¼‰™¼‚™¼{™¼t™¼m™¼f™¼_™¼X™¼Q™¼J™¼C™¼<™¼5™¼.™¼'™¼ ™¼™¼™¼ ™¼™¼ý˜¼ö˜¼蘼ᘼÚ˜¼Ó˜¼̘¼Ř¼¾˜¼·˜¼°˜¼©˜¼¢˜¼›˜¼”˜¼˜¼†˜¼˜¼x˜¼q˜¼j˜¼c˜¼\˜¼U˜¼N˜¼G˜¼@˜¼9˜¼2˜¼+˜¼$˜¼˜¼˜¼˜¼˜¼˜¼ú—¼ó—¼ì—¼å—¼Þ—¼×—¼З¼É—¼—¼»—¼´—¼­—¼¦—¼Ÿ—¼˜—¼‘—¼Š—¼ƒ—¼|—¼u—¼n—¼g—¼`—¼Y—¼R—¼K—¼D—¼=—¼6—¼/—¼(—¼!—¼—¼—¼ —¼—¼þ–¼÷–¼ð–¼é–¼â–¼Û–¼Ô–¼Í–¼Æ–¼¿–¼¸–¼±–¼ª–¼£–¼œ–¼•–¼Ž–¼‡–¼€–¼y–¼r–¼k–¼d–¼]–¼V–¼O–¼H–¼A–¼:–¼3–¼,–¼%–¼–¼–¼–¼ –¼–¼û•¼ô•¼핼敼ß•¼Ø•¼Ñ•¼Ê•¼Õ¼¼•¼µ•¼®•¼§•¼ •¼™•¼’•¼‹•¼„•¼}•¼v•¼o•¼h•¼a•¼Z•¼S•¼L•¼E•¼>•¼7•¼0•¼)•¼"•¼•¼•¼ •¼•¼ÿ”¼ø”¼ñ”¼ꔼ㔼Ü”¼Õ”¼Δ¼Ç”¼À”¼¹”¼²”¼«”¼¤”¼”¼–”¼”¼ˆ”¼”¼z”¼s”¼l”¼e”¼^”¼W”¼P”¼I”¼B”¼;”¼4”¼-”¼&”¼”¼”¼”¼ ”¼”¼ü“¼õ“¼瓼à“¼Ù“¼Ò“¼Ë“¼Ä“¼½“¼¶“¼¯“¼¨“¼¡“¼š“¼““¼Œ“¼…“¼~“¼w“¼p“¼i“¼b“¼[“¼T“¼M“¼F“¼?“¼8“¼1“¼*“¼#“¼“¼“¼“¼“¼“¼ù’¼ò’¼ë’¼ä’¼Ý’¼Ö’¼Ï’¼È’¼Á’¼º’¼³’¼¬’¼¥’¼ž’¼—’¼’¼‰’¼‚’¼{’¼t’¼m’¼f’¼_’¼X’¼Q’¼J’¼C’¼<’¼5’¼.’¼'’¼ ’¼’¼’¼ ’¼’¼ý‘¼ö‘¼葼ᑼÚ‘¼Ó‘¼Ì‘¼Å‘¼¾‘¼·‘¼°‘¼©‘¼¢‘¼›‘¼”‘¼‘¼†‘¼‘¼x‘¼q‘¼j‘¼c‘¼\‘¼U‘¼N‘¼G‘¼@‘¼9‘¼2‘¼+‘¼$‘¼‘¼‘¼‘¼‘¼‘¼ú¼ó¼ì¼å¼Þ¼×¼мɼ¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼мƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û޼ô޼펼掼ߎ¼ØŽ¼ÑŽ¼ÊŽ¼Ã޼¼Ž¼µŽ¼®Ž¼§Ž¼ Ž¼™Ž¼’޼‹Ž¼„޼}޼v޼o޼h޼a޼Z޼S޼L޼E޼>޼7޼0޼)޼"޼޼޼ ޼޼ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼üŒ¼õŒ¼猼àŒ¼ÙŒ¼ÒŒ¼ËŒ¼ÄŒ¼½Œ¼¶Œ¼¯Œ¼¨Œ¼¡Œ¼šŒ¼“Œ¼ŒŒ¼…Œ¼~Œ¼wŒ¼pŒ¼iŒ¼bŒ¼[Œ¼TŒ¼MŒ¼FŒ¼?Œ¼8Œ¼1Œ¼*Œ¼#Œ¼Œ¼Œ¼Œ¼Œ¼Œ¼ù‹¼ò‹¼닼䋼Ý‹¼Ö‹¼Ï‹¼È‹¼Á‹¼º‹¼³‹¼¬‹¼¥‹¼ž‹¼—‹¼‹¼‰‹¼‚‹¼{‹¼t‹¼m‹¼f‹¼_‹¼X‹¼Q‹¼J‹¼C‹¼<‹¼5‹¼.‹¼'‹¼ ‹¼‹¼‹¼ ‹¼‹¼ýмöм芼ኼÚŠ¼ÓŠ¼ÌŠ¼Åм¾Š¼·Š¼°Š¼©Š¼¢Š¼›Š¼”мм†Š¼мxмqмjмcм\мUмNмGм@м9м2м+м$ммммммú‰¼ó‰¼쉼剼Þ‰¼׉¼Љ¼ɉ¼‰¼»‰¼´‰¼­‰¼¦‰¼Ÿ‰¼˜‰¼‘‰¼Љ¼ƒ‰¼|‰¼u‰¼n‰¼g‰¼`‰¼Y‰¼R‰¼K‰¼D‰¼=‰¼6‰¼/‰¼(‰¼!‰¼‰¼‰¼ ‰¼‰¼þˆ¼÷ˆ¼ðˆ¼鈼∼Ûˆ¼Ôˆ¼͈¼ƈ¼¿ˆ¼¸ˆ¼±ˆ¼ªˆ¼£ˆ¼œˆ¼•ˆ¼Žˆ¼‡ˆ¼€ˆ¼yˆ¼rˆ¼kˆ¼dˆ¼]ˆ¼Vˆ¼Oˆ¼Hˆ¼Aˆ¼:ˆ¼3ˆ¼,ˆ¼%ˆ¼ˆ¼ˆ¼ˆ¼ ˆ¼ˆ¼û‡¼ô‡¼퇼懼߇¼؇¼ч¼ʇ¼Ǽ¼‡¼µ‡¼®‡¼§‡¼ ‡¼™‡¼’‡¼‹‡¼„‡¼}‡¼v‡¼o‡¼h‡¼a‡¼Z‡¼S‡¼L‡¼E‡¼>‡¼7‡¼0‡¼)‡¼"‡¼‡¼‡¼ ‡¼‡¼ÿ†¼ø†¼ñ†¼ꆼㆼ܆¼Õ†¼Ά¼dž¼À†¼¹†¼²†¼«†¼¤†¼†¼–†¼†¼ˆ†¼†¼z†¼s†¼l†¼e†¼^†¼W†¼P†¼I†¼B†¼;†¼4†¼-†¼&†¼†¼†¼†¼ †¼†¼ü…¼õ…¼î…¼ç…¼à…¼Ù…¼Ò…¼Ë…¼Ä…¼½…¼¶…¼¯…¼¨…¼¡…¼š…¼“…¼Œ…¼……¼~…¼w…¼p…¼i…¼b…¼[…¼T…¼M…¼F…¼?…¼8…¼1…¼*…¼#…¼…¼…¼…¼…¼…¼ù„¼ò„¼넼䄼Ý„¼Ö„¼Ï„¼È„¼Á„¼º„¼³„¼¬„¼¥„¼ž„¼—„¼„¼‰„¼‚„¼{„¼t„¼m„¼f„¼_„¼X„¼Q„¼J„¼C„¼<„¼5„¼.„¼'„¼ „¼„¼„¼ „¼„¼ýƒ¼öƒ¼胼ჼÚƒ¼Óƒ¼̃¼Ѽ¾ƒ¼·ƒ¼°ƒ¼©ƒ¼¢ƒ¼›ƒ¼”ƒ¼ƒ¼†ƒ¼ƒ¼xƒ¼qƒ¼jƒ¼cƒ¼\ƒ¼Uƒ¼Nƒ¼Gƒ¼@ƒ¼9ƒ¼2ƒ¼+ƒ¼$ƒ¼ƒ¼ƒ¼ƒ¼ƒ¼ƒ¼ú‚¼ó‚¼삼傼Þ‚¼ׂ¼Ђ¼É‚¼‚¼»‚¼´‚¼­‚¼¦‚¼Ÿ‚¼˜‚¼‘‚¼Š‚¼ƒ‚¼|‚¼u‚¼n‚¼g‚¼`‚¼Y‚¼R‚¼K‚¼D‚¼=‚¼6‚¼/‚¼(‚¼!‚¼‚¼‚¼ ‚¼‚¼þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û€¼ô€¼퀼怼߀¼Ø€¼Ñ€¼Ê€¼À¼¼€¼µ€¼®€¼§€¼ €¼™€¼’€¼‹€¼„€¼}€¼v€¼o€¼h€¼a€¼Z€¼S€¼L€¼E€¼>€¼7€¼0€¼)€¼"€¼€¼€¼ €¼€¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü~¼õ~¼î~¼ç~¼à~¼Ù~¼Ò~¼Ë~¼Ä~¼½~¼¶~¼¯~¼¨~¼¡~¼š~¼“~¼Œ~¼…~¼~~¼w~¼p~¼i~¼b~¼[~¼T~¼M~¼F~¼?~¼8~¼1~¼*~¼#~¼~¼~¼~¼~¼~¼ù}¼ò}¼ë}¼ä}¼Ý}¼Ö}¼Ï}¼È}¼Á}¼º}¼³}¼¬}¼¥}¼ž}¼—}¼}¼‰}¼‚}¼{}¼t}¼m}¼f}¼_}¼X}¼Q}¼J}¼C}¼<}¼5}¼.}¼'}¼ }¼}¼}¼ }¼}¼ý|¼ö|¼ï|¼è|¼á|¼Ú|¼Ó|¼Ì|¼Å|¼¾|¼·|¼°|¼©|¼¢|¼›|¼”|¼|¼†|¼|¼x|¼q|¼j|¼c|¼\|¼U|¼N|¼G|¼@|¼9|¼2|¼+|¼$|¼|¼|¼|¼|¼|¼ú{¼ó{¼ì{¼å{¼Þ{¼×{¼Ð{¼É{¼Â{¼»{¼´{¼­{¼¦{¼Ÿ{¼˜{¼‘{¼Š{¼ƒ{¼|{¼u{¼n{¼g{¼`{¼Y{¼R{¼K{¼D{¼={¼6{¼/{¼({¼!{¼{¼{¼ {¼{¼þz¼÷z¼ðz¼éz¼âz¼Ûz¼Ôz¼Íz¼Æz¼¿z¼¸z¼±z¼ªz¼£z¼œz¼•z¼Žz¼‡z¼€z¼yz¼rz¼kz¼dz¼]z¼Vz¼Oz¼Hz¼Az¼:z¼3z¼,z¼%z¼z¼z¼z¼ z¼z¼ûy¼ôy¼íy¼æy¼ßy¼Øy¼Ñy¼Êy¼Ãy¼¼y¼µy¼®y¼§y¼ y¼™y¼’y¼‹y¼„y¼}y¼vy¼oy¼hy¼ay¼Zy¼Sy¼Ly¼Ey¼>y¼7y¼0y¼)y¼"y¼y¼y¼ y¼y¼ÿx¼øx¼ñx¼êx¼ãx¼Üx¼Õx¼Îx¼Çx¼Àx¼¹x¼²x¼«x¼¤x¼x¼–x¼x¼ˆx¼x¼zx¼sx¼lx¼ex¼^x¼Wx¼Px¼Ix¼Bx¼;x¼4x¼-x¼&x¼x¼x¼x¼ x¼x¼üw¼õw¼îw¼çw¼àw¼Ùw¼Òw¼Ëw¼Äw¼½w¼¶w¼¯w¼¨w¼¡w¼šw¼“w¼Œw¼…w¼~w¼ww¼pw¼iw¼bw¼[w¼Tw¼Mw¼Fw¼?w¼8w¼1w¼*w¼#w¼w¼w¼w¼w¼w¼ùv¼òv¼ëv¼äv¼Ýv¼Öv¼Ïv¼Èv¼Áv¼ºv¼³v¼¬v¼¥v¼žv¼—v¼v¼‰v¼‚v¼{v¼tv¼mv¼fv¼_v¼Xv¼Qv¼Jv¼Cv¼r¼7r¼0r¼)r¼"r¼r¼r¼ r¼r¼ÿq¼øq¼ñq¼êq¼ãq¼Üq¼Õq¼Îq¼Çq¼Àq¼¹q¼²q¼«q¼¤q¼q¼–q¼q¼ˆq¼q¼zq¼sq¼lq¼eq¼^q¼Wq¼Pq¼Iq¼Bq¼;q¼4q¼-q¼&q¼q¼q¼q¼ q¼q¼üp¼õp¼îp¼çp¼àp¼Ùp¼Òp¼Ëp¼Äp¼½p¼¶p¼¯p¼¨p¼¡p¼šp¼“p¼Œp¼…p¼~p¼wp¼pp¼ip¼bp¼[p¼Tp¼Mp¼Fp¼?p¼8p¼1p¼*p¼#p¼p¼p¼p¼p¼p¼ùo¼òo¼ëo¼äo¼Ýo¼Öo¼Ïo¼Èo¼Áo¼ºo¼³o¼¬o¼¥o¼žo¼—o¼o¼‰o¼‚o¼{o¼to¼mo¼fo¼_o¼Xo¼Qo¼Jo¼Co¼k¼7k¼0k¼)k¼"k¼k¼k¼ k¼k¼ÿj¼øj¼ñj¼êj¼ãj¼Üj¼Õj¼Îj¼Çj¼Àj¼¹j¼²j¼«j¼¤j¼j¼–j¼j¼ˆj¼j¼zj¼sj¼lj¼ej¼^j¼Wj¼Pj¼Ij¼Bj¼;j¼4j¼-j¼&j¼j¼j¼j¼ j¼j¼üi¼õi¼îi¼çi¼ài¼Ùi¼Òi¼Ëi¼Äi¼½i¼¶i¼¯i¼¨i¼¡i¼ši¼“i¼Œi¼…i¼~i¼wi¼pi¼ii¼bi¼[i¼Ti¼Mi¼Fi¼?i¼8i¼1i¼*i¼#i¼i¼i¼i¼i¼i¼ùh¼òh¼ëh¼äh¼Ýh¼Öh¼Ïh¼Èh¼Áh¼ºh¼³h¼¬h¼¥h¼žh¼—h¼h¼‰h¼‚h¼{h¼th¼mh¼fh¼_h¼Xh¼Qh¼Jh¼Ch¼d¼7d¼0d¼)d¼"d¼d¼d¼ d¼d¼ÿc¼øc¼ñc¼êc¼ãc¼Üc¼Õc¼Îc¼Çc¼Àc¼¹c¼²c¼«c¼¤c¼c¼–c¼c¼ˆc¼c¼zc¼sc¼lc¼ec¼^c¼Wc¼Pc¼Ic¼Bc¼;c¼4c¼-c¼&c¼c¼c¼c¼ c¼c¼üb¼õb¼îb¼çb¼àb¼Ùb¼Òb¼Ëb¼Äb¼½b¼¶b¼¯b¼¨b¼¡b¼šb¼“b¼Œb¼…b¼~b¼wb¼pb¼ib¼bb¼[b¼Tb¼Mb¼Fb¼?b¼8b¼1b¼*b¼#b¼b¼b¼b¼b¼b¼ùa¼òa¼ëa¼äa¼Ýa¼Öa¼Ïa¼Èa¼Áa¼ºa¼³a¼¬a¼¥a¼ža¼—a¼a¼‰a¼‚a¼{a¼ta¼ma¼fa¼_a¼Xa¼Qa¼Ja¼Ca¼]¼7]¼0]¼)]¼"]¼]¼]¼ ]¼]¼ÿ\¼ø\¼ñ\¼ê\¼ã\¼Ü\¼Õ\¼Î\¼Ç\¼À\¼¹\¼²\¼«\¼¤\¼\¼–\¼\¼ˆ\¼\¼z\¼s\¼l\¼e\¼^\¼W\¼P\¼I\¼B\¼;\¼4\¼-\¼&\¼\¼\¼\¼ \¼\¼ü[¼õ[¼î[¼ç[¼à[¼Ù[¼Ò[¼Ë[¼Ä[¼½[¼¶[¼¯[¼¨[¼¡[¼š[¼“[¼Œ[¼…[¼~[¼w[¼p[¼i[¼b[¼[[¼T[¼M[¼F[¼?[¼8[¼1[¼*[¼#[¼[¼[¼[¼[¼[¼ùZ¼òZ¼ëZ¼äZ¼ÝZ¼ÖZ¼ÏZ¼ÈZ¼ÁZ¼ºZ¼³Z¼¬Z¼¥Z¼žZ¼—Z¼Z¼‰Z¼‚Z¼{Z¼tZ¼mZ¼fZ¼_Z¼XZ¼QZ¼JZ¼CZ¼V¼7V¼0V¼)V¼"V¼V¼V¼ V¼V¼ÿU¼øU¼ñU¼êU¼ãU¼ÜU¼ÕU¼ÎU¼ÇU¼ÀU¼¹U¼²U¼«U¼¤U¼U¼–U¼U¼ˆU¼U¼zU¼sU¼lU¼eU¼^U¼WU¼PU¼IU¼BU¼;U¼4U¼-U¼&U¼U¼U¼U¼ U¼U¼üT¼õT¼îT¼çT¼àT¼ÙT¼ÒT¼ËT¼ÄT¼½T¼¶T¼¯T¼¨T¼¡T¼šT¼“T¼ŒT¼…T¼~T¼wT¼pT¼iT¼bT¼[T¼TT¼MT¼FT¼?T¼8T¼1T¼*T¼#T¼T¼T¼T¼T¼T¼ùS¼òS¼ëS¼äS¼ÝS¼ÖS¼ÏS¼ÈS¼ÁS¼ºS¼³S¼¬S¼¥S¼žS¼—S¼S¼‰S¼‚S¼{S¼tS¼mS¼fS¼_S¼XS¼QS¼JS¼CS¼O¼7O¼0O¼)O¼"O¼O¼O¼ O¼O¼ÿN¼øN¼ñN¼êN¼ãN¼ÜN¼ÕN¼ÎN¼ÇN¼ÀN¼¹N¼²N¼«N¼¤N¼N¼–N¼N¼ˆN¼N¼zN¼sN¼lN¼eN¼^N¼WN¼PN¼IN¼BN¼;N¼4N¼-N¼&N¼N¼N¼N¼ N¼N¼üM¼õM¼îM¼çM¼àM¼ÙM¼ÒM¼ËM¼ÄM¼½M¼¶M¼¯M¼¨M¼¡M¼šM¼“M¼ŒM¼…M¼~M¼wM¼pM¼iM¼bM¼[M¼TM¼MM¼FM¼?M¼8M¼1M¼*M¼#M¼M¼M¼M¼M¼M¼ùL¼òL¼ëL¼äL¼ÝL¼ÖL¼ÏL¼ÈL¼ÁL¼ºL¼³L¼¬L¼¥L¼žL¼—L¼L¼‰L¼‚L¼{L¼tL¼mL¼fL¼_L¼XL¼QL¼JL¼CL¼H¼7H¼0H¼)H¼"H¼H¼H¼ H¼H¼ÿG¼øG¼ñG¼êG¼ãG¼ÜG¼ÕG¼ÎG¼ÇG¼ÀG¼¹G¼²G¼«G¼¤G¼G¼–G¼G¼ˆG¼G¼zG¼sG¼lG¼eG¼^G¼WG¼PG¼IG¼BG¼;G¼4G¼-G¼&G¼G¼G¼G¼ G¼G¼üF¼õF¼îF¼çF¼àF¼ÙF¼ÒF¼ËF¼ÄF¼½F¼¶F¼¯F¼¨F¼¡F¼šF¼“F¼ŒF¼…F¼~F¼wF¼pF¼iF¼bF¼[F¼TF¼MF¼FF¼?F¼8F¼1F¼*F¼#F¼F¼F¼F¼F¼F¼ùE¼òE¼ëE¼äE¼ÝE¼ÖE¼ÏE¼ÈE¼ÁE¼ºE¼³E¼¬E¼¥E¼žE¼—E¼E¼‰E¼‚E¼{E¼tE¼mE¼fE¼_E¼XE¼QE¼JE¼CE¼A¼7A¼0A¼)A¼"A¼A¼A¼ A¼A¼ÿ@¼ø@¼ñ@¼ê@¼ã@¼Ü@¼Õ@¼Î@¼Ç@¼À@¼¹@¼²@¼«@¼¤@¼@¼–@¼@¼ˆ@¼@¼z@¼s@¼l@¼e@¼^@¼W@¼P@¼I@¼B@¼;@¼4@¼-@¼&@¼@¼@¼@¼ @¼@¼ü?¼õ?¼î?¼ç?¼à?¼Ù?¼Ò?¼Ë?¼Ä?¼½?¼¶?¼¯?¼¨?¼¡?¼š?¼“?¼Œ?¼…?¼~?¼w?¼p?¼i?¼b?¼[?¼T?¼M?¼F?¼??¼8?¼1?¼*?¼#?¼?¼?¼?¼?¼?¼ù>¼ò>¼ë>¼ä>¼Ý>¼Ö>¼Ï>¼È>¼Á>¼º>¼³>¼¬>¼¥>¼ž>¼—>¼>¼‰>¼‚>¼{>¼t>¼m>¼f>¼_>¼X>¼Q>¼J>¼C>¼<>¼5>¼.>¼'>¼ >¼>¼>¼ >¼>¼ý=¼ö=¼ï=¼è=¼á=¼Ú=¼Ó=¼Ì=¼Å=¼¾=¼·=¼°=¼©=¼¢=¼›=¼”=¼=¼†=¼=¼x=¼q=¼j=¼c=¼\=¼U=¼N=¼G=¼@=¼9=¼2=¼+=¼$=¼=¼=¼=¼=¼=¼ú<¼ó<¼ì<¼å<¼Þ<¼×<¼Ð<¼É<¼Â<¼»<¼´<¼­<¼¦<¼Ÿ<¼˜<¼‘<¼Š<¼ƒ<¼|<¼u<¼n<¼g<¼`<¼Y<¼R<¼K<¼D<¼=<¼6<¼/<¼(<¼!<¼<¼<¼ <¼<¼þ;¼÷;¼ð;¼é;¼â;¼Û;¼Ô;¼Í;¼Æ;¼¿;¼¸;¼±;¼ª;¼£;¼œ;¼•;¼Ž;¼‡;¼€;¼y;¼r;¼k;¼d;¼];¼V;¼O;¼H;¼A;¼:;¼3;¼,;¼%;¼;¼;¼;¼ ;¼;¼û:¼ô:¼í:¼æ:¼ß:¼Ø:¼Ñ:¼Ê:¼Ã:¼¼:¼µ:¼®:¼§:¼ :¼™:¼’:¼‹:¼„:¼}:¼v:¼o:¼h:¼a:¼Z:¼S:¼L:¼E:¼>:¼7:¼0:¼):¼":¼:¼:¼ :¼:¼ÿ9¼ø9¼ñ9¼ê9¼ã9¼Ü9¼Õ9¼Î9¼Ç9¼À9¼¹9¼²9¼«9¼¤9¼9¼–9¼9¼ˆ9¼9¼z9¼s9¼l9¼e9¼^9¼W9¼P9¼I9¼B9¼;9¼49¼-9¼&9¼9¼9¼9¼ 9¼9¼ü8¼õ8¼î8¼ç8¼à8¼Ù8¼Ò8¼Ë8¼Ä8¼½8¼¶8¼¯8¼¨8¼¡8¼š8¼“8¼Œ8¼…8¼~8¼w8¼p8¼i8¼b8¼[8¼T8¼M8¼F8¼?8¼88¼18¼*8¼#8¼8¼8¼8¼8¼8¼ù7¼ò7¼ë7¼ä7¼Ý7¼Ö7¼Ï7¼È7¼Á7¼º7¼³7¼¬7¼¥7¼ž7¼—7¼7¼‰7¼‚7¼{7¼t7¼m7¼f7¼_7¼X7¼Q7¼J7¼C7¼<7¼57¼.7¼'7¼ 7¼7¼7¼ 7¼7¼ý6¼ö6¼ï6¼è6¼á6¼Ú6¼Ó6¼Ì6¼Å6¼¾6¼·6¼°6¼©6¼¢6¼›6¼”6¼6¼†6¼6¼x6¼q6¼j6¼c6¼\6¼U6¼N6¼G6¼@6¼96¼26¼+6¼$6¼6¼6¼6¼6¼6¼ú5¼ó5¼ì5¼å5¼Þ5¼×5¼Ð5¼É5¼Â5¼»5¼´5¼­5¼¦5¼Ÿ5¼˜5¼‘5¼Š5¼ƒ5¼|5¼u5¼n5¼g5¼`5¼Y5¼R5¼K5¼D5¼=5¼65¼/5¼(5¼!5¼5¼5¼ 5¼5¼þ4¼÷4¼ð4¼é4¼â4¼Û4¼Ô4¼Í4¼Æ4¼¿4¼¸4¼±4¼ª4¼£4¼œ4¼•4¼Ž4¼‡4¼€4¼y4¼r4¼k4¼d4¼]4¼V4¼O4¼H4¼A4¼:4¼34¼,4¼%4¼4¼4¼4¼ 4¼4¼û3¼ô3¼í3¼æ3¼ß3¼Ø3¼Ñ3¼Ê3¼Ã3¼¼3¼µ3¼®3¼§3¼ 3¼™3¼’3¼‹3¼„3¼}3¼v3¼o3¼h3¼a3¼Z3¼S3¼L3¼E3¼>3¼73¼03¼)3¼"3¼3¼3¼ 3¼3¼ÿ2¼ø2¼ñ2¼ê2¼ã2¼Ü2¼Õ2¼Î2¼Ç2¼À2¼¹2¼²2¼«2¼¤2¼2¼–2¼2¼ˆ2¼2¼z2¼s2¼l2¼e2¼^2¼W2¼P2¼I2¼B2¼;2¼42¼-2¼&2¼2¼2¼2¼ 2¼2¼ü1¼õ1¼î1¼ç1¼à1¼Ù1¼Ò1¼Ë1¼Ä1¼½1¼¶1¼¯1¼¨1¼¡1¼š1¼“1¼Œ1¼…1¼~1¼w1¼p1¼i1¼b1¼[1¼T1¼M1¼F1¼?1¼81¼11¼*1¼#1¼1¼1¼1¼1¼1¼ù0¼ò0¼ë0¼ä0¼Ý0¼Ö0¼Ï0¼È0¼Á0¼º0¼³0¼¬0¼¥0¼ž0¼—0¼0¼‰0¼‚0¼{0¼t0¼m0¼f0¼_0¼X0¼Q0¼J0¼C0¼<0¼50¼.0¼'0¼ 0¼0¼0¼ 0¼0¼ý/¼ö/¼ï/¼è/¼á/¼Ú/¼Ó/¼Ì/¼Å/¼¾/¼·/¼°/¼©/¼¢/¼›/¼”/¼/¼†/¼/¼x/¼q/¼j/¼c/¼\/¼U/¼N/¼G/¼@/¼9/¼2/¼+/¼$/¼/¼/¼/¼/¼/¼ú.¼ó.¼ì.¼å.¼Þ.¼×.¼Ð.¼É.¼Â.¼».¼´.¼­.¼¦.¼Ÿ.¼˜.¼‘.¼Š.¼ƒ.¼|.¼u.¼n.¼g.¼`.¼Y.¼R.¼K.¼D.¼=.¼6.¼/.¼(.¼!.¼.¼.¼ .¼.¼þ-¼÷-¼ð-¼é-¼â-¼Û-¼Ô-¼Í-¼Æ-¼¿-¼¸-¼±-¼ª-¼£-¼œ-¼•-¼Ž-¼‡-¼€-¼y-¼r-¼k-¼d-¼]-¼V-¼O-¼H-¼A-¼:-¼3-¼,-¼%-¼-¼-¼-¼ -¼-¼û,¼ô,¼í,¼æ,¼ß,¼Ø,¼Ñ,¼Ê,¼Ã,¼¼,¼µ,¼®,¼§,¼ ,¼™,¼’,¼‹,¼„,¼},¼v,¼o,¼h,¼a,¼Z,¼S,¼L,¼E,¼>,¼7,¼0,¼),¼",¼,¼,¼ ,¼,¼ÿ+¼ø+¼ñ+¼ê+¼ã+¼Ü+¼Õ+¼Î+¼Ç+¼À+¼¹+¼²+¼«+¼¤+¼+¼–+¼+¼ˆ+¼+¼z+¼s+¼l+¼e+¼^+¼W+¼P+¼I+¼B+¼;+¼4+¼-+¼&+¼+¼+¼+¼ +¼+¼ü*¼õ*¼î*¼ç*¼à*¼Ù*¼Ò*¼Ë*¼Ä*¼½*¼¶*¼¯*¼¨*¼¡*¼š*¼“*¼Œ*¼…*¼~*¼w*¼p*¼i*¼b*¼[*¼T*¼M*¼F*¼?*¼8*¼1*¼**¼#*¼*¼*¼*¼*¼*¼ù)¼ò)¼ë)¼ä)¼Ý)¼Ö)¼Ï)¼È)¼Á)¼º)¼³)¼¬)¼¥)¼ž)¼—)¼)¼‰)¼‚)¼{)¼t)¼m)¼f)¼_)¼X)¼Q)¼J)¼C)¼<)¼5)¼.)¼')¼ )¼)¼)¼ )¼)¼ý(¼ö(¼ï(¼è(¼á(¼Ú(¼Ó(¼Ì(¼Å(¼¾(¼·(¼°(¼©(¼¢(¼›(¼”(¼(¼†(¼(¼x(¼q(¼j(¼c(¼\(¼U(¼N(¼G(¼@(¼9(¼2(¼+(¼$(¼(¼(¼(¼(¼(¼ú'¼ó'¼ì'¼å'¼Þ'¼×'¼Ð'¼É'¼Â'¼»'¼´'¼­'¼¦'¼Ÿ'¼˜'¼‘'¼Š'¼ƒ'¼|'¼u'¼n'¼g'¼`'¼Y'¼R'¼K'¼D'¼='¼6'¼/'¼('¼!'¼'¼'¼ '¼'¼þ&¼÷&¼ð&¼é&¼â&¼Û&¼Ô&¼Í&¼Æ&¼¿&¼¸&¼±&¼ª&¼£&¼œ&¼•&¼Ž&¼‡&¼€&¼y&¼r&¼k&¼d&¼]&¼V&¼O&¼H&¼A&¼:&¼3&¼,&¼%&¼&¼&¼&¼ &¼&¼û%¼ô%¼í%¼æ%¼ß%¼Ø%¼Ñ%¼Ê%¼Ã%¼¼%¼µ%¼®%¼§%¼ %¼™%¼’%¼‹%¼„%¼}%¼v%¼o%¼h%¼a%¼Z%¼S%¼L%¼E%¼>%¼7%¼0%¼)%¼"%¼%¼%¼ %¼%¼ÿ$¼ø$¼ñ$¼ê$¼ã$¼Ü$¼Õ$¼Î$¼Ç$¼À$¼¹$¼²$¼«$¼¤$¼$¼–$¼$¼ˆ$¼$¼z$¼s$¼l$¼e$¼^$¼W$¼P$¼I$¼B$¼;$¼4$¼-$¼&$¼$¼$¼$¼ $¼$¼ü#¼õ#¼î#¼ç#¼à#¼Ù#¼Ò#¼Ë#¼Ä#¼½#¼¶#¼¯#¼¨#¼¡#¼š#¼“#¼Œ#¼…#¼~#¼w#¼p#¼i#¼b#¼[#¼T#¼M#¼F#¼?#¼8#¼1#¼*#¼##¼#¼#¼#¼#¼#¼ù"¼ò"¼ë"¼ä"¼Ý"¼Ö"¼Ï"¼È"¼Á"¼º"¼³"¼¬"¼¥"¼ž"¼—"¼"¼‰"¼‚"¼{"¼t"¼m"¼f"¼_"¼X"¼Q"¼J"¼C"¼<"¼5"¼."¼'"¼ "¼"¼"¼ "¼"¼ý!¼ö!¼ï!¼è!¼á!¼Ú!¼Ó!¼Ì!¼Å!¼¾!¼·!¼°!¼©!¼¢!¼›!¼”!¼!¼†!¼!¼x!¼q!¼j!¼c!¼\!¼U!¼N!¼G!¼@!¼9!¼2!¼+!¼$!¼!¼!¼!¼!¼!¼ú ¼ó ¼ì ¼å ¼Þ ¼× ¼Ð ¼É ¼ ¼» ¼´ ¼­ ¼¦ ¼Ÿ ¼˜ ¼‘ ¼Š ¼ƒ ¼| ¼u ¼n ¼g ¼` ¼Y ¼R ¼K ¼D ¼= ¼6 ¼/ ¼( ¼! ¼ ¼ ¼ ¼ ¼þ¼÷¼ð¼é¼â¼Û¼Ô¼Í¼Æ¼¿¼¸¼±¼ª¼£¼œ¼•¼Ž¼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û¼ô¼í¼æ¼ß¼Ø¼Ñ¼Ê¼Ã¼¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü¼õ¼î¼ç¼à¼Ù¼Ò¼Ë¼Ä¼½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù¼ò¼ë¼ä¼Ý¼Ö¼Ï¼È¼Á¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý¼ö¼ï¼è¼á¼Ú¼Ó¼Ì¼Å¼¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú¼ó¼ì¼å¼Þ¼×¼Ð¼É¼Â¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼Š¼ƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ¼÷¼ð¼é¼â¼Û¼Ô¼Í¼Æ¼¿¼¸¼±¼ª¼£¼œ¼•¼Ž¼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û¼ô¼í¼æ¼ß¼Ø¼Ñ¼Ê¼Ã¼¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü¼õ¼î¼ç¼à¼Ù¼Ò¼Ë¼Ä¼½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù¼ò¼ë¼ä¼Ý¼Ö¼Ï¼È¼Á¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý¼ö¼ï¼è¼á¼Ú¼Ó¼Ì¼Å¼¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú¼ó¼ì¼å¼Þ¼×¼Ð¼É¼Â¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼Š¼ƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ¼÷¼ð¼é¼â¼Û¼Ô¼Í¼Æ¼¿¼¸¼±¼ª¼£¼œ¼•¼Ž¼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û¼ô¼í¼æ¼ß¼Ø¼Ñ¼Ê¼Ã¼¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü¼õ¼î¼ç¼à¼Ù¼Ò¼Ë¼Ä¼½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù ¼ò ¼ë ¼ä ¼Ý ¼Ö ¼Ï ¼È ¼Á ¼º ¼³ ¼¬ ¼¥ ¼ž ¼— ¼ ¼‰ ¼‚ ¼{ ¼t ¼m ¼f ¼_ ¼X ¼Q ¼J ¼C ¼< ¼5 ¼. ¼' ¼ ¼ ¼ ¼ ¼ ¼ý ¼ö ¼ï ¼è ¼á ¼Ú ¼Ó ¼Ì ¼Å ¼¾ ¼· ¼° ¼© ¼¢ ¼› ¼” ¼ ¼† ¼ ¼x ¼q ¼j ¼c ¼\ ¼U ¼N ¼G ¼@ ¼9 ¼2 ¼+ ¼$ ¼ ¼ ¼ ¼ ¼ ¼ú ¼ó ¼ì ¼å ¼Þ ¼× ¼Ð ¼É ¼ ¼» ¼´ ¼­ ¼¦ ¼Ÿ ¼˜ ¼‘ ¼Š ¼ƒ ¼| ¼u ¼n ¼g ¼` ¼Y ¼R ¼K ¼D ¼= ¼6 ¼/ ¼( ¼! ¼ ¼ ¼ ¼ ¼þ ¼÷ ¼ð ¼é ¼â ¼Û ¼Ô ¼Í ¼Æ ¼¿ ¼¸ ¼± ¼ª ¼£ ¼œ ¼• ¼Ž ¼‡ ¼€ ¼y ¼r ¼k ¼d ¼] ¼V ¼O ¼H ¼A ¼: ¼3 ¼, ¼% ¼ ¼ ¼ ¼ ¼ ¼û ¼ô ¼í ¼æ ¼ß ¼Ø ¼Ñ ¼Ê ¼à ¼¼ ¼µ ¼® ¼§ ¼  ¼™ ¼’ ¼‹ ¼„ ¼} ¼v ¼o ¼h ¼a ¼Z ¼S ¼L ¼E ¼> ¼7 ¼0 ¼) ¼" ¼ ¼ ¼ ¼ ¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü¼õ¼î¼ç¼à¼Ù¼Ò¼Ë¼Ä¼½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù¼ò¼ë¼ä¼Ý¼Ö¼Ï¼È¼Á¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý¼ö¼ï¼è¼á¼Ú¼Ó¼Ì¼Å¼¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú¼ó¼ì¼å¼Þ¼×¼Ð¼É¼Â¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼Š¼ƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ¼÷¼ð¼é¼â¼Û¼Ô¼Í¼Æ¼¿¼¸¼±¼ª¼£¼œ¼•¼Ž¼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û¼ô¼í¼æ¼ß¼Ø¼Ñ¼Ê¼Ã¼¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ¼ø¼ñ¼ê¼ã¼Ü¼Õ¼Î¼Ç¼À¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ùÿ»òÿ»ëÿ»äÿ»Ýÿ»Öÿ»Ïÿ»Èÿ»Áÿ»ºÿ»³ÿ»¬ÿ»¥ÿ»žÿ»—ÿ»ÿ»‰ÿ»‚ÿ»{ÿ»tÿ»mÿ»fÿ»_ÿ»Xÿ»Qÿ»Jÿ»Cÿ»<ÿ»5ÿ».ÿ»'ÿ» ÿ»ÿ»ÿ» ÿ»ÿ»ýþ»öþ»ïþ»èþ»áþ»Úþ»Óþ»Ìþ»Åþ»¾þ»·þ»°þ»©þ»¢þ»›þ»”þ»þ»†þ»þ»xþ»qþ»jþ»cþ»\þ»Uþ»Nþ»Gþ»@þ»9þ»2þ»+þ»$þ»þ»þ»þ»þ»þ»úý»óý»ìý»åý»Þý»×ý»Ðý»Éý»Âý»»ý»´ý»­ý»¦ý»Ÿý»˜ý»‘ý»Šý»ƒý»|ý»uý»ný»gý»`ý»Yý»Rý»Ký»Dý»=ý»6ý»/ý»(ý»!ý»ý»ý» ý»ý»þü»÷ü»ðü»éü»âü»Ûü»Ôü»Íü»Æü»¿ü»¸ü»±ü»ªü»£ü»œü»•ü»Žü»‡ü»€ü»yü»rü»kü»dü»]ü»Vü»Oü»Hü»Aü»:ü»3ü»,ü»%ü»ü»ü»ü» ü»ü»ûû»ôû»íû»æû»ßû»Øû»Ñû»Êû»Ãû»¼û»µû»®û»§û» û»™û»’û»‹û»„û»}û»vû»oû»hû»aû»Zû»Sû»Lû»Eû»>û»7û»0û»)û»"û»û»û» û»û»ÿú»øú»ñú»êú»ãú»Üú»Õú»Îú»Çú»Àú»¹ú»²ú»«ú»¤ú»ú»–ú»ú»ˆú»ú»zú»sú»lú»eú»^ú»Wú»Pú»Iú»Bú»;ú»4ú»-ú»&ú»ú»ú»ú» ú»ú»üù»õù»îù»çù»àù»Ùù»Òù»Ëù»Äù»½ù»¶ù»¯ù»¨ù»¡ù»šù»“ù»Œù»…ù»~ù»wù»pù»iù»bù»[ù»Tù»Mù»Fù»?ù»8ù»1ù»*ù»#ù»ù»ù»ù»ù»ù»ùø»òø»ëø»äø»Ýø»Öø»Ïø»Èø»Áø»ºø»³ø»¬ø»¥ø»žø»—ø»ø»‰ø»‚ø»{ø»tø»mø»fø»_ø»Xø»Qø»Jø»Cø»<ø»5ø».ø»'ø» ø»ø»ø» ø»ø»ý÷»ö÷»ï÷»è÷»á÷»Ú÷»Ó÷»Ì÷»Å÷»¾÷»·÷»°÷»©÷»¢÷»›÷»”÷»÷»†÷»÷»x÷»q÷»j÷»c÷»\÷»U÷»N÷»G÷»@÷»9÷»2÷»+÷»$÷»÷»÷»÷»÷»÷»úö»óö»ìö»åö»Þö»×ö»Ðö»Éö»Âö»»ö»´ö»­ö»¦ö»Ÿö»˜ö»‘ö»Šö»ƒö»|ö»uö»nö»gö»`ö»Yö»Rö»Kö»Dö»=ö»6ö»/ö»(ö»!ö»ö»ö» ö»ö»þõ»÷õ»ðõ»éõ»âõ»Ûõ»Ôõ»Íõ»Æõ»¿õ»¸õ»±õ»ªõ»£õ»œõ»•õ»Žõ»‡õ»€õ»yõ»rõ»kõ»dõ»]õ»Võ»Oõ»Hõ»Aõ»:õ»3õ»,õ»%õ»õ»õ»õ» õ»õ»ûô»ôô»íô»æô»ßô»Øô»Ñô»Êô»Ãô»¼ô»µô»®ô»§ô» ô»™ô»’ô»‹ô»„ô»}ô»vô»oô»hô»aô»Zô»Sô»Lô»Eô»>ô»7ô»0ô»)ô»"ô»ô»ô» ô»ô»ÿó»øó»ñó»êó»ãó»Üó»Õó»Îó»Çó»Àó»¹ó»²ó»«ó»¤ó»ó»–ó»ó»ˆó»ó»zó»só»ló»eó»^ó»Wó»Pó»Ió»Bó»;ó»4ó»-ó»&ó»ó»ó»ó» ó»ó»üò»õò»îò»çò»àò»Ùò»Òò»Ëò»Äò»½ò»¶ò»¯ò»¨ò»¡ò»šò»“ò»Œò»…ò»~ò»wò»pò»iò»bò»[ò»Tò»Mò»Fò»?ò»8ò»1ò»*ò»#ò»ò»ò»ò»ò»ò»ùñ»òñ»ëñ»äñ»Ýñ»Öñ»Ïñ»Èñ»Áñ»ºñ»³ñ»¬ñ»¥ñ»žñ»—ñ»ñ»‰ñ»‚ñ»{ñ»tñ»mñ»fñ»_ñ»Xñ»Qñ»Jñ»Cñ»<ñ»5ñ».ñ»'ñ» ñ»ñ»ñ» ñ»ñ»ýð»öð»ïð»èð»áð»Úð»Óð»Ìð»Åð»¾ð»·ð»°ð»©ð»¢ð»›ð»”ð»ð»†ð»ð»xð»qð»jð»cð»\ð»Uð»Nð»Gð»@ð»9ð»2ð»+ð»$ð»ð»ð»ð»ð»ð»úï»óï»ìï»åï»Þï»×ï»Ðï»Éï»Âﻻﻴﻭﻦﻟﻘﻑﻊﻃï»|ï»uï»nï»gï»`ï»Yï»Rï»Kï»Dï»=ï»6ï»/ï»(ï»!ï»ï»ï» ï»ï»þî»÷î»ðî»éî»âî»Ûî»Ôî»Íî»Æî»¿î»¸î»±î»ªî»£î»œî»•î»Žî»‡î»€î»yî»rî»kî»dî»]î»Vî»Oî»Hî»Aî»:î»3î»,î»%î»î»î»î» î»î»ûí»ôí»íí»æí»ßí»Øí»Ñí»Êí»Ãí»¼í»µí»®í»§í» í»™í»’í»‹í»„í»}í»ví»oí»hí»aí»Zí»Sí»Lí»Eí»>í»7í»0í»)í»"í»í»í» í»í»ÿì»øì»ñì»êì»ãì»Üì»Õì»Îì»Çì»À컹컲컫커ì»ì»–ì»ì»ˆì»ì»zì»sì»lì»eì»^ì»Wì»Pì»Iì»Bì»;ì»4ì»-ì»&ì»ì»ì»ì» ì»ì»üë»õë»îë»çë»àë»Ùë»Òë»Ëë»Ä뻽뻶뻯뻨뻡뻚뻓뻌뻅ë»~ë»wë»pë»ië»bë»[ë»Të»Më»Fë»?ë»8ë»1ë»*ë»#ë»ë»ë»ë»ë»ë»ùê»òê»ëê»äê»Ýê»Öê»Ïê»Èê»Á껺껳껬껥껞껗ê»ê»‰ê»‚ê»{ê»tê»mê»fê»_ê»Xê»Qê»Jê»Cê»<ê»5ê».ê»'ê» ê»ê»ê» ê»ê»ýé»öé»ïé»èé»áé»Úé»Óé»Ìé»Å黾黷黰黩黢黛黔é»é»†é»é»xé»qé»jé»cé»\é»Ué»Né»Gé»@é»9é»2é»+é»$é»é»é»é»é»é»úè»óè»ìè»åè»Þè»×è»Ðè»Éè»Â軻軴軭軦軟軘軑車軃è»|è»uè»nè»gè»`è»Yè»Rè»Kè»Dè»=è»6è»/è»(è»!è»è»è» è»è»þç»÷ç»ðç»éç»âç»Ûç»Ôç»Íç»Æç»¿ç»¸ç»±ç»ªç»£ç»œç»•ç»Žç»‡ç»€ç»yç»rç»kç»dç»]ç»Vç»Oç»Hç»Aç»:ç»3ç»,ç»%ç»ç»ç»ç» ç»ç»ûæ»ôæ»íæ»ææ»ßæ»Øæ»Ñæ»Êæ»Ã滼滵滮滧滠滙滒滋滄æ»}æ»væ»oæ»hæ»aæ»Zæ»Sæ»Læ»Eæ»>æ»7æ»0æ»)æ»"æ»æ»æ» æ»æ»ÿ廸å»ñå»êå»ãå»Üå»Õå»Îå»Çå»À廹廲廫廤å»å»–å»å»ˆå»å»zå»så»lå»eå»^å»Wå»På»Iå»Bå»;å»4å»-å»&å»å»å»å» å»å»üä»õä»îä»çä»àä»Ùä»Òä»Ëä»Ä份件仯仨仡仚仓仌仅ä»~ä»wä»pä»iä»bä»[ä»Tä»Mä»Fä»?ä»8ä»1ä»*ä»#ä»ä»ä»ä»ä»ä»ùã»òã»ëã»äã»Ýã»Öã»Ïã»Èã»Á㻺㻳㻬㻥㻞㻗ã»ã»‰ã»‚ã»{ã»tã»mã»fã»_ã»Xã»Qã»Jã»Cã»<ã»5ã».ã»'ã» ã»ã»ã» ã»ã»ýâ»öâ»ïâ»èâ»áâ»Úâ»Óâ»Ìâ»Å⻾⻷⻰⻩⻢⻛⻔â»â»†â»â»xâ»qâ»jâ»câ»\â»Uâ»Nâ»Gâ»@â»9â»2â»+â»$â»â»â»â»â»â»úá»óá»ìá»åá»Þá»×á»Ðá»Éá»ÂỻỴửỦởỘốỊểá»|á»uá»ná»gá»`á»Yá»Rá»Ká»Dá»=á»6á»/á»(á»!á»á»á» á»á»þà»÷à»ðà»éà»âà»Ûà»Ôà»Íà»Æà»¿à»¸à»±à»ªà»£à»œà»•à»Žà»‡à»€à»yà»rà»kà»dà»]à»Và»Oà»Hà»Aà»:à»3à»,à»%à»à»à»à» à»à»ûß»ôß»íß»æß»ßß»Øß»Ñß»Êß»Ãß»¼ß»µß»®ß»§ß» ß»™ß»’ß»‹ß»„ß»}ß»vß»oß»hß»aß»Zß»Sß»Lß»Eß»>ß»7ß»0ß»)ß»"߻߻߻ ߻߻ÿÞ»øÞ»ñÞ»êÞ»ãÞ»ÜÞ»ÕÞ»ÎÞ»ÇÞ»ÀÞ»¹Þ»²Þ»«Þ»¤Þ»Þ»–Þ»Þ»ˆÞ»Þ»zÞ»sÞ»lÞ»eÞ»^Þ»WÞ»PÞ»IÞ»BÞ»;Þ»4Þ»-Þ»&Þ»Þ»Þ»Þ» Þ»Þ»üÝ»õÝ»îÝ»çÝ»àÝ»ÙÝ»ÒÝ»ËÝ»ÄÝ»½Ý»¶Ý»¯Ý»¨Ý»¡Ý»šÝ»“Ý»ŒÝ»…Ý»~Ý»wÝ»pÝ»iÝ»bÝ»[Ý»TÝ»MÝ»FÝ»?Ý»8Ý»1Ý»*Ý»#ݻݻݻݻݻݻùÜ»òÜ»ëÜ»äÜ»ÝÜ»ÖÜ»ÏÜ»ÈÜ»ÁÜ»ºÜ»³Ü»¬Ü»¥Ü»žÜ»—ܻܻ‰Ü»‚Ü»{Ü»tÜ»mÜ»fÜ»_Ü»XÜ»QÜ»JÜ»CÜ»<Ü»5Ü».Ü»'Ü» ܻܻܻ ܻܻýÛ»öÛ»ïÛ»èÛ»áÛ»ÚÛ»ÓÛ»ÌÛ»ÅÛ»¾Û»·Û»°Û»©Û»¢Û»›Û»”Û»Û»†Û»Û»xÛ»qÛ»jÛ»cÛ»\Û»UÛ»NÛ»GÛ»@Û»9Û»2Û»+Û»$Û»Û»Û»Û»Û»Û»úÚ»óÚ»ìÚ»åÚ»ÞÚ»×Ú»ÐÚ»ÉÚ»ÂÚ»»Ú»´Ú»­Ú»¦Ú»ŸÚ»˜Ú»‘Ú»ŠÚ»ƒÚ»|Ú»uÚ»nÚ»gÚ»`Ú»YÚ»RÚ»KÚ»DÚ»=Ú»6Ú»/Ú»(Ú»!Ú»Ú»Ú» Ú»Ú»þÙ»÷Ù»ðÙ»éÙ»âÙ»ÛÙ»ÔÙ»ÍÙ»ÆÙ»¿Ù»¸Ù»±Ù»ªÙ»£Ù»œÙ»•Ù»ŽÙ»‡Ù»€Ù»yÙ»rÙ»kÙ»dÙ»]Ù»VÙ»OÙ»HÙ»AÙ»:Ù»3Ù»,Ù»%ٻٻٻٻ ٻٻûØ»ôØ»íØ»æØ»ߨ»ØØ»ÑØ»ÊØ»ÃØ»¼Ø»µØ»®Ø»§Ø» Ø»™Ø»’Ø»‹Ø»„Ø»}Ø»vØ»oØ»hØ»aØ»ZØ»SØ»LØ»EØ»>Ø»7Ø»0Ø»)Ø»"ػػػ ػػÿ×»ø×»ñ×»ê×»ã×»Ü×»Õ×»Î×»Ç×»À×»¹×»²×»«×»¤×»×»–×»×»ˆ×»×»z×»s×»l×»e×»^×»W×»P×»I×»B×»;×»4×»-×»&×»×»×»×» ×»×»üÖ»õÖ»îÖ»çÖ»àÖ»ÙÖ»ÒÖ»ËÖ»ÄÖ»½Ö»¶Ö»¯Ö»¨Ö»¡Ö»šÖ»“Ö»ŒÖ»…Ö»~Ö»wÖ»pÖ»iÖ»bÖ»[Ö»TÖ»MÖ»FÖ»?Ö»8Ö»1Ö»*Ö»#Ö»Ö»Ö»Ö»Ö»Ö»ùÕ»òÕ»ëÕ»äÕ»ÝÕ»ÖÕ»ÏÕ»ÈÕ»ÁÕ»ºÕ»³Õ»¬Õ»¥Õ»žÕ»—Õ»Õ»‰Õ»‚Õ»{Õ»tÕ»mÕ»fÕ»_Õ»XÕ»QÕ»JÕ»CÕ»<Õ»5Õ».Õ»'Õ» Õ»Õ»Õ» Õ»Õ»ýÔ»öÔ»ïÔ»èÔ»áÔ»ÚÔ»ÓÔ»ÌÔ»ÅÔ»¾Ô»·Ô»°Ô»©Ô»¢Ô»›Ô»”Ô»Ô»†Ô»Ô»xÔ»qÔ»jÔ»cÔ»\Ô»UÔ»NÔ»GÔ»@Ô»9Ô»2Ô»+Ô»$Ô»Ô»Ô»Ô»Ô»Ô»úÓ»óÓ»ìÓ»åÓ»ÞÓ»×Ó»ÐÓ»ÉÓ»ÂÓ»»Ó»´Ó»­Ó»¦Ó»ŸÓ»˜Ó»‘Ó»ŠÓ»ƒÓ»|Ó»uÓ»nÓ»gÓ»`Ó»YÓ»RÓ»KÓ»DÓ»=Ó»6Ó»/Ó»(Ó»!Ó»Ó»Ó» Ó»Ó»þÒ»÷Ò»ðÒ»éÒ»âÒ»ÛÒ»ÔÒ»ÍÒ»ÆÒ»¿Ò»¸Ò»±Ò»ªÒ»£Ò»œÒ»•Ò»ŽÒ»‡Ò»€Ò»yÒ»rÒ»kÒ»dÒ»]Ò»VÒ»OÒ»HÒ»AÒ»:Ò»3Ò»,Ò»%Ò»Ò»Ò»Ò» Ò»Ò»ûÑ»ôÑ»íÑ»æÑ»ßÑ»ØÑ»ÑÑ»ÊÑ»ÃÑ»¼Ñ»µÑ»®Ñ»§Ñ» Ñ»™Ñ»’Ñ»‹Ñ»„Ñ»}Ñ»vÑ»oÑ»hÑ»aÑ»ZÑ»SÑ»LÑ»EÑ»>Ñ»7Ñ»0Ñ»)Ñ»"ѻѻѻ ѻѻÿлøÐ»ñлêлãлÜлÕлÎлÇлÀл¹Ð»²Ð»«Ð»¤Ð»л–ллˆÐ»лzлsлlлeл^лWлPлIлBл;л4л-л&лллл ллüÏ»õÏ»îÏ»çÏ»àÏ»ÙÏ»ÒÏ»ËÏ»ÄÏ»½Ï»¶Ï»¯Ï»¨Ï»¡Ï»šÏ»“Ï»ŒÏ»…Ï»~Ï»wÏ»pÏ»iÏ»bÏ»[Ï»TÏ»MÏ»FÏ»?Ï»8Ï»1Ï»*Ï»#ϻϻϻϻϻϻùλòλëλäλÝλÖλÏλÈλÁλºÎ»³Î»¬Î»¥Î»žÎ»—λλ‰Î»‚λ{λtλmλfλ_λXλQλJλCλ<λ5λ.λ'λ λλλ λλýÍ»öÍ»ïÍ»èÍ»áÍ»ÚÍ»ÓÍ»ÌÍ»ÅÍ»¾Í»·Í»°Í»©Í»¢Í»›Í»”ͻͻ†Í»Í»xÍ»qÍ»jÍ»cÍ»\Í»UÍ»NÍ»GÍ»@Í»9Í»2Í»+Í»$ͻͻͻͻͻͻúÌ»óÌ»ìÌ»åÌ»ÞÌ»×Ì»ÐÌ»ÉÌ»ÂÌ»»Ì»´Ì»­Ì»¦Ì»ŸÌ»˜Ì»‘Ì»ŠÌ»ƒÌ»|Ì»uÌ»nÌ»gÌ»`Ì»YÌ»RÌ»KÌ»DÌ»=Ì»6Ì»/Ì»(Ì»!̻̻̻ ̻̻þË»÷Ë»ðË»éË»âË»ÛË»ÔË»ÍË»ÆË»¿Ë»¸Ë»±Ë»ªË»£Ë»œË»•Ë»ŽË»‡Ë»€Ë»yË»rË»kË»dË»]Ë»VË»OË»HË»AË»:Ë»3Ë»,Ë»%˻˻˻˻ ˻˻ûÊ»ôÊ»íÊ»æÊ»ßÊ»ØÊ»ÑÊ»ÊÊ»ÃÊ»¼Ê»µÊ»®Ê»§Ê» Ê»™Ê»’Ê»‹Ê»„Ê»}Ê»vÊ»oÊ»hÊ»aÊ»ZÊ»SÊ»LÊ»EÊ»>Ê»7Ê»0Ê»)Ê»"ʻʻʻ ʻʻÿÉ»øÉ»ñÉ»êÉ»ãÉ»ÜÉ»ÕÉ»ÎÉ»ÇÉ»ÀÉ»¹É»²É»«É»¤É»É»–ɻɻˆÉ»É»zÉ»sÉ»lÉ»eÉ»^É»WÉ»PÉ»IÉ»BÉ»;É»4É»-É»&ɻɻɻɻ ɻɻüÈ»õÈ»îÈ»çÈ»àÈ»ÙÈ»ÒÈ»ËÈ»ÄÈ»½È»¶È»¯È»¨È»¡È»šÈ»“È»ŒÈ»…È»~È»wÈ»pÈ»iÈ»bÈ»[È»TÈ»MÈ»FÈ»?È»8È»1È»*È»#ȻȻȻȻȻȻùÇ»òÇ»ëÇ»äÇ»ÝÇ»ÖÇ»ÏÇ»ÈÇ»ÁÇ»ºÇ»³Ç»¬Ç»¥Ç»žÇ»—ǻǻ‰Ç»‚Ç»{Ç»tÇ»mÇ»fÇ»_Ç»XÇ»QÇ»JÇ»CÇ»<Ç»5Ç».Ç»'Ç» ǻǻǻ ǻǻýÆ»öÆ»ïÆ»èÆ»áÆ»ÚÆ»ÓÆ»ÌÆ»ÅÆ»¾Æ»·Æ»°Æ»©Æ»¢Æ»›Æ»”ƻƻ†Æ»Æ»xÆ»qÆ»jÆ»cÆ»\Æ»UÆ»NÆ»GÆ»@Æ»9Æ»2Æ»+Æ»$ƻƻƻƻƻƻúÅ»óÅ»ìÅ»åÅ»ÞÅ»×Å»ÐÅ»ÉÅ»ÂÅ»»Å»´Å»­Å»¦Å»ŸÅ»˜Å»‘Å»ŠÅ»ƒÅ»|Å»uÅ»nÅ»gÅ»`Å»YÅ»RÅ»KÅ»DÅ»=Å»6Å»/Å»(Å»!ŻŻŻ ŻŻþÄ»÷Ä»ðÄ»éÄ»âÄ»ÛÄ»ÔÄ»ÍÄ»ÆÄ»¿Ä»¸Ä»±Ä»ªÄ»£Ä»œÄ»•Ä»ŽÄ»‡Ä»€Ä»yÄ»rÄ»kÄ»dÄ»]Ä»VÄ»OÄ»HÄ»AÄ»:Ä»3Ä»,Ä»%ĻĻĻĻ ĻĻûûôûíûæÃ»ßûØÃ»ÑûÊûÃû¼Ã»µÃ»®Ã»§Ã» Ã»™Ã»’û‹Ã»„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿ»øÂ»ñ»ê»ã»Ü»Õ»λÇ»À»¹Â»²Â»«Â»¤Â»»–»»ˆÂ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»üÁ»õÁ»îÁ»çÁ»àÁ»ÙÁ»ÒÁ»ËÁ»ÄÁ»½Á»¶Á»¯Á»¨Á»¡Á»šÁ»“Á»ŒÁ»…Á»~Á»wÁ»pÁ»iÁ»bÁ»[Á»TÁ»MÁ»FÁ»?Á»8Á»1Á»*Á»#Á»Á»Á»Á»Á»Á»ùÀ»òÀ»ëÀ»äÀ»ÝÀ»ÖÀ»ÏÀ»ÈÀ»ÁÀ»ºÀ»³À»¬À»¥À»žÀ»—À»À»‰À»‚À»{À»tÀ»mÀ»fÀ»_À»XÀ»QÀ»JÀ»CÀ»<À»5À».À»'À» À»À»À» À»À»ý¿»ö¿»ï¿»è¿»á¿»Ú¿»Ó¿»Ì¿»Å¿»¾¿»·¿»°¿»©¿»¢¿»›¿»”¿»¿»†¿»¿»x¿»q¿»j¿»c¿»\¿»U¿»N¿»G¿»@¿»9¿»2¿»+¿»$¿»¿»¿»¿»¿»¿»ú¾»ó¾»ì¾»å¾»Þ¾»×¾»о»ɾ»¾»»¾»´¾»­¾»¦¾»Ÿ¾»˜¾»‘¾»о»ƒ¾»|¾»u¾»n¾»g¾»`¾»Y¾»R¾»K¾»D¾»=¾»6¾»/¾»(¾»!¾»¾»¾» ¾»¾»þ½»÷½»ð½»é½»â½»Û½»Ô½»ͽ»ƽ»¿½»¸½»±½»ª½»£½»œ½»•½»޽»‡½»€½»y½»r½»k½»d½»]½»V½»O½»H½»A½»:½»3½»,½»%½»½»½»½» ½»½»û¼»ô¼»í¼»æ¼»ß¼»ؼ»Ѽ»ʼ»ü»¼¼»µ¼»®¼»§¼» ¼»™¼»’¼»‹¼»„¼»}¼»v¼»o¼»h¼»a¼»Z¼»S¼»L¼»E¼»>¼»7¼»0¼»)¼»"¼»¼»¼» ¼»¼»ÿ»»ø»»ñ»»ê»»ã»»Ü»»Õ»»λ»Ç»»À»»¹»»²»»«»»¤»»»»–»»»»ˆ»»»»z»»s»»l»»e»»^»»W»»P»»I»»B»»;»»4»»-»»&»»»»»»»» »»»»üº»õº»纻ົÙº»Òº»˺»ĺ»½º»¶º»¯º»¨º»¡º»šº»“º»Œº»…º»~º»wº»pº»iº»bº»[º»Tº»Mº»Fº»?º»8º»1º»*º»#º»º»º»º»º»º»ù¹»ò¹»ë¹»ä¹»ݹ»Ö¹»Ϲ»ȹ»Á¹»º¹»³¹»¬¹»¥¹»ž¹»—¹»¹»‰¹»‚¹»{¹»t¹»m¹»f¹»_¹»X¹»Q¹»J¹»C¹»<¹»5¹».¹»'¹» ¹»¹»¹» ¹»¹»ý¸»ö¸»︻踻ḻÚ¸»Ó¸»̸»Ÿ»¾¸»·¸»°¸»©¸»¢¸»›¸»”¸»¸»†¸»¸»x¸»q¸»j¸»c¸»\¸»U¸»N¸»G¸»@¸»9¸»2¸»+¸»$¸»¸»¸»¸»¸»¸»ú·»ó·»ì·»å·»Þ·»×·»з»É·»·»»·»´·»­·»¦·»Ÿ·»˜·»‘·»Š·»ƒ·»|·»u·»n·»g·»`·»Y·»R·»K·»D·»=·»6·»/·»(·»!·»·»·» ·»·»þ¶»÷¶»ð¶»é¶»â¶»Û¶»Ô¶»Ͷ»ƶ»¿¶»¸¶»±¶»ª¶»£¶»œ¶»•¶»޶»‡¶»€¶»y¶»r¶»k¶»d¶»]¶»V¶»O¶»H¶»A¶»:¶»3¶»,¶»%¶»¶»¶»¶» ¶»¶»ûµ»ôµ»íµ»æµ»ßµ»ص»ѵ»ʵ»õ»¼µ»µµ»®µ»§µ» µ»™µ»’µ»‹µ»„µ»}µ»vµ»oµ»hµ»aµ»Zµ»Sµ»Lµ»Eµ»>µ»7µ»0µ»)µ»"µ»µ»µ» µ»µ»ÿ´»ø´»ñ´»ê´»ã´»Ü´»Õ´»δ»Ç´»À´»¹´»²´»«´»¤´»´»–´»´»ˆ´»´»z´»s´»l´»e´»^´»W´»P´»I´»B´»;´»4´»-´»&´»´»´»´» ´»´»ü³»õ³»î³»ç³»à³»Ù³»Ò³»˳»ij»½³»¶³»¯³»¨³»¡³»š³»“³»Œ³»…³»~³»w³»p³»i³»b³»[³»T³»M³»F³»?³»8³»1³»*³»#³»³»³»³»³»³»ù²»ò²»ë²»ä²»ݲ»Ö²»ϲ»Ȳ»Á²»º²»³²»¬²»¥²»ž²»—²»²»‰²»‚²»{²»t²»m²»f²»_²»X²»Q²»J²»C²»<²»5²».²»'²» ²»²»²» ²»²»ý±»ö±»ï±»è±»á±»Ú±»Ó±»̱»ű»¾±»·±»°±»©±»¢±»›±»”±»±»†±»±»x±»q±»j±»c±»\±»U±»N±»G±»@±»9±»2±»+±»$±»±»±»±»±»±»ú°»ó°»ì°»å°»Þ°»×°»а»ɰ»°»»°»´°»­°»¦°»Ÿ°»˜°»‘°»а»ƒ°»|°»u°»n°»g°»`°»Y°»R°»K°»D°»=°»6°»/°»(°»!°»°»°» °»°»þ¯»÷¯»ð¯»鯻⯻Û¯»Ô¯»ͯ»Ư»¿¯»¸¯»±¯»ª¯»£¯»œ¯»•¯»ޝ»‡¯»€¯»y¯»r¯»k¯»d¯»]¯»V¯»O¯»H¯»A¯»:¯»3¯»,¯»%¯»¯»¯»¯» ¯»¯»û®»ô®»í®»æ®»ß®»Ø®»Ñ®»Ê®»î»¼®»µ®»®®»§®» ®»™®»’®»‹®»„®»}®»v®»o®»h®»a®»Z®»S®»L®»E®»>®»7®»0®»)®»"®»®»®» ®»®»ÿ­»ø­»ñ­»ê­»ã­»Ü­»Õ­»έ»Ç­»À­»¹­»²­»«­»¤­»­»–­»­»ˆ­»­»z­»s­»l­»e­»^­»W­»P­»I­»B­»;­»4­»-­»&­»­»­»­» ­»­»ü¬»õ¬»笻଻Ù¬»Ò¬»ˬ»Ĭ»½¬»¶¬»¯¬»¨¬»¡¬»š¬»“¬»Œ¬»…¬»~¬»w¬»p¬»i¬»b¬»[¬»T¬»M¬»F¬»?¬»8¬»1¬»*¬»#¬»¬»¬»¬»¬»¬»ù«»ò«»ë«»ä«»Ý«»Ö«»Ï«»È«»Á«»º«»³«»¬«»¥«»ž«»—«»«»‰«»‚«»{«»t«»m«»f«»_«»X«»Q«»J«»C«»<«»5«».«»'«» «»«»«» «»«»ýª»öª»請誻᪻Úª»Óª»̪»Ū»¾ª»·ª»°ª»©ª»¢ª»›ª»”ª»ª»†ª»ª»xª»qª»jª»cª»\ª»Uª»Nª»Gª»@ª»9ª»2ª»+ª»$ª»ª»ª»ª»ª»ª»ú©»ó©»ì©»å©»Þ©»ש»Щ»É©»©»»©»´©»­©»¦©»Ÿ©»˜©»‘©»Š©»ƒ©»|©»u©»n©»g©»`©»Y©»R©»K©»D©»=©»6©»/©»(©»!©»©»©» ©»©»þ¨»÷¨»ð¨»騻⨻Û¨»Ô¨»ͨ»ƨ»¿¨»¸¨»±¨»ª¨»£¨»œ¨»•¨»ލ»‡¨»€¨»y¨»r¨»k¨»d¨»]¨»V¨»O¨»H¨»A¨»:¨»3¨»,¨»%¨»¨»¨»¨» ¨»¨»û§»ô§»í§»æ§»ß§»ا»ѧ»ʧ»ç»¼§»µ§»®§»§§» §»™§»’§»‹§»„§»}§»v§»o§»h§»a§»Z§»S§»L§»E§»>§»7§»0§»)§»"§»§»§» §»§»ÿ¦»ø¦»ñ¦»ꦻ㦻ܦ»Õ¦»Φ»Ǧ»À¦»¹¦»²¦»«¦»¤¦»¦»–¦»¦»ˆ¦»¦»z¦»s¦»l¦»e¦»^¦»W¦»P¦»I¦»B¦»;¦»4¦»-¦»&¦»¦»¦»¦» ¦»¦»ü¥»õ¥»祻ॻÙ¥»Ò¥»Ë¥»Ä¥»½¥»¶¥»¯¥»¨¥»¡¥»š¥»“¥»Œ¥»…¥»~¥»w¥»p¥»i¥»b¥»[¥»T¥»M¥»F¥»?¥»8¥»1¥»*¥»#¥»¥»¥»¥»¥»¥»ù¤»ò¤»뤻䤻ݤ»Ö¤»Ϥ»Ȥ»Á¤»º¤»³¤»¬¤»¥¤»ž¤»—¤»¤»‰¤»‚¤»{¤»t¤»m¤»f¤»_¤»X¤»Q¤»J¤»C¤»<¤»5¤».¤»'¤» ¤»¤»¤» ¤»¤»ý£»ö£»裻᣻Ú£»Ó£»Ì£»Å£»¾£»·£»°£»©£»¢£»›£»”£»£»†£»£»x£»q£»j£»c£»\£»U£»N£»G£»@£»9£»2£»+£»$£»£»£»£»£»£»ú¢»ó¢»좻墻Þ¢»×¢»Т»É¢»¢»»¢»´¢»­¢»¦¢»Ÿ¢»˜¢»‘¢»Š¢»ƒ¢»|¢»u¢»n¢»g¢»`¢»Y¢»R¢»K¢»D¢»=¢»6¢»/¢»(¢»!¢»¢»¢» ¢»¢»þ¡»÷¡»ð¡»é¡»â¡»Û¡»Ô¡»Í¡»Æ¡»¿¡»¸¡»±¡»ª¡»£¡»œ¡»•¡»Ž¡»‡¡»€¡»y¡»r¡»k¡»d¡»]¡»V¡»O¡»H¡»A¡»:¡»3¡»,¡»%¡»¡»¡»¡» ¡»¡»û »ô »í »æ »ß »Ø »Ñ »Ê »à»¼ »µ »® »§ »  »™ »’ »‹ »„ »} »v »o »h »a »Z »S »L »E »> »7 »0 ») »" » » »  » »ÿŸ»øŸ»ñŸ»ꟻ㟻ÜŸ»ÕŸ»Ο»ÇŸ»ÀŸ»¹Ÿ»²Ÿ»«Ÿ»¤Ÿ»Ÿ»–Ÿ»Ÿ»ˆŸ»Ÿ»zŸ»sŸ»lŸ»eŸ»^Ÿ»WŸ»PŸ»IŸ»BŸ»;Ÿ»4Ÿ»-Ÿ»&Ÿ»Ÿ»Ÿ»Ÿ» Ÿ»Ÿ»üž»õž»îž»çž»àž»Ùž»Òž»Ëž»Äž»½ž»¶ž»¯ž»¨ž»¡ž»šž»“ž»Œž»…ž»~ž»wž»pž»iž»bž»[ž»Tž»Mž»Fž»?ž»8ž»1ž»*ž»#ž»ž»ž»ž»ž»ž»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýœ»öœ»蜻᜻Úœ»Óœ»Ìœ»Åœ»¾œ»·œ»°œ»©œ»¢œ»›œ»”œ»œ»†œ»œ»xœ»qœ»jœ»cœ»\œ»Uœ»Nœ»Gœ»@œ»9œ»2œ»+œ»$œ»œ»œ»œ»œ»œ»ú›»ó›»ì›»å›»Þ›»×›»Л»É›»›»»›»´›»­›»¦›»Ÿ›»˜›»‘›»Š›»ƒ›»|›»u›»n›»g›»`›»Y›»R›»K›»D›»=›»6›»/›»(›»!›»›»›» ›»›»þš»÷š»ðš»éš»âš»Ûš»Ôš»Íš»Æš»¿š»¸š»±š»ªš»£š»œš»•š»Žš»‡š»€š»yš»rš»kš»dš»]š»Vš»Oš»Hš»Aš»:š»3š»,š»%š»š»š»š» š»š»û™»ô™»í™»æ™»ß™»Ø™»Ñ™»Ê™»Ù»¼™»µ™»®™»§™» ™»™™»’™»‹™»„™»}™»v™»o™»h™»a™»Z™»S™»L™»E™»>™»7™»0™»)™»"™»™»™» ™»™»ÿ˜»ø˜»ñ˜»꘻㘻ܘ»Õ˜»Θ»ǘ»À˜»¹˜»²˜»«˜»¤˜»˜»–˜»˜»ˆ˜»˜»z˜»s˜»l˜»e˜»^˜»W˜»P˜»I˜»B˜»;˜»4˜»-˜»&˜»˜»˜»˜» ˜»˜»ü—»õ—»î—»ç—»à—»Ù—»Ò—»Ë—»Ä—»½—»¶—»¯—»¨—»¡—»š—»“—»Œ—»…—»~—»w—»p—»i—»b—»[—»T—»M—»F—»?—»8—»1—»*—»#—»—»—»—»—»—»ù–»ò–»ë–»ä–»Ý–»Ö–»Ï–»È–»Á–»º–»³–»¬–»¥–»ž–»—–»–»‰–»‚–»{–»t–»m–»f–»_–»X–»Q–»J–»C–»<–»5–».–»'–» –»–»–» –»–»ý•»ö•»ï•»è•»á•»Ú•»Ó•»Ì•»Å•»¾•»·•»°•»©•»¢•»›•»”•»•»†•»•»x•»q•»j•»c•»\•»U•»N•»G•»@•»9•»2•»+•»$•»•»•»•»•»•»ú”»ó”»ì”»å”»Þ”»×”»Д»É”»”»»”»´”»­”»¦”»Ÿ”»˜”»‘”»Š”»ƒ”»|”»u”»n”»g”»`”»Y”»R”»K”»D”»=”»6”»/”»(”»!”»”»”» ”»”»þ“»÷“»ð“»é“»â“»Û“»Ô“»Í“»Æ“»¿“»¸“»±“»ª“»£“»œ“»•“»Ž“»‡“»€“»y“»r“»k“»d“»]“»V“»O“»H“»A“»:“»3“»,“»%“»“»“»“» “»“»û’»ô’»í’»æ’»ß’»Ø’»Ñ’»Ê’»Ã’»¼’»µ’»®’»§’» ’»™’»’’»‹’»„’»}’»v’»o’»h’»a’»Z’»S’»L’»E’»>’»7’»0’»)’»"’»’»’» ’»’»ÿ‘»ø‘»ñ‘»ê‘»ã‘»Ü‘»Õ‘»Α»Ç‘»À‘»¹‘»²‘»«‘»¤‘»‘»–‘»‘»ˆ‘»‘»z‘»s‘»l‘»e‘»^‘»W‘»P‘»I‘»B‘»;‘»4‘»-‘»&‘»‘»‘»‘» ‘»‘»ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýŽ»öŽ»莻ᎻÚŽ»ÓŽ»ÌŽ»ÅŽ»¾Ž»·Ž»°Ž»©Ž»¢Ž»›Ž»”޻޻†Ž»Ž»xŽ»qŽ»jŽ»cŽ»\Ž»UŽ»NŽ»GŽ»@Ž»9Ž»2Ž»+Ž»$޻޻޻޻޻޻ú»ó»ì»å»Þ»×»лÉ»»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þŒ»÷Œ»ðŒ»錻⌻ÛŒ»ÔŒ»ÍŒ»ÆŒ»¿Œ»¸Œ»±Œ»ªŒ»£Œ»œŒ»•Œ»ŽŒ»‡Œ»€Œ»yŒ»rŒ»kŒ»dŒ»]Œ»VŒ»OŒ»HŒ»AŒ»:Œ»3Œ»,Œ»%Œ»Œ»Œ»Œ» Œ»Œ»û‹»ô‹»í‹»æ‹»ß‹»Ø‹»Ñ‹»Ê‹»Ë»¼‹»µ‹»®‹»§‹» ‹»™‹»’‹»‹‹»„‹»}‹»v‹»o‹»h‹»a‹»Z‹»S‹»L‹»E‹»>‹»7‹»0‹»)‹»"‹»‹»‹» ‹»‹»ÿŠ»øŠ»ñŠ»ꊻ㊻ÜŠ»ÕŠ»Ί»ÇŠ»ÀŠ»¹Š»²Š»«Š»¤Š»Š»–ллˆŠ»Š»zŠ»sŠ»lŠ»eŠ»^Š»WŠ»PŠ»IŠ»BŠ»;Š»4Š»-Š»&лллл ллü‰»õ‰»牻à‰»Ù‰»Ò‰»ˉ»ĉ»½‰»¶‰»¯‰»¨‰»¡‰»š‰»“‰»Œ‰»…‰»~‰»w‰»p‰»i‰»b‰»[‰»T‰»M‰»F‰»?‰»8‰»1‰»*‰»#‰»‰»‰»‰»‰»‰»ùˆ»òˆ»눻䈻݈»Öˆ»ψ»Ȉ»Áˆ»ºˆ»³ˆ»¬ˆ»¥ˆ»žˆ»—ˆ»ˆ»‰ˆ»‚ˆ»{ˆ»tˆ»mˆ»fˆ»_ˆ»Xˆ»Qˆ»Jˆ»Cˆ»<ˆ»5ˆ».ˆ»'ˆ» ˆ»ˆ»ˆ» ˆ»ˆ»ý‡»ö‡»臻ᇻÚ‡»Ó‡»̇»Ň»¾‡»·‡»°‡»©‡»¢‡»›‡»”‡»‡»†‡»‡»x‡»q‡»j‡»c‡»\‡»U‡»N‡»G‡»@‡»9‡»2‡»+‡»$‡»‡»‡»‡»‡»‡»ú†»ó†»솻冻Þ†»׆»І»Ɇ»†»»†»´†»­†»¦†»Ÿ†»˜†»‘†»І»ƒ†»|†»u†»n†»g†»`†»Y†»R†»K†»D†»=†»6†»/†»(†»!†»†»†» †»†»þ…»÷…»ð…»é…»â…»Û…»Ô…»Í…»Æ…»¿…»¸…»±…»ª…»£…»œ…»•…»Ž…»‡…»€…»y…»r…»k…»d…»]…»V…»O…»H…»A…»:…»3…»,…»%…»…»…»…» …»…»û„»ô„»í„»æ„»ß„»Ø„»Ñ„»Ê„»Ä»¼„»µ„»®„»§„» „»™„»’„»‹„»„„»}„»v„»o„»h„»a„»Z„»S„»L„»E„»>„»7„»0„»)„»"„»„»„» „»„»ÿƒ»øƒ»ñƒ»ꃻ・܃»Õƒ»΃»ǃ»Àƒ»¹ƒ»²ƒ»«ƒ»¤ƒ»ƒ»–ƒ»ƒ»ˆƒ»ƒ»zƒ»sƒ»lƒ»eƒ»^ƒ»Wƒ»Pƒ»Iƒ»Bƒ»;ƒ»4ƒ»-ƒ»&ƒ»ƒ»ƒ»ƒ» ƒ»ƒ»ü‚»õ‚»î‚»ç‚»à‚»Ù‚»Ò‚»Ë‚»Ä‚»½‚»¶‚»¯‚»¨‚»¡‚»š‚»“‚»Œ‚»…‚»~‚»w‚»p‚»i‚»b‚»[‚»T‚»M‚»F‚»?‚»8‚»1‚»*‚»#‚»‚»‚»‚»‚»‚»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ý€»ö€»耻ျÚ€»Ó€»Ì€»Å€»¾€»·€»°€»©€»¢€»›€»”€»€»†€»€»x€»q€»j€»c€»\€»U€»N€»G€»@€»9€»2€»+€»$€»€»€»€»€»€»ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ~»÷~»ð~»é~»â~»Û~»Ô~»Í~»Æ~»¿~»¸~»±~»ª~»£~»œ~»•~»Ž~»‡~»€~»y~»r~»k~»d~»]~»V~»O~»H~»A~»:~»3~»,~»%~»~»~»~» ~»~»û}»ô}»í}»æ}»ß}»Ø}»Ñ}»Ê}»Ã}»¼}»µ}»®}»§}» }»™}»’}»‹}»„}»}}»v}»o}»h}»a}»Z}»S}»L}»E}»>}»7}»0}»)}»"}»}»}» }»}»ÿ|»ø|»ñ|»ê|»ã|»Ü|»Õ|»Î|»Ç|»À|»¹|»²|»«|»¤|»|»–|»|»ˆ|»|»z|»s|»l|»e|»^|»W|»P|»I|»B|»;|»4|»-|»&|»|»|»|» |»|»ü{»õ{»î{»ç{»à{»Ù{»Ò{»Ë{»Ä{»½{»¶{»¯{»¨{»¡{»š{»“{»Œ{»…{»~{»w{»p{»i{»b{»[{»T{»M{»F{»?{»8{»1{»*{»#{»{»{»{»{»{»ùz»òz»ëz»äz»Ýz»Öz»Ïz»Èz»Áz»ºz»³z»¬z»¥z»žz»—z»z»‰z»‚z»{z»tz»mz»fz»_z»Xz»Qz»Jz»Cz»v»7v»0v»)v»"v»v»v» v»v»ÿu»øu»ñu»êu»ãu»Üu»Õu»Îu»Çu»Àu»¹u»²u»«u»¤u»u»–u»u»ˆu»u»zu»su»lu»eu»^u»Wu»Pu»Iu»Bu»;u»4u»-u»&u»u»u»u» u»u»üt»õt»ît»çt»àt»Ùt»Òt»Ët»Ät»½t»¶t»¯t»¨t»¡t»št»“t»Œt»…t»~t»wt»pt»it»bt»[t»Tt»Mt»Ft»?t»8t»1t»*t»#t»t»t»t»t»t»ùs»òs»ës»äs»Ýs»Ös»Ïs»Ès»Ás»ºs»³s»¬s»¥s»žs»—s»s»‰s»‚s»{s»ts»ms»fs»_s»Xs»Qs»Js»Cs»o»7o»0o»)o»"o»o»o» o»o»ÿn»øn»ñn»ên»ãn»Ün»Õn»În»Çn»Àn»¹n»²n»«n»¤n»n»–n»n»ˆn»n»zn»sn»ln»en»^n»Wn»Pn»In»Bn»;n»4n»-n»&n»n»n»n» n»n»üm»õm»îm»çm»àm»Ùm»Òm»Ëm»Äm»½m»¶m»¯m»¨m»¡m»šm»“m»Œm»…m»~m»wm»pm»im»bm»[m»Tm»Mm»Fm»?m»8m»1m»*m»#m»m»m»m»m»m»ùl»òl»ël»äl»Ýl»Öl»Ïl»Èl»Ál»ºl»³l»¬l»¥l»žl»—l»l»‰l»‚l»{l»tl»ml»fl»_l»Xl»Ql»Jl»Cl»h»7h»0h»)h»"h»h»h» h»h»ÿg»øg»ñg»êg»ãg»Üg»Õg»Îg»Çg»Àg»¹g»²g»«g»¤g»g»–g»g»ˆg»g»zg»sg»lg»eg»^g»Wg»Pg»Ig»Bg»;g»4g»-g»&g»g»g»g» g»g»üf»õf»îf»çf»àf»Ùf»Òf»Ëf»Äf»½f»¶f»¯f»¨f»¡f»šf»“f»Œf»…f»~f»wf»pf»if»bf»[f»Tf»Mf»Ff»?f»8f»1f»*f»#f»f»f»f»f»f»ùe»òe»ëe»äe»Ýe»Öe»Ïe»Èe»Áe»ºe»³e»¬e»¥e»že»—e»e»‰e»‚e»{e»te»me»fe»_e»Xe»Qe»Je»Ce»a»7a»0a»)a»"a»a»a» a»a»ÿ`»ø`»ñ`»ê`»ã`»Ü`»Õ`»Î`»Ç`»À`»¹`»²`»«`»¤`»`»–`»`»ˆ`»`»z`»s`»l`»e`»^`»W`»P`»I`»B`»;`»4`»-`»&`»`»`»`» `»`»ü_»õ_»î_»ç_»à_»Ù_»Ò_»Ë_»Ä_»½_»¶_»¯_»¨_»¡_»š_»“_»Œ_»…_»~_»w_»p_»i_»b_»[_»T_»M_»F_»?_»8_»1_»*_»#_»_»_»_»_»_»ù^»ò^»ë^»ä^»Ý^»Ö^»Ï^»È^»Á^»º^»³^»¬^»¥^»ž^»—^»^»‰^»‚^»{^»t^»m^»f^»_^»X^»Q^»J^»C^»<^»5^».^»'^» ^»^»^» ^»^»ý]»ö]»ï]»è]»á]»Ú]»Ó]»Ì]»Å]»¾]»·]»°]»©]»¢]»›]»”]»]»†]»]»x]»q]»j]»c]»\]»U]»N]»G]»@]»9]»2]»+]»$]»]»]»]»]»]»ú\»ó\»ì\»å\»Þ\»×\»Ð\»É\»Â\»»\»´\»­\»¦\»Ÿ\»˜\»‘\»Š\»ƒ\»|\»u\»n\»g\»`\»Y\»R\»K\»D\»=\»6\»/\»(\»!\»\»\» \»\»þ[»÷[»ð[»é[»â[»Û[»Ô[»Í[»Æ[»¿[»¸[»±[»ª[»£[»œ[»•[»Ž[»‡[»€[»y[»r[»k[»d[»][»V[»O[»H[»A[»:[»3[»,[»%[»[»[»[» [»[»ûZ»ôZ»íZ»æZ»ßZ»ØZ»ÑZ»ÊZ»ÃZ»¼Z»µZ»®Z»§Z» Z»™Z»’Z»‹Z»„Z»}Z»vZ»oZ»hZ»aZ»ZZ»SZ»LZ»EZ»>Z»7Z»0Z»)Z»"Z»Z»Z» Z»Z»ÿY»øY»ñY»êY»ãY»ÜY»ÕY»ÎY»ÇY»ÀY»¹Y»²Y»«Y»¤Y»Y»–Y»Y»ˆY»Y»zY»sY»lY»eY»^Y»WY»PY»IY»BY»;Y»4Y»-Y»&Y»Y»Y»Y» Y»Y»üX»õX»îX»çX»àX»ÙX»ÒX»ËX»ÄX»½X»¶X»¯X»¨X»¡X»šX»“X»ŒX»…X»~X»wX»pX»iX»bX»[X»TX»MX»FX»?X»8X»1X»*X»#X»X»X»X»X»X»ùW»òW»ëW»äW»ÝW»ÖW»ÏW»ÈW»ÁW»ºW»³W»¬W»¥W»žW»—W»W»‰W»‚W»{W»tW»mW»fW»_W»XW»QW»JW»CW»S»7S»0S»)S»"S»S»S» S»S»ÿR»øR»ñR»êR»ãR»ÜR»ÕR»ÎR»ÇR»ÀR»¹R»²R»«R»¤R»R»–R»R»ˆR»R»zR»sR»lR»eR»^R»WR»PR»IR»BR»;R»4R»-R»&R»R»R»R» R»R»üQ»õQ»îQ»çQ»àQ»ÙQ»ÒQ»ËQ»ÄQ»½Q»¶Q»¯Q»¨Q»¡Q»šQ»“Q»ŒQ»…Q»~Q»wQ»pQ»iQ»bQ»[Q»TQ»MQ»FQ»?Q»8Q»1Q»*Q»#Q»Q»Q»Q»Q»Q»ùP»òP»ëP»äP»ÝP»ÖP»ÏP»ÈP»ÁP»ºP»³P»¬P»¥P»žP»—P»P»‰P»‚P»{P»tP»mP»fP»_P»XP»QP»JP»CP»L»7L»0L»)L»"L»L»L» L»L»ÿK»øK»ñK»êK»ãK»ÜK»ÕK»ÎK»ÇK»ÀK»¹K»²K»«K»¤K»K»–K»K»ˆK»K»zK»sK»lK»eK»^K»WK»PK»IK»BK»;K»4K»-K»&K»K»K»K» K»K»üJ»õJ»îJ»çJ»àJ»ÙJ»ÒJ»ËJ»ÄJ»½J»¶J»¯J»¨J»¡J»šJ»“J»ŒJ»…J»~J»wJ»pJ»iJ»bJ»[J»TJ»MJ»FJ»?J»8J»1J»*J»#J»J»J»J»J»J»ùI»òI»ëI»äI»ÝI»ÖI»ÏI»ÈI»ÁI»ºI»³I»¬I»¥I»žI»—I»I»‰I»‚I»{I»tI»mI»fI»_I»XI»QI»JI»CI»E»7E»0E»)E»"E»E»E» E»E»ÿD»øD»ñD»êD»ãD»ÜD»ÕD»ÎD»ÇD»ÀD»¹D»²D»«D»¤D»D»–D»D»ˆD»D»zD»sD»lD»eD»^D»WD»PD»ID»BD»;D»4D»-D»&D»D»D»D» D»D»üC»õC»îC»çC»àC»ÙC»ÒC»ËC»ÄC»½C»¶C»¯C»¨C»¡C»šC»“C»ŒC»…C»~C»wC»pC»iC»bC»[C»TC»MC»FC»?C»8C»1C»*C»#C»C»C»C»C»C»ùB»òB»ëB»äB»ÝB»ÖB»ÏB»ÈB»ÁB»ºB»³B»¬B»¥B»žB»—B»B»‰B»‚B»{B»tB»mB»fB»_B»XB»QB»JB»CB»»ô>»í>»æ>»ß>»Ø>»Ñ>»Ê>»Ã>»¼>»µ>»®>»§>» >»™>»’>»‹>»„>»}>»v>»o>»h>»a>»Z>»S>»L>»E>»>>»7>»0>»)>»">»>»>» >»>»ÿ=»ø=»ñ=»ê=»ã=»Ü=»Õ=»Î=»Ç=»À=»¹=»²=»«=»¤=»=»–=»=»ˆ=»=»z=»s=»l=»e=»^=»W=»P=»I=»B=»;=»4=»-=»&=»=»=»=» =»=»ü<»õ<»î<»ç<»à<»Ù<»Ò<»Ë<»Ä<»½<»¶<»¯<»¨<»¡<»š<»“<»Œ<»…<»~<»w<»p<»i<»b<»[<»T<»M<»F<»?<»8<»1<»*<»#<»<»<»<»<»<»ù;»ò;»ë;»ä;»Ý;»Ö;»Ï;»È;»Á;»º;»³;»¬;»¥;»ž;»—;»;»‰;»‚;»{;»t;»m;»f;»_;»X;»Q;»J;»C;»<;»5;».;»';» ;»;»;» ;»;»ý:»ö:»ï:»è:»á:»Ú:»Ó:»Ì:»Å:»¾:»·:»°:»©:»¢:»›:»”:»:»†:»:»x:»q:»j:»c:»\:»U:»N:»G:»@:»9:»2:»+:»$:»:»:»:»:»:»ú9»ó9»ì9»å9»Þ9»×9»Ð9»É9»Â9»»9»´9»­9»¦9»Ÿ9»˜9»‘9»Š9»ƒ9»|9»u9»n9»g9»`9»Y9»R9»K9»D9»=9»69»/9»(9»!9»9»9» 9»9»þ8»÷8»ð8»é8»â8»Û8»Ô8»Í8»Æ8»¿8»¸8»±8»ª8»£8»œ8»•8»Ž8»‡8»€8»y8»r8»k8»d8»]8»V8»O8»H8»A8»:8»38»,8»%8»8»8»8» 8»8»û7»ô7»í7»æ7»ß7»Ø7»Ñ7»Ê7»Ã7»¼7»µ7»®7»§7» 7»™7»’7»‹7»„7»}7»v7»o7»h7»a7»Z7»S7»L7»E7»>7»77»07»)7»"7»7»7» 7»7»ÿ6»ø6»ñ6»ê6»ã6»Ü6»Õ6»Î6»Ç6»À6»¹6»²6»«6»¤6»6»–6»6»ˆ6»6»z6»s6»l6»e6»^6»W6»P6»I6»B6»;6»46»-6»&6»6»6»6» 6»6»ü5»õ5»î5»ç5»à5»Ù5»Ò5»Ë5»Ä5»½5»¶5»¯5»¨5»¡5»š5»“5»Œ5»…5»~5»w5»p5»i5»b5»[5»T5»M5»F5»?5»85»15»*5»#5»5»5»5»5»5»ù4»ò4»ë4»ä4»Ý4»Ö4»Ï4»È4»Á4»º4»³4»¬4»¥4»ž4»—4»4»‰4»‚4»{4»t4»m4»f4»_4»X4»Q4»J4»C4»<4»54».4»'4» 4»4»4» 4»4»ý3»ö3»ï3»è3»á3»Ú3»Ó3»Ì3»Å3»¾3»·3»°3»©3»¢3»›3»”3»3»†3»3»x3»q3»j3»c3»\3»U3»N3»G3»@3»93»23»+3»$3»3»3»3»3»3»ú2»ó2»ì2»å2»Þ2»×2»Ð2»É2»Â2»»2»´2»­2»¦2»Ÿ2»˜2»‘2»Š2»ƒ2»|2»u2»n2»g2»`2»Y2»R2»K2»D2»=2»62»/2»(2»!2»2»2» 2»2»þ1»÷1»ð1»é1»â1»Û1»Ô1»Í1»Æ1»¿1»¸1»±1»ª1»£1»œ1»•1»Ž1»‡1»€1»y1»r1»k1»d1»]1»V1»O1»H1»A1»:1»31»,1»%1»1»1»1» 1»1»û0»ô0»í0»æ0»ß0»Ø0»Ñ0»Ê0»Ã0»¼0»µ0»®0»§0» 0»™0»’0»‹0»„0»}0»v0»o0»h0»a0»Z0»S0»L0»E0»>0»70»00»)0»"0»0»0» 0»0»ÿ/»ø/»ñ/»ê/»ã/»Ü/»Õ/»Î/»Ç/»À/»¹/»²/»«/»¤/»/»–/»/»ˆ/»/»z/»s/»l/»e/»^/»W/»P/»I/»B/»;/»4/»-/»&/»/»/»/» /»/»ü.»õ.»î.»ç.»à.»Ù.»Ò.»Ë.»Ä.»½.»¶.»¯.»¨.»¡.»š.»“.»Œ.»….»~.»w.»p.»i.»b.»[.»T.»M.»F.»?.»8.»1.»*.»#.».».».».».»ù-»ò-»ë-»ä-»Ý-»Ö-»Ï-»È-»Á-»º-»³-»¬-»¥-»ž-»—-»-»‰-»‚-»{-»t-»m-»f-»_-»X-»Q-»J-»C-»<-»5-».-»'-» -»-»-» -»-»ý,»ö,»ï,»è,»á,»Ú,»Ó,»Ì,»Å,»¾,»·,»°,»©,»¢,»›,»”,»,»†,»,»x,»q,»j,»c,»\,»U,»N,»G,»@,»9,»2,»+,»$,»,»,»,»,»,»ú+»ó+»ì+»å+»Þ+»×+»Ð+»É+»Â+»»+»´+»­+»¦+»Ÿ+»˜+»‘+»Š+»ƒ+»|+»u+»n+»g+»`+»Y+»R+»K+»D+»=+»6+»/+»(+»!+»+»+» +»+»þ*»÷*»ð*»é*»â*»Û*»Ô*»Í*»Æ*»¿*»¸*»±*»ª*»£*»œ*»•*»Ž*»‡*»€*»y*»r*»k*»d*»]*»V*»O*»H*»A*»:*»3*»,*»%*»*»*»*» *»*»û)»ô)»í)»æ)»ß)»Ø)»Ñ)»Ê)»Ã)»¼)»µ)»®)»§)» )»™)»’)»‹)»„)»})»v)»o)»h)»a)»Z)»S)»L)»E)»>)»7)»0)»))»")»)»)» )»)»ÿ(»ø(»ñ(»ê(»ã(»Ü(»Õ(»Î(»Ç(»À(»¹(»²(»«(»¤(»(»–(»(»ˆ(»(»z(»s(»l(»e(»^(»W(»P(»I(»B(»;(»4(»-(»&(»(»(»(» (»(»ü'»õ'»î'»ç'»à'»Ù'»Ò'»Ë'»Ä'»½'»¶'»¯'»¨'»¡'»š'»“'»Œ'»…'»~'»w'»p'»i'»b'»['»T'»M'»F'»?'»8'»1'»*'»#'»'»'»'»'»'»ù&»ò&»ë&»ä&»Ý&»Ö&»Ï&»È&»Á&»º&»³&»¬&»¥&»ž&»—&»&»‰&»‚&»{&»t&»m&»f&»_&»X&»Q&»J&»C&»<&»5&».&»'&» &»&»&» &»&»ý%»ö%»ï%»è%»á%»Ú%»Ó%»Ì%»Å%»¾%»·%»°%»©%»¢%»›%»”%»%»†%»%»x%»q%»j%»c%»\%»U%»N%»G%»@%»9%»2%»+%»$%»%»%»%»%»%»ú$»ó$»ì$»å$»Þ$»×$»Ð$»É$»Â$»»$»´$»­$»¦$»Ÿ$»˜$»‘$»Š$»ƒ$»|$»u$»n$»g$»`$»Y$»R$»K$»D$»=$»6$»/$»($»!$»$»$» $»$»þ#»÷#»ð#»é#»â#»Û#»Ô#»Í#»Æ#»¿#»¸#»±#»ª#»£#»œ#»•#»Ž#»‡#»€#»y#»r#»k#»d#»]#»V#»O#»H#»A#»:#»3#»,#»%#»#»#»#» #»#»û"»ô"»í"»æ"»ß"»Ø"»Ñ"»Ê"»Ã"»¼"»µ"»®"»§"» "»™"»’"»‹"»„"»}"»v"»o"»h"»a"»Z"»S"»L"»E"»>"»7"»0"»)"»""»"»"» "»"»ÿ!»ø!»ñ!»ê!»ã!»Ü!»Õ!»Î!»Ç!»À!»¹!»²!»«!»¤!»!»–!»!»ˆ!»!»z!»s!»l!»e!»^!»W!»P!»I!»B!»;!»4!»-!»&!»!»!»!» !»!»ü »õ »î »ç »à »Ù »Ò »Ë »Ä »½ »¶ »¯ »¨ »¡ »š »“ »Œ »… »~ »w »p »i »b »[ »T »M »F »? »8 »1 »* »# » » » » » »ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»û»ô»í»æ»ß»Ø»Ñ»Ê»Ã»¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿ»ø»ñ»ê»ã»Ü»Õ»Î»Ç»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»û»ô»í»æ»ß»Ø»Ñ»Ê»Ã»¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿ»ø»ñ»ê»ã»Ü»Õ»Î»Ç»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»û »ô »í »æ »ß »Ø »Ñ »Ê »à »¼ »µ »® »§ »  »™ »’ »‹ »„ »} »v »o »h »a »Z »S »L »E »> »7 »0 ») »" » » » » »ÿ »ø »ñ »ê »ã »Ü »Õ »Î »Ç »À »¹ »² »« »¤ » »– » »ˆ » »z »s »l »e »^ »W »P »I »B »; »4 »- »& » » » » » »ü »õ »î »ç »à »Ù »Ò »Ë »Ä »½ »¶ »¯ »¨ »¡ »š »“ »Œ »… »~ »w »p »i »b »[ »T »M »F »? »8 »1 »* »# » » » » » »ù »ò »ë »ä »Ý »Ö »Ï »È »Á »º »³ »¬ »¥ »ž »— » »‰ »‚ »{ »t »m »f »_ »X »Q »J »C »< »5 ». »' » » » » » »ý »ö »ï »è »á »Ú »Ó »Ì »Å »¾ »· »° »© »¢ »› »” » »† » »x »q »j »c »\ »U »N »G »@ »9 »2 »+ »$ » » » » » »ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»û»ô»í»æ»ß»Ø»Ñ»Ê»Ã»¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿ»ø»ñ»ê»ã»Ü»Õ»Î»Ç»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»ú»ó»ì»å»Þ»×»Ð»É»Â»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»ûÿºôÿºíÿºæÿºßÿºØÿºÑÿºÊÿºÃÿº¼ÿºµÿº®ÿº§ÿº ÿº™ÿº’ÿº‹ÿº„ÿº}ÿºvÿºoÿºhÿºaÿºZÿºSÿºLÿºEÿº>ÿº7ÿº0ÿº)ÿº"ÿºÿºÿº ÿºÿºÿþºøþºñþºêþºãþºÜþºÕþºÎþºÇþºÀþº¹þº²þº«þº¤þºþº–þºþºˆþºþºzþºsþºlþºeþº^þºWþºPþºIþºBþº;þº4þº-þº&þºþºþºþº þºþºüýºõýºîýºçýºàýºÙýºÒýºËýºÄýº½ýº¶ýº¯ýº¨ýº¡ýºšýº“ýºŒýº…ýº~ýºwýºpýºiýºbýº[ýºTýºMýºFýº?ýº8ýº1ýº*ýº#ýºýºýºýºýºýºùüºòüºëüºäüºÝüºÖüºÏüºÈüºÁüººüº³üº¬üº¥üºžüº—üºüº‰üº‚üº{üºtüºmüºfüº_üºXüºQüºJüºCüº<üº5üº.üº'üº üºüºüº üºüºýûºöûºïûºèûºáûºÚûºÓûºÌûºÅûº¾ûº·ûº°ûº©ûº¢ûº›ûº”ûºûº†ûºûºxûºqûºjûºcûº\ûºUûºNûºGûº@ûº9ûº2ûº+ûº$ûºûºûºûºûºûºúúºóúºìúºåúºÞúº×úºÐúºÉúºÂúº»úº´úº­úº¦úºŸúº˜úº‘úºŠúºƒúº|úºuúºnúºgúº`úºYúºRúºKúºDúº=úº6úº/úº(úº!úºúºúº úºúºþùº÷ùºðùºéùºâùºÛùºÔùºÍùºÆùº¿ùº¸ùº±ùºªùº£ùºœùº•ùºŽùº‡ùº€ùºyùºrùºkùºdùº]ùºVùºOùºHùºAùº:ùº3ùº,ùº%ùºùºùºùº ùºùºûøºôøºíøºæøºßøºØøºÑøºÊøºÃøº¼øºµøº®øº§øº øº™øº’øº‹øº„øº}øºvøºoøºhøºaøºZøºSøºLøºEøº>øº7øº0øº)øº"øºøºøº øºøºÿ÷ºø÷ºñ÷ºê÷ºã÷ºÜ÷ºÕ÷ºÎ÷ºÇ÷ºÀ÷º¹÷º²÷º«÷º¤÷º÷º–÷º÷ºˆ÷º÷ºz÷ºs÷ºl÷ºe÷º^÷ºW÷ºP÷ºI÷ºB÷º;÷º4÷º-÷º&÷º÷º÷º÷º ÷º÷ºüöºõöºîöºçöºàöºÙöºÒöºËöºÄöº½öº¶öº¯öº¨öº¡öºšöº“öºŒöº…öº~öºwöºpöºiöºböº[öºTöºMöºFöº?öº8öº1öº*öº#öºöºöºöºöºöºùõºòõºëõºäõºÝõºÖõºÏõºÈõºÁõººõº³õº¬õº¥õºžõº—õºõº‰õº‚õº{õºtõºmõºfõº_õºXõºQõºJõºCõº<õº5õº.õº'õº õºõºõº õºõºýôºöôºïôºèôºáôºÚôºÓôºÌôºÅôº¾ôº·ôº°ôº©ôº¢ôº›ôº”ôºôº†ôºôºxôºqôºjôºcôº\ôºUôºNôºGôº@ôº9ôº2ôº+ôº$ôºôºôºôºôºôºúóºóóºìóºåóºÞóº×óºÐóºÉóºÂóº»óº´óº­óº¦óºŸóº˜óº‘óºŠóºƒóº|óºuóºnóºgóº`óºYóºRóºKóºDóº=óº6óº/óº(óº!óºóºóº óºóºþòº÷òºðòºéòºâòºÛòºÔòºÍòºÆòº¿òº¸òº±òºªòº£òºœòº•òºŽòº‡òº€òºyòºròºkòºdòº]òºVòºOòºHòºAòº:òº3òº,òº%òºòºòºòº òºòºûñºôñºíñºæñºßñºØñºÑñºÊñºÃñº¼ñºµñº®ñº§ñº ñº™ñº’ñº‹ñº„ñº}ñºvñºoñºhñºañºZñºSñºLñºEñº>ñº7ñº0ñº)ñº"ñºñºñº ñºñºÿðºøðºñðºêðºãðºÜðºÕðºÎðºÇðºÀðº¹ðº²ðº«ðº¤ðºðº–ðºðºˆðºðºzðºsðºlðºeðº^ðºWðºPðºIðºBðº;ðº4ðº-ðº&ðºðºðºðº ðºðºüïºõïºîïºçïºàïºÙïºÒïºËïºÄﺽﺶﺯﺨﺡﺚﺓﺌﺅïº~ïºwïºpïºiïºbïº[ïºTïºMïºFïº?ïº8ïº1ïº*ïº#ïºïºïºïºïºïºùîºòîºëîºäîºÝîºÖîºÏîºÈîºÁîºîº‰îº‚îº{îºtîºmîºfîº_îºXîºQîºJîºCîº<îº5îº.îº'îº îºîºîº îºîºýíºöíºïíºèíºáíºÚíºÓíºÌíºÅíº¾íº·íº°íº©íº¢íº›íº”íºíº†íºíºxíºqíºjíºcíº\íºUíºNíºGíº@íº9íº2íº+íº$íºíºíºíºíºíºúìºóìºììºåìºÞìº×ìºÐìºÉìºÂ캻캴캭캦캟캘캑캊캃ìº|ìºuìºnìºgìº`ìºYìºRìºKìºDìº=ìº6ìº/ìº(ìº!ìºìºìº ìºìºþëº÷ëºðëºéëºâëºÛëºÔëºÍëºÆëº¿ëº¸ëº±ëºªëº£ëºœëº•ëºŽëº‡ëº€ëºyëºrëºkëºdëº]ëºVëºOëºHëºAëº:ëº3ëº,ëº%ëºëºëºëº ëºëºûêºôêºíêºæêºßêºØêºÑêºÊêºÃ꺼꺵꺮꺧꺠꺙꺒꺋꺄êº}êºvêºoêºhêºaêºZêºSêºLêºEêº>êº7êº0êº)êº"êºêºêº êºêºÿéºøéºñéºêéºãéºÜéºÕéºÎéºÇéºÀ麹麲麫麤éºéº–éºéºˆéºéºzéºséºléºeéº^éºWéºPéºIéºBéº;éº4éº-éº&éºéºéºéº éºéºüèºõèºîèºçèºàèºÙèºÒèºËèºÄ躽躶躯躨躡躚躓躌躅èº~èºwèºpèºièºbèº[èºTèºMèºFèº?èº8èº1èº*èº#èºèºèºèºèºèºùçºòçºëçºäçºÝçºÖçºÏçºÈçºÁ纺纳纬纥纞纗çºçº‰çº‚çº{çºtçºmçºfçº_çºXçºQçºJçºCçº<çº5çº.çº'çº çºçºçº çºçºýæºöæºïæºèæºáæºÚæºÓæºÌæºÅæº¾æº·æº°æº©æº¢æº›æº”æºæº†æºæºxæºqæºjæºcæº\æºUæºNæºGæº@æº9æº2æº+æº$æºæºæºæºæºæºúåºóåºìåºååºÞåº×åºÐåºÉåºÂ庻庴庭度废庘庑床広åº|åºuåºnåºgåº`åºYåºRåºKåºDåº=åº6åº/åº(åº!åºåºåº åºåºþäº÷äºðäºéäºâäºÛäºÔäºÍäºÆäº¿äº¸äº±äºªäº£äºœäº•äºŽäº‡äº€äºyäºräºkäºdäº]äºVäºOäºHäºAäº:äº3äº,äº%äºäºäºäº äºäºûãºôãºíãºæãºßãºØãºÑãºÊãºÃ㺼㺵㺮㺧㺠㺙㺒㺋㺄ãº}ãºvãºoãºhãºaãºZãºSãºLãºEãº>ãº7ãº0ãº)ãº"ãºãºãº ãºãºÿâºøâºñâºêâºãâºÜâºÕâºÎâºÇâºÀ⺹⺲⺫⺤âºâº–âºâºˆâºâºzâºsâºlâºeâº^âºWâºPâºIâºBâº;âº4âº-âº&âºâºâºâº âºâºüáºõáºîáºçáºàáºÙáºÒáºËáºÄẽẶắẨạẚẓẌẅáº~áºwáºpáºiáºbáº[áºTáºMáºFáº?áº8áº1áº*áº#áºáºáºáºáºáºùàºòàºëàºäàºÝàºÖàºÏàºÈàºÁ຺ຳຬລພທàºàº‰àº‚àº{àºtàºmàºfàº_àºXàºQàºJàºCàº<àº5àº.àº'ຠàºàºàº àºàºýߺöߺïߺèߺáߺÚߺÓߺÌߺÅߺ¾ßº·ßº°ßº©ßº¢ßº›ßº”ߺߺ†ßºߺxߺqߺjߺcߺ\ߺUߺNߺGߺ@ߺ9ߺ2ߺ+ߺ$ߺߺߺߺߺߺúÞºóÞºìÞºåÞºÞÞº×ÞºÐÞºÉÞºÂÞº»Þº´Þº­Þº¦ÞºŸÞº˜Þº‘ÞºŠÞºƒÞº|ÞºuÞºnÞºgÞº`ÞºYÞºRÞºKÞºDÞº=Þº6Þº/Þº(Þº!ÞºÞºÞº ÞºÞºþݺ÷ݺðݺéݺâݺÛݺÔݺÍݺÆÝº¿Ýº¸Ýº±ÝºªÝº£ÝºœÝº•ݺŽÝº‡Ýº€Ýºyݺrݺkݺdݺ]ݺVݺOݺHݺAݺ:ݺ3ݺ,ݺ%ݺݺݺݺ ݺݺûܺôܺíܺæÜºßܺØÜºÑܺÊܺÃܺ¼ÜºµÜº®Üº§Üº Üº™Üº’ܺ‹Üº„ܺ}ܺvܺoܺhܺaܺZܺSܺLܺEܺ>ܺ7ܺ0ܺ)ܺ"ܺܺܺ ܺܺÿÛºøÛºñÛºêÛºãÛºÜÛºÕÛºÎÛºÇÛºÀÛº¹Ûº²Ûº«Ûº¤ÛºÛº–ÛºÛºˆÛºÛºzÛºsÛºlÛºeÛº^ÛºWÛºPÛºIÛºBÛº;Ûº4Ûº-Ûº&ÛºÛºÛºÛº ÛºÛºüÚºõÚºîÚºçÚºàÚºÙÚºÒÚºËÚºÄÚº½Úº¶Úº¯Úº¨Úº¡ÚºšÚº“ÚºŒÚº…Úº~ÚºwÚºpÚºiÚºbÚº[ÚºTÚºMÚºFÚº?Úº8Úº1Úº*Úº#ÚºÚºÚºÚºÚºÚºùÙºòÙºëÙºäÙºÝÙºÖÙºÏÙºÈÙºÁÙººÙº³Ùº¬Ùº¥ÙºžÙº—ٺٺ‰Ùº‚Ùº{ÙºtÙºmÙºfÙº_ÙºXÙºQÙºJÙºCÙº<Ùº5Ùº.Ùº'Ùº ٺٺٺ ٺٺýغöغïØºèØºáØºÚØºÓØºÌØºÅغ¾Øº·Øº°Øº©Øº¢Øº›Øº”غغ†Øºغxغqغjغcغ\غUغNغGغ@غ9غ2غ+غ$غغغغغغú׺ó׺ì׺å׺Þ׺×׺Ð׺É׺Â׺»×º´×º­×º¦×ºŸ×º˜×º‘׺Š×ºƒ×º|׺u׺n׺g׺`׺Y׺R׺K׺D׺=׺6׺/׺(׺!׺׺׺ ׺׺þÖº÷ÖºðÖºéÖºâÖºÛÖºÔÖºÍÖºÆÖº¿Öº¸Öº±ÖºªÖº£ÖºœÖº•ÖºŽÖº‡Öº€ÖºyÖºrÖºkÖºdÖº]ÖºVÖºOÖºHÖºAÖº:Öº3Öº,Öº%ÖºÖºÖºÖº ÖºÖºûÕºôÕºíÕºæÕºßÕºØÕºÑÕºÊÕºÃÕº¼ÕºµÕº®Õº§Õº Õº™Õº’Õº‹Õº„Õº}ÕºvÕºoÕºhÕºaÕºZÕºSÕºLÕºEÕº>Õº7Õº0Õº)Õº"ÕºÕºÕº ÕºÕºÿÔºøÔºñÔºêÔºãÔºÜÔºÕÔºÎÔºÇÔºÀÔº¹Ôº²Ôº«Ôº¤ÔºÔº–ÔºÔºˆÔºÔºzÔºsÔºlÔºeÔº^ÔºWÔºPÔºIÔºBÔº;Ôº4Ôº-Ôº&ÔºÔºÔºÔº ÔºÔºüÓºõÓºîÓºçÓºàÓºÙÓºÒÓºËÓºÄÓº½Óº¶Óº¯Óº¨Óº¡ÓºšÓº“ÓºŒÓº…Óº~ÓºwÓºpÓºiÓºbÓº[ÓºTÓºMÓºFÓº?Óº8Óº1Óº*Óº#ÓºÓºÓºÓºÓºÓºùÒºòÒºëÒºäÒºÝÒºÖÒºÏÒºÈÒºÁÒººÒº³Òº¬Òº¥ÒºžÒº—ÒºÒº‰Òº‚Òº{ÒºtÒºmÒºfÒº_ÒºXÒºQÒºJÒºCÒº<Òº5Òº.Òº'Òº ÒºÒºÒº ÒºÒºýѺöѺïѺèѺáѺÚѺÓѺÌѺÅѺ¾Ñº·Ñº°Ñº©Ñº¢Ñº›Ñº”ѺѺ†ÑºѺxѺqѺjѺcѺ\ѺUѺNѺGѺ@Ѻ9Ѻ2Ѻ+Ѻ$ѺѺѺѺѺѺúкóкìкåкÞк×кÐкÉкÂк»Ðº´Ðº­Ðº¦ÐºŸÐº˜Ðº‘кŠÐºƒÐº|кuкnкgк`кYкRкKкDк=к6к/к(к!ккк ккþϺ÷ϺðϺéϺâϺÛϺÔϺÍϺÆÏº¿Ïº¸Ïº±ÏºªÏº£ÏºœÏº•ϺŽÏº‡Ïº€ÏºyϺrϺkϺdϺ]ϺVϺOϺHϺAϺ:Ϻ3Ϻ,Ϻ%ϺϺϺϺ ϺϺûκôκíκæÎºßκØÎºÑκÊκÃκ¼ÎºµÎº®Îº§Îº Îº™Îº’κ‹Îº„κ}κvκoκhκaκZκSκLκEκ>κ7κ0κ)κ"κκκ κκÿͺøÍºñͺêͺãͺÜͺÕͺÎͺÇͺÀͺ¹Íº²Íº«Íº¤Íºͺ–ͺͺˆÍºͺzͺsͺlͺeͺ^ͺWͺPͺIͺBͺ;ͺ4ͺ-ͺ&ͺͺͺͺ ͺͺü̺õ̺î̺ç̺à̺Ù̺Ò̺Ë̺Ä̺½Ìº¶Ìº¯Ìº¨Ìº¡ÌºšÌº“̺ŒÌº…̺~̺w̺p̺i̺b̺[̺T̺M̺F̺?̺8̺1̺*̺#̺̺̺̺̺̺ù˺ò˺ë˺ä˺Ý˺Ö˺Ï˺È˺Á˺ºËº³Ëº¬Ëº¥ËºžËº—˺˺‰Ëº‚˺{˺t˺m˺f˺_˺X˺Q˺J˺C˺<˺5˺.˺'˺ ˺˺˺ ˺˺ýʺöʺïʺèʺáʺÚʺÓʺÌʺÅʺ¾Êº·Êº°Êº©Êº¢Êº›Êº”ʺʺ†Êºʺxʺqʺjʺcʺ\ʺUʺNʺGʺ@ʺ9ʺ2ʺ+ʺ$ʺʺʺʺʺʺúɺóɺìɺåɺÞɺ×ɺÐɺÉɺÂɺ»Éº´Éº­Éº¦ÉºŸÉº˜Éº‘ɺŠÉºƒÉº|ɺuɺnɺgɺ`ɺYɺRɺKɺDɺ=ɺ6ɺ/ɺ(ɺ!ɺɺɺ ɺɺþȺ÷ȺðȺéȺâȺÛȺÔȺÍȺÆÈº¿Èº¸Èº±ÈºªÈº£ÈºœÈº•ȺŽÈº‡Èº€ÈºyȺrȺkȺdȺ]ȺVȺOȺHȺAȺ:Ⱥ3Ⱥ,Ⱥ%ȺȺȺȺ ȺȺûǺôǺíǺæÇºßǺØÇºÑǺÊǺÃǺ¼ÇºµÇº®Çº§Çº Çº™Çº’Ǻ‹Çº„Ǻ}ǺvǺoǺhǺaǺZǺSǺLǺEǺ>Ǻ7Ǻ0Ǻ)Ǻ"ǺǺǺ ǺǺÿƺøÆºñƺêÆºãÆºÜÆºÕÆºÎÆºÇƺÀƺ¹Æº²Æº«Æº¤Æºƺ–ƺƺˆÆºƺzƺsƺlƺeƺ^ƺWƺPƺIƺBƺ;ƺ4ƺ-ƺ&ƺƺƺƺ ƺƺüźõźîźçźàźÙźÒźËźÄź½Åº¶Åº¯Åº¨Åº¡ÅºšÅº“źŒÅº…ź~źwźpźiźbź[źTźMźFź?ź8ź1ź*ź#źźźźźźùĺòĺëĺäĺÝĺÖĺÏĺÈĺÁĺºÄº³Äº¬Äº¥ÄºžÄº—ĺĺ‰Äº‚ĺ{ĺtĺmĺfĺ_ĺXĺQĺJĺCĺ<ĺ5ĺ.ĺ'ĺ ĺĺĺ ĺĺýúöúïúèúáúÚúÓúÌúÅú¾Ãº·Ãº°Ãº©Ãº¢Ãº›Ãº”úú†Ãºúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúºóºìºåºÞº׺кɺº»Âº´Âº­Âº¦ÂºŸÂº˜Âº‘ºŠÂºƒÂº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþÁº÷ÁºðÁºéÁºâÁºÛÁºÔÁºÍÁºÆÁº¿Áº¸Áº±ÁºªÁº£ÁºœÁº•ÁºŽÁº‡Áº€ÁºyÁºrÁºkÁºdÁº]ÁºVÁºOÁºHÁºAÁº:Áº3Áº,Áº%ÁºÁºÁºÁº ÁºÁºûÀºôÀºíÀºæÀºßÀºØÀºÑÀºÊÀºÃÀº¼ÀºµÀº®Àº§Àº Àº™Àº’Àº‹Àº„Àº}ÀºvÀºoÀºhÀºaÀºZÀºSÀºLÀºEÀº>Àº7Àº0Àº)Àº"ÀºÀºÀº ÀºÀºÿ¿ºø¿ºñ¿º꿺㿺Ü¿ºÕ¿ºοºÇ¿ºÀ¿º¹¿º²¿º«¿º¤¿º¿º–¿º¿ºˆ¿º¿ºz¿ºs¿ºl¿ºe¿º^¿ºW¿ºP¿ºI¿ºB¿º;¿º4¿º-¿º&¿º¿º¿º¿º ¿º¿ºü¾ºõ¾º羺ྺÙ¾ºÒ¾º˾ºľº½¾º¶¾º¯¾º¨¾º¡¾ºš¾º“¾ºŒ¾º…¾º~¾ºw¾ºp¾ºi¾ºb¾º[¾ºT¾ºM¾ºF¾º?¾º8¾º1¾º*¾º#¾º¾º¾º¾º¾º¾ºù½ºò½º뽺佺ݽºÖ½ºϽºȽºÁ½ºº½º³½º¬½º¥½ºž½º—½º½º‰½º‚½º{½ºt½ºm½ºf½º_½ºX½ºQ½ºJ½ºC½º<½º5½º.½º'½º ½º½º½º ½º½ºý¼ºö¼ºZ輺ἺÚ¼ºÓ¼º̼ºżº¾¼º·¼º°¼º©¼º¢¼º›¼º”¼º¼º†¼º¼ºx¼ºq¼ºj¼ºc¼º\¼ºU¼ºN¼ºG¼º@¼º9¼º2¼º+¼º$¼º¼º¼º¼º¼º¼ºú»ºó»º컺建Þ»º×»ºлºÉ»º»º»»º´»º­»º¦»ºŸ»º˜»º‘»ºŠ»ºƒ»º|»ºu»ºn»ºg»º`»ºY»ºR»ºK»ºD»º=»º6»º/»º(»º!»º»º»º »º»ºþºº÷ººðºº麺⺺ÛººÔººͺºƺº¿ºº¸ºº±ººªºº£ººœºº•ººŽºº‡ºº€ººyººrººkººdºº]ººVººOººHººAºº:ºº3ºº,ºº%ºººººººº ººººû¹ºô¹ºí¹º湺ß¹ºعºѹºʹºùº¼¹ºµ¹º®¹º§¹º ¹º™¹º’¹º‹¹º„¹º}¹ºv¹ºo¹ºh¹ºa¹ºZ¹ºS¹ºL¹ºE¹º>¹º7¹º0¹º)¹º"¹º¹º¹º ¹º¹ºÿ¸ºø¸ºñ¸º긺㸺ܸºÕ¸ºθºǸºÀ¸º¹¸º²¸º«¸º¤¸º¸º–¸º¸ºˆ¸º¸ºz¸ºs¸ºl¸ºe¸º^¸ºW¸ºP¸ºI¸ºB¸º;¸º4¸º-¸º&¸º¸º¸º¸º ¸º¸ºü·ºõ·ºî·ºç·ºà·ºÙ·ºÒ·ºË·ºÄ·º½·º¶·º¯·º¨·º¡·ºš·º“·ºŒ·º…·º~·ºw·ºp·ºi·ºb·º[·ºT·ºM·ºF·º?·º8·º1·º*·º#·º·º·º·º·º·ºù¶ºò¶º붺䶺ݶºÖ¶º϶ºȶºÁ¶ºº¶º³¶º¬¶º¥¶ºž¶º—¶º¶º‰¶º‚¶º{¶ºt¶ºm¶ºf¶º_¶ºX¶ºQ¶ºJ¶ºC¶º<¶º5¶º.¶º'¶º ¶º¶º¶º ¶º¶ºýµºöµºﵺ赺ᵺÚµºÓµº̵ºŵº¾µº·µº°µº©µº¢µº›µº”µºµº†µºµºxµºqµºjµºcµº\µºUµºNµºGµº@µº9µº2µº+µº$µºµºµºµºµºµºú´ºó´ºì´ºå´ºÞ´º×´ºдºÉ´º´º»´º´´º­´º¦´ºŸ´º˜´º‘´ºŠ´ºƒ´º|´ºu´ºn´ºg´º`´ºY´ºR´ºK´ºD´º=´º6´º/´º(´º!´º´º´º ´º´ºþ³º÷³ºð³º鳺⳺Û³ºÔ³ºͳºƳº¿³º¸³º±³ºª³º£³ºœ³º•³º޳º‡³º€³ºy³ºr³ºk³ºd³º]³ºV³ºO³ºH³ºA³º:³º3³º,³º%³º³º³º³º ³º³ºû²ºô²ºí²º沺ß²ºزºѲºʲºòº¼²ºµ²º®²º§²º ²º™²º’²º‹²º„²º}²ºv²ºo²ºh²ºa²ºZ²ºS²ºL²ºE²º>²º7²º0²º)²º"²º²º²º ²º²ºÿ±ºø±ºñ±º걺㱺ܱºÕ±ºαºDZºÀ±º¹±º²±º«±º¤±º±º–±º±ºˆ±º±ºz±ºs±ºl±ºe±º^±ºW±ºP±ºI±ºB±º;±º4±º-±º&±º±º±º±º ±º±ºü°ºõ°ºî°ºç°ºà°ºÙ°ºÒ°º˰ºݺ½°º¶°º¯°º¨°º¡°ºš°º“°ºŒ°º…°º~°ºw°ºp°ºi°ºb°º[°ºT°ºM°ºF°º?°º8°º1°º*°º#°º°º°º°º°º°ºù¯ºò¯º믺䯺ݯºÖ¯ºϯºȯºÁ¯ºº¯º³¯º¬¯º¥¯ºž¯º—¯º¯º‰¯º‚¯º{¯ºt¯ºm¯ºf¯º_¯ºX¯ºQ¯ºJ¯ºC¯º<¯º5¯º.¯º'¯º ¯º¯º¯º ¯º¯ºý®ºö®º﮺论ᮺÚ®ºÓ®ºÌ®ºÅ®º¾®º·®º°®º©®º¢®º›®º”®º®º†®º®ºx®ºq®ºj®ºc®º\®ºU®ºN®ºG®º@®º9®º2®º+®º$®º®º®º®º®º®ºú­ºó­ºì­ºå­ºÞ­º×­ºЭºÉ­º­º»­º´­º­­º¦­ºŸ­º˜­º‘­ºŠ­ºƒ­º|­ºu­ºn­ºg­º`­ºY­ºR­ºK­ºD­º=­º6­º/­º(­º!­º­º­º ­º­ºþ¬º÷¬ºð¬º鬺⬺Û¬ºÔ¬ºͬºƬº¿¬º¸¬º±¬ºª¬º£¬ºœ¬º•¬ºެº‡¬º€¬ºy¬ºr¬ºk¬ºd¬º]¬ºV¬ºO¬ºH¬ºA¬º:¬º3¬º,¬º%¬º¬º¬º¬º ¬º¬ºû«ºô«ºí«º櫺ß«ºØ«ºÑ«ºÊ«ºëº¼«ºµ«º®«º§«º «º™«º’«º‹«º„«º}«ºv«ºo«ºh«ºa«ºZ«ºS«ºL«ºE«º>«º7«º0«º)«º"«º«º«º «º«ºÿªºøªºñªºꪺ㪺ܪºÕªºΪºǪºÀªº¹ªº²ªº«ªº¤ªºªº–ªºªºˆªºªºzªºsªºlªºeªº^ªºWªºPªºIªºBªº;ªº4ªº-ªº&ªºªºªºªº ªºªºü©ºõ©º空੺Ù©ºÒ©ºË©ºÄ©º½©º¶©º¯©º¨©º¡©ºš©º“©ºŒ©º…©º~©ºw©ºp©ºi©ºb©º[©ºT©ºM©ºF©º?©º8©º1©º*©º#©º©º©º©º©º©ºù¨ºò¨º먺䨺ݨºÖ¨ºϨºȨºÁ¨ºº¨º³¨º¬¨º¥¨ºž¨º—¨º¨º‰¨º‚¨º{¨ºt¨ºm¨ºf¨º_¨ºX¨ºQ¨ºJ¨ºC¨º<¨º5¨º.¨º'¨º ¨º¨º¨º ¨º¨ºý§ºö§º狀觺᧺Ú§ºÓ§º̧ºŧº¾§º·§º°§º©§º¢§º›§º”§º§º†§º§ºx§ºq§ºj§ºc§º\§ºU§ºN§ºG§º@§º9§º2§º+§º$§º§º§º§º§º§ºú¦ºó¦º즺妺Þ¦ºצºЦºɦº¦º»¦º´¦º­¦º¦¦ºŸ¦º˜¦º‘¦ºЦºƒ¦º|¦ºu¦ºn¦ºg¦º`¦ºY¦ºR¦ºK¦ºD¦º=¦º6¦º/¦º(¦º!¦º¦º¦º ¦º¦ºþ¥º÷¥ºð¥º饺⥺Û¥ºÔ¥ºÍ¥ºÆ¥º¿¥º¸¥º±¥ºª¥º£¥ºœ¥º•¥ºŽ¥º‡¥º€¥ºy¥ºr¥ºk¥ºd¥º]¥ºV¥ºO¥ºH¥ºA¥º:¥º3¥º,¥º%¥º¥º¥º¥º ¥º¥ºû¤ºô¤ºí¤º椺ߤºؤºѤºʤºäº¼¤ºµ¤º®¤º§¤º ¤º™¤º’¤º‹¤º„¤º}¤ºv¤ºo¤ºh¤ºa¤ºZ¤ºS¤ºL¤ºE¤º>¤º7¤º0¤º)¤º"¤º¤º¤º ¤º¤ºÿ£ºø£ºñ£º꣺㣺Ü£ºÕ£ºΣºÇ£ºÀ£º¹£º²£º«£º¤£º£º–£º£ºˆ£º£ºz£ºs£ºl£ºe£º^£ºW£ºP£ºI£ºB£º;£º4£º-£º&£º£º£º£º £º£ºü¢ºõ¢º確ࢺÙ¢ºÒ¢ºË¢ºÄ¢º½¢º¶¢º¯¢º¨¢º¡¢ºš¢º“¢ºŒ¢º…¢º~¢ºw¢ºp¢ºi¢ºb¢º[¢ºT¢ºM¢ºF¢º?¢º8¢º1¢º*¢º#¢º¢º¢º¢º¢º¢ºù¡ºò¡º롺䡺Ý¡ºÖ¡ºÏ¡ºÈ¡ºÁ¡ºº¡º³¡º¬¡º¥¡ºž¡º—¡º¡º‰¡º‚¡º{¡ºt¡ºm¡ºf¡º_¡ºX¡ºQ¡ºJ¡ºC¡º<¡º5¡º.¡º'¡º ¡º¡º¡º ¡º¡ºý ºö ºï ºè ºá ºÚ ºÓ ºÌ ºÅ º¾ º· º° º© º¢ º› º” º º† º ºx ºq ºj ºc º\ ºU ºN ºG º@ º9 º2 º+ º$ º º º º º ºúŸºóŸº쟺基ÞŸºןºПºÉŸºŸº»Ÿº´Ÿº­Ÿº¦ŸºŸŸº˜Ÿº‘ŸºŠŸºƒŸº|ŸºuŸºnŸºgŸº`ŸºYŸºRŸºKŸºDŸº=Ÿº6Ÿº/Ÿº(Ÿº!ŸºŸºŸº ŸºŸºþžº÷žºðžº鞺➺ÛžºÔžºÍžºÆžº¿žº¸žº±žºªžº£žºœžº•žºŽžº‡žº€žºyžºržºkžºdžº]žºVžºOžºHžºAžº:žº3žº,žº%žºžºžºžº žºžºûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿœºøœºñœºꜺ㜺ÜœºÕœºΜºÇœºÀœº¹œº²œº«œº¤œºœº–œºœºˆœºœºzœºsœºlœºeœº^œºWœºPœºIœºBœº;œº4œº-œº&œºœºœºœº œºœºü›ºõ›º盺à›ºÙ›ºÒ›ºË›ºÄ›º½›º¶›º¯›º¨›º¡›ºš›º“›ºŒ›º…›º~›ºw›ºp›ºi›ºb›º[›ºT›ºM›ºF›º?›º8›º1›º*›º#›º›º›º›º›º›ºùšºòšº뚺䚺ÝšºÖšºÏšºÈšºÁšººšº³šº¬šº¥šºžšº—šºšº‰šº‚šº{šºtšºmšºfšº_šºXšºQšºJšºCšº<šº5šº.šº'šº šºšºšº šºšºý™ºö™º虺ᙺÚ™ºÓ™ºÌ™ºÅ™º¾™º·™º°™º©™º¢™º›™º”™º™º†™º™ºx™ºq™ºj™ºc™º\™ºU™ºN™ºG™º@™º9™º2™º+™º$™º™º™º™º™º™ºú˜ºó˜º옺嘺Þ˜ºטºИºɘº˜º»˜º´˜º­˜º¦˜ºŸ˜º˜˜º‘˜ºŠ˜ºƒ˜º|˜ºu˜ºn˜ºg˜º`˜ºY˜ºR˜ºK˜ºD˜º=˜º6˜º/˜º(˜º!˜º˜º˜º ˜º˜ºþ—º÷—ºð—ºé—ºâ—ºÛ—ºÔ—ºÍ—ºÆ—º¿—º¸—º±—ºª—º£—ºœ—º•—ºŽ—º‡—º€—ºy—ºr—ºk—ºd—º]—ºV—ºO—ºH—ºA—º:—º3—º,—º%—º—º—º—º —º—ºû–ºô–ºí–ºæ–ºß–ºØ–ºÑ–ºÊ–ºÖº¼–ºµ–º®–º§–º –º™–º’–º‹–º„–º}–ºv–ºo–ºh–ºa–ºZ–ºS–ºL–ºE–º>–º7–º0–º)–º"–º–º–º –º–ºÿ•ºø•ºñ•ºꕺ㕺Ü•ºÕ•ºΕºÇ•ºÀ•º¹•º²•º«•º¤•º•º–•º•ºˆ•º•ºz•ºs•ºl•ºe•º^•ºW•ºP•ºI•ºB•º;•º4•º-•º&•º•º•º•º •º•ºü”ºõ”º町à”ºÙ”ºÒ”ºË”ºÄ”º½”º¶”º¯”º¨”º¡”ºš”º“”ºŒ”º…”º~”ºw”ºp”ºi”ºb”º[”ºT”ºM”ºF”º?”º8”º1”º*”º#”º”º”º”º”º”ºù“ºò“º듺䓺Ý“ºÖ“ºÏ“ºÈ“ºÁ“ºº“º³“º¬“º¥“ºž“º—“º“º‰“º‚“º{“ºt“ºm“ºf“º_“ºX“ºQ“ºJ“ºC“º<“º5“º.“º'“º “º“º“º “º“ºý’ºö’ºï’ºè’ºá’ºÚ’ºÓ’ºÌ’ºÅ’º¾’º·’º°’º©’º¢’º›’º”’º’º†’º’ºx’ºq’ºj’ºc’º\’ºU’ºN’ºG’º@’º9’º2’º+’º$’º’º’º’º’º’ºú‘ºó‘º쑺呺Þ‘ºבºБºÉ‘º‘º»‘º´‘º­‘º¦‘ºŸ‘º˜‘º‘‘ºŠ‘ºƒ‘º|‘ºu‘ºn‘ºg‘º`‘ºY‘ºR‘ºK‘ºD‘º=‘º6‘º/‘º(‘º!‘º‘º‘º ‘º‘ºþº÷ºðºéºâºÛºÔºͺƺ¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿŽºøŽºñŽºꎺ㎺ÜŽºÕŽºÎŽºÇŽºÀŽº¹Žº²Žº«Žº¤ŽºŽº–ŽºŽºˆŽºŽºzŽºsŽºlŽºeŽº^ŽºWŽºPŽºIŽºBŽº;Žº4Žº-Žº&ŽºŽºŽºŽº ŽºŽºüºõºîºçºàºÙºÒº˺ĺ½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùŒºòŒº댺䌺ÝŒºÖŒºÏŒºÈŒºÁŒººŒº³Œº¬Œº¥ŒºžŒº—ŒºŒº‰Œº‚Œº{ŒºtŒºmŒºfŒº_ŒºXŒºQŒºJŒºCŒº<Œº5Œº.Œº'Œº ŒºŒºŒº ŒºŒºý‹ºö‹º苺ዺÚ‹ºÓ‹ºÌ‹ºÅ‹º¾‹º·‹º°‹º©‹º¢‹º›‹º”‹º‹º†‹º‹ºx‹ºq‹ºj‹ºc‹º\‹ºU‹ºN‹ºG‹º@‹º9‹º2‹º+‹º$‹º‹º‹º‹º‹º‹ºúŠºóŠº슺劺ÞŠº׊ºЊºÉŠºŠº»Šº´Šº­Šº¦ŠºŸŠº˜Šº‘ŠºŠŠºƒŠº|ŠºuŠºnŠºgŠº`ŠºYŠºRŠºKŠºDŠº=Šº6Šº/Šº(Šº!ŠºŠºŠº ŠºŠºþ‰º÷‰ºð‰º鉺≺Û‰ºÔ‰º͉ºƉº¿‰º¸‰º±‰ºª‰º£‰ºœ‰º•‰ºމº‡‰º€‰ºy‰ºr‰ºk‰ºd‰º]‰ºV‰ºO‰ºH‰ºA‰º:‰º3‰º,‰º%‰º‰º‰º‰º ‰º‰ºûˆºôˆº툺戺߈º؈ºшºʈºȺ¼ˆºµˆº®ˆº§ˆº ˆº™ˆº’ˆº‹ˆº„ˆº}ˆºvˆºoˆºhˆºaˆºZˆºSˆºLˆºEˆº>ˆº7ˆº0ˆº)ˆº"ˆºˆºˆº ˆºˆºÿ‡ºø‡ºñ‡ºꇺㇺ܇ºÕ‡º·ºLJºÀ‡º¹‡º²‡º«‡º¤‡º‡º–‡º‡ºˆ‡º‡ºz‡ºs‡ºl‡ºe‡º^‡ºW‡ºP‡ºI‡ºB‡º;‡º4‡º-‡º&‡º‡º‡º‡º ‡º‡ºü†ºõ†º熺à†ºÙ†ºÒ†ºˆºĆº½†º¶†º¯†º¨†º¡†ºš†º“†ºŒ†º…†º~†ºw†ºp†ºi†ºb†º[†ºT†ºM†ºF†º?†º8†º1†º*†º#†º†º†º†º†º†ºù…ºò…ºë…ºä…ºÝ…ºÖ…ºÏ…ºÈ…ºÁ…ºº…º³…º¬…º¥…ºž…º—…º…º‰…º‚…º{…ºt…ºm…ºf…º_…ºX…ºQ…ºJ…ºC…º<…º5…º.…º'…º …º…º…º …º…ºý„ºö„º脺ᄺÚ„ºÓ„ºÌ„ºÅ„º¾„º·„º°„º©„º¢„º›„º”„º„º†„º„ºx„ºq„ºj„ºc„º\„ºU„ºN„ºG„º@„º9„º2„º+„º$„º„º„º„º„º„ºúƒºóƒº샺僺Þƒº׃ºЃºɃºƒº»ƒº´ƒº­ƒº¦ƒºŸƒº˜ƒº‘ƒºŠƒºƒƒº|ƒºuƒºnƒºgƒº`ƒºYƒºRƒºKƒºDƒº=ƒº6ƒº/ƒº(ƒº!ƒºƒºƒº ƒºƒºþ‚º÷‚ºð‚º邺₺Û‚ºÔ‚ºÍ‚ºÆ‚º¿‚º¸‚º±‚ºª‚º£‚ºœ‚º•‚ºŽ‚º‡‚º€‚ºy‚ºr‚ºk‚ºd‚º]‚ºV‚ºO‚ºH‚ºA‚º:‚º3‚º,‚º%‚º‚º‚º‚º ‚º‚ºûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿ€ºø€ºñ€ºꀺ〺Ü€ºÕ€º΀ºÇ€ºÀ€º¹€º²€º«€º¤€º€º–€º€ºˆ€º€ºz€ºs€ºl€ºe€º^€ºW€ºP€ºI€ºB€º;€º4€º-€º&€º€º€º€º €º€ºüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººù~ºò~ºë~ºä~ºÝ~ºÖ~ºÏ~ºÈ~ºÁ~ºº~º³~º¬~º¥~ºž~º—~º~º‰~º‚~º{~ºt~ºm~ºf~º_~ºX~ºQ~ºJ~ºC~º<~º5~º.~º'~º ~º~º~º ~º~ºý}ºö}ºï}ºè}ºá}ºÚ}ºÓ}ºÌ}ºÅ}º¾}º·}º°}º©}º¢}º›}º”}º}º†}º}ºx}ºq}ºj}ºc}º\}ºU}ºN}ºG}º@}º9}º2}º+}º$}º}º}º}º}º}ºú|ºó|ºì|ºå|ºÞ|º×|ºÐ|ºÉ|ºÂ|º»|º´|º­|º¦|ºŸ|º˜|º‘|ºŠ|ºƒ|º||ºu|ºn|ºg|º`|ºY|ºR|ºK|ºD|º=|º6|º/|º(|º!|º|º|º |º|ºþ{º÷{ºð{ºé{ºâ{ºÛ{ºÔ{ºÍ{ºÆ{º¿{º¸{º±{ºª{º£{ºœ{º•{ºŽ{º‡{º€{ºy{ºr{ºk{ºd{º]{ºV{ºO{ºH{ºA{º:{º3{º,{º%{º{º{º{º {º{ºûzºôzºízºæzºßzºØzºÑzºÊzºÃzº¼zºµzº®zº§zº zº™zº’zº‹zº„zº}zºvzºozºhzºazºZzºSzºLzºEzº>zº7zº0zº)zº"zºzºzº zºzºÿyºøyºñyºêyºãyºÜyºÕyºÎyºÇyºÀyº¹yº²yº«yº¤yºyº–yºyºˆyºyºzyºsyºlyºeyº^yºWyºPyºIyºByº;yº4yº-yº&yºyºyºyº yºyºüxºõxºîxºçxºàxºÙxºÒxºËxºÄxº½xº¶xº¯xº¨xº¡xºšxº“xºŒxº…xº~xºwxºpxºixºbxº[xºTxºMxºFxº?xº8xº1xº*xº#xºxºxºxºxºxºùwºòwºëwºäwºÝwºÖwºÏwºÈwºÁwººwº³wº¬wº¥wºžwº—wºwº‰wº‚wº{wºtwºmwºfwº_wºXwºQwºJwºCwºsº7sº0sº)sº"sºsºsº sºsºÿrºørºñrºêrºãrºÜrºÕrºÎrºÇrºÀrº¹rº²rº«rº¤rºrº–rºrºˆrºrºzrºsrºlrºerº^rºWrºPrºIrºBrº;rº4rº-rº&rºrºrºrº rºrºüqºõqºîqºçqºàqºÙqºÒqºËqºÄqº½qº¶qº¯qº¨qº¡qºšqº“qºŒqº…qº~qºwqºpqºiqºbqº[qºTqºMqºFqº?qº8qº1qº*qº#qºqºqºqºqºqºùpºòpºëpºäpºÝpºÖpºÏpºÈpºÁpººpº³pº¬pº¥pºžpº—pºpº‰pº‚pº{pºtpºmpºfpº_pºXpºQpºJpºCpºlº7lº0lº)lº"lºlºlº lºlºÿkºøkºñkºêkºãkºÜkºÕkºÎkºÇkºÀkº¹kº²kº«kº¤kºkº–kºkºˆkºkºzkºskºlkºekº^kºWkºPkºIkºBkº;kº4kº-kº&kºkºkºkº kºkºüjºõjºîjºçjºàjºÙjºÒjºËjºÄjº½jº¶jº¯jº¨jº¡jºšjº“jºŒjº…jº~jºwjºpjºijºbjº[jºTjºMjºFjº?jº8jº1jº*jº#jºjºjºjºjºjºùiºòiºëiºäiºÝiºÖiºÏiºÈiºÁiººiº³iº¬iº¥iºžiº—iºiº‰iº‚iº{iºtiºmiºfiº_iºXiºQiºJiºCiºeº7eº0eº)eº"eºeºeº eºeºÿdºødºñdºêdºãdºÜdºÕdºÎdºÇdºÀdº¹dº²dº«dº¤dºdº–dºdºˆdºdºzdºsdºldºedº^dºWdºPdºIdºBdº;dº4dº-dº&dºdºdºdº dºdºücºõcºîcºçcºàcºÙcºÒcºËcºÄcº½cº¶cº¯cº¨cº¡cºšcº“cºŒcº…cº~cºwcºpcºicºbcº[cºTcºMcºFcº?cº8cº1cº*cº#cºcºcºcºcºcºùbºòbºëbºäbºÝbºÖbºÏbºÈbºÁbººbº³bº¬bº¥bºžbº—bºbº‰bº‚bº{bºtbºmbºfbº_bºXbºQbºJbºCbº^º7^º0^º)^º"^º^º^º ^º^ºÿ]ºø]ºñ]ºê]ºã]ºÜ]ºÕ]ºÎ]ºÇ]ºÀ]º¹]º²]º«]º¤]º]º–]º]ºˆ]º]ºz]ºs]ºl]ºe]º^]ºW]ºP]ºI]ºB]º;]º4]º-]º&]º]º]º]º ]º]ºü\ºõ\ºî\ºç\ºà\ºÙ\ºÒ\ºË\ºÄ\º½\º¶\º¯\º¨\º¡\ºš\º“\ºŒ\º…\º~\ºw\ºp\ºi\ºb\º[\ºT\ºM\ºF\º?\º8\º1\º*\º#\º\º\º\º\º\ºù[ºò[ºë[ºä[ºÝ[ºÖ[ºÏ[ºÈ[ºÁ[ºº[º³[º¬[º¥[ºž[º—[º[º‰[º‚[º{[ºt[ºm[ºf[º_[ºX[ºQ[ºJ[ºC[º<[º5[º.[º'[º [º[º[º [º[ºýZºöZºïZºèZºáZºÚZºÓZºÌZºÅZº¾Zº·Zº°Zº©Zº¢Zº›Zº”ZºZº†ZºZºxZºqZºjZºcZº\ZºUZºNZºGZº@Zº9Zº2Zº+Zº$ZºZºZºZºZºZºúYºóYºìYºåYºÞYº×YºÐYºÉYºÂYº»Yº´Yº­Yº¦YºŸYº˜Yº‘YºŠYºƒYº|YºuYºnYºgYº`YºYYºRYºKYºDYº=Yº6Yº/Yº(Yº!YºYºYº YºYºþXº÷XºðXºéXºâXºÛXºÔXºÍXºÆXº¿Xº¸Xº±XºªXº£XºœXº•XºŽXº‡Xº€XºyXºrXºkXºdXº]XºVXºOXºHXºAXº:Xº3Xº,Xº%XºXºXºXº XºXºûWºôWºíWºæWºßWºØWºÑWºÊWºÃWº¼WºµWº®Wº§Wº Wº™Wº’Wº‹Wº„Wº}WºvWºoWºhWºaWºZWºSWºLWºEWº>Wº7Wº0Wº)Wº"WºWºWº WºWºÿVºøVºñVºêVºãVºÜVºÕVºÎVºÇVºÀVº¹Vº²Vº«Vº¤VºVº–VºVºˆVºVºzVºsVºlVºeVº^VºWVºPVºIVºBVº;Vº4Vº-Vº&VºVºVºVº VºVºüUºõUºîUºçUºàUºÙUºÒUºËUºÄUº½Uº¶Uº¯Uº¨Uº¡UºšUº“UºŒUº…Uº~UºwUºpUºiUºbUº[UºTUºMUºFUº?Uº8Uº1Uº*Uº#UºUºUºUºUºUºùTºòTºëTºäTºÝTºÖTºÏTºÈTºÁTººTº³Tº¬Tº¥TºžTº—TºTº‰Tº‚Tº{TºtTºmTºfTº_TºXTºQTºJTºCTºPº7Pº0Pº)Pº"PºPºPº PºPºÿOºøOºñOºêOºãOºÜOºÕOºÎOºÇOºÀOº¹Oº²Oº«Oº¤OºOº–OºOºˆOºOºzOºsOºlOºeOº^OºWOºPOºIOºBOº;Oº4Oº-Oº&OºOºOºOº OºOºüNºõNºîNºçNºàNºÙNºÒNºËNºÄNº½Nº¶Nº¯Nº¨Nº¡NºšNº“NºŒNº…Nº~NºwNºpNºiNºbNº[NºTNºMNºFNº?Nº8Nº1Nº*Nº#NºNºNºNºNºNºùMºòMºëMºäMºÝMºÖMºÏMºÈMºÁMººMº³Mº¬Mº¥MºžMº—MºMº‰Mº‚Mº{MºtMºmMºfMº_MºXMºQMºJMºCMºIº7Iº0Iº)Iº"IºIºIº IºIºÿHºøHºñHºêHºãHºÜHºÕHºÎHºÇHºÀHº¹Hº²Hº«Hº¤HºHº–HºHºˆHºHºzHºsHºlHºeHº^HºWHºPHºIHºBHº;Hº4Hº-Hº&HºHºHºHº HºHºüGºõGºîGºçGºàGºÙGºÒGºËGºÄGº½Gº¶Gº¯Gº¨Gº¡GºšGº“GºŒGº…Gº~GºwGºpGºiGºbGº[GºTGºMGºFGº?Gº8Gº1Gº*Gº#GºGºGºGºGºGºùFºòFºëFºäFºÝFºÖFºÏFºÈFºÁFººFº³Fº¬Fº¥FºžFº—FºFº‰Fº‚Fº{FºtFºmFºfFº_FºXFºQFºJFºCFºBº7Bº0Bº)Bº"BºBºBº BºBºÿAºøAºñAºêAºãAºÜAºÕAºÎAºÇAºÀAº¹Aº²Aº«Aº¤AºAº–AºAºˆAºAºzAºsAºlAºeAº^AºWAºPAºIAºBAº;Aº4Aº-Aº&AºAºAºAº AºAºü@ºõ@ºî@ºç@ºà@ºÙ@ºÒ@ºË@ºÄ@º½@º¶@º¯@º¨@º¡@ºš@º“@ºŒ@º…@º~@ºw@ºp@ºi@ºb@º[@ºT@ºM@ºF@º?@º8@º1@º*@º#@º@º@º@º@º@ºù?ºò?ºë?ºä?ºÝ?ºÖ?ºÏ?ºÈ?ºÁ?ºº?º³?º¬?º¥?ºž?º—?º?º‰?º‚?º{?ºt?ºm?ºf?º_?ºX?ºQ?ºJ?ºC?ººö>ºï>ºè>ºá>ºÚ>ºÓ>ºÌ>ºÅ>º¾>º·>º°>º©>º¢>º›>º”>º>º†>º>ºx>ºq>ºj>ºc>º\>ºU>ºN>ºG>º@>º9>º2>º+>º$>º>º>º>º>º>ºú=ºó=ºì=ºå=ºÞ=º×=ºÐ=ºÉ=ºÂ=º»=º´=º­=º¦=ºŸ=º˜=º‘=ºŠ=ºƒ=º|=ºu=ºn=ºg=º`=ºY=ºR=ºK=ºD=º==º6=º/=º(=º!=º=º=º =º=ºþ<º÷<ºð<ºé<ºâ<ºÛ<ºÔ<ºÍ<ºÆ<º¿<º¸<º±<ºª<º£<ºœ<º•<ºŽ<º‡<º€<ºy<ºr<ºk<ºd<º]<ºV<ºO<ºH<ºA<º:<º3<º,<º%<º<º<º<º <º<ºû;ºô;ºí;ºæ;ºß;ºØ;ºÑ;ºÊ;ºÃ;º¼;ºµ;º®;º§;º ;º™;º’;º‹;º„;º};ºv;ºo;ºh;ºa;ºZ;ºS;ºL;ºE;º>;º7;º0;º);º";º;º;º ;º;ºÿ:ºø:ºñ:ºê:ºã:ºÜ:ºÕ:ºÎ:ºÇ:ºÀ:º¹:º²:º«:º¤:º:º–:º:ºˆ:º:ºz:ºs:ºl:ºe:º^:ºW:ºP:ºI:ºB:º;:º4:º-:º&:º:º:º:º :º:ºü9ºõ9ºî9ºç9ºà9ºÙ9ºÒ9ºË9ºÄ9º½9º¶9º¯9º¨9º¡9ºš9º“9ºŒ9º…9º~9ºw9ºp9ºi9ºb9º[9ºT9ºM9ºF9º?9º89º19º*9º#9º9º9º9º9º9ºù8ºò8ºë8ºä8ºÝ8ºÖ8ºÏ8ºÈ8ºÁ8ºº8º³8º¬8º¥8ºž8º—8º8º‰8º‚8º{8ºt8ºm8ºf8º_8ºX8ºQ8ºJ8ºC8º<8º58º.8º'8º 8º8º8º 8º8ºý7ºö7ºï7ºè7ºá7ºÚ7ºÓ7ºÌ7ºÅ7º¾7º·7º°7º©7º¢7º›7º”7º7º†7º7ºx7ºq7ºj7ºc7º\7ºU7ºN7ºG7º@7º97º27º+7º$7º7º7º7º7º7ºú6ºó6ºì6ºå6ºÞ6º×6ºÐ6ºÉ6ºÂ6º»6º´6º­6º¦6ºŸ6º˜6º‘6ºŠ6ºƒ6º|6ºu6ºn6ºg6º`6ºY6ºR6ºK6ºD6º=6º66º/6º(6º!6º6º6º 6º6ºþ5º÷5ºð5ºé5ºâ5ºÛ5ºÔ5ºÍ5ºÆ5º¿5º¸5º±5ºª5º£5ºœ5º•5ºŽ5º‡5º€5ºy5ºr5ºk5ºd5º]5ºV5ºO5ºH5ºA5º:5º35º,5º%5º5º5º5º 5º5ºû4ºô4ºí4ºæ4ºß4ºØ4ºÑ4ºÊ4ºÃ4º¼4ºµ4º®4º§4º 4º™4º’4º‹4º„4º}4ºv4ºo4ºh4ºa4ºZ4ºS4ºL4ºE4º>4º74º04º)4º"4º4º4º 4º4ºÿ3ºø3ºñ3ºê3ºã3ºÜ3ºÕ3ºÎ3ºÇ3ºÀ3º¹3º²3º«3º¤3º3º–3º3ºˆ3º3ºz3ºs3ºl3ºe3º^3ºW3ºP3ºI3ºB3º;3º43º-3º&3º3º3º3º 3º3ºü2ºõ2ºî2ºç2ºà2ºÙ2ºÒ2ºË2ºÄ2º½2º¶2º¯2º¨2º¡2ºš2º“2ºŒ2º…2º~2ºw2ºp2ºi2ºb2º[2ºT2ºM2ºF2º?2º82º12º*2º#2º2º2º2º2º2ºù1ºò1ºë1ºä1ºÝ1ºÖ1ºÏ1ºÈ1ºÁ1ºº1º³1º¬1º¥1ºž1º—1º1º‰1º‚1º{1ºt1ºm1ºf1º_1ºX1ºQ1ºJ1ºC1º<1º51º.1º'1º 1º1º1º 1º1ºý0ºö0ºï0ºè0ºá0ºÚ0ºÓ0ºÌ0ºÅ0º¾0º·0º°0º©0º¢0º›0º”0º0º†0º0ºx0ºq0ºj0ºc0º\0ºU0ºN0ºG0º@0º90º20º+0º$0º0º0º0º0º0ºú/ºó/ºì/ºå/ºÞ/º×/ºÐ/ºÉ/ºÂ/º»/º´/º­/º¦/ºŸ/º˜/º‘/ºŠ/ºƒ/º|/ºu/ºn/ºg/º`/ºY/ºR/ºK/ºD/º=/º6/º//º(/º!/º/º/º /º/ºþ.º÷.ºð.ºé.ºâ.ºÛ.ºÔ.ºÍ.ºÆ.º¿.º¸.º±.ºª.º£.ºœ.º•.ºŽ.º‡.º€.ºy.ºr.ºk.ºd.º].ºV.ºO.ºH.ºA.º:.º3.º,.º%.º.º.º.º .º.ºû-ºô-ºí-ºæ-ºß-ºØ-ºÑ-ºÊ-ºÃ-º¼-ºµ-º®-º§-º -º™-º’-º‹-º„-º}-ºv-ºo-ºh-ºa-ºZ-ºS-ºL-ºE-º>-º7-º0-º)-º"-º-º-º -º-ºÿ,ºø,ºñ,ºê,ºã,ºÜ,ºÕ,ºÎ,ºÇ,ºÀ,º¹,º²,º«,º¤,º,º–,º,ºˆ,º,ºz,ºs,ºl,ºe,º^,ºW,ºP,ºI,ºB,º;,º4,º-,º&,º,º,º,º ,º,ºü+ºõ+ºî+ºç+ºà+ºÙ+ºÒ+ºË+ºÄ+º½+º¶+º¯+º¨+º¡+ºš+º“+ºŒ+º…+º~+ºw+ºp+ºi+ºb+º[+ºT+ºM+ºF+º?+º8+º1+º*+º#+º+º+º+º+º+ºù*ºò*ºë*ºä*ºÝ*ºÖ*ºÏ*ºÈ*ºÁ*ºº*º³*º¬*º¥*ºž*º—*º*º‰*º‚*º{*ºt*ºm*ºf*º_*ºX*ºQ*ºJ*ºC*º<*º5*º.*º'*º *º*º*º *º*ºý)ºö)ºï)ºè)ºá)ºÚ)ºÓ)ºÌ)ºÅ)º¾)º·)º°)º©)º¢)º›)º”)º)º†)º)ºx)ºq)ºj)ºc)º\)ºU)ºN)ºG)º@)º9)º2)º+)º$)º)º)º)º)º)ºú(ºó(ºì(ºå(ºÞ(º×(ºÐ(ºÉ(ºÂ(º»(º´(º­(º¦(ºŸ(º˜(º‘(ºŠ(ºƒ(º|(ºu(ºn(ºg(º`(ºY(ºR(ºK(ºD(º=(º6(º/(º((º!(º(º(º (º(ºþ'º÷'ºð'ºé'ºâ'ºÛ'ºÔ'ºÍ'ºÆ'º¿'º¸'º±'ºª'º£'ºœ'º•'ºŽ'º‡'º€'ºy'ºr'ºk'ºd'º]'ºV'ºO'ºH'ºA'º:'º3'º,'º%'º'º'º'º 'º'ºû&ºô&ºí&ºæ&ºß&ºØ&ºÑ&ºÊ&ºÃ&º¼&ºµ&º®&º§&º &º™&º’&º‹&º„&º}&ºv&ºo&ºh&ºa&ºZ&ºS&ºL&ºE&º>&º7&º0&º)&º"&º&º&º &º&ºÿ%ºø%ºñ%ºê%ºã%ºÜ%ºÕ%ºÎ%ºÇ%ºÀ%º¹%º²%º«%º¤%º%º–%º%ºˆ%º%ºz%ºs%ºl%ºe%º^%ºW%ºP%ºI%ºB%º;%º4%º-%º&%º%º%º%º %º%ºü$ºõ$ºî$ºç$ºà$ºÙ$ºÒ$ºË$ºÄ$º½$º¶$º¯$º¨$º¡$ºš$º“$ºŒ$º…$º~$ºw$ºp$ºi$ºb$º[$ºT$ºM$ºF$º?$º8$º1$º*$º#$º$º$º$º$º$ºù#ºò#ºë#ºä#ºÝ#ºÖ#ºÏ#ºÈ#ºÁ#ºº#º³#º¬#º¥#ºž#º—#º#º‰#º‚#º{#ºt#ºm#ºf#º_#ºX#ºQ#ºJ#ºC#º<#º5#º.#º'#º #º#º#º #º#ºý"ºö"ºï"ºè"ºá"ºÚ"ºÓ"ºÌ"ºÅ"º¾"º·"º°"º©"º¢"º›"º”"º"º†"º"ºx"ºq"ºj"ºc"º\"ºU"ºN"ºG"º@"º9"º2"º+"º$"º"º"º"º"º"ºú!ºó!ºì!ºå!ºÞ!º×!ºÐ!ºÉ!ºÂ!º»!º´!º­!º¦!ºŸ!º˜!º‘!ºŠ!ºƒ!º|!ºu!ºn!ºg!º`!ºY!ºR!ºK!ºD!º=!º6!º/!º(!º!!º!º!º !º!ºþ º÷ ºð ºé ºâ ºÛ ºÔ ºÍ ºÆ º¿ º¸ º± ºª º£ ºœ º• ºŽ º‡ º€ ºy ºr ºk ºd º] ºV ºO ºH ºA º: º3 º, º% º º º º º ºûºôºíºæºßºØºÑºÊºÃº¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿºøºñºêºãºÜºÕºÎºÇºÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùºòºëºäºÝºÖºÏºÈºÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººýºöºïºèºáºÚºÓºÌºÅº¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººúºóºìºåºÞº×ºÐºÉºÂº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþº÷ºðºéºâºÛºÔºÍºÆº¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººûºôºíºæºßºØºÑºÊºÃº¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿºøºñºêºãºÜºÕºÎºÇºÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùºòºëºäºÝºÖºÏºÈºÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººýºöºïºèºáºÚºÓºÌºÅº¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººúºóºìºåºÞº×ºÐºÉºÂº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþº÷ºðºéºâºÛºÔºÍºÆº¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººûºôºíºæºßºØºÑºÊºÃº¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿºøºñºêºãºÜºÕºÎºÇºÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùºòºëºäºÝºÖºÏºÈºÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý ºö ºï ºè ºá ºÚ ºÓ ºÌ ºÅ º¾ º· º° º© º¢ º› º” º º† º ºx ºq ºj ºc º\ ºU ºN ºG º@ º9 º2 º+ º$ º º º º º ºú ºó ºì ºå ºÞ º× ºÐ ºÉ º º» º´ º­ º¦ ºŸ º˜ º‘ ºŠ ºƒ º| ºu ºn ºg º` ºY ºR ºK ºD º= º6 º/ º( º! º º º º ºþ º÷ ºð ºé ºâ ºÛ ºÔ ºÍ ºÆ º¿ º¸ º± ºª º£ ºœ º• ºŽ º‡ º€ ºy ºr ºk ºd º] ºV ºO ºH ºA º: º3 º, º% º º º º º ºû ºô ºí ºæ ºß ºØ ºÑ ºÊ ºà º¼ ºµ º® º§ º  º™ º’ º‹ º„ º} ºv ºo ºh ºa ºZ ºS ºL ºE º> º7 º0 º) º" º º º º ºÿ ºø ºñ ºê ºã ºÜ ºÕ ºÎ ºÇ ºÀ º¹ º² º« º¤ º º– º ºˆ º ºz ºs ºl ºe º^ ºW ºP ºI ºB º; º4 º- º& º º º º º ºüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùºòºëºäºÝºÖºÏºÈºÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººýºöºïºèºáºÚºÓºÌºÅº¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººúºóºìºåºÞº×ºÐºÉºÂº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþº÷ºðºéºâºÛºÔºÍºÆº¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººûºôºíºæºßºØºÑºÊºÃº¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿºøºñºêºãºÜºÕºÎºÇºÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººüºõºîºçºàºÙºÒºËºÄº½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººýÿ¹öÿ¹ïÿ¹èÿ¹áÿ¹Úÿ¹Óÿ¹Ìÿ¹Åÿ¹¾ÿ¹·ÿ¹°ÿ¹©ÿ¹¢ÿ¹›ÿ¹”ÿ¹ÿ¹†ÿ¹ÿ¹xÿ¹qÿ¹jÿ¹cÿ¹\ÿ¹Uÿ¹Nÿ¹Gÿ¹@ÿ¹9ÿ¹2ÿ¹+ÿ¹$ÿ¹ÿ¹ÿ¹ÿ¹ÿ¹ÿ¹úþ¹óþ¹ìþ¹åþ¹Þþ¹×þ¹Ðþ¹Éþ¹Âþ¹»þ¹´þ¹­þ¹¦þ¹Ÿþ¹˜þ¹‘þ¹Šþ¹ƒþ¹|þ¹uþ¹nþ¹gþ¹`þ¹Yþ¹Rþ¹Kþ¹Dþ¹=þ¹6þ¹/þ¹(þ¹!þ¹þ¹þ¹ þ¹þ¹þý¹÷ý¹ðý¹éý¹âý¹Ûý¹Ôý¹Íý¹Æý¹¿ý¹¸ý¹±ý¹ªý¹£ý¹œý¹•ý¹Žý¹‡ý¹€ý¹yý¹rý¹ký¹dý¹]ý¹Vý¹Oý¹Hý¹Aý¹:ý¹3ý¹,ý¹%ý¹ý¹ý¹ý¹ ý¹ý¹ûü¹ôü¹íü¹æü¹ßü¹Øü¹Ñü¹Êü¹Ãü¹¼ü¹µü¹®ü¹§ü¹ ü¹™ü¹’ü¹‹ü¹„ü¹}ü¹vü¹oü¹hü¹aü¹Zü¹Sü¹Lü¹Eü¹>ü¹7ü¹0ü¹)ü¹"ü¹ü¹ü¹ ü¹ü¹ÿû¹øû¹ñû¹êû¹ãû¹Üû¹Õû¹Îû¹Çû¹Àû¹¹û¹²û¹«û¹¤û¹û¹–û¹û¹ˆû¹û¹zû¹sû¹lû¹eû¹^û¹Wû¹Pû¹Iû¹Bû¹;û¹4û¹-û¹&û¹û¹û¹û¹ û¹û¹üú¹õú¹îú¹çú¹àú¹Ùú¹Òú¹Ëú¹Äú¹½ú¹¶ú¹¯ú¹¨ú¹¡ú¹šú¹“ú¹Œú¹…ú¹~ú¹wú¹pú¹iú¹bú¹[ú¹Tú¹Mú¹Fú¹?ú¹8ú¹1ú¹*ú¹#ú¹ú¹ú¹ú¹ú¹ú¹ùù¹òù¹ëù¹äù¹Ýù¹Öù¹Ïù¹Èù¹Áù¹ºù¹³ù¹¬ù¹¥ù¹žù¹—ù¹ù¹‰ù¹‚ù¹{ù¹tù¹mù¹fù¹_ù¹Xù¹Qù¹Jù¹Cù¹<ù¹5ù¹.ù¹'ù¹ ù¹ù¹ù¹ ù¹ù¹ýø¹öø¹ïø¹èø¹áø¹Úø¹Óø¹Ìø¹Åø¹¾ø¹·ø¹°ø¹©ø¹¢ø¹›ø¹”ø¹ø¹†ø¹ø¹xø¹qø¹jø¹cø¹\ø¹Uø¹Nø¹Gø¹@ø¹9ø¹2ø¹+ø¹$ø¹ø¹ø¹ø¹ø¹ø¹ú÷¹ó÷¹ì÷¹å÷¹Þ÷¹×÷¹Ð÷¹É÷¹Â÷¹»÷¹´÷¹­÷¹¦÷¹Ÿ÷¹˜÷¹‘÷¹Š÷¹ƒ÷¹|÷¹u÷¹n÷¹g÷¹`÷¹Y÷¹R÷¹K÷¹D÷¹=÷¹6÷¹/÷¹(÷¹!÷¹÷¹÷¹ ÷¹÷¹þö¹÷ö¹ðö¹éö¹âö¹Ûö¹Ôö¹Íö¹Æö¹¿ö¹¸ö¹±ö¹ªö¹£ö¹œö¹•ö¹Žö¹‡ö¹€ö¹yö¹rö¹kö¹dö¹]ö¹Vö¹Oö¹Hö¹Aö¹:ö¹3ö¹,ö¹%ö¹ö¹ö¹ö¹ ö¹ö¹ûõ¹ôõ¹íõ¹æõ¹ßõ¹Øõ¹Ñõ¹Êõ¹Ãõ¹¼õ¹µõ¹®õ¹§õ¹ õ¹™õ¹’õ¹‹õ¹„õ¹}õ¹võ¹oõ¹hõ¹aõ¹Zõ¹Sõ¹Lõ¹Eõ¹>õ¹7õ¹0õ¹)õ¹"õ¹õ¹õ¹ õ¹õ¹ÿô¹øô¹ñô¹êô¹ãô¹Üô¹Õô¹Îô¹Çô¹Àô¹¹ô¹²ô¹«ô¹¤ô¹ô¹–ô¹ô¹ˆô¹ô¹zô¹sô¹lô¹eô¹^ô¹Wô¹Pô¹Iô¹Bô¹;ô¹4ô¹-ô¹&ô¹ô¹ô¹ô¹ ô¹ô¹üó¹õó¹îó¹çó¹àó¹Ùó¹Òó¹Ëó¹Äó¹½ó¹¶ó¹¯ó¹¨ó¹¡ó¹šó¹“ó¹Œó¹…ó¹~ó¹wó¹pó¹ió¹bó¹[ó¹Tó¹Mó¹Fó¹?ó¹8ó¹1ó¹*ó¹#ó¹ó¹ó¹ó¹ó¹ó¹ùò¹òò¹ëò¹äò¹Ýò¹Öò¹Ïò¹Èò¹Áò¹ºò¹³ò¹¬ò¹¥ò¹žò¹—ò¹ò¹‰ò¹‚ò¹{ò¹tò¹mò¹fò¹_ò¹Xò¹Qò¹Jò¹Cò¹<ò¹5ò¹.ò¹'ò¹ ò¹ò¹ò¹ ò¹ò¹ýñ¹öñ¹ïñ¹èñ¹áñ¹Úñ¹Óñ¹Ìñ¹Åñ¹¾ñ¹·ñ¹°ñ¹©ñ¹¢ñ¹›ñ¹”ñ¹ñ¹†ñ¹ñ¹xñ¹qñ¹jñ¹cñ¹\ñ¹Uñ¹Nñ¹Gñ¹@ñ¹9ñ¹2ñ¹+ñ¹$ñ¹ñ¹ñ¹ñ¹ñ¹ñ¹úð¹óð¹ìð¹åð¹Þð¹×ð¹Ðð¹Éð¹Âð¹»ð¹´ð¹­ð¹¦ð¹Ÿð¹˜ð¹‘ð¹Šð¹ƒð¹|ð¹uð¹nð¹gð¹`ð¹Yð¹Rð¹Kð¹Dð¹=ð¹6ð¹/ð¹(ð¹!ð¹ð¹ð¹ ð¹ð¹þï¹÷ï¹ðï¹éï¹âï¹Ûï¹Ôï¹Íï¹Æï¹¿ï¹¸ï¹±ï¹ªï¹£ï¹œï¹•ï¹Žï¹‡ï¹€ï¹yï¹rï¹kï¹dï¹]ï¹Vï¹Oï¹Hï¹Aï¹:ï¹3ï¹,ï¹%ï¹ï¹ï¹ï¹ ï¹ï¹ûî¹ôî¹íî¹æî¹ßî¹Øî¹Ñî¹Êî¹Ãî¹}î¹vî¹oî¹hî¹aî¹Zî¹Sî¹Lî¹Eî¹>î¹7î¹0î¹)î¹"î¹î¹î¹ î¹î¹ÿí¹øí¹ñí¹êí¹ãí¹Üí¹Õí¹Îí¹Çí¹Àí¹¹í¹²í¹«í¹¤í¹í¹–í¹í¹ˆí¹í¹zí¹sí¹lí¹eí¹^í¹Wí¹Pí¹Ií¹Bí¹;í¹4í¹-í¹&í¹í¹í¹í¹ í¹í¹üì¹õì¹îì¹çì¹àì¹Ùì¹Òì¹Ëì¹Ä칽칶칯침칡칚칓칌칅ì¹~ì¹wì¹pì¹iì¹bì¹[ì¹Tì¹Mì¹Fì¹?ì¹8ì¹1ì¹*ì¹#ì¹ì¹ì¹ì¹ì¹ì¹ùë¹òë¹ëë¹äë¹Ýë¹Öë¹Ïë¹Èë¹Á빺빳빬빥빞빗ë¹ë¹‰ë¹‚ë¹{ë¹të¹më¹fë¹_ë¹Xë¹Që¹Jë¹Cë¹<ë¹5ë¹.ë¹'ë¹ ë¹ë¹ë¹ ë¹ë¹ýê¹öê¹ïê¹èê¹áê¹Úê¹Óê¹Ìê¹Å깾깷깰깩깢깛깔ê¹ê¹†ê¹ê¹xê¹qê¹jê¹cê¹\ê¹Uê¹Nê¹Gê¹@ê¹9ê¹2ê¹+ê¹$ê¹ê¹ê¹ê¹ê¹ê¹úé¹óé¹ìé¹åé¹Þé¹×é¹Ðé¹Éé¹Â鹻鹴鹭鹦鹟鹘鹑鹊鹃é¹|é¹ué¹né¹gé¹`é¹Yé¹Ré¹Ké¹Dé¹=é¹6é¹/é¹(é¹!é¹é¹é¹ é¹é¹þè¹÷è¹ðè¹éè¹âè¹Ûè¹Ôè¹Íè¹Æè¹¿è¹¸è¹±è¹ªè¹£è¹œè¹•è¹Žè¹‡è¹€è¹yè¹rè¹kè¹dè¹]è¹Vè¹Oè¹Hè¹Aè¹:è¹3è¹,è¹%è¹è¹è¹è¹ è¹è¹ûç¹ôç¹íç¹æç¹ßç¹Øç¹Ñç¹Êç¹Ã繼繵繮繧繠繙繒繋繄ç¹}ç¹vç¹oç¹hç¹aç¹Zç¹Sç¹Lç¹Eç¹>ç¹7ç¹0ç¹)ç¹"ç¹ç¹ç¹ ç¹ç¹ÿæ¹øæ¹ñæ¹êæ¹ãæ¹Üæ¹Õæ¹Îæ¹Çæ¹Àæ¹¹æ¹²æ¹«æ¹¤æ¹æ¹–æ¹æ¹ˆæ¹æ¹zæ¹sæ¹læ¹eæ¹^æ¹Wæ¹Pæ¹Iæ¹Bæ¹;æ¹4æ¹-æ¹&æ¹æ¹æ¹æ¹ æ¹æ¹üå¹õå¹îå¹çå¹àå¹Ùå¹Òå¹Ëå¹Ä幽并幯幨幡幚幓幌幅å¹~å¹wå¹på¹iå¹bå¹[å¹Tå¹Må¹Få¹?å¹8å¹1å¹*å¹#å¹å¹å¹å¹å¹å¹ùä¹òä¹ëä¹ää¹Ýä¹Öä¹Ïä¹Èä¹Á乺乳乬乥乞乗ä¹ä¹‰ä¹‚ä¹{ä¹tä¹mä¹fä¹_ä¹Xä¹Qä¹Jä¹Cä¹<ä¹5ä¹.ä¹'ä¹ ä¹ä¹ä¹ ä¹ä¹ýã¹öã¹ïã¹èã¹áã¹Úã¹Óã¹Ìã¹Å㹾㹷㹰㹩㹢㹛㹔ã¹ã¹†ã¹ã¹xã¹qã¹jã¹cã¹\ã¹Uã¹Nã¹Gã¹@ã¹9ã¹2ã¹+ã¹$ã¹ã¹ã¹ã¹ã¹ã¹úâ¹óâ¹ìâ¹åâ¹Þâ¹×â¹Ðâ¹Éâ¹Â⹻⹴⹭⹦⹟⹘⹑⹊⹃â¹|â¹uâ¹nâ¹gâ¹`â¹Yâ¹Râ¹Kâ¹Dâ¹=â¹6â¹/â¹(â¹!â¹â¹â¹ â¹â¹þá¹÷á¹ðá¹éá¹âá¹Ûá¹Ôá¹Íá¹Æá¹¿á¹¸á¹±á¹ªá¹£á¹œá¹•á¹Žá¹‡á¹€á¹yá¹rá¹ká¹dá¹]á¹Vá¹Oá¹Há¹Aá¹:á¹3á¹,á¹%á¹á¹á¹á¹ á¹á¹ûà¹ôà¹íà¹æà¹ßà¹Øà¹Ñà¹Êà¹Ã๼๵๮๧๠๙๒๋ไà¹}à¹và¹oà¹hà¹aà¹Zà¹Sà¹Là¹Eà¹>à¹7à¹0à¹)à¹"à¹à¹à¹ à¹à¹ÿß¹øß¹ñß¹êß¹ãß¹Üß¹Õß¹Îß¹Çß¹Àß¹¹ß¹²ß¹«ß¹¤ß¹ß¹–߹߹ˆß¹ß¹zß¹sß¹lß¹eß¹^ß¹Wß¹Pß¹Iß¹Bß¹;ß¹4ß¹-ß¹&߹߹߹߹ ߹߹üÞ¹õÞ¹îÞ¹çÞ¹àÞ¹ÙÞ¹ÒÞ¹ËÞ¹ÄÞ¹½Þ¹¶Þ¹¯Þ¹¨Þ¹¡Þ¹šÞ¹“Þ¹ŒÞ¹…Þ¹~Þ¹wÞ¹pÞ¹iÞ¹bÞ¹[Þ¹TÞ¹MÞ¹FÞ¹?Þ¹8Þ¹1Þ¹*Þ¹#Þ¹Þ¹Þ¹Þ¹Þ¹Þ¹ùݹòݹëݹäݹÝݹÖݹÏݹÈݹÁݹºÝ¹³Ý¹¬Ý¹¥Ý¹žÝ¹—ݹݹ‰Ý¹‚ݹ{ݹtݹmݹfݹ_ݹXݹQݹJݹCݹ<ݹ5ݹ.ݹ'ݹ ݹݹݹ ݹݹýܹöܹïܹèܹáܹÚܹÓܹÌܹÅܹ¾Ü¹·Ü¹°Ü¹©Ü¹¢Ü¹›Ü¹”ܹܹ†Ü¹ܹxܹqܹjܹcܹ\ܹUܹNܹGܹ@ܹ9ܹ2ܹ+ܹ$ܹܹܹܹܹܹúÛ¹óÛ¹ìÛ¹åÛ¹ÞÛ¹×Û¹ÐÛ¹ÉÛ¹ÂÛ¹»Û¹´Û¹­Û¹¦Û¹ŸÛ¹˜Û¹‘Û¹ŠÛ¹ƒÛ¹|Û¹uÛ¹nÛ¹gÛ¹`Û¹YÛ¹RÛ¹KÛ¹DÛ¹=Û¹6Û¹/Û¹(Û¹!Û¹Û¹Û¹ Û¹Û¹þÚ¹÷Ú¹ðÚ¹éÚ¹âÚ¹ÛÚ¹ÔÚ¹ÍÚ¹ÆÚ¹¿Ú¹¸Ú¹±Ú¹ªÚ¹£Ú¹œÚ¹•Ú¹ŽÚ¹‡Ú¹€Ú¹yÚ¹rÚ¹kÚ¹dÚ¹]Ú¹VÚ¹OÚ¹HÚ¹AÚ¹:Ú¹3Ú¹,Ú¹%Ú¹Ú¹Ú¹Ú¹ Ú¹Ú¹ûÙ¹ôÙ¹íÙ¹æÙ¹ßÙ¹ØÙ¹ÑÙ¹ÊÙ¹ÃÙ¹¼Ù¹µÙ¹®Ù¹§Ù¹ Ù¹™Ù¹’Ù¹‹Ù¹„Ù¹}Ù¹vÙ¹oÙ¹hÙ¹aÙ¹ZÙ¹SÙ¹LÙ¹EÙ¹>Ù¹7Ù¹0Ù¹)Ù¹"ٹٹٹ ٹٹÿعøØ¹ñعêØ¹ãØ¹ÜØ¹ÕØ¹ÎØ¹ÇعÀع¹Ø¹²Ø¹«Ø¹¤Ø¹ع–ععˆØ¹عzعsعlعeع^عWعPعIعBع;ع4ع-ع&عععع ععü×¹õ×¹î×¹ç×¹à×¹Ù×¹Ò×¹Ë×¹Ä×¹½×¹¶×¹¯×¹¨×¹¡×¹š×¹“×¹Œ×¹…×¹~×¹w×¹p×¹i×¹b×¹[×¹T×¹M×¹F×¹?×¹8×¹1×¹*×¹#×¹×¹×¹×¹×¹×¹ùÖ¹òÖ¹ëÖ¹äÖ¹ÝÖ¹ÖÖ¹ÏÖ¹ÈÖ¹ÁÖ¹ºÖ¹³Ö¹¬Ö¹¥Ö¹žÖ¹—Ö¹Ö¹‰Ö¹‚Ö¹{Ö¹tÖ¹mÖ¹fÖ¹_Ö¹XÖ¹QÖ¹JÖ¹CÖ¹<Ö¹5Ö¹.Ö¹'Ö¹ Ö¹Ö¹Ö¹ Ö¹Ö¹ýÕ¹öÕ¹ïÕ¹èÕ¹áÕ¹ÚÕ¹ÓÕ¹ÌÕ¹ÅÕ¹¾Õ¹·Õ¹°Õ¹©Õ¹¢Õ¹›Õ¹”Õ¹Õ¹†Õ¹Õ¹xÕ¹qÕ¹jÕ¹cÕ¹\Õ¹UÕ¹NÕ¹GÕ¹@Õ¹9Õ¹2Õ¹+Õ¹$Õ¹Õ¹Õ¹Õ¹Õ¹Õ¹úÔ¹óÔ¹ìÔ¹åÔ¹ÞÔ¹×Ô¹ÐÔ¹ÉÔ¹ÂÔ¹»Ô¹´Ô¹­Ô¹¦Ô¹ŸÔ¹˜Ô¹‘Ô¹ŠÔ¹ƒÔ¹|Ô¹uÔ¹nÔ¹gÔ¹`Ô¹YÔ¹RÔ¹KÔ¹DÔ¹=Ô¹6Ô¹/Ô¹(Ô¹!Ô¹Ô¹Ô¹ Ô¹Ô¹þÓ¹÷Ó¹ðÓ¹éÓ¹âÓ¹ÛÓ¹ÔÓ¹ÍÓ¹ÆÓ¹¿Ó¹¸Ó¹±Ó¹ªÓ¹£Ó¹œÓ¹•Ó¹ŽÓ¹‡Ó¹€Ó¹yÓ¹rÓ¹kÓ¹dÓ¹]Ó¹VÓ¹OÓ¹HÓ¹AÓ¹:Ó¹3Ó¹,Ó¹%Ó¹Ó¹Ó¹Ó¹ Ó¹Ó¹ûÒ¹ôÒ¹íÒ¹æÒ¹ßÒ¹ØÒ¹ÑÒ¹ÊÒ¹ÃÒ¹¼Ò¹µÒ¹®Ò¹§Ò¹ Ò¹™Ò¹’Ò¹‹Ò¹„Ò¹}Ò¹vÒ¹oÒ¹hÒ¹aÒ¹ZÒ¹SÒ¹LÒ¹EÒ¹>Ò¹7Ò¹0Ò¹)Ò¹"Ò¹Ò¹Ò¹ Ò¹Ò¹ÿѹøÑ¹ñѹêѹãѹÜѹÕѹÎѹÇѹÀѹ¹Ñ¹²Ñ¹«Ñ¹¤Ñ¹ѹ–ѹѹˆÑ¹ѹzѹsѹlѹeѹ^ѹWѹPѹIѹBѹ;ѹ4ѹ-ѹ&ѹѹѹѹ ѹѹüйõйîйçйàйÙйÒйËйÄй½Ð¹¶Ð¹¯Ð¹¨Ð¹¡Ð¹šÐ¹“йŒÐ¹…й~йwйpйiйbй[йTйMйFй?й8й1й*й#ййййййùϹòϹëϹäϹÝϹÖϹÏϹÈϹÁϹºÏ¹³Ï¹¬Ï¹¥Ï¹žÏ¹—ϹϹ‰Ï¹‚Ϲ{ϹtϹmϹfϹ_ϹXϹQϹJϹCϹ<Ϲ5Ϲ.Ϲ'Ϲ ϹϹϹ ϹϹýιöιïιèιáιÚιÓιÌιÅι¾Î¹·Î¹°Î¹©Î¹¢Î¹›Î¹”ιι†Î¹ιxιqιjιcι\ιUιNιGι@ι9ι2ι+ι$ιιιιιιú͹ó͹ì͹å͹Þ͹×͹Ð͹É͹Â͹»Í¹´Í¹­Í¹¦Í¹ŸÍ¹˜Í¹‘͹ŠÍ¹ƒÍ¹|͹u͹n͹g͹`͹Y͹R͹K͹D͹=͹6͹/͹(͹!͹͹͹ ͹͹þ̹÷̹ð̹é̹â̹Û̹Ô̹Í̹ÆÌ¹¿Ì¹¸Ì¹±Ì¹ªÌ¹£Ì¹œÌ¹•̹ŽÌ¹‡Ì¹€Ì¹y̹r̹k̹d̹]̹V̹O̹H̹A̹:̹3̹,̹%̹̹̹̹ ̹̹û˹ô˹í˹æË¹ß˹ØË¹Ñ˹Ê˹Ã˹¼Ë¹µË¹®Ë¹§Ë¹ Ë¹™Ë¹’˹‹Ë¹„˹}˹v˹o˹h˹a˹Z˹S˹L˹E˹>˹7˹0˹)˹"˹˹˹ ˹˹ÿʹøÊ¹ñʹêʹãʹÜʹÕʹÎʹÇʹÀʹ¹Ê¹²Ê¹«Ê¹¤Ê¹ʹ–ʹʹˆÊ¹ʹzʹsʹlʹeʹ^ʹWʹPʹIʹBʹ;ʹ4ʹ-ʹ&ʹʹʹʹ ʹʹüɹõɹîɹçɹàɹÙɹÒɹËɹÄɹ½É¹¶É¹¯É¹¨É¹¡É¹šÉ¹“ɹŒÉ¹…ɹ~ɹwɹpɹiɹbɹ[ɹTɹMɹFɹ?ɹ8ɹ1ɹ*ɹ#ɹɹɹɹɹɹùȹòȹëȹäȹÝȹÖȹÏȹÈȹÁȹºÈ¹³È¹¬È¹¥È¹žÈ¹—ȹȹ‰È¹‚ȹ{ȹtȹmȹfȹ_ȹXȹQȹJȹCȹ<ȹ5ȹ.ȹ'ȹ ȹȹȹ ȹȹýǹöǹïǹèǹáǹÚǹÓǹÌǹÅǹ¾Ç¹·Ç¹°Ç¹©Ç¹¢Ç¹›Ç¹”ǹǹ†Ç¹ǹxǹqǹjǹcǹ\ǹUǹNǹGǹ@ǹ9ǹ2ǹ+ǹ$ǹǹǹǹǹǹúƹóƹìÆ¹对ÞÆ¹ׯ¹ÐÆ¹ÉÆ¹Âƹ»Æ¹´Æ¹­Æ¹¦Æ¹ŸÆ¹˜Æ¹‘ƹŠÆ¹ƒÆ¹|ƹuƹnƹgƹ`ƹYƹRƹKƹDƹ=ƹ6ƹ/ƹ(ƹ!ƹƹƹ ƹƹþŹ÷ŹðŹéŹâŹÛŹÔŹÍʯŹ¿Å¹¸Å¹±Å¹ªÅ¹£Å¹œÅ¹•ŹŽÅ¹‡Å¹€Å¹yŹrŹkŹdŹ]ŹVŹOŹHŹAŹ:Ź3Ź,Ź%ŹŹŹŹ ŹŹûĹôĹíĹæÄ¹ßĹØÄ¹ÑĹÊĹÃĹ¼Ä¹µÄ¹®Ä¹§Ä¹ Ä¹™Ä¹’Ĺ‹Ä¹„Ĺ}ĹvĹoĹhĹaĹZĹSĹLĹEĹ>Ĺ7Ĺ0Ĺ)Ĺ"ĹĹĹ ĹĹÿùøÃ¹ñùêùãùÜùÕùÎùÇùÀù¹Ã¹²Ã¹«Ã¹¤Ã¹ù–ùùˆÃ¹ùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½Â¹¶Â¹¯Â¹¨Â¹¡Â¹šÂ¹“¹ŒÂ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ùÁ¹òÁ¹ëÁ¹äÁ¹ÝÁ¹ÖÁ¹ÏÁ¹ÈÁ¹ÁÁ¹ºÁ¹³Á¹¬Á¹¥Á¹žÁ¹—Á¹Á¹‰Á¹‚Á¹{Á¹tÁ¹mÁ¹fÁ¹_Á¹XÁ¹QÁ¹JÁ¹CÁ¹<Á¹5Á¹.Á¹'Á¹ Á¹Á¹Á¹ Á¹Á¹ýÀ¹öÀ¹ïÀ¹èÀ¹áÀ¹ÚÀ¹ÓÀ¹ÌÀ¹ÅÀ¹¾À¹·À¹°À¹©À¹¢À¹›À¹”À¹À¹†À¹À¹xÀ¹qÀ¹jÀ¹cÀ¹\À¹UÀ¹NÀ¹GÀ¹@À¹9À¹2À¹+À¹$À¹À¹À¹À¹À¹À¹ú¿¹ó¿¹쿹忹Þ¿¹׿¹п¹É¿¹¿¹»¿¹´¿¹­¿¹¦¿¹Ÿ¿¹˜¿¹‘¿¹Š¿¹ƒ¿¹|¿¹u¿¹n¿¹g¿¹`¿¹Y¿¹R¿¹K¿¹D¿¹=¿¹6¿¹/¿¹(¿¹!¿¹¿¹¿¹ ¿¹¿¹þ¾¹÷¾¹ð¾¹é¾¹â¾¹Û¾¹Ô¾¹;¹ƾ¹¿¾¹¸¾¹±¾¹ª¾¹£¾¹œ¾¹•¾¹޾¹‡¾¹€¾¹y¾¹r¾¹k¾¹d¾¹]¾¹V¾¹O¾¹H¾¹A¾¹:¾¹3¾¹,¾¹%¾¹¾¹¾¹¾¹ ¾¹¾¹û½¹ô½¹í½¹æ½¹ß½¹ؽ¹ѽ¹ʽ¹ý¹¼½¹µ½¹®½¹§½¹ ½¹™½¹’½¹‹½¹„½¹}½¹v½¹o½¹h½¹a½¹Z½¹S½¹L½¹E½¹>½¹7½¹0½¹)½¹"½¹½¹½¹ ½¹½¹ÿ¼¹ø¼¹ñ¼¹ê¼¹ã¼¹ܼ¹Õ¼¹μ¹Ǽ¹À¼¹¹¼¹²¼¹«¼¹¤¼¹¼¹–¼¹¼¹ˆ¼¹¼¹z¼¹s¼¹l¼¹e¼¹^¼¹W¼¹P¼¹I¼¹B¼¹;¼¹4¼¹-¼¹&¼¹¼¹¼¹¼¹ ¼¹¼¹ü»¹õ»¹绹໹Ù»¹Ò»¹Ë»¹Ä»¹½»¹¶»¹¯»¹¨»¹¡»¹š»¹“»¹Œ»¹…»¹~»¹w»¹p»¹i»¹b»¹[»¹T»¹M»¹F»¹?»¹8»¹1»¹*»¹#»¹»¹»¹»¹»¹»¹ùº¹òº¹뺹亹ݺ¹Öº¹Ϻ¹Ⱥ¹Áº¹ºº¹³º¹¬º¹¥º¹žº¹—º¹º¹‰º¹‚º¹{º¹tº¹mº¹fº¹_º¹Xº¹Qº¹Jº¹Cº¹<º¹5º¹.º¹'º¹ º¹º¹º¹ º¹º¹ý¹¹ö¹¹ï¹¹è¹¹á¹¹Ú¹¹Ó¹¹̹¹ʹ¾¹¹·¹¹°¹¹©¹¹¢¹¹›¹¹”¹¹¹¹†¹¹¹¹x¹¹q¹¹j¹¹c¹¹\¹¹U¹¹N¹¹G¹¹@¹¹9¹¹2¹¹+¹¹$¹¹¹¹¹¹¹¹¹¹¹¹ú¸¹ó¸¹츹帹Þ¸¹׸¹и¹ɸ¹¸¹»¸¹´¸¹­¸¹¦¸¹Ÿ¸¹˜¸¹‘¸¹Џ¹ƒ¸¹|¸¹u¸¹n¸¹g¸¹`¸¹Y¸¹R¸¹K¸¹D¸¹=¸¹6¸¹/¸¹(¸¹!¸¹¸¹¸¹ ¸¹¸¹þ·¹÷·¹ð·¹é·¹â·¹Û·¹Ô·¹Í·¹Æ·¹¿·¹¸·¹±·¹ª·¹£·¹œ·¹•·¹Ž·¹‡·¹€·¹y·¹r·¹k·¹d·¹]·¹V·¹O·¹H·¹A·¹:·¹3·¹,·¹%·¹·¹·¹·¹ ·¹·¹û¶¹ô¶¹í¶¹æ¶¹ß¶¹ض¹Ѷ¹ʶ¹ö¹¼¶¹µ¶¹®¶¹§¶¹ ¶¹™¶¹’¶¹‹¶¹„¶¹}¶¹v¶¹o¶¹h¶¹a¶¹Z¶¹S¶¹L¶¹E¶¹>¶¹7¶¹0¶¹)¶¹"¶¹¶¹¶¹ ¶¹¶¹ÿµ¹øµ¹ñµ¹êµ¹ãµ¹ܵ¹Õµ¹ε¹ǵ¹Àµ¹¹µ¹²µ¹«µ¹¤µ¹µ¹–µ¹µ¹ˆµ¹µ¹zµ¹sµ¹lµ¹eµ¹^µ¹Wµ¹Pµ¹Iµ¹Bµ¹;µ¹4µ¹-µ¹&µ¹µ¹µ¹µ¹ µ¹µ¹ü´¹õ´¹î´¹ç´¹à´¹Ù´¹Ò´¹Ë´¹Ä´¹½´¹¶´¹¯´¹¨´¹¡´¹š´¹“´¹Œ´¹…´¹~´¹w´¹p´¹i´¹b´¹[´¹T´¹M´¹F´¹?´¹8´¹1´¹*´¹#´¹´¹´¹´¹´¹´¹ù³¹ò³¹ë³¹ä³¹ݳ¹Ö³¹ϳ¹ȳ¹Á³¹º³¹³³¹¬³¹¥³¹ž³¹—³¹³¹‰³¹‚³¹{³¹t³¹m³¹f³¹_³¹X³¹Q³¹J³¹C³¹<³¹5³¹.³¹'³¹ ³¹³¹³¹ ³¹³¹ý²¹ö²¹ï²¹è²¹á²¹Ú²¹Ó²¹̲¹Ų¹¾²¹·²¹°²¹©²¹¢²¹›²¹”²¹²¹†²¹²¹x²¹q²¹j²¹c²¹\²¹U²¹N²¹G²¹@²¹9²¹2²¹+²¹$²¹²¹²¹²¹²¹²¹ú±¹ó±¹ì±¹å±¹Þ±¹×±¹б¹ɱ¹±¹»±¹´±¹­±¹¦±¹Ÿ±¹˜±¹‘±¹б¹ƒ±¹|±¹u±¹n±¹g±¹`±¹Y±¹R±¹K±¹D±¹=±¹6±¹/±¹(±¹!±¹±¹±¹ ±¹±¹þ°¹÷°¹ð°¹é°¹â°¹Û°¹Ô°¹Ͱ¹ư¹¿°¹¸°¹±°¹ª°¹£°¹œ°¹•°¹ް¹‡°¹€°¹y°¹r°¹k°¹d°¹]°¹V°¹O°¹H°¹A°¹:°¹3°¹,°¹%°¹°¹°¹°¹ °¹°¹û¯¹ô¯¹í¯¹毹߯¹د¹ѯ¹ʯ¹ï¹¼¯¹µ¯¹®¯¹§¯¹ ¯¹™¯¹’¯¹‹¯¹„¯¹}¯¹v¯¹o¯¹h¯¹a¯¹Z¯¹S¯¹L¯¹E¯¹>¯¹7¯¹0¯¹)¯¹"¯¹¯¹¯¹ ¯¹¯¹ÿ®¹ø®¹ñ®¹ꮹ㮹Ü®¹Õ®¹ή¹Ç®¹À®¹¹®¹²®¹«®¹¤®¹®¹–®¹®¹ˆ®¹®¹z®¹s®¹l®¹e®¹^®¹W®¹P®¹I®¹B®¹;®¹4®¹-®¹&®¹®¹®¹®¹ ®¹®¹ü­¹õ­¹î­¹ç­¹à­¹Ù­¹Ò­¹Ë­¹Ä­¹½­¹¶­¹¯­¹¨­¹¡­¹š­¹“­¹Œ­¹…­¹~­¹w­¹p­¹i­¹b­¹[­¹T­¹M­¹F­¹?­¹8­¹1­¹*­¹#­¹­¹­¹­¹­¹­¹ù¬¹ò¬¹묹䬹ݬ¹Ö¬¹Ϭ¹Ȭ¹Á¬¹º¬¹³¬¹¬¬¹¥¬¹ž¬¹—¬¹¬¹‰¬¹‚¬¹{¬¹t¬¹m¬¹f¬¹_¬¹X¬¹Q¬¹J¬¹C¬¹<¬¹5¬¹.¬¹'¬¹ ¬¹¬¹¬¹ ¬¹¬¹ý«¹ö«¹﫹諹᫹Ú«¹Ó«¹Ì«¹Å«¹¾«¹·«¹°«¹©«¹¢«¹›«¹”«¹«¹†«¹«¹x«¹q«¹j«¹c«¹\«¹U«¹N«¹G«¹@«¹9«¹2«¹+«¹$«¹«¹«¹«¹«¹«¹úª¹óª¹쪹媹Þª¹ת¹Ъ¹ɪ¹ª¹»ª¹´ª¹­ª¹¦ª¹Ÿª¹˜ª¹‘ª¹Šª¹ƒª¹|ª¹uª¹nª¹gª¹`ª¹Yª¹Rª¹Kª¹Dª¹=ª¹6ª¹/ª¹(ª¹!ª¹ª¹ª¹ ª¹ª¹þ©¹÷©¹ð©¹驹⩹Û©¹Ô©¹Í©¹Æ©¹¿©¹¸©¹±©¹ª©¹£©¹œ©¹•©¹Ž©¹‡©¹€©¹y©¹r©¹k©¹d©¹]©¹V©¹O©¹H©¹A©¹:©¹3©¹,©¹%©¹©¹©¹©¹ ©¹©¹û¨¹ô¨¹í¨¹樹ߨ¹ب¹Ѩ¹ʨ¹è¹¼¨¹µ¨¹®¨¹§¨¹ ¨¹™¨¹’¨¹‹¨¹„¨¹}¨¹v¨¹o¨¹h¨¹a¨¹Z¨¹S¨¹L¨¹E¨¹>¨¹7¨¹0¨¹)¨¹"¨¹¨¹¨¹ ¨¹¨¹ÿ§¹ø§¹ñ§¹ê§¹ã§¹ܧ¹Õ§¹Χ¹ǧ¹À§¹¹§¹²§¹«§¹¤§¹§¹–§¹§¹ˆ§¹§¹z§¹s§¹l§¹e§¹^§¹W§¹P§¹I§¹B§¹;§¹4§¹-§¹&§¹§¹§¹§¹ §¹§¹ü¦¹õ¦¹禹হÙ¦¹Ò¦¹˦¹Ħ¹½¦¹¶¦¹¯¦¹¨¦¹¡¦¹š¦¹“¦¹Œ¦¹…¦¹~¦¹w¦¹p¦¹i¦¹b¦¹[¦¹T¦¹M¦¹F¦¹?¦¹8¦¹1¦¹*¦¹#¦¹¦¹¦¹¦¹¦¹¦¹ù¥¹ò¥¹륹䥹Ý¥¹Ö¥¹Ï¥¹È¥¹Á¥¹º¥¹³¥¹¬¥¹¥¥¹ž¥¹—¥¹¥¹‰¥¹‚¥¹{¥¹t¥¹m¥¹f¥¹_¥¹X¥¹Q¥¹J¥¹C¥¹<¥¹5¥¹.¥¹'¥¹ ¥¹¥¹¥¹ ¥¹¥¹ý¤¹ö¤¹魯褹᤹Ú¤¹Ó¤¹̤¹Ť¹¾¤¹·¤¹°¤¹©¤¹¢¤¹›¤¹”¤¹¤¹†¤¹¤¹x¤¹q¤¹j¤¹c¤¹\¤¹U¤¹N¤¹G¤¹@¤¹9¤¹2¤¹+¤¹$¤¹¤¹¤¹¤¹¤¹¤¹ú£¹ó£¹죹壹Þ£¹×£¹У¹É£¹£¹»£¹´£¹­£¹¦£¹Ÿ£¹˜£¹‘£¹Š£¹ƒ£¹|£¹u£¹n£¹g£¹`£¹Y£¹R£¹K£¹D£¹=£¹6£¹/£¹(£¹!£¹£¹£¹ £¹£¹þ¢¹÷¢¹ð¢¹颹⢹Û¢¹Ô¢¹Í¢¹Æ¢¹¿¢¹¸¢¹±¢¹ª¢¹£¢¹œ¢¹•¢¹Ž¢¹‡¢¹€¢¹y¢¹r¢¹k¢¹d¢¹]¢¹V¢¹O¢¹H¢¹A¢¹:¢¹3¢¹,¢¹%¢¹¢¹¢¹¢¹ ¢¹¢¹û¡¹ô¡¹í¡¹桹ß¡¹Ø¡¹Ñ¡¹Ê¡¹á¹¼¡¹µ¡¹®¡¹§¡¹ ¡¹™¡¹’¡¹‹¡¹„¡¹}¡¹v¡¹o¡¹h¡¹a¡¹Z¡¹S¡¹L¡¹E¡¹>¡¹7¡¹0¡¹)¡¹"¡¹¡¹¡¹ ¡¹¡¹ÿ ¹ø ¹ñ ¹ê ¹ã ¹Ü ¹Õ ¹Π¹Ç ¹À ¹¹ ¹² ¹« ¹¤ ¹ ¹– ¹ ¹ˆ ¹ ¹z ¹s ¹l ¹e ¹^ ¹W ¹P ¹I ¹B ¹; ¹4 ¹- ¹& ¹ ¹ ¹ ¹  ¹ ¹üŸ¹õŸ¹矹àŸ¹ÙŸ¹ÒŸ¹ËŸ¹ÄŸ¹½Ÿ¹¶Ÿ¹¯Ÿ¹¨Ÿ¹¡Ÿ¹šŸ¹“Ÿ¹ŒŸ¹…Ÿ¹~Ÿ¹wŸ¹pŸ¹iŸ¹bŸ¹[Ÿ¹TŸ¹MŸ¹FŸ¹?Ÿ¹8Ÿ¹1Ÿ¹*Ÿ¹#Ÿ¹Ÿ¹Ÿ¹Ÿ¹Ÿ¹Ÿ¹ùž¹òž¹ëž¹äž¹Ýž¹Öž¹Ïž¹Èž¹Áž¹ºž¹³ž¹¬ž¹¥ž¹žž¹—ž¹ž¹‰ž¹‚ž¹{ž¹tž¹mž¹fž¹_ž¹Xž¹Qž¹Jž¹Cž¹<ž¹5ž¹.ž¹'ž¹ ž¹ž¹ž¹ ž¹ž¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹úœ¹óœ¹윹圹Þœ¹ל¹М¹Éœ¹œ¹»œ¹´œ¹­œ¹¦œ¹Ÿœ¹˜œ¹‘œ¹Šœ¹ƒœ¹|œ¹uœ¹nœ¹gœ¹`œ¹Yœ¹Rœ¹Kœ¹Dœ¹=œ¹6œ¹/œ¹(œ¹!œ¹œ¹œ¹ œ¹œ¹þ›¹÷›¹ð›¹雹⛹Û›¹Ô›¹Í›¹Æ›¹¿›¹¸›¹±›¹ª›¹£›¹œ›¹•›¹Ž›¹‡›¹€›¹y›¹r›¹k›¹d›¹]›¹V›¹O›¹H›¹A›¹:›¹3›¹,›¹%›¹›¹›¹›¹ ›¹›¹ûš¹ôš¹íš¹æš¹ßš¹Øš¹Ñš¹Êš¹Ú¹¼š¹µš¹®š¹§š¹ š¹™š¹’š¹‹š¹„š¹}š¹vš¹oš¹hš¹aš¹Zš¹Sš¹Lš¹Eš¹>š¹7š¹0š¹)š¹"š¹š¹š¹ š¹š¹ÿ™¹ø™¹ñ™¹ꙹ㙹Ü™¹Õ™¹Ι¹Ç™¹À™¹¹™¹²™¹«™¹¤™¹™¹–™¹™¹ˆ™¹™¹z™¹s™¹l™¹e™¹^™¹W™¹P™¹I™¹B™¹;™¹4™¹-™¹&™¹™¹™¹™¹ ™¹™¹ü˜¹õ˜¹瘹à˜¹Ù˜¹Ò˜¹˘¹ƹ½˜¹¶˜¹¯˜¹¨˜¹¡˜¹š˜¹“˜¹Œ˜¹…˜¹~˜¹w˜¹p˜¹i˜¹b˜¹[˜¹T˜¹M˜¹F˜¹?˜¹8˜¹1˜¹*˜¹#˜¹˜¹˜¹˜¹˜¹˜¹ù—¹ò—¹ë—¹ä—¹Ý—¹Ö—¹Ï—¹È—¹Á—¹º—¹³—¹¬—¹¥—¹ž—¹——¹—¹‰—¹‚—¹{—¹t—¹m—¹f—¹_—¹X—¹Q—¹J—¹C—¹<—¹5—¹.—¹'—¹ —¹—¹—¹ —¹—¹ý–¹ö–¹ï–¹è–¹á–¹Ú–¹Ó–¹Ì–¹Å–¹¾–¹·–¹°–¹©–¹¢–¹›–¹”–¹–¹†–¹–¹x–¹q–¹j–¹c–¹\–¹U–¹N–¹G–¹@–¹9–¹2–¹+–¹$–¹–¹–¹–¹–¹–¹ú•¹ó•¹앹啹Þ•¹ו¹Е¹É•¹•¹»•¹´•¹­•¹¦•¹Ÿ•¹˜•¹‘•¹Š•¹ƒ•¹|•¹u•¹n•¹g•¹`•¹Y•¹R•¹K•¹D•¹=•¹6•¹/•¹(•¹!•¹•¹•¹ •¹•¹þ”¹÷”¹ð”¹锹┹Û”¹Ô”¹Í”¹Æ”¹¿”¹¸”¹±”¹ª”¹£”¹œ”¹•”¹Ž”¹‡”¹€”¹y”¹r”¹k”¹d”¹]”¹V”¹O”¹H”¹A”¹:”¹3”¹,”¹%”¹”¹”¹”¹ ”¹”¹û“¹ô“¹퓹擹ß“¹Ø“¹Ñ“¹Ê“¹Ó¹¼“¹µ“¹®“¹§“¹ “¹™“¹’“¹‹“¹„“¹}“¹v“¹o“¹h“¹a“¹Z“¹S“¹L“¹E“¹>“¹7“¹0“¹)“¹"“¹“¹“¹ “¹“¹ÿ’¹ø’¹ñ’¹ê’¹ã’¹Ü’¹Õ’¹Î’¹Ç’¹À’¹¹’¹²’¹«’¹¤’¹’¹–’¹’¹ˆ’¹’¹z’¹s’¹l’¹e’¹^’¹W’¹P’¹I’¹B’¹;’¹4’¹-’¹&’¹’¹’¹’¹ ’¹’¹ü‘¹õ‘¹瑹à‘¹Ù‘¹Ò‘¹Ë‘¹Ä‘¹½‘¹¶‘¹¯‘¹¨‘¹¡‘¹š‘¹“‘¹Œ‘¹…‘¹~‘¹w‘¹p‘¹i‘¹b‘¹[‘¹T‘¹M‘¹F‘¹?‘¹8‘¹1‘¹*‘¹#‘¹‘¹‘¹‘¹‘¹‘¹ù¹ò¹ë¹ä¹ݹÖ¹ϹȹÁ¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú޹ó޹쎹厹ÞŽ¹׎¹ÐŽ¹ÉŽ¹Â޹»Ž¹´Ž¹­Ž¹¦Ž¹ŸŽ¹˜Ž¹‘޹ŠŽ¹ƒŽ¹|޹u޹n޹g޹`޹Y޹R޹K޹D޹=޹6޹/޹(޹!޹޹޹ ޹޹þ¹÷¹ð¹é¹â¹Û¹Ô¹͹ƹ¿¹¸¹±¹ª¹£¹œ¹•¹޹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹ûŒ¹ôŒ¹팹挹ߌ¹ØŒ¹ÑŒ¹ÊŒ¹ÃŒ¹¼Œ¹µŒ¹®Œ¹§Œ¹ Œ¹™Œ¹’Œ¹‹Œ¹„Œ¹}Œ¹vŒ¹oŒ¹hŒ¹aŒ¹ZŒ¹SŒ¹LŒ¹EŒ¹>Œ¹7Œ¹0Œ¹)Œ¹"Œ¹Œ¹Œ¹ Œ¹Œ¹ÿ‹¹ø‹¹ñ‹¹ꋹ㋹Ü‹¹Õ‹¹΋¹Ç‹¹À‹¹¹‹¹²‹¹«‹¹¤‹¹‹¹–‹¹‹¹ˆ‹¹‹¹z‹¹s‹¹l‹¹e‹¹^‹¹W‹¹P‹¹I‹¹B‹¹;‹¹4‹¹-‹¹&‹¹‹¹‹¹‹¹ ‹¹‹¹üйõй犹àŠ¹ÙŠ¹ÒŠ¹ËŠ¹Äй½Š¹¶Š¹¯Š¹¨Š¹¡Š¹šŠ¹“йŒŠ¹…й~йwйpйiйbй[йTйMйFй?й8й1й*й#ййййййù‰¹ò‰¹뉹䉹݉¹Ö‰¹ω¹ȉ¹Á‰¹º‰¹³‰¹¬‰¹¥‰¹ž‰¹—‰¹‰¹‰‰¹‚‰¹{‰¹t‰¹m‰¹f‰¹_‰¹X‰¹Q‰¹J‰¹C‰¹<‰¹5‰¹.‰¹'‰¹ ‰¹‰¹‰¹ ‰¹‰¹ýˆ¹öˆ¹船ሹÚˆ¹Óˆ¹̈¹ň¹¾ˆ¹·ˆ¹°ˆ¹©ˆ¹¢ˆ¹›ˆ¹”ˆ¹ˆ¹†ˆ¹ˆ¹xˆ¹qˆ¹jˆ¹cˆ¹\ˆ¹Uˆ¹Nˆ¹Gˆ¹@ˆ¹9ˆ¹2ˆ¹+ˆ¹$ˆ¹ˆ¹ˆ¹ˆ¹ˆ¹ˆ¹ú‡¹ó‡¹쇹凹Þ‡¹ׇ¹Ї¹ɇ¹‡¹»‡¹´‡¹­‡¹¦‡¹Ÿ‡¹˜‡¹‘‡¹Ї¹ƒ‡¹|‡¹u‡¹n‡¹g‡¹`‡¹Y‡¹R‡¹K‡¹D‡¹=‡¹6‡¹/‡¹(‡¹!‡¹‡¹‡¹ ‡¹‡¹þ†¹÷†¹ð†¹醹↹Û†¹Ô†¹͆¹Ɔ¹¿†¹¸†¹±†¹ª†¹£†¹œ†¹•†¹ކ¹‡†¹€†¹y†¹r†¹k†¹d†¹]†¹V†¹O†¹H†¹A†¹:†¹3†¹,†¹%†¹†¹†¹†¹ †¹†¹û…¹ô…¹í…¹æ…¹ß…¹Ø…¹Ñ…¹Ê…¹Ã…¹¼…¹µ…¹®…¹§…¹ …¹™…¹’…¹‹…¹„…¹}…¹v…¹o…¹h…¹a…¹Z…¹S…¹L…¹E…¹>…¹7…¹0…¹)…¹"…¹…¹…¹ …¹…¹ÿ„¹ø„¹ñ„¹ꄹㄹÜ„¹Õ„¹΄¹Ç„¹À„¹¹„¹²„¹«„¹¤„¹„¹–„¹„¹ˆ„¹„¹z„¹s„¹l„¹e„¹^„¹W„¹P„¹I„¹B„¹;„¹4„¹-„¹&„¹„¹„¹„¹ „¹„¹üƒ¹õƒ¹烹àƒ¹Ùƒ¹Òƒ¹˃¹ă¹½ƒ¹¶ƒ¹¯ƒ¹¨ƒ¹¡ƒ¹šƒ¹“ƒ¹Œƒ¹…ƒ¹~ƒ¹wƒ¹pƒ¹iƒ¹bƒ¹[ƒ¹Tƒ¹Mƒ¹Fƒ¹?ƒ¹8ƒ¹1ƒ¹*ƒ¹#ƒ¹ƒ¹ƒ¹ƒ¹ƒ¹ƒ¹ù‚¹ò‚¹낹䂹Ý‚¹Ö‚¹Ï‚¹È‚¹Á‚¹º‚¹³‚¹¬‚¹¥‚¹ž‚¹—‚¹‚¹‰‚¹‚‚¹{‚¹t‚¹m‚¹f‚¹_‚¹X‚¹Q‚¹J‚¹C‚¹<‚¹5‚¹.‚¹'‚¹ ‚¹‚¹‚¹ ‚¹‚¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú€¹ó€¹쀹倹Þ€¹×€¹Ѐ¹É€¹€¹»€¹´€¹­€¹¦€¹Ÿ€¹˜€¹‘€¹Š€¹ƒ€¹|€¹u€¹n€¹g€¹`€¹Y€¹R€¹K€¹D€¹=€¹6€¹/€¹(€¹!€¹€¹€¹ €¹€¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û~¹ô~¹í~¹æ~¹ß~¹Ø~¹Ñ~¹Ê~¹Ã~¹¼~¹µ~¹®~¹§~¹ ~¹™~¹’~¹‹~¹„~¹}~¹v~¹o~¹h~¹a~¹Z~¹S~¹L~¹E~¹>~¹7~¹0~¹)~¹"~¹~¹~¹ ~¹~¹ÿ}¹ø}¹ñ}¹ê}¹ã}¹Ü}¹Õ}¹Î}¹Ç}¹À}¹¹}¹²}¹«}¹¤}¹}¹–}¹}¹ˆ}¹}¹z}¹s}¹l}¹e}¹^}¹W}¹P}¹I}¹B}¹;}¹4}¹-}¹&}¹}¹}¹}¹ }¹}¹ü|¹õ|¹î|¹ç|¹à|¹Ù|¹Ò|¹Ë|¹Ä|¹½|¹¶|¹¯|¹¨|¹¡|¹š|¹“|¹Œ|¹…|¹~|¹w|¹p|¹i|¹b|¹[|¹T|¹M|¹F|¹?|¹8|¹1|¹*|¹#|¹|¹|¹|¹|¹|¹ù{¹ò{¹ë{¹ä{¹Ý{¹Ö{¹Ï{¹È{¹Á{¹º{¹³{¹¬{¹¥{¹ž{¹—{¹{¹‰{¹‚{¹{{¹t{¹m{¹f{¹_{¹X{¹Q{¹J{¹C{¹<{¹5{¹.{¹'{¹ {¹{¹{¹ {¹{¹ýz¹öz¹ïz¹èz¹áz¹Úz¹Óz¹Ìz¹Åz¹¾z¹·z¹°z¹©z¹¢z¹›z¹”z¹z¹†z¹z¹xz¹qz¹jz¹cz¹\z¹Uz¹Nz¹Gz¹@z¹9z¹2z¹+z¹$z¹z¹z¹z¹z¹z¹úy¹óy¹ìy¹åy¹Þy¹×y¹Ðy¹Éy¹Ây¹»y¹´y¹­y¹¦y¹Ÿy¹˜y¹‘y¹Šy¹ƒy¹|y¹uy¹ny¹gy¹`y¹Yy¹Ry¹Ky¹Dy¹=y¹6y¹/y¹(y¹!y¹y¹y¹ y¹y¹þx¹÷x¹ðx¹éx¹âx¹Ûx¹Ôx¹Íx¹Æx¹¿x¹¸x¹±x¹ªx¹£x¹œx¹•x¹Žx¹‡x¹€x¹yx¹rx¹kx¹dx¹]x¹Vx¹Ox¹Hx¹Ax¹:x¹3x¹,x¹%x¹x¹x¹x¹ x¹x¹ûw¹ôw¹íw¹æw¹ßw¹Øw¹Ñw¹Êw¹Ãw¹¼w¹µw¹®w¹§w¹ w¹™w¹’w¹‹w¹„w¹}w¹vw¹ow¹hw¹aw¹Zw¹Sw¹Lw¹Ew¹>w¹7w¹0w¹)w¹"w¹w¹w¹ w¹w¹ÿv¹øv¹ñv¹êv¹ãv¹Üv¹Õv¹Îv¹Çv¹Àv¹¹v¹²v¹«v¹¤v¹v¹–v¹v¹ˆv¹v¹zv¹sv¹lv¹ev¹^v¹Wv¹Pv¹Iv¹Bv¹;v¹4v¹-v¹&v¹v¹v¹v¹ v¹v¹üu¹õu¹îu¹çu¹àu¹Ùu¹Òu¹Ëu¹Äu¹½u¹¶u¹¯u¹¨u¹¡u¹šu¹“u¹Œu¹…u¹~u¹wu¹pu¹iu¹bu¹[u¹Tu¹Mu¹Fu¹?u¹8u¹1u¹*u¹#u¹u¹u¹u¹u¹u¹ùt¹òt¹ët¹ät¹Ýt¹Öt¹Ït¹Èt¹Át¹ºt¹³t¹¬t¹¥t¹žt¹—t¹t¹‰t¹‚t¹{t¹tt¹mt¹ft¹_t¹Xt¹Qt¹Jt¹Ct¹p¹7p¹0p¹)p¹"p¹p¹p¹ p¹p¹ÿo¹øo¹ño¹êo¹ão¹Üo¹Õo¹Îo¹Ço¹Ào¹¹o¹²o¹«o¹¤o¹o¹–o¹o¹ˆo¹o¹zo¹so¹lo¹eo¹^o¹Wo¹Po¹Io¹Bo¹;o¹4o¹-o¹&o¹o¹o¹o¹ o¹o¹ün¹õn¹în¹çn¹àn¹Ùn¹Òn¹Ën¹Än¹½n¹¶n¹¯n¹¨n¹¡n¹šn¹“n¹Œn¹…n¹~n¹wn¹pn¹in¹bn¹[n¹Tn¹Mn¹Fn¹?n¹8n¹1n¹*n¹#n¹n¹n¹n¹n¹n¹ùm¹òm¹ëm¹äm¹Ým¹Öm¹Ïm¹Èm¹Ám¹ºm¹³m¹¬m¹¥m¹žm¹—m¹m¹‰m¹‚m¹{m¹tm¹mm¹fm¹_m¹Xm¹Qm¹Jm¹Cm¹i¹7i¹0i¹)i¹"i¹i¹i¹ i¹i¹ÿh¹øh¹ñh¹êh¹ãh¹Üh¹Õh¹Îh¹Çh¹Àh¹¹h¹²h¹«h¹¤h¹h¹–h¹h¹ˆh¹h¹zh¹sh¹lh¹eh¹^h¹Wh¹Ph¹Ih¹Bh¹;h¹4h¹-h¹&h¹h¹h¹h¹ h¹h¹üg¹õg¹îg¹çg¹àg¹Ùg¹Òg¹Ëg¹Äg¹½g¹¶g¹¯g¹¨g¹¡g¹šg¹“g¹Œg¹…g¹~g¹wg¹pg¹ig¹bg¹[g¹Tg¹Mg¹Fg¹?g¹8g¹1g¹*g¹#g¹g¹g¹g¹g¹g¹ùf¹òf¹ëf¹äf¹Ýf¹Öf¹Ïf¹Èf¹Áf¹ºf¹³f¹¬f¹¥f¹žf¹—f¹f¹‰f¹‚f¹{f¹tf¹mf¹ff¹_f¹Xf¹Qf¹Jf¹Cf¹b¹7b¹0b¹)b¹"b¹b¹b¹ b¹b¹ÿa¹øa¹ña¹êa¹ãa¹Üa¹Õa¹Îa¹Ça¹Àa¹¹a¹²a¹«a¹¤a¹a¹–a¹a¹ˆa¹a¹za¹sa¹la¹ea¹^a¹Wa¹Pa¹Ia¹Ba¹;a¹4a¹-a¹&a¹a¹a¹a¹ a¹a¹ü`¹õ`¹î`¹ç`¹à`¹Ù`¹Ò`¹Ë`¹Ä`¹½`¹¶`¹¯`¹¨`¹¡`¹š`¹“`¹Œ`¹…`¹~`¹w`¹p`¹i`¹b`¹[`¹T`¹M`¹F`¹?`¹8`¹1`¹*`¹#`¹`¹`¹`¹`¹`¹ù_¹ò_¹ë_¹ä_¹Ý_¹Ö_¹Ï_¹È_¹Á_¹º_¹³_¹¬_¹¥_¹ž_¹—_¹_¹‰_¹‚_¹{_¹t_¹m_¹f_¹__¹X_¹Q_¹J_¹C_¹<_¹5_¹._¹'_¹ _¹_¹_¹ _¹_¹ý^¹ö^¹ï^¹è^¹á^¹Ú^¹Ó^¹Ì^¹Å^¹¾^¹·^¹°^¹©^¹¢^¹›^¹”^¹^¹†^¹^¹x^¹q^¹j^¹c^¹\^¹U^¹N^¹G^¹@^¹9^¹2^¹+^¹$^¹^¹^¹^¹^¹^¹ú]¹ó]¹ì]¹å]¹Þ]¹×]¹Ð]¹É]¹Â]¹»]¹´]¹­]¹¦]¹Ÿ]¹˜]¹‘]¹Š]¹ƒ]¹|]¹u]¹n]¹g]¹`]¹Y]¹R]¹K]¹D]¹=]¹6]¹/]¹(]¹!]¹]¹]¹ ]¹]¹þ\¹÷\¹ð\¹é\¹â\¹Û\¹Ô\¹Í\¹Æ\¹¿\¹¸\¹±\¹ª\¹£\¹œ\¹•\¹Ž\¹‡\¹€\¹y\¹r\¹k\¹d\¹]\¹V\¹O\¹H\¹A\¹:\¹3\¹,\¹%\¹\¹\¹\¹ \¹\¹û[¹ô[¹í[¹æ[¹ß[¹Ø[¹Ñ[¹Ê[¹Ã[¹¼[¹µ[¹®[¹§[¹ [¹™[¹’[¹‹[¹„[¹}[¹v[¹o[¹h[¹a[¹Z[¹S[¹L[¹E[¹>[¹7[¹0[¹)[¹"[¹[¹[¹ [¹[¹ÿZ¹øZ¹ñZ¹êZ¹ãZ¹ÜZ¹ÕZ¹ÎZ¹ÇZ¹ÀZ¹¹Z¹²Z¹«Z¹¤Z¹Z¹–Z¹Z¹ˆZ¹Z¹zZ¹sZ¹lZ¹eZ¹^Z¹WZ¹PZ¹IZ¹BZ¹;Z¹4Z¹-Z¹&Z¹Z¹Z¹Z¹ Z¹Z¹üY¹õY¹îY¹çY¹àY¹ÙY¹ÒY¹ËY¹ÄY¹½Y¹¶Y¹¯Y¹¨Y¹¡Y¹šY¹“Y¹ŒY¹…Y¹~Y¹wY¹pY¹iY¹bY¹[Y¹TY¹MY¹FY¹?Y¹8Y¹1Y¹*Y¹#Y¹Y¹Y¹Y¹Y¹Y¹ùX¹òX¹ëX¹äX¹ÝX¹ÖX¹ÏX¹ÈX¹ÁX¹ºX¹³X¹¬X¹¥X¹žX¹—X¹X¹‰X¹‚X¹{X¹tX¹mX¹fX¹_X¹XX¹QX¹JX¹CX¹T¹7T¹0T¹)T¹"T¹T¹T¹ T¹T¹ÿS¹øS¹ñS¹êS¹ãS¹ÜS¹ÕS¹ÎS¹ÇS¹ÀS¹¹S¹²S¹«S¹¤S¹S¹–S¹S¹ˆS¹S¹zS¹sS¹lS¹eS¹^S¹WS¹PS¹IS¹BS¹;S¹4S¹-S¹&S¹S¹S¹S¹ S¹S¹üR¹õR¹îR¹çR¹àR¹ÙR¹ÒR¹ËR¹ÄR¹½R¹¶R¹¯R¹¨R¹¡R¹šR¹“R¹ŒR¹…R¹~R¹wR¹pR¹iR¹bR¹[R¹TR¹MR¹FR¹?R¹8R¹1R¹*R¹#R¹R¹R¹R¹R¹R¹ùQ¹òQ¹ëQ¹äQ¹ÝQ¹ÖQ¹ÏQ¹ÈQ¹ÁQ¹ºQ¹³Q¹¬Q¹¥Q¹žQ¹—Q¹Q¹‰Q¹‚Q¹{Q¹tQ¹mQ¹fQ¹_Q¹XQ¹QQ¹JQ¹CQ¹M¹7M¹0M¹)M¹"M¹M¹M¹ M¹M¹ÿL¹øL¹ñL¹êL¹ãL¹ÜL¹ÕL¹ÎL¹ÇL¹ÀL¹¹L¹²L¹«L¹¤L¹L¹–L¹L¹ˆL¹L¹zL¹sL¹lL¹eL¹^L¹WL¹PL¹IL¹BL¹;L¹4L¹-L¹&L¹L¹L¹L¹ L¹L¹üK¹õK¹îK¹çK¹àK¹ÙK¹ÒK¹ËK¹ÄK¹½K¹¶K¹¯K¹¨K¹¡K¹šK¹“K¹ŒK¹…K¹~K¹wK¹pK¹iK¹bK¹[K¹TK¹MK¹FK¹?K¹8K¹1K¹*K¹#K¹K¹K¹K¹K¹K¹ùJ¹òJ¹ëJ¹äJ¹ÝJ¹ÖJ¹ÏJ¹ÈJ¹ÁJ¹ºJ¹³J¹¬J¹¥J¹žJ¹—J¹J¹‰J¹‚J¹{J¹tJ¹mJ¹fJ¹_J¹XJ¹QJ¹JJ¹CJ¹F¹7F¹0F¹)F¹"F¹F¹F¹ F¹F¹ÿE¹øE¹ñE¹êE¹ãE¹ÜE¹ÕE¹ÎE¹ÇE¹ÀE¹¹E¹²E¹«E¹¤E¹E¹–E¹E¹ˆE¹E¹zE¹sE¹lE¹eE¹^E¹WE¹PE¹IE¹BE¹;E¹4E¹-E¹&E¹E¹E¹E¹ E¹E¹üD¹õD¹îD¹çD¹àD¹ÙD¹ÒD¹ËD¹ÄD¹½D¹¶D¹¯D¹¨D¹¡D¹šD¹“D¹ŒD¹…D¹~D¹wD¹pD¹iD¹bD¹[D¹TD¹MD¹FD¹?D¹8D¹1D¹*D¹#D¹D¹D¹D¹D¹D¹ùC¹òC¹ëC¹äC¹ÝC¹ÖC¹ÏC¹ÈC¹ÁC¹ºC¹³C¹¬C¹¥C¹žC¹—C¹C¹‰C¹‚C¹{C¹tC¹mC¹fC¹_C¹XC¹QC¹JC¹CC¹?¹7?¹0?¹)?¹"?¹?¹?¹ ?¹?¹ÿ>¹ø>¹ñ>¹ê>¹ã>¹Ü>¹Õ>¹Î>¹Ç>¹À>¹¹>¹²>¹«>¹¤>¹>¹–>¹>¹ˆ>¹>¹z>¹s>¹l>¹e>¹^>¹W>¹P>¹I>¹B>¹;>¹4>¹->¹&>¹>¹>¹>¹ >¹>¹ü=¹õ=¹î=¹ç=¹à=¹Ù=¹Ò=¹Ë=¹Ä=¹½=¹¶=¹¯=¹¨=¹¡=¹š=¹“=¹Œ=¹…=¹~=¹w=¹p=¹i=¹b=¹[=¹T=¹M=¹F=¹?=¹8=¹1=¹*=¹#=¹=¹=¹=¹=¹=¹ù<¹ò<¹ë<¹ä<¹Ý<¹Ö<¹Ï<¹È<¹Á<¹º<¹³<¹¬<¹¥<¹ž<¹—<¹<¹‰<¹‚<¹{<¹t<¹m<¹f<¹_<¹X<¹Q<¹J<¹C<¹<<¹5<¹.<¹'<¹ <¹<¹<¹ <¹<¹ý;¹ö;¹ï;¹è;¹á;¹Ú;¹Ó;¹Ì;¹Å;¹¾;¹·;¹°;¹©;¹¢;¹›;¹”;¹;¹†;¹;¹x;¹q;¹j;¹c;¹\;¹U;¹N;¹G;¹@;¹9;¹2;¹+;¹$;¹;¹;¹;¹;¹;¹ú:¹ó:¹ì:¹å:¹Þ:¹×:¹Ð:¹É:¹Â:¹»:¹´:¹­:¹¦:¹Ÿ:¹˜:¹‘:¹Š:¹ƒ:¹|:¹u:¹n:¹g:¹`:¹Y:¹R:¹K:¹D:¹=:¹6:¹/:¹(:¹!:¹:¹:¹ :¹:¹þ9¹÷9¹ð9¹é9¹â9¹Û9¹Ô9¹Í9¹Æ9¹¿9¹¸9¹±9¹ª9¹£9¹œ9¹•9¹Ž9¹‡9¹€9¹y9¹r9¹k9¹d9¹]9¹V9¹O9¹H9¹A9¹:9¹39¹,9¹%9¹9¹9¹9¹ 9¹9¹û8¹ô8¹í8¹æ8¹ß8¹Ø8¹Ñ8¹Ê8¹Ã8¹¼8¹µ8¹®8¹§8¹ 8¹™8¹’8¹‹8¹„8¹}8¹v8¹o8¹h8¹a8¹Z8¹S8¹L8¹E8¹>8¹78¹08¹)8¹"8¹8¹8¹ 8¹8¹ÿ7¹ø7¹ñ7¹ê7¹ã7¹Ü7¹Õ7¹Î7¹Ç7¹À7¹¹7¹²7¹«7¹¤7¹7¹–7¹7¹ˆ7¹7¹z7¹s7¹l7¹e7¹^7¹W7¹P7¹I7¹B7¹;7¹47¹-7¹&7¹7¹7¹7¹ 7¹7¹ü6¹õ6¹î6¹ç6¹à6¹Ù6¹Ò6¹Ë6¹Ä6¹½6¹¶6¹¯6¹¨6¹¡6¹š6¹“6¹Œ6¹…6¹~6¹w6¹p6¹i6¹b6¹[6¹T6¹M6¹F6¹?6¹86¹16¹*6¹#6¹6¹6¹6¹6¹6¹ù5¹ò5¹ë5¹ä5¹Ý5¹Ö5¹Ï5¹È5¹Á5¹º5¹³5¹¬5¹¥5¹ž5¹—5¹5¹‰5¹‚5¹{5¹t5¹m5¹f5¹_5¹X5¹Q5¹J5¹C5¹<5¹55¹.5¹'5¹ 5¹5¹5¹ 5¹5¹ý4¹ö4¹ï4¹è4¹á4¹Ú4¹Ó4¹Ì4¹Å4¹¾4¹·4¹°4¹©4¹¢4¹›4¹”4¹4¹†4¹4¹x4¹q4¹j4¹c4¹\4¹U4¹N4¹G4¹@4¹94¹24¹+4¹$4¹4¹4¹4¹4¹4¹ú3¹ó3¹ì3¹å3¹Þ3¹×3¹Ð3¹É3¹Â3¹»3¹´3¹­3¹¦3¹Ÿ3¹˜3¹‘3¹Š3¹ƒ3¹|3¹u3¹n3¹g3¹`3¹Y3¹R3¹K3¹D3¹=3¹63¹/3¹(3¹!3¹3¹3¹ 3¹3¹þ2¹÷2¹ð2¹é2¹â2¹Û2¹Ô2¹Í2¹Æ2¹¿2¹¸2¹±2¹ª2¹£2¹œ2¹•2¹Ž2¹‡2¹€2¹y2¹r2¹k2¹d2¹]2¹V2¹O2¹H2¹A2¹:2¹32¹,2¹%2¹2¹2¹2¹ 2¹2¹û1¹ô1¹í1¹æ1¹ß1¹Ø1¹Ñ1¹Ê1¹Ã1¹¼1¹µ1¹®1¹§1¹ 1¹™1¹’1¹‹1¹„1¹}1¹v1¹o1¹h1¹a1¹Z1¹S1¹L1¹E1¹>1¹71¹01¹)1¹"1¹1¹1¹ 1¹1¹ÿ0¹ø0¹ñ0¹ê0¹ã0¹Ü0¹Õ0¹Î0¹Ç0¹À0¹¹0¹²0¹«0¹¤0¹0¹–0¹0¹ˆ0¹0¹z0¹s0¹l0¹e0¹^0¹W0¹P0¹I0¹B0¹;0¹40¹-0¹&0¹0¹0¹0¹ 0¹0¹ü/¹õ/¹î/¹ç/¹à/¹Ù/¹Ò/¹Ë/¹Ä/¹½/¹¶/¹¯/¹¨/¹¡/¹š/¹“/¹Œ/¹…/¹~/¹w/¹p/¹i/¹b/¹[/¹T/¹M/¹F/¹?/¹8/¹1/¹*/¹#/¹/¹/¹/¹/¹/¹ù.¹ò.¹ë.¹ä.¹Ý.¹Ö.¹Ï.¹È.¹Á.¹º.¹³.¹¬.¹¥.¹ž.¹—.¹.¹‰.¹‚.¹{.¹t.¹m.¹f.¹_.¹X.¹Q.¹J.¹C.¹<.¹5.¹..¹'.¹ .¹.¹.¹ .¹.¹ý-¹ö-¹ï-¹è-¹á-¹Ú-¹Ó-¹Ì-¹Å-¹¾-¹·-¹°-¹©-¹¢-¹›-¹”-¹-¹†-¹-¹x-¹q-¹j-¹c-¹\-¹U-¹N-¹G-¹@-¹9-¹2-¹+-¹$-¹-¹-¹-¹-¹-¹ú,¹ó,¹ì,¹å,¹Þ,¹×,¹Ð,¹É,¹Â,¹»,¹´,¹­,¹¦,¹Ÿ,¹˜,¹‘,¹Š,¹ƒ,¹|,¹u,¹n,¹g,¹`,¹Y,¹R,¹K,¹D,¹=,¹6,¹/,¹(,¹!,¹,¹,¹ ,¹,¹þ+¹÷+¹ð+¹é+¹â+¹Û+¹Ô+¹Í+¹Æ+¹¿+¹¸+¹±+¹ª+¹£+¹œ+¹•+¹Ž+¹‡+¹€+¹y+¹r+¹k+¹d+¹]+¹V+¹O+¹H+¹A+¹:+¹3+¹,+¹%+¹+¹+¹+¹ +¹+¹û*¹ô*¹í*¹æ*¹ß*¹Ø*¹Ñ*¹Ê*¹Ã*¹¼*¹µ*¹®*¹§*¹ *¹™*¹’*¹‹*¹„*¹}*¹v*¹o*¹h*¹a*¹Z*¹S*¹L*¹E*¹>*¹7*¹0*¹)*¹"*¹*¹*¹ *¹*¹ÿ)¹ø)¹ñ)¹ê)¹ã)¹Ü)¹Õ)¹Î)¹Ç)¹À)¹¹)¹²)¹«)¹¤)¹)¹–)¹)¹ˆ)¹)¹z)¹s)¹l)¹e)¹^)¹W)¹P)¹I)¹B)¹;)¹4)¹-)¹&)¹)¹)¹)¹ )¹)¹ü(¹õ(¹î(¹ç(¹à(¹Ù(¹Ò(¹Ë(¹Ä(¹½(¹¶(¹¯(¹¨(¹¡(¹š(¹“(¹Œ(¹…(¹~(¹w(¹p(¹i(¹b(¹[(¹T(¹M(¹F(¹?(¹8(¹1(¹*(¹#(¹(¹(¹(¹(¹(¹ù'¹ò'¹ë'¹ä'¹Ý'¹Ö'¹Ï'¹È'¹Á'¹º'¹³'¹¬'¹¥'¹ž'¹—'¹'¹‰'¹‚'¹{'¹t'¹m'¹f'¹_'¹X'¹Q'¹J'¹C'¹<'¹5'¹.'¹''¹ '¹'¹'¹ '¹'¹ý&¹ö&¹ï&¹è&¹á&¹Ú&¹Ó&¹Ì&¹Å&¹¾&¹·&¹°&¹©&¹¢&¹›&¹”&¹&¹†&¹&¹x&¹q&¹j&¹c&¹\&¹U&¹N&¹G&¹@&¹9&¹2&¹+&¹$&¹&¹&¹&¹&¹&¹ú%¹ó%¹ì%¹å%¹Þ%¹×%¹Ð%¹É%¹Â%¹»%¹´%¹­%¹¦%¹Ÿ%¹˜%¹‘%¹Š%¹ƒ%¹|%¹u%¹n%¹g%¹`%¹Y%¹R%¹K%¹D%¹=%¹6%¹/%¹(%¹!%¹%¹%¹ %¹%¹þ$¹÷$¹ð$¹é$¹â$¹Û$¹Ô$¹Í$¹Æ$¹¿$¹¸$¹±$¹ª$¹£$¹œ$¹•$¹Ž$¹‡$¹€$¹y$¹r$¹k$¹d$¹]$¹V$¹O$¹H$¹A$¹:$¹3$¹,$¹%$¹$¹$¹$¹ $¹$¹û#¹ô#¹í#¹æ#¹ß#¹Ø#¹Ñ#¹Ê#¹Ã#¹¼#¹µ#¹®#¹§#¹ #¹™#¹’#¹‹#¹„#¹}#¹v#¹o#¹h#¹a#¹Z#¹S#¹L#¹E#¹>#¹7#¹0#¹)#¹"#¹#¹#¹ #¹#¹ÿ"¹ø"¹ñ"¹ê"¹ã"¹Ü"¹Õ"¹Î"¹Ç"¹À"¹¹"¹²"¹«"¹¤"¹"¹–"¹"¹ˆ"¹"¹z"¹s"¹l"¹e"¹^"¹W"¹P"¹I"¹B"¹;"¹4"¹-"¹&"¹"¹"¹"¹ "¹"¹ü!¹õ!¹î!¹ç!¹à!¹Ù!¹Ò!¹Ë!¹Ä!¹½!¹¶!¹¯!¹¨!¹¡!¹š!¹“!¹Œ!¹…!¹~!¹w!¹p!¹i!¹b!¹[!¹T!¹M!¹F!¹?!¹8!¹1!¹*!¹#!¹!¹!¹!¹!¹!¹ù ¹ò ¹ë ¹ä ¹Ý ¹Ö ¹Ï ¹È ¹Á ¹º ¹³ ¹¬ ¹¥ ¹ž ¹— ¹ ¹‰ ¹‚ ¹{ ¹t ¹m ¹f ¹_ ¹X ¹Q ¹J ¹C ¹< ¹5 ¹. ¹' ¹ ¹ ¹ ¹ ¹ ¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹Ì¹Å¹¾¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¹ó¹ì¹å¹Þ¹×¹Ð¹É¹Â¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹Š¹ƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¹ô¹í¹æ¹ß¹Ø¹Ñ¹Ê¹Ã¹¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¹ø¹ñ¹ê¹ã¹Ü¹Õ¹Î¹Ç¹À¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¹õ¹î¹ç¹à¹Ù¹Ò¹Ë¹Ä¹½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¹ò¹ë¹ä¹Ý¹Ö¹Ï¹È¹Á¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹Ì¹Å¹¾¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¹ó¹ì¹å¹Þ¹×¹Ð¹É¹Â¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹Š¹ƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¹ô¹í¹æ¹ß¹Ø¹Ñ¹Ê¹Ã¹¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¹ø¹ñ¹ê¹ã¹Ü¹Õ¹Î¹Ç¹À¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¹õ¹î¹ç¹à¹Ù¹Ò¹Ë¹Ä¹½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¹ò¹ë¹ä¹Ý¹Ö¹Ï¹È¹Á¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹Ì¹Å¹¾¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¹ó¹ì¹å¹Þ¹×¹Ð¹É¹Â¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹Š¹ƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¹ô¹í¹æ¹ß¹Ø¹Ñ¹Ê¹Ã¹¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ ¹ø ¹ñ ¹ê ¹ã ¹Ü ¹Õ ¹Î ¹Ç ¹À ¹¹ ¹² ¹« ¹¤ ¹ ¹– ¹ ¹ˆ ¹ ¹z ¹s ¹l ¹e ¹^ ¹W ¹P ¹I ¹B ¹; ¹4 ¹- ¹& ¹ ¹ ¹ ¹ ¹ ¹ü ¹õ ¹î ¹ç ¹à ¹Ù ¹Ò ¹Ë ¹Ä ¹½ ¹¶ ¹¯ ¹¨ ¹¡ ¹š ¹“ ¹Œ ¹… ¹~ ¹w ¹p ¹i ¹b ¹[ ¹T ¹M ¹F ¹? ¹8 ¹1 ¹* ¹# ¹ ¹ ¹ ¹ ¹ ¹ù ¹ò ¹ë ¹ä ¹Ý ¹Ö ¹Ï ¹È ¹Á ¹º ¹³ ¹¬ ¹¥ ¹ž ¹— ¹ ¹‰ ¹‚ ¹{ ¹t ¹m ¹f ¹_ ¹X ¹Q ¹J ¹C ¹< ¹5 ¹. ¹' ¹ ¹ ¹ ¹ ¹ ¹ý ¹ö ¹ï ¹è ¹á ¹Ú ¹Ó ¹Ì ¹Å ¹¾ ¹· ¹° ¹© ¹¢ ¹› ¹” ¹ ¹† ¹ ¹x ¹q ¹j ¹c ¹\ ¹U ¹N ¹G ¹@ ¹9 ¹2 ¹+ ¹$ ¹ ¹ ¹ ¹ ¹ ¹ú ¹ó ¹ì ¹å ¹Þ ¹× ¹Ð ¹É ¹ ¹» ¹´ ¹­ ¹¦ ¹Ÿ ¹˜ ¹‘ ¹Š ¹ƒ ¹| ¹u ¹n ¹g ¹` ¹Y ¹R ¹K ¹D ¹= ¹6 ¹/ ¹( ¹! ¹ ¹ ¹ ¹ ¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¹ô¹í¹æ¹ß¹Ø¹Ñ¹Ê¹Ã¹¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¹ø¹ñ¹ê¹ã¹Ü¹Õ¹Î¹Ç¹À¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¹õ¹î¹ç¹à¹Ù¹Ò¹Ë¹Ä¹½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¹ò¹ë¹ä¹Ý¹Ö¹Ï¹È¹Á¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¹ö¹ï¹è¹á¹Ú¹Ó¹Ì¹Å¹¾¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¹ó¹ì¹å¹Þ¹×¹Ð¹É¹Â¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹Š¹ƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¹÷¹ð¹é¹â¹Û¹Ô¹Í¹Æ¹¿¹¸¹±¹ª¹£¹œ¹•¹Ž¹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¹ô¹í¹æ¹ß¹عѹʹù¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿÿ¸øÿ¸ñÿ¸êÿ¸ãÿ¸Üÿ¸Õÿ¸Îÿ¸Çÿ¸Àÿ¸¹ÿ¸²ÿ¸«ÿ¸¤ÿ¸ÿ¸–ÿ¸ÿ¸ˆÿ¸ÿ¸zÿ¸sÿ¸lÿ¸eÿ¸^ÿ¸Wÿ¸Pÿ¸Iÿ¸Bÿ¸;ÿ¸4ÿ¸-ÿ¸&ÿ¸ÿ¸ÿ¸ÿ¸ ÿ¸ÿ¸üþ¸õþ¸îþ¸çþ¸àþ¸Ùþ¸Òþ¸Ëþ¸Äþ¸½þ¸¶þ¸¯þ¸¨þ¸¡þ¸šþ¸“þ¸Œþ¸…þ¸~þ¸wþ¸pþ¸iþ¸bþ¸[þ¸Tþ¸Mþ¸Fþ¸?þ¸8þ¸1þ¸*þ¸#þ¸þ¸þ¸þ¸þ¸þ¸ùý¸òý¸ëý¸äý¸Ýý¸Öý¸Ïý¸Èý¸Áý¸ºý¸³ý¸¬ý¸¥ý¸žý¸—ý¸ý¸‰ý¸‚ý¸{ý¸tý¸mý¸fý¸_ý¸Xý¸Qý¸Jý¸Cý¸<ý¸5ý¸.ý¸'ý¸ ý¸ý¸ý¸ ý¸ý¸ýü¸öü¸ïü¸èü¸áü¸Úü¸Óü¸Ìü¸Åü¸¾ü¸·ü¸°ü¸©ü¸¢ü¸›ü¸”ü¸ü¸†ü¸ü¸xü¸qü¸jü¸cü¸\ü¸Uü¸Nü¸Gü¸@ü¸9ü¸2ü¸+ü¸$ü¸ü¸ü¸ü¸ü¸ü¸úû¸óû¸ìû¸åû¸Þû¸×û¸Ðû¸Éû¸Âû¸»û¸´û¸­û¸¦û¸Ÿû¸˜û¸‘û¸Šû¸ƒû¸|û¸uû¸nû¸gû¸`û¸Yû¸Rû¸Kû¸Dû¸=û¸6û¸/û¸(û¸!û¸û¸û¸ û¸û¸þú¸÷ú¸ðú¸éú¸âú¸Ûú¸Ôú¸Íú¸Æú¸¿ú¸¸ú¸±ú¸ªú¸£ú¸œú¸•ú¸Žú¸‡ú¸€ú¸yú¸rú¸kú¸dú¸]ú¸Vú¸Oú¸Hú¸Aú¸:ú¸3ú¸,ú¸%ú¸ú¸ú¸ú¸ ú¸ú¸ûù¸ôù¸íù¸æù¸ßù¸Øù¸Ñù¸Êù¸Ãù¸¼ù¸µù¸®ù¸§ù¸ ù¸™ù¸’ù¸‹ù¸„ù¸}ù¸vù¸où¸hù¸aù¸Zù¸Sù¸Lù¸Eù¸>ù¸7ù¸0ù¸)ù¸"ù¸ù¸ù¸ ù¸ù¸ÿø¸øø¸ñø¸êø¸ãø¸Üø¸Õø¸Îø¸Çø¸Àø¸¹ø¸²ø¸«ø¸¤ø¸ø¸–ø¸ø¸ˆø¸ø¸zø¸sø¸lø¸eø¸^ø¸Wø¸Pø¸Iø¸Bø¸;ø¸4ø¸-ø¸&ø¸ø¸ø¸ø¸ ø¸ø¸ü÷¸õ÷¸î÷¸ç÷¸à÷¸Ù÷¸Ò÷¸Ë÷¸Ä÷¸½÷¸¶÷¸¯÷¸¨÷¸¡÷¸š÷¸“÷¸Œ÷¸…÷¸~÷¸w÷¸p÷¸i÷¸b÷¸[÷¸T÷¸M÷¸F÷¸?÷¸8÷¸1÷¸*÷¸#÷¸÷¸÷¸÷¸÷¸÷¸ùö¸òö¸ëö¸äö¸Ýö¸Öö¸Ïö¸Èö¸Áö¸ºö¸³ö¸¬ö¸¥ö¸žö¸—ö¸ö¸‰ö¸‚ö¸{ö¸tö¸mö¸fö¸_ö¸Xö¸Qö¸Jö¸Cö¸<ö¸5ö¸.ö¸'ö¸ ö¸ö¸ö¸ ö¸ö¸ýõ¸öõ¸ïõ¸èõ¸áõ¸Úõ¸Óõ¸Ìõ¸Åõ¸¾õ¸·õ¸°õ¸©õ¸¢õ¸›õ¸”õ¸õ¸†õ¸õ¸xõ¸qõ¸jõ¸cõ¸\õ¸Uõ¸Nõ¸Gõ¸@õ¸9õ¸2õ¸+õ¸$õ¸õ¸õ¸õ¸õ¸õ¸úô¸óô¸ìô¸åô¸Þô¸×ô¸Ðô¸Éô¸Âô¸»ô¸´ô¸­ô¸¦ô¸Ÿô¸˜ô¸‘ô¸Šô¸ƒô¸|ô¸uô¸nô¸gô¸`ô¸Yô¸Rô¸Kô¸Dô¸=ô¸6ô¸/ô¸(ô¸!ô¸ô¸ô¸ ô¸ô¸þó¸÷ó¸ðó¸éó¸âó¸Ûó¸Ôó¸Íó¸Æó¸¿ó¸¸ó¸±ó¸ªó¸£ó¸œó¸•ó¸Žó¸‡ó¸€ó¸yó¸ró¸kó¸dó¸]ó¸Vó¸Oó¸Hó¸Aó¸:ó¸3ó¸,ó¸%ó¸ó¸ó¸ó¸ ó¸ó¸ûò¸ôò¸íò¸æò¸ßò¸Øò¸Ñò¸Êò¸Ãò¸¼ò¸µò¸®ò¸§ò¸ ò¸™ò¸’ò¸‹ò¸„ò¸}ò¸vò¸oò¸hò¸aò¸Zò¸Sò¸Lò¸Eò¸>ò¸7ò¸0ò¸)ò¸"ò¸ò¸ò¸ ò¸ò¸ÿñ¸øñ¸ññ¸êñ¸ãñ¸Üñ¸Õñ¸Îñ¸Çñ¸Àñ¸¹ñ¸²ñ¸«ñ¸¤ñ¸ñ¸–ñ¸ñ¸ˆñ¸ñ¸zñ¸sñ¸lñ¸eñ¸^ñ¸Wñ¸Pñ¸Iñ¸Bñ¸;ñ¸4ñ¸-ñ¸&ñ¸ñ¸ñ¸ñ¸ ñ¸ñ¸üð¸õð¸îð¸çð¸àð¸Ùð¸Òð¸Ëð¸Äð¸½ð¸¶ð¸¯ð¸¨ð¸¡ð¸šð¸“ð¸Œð¸…ð¸~ð¸wð¸pð¸ið¸bð¸[ð¸Tð¸Mð¸Fð¸?ð¸8ð¸1ð¸*ð¸#ð¸ð¸ð¸ð¸ð¸ð¸ùï¸òï¸ëï¸äï¸Ýï¸Öï¸Ïï¸Èï¸Á︺︳︬︥︞︗ï¸ï¸‰ï¸‚ï¸{ï¸tï¸mï¸fï¸_ï¸Xï¸Qï¸Jï¸Cï¸<ï¸5ï¸.ï¸'ï¸ ï¸ï¸ï¸ ï¸ï¸ýî¸öî¸ïî¸èî¸áî¸Úî¸Óî¸Ìî¸Åî¸î¸†î¸î¸xî¸qî¸jî¸cî¸\î¸Uî¸Nî¸Gî¸@î¸9î¸2î¸+î¸$î¸î¸î¸î¸î¸î¸úí¸óí¸ìí¸åí¸Þí¸×í¸Ðí¸Éí¸Âí¸»í¸´í¸­í¸¦í¸Ÿí¸˜í¸‘í¸Ší¸ƒí¸|í¸uí¸ní¸gí¸`í¸Yí¸Rí¸Kí¸Dí¸=í¸6í¸/í¸(í¸!í¸í¸í¸ í¸í¸þì¸÷ì¸ðì¸éì¸âì¸Ûì¸Ôì¸Íì¸Æì¸¿ì¸¸ì¸±ì¸ªì¸£ì¸œì¸•ì¸Žì¸‡ì¸€ì¸yì¸rì¸kì¸dì¸]ì¸Vì¸Oì¸Hì¸Aì¸:ì¸3ì¸,ì¸%ì¸ì¸ì¸ì¸ ì¸ì¸ûë¸ôë¸íë¸æë¸ßë¸Øë¸Ñë¸Êë¸Ã븼븵븮븧븠븙븒븋븄ë¸}ë¸vë¸oë¸hë¸aë¸Zë¸Së¸Lë¸Eë¸>ë¸7ë¸0ë¸)ë¸"ë¸ë¸ë¸ ë¸ë¸ÿê¸øê¸ñê¸êê¸ãê¸Üê¸Õê¸Îê¸Çê¸À긹긲긫긤ê¸ê¸–ê¸ê¸ˆê¸ê¸zê¸sê¸lê¸eê¸^ê¸Wê¸Pê¸Iê¸Bê¸;ê¸4ê¸-ê¸&ê¸ê¸ê¸ê¸ ê¸ê¸üé¸õé¸îé¸çé¸àé¸Ùé¸Òé¸Ëé¸Ä鸽鸶鸯鸨鸡鸚鸓鸌鸅é¸~é¸wé¸pé¸ié¸bé¸[é¸Té¸Mé¸Fé¸?é¸8é¸1é¸*é¸#é¸é¸é¸é¸é¸é¸ùè¸òè¸ëè¸äè¸Ýè¸Öè¸Ïè¸Èè¸Á踺踳踬踥踞踗è¸è¸‰è¸‚è¸{è¸tè¸mè¸fè¸_è¸Xè¸Qè¸Jè¸Cè¸<è¸5è¸.è¸'è¸ è¸è¸è¸ è¸è¸ýç¸öç¸ïç¸èç¸áç¸Úç¸Óç¸Ìç¸Å績縷縰縩縢縛縔ç¸ç¸†ç¸ç¸xç¸qç¸jç¸cç¸\ç¸Uç¸Nç¸Gç¸@ç¸9ç¸2ç¸+ç¸$ç¸ç¸ç¸ç¸ç¸ç¸úæ¸óæ¸ìæ¸忏Þæ¸׿¸Ðæ¸Éæ¸Â渻渴渭渦渟渘渑渊渃æ¸|æ¸uæ¸næ¸gæ¸`æ¸Yæ¸Ræ¸Kæ¸Dæ¸=æ¸6æ¸/æ¸(æ¸!æ¸æ¸æ¸ æ¸æ¸þå¸÷å¸ðå¸éå¸âå¸Ûå¸Ôå¸Íå¸Æå¸¿å¸¸å¸±å¸ªå¸£å¸œå¸•å¸Žå¸‡å¸€å¸yå¸rå¸kå¸då¸]å¸Vå¸Oå¸Hå¸Aå¸:å¸3å¸,å¸%å¸å¸å¸å¸ å¸å¸ûä¸ôä¸í䏿ä¸ß䏨ä¸Ñä¸Êä¸Ã丼丵丮丧丠丙丒下丄ä¸}ä¸vä¸oä¸hä¸aä¸Zä¸Sä¸Lä¸Eä¸>ä¸7ä¸0ä¸)ä¸"ä¸ä¸ä¸ ä¸ä¸ÿã¸øã¸ñã¸êã¸ãã¸Üã¸Õã¸Îã¸Çã¸À㸹㸲㸫㸤ã¸ã¸–ã¸ã¸ˆã¸ã¸zã¸sã¸lã¸eã¸^ã¸Wã¸Pã¸Iã¸Bã¸;ã¸4ã¸-ã¸&ã¸ã¸ã¸ã¸ ã¸ã¸üâ¸õâ¸îâ¸çâ¸àâ¸Ùâ¸Òâ¸Ëâ¸Ä⸽⸶ⸯ⸨⸡⸚⸓⸌⸅â¸~â¸wâ¸pâ¸iâ¸bâ¸[â¸Tâ¸Mâ¸Fâ¸?â¸8â¸1â¸*â¸#â¸â¸â¸â¸â¸â¸ùá¸òá¸ëá¸äá¸Ýá¸Öá¸Ïá¸Èá¸ÁḺḳḬḥḞḗá¸á¸‰á¸‚á¸{á¸tá¸má¸fá¸_á¸Xá¸Qá¸Já¸Cá¸<á¸5á¸.á¸'Ḡá¸á¸á¸ á¸á¸ýà¸öà¸ïà¸èà¸áà¸Úà¸Óà¸Ìà¸Å฾ืะษยปดà¸à¸†à¸à¸xà¸qà¸jà¸cà¸\à¸Uà¸Nà¸Gà¸@à¸9à¸2à¸+à¸$à¸à¸à¸à¸à¸à¸ú߸ó߸ì߸å߸Þ߸×߸Ð߸É߸Â߸»ß¸´ß¸­ß¸¦ß¸Ÿß¸˜ß¸‘߸Šß¸ƒß¸|߸u߸n߸g߸`߸Y߸R߸K߸D߸=߸6߸/߸(߸!߸߸߸ ߸߸þÞ¸÷Þ¸ðÞ¸éÞ¸âÞ¸ÛÞ¸ÔÞ¸ÍÞ¸ÆÞ¸¿Þ¸¸Þ¸±Þ¸ªÞ¸£Þ¸œÞ¸•Þ¸ŽÞ¸‡Þ¸€Þ¸yÞ¸rÞ¸kÞ¸dÞ¸]Þ¸VÞ¸OÞ¸HÞ¸AÞ¸:Þ¸3Þ¸,Þ¸%Þ¸Þ¸Þ¸Þ¸ Þ¸Þ¸ûݸôݸíݸæÝ¸ßݸØÝ¸ÑݸÊݸÃݸ¼Ý¸µÝ¸®Ý¸§Ý¸ Ý¸™Ý¸’ݸ‹Ý¸„ݸ}ݸvݸoݸhݸaݸZݸSݸLݸEݸ>ݸ7ݸ0ݸ)ݸ"ݸݸݸ ݸݸÿܸøÜ¸ñܸêܸãܸÜܸÕܸÎܸÇܸÀܸ¹Ü¸²Ü¸«Ü¸¤Ü¸ܸ–ܸܸˆÜ¸ܸzܸsܸlܸeܸ^ܸWܸPܸIܸBܸ;ܸ4ܸ-ܸ&ܸܸܸܸ ܸܸüÛ¸õÛ¸îÛ¸çÛ¸àÛ¸ÙÛ¸ÒÛ¸ËÛ¸ÄÛ¸½Û¸¶Û¸¯Û¸¨Û¸¡Û¸šÛ¸“Û¸ŒÛ¸…Û¸~Û¸wÛ¸pÛ¸iÛ¸bÛ¸[Û¸TÛ¸MÛ¸FÛ¸?Û¸8Û¸1Û¸*Û¸#Û¸Û¸Û¸Û¸Û¸Û¸ùÚ¸òÚ¸ëÚ¸äÚ¸ÝÚ¸ÖÚ¸ÏÚ¸ÈÚ¸ÁÚ¸ºÚ¸³Ú¸¬Ú¸¥Ú¸žÚ¸—Ú¸Ú¸‰Ú¸‚Ú¸{Ú¸tÚ¸mÚ¸fÚ¸_Ú¸XÚ¸QÚ¸JÚ¸CÚ¸<Ú¸5Ú¸.Ú¸'Ú¸ Ú¸Ú¸Ú¸ Ú¸Ú¸ýÙ¸öÙ¸ïÙ¸èÙ¸áÙ¸ÚÙ¸ÓÙ¸ÌÙ¸ÅÙ¸¾Ù¸·Ù¸°Ù¸©Ù¸¢Ù¸›Ù¸”ٸٸ†Ù¸Ù¸xÙ¸qÙ¸jÙ¸cÙ¸\Ù¸UÙ¸NÙ¸GÙ¸@Ù¸9Ù¸2Ù¸+Ù¸$ٸٸٸٸٸٸúظóظìØ¸娏ÞØ¸ר¸ÐØ¸ÉØ¸Âظ»Ø¸´Ø¸­Ø¸¦Ø¸ŸØ¸˜Ø¸‘ظŠØ¸ƒØ¸|ظuظnظgظ`ظYظRظKظDظ=ظ6ظ/ظ(ظ!ظظظ ظظþ׸÷׸ð׸é׸â׸Û׸Ô׸Í׸Æ×¸¿×¸¸×¸±×¸ª×¸£×¸œ×¸•׸Ž×¸‡×¸€×¸y׸r׸k׸d׸]׸V׸O׸H׸A׸:׸3׸,׸%׸׸׸׸ ׸׸ûÖ¸ôÖ¸íÖ¸æÖ¸ßÖ¸ØÖ¸ÑÖ¸ÊÖ¸ÃÖ¸¼Ö¸µÖ¸®Ö¸§Ö¸ Ö¸™Ö¸’Ö¸‹Ö¸„Ö¸}Ö¸vÖ¸oÖ¸hÖ¸aÖ¸ZÖ¸SÖ¸LÖ¸EÖ¸>Ö¸7Ö¸0Ö¸)Ö¸"Ö¸Ö¸Ö¸ Ö¸Ö¸ÿÕ¸øÕ¸ñÕ¸êÕ¸ãÕ¸ÜÕ¸ÕÕ¸ÎÕ¸ÇÕ¸ÀÕ¸¹Õ¸²Õ¸«Õ¸¤Õ¸Õ¸–Õ¸Õ¸ˆÕ¸Õ¸zÕ¸sÕ¸lÕ¸eÕ¸^Õ¸WÕ¸PÕ¸IÕ¸BÕ¸;Õ¸4Õ¸-Õ¸&Õ¸Õ¸Õ¸Õ¸ Õ¸Õ¸üÔ¸õÔ¸îÔ¸çÔ¸àÔ¸ÙÔ¸ÒÔ¸ËÔ¸ÄÔ¸½Ô¸¶Ô¸¯Ô¸¨Ô¸¡Ô¸šÔ¸“Ô¸ŒÔ¸…Ô¸~Ô¸wÔ¸pÔ¸iÔ¸bÔ¸[Ô¸TÔ¸MÔ¸FÔ¸?Ô¸8Ô¸1Ô¸*Ô¸#Ô¸Ô¸Ô¸Ô¸Ô¸Ô¸ùÓ¸òÓ¸ëÓ¸äÓ¸ÝÓ¸ÖÓ¸ÏÓ¸ÈÓ¸ÁÓ¸ºÓ¸³Ó¸¬Ó¸¥Ó¸žÓ¸—Ó¸Ó¸‰Ó¸‚Ó¸{Ó¸tÓ¸mÓ¸fÓ¸_Ó¸XÓ¸QÓ¸JÓ¸CÓ¸<Ó¸5Ó¸.Ó¸'Ó¸ Ó¸Ó¸Ó¸ Ó¸Ó¸ýÒ¸öÒ¸ïÒ¸èÒ¸áÒ¸ÚÒ¸ÓÒ¸ÌÒ¸ÅÒ¸¾Ò¸·Ò¸°Ò¸©Ò¸¢Ò¸›Ò¸”Ò¸Ò¸†Ò¸Ò¸xÒ¸qÒ¸jÒ¸cÒ¸\Ò¸UÒ¸NÒ¸GÒ¸@Ò¸9Ò¸2Ò¸+Ò¸$Ò¸Ò¸Ò¸Ò¸Ò¸Ò¸úѸóѸìѸåѸÞѸ×ѸÐѸÉѸÂѸ»Ñ¸´Ñ¸­Ñ¸¦Ñ¸ŸÑ¸˜Ñ¸‘ѸŠÑ¸ƒÑ¸|ѸuѸnѸgѸ`ѸYѸRѸKѸDѸ=Ѹ6Ѹ/Ѹ(Ѹ!ѸѸѸ ѸѸþи÷иðиéиâиÛиÔиÍиÆÐ¸¿Ð¸¸Ð¸±Ð¸ªÐ¸£Ð¸œÐ¸•иŽÐ¸‡Ð¸€Ð¸yиrиkиdи]иVиOиHиAи:и3и,и%ииии ииûϸôϸíϸæÏ¸ßϸØÏ¸ÑϸÊϸÃϸ¼Ï¸µÏ¸®Ï¸§Ï¸ Ï¸™Ï¸’ϸ‹Ï¸„ϸ}ϸvϸoϸhϸaϸZϸSϸLϸEϸ>ϸ7ϸ0ϸ)ϸ"ϸϸϸ ϸϸÿθøÎ¸ñθêθãθÜθÕθÎθÇθÀθ¹Î¸²Î¸«Î¸¤Î¸θ–θθˆÎ¸θzθsθlθeθ^θWθPθIθBθ;θ4θ-θ&θθθθ θθü͸õ͸î͸ç͸à͸Ù͸Ò͸Ë͸Ä͸½Í¸¶Í¸¯Í¸¨Í¸¡Í¸šÍ¸“͸ŒÍ¸…͸~͸w͸p͸i͸b͸[͸T͸M͸F͸?͸8͸1͸*͸#͸͸͸͸͸͸ù̸ò̸ë̸ä̸Ý̸Ö̸Ï̸È̸Á̸ºÌ¸³Ì¸¬Ì¸¥Ì¸žÌ¸—̸̸‰Ì¸‚̸{̸t̸m̸f̸_̸X̸Q̸J̸C̸≮5̸.̸'̸ ̸̸̸ ̸̸ý˸ö˸ï˸è˸á˸Ú˸Ó˸Ì˸Å˸¾Ë¸·Ë¸°Ë¸©Ë¸¢Ë¸›Ë¸”˸˸†Ë¸˸x˸q˸j˸c˸\˸U˸N˸G˸@˸9˸2˸+˸$˸˸˸˸˸˸úʸóʸìʸåʸÞʸ×ʸÐʸÉʸÂʸ»Ê¸´Ê¸­Ê¸¦Ê¸ŸÊ¸˜Ê¸‘ʸŠÊ¸ƒÊ¸|ʸuʸnʸgʸ`ʸYʸRʸKʸDʸ=ʸ6ʸ/ʸ(ʸ!ʸʸʸ ʸʸþɸ÷ɸðɸéɸâɸÛɸÔɸÍɸÆÉ¸¿É¸¸É¸±É¸ªÉ¸£É¸œÉ¸•ɸŽÉ¸‡É¸€É¸yɸrɸkɸdɸ]ɸVɸOɸHɸAɸ:ɸ3ɸ,ɸ%ɸɸɸɸ ɸɸûȸôȸíȸæÈ¸ßȸØÈ¸ÑȸÊȸÃȸ¼È¸µÈ¸®È¸§È¸ È¸™È¸’ȸ‹È¸„ȸ}ȸvȸoȸhȸaȸZȸSȸLȸEȸ>ȸ7ȸ0ȸ)ȸ"ȸȸȸ ȸȸÿǸøÇ¸ñǸêǸãǸÜǸÕǸÎǸÇǸÀǸ¹Ç¸²Ç¸«Ç¸¤Ç¸Ǹ–ǸǸˆÇ¸ǸzǸsǸlǸeǸ^ǸWǸPǸIǸBǸ;Ǹ4Ǹ-Ǹ&ǸǸǸǸ ǸǸüƸõƸîÆ¸çÆ¸àÆ¸ÙÆ¸ÒÆ¸ËÆ¸ÄƸ½Æ¸¶Æ¸¯Æ¸¨Æ¸¡Æ¸šÆ¸“ƸŒÆ¸…Ƹ~ƸwƸpƸiƸbƸ[ƸTƸMƸFƸ?Ƹ8Ƹ1Ƹ*Ƹ#ƸƸƸƸƸƸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºÅ¸³Å¸¬Å¸¥Å¸žÅ¸—ŸŸ‰Å¸‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýĸöĸïĸèĸáĸÚĸÓĸÌĸÅĸ¾Ä¸·Ä¸°Ä¸©Ä¸¢Ä¸›Ä¸”ĸĸ†Ä¸ĸxĸqĸjĸcĸ\ĸUĸNĸGĸ@ĸ9ĸ2ĸ+ĸ$ĸĸĸĸĸĸúøóøìøåøÞø×øÐøÉøÂø»Ã¸´Ã¸­Ã¸¦Ã¸ŸÃ¸˜Ã¸‘øŠÃ¸ƒÃ¸|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ¸÷¸ð¸é¸â¸Û¸Ô¸͸ÆÂ¸¿Â¸¸Â¸±Â¸ªÂ¸£Â¸œÂ¸•¸ŽÂ¸‡Â¸€Â¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸ûÁ¸ôÁ¸íÁ¸æÁ¸ßÁ¸ØÁ¸ÑÁ¸ÊÁ¸ÃÁ¸¼Á¸µÁ¸®Á¸§Á¸ Á¸™Á¸’Á¸‹Á¸„Á¸}Á¸vÁ¸oÁ¸hÁ¸aÁ¸ZÁ¸SÁ¸LÁ¸EÁ¸>Á¸7Á¸0Á¸)Á¸"Á¸Á¸Á¸ Á¸Á¸ÿÀ¸øÀ¸ñÀ¸êÀ¸ãÀ¸ÜÀ¸ÕÀ¸ÎÀ¸ÇÀ¸ÀÀ¸¹À¸²À¸«À¸¤À¸À¸–À¸À¸ˆÀ¸À¸zÀ¸sÀ¸lÀ¸eÀ¸^À¸WÀ¸PÀ¸IÀ¸BÀ¸;À¸4À¸-À¸&À¸À¸À¸À¸ À¸À¸ü¿¸õ¿¸翸࿸Ù¿¸Ò¿¸Ë¿¸Ä¿¸½¿¸¶¿¸¯¿¸¨¿¸¡¿¸š¿¸“¿¸Œ¿¸…¿¸~¿¸w¿¸p¿¸i¿¸b¿¸[¿¸T¿¸M¿¸F¿¸?¿¸8¿¸1¿¸*¿¸#¿¸¿¸¿¸¿¸¿¸¿¸ù¾¸ò¾¸뾸侸ݾ¸Ö¾¸Ͼ¸Ⱦ¸Á¾¸º¾¸³¾¸¬¾¸¥¾¸ž¾¸—¾¸¾¸‰¾¸‚¾¸{¾¸t¾¸m¾¸f¾¸_¾¸X¾¸Q¾¸J¾¸C¾¸<¾¸5¾¸.¾¸'¾¸ ¾¸¾¸¾¸ ¾¸¾¸ý½¸ö½¸ク轸ὸÚ½¸Ó½¸̽¸ޏ¾½¸·½¸°½¸©½¸¢½¸›½¸”½¸½¸†½¸½¸x½¸q½¸j½¸c½¸\½¸U½¸N½¸G½¸@½¸9½¸2½¸+½¸$½¸½¸½¸½¸½¸½¸ú¼¸ó¼¸켸弸Þ¼¸×¼¸м¸ɼ¸¼¸»¼¸´¼¸­¼¸¦¼¸Ÿ¼¸˜¼¸‘¼¸м¸ƒ¼¸|¼¸u¼¸n¼¸g¼¸`¼¸Y¼¸R¼¸K¼¸D¼¸=¼¸6¼¸/¼¸(¼¸!¼¸¼¸¼¸ ¼¸¼¸þ»¸÷»¸ð»¸黸⻸Û»¸Ô»¸Í»¸Æ»¸¿»¸¸»¸±»¸ª»¸£»¸œ»¸•»¸Ž»¸‡»¸€»¸y»¸r»¸k»¸d»¸]»¸V»¸O»¸H»¸A»¸:»¸3»¸,»¸%»¸»¸»¸»¸ »¸»¸ûº¸ôº¸íº¸溸ߺ¸غ¸Ѻ¸ʺ¸ú¸¼º¸µº¸®º¸§º¸ º¸™º¸’º¸‹º¸„º¸}º¸vº¸oº¸hº¸aº¸Zº¸Sº¸Lº¸Eº¸>º¸7º¸0º¸)º¸"º¸º¸º¸ º¸º¸ÿ¹¸ø¹¸ñ¹¸깸㹸ܹ¸Õ¹¸ι¸ǹ¸À¹¸¹¹¸²¹¸«¹¸¤¹¸¹¸–¹¸¹¸ˆ¹¸¹¸z¹¸s¹¸l¹¸e¹¸^¹¸W¹¸P¹¸I¹¸B¹¸;¹¸4¹¸-¹¸&¹¸¹¸¹¸¹¸ ¹¸¹¸ü¸¸õ¸¸縸ุÙ¸¸Ò¸¸˸¸ĸ¸½¸¸¶¸¸¯¸¸¨¸¸¡¸¸š¸¸“¸¸Œ¸¸…¸¸~¸¸w¸¸p¸¸i¸¸b¸¸[¸¸T¸¸M¸¸F¸¸?¸¸8¸¸1¸¸*¸¸#¸¸¸¸¸¸¸¸¸¸¸¸ù·¸ò·¸ë·¸ä·¸Ý·¸Ö·¸Ï·¸È·¸Á·¸º·¸³·¸¬·¸¥·¸ž·¸—·¸·¸‰·¸‚·¸{·¸t·¸m·¸f·¸_·¸X·¸Q·¸J·¸C·¸<·¸5·¸.·¸'·¸ ·¸·¸·¸ ·¸·¸ý¶¸ö¶¸ﶸ趸ᶸÚ¶¸Ó¶¸̶¸Ŷ¸¾¶¸·¶¸°¶¸©¶¸¢¶¸›¶¸”¶¸¶¸†¶¸¶¸x¶¸q¶¸j¶¸c¶¸\¶¸U¶¸N¶¸G¶¸@¶¸9¶¸2¶¸+¶¸$¶¸¶¸¶¸¶¸¶¸¶¸úµ¸óµ¸쵸嵸Þµ¸×µ¸е¸ɵ¸µ¸»µ¸´µ¸­µ¸¦µ¸Ÿµ¸˜µ¸‘µ¸е¸ƒµ¸|µ¸uµ¸nµ¸gµ¸`µ¸Yµ¸Rµ¸Kµ¸Dµ¸=µ¸6µ¸/µ¸(µ¸!µ¸µ¸µ¸ µ¸µ¸þ´¸÷´¸ð´¸é´¸â´¸Û´¸Ô´¸Í´¸Æ´¸¿´¸¸´¸±´¸ª´¸£´¸œ´¸•´¸Ž´¸‡´¸€´¸y´¸r´¸k´¸d´¸]´¸V´¸O´¸H´¸A´¸:´¸3´¸,´¸%´¸´¸´¸´¸ ´¸´¸û³¸ô³¸í³¸泸ß³¸س¸ѳ¸ʳ¸ó¸¼³¸µ³¸®³¸§³¸ ³¸™³¸’³¸‹³¸„³¸}³¸v³¸o³¸h³¸a³¸Z³¸S³¸L³¸E³¸>³¸7³¸0³¸)³¸"³¸³¸³¸ ³¸³¸ÿ²¸ø²¸ñ²¸겸㲸ܲ¸Õ²¸β¸Dz¸À²¸¹²¸²²¸«²¸¤²¸²¸–²¸²¸ˆ²¸²¸z²¸s²¸l²¸e²¸^²¸W²¸P²¸I²¸B²¸;²¸4²¸-²¸&²¸²¸²¸²¸ ²¸²¸ü±¸õ±¸籸౸Ù±¸Ò±¸˱¸ı¸½±¸¶±¸¯±¸¨±¸¡±¸š±¸“±¸Œ±¸…±¸~±¸w±¸p±¸i±¸b±¸[±¸T±¸M±¸F±¸?±¸8±¸1±¸*±¸#±¸±¸±¸±¸±¸±¸ù°¸ò°¸ë°¸ä°¸ݰ¸Ö°¸ϰ¸Ȱ¸Á°¸º°¸³°¸¬°¸¥°¸ž°¸—°¸°¸‰°¸‚°¸{°¸t°¸m°¸f°¸_°¸X°¸Q°¸J°¸C°¸<°¸5°¸.°¸'°¸ °¸°¸°¸ °¸°¸ý¯¸ö¯¸ﯸ诸᯸Ú¯¸Ó¯¸̯¸ů¸¾¯¸·¯¸°¯¸©¯¸¢¯¸›¯¸”¯¸¯¸†¯¸¯¸x¯¸q¯¸j¯¸c¯¸\¯¸U¯¸N¯¸G¯¸@¯¸9¯¸2¯¸+¯¸$¯¸¯¸¯¸¯¸¯¸¯¸ú®¸ó®¸쮸宸Þ®¸×®¸Ю¸É®¸®¸»®¸´®¸­®¸¦®¸Ÿ®¸˜®¸‘®¸Š®¸ƒ®¸|®¸u®¸n®¸g®¸`®¸Y®¸R®¸K®¸D®¸=®¸6®¸/®¸(®¸!®¸®¸®¸ ®¸®¸þ­¸÷­¸ð­¸é­¸â­¸Û­¸Ô­¸Í­¸Æ­¸¿­¸¸­¸±­¸ª­¸£­¸œ­¸•­¸Ž­¸‡­¸€­¸y­¸r­¸k­¸d­¸]­¸V­¸O­¸H­¸A­¸:­¸3­¸,­¸%­¸­¸­¸­¸ ­¸­¸û¬¸ô¬¸í¬¸欸߬¸ج¸Ѭ¸ʬ¸ì¸¼¬¸µ¬¸®¬¸§¬¸ ¬¸™¬¸’¬¸‹¬¸„¬¸}¬¸v¬¸o¬¸h¬¸a¬¸Z¬¸S¬¸L¬¸E¬¸>¬¸7¬¸0¬¸)¬¸"¬¸¬¸¬¸ ¬¸¬¸ÿ«¸ø«¸ñ«¸꫸㫸Ü«¸Õ«¸Ϋ¸Ç«¸À«¸¹«¸²«¸««¸¤«¸«¸–«¸«¸ˆ«¸«¸z«¸s«¸l«¸e«¸^«¸W«¸P«¸I«¸B«¸;«¸4«¸-«¸&«¸«¸«¸«¸ «¸«¸üª¸õª¸窸સÙª¸Òª¸˪¸Ώ½ª¸¶ª¸¯ª¸¨ª¸¡ª¸šª¸“ª¸Œª¸…ª¸~ª¸wª¸pª¸iª¸bª¸[ª¸Tª¸Mª¸Fª¸?ª¸8ª¸1ª¸*ª¸#ª¸ª¸ª¸ª¸ª¸ª¸ù©¸ò©¸멸䩸Ý©¸Ö©¸Ï©¸È©¸Á©¸º©¸³©¸¬©¸¥©¸ž©¸—©¸©¸‰©¸‚©¸{©¸t©¸m©¸f©¸_©¸X©¸Q©¸J©¸C©¸<©¸5©¸.©¸'©¸ ©¸©¸©¸ ©¸©¸ý¨¸ö¨¸器訸ᨸÚ¨¸Ó¨¸̨¸Ũ¸¾¨¸·¨¸°¨¸©¨¸¢¨¸›¨¸”¨¸¨¸†¨¸¨¸x¨¸q¨¸j¨¸c¨¸\¨¸U¨¸N¨¸G¨¸@¨¸9¨¸2¨¸+¨¸$¨¸¨¸¨¸¨¸¨¸¨¸ú§¸ó§¸째姸Þ§¸×§¸Ч¸ɧ¸§¸»§¸´§¸­§¸¦§¸Ÿ§¸˜§¸‘§¸Ч¸ƒ§¸|§¸u§¸n§¸g§¸`§¸Y§¸R§¸K§¸D§¸=§¸6§¸/§¸(§¸!§¸§¸§¸ §¸§¸þ¦¸÷¦¸ð¦¸馸⦸Û¦¸Ô¦¸ͦ¸Ʀ¸¿¦¸¸¦¸±¦¸ª¦¸£¦¸œ¦¸•¦¸ަ¸‡¦¸€¦¸y¦¸r¦¸k¦¸d¦¸]¦¸V¦¸O¦¸H¦¸A¦¸:¦¸3¦¸,¦¸%¦¸¦¸¦¸¦¸ ¦¸¦¸û¥¸ô¥¸í¥¸楸ߥ¸Ø¥¸Ñ¥¸Ê¥¸Ã¥¸¼¥¸µ¥¸®¥¸§¥¸ ¥¸™¥¸’¥¸‹¥¸„¥¸}¥¸v¥¸o¥¸h¥¸a¥¸Z¥¸S¥¸L¥¸E¥¸>¥¸7¥¸0¥¸)¥¸"¥¸¥¸¥¸ ¥¸¥¸ÿ¤¸ø¤¸ñ¤¸ꤸ㤸ܤ¸Õ¤¸Τ¸Ǥ¸À¤¸¹¤¸²¤¸«¤¸¤¤¸¤¸–¤¸¤¸ˆ¤¸¤¸z¤¸s¤¸l¤¸e¤¸^¤¸W¤¸P¤¸I¤¸B¤¸;¤¸4¤¸-¤¸&¤¸¤¸¤¸¤¸ ¤¸¤¸ü£¸õ£¸磸ࣸÙ£¸Ò£¸Ë£¸Ä£¸½£¸¶£¸¯£¸¨£¸¡£¸š£¸“£¸Œ£¸…£¸~£¸w£¸p£¸i£¸b£¸[£¸T£¸M£¸F£¸?£¸8£¸1£¸*£¸#£¸£¸£¸£¸£¸£¸ù¢¸ò¢¸뢸䢸Ý¢¸Ö¢¸Ï¢¸È¢¸Á¢¸º¢¸³¢¸¬¢¸¥¢¸ž¢¸—¢¸¢¸‰¢¸‚¢¸{¢¸t¢¸m¢¸f¢¸_¢¸X¢¸Q¢¸J¢¸C¢¸<¢¸5¢¸.¢¸'¢¸ ¢¸¢¸¢¸ ¢¸¢¸ý¡¸ö¡¸衸ᡸÚ¡¸Ó¡¸Ì¡¸Å¡¸¾¡¸·¡¸°¡¸©¡¸¢¡¸›¡¸”¡¸¡¸†¡¸¡¸x¡¸q¡¸j¡¸c¡¸\¡¸U¡¸N¡¸G¡¸@¡¸9¡¸2¡¸+¡¸$¡¸¡¸¡¸¡¸¡¸¡¸ú ¸ó ¸ì ¸å ¸Þ ¸× ¸Р¸É ¸ ¸» ¸´ ¸­ ¸¦ ¸Ÿ ¸˜ ¸‘ ¸Š ¸ƒ ¸| ¸u ¸n ¸g ¸` ¸Y ¸R ¸K ¸D ¸= ¸6 ¸/ ¸( ¸! ¸ ¸ ¸  ¸ ¸þŸ¸÷Ÿ¸ðŸ¸韸⟸ÛŸ¸ÔŸ¸ÍŸ¸ÆŸ¸¿Ÿ¸¸Ÿ¸±Ÿ¸ªŸ¸£Ÿ¸œŸ¸•Ÿ¸ŽŸ¸‡Ÿ¸€Ÿ¸yŸ¸rŸ¸kŸ¸dŸ¸]Ÿ¸VŸ¸OŸ¸HŸ¸AŸ¸:Ÿ¸3Ÿ¸,Ÿ¸%Ÿ¸Ÿ¸Ÿ¸Ÿ¸ Ÿ¸Ÿ¸ûž¸ôž¸ힸ枸ßž¸Øž¸Ñž¸Êž¸Þ¸¼ž¸µž¸®ž¸§ž¸ ž¸™ž¸’ž¸‹ž¸„ž¸}ž¸vž¸ož¸hž¸až¸Zž¸Sž¸Lž¸Ež¸>ž¸7ž¸0ž¸)ž¸"ž¸ž¸ž¸ ž¸ž¸ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸üœ¸õœ¸眸àœ¸Ùœ¸Òœ¸Ëœ¸Äœ¸½œ¸¶œ¸¯œ¸¨œ¸¡œ¸šœ¸“œ¸Œœ¸…œ¸~œ¸wœ¸pœ¸iœ¸bœ¸[œ¸Tœ¸Mœ¸Fœ¸?œ¸8œ¸1œ¸*œ¸#œ¸œ¸œ¸œ¸œ¸œ¸ù›¸ò›¸뛸䛸Ý›¸Ö›¸Ï›¸È›¸Á›¸º›¸³›¸¬›¸¥›¸ž›¸—›¸›¸‰›¸‚›¸{›¸t›¸m›¸f›¸_›¸X›¸Q›¸J›¸C›¸<›¸5›¸.›¸'›¸ ›¸›¸›¸ ›¸›¸ýš¸öš¸蚸ᚸÚš¸Óš¸Ìš¸Åš¸¾š¸·š¸°š¸©š¸¢š¸›š¸”š¸š¸†š¸š¸xš¸qš¸jš¸cš¸\š¸Uš¸Nš¸Gš¸@š¸9š¸2š¸+š¸$š¸š¸š¸š¸š¸š¸ú™¸ó™¸외噸Þ™¸×™¸Й¸É™¸™¸»™¸´™¸­™¸¦™¸Ÿ™¸˜™¸‘™¸Š™¸ƒ™¸|™¸u™¸n™¸g™¸`™¸Y™¸R™¸K™¸D™¸=™¸6™¸/™¸(™¸!™¸™¸™¸ ™¸™¸þ˜¸÷˜¸ð˜¸阸☸Û˜¸Ô˜¸͘¸Ƙ¸¿˜¸¸˜¸±˜¸ª˜¸£˜¸œ˜¸•˜¸Ž˜¸‡˜¸€˜¸y˜¸r˜¸k˜¸d˜¸]˜¸V˜¸O˜¸H˜¸A˜¸:˜¸3˜¸,˜¸%˜¸˜¸˜¸˜¸ ˜¸˜¸û—¸ô—¸í—¸æ—¸ß—¸Ø—¸Ñ—¸Ê—¸׸¼—¸µ—¸®—¸§—¸ —¸™—¸’—¸‹—¸„—¸}—¸v—¸o—¸h—¸a—¸Z—¸S—¸L—¸E—¸>—¸7—¸0—¸)—¸"—¸—¸—¸ —¸—¸ÿ–¸ø–¸ñ–¸ê–¸ã–¸Ü–¸Õ–¸Ζ¸Ç–¸À–¸¹–¸²–¸«–¸¤–¸–¸––¸–¸ˆ–¸–¸z–¸s–¸l–¸e–¸^–¸W–¸P–¸I–¸B–¸;–¸4–¸-–¸&–¸–¸–¸–¸ –¸–¸ü•¸õ•¸畸à•¸Ù•¸Ò•¸Ë•¸Ä•¸½•¸¶•¸¯•¸¨•¸¡•¸š•¸“•¸Œ•¸…•¸~•¸w•¸p•¸i•¸b•¸[•¸T•¸M•¸F•¸?•¸8•¸1•¸*•¸#•¸•¸•¸•¸•¸•¸ù”¸ò”¸딸䔸Ý”¸Ö”¸Ï”¸È”¸Á”¸º”¸³”¸¬”¸¥”¸ž”¸—”¸”¸‰”¸‚”¸{”¸t”¸m”¸f”¸_”¸X”¸Q”¸J”¸C”¸<”¸5”¸.”¸'”¸ ”¸”¸”¸ ”¸”¸ý“¸ö“¸蓸ᓸÚ“¸Ó“¸Ì“¸Å“¸¾“¸·“¸°“¸©“¸¢“¸›“¸”“¸“¸†“¸“¸x“¸q“¸j“¸c“¸\“¸U“¸N“¸G“¸@“¸9“¸2“¸+“¸$“¸“¸“¸“¸“¸“¸ú’¸ó’¸ì’¸å’¸Þ’¸×’¸Ð’¸É’¸Â’¸»’¸´’¸­’¸¦’¸Ÿ’¸˜’¸‘’¸Š’¸ƒ’¸|’¸u’¸n’¸g’¸`’¸Y’¸R’¸K’¸D’¸=’¸6’¸/’¸(’¸!’¸’¸’¸ ’¸’¸þ‘¸÷‘¸ð‘¸鑸⑸Û‘¸Ô‘¸Í‘¸Æ‘¸¿‘¸¸‘¸±‘¸ª‘¸£‘¸œ‘¸•‘¸Ž‘¸‡‘¸€‘¸y‘¸r‘¸k‘¸d‘¸]‘¸V‘¸O‘¸H‘¸A‘¸:‘¸3‘¸,‘¸%‘¸‘¸‘¸‘¸ ‘¸‘¸û¸ô¸í¸æ¸߸ظѸʸø¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸üޏõޏ玸àŽ¸ÙŽ¸ÒŽ¸ËŽ¸Äޏ½Ž¸¶Ž¸¯Ž¸¨Ž¸¡Ž¸šŽ¸“ޏŒŽ¸…ޏ~ޏwޏpޏiޏbޏ[ޏTޏMޏFޏ?ޏ8ޏ1ޏ*ޏ#ޏޏޏޏޏޏù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ýŒ¸öŒ¸茸ጸÚŒ¸ÓŒ¸ÌŒ¸ÅŒ¸¾Œ¸·Œ¸°Œ¸©Œ¸¢Œ¸›Œ¸”Œ¸Œ¸†Œ¸Œ¸xŒ¸qŒ¸jŒ¸cŒ¸\Œ¸UŒ¸NŒ¸GŒ¸@Œ¸9Œ¸2Œ¸+Œ¸$Œ¸Œ¸Œ¸Œ¸Œ¸Œ¸ú‹¸ó‹¸싸勸Þ‹¸׋¸Ћ¸É‹¸‹¸»‹¸´‹¸­‹¸¦‹¸Ÿ‹¸˜‹¸‘‹¸Š‹¸ƒ‹¸|‹¸u‹¸n‹¸g‹¸`‹¸Y‹¸R‹¸K‹¸D‹¸=‹¸6‹¸/‹¸(‹¸!‹¸‹¸‹¸ ‹¸‹¸þЏ÷ЏðЏ銸⊸ÛŠ¸ÔŠ¸ÍŠ¸ÆŠ¸¿Š¸¸Š¸±Š¸ªŠ¸£Š¸œŠ¸•ЏŽŠ¸‡Š¸€Š¸yЏrЏkЏdЏ]ЏVЏOЏHЏAЏ:Џ3Џ,Џ%ЏЏЏЏ ЏЏû‰¸ô‰¸퉸扸߉¸؉¸щ¸ʉ¸ɸ¼‰¸µ‰¸®‰¸§‰¸ ‰¸™‰¸’‰¸‹‰¸„‰¸}‰¸v‰¸o‰¸h‰¸a‰¸Z‰¸S‰¸L‰¸E‰¸>‰¸7‰¸0‰¸)‰¸"‰¸‰¸‰¸ ‰¸‰¸ÿˆ¸øˆ¸ñˆ¸ꈸ㈸܈¸Õˆ¸Έ¸Lj¸Àˆ¸¹ˆ¸²ˆ¸«ˆ¸¤ˆ¸ˆ¸–ˆ¸ˆ¸ˆˆ¸ˆ¸zˆ¸sˆ¸lˆ¸eˆ¸^ˆ¸Wˆ¸Pˆ¸Iˆ¸Bˆ¸;ˆ¸4ˆ¸-ˆ¸&ˆ¸ˆ¸ˆ¸ˆ¸ ˆ¸ˆ¸ü‡¸õ‡¸燸à‡¸Ù‡¸Ò‡¸ˇ¸ć¸½‡¸¶‡¸¯‡¸¨‡¸¡‡¸š‡¸“‡¸Œ‡¸…‡¸~‡¸w‡¸p‡¸i‡¸b‡¸[‡¸T‡¸M‡¸F‡¸?‡¸8‡¸1‡¸*‡¸#‡¸‡¸‡¸‡¸‡¸‡¸ù†¸ò†¸놸䆸݆¸Ö†¸φ¸Ȇ¸Á†¸º†¸³†¸¬†¸¥†¸ž†¸—†¸†¸‰†¸‚†¸{†¸t†¸m†¸f†¸_†¸X†¸Q†¸J†¸C†¸<†¸5†¸.†¸'†¸ †¸†¸†¸ †¸†¸ý…¸ö…¸ï…¸è…¸á…¸Ú…¸Ó…¸Ì…¸Å…¸¾…¸·…¸°…¸©…¸¢…¸›…¸”…¸…¸†…¸…¸x…¸q…¸j…¸c…¸\…¸U…¸N…¸G…¸@…¸9…¸2…¸+…¸$…¸…¸…¸…¸…¸…¸ú„¸ó„¸세儸Þ„¸ׄ¸Є¸É„¸„¸»„¸´„¸­„¸¦„¸Ÿ„¸˜„¸‘„¸Š„¸ƒ„¸|„¸u„¸n„¸g„¸`„¸Y„¸R„¸K„¸D„¸=„¸6„¸/„¸(„¸!„¸„¸„¸ „¸„¸þƒ¸÷ƒ¸ðƒ¸郸⃸Ûƒ¸Ôƒ¸̓¸ƃ¸¿ƒ¸¸ƒ¸±ƒ¸ªƒ¸£ƒ¸œƒ¸•ƒ¸Žƒ¸‡ƒ¸€ƒ¸yƒ¸rƒ¸kƒ¸dƒ¸]ƒ¸Vƒ¸Oƒ¸Hƒ¸Aƒ¸:ƒ¸3ƒ¸,ƒ¸%ƒ¸ƒ¸ƒ¸ƒ¸ ƒ¸ƒ¸û‚¸ô‚¸킸悸ß‚¸Ø‚¸Ñ‚¸Ê‚¸¸¼‚¸µ‚¸®‚¸§‚¸ ‚¸™‚¸’‚¸‹‚¸„‚¸}‚¸v‚¸o‚¸h‚¸a‚¸Z‚¸S‚¸L‚¸E‚¸>‚¸7‚¸0‚¸)‚¸"‚¸‚¸‚¸ ‚¸‚¸ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü€¸õ€¸瀸à€¸Ù€¸Ò€¸Ë€¸Ä€¸½€¸¶€¸¯€¸¨€¸¡€¸š€¸“€¸Œ€¸…€¸~€¸w€¸p€¸i€¸b€¸[€¸T€¸M€¸F€¸?€¸8€¸1€¸*€¸#€¸€¸€¸€¸€¸€¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý~¸ö~¸ï~¸è~¸á~¸Ú~¸Ó~¸Ì~¸Å~¸¾~¸·~¸°~¸©~¸¢~¸›~¸”~¸~¸†~¸~¸x~¸q~¸j~¸c~¸\~¸U~¸N~¸G~¸@~¸9~¸2~¸+~¸$~¸~¸~¸~¸~¸~¸ú}¸ó}¸ì}¸å}¸Þ}¸×}¸Ð}¸É}¸Â}¸»}¸´}¸­}¸¦}¸Ÿ}¸˜}¸‘}¸Š}¸ƒ}¸|}¸u}¸n}¸g}¸`}¸Y}¸R}¸K}¸D}¸=}¸6}¸/}¸(}¸!}¸}¸}¸ }¸}¸þ|¸÷|¸ð|¸é|¸â|¸Û|¸Ô|¸Í|¸Æ|¸¿|¸¸|¸±|¸ª|¸£|¸œ|¸•|¸Ž|¸‡|¸€|¸y|¸r|¸k|¸d|¸]|¸V|¸O|¸H|¸A|¸:|¸3|¸,|¸%|¸|¸|¸|¸ |¸|¸û{¸ô{¸í{¸æ{¸ß{¸Ø{¸Ñ{¸Ê{¸Ã{¸¼{¸µ{¸®{¸§{¸ {¸™{¸’{¸‹{¸„{¸}{¸v{¸o{¸h{¸a{¸Z{¸S{¸L{¸E{¸>{¸7{¸0{¸){¸"{¸{¸{¸ {¸{¸ÿz¸øz¸ñz¸êz¸ãz¸Üz¸Õz¸Îz¸Çz¸Àz¸¹z¸²z¸«z¸¤z¸z¸–z¸z¸ˆz¸z¸zz¸sz¸lz¸ez¸^z¸Wz¸Pz¸Iz¸Bz¸;z¸4z¸-z¸&z¸z¸z¸z¸ z¸z¸üy¸õy¸îy¸çy¸ày¸Ùy¸Òy¸Ëy¸Äy¸½y¸¶y¸¯y¸¨y¸¡y¸šy¸“y¸Œy¸…y¸~y¸wy¸py¸iy¸by¸[y¸Ty¸My¸Fy¸?y¸8y¸1y¸*y¸#y¸y¸y¸y¸y¸y¸ùx¸òx¸ëx¸äx¸Ýx¸Öx¸Ïx¸Èx¸Áx¸ºx¸³x¸¬x¸¥x¸žx¸—x¸x¸‰x¸‚x¸{x¸tx¸mx¸fx¸_x¸Xx¸Qx¸Jx¸Cx¸t¸7t¸0t¸)t¸"t¸t¸t¸ t¸t¸ÿs¸øs¸ñs¸ês¸ãs¸Üs¸Õs¸Îs¸Çs¸Às¸¹s¸²s¸«s¸¤s¸s¸–s¸s¸ˆs¸s¸zs¸ss¸ls¸es¸^s¸Ws¸Ps¸Is¸Bs¸;s¸4s¸-s¸&s¸s¸s¸s¸ s¸s¸ür¸õr¸îr¸çr¸àr¸Ùr¸Òr¸Ër¸Är¸½r¸¶r¸¯r¸¨r¸¡r¸šr¸“r¸Œr¸…r¸~r¸wr¸pr¸ir¸br¸[r¸Tr¸Mr¸Fr¸?r¸8r¸1r¸*r¸#r¸r¸r¸r¸r¸r¸ùq¸òq¸ëq¸äq¸Ýq¸Öq¸Ïq¸Èq¸Áq¸ºq¸³q¸¬q¸¥q¸žq¸—q¸q¸‰q¸‚q¸{q¸tq¸mq¸fq¸_q¸Xq¸Qq¸Jq¸Cq¸m¸7m¸0m¸)m¸"m¸m¸m¸ m¸m¸ÿl¸øl¸ñl¸êl¸ãl¸Ül¸Õl¸Îl¸Çl¸Àl¸¹l¸²l¸«l¸¤l¸l¸–l¸l¸ˆl¸l¸zl¸sl¸ll¸el¸^l¸Wl¸Pl¸Il¸Bl¸;l¸4l¸-l¸&l¸l¸l¸l¸ l¸l¸ük¸õk¸îk¸çk¸àk¸Ùk¸Òk¸Ëk¸Äk¸½k¸¶k¸¯k¸¨k¸¡k¸šk¸“k¸Œk¸…k¸~k¸wk¸pk¸ik¸bk¸[k¸Tk¸Mk¸Fk¸?k¸8k¸1k¸*k¸#k¸k¸k¸k¸k¸k¸ùj¸òj¸ëj¸äj¸Ýj¸Öj¸Ïj¸Èj¸Áj¸ºj¸³j¸¬j¸¥j¸žj¸—j¸j¸‰j¸‚j¸{j¸tj¸mj¸fj¸_j¸Xj¸Qj¸Jj¸Cj¸f¸7f¸0f¸)f¸"f¸f¸f¸ f¸f¸ÿe¸øe¸ñe¸êe¸ãe¸Üe¸Õe¸Îe¸Çe¸Àe¸¹e¸²e¸«e¸¤e¸e¸–e¸e¸ˆe¸e¸ze¸se¸le¸ee¸^e¸We¸Pe¸Ie¸Be¸;e¸4e¸-e¸&e¸e¸e¸e¸ e¸e¸üd¸õd¸îd¸çd¸àd¸Ùd¸Òd¸Ëd¸Äd¸½d¸¶d¸¯d¸¨d¸¡d¸šd¸“d¸Œd¸…d¸~d¸wd¸pd¸id¸bd¸[d¸Td¸Md¸Fd¸?d¸8d¸1d¸*d¸#d¸d¸d¸d¸d¸d¸ùc¸òc¸ëc¸äc¸Ýc¸Öc¸Ïc¸Èc¸Ác¸ºc¸³c¸¬c¸¥c¸žc¸—c¸c¸‰c¸‚c¸{c¸tc¸mc¸fc¸_c¸Xc¸Qc¸Jc¸Cc¸_¸7_¸0_¸)_¸"_¸_¸_¸ _¸_¸ÿ^¸ø^¸ñ^¸ê^¸ã^¸Ü^¸Õ^¸Î^¸Ç^¸À^¸¹^¸²^¸«^¸¤^¸^¸–^¸^¸ˆ^¸^¸z^¸s^¸l^¸e^¸^^¸W^¸P^¸I^¸B^¸;^¸4^¸-^¸&^¸^¸^¸^¸ ^¸^¸ü]¸õ]¸î]¸ç]¸à]¸Ù]¸Ò]¸Ë]¸Ä]¸½]¸¶]¸¯]¸¨]¸¡]¸š]¸“]¸Œ]¸…]¸~]¸w]¸p]¸i]¸b]¸[]¸T]¸M]¸F]¸?]¸8]¸1]¸*]¸#]¸]¸]¸]¸]¸]¸ù\¸ò\¸ë\¸ä\¸Ý\¸Ö\¸Ï\¸È\¸Á\¸º\¸³\¸¬\¸¥\¸ž\¸—\¸\¸‰\¸‚\¸{\¸t\¸m\¸f\¸_\¸X\¸Q\¸J\¸C\¸<\¸5\¸.\¸'\¸ \¸\¸\¸ \¸\¸ý[¸ö[¸ï[¸è[¸á[¸Ú[¸Ó[¸Ì[¸Å[¸¾[¸·[¸°[¸©[¸¢[¸›[¸”[¸[¸†[¸[¸x[¸q[¸j[¸c[¸\[¸U[¸N[¸G[¸@[¸9[¸2[¸+[¸$[¸[¸[¸[¸[¸[¸úZ¸óZ¸ìZ¸åZ¸ÞZ¸×Z¸ÐZ¸ÉZ¸ÂZ¸»Z¸´Z¸­Z¸¦Z¸ŸZ¸˜Z¸‘Z¸ŠZ¸ƒZ¸|Z¸uZ¸nZ¸gZ¸`Z¸YZ¸RZ¸KZ¸DZ¸=Z¸6Z¸/Z¸(Z¸!Z¸Z¸Z¸ Z¸Z¸þY¸÷Y¸ðY¸éY¸âY¸ÛY¸ÔY¸ÍY¸ÆY¸¿Y¸¸Y¸±Y¸ªY¸£Y¸œY¸•Y¸ŽY¸‡Y¸€Y¸yY¸rY¸kY¸dY¸]Y¸VY¸OY¸HY¸AY¸:Y¸3Y¸,Y¸%Y¸Y¸Y¸Y¸ Y¸Y¸ûX¸ôX¸íX¸æX¸ßX¸ØX¸ÑX¸ÊX¸ÃX¸¼X¸µX¸®X¸§X¸ X¸™X¸’X¸‹X¸„X¸}X¸vX¸oX¸hX¸aX¸ZX¸SX¸LX¸EX¸>X¸7X¸0X¸)X¸"X¸X¸X¸ X¸X¸ÿW¸øW¸ñW¸êW¸ãW¸ÜW¸ÕW¸ÎW¸ÇW¸ÀW¸¹W¸²W¸«W¸¤W¸W¸–W¸W¸ˆW¸W¸zW¸sW¸lW¸eW¸^W¸WW¸PW¸IW¸BW¸;W¸4W¸-W¸&W¸W¸W¸W¸ W¸W¸üV¸õV¸îV¸çV¸àV¸ÙV¸ÒV¸ËV¸ÄV¸½V¸¶V¸¯V¸¨V¸¡V¸šV¸“V¸ŒV¸…V¸~V¸wV¸pV¸iV¸bV¸[V¸TV¸MV¸FV¸?V¸8V¸1V¸*V¸#V¸V¸V¸V¸V¸V¸ùU¸òU¸ëU¸äU¸ÝU¸ÖU¸ÏU¸ÈU¸ÁU¸ºU¸³U¸¬U¸¥U¸žU¸—U¸U¸‰U¸‚U¸{U¸tU¸mU¸fU¸_U¸XU¸QU¸JU¸CU¸Q¸7Q¸0Q¸)Q¸"Q¸Q¸Q¸ Q¸Q¸ÿP¸øP¸ñP¸êP¸ãP¸ÜP¸ÕP¸ÎP¸ÇP¸ÀP¸¹P¸²P¸«P¸¤P¸P¸–P¸P¸ˆP¸P¸zP¸sP¸lP¸eP¸^P¸WP¸PP¸IP¸BP¸;P¸4P¸-P¸&P¸P¸P¸P¸ P¸P¸üO¸õO¸îO¸çO¸àO¸ÙO¸ÒO¸ËO¸ÄO¸½O¸¶O¸¯O¸¨O¸¡O¸šO¸“O¸ŒO¸…O¸~O¸wO¸pO¸iO¸bO¸[O¸TO¸MO¸FO¸?O¸8O¸1O¸*O¸#O¸O¸O¸O¸O¸O¸ùN¸òN¸ëN¸äN¸ÝN¸ÖN¸ÏN¸ÈN¸ÁN¸ºN¸³N¸¬N¸¥N¸žN¸—N¸N¸‰N¸‚N¸{N¸tN¸mN¸fN¸_N¸XN¸QN¸JN¸CN¸J¸7J¸0J¸)J¸"J¸J¸J¸ J¸J¸ÿI¸øI¸ñI¸êI¸ãI¸ÜI¸ÕI¸ÎI¸ÇI¸ÀI¸¹I¸²I¸«I¸¤I¸I¸–I¸I¸ˆI¸I¸zI¸sI¸lI¸eI¸^I¸WI¸PI¸II¸BI¸;I¸4I¸-I¸&I¸I¸I¸I¸ I¸I¸üH¸õH¸îH¸çH¸àH¸ÙH¸ÒH¸ËH¸ÄH¸½H¸¶H¸¯H¸¨H¸¡H¸šH¸“H¸ŒH¸…H¸~H¸wH¸pH¸iH¸bH¸[H¸TH¸MH¸FH¸?H¸8H¸1H¸*H¸#H¸H¸H¸H¸H¸H¸ùG¸òG¸ëG¸äG¸ÝG¸ÖG¸ÏG¸ÈG¸ÁG¸ºG¸³G¸¬G¸¥G¸žG¸—G¸G¸‰G¸‚G¸{G¸tG¸mG¸fG¸_G¸XG¸QG¸JG¸CG¸C¸7C¸0C¸)C¸"C¸C¸C¸ C¸C¸ÿB¸øB¸ñB¸êB¸ãB¸ÜB¸ÕB¸ÎB¸ÇB¸ÀB¸¹B¸²B¸«B¸¤B¸B¸–B¸B¸ˆB¸B¸zB¸sB¸lB¸eB¸^B¸WB¸PB¸IB¸BB¸;B¸4B¸-B¸&B¸B¸B¸B¸ B¸B¸üA¸õA¸îA¸çA¸àA¸ÙA¸ÒA¸ËA¸ÄA¸½A¸¶A¸¯A¸¨A¸¡A¸šA¸“A¸ŒA¸…A¸~A¸wA¸pA¸iA¸bA¸[A¸TA¸MA¸FA¸?A¸8A¸1A¸*A¸#A¸A¸A¸A¸A¸A¸ù@¸ò@¸ë@¸ä@¸Ý@¸Ö@¸Ï@¸È@¸Á@¸º@¸³@¸¬@¸¥@¸ž@¸—@¸@¸‰@¸‚@¸{@¸t@¸m@¸f@¸_@¸X@¸Q@¸J@¸C@¸<@¸5@¸.@¸'@¸ @¸@¸@¸ @¸@¸ý?¸ö?¸ï?¸è?¸á?¸Ú?¸Ó?¸Ì?¸Å?¸¾?¸·?¸°?¸©?¸¢?¸›?¸”?¸?¸†?¸?¸x?¸q?¸j?¸c?¸\?¸U?¸N?¸G?¸@?¸9?¸2?¸+?¸$?¸?¸?¸?¸?¸?¸ú>¸ó>¸ì>¸å>¸Þ>¸×>¸Ð>¸É>¸Â>¸»>¸´>¸­>¸¦>¸Ÿ>¸˜>¸‘>¸Š>¸ƒ>¸|>¸u>¸n>¸g>¸`>¸Y>¸R>¸K>¸D>¸=>¸6>¸/>¸(>¸!>¸>¸>¸ >¸>¸þ=¸÷=¸ð=¸é=¸â=¸Û=¸Ô=¸Í=¸Æ=¸¿=¸¸=¸±=¸ª=¸£=¸œ=¸•=¸Ž=¸‡=¸€=¸y=¸r=¸k=¸d=¸]=¸V=¸O=¸H=¸A=¸:=¸3=¸,=¸%=¸=¸=¸=¸ =¸=¸û<¸ô<¸í<¸æ<¸ß<¸Ø<¸Ñ<¸Ê<¸Ã<¸¼<¸µ<¸®<¸§<¸ <¸™<¸’<¸‹<¸„<¸}<¸v<¸o<¸h<¸a<¸Z<¸S<¸L<¸E<¸><¸7<¸0<¸)<¸"<¸<¸<¸ <¸<¸ÿ;¸ø;¸ñ;¸ê;¸ã;¸Ü;¸Õ;¸Î;¸Ç;¸À;¸¹;¸²;¸«;¸¤;¸;¸–;¸;¸ˆ;¸;¸z;¸s;¸l;¸e;¸^;¸W;¸P;¸I;¸B;¸;;¸4;¸-;¸&;¸;¸;¸;¸ ;¸;¸ü:¸õ:¸î:¸ç:¸à:¸Ù:¸Ò:¸Ë:¸Ä:¸½:¸¶:¸¯:¸¨:¸¡:¸š:¸“:¸Œ:¸…:¸~:¸w:¸p:¸i:¸b:¸[:¸T:¸M:¸F:¸?:¸8:¸1:¸*:¸#:¸:¸:¸:¸:¸:¸ù9¸ò9¸ë9¸ä9¸Ý9¸Ö9¸Ï9¸È9¸Á9¸º9¸³9¸¬9¸¥9¸ž9¸—9¸9¸‰9¸‚9¸{9¸t9¸m9¸f9¸_9¸X9¸Q9¸J9¸C9¸<9¸59¸.9¸'9¸ 9¸9¸9¸ 9¸9¸ý8¸ö8¸ï8¸è8¸á8¸Ú8¸Ó8¸Ì8¸Å8¸¾8¸·8¸°8¸©8¸¢8¸›8¸”8¸8¸†8¸8¸x8¸q8¸j8¸c8¸\8¸U8¸N8¸G8¸@8¸98¸28¸+8¸$8¸8¸8¸8¸8¸8¸ú7¸ó7¸ì7¸å7¸Þ7¸×7¸Ð7¸É7¸Â7¸»7¸´7¸­7¸¦7¸Ÿ7¸˜7¸‘7¸Š7¸ƒ7¸|7¸u7¸n7¸g7¸`7¸Y7¸R7¸K7¸D7¸=7¸67¸/7¸(7¸!7¸7¸7¸ 7¸7¸þ6¸÷6¸ð6¸é6¸â6¸Û6¸Ô6¸Í6¸Æ6¸¿6¸¸6¸±6¸ª6¸£6¸œ6¸•6¸Ž6¸‡6¸€6¸y6¸r6¸k6¸d6¸]6¸V6¸O6¸H6¸A6¸:6¸36¸,6¸%6¸6¸6¸6¸ 6¸6¸û5¸ô5¸í5¸æ5¸ß5¸Ø5¸Ñ5¸Ê5¸Ã5¸¼5¸µ5¸®5¸§5¸ 5¸™5¸’5¸‹5¸„5¸}5¸v5¸o5¸h5¸a5¸Z5¸S5¸L5¸E5¸>5¸75¸05¸)5¸"5¸5¸5¸ 5¸5¸ÿ4¸ø4¸ñ4¸ê4¸ã4¸Ü4¸Õ4¸Î4¸Ç4¸À4¸¹4¸²4¸«4¸¤4¸4¸–4¸4¸ˆ4¸4¸z4¸s4¸l4¸e4¸^4¸W4¸P4¸I4¸B4¸;4¸44¸-4¸&4¸4¸4¸4¸ 4¸4¸ü3¸õ3¸î3¸ç3¸à3¸Ù3¸Ò3¸Ë3¸Ä3¸½3¸¶3¸¯3¸¨3¸¡3¸š3¸“3¸Œ3¸…3¸~3¸w3¸p3¸i3¸b3¸[3¸T3¸M3¸F3¸?3¸83¸13¸*3¸#3¸3¸3¸3¸3¸3¸ù2¸ò2¸ë2¸ä2¸Ý2¸Ö2¸Ï2¸È2¸Á2¸º2¸³2¸¬2¸¥2¸ž2¸—2¸2¸‰2¸‚2¸{2¸t2¸m2¸f2¸_2¸X2¸Q2¸J2¸C2¸<2¸52¸.2¸'2¸ 2¸2¸2¸ 2¸2¸ý1¸ö1¸ï1¸è1¸á1¸Ú1¸Ó1¸Ì1¸Å1¸¾1¸·1¸°1¸©1¸¢1¸›1¸”1¸1¸†1¸1¸x1¸q1¸j1¸c1¸\1¸U1¸N1¸G1¸@1¸91¸21¸+1¸$1¸1¸1¸1¸1¸1¸ú0¸ó0¸ì0¸å0¸Þ0¸×0¸Ð0¸É0¸Â0¸»0¸´0¸­0¸¦0¸Ÿ0¸˜0¸‘0¸Š0¸ƒ0¸|0¸u0¸n0¸g0¸`0¸Y0¸R0¸K0¸D0¸=0¸60¸/0¸(0¸!0¸0¸0¸ 0¸0¸þ/¸÷/¸ð/¸é/¸â/¸Û/¸Ô/¸Í/¸Æ/¸¿/¸¸/¸±/¸ª/¸£/¸œ/¸•/¸Ž/¸‡/¸€/¸y/¸r/¸k/¸d/¸]/¸V/¸O/¸H/¸A/¸:/¸3/¸,/¸%/¸/¸/¸/¸ /¸/¸û.¸ô.¸í.¸æ.¸ß.¸Ø.¸Ñ.¸Ê.¸Ã.¸¼.¸µ.¸®.¸§.¸ .¸™.¸’.¸‹.¸„.¸}.¸v.¸o.¸h.¸a.¸Z.¸S.¸L.¸E.¸>.¸7.¸0.¸).¸".¸.¸.¸ .¸.¸ÿ-¸ø-¸ñ-¸ê-¸ã-¸Ü-¸Õ-¸Î-¸Ç-¸À-¸¹-¸²-¸«-¸¤-¸-¸–-¸-¸ˆ-¸-¸z-¸s-¸l-¸e-¸^-¸W-¸P-¸I-¸B-¸;-¸4-¸--¸&-¸-¸-¸-¸ -¸-¸ü,¸õ,¸î,¸ç,¸à,¸Ù,¸Ò,¸Ë,¸Ä,¸½,¸¶,¸¯,¸¨,¸¡,¸š,¸“,¸Œ,¸…,¸~,¸w,¸p,¸i,¸b,¸[,¸T,¸M,¸F,¸?,¸8,¸1,¸*,¸#,¸,¸,¸,¸,¸,¸ù+¸ò+¸ë+¸ä+¸Ý+¸Ö+¸Ï+¸È+¸Á+¸º+¸³+¸¬+¸¥+¸ž+¸—+¸+¸‰+¸‚+¸{+¸t+¸m+¸f+¸_+¸X+¸Q+¸J+¸C+¸<+¸5+¸.+¸'+¸ +¸+¸+¸ +¸+¸ý*¸ö*¸ï*¸è*¸á*¸Ú*¸Ó*¸Ì*¸Å*¸¾*¸·*¸°*¸©*¸¢*¸›*¸”*¸*¸†*¸*¸x*¸q*¸j*¸c*¸\*¸U*¸N*¸G*¸@*¸9*¸2*¸+*¸$*¸*¸*¸*¸*¸*¸ú)¸ó)¸ì)¸å)¸Þ)¸×)¸Ð)¸É)¸Â)¸»)¸´)¸­)¸¦)¸Ÿ)¸˜)¸‘)¸Š)¸ƒ)¸|)¸u)¸n)¸g)¸`)¸Y)¸R)¸K)¸D)¸=)¸6)¸/)¸()¸!)¸)¸)¸ )¸)¸þ(¸÷(¸ð(¸é(¸â(¸Û(¸Ô(¸Í(¸Æ(¸¿(¸¸(¸±(¸ª(¸£(¸œ(¸•(¸Ž(¸‡(¸€(¸y(¸r(¸k(¸d(¸](¸V(¸O(¸H(¸A(¸:(¸3(¸,(¸%(¸(¸(¸(¸ (¸(¸û'¸ô'¸í'¸æ'¸ß'¸Ø'¸Ñ'¸Ê'¸Ã'¸¼'¸µ'¸®'¸§'¸ '¸™'¸’'¸‹'¸„'¸}'¸v'¸o'¸h'¸a'¸Z'¸S'¸L'¸E'¸>'¸7'¸0'¸)'¸"'¸'¸'¸ '¸'¸ÿ&¸ø&¸ñ&¸ê&¸ã&¸Ü&¸Õ&¸Î&¸Ç&¸À&¸¹&¸²&¸«&¸¤&¸&¸–&¸&¸ˆ&¸&¸z&¸s&¸l&¸e&¸^&¸W&¸P&¸I&¸B&¸;&¸4&¸-&¸&&¸&¸&¸&¸ &¸&¸ü%¸õ%¸î%¸ç%¸à%¸Ù%¸Ò%¸Ë%¸Ä%¸½%¸¶%¸¯%¸¨%¸¡%¸š%¸“%¸Œ%¸…%¸~%¸w%¸p%¸i%¸b%¸[%¸T%¸M%¸F%¸?%¸8%¸1%¸*%¸#%¸%¸%¸%¸%¸%¸ù$¸ò$¸ë$¸ä$¸Ý$¸Ö$¸Ï$¸È$¸Á$¸º$¸³$¸¬$¸¥$¸ž$¸—$¸$¸‰$¸‚$¸{$¸t$¸m$¸f$¸_$¸X$¸Q$¸J$¸C$¸<$¸5$¸.$¸'$¸ $¸$¸$¸ $¸$¸ý#¸ö#¸ï#¸è#¸á#¸Ú#¸Ó#¸Ì#¸Å#¸¾#¸·#¸°#¸©#¸¢#¸›#¸”#¸#¸†#¸#¸x#¸q#¸j#¸c#¸\#¸U#¸N#¸G#¸@#¸9#¸2#¸+#¸$#¸#¸#¸#¸#¸#¸ú"¸ó"¸ì"¸å"¸Þ"¸×"¸Ð"¸É"¸Â"¸»"¸´"¸­"¸¦"¸Ÿ"¸˜"¸‘"¸Š"¸ƒ"¸|"¸u"¸n"¸g"¸`"¸Y"¸R"¸K"¸D"¸="¸6"¸/"¸("¸!"¸"¸"¸ "¸"¸þ!¸÷!¸ð!¸é!¸â!¸Û!¸Ô!¸Í!¸Æ!¸¿!¸¸!¸±!¸ª!¸£!¸œ!¸•!¸Ž!¸‡!¸€!¸y!¸r!¸k!¸d!¸]!¸V!¸O!¸H!¸A!¸:!¸3!¸,!¸%!¸!¸!¸!¸ !¸!¸û ¸ô ¸í ¸æ ¸ß ¸Ø ¸Ñ ¸Ê ¸à ¸¼ ¸µ ¸® ¸§ ¸  ¸™ ¸’ ¸‹ ¸„ ¸} ¸v ¸o ¸h ¸a ¸Z ¸S ¸L ¸E ¸> ¸7 ¸0 ¸) ¸" ¸ ¸ ¸ ¸ ¸ÿ¸ø¸ñ¸ê¸ã¸Ü¸Õ¸Î¸Ç¸À¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü¸õ¸î¸ç¸à¸Ù¸Ò¸Ë¸Ä¸½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý¸ö¸ï¸è¸á¸Ú¸Ó¸Ì¸Å¸¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú¸ó¸ì¸å¸Þ¸×¸Ð¸É¸Â¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Š¸ƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ¸÷¸ð¸é¸â¸Û¸Ô¸Í¸Æ¸¿¸¸¸±¸ª¸£¸œ¸•¸Ž¸‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û¸ô¸í¸æ¸ß¸Ø¸Ñ¸Ê¸Ã¸¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ¸ø¸ñ¸ê¸ã¸Ü¸Õ¸Î¸Ç¸À¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü¸õ¸î¸ç¸à¸Ù¸Ò¸Ë¸Ä¸½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý¸ö¸ï¸è¸á¸Ú¸Ó¸Ì¸Å¸¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú¸ó¸ì¸å¸Þ¸×¸Ð¸É¸Â¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Š¸ƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ¸÷¸ð¸é¸â¸Û¸Ô¸Í¸Æ¸¿¸¸¸±¸ª¸£¸œ¸•¸Ž¸‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û¸ô¸í¸æ¸ß¸Ø¸Ñ¸Ê¸Ã¸¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ¸ø¸ñ¸ê¸ã¸Ü¸Õ¸Î¸Ç¸À¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü¸õ¸î¸ç¸à¸Ù¸Ò¸Ë¸Ä¸½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý¸ö¸ï¸è¸á¸Ú¸Ó¸Ì¸Å¸¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú ¸ó ¸ì ¸å ¸Þ ¸× ¸Ð ¸É ¸ ¸» ¸´ ¸­ ¸¦ ¸Ÿ ¸˜ ¸‘ ¸Š ¸ƒ ¸| ¸u ¸n ¸g ¸` ¸Y ¸R ¸K ¸D ¸= ¸6 ¸/ ¸( ¸! ¸ ¸ ¸ ¸ ¸þ ¸÷ ¸ð ¸é ¸â ¸Û ¸Ô ¸Í ¸Æ ¸¿ ¸¸ ¸± ¸ª ¸£ ¸œ ¸• ¸Ž ¸‡ ¸€ ¸y ¸r ¸k ¸d ¸] ¸V ¸O ¸H ¸A ¸: ¸3 ¸, ¸% ¸ ¸ ¸ ¸ ¸ ¸û ¸ô ¸í ¸æ ¸ß ¸Ø ¸Ñ ¸Ê ¸à ¸¼ ¸µ ¸® ¸§ ¸  ¸™ ¸’ ¸‹ ¸„ ¸} ¸v ¸o ¸h ¸a ¸Z ¸S ¸L ¸E ¸> ¸7 ¸0 ¸) ¸" ¸ ¸ ¸ ¸ ¸ÿ ¸ø ¸ñ ¸ê ¸ã ¸Ü ¸Õ ¸Î ¸Ç ¸À ¸¹ ¸² ¸« ¸¤ ¸ ¸– ¸ ¸ˆ ¸ ¸z ¸s ¸l ¸e ¸^ ¸W ¸P ¸I ¸B ¸; ¸4 ¸- ¸& ¸ ¸ ¸ ¸ ¸ ¸ü ¸õ ¸î ¸ç ¸à ¸Ù ¸Ò ¸Ë ¸Ä ¸½ ¸¶ ¸¯ ¸¨ ¸¡ ¸š ¸“ ¸Œ ¸… ¸~ ¸w ¸p ¸i ¸b ¸[ ¸T ¸M ¸F ¸? ¸8 ¸1 ¸* ¸# ¸ ¸ ¸ ¸ ¸ ¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý¸ö¸ï¸è¸á¸Ú¸Ó¸Ì¸Å¸¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú¸ó¸ì¸å¸Þ¸×¸Ð¸É¸Â¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Š¸ƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ¸÷¸ð¸é¸â¸Û¸Ô¸Í¸Æ¸¿¸¸¸±¸ª¸£¸œ¸•¸Ž¸‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û¸ô¸í¸æ¸ß¸Ø¸Ñ¸Ê¸Ã¸¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ¸ø¸ñ¸ê¸ã¸Ü¸Õ¸Î¸Ç¸À¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü¸õ¸î¸ç¸à¸Ù¸Ò¸Ë¸Ä¸½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù¸ò¸ë¸ä¸Ý¸Ö¸Ï¸È¸Á¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý¸ö¸ï¸è¸á¸Ú¸Ó¸̸Ÿ¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸úÿ·óÿ·ìÿ·åÿ·Þÿ·×ÿ·Ðÿ·Éÿ·Âÿ·»ÿ·´ÿ·­ÿ·¦ÿ·Ÿÿ·˜ÿ·‘ÿ·Šÿ·ƒÿ·|ÿ·uÿ·nÿ·gÿ·`ÿ·Yÿ·Rÿ·Kÿ·Dÿ·=ÿ·6ÿ·/ÿ·(ÿ·!ÿ·ÿ·ÿ· ÿ·ÿ·þþ·÷þ·ðþ·éþ·âþ·Ûþ·Ôþ·Íþ·Æþ·¿þ·¸þ·±þ·ªþ·£þ·œþ·•þ·Žþ·‡þ·€þ·yþ·rþ·kþ·dþ·]þ·Vþ·Oþ·Hþ·Aþ·:þ·3þ·,þ·%þ·þ·þ·þ· þ·þ·ûý·ôý·íý·æý·ßý·Øý·Ñý·Êý·Ãý·¼ý·µý·®ý·§ý· ý·™ý·’ý·‹ý·„ý·}ý·vý·oý·hý·aý·Zý·Sý·Lý·Eý·>ý·7ý·0ý·)ý·"ý·ý·ý· ý·ý·ÿü·øü·ñü·êü·ãü·Üü·Õü·Îü·Çü·Àü·¹ü·²ü·«ü·¤ü·ü·–ü·ü·ˆü·ü·zü·sü·lü·eü·^ü·Wü·Pü·Iü·Bü·;ü·4ü·-ü·&ü·ü·ü·ü· ü·ü·üû·õû·îû·çû·àû·Ùû·Òû·Ëû·Äû·½û·¶û·¯û·¨û·¡û·šû·“û·Œû·…û·~û·wû·pû·iû·bû·[û·Tû·Mû·Fû·?û·8û·1û·*û·#û·û·û·û·û·û·ùú·òú·ëú·äú·Ýú·Öú·Ïú·Èú·Áú·ºú·³ú·¬ú·¥ú·žú·—ú·ú·‰ú·‚ú·{ú·tú·mú·fú·_ú·Xú·Qú·Jú·Cú·<ú·5ú·.ú·'ú· ú·ú·ú· ú·ú·ýù·öù·ïù·èù·áù·Úù·Óù·Ìù·Åù·¾ù··ù·°ù·©ù·¢ù·›ù·”ù·ù·†ù·ù·xù·qù·jù·cù·\ù·Uù·Nù·Gù·@ù·9ù·2ù·+ù·$ù·ù·ù·ù·ù·ù·úø·óø·ìø·åø·Þø·×ø·Ðø·Éø·Âø·»ø·´ø·­ø·¦ø·Ÿø·˜ø·‘ø·Šø·ƒø·|ø·uø·nø·gø·`ø·Yø·Rø·Kø·Dø·=ø·6ø·/ø·(ø·!ø·ø·ø· ø·ø·þ÷·÷÷·ð÷·é÷·â÷·Û÷·Ô÷·Í÷·Æ÷·¿÷·¸÷·±÷·ª÷·£÷·œ÷·•÷·Ž÷·‡÷·€÷·y÷·r÷·k÷·d÷·]÷·V÷·O÷·H÷·A÷·:÷·3÷·,÷·%÷·÷·÷·÷· ÷·÷·ûö·ôö·íö·æö·ßö·Øö·Ñö·Êö·Ãö·¼ö·µö·®ö·§ö· ö·™ö·’ö·‹ö·„ö·}ö·vö·oö·hö·aö·Zö·Sö·Lö·Eö·>ö·7ö·0ö·)ö·"ö·ö·ö· ö·ö·ÿõ·øõ·ñõ·êõ·ãõ·Üõ·Õõ·Îõ·Çõ·Àõ·¹õ·²õ·«õ·¤õ·õ·–õ·õ·ˆõ·õ·zõ·sõ·lõ·eõ·^õ·Wõ·Põ·Iõ·Bõ·;õ·4õ·-õ·&õ·õ·õ·õ· õ·õ·üô·õô·îô·çô·àô·Ùô·Òô·Ëô·Äô·½ô·¶ô·¯ô·¨ô·¡ô·šô·“ô·Œô·…ô·~ô·wô·pô·iô·bô·[ô·Tô·Mô·Fô·?ô·8ô·1ô·*ô·#ô·ô·ô·ô·ô·ô·ùó·òó·ëó·äó·Ýó·Öó·Ïó·Èó·Áó·ºó·³ó·¬ó·¥ó·žó·—ó·ó·‰ó·‚ó·{ó·tó·mó·fó·_ó·Xó·Qó·Jó·Có·<ó·5ó·.ó·'ó· ó·ó·ó· ó·ó·ýò·öò·ïò·èò·áò·Úò·Óò·Ìò·Åò·¾ò··ò·°ò·©ò·¢ò·›ò·”ò·ò·†ò·ò·xò·qò·jò·cò·\ò·Uò·Nò·Gò·@ò·9ò·2ò·+ò·$ò·ò·ò·ò·ò·ò·úñ·óñ·ìñ·åñ·Þñ·×ñ·Ðñ·Éñ·Âñ·»ñ·´ñ·­ñ·¦ñ·Ÿñ·˜ñ·‘ñ·Šñ·ƒñ·|ñ·uñ·nñ·gñ·`ñ·Yñ·Rñ·Kñ·Dñ·=ñ·6ñ·/ñ·(ñ·!ñ·ñ·ñ· ñ·ñ·þð·÷ð·ðð·éð·âð·Ûð·Ôð·Íð·Æð·¿ð·¸ð·±ð·ªð·£ð·œð·•ð·Žð·‡ð·€ð·yð·rð·kð·dð·]ð·Vð·Oð·Hð·Að·:ð·3ð·,ð·%ð·ð·ð·ð· ð·ð·ûï·ôï·íï·æï·ßï·Øï·Ñï·Êï·Ã﷼ﷵ﷮﷧﷠﷙﷒﷋ﷄï·}ï·vï·oï·hï·aï·Zï·Sï·Lï·Eï·>ï·7ï·0ï·)ï·"ï·ï·ï· ï·ï·ÿî·øî·ñî·êî·ãî·Üî·Õî·Îî·Çî·Àî·î·–î·î·ˆî·î·zî·sî·lî·eî·^î·Wî·Pî·Iî·Bî·;î·4î·-î·&î·î·î·î· î·î·üí·õí·îí·çí·àí·Ùí·Òí·Ëí·Äí·½í·¶í·¯í·¨í·¡í·ší·“í·Œí·…í·~í·wí·pí·ií·bí·[í·Tí·Mí·Fí·?í·8í·1í·*í·#í·í·í·í·í·í·ùì·òì·ëì·äì·Ýì·Öì·Ïì·Èì·Á췺췳췬췥췞췗ì·ì·‰ì·‚ì·{ì·tì·mì·fì·_ì·Xì·Qì·Jì·Cì·<ì·5ì·.ì·'ì· ì·ì·ì· ì·ì·ýë·öë·ïë·èë·áë·Úë·Óë·Ìë·Å뷾뷷뷰뷩뷢뷛뷔ë·ë·†ë·ë·xë·që·jë·cë·\ë·Uë·Në·Gë·@ë·9ë·2ë·+ë·$ë·ë·ë·ë·ë·ë·úê·óê·ìê·åê·Þê·×ê·Ðê·Éê·Â귻귴귭귦귟귘귑귊귃ê·|ê·uê·nê·gê·`ê·Yê·Rê·Kê·Dê·=ê·6ê·/ê·(ê·!ê·ê·ê· ê·ê·þé·÷é·ðé·éé·âé·Ûé·Ôé·Íé·Æé·¿é·¸é·±é·ªé·£é·œé·•é·Žé·‡é·€é·yé·ré·ké·dé·]é·Vé·Oé·Hé·Aé·:é·3é·,é·%é·é·é·é· é·é·ûè·ôè·íè·æè·ßè·Øè·Ñè·Êè·Ã跼践跮跧跠跙跒跋跄è·}è·vè·oè·hè·aè·Zè·Sè·Lè·Eè·>è·7è·0è·)è·"è·è·è· è·è·ÿç·øç·ñç·êç·ãç·Üç·Õç·Îç·Çç·À緹緲緫緤ç·ç·–ç·ç·ˆç·ç·zç·sç·lç·eç·^ç·Wç·Pç·Iç·Bç·;ç·4ç·-ç·&ç·ç·ç·ç· ç·ç·üæ·õæ·îæ·çæ·àæ·Ùæ·Òæ·Ëæ·Ä淽淶淯淨淡淚淓淌淅æ·~æ·wæ·pæ·iæ·bæ·[æ·Tæ·Mæ·Fæ·?æ·8æ·1æ·*æ·#æ·æ·æ·æ·æ·æ·ùå·òå·ëå·äå·Ýå·Öå·Ïå·Èå·Á巺巳巬工州巗å·å·‰å·‚å·{å·tå·må·få·_å·Xå·Qå·Jå·Cå·<å·5å·.å·'å· å·å·å· å·å·ýä·öä·ïä·èä·áä·Úä·Óä·Ìä·Å䷾䷷䷰䷩䷢䷛䷔ä·ä·†ä·ä·xä·qä·jä·cä·\ä·Uä·Nä·Gä·@ä·9ä·2ä·+ä·$ä·ä·ä·ä·ä·ä·úã·óã·ìã·åã·Þã·×ã·Ðã·Éã·Â㷻㷴㷭㷦㷟㷘㷑㷊㷃ã·|ã·uã·nã·gã·`ã·Yã·Rã·Kã·Dã·=ã·6ã·/ã·(ã·!ã·ã·ã· ã·ã·þâ·÷â·ðâ·éâ·ââ·Ûâ·Ôâ·Íâ·Æâ·¿â·¸â·±â·ªâ·£â·œâ·•â·Žâ·‡â·€â·yâ·râ·kâ·dâ·]â·Vâ·Oâ·Hâ·Aâ·:â·3â·,â·%â·â·â·â· â·â·ûá·ôá·íá·æá·ßá·Øá·Ñá·Êá·Ã᷵ᷮᷧᷠᷙ᷒᷋᷄᷼á·}á·vá·oá·há·aá·Zá·Sá·Lá·Eá·>á·7á·0á·)á·"á·á·á· á·á·ÿà·øà·ñà·êà·ãà·Üà·Õà·Îà·Çà·À෹ෲ෫෤à·à·–à·à·ˆà·à·zà·sà·là·eà·^à·Wà·Pà·Ià·Bà·;à·4à·-à·&à·à·à·à· à·à·üß·õß·îß·çß·àß·Ùß·Òß·Ëß·Äß·½ß·¶ß·¯ß·¨ß·¡ß·šß·“ß·Œß·…ß·~ß·wß·pß·iß·bß·[ß·Tß·Mß·Fß·?ß·8ß·1ß·*ß·#ß·ß·ß·ß·ß·ß·ùÞ·òÞ·ëÞ·äÞ·ÝÞ·ÖÞ·ÏÞ·ÈÞ·ÁÞ·ºÞ·³Þ·¬Þ·¥Þ·žÞ·—Þ·Þ·‰Þ·‚Þ·{Þ·tÞ·mÞ·fÞ·_Þ·XÞ·QÞ·JÞ·CÞ·<Þ·5Þ·.Þ·'Þ· Þ·Þ·Þ· Þ·Þ·ýÝ·öÝ·ïÝ·èÝ·áÝ·ÚÝ·ÓÝ·ÌÝ·ÅÝ·¾Ý··Ý·°Ý·©Ý·¢Ý·›Ý·”Ý·Ý·†Ý·Ý·xÝ·qÝ·jÝ·cÝ·\Ý·UÝ·NÝ·GÝ·@Ý·9Ý·2Ý·+Ý·$Ý·Ý·Ý·Ý·Ý·Ý·úÜ·óÜ·ìÜ·åÜ·ÞÜ·×Ü·ÐÜ·ÉÜ·ÂÜ·»Ü·´Ü·­Ü·¦Ü·ŸÜ·˜Ü·‘Ü·ŠÜ·ƒÜ·|Ü·uÜ·nÜ·gÜ·`Ü·YÜ·RÜ·KÜ·DÜ·=Ü·6Ü·/Ü·(Ü·!Ü·Ü·Ü· Ü·Ü·þÛ·÷Û·ðÛ·éÛ·âÛ·ÛÛ·ÔÛ·ÍÛ·ÆÛ·¿Û·¸Û·±Û·ªÛ·£Û·œÛ·•Û·ŽÛ·‡Û·€Û·yÛ·rÛ·kÛ·dÛ·]Û·VÛ·OÛ·HÛ·AÛ·:Û·3Û·,Û·%Û·Û·Û·Û· Û·Û·ûÚ·ôÚ·íÚ·æÚ·ßÚ·ØÚ·ÑÚ·ÊÚ·ÃÚ·¼Ú·µÚ·®Ú·§Ú· Ú·™Ú·’Ú·‹Ú·„Ú·}Ú·vÚ·oÚ·hÚ·aÚ·ZÚ·SÚ·LÚ·EÚ·>Ú·7Ú·0Ú·)Ú·"Ú·Ú·Ú· Ú·Ú·ÿÙ·øÙ·ñÙ·êÙ·ãÙ·ÜÙ·ÕÙ·ÎÙ·ÇÙ·ÀÙ·¹Ù·²Ù·«Ù·¤Ù·Ù·–ٷٷˆÙ·Ù·zÙ·sÙ·lÙ·eÙ·^Ù·WÙ·PÙ·IÙ·BÙ·;Ù·4Ù·-Ù·&ٷٷٷٷ ٷٷüØ·õØ·îØ·çØ·àØ·ÙØ·ÒØ·ËØ·ÄØ·½Ø·¶Ø·¯Ø·¨Ø·¡Ø·šØ·“Ø·ŒØ·…Ø·~Ø·wØ·pØ·iØ·bØ·[Ø·TØ·MØ·FØ·?Ø·8Ø·1Ø·*Ø·#ططططططù×·ò×·ë×·ä×·Ý×·Ö×·Ï×·È×·Á×·º×·³×·¬×·¥×·ž×·—×·×·‰×·‚×·{×·t×·m×·f×·_×·X×·Q×·J×·C×·<×·5×·.×·'×· ×·×·×· ×·×·ýÖ·öÖ·ïÖ·èÖ·áÖ·ÚÖ·ÓÖ·ÌÖ·ÅÖ·¾Ö··Ö·°Ö·©Ö·¢Ö·›Ö·”Ö·Ö·†Ö·Ö·xÖ·qÖ·jÖ·cÖ·\Ö·UÖ·NÖ·GÖ·@Ö·9Ö·2Ö·+Ö·$Ö·Ö·Ö·Ö·Ö·Ö·úÕ·óÕ·ìÕ·åÕ·ÞÕ·×Õ·ÐÕ·ÉÕ·ÂÕ·»Õ·´Õ·­Õ·¦Õ·ŸÕ·˜Õ·‘Õ·ŠÕ·ƒÕ·|Õ·uÕ·nÕ·gÕ·`Õ·YÕ·RÕ·KÕ·DÕ·=Õ·6Õ·/Õ·(Õ·!Õ·Õ·Õ· Õ·Õ·þÔ·÷Ô·ðÔ·éÔ·âÔ·ÛÔ·ÔÔ·ÍÔ·ÆÔ·¿Ô·¸Ô·±Ô·ªÔ·£Ô·œÔ·•Ô·ŽÔ·‡Ô·€Ô·yÔ·rÔ·kÔ·dÔ·]Ô·VÔ·OÔ·HÔ·AÔ·:Ô·3Ô·,Ô·%Ô·Ô·Ô·Ô· Ô·Ô·ûÓ·ôÓ·íÓ·æÓ·ßÓ·ØÓ·ÑÓ·ÊÓ·ÃÓ·¼Ó·µÓ·®Ó·§Ó· Ó·™Ó·’Ó·‹Ó·„Ó·}Ó·vÓ·oÓ·hÓ·aÓ·ZÓ·SÓ·LÓ·EÓ·>Ó·7Ó·0Ó·)Ó·"Ó·Ó·Ó· Ó·Ó·ÿÒ·øÒ·ñÒ·êÒ·ãÒ·ÜÒ·ÕÒ·ÎÒ·ÇÒ·ÀÒ·¹Ò·²Ò·«Ò·¤Ò·Ò·–Ò·Ò·ˆÒ·Ò·zÒ·sÒ·lÒ·eÒ·^Ò·WÒ·PÒ·IÒ·BÒ·;Ò·4Ò·-Ò·&Ò·Ò·Ò·Ò· Ò·Ò·üÑ·õÑ·îÑ·çÑ·àÑ·ÙÑ·ÒÑ·ËÑ·ÄÑ·½Ñ·¶Ñ·¯Ñ·¨Ñ·¡Ñ·šÑ·“Ñ·ŒÑ·…Ñ·~Ñ·wÑ·pÑ·iÑ·bÑ·[Ñ·TÑ·MÑ·FÑ·?Ñ·8Ñ·1Ñ·*Ñ·#Ñ·Ñ·Ñ·Ñ·Ñ·Ñ·ùзòзëзäзÝзÖзÏзÈзÁзºÐ·³Ð·¬Ð·¥Ð·žÐ·—зз‰Ð·‚з{зtзmзfз_зXзQзJзCз<з5з.з'з ззз ззýÏ·öÏ·ïÏ·èÏ·áÏ·ÚÏ·ÓÏ·ÌÏ·ÅÏ·¾Ï··Ï·°Ï·©Ï·¢Ï·›Ï·”Ï·Ï·†Ï·Ï·xÏ·qÏ·jÏ·cÏ·\Ï·UÏ·NÏ·GÏ·@Ï·9Ï·2Ï·+Ï·$Ï·Ï·Ï·Ï·Ï·Ï·úηóηìηåηÞη×ηÐηÉηÂη»Î·´Î·­Î·¦Î·ŸÎ·˜Î·‘ηŠÎ·ƒÎ·|ηuηnηgη`ηYηRηKηDη=η6η/η(η!ηηη ηηþÍ·÷Í·ðÍ·éÍ·âÍ·ÛÍ·ÔÍ·ÍÍ·ÆÍ·¿Í·¸Í·±Í·ªÍ·£Í·œÍ·•Í·ŽÍ·‡Í·€Í·yÍ·rÍ·kÍ·dÍ·]Í·VÍ·OÍ·HÍ·AÍ·:Í·3Í·,Í·%Í·Í·Í·Í· Í·Í·ûÌ·ôÌ·íÌ·æÌ·ßÌ·ØÌ·ÑÌ·ÊÌ·ÃÌ·¼Ì·µÌ·®Ì·§Ì· Ì·™Ì·’Ì·‹Ì·„Ì·}Ì·vÌ·oÌ·hÌ·aÌ·ZÌ·SÌ·LÌ·EÌ·>Ì·7Ì·0Ì·)Ì·"Ì·Ì·Ì· Ì·Ì·ÿË·øË·ñË·êË·ãË·ÜË·ÕË·ÎË·ÇË·ÀË·¹Ë·²Ë·«Ë·¤Ë·Ë·–Ë·Ë·ˆË·Ë·zË·sË·lË·eË·^Ë·WË·PË·IË·BË·;Ë·4Ë·-Ë·&Ë·Ë·Ë·Ë· Ë·Ë·üÊ·õÊ·îÊ·çÊ·àÊ·ÙÊ·ÒÊ·ËÊ·ÄÊ·½Ê·¶Ê·¯Ê·¨Ê·¡Ê·šÊ·“Ê·ŒÊ·…Ê·~Ê·wÊ·pÊ·iÊ·bÊ·[Ê·TÊ·MÊ·FÊ·?Ê·8Ê·1Ê·*Ê·#Ê·Ê·Ê·Ê·Ê·Ê·ùÉ·òÉ·ëÉ·äÉ·ÝÉ·ÖÉ·ÏÉ·ÈÉ·ÁÉ·ºÉ·³É·¬É·¥É·žÉ·—É·É·‰É·‚É·{É·tÉ·mÉ·fÉ·_É·XÉ·QÉ·JÉ·CÉ·<É·5É·.É·'É· É·É·É· É·É·ýÈ·öÈ·ïÈ·èÈ·áÈ·ÚÈ·ÓÈ·ÌÈ·ÅÈ·¾È··È·°È·©È·¢È·›È·”È·È·†È·È·xÈ·qÈ·jÈ·cÈ·\È·UÈ·NÈ·GÈ·@È·9È·2È·+È·$È·È·È·È·È·È·úÇ·óÇ·ìÇ·åÇ·ÞÇ·×Ç·ÐÇ·ÉÇ·ÂÇ·»Ç·´Ç·­Ç·¦Ç·ŸÇ·˜Ç·‘Ç·ŠÇ·ƒÇ·|Ç·uÇ·nÇ·gÇ·`Ç·YÇ·RÇ·KÇ·DÇ·=Ç·6Ç·/Ç·(Ç·!Ç·Ç·Ç· Ç·Ç·þÆ·÷Æ·ðÆ·鯷âÆ·ÛÆ·ÔÆ·ÍÆ·ÆÆ·¿Æ·¸Æ·±Æ·ªÆ·£Æ·œÆ·•Æ·ŽÆ·‡Æ·€Æ·yÆ·rÆ·kÆ·dÆ·]Æ·VÆ·OÆ·HÆ·AÆ·:Æ·3Æ·,Æ·%Æ·Æ·Æ·Æ· Æ·Æ·ûÅ·ôÅ·íÅ·æÅ·ßÅ·ØÅ·ÑÅ·ÊÅ·ÃÅ·¼Å·µÅ·®Å·§Å· Å·™Å·’Å·‹Å·„Å·}Å·vÅ·oÅ·hÅ·aÅ·ZÅ·SÅ·LÅ·EÅ·>Å·7Å·0Å·)Å·"Å·Å·Å· Å·Å·ÿÄ·øÄ·ñÄ·êÄ·ãÄ·ÜÄ·ÕÄ·ÎÄ·ÇÄ·ÀÄ·¹Ä·²Ä·«Ä·¤Ä·Ä·–Ä·Ä·ˆÄ·Ä·zÄ·sÄ·lÄ·eÄ·^Ä·WÄ·PÄ·IÄ·BÄ·;Ä·4Ä·-Ä·&Ä·Ä·Ä·Ä· Ä·Ä·ü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½Ã·¶Ã·¯Ã·¨Ã·¡Ã·šÃ·“÷ŒÃ·…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ù·ò·ë·ä·Ý·Ö·Ï·È·Á·ºÂ·³Â·¬Â·¥Â·žÂ·—··‰Â·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ýÁ·öÁ·ïÁ·èÁ·áÁ·ÚÁ·ÓÁ·ÌÁ·ÅÁ·¾Á··Á·°Á·©Á·¢Á·›Á·”Á·Á·†Á·Á·xÁ·qÁ·jÁ·cÁ·\Á·UÁ·NÁ·GÁ·@Á·9Á·2Á·+Á·$Á·Á·Á·Á·Á·Á·úÀ·óÀ·ìÀ·åÀ·ÞÀ·×À·ÐÀ·ÉÀ·ÂÀ·»À·´À·­À·¦À·ŸÀ·˜À·‘À·ŠÀ·ƒÀ·|À·uÀ·nÀ·gÀ·`À·YÀ·RÀ·KÀ·DÀ·=À·6À·/À·(À·!À·À·À· À·À·þ¿·÷¿·ð¿·é¿·â¿·Û¿·Ô¿·Í¿·Æ¿·¿¿·¸¿·±¿·ª¿·£¿·œ¿·•¿·Ž¿·‡¿·€¿·y¿·r¿·k¿·d¿·]¿·V¿·O¿·H¿·A¿·:¿·3¿·,¿·%¿·¿·¿·¿· ¿·¿·û¾·ô¾·í¾·æ¾·ß¾·ؾ·Ѿ·ʾ·þ·¼¾·µ¾·®¾·§¾· ¾·™¾·’¾·‹¾·„¾·}¾·v¾·o¾·h¾·a¾·Z¾·S¾·L¾·E¾·>¾·7¾·0¾·)¾·"¾·¾·¾· ¾·¾·ÿ½·ø½·ñ½·ê½·ã½·ܽ·Õ½·ν·ǽ·À½·¹½·²½·«½·¤½·½·–½·½·ˆ½·½·z½·s½·l½·e½·^½·W½·P½·I½·B½·;½·4½·-½·&½·½·½·½· ½·½·ü¼·õ¼·î¼·ç¼·༷Ù¼·Ò¼·˼·ļ·½¼·¶¼·¯¼·¨¼·¡¼·š¼·“¼·Œ¼·…¼·~¼·w¼·p¼·i¼·b¼·[¼·T¼·M¼·F¼·?¼·8¼·1¼·*¼·#¼·¼·¼·¼·¼·¼·ù»·ò»·ë»·ä»·Ý»·Ö»·Ï»·È»·Á»·º»·³»·¬»·¥»·ž»·—»·»·‰»·‚»·{»·t»·m»·f»·_»·X»·Q»·J»·C»·<»·5»·.»·'»· »·»·»· »·»·ýº·öº·ﺷ躷ặÚº·Óº·̺·ź·¾º··º·°º·©º·¢º·›º·”º·º·†º·º·xº·qº·jº·cº·\º·Uº·Nº·Gº·@º·9º·2º·+º·$º·º·º·º·º·º·ú¹·ó¹·ì¹·å¹·Þ¹·×¹·й·ɹ·¹·»¹·´¹·­¹·¦¹·Ÿ¹·˜¹·‘¹·й·ƒ¹·|¹·u¹·n¹·g¹·`¹·Y¹·R¹·K¹·D¹·=¹·6¹·/¹·(¹·!¹·¹·¹· ¹·¹·þ¸·÷¸·ð¸·鸷⸷Û¸·Ô¸·͸·Ƹ·¿¸·¸¸·±¸·ª¸·£¸·œ¸·•¸·ޏ·‡¸·€¸·y¸·r¸·k¸·d¸·]¸·V¸·O¸·H¸·A¸·:¸·3¸·,¸·%¸·¸·¸·¸· ¸·¸·û··ô··í··æ··ß··Ø··Ñ··Ê··÷·¼··µ··®··§·· ··™··’··‹··„··}··v··o··h··a··Z··S··L··E··>··7··0··)··"······ ····ÿ¶·ø¶·ñ¶·ê¶·ã¶·ܶ·Õ¶·ζ·Ƕ·À¶·¹¶·²¶·«¶·¤¶·¶·–¶·¶·ˆ¶·¶·z¶·s¶·l¶·e¶·^¶·W¶·P¶·I¶·B¶·;¶·4¶·-¶·&¶·¶·¶·¶· ¶·¶·üµ·õµ·îµ·çµ·൷Ùµ·Òµ·˵·ĵ·½µ·¶µ·¯µ·¨µ·¡µ·šµ·“µ·Œµ·…µ·~µ·wµ·pµ·iµ·bµ·[µ·Tµ·Mµ·Fµ·?µ·8µ·1µ·*µ·#µ·µ·µ·µ·µ·µ·ù´·ò´·ë´·ä´·Ý´·Ö´·Ï´·È´·Á´·º´·³´·¬´·¥´·ž´·—´·´·‰´·‚´·{´·t´·m´·f´·_´·X´·Q´·J´·C´·<´·5´·.´·'´· ´·´·´· ´·´·ý³·ö³·ï³·è³·á³·Ú³·Ó³·̳·ų·¾³··³·°³·©³·¢³·›³·”³·³·†³·³·x³·q³·j³·c³·\³·U³·N³·G³·@³·9³·2³·+³·$³·³·³·³·³·³·ú²·ó²·ì²·å²·Þ²·ײ·в·ɲ·²·»²·´²·­²·¦²·Ÿ²·˜²·‘²·в·ƒ²·|²·u²·n²·g²·`²·Y²·R²·K²·D²·=²·6²·/²·(²·!²·²·²· ²·²·þ±·÷±·ð±·é±·â±·Û±·Ô±·ͱ·Ʊ·¿±·¸±·±±·ª±·£±·œ±·•±·ޱ·‡±·€±·y±·r±·k±·d±·]±·V±·O±·H±·A±·:±·3±·,±·%±·±·±·±· ±·±·û°·ô°·í°·æ°·ß°·ذ·Ѱ·ʰ·ð·¼°·µ°·®°·§°· °·™°·’°·‹°·„°·}°·v°·o°·h°·a°·Z°·S°·L°·E°·>°·7°·0°·)°·"°·°·°· °·°·ÿ¯·ø¯·ñ¯·꯷㯷ܯ·Õ¯·ί·ǯ·À¯·¹¯·²¯·«¯·¤¯·¯·–¯·¯·ˆ¯·¯·z¯·s¯·l¯·e¯·^¯·W¯·P¯·I¯·B¯·;¯·4¯·-¯·&¯·¯·¯·¯· ¯·¯·ü®·õ®·î®·ç®·à®·Ù®·Ò®·Ë®·Ä®·½®·¶®·¯®·¨®·¡®·š®·“®·Œ®·…®·~®·w®·p®·i®·b®·[®·T®·M®·F®·?®·8®·1®·*®·#®·®·®·®·®·®·ù­·ò­·ë­·ä­·Ý­·Ö­·Ï­·È­·Á­·º­·³­·¬­·¥­·ž­·—­·­·‰­·‚­·{­·t­·m­·f­·_­·X­·Q­·J­·C­·<­·5­·.­·'­· ­·­·­· ­·­·ý¬·ö¬·﬷謷ᬷÚ¬·Ó¬·̬·Ŭ·¾¬··¬·°¬·©¬·¢¬·›¬·”¬·¬·†¬·¬·x¬·q¬·j¬·c¬·\¬·U¬·N¬·G¬·@¬·9¬·2¬·+¬·$¬·¬·¬·¬·¬·¬·ú«·ó«·ì«·å«·Þ«·׫·Ы·É«·«·»«·´«·­«·¦«·Ÿ«·˜«·‘«·Š«·ƒ«·|«·u«·n«·g«·`«·Y«·R«·K«·D«·=«·6«·/«·(«·!«·«·«· «·«·þª·÷ª·ðª·骷⪷Ûª·Ôª·ͪ·ƪ·¿ª·¸ª·±ª·ªª·£ª·œª·•ª·Žª·‡ª·€ª·yª·rª·kª·dª·]ª·Vª·Oª·Hª·Aª·:ª·3ª·,ª·%ª·ª·ª·ª· ª·ª·û©·ô©·í©·æ©·ß©·Ø©·Ñ©·Ê©·é·¼©·µ©·®©·§©· ©·™©·’©·‹©·„©·}©·v©·o©·h©·a©·Z©·S©·L©·E©·>©·7©·0©·)©·"©·©·©· ©·©·ÿ¨·ø¨·ñ¨·꨷㨷ܨ·Õ¨·Ψ·Ǩ·À¨·¹¨·²¨·«¨·¤¨·¨·–¨·¨·ˆ¨·¨·z¨·s¨·l¨·e¨·^¨·W¨·P¨·I¨·B¨·;¨·4¨·-¨·&¨·¨·¨·¨· ¨·¨·ü§·õ§·î§·ç§·à§·Ù§·Ò§·˧·ħ·½§·¶§·¯§·¨§·¡§·š§·“§·Œ§·…§·~§·w§·p§·i§·b§·[§·T§·M§·F§·?§·8§·1§·*§·#§·§·§·§·§·§·ù¦·ò¦·릷䦷ݦ·Ö¦·Ϧ·Ȧ·Á¦·º¦·³¦·¬¦·¥¦·ž¦·—¦·¦·‰¦·‚¦·{¦·t¦·m¦·f¦·_¦·X¦·Q¦·J¦·C¦·<¦·5¦·.¦·'¦· ¦·¦·¦· ¦·¦·ý¥·ö¥·亮襷᥷Ú¥·Ó¥·Ì¥·Å¥·¾¥··¥·°¥·©¥·¢¥·›¥·”¥·¥·†¥·¥·x¥·q¥·j¥·c¥·\¥·U¥·N¥·G¥·@¥·9¥·2¥·+¥·$¥·¥·¥·¥·¥·¥·ú¤·ó¤·줷夷Þ¤·פ·Ф·ɤ·¤·»¤·´¤·­¤·¦¤·Ÿ¤·˜¤·‘¤·Ф·ƒ¤·|¤·u¤·n¤·g¤·`¤·Y¤·R¤·K¤·D¤·=¤·6¤·/¤·(¤·!¤·¤·¤· ¤·¤·þ£·÷£·ð£·飷⣷Û£·Ô£·Í£·Æ£·¿£·¸£·±£·ª£·££·œ£·•£·Ž£·‡£·€£·y£·r£·k£·d£·]£·V£·O£·H£·A£·:£·3£·,£·%£·£·£·£· £·£·û¢·ô¢·í¢·梷ߢ·Ø¢·Ñ¢·Ê¢·â·¼¢·µ¢·®¢·§¢· ¢·™¢·’¢·‹¢·„¢·}¢·v¢·o¢·h¢·a¢·Z¢·S¢·L¢·E¢·>¢·7¢·0¢·)¢·"¢·¢·¢· ¢·¢·ÿ¡·ø¡·ñ¡·ê¡·ã¡·Ü¡·Õ¡·Ρ·Ç¡·À¡·¹¡·²¡·«¡·¤¡·¡·–¡·¡·ˆ¡·¡·z¡·s¡·l¡·e¡·^¡·W¡·P¡·I¡·B¡·;¡·4¡·-¡·&¡·¡·¡·¡· ¡·¡·ü ·õ ·î ·ç ·à ·Ù ·Ò ·Ë ·Ä ·½ ·¶ ·¯ ·¨ ·¡ ·š ·“ ·Œ ·… ·~ ·w ·p ·i ·b ·[ ·T ·M ·F ·? ·8 ·1 ·* ·# · · · · · ·ùŸ·òŸ·럷䟷ÝŸ·ÖŸ·ÏŸ·ÈŸ·ÁŸ·ºŸ·³Ÿ·¬Ÿ·¥Ÿ·žŸ·—Ÿ·Ÿ·‰Ÿ·‚Ÿ·{Ÿ·tŸ·mŸ·fŸ·_Ÿ·XŸ·QŸ·JŸ·CŸ·<Ÿ·5Ÿ·.Ÿ·'Ÿ· Ÿ·Ÿ·Ÿ· Ÿ·Ÿ·ýž·öž·ïž·èž·áž·Úž·Óž·Ìž·Åž·¾ž··ž·°ž·©ž·¢ž·›ž·”ž·ž·†ž·ž·xž·qž·jž·cž·\ž·Už·Nž·Gž·@ž·9ž·2ž·+ž·$ž·ž·ž·ž·ž·ž·ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þœ·÷œ·ðœ·霷✷Ûœ·Ôœ·Íœ·Æœ·¿œ·¸œ·±œ·ªœ·£œ·œœ·•œ·Žœ·‡œ·€œ·yœ·rœ·kœ·dœ·]œ·Vœ·Oœ·Hœ·Aœ·:œ·3œ·,œ·%œ·œ·œ·œ· œ·œ·û›·ô›·í›·æ›·ß›·Ø›·Ñ›·Ê›·Û·¼›·µ›·®›·§›· ›·™›·’›·‹›·„›·}›·v›·o›·h›·a›·Z›·S›·L›·E›·>›·7›·0›·)›·"›·›·›· ›·›·ÿš·øš·ñš·êš·ãš·Üš·Õš·Κ·Çš·Àš·¹š·²š·«š·¤š·š·–š·š·ˆš·š·zš·sš·lš·eš·^š·Wš·Pš·Iš·Bš·;š·4š·-š·&š·š·š·š· š·š·ü™·õ™·î™·ç™·à™·Ù™·Ò™·Ë™·Ä™·½™·¶™·¯™·¨™·¡™·š™·“™·Œ™·…™·~™·w™·p™·i™·b™·[™·T™·M™·F™·?™·8™·1™·*™·#™·™·™·™·™·™·ù˜·ò˜·똷䘷ݘ·Ö˜·Ϙ·Ș·Á˜·º˜·³˜·¬˜·¥˜·ž˜·—˜·˜·‰˜·‚˜·{˜·t˜·m˜·f˜·_˜·X˜·Q˜·J˜·C˜·<˜·5˜·.˜·'˜· ˜·˜·˜· ˜·˜·ý—·ö—·ï—·è—·á—·Ú—·Ó—·Ì—·Å—·¾—··—·°—·©—·¢—·›—·”—·—·†—·—·x—·q—·j—·c—·\—·U—·N—·G—·@—·9—·2—·+—·$—·—·—·—·—·—·ú–·ó–·ì–·å–·Þ–·×–·Ж·É–·–·»–·´–·­–·¦–·Ÿ–·˜–·‘–·Š–·ƒ–·|–·u–·n–·g–·`–·Y–·R–·K–·D–·=–·6–·/–·(–·!–·–·–· –·–·þ•·÷•·ð•·é•·â•·Û•·Ô•·Í•·Æ•·¿•·¸•·±•·ª•·£•·œ•·••·Ž•·‡•·€•·y•·r•·k•·d•·]•·V•·O•·H•·A•·:•·3•·,•·%•·•·•·•· •·•·û”·ô”·í”·æ”·ß”·Ø”·Ñ”·Ê”·Ô·¼”·µ”·®”·§”· ”·™”·’”·‹”·„”·}”·v”·o”·h”·a”·Z”·S”·L”·E”·>”·7”·0”·)”·"”·”·”· ”·”·ÿ“·ø“·ñ“·ê“·ã“·Ü“·Õ“·Γ·Ç“·À“·¹“·²“·«“·¤“·“·–“·“·ˆ“·“·z“·s“·l“·e“·^“·W“·P“·I“·B“·;“·4“·-“·&“·“·“·“· “·“·ü’·õ’·î’·ç’·à’·Ù’·Ò’·Ë’·Ä’·½’·¶’·¯’·¨’·¡’·š’·“’·Œ’·…’·~’·w’·p’·i’·b’·[’·T’·M’·F’·?’·8’·1’·*’·#’·’·’·’·’·’·ù‘·ò‘·ë‘·ä‘·Ý‘·Ö‘·Ï‘·È‘·Á‘·º‘·³‘·¬‘·¥‘·ž‘·—‘·‘·‰‘·‚‘·{‘·t‘·m‘·f‘·_‘·X‘·Q‘·J‘·C‘·<‘·5‘·.‘·'‘· ‘·‘·‘· ‘·‘·ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þŽ·÷Ž·ðŽ·鎷⎷ÛŽ·ÔŽ·ÍŽ·ÆŽ·¿Ž·¸Ž·±Ž·ªŽ·£Ž·œŽ·•Ž·ŽŽ·‡Ž·€Ž·yŽ·rŽ·kŽ·dŽ·]Ž·VŽ·OŽ·HŽ·AŽ·:Ž·3Ž·,Ž·%Ž·Ž·Ž·Ž· Ž·Ž·û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿŒ·øŒ·ñŒ·ꌷ㌷ÜŒ·ÕŒ·ÎŒ·ÇŒ·ÀŒ·¹Œ·²Œ·«Œ·¤Œ·Œ·–Œ·Œ·ˆŒ·Œ·zŒ·sŒ·lŒ·eŒ·^Œ·WŒ·PŒ·IŒ·BŒ·;Œ·4Œ·-Œ·&Œ·Œ·Œ·Œ· Œ·Œ·ü‹·õ‹·î‹·ç‹·à‹·Ù‹·Ò‹·Ë‹·Ä‹·½‹·¶‹·¯‹·¨‹·¡‹·š‹·“‹·Œ‹·…‹·~‹·w‹·p‹·i‹·b‹·[‹·T‹·M‹·F‹·?‹·8‹·1‹·*‹·#‹·‹·‹·‹·‹·‹·ùŠ·òŠ·늷䊷ÝŠ·ÖŠ·ÏŠ·ÈŠ·ÁŠ·ºŠ·³Š·¬Š·¥Š·žŠ·—Š·Š·‰Š·‚Š·{Š·tŠ·mŠ·fŠ·_Š·XŠ·QŠ·JŠ·CŠ·<Š·5Š·.Š·'Š· Š·Š·Š· Š·Š·ý‰·ö‰·艷ቷÚ‰·Ó‰·̉·ʼn·¾‰··‰·°‰·©‰·¢‰·›‰·”‰·‰·†‰·‰·x‰·q‰·j‰·c‰·\‰·U‰·N‰·G‰·@‰·9‰·2‰·+‰·$‰·‰·‰·‰·‰·‰·úˆ·óˆ·숷刷Þˆ·׈·Ј·Ɉ·ˆ·»ˆ·´ˆ·­ˆ·¦ˆ·Ÿˆ·˜ˆ·‘ˆ·Šˆ·ƒˆ·|ˆ·uˆ·nˆ·gˆ·`ˆ·Yˆ·Rˆ·Kˆ·Dˆ·=ˆ·6ˆ·/ˆ·(ˆ·!ˆ·ˆ·ˆ· ˆ·ˆ·þ‡·÷‡·ð‡·釷⇷Û‡·Ô‡·͇·Ƈ·¿‡·¸‡·±‡·ª‡·£‡·œ‡·•‡·އ·‡‡·€‡·y‡·r‡·k‡·d‡·]‡·V‡·O‡·H‡·A‡·:‡·3‡·,‡·%‡·‡·‡·‡· ‡·‡·û†·ô†·톷憷߆·؆·ц·ʆ·Æ·¼†·µ†·®†·§†· †·™†·’†·‹†·„†·}†·v†·o†·h†·a†·Z†·S†·L†·E†·>†·7†·0†·)†·"†·†·†· †·†·ÿ…·ø…·ñ…·ê…·ã…·Ü…·Õ…·Î…·Ç…·À…·¹…·²…·«…·¤…·…·–…·…·ˆ…·…·z…·s…·l…·e…·^…·W…·P…·I…·B…·;…·4…·-…·&…·…·…·…· …·…·ü„·õ„·î„·ç„·à„·Ù„·Ò„·Ë„·Ä„·½„·¶„·¯„·¨„·¡„·š„·“„·Œ„·…„·~„·w„·p„·i„·b„·[„·T„·M„·F„·?„·8„·1„·*„·#„·„·„·„·„·„·ùƒ·òƒ·냷䃷݃·Öƒ·σ·ȃ·Áƒ·ºƒ·³ƒ·¬ƒ·¥ƒ·žƒ·—ƒ·ƒ·‰ƒ·‚ƒ·{ƒ·tƒ·mƒ·fƒ·_ƒ·Xƒ·Qƒ·Jƒ·Cƒ·<ƒ·5ƒ·.ƒ·'ƒ· ƒ·ƒ·ƒ· ƒ·ƒ·ý‚·ö‚·ï‚·è‚·á‚·Ú‚·Ó‚·Ì‚·Å‚·¾‚··‚·°‚·©‚·¢‚·›‚·”‚·‚·†‚·‚·x‚·q‚·j‚·c‚·\‚·U‚·N‚·G‚·@‚·9‚·2‚·+‚·$‚·‚·‚·‚·‚·‚·ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ€·÷€·ð€·逷‷Û€·Ô€·Í€·Æ€·¿€·¸€·±€·ª€·£€·œ€·•€·Ž€·‡€·€€·y€·r€·k€·d€·]€·V€·O€·H€·A€·:€·3€·,€·%€·€·€·€· €·€·û·ô·í·æ·ß·Ø·Ñ·Ê·Ã·¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ~·ø~·ñ~·ê~·ã~·Ü~·Õ~·Î~·Ç~·À~·¹~·²~·«~·¤~·~·–~·~·ˆ~·~·z~·s~·l~·e~·^~·W~·P~·I~·B~·;~·4~·-~·&~·~·~·~· ~·~·ü}·õ}·î}·ç}·à}·Ù}·Ò}·Ë}·Ä}·½}·¶}·¯}·¨}·¡}·š}·“}·Œ}·…}·~}·w}·p}·i}·b}·[}·T}·M}·F}·?}·8}·1}·*}·#}·}·}·}·}·}·ù|·ò|·ë|·ä|·Ý|·Ö|·Ï|·È|·Á|·º|·³|·¬|·¥|·ž|·—|·|·‰|·‚|·{|·t|·m|·f|·_|·X|·Q|·J|·C|·<|·5|·.|·'|· |·|·|· |·|·ý{·ö{·ï{·è{·á{·Ú{·Ó{·Ì{·Å{·¾{··{·°{·©{·¢{·›{·”{·{·†{·{·x{·q{·j{·c{·\{·U{·N{·G{·@{·9{·2{·+{·${·{·{·{·{·{·úz·óz·ìz·åz·Þz·×z·Ðz·Éz·Âz·»z·´z·­z·¦z·Ÿz·˜z·‘z·Šz·ƒz·|z·uz·nz·gz·`z·Yz·Rz·Kz·Dz·=z·6z·/z·(z·!z·z·z· z·z·þy·÷y·ðy·éy·ây·Ûy·Ôy·Íy·Æy·¿y·¸y·±y·ªy·£y·œy·•y·Žy·‡y·€y·yy·ry·ky·dy·]y·Vy·Oy·Hy·Ay·:y·3y·,y·%y·y·y·y· y·y·ûx·ôx·íx·æx·ßx·Øx·Ñx·Êx·Ãx·¼x·µx·®x·§x· x·™x·’x·‹x·„x·}x·vx·ox·hx·ax·Zx·Sx·Lx·Ex·>x·7x·0x·)x·"x·x·x· x·x·ÿw·øw·ñw·êw·ãw·Üw·Õw·Îw·Çw·Àw·¹w·²w·«w·¤w·w·–w·w·ˆw·w·zw·sw·lw·ew·^w·Ww·Pw·Iw·Bw·;w·4w·-w·&w·w·w·w· w·w·üv·õv·îv·çv·àv·Ùv·Òv·Ëv·Äv·½v·¶v·¯v·¨v·¡v·šv·“v·Œv·…v·~v·wv·pv·iv·bv·[v·Tv·Mv·Fv·?v·8v·1v·*v·#v·v·v·v·v·v·ùu·òu·ëu·äu·Ýu·Öu·Ïu·Èu·Áu·ºu·³u·¬u·¥u·žu·—u·u·‰u·‚u·{u·tu·mu·fu·_u·Xu·Qu·Ju·Cu·q·7q·0q·)q·"q·q·q· q·q·ÿp·øp·ñp·êp·ãp·Üp·Õp·Îp·Çp·Àp·¹p·²p·«p·¤p·p·–p·p·ˆp·p·zp·sp·lp·ep·^p·Wp·Pp·Ip·Bp·;p·4p·-p·&p·p·p·p· p·p·üo·õo·îo·ço·ào·Ùo·Òo·Ëo·Äo·½o·¶o·¯o·¨o·¡o·šo·“o·Œo·…o·~o·wo·po·io·bo·[o·To·Mo·Fo·?o·8o·1o·*o·#o·o·o·o·o·o·ùn·òn·ën·än·Ýn·Ön·Ïn·Èn·Án·ºn·³n·¬n·¥n·žn·—n·n·‰n·‚n·{n·tn·mn·fn·_n·Xn·Qn·Jn·Cn·j·7j·0j·)j·"j·j·j· j·j·ÿi·øi·ñi·êi·ãi·Üi·Õi·Îi·Çi·Ài·¹i·²i·«i·¤i·i·–i·i·ˆi·i·zi·si·li·ei·^i·Wi·Pi·Ii·Bi·;i·4i·-i·&i·i·i·i· i·i·üh·õh·îh·çh·àh·Ùh·Òh·Ëh·Äh·½h·¶h·¯h·¨h·¡h·šh·“h·Œh·…h·~h·wh·ph·ih·bh·[h·Th·Mh·Fh·?h·8h·1h·*h·#h·h·h·h·h·h·ùg·òg·ëg·äg·Ýg·Ög·Ïg·Èg·Ág·ºg·³g·¬g·¥g·žg·—g·g·‰g·‚g·{g·tg·mg·fg·_g·Xg·Qg·Jg·Cg·c·7c·0c·)c·"c·c·c· c·c·ÿb·øb·ñb·êb·ãb·Üb·Õb·Îb·Çb·Àb·¹b·²b·«b·¤b·b·–b·b·ˆb·b·zb·sb·lb·eb·^b·Wb·Pb·Ib·Bb·;b·4b·-b·&b·b·b·b· b·b·üa·õa·îa·ça·àa·Ùa·Òa·Ëa·Äa·½a·¶a·¯a·¨a·¡a·ša·“a·Œa·…a·~a·wa·pa·ia·ba·[a·Ta·Ma·Fa·?a·8a·1a·*a·#a·a·a·a·a·a·ù`·ò`·ë`·ä`·Ý`·Ö`·Ï`·È`·Á`·º`·³`·¬`·¥`·ž`·—`·`·‰`·‚`·{`·t`·m`·f`·_`·X`·Q`·J`·C`·<`·5`·.`·'`· `·`·`· `·`·ý_·ö_·ï_·è_·á_·Ú_·Ó_·Ì_·Å_·¾_··_·°_·©_·¢_·›_·”_·_·†_·_·x_·q_·j_·c_·\_·U_·N_·G_·@_·9_·2_·+_·$_·_·_·_·_·_·ú^·ó^·ì^·å^·Þ^·×^·Ð^·É^·Â^·»^·´^·­^·¦^·Ÿ^·˜^·‘^·Š^·ƒ^·|^·u^·n^·g^·`^·Y^·R^·K^·D^·=^·6^·/^·(^·!^·^·^· ^·^·þ]·÷]·ð]·é]·â]·Û]·Ô]·Í]·Æ]·¿]·¸]·±]·ª]·£]·œ]·•]·Ž]·‡]·€]·y]·r]·k]·d]·]]·V]·O]·H]·A]·:]·3]·,]·%]·]·]·]· ]·]·û\·ô\·í\·æ\·ß\·Ø\·Ñ\·Ê\·Ã\·¼\·µ\·®\·§\· \·™\·’\·‹\·„\·}\·v\·o\·h\·a\·Z\·S\·L\·E\·>\·7\·0\·)\·"\·\·\· \·\·ÿ[·ø[·ñ[·ê[·ã[·Ü[·Õ[·Î[·Ç[·À[·¹[·²[·«[·¤[·[·–[·[·ˆ[·[·z[·s[·l[·e[·^[·W[·P[·I[·B[·;[·4[·-[·&[·[·[·[· [·[·üZ·õZ·îZ·çZ·àZ·ÙZ·ÒZ·ËZ·ÄZ·½Z·¶Z·¯Z·¨Z·¡Z·šZ·“Z·ŒZ·…Z·~Z·wZ·pZ·iZ·bZ·[Z·TZ·MZ·FZ·?Z·8Z·1Z·*Z·#Z·Z·Z·Z·Z·Z·ùY·òY·ëY·äY·ÝY·ÖY·ÏY·ÈY·ÁY·ºY·³Y·¬Y·¥Y·žY·—Y·Y·‰Y·‚Y·{Y·tY·mY·fY·_Y·XY·QY·JY·CY·U·7U·0U·)U·"U·U·U· U·U·ÿT·øT·ñT·êT·ãT·ÜT·ÕT·ÎT·ÇT·ÀT·¹T·²T·«T·¤T·T·–T·T·ˆT·T·zT·sT·lT·eT·^T·WT·PT·IT·BT·;T·4T·-T·&T·T·T·T· T·T·üS·õS·îS·çS·àS·ÙS·ÒS·ËS·ÄS·½S·¶S·¯S·¨S·¡S·šS·“S·ŒS·…S·~S·wS·pS·iS·bS·[S·TS·MS·FS·?S·8S·1S·*S·#S·S·S·S·S·S·ùR·òR·ëR·äR·ÝR·ÖR·ÏR·ÈR·ÁR·ºR·³R·¬R·¥R·žR·—R·R·‰R·‚R·{R·tR·mR·fR·_R·XR·QR·JR·CR·N·7N·0N·)N·"N·N·N· N·N·ÿM·øM·ñM·êM·ãM·ÜM·ÕM·ÎM·ÇM·ÀM·¹M·²M·«M·¤M·M·–M·M·ˆM·M·zM·sM·lM·eM·^M·WM·PM·IM·BM·;M·4M·-M·&M·M·M·M· M·M·üL·õL·îL·çL·àL·ÙL·ÒL·ËL·ÄL·½L·¶L·¯L·¨L·¡L·šL·“L·ŒL·…L·~L·wL·pL·iL·bL·[L·TL·ML·FL·?L·8L·1L·*L·#L·L·L·L·L·L·ùK·òK·ëK·äK·ÝK·ÖK·ÏK·ÈK·ÁK·ºK·³K·¬K·¥K·žK·—K·K·‰K·‚K·{K·tK·mK·fK·_K·XK·QK·JK·CK·G·7G·0G·)G·"G·G·G· G·G·ÿF·øF·ñF·êF·ãF·ÜF·ÕF·ÎF·ÇF·ÀF·¹F·²F·«F·¤F·F·–F·F·ˆF·F·zF·sF·lF·eF·^F·WF·PF·IF·BF·;F·4F·-F·&F·F·F·F· F·F·üE·õE·îE·çE·àE·ÙE·ÒE·ËE·ÄE·½E·¶E·¯E·¨E·¡E·šE·“E·ŒE·…E·~E·wE·pE·iE·bE·[E·TE·ME·FE·?E·8E·1E·*E·#E·E·E·E·E·E·ùD·òD·ëD·äD·ÝD·ÖD·ÏD·ÈD·ÁD·ºD·³D·¬D·¥D·žD·—D·D·‰D·‚D·{D·tD·mD·fD·_D·XD·QD·JD·CD·@·7@·0@·)@·"@·@·@· @·@·ÿ?·ø?·ñ?·ê?·ã?·Ü?·Õ?·Î?·Ç?·À?·¹?·²?·«?·¤?·?·–?·?·ˆ?·?·z?·s?·l?·e?·^?·W?·P?·I?·B?·;?·4?·-?·&?·?·?·?· ?·?·ü>·õ>·î>·ç>·à>·Ù>·Ò>·Ë>·Ä>·½>·¶>·¯>·¨>·¡>·š>·“>·Œ>·…>·~>·w>·p>·i>·b>·[>·T>·M>·F>·?>·8>·1>·*>·#>·>·>·>·>·>·ù=·ò=·ë=·ä=·Ý=·Ö=·Ï=·È=·Á=·º=·³=·¬=·¥=·ž=·—=·=·‰=·‚=·{=·t=·m=·f=·_=·X=·Q=·J=·C=·<=·5=·.=·'=· =·=·=· =·=·ý<·ö<·ï<·è<·á<·Ú<·Ó<·Ì<·Å<·¾<··<·°<·©<·¢<·›<·”<·<·†<·<·x<·q<·j<·c<·\<·U<·N<·G<·@<·9<·2<·+<·$<·<·<·<·<·<·ú;·ó;·ì;·å;·Þ;·×;·Ð;·É;·Â;·»;·´;·­;·¦;·Ÿ;·˜;·‘;·Š;·ƒ;·|;·u;·n;·g;·`;·Y;·R;·K;·D;·=;·6;·/;·(;·!;·;·;· ;·;·þ:·÷:·ð:·é:·â:·Û:·Ô:·Í:·Æ:·¿:·¸:·±:·ª:·£:·œ:·•:·Ž:·‡:·€:·y:·r:·k:·d:·]:·V:·O:·H:·A:·::·3:·,:·%:·:·:·:· :·:·û9·ô9·í9·æ9·ß9·Ø9·Ñ9·Ê9·Ã9·¼9·µ9·®9·§9· 9·™9·’9·‹9·„9·}9·v9·o9·h9·a9·Z9·S9·L9·E9·>9·79·09·)9·"9·9·9· 9·9·ÿ8·ø8·ñ8·ê8·ã8·Ü8·Õ8·Î8·Ç8·À8·¹8·²8·«8·¤8·8·–8·8·ˆ8·8·z8·s8·l8·e8·^8·W8·P8·I8·B8·;8·48·-8·&8·8·8·8· 8·8·ü7·õ7·î7·ç7·à7·Ù7·Ò7·Ë7·Ä7·½7·¶7·¯7·¨7·¡7·š7·“7·Œ7·…7·~7·w7·p7·i7·b7·[7·T7·M7·F7·?7·87·17·*7·#7·7·7·7·7·7·ù6·ò6·ë6·ä6·Ý6·Ö6·Ï6·È6·Á6·º6·³6·¬6·¥6·ž6·—6·6·‰6·‚6·{6·t6·m6·f6·_6·X6·Q6·J6·C6·<6·56·.6·'6· 6·6·6· 6·6·ý5·ö5·ï5·è5·á5·Ú5·Ó5·Ì5·Å5·¾5··5·°5·©5·¢5·›5·”5·5·†5·5·x5·q5·j5·c5·\5·U5·N5·G5·@5·95·25·+5·$5·5·5·5·5·5·ú4·ó4·ì4·å4·Þ4·×4·Ð4·É4·Â4·»4·´4·­4·¦4·Ÿ4·˜4·‘4·Š4·ƒ4·|4·u4·n4·g4·`4·Y4·R4·K4·D4·=4·64·/4·(4·!4·4·4· 4·4·þ3·÷3·ð3·é3·â3·Û3·Ô3·Í3·Æ3·¿3·¸3·±3·ª3·£3·œ3·•3·Ž3·‡3·€3·y3·r3·k3·d3·]3·V3·O3·H3·A3·:3·33·,3·%3·3·3·3· 3·3·û2·ô2·í2·æ2·ß2·Ø2·Ñ2·Ê2·Ã2·¼2·µ2·®2·§2· 2·™2·’2·‹2·„2·}2·v2·o2·h2·a2·Z2·S2·L2·E2·>2·72·02·)2·"2·2·2· 2·2·ÿ1·ø1·ñ1·ê1·ã1·Ü1·Õ1·Î1·Ç1·À1·¹1·²1·«1·¤1·1·–1·1·ˆ1·1·z1·s1·l1·e1·^1·W1·P1·I1·B1·;1·41·-1·&1·1·1·1· 1·1·ü0·õ0·î0·ç0·à0·Ù0·Ò0·Ë0·Ä0·½0·¶0·¯0·¨0·¡0·š0·“0·Œ0·…0·~0·w0·p0·i0·b0·[0·T0·M0·F0·?0·80·10·*0·#0·0·0·0·0·0·ù/·ò/·ë/·ä/·Ý/·Ö/·Ï/·È/·Á/·º/·³/·¬/·¥/·ž/·—/·/·‰/·‚/·{/·t/·m/·f/·_/·X/·Q/·J/·C/·+·7+·0+·)+·"+·+·+· +·+·ÿ*·ø*·ñ*·ê*·ã*·Ü*·Õ*·Î*·Ç*·À*·¹*·²*·«*·¤*·*·–*·*·ˆ*·*·z*·s*·l*·e*·^*·W*·P*·I*·B*·;*·4*·-*·&*·*·*·*· *·*·ü)·õ)·î)·ç)·à)·Ù)·Ò)·Ë)·Ä)·½)·¶)·¯)·¨)·¡)·š)·“)·Œ)·…)·~)·w)·p)·i)·b)·[)·T)·M)·F)·?)·8)·1)·*)·#)·)·)·)·)·)·ù(·ò(·ë(·ä(·Ý(·Ö(·Ï(·È(·Á(·º(·³(·¬(·¥(·ž(·—(·(·‰(·‚(·{(·t(·m(·f(·_(·X(·Q(·J(·C(·<(·5(·.(·'(· (·(·(· (·(·ý'·ö'·ï'·è'·á'·Ú'·Ó'·Ì'·Å'·¾'··'·°'·©'·¢'·›'·”'·'·†'·'·x'·q'·j'·c'·\'·U'·N'·G'·@'·9'·2'·+'·$'·'·'·'·'·'·ú&·ó&·ì&·å&·Þ&·×&·Ð&·É&·Â&·»&·´&·­&·¦&·Ÿ&·˜&·‘&·Š&·ƒ&·|&·u&·n&·g&·`&·Y&·R&·K&·D&·=&·6&·/&·(&·!&·&·&· &·&·þ%·÷%·ð%·é%·â%·Û%·Ô%·Í%·Æ%·¿%·¸%·±%·ª%·£%·œ%·•%·Ž%·‡%·€%·y%·r%·k%·d%·]%·V%·O%·H%·A%·:%·3%·,%·%%·%·%·%· %·%·û$·ô$·í$·æ$·ß$·Ø$·Ñ$·Ê$·Ã$·¼$·µ$·®$·§$· $·™$·’$·‹$·„$·}$·v$·o$·h$·a$·Z$·S$·L$·E$·>$·7$·0$·)$·"$·$·$· $·$·ÿ#·ø#·ñ#·ê#·ã#·Ü#·Õ#·Î#·Ç#·À#·¹#·²#·«#·¤#·#·–#·#·ˆ#·#·z#·s#·l#·e#·^#·W#·P#·I#·B#·;#·4#·-#·&#·#·#·#· #·#·ü"·õ"·î"·ç"·à"·Ù"·Ò"·Ë"·Ä"·½"·¶"·¯"·¨"·¡"·š"·“"·Œ"·…"·~"·w"·p"·i"·b"·["·T"·M"·F"·?"·8"·1"·*"·#"·"·"·"·"·"·ù!·ò!·ë!·ä!·Ý!·Ö!·Ï!·È!·Á!·º!·³!·¬!·¥!·ž!·—!·!·‰!·‚!·{!·t!·m!·f!·_!·X!·Q!·J!·C!··7·0·)·"··· ··ÿ·ø·ñ·ê·ã·Ü·Õ·Î·Ç·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú·ó·ì·å·Þ·×·Ð·É·Â·»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û·ô·í·æ·ß·Ø·Ñ·Ê·Ã·¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ·ø·ñ·ê·ã·Ü·Õ·Î·Ç·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú·ó·ì·å·Þ·×·Ð·É·Â·»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û·ô·í·æ·ß·Ø·Ñ·Ê·Ã·¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ·ø·ñ·ê·ã·Ü·Õ·Î·Ç·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü ·õ ·î ·ç ·à ·Ù ·Ò ·Ë ·Ä ·½ ·¶ ·¯ ·¨ ·¡ ·š ·“ ·Œ ·… ·~ ·w ·p ·i ·b ·[ ·T ·M ·F ·? ·8 ·1 ·* ·# · · · · · ·ù ·ò ·ë ·ä ·Ý ·Ö ·Ï ·È ·Á ·º ·³ ·¬ ·¥ ·ž ·— · ·‰ ·‚ ·{ ·t ·m ·f ·_ ·X ·Q ·J ·C ·< ·5 ·. ·' · · · · · ·ý ·ö ·ï ·è ·á ·Ú ·Ó ·Ì ·Å ·¾ ·· ·° ·© ·¢ ·› ·” · ·† · ·x ·q ·j ·c ·\ ·U ·N ·G ·@ ·9 ·2 ·+ ·$ · · · · · ·ú ·ó ·ì ·å ·Þ ·× ·Ð ·É · ·» ·´ ·­ ·¦ ·Ÿ ·˜ ·‘ ·Š ·ƒ ·| ·u ·n ·g ·` ·Y ·R ·K ·D ·= ·6 ·/ ·( ·! · · · · ·þ ·÷ ·ð ·é ·â ·Û ·Ô ·Í ·Æ ·¿ ·¸ ·± ·ª ·£ ·œ ·• ·Ž ·‡ ·€ ·y ·r ·k ·d ·] ·V ·O ·H ·A ·: ·3 ·, ·% · · · · · ·û·ô·í·æ·ß·Ø·Ñ·Ê·Ã·¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ·ø·ñ·ê·ã·Ü·Õ·Î·Ç·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú·ó·ì·å·Þ·×·Ð·É·Â·»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û·ô·í·æ·ß·Ø·Ñ·Ê·Ã·¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ·ø·ñ·ê·ã·Ü·Õ·ηÇ·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··üÿ¶õÿ¶îÿ¶çÿ¶àÿ¶Ùÿ¶Òÿ¶Ëÿ¶Äÿ¶½ÿ¶¶ÿ¶¯ÿ¶¨ÿ¶¡ÿ¶šÿ¶“ÿ¶Œÿ¶…ÿ¶~ÿ¶wÿ¶pÿ¶iÿ¶bÿ¶[ÿ¶Tÿ¶Mÿ¶Fÿ¶?ÿ¶8ÿ¶1ÿ¶*ÿ¶#ÿ¶ÿ¶ÿ¶ÿ¶ÿ¶ÿ¶ùþ¶òþ¶ëþ¶äþ¶Ýþ¶Öþ¶Ïþ¶Èþ¶Áþ¶ºþ¶³þ¶¬þ¶¥þ¶žþ¶—þ¶þ¶‰þ¶‚þ¶{þ¶tþ¶mþ¶fþ¶_þ¶Xþ¶Qþ¶Jþ¶Cþ¶<þ¶5þ¶.þ¶'þ¶ þ¶þ¶þ¶ þ¶þ¶ýý¶öý¶ïý¶èý¶áý¶Úý¶Óý¶Ìý¶Åý¶¾ý¶·ý¶°ý¶©ý¶¢ý¶›ý¶”ý¶ý¶†ý¶ý¶xý¶qý¶jý¶cý¶\ý¶Uý¶Ný¶Gý¶@ý¶9ý¶2ý¶+ý¶$ý¶ý¶ý¶ý¶ý¶ý¶úü¶óü¶ìü¶åü¶Þü¶×ü¶Ðü¶Éü¶Âü¶»ü¶´ü¶­ü¶¦ü¶Ÿü¶˜ü¶‘ü¶Šü¶ƒü¶|ü¶uü¶nü¶gü¶`ü¶Yü¶Rü¶Kü¶Dü¶=ü¶6ü¶/ü¶(ü¶!ü¶ü¶ü¶ ü¶ü¶þû¶÷û¶ðû¶éû¶âû¶Ûû¶Ôû¶Íû¶Æû¶¿û¶¸û¶±û¶ªû¶£û¶œû¶•û¶Žû¶‡û¶€û¶yû¶rû¶kû¶dû¶]û¶Vû¶Oû¶Hû¶Aû¶:û¶3û¶,û¶%û¶û¶û¶û¶ û¶û¶ûú¶ôú¶íú¶æú¶ßú¶Øú¶Ñú¶Êú¶Ãú¶¼ú¶µú¶®ú¶§ú¶ ú¶™ú¶’ú¶‹ú¶„ú¶}ú¶vú¶oú¶hú¶aú¶Zú¶Sú¶Lú¶Eú¶>ú¶7ú¶0ú¶)ú¶"ú¶ú¶ú¶ ú¶ú¶ÿù¶øù¶ñù¶êù¶ãù¶Üù¶Õù¶Îù¶Çù¶Àù¶¹ù¶²ù¶«ù¶¤ù¶ù¶–ù¶ù¶ˆù¶ù¶zù¶sù¶lù¶eù¶^ù¶Wù¶Pù¶Iù¶Bù¶;ù¶4ù¶-ù¶&ù¶ù¶ù¶ù¶ ù¶ù¶üø¶õø¶îø¶çø¶àø¶Ùø¶Òø¶Ëø¶Äø¶½ø¶¶ø¶¯ø¶¨ø¶¡ø¶šø¶“ø¶Œø¶…ø¶~ø¶wø¶pø¶iø¶bø¶[ø¶Tø¶Mø¶Fø¶?ø¶8ø¶1ø¶*ø¶#ø¶ø¶ø¶ø¶ø¶ø¶ù÷¶ò÷¶ë÷¶ä÷¶Ý÷¶Ö÷¶Ï÷¶È÷¶Á÷¶º÷¶³÷¶¬÷¶¥÷¶ž÷¶—÷¶÷¶‰÷¶‚÷¶{÷¶t÷¶m÷¶f÷¶_÷¶X÷¶Q÷¶J÷¶C÷¶<÷¶5÷¶.÷¶'÷¶ ÷¶÷¶÷¶ ÷¶÷¶ýö¶öö¶ïö¶èö¶áö¶Úö¶Óö¶Ìö¶Åö¶¾ö¶·ö¶°ö¶©ö¶¢ö¶›ö¶”ö¶ö¶†ö¶ö¶xö¶qö¶jö¶cö¶\ö¶Uö¶Nö¶Gö¶@ö¶9ö¶2ö¶+ö¶$ö¶ö¶ö¶ö¶ö¶ö¶úõ¶óõ¶ìõ¶åõ¶Þõ¶×õ¶Ðõ¶Éõ¶Âõ¶»õ¶´õ¶­õ¶¦õ¶Ÿõ¶˜õ¶‘õ¶Šõ¶ƒõ¶|õ¶uõ¶nõ¶gõ¶`õ¶Yõ¶Rõ¶Kõ¶Dõ¶=õ¶6õ¶/õ¶(õ¶!õ¶õ¶õ¶ õ¶õ¶þô¶÷ô¶ðô¶éô¶âô¶Ûô¶Ôô¶Íô¶Æô¶¿ô¶¸ô¶±ô¶ªô¶£ô¶œô¶•ô¶Žô¶‡ô¶€ô¶yô¶rô¶kô¶dô¶]ô¶Vô¶Oô¶Hô¶Aô¶:ô¶3ô¶,ô¶%ô¶ô¶ô¶ô¶ ô¶ô¶ûó¶ôó¶íó¶æó¶ßó¶Øó¶Ñó¶Êó¶Ãó¶¼ó¶µó¶®ó¶§ó¶ ó¶™ó¶’ó¶‹ó¶„ó¶}ó¶vó¶oó¶hó¶aó¶Zó¶Só¶Ló¶Eó¶>ó¶7ó¶0ó¶)ó¶"ó¶ó¶ó¶ ó¶ó¶ÿò¶øò¶ñò¶êò¶ãò¶Üò¶Õò¶Îò¶Çò¶Àò¶¹ò¶²ò¶«ò¶¤ò¶ò¶–ò¶ò¶ˆò¶ò¶zò¶sò¶lò¶eò¶^ò¶Wò¶Pò¶Iò¶Bò¶;ò¶4ò¶-ò¶&ò¶ò¶ò¶ò¶ ò¶ò¶üñ¶õñ¶îñ¶çñ¶àñ¶Ùñ¶Òñ¶Ëñ¶Äñ¶½ñ¶¶ñ¶¯ñ¶¨ñ¶¡ñ¶šñ¶“ñ¶Œñ¶…ñ¶~ñ¶wñ¶pñ¶iñ¶bñ¶[ñ¶Tñ¶Mñ¶Fñ¶?ñ¶8ñ¶1ñ¶*ñ¶#ñ¶ñ¶ñ¶ñ¶ñ¶ñ¶ùð¶òð¶ëð¶äð¶Ýð¶Öð¶Ïð¶Èð¶Áð¶ºð¶³ð¶¬ð¶¥ð¶žð¶—ð¶ð¶‰ð¶‚ð¶{ð¶tð¶mð¶fð¶_ð¶Xð¶Qð¶Jð¶Cð¶<ð¶5ð¶.ð¶'ð¶ ð¶ð¶ð¶ ð¶ð¶ýï¶öï¶ïï¶èï¶áï¶Úï¶Óï¶Ìï¶Åﶾﶷﶰﶩﶢﶛﶔï¶ï¶†ï¶ï¶xï¶qï¶jï¶cï¶\ï¶Uï¶Nï¶Gï¶@ï¶9ï¶2ï¶+ï¶$ï¶ï¶ï¶ï¶ï¶ï¶úî¶óî¶ìî¶åî¶Þî¶×î¶Ðî¶Éî¶Âî¶|î¶uî¶nî¶gî¶`î¶Yî¶Rî¶Kî¶Dî¶=î¶6î¶/î¶(î¶!î¶î¶î¶ î¶î¶þí¶÷í¶ðí¶éí¶âí¶Ûí¶Ôí¶Íí¶Æí¶¿í¶¸í¶±í¶ªí¶£í¶œí¶•í¶Ží¶‡í¶€í¶yí¶rí¶kí¶dí¶]í¶Ví¶Oí¶Hí¶Aí¶:í¶3í¶,í¶%í¶í¶í¶í¶ í¶í¶ûì¶ôì¶íì¶æì¶ßì¶Øì¶Ñì¶Êì¶Ã춼춵춮춧춠춙춒춋춄ì¶}ì¶vì¶oì¶hì¶aì¶Zì¶Sì¶Lì¶Eì¶>ì¶7ì¶0ì¶)ì¶"ì¶ì¶ì¶ ì¶ì¶ÿë¶øë¶ñë¶êë¶ãë¶Üë¶Õë¶Îë¶Çë¶À붹붲붫붤ë¶ë¶–ë¶ë¶ˆë¶ë¶zë¶së¶lë¶eë¶^ë¶Wë¶Pë¶Ië¶Bë¶;ë¶4ë¶-ë¶&ë¶ë¶ë¶ë¶ ë¶ë¶üê¶õê¶îê¶çê¶àê¶Ùê¶Òê¶Ëê¶Ä궽궶궯궨궡궚궓권궅ê¶~ê¶wê¶pê¶iê¶bê¶[ê¶Tê¶Mê¶Fê¶?ê¶8ê¶1ê¶*ê¶#ê¶ê¶ê¶ê¶ê¶ê¶ùé¶òé¶ëé¶äé¶Ýé¶Öé¶Ïé¶Èé¶Á鶺鶳鶬鶥鶞鶗é¶é¶‰é¶‚é¶{é¶té¶mé¶fé¶_é¶Xé¶Qé¶Jé¶Cé¶<é¶5é¶.é¶'é¶ é¶é¶é¶ é¶é¶ýè¶öè¶ïè¶èè¶áè¶Úè¶Óè¶Ìè¶Å趾趷趰趩趢趛趔è¶è¶†è¶è¶xè¶qè¶jè¶cè¶\è¶Uè¶Nè¶Gè¶@è¶9è¶2è¶+è¶$è¶è¶è¶è¶è¶è¶úç¶óç¶ìç¶åç¶Þç¶×ç¶Ðç¶Éç¶Â綻綴維綦綟綘綑綊綃ç¶|ç¶uç¶nç¶gç¶`ç¶Yç¶Rç¶Kç¶Dç¶=ç¶6ç¶/ç¶(ç¶!ç¶ç¶ç¶ ç¶ç¶þæ¶÷æ¶ðæ¶éæ¶âæ¶Ûæ¶Ôæ¶Íæ¶Ææ¶¿æ¶¸æ¶±æ¶ªæ¶£æ¶œæ¶•æ¶Žæ¶‡æ¶€æ¶yæ¶ræ¶kæ¶dæ¶]æ¶Væ¶Oæ¶Hæ¶Aæ¶:æ¶3æ¶,æ¶%æ¶æ¶æ¶æ¶ æ¶æ¶ûå¶ôå¶íå¶æå¶ßå¶Øå¶Ñå¶Êå¶Ã嶼嶵嶮嶧嶠嶙嶒嶋嶄å¶}å¶vå¶oå¶hå¶aå¶Zå¶Så¶Lå¶Eå¶>å¶7å¶0å¶)å¶"å¶å¶å¶ å¶å¶ÿä¶øä¶ñä¶êä¶ãä¶Üä¶Õä¶Îä¶Çä¶À䶹䶲䶫䶤ä¶ä¶–ä¶ä¶ˆä¶ä¶zä¶sä¶lä¶eä¶^ä¶Wä¶Pä¶Iä¶Bä¶;ä¶4ä¶-ä¶&ä¶ä¶ä¶ä¶ ä¶ä¶üã¶õã¶îã¶çã¶àã¶Ùã¶Òã¶Ëã¶Ä㶽㶶㶯㶨㶡㶚㶓㶌㶅ã¶~ã¶wã¶pã¶iã¶bã¶[ã¶Tã¶Mã¶Fã¶?ã¶8ã¶1ã¶*ã¶#ã¶ã¶ã¶ã¶ã¶ã¶ùâ¶òâ¶ëâ¶äâ¶Ýâ¶Öâ¶Ïâ¶Èâ¶Áⶺⶳⶬⶥ⶞⶗â¶â¶‰â¶‚â¶{â¶tâ¶mâ¶fâ¶_â¶Xâ¶Qâ¶Jâ¶Câ¶<â¶5â¶.â¶'â¶ â¶â¶â¶ â¶â¶ýá¶öá¶ïá¶èá¶áá¶Úá¶Óá¶Ìá¶Åᶾᶷᶰᶩᶢᶛᶔá¶á¶†á¶á¶xá¶qá¶já¶cá¶\á¶Uá¶Ná¶Gá¶@á¶9á¶2á¶+á¶$á¶á¶á¶á¶á¶á¶úà¶óà¶ìà¶åà¶Þà¶×à¶Ðà¶Éà¶Âරපතඦඟ඘එඊඃà¶|à¶uà¶nà¶gà¶`à¶Yà¶Rà¶Kà¶Dà¶=à¶6à¶/à¶(à¶!à¶à¶à¶ à¶à¶þß¶÷ß¶ðß¶éß¶âß¶Ûß¶Ôß¶Íß¶Æß¶¿ß¶¸ß¶±ß¶ªß¶£ß¶œß¶•ß¶Žß¶‡ß¶€ß¶yß¶rß¶kß¶dß¶]ß¶Vß¶Oß¶Hß¶Aß¶:ß¶3ß¶,ß¶%ß¶ß¶ß¶ß¶ ß¶ß¶ûÞ¶ôÞ¶íÞ¶æÞ¶ßÞ¶ØÞ¶ÑÞ¶ÊÞ¶ÃÞ¶¼Þ¶µÞ¶®Þ¶§Þ¶ Þ¶™Þ¶’Þ¶‹Þ¶„Þ¶}Þ¶vÞ¶oÞ¶hÞ¶aÞ¶ZÞ¶SÞ¶LÞ¶EÞ¶>Þ¶7Þ¶0Þ¶)Þ¶"Þ¶Þ¶Þ¶ Þ¶Þ¶ÿݶøÝ¶ñݶêݶãݶÜݶÕݶÎݶÇݶÀݶ¹Ý¶²Ý¶«Ý¶¤Ý¶ݶ–ݶݶˆÝ¶ݶzݶsݶlݶeݶ^ݶWݶPݶIݶBݶ;ݶ4ݶ-ݶ&ݶݶݶݶ ݶݶüܶõܶîܶçܶàܶÙܶÒܶËܶÄܶ½Ü¶¶Ü¶¯Ü¶¨Ü¶¡Ü¶šÜ¶“ܶŒÜ¶…ܶ~ܶwܶpܶiܶbܶ[ܶTܶMܶFܶ?ܶ8ܶ1ܶ*ܶ#ܶܶܶܶܶܶùÛ¶òÛ¶ëÛ¶äÛ¶ÝÛ¶ÖÛ¶ÏÛ¶ÈÛ¶ÁÛ¶ºÛ¶³Û¶¬Û¶¥Û¶žÛ¶—Û¶Û¶‰Û¶‚Û¶{Û¶tÛ¶mÛ¶fÛ¶_Û¶XÛ¶QÛ¶JÛ¶CÛ¶<Û¶5Û¶.Û¶'Û¶ Û¶Û¶Û¶ Û¶Û¶ýÚ¶öÚ¶ïÚ¶èÚ¶áÚ¶ÚÚ¶ÓÚ¶ÌÚ¶ÅÚ¶¾Ú¶·Ú¶°Ú¶©Ú¶¢Ú¶›Ú¶”Ú¶Ú¶†Ú¶Ú¶xÚ¶qÚ¶jÚ¶cÚ¶\Ú¶UÚ¶NÚ¶GÚ¶@Ú¶9Ú¶2Ú¶+Ú¶$Ú¶Ú¶Ú¶Ú¶Ú¶Ú¶úÙ¶óÙ¶ìÙ¶åÙ¶ÞÙ¶×Ù¶ÐÙ¶ÉÙ¶ÂÙ¶»Ù¶´Ù¶­Ù¶¦Ù¶ŸÙ¶˜Ù¶‘Ù¶ŠÙ¶ƒÙ¶|Ù¶uÙ¶nÙ¶gÙ¶`Ù¶YÙ¶RÙ¶KÙ¶DÙ¶=Ù¶6Ù¶/Ù¶(Ù¶!Ù¶Ù¶Ù¶ Ù¶Ù¶þض÷ضðض騶âØ¶ÛØ¶ÔØ¶ÍØ¶ÆØ¶¿Ø¶¸Ø¶±Ø¶ªØ¶£Ø¶œØ¶•ضŽØ¶‡Ø¶€Ø¶yضrضkضdض]ضVضOضHضAض:ض3ض,ض%ضضضض ضضû×¶ô×¶í×¶æ×¶ß×¶Ø×¶Ñ×¶Ê×¶Ã×¶¼×¶µ×¶®×¶§×¶ ×¶™×¶’×¶‹×¶„×¶}×¶v×¶o×¶h×¶a×¶Z×¶S×¶L×¶E×¶>×¶7×¶0×¶)×¶"×¶×¶×¶ ×¶×¶ÿÖ¶øÖ¶ñÖ¶êÖ¶ãÖ¶ÜÖ¶ÕÖ¶ÎÖ¶ÇÖ¶ÀÖ¶¹Ö¶²Ö¶«Ö¶¤Ö¶Ö¶–Ö¶Ö¶ˆÖ¶Ö¶zÖ¶sÖ¶lÖ¶eÖ¶^Ö¶WÖ¶PÖ¶IÖ¶BÖ¶;Ö¶4Ö¶-Ö¶&Ö¶Ö¶Ö¶Ö¶ Ö¶Ö¶üÕ¶õÕ¶îÕ¶çÕ¶àÕ¶ÙÕ¶ÒÕ¶ËÕ¶ÄÕ¶½Õ¶¶Õ¶¯Õ¶¨Õ¶¡Õ¶šÕ¶“Õ¶ŒÕ¶…Õ¶~Õ¶wÕ¶pÕ¶iÕ¶bÕ¶[Õ¶TÕ¶MÕ¶FÕ¶?Õ¶8Õ¶1Õ¶*Õ¶#Õ¶Õ¶Õ¶Õ¶Õ¶Õ¶ùÔ¶òÔ¶ëÔ¶äÔ¶ÝÔ¶ÖÔ¶ÏÔ¶ÈÔ¶ÁÔ¶ºÔ¶³Ô¶¬Ô¶¥Ô¶žÔ¶—Ô¶Ô¶‰Ô¶‚Ô¶{Ô¶tÔ¶mÔ¶fÔ¶_Ô¶XÔ¶QÔ¶JÔ¶CÔ¶<Ô¶5Ô¶.Ô¶'Ô¶ Ô¶Ô¶Ô¶ Ô¶Ô¶ýÓ¶öÓ¶ïÓ¶èÓ¶áÓ¶ÚÓ¶ÓÓ¶ÌÓ¶ÅÓ¶¾Ó¶·Ó¶°Ó¶©Ó¶¢Ó¶›Ó¶”Ó¶Ó¶†Ó¶Ó¶xÓ¶qÓ¶jÓ¶cÓ¶\Ó¶UÓ¶NÓ¶GÓ¶@Ó¶9Ó¶2Ó¶+Ó¶$Ó¶Ó¶Ó¶Ó¶Ó¶Ó¶úÒ¶óÒ¶ìÒ¶åÒ¶ÞÒ¶×Ò¶ÐÒ¶ÉÒ¶ÂÒ¶»Ò¶´Ò¶­Ò¶¦Ò¶ŸÒ¶˜Ò¶‘Ò¶ŠÒ¶ƒÒ¶|Ò¶uÒ¶nÒ¶gÒ¶`Ò¶YÒ¶RÒ¶KÒ¶DÒ¶=Ò¶6Ò¶/Ò¶(Ò¶!Ò¶Ò¶Ò¶ Ò¶Ò¶þѶ÷ѶðѶéѶâѶÛѶÔѶÍѶÆÑ¶¿Ñ¶¸Ñ¶±Ñ¶ªÑ¶£Ñ¶œÑ¶•ѶŽÑ¶‡Ñ¶€Ñ¶yѶrѶkѶdѶ]ѶVѶOѶHѶAѶ:Ѷ3Ѷ,Ѷ%ѶѶѶѶ ѶѶûжôжíжæÐ¶ßжØÐ¶ÑжÊжÃж¼Ð¶µÐ¶®Ð¶§Ð¶ Ð¶™Ð¶’ж‹Ð¶„ж}жvжoжhжaжZжSжLжEж>ж7ж0ж)ж"жжж жжÿ϶øÏ¶ñ϶ê϶ã϶Ü϶Õ϶Î϶Ç϶À϶¹Ï¶²Ï¶«Ï¶¤Ï¶϶–϶϶ˆÏ¶϶z϶s϶l϶e϶^϶W϶P϶I϶B϶;϶4϶-϶&϶϶϶϶ ϶϶üζõζîζçζàζÙζÒζËζÄζ½Î¶¶Î¶¯Î¶¨Î¶¡Î¶šÎ¶“ζŒÎ¶…ζ~ζwζpζiζbζ[ζTζMζFζ?ζ8ζ1ζ*ζ#ζζζζζζùͶòͶëͶäͶÝͶÖͶÏͶÈͶÁͶºÍ¶³Í¶¬Í¶¥Í¶žÍ¶—ͶͶ‰Í¶‚Ͷ{ͶtͶmͶfͶ_ͶXͶQͶJͶCͶ<Ͷ5Ͷ.Ͷ'Ͷ ͶͶͶ ͶͶý̶ö̶ï̶è̶á̶Ú̶Ó̶Ì̶Å̶¾Ì¶·Ì¶°Ì¶©Ì¶¢Ì¶›Ì¶”̶̶†Ì¶̶x̶q̶j̶c̶\̶U̶N̶G̶@̶9̶2̶+̶$̶̶̶̶̶̶ú˶ó˶ì˶å˶Þ˶×˶Ð˶É˶Â˶»Ë¶´Ë¶­Ë¶¦Ë¶ŸË¶˜Ë¶‘˶ŠË¶ƒË¶|˶u˶n˶g˶`˶Y˶R˶K˶D˶=˶6˶/˶(˶!˶˶˶ ˶˶þʶ÷ʶðʶéʶâʶÛʶÔʶÍʶÆÊ¶¿Ê¶¸Ê¶±Ê¶ªÊ¶£Ê¶œÊ¶•ʶŽÊ¶‡Ê¶€Ê¶yʶrʶkʶdʶ]ʶVʶOʶHʶAʶ:ʶ3ʶ,ʶ%ʶʶʶʶ ʶʶûɶôɶíɶæÉ¶ßɶØÉ¶ÑɶÊɶÃɶ¼É¶µÉ¶®É¶§É¶ É¶™É¶’ɶ‹É¶„ɶ}ɶvɶoɶhɶaɶZɶSɶLɶEɶ>ɶ7ɶ0ɶ)ɶ"ɶɶɶ ɶɶÿȶøÈ¶ñȶêȶãȶÜȶÕȶÎȶÇȶÀȶ¹È¶²È¶«È¶¤È¶ȶ–ȶȶˆÈ¶ȶzȶsȶlȶeȶ^ȶWȶPȶIȶBȶ;ȶ4ȶ-ȶ&ȶȶȶȶ ȶȶüǶõǶîǶçǶàǶÙǶÒǶËǶÄǶ½Ç¶¶Ç¶¯Ç¶¨Ç¶¡Ç¶šÇ¶“ǶŒÇ¶…Ƕ~ǶwǶpǶiǶbǶ[ǶTǶMǶFǶ?Ƕ8Ƕ1Ƕ*Ƕ#ǶǶǶǶǶǶùƶòƶëÆ¶䯶ÝÆ¶ÖÆ¶ÏÆ¶ÈƶÁƶºÆ¶³Æ¶¬Æ¶¥Æ¶žÆ¶—ƶƶ‰Æ¶‚ƶ{ƶtƶmƶfƶ_ƶXƶQƶJƶCƶ<ƶ5ƶ.ƶ'ƶ ƶƶƶ ƶƶýŶöŶïŶèŶáŶÚŶÓŶÌŶÅŶ¾Å¶·Å¶°Å¶©Å¶¢Å¶›Å¶”ŶŶ†Å¶ŶxŶqŶjŶcŶ\ŶUŶNŶGŶ@Ŷ9Ŷ2Ŷ+Ŷ$ŶŶŶŶŶŶúĶóĶìĶåĶÞĶ×ĶÐĶÉĶÂͻʹͭͦĶŸÄ¶˜Ä¶‘ĶŠÄ¶ƒÄ¶|ĶuĶnĶgĶ`ĶYĶRĶKĶDĶ=Ķ6Ķ/Ķ(Ķ!ĶĶĶ ĶĶþö÷öðöéöâöÛöÔöÍöÆÃ¶¿Ã¶¸Ã¶±Ã¶ªÃ¶£Ã¶œÃ¶•öŽÃ¶‡Ã¶€Ã¶yöröködö]öVöOöHöAö:ö3ö,ö%öööö ööû¶ô¶í¶æÂ¶ß¶ØÂ¶Ѷʶö¼Â¶µÂ¶®Â¶§Â¶ Â¶™Â¶’¶‹Â¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿÁ¶øÁ¶ñÁ¶êÁ¶ãÁ¶ÜÁ¶ÕÁ¶ÎÁ¶ÇÁ¶ÀÁ¶¹Á¶²Á¶«Á¶¤Á¶Á¶–Á¶Á¶ˆÁ¶Á¶zÁ¶sÁ¶lÁ¶eÁ¶^Á¶WÁ¶PÁ¶IÁ¶BÁ¶;Á¶4Á¶-Á¶&Á¶Á¶Á¶Á¶ Á¶Á¶üÀ¶õÀ¶îÀ¶çÀ¶àÀ¶ÙÀ¶ÒÀ¶ËÀ¶ÄÀ¶½À¶¶À¶¯À¶¨À¶¡À¶šÀ¶“À¶ŒÀ¶…À¶~À¶wÀ¶pÀ¶iÀ¶bÀ¶[À¶TÀ¶MÀ¶FÀ¶?À¶8À¶1À¶*À¶#À¶À¶À¶À¶À¶À¶ù¿¶ò¿¶ë¿¶ä¿¶Ý¿¶Ö¿¶Ï¿¶È¿¶Á¿¶º¿¶³¿¶¬¿¶¥¿¶ž¿¶—¿¶¿¶‰¿¶‚¿¶{¿¶t¿¶m¿¶f¿¶_¿¶X¿¶Q¿¶J¿¶C¿¶<¿¶5¿¶.¿¶'¿¶ ¿¶¿¶¿¶ ¿¶¿¶ý¾¶ö¾¶ï¾¶è¾¶á¾¶Ú¾¶Ó¾¶̾¶ž¶¾¾¶·¾¶°¾¶©¾¶¢¾¶›¾¶”¾¶¾¶†¾¶¾¶x¾¶q¾¶j¾¶c¾¶\¾¶U¾¶N¾¶G¾¶@¾¶9¾¶2¾¶+¾¶$¾¶¾¶¾¶¾¶¾¶¾¶ú½¶ó½¶ì½¶å½¶Þ½¶×½¶н¶ɽ¶½¶»½¶´½¶­½¶¦½¶Ÿ½¶˜½¶‘½¶н¶ƒ½¶|½¶u½¶n½¶g½¶`½¶Y½¶R½¶K½¶D½¶=½¶6½¶/½¶(½¶!½¶½¶½¶ ½¶½¶þ¼¶÷¼¶ð¼¶é¼¶â¼¶Û¼¶Ô¼¶ͼ¶Ƽ¶¿¼¶¸¼¶±¼¶ª¼¶£¼¶œ¼¶•¼¶޼¶‡¼¶€¼¶y¼¶r¼¶k¼¶d¼¶]¼¶V¼¶O¼¶H¼¶A¼¶:¼¶3¼¶,¼¶%¼¶¼¶¼¶¼¶ ¼¶¼¶û»¶ô»¶í»¶æ»¶ß»¶Ø»¶Ñ»¶Ê»¶û¶¼»¶µ»¶®»¶§»¶ »¶™»¶’»¶‹»¶„»¶}»¶v»¶o»¶h»¶a»¶Z»¶S»¶L»¶E»¶>»¶7»¶0»¶)»¶"»¶»¶»¶ »¶»¶ÿº¶øº¶ñº¶꺶㺶ܺ¶Õº¶κ¶Ǻ¶Àº¶¹º¶²º¶«º¶¤º¶º¶–º¶º¶ˆº¶º¶zº¶sº¶lº¶eº¶^º¶Wº¶Pº¶Iº¶Bº¶;º¶4º¶-º¶&º¶º¶º¶º¶ º¶º¶ü¹¶õ¹¶î¹¶ç¹¶๶Ù¹¶Ò¹¶˹¶Ŷ½¹¶¶¹¶¯¹¶¨¹¶¡¹¶š¹¶“¹¶Œ¹¶…¹¶~¹¶w¹¶p¹¶i¹¶b¹¶[¹¶T¹¶M¹¶F¹¶?¹¶8¹¶1¹¶*¹¶#¹¶¹¶¹¶¹¶¹¶¹¶ù¸¶ò¸¶븶丶ݸ¶Ö¸¶ϸ¶ȸ¶Á¸¶º¸¶³¸¶¬¸¶¥¸¶ž¸¶—¸¶¸¶‰¸¶‚¸¶{¸¶t¸¶m¸¶f¸¶_¸¶X¸¶Q¸¶J¸¶C¸¶<¸¶5¸¶.¸¶'¸¶ ¸¶¸¶¸¶ ¸¶¸¶ý·¶ö·¶ï·¶è·¶á·¶Ú·¶Ó·¶Ì·¶Å·¶¾·¶··¶°·¶©·¶¢·¶›·¶”·¶·¶†·¶·¶x·¶q·¶j·¶c·¶\·¶U·¶N·¶G·¶@·¶9·¶2·¶+·¶$·¶·¶·¶·¶·¶·¶ú¶¶ó¶¶ì¶¶å¶¶Þ¶¶×¶¶ж¶ɶ¶¶¶»¶¶´¶¶­¶¶¦¶¶Ÿ¶¶˜¶¶‘¶¶ж¶ƒ¶¶|¶¶u¶¶n¶¶g¶¶`¶¶Y¶¶R¶¶K¶¶D¶¶=¶¶6¶¶/¶¶(¶¶!¶¶¶¶¶¶ ¶¶¶¶þµ¶÷µ¶ðµ¶éµ¶âµ¶Ûµ¶Ôµ¶͵¶Ƶ¶¿µ¶¸µ¶±µ¶ªµ¶£µ¶œµ¶•µ¶޵¶‡µ¶€µ¶yµ¶rµ¶kµ¶dµ¶]µ¶Vµ¶Oµ¶Hµ¶Aµ¶:µ¶3µ¶,µ¶%µ¶µ¶µ¶µ¶ µ¶µ¶û´¶ô´¶í´¶æ´¶ß´¶Ø´¶Ñ´¶Ê´¶ô¶¼´¶µ´¶®´¶§´¶ ´¶™´¶’´¶‹´¶„´¶}´¶v´¶o´¶h´¶a´¶Z´¶S´¶L´¶E´¶>´¶7´¶0´¶)´¶"´¶´¶´¶ ´¶´¶ÿ³¶ø³¶ñ³¶ê³¶ã³¶ܳ¶Õ³¶γ¶dz¶À³¶¹³¶²³¶«³¶¤³¶³¶–³¶³¶ˆ³¶³¶z³¶s³¶l³¶e³¶^³¶W³¶P³¶I³¶B³¶;³¶4³¶-³¶&³¶³¶³¶³¶ ³¶³¶ü²¶õ²¶î²¶ç²¶ಶÙ²¶Ò²¶˲¶IJ¶½²¶¶²¶¯²¶¨²¶¡²¶š²¶“²¶Œ²¶…²¶~²¶w²¶p²¶i²¶b²¶[²¶T²¶M²¶F²¶?²¶8²¶1²¶*²¶#²¶²¶²¶²¶²¶²¶ù±¶ò±¶ë±¶ä±¶ݱ¶Ö±¶ϱ¶ȱ¶Á±¶º±¶³±¶¬±¶¥±¶ž±¶—±¶±¶‰±¶‚±¶{±¶t±¶m±¶f±¶_±¶X±¶Q±¶J±¶C±¶<±¶5±¶.±¶'±¶ ±¶±¶±¶ ±¶±¶ý°¶ö°¶ï°¶è°¶á°¶Ú°¶Ó°¶̰¶۶¾°¶·°¶°°¶©°¶¢°¶›°¶”°¶°¶†°¶°¶x°¶q°¶j°¶c°¶\°¶U°¶N°¶G°¶@°¶9°¶2°¶+°¶$°¶°¶°¶°¶°¶°¶ú¯¶ó¯¶쯶寶Þ¯¶ׯ¶Я¶ɯ¶¯¶»¯¶´¯¶­¯¶¦¯¶Ÿ¯¶˜¯¶‘¯¶Н¶ƒ¯¶|¯¶u¯¶n¯¶g¯¶`¯¶Y¯¶R¯¶K¯¶D¯¶=¯¶6¯¶/¯¶(¯¶!¯¶¯¶¯¶ ¯¶¯¶þ®¶÷®¶ð®¶é®¶â®¶Û®¶Ô®¶Í®¶Æ®¶¿®¶¸®¶±®¶ª®¶£®¶œ®¶•®¶Ž®¶‡®¶€®¶y®¶r®¶k®¶d®¶]®¶V®¶O®¶H®¶A®¶:®¶3®¶,®¶%®¶®¶®¶®¶ ®¶®¶û­¶ô­¶í­¶æ­¶ß­¶Ø­¶Ñ­¶Ê­¶í¶¼­¶µ­¶®­¶§­¶ ­¶™­¶’­¶‹­¶„­¶}­¶v­¶o­¶h­¶a­¶Z­¶S­¶L­¶E­¶>­¶7­¶0­¶)­¶"­¶­¶­¶ ­¶­¶ÿ¬¶ø¬¶ñ¬¶ꬶ㬶ܬ¶Õ¬¶ά¶Ǭ¶À¬¶¹¬¶²¬¶«¬¶¤¬¶¬¶–¬¶¬¶ˆ¬¶¬¶z¬¶s¬¶l¬¶e¬¶^¬¶W¬¶P¬¶I¬¶B¬¶;¬¶4¬¶-¬¶&¬¶¬¶¬¶¬¶ ¬¶¬¶ü«¶õ«¶î«¶ç«¶à«¶Ù«¶Ò«¶Ë«¶Ä«¶½«¶¶«¶¯«¶¨«¶¡«¶š«¶“«¶Œ«¶…«¶~«¶w«¶p«¶i«¶b«¶[«¶T«¶M«¶F«¶?«¶8«¶1«¶*«¶#«¶«¶«¶«¶«¶«¶ùª¶òª¶몶䪶ݪ¶Öª¶Ϫ¶Ȫ¶Áª¶ºª¶³ª¶¬ª¶¥ª¶žª¶—ª¶ª¶‰ª¶‚ª¶{ª¶tª¶mª¶fª¶_ª¶Xª¶Qª¶Jª¶Cª¶<ª¶5ª¶.ª¶'ª¶ ª¶ª¶ª¶ ª¶ª¶ý©¶ö©¶ï©¶è©¶á©¶Ú©¶Ó©¶Ì©¶Å©¶¾©¶·©¶°©¶©©¶¢©¶›©¶”©¶©¶†©¶©¶x©¶q©¶j©¶c©¶\©¶U©¶N©¶G©¶@©¶9©¶2©¶+©¶$©¶©¶©¶©¶©¶©¶ú¨¶ó¨¶쨶娶Þ¨¶ר¶Ш¶ɨ¶¨¶»¨¶´¨¶­¨¶¦¨¶Ÿ¨¶˜¨¶‘¨¶Ѝ¶ƒ¨¶|¨¶u¨¶n¨¶g¨¶`¨¶Y¨¶R¨¶K¨¶D¨¶=¨¶6¨¶/¨¶(¨¶!¨¶¨¶¨¶ ¨¶¨¶þ§¶÷§¶ð§¶é§¶â§¶Û§¶Ô§¶ͧ¶Ƨ¶¿§¶¸§¶±§¶ª§¶£§¶œ§¶•§¶ާ¶‡§¶€§¶y§¶r§¶k§¶d§¶]§¶V§¶O§¶H§¶A§¶:§¶3§¶,§¶%§¶§¶§¶§¶ §¶§¶û¦¶ô¦¶í¦¶榶ߦ¶ئ¶Ѧ¶ʦ¶æ¶¼¦¶µ¦¶®¦¶§¦¶ ¦¶™¦¶’¦¶‹¦¶„¦¶}¦¶v¦¶o¦¶h¦¶a¦¶Z¦¶S¦¶L¦¶E¦¶>¦¶7¦¶0¦¶)¦¶"¦¶¦¶¦¶ ¦¶¦¶ÿ¥¶ø¥¶ñ¥¶ꥶ㥶Ü¥¶Õ¥¶Î¥¶Ç¥¶À¥¶¹¥¶²¥¶«¥¶¤¥¶¥¶–¥¶¥¶ˆ¥¶¥¶z¥¶s¥¶l¥¶e¥¶^¥¶W¥¶P¥¶I¥¶B¥¶;¥¶4¥¶-¥¶&¥¶¥¶¥¶¥¶ ¥¶¥¶ü¤¶õ¤¶礶शÙ¤¶Ò¤¶ˤ¶Ĥ¶½¤¶¶¤¶¯¤¶¨¤¶¡¤¶š¤¶“¤¶Œ¤¶…¤¶~¤¶w¤¶p¤¶i¤¶b¤¶[¤¶T¤¶M¤¶F¤¶?¤¶8¤¶1¤¶*¤¶#¤¶¤¶¤¶¤¶¤¶¤¶ù£¶ò£¶룶䣶Ý£¶Ö£¶Ï£¶È£¶Á£¶º£¶³£¶¬£¶¥£¶ž£¶—£¶£¶‰£¶‚£¶{£¶t£¶m£¶f£¶_£¶X£¶Q£¶J£¶C£¶<£¶5£¶.£¶'£¶ £¶£¶£¶ £¶£¶ý¢¶ö¢¶袶ᢶÚ¢¶Ó¢¶Ì¢¶Å¢¶¾¢¶·¢¶°¢¶©¢¶¢¢¶›¢¶”¢¶¢¶†¢¶¢¶x¢¶q¢¶j¢¶c¢¶\¢¶U¢¶N¢¶G¢¶@¢¶9¢¶2¢¶+¢¶$¢¶¢¶¢¶¢¶¢¶¢¶ú¡¶ó¡¶ì¡¶å¡¶Þ¡¶ס¶С¶É¡¶¡¶»¡¶´¡¶­¡¶¦¡¶Ÿ¡¶˜¡¶‘¡¶Š¡¶ƒ¡¶|¡¶u¡¶n¡¶g¡¶`¡¶Y¡¶R¡¶K¡¶D¡¶=¡¶6¡¶/¡¶(¡¶!¡¶¡¶¡¶ ¡¶¡¶þ ¶÷ ¶ð ¶é ¶â ¶Û ¶Ô ¶Í ¶Æ ¶¿ ¶¸ ¶± ¶ª ¶£ ¶œ ¶• ¶Ž ¶‡ ¶€ ¶y ¶r ¶k ¶d ¶] ¶V ¶O ¶H ¶A ¶: ¶3 ¶, ¶% ¶ ¶ ¶ ¶  ¶ ¶ûŸ¶ôŸ¶ퟶ柶ߟ¶ØŸ¶ÑŸ¶ÊŸ¶ß¶¼Ÿ¶µŸ¶®Ÿ¶§Ÿ¶ Ÿ¶™Ÿ¶’Ÿ¶‹Ÿ¶„Ÿ¶}Ÿ¶vŸ¶oŸ¶hŸ¶aŸ¶ZŸ¶SŸ¶LŸ¶EŸ¶>Ÿ¶7Ÿ¶0Ÿ¶)Ÿ¶"Ÿ¶Ÿ¶Ÿ¶ Ÿ¶Ÿ¶ÿž¶øž¶ñž¶êž¶ãž¶Üž¶Õž¶Ξ¶Çž¶Àž¶¹ž¶²ž¶«ž¶¤ž¶ž¶–ž¶ž¶ˆž¶ž¶zž¶sž¶lž¶ež¶^ž¶Wž¶Pž¶Iž¶Bž¶;ž¶4ž¶-ž¶&ž¶ž¶ž¶ž¶ ž¶ž¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ùœ¶òœ¶뜶䜶Ýœ¶Öœ¶Ïœ¶Èœ¶Áœ¶ºœ¶³œ¶¬œ¶¥œ¶žœ¶—œ¶œ¶‰œ¶‚œ¶{œ¶tœ¶mœ¶fœ¶_œ¶Xœ¶Qœ¶Jœ¶Cœ¶<œ¶5œ¶.œ¶'œ¶ œ¶œ¶œ¶ œ¶œ¶ý›¶ö›¶ï›¶è›¶á›¶Ú›¶Ó›¶Ì›¶Å›¶¾›¶·›¶°›¶©›¶¢›¶››¶”›¶›¶†›¶›¶x›¶q›¶j›¶c›¶\›¶U›¶N›¶G›¶@›¶9›¶2›¶+›¶$›¶›¶›¶›¶›¶›¶úš¶óš¶ìš¶åš¶Þš¶ך¶К¶Éš¶š¶»š¶´š¶­š¶¦š¶Ÿš¶˜š¶‘š¶Šš¶ƒš¶|š¶uš¶nš¶gš¶`š¶Yš¶Rš¶Kš¶Dš¶=š¶6š¶/š¶(š¶!š¶š¶š¶ š¶š¶þ™¶÷™¶ð™¶é™¶â™¶Û™¶Ô™¶Í™¶Æ™¶¿™¶¸™¶±™¶ª™¶£™¶œ™¶•™¶Ž™¶‡™¶€™¶y™¶r™¶k™¶d™¶]™¶V™¶O™¶H™¶A™¶:™¶3™¶,™¶%™¶™¶™¶™¶ ™¶™¶û˜¶ô˜¶혶昶ߘ¶ؘ¶ј¶ʘ¶ض¼˜¶µ˜¶®˜¶§˜¶ ˜¶™˜¶’˜¶‹˜¶„˜¶}˜¶v˜¶o˜¶h˜¶a˜¶Z˜¶S˜¶L˜¶E˜¶>˜¶7˜¶0˜¶)˜¶"˜¶˜¶˜¶ ˜¶˜¶ÿ—¶ø—¶ñ—¶ê—¶ã—¶Ü—¶Õ—¶Η¶Ç—¶À—¶¹—¶²—¶«—¶¤—¶—¶–—¶—¶ˆ—¶—¶z—¶s—¶l—¶e—¶^—¶W—¶P—¶I—¶B—¶;—¶4—¶-—¶&—¶—¶—¶—¶ —¶—¶ü–¶õ–¶î–¶ç–¶à–¶Ù–¶Ò–¶Ë–¶Ä–¶½–¶¶–¶¯–¶¨–¶¡–¶š–¶“–¶Œ–¶…–¶~–¶w–¶p–¶i–¶b–¶[–¶T–¶M–¶F–¶?–¶8–¶1–¶*–¶#–¶–¶–¶–¶–¶–¶ù•¶ò•¶ë•¶ä•¶Ý•¶Ö•¶Ï•¶È•¶Á•¶º•¶³•¶¬•¶¥•¶ž•¶—•¶•¶‰•¶‚•¶{•¶t•¶m•¶f•¶_•¶X•¶Q•¶J•¶C•¶<•¶5•¶.•¶'•¶ •¶•¶•¶ •¶•¶ý”¶ö”¶ï”¶è”¶á”¶Ú”¶Ó”¶Ì”¶Å”¶¾”¶·”¶°”¶©”¶¢”¶›”¶””¶”¶†”¶”¶x”¶q”¶j”¶c”¶\”¶U”¶N”¶G”¶@”¶9”¶2”¶+”¶$”¶”¶”¶”¶”¶”¶ú“¶ó“¶ì“¶å“¶Þ“¶ד¶Г¶É“¶“¶»“¶´“¶­“¶¦“¶Ÿ“¶˜“¶‘“¶Š“¶ƒ“¶|“¶u“¶n“¶g“¶`“¶Y“¶R“¶K“¶D“¶=“¶6“¶/“¶(“¶!“¶“¶“¶ “¶“¶þ’¶÷’¶ð’¶é’¶â’¶Û’¶Ô’¶Í’¶Æ’¶¿’¶¸’¶±’¶ª’¶£’¶œ’¶•’¶Ž’¶‡’¶€’¶y’¶r’¶k’¶d’¶]’¶V’¶O’¶H’¶A’¶:’¶3’¶,’¶%’¶’¶’¶’¶ ’¶’¶û‘¶ô‘¶í‘¶æ‘¶ß‘¶Ø‘¶Ñ‘¶Ê‘¶Ѷ¼‘¶µ‘¶®‘¶§‘¶ ‘¶™‘¶’‘¶‹‘¶„‘¶}‘¶v‘¶o‘¶h‘¶a‘¶Z‘¶S‘¶L‘¶E‘¶>‘¶7‘¶0‘¶)‘¶"‘¶‘¶‘¶ ‘¶‘¶ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù޶ò޶뎶䎶ÝŽ¶ÖŽ¶ÏŽ¶È޶Á޶ºŽ¶³Ž¶¬Ž¶¥Ž¶žŽ¶—޶޶‰Ž¶‚޶{޶t޶m޶f޶_޶X޶Q޶J޶C޶<޶5޶.޶'޶ ޶޶޶ ޶޶ý¶ö¶ï¶è¶á¶Ú¶Ó¶̶Ŷ¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶úŒ¶óŒ¶쌶匶ÞŒ¶׌¶ÐŒ¶ÉŒ¶ÂŒ¶»Œ¶´Œ¶­Œ¶¦Œ¶ŸŒ¶˜Œ¶‘Œ¶ŠŒ¶ƒŒ¶|Œ¶uŒ¶nŒ¶gŒ¶`Œ¶YŒ¶RŒ¶KŒ¶DŒ¶=Œ¶6Œ¶/Œ¶(Œ¶!Œ¶Œ¶Œ¶ Œ¶Œ¶þ‹¶÷‹¶ð‹¶é‹¶â‹¶Û‹¶Ô‹¶Í‹¶Æ‹¶¿‹¶¸‹¶±‹¶ª‹¶£‹¶œ‹¶•‹¶Ž‹¶‡‹¶€‹¶y‹¶r‹¶k‹¶d‹¶]‹¶V‹¶O‹¶H‹¶A‹¶:‹¶3‹¶,‹¶%‹¶‹¶‹¶‹¶ ‹¶‹¶ûжôж튶抶ߊ¶ØŠ¶ÑŠ¶ÊŠ¶ʶ¼Š¶µŠ¶®Š¶§Š¶ Š¶™Š¶’ж‹Š¶„ж}жvжoжhжaжZжSжLжEж>ж7ж0ж)ж"жжж жжÿ‰¶ø‰¶ñ‰¶ꉶ㉶܉¶Õ‰¶Ή¶lj¶À‰¶¹‰¶²‰¶«‰¶¤‰¶‰¶–‰¶‰¶ˆ‰¶‰¶z‰¶s‰¶l‰¶e‰¶^‰¶W‰¶P‰¶I‰¶B‰¶;‰¶4‰¶-‰¶&‰¶‰¶‰¶‰¶ ‰¶‰¶üˆ¶õˆ¶父àˆ¶Ùˆ¶Òˆ¶ˈ¶Ĉ¶½ˆ¶¶ˆ¶¯ˆ¶¨ˆ¶¡ˆ¶šˆ¶“ˆ¶Œˆ¶…ˆ¶~ˆ¶wˆ¶pˆ¶iˆ¶bˆ¶[ˆ¶Tˆ¶Mˆ¶Fˆ¶?ˆ¶8ˆ¶1ˆ¶*ˆ¶#ˆ¶ˆ¶ˆ¶ˆ¶ˆ¶ˆ¶ù‡¶ò‡¶뇶䇶݇¶Ö‡¶χ¶ȇ¶Á‡¶º‡¶³‡¶¬‡¶¥‡¶ž‡¶—‡¶‡¶‰‡¶‚‡¶{‡¶t‡¶m‡¶f‡¶_‡¶X‡¶Q‡¶J‡¶C‡¶<‡¶5‡¶.‡¶'‡¶ ‡¶‡¶‡¶ ‡¶‡¶ý†¶ö†¶膶ᆶÚ†¶Ó†¶̆¶ņ¶¾†¶·†¶°†¶©†¶¢†¶›†¶”†¶†¶††¶†¶x†¶q†¶j†¶c†¶\†¶U†¶N†¶G†¶@†¶9†¶2†¶+†¶$†¶†¶†¶†¶†¶†¶ú…¶ó…¶ì…¶å…¶Þ…¶×…¶Ð…¶É…¶Â…¶»…¶´…¶­…¶¦…¶Ÿ…¶˜…¶‘…¶Š…¶ƒ…¶|…¶u…¶n…¶g…¶`…¶Y…¶R…¶K…¶D…¶=…¶6…¶/…¶(…¶!…¶…¶…¶ …¶…¶þ„¶÷„¶ð„¶é„¶â„¶Û„¶Ô„¶Í„¶Æ„¶¿„¶¸„¶±„¶ª„¶£„¶œ„¶•„¶Ž„¶‡„¶€„¶y„¶r„¶k„¶d„¶]„¶V„¶O„¶H„¶A„¶:„¶3„¶,„¶%„¶„¶„¶„¶ „¶„¶ûƒ¶ôƒ¶탶惶߃¶؃¶у¶ʃ¶ö¼ƒ¶µƒ¶®ƒ¶§ƒ¶ ƒ¶™ƒ¶’ƒ¶‹ƒ¶„ƒ¶}ƒ¶vƒ¶oƒ¶hƒ¶aƒ¶Zƒ¶Sƒ¶Lƒ¶Eƒ¶>ƒ¶7ƒ¶0ƒ¶)ƒ¶"ƒ¶ƒ¶ƒ¶ ƒ¶ƒ¶ÿ‚¶ø‚¶ñ‚¶ê‚¶ã‚¶Ü‚¶Õ‚¶΂¶Ç‚¶À‚¶¹‚¶²‚¶«‚¶¤‚¶‚¶–‚¶‚¶ˆ‚¶‚¶z‚¶s‚¶l‚¶e‚¶^‚¶W‚¶P‚¶I‚¶B‚¶;‚¶4‚¶-‚¶&‚¶‚¶‚¶‚¶ ‚¶‚¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù€¶ò€¶뀶䀶Ý€¶Ö€¶Ï€¶È€¶Á€¶º€¶³€¶¬€¶¥€¶ž€¶—€¶€¶‰€¶‚€¶{€¶t€¶m€¶f€¶_€¶X€¶Q€¶J€¶C€¶<€¶5€¶.€¶'€¶ €¶€¶€¶ €¶€¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú~¶ó~¶ì~¶å~¶Þ~¶×~¶Ð~¶É~¶Â~¶»~¶´~¶­~¶¦~¶Ÿ~¶˜~¶‘~¶Š~¶ƒ~¶|~¶u~¶n~¶g~¶`~¶Y~¶R~¶K~¶D~¶=~¶6~¶/~¶(~¶!~¶~¶~¶ ~¶~¶þ}¶÷}¶ð}¶é}¶â}¶Û}¶Ô}¶Í}¶Æ}¶¿}¶¸}¶±}¶ª}¶£}¶œ}¶•}¶Ž}¶‡}¶€}¶y}¶r}¶k}¶d}¶]}¶V}¶O}¶H}¶A}¶:}¶3}¶,}¶%}¶}¶}¶}¶ }¶}¶û|¶ô|¶í|¶æ|¶ß|¶Ø|¶Ñ|¶Ê|¶Ã|¶¼|¶µ|¶®|¶§|¶ |¶™|¶’|¶‹|¶„|¶}|¶v|¶o|¶h|¶a|¶Z|¶S|¶L|¶E|¶>|¶7|¶0|¶)|¶"|¶|¶|¶ |¶|¶ÿ{¶ø{¶ñ{¶ê{¶ã{¶Ü{¶Õ{¶Î{¶Ç{¶À{¶¹{¶²{¶«{¶¤{¶{¶–{¶{¶ˆ{¶{¶z{¶s{¶l{¶e{¶^{¶W{¶P{¶I{¶B{¶;{¶4{¶-{¶&{¶{¶{¶{¶ {¶{¶üz¶õz¶îz¶çz¶àz¶Ùz¶Òz¶Ëz¶Äz¶½z¶¶z¶¯z¶¨z¶¡z¶šz¶“z¶Œz¶…z¶~z¶wz¶pz¶iz¶bz¶[z¶Tz¶Mz¶Fz¶?z¶8z¶1z¶*z¶#z¶z¶z¶z¶z¶z¶ùy¶òy¶ëy¶äy¶Ýy¶Öy¶Ïy¶Èy¶Áy¶ºy¶³y¶¬y¶¥y¶žy¶—y¶y¶‰y¶‚y¶{y¶ty¶my¶fy¶_y¶Xy¶Qy¶Jy¶Cy¶u¶7u¶0u¶)u¶"u¶u¶u¶ u¶u¶ÿt¶øt¶ñt¶êt¶ãt¶Üt¶Õt¶Ît¶Çt¶Àt¶¹t¶²t¶«t¶¤t¶t¶–t¶t¶ˆt¶t¶zt¶st¶lt¶et¶^t¶Wt¶Pt¶It¶Bt¶;t¶4t¶-t¶&t¶t¶t¶t¶ t¶t¶üs¶õs¶îs¶çs¶às¶Ùs¶Òs¶Ës¶Äs¶½s¶¶s¶¯s¶¨s¶¡s¶šs¶“s¶Œs¶…s¶~s¶ws¶ps¶is¶bs¶[s¶Ts¶Ms¶Fs¶?s¶8s¶1s¶*s¶#s¶s¶s¶s¶s¶s¶ùr¶òr¶ër¶är¶Ýr¶Ör¶Ïr¶Èr¶Ár¶ºr¶³r¶¬r¶¥r¶žr¶—r¶r¶‰r¶‚r¶{r¶tr¶mr¶fr¶_r¶Xr¶Qr¶Jr¶Cr¶n¶7n¶0n¶)n¶"n¶n¶n¶ n¶n¶ÿm¶øm¶ñm¶êm¶ãm¶Üm¶Õm¶Îm¶Çm¶Àm¶¹m¶²m¶«m¶¤m¶m¶–m¶m¶ˆm¶m¶zm¶sm¶lm¶em¶^m¶Wm¶Pm¶Im¶Bm¶;m¶4m¶-m¶&m¶m¶m¶m¶ m¶m¶ül¶õl¶îl¶çl¶àl¶Ùl¶Òl¶Ël¶Äl¶½l¶¶l¶¯l¶¨l¶¡l¶šl¶“l¶Œl¶…l¶~l¶wl¶pl¶il¶bl¶[l¶Tl¶Ml¶Fl¶?l¶8l¶1l¶*l¶#l¶l¶l¶l¶l¶l¶ùk¶òk¶ëk¶äk¶Ýk¶Ök¶Ïk¶Èk¶Ák¶ºk¶³k¶¬k¶¥k¶žk¶—k¶k¶‰k¶‚k¶{k¶tk¶mk¶fk¶_k¶Xk¶Qk¶Jk¶Ck¶g¶7g¶0g¶)g¶"g¶g¶g¶ g¶g¶ÿf¶øf¶ñf¶êf¶ãf¶Üf¶Õf¶Îf¶Çf¶Àf¶¹f¶²f¶«f¶¤f¶f¶–f¶f¶ˆf¶f¶zf¶sf¶lf¶ef¶^f¶Wf¶Pf¶If¶Bf¶;f¶4f¶-f¶&f¶f¶f¶f¶ f¶f¶üe¶õe¶îe¶çe¶àe¶Ùe¶Òe¶Ëe¶Äe¶½e¶¶e¶¯e¶¨e¶¡e¶še¶“e¶Œe¶…e¶~e¶we¶pe¶ie¶be¶[e¶Te¶Me¶Fe¶?e¶8e¶1e¶*e¶#e¶e¶e¶e¶e¶e¶ùd¶òd¶ëd¶äd¶Ýd¶Öd¶Ïd¶Èd¶Ád¶ºd¶³d¶¬d¶¥d¶žd¶—d¶d¶‰d¶‚d¶{d¶td¶md¶fd¶_d¶Xd¶Qd¶Jd¶Cd¶`¶7`¶0`¶)`¶"`¶`¶`¶ `¶`¶ÿ_¶ø_¶ñ_¶ê_¶ã_¶Ü_¶Õ_¶Î_¶Ç_¶À_¶¹_¶²_¶«_¶¤_¶_¶–_¶_¶ˆ_¶_¶z_¶s_¶l_¶e_¶^_¶W_¶P_¶I_¶B_¶;_¶4_¶-_¶&_¶_¶_¶_¶ _¶_¶ü^¶õ^¶î^¶ç^¶à^¶Ù^¶Ò^¶Ë^¶Ä^¶½^¶¶^¶¯^¶¨^¶¡^¶š^¶“^¶Œ^¶…^¶~^¶w^¶p^¶i^¶b^¶[^¶T^¶M^¶F^¶?^¶8^¶1^¶*^¶#^¶^¶^¶^¶^¶^¶ù]¶ò]¶ë]¶ä]¶Ý]¶Ö]¶Ï]¶È]¶Á]¶º]¶³]¶¬]¶¥]¶ž]¶—]¶]¶‰]¶‚]¶{]¶t]¶m]¶f]¶_]¶X]¶Q]¶J]¶C]¶<]¶5]¶.]¶']¶ ]¶]¶]¶ ]¶]¶ý\¶ö\¶ï\¶è\¶á\¶Ú\¶Ó\¶Ì\¶Å\¶¾\¶·\¶°\¶©\¶¢\¶›\¶”\¶\¶†\¶\¶x\¶q\¶j\¶c\¶\\¶U\¶N\¶G\¶@\¶9\¶2\¶+\¶$\¶\¶\¶\¶\¶\¶ú[¶ó[¶ì[¶å[¶Þ[¶×[¶Ð[¶É[¶Â[¶»[¶´[¶­[¶¦[¶Ÿ[¶˜[¶‘[¶Š[¶ƒ[¶|[¶u[¶n[¶g[¶`[¶Y[¶R[¶K[¶D[¶=[¶6[¶/[¶([¶![¶[¶[¶ [¶[¶þZ¶÷Z¶ðZ¶éZ¶âZ¶ÛZ¶ÔZ¶ÍZ¶ÆZ¶¿Z¶¸Z¶±Z¶ªZ¶£Z¶œZ¶•Z¶ŽZ¶‡Z¶€Z¶yZ¶rZ¶kZ¶dZ¶]Z¶VZ¶OZ¶HZ¶AZ¶:Z¶3Z¶,Z¶%Z¶Z¶Z¶Z¶ Z¶Z¶ûY¶ôY¶íY¶æY¶ßY¶ØY¶ÑY¶ÊY¶ÃY¶¼Y¶µY¶®Y¶§Y¶ Y¶™Y¶’Y¶‹Y¶„Y¶}Y¶vY¶oY¶hY¶aY¶ZY¶SY¶LY¶EY¶>Y¶7Y¶0Y¶)Y¶"Y¶Y¶Y¶ Y¶Y¶ÿX¶øX¶ñX¶êX¶ãX¶ÜX¶ÕX¶ÎX¶ÇX¶ÀX¶¹X¶²X¶«X¶¤X¶X¶–X¶X¶ˆX¶X¶zX¶sX¶lX¶eX¶^X¶WX¶PX¶IX¶BX¶;X¶4X¶-X¶&X¶X¶X¶X¶ X¶X¶üW¶õW¶îW¶çW¶àW¶ÙW¶ÒW¶ËW¶ÄW¶½W¶¶W¶¯W¶¨W¶¡W¶šW¶“W¶ŒW¶…W¶~W¶wW¶pW¶iW¶bW¶[W¶TW¶MW¶FW¶?W¶8W¶1W¶*W¶#W¶W¶W¶W¶W¶W¶ùV¶òV¶ëV¶äV¶ÝV¶ÖV¶ÏV¶ÈV¶ÁV¶ºV¶³V¶¬V¶¥V¶žV¶—V¶V¶‰V¶‚V¶{V¶tV¶mV¶fV¶_V¶XV¶QV¶JV¶CV¶R¶7R¶0R¶)R¶"R¶R¶R¶ R¶R¶ÿQ¶øQ¶ñQ¶êQ¶ãQ¶ÜQ¶ÕQ¶ÎQ¶ÇQ¶ÀQ¶¹Q¶²Q¶«Q¶¤Q¶Q¶–Q¶Q¶ˆQ¶Q¶zQ¶sQ¶lQ¶eQ¶^Q¶WQ¶PQ¶IQ¶BQ¶;Q¶4Q¶-Q¶&Q¶Q¶Q¶Q¶ Q¶Q¶üP¶õP¶îP¶çP¶àP¶ÙP¶ÒP¶ËP¶ÄP¶½P¶¶P¶¯P¶¨P¶¡P¶šP¶“P¶ŒP¶…P¶~P¶wP¶pP¶iP¶bP¶[P¶TP¶MP¶FP¶?P¶8P¶1P¶*P¶#P¶P¶P¶P¶P¶P¶ùO¶òO¶ëO¶äO¶ÝO¶ÖO¶ÏO¶ÈO¶ÁO¶ºO¶³O¶¬O¶¥O¶žO¶—O¶O¶‰O¶‚O¶{O¶tO¶mO¶fO¶_O¶XO¶QO¶JO¶CO¶K¶7K¶0K¶)K¶"K¶K¶K¶ K¶K¶ÿJ¶øJ¶ñJ¶êJ¶ãJ¶ÜJ¶ÕJ¶ÎJ¶ÇJ¶ÀJ¶¹J¶²J¶«J¶¤J¶J¶–J¶J¶ˆJ¶J¶zJ¶sJ¶lJ¶eJ¶^J¶WJ¶PJ¶IJ¶BJ¶;J¶4J¶-J¶&J¶J¶J¶J¶ J¶J¶üI¶õI¶îI¶çI¶àI¶ÙI¶ÒI¶ËI¶ÄI¶½I¶¶I¶¯I¶¨I¶¡I¶šI¶“I¶ŒI¶…I¶~I¶wI¶pI¶iI¶bI¶[I¶TI¶MI¶FI¶?I¶8I¶1I¶*I¶#I¶I¶I¶I¶I¶I¶ùH¶òH¶ëH¶äH¶ÝH¶ÖH¶ÏH¶ÈH¶ÁH¶ºH¶³H¶¬H¶¥H¶žH¶—H¶H¶‰H¶‚H¶{H¶tH¶mH¶fH¶_H¶XH¶QH¶JH¶CH¶D¶7D¶0D¶)D¶"D¶D¶D¶ D¶D¶ÿC¶øC¶ñC¶êC¶ãC¶ÜC¶ÕC¶ÎC¶ÇC¶ÀC¶¹C¶²C¶«C¶¤C¶C¶–C¶C¶ˆC¶C¶zC¶sC¶lC¶eC¶^C¶WC¶PC¶IC¶BC¶;C¶4C¶-C¶&C¶C¶C¶C¶ C¶C¶üB¶õB¶îB¶çB¶àB¶ÙB¶ÒB¶ËB¶ÄB¶½B¶¶B¶¯B¶¨B¶¡B¶šB¶“B¶ŒB¶…B¶~B¶wB¶pB¶iB¶bB¶[B¶TB¶MB¶FB¶?B¶8B¶1B¶*B¶#B¶B¶B¶B¶B¶B¶ùA¶òA¶ëA¶äA¶ÝA¶ÖA¶ÏA¶ÈA¶ÁA¶ºA¶³A¶¬A¶¥A¶žA¶—A¶A¶‰A¶‚A¶{A¶tA¶mA¶fA¶_A¶XA¶QA¶JA¶CA¶¶÷>¶ð>¶é>¶â>¶Û>¶Ô>¶Í>¶Æ>¶¿>¶¸>¶±>¶ª>¶£>¶œ>¶•>¶Ž>¶‡>¶€>¶y>¶r>¶k>¶d>¶]>¶V>¶O>¶H>¶A>¶:>¶3>¶,>¶%>¶>¶>¶>¶ >¶>¶û=¶ô=¶í=¶æ=¶ß=¶Ø=¶Ñ=¶Ê=¶Ã=¶¼=¶µ=¶®=¶§=¶ =¶™=¶’=¶‹=¶„=¶}=¶v=¶o=¶h=¶a=¶Z=¶S=¶L=¶E=¶>=¶7=¶0=¶)=¶"=¶=¶=¶ =¶=¶ÿ<¶ø<¶ñ<¶ê<¶ã<¶Ü<¶Õ<¶Î<¶Ç<¶À<¶¹<¶²<¶«<¶¤<¶<¶–<¶<¶ˆ<¶<¶z<¶s<¶l<¶e<¶^<¶W<¶P<¶I<¶B<¶;<¶4<¶-<¶&<¶<¶<¶<¶ <¶<¶ü;¶õ;¶î;¶ç;¶à;¶Ù;¶Ò;¶Ë;¶Ä;¶½;¶¶;¶¯;¶¨;¶¡;¶š;¶“;¶Œ;¶…;¶~;¶w;¶p;¶i;¶b;¶[;¶T;¶M;¶F;¶?;¶8;¶1;¶*;¶#;¶;¶;¶;¶;¶;¶ù:¶ò:¶ë:¶ä:¶Ý:¶Ö:¶Ï:¶È:¶Á:¶º:¶³:¶¬:¶¥:¶ž:¶—:¶:¶‰:¶‚:¶{:¶t:¶m:¶f:¶_:¶X:¶Q:¶J:¶C:¶<:¶5:¶.:¶':¶ :¶:¶:¶ :¶:¶ý9¶ö9¶ï9¶è9¶á9¶Ú9¶Ó9¶Ì9¶Å9¶¾9¶·9¶°9¶©9¶¢9¶›9¶”9¶9¶†9¶9¶x9¶q9¶j9¶c9¶\9¶U9¶N9¶G9¶@9¶99¶29¶+9¶$9¶9¶9¶9¶9¶9¶ú8¶ó8¶ì8¶å8¶Þ8¶×8¶Ð8¶É8¶Â8¶»8¶´8¶­8¶¦8¶Ÿ8¶˜8¶‘8¶Š8¶ƒ8¶|8¶u8¶n8¶g8¶`8¶Y8¶R8¶K8¶D8¶=8¶68¶/8¶(8¶!8¶8¶8¶ 8¶8¶þ7¶÷7¶ð7¶é7¶â7¶Û7¶Ô7¶Í7¶Æ7¶¿7¶¸7¶±7¶ª7¶£7¶œ7¶•7¶Ž7¶‡7¶€7¶y7¶r7¶k7¶d7¶]7¶V7¶O7¶H7¶A7¶:7¶37¶,7¶%7¶7¶7¶7¶ 7¶7¶û6¶ô6¶í6¶æ6¶ß6¶Ø6¶Ñ6¶Ê6¶Ã6¶¼6¶µ6¶®6¶§6¶ 6¶™6¶’6¶‹6¶„6¶}6¶v6¶o6¶h6¶a6¶Z6¶S6¶L6¶E6¶>6¶76¶06¶)6¶"6¶6¶6¶ 6¶6¶ÿ5¶ø5¶ñ5¶ê5¶ã5¶Ü5¶Õ5¶Î5¶Ç5¶À5¶¹5¶²5¶«5¶¤5¶5¶–5¶5¶ˆ5¶5¶z5¶s5¶l5¶e5¶^5¶W5¶P5¶I5¶B5¶;5¶45¶-5¶&5¶5¶5¶5¶ 5¶5¶ü4¶õ4¶î4¶ç4¶à4¶Ù4¶Ò4¶Ë4¶Ä4¶½4¶¶4¶¯4¶¨4¶¡4¶š4¶“4¶Œ4¶…4¶~4¶w4¶p4¶i4¶b4¶[4¶T4¶M4¶F4¶?4¶84¶14¶*4¶#4¶4¶4¶4¶4¶4¶ù3¶ò3¶ë3¶ä3¶Ý3¶Ö3¶Ï3¶È3¶Á3¶º3¶³3¶¬3¶¥3¶ž3¶—3¶3¶‰3¶‚3¶{3¶t3¶m3¶f3¶_3¶X3¶Q3¶J3¶C3¶<3¶53¶.3¶'3¶ 3¶3¶3¶ 3¶3¶ý2¶ö2¶ï2¶è2¶á2¶Ú2¶Ó2¶Ì2¶Å2¶¾2¶·2¶°2¶©2¶¢2¶›2¶”2¶2¶†2¶2¶x2¶q2¶j2¶c2¶\2¶U2¶N2¶G2¶@2¶92¶22¶+2¶$2¶2¶2¶2¶2¶2¶ú1¶ó1¶ì1¶å1¶Þ1¶×1¶Ð1¶É1¶Â1¶»1¶´1¶­1¶¦1¶Ÿ1¶˜1¶‘1¶Š1¶ƒ1¶|1¶u1¶n1¶g1¶`1¶Y1¶R1¶K1¶D1¶=1¶61¶/1¶(1¶!1¶1¶1¶ 1¶1¶þ0¶÷0¶ð0¶é0¶â0¶Û0¶Ô0¶Í0¶Æ0¶¿0¶¸0¶±0¶ª0¶£0¶œ0¶•0¶Ž0¶‡0¶€0¶y0¶r0¶k0¶d0¶]0¶V0¶O0¶H0¶A0¶:0¶30¶,0¶%0¶0¶0¶0¶ 0¶0¶û/¶ô/¶í/¶æ/¶ß/¶Ø/¶Ñ/¶Ê/¶Ã/¶¼/¶µ/¶®/¶§/¶ /¶™/¶’/¶‹/¶„/¶}/¶v/¶o/¶h/¶a/¶Z/¶S/¶L/¶E/¶>/¶7/¶0/¶)/¶"/¶/¶/¶ /¶/¶ÿ.¶ø.¶ñ.¶ê.¶ã.¶Ü.¶Õ.¶Î.¶Ç.¶À.¶¹.¶².¶«.¶¤.¶.¶–.¶.¶ˆ.¶.¶z.¶s.¶l.¶e.¶^.¶W.¶P.¶I.¶B.¶;.¶4.¶-.¶&.¶.¶.¶.¶ .¶.¶ü-¶õ-¶î-¶ç-¶à-¶Ù-¶Ò-¶Ë-¶Ä-¶½-¶¶-¶¯-¶¨-¶¡-¶š-¶“-¶Œ-¶…-¶~-¶w-¶p-¶i-¶b-¶[-¶T-¶M-¶F-¶?-¶8-¶1-¶*-¶#-¶-¶-¶-¶-¶-¶ù,¶ò,¶ë,¶ä,¶Ý,¶Ö,¶Ï,¶È,¶Á,¶º,¶³,¶¬,¶¥,¶ž,¶—,¶,¶‰,¶‚,¶{,¶t,¶m,¶f,¶_,¶X,¶Q,¶J,¶C,¶<,¶5,¶.,¶',¶ ,¶,¶,¶ ,¶,¶ý+¶ö+¶ï+¶è+¶á+¶Ú+¶Ó+¶Ì+¶Å+¶¾+¶·+¶°+¶©+¶¢+¶›+¶”+¶+¶†+¶+¶x+¶q+¶j+¶c+¶\+¶U+¶N+¶G+¶@+¶9+¶2+¶++¶$+¶+¶+¶+¶+¶+¶ú*¶ó*¶ì*¶å*¶Þ*¶×*¶Ð*¶É*¶Â*¶»*¶´*¶­*¶¦*¶Ÿ*¶˜*¶‘*¶Š*¶ƒ*¶|*¶u*¶n*¶g*¶`*¶Y*¶R*¶K*¶D*¶=*¶6*¶/*¶(*¶!*¶*¶*¶ *¶*¶þ)¶÷)¶ð)¶é)¶â)¶Û)¶Ô)¶Í)¶Æ)¶¿)¶¸)¶±)¶ª)¶£)¶œ)¶•)¶Ž)¶‡)¶€)¶y)¶r)¶k)¶d)¶])¶V)¶O)¶H)¶A)¶:)¶3)¶,)¶%)¶)¶)¶)¶ )¶)¶û(¶ô(¶í(¶æ(¶ß(¶Ø(¶Ñ(¶Ê(¶Ã(¶¼(¶µ(¶®(¶§(¶ (¶™(¶’(¶‹(¶„(¶}(¶v(¶o(¶h(¶a(¶Z(¶S(¶L(¶E(¶>(¶7(¶0(¶)(¶"(¶(¶(¶ (¶(¶ÿ'¶ø'¶ñ'¶ê'¶ã'¶Ü'¶Õ'¶Î'¶Ç'¶À'¶¹'¶²'¶«'¶¤'¶'¶–'¶'¶ˆ'¶'¶z'¶s'¶l'¶e'¶^'¶W'¶P'¶I'¶B'¶;'¶4'¶-'¶&'¶'¶'¶'¶ '¶'¶ü&¶õ&¶î&¶ç&¶à&¶Ù&¶Ò&¶Ë&¶Ä&¶½&¶¶&¶¯&¶¨&¶¡&¶š&¶“&¶Œ&¶…&¶~&¶w&¶p&¶i&¶b&¶[&¶T&¶M&¶F&¶?&¶8&¶1&¶*&¶#&¶&¶&¶&¶&¶&¶ù%¶ò%¶ë%¶ä%¶Ý%¶Ö%¶Ï%¶È%¶Á%¶º%¶³%¶¬%¶¥%¶ž%¶—%¶%¶‰%¶‚%¶{%¶t%¶m%¶f%¶_%¶X%¶Q%¶J%¶C%¶<%¶5%¶.%¶'%¶ %¶%¶%¶ %¶%¶ý$¶ö$¶ï$¶è$¶á$¶Ú$¶Ó$¶Ì$¶Å$¶¾$¶·$¶°$¶©$¶¢$¶›$¶”$¶$¶†$¶$¶x$¶q$¶j$¶c$¶\$¶U$¶N$¶G$¶@$¶9$¶2$¶+$¶$$¶$¶$¶$¶$¶$¶ú#¶ó#¶ì#¶å#¶Þ#¶×#¶Ð#¶É#¶Â#¶»#¶´#¶­#¶¦#¶Ÿ#¶˜#¶‘#¶Š#¶ƒ#¶|#¶u#¶n#¶g#¶`#¶Y#¶R#¶K#¶D#¶=#¶6#¶/#¶(#¶!#¶#¶#¶ #¶#¶þ"¶÷"¶ð"¶é"¶â"¶Û"¶Ô"¶Í"¶Æ"¶¿"¶¸"¶±"¶ª"¶£"¶œ"¶•"¶Ž"¶‡"¶€"¶y"¶r"¶k"¶d"¶]"¶V"¶O"¶H"¶A"¶:"¶3"¶,"¶%"¶"¶"¶"¶ "¶"¶û!¶ô!¶í!¶æ!¶ß!¶Ø!¶Ñ!¶Ê!¶Ã!¶¼!¶µ!¶®!¶§!¶ !¶™!¶’!¶‹!¶„!¶}!¶v!¶o!¶h!¶a!¶Z!¶S!¶L!¶E!¶>!¶7!¶0!¶)!¶"!¶!¶!¶ !¶!¶ÿ ¶ø ¶ñ ¶ê ¶ã ¶Ü ¶Õ ¶Î ¶Ç ¶À ¶¹ ¶² ¶« ¶¤ ¶ ¶– ¶ ¶ˆ ¶ ¶z ¶s ¶l ¶e ¶^ ¶W ¶P ¶I ¶B ¶; ¶4 ¶- ¶& ¶ ¶ ¶ ¶ ¶ ¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶Ë¶Ä¶½¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù¶ò¶ë¶ä¶Ý¶Ö¶Ï¶È¶Á¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú¶ó¶ì¶å¶Þ¶×¶Ð¶É¶Â¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶Š¶ƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þ¶÷¶ð¶é¶â¶Û¶Ô¶Í¶Æ¶¿¶¸¶±¶ª¶£¶œ¶•¶Ž¶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶û¶ô¶í¶æ¶ß¶Ø¶Ñ¶Ê¶Ã¶¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿ¶ø¶ñ¶ê¶ã¶Ü¶Õ¶Î¶Ç¶À¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶Ë¶Ä¶½¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù¶ò¶ë¶ä¶Ý¶Ö¶Ï¶È¶Á¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú¶ó¶ì¶å¶Þ¶×¶Ð¶É¶Â¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶Š¶ƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þ¶÷¶ð¶é¶â¶Û¶Ô¶Í¶Æ¶¿¶¸¶±¶ª¶£¶œ¶•¶Ž¶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶û¶ô¶í¶æ¶ß¶Ø¶Ñ¶Ê¶Ã¶¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿ¶ø¶ñ¶ê¶ã¶Ü¶Õ¶Î¶Ç¶À¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶Ë¶Ä¶½¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù¶ò¶ë¶ä¶Ý¶Ö¶Ï¶È¶Á¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú¶ó¶ì¶å¶Þ¶×¶Ð¶É¶Â¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶Š¶ƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þ ¶÷ ¶ð ¶é ¶â ¶Û ¶Ô ¶Í ¶Æ ¶¿ ¶¸ ¶± ¶ª ¶£ ¶œ ¶• ¶Ž ¶‡ ¶€ ¶y ¶r ¶k ¶d ¶] ¶V ¶O ¶H ¶A ¶: ¶3 ¶, ¶% ¶ ¶ ¶ ¶ ¶ ¶û ¶ô ¶í ¶æ ¶ß ¶Ø ¶Ñ ¶Ê ¶à ¶¼ ¶µ ¶® ¶§ ¶  ¶™ ¶’ ¶‹ ¶„ ¶} ¶v ¶o ¶h ¶a ¶Z ¶S ¶L ¶E ¶> ¶7 ¶0 ¶) ¶" ¶ ¶ ¶ ¶ ¶ÿ ¶ø ¶ñ ¶ê ¶ã ¶Ü ¶Õ ¶Î ¶Ç ¶À ¶¹ ¶² ¶« ¶¤ ¶ ¶– ¶ ¶ˆ ¶ ¶z ¶s ¶l ¶e ¶^ ¶W ¶P ¶I ¶B ¶; ¶4 ¶- ¶& ¶ ¶ ¶ ¶ ¶ ¶ü ¶õ ¶î ¶ç ¶à ¶Ù ¶Ò ¶Ë ¶Ä ¶½ ¶¶ ¶¯ ¶¨ ¶¡ ¶š ¶“ ¶Œ ¶… ¶~ ¶w ¶p ¶i ¶b ¶[ ¶T ¶M ¶F ¶? ¶8 ¶1 ¶* ¶# ¶ ¶ ¶ ¶ ¶ ¶ù ¶ò ¶ë ¶ä ¶Ý ¶Ö ¶Ï ¶È ¶Á ¶º ¶³ ¶¬ ¶¥ ¶ž ¶— ¶ ¶‰ ¶‚ ¶{ ¶t ¶m ¶f ¶_ ¶X ¶Q ¶J ¶C ¶< ¶5 ¶. ¶' ¶ ¶ ¶ ¶ ¶ ¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú¶ó¶ì¶å¶Þ¶×¶Ð¶É¶Â¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶Š¶ƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þ¶÷¶ð¶é¶â¶Û¶Ô¶Í¶Æ¶¿¶¸¶±¶ª¶£¶œ¶•¶Ž¶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶û¶ô¶í¶æ¶ß¶Ø¶Ñ¶Ê¶Ã¶¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿ¶ø¶ñ¶ê¶ã¶Ü¶Õ¶Î¶Ç¶À¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶ü¶õ¶î¶ç¶à¶Ù¶Ò¶Ë¶Ä¶½¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ù¶ò¶ë¶ä¶Ý¶Ö¶Ï¶È¶Á¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ý¶ö¶ï¶è¶á¶Ú¶Ó¶Ì¶Å¶¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þÿµ÷ÿµðÿµéÿµâÿµÛÿµÔÿµÍÿµÆÿµ¿ÿµ¸ÿµ±ÿµªÿµ£ÿµœÿµ•ÿµŽÿµ‡ÿµ€ÿµyÿµrÿµkÿµdÿµ]ÿµVÿµOÿµHÿµAÿµ:ÿµ3ÿµ,ÿµ%ÿµÿµÿµÿµ ÿµÿµûþµôþµíþµæþµßþµØþµÑþµÊþµÃþµ¼þµµþµ®þµ§þµ þµ™þµ’þµ‹þµ„þµ}þµvþµoþµhþµaþµZþµSþµLþµEþµ>þµ7þµ0þµ)þµ"þµþµþµ þµþµÿýµøýµñýµêýµãýµÜýµÕýµÎýµÇýµÀýµ¹ýµ²ýµ«ýµ¤ýµýµ–ýµýµˆýµýµzýµsýµlýµeýµ^ýµWýµPýµIýµBýµ;ýµ4ýµ-ýµ&ýµýµýµýµ ýµýµüüµõüµîüµçüµàüµÙüµÒüµËüµÄüµ½üµ¶üµ¯üµ¨üµ¡üµšüµ“üµŒüµ…üµ~üµwüµpüµiüµbüµ[üµTüµMüµFüµ?üµ8üµ1üµ*üµ#üµüµüµüµüµüµùûµòûµëûµäûµÝûµÖûµÏûµÈûµÁûµºûµ³ûµ¬ûµ¥ûµžûµ—ûµûµ‰ûµ‚ûµ{ûµtûµmûµfûµ_ûµXûµQûµJûµCûµ<ûµ5ûµ.ûµ'ûµ ûµûµûµ ûµûµýúµöúµïúµèúµáúµÚúµÓúµÌúµÅúµ¾úµ·úµ°úµ©úµ¢úµ›úµ”úµúµ†úµúµxúµqúµjúµcúµ\úµUúµNúµGúµ@úµ9úµ2úµ+úµ$úµúµúµúµúµúµúùµóùµìùµåùµÞùµ×ùµÐùµÉùµÂùµ»ùµ´ùµ­ùµ¦ùµŸùµ˜ùµ‘ùµŠùµƒùµ|ùµuùµnùµgùµ`ùµYùµRùµKùµDùµ=ùµ6ùµ/ùµ(ùµ!ùµùµùµ ùµùµþøµ÷øµðøµéøµâøµÛøµÔøµÍøµÆøµ¿øµ¸øµ±øµªøµ£øµœøµ•øµŽøµ‡øµ€øµyøµrøµkøµdøµ]øµVøµOøµHøµAøµ:øµ3øµ,øµ%øµøµøµøµ øµøµû÷µô÷µí÷µæ÷µß÷µØ÷µÑ÷µÊ÷µÃ÷µ¼÷µµ÷µ®÷µ§÷µ ÷µ™÷µ’÷µ‹÷µ„÷µ}÷µv÷µo÷µh÷µa÷µZ÷µS÷µL÷µE÷µ>÷µ7÷µ0÷µ)÷µ"÷µ÷µ÷µ ÷µ÷µÿöµøöµñöµêöµãöµÜöµÕöµÎöµÇöµÀöµ¹öµ²öµ«öµ¤öµöµ–öµöµˆöµöµzöµsöµlöµeöµ^öµWöµPöµIöµBöµ;öµ4öµ-öµ&öµöµöµöµ öµöµüõµõõµîõµçõµàõµÙõµÒõµËõµÄõµ½õµ¶õµ¯õµ¨õµ¡õµšõµ“õµŒõµ…õµ~õµwõµpõµiõµbõµ[õµTõµMõµFõµ?õµ8õµ1õµ*õµ#õµõµõµõµõµõµùôµòôµëôµäôµÝôµÖôµÏôµÈôµÁôµºôµ³ôµ¬ôµ¥ôµžôµ—ôµôµ‰ôµ‚ôµ{ôµtôµmôµfôµ_ôµXôµQôµJôµCôµ<ôµ5ôµ.ôµ'ôµ ôµôµôµ ôµôµýóµöóµïóµèóµáóµÚóµÓóµÌóµÅóµ¾óµ·óµ°óµ©óµ¢óµ›óµ”óµóµ†óµóµxóµqóµjóµcóµ\óµUóµNóµGóµ@óµ9óµ2óµ+óµ$óµóµóµóµóµóµúòµóòµìòµåòµÞòµ×òµÐòµÉòµÂòµ»òµ´òµ­òµ¦òµŸòµ˜òµ‘òµŠòµƒòµ|òµuòµnòµgòµ`òµYòµRòµKòµDòµ=òµ6òµ/òµ(òµ!òµòµòµ òµòµþñµ÷ñµðñµéñµâñµÛñµÔñµÍñµÆñµ¿ñµ¸ñµ±ñµªñµ£ñµœñµ•ñµŽñµ‡ñµ€ñµyñµrñµkñµdñµ]ñµVñµOñµHñµAñµ:ñµ3ñµ,ñµ%ñµñµñµñµ ñµñµûðµôðµíðµæðµßðµØðµÑðµÊðµÃðµ¼ðµµðµ®ðµ§ðµ ðµ™ðµ’ðµ‹ðµ„ðµ}ðµvðµoðµhðµaðµZðµSðµLðµEðµ>ðµ7ðµ0ðµ)ðµ"ðµðµðµ ðµðµÿïµøïµñïµêïµãïµÜïµÕïµÎïµÇïµÀﵹﵲﵫﵤïµïµ–ïµïµˆïµïµzïµsïµlïµeïµ^ïµWïµPïµIïµBïµ;ïµ4ïµ-ïµ&ïµïµïµïµ ïµïµüîµõîµîîµçîµàîµÙîµÒîµËîµÄîµ~îµwîµpîµiîµbîµ[îµTîµMîµFîµ?îµ8îµ1îµ*îµ#îµîµîµîµîµîµùíµòíµëíµäíµÝíµÖíµÏíµÈíµÁíµºíµ³íµ¬íµ¥íµžíµ—íµíµ‰íµ‚íµ{íµtíµmíµfíµ_íµXíµQíµJíµCíµ<íµ5íµ.íµ'íµ íµíµíµ íµíµýìµöìµïìµèìµáìµÚìµÓìµÌìµÅ쵾쵷쵰쵩쵢쵛쵔ìµìµ†ìµìµxìµqìµjìµcìµ\ìµUìµNìµGìµ@ìµ9ìµ2ìµ+ìµ$ìµìµìµìµìµìµúëµóëµìëµåëµÞëµ×ëµÐëµÉëµÂ뵻뵴뵭뵦뵟뵘뵑뵊뵃ëµ|ëµuëµnëµgëµ`ëµYëµRëµKëµDëµ=ëµ6ëµ/ëµ(ëµ!ëµëµëµ ëµëµþêµ÷êµðêµéêµâêµÛêµÔêµÍêµÆêµ¿êµ¸êµ±êµªêµ£êµœêµ•êµŽêµ‡êµ€êµyêµrêµkêµdêµ]êµVêµOêµHêµAêµ:êµ3êµ,êµ%êµêµêµêµ êµêµûéµôéµí鵿éµß鵨éµÑéµÊéµÃ鵼鵵鵮鵧鵠鵙鵒鵋鵄éµ}éµvéµoéµhéµaéµZéµSéµLéµEéµ>éµ7éµ0éµ)éµ"éµéµéµ éµéµÿèµøèµñèµêèµãèµÜèµÕèµÎèµÇèµÀ赹赲赫赤èµèµ–èµèµˆèµèµzèµsèµlèµeèµ^èµWèµPèµIèµBèµ;èµ4èµ-èµ&èµèµèµèµ èµèµüçµõçµîçµççµàçµÙçµÒçµËçµÄ絽絶絯絨絡絚絓経絅çµ~çµwçµpçµiçµbçµ[çµTçµMçµFçµ?çµ8çµ1çµ*çµ#çµçµçµçµçµçµùæµòæµëæµäæµÝæµÖæµÏæµÈæµÁæµºæµ³æµ¬æµ¥æµžæµ—æµæµ‰æµ‚æµ{æµtæµmæµfæµ_æµXæµQæµJæµCæµ<æµ5æµ.æµ'æµ æµæµæµ æµæµýåµöåµïåµèåµáåµÚåµÓåµÌåµÅ嵾嵷嵰嵩嵢嵛嵔åµåµ†åµåµxåµqåµjåµcåµ\åµUåµNåµGåµ@åµ9åµ2åµ+åµ$åµåµåµåµåµåµúäµóäµìäµåäµÞäµ×äµÐäµÉäµÂ䵻䵴䵭䵦䵟䵘䵑䵊䵃äµ|äµuäµnäµgäµ`äµYäµRäµKäµDäµ=äµ6äµ/äµ(äµ!äµäµäµ äµäµþãµ÷ãµðãµéãµâãµÛãµÔãµÍãµÆãµ¿ãµ¸ãµ±ãµªãµ£ãµœãµ•ãµŽãµ‡ãµ€ãµyãµrãµkãµdãµ]ãµVãµOãµHãµAãµ:ãµ3ãµ,ãµ%ãµãµãµãµ ãµãµûâµôâµíâµæâµßâµØâµÑâµÊâµÃ⵼⵵⵮ⵧⵠⵙⵒⵋⵄâµ}âµvâµoâµhâµaâµZâµSâµLâµEâµ>âµ7âµ0âµ)âµ"âµâµâµ âµâµÿáµøáµñáµêáµãáµÜáµÕáµÎáµÇáµÀᵹᵲᵫᵤáµáµ–áµáµˆáµáµzáµsáµláµeáµ^áµWáµPáµIáµBáµ;áµ4áµ-áµ&áµáµáµáµ áµáµüàµõàµîàµçàµààµÙàµÒàµËàµÄൽ൶൯൨ൡ൚൓ൌ൅àµ~àµwàµpàµiàµbàµ[àµTàµMàµFàµ?àµ8àµ1àµ*àµ#àµàµàµàµàµàµùßµòßµëßµäßµÝßµÖßµÏßµÈßµÁßµºßµ³ßµ¬ßµ¥ßµžßµ—ߵߵ‰ßµ‚ßµ{ßµtßµmßµfßµ_ßµXßµQßµJßµCßµ<ßµ5ßµ.ßµ'ßµ ߵߵߵ ߵߵýÞµöÞµïÞµèÞµáÞµÚÞµÓÞµÌÞµÅÞµ¾Þµ·Þµ°Þµ©Þµ¢Þµ›Þµ”ÞµÞµ†ÞµÞµxÞµqÞµjÞµcÞµ\ÞµUÞµNÞµGÞµ@Þµ9Þµ2Þµ+Þµ$ÞµÞµÞµÞµÞµÞµúݵóݵìݵåݵÞݵ×ݵÐݵÉݵÂݵ»Ýµ´Ýµ­Ýµ¦ÝµŸÝµ˜Ýµ‘ݵŠÝµƒÝµ|ݵuݵnݵgݵ`ݵYݵRݵKݵDݵ=ݵ6ݵ/ݵ(ݵ!ݵݵݵ ݵݵþܵ÷ܵðܵéܵâܵÛܵÔܵÍܵÆÜµ¿Üµ¸Üµ±ÜµªÜµ£ÜµœÜµ•ܵŽÜµ‡Üµ€Üµyܵrܵkܵdܵ]ܵVܵOܵHܵAܵ:ܵ3ܵ,ܵ%ܵܵܵܵ ܵܵûÛµôÛµíÛµæÛµßÛµØÛµÑÛµÊÛµÃÛµ¼ÛµµÛµ®Ûµ§Ûµ Ûµ™Ûµ’Ûµ‹Ûµ„Ûµ}ÛµvÛµoÛµhÛµaÛµZÛµSÛµLÛµEÛµ>Ûµ7Ûµ0Ûµ)Ûµ"ÛµÛµÛµ ÛµÛµÿÚµøÚµñÚµêÚµãÚµÜÚµÕÚµÎÚµÇÚµÀÚµ¹Úµ²Úµ«Úµ¤ÚµÚµ–ÚµÚµˆÚµÚµzÚµsÚµlÚµeÚµ^ÚµWÚµPÚµIÚµBÚµ;Úµ4Úµ-Úµ&ÚµÚµÚµÚµ ÚµÚµüÙµõÙµîÙµçÙµàÙµÙÙµÒÙµËÙµÄÙµ½Ùµ¶Ùµ¯Ùµ¨Ùµ¡ÙµšÙµ“ÙµŒÙµ…Ùµ~ÙµwÙµpÙµiÙµbÙµ[ÙµTÙµMÙµFÙµ?Ùµ8Ùµ1Ùµ*Ùµ#ٵٵٵٵٵٵùصòصëØµ䨵ÝØµÖØµÏØµÈصÁصºØµ³Øµ¬Øµ¥ØµžØµ—صص‰Øµ‚ص{صtصmصfص_صXصQصJصCص<ص5ص.ص'ص صصص صصý×µö×µï×µè×µá×µÚ×µÓ×µÌ×µÅ×µ¾×µ·×µ°×µ©×µ¢×µ›×µ”×µ×µ†×µ×µx×µq×µj×µc×µ\×µU×µN×µG×µ@×µ9×µ2×µ+×µ$×µ×µ×µ×µ×µ×µúÖµóÖµìÖµåÖµÞÖµ×ÖµÐÖµÉÖµÂÖµ»Öµ´Öµ­Öµ¦ÖµŸÖµ˜Öµ‘ÖµŠÖµƒÖµ|ÖµuÖµnÖµgÖµ`ÖµYÖµRÖµKÖµDÖµ=Öµ6Öµ/Öµ(Öµ!ÖµÖµÖµ ÖµÖµþÕµ÷ÕµðÕµéÕµâÕµÛÕµÔÕµÍÕµÆÕµ¿Õµ¸Õµ±ÕµªÕµ£ÕµœÕµ•ÕµŽÕµ‡Õµ€ÕµyÕµrÕµkÕµdÕµ]ÕµVÕµOÕµHÕµAÕµ:Õµ3Õµ,Õµ%ÕµÕµÕµÕµ ÕµÕµûÔµôÔµíÔµæÔµßÔµØÔµÑÔµÊÔµÃÔµ¼ÔµµÔµ®Ôµ§Ôµ Ôµ™Ôµ’Ôµ‹Ôµ„Ôµ}ÔµvÔµoÔµhÔµaÔµZÔµSÔµLÔµEÔµ>Ôµ7Ôµ0Ôµ)Ôµ"ÔµÔµÔµ ÔµÔµÿÓµøÓµñÓµêÓµãÓµÜÓµÕÓµÎÓµÇÓµÀÓµ¹Óµ²Óµ«Óµ¤ÓµÓµ–ÓµÓµˆÓµÓµzÓµsÓµlÓµeÓµ^ÓµWÓµPÓµIÓµBÓµ;Óµ4Óµ-Óµ&ÓµÓµÓµÓµ ÓµÓµüÒµõÒµîÒµçÒµàÒµÙÒµÒÒµËÒµÄÒµ½Òµ¶Òµ¯Òµ¨Òµ¡ÒµšÒµ“ÒµŒÒµ…Òµ~ÒµwÒµpÒµiÒµbÒµ[ÒµTÒµMÒµFÒµ?Òµ8Òµ1Òµ*Òµ#ÒµÒµÒµÒµÒµÒµùѵòѵëѵäѵÝѵÖѵÏѵÈѵÁѵºÑµ³Ñµ¬Ñµ¥ÑµžÑµ—ѵѵ‰Ñµ‚ѵ{ѵtѵmѵfѵ_ѵXѵQѵJѵCѵ<ѵ5ѵ.ѵ'ѵ ѵѵѵ ѵѵýеöеïеèеáеÚеÓеÌеÅе¾Ðµ·Ðµ°Ðµ©Ðµ¢Ðµ›Ðµ”ее†Ðµеxеqеjеcе\еUеNеGе@е9е2е+е$ееееееúϵóϵìϵåϵÞϵ×ϵÐϵÉϵÂϵ»Ïµ´Ïµ­Ïµ¦ÏµŸÏµ˜Ïµ‘ϵŠÏµƒÏµ|ϵuϵnϵgϵ`ϵYϵRϵKϵDϵ=ϵ6ϵ/ϵ(ϵ!ϵϵϵ ϵϵþε÷εðεéεâεÛεÔεÍεÆÎµ¿Îµ¸Îµ±ÎµªÎµ£ÎµœÎµ•εŽÎµ‡Îµ€Îµyεrεkεdε]εVεOεHεAε:ε3ε,ε%εεεε εεû͵ô͵í͵æÍµß͵ØÍµÑ͵Ê͵Ã͵¼ÍµµÍµ®Íµ§Íµ Íµ™Íµ’͵‹Íµ„͵}͵v͵o͵h͵a͵Z͵S͵L͵E͵>͵7͵0͵)͵"͵͵͵ ͵͵ÿ̵øÌµñ̵ê̵ã̵Ü̵Õ̵Î̵Ç̵À̵¹Ìµ²Ìµ«Ìµ¤Ìµ̵–̵̵ˆÌµ̵z̵s̵l̵e̵^̵W̵P̵I̵B̵;̵4̵-̵&̵̵̵̵ ̵̵ü˵õ˵î˵ç˵à˵Ù˵Ò˵Ë˵Ä˵½Ëµ¶Ëµ¯Ëµ¨Ëµ¡ËµšËµ“˵ŒËµ…˵~˵w˵p˵i˵b˵[˵T˵M˵F˵?˵8˵1˵*˵#˵˵˵˵˵˵ùʵòʵëʵäʵÝʵÖʵÏʵÈʵÁʵºÊµ³Êµ¬Êµ¥ÊµžÊµ—ʵʵ‰Êµ‚ʵ{ʵtʵmʵfʵ_ʵXʵQʵJʵCʵ<ʵ5ʵ.ʵ'ʵ ʵʵʵ ʵʵýɵöɵïɵèɵáɵÚɵÓɵÌɵÅɵ¾Éµ·Éµ°Éµ©Éµ¢Éµ›Éµ”ɵɵ†Éµɵxɵqɵjɵcɵ\ɵUɵNɵGɵ@ɵ9ɵ2ɵ+ɵ$ɵɵɵɵɵɵúȵóȵìȵåȵÞȵ×ȵÐȵÉȵÂȵ»Èµ´Èµ­Èµ¦ÈµŸÈµ˜Èµ‘ȵŠÈµƒÈµ|ȵuȵnȵgȵ`ȵYȵRȵKȵDȵ=ȵ6ȵ/ȵ(ȵ!ȵȵȵ ȵȵþǵ÷ǵðǵéǵâǵÛǵÔǵÍǵÆÇµ¿Çµ¸Çµ±ÇµªÇµ£ÇµœÇµ•ǵŽÇµ‡Çµ€Çµyǵrǵkǵdǵ]ǵVǵOǵHǵAǵ:ǵ3ǵ,ǵ%ǵǵǵǵ ǵǵûƵôƵíÆµæÆµ߯µØÆµÑÆµÊÆµÃƵ¼ÆµµÆµ®Æµ§Æµ Æµ™Æµ’Ƶ‹Æµ„Ƶ}ƵvƵoƵhƵaƵZƵSƵLƵEƵ>Ƶ7Ƶ0Ƶ)Ƶ"ƵƵƵ ƵƵÿŵøÅµñŵêŵãŵÜŵÕŵÎŵÇŵÀŵ¹Åµ²Åµ«Åµ¤Åµŵ–ŵŵˆÅµŵzŵsŵlŵeŵ^ŵWŵPŵIŵBŵ;ŵ4ŵ-ŵ&ŵŵŵŵ ŵŵüĵõĵîĵçĵàĵÙĵÒĵËĵÄĵ½Äµ¶Äµ¯Äµ¨Äµ¡ÄµšÄµ“ĵŒÄµ…ĵ~ĵwĵpĵiĵbĵ[ĵTĵMĵFĵ?ĵ8ĵ1ĵ*ĵ#ĵĵĵĵĵĵùõòõëõäõÝõÖõÏõÈõÁõºÃµ³Ãµ¬Ãµ¥ÃµžÃµ—õõ‰Ãµ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýµöµïµèµáµÚµÓµ̵ŵ¾Âµ·Âµ°Âµ©Âµ¢Âµ›Âµ”µµ†Âµµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµúÁµóÁµìÁµåÁµÞÁµ×ÁµÐÁµÉÁµÂÁµ»Áµ´Áµ­Áµ¦ÁµŸÁµ˜Áµ‘ÁµŠÁµƒÁµ|ÁµuÁµnÁµgÁµ`ÁµYÁµRÁµKÁµDÁµ=Áµ6Áµ/Áµ(Áµ!ÁµÁµÁµ ÁµÁµþÀµ÷ÀµðÀµéÀµâÀµÛÀµÔÀµÍÀµÆÀµ¿Àµ¸Àµ±ÀµªÀµ£ÀµœÀµ•ÀµŽÀµ‡Àµ€ÀµyÀµrÀµkÀµdÀµ]ÀµVÀµOÀµHÀµAÀµ:Àµ3Àµ,Àµ%ÀµÀµÀµÀµ ÀµÀµû¿µô¿µí¿µ濵ß¿µØ¿µÑ¿µÊ¿µÿµ¼¿µµ¿µ®¿µ§¿µ ¿µ™¿µ’¿µ‹¿µ„¿µ}¿µv¿µo¿µh¿µa¿µZ¿µS¿µL¿µE¿µ>¿µ7¿µ0¿µ)¿µ"¿µ¿µ¿µ ¿µ¿µÿ¾µø¾µñ¾µê¾µã¾µܾµÕ¾µξµǾµÀ¾µ¹¾µ²¾µ«¾µ¤¾µ¾µ–¾µ¾µˆ¾µ¾µz¾µs¾µl¾µe¾µ^¾µW¾µP¾µI¾µB¾µ;¾µ4¾µ-¾µ&¾µ¾µ¾µ¾µ ¾µ¾µü½µõ½µî½µç½µཱུÙ½µÒ½µ˽µĽµ½½µ¶½µ¯½µ¨½µ¡½µš½µ“½µŒ½µ…½µ~½µw½µp½µi½µb½µ[½µT½µM½µF½µ?½µ8½µ1½µ*½µ#½µ½µ½µ½µ½µ½µù¼µò¼µë¼µä¼µݼµÖ¼µϼµȼµÁ¼µº¼µ³¼µ¬¼µ¥¼µž¼µ—¼µ¼µ‰¼µ‚¼µ{¼µt¼µm¼µf¼µ_¼µX¼µQ¼µJ¼µC¼µ<¼µ5¼µ.¼µ'¼µ ¼µ¼µ¼µ ¼µ¼µý»µö»µﻵ軵ỵÚ»µÓ»µÌ»µÅ»µ¾»µ·»µ°»µ©»µ¢»µ›»µ”»µ»µ†»µ»µx»µq»µj»µc»µ\»µU»µN»µG»µ@»µ9»µ2»µ+»µ$»µ»µ»µ»µ»µ»µúºµóºµ캵庵Þºµ׺µкµɺµºµ»ºµ´ºµ­ºµ¦ºµŸºµ˜ºµ‘ºµŠºµƒºµ|ºµuºµnºµgºµ`ºµYºµRºµKºµDºµ=ºµ6ºµ/ºµ(ºµ!ºµºµºµ ºµºµþ¹µ÷¹µð¹µé¹µâ¹µÛ¹µÔ¹µ͹µƹµ¿¹µ¸¹µ±¹µª¹µ£¹µœ¹µ•¹µ޹µ‡¹µ€¹µy¹µr¹µk¹µd¹µ]¹µV¹µO¹µH¹µA¹µ:¹µ3¹µ,¹µ%¹µ¹µ¹µ¹µ ¹µ¹µû¸µô¸µí¸µ渵߸µظµѸµʸµøµ¼¸µµ¸µ®¸µ§¸µ ¸µ™¸µ’¸µ‹¸µ„¸µ}¸µv¸µo¸µh¸µa¸µZ¸µS¸µL¸µE¸µ>¸µ7¸µ0¸µ)¸µ"¸µ¸µ¸µ ¸µ¸µÿ·µø·µñ·µê·µã·µÜ·µÕ·µηµÇ·µÀ·µ¹·µ²·µ«·µ¤·µ·µ–·µ·µˆ·µ·µz·µs·µl·µe·µ^·µW·µP·µI·µB·µ;·µ4·µ-·µ&·µ·µ·µ·µ ·µ·µü¶µõ¶µî¶µç¶µà¶µÙ¶µÒ¶µ˶µ͵½¶µ¶¶µ¯¶µ¨¶µ¡¶µš¶µ“¶µŒ¶µ…¶µ~¶µw¶µp¶µi¶µb¶µ[¶µT¶µM¶µF¶µ?¶µ8¶µ1¶µ*¶µ#¶µ¶µ¶µ¶µ¶µ¶µùµµòµµëµµäµµݵµÖµµϵµȵµÁµµºµµ³µµ¬µµ¥µµžµµ—µµµµ‰µµ‚µµ{µµtµµmµµfµµ_µµXµµQµµJµµCµµ<µµ5µµ.µµ'µµ µµµµµµ µµµµý´µö´µï´µè´µá´µÚ´µÓ´µÌ´µÅ´µ¾´µ·´µ°´µ©´µ¢´µ›´µ”´µ´µ†´µ´µx´µq´µj´µc´µ\´µU´µN´µG´µ@´µ9´µ2´µ+´µ$´µ´µ´µ´µ´µ´µú³µó³µì³µå³µÞ³µ׳µгµɳµ³µ»³µ´³µ­³µ¦³µŸ³µ˜³µ‘³µгµƒ³µ|³µu³µn³µg³µ`³µY³µR³µK³µD³µ=³µ6³µ/³µ(³µ!³µ³µ³µ ³µ³µþ²µ÷²µð²µé²µâ²µÛ²µÔ²µͲµƲµ¿²µ¸²µ±²µª²µ£²µœ²µ•²µ޲µ‡²µ€²µy²µr²µk²µd²µ]²µV²µO²µH²µA²µ:²µ3²µ,²µ%²µ²µ²µ²µ ²µ²µû±µô±µí±µæ±µß±µرµѱµʱµñµ¼±µµ±µ®±µ§±µ ±µ™±µ’±µ‹±µ„±µ}±µv±µo±µh±µa±µZ±µS±µL±µE±µ>±µ7±µ0±µ)±µ"±µ±µ±µ ±µ±µÿ°µø°µñ°µê°µã°µܰµÕ°µΰµǰµÀ°µ¹°µ²°µ«°µ¤°µ°µ–°µ°µˆ°µ°µz°µs°µl°µe°µ^°µW°µP°µI°µB°µ;°µ4°µ-°µ&°µ°µ°µ°µ °µ°µü¯µõ¯µ篵௵Ù¯µÒ¯µ˯µįµ½¯µ¶¯µ¯¯µ¨¯µ¡¯µš¯µ“¯µŒ¯µ…¯µ~¯µw¯µp¯µi¯µb¯µ[¯µT¯µM¯µF¯µ?¯µ8¯µ1¯µ*¯µ#¯µ¯µ¯µ¯µ¯µ¯µù®µò®µ뮵䮵Ý®µÖ®µÏ®µÈ®µÁ®µº®µ³®µ¬®µ¥®µž®µ—®µ®µ‰®µ‚®µ{®µt®µm®µf®µ_®µX®µQ®µJ®µC®µ<®µ5®µ.®µ'®µ ®µ®µ®µ ®µ®µý­µö­µï­µè­µá­µÚ­µÓ­µÌ­µÅ­µ¾­µ·­µ°­µ©­µ¢­µ›­µ”­µ­µ†­µ­µx­µq­µj­µc­µ\­µU­µN­µG­µ@­µ9­µ2­µ+­µ$­µ­µ­µ­µ­µ­µú¬µó¬µ쬵嬵Þ¬µ׬µЬµɬµ¬µ»¬µ´¬µ­¬µ¦¬µŸ¬µ˜¬µ‘¬µЬµƒ¬µ|¬µu¬µn¬µg¬µ`¬µY¬µR¬µK¬µD¬µ=¬µ6¬µ/¬µ(¬µ!¬µ¬µ¬µ ¬µ¬µþ«µ÷«µð«µ髵⫵Û«µÔ«µÍ«µÆ«µ¿«µ¸«µ±«µª«µ£«µœ«µ•«µŽ«µ‡«µ€«µy«µr«µk«µd«µ]«µV«µO«µH«µA«µ:«µ3«µ,«µ%«µ«µ«µ«µ «µ«µûªµôªµíªµ檵ߪµتµѪµʪµêµ¼ªµµªµ®ªµ§ªµ ªµ™ªµ’ªµ‹ªµ„ªµ}ªµvªµoªµhªµaªµZªµSªµLªµEªµ>ªµ7ªµ0ªµ)ªµ"ªµªµªµ ªµªµÿ©µø©µñ©µꩵ㩵Ü©µÕ©µΩµÇ©µÀ©µ¹©µ²©µ«©µ¤©µ©µ–©µ©µˆ©µ©µz©µs©µl©µe©µ^©µW©µP©µI©µB©µ;©µ4©µ-©µ&©µ©µ©µ©µ ©µ©µü¨µõ¨µ稵ਵÙ¨µÒ¨µ˨µĨµ½¨µ¶¨µ¯¨µ¨¨µ¡¨µš¨µ“¨µŒ¨µ…¨µ~¨µw¨µp¨µi¨µb¨µ[¨µT¨µM¨µF¨µ?¨µ8¨µ1¨µ*¨µ#¨µ¨µ¨µ¨µ¨µ¨µù§µò§µë§µä§µݧµÖ§µϧµȧµÁ§µº§µ³§µ¬§µ¥§µž§µ—§µ§µ‰§µ‚§µ{§µt§µm§µf§µ_§µX§µQ§µJ§µC§µ<§µ5§µ.§µ'§µ §µ§µ§µ §µ§µý¦µö¦µ例覵ᦵÚ¦µÓ¦µ̦µŦµ¾¦µ·¦µ°¦µ©¦µ¢¦µ›¦µ”¦µ¦µ†¦µ¦µx¦µq¦µj¦µc¦µ\¦µU¦µN¦µG¦µ@¦µ9¦µ2¦µ+¦µ$¦µ¦µ¦µ¦µ¦µ¦µú¥µó¥µ쥵奵Þ¥µ×¥µÐ¥µÉ¥µÂ¥µ»¥µ´¥µ­¥µ¦¥µŸ¥µ˜¥µ‘¥µŠ¥µƒ¥µ|¥µu¥µn¥µg¥µ`¥µY¥µR¥µK¥µD¥µ=¥µ6¥µ/¥µ(¥µ!¥µ¥µ¥µ ¥µ¥µþ¤µ÷¤µð¤µ餵⤵Û¤µÔ¤µͤµƤµ¿¤µ¸¤µ±¤µª¤µ£¤µœ¤µ•¤µޤµ‡¤µ€¤µy¤µr¤µk¤µd¤µ]¤µV¤µO¤µH¤µA¤µ:¤µ3¤µ,¤µ%¤µ¤µ¤µ¤µ ¤µ¤µû£µô£µí£µ棵ߣµØ£µÑ£µÊ£µãµ¼£µµ£µ®£µ§£µ £µ™£µ’£µ‹£µ„£µ}£µv£µo£µh£µa£µZ£µS£µL£µE£µ>£µ7£µ0£µ)£µ"£µ£µ£µ £µ£µÿ¢µø¢µñ¢µꢵ㢵Ü¢µÕ¢µ΢µÇ¢µÀ¢µ¹¢µ²¢µ«¢µ¤¢µ¢µ–¢µ¢µˆ¢µ¢µz¢µs¢µl¢µe¢µ^¢µW¢µP¢µI¢µB¢µ;¢µ4¢µ-¢µ&¢µ¢µ¢µ¢µ ¢µ¢µü¡µõ¡µ硵ࡵÙ¡µÒ¡µË¡µÄ¡µ½¡µ¶¡µ¯¡µ¨¡µ¡¡µš¡µ“¡µŒ¡µ…¡µ~¡µw¡µp¡µi¡µb¡µ[¡µT¡µM¡µF¡µ?¡µ8¡µ1¡µ*¡µ#¡µ¡µ¡µ¡µ¡µ¡µù µò µë µä µÝ µÖ µÏ µÈ µÁ µº µ³ µ¬ µ¥ µž µ— µ µ‰ µ‚ µ{ µt µm µf µ_ µX µQ µJ µC µ< µ5 µ. µ' µ  µ µ µ  µ µýŸµöŸµ蟵៵ÚŸµÓŸµÌŸµÅŸµ¾Ÿµ·Ÿµ°Ÿµ©Ÿµ¢Ÿµ›Ÿµ”ŸµŸµ†ŸµŸµxŸµqŸµjŸµcŸµ\ŸµUŸµNŸµGŸµ@Ÿµ9Ÿµ2Ÿµ+Ÿµ$ŸµŸµŸµŸµŸµŸµúžµóžµìžµåžµÞžµמµОµÉžµžµ»žµ´žµ­žµ¦žµŸžµ˜žµ‘žµŠžµƒžµ|žµužµnžµgžµ`žµYžµRžµKžµDžµ=žµ6žµ/žµ(žµ!žµžµžµ žµžµþµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµûœµôœµ휵朵ßœµØœµÑœµÊœµܵ¼œµµœµ®œµ§œµ œµ™œµ’œµ‹œµ„œµ}œµvœµoœµhœµaœµZœµSœµLœµEœµ>œµ7œµ0œµ)œµ"œµœµœµ œµœµÿ›µø›µñ›µ꛵㛵Ü›µÕ›µΛµÇ›µÀ›µ¹›µ²›µ«›µ¤›µ›µ–›µ›µˆ›µ›µz›µs›µl›µe›µ^›µW›µP›µI›µB›µ;›µ4›µ-›µ&›µ›µ›µ›µ ›µ›µüšµõšµîšµçšµàšµÙšµÒšµËšµÄšµ½šµ¶šµ¯šµ¨šµ¡šµššµ“šµŒšµ…šµ~šµwšµpšµišµbšµ[šµTšµMšµFšµ?šµ8šµ1šµ*šµ#šµšµšµšµšµšµù™µò™µ뙵䙵Ý™µÖ™µÏ™µÈ™µÁ™µº™µ³™µ¬™µ¥™µž™µ—™µ™µ‰™µ‚™µ{™µt™µm™µf™µ_™µX™µQ™µJ™µC™µ<™µ5™µ.™µ'™µ ™µ™µ™µ ™µ™µý˜µö˜µ蘵ᘵÚ˜µÓ˜µ̘µص¾˜µ·˜µ°˜µ©˜µ¢˜µ›˜µ”˜µ˜µ†˜µ˜µx˜µq˜µj˜µc˜µ\˜µU˜µN˜µG˜µ@˜µ9˜µ2˜µ+˜µ$˜µ˜µ˜µ˜µ˜µ˜µú—µó—µì—µå—µÞ—µ×—µЗµÉ—µ—µ»—µ´—µ­—µ¦—µŸ—µ˜—µ‘—µŠ—µƒ—µ|—µu—µn—µg—µ`—µY—µR—µK—µD—µ=—µ6—µ/—µ(—µ!—µ—µ—µ —µ—µþ–µ÷–µð–µé–µâ–µÛ–µÔ–µÍ–µÆ–µ¿–µ¸–µ±–µª–µ£–µœ–µ•–µŽ–µ‡–µ€–µy–µr–µk–µd–µ]–µV–µO–µH–µA–µ:–µ3–µ,–µ%–µ–µ–µ–µ –µ–µû•µô•µ핵敵ß•µØ•µÑ•µÊ•µÕµ¼•µµ•µ®•µ§•µ •µ™•µ’•µ‹•µ„•µ}•µv•µo•µh•µa•µZ•µS•µL•µE•µ>•µ7•µ0•µ)•µ"•µ•µ•µ •µ•µÿ”µø”µñ”µꔵ㔵Ü”µÕ”µΔµÇ”µÀ”µ¹”µ²”µ«”µ¤”µ”µ–”µ”µˆ”µ”µz”µs”µl”µe”µ^”µW”µP”µI”µB”µ;”µ4”µ-”µ&”µ”µ”µ”µ ”µ”µü“µõ“µ瓵à“µÙ“µÒ“µË“µÄ“µ½“µ¶“µ¯“µ¨“µ¡“µš“µ““µŒ“µ…“µ~“µw“µp“µi“µb“µ[“µT“µM“µF“µ?“µ8“µ1“µ*“µ#“µ“µ“µ“µ“µ“µù’µò’µë’µä’µÝ’µÖ’µÏ’µÈ’µÁ’µº’µ³’µ¬’µ¥’µž’µ—’µ’µ‰’µ‚’µ{’µt’µm’µf’µ_’µX’µQ’µJ’µC’µ<’µ5’µ.’µ'’µ ’µ’µ’µ ’µ’µý‘µö‘µ葵ᑵÚ‘µÓ‘µÌ‘µÅ‘µ¾‘µ·‘µ°‘µ©‘µ¢‘µ›‘µ”‘µ‘µ†‘µ‘µx‘µq‘µj‘µc‘µ\‘µU‘µN‘µG‘µ@‘µ9‘µ2‘µ+‘µ$‘µ‘µ‘µ‘µ‘µ‘µúµóµìµåµÞµ×µеɵµ»µ´µ­µ¦µŸµ˜µ‘µеƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû޵ô޵펵掵ߎµØŽµÑŽµÊŽµÃ޵¼ŽµµŽµ®Žµ§Žµ Žµ™Žµ’޵‹Žµ„޵}޵v޵o޵h޵a޵Z޵S޵L޵E޵>޵7޵0޵)޵"޵޵޵ ޵޵ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüŒµõŒµ猵àŒµÙŒµÒŒµËŒµÄŒµ½Œµ¶Œµ¯Œµ¨Œµ¡ŒµšŒµ“ŒµŒŒµ…Œµ~ŒµwŒµpŒµiŒµbŒµ[ŒµTŒµMŒµFŒµ?Œµ8Œµ1Œµ*Œµ#ŒµŒµŒµŒµŒµŒµù‹µò‹µ답䋵Ý‹µÖ‹µÏ‹µÈ‹µÁ‹µº‹µ³‹µ¬‹µ¥‹µž‹µ—‹µ‹µ‰‹µ‚‹µ{‹µt‹µm‹µf‹µ_‹µX‹µQ‹µJ‹µC‹µ<‹µ5‹µ.‹µ'‹µ ‹µ‹µ‹µ ‹µ‹µýеöе芵ኵÚŠµÓŠµÌŠµÅе¾Šµ·Šµ°Šµ©Šµ¢Šµ›Šµ”ее†Šµеxеqеjеcе\еUеNеGе@е9е2е+е$ееееееú‰µó‰µ쉵創Þ‰µ׉µЉµɉµ‰µ»‰µ´‰µ­‰µ¦‰µŸ‰µ˜‰µ‘‰µЉµƒ‰µ|‰µu‰µn‰µg‰µ`‰µY‰µR‰µK‰µD‰µ=‰µ6‰µ/‰µ(‰µ!‰µ‰µ‰µ ‰µ‰µþˆµ÷ˆµðˆµ鈵∵ÛˆµÔˆµ͈µƈµ¿ˆµ¸ˆµ±ˆµªˆµ£ˆµœˆµ•ˆµŽˆµ‡ˆµ€ˆµyˆµrˆµkˆµdˆµ]ˆµVˆµOˆµHˆµAˆµ:ˆµ3ˆµ,ˆµ%ˆµˆµˆµˆµ ˆµˆµû‡µô‡µ퇵懵߇µ؇µчµʇµǵ¼‡µµ‡µ®‡µ§‡µ ‡µ™‡µ’‡µ‹‡µ„‡µ}‡µv‡µo‡µh‡µa‡µZ‡µS‡µL‡µE‡µ>‡µ7‡µ0‡µ)‡µ"‡µ‡µ‡µ ‡µ‡µÿ†µø†µñ†µꆵㆵ܆µÕ†µΆµdžµÀ†µ¹†µ²†µ«†µ¤†µ†µ–†µ†µˆ†µ†µz†µs†µl†µe†µ^†µW†µP†µI†µB†µ;†µ4†µ-†µ&†µ†µ†µ†µ †µ†µü…µõ…µî…µç…µà…µÙ…µÒ…µË…µÄ…µ½…µ¶…µ¯…µ¨…µ¡…µš…µ“…µŒ…µ……µ~…µw…µp…µi…µb…µ[…µT…µM…µF…µ?…µ8…µ1…µ*…µ#…µ…µ…µ…µ…µ…µù„µò„µ넵䄵Ý„µÖ„µÏ„µÈ„µÁ„µº„µ³„µ¬„µ¥„µž„µ—„µ„µ‰„µ‚„µ{„µt„µm„µf„µ_„µX„µQ„µJ„µC„µ<„µ5„µ.„µ'„µ „µ„µ„µ „µ„µýƒµöƒµ胵ჵÚƒµÓƒµ̃µѵ¾ƒµ·ƒµ°ƒµ©ƒµ¢ƒµ›ƒµ”ƒµƒµ†ƒµƒµxƒµqƒµjƒµcƒµ\ƒµUƒµNƒµGƒµ@ƒµ9ƒµ2ƒµ+ƒµ$ƒµƒµƒµƒµƒµƒµú‚µó‚µ삵債Þ‚µׂµЂµÉ‚µ‚µ»‚µ´‚µ­‚µ¦‚µŸ‚µ˜‚µ‘‚µŠ‚µƒ‚µ|‚µu‚µn‚µg‚µ`‚µY‚µR‚µK‚µD‚µ=‚µ6‚µ/‚µ(‚µ!‚µ‚µ‚µ ‚µ‚µþµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû€µô€µ퀵怵߀µØ€µÑ€µÊ€µÀµ¼€µµ€µ®€µ§€µ €µ™€µ’€µ‹€µ„€µ}€µv€µo€µh€µa€µZ€µS€µL€µE€µ>€µ7€µ0€µ)€µ"€µ€µ€µ €µ€µÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü~µõ~µî~µç~µà~µÙ~µÒ~µË~µÄ~µ½~µ¶~µ¯~µ¨~µ¡~µš~µ“~µŒ~µ…~µ~~µw~µp~µi~µb~µ[~µT~µM~µF~µ?~µ8~µ1~µ*~µ#~µ~µ~µ~µ~µ~µù}µò}µë}µä}µÝ}µÖ}µÏ}µÈ}µÁ}µº}µ³}µ¬}µ¥}µž}µ—}µ}µ‰}µ‚}µ{}µt}µm}µf}µ_}µX}µQ}µJ}µC}µ<}µ5}µ.}µ'}µ }µ}µ}µ }µ}µý|µö|µï|µè|µá|µÚ|µÓ|µÌ|µÅ|µ¾|µ·|µ°|µ©|µ¢|µ›|µ”|µ|µ†|µ|µx|µq|µj|µc|µ\|µU|µN|µG|µ@|µ9|µ2|µ+|µ$|µ|µ|µ|µ|µ|µú{µó{µì{µå{µÞ{µ×{µÐ{µÉ{µÂ{µ»{µ´{µ­{µ¦{µŸ{µ˜{µ‘{µŠ{µƒ{µ|{µu{µn{µg{µ`{µY{µR{µK{µD{µ={µ6{µ/{µ({µ!{µ{µ{µ {µ{µþzµ÷zµðzµézµâzµÛzµÔzµÍzµÆzµ¿zµ¸zµ±zµªzµ£zµœzµ•zµŽzµ‡zµ€zµyzµrzµkzµdzµ]zµVzµOzµHzµAzµ:zµ3zµ,zµ%zµzµzµzµ zµzµûyµôyµíyµæyµßyµØyµÑyµÊyµÃyµ¼yµµyµ®yµ§yµ yµ™yµ’yµ‹yµ„yµ}yµvyµoyµhyµayµZyµSyµLyµEyµ>yµ7yµ0yµ)yµ"yµyµyµ yµyµÿxµøxµñxµêxµãxµÜxµÕxµÎxµÇxµÀxµ¹xµ²xµ«xµ¤xµxµ–xµxµˆxµxµzxµsxµlxµexµ^xµWxµPxµIxµBxµ;xµ4xµ-xµ&xµxµxµxµ xµxµüwµõwµîwµçwµàwµÙwµÒwµËwµÄwµ½wµ¶wµ¯wµ¨wµ¡wµšwµ“wµŒwµ…wµ~wµwwµpwµiwµbwµ[wµTwµMwµFwµ?wµ8wµ1wµ*wµ#wµwµwµwµwµwµùvµòvµëvµävµÝvµÖvµÏvµÈvµÁvµºvµ³vµ¬vµ¥vµžvµ—vµvµ‰vµ‚vµ{vµtvµmvµfvµ_vµXvµQvµJvµCvµrµ7rµ0rµ)rµ"rµrµrµ rµrµÿqµøqµñqµêqµãqµÜqµÕqµÎqµÇqµÀqµ¹qµ²qµ«qµ¤qµqµ–qµqµˆqµqµzqµsqµlqµeqµ^qµWqµPqµIqµBqµ;qµ4qµ-qµ&qµqµqµqµ qµqµüpµõpµîpµçpµàpµÙpµÒpµËpµÄpµ½pµ¶pµ¯pµ¨pµ¡pµšpµ“pµŒpµ…pµ~pµwpµppµipµbpµ[pµTpµMpµFpµ?pµ8pµ1pµ*pµ#pµpµpµpµpµpµùoµòoµëoµäoµÝoµÖoµÏoµÈoµÁoµºoµ³oµ¬oµ¥oµžoµ—oµoµ‰oµ‚oµ{oµtoµmoµfoµ_oµXoµQoµJoµCoµkµ7kµ0kµ)kµ"kµkµkµ kµkµÿjµøjµñjµêjµãjµÜjµÕjµÎjµÇjµÀjµ¹jµ²jµ«jµ¤jµjµ–jµjµˆjµjµzjµsjµljµejµ^jµWjµPjµIjµBjµ;jµ4jµ-jµ&jµjµjµjµ jµjµüiµõiµîiµçiµàiµÙiµÒiµËiµÄiµ½iµ¶iµ¯iµ¨iµ¡iµšiµ“iµŒiµ…iµ~iµwiµpiµiiµbiµ[iµTiµMiµFiµ?iµ8iµ1iµ*iµ#iµiµiµiµiµiµùhµòhµëhµähµÝhµÖhµÏhµÈhµÁhµºhµ³hµ¬hµ¥hµžhµ—hµhµ‰hµ‚hµ{hµthµmhµfhµ_hµXhµQhµJhµChµdµ7dµ0dµ)dµ"dµdµdµ dµdµÿcµøcµñcµêcµãcµÜcµÕcµÎcµÇcµÀcµ¹cµ²cµ«cµ¤cµcµ–cµcµˆcµcµzcµscµlcµecµ^cµWcµPcµIcµBcµ;cµ4cµ-cµ&cµcµcµcµ cµcµübµõbµîbµçbµàbµÙbµÒbµËbµÄbµ½bµ¶bµ¯bµ¨bµ¡bµšbµ“bµŒbµ…bµ~bµwbµpbµibµbbµ[bµTbµMbµFbµ?bµ8bµ1bµ*bµ#bµbµbµbµbµbµùaµòaµëaµäaµÝaµÖaµÏaµÈaµÁaµºaµ³aµ¬aµ¥aµžaµ—aµaµ‰aµ‚aµ{aµtaµmaµfaµ_aµXaµQaµJaµCaµ]µ7]µ0]µ)]µ"]µ]µ]µ ]µ]µÿ\µø\µñ\µê\µã\µÜ\µÕ\µÎ\µÇ\µÀ\µ¹\µ²\µ«\µ¤\µ\µ–\µ\µˆ\µ\µz\µs\µl\µe\µ^\µW\µP\µI\µB\µ;\µ4\µ-\µ&\µ\µ\µ\µ \µ\µü[µõ[µî[µç[µà[µÙ[µÒ[µË[µÄ[µ½[µ¶[µ¯[µ¨[µ¡[µš[µ“[µŒ[µ…[µ~[µw[µp[µi[µb[µ[[µT[µM[µF[µ?[µ8[µ1[µ*[µ#[µ[µ[µ[µ[µ[µùZµòZµëZµäZµÝZµÖZµÏZµÈZµÁZµºZµ³Zµ¬Zµ¥ZµžZµ—ZµZµ‰Zµ‚Zµ{ZµtZµmZµfZµ_ZµXZµQZµJZµCZµVµ7Vµ0Vµ)Vµ"VµVµVµ VµVµÿUµøUµñUµêUµãUµÜUµÕUµÎUµÇUµÀUµ¹Uµ²Uµ«Uµ¤UµUµ–UµUµˆUµUµzUµsUµlUµeUµ^UµWUµPUµIUµBUµ;Uµ4Uµ-Uµ&UµUµUµUµ UµUµüTµõTµîTµçTµàTµÙTµÒTµËTµÄTµ½Tµ¶Tµ¯Tµ¨Tµ¡TµšTµ“TµŒTµ…Tµ~TµwTµpTµiTµbTµ[TµTTµMTµFTµ?Tµ8Tµ1Tµ*Tµ#TµTµTµTµTµTµùSµòSµëSµäSµÝSµÖSµÏSµÈSµÁSµºSµ³Sµ¬Sµ¥SµžSµ—SµSµ‰Sµ‚Sµ{SµtSµmSµfSµ_SµXSµQSµJSµCSµOµ7Oµ0Oµ)Oµ"OµOµOµ OµOµÿNµøNµñNµêNµãNµÜNµÕNµÎNµÇNµÀNµ¹Nµ²Nµ«Nµ¤NµNµ–NµNµˆNµNµzNµsNµlNµeNµ^NµWNµPNµINµBNµ;Nµ4Nµ-Nµ&NµNµNµNµ NµNµüMµõMµîMµçMµàMµÙMµÒMµËMµÄMµ½Mµ¶Mµ¯Mµ¨Mµ¡MµšMµ“MµŒMµ…Mµ~MµwMµpMµiMµbMµ[MµTMµMMµFMµ?Mµ8Mµ1Mµ*Mµ#MµMµMµMµMµMµùLµòLµëLµäLµÝLµÖLµÏLµÈLµÁLµºLµ³Lµ¬Lµ¥LµžLµ—LµLµ‰Lµ‚Lµ{LµtLµmLµfLµ_LµXLµQLµJLµCLµHµ7Hµ0Hµ)Hµ"HµHµHµ HµHµÿGµøGµñGµêGµãGµÜGµÕGµÎGµÇGµÀGµ¹Gµ²Gµ«Gµ¤GµGµ–GµGµˆGµGµzGµsGµlGµeGµ^GµWGµPGµIGµBGµ;Gµ4Gµ-Gµ&GµGµGµGµ GµGµüFµõFµîFµçFµàFµÙFµÒFµËFµÄFµ½Fµ¶Fµ¯Fµ¨Fµ¡FµšFµ“FµŒFµ…Fµ~FµwFµpFµiFµbFµ[FµTFµMFµFFµ?Fµ8Fµ1Fµ*Fµ#FµFµFµFµFµFµùEµòEµëEµäEµÝEµÖEµÏEµÈEµÁEµºEµ³Eµ¬Eµ¥EµžEµ—EµEµ‰Eµ‚Eµ{EµtEµmEµfEµ_EµXEµQEµJEµCEµAµ7Aµ0Aµ)Aµ"AµAµAµ AµAµÿ@µø@µñ@µê@µã@µÜ@µÕ@µÎ@µÇ@µÀ@µ¹@µ²@µ«@µ¤@µ@µ–@µ@µˆ@µ@µz@µs@µl@µe@µ^@µW@µP@µI@µB@µ;@µ4@µ-@µ&@µ@µ@µ@µ @µ@µü?µõ?µî?µç?µà?µÙ?µÒ?µË?µÄ?µ½?µ¶?µ¯?µ¨?µ¡?µš?µ“?µŒ?µ…?µ~?µw?µp?µi?µb?µ[?µT?µM?µF?µ??µ8?µ1?µ*?µ#?µ?µ?µ?µ?µ?µù>µò>µë>µä>µÝ>µÖ>µÏ>µÈ>µÁ>µº>µ³>µ¬>µ¥>µž>µ—>µ>µ‰>µ‚>µ{>µt>µm>µf>µ_>µX>µQ>µJ>µC>µ<>µ5>µ.>µ'>µ >µ>µ>µ >µ>µý=µö=µï=µè=µá=µÚ=µÓ=µÌ=µÅ=µ¾=µ·=µ°=µ©=µ¢=µ›=µ”=µ=µ†=µ=µx=µq=µj=µc=µ\=µU=µN=µG=µ@=µ9=µ2=µ+=µ$=µ=µ=µ=µ=µ=µú<µó<µì<µå<µÞ<µ×<µÐ<µÉ<µÂ<µ»<µ´<µ­<µ¦<µŸ<µ˜<µ‘<µŠ<µƒ<µ|<µu<µn<µg<µ`<µY<µR<µK<µD<µ=<µ6<µ/<µ(<µ!<µ<µ<µ <µ<µþ;µ÷;µð;µé;µâ;µÛ;µÔ;µÍ;µÆ;µ¿;µ¸;µ±;µª;µ£;µœ;µ•;µŽ;µ‡;µ€;µy;µr;µk;µd;µ];µV;µO;µH;µA;µ:;µ3;µ,;µ%;µ;µ;µ;µ ;µ;µû:µô:µí:µæ:µß:µØ:µÑ:µÊ:µÃ:µ¼:µµ:µ®:µ§:µ :µ™:µ’:µ‹:µ„:µ}:µv:µo:µh:µa:µZ:µS:µL:µE:µ>:µ7:µ0:µ):µ":µ:µ:µ :µ:µÿ9µø9µñ9µê9µã9µÜ9µÕ9µÎ9µÇ9µÀ9µ¹9µ²9µ«9µ¤9µ9µ–9µ9µˆ9µ9µz9µs9µl9µe9µ^9µW9µP9µI9µB9µ;9µ49µ-9µ&9µ9µ9µ9µ 9µ9µü8µõ8µî8µç8µà8µÙ8µÒ8µË8µÄ8µ½8µ¶8µ¯8µ¨8µ¡8µš8µ“8µŒ8µ…8µ~8µw8µp8µi8µb8µ[8µT8µM8µF8µ?8µ88µ18µ*8µ#8µ8µ8µ8µ8µ8µù7µò7µë7µä7µÝ7µÖ7µÏ7µÈ7µÁ7µº7µ³7µ¬7µ¥7µž7µ—7µ7µ‰7µ‚7µ{7µt7µm7µf7µ_7µX7µQ7µJ7µC7µ<7µ57µ.7µ'7µ 7µ7µ7µ 7µ7µý6µö6µï6µè6µá6µÚ6µÓ6µÌ6µÅ6µ¾6µ·6µ°6µ©6µ¢6µ›6µ”6µ6µ†6µ6µx6µq6µj6µc6µ\6µU6µN6µG6µ@6µ96µ26µ+6µ$6µ6µ6µ6µ6µ6µú5µó5µì5µå5µÞ5µ×5µÐ5µÉ5µÂ5µ»5µ´5µ­5µ¦5µŸ5µ˜5µ‘5µŠ5µƒ5µ|5µu5µn5µg5µ`5µY5µR5µK5µD5µ=5µ65µ/5µ(5µ!5µ5µ5µ 5µ5µþ4µ÷4µð4µé4µâ4µÛ4µÔ4µÍ4µÆ4µ¿4µ¸4µ±4µª4µ£4µœ4µ•4µŽ4µ‡4µ€4µy4µr4µk4µd4µ]4µV4µO4µH4µA4µ:4µ34µ,4µ%4µ4µ4µ4µ 4µ4µû3µô3µí3µæ3µß3µØ3µÑ3µÊ3µÃ3µ¼3µµ3µ®3µ§3µ 3µ™3µ’3µ‹3µ„3µ}3µv3µo3µh3µa3µZ3µS3µL3µE3µ>3µ73µ03µ)3µ"3µ3µ3µ 3µ3µÿ2µø2µñ2µê2µã2µÜ2µÕ2µÎ2µÇ2µÀ2µ¹2µ²2µ«2µ¤2µ2µ–2µ2µˆ2µ2µz2µs2µl2µe2µ^2µW2µP2µI2µB2µ;2µ42µ-2µ&2µ2µ2µ2µ 2µ2µü1µõ1µî1µç1µà1µÙ1µÒ1µË1µÄ1µ½1µ¶1µ¯1µ¨1µ¡1µš1µ“1µŒ1µ…1µ~1µw1µp1µi1µb1µ[1µT1µM1µF1µ?1µ81µ11µ*1µ#1µ1µ1µ1µ1µ1µù0µò0µë0µä0µÝ0µÖ0µÏ0µÈ0µÁ0µº0µ³0µ¬0µ¥0µž0µ—0µ0µ‰0µ‚0µ{0µt0µm0µf0µ_0µX0µQ0µJ0µC0µ<0µ50µ.0µ'0µ 0µ0µ0µ 0µ0µý/µö/µï/µè/µá/µÚ/µÓ/µÌ/µÅ/µ¾/µ·/µ°/µ©/µ¢/µ›/µ”/µ/µ†/µ/µx/µq/µj/µc/µ\/µU/µN/µG/µ@/µ9/µ2/µ+/µ$/µ/µ/µ/µ/µ/µú.µó.µì.µå.µÞ.µ×.µÐ.µÉ.µÂ.µ».µ´.µ­.µ¦.µŸ.µ˜.µ‘.µŠ.µƒ.µ|.µu.µn.µg.µ`.µY.µR.µK.µD.µ=.µ6.µ/.µ(.µ!.µ.µ.µ .µ.µþ-µ÷-µð-µé-µâ-µÛ-µÔ-µÍ-µÆ-µ¿-µ¸-µ±-µª-µ£-µœ-µ•-µŽ-µ‡-µ€-µy-µr-µk-µd-µ]-µV-µO-µH-µA-µ:-µ3-µ,-µ%-µ-µ-µ-µ -µ-µû,µô,µí,µæ,µß,µØ,µÑ,µÊ,µÃ,µ¼,µµ,µ®,µ§,µ ,µ™,µ’,µ‹,µ„,µ},µv,µo,µh,µa,µZ,µS,µL,µE,µ>,µ7,µ0,µ),µ",µ,µ,µ ,µ,µÿ+µø+µñ+µê+µã+µÜ+µÕ+µÎ+µÇ+µÀ+µ¹+µ²+µ«+µ¤+µ+µ–+µ+µˆ+µ+µz+µs+µl+µe+µ^+µW+µP+µI+µB+µ;+µ4+µ-+µ&+µ+µ+µ+µ +µ+µü*µõ*µî*µç*µà*µÙ*µÒ*µË*µÄ*µ½*µ¶*µ¯*µ¨*µ¡*µš*µ“*µŒ*µ…*µ~*µw*µp*µi*µb*µ[*µT*µM*µF*µ?*µ8*µ1*µ**µ#*µ*µ*µ*µ*µ*µù)µò)µë)µä)µÝ)µÖ)µÏ)µÈ)µÁ)µº)µ³)µ¬)µ¥)µž)µ—)µ)µ‰)µ‚)µ{)µt)µm)µf)µ_)µX)µQ)µJ)µC)µ<)µ5)µ.)µ')µ )µ)µ)µ )µ)µý(µö(µï(µè(µá(µÚ(µÓ(µÌ(µÅ(µ¾(µ·(µ°(µ©(µ¢(µ›(µ”(µ(µ†(µ(µx(µq(µj(µc(µ\(µU(µN(µG(µ@(µ9(µ2(µ+(µ$(µ(µ(µ(µ(µ(µú'µó'µì'µå'µÞ'µ×'µÐ'µÉ'µÂ'µ»'µ´'µ­'µ¦'µŸ'µ˜'µ‘'µŠ'µƒ'µ|'µu'µn'µg'µ`'µY'µR'µK'µD'µ='µ6'µ/'µ('µ!'µ'µ'µ 'µ'µþ&µ÷&µð&µé&µâ&µÛ&µÔ&µÍ&µÆ&µ¿&µ¸&µ±&µª&µ£&µœ&µ•&µŽ&µ‡&µ€&µy&µr&µk&µd&µ]&µV&µO&µH&µA&µ:&µ3&µ,&µ%&µ&µ&µ&µ &µ&µû%µô%µí%µæ%µß%µØ%µÑ%µÊ%µÃ%µ¼%µµ%µ®%µ§%µ %µ™%µ’%µ‹%µ„%µ}%µv%µo%µh%µa%µZ%µS%µL%µE%µ>%µ7%µ0%µ)%µ"%µ%µ%µ %µ%µÿ$µø$µñ$µê$µã$µÜ$µÕ$µÎ$µÇ$µÀ$µ¹$µ²$µ«$µ¤$µ$µ–$µ$µˆ$µ$µz$µs$µl$µe$µ^$µW$µP$µI$µB$µ;$µ4$µ-$µ&$µ$µ$µ$µ $µ$µü#µõ#µî#µç#µà#µÙ#µÒ#µË#µÄ#µ½#µ¶#µ¯#µ¨#µ¡#µš#µ“#µŒ#µ…#µ~#µw#µp#µi#µb#µ[#µT#µM#µF#µ?#µ8#µ1#µ*#µ##µ#µ#µ#µ#µ#µù"µò"µë"µä"µÝ"µÖ"µÏ"µÈ"µÁ"µº"µ³"µ¬"µ¥"µž"µ—"µ"µ‰"µ‚"µ{"µt"µm"µf"µ_"µX"µQ"µJ"µC"µ<"µ5"µ."µ'"µ "µ"µ"µ "µ"µý!µö!µï!µè!µá!µÚ!µÓ!µÌ!µÅ!µ¾!µ·!µ°!µ©!µ¢!µ›!µ”!µ!µ†!µ!µx!µq!µj!µc!µ\!µU!µN!µG!µ@!µ9!µ2!µ+!µ$!µ!µ!µ!µ!µ!µú µó µì µå µÞ µ× µÐ µÉ µ µ» µ´ µ­ µ¦ µŸ µ˜ µ‘ µŠ µƒ µ| µu µn µg µ` µY µR µK µD µ= µ6 µ/ µ( µ! µ µ µ µ µþµ÷µðµéµâµÛµÔµÍµÆµ¿µ¸µ±µªµ£µœµ•µŽµ‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµûµôµíµæµßµØµÑµÊµÃµ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüµõµîµçµàµÙµÒµËµÄµ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµùµòµëµäµÝµÖµÏµÈµÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµýµöµïµèµáµÚµÓµÌµÅµ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµúµóµìµåµÞµ×µÐµÉµÂµ»µ´µ­µ¦µŸµ˜µ‘µŠµƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþµ÷µðµéµâµÛµÔµÍµÆµ¿µ¸µ±µªµ£µœµ•µŽµ‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµûµôµíµæµßµØµÑµÊµÃµ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüµõµîµçµàµÙµÒµËµÄµ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµùµòµëµäµÝµÖµÏµÈµÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµýµöµïµèµáµÚµÓµÌµÅµ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµúµóµìµåµÞµ×µÐµÉµÂµ»µ´µ­µ¦µŸµ˜µ‘µŠµƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþµ÷µðµéµâµÛµÔµÍµÆµ¿µ¸µ±µªµ£µœµ•µŽµ‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµûµôµíµæµßµØµÑµÊµÃµ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüµõµîµçµàµÙµÒµËµÄµ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù µò µë µä µÝ µÖ µÏ µÈ µÁ µº µ³ µ¬ µ¥ µž µ— µ µ‰ µ‚ µ{ µt µm µf µ_ µX µQ µJ µC µ< µ5 µ. µ' µ µ µ µ µ µý µö µï µè µá µÚ µÓ µÌ µÅ µ¾ µ· µ° µ© µ¢ µ› µ” µ µ† µ µx µq µj µc µ\ µU µN µG µ@ µ9 µ2 µ+ µ$ µ µ µ µ µ µú µó µì µå µÞ µ× µÐ µÉ µ µ» µ´ µ­ µ¦ µŸ µ˜ µ‘ µŠ µƒ µ| µu µn µg µ` µY µR µK µD µ= µ6 µ/ µ( µ! µ µ µ µ µþ µ÷ µð µé µâ µÛ µÔ µÍ µÆ µ¿ µ¸ µ± µª µ£ µœ µ• µŽ µ‡ µ€ µy µr µk µd µ] µV µO µH µA µ: µ3 µ, µ% µ µ µ µ µ µû µô µí µæ µß µØ µÑ µÊ µà µ¼ µµ µ® µ§ µ  µ™ µ’ µ‹ µ„ µ} µv µo µh µa µZ µS µL µE µ> µ7 µ0 µ) µ" µ µ µ µ µÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüµõµîµçµàµÙµÒµËµÄµ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµùµòµëµäµÝµÖµÏµÈµÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµýµöµïµèµáµÚµÓµÌµÅµ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµúµóµìµåµÞµ×µÐµÉµÂµ»µ´µ­µ¦µŸµ˜µ‘µŠµƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþµ÷µðµéµâµÛµÔµÍµÆµ¿µ¸µ±µªµ£µœµ•µŽµ‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµûµôµíµæµßµØµÑµÊµÃµ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿµøµñµêµãµÜµÕµÎµÇµÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµüµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµùÿ´òÿ´ëÿ´äÿ´Ýÿ´Öÿ´Ïÿ´Èÿ´Áÿ´ºÿ´³ÿ´¬ÿ´¥ÿ´žÿ´—ÿ´ÿ´‰ÿ´‚ÿ´{ÿ´tÿ´mÿ´fÿ´_ÿ´Xÿ´Qÿ´Jÿ´Cÿ´<ÿ´5ÿ´.ÿ´'ÿ´ ÿ´ÿ´ÿ´ ÿ´ÿ´ýþ´öþ´ïþ´èþ´áþ´Úþ´Óþ´Ìþ´Åþ´¾þ´·þ´°þ´©þ´¢þ´›þ´”þ´þ´†þ´þ´xþ´qþ´jþ´cþ´\þ´Uþ´Nþ´Gþ´@þ´9þ´2þ´+þ´$þ´þ´þ´þ´þ´þ´úý´óý´ìý´åý´Þý´×ý´Ðý´Éý´Âý´»ý´´ý´­ý´¦ý´Ÿý´˜ý´‘ý´Šý´ƒý´|ý´uý´ný´gý´`ý´Yý´Rý´Ký´Dý´=ý´6ý´/ý´(ý´!ý´ý´ý´ ý´ý´þü´÷ü´ðü´éü´âü´Ûü´Ôü´Íü´Æü´¿ü´¸ü´±ü´ªü´£ü´œü´•ü´Žü´‡ü´€ü´yü´rü´kü´dü´]ü´Vü´Oü´Hü´Aü´:ü´3ü´,ü´%ü´ü´ü´ü´ ü´ü´ûû´ôû´íû´æû´ßû´Øû´Ñû´Êû´Ãû´¼û´µû´®û´§û´ û´™û´’û´‹û´„û´}û´vû´oû´hû´aû´Zû´Sû´Lû´Eû´>û´7û´0û´)û´"û´û´û´ û´û´ÿú´øú´ñú´êú´ãú´Üú´Õú´Îú´Çú´Àú´¹ú´²ú´«ú´¤ú´ú´–ú´ú´ˆú´ú´zú´sú´lú´eú´^ú´Wú´Pú´Iú´Bú´;ú´4ú´-ú´&ú´ú´ú´ú´ ú´ú´üù´õù´îù´çù´àù´Ùù´Òù´Ëù´Äù´½ù´¶ù´¯ù´¨ù´¡ù´šù´“ù´Œù´…ù´~ù´wù´pù´iù´bù´[ù´Tù´Mù´Fù´?ù´8ù´1ù´*ù´#ù´ù´ù´ù´ù´ù´ùø´òø´ëø´äø´Ýø´Öø´Ïø´Èø´Áø´ºø´³ø´¬ø´¥ø´žø´—ø´ø´‰ø´‚ø´{ø´tø´mø´fø´_ø´Xø´Qø´Jø´Cø´<ø´5ø´.ø´'ø´ ø´ø´ø´ ø´ø´ý÷´ö÷´ï÷´è÷´á÷´Ú÷´Ó÷´Ì÷´Å÷´¾÷´·÷´°÷´©÷´¢÷´›÷´”÷´÷´†÷´÷´x÷´q÷´j÷´c÷´\÷´U÷´N÷´G÷´@÷´9÷´2÷´+÷´$÷´÷´÷´÷´÷´÷´úö´óö´ìö´åö´Þö´×ö´Ðö´Éö´Âö´»ö´´ö´­ö´¦ö´Ÿö´˜ö´‘ö´Šö´ƒö´|ö´uö´nö´gö´`ö´Yö´Rö´Kö´Dö´=ö´6ö´/ö´(ö´!ö´ö´ö´ ö´ö´þõ´÷õ´ðõ´éõ´âõ´Ûõ´Ôõ´Íõ´Æõ´¿õ´¸õ´±õ´ªõ´£õ´œõ´•õ´Žõ´‡õ´€õ´yõ´rõ´kõ´dõ´]õ´Võ´Oõ´Hõ´Aõ´:õ´3õ´,õ´%õ´õ´õ´õ´ õ´õ´ûô´ôô´íô´æô´ßô´Øô´Ñô´Êô´Ãô´¼ô´µô´®ô´§ô´ ô´™ô´’ô´‹ô´„ô´}ô´vô´oô´hô´aô´Zô´Sô´Lô´Eô´>ô´7ô´0ô´)ô´"ô´ô´ô´ ô´ô´ÿó´øó´ñó´êó´ãó´Üó´Õó´Îó´Çó´Àó´¹ó´²ó´«ó´¤ó´ó´–ó´ó´ˆó´ó´zó´só´ló´eó´^ó´Wó´Pó´Ió´Bó´;ó´4ó´-ó´&ó´ó´ó´ó´ ó´ó´üò´õò´îò´çò´àò´Ùò´Òò´Ëò´Äò´½ò´¶ò´¯ò´¨ò´¡ò´šò´“ò´Œò´…ò´~ò´wò´pò´iò´bò´[ò´Tò´Mò´Fò´?ò´8ò´1ò´*ò´#ò´ò´ò´ò´ò´ò´ùñ´òñ´ëñ´äñ´Ýñ´Öñ´Ïñ´Èñ´Áñ´ºñ´³ñ´¬ñ´¥ñ´žñ´—ñ´ñ´‰ñ´‚ñ´{ñ´tñ´mñ´fñ´_ñ´Xñ´Qñ´Jñ´Cñ´<ñ´5ñ´.ñ´'ñ´ ñ´ñ´ñ´ ñ´ñ´ýð´öð´ïð´èð´áð´Úð´Óð´Ìð´Åð´¾ð´·ð´°ð´©ð´¢ð´›ð´”ð´ð´†ð´ð´xð´qð´jð´cð´\ð´Uð´Nð´Gð´@ð´9ð´2ð´+ð´$ð´ð´ð´ð´ð´ð´úï´óï´ìï´åï´Þï´×ï´Ðï´Éï´Âﴻﴴﴭﴦﴟﴘﴑﴊﴃï´|ï´uï´nï´gï´`ï´Yï´Rï´Kï´Dï´=ï´6ï´/ï´(ï´!ï´ï´ï´ ï´ï´þî´÷î´ðî´éî´âî´Ûî´Ôî´Íî´Æî´¿î´¸î´±î´ªî´£î´œî´•î´Žî´‡î´€î´yî´rî´kî´dî´]î´Vî´Oî´Hî´Aî´:î´3î´,î´%î´î´î´î´ î´î´ûí´ôí´íí´æí´ßí´Øí´Ñí´Êí´Ãí´¼í´µí´®í´§í´ í´™í´’í´‹í´„í´}í´ví´oí´hí´aí´Zí´Sí´Lí´Eí´>í´7í´0í´)í´"í´í´í´ í´í´ÿì´øì´ñì´êì´ãì´Üì´Õì´Îì´Çì´À촹촲촫촤ì´ì´–ì´ì´ˆì´ì´zì´sì´lì´eì´^ì´Wì´Pì´Iì´Bì´;ì´4ì´-ì´&ì´ì´ì´ì´ ì´ì´üë´õë´îë´çë´àë´Ùë´Òë´Ëë´Ä봽봶봯봨봡봚봓봌봅ë´~ë´wë´pë´ië´bë´[ë´Të´Më´Fë´?ë´8ë´1ë´*ë´#ë´ë´ë´ë´ë´ë´ùê´òê´ëê´äê´Ýê´Öê´Ïê´Èê´Á괺괳괬괥괞괗ê´ê´‰ê´‚ê´{ê´tê´mê´fê´_ê´Xê´Qê´Jê´Cê´<ê´5ê´.ê´'ê´ ê´ê´ê´ ê´ê´ýé´öé´ïé´èé´áé´Úé´Óé´Ìé´Å鴾鴷鴰鴩鴢鴛鴔é´é´†é´é´xé´qé´jé´cé´\é´Ué´Né´Gé´@é´9é´2é´+é´$é´é´é´é´é´é´úè´óè´ìè´åè´Þè´×è´Ðè´Éè´Â贻贴购账负贘贑贊贃è´|è´uè´nè´gè´`è´Yè´Rè´Kè´Dè´=è´6è´/è´(è´!è´è´è´ è´è´þç´÷ç´ðç´éç´âç´Ûç´Ôç´Íç´Æç´¿ç´¸ç´±ç´ªç´£ç´œç´•ç´Žç´‡ç´€ç´yç´rç´kç´dç´]ç´Vç´Oç´Hç´Aç´:ç´3ç´,ç´%ç´ç´ç´ç´ ç´ç´ûæ´ôæ´íæ´ææ´ßæ´Øæ´Ñæ´Êæ´Ã洼洵洮洧洠洙洒洋洄æ´}æ´væ´oæ´hæ´aæ´Zæ´Sæ´Læ´Eæ´>æ´7æ´0æ´)æ´"æ´æ´æ´ æ´æ´ÿå´øå´ñå´êå´ãå´Üå´Õå´Îå´Çå´À崹崲崫崤å´å´–å´å´ˆå´å´zå´så´lå´eå´^å´Wå´På´Iå´Bå´;å´4å´-å´&å´å´å´å´ å´å´üä´õä´îä´çä´àä´Ùä´Òä´Ëä´Ä䴽䴶䴯䴨䴡䴚䴓䴌䴅ä´~ä´wä´pä´iä´bä´[ä´Tä´Mä´Fä´?ä´8ä´1ä´*ä´#ä´ä´ä´ä´ä´ä´ùã´òã´ëã´äã´Ýã´Öã´Ïã´Èã´Á㴺㴳㴬㴥㴞㴗ã´ã´‰ã´‚ã´{ã´tã´mã´fã´_ã´Xã´Qã´Jã´Cã´<ã´5ã´.ã´'ã´ ã´ã´ã´ ã´ã´ýâ´öâ´ïâ´èâ´áâ´Úâ´Óâ´Ìâ´Åⴾⴷⴰ⴩ⴢⴛⴔâ´â´†â´â´xâ´qâ´jâ´câ´\â´Uâ´Nâ´Gâ´@â´9â´2â´+â´$â´â´â´â´â´â´úá´óá´ìá´åá´Þá´×á´Ðá´Éá´Âᴻᴴᴭᴦᴟᴘᴑᴊᴃá´|á´uá´ná´gá´`á´Yá´Rá´Ká´Dá´=á´6á´/á´(á´!á´á´á´ á´á´þà´÷à´ðà´éà´âà´Ûà´Ôà´Íà´Æà´¿à´¸à´±à´ªà´£à´œà´•à´Žà´‡à´€à´yà´rà´kà´dà´]à´Và´Oà´Hà´Aà´:à´3à´,à´%à´à´à´à´ à´à´ûß´ôß´íß´æß´ßß´Øß´Ñß´Êß´Ãß´¼ß´µß´®ß´§ß´ ß´™ß´’ß´‹ß´„ß´}ß´vß´oß´hß´aß´Zß´Sß´Lß´Eß´>ß´7ß´0ß´)ß´"ß´ß´ß´ ß´ß´ÿÞ´øÞ´ñÞ´êÞ´ãÞ´ÜÞ´ÕÞ´ÎÞ´ÇÞ´ÀÞ´¹Þ´²Þ´«Þ´¤Þ´Þ´–Þ´Þ´ˆÞ´Þ´zÞ´sÞ´lÞ´eÞ´^Þ´WÞ´PÞ´IÞ´BÞ´;Þ´4Þ´-Þ´&Þ´Þ´Þ´Þ´ Þ´Þ´üÝ´õÝ´îÝ´çÝ´àÝ´ÙÝ´ÒÝ´ËÝ´ÄÝ´½Ý´¶Ý´¯Ý´¨Ý´¡Ý´šÝ´“Ý´ŒÝ´…Ý´~Ý´wÝ´pÝ´iÝ´bÝ´[Ý´TÝ´MÝ´FÝ´?Ý´8Ý´1Ý´*Ý´#Ý´Ý´Ý´Ý´Ý´Ý´ùÜ´òÜ´ëÜ´äÜ´ÝÜ´ÖÜ´ÏÜ´ÈÜ´ÁÜ´ºÜ´³Ü´¬Ü´¥Ü´žÜ´—Ü´Ü´‰Ü´‚Ü´{Ü´tÜ´mÜ´fÜ´_Ü´XÜ´QÜ´JÜ´CÜ´<Ü´5Ü´.Ü´'Ü´ Ü´Ü´Ü´ Ü´Ü´ýÛ´öÛ´ïÛ´èÛ´áÛ´ÚÛ´ÓÛ´ÌÛ´ÅÛ´¾Û´·Û´°Û´©Û´¢Û´›Û´”Û´Û´†Û´Û´xÛ´qÛ´jÛ´cÛ´\Û´UÛ´NÛ´GÛ´@Û´9Û´2Û´+Û´$Û´Û´Û´Û´Û´Û´úÚ´óÚ´ìÚ´åÚ´ÞÚ´×Ú´ÐÚ´ÉÚ´ÂÚ´»Ú´´Ú´­Ú´¦Ú´ŸÚ´˜Ú´‘Ú´ŠÚ´ƒÚ´|Ú´uÚ´nÚ´gÚ´`Ú´YÚ´RÚ´KÚ´DÚ´=Ú´6Ú´/Ú´(Ú´!Ú´Ú´Ú´ Ú´Ú´þÙ´÷Ù´ðÙ´éÙ´âÙ´ÛÙ´ÔÙ´ÍÙ´ÆÙ´¿Ù´¸Ù´±Ù´ªÙ´£Ù´œÙ´•Ù´ŽÙ´‡Ù´€Ù´yÙ´rÙ´kÙ´dÙ´]Ù´VÙ´OÙ´HÙ´AÙ´:Ù´3Ù´,Ù´%ٴٴٴٴ ٴٴûØ´ôØ´íØ´æØ´ߨ´ØØ´ÑØ´ÊØ´ÃØ´¼Ø´µØ´®Ø´§Ø´ Ø´™Ø´’Ø´‹Ø´„Ø´}Ø´vØ´oØ´hØ´aØ´ZØ´SØ´LØ´EØ´>Ø´7Ø´0Ø´)Ø´"ششش ششÿ×´ø×´ñ×´ê×´ã×´Ü×´Õ×´Î×´Ç×´À×´¹×´²×´«×´¤×´×´–×´×´ˆ×´×´z×´s×´l×´e×´^×´W×´P×´I×´B×´;×´4×´-×´&×´×´×´×´ ×´×´üÖ´õÖ´îÖ´çÖ´àÖ´ÙÖ´ÒÖ´ËÖ´ÄÖ´½Ö´¶Ö´¯Ö´¨Ö´¡Ö´šÖ´“Ö´ŒÖ´…Ö´~Ö´wÖ´pÖ´iÖ´bÖ´[Ö´TÖ´MÖ´FÖ´?Ö´8Ö´1Ö´*Ö´#Ö´Ö´Ö´Ö´Ö´Ö´ùÕ´òÕ´ëÕ´äÕ´ÝÕ´ÖÕ´ÏÕ´ÈÕ´ÁÕ´ºÕ´³Õ´¬Õ´¥Õ´žÕ´—Õ´Õ´‰Õ´‚Õ´{Õ´tÕ´mÕ´fÕ´_Õ´XÕ´QÕ´JÕ´CÕ´<Õ´5Õ´.Õ´'Õ´ Õ´Õ´Õ´ Õ´Õ´ýÔ´öÔ´ïÔ´èÔ´áÔ´ÚÔ´ÓÔ´ÌÔ´ÅÔ´¾Ô´·Ô´°Ô´©Ô´¢Ô´›Ô´”Ô´Ô´†Ô´Ô´xÔ´qÔ´jÔ´cÔ´\Ô´UÔ´NÔ´GÔ´@Ô´9Ô´2Ô´+Ô´$Ô´Ô´Ô´Ô´Ô´Ô´úÓ´óÓ´ìÓ´åÓ´ÞÓ´×Ó´ÐÓ´ÉÓ´ÂÓ´»Ó´´Ó´­Ó´¦Ó´ŸÓ´˜Ó´‘Ó´ŠÓ´ƒÓ´|Ó´uÓ´nÓ´gÓ´`Ó´YÓ´RÓ´KÓ´DÓ´=Ó´6Ó´/Ó´(Ó´!Ó´Ó´Ó´ Ó´Ó´þÒ´÷Ò´ðÒ´éÒ´âÒ´ÛÒ´ÔÒ´ÍÒ´ÆÒ´¿Ò´¸Ò´±Ò´ªÒ´£Ò´œÒ´•Ò´ŽÒ´‡Ò´€Ò´yÒ´rÒ´kÒ´dÒ´]Ò´VÒ´OÒ´HÒ´AÒ´:Ò´3Ò´,Ò´%Ò´Ò´Ò´Ò´ Ò´Ò´ûÑ´ôÑ´íÑ´æÑ´ßÑ´ØÑ´ÑÑ´ÊÑ´ÃÑ´¼Ñ´µÑ´®Ñ´§Ñ´ Ñ´™Ñ´’Ñ´‹Ñ´„Ñ´}Ñ´vÑ´oÑ´hÑ´aÑ´ZÑ´SÑ´LÑ´EÑ´>Ñ´7Ñ´0Ñ´)Ñ´"Ñ´Ñ´Ñ´ Ñ´Ñ´ÿдøÐ´ñдêдãдÜдÕдÎдÇдÀд¹Ð´²Ð´«Ð´¤Ð´д–ддˆÐ´дzдsдlдeд^дWдPдIдBд;д4д-д&дддд ддüÏ´õÏ´îÏ´çÏ´àÏ´ÙÏ´ÒÏ´ËÏ´ÄÏ´½Ï´¶Ï´¯Ï´¨Ï´¡Ï´šÏ´“Ï´ŒÏ´…Ï´~Ï´wÏ´pÏ´iÏ´bÏ´[Ï´TÏ´MÏ´FÏ´?Ï´8Ï´1Ï´*Ï´#Ï´Ï´Ï´Ï´Ï´Ï´ùδòδëδäδÝδÖδÏδÈδÁδºÎ´³Î´¬Î´¥Î´žÎ´—δδ‰Î´‚δ{δtδmδfδ_δXδQδJδCδ<δ5δ.δ'δ δδδ δδýÍ´öÍ´ïÍ´èÍ´áÍ´ÚÍ´ÓÍ´ÌÍ´ÅÍ´¾Í´·Í´°Í´©Í´¢Í´›Í´”Í´Í´†Í´Í´xÍ´qÍ´jÍ´cÍ´\Í´UÍ´NÍ´GÍ´@Í´9Í´2Í´+Í´$Í´Í´Í´Í´Í´Í´úÌ´óÌ´ìÌ´åÌ´ÞÌ´×Ì´ÐÌ´ÉÌ´ÂÌ´»Ì´´Ì´­Ì´¦Ì´ŸÌ´˜Ì´‘Ì´ŠÌ´ƒÌ´|Ì´uÌ´nÌ´gÌ´`Ì´YÌ´RÌ´KÌ´DÌ´=Ì´6Ì´/Ì´(Ì´!Ì´Ì´Ì´ Ì´Ì´þË´÷Ë´ðË´éË´âË´ÛË´ÔË´ÍË´ÆË´¿Ë´¸Ë´±Ë´ªË´£Ë´œË´•Ë´ŽË´‡Ë´€Ë´yË´rË´kË´dË´]Ë´VË´OË´HË´AË´:Ë´3Ë´,Ë´%Ë´Ë´Ë´Ë´ Ë´Ë´ûÊ´ôÊ´íÊ´æÊ´ßÊ´ØÊ´ÑÊ´ÊÊ´ÃÊ´¼Ê´µÊ´®Ê´§Ê´ Ê´™Ê´’Ê´‹Ê´„Ê´}Ê´vÊ´oÊ´hÊ´aÊ´ZÊ´SÊ´LÊ´EÊ´>Ê´7Ê´0Ê´)Ê´"Ê´Ê´Ê´ Ê´Ê´ÿÉ´øÉ´ñÉ´êÉ´ãÉ´ÜÉ´ÕÉ´ÎÉ´ÇÉ´ÀÉ´¹É´²É´«É´¤É´É´–É´É´ˆÉ´É´zÉ´sÉ´lÉ´eÉ´^É´WÉ´PÉ´IÉ´BÉ´;É´4É´-É´&É´É´É´É´ É´É´üÈ´õÈ´îÈ´çÈ´àÈ´ÙÈ´ÒÈ´ËÈ´ÄÈ´½È´¶È´¯È´¨È´¡È´šÈ´“È´ŒÈ´…È´~È´wÈ´pÈ´iÈ´bÈ´[È´TÈ´MÈ´FÈ´?È´8È´1È´*È´#È´È´È´È´È´È´ùÇ´òÇ´ëÇ´äÇ´ÝÇ´ÖÇ´ÏÇ´ÈÇ´ÁÇ´ºÇ´³Ç´¬Ç´¥Ç´žÇ´—Ç´Ç´‰Ç´‚Ç´{Ç´tÇ´mÇ´fÇ´_Ç´XÇ´QÇ´JÇ´CÇ´<Ç´5Ç´.Ç´'Ç´ Ç´Ç´Ç´ Ç´Ç´ýÆ´öÆ´ïÆ´èÆ´áÆ´ÚÆ´ÓÆ´ÌÆ´ÅÆ´¾Æ´·Æ´°Æ´©Æ´¢Æ´›Æ´”Æ´Æ´†Æ´Æ´xÆ´qÆ´jÆ´cÆ´\Æ´UÆ´NÆ´GÆ´@Æ´9Æ´2Æ´+Æ´$Æ´Æ´Æ´Æ´Æ´Æ´úÅ´óÅ´ìÅ´åÅ´ÞÅ´×Å´ÐÅ´ÉÅ´ÂÅ´»Å´´Å´­Å´¦Å´ŸÅ´˜Å´‘Å´ŠÅ´ƒÅ´|Å´uÅ´nÅ´gÅ´`Å´YÅ´RÅ´KÅ´DÅ´=Å´6Å´/Å´(Å´!Å´Å´Å´ Å´Å´þÄ´÷Ä´ðÄ´éÄ´âÄ´ÛÄ´ÔÄ´ÍÄ´ÆÄ´¿Ä´¸Ä´±Ä´ªÄ´£Ä´œÄ´•Ä´ŽÄ´‡Ä´€Ä´yÄ´rÄ´kÄ´dÄ´]Ä´VÄ´OÄ´HÄ´AÄ´:Ä´3Ä´,Ä´%Ä´Ä´Ä´Ä´ Ä´Ä´ûôôôíôæÃ´ßôØÃ´ÑôÊôÃô¼Ã´µÃ´®Ã´§Ã´ Ã´™Ã´’ô‹Ã´„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿ´øÂ´ñ´ê´ã´Ü´Õ´δÇ´À´¹Â´²Â´«Â´¤Â´´–´´ˆÂ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´üÁ´õÁ´îÁ´çÁ´àÁ´ÙÁ´ÒÁ´ËÁ´ÄÁ´½Á´¶Á´¯Á´¨Á´¡Á´šÁ´“Á´ŒÁ´…Á´~Á´wÁ´pÁ´iÁ´bÁ´[Á´TÁ´MÁ´FÁ´?Á´8Á´1Á´*Á´#Á´Á´Á´Á´Á´Á´ùÀ´òÀ´ëÀ´äÀ´ÝÀ´ÖÀ´ÏÀ´ÈÀ´ÁÀ´ºÀ´³À´¬À´¥À´žÀ´—À´À´‰À´‚À´{À´tÀ´mÀ´fÀ´_À´XÀ´QÀ´JÀ´CÀ´<À´5À´.À´'À´ À´À´À´ À´À´ý¿´ö¿´ï¿´è¿´á¿´Ú¿´Ó¿´Ì¿´Å¿´¾¿´·¿´°¿´©¿´¢¿´›¿´”¿´¿´†¿´¿´x¿´q¿´j¿´c¿´\¿´U¿´N¿´G¿´@¿´9¿´2¿´+¿´$¿´¿´¿´¿´¿´¿´ú¾´ó¾´ì¾´å¾´Þ¾´×¾´о´ɾ´¾´»¾´´¾´­¾´¦¾´Ÿ¾´˜¾´‘¾´о´ƒ¾´|¾´u¾´n¾´g¾´`¾´Y¾´R¾´K¾´D¾´=¾´6¾´/¾´(¾´!¾´¾´¾´ ¾´¾´þ½´÷½´ð½´é½´â½´Û½´Ô½´ͽ´ƽ´¿½´¸½´±½´ª½´£½´œ½´•½´޽´‡½´€½´y½´r½´k½´d½´]½´V½´O½´H½´A½´:½´3½´,½´%½´½´½´½´ ½´½´û¼´ô¼´í¼´æ¼´ß¼´ؼ´Ѽ´ʼ´ü´¼¼´µ¼´®¼´§¼´ ¼´™¼´’¼´‹¼´„¼´}¼´v¼´o¼´h¼´a¼´Z¼´S¼´L¼´E¼´>¼´7¼´0¼´)¼´"¼´¼´¼´ ¼´¼´ÿ»´ø»´ñ»´ê»´ã»´Ü»´Õ»´λ´Ç»´À»´¹»´²»´«»´¤»´»´–»´»´ˆ»´»´z»´s»´l»´e»´^»´W»´P»´I»´B»´;»´4»´-»´&»´»´»´»´ »´»´üº´õº´纴ິÙº´Òº´˺´ĺ´½º´¶º´¯º´¨º´¡º´šº´“º´Œº´…º´~º´wº´pº´iº´bº´[º´Tº´Mº´Fº´?º´8º´1º´*º´#º´º´º´º´º´º´ù¹´ò¹´ë¹´ä¹´ݹ´Ö¹´Ϲ´ȹ´Á¹´º¹´³¹´¬¹´¥¹´ž¹´—¹´¹´‰¹´‚¹´{¹´t¹´m¹´f¹´_¹´X¹´Q¹´J¹´C¹´<¹´5¹´.¹´'¹´ ¹´¹´¹´ ¹´¹´ý¸´ö¸´︴踴ḴÚ¸´Ó¸´̸´Ÿ´¾¸´·¸´°¸´©¸´¢¸´›¸´”¸´¸´†¸´¸´x¸´q¸´j¸´c¸´\¸´U¸´N¸´G¸´@¸´9¸´2¸´+¸´$¸´¸´¸´¸´¸´¸´ú·´ó·´ì·´å·´Þ·´×·´з´É·´·´»·´´·´­·´¦·´Ÿ·´˜·´‘·´Š·´ƒ·´|·´u·´n·´g·´`·´Y·´R·´K·´D·´=·´6·´/·´(·´!·´·´·´ ·´·´þ¶´÷¶´ð¶´é¶´â¶´Û¶´Ô¶´Ͷ´ƶ´¿¶´¸¶´±¶´ª¶´£¶´œ¶´•¶´޶´‡¶´€¶´y¶´r¶´k¶´d¶´]¶´V¶´O¶´H¶´A¶´:¶´3¶´,¶´%¶´¶´¶´¶´ ¶´¶´ûµ´ôµ´íµ´æµ´ßµ´ص´ѵ´ʵ´õ´¼µ´µµ´®µ´§µ´ µ´™µ´’µ´‹µ´„µ´}µ´vµ´oµ´hµ´aµ´Zµ´Sµ´Lµ´Eµ´>µ´7µ´0µ´)µ´"µ´µ´µ´ µ´µ´ÿ´´ø´´ñ´´ê´´ã´´Ü´´Õ´´δ´Ç´´À´´¹´´²´´«´´¤´´´´–´´´´ˆ´´´´z´´s´´l´´e´´^´´W´´P´´I´´B´´;´´4´´-´´&´´´´´´´´ ´´´´ü³´õ³´î³´ç³´à³´Ù³´Ò³´˳´ij´½³´¶³´¯³´¨³´¡³´š³´“³´Œ³´…³´~³´w³´p³´i³´b³´[³´T³´M³´F³´?³´8³´1³´*³´#³´³´³´³´³´³´ù²´ò²´ë²´ä²´ݲ´Ö²´ϲ´Ȳ´Á²´º²´³²´¬²´¥²´ž²´—²´²´‰²´‚²´{²´t²´m²´f²´_²´X²´Q²´J²´C²´<²´5²´.²´'²´ ²´²´²´ ²´²´ý±´ö±´ï±´è±´á±´Ú±´Ó±´̱´ű´¾±´·±´°±´©±´¢±´›±´”±´±´†±´±´x±´q±´j±´c±´\±´U±´N±´G±´@±´9±´2±´+±´$±´±´±´±´±´±´ú°´ó°´ì°´å°´Þ°´×°´а´ɰ´°´»°´´°´­°´¦°´Ÿ°´˜°´‘°´а´ƒ°´|°´u°´n°´g°´`°´Y°´R°´K°´D°´=°´6°´/°´(°´!°´°´°´ °´°´þ¯´÷¯´ð¯´鯴⯴Û¯´Ô¯´ͯ´Ư´¿¯´¸¯´±¯´ª¯´£¯´œ¯´•¯´ޝ´‡¯´€¯´y¯´r¯´k¯´d¯´]¯´V¯´O¯´H¯´A¯´:¯´3¯´,¯´%¯´¯´¯´¯´ ¯´¯´û®´ô®´í®´æ®´ß®´Ø®´Ñ®´Ê®´î´¼®´µ®´®®´§®´ ®´™®´’®´‹®´„®´}®´v®´o®´h®´a®´Z®´S®´L®´E®´>®´7®´0®´)®´"®´®´®´ ®´®´ÿ­´ø­´ñ­´ê­´ã­´Ü­´Õ­´έ´Ç­´À­´¹­´²­´«­´¤­´­´–­´­´ˆ­´­´z­´s­´l­´e­´^­´W­´P­´I­´B­´;­´4­´-­´&­´­´­´­´ ­´­´ü¬´õ¬´笴଴Ù¬´Ò¬´ˬ´Ĭ´½¬´¶¬´¯¬´¨¬´¡¬´š¬´“¬´Œ¬´…¬´~¬´w¬´p¬´i¬´b¬´[¬´T¬´M¬´F¬´?¬´8¬´1¬´*¬´#¬´¬´¬´¬´¬´¬´ù«´ò«´ë«´ä«´Ý«´Ö«´Ï«´È«´Á«´º«´³«´¬«´¥«´ž«´—«´«´‰«´‚«´{«´t«´m«´f«´_«´X«´Q«´J«´C«´<«´5«´.«´'«´ «´«´«´ «´«´ýª´öª´華誴᪴Úª´Óª´̪´Ū´¾ª´·ª´°ª´©ª´¢ª´›ª´”ª´ª´†ª´ª´xª´qª´jª´cª´\ª´Uª´Nª´Gª´@ª´9ª´2ª´+ª´$ª´ª´ª´ª´ª´ª´ú©´ó©´ì©´å©´Þ©´ש´Щ´É©´©´»©´´©´­©´¦©´Ÿ©´˜©´‘©´Š©´ƒ©´|©´u©´n©´g©´`©´Y©´R©´K©´D©´=©´6©´/©´(©´!©´©´©´ ©´©´þ¨´÷¨´ð¨´騴⨴Û¨´Ô¨´ͨ´ƨ´¿¨´¸¨´±¨´ª¨´£¨´œ¨´•¨´ލ´‡¨´€¨´y¨´r¨´k¨´d¨´]¨´V¨´O¨´H¨´A¨´:¨´3¨´,¨´%¨´¨´¨´¨´ ¨´¨´û§´ô§´í§´æ§´ß§´ا´ѧ´ʧ´ç´¼§´µ§´®§´§§´ §´™§´’§´‹§´„§´}§´v§´o§´h§´a§´Z§´S§´L§´E§´>§´7§´0§´)§´"§´§´§´ §´§´ÿ¦´ø¦´ñ¦´ꦴ㦴ܦ´Õ¦´Φ´Ǧ´À¦´¹¦´²¦´«¦´¤¦´¦´–¦´¦´ˆ¦´¦´z¦´s¦´l¦´e¦´^¦´W¦´P¦´I¦´B¦´;¦´4¦´-¦´&¦´¦´¦´¦´ ¦´¦´ü¥´õ¥´祴ॴÙ¥´Ò¥´Ë¥´Ä¥´½¥´¶¥´¯¥´¨¥´¡¥´š¥´“¥´Œ¥´…¥´~¥´w¥´p¥´i¥´b¥´[¥´T¥´M¥´F¥´?¥´8¥´1¥´*¥´#¥´¥´¥´¥´¥´¥´ù¤´ò¤´뤴䤴ݤ´Ö¤´Ϥ´Ȥ´Á¤´º¤´³¤´¬¤´¥¤´ž¤´—¤´¤´‰¤´‚¤´{¤´t¤´m¤´f¤´_¤´X¤´Q¤´J¤´C¤´<¤´5¤´.¤´'¤´ ¤´¤´¤´ ¤´¤´ý£´ö£´裴ᣴÚ£´Ó£´Ì£´Å£´¾£´·£´°£´©£´¢£´›£´”£´£´†£´£´x£´q£´j£´c£´\£´U£´N£´G£´@£´9£´2£´+£´$£´£´£´£´£´£´ú¢´ó¢´좴墴Þ¢´×¢´Т´É¢´¢´»¢´´¢´­¢´¦¢´Ÿ¢´˜¢´‘¢´Š¢´ƒ¢´|¢´u¢´n¢´g¢´`¢´Y¢´R¢´K¢´D¢´=¢´6¢´/¢´(¢´!¢´¢´¢´ ¢´¢´þ¡´÷¡´ð¡´é¡´â¡´Û¡´Ô¡´Í¡´Æ¡´¿¡´¸¡´±¡´ª¡´£¡´œ¡´•¡´Ž¡´‡¡´€¡´y¡´r¡´k¡´d¡´]¡´V¡´O¡´H¡´A¡´:¡´3¡´,¡´%¡´¡´¡´¡´ ¡´¡´û ´ô ´í ´æ ´ß ´Ø ´Ñ ´Ê ´à´¼ ´µ ´® ´§ ´  ´™ ´’ ´‹ ´„ ´} ´v ´o ´h ´a ´Z ´S ´L ´E ´> ´7 ´0 ´) ´" ´ ´ ´  ´ ´ÿŸ´øŸ´ñŸ´ꟴ㟴ÜŸ´ÕŸ´Ο´ÇŸ´ÀŸ´¹Ÿ´²Ÿ´«Ÿ´¤Ÿ´Ÿ´–Ÿ´Ÿ´ˆŸ´Ÿ´zŸ´sŸ´lŸ´eŸ´^Ÿ´WŸ´PŸ´IŸ´BŸ´;Ÿ´4Ÿ´-Ÿ´&Ÿ´Ÿ´Ÿ´Ÿ´ Ÿ´Ÿ´üž´õž´îž´çž´àž´Ùž´Òž´Ëž´Äž´½ž´¶ž´¯ž´¨ž´¡ž´šž´“ž´Œž´…ž´~ž´wž´pž´iž´bž´[ž´Tž´Mž´Fž´?ž´8ž´1ž´*ž´#ž´ž´ž´ž´ž´ž´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ýœ´öœ´蜴᜴Úœ´Óœ´Ìœ´Åœ´¾œ´·œ´°œ´©œ´¢œ´›œ´”œ´œ´†œ´œ´xœ´qœ´jœ´cœ´\œ´Uœ´Nœ´Gœ´@œ´9œ´2œ´+œ´$œ´œ´œ´œ´œ´œ´ú›´ó›´ì›´å›´Þ›´×›´Л´É›´›´»›´´›´­›´¦›´Ÿ›´˜›´‘›´Š›´ƒ›´|›´u›´n›´g›´`›´Y›´R›´K›´D›´=›´6›´/›´(›´!›´›´›´ ›´›´þš´÷š´ðš´éš´âš´Ûš´Ôš´Íš´Æš´¿š´¸š´±š´ªš´£š´œš´•š´Žš´‡š´€š´yš´rš´kš´dš´]š´Vš´Oš´Hš´Aš´:š´3š´,š´%š´š´š´š´ š´š´û™´ô™´í™´æ™´ß™´Ø™´Ñ™´Ê™´Ù´¼™´µ™´®™´§™´ ™´™™´’™´‹™´„™´}™´v™´o™´h™´a™´Z™´S™´L™´E™´>™´7™´0™´)™´"™´™´™´ ™´™´ÿ˜´ø˜´ñ˜´꘴㘴ܘ´Õ˜´Θ´ǘ´À˜´¹˜´²˜´«˜´¤˜´˜´–˜´˜´ˆ˜´˜´z˜´s˜´l˜´e˜´^˜´W˜´P˜´I˜´B˜´;˜´4˜´-˜´&˜´˜´˜´˜´ ˜´˜´ü—´õ—´î—´ç—´à—´Ù—´Ò—´Ë—´Ä—´½—´¶—´¯—´¨—´¡—´š—´“—´Œ—´…—´~—´w—´p—´i—´b—´[—´T—´M—´F—´?—´8—´1—´*—´#—´—´—´—´—´—´ù–´ò–´ë–´ä–´Ý–´Ö–´Ï–´È–´Á–´º–´³–´¬–´¥–´ž–´—–´–´‰–´‚–´{–´t–´m–´f–´_–´X–´Q–´J–´C–´<–´5–´.–´'–´ –´–´–´ –´–´ý•´ö•´ï•´è•´á•´Ú•´Ó•´Ì•´Å•´¾•´·•´°•´©•´¢•´›•´”•´•´†•´•´x•´q•´j•´c•´\•´U•´N•´G•´@•´9•´2•´+•´$•´•´•´•´•´•´ú”´ó”´ì”´å”´Þ”´×”´Д´É”´”´»”´´”´­”´¦”´Ÿ”´˜”´‘”´Š”´ƒ”´|”´u”´n”´g”´`”´Y”´R”´K”´D”´=”´6”´/”´(”´!”´”´”´ ”´”´þ“´÷“´ð“´é“´â“´Û“´Ô“´Í“´Æ“´¿“´¸“´±“´ª“´£“´œ“´•“´Ž“´‡“´€“´y“´r“´k“´d“´]“´V“´O“´H“´A“´:“´3“´,“´%“´“´“´“´ “´“´û’´ô’´í’´æ’´ß’´Ø’´Ñ’´Ê’´Ã’´¼’´µ’´®’´§’´ ’´™’´’’´‹’´„’´}’´v’´o’´h’´a’´Z’´S’´L’´E’´>’´7’´0’´)’´"’´’´’´ ’´’´ÿ‘´ø‘´ñ‘´ê‘´ã‘´Ü‘´Õ‘´Α´Ç‘´À‘´¹‘´²‘´«‘´¤‘´‘´–‘´‘´ˆ‘´‘´z‘´s‘´l‘´e‘´^‘´W‘´P‘´I‘´B‘´;‘´4‘´-‘´&‘´‘´‘´‘´ ‘´‘´ü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ýŽ´öŽ´莴ᎴÚŽ´ÓŽ´ÌŽ´ÅŽ´¾Ž´·Ž´°Ž´©Ž´¢Ž´›Ž´”Ž´Ž´†Ž´Ž´xŽ´qŽ´jŽ´cŽ´\Ž´UŽ´NŽ´GŽ´@Ž´9Ž´2Ž´+Ž´$Ž´Ž´Ž´Ž´Ž´Ž´ú´ó´ì´å´Þ´×´дÉ´´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þŒ´÷Œ´ðŒ´錴⌴ÛŒ´ÔŒ´ÍŒ´ÆŒ´¿Œ´¸Œ´±Œ´ªŒ´£Œ´œŒ´•Œ´ŽŒ´‡Œ´€Œ´yŒ´rŒ´kŒ´dŒ´]Œ´VŒ´OŒ´HŒ´AŒ´:Œ´3Œ´,Œ´%Œ´Œ´Œ´Œ´ Œ´Œ´û‹´ô‹´í‹´æ‹´ß‹´Ø‹´Ñ‹´Ê‹´Ë´¼‹´µ‹´®‹´§‹´ ‹´™‹´’‹´‹‹´„‹´}‹´v‹´o‹´h‹´a‹´Z‹´S‹´L‹´E‹´>‹´7‹´0‹´)‹´"‹´‹´‹´ ‹´‹´ÿŠ´øŠ´ñŠ´ꊴ㊴ÜŠ´ÕŠ´Ί´ÇŠ´ÀŠ´¹Š´²Š´«Š´¤Š´Š´–Š´Š´ˆŠ´Š´zŠ´sŠ´lŠ´eŠ´^Š´WŠ´PŠ´IŠ´BŠ´;Š´4Š´-Š´&Š´Š´Š´Š´ Š´Š´ü‰´õ‰´牴à‰´Ù‰´Ò‰´ˉ´ĉ´½‰´¶‰´¯‰´¨‰´¡‰´š‰´“‰´Œ‰´…‰´~‰´w‰´p‰´i‰´b‰´[‰´T‰´M‰´F‰´?‰´8‰´1‰´*‰´#‰´‰´‰´‰´‰´‰´ùˆ´òˆ´눴䈴݈´Öˆ´ψ´Ȉ´Áˆ´ºˆ´³ˆ´¬ˆ´¥ˆ´žˆ´—ˆ´ˆ´‰ˆ´‚ˆ´{ˆ´tˆ´mˆ´fˆ´_ˆ´Xˆ´Qˆ´Jˆ´Cˆ´<ˆ´5ˆ´.ˆ´'ˆ´ ˆ´ˆ´ˆ´ ˆ´ˆ´ý‡´ö‡´致ᇴÚ‡´Ó‡´̇´Ň´¾‡´·‡´°‡´©‡´¢‡´›‡´”‡´‡´†‡´‡´x‡´q‡´j‡´c‡´\‡´U‡´N‡´G‡´@‡´9‡´2‡´+‡´$‡´‡´‡´‡´‡´‡´ú†´ó†´솴冴Þ†´׆´І´Ɇ´†´»†´´†´­†´¦†´Ÿ†´˜†´‘†´І´ƒ†´|†´u†´n†´g†´`†´Y†´R†´K†´D†´=†´6†´/†´(†´!†´†´†´ †´†´þ…´÷…´ð…´é…´â…´Û…´Ô…´Í…´Æ…´¿…´¸…´±…´ª…´£…´œ…´•…´Ž…´‡…´€…´y…´r…´k…´d…´]…´V…´O…´H…´A…´:…´3…´,…´%…´…´…´…´ …´…´û„´ô„´í„´æ„´ß„´Ø„´Ñ„´Ê„´Ä´¼„´µ„´®„´§„´ „´™„´’„´‹„´„„´}„´v„´o„´h„´a„´Z„´S„´L„´E„´>„´7„´0„´)„´"„´„´„´ „´„´ÿƒ´øƒ´ñƒ´ꃴヴ܃´Õƒ´΃´ǃ´Àƒ´¹ƒ´²ƒ´«ƒ´¤ƒ´ƒ´–ƒ´ƒ´ˆƒ´ƒ´zƒ´sƒ´lƒ´eƒ´^ƒ´Wƒ´Pƒ´Iƒ´Bƒ´;ƒ´4ƒ´-ƒ´&ƒ´ƒ´ƒ´ƒ´ ƒ´ƒ´ü‚´õ‚´î‚´ç‚´à‚´Ù‚´Ò‚´Ë‚´Ä‚´½‚´¶‚´¯‚´¨‚´¡‚´š‚´“‚´Œ‚´…‚´~‚´w‚´p‚´i‚´b‚´[‚´T‚´M‚´F‚´?‚´8‚´1‚´*‚´#‚´‚´‚´‚´‚´‚´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý€´ö€´耴ဴÚ€´Ó€´Ì€´Å€´¾€´·€´°€´©€´¢€´›€´”€´€´†€´€´x€´q€´j€´c€´\€´U€´N€´G€´@€´9€´2€´+€´$€´€´€´€´€´€´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ~´÷~´ð~´é~´â~´Û~´Ô~´Í~´Æ~´¿~´¸~´±~´ª~´£~´œ~´•~´Ž~´‡~´€~´y~´r~´k~´d~´]~´V~´O~´H~´A~´:~´3~´,~´%~´~´~´~´ ~´~´û}´ô}´í}´æ}´ß}´Ø}´Ñ}´Ê}´Ã}´¼}´µ}´®}´§}´ }´™}´’}´‹}´„}´}}´v}´o}´h}´a}´Z}´S}´L}´E}´>}´7}´0}´)}´"}´}´}´ }´}´ÿ|´ø|´ñ|´ê|´ã|´Ü|´Õ|´Î|´Ç|´À|´¹|´²|´«|´¤|´|´–|´|´ˆ|´|´z|´s|´l|´e|´^|´W|´P|´I|´B|´;|´4|´-|´&|´|´|´|´ |´|´ü{´õ{´î{´ç{´à{´Ù{´Ò{´Ë{´Ä{´½{´¶{´¯{´¨{´¡{´š{´“{´Œ{´…{´~{´w{´p{´i{´b{´[{´T{´M{´F{´?{´8{´1{´*{´#{´{´{´{´{´{´ùz´òz´ëz´äz´Ýz´Öz´Ïz´Èz´Áz´ºz´³z´¬z´¥z´žz´—z´z´‰z´‚z´{z´tz´mz´fz´_z´Xz´Qz´Jz´Cz´v´7v´0v´)v´"v´v´v´ v´v´ÿu´øu´ñu´êu´ãu´Üu´Õu´Îu´Çu´Àu´¹u´²u´«u´¤u´u´–u´u´ˆu´u´zu´su´lu´eu´^u´Wu´Pu´Iu´Bu´;u´4u´-u´&u´u´u´u´ u´u´üt´õt´ît´çt´àt´Ùt´Òt´Ët´Ät´½t´¶t´¯t´¨t´¡t´št´“t´Œt´…t´~t´wt´pt´it´bt´[t´Tt´Mt´Ft´?t´8t´1t´*t´#t´t´t´t´t´t´ùs´òs´ës´äs´Ýs´Ös´Ïs´Ès´Ás´ºs´³s´¬s´¥s´žs´—s´s´‰s´‚s´{s´ts´ms´fs´_s´Xs´Qs´Js´Cs´o´7o´0o´)o´"o´o´o´ o´o´ÿn´øn´ñn´ên´ãn´Ün´Õn´În´Çn´Àn´¹n´²n´«n´¤n´n´–n´n´ˆn´n´zn´sn´ln´en´^n´Wn´Pn´In´Bn´;n´4n´-n´&n´n´n´n´ n´n´üm´õm´îm´çm´àm´Ùm´Òm´Ëm´Äm´½m´¶m´¯m´¨m´¡m´šm´“m´Œm´…m´~m´wm´pm´im´bm´[m´Tm´Mm´Fm´?m´8m´1m´*m´#m´m´m´m´m´m´ùl´òl´ël´äl´Ýl´Öl´Ïl´Èl´Ál´ºl´³l´¬l´¥l´žl´—l´l´‰l´‚l´{l´tl´ml´fl´_l´Xl´Ql´Jl´Cl´h´7h´0h´)h´"h´h´h´ h´h´ÿg´øg´ñg´êg´ãg´Üg´Õg´Îg´Çg´Àg´¹g´²g´«g´¤g´g´–g´g´ˆg´g´zg´sg´lg´eg´^g´Wg´Pg´Ig´Bg´;g´4g´-g´&g´g´g´g´ g´g´üf´õf´îf´çf´àf´Ùf´Òf´Ëf´Äf´½f´¶f´¯f´¨f´¡f´šf´“f´Œf´…f´~f´wf´pf´if´bf´[f´Tf´Mf´Ff´?f´8f´1f´*f´#f´f´f´f´f´f´ùe´òe´ëe´äe´Ýe´Öe´Ïe´Èe´Áe´ºe´³e´¬e´¥e´že´—e´e´‰e´‚e´{e´te´me´fe´_e´Xe´Qe´Je´Ce´a´7a´0a´)a´"a´a´a´ a´a´ÿ`´ø`´ñ`´ê`´ã`´Ü`´Õ`´Î`´Ç`´À`´¹`´²`´«`´¤`´`´–`´`´ˆ`´`´z`´s`´l`´e`´^`´W`´P`´I`´B`´;`´4`´-`´&`´`´`´`´ `´`´ü_´õ_´î_´ç_´à_´Ù_´Ò_´Ë_´Ä_´½_´¶_´¯_´¨_´¡_´š_´“_´Œ_´…_´~_´w_´p_´i_´b_´[_´T_´M_´F_´?_´8_´1_´*_´#_´_´_´_´_´_´ù^´ò^´ë^´ä^´Ý^´Ö^´Ï^´È^´Á^´º^´³^´¬^´¥^´ž^´—^´^´‰^´‚^´{^´t^´m^´f^´_^´X^´Q^´J^´C^´<^´5^´.^´'^´ ^´^´^´ ^´^´ý]´ö]´ï]´è]´á]´Ú]´Ó]´Ì]´Å]´¾]´·]´°]´©]´¢]´›]´”]´]´†]´]´x]´q]´j]´c]´\]´U]´N]´G]´@]´9]´2]´+]´$]´]´]´]´]´]´ú\´ó\´ì\´å\´Þ\´×\´Ð\´É\´Â\´»\´´\´­\´¦\´Ÿ\´˜\´‘\´Š\´ƒ\´|\´u\´n\´g\´`\´Y\´R\´K\´D\´=\´6\´/\´(\´!\´\´\´ \´\´þ[´÷[´ð[´é[´â[´Û[´Ô[´Í[´Æ[´¿[´¸[´±[´ª[´£[´œ[´•[´Ž[´‡[´€[´y[´r[´k[´d[´][´V[´O[´H[´A[´:[´3[´,[´%[´[´[´[´ [´[´ûZ´ôZ´íZ´æZ´ßZ´ØZ´ÑZ´ÊZ´ÃZ´¼Z´µZ´®Z´§Z´ Z´™Z´’Z´‹Z´„Z´}Z´vZ´oZ´hZ´aZ´ZZ´SZ´LZ´EZ´>Z´7Z´0Z´)Z´"Z´Z´Z´ Z´Z´ÿY´øY´ñY´êY´ãY´ÜY´ÕY´ÎY´ÇY´ÀY´¹Y´²Y´«Y´¤Y´Y´–Y´Y´ˆY´Y´zY´sY´lY´eY´^Y´WY´PY´IY´BY´;Y´4Y´-Y´&Y´Y´Y´Y´ Y´Y´üX´õX´îX´çX´àX´ÙX´ÒX´ËX´ÄX´½X´¶X´¯X´¨X´¡X´šX´“X´ŒX´…X´~X´wX´pX´iX´bX´[X´TX´MX´FX´?X´8X´1X´*X´#X´X´X´X´X´X´ùW´òW´ëW´äW´ÝW´ÖW´ÏW´ÈW´ÁW´ºW´³W´¬W´¥W´žW´—W´W´‰W´‚W´{W´tW´mW´fW´_W´XW´QW´JW´CW´S´7S´0S´)S´"S´S´S´ S´S´ÿR´øR´ñR´êR´ãR´ÜR´ÕR´ÎR´ÇR´ÀR´¹R´²R´«R´¤R´R´–R´R´ˆR´R´zR´sR´lR´eR´^R´WR´PR´IR´BR´;R´4R´-R´&R´R´R´R´ R´R´üQ´õQ´îQ´çQ´àQ´ÙQ´ÒQ´ËQ´ÄQ´½Q´¶Q´¯Q´¨Q´¡Q´šQ´“Q´ŒQ´…Q´~Q´wQ´pQ´iQ´bQ´[Q´TQ´MQ´FQ´?Q´8Q´1Q´*Q´#Q´Q´Q´Q´Q´Q´ùP´òP´ëP´äP´ÝP´ÖP´ÏP´ÈP´ÁP´ºP´³P´¬P´¥P´žP´—P´P´‰P´‚P´{P´tP´mP´fP´_P´XP´QP´JP´CP´L´7L´0L´)L´"L´L´L´ L´L´ÿK´øK´ñK´êK´ãK´ÜK´ÕK´ÎK´ÇK´ÀK´¹K´²K´«K´¤K´K´–K´K´ˆK´K´zK´sK´lK´eK´^K´WK´PK´IK´BK´;K´4K´-K´&K´K´K´K´ K´K´üJ´õJ´îJ´çJ´àJ´ÙJ´ÒJ´ËJ´ÄJ´½J´¶J´¯J´¨J´¡J´šJ´“J´ŒJ´…J´~J´wJ´pJ´iJ´bJ´[J´TJ´MJ´FJ´?J´8J´1J´*J´#J´J´J´J´J´J´ùI´òI´ëI´äI´ÝI´ÖI´ÏI´ÈI´ÁI´ºI´³I´¬I´¥I´žI´—I´I´‰I´‚I´{I´tI´mI´fI´_I´XI´QI´JI´CI´E´7E´0E´)E´"E´E´E´ E´E´ÿD´øD´ñD´êD´ãD´ÜD´ÕD´ÎD´ÇD´ÀD´¹D´²D´«D´¤D´D´–D´D´ˆD´D´zD´sD´lD´eD´^D´WD´PD´ID´BD´;D´4D´-D´&D´D´D´D´ D´D´üC´õC´îC´çC´àC´ÙC´ÒC´ËC´ÄC´½C´¶C´¯C´¨C´¡C´šC´“C´ŒC´…C´~C´wC´pC´iC´bC´[C´TC´MC´FC´?C´8C´1C´*C´#C´C´C´C´C´C´ùB´òB´ëB´äB´ÝB´ÖB´ÏB´ÈB´ÁB´ºB´³B´¬B´¥B´žB´—B´B´‰B´‚B´{B´tB´mB´fB´_B´XB´QB´JB´CB´´ô>´í>´æ>´ß>´Ø>´Ñ>´Ê>´Ã>´¼>´µ>´®>´§>´ >´™>´’>´‹>´„>´}>´v>´o>´h>´a>´Z>´S>´L>´E>´>>´7>´0>´)>´">´>´>´ >´>´ÿ=´ø=´ñ=´ê=´ã=´Ü=´Õ=´Î=´Ç=´À=´¹=´²=´«=´¤=´=´–=´=´ˆ=´=´z=´s=´l=´e=´^=´W=´P=´I=´B=´;=´4=´-=´&=´=´=´=´ =´=´ü<´õ<´î<´ç<´à<´Ù<´Ò<´Ë<´Ä<´½<´¶<´¯<´¨<´¡<´š<´“<´Œ<´…<´~<´w<´p<´i<´b<´[<´T<´M<´F<´?<´8<´1<´*<´#<´<´<´<´<´<´ù;´ò;´ë;´ä;´Ý;´Ö;´Ï;´È;´Á;´º;´³;´¬;´¥;´ž;´—;´;´‰;´‚;´{;´t;´m;´f;´_;´X;´Q;´J;´C;´<;´5;´.;´';´ ;´;´;´ ;´;´ý:´ö:´ï:´è:´á:´Ú:´Ó:´Ì:´Å:´¾:´·:´°:´©:´¢:´›:´”:´:´†:´:´x:´q:´j:´c:´\:´U:´N:´G:´@:´9:´2:´+:´$:´:´:´:´:´:´ú9´ó9´ì9´å9´Þ9´×9´Ð9´É9´Â9´»9´´9´­9´¦9´Ÿ9´˜9´‘9´Š9´ƒ9´|9´u9´n9´g9´`9´Y9´R9´K9´D9´=9´69´/9´(9´!9´9´9´ 9´9´þ8´÷8´ð8´é8´â8´Û8´Ô8´Í8´Æ8´¿8´¸8´±8´ª8´£8´œ8´•8´Ž8´‡8´€8´y8´r8´k8´d8´]8´V8´O8´H8´A8´:8´38´,8´%8´8´8´8´ 8´8´û7´ô7´í7´æ7´ß7´Ø7´Ñ7´Ê7´Ã7´¼7´µ7´®7´§7´ 7´™7´’7´‹7´„7´}7´v7´o7´h7´a7´Z7´S7´L7´E7´>7´77´07´)7´"7´7´7´ 7´7´ÿ6´ø6´ñ6´ê6´ã6´Ü6´Õ6´Î6´Ç6´À6´¹6´²6´«6´¤6´6´–6´6´ˆ6´6´z6´s6´l6´e6´^6´W6´P6´I6´B6´;6´46´-6´&6´6´6´6´ 6´6´ü5´õ5´î5´ç5´à5´Ù5´Ò5´Ë5´Ä5´½5´¶5´¯5´¨5´¡5´š5´“5´Œ5´…5´~5´w5´p5´i5´b5´[5´T5´M5´F5´?5´85´15´*5´#5´5´5´5´5´5´ù4´ò4´ë4´ä4´Ý4´Ö4´Ï4´È4´Á4´º4´³4´¬4´¥4´ž4´—4´4´‰4´‚4´{4´t4´m4´f4´_4´X4´Q4´J4´C4´<4´54´.4´'4´ 4´4´4´ 4´4´ý3´ö3´ï3´è3´á3´Ú3´Ó3´Ì3´Å3´¾3´·3´°3´©3´¢3´›3´”3´3´†3´3´x3´q3´j3´c3´\3´U3´N3´G3´@3´93´23´+3´$3´3´3´3´3´3´ú2´ó2´ì2´å2´Þ2´×2´Ð2´É2´Â2´»2´´2´­2´¦2´Ÿ2´˜2´‘2´Š2´ƒ2´|2´u2´n2´g2´`2´Y2´R2´K2´D2´=2´62´/2´(2´!2´2´2´ 2´2´þ1´÷1´ð1´é1´â1´Û1´Ô1´Í1´Æ1´¿1´¸1´±1´ª1´£1´œ1´•1´Ž1´‡1´€1´y1´r1´k1´d1´]1´V1´O1´H1´A1´:1´31´,1´%1´1´1´1´ 1´1´û0´ô0´í0´æ0´ß0´Ø0´Ñ0´Ê0´Ã0´¼0´µ0´®0´§0´ 0´™0´’0´‹0´„0´}0´v0´o0´h0´a0´Z0´S0´L0´E0´>0´70´00´)0´"0´0´0´ 0´0´ÿ/´ø/´ñ/´ê/´ã/´Ü/´Õ/´Î/´Ç/´À/´¹/´²/´«/´¤/´/´–/´/´ˆ/´/´z/´s/´l/´e/´^/´W/´P/´I/´B/´;/´4/´-/´&/´/´/´/´ /´/´ü.´õ.´î.´ç.´à.´Ù.´Ò.´Ë.´Ä.´½.´¶.´¯.´¨.´¡.´š.´“.´Œ.´….´~.´w.´p.´i.´b.´[.´T.´M.´F.´?.´8.´1.´*.´#.´.´.´.´.´.´ù-´ò-´ë-´ä-´Ý-´Ö-´Ï-´È-´Á-´º-´³-´¬-´¥-´ž-´—-´-´‰-´‚-´{-´t-´m-´f-´_-´X-´Q-´J-´C-´<-´5-´.-´'-´ -´-´-´ -´-´ý,´ö,´ï,´è,´á,´Ú,´Ó,´Ì,´Å,´¾,´·,´°,´©,´¢,´›,´”,´,´†,´,´x,´q,´j,´c,´\,´U,´N,´G,´@,´9,´2,´+,´$,´,´,´,´,´,´ú+´ó+´ì+´å+´Þ+´×+´Ð+´É+´Â+´»+´´+´­+´¦+´Ÿ+´˜+´‘+´Š+´ƒ+´|+´u+´n+´g+´`+´Y+´R+´K+´D+´=+´6+´/+´(+´!+´+´+´ +´+´þ*´÷*´ð*´é*´â*´Û*´Ô*´Í*´Æ*´¿*´¸*´±*´ª*´£*´œ*´•*´Ž*´‡*´€*´y*´r*´k*´d*´]*´V*´O*´H*´A*´:*´3*´,*´%*´*´*´*´ *´*´û)´ô)´í)´æ)´ß)´Ø)´Ñ)´Ê)´Ã)´¼)´µ)´®)´§)´ )´™)´’)´‹)´„)´})´v)´o)´h)´a)´Z)´S)´L)´E)´>)´7)´0)´))´")´)´)´ )´)´ÿ(´ø(´ñ(´ê(´ã(´Ü(´Õ(´Î(´Ç(´À(´¹(´²(´«(´¤(´(´–(´(´ˆ(´(´z(´s(´l(´e(´^(´W(´P(´I(´B(´;(´4(´-(´&(´(´(´(´ (´(´ü'´õ'´î'´ç'´à'´Ù'´Ò'´Ë'´Ä'´½'´¶'´¯'´¨'´¡'´š'´“'´Œ'´…'´~'´w'´p'´i'´b'´['´T'´M'´F'´?'´8'´1'´*'´#'´'´'´'´'´'´ù&´ò&´ë&´ä&´Ý&´Ö&´Ï&´È&´Á&´º&´³&´¬&´¥&´ž&´—&´&´‰&´‚&´{&´t&´m&´f&´_&´X&´Q&´J&´C&´<&´5&´.&´'&´ &´&´&´ &´&´ý%´ö%´ï%´è%´á%´Ú%´Ó%´Ì%´Å%´¾%´·%´°%´©%´¢%´›%´”%´%´†%´%´x%´q%´j%´c%´\%´U%´N%´G%´@%´9%´2%´+%´$%´%´%´%´%´%´ú$´ó$´ì$´å$´Þ$´×$´Ð$´É$´Â$´»$´´$´­$´¦$´Ÿ$´˜$´‘$´Š$´ƒ$´|$´u$´n$´g$´`$´Y$´R$´K$´D$´=$´6$´/$´($´!$´$´$´ $´$´þ#´÷#´ð#´é#´â#´Û#´Ô#´Í#´Æ#´¿#´¸#´±#´ª#´£#´œ#´•#´Ž#´‡#´€#´y#´r#´k#´d#´]#´V#´O#´H#´A#´:#´3#´,#´%#´#´#´#´ #´#´û"´ô"´í"´æ"´ß"´Ø"´Ñ"´Ê"´Ã"´¼"´µ"´®"´§"´ "´™"´’"´‹"´„"´}"´v"´o"´h"´a"´Z"´S"´L"´E"´>"´7"´0"´)"´""´"´"´ "´"´ÿ!´ø!´ñ!´ê!´ã!´Ü!´Õ!´Î!´Ç!´À!´¹!´²!´«!´¤!´!´–!´!´ˆ!´!´z!´s!´l!´e!´^!´W!´P!´I!´B!´;!´4!´-!´&!´!´!´!´ !´!´ü ´õ ´î ´ç ´à ´Ù ´Ò ´Ë ´Ä ´½ ´¶ ´¯ ´¨ ´¡ ´š ´“ ´Œ ´… ´~ ´w ´p ´i ´b ´[ ´T ´M ´F ´? ´8 ´1 ´* ´# ´ ´ ´ ´ ´ ´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û´ô´í´æ´ß´Ø´Ñ´Ê´Ã´¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ´ø´ñ´ê´ã´Ü´Õ´Î´Ç´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û´ô´í´æ´ß´Ø´Ñ´Ê´Ã´¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ´ø´ñ´ê´ã´Ü´Õ´Î´Ç´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û ´ô ´í ´æ ´ß ´Ø ´Ñ ´Ê ´à ´¼ ´µ ´® ´§ ´  ´™ ´’ ´‹ ´„ ´} ´v ´o ´h ´a ´Z ´S ´L ´E ´> ´7 ´0 ´) ´" ´ ´ ´ ´ ´ÿ ´ø ´ñ ´ê ´ã ´Ü ´Õ ´Î ´Ç ´À ´¹ ´² ´« ´¤ ´ ´– ´ ´ˆ ´ ´z ´s ´l ´e ´^ ´W ´P ´I ´B ´; ´4 ´- ´& ´ ´ ´ ´ ´ ´ü ´õ ´î ´ç ´à ´Ù ´Ò ´Ë ´Ä ´½ ´¶ ´¯ ´¨ ´¡ ´š ´“ ´Œ ´… ´~ ´w ´p ´i ´b ´[ ´T ´M ´F ´? ´8 ´1 ´* ´# ´ ´ ´ ´ ´ ´ù ´ò ´ë ´ä ´Ý ´Ö ´Ï ´È ´Á ´º ´³ ´¬ ´¥ ´ž ´— ´ ´‰ ´‚ ´{ ´t ´m ´f ´_ ´X ´Q ´J ´C ´< ´5 ´. ´' ´ ´ ´ ´ ´ ´ý ´ö ´ï ´è ´á ´Ú ´Ó ´Ì ´Å ´¾ ´· ´° ´© ´¢ ´› ´” ´ ´† ´ ´x ´q ´j ´c ´\ ´U ´N ´G ´@ ´9 ´2 ´+ ´$ ´ ´ ´ ´ ´ ´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û´ô´í´æ´ß´Ø´Ñ´Ê´Ã´¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ´ø´ñ´ê´ã´Ü´Õ´Î´Ç´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú´ó´ì´å´Þ´×´Ð´É´Â´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´ûÿ³ôÿ³íÿ³æÿ³ßÿ³Øÿ³Ñÿ³Êÿ³Ãÿ³¼ÿ³µÿ³®ÿ³§ÿ³ ÿ³™ÿ³’ÿ³‹ÿ³„ÿ³}ÿ³vÿ³oÿ³hÿ³aÿ³Zÿ³Sÿ³Lÿ³Eÿ³>ÿ³7ÿ³0ÿ³)ÿ³"ÿ³ÿ³ÿ³ ÿ³ÿ³ÿþ³øþ³ñþ³êþ³ãþ³Üþ³Õþ³Îþ³Çþ³Àþ³¹þ³²þ³«þ³¤þ³þ³–þ³þ³ˆþ³þ³zþ³sþ³lþ³eþ³^þ³Wþ³Pþ³Iþ³Bþ³;þ³4þ³-þ³&þ³þ³þ³þ³ þ³þ³üý³õý³îý³çý³àý³Ùý³Òý³Ëý³Äý³½ý³¶ý³¯ý³¨ý³¡ý³šý³“ý³Œý³…ý³~ý³wý³pý³iý³bý³[ý³Tý³Mý³Fý³?ý³8ý³1ý³*ý³#ý³ý³ý³ý³ý³ý³ùü³òü³ëü³äü³Ýü³Öü³Ïü³Èü³Áü³ºü³³ü³¬ü³¥ü³žü³—ü³ü³‰ü³‚ü³{ü³tü³mü³fü³_ü³Xü³Qü³Jü³Cü³<ü³5ü³.ü³'ü³ ü³ü³ü³ ü³ü³ýû³öû³ïû³èû³áû³Úû³Óû³Ìû³Åû³¾û³·û³°û³©û³¢û³›û³”û³û³†û³û³xû³qû³jû³cû³\û³Uû³Nû³Gû³@û³9û³2û³+û³$û³û³û³û³û³û³úú³óú³ìú³åú³Þú³×ú³Ðú³Éú³Âú³»ú³´ú³­ú³¦ú³Ÿú³˜ú³‘ú³Šú³ƒú³|ú³uú³nú³gú³`ú³Yú³Rú³Kú³Dú³=ú³6ú³/ú³(ú³!ú³ú³ú³ ú³ú³þù³÷ù³ðù³éù³âù³Ûù³Ôù³Íù³Æù³¿ù³¸ù³±ù³ªù³£ù³œù³•ù³Žù³‡ù³€ù³yù³rù³kù³dù³]ù³Vù³Où³Hù³Aù³:ù³3ù³,ù³%ù³ù³ù³ù³ ù³ù³ûø³ôø³íø³æø³ßø³Øø³Ñø³Êø³Ãø³¼ø³µø³®ø³§ø³ ø³™ø³’ø³‹ø³„ø³}ø³vø³oø³hø³aø³Zø³Sø³Lø³Eø³>ø³7ø³0ø³)ø³"ø³ø³ø³ ø³ø³ÿ÷³ø÷³ñ÷³ê÷³ã÷³Ü÷³Õ÷³Î÷³Ç÷³À÷³¹÷³²÷³«÷³¤÷³÷³–÷³÷³ˆ÷³÷³z÷³s÷³l÷³e÷³^÷³W÷³P÷³I÷³B÷³;÷³4÷³-÷³&÷³÷³÷³÷³ ÷³÷³üö³õö³îö³çö³àö³Ùö³Òö³Ëö³Äö³½ö³¶ö³¯ö³¨ö³¡ö³šö³“ö³Œö³…ö³~ö³wö³pö³iö³bö³[ö³Tö³Mö³Fö³?ö³8ö³1ö³*ö³#ö³ö³ö³ö³ö³ö³ùõ³òõ³ëõ³äõ³Ýõ³Öõ³Ïõ³Èõ³Áõ³ºõ³³õ³¬õ³¥õ³žõ³—õ³õ³‰õ³‚õ³{õ³tõ³mõ³fõ³_õ³Xõ³Qõ³Jõ³Cõ³<õ³5õ³.õ³'õ³ õ³õ³õ³ õ³õ³ýô³öô³ïô³èô³áô³Úô³Óô³Ìô³Åô³¾ô³·ô³°ô³©ô³¢ô³›ô³”ô³ô³†ô³ô³xô³qô³jô³cô³\ô³Uô³Nô³Gô³@ô³9ô³2ô³+ô³$ô³ô³ô³ô³ô³ô³úó³óó³ìó³åó³Þó³×ó³Ðó³Éó³Âó³»ó³´ó³­ó³¦ó³Ÿó³˜ó³‘ó³Šó³ƒó³|ó³uó³nó³gó³`ó³Yó³Ró³Kó³Dó³=ó³6ó³/ó³(ó³!ó³ó³ó³ ó³ó³þò³÷ò³ðò³éò³âò³Ûò³Ôò³Íò³Æò³¿ò³¸ò³±ò³ªò³£ò³œò³•ò³Žò³‡ò³€ò³yò³rò³kò³dò³]ò³Vò³Oò³Hò³Aò³:ò³3ò³,ò³%ò³ò³ò³ò³ ò³ò³ûñ³ôñ³íñ³æñ³ßñ³Øñ³Ññ³Êñ³Ãñ³¼ñ³µñ³®ñ³§ñ³ ñ³™ñ³’ñ³‹ñ³„ñ³}ñ³vñ³oñ³hñ³añ³Zñ³Sñ³Lñ³Eñ³>ñ³7ñ³0ñ³)ñ³"ñ³ñ³ñ³ ñ³ñ³ÿð³øð³ñð³êð³ãð³Üð³Õð³Îð³Çð³Àð³¹ð³²ð³«ð³¤ð³ð³–ð³ð³ˆð³ð³zð³sð³lð³eð³^ð³Wð³Pð³Ið³Bð³;ð³4ð³-ð³&ð³ð³ð³ð³ ð³ð³üï³õï³îï³çï³àï³Ùï³Òï³Ëï³Äﳽﳶﳯﳨﳡﳚﳓﳌﳅï³~ï³wï³pï³iï³bï³[ï³Tï³Mï³Fï³?ï³8ï³1ï³*ï³#ï³ï³ï³ï³ï³ï³ùî³òî³ëî³äî³Ýî³Öî³Ïî³Èî³Áî³î³‰î³‚î³{î³tî³mî³fî³_î³Xî³Qî³Jî³Cî³<î³5î³.î³'î³ î³î³î³ î³î³ýí³öí³ïí³èí³áí³Úí³Óí³Ìí³Åí³¾í³·í³°í³©í³¢í³›í³”í³í³†í³í³xí³qí³jí³cí³\í³Uí³Ní³Gí³@í³9í³2í³+í³$í³í³í³í³í³í³úì³óì³ìì³åì³Þì³×ì³Ðì³Éì³Â쳻쳴쳭쳦쳟쳘쳑쳊쳃ì³|ì³uì³nì³gì³`ì³Yì³Rì³Kì³Dì³=ì³6ì³/ì³(ì³!ì³ì³ì³ ì³ì³þë³÷ë³ðë³éë³âë³Ûë³Ôë³Íë³Æë³¿ë³¸ë³±ë³ªë³£ë³œë³•ë³Žë³‡ë³€ë³yë³rë³kë³dë³]ë³Vë³Oë³Hë³Aë³:ë³3ë³,ë³%ë³ë³ë³ë³ ë³ë³ûê³ôê³íê³æê³ßê³Øê³Ñê³Êê³Ã과공곮곧고곙곒곋계ê³}ê³vê³oê³hê³aê³Zê³Sê³Lê³Eê³>ê³7ê³0ê³)ê³"ê³ê³ê³ ê³ê³ÿé³øé³ñé³êé³ãé³Üé³Õé³Îé³Çé³À鳹鳲鳫鳤é³é³–é³é³ˆé³é³zé³sé³lé³eé³^é³Wé³Pé³Ié³Bé³;é³4é³-é³&é³é³é³é³ é³é³üè³õè³îè³çè³àè³Ùè³Òè³Ëè³Ä賽賶賯賨賡賚賓賌賅è³~è³wè³pè³iè³bè³[è³Tè³Mè³Fè³?è³8è³1è³*è³#è³è³è³è³è³è³ùç³òç³ëç³äç³Ýç³Öç³Ïç³Èç³Á糺糳糬糥糞糗ç³ç³‰ç³‚ç³{ç³tç³mç³fç³_ç³Xç³Qç³Jç³Cç³<ç³5ç³.ç³'ç³ ç³ç³ç³ ç³ç³ýæ³öæ³ïæ³èæ³áæ³Úæ³Óæ³Ìæ³Åæ³¾æ³·æ³°æ³©æ³¢æ³›æ³”æ³æ³†æ³æ³xæ³qæ³jæ³cæ³\æ³Uæ³Næ³Gæ³@æ³9æ³2æ³+æ³$æ³æ³æ³æ³æ³æ³úå³óå³ìå³åå³Þå³×å³Ðå³Éå³Â峻峴峭峦峟峘峑峊峃å³|å³uå³nå³gå³`å³Yå³Rå³Kå³Då³=å³6å³/å³(å³!å³å³å³ å³å³þä³÷ä³ðä³éä³âä³Ûä³Ôä³Íä³Æä³¿ä³¸ä³±ä³ªä³£ä³œä³•ä³Žä³‡ä³€ä³yä³rä³kä³dä³]ä³Vä³Oä³Hä³Aä³:ä³3ä³,ä³%ä³ä³ä³ä³ ä³ä³ûã³ôã³íã³æã³ßã³Øã³Ñã³Êã³Ã㳼㳵㳮㳧㳠㳙㳒㳋㳄ã³}ã³vã³oã³hã³aã³Zã³Sã³Lã³Eã³>ã³7ã³0ã³)ã³"ã³ã³ã³ ã³ã³ÿâ³øâ³ñâ³êâ³ãâ³Üâ³Õâ³Îâ³Çâ³À⳹ⳲⳫⳤâ³â³–â³â³ˆâ³â³zâ³sâ³lâ³eâ³^â³Wâ³Pâ³Iâ³Bâ³;â³4â³-â³&â³â³â³â³ â³â³üá³õá³îá³çá³àá³Ùá³Òá³Ëá³Ä᳽ᳶᳯ᳨᳡᳚᳓᳌᳅á³~á³wá³pá³iá³bá³[á³Tá³Má³Fá³?á³8á³1á³*á³#á³á³á³á³á³á³ùà³òà³ëà³äà³Ýà³Öà³Ïà³Èà³Á೺ೳ೬೥ೞ೗à³à³‰à³‚à³{à³tà³mà³fà³_à³Xà³Qà³Jà³Cà³<à³5à³.à³'à³ à³à³à³ à³à³ýß³öß³ïß³èß³áß³Úß³Óß³Ìß³Åß³¾ß³·ß³°ß³©ß³¢ß³›ß³”߳߳†ß³ß³xß³qß³jß³cß³\ß³Uß³Nß³Gß³@ß³9ß³2ß³+ß³$߳߳߳߳߳߳úÞ³óÞ³ìÞ³åÞ³ÞÞ³×Þ³ÐÞ³ÉÞ³ÂÞ³»Þ³´Þ³­Þ³¦Þ³ŸÞ³˜Þ³‘Þ³ŠÞ³ƒÞ³|Þ³uÞ³nÞ³gÞ³`Þ³YÞ³RÞ³KÞ³DÞ³=Þ³6Þ³/Þ³(Þ³!Þ³Þ³Þ³ Þ³Þ³þݳ÷ݳðݳéݳâݳÛݳÔݳÍݳÆÝ³¿Ý³¸Ý³±Ý³ªÝ³£Ý³œÝ³•ݳŽÝ³‡Ý³€Ý³yݳrݳkݳdݳ]ݳVݳOݳHݳAݳ:ݳ3ݳ,ݳ%ݳݳݳݳ ݳݳûܳôܳíܳæÜ³ßܳØÜ³ÑܳÊܳÃܳ¼Ü³µÜ³®Ü³§Ü³ Ü³™Ü³’ܳ‹Ü³„ܳ}ܳvܳoܳhܳaܳZܳSܳLܳEܳ>ܳ7ܳ0ܳ)ܳ"ܳܳܳ ܳܳÿÛ³øÛ³ñÛ³êÛ³ãÛ³ÜÛ³ÕÛ³ÎÛ³ÇÛ³ÀÛ³¹Û³²Û³«Û³¤Û³Û³–Û³Û³ˆÛ³Û³zÛ³sÛ³lÛ³eÛ³^Û³WÛ³PÛ³IÛ³BÛ³;Û³4Û³-Û³&Û³Û³Û³Û³ Û³Û³üÚ³õÚ³îÚ³çÚ³àÚ³ÙÚ³ÒÚ³ËÚ³ÄÚ³½Ú³¶Ú³¯Ú³¨Ú³¡Ú³šÚ³“Ú³ŒÚ³…Ú³~Ú³wÚ³pÚ³iÚ³bÚ³[Ú³TÚ³MÚ³FÚ³?Ú³8Ú³1Ú³*Ú³#Ú³Ú³Ú³Ú³Ú³Ú³ùÙ³òÙ³ëÙ³äÙ³ÝÙ³ÖÙ³ÏÙ³ÈÙ³ÁÙ³ºÙ³³Ù³¬Ù³¥Ù³žÙ³—ٳٳ‰Ù³‚Ù³{Ù³tÙ³mÙ³fÙ³_Ù³XÙ³QÙ³JÙ³CÙ³<Ù³5Ù³.Ù³'Ù³ ٳٳٳ ٳٳýسöسïØ³èØ³áØ³ÚØ³ÓØ³ÌØ³Åس¾Ø³·Ø³°Ø³©Ø³¢Ø³›Ø³”سس†Ø³سxسqسjسcس\سUسNسGس@س9س2س+س$سسسسسسú׳ó׳ì׳å׳Þ׳×׳Ð׳É׳Â׳»×³´×³­×³¦×³Ÿ×³˜×³‘׳Š×³ƒ×³|׳u׳n׳g׳`׳Y׳R׳K׳D׳=׳6׳/׳(׳!׳׳׳ ׳׳þÖ³÷Ö³ðÖ³éÖ³âÖ³ÛÖ³ÔÖ³ÍÖ³ÆÖ³¿Ö³¸Ö³±Ö³ªÖ³£Ö³œÖ³•Ö³ŽÖ³‡Ö³€Ö³yÖ³rÖ³kÖ³dÖ³]Ö³VÖ³OÖ³HÖ³AÖ³:Ö³3Ö³,Ö³%Ö³Ö³Ö³Ö³ Ö³Ö³ûÕ³ôÕ³íÕ³æÕ³ßÕ³ØÕ³ÑÕ³ÊÕ³ÃÕ³¼Õ³µÕ³®Õ³§Õ³ Õ³™Õ³’Õ³‹Õ³„Õ³}Õ³vÕ³oÕ³hÕ³aÕ³ZÕ³SÕ³LÕ³EÕ³>Õ³7Õ³0Õ³)Õ³"Õ³Õ³Õ³ Õ³Õ³ÿÔ³øÔ³ñÔ³êÔ³ãÔ³ÜÔ³ÕÔ³ÎÔ³ÇÔ³ÀÔ³¹Ô³²Ô³«Ô³¤Ô³Ô³–Ô³Ô³ˆÔ³Ô³zÔ³sÔ³lÔ³eÔ³^Ô³WÔ³PÔ³IÔ³BÔ³;Ô³4Ô³-Ô³&Ô³Ô³Ô³Ô³ Ô³Ô³üÓ³õÓ³îÓ³çÓ³àÓ³ÙÓ³ÒÓ³ËÓ³ÄÓ³½Ó³¶Ó³¯Ó³¨Ó³¡Ó³šÓ³“Ó³ŒÓ³…Ó³~Ó³wÓ³pÓ³iÓ³bÓ³[Ó³TÓ³MÓ³FÓ³?Ó³8Ó³1Ó³*Ó³#Ó³Ó³Ó³Ó³Ó³Ó³ùÒ³òÒ³ëÒ³äÒ³ÝÒ³ÖÒ³ÏÒ³ÈÒ³ÁÒ³ºÒ³³Ò³¬Ò³¥Ò³žÒ³—Ò³Ò³‰Ò³‚Ò³{Ò³tÒ³mÒ³fÒ³_Ò³XÒ³QÒ³JÒ³CÒ³<Ò³5Ò³.Ò³'Ò³ Ò³Ò³Ò³ Ò³Ò³ýѳöѳïѳèѳáѳÚѳÓѳÌѳÅѳ¾Ñ³·Ñ³°Ñ³©Ñ³¢Ñ³›Ñ³”ѳѳ†Ñ³ѳxѳqѳjѳcѳ\ѳUѳNѳGѳ@ѳ9ѳ2ѳ+ѳ$ѳѳѳѳѳѳúгóгìгåгÞг×гÐгÉгÂг»Ð³´Ð³­Ð³¦Ð³ŸÐ³˜Ð³‘гŠÐ³ƒÐ³|гuгnгgг`гYгRгKгDг=г6г/г(г!ггг ггþϳ÷ϳðϳéϳâϳÛϳÔϳÍϳÆÏ³¿Ï³¸Ï³±Ï³ªÏ³£Ï³œÏ³•ϳŽÏ³‡Ï³€Ï³yϳrϳkϳdϳ]ϳVϳOϳHϳAϳ:ϳ3ϳ,ϳ%ϳϳϳϳ ϳϳûγôγíγæÎ³ßγØÎ³ÑγÊγÃγ¼Î³µÎ³®Î³§Î³ Î³™Î³’γ‹Î³„γ}γvγoγhγaγZγSγLγEγ>γ7γ0γ)γ"γγγ γγÿͳøÍ³ñͳêͳãͳÜͳÕͳÎͳÇͳÀͳ¹Í³²Í³«Í³¤Í³ͳ–ͳͳˆÍ³ͳzͳsͳlͳeͳ^ͳWͳPͳIͳBͳ;ͳ4ͳ-ͳ&ͳͳͳͳ ͳͳü̳õ̳î̳ç̳à̳Ù̳Ò̳Ë̳Ä̳½Ì³¶Ì³¯Ì³¨Ì³¡Ì³šÌ³“̳ŒÌ³…̳~̳w̳p̳i̳b̳[̳T̳M̳F̳?̳8̳1̳*̳#̳̳̳̳̳̳ù˳ò˳ë˳ä˳Ý˳Ö˳Ï˳È˳Á˳ºË³³Ë³¬Ë³¥Ë³žË³—˳˳‰Ë³‚˳{˳t˳m˳f˳_˳X˳Q˳J˳C˳<˳5˳.˳'˳ ˳˳˳ ˳˳ýʳöʳïʳèʳáʳÚʳÓʳÌʳÅʳ¾Ê³·Ê³°Ê³©Ê³¢Ê³›Ê³”ʳʳ†Ê³ʳxʳqʳjʳcʳ\ʳUʳNʳGʳ@ʳ9ʳ2ʳ+ʳ$ʳʳʳʳʳʳúɳóɳìɳåɳÞɳ×ɳÐɳÉɳÂɳ»É³´É³­É³¦É³ŸÉ³˜É³‘ɳŠÉ³ƒÉ³|ɳuɳnɳgɳ`ɳYɳRɳKɳDɳ=ɳ6ɳ/ɳ(ɳ!ɳɳɳ ɳɳþȳ÷ȳðȳéȳâȳÛȳÔȳÍȳÆÈ³¿È³¸È³±È³ªÈ³£È³œÈ³•ȳŽÈ³‡È³€È³yȳrȳkȳdȳ]ȳVȳOȳHȳAȳ:ȳ3ȳ,ȳ%ȳȳȳȳ ȳȳûdzôdzídzæÇ³ßdzØÇ³ÑdzÊdzÃdz¼Ç³µÇ³®Ç³§Ç³ Ç³™Ç³’dz‹Ç³„dz}dzvdzodzhdzadzZdzSdzLdzEdz>dz7dz0dz)dz"dzdzdz dzdzÿƳøÆ³ñƳêÆ³ãÆ³ÜÆ³ÕÆ³ÎÆ³ÇƳÀƳ¹Æ³²Æ³«Æ³¤Æ³Ƴ–ƳƳˆÆ³ƳzƳsƳlƳeƳ^ƳWƳPƳIƳBƳ;Ƴ4Ƴ-Ƴ&ƳƳƳƳ ƳƳüųõųîųçųàųÙųÒųËųÄų½Å³¶Å³¯Å³¨Å³¡Å³šÅ³“ųŒÅ³…ų~ųwųpųiųbų[ųTųMųFų?ų8ų1ų*ų#ųųųųųųùijòijëijäijÝijÖijÏijÈijÁijºÄ³³Ä³¬Ä³¥Ä³žÄ³—ijij‰Ä³‚ij{ijtijmijfij_ijXijQijJijCij<ij5ij.ij'ij ijijij ijijýóöóïóèóáóÚóÓóÌóÅó¾Ã³·Ã³°Ã³©Ã³¢Ã³›Ã³”óó†Ã³óxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóú³ó³ì³å³Þ³׳гɳ³»Â³´Â³­Â³¦Â³ŸÂ³˜Â³‘³ŠÂ³ƒÂ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þÁ³÷Á³ðÁ³éÁ³âÁ³ÛÁ³ÔÁ³ÍÁ³ÆÁ³¿Á³¸Á³±Á³ªÁ³£Á³œÁ³•Á³ŽÁ³‡Á³€Á³yÁ³rÁ³kÁ³dÁ³]Á³VÁ³OÁ³HÁ³AÁ³:Á³3Á³,Á³%Á³Á³Á³Á³ Á³Á³ûÀ³ôÀ³íÀ³æÀ³ßÀ³ØÀ³ÑÀ³ÊÀ³ÃÀ³¼À³µÀ³®À³§À³ À³™À³’À³‹À³„À³}À³vÀ³oÀ³hÀ³aÀ³ZÀ³SÀ³LÀ³EÀ³>À³7À³0À³)À³"À³À³À³ À³À³ÿ¿³ø¿³ñ¿³꿳㿳Ü¿³Õ¿³ο³Ç¿³À¿³¹¿³²¿³«¿³¤¿³¿³–¿³¿³ˆ¿³¿³z¿³s¿³l¿³e¿³^¿³W¿³P¿³I¿³B¿³;¿³4¿³-¿³&¿³¿³¿³¿³ ¿³¿³ü¾³õ¾³î¾³ç¾³ླÙ¾³Ò¾³˾³ľ³½¾³¶¾³¯¾³¨¾³¡¾³š¾³“¾³Œ¾³…¾³~¾³w¾³p¾³i¾³b¾³[¾³T¾³M¾³F¾³?¾³8¾³1¾³*¾³#¾³¾³¾³¾³¾³¾³ù½³ò½³ë½³ä½³ݽ³Ö½³Ͻ³Ƚ³Á½³º½³³½³¬½³¥½³ž½³—½³½³‰½³‚½³{½³t½³m½³f½³_½³X½³Q½³J½³C½³<½³5½³.½³'½³ ½³½³½³ ½³½³ý¼³ö¼³ï¼³è¼³á¼³Ú¼³Ó¼³̼³ż³¾¼³·¼³°¼³©¼³¢¼³›¼³”¼³¼³†¼³¼³x¼³q¼³j¼³c¼³\¼³U¼³N¼³G¼³@¼³9¼³2¼³+¼³$¼³¼³¼³¼³¼³¼³ú»³ó»³컳廳Þ»³×»³л³É»³»³»»³´»³­»³¦»³Ÿ»³˜»³‘»³Š»³ƒ»³|»³u»³n»³g»³`»³Y»³R»³K»³D»³=»³6»³/»³(»³!»³»³»³ »³»³þº³÷º³ðº³麳⺳Ûº³Ôº³ͺ³ƺ³¿º³¸º³±º³ªº³£º³œº³•º³Žº³‡º³€º³yº³rº³kº³dº³]º³Vº³Oº³Hº³Aº³:º³3º³,º³%º³º³º³º³ º³º³û¹³ô¹³í¹³æ¹³ß¹³ع³ѹ³ʹ³ù³¼¹³µ¹³®¹³§¹³ ¹³™¹³’¹³‹¹³„¹³}¹³v¹³o¹³h¹³a¹³Z¹³S¹³L¹³E¹³>¹³7¹³0¹³)¹³"¹³¹³¹³ ¹³¹³ÿ¸³ø¸³ñ¸³긳㸳ܸ³Õ¸³θ³Ǹ³À¸³¹¸³²¸³«¸³¤¸³¸³–¸³¸³ˆ¸³¸³z¸³s¸³l¸³e¸³^¸³W¸³P¸³I¸³B¸³;¸³4¸³-¸³&¸³¸³¸³¸³ ¸³¸³ü·³õ·³î·³ç·³à·³Ù·³Ò·³Ë·³Ä·³½·³¶·³¯·³¨·³¡·³š·³“·³Œ·³…·³~·³w·³p·³i·³b·³[·³T·³M·³F·³?·³8·³1·³*·³#·³·³·³·³·³·³ù¶³ò¶³ë¶³ä¶³ݶ³Ö¶³϶³ȶ³Á¶³º¶³³¶³¬¶³¥¶³ž¶³—¶³¶³‰¶³‚¶³{¶³t¶³m¶³f¶³_¶³X¶³Q¶³J¶³C¶³<¶³5¶³.¶³'¶³ ¶³¶³¶³ ¶³¶³ýµ³öµ³ïµ³èµ³áµ³Úµ³Óµ³̵³ŵ³¾µ³·µ³°µ³©µ³¢µ³›µ³”µ³µ³†µ³µ³xµ³qµ³jµ³cµ³\µ³Uµ³Nµ³Gµ³@µ³9µ³2µ³+µ³$µ³µ³µ³µ³µ³µ³ú´³ó´³ì´³å´³Þ´³×´³д³É´³´³»´³´´³­´³¦´³Ÿ´³˜´³‘´³Š´³ƒ´³|´³u´³n´³g´³`´³Y´³R´³K´³D´³=´³6´³/´³(´³!´³´³´³ ´³´³þ³³÷³³ð³³é³³â³³Û³³Ô³³ͳ³Ƴ³¿³³¸³³±³³ª³³£³³œ³³•³³޳³‡³³€³³y³³r³³k³³d³³]³³V³³O³³H³³A³³:³³3³³,³³%³³³³³³³³ ³³³³û²³ô²³í²³æ²³ß²³ز³Ѳ³ʲ³ò³¼²³µ²³®²³§²³ ²³™²³’²³‹²³„²³}²³v²³o²³h²³a²³Z²³S²³L²³E²³>²³7²³0²³)²³"²³²³²³ ²³²³ÿ±³ø±³ñ±³ê±³ã±³ܱ³Õ±³α³DZ³À±³¹±³²±³«±³¤±³±³–±³±³ˆ±³±³z±³s±³l±³e±³^±³W±³P±³I±³B±³;±³4±³-±³&±³±³±³±³ ±³±³ü°³õ°³î°³ç°³à°³Ù°³Ò°³˰³ݳ½°³¶°³¯°³¨°³¡°³š°³“°³Œ°³…°³~°³w°³p°³i°³b°³[°³T°³M°³F°³?°³8°³1°³*°³#°³°³°³°³°³°³ù¯³ò¯³믳䯳ݯ³Ö¯³ϯ³ȯ³Á¯³º¯³³¯³¬¯³¥¯³ž¯³—¯³¯³‰¯³‚¯³{¯³t¯³m¯³f¯³_¯³X¯³Q¯³J¯³C¯³<¯³5¯³.¯³'¯³ ¯³¯³¯³ ¯³¯³ý®³ö®³﮳讳᮳Ú®³Ó®³Ì®³Å®³¾®³·®³°®³©®³¢®³›®³”®³®³†®³®³x®³q®³j®³c®³\®³U®³N®³G®³@®³9®³2®³+®³$®³®³®³®³®³®³ú­³ó­³ì­³å­³Þ­³×­³Э³É­³­³»­³´­³­­³¦­³Ÿ­³˜­³‘­³Š­³ƒ­³|­³u­³n­³g­³`­³Y­³R­³K­³D­³=­³6­³/­³(­³!­³­³­³ ­³­³þ¬³÷¬³ð¬³鬳⬳Û¬³Ô¬³ͬ³Ƭ³¿¬³¸¬³±¬³ª¬³£¬³œ¬³•¬³ެ³‡¬³€¬³y¬³r¬³k¬³d¬³]¬³V¬³O¬³H¬³A¬³:¬³3¬³,¬³%¬³¬³¬³¬³ ¬³¬³û«³ô«³í«³櫳ß«³Ø«³Ñ«³Ê«³ë³¼«³µ«³®«³§«³ «³™«³’«³‹«³„«³}«³v«³o«³h«³a«³Z«³S«³L«³E«³>«³7«³0«³)«³"«³«³«³ «³«³ÿª³øª³ñª³ꪳ㪳ܪ³Õª³Ϊ³Ǫ³Àª³¹ª³²ª³«ª³¤ª³ª³–ª³ª³ˆª³ª³zª³sª³lª³eª³^ª³Wª³Pª³Iª³Bª³;ª³4ª³-ª³&ª³ª³ª³ª³ ª³ª³ü©³õ©³穳ੳÙ©³Ò©³Ë©³Ä©³½©³¶©³¯©³¨©³¡©³š©³“©³Œ©³…©³~©³w©³p©³i©³b©³[©³T©³M©³F©³?©³8©³1©³*©³#©³©³©³©³©³©³ù¨³ò¨³먳䨳ݨ³Ö¨³Ϩ³Ȩ³Á¨³º¨³³¨³¬¨³¥¨³ž¨³—¨³¨³‰¨³‚¨³{¨³t¨³m¨³f¨³_¨³X¨³Q¨³J¨³C¨³<¨³5¨³.¨³'¨³ ¨³¨³¨³ ¨³¨³ý§³ö§³ï§³è§³á§³Ú§³Ó§³̧³ŧ³¾§³·§³°§³©§³¢§³›§³”§³§³†§³§³x§³q§³j§³c§³\§³U§³N§³G§³@§³9§³2§³+§³$§³§³§³§³§³§³ú¦³ó¦³즳妳Þ¦³צ³Ц³ɦ³¦³»¦³´¦³­¦³¦¦³Ÿ¦³˜¦³‘¦³Ц³ƒ¦³|¦³u¦³n¦³g¦³`¦³Y¦³R¦³K¦³D¦³=¦³6¦³/¦³(¦³!¦³¦³¦³ ¦³¦³þ¥³÷¥³ð¥³饳⥳Û¥³Ô¥³Í¥³Æ¥³¿¥³¸¥³±¥³ª¥³£¥³œ¥³•¥³Ž¥³‡¥³€¥³y¥³r¥³k¥³d¥³]¥³V¥³O¥³H¥³A¥³:¥³3¥³,¥³%¥³¥³¥³¥³ ¥³¥³û¤³ô¤³í¤³椳ߤ³ؤ³Ѥ³ʤ³ä³¼¤³µ¤³®¤³§¤³ ¤³™¤³’¤³‹¤³„¤³}¤³v¤³o¤³h¤³a¤³Z¤³S¤³L¤³E¤³>¤³7¤³0¤³)¤³"¤³¤³¤³ ¤³¤³ÿ£³ø£³ñ£³ꣳ㣳Ü£³Õ£³Σ³Ç£³À£³¹£³²£³«£³¤£³£³–£³£³ˆ£³£³z£³s£³l£³e£³^£³W£³P£³I£³B£³;£³4£³-£³&£³£³£³£³ £³£³ü¢³õ¢³碳ࢳÙ¢³Ò¢³Ë¢³Ä¢³½¢³¶¢³¯¢³¨¢³¡¢³š¢³“¢³Œ¢³…¢³~¢³w¢³p¢³i¢³b¢³[¢³T¢³M¢³F¢³?¢³8¢³1¢³*¢³#¢³¢³¢³¢³¢³¢³ù¡³ò¡³롳䡳Ý¡³Ö¡³Ï¡³È¡³Á¡³º¡³³¡³¬¡³¥¡³ž¡³—¡³¡³‰¡³‚¡³{¡³t¡³m¡³f¡³_¡³X¡³Q¡³J¡³C¡³<¡³5¡³.¡³'¡³ ¡³¡³¡³ ¡³¡³ý ³ö ³ï ³è ³á ³Ú ³Ó ³Ì ³Å ³¾ ³· ³° ³© ³¢ ³› ³” ³ ³† ³ ³x ³q ³j ³c ³\ ³U ³N ³G ³@ ³9 ³2 ³+ ³$ ³ ³ ³ ³ ³ ³úŸ³óŸ³쟳埳ÞŸ³ן³П³ÉŸ³Ÿ³»Ÿ³´Ÿ³­Ÿ³¦Ÿ³ŸŸ³˜Ÿ³‘Ÿ³ŠŸ³ƒŸ³|Ÿ³uŸ³nŸ³gŸ³`Ÿ³YŸ³RŸ³KŸ³DŸ³=Ÿ³6Ÿ³/Ÿ³(Ÿ³!Ÿ³Ÿ³Ÿ³ Ÿ³Ÿ³þž³÷ž³ðž³éž³âž³Ûž³Ôž³Íž³Æž³¿ž³¸ž³±ž³ªž³£ž³œž³•ž³Žž³‡ž³€ž³yž³rž³kž³dž³]ž³Vž³Ož³Hž³Až³:ž³3ž³,ž³%ž³ž³ž³ž³ ž³ž³û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿœ³øœ³ñœ³ꜳ㜳Üœ³Õœ³Μ³Çœ³Àœ³¹œ³²œ³«œ³¤œ³œ³–œ³œ³ˆœ³œ³zœ³sœ³lœ³eœ³^œ³Wœ³Pœ³Iœ³Bœ³;œ³4œ³-œ³&œ³œ³œ³œ³ œ³œ³ü›³õ›³盳à›³Ù›³Ò›³Ë›³Ä›³½›³¶›³¯›³¨›³¡›³š›³“›³Œ›³…›³~›³w›³p›³i›³b›³[›³T›³M›³F›³?›³8›³1›³*›³#›³›³›³›³›³›³ùš³òš³ëš³äš³Ýš³Öš³Ïš³Èš³Áš³ºš³³š³¬š³¥š³žš³—š³š³‰š³‚š³{š³tš³mš³fš³_š³Xš³Qš³Jš³Cš³<š³5š³.š³'š³ š³š³š³ š³š³ý™³ö™³虳ᙳÚ™³Ó™³Ì™³Å™³¾™³·™³°™³©™³¢™³›™³”™³™³†™³™³x™³q™³j™³c™³\™³U™³N™³G™³@™³9™³2™³+™³$™³™³™³™³™³™³ú˜³ó˜³옳嘳Þ˜³ט³И³ɘ³˜³»˜³´˜³­˜³¦˜³Ÿ˜³˜˜³‘˜³Š˜³ƒ˜³|˜³u˜³n˜³g˜³`˜³Y˜³R˜³K˜³D˜³=˜³6˜³/˜³(˜³!˜³˜³˜³ ˜³˜³þ—³÷—³ð—³é—³â—³Û—³Ô—³Í—³Æ—³¿—³¸—³±—³ª—³£—³œ—³•—³Ž—³‡—³€—³y—³r—³k—³d—³]—³V—³O—³H—³A—³:—³3—³,—³%—³—³—³—³ —³—³û–³ô–³í–³æ–³ß–³Ø–³Ñ–³Ê–³Ö³¼–³µ–³®–³§–³ –³™–³’–³‹–³„–³}–³v–³o–³h–³a–³Z–³S–³L–³E–³>–³7–³0–³)–³"–³–³–³ –³–³ÿ•³ø•³ñ•³ꕳ㕳Ü•³Õ•³Ε³Ç•³À•³¹•³²•³«•³¤•³•³–•³•³ˆ•³•³z•³s•³l•³e•³^•³W•³P•³I•³B•³;•³4•³-•³&•³•³•³•³ •³•³ü”³õ”³申à”³Ù”³Ò”³Ë”³Ä”³½”³¶”³¯”³¨”³¡”³š”³“”³Œ”³…”³~”³w”³p”³i”³b”³[”³T”³M”³F”³?”³8”³1”³*”³#”³”³”³”³”³”³ù“³ò“³듳䓳Ý“³Ö“³Ï“³È“³Á“³º“³³“³¬“³¥“³ž“³—“³“³‰“³‚“³{“³t“³m“³f“³_“³X“³Q“³J“³C“³<“³5“³.“³'“³ “³“³“³ “³“³ý’³ö’³ï’³è’³á’³Ú’³Ó’³Ì’³Å’³¾’³·’³°’³©’³¢’³›’³”’³’³†’³’³x’³q’³j’³c’³\’³U’³N’³G’³@’³9’³2’³+’³$’³’³’³’³’³’³ú‘³ó‘³쑳味Þ‘³ב³Б³É‘³‘³»‘³´‘³­‘³¦‘³Ÿ‘³˜‘³‘‘³Š‘³ƒ‘³|‘³u‘³n‘³g‘³`‘³Y‘³R‘³K‘³D‘³=‘³6‘³/‘³(‘³!‘³‘³‘³ ‘³‘³þ³÷³ð³é³â³Û³Ô³ͳƳ¿³¸³±³ª³£³œ³•³޳‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ޳øŽ³ñ޳ꎳ㎳ÜŽ³ÕŽ³ÎŽ³Ç޳À޳¹Ž³²Ž³«Ž³¤Ž³޳–޳޳ˆŽ³޳z޳s޳l޳e޳^޳W޳P޳I޳B޳;޳4޳-޳&޳޳޳޳ ޳޳ü³õ³î³ç³à³Ù³Ò³˳ij½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ùŒ³òŒ³댳䌳ÝŒ³ÖŒ³ÏŒ³ÈŒ³ÁŒ³ºŒ³³Œ³¬Œ³¥Œ³žŒ³—Œ³Œ³‰Œ³‚Œ³{Œ³tŒ³mŒ³fŒ³_Œ³XŒ³QŒ³JŒ³CŒ³<Œ³5Œ³.Œ³'Œ³ Œ³Œ³Œ³ Œ³Œ³ý‹³ö‹³苳ዳÚ‹³Ó‹³Ì‹³Å‹³¾‹³·‹³°‹³©‹³¢‹³›‹³”‹³‹³†‹³‹³x‹³q‹³j‹³c‹³\‹³U‹³N‹³G‹³@‹³9‹³2‹³+‹³$‹³‹³‹³‹³‹³‹³úгóг슳劳ÞŠ³׊³Њ³ÉŠ³г»Š³´Š³­Š³¦Š³ŸŠ³˜Š³‘гŠŠ³ƒŠ³|гuгnгgг`гYгRгKгDг=г6г/г(г!ггг ггþ‰³÷‰³ð‰³鉳≳Û‰³Ô‰³͉³Ɖ³¿‰³¸‰³±‰³ª‰³£‰³œ‰³•‰³މ³‡‰³€‰³y‰³r‰³k‰³d‰³]‰³V‰³O‰³H‰³A‰³:‰³3‰³,‰³%‰³‰³‰³‰³ ‰³‰³ûˆ³ôˆ³툳戳߈³؈³ш³ʈ³ȳ¼ˆ³µˆ³®ˆ³§ˆ³ ˆ³™ˆ³’ˆ³‹ˆ³„ˆ³}ˆ³vˆ³oˆ³hˆ³aˆ³Zˆ³Sˆ³Lˆ³Eˆ³>ˆ³7ˆ³0ˆ³)ˆ³"ˆ³ˆ³ˆ³ ˆ³ˆ³ÿ‡³ø‡³ñ‡³ꇳㇳ܇³Õ‡³·³LJ³À‡³¹‡³²‡³«‡³¤‡³‡³–‡³‡³ˆ‡³‡³z‡³s‡³l‡³e‡³^‡³W‡³P‡³I‡³B‡³;‡³4‡³-‡³&‡³‡³‡³‡³ ‡³‡³ü†³õ†³熳à†³Ù†³Ò†³ˆ³ó½†³¶†³¯†³¨†³¡†³š†³“†³Œ†³…†³~†³w†³p†³i†³b†³[†³T†³M†³F†³?†³8†³1†³*†³#†³†³†³†³†³†³ù…³ò…³ë…³ä…³Ý…³Ö…³Ï…³È…³Á…³º…³³…³¬…³¥…³ž…³—…³…³‰…³‚…³{…³t…³m…³f…³_…³X…³Q…³J…³C…³<…³5…³.…³'…³ …³…³…³ …³…³ý„³ö„³脳ᄳÚ„³Ó„³Ì„³Å„³¾„³·„³°„³©„³¢„³›„³”„³„³†„³„³x„³q„³j„³c„³\„³U„³N„³G„³@„³9„³2„³+„³$„³„³„³„³„³„³úƒ³óƒ³샳僳Þƒ³׃³Ѓ³Ƀ³ƒ³»ƒ³´ƒ³­ƒ³¦ƒ³Ÿƒ³˜ƒ³‘ƒ³Šƒ³ƒƒ³|ƒ³uƒ³nƒ³gƒ³`ƒ³Yƒ³Rƒ³Kƒ³Dƒ³=ƒ³6ƒ³/ƒ³(ƒ³!ƒ³ƒ³ƒ³ ƒ³ƒ³þ‚³÷‚³ð‚³邳₳Û‚³Ô‚³Í‚³Æ‚³¿‚³¸‚³±‚³ª‚³£‚³œ‚³•‚³Ž‚³‡‚³€‚³y‚³r‚³k‚³d‚³]‚³V‚³O‚³H‚³A‚³:‚³3‚³,‚³%‚³‚³‚³‚³ ‚³‚³û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ€³ø€³ñ€³ꀳ〳Ü€³Õ€³΀³Ç€³À€³¹€³²€³«€³¤€³€³–€³€³ˆ€³€³z€³s€³l€³e€³^€³W€³P€³I€³B€³;€³4€³-€³&€³€³€³€³ €³€³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù~³ò~³ë~³ä~³Ý~³Ö~³Ï~³È~³Á~³º~³³~³¬~³¥~³ž~³—~³~³‰~³‚~³{~³t~³m~³f~³_~³X~³Q~³J~³C~³<~³5~³.~³'~³ ~³~³~³ ~³~³ý}³ö}³ï}³è}³á}³Ú}³Ó}³Ì}³Å}³¾}³·}³°}³©}³¢}³›}³”}³}³†}³}³x}³q}³j}³c}³\}³U}³N}³G}³@}³9}³2}³+}³$}³}³}³}³}³}³ú|³ó|³ì|³å|³Þ|³×|³Ð|³É|³Â|³»|³´|³­|³¦|³Ÿ|³˜|³‘|³Š|³ƒ|³||³u|³n|³g|³`|³Y|³R|³K|³D|³=|³6|³/|³(|³!|³|³|³ |³|³þ{³÷{³ð{³é{³â{³Û{³Ô{³Í{³Æ{³¿{³¸{³±{³ª{³£{³œ{³•{³Ž{³‡{³€{³y{³r{³k{³d{³]{³V{³O{³H{³A{³:{³3{³,{³%{³{³{³{³ {³{³ûz³ôz³íz³æz³ßz³Øz³Ñz³Êz³Ãz³¼z³µz³®z³§z³ z³™z³’z³‹z³„z³}z³vz³oz³hz³az³Zz³Sz³Lz³Ez³>z³7z³0z³)z³"z³z³z³ z³z³ÿy³øy³ñy³êy³ãy³Üy³Õy³Îy³Çy³Ày³¹y³²y³«y³¤y³y³–y³y³ˆy³y³zy³sy³ly³ey³^y³Wy³Py³Iy³By³;y³4y³-y³&y³y³y³y³ y³y³üx³õx³îx³çx³àx³Ùx³Òx³Ëx³Äx³½x³¶x³¯x³¨x³¡x³šx³“x³Œx³…x³~x³wx³px³ix³bx³[x³Tx³Mx³Fx³?x³8x³1x³*x³#x³x³x³x³x³x³ùw³òw³ëw³äw³Ýw³Öw³Ïw³Èw³Áw³ºw³³w³¬w³¥w³žw³—w³w³‰w³‚w³{w³tw³mw³fw³_w³Xw³Qw³Jw³Cw³s³7s³0s³)s³"s³s³s³ s³s³ÿr³ør³ñr³êr³ãr³Ür³Õr³Îr³Çr³Àr³¹r³²r³«r³¤r³r³–r³r³ˆr³r³zr³sr³lr³er³^r³Wr³Pr³Ir³Br³;r³4r³-r³&r³r³r³r³ r³r³üq³õq³îq³çq³àq³Ùq³Òq³Ëq³Äq³½q³¶q³¯q³¨q³¡q³šq³“q³Œq³…q³~q³wq³pq³iq³bq³[q³Tq³Mq³Fq³?q³8q³1q³*q³#q³q³q³q³q³q³ùp³òp³ëp³äp³Ýp³Öp³Ïp³Èp³Áp³ºp³³p³¬p³¥p³žp³—p³p³‰p³‚p³{p³tp³mp³fp³_p³Xp³Qp³Jp³Cp³l³7l³0l³)l³"l³l³l³ l³l³ÿk³øk³ñk³êk³ãk³Ük³Õk³Îk³Çk³Àk³¹k³²k³«k³¤k³k³–k³k³ˆk³k³zk³sk³lk³ek³^k³Wk³Pk³Ik³Bk³;k³4k³-k³&k³k³k³k³ k³k³üj³õj³îj³çj³àj³Ùj³Òj³Ëj³Äj³½j³¶j³¯j³¨j³¡j³šj³“j³Œj³…j³~j³wj³pj³ij³bj³[j³Tj³Mj³Fj³?j³8j³1j³*j³#j³j³j³j³j³j³ùi³òi³ëi³äi³Ýi³Öi³Ïi³Èi³Ái³ºi³³i³¬i³¥i³ži³—i³i³‰i³‚i³{i³ti³mi³fi³_i³Xi³Qi³Ji³Ci³e³7e³0e³)e³"e³e³e³ e³e³ÿd³ød³ñd³êd³ãd³Üd³Õd³Îd³Çd³Àd³¹d³²d³«d³¤d³d³–d³d³ˆd³d³zd³sd³ld³ed³^d³Wd³Pd³Id³Bd³;d³4d³-d³&d³d³d³d³ d³d³üc³õc³îc³çc³àc³Ùc³Òc³Ëc³Äc³½c³¶c³¯c³¨c³¡c³šc³“c³Œc³…c³~c³wc³pc³ic³bc³[c³Tc³Mc³Fc³?c³8c³1c³*c³#c³c³c³c³c³c³ùb³òb³ëb³äb³Ýb³Öb³Ïb³Èb³Áb³ºb³³b³¬b³¥b³žb³—b³b³‰b³‚b³{b³tb³mb³fb³_b³Xb³Qb³Jb³Cb³^³7^³0^³)^³"^³^³^³ ^³^³ÿ]³ø]³ñ]³ê]³ã]³Ü]³Õ]³Î]³Ç]³À]³¹]³²]³«]³¤]³]³–]³]³ˆ]³]³z]³s]³l]³e]³^]³W]³P]³I]³B]³;]³4]³-]³&]³]³]³]³ ]³]³ü\³õ\³î\³ç\³à\³Ù\³Ò\³Ë\³Ä\³½\³¶\³¯\³¨\³¡\³š\³“\³Œ\³…\³~\³w\³p\³i\³b\³[\³T\³M\³F\³?\³8\³1\³*\³#\³\³\³\³\³\³ù[³ò[³ë[³ä[³Ý[³Ö[³Ï[³È[³Á[³º[³³[³¬[³¥[³ž[³—[³[³‰[³‚[³{[³t[³m[³f[³_[³X[³Q[³J[³C[³<[³5[³.[³'[³ [³[³[³ [³[³ýZ³öZ³ïZ³èZ³áZ³ÚZ³ÓZ³ÌZ³ÅZ³¾Z³·Z³°Z³©Z³¢Z³›Z³”Z³Z³†Z³Z³xZ³qZ³jZ³cZ³\Z³UZ³NZ³GZ³@Z³9Z³2Z³+Z³$Z³Z³Z³Z³Z³Z³úY³óY³ìY³åY³ÞY³×Y³ÐY³ÉY³ÂY³»Y³´Y³­Y³¦Y³ŸY³˜Y³‘Y³ŠY³ƒY³|Y³uY³nY³gY³`Y³YY³RY³KY³DY³=Y³6Y³/Y³(Y³!Y³Y³Y³ Y³Y³þX³÷X³ðX³éX³âX³ÛX³ÔX³ÍX³ÆX³¿X³¸X³±X³ªX³£X³œX³•X³ŽX³‡X³€X³yX³rX³kX³dX³]X³VX³OX³HX³AX³:X³3X³,X³%X³X³X³X³ X³X³ûW³ôW³íW³æW³ßW³ØW³ÑW³ÊW³ÃW³¼W³µW³®W³§W³ W³™W³’W³‹W³„W³}W³vW³oW³hW³aW³ZW³SW³LW³EW³>W³7W³0W³)W³"W³W³W³ W³W³ÿV³øV³ñV³êV³ãV³ÜV³ÕV³ÎV³ÇV³ÀV³¹V³²V³«V³¤V³V³–V³V³ˆV³V³zV³sV³lV³eV³^V³WV³PV³IV³BV³;V³4V³-V³&V³V³V³V³ V³V³üU³õU³îU³çU³àU³ÙU³ÒU³ËU³ÄU³½U³¶U³¯U³¨U³¡U³šU³“U³ŒU³…U³~U³wU³pU³iU³bU³[U³TU³MU³FU³?U³8U³1U³*U³#U³U³U³U³U³U³ùT³òT³ëT³äT³ÝT³ÖT³ÏT³ÈT³ÁT³ºT³³T³¬T³¥T³žT³—T³T³‰T³‚T³{T³tT³mT³fT³_T³XT³QT³JT³CT³P³7P³0P³)P³"P³P³P³ P³P³ÿO³øO³ñO³êO³ãO³ÜO³ÕO³ÎO³ÇO³ÀO³¹O³²O³«O³¤O³O³–O³O³ˆO³O³zO³sO³lO³eO³^O³WO³PO³IO³BO³;O³4O³-O³&O³O³O³O³ O³O³üN³õN³îN³çN³àN³ÙN³ÒN³ËN³ÄN³½N³¶N³¯N³¨N³¡N³šN³“N³ŒN³…N³~N³wN³pN³iN³bN³[N³TN³MN³FN³?N³8N³1N³*N³#N³N³N³N³N³N³ùM³òM³ëM³äM³ÝM³ÖM³ÏM³ÈM³ÁM³ºM³³M³¬M³¥M³žM³—M³M³‰M³‚M³{M³tM³mM³fM³_M³XM³QM³JM³CM³I³7I³0I³)I³"I³I³I³ I³I³ÿH³øH³ñH³êH³ãH³ÜH³ÕH³ÎH³ÇH³ÀH³¹H³²H³«H³¤H³H³–H³H³ˆH³H³zH³sH³lH³eH³^H³WH³PH³IH³BH³;H³4H³-H³&H³H³H³H³ H³H³üG³õG³îG³çG³àG³ÙG³ÒG³ËG³ÄG³½G³¶G³¯G³¨G³¡G³šG³“G³ŒG³…G³~G³wG³pG³iG³bG³[G³TG³MG³FG³?G³8G³1G³*G³#G³G³G³G³G³G³ùF³òF³ëF³äF³ÝF³ÖF³ÏF³ÈF³ÁF³ºF³³F³¬F³¥F³žF³—F³F³‰F³‚F³{F³tF³mF³fF³_F³XF³QF³JF³CF³B³7B³0B³)B³"B³B³B³ B³B³ÿA³øA³ñA³êA³ãA³ÜA³ÕA³ÎA³ÇA³ÀA³¹A³²A³«A³¤A³A³–A³A³ˆA³A³zA³sA³lA³eA³^A³WA³PA³IA³BA³;A³4A³-A³&A³A³A³A³ A³A³ü@³õ@³î@³ç@³à@³Ù@³Ò@³Ë@³Ä@³½@³¶@³¯@³¨@³¡@³š@³“@³Œ@³…@³~@³w@³p@³i@³b@³[@³T@³M@³F@³?@³8@³1@³*@³#@³@³@³@³@³@³ù?³ò?³ë?³ä?³Ý?³Ö?³Ï?³È?³Á?³º?³³?³¬?³¥?³ž?³—?³?³‰?³‚?³{?³t?³m?³f?³_?³X?³Q?³J?³C?³³ö>³ï>³è>³á>³Ú>³Ó>³Ì>³Å>³¾>³·>³°>³©>³¢>³›>³”>³>³†>³>³x>³q>³j>³c>³\>³U>³N>³G>³@>³9>³2>³+>³$>³>³>³>³>³>³ú=³ó=³ì=³å=³Þ=³×=³Ð=³É=³Â=³»=³´=³­=³¦=³Ÿ=³˜=³‘=³Š=³ƒ=³|=³u=³n=³g=³`=³Y=³R=³K=³D=³==³6=³/=³(=³!=³=³=³ =³=³þ<³÷<³ð<³é<³â<³Û<³Ô<³Í<³Æ<³¿<³¸<³±<³ª<³£<³œ<³•<³Ž<³‡<³€<³y<³r<³k<³d<³]<³V<³O<³H<³A<³:<³3<³,<³%<³<³<³<³ <³<³û;³ô;³í;³æ;³ß;³Ø;³Ñ;³Ê;³Ã;³¼;³µ;³®;³§;³ ;³™;³’;³‹;³„;³};³v;³o;³h;³a;³Z;³S;³L;³E;³>;³7;³0;³);³";³;³;³ ;³;³ÿ:³ø:³ñ:³ê:³ã:³Ü:³Õ:³Î:³Ç:³À:³¹:³²:³«:³¤:³:³–:³:³ˆ:³:³z:³s:³l:³e:³^:³W:³P:³I:³B:³;:³4:³-:³&:³:³:³:³ :³:³ü9³õ9³î9³ç9³à9³Ù9³Ò9³Ë9³Ä9³½9³¶9³¯9³¨9³¡9³š9³“9³Œ9³…9³~9³w9³p9³i9³b9³[9³T9³M9³F9³?9³89³19³*9³#9³9³9³9³9³9³ù8³ò8³ë8³ä8³Ý8³Ö8³Ï8³È8³Á8³º8³³8³¬8³¥8³ž8³—8³8³‰8³‚8³{8³t8³m8³f8³_8³X8³Q8³J8³C8³<8³58³.8³'8³ 8³8³8³ 8³8³ý7³ö7³ï7³è7³á7³Ú7³Ó7³Ì7³Å7³¾7³·7³°7³©7³¢7³›7³”7³7³†7³7³x7³q7³j7³c7³\7³U7³N7³G7³@7³97³27³+7³$7³7³7³7³7³7³ú6³ó6³ì6³å6³Þ6³×6³Ð6³É6³Â6³»6³´6³­6³¦6³Ÿ6³˜6³‘6³Š6³ƒ6³|6³u6³n6³g6³`6³Y6³R6³K6³D6³=6³66³/6³(6³!6³6³6³ 6³6³þ5³÷5³ð5³é5³â5³Û5³Ô5³Í5³Æ5³¿5³¸5³±5³ª5³£5³œ5³•5³Ž5³‡5³€5³y5³r5³k5³d5³]5³V5³O5³H5³A5³:5³35³,5³%5³5³5³5³ 5³5³û4³ô4³í4³æ4³ß4³Ø4³Ñ4³Ê4³Ã4³¼4³µ4³®4³§4³ 4³™4³’4³‹4³„4³}4³v4³o4³h4³a4³Z4³S4³L4³E4³>4³74³04³)4³"4³4³4³ 4³4³ÿ3³ø3³ñ3³ê3³ã3³Ü3³Õ3³Î3³Ç3³À3³¹3³²3³«3³¤3³3³–3³3³ˆ3³3³z3³s3³l3³e3³^3³W3³P3³I3³B3³;3³43³-3³&3³3³3³3³ 3³3³ü2³õ2³î2³ç2³à2³Ù2³Ò2³Ë2³Ä2³½2³¶2³¯2³¨2³¡2³š2³“2³Œ2³…2³~2³w2³p2³i2³b2³[2³T2³M2³F2³?2³82³12³*2³#2³2³2³2³2³2³ù1³ò1³ë1³ä1³Ý1³Ö1³Ï1³È1³Á1³º1³³1³¬1³¥1³ž1³—1³1³‰1³‚1³{1³t1³m1³f1³_1³X1³Q1³J1³C1³<1³51³.1³'1³ 1³1³1³ 1³1³ý0³ö0³ï0³è0³á0³Ú0³Ó0³Ì0³Å0³¾0³·0³°0³©0³¢0³›0³”0³0³†0³0³x0³q0³j0³c0³\0³U0³N0³G0³@0³90³20³+0³$0³0³0³0³0³0³ú/³ó/³ì/³å/³Þ/³×/³Ð/³É/³Â/³»/³´/³­/³¦/³Ÿ/³˜/³‘/³Š/³ƒ/³|/³u/³n/³g/³`/³Y/³R/³K/³D/³=/³6/³//³(/³!/³/³/³ /³/³þ.³÷.³ð.³é.³â.³Û.³Ô.³Í.³Æ.³¿.³¸.³±.³ª.³£.³œ.³•.³Ž.³‡.³€.³y.³r.³k.³d.³].³V.³O.³H.³A.³:.³3.³,.³%.³.³.³.³ .³.³û-³ô-³í-³æ-³ß-³Ø-³Ñ-³Ê-³Ã-³¼-³µ-³®-³§-³ -³™-³’-³‹-³„-³}-³v-³o-³h-³a-³Z-³S-³L-³E-³>-³7-³0-³)-³"-³-³-³ -³-³ÿ,³ø,³ñ,³ê,³ã,³Ü,³Õ,³Î,³Ç,³À,³¹,³²,³«,³¤,³,³–,³,³ˆ,³,³z,³s,³l,³e,³^,³W,³P,³I,³B,³;,³4,³-,³&,³,³,³,³ ,³,³ü+³õ+³î+³ç+³à+³Ù+³Ò+³Ë+³Ä+³½+³¶+³¯+³¨+³¡+³š+³“+³Œ+³…+³~+³w+³p+³i+³b+³[+³T+³M+³F+³?+³8+³1+³*+³#+³+³+³+³+³+³ù*³ò*³ë*³ä*³Ý*³Ö*³Ï*³È*³Á*³º*³³*³¬*³¥*³ž*³—*³*³‰*³‚*³{*³t*³m*³f*³_*³X*³Q*³J*³C*³<*³5*³.*³'*³ *³*³*³ *³*³ý)³ö)³ï)³è)³á)³Ú)³Ó)³Ì)³Å)³¾)³·)³°)³©)³¢)³›)³”)³)³†)³)³x)³q)³j)³c)³\)³U)³N)³G)³@)³9)³2)³+)³$)³)³)³)³)³)³ú(³ó(³ì(³å(³Þ(³×(³Ð(³É(³Â(³»(³´(³­(³¦(³Ÿ(³˜(³‘(³Š(³ƒ(³|(³u(³n(³g(³`(³Y(³R(³K(³D(³=(³6(³/(³((³!(³(³(³ (³(³þ'³÷'³ð'³é'³â'³Û'³Ô'³Í'³Æ'³¿'³¸'³±'³ª'³£'³œ'³•'³Ž'³‡'³€'³y'³r'³k'³d'³]'³V'³O'³H'³A'³:'³3'³,'³%'³'³'³'³ '³'³û&³ô&³í&³æ&³ß&³Ø&³Ñ&³Ê&³Ã&³¼&³µ&³®&³§&³ &³™&³’&³‹&³„&³}&³v&³o&³h&³a&³Z&³S&³L&³E&³>&³7&³0&³)&³"&³&³&³ &³&³ÿ%³ø%³ñ%³ê%³ã%³Ü%³Õ%³Î%³Ç%³À%³¹%³²%³«%³¤%³%³–%³%³ˆ%³%³z%³s%³l%³e%³^%³W%³P%³I%³B%³;%³4%³-%³&%³%³%³%³ %³%³ü$³õ$³î$³ç$³à$³Ù$³Ò$³Ë$³Ä$³½$³¶$³¯$³¨$³¡$³š$³“$³Œ$³…$³~$³w$³p$³i$³b$³[$³T$³M$³F$³?$³8$³1$³*$³#$³$³$³$³$³$³ù#³ò#³ë#³ä#³Ý#³Ö#³Ï#³È#³Á#³º#³³#³¬#³¥#³ž#³—#³#³‰#³‚#³{#³t#³m#³f#³_#³X#³Q#³J#³C#³<#³5#³.#³'#³ #³#³#³ #³#³ý"³ö"³ï"³è"³á"³Ú"³Ó"³Ì"³Å"³¾"³·"³°"³©"³¢"³›"³”"³"³†"³"³x"³q"³j"³c"³\"³U"³N"³G"³@"³9"³2"³+"³$"³"³"³"³"³"³ú!³ó!³ì!³å!³Þ!³×!³Ð!³É!³Â!³»!³´!³­!³¦!³Ÿ!³˜!³‘!³Š!³ƒ!³|!³u!³n!³g!³`!³Y!³R!³K!³D!³=!³6!³/!³(!³!!³!³!³ !³!³þ ³÷ ³ð ³é ³â ³Û ³Ô ³Í ³Æ ³¿ ³¸ ³± ³ª ³£ ³œ ³• ³Ž ³‡ ³€ ³y ³r ³k ³d ³] ³V ³O ³H ³A ³: ³3 ³, ³% ³ ³ ³ ³ ³ ³û³ô³í³æ³ß³Ø³Ñ³Ê³Ã³¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ³ø³ñ³ê³ã³Ü³Õ³Î³Ç³À³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù³ò³ë³ä³Ý³Ö³Ï³È³Á³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý³ö³ï³è³á³Ú³Ó³Ì³Å³¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú³ó³ì³å³Þ³×³Ð³É³Â³»³´³­³¦³Ÿ³˜³‘³Š³ƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ³÷³ð³é³â³Û³Ô³Í³Æ³¿³¸³±³ª³£³œ³•³Ž³‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û³ô³í³æ³ß³Ø³Ñ³Ê³Ã³¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ³ø³ñ³ê³ã³Ü³Õ³Î³Ç³À³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù³ò³ë³ä³Ý³Ö³Ï³È³Á³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý³ö³ï³è³á³Ú³Ó³Ì³Å³¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú³ó³ì³å³Þ³×³Ð³É³Â³»³´³­³¦³Ÿ³˜³‘³Š³ƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ³÷³ð³é³â³Û³Ô³Í³Æ³¿³¸³±³ª³£³œ³•³Ž³‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û³ô³í³æ³ß³Ø³Ñ³Ê³Ã³¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ³ø³ñ³ê³ã³Ü³Õ³Î³Ç³À³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù³ò³ë³ä³Ý³Ö³Ï³È³Á³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý ³ö ³ï ³è ³á ³Ú ³Ó ³Ì ³Å ³¾ ³· ³° ³© ³¢ ³› ³” ³ ³† ³ ³x ³q ³j ³c ³\ ³U ³N ³G ³@ ³9 ³2 ³+ ³$ ³ ³ ³ ³ ³ ³ú ³ó ³ì ³å ³Þ ³× ³Ð ³É ³ ³» ³´ ³­ ³¦ ³Ÿ ³˜ ³‘ ³Š ³ƒ ³| ³u ³n ³g ³` ³Y ³R ³K ³D ³= ³6 ³/ ³( ³! ³ ³ ³ ³ ³þ ³÷ ³ð ³é ³â ³Û ³Ô ³Í ³Æ ³¿ ³¸ ³± ³ª ³£ ³œ ³• ³Ž ³‡ ³€ ³y ³r ³k ³d ³] ³V ³O ³H ³A ³: ³3 ³, ³% ³ ³ ³ ³ ³ ³û ³ô ³í ³æ ³ß ³Ø ³Ñ ³Ê ³à ³¼ ³µ ³® ³§ ³  ³™ ³’ ³‹ ³„ ³} ³v ³o ³h ³a ³Z ³S ³L ³E ³> ³7 ³0 ³) ³" ³ ³ ³ ³ ³ÿ ³ø ³ñ ³ê ³ã ³Ü ³Õ ³Î ³Ç ³À ³¹ ³² ³« ³¤ ³ ³– ³ ³ˆ ³ ³z ³s ³l ³e ³^ ³W ³P ³I ³B ³; ³4 ³- ³& ³ ³ ³ ³ ³ ³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù³ò³ë³ä³Ý³Ö³Ï³È³Á³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý³ö³ï³è³á³Ú³Ó³Ì³Å³¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú³ó³ì³å³Þ³×³Ð³É³Â³»³´³­³¦³Ÿ³˜³‘³Š³ƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ³÷³ð³é³â³Û³Ô³Í³Æ³¿³¸³±³ª³£³œ³•³Ž³‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û³ô³í³æ³ß³Ø³Ñ³Ê³Ã³¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ³ø³ñ³ê³ã³Ü³Õ³Î³Ç³À³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü³õ³î³ç³à³Ù³Ò³Ë³Ä³½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ýÿ²öÿ²ïÿ²èÿ²áÿ²Úÿ²Óÿ²Ìÿ²Åÿ²¾ÿ²·ÿ²°ÿ²©ÿ²¢ÿ²›ÿ²”ÿ²ÿ²†ÿ²ÿ²xÿ²qÿ²jÿ²cÿ²\ÿ²Uÿ²Nÿ²Gÿ²@ÿ²9ÿ²2ÿ²+ÿ²$ÿ²ÿ²ÿ²ÿ²ÿ²ÿ²úþ²óþ²ìþ²åþ²Þþ²×þ²Ðþ²Éþ²Âþ²»þ²´þ²­þ²¦þ²Ÿþ²˜þ²‘þ²Šþ²ƒþ²|þ²uþ²nþ²gþ²`þ²Yþ²Rþ²Kþ²Dþ²=þ²6þ²/þ²(þ²!þ²þ²þ² þ²þ²þý²÷ý²ðý²éý²âý²Ûý²Ôý²Íý²Æý²¿ý²¸ý²±ý²ªý²£ý²œý²•ý²Žý²‡ý²€ý²yý²rý²ký²dý²]ý²Vý²Oý²Hý²Aý²:ý²3ý²,ý²%ý²ý²ý²ý² ý²ý²ûü²ôü²íü²æü²ßü²Øü²Ñü²Êü²Ãü²¼ü²µü²®ü²§ü² ü²™ü²’ü²‹ü²„ü²}ü²vü²oü²hü²aü²Zü²Sü²Lü²Eü²>ü²7ü²0ü²)ü²"ü²ü²ü² ü²ü²ÿû²øû²ñû²êû²ãû²Üû²Õû²Îû²Çû²Àû²¹û²²û²«û²¤û²û²–û²û²ˆû²û²zû²sû²lû²eû²^û²Wû²Pû²Iû²Bû²;û²4û²-û²&û²û²û²û² û²û²üú²õú²îú²çú²àú²Ùú²Òú²Ëú²Äú²½ú²¶ú²¯ú²¨ú²¡ú²šú²“ú²Œú²…ú²~ú²wú²pú²iú²bú²[ú²Tú²Mú²Fú²?ú²8ú²1ú²*ú²#ú²ú²ú²ú²ú²ú²ùù²òù²ëù²äù²Ýù²Öù²Ïù²Èù²Áù²ºù²³ù²¬ù²¥ù²žù²—ù²ù²‰ù²‚ù²{ù²tù²mù²fù²_ù²Xù²Qù²Jù²Cù²<ù²5ù².ù²'ù² ù²ù²ù² ù²ù²ýø²öø²ïø²èø²áø²Úø²Óø²Ìø²Åø²¾ø²·ø²°ø²©ø²¢ø²›ø²”ø²ø²†ø²ø²xø²qø²jø²cø²\ø²Uø²Nø²Gø²@ø²9ø²2ø²+ø²$ø²ø²ø²ø²ø²ø²ú÷²ó÷²ì÷²å÷²Þ÷²×÷²Ð÷²É÷²Â÷²»÷²´÷²­÷²¦÷²Ÿ÷²˜÷²‘÷²Š÷²ƒ÷²|÷²u÷²n÷²g÷²`÷²Y÷²R÷²K÷²D÷²=÷²6÷²/÷²(÷²!÷²÷²÷² ÷²÷²þö²÷ö²ðö²éö²âö²Ûö²Ôö²Íö²Æö²¿ö²¸ö²±ö²ªö²£ö²œö²•ö²Žö²‡ö²€ö²yö²rö²kö²dö²]ö²Vö²Oö²Hö²Aö²:ö²3ö²,ö²%ö²ö²ö²ö² ö²ö²ûõ²ôõ²íõ²æõ²ßõ²Øõ²Ñõ²Êõ²Ãõ²¼õ²µõ²®õ²§õ² õ²™õ²’õ²‹õ²„õ²}õ²võ²oõ²hõ²aõ²Zõ²Sõ²Lõ²Eõ²>õ²7õ²0õ²)õ²"õ²õ²õ² õ²õ²ÿô²øô²ñô²êô²ãô²Üô²Õô²Îô²Çô²Àô²¹ô²²ô²«ô²¤ô²ô²–ô²ô²ˆô²ô²zô²sô²lô²eô²^ô²Wô²Pô²Iô²Bô²;ô²4ô²-ô²&ô²ô²ô²ô² ô²ô²üó²õó²îó²çó²àó²Ùó²Òó²Ëó²Äó²½ó²¶ó²¯ó²¨ó²¡ó²šó²“ó²Œó²…ó²~ó²wó²pó²ió²bó²[ó²Tó²Mó²Fó²?ó²8ó²1ó²*ó²#ó²ó²ó²ó²ó²ó²ùò²òò²ëò²äò²Ýò²Öò²Ïò²Èò²Áò²ºò²³ò²¬ò²¥ò²žò²—ò²ò²‰ò²‚ò²{ò²tò²mò²fò²_ò²Xò²Qò²Jò²Cò²<ò²5ò².ò²'ò² ò²ò²ò² ò²ò²ýñ²öñ²ïñ²èñ²áñ²Úñ²Óñ²Ìñ²Åñ²¾ñ²·ñ²°ñ²©ñ²¢ñ²›ñ²”ñ²ñ²†ñ²ñ²xñ²qñ²jñ²cñ²\ñ²Uñ²Nñ²Gñ²@ñ²9ñ²2ñ²+ñ²$ñ²ñ²ñ²ñ²ñ²ñ²úð²óð²ìð²åð²Þð²×ð²Ðð²Éð²Âð²»ð²´ð²­ð²¦ð²Ÿð²˜ð²‘ð²Šð²ƒð²|ð²uð²nð²gð²`ð²Yð²Rð²Kð²Dð²=ð²6ð²/ð²(ð²!ð²ð²ð² ð²ð²þï²÷ï²ðï²éï²âï²Ûï²Ôï²Íï²Æï²¿ï²¸ï²±ï²ªï²£ï²œï²•ï²Žï²‡ï²€ï²yï²rï²kï²dï²]ï²Vï²Oï²Hï²Aï²:ï²3ï²,ï²%ï²ï²ï²ï² ï²ï²ûî²ôî²íî²æî²ßî²Øî²Ñî²Êî²Ãî²}î²vî²oî²hî²aî²Zî²Sî²Lî²Eî²>î²7î²0î²)î²"î²î²î² î²î²ÿí²øí²ñí²êí²ãí²Üí²Õí²Îí²Çí²Àí²¹í²²í²«í²¤í²í²–í²í²ˆí²í²zí²sí²lí²eí²^í²Wí²Pí²Ií²Bí²;í²4í²-í²&í²í²í²í² í²í²üì²õì²îì²çì²àì²Ùì²Òì²Ëì²Ä첽첶첯첨첡첚첓첌첅ì²~ì²wì²pì²iì²bì²[ì²Tì²Mì²Fì²?ì²8ì²1ì²*ì²#ì²ì²ì²ì²ì²ì²ùë²òë²ëë²äë²Ýë²Öë²Ïë²Èë²Á벺벳벬벥벞벗ë²ë²‰ë²‚ë²{ë²të²më²fë²_ë²Xë²Që²Jë²Cë²<ë²5ë².ë²'ë² ë²ë²ë² ë²ë²ýê²öê²ïê²èê²áê²Úê²Óê²Ìê²Å겾겷결격겢겛겔ê²ê²†ê²ê²xê²qê²jê²cê²\ê²Uê²Nê²Gê²@ê²9ê²2ê²+ê²$ê²ê²ê²ê²ê²ê²úé²óé²ìé²åé²Þé²×é²Ðé²Éé²Â鲻鲴鲭鲦鲟鲘鲑鲊鲃é²|é²ué²né²gé²`é²Yé²Ré²Ké²Dé²=é²6é²/é²(é²!é²é²é² é²é²þè²÷è²ðè²éè²âè²Ûè²Ôè²Íè²Æè²¿è²¸è²±è²ªè²£è²œè²•è²Žè²‡è²€è²yè²rè²kè²dè²]è²Vè²Oè²Hè²Aè²:è²3è²,è²%è²è²è²è² è²è²ûç²ôç²íç²æç²ßç²Øç²Ñç²Êç²Ã粼粵粮粧粠粙粒粋粄ç²}ç²vç²oç²hç²aç²Zç²Sç²Lç²Eç²>ç²7ç²0ç²)ç²"ç²ç²ç² ç²ç²ÿæ²øæ²ñæ²êæ²ãæ²Üæ²Õæ²Îæ²Çæ²Àæ²¹æ²²æ²«æ²¤æ²æ²–æ²æ²ˆæ²æ²zæ²sæ²læ²eæ²^æ²Wæ²Pæ²Iæ²Bæ²;æ²4æ²-æ²&æ²æ²æ²æ² æ²æ²üå²õå²îå²çå²àå²Ùå²Òå²Ëå²Ä岽岶岯岨岡岚岓岌岅å²~å²wå²på²iå²bå²[å²Tå²Må²Få²?å²8å²1å²*å²#å²å²å²å²å²å²ùä²òä²ëä²ää²Ýä²Öä²Ïä²Èä²Á䲺䲳䲬䲥䲞䲗ä²ä²‰ä²‚ä²{ä²tä²mä²fä²_ä²Xä²Qä²Jä²Cä²<ä²5ä².ä²'ä² ä²ä²ä² ä²ä²ýã²öã²ïã²èã²áã²Úã²Óã²Ìã²Å㲾㲷㲰㲩㲢㲛㲔ã²ã²†ã²ã²xã²qã²jã²cã²\ã²Uã²Nã²Gã²@ã²9ã²2ã²+ã²$ã²ã²ã²ã²ã²ã²úâ²óâ²ìâ²åâ²Þâ²×â²Ðâ²Éâ²ÂⲻⲴⲭⲦⲟⲘⲑⲊⲃâ²|â²uâ²nâ²gâ²`â²Yâ²Râ²Kâ²Dâ²=â²6â²/â²(â²!â²â²â² â²â²þá²÷á²ðá²éá²âá²Ûá²Ôá²Íá²Æá²¿á²¸á²±á²ªá²£á²œá²•á²Žá²‡á²€á²yá²rá²ká²dá²]á²Vá²Oá²Há²Aá²:á²3á²,á²%á²á²á²á² á²á²ûà²ôà²íà²æà²ßà²Øà²Ñà²Êà²Ã಼ವಮಧಠಙಒಋ಄à²}à²và²oà²hà²aà²Zà²Sà²Là²Eà²>à²7à²0à²)à²"à²à²à² à²à²ÿß²øß²ñß²êß²ãß²Üß²Õß²Îß²Çß²Àß²¹ß²²ß²«ß²¤ß²ß²–߲߲ˆß²ß²zß²sß²lß²eß²^ß²Wß²Pß²Iß²Bß²;ß²4ß²-ß²&߲߲߲߲ ߲߲üÞ²õÞ²îÞ²çÞ²àÞ²ÙÞ²ÒÞ²ËÞ²ÄÞ²½Þ²¶Þ²¯Þ²¨Þ²¡Þ²šÞ²“Þ²ŒÞ²…Þ²~Þ²wÞ²pÞ²iÞ²bÞ²[Þ²TÞ²MÞ²FÞ²?Þ²8Þ²1Þ²*Þ²#Þ²Þ²Þ²Þ²Þ²Þ²ùݲòݲëݲäݲÝݲÖݲÏݲÈݲÁݲºÝ²³Ý²¬Ý²¥Ý²žÝ²—ݲݲ‰Ý²‚ݲ{ݲtݲmݲfݲ_ݲXݲQݲJݲCݲ<ݲ5ݲ.ݲ'ݲ ݲݲݲ ݲݲýܲöܲïܲèܲáܲÚܲÓܲÌܲÅܲ¾Ü²·Ü²°Ü²©Ü²¢Ü²›Ü²”ܲܲ†Ü²ܲxܲqܲjܲcܲ\ܲUܲNܲGܲ@ܲ9ܲ2ܲ+ܲ$ܲܲܲܲܲܲúÛ²óÛ²ìÛ²åÛ²ÞÛ²×Û²ÐÛ²ÉÛ²ÂÛ²»Û²´Û²­Û²¦Û²ŸÛ²˜Û²‘Û²ŠÛ²ƒÛ²|Û²uÛ²nÛ²gÛ²`Û²YÛ²RÛ²KÛ²DÛ²=Û²6Û²/Û²(Û²!Û²Û²Û² Û²Û²þÚ²÷Ú²ðÚ²éÚ²âÚ²ÛÚ²ÔÚ²ÍÚ²ÆÚ²¿Ú²¸Ú²±Ú²ªÚ²£Ú²œÚ²•Ú²ŽÚ²‡Ú²€Ú²yÚ²rÚ²kÚ²dÚ²]Ú²VÚ²OÚ²HÚ²AÚ²:Ú²3Ú²,Ú²%Ú²Ú²Ú²Ú² Ú²Ú²ûÙ²ôÙ²íÙ²æÙ²ßÙ²ØÙ²ÑÙ²ÊÙ²ÃÙ²¼Ù²µÙ²®Ù²§Ù² Ù²™Ù²’Ù²‹Ù²„Ù²}Ù²vÙ²oÙ²hÙ²aÙ²ZÙ²SÙ²LÙ²EÙ²>Ù²7Ù²0Ù²)Ù²"ٲٲٲ ٲٲÿزøØ²ñزêØ²ãØ²ÜØ²ÕØ²ÎØ²ÇزÀز¹Ø²²Ø²«Ø²¤Ø²ز–ززˆØ²زzزsزlزeز^زWزPزIزBز;ز4ز-ز&زززز ززüײõײîײçײàײÙײÒײËײÄײ½×²¶×²¯×²¨×²¡×²š×²“ײŒ×²…ײ~ײwײpײiײbײ[ײTײMײFײ?ײ8ײ1ײ*ײ#ײײײײײײùÖ²òÖ²ëÖ²äÖ²ÝÖ²ÖÖ²ÏÖ²ÈÖ²ÁÖ²ºÖ²³Ö²¬Ö²¥Ö²žÖ²—Ö²Ö²‰Ö²‚Ö²{Ö²tÖ²mÖ²fÖ²_Ö²XÖ²QÖ²JÖ²CÖ²<Ö²5Ö².Ö²'Ö² Ö²Ö²Ö² Ö²Ö²ýÕ²öÕ²ïÕ²èÕ²áÕ²ÚÕ²ÓÕ²ÌÕ²ÅÕ²¾Õ²·Õ²°Õ²©Õ²¢Õ²›Õ²”Õ²Õ²†Õ²Õ²xÕ²qÕ²jÕ²cÕ²\Õ²UÕ²NÕ²GÕ²@Õ²9Õ²2Õ²+Õ²$Õ²Õ²Õ²Õ²Õ²Õ²úÔ²óÔ²ìÔ²åÔ²ÞÔ²×Ô²ÐÔ²ÉÔ²ÂÔ²»Ô²´Ô²­Ô²¦Ô²ŸÔ²˜Ô²‘Ô²ŠÔ²ƒÔ²|Ô²uÔ²nÔ²gÔ²`Ô²YÔ²RÔ²KÔ²DÔ²=Ô²6Ô²/Ô²(Ô²!Ô²Ô²Ô² Ô²Ô²þÓ²÷Ó²ðÓ²éÓ²âÓ²ÛÓ²ÔÓ²ÍÓ²ÆÓ²¿Ó²¸Ó²±Ó²ªÓ²£Ó²œÓ²•Ó²ŽÓ²‡Ó²€Ó²yÓ²rÓ²kÓ²dÓ²]Ó²VÓ²OÓ²HÓ²AÓ²:Ó²3Ó²,Ó²%Ó²Ó²Ó²Ó² Ó²Ó²ûÒ²ôÒ²íÒ²æÒ²ßÒ²ØÒ²ÑÒ²ÊÒ²ÃÒ²¼Ò²µÒ²®Ò²§Ò² Ò²™Ò²’Ò²‹Ò²„Ò²}Ò²vÒ²oÒ²hÒ²aÒ²ZÒ²SÒ²LÒ²EÒ²>Ò²7Ò²0Ò²)Ò²"Ò²Ò²Ò² Ò²Ò²ÿѲøÑ²ñѲêѲãѲÜѲÕѲÎѲÇѲÀѲ¹Ñ²²Ñ²«Ñ²¤Ñ²Ѳ–ѲѲˆÑ²ѲzѲsѲlѲeѲ^ѲWѲPѲIѲBѲ;Ѳ4Ѳ-Ѳ&ѲѲѲѲ ѲѲüвõвîвçвàвÙвÒвËвÄв½Ð²¶Ð²¯Ð²¨Ð²¡Ð²šÐ²“вŒÐ²…в~вwвpвiвbв[вTвMвFв?в8в1в*в#ввввввùϲòϲëϲäϲÝϲÖϲÏϲÈϲÁϲºÏ²³Ï²¬Ï²¥Ï²žÏ²—ϲϲ‰Ï²‚ϲ{ϲtϲmϲfϲ_ϲXϲQϲJϲCϲ<ϲ5ϲ.ϲ'ϲ ϲϲϲ ϲϲýβöβïβèβáβÚβÓβÌβÅβ¾Î²·Î²°Î²©Î²¢Î²›Î²”ββ†Î²βxβqβjβcβ\βUβNβGβ@β9β2β+β$ββββββúͲóͲìͲåͲÞͲ×ͲÐͲÉͲÂͲ»Í²´Í²­Í²¦Í²ŸÍ²˜Í²‘ͲŠÍ²ƒÍ²|ͲuͲnͲgͲ`ͲYͲRͲKͲDͲ=Ͳ6Ͳ/Ͳ(Ͳ!ͲͲͲ ͲͲþ̲÷̲ð̲é̲â̲Û̲Ô̲Í̲ÆÌ²¿Ì²¸Ì²±Ì²ªÌ²£Ì²œÌ²•̲ŽÌ²‡Ì²€Ì²y̲r̲k̲d̲]̲V̲O̲H̲A̲:̲3̲,̲%̲̲̲̲ ̲̲û˲ô˲í˲æË²ß˲ØË²Ñ˲Ê˲Ã˲¼Ë²µË²®Ë²§Ë² Ë²™Ë²’˲‹Ë²„˲}˲v˲o˲h˲a˲Z˲S˲L˲E˲>˲7˲0˲)˲"˲˲˲ ˲˲ÿʲøÊ²ñʲêʲãʲÜʲÕʲÎʲÇʲÀʲ¹Ê²²Ê²«Ê²¤Ê²ʲ–ʲʲˆÊ²ʲzʲsʲlʲeʲ^ʲWʲPʲIʲBʲ;ʲ4ʲ-ʲ&ʲʲʲʲ ʲʲüɲõɲîɲçɲàɲÙɲÒɲËɲÄɲ½É²¶É²¯É²¨É²¡É²šÉ²“ɲŒÉ²…ɲ~ɲwɲpɲiɲbɲ[ɲTɲMɲFɲ?ɲ8ɲ1ɲ*ɲ#ɲɲɲɲɲɲùȲòȲëȲäȲÝȲÖȲÏȲÈȲÁȲºÈ²³È²¬È²¥È²žÈ²—ȲȲ‰È²‚Ȳ{ȲtȲmȲfȲ_ȲXȲQȲJȲCȲ<Ȳ5Ȳ.Ȳ'Ȳ ȲȲȲ ȲȲýDzöDzïDzèDzáDzÚDzÓDzÌDzÅDz¾Ç²·Ç²°Ç²©Ç²¢Ç²›Ç²”DzDz†Ç²DzxDzqDzjDzcDz\DzUDzNDzGDz@Dz9Dz2Dz+Dz$DzDzDzDzDzDzúƲóƲìÆ²寲ÞÆ²ׯ²ÐÆ²ÉÆ²ÂƲ»Æ²´Æ²­Æ²¦Æ²ŸÆ²˜Æ²‘ƲŠÆ²ƒÆ²|ƲuƲnƲgƲ`ƲYƲRƲKƲDƲ=Ʋ6Ʋ/Ʋ(Ʋ!ƲƲƲ ƲƲþŲ÷ŲðŲéŲâŲÛŲÔŲÍدŲ¿Å²¸Å²±Å²ªÅ²£Å²œÅ²•ŲŽÅ²‡Å²€Å²yŲrŲkŲdŲ]ŲVŲOŲHŲAŲ:Ų3Ų,Ų%ŲŲŲŲ ŲŲûIJôIJíIJæÄ²ßIJØÄ²ÑIJÊIJÃIJ¼Ä²µÄ²®Ä²§Ä² Ä²™Ä²’IJ‹Ä²„IJ}IJvIJoIJhIJaIJZIJSIJLIJEIJ>IJ7IJ0IJ)IJ"IJIJIJ IJIJÿòøÃ²ñòêòãòÜòÕòÎòÇòÀò¹Ã²²Ã²«Ã²¤Ã²ò–òòˆÃ²òzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòü²õ²î²ç²à²Ù²Ò²˲IJ½Â²¶Â²¯Â²¨Â²¡Â²šÂ²“²ŒÂ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ùÁ²òÁ²ëÁ²äÁ²ÝÁ²ÖÁ²ÏÁ²ÈÁ²ÁÁ²ºÁ²³Á²¬Á²¥Á²žÁ²—Á²Á²‰Á²‚Á²{Á²tÁ²mÁ²fÁ²_Á²XÁ²QÁ²JÁ²CÁ²<Á²5Á².Á²'Á² Á²Á²Á² Á²Á²ýÀ²öÀ²ïÀ²èÀ²áÀ²ÚÀ²ÓÀ²ÌÀ²ÅÀ²¾À²·À²°À²©À²¢À²›À²”À²À²†À²À²xÀ²qÀ²jÀ²cÀ²\À²UÀ²NÀ²GÀ²@À²9À²2À²+À²$À²À²À²À²À²À²ú¿²ó¿²쿲忲Þ¿²׿²п²É¿²¿²»¿²´¿²­¿²¦¿²Ÿ¿²˜¿²‘¿²Š¿²ƒ¿²|¿²u¿²n¿²g¿²`¿²Y¿²R¿²K¿²D¿²=¿²6¿²/¿²(¿²!¿²¿²¿² ¿²¿²þ¾²÷¾²ð¾²é¾²â¾²Û¾²Ô¾²;²ƾ²¿¾²¸¾²±¾²ª¾²£¾²œ¾²•¾²޾²‡¾²€¾²y¾²r¾²k¾²d¾²]¾²V¾²O¾²H¾²A¾²:¾²3¾²,¾²%¾²¾²¾²¾² ¾²¾²û½²ô½²í½²æ½²ß½²ؽ²ѽ²ʽ²ý²¼½²µ½²®½²§½² ½²™½²’½²‹½²„½²}½²v½²o½²h½²a½²Z½²S½²L½²E½²>½²7½²0½²)½²"½²½²½² ½²½²ÿ¼²ø¼²ñ¼²ê¼²ã¼²ܼ²Õ¼²μ²Ǽ²À¼²¹¼²²¼²«¼²¤¼²¼²–¼²¼²ˆ¼²¼²z¼²s¼²l¼²e¼²^¼²W¼²P¼²I¼²B¼²;¼²4¼²-¼²&¼²¼²¼²¼² ¼²¼²ü»²õ»²绲໲Ù»²Ò»²Ë»²Ä»²½»²¶»²¯»²¨»²¡»²š»²“»²Œ»²…»²~»²w»²p»²i»²b»²[»²T»²M»²F»²?»²8»²1»²*»²#»²»²»²»²»²»²ùº²òº²뺲亲ݺ²Öº²Ϻ²Ⱥ²Áº²ºº²³º²¬º²¥º²žº²—º²º²‰º²‚º²{º²tº²mº²fº²_º²Xº²Qº²Jº²Cº²<º²5º².º²'º² º²º²º² º²º²ý¹²ö¹²ï¹²è¹²á¹²Ú¹²Ó¹²̹²ʲ¾¹²·¹²°¹²©¹²¢¹²›¹²”¹²¹²†¹²¹²x¹²q¹²j¹²c¹²\¹²U¹²N¹²G¹²@¹²9¹²2¹²+¹²$¹²¹²¹²¹²¹²¹²ú¸²ó¸²츲帲Þ¸²׸²и²ɸ²¸²»¸²´¸²­¸²¦¸²Ÿ¸²˜¸²‘¸²Џ²ƒ¸²|¸²u¸²n¸²g¸²`¸²Y¸²R¸²K¸²D¸²=¸²6¸²/¸²(¸²!¸²¸²¸² ¸²¸²þ·²÷·²ð·²é·²â·²Û·²Ô·²Í·²Æ·²¿·²¸·²±·²ª·²£·²œ·²•·²Ž·²‡·²€·²y·²r·²k·²d·²]·²V·²O·²H·²A·²:·²3·²,·²%·²·²·²·² ·²·²û¶²ô¶²í¶²æ¶²ß¶²ض²Ѷ²ʶ²ö²¼¶²µ¶²®¶²§¶² ¶²™¶²’¶²‹¶²„¶²}¶²v¶²o¶²h¶²a¶²Z¶²S¶²L¶²E¶²>¶²7¶²0¶²)¶²"¶²¶²¶² ¶²¶²ÿµ²øµ²ñµ²êµ²ãµ²ܵ²Õµ²ε²ǵ²Àµ²¹µ²²µ²«µ²¤µ²µ²–µ²µ²ˆµ²µ²zµ²sµ²lµ²eµ²^µ²Wµ²Pµ²Iµ²Bµ²;µ²4µ²-µ²&µ²µ²µ²µ² µ²µ²ü´²õ´²î´²ç´²à´²Ù´²Ò´²Ë´²Ä´²½´²¶´²¯´²¨´²¡´²š´²“´²Œ´²…´²~´²w´²p´²i´²b´²[´²T´²M´²F´²?´²8´²1´²*´²#´²´²´²´²´²´²ù³²ò³²ë³²ä³²ݳ²Ö³²ϳ²ȳ²Á³²º³²³³²¬³²¥³²ž³²—³²³²‰³²‚³²{³²t³²m³²f³²_³²X³²Q³²J³²C³²<³²5³².³²'³² ³²³²³² ³²³²ý²²ö²²ï²²è²²á²²Ú²²Ó²²̲²Ų²¾²²·²²°²²©²²¢²²›²²”²²²²†²²²²x²²q²²j²²c²²\²²U²²N²²G²²@²²9²²2²²+²²$²²²²²²²²²²²²ú±²ó±²ì±²å±²Þ±²×±²б²ɱ²±²»±²´±²­±²¦±²Ÿ±²˜±²‘±²б²ƒ±²|±²u±²n±²g±²`±²Y±²R±²K±²D±²=±²6±²/±²(±²!±²±²±² ±²±²þ°²÷°²ð°²é°²â°²Û°²Ô°²Ͱ²ư²¿°²¸°²±°²ª°²£°²œ°²•°²ް²‡°²€°²y°²r°²k°²d°²]°²V°²O°²H°²A°²:°²3°²,°²%°²°²°²°² °²°²û¯²ô¯²í¯²毲߯²د²ѯ²ʯ²ï²¼¯²µ¯²®¯²§¯² ¯²™¯²’¯²‹¯²„¯²}¯²v¯²o¯²h¯²a¯²Z¯²S¯²L¯²E¯²>¯²7¯²0¯²)¯²"¯²¯²¯² ¯²¯²ÿ®²ø®²ñ®²ꮲ㮲Ü®²Õ®²ή²Ç®²À®²¹®²²®²«®²¤®²®²–®²®²ˆ®²®²z®²s®²l®²e®²^®²W®²P®²I®²B®²;®²4®²-®²&®²®²®²®² ®²®²ü­²õ­²î­²ç­²à­²Ù­²Ò­²Ë­²Ä­²½­²¶­²¯­²¨­²¡­²š­²“­²Œ­²…­²~­²w­²p­²i­²b­²[­²T­²M­²F­²?­²8­²1­²*­²#­²­²­²­²­²­²ù¬²ò¬²묲䬲ݬ²Ö¬²Ϭ²Ȭ²Á¬²º¬²³¬²¬¬²¥¬²ž¬²—¬²¬²‰¬²‚¬²{¬²t¬²m¬²f¬²_¬²X¬²Q¬²J¬²C¬²<¬²5¬².¬²'¬² ¬²¬²¬² ¬²¬²ý«²ö«²﫲諲᫲Ú«²Ó«²Ì«²Å«²¾«²·«²°«²©«²¢«²›«²”«²«²†«²«²x«²q«²j«²c«²\«²U«²N«²G«²@«²9«²2«²+«²$«²«²«²«²«²«²úª²óª²쪲媲Þª²ת²Ъ²ɪ²ª²»ª²´ª²­ª²¦ª²Ÿª²˜ª²‘ª²Šª²ƒª²|ª²uª²nª²gª²`ª²Yª²Rª²Kª²Dª²=ª²6ª²/ª²(ª²!ª²ª²ª² ª²ª²þ©²÷©²ð©²驲⩲Û©²Ô©²Í©²Æ©²¿©²¸©²±©²ª©²£©²œ©²•©²Ž©²‡©²€©²y©²r©²k©²d©²]©²V©²O©²H©²A©²:©²3©²,©²%©²©²©²©² ©²©²û¨²ô¨²í¨²樲ߨ²ب²Ѩ²ʨ²è²¼¨²µ¨²®¨²§¨² ¨²™¨²’¨²‹¨²„¨²}¨²v¨²o¨²h¨²a¨²Z¨²S¨²L¨²E¨²>¨²7¨²0¨²)¨²"¨²¨²¨² ¨²¨²ÿ§²ø§²ñ§²ê§²ã§²ܧ²Õ§²Χ²ǧ²À§²¹§²²§²«§²¤§²§²–§²§²ˆ§²§²z§²s§²l§²e§²^§²W§²P§²I§²B§²;§²4§²-§²&§²§²§²§² §²§²ü¦²õ¦²禲লÙ¦²Ò¦²˦²Ħ²½¦²¶¦²¯¦²¨¦²¡¦²š¦²“¦²Œ¦²…¦²~¦²w¦²p¦²i¦²b¦²[¦²T¦²M¦²F¦²?¦²8¦²1¦²*¦²#¦²¦²¦²¦²¦²¦²ù¥²ò¥²륲䥲Ý¥²Ö¥²Ï¥²È¥²Á¥²º¥²³¥²¬¥²¥¥²ž¥²—¥²¥²‰¥²‚¥²{¥²t¥²m¥²f¥²_¥²X¥²Q¥²J¥²C¥²<¥²5¥².¥²'¥² ¥²¥²¥² ¥²¥²ý¤²ö¤²爐褲ᤲÚ¤²Ó¤²̤²Ť²¾¤²·¤²°¤²©¤²¢¤²›¤²”¤²¤²†¤²¤²x¤²q¤²j¤²c¤²\¤²U¤²N¤²G¤²@¤²9¤²2¤²+¤²$¤²¤²¤²¤²¤²¤²ú£²ó£²죲売Þ£²×£²У²É£²£²»£²´£²­£²¦£²Ÿ£²˜£²‘£²Š£²ƒ£²|£²u£²n£²g£²`£²Y£²R£²K£²D£²=£²6£²/£²(£²!£²£²£² £²£²þ¢²÷¢²ð¢²颲⢲Û¢²Ô¢²Í¢²Æ¢²¿¢²¸¢²±¢²ª¢²£¢²œ¢²•¢²Ž¢²‡¢²€¢²y¢²r¢²k¢²d¢²]¢²V¢²O¢²H¢²A¢²:¢²3¢²,¢²%¢²¢²¢²¢² ¢²¢²û¡²ô¡²í¡²桲ß¡²Ø¡²Ñ¡²Ê¡²á²¼¡²µ¡²®¡²§¡² ¡²™¡²’¡²‹¡²„¡²}¡²v¡²o¡²h¡²a¡²Z¡²S¡²L¡²E¡²>¡²7¡²0¡²)¡²"¡²¡²¡² ¡²¡²ÿ ²ø ²ñ ²ê ²ã ²Ü ²Õ ²Π²Ç ²À ²¹ ²² ²« ²¤ ² ²– ² ²ˆ ² ²z ²s ²l ²e ²^ ²W ²P ²I ²B ²; ²4 ²- ²& ² ² ² ²  ² ²üŸ²õŸ²矲àŸ²ÙŸ²ÒŸ²ËŸ²ÄŸ²½Ÿ²¶Ÿ²¯Ÿ²¨Ÿ²¡Ÿ²šŸ²“Ÿ²ŒŸ²…Ÿ²~Ÿ²wŸ²pŸ²iŸ²bŸ²[Ÿ²TŸ²MŸ²FŸ²?Ÿ²8Ÿ²1Ÿ²*Ÿ²#Ÿ²Ÿ²Ÿ²Ÿ²Ÿ²Ÿ²ùž²òž²ëž²äž²Ýž²Öž²Ïž²Èž²Áž²ºž²³ž²¬ž²¥ž²žž²—ž²ž²‰ž²‚ž²{ž²tž²mž²fž²_ž²Xž²Qž²Jž²Cž²<ž²5ž².ž²'ž² ž²ž²ž² ž²ž²ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²úœ²óœ²윲圲Þœ²ל²М²Éœ²œ²»œ²´œ²­œ²¦œ²Ÿœ²˜œ²‘œ²Šœ²ƒœ²|œ²uœ²nœ²gœ²`œ²Yœ²Rœ²Kœ²Dœ²=œ²6œ²/œ²(œ²!œ²œ²œ² œ²œ²þ›²÷›²ð›²雲⛲Û›²Ô›²Í›²Æ›²¿›²¸›²±›²ª›²£›²œ›²•›²Ž›²‡›²€›²y›²r›²k›²d›²]›²V›²O›²H›²A›²:›²3›²,›²%›²›²›²›² ›²›²ûš²ôš²íš²æš²ßš²Øš²Ñš²Êš²Ú²¼š²µš²®š²§š² š²™š²’š²‹š²„š²}š²vš²oš²hš²aš²Zš²Sš²Lš²Eš²>š²7š²0š²)š²"š²š²š² š²š²ÿ™²ø™²ñ™²꙲㙲Ü™²Õ™²Ι²Ç™²À™²¹™²²™²«™²¤™²™²–™²™²ˆ™²™²z™²s™²l™²e™²^™²W™²P™²I™²B™²;™²4™²-™²&™²™²™²™² ™²™²ü˜²õ˜²瘲à˜²Ù˜²Ò˜²˘²Ʋ½˜²¶˜²¯˜²¨˜²¡˜²š˜²“˜²Œ˜²…˜²~˜²w˜²p˜²i˜²b˜²[˜²T˜²M˜²F˜²?˜²8˜²1˜²*˜²#˜²˜²˜²˜²˜²˜²ù—²ò—²ë—²ä—²Ý—²Ö—²Ï—²È—²Á—²º—²³—²¬—²¥—²ž—²——²—²‰—²‚—²{—²t—²m—²f—²_—²X—²Q—²J—²C—²<—²5—².—²'—² —²—²—² —²—²ý–²ö–²ï–²è–²á–²Ú–²Ó–²Ì–²Å–²¾–²·–²°–²©–²¢–²›–²”–²–²†–²–²x–²q–²j–²c–²\–²U–²N–²G–²@–²9–²2–²+–²$–²–²–²–²–²–²ú•²ó•²앲啲Þ•²ו²Е²É•²•²»•²´•²­•²¦•²Ÿ•²˜•²‘•²Š•²ƒ•²|•²u•²n•²g•²`•²Y•²R•²K•²D•²=•²6•²/•²(•²!•²•²•² •²•²þ”²÷”²ð”²锲┲Û”²Ô”²Í”²Æ”²¿”²¸”²±”²ª”²£”²œ”²•”²Ž”²‡”²€”²y”²r”²k”²d”²]”²V”²O”²H”²A”²:”²3”²,”²%”²”²”²”² ”²”²û“²ô“²퓲擲ß“²Ø“²Ñ“²Ê“²Ó²¼“²µ“²®“²§“² “²™“²’“²‹“²„“²}“²v“²o“²h“²a“²Z“²S“²L“²E“²>“²7“²0“²)“²"“²“²“² “²“²ÿ’²ø’²ñ’²ê’²ã’²Ü’²Õ’²Î’²Ç’²À’²¹’²²’²«’²¤’²’²–’²’²ˆ’²’²z’²s’²l’²e’²^’²W’²P’²I’²B’²;’²4’²-’²&’²’²’²’² ’²’²ü‘²õ‘²瑲à‘²Ù‘²Ò‘²Ë‘²Ä‘²½‘²¶‘²¯‘²¨‘²¡‘²š‘²“‘²Œ‘²…‘²~‘²w‘²p‘²i‘²b‘²[‘²T‘²M‘²F‘²?‘²8‘²1‘²*‘²#‘²‘²‘²‘²‘²‘²ù²ò²ë²ä²ݲÖ²ϲȲÁ²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú޲ó޲쎲厲ÞŽ²׎²ÐŽ²ÉŽ²Â޲»Ž²´Ž²­Ž²¦Ž²ŸŽ²˜Ž²‘޲ŠŽ²ƒŽ²|޲u޲n޲g޲`޲Y޲R޲K޲D޲=޲6޲/޲(޲!޲޲޲ ޲޲þ²÷²ð²é²â²Û²Ô²ͲƲ¿²¸²±²ª²£²œ²•²޲‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²ûŒ²ôŒ²팲挲ߌ²ØŒ²ÑŒ²ÊŒ²ÃŒ²¼Œ²µŒ²®Œ²§Œ² Œ²™Œ²’Œ²‹Œ²„Œ²}Œ²vŒ²oŒ²hŒ²aŒ²ZŒ²SŒ²LŒ²EŒ²>Œ²7Œ²0Œ²)Œ²"Œ²Œ²Œ² Œ²Œ²ÿ‹²ø‹²ñ‹²ꋲ㋲Ü‹²Õ‹²΋²Ç‹²À‹²¹‹²²‹²«‹²¤‹²‹²–‹²‹²ˆ‹²‹²z‹²s‹²l‹²e‹²^‹²W‹²P‹²I‹²B‹²;‹²4‹²-‹²&‹²‹²‹²‹² ‹²‹²üвõв犲àŠ²ÙŠ²ÒŠ²ËŠ²Äв½Š²¶Š²¯Š²¨Š²¡Š²šŠ²“вŒŠ²…в~вwвpвiвbв[вTвMвFв?в8в1в*в#ввввввù‰²ò‰²뉲䉲݉²Ö‰²ω²ȉ²Á‰²º‰²³‰²¬‰²¥‰²ž‰²—‰²‰²‰‰²‚‰²{‰²t‰²m‰²f‰²_‰²X‰²Q‰²J‰²C‰²<‰²5‰².‰²'‰² ‰²‰²‰² ‰²‰²ýˆ²öˆ²舲ሲÚˆ²Óˆ²̈²ň²¾ˆ²·ˆ²°ˆ²©ˆ²¢ˆ²›ˆ²”ˆ²ˆ²†ˆ²ˆ²xˆ²qˆ²jˆ²cˆ²\ˆ²Uˆ²Nˆ²Gˆ²@ˆ²9ˆ²2ˆ²+ˆ²$ˆ²ˆ²ˆ²ˆ²ˆ²ˆ²ú‡²ó‡²쇲凲Þ‡²ׇ²Ї²ɇ²‡²»‡²´‡²­‡²¦‡²Ÿ‡²˜‡²‘‡²Ї²ƒ‡²|‡²u‡²n‡²g‡²`‡²Y‡²R‡²K‡²D‡²=‡²6‡²/‡²(‡²!‡²‡²‡² ‡²‡²þ†²÷†²ð†²醲↲Û†²Ô†²͆²Ɔ²¿†²¸†²±†²ª†²£†²œ†²•†²ކ²‡†²€†²y†²r†²k†²d†²]†²V†²O†²H†²A†²:†²3†²,†²%†²†²†²†² †²†²û…²ô…²í…²æ…²ß…²Ø…²Ñ…²Ê…²Ã…²¼…²µ…²®…²§…² …²™…²’…²‹…²„…²}…²v…²o…²h…²a…²Z…²S…²L…²E…²>…²7…²0…²)…²"…²…²…² …²…²ÿ„²ø„²ñ„²ꄲㄲÜ„²Õ„²΄²Ç„²À„²¹„²²„²«„²¤„²„²–„²„²ˆ„²„²z„²s„²l„²e„²^„²W„²P„²I„²B„²;„²4„²-„²&„²„²„²„² „²„²üƒ²õƒ²烲àƒ²Ùƒ²Òƒ²˃²ă²½ƒ²¶ƒ²¯ƒ²¨ƒ²¡ƒ²šƒ²“ƒ²Œƒ²…ƒ²~ƒ²wƒ²pƒ²iƒ²bƒ²[ƒ²Tƒ²Mƒ²Fƒ²?ƒ²8ƒ²1ƒ²*ƒ²#ƒ²ƒ²ƒ²ƒ²ƒ²ƒ²ù‚²ò‚²낲䂲Ý‚²Ö‚²Ï‚²È‚²Á‚²º‚²³‚²¬‚²¥‚²ž‚²—‚²‚²‰‚²‚‚²{‚²t‚²m‚²f‚²_‚²X‚²Q‚²J‚²C‚²<‚²5‚².‚²'‚² ‚²‚²‚² ‚²‚²ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú€²ó€²쀲倲Þ€²×€²Ѐ²É€²€²»€²´€²­€²¦€²Ÿ€²˜€²‘€²Š€²ƒ€²|€²u€²n€²g€²`€²Y€²R€²K€²D€²=€²6€²/€²(€²!€²€²€² €²€²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û~²ô~²í~²æ~²ß~²Ø~²Ñ~²Ê~²Ã~²¼~²µ~²®~²§~² ~²™~²’~²‹~²„~²}~²v~²o~²h~²a~²Z~²S~²L~²E~²>~²7~²0~²)~²"~²~²~² ~²~²ÿ}²ø}²ñ}²ê}²ã}²Ü}²Õ}²Î}²Ç}²À}²¹}²²}²«}²¤}²}²–}²}²ˆ}²}²z}²s}²l}²e}²^}²W}²P}²I}²B}²;}²4}²-}²&}²}²}²}² }²}²ü|²õ|²î|²ç|²à|²Ù|²Ò|²Ë|²Ä|²½|²¶|²¯|²¨|²¡|²š|²“|²Œ|²…|²~|²w|²p|²i|²b|²[|²T|²M|²F|²?|²8|²1|²*|²#|²|²|²|²|²|²ù{²ò{²ë{²ä{²Ý{²Ö{²Ï{²È{²Á{²º{²³{²¬{²¥{²ž{²—{²{²‰{²‚{²{{²t{²m{²f{²_{²X{²Q{²J{²C{²<{²5{².{²'{² {²{²{² {²{²ýz²öz²ïz²èz²áz²Úz²Óz²Ìz²Åz²¾z²·z²°z²©z²¢z²›z²”z²z²†z²z²xz²qz²jz²cz²\z²Uz²Nz²Gz²@z²9z²2z²+z²$z²z²z²z²z²z²úy²óy²ìy²åy²Þy²×y²Ðy²Éy²Ây²»y²´y²­y²¦y²Ÿy²˜y²‘y²Šy²ƒy²|y²uy²ny²gy²`y²Yy²Ry²Ky²Dy²=y²6y²/y²(y²!y²y²y² y²y²þx²÷x²ðx²éx²âx²Ûx²Ôx²Íx²Æx²¿x²¸x²±x²ªx²£x²œx²•x²Žx²‡x²€x²yx²rx²kx²dx²]x²Vx²Ox²Hx²Ax²:x²3x²,x²%x²x²x²x² x²x²ûw²ôw²íw²æw²ßw²Øw²Ñw²Êw²Ãw²¼w²µw²®w²§w² w²™w²’w²‹w²„w²}w²vw²ow²hw²aw²Zw²Sw²Lw²Ew²>w²7w²0w²)w²"w²w²w² w²w²ÿv²øv²ñv²êv²ãv²Üv²Õv²Îv²Çv²Àv²¹v²²v²«v²¤v²v²–v²v²ˆv²v²zv²sv²lv²ev²^v²Wv²Pv²Iv²Bv²;v²4v²-v²&v²v²v²v² v²v²üu²õu²îu²çu²àu²Ùu²Òu²Ëu²Äu²½u²¶u²¯u²¨u²¡u²šu²“u²Œu²…u²~u²wu²pu²iu²bu²[u²Tu²Mu²Fu²?u²8u²1u²*u²#u²u²u²u²u²u²ùt²òt²ët²ät²Ýt²Öt²Ït²Èt²Át²ºt²³t²¬t²¥t²žt²—t²t²‰t²‚t²{t²tt²mt²ft²_t²Xt²Qt²Jt²Ct²p²7p²0p²)p²"p²p²p² p²p²ÿo²øo²ño²êo²ão²Üo²Õo²Îo²Ço²Ào²¹o²²o²«o²¤o²o²–o²o²ˆo²o²zo²so²lo²eo²^o²Wo²Po²Io²Bo²;o²4o²-o²&o²o²o²o² o²o²ün²õn²în²çn²àn²Ùn²Òn²Ën²Än²½n²¶n²¯n²¨n²¡n²šn²“n²Œn²…n²~n²wn²pn²in²bn²[n²Tn²Mn²Fn²?n²8n²1n²*n²#n²n²n²n²n²n²ùm²òm²ëm²äm²Ým²Öm²Ïm²Èm²Ám²ºm²³m²¬m²¥m²žm²—m²m²‰m²‚m²{m²tm²mm²fm²_m²Xm²Qm²Jm²Cm²i²7i²0i²)i²"i²i²i² i²i²ÿh²øh²ñh²êh²ãh²Üh²Õh²Îh²Çh²Àh²¹h²²h²«h²¤h²h²–h²h²ˆh²h²zh²sh²lh²eh²^h²Wh²Ph²Ih²Bh²;h²4h²-h²&h²h²h²h² h²h²üg²õg²îg²çg²àg²Ùg²Òg²Ëg²Äg²½g²¶g²¯g²¨g²¡g²šg²“g²Œg²…g²~g²wg²pg²ig²bg²[g²Tg²Mg²Fg²?g²8g²1g²*g²#g²g²g²g²g²g²ùf²òf²ëf²äf²Ýf²Öf²Ïf²Èf²Áf²ºf²³f²¬f²¥f²žf²—f²f²‰f²‚f²{f²tf²mf²ff²_f²Xf²Qf²Jf²Cf²b²7b²0b²)b²"b²b²b² b²b²ÿa²øa²ña²êa²ãa²Üa²Õa²Îa²Ça²Àa²¹a²²a²«a²¤a²a²–a²a²ˆa²a²za²sa²la²ea²^a²Wa²Pa²Ia²Ba²;a²4a²-a²&a²a²a²a² a²a²ü`²õ`²î`²ç`²à`²Ù`²Ò`²Ë`²Ä`²½`²¶`²¯`²¨`²¡`²š`²“`²Œ`²…`²~`²w`²p`²i`²b`²[`²T`²M`²F`²?`²8`²1`²*`²#`²`²`²`²`²`²ù_²ò_²ë_²ä_²Ý_²Ö_²Ï_²È_²Á_²º_²³_²¬_²¥_²ž_²—_²_²‰_²‚_²{_²t_²m_²f_²__²X_²Q_²J_²C_²<_²5_²._²'_² _²_²_² _²_²ý^²ö^²ï^²è^²á^²Ú^²Ó^²Ì^²Å^²¾^²·^²°^²©^²¢^²›^²”^²^²†^²^²x^²q^²j^²c^²\^²U^²N^²G^²@^²9^²2^²+^²$^²^²^²^²^²^²ú]²ó]²ì]²å]²Þ]²×]²Ð]²É]²Â]²»]²´]²­]²¦]²Ÿ]²˜]²‘]²Š]²ƒ]²|]²u]²n]²g]²`]²Y]²R]²K]²D]²=]²6]²/]²(]²!]²]²]² ]²]²þ\²÷\²ð\²é\²â\²Û\²Ô\²Í\²Æ\²¿\²¸\²±\²ª\²£\²œ\²•\²Ž\²‡\²€\²y\²r\²k\²d\²]\²V\²O\²H\²A\²:\²3\²,\²%\²\²\²\² \²\²û[²ô[²í[²æ[²ß[²Ø[²Ñ[²Ê[²Ã[²¼[²µ[²®[²§[² [²™[²’[²‹[²„[²}[²v[²o[²h[²a[²Z[²S[²L[²E[²>[²7[²0[²)[²"[²[²[² [²[²ÿZ²øZ²ñZ²êZ²ãZ²ÜZ²ÕZ²ÎZ²ÇZ²ÀZ²¹Z²²Z²«Z²¤Z²Z²–Z²Z²ˆZ²Z²zZ²sZ²lZ²eZ²^Z²WZ²PZ²IZ²BZ²;Z²4Z²-Z²&Z²Z²Z²Z² Z²Z²üY²õY²îY²çY²àY²ÙY²ÒY²ËY²ÄY²½Y²¶Y²¯Y²¨Y²¡Y²šY²“Y²ŒY²…Y²~Y²wY²pY²iY²bY²[Y²TY²MY²FY²?Y²8Y²1Y²*Y²#Y²Y²Y²Y²Y²Y²ùX²òX²ëX²äX²ÝX²ÖX²ÏX²ÈX²ÁX²ºX²³X²¬X²¥X²žX²—X²X²‰X²‚X²{X²tX²mX²fX²_X²XX²QX²JX²CX²T²7T²0T²)T²"T²T²T² T²T²ÿS²øS²ñS²êS²ãS²ÜS²ÕS²ÎS²ÇS²ÀS²¹S²²S²«S²¤S²S²–S²S²ˆS²S²zS²sS²lS²eS²^S²WS²PS²IS²BS²;S²4S²-S²&S²S²S²S² S²S²üR²õR²îR²çR²àR²ÙR²ÒR²ËR²ÄR²½R²¶R²¯R²¨R²¡R²šR²“R²ŒR²…R²~R²wR²pR²iR²bR²[R²TR²MR²FR²?R²8R²1R²*R²#R²R²R²R²R²R²ùQ²òQ²ëQ²äQ²ÝQ²ÖQ²ÏQ²ÈQ²ÁQ²ºQ²³Q²¬Q²¥Q²žQ²—Q²Q²‰Q²‚Q²{Q²tQ²mQ²fQ²_Q²XQ²QQ²JQ²CQ²M²7M²0M²)M²"M²M²M² M²M²ÿL²øL²ñL²êL²ãL²ÜL²ÕL²ÎL²ÇL²ÀL²¹L²²L²«L²¤L²L²–L²L²ˆL²L²zL²sL²lL²eL²^L²WL²PL²IL²BL²;L²4L²-L²&L²L²L²L² L²L²üK²õK²îK²çK²àK²ÙK²ÒK²ËK²ÄK²½K²¶K²¯K²¨K²¡K²šK²“K²ŒK²…K²~K²wK²pK²iK²bK²[K²TK²MK²FK²?K²8K²1K²*K²#K²K²K²K²K²K²ùJ²òJ²ëJ²äJ²ÝJ²ÖJ²ÏJ²ÈJ²ÁJ²ºJ²³J²¬J²¥J²žJ²—J²J²‰J²‚J²{J²tJ²mJ²fJ²_J²XJ²QJ²JJ²CJ²F²7F²0F²)F²"F²F²F² F²F²ÿE²øE²ñE²êE²ãE²ÜE²ÕE²ÎE²ÇE²ÀE²¹E²²E²«E²¤E²E²–E²E²ˆE²E²zE²sE²lE²eE²^E²WE²PE²IE²BE²;E²4E²-E²&E²E²E²E² E²E²üD²õD²îD²çD²àD²ÙD²ÒD²ËD²ÄD²½D²¶D²¯D²¨D²¡D²šD²“D²ŒD²…D²~D²wD²pD²iD²bD²[D²TD²MD²FD²?D²8D²1D²*D²#D²D²D²D²D²D²ùC²òC²ëC²äC²ÝC²ÖC²ÏC²ÈC²ÁC²ºC²³C²¬C²¥C²žC²—C²C²‰C²‚C²{C²tC²mC²fC²_C²XC²QC²JC²CC²?²7?²0?²)?²"?²?²?² ?²?²ÿ>²ø>²ñ>²ê>²ã>²Ü>²Õ>²Î>²Ç>²À>²¹>²²>²«>²¤>²>²–>²>²ˆ>²>²z>²s>²l>²e>²^>²W>²P>²I>²B>²;>²4>²->²&>²>²>²>² >²>²ü=²õ=²î=²ç=²à=²Ù=²Ò=²Ë=²Ä=²½=²¶=²¯=²¨=²¡=²š=²“=²Œ=²…=²~=²w=²p=²i=²b=²[=²T=²M=²F=²?=²8=²1=²*=²#=²=²=²=²=²=²ù<²ò<²ë<²ä<²Ý<²Ö<²Ï<²È<²Á<²º<²³<²¬<²¥<²ž<²—<²<²‰<²‚<²{<²t<²m<²f<²_<²X<²Q<²J<²C<²<<²5<².<²'<² <²<²<² <²<²ý;²ö;²ï;²è;²á;²Ú;²Ó;²Ì;²Å;²¾;²·;²°;²©;²¢;²›;²”;²;²†;²;²x;²q;²j;²c;²\;²U;²N;²G;²@;²9;²2;²+;²$;²;²;²;²;²;²ú:²ó:²ì:²å:²Þ:²×:²Ð:²É:²Â:²»:²´:²­:²¦:²Ÿ:²˜:²‘:²Š:²ƒ:²|:²u:²n:²g:²`:²Y:²R:²K:²D:²=:²6:²/:²(:²!:²:²:² :²:²þ9²÷9²ð9²é9²â9²Û9²Ô9²Í9²Æ9²¿9²¸9²±9²ª9²£9²œ9²•9²Ž9²‡9²€9²y9²r9²k9²d9²]9²V9²O9²H9²A9²:9²39²,9²%9²9²9²9² 9²9²û8²ô8²í8²æ8²ß8²Ø8²Ñ8²Ê8²Ã8²¼8²µ8²®8²§8² 8²™8²’8²‹8²„8²}8²v8²o8²h8²a8²Z8²S8²L8²E8²>8²78²08²)8²"8²8²8² 8²8²ÿ7²ø7²ñ7²ê7²ã7²Ü7²Õ7²Î7²Ç7²À7²¹7²²7²«7²¤7²7²–7²7²ˆ7²7²z7²s7²l7²e7²^7²W7²P7²I7²B7²;7²47²-7²&7²7²7²7² 7²7²ü6²õ6²î6²ç6²à6²Ù6²Ò6²Ë6²Ä6²½6²¶6²¯6²¨6²¡6²š6²“6²Œ6²…6²~6²w6²p6²i6²b6²[6²T6²M6²F6²?6²86²16²*6²#6²6²6²6²6²6²ù5²ò5²ë5²ä5²Ý5²Ö5²Ï5²È5²Á5²º5²³5²¬5²¥5²ž5²—5²5²‰5²‚5²{5²t5²m5²f5²_5²X5²Q5²J5²C5²<5²55².5²'5² 5²5²5² 5²5²ý4²ö4²ï4²è4²á4²Ú4²Ó4²Ì4²Å4²¾4²·4²°4²©4²¢4²›4²”4²4²†4²4²x4²q4²j4²c4²\4²U4²N4²G4²@4²94²24²+4²$4²4²4²4²4²4²ú3²ó3²ì3²å3²Þ3²×3²Ð3²É3²Â3²»3²´3²­3²¦3²Ÿ3²˜3²‘3²Š3²ƒ3²|3²u3²n3²g3²`3²Y3²R3²K3²D3²=3²63²/3²(3²!3²3²3² 3²3²þ2²÷2²ð2²é2²â2²Û2²Ô2²Í2²Æ2²¿2²¸2²±2²ª2²£2²œ2²•2²Ž2²‡2²€2²y2²r2²k2²d2²]2²V2²O2²H2²A2²:2²32²,2²%2²2²2²2² 2²2²û1²ô1²í1²æ1²ß1²Ø1²Ñ1²Ê1²Ã1²¼1²µ1²®1²§1² 1²™1²’1²‹1²„1²}1²v1²o1²h1²a1²Z1²S1²L1²E1²>1²71²01²)1²"1²1²1² 1²1²ÿ0²ø0²ñ0²ê0²ã0²Ü0²Õ0²Î0²Ç0²À0²¹0²²0²«0²¤0²0²–0²0²ˆ0²0²z0²s0²l0²e0²^0²W0²P0²I0²B0²;0²40²-0²&0²0²0²0² 0²0²ü/²õ/²î/²ç/²à/²Ù/²Ò/²Ë/²Ä/²½/²¶/²¯/²¨/²¡/²š/²“/²Œ/²…/²~/²w/²p/²i/²b/²[/²T/²M/²F/²?/²8/²1/²*/²#/²/²/²/²/²/²ù.²ò.²ë.²ä.²Ý.²Ö.²Ï.²È.²Á.²º.²³.²¬.²¥.²ž.²—.².²‰.²‚.²{.²t.²m.²f.²_.²X.²Q.²J.²C.²<.²5.²..²'.² .².².² .².²ý-²ö-²ï-²è-²á-²Ú-²Ó-²Ì-²Å-²¾-²·-²°-²©-²¢-²›-²”-²-²†-²-²x-²q-²j-²c-²\-²U-²N-²G-²@-²9-²2-²+-²$-²-²-²-²-²-²ú,²ó,²ì,²å,²Þ,²×,²Ð,²É,²Â,²»,²´,²­,²¦,²Ÿ,²˜,²‘,²Š,²ƒ,²|,²u,²n,²g,²`,²Y,²R,²K,²D,²=,²6,²/,²(,²!,²,²,² ,²,²þ+²÷+²ð+²é+²â+²Û+²Ô+²Í+²Æ+²¿+²¸+²±+²ª+²£+²œ+²•+²Ž+²‡+²€+²y+²r+²k+²d+²]+²V+²O+²H+²A+²:+²3+²,+²%+²+²+²+² +²+²û*²ô*²í*²æ*²ß*²Ø*²Ñ*²Ê*²Ã*²¼*²µ*²®*²§*² *²™*²’*²‹*²„*²}*²v*²o*²h*²a*²Z*²S*²L*²E*²>*²7*²0*²)*²"*²*²*² *²*²ÿ)²ø)²ñ)²ê)²ã)²Ü)²Õ)²Î)²Ç)²À)²¹)²²)²«)²¤)²)²–)²)²ˆ)²)²z)²s)²l)²e)²^)²W)²P)²I)²B)²;)²4)²-)²&)²)²)²)² )²)²ü(²õ(²î(²ç(²à(²Ù(²Ò(²Ë(²Ä(²½(²¶(²¯(²¨(²¡(²š(²“(²Œ(²…(²~(²w(²p(²i(²b(²[(²T(²M(²F(²?(²8(²1(²*(²#(²(²(²(²(²(²ù'²ò'²ë'²ä'²Ý'²Ö'²Ï'²È'²Á'²º'²³'²¬'²¥'²ž'²—'²'²‰'²‚'²{'²t'²m'²f'²_'²X'²Q'²J'²C'²<'²5'².'²''² '²'²'² '²'²ý&²ö&²ï&²è&²á&²Ú&²Ó&²Ì&²Å&²¾&²·&²°&²©&²¢&²›&²”&²&²†&²&²x&²q&²j&²c&²\&²U&²N&²G&²@&²9&²2&²+&²$&²&²&²&²&²&²ú%²ó%²ì%²å%²Þ%²×%²Ð%²É%²Â%²»%²´%²­%²¦%²Ÿ%²˜%²‘%²Š%²ƒ%²|%²u%²n%²g%²`%²Y%²R%²K%²D%²=%²6%²/%²(%²!%²%²%² %²%²þ$²÷$²ð$²é$²â$²Û$²Ô$²Í$²Æ$²¿$²¸$²±$²ª$²£$²œ$²•$²Ž$²‡$²€$²y$²r$²k$²d$²]$²V$²O$²H$²A$²:$²3$²,$²%$²$²$²$² $²$²û#²ô#²í#²æ#²ß#²Ø#²Ñ#²Ê#²Ã#²¼#²µ#²®#²§#² #²™#²’#²‹#²„#²}#²v#²o#²h#²a#²Z#²S#²L#²E#²>#²7#²0#²)#²"#²#²#² #²#²ÿ"²ø"²ñ"²ê"²ã"²Ü"²Õ"²Î"²Ç"²À"²¹"²²"²«"²¤"²"²–"²"²ˆ"²"²z"²s"²l"²e"²^"²W"²P"²I"²B"²;"²4"²-"²&"²"²"²"² "²"²ü!²õ!²î!²ç!²à!²Ù!²Ò!²Ë!²Ä!²½!²¶!²¯!²¨!²¡!²š!²“!²Œ!²…!²~!²w!²p!²i!²b!²[!²T!²M!²F!²?!²8!²1!²*!²#!²!²!²!²!²!²ù ²ò ²ë ²ä ²Ý ²Ö ²Ï ²È ²Á ²º ²³ ²¬ ²¥ ²ž ²— ² ²‰ ²‚ ²{ ²t ²m ²f ²_ ²X ²Q ²J ²C ²< ²5 ². ²' ² ² ² ² ² ²ý²ö²ï²è²á²Ú²Ó²Ì²Å²¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú²ó²ì²å²Þ²×²Ð²É²Â²»²´²­²¦²Ÿ²˜²‘²Š²ƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û²ô²í²æ²ß²Ø²Ñ²Ê²Ã²¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ²ø²ñ²ê²ã²Ü²Õ²Î²Ç²À²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü²õ²î²ç²à²Ù²Ò²Ë²Ä²½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù²ò²ë²ä²Ý²Ö²Ï²È²Á²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý²ö²ï²è²á²Ú²Ó²Ì²Å²¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú²ó²ì²å²Þ²×²Ð²É²Â²»²´²­²¦²Ÿ²˜²‘²Š²ƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û²ô²í²æ²ß²Ø²Ñ²Ê²Ã²¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ²ø²ñ²ê²ã²Ü²Õ²Î²Ç²À²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü²õ²î²ç²à²Ù²Ò²Ë²Ä²½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù²ò²ë²ä²Ý²Ö²Ï²È²Á²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý²ö²ï²è²á²Ú²Ó²Ì²Å²¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú²ó²ì²å²Þ²×²Ð²É²Â²»²´²­²¦²Ÿ²˜²‘²Š²ƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û²ô²í²æ²ß²Ø²Ñ²Ê²Ã²¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ ²ø ²ñ ²ê ²ã ²Ü ²Õ ²Î ²Ç ²À ²¹ ²² ²« ²¤ ² ²– ² ²ˆ ² ²z ²s ²l ²e ²^ ²W ²P ²I ²B ²; ²4 ²- ²& ² ² ² ² ² ²ü ²õ ²î ²ç ²à ²Ù ²Ò ²Ë ²Ä ²½ ²¶ ²¯ ²¨ ²¡ ²š ²“ ²Œ ²… ²~ ²w ²p ²i ²b ²[ ²T ²M ²F ²? ²8 ²1 ²* ²# ² ² ² ² ² ²ù ²ò ²ë ²ä ²Ý ²Ö ²Ï ²È ²Á ²º ²³ ²¬ ²¥ ²ž ²— ² ²‰ ²‚ ²{ ²t ²m ²f ²_ ²X ²Q ²J ²C ²< ²5 ². ²' ² ² ² ² ² ²ý ²ö ²ï ²è ²á ²Ú ²Ó ²Ì ²Å ²¾ ²· ²° ²© ²¢ ²› ²” ² ²† ² ²x ²q ²j ²c ²\ ²U ²N ²G ²@ ²9 ²2 ²+ ²$ ² ² ² ² ² ²ú ²ó ²ì ²å ²Þ ²× ²Ð ²É ² ²» ²´ ²­ ²¦ ²Ÿ ²˜ ²‘ ²Š ²ƒ ²| ²u ²n ²g ²` ²Y ²R ²K ²D ²= ²6 ²/ ²( ²! ² ² ² ² ²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û²ô²í²æ²ß²Ø²Ñ²Ê²Ã²¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ²ø²ñ²ê²ã²Ü²Õ²Î²Ç²À²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü²õ²î²ç²à²Ù²Ò²Ë²Ä²½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù²ò²ë²ä²Ý²Ö²Ï²È²Á²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý²ö²ï²è²á²Ú²Ó²Ì²Å²¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú²ó²ì²å²Þ²×²Ð²É²Â²»²´²­²¦²Ÿ²˜²‘²Š²ƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ²÷²ð²é²â²Û²Ô²Í²Æ²¿²¸²±²ª²£²œ²•²Ž²‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û²ô²í²æ²ß²زѲʲò¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿÿ±øÿ±ñÿ±êÿ±ãÿ±Üÿ±Õÿ±Îÿ±Çÿ±Àÿ±¹ÿ±²ÿ±«ÿ±¤ÿ±ÿ±–ÿ±ÿ±ˆÿ±ÿ±zÿ±sÿ±lÿ±eÿ±^ÿ±Wÿ±Pÿ±Iÿ±Bÿ±;ÿ±4ÿ±-ÿ±&ÿ±ÿ±ÿ±ÿ± ÿ±ÿ±üþ±õþ±îþ±çþ±àþ±Ùþ±Òþ±Ëþ±Äþ±½þ±¶þ±¯þ±¨þ±¡þ±šþ±“þ±Œþ±…þ±~þ±wþ±pþ±iþ±bþ±[þ±Tþ±Mþ±Fþ±?þ±8þ±1þ±*þ±#þ±þ±þ±þ±þ±þ±ùý±òý±ëý±äý±Ýý±Öý±Ïý±Èý±Áý±ºý±³ý±¬ý±¥ý±žý±—ý±ý±‰ý±‚ý±{ý±tý±mý±fý±_ý±Xý±Qý±Jý±Cý±<ý±5ý±.ý±'ý± ý±ý±ý± ý±ý±ýü±öü±ïü±èü±áü±Úü±Óü±Ìü±Åü±¾ü±·ü±°ü±©ü±¢ü±›ü±”ü±ü±†ü±ü±xü±qü±jü±cü±\ü±Uü±Nü±Gü±@ü±9ü±2ü±+ü±$ü±ü±ü±ü±ü±ü±úû±óû±ìû±åû±Þû±×û±Ðû±Éû±Âû±»û±´û±­û±¦û±Ÿû±˜û±‘û±Šû±ƒû±|û±uû±nû±gû±`û±Yû±Rû±Kû±Dû±=û±6û±/û±(û±!û±û±û± û±û±þú±÷ú±ðú±éú±âú±Ûú±Ôú±Íú±Æú±¿ú±¸ú±±ú±ªú±£ú±œú±•ú±Žú±‡ú±€ú±yú±rú±kú±dú±]ú±Vú±Oú±Hú±Aú±:ú±3ú±,ú±%ú±ú±ú±ú± ú±ú±ûù±ôù±íù±æù±ßù±Øù±Ñù±Êù±Ãù±¼ù±µù±®ù±§ù± ù±™ù±’ù±‹ù±„ù±}ù±vù±où±hù±aù±Zù±Sù±Lù±Eù±>ù±7ù±0ù±)ù±"ù±ù±ù± ù±ù±ÿø±øø±ñø±êø±ãø±Üø±Õø±Îø±Çø±Àø±¹ø±²ø±«ø±¤ø±ø±–ø±ø±ˆø±ø±zø±sø±lø±eø±^ø±Wø±Pø±Iø±Bø±;ø±4ø±-ø±&ø±ø±ø±ø± ø±ø±ü÷±õ÷±î÷±ç÷±à÷±Ù÷±Ò÷±Ë÷±Ä÷±½÷±¶÷±¯÷±¨÷±¡÷±š÷±“÷±Œ÷±…÷±~÷±w÷±p÷±i÷±b÷±[÷±T÷±M÷±F÷±?÷±8÷±1÷±*÷±#÷±÷±÷±÷±÷±÷±ùö±òö±ëö±äö±Ýö±Öö±Ïö±Èö±Áö±ºö±³ö±¬ö±¥ö±žö±—ö±ö±‰ö±‚ö±{ö±tö±mö±fö±_ö±Xö±Qö±Jö±Cö±<ö±5ö±.ö±'ö± ö±ö±ö± ö±ö±ýõ±öõ±ïõ±èõ±áõ±Úõ±Óõ±Ìõ±Åõ±¾õ±·õ±°õ±©õ±¢õ±›õ±”õ±õ±†õ±õ±xõ±qõ±jõ±cõ±\õ±Uõ±Nõ±Gõ±@õ±9õ±2õ±+õ±$õ±õ±õ±õ±õ±õ±úô±óô±ìô±åô±Þô±×ô±Ðô±Éô±Âô±»ô±´ô±­ô±¦ô±Ÿô±˜ô±‘ô±Šô±ƒô±|ô±uô±nô±gô±`ô±Yô±Rô±Kô±Dô±=ô±6ô±/ô±(ô±!ô±ô±ô± ô±ô±þó±÷ó±ðó±éó±âó±Ûó±Ôó±Íó±Æó±¿ó±¸ó±±ó±ªó±£ó±œó±•ó±Žó±‡ó±€ó±yó±ró±kó±dó±]ó±Vó±Oó±Hó±Aó±:ó±3ó±,ó±%ó±ó±ó±ó± ó±ó±ûò±ôò±íò±æò±ßò±Øò±Ñò±Êò±Ãò±¼ò±µò±®ò±§ò± ò±™ò±’ò±‹ò±„ò±}ò±vò±oò±hò±aò±Zò±Sò±Lò±Eò±>ò±7ò±0ò±)ò±"ò±ò±ò± ò±ò±ÿñ±øñ±ññ±êñ±ãñ±Üñ±Õñ±Îñ±Çñ±Àñ±¹ñ±²ñ±«ñ±¤ñ±ñ±–ñ±ñ±ˆñ±ñ±zñ±sñ±lñ±eñ±^ñ±Wñ±Pñ±Iñ±Bñ±;ñ±4ñ±-ñ±&ñ±ñ±ñ±ñ± ñ±ñ±üð±õð±îð±çð±àð±Ùð±Òð±Ëð±Äð±½ð±¶ð±¯ð±¨ð±¡ð±šð±“ð±Œð±…ð±~ð±wð±pð±ið±bð±[ð±Tð±Mð±Fð±?ð±8ð±1ð±*ð±#ð±ð±ð±ð±ð±ð±ùï±òï±ëï±äï±Ýï±Öï±Ïï±Èï±Áﱺﱳﱬﱥﱞﱗï±ï±‰ï±‚ï±{ï±tï±mï±fï±_ï±Xï±Qï±Jï±Cï±<ï±5ï±.ï±'ï± ï±ï±ï± ï±ï±ýî±öî±ïî±èî±áî±Úî±Óî±Ìî±Åî±î±†î±î±xî±qî±jî±cî±\î±Uî±Nî±Gî±@î±9î±2î±+î±$î±î±î±î±î±î±úí±óí±ìí±åí±Þí±×í±Ðí±Éí±Âí±»í±´í±­í±¦í±Ÿí±˜í±‘í±Ší±ƒí±|í±uí±ní±gí±`í±Yí±Rí±Kí±Dí±=í±6í±/í±(í±!í±í±í± í±í±þì±÷ì±ðì±éì±âì±Ûì±Ôì±Íì±Æì±¿ì±¸ì±±ì±ªì±£ì±œì±•ì±Žì±‡ì±€ì±yì±rì±kì±dì±]ì±Vì±Oì±Hì±Aì±:ì±3ì±,ì±%ì±ì±ì±ì± ì±ì±ûë±ôë±íë±æë±ßë±Øë±Ñë±Êë±Ã뱼뱵뱮뱧뱠뱙뱒뱋뱄ë±}ë±vë±oë±hë±aë±Zë±Së±Lë±Eë±>ë±7ë±0ë±)ë±"ë±ë±ë± ë±ë±ÿê±øê±ñê±êê±ãê±Üê±Õê±Îê±Çê±À걹걲걫걤ê±ê±–ê±ê±ˆê±ê±zê±sê±lê±eê±^ê±Wê±Pê±Iê±Bê±;ê±4ê±-ê±&ê±ê±ê±ê± ê±ê±üé±õé±îé±çé±àé±Ùé±Òé±Ëé±Ä鱽鱶鱯鱨鱡鱚鱓鱌鱅é±~é±wé±pé±ié±bé±[é±Té±Mé±Fé±?é±8é±1é±*é±#é±é±é±é±é±é±ùè±òè±ëè±äè±Ýè±Öè±Ïè±Èè±Á豺豳豬豥豞豗è±è±‰è±‚è±{è±tè±mè±fè±_è±Xè±Qè±Jè±Cè±<è±5è±.è±'è± è±è±è± è±è±ýç±öç±ïç±èç±áç±Úç±Óç±Ìç±Å籾籷籰籩籢籛籔ç±ç±†ç±ç±xç±qç±jç±cç±\ç±Uç±Nç±Gç±@ç±9ç±2ç±+ç±$ç±ç±ç±ç±ç±ç±úæ±óæ±ìæ±åæ±Þæ±׿±Ðæ±Éæ±Â汻汴汭汦江汘汑汊汃æ±|æ±uæ±næ±gæ±`æ±Yæ±Ræ±Kæ±Dæ±=æ±6æ±/æ±(æ±!æ±æ±æ± æ±æ±þå±÷å±ðå±éå±âå±Ûå±Ôå±Íå±Æå±¿å±¸å±±å±ªå±£å±œå±•å±Žå±‡å±€å±yå±rå±kå±då±]å±Vå±Oå±Hå±Aå±:å±3å±,å±%å±å±å±å± å±å±ûä±ôä±í䱿ä±ß䱨ä±Ñä±Êä±Ã䱼䱵䱮䱧䱠䱙䱒䱋䱄ä±}ä±vä±oä±hä±aä±Zä±Sä±Lä±Eä±>ä±7ä±0ä±)ä±"ä±ä±ä± ä±ä±ÿã±øã±ñã±êã±ãã±Üã±Õã±Îã±Çã±À㱹㱲㱫㱤ã±ã±–ã±ã±ˆã±ã±zã±sã±lã±eã±^ã±Wã±Pã±Iã±Bã±;ã±4ã±-ã±&ã±ã±ã±ã± ã±ã±üâ±õâ±îâ±çâ±àâ±Ùâ±Òâ±Ëâ±ÄⱽⱶⱯⱨⱡⱚⱓⱌⱅâ±~â±wâ±pâ±iâ±bâ±[â±Tâ±Mâ±Fâ±?â±8â±1â±*â±#â±â±â±â±â±â±ùá±òá±ëá±äá±Ýá±Öá±Ïá±Èá±Áᱺᱳᱬᱥᱞ᱗á±á±‰á±‚á±{á±tá±má±fá±_á±Xá±Qá±Já±Cá±<á±5á±.á±'á± á±á±á± á±á±ýà±öà±ïà±èà±áà±Úà±Óà±Ìà±Å౾౷౰౩ౢ౛౔à±à±†à±à±xà±qà±jà±cà±\à±Uà±Nà±Gà±@à±9à±2à±+à±$à±à±à±à±à±à±úß±óß±ìß±åß±Þß±×ß±Ðß±Éß±Âß±»ß±´ß±­ß±¦ß±Ÿß±˜ß±‘ß±Šß±ƒß±|ß±uß±nß±gß±`ß±Yß±Rß±Kß±Dß±=ß±6ß±/ß±(ß±!߱߱߱ ߱߱þÞ±÷Þ±ðÞ±éÞ±âÞ±ÛÞ±ÔÞ±ÍÞ±ÆÞ±¿Þ±¸Þ±±Þ±ªÞ±£Þ±œÞ±•Þ±ŽÞ±‡Þ±€Þ±yÞ±rÞ±kÞ±dÞ±]Þ±VÞ±OÞ±HÞ±AÞ±:Þ±3Þ±,Þ±%Þ±Þ±Þ±Þ± Þ±Þ±ûݱôݱíݱæÝ±ßݱØÝ±ÑݱÊݱÃݱ¼Ý±µÝ±®Ý±§Ý± Ý±™Ý±’ݱ‹Ý±„ݱ}ݱvݱoݱhݱaݱZݱSݱLݱEݱ>ݱ7ݱ0ݱ)ݱ"ݱݱݱ ݱݱÿܱøÜ±ñܱêܱãܱÜܱÕܱÎܱÇܱÀܱ¹Ü±²Ü±«Ü±¤Ü±ܱ–ܱܱˆÜ±ܱzܱsܱlܱeܱ^ܱWܱPܱIܱBܱ;ܱ4ܱ-ܱ&ܱܱܱܱ ܱܱüÛ±õÛ±îÛ±çÛ±àÛ±ÙÛ±ÒÛ±ËÛ±ÄÛ±½Û±¶Û±¯Û±¨Û±¡Û±šÛ±“Û±ŒÛ±…Û±~Û±wÛ±pÛ±iÛ±bÛ±[Û±TÛ±MÛ±FÛ±?Û±8Û±1Û±*Û±#Û±Û±Û±Û±Û±Û±ùÚ±òÚ±ëÚ±äÚ±ÝÚ±ÖÚ±ÏÚ±ÈÚ±ÁÚ±ºÚ±³Ú±¬Ú±¥Ú±žÚ±—Ú±Ú±‰Ú±‚Ú±{Ú±tÚ±mÚ±fÚ±_Ú±XÚ±QÚ±JÚ±CÚ±<Ú±5Ú±.Ú±'Ú± Ú±Ú±Ú± Ú±Ú±ýÙ±öÙ±ïÙ±èÙ±áÙ±ÚÙ±ÓÙ±ÌÙ±ÅÙ±¾Ù±·Ù±°Ù±©Ù±¢Ù±›Ù±”ٱٱ†Ù±Ù±xÙ±qÙ±jÙ±cÙ±\Ù±UÙ±NÙ±GÙ±@Ù±9Ù±2Ù±+Ù±$ٱٱٱٱٱٱúرóرìØ±娱ÞØ±ר±ÐØ±ÉØ±Âر»Ø±´Ø±­Ø±¦Ø±ŸØ±˜Ø±‘رŠØ±ƒØ±|رuرnرgر`رYرRرKرDر=ر6ر/ر(ر!ررر ررþ×±÷×±ð×±é×±â×±Û×±Ô×±Í×±Æ×±¿×±¸×±±×±ª×±£×±œ×±•×±Ž×±‡×±€×±y×±r×±k×±d×±]×±V×±O×±H×±A×±:×±3×±,×±%×±×±×±×± ×±×±ûÖ±ôÖ±íÖ±æÖ±ßÖ±ØÖ±ÑÖ±ÊÖ±ÃÖ±¼Ö±µÖ±®Ö±§Ö± Ö±™Ö±’Ö±‹Ö±„Ö±}Ö±vÖ±oÖ±hÖ±aÖ±ZÖ±SÖ±LÖ±EÖ±>Ö±7Ö±0Ö±)Ö±"Ö±Ö±Ö± Ö±Ö±ÿÕ±øÕ±ñÕ±êÕ±ãÕ±ÜÕ±ÕÕ±ÎÕ±ÇÕ±ÀÕ±¹Õ±²Õ±«Õ±¤Õ±Õ±–Õ±Õ±ˆÕ±Õ±zÕ±sÕ±lÕ±eÕ±^Õ±WÕ±PÕ±IÕ±BÕ±;Õ±4Õ±-Õ±&Õ±Õ±Õ±Õ± Õ±Õ±üÔ±õÔ±îÔ±çÔ±àÔ±ÙÔ±ÒÔ±ËÔ±ÄÔ±½Ô±¶Ô±¯Ô±¨Ô±¡Ô±šÔ±“Ô±ŒÔ±…Ô±~Ô±wÔ±pÔ±iÔ±bÔ±[Ô±TÔ±MÔ±FÔ±?Ô±8Ô±1Ô±*Ô±#Ô±Ô±Ô±Ô±Ô±Ô±ùÓ±òÓ±ëÓ±äÓ±ÝÓ±ÖÓ±ÏÓ±ÈÓ±ÁÓ±ºÓ±³Ó±¬Ó±¥Ó±žÓ±—Ó±Ó±‰Ó±‚Ó±{Ó±tÓ±mÓ±fÓ±_Ó±XÓ±QÓ±JÓ±CÓ±<Ó±5Ó±.Ó±'Ó± Ó±Ó±Ó± Ó±Ó±ýÒ±öÒ±ïÒ±èÒ±áÒ±ÚÒ±ÓÒ±ÌÒ±ÅÒ±¾Ò±·Ò±°Ò±©Ò±¢Ò±›Ò±”Ò±Ò±†Ò±Ò±xÒ±qÒ±jÒ±cÒ±\Ò±UÒ±NÒ±GÒ±@Ò±9Ò±2Ò±+Ò±$Ò±Ò±Ò±Ò±Ò±Ò±úѱóѱìѱåѱÞѱ×ѱÐѱÉѱÂѱ»Ñ±´Ñ±­Ñ±¦Ñ±ŸÑ±˜Ñ±‘ѱŠÑ±ƒÑ±|ѱuѱnѱgѱ`ѱYѱRѱKѱDѱ=ѱ6ѱ/ѱ(ѱ!ѱѱѱ ѱѱþб÷бðбéбâбÛбÔбÍбÆÐ±¿Ð±¸Ð±±Ð±ªÐ±£Ð±œÐ±•бŽÐ±‡Ð±€Ð±yбrбkбdб]бVбOбHбAб:б3б,б%бббб ббûϱôϱíϱæÏ±ßϱØÏ±ÑϱÊϱÃϱ¼Ï±µÏ±®Ï±§Ï± Ï±™Ï±’ϱ‹Ï±„ϱ}ϱvϱoϱhϱaϱZϱSϱLϱEϱ>ϱ7ϱ0ϱ)ϱ"ϱϱϱ ϱϱÿαøÎ±ñαêαãαÜαÕαÎαÇαÀα¹Î±²Î±«Î±¤Î±α–ααˆÎ±αzαsαlαeα^αWαPαIαBα;α4α-α&αααα ααüͱõͱîͱçͱàͱÙͱÒͱËͱÄͱ½Í±¶Í±¯Í±¨Í±¡Í±šÍ±“ͱŒÍ±…ͱ~ͱwͱpͱiͱbͱ[ͱTͱMͱFͱ?ͱ8ͱ1ͱ*ͱ#ͱͱͱͱͱͱù̱ò̱ë̱ä̱Ý̱Ö̱Ï̱È̱Á̱ºÌ±³Ì±¬Ì±¥Ì±žÌ±—̱̱‰Ì±‚̱{̱ṯm̱f̱_̱X̱Q̱J̱C̱<̱5̱.̱'̱ ̱̱̱ ̱̱ý˱ö˱ï˱è˱á˱Ú˱Ó˱Ì˱Å˱¾Ë±·Ë±°Ë±©Ë±¢Ë±›Ë±”˱˱†Ë±˱x˱q˱j˱c˱\˱U˱N˱G˱@˱9˱2˱+˱$˱˱˱˱˱˱úʱóʱìʱåʱÞʱ×ʱÐʱÉʱÂʱ»Ê±´Ê±­Ê±¦Ê±ŸÊ±˜Ê±‘ʱŠÊ±ƒÊ±|ʱuʱnʱgʱ`ʱYʱRʱKʱDʱ=ʱ6ʱ/ʱ(ʱ!ʱʱʱ ʱʱþɱ÷ɱðɱéɱâɱÛɱÔɱÍɱÆÉ±¿É±¸É±±É±ªÉ±£É±œÉ±•ɱŽÉ±‡É±€É±yɱrɱkɱdɱ]ɱVɱOɱHɱAɱ:ɱ3ɱ,ɱ%ɱɱɱɱ ɱɱûȱôȱíȱæÈ±ßȱØÈ±ÑȱÊȱÃȱ¼È±µÈ±®È±§È± È±™È±’ȱ‹È±„ȱ}ȱvȱoȱhȱaȱZȱSȱLȱEȱ>ȱ7ȱ0ȱ)ȱ"ȱȱȱ ȱȱÿDZøÇ±ñDZêDZãDZÜDZÕDZÎDZÇDZÀDZ¹Ç±²Ç±«Ç±¤Ç±DZ–DZDZˆÇ±DZzDZsDZlDZeDZ^DZWDZPDZIDZBDZ;DZ4DZ-DZ&DZDZDZDZ DZDZüƱõƱîÆ±çÆ±àÆ±ÙÆ±ÒÆ±ËÆ±ÄƱ½Æ±¶Æ±¯Æ±¨Æ±¡Æ±šÆ±“ƱŒÆ±…Ʊ~ƱwƱpƱiƱbƱ[ƱTƱMƱFƱ?Ʊ8Ʊ1Ʊ*Ʊ#ƱƱƱƱƱƱùűòűëűäűÝűÖűÏűÈűÁűºÅ±³Å±¬Å±¥Å±žÅ±—űű‰Å±‚ű{űtűműfű_űXűQűJűCű<ű5ű.ű'ű űűű űűýıöıïıèıáıÚıÓıÌıÅı¾Ä±·Ä±°Ä±©Ä±¢Ä±›Ä±”ıı†Ä±ıxıqıjıcı\ıUıNıGı@ı9ı2ı+ı$ııııııúñóñìñåñÞñ×ñÐñÉñÂñ»Ã±´Ã±­Ã±¦Ã±ŸÃ±˜Ã±‘ñŠÃ±ƒÃ±|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþ±÷±ð±é±â±Û±Ô±ͱÆÂ±¿Â±¸Â±±Â±ªÂ±£Â±œÂ±•±ŽÂ±‡Â±€Â±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±ûÁ±ôÁ±íÁ±æÁ±ßÁ±ØÁ±ÑÁ±ÊÁ±ÃÁ±¼Á±µÁ±®Á±§Á± Á±™Á±’Á±‹Á±„Á±}Á±vÁ±oÁ±hÁ±aÁ±ZÁ±SÁ±LÁ±EÁ±>Á±7Á±0Á±)Á±"Á±Á±Á± Á±Á±ÿÀ±øÀ±ñÀ±êÀ±ãÀ±ÜÀ±ÕÀ±ÎÀ±ÇÀ±ÀÀ±¹À±²À±«À±¤À±À±–À±À±ˆÀ±À±zÀ±sÀ±lÀ±eÀ±^À±WÀ±PÀ±IÀ±BÀ±;À±4À±-À±&À±À±À±À± À±À±ü¿±õ¿±翱࿱Ù¿±Ò¿±Ë¿±Ä¿±½¿±¶¿±¯¿±¨¿±¡¿±š¿±“¿±Œ¿±…¿±~¿±w¿±p¿±i¿±b¿±[¿±T¿±M¿±F¿±?¿±8¿±1¿±*¿±#¿±¿±¿±¿±¿±¿±ù¾±ò¾±ë¾±ä¾±ݾ±Ö¾±Ͼ±Ⱦ±Á¾±º¾±³¾±¬¾±¥¾±ž¾±—¾±¾±‰¾±‚¾±{¾±t¾±m¾±f¾±_¾±X¾±Q¾±J¾±C¾±<¾±5¾±.¾±'¾± ¾±¾±¾± ¾±¾±ý½±ö½±ï½±è½±á½±Ú½±Ó½±̽±ޱ¾½±·½±°½±©½±¢½±›½±”½±½±†½±½±x½±q½±j½±c½±\½±U½±N½±G½±@½±9½±2½±+½±$½±½±½±½±½±½±ú¼±ó¼±ì¼±å¼±Þ¼±×¼±м±ɼ±¼±»¼±´¼±­¼±¦¼±Ÿ¼±˜¼±‘¼±м±ƒ¼±|¼±u¼±n¼±g¼±`¼±Y¼±R¼±K¼±D¼±=¼±6¼±/¼±(¼±!¼±¼±¼± ¼±¼±þ»±÷»±ð»±é»±â»±Û»±Ô»±Í»±Æ»±¿»±¸»±±»±ª»±£»±œ»±•»±Ž»±‡»±€»±y»±r»±k»±d»±]»±V»±O»±H»±A»±:»±3»±,»±%»±»±»±»± »±»±ûº±ôº±íº±溱ߺ±غ±Ѻ±ʺ±ú±¼º±µº±®º±§º± º±™º±’º±‹º±„º±}º±vº±oº±hº±aº±Zº±Sº±Lº±Eº±>º±7º±0º±)º±"º±º±º± º±º±ÿ¹±ø¹±ñ¹±ê¹±ã¹±ܹ±Õ¹±ι±ǹ±À¹±¹¹±²¹±«¹±¤¹±¹±–¹±¹±ˆ¹±¹±z¹±s¹±l¹±e¹±^¹±W¹±P¹±I¹±B¹±;¹±4¹±-¹±&¹±¹±¹±¹± ¹±¹±ü¸±õ¸±縱ัÙ¸±Ò¸±˸±ĸ±½¸±¶¸±¯¸±¨¸±¡¸±š¸±“¸±Œ¸±…¸±~¸±w¸±p¸±i¸±b¸±[¸±T¸±M¸±F¸±?¸±8¸±1¸±*¸±#¸±¸±¸±¸±¸±¸±ù·±ò·±ë·±ä·±Ý·±Ö·±Ï·±È·±Á·±º·±³·±¬·±¥·±ž·±—·±·±‰·±‚·±{·±t·±m·±f·±_·±X·±Q·±J·±C·±<·±5·±.·±'·± ·±·±·± ·±·±ý¶±ö¶±ï¶±è¶±á¶±Ú¶±Ó¶±̶±Ŷ±¾¶±·¶±°¶±©¶±¢¶±›¶±”¶±¶±†¶±¶±x¶±q¶±j¶±c¶±\¶±U¶±N¶±G¶±@¶±9¶±2¶±+¶±$¶±¶±¶±¶±¶±¶±úµ±óµ±ìµ±åµ±Þµ±×µ±е±ɵ±µ±»µ±´µ±­µ±¦µ±Ÿµ±˜µ±‘µ±е±ƒµ±|µ±uµ±nµ±gµ±`µ±Yµ±Rµ±Kµ±Dµ±=µ±6µ±/µ±(µ±!µ±µ±µ± µ±µ±þ´±÷´±ð´±é´±â´±Û´±Ô´±Í´±Æ´±¿´±¸´±±´±ª´±£´±œ´±•´±Ž´±‡´±€´±y´±r´±k´±d´±]´±V´±O´±H´±A´±:´±3´±,´±%´±´±´±´± ´±´±û³±ô³±í³±æ³±ß³±س±ѳ±ʳ±ó±¼³±µ³±®³±§³± ³±™³±’³±‹³±„³±}³±v³±o³±h³±a³±Z³±S³±L³±E³±>³±7³±0³±)³±"³±³±³± ³±³±ÿ²±ø²±ñ²±ê²±ã²±ܲ±Õ²±β±Dz±À²±¹²±²²±«²±¤²±²±–²±²±ˆ²±²±z²±s²±l²±e²±^²±W²±P²±I²±B²±;²±4²±-²±&²±²±²±²± ²±²±ü±±õ±±î±±ç±±à±±Ù±±Ò±±˱±ı±½±±¶±±¯±±¨±±¡±±š±±“±±Œ±±…±±~±±w±±p±±i±±b±±[±±T±±M±±F±±?±±8±±1±±*±±#±±±±±±±±±±±±ù°±ò°±ë°±ä°±ݰ±Ö°±ϰ±Ȱ±Á°±º°±³°±¬°±¥°±ž°±—°±°±‰°±‚°±{°±t°±m°±f°±_°±X°±Q°±J°±C°±<°±5°±.°±'°± °±°±°± °±°±ý¯±ö¯±ﯱ诱ᯱÚ¯±Ó¯±̯±ů±¾¯±·¯±°¯±©¯±¢¯±›¯±”¯±¯±†¯±¯±x¯±q¯±j¯±c¯±\¯±U¯±N¯±G¯±@¯±9¯±2¯±+¯±$¯±¯±¯±¯±¯±¯±ú®±ó®±ì®±å®±Þ®±×®±Ю±É®±®±»®±´®±­®±¦®±Ÿ®±˜®±‘®±Š®±ƒ®±|®±u®±n®±g®±`®±Y®±R®±K®±D®±=®±6®±/®±(®±!®±®±®± ®±®±þ­±÷­±ð­±é­±â­±Û­±Ô­±Í­±Æ­±¿­±¸­±±­±ª­±£­±œ­±•­±Ž­±‡­±€­±y­±r­±k­±d­±]­±V­±O­±H­±A­±:­±3­±,­±%­±­±­±­± ­±­±û¬±ô¬±í¬±欱߬±ج±Ѭ±ʬ±ì±¼¬±µ¬±®¬±§¬± ¬±™¬±’¬±‹¬±„¬±}¬±v¬±o¬±h¬±a¬±Z¬±S¬±L¬±E¬±>¬±7¬±0¬±)¬±"¬±¬±¬± ¬±¬±ÿ«±ø«±ñ«±꫱㫱Ü«±Õ«±Ϋ±Ç«±À«±¹«±²«±««±¤«±«±–«±«±ˆ«±«±z«±s«±l«±e«±^«±W«±P«±I«±B«±;«±4«±-«±&«±«±«±«± «±«±üª±õª±窱઱Ùª±Òª±˪±α½ª±¶ª±¯ª±¨ª±¡ª±šª±“ª±Œª±…ª±~ª±wª±pª±iª±bª±[ª±Tª±Mª±Fª±?ª±8ª±1ª±*ª±#ª±ª±ª±ª±ª±ª±ù©±ò©±멱䩱Ý©±Ö©±Ï©±È©±Á©±º©±³©±¬©±¥©±ž©±—©±©±‰©±‚©±{©±t©±m©±f©±_©±X©±Q©±J©±C©±<©±5©±.©±'©± ©±©±©± ©±©±ý¨±ö¨±僧許ᨱÚ¨±Ó¨±̨±Ũ±¾¨±·¨±°¨±©¨±¢¨±›¨±”¨±¨±†¨±¨±x¨±q¨±j¨±c¨±\¨±U¨±N¨±G¨±@¨±9¨±2¨±+¨±$¨±¨±¨±¨±¨±¨±ú§±ó§±ì§±å§±Þ§±×§±Ч±ɧ±§±»§±´§±­§±¦§±Ÿ§±˜§±‘§±Ч±ƒ§±|§±u§±n§±g§±`§±Y§±R§±K§±D§±=§±6§±/§±(§±!§±§±§± §±§±þ¦±÷¦±ð¦±馱⦱Û¦±Ô¦±ͦ±Ʀ±¿¦±¸¦±±¦±ª¦±£¦±œ¦±•¦±ަ±‡¦±€¦±y¦±r¦±k¦±d¦±]¦±V¦±O¦±H¦±A¦±:¦±3¦±,¦±%¦±¦±¦±¦± ¦±¦±û¥±ô¥±í¥±楱ߥ±Ø¥±Ñ¥±Ê¥±Ã¥±¼¥±µ¥±®¥±§¥± ¥±™¥±’¥±‹¥±„¥±}¥±v¥±o¥±h¥±a¥±Z¥±S¥±L¥±E¥±>¥±7¥±0¥±)¥±"¥±¥±¥± ¥±¥±ÿ¤±ø¤±ñ¤±ꤱ㤱ܤ±Õ¤±Τ±Ǥ±À¤±¹¤±²¤±«¤±¤¤±¤±–¤±¤±ˆ¤±¤±z¤±s¤±l¤±e¤±^¤±W¤±P¤±I¤±B¤±;¤±4¤±-¤±&¤±¤±¤±¤± ¤±¤±ü£±õ£±磱ࣱÙ£±Ò£±Ë£±Ä£±½£±¶£±¯£±¨£±¡£±š£±“£±Œ£±…£±~£±w£±p£±i£±b£±[£±T£±M£±F£±?£±8£±1£±*£±#£±£±£±£±£±£±ù¢±ò¢±뢱䢱Ý¢±Ö¢±Ï¢±È¢±Á¢±º¢±³¢±¬¢±¥¢±ž¢±—¢±¢±‰¢±‚¢±{¢±t¢±m¢±f¢±_¢±X¢±Q¢±J¢±C¢±<¢±5¢±.¢±'¢± ¢±¢±¢± ¢±¢±ý¡±ö¡±衱ᡱÚ¡±Ó¡±Ì¡±Å¡±¾¡±·¡±°¡±©¡±¢¡±›¡±”¡±¡±†¡±¡±x¡±q¡±j¡±c¡±\¡±U¡±N¡±G¡±@¡±9¡±2¡±+¡±$¡±¡±¡±¡±¡±¡±ú ±ó ±ì ±å ±Þ ±× ±Р±É ± ±» ±´ ±­ ±¦ ±Ÿ ±˜ ±‘ ±Š ±ƒ ±| ±u ±n ±g ±` ±Y ±R ±K ±D ±= ±6 ±/ ±( ±! ± ± ±  ± ±þŸ±÷Ÿ±ðŸ±韱⟱ÛŸ±ÔŸ±ÍŸ±ÆŸ±¿Ÿ±¸Ÿ±±Ÿ±ªŸ±£Ÿ±œŸ±•Ÿ±ŽŸ±‡Ÿ±€Ÿ±yŸ±rŸ±kŸ±dŸ±]Ÿ±VŸ±OŸ±HŸ±AŸ±:Ÿ±3Ÿ±,Ÿ±%Ÿ±Ÿ±Ÿ±Ÿ± Ÿ±Ÿ±ûž±ôž±íž±æž±ßž±Øž±Ñž±Êž±Þ±¼ž±µž±®ž±§ž± ž±™ž±’ž±‹ž±„ž±}ž±vž±ož±hž±až±Zž±Sž±Lž±Ež±>ž±7ž±0ž±)ž±"ž±ž±ž± ž±ž±ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±üœ±õœ±眱àœ±Ùœ±Òœ±Ëœ±Äœ±½œ±¶œ±¯œ±¨œ±¡œ±šœ±“œ±Œœ±…œ±~œ±wœ±pœ±iœ±bœ±[œ±Tœ±Mœ±Fœ±?œ±8œ±1œ±*œ±#œ±œ±œ±œ±œ±œ±ù›±ò›±ë›±ä›±Ý›±Ö›±Ï›±È›±Á›±º›±³›±¬›±¥›±ž›±—›±›±‰›±‚›±{›±t›±m›±f›±_›±X›±Q›±J›±C›±<›±5›±.›±'›± ›±›±›± ›±›±ýš±öš±ïš±èš±áš±Úš±Óš±Ìš±Åš±¾š±·š±°š±©š±¢š±›š±”š±š±†š±š±xš±qš±jš±cš±\š±Uš±Nš±Gš±@š±9š±2š±+š±$š±š±š±š±š±š±ú™±ó™±ì™±å™±Þ™±×™±Й±É™±™±»™±´™±­™±¦™±Ÿ™±˜™±‘™±Š™±ƒ™±|™±u™±n™±g™±`™±Y™±R™±K™±D™±=™±6™±/™±(™±!™±™±™± ™±™±þ˜±÷˜±ð˜±阱☱Û˜±Ô˜±͘±Ƙ±¿˜±¸˜±±˜±ª˜±£˜±œ˜±•˜±Ž˜±‡˜±€˜±y˜±r˜±k˜±d˜±]˜±V˜±O˜±H˜±A˜±:˜±3˜±,˜±%˜±˜±˜±˜± ˜±˜±û—±ô—±í—±æ—±ß—±Ø—±Ñ—±Ê—±×±¼—±µ—±®—±§—± —±™—±’—±‹—±„—±}—±v—±o—±h—±a—±Z—±S—±L—±E—±>—±7—±0—±)—±"—±—±—± —±—±ÿ–±ø–±ñ–±ê–±ã–±Ü–±Õ–±Ζ±Ç–±À–±¹–±²–±«–±¤–±–±––±–±ˆ–±–±z–±s–±l–±e–±^–±W–±P–±I–±B–±;–±4–±-–±&–±–±–±–± –±–±ü•±õ•±畱à•±Ù•±Ò•±Ë•±Ä•±½•±¶•±¯•±¨•±¡•±š•±“•±Œ•±…•±~•±w•±p•±i•±b•±[•±T•±M•±F•±?•±8•±1•±*•±#•±•±•±•±•±•±ù”±ò”±ë”±ä”±Ý”±Ö”±Ï”±È”±Á”±º”±³”±¬”±¥”±ž”±—”±”±‰”±‚”±{”±t”±m”±f”±_”±X”±Q”±J”±C”±<”±5”±.”±'”± ”±”±”± ”±”±ý“±ö“±蓱ᓱÚ“±Ó“±Ì“±Å“±¾“±·“±°“±©“±¢“±›“±”“±“±†“±“±x“±q“±j“±c“±\“±U“±N“±G“±@“±9“±2“±+“±$“±“±“±“±“±“±ú’±ó’±ì’±å’±Þ’±×’±Ð’±É’±Â’±»’±´’±­’±¦’±Ÿ’±˜’±‘’±Š’±ƒ’±|’±u’±n’±g’±`’±Y’±R’±K’±D’±=’±6’±/’±(’±!’±’±’± ’±’±þ‘±÷‘±ð‘±鑱⑱Û‘±Ô‘±Í‘±Æ‘±¿‘±¸‘±±‘±ª‘±£‘±œ‘±•‘±Ž‘±‡‘±€‘±y‘±r‘±k‘±d‘±]‘±V‘±O‘±H‘±A‘±:‘±3‘±,‘±%‘±‘±‘±‘± ‘±‘±û±ô±í±æ±ß±رѱʱñ¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±üޱõޱ玱àŽ±ÙŽ±ÒŽ±ËŽ±Äޱ½Ž±¶Ž±¯Ž±¨Ž±¡Ž±šŽ±“ޱŒŽ±…ޱ~ޱwޱpޱiޱbޱ[ޱTޱMޱFޱ?ޱ8ޱ1ޱ*ޱ#ޱޱޱޱޱޱù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ýŒ±öŒ±茱ጱÚŒ±ÓŒ±ÌŒ±ÅŒ±¾Œ±·Œ±°Œ±©Œ±¢Œ±›Œ±”Œ±Œ±†Œ±Œ±xŒ±qŒ±jŒ±cŒ±\Œ±UŒ±NŒ±GŒ±@Œ±9Œ±2Œ±+Œ±$Œ±Œ±Œ±Œ±Œ±Œ±ú‹±ó‹±싱勱Þ‹±׋±Ћ±É‹±‹±»‹±´‹±­‹±¦‹±Ÿ‹±˜‹±‘‹±Š‹±ƒ‹±|‹±u‹±n‹±g‹±`‹±Y‹±R‹±K‹±D‹±=‹±6‹±/‹±(‹±!‹±‹±‹± ‹±‹±þб÷бðб銱⊱ÛŠ±ÔŠ±ÍŠ±ÆŠ±¿Š±¸Š±±Š±ªŠ±£Š±œŠ±•бŽŠ±‡Š±€Š±yбrбkбdб]бVбOбHбAб:б3б,б%бббб ббû‰±ô‰±퉱扱߉±؉±щ±ʉ±ɱ¼‰±µ‰±®‰±§‰± ‰±™‰±’‰±‹‰±„‰±}‰±v‰±o‰±h‰±a‰±Z‰±S‰±L‰±E‰±>‰±7‰±0‰±)‰±"‰±‰±‰± ‰±‰±ÿˆ±øˆ±ñˆ±ꈱ㈱܈±Õˆ±Έ±Lj±Àˆ±¹ˆ±²ˆ±«ˆ±¤ˆ±ˆ±–ˆ±ˆ±ˆˆ±ˆ±zˆ±sˆ±lˆ±eˆ±^ˆ±Wˆ±Pˆ±Iˆ±Bˆ±;ˆ±4ˆ±-ˆ±&ˆ±ˆ±ˆ±ˆ± ˆ±ˆ±ü‡±õ‡±燱à‡±Ù‡±Ò‡±ˇ±ć±½‡±¶‡±¯‡±¨‡±¡‡±š‡±“‡±Œ‡±…‡±~‡±w‡±p‡±i‡±b‡±[‡±T‡±M‡±F‡±?‡±8‡±1‡±*‡±#‡±‡±‡±‡±‡±‡±ù†±ò†±놱䆱݆±Ö†±φ±Ȇ±Á†±º†±³†±¬†±¥†±ž†±—†±†±‰†±‚†±{†±t†±m†±f†±_†±X†±Q†±J†±C†±<†±5†±.†±'†± †±†±†± †±†±ý…±ö…±ï…±è…±á…±Ú…±Ó…±Ì…±Å…±¾…±·…±°…±©…±¢…±›…±”…±…±†…±…±x…±q…±j…±c…±\…±U…±N…±G…±@…±9…±2…±+…±$…±…±…±…±…±…±ú„±ó„±성儱Þ„±ׄ±Є±É„±„±»„±´„±­„±¦„±Ÿ„±˜„±‘„±Š„±ƒ„±|„±u„±n„±g„±`„±Y„±R„±K„±D„±=„±6„±/„±(„±!„±„±„± „±„±þƒ±÷ƒ±ðƒ±郱⃱Ûƒ±Ôƒ±̓±ƃ±¿ƒ±¸ƒ±±ƒ±ªƒ±£ƒ±œƒ±•ƒ±Žƒ±‡ƒ±€ƒ±yƒ±rƒ±kƒ±dƒ±]ƒ±Vƒ±Oƒ±Hƒ±Aƒ±:ƒ±3ƒ±,ƒ±%ƒ±ƒ±ƒ±ƒ± ƒ±ƒ±û‚±ô‚±킱悱ß‚±Ø‚±Ñ‚±Ê‚±±¼‚±µ‚±®‚±§‚± ‚±™‚±’‚±‹‚±„‚±}‚±v‚±o‚±h‚±a‚±Z‚±S‚±L‚±E‚±>‚±7‚±0‚±)‚±"‚±‚±‚± ‚±‚±ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü€±õ€±瀱à€±Ù€±Ò€±Ë€±Ä€±½€±¶€±¯€±¨€±¡€±š€±“€±Œ€±…€±~€±w€±p€±i€±b€±[€±T€±M€±F€±?€±8€±1€±*€±#€±€±€±€±€±€±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý~±ö~±ï~±è~±á~±Ú~±Ó~±Ì~±Å~±¾~±·~±°~±©~±¢~±›~±”~±~±†~±~±x~±q~±j~±c~±\~±U~±N~±G~±@~±9~±2~±+~±$~±~±~±~±~±~±ú}±ó}±ì}±å}±Þ}±×}±Ð}±É}±Â}±»}±´}±­}±¦}±Ÿ}±˜}±‘}±Š}±ƒ}±|}±u}±n}±g}±`}±Y}±R}±K}±D}±=}±6}±/}±(}±!}±}±}± }±}±þ|±÷|±ð|±é|±â|±Û|±Ô|±Í|±Æ|±¿|±¸|±±|±ª|±£|±œ|±•|±Ž|±‡|±€|±y|±r|±k|±d|±]|±V|±O|±H|±A|±:|±3|±,|±%|±|±|±|± |±|±û{±ô{±í{±æ{±ß{±Ø{±Ñ{±Ê{±Ã{±¼{±µ{±®{±§{± {±™{±’{±‹{±„{±}{±v{±o{±h{±a{±Z{±S{±L{±E{±>{±7{±0{±){±"{±{±{± {±{±ÿz±øz±ñz±êz±ãz±Üz±Õz±Îz±Çz±Àz±¹z±²z±«z±¤z±z±–z±z±ˆz±z±zz±sz±lz±ez±^z±Wz±Pz±Iz±Bz±;z±4z±-z±&z±z±z±z± z±z±üy±õy±îy±çy±ày±Ùy±Òy±Ëy±Äy±½y±¶y±¯y±¨y±¡y±šy±“y±Œy±…y±~y±wy±py±iy±by±[y±Ty±My±Fy±?y±8y±1y±*y±#y±y±y±y±y±y±ùx±òx±ëx±äx±Ýx±Öx±Ïx±Èx±Áx±ºx±³x±¬x±¥x±žx±—x±x±‰x±‚x±{x±tx±mx±fx±_x±Xx±Qx±Jx±Cx±t±7t±0t±)t±"t±t±t± t±t±ÿs±øs±ñs±ês±ãs±Üs±Õs±Îs±Çs±Às±¹s±²s±«s±¤s±s±–s±s±ˆs±s±zs±ss±ls±es±^s±Ws±Ps±Is±Bs±;s±4s±-s±&s±s±s±s± s±s±ür±õr±îr±çr±àr±Ùr±Òr±Ër±Är±½r±¶r±¯r±¨r±¡r±šr±“r±Œr±…r±~r±wr±pr±ir±br±[r±Tr±Mr±Fr±?r±8r±1r±*r±#r±r±r±r±r±r±ùq±òq±ëq±äq±Ýq±Öq±Ïq±Èq±Áq±ºq±³q±¬q±¥q±žq±—q±q±‰q±‚q±{q±tq±mq±fq±_q±Xq±Qq±Jq±Cq±m±7m±0m±)m±"m±m±m± m±m±ÿl±øl±ñl±êl±ãl±Ül±Õl±Îl±Çl±Àl±¹l±²l±«l±¤l±l±–l±l±ˆl±l±zl±sl±ll±el±^l±Wl±Pl±Il±Bl±;l±4l±-l±&l±l±l±l± l±l±ük±õk±îk±çk±àk±Ùk±Òk±Ëk±Äk±½k±¶k±¯k±¨k±¡k±šk±“k±Œk±…k±~k±wk±pk±ik±bk±[k±Tk±Mk±Fk±?k±8k±1k±*k±#k±k±k±k±k±k±ùj±òj±ëj±äj±Ýj±Öj±Ïj±Èj±Áj±ºj±³j±¬j±¥j±žj±—j±j±‰j±‚j±{j±tj±mj±fj±_j±Xj±Qj±Jj±Cj±f±7f±0f±)f±"f±f±f± f±f±ÿe±øe±ñe±êe±ãe±Üe±Õe±Îe±Çe±Àe±¹e±²e±«e±¤e±e±–e±e±ˆe±e±ze±se±le±ee±^e±We±Pe±Ie±Be±;e±4e±-e±&e±e±e±e± e±e±üd±õd±îd±çd±àd±Ùd±Òd±Ëd±Äd±½d±¶d±¯d±¨d±¡d±šd±“d±Œd±…d±~d±wd±pd±id±bd±[d±Td±Md±Fd±?d±8d±1d±*d±#d±d±d±d±d±d±ùc±òc±ëc±äc±Ýc±Öc±Ïc±Èc±Ác±ºc±³c±¬c±¥c±žc±—c±c±‰c±‚c±{c±tc±mc±fc±_c±Xc±Qc±Jc±Cc±_±7_±0_±)_±"_±_±_± _±_±ÿ^±ø^±ñ^±ê^±ã^±Ü^±Õ^±Î^±Ç^±À^±¹^±²^±«^±¤^±^±–^±^±ˆ^±^±z^±s^±l^±e^±^^±W^±P^±I^±B^±;^±4^±-^±&^±^±^±^± ^±^±ü]±õ]±î]±ç]±à]±Ù]±Ò]±Ë]±Ä]±½]±¶]±¯]±¨]±¡]±š]±“]±Œ]±…]±~]±w]±p]±i]±b]±[]±T]±M]±F]±?]±8]±1]±*]±#]±]±]±]±]±]±ù\±ò\±ë\±ä\±Ý\±Ö\±Ï\±È\±Á\±º\±³\±¬\±¥\±ž\±—\±\±‰\±‚\±{\±t\±m\±f\±_\±X\±Q\±J\±C\±<\±5\±.\±'\± \±\±\± \±\±ý[±ö[±ï[±è[±á[±Ú[±Ó[±Ì[±Å[±¾[±·[±°[±©[±¢[±›[±”[±[±†[±[±x[±q[±j[±c[±\[±U[±N[±G[±@[±9[±2[±+[±$[±[±[±[±[±[±úZ±óZ±ìZ±åZ±ÞZ±×Z±ÐZ±ÉZ±ÂZ±»Z±´Z±­Z±¦Z±ŸZ±˜Z±‘Z±ŠZ±ƒZ±|Z±uZ±nZ±gZ±`Z±YZ±RZ±KZ±DZ±=Z±6Z±/Z±(Z±!Z±Z±Z± Z±Z±þY±÷Y±ðY±éY±âY±ÛY±ÔY±ÍY±ÆY±¿Y±¸Y±±Y±ªY±£Y±œY±•Y±ŽY±‡Y±€Y±yY±rY±kY±dY±]Y±VY±OY±HY±AY±:Y±3Y±,Y±%Y±Y±Y±Y± Y±Y±ûX±ôX±íX±æX±ßX±ØX±ÑX±ÊX±ÃX±¼X±µX±®X±§X± X±™X±’X±‹X±„X±}X±vX±oX±hX±aX±ZX±SX±LX±EX±>X±7X±0X±)X±"X±X±X± X±X±ÿW±øW±ñW±êW±ãW±ÜW±ÕW±ÎW±ÇW±ÀW±¹W±²W±«W±¤W±W±–W±W±ˆW±W±zW±sW±lW±eW±^W±WW±PW±IW±BW±;W±4W±-W±&W±W±W±W± W±W±üV±õV±îV±çV±àV±ÙV±ÒV±ËV±ÄV±½V±¶V±¯V±¨V±¡V±šV±“V±ŒV±…V±~V±wV±pV±iV±bV±[V±TV±MV±FV±?V±8V±1V±*V±#V±V±V±V±V±V±ùU±òU±ëU±äU±ÝU±ÖU±ÏU±ÈU±ÁU±ºU±³U±¬U±¥U±žU±—U±U±‰U±‚U±{U±tU±mU±fU±_U±XU±QU±JU±CU±Q±7Q±0Q±)Q±"Q±Q±Q± Q±Q±ÿP±øP±ñP±êP±ãP±ÜP±ÕP±ÎP±ÇP±ÀP±¹P±²P±«P±¤P±P±–P±P±ˆP±P±zP±sP±lP±eP±^P±WP±PP±IP±BP±;P±4P±-P±&P±P±P±P± P±P±üO±õO±îO±çO±àO±ÙO±ÒO±ËO±ÄO±½O±¶O±¯O±¨O±¡O±šO±“O±ŒO±…O±~O±wO±pO±iO±bO±[O±TO±MO±FO±?O±8O±1O±*O±#O±O±O±O±O±O±ùN±òN±ëN±äN±ÝN±ÖN±ÏN±ÈN±ÁN±ºN±³N±¬N±¥N±žN±—N±N±‰N±‚N±{N±tN±mN±fN±_N±XN±QN±JN±CN±J±7J±0J±)J±"J±J±J± J±J±ÿI±øI±ñI±êI±ãI±ÜI±ÕI±ÎI±ÇI±ÀI±¹I±²I±«I±¤I±I±–I±I±ˆI±I±zI±sI±lI±eI±^I±WI±PI±II±BI±;I±4I±-I±&I±I±I±I± I±I±üH±õH±îH±çH±àH±ÙH±ÒH±ËH±ÄH±½H±¶H±¯H±¨H±¡H±šH±“H±ŒH±…H±~H±wH±pH±iH±bH±[H±TH±MH±FH±?H±8H±1H±*H±#H±H±H±H±H±H±ùG±òG±ëG±äG±ÝG±ÖG±ÏG±ÈG±ÁG±ºG±³G±¬G±¥G±žG±—G±G±‰G±‚G±{G±tG±mG±fG±_G±XG±QG±JG±CG±C±7C±0C±)C±"C±C±C± C±C±ÿB±øB±ñB±êB±ãB±ÜB±ÕB±ÎB±ÇB±ÀB±¹B±²B±«B±¤B±B±–B±B±ˆB±B±zB±sB±lB±eB±^B±WB±PB±IB±BB±;B±4B±-B±&B±B±B±B± B±B±üA±õA±îA±çA±àA±ÙA±ÒA±ËA±ÄA±½A±¶A±¯A±¨A±¡A±šA±“A±ŒA±…A±~A±wA±pA±iA±bA±[A±TA±MA±FA±?A±8A±1A±*A±#A±A±A±A±A±A±ù@±ò@±ë@±ä@±Ý@±Ö@±Ï@±È@±Á@±º@±³@±¬@±¥@±ž@±—@±@±‰@±‚@±{@±t@±m@±f@±_@±X@±Q@±J@±C@±<@±5@±.@±'@± @±@±@± @±@±ý?±ö?±ï?±è?±á?±Ú?±Ó?±Ì?±Å?±¾?±·?±°?±©?±¢?±›?±”?±?±†?±?±x?±q?±j?±c?±\?±U?±N?±G?±@?±9?±2?±+?±$?±?±?±?±?±?±ú>±ó>±ì>±å>±Þ>±×>±Ð>±É>±Â>±»>±´>±­>±¦>±Ÿ>±˜>±‘>±Š>±ƒ>±|>±u>±n>±g>±`>±Y>±R>±K>±D>±=>±6>±/>±(>±!>±>±>± >±>±þ=±÷=±ð=±é=±â=±Û=±Ô=±Í=±Æ=±¿=±¸=±±=±ª=±£=±œ=±•=±Ž=±‡=±€=±y=±r=±k=±d=±]=±V=±O=±H=±A=±:=±3=±,=±%=±=±=±=± =±=±û<±ô<±í<±æ<±ß<±Ø<±Ñ<±Ê<±Ã<±¼<±µ<±®<±§<± <±™<±’<±‹<±„<±}<±v<±o<±h<±a<±Z<±S<±L<±E<±><±7<±0<±)<±"<±<±<± <±<±ÿ;±ø;±ñ;±ê;±ã;±Ü;±Õ;±Î;±Ç;±À;±¹;±²;±«;±¤;±;±–;±;±ˆ;±;±z;±s;±l;±e;±^;±W;±P;±I;±B;±;;±4;±-;±&;±;±;±;± ;±;±ü:±õ:±î:±ç:±à:±Ù:±Ò:±Ë:±Ä:±½:±¶:±¯:±¨:±¡:±š:±“:±Œ:±…:±~:±w:±p:±i:±b:±[:±T:±M:±F:±?:±8:±1:±*:±#:±:±:±:±:±:±ù9±ò9±ë9±ä9±Ý9±Ö9±Ï9±È9±Á9±º9±³9±¬9±¥9±ž9±—9±9±‰9±‚9±{9±t9±m9±f9±_9±X9±Q9±J9±C9±<9±59±.9±'9± 9±9±9± 9±9±ý8±ö8±ï8±è8±á8±Ú8±Ó8±Ì8±Å8±¾8±·8±°8±©8±¢8±›8±”8±8±†8±8±x8±q8±j8±c8±\8±U8±N8±G8±@8±98±28±+8±$8±8±8±8±8±8±ú7±ó7±ì7±å7±Þ7±×7±Ð7±É7±Â7±»7±´7±­7±¦7±Ÿ7±˜7±‘7±Š7±ƒ7±|7±u7±n7±g7±`7±Y7±R7±K7±D7±=7±67±/7±(7±!7±7±7± 7±7±þ6±÷6±ð6±é6±â6±Û6±Ô6±Í6±Æ6±¿6±¸6±±6±ª6±£6±œ6±•6±Ž6±‡6±€6±y6±r6±k6±d6±]6±V6±O6±H6±A6±:6±36±,6±%6±6±6±6± 6±6±û5±ô5±í5±æ5±ß5±Ø5±Ñ5±Ê5±Ã5±¼5±µ5±®5±§5± 5±™5±’5±‹5±„5±}5±v5±o5±h5±a5±Z5±S5±L5±E5±>5±75±05±)5±"5±5±5± 5±5±ÿ4±ø4±ñ4±ê4±ã4±Ü4±Õ4±Î4±Ç4±À4±¹4±²4±«4±¤4±4±–4±4±ˆ4±4±z4±s4±l4±e4±^4±W4±P4±I4±B4±;4±44±-4±&4±4±4±4± 4±4±ü3±õ3±î3±ç3±à3±Ù3±Ò3±Ë3±Ä3±½3±¶3±¯3±¨3±¡3±š3±“3±Œ3±…3±~3±w3±p3±i3±b3±[3±T3±M3±F3±?3±83±13±*3±#3±3±3±3±3±3±ù2±ò2±ë2±ä2±Ý2±Ö2±Ï2±È2±Á2±º2±³2±¬2±¥2±ž2±—2±2±‰2±‚2±{2±t2±m2±f2±_2±X2±Q2±J2±C2±<2±52±.2±'2± 2±2±2± 2±2±ý1±ö1±ï1±è1±á1±Ú1±Ó1±Ì1±Å1±¾1±·1±°1±©1±¢1±›1±”1±1±†1±1±x1±q1±j1±c1±\1±U1±N1±G1±@1±91±21±+1±$1±1±1±1±1±1±ú0±ó0±ì0±å0±Þ0±×0±Ð0±É0±Â0±»0±´0±­0±¦0±Ÿ0±˜0±‘0±Š0±ƒ0±|0±u0±n0±g0±`0±Y0±R0±K0±D0±=0±60±/0±(0±!0±0±0± 0±0±þ/±÷/±ð/±é/±â/±Û/±Ô/±Í/±Æ/±¿/±¸/±±/±ª/±£/±œ/±•/±Ž/±‡/±€/±y/±r/±k/±d/±]/±V/±O/±H/±A/±:/±3/±,/±%/±/±/±/± /±/±û.±ô.±í.±æ.±ß.±Ø.±Ñ.±Ê.±Ã.±¼.±µ.±®.±§.± .±™.±’.±‹.±„.±}.±v.±o.±h.±a.±Z.±S.±L.±E.±>.±7.±0.±).±".±.±.± .±.±ÿ-±ø-±ñ-±ê-±ã-±Ü-±Õ-±Î-±Ç-±À-±¹-±²-±«-±¤-±-±–-±-±ˆ-±-±z-±s-±l-±e-±^-±W-±P-±I-±B-±;-±4-±--±&-±-±-±-± -±-±ü,±õ,±î,±ç,±à,±Ù,±Ò,±Ë,±Ä,±½,±¶,±¯,±¨,±¡,±š,±“,±Œ,±…,±~,±w,±p,±i,±b,±[,±T,±M,±F,±?,±8,±1,±*,±#,±,±,±,±,±,±ù+±ò+±ë+±ä+±Ý+±Ö+±Ï+±È+±Á+±º+±³+±¬+±¥+±ž+±—+±+±‰+±‚+±{+±t+±m+±f+±_+±X+±Q+±J+±C+±<+±5+±.+±'+± +±+±+± +±+±ý*±ö*±ï*±è*±á*±Ú*±Ó*±Ì*±Å*±¾*±·*±°*±©*±¢*±›*±”*±*±†*±*±x*±q*±j*±c*±\*±U*±N*±G*±@*±9*±2*±+*±$*±*±*±*±*±*±ú)±ó)±ì)±å)±Þ)±×)±Ð)±É)±Â)±»)±´)±­)±¦)±Ÿ)±˜)±‘)±Š)±ƒ)±|)±u)±n)±g)±`)±Y)±R)±K)±D)±=)±6)±/)±()±!)±)±)± )±)±þ(±÷(±ð(±é(±â(±Û(±Ô(±Í(±Æ(±¿(±¸(±±(±ª(±£(±œ(±•(±Ž(±‡(±€(±y(±r(±k(±d(±](±V(±O(±H(±A(±:(±3(±,(±%(±(±(±(± (±(±û'±ô'±í'±æ'±ß'±Ø'±Ñ'±Ê'±Ã'±¼'±µ'±®'±§'± '±™'±’'±‹'±„'±}'±v'±o'±h'±a'±Z'±S'±L'±E'±>'±7'±0'±)'±"'±'±'± '±'±ÿ&±ø&±ñ&±ê&±ã&±Ü&±Õ&±Î&±Ç&±À&±¹&±²&±«&±¤&±&±–&±&±ˆ&±&±z&±s&±l&±e&±^&±W&±P&±I&±B&±;&±4&±-&±&&±&±&±&± &±&±ü%±õ%±î%±ç%±à%±Ù%±Ò%±Ë%±Ä%±½%±¶%±¯%±¨%±¡%±š%±“%±Œ%±…%±~%±w%±p%±i%±b%±[%±T%±M%±F%±?%±8%±1%±*%±#%±%±%±%±%±%±ù$±ò$±ë$±ä$±Ý$±Ö$±Ï$±È$±Á$±º$±³$±¬$±¥$±ž$±—$±$±‰$±‚$±{$±t$±m$±f$±_$±X$±Q$±J$±C$±<$±5$±.$±'$± $±$±$± $±$±ý#±ö#±ï#±è#±á#±Ú#±Ó#±Ì#±Å#±¾#±·#±°#±©#±¢#±›#±”#±#±†#±#±x#±q#±j#±c#±\#±U#±N#±G#±@#±9#±2#±+#±$#±#±#±#±#±#±ú"±ó"±ì"±å"±Þ"±×"±Ð"±É"±Â"±»"±´"±­"±¦"±Ÿ"±˜"±‘"±Š"±ƒ"±|"±u"±n"±g"±`"±Y"±R"±K"±D"±="±6"±/"±("±!"±"±"± "±"±þ!±÷!±ð!±é!±â!±Û!±Ô!±Í!±Æ!±¿!±¸!±±!±ª!±£!±œ!±•!±Ž!±‡!±€!±y!±r!±k!±d!±]!±V!±O!±H!±A!±:!±3!±,!±%!±!±!±!± !±!±û ±ô ±í ±æ ±ß ±Ø ±Ñ ±Ê ±à ±¼ ±µ ±® ±§ ±  ±™ ±’ ±‹ ±„ ±} ±v ±o ±h ±a ±Z ±S ±L ±E ±> ±7 ±0 ±) ±" ± ± ± ± ±ÿ±ø±ñ±ê±ã±Ü±Õ±Î±Ç±À±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü±õ±î±ç±à±Ù±Ò±Ë±Ä±½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý±ö±ï±è±á±Ú±Ó±Ì±Å±¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú±ó±ì±å±Þ±×±Ð±É±Â±»±´±­±¦±Ÿ±˜±‘±Š±ƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ±÷±ð±é±â±Û±Ô±Í±Æ±¿±¸±±±ª±£±œ±•±Ž±‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û±ô±í±æ±ß±Ø±Ñ±Ê±Ã±¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ±ø±ñ±ê±ã±Ü±Õ±Î±Ç±À±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü±õ±î±ç±à±Ù±Ò±Ë±Ä±½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý±ö±ï±è±á±Ú±Ó±Ì±Å±¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú±ó±ì±å±Þ±×±Ð±É±Â±»±´±­±¦±Ÿ±˜±‘±Š±ƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ±÷±ð±é±â±Û±Ô±Í±Æ±¿±¸±±±ª±£±œ±•±Ž±‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û±ô±í±æ±ß±Ø±Ñ±Ê±Ã±¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ±ø±ñ±ê±ã±Ü±Õ±Î±Ç±À±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü±õ±î±ç±à±Ù±Ò±Ë±Ä±½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý±ö±ï±è±á±Ú±Ó±Ì±Å±¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú ±ó ±ì ±å ±Þ ±× ±Ð ±É ± ±» ±´ ±­ ±¦ ±Ÿ ±˜ ±‘ ±Š ±ƒ ±| ±u ±n ±g ±` ±Y ±R ±K ±D ±= ±6 ±/ ±( ±! ± ± ± ± ±þ ±÷ ±ð ±é ±â ±Û ±Ô ±Í ±Æ ±¿ ±¸ ±± ±ª ±£ ±œ ±• ±Ž ±‡ ±€ ±y ±r ±k ±d ±] ±V ±O ±H ±A ±: ±3 ±, ±% ± ± ± ± ± ±û ±ô ±í ±æ ±ß ±Ø ±Ñ ±Ê ±à ±¼ ±µ ±® ±§ ±  ±™ ±’ ±‹ ±„ ±} ±v ±o ±h ±a ±Z ±S ±L ±E ±> ±7 ±0 ±) ±" ± ± ± ± ±ÿ ±ø ±ñ ±ê ±ã ±Ü ±Õ ±Î ±Ç ±À ±¹ ±² ±« ±¤ ± ±– ± ±ˆ ± ±z ±s ±l ±e ±^ ±W ±P ±I ±B ±; ±4 ±- ±& ± ± ± ± ± ±ü ±õ ±î ±ç ±à ±Ù ±Ò ±Ë ±Ä ±½ ±¶ ±¯ ±¨ ±¡ ±š ±“ ±Œ ±… ±~ ±w ±p ±i ±b ±[ ±T ±M ±F ±? ±8 ±1 ±* ±# ± ± ± ± ± ±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý±ö±ï±è±á±Ú±Ó±Ì±Å±¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú±ó±ì±å±Þ±×±Ð±É±Â±»±´±­±¦±Ÿ±˜±‘±Š±ƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ±÷±ð±é±â±Û±Ô±Í±Æ±¿±¸±±±ª±£±œ±•±Ž±‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û±ô±í±æ±ß±Ø±Ñ±Ê±Ã±¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ±ø±ñ±ê±ã±Ü±Õ±Î±Ç±À±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü±õ±î±ç±à±Ù±Ò±Ë±Ä±½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù±ò±ë±ä±Ý±Ö±Ï±È±Á±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý±ö±ï±è±á±Ú±Ó±̱ű¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±úÿ°óÿ°ìÿ°åÿ°Þÿ°×ÿ°Ðÿ°Éÿ°Âÿ°»ÿ°´ÿ°­ÿ°¦ÿ°Ÿÿ°˜ÿ°‘ÿ°Šÿ°ƒÿ°|ÿ°uÿ°nÿ°gÿ°`ÿ°Yÿ°Rÿ°Kÿ°Dÿ°=ÿ°6ÿ°/ÿ°(ÿ°!ÿ°ÿ°ÿ° ÿ°ÿ°þþ°÷þ°ðþ°éþ°âþ°Ûþ°Ôþ°Íþ°Æþ°¿þ°¸þ°±þ°ªþ°£þ°œþ°•þ°Žþ°‡þ°€þ°yþ°rþ°kþ°dþ°]þ°Vþ°Oþ°Hþ°Aþ°:þ°3þ°,þ°%þ°þ°þ°þ° þ°þ°ûý°ôý°íý°æý°ßý°Øý°Ñý°Êý°Ãý°¼ý°µý°®ý°§ý° ý°™ý°’ý°‹ý°„ý°}ý°vý°oý°hý°aý°Zý°Sý°Lý°Eý°>ý°7ý°0ý°)ý°"ý°ý°ý° ý°ý°ÿü°øü°ñü°êü°ãü°Üü°Õü°Îü°Çü°Àü°¹ü°²ü°«ü°¤ü°ü°–ü°ü°ˆü°ü°zü°sü°lü°eü°^ü°Wü°Pü°Iü°Bü°;ü°4ü°-ü°&ü°ü°ü°ü° ü°ü°üû°õû°îû°çû°àû°Ùû°Òû°Ëû°Äû°½û°¶û°¯û°¨û°¡û°šû°“û°Œû°…û°~û°wû°pû°iû°bû°[û°Tû°Mû°Fû°?û°8û°1û°*û°#û°û°û°û°û°û°ùú°òú°ëú°äú°Ýú°Öú°Ïú°Èú°Áú°ºú°³ú°¬ú°¥ú°žú°—ú°ú°‰ú°‚ú°{ú°tú°mú°fú°_ú°Xú°Qú°Jú°Cú°<ú°5ú°.ú°'ú° ú°ú°ú° ú°ú°ýù°öù°ïù°èù°áù°Úù°Óù°Ìù°Åù°¾ù°·ù°°ù°©ù°¢ù°›ù°”ù°ù°†ù°ù°xù°qù°jù°cù°\ù°Uù°Nù°Gù°@ù°9ù°2ù°+ù°$ù°ù°ù°ù°ù°ù°úø°óø°ìø°åø°Þø°×ø°Ðø°Éø°Âø°»ø°´ø°­ø°¦ø°Ÿø°˜ø°‘ø°Šø°ƒø°|ø°uø°nø°gø°`ø°Yø°Rø°Kø°Dø°=ø°6ø°/ø°(ø°!ø°ø°ø° ø°ø°þ÷°÷÷°ð÷°é÷°â÷°Û÷°Ô÷°Í÷°Æ÷°¿÷°¸÷°±÷°ª÷°£÷°œ÷°•÷°Ž÷°‡÷°€÷°y÷°r÷°k÷°d÷°]÷°V÷°O÷°H÷°A÷°:÷°3÷°,÷°%÷°÷°÷°÷° ÷°÷°ûö°ôö°íö°æö°ßö°Øö°Ñö°Êö°Ãö°¼ö°µö°®ö°§ö° ö°™ö°’ö°‹ö°„ö°}ö°vö°oö°hö°aö°Zö°Sö°Lö°Eö°>ö°7ö°0ö°)ö°"ö°ö°ö° ö°ö°ÿõ°øõ°ñõ°êõ°ãõ°Üõ°Õõ°Îõ°Çõ°Àõ°¹õ°²õ°«õ°¤õ°õ°–õ°õ°ˆõ°õ°zõ°sõ°lõ°eõ°^õ°Wõ°Põ°Iõ°Bõ°;õ°4õ°-õ°&õ°õ°õ°õ° õ°õ°üô°õô°îô°çô°àô°Ùô°Òô°Ëô°Äô°½ô°¶ô°¯ô°¨ô°¡ô°šô°“ô°Œô°…ô°~ô°wô°pô°iô°bô°[ô°Tô°Mô°Fô°?ô°8ô°1ô°*ô°#ô°ô°ô°ô°ô°ô°ùó°òó°ëó°äó°Ýó°Öó°Ïó°Èó°Áó°ºó°³ó°¬ó°¥ó°žó°—ó°ó°‰ó°‚ó°{ó°tó°mó°fó°_ó°Xó°Qó°Jó°Có°<ó°5ó°.ó°'ó° ó°ó°ó° ó°ó°ýò°öò°ïò°èò°áò°Úò°Óò°Ìò°Åò°¾ò°·ò°°ò°©ò°¢ò°›ò°”ò°ò°†ò°ò°xò°qò°jò°cò°\ò°Uò°Nò°Gò°@ò°9ò°2ò°+ò°$ò°ò°ò°ò°ò°ò°úñ°óñ°ìñ°åñ°Þñ°×ñ°Ðñ°Éñ°Âñ°»ñ°´ñ°­ñ°¦ñ°Ÿñ°˜ñ°‘ñ°Šñ°ƒñ°|ñ°uñ°nñ°gñ°`ñ°Yñ°Rñ°Kñ°Dñ°=ñ°6ñ°/ñ°(ñ°!ñ°ñ°ñ° ñ°ñ°þð°÷ð°ðð°éð°âð°Ûð°Ôð°Íð°Æð°¿ð°¸ð°±ð°ªð°£ð°œð°•ð°Žð°‡ð°€ð°yð°rð°kð°dð°]ð°Vð°Oð°Hð°Að°:ð°3ð°,ð°%ð°ð°ð°ð° ð°ð°ûï°ôï°íï°æï°ßï°Øï°Ñï°Êï°Ãﰼﰵﰮﰧﰠﰙﰒﰋﰄï°}ï°vï°oï°hï°aï°Zï°Sï°Lï°Eï°>ï°7ï°0ï°)ï°"ï°ï°ï° ï°ï°ÿî°øî°ñî°êî°ãî°Üî°Õî°Îî°Çî°Àî°î°–î°î°ˆî°î°zî°sî°lî°eî°^î°Wî°Pî°Iî°Bî°;î°4î°-î°&î°î°î°î° î°î°üí°õí°îí°çí°àí°Ùí°Òí°Ëí°Äí°½í°¶í°¯í°¨í°¡í°ší°“í°Œí°…í°~í°wí°pí°ií°bí°[í°Tí°Mí°Fí°?í°8í°1í°*í°#í°í°í°í°í°í°ùì°òì°ëì°äì°Ýì°Öì°Ïì°Èì°Á찺찳찬찥찞찗ì°ì°‰ì°‚ì°{ì°tì°mì°fì°_ì°Xì°Qì°Jì°Cì°<ì°5ì°.ì°'ì° ì°ì°ì° ì°ì°ýë°öë°ïë°èë°áë°Úë°Óë°Ìë°Å밾밷배방밢받바ë°ë°†ë°ë°xë°që°jë°cë°\ë°Uë°Në°Gë°@ë°9ë°2ë°+ë°$ë°ë°ë°ë°ë°ë°úê°óê°ìê°åê°Þê°×ê°Ðê°Éê°Â갻갴갭갦갟갘갑갊갃ê°|ê°uê°nê°gê°`ê°Yê°Rê°Kê°Dê°=ê°6ê°/ê°(ê°!ê°ê°ê° ê°ê°þé°÷é°ðé°éé°âé°Ûé°Ôé°Íé°Æé°¿é°¸é°±é°ªé°£é°œé°•é°Žé°‡é°€é°yé°ré°ké°dé°]é°Vé°Oé°Hé°Aé°:é°3é°,é°%é°é°é°é° é°é°ûè°ôè°íè°æè°ßè°Øè°Ñè°Êè°Ã谼谵谮谧谠谙谒谋谄è°}è°vè°oè°hè°aè°Zè°Sè°Lè°Eè°>è°7è°0è°)è°"è°è°è° è°è°ÿç°øç°ñç°êç°ãç°Üç°Õç°Îç°Çç°À簹簲簫簤ç°ç°–ç°ç°ˆç°ç°zç°sç°lç°eç°^ç°Wç°Pç°Iç°Bç°;ç°4ç°-ç°&ç°ç°ç°ç° ç°ç°üæ°õæ°îæ°çæ°àæ°Ùæ°Òæ°Ëæ°Ä氽氶氯氨氡氚氓氌氅æ°~æ°wæ°pæ°iæ°bæ°[æ°Tæ°Mæ°Fæ°?æ°8æ°1æ°*æ°#æ°æ°æ°æ°æ°æ°ùå°òå°ëå°äå°Ýå°Öå°Ïå°Èå°Á尺尳尬尥尞尗å°å°‰å°‚å°{å°tå°må°få°_å°Xå°Qå°Jå°Cå°<å°5å°.å°'å° å°å°å° å°å°ýä°öä°ïä°èä°áä°Úä°Óä°Ìä°Å䰾䰷䰰䰩䰢䰛䰔ä°ä°†ä°ä°xä°qä°jä°cä°\ä°Uä°Nä°Gä°@ä°9ä°2ä°+ä°$ä°ä°ä°ä°ä°ä°úã°óã°ìã°åã°Þã°×ã°Ðã°Éã°Â㰻㰴㰭㰦㰟㰘㰑㰊㰃ã°|ã°uã°nã°gã°`ã°Yã°Rã°Kã°Dã°=ã°6ã°/ã°(ã°!ã°ã°ã° ã°ã°þâ°÷â°ðâ°éâ°ââ°Ûâ°Ôâ°Íâ°Æâ°¿â°¸â°±â°ªâ°£â°œâ°•â°Žâ°‡â°€â°yâ°râ°kâ°dâ°]â°Vâ°Oâ°Hâ°Aâ°:â°3â°,â°%â°â°â°â° â°â°ûá°ôá°íá°æá°ßá°Øá°Ñá°Êá°Ã᰼ᰵᰮᰧᰠᰙᰒᰋᰄá°}á°vá°oá°há°aá°Zá°Sá°Lá°Eá°>á°7á°0á°)á°"á°á°á° á°á°ÿà°øà°ñà°êà°ãà°Üà°Õà°Îà°Çà°Àహలఫతà°à°–à°à°ˆà°à°zà°sà°là°eà°^à°Wà°Pà°Ià°Bà°;à°4à°-à°&à°à°à°à° à°à°üß°õß°îß°çß°àß°Ùß°Òß°Ëß°Äß°½ß°¶ß°¯ß°¨ß°¡ß°šß°“ß°Œß°…ß°~ß°wß°pß°iß°bß°[ß°Tß°Mß°Fß°?ß°8ß°1ß°*ß°#ß°ß°ß°ß°ß°ß°ùÞ°òÞ°ëÞ°äÞ°ÝÞ°ÖÞ°ÏÞ°ÈÞ°ÁÞ°ºÞ°³Þ°¬Þ°¥Þ°žÞ°—Þ°Þ°‰Þ°‚Þ°{Þ°tÞ°mÞ°fÞ°_Þ°XÞ°QÞ°JÞ°CÞ°<Þ°5Þ°.Þ°'Þ° Þ°Þ°Þ° Þ°Þ°ýݰöݰïݰèݰáݰÚݰÓݰÌݰÅݰ¾Ý°·Ý°°Ý°©Ý°¢Ý°›Ý°”ݰݰ†Ý°ݰxݰqݰjݰcݰ\ݰUݰNݰGݰ@ݰ9ݰ2ݰ+ݰ$ݰݰݰݰݰݰúܰóܰìܰåܰÞܰ×ܰÐܰÉܰÂܰ»Ü°´Ü°­Ü°¦Ü°ŸÜ°˜Ü°‘ܰŠÜ°ƒÜ°|ܰuܰnܰgܰ`ܰYܰRܰKܰDܰ=ܰ6ܰ/ܰ(ܰ!ܰܰܰ ܰܰþÛ°÷Û°ðÛ°éÛ°âÛ°ÛÛ°ÔÛ°ÍÛ°ÆÛ°¿Û°¸Û°±Û°ªÛ°£Û°œÛ°•Û°ŽÛ°‡Û°€Û°yÛ°rÛ°kÛ°dÛ°]Û°VÛ°OÛ°HÛ°AÛ°:Û°3Û°,Û°%Û°Û°Û°Û° Û°Û°ûÚ°ôÚ°íÚ°æÚ°ßÚ°ØÚ°ÑÚ°ÊÚ°ÃÚ°¼Ú°µÚ°®Ú°§Ú° Ú°™Ú°’Ú°‹Ú°„Ú°}Ú°vÚ°oÚ°hÚ°aÚ°ZÚ°SÚ°LÚ°EÚ°>Ú°7Ú°0Ú°)Ú°"Ú°Ú°Ú° Ú°Ú°ÿÙ°øÙ°ñÙ°êÙ°ãÙ°ÜÙ°ÕÙ°ÎÙ°ÇÙ°ÀÙ°¹Ù°²Ù°«Ù°¤Ù°Ù°–ٰٰˆÙ°Ù°zÙ°sÙ°lÙ°eÙ°^Ù°WÙ°PÙ°IÙ°BÙ°;Ù°4Ù°-Ù°&ٰٰٰٰ ٰٰüذõذîØ°çØ°àØ°ÙØ°ÒØ°ËØ°Äذ½Ø°¶Ø°¯Ø°¨Ø°¡Ø°šØ°“ذŒØ°…ذ~ذwذpذiذbذ[ذTذMذFذ?ذ8ذ1ذ*ذ#ذذذذذذù×°ò×°ë×°ä×°Ý×°Ö×°Ï×°È×°Á×°º×°³×°¬×°¥×°ž×°—×°×°‰×°‚×°{×°t×°m×°f×°_×°X×°Q×°J×°C×°<×°5×°.×°'×° ×°×°×° ×°×°ýÖ°öÖ°ïÖ°èÖ°áÖ°ÚÖ°ÓÖ°ÌÖ°ÅÖ°¾Ö°·Ö°°Ö°©Ö°¢Ö°›Ö°”Ö°Ö°†Ö°Ö°xÖ°qÖ°jÖ°cÖ°\Ö°UÖ°NÖ°GÖ°@Ö°9Ö°2Ö°+Ö°$Ö°Ö°Ö°Ö°Ö°Ö°úÕ°óÕ°ìÕ°åÕ°ÞÕ°×Õ°ÐÕ°ÉÕ°ÂÕ°»Õ°´Õ°­Õ°¦Õ°ŸÕ°˜Õ°‘Õ°ŠÕ°ƒÕ°|Õ°uÕ°nÕ°gÕ°`Õ°YÕ°RÕ°KÕ°DÕ°=Õ°6Õ°/Õ°(Õ°!Õ°Õ°Õ° Õ°Õ°þÔ°÷Ô°ðÔ°éÔ°âÔ°ÛÔ°ÔÔ°ÍÔ°ÆÔ°¿Ô°¸Ô°±Ô°ªÔ°£Ô°œÔ°•Ô°ŽÔ°‡Ô°€Ô°yÔ°rÔ°kÔ°dÔ°]Ô°VÔ°OÔ°HÔ°AÔ°:Ô°3Ô°,Ô°%Ô°Ô°Ô°Ô° Ô°Ô°ûÓ°ôÓ°íÓ°æÓ°ßÓ°ØÓ°ÑÓ°ÊÓ°ÃÓ°¼Ó°µÓ°®Ó°§Ó° Ó°™Ó°’Ó°‹Ó°„Ó°}Ó°vÓ°oÓ°hÓ°aÓ°ZÓ°SÓ°LÓ°EÓ°>Ó°7Ó°0Ó°)Ó°"Ó°Ó°Ó° Ó°Ó°ÿÒ°øÒ°ñÒ°êÒ°ãÒ°ÜÒ°ÕÒ°ÎÒ°ÇÒ°ÀÒ°¹Ò°²Ò°«Ò°¤Ò°Ò°–Ò°Ò°ˆÒ°Ò°zÒ°sÒ°lÒ°eÒ°^Ò°WÒ°PÒ°IÒ°BÒ°;Ò°4Ò°-Ò°&Ò°Ò°Ò°Ò° Ò°Ò°üѰõѰîѰçѰàѰÙѰÒѰËѰÄѰ½Ñ°¶Ñ°¯Ñ°¨Ñ°¡Ñ°šÑ°“ѰŒÑ°…Ѱ~ѰwѰpѰiѰbѰ[ѰTѰMѰFѰ?Ѱ8Ѱ1Ѱ*Ѱ#ѰѰѰѰѰѰùаòаëаäаÝаÖаÏаÈаÁаºÐ°³Ð°¬Ð°¥Ð°žÐ°—аа‰Ð°‚а{аtаmаfа_аXаQаJаCа<а5а.а'а ааа ааýϰöϰïϰèϰáϰÚϰÓϰÌϰÅϰ¾Ï°·Ï°°Ï°©Ï°¢Ï°›Ï°”ϰϰ†Ï°ϰxϰqϰjϰcϰ\ϰUϰNϰGϰ@ϰ9ϰ2ϰ+ϰ$ϰϰϰϰϰϰúΰóΰìΰåΰÞΰ×ΰÐΰÉΰÂΰ»Î°´Î°­Î°¦Î°ŸÎ°˜Î°‘ΰŠÎ°ƒÎ°|ΰuΰnΰgΰ`ΰYΰRΰKΰDΰ=ΰ6ΰ/ΰ(ΰ!ΰΰΰ ΰΰþͰ÷ͰðͰéͰâͰÛͰÔͰÍͰÆÍ°¿Í°¸Í°±Í°ªÍ°£Í°œÍ°•ͰŽÍ°‡Í°€Í°yͰrͰkͰdͰ]ͰVͰOͰHͰAͰ:Ͱ3Ͱ,Ͱ%ͰͰͰͰ ͰͰṵ̂ô̰ḭ́æÌ°ß̰ØÌ°Ñ̰Ḛ̂Ã̰¼Ì°µÌ°®Ì°§Ì° Ì°™Ì°’̰‹Ì°„̰}̰v̰o̰h̰a̰Z̰S̰L̰Ḛ>̰7̰0̰)̰"̰̰̰ ̰̰ÿ˰øË°ñ˰ê˰ã˰Ü˰Õ˰Î˰Ç˰À˰¹Ë°²Ë°«Ë°¤Ë°˰–˰˰ˆË°˰z˰s˰l˰e˰^˰W˰P˰I˰B˰;˰4˰-˰&˰˰˰˰ ˰˰üʰõʰîʰçʰàʰÙʰÒʰËʰÄʰ½Ê°¶Ê°¯Ê°¨Ê°¡Ê°šÊ°“ʰŒÊ°…ʰ~ʰwʰpʰiʰbʰ[ʰTʰMʰFʰ?ʰ8ʰ1ʰ*ʰ#ʰʰʰʰʰʰùɰòɰëɰäɰÝɰÖɰÏɰÈɰÁɰºÉ°³É°¬É°¥É°žÉ°—ɰɰ‰É°‚ɰ{ɰtɰmɰfɰ_ɰXɰQɰJɰCɰ<ɰ5ɰ.ɰ'ɰ ɰɰɰ ɰɰýȰöȰïȰèȰáȰÚȰÓȰÌȰÅȰ¾È°·È°°È°©È°¢È°›È°”ȰȰ†È°ȰxȰqȰjȰcȰ\ȰUȰNȰGȰ@Ȱ9Ȱ2Ȱ+Ȱ$ȰȰȰȰȰȰúǰóǰìǰåǰÞǰ×ǰÐǰÉǰÂǰ»Ç°´Ç°­Ç°¦Ç°ŸÇ°˜Ç°‘ǰŠÇ°ƒÇ°|ǰuǰnǰgǰ`ǰYǰRǰKǰDǰ=ǰ6ǰ/ǰ(ǰ!ǰǰǰ ǰǰþư÷ưðư鯰âÆ°ÛÆ°ÔÆ°ÍÆ°ÆÆ°¿Æ°¸Æ°±Æ°ªÆ°£Æ°œÆ°•ưŽÆ°‡Æ°€Æ°yưrưkưdư]ưVưOưHưAư:ư3ư,ư%ưưưư ưưûŰôŰíŰæÅ°ßŰØÅ°ÑŰÊŰÃŰ¼Å°µÅ°®Å°§Å° Å°™Å°’Ű‹Å°„Ű}ŰvŰoŰhŰaŰZŰSŰLŰEŰ>Ű7Ű0Ű)Ű"ŰŰŰ ŰŰÿİøÄ°ñİêİãİÜİÕİÎİÇİÀݹݲݫݤİݖİ݈İİzİsİlİeİ^İWİPİIİBİ;İ4İ-İ&İİİİ İİüðõðîðçðàðÙðÒðËðÄð½Ã°¶Ã°¯Ã°¨Ã°¡Ã°šÃ°“ðŒÃ°…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððù°ò°ë°ä°ݰÖ°ϰȰÁ°ºÂ°³Â°¬Â°¥Â°žÂ°—°°‰Â°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ýÁ°öÁ°ïÁ°èÁ°áÁ°ÚÁ°ÓÁ°ÌÁ°ÅÁ°¾Á°·Á°°Á°©Á°¢Á°›Á°”Á°Á°†Á°Á°xÁ°qÁ°jÁ°cÁ°\Á°UÁ°NÁ°GÁ°@Á°9Á°2Á°+Á°$Á°Á°Á°Á°Á°Á°úÀ°óÀ°ìÀ°åÀ°ÞÀ°×À°ÐÀ°ÉÀ°ÂÀ°»À°´À°­À°¦À°ŸÀ°˜À°‘À°ŠÀ°ƒÀ°|À°uÀ°nÀ°gÀ°`À°YÀ°RÀ°KÀ°DÀ°=À°6À°/À°(À°!À°À°À° À°À°þ¿°÷¿°ð¿°é¿°â¿°Û¿°Ô¿°Í¿°Æ¿°¿¿°¸¿°±¿°ª¿°£¿°œ¿°•¿°Ž¿°‡¿°€¿°y¿°r¿°k¿°d¿°]¿°V¿°O¿°H¿°A¿°:¿°3¿°,¿°%¿°¿°¿°¿° ¿°¿°û¾°ô¾°í¾°æ¾°ß¾°ؾ°Ѿ°ʾ°þ°¼¾°µ¾°®¾°§¾° ¾°™¾°’¾°‹¾°„¾°}¾°v¾°o¾°h¾°a¾°Z¾°S¾°L¾°E¾°>¾°7¾°0¾°)¾°"¾°¾°¾° ¾°¾°ÿ½°ø½°ñ½°ê½°ã½°ܽ°Õ½°ν°ǽ°À½°¹½°²½°«½°¤½°½°–½°½°ˆ½°½°z½°s½°l½°e½°^½°W½°P½°I½°B½°;½°4½°-½°&½°½°½°½° ½°½°ü¼°õ¼°î¼°ç¼°༰Ù¼°Ò¼°˼°ļ°½¼°¶¼°¯¼°¨¼°¡¼°š¼°“¼°Œ¼°…¼°~¼°w¼°p¼°i¼°b¼°[¼°T¼°M¼°F¼°?¼°8¼°1¼°*¼°#¼°¼°¼°¼°¼°¼°ù»°ò»°ë»°ä»°Ý»°Ö»°Ï»°È»°Á»°º»°³»°¬»°¥»°ž»°—»°»°‰»°‚»°{»°t»°m»°f»°_»°X»°Q»°J»°C»°<»°5»°.»°'»° »°»°»° »°»°ýº°öº°ﺰ躰ẰÚº°Óº°̺°ź°¾º°·º°°º°©º°¢º°›º°”º°º°†º°º°xº°qº°jº°cº°\º°Uº°Nº°Gº°@º°9º°2º°+º°$º°º°º°º°º°º°ú¹°ó¹°ì¹°å¹°Þ¹°×¹°й°ɹ°¹°»¹°´¹°­¹°¦¹°Ÿ¹°˜¹°‘¹°й°ƒ¹°|¹°u¹°n¹°g¹°`¹°Y¹°R¹°K¹°D¹°=¹°6¹°/¹°(¹°!¹°¹°¹° ¹°¹°þ¸°÷¸°ð¸°鸰⸰Û¸°Ô¸°͸°Ƹ°¿¸°¸¸°±¸°ª¸°£¸°œ¸°•¸°ޏ°‡¸°€¸°y¸°r¸°k¸°d¸°]¸°V¸°O¸°H¸°A¸°:¸°3¸°,¸°%¸°¸°¸°¸° ¸°¸°û·°ô·°í·°æ·°ß·°Ø·°Ñ·°Ê·°÷°¼·°µ·°®·°§·° ·°™·°’·°‹·°„·°}·°v·°o·°h·°a·°Z·°S·°L·°E·°>·°7·°0·°)·°"·°·°·° ·°·°ÿ¶°ø¶°ñ¶°ê¶°ã¶°ܶ°Õ¶°ζ°Ƕ°À¶°¹¶°²¶°«¶°¤¶°¶°–¶°¶°ˆ¶°¶°z¶°s¶°l¶°e¶°^¶°W¶°P¶°I¶°B¶°;¶°4¶°-¶°&¶°¶°¶°¶° ¶°¶°üµ°õµ°îµ°çµ°൰Ùµ°Òµ°˵°ĵ°½µ°¶µ°¯µ°¨µ°¡µ°šµ°“µ°Œµ°…µ°~µ°wµ°pµ°iµ°bµ°[µ°Tµ°Mµ°Fµ°?µ°8µ°1µ°*µ°#µ°µ°µ°µ°µ°µ°ù´°ò´°ë´°ä´°Ý´°Ö´°Ï´°È´°Á´°º´°³´°¬´°¥´°ž´°—´°´°‰´°‚´°{´°t´°m´°f´°_´°X´°Q´°J´°C´°<´°5´°.´°'´° ´°´°´° ´°´°ý³°ö³°ï³°è³°á³°Ú³°Ó³°̳°ų°¾³°·³°°³°©³°¢³°›³°”³°³°†³°³°x³°q³°j³°c³°\³°U³°N³°G³°@³°9³°2³°+³°$³°³°³°³°³°³°ú²°ó²°ì²°å²°Þ²°ײ°в°ɲ°²°»²°´²°­²°¦²°Ÿ²°˜²°‘²°в°ƒ²°|²°u²°n²°g²°`²°Y²°R²°K²°D²°=²°6²°/²°(²°!²°²°²° ²°²°þ±°÷±°ð±°é±°â±°Û±°Ô±°ͱ°Ʊ°¿±°¸±°±±°ª±°£±°œ±°•±°ޱ°‡±°€±°y±°r±°k±°d±°]±°V±°O±°H±°A±°:±°3±°,±°%±°±°±°±° ±°±°û°°ô°°í°°æ°°ß°°ذ°Ѱ°ʰ°ð°¼°°µ°°®°°§°° °°™°°’°°‹°°„°°}°°v°°o°°h°°a°°Z°°S°°L°°E°°>°°7°°0°°)°°"°°°°°° °°°°ÿ¯°ø¯°ñ¯°꯰㯰ܯ°Õ¯°ί°ǯ°À¯°¹¯°²¯°«¯°¤¯°¯°–¯°¯°ˆ¯°¯°z¯°s¯°l¯°e¯°^¯°W¯°P¯°I¯°B¯°;¯°4¯°-¯°&¯°¯°¯°¯° ¯°¯°ü®°õ®°î®°ç®°à®°Ù®°Ò®°Ë®°Ä®°½®°¶®°¯®°¨®°¡®°š®°“®°Œ®°…®°~®°w®°p®°i®°b®°[®°T®°M®°F®°?®°8®°1®°*®°#®°®°®°®°®°®°ù­°ò­°ë­°ä­°Ý­°Ö­°Ï­°È­°Á­°º­°³­°¬­°¥­°ž­°—­°­°‰­°‚­°{­°t­°m­°f­°_­°X­°Q­°J­°C­°<­°5­°.­°'­° ­°­°­° ­°­°ý¬°ö¬°אּ謰ᬰÚ¬°Ó¬°̬°Ŭ°¾¬°·¬°°¬°©¬°¢¬°›¬°”¬°¬°†¬°¬°x¬°q¬°j¬°c¬°\¬°U¬°N¬°G¬°@¬°9¬°2¬°+¬°$¬°¬°¬°¬°¬°¬°ú«°ó«°ì«°å«°Þ«°׫°Ы°É«°«°»«°´«°­«°¦«°Ÿ«°˜«°‘«°Š«°ƒ«°|«°u«°n«°g«°`«°Y«°R«°K«°D«°=«°6«°/«°(«°!«°«°«° «°«°þª°÷ª°ðª°骰⪰Ûª°Ôª°ͪ°ƪ°¿ª°¸ª°±ª°ªª°£ª°œª°•ª°Žª°‡ª°€ª°yª°rª°kª°dª°]ª°Vª°Oª°Hª°Aª°:ª°3ª°,ª°%ª°ª°ª°ª° ª°ª°û©°ô©°í©°æ©°ß©°Ø©°Ñ©°Ê©°é°¼©°µ©°®©°§©° ©°™©°’©°‹©°„©°}©°v©°o©°h©°a©°Z©°S©°L©°E©°>©°7©°0©°)©°"©°©°©° ©°©°ÿ¨°ø¨°ñ¨°ꨰ㨰ܨ°Õ¨°Ψ°Ǩ°À¨°¹¨°²¨°«¨°¤¨°¨°–¨°¨°ˆ¨°¨°z¨°s¨°l¨°e¨°^¨°W¨°P¨°I¨°B¨°;¨°4¨°-¨°&¨°¨°¨°¨° ¨°¨°ü§°õ§°î§°ç§°à§°Ù§°Ò§°˧°ħ°½§°¶§°¯§°¨§°¡§°š§°“§°Œ§°…§°~§°w§°p§°i§°b§°[§°T§°M§°F§°?§°8§°1§°*§°#§°§°§°§°§°§°ù¦°ò¦°린䦰ݦ°Ö¦°Ϧ°Ȧ°Á¦°º¦°³¦°¬¦°¥¦°ž¦°—¦°¦°‰¦°‚¦°{¦°t¦°m¦°f¦°_¦°X¦°Q¦°J¦°C¦°<¦°5¦°.¦°'¦° ¦°¦°¦° ¦°¦°ý¥°ö¥°殺襰ᥰÚ¥°Ó¥°Ì¥°Å¥°¾¥°·¥°°¥°©¥°¢¥°›¥°”¥°¥°†¥°¥°x¥°q¥°j¥°c¥°\¥°U¥°N¥°G¥°@¥°9¥°2¥°+¥°$¥°¥°¥°¥°¥°¥°ú¤°ó¤°줰夰Þ¤°פ°Ф°ɤ°¤°»¤°´¤°­¤°¦¤°Ÿ¤°˜¤°‘¤°Ф°ƒ¤°|¤°u¤°n¤°g¤°`¤°Y¤°R¤°K¤°D¤°=¤°6¤°/¤°(¤°!¤°¤°¤° ¤°¤°þ£°÷£°ð£°飰⣰Û£°Ô£°Í£°Æ£°¿£°¸£°±£°ª£°££°œ£°•£°Ž£°‡£°€£°y£°r£°k£°d£°]£°V£°O£°H£°A£°:£°3£°,£°%£°£°£°£° £°£°û¢°ô¢°í¢°械ߢ°Ø¢°Ñ¢°Ê¢°â°¼¢°µ¢°®¢°§¢° ¢°™¢°’¢°‹¢°„¢°}¢°v¢°o¢°h¢°a¢°Z¢°S¢°L¢°E¢°>¢°7¢°0¢°)¢°"¢°¢°¢° ¢°¢°ÿ¡°ø¡°ñ¡°ê¡°ã¡°Ü¡°Õ¡°Ρ°Ç¡°À¡°¹¡°²¡°«¡°¤¡°¡°–¡°¡°ˆ¡°¡°z¡°s¡°l¡°e¡°^¡°W¡°P¡°I¡°B¡°;¡°4¡°-¡°&¡°¡°¡°¡° ¡°¡°ü °õ °î °ç °à °Ù °Ò °Ë °Ä °½ °¶ °¯ °¨ °¡ °š °“ °Œ °… °~ °w °p °i °b °[ °T °M °F °? °8 °1 °* °# ° ° ° ° ° °ùŸ°òŸ°런䟰ÝŸ°ÖŸ°ÏŸ°ÈŸ°ÁŸ°ºŸ°³Ÿ°¬Ÿ°¥Ÿ°žŸ°—Ÿ°Ÿ°‰Ÿ°‚Ÿ°{Ÿ°tŸ°mŸ°fŸ°_Ÿ°XŸ°QŸ°JŸ°CŸ°<Ÿ°5Ÿ°.Ÿ°'Ÿ° Ÿ°Ÿ°Ÿ° Ÿ°Ÿ°ýž°öž°ïž°èž°áž°Úž°Óž°Ìž°Åž°¾ž°·ž°°ž°©ž°¢ž°›ž°”ž°ž°†ž°ž°xž°qž°jž°cž°\ž°Už°Nž°Gž°@ž°9ž°2ž°+ž°$ž°ž°ž°ž°ž°ž°ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þœ°÷œ°ðœ°霰✰Ûœ°Ôœ°Íœ°Æœ°¿œ°¸œ°±œ°ªœ°£œ°œœ°•œ°Žœ°‡œ°€œ°yœ°rœ°kœ°dœ°]œ°Vœ°Oœ°Hœ°Aœ°:œ°3œ°,œ°%œ°œ°œ°œ° œ°œ°û›°ô›°í›°æ›°ß›°Ø›°Ñ›°Ê›°Û°¼›°µ›°®›°§›° ›°™›°’›°‹›°„›°}›°v›°o›°h›°a›°Z›°S›°L›°E›°>›°7›°0›°)›°"›°›°›° ›°›°ÿš°øš°ñš°êš°ãš°Üš°Õš°Κ°Çš°Àš°¹š°²š°«š°¤š°š°–š°š°ˆš°š°zš°sš°lš°eš°^š°Wš°Pš°Iš°Bš°;š°4š°-š°&š°š°š°š° š°š°ü™°õ™°î™°ç™°à™°Ù™°Ò™°Ë™°Ä™°½™°¶™°¯™°¨™°¡™°š™°“™°Œ™°…™°~™°w™°p™°i™°b™°[™°T™°M™°F™°?™°8™°1™°*™°#™°™°™°™°™°™°ù˜°ò˜°똰䘰ݘ°Ö˜°Ϙ°Ș°Á˜°º˜°³˜°¬˜°¥˜°ž˜°—˜°˜°‰˜°‚˜°{˜°t˜°m˜°f˜°_˜°X˜°Q˜°J˜°C˜°<˜°5˜°.˜°'˜° ˜°˜°˜° ˜°˜°ý—°ö—°ï—°è—°á—°Ú—°Ó—°Ì—°Å—°¾—°·—°°—°©—°¢—°›—°”—°—°†—°—°x—°q—°j—°c—°\—°U—°N—°G—°@—°9—°2—°+—°$—°—°—°—°—°—°ú–°ó–°ì–°å–°Þ–°×–°Ж°É–°–°»–°´–°­–°¦–°Ÿ–°˜–°‘–°Š–°ƒ–°|–°u–°n–°g–°`–°Y–°R–°K–°D–°=–°6–°/–°(–°!–°–°–° –°–°þ•°÷•°ð•°é•°â•°Û•°Ô•°Í•°Æ•°¿•°¸•°±•°ª•°£•°œ•°••°Ž•°‡•°€•°y•°r•°k•°d•°]•°V•°O•°H•°A•°:•°3•°,•°%•°•°•°•° •°•°û”°ô”°í”°æ”°ß”°Ø”°Ñ”°Ê”°Ô°¼”°µ”°®”°§”° ”°™”°’”°‹”°„”°}”°v”°o”°h”°a”°Z”°S”°L”°E”°>”°7”°0”°)”°"”°”°”° ”°”°ÿ“°ø“°ñ“°ê“°ã“°Ü“°Õ“°Γ°Ç“°À“°¹“°²“°«“°¤“°“°–“°“°ˆ“°“°z“°s“°l“°e“°^“°W“°P“°I“°B“°;“°4“°-“°&“°“°“°“° “°“°ü’°õ’°î’°ç’°à’°Ù’°Ò’°Ë’°Ä’°½’°¶’°¯’°¨’°¡’°š’°“’°Œ’°…’°~’°w’°p’°i’°b’°[’°T’°M’°F’°?’°8’°1’°*’°#’°’°’°’°’°’°ù‘°ò‘°ë‘°ä‘°Ý‘°Ö‘°Ï‘°È‘°Á‘°º‘°³‘°¬‘°¥‘°ž‘°—‘°‘°‰‘°‚‘°{‘°t‘°m‘°f‘°_‘°X‘°Q‘°J‘°C‘°<‘°5‘°.‘°'‘° ‘°‘°‘° ‘°‘°ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þް÷ްðް鎰⎰ÛŽ°ÔŽ°ÍŽ°ÆŽ°¿Ž°¸Ž°±Ž°ªŽ°£Ž°œŽ°•ްŽŽ°‡Ž°€Ž°yްrްkްdް]ްVްOްHްAް:ް3ް,ް%ްްްް ްްû°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿŒ°øŒ°ñŒ°ꌰ㌰ÜŒ°ÕŒ°ÎŒ°ÇŒ°ÀŒ°¹Œ°²Œ°«Œ°¤Œ°Œ°–Œ°Œ°ˆŒ°Œ°zŒ°sŒ°lŒ°eŒ°^Œ°WŒ°PŒ°IŒ°BŒ°;Œ°4Œ°-Œ°&Œ°Œ°Œ°Œ° Œ°Œ°ü‹°õ‹°î‹°ç‹°à‹°Ù‹°Ò‹°Ë‹°Ä‹°½‹°¶‹°¯‹°¨‹°¡‹°š‹°“‹°Œ‹°…‹°~‹°w‹°p‹°i‹°b‹°[‹°T‹°M‹°F‹°?‹°8‹°1‹°*‹°#‹°‹°‹°‹°‹°‹°ùаòа늰䊰ÝŠ°ÖŠ°ÏŠ°ÈаÁаºŠ°³Š°¬Š°¥Š°žŠ°—аа‰Š°‚а{аtаmаfа_аXаQаJаCа<а5а.а'а ааа ааý‰°ö‰°艰ተÚ‰°Ó‰°̉°ʼn°¾‰°·‰°°‰°©‰°¢‰°›‰°”‰°‰°†‰°‰°x‰°q‰°j‰°c‰°\‰°U‰°N‰°G‰°@‰°9‰°2‰°+‰°$‰°‰°‰°‰°‰°‰°úˆ°óˆ°숰到Þˆ°׈°Ј°Ɉ°ˆ°»ˆ°´ˆ°­ˆ°¦ˆ°Ÿˆ°˜ˆ°‘ˆ°Šˆ°ƒˆ°|ˆ°uˆ°nˆ°gˆ°`ˆ°Yˆ°Rˆ°Kˆ°Dˆ°=ˆ°6ˆ°/ˆ°(ˆ°!ˆ°ˆ°ˆ° ˆ°ˆ°þ‡°÷‡°ð‡°釰⇰Û‡°Ô‡°͇°Ƈ°¿‡°¸‡°±‡°ª‡°£‡°œ‡°•‡°އ°‡‡°€‡°y‡°r‡°k‡°d‡°]‡°V‡°O‡°H‡°A‡°:‡°3‡°,‡°%‡°‡°‡°‡° ‡°‡°û†°ô†°톰憰߆°؆°ц°ʆ°ư¼†°µ†°®†°§†° †°™†°’†°‹†°„†°}†°v†°o†°h†°a†°Z†°S†°L†°E†°>†°7†°0†°)†°"†°†°†° †°†°ÿ…°ø…°ñ…°ê…°ã…°Ü…°Õ…°Î…°Ç…°À…°¹…°²…°«…°¤…°…°–…°…°ˆ…°…°z…°s…°l…°e…°^…°W…°P…°I…°B…°;…°4…°-…°&…°…°…°…° …°…°ü„°õ„°î„°ç„°à„°Ù„°Ò„°Ë„°Ä„°½„°¶„°¯„°¨„°¡„°š„°“„°Œ„°…„°~„°w„°p„°i„°b„°[„°T„°M„°F„°?„°8„°1„°*„°#„°„°„°„°„°„°ùƒ°òƒ°냰䃰݃°Öƒ°σ°ȃ°Áƒ°ºƒ°³ƒ°¬ƒ°¥ƒ°žƒ°—ƒ°ƒ°‰ƒ°‚ƒ°{ƒ°tƒ°mƒ°fƒ°_ƒ°Xƒ°Qƒ°Jƒ°Cƒ°<ƒ°5ƒ°.ƒ°'ƒ° ƒ°ƒ°ƒ° ƒ°ƒ°ý‚°ö‚°ï‚°è‚°á‚°Ú‚°Ó‚°Ì‚°Å‚°¾‚°·‚°°‚°©‚°¢‚°›‚°”‚°‚°†‚°‚°x‚°q‚°j‚°c‚°\‚°U‚°N‚°G‚°@‚°9‚°2‚°+‚°$‚°‚°‚°‚°‚°‚°ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ€°÷€°ð€°逰‰Û€°Ô€°Í€°Æ€°¿€°¸€°±€°ª€°£€°œ€°•€°Ž€°‡€°€€°y€°r€°k€°d€°]€°V€°O€°H€°A€°:€°3€°,€°%€°€°€°€° €°€°û°ô°í°æ°ß°Ø°Ñ°Ê°Ã°¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ~°ø~°ñ~°ê~°ã~°Ü~°Õ~°Î~°Ç~°À~°¹~°²~°«~°¤~°~°–~°~°ˆ~°~°z~°s~°l~°e~°^~°W~°P~°I~°B~°;~°4~°-~°&~°~°~°~° ~°~°ü}°õ}°î}°ç}°à}°Ù}°Ò}°Ë}°Ä}°½}°¶}°¯}°¨}°¡}°š}°“}°Œ}°…}°~}°w}°p}°i}°b}°[}°T}°M}°F}°?}°8}°1}°*}°#}°}°}°}°}°}°ù|°ò|°ë|°ä|°Ý|°Ö|°Ï|°È|°Á|°º|°³|°¬|°¥|°ž|°—|°|°‰|°‚|°{|°t|°m|°f|°_|°X|°Q|°J|°C|°<|°5|°.|°'|° |°|°|° |°|°ý{°ö{°ï{°è{°á{°Ú{°Ó{°Ì{°Å{°¾{°·{°°{°©{°¢{°›{°”{°{°†{°{°x{°q{°j{°c{°\{°U{°N{°G{°@{°9{°2{°+{°${°{°{°{°{°{°úz°óz°ìz°åz°Þz°×z°Ðz°Éz°Âz°»z°´z°­z°¦z°Ÿz°˜z°‘z°Šz°ƒz°|z°uz°nz°gz°`z°Yz°Rz°Kz°Dz°=z°6z°/z°(z°!z°z°z° z°z°þy°÷y°ðy°éy°ây°Ûy°Ôy°Íy°Æy°¿y°¸y°±y°ªy°£y°œy°•y°Žy°‡y°€y°yy°ry°ky°dy°]y°Vy°Oy°Hy°Ay°:y°3y°,y°%y°y°y°y° y°y°ûx°ôx°íx°æx°ßx°Øx°Ñx°Êx°Ãx°¼x°µx°®x°§x° x°™x°’x°‹x°„x°}x°vx°ox°hx°ax°Zx°Sx°Lx°Ex°>x°7x°0x°)x°"x°x°x° x°x°ÿw°øw°ñw°êw°ãw°Üw°Õw°Îw°Çw°Àw°¹w°²w°«w°¤w°w°–w°w°ˆw°w°zw°sw°lw°ew°^w°Ww°Pw°Iw°Bw°;w°4w°-w°&w°w°w°w° w°w°üv°õv°îv°çv°àv°Ùv°Òv°Ëv°Äv°½v°¶v°¯v°¨v°¡v°šv°“v°Œv°…v°~v°wv°pv°iv°bv°[v°Tv°Mv°Fv°?v°8v°1v°*v°#v°v°v°v°v°v°ùu°òu°ëu°äu°Ýu°Öu°Ïu°Èu°Áu°ºu°³u°¬u°¥u°žu°—u°u°‰u°‚u°{u°tu°mu°fu°_u°Xu°Qu°Ju°Cu°q°7q°0q°)q°"q°q°q° q°q°ÿp°øp°ñp°êp°ãp°Üp°Õp°Îp°Çp°Àp°¹p°²p°«p°¤p°p°–p°p°ˆp°p°zp°sp°lp°ep°^p°Wp°Pp°Ip°Bp°;p°4p°-p°&p°p°p°p° p°p°üo°õo°îo°ço°ào°Ùo°Òo°Ëo°Äo°½o°¶o°¯o°¨o°¡o°šo°“o°Œo°…o°~o°wo°po°io°bo°[o°To°Mo°Fo°?o°8o°1o°*o°#o°o°o°o°o°o°ùn°òn°ën°än°Ýn°Ön°Ïn°Èn°Án°ºn°³n°¬n°¥n°žn°—n°n°‰n°‚n°{n°tn°mn°fn°_n°Xn°Qn°Jn°Cn°j°7j°0j°)j°"j°j°j° j°j°ÿi°øi°ñi°êi°ãi°Üi°Õi°Îi°Çi°Ài°¹i°²i°«i°¤i°i°–i°i°ˆi°i°zi°si°li°ei°^i°Wi°Pi°Ii°Bi°;i°4i°-i°&i°i°i°i° i°i°üh°õh°îh°çh°àh°Ùh°Òh°Ëh°Äh°½h°¶h°¯h°¨h°¡h°šh°“h°Œh°…h°~h°wh°ph°ih°bh°[h°Th°Mh°Fh°?h°8h°1h°*h°#h°h°h°h°h°h°ùg°òg°ëg°äg°Ýg°Ög°Ïg°Èg°Ág°ºg°³g°¬g°¥g°žg°—g°g°‰g°‚g°{g°tg°mg°fg°_g°Xg°Qg°Jg°Cg°c°7c°0c°)c°"c°c°c° c°c°ÿb°øb°ñb°êb°ãb°Üb°Õb°Îb°Çb°Àb°¹b°²b°«b°¤b°b°–b°b°ˆb°b°zb°sb°lb°eb°^b°Wb°Pb°Ib°Bb°;b°4b°-b°&b°b°b°b° b°b°üa°õa°îa°ça°àa°Ùa°Òa°Ëa°Äa°½a°¶a°¯a°¨a°¡a°ša°“a°Œa°…a°~a°wa°pa°ia°ba°[a°Ta°Ma°Fa°?a°8a°1a°*a°#a°a°a°a°a°a°ù`°ò`°ë`°ä`°Ý`°Ö`°Ï`°È`°Á`°º`°³`°¬`°¥`°ž`°—`°`°‰`°‚`°{`°t`°m`°f`°_`°X`°Q`°J`°C`°<`°5`°.`°'`° `°`°`° `°`°ý_°ö_°ï_°è_°á_°Ú_°Ó_°Ì_°Å_°¾_°·_°°_°©_°¢_°›_°”_°_°†_°_°x_°q_°j_°c_°\_°U_°N_°G_°@_°9_°2_°+_°$_°_°_°_°_°_°ú^°ó^°ì^°å^°Þ^°×^°Ð^°É^°Â^°»^°´^°­^°¦^°Ÿ^°˜^°‘^°Š^°ƒ^°|^°u^°n^°g^°`^°Y^°R^°K^°D^°=^°6^°/^°(^°!^°^°^° ^°^°þ]°÷]°ð]°é]°â]°Û]°Ô]°Í]°Æ]°¿]°¸]°±]°ª]°£]°œ]°•]°Ž]°‡]°€]°y]°r]°k]°d]°]]°V]°O]°H]°A]°:]°3]°,]°%]°]°]°]° ]°]°û\°ô\°í\°æ\°ß\°Ø\°Ñ\°Ê\°Ã\°¼\°µ\°®\°§\° \°™\°’\°‹\°„\°}\°v\°o\°h\°a\°Z\°S\°L\°E\°>\°7\°0\°)\°"\°\°\° \°\°ÿ[°ø[°ñ[°ê[°ã[°Ü[°Õ[°Î[°Ç[°À[°¹[°²[°«[°¤[°[°–[°[°ˆ[°[°z[°s[°l[°e[°^[°W[°P[°I[°B[°;[°4[°-[°&[°[°[°[° [°[°üZ°õZ°îZ°çZ°àZ°ÙZ°ÒZ°ËZ°ÄZ°½Z°¶Z°¯Z°¨Z°¡Z°šZ°“Z°ŒZ°…Z°~Z°wZ°pZ°iZ°bZ°[Z°TZ°MZ°FZ°?Z°8Z°1Z°*Z°#Z°Z°Z°Z°Z°Z°ùY°òY°ëY°äY°ÝY°ÖY°ÏY°ÈY°ÁY°ºY°³Y°¬Y°¥Y°žY°—Y°Y°‰Y°‚Y°{Y°tY°mY°fY°_Y°XY°QY°JY°CY°U°7U°0U°)U°"U°U°U° U°U°ÿT°øT°ñT°êT°ãT°ÜT°ÕT°ÎT°ÇT°ÀT°¹T°²T°«T°¤T°T°–T°T°ˆT°T°zT°sT°lT°eT°^T°WT°PT°IT°BT°;T°4T°-T°&T°T°T°T° T°T°üS°õS°îS°çS°àS°ÙS°ÒS°ËS°ÄS°½S°¶S°¯S°¨S°¡S°šS°“S°ŒS°…S°~S°wS°pS°iS°bS°[S°TS°MS°FS°?S°8S°1S°*S°#S°S°S°S°S°S°ùR°òR°ëR°äR°ÝR°ÖR°ÏR°ÈR°ÁR°ºR°³R°¬R°¥R°žR°—R°R°‰R°‚R°{R°tR°mR°fR°_R°XR°QR°JR°CR°N°7N°0N°)N°"N°N°N° N°N°ÿM°øM°ñM°êM°ãM°ÜM°ÕM°ÎM°ÇM°ÀM°¹M°²M°«M°¤M°M°–M°M°ˆM°M°zM°sM°lM°eM°^M°WM°PM°IM°BM°;M°4M°-M°&M°M°M°M° M°M°üL°õL°îL°çL°àL°ÙL°ÒL°ËL°ÄL°½L°¶L°¯L°¨L°¡L°šL°“L°ŒL°…L°~L°wL°pL°iL°bL°[L°TL°ML°FL°?L°8L°1L°*L°#L°L°L°L°L°L°ùK°òK°ëK°äK°ÝK°ÖK°ÏK°ÈK°ÁK°ºK°³K°¬K°¥K°žK°—K°K°‰K°‚K°{K°tK°mK°fK°_K°XK°QK°JK°CK°G°7G°0G°)G°"G°G°G° G°G°ÿF°øF°ñF°êF°ãF°ÜF°ÕF°ÎF°ÇF°ÀF°¹F°²F°«F°¤F°F°–F°F°ˆF°F°zF°sF°lF°eF°^F°WF°PF°IF°BF°;F°4F°-F°&F°F°F°F° F°F°üE°õE°îE°çE°àE°ÙE°ÒE°ËE°ÄE°½E°¶E°¯E°¨E°¡E°šE°“E°ŒE°…E°~E°wE°pE°iE°bE°[E°TE°ME°FE°?E°8E°1E°*E°#E°E°E°E°E°E°ùD°òD°ëD°äD°ÝD°ÖD°ÏD°ÈD°ÁD°ºD°³D°¬D°¥D°žD°—D°D°‰D°‚D°{D°tD°mD°fD°_D°XD°QD°JD°CD°@°7@°0@°)@°"@°@°@° @°@°ÿ?°ø?°ñ?°ê?°ã?°Ü?°Õ?°Î?°Ç?°À?°¹?°²?°«?°¤?°?°–?°?°ˆ?°?°z?°s?°l?°e?°^?°W?°P?°I?°B?°;?°4?°-?°&?°?°?°?° ?°?°ü>°õ>°î>°ç>°à>°Ù>°Ò>°Ë>°Ä>°½>°¶>°¯>°¨>°¡>°š>°“>°Œ>°…>°~>°w>°p>°i>°b>°[>°T>°M>°F>°?>°8>°1>°*>°#>°>°>°>°>°>°ù=°ò=°ë=°ä=°Ý=°Ö=°Ï=°È=°Á=°º=°³=°¬=°¥=°ž=°—=°=°‰=°‚=°{=°t=°m=°f=°_=°X=°Q=°J=°C=°<=°5=°.=°'=° =°=°=° =°=°ý<°ö<°ï<°è<°á<°Ú<°Ó<°Ì<°Å<°¾<°·<°°<°©<°¢<°›<°”<°<°†<°<°x<°q<°j<°c<°\<°U<°N<°G<°@<°9<°2<°+<°$<°<°<°<°<°<°ú;°ó;°ì;°å;°Þ;°×;°Ð;°É;°Â;°»;°´;°­;°¦;°Ÿ;°˜;°‘;°Š;°ƒ;°|;°u;°n;°g;°`;°Y;°R;°K;°D;°=;°6;°/;°(;°!;°;°;° ;°;°þ:°÷:°ð:°é:°â:°Û:°Ô:°Í:°Æ:°¿:°¸:°±:°ª:°£:°œ:°•:°Ž:°‡:°€:°y:°r:°k:°d:°]:°V:°O:°H:°A:°::°3:°,:°%:°:°:°:° :°:°û9°ô9°í9°æ9°ß9°Ø9°Ñ9°Ê9°Ã9°¼9°µ9°®9°§9° 9°™9°’9°‹9°„9°}9°v9°o9°h9°a9°Z9°S9°L9°E9°>9°79°09°)9°"9°9°9° 9°9°ÿ8°ø8°ñ8°ê8°ã8°Ü8°Õ8°Î8°Ç8°À8°¹8°²8°«8°¤8°8°–8°8°ˆ8°8°z8°s8°l8°e8°^8°W8°P8°I8°B8°;8°48°-8°&8°8°8°8° 8°8°ü7°õ7°î7°ç7°à7°Ù7°Ò7°Ë7°Ä7°½7°¶7°¯7°¨7°¡7°š7°“7°Œ7°…7°~7°w7°p7°i7°b7°[7°T7°M7°F7°?7°87°17°*7°#7°7°7°7°7°7°ù6°ò6°ë6°ä6°Ý6°Ö6°Ï6°È6°Á6°º6°³6°¬6°¥6°ž6°—6°6°‰6°‚6°{6°t6°m6°f6°_6°X6°Q6°J6°C6°<6°56°.6°'6° 6°6°6° 6°6°ý5°ö5°ï5°è5°á5°Ú5°Ó5°Ì5°Å5°¾5°·5°°5°©5°¢5°›5°”5°5°†5°5°x5°q5°j5°c5°\5°U5°N5°G5°@5°95°25°+5°$5°5°5°5°5°5°ú4°ó4°ì4°å4°Þ4°×4°Ð4°É4°Â4°»4°´4°­4°¦4°Ÿ4°˜4°‘4°Š4°ƒ4°|4°u4°n4°g4°`4°Y4°R4°K4°D4°=4°64°/4°(4°!4°4°4° 4°4°þ3°÷3°ð3°é3°â3°Û3°Ô3°Í3°Æ3°¿3°¸3°±3°ª3°£3°œ3°•3°Ž3°‡3°€3°y3°r3°k3°d3°]3°V3°O3°H3°A3°:3°33°,3°%3°3°3°3° 3°3°û2°ô2°í2°æ2°ß2°Ø2°Ñ2°Ê2°Ã2°¼2°µ2°®2°§2° 2°™2°’2°‹2°„2°}2°v2°o2°h2°a2°Z2°S2°L2°E2°>2°72°02°)2°"2°2°2° 2°2°ÿ1°ø1°ñ1°ê1°ã1°Ü1°Õ1°Î1°Ç1°À1°¹1°²1°«1°¤1°1°–1°1°ˆ1°1°z1°s1°l1°e1°^1°W1°P1°I1°B1°;1°41°-1°&1°1°1°1° 1°1°ü0°õ0°î0°ç0°à0°Ù0°Ò0°Ë0°Ä0°½0°¶0°¯0°¨0°¡0°š0°“0°Œ0°…0°~0°w0°p0°i0°b0°[0°T0°M0°F0°?0°80°10°*0°#0°0°0°0°0°0°ù/°ò/°ë/°ä/°Ý/°Ö/°Ï/°È/°Á/°º/°³/°¬/°¥/°ž/°—/°/°‰/°‚/°{/°t/°m/°f/°_/°X/°Q/°J/°C/°+°7+°0+°)+°"+°+°+° +°+°ÿ*°ø*°ñ*°ê*°ã*°Ü*°Õ*°Î*°Ç*°À*°¹*°²*°«*°¤*°*°–*°*°ˆ*°*°z*°s*°l*°e*°^*°W*°P*°I*°B*°;*°4*°-*°&*°*°*°*° *°*°ü)°õ)°î)°ç)°à)°Ù)°Ò)°Ë)°Ä)°½)°¶)°¯)°¨)°¡)°š)°“)°Œ)°…)°~)°w)°p)°i)°b)°[)°T)°M)°F)°?)°8)°1)°*)°#)°)°)°)°)°)°ù(°ò(°ë(°ä(°Ý(°Ö(°Ï(°È(°Á(°º(°³(°¬(°¥(°ž(°—(°(°‰(°‚(°{(°t(°m(°f(°_(°X(°Q(°J(°C(°<(°5(°.(°'(° (°(°(° (°(°ý'°ö'°ï'°è'°á'°Ú'°Ó'°Ì'°Å'°¾'°·'°°'°©'°¢'°›'°”'°'°†'°'°x'°q'°j'°c'°\'°U'°N'°G'°@'°9'°2'°+'°$'°'°'°'°'°'°ú&°ó&°ì&°å&°Þ&°×&°Ð&°É&°Â&°»&°´&°­&°¦&°Ÿ&°˜&°‘&°Š&°ƒ&°|&°u&°n&°g&°`&°Y&°R&°K&°D&°=&°6&°/&°(&°!&°&°&° &°&°þ%°÷%°ð%°é%°â%°Û%°Ô%°Í%°Æ%°¿%°¸%°±%°ª%°£%°œ%°•%°Ž%°‡%°€%°y%°r%°k%°d%°]%°V%°O%°H%°A%°:%°3%°,%°%%°%°%°%° %°%°û$°ô$°í$°æ$°ß$°Ø$°Ñ$°Ê$°Ã$°¼$°µ$°®$°§$° $°™$°’$°‹$°„$°}$°v$°o$°h$°a$°Z$°S$°L$°E$°>$°7$°0$°)$°"$°$°$° $°$°ÿ#°ø#°ñ#°ê#°ã#°Ü#°Õ#°Î#°Ç#°À#°¹#°²#°«#°¤#°#°–#°#°ˆ#°#°z#°s#°l#°e#°^#°W#°P#°I#°B#°;#°4#°-#°&#°#°#°#° #°#°ü"°õ"°î"°ç"°à"°Ù"°Ò"°Ë"°Ä"°½"°¶"°¯"°¨"°¡"°š"°“"°Œ"°…"°~"°w"°p"°i"°b"°["°T"°M"°F"°?"°8"°1"°*"°#"°"°"°"°"°"°ù!°ò!°ë!°ä!°Ý!°Ö!°Ï!°È!°Á!°º!°³!°¬!°¥!°ž!°—!°!°‰!°‚!°{!°t!°m!°f!°_!°X!°Q!°J!°C!°°7°0°)°"°°° °°ÿ°ø°ñ°ê°ã°Ü°Õ°Î°Ç°À°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü°õ°î°ç°à°Ù°Ò°Ë°Ä°½°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù°ò°ë°ä°Ý°Ö°Ï°È°Á°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý°ö°ï°è°á°Ú°Ó°Ì°Å°¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú°ó°ì°å°Þ°×°Ð°É°Â°»°´°­°¦°Ÿ°˜°‘°Š°ƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ°÷°ð°é°â°Û°Ô°Í°Æ°¿°¸°±°ª°£°œ°•°Ž°‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û°ô°í°æ°ß°Ø°Ñ°Ê°Ã°¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ°ø°ñ°ê°ã°Ü°Õ°Î°Ç°À°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü°õ°î°ç°à°Ù°Ò°Ë°Ä°½°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù°ò°ë°ä°Ý°Ö°Ï°È°Á°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý°ö°ï°è°á°Ú°Ó°Ì°Å°¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú°ó°ì°å°Þ°×°Ð°É°Â°»°´°­°¦°Ÿ°˜°‘°Š°ƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ°÷°ð°é°â°Û°Ô°Í°Æ°¿°¸°±°ª°£°œ°•°Ž°‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û°ô°í°æ°ß°Ø°Ñ°Ê°Ã°¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ°ø°ñ°ê°ã°Ü°Õ°Î°Ç°À°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü °õ °î °ç °à °Ù °Ò °Ë °Ä °½ °¶ °¯ °¨ °¡ °š °“ °Œ °… °~ °w °p °i °b °[ °T °M °F °? °8 °1 °* °# ° ° ° ° ° °ù °ò °ë °ä °Ý °Ö °Ï °È °Á °º °³ °¬ °¥ °ž °— ° °‰ °‚ °{ °t °m °f °_ °X °Q °J °C °< °5 °. °' ° ° ° ° ° °ý °ö °ï °è °á °Ú °Ó °Ì °Å °¾ °· °° °© °¢ °› °” ° °† ° °x °q °j °c °\ °U °N °G °@ °9 °2 °+ °$ ° ° ° ° ° °ú °ó °ì °å °Þ °× °Ð °É ° °» °´ °­ °¦ °Ÿ °˜ °‘ °Š °ƒ °| °u °n °g °` °Y °R °K °D °= °6 °/ °( °! ° ° ° ° °þ °÷ °ð °é °â °Û °Ô °Í °Æ °¿ °¸ °± °ª °£ °œ °• °Ž °‡ °€ °y °r °k °d °] °V °O °H °A °: °3 °, °% ° ° ° ° ° °û°ô°í°æ°ß°Ø°Ñ°Ê°Ã°¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ°ø°ñ°ê°ã°Ü°Õ°Î°Ç°À°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü°õ°î°ç°à°Ù°Ò°Ë°Ä°½°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù°ò°ë°ä°Ý°Ö°Ï°È°Á°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý°ö°ï°è°á°Ú°Ó°Ì°Å°¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú°ó°ì°å°Þ°×°Ð°É°Â°»°´°­°¦°Ÿ°˜°‘°Š°ƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ°÷°ð°é°â°Û°Ô°Í°Æ°¿°¸°±°ª°£°œ°•°Ž°‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û°ô°í°æ°ß°Ø°Ñ°Ê°Ã°¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ°ø°ñ°ê°ã°ܰÕ°ΰǰÀ°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°üÿ¯õÿ¯îÿ¯çÿ¯àÿ¯Ùÿ¯Òÿ¯Ëÿ¯Äÿ¯½ÿ¯¶ÿ¯¯ÿ¯¨ÿ¯¡ÿ¯šÿ¯“ÿ¯Œÿ¯…ÿ¯~ÿ¯wÿ¯pÿ¯iÿ¯bÿ¯[ÿ¯Tÿ¯Mÿ¯Fÿ¯?ÿ¯8ÿ¯1ÿ¯*ÿ¯#ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ÿ¯ùþ¯òþ¯ëþ¯äþ¯Ýþ¯Öþ¯Ïþ¯Èþ¯Áþ¯ºþ¯³þ¯¬þ¯¥þ¯žþ¯—þ¯þ¯‰þ¯‚þ¯{þ¯tþ¯mþ¯fþ¯_þ¯Xþ¯Qþ¯Jþ¯Cþ¯<þ¯5þ¯.þ¯'þ¯ þ¯þ¯þ¯ þ¯þ¯ýý¯öý¯ïý¯èý¯áý¯Úý¯Óý¯Ìý¯Åý¯¾ý¯·ý¯°ý¯©ý¯¢ý¯›ý¯”ý¯ý¯†ý¯ý¯xý¯qý¯jý¯cý¯\ý¯Uý¯Ný¯Gý¯@ý¯9ý¯2ý¯+ý¯$ý¯ý¯ý¯ý¯ý¯ý¯úü¯óü¯ìü¯åü¯Þü¯×ü¯Ðü¯Éü¯Âü¯»ü¯´ü¯­ü¯¦ü¯Ÿü¯˜ü¯‘ü¯Šü¯ƒü¯|ü¯uü¯nü¯gü¯`ü¯Yü¯Rü¯Kü¯Dü¯=ü¯6ü¯/ü¯(ü¯!ü¯ü¯ü¯ ü¯ü¯þû¯÷û¯ðû¯éû¯âû¯Ûû¯Ôû¯Íû¯Æû¯¿û¯¸û¯±û¯ªû¯£û¯œû¯•û¯Žû¯‡û¯€û¯yû¯rû¯kû¯dû¯]û¯Vû¯Oû¯Hû¯Aû¯:û¯3û¯,û¯%û¯û¯û¯û¯ û¯û¯ûú¯ôú¯íú¯æú¯ßú¯Øú¯Ñú¯Êú¯Ãú¯¼ú¯µú¯®ú¯§ú¯ ú¯™ú¯’ú¯‹ú¯„ú¯}ú¯vú¯oú¯hú¯aú¯Zú¯Sú¯Lú¯Eú¯>ú¯7ú¯0ú¯)ú¯"ú¯ú¯ú¯ ú¯ú¯ÿù¯øù¯ñù¯êù¯ãù¯Üù¯Õù¯Îù¯Çù¯Àù¯¹ù¯²ù¯«ù¯¤ù¯ù¯–ù¯ù¯ˆù¯ù¯zù¯sù¯lù¯eù¯^ù¯Wù¯Pù¯Iù¯Bù¯;ù¯4ù¯-ù¯&ù¯ù¯ù¯ù¯ ù¯ù¯üø¯õø¯îø¯çø¯àø¯Ùø¯Òø¯Ëø¯Äø¯½ø¯¶ø¯¯ø¯¨ø¯¡ø¯šø¯“ø¯Œø¯…ø¯~ø¯wø¯pø¯iø¯bø¯[ø¯Tø¯Mø¯Fø¯?ø¯8ø¯1ø¯*ø¯#ø¯ø¯ø¯ø¯ø¯ø¯ù÷¯ò÷¯ë÷¯ä÷¯Ý÷¯Ö÷¯Ï÷¯È÷¯Á÷¯º÷¯³÷¯¬÷¯¥÷¯ž÷¯—÷¯÷¯‰÷¯‚÷¯{÷¯t÷¯m÷¯f÷¯_÷¯X÷¯Q÷¯J÷¯C÷¯<÷¯5÷¯.÷¯'÷¯ ÷¯÷¯÷¯ ÷¯÷¯ýö¯öö¯ïö¯èö¯áö¯Úö¯Óö¯Ìö¯Åö¯¾ö¯·ö¯°ö¯©ö¯¢ö¯›ö¯”ö¯ö¯†ö¯ö¯xö¯qö¯jö¯cö¯\ö¯Uö¯Nö¯Gö¯@ö¯9ö¯2ö¯+ö¯$ö¯ö¯ö¯ö¯ö¯ö¯úõ¯óõ¯ìõ¯åõ¯Þõ¯×õ¯Ðõ¯Éõ¯Âõ¯»õ¯´õ¯­õ¯¦õ¯Ÿõ¯˜õ¯‘õ¯Šõ¯ƒõ¯|õ¯uõ¯nõ¯gõ¯`õ¯Yõ¯Rõ¯Kõ¯Dõ¯=õ¯6õ¯/õ¯(õ¯!õ¯õ¯õ¯ õ¯õ¯þô¯÷ô¯ðô¯éô¯âô¯Ûô¯Ôô¯Íô¯Æô¯¿ô¯¸ô¯±ô¯ªô¯£ô¯œô¯•ô¯Žô¯‡ô¯€ô¯yô¯rô¯kô¯dô¯]ô¯Vô¯Oô¯Hô¯Aô¯:ô¯3ô¯,ô¯%ô¯ô¯ô¯ô¯ ô¯ô¯ûó¯ôó¯íó¯æó¯ßó¯Øó¯Ñó¯Êó¯Ãó¯¼ó¯µó¯®ó¯§ó¯ ó¯™ó¯’ó¯‹ó¯„ó¯}ó¯vó¯oó¯hó¯aó¯Zó¯Só¯Ló¯Eó¯>ó¯7ó¯0ó¯)ó¯"ó¯ó¯ó¯ ó¯ó¯ÿò¯øò¯ñò¯êò¯ãò¯Üò¯Õò¯Îò¯Çò¯Àò¯¹ò¯²ò¯«ò¯¤ò¯ò¯–ò¯ò¯ˆò¯ò¯zò¯sò¯lò¯eò¯^ò¯Wò¯Pò¯Iò¯Bò¯;ò¯4ò¯-ò¯&ò¯ò¯ò¯ò¯ ò¯ò¯üñ¯õñ¯îñ¯çñ¯àñ¯Ùñ¯Òñ¯Ëñ¯Äñ¯½ñ¯¶ñ¯¯ñ¯¨ñ¯¡ñ¯šñ¯“ñ¯Œñ¯…ñ¯~ñ¯wñ¯pñ¯iñ¯bñ¯[ñ¯Tñ¯Mñ¯Fñ¯?ñ¯8ñ¯1ñ¯*ñ¯#ñ¯ñ¯ñ¯ñ¯ñ¯ñ¯ùð¯òð¯ëð¯äð¯Ýð¯Öð¯Ïð¯Èð¯Áð¯ºð¯³ð¯¬ð¯¥ð¯žð¯—ð¯ð¯‰ð¯‚ð¯{ð¯tð¯mð¯fð¯_ð¯Xð¯Qð¯Jð¯Cð¯<ð¯5ð¯.ð¯'ð¯ ð¯ð¯ð¯ ð¯ð¯ýï¯öï¯ïï¯èï¯áï¯Úï¯Óï¯Ìï¯Åﯾﯷﯰﯩﯢﯛﯔï¯ï¯†ï¯ï¯xï¯qï¯jï¯cï¯\ï¯Uï¯Nï¯Gï¯@ï¯9ï¯2ï¯+ï¯$ï¯ï¯ï¯ï¯ï¯ï¯úî¯óî¯ìî¯åî¯Þî¯×î¯Ðî¯Éî¯Âî¯|î¯uî¯nî¯gî¯`î¯Yî¯Rî¯Kî¯Dî¯=î¯6î¯/î¯(î¯!î¯î¯î¯ î¯î¯þí¯÷í¯ðí¯éí¯âí¯Ûí¯Ôí¯Íí¯Æí¯¿í¯¸í¯±í¯ªí¯£í¯œí¯•í¯Ží¯‡í¯€í¯yí¯rí¯kí¯dí¯]í¯Ví¯Oí¯Hí¯Aí¯:í¯3í¯,í¯%í¯í¯í¯í¯ í¯í¯ûì¯ôì¯íì¯æì¯ßì¯Øì¯Ñì¯Êì¯Ã쯼쯵쯮쯧쯠쯙쯒쯋쯄ì¯}ì¯vì¯oì¯hì¯aì¯Zì¯Sì¯Lì¯Eì¯>ì¯7ì¯0ì¯)ì¯"ì¯ì¯ì¯ ì¯ì¯ÿë¯øë¯ñë¯êë¯ãë¯Üë¯Õë¯Îë¯Çë¯À믹믲믫믤ë¯ë¯–ë¯ë¯ˆë¯ë¯zë¯së¯lë¯eë¯^ë¯Wë¯Pë¯Ië¯Bë¯;ë¯4ë¯-ë¯&ë¯ë¯ë¯ë¯ ë¯ë¯üê¯õê¯îê¯çê¯àê¯Ùê¯Òê¯Ëê¯Ä꯽꯶꯯ꯨꯡꯚꯓꯌꯅê¯~ê¯wê¯pê¯iê¯bê¯[ê¯Tê¯Mê¯Fê¯?ê¯8ê¯1ê¯*ê¯#ê¯ê¯ê¯ê¯ê¯ê¯ùé¯òé¯ëé¯äé¯Ýé¯Öé¯Ïé¯Èé¯Á鯺鯳鯬鯥鯞鯗é¯é¯‰é¯‚é¯{é¯té¯mé¯fé¯_é¯Xé¯Qé¯Jé¯Cé¯<é¯5é¯.é¯'é¯ é¯é¯é¯ é¯é¯ýè¯öè¯ïè¯èè¯áè¯Úè¯Óè¯Ìè¯Å课请诰诩询诛诔è¯è¯†è¯è¯xè¯qè¯jè¯cè¯\è¯Uè¯Nè¯Gè¯@è¯9è¯2è¯+è¯$è¯è¯è¯è¯è¯è¯úç¯óç¯ìç¯åç¯Þç¯×ç¯Ðç¯Éç¯Â篻篴篭篦篟篘篑篊篃ç¯|ç¯uç¯nç¯gç¯`ç¯Yç¯Rç¯Kç¯Dç¯=ç¯6ç¯/ç¯(ç¯!ç¯ç¯ç¯ ç¯ç¯þæ¯÷æ¯ðæ¯鿝âæ¯Ûæ¯Ôæ¯Íæ¯Ææ¯¿æ¯¸æ¯±æ¯ªæ¯£æ¯œæ¯•æ¯Žæ¯‡æ¯€æ¯yæ¯ræ¯kæ¯dæ¯]æ¯Væ¯Oæ¯Hæ¯Aæ¯:æ¯3æ¯,æ¯%æ¯æ¯æ¯æ¯ æ¯æ¯ûå¯ôå¯í坿å¯ß坨å¯Ñå¯Êå¯Ã导寵寮寧寠寙寒寋寄å¯}å¯vå¯oå¯hå¯aå¯Zå¯Så¯Lå¯Eå¯>å¯7å¯0å¯)å¯"å¯å¯å¯ å¯å¯ÿ䝸ä¯ñä¯êä¯ãä¯Üä¯Õä¯Îä¯Çä¯À䯹䯲䯫䯤ä¯ä¯–ä¯ä¯ˆä¯ä¯zä¯sä¯lä¯eä¯^ä¯Wä¯Pä¯Iä¯Bä¯;ä¯4ä¯-ä¯&ä¯ä¯ä¯ä¯ ä¯ä¯üã¯õã¯îã¯çã¯àã¯Ùã¯Òã¯Ëã¯Ä㯽㯶㯯㯨㯡㯚㯓㯌㯅ã¯~ã¯wã¯pã¯iã¯bã¯[ã¯Tã¯Mã¯Fã¯?ã¯8ã¯1ã¯*ã¯#ã¯ã¯ã¯ã¯ã¯ã¯ùâ¯òâ¯ëâ¯äâ¯Ýâ¯Öâ¯Ïâ¯Èâ¯Á⯺⯳⯬⯥⯞⯗â¯â¯‰â¯‚â¯{â¯tâ¯mâ¯fâ¯_â¯Xâ¯Qâ¯Jâ¯Câ¯<â¯5â¯.â¯'⯠â¯â¯â¯ â¯â¯ýá¯öá¯ïá¯èá¯áá¯Úá¯Óá¯Ìá¯Å᯾᯷ᯰᯩᯢᯛᯔá¯á¯†á¯á¯xá¯qá¯já¯cá¯\á¯Uá¯Ná¯Gá¯@á¯9á¯2á¯+á¯$á¯á¯á¯á¯á¯á¯úà¯óà¯ìà¯åà¯Þà¯×à¯Ðà¯Éà¯Â௻௴௭௦௟௘௑ொ௃à¯|à¯uà¯nà¯gà¯`à¯Yà¯Rà¯Kà¯Dà¯=à¯6à¯/à¯(à¯!à¯à¯à¯ à¯à¯þ߯÷߯ð߯é߯â߯Û߯Ô߯Í߯Æß¯¿ß¯¸ß¯±ß¯ªß¯£ß¯œß¯•߯Žß¯‡ß¯€ß¯y߯r߯k߯d߯]߯V߯O߯H߯A߯:߯3߯,߯%߯߯߯߯ ߯߯ûÞ¯ôÞ¯íÞ¯æÞ¯ßÞ¯ØÞ¯ÑÞ¯ÊÞ¯ÃÞ¯¼Þ¯µÞ¯®Þ¯§Þ¯ Þ¯™Þ¯’Þ¯‹Þ¯„Þ¯}Þ¯vÞ¯oÞ¯hÞ¯aÞ¯ZÞ¯SÞ¯LÞ¯EÞ¯>Þ¯7Þ¯0Þ¯)Þ¯"Þ¯Þ¯Þ¯ Þ¯Þ¯ÿݯøÝ¯ñݯêݯãݯÜݯÕݯÎݯÇݯÀݯ¹Ý¯²Ý¯«Ý¯¤Ý¯ݯ–ݯݯˆÝ¯ݯzݯsݯlݯeݯ^ݯWݯPݯIݯBݯ;ݯ4ݯ-ݯ&ݯݯݯݯ ݯݯüܯõܯîܯçܯàܯÙܯÒܯËܯÄܯ½Ü¯¶Ü¯¯Ü¯¨Ü¯¡Ü¯šÜ¯“ܯŒÜ¯…ܯ~ܯwܯpܯiܯbܯ[ܯTܯMܯFܯ?ܯ8ܯ1ܯ*ܯ#ܯܯܯܯܯܯùÛ¯òÛ¯ëÛ¯äÛ¯ÝÛ¯ÖÛ¯ÏÛ¯ÈÛ¯ÁÛ¯ºÛ¯³Û¯¬Û¯¥Û¯žÛ¯—Û¯Û¯‰Û¯‚Û¯{Û¯tÛ¯mÛ¯fÛ¯_Û¯XÛ¯QÛ¯JÛ¯CÛ¯<Û¯5Û¯.Û¯'Û¯ Û¯Û¯Û¯ Û¯Û¯ýÚ¯öÚ¯ïÚ¯èÚ¯áÚ¯ÚÚ¯ÓÚ¯ÌÚ¯ÅÚ¯¾Ú¯·Ú¯°Ú¯©Ú¯¢Ú¯›Ú¯”Ú¯Ú¯†Ú¯Ú¯xÚ¯qÚ¯jÚ¯cÚ¯\Ú¯UÚ¯NÚ¯GÚ¯@Ú¯9Ú¯2Ú¯+Ú¯$Ú¯Ú¯Ú¯Ú¯Ú¯Ú¯úÙ¯óÙ¯ìÙ¯åÙ¯ÞÙ¯×Ù¯ÐÙ¯ÉÙ¯ÂÙ¯»Ù¯´Ù¯­Ù¯¦Ù¯ŸÙ¯˜Ù¯‘Ù¯ŠÙ¯ƒÙ¯|Ù¯uÙ¯nÙ¯gÙ¯`Ù¯YÙ¯RÙ¯KÙ¯DÙ¯=Ù¯6Ù¯/Ù¯(Ù¯!ٯٯٯ ٯٯþد÷دðد騝âØ¯ÛØ¯ÔØ¯ÍØ¯ÆØ¯¿Ø¯¸Ø¯±Ø¯ªØ¯£Ø¯œØ¯•دŽØ¯‡Ø¯€Ø¯yدrدkدdد]دVدOدHدAد:د3د,د%دددد ددûׯôׯíׯæ×¯ßׯØ×¯ÑׯÊׯÃׯ¼×¯µ×¯®×¯§×¯ ×¯™×¯’ׯ‹×¯„ׯ}ׯvׯoׯhׯaׯZׯSׯLׯEׯ>ׯ7ׯ0ׯ)ׯ"ׯׯׯ ׯׯÿÖ¯øÖ¯ñÖ¯êÖ¯ãÖ¯ÜÖ¯ÕÖ¯ÎÖ¯ÇÖ¯ÀÖ¯¹Ö¯²Ö¯«Ö¯¤Ö¯Ö¯–Ö¯Ö¯ˆÖ¯Ö¯zÖ¯sÖ¯lÖ¯eÖ¯^Ö¯WÖ¯PÖ¯IÖ¯BÖ¯;Ö¯4Ö¯-Ö¯&Ö¯Ö¯Ö¯Ö¯ Ö¯Ö¯üÕ¯õÕ¯îÕ¯çÕ¯àÕ¯ÙÕ¯ÒÕ¯ËÕ¯ÄÕ¯½Õ¯¶Õ¯¯Õ¯¨Õ¯¡Õ¯šÕ¯“Õ¯ŒÕ¯…Õ¯~Õ¯wÕ¯pÕ¯iÕ¯bÕ¯[Õ¯TÕ¯MÕ¯FÕ¯?Õ¯8Õ¯1Õ¯*Õ¯#Õ¯Õ¯Õ¯Õ¯Õ¯Õ¯ùÔ¯òÔ¯ëÔ¯äÔ¯ÝÔ¯ÖÔ¯ÏÔ¯ÈÔ¯ÁÔ¯ºÔ¯³Ô¯¬Ô¯¥Ô¯žÔ¯—Ô¯Ô¯‰Ô¯‚Ô¯{Ô¯tÔ¯mÔ¯fÔ¯_Ô¯XÔ¯QÔ¯JÔ¯CÔ¯<Ô¯5Ô¯.Ô¯'Ô¯ Ô¯Ô¯Ô¯ Ô¯Ô¯ýÓ¯öÓ¯ïÓ¯èÓ¯áÓ¯ÚÓ¯ÓÓ¯ÌÓ¯ÅÓ¯¾Ó¯·Ó¯°Ó¯©Ó¯¢Ó¯›Ó¯”Ó¯Ó¯†Ó¯Ó¯xÓ¯qÓ¯jÓ¯cÓ¯\Ó¯UÓ¯NÓ¯GÓ¯@Ó¯9Ó¯2Ó¯+Ó¯$Ó¯Ó¯Ó¯Ó¯Ó¯Ó¯úÒ¯óÒ¯ìÒ¯åÒ¯ÞÒ¯×Ò¯ÐÒ¯ÉÒ¯ÂÒ¯»Ò¯´Ò¯­Ò¯¦Ò¯ŸÒ¯˜Ò¯‘Ò¯ŠÒ¯ƒÒ¯|Ò¯uÒ¯nÒ¯gÒ¯`Ò¯YÒ¯RÒ¯KÒ¯DÒ¯=Ò¯6Ò¯/Ò¯(Ò¯!Ò¯Ò¯Ò¯ Ò¯Ò¯þѯ÷ѯðѯéѯâѯÛѯÔѯÍѯÆÑ¯¿Ñ¯¸Ñ¯±Ñ¯ªÑ¯£Ñ¯œÑ¯•ѯŽÑ¯‡Ñ¯€Ñ¯yѯrѯkѯdѯ]ѯVѯOѯHѯAѯ:ѯ3ѯ,ѯ%ѯѯѯѯ ѯѯûЯôЯíЯæÐ¯ßЯØÐ¯ÑЯÊЯÃЯ¼Ð¯µÐ¯®Ð¯§Ð¯ Ð¯™Ð¯’Я‹Ð¯„Я}ЯvЯoЯhЯaЯZЯSЯLЯEЯ>Я7Я0Я)Я"ЯЯЯ ЯЯÿϯøÏ¯ñϯêϯãϯÜϯÕϯÎϯÇϯÀϯ¹Ï¯²Ï¯«Ï¯¤Ï¯ϯ–ϯϯˆÏ¯ϯzϯsϯlϯeϯ^ϯWϯPϯIϯBϯ;ϯ4ϯ-ϯ&ϯϯϯϯ ϯϯüίõίîίçίàίÙίÒίËίÄί½Î¯¶Î¯¯Î¯¨Î¯¡Î¯šÎ¯“ίŒÎ¯…ί~ίwίpίiίbί[ίTίMίFί?ί8ί1ί*ί#ίίίίίίùͯòͯëͯäͯÝͯÖͯÏͯÈͯÁͯºÍ¯³Í¯¬Í¯¥Í¯žÍ¯—ͯͯ‰Í¯‚ͯ{ͯtͯmͯfͯ_ͯXͯQͯJͯCͯ<ͯ5ͯ.ͯ'ͯ ͯͯͯ ͯͯý̯ö̯ï̯è̯á̯Ú̯Ó̯Ì̯Å̯¾Ì¯·Ì¯°Ì¯©Ì¯¢Ì¯›Ì¯”̯̯†Ì¯̯x̯q̯j̯c̯\̯U̯N̯G̯@̯9̯2̯+̯$̯̯̯̯̯̯ú˯ó˯ì˯å˯Þ˯×˯Ð˯É˯Â˯»Ë¯´Ë¯­Ë¯¦Ë¯ŸË¯˜Ë¯‘˯ŠË¯ƒË¯|˯u˯n˯g˯`˯Y˯R˯K˯D˯=˯6˯/˯(˯!˯˯˯ ˯˯þʯ÷ʯðʯéʯâʯÛʯÔʯÍʯÆÊ¯¿Ê¯¸Ê¯±Ê¯ªÊ¯£Ê¯œÊ¯•ʯŽÊ¯‡Ê¯€Ê¯yʯrʯkʯdʯ]ʯVʯOʯHʯAʯ:ʯ3ʯ,ʯ%ʯʯʯʯ ʯʯûɯôɯíɯæÉ¯ßɯØÉ¯ÑɯÊɯÃɯ¼É¯µÉ¯®É¯§É¯ É¯™É¯’ɯ‹É¯„ɯ}ɯvɯoɯhɯaɯZɯSɯLɯEɯ>ɯ7ɯ0ɯ)ɯ"ɯɯɯ ɯɯÿȯøÈ¯ñȯêȯãȯÜȯÕȯÎȯÇȯÀȯ¹È¯²È¯«È¯¤È¯ȯ–ȯȯˆÈ¯ȯzȯsȯlȯeȯ^ȯWȯPȯIȯBȯ;ȯ4ȯ-ȯ&ȯȯȯȯ ȯȯüǯõǯîǯçǯàǯÙǯÒǯËǯÄǯ½Ç¯¶Ç¯¯Ç¯¨Ç¯¡Ç¯šÇ¯“ǯŒÇ¯…ǯ~ǯwǯpǯiǯbǯ[ǯTǯMǯFǯ?ǯ8ǯ1ǯ*ǯ#ǯǯǯǯǯǯùƯòƯëÆ¯䯝ÝÆ¯ÖÆ¯ÏÆ¯ÈƯÁƯºÆ¯³Æ¯¬Æ¯¥Æ¯žÆ¯—ƯƯ‰Æ¯‚Ư{ƯtƯmƯfƯ_ƯXƯQƯJƯCƯ<Ư5Ư.Ư'Ư ƯƯƯ ƯƯýůöůïůèůáůÚůÓůÌůÅů¾Å¯·Å¯°Å¯©Å¯¢Å¯›Å¯”ůů†Å¯ůxůqůjůců\ůUůNůGů@ů9ů2ů+ů$ůůůůůůúįóįìįåįÞį×įÐįÉįÂį»Ä¯´Ä¯­Ä¯¦Ä¯ŸÄ¯˜Ä¯‘įŠÄ¯ƒÄ¯|įuįnįgį`įYįRįKįDį=į6į/į(į!įįį įįþï÷ïðïéïâïÛïÔïÍïÆÃ¯¿Ã¯¸Ã¯±Ã¯ªÃ¯£Ã¯œÃ¯•ïŽÃ¯‡Ã¯€Ã¯yïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïû¯ô¯í¯æÂ¯߯ØÂ¯ѯʯï¼Â¯µÂ¯®Â¯§Â¯ Â¯™Â¯’¯‹Â¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿÁ¯øÁ¯ñÁ¯êÁ¯ãÁ¯ÜÁ¯ÕÁ¯ÎÁ¯ÇÁ¯ÀÁ¯¹Á¯²Á¯«Á¯¤Á¯Á¯–Á¯Á¯ˆÁ¯Á¯zÁ¯sÁ¯lÁ¯eÁ¯^Á¯WÁ¯PÁ¯IÁ¯BÁ¯;Á¯4Á¯-Á¯&Á¯Á¯Á¯Á¯ Á¯Á¯üÀ¯õÀ¯îÀ¯çÀ¯àÀ¯ÙÀ¯ÒÀ¯ËÀ¯ÄÀ¯½À¯¶À¯¯À¯¨À¯¡À¯šÀ¯“À¯ŒÀ¯…À¯~À¯wÀ¯pÀ¯iÀ¯bÀ¯[À¯TÀ¯MÀ¯FÀ¯?À¯8À¯1À¯*À¯#À¯À¯À¯À¯À¯À¯ù¿¯ò¿¯뿯俯Ý¿¯Ö¿¯Ï¿¯È¿¯Á¿¯º¿¯³¿¯¬¿¯¥¿¯ž¿¯—¿¯¿¯‰¿¯‚¿¯{¿¯t¿¯m¿¯f¿¯_¿¯X¿¯Q¿¯J¿¯C¿¯<¿¯5¿¯.¿¯'¿¯ ¿¯¿¯¿¯ ¿¯¿¯ý¾¯ö¾¯ᆵ辯ᾯÚ¾¯Ó¾¯̾¯ž¯¾¾¯·¾¯°¾¯©¾¯¢¾¯›¾¯”¾¯¾¯†¾¯¾¯x¾¯q¾¯j¾¯c¾¯\¾¯U¾¯N¾¯G¾¯@¾¯9¾¯2¾¯+¾¯$¾¯¾¯¾¯¾¯¾¯¾¯ú½¯ó½¯콯彯Þ½¯×½¯н¯ɽ¯½¯»½¯´½¯­½¯¦½¯Ÿ½¯˜½¯‘½¯н¯ƒ½¯|½¯u½¯n½¯g½¯`½¯Y½¯R½¯K½¯D½¯=½¯6½¯/½¯(½¯!½¯½¯½¯ ½¯½¯þ¼¯÷¼¯ð¼¯鼯⼯Û¼¯Ô¼¯ͼ¯Ƽ¯¿¼¯¸¼¯±¼¯ª¼¯£¼¯œ¼¯•¼¯޼¯‡¼¯€¼¯y¼¯r¼¯k¼¯d¼¯]¼¯V¼¯O¼¯H¼¯A¼¯:¼¯3¼¯,¼¯%¼¯¼¯¼¯¼¯ ¼¯¼¯û»¯ô»¯í»¯滯ß»¯Ø»¯Ñ»¯Ê»¯û¯¼»¯µ»¯®»¯§»¯ »¯™»¯’»¯‹»¯„»¯}»¯v»¯o»¯h»¯a»¯Z»¯S»¯L»¯E»¯>»¯7»¯0»¯)»¯"»¯»¯»¯ »¯»¯ÿº¯øº¯ñº¯꺯㺯ܺ¯Õº¯κ¯Ǻ¯Àº¯¹º¯²º¯«º¯¤º¯º¯–º¯º¯ˆº¯º¯zº¯sº¯lº¯eº¯^º¯Wº¯Pº¯Iº¯Bº¯;º¯4º¯-º¯&º¯º¯º¯º¯ º¯º¯ü¹¯õ¹¯繯๯Ù¹¯Ò¹¯˹¯Ĺ¯½¹¯¶¹¯¯¹¯¨¹¯¡¹¯š¹¯“¹¯Œ¹¯…¹¯~¹¯w¹¯p¹¯i¹¯b¹¯[¹¯T¹¯M¹¯F¹¯?¹¯8¹¯1¹¯*¹¯#¹¯¹¯¹¯¹¯¹¯¹¯ù¸¯ò¸¯븯丯ݸ¯Ö¸¯ϸ¯ȸ¯Á¸¯º¸¯³¸¯¬¸¯¥¸¯ž¸¯—¸¯¸¯‰¸¯‚¸¯{¸¯t¸¯m¸¯f¸¯_¸¯X¸¯Q¸¯J¸¯C¸¯<¸¯5¸¯.¸¯'¸¯ ¸¯¸¯¸¯ ¸¯¸¯ý·¯ö·¯ï·¯è·¯á·¯Ú·¯Ó·¯Ì·¯Å·¯¾·¯··¯°·¯©·¯¢·¯›·¯”·¯·¯†·¯·¯x·¯q·¯j·¯c·¯\·¯U·¯N·¯G·¯@·¯9·¯2·¯+·¯$·¯·¯·¯·¯·¯·¯ú¶¯ó¶¯춯嶯Þ¶¯×¶¯ж¯ɶ¯¶¯»¶¯´¶¯­¶¯¦¶¯Ÿ¶¯˜¶¯‘¶¯ж¯ƒ¶¯|¶¯u¶¯n¶¯g¶¯`¶¯Y¶¯R¶¯K¶¯D¶¯=¶¯6¶¯/¶¯(¶¯!¶¯¶¯¶¯ ¶¯¶¯þµ¯÷µ¯ðµ¯鵯ⵯÛµ¯Ôµ¯͵¯Ƶ¯¿µ¯¸µ¯±µ¯ªµ¯£µ¯œµ¯•µ¯޵¯‡µ¯€µ¯yµ¯rµ¯kµ¯dµ¯]µ¯Vµ¯Oµ¯Hµ¯Aµ¯:µ¯3µ¯,µ¯%µ¯µ¯µ¯µ¯ µ¯µ¯û´¯ô´¯í´¯æ´¯ß´¯Ø´¯Ñ´¯Ê´¯ô¯¼´¯µ´¯®´¯§´¯ ´¯™´¯’´¯‹´¯„´¯}´¯v´¯o´¯h´¯a´¯Z´¯S´¯L´¯E´¯>´¯7´¯0´¯)´¯"´¯´¯´¯ ´¯´¯ÿ³¯ø³¯ñ³¯곯㳯ܳ¯Õ³¯γ¯dz¯À³¯¹³¯²³¯«³¯¤³¯³¯–³¯³¯ˆ³¯³¯z³¯s³¯l³¯e³¯^³¯W³¯P³¯I³¯B³¯;³¯4³¯-³¯&³¯³¯³¯³¯ ³¯³¯ü²¯õ²¯粯ಯÙ²¯Ò²¯˲¯IJ¯½²¯¶²¯¯²¯¨²¯¡²¯š²¯“²¯Œ²¯…²¯~²¯w²¯p²¯i²¯b²¯[²¯T²¯M²¯F²¯?²¯8²¯1²¯*²¯#²¯²¯²¯²¯²¯²¯ù±¯ò±¯뱯䱯ݱ¯Ö±¯ϱ¯ȱ¯Á±¯º±¯³±¯¬±¯¥±¯ž±¯—±¯±¯‰±¯‚±¯{±¯t±¯m±¯f±¯_±¯X±¯Q±¯J±¯C±¯<±¯5±¯.±¯'±¯ ±¯±¯±¯ ±¯±¯ý°¯ö°¯ï°¯è°¯á°¯Ú°¯Ó°¯̰¯Ű¯¾°¯·°¯°°¯©°¯¢°¯›°¯”°¯°¯†°¯°¯x°¯q°¯j°¯c°¯\°¯U°¯N°¯G°¯@°¯9°¯2°¯+°¯$°¯°¯°¯°¯°¯°¯ú¯¯ó¯¯쯯寯Þ¯¯ׯ¯Я¯ɯ¯¯¯»¯¯´¯¯­¯¯¦¯¯Ÿ¯¯˜¯¯‘¯¯Н¯ƒ¯¯|¯¯u¯¯n¯¯g¯¯`¯¯Y¯¯R¯¯K¯¯D¯¯=¯¯6¯¯/¯¯(¯¯!¯¯¯¯¯¯ ¯¯¯¯þ®¯÷®¯ð®¯鮯⮯Û®¯Ô®¯Í®¯Æ®¯¿®¯¸®¯±®¯ª®¯£®¯œ®¯•®¯Ž®¯‡®¯€®¯y®¯r®¯k®¯d®¯]®¯V®¯O®¯H®¯A®¯:®¯3®¯,®¯%®¯®¯®¯®¯ ®¯®¯û­¯ô­¯í­¯æ­¯ß­¯Ø­¯Ñ­¯Ê­¯í¯¼­¯µ­¯®­¯§­¯ ­¯™­¯’­¯‹­¯„­¯}­¯v­¯o­¯h­¯a­¯Z­¯S­¯L­¯E­¯>­¯7­¯0­¯)­¯"­¯­¯­¯ ­¯­¯ÿ¬¯ø¬¯ñ¬¯꬯㬯ܬ¯Õ¬¯ά¯Ǭ¯À¬¯¹¬¯²¬¯«¬¯¤¬¯¬¯–¬¯¬¯ˆ¬¯¬¯z¬¯s¬¯l¬¯e¬¯^¬¯W¬¯P¬¯I¬¯B¬¯;¬¯4¬¯-¬¯&¬¯¬¯¬¯¬¯ ¬¯¬¯ü«¯õ«¯端૯Ù«¯Ò«¯Ë«¯Ä«¯½«¯¶«¯¯«¯¨«¯¡«¯š«¯“«¯Œ«¯…«¯~«¯w«¯p«¯i«¯b«¯[«¯T«¯M«¯F«¯?«¯8«¯1«¯*«¯#«¯«¯«¯«¯«¯«¯ùª¯òª¯몯䪯ݪ¯Öª¯Ϫ¯Ȫ¯Áª¯ºª¯³ª¯¬ª¯¥ª¯žª¯—ª¯ª¯‰ª¯‚ª¯{ª¯tª¯mª¯fª¯_ª¯Xª¯Qª¯Jª¯Cª¯<ª¯5ª¯.ª¯'ª¯ ª¯ª¯ª¯ ª¯ª¯ý©¯ö©¯﩯詯ᩯÚ©¯Ó©¯Ì©¯Å©¯¾©¯·©¯°©¯©©¯¢©¯›©¯”©¯©¯†©¯©¯x©¯q©¯j©¯c©¯\©¯U©¯N©¯G©¯@©¯9©¯2©¯+©¯$©¯©¯©¯©¯©¯©¯ú¨¯ó¨¯쨯娯Þ¨¯ר¯Ш¯ɨ¯¨¯»¨¯´¨¯­¨¯¦¨¯Ÿ¨¯˜¨¯‘¨¯Ѝ¯ƒ¨¯|¨¯u¨¯n¨¯g¨¯`¨¯Y¨¯R¨¯K¨¯D¨¯=¨¯6¨¯/¨¯(¨¯!¨¯¨¯¨¯ ¨¯¨¯þ§¯÷§¯ð§¯駯⧯Û§¯Ô§¯ͧ¯Ƨ¯¿§¯¸§¯±§¯ª§¯£§¯œ§¯•§¯ާ¯‡§¯€§¯y§¯r§¯k§¯d§¯]§¯V§¯O§¯H§¯A§¯:§¯3§¯,§¯%§¯§¯§¯§¯ §¯§¯û¦¯ô¦¯í¦¯榯ߦ¯ئ¯Ѧ¯ʦ¯æ¯¼¦¯µ¦¯®¦¯§¦¯ ¦¯™¦¯’¦¯‹¦¯„¦¯}¦¯v¦¯o¦¯h¦¯a¦¯Z¦¯S¦¯L¦¯E¦¯>¦¯7¦¯0¦¯)¦¯"¦¯¦¯¦¯ ¦¯¦¯ÿ¥¯ø¥¯ñ¥¯ꥯ㥯Ü¥¯Õ¥¯Î¥¯Ç¥¯À¥¯¹¥¯²¥¯«¥¯¤¥¯¥¯–¥¯¥¯ˆ¥¯¥¯z¥¯s¥¯l¥¯e¥¯^¥¯W¥¯P¥¯I¥¯B¥¯;¥¯4¥¯-¥¯&¥¯¥¯¥¯¥¯ ¥¯¥¯ü¤¯õ¤¯礯यÙ¤¯Ò¤¯ˤ¯Ĥ¯½¤¯¶¤¯¯¤¯¨¤¯¡¤¯š¤¯“¤¯Œ¤¯…¤¯~¤¯w¤¯p¤¯i¤¯b¤¯[¤¯T¤¯M¤¯F¤¯?¤¯8¤¯1¤¯*¤¯#¤¯¤¯¤¯¤¯¤¯¤¯ù£¯ò£¯룯䣯Ý£¯Ö£¯Ï£¯È£¯Á£¯º£¯³£¯¬£¯¥£¯ž£¯—£¯£¯‰£¯‚£¯{£¯t£¯m£¯f£¯_£¯X£¯Q£¯J£¯C£¯<£¯5£¯.£¯'£¯ £¯£¯£¯ £¯£¯ý¢¯ö¢¯袯᢯Ú¢¯Ó¢¯Ì¢¯Å¢¯¾¢¯·¢¯°¢¯©¢¯¢¢¯›¢¯”¢¯¢¯†¢¯¢¯x¢¯q¢¯j¢¯c¢¯\¢¯U¢¯N¢¯G¢¯@¢¯9¢¯2¢¯+¢¯$¢¯¢¯¢¯¢¯¢¯¢¯ú¡¯ó¡¯졯塯Þ¡¯ס¯С¯É¡¯¡¯»¡¯´¡¯­¡¯¦¡¯Ÿ¡¯˜¡¯‘¡¯Š¡¯ƒ¡¯|¡¯u¡¯n¡¯g¡¯`¡¯Y¡¯R¡¯K¡¯D¡¯=¡¯6¡¯/¡¯(¡¯!¡¯¡¯¡¯ ¡¯¡¯þ ¯÷ ¯ð ¯é ¯â ¯Û ¯Ô ¯Í ¯Æ ¯¿ ¯¸ ¯± ¯ª ¯£ ¯œ ¯• ¯Ž ¯‡ ¯€ ¯y ¯r ¯k ¯d ¯] ¯V ¯O ¯H ¯A ¯: ¯3 ¯, ¯% ¯ ¯ ¯ ¯  ¯ ¯ûŸ¯ôŸ¯ퟯ柯ߟ¯ØŸ¯ÑŸ¯ÊŸ¯߯¼Ÿ¯µŸ¯®Ÿ¯§Ÿ¯ Ÿ¯™Ÿ¯’Ÿ¯‹Ÿ¯„Ÿ¯}Ÿ¯vŸ¯oŸ¯hŸ¯aŸ¯ZŸ¯SŸ¯LŸ¯EŸ¯>Ÿ¯7Ÿ¯0Ÿ¯)Ÿ¯"Ÿ¯Ÿ¯Ÿ¯ Ÿ¯Ÿ¯ÿž¯øž¯ñž¯ꞯ㞯Üž¯Õž¯Ξ¯Çž¯Àž¯¹ž¯²ž¯«ž¯¤ž¯ž¯–ž¯ž¯ˆž¯ž¯zž¯sž¯lž¯ež¯^ž¯Wž¯Pž¯Iž¯Bž¯;ž¯4ž¯-ž¯&ž¯ž¯ž¯ž¯ ž¯ž¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ùœ¯òœ¯뜯䜯Ýœ¯Öœ¯Ïœ¯Èœ¯Áœ¯ºœ¯³œ¯¬œ¯¥œ¯žœ¯—œ¯œ¯‰œ¯‚œ¯{œ¯tœ¯mœ¯fœ¯_œ¯Xœ¯Qœ¯Jœ¯Cœ¯<œ¯5œ¯.œ¯'œ¯ œ¯œ¯œ¯ œ¯œ¯ý›¯ö›¯蛯ᛯÚ›¯Ó›¯Ì›¯Å›¯¾›¯·›¯°›¯©›¯¢›¯››¯”›¯›¯†›¯›¯x›¯q›¯j›¯c›¯\›¯U›¯N›¯G›¯@›¯9›¯2›¯+›¯$›¯›¯›¯›¯›¯›¯úš¯óš¯욯嚯Þš¯ך¯К¯Éš¯š¯»š¯´š¯­š¯¦š¯Ÿš¯˜š¯‘š¯Šš¯ƒš¯|š¯uš¯nš¯gš¯`š¯Yš¯Rš¯Kš¯Dš¯=š¯6š¯/š¯(š¯!š¯š¯š¯ š¯š¯þ™¯÷™¯ð™¯陯♯Û™¯Ô™¯Í™¯Æ™¯¿™¯¸™¯±™¯ª™¯£™¯œ™¯•™¯Ž™¯‡™¯€™¯y™¯r™¯k™¯d™¯]™¯V™¯O™¯H™¯A™¯:™¯3™¯,™¯%™¯™¯™¯™¯ ™¯™¯û˜¯ô˜¯혯是ߘ¯ؘ¯ј¯ʘ¯د¼˜¯µ˜¯®˜¯§˜¯ ˜¯™˜¯’˜¯‹˜¯„˜¯}˜¯v˜¯o˜¯h˜¯a˜¯Z˜¯S˜¯L˜¯E˜¯>˜¯7˜¯0˜¯)˜¯"˜¯˜¯˜¯ ˜¯˜¯ÿ—¯ø—¯ñ—¯ê—¯ã—¯Ü—¯Õ—¯Η¯Ç—¯À—¯¹—¯²—¯«—¯¤—¯—¯–—¯—¯ˆ—¯—¯z—¯s—¯l—¯e—¯^—¯W—¯P—¯I—¯B—¯;—¯4—¯-—¯&—¯—¯—¯—¯ —¯—¯ü–¯õ–¯î–¯ç–¯à–¯Ù–¯Ò–¯Ë–¯Ä–¯½–¯¶–¯¯–¯¨–¯¡–¯š–¯“–¯Œ–¯…–¯~–¯w–¯p–¯i–¯b–¯[–¯T–¯M–¯F–¯?–¯8–¯1–¯*–¯#–¯–¯–¯–¯–¯–¯ù•¯ò•¯땯䕯Ý•¯Ö•¯Ï•¯È•¯Á•¯º•¯³•¯¬•¯¥•¯ž•¯—•¯•¯‰•¯‚•¯{•¯t•¯m•¯f•¯_•¯X•¯Q•¯J•¯C•¯<•¯5•¯.•¯'•¯ •¯•¯•¯ •¯•¯ý”¯ö”¯蔯ᔯÚ”¯Ó”¯Ì”¯Å”¯¾”¯·”¯°”¯©”¯¢”¯›”¯””¯”¯†”¯”¯x”¯q”¯j”¯c”¯\”¯U”¯N”¯G”¯@”¯9”¯2”¯+”¯$”¯”¯”¯”¯”¯”¯ú“¯ó“¯쓯哯Þ“¯ד¯Г¯É“¯“¯»“¯´“¯­“¯¦“¯Ÿ“¯˜“¯‘“¯Š“¯ƒ“¯|“¯u“¯n“¯g“¯`“¯Y“¯R“¯K“¯D“¯=“¯6“¯/“¯(“¯!“¯“¯“¯ “¯“¯þ’¯÷’¯ð’¯é’¯â’¯Û’¯Ô’¯Í’¯Æ’¯¿’¯¸’¯±’¯ª’¯£’¯œ’¯•’¯Ž’¯‡’¯€’¯y’¯r’¯k’¯d’¯]’¯V’¯O’¯H’¯A’¯:’¯3’¯,’¯%’¯’¯’¯’¯ ’¯’¯û‘¯ô‘¯푯摯ß‘¯Ø‘¯Ñ‘¯Ê‘¯ѯ¼‘¯µ‘¯®‘¯§‘¯ ‘¯™‘¯’‘¯‹‘¯„‘¯}‘¯v‘¯o‘¯h‘¯a‘¯Z‘¯S‘¯L‘¯E‘¯>‘¯7‘¯0‘¯)‘¯"‘¯‘¯‘¯ ‘¯‘¯ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ùޝòޝ뎯䎯ÝŽ¯ÖŽ¯ÏŽ¯ÈޝÁޝºŽ¯³Ž¯¬Ž¯¥Ž¯žŽ¯—ޝޝ‰Ž¯‚ޝ{ޝtޝmޝfޝ_ޝXޝQޝJޝCޝ<ޝ5ޝ.ޝ'ޝ ޝޝޝ ޝޝý¯ö¯ï¯è¯á¯Ú¯Ó¯̯ů¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯úŒ¯óŒ¯쌯匯ÞŒ¯׌¯ÐŒ¯ÉŒ¯ÂŒ¯»Œ¯´Œ¯­Œ¯¦Œ¯ŸŒ¯˜Œ¯‘Œ¯ŠŒ¯ƒŒ¯|Œ¯uŒ¯nŒ¯gŒ¯`Œ¯YŒ¯RŒ¯KŒ¯DŒ¯=Œ¯6Œ¯/Œ¯(Œ¯!Œ¯Œ¯Œ¯ Œ¯Œ¯þ‹¯÷‹¯ð‹¯鋯⋯Û‹¯Ô‹¯Í‹¯Æ‹¯¿‹¯¸‹¯±‹¯ª‹¯£‹¯œ‹¯•‹¯Ž‹¯‡‹¯€‹¯y‹¯r‹¯k‹¯d‹¯]‹¯V‹¯O‹¯H‹¯A‹¯:‹¯3‹¯,‹¯%‹¯‹¯‹¯‹¯ ‹¯‹¯ûНôН튯抯ߊ¯ØŠ¯ÑŠ¯ÊŠ¯ʯ¼Š¯µŠ¯®Š¯§Š¯ Š¯™Š¯’Н‹Š¯„Н}НvНoНhНaНZНSНLНEН>Н7Н0Н)Н"ННН ННÿ‰¯ø‰¯ñ‰¯ꉯ㉯܉¯Õ‰¯Ή¯lj¯À‰¯¹‰¯²‰¯«‰¯¤‰¯‰¯–‰¯‰¯ˆ‰¯‰¯z‰¯s‰¯l‰¯e‰¯^‰¯W‰¯P‰¯I‰¯B‰¯;‰¯4‰¯-‰¯&‰¯‰¯‰¯‰¯ ‰¯‰¯üˆ¯õˆ¯爯àˆ¯Ùˆ¯Òˆ¯ˈ¯Ĉ¯½ˆ¯¶ˆ¯¯ˆ¯¨ˆ¯¡ˆ¯šˆ¯“ˆ¯Œˆ¯…ˆ¯~ˆ¯wˆ¯pˆ¯iˆ¯bˆ¯[ˆ¯Tˆ¯Mˆ¯Fˆ¯?ˆ¯8ˆ¯1ˆ¯*ˆ¯#ˆ¯ˆ¯ˆ¯ˆ¯ˆ¯ˆ¯ù‡¯ò‡¯뇯䇯݇¯Ö‡¯χ¯ȇ¯Á‡¯º‡¯³‡¯¬‡¯¥‡¯ž‡¯—‡¯‡¯‰‡¯‚‡¯{‡¯t‡¯m‡¯f‡¯_‡¯X‡¯Q‡¯J‡¯C‡¯<‡¯5‡¯.‡¯'‡¯ ‡¯‡¯‡¯ ‡¯‡¯ý†¯ö†¯膯ᆯÚ†¯Ó†¯̆¯ņ¯¾†¯·†¯°†¯©†¯¢†¯›†¯”†¯†¯††¯†¯x†¯q†¯j†¯c†¯\†¯U†¯N†¯G†¯@†¯9†¯2†¯+†¯$†¯†¯†¯†¯†¯†¯ú…¯ó…¯ì…¯å…¯Þ…¯×…¯Ð…¯É…¯Â…¯»…¯´…¯­…¯¦…¯Ÿ…¯˜…¯‘…¯Š…¯ƒ…¯|…¯u…¯n…¯g…¯`…¯Y…¯R…¯K…¯D…¯=…¯6…¯/…¯(…¯!…¯…¯…¯ …¯…¯þ„¯÷„¯ð„¯鄯ℯÛ„¯Ô„¯Í„¯Æ„¯¿„¯¸„¯±„¯ª„¯£„¯œ„¯•„¯Ž„¯‡„¯€„¯y„¯r„¯k„¯d„¯]„¯V„¯O„¯H„¯A„¯:„¯3„¯,„¯%„¯„¯„¯„¯ „¯„¯ûƒ¯ôƒ¯탯惯߃¯؃¯у¯ʃ¯ï¼ƒ¯µƒ¯®ƒ¯§ƒ¯ ƒ¯™ƒ¯’ƒ¯‹ƒ¯„ƒ¯}ƒ¯vƒ¯oƒ¯hƒ¯aƒ¯Zƒ¯Sƒ¯Lƒ¯Eƒ¯>ƒ¯7ƒ¯0ƒ¯)ƒ¯"ƒ¯ƒ¯ƒ¯ ƒ¯ƒ¯ÿ‚¯ø‚¯ñ‚¯ꂯクÜ‚¯Õ‚¯΂¯Ç‚¯À‚¯¹‚¯²‚¯«‚¯¤‚¯‚¯–‚¯‚¯ˆ‚¯‚¯z‚¯s‚¯l‚¯e‚¯^‚¯W‚¯P‚¯I‚¯B‚¯;‚¯4‚¯-‚¯&‚¯‚¯‚¯‚¯ ‚¯‚¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù€¯ò€¯뀯䀯Ý€¯Ö€¯Ï€¯È€¯Á€¯º€¯³€¯¬€¯¥€¯ž€¯—€¯€¯‰€¯‚€¯{€¯t€¯m€¯f€¯_€¯X€¯Q€¯J€¯C€¯<€¯5€¯.€¯'€¯ €¯€¯€¯ €¯€¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú~¯ó~¯ì~¯å~¯Þ~¯×~¯Ð~¯É~¯Â~¯»~¯´~¯­~¯¦~¯Ÿ~¯˜~¯‘~¯Š~¯ƒ~¯|~¯u~¯n~¯g~¯`~¯Y~¯R~¯K~¯D~¯=~¯6~¯/~¯(~¯!~¯~¯~¯ ~¯~¯þ}¯÷}¯ð}¯é}¯â}¯Û}¯Ô}¯Í}¯Æ}¯¿}¯¸}¯±}¯ª}¯£}¯œ}¯•}¯Ž}¯‡}¯€}¯y}¯r}¯k}¯d}¯]}¯V}¯O}¯H}¯A}¯:}¯3}¯,}¯%}¯}¯}¯}¯ }¯}¯û|¯ô|¯í|¯æ|¯ß|¯Ø|¯Ñ|¯Ê|¯Ã|¯¼|¯µ|¯®|¯§|¯ |¯™|¯’|¯‹|¯„|¯}|¯v|¯o|¯h|¯a|¯Z|¯S|¯L|¯E|¯>|¯7|¯0|¯)|¯"|¯|¯|¯ |¯|¯ÿ{¯ø{¯ñ{¯ê{¯ã{¯Ü{¯Õ{¯Î{¯Ç{¯À{¯¹{¯²{¯«{¯¤{¯{¯–{¯{¯ˆ{¯{¯z{¯s{¯l{¯e{¯^{¯W{¯P{¯I{¯B{¯;{¯4{¯-{¯&{¯{¯{¯{¯ {¯{¯üz¯õz¯îz¯çz¯àz¯Ùz¯Òz¯Ëz¯Äz¯½z¯¶z¯¯z¯¨z¯¡z¯šz¯“z¯Œz¯…z¯~z¯wz¯pz¯iz¯bz¯[z¯Tz¯Mz¯Fz¯?z¯8z¯1z¯*z¯#z¯z¯z¯z¯z¯z¯ùy¯òy¯ëy¯äy¯Ýy¯Öy¯Ïy¯Èy¯Áy¯ºy¯³y¯¬y¯¥y¯žy¯—y¯y¯‰y¯‚y¯{y¯ty¯my¯fy¯_y¯Xy¯Qy¯Jy¯Cy¯u¯7u¯0u¯)u¯"u¯u¯u¯ u¯u¯ÿt¯øt¯ñt¯êt¯ãt¯Üt¯Õt¯Ît¯Çt¯Àt¯¹t¯²t¯«t¯¤t¯t¯–t¯t¯ˆt¯t¯zt¯st¯lt¯et¯^t¯Wt¯Pt¯It¯Bt¯;t¯4t¯-t¯&t¯t¯t¯t¯ t¯t¯üs¯õs¯îs¯çs¯às¯Ùs¯Òs¯Ës¯Äs¯½s¯¶s¯¯s¯¨s¯¡s¯šs¯“s¯Œs¯…s¯~s¯ws¯ps¯is¯bs¯[s¯Ts¯Ms¯Fs¯?s¯8s¯1s¯*s¯#s¯s¯s¯s¯s¯s¯ùr¯òr¯ër¯är¯Ýr¯Ör¯Ïr¯Èr¯Ár¯ºr¯³r¯¬r¯¥r¯žr¯—r¯r¯‰r¯‚r¯{r¯tr¯mr¯fr¯_r¯Xr¯Qr¯Jr¯Cr¯n¯7n¯0n¯)n¯"n¯n¯n¯ n¯n¯ÿm¯øm¯ñm¯êm¯ãm¯Üm¯Õm¯Îm¯Çm¯Àm¯¹m¯²m¯«m¯¤m¯m¯–m¯m¯ˆm¯m¯zm¯sm¯lm¯em¯^m¯Wm¯Pm¯Im¯Bm¯;m¯4m¯-m¯&m¯m¯m¯m¯ m¯m¯ül¯õl¯îl¯çl¯àl¯Ùl¯Òl¯Ël¯Äl¯½l¯¶l¯¯l¯¨l¯¡l¯šl¯“l¯Œl¯…l¯~l¯wl¯pl¯il¯bl¯[l¯Tl¯Ml¯Fl¯?l¯8l¯1l¯*l¯#l¯l¯l¯l¯l¯l¯ùk¯òk¯ëk¯äk¯Ýk¯Ök¯Ïk¯Èk¯Ák¯ºk¯³k¯¬k¯¥k¯žk¯—k¯k¯‰k¯‚k¯{k¯tk¯mk¯fk¯_k¯Xk¯Qk¯Jk¯Ck¯g¯7g¯0g¯)g¯"g¯g¯g¯ g¯g¯ÿf¯øf¯ñf¯êf¯ãf¯Üf¯Õf¯Îf¯Çf¯Àf¯¹f¯²f¯«f¯¤f¯f¯–f¯f¯ˆf¯f¯zf¯sf¯lf¯ef¯^f¯Wf¯Pf¯If¯Bf¯;f¯4f¯-f¯&f¯f¯f¯f¯ f¯f¯üe¯õe¯îe¯çe¯àe¯Ùe¯Òe¯Ëe¯Äe¯½e¯¶e¯¯e¯¨e¯¡e¯še¯“e¯Œe¯…e¯~e¯we¯pe¯ie¯be¯[e¯Te¯Me¯Fe¯?e¯8e¯1e¯*e¯#e¯e¯e¯e¯e¯e¯ùd¯òd¯ëd¯äd¯Ýd¯Öd¯Ïd¯Èd¯Ád¯ºd¯³d¯¬d¯¥d¯žd¯—d¯d¯‰d¯‚d¯{d¯td¯md¯fd¯_d¯Xd¯Qd¯Jd¯Cd¯`¯7`¯0`¯)`¯"`¯`¯`¯ `¯`¯ÿ_¯ø_¯ñ_¯ê_¯ã_¯Ü_¯Õ_¯Î_¯Ç_¯À_¯¹_¯²_¯«_¯¤_¯_¯–_¯_¯ˆ_¯_¯z_¯s_¯l_¯e_¯^_¯W_¯P_¯I_¯B_¯;_¯4_¯-_¯&_¯_¯_¯_¯ _¯_¯ü^¯õ^¯î^¯ç^¯à^¯Ù^¯Ò^¯Ë^¯Ä^¯½^¯¶^¯¯^¯¨^¯¡^¯š^¯“^¯Œ^¯…^¯~^¯w^¯p^¯i^¯b^¯[^¯T^¯M^¯F^¯?^¯8^¯1^¯*^¯#^¯^¯^¯^¯^¯^¯ù]¯ò]¯ë]¯ä]¯Ý]¯Ö]¯Ï]¯È]¯Á]¯º]¯³]¯¬]¯¥]¯ž]¯—]¯]¯‰]¯‚]¯{]¯t]¯m]¯f]¯_]¯X]¯Q]¯J]¯C]¯<]¯5]¯.]¯']¯ ]¯]¯]¯ ]¯]¯ý\¯ö\¯ï\¯è\¯á\¯Ú\¯Ó\¯Ì\¯Å\¯¾\¯·\¯°\¯©\¯¢\¯›\¯”\¯\¯†\¯\¯x\¯q\¯j\¯c\¯\\¯U\¯N\¯G\¯@\¯9\¯2\¯+\¯$\¯\¯\¯\¯\¯\¯ú[¯ó[¯ì[¯å[¯Þ[¯×[¯Ð[¯É[¯Â[¯»[¯´[¯­[¯¦[¯Ÿ[¯˜[¯‘[¯Š[¯ƒ[¯|[¯u[¯n[¯g[¯`[¯Y[¯R[¯K[¯D[¯=[¯6[¯/[¯([¯![¯[¯[¯ [¯[¯þZ¯÷Z¯ðZ¯éZ¯âZ¯ÛZ¯ÔZ¯ÍZ¯ÆZ¯¿Z¯¸Z¯±Z¯ªZ¯£Z¯œZ¯•Z¯ŽZ¯‡Z¯€Z¯yZ¯rZ¯kZ¯dZ¯]Z¯VZ¯OZ¯HZ¯AZ¯:Z¯3Z¯,Z¯%Z¯Z¯Z¯Z¯ Z¯Z¯ûY¯ôY¯íY¯æY¯ßY¯ØY¯ÑY¯ÊY¯ÃY¯¼Y¯µY¯®Y¯§Y¯ Y¯™Y¯’Y¯‹Y¯„Y¯}Y¯vY¯oY¯hY¯aY¯ZY¯SY¯LY¯EY¯>Y¯7Y¯0Y¯)Y¯"Y¯Y¯Y¯ Y¯Y¯ÿX¯øX¯ñX¯êX¯ãX¯ÜX¯ÕX¯ÎX¯ÇX¯ÀX¯¹X¯²X¯«X¯¤X¯X¯–X¯X¯ˆX¯X¯zX¯sX¯lX¯eX¯^X¯WX¯PX¯IX¯BX¯;X¯4X¯-X¯&X¯X¯X¯X¯ X¯X¯üW¯õW¯îW¯çW¯àW¯ÙW¯ÒW¯ËW¯ÄW¯½W¯¶W¯¯W¯¨W¯¡W¯šW¯“W¯ŒW¯…W¯~W¯wW¯pW¯iW¯bW¯[W¯TW¯MW¯FW¯?W¯8W¯1W¯*W¯#W¯W¯W¯W¯W¯W¯ùV¯òV¯ëV¯äV¯ÝV¯ÖV¯ÏV¯ÈV¯ÁV¯ºV¯³V¯¬V¯¥V¯žV¯—V¯V¯‰V¯‚V¯{V¯tV¯mV¯fV¯_V¯XV¯QV¯JV¯CV¯R¯7R¯0R¯)R¯"R¯R¯R¯ R¯R¯ÿQ¯øQ¯ñQ¯êQ¯ãQ¯ÜQ¯ÕQ¯ÎQ¯ÇQ¯ÀQ¯¹Q¯²Q¯«Q¯¤Q¯Q¯–Q¯Q¯ˆQ¯Q¯zQ¯sQ¯lQ¯eQ¯^Q¯WQ¯PQ¯IQ¯BQ¯;Q¯4Q¯-Q¯&Q¯Q¯Q¯Q¯ Q¯Q¯üP¯õP¯îP¯çP¯àP¯ÙP¯ÒP¯ËP¯ÄP¯½P¯¶P¯¯P¯¨P¯¡P¯šP¯“P¯ŒP¯…P¯~P¯wP¯pP¯iP¯bP¯[P¯TP¯MP¯FP¯?P¯8P¯1P¯*P¯#P¯P¯P¯P¯P¯P¯ùO¯òO¯ëO¯äO¯ÝO¯ÖO¯ÏO¯ÈO¯ÁO¯ºO¯³O¯¬O¯¥O¯žO¯—O¯O¯‰O¯‚O¯{O¯tO¯mO¯fO¯_O¯XO¯QO¯JO¯CO¯K¯7K¯0K¯)K¯"K¯K¯K¯ K¯K¯ÿJ¯øJ¯ñJ¯êJ¯ãJ¯ÜJ¯ÕJ¯ÎJ¯ÇJ¯ÀJ¯¹J¯²J¯«J¯¤J¯J¯–J¯J¯ˆJ¯J¯zJ¯sJ¯lJ¯eJ¯^J¯WJ¯PJ¯IJ¯BJ¯;J¯4J¯-J¯&J¯J¯J¯J¯ J¯J¯üI¯õI¯îI¯çI¯àI¯ÙI¯ÒI¯ËI¯ÄI¯½I¯¶I¯¯I¯¨I¯¡I¯šI¯“I¯ŒI¯…I¯~I¯wI¯pI¯iI¯bI¯[I¯TI¯MI¯FI¯?I¯8I¯1I¯*I¯#I¯I¯I¯I¯I¯I¯ùH¯òH¯ëH¯äH¯ÝH¯ÖH¯ÏH¯ÈH¯ÁH¯ºH¯³H¯¬H¯¥H¯žH¯—H¯H¯‰H¯‚H¯{H¯tH¯mH¯fH¯_H¯XH¯QH¯JH¯CH¯D¯7D¯0D¯)D¯"D¯D¯D¯ D¯D¯ÿC¯øC¯ñC¯êC¯ãC¯ÜC¯ÕC¯ÎC¯ÇC¯ÀC¯¹C¯²C¯«C¯¤C¯C¯–C¯C¯ˆC¯C¯zC¯sC¯lC¯eC¯^C¯WC¯PC¯IC¯BC¯;C¯4C¯-C¯&C¯C¯C¯C¯ C¯C¯üB¯õB¯îB¯çB¯àB¯ÙB¯ÒB¯ËB¯ÄB¯½B¯¶B¯¯B¯¨B¯¡B¯šB¯“B¯ŒB¯…B¯~B¯wB¯pB¯iB¯bB¯[B¯TB¯MB¯FB¯?B¯8B¯1B¯*B¯#B¯B¯B¯B¯B¯B¯ùA¯òA¯ëA¯äA¯ÝA¯ÖA¯ÏA¯ÈA¯ÁA¯ºA¯³A¯¬A¯¥A¯žA¯—A¯A¯‰A¯‚A¯{A¯tA¯mA¯fA¯_A¯XA¯QA¯JA¯CA¯¯÷>¯ð>¯é>¯â>¯Û>¯Ô>¯Í>¯Æ>¯¿>¯¸>¯±>¯ª>¯£>¯œ>¯•>¯Ž>¯‡>¯€>¯y>¯r>¯k>¯d>¯]>¯V>¯O>¯H>¯A>¯:>¯3>¯,>¯%>¯>¯>¯>¯ >¯>¯û=¯ô=¯í=¯æ=¯ß=¯Ø=¯Ñ=¯Ê=¯Ã=¯¼=¯µ=¯®=¯§=¯ =¯™=¯’=¯‹=¯„=¯}=¯v=¯o=¯h=¯a=¯Z=¯S=¯L=¯E=¯>=¯7=¯0=¯)=¯"=¯=¯=¯ =¯=¯ÿ<¯ø<¯ñ<¯ê<¯ã<¯Ü<¯Õ<¯Î<¯Ç<¯À<¯¹<¯²<¯«<¯¤<¯<¯–<¯<¯ˆ<¯<¯z<¯s<¯l<¯e<¯^<¯W<¯P<¯I<¯B<¯;<¯4<¯-<¯&<¯<¯<¯<¯ <¯<¯ü;¯õ;¯î;¯ç;¯à;¯Ù;¯Ò;¯Ë;¯Ä;¯½;¯¶;¯¯;¯¨;¯¡;¯š;¯“;¯Œ;¯…;¯~;¯w;¯p;¯i;¯b;¯[;¯T;¯M;¯F;¯?;¯8;¯1;¯*;¯#;¯;¯;¯;¯;¯;¯ù:¯ò:¯ë:¯ä:¯Ý:¯Ö:¯Ï:¯È:¯Á:¯º:¯³:¯¬:¯¥:¯ž:¯—:¯:¯‰:¯‚:¯{:¯t:¯m:¯f:¯_:¯X:¯Q:¯J:¯C:¯<:¯5:¯.:¯':¯ :¯:¯:¯ :¯:¯ý9¯ö9¯ï9¯è9¯á9¯Ú9¯Ó9¯Ì9¯Å9¯¾9¯·9¯°9¯©9¯¢9¯›9¯”9¯9¯†9¯9¯x9¯q9¯j9¯c9¯\9¯U9¯N9¯G9¯@9¯99¯29¯+9¯$9¯9¯9¯9¯9¯9¯ú8¯ó8¯ì8¯å8¯Þ8¯×8¯Ð8¯É8¯Â8¯»8¯´8¯­8¯¦8¯Ÿ8¯˜8¯‘8¯Š8¯ƒ8¯|8¯u8¯n8¯g8¯`8¯Y8¯R8¯K8¯D8¯=8¯68¯/8¯(8¯!8¯8¯8¯ 8¯8¯þ7¯÷7¯ð7¯é7¯â7¯Û7¯Ô7¯Í7¯Æ7¯¿7¯¸7¯±7¯ª7¯£7¯œ7¯•7¯Ž7¯‡7¯€7¯y7¯r7¯k7¯d7¯]7¯V7¯O7¯H7¯A7¯:7¯37¯,7¯%7¯7¯7¯7¯ 7¯7¯û6¯ô6¯í6¯æ6¯ß6¯Ø6¯Ñ6¯Ê6¯Ã6¯¼6¯µ6¯®6¯§6¯ 6¯™6¯’6¯‹6¯„6¯}6¯v6¯o6¯h6¯a6¯Z6¯S6¯L6¯E6¯>6¯76¯06¯)6¯"6¯6¯6¯ 6¯6¯ÿ5¯ø5¯ñ5¯ê5¯ã5¯Ü5¯Õ5¯Î5¯Ç5¯À5¯¹5¯²5¯«5¯¤5¯5¯–5¯5¯ˆ5¯5¯z5¯s5¯l5¯e5¯^5¯W5¯P5¯I5¯B5¯;5¯45¯-5¯&5¯5¯5¯5¯ 5¯5¯ü4¯õ4¯î4¯ç4¯à4¯Ù4¯Ò4¯Ë4¯Ä4¯½4¯¶4¯¯4¯¨4¯¡4¯š4¯“4¯Œ4¯…4¯~4¯w4¯p4¯i4¯b4¯[4¯T4¯M4¯F4¯?4¯84¯14¯*4¯#4¯4¯4¯4¯4¯4¯ù3¯ò3¯ë3¯ä3¯Ý3¯Ö3¯Ï3¯È3¯Á3¯º3¯³3¯¬3¯¥3¯ž3¯—3¯3¯‰3¯‚3¯{3¯t3¯m3¯f3¯_3¯X3¯Q3¯J3¯C3¯<3¯53¯.3¯'3¯ 3¯3¯3¯ 3¯3¯ý2¯ö2¯ï2¯è2¯á2¯Ú2¯Ó2¯Ì2¯Å2¯¾2¯·2¯°2¯©2¯¢2¯›2¯”2¯2¯†2¯2¯x2¯q2¯j2¯c2¯\2¯U2¯N2¯G2¯@2¯92¯22¯+2¯$2¯2¯2¯2¯2¯2¯ú1¯ó1¯ì1¯å1¯Þ1¯×1¯Ð1¯É1¯Â1¯»1¯´1¯­1¯¦1¯Ÿ1¯˜1¯‘1¯Š1¯ƒ1¯|1¯u1¯n1¯g1¯`1¯Y1¯R1¯K1¯D1¯=1¯61¯/1¯(1¯!1¯1¯1¯ 1¯1¯þ0¯÷0¯ð0¯é0¯â0¯Û0¯Ô0¯Í0¯Æ0¯¿0¯¸0¯±0¯ª0¯£0¯œ0¯•0¯Ž0¯‡0¯€0¯y0¯r0¯k0¯d0¯]0¯V0¯O0¯H0¯A0¯:0¯30¯,0¯%0¯0¯0¯0¯ 0¯0¯û/¯ô/¯í/¯æ/¯ß/¯Ø/¯Ñ/¯Ê/¯Ã/¯¼/¯µ/¯®/¯§/¯ /¯™/¯’/¯‹/¯„/¯}/¯v/¯o/¯h/¯a/¯Z/¯S/¯L/¯E/¯>/¯7/¯0/¯)/¯"/¯/¯/¯ /¯/¯ÿ.¯ø.¯ñ.¯ê.¯ã.¯Ü.¯Õ.¯Î.¯Ç.¯À.¯¹.¯².¯«.¯¤.¯.¯–.¯.¯ˆ.¯.¯z.¯s.¯l.¯e.¯^.¯W.¯P.¯I.¯B.¯;.¯4.¯-.¯&.¯.¯.¯.¯ .¯.¯ü-¯õ-¯î-¯ç-¯à-¯Ù-¯Ò-¯Ë-¯Ä-¯½-¯¶-¯¯-¯¨-¯¡-¯š-¯“-¯Œ-¯…-¯~-¯w-¯p-¯i-¯b-¯[-¯T-¯M-¯F-¯?-¯8-¯1-¯*-¯#-¯-¯-¯-¯-¯-¯ù,¯ò,¯ë,¯ä,¯Ý,¯Ö,¯Ï,¯È,¯Á,¯º,¯³,¯¬,¯¥,¯ž,¯—,¯,¯‰,¯‚,¯{,¯t,¯m,¯f,¯_,¯X,¯Q,¯J,¯C,¯<,¯5,¯.,¯',¯ ,¯,¯,¯ ,¯,¯ý+¯ö+¯ï+¯è+¯á+¯Ú+¯Ó+¯Ì+¯Å+¯¾+¯·+¯°+¯©+¯¢+¯›+¯”+¯+¯†+¯+¯x+¯q+¯j+¯c+¯\+¯U+¯N+¯G+¯@+¯9+¯2+¯++¯$+¯+¯+¯+¯+¯+¯ú*¯ó*¯ì*¯å*¯Þ*¯×*¯Ð*¯É*¯Â*¯»*¯´*¯­*¯¦*¯Ÿ*¯˜*¯‘*¯Š*¯ƒ*¯|*¯u*¯n*¯g*¯`*¯Y*¯R*¯K*¯D*¯=*¯6*¯/*¯(*¯!*¯*¯*¯ *¯*¯þ)¯÷)¯ð)¯é)¯â)¯Û)¯Ô)¯Í)¯Æ)¯¿)¯¸)¯±)¯ª)¯£)¯œ)¯•)¯Ž)¯‡)¯€)¯y)¯r)¯k)¯d)¯])¯V)¯O)¯H)¯A)¯:)¯3)¯,)¯%)¯)¯)¯)¯ )¯)¯û(¯ô(¯í(¯æ(¯ß(¯Ø(¯Ñ(¯Ê(¯Ã(¯¼(¯µ(¯®(¯§(¯ (¯™(¯’(¯‹(¯„(¯}(¯v(¯o(¯h(¯a(¯Z(¯S(¯L(¯E(¯>(¯7(¯0(¯)(¯"(¯(¯(¯ (¯(¯ÿ'¯ø'¯ñ'¯ê'¯ã'¯Ü'¯Õ'¯Î'¯Ç'¯À'¯¹'¯²'¯«'¯¤'¯'¯–'¯'¯ˆ'¯'¯z'¯s'¯l'¯e'¯^'¯W'¯P'¯I'¯B'¯;'¯4'¯-'¯&'¯'¯'¯'¯ '¯'¯ü&¯õ&¯î&¯ç&¯à&¯Ù&¯Ò&¯Ë&¯Ä&¯½&¯¶&¯¯&¯¨&¯¡&¯š&¯“&¯Œ&¯…&¯~&¯w&¯p&¯i&¯b&¯[&¯T&¯M&¯F&¯?&¯8&¯1&¯*&¯#&¯&¯&¯&¯&¯&¯ù%¯ò%¯ë%¯ä%¯Ý%¯Ö%¯Ï%¯È%¯Á%¯º%¯³%¯¬%¯¥%¯ž%¯—%¯%¯‰%¯‚%¯{%¯t%¯m%¯f%¯_%¯X%¯Q%¯J%¯C%¯<%¯5%¯.%¯'%¯ %¯%¯%¯ %¯%¯ý$¯ö$¯ï$¯è$¯á$¯Ú$¯Ó$¯Ì$¯Å$¯¾$¯·$¯°$¯©$¯¢$¯›$¯”$¯$¯†$¯$¯x$¯q$¯j$¯c$¯\$¯U$¯N$¯G$¯@$¯9$¯2$¯+$¯$$¯$¯$¯$¯$¯$¯ú#¯ó#¯ì#¯å#¯Þ#¯×#¯Ð#¯É#¯Â#¯»#¯´#¯­#¯¦#¯Ÿ#¯˜#¯‘#¯Š#¯ƒ#¯|#¯u#¯n#¯g#¯`#¯Y#¯R#¯K#¯D#¯=#¯6#¯/#¯(#¯!#¯#¯#¯ #¯#¯þ"¯÷"¯ð"¯é"¯â"¯Û"¯Ô"¯Í"¯Æ"¯¿"¯¸"¯±"¯ª"¯£"¯œ"¯•"¯Ž"¯‡"¯€"¯y"¯r"¯k"¯d"¯]"¯V"¯O"¯H"¯A"¯:"¯3"¯,"¯%"¯"¯"¯"¯ "¯"¯û!¯ô!¯í!¯æ!¯ß!¯Ø!¯Ñ!¯Ê!¯Ã!¯¼!¯µ!¯®!¯§!¯ !¯™!¯’!¯‹!¯„!¯}!¯v!¯o!¯h!¯a!¯Z!¯S!¯L!¯E!¯>!¯7!¯0!¯)!¯"!¯!¯!¯ !¯!¯ÿ ¯ø ¯ñ ¯ê ¯ã ¯Ü ¯Õ ¯Î ¯Ç ¯À ¯¹ ¯² ¯« ¯¤ ¯ ¯– ¯ ¯ˆ ¯ ¯z ¯s ¯l ¯e ¯^ ¯W ¯P ¯I ¯B ¯; ¯4 ¯- ¯& ¯ ¯ ¯ ¯ ¯ ¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯Ë¯Ä¯½¯¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù¯ò¯ë¯ä¯Ý¯Ö¯Ï¯È¯Á¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú¯ó¯ì¯å¯Þ¯×¯Ð¯É¯Â¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Š¯ƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ¯÷¯ð¯é¯â¯Û¯Ô¯Í¯Æ¯¿¯¸¯±¯ª¯£¯œ¯•¯Ž¯‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û¯ô¯í¯æ¯ß¯Ø¯Ñ¯Ê¯Ã¯¼¯µ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ¯ø¯ñ¯ê¯ã¯Ü¯Õ¯Î¯Ç¯À¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯Ë¯Ä¯½¯¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù¯ò¯ë¯ä¯Ý¯Ö¯Ï¯È¯Á¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú¯ó¯ì¯å¯Þ¯×¯Ð¯É¯Â¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Š¯ƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ¯÷¯ð¯é¯â¯Û¯Ô¯Í¯Æ¯¿¯¸¯±¯ª¯£¯œ¯•¯Ž¯‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û¯ô¯í¯æ¯ß¯Ø¯Ñ¯Ê¯Ã¯¼¯µ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ¯ø¯ñ¯ê¯ã¯Ü¯Õ¯Î¯Ç¯À¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯Ë¯Ä¯½¯¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù¯ò¯ë¯ä¯Ý¯Ö¯Ï¯È¯Á¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú¯ó¯ì¯å¯Þ¯×¯Ð¯É¯Â¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Š¯ƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ ¯÷ ¯ð ¯é ¯â ¯Û ¯Ô ¯Í ¯Æ ¯¿ ¯¸ ¯± ¯ª ¯£ ¯œ ¯• ¯Ž ¯‡ ¯€ ¯y ¯r ¯k ¯d ¯] ¯V ¯O ¯H ¯A ¯: ¯3 ¯, ¯% ¯ ¯ ¯ ¯ ¯ ¯û ¯ô ¯í ¯æ ¯ß ¯Ø ¯Ñ ¯Ê ¯à ¯¼ ¯µ ¯® ¯§ ¯  ¯™ ¯’ ¯‹ ¯„ ¯} ¯v ¯o ¯h ¯a ¯Z ¯S ¯L ¯E ¯> ¯7 ¯0 ¯) ¯" ¯ ¯ ¯ ¯ ¯ÿ ¯ø ¯ñ ¯ê ¯ã ¯Ü ¯Õ ¯Î ¯Ç ¯À ¯¹ ¯² ¯« ¯¤ ¯ ¯– ¯ ¯ˆ ¯ ¯z ¯s ¯l ¯e ¯^ ¯W ¯P ¯I ¯B ¯; ¯4 ¯- ¯& ¯ ¯ ¯ ¯ ¯ ¯ü ¯õ ¯î ¯ç ¯à ¯Ù ¯Ò ¯Ë ¯Ä ¯½ ¯¶ ¯¯ ¯¨ ¯¡ ¯š ¯“ ¯Œ ¯… ¯~ ¯w ¯p ¯i ¯b ¯[ ¯T ¯M ¯F ¯? ¯8 ¯1 ¯* ¯# ¯ ¯ ¯ ¯ ¯ ¯ù ¯ò ¯ë ¯ä ¯Ý ¯Ö ¯Ï ¯È ¯Á ¯º ¯³ ¯¬ ¯¥ ¯ž ¯— ¯ ¯‰ ¯‚ ¯{ ¯t ¯m ¯f ¯_ ¯X ¯Q ¯J ¯C ¯< ¯5 ¯. ¯' ¯ ¯ ¯ ¯ ¯ ¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú¯ó¯ì¯å¯Þ¯×¯Ð¯É¯Â¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Š¯ƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ¯÷¯ð¯é¯â¯Û¯Ô¯Í¯Æ¯¿¯¸¯±¯ª¯£¯œ¯•¯Ž¯‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û¯ô¯í¯æ¯ß¯Ø¯Ñ¯Ê¯Ã¯¼¯µ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ¯ø¯ñ¯ê¯ã¯Ü¯Õ¯Î¯Ç¯À¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü¯õ¯î¯ç¯à¯Ù¯Ò¯Ë¯Ä¯½¯¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù¯ò¯ë¯ä¯Ý¯Ö¯Ï¯È¯Á¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý¯ö¯ï¯è¯á¯Ú¯Ó¯Ì¯Å¯¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þÿ®÷ÿ®ðÿ®éÿ®âÿ®Ûÿ®Ôÿ®Íÿ®Æÿ®¿ÿ®¸ÿ®±ÿ®ªÿ®£ÿ®œÿ®•ÿ®Žÿ®‡ÿ®€ÿ®yÿ®rÿ®kÿ®dÿ®]ÿ®Vÿ®Oÿ®Hÿ®Aÿ®:ÿ®3ÿ®,ÿ®%ÿ®ÿ®ÿ®ÿ® ÿ®ÿ®ûþ®ôþ®íþ®æþ®ßþ®Øþ®Ñþ®Êþ®Ãþ®¼þ®µþ®®þ®§þ® þ®™þ®’þ®‹þ®„þ®}þ®vþ®oþ®hþ®aþ®Zþ®Sþ®Lþ®Eþ®>þ®7þ®0þ®)þ®"þ®þ®þ® þ®þ®ÿý®øý®ñý®êý®ãý®Üý®Õý®Îý®Çý®Àý®¹ý®²ý®«ý®¤ý®ý®–ý®ý®ˆý®ý®zý®sý®lý®eý®^ý®Wý®Pý®Iý®Bý®;ý®4ý®-ý®&ý®ý®ý®ý® ý®ý®üü®õü®îü®çü®àü®Ùü®Òü®Ëü®Äü®½ü®¶ü®¯ü®¨ü®¡ü®šü®“ü®Œü®…ü®~ü®wü®pü®iü®bü®[ü®Tü®Mü®Fü®?ü®8ü®1ü®*ü®#ü®ü®ü®ü®ü®ü®ùû®òû®ëû®äû®Ýû®Öû®Ïû®Èû®Áû®ºû®³û®¬û®¥û®žû®—û®û®‰û®‚û®{û®tû®mû®fû®_û®Xû®Qû®Jû®Cû®<û®5û®.û®'û® û®û®û® û®û®ýú®öú®ïú®èú®áú®Úú®Óú®Ìú®Åú®¾ú®·ú®°ú®©ú®¢ú®›ú®”ú®ú®†ú®ú®xú®qú®jú®cú®\ú®Uú®Nú®Gú®@ú®9ú®2ú®+ú®$ú®ú®ú®ú®ú®ú®úù®óù®ìù®åù®Þù®×ù®Ðù®Éù®Âù®»ù®´ù®­ù®¦ù®Ÿù®˜ù®‘ù®Šù®ƒù®|ù®uù®nù®gù®`ù®Yù®Rù®Kù®Dù®=ù®6ù®/ù®(ù®!ù®ù®ù® ù®ù®þø®÷ø®ðø®éø®âø®Ûø®Ôø®Íø®Æø®¿ø®¸ø®±ø®ªø®£ø®œø®•ø®Žø®‡ø®€ø®yø®rø®kø®dø®]ø®Vø®Oø®Hø®Aø®:ø®3ø®,ø®%ø®ø®ø®ø® ø®ø®û÷®ô÷®í÷®æ÷®ß÷®Ø÷®Ñ÷®Ê÷®Ã÷®¼÷®µ÷®®÷®§÷® ÷®™÷®’÷®‹÷®„÷®}÷®v÷®o÷®h÷®a÷®Z÷®S÷®L÷®E÷®>÷®7÷®0÷®)÷®"÷®÷®÷® ÷®÷®ÿö®øö®ñö®êö®ãö®Üö®Õö®Îö®Çö®Àö®¹ö®²ö®«ö®¤ö®ö®–ö®ö®ˆö®ö®zö®sö®lö®eö®^ö®Wö®Pö®Iö®Bö®;ö®4ö®-ö®&ö®ö®ö®ö® ö®ö®üõ®õõ®îõ®çõ®àõ®Ùõ®Òõ®Ëõ®Äõ®½õ®¶õ®¯õ®¨õ®¡õ®šõ®“õ®Œõ®…õ®~õ®wõ®põ®iõ®bõ®[õ®Tõ®Mõ®Fõ®?õ®8õ®1õ®*õ®#õ®õ®õ®õ®õ®õ®ùô®òô®ëô®äô®Ýô®Öô®Ïô®Èô®Áô®ºô®³ô®¬ô®¥ô®žô®—ô®ô®‰ô®‚ô®{ô®tô®mô®fô®_ô®Xô®Qô®Jô®Cô®<ô®5ô®.ô®'ô® ô®ô®ô® ô®ô®ýó®öó®ïó®èó®áó®Úó®Óó®Ìó®Åó®¾ó®·ó®°ó®©ó®¢ó®›ó®”ó®ó®†ó®ó®xó®qó®jó®có®\ó®Uó®Nó®Gó®@ó®9ó®2ó®+ó®$ó®ó®ó®ó®ó®ó®úò®óò®ìò®åò®Þò®×ò®Ðò®Éò®Âò®»ò®´ò®­ò®¦ò®Ÿò®˜ò®‘ò®Šò®ƒò®|ò®uò®nò®gò®`ò®Yò®Rò®Kò®Dò®=ò®6ò®/ò®(ò®!ò®ò®ò® ò®ò®þñ®÷ñ®ðñ®éñ®âñ®Ûñ®Ôñ®Íñ®Æñ®¿ñ®¸ñ®±ñ®ªñ®£ñ®œñ®•ñ®Žñ®‡ñ®€ñ®yñ®rñ®kñ®dñ®]ñ®Vñ®Oñ®Hñ®Añ®:ñ®3ñ®,ñ®%ñ®ñ®ñ®ñ® ñ®ñ®ûð®ôð®íð®æð®ßð®Øð®Ñð®Êð®Ãð®¼ð®µð®®ð®§ð® ð®™ð®’ð®‹ð®„ð®}ð®vð®oð®hð®að®Zð®Sð®Lð®Eð®>ð®7ð®0ð®)ð®"ð®ð®ð® ð®ð®ÿï®øï®ñï®êï®ãï®Üï®Õï®Îï®Çï®À﮹﮲ﮫﮤï®ï®–ï®ï®ˆï®ï®zï®sï®lï®eï®^ï®Wï®Pï®Iï®Bï®;ï®4ï®-ï®&ï®ï®ï®ï® ï®ï®üî®õî®îî®çî®àî®Ùî®Òî®Ëî®Äî®~î®wî®pî®iî®bî®[î®Tî®Mî®Fî®?î®8î®1î®*î®#î®î®î®î®î®î®ùí®òí®ëí®äí®Ýí®Öí®Ïí®Èí®Áí®ºí®³í®¬í®¥í®ží®—í®í®‰í®‚í®{í®tí®mí®fí®_í®Xí®Qí®Jí®Cí®<í®5í®.í®'í® í®í®í® í®í®ýì®öì®ïì®èì®áì®Úì®Óì®Ìì®Å쮾쮷쮰쮩쮢쮛쮔ì®ì®†ì®ì®xì®qì®jì®cì®\ì®Uì®Nì®Gì®@ì®9ì®2ì®+ì®$ì®ì®ì®ì®ì®ì®úë®óë®ìë®åë®Þë®×ë®Ðë®Éë®Â뮻뮴뮭뮦뮟뮘뮑뮊뮃ë®|ë®uë®në®gë®`ë®Yë®Rë®Kë®Dë®=ë®6ë®/ë®(ë®!ë®ë®ë® ë®ë®þê®÷ê®ðê®éê®âê®Ûê®Ôê®Íê®Æê®¿ê®¸ê®±ê®ªê®£ê®œê®•ê®Žê®‡ê®€ê®yê®rê®kê®dê®]ê®Vê®Oê®Hê®Aê®:ê®3ê®,ê®%ê®ê®ê®ê® ê®ê®ûé®ôé®í鮿é®ß鮨é®Ñé®Êé®Ã鮼鮵鮮鮧鮠鮙鮒鮋鮄é®}é®vé®oé®hé®aé®Zé®Sé®Lé®Eé®>é®7é®0é®)é®"é®é®é® é®é®ÿè®øè®ñè®êè®ãè®Üè®Õè®Îè®Çè®À讹讲讫认è®è®–è®è®ˆè®è®zè®sè®lè®eè®^è®Wè®Pè®Iè®Bè®;è®4è®-è®&è®è®è®è® è®è®üç®õç®îç®çç®àç®Ùç®Òç®Ëç®Ä箽箶箯箨管箚箓箌箅ç®~ç®wç®pç®iç®bç®[ç®Tç®Mç®Fç®?ç®8ç®1ç®*ç®#ç®ç®ç®ç®ç®ç®ùæ®òæ®ëæ®äæ®Ýæ®Öæ®Ïæ®Èæ®Áæ®ºæ®³æ®¬æ®¥æ®žæ®—æ®æ®‰æ®‚æ®{æ®tæ®mæ®fæ®_æ®Xæ®Qæ®Jæ®Cæ®<æ®5æ®.æ®'æ® æ®æ®æ® æ®æ®ýå®öå®ïå®èå®áå®Úå®Óå®Ìå®Å宾宷宰宩客宛宔å®å®†å®å®xå®qå®jå®cå®\å®Uå®Nå®Gå®@å®9å®2å®+å®$å®å®å®å®å®å®úä®óä®ìä®åä®Þä®×ä®Ðä®Éä®Â䮻䮴䮭䮦䮟䮘䮑䮊䮃ä®|ä®uä®nä®gä®`ä®Yä®Rä®Kä®Dä®=ä®6ä®/ä®(ä®!ä®ä®ä® ä®ä®þã®÷ã®ðã®éã®âã®Ûã®Ôã®Íã®Æã®¿ã®¸ã®±ã®ªã®£ã®œã®•ã®Žã®‡ã®€ã®yã®rã®kã®dã®]ã®Vã®Oã®Hã®Aã®:ã®3ã®,ã®%ã®ã®ã®ã® ã®ã®ûâ®ôâ®íâ®æâ®ßâ®Øâ®Ñâ®Êâ®Ã⮼⮵⮮⮧⮠⮙⮒⮋⮄â®}â®vâ®oâ®hâ®aâ®Zâ®Sâ®Lâ®Eâ®>â®7â®0â®)â®"â®â®â® â®â®ÿá®øá®ñá®êá®ãá®Üá®Õá®Îá®Çá®À᮹᮲᮫ᮤá®á®–á®á®ˆá®á®zá®sá®lá®eá®^á®Wá®Pá®Iá®Bá®;á®4á®-á®&á®á®á®á® á®á®üà®õà®îà®çà®àà®Ùà®Òà®Ëà®Ä஽ஶயந஡சஓ஌அà®~à®wà®pà®ià®bà®[à®Tà®Mà®Fà®?à®8à®1à®*à®#à®à®à®à®à®à®ùß®òß®ëß®äß®Ýß®Öß®Ïß®Èß®Áß®ºß®³ß®¬ß®¥ß®žß®—߮߮‰ß®‚ß®{ß®tß®mß®fß®_ß®Xß®Qß®Jß®Cß®<ß®5ß®.ß®'ß® ߮߮߮ ߮߮ýÞ®öÞ®ïÞ®èÞ®áÞ®ÚÞ®ÓÞ®ÌÞ®ÅÞ®¾Þ®·Þ®°Þ®©Þ®¢Þ®›Þ®”Þ®Þ®†Þ®Þ®xÞ®qÞ®jÞ®cÞ®\Þ®UÞ®NÞ®GÞ®@Þ®9Þ®2Þ®+Þ®$Þ®Þ®Þ®Þ®Þ®Þ®úÝ®óÝ®ìÝ®åÝ®ÞÝ®×Ý®ÐÝ®ÉÝ®ÂÝ®»Ý®´Ý®­Ý®¦Ý®ŸÝ®˜Ý®‘Ý®ŠÝ®ƒÝ®|Ý®uÝ®nÝ®gÝ®`Ý®YÝ®RÝ®KÝ®DÝ®=Ý®6Ý®/Ý®(Ý®!ݮݮݮ ݮݮþÜ®÷Ü®ðÜ®éÜ®âÜ®ÛÜ®ÔÜ®ÍÜ®ÆÜ®¿Ü®¸Ü®±Ü®ªÜ®£Ü®œÜ®•Ü®ŽÜ®‡Ü®€Ü®yÜ®rÜ®kÜ®dÜ®]Ü®VÜ®OÜ®HÜ®AÜ®:Ü®3Ü®,Ü®%ܮܮܮܮ ܮܮûÛ®ôÛ®íÛ®æÛ®ßÛ®ØÛ®ÑÛ®ÊÛ®ÃÛ®¼Û®µÛ®®Û®§Û® Û®™Û®’Û®‹Û®„Û®}Û®vÛ®oÛ®hÛ®aÛ®ZÛ®SÛ®LÛ®EÛ®>Û®7Û®0Û®)Û®"Û®Û®Û® Û®Û®ÿÚ®øÚ®ñÚ®êÚ®ãÚ®ÜÚ®ÕÚ®ÎÚ®ÇÚ®ÀÚ®¹Ú®²Ú®«Ú®¤Ú®Ú®–Ú®Ú®ˆÚ®Ú®zÚ®sÚ®lÚ®eÚ®^Ú®WÚ®PÚ®IÚ®BÚ®;Ú®4Ú®-Ú®&Ú®Ú®Ú®Ú® Ú®Ú®üÙ®õÙ®îÙ®çÙ®àÙ®ÙÙ®ÒÙ®ËÙ®ÄÙ®½Ù®¶Ù®¯Ù®¨Ù®¡Ù®šÙ®“Ù®ŒÙ®…Ù®~Ù®wÙ®pÙ®iÙ®bÙ®[Ù®TÙ®MÙ®FÙ®?Ù®8Ù®1Ù®*Ù®#ٮٮٮٮٮٮùØ®òØ®ëØ®䨮ÝØ®ÖØ®ÏØ®ÈØ®ÁØ®ºØ®³Ø®¬Ø®¥Ø®žØ®—خخ‰Ø®‚Ø®{Ø®tØ®mØ®fØ®_Ø®XØ®QØ®JØ®CØ®<Ø®5Ø®.Ø®'Ø® خخخ خخý×®ö×®ï×®è×®á×®Ú×®Ó×®Ì×®Å×®¾×®·×®°×®©×®¢×®›×®”×®×®†×®×®x×®q×®j×®c×®\×®U×®N×®G×®@×®9×®2×®+×®$×®×®×®×®×®×®úÖ®óÖ®ìÖ®åÖ®ÞÖ®×Ö®ÐÖ®ÉÖ®ÂÖ®»Ö®´Ö®­Ö®¦Ö®ŸÖ®˜Ö®‘Ö®ŠÖ®ƒÖ®|Ö®uÖ®nÖ®gÖ®`Ö®YÖ®RÖ®KÖ®DÖ®=Ö®6Ö®/Ö®(Ö®!Ö®Ö®Ö® Ö®Ö®þÕ®÷Õ®ðÕ®éÕ®âÕ®ÛÕ®ÔÕ®ÍÕ®ÆÕ®¿Õ®¸Õ®±Õ®ªÕ®£Õ®œÕ®•Õ®ŽÕ®‡Õ®€Õ®yÕ®rÕ®kÕ®dÕ®]Õ®VÕ®OÕ®HÕ®AÕ®:Õ®3Õ®,Õ®%Õ®Õ®Õ®Õ® Õ®Õ®ûÔ®ôÔ®íÔ®æÔ®ßÔ®ØÔ®ÑÔ®ÊÔ®ÃÔ®¼Ô®µÔ®®Ô®§Ô® Ô®™Ô®’Ô®‹Ô®„Ô®}Ô®vÔ®oÔ®hÔ®aÔ®ZÔ®SÔ®LÔ®EÔ®>Ô®7Ô®0Ô®)Ô®"Ô®Ô®Ô® Ô®Ô®ÿÓ®øÓ®ñÓ®êÓ®ãÓ®ÜÓ®ÕÓ®ÎÓ®ÇÓ®ÀÓ®¹Ó®²Ó®«Ó®¤Ó®Ó®–Ó®Ó®ˆÓ®Ó®zÓ®sÓ®lÓ®eÓ®^Ó®WÓ®PÓ®IÓ®BÓ®;Ó®4Ó®-Ó®&Ó®Ó®Ó®Ó® Ó®Ó®üÒ®õÒ®îÒ®çÒ®àÒ®ÙÒ®ÒÒ®ËÒ®ÄÒ®½Ò®¶Ò®¯Ò®¨Ò®¡Ò®šÒ®“Ò®ŒÒ®…Ò®~Ò®wÒ®pÒ®iÒ®bÒ®[Ò®TÒ®MÒ®FÒ®?Ò®8Ò®1Ò®*Ò®#Ò®Ò®Ò®Ò®Ò®Ò®ùÑ®òÑ®ëÑ®äÑ®ÝÑ®ÖÑ®ÏÑ®ÈÑ®ÁÑ®ºÑ®³Ñ®¬Ñ®¥Ñ®žÑ®—ѮѮ‰Ñ®‚Ñ®{Ñ®tÑ®mÑ®fÑ®_Ñ®XÑ®QÑ®JÑ®CÑ®<Ñ®5Ñ®.Ñ®'Ñ® ѮѮѮ ѮѮýЮöЮïЮèЮáЮÚЮÓЮÌЮÅЮ¾Ð®·Ð®°Ð®©Ð®¢Ð®›Ð®”ЮЮ†Ð®ЮxЮqЮjЮcЮ\ЮUЮNЮGЮ@Ю9Ю2Ю+Ю$ЮЮЮЮЮЮúÏ®óÏ®ìÏ®åÏ®ÞÏ®×Ï®ÐÏ®ÉÏ®ÂÏ®»Ï®´Ï®­Ï®¦Ï®ŸÏ®˜Ï®‘Ï®ŠÏ®ƒÏ®|Ï®uÏ®nÏ®gÏ®`Ï®YÏ®RÏ®KÏ®DÏ®=Ï®6Ï®/Ï®(Ï®!ϮϮϮ ϮϮþή÷ήðήéήâήÛήÔήÍήÆÎ®¿Î®¸Î®±Î®ªÎ®£Î®œÎ®•ήŽÎ®‡Î®€Î®yήrήkήdή]ήVήOήHήAή:ή3ή,ή%ήήήή ήήûÍ®ôÍ®íÍ®æÍ®ßÍ®ØÍ®ÑÍ®ÊÍ®ÃÍ®¼Í®µÍ®®Í®§Í® Í®™Í®’Í®‹Í®„Í®}Í®vÍ®oÍ®hÍ®aÍ®ZÍ®SÍ®LÍ®EÍ®>Í®7Í®0Í®)Í®"ͮͮͮ ͮͮÿÌ®øÌ®ñÌ®êÌ®ãÌ®ÜÌ®ÕÌ®ÎÌ®ÇÌ®ÀÌ®¹Ì®²Ì®«Ì®¤Ì®Ì®–̮̮ˆÌ®Ì®zÌ®sÌ®lÌ®eÌ®^Ì®WÌ®PÌ®IÌ®BÌ®;Ì®4Ì®-Ì®&̮̮̮̮ ̮̮üË®õË®îË®çË®àË®ÙË®ÒË®ËË®ÄË®½Ë®¶Ë®¯Ë®¨Ë®¡Ë®šË®“Ë®ŒË®…Ë®~Ë®wË®pË®iË®bË®[Ë®TË®MË®FË®?Ë®8Ë®1Ë®*Ë®#ˮˮˮˮˮˮùÊ®òÊ®ëÊ®äÊ®ÝÊ®ÖÊ®ÏÊ®ÈÊ®ÁÊ®ºÊ®³Ê®¬Ê®¥Ê®žÊ®—ʮʮ‰Ê®‚Ê®{Ê®tÊ®mÊ®fÊ®_Ê®XÊ®QÊ®JÊ®CÊ®<Ê®5Ê®.Ê®'Ê® ʮʮʮ ʮʮýÉ®öÉ®ïÉ®èÉ®áÉ®ÚÉ®ÓÉ®ÌÉ®ÅÉ®¾É®·É®°É®©É®¢É®›É®”ɮɮ†É®É®xÉ®qÉ®jÉ®cÉ®\É®UÉ®NÉ®GÉ®@É®9É®2É®+É®$ɮɮɮɮɮɮúÈ®óÈ®ìÈ®åÈ®ÞÈ®×È®ÐÈ®ÉÈ®ÂÈ®»È®´È®­È®¦È®ŸÈ®˜È®‘È®ŠÈ®ƒÈ®|È®uÈ®nÈ®gÈ®`È®YÈ®RÈ®KÈ®DÈ®=È®6È®/È®(È®!ȮȮȮ ȮȮþÇ®÷Ç®ðÇ®éÇ®âÇ®ÛÇ®ÔÇ®ÍÇ®ÆÇ®¿Ç®¸Ç®±Ç®ªÇ®£Ç®œÇ®•Ç®ŽÇ®‡Ç®€Ç®yÇ®rÇ®kÇ®dÇ®]Ç®VÇ®OÇ®HÇ®AÇ®:Ç®3Ç®,Ç®%ǮǮǮǮ ǮǮûÆ®ôÆ®íÆ®æÆ®߯®ØÆ®ÑÆ®ÊÆ®ÃÆ®¼Æ®µÆ®®Æ®§Æ® Æ®™Æ®’Æ®‹Æ®„Æ®}Æ®vÆ®oÆ®hÆ®aÆ®ZÆ®SÆ®LÆ®EÆ®>Æ®7Æ®0Æ®)Æ®"ƮƮƮ ƮƮÿÅ®øÅ®ñÅ®êÅ®ãÅ®ÜÅ®ÕÅ®ÎÅ®ÇÅ®ÀÅ®¹Å®²Å®«Å®¤Å®Å®–ŮŮˆÅ®Å®zÅ®sÅ®lÅ®eÅ®^Å®WÅ®PÅ®IÅ®BÅ®;Å®4Å®-Å®&ŮŮŮŮ ŮŮüÄ®õÄ®îÄ®çÄ®àÄ®ÙÄ®ÒÄ®ËÄ®ÄÄ®½Ä®¶Ä®¯Ä®¨Ä®¡Ä®šÄ®“Ä®ŒÄ®…Ä®~Ä®wÄ®pÄ®iÄ®bÄ®[Ä®TÄ®MÄ®FÄ®?Ä®8Ä®1Ä®*Ä®#ĮĮĮĮĮĮùîòîëîäîÝîÖîÏîÈîÁîºÃ®³Ã®¬Ã®¥Ã®žÃ®—îî‰Ã®‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîý®ö®ï®è®á®Ú®Ó®Ì®Å®¾Â®·Â®°Â®©Â®¢Â®›Â®”®®†Â®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®úÁ®óÁ®ìÁ®åÁ®ÞÁ®×Á®ÐÁ®ÉÁ®ÂÁ®»Á®´Á®­Á®¦Á®ŸÁ®˜Á®‘Á®ŠÁ®ƒÁ®|Á®uÁ®nÁ®gÁ®`Á®YÁ®RÁ®KÁ®DÁ®=Á®6Á®/Á®(Á®!Á®Á®Á® Á®Á®þÀ®÷À®ðÀ®éÀ®âÀ®ÛÀ®ÔÀ®ÍÀ®ÆÀ®¿À®¸À®±À®ªÀ®£À®œÀ®•À®ŽÀ®‡À®€À®yÀ®rÀ®kÀ®dÀ®]À®VÀ®OÀ®HÀ®AÀ®:À®3À®,À®%À®À®À®À® À®À®û¿®ô¿®í¿®æ¿®ß¿®Ø¿®Ñ¿®Ê¿®ÿ®¼¿®µ¿®®¿®§¿® ¿®™¿®’¿®‹¿®„¿®}¿®v¿®o¿®h¿®a¿®Z¿®S¿®L¿®E¿®>¿®7¿®0¿®)¿®"¿®¿®¿® ¿®¿®ÿ¾®ø¾®ñ¾®ê¾®ã¾®ܾ®Õ¾®ξ®Ǿ®À¾®¹¾®²¾®«¾®¤¾®¾®–¾®¾®ˆ¾®¾®z¾®s¾®l¾®e¾®^¾®W¾®P¾®I¾®B¾®;¾®4¾®-¾®&¾®¾®¾®¾® ¾®¾®ü½®õ½®î½®ç½®཮Ù½®Ò½®˽®Ľ®½½®¶½®¯½®¨½®¡½®š½®“½®Œ½®…½®~½®w½®p½®i½®b½®[½®T½®M½®F½®?½®8½®1½®*½®#½®½®½®½®½®½®ù¼®ò¼®ë¼®ä¼®ݼ®Ö¼®ϼ®ȼ®Á¼®º¼®³¼®¬¼®¥¼®ž¼®—¼®¼®‰¼®‚¼®{¼®t¼®m¼®f¼®_¼®X¼®Q¼®J¼®C¼®<¼®5¼®.¼®'¼® ¼®¼®¼® ¼®¼®ý»®ö»®ï»®è»®á»®Ú»®Ó»®Ì»®Å»®¾»®·»®°»®©»®¢»®›»®”»®»®†»®»®x»®q»®j»®c»®\»®U»®N»®G»®@»®9»®2»®+»®$»®»®»®»®»®»®úº®óº®캮庮Þº®׺®к®ɺ®º®»º®´º®­º®¦º®Ÿº®˜º®‘º®Šº®ƒº®|º®uº®nº®gº®`º®Yº®Rº®Kº®Dº®=º®6º®/º®(º®!º®º®º® º®º®þ¹®÷¹®ð¹®é¹®â¹®Û¹®Ô¹®͹®ƹ®¿¹®¸¹®±¹®ª¹®£¹®œ¹®•¹®޹®‡¹®€¹®y¹®r¹®k¹®d¹®]¹®V¹®O¹®H¹®A¹®:¹®3¹®,¹®%¹®¹®¹®¹® ¹®¹®û¸®ô¸®í¸®渮߸®ظ®Ѹ®ʸ®ø®¼¸®µ¸®®¸®§¸® ¸®™¸®’¸®‹¸®„¸®}¸®v¸®o¸®h¸®a¸®Z¸®S¸®L¸®E¸®>¸®7¸®0¸®)¸®"¸®¸®¸® ¸®¸®ÿ·®ø·®ñ·®ê·®ã·®Ü·®Õ·®η®Ç·®À·®¹·®²·®«·®¤·®·®–·®·®ˆ·®·®z·®s·®l·®e·®^·®W·®P·®I·®B·®;·®4·®-·®&·®·®·®·® ·®·®ü¶®õ¶®î¶®ç¶®à¶®Ù¶®Ò¶®˶®Ķ®½¶®¶¶®¯¶®¨¶®¡¶®š¶®“¶®Œ¶®…¶®~¶®w¶®p¶®i¶®b¶®[¶®T¶®M¶®F¶®?¶®8¶®1¶®*¶®#¶®¶®¶®¶®¶®¶®ùµ®òµ®ëµ®äµ®ݵ®Öµ®ϵ®ȵ®Áµ®ºµ®³µ®¬µ®¥µ®žµ®—µ®µ®‰µ®‚µ®{µ®tµ®mµ®fµ®_µ®Xµ®Qµ®Jµ®Cµ®<µ®5µ®.µ®'µ® µ®µ®µ® µ®µ®ý´®ö´®ï´®è´®á´®Ú´®Ó´®Ì´®Å´®¾´®·´®°´®©´®¢´®›´®”´®´®†´®´®x´®q´®j´®c´®\´®U´®N´®G´®@´®9´®2´®+´®$´®´®´®´®´®´®ú³®ó³®ì³®å³®Þ³®׳®г®ɳ®³®»³®´³®­³®¦³®Ÿ³®˜³®‘³®г®ƒ³®|³®u³®n³®g³®`³®Y³®R³®K³®D³®=³®6³®/³®(³®!³®³®³® ³®³®þ²®÷²®ð²®é²®â²®Û²®Ô²®Ͳ®Ʋ®¿²®¸²®±²®ª²®£²®œ²®•²®޲®‡²®€²®y²®r²®k²®d²®]²®V²®O²®H²®A²®:²®3²®,²®%²®²®²®²® ²®²®û±®ô±®í±®æ±®ß±®ر®ѱ®ʱ®ñ®¼±®µ±®®±®§±® ±®™±®’±®‹±®„±®}±®v±®o±®h±®a±®Z±®S±®L±®E±®>±®7±®0±®)±®"±®±®±® ±®±®ÿ°®ø°®ñ°®ê°®ã°®ܰ®Õ°®ΰ®ǰ®À°®¹°®²°®«°®¤°®°®–°®°®ˆ°®°®z°®s°®l°®e°®^°®W°®P°®I°®B°®;°®4°®-°®&°®°®°®°® °®°®ü¯®õ¯®篮௮Ù¯®Ò¯®˯®į®½¯®¶¯®¯¯®¨¯®¡¯®š¯®“¯®Œ¯®…¯®~¯®w¯®p¯®i¯®b¯®[¯®T¯®M¯®F¯®?¯®8¯®1¯®*¯®#¯®¯®¯®¯®¯®¯®ù®®ò®®ë®®ä®®Ý®®Ö®®Ï®®È®®Á®®º®®³®®¬®®¥®®ž®®—®®®®‰®®‚®®{®®t®®m®®f®®_®®X®®Q®®J®®C®®<®®5®®.®®'®® ®®®®®® ®®®®ý­®ö­®ï­®è­®á­®Ú­®Ó­®Ì­®Å­®¾­®·­®°­®©­®¢­®›­®”­®­®†­®­®x­®q­®j­®c­®\­®U­®N­®G­®@­®9­®2­®+­®$­®­®­®­®­®­®ú¬®ó¬®쬮嬮Þ¬®׬®Ь®ɬ®¬®»¬®´¬®­¬®¦¬®Ÿ¬®˜¬®‘¬®Ь®ƒ¬®|¬®u¬®n¬®g¬®`¬®Y¬®R¬®K¬®D¬®=¬®6¬®/¬®(¬®!¬®¬®¬® ¬®¬®þ«®÷«®ð«®é«®â«®Û«®Ô«®Í«®Æ«®¿«®¸«®±«®ª«®£«®œ«®•«®Ž«®‡«®€«®y«®r«®k«®d«®]«®V«®O«®H«®A«®:«®3«®,«®%«®«®«®«® «®«®ûª®ôª®íª®檮ߪ®ت®Ѫ®ʪ®ê®¼ª®µª®®ª®§ª® ª®™ª®’ª®‹ª®„ª®}ª®vª®oª®hª®aª®Zª®Sª®Lª®Eª®>ª®7ª®0ª®)ª®"ª®ª®ª® ª®ª®ÿ©®ø©®ñ©®ê©®ã©®Ü©®Õ©®Ω®Ç©®À©®¹©®²©®«©®¤©®©®–©®©®ˆ©®©®z©®s©®l©®e©®^©®W©®P©®I©®B©®;©®4©®-©®&©®©®©®©® ©®©®ü¨®õ¨®種ਮÙ¨®Ò¨®˨®Ĩ®½¨®¶¨®¯¨®¨¨®¡¨®š¨®“¨®Œ¨®…¨®~¨®w¨®p¨®i¨®b¨®[¨®T¨®M¨®F¨®?¨®8¨®1¨®*¨®#¨®¨®¨®¨®¨®¨®ù§®ò§®ë§®ä§®ݧ®Ö§®ϧ®ȧ®Á§®º§®³§®¬§®¥§®ž§®—§®§®‰§®‚§®{§®t§®m§®f§®_§®X§®Q§®J§®C§®<§®5§®.§®'§® §®§®§® §®§®ý¦®ö¦®瑩覮᦮Ú¦®Ó¦®̦®Ŧ®¾¦®·¦®°¦®©¦®¢¦®›¦®”¦®¦®†¦®¦®x¦®q¦®j¦®c¦®\¦®U¦®N¦®G¦®@¦®9¦®2¦®+¦®$¦®¦®¦®¦®¦®¦®ú¥®ó¥®쥮奮Þ¥®×¥®Ð¥®É¥®Â¥®»¥®´¥®­¥®¦¥®Ÿ¥®˜¥®‘¥®Š¥®ƒ¥®|¥®u¥®n¥®g¥®`¥®Y¥®R¥®K¥®D¥®=¥®6¥®/¥®(¥®!¥®¥®¥® ¥®¥®þ¤®÷¤®ð¤®餮⤮Û¤®Ô¤®ͤ®Ƥ®¿¤®¸¤®±¤®ª¤®£¤®œ¤®•¤®ޤ®‡¤®€¤®y¤®r¤®k¤®d¤®]¤®V¤®O¤®H¤®A¤®:¤®3¤®,¤®%¤®¤®¤®¤® ¤®¤®û£®ô£®í£®森ߣ®Ø£®Ñ£®Ê£®ã®¼£®µ£®®£®§£® £®™£®’£®‹£®„£®}£®v£®o£®h£®a£®Z£®S£®L£®E£®>£®7£®0£®)£®"£®£®£® £®£®ÿ¢®ø¢®ñ¢®ꢮ㢮Ü¢®Õ¢®΢®Ç¢®À¢®¹¢®²¢®«¢®¤¢®¢®–¢®¢®ˆ¢®¢®z¢®s¢®l¢®e¢®^¢®W¢®P¢®I¢®B¢®;¢®4¢®-¢®&¢®¢®¢®¢® ¢®¢®ü¡®õ¡®î¡®ç¡®à¡®Ù¡®Ò¡®Ë¡®Ä¡®½¡®¶¡®¯¡®¨¡®¡¡®š¡®“¡®Œ¡®…¡®~¡®w¡®p¡®i¡®b¡®[¡®T¡®M¡®F¡®?¡®8¡®1¡®*¡®#¡®¡®¡®¡®¡®¡®ù ®ò ®ë ®ä ®Ý ®Ö ®Ï ®È ®Á ®º ®³ ®¬ ®¥ ®ž ®— ® ®‰ ®‚ ®{ ®t ®m ®f ®_ ®X ®Q ®J ®C ®< ®5 ®. ®' ®  ® ® ®  ® ®ýŸ®öŸ®蟮៮ÚŸ®ÓŸ®ÌŸ®ÅŸ®¾Ÿ®·Ÿ®°Ÿ®©Ÿ®¢Ÿ®›Ÿ®”Ÿ®Ÿ®†Ÿ®Ÿ®xŸ®qŸ®jŸ®cŸ®\Ÿ®UŸ®NŸ®GŸ®@Ÿ®9Ÿ®2Ÿ®+Ÿ®$Ÿ®Ÿ®Ÿ®Ÿ®Ÿ®Ÿ®úž®óž®ìž®åž®Þž®מ®О®Éž®ž®»ž®´ž®­ž®¦ž®Ÿž®˜ž®‘ž®Šž®ƒž®|ž®už®nž®gž®`ž®Yž®Rž®Kž®Dž®=ž®6ž®/ž®(ž®!ž®ž®ž® ž®ž®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®ûœ®ôœ®휮朮ßœ®Øœ®Ñœ®Êœ®Ü®¼œ®µœ®®œ®§œ® œ®™œ®’œ®‹œ®„œ®}œ®vœ®oœ®hœ®aœ®Zœ®Sœ®Lœ®Eœ®>œ®7œ®0œ®)œ®"œ®œ®œ® œ®œ®ÿ›®ø›®ñ›®ê›®ã›®Ü›®Õ›®Λ®Ç›®À›®¹›®²›®«›®¤›®›®–›®›®ˆ›®›®z›®s›®l›®e›®^›®W›®P›®I›®B›®;›®4›®-›®&›®›®›®›® ›®›®üš®õš®îš®çš®àš®Ùš®Òš®Ëš®Äš®½š®¶š®¯š®¨š®¡š®šš®“š®Œš®…š®~š®wš®pš®iš®bš®[š®Tš®Mš®Fš®?š®8š®1š®*š®#š®š®š®š®š®š®ù™®ò™®ë™®ä™®Ý™®Ö™®Ï™®È™®Á™®º™®³™®¬™®¥™®ž™®—™®™®‰™®‚™®{™®t™®m™®f™®_™®X™®Q™®J™®C™®<™®5™®.™®'™® ™®™®™® ™®™®ý˜®ö˜®蘮ᘮÚ˜®Ó˜®̘®Ř®¾˜®·˜®°˜®©˜®¢˜®›˜®”˜®˜®†˜®˜®x˜®q˜®j˜®c˜®\˜®U˜®N˜®G˜®@˜®9˜®2˜®+˜®$˜®˜®˜®˜®˜®˜®ú—®ó—®ì—®å—®Þ—®×—®З®É—®—®»—®´—®­—®¦—®Ÿ—®˜—®‘—®Š—®ƒ—®|—®u—®n—®g—®`—®Y—®R—®K—®D—®=—®6—®/—®(—®!—®—®—® —®—®þ–®÷–®ð–®é–®â–®Û–®Ô–®Í–®Æ–®¿–®¸–®±–®ª–®£–®œ–®•–®Ž–®‡–®€–®y–®r–®k–®d–®]–®V–®O–®H–®A–®:–®3–®,–®%–®–®–®–® –®–®û•®ô•®í•®æ•®ß•®Ø•®Ñ•®Ê•®Õ®¼•®µ•®®•®§•® •®™•®’•®‹•®„•®}•®v•®o•®h•®a•®Z•®S•®L•®E•®>•®7•®0•®)•®"•®•®•® •®•®ÿ”®ø”®ñ”®ê”®ã”®Ü”®Õ”®Δ®Ç”®À”®¹”®²”®«”®¤”®”®–”®”®ˆ”®”®z”®s”®l”®e”®^”®W”®P”®I”®B”®;”®4”®-”®&”®”®”®”® ”®”®ü“®õ“®î“®ç“®à“®Ù“®Ò“®Ë“®Ä“®½“®¶“®¯“®¨“®¡“®š“®““®Œ“®…“®~“®w“®p“®i“®b“®[“®T“®M“®F“®?“®8“®1“®*“®#“®“®“®“®“®“®ù’®ò’®ë’®ä’®Ý’®Ö’®Ï’®È’®Á’®º’®³’®¬’®¥’®ž’®—’®’®‰’®‚’®{’®t’®m’®f’®_’®X’®Q’®J’®C’®<’®5’®.’®'’® ’®’®’® ’®’®ý‘®ö‘®ï‘®è‘®á‘®Ú‘®Ó‘®Ì‘®Å‘®¾‘®·‘®°‘®©‘®¢‘®›‘®”‘®‘®†‘®‘®x‘®q‘®j‘®c‘®\‘®U‘®N‘®G‘®@‘®9‘®2‘®+‘®$‘®‘®‘®‘®‘®‘®ú®ó®ì®å®Þ®×®ЮÉ®®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®ûŽ®ôŽ®펮掮ߎ®ØŽ®ÑŽ®ÊŽ®ÃŽ®¼Ž®µŽ®®Ž®§Ž® Ž®™Ž®’Ž®‹Ž®„Ž®}Ž®vŽ®oŽ®hŽ®aŽ®ZŽ®SŽ®LŽ®EŽ®>Ž®7Ž®0Ž®)Ž®"ޮޮޮ ޮޮÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®üŒ®õŒ®献àŒ®ÙŒ®ÒŒ®ËŒ®ÄŒ®½Œ®¶Œ®¯Œ®¨Œ®¡Œ®šŒ®“Œ®ŒŒ®…Œ®~Œ®wŒ®pŒ®iŒ®bŒ®[Œ®TŒ®MŒ®FŒ®?Œ®8Œ®1Œ®*Œ®#Œ®Œ®Œ®Œ®Œ®Œ®ù‹®ò‹®ë‹®ä‹®Ý‹®Ö‹®Ï‹®È‹®Á‹®º‹®³‹®¬‹®¥‹®ž‹®—‹®‹®‰‹®‚‹®{‹®t‹®m‹®f‹®_‹®X‹®Q‹®J‹®C‹®<‹®5‹®.‹®'‹® ‹®‹®‹® ‹®‹®ýŠ®öŠ®芮ኮÚŠ®ÓŠ®ÌŠ®ÅŠ®¾Š®·Š®°Š®©Š®¢Š®›Š®”ЮЮ†Š®Š®xŠ®qŠ®jŠ®cŠ®\Š®UŠ®NŠ®GŠ®@Š®9Š®2Š®+Š®$ЮЮЮЮЮЮú‰®ó‰®쉮剮Þ‰®׉®Љ®ɉ®‰®»‰®´‰®­‰®¦‰®Ÿ‰®˜‰®‘‰®Љ®ƒ‰®|‰®u‰®n‰®g‰®`‰®Y‰®R‰®K‰®D‰®=‰®6‰®/‰®(‰®!‰®‰®‰® ‰®‰®þˆ®÷ˆ®ðˆ®鈮∮Ûˆ®Ôˆ®͈®ƈ®¿ˆ®¸ˆ®±ˆ®ªˆ®£ˆ®œˆ®•ˆ®Žˆ®‡ˆ®€ˆ®yˆ®rˆ®kˆ®dˆ®]ˆ®Vˆ®Oˆ®Hˆ®Aˆ®:ˆ®3ˆ®,ˆ®%ˆ®ˆ®ˆ®ˆ® ˆ®ˆ®û‡®ô‡®퇮懮߇®؇®ч®ʇ®Ç®¼‡®µ‡®®‡®§‡® ‡®™‡®’‡®‹‡®„‡®}‡®v‡®o‡®h‡®a‡®Z‡®S‡®L‡®E‡®>‡®7‡®0‡®)‡®"‡®‡®‡® ‡®‡®ÿ†®ø†®ñ†®ꆮㆮ܆®Õ†®Ά®dž®À†®¹†®²†®«†®¤†®†®–†®†®ˆ†®†®z†®s†®l†®e†®^†®W†®P†®I†®B†®;†®4†®-†®&†®†®†®†® †®†®ü…®õ…®î…®ç…®à…®Ù…®Ò…®Ë…®Ä…®½…®¶…®¯…®¨…®¡…®š…®“…®Œ…®……®~…®w…®p…®i…®b…®[…®T…®M…®F…®?…®8…®1…®*…®#…®…®…®…®…®…®ù„®ò„®ë„®ä„®Ý„®Ö„®Ï„®È„®Á„®º„®³„®¬„®¥„®ž„®—„®„®‰„®‚„®{„®t„®m„®f„®_„®X„®Q„®J„®C„®<„®5„®.„®'„® „®„®„® „®„®ýƒ®öƒ®胮ხÚƒ®Óƒ®̃®Ń®¾ƒ®·ƒ®°ƒ®©ƒ®¢ƒ®›ƒ®”ƒ®ƒ®†ƒ®ƒ®xƒ®qƒ®jƒ®cƒ®\ƒ®Uƒ®Nƒ®Gƒ®@ƒ®9ƒ®2ƒ®+ƒ®$ƒ®ƒ®ƒ®ƒ®ƒ®ƒ®ú‚®ó‚®ì‚®å‚®Þ‚®ׂ®Ђ®É‚®‚®»‚®´‚®­‚®¦‚®Ÿ‚®˜‚®‘‚®Š‚®ƒ‚®|‚®u‚®n‚®g‚®`‚®Y‚®R‚®K‚®D‚®=‚®6‚®/‚®(‚®!‚®‚®‚® ‚®‚®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û€®ô€®퀮怮߀®Ø€®Ñ€®Ê€®À®¼€®µ€®®€®§€® €®™€®’€®‹€®„€®}€®v€®o€®h€®a€®Z€®S€®L€®E€®>€®7€®0€®)€®"€®€®€® €®€®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü~®õ~®î~®ç~®à~®Ù~®Ò~®Ë~®Ä~®½~®¶~®¯~®¨~®¡~®š~®“~®Œ~®…~®~~®w~®p~®i~®b~®[~®T~®M~®F~®?~®8~®1~®*~®#~®~®~®~®~®~®ù}®ò}®ë}®ä}®Ý}®Ö}®Ï}®È}®Á}®º}®³}®¬}®¥}®ž}®—}®}®‰}®‚}®{}®t}®m}®f}®_}®X}®Q}®J}®C}®<}®5}®.}®'}® }®}®}® }®}®ý|®ö|®ï|®è|®á|®Ú|®Ó|®Ì|®Å|®¾|®·|®°|®©|®¢|®›|®”|®|®†|®|®x|®q|®j|®c|®\|®U|®N|®G|®@|®9|®2|®+|®$|®|®|®|®|®|®ú{®ó{®ì{®å{®Þ{®×{®Ð{®É{®Â{®»{®´{®­{®¦{®Ÿ{®˜{®‘{®Š{®ƒ{®|{®u{®n{®g{®`{®Y{®R{®K{®D{®={®6{®/{®({®!{®{®{® {®{®þz®÷z®ðz®éz®âz®Ûz®Ôz®Íz®Æz®¿z®¸z®±z®ªz®£z®œz®•z®Žz®‡z®€z®yz®rz®kz®dz®]z®Vz®Oz®Hz®Az®:z®3z®,z®%z®z®z®z® z®z®ûy®ôy®íy®æy®ßy®Øy®Ñy®Êy®Ãy®¼y®µy®®y®§y® y®™y®’y®‹y®„y®}y®vy®oy®hy®ay®Zy®Sy®Ly®Ey®>y®7y®0y®)y®"y®y®y® y®y®ÿx®øx®ñx®êx®ãx®Üx®Õx®Îx®Çx®Àx®¹x®²x®«x®¤x®x®–x®x®ˆx®x®zx®sx®lx®ex®^x®Wx®Px®Ix®Bx®;x®4x®-x®&x®x®x®x® x®x®üw®õw®îw®çw®àw®Ùw®Òw®Ëw®Äw®½w®¶w®¯w®¨w®¡w®šw®“w®Œw®…w®~w®ww®pw®iw®bw®[w®Tw®Mw®Fw®?w®8w®1w®*w®#w®w®w®w®w®w®ùv®òv®ëv®äv®Ýv®Öv®Ïv®Èv®Áv®ºv®³v®¬v®¥v®žv®—v®v®‰v®‚v®{v®tv®mv®fv®_v®Xv®Qv®Jv®Cv®r®7r®0r®)r®"r®r®r® r®r®ÿq®øq®ñq®êq®ãq®Üq®Õq®Îq®Çq®Àq®¹q®²q®«q®¤q®q®–q®q®ˆq®q®zq®sq®lq®eq®^q®Wq®Pq®Iq®Bq®;q®4q®-q®&q®q®q®q® q®q®üp®õp®îp®çp®àp®Ùp®Òp®Ëp®Äp®½p®¶p®¯p®¨p®¡p®šp®“p®Œp®…p®~p®wp®pp®ip®bp®[p®Tp®Mp®Fp®?p®8p®1p®*p®#p®p®p®p®p®p®ùo®òo®ëo®äo®Ýo®Öo®Ïo®Èo®Áo®ºo®³o®¬o®¥o®žo®—o®o®‰o®‚o®{o®to®mo®fo®_o®Xo®Qo®Jo®Co®k®7k®0k®)k®"k®k®k® k®k®ÿj®øj®ñj®êj®ãj®Üj®Õj®Îj®Çj®Àj®¹j®²j®«j®¤j®j®–j®j®ˆj®j®zj®sj®lj®ej®^j®Wj®Pj®Ij®Bj®;j®4j®-j®&j®j®j®j® j®j®üi®õi®îi®çi®ài®Ùi®Òi®Ëi®Äi®½i®¶i®¯i®¨i®¡i®ši®“i®Œi®…i®~i®wi®pi®ii®bi®[i®Ti®Mi®Fi®?i®8i®1i®*i®#i®i®i®i®i®i®ùh®òh®ëh®äh®Ýh®Öh®Ïh®Èh®Áh®ºh®³h®¬h®¥h®žh®—h®h®‰h®‚h®{h®th®mh®fh®_h®Xh®Qh®Jh®Ch®d®7d®0d®)d®"d®d®d® d®d®ÿc®øc®ñc®êc®ãc®Üc®Õc®Îc®Çc®Àc®¹c®²c®«c®¤c®c®–c®c®ˆc®c®zc®sc®lc®ec®^c®Wc®Pc®Ic®Bc®;c®4c®-c®&c®c®c®c® c®c®üb®õb®îb®çb®àb®Ùb®Òb®Ëb®Äb®½b®¶b®¯b®¨b®¡b®šb®“b®Œb®…b®~b®wb®pb®ib®bb®[b®Tb®Mb®Fb®?b®8b®1b®*b®#b®b®b®b®b®b®ùa®òa®ëa®äa®Ýa®Öa®Ïa®Èa®Áa®ºa®³a®¬a®¥a®ža®—a®a®‰a®‚a®{a®ta®ma®fa®_a®Xa®Qa®Ja®Ca®]®7]®0]®)]®"]®]®]® ]®]®ÿ\®ø\®ñ\®ê\®ã\®Ü\®Õ\®Î\®Ç\®À\®¹\®²\®«\®¤\®\®–\®\®ˆ\®\®z\®s\®l\®e\®^\®W\®P\®I\®B\®;\®4\®-\®&\®\®\®\® \®\®ü[®õ[®î[®ç[®à[®Ù[®Ò[®Ë[®Ä[®½[®¶[®¯[®¨[®¡[®š[®“[®Œ[®…[®~[®w[®p[®i[®b[®[[®T[®M[®F[®?[®8[®1[®*[®#[®[®[®[®[®[®ùZ®òZ®ëZ®äZ®ÝZ®ÖZ®ÏZ®ÈZ®ÁZ®ºZ®³Z®¬Z®¥Z®žZ®—Z®Z®‰Z®‚Z®{Z®tZ®mZ®fZ®_Z®XZ®QZ®JZ®CZ®V®7V®0V®)V®"V®V®V® V®V®ÿU®øU®ñU®êU®ãU®ÜU®ÕU®ÎU®ÇU®ÀU®¹U®²U®«U®¤U®U®–U®U®ˆU®U®zU®sU®lU®eU®^U®WU®PU®IU®BU®;U®4U®-U®&U®U®U®U® U®U®üT®õT®îT®çT®àT®ÙT®ÒT®ËT®ÄT®½T®¶T®¯T®¨T®¡T®šT®“T®ŒT®…T®~T®wT®pT®iT®bT®[T®TT®MT®FT®?T®8T®1T®*T®#T®T®T®T®T®T®ùS®òS®ëS®äS®ÝS®ÖS®ÏS®ÈS®ÁS®ºS®³S®¬S®¥S®žS®—S®S®‰S®‚S®{S®tS®mS®fS®_S®XS®QS®JS®CS®O®7O®0O®)O®"O®O®O® O®O®ÿN®øN®ñN®êN®ãN®ÜN®ÕN®ÎN®ÇN®ÀN®¹N®²N®«N®¤N®N®–N®N®ˆN®N®zN®sN®lN®eN®^N®WN®PN®IN®BN®;N®4N®-N®&N®N®N®N® N®N®üM®õM®îM®çM®àM®ÙM®ÒM®ËM®ÄM®½M®¶M®¯M®¨M®¡M®šM®“M®ŒM®…M®~M®wM®pM®iM®bM®[M®TM®MM®FM®?M®8M®1M®*M®#M®M®M®M®M®M®ùL®òL®ëL®äL®ÝL®ÖL®ÏL®ÈL®ÁL®ºL®³L®¬L®¥L®žL®—L®L®‰L®‚L®{L®tL®mL®fL®_L®XL®QL®JL®CL®H®7H®0H®)H®"H®H®H® H®H®ÿG®øG®ñG®êG®ãG®ÜG®ÕG®ÎG®ÇG®ÀG®¹G®²G®«G®¤G®G®–G®G®ˆG®G®zG®sG®lG®eG®^G®WG®PG®IG®BG®;G®4G®-G®&G®G®G®G® G®G®üF®õF®îF®çF®àF®ÙF®ÒF®ËF®ÄF®½F®¶F®¯F®¨F®¡F®šF®“F®ŒF®…F®~F®wF®pF®iF®bF®[F®TF®MF®FF®?F®8F®1F®*F®#F®F®F®F®F®F®ùE®òE®ëE®äE®ÝE®ÖE®ÏE®ÈE®ÁE®ºE®³E®¬E®¥E®žE®—E®E®‰E®‚E®{E®tE®mE®fE®_E®XE®QE®JE®CE®A®7A®0A®)A®"A®A®A® A®A®ÿ@®ø@®ñ@®ê@®ã@®Ü@®Õ@®Î@®Ç@®À@®¹@®²@®«@®¤@®@®–@®@®ˆ@®@®z@®s@®l@®e@®^@®W@®P@®I@®B@®;@®4@®-@®&@®@®@®@® @®@®ü?®õ?®î?®ç?®à?®Ù?®Ò?®Ë?®Ä?®½?®¶?®¯?®¨?®¡?®š?®“?®Œ?®…?®~?®w?®p?®i?®b?®[?®T?®M?®F?®??®8?®1?®*?®#?®?®?®?®?®?®ù>®ò>®ë>®ä>®Ý>®Ö>®Ï>®È>®Á>®º>®³>®¬>®¥>®ž>®—>®>®‰>®‚>®{>®t>®m>®f>®_>®X>®Q>®J>®C>®<>®5>®.>®'>® >®>®>® >®>®ý=®ö=®ï=®è=®á=®Ú=®Ó=®Ì=®Å=®¾=®·=®°=®©=®¢=®›=®”=®=®†=®=®x=®q=®j=®c=®\=®U=®N=®G=®@=®9=®2=®+=®$=®=®=®=®=®=®ú<®ó<®ì<®å<®Þ<®×<®Ð<®É<®Â<®»<®´<®­<®¦<®Ÿ<®˜<®‘<®Š<®ƒ<®|<®u<®n<®g<®`<®Y<®R<®K<®D<®=<®6<®/<®(<®!<®<®<® <®<®þ;®÷;®ð;®é;®â;®Û;®Ô;®Í;®Æ;®¿;®¸;®±;®ª;®£;®œ;®•;®Ž;®‡;®€;®y;®r;®k;®d;®];®V;®O;®H;®A;®:;®3;®,;®%;®;®;®;® ;®;®û:®ô:®í:®æ:®ß:®Ø:®Ñ:®Ê:®Ã:®¼:®µ:®®:®§:® :®™:®’:®‹:®„:®}:®v:®o:®h:®a:®Z:®S:®L:®E:®>:®7:®0:®):®":®:®:® :®:®ÿ9®ø9®ñ9®ê9®ã9®Ü9®Õ9®Î9®Ç9®À9®¹9®²9®«9®¤9®9®–9®9®ˆ9®9®z9®s9®l9®e9®^9®W9®P9®I9®B9®;9®49®-9®&9®9®9®9® 9®9®ü8®õ8®î8®ç8®à8®Ù8®Ò8®Ë8®Ä8®½8®¶8®¯8®¨8®¡8®š8®“8®Œ8®…8®~8®w8®p8®i8®b8®[8®T8®M8®F8®?8®88®18®*8®#8®8®8®8®8®8®ù7®ò7®ë7®ä7®Ý7®Ö7®Ï7®È7®Á7®º7®³7®¬7®¥7®ž7®—7®7®‰7®‚7®{7®t7®m7®f7®_7®X7®Q7®J7®C7®<7®57®.7®'7® 7®7®7® 7®7®ý6®ö6®ï6®è6®á6®Ú6®Ó6®Ì6®Å6®¾6®·6®°6®©6®¢6®›6®”6®6®†6®6®x6®q6®j6®c6®\6®U6®N6®G6®@6®96®26®+6®$6®6®6®6®6®6®ú5®ó5®ì5®å5®Þ5®×5®Ð5®É5®Â5®»5®´5®­5®¦5®Ÿ5®˜5®‘5®Š5®ƒ5®|5®u5®n5®g5®`5®Y5®R5®K5®D5®=5®65®/5®(5®!5®5®5® 5®5®þ4®÷4®ð4®é4®â4®Û4®Ô4®Í4®Æ4®¿4®¸4®±4®ª4®£4®œ4®•4®Ž4®‡4®€4®y4®r4®k4®d4®]4®V4®O4®H4®A4®:4®34®,4®%4®4®4®4® 4®4®û3®ô3®í3®æ3®ß3®Ø3®Ñ3®Ê3®Ã3®¼3®µ3®®3®§3® 3®™3®’3®‹3®„3®}3®v3®o3®h3®a3®Z3®S3®L3®E3®>3®73®03®)3®"3®3®3® 3®3®ÿ2®ø2®ñ2®ê2®ã2®Ü2®Õ2®Î2®Ç2®À2®¹2®²2®«2®¤2®2®–2®2®ˆ2®2®z2®s2®l2®e2®^2®W2®P2®I2®B2®;2®42®-2®&2®2®2®2® 2®2®ü1®õ1®î1®ç1®à1®Ù1®Ò1®Ë1®Ä1®½1®¶1®¯1®¨1®¡1®š1®“1®Œ1®…1®~1®w1®p1®i1®b1®[1®T1®M1®F1®?1®81®11®*1®#1®1®1®1®1®1®ù0®ò0®ë0®ä0®Ý0®Ö0®Ï0®È0®Á0®º0®³0®¬0®¥0®ž0®—0®0®‰0®‚0®{0®t0®m0®f0®_0®X0®Q0®J0®C0®<0®50®.0®'0® 0®0®0® 0®0®ý/®ö/®ï/®è/®á/®Ú/®Ó/®Ì/®Å/®¾/®·/®°/®©/®¢/®›/®”/®/®†/®/®x/®q/®j/®c/®\/®U/®N/®G/®@/®9/®2/®+/®$/®/®/®/®/®/®ú.®ó.®ì.®å.®Þ.®×.®Ð.®É.®Â.®».®´.®­.®¦.®Ÿ.®˜.®‘.®Š.®ƒ.®|.®u.®n.®g.®`.®Y.®R.®K.®D.®=.®6.®/.®(.®!.®.®.® .®.®þ-®÷-®ð-®é-®â-®Û-®Ô-®Í-®Æ-®¿-®¸-®±-®ª-®£-®œ-®•-®Ž-®‡-®€-®y-®r-®k-®d-®]-®V-®O-®H-®A-®:-®3-®,-®%-®-®-®-® -®-®û,®ô,®í,®æ,®ß,®Ø,®Ñ,®Ê,®Ã,®¼,®µ,®®,®§,® ,®™,®’,®‹,®„,®},®v,®o,®h,®a,®Z,®S,®L,®E,®>,®7,®0,®),®",®,®,® ,®,®ÿ+®ø+®ñ+®ê+®ã+®Ü+®Õ+®Î+®Ç+®À+®¹+®²+®«+®¤+®+®–+®+®ˆ+®+®z+®s+®l+®e+®^+®W+®P+®I+®B+®;+®4+®-+®&+®+®+®+® +®+®ü*®õ*®î*®ç*®à*®Ù*®Ò*®Ë*®Ä*®½*®¶*®¯*®¨*®¡*®š*®“*®Œ*®…*®~*®w*®p*®i*®b*®[*®T*®M*®F*®?*®8*®1*®**®#*®*®*®*®*®*®ù)®ò)®ë)®ä)®Ý)®Ö)®Ï)®È)®Á)®º)®³)®¬)®¥)®ž)®—)®)®‰)®‚)®{)®t)®m)®f)®_)®X)®Q)®J)®C)®<)®5)®.)®')® )®)®)® )®)®ý(®ö(®ï(®è(®á(®Ú(®Ó(®Ì(®Å(®¾(®·(®°(®©(®¢(®›(®”(®(®†(®(®x(®q(®j(®c(®\(®U(®N(®G(®@(®9(®2(®+(®$(®(®(®(®(®(®ú'®ó'®ì'®å'®Þ'®×'®Ð'®É'®Â'®»'®´'®­'®¦'®Ÿ'®˜'®‘'®Š'®ƒ'®|'®u'®n'®g'®`'®Y'®R'®K'®D'®='®6'®/'®('®!'®'®'® '®'®þ&®÷&®ð&®é&®â&®Û&®Ô&®Í&®Æ&®¿&®¸&®±&®ª&®£&®œ&®•&®Ž&®‡&®€&®y&®r&®k&®d&®]&®V&®O&®H&®A&®:&®3&®,&®%&®&®&®&® &®&®û%®ô%®í%®æ%®ß%®Ø%®Ñ%®Ê%®Ã%®¼%®µ%®®%®§%® %®™%®’%®‹%®„%®}%®v%®o%®h%®a%®Z%®S%®L%®E%®>%®7%®0%®)%®"%®%®%® %®%®ÿ$®ø$®ñ$®ê$®ã$®Ü$®Õ$®Î$®Ç$®À$®¹$®²$®«$®¤$®$®–$®$®ˆ$®$®z$®s$®l$®e$®^$®W$®P$®I$®B$®;$®4$®-$®&$®$®$®$® $®$®ü#®õ#®î#®ç#®à#®Ù#®Ò#®Ë#®Ä#®½#®¶#®¯#®¨#®¡#®š#®“#®Œ#®…#®~#®w#®p#®i#®b#®[#®T#®M#®F#®?#®8#®1#®*#®##®#®#®#®#®#®ù"®ò"®ë"®ä"®Ý"®Ö"®Ï"®È"®Á"®º"®³"®¬"®¥"®ž"®—"®"®‰"®‚"®{"®t"®m"®f"®_"®X"®Q"®J"®C"®<"®5"®."®'"® "®"®"® "®"®ý!®ö!®ï!®è!®á!®Ú!®Ó!®Ì!®Å!®¾!®·!®°!®©!®¢!®›!®”!®!®†!®!®x!®q!®j!®c!®\!®U!®N!®G!®@!®9!®2!®+!®$!®!®!®!®!®!®ú ®ó ®ì ®å ®Þ ®× ®Ð ®É ® ®» ®´ ®­ ®¦ ®Ÿ ®˜ ®‘ ®Š ®ƒ ®| ®u ®n ®g ®` ®Y ®R ®K ®D ®= ®6 ®/ ®( ®! ® ® ® ® ®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û®ô®í®æ®ß®Ø®Ñ®Ê®Ã®¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú®ó®ì®å®Þ®×®Ð®É®Â®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û®ô®í®æ®ß®Ø®Ñ®Ê®Ã®¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú®ó®ì®å®Þ®×®Ð®É®Â®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û®ô®í®æ®ß®Ø®Ñ®Ê®Ã®¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù ®ò ®ë ®ä ®Ý ®Ö ®Ï ®È ®Á ®º ®³ ®¬ ®¥ ®ž ®— ® ®‰ ®‚ ®{ ®t ®m ®f ®_ ®X ®Q ®J ®C ®< ®5 ®. ®' ® ® ® ® ® ®ý ®ö ®ï ®è ®á ®Ú ®Ó ®Ì ®Å ®¾ ®· ®° ®© ®¢ ®› ®” ® ®† ® ®x ®q ®j ®c ®\ ®U ®N ®G ®@ ®9 ®2 ®+ ®$ ® ® ® ® ® ®ú ®ó ®ì ®å ®Þ ®× ®Ð ®É ® ®» ®´ ®­ ®¦ ®Ÿ ®˜ ®‘ ®Š ®ƒ ®| ®u ®n ®g ®` ®Y ®R ®K ®D ®= ®6 ®/ ®( ®! ® ® ® ® ®þ ®÷ ®ð ®é ®â ®Û ®Ô ®Í ®Æ ®¿ ®¸ ®± ®ª ®£ ®œ ®• ®Ž ®‡ ®€ ®y ®r ®k ®d ®] ®V ®O ®H ®A ®: ®3 ®, ®% ® ® ® ® ® ®û ®ô ®í ®æ ®ß ®Ø ®Ñ ®Ê ®à ®¼ ®µ ®® ®§ ®  ®™ ®’ ®‹ ®„ ®} ®v ®o ®h ®a ®Z ®S ®L ®E ®> ®7 ®0 ®) ®" ® ® ® ® ®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú®ó®ì®å®Þ®×®Ð®É®Â®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û®ô®í®æ®ß®Ø®Ñ®Ê®Ã®¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ®ø®ñ®ê®ã®Ü®Õ®Î®Ç®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ùÿ­òÿ­ëÿ­äÿ­Ýÿ­Öÿ­Ïÿ­Èÿ­Áÿ­ºÿ­³ÿ­¬ÿ­¥ÿ­žÿ­—ÿ­ÿ­‰ÿ­‚ÿ­{ÿ­tÿ­mÿ­fÿ­_ÿ­Xÿ­Qÿ­Jÿ­Cÿ­<ÿ­5ÿ­.ÿ­'ÿ­ ÿ­ÿ­ÿ­ ÿ­ÿ­ýþ­öþ­ïþ­èþ­áþ­Úþ­Óþ­Ìþ­Åþ­¾þ­·þ­°þ­©þ­¢þ­›þ­”þ­þ­†þ­þ­xþ­qþ­jþ­cþ­\þ­Uþ­Nþ­Gþ­@þ­9þ­2þ­+þ­$þ­þ­þ­þ­þ­þ­úý­óý­ìý­åý­Þý­×ý­Ðý­Éý­Âý­»ý­´ý­­ý­¦ý­Ÿý­˜ý­‘ý­Šý­ƒý­|ý­uý­ný­gý­`ý­Yý­Rý­Ký­Dý­=ý­6ý­/ý­(ý­!ý­ý­ý­ ý­ý­þü­÷ü­ðü­éü­âü­Ûü­Ôü­Íü­Æü­¿ü­¸ü­±ü­ªü­£ü­œü­•ü­Žü­‡ü­€ü­yü­rü­kü­dü­]ü­Vü­Oü­Hü­Aü­:ü­3ü­,ü­%ü­ü­ü­ü­ ü­ü­ûû­ôû­íû­æû­ßû­Øû­Ñû­Êû­Ãû­¼û­µû­®û­§û­ û­™û­’û­‹û­„û­}û­vû­oû­hû­aû­Zû­Sû­Lû­Eû­>û­7û­0û­)û­"û­û­û­ û­û­ÿú­øú­ñú­êú­ãú­Üú­Õú­Îú­Çú­Àú­¹ú­²ú­«ú­¤ú­ú­–ú­ú­ˆú­ú­zú­sú­lú­eú­^ú­Wú­Pú­Iú­Bú­;ú­4ú­-ú­&ú­ú­ú­ú­ ú­ú­üù­õù­îù­çù­àù­Ùù­Òù­Ëù­Äù­½ù­¶ù­¯ù­¨ù­¡ù­šù­“ù­Œù­…ù­~ù­wù­pù­iù­bù­[ù­Tù­Mù­Fù­?ù­8ù­1ù­*ù­#ù­ù­ù­ù­ù­ù­ùø­òø­ëø­äø­Ýø­Öø­Ïø­Èø­Áø­ºø­³ø­¬ø­¥ø­žø­—ø­ø­‰ø­‚ø­{ø­tø­mø­fø­_ø­Xø­Qø­Jø­Cø­<ø­5ø­.ø­'ø­ ø­ø­ø­ ø­ø­ý÷­ö÷­ï÷­è÷­á÷­Ú÷­Ó÷­Ì÷­Å÷­¾÷­·÷­°÷­©÷­¢÷­›÷­”÷­÷­†÷­÷­x÷­q÷­j÷­c÷­\÷­U÷­N÷­G÷­@÷­9÷­2÷­+÷­$÷­÷­÷­÷­÷­÷­úö­óö­ìö­åö­Þö­×ö­Ðö­Éö­Âö­»ö­´ö­­ö­¦ö­Ÿö­˜ö­‘ö­Šö­ƒö­|ö­uö­nö­gö­`ö­Yö­Rö­Kö­Dö­=ö­6ö­/ö­(ö­!ö­ö­ö­ ö­ö­þõ­÷õ­ðõ­éõ­âõ­Ûõ­Ôõ­Íõ­Æõ­¿õ­¸õ­±õ­ªõ­£õ­œõ­•õ­Žõ­‡õ­€õ­yõ­rõ­kõ­dõ­]õ­Võ­Oõ­Hõ­Aõ­:õ­3õ­,õ­%õ­õ­õ­õ­ õ­õ­ûô­ôô­íô­æô­ßô­Øô­Ñô­Êô­Ãô­¼ô­µô­®ô­§ô­ ô­™ô­’ô­‹ô­„ô­}ô­vô­oô­hô­aô­Zô­Sô­Lô­Eô­>ô­7ô­0ô­)ô­"ô­ô­ô­ ô­ô­ÿó­øó­ñó­êó­ãó­Üó­Õó­Îó­Çó­Àó­¹ó­²ó­«ó­¤ó­ó­–ó­ó­ˆó­ó­zó­só­ló­eó­^ó­Wó­Pó­Ió­Bó­;ó­4ó­-ó­&ó­ó­ó­ó­ ó­ó­üò­õò­îò­çò­àò­Ùò­Òò­Ëò­Äò­½ò­¶ò­¯ò­¨ò­¡ò­šò­“ò­Œò­…ò­~ò­wò­pò­iò­bò­[ò­Tò­Mò­Fò­?ò­8ò­1ò­*ò­#ò­ò­ò­ò­ò­ò­ùñ­òñ­ëñ­äñ­Ýñ­Öñ­Ïñ­Èñ­Áñ­ºñ­³ñ­¬ñ­¥ñ­žñ­—ñ­ñ­‰ñ­‚ñ­{ñ­tñ­mñ­fñ­_ñ­Xñ­Qñ­Jñ­Cñ­<ñ­5ñ­.ñ­'ñ­ ñ­ñ­ñ­ ñ­ñ­ýð­öð­ïð­èð­áð­Úð­Óð­Ìð­Åð­¾ð­·ð­°ð­©ð­¢ð­›ð­”ð­ð­†ð­ð­xð­qð­jð­cð­\ð­Uð­Nð­Gð­@ð­9ð­2ð­+ð­$ð­ð­ð­ð­ð­ð­úï­óï­ìï­åï­Þï­×ï­Ðï­Éï­Âﭻﭴﭭﭦﭟﭘﭑתּףּï­|ï­uï­nï­gï­`ï­Yï­Rï­Kï­Dï­=ï­6ï­/ï­(ï­!ï­ï­ï­ ï­ï­þî­÷î­ðî­éî­âî­Ûî­Ôî­Íî­Æî­¿î­¸î­±î­ªî­£î­œî­•î­Žî­‡î­€î­yî­rî­kî­dî­]î­Vî­Oî­Hî­Aî­:î­3î­,î­%î­î­î­î­ î­î­ûí­ôí­íí­æí­ßí­Øí­Ñí­Êí­Ãí­¼í­µí­®í­§í­ í­™í­’í­‹í­„í­}í­ví­oí­hí­aí­Zí­Sí­Lí­Eí­>í­7í­0í­)í­"í­í­í­ í­í­ÿì­øì­ñì­êì­ãì­Üì­Õì­Îì­Çì­À쭹쭲쭫쭤ì­ì­–ì­ì­ˆì­ì­zì­sì­lì­eì­^ì­Wì­Pì­Iì­Bì­;ì­4ì­-ì­&ì­ì­ì­ì­ ì­ì­üë­õë­îë­çë­àë­Ùë­Òë­Ëë­Ä뭽뭶뭯뭨뭡뭚뭓뭌뭅ë­~ë­wë­pë­ië­bë­[ë­Të­Më­Fë­?ë­8ë­1ë­*ë­#ë­ë­ë­ë­ë­ë­ùê­òê­ëê­äê­Ýê­Öê­Ïê­Èê­Áꭺꭳ꭬ꭥꭞꭗê­ê­‰ê­‚ê­{ê­tê­mê­fê­_ê­Xê­Qê­Jê­Cê­<ê­5ê­.ê­'ê­ ê­ê­ê­ ê­ê­ýé­öé­ïé­èé­áé­Úé­Óé­Ìé­Å魾魷魰魩魢魛魔é­é­†é­é­xé­qé­jé­cé­\é­Ué­Né­Gé­@é­9é­2é­+é­$é­é­é­é­é­é­úè­óè­ìè­åè­Þè­×è­Ðè­Éè­Â譻譴譭警譟識譑譊譃è­|è­uè­nè­gè­`è­Yè­Rè­Kè­Dè­=è­6è­/è­(è­!è­è­è­ è­è­þç­÷ç­ðç­éç­âç­Ûç­Ôç­Íç­Æç­¿ç­¸ç­±ç­ªç­£ç­œç­•ç­Žç­‡ç­€ç­yç­rç­kç­dç­]ç­Vç­Oç­Hç­Aç­:ç­3ç­,ç­%ç­ç­ç­ç­ ç­ç­ûæ­ôæ­íæ­ææ­ßæ­Øæ­Ñæ­Êæ­Ã歼歵歮歧歠歙歒歋歄æ­}æ­væ­oæ­hæ­aæ­Zæ­Sæ­Læ­Eæ­>æ­7æ­0æ­)æ­"æ­æ­æ­ æ­æ­ÿå­øå­ñå­êå­ãå­Üå­Õå­Îå­Çå­À孹孲孫孤å­å­–å­å­ˆå­å­zå­så­lå­eå­^å­Wå­På­Iå­Bå­;å­4å­-å­&å­å­å­å­ å­å­üä­õä­îä­çä­àä­Ùä­Òä­Ëä­Ä䭽䭶䭯䭨䭡䭚䭓䭌䭅ä­~ä­wä­pä­iä­bä­[ä­Tä­Mä­Fä­?ä­8ä­1ä­*ä­#ä­ä­ä­ä­ä­ä­ùã­òã­ëã­äã­Ýã­Öã­Ïã­Èã­Á㭺㭳㭬㭥㭞㭗ã­ã­‰ã­‚ã­{ã­tã­mã­fã­_ã­Xã­Qã­Jã­Cã­<ã­5ã­.ã­'ã­ ã­ã­ã­ ã­ã­ýâ­öâ­ïâ­èâ­áâ­Úâ­Óâ­Ìâ­Å⭾⭷⭰⭩⭢⭛⭔â­â­†â­â­xâ­qâ­jâ­câ­\â­Uâ­Nâ­Gâ­@â­9â­2â­+â­$â­â­â­â­â­â­úá­óá­ìá­åá­Þá­×á­Ðá­Éá­Â᭻᭴᭭᭦᭟᭘᭑ᭊᭃá­|á­uá­ná­gá­`á­Yá­Rá­Ká­Dá­=á­6á­/á­(á­!á­á­á­ á­á­þà­÷à­ðà­éà­âà­Ûà­Ôà­Íà­Æà­¿à­¸à­±à­ªà­£à­œà­•à­Žà­‡à­€à­yà­rà­kà­dà­]à­Và­Oà­Hà­Aà­:à­3à­,à­%à­à­à­à­ à­à­ûß­ôß­íß­æß­ßß­Øß­Ñß­Êß­Ãß­¼ß­µß­®ß­§ß­ ß­™ß­’ß­‹ß­„ß­}ß­vß­oß­hß­aß­Zß­Sß­Lß­Eß­>ß­7ß­0ß­)ß­"ß­ß­ß­ ß­ß­ÿÞ­øÞ­ñÞ­êÞ­ãÞ­ÜÞ­ÕÞ­ÎÞ­ÇÞ­ÀÞ­¹Þ­²Þ­«Þ­¤Þ­Þ­–Þ­Þ­ˆÞ­Þ­zÞ­sÞ­lÞ­eÞ­^Þ­WÞ­PÞ­IÞ­BÞ­;Þ­4Þ­-Þ­&Þ­Þ­Þ­Þ­ Þ­Þ­üÝ­õÝ­îÝ­çÝ­àÝ­ÙÝ­ÒÝ­ËÝ­ÄÝ­½Ý­¶Ý­¯Ý­¨Ý­¡Ý­šÝ­“Ý­ŒÝ­…Ý­~Ý­wÝ­pÝ­iÝ­bÝ­[Ý­TÝ­MÝ­FÝ­?Ý­8Ý­1Ý­*Ý­#Ý­Ý­Ý­Ý­Ý­Ý­ùÜ­òÜ­ëÜ­äÜ­ÝÜ­ÖÜ­ÏÜ­ÈÜ­ÁÜ­ºÜ­³Ü­¬Ü­¥Ü­žÜ­—Ü­Ü­‰Ü­‚Ü­{Ü­tÜ­mÜ­fÜ­_Ü­XÜ­QÜ­JÜ­CÜ­<Ü­5Ü­.Ü­'Ü­ Ü­Ü­Ü­ Ü­Ü­ýÛ­öÛ­ïÛ­èÛ­áÛ­ÚÛ­ÓÛ­ÌÛ­ÅÛ­¾Û­·Û­°Û­©Û­¢Û­›Û­”Û­Û­†Û­Û­xÛ­qÛ­jÛ­cÛ­\Û­UÛ­NÛ­GÛ­@Û­9Û­2Û­+Û­$Û­Û­Û­Û­Û­Û­úÚ­óÚ­ìÚ­åÚ­ÞÚ­×Ú­ÐÚ­ÉÚ­ÂÚ­»Ú­´Ú­­Ú­¦Ú­ŸÚ­˜Ú­‘Ú­ŠÚ­ƒÚ­|Ú­uÚ­nÚ­gÚ­`Ú­YÚ­RÚ­KÚ­DÚ­=Ú­6Ú­/Ú­(Ú­!Ú­Ú­Ú­ Ú­Ú­þÙ­÷Ù­ðÙ­éÙ­âÙ­ÛÙ­ÔÙ­ÍÙ­ÆÙ­¿Ù­¸Ù­±Ù­ªÙ­£Ù­œÙ­•Ù­ŽÙ­‡Ù­€Ù­yÙ­rÙ­kÙ­dÙ­]Ù­VÙ­OÙ­HÙ­AÙ­:Ù­3Ù­,Ù­%٭٭٭٭ ٭٭ûØ­ôØ­íØ­æØ­ߨ­ØØ­ÑØ­ÊØ­ÃØ­¼Ø­µØ­®Ø­§Ø­ Ø­™Ø­’Ø­‹Ø­„Ø­}Ø­vØ­oØ­hØ­aØ­ZØ­SØ­LØ­EØ­>Ø­7Ø­0Ø­)Ø­"ححح ححÿ×­ø×­ñ×­ê×­ã×­Ü×­Õ×­Î×­Ç×­À×­¹×­²×­«×­¤×­×­–×­×­ˆ×­×­z×­s×­l×­e×­^×­W×­P×­I×­B×­;×­4×­-×­&×­×­×­×­ ×­×­üÖ­õÖ­îÖ­çÖ­àÖ­ÙÖ­ÒÖ­ËÖ­ÄÖ­½Ö­¶Ö­¯Ö­¨Ö­¡Ö­šÖ­“Ö­ŒÖ­…Ö­~Ö­wÖ­pÖ­iÖ­bÖ­[Ö­TÖ­MÖ­FÖ­?Ö­8Ö­1Ö­*Ö­#Ö­Ö­Ö­Ö­Ö­Ö­ùÕ­òÕ­ëÕ­äÕ­ÝÕ­ÖÕ­ÏÕ­ÈÕ­ÁÕ­ºÕ­³Õ­¬Õ­¥Õ­žÕ­—Õ­Õ­‰Õ­‚Õ­{Õ­tÕ­mÕ­fÕ­_Õ­XÕ­QÕ­JÕ­CÕ­<Õ­5Õ­.Õ­'Õ­ Õ­Õ­Õ­ Õ­Õ­ýÔ­öÔ­ïÔ­èÔ­áÔ­ÚÔ­ÓÔ­ÌÔ­ÅÔ­¾Ô­·Ô­°Ô­©Ô­¢Ô­›Ô­”Ô­Ô­†Ô­Ô­xÔ­qÔ­jÔ­cÔ­\Ô­UÔ­NÔ­GÔ­@Ô­9Ô­2Ô­+Ô­$Ô­Ô­Ô­Ô­Ô­Ô­úÓ­óÓ­ìÓ­åÓ­ÞÓ­×Ó­ÐÓ­ÉÓ­ÂÓ­»Ó­´Ó­­Ó­¦Ó­ŸÓ­˜Ó­‘Ó­ŠÓ­ƒÓ­|Ó­uÓ­nÓ­gÓ­`Ó­YÓ­RÓ­KÓ­DÓ­=Ó­6Ó­/Ó­(Ó­!Ó­Ó­Ó­ Ó­Ó­þÒ­÷Ò­ðÒ­éÒ­âÒ­ÛÒ­ÔÒ­ÍÒ­ÆÒ­¿Ò­¸Ò­±Ò­ªÒ­£Ò­œÒ­•Ò­ŽÒ­‡Ò­€Ò­yÒ­rÒ­kÒ­dÒ­]Ò­VÒ­OÒ­HÒ­AÒ­:Ò­3Ò­,Ò­%Ò­Ò­Ò­Ò­ Ò­Ò­ûÑ­ôÑ­íÑ­æÑ­ßÑ­ØÑ­ÑÑ­ÊÑ­ÃÑ­¼Ñ­µÑ­®Ñ­§Ñ­ Ñ­™Ñ­’Ñ­‹Ñ­„Ñ­}Ñ­vÑ­oÑ­hÑ­aÑ­ZÑ­SÑ­LÑ­EÑ­>Ñ­7Ñ­0Ñ­)Ñ­"Ñ­Ñ­Ñ­ Ñ­Ñ­ÿЭøÐ­ñЭêЭãЭÜЭÕЭÎЭÇЭÀЭ¹Ð­²Ð­«Ð­¤Ð­Э–ЭЭˆÐ­ЭzЭsЭlЭeЭ^ЭWЭPЭIЭBЭ;Э4Э-Э&ЭЭЭЭ ЭЭüÏ­õÏ­îÏ­çÏ­àÏ­ÙÏ­ÒÏ­ËÏ­ÄÏ­½Ï­¶Ï­¯Ï­¨Ï­¡Ï­šÏ­“Ï­ŒÏ­…Ï­~Ï­wÏ­pÏ­iÏ­bÏ­[Ï­TÏ­MÏ­FÏ­?Ï­8Ï­1Ï­*Ï­#Ï­Ï­Ï­Ï­Ï­Ï­ùέòέëέäέÝέÖέÏέÈέÁέºÎ­³Î­¬Î­¥Î­žÎ­—έέ‰Î­‚έ{έtέmέfέ_έXέQέJέCέ<έ5έ.έ'έ έέέ έέýÍ­öÍ­ïÍ­èÍ­áÍ­ÚÍ­ÓÍ­ÌÍ­ÅÍ­¾Í­·Í­°Í­©Í­¢Í­›Í­”Í­Í­†Í­Í­xÍ­qÍ­jÍ­cÍ­\Í­UÍ­NÍ­GÍ­@Í­9Í­2Í­+Í­$Í­Í­Í­Í­Í­Í­úÌ­óÌ­ìÌ­åÌ­ÞÌ­×Ì­ÐÌ­ÉÌ­ÂÌ­»Ì­´Ì­­Ì­¦Ì­ŸÌ­˜Ì­‘Ì­ŠÌ­ƒÌ­|Ì­uÌ­nÌ­gÌ­`Ì­YÌ­RÌ­KÌ­DÌ­=Ì­6Ì­/Ì­(Ì­!Ì­Ì­Ì­ Ì­Ì­þË­÷Ë­ðË­éË­âË­ÛË­ÔË­ÍË­ÆË­¿Ë­¸Ë­±Ë­ªË­£Ë­œË­•Ë­ŽË­‡Ë­€Ë­yË­rË­kË­dË­]Ë­VË­OË­HË­AË­:Ë­3Ë­,Ë­%Ë­Ë­Ë­Ë­ Ë­Ë­ûÊ­ôÊ­íÊ­æÊ­ßÊ­ØÊ­ÑÊ­ÊÊ­ÃÊ­¼Ê­µÊ­®Ê­§Ê­ Ê­™Ê­’Ê­‹Ê­„Ê­}Ê­vÊ­oÊ­hÊ­aÊ­ZÊ­SÊ­LÊ­EÊ­>Ê­7Ê­0Ê­)Ê­"Ê­Ê­Ê­ Ê­Ê­ÿÉ­øÉ­ñÉ­êÉ­ãÉ­ÜÉ­ÕÉ­ÎÉ­ÇÉ­ÀÉ­¹É­²É­«É­¤É­É­–É­É­ˆÉ­É­zÉ­sÉ­lÉ­eÉ­^É­WÉ­PÉ­IÉ­BÉ­;É­4É­-É­&É­É­É­É­ É­É­üÈ­õÈ­îÈ­çÈ­àÈ­ÙÈ­ÒÈ­ËÈ­ÄÈ­½È­¶È­¯È­¨È­¡È­šÈ­“È­ŒÈ­…È­~È­wÈ­pÈ­iÈ­bÈ­[È­TÈ­MÈ­FÈ­?È­8È­1È­*È­#È­È­È­È­È­È­ùÇ­òÇ­ëÇ­äÇ­ÝÇ­ÖÇ­ÏÇ­ÈÇ­ÁÇ­ºÇ­³Ç­¬Ç­¥Ç­žÇ­—Ç­Ç­‰Ç­‚Ç­{Ç­tÇ­mÇ­fÇ­_Ç­XÇ­QÇ­JÇ­CÇ­<Ç­5Ç­.Ç­'Ç­ Ç­Ç­Ç­ Ç­Ç­ýÆ­öÆ­ïÆ­èÆ­áÆ­ÚÆ­ÓÆ­ÌÆ­ÅÆ­¾Æ­·Æ­°Æ­©Æ­¢Æ­›Æ­”Æ­Æ­†Æ­Æ­xÆ­qÆ­jÆ­cÆ­\Æ­UÆ­NÆ­GÆ­@Æ­9Æ­2Æ­+Æ­$Æ­Æ­Æ­Æ­Æ­Æ­úÅ­óÅ­ìÅ­åÅ­ÞÅ­×Å­ÐÅ­ÉÅ­ÂÅ­»Å­´Å­­Å­¦Å­ŸÅ­˜Å­‘Å­ŠÅ­ƒÅ­|Å­uÅ­nÅ­gÅ­`Å­YÅ­RÅ­KÅ­DÅ­=Å­6Å­/Å­(Å­!Å­Å­Å­ Å­Å­þÄ­÷Ä­ðÄ­éÄ­âÄ­ÛÄ­ÔÄ­ÍÄ­ÆÄ­¿Ä­¸Ä­±Ä­ªÄ­£Ä­œÄ­•Ä­ŽÄ­‡Ä­€Ä­yÄ­rÄ­kÄ­dÄ­]Ä­VÄ­OÄ­HÄ­AÄ­:Ä­3Ä­,Ä­%Ä­Ä­Ä­Ä­ Ä­Ä­ûíôíííæÃ­ßíØÃ­ÑíÊíÃí¼Ã­µÃ­®Ã­§Ã­ Ã­™Ã­’í‹Ã­„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿ­øÂ­ñ­ê­ã­Ü­Õ­έÇ­À­¹Â­²Â­«Â­¤Â­­–­­ˆÂ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­üÁ­õÁ­îÁ­çÁ­àÁ­ÙÁ­ÒÁ­ËÁ­ÄÁ­½Á­¶Á­¯Á­¨Á­¡Á­šÁ­“Á­ŒÁ­…Á­~Á­wÁ­pÁ­iÁ­bÁ­[Á­TÁ­MÁ­FÁ­?Á­8Á­1Á­*Á­#Á­Á­Á­Á­Á­Á­ùÀ­òÀ­ëÀ­äÀ­ÝÀ­ÖÀ­ÏÀ­ÈÀ­ÁÀ­ºÀ­³À­¬À­¥À­žÀ­—À­À­‰À­‚À­{À­tÀ­mÀ­fÀ­_À­XÀ­QÀ­JÀ­CÀ­<À­5À­.À­'À­ À­À­À­ À­À­ý¿­ö¿­ï¿­è¿­á¿­Ú¿­Ó¿­Ì¿­Å¿­¾¿­·¿­°¿­©¿­¢¿­›¿­”¿­¿­†¿­¿­x¿­q¿­j¿­c¿­\¿­U¿­N¿­G¿­@¿­9¿­2¿­+¿­$¿­¿­¿­¿­¿­¿­ú¾­ó¾­ì¾­å¾­Þ¾­×¾­о­ɾ­¾­»¾­´¾­­¾­¦¾­Ÿ¾­˜¾­‘¾­о­ƒ¾­|¾­u¾­n¾­g¾­`¾­Y¾­R¾­K¾­D¾­=¾­6¾­/¾­(¾­!¾­¾­¾­ ¾­¾­þ½­÷½­ð½­é½­â½­Û½­Ô½­ͽ­ƽ­¿½­¸½­±½­ª½­£½­œ½­•½­޽­‡½­€½­y½­r½­k½­d½­]½­V½­O½­H½­A½­:½­3½­,½­%½­½­½­½­ ½­½­û¼­ô¼­í¼­æ¼­ß¼­ؼ­Ѽ­ʼ­ü­¼¼­µ¼­®¼­§¼­ ¼­™¼­’¼­‹¼­„¼­}¼­v¼­o¼­h¼­a¼­Z¼­S¼­L¼­E¼­>¼­7¼­0¼­)¼­"¼­¼­¼­ ¼­¼­ÿ»­ø»­ñ»­ê»­ã»­Ü»­Õ»­λ­Ç»­À»­¹»­²»­«»­¤»­»­–»­»­ˆ»­»­z»­s»­l»­e»­^»­W»­P»­I»­B»­;»­4»­-»­&»­»­»­»­ »­»­üº­õº­纭ອÙº­Òº­˺­ĺ­½º­¶º­¯º­¨º­¡º­šº­“º­Œº­…º­~º­wº­pº­iº­bº­[º­Tº­Mº­Fº­?º­8º­1º­*º­#º­º­º­º­º­º­ù¹­ò¹­ë¹­ä¹­ݹ­Ö¹­Ϲ­ȹ­Á¹­º¹­³¹­¬¹­¥¹­ž¹­—¹­¹­‰¹­‚¹­{¹­t¹­m¹­f¹­_¹­X¹­Q¹­J¹­C¹­<¹­5¹­.¹­'¹­ ¹­¹­¹­ ¹­¹­ý¸­ö¸­︭踭ḭÚ¸­Ó¸­̸­Ÿ­¾¸­·¸­°¸­©¸­¢¸­›¸­”¸­¸­†¸­¸­x¸­q¸­j¸­c¸­\¸­U¸­N¸­G¸­@¸­9¸­2¸­+¸­$¸­¸­¸­¸­¸­¸­ú·­ó·­ì·­å·­Þ·­×·­з­É·­·­»·­´·­­·­¦·­Ÿ·­˜·­‘·­Š·­ƒ·­|·­u·­n·­g·­`·­Y·­R·­K·­D·­=·­6·­/·­(·­!·­·­·­ ·­·­þ¶­÷¶­ð¶­é¶­â¶­Û¶­Ô¶­Ͷ­ƶ­¿¶­¸¶­±¶­ª¶­£¶­œ¶­•¶­޶­‡¶­€¶­y¶­r¶­k¶­d¶­]¶­V¶­O¶­H¶­A¶­:¶­3¶­,¶­%¶­¶­¶­¶­ ¶­¶­ûµ­ôµ­íµ­æµ­ßµ­ص­ѵ­ʵ­õ­¼µ­µµ­®µ­§µ­ µ­™µ­’µ­‹µ­„µ­}µ­vµ­oµ­hµ­aµ­Zµ­Sµ­Lµ­Eµ­>µ­7µ­0µ­)µ­"µ­µ­µ­ µ­µ­ÿ´­ø´­ñ´­ê´­ã´­Ü´­Õ´­δ­Ç´­À´­¹´­²´­«´­¤´­´­–´­´­ˆ´­´­z´­s´­l´­e´­^´­W´­P´­I´­B´­;´­4´­-´­&´­´­´­´­ ´­´­ü³­õ³­î³­ç³­à³­Ù³­Ò³­˳­ij­½³­¶³­¯³­¨³­¡³­š³­“³­Œ³­…³­~³­w³­p³­i³­b³­[³­T³­M³­F³­?³­8³­1³­*³­#³­³­³­³­³­³­ù²­ò²­ë²­ä²­ݲ­Ö²­ϲ­Ȳ­Á²­º²­³²­¬²­¥²­ž²­—²­²­‰²­‚²­{²­t²­m²­f²­_²­X²­Q²­J²­C²­<²­5²­.²­'²­ ²­²­²­ ²­²­ý±­ö±­ï±­è±­á±­Ú±­Ó±­̱­ű­¾±­·±­°±­©±­¢±­›±­”±­±­†±­±­x±­q±­j±­c±­\±­U±­N±­G±­@±­9±­2±­+±­$±­±­±­±­±­±­ú°­ó°­ì°­å°­Þ°­×°­а­ɰ­°­»°­´°­­°­¦°­Ÿ°­˜°­‘°­а­ƒ°­|°­u°­n°­g°­`°­Y°­R°­K°­D°­=°­6°­/°­(°­!°­°­°­ °­°­þ¯­÷¯­ð¯­鯭⯭Û¯­Ô¯­ͯ­Ư­¿¯­¸¯­±¯­ª¯­£¯­œ¯­•¯­ޝ­‡¯­€¯­y¯­r¯­k¯­d¯­]¯­V¯­O¯­H¯­A¯­:¯­3¯­,¯­%¯­¯­¯­¯­ ¯­¯­û®­ô®­í®­æ®­ß®­Ø®­Ñ®­Ê®­î­¼®­µ®­®®­§®­ ®­™®­’®­‹®­„®­}®­v®­o®­h®­a®­Z®­S®­L®­E®­>®­7®­0®­)®­"®­®­®­ ®­®­ÿ­­ø­­ñ­­ê­­ã­­Ü­­Õ­­έ­Ç­­À­­¹­­²­­«­­¤­­­­–­­­­ˆ­­­­z­­s­­l­­e­­^­­W­­P­­I­­B­­;­­4­­-­­&­­­­­­­­ ­­­­ü¬­õ¬­笭ଭÙ¬­Ò¬­ˬ­Ĭ­½¬­¶¬­¯¬­¨¬­¡¬­š¬­“¬­Œ¬­…¬­~¬­w¬­p¬­i¬­b¬­[¬­T¬­M¬­F¬­?¬­8¬­1¬­*¬­#¬­¬­¬­¬­¬­¬­ù«­ò«­ë«­ä«­Ý«­Ö«­Ï«­È«­Á«­º«­³«­¬«­¥«­ž«­—«­«­‰«­‚«­{«­t«­m«­f«­_«­X«­Q«­J«­C«­<«­5«­.«­'«­ «­«­«­ «­«­ýª­öª­節読᪭Úª­Óª­̪­Ū­¾ª­·ª­°ª­©ª­¢ª­›ª­”ª­ª­†ª­ª­xª­qª­jª­cª­\ª­Uª­Nª­Gª­@ª­9ª­2ª­+ª­$ª­ª­ª­ª­ª­ª­ú©­ó©­ì©­å©­Þ©­ש­Щ­É©­©­»©­´©­­©­¦©­Ÿ©­˜©­‘©­Š©­ƒ©­|©­u©­n©­g©­`©­Y©­R©­K©­D©­=©­6©­/©­(©­!©­©­©­ ©­©­þ¨­÷¨­ð¨­騭⨭Û¨­Ô¨­ͨ­ƨ­¿¨­¸¨­±¨­ª¨­£¨­œ¨­•¨­ލ­‡¨­€¨­y¨­r¨­k¨­d¨­]¨­V¨­O¨­H¨­A¨­:¨­3¨­,¨­%¨­¨­¨­¨­ ¨­¨­û§­ô§­í§­æ§­ß§­ا­ѧ­ʧ­ç­¼§­µ§­®§­§§­ §­™§­’§­‹§­„§­}§­v§­o§­h§­a§­Z§­S§­L§­E§­>§­7§­0§­)§­"§­§­§­ §­§­ÿ¦­ø¦­ñ¦­ꦭ㦭ܦ­Õ¦­Φ­Ǧ­À¦­¹¦­²¦­«¦­¤¦­¦­–¦­¦­ˆ¦­¦­z¦­s¦­l¦­e¦­^¦­W¦­P¦­I¦­B¦­;¦­4¦­-¦­&¦­¦­¦­¦­ ¦­¦­ü¥­õ¥­祭७Ù¥­Ò¥­Ë¥­Ä¥­½¥­¶¥­¯¥­¨¥­¡¥­š¥­“¥­Œ¥­…¥­~¥­w¥­p¥­i¥­b¥­[¥­T¥­M¥­F¥­?¥­8¥­1¥­*¥­#¥­¥­¥­¥­¥­¥­ù¤­ò¤­뤭䤭ݤ­Ö¤­Ϥ­Ȥ­Á¤­º¤­³¤­¬¤­¥¤­ž¤­—¤­¤­‰¤­‚¤­{¤­t¤­m¤­f¤­_¤­X¤­Q¤­J¤­C¤­<¤­5¤­.¤­'¤­ ¤­¤­¤­ ¤­¤­ý£­ö£­裭ᣭÚ£­Ó£­Ì£­Å£­¾£­·£­°£­©£­¢£­›£­”£­£­†£­£­x£­q£­j£­c£­\£­U£­N£­G£­@£­9£­2£­+£­$£­£­£­£­£­£­ú¢­ó¢­좭墭Þ¢­×¢­Т­É¢­¢­»¢­´¢­­¢­¦¢­Ÿ¢­˜¢­‘¢­Š¢­ƒ¢­|¢­u¢­n¢­g¢­`¢­Y¢­R¢­K¢­D¢­=¢­6¢­/¢­(¢­!¢­¢­¢­ ¢­¢­þ¡­÷¡­ð¡­é¡­â¡­Û¡­Ô¡­Í¡­Æ¡­¿¡­¸¡­±¡­ª¡­£¡­œ¡­•¡­Ž¡­‡¡­€¡­y¡­r¡­k¡­d¡­]¡­V¡­O¡­H¡­A¡­:¡­3¡­,¡­%¡­¡­¡­¡­ ¡­¡­û ­ô ­í ­æ ­ß ­Ø ­Ñ ­Ê ­à­¼ ­µ ­® ­§ ­  ­™ ­’ ­‹ ­„ ­} ­v ­o ­h ­a ­Z ­S ­L ­E ­> ­7 ­0 ­) ­" ­ ­ ­  ­ ­ÿŸ­øŸ­ñŸ­꟭㟭ÜŸ­ÕŸ­Ο­ÇŸ­ÀŸ­¹Ÿ­²Ÿ­«Ÿ­¤Ÿ­Ÿ­–Ÿ­Ÿ­ˆŸ­Ÿ­zŸ­sŸ­lŸ­eŸ­^Ÿ­WŸ­PŸ­IŸ­BŸ­;Ÿ­4Ÿ­-Ÿ­&Ÿ­Ÿ­Ÿ­Ÿ­ Ÿ­Ÿ­üž­õž­îž­çž­àž­Ùž­Òž­Ëž­Äž­½ž­¶ž­¯ž­¨ž­¡ž­šž­“ž­Œž­…ž­~ž­wž­pž­iž­bž­[ž­Tž­Mž­Fž­?ž­8ž­1ž­*ž­#ž­ž­ž­ž­ž­ž­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ýœ­öœ­蜭ᜭÚœ­Óœ­Ìœ­Åœ­¾œ­·œ­°œ­©œ­¢œ­›œ­”œ­œ­†œ­œ­xœ­qœ­jœ­cœ­\œ­Uœ­Nœ­Gœ­@œ­9œ­2œ­+œ­$œ­œ­œ­œ­œ­œ­ú›­ó›­ì›­å›­Þ›­×›­Л­É›­›­»›­´›­­›­¦›­Ÿ›­˜›­‘›­Š›­ƒ›­|›­u›­n›­g›­`›­Y›­R›­K›­D›­=›­6›­/›­(›­!›­›­›­ ›­›­þš­÷š­ðš­éš­âš­Ûš­Ôš­Íš­Æš­¿š­¸š­±š­ªš­£š­œš­•š­Žš­‡š­€š­yš­rš­kš­dš­]š­Vš­Oš­Hš­Aš­:š­3š­,š­%š­š­š­š­ š­š­û™­ô™­í™­æ™­ß™­Ø™­Ñ™­Ê™­Ù­¼™­µ™­®™­§™­ ™­™™­’™­‹™­„™­}™­v™­o™­h™­a™­Z™­S™­L™­E™­>™­7™­0™­)™­"™­™­™­ ™­™­ÿ˜­ø˜­ñ˜­꘭㘭ܘ­Õ˜­Θ­ǘ­À˜­¹˜­²˜­«˜­¤˜­˜­–˜­˜­ˆ˜­˜­z˜­s˜­l˜­e˜­^˜­W˜­P˜­I˜­B˜­;˜­4˜­-˜­&˜­˜­˜­˜­ ˜­˜­ü—­õ—­î—­ç—­à—­Ù—­Ò—­Ë—­Ä—­½—­¶—­¯—­¨—­¡—­š—­“—­Œ—­…—­~—­w—­p—­i—­b—­[—­T—­M—­F—­?—­8—­1—­*—­#—­—­—­—­—­—­ù–­ò–­ë–­ä–­Ý–­Ö–­Ï–­È–­Á–­º–­³–­¬–­¥–­ž–­—–­–­‰–­‚–­{–­t–­m–­f–­_–­X–­Q–­J–­C–­<–­5–­.–­'–­ –­–­–­ –­–­ý•­ö•­ï•­è•­á•­Ú•­Ó•­Ì•­Å•­¾•­·•­°•­©•­¢•­›•­”•­•­†•­•­x•­q•­j•­c•­\•­U•­N•­G•­@•­9•­2•­+•­$•­•­•­•­•­•­ú”­ó”­ì”­å”­Þ”­×”­Д­É”­”­»”­´”­­”­¦”­Ÿ”­˜”­‘”­Š”­ƒ”­|”­u”­n”­g”­`”­Y”­R”­K”­D”­=”­6”­/”­(”­!”­”­”­ ”­”­þ“­÷“­ð“­é“­â“­Û“­Ô“­Í“­Æ“­¿“­¸“­±“­ª“­£“­œ“­•“­Ž“­‡“­€“­y“­r“­k“­d“­]“­V“­O“­H“­A“­:“­3“­,“­%“­“­“­“­ “­“­û’­ô’­í’­æ’­ß’­Ø’­Ñ’­Ê’­Ã’­¼’­µ’­®’­§’­ ’­™’­’’­‹’­„’­}’­v’­o’­h’­a’­Z’­S’­L’­E’­>’­7’­0’­)’­"’­’­’­ ’­’­ÿ‘­ø‘­ñ‘­ê‘­ã‘­Ü‘­Õ‘­Α­Ç‘­À‘­¹‘­²‘­«‘­¤‘­‘­–‘­‘­ˆ‘­‘­z‘­s‘­l‘­e‘­^‘­W‘­P‘­I‘­B‘­;‘­4‘­-‘­&‘­‘­‘­‘­ ‘­‘­ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ýŽ­öŽ­莭ᎭÚŽ­ÓŽ­ÌŽ­ÅŽ­¾Ž­·Ž­°Ž­©Ž­¢Ž­›Ž­”Ž­Ž­†Ž­Ž­xŽ­qŽ­jŽ­cŽ­\Ž­UŽ­NŽ­GŽ­@Ž­9Ž­2Ž­+Ž­$Ž­Ž­Ž­Ž­Ž­Ž­ú­ó­ì­å­Þ­×­ЭÉ­­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þŒ­÷Œ­ðŒ­錭⌭ÛŒ­ÔŒ­ÍŒ­ÆŒ­¿Œ­¸Œ­±Œ­ªŒ­£Œ­œŒ­•Œ­ŽŒ­‡Œ­€Œ­yŒ­rŒ­kŒ­dŒ­]Œ­VŒ­OŒ­HŒ­AŒ­:Œ­3Œ­,Œ­%Œ­Œ­Œ­Œ­ Œ­Œ­û‹­ô‹­í‹­æ‹­ß‹­Ø‹­Ñ‹­Ê‹­Ë­¼‹­µ‹­®‹­§‹­ ‹­™‹­’‹­‹‹­„‹­}‹­v‹­o‹­h‹­a‹­Z‹­S‹­L‹­E‹­>‹­7‹­0‹­)‹­"‹­‹­‹­ ‹­‹­ÿŠ­øŠ­ñŠ­ꊭ㊭ÜŠ­ÕŠ­Ί­ÇŠ­ÀŠ­¹Š­²Š­«Š­¤Š­Š­–Š­Š­ˆŠ­Š­zŠ­sŠ­lŠ­eŠ­^Š­WŠ­PŠ­IŠ­BŠ­;Š­4Š­-Š­&Š­Š­Š­Š­ Š­Š­ü‰­õ‰­牭à‰­Ù‰­Ò‰­ˉ­ĉ­½‰­¶‰­¯‰­¨‰­¡‰­š‰­“‰­Œ‰­…‰­~‰­w‰­p‰­i‰­b‰­[‰­T‰­M‰­F‰­?‰­8‰­1‰­*‰­#‰­‰­‰­‰­‰­‰­ùˆ­òˆ­눭䈭݈­Öˆ­ψ­Ȉ­Áˆ­ºˆ­³ˆ­¬ˆ­¥ˆ­žˆ­—ˆ­ˆ­‰ˆ­‚ˆ­{ˆ­tˆ­mˆ­fˆ­_ˆ­Xˆ­Qˆ­Jˆ­Cˆ­<ˆ­5ˆ­.ˆ­'ˆ­ ˆ­ˆ­ˆ­ ˆ­ˆ­ý‡­ö‡­臭ᇭÚ‡­Ó‡­̇­Ň­¾‡­·‡­°‡­©‡­¢‡­›‡­”‡­‡­†‡­‡­x‡­q‡­j‡­c‡­\‡­U‡­N‡­G‡­@‡­9‡­2‡­+‡­$‡­‡­‡­‡­‡­‡­ú†­ó†­솭冭Þ†­׆­І­Ɇ­†­»†­´†­­†­¦†­Ÿ†­˜†­‘†­І­ƒ†­|†­u†­n†­g†­`†­Y†­R†­K†­D†­=†­6†­/†­(†­!†­†­†­ †­†­þ…­÷…­ð…­é…­â…­Û…­Ô…­Í…­Æ…­¿…­¸…­±…­ª…­£…­œ…­•…­Ž…­‡…­€…­y…­r…­k…­d…­]…­V…­O…­H…­A…­:…­3…­,…­%…­…­…­…­ …­…­û„­ô„­í„­æ„­ß„­Ø„­Ñ„­Ê„­Ä­¼„­µ„­®„­§„­ „­™„­’„­‹„­„„­}„­v„­o„­h„­a„­Z„­S„­L„­E„­>„­7„­0„­)„­"„­„­„­ „­„­ÿƒ­øƒ­ñƒ­ꃭロ܃­Õƒ­΃­ǃ­Àƒ­¹ƒ­²ƒ­«ƒ­¤ƒ­ƒ­–ƒ­ƒ­ˆƒ­ƒ­zƒ­sƒ­lƒ­eƒ­^ƒ­Wƒ­Pƒ­Iƒ­Bƒ­;ƒ­4ƒ­-ƒ­&ƒ­ƒ­ƒ­ƒ­ ƒ­ƒ­ü‚­õ‚­î‚­ç‚­à‚­Ù‚­Ò‚­Ë‚­Ä‚­½‚­¶‚­¯‚­¨‚­¡‚­š‚­“‚­Œ‚­…‚­~‚­w‚­p‚­i‚­b‚­[‚­T‚­M‚­F‚­?‚­8‚­1‚­*‚­#‚­‚­‚­‚­‚­‚­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý€­ö€­耭ိÚ€­Ó€­Ì€­Å€­¾€­·€­°€­©€­¢€­›€­”€­€­†€­€­x€­q€­j€­c€­\€­U€­N€­G€­@€­9€­2€­+€­$€­€­€­€­€­€­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ~­÷~­ð~­é~­â~­Û~­Ô~­Í~­Æ~­¿~­¸~­±~­ª~­£~­œ~­•~­Ž~­‡~­€~­y~­r~­k~­d~­]~­V~­O~­H~­A~­:~­3~­,~­%~­~­~­~­ ~­~­û}­ô}­í}­æ}­ß}­Ø}­Ñ}­Ê}­Ã}­¼}­µ}­®}­§}­ }­™}­’}­‹}­„}­}}­v}­o}­h}­a}­Z}­S}­L}­E}­>}­7}­0}­)}­"}­}­}­ }­}­ÿ|­ø|­ñ|­ê|­ã|­Ü|­Õ|­Î|­Ç|­À|­¹|­²|­«|­¤|­|­–|­|­ˆ|­|­z|­s|­l|­e|­^|­W|­P|­I|­B|­;|­4|­-|­&|­|­|­|­ |­|­ü{­õ{­î{­ç{­à{­Ù{­Ò{­Ë{­Ä{­½{­¶{­¯{­¨{­¡{­š{­“{­Œ{­…{­~{­w{­p{­i{­b{­[{­T{­M{­F{­?{­8{­1{­*{­#{­{­{­{­{­{­ùz­òz­ëz­äz­Ýz­Öz­Ïz­Èz­Áz­ºz­³z­¬z­¥z­žz­—z­z­‰z­‚z­{z­tz­mz­fz­_z­Xz­Qz­Jz­Cz­v­7v­0v­)v­"v­v­v­ v­v­ÿu­øu­ñu­êu­ãu­Üu­Õu­Îu­Çu­Àu­¹u­²u­«u­¤u­u­–u­u­ˆu­u­zu­su­lu­eu­^u­Wu­Pu­Iu­Bu­;u­4u­-u­&u­u­u­u­ u­u­üt­õt­ît­çt­àt­Ùt­Òt­Ët­Ät­½t­¶t­¯t­¨t­¡t­št­“t­Œt­…t­~t­wt­pt­it­bt­[t­Tt­Mt­Ft­?t­8t­1t­*t­#t­t­t­t­t­t­ùs­òs­ës­äs­Ýs­Ös­Ïs­Ès­Ás­ºs­³s­¬s­¥s­žs­—s­s­‰s­‚s­{s­ts­ms­fs­_s­Xs­Qs­Js­Cs­o­7o­0o­)o­"o­o­o­ o­o­ÿn­øn­ñn­ên­ãn­Ün­Õn­În­Çn­Àn­¹n­²n­«n­¤n­n­–n­n­ˆn­n­zn­sn­ln­en­^n­Wn­Pn­In­Bn­;n­4n­-n­&n­n­n­n­ n­n­üm­õm­îm­çm­àm­Ùm­Òm­Ëm­Äm­½m­¶m­¯m­¨m­¡m­šm­“m­Œm­…m­~m­wm­pm­im­bm­[m­Tm­Mm­Fm­?m­8m­1m­*m­#m­m­m­m­m­m­ùl­òl­ël­äl­Ýl­Öl­Ïl­Èl­Ál­ºl­³l­¬l­¥l­žl­—l­l­‰l­‚l­{l­tl­ml­fl­_l­Xl­Ql­Jl­Cl­h­7h­0h­)h­"h­h­h­ h­h­ÿg­øg­ñg­êg­ãg­Üg­Õg­Îg­Çg­Àg­¹g­²g­«g­¤g­g­–g­g­ˆg­g­zg­sg­lg­eg­^g­Wg­Pg­Ig­Bg­;g­4g­-g­&g­g­g­g­ g­g­üf­õf­îf­çf­àf­Ùf­Òf­Ëf­Äf­½f­¶f­¯f­¨f­¡f­šf­“f­Œf­…f­~f­wf­pf­if­bf­[f­Tf­Mf­Ff­?f­8f­1f­*f­#f­f­f­f­f­f­ùe­òe­ëe­äe­Ýe­Öe­Ïe­Èe­Áe­ºe­³e­¬e­¥e­že­—e­e­‰e­‚e­{e­te­me­fe­_e­Xe­Qe­Je­Ce­a­7a­0a­)a­"a­a­a­ a­a­ÿ`­ø`­ñ`­ê`­ã`­Ü`­Õ`­Î`­Ç`­À`­¹`­²`­«`­¤`­`­–`­`­ˆ`­`­z`­s`­l`­e`­^`­W`­P`­I`­B`­;`­4`­-`­&`­`­`­`­ `­`­ü_­õ_­î_­ç_­à_­Ù_­Ò_­Ë_­Ä_­½_­¶_­¯_­¨_­¡_­š_­“_­Œ_­…_­~_­w_­p_­i_­b_­[_­T_­M_­F_­?_­8_­1_­*_­#_­_­_­_­_­_­ù^­ò^­ë^­ä^­Ý^­Ö^­Ï^­È^­Á^­º^­³^­¬^­¥^­ž^­—^­^­‰^­‚^­{^­t^­m^­f^­_^­X^­Q^­J^­C^­<^­5^­.^­'^­ ^­^­^­ ^­^­ý]­ö]­ï]­è]­á]­Ú]­Ó]­Ì]­Å]­¾]­·]­°]­©]­¢]­›]­”]­]­†]­]­x]­q]­j]­c]­\]­U]­N]­G]­@]­9]­2]­+]­$]­]­]­]­]­]­ú\­ó\­ì\­å\­Þ\­×\­Ð\­É\­Â\­»\­´\­­\­¦\­Ÿ\­˜\­‘\­Š\­ƒ\­|\­u\­n\­g\­`\­Y\­R\­K\­D\­=\­6\­/\­(\­!\­\­\­ \­\­þ[­÷[­ð[­é[­â[­Û[­Ô[­Í[­Æ[­¿[­¸[­±[­ª[­£[­œ[­•[­Ž[­‡[­€[­y[­r[­k[­d[­][­V[­O[­H[­A[­:[­3[­,[­%[­[­[­[­ [­[­ûZ­ôZ­íZ­æZ­ßZ­ØZ­ÑZ­ÊZ­ÃZ­¼Z­µZ­®Z­§Z­ Z­™Z­’Z­‹Z­„Z­}Z­vZ­oZ­hZ­aZ­ZZ­SZ­LZ­EZ­>Z­7Z­0Z­)Z­"Z­Z­Z­ Z­Z­ÿY­øY­ñY­êY­ãY­ÜY­ÕY­ÎY­ÇY­ÀY­¹Y­²Y­«Y­¤Y­Y­–Y­Y­ˆY­Y­zY­sY­lY­eY­^Y­WY­PY­IY­BY­;Y­4Y­-Y­&Y­Y­Y­Y­ Y­Y­üX­õX­îX­çX­àX­ÙX­ÒX­ËX­ÄX­½X­¶X­¯X­¨X­¡X­šX­“X­ŒX­…X­~X­wX­pX­iX­bX­[X­TX­MX­FX­?X­8X­1X­*X­#X­X­X­X­X­X­ùW­òW­ëW­äW­ÝW­ÖW­ÏW­ÈW­ÁW­ºW­³W­¬W­¥W­žW­—W­W­‰W­‚W­{W­tW­mW­fW­_W­XW­QW­JW­CW­S­7S­0S­)S­"S­S­S­ S­S­ÿR­øR­ñR­êR­ãR­ÜR­ÕR­ÎR­ÇR­ÀR­¹R­²R­«R­¤R­R­–R­R­ˆR­R­zR­sR­lR­eR­^R­WR­PR­IR­BR­;R­4R­-R­&R­R­R­R­ R­R­üQ­õQ­îQ­çQ­àQ­ÙQ­ÒQ­ËQ­ÄQ­½Q­¶Q­¯Q­¨Q­¡Q­šQ­“Q­ŒQ­…Q­~Q­wQ­pQ­iQ­bQ­[Q­TQ­MQ­FQ­?Q­8Q­1Q­*Q­#Q­Q­Q­Q­Q­Q­ùP­òP­ëP­äP­ÝP­ÖP­ÏP­ÈP­ÁP­ºP­³P­¬P­¥P­žP­—P­P­‰P­‚P­{P­tP­mP­fP­_P­XP­QP­JP­CP­L­7L­0L­)L­"L­L­L­ L­L­ÿK­øK­ñK­êK­ãK­ÜK­ÕK­ÎK­ÇK­ÀK­¹K­²K­«K­¤K­K­–K­K­ˆK­K­zK­sK­lK­eK­^K­WK­PK­IK­BK­;K­4K­-K­&K­K­K­K­ K­K­üJ­õJ­îJ­çJ­àJ­ÙJ­ÒJ­ËJ­ÄJ­½J­¶J­¯J­¨J­¡J­šJ­“J­ŒJ­…J­~J­wJ­pJ­iJ­bJ­[J­TJ­MJ­FJ­?J­8J­1J­*J­#J­J­J­J­J­J­ùI­òI­ëI­äI­ÝI­ÖI­ÏI­ÈI­ÁI­ºI­³I­¬I­¥I­žI­—I­I­‰I­‚I­{I­tI­mI­fI­_I­XI­QI­JI­CI­E­7E­0E­)E­"E­E­E­ E­E­ÿD­øD­ñD­êD­ãD­ÜD­ÕD­ÎD­ÇD­ÀD­¹D­²D­«D­¤D­D­–D­D­ˆD­D­zD­sD­lD­eD­^D­WD­PD­ID­BD­;D­4D­-D­&D­D­D­D­ D­D­üC­õC­îC­çC­àC­ÙC­ÒC­ËC­ÄC­½C­¶C­¯C­¨C­¡C­šC­“C­ŒC­…C­~C­wC­pC­iC­bC­[C­TC­MC­FC­?C­8C­1C­*C­#C­C­C­C­C­C­ùB­òB­ëB­äB­ÝB­ÖB­ÏB­ÈB­ÁB­ºB­³B­¬B­¥B­žB­—B­B­‰B­‚B­{B­tB­mB­fB­_B­XB­QB­JB­CB­­ô>­í>­æ>­ß>­Ø>­Ñ>­Ê>­Ã>­¼>­µ>­®>­§>­ >­™>­’>­‹>­„>­}>­v>­o>­h>­a>­Z>­S>­L>­E>­>>­7>­0>­)>­">­>­>­ >­>­ÿ=­ø=­ñ=­ê=­ã=­Ü=­Õ=­Î=­Ç=­À=­¹=­²=­«=­¤=­=­–=­=­ˆ=­=­z=­s=­l=­e=­^=­W=­P=­I=­B=­;=­4=­-=­&=­=­=­=­ =­=­ü<­õ<­î<­ç<­à<­Ù<­Ò<­Ë<­Ä<­½<­¶<­¯<­¨<­¡<­š<­“<­Œ<­…<­~<­w<­p<­i<­b<­[<­T<­M<­F<­?<­8<­1<­*<­#<­<­<­<­<­<­ù;­ò;­ë;­ä;­Ý;­Ö;­Ï;­È;­Á;­º;­³;­¬;­¥;­ž;­—;­;­‰;­‚;­{;­t;­m;­f;­_;­X;­Q;­J;­C;­<;­5;­.;­';­ ;­;­;­ ;­;­ý:­ö:­ï:­è:­á:­Ú:­Ó:­Ì:­Å:­¾:­·:­°:­©:­¢:­›:­”:­:­†:­:­x:­q:­j:­c:­\:­U:­N:­G:­@:­9:­2:­+:­$:­:­:­:­:­:­ú9­ó9­ì9­å9­Þ9­×9­Ð9­É9­Â9­»9­´9­­9­¦9­Ÿ9­˜9­‘9­Š9­ƒ9­|9­u9­n9­g9­`9­Y9­R9­K9­D9­=9­69­/9­(9­!9­9­9­ 9­9­þ8­÷8­ð8­é8­â8­Û8­Ô8­Í8­Æ8­¿8­¸8­±8­ª8­£8­œ8­•8­Ž8­‡8­€8­y8­r8­k8­d8­]8­V8­O8­H8­A8­:8­38­,8­%8­8­8­8­ 8­8­û7­ô7­í7­æ7­ß7­Ø7­Ñ7­Ê7­Ã7­¼7­µ7­®7­§7­ 7­™7­’7­‹7­„7­}7­v7­o7­h7­a7­Z7­S7­L7­E7­>7­77­07­)7­"7­7­7­ 7­7­ÿ6­ø6­ñ6­ê6­ã6­Ü6­Õ6­Î6­Ç6­À6­¹6­²6­«6­¤6­6­–6­6­ˆ6­6­z6­s6­l6­e6­^6­W6­P6­I6­B6­;6­46­-6­&6­6­6­6­ 6­6­ü5­õ5­î5­ç5­à5­Ù5­Ò5­Ë5­Ä5­½5­¶5­¯5­¨5­¡5­š5­“5­Œ5­…5­~5­w5­p5­i5­b5­[5­T5­M5­F5­?5­85­15­*5­#5­5­5­5­5­5­ù4­ò4­ë4­ä4­Ý4­Ö4­Ï4­È4­Á4­º4­³4­¬4­¥4­ž4­—4­4­‰4­‚4­{4­t4­m4­f4­_4­X4­Q4­J4­C4­<4­54­.4­'4­ 4­4­4­ 4­4­ý3­ö3­ï3­è3­á3­Ú3­Ó3­Ì3­Å3­¾3­·3­°3­©3­¢3­›3­”3­3­†3­3­x3­q3­j3­c3­\3­U3­N3­G3­@3­93­23­+3­$3­3­3­3­3­3­ú2­ó2­ì2­å2­Þ2­×2­Ð2­É2­Â2­»2­´2­­2­¦2­Ÿ2­˜2­‘2­Š2­ƒ2­|2­u2­n2­g2­`2­Y2­R2­K2­D2­=2­62­/2­(2­!2­2­2­ 2­2­þ1­÷1­ð1­é1­â1­Û1­Ô1­Í1­Æ1­¿1­¸1­±1­ª1­£1­œ1­•1­Ž1­‡1­€1­y1­r1­k1­d1­]1­V1­O1­H1­A1­:1­31­,1­%1­1­1­1­ 1­1­û0­ô0­í0­æ0­ß0­Ø0­Ñ0­Ê0­Ã0­¼0­µ0­®0­§0­ 0­™0­’0­‹0­„0­}0­v0­o0­h0­a0­Z0­S0­L0­E0­>0­70­00­)0­"0­0­0­ 0­0­ÿ/­ø/­ñ/­ê/­ã/­Ü/­Õ/­Î/­Ç/­À/­¹/­²/­«/­¤/­/­–/­/­ˆ/­/­z/­s/­l/­e/­^/­W/­P/­I/­B/­;/­4/­-/­&/­/­/­/­ /­/­ü.­õ.­î.­ç.­à.­Ù.­Ò.­Ë.­Ä.­½.­¶.­¯.­¨.­¡.­š.­“.­Œ.­….­~.­w.­p.­i.­b.­[.­T.­M.­F.­?.­8.­1.­*.­#.­.­.­.­.­.­ù-­ò-­ë-­ä-­Ý-­Ö-­Ï-­È-­Á-­º-­³-­¬-­¥-­ž-­—-­-­‰-­‚-­{-­t-­m-­f-­_-­X-­Q-­J-­C-­<-­5-­.-­'-­ -­-­-­ -­-­ý,­ö,­ï,­è,­á,­Ú,­Ó,­Ì,­Å,­¾,­·,­°,­©,­¢,­›,­”,­,­†,­,­x,­q,­j,­c,­\,­U,­N,­G,­@,­9,­2,­+,­$,­,­,­,­,­,­ú+­ó+­ì+­å+­Þ+­×+­Ð+­É+­Â+­»+­´+­­+­¦+­Ÿ+­˜+­‘+­Š+­ƒ+­|+­u+­n+­g+­`+­Y+­R+­K+­D+­=+­6+­/+­(+­!+­+­+­ +­+­þ*­÷*­ð*­é*­â*­Û*­Ô*­Í*­Æ*­¿*­¸*­±*­ª*­£*­œ*­•*­Ž*­‡*­€*­y*­r*­k*­d*­]*­V*­O*­H*­A*­:*­3*­,*­%*­*­*­*­ *­*­û)­ô)­í)­æ)­ß)­Ø)­Ñ)­Ê)­Ã)­¼)­µ)­®)­§)­ )­™)­’)­‹)­„)­})­v)­o)­h)­a)­Z)­S)­L)­E)­>)­7)­0)­))­")­)­)­ )­)­ÿ(­ø(­ñ(­ê(­ã(­Ü(­Õ(­Î(­Ç(­À(­¹(­²(­«(­¤(­(­–(­(­ˆ(­(­z(­s(­l(­e(­^(­W(­P(­I(­B(­;(­4(­-(­&(­(­(­(­ (­(­ü'­õ'­î'­ç'­à'­Ù'­Ò'­Ë'­Ä'­½'­¶'­¯'­¨'­¡'­š'­“'­Œ'­…'­~'­w'­p'­i'­b'­['­T'­M'­F'­?'­8'­1'­*'­#'­'­'­'­'­'­ù&­ò&­ë&­ä&­Ý&­Ö&­Ï&­È&­Á&­º&­³&­¬&­¥&­ž&­—&­&­‰&­‚&­{&­t&­m&­f&­_&­X&­Q&­J&­C&­<&­5&­.&­'&­ &­&­&­ &­&­ý%­ö%­ï%­è%­á%­Ú%­Ó%­Ì%­Å%­¾%­·%­°%­©%­¢%­›%­”%­%­†%­%­x%­q%­j%­c%­\%­U%­N%­G%­@%­9%­2%­+%­$%­%­%­%­%­%­ú$­ó$­ì$­å$­Þ$­×$­Ð$­É$­Â$­»$­´$­­$­¦$­Ÿ$­˜$­‘$­Š$­ƒ$­|$­u$­n$­g$­`$­Y$­R$­K$­D$­=$­6$­/$­($­!$­$­$­ $­$­þ#­÷#­ð#­é#­â#­Û#­Ô#­Í#­Æ#­¿#­¸#­±#­ª#­£#­œ#­•#­Ž#­‡#­€#­y#­r#­k#­d#­]#­V#­O#­H#­A#­:#­3#­,#­%#­#­#­#­ #­#­û"­ô"­í"­æ"­ß"­Ø"­Ñ"­Ê"­Ã"­¼"­µ"­®"­§"­ "­™"­’"­‹"­„"­}"­v"­o"­h"­a"­Z"­S"­L"­E"­>"­7"­0"­)"­""­"­"­ "­"­ÿ!­ø!­ñ!­ê!­ã!­Ü!­Õ!­Î!­Ç!­À!­¹!­²!­«!­¤!­!­–!­!­ˆ!­!­z!­s!­l!­e!­^!­W!­P!­I!­B!­;!­4!­-!­&!­!­!­!­ !­!­ü ­õ ­î ­ç ­à ­Ù ­Ò ­Ë ­Ä ­½ ­¶ ­¯ ­¨ ­¡ ­š ­“ ­Œ ­… ­~ ­w ­p ­i ­b ­[ ­T ­M ­F ­? ­8 ­1 ­* ­# ­ ­ ­ ­ ­ ­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û­ô­í­æ­ß­Ø­Ñ­Ê­Ã­¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ­ø­ñ­ê­ã­Ü­Õ­Î­Ç­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û­ô­í­æ­ß­Ø­Ñ­Ê­Ã­¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ­ø­ñ­ê­ã­Ü­Õ­Î­Ç­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û ­ô ­í ­æ ­ß ­Ø ­Ñ ­Ê ­à ­¼ ­µ ­® ­§ ­  ­™ ­’ ­‹ ­„ ­} ­v ­o ­h ­a ­Z ­S ­L ­E ­> ­7 ­0 ­) ­" ­ ­ ­ ­ ­ÿ ­ø ­ñ ­ê ­ã ­Ü ­Õ ­Î ­Ç ­À ­¹ ­² ­« ­¤ ­ ­– ­ ­ˆ ­ ­z ­s ­l ­e ­^ ­W ­P ­I ­B ­; ­4 ­- ­& ­ ­ ­ ­ ­ ­ü ­õ ­î ­ç ­à ­Ù ­Ò ­Ë ­Ä ­½ ­¶ ­¯ ­¨ ­¡ ­š ­“ ­Œ ­… ­~ ­w ­p ­i ­b ­[ ­T ­M ­F ­? ­8 ­1 ­* ­# ­ ­ ­ ­ ­ ­ù ­ò ­ë ­ä ­Ý ­Ö ­Ï ­È ­Á ­º ­³ ­¬ ­¥ ­ž ­— ­ ­‰ ­‚ ­{ ­t ­m ­f ­_ ­X ­Q ­J ­C ­< ­5 ­. ­' ­ ­ ­ ­ ­ ­ý ­ö ­ï ­è ­á ­Ú ­Ó ­Ì ­Å ­¾ ­· ­° ­© ­¢ ­› ­” ­ ­† ­ ­x ­q ­j ­c ­\ ­U ­N ­G ­@ ­9 ­2 ­+ ­$ ­ ­ ­ ­ ­ ­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û­ô­í­æ­ß­Ø­Ñ­Ê­Ã­¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ­ø­ñ­ê­ã­Ü­Õ­Î­Ç­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú­ó­ì­å­Þ­×­Ð­É­Â­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­ûÿ¬ôÿ¬íÿ¬æÿ¬ßÿ¬Øÿ¬Ñÿ¬Êÿ¬Ãÿ¬¼ÿ¬µÿ¬®ÿ¬§ÿ¬ ÿ¬™ÿ¬’ÿ¬‹ÿ¬„ÿ¬}ÿ¬vÿ¬oÿ¬hÿ¬aÿ¬Zÿ¬Sÿ¬Lÿ¬Eÿ¬>ÿ¬7ÿ¬0ÿ¬)ÿ¬"ÿ¬ÿ¬ÿ¬ ÿ¬ÿ¬ÿþ¬øþ¬ñþ¬êþ¬ãþ¬Üþ¬Õþ¬Îþ¬Çþ¬Àþ¬¹þ¬²þ¬«þ¬¤þ¬þ¬–þ¬þ¬ˆþ¬þ¬zþ¬sþ¬lþ¬eþ¬^þ¬Wþ¬Pþ¬Iþ¬Bþ¬;þ¬4þ¬-þ¬&þ¬þ¬þ¬þ¬ þ¬þ¬üý¬õý¬îý¬çý¬àý¬Ùý¬Òý¬Ëý¬Äý¬½ý¬¶ý¬¯ý¬¨ý¬¡ý¬šý¬“ý¬Œý¬…ý¬~ý¬wý¬pý¬iý¬bý¬[ý¬Tý¬Mý¬Fý¬?ý¬8ý¬1ý¬*ý¬#ý¬ý¬ý¬ý¬ý¬ý¬ùü¬òü¬ëü¬äü¬Ýü¬Öü¬Ïü¬Èü¬Áü¬ºü¬³ü¬¬ü¬¥ü¬žü¬—ü¬ü¬‰ü¬‚ü¬{ü¬tü¬mü¬fü¬_ü¬Xü¬Qü¬Jü¬Cü¬<ü¬5ü¬.ü¬'ü¬ ü¬ü¬ü¬ ü¬ü¬ýû¬öû¬ïû¬èû¬áû¬Úû¬Óû¬Ìû¬Åû¬¾û¬·û¬°û¬©û¬¢û¬›û¬”û¬û¬†û¬û¬xû¬qû¬jû¬cû¬\û¬Uû¬Nû¬Gû¬@û¬9û¬2û¬+û¬$û¬û¬û¬û¬û¬û¬úú¬óú¬ìú¬åú¬Þú¬×ú¬Ðú¬Éú¬Âú¬»ú¬´ú¬­ú¬¦ú¬Ÿú¬˜ú¬‘ú¬Šú¬ƒú¬|ú¬uú¬nú¬gú¬`ú¬Yú¬Rú¬Kú¬Dú¬=ú¬6ú¬/ú¬(ú¬!ú¬ú¬ú¬ ú¬ú¬þù¬÷ù¬ðù¬éù¬âù¬Ûù¬Ôù¬Íù¬Æù¬¿ù¬¸ù¬±ù¬ªù¬£ù¬œù¬•ù¬Žù¬‡ù¬€ù¬yù¬rù¬kù¬dù¬]ù¬Vù¬Où¬Hù¬Aù¬:ù¬3ù¬,ù¬%ù¬ù¬ù¬ù¬ ù¬ù¬ûø¬ôø¬íø¬æø¬ßø¬Øø¬Ñø¬Êø¬Ãø¬¼ø¬µø¬®ø¬§ø¬ ø¬™ø¬’ø¬‹ø¬„ø¬}ø¬vø¬oø¬hø¬aø¬Zø¬Sø¬Lø¬Eø¬>ø¬7ø¬0ø¬)ø¬"ø¬ø¬ø¬ ø¬ø¬ÿ÷¬ø÷¬ñ÷¬ê÷¬ã÷¬Ü÷¬Õ÷¬Î÷¬Ç÷¬À÷¬¹÷¬²÷¬«÷¬¤÷¬÷¬–÷¬÷¬ˆ÷¬÷¬z÷¬s÷¬l÷¬e÷¬^÷¬W÷¬P÷¬I÷¬B÷¬;÷¬4÷¬-÷¬&÷¬÷¬÷¬÷¬ ÷¬÷¬üö¬õö¬îö¬çö¬àö¬Ùö¬Òö¬Ëö¬Äö¬½ö¬¶ö¬¯ö¬¨ö¬¡ö¬šö¬“ö¬Œö¬…ö¬~ö¬wö¬pö¬iö¬bö¬[ö¬Tö¬Mö¬Fö¬?ö¬8ö¬1ö¬*ö¬#ö¬ö¬ö¬ö¬ö¬ö¬ùõ¬òõ¬ëõ¬äõ¬Ýõ¬Öõ¬Ïõ¬Èõ¬Áõ¬ºõ¬³õ¬¬õ¬¥õ¬žõ¬—õ¬õ¬‰õ¬‚õ¬{õ¬tõ¬mõ¬fõ¬_õ¬Xõ¬Qõ¬Jõ¬Cõ¬<õ¬5õ¬.õ¬'õ¬ õ¬õ¬õ¬ õ¬õ¬ýô¬öô¬ïô¬èô¬áô¬Úô¬Óô¬Ìô¬Åô¬¾ô¬·ô¬°ô¬©ô¬¢ô¬›ô¬”ô¬ô¬†ô¬ô¬xô¬qô¬jô¬cô¬\ô¬Uô¬Nô¬Gô¬@ô¬9ô¬2ô¬+ô¬$ô¬ô¬ô¬ô¬ô¬ô¬úó¬óó¬ìó¬åó¬Þó¬×ó¬Ðó¬Éó¬Âó¬»ó¬´ó¬­ó¬¦ó¬Ÿó¬˜ó¬‘ó¬Šó¬ƒó¬|ó¬uó¬nó¬gó¬`ó¬Yó¬Ró¬Kó¬Dó¬=ó¬6ó¬/ó¬(ó¬!ó¬ó¬ó¬ ó¬ó¬þò¬÷ò¬ðò¬éò¬âò¬Ûò¬Ôò¬Íò¬Æò¬¿ò¬¸ò¬±ò¬ªò¬£ò¬œò¬•ò¬Žò¬‡ò¬€ò¬yò¬rò¬kò¬dò¬]ò¬Vò¬Oò¬Hò¬Aò¬:ò¬3ò¬,ò¬%ò¬ò¬ò¬ò¬ ò¬ò¬ûñ¬ôñ¬íñ¬æñ¬ßñ¬Øñ¬Ññ¬Êñ¬Ãñ¬¼ñ¬µñ¬®ñ¬§ñ¬ ñ¬™ñ¬’ñ¬‹ñ¬„ñ¬}ñ¬vñ¬oñ¬hñ¬añ¬Zñ¬Sñ¬Lñ¬Eñ¬>ñ¬7ñ¬0ñ¬)ñ¬"ñ¬ñ¬ñ¬ ñ¬ñ¬ÿð¬øð¬ñð¬êð¬ãð¬Üð¬Õð¬Îð¬Çð¬Àð¬¹ð¬²ð¬«ð¬¤ð¬ð¬–ð¬ð¬ˆð¬ð¬zð¬sð¬lð¬eð¬^ð¬Wð¬Pð¬Ið¬Bð¬;ð¬4ð¬-ð¬&ð¬ð¬ð¬ð¬ ð¬ð¬üï¬õï¬îï¬çï¬àï¬Ùï¬Òï¬Ëï¬Ä﬽זּאָﬨﬡ﬚ﬓ﬌ſtï¬~ï¬wï¬pï¬iï¬bï¬[ï¬Tï¬Mï¬Fï¬?ï¬8ï¬1ï¬*ï¬#ï¬ï¬ï¬ï¬ï¬ï¬ùî¬òî¬ëî¬äî¬Ýî¬Öî¬Ïî¬Èî¬Áî¬î¬‰î¬‚î¬{î¬tî¬mî¬fî¬_î¬Xî¬Qî¬Jî¬Cî¬<î¬5î¬.î¬'î¬ î¬î¬î¬ î¬î¬ýí¬öí¬ïí¬èí¬áí¬Úí¬Óí¬Ìí¬Åí¬¾í¬·í¬°í¬©í¬¢í¬›í¬”í¬í¬†í¬í¬xí¬qí¬jí¬cí¬\í¬Uí¬Ní¬Gí¬@í¬9í¬2í¬+í¬$í¬í¬í¬í¬í¬í¬úì¬óì¬ìì¬åì¬Þì¬×ì¬Ðì¬Éì¬Â쬻쬴쬭쬦쬟쬘쬑쬊쬃ì¬|ì¬uì¬nì¬gì¬`ì¬Yì¬Rì¬Kì¬Dì¬=ì¬6ì¬/ì¬(ì¬!ì¬ì¬ì¬ ì¬ì¬þë¬÷ë¬ðë¬éë¬âë¬Ûë¬Ôë¬Íë¬Æë¬¿ë¬¸ë¬±ë¬ªë¬£ë¬œë¬•ë¬Žë¬‡ë¬€ë¬yë¬rë¬kë¬dë¬]ë¬Vë¬Oë¬Hë¬Aë¬:ë¬3ë¬,ë¬%ë¬ë¬ë¬ë¬ ë¬ë¬ûê¬ôê¬íê¬æê¬ßê¬Øê¬Ñê¬Êê¬Ãꬼꬵꬮ꬧ꬠ꬙ꬒꬋꬄê¬}ê¬vê¬oê¬hê¬aê¬Zê¬Sê¬Lê¬Eê¬>ê¬7ê¬0ê¬)ê¬"ê¬ê¬ê¬ ê¬ê¬ÿ鬸é¬ñé¬êé¬ãé¬Üé¬Õé¬Îé¬Çé¬À鬹鬲鬫鬤é¬é¬–é¬é¬ˆé¬é¬zé¬sé¬lé¬eé¬^é¬Wé¬Pé¬Ié¬Bé¬;é¬4é¬-é¬&é¬é¬é¬é¬ é¬é¬üè¬õè¬îè¬çè¬àè¬Ùè¬Òè¬Ëè¬Ä謽謶謯謨謡謚謓謌謅è¬~è¬wè¬pè¬iè¬bè¬[è¬Tè¬Mè¬Fè¬?è¬8è¬1è¬*è¬#è¬è¬è¬è¬è¬è¬ùç¬òç¬ëç¬äç¬Ýç¬Öç¬Ïç¬Èç¬Á笺笳第笥笞笗ç¬ç¬‰ç¬‚ç¬{ç¬tç¬mç¬fç¬_ç¬Xç¬Qç¬Jç¬Cç¬<ç¬5ç¬.ç¬'ç¬ ç¬ç¬ç¬ ç¬ç¬ýæ¬öæ¬ïæ¬èæ¬áæ¬Úæ¬Óæ¬Ìæ¬Åæ¬¾æ¬·æ¬°æ¬©æ¬¢æ¬›æ¬”æ¬æ¬†æ¬æ¬xæ¬qæ¬jæ¬cæ¬\æ¬Uæ¬Næ¬Gæ¬@æ¬9æ¬2æ¬+æ¬$æ¬æ¬æ¬æ¬æ¬æ¬úå¬óå¬ìå¬åå¬Þå¬×å¬Ðå¬Éå¬Â嬻嬴嬭嬦嬟嬘嬑嬊嬃å¬|å¬uå¬nå¬gå¬`å¬Yå¬Rå¬Kå¬Då¬=å¬6å¬/å¬(å¬!å¬å¬å¬ å¬å¬þä¬÷ä¬ðä¬éä¬âä¬Ûä¬Ôä¬Íä¬Æä¬¿ä¬¸ä¬±ä¬ªä¬£ä¬œä¬•ä¬Žä¬‡ä¬€ä¬yä¬rä¬kä¬dä¬]ä¬Vä¬Oä¬Hä¬Aä¬:ä¬3ä¬,ä¬%ä¬ä¬ä¬ä¬ ä¬ä¬ûã¬ôã¬íã¬æã¬ßã¬Øã¬Ñã¬Êã¬Ã㬼㬵㬮㬧㬠㬙㬒㬋㬄ã¬}ã¬vã¬oã¬hã¬aã¬Zã¬Sã¬Lã¬Eã¬>ã¬7ã¬0ã¬)ã¬"ã¬ã¬ã¬ ã¬ã¬ÿâ¬øâ¬ñâ¬êâ¬ãâ¬Üâ¬Õâ¬Îâ¬Çâ¬À⬹⬲⬫⬤â¬â¬–â¬â¬ˆâ¬â¬zâ¬sâ¬lâ¬eâ¬^â¬Wâ¬Pâ¬Iâ¬Bâ¬;â¬4â¬-â¬&â¬â¬â¬â¬ â¬â¬üá¬õá¬îá¬çá¬àá¬Ùá¬Òá¬Ëá¬Äᬽᬶᬯᬨᬡᬚᬓᬌᬅá¬~á¬wá¬pá¬iá¬bá¬[á¬Tá¬Má¬Fá¬?á¬8á¬1á¬*á¬#á¬á¬á¬á¬á¬á¬ùà¬òà¬ëà¬äà¬Ýà¬Öà¬Ïà¬Èà¬Á଺ଳବଥଞଗà¬à¬‰à¬‚à¬{à¬tà¬mà¬fà¬_à¬Xà¬Qà¬Jà¬Cà¬<à¬5à¬.à¬'ଠà¬à¬à¬ à¬à¬ý߬ö߬ï߬è߬á߬Ú߬Ó߬Ì߬Å߬¾ß¬·ß¬°ß¬©ß¬¢ß¬›ß¬”߬߬†ß¬߬x߬q߬j߬c߬\߬U߬N߬G߬@߬9߬2߬+߬$߬߬߬߬߬߬úÞ¬óÞ¬ìÞ¬åÞ¬ÞÞ¬×Þ¬ÐÞ¬ÉÞ¬ÂÞ¬»Þ¬´Þ¬­Þ¬¦Þ¬ŸÞ¬˜Þ¬‘Þ¬ŠÞ¬ƒÞ¬|Þ¬uÞ¬nÞ¬gÞ¬`Þ¬YÞ¬RÞ¬KÞ¬DÞ¬=Þ¬6Þ¬/Þ¬(Þ¬!Þ¬Þ¬Þ¬ Þ¬Þ¬þݬ÷ݬðݬéݬâݬÛݬÔݬÍݬÆÝ¬¿Ý¬¸Ý¬±Ý¬ªÝ¬£Ý¬œÝ¬•ݬŽÝ¬‡Ý¬€Ý¬yݬrݬkݬdݬ]ݬVݬOݬHݬAݬ:ݬ3ݬ,ݬ%ݬݬݬݬ ݬݬûܬôܬíܬæÜ¬ßܬØÜ¬ÑܬÊܬÃܬ¼Ü¬µÜ¬®Ü¬§Ü¬ Ü¬™Ü¬’ܬ‹Ü¬„ܬ}ܬvܬoܬhܬaܬZܬSܬLܬEܬ>ܬ7ܬ0ܬ)ܬ"ܬܬܬ ܬܬÿÛ¬øÛ¬ñÛ¬êÛ¬ãÛ¬ÜÛ¬ÕÛ¬ÎÛ¬ÇÛ¬ÀÛ¬¹Û¬²Û¬«Û¬¤Û¬Û¬–Û¬Û¬ˆÛ¬Û¬zÛ¬sÛ¬lÛ¬eÛ¬^Û¬WÛ¬PÛ¬IÛ¬BÛ¬;Û¬4Û¬-Û¬&Û¬Û¬Û¬Û¬ Û¬Û¬üÚ¬õÚ¬îÚ¬çÚ¬àÚ¬ÙÚ¬ÒÚ¬ËÚ¬ÄÚ¬½Ú¬¶Ú¬¯Ú¬¨Ú¬¡Ú¬šÚ¬“Ú¬ŒÚ¬…Ú¬~Ú¬wÚ¬pÚ¬iÚ¬bÚ¬[Ú¬TÚ¬MÚ¬FÚ¬?Ú¬8Ú¬1Ú¬*Ú¬#Ú¬Ú¬Ú¬Ú¬Ú¬Ú¬ùÙ¬òÙ¬ëÙ¬äÙ¬ÝÙ¬ÖÙ¬ÏÙ¬ÈÙ¬ÁÙ¬ºÙ¬³Ù¬¬Ù¬¥Ù¬žÙ¬—٬٬‰Ù¬‚Ù¬{Ù¬tÙ¬mÙ¬fÙ¬_Ù¬XÙ¬QÙ¬JÙ¬CÙ¬<Ù¬5Ù¬.Ù¬'Ù¬ ٬٬٬ ٬٬ýجöجïØ¬èØ¬áØ¬ÚØ¬ÓØ¬ÌØ¬Åج¾Ø¬·Ø¬°Ø¬©Ø¬¢Ø¬›Ø¬”جج†Ø¬جxجqجjجcج\جUجNجGج@ج9ج2ج+ج$ججججججú׬ó׬ì׬å׬Þ׬×׬Ð׬É׬Â׬»×¬´×¬­×¬¦×¬Ÿ×¬˜×¬‘׬Š×¬ƒ×¬|׬u׬n׬g׬`׬Y׬R׬K׬D׬=׬6׬/׬(׬!׬׬׬ ׬׬þÖ¬÷Ö¬ðÖ¬éÖ¬âÖ¬ÛÖ¬ÔÖ¬ÍÖ¬ÆÖ¬¿Ö¬¸Ö¬±Ö¬ªÖ¬£Ö¬œÖ¬•Ö¬ŽÖ¬‡Ö¬€Ö¬yÖ¬rÖ¬kÖ¬dÖ¬]Ö¬VÖ¬OÖ¬HÖ¬AÖ¬:Ö¬3Ö¬,Ö¬%Ö¬Ö¬Ö¬Ö¬ Ö¬Ö¬ûÕ¬ôÕ¬íÕ¬æÕ¬ßÕ¬ØÕ¬ÑÕ¬ÊÕ¬ÃÕ¬¼Õ¬µÕ¬®Õ¬§Õ¬ Õ¬™Õ¬’Õ¬‹Õ¬„Õ¬}Õ¬vÕ¬oÕ¬hÕ¬aÕ¬ZÕ¬SÕ¬LÕ¬EÕ¬>Õ¬7Õ¬0Õ¬)Õ¬"Õ¬Õ¬Õ¬ Õ¬Õ¬ÿÔ¬øÔ¬ñÔ¬êÔ¬ãÔ¬ÜÔ¬ÕÔ¬ÎÔ¬ÇÔ¬ÀÔ¬¹Ô¬²Ô¬«Ô¬¤Ô¬Ô¬–Ô¬Ô¬ˆÔ¬Ô¬zÔ¬sÔ¬lÔ¬eÔ¬^Ô¬WÔ¬PÔ¬IÔ¬BÔ¬;Ô¬4Ô¬-Ô¬&Ô¬Ô¬Ô¬Ô¬ Ô¬Ô¬üÓ¬õÓ¬îÓ¬çÓ¬àÓ¬ÙÓ¬ÒÓ¬ËÓ¬ÄÓ¬½Ó¬¶Ó¬¯Ó¬¨Ó¬¡Ó¬šÓ¬“Ó¬ŒÓ¬…Ó¬~Ó¬wÓ¬pÓ¬iÓ¬bÓ¬[Ó¬TÓ¬MÓ¬FÓ¬?Ó¬8Ó¬1Ó¬*Ó¬#Ó¬Ó¬Ó¬Ó¬Ó¬Ó¬ùÒ¬òÒ¬ëÒ¬äÒ¬ÝÒ¬ÖÒ¬ÏÒ¬ÈÒ¬ÁÒ¬ºÒ¬³Ò¬¬Ò¬¥Ò¬žÒ¬—Ò¬Ò¬‰Ò¬‚Ò¬{Ò¬tÒ¬mÒ¬fÒ¬_Ò¬XÒ¬QÒ¬JÒ¬CÒ¬<Ò¬5Ò¬.Ò¬'Ò¬ Ò¬Ò¬Ò¬ Ò¬Ò¬ýѬöѬïѬèѬáѬÚѬÓѬÌѬÅѬ¾Ñ¬·Ñ¬°Ñ¬©Ñ¬¢Ñ¬›Ñ¬”ѬѬ†Ñ¬ѬxѬqѬjѬcѬ\ѬUѬNѬGѬ@Ѭ9Ѭ2Ѭ+Ѭ$ѬѬѬѬѬѬúЬóЬìЬåЬÞЬ×ЬÐЬÉЬÂЬ»Ð¬´Ð¬­Ð¬¦Ð¬ŸÐ¬˜Ð¬‘ЬŠÐ¬ƒÐ¬|ЬuЬnЬgЬ`ЬYЬRЬKЬDЬ=Ь6Ь/Ь(Ь!ЬЬЬ ЬЬþϬ÷ϬðϬéϬâϬÛϬÔϬÍϬÆÏ¬¿Ï¬¸Ï¬±Ï¬ªÏ¬£Ï¬œÏ¬•ϬŽÏ¬‡Ï¬€Ï¬yϬrϬkϬdϬ]ϬVϬOϬHϬAϬ:Ϭ3Ϭ,Ϭ%ϬϬϬϬ ϬϬûάôάíάæÎ¬ßάØÎ¬ÑάÊάÃά¼Î¬µÎ¬®Î¬§Î¬ Î¬™Î¬’ά‹Î¬„ά}άvάoάhάaάZάSάLάEά>ά7ά0ά)ά"άάά άάÿͬøÍ¬ñͬêͬãͬÜͬÕͬÎͬÇͬÀͬ¹Í¬²Í¬«Í¬¤Í¬ͬ–ͬͬˆÍ¬ͬzͬsͬlͬeͬ^ͬWͬPͬIͬBͬ;ͬ4ͬ-ͬ&ͬͬͬͬ ͬͬü̬õ̬î̬ç̬à̬Ù̬Ò̬Ë̬Ä̬½Ì¬¶Ì¬¯Ì¬¨Ì¬¡Ì¬šÌ¬“̬ŒÌ¬…̬~̬w̬p̬i̬b̬[̬T̬M̬F̬?̬8̬1̬*̬#̬̬̬̬̬̬ùˬòˬëˬäˬÝˬÖˬÏˬÈˬÁˬºË¬³Ë¬¬Ë¬¥Ë¬žË¬—ˬˬ‰Ë¬‚ˬ{ˬtˬmˬfˬ_ˬXˬQˬJˬCˬ<ˬ5ˬ.ˬ'ˬ ˬˬˬ ˬˬýʬöʬïʬèʬáʬÚʬÓʬÌʬÅʬ¾Ê¬·Ê¬°Ê¬©Ê¬¢Ê¬›Ê¬”ʬʬ†Ê¬ʬxʬqʬjʬcʬ\ʬUʬNʬGʬ@ʬ9ʬ2ʬ+ʬ$ʬʬʬʬʬʬúɬóɬìɬåɬÞɬ×ɬÐɬÉɬÂɬ»É¬´É¬­É¬¦É¬ŸÉ¬˜É¬‘ɬŠÉ¬ƒÉ¬|ɬuɬnɬgɬ`ɬYɬRɬKɬDɬ=ɬ6ɬ/ɬ(ɬ!ɬɬɬ ɬɬþȬ÷ȬðȬéȬâȬÛȬÔȬÍȬÆÈ¬¿È¬¸È¬±È¬ªÈ¬£È¬œÈ¬•ȬŽÈ¬‡È¬€È¬yȬrȬkȬdȬ]ȬVȬOȬHȬAȬ:Ȭ3Ȭ,Ȭ%ȬȬȬȬ ȬȬûǬôǬíǬæÇ¬ßǬØÇ¬ÑǬÊǬÃǬ¼Ç¬µÇ¬®Ç¬§Ç¬ Ç¬™Ç¬’Ǭ‹Ç¬„Ǭ}ǬvǬoǬhǬaǬZǬSǬLǬEǬ>Ǭ7Ǭ0Ǭ)Ǭ"ǬǬǬ ǬǬÿƬøÆ¬ñƬêÆ¬ãÆ¬ÜÆ¬ÕÆ¬ÎÆ¬ÇƬÀƬ¹Æ¬²Æ¬«Æ¬¤Æ¬Ƭ–ƬƬˆÆ¬ƬzƬsƬlƬeƬ^ƬWƬPƬIƬBƬ;Ƭ4Ƭ-Ƭ&ƬƬƬƬ ƬƬüŬõŬîŬçŬàŬÙŬÒŬËŬÄŬ½Å¬¶Å¬¯Å¬¨Å¬¡Å¬šÅ¬“ŬŒÅ¬…Ŭ~ŬwŬpŬiŬbŬ[ŬTŬMŬFŬ?Ŭ8Ŭ1Ŭ*Ŭ#ŬŬŬŬŬŬùĬòĬëĬäĬÝĬÖĬÏĬÈĬÁĬºÄ¬³Ä¬¬Ä¬¥Ä¬žÄ¬—ĬĬ‰Ä¬‚Ĭ{ĬtĬmĬfĬ_ĬXĬQĬJĬCĬ<Ĭ5Ĭ.Ĭ'Ĭ ĬĬĬ ĬĬýìöìïìèìáìÚìÓìÌìÅì¾Ã¬·Ã¬°Ã¬©Ã¬¢Ã¬›Ã¬”ìì†Ã¬ìxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììú¬ó¬ì¬å¬Þ¬׬Ьɬ¬»Â¬´Â¬­Â¬¦Â¬ŸÂ¬˜Â¬‘¬ŠÂ¬ƒÂ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þÁ¬÷Á¬ðÁ¬éÁ¬âÁ¬ÛÁ¬ÔÁ¬ÍÁ¬ÆÁ¬¿Á¬¸Á¬±Á¬ªÁ¬£Á¬œÁ¬•Á¬ŽÁ¬‡Á¬€Á¬yÁ¬rÁ¬kÁ¬dÁ¬]Á¬VÁ¬OÁ¬HÁ¬AÁ¬:Á¬3Á¬,Á¬%Á¬Á¬Á¬Á¬ Á¬Á¬ûÀ¬ôÀ¬íÀ¬æÀ¬ßÀ¬ØÀ¬ÑÀ¬ÊÀ¬ÃÀ¬¼À¬µÀ¬®À¬§À¬ À¬™À¬’À¬‹À¬„À¬}À¬vÀ¬oÀ¬hÀ¬aÀ¬ZÀ¬SÀ¬LÀ¬EÀ¬>À¬7À¬0À¬)À¬"À¬À¬À¬ À¬À¬ÿ¿¬ø¿¬ñ¿¬꿬㿬Ü¿¬Õ¿¬ο¬Ç¿¬À¿¬¹¿¬²¿¬«¿¬¤¿¬¿¬–¿¬¿¬ˆ¿¬¿¬z¿¬s¿¬l¿¬e¿¬^¿¬W¿¬P¿¬I¿¬B¿¬;¿¬4¿¬-¿¬&¿¬¿¬¿¬¿¬ ¿¬¿¬ü¾¬õ¾¬羬ྫྷÙ¾¬Ò¾¬˾¬ľ¬½¾¬¶¾¬¯¾¬¨¾¬¡¾¬š¾¬“¾¬Œ¾¬…¾¬~¾¬w¾¬p¾¬i¾¬b¾¬[¾¬T¾¬M¾¬F¾¬?¾¬8¾¬1¾¬*¾¬#¾¬¾¬¾¬¾¬¾¬¾¬ù½¬ò½¬뽬佬ݽ¬Ö½¬Ͻ¬Ƚ¬Á½¬º½¬³½¬¬½¬¥½¬ž½¬—½¬½¬‰½¬‚½¬{½¬t½¬m½¬f½¬_½¬X½¬Q½¬J½¬C½¬<½¬5½¬.½¬'½¬ ½¬½¬½¬ ½¬½¬ý¼¬ö¼¬L輬ἬÚ¼¬Ó¼¬̼¬ż¬¾¼¬·¼¬°¼¬©¼¬¢¼¬›¼¬”¼¬¼¬†¼¬¼¬x¼¬q¼¬j¼¬c¼¬\¼¬U¼¬N¼¬G¼¬@¼¬9¼¬2¼¬+¼¬$¼¬¼¬¼¬¼¬¼¬¼¬ú»¬ó»¬컬廬Þ»¬×»¬л¬É»¬»¬»»¬´»¬­»¬¦»¬Ÿ»¬˜»¬‘»¬Š»¬ƒ»¬|»¬u»¬n»¬g»¬`»¬Y»¬R»¬K»¬D»¬=»¬6»¬/»¬(»¬!»¬»¬»¬ »¬»¬þº¬÷º¬ðº¬麬⺬Ûº¬Ôº¬ͺ¬ƺ¬¿º¬¸º¬±º¬ªº¬£º¬œº¬•º¬Žº¬‡º¬€º¬yº¬rº¬kº¬dº¬]º¬Vº¬Oº¬Hº¬Aº¬:º¬3º¬,º¬%º¬º¬º¬º¬ º¬º¬û¹¬ô¹¬í¹¬湬ß¹¬ع¬ѹ¬ʹ¬ù¬¼¹¬µ¹¬®¹¬§¹¬ ¹¬™¹¬’¹¬‹¹¬„¹¬}¹¬v¹¬o¹¬h¹¬a¹¬Z¹¬S¹¬L¹¬E¹¬>¹¬7¹¬0¹¬)¹¬"¹¬¹¬¹¬ ¹¬¹¬ÿ¸¬ø¸¬ñ¸¬긬㸬ܸ¬Õ¸¬θ¬Ǹ¬À¸¬¹¸¬²¸¬«¸¬¤¸¬¸¬–¸¬¸¬ˆ¸¬¸¬z¸¬s¸¬l¸¬e¸¬^¸¬W¸¬P¸¬I¸¬B¸¬;¸¬4¸¬-¸¬&¸¬¸¬¸¬¸¬ ¸¬¸¬ü·¬õ·¬î·¬ç·¬à·¬Ù·¬Ò·¬Ë·¬Ä·¬½·¬¶·¬¯·¬¨·¬¡·¬š·¬“·¬Œ·¬…·¬~·¬w·¬p·¬i·¬b·¬[·¬T·¬M·¬F·¬?·¬8·¬1·¬*·¬#·¬·¬·¬·¬·¬·¬ù¶¬ò¶¬붬䶬ݶ¬Ö¶¬϶¬ȶ¬Á¶¬º¶¬³¶¬¬¶¬¥¶¬ž¶¬—¶¬¶¬‰¶¬‚¶¬{¶¬t¶¬m¶¬f¶¬_¶¬X¶¬Q¶¬J¶¬C¶¬<¶¬5¶¬.¶¬'¶¬ ¶¬¶¬¶¬ ¶¬¶¬ýµ¬öµ¬ﵬ赬ᵬÚµ¬Óµ¬̵¬ŵ¬¾µ¬·µ¬°µ¬©µ¬¢µ¬›µ¬”µ¬µ¬†µ¬µ¬xµ¬qµ¬jµ¬cµ¬\µ¬Uµ¬Nµ¬Gµ¬@µ¬9µ¬2µ¬+µ¬$µ¬µ¬µ¬µ¬µ¬µ¬ú´¬ó´¬ì´¬å´¬Þ´¬×´¬д¬É´¬´¬»´¬´´¬­´¬¦´¬Ÿ´¬˜´¬‘´¬Š´¬ƒ´¬|´¬u´¬n´¬g´¬`´¬Y´¬R´¬K´¬D´¬=´¬6´¬/´¬(´¬!´¬´¬´¬ ´¬´¬þ³¬÷³¬ð³¬鳬ⳬÛ³¬Ô³¬ͳ¬Ƴ¬¿³¬¸³¬±³¬ª³¬£³¬œ³¬•³¬޳¬‡³¬€³¬y³¬r³¬k³¬d³¬]³¬V³¬O³¬H³¬A³¬:³¬3³¬,³¬%³¬³¬³¬³¬ ³¬³¬û²¬ô²¬í²¬沬ß²¬ز¬Ѳ¬ʲ¬ò¬¼²¬µ²¬®²¬§²¬ ²¬™²¬’²¬‹²¬„²¬}²¬v²¬o²¬h²¬a²¬Z²¬S²¬L²¬E²¬>²¬7²¬0²¬)²¬"²¬²¬²¬ ²¬²¬ÿ±¬ø±¬ñ±¬걬㱬ܱ¬Õ±¬α¬DZ¬À±¬¹±¬²±¬«±¬¤±¬±¬–±¬±¬ˆ±¬±¬z±¬s±¬l±¬e±¬^±¬W±¬P±¬I±¬B±¬;±¬4±¬-±¬&±¬±¬±¬±¬ ±¬±¬ü°¬õ°¬î°¬ç°¬à°¬Ù°¬Ò°¬˰¬ݬ½°¬¶°¬¯°¬¨°¬¡°¬š°¬“°¬Œ°¬…°¬~°¬w°¬p°¬i°¬b°¬[°¬T°¬M°¬F°¬?°¬8°¬1°¬*°¬#°¬°¬°¬°¬°¬°¬ù¯¬ò¯¬믬䯬ݯ¬Ö¯¬ϯ¬ȯ¬Á¯¬º¯¬³¯¬¬¯¬¥¯¬ž¯¬—¯¬¯¬‰¯¬‚¯¬{¯¬t¯¬m¯¬f¯¬_¯¬X¯¬Q¯¬J¯¬C¯¬<¯¬5¯¬.¯¬'¯¬ ¯¬¯¬¯¬ ¯¬¯¬ý®¬ö®¬ﮬ讬ᮬÚ®¬Ó®¬Ì®¬Å®¬¾®¬·®¬°®¬©®¬¢®¬›®¬”®¬®¬†®¬®¬x®¬q®¬j®¬c®¬\®¬U®¬N®¬G®¬@®¬9®¬2®¬+®¬$®¬®¬®¬®¬®¬®¬ú­¬ó­¬ì­¬å­¬Þ­¬×­¬Э¬É­¬­¬»­¬´­¬­­¬¦­¬Ÿ­¬˜­¬‘­¬Š­¬ƒ­¬|­¬u­¬n­¬g­¬`­¬Y­¬R­¬K­¬D­¬=­¬6­¬/­¬(­¬!­¬­¬­¬ ­¬­¬þ¬¬÷¬¬ð¬¬鬬⬬Û¬¬Ô¬¬ͬ¬Ƭ¬¿¬¬¸¬¬±¬¬ª¬¬£¬¬œ¬¬•¬¬ެ¬‡¬¬€¬¬y¬¬r¬¬k¬¬d¬¬]¬¬V¬¬O¬¬H¬¬A¬¬:¬¬3¬¬,¬¬%¬¬¬¬¬¬¬¬ ¬¬¬¬û«¬ô«¬í«¬櫬ß«¬Ø«¬Ñ«¬Ê«¬ë¬¼«¬µ«¬®«¬§«¬ «¬™«¬’«¬‹«¬„«¬}«¬v«¬o«¬h«¬a«¬Z«¬S«¬L«¬E«¬>«¬7«¬0«¬)«¬"«¬«¬«¬ «¬«¬ÿª¬øª¬ñª¬ꪬ㪬ܪ¬Õª¬Ϊ¬Ǫ¬Àª¬¹ª¬²ª¬«ª¬¤ª¬ª¬–ª¬ª¬ˆª¬ª¬zª¬sª¬lª¬eª¬^ª¬Wª¬Pª¬Iª¬Bª¬;ª¬4ª¬-ª¬&ª¬ª¬ª¬ª¬ ª¬ª¬ü©¬õ©¬穬੬Ù©¬Ò©¬Ë©¬Ä©¬½©¬¶©¬¯©¬¨©¬¡©¬š©¬“©¬Œ©¬…©¬~©¬w©¬p©¬i©¬b©¬[©¬T©¬M©¬F©¬?©¬8©¬1©¬*©¬#©¬©¬©¬©¬©¬©¬ù¨¬ò¨¬먬䨬ݨ¬Ö¨¬Ϩ¬Ȩ¬Á¨¬º¨¬³¨¬¬¨¬¥¨¬ž¨¬—¨¬¨¬‰¨¬‚¨¬{¨¬t¨¬m¨¬f¨¬_¨¬X¨¬Q¨¬J¨¬C¨¬<¨¬5¨¬.¨¬'¨¬ ¨¬¨¬¨¬ ¨¬¨¬ý§¬ö§¬溺觬᧬Ú§¬Ó§¬̧¬ŧ¬¾§¬·§¬°§¬©§¬¢§¬›§¬”§¬§¬†§¬§¬x§¬q§¬j§¬c§¬\§¬U§¬N§¬G§¬@§¬9§¬2§¬+§¬$§¬§¬§¬§¬§¬§¬ú¦¬ó¦¬즬妬Þ¦¬צ¬Ц¬ɦ¬¦¬»¦¬´¦¬­¦¬¦¦¬Ÿ¦¬˜¦¬‘¦¬Ц¬ƒ¦¬|¦¬u¦¬n¦¬g¦¬`¦¬Y¦¬R¦¬K¦¬D¦¬=¦¬6¦¬/¦¬(¦¬!¦¬¦¬¦¬ ¦¬¦¬þ¥¬÷¥¬ð¥¬饬⥬Û¥¬Ô¥¬Í¥¬Æ¥¬¿¥¬¸¥¬±¥¬ª¥¬£¥¬œ¥¬•¥¬Ž¥¬‡¥¬€¥¬y¥¬r¥¬k¥¬d¥¬]¥¬V¥¬O¥¬H¥¬A¥¬:¥¬3¥¬,¥¬%¥¬¥¬¥¬¥¬ ¥¬¥¬û¤¬ô¤¬í¤¬椬ߤ¬ؤ¬Ѥ¬ʤ¬ä¬¼¤¬µ¤¬®¤¬§¤¬ ¤¬™¤¬’¤¬‹¤¬„¤¬}¤¬v¤¬o¤¬h¤¬a¤¬Z¤¬S¤¬L¤¬E¤¬>¤¬7¤¬0¤¬)¤¬"¤¬¤¬¤¬ ¤¬¤¬ÿ£¬ø£¬ñ£¬꣬㣬Ü£¬Õ£¬Σ¬Ç£¬À£¬¹£¬²£¬«£¬¤£¬£¬–£¬£¬ˆ£¬£¬z£¬s£¬l£¬e£¬^£¬W£¬P£¬I£¬B£¬;£¬4£¬-£¬&£¬£¬£¬£¬ £¬£¬ü¢¬õ¢¬碬ࢬÙ¢¬Ò¢¬Ë¢¬Ä¢¬½¢¬¶¢¬¯¢¬¨¢¬¡¢¬š¢¬“¢¬Œ¢¬…¢¬~¢¬w¢¬p¢¬i¢¬b¢¬[¢¬T¢¬M¢¬F¢¬?¢¬8¢¬1¢¬*¢¬#¢¬¢¬¢¬¢¬¢¬¢¬ù¡¬ò¡¬롬䡬Ý¡¬Ö¡¬Ï¡¬È¡¬Á¡¬º¡¬³¡¬¬¡¬¥¡¬ž¡¬—¡¬¡¬‰¡¬‚¡¬{¡¬t¡¬m¡¬f¡¬_¡¬X¡¬Q¡¬J¡¬C¡¬<¡¬5¡¬.¡¬'¡¬ ¡¬¡¬¡¬ ¡¬¡¬ý ¬ö ¬ï ¬è ¬á ¬Ú ¬Ó ¬Ì ¬Å ¬¾ ¬· ¬° ¬© ¬¢ ¬› ¬” ¬ ¬† ¬ ¬x ¬q ¬j ¬c ¬\ ¬U ¬N ¬G ¬@ ¬9 ¬2 ¬+ ¬$ ¬ ¬ ¬ ¬ ¬ ¬úŸ¬óŸ¬쟬埬ÞŸ¬ן¬П¬ÉŸ¬Ÿ¬»Ÿ¬´Ÿ¬­Ÿ¬¦Ÿ¬ŸŸ¬˜Ÿ¬‘Ÿ¬ŠŸ¬ƒŸ¬|Ÿ¬uŸ¬nŸ¬gŸ¬`Ÿ¬YŸ¬RŸ¬KŸ¬DŸ¬=Ÿ¬6Ÿ¬/Ÿ¬(Ÿ¬!Ÿ¬Ÿ¬Ÿ¬ Ÿ¬Ÿ¬þž¬÷ž¬ðž¬鞬➬Ûž¬Ôž¬Íž¬Æž¬¿ž¬¸ž¬±ž¬ªž¬£ž¬œž¬•ž¬Žž¬‡ž¬€ž¬yž¬rž¬kž¬dž¬]ž¬Vž¬Ož¬Hž¬Až¬:ž¬3ž¬,ž¬%ž¬ž¬ž¬ž¬ ž¬ž¬û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿœ¬øœ¬ñœ¬Ꜭ㜬Üœ¬Õœ¬Μ¬Çœ¬Àœ¬¹œ¬²œ¬«œ¬¤œ¬œ¬–œ¬œ¬ˆœ¬œ¬zœ¬sœ¬lœ¬eœ¬^œ¬Wœ¬Pœ¬Iœ¬Bœ¬;œ¬4œ¬-œ¬&œ¬œ¬œ¬œ¬ œ¬œ¬ü›¬õ›¬盬à›¬Ù›¬Ò›¬Ë›¬Ä›¬½›¬¶›¬¯›¬¨›¬¡›¬š›¬“›¬Œ›¬…›¬~›¬w›¬p›¬i›¬b›¬[›¬T›¬M›¬F›¬?›¬8›¬1›¬*›¬#›¬›¬›¬›¬›¬›¬ùš¬òš¬뚬䚬Ýš¬Öš¬Ïš¬Èš¬Áš¬ºš¬³š¬¬š¬¥š¬žš¬—š¬š¬‰š¬‚š¬{š¬tš¬mš¬fš¬_š¬Xš¬Qš¬Jš¬Cš¬<š¬5š¬.š¬'š¬ š¬š¬š¬ š¬š¬ý™¬ö™¬虬ᙬÚ™¬Ó™¬Ì™¬Å™¬¾™¬·™¬°™¬©™¬¢™¬›™¬”™¬™¬†™¬™¬x™¬q™¬j™¬c™¬\™¬U™¬N™¬G™¬@™¬9™¬2™¬+™¬$™¬™¬™¬™¬™¬™¬ú˜¬ó˜¬올嘬Þ˜¬ט¬И¬ɘ¬˜¬»˜¬´˜¬­˜¬¦˜¬Ÿ˜¬˜˜¬‘˜¬Š˜¬ƒ˜¬|˜¬u˜¬n˜¬g˜¬`˜¬Y˜¬R˜¬K˜¬D˜¬=˜¬6˜¬/˜¬(˜¬!˜¬˜¬˜¬ ˜¬˜¬þ—¬÷—¬ð—¬é—¬â—¬Û—¬Ô—¬Í—¬Æ—¬¿—¬¸—¬±—¬ª—¬£—¬œ—¬•—¬Ž—¬‡—¬€—¬y—¬r—¬k—¬d—¬]—¬V—¬O—¬H—¬A—¬:—¬3—¬,—¬%—¬—¬—¬—¬ —¬—¬û–¬ô–¬í–¬æ–¬ß–¬Ø–¬Ñ–¬Ê–¬Ö¬¼–¬µ–¬®–¬§–¬ –¬™–¬’–¬‹–¬„–¬}–¬v–¬o–¬h–¬a–¬Z–¬S–¬L–¬E–¬>–¬7–¬0–¬)–¬"–¬–¬–¬ –¬–¬ÿ•¬ø•¬ñ•¬ꕬ㕬Ü•¬Õ•¬Ε¬Ç•¬À•¬¹•¬²•¬«•¬¤•¬•¬–•¬•¬ˆ•¬•¬z•¬s•¬l•¬e•¬^•¬W•¬P•¬I•¬B•¬;•¬4•¬-•¬&•¬•¬•¬•¬ •¬•¬ü”¬õ”¬甬à”¬Ù”¬Ò”¬Ë”¬Ä”¬½”¬¶”¬¯”¬¨”¬¡”¬š”¬“”¬Œ”¬…”¬~”¬w”¬p”¬i”¬b”¬[”¬T”¬M”¬F”¬?”¬8”¬1”¬*”¬#”¬”¬”¬”¬”¬”¬ù“¬ò“¬듬䓬Ý“¬Ö“¬Ï“¬È“¬Á“¬º“¬³“¬¬“¬¥“¬ž“¬—“¬“¬‰“¬‚“¬{“¬t“¬m“¬f“¬_“¬X“¬Q“¬J“¬C“¬<“¬5“¬.“¬'“¬ “¬“¬“¬ “¬“¬ý’¬ö’¬ï’¬è’¬á’¬Ú’¬Ó’¬Ì’¬Å’¬¾’¬·’¬°’¬©’¬¢’¬›’¬”’¬’¬†’¬’¬x’¬q’¬j’¬c’¬\’¬U’¬N’¬G’¬@’¬9’¬2’¬+’¬$’¬’¬’¬’¬’¬’¬ú‘¬ó‘¬쑬呬Þ‘¬ב¬Б¬É‘¬‘¬»‘¬´‘¬­‘¬¦‘¬Ÿ‘¬˜‘¬‘‘¬Š‘¬ƒ‘¬|‘¬u‘¬n‘¬g‘¬`‘¬Y‘¬R‘¬K‘¬D‘¬=‘¬6‘¬/‘¬(‘¬!‘¬‘¬‘¬ ‘¬‘¬þ¬÷¬ð¬é¬â¬Û¬Ô¬ͬƬ¿¬¸¬±¬ª¬£¬œ¬•¬ެ‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿެøŽ¬ñެꎬ㎬ÜŽ¬ÕŽ¬ÎŽ¬ÇެÀެ¹Ž¬²Ž¬«Ž¬¤Ž¬ެ–ެެˆŽ¬ެzެsެlެeެ^ެWެPެIެBެ;ެ4ެ-ެ&ެެެެ ެެü¬õ¬î¬ç¬à¬Ù¬Ò¬ˬĬ½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ùŒ¬òŒ¬댬䌬ÝŒ¬ÖŒ¬ÏŒ¬ÈŒ¬ÁŒ¬ºŒ¬³Œ¬¬Œ¬¥Œ¬žŒ¬—Œ¬Œ¬‰Œ¬‚Œ¬{Œ¬tŒ¬mŒ¬fŒ¬_Œ¬XŒ¬QŒ¬JŒ¬CŒ¬<Œ¬5Œ¬.Œ¬'Œ¬ Œ¬Œ¬Œ¬ Œ¬Œ¬ý‹¬ö‹¬苬ዬÚ‹¬Ó‹¬Ì‹¬Å‹¬¾‹¬·‹¬°‹¬©‹¬¢‹¬›‹¬”‹¬‹¬†‹¬‹¬x‹¬q‹¬j‹¬c‹¬\‹¬U‹¬N‹¬G‹¬@‹¬9‹¬2‹¬+‹¬$‹¬‹¬‹¬‹¬‹¬‹¬úЬóЬ슬劬ÞŠ¬׊¬Њ¬ÉŠ¬Ь»Š¬´Š¬­Š¬¦Š¬ŸŠ¬˜Š¬‘ЬŠŠ¬ƒŠ¬|ЬuЬnЬgЬ`ЬYЬRЬKЬDЬ=Ь6Ь/Ь(Ь!ЬЬЬ ЬЬþ‰¬÷‰¬ð‰¬鉬≬Û‰¬Ô‰¬͉¬Ɖ¬¿‰¬¸‰¬±‰¬ª‰¬£‰¬œ‰¬•‰¬މ¬‡‰¬€‰¬y‰¬r‰¬k‰¬d‰¬]‰¬V‰¬O‰¬H‰¬A‰¬:‰¬3‰¬,‰¬%‰¬‰¬‰¬‰¬ ‰¬‰¬ûˆ¬ôˆ¬투戬߈¬؈¬ш¬ʈ¬Ȭ¼ˆ¬µˆ¬®ˆ¬§ˆ¬ ˆ¬™ˆ¬’ˆ¬‹ˆ¬„ˆ¬}ˆ¬vˆ¬oˆ¬hˆ¬aˆ¬Zˆ¬Sˆ¬Lˆ¬Eˆ¬>ˆ¬7ˆ¬0ˆ¬)ˆ¬"ˆ¬ˆ¬ˆ¬ ˆ¬ˆ¬ÿ‡¬ø‡¬ñ‡¬ꇬ㇬܇¬Õ‡¬·¬LJ¬À‡¬¹‡¬²‡¬«‡¬¤‡¬‡¬–‡¬‡¬ˆ‡¬‡¬z‡¬s‡¬l‡¬e‡¬^‡¬W‡¬P‡¬I‡¬B‡¬;‡¬4‡¬-‡¬&‡¬‡¬‡¬‡¬ ‡¬‡¬ü†¬õ†¬熬à†¬Ù†¬Ò†¬ˆ¬Ƭ½†¬¶†¬¯†¬¨†¬¡†¬š†¬“†¬Œ†¬…†¬~†¬w†¬p†¬i†¬b†¬[†¬T†¬M†¬F†¬?†¬8†¬1†¬*†¬#†¬†¬†¬†¬†¬†¬ù…¬ò…¬ë…¬ä…¬Ý…¬Ö…¬Ï…¬È…¬Á…¬º…¬³…¬¬…¬¥…¬ž…¬—…¬…¬‰…¬‚…¬{…¬t…¬m…¬f…¬_…¬X…¬Q…¬J…¬C…¬<…¬5…¬.…¬'…¬ …¬…¬…¬ …¬…¬ý„¬ö„¬脬ᄬÚ„¬Ó„¬Ì„¬Å„¬¾„¬·„¬°„¬©„¬¢„¬›„¬”„¬„¬†„¬„¬x„¬q„¬j„¬c„¬\„¬U„¬N„¬G„¬@„¬9„¬2„¬+„¬$„¬„¬„¬„¬„¬„¬úƒ¬óƒ¬샬僬Þƒ¬׃¬Ѓ¬Ƀ¬ƒ¬»ƒ¬´ƒ¬­ƒ¬¦ƒ¬Ÿƒ¬˜ƒ¬‘ƒ¬Šƒ¬ƒƒ¬|ƒ¬uƒ¬nƒ¬gƒ¬`ƒ¬Yƒ¬Rƒ¬Kƒ¬Dƒ¬=ƒ¬6ƒ¬/ƒ¬(ƒ¬!ƒ¬ƒ¬ƒ¬ ƒ¬ƒ¬þ‚¬÷‚¬ð‚¬邬€Û‚¬Ô‚¬Í‚¬Æ‚¬¿‚¬¸‚¬±‚¬ª‚¬£‚¬œ‚¬•‚¬Ž‚¬‡‚¬€‚¬y‚¬r‚¬k‚¬d‚¬]‚¬V‚¬O‚¬H‚¬A‚¬:‚¬3‚¬,‚¬%‚¬‚¬‚¬‚¬ ‚¬‚¬û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ€¬ø€¬ñ€¬ꀬ〬Ü€¬Õ€¬΀¬Ç€¬À€¬¹€¬²€¬«€¬¤€¬€¬–€¬€¬ˆ€¬€¬z€¬s€¬l€¬e€¬^€¬W€¬P€¬I€¬B€¬;€¬4€¬-€¬&€¬€¬€¬€¬ €¬€¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù~¬ò~¬ë~¬ä~¬Ý~¬Ö~¬Ï~¬È~¬Á~¬º~¬³~¬¬~¬¥~¬ž~¬—~¬~¬‰~¬‚~¬{~¬t~¬m~¬f~¬_~¬X~¬Q~¬J~¬C~¬<~¬5~¬.~¬'~¬ ~¬~¬~¬ ~¬~¬ý}¬ö}¬ï}¬è}¬á}¬Ú}¬Ó}¬Ì}¬Å}¬¾}¬·}¬°}¬©}¬¢}¬›}¬”}¬}¬†}¬}¬x}¬q}¬j}¬c}¬\}¬U}¬N}¬G}¬@}¬9}¬2}¬+}¬$}¬}¬}¬}¬}¬}¬ú|¬ó|¬ì|¬å|¬Þ|¬×|¬Ð|¬É|¬Â|¬»|¬´|¬­|¬¦|¬Ÿ|¬˜|¬‘|¬Š|¬ƒ|¬||¬u|¬n|¬g|¬`|¬Y|¬R|¬K|¬D|¬=|¬6|¬/|¬(|¬!|¬|¬|¬ |¬|¬þ{¬÷{¬ð{¬é{¬â{¬Û{¬Ô{¬Í{¬Æ{¬¿{¬¸{¬±{¬ª{¬£{¬œ{¬•{¬Ž{¬‡{¬€{¬y{¬r{¬k{¬d{¬]{¬V{¬O{¬H{¬A{¬:{¬3{¬,{¬%{¬{¬{¬{¬ {¬{¬ûz¬ôz¬íz¬æz¬ßz¬Øz¬Ñz¬Êz¬Ãz¬¼z¬µz¬®z¬§z¬ z¬™z¬’z¬‹z¬„z¬}z¬vz¬oz¬hz¬az¬Zz¬Sz¬Lz¬Ez¬>z¬7z¬0z¬)z¬"z¬z¬z¬ z¬z¬ÿy¬øy¬ñy¬êy¬ãy¬Üy¬Õy¬Îy¬Çy¬Ày¬¹y¬²y¬«y¬¤y¬y¬–y¬y¬ˆy¬y¬zy¬sy¬ly¬ey¬^y¬Wy¬Py¬Iy¬By¬;y¬4y¬-y¬&y¬y¬y¬y¬ y¬y¬üx¬õx¬îx¬çx¬àx¬Ùx¬Òx¬Ëx¬Äx¬½x¬¶x¬¯x¬¨x¬¡x¬šx¬“x¬Œx¬…x¬~x¬wx¬px¬ix¬bx¬[x¬Tx¬Mx¬Fx¬?x¬8x¬1x¬*x¬#x¬x¬x¬x¬x¬x¬ùw¬òw¬ëw¬äw¬Ýw¬Öw¬Ïw¬Èw¬Áw¬ºw¬³w¬¬w¬¥w¬žw¬—w¬w¬‰w¬‚w¬{w¬tw¬mw¬fw¬_w¬Xw¬Qw¬Jw¬Cw¬s¬7s¬0s¬)s¬"s¬s¬s¬ s¬s¬ÿr¬ør¬ñr¬êr¬ãr¬Ür¬Õr¬Îr¬Çr¬Àr¬¹r¬²r¬«r¬¤r¬r¬–r¬r¬ˆr¬r¬zr¬sr¬lr¬er¬^r¬Wr¬Pr¬Ir¬Br¬;r¬4r¬-r¬&r¬r¬r¬r¬ r¬r¬üq¬õq¬îq¬çq¬àq¬Ùq¬Òq¬Ëq¬Äq¬½q¬¶q¬¯q¬¨q¬¡q¬šq¬“q¬Œq¬…q¬~q¬wq¬pq¬iq¬bq¬[q¬Tq¬Mq¬Fq¬?q¬8q¬1q¬*q¬#q¬q¬q¬q¬q¬q¬ùp¬òp¬ëp¬äp¬Ýp¬Öp¬Ïp¬Èp¬Áp¬ºp¬³p¬¬p¬¥p¬žp¬—p¬p¬‰p¬‚p¬{p¬tp¬mp¬fp¬_p¬Xp¬Qp¬Jp¬Cp¬l¬7l¬0l¬)l¬"l¬l¬l¬ l¬l¬ÿk¬øk¬ñk¬êk¬ãk¬Ük¬Õk¬Îk¬Çk¬Àk¬¹k¬²k¬«k¬¤k¬k¬–k¬k¬ˆk¬k¬zk¬sk¬lk¬ek¬^k¬Wk¬Pk¬Ik¬Bk¬;k¬4k¬-k¬&k¬k¬k¬k¬ k¬k¬üj¬õj¬îj¬çj¬àj¬Ùj¬Òj¬Ëj¬Äj¬½j¬¶j¬¯j¬¨j¬¡j¬šj¬“j¬Œj¬…j¬~j¬wj¬pj¬ij¬bj¬[j¬Tj¬Mj¬Fj¬?j¬8j¬1j¬*j¬#j¬j¬j¬j¬j¬j¬ùi¬òi¬ëi¬äi¬Ýi¬Öi¬Ïi¬Èi¬Ái¬ºi¬³i¬¬i¬¥i¬ži¬—i¬i¬‰i¬‚i¬{i¬ti¬mi¬fi¬_i¬Xi¬Qi¬Ji¬Ci¬e¬7e¬0e¬)e¬"e¬e¬e¬ e¬e¬ÿd¬ød¬ñd¬êd¬ãd¬Üd¬Õd¬Îd¬Çd¬Àd¬¹d¬²d¬«d¬¤d¬d¬–d¬d¬ˆd¬d¬zd¬sd¬ld¬ed¬^d¬Wd¬Pd¬Id¬Bd¬;d¬4d¬-d¬&d¬d¬d¬d¬ d¬d¬üc¬õc¬îc¬çc¬àc¬Ùc¬Òc¬Ëc¬Äc¬½c¬¶c¬¯c¬¨c¬¡c¬šc¬“c¬Œc¬…c¬~c¬wc¬pc¬ic¬bc¬[c¬Tc¬Mc¬Fc¬?c¬8c¬1c¬*c¬#c¬c¬c¬c¬c¬c¬ùb¬òb¬ëb¬äb¬Ýb¬Öb¬Ïb¬Èb¬Áb¬ºb¬³b¬¬b¬¥b¬žb¬—b¬b¬‰b¬‚b¬{b¬tb¬mb¬fb¬_b¬Xb¬Qb¬Jb¬Cb¬^¬7^¬0^¬)^¬"^¬^¬^¬ ^¬^¬ÿ]¬ø]¬ñ]¬ê]¬ã]¬Ü]¬Õ]¬Î]¬Ç]¬À]¬¹]¬²]¬«]¬¤]¬]¬–]¬]¬ˆ]¬]¬z]¬s]¬l]¬e]¬^]¬W]¬P]¬I]¬B]¬;]¬4]¬-]¬&]¬]¬]¬]¬ ]¬]¬ü\¬õ\¬î\¬ç\¬à\¬Ù\¬Ò\¬Ë\¬Ä\¬½\¬¶\¬¯\¬¨\¬¡\¬š\¬“\¬Œ\¬…\¬~\¬w\¬p\¬i\¬b\¬[\¬T\¬M\¬F\¬?\¬8\¬1\¬*\¬#\¬\¬\¬\¬\¬\¬ù[¬ò[¬ë[¬ä[¬Ý[¬Ö[¬Ï[¬È[¬Á[¬º[¬³[¬¬[¬¥[¬ž[¬—[¬[¬‰[¬‚[¬{[¬t[¬m[¬f[¬_[¬X[¬Q[¬J[¬C[¬<[¬5[¬.[¬'[¬ [¬[¬[¬ [¬[¬ýZ¬öZ¬ïZ¬èZ¬áZ¬ÚZ¬ÓZ¬ÌZ¬ÅZ¬¾Z¬·Z¬°Z¬©Z¬¢Z¬›Z¬”Z¬Z¬†Z¬Z¬xZ¬qZ¬jZ¬cZ¬\Z¬UZ¬NZ¬GZ¬@Z¬9Z¬2Z¬+Z¬$Z¬Z¬Z¬Z¬Z¬Z¬úY¬óY¬ìY¬åY¬ÞY¬×Y¬ÐY¬ÉY¬ÂY¬»Y¬´Y¬­Y¬¦Y¬ŸY¬˜Y¬‘Y¬ŠY¬ƒY¬|Y¬uY¬nY¬gY¬`Y¬YY¬RY¬KY¬DY¬=Y¬6Y¬/Y¬(Y¬!Y¬Y¬Y¬ Y¬Y¬þX¬÷X¬ðX¬éX¬âX¬ÛX¬ÔX¬ÍX¬ÆX¬¿X¬¸X¬±X¬ªX¬£X¬œX¬•X¬ŽX¬‡X¬€X¬yX¬rX¬kX¬dX¬]X¬VX¬OX¬HX¬AX¬:X¬3X¬,X¬%X¬X¬X¬X¬ X¬X¬ûW¬ôW¬íW¬æW¬ßW¬ØW¬ÑW¬ÊW¬ÃW¬¼W¬µW¬®W¬§W¬ W¬™W¬’W¬‹W¬„W¬}W¬vW¬oW¬hW¬aW¬ZW¬SW¬LW¬EW¬>W¬7W¬0W¬)W¬"W¬W¬W¬ W¬W¬ÿV¬øV¬ñV¬êV¬ãV¬ÜV¬ÕV¬ÎV¬ÇV¬ÀV¬¹V¬²V¬«V¬¤V¬V¬–V¬V¬ˆV¬V¬zV¬sV¬lV¬eV¬^V¬WV¬PV¬IV¬BV¬;V¬4V¬-V¬&V¬V¬V¬V¬ V¬V¬üU¬õU¬îU¬çU¬àU¬ÙU¬ÒU¬ËU¬ÄU¬½U¬¶U¬¯U¬¨U¬¡U¬šU¬“U¬ŒU¬…U¬~U¬wU¬pU¬iU¬bU¬[U¬TU¬MU¬FU¬?U¬8U¬1U¬*U¬#U¬U¬U¬U¬U¬U¬ùT¬òT¬ëT¬äT¬ÝT¬ÖT¬ÏT¬ÈT¬ÁT¬ºT¬³T¬¬T¬¥T¬žT¬—T¬T¬‰T¬‚T¬{T¬tT¬mT¬fT¬_T¬XT¬QT¬JT¬CT¬P¬7P¬0P¬)P¬"P¬P¬P¬ P¬P¬ÿO¬øO¬ñO¬êO¬ãO¬ÜO¬ÕO¬ÎO¬ÇO¬ÀO¬¹O¬²O¬«O¬¤O¬O¬–O¬O¬ˆO¬O¬zO¬sO¬lO¬eO¬^O¬WO¬PO¬IO¬BO¬;O¬4O¬-O¬&O¬O¬O¬O¬ O¬O¬üN¬õN¬îN¬çN¬àN¬ÙN¬ÒN¬ËN¬ÄN¬½N¬¶N¬¯N¬¨N¬¡N¬šN¬“N¬ŒN¬…N¬~N¬wN¬pN¬iN¬bN¬[N¬TN¬MN¬FN¬?N¬8N¬1N¬*N¬#N¬N¬N¬N¬N¬N¬ùM¬òM¬ëM¬äM¬ÝM¬ÖM¬ÏM¬ÈM¬ÁM¬ºM¬³M¬¬M¬¥M¬žM¬—M¬M¬‰M¬‚M¬{M¬tM¬mM¬fM¬_M¬XM¬QM¬JM¬CM¬I¬7I¬0I¬)I¬"I¬I¬I¬ I¬I¬ÿH¬øH¬ñH¬êH¬ãH¬ÜH¬ÕH¬ÎH¬ÇH¬ÀH¬¹H¬²H¬«H¬¤H¬H¬–H¬H¬ˆH¬H¬zH¬sH¬lH¬eH¬^H¬WH¬PH¬IH¬BH¬;H¬4H¬-H¬&H¬H¬H¬H¬ H¬H¬üG¬õG¬îG¬çG¬àG¬ÙG¬ÒG¬ËG¬ÄG¬½G¬¶G¬¯G¬¨G¬¡G¬šG¬“G¬ŒG¬…G¬~G¬wG¬pG¬iG¬bG¬[G¬TG¬MG¬FG¬?G¬8G¬1G¬*G¬#G¬G¬G¬G¬G¬G¬ùF¬òF¬ëF¬äF¬ÝF¬ÖF¬ÏF¬ÈF¬ÁF¬ºF¬³F¬¬F¬¥F¬žF¬—F¬F¬‰F¬‚F¬{F¬tF¬mF¬fF¬_F¬XF¬QF¬JF¬CF¬B¬7B¬0B¬)B¬"B¬B¬B¬ B¬B¬ÿA¬øA¬ñA¬êA¬ãA¬ÜA¬ÕA¬ÎA¬ÇA¬ÀA¬¹A¬²A¬«A¬¤A¬A¬–A¬A¬ˆA¬A¬zA¬sA¬lA¬eA¬^A¬WA¬PA¬IA¬BA¬;A¬4A¬-A¬&A¬A¬A¬A¬ A¬A¬ü@¬õ@¬î@¬ç@¬à@¬Ù@¬Ò@¬Ë@¬Ä@¬½@¬¶@¬¯@¬¨@¬¡@¬š@¬“@¬Œ@¬…@¬~@¬w@¬p@¬i@¬b@¬[@¬T@¬M@¬F@¬?@¬8@¬1@¬*@¬#@¬@¬@¬@¬@¬@¬ù?¬ò?¬ë?¬ä?¬Ý?¬Ö?¬Ï?¬È?¬Á?¬º?¬³?¬¬?¬¥?¬ž?¬—?¬?¬‰?¬‚?¬{?¬t?¬m?¬f?¬_?¬X?¬Q?¬J?¬C?¬¬ö>¬ï>¬è>¬á>¬Ú>¬Ó>¬Ì>¬Å>¬¾>¬·>¬°>¬©>¬¢>¬›>¬”>¬>¬†>¬>¬x>¬q>¬j>¬c>¬\>¬U>¬N>¬G>¬@>¬9>¬2>¬+>¬$>¬>¬>¬>¬>¬>¬ú=¬ó=¬ì=¬å=¬Þ=¬×=¬Ð=¬É=¬Â=¬»=¬´=¬­=¬¦=¬Ÿ=¬˜=¬‘=¬Š=¬ƒ=¬|=¬u=¬n=¬g=¬`=¬Y=¬R=¬K=¬D=¬==¬6=¬/=¬(=¬!=¬=¬=¬ =¬=¬þ<¬÷<¬ð<¬é<¬â<¬Û<¬Ô<¬Í<¬Æ<¬¿<¬¸<¬±<¬ª<¬£<¬œ<¬•<¬Ž<¬‡<¬€<¬y<¬r<¬k<¬d<¬]<¬V<¬O<¬H<¬A<¬:<¬3<¬,<¬%<¬<¬<¬<¬ <¬<¬û;¬ô;¬í;¬æ;¬ß;¬Ø;¬Ñ;¬Ê;¬Ã;¬¼;¬µ;¬®;¬§;¬ ;¬™;¬’;¬‹;¬„;¬};¬v;¬o;¬h;¬a;¬Z;¬S;¬L;¬E;¬>;¬7;¬0;¬);¬";¬;¬;¬ ;¬;¬ÿ:¬ø:¬ñ:¬ê:¬ã:¬Ü:¬Õ:¬Î:¬Ç:¬À:¬¹:¬²:¬«:¬¤:¬:¬–:¬:¬ˆ:¬:¬z:¬s:¬l:¬e:¬^:¬W:¬P:¬I:¬B:¬;:¬4:¬-:¬&:¬:¬:¬:¬ :¬:¬ü9¬õ9¬î9¬ç9¬à9¬Ù9¬Ò9¬Ë9¬Ä9¬½9¬¶9¬¯9¬¨9¬¡9¬š9¬“9¬Œ9¬…9¬~9¬w9¬p9¬i9¬b9¬[9¬T9¬M9¬F9¬?9¬89¬19¬*9¬#9¬9¬9¬9¬9¬9¬ù8¬ò8¬ë8¬ä8¬Ý8¬Ö8¬Ï8¬È8¬Á8¬º8¬³8¬¬8¬¥8¬ž8¬—8¬8¬‰8¬‚8¬{8¬t8¬m8¬f8¬_8¬X8¬Q8¬J8¬C8¬<8¬58¬.8¬'8¬ 8¬8¬8¬ 8¬8¬ý7¬ö7¬ï7¬è7¬á7¬Ú7¬Ó7¬Ì7¬Å7¬¾7¬·7¬°7¬©7¬¢7¬›7¬”7¬7¬†7¬7¬x7¬q7¬j7¬c7¬\7¬U7¬N7¬G7¬@7¬97¬27¬+7¬$7¬7¬7¬7¬7¬7¬ú6¬ó6¬ì6¬å6¬Þ6¬×6¬Ð6¬É6¬Â6¬»6¬´6¬­6¬¦6¬Ÿ6¬˜6¬‘6¬Š6¬ƒ6¬|6¬u6¬n6¬g6¬`6¬Y6¬R6¬K6¬D6¬=6¬66¬/6¬(6¬!6¬6¬6¬ 6¬6¬þ5¬÷5¬ð5¬é5¬â5¬Û5¬Ô5¬Í5¬Æ5¬¿5¬¸5¬±5¬ª5¬£5¬œ5¬•5¬Ž5¬‡5¬€5¬y5¬r5¬k5¬d5¬]5¬V5¬O5¬H5¬A5¬:5¬35¬,5¬%5¬5¬5¬5¬ 5¬5¬û4¬ô4¬í4¬æ4¬ß4¬Ø4¬Ñ4¬Ê4¬Ã4¬¼4¬µ4¬®4¬§4¬ 4¬™4¬’4¬‹4¬„4¬}4¬v4¬o4¬h4¬a4¬Z4¬S4¬L4¬E4¬>4¬74¬04¬)4¬"4¬4¬4¬ 4¬4¬ÿ3¬ø3¬ñ3¬ê3¬ã3¬Ü3¬Õ3¬Î3¬Ç3¬À3¬¹3¬²3¬«3¬¤3¬3¬–3¬3¬ˆ3¬3¬z3¬s3¬l3¬e3¬^3¬W3¬P3¬I3¬B3¬;3¬43¬-3¬&3¬3¬3¬3¬ 3¬3¬ü2¬õ2¬î2¬ç2¬à2¬Ù2¬Ò2¬Ë2¬Ä2¬½2¬¶2¬¯2¬¨2¬¡2¬š2¬“2¬Œ2¬…2¬~2¬w2¬p2¬i2¬b2¬[2¬T2¬M2¬F2¬?2¬82¬12¬*2¬#2¬2¬2¬2¬2¬2¬ù1¬ò1¬ë1¬ä1¬Ý1¬Ö1¬Ï1¬È1¬Á1¬º1¬³1¬¬1¬¥1¬ž1¬—1¬1¬‰1¬‚1¬{1¬t1¬m1¬f1¬_1¬X1¬Q1¬J1¬C1¬<1¬51¬.1¬'1¬ 1¬1¬1¬ 1¬1¬ý0¬ö0¬ï0¬è0¬á0¬Ú0¬Ó0¬Ì0¬Å0¬¾0¬·0¬°0¬©0¬¢0¬›0¬”0¬0¬†0¬0¬x0¬q0¬j0¬c0¬\0¬U0¬N0¬G0¬@0¬90¬20¬+0¬$0¬0¬0¬0¬0¬0¬ú/¬ó/¬ì/¬å/¬Þ/¬×/¬Ð/¬É/¬Â/¬»/¬´/¬­/¬¦/¬Ÿ/¬˜/¬‘/¬Š/¬ƒ/¬|/¬u/¬n/¬g/¬`/¬Y/¬R/¬K/¬D/¬=/¬6/¬//¬(/¬!/¬/¬/¬ /¬/¬þ.¬÷.¬ð.¬é.¬â.¬Û.¬Ô.¬Í.¬Æ.¬¿.¬¸.¬±.¬ª.¬£.¬œ.¬•.¬Ž.¬‡.¬€.¬y.¬r.¬k.¬d.¬].¬V.¬O.¬H.¬A.¬:.¬3.¬,.¬%.¬.¬.¬.¬ .¬.¬û-¬ô-¬í-¬æ-¬ß-¬Ø-¬Ñ-¬Ê-¬Ã-¬¼-¬µ-¬®-¬§-¬ -¬™-¬’-¬‹-¬„-¬}-¬v-¬o-¬h-¬a-¬Z-¬S-¬L-¬E-¬>-¬7-¬0-¬)-¬"-¬-¬-¬ -¬-¬ÿ,¬ø,¬ñ,¬ê,¬ã,¬Ü,¬Õ,¬Î,¬Ç,¬À,¬¹,¬²,¬«,¬¤,¬,¬–,¬,¬ˆ,¬,¬z,¬s,¬l,¬e,¬^,¬W,¬P,¬I,¬B,¬;,¬4,¬-,¬&,¬,¬,¬,¬ ,¬,¬ü+¬õ+¬î+¬ç+¬à+¬Ù+¬Ò+¬Ë+¬Ä+¬½+¬¶+¬¯+¬¨+¬¡+¬š+¬“+¬Œ+¬…+¬~+¬w+¬p+¬i+¬b+¬[+¬T+¬M+¬F+¬?+¬8+¬1+¬*+¬#+¬+¬+¬+¬+¬+¬ù*¬ò*¬ë*¬ä*¬Ý*¬Ö*¬Ï*¬È*¬Á*¬º*¬³*¬¬*¬¥*¬ž*¬—*¬*¬‰*¬‚*¬{*¬t*¬m*¬f*¬_*¬X*¬Q*¬J*¬C*¬<*¬5*¬.*¬'*¬ *¬*¬*¬ *¬*¬ý)¬ö)¬ï)¬è)¬á)¬Ú)¬Ó)¬Ì)¬Å)¬¾)¬·)¬°)¬©)¬¢)¬›)¬”)¬)¬†)¬)¬x)¬q)¬j)¬c)¬\)¬U)¬N)¬G)¬@)¬9)¬2)¬+)¬$)¬)¬)¬)¬)¬)¬ú(¬ó(¬ì(¬å(¬Þ(¬×(¬Ð(¬É(¬Â(¬»(¬´(¬­(¬¦(¬Ÿ(¬˜(¬‘(¬Š(¬ƒ(¬|(¬u(¬n(¬g(¬`(¬Y(¬R(¬K(¬D(¬=(¬6(¬/(¬((¬!(¬(¬(¬ (¬(¬þ'¬÷'¬ð'¬é'¬â'¬Û'¬Ô'¬Í'¬Æ'¬¿'¬¸'¬±'¬ª'¬£'¬œ'¬•'¬Ž'¬‡'¬€'¬y'¬r'¬k'¬d'¬]'¬V'¬O'¬H'¬A'¬:'¬3'¬,'¬%'¬'¬'¬'¬ '¬'¬û&¬ô&¬í&¬æ&¬ß&¬Ø&¬Ñ&¬Ê&¬Ã&¬¼&¬µ&¬®&¬§&¬ &¬™&¬’&¬‹&¬„&¬}&¬v&¬o&¬h&¬a&¬Z&¬S&¬L&¬E&¬>&¬7&¬0&¬)&¬"&¬&¬&¬ &¬&¬ÿ%¬ø%¬ñ%¬ê%¬ã%¬Ü%¬Õ%¬Î%¬Ç%¬À%¬¹%¬²%¬«%¬¤%¬%¬–%¬%¬ˆ%¬%¬z%¬s%¬l%¬e%¬^%¬W%¬P%¬I%¬B%¬;%¬4%¬-%¬&%¬%¬%¬%¬ %¬%¬ü$¬õ$¬î$¬ç$¬à$¬Ù$¬Ò$¬Ë$¬Ä$¬½$¬¶$¬¯$¬¨$¬¡$¬š$¬“$¬Œ$¬…$¬~$¬w$¬p$¬i$¬b$¬[$¬T$¬M$¬F$¬?$¬8$¬1$¬*$¬#$¬$¬$¬$¬$¬$¬ù#¬ò#¬ë#¬ä#¬Ý#¬Ö#¬Ï#¬È#¬Á#¬º#¬³#¬¬#¬¥#¬ž#¬—#¬#¬‰#¬‚#¬{#¬t#¬m#¬f#¬_#¬X#¬Q#¬J#¬C#¬<#¬5#¬.#¬'#¬ #¬#¬#¬ #¬#¬ý"¬ö"¬ï"¬è"¬á"¬Ú"¬Ó"¬Ì"¬Å"¬¾"¬·"¬°"¬©"¬¢"¬›"¬”"¬"¬†"¬"¬x"¬q"¬j"¬c"¬\"¬U"¬N"¬G"¬@"¬9"¬2"¬+"¬$"¬"¬"¬"¬"¬"¬ú!¬ó!¬ì!¬å!¬Þ!¬×!¬Ð!¬É!¬Â!¬»!¬´!¬­!¬¦!¬Ÿ!¬˜!¬‘!¬Š!¬ƒ!¬|!¬u!¬n!¬g!¬`!¬Y!¬R!¬K!¬D!¬=!¬6!¬/!¬(!¬!!¬!¬!¬ !¬!¬þ ¬÷ ¬ð ¬é ¬â ¬Û ¬Ô ¬Í ¬Æ ¬¿ ¬¸ ¬± ¬ª ¬£ ¬œ ¬• ¬Ž ¬‡ ¬€ ¬y ¬r ¬k ¬d ¬] ¬V ¬O ¬H ¬A ¬: ¬3 ¬, ¬% ¬ ¬ ¬ ¬ ¬ ¬û¬ô¬í¬æ¬ß¬Ø¬Ñ¬Ê¬Ã¬¼¬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ¬ø¬ñ¬ê¬ã¬Ü¬Õ¬Î¬Ç¬À¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù¬ò¬ë¬ä¬Ý¬Ö¬Ï¬È¬Á¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý¬ö¬ï¬è¬á¬Ú¬Ó¬Ì¬Å¬¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú¬ó¬ì¬å¬Þ¬×¬Ð¬É¬Â¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Š¬ƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ¬÷¬ð¬é¬â¬Û¬Ô¬Í¬Æ¬¿¬¸¬±¬ª¬£¬œ¬•¬Ž¬‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û¬ô¬í¬æ¬ß¬Ø¬Ñ¬Ê¬Ã¬¼¬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ¬ø¬ñ¬ê¬ã¬Ü¬Õ¬Î¬Ç¬À¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù¬ò¬ë¬ä¬Ý¬Ö¬Ï¬È¬Á¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý¬ö¬ï¬è¬á¬Ú¬Ó¬Ì¬Å¬¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú¬ó¬ì¬å¬Þ¬×¬Ð¬É¬Â¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Š¬ƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ¬÷¬ð¬é¬â¬Û¬Ô¬Í¬Æ¬¿¬¸¬±¬ª¬£¬œ¬•¬Ž¬‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û¬ô¬í¬æ¬ß¬Ø¬Ñ¬Ê¬Ã¬¼¬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ¬ø¬ñ¬ê¬ã¬Ü¬Õ¬Î¬Ç¬À¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù¬ò¬ë¬ä¬Ý¬Ö¬Ï¬È¬Á¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý ¬ö ¬ï ¬è ¬á ¬Ú ¬Ó ¬Ì ¬Å ¬¾ ¬· ¬° ¬© ¬¢ ¬› ¬” ¬ ¬† ¬ ¬x ¬q ¬j ¬c ¬\ ¬U ¬N ¬G ¬@ ¬9 ¬2 ¬+ ¬$ ¬ ¬ ¬ ¬ ¬ ¬ú ¬ó ¬ì ¬å ¬Þ ¬× ¬Ð ¬É ¬ ¬» ¬´ ¬­ ¬¦ ¬Ÿ ¬˜ ¬‘ ¬Š ¬ƒ ¬| ¬u ¬n ¬g ¬` ¬Y ¬R ¬K ¬D ¬= ¬6 ¬/ ¬( ¬! ¬ ¬ ¬ ¬ ¬þ ¬÷ ¬ð ¬é ¬â ¬Û ¬Ô ¬Í ¬Æ ¬¿ ¬¸ ¬± ¬ª ¬£ ¬œ ¬• ¬Ž ¬‡ ¬€ ¬y ¬r ¬k ¬d ¬] ¬V ¬O ¬H ¬A ¬: ¬3 ¬, ¬% ¬ ¬ ¬ ¬ ¬ ¬û ¬ô ¬í ¬æ ¬ß ¬Ø ¬Ñ ¬Ê ¬à ¬¼ ¬µ ¬® ¬§ ¬  ¬™ ¬’ ¬‹ ¬„ ¬} ¬v ¬o ¬h ¬a ¬Z ¬S ¬L ¬E ¬> ¬7 ¬0 ¬) ¬" ¬ ¬ ¬ ¬ ¬ÿ ¬ø ¬ñ ¬ê ¬ã ¬Ü ¬Õ ¬Î ¬Ç ¬À ¬¹ ¬² ¬« ¬¤ ¬ ¬– ¬ ¬ˆ ¬ ¬z ¬s ¬l ¬e ¬^ ¬W ¬P ¬I ¬B ¬; ¬4 ¬- ¬& ¬ ¬ ¬ ¬ ¬ ¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù¬ò¬ë¬ä¬Ý¬Ö¬Ï¬È¬Á¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý¬ö¬ï¬è¬á¬Ú¬Ó¬Ì¬Å¬¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú¬ó¬ì¬å¬Þ¬×¬Ð¬É¬Â¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Š¬ƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ¬÷¬ð¬é¬â¬Û¬Ô¬Í¬Æ¬¿¬¸¬±¬ª¬£¬œ¬•¬Ž¬‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û¬ô¬í¬æ¬ß¬Ø¬Ñ¬Ê¬Ã¬¼¬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ¬ø¬ñ¬ê¬ã¬Ü¬Õ¬Î¬Ç¬À¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü¬õ¬î¬ç¬à¬Ù¬Ò¬Ë¬Ä¬½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ýÿ«öÿ«ïÿ«èÿ«áÿ«Úÿ«Óÿ«Ìÿ«Åÿ«¾ÿ«·ÿ«°ÿ«©ÿ«¢ÿ«›ÿ«”ÿ«ÿ«†ÿ«ÿ«xÿ«qÿ«jÿ«cÿ«\ÿ«Uÿ«Nÿ«Gÿ«@ÿ«9ÿ«2ÿ«+ÿ«$ÿ«ÿ«ÿ«ÿ«ÿ«ÿ«úþ«óþ«ìþ«åþ«Þþ«×þ«Ðþ«Éþ«Âþ«»þ«´þ«­þ«¦þ«Ÿþ«˜þ«‘þ«Šþ«ƒþ«|þ«uþ«nþ«gþ«`þ«Yþ«Rþ«Kþ«Dþ«=þ«6þ«/þ«(þ«!þ«þ«þ« þ«þ«þý«÷ý«ðý«éý«âý«Ûý«Ôý«Íý«Æý«¿ý«¸ý«±ý«ªý«£ý«œý«•ý«Žý«‡ý«€ý«yý«rý«ký«dý«]ý«Vý«Oý«Hý«Aý«:ý«3ý«,ý«%ý«ý«ý«ý« ý«ý«ûü«ôü«íü«æü«ßü«Øü«Ñü«Êü«Ãü«¼ü«µü«®ü«§ü« ü«™ü«’ü«‹ü«„ü«}ü«vü«oü«hü«aü«Zü«Sü«Lü«Eü«>ü«7ü«0ü«)ü«"ü«ü«ü« ü«ü«ÿû«øû«ñû«êû«ãû«Üû«Õû«Îû«Çû«Àû«¹û«²û««û«¤û«û«–û«û«ˆû«û«zû«sû«lû«eû«^û«Wû«Pû«Iû«Bû«;û«4û«-û«&û«û«û«û« û«û«üú«õú«îú«çú«àú«Ùú«Òú«Ëú«Äú«½ú«¶ú«¯ú«¨ú«¡ú«šú«“ú«Œú«…ú«~ú«wú«pú«iú«bú«[ú«Tú«Mú«Fú«?ú«8ú«1ú«*ú«#ú«ú«ú«ú«ú«ú«ùù«òù«ëù«äù«Ýù«Öù«Ïù«Èù«Áù«ºù«³ù«¬ù«¥ù«žù«—ù«ù«‰ù«‚ù«{ù«tù«mù«fù«_ù«Xù«Qù«Jù«Cù«<ù«5ù«.ù«'ù« ù«ù«ù« ù«ù«ýø«öø«ïø«èø«áø«Úø«Óø«Ìø«Åø«¾ø«·ø«°ø«©ø«¢ø«›ø«”ø«ø«†ø«ø«xø«qø«jø«cø«\ø«Uø«Nø«Gø«@ø«9ø«2ø«+ø«$ø«ø«ø«ø«ø«ø«ú÷«ó÷«ì÷«å÷«Þ÷«×÷«Ð÷«É÷«Â÷«»÷«´÷«­÷«¦÷«Ÿ÷«˜÷«‘÷«Š÷«ƒ÷«|÷«u÷«n÷«g÷«`÷«Y÷«R÷«K÷«D÷«=÷«6÷«/÷«(÷«!÷«÷«÷« ÷«÷«þö«÷ö«ðö«éö«âö«Ûö«Ôö«Íö«Æö«¿ö«¸ö«±ö«ªö«£ö«œö«•ö«Žö«‡ö«€ö«yö«rö«kö«dö«]ö«Vö«Oö«Hö«Aö«:ö«3ö«,ö«%ö«ö«ö«ö« ö«ö«ûõ«ôõ«íõ«æõ«ßõ«Øõ«Ñõ«Êõ«Ãõ«¼õ«µõ«®õ«§õ« õ«™õ«’õ«‹õ«„õ«}õ«võ«oõ«hõ«aõ«Zõ«Sõ«Lõ«Eõ«>õ«7õ«0õ«)õ«"õ«õ«õ« õ«õ«ÿô«øô«ñô«êô«ãô«Üô«Õô«Îô«Çô«Àô«¹ô«²ô««ô«¤ô«ô«–ô«ô«ˆô«ô«zô«sô«lô«eô«^ô«Wô«Pô«Iô«Bô«;ô«4ô«-ô«&ô«ô«ô«ô« ô«ô«üó«õó«îó«çó«àó«Ùó«Òó«Ëó«Äó«½ó«¶ó«¯ó«¨ó«¡ó«šó«“ó«Œó«…ó«~ó«wó«pó«ió«bó«[ó«Tó«Mó«Fó«?ó«8ó«1ó«*ó«#ó«ó«ó«ó«ó«ó«ùò«òò«ëò«äò«Ýò«Öò«Ïò«Èò«Áò«ºò«³ò«¬ò«¥ò«žò«—ò«ò«‰ò«‚ò«{ò«tò«mò«fò«_ò«Xò«Qò«Jò«Cò«<ò«5ò«.ò«'ò« ò«ò«ò« ò«ò«ýñ«öñ«ïñ«èñ«áñ«Úñ«Óñ«Ìñ«Åñ«¾ñ«·ñ«°ñ«©ñ«¢ñ«›ñ«”ñ«ñ«†ñ«ñ«xñ«qñ«jñ«cñ«\ñ«Uñ«Nñ«Gñ«@ñ«9ñ«2ñ«+ñ«$ñ«ñ«ñ«ñ«ñ«ñ«úð«óð«ìð«åð«Þð«×ð«Ðð«Éð«Âð«»ð«´ð«­ð«¦ð«Ÿð«˜ð«‘ð«Šð«ƒð«|ð«uð«nð«gð«`ð«Yð«Rð«Kð«Dð«=ð«6ð«/ð«(ð«!ð«ð«ð« ð«ð«þï«÷ï«ðï«éï«âï«Ûï«Ôï«Íï«Æï«¿ï«¸ï«±ï«ªï«£ï«œï«•ï«Žï«‡ï«€ï«yï«rï«kï«dï«]ï«Vï«Oï«Hï«Aï«:ï«3ï«,ï«%ï«ï«ï«ï« ï«ï«ûî«ôî«íî«æî«ßî«Øî«Ñî«Êî«Ãî«}î«vî«oî«hî«aî«Zî«Sî«Lî«Eî«>î«7î«0î«)î«"î«î«î« î«î«ÿí«øí«ñí«êí«ãí«Üí«Õí«Îí«Çí«Àí«¹í«²í««í«¤í«í«–í«í«ˆí«í«zí«sí«lí«eí«^í«Wí«Pí«Ií«Bí«;í«4í«-í«&í«í«í«í« í«í«üì«õì«îì«çì«àì«Ùì«Òì«Ëì«Ä쫽쫶쫯쫨쫡쫚쫓쫌쫅ì«~ì«wì«pì«iì«bì«[ì«Tì«Mì«Fì«?ì«8ì«1ì«*ì«#ì«ì«ì«ì«ì«ì«ùë«òë«ëë«äë«Ýë«Öë«Ïë«Èë«Á뫺뫳뫬뫥뫞뫗ë«ë«‰ë«‚ë«{ë«të«më«fë«_ë«Xë«Që«Jë«Cë«<ë«5ë«.ë«'ë« ë«ë«ë« ë«ë«ýê«öê«ïê«èê«áê«Úê«Óê«Ìê«Å꫾꫷꫰ꫩꫢꫛ꫔ê«ê«†ê«ê«xê«qê«jê«cê«\ê«Uê«Nê«Gê«@ê«9ê«2ê«+ê«$ê«ê«ê«ê«ê«ê«úé«óé«ìé«åé«Þé«×é«Ðé«Éé«Â髻髴髭髦髟高髑髊髃é«|é«ué«né«gé«`é«Yé«Ré«Ké«Dé«=é«6é«/é«(é«!é«é«é« é«é«þè«÷è«ðè«éè«âè«Ûè«Ôè«Íè«Æè«¿è«¸è«±è«ªè«£è«œè«•è«Žè«‡è«€è«yè«rè«kè«dè«]è«Vè«Oè«Hè«Aè«:è«3è«,è«%è«è«è«è« è«è«ûç«ôç«íç«æç«ßç«Øç«Ñç«Êç«Ã竼竵竮竧章站竒立竄ç«}ç«vç«oç«hç«aç«Zç«Sç«Lç«Eç«>ç«7ç«0ç«)ç«"ç«ç«ç« ç«ç«ÿæ«øæ«ñæ«êæ«ãæ«Üæ«Õæ«Îæ«Çæ«Àæ«¹æ«²æ««æ«¤æ«æ«–æ«æ«ˆæ«æ«zæ«sæ«læ«eæ«^æ«Wæ«Pæ«Iæ«Bæ«;æ«4æ«-æ«&æ«æ«æ«æ« æ«æ«üå«õå«îå«çå«àå«Ùå«Òå«Ëå«Ä嫽嫶嫯嫨嫡嫚嫓嫌嫅å«~å«wå«på«iå«bå«[å«Tå«Må«Få«?å«8å«1å«*å«#å«å«å«å«å«å«ùä«òä«ëä«ää«Ýä«Öä«Ïä«Èä«Á䫺䫳䫬䫥䫞䫗ä«ä«‰ä«‚ä«{ä«tä«mä«fä«_ä«Xä«Qä«Jä«Cä«<ä«5ä«.ä«'ä« ä«ä«ä« ä«ä«ýã«öã«ïã«èã«áã«Úã«Óã«Ìã«Å㫾㫷㫰㫩㫢㫛㫔ã«ã«†ã«ã«xã«qã«jã«cã«\ã«Uã«Nã«Gã«@ã«9ã«2ã«+ã«$ã«ã«ã«ã«ã«ã«úâ«óâ«ìâ«åâ«Þâ«×â«Ðâ«Éâ«Â⫻⫴⫭⫦⫟⫘⫑⫊⫃â«|â«uâ«nâ«gâ«`â«Yâ«Râ«Kâ«Dâ«=â«6â«/â«(â«!â«â«â« â«â«þá«÷á«ðá«éá«âá«Ûá«Ôá«Íá«Æá«¿á«¸á«±á«ªá«£á«œá«•á«Žá«‡á«€á«yá«rá«ká«dá«]á«Vá«Oá«Há«Aá«:á«3á«,á«%á«á«á«á« á«á«ûà«ôà«íà«æà«ßà«Øà«Ñà«Êà«Ãૼ૵૮૧ૠ૙૒ોૄà«}à«và«oà«hà«aà«Zà«Sà«Là«Eà«>à«7à«0à«)à«"à«à«à« à«à«ÿß«øß«ñß«êß«ãß«Üß«Õß«Îß«Çß«Àß«¹ß«²ß««ß«¤ß«ß«–߫߫ˆß«ß«zß«sß«lß«eß«^ß«Wß«Pß«Iß«Bß«;ß«4ß«-ß«&߫߫߫߫ ߫߫üÞ«õÞ«îÞ«çÞ«àÞ«ÙÞ«ÒÞ«ËÞ«ÄÞ«½Þ«¶Þ«¯Þ«¨Þ«¡Þ«šÞ«“Þ«ŒÞ«…Þ«~Þ«wÞ«pÞ«iÞ«bÞ«[Þ«TÞ«MÞ«FÞ«?Þ«8Þ«1Þ«*Þ«#Þ«Þ«Þ«Þ«Þ«Þ«ùÝ«òÝ«ëÝ«äÝ«ÝÝ«ÖÝ«ÏÝ«ÈÝ«ÁÝ«ºÝ«³Ý«¬Ý«¥Ý«žÝ«—ݫݫ‰Ý«‚Ý«{Ý«tÝ«mÝ«fÝ«_Ý«XÝ«QÝ«JÝ«CÝ«<Ý«5Ý«.Ý«'Ý« ݫݫݫ ݫݫýÜ«öÜ«ïÜ«èÜ«áÜ«ÚÜ«ÓÜ«ÌÜ«ÅÜ«¾Ü«·Ü«°Ü«©Ü«¢Ü«›Ü«”ܫܫ†Ü«Ü«xÜ«qÜ«jÜ«cÜ«\Ü«UÜ«NÜ«GÜ«@Ü«9Ü«2Ü«+Ü«$ܫܫܫܫܫܫúÛ«óÛ«ìÛ«åÛ«ÞÛ«×Û«ÐÛ«ÉÛ«ÂÛ«»Û«´Û«­Û«¦Û«ŸÛ«˜Û«‘Û«ŠÛ«ƒÛ«|Û«uÛ«nÛ«gÛ«`Û«YÛ«RÛ«KÛ«DÛ«=Û«6Û«/Û«(Û«!Û«Û«Û« Û«Û«þÚ«÷Ú«ðÚ«éÚ«âÚ«ÛÚ«ÔÚ«ÍÚ«ÆÚ«¿Ú«¸Ú«±Ú«ªÚ«£Ú«œÚ«•Ú«ŽÚ«‡Ú«€Ú«yÚ«rÚ«kÚ«dÚ«]Ú«VÚ«OÚ«HÚ«AÚ«:Ú«3Ú«,Ú«%Ú«Ú«Ú«Ú« Ú«Ú«ûÙ«ôÙ«íÙ«æÙ«ßÙ«ØÙ«ÑÙ«ÊÙ«ÃÙ«¼Ù«µÙ«®Ù«§Ù« Ù«™Ù«’Ù«‹Ù«„Ù«}Ù«vÙ«oÙ«hÙ«aÙ«ZÙ«SÙ«LÙ«EÙ«>Ù«7Ù«0Ù«)Ù«"٫٫٫ ٫٫ÿØ«øØ«ñØ«êØ«ãØ«ÜØ«ÕØ«ÎØ«ÇØ«ÀØ«¹Ø«²Ø««Ø«¤Ø«Ø«–ثثˆØ«Ø«zØ«sØ«lØ«eØ«^Ø«WØ«PØ«IØ«BØ«;Ø«4Ø«-Ø«&ثثثث ثثü׫õ׫î׫ç׫à׫Ù׫Ò׫Ë׫Ä׫½×«¶×«¯×«¨×«¡×«š×«“׫Œ×«…׫~׫w׫p׫i׫b׫[׫T׫M׫F׫?׫8׫1׫*׫#׫׫׫׫׫׫ùÖ«òÖ«ëÖ«äÖ«ÝÖ«ÖÖ«ÏÖ«ÈÖ«ÁÖ«ºÖ«³Ö«¬Ö«¥Ö«žÖ«—Ö«Ö«‰Ö«‚Ö«{Ö«tÖ«mÖ«fÖ«_Ö«XÖ«QÖ«JÖ«CÖ«<Ö«5Ö«.Ö«'Ö« Ö«Ö«Ö« Ö«Ö«ýÕ«öÕ«ïÕ«èÕ«áÕ«ÚÕ«ÓÕ«ÌÕ«ÅÕ«¾Õ«·Õ«°Õ«©Õ«¢Õ«›Õ«”Õ«Õ«†Õ«Õ«xÕ«qÕ«jÕ«cÕ«\Õ«UÕ«NÕ«GÕ«@Õ«9Õ«2Õ«+Õ«$Õ«Õ«Õ«Õ«Õ«Õ«úÔ«óÔ«ìÔ«åÔ«ÞÔ«×Ô«ÐÔ«ÉÔ«ÂÔ«»Ô«´Ô«­Ô«¦Ô«ŸÔ«˜Ô«‘Ô«ŠÔ«ƒÔ«|Ô«uÔ«nÔ«gÔ«`Ô«YÔ«RÔ«KÔ«DÔ«=Ô«6Ô«/Ô«(Ô«!Ô«Ô«Ô« Ô«Ô«þÓ«÷Ó«ðÓ«éÓ«âÓ«ÛÓ«ÔÓ«ÍÓ«ÆÓ«¿Ó«¸Ó«±Ó«ªÓ«£Ó«œÓ«•Ó«ŽÓ«‡Ó«€Ó«yÓ«rÓ«kÓ«dÓ«]Ó«VÓ«OÓ«HÓ«AÓ«:Ó«3Ó«,Ó«%Ó«Ó«Ó«Ó« Ó«Ó«ûÒ«ôÒ«íÒ«æÒ«ßÒ«ØÒ«ÑÒ«ÊÒ«ÃÒ«¼Ò«µÒ«®Ò«§Ò« Ò«™Ò«’Ò«‹Ò«„Ò«}Ò«vÒ«oÒ«hÒ«aÒ«ZÒ«SÒ«LÒ«EÒ«>Ò«7Ò«0Ò«)Ò«"Ò«Ò«Ò« Ò«Ò«ÿÑ«øÑ«ñÑ«êÑ«ãÑ«ÜÑ«ÕÑ«ÎÑ«ÇÑ«ÀÑ«¹Ñ«²Ñ««Ñ«¤Ñ«Ñ«–ѫѫˆÑ«Ñ«zÑ«sÑ«lÑ«eÑ«^Ñ«WÑ«PÑ«IÑ«BÑ«;Ñ«4Ñ«-Ñ«&ѫѫѫѫ ѫѫüЫõЫîЫçЫàЫÙЫÒЫËЫÄЫ½Ð«¶Ð«¯Ð«¨Ð«¡Ð«šÐ«“ЫŒÐ«…Ы~ЫwЫpЫiЫbЫ[ЫTЫMЫFЫ?Ы8Ы1Ы*Ы#ЫЫЫЫЫЫùÏ«òÏ«ëÏ«äÏ«ÝÏ«ÖÏ«ÏÏ«ÈÏ«ÁÏ«ºÏ«³Ï«¬Ï«¥Ï«žÏ«—ϫϫ‰Ï«‚Ï«{Ï«tÏ«mÏ«fÏ«_Ï«XÏ«QÏ«JÏ«CÏ«<Ï«5Ï«.Ï«'Ï« ϫϫϫ ϫϫýΫöΫïΫèΫáΫÚΫÓΫÌΫÅΫ¾Î«·Î«°Î«©Î«¢Î«›Î«”ΫΫ†Î«ΫxΫqΫjΫcΫ\ΫUΫNΫGΫ@Ϋ9Ϋ2Ϋ+Ϋ$ΫΫΫΫΫΫúÍ«óÍ«ìÍ«åÍ«ÞÍ«×Í«ÐÍ«ÉÍ«ÂÍ«»Í«´Í«­Í«¦Í«ŸÍ«˜Í«‘Í«ŠÍ«ƒÍ«|Í«uÍ«nÍ«gÍ«`Í«YÍ«RÍ«KÍ«DÍ«=Í«6Í«/Í«(Í«!ͫͫͫ ͫͫþÌ«÷Ì«ðÌ«éÌ«âÌ«ÛÌ«ÔÌ«ÍÌ«ÆÌ«¿Ì«¸Ì«±Ì«ªÌ«£Ì«œÌ«•Ì«ŽÌ«‡Ì«€Ì«yÌ«rÌ«kÌ«dÌ«]Ì«VÌ«OÌ«HÌ«AÌ«:Ì«3Ì«,Ì«%̫̫̫̫ ̫̫ûË«ôË«íË«æË«ßË«ØË«ÑË«ÊË«ÃË«¼Ë«µË«®Ë«§Ë« Ë«™Ë«’Ë«‹Ë«„Ë«}Ë«vË«oË«hË«aË«ZË«SË«LË«EË«>Ë«7Ë«0Ë«)Ë«"˫˫˫ ˫˫ÿÊ«øÊ«ñÊ«êÊ«ãÊ«ÜÊ«ÕÊ«ÎÊ«ÇÊ«ÀÊ«¹Ê«²Ê««Ê«¤Ê«Ê«–ʫʫˆÊ«Ê«zÊ«sÊ«lÊ«eÊ«^Ê«WÊ«PÊ«IÊ«BÊ«;Ê«4Ê«-Ê«&ʫʫʫʫ ʫʫüÉ«õÉ«îÉ«çÉ«àÉ«ÙÉ«ÒÉ«ËÉ«ÄÉ«½É«¶É«¯É«¨É«¡É«šÉ«“É«ŒÉ«…É«~É«wÉ«pÉ«iÉ«bÉ«[É«TÉ«MÉ«FÉ«?É«8É«1É«*É«#ɫɫɫɫɫɫùÈ«òÈ«ëÈ«äÈ«ÝÈ«ÖÈ«ÏÈ«ÈÈ«ÁÈ«ºÈ«³È«¬È«¥È«žÈ«—ȫȫ‰È«‚È«{È«tÈ«mÈ«fÈ«_È«XÈ«QÈ«JÈ«CÈ«<È«5È«.È«'È« ȫȫȫ ȫȫýÇ«öÇ«ïÇ«èÇ«áÇ«ÚÇ«ÓÇ«ÌÇ«ÅÇ«¾Ç«·Ç«°Ç«©Ç«¢Ç«›Ç«”ǫǫ†Ç«Ç«xÇ«qÇ«jÇ«cÇ«\Ç«UÇ«NÇ«GÇ«@Ç«9Ç«2Ç«+Ç«$ǫǫǫǫǫǫúÆ«óÆ«ìÆ«寫ÞÆ«ׯ«ÐÆ«ÉÆ«ÂÆ«»Æ«´Æ«­Æ«¦Æ«ŸÆ«˜Æ«‘Æ«ŠÆ«ƒÆ«|Æ«uÆ«nÆ«gÆ«`Æ«YÆ«RÆ«KÆ«DÆ«=Æ«6Æ«/Æ«(Æ«!ƫƫƫ ƫƫþÅ«÷Å«ðÅ«éÅ«âÅ«ÛÅ«ÔÅ«ÍÅ«ÆÅ«¿Å«¸Å«±Å«ªÅ«£Å«œÅ«•Å«ŽÅ«‡Å«€Å«yÅ«rÅ«kÅ«dÅ«]Å«VÅ«OÅ«HÅ«AÅ«:Å«3Å«,Å«%ūūūū ūūûÄ«ôÄ«íÄ«æÄ«ßÄ«ØÄ«ÑÄ«ÊÄ«ÃÄ«¼Ä«µÄ«®Ä«§Ä« Ä«™Ä«’Ä«‹Ä«„Ä«}Ä«vÄ«oÄ«hÄ«aÄ«ZÄ«SÄ«LÄ«EÄ«>Ä«7Ä«0Ä«)Ä«"īīī īīÿëøÃ«ñëêëãëÜëÕëÎëÇëÀë¹Ã«²Ã««Ã«¤Ã«ë–ëëˆÃ«ëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëü«õ«î«ç«à«Ù«Ò«Ë«Ä«½Â«¶Â«¯Â«¨Â«¡Â«šÂ«“«ŒÂ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùÁ«òÁ«ëÁ«äÁ«ÝÁ«ÖÁ«ÏÁ«ÈÁ«ÁÁ«ºÁ«³Á«¬Á«¥Á«žÁ«—Á«Á«‰Á«‚Á«{Á«tÁ«mÁ«fÁ«_Á«XÁ«QÁ«JÁ«CÁ«<Á«5Á«.Á«'Á« Á«Á«Á« Á«Á«ýÀ«öÀ«ïÀ«èÀ«áÀ«ÚÀ«ÓÀ«ÌÀ«ÅÀ«¾À«·À«°À«©À«¢À«›À«”À«À«†À«À«xÀ«qÀ«jÀ«cÀ«\À«UÀ«NÀ«GÀ«@À«9À«2À«+À«$À«À«À«À«À«À«ú¿«ó¿«ì¿«å¿«Þ¿«׿«п«É¿«¿«»¿«´¿«­¿«¦¿«Ÿ¿«˜¿«‘¿«Š¿«ƒ¿«|¿«u¿«n¿«g¿«`¿«Y¿«R¿«K¿«D¿«=¿«6¿«/¿«(¿«!¿«¿«¿« ¿«¿«þ¾«÷¾«ð¾«龫⾫Û¾«Ô¾«;«ƾ«¿¾«¸¾«±¾«ª¾«£¾«œ¾«•¾«޾«‡¾«€¾«y¾«r¾«k¾«d¾«]¾«V¾«O¾«H¾«A¾«:¾«3¾«,¾«%¾«¾«¾«¾« ¾«¾«û½«ô½«í½«潫ß½«ؽ«ѽ«ʽ«ý«¼½«µ½«®½«§½« ½«™½«’½«‹½«„½«}½«v½«o½«h½«a½«Z½«S½«L½«E½«>½«7½«0½«)½«"½«½«½« ½«½«ÿ¼«ø¼«ñ¼«꼫㼫ܼ«Õ¼«μ«Ǽ«À¼«¹¼«²¼««¼«¤¼«¼«–¼«¼«ˆ¼«¼«z¼«s¼«l¼«e¼«^¼«W¼«P¼«I¼«B¼«;¼«4¼«-¼«&¼«¼«¼«¼« ¼«¼«ü»«õ»«绫໫Ù»«Ò»«Ë»«Ä»«½»«¶»«¯»«¨»«¡»«š»«“»«Œ»«…»«~»«w»«p»«i»«b»«[»«T»«M»«F»«?»«8»«1»«*»«#»«»«»«»«»«»«ùº«òº«뺫享ݺ«Öº«Ϻ«Ⱥ«Áº«ºº«³º«¬º«¥º«žº«—º«º«‰º«‚º«{º«tº«mº«fº«_º«Xº«Qº«Jº«Cº«<º«5º«.º«'º« º«º«º« º«º«ý¹«ö¹«﹫蹫ṫÚ¹«Ó¹«̹«Ź«¾¹«·¹«°¹«©¹«¢¹«›¹«”¹«¹«†¹«¹«x¹«q¹«j¹«c¹«\¹«U¹«N¹«G¹«@¹«9¹«2¹«+¹«$¹«¹«¹«¹«¹«¹«ú¸«ó¸«츫師Þ¸«׸«и«ɸ«¸«»¸«´¸«­¸«¦¸«Ÿ¸«˜¸«‘¸«Џ«ƒ¸«|¸«u¸«n¸«g¸«`¸«Y¸«R¸«K¸«D¸«=¸«6¸«/¸«(¸«!¸«¸«¸« ¸«¸«þ·«÷·«ð·«é·«â·«Û·«Ô·«Í·«Æ·«¿·«¸·«±·«ª·«£·«œ·«•·«Ž·«‡·«€·«y·«r·«k·«d·«]·«V·«O·«H·«A·«:·«3·«,·«%·«·«·«·« ·«·«û¶«ô¶«í¶«æ¶«ß¶«ض«Ѷ«ʶ«ö«¼¶«µ¶«®¶«§¶« ¶«™¶«’¶«‹¶«„¶«}¶«v¶«o¶«h¶«a¶«Z¶«S¶«L¶«E¶«>¶«7¶«0¶«)¶«"¶«¶«¶« ¶«¶«ÿµ«øµ«ñµ«굫㵫ܵ«Õµ«ε«ǵ«Àµ«¹µ«²µ««µ«¤µ«µ«–µ«µ«ˆµ«µ«zµ«sµ«lµ«eµ«^µ«Wµ«Pµ«Iµ«Bµ«;µ«4µ«-µ«&µ«µ«µ«µ« µ«µ«ü´«õ´«î´«ç´«à´«Ù´«Ò´«Ë´«Ä´«½´«¶´«¯´«¨´«¡´«š´«“´«Œ´«…´«~´«w´«p´«i´«b´«[´«T´«M´«F´«?´«8´«1´«*´«#´«´«´«´«´«´«ù³«ò³«볫䳫ݳ«Ö³«ϳ«ȳ«Á³«º³«³³«¬³«¥³«ž³«—³«³«‰³«‚³«{³«t³«m³«f³«_³«X³«Q³«J³«C³«<³«5³«.³«'³« ³«³«³« ³«³«ý²«ö²«ﲫ貫ᲫÚ²«Ó²«̲«Ų«¾²«·²«°²«©²«¢²«›²«”²«²«†²«²«x²«q²«j²«c²«\²«U²«N²«G²«@²«9²«2²«+²«$²«²«²«²«²«²«ú±«ó±«챫屫Þ±«×±«б«ɱ«±«»±«´±«­±«¦±«Ÿ±«˜±«‘±«б«ƒ±«|±«u±«n±«g±«`±«Y±«R±«K±«D±«=±«6±«/±«(±«!±«±«±« ±«±«þ°«÷°«ð°«é°«â°«Û°«Ô°«Ͱ«ư«¿°«¸°«±°«ª°«£°«œ°«•°«ް«‡°«€°«y°«r°«k°«d°«]°«V°«O°«H°«A°«:°«3°«,°«%°«°«°«°« °«°«û¯«ô¯«í¯«毫߯«د«ѯ«ʯ«ï«¼¯«µ¯«®¯«§¯« ¯«™¯«’¯«‹¯«„¯«}¯«v¯«o¯«h¯«a¯«Z¯«S¯«L¯«E¯«>¯«7¯«0¯«)¯«"¯«¯«¯« ¯«¯«ÿ®«ø®«ñ®«ꮫ㮫Ü®«Õ®«ή«Ç®«À®«¹®«²®««®«¤®«®«–®«®«ˆ®«®«z®«s®«l®«e®«^®«W®«P®«I®«B®«;®«4®«-®«&®«®«®«®« ®«®«ü­«õ­«î­«ç­«à­«Ù­«Ò­«Ë­«Ä­«½­«¶­«¯­«¨­«¡­«š­«“­«Œ­«…­«~­«w­«p­«i­«b­«[­«T­«M­«F­«?­«8­«1­«*­«#­«­«­«­«­«­«ù¬«ò¬«묫䬫ݬ«Ö¬«Ϭ«Ȭ«Á¬«º¬«³¬«¬¬«¥¬«ž¬«—¬«¬«‰¬«‚¬«{¬«t¬«m¬«f¬«_¬«X¬«Q¬«J¬«C¬«<¬«5¬«.¬«'¬« ¬«¬«¬« ¬«¬«ý««ö««ï««è««á««Ú««Ó««Ì««Å««¾««·««°««©««¢««›««”««««†««««x««q««j««c««\««U««N««G««@««9««2««+««$««««««««««««úª«óª«쪫媫Þª«ת«Ъ«ɪ«ª«»ª«´ª«­ª«¦ª«Ÿª«˜ª«‘ª«Šª«ƒª«|ª«uª«nª«gª«`ª«Yª«Rª«Kª«Dª«=ª«6ª«/ª«(ª«!ª«ª«ª« ª«ª«þ©«÷©«ð©«é©«â©«Û©«Ô©«Í©«Æ©«¿©«¸©«±©«ª©«£©«œ©«•©«Ž©«‡©«€©«y©«r©«k©«d©«]©«V©«O©«H©«A©«:©«3©«,©«%©«©«©«©« ©«©«û¨«ô¨«í¨«樫ߨ«ب«Ѩ«ʨ«è«¼¨«µ¨«®¨«§¨« ¨«™¨«’¨«‹¨«„¨«}¨«v¨«o¨«h¨«a¨«Z¨«S¨«L¨«E¨«>¨«7¨«0¨«)¨«"¨«¨«¨« ¨«¨«ÿ§«ø§«ñ§«ê§«ã§«ܧ«Õ§«Χ«ǧ«À§«¹§«²§««§«¤§«§«–§«§«ˆ§«§«z§«s§«l§«e§«^§«W§«P§«I§«B§«;§«4§«-§«&§«§«§«§« §«§«ü¦«õ¦«禫ফÙ¦«Ò¦«˦«Ħ«½¦«¶¦«¯¦«¨¦«¡¦«š¦«“¦«Œ¦«…¦«~¦«w¦«p¦«i¦«b¦«[¦«T¦«M¦«F¦«?¦«8¦«1¦«*¦«#¦«¦«¦«¦«¦«¦«ù¥«ò¥«륫䥫Ý¥«Ö¥«Ï¥«È¥«Á¥«º¥«³¥«¬¥«¥¥«ž¥«—¥«¥«‰¥«‚¥«{¥«t¥«m¥«f¥«_¥«X¥«Q¥«J¥«C¥«<¥«5¥«.¥«'¥« ¥«¥«¥« ¥«¥«ý¤«ö¤«狼褫ᤫÚ¤«Ó¤«̤«Ť«¾¤«·¤«°¤«©¤«¢¤«›¤«”¤«¤«†¤«¤«x¤«q¤«j¤«c¤«\¤«U¤«N¤«G¤«@¤«9¤«2¤«+¤«$¤«¤«¤«¤«¤«¤«ú£«ó£«죫士Þ£«×£«У«É£«£«»£«´£«­£«¦£«Ÿ£«˜£«‘£«Š£«ƒ£«|£«u£«n£«g£«`£«Y£«R£«K£«D£«=£«6£«/£«(£«!£«£«£« £«£«þ¢«÷¢«ð¢«颫⢫Û¢«Ô¢«Í¢«Æ¢«¿¢«¸¢«±¢«ª¢«£¢«œ¢«•¢«Ž¢«‡¢«€¢«y¢«r¢«k¢«d¢«]¢«V¢«O¢«H¢«A¢«:¢«3¢«,¢«%¢«¢«¢«¢« ¢«¢«û¡«ô¡«í¡«æ¡«ß¡«Ø¡«Ñ¡«Ê¡«á«¼¡«µ¡«®¡«§¡« ¡«™¡«’¡«‹¡«„¡«}¡«v¡«o¡«h¡«a¡«Z¡«S¡«L¡«E¡«>¡«7¡«0¡«)¡«"¡«¡«¡« ¡«¡«ÿ «ø «ñ «ê «ã «Ü «Õ «Π«Ç «À «¹ «² «« «¤ « «– « «ˆ « «z «s «l «e «^ «W «P «I «B «; «4 «- «& « « « «  « «üŸ«õŸ«矫àŸ«ÙŸ«ÒŸ«ËŸ«ÄŸ«½Ÿ«¶Ÿ«¯Ÿ«¨Ÿ«¡Ÿ«šŸ«“Ÿ«ŒŸ«…Ÿ«~Ÿ«wŸ«pŸ«iŸ«bŸ«[Ÿ«TŸ«MŸ«FŸ«?Ÿ«8Ÿ«1Ÿ«*Ÿ«#Ÿ«Ÿ«Ÿ«Ÿ«Ÿ«Ÿ«ùž«òž«ëž«äž«Ýž«Öž«Ïž«Èž«Áž«ºž«³ž«¬ž«¥ž«žž«—ž«ž«‰ž«‚ž«{ž«tž«mž«fž«_ž«Xž«Qž«Jž«Cž«<ž«5ž«.ž«'ž« ž«ž«ž« ž«ž«ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úœ«óœ«윫圫Þœ«ל«М«Éœ«œ«»œ«´œ«­œ«¦œ«Ÿœ«˜œ«‘œ«Šœ«ƒœ«|œ«uœ«nœ«gœ«`œ«Yœ«Rœ«Kœ«Dœ«=œ«6œ«/œ«(œ«!œ«œ«œ« œ«œ«þ›«÷›«ð›«雫⛫Û›«Ô›«Í›«Æ›«¿›«¸›«±›«ª›«£›«œ›«•›«Ž›«‡›«€›«y›«r›«k›«d›«]›«V›«O›«H›«A›«:›«3›«,›«%›«›«›«›« ›«›«ûš«ôš«íš«æš«ßš«Øš«Ñš«Êš«Ú«¼š«µš«®š«§š« š«™š«’š«‹š«„š«}š«vš«oš«hš«aš«Zš«Sš«Lš«Eš«>š«7š«0š«)š«"š«š«š« š«š«ÿ™«ø™«ñ™«ꙫ㙫Ü™«Õ™«Ι«Ç™«À™«¹™«²™««™«¤™«™«–™«™«ˆ™«™«z™«s™«l™«e™«^™«W™«P™«I™«B™«;™«4™«-™«&™«™«™«™« ™«™«ü˜«õ˜«瘫à˜«Ù˜«Ò˜«˘«Ę«½˜«¶˜«¯˜«¨˜«¡˜«š˜«“˜«Œ˜«…˜«~˜«w˜«p˜«i˜«b˜«[˜«T˜«M˜«F˜«?˜«8˜«1˜«*˜«#˜«˜«˜«˜«˜«˜«ù—«ò—«ë—«ä—«Ý—«Ö—«Ï—«È—«Á—«º—«³—«¬—«¥—«ž—«——«—«‰—«‚—«{—«t—«m—«f—«_—«X—«Q—«J—«C—«<—«5—«.—«'—« —«—«—« —«—«ý–«ö–«ï–«è–«á–«Ú–«Ó–«Ì–«Å–«¾–«·–«°–«©–«¢–«›–«”–«–«†–«–«x–«q–«j–«c–«\–«U–«N–«G–«@–«9–«2–«+–«$–«–«–«–«–«–«ú•«ó•«ì•«å•«Þ•«ו«Е«É•«•«»•«´•«­•«¦•«Ÿ•«˜•«‘•«Š•«ƒ•«|•«u•«n•«g•«`•«Y•«R•«K•«D•«=•«6•«/•«(•«!•«•«•« •«•«þ”«÷”«ð”«锫┫Û”«Ô”«Í”«Æ”«¿”«¸”«±”«ª”«£”«œ”«•”«Ž”«‡”«€”«y”«r”«k”«d”«]”«V”«O”«H”«A”«:”«3”«,”«%”«”«”«”« ”«”«û“«ô“«í“«æ“«ß“«Ø“«Ñ“«Ê“«Ó«¼“«µ“«®“«§“« “«™“«’“«‹“«„“«}“«v“«o“«h“«a“«Z“«S“«L“«E“«>“«7“«0“«)“«"“«“«“« “«“«ÿ’«ø’«ñ’«ê’«ã’«Ü’«Õ’«Î’«Ç’«À’«¹’«²’««’«¤’«’«–’«’«ˆ’«’«z’«s’«l’«e’«^’«W’«P’«I’«B’«;’«4’«-’«&’«’«’«’« ’«’«ü‘«õ‘«î‘«ç‘«à‘«Ù‘«Ò‘«Ë‘«Ä‘«½‘«¶‘«¯‘«¨‘«¡‘«š‘«“‘«Œ‘«…‘«~‘«w‘«p‘«i‘«b‘«[‘«T‘«M‘«F‘«?‘«8‘«1‘«*‘«#‘«‘«‘«‘«‘«‘«ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úŽ«óŽ«쎫厫ÞŽ«׎«ÐŽ«ÉŽ«ÂŽ«»Ž«´Ž«­Ž«¦Ž«ŸŽ«˜Ž«‘Ž«ŠŽ«ƒŽ«|Ž«uŽ«nŽ«gŽ«`Ž«YŽ«RŽ«KŽ«DŽ«=Ž«6Ž«/Ž«(Ž«!ޫޫޫ ޫޫþ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««ûŒ«ôŒ«팫挫ߌ«ØŒ«ÑŒ«ÊŒ«ÃŒ«¼Œ«µŒ«®Œ«§Œ« Œ«™Œ«’Œ«‹Œ«„Œ«}Œ«vŒ«oŒ«hŒ«aŒ«ZŒ«SŒ«LŒ«EŒ«>Œ«7Œ«0Œ«)Œ«"Œ«Œ«Œ« Œ«Œ«ÿ‹«ø‹«ñ‹«ê‹«ã‹«Ü‹«Õ‹«΋«Ç‹«À‹«¹‹«²‹««‹«¤‹«‹«–‹«‹«ˆ‹«‹«z‹«s‹«l‹«e‹«^‹«W‹«P‹«I‹«B‹«;‹«4‹«-‹«&‹«‹«‹«‹« ‹«‹«üŠ«õŠ«犫àŠ«ÙŠ«ÒŠ«ËŠ«ÄŠ«½Š«¶Š«¯Š«¨Š«¡Š«šŠ«“Š«ŒŠ«…Š«~Š«wŠ«pŠ«iŠ«bŠ«[Š«TŠ«MŠ«FŠ«?Š«8Š«1Š«*Š«#ЫЫЫЫЫЫù‰«ò‰«뉫䉫݉«Ö‰«ω«ȉ«Á‰«º‰«³‰«¬‰«¥‰«ž‰«—‰«‰«‰‰«‚‰«{‰«t‰«m‰«f‰«_‰«X‰«Q‰«J‰«C‰«<‰«5‰«.‰«'‰« ‰«‰«‰« ‰«‰«ýˆ«öˆ«舫ራÚˆ«Óˆ«̈«ň«¾ˆ«·ˆ«°ˆ«©ˆ«¢ˆ«›ˆ«”ˆ«ˆ«†ˆ«ˆ«xˆ«qˆ«jˆ«cˆ«\ˆ«Uˆ«Nˆ«Gˆ«@ˆ«9ˆ«2ˆ«+ˆ«$ˆ«ˆ«ˆ«ˆ«ˆ«ˆ«ú‡«ó‡«쇫凫Þ‡«ׇ«Ї«ɇ«‡«»‡«´‡«­‡«¦‡«Ÿ‡«˜‡«‘‡«Ї«ƒ‡«|‡«u‡«n‡«g‡«`‡«Y‡«R‡«K‡«D‡«=‡«6‡«/‡«(‡«!‡«‡«‡« ‡«‡«þ†«÷†«ð†«醫↫Û†«Ô†«͆«Ɔ«¿†«¸†«±†«ª†«£†«œ†«•†«ކ«‡†«€†«y†«r†«k†«d†«]†«V†«O†«H†«A†«:†«3†«,†«%†«†«†«†« †«†«û…«ô…«í…«æ…«ß…«Ø…«Ñ…«Ê…«Ã…«¼…«µ…«®…«§…« …«™…«’…«‹…«„…«}…«v…«o…«h…«a…«Z…«S…«L…«E…«>…«7…«0…«)…«"…«…«…« …«…«ÿ„«ø„«ñ„«ê„«ã„«Ü„«Õ„«΄«Ç„«À„«¹„«²„««„«¤„«„«–„«„«ˆ„«„«z„«s„«l„«e„«^„«W„«P„«I„«B„«;„«4„«-„«&„«„«„«„« „«„«üƒ«õƒ«烫àƒ«Ùƒ«Òƒ«˃«ă«½ƒ«¶ƒ«¯ƒ«¨ƒ«¡ƒ«šƒ«“ƒ«Œƒ«…ƒ«~ƒ«wƒ«pƒ«iƒ«bƒ«[ƒ«Tƒ«Mƒ«Fƒ«?ƒ«8ƒ«1ƒ«*ƒ«#ƒ«ƒ«ƒ«ƒ«ƒ«ƒ«ù‚«ò‚«ë‚«ä‚«Ý‚«Ö‚«Ï‚«È‚«Á‚«º‚«³‚«¬‚«¥‚«ž‚«—‚«‚«‰‚«‚‚«{‚«t‚«m‚«f‚«_‚«X‚«Q‚«J‚«C‚«<‚«5‚«.‚«'‚« ‚«‚«‚« ‚«‚«ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««ú€«ó€«쀫倫Þ€«×€«Ѐ«É€«€«»€«´€«­€«¦€«Ÿ€«˜€«‘€«Š€«ƒ€«|€«u€«n€«g€«`€«Y€«R€«K€«D€«=€«6€«/€«(€«!€«€«€« €«€«þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û~«ô~«í~«æ~«ß~«Ø~«Ñ~«Ê~«Ã~«¼~«µ~«®~«§~« ~«™~«’~«‹~«„~«}~«v~«o~«h~«a~«Z~«S~«L~«E~«>~«7~«0~«)~«"~«~«~« ~«~«ÿ}«ø}«ñ}«ê}«ã}«Ü}«Õ}«Î}«Ç}«À}«¹}«²}««}«¤}«}«–}«}«ˆ}«}«z}«s}«l}«e}«^}«W}«P}«I}«B}«;}«4}«-}«&}«}«}«}« }«}«ü|«õ|«î|«ç|«à|«Ù|«Ò|«Ë|«Ä|«½|«¶|«¯|«¨|«¡|«š|«“|«Œ|«…|«~|«w|«p|«i|«b|«[|«T|«M|«F|«?|«8|«1|«*|«#|«|«|«|«|«|«ù{«ò{«ë{«ä{«Ý{«Ö{«Ï{«È{«Á{«º{«³{«¬{«¥{«ž{«—{«{«‰{«‚{«{{«t{«m{«f{«_{«X{«Q{«J{«C{«<{«5{«.{«'{« {«{«{« {«{«ýz«öz«ïz«èz«áz«Úz«Óz«Ìz«Åz«¾z«·z«°z«©z«¢z«›z«”z«z«†z«z«xz«qz«jz«cz«\z«Uz«Nz«Gz«@z«9z«2z«+z«$z«z«z«z«z«z«úy«óy«ìy«åy«Þy«×y«Ðy«Éy«Ây«»y«´y«­y«¦y«Ÿy«˜y«‘y«Šy«ƒy«|y«uy«ny«gy«`y«Yy«Ry«Ky«Dy«=y«6y«/y«(y«!y«y«y« y«y«þx«÷x«ðx«éx«âx«Ûx«Ôx«Íx«Æx«¿x«¸x«±x«ªx«£x«œx«•x«Žx«‡x«€x«yx«rx«kx«dx«]x«Vx«Ox«Hx«Ax«:x«3x«,x«%x«x«x«x« x«x«ûw«ôw«íw«æw«ßw«Øw«Ñw«Êw«Ãw«¼w«µw«®w«§w« w«™w«’w«‹w«„w«}w«vw«ow«hw«aw«Zw«Sw«Lw«Ew«>w«7w«0w«)w«"w«w«w« w«w«ÿv«øv«ñv«êv«ãv«Üv«Õv«Îv«Çv«Àv«¹v«²v««v«¤v«v«–v«v«ˆv«v«zv«sv«lv«ev«^v«Wv«Pv«Iv«Bv«;v«4v«-v«&v«v«v«v« v«v«üu«õu«îu«çu«àu«Ùu«Òu«Ëu«Äu«½u«¶u«¯u«¨u«¡u«šu«“u«Œu«…u«~u«wu«pu«iu«bu«[u«Tu«Mu«Fu«?u«8u«1u«*u«#u«u«u«u«u«u«ùt«òt«ët«ät«Ýt«Öt«Ït«Èt«Át«ºt«³t«¬t«¥t«žt«—t«t«‰t«‚t«{t«tt«mt«ft«_t«Xt«Qt«Jt«Ct«p«7p«0p«)p«"p«p«p« p«p«ÿo«øo«ño«êo«ão«Üo«Õo«Îo«Ço«Ào«¹o«²o««o«¤o«o«–o«o«ˆo«o«zo«so«lo«eo«^o«Wo«Po«Io«Bo«;o«4o«-o«&o«o«o«o« o«o«ün«õn«în«çn«àn«Ùn«Òn«Ën«Än«½n«¶n«¯n«¨n«¡n«šn«“n«Œn«…n«~n«wn«pn«in«bn«[n«Tn«Mn«Fn«?n«8n«1n«*n«#n«n«n«n«n«n«ùm«òm«ëm«äm«Ým«Öm«Ïm«Èm«Ám«ºm«³m«¬m«¥m«žm«—m«m«‰m«‚m«{m«tm«mm«fm«_m«Xm«Qm«Jm«Cm«i«7i«0i«)i«"i«i«i« i«i«ÿh«øh«ñh«êh«ãh«Üh«Õh«Îh«Çh«Àh«¹h«²h««h«¤h«h«–h«h«ˆh«h«zh«sh«lh«eh«^h«Wh«Ph«Ih«Bh«;h«4h«-h«&h«h«h«h« h«h«üg«õg«îg«çg«àg«Ùg«Òg«Ëg«Äg«½g«¶g«¯g«¨g«¡g«šg«“g«Œg«…g«~g«wg«pg«ig«bg«[g«Tg«Mg«Fg«?g«8g«1g«*g«#g«g«g«g«g«g«ùf«òf«ëf«äf«Ýf«Öf«Ïf«Èf«Áf«ºf«³f«¬f«¥f«žf«—f«f«‰f«‚f«{f«tf«mf«ff«_f«Xf«Qf«Jf«Cf«b«7b«0b«)b«"b«b«b« b«b«ÿa«øa«ña«êa«ãa«Üa«Õa«Îa«Ça«Àa«¹a«²a««a«¤a«a«–a«a«ˆa«a«za«sa«la«ea«^a«Wa«Pa«Ia«Ba«;a«4a«-a«&a«a«a«a« a«a«ü`«õ`«î`«ç`«à`«Ù`«Ò`«Ë`«Ä`«½`«¶`«¯`«¨`«¡`«š`«“`«Œ`«…`«~`«w`«p`«i`«b`«[`«T`«M`«F`«?`«8`«1`«*`«#`«`«`«`«`«`«ù_«ò_«ë_«ä_«Ý_«Ö_«Ï_«È_«Á_«º_«³_«¬_«¥_«ž_«—_«_«‰_«‚_«{_«t_«m_«f_«__«X_«Q_«J_«C_«<_«5_«._«'_« _«_«_« _«_«ý^«ö^«ï^«è^«á^«Ú^«Ó^«Ì^«Å^«¾^«·^«°^«©^«¢^«›^«”^«^«†^«^«x^«q^«j^«c^«\^«U^«N^«G^«@^«9^«2^«+^«$^«^«^«^«^«^«ú]«ó]«ì]«å]«Þ]«×]«Ð]«É]«Â]«»]«´]«­]«¦]«Ÿ]«˜]«‘]«Š]«ƒ]«|]«u]«n]«g]«`]«Y]«R]«K]«D]«=]«6]«/]«(]«!]«]«]« ]«]«þ\«÷\«ð\«é\«â\«Û\«Ô\«Í\«Æ\«¿\«¸\«±\«ª\«£\«œ\«•\«Ž\«‡\«€\«y\«r\«k\«d\«]\«V\«O\«H\«A\«:\«3\«,\«%\«\«\«\« \«\«û[«ô[«í[«æ[«ß[«Ø[«Ñ[«Ê[«Ã[«¼[«µ[«®[«§[« [«™[«’[«‹[«„[«}[«v[«o[«h[«a[«Z[«S[«L[«E[«>[«7[«0[«)[«"[«[«[« [«[«ÿZ«øZ«ñZ«êZ«ãZ«ÜZ«ÕZ«ÎZ«ÇZ«ÀZ«¹Z«²Z««Z«¤Z«Z«–Z«Z«ˆZ«Z«zZ«sZ«lZ«eZ«^Z«WZ«PZ«IZ«BZ«;Z«4Z«-Z«&Z«Z«Z«Z« Z«Z«üY«õY«îY«çY«àY«ÙY«ÒY«ËY«ÄY«½Y«¶Y«¯Y«¨Y«¡Y«šY«“Y«ŒY«…Y«~Y«wY«pY«iY«bY«[Y«TY«MY«FY«?Y«8Y«1Y«*Y«#Y«Y«Y«Y«Y«Y«ùX«òX«ëX«äX«ÝX«ÖX«ÏX«ÈX«ÁX«ºX«³X«¬X«¥X«žX«—X«X«‰X«‚X«{X«tX«mX«fX«_X«XX«QX«JX«CX«T«7T«0T«)T«"T«T«T« T«T«ÿS«øS«ñS«êS«ãS«ÜS«ÕS«ÎS«ÇS«ÀS«¹S«²S««S«¤S«S«–S«S«ˆS«S«zS«sS«lS«eS«^S«WS«PS«IS«BS«;S«4S«-S«&S«S«S«S« S«S«üR«õR«îR«çR«àR«ÙR«ÒR«ËR«ÄR«½R«¶R«¯R«¨R«¡R«šR«“R«ŒR«…R«~R«wR«pR«iR«bR«[R«TR«MR«FR«?R«8R«1R«*R«#R«R«R«R«R«R«ùQ«òQ«ëQ«äQ«ÝQ«ÖQ«ÏQ«ÈQ«ÁQ«ºQ«³Q«¬Q«¥Q«žQ«—Q«Q«‰Q«‚Q«{Q«tQ«mQ«fQ«_Q«XQ«QQ«JQ«CQ«M«7M«0M«)M«"M«M«M« M«M«ÿL«øL«ñL«êL«ãL«ÜL«ÕL«ÎL«ÇL«ÀL«¹L«²L««L«¤L«L«–L«L«ˆL«L«zL«sL«lL«eL«^L«WL«PL«IL«BL«;L«4L«-L«&L«L«L«L« L«L«üK«õK«îK«çK«àK«ÙK«ÒK«ËK«ÄK«½K«¶K«¯K«¨K«¡K«šK«“K«ŒK«…K«~K«wK«pK«iK«bK«[K«TK«MK«FK«?K«8K«1K«*K«#K«K«K«K«K«K«ùJ«òJ«ëJ«äJ«ÝJ«ÖJ«ÏJ«ÈJ«ÁJ«ºJ«³J«¬J«¥J«žJ«—J«J«‰J«‚J«{J«tJ«mJ«fJ«_J«XJ«QJ«JJ«CJ«F«7F«0F«)F«"F«F«F« F«F«ÿE«øE«ñE«êE«ãE«ÜE«ÕE«ÎE«ÇE«ÀE«¹E«²E««E«¤E«E«–E«E«ˆE«E«zE«sE«lE«eE«^E«WE«PE«IE«BE«;E«4E«-E«&E«E«E«E« E«E«üD«õD«îD«çD«àD«ÙD«ÒD«ËD«ÄD«½D«¶D«¯D«¨D«¡D«šD«“D«ŒD«…D«~D«wD«pD«iD«bD«[D«TD«MD«FD«?D«8D«1D«*D«#D«D«D«D«D«D«ùC«òC«ëC«äC«ÝC«ÖC«ÏC«ÈC«ÁC«ºC«³C«¬C«¥C«žC«—C«C«‰C«‚C«{C«tC«mC«fC«_C«XC«QC«JC«CC«?«7?«0?«)?«"?«?«?« ?«?«ÿ>«ø>«ñ>«ê>«ã>«Ü>«Õ>«Î>«Ç>«À>«¹>«²>««>«¤>«>«–>«>«ˆ>«>«z>«s>«l>«e>«^>«W>«P>«I>«B>«;>«4>«->«&>«>«>«>« >«>«ü=«õ=«î=«ç=«à=«Ù=«Ò=«Ë=«Ä=«½=«¶=«¯=«¨=«¡=«š=«“=«Œ=«…=«~=«w=«p=«i=«b=«[=«T=«M=«F=«?=«8=«1=«*=«#=«=«=«=«=«=«ù<«ò<«ë<«ä<«Ý<«Ö<«Ï<«È<«Á<«º<«³<«¬<«¥<«ž<«—<«<«‰<«‚<«{<«t<«m<«f<«_<«X<«Q<«J<«C<«<<«5<«.<«'<« <«<«<« <«<«ý;«ö;«ï;«è;«á;«Ú;«Ó;«Ì;«Å;«¾;«·;«°;«©;«¢;«›;«”;«;«†;«;«x;«q;«j;«c;«\;«U;«N;«G;«@;«9;«2;«+;«$;«;«;«;«;«;«ú:«ó:«ì:«å:«Þ:«×:«Ð:«É:«Â:«»:«´:«­:«¦:«Ÿ:«˜:«‘:«Š:«ƒ:«|:«u:«n:«g:«`:«Y:«R:«K:«D:«=:«6:«/:«(:«!:«:«:« :«:«þ9«÷9«ð9«é9«â9«Û9«Ô9«Í9«Æ9«¿9«¸9«±9«ª9«£9«œ9«•9«Ž9«‡9«€9«y9«r9«k9«d9«]9«V9«O9«H9«A9«:9«39«,9«%9«9«9«9« 9«9«û8«ô8«í8«æ8«ß8«Ø8«Ñ8«Ê8«Ã8«¼8«µ8«®8«§8« 8«™8«’8«‹8«„8«}8«v8«o8«h8«a8«Z8«S8«L8«E8«>8«78«08«)8«"8«8«8« 8«8«ÿ7«ø7«ñ7«ê7«ã7«Ü7«Õ7«Î7«Ç7«À7«¹7«²7««7«¤7«7«–7«7«ˆ7«7«z7«s7«l7«e7«^7«W7«P7«I7«B7«;7«47«-7«&7«7«7«7« 7«7«ü6«õ6«î6«ç6«à6«Ù6«Ò6«Ë6«Ä6«½6«¶6«¯6«¨6«¡6«š6«“6«Œ6«…6«~6«w6«p6«i6«b6«[6«T6«M6«F6«?6«86«16«*6«#6«6«6«6«6«6«ù5«ò5«ë5«ä5«Ý5«Ö5«Ï5«È5«Á5«º5«³5«¬5«¥5«ž5«—5«5«‰5«‚5«{5«t5«m5«f5«_5«X5«Q5«J5«C5«<5«55«.5«'5« 5«5«5« 5«5«ý4«ö4«ï4«è4«á4«Ú4«Ó4«Ì4«Å4«¾4«·4«°4«©4«¢4«›4«”4«4«†4«4«x4«q4«j4«c4«\4«U4«N4«G4«@4«94«24«+4«$4«4«4«4«4«4«ú3«ó3«ì3«å3«Þ3«×3«Ð3«É3«Â3«»3«´3«­3«¦3«Ÿ3«˜3«‘3«Š3«ƒ3«|3«u3«n3«g3«`3«Y3«R3«K3«D3«=3«63«/3«(3«!3«3«3« 3«3«þ2«÷2«ð2«é2«â2«Û2«Ô2«Í2«Æ2«¿2«¸2«±2«ª2«£2«œ2«•2«Ž2«‡2«€2«y2«r2«k2«d2«]2«V2«O2«H2«A2«:2«32«,2«%2«2«2«2« 2«2«û1«ô1«í1«æ1«ß1«Ø1«Ñ1«Ê1«Ã1«¼1«µ1«®1«§1« 1«™1«’1«‹1«„1«}1«v1«o1«h1«a1«Z1«S1«L1«E1«>1«71«01«)1«"1«1«1« 1«1«ÿ0«ø0«ñ0«ê0«ã0«Ü0«Õ0«Î0«Ç0«À0«¹0«²0««0«¤0«0«–0«0«ˆ0«0«z0«s0«l0«e0«^0«W0«P0«I0«B0«;0«40«-0«&0«0«0«0« 0«0«ü/«õ/«î/«ç/«à/«Ù/«Ò/«Ë/«Ä/«½/«¶/«¯/«¨/«¡/«š/«“/«Œ/«…/«~/«w/«p/«i/«b/«[/«T/«M/«F/«?/«8/«1/«*/«#/«/«/«/«/«/«ù.«ò.«ë.«ä.«Ý.«Ö.«Ï.«È.«Á.«º.«³.«¬.«¥.«ž.«—.«.«‰.«‚.«{.«t.«m.«f.«_.«X.«Q.«J.«C.«<.«5.«..«'.« .«.«.« .«.«ý-«ö-«ï-«è-«á-«Ú-«Ó-«Ì-«Å-«¾-«·-«°-«©-«¢-«›-«”-«-«†-«-«x-«q-«j-«c-«\-«U-«N-«G-«@-«9-«2-«+-«$-«-«-«-«-«-«ú,«ó,«ì,«å,«Þ,«×,«Ð,«É,«Â,«»,«´,«­,«¦,«Ÿ,«˜,«‘,«Š,«ƒ,«|,«u,«n,«g,«`,«Y,«R,«K,«D,«=,«6,«/,«(,«!,«,«,« ,«,«þ+«÷+«ð+«é+«â+«Û+«Ô+«Í+«Æ+«¿+«¸+«±+«ª+«£+«œ+«•+«Ž+«‡+«€+«y+«r+«k+«d+«]+«V+«O+«H+«A+«:+«3+«,+«%+«+«+«+« +«+«û*«ô*«í*«æ*«ß*«Ø*«Ñ*«Ê*«Ã*«¼*«µ*«®*«§*« *«™*«’*«‹*«„*«}*«v*«o*«h*«a*«Z*«S*«L*«E*«>*«7*«0*«)*«"*«*«*« *«*«ÿ)«ø)«ñ)«ê)«ã)«Ü)«Õ)«Î)«Ç)«À)«¹)«²)««)«¤)«)«–)«)«ˆ)«)«z)«s)«l)«e)«^)«W)«P)«I)«B)«;)«4)«-)«&)«)«)«)« )«)«ü(«õ(«î(«ç(«à(«Ù(«Ò(«Ë(«Ä(«½(«¶(«¯(«¨(«¡(«š(«“(«Œ(«…(«~(«w(«p(«i(«b(«[(«T(«M(«F(«?(«8(«1(«*(«#(«(«(«(«(«(«ù'«ò'«ë'«ä'«Ý'«Ö'«Ï'«È'«Á'«º'«³'«¬'«¥'«ž'«—'«'«‰'«‚'«{'«t'«m'«f'«_'«X'«Q'«J'«C'«<'«5'«.'«''« '«'«'« '«'«ý&«ö&«ï&«è&«á&«Ú&«Ó&«Ì&«Å&«¾&«·&«°&«©&«¢&«›&«”&«&«†&«&«x&«q&«j&«c&«\&«U&«N&«G&«@&«9&«2&«+&«$&«&«&«&«&«&«ú%«ó%«ì%«å%«Þ%«×%«Ð%«É%«Â%«»%«´%«­%«¦%«Ÿ%«˜%«‘%«Š%«ƒ%«|%«u%«n%«g%«`%«Y%«R%«K%«D%«=%«6%«/%«(%«!%«%«%« %«%«þ$«÷$«ð$«é$«â$«Û$«Ô$«Í$«Æ$«¿$«¸$«±$«ª$«£$«œ$«•$«Ž$«‡$«€$«y$«r$«k$«d$«]$«V$«O$«H$«A$«:$«3$«,$«%$«$«$«$« $«$«û#«ô#«í#«æ#«ß#«Ø#«Ñ#«Ê#«Ã#«¼#«µ#«®#«§#« #«™#«’#«‹#«„#«}#«v#«o#«h#«a#«Z#«S#«L#«E#«>#«7#«0#«)#«"#«#«#« #«#«ÿ"«ø"«ñ"«ê"«ã"«Ü"«Õ"«Î"«Ç"«À"«¹"«²"««"«¤"«"«–"«"«ˆ"«"«z"«s"«l"«e"«^"«W"«P"«I"«B"«;"«4"«-"«&"«"«"«"« "«"«ü!«õ!«î!«ç!«à!«Ù!«Ò!«Ë!«Ä!«½!«¶!«¯!«¨!«¡!«š!«“!«Œ!«…!«~!«w!«p!«i!«b!«[!«T!«M!«F!«?!«8!«1!«*!«#!«!«!«!«!«!«ù «ò «ë «ä «Ý «Ö «Ï «È «Á «º «³ «¬ «¥ «ž «— « «‰ «‚ «{ «t «m «f «_ «X «Q «J «C «< «5 «. «' « « « « « «ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««ú«ó«ì«å«Þ«×«Ð«É«Â«»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û«ô«í«æ«ß«Ø«Ñ«Ê«Ã«¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿ«ø«ñ«ê«ã«Ü«Õ«Î«Ç«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««ú«ó«ì«å«Þ«×«Ð«É«Â«»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û«ô«í«æ«ß«Ø«Ñ«Ê«Ã«¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿ«ø«ñ«ê«ã«Ü«Õ«Î«Ç«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««ú«ó«ì«å«Þ«×«Ð«É«Â«»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û«ô«í«æ«ß«Ø«Ñ«Ê«Ã«¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿ «ø «ñ «ê «ã «Ü «Õ «Î «Ç «À «¹ «² «« «¤ « «– « «ˆ « «z «s «l «e «^ «W «P «I «B «; «4 «- «& « « « « « «ü «õ «î «ç «à «Ù «Ò «Ë «Ä «½ «¶ «¯ «¨ «¡ «š «“ «Œ «… «~ «w «p «i «b «[ «T «M «F «? «8 «1 «* «# « « « « « «ù «ò «ë «ä «Ý «Ö «Ï «È «Á «º «³ «¬ «¥ «ž «— « «‰ «‚ «{ «t «m «f «_ «X «Q «J «C «< «5 «. «' « « « « « «ý «ö «ï «è «á «Ú «Ó «Ì «Å «¾ «· «° «© «¢ «› «” « «† « «x «q «j «c «\ «U «N «G «@ «9 «2 «+ «$ « « « « « «ú «ó «ì «å «Þ «× «Ð «É « «» «´ «­ «¦ «Ÿ «˜ «‘ «Š «ƒ «| «u «n «g «` «Y «R «K «D «= «6 «/ «( «! « « « « «þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û«ô«í«æ«ß«Ø«Ñ«Ê«Ã«¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿ«ø«ñ«ê«ã«Ü«Õ«Î«Ç«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««ú«ó«ì«å«Þ«×«Ð«É«Â«»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««û«ô«í«æ«ß«Ø«Ñ«Ê«ë¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿÿªøÿªñÿªêÿªãÿªÜÿªÕÿªÎÿªÇÿªÀÿª¹ÿª²ÿª«ÿª¤ÿªÿª–ÿªÿªˆÿªÿªzÿªsÿªlÿªeÿª^ÿªWÿªPÿªIÿªBÿª;ÿª4ÿª-ÿª&ÿªÿªÿªÿª ÿªÿªüþªõþªîþªçþªàþªÙþªÒþªËþªÄþª½þª¶þª¯þª¨þª¡þªšþª“þªŒþª…þª~þªwþªpþªiþªbþª[þªTþªMþªFþª?þª8þª1þª*þª#þªþªþªþªþªþªùýªòýªëýªäýªÝýªÖýªÏýªÈýªÁýªºýª³ýª¬ýª¥ýªžýª—ýªýª‰ýª‚ýª{ýªtýªmýªfýª_ýªXýªQýªJýªCýª<ýª5ýª.ýª'ýª ýªýªýª ýªýªýüªöüªïüªèüªáüªÚüªÓüªÌüªÅüª¾üª·üª°üª©üª¢üª›üª”üªüª†üªüªxüªqüªjüªcüª\üªUüªNüªGüª@üª9üª2üª+üª$üªüªüªüªüªüªúûªóûªìûªåûªÞûª×ûªÐûªÉûªÂûª»ûª´ûª­ûª¦ûªŸûª˜ûª‘ûªŠûªƒûª|ûªuûªnûªgûª`ûªYûªRûªKûªDûª=ûª6ûª/ûª(ûª!ûªûªûª ûªûªþúª÷úªðúªéúªâúªÛúªÔúªÍúªÆúª¿úª¸úª±úªªúª£úªœúª•úªŽúª‡úª€úªyúªrúªkúªdúª]úªVúªOúªHúªAúª:úª3úª,úª%úªúªúªúª úªúªûùªôùªíùªæùªßùªØùªÑùªÊùªÃùª¼ùªµùª®ùª§ùª ùª™ùª’ùª‹ùª„ùª}ùªvùªoùªhùªaùªZùªSùªLùªEùª>ùª7ùª0ùª)ùª"ùªùªùª ùªùªÿøªøøªñøªêøªãøªÜøªÕøªÎøªÇøªÀøª¹øª²øª«øª¤øªøª–øªøªˆøªøªzøªsøªløªeøª^øªWøªPøªIøªBøª;øª4øª-øª&øªøªøªøª øªøªü÷ªõ÷ªî÷ªç÷ªà÷ªÙ÷ªÒ÷ªË÷ªÄ÷ª½÷ª¶÷ª¯÷ª¨÷ª¡÷ªš÷ª“÷ªŒ÷ª…÷ª~÷ªw÷ªp÷ªi÷ªb÷ª[÷ªT÷ªM÷ªF÷ª?÷ª8÷ª1÷ª*÷ª#÷ª÷ª÷ª÷ª÷ª÷ªùöªòöªëöªäöªÝöªÖöªÏöªÈöªÁöªºöª³öª¬öª¥öªžöª—öªöª‰öª‚öª{öªtöªmöªföª_öªXöªQöªJöªCöª<öª5öª.öª'öª öªöªöª öªöªýõªöõªïõªèõªáõªÚõªÓõªÌõªÅõª¾õª·õª°õª©õª¢õª›õª”õªõª†õªõªxõªqõªjõªcõª\õªUõªNõªGõª@õª9õª2õª+õª$õªõªõªõªõªõªúôªóôªìôªåôªÞôª×ôªÐôªÉôªÂôª»ôª´ôª­ôª¦ôªŸôª˜ôª‘ôªŠôªƒôª|ôªuôªnôªgôª`ôªYôªRôªKôªDôª=ôª6ôª/ôª(ôª!ôªôªôª ôªôªþóª÷óªðóªéóªâóªÛóªÔóªÍóªÆóª¿óª¸óª±óªªóª£óªœóª•óªŽóª‡óª€óªyóªróªkóªdóª]óªVóªOóªHóªAóª:óª3óª,óª%óªóªóªóª óªóªûòªôòªíòªæòªßòªØòªÑòªÊòªÃòª¼òªµòª®òª§òª òª™òª’òª‹òª„òª}òªvòªoòªhòªaòªZòªSòªLòªEòª>òª7òª0òª)òª"òªòªòª òªòªÿñªøñªññªêñªãñªÜñªÕñªÎñªÇñªÀñª¹ñª²ñª«ñª¤ñªñª–ñªñªˆñªñªzñªsñªlñªeñª^ñªWñªPñªIñªBñª;ñª4ñª-ñª&ñªñªñªñª ñªñªüðªõðªîðªçðªàðªÙðªÒðªËðªÄðª½ðª¶ðª¯ðª¨ðª¡ðªšðª“ðªŒðª…ðª~ðªwðªpðªiðªbðª[ðªTðªMðªFðª?ðª8ðª1ðª*ðª#ðªðªðªðªðªðªùïªòïªëïªäïªÝïªÖïªÏïªÈïªÁ諸荒窱瘟爵流ïªïª‰ïª‚ïª{ïªtïªmïªfïª_ïªXïªQïªJïªCïª<ïª5ïª.ïª'ïª ïªïªïª ïªïªýîªöîªïîªèîªáîªÚîªÓîªÌîªÅîªîª†îªîªxîªqîªjîªcîª\îªUîªNîªGîª@îª9îª2îª+îª$îªîªîªîªîªîªúíªóíªìíªåíªÞíª×íªÐíªÉíªÂíª»íª´íª­íª¦íªŸíª˜íª‘íªŠíªƒíª|íªuíªníªgíª`íªYíªRíªKíªDíª=íª6íª/íª(íª!íªíªíª íªíªþìª÷ìªðìªéìªâìªÛìªÔìªÍìªÆìª¿ìª¸ìª±ìªªìª£ìªœìª•ìªŽìª‡ìª€ìªyìªrìªkìªdìª]ìªVìªOìªHìªAìª:ìª3ìª,ìª%ìªìªìªìª ìªìªûëªôëªíëªæëªßëªØëªÑëªÊëªÃ몼몵몮몧몠몙몒몋몄ëª}ëªvëªoëªhëªaëªZëªSëªLëªEëª>ëª7ëª0ëª)ëª"ëªëªëª ëªëªÿêªøêªñêªêêªãêªÜêªÕêªÎêªÇêªÀꪹꪲꪫꪤêªêª–êªêªˆêªêªzêªsêªlêªeêª^êªWêªPêªIêªBêª;êª4êª-êª&êªêªêªêª êªêªüéªõéªîéªçéªàéªÙéªÒéªËéªÄ骽骶骯骨骡骚骓验骅éª~éªwéªpéªiéªbéª[éªTéªMéªFéª?éª8éª1éª*éª#éªéªéªéªéªéªùèªòèªëèªäèªÝèªÖèªÏèªÈèªÁ誺誳説誥語誗èªèª‰èª‚èª{èªtèªmèªfèª_èªXèªQèªJèªCèª<èª5èª.èª'èª èªèªèª èªèªýçªöçªïçªèçªáçªÚçªÓçªÌçªÅ窾窷窰窩窢窛窔çªçª†çªçªxçªqçªjçªcçª\çªUçªNçªGçª@çª9çª2çª+çª$çªçªçªçªçªçªúæªóæªìæªåæªÞæª׿ªÐæªÉæªÂ檻檴檭檦檟檘檑檊檃æª|æªuæªnæªgæª`æªYæªRæªKæªDæª=æª6æª/æª(æª!æªæªæª æªæªþåª÷åªðåªéåªâåªÛåªÔåªÍåªÆåª¿åª¸åª±åªªåª£åªœåª•åªŽåª‡åª€åªyåªråªkåªdåª]åªVåªOåªHåªAåª:åª3åª,åª%åªåªåªåª åªåªûäªôäªíäªæäªßäªØäªÑäªÊäªÃ䪼䪵䪮䪧䪠䪙䪒䪋䪄äª}äªväªoäªhäªaäªZäªSäªLäªEäª>äª7äª0äª)äª"äªäªäª äªäªÿãªøãªñãªêãªããªÜãªÕãªÎãªÇãªÀ㪹㪲㪫㪤ãªãª–ãªãªˆãªãªzãªsãªlãªeãª^ãªWãªPãªIãªBãª;ãª4ãª-ãª&ãªãªãªãª ãªãªüâªõâªîâªçâªàâªÙâªÒâªËâªÄ⪽⪶⪯⪨⪡⪚⪓⪌⪅âª~âªwâªpâªiâªbâª[âªTâªMâªFâª?âª8âª1âª*âª#âªâªâªâªâªâªùáªòáªëáªäáªÝáªÖáªÏáªÈáªÁ᪺᪳᪬᪥᪞᪗áªáª‰áª‚áª{áªtáªmáªfáª_áªXáªQáªJáªCáª<áª5áª.áª'᪠áªáªáª áªáªýàªöàªïàªèàªáàªÚàªÓàªÌàªÅાષર઩ઢછઔàªàª†àªàªxàªqàªjàªcàª\àªUàªNàªGàª@àª9àª2àª+àª$àªàªàªàªàªàªúߪóߪìߪåߪÞߪ×ߪÐߪÉߪÂߪ»ßª´ßª­ßª¦ßªŸßª˜ßª‘ߪŠßªƒßª|ߪuߪnߪgߪ`ߪYߪRߪKߪDߪ=ߪ6ߪ/ߪ(ߪ!ߪߪߪ ߪߪþÞª÷ÞªðÞªéÞªâÞªÛÞªÔÞªÍÞªÆÞª¿Þª¸Þª±ÞªªÞª£ÞªœÞª•ÞªŽÞª‡Þª€ÞªyÞªrÞªkÞªdÞª]ÞªVÞªOÞªHÞªAÞª:Þª3Þª,Þª%ÞªÞªÞªÞª ÞªÞªûݪôݪíݪæÝªßݪØÝªÑݪÊݪÃݪ¼ÝªµÝª®Ýª§Ýª Ýª™Ýª’ݪ‹Ýª„ݪ}ݪvݪoݪhݪaݪZݪSݪLݪEݪ>ݪ7ݪ0ݪ)ݪ"ݪݪݪ ݪݪÿܪøÜªñܪêܪãܪÜܪÕܪÎܪÇܪÀܪ¹Üª²Üª«Üª¤Üªܪ–ܪܪˆÜªܪzܪsܪlܪeܪ^ܪWܪPܪIܪBܪ;ܪ4ܪ-ܪ&ܪܪܪܪ ܪܪüÛªõÛªîÛªçÛªàÛªÙÛªÒÛªËÛªÄÛª½Ûª¶Ûª¯Ûª¨Ûª¡ÛªšÛª“ÛªŒÛª…Ûª~ÛªwÛªpÛªiÛªbÛª[ÛªTÛªMÛªFÛª?Ûª8Ûª1Ûª*Ûª#ÛªÛªÛªÛªÛªÛªùÚªòÚªëÚªäÚªÝÚªÖÚªÏÚªÈÚªÁÚªºÚª³Úª¬Úª¥ÚªžÚª—ÚªÚª‰Úª‚Úª{ÚªtÚªmÚªfÚª_ÚªXÚªQÚªJÚªCÚª<Úª5Úª.Úª'Úª ÚªÚªÚª ÚªÚªýÙªöÙªïÙªèÙªáÙªÚÙªÓÙªÌÙªÅÙª¾Ùª·Ùª°Ùª©Ùª¢Ùª›Ùª”٪٪†ÙªÙªxÙªqÙªjÙªcÙª\ÙªUÙªNÙªGÙª@Ùª9Ùª2Ùª+Ùª$٪٪٪٪٪٪úتóتìØªåØªÞØªרªÐØªÉØªÂت»Øª´Øª­Øª¦ØªŸØª˜Øª‘تŠØªƒØª|تuتnتgت`تYتRتKتDت=ت6ت/ت(ت!تتت تتþת÷תðתéתâתÛתÔתÍתÆ×ª¿×ª¸×ª±×ªª×ª£×ªœ×ª•תŽ×ª‡×ª€×ªyתrתkתdת]תVתOתHתAת:ת3ת,ת%תתתת תתûÖªôÖªíÖªæÖªßÖªØÖªÑÖªÊÖªÃÖª¼ÖªµÖª®Öª§Öª Öª™Öª’Öª‹Öª„Öª}ÖªvÖªoÖªhÖªaÖªZÖªSÖªLÖªEÖª>Öª7Öª0Öª)Öª"ÖªÖªÖª ÖªÖªÿÕªøÕªñÕªêÕªãÕªÜÕªÕÕªÎÕªÇÕªÀÕª¹Õª²Õª«Õª¤ÕªÕª–ÕªÕªˆÕªÕªzÕªsÕªlÕªeÕª^ÕªWÕªPÕªIÕªBÕª;Õª4Õª-Õª&ÕªÕªÕªÕª ÕªÕªüÔªõÔªîÔªçÔªàÔªÙÔªÒÔªËÔªÄÔª½Ôª¶Ôª¯Ôª¨Ôª¡ÔªšÔª“ÔªŒÔª…Ôª~ÔªwÔªpÔªiÔªbÔª[ÔªTÔªMÔªFÔª?Ôª8Ôª1Ôª*Ôª#ÔªÔªÔªÔªÔªÔªùÓªòÓªëÓªäÓªÝÓªÖÓªÏÓªÈÓªÁÓªºÓª³Óª¬Óª¥ÓªžÓª—ÓªÓª‰Óª‚Óª{ÓªtÓªmÓªfÓª_ÓªXÓªQÓªJÓªCÓª<Óª5Óª.Óª'Óª ÓªÓªÓª ÓªÓªýÒªöÒªïÒªèÒªáÒªÚÒªÓÒªÌÒªÅÒª¾Òª·Òª°Òª©Òª¢Òª›Òª”ÒªÒª†ÒªÒªxÒªqÒªjÒªcÒª\ÒªUÒªNÒªGÒª@Òª9Òª2Òª+Òª$ÒªÒªÒªÒªÒªÒªúѪóѪìѪåѪÞѪ×ѪÐѪÉѪÂѪ»Ñª´Ñª­Ñª¦ÑªŸÑª˜Ñª‘ѪŠÑªƒÑª|ѪuѪnѪgѪ`ѪYѪRѪKѪDѪ=Ѫ6Ѫ/Ѫ(Ѫ!ѪѪѪ ѪѪþЪ÷ЪðЪéЪâЪÛЪÔЪÍЪÆÐª¿Ðª¸Ðª±ÐªªÐª£ÐªœÐª•ЪŽÐª‡Ðª€ÐªyЪrЪkЪdЪ]ЪVЪOЪHЪAЪ:Ъ3Ъ,Ъ%ЪЪЪЪ ЪЪûϪôϪíϪæÏªßϪØÏªÑϪÊϪÃϪ¼ÏªµÏª®Ïª§Ïª Ïª™Ïª’Ϫ‹Ïª„Ϫ}ϪvϪoϪhϪaϪZϪSϪLϪEϪ>Ϫ7Ϫ0Ϫ)Ϫ"ϪϪϪ ϪϪÿΪøÎªñΪêΪãΪÜΪÕΪÎΪÇΪÀΪ¹Îª²Îª«Îª¤ÎªΪ–ΪΪˆÎªΪzΪsΪlΪeΪ^ΪWΪPΪIΪBΪ;Ϊ4Ϊ-Ϊ&ΪΪΪΪ ΪΪüͪõͪîͪçͪàͪÙͪÒͪËͪÄͪ½Íª¶Íª¯Íª¨Íª¡ÍªšÍª“ͪŒÍª…ͪ~ͪwͪpͪiͪbͪ[ͪTͪMͪFͪ?ͪ8ͪ1ͪ*ͪ#ͪͪͪͪͪͪù̪ò̪ë̪ä̪Ý̪Ö̪Ï̪È̪Á̪ºÌª³Ìª¬Ìª¥ÌªžÌª—̪̪‰Ìª‚̪{̪t̪m̪f̪_̪X̪Q̪J̪C̪<̪5̪.̪'̪ ̪̪̪ ̪̪ý˪ö˪ï˪è˪á˪Ú˪Ó˪Ì˪Å˪¾Ëª·Ëª°Ëª©Ëª¢Ëª›Ëª”˪˪†Ëª˪x˪q˪j˪c˪\˪U˪N˪G˪@˪9˪2˪+˪$˪˪˪˪˪˪úʪóʪìʪåʪÞʪ×ʪÐʪÉʪÂʪ»Êª´Êª­Êª¦ÊªŸÊª˜Êª‘ʪŠÊªƒÊª|ʪuʪnʪgʪ`ʪYʪRʪKʪDʪ=ʪ6ʪ/ʪ(ʪ!ʪʪʪ ʪʪþɪ÷ɪðɪéɪâɪÛɪÔɪÍɪÆÉª¿Éª¸Éª±ÉªªÉª£ÉªœÉª•ɪŽÉª‡Éª€Éªyɪrɪkɪdɪ]ɪVɪOɪHɪAɪ:ɪ3ɪ,ɪ%ɪɪɪɪ ɪɪûȪôȪíȪæÈªßȪØÈªÑȪÊȪÃȪ¼ÈªµÈª®Èª§Èª Èª™Èª’Ȫ‹Èª„Ȫ}ȪvȪoȪhȪaȪZȪSȪLȪEȪ>Ȫ7Ȫ0Ȫ)Ȫ"ȪȪȪ ȪȪÿǪøÇªñǪêǪãǪÜǪÕǪÎǪÇǪÀǪ¹Çª²Çª«Çª¤ÇªǪ–ǪǪˆÇªǪzǪsǪlǪeǪ^ǪWǪPǪIǪBǪ;Ǫ4Ǫ-Ǫ&ǪǪǪǪ ǪǪüƪõƪîÆªçÆªàÆªÙÆªÒÆªËÆªÄƪ½Æª¶Æª¯Æª¨Æª¡ÆªšÆª“ƪŒÆª…ƪ~ƪwƪpƪiƪbƪ[ƪTƪMƪFƪ?ƪ8ƪ1ƪ*ƪ#ƪƪƪƪƪƪùŪòŪëŪäŪÝŪÖŪÏŪÈŪÁŪºÅª³Åª¬Åª¥ÅªžÅª—ŪŪ‰Åª‚Ū{ŪtŪmŪfŪ_ŪXŪQŪJŪCŪ<Ū5Ū.Ū'Ū ŪŪŪ ŪŪýĪöĪïĪèĪáĪÚĪÓĪÌĪÅĪ¾Äª·Äª°Äª©Äª¢Äª›Äª”ĪĪ†ÄªĪxĪqĪjĪcĪ\ĪUĪNĪGĪ@Ī9Ī2Ī+Ī$ĪĪĪĪĪĪúêóêìêåêÞê×êÐêÉêÂê»Ãª´Ãª­Ãª¦ÃªŸÃª˜Ãª‘êŠÃªƒÃª|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþª÷ªðªéªâªÛªÔªͪÆÂª¿Âª¸Âª±ÂªªÂª£ÂªœÂª•ªŽÂª‡Âª€Âªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªûÁªôÁªíÁªæÁªßÁªØÁªÑÁªÊÁªÃÁª¼ÁªµÁª®Áª§Áª Áª™Áª’Áª‹Áª„Áª}ÁªvÁªoÁªhÁªaÁªZÁªSÁªLÁªEÁª>Áª7Áª0Áª)Áª"ÁªÁªÁª ÁªÁªÿÀªøÀªñÀªêÀªãÀªÜÀªÕÀªÎÀªÇÀªÀÀª¹Àª²Àª«Àª¤ÀªÀª–ÀªÀªˆÀªÀªzÀªsÀªlÀªeÀª^ÀªWÀªPÀªIÀªBÀª;Àª4Àª-Àª&ÀªÀªÀªÀª ÀªÀªü¿ªõ¿ª翪࿪Ù¿ªÒ¿ªË¿ªÄ¿ª½¿ª¶¿ª¯¿ª¨¿ª¡¿ªš¿ª“¿ªŒ¿ª…¿ª~¿ªw¿ªp¿ªi¿ªb¿ª[¿ªT¿ªM¿ªF¿ª?¿ª8¿ª1¿ª*¿ª#¿ª¿ª¿ª¿ª¿ª¿ªù¾ªò¾ª뾪侪ݾªÖ¾ªϾªȾªÁ¾ªº¾ª³¾ª¬¾ª¥¾ªž¾ª—¾ª¾ª‰¾ª‚¾ª{¾ªt¾ªm¾ªf¾ª_¾ªX¾ªQ¾ªJ¾ªC¾ª<¾ª5¾ª.¾ª'¾ª ¾ª¾ª¾ª ¾ª¾ªý½ªö½ªェ轪ὪÚ½ªÓ½ª̽ªŽª¾½ª·½ª°½ª©½ª¢½ª›½ª”½ª½ª†½ª½ªx½ªq½ªj½ªc½ª\½ªU½ªN½ªG½ª@½ª9½ª2½ª+½ª$½ª½ª½ª½ª½ª½ªú¼ªó¼ª켪弪Þ¼ª×¼ªмªɼª¼ª»¼ª´¼ª­¼ª¦¼ªŸ¼ª˜¼ª‘¼ªмªƒ¼ª|¼ªu¼ªn¼ªg¼ª`¼ªY¼ªR¼ªK¼ªD¼ª=¼ª6¼ª/¼ª(¼ª!¼ª¼ª¼ª ¼ª¼ªþ»ª÷»ªð»ª黪⻪Û»ªÔ»ªÍ»ªÆ»ª¿»ª¸»ª±»ªª»ª£»ªœ»ª•»ªŽ»ª‡»ª€»ªy»ªr»ªk»ªd»ª]»ªV»ªO»ªH»ªA»ª:»ª3»ª,»ª%»ª»ª»ª»ª »ª»ªûºªôºªíºª溪ߺªغªѺªʺªúª¼ºªµºª®ºª§ºª ºª™ºª’ºª‹ºª„ºª}ºªvºªoºªhºªaºªZºªSºªLºªEºª>ºª7ºª0ºª)ºª"ºªºªºª ºªºªÿ¹ªø¹ªñ¹ª깪㹪ܹªÕ¹ªιªǹªÀ¹ª¹¹ª²¹ª«¹ª¤¹ª¹ª–¹ª¹ªˆ¹ª¹ªz¹ªs¹ªl¹ªe¹ª^¹ªW¹ªP¹ªI¹ªB¹ª;¹ª4¹ª-¹ª&¹ª¹ª¹ª¹ª ¹ª¹ªü¸ªõ¸ª縪สÙ¸ªÒ¸ª˸ªĸª½¸ª¶¸ª¯¸ª¨¸ª¡¸ªš¸ª“¸ªŒ¸ª…¸ª~¸ªw¸ªp¸ªi¸ªb¸ª[¸ªT¸ªM¸ªF¸ª?¸ª8¸ª1¸ª*¸ª#¸ª¸ª¸ª¸ª¸ª¸ªù·ªò·ªë·ªä·ªÝ·ªÖ·ªÏ·ªÈ·ªÁ·ªº·ª³·ª¬·ª¥·ªž·ª—·ª·ª‰·ª‚·ª{·ªt·ªm·ªf·ª_·ªX·ªQ·ªJ·ªC·ª<·ª5·ª.·ª'·ª ·ª·ª·ª ·ª·ªý¶ªö¶ªﶪ趪ᶪÚ¶ªÓ¶ª̶ªŶª¾¶ª·¶ª°¶ª©¶ª¢¶ª›¶ª”¶ª¶ª†¶ª¶ªx¶ªq¶ªj¶ªc¶ª\¶ªU¶ªN¶ªG¶ª@¶ª9¶ª2¶ª+¶ª$¶ª¶ª¶ª¶ª¶ª¶ªúµªóµª쵪嵪Þµª×µªеªɵªµª»µª´µª­µª¦µªŸµª˜µª‘µªеªƒµª|µªuµªnµªgµª`µªYµªRµªKµªDµª=µª6µª/µª(µª!µªµªµª µªµªþ´ª÷´ªð´ªé´ªâ´ªÛ´ªÔ´ªÍ´ªÆ´ª¿´ª¸´ª±´ªª´ª£´ªœ´ª•´ªŽ´ª‡´ª€´ªy´ªr´ªk´ªd´ª]´ªV´ªO´ªH´ªA´ª:´ª3´ª,´ª%´ª´ª´ª´ª ´ª´ªû³ªô³ªí³ª泪ß³ªسªѳªʳªóª¼³ªµ³ª®³ª§³ª ³ª™³ª’³ª‹³ª„³ª}³ªv³ªo³ªh³ªa³ªZ³ªS³ªL³ªE³ª>³ª7³ª0³ª)³ª"³ª³ª³ª ³ª³ªÿ²ªø²ªñ²ª겪㲪ܲªÕ²ªβªDzªÀ²ª¹²ª²²ª«²ª¤²ª²ª–²ª²ªˆ²ª²ªz²ªs²ªl²ªe²ª^²ªW²ªP²ªI²ªB²ª;²ª4²ª-²ª&²ª²ª²ª²ª ²ª²ªü±ªõ±ª籪౪Ù±ªÒ±ª˱ªıª½±ª¶±ª¯±ª¨±ª¡±ªš±ª“±ªŒ±ª…±ª~±ªw±ªp±ªi±ªb±ª[±ªT±ªM±ªF±ª?±ª8±ª1±ª*±ª#±ª±ª±ª±ª±ª±ªù°ªò°ªë°ªä°ªݰªÖ°ªϰªȰªÁ°ªº°ª³°ª¬°ª¥°ªž°ª—°ª°ª‰°ª‚°ª{°ªt°ªm°ªf°ª_°ªX°ªQ°ªJ°ªC°ª<°ª5°ª.°ª'°ª °ª°ª°ª °ª°ªý¯ªö¯ªﯪ诪ᯪÚ¯ªÓ¯ª̯ªůª¾¯ª·¯ª°¯ª©¯ª¢¯ª›¯ª”¯ª¯ª†¯ª¯ªx¯ªq¯ªj¯ªc¯ª\¯ªU¯ªN¯ªG¯ª@¯ª9¯ª2¯ª+¯ª$¯ª¯ª¯ª¯ª¯ª¯ªú®ªó®ª쮪宪Þ®ª×®ªЮªÉ®ª®ª»®ª´®ª­®ª¦®ªŸ®ª˜®ª‘®ªŠ®ªƒ®ª|®ªu®ªn®ªg®ª`®ªY®ªR®ªK®ªD®ª=®ª6®ª/®ª(®ª!®ª®ª®ª ®ª®ªþ­ª÷­ªð­ªé­ªâ­ªÛ­ªÔ­ªÍ­ªÆ­ª¿­ª¸­ª±­ªª­ª£­ªœ­ª•­ªŽ­ª‡­ª€­ªy­ªr­ªk­ªd­ª]­ªV­ªO­ªH­ªA­ª:­ª3­ª,­ª%­ª­ª­ª­ª ­ª­ªû¬ªô¬ªí¬ª欪߬ªجªѬªʬªìª¼¬ªµ¬ª®¬ª§¬ª ¬ª™¬ª’¬ª‹¬ª„¬ª}¬ªv¬ªo¬ªh¬ªa¬ªZ¬ªS¬ªL¬ªE¬ª>¬ª7¬ª0¬ª)¬ª"¬ª¬ª¬ª ¬ª¬ªÿ«ªø«ªñ«ªꫪ㫪Ü«ªÕ«ªΫªÇ«ªÀ«ª¹«ª²«ª««ª¤«ª«ª–«ª«ªˆ«ª«ªz«ªs«ªl«ªe«ª^«ªW«ªP«ªI«ªB«ª;«ª4«ª-«ª&«ª«ª«ª«ª «ª«ªüªªõªª窪પÙªªÒªª˪ªĪª½ªª¶ªª¯ªª¨ªª¡ªªšªª“ªªŒªª…ªª~ªªwªªpªªiªªbªª[ªªTªªMªªFªª?ªª8ªª1ªª*ªª#ªªªªªªªªªªªªù©ªò©ª멪䩪Ý©ªÖ©ªÏ©ªÈ©ªÁ©ªº©ª³©ª¬©ª¥©ªž©ª—©ª©ª‰©ª‚©ª{©ªt©ªm©ªf©ª_©ªX©ªQ©ªJ©ªC©ª<©ª5©ª.©ª'©ª ©ª©ª©ª ©ª©ªý¨ªö¨ª飯訪ᨪÚ¨ªÓ¨ª̨ªŨª¾¨ª·¨ª°¨ª©¨ª¢¨ª›¨ª”¨ª¨ª†¨ª¨ªx¨ªq¨ªj¨ªc¨ª\¨ªU¨ªN¨ªG¨ª@¨ª9¨ª2¨ª+¨ª$¨ª¨ª¨ª¨ª¨ª¨ªú§ªó§ª짪姪Þ§ª×§ªЧªɧª§ª»§ª´§ª­§ª¦§ªŸ§ª˜§ª‘§ªЧªƒ§ª|§ªu§ªn§ªg§ª`§ªY§ªR§ªK§ªD§ª=§ª6§ª/§ª(§ª!§ª§ª§ª §ª§ªþ¦ª÷¦ªð¦ª馪⦪Û¦ªÔ¦ªͦªƦª¿¦ª¸¦ª±¦ªª¦ª£¦ªœ¦ª•¦ªަª‡¦ª€¦ªy¦ªr¦ªk¦ªd¦ª]¦ªV¦ªO¦ªH¦ªA¦ª:¦ª3¦ª,¦ª%¦ª¦ª¦ª¦ª ¦ª¦ªû¥ªô¥ªí¥ª楪ߥªØ¥ªÑ¥ªÊ¥ªÃ¥ª¼¥ªµ¥ª®¥ª§¥ª ¥ª™¥ª’¥ª‹¥ª„¥ª}¥ªv¥ªo¥ªh¥ªa¥ªZ¥ªS¥ªL¥ªE¥ª>¥ª7¥ª0¥ª)¥ª"¥ª¥ª¥ª ¥ª¥ªÿ¤ªø¤ªñ¤ªꤪ㤪ܤªÕ¤ªΤªǤªÀ¤ª¹¤ª²¤ª«¤ª¤¤ª¤ª–¤ª¤ªˆ¤ª¤ªz¤ªs¤ªl¤ªe¤ª^¤ªW¤ªP¤ªI¤ªB¤ª;¤ª4¤ª-¤ª&¤ª¤ª¤ª¤ª ¤ª¤ªü£ªõ£ª磪࣪Ù£ªÒ£ªË£ªÄ£ª½£ª¶£ª¯£ª¨£ª¡£ªš£ª“£ªŒ£ª…£ª~£ªw£ªp£ªi£ªb£ª[£ªT£ªM£ªF£ª?£ª8£ª1£ª*£ª#£ª£ª£ª£ª£ª£ªù¢ªò¢ª뢪䢪Ý¢ªÖ¢ªÏ¢ªÈ¢ªÁ¢ªº¢ª³¢ª¬¢ª¥¢ªž¢ª—¢ª¢ª‰¢ª‚¢ª{¢ªt¢ªm¢ªf¢ª_¢ªX¢ªQ¢ªJ¢ªC¢ª<¢ª5¢ª.¢ª'¢ª ¢ª¢ª¢ª ¢ª¢ªý¡ªö¡ª衪ᡪÚ¡ªÓ¡ªÌ¡ªÅ¡ª¾¡ª·¡ª°¡ª©¡ª¢¡ª›¡ª”¡ª¡ª†¡ª¡ªx¡ªq¡ªj¡ªc¡ª\¡ªU¡ªN¡ªG¡ª@¡ª9¡ª2¡ª+¡ª$¡ª¡ª¡ª¡ª¡ª¡ªú ªó ªì ªå ªÞ ª× ªРªÉ ª ª» ª´ ª­ ª¦ ªŸ ª˜ ª‘ ªŠ ªƒ ª| ªu ªn ªg ª` ªY ªR ªK ªD ª= ª6 ª/ ª( ª! ª ª ª  ª ªþŸª÷ŸªðŸª韪⟪ÛŸªÔŸªÍŸªÆŸª¿Ÿª¸Ÿª±ŸªªŸª£ŸªœŸª•ŸªŽŸª‡Ÿª€ŸªyŸªrŸªkŸªdŸª]ŸªVŸªOŸªHŸªAŸª:Ÿª3Ÿª,Ÿª%ŸªŸªŸªŸª ŸªŸªûžªôžª힪枪ßžªØžªÑžªÊžªÞª¼žªµžª®žª§žª žª™žª’žª‹žª„žª}žªvžªožªhžªažªZžªSžªLžªEžª>žª7žª0žª)žª"žªžªžª žªžªÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüœªõœª眪àœªÙœªÒœªËœªÄœª½œª¶œª¯œª¨œª¡œªšœª“œªŒœª…œª~œªwœªpœªiœªbœª[œªTœªMœªFœª?œª8œª1œª*œª#œªœªœªœªœªœªù›ªò›ª뛪䛪Ý›ªÖ›ªÏ›ªÈ›ªÁ›ªº›ª³›ª¬›ª¥›ªž›ª—›ª›ª‰›ª‚›ª{›ªt›ªm›ªf›ª_›ªX›ªQ›ªJ›ªC›ª<›ª5›ª.›ª'›ª ›ª›ª›ª ›ª›ªýšªöšª蚪ᚪÚšªÓšªÌšªÅšª¾šª·šª°šª©šª¢šª›šª”šªšª†šªšªxšªqšªjšªcšª\šªUšªNšªGšª@šª9šª2šª+šª$šªšªšªšªšªšªú™ªó™ª왪噪Þ™ª×™ªЙªÉ™ª™ª»™ª´™ª­™ª¦™ªŸ™ª˜™ª‘™ªŠ™ªƒ™ª|™ªu™ªn™ªg™ª`™ªY™ªR™ªK™ªD™ª=™ª6™ª/™ª(™ª!™ª™ª™ª ™ª™ªþ˜ª÷˜ªð˜ª阪☪Û˜ªÔ˜ª͘ªƘª¿˜ª¸˜ª±˜ªª˜ª£˜ªœ˜ª•˜ªŽ˜ª‡˜ª€˜ªy˜ªr˜ªk˜ªd˜ª]˜ªV˜ªO˜ªH˜ªA˜ª:˜ª3˜ª,˜ª%˜ª˜ª˜ª˜ª ˜ª˜ªû—ªô—ªí—ªæ—ªß—ªØ—ªÑ—ªÊ—ªת¼—ªµ—ª®—ª§—ª —ª™—ª’—ª‹—ª„—ª}—ªv—ªo—ªh—ªa—ªZ—ªS—ªL—ªE—ª>—ª7—ª0—ª)—ª"—ª—ª—ª —ª—ªÿ–ªø–ªñ–ªê–ªã–ªÜ–ªÕ–ªΖªÇ–ªÀ–ª¹–ª²–ª«–ª¤–ª–ª––ª–ªˆ–ª–ªz–ªs–ªl–ªe–ª^–ªW–ªP–ªI–ªB–ª;–ª4–ª-–ª&–ª–ª–ª–ª –ª–ªü•ªõ•ª番à•ªÙ•ªÒ•ªË•ªÄ•ª½•ª¶•ª¯•ª¨•ª¡•ªš•ª“•ªŒ•ª…•ª~•ªw•ªp•ªi•ªb•ª[•ªT•ªM•ªF•ª?•ª8•ª1•ª*•ª#•ª•ª•ª•ª•ª•ªù”ªò”ª딪䔪Ý”ªÖ”ªÏ”ªÈ”ªÁ”ªº”ª³”ª¬”ª¥”ªž”ª—”ª”ª‰”ª‚”ª{”ªt”ªm”ªf”ª_”ªX”ªQ”ªJ”ªC”ª<”ª5”ª.”ª'”ª ”ª”ª”ª ”ª”ªý“ªö“ª蓪ᓪÚ“ªÓ“ªÌ“ªÅ“ª¾“ª·“ª°“ª©“ª¢“ª›“ª”“ª“ª†“ª“ªx“ªq“ªj“ªc“ª\“ªU“ªN“ªG“ª@“ª9“ª2“ª+“ª$“ª“ª“ª“ª“ª“ªú’ªó’ªì’ªå’ªÞ’ª×’ªÐ’ªÉ’ªÂ’ª»’ª´’ª­’ª¦’ªŸ’ª˜’ª‘’ªŠ’ªƒ’ª|’ªu’ªn’ªg’ª`’ªY’ªR’ªK’ªD’ª=’ª6’ª/’ª(’ª!’ª’ª’ª ’ª’ªþ‘ª÷‘ªð‘ª鑪⑪Û‘ªÔ‘ªÍ‘ªÆ‘ª¿‘ª¸‘ª±‘ªª‘ª£‘ªœ‘ª•‘ªŽ‘ª‡‘ª€‘ªy‘ªr‘ªk‘ªd‘ª]‘ªV‘ªO‘ªH‘ªA‘ª:‘ª3‘ª,‘ª%‘ª‘ª‘ª‘ª ‘ª‘ªûªôªíªæªߪتѪʪ꼪µª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüŽªõŽª玪àŽªÙŽªÒŽªËŽªÄŽª½Žª¶Žª¯Žª¨Žª¡ŽªšŽª“ŽªŒŽª…Žª~ŽªwŽªpŽªiŽªbŽª[ŽªTŽªMŽªFŽª?Žª8Žª1Žª*Žª#ŽªŽªŽªŽªŽªŽªùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýŒªöŒª茪ጪÚŒªÓŒªÌŒªÅŒª¾Œª·Œª°Œª©Œª¢Œª›Œª”ŒªŒª†ŒªŒªxŒªqŒªjŒªcŒª\ŒªUŒªNŒªGŒª@Œª9Œª2Œª+Œª$ŒªŒªŒªŒªŒªŒªú‹ªó‹ª싪勪Þ‹ª׋ªЋªÉ‹ª‹ª»‹ª´‹ª­‹ª¦‹ªŸ‹ª˜‹ª‘‹ªŠ‹ªƒ‹ª|‹ªu‹ªn‹ªg‹ª`‹ªY‹ªR‹ªK‹ªD‹ª=‹ª6‹ª/‹ª(‹ª!‹ª‹ª‹ª ‹ª‹ªþŠª÷ŠªðŠª銪⊪ÛŠªÔŠªÍŠªÆŠª¿Šª¸Šª±ŠªªŠª£ŠªœŠª•ŠªŽŠª‡Šª€ŠªyŠªrŠªkŠªdŠª]ŠªVŠªOŠªHŠªAŠª:Šª3Šª,Šª%ŠªŠªŠªŠª ŠªŠªû‰ªô‰ª퉪扪߉ª؉ªщªʉªɪ¼‰ªµ‰ª®‰ª§‰ª ‰ª™‰ª’‰ª‹‰ª„‰ª}‰ªv‰ªo‰ªh‰ªa‰ªZ‰ªS‰ªL‰ªE‰ª>‰ª7‰ª0‰ª)‰ª"‰ª‰ª‰ª ‰ª‰ªÿˆªøˆªñˆªꈪ㈪܈ªÕˆªΈªLjªÀˆª¹ˆª²ˆª«ˆª¤ˆªˆª–ˆªˆªˆˆªˆªzˆªsˆªlˆªeˆª^ˆªWˆªPˆªIˆªBˆª;ˆª4ˆª-ˆª&ˆªˆªˆªˆª ˆªˆªü‡ªõ‡ª燪à‡ªÙ‡ªÒ‡ªˇªćª½‡ª¶‡ª¯‡ª¨‡ª¡‡ªš‡ª“‡ªŒ‡ª…‡ª~‡ªw‡ªp‡ªi‡ªb‡ª[‡ªT‡ªM‡ªF‡ª?‡ª8‡ª1‡ª*‡ª#‡ª‡ª‡ª‡ª‡ª‡ªù†ªò†ª놪䆪݆ªÖ†ªφªȆªÁ†ªº†ª³†ª¬†ª¥†ªž†ª—†ª†ª‰†ª‚†ª{†ªt†ªm†ªf†ª_†ªX†ªQ†ªJ†ªC†ª<†ª5†ª.†ª'†ª †ª†ª†ª †ª†ªý…ªö…ªï…ªè…ªá…ªÚ…ªÓ…ªÌ…ªÅ…ª¾…ª·…ª°…ª©…ª¢…ª›…ª”…ª…ª†…ª…ªx…ªq…ªj…ªc…ª\…ªU…ªN…ªG…ª@…ª9…ª2…ª+…ª$…ª…ª…ª…ª…ª…ªú„ªó„ª섪優Þ„ªׄªЄªÉ„ª„ª»„ª´„ª­„ª¦„ªŸ„ª˜„ª‘„ªŠ„ªƒ„ª|„ªu„ªn„ªg„ª`„ªY„ªR„ªK„ªD„ª=„ª6„ª/„ª(„ª!„ª„ª„ª „ª„ªþƒª÷ƒªðƒª郪⃪ÛƒªÔƒª̓ªƃª¿ƒª¸ƒª±ƒªªƒª£ƒªœƒª•ƒªŽƒª‡ƒª€ƒªyƒªrƒªkƒªdƒª]ƒªVƒªOƒªHƒªAƒª:ƒª3ƒª,ƒª%ƒªƒªƒªƒª ƒªƒªû‚ªô‚ª킪悪ß‚ªØ‚ªÑ‚ªÊ‚ªª¼‚ªµ‚ª®‚ª§‚ª ‚ª™‚ª’‚ª‹‚ª„‚ª}‚ªv‚ªo‚ªh‚ªa‚ªZ‚ªS‚ªL‚ªE‚ª>‚ª7‚ª0‚ª)‚ª"‚ª‚ª‚ª ‚ª‚ªÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªü€ªõ€ª瀪à€ªÙ€ªÒ€ªË€ªÄ€ª½€ª¶€ª¯€ª¨€ª¡€ªš€ª“€ªŒ€ª…€ª~€ªw€ªp€ªi€ªb€ª[€ªT€ªM€ªF€ª?€ª8€ª1€ª*€ª#€ª€ª€ª€ª€ª€ªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý~ªö~ªï~ªè~ªá~ªÚ~ªÓ~ªÌ~ªÅ~ª¾~ª·~ª°~ª©~ª¢~ª›~ª”~ª~ª†~ª~ªx~ªq~ªj~ªc~ª\~ªU~ªN~ªG~ª@~ª9~ª2~ª+~ª$~ª~ª~ª~ª~ª~ªú}ªó}ªì}ªå}ªÞ}ª×}ªÐ}ªÉ}ªÂ}ª»}ª´}ª­}ª¦}ªŸ}ª˜}ª‘}ªŠ}ªƒ}ª|}ªu}ªn}ªg}ª`}ªY}ªR}ªK}ªD}ª=}ª6}ª/}ª(}ª!}ª}ª}ª }ª}ªþ|ª÷|ªð|ªé|ªâ|ªÛ|ªÔ|ªÍ|ªÆ|ª¿|ª¸|ª±|ªª|ª£|ªœ|ª•|ªŽ|ª‡|ª€|ªy|ªr|ªk|ªd|ª]|ªV|ªO|ªH|ªA|ª:|ª3|ª,|ª%|ª|ª|ª|ª |ª|ªû{ªô{ªí{ªæ{ªß{ªØ{ªÑ{ªÊ{ªÃ{ª¼{ªµ{ª®{ª§{ª {ª™{ª’{ª‹{ª„{ª}{ªv{ªo{ªh{ªa{ªZ{ªS{ªL{ªE{ª>{ª7{ª0{ª){ª"{ª{ª{ª {ª{ªÿzªøzªñzªêzªãzªÜzªÕzªÎzªÇzªÀzª¹zª²zª«zª¤zªzª–zªzªˆzªzªzzªszªlzªezª^zªWzªPzªIzªBzª;zª4zª-zª&zªzªzªzª zªzªüyªõyªîyªçyªàyªÙyªÒyªËyªÄyª½yª¶yª¯yª¨yª¡yªšyª“yªŒyª…yª~yªwyªpyªiyªbyª[yªTyªMyªFyª?yª8yª1yª*yª#yªyªyªyªyªyªùxªòxªëxªäxªÝxªÖxªÏxªÈxªÁxªºxª³xª¬xª¥xªžxª—xªxª‰xª‚xª{xªtxªmxªfxª_xªXxªQxªJxªCxªtª7tª0tª)tª"tªtªtª tªtªÿsªøsªñsªêsªãsªÜsªÕsªÎsªÇsªÀsª¹sª²sª«sª¤sªsª–sªsªˆsªsªzsªssªlsªesª^sªWsªPsªIsªBsª;sª4sª-sª&sªsªsªsª sªsªürªõrªîrªçrªàrªÙrªÒrªËrªÄrª½rª¶rª¯rª¨rª¡rªšrª“rªŒrª…rª~rªwrªprªirªbrª[rªTrªMrªFrª?rª8rª1rª*rª#rªrªrªrªrªrªùqªòqªëqªäqªÝqªÖqªÏqªÈqªÁqªºqª³qª¬qª¥qªžqª—qªqª‰qª‚qª{qªtqªmqªfqª_qªXqªQqªJqªCqªmª7mª0mª)mª"mªmªmª mªmªÿlªølªñlªêlªãlªÜlªÕlªÎlªÇlªÀlª¹lª²lª«lª¤lªlª–lªlªˆlªlªzlªslªllªelª^lªWlªPlªIlªBlª;lª4lª-lª&lªlªlªlª lªlªükªõkªîkªçkªàkªÙkªÒkªËkªÄkª½kª¶kª¯kª¨kª¡kªškª“kªŒkª…kª~kªwkªpkªikªbkª[kªTkªMkªFkª?kª8kª1kª*kª#kªkªkªkªkªkªùjªòjªëjªäjªÝjªÖjªÏjªÈjªÁjªºjª³jª¬jª¥jªžjª—jªjª‰jª‚jª{jªtjªmjªfjª_jªXjªQjªJjªCjªfª7fª0fª)fª"fªfªfª fªfªÿeªøeªñeªêeªãeªÜeªÕeªÎeªÇeªÀeª¹eª²eª«eª¤eªeª–eªeªˆeªeªzeªseªleªeeª^eªWeªPeªIeªBeª;eª4eª-eª&eªeªeªeª eªeªüdªõdªîdªçdªàdªÙdªÒdªËdªÄdª½dª¶dª¯dª¨dª¡dªšdª“dªŒdª…dª~dªwdªpdªidªbdª[dªTdªMdªFdª?dª8dª1dª*dª#dªdªdªdªdªdªùcªòcªëcªäcªÝcªÖcªÏcªÈcªÁcªºcª³cª¬cª¥cªžcª—cªcª‰cª‚cª{cªtcªmcªfcª_cªXcªQcªJcªCcª_ª7_ª0_ª)_ª"_ª_ª_ª _ª_ªÿ^ªø^ªñ^ªê^ªã^ªÜ^ªÕ^ªÎ^ªÇ^ªÀ^ª¹^ª²^ª«^ª¤^ª^ª–^ª^ªˆ^ª^ªz^ªs^ªl^ªe^ª^^ªW^ªP^ªI^ªB^ª;^ª4^ª-^ª&^ª^ª^ª^ª ^ª^ªü]ªõ]ªî]ªç]ªà]ªÙ]ªÒ]ªË]ªÄ]ª½]ª¶]ª¯]ª¨]ª¡]ªš]ª“]ªŒ]ª…]ª~]ªw]ªp]ªi]ªb]ª[]ªT]ªM]ªF]ª?]ª8]ª1]ª*]ª#]ª]ª]ª]ª]ª]ªù\ªò\ªë\ªä\ªÝ\ªÖ\ªÏ\ªÈ\ªÁ\ªº\ª³\ª¬\ª¥\ªž\ª—\ª\ª‰\ª‚\ª{\ªt\ªm\ªf\ª_\ªX\ªQ\ªJ\ªC\ª<\ª5\ª.\ª'\ª \ª\ª\ª \ª\ªý[ªö[ªï[ªè[ªá[ªÚ[ªÓ[ªÌ[ªÅ[ª¾[ª·[ª°[ª©[ª¢[ª›[ª”[ª[ª†[ª[ªx[ªq[ªj[ªc[ª\[ªU[ªN[ªG[ª@[ª9[ª2[ª+[ª$[ª[ª[ª[ª[ª[ªúZªóZªìZªåZªÞZª×ZªÐZªÉZªÂZª»Zª´Zª­Zª¦ZªŸZª˜Zª‘ZªŠZªƒZª|ZªuZªnZªgZª`ZªYZªRZªKZªDZª=Zª6Zª/Zª(Zª!ZªZªZª ZªZªþYª÷YªðYªéYªâYªÛYªÔYªÍYªÆYª¿Yª¸Yª±YªªYª£YªœYª•YªŽYª‡Yª€YªyYªrYªkYªdYª]YªVYªOYªHYªAYª:Yª3Yª,Yª%YªYªYªYª YªYªûXªôXªíXªæXªßXªØXªÑXªÊXªÃXª¼XªµXª®Xª§Xª Xª™Xª’Xª‹Xª„Xª}XªvXªoXªhXªaXªZXªSXªLXªEXª>Xª7Xª0Xª)Xª"XªXªXª XªXªÿWªøWªñWªêWªãWªÜWªÕWªÎWªÇWªÀWª¹Wª²Wª«Wª¤WªWª–WªWªˆWªWªzWªsWªlWªeWª^WªWWªPWªIWªBWª;Wª4Wª-Wª&WªWªWªWª WªWªüVªõVªîVªçVªàVªÙVªÒVªËVªÄVª½Vª¶Vª¯Vª¨Vª¡VªšVª“VªŒVª…Vª~VªwVªpVªiVªbVª[VªTVªMVªFVª?Vª8Vª1Vª*Vª#VªVªVªVªVªVªùUªòUªëUªäUªÝUªÖUªÏUªÈUªÁUªºUª³Uª¬Uª¥UªžUª—UªUª‰Uª‚Uª{UªtUªmUªfUª_UªXUªQUªJUªCUªQª7Qª0Qª)Qª"QªQªQª QªQªÿPªøPªñPªêPªãPªÜPªÕPªÎPªÇPªÀPª¹Pª²Pª«Pª¤PªPª–PªPªˆPªPªzPªsPªlPªePª^PªWPªPPªIPªBPª;Pª4Pª-Pª&PªPªPªPª PªPªüOªõOªîOªçOªàOªÙOªÒOªËOªÄOª½Oª¶Oª¯Oª¨Oª¡OªšOª“OªŒOª…Oª~OªwOªpOªiOªbOª[OªTOªMOªFOª?Oª8Oª1Oª*Oª#OªOªOªOªOªOªùNªòNªëNªäNªÝNªÖNªÏNªÈNªÁNªºNª³Nª¬Nª¥NªžNª—NªNª‰Nª‚Nª{NªtNªmNªfNª_NªXNªQNªJNªCNªJª7Jª0Jª)Jª"JªJªJª JªJªÿIªøIªñIªêIªãIªÜIªÕIªÎIªÇIªÀIª¹Iª²Iª«Iª¤IªIª–IªIªˆIªIªzIªsIªlIªeIª^IªWIªPIªIIªBIª;Iª4Iª-Iª&IªIªIªIª IªIªüHªõHªîHªçHªàHªÙHªÒHªËHªÄHª½Hª¶Hª¯Hª¨Hª¡HªšHª“HªŒHª…Hª~HªwHªpHªiHªbHª[HªTHªMHªFHª?Hª8Hª1Hª*Hª#HªHªHªHªHªHªùGªòGªëGªäGªÝGªÖGªÏGªÈGªÁGªºGª³Gª¬Gª¥GªžGª—GªGª‰Gª‚Gª{GªtGªmGªfGª_GªXGªQGªJGªCGªCª7Cª0Cª)Cª"CªCªCª CªCªÿBªøBªñBªêBªãBªÜBªÕBªÎBªÇBªÀBª¹Bª²Bª«Bª¤BªBª–BªBªˆBªBªzBªsBªlBªeBª^BªWBªPBªIBªBBª;Bª4Bª-Bª&BªBªBªBª BªBªüAªõAªîAªçAªàAªÙAªÒAªËAªÄAª½Aª¶Aª¯Aª¨Aª¡AªšAª“AªŒAª…Aª~AªwAªpAªiAªbAª[AªTAªMAªFAª?Aª8Aª1Aª*Aª#AªAªAªAªAªAªù@ªò@ªë@ªä@ªÝ@ªÖ@ªÏ@ªÈ@ªÁ@ªº@ª³@ª¬@ª¥@ªž@ª—@ª@ª‰@ª‚@ª{@ªt@ªm@ªf@ª_@ªX@ªQ@ªJ@ªC@ª<@ª5@ª.@ª'@ª @ª@ª@ª @ª@ªý?ªö?ªï?ªè?ªá?ªÚ?ªÓ?ªÌ?ªÅ?ª¾?ª·?ª°?ª©?ª¢?ª›?ª”?ª?ª†?ª?ªx?ªq?ªj?ªc?ª\?ªU?ªN?ªG?ª@?ª9?ª2?ª+?ª$?ª?ª?ª?ª?ª?ªú>ªó>ªì>ªå>ªÞ>ª×>ªÐ>ªÉ>ªÂ>ª»>ª´>ª­>ª¦>ªŸ>ª˜>ª‘>ªŠ>ªƒ>ª|>ªu>ªn>ªg>ª`>ªY>ªR>ªK>ªD>ª=>ª6>ª/>ª(>ª!>ª>ª>ª >ª>ªþ=ª÷=ªð=ªé=ªâ=ªÛ=ªÔ=ªÍ=ªÆ=ª¿=ª¸=ª±=ªª=ª£=ªœ=ª•=ªŽ=ª‡=ª€=ªy=ªr=ªk=ªd=ª]=ªV=ªO=ªH=ªA=ª:=ª3=ª,=ª%=ª=ª=ª=ª =ª=ªû<ªô<ªí<ªæ<ªß<ªØ<ªÑ<ªÊ<ªÃ<ª¼<ªµ<ª®<ª§<ª <ª™<ª’<ª‹<ª„<ª}<ªv<ªo<ªh<ªa<ªZ<ªS<ªL<ªE<ª><ª7<ª0<ª)<ª"<ª<ª<ª <ª<ªÿ;ªø;ªñ;ªê;ªã;ªÜ;ªÕ;ªÎ;ªÇ;ªÀ;ª¹;ª²;ª«;ª¤;ª;ª–;ª;ªˆ;ª;ªz;ªs;ªl;ªe;ª^;ªW;ªP;ªI;ªB;ª;;ª4;ª-;ª&;ª;ª;ª;ª ;ª;ªü:ªõ:ªî:ªç:ªà:ªÙ:ªÒ:ªË:ªÄ:ª½:ª¶:ª¯:ª¨:ª¡:ªš:ª“:ªŒ:ª…:ª~:ªw:ªp:ªi:ªb:ª[:ªT:ªM:ªF:ª?:ª8:ª1:ª*:ª#:ª:ª:ª:ª:ª:ªù9ªò9ªë9ªä9ªÝ9ªÖ9ªÏ9ªÈ9ªÁ9ªº9ª³9ª¬9ª¥9ªž9ª—9ª9ª‰9ª‚9ª{9ªt9ªm9ªf9ª_9ªX9ªQ9ªJ9ªC9ª<9ª59ª.9ª'9ª 9ª9ª9ª 9ª9ªý8ªö8ªï8ªè8ªá8ªÚ8ªÓ8ªÌ8ªÅ8ª¾8ª·8ª°8ª©8ª¢8ª›8ª”8ª8ª†8ª8ªx8ªq8ªj8ªc8ª\8ªU8ªN8ªG8ª@8ª98ª28ª+8ª$8ª8ª8ª8ª8ª8ªú7ªó7ªì7ªå7ªÞ7ª×7ªÐ7ªÉ7ªÂ7ª»7ª´7ª­7ª¦7ªŸ7ª˜7ª‘7ªŠ7ªƒ7ª|7ªu7ªn7ªg7ª`7ªY7ªR7ªK7ªD7ª=7ª67ª/7ª(7ª!7ª7ª7ª 7ª7ªþ6ª÷6ªð6ªé6ªâ6ªÛ6ªÔ6ªÍ6ªÆ6ª¿6ª¸6ª±6ªª6ª£6ªœ6ª•6ªŽ6ª‡6ª€6ªy6ªr6ªk6ªd6ª]6ªV6ªO6ªH6ªA6ª:6ª36ª,6ª%6ª6ª6ª6ª 6ª6ªû5ªô5ªí5ªæ5ªß5ªØ5ªÑ5ªÊ5ªÃ5ª¼5ªµ5ª®5ª§5ª 5ª™5ª’5ª‹5ª„5ª}5ªv5ªo5ªh5ªa5ªZ5ªS5ªL5ªE5ª>5ª75ª05ª)5ª"5ª5ª5ª 5ª5ªÿ4ªø4ªñ4ªê4ªã4ªÜ4ªÕ4ªÎ4ªÇ4ªÀ4ª¹4ª²4ª«4ª¤4ª4ª–4ª4ªˆ4ª4ªz4ªs4ªl4ªe4ª^4ªW4ªP4ªI4ªB4ª;4ª44ª-4ª&4ª4ª4ª4ª 4ª4ªü3ªõ3ªî3ªç3ªà3ªÙ3ªÒ3ªË3ªÄ3ª½3ª¶3ª¯3ª¨3ª¡3ªš3ª“3ªŒ3ª…3ª~3ªw3ªp3ªi3ªb3ª[3ªT3ªM3ªF3ª?3ª83ª13ª*3ª#3ª3ª3ª3ª3ª3ªù2ªò2ªë2ªä2ªÝ2ªÖ2ªÏ2ªÈ2ªÁ2ªº2ª³2ª¬2ª¥2ªž2ª—2ª2ª‰2ª‚2ª{2ªt2ªm2ªf2ª_2ªX2ªQ2ªJ2ªC2ª<2ª52ª.2ª'2ª 2ª2ª2ª 2ª2ªý1ªö1ªï1ªè1ªá1ªÚ1ªÓ1ªÌ1ªÅ1ª¾1ª·1ª°1ª©1ª¢1ª›1ª”1ª1ª†1ª1ªx1ªq1ªj1ªc1ª\1ªU1ªN1ªG1ª@1ª91ª21ª+1ª$1ª1ª1ª1ª1ª1ªú0ªó0ªì0ªå0ªÞ0ª×0ªÐ0ªÉ0ªÂ0ª»0ª´0ª­0ª¦0ªŸ0ª˜0ª‘0ªŠ0ªƒ0ª|0ªu0ªn0ªg0ª`0ªY0ªR0ªK0ªD0ª=0ª60ª/0ª(0ª!0ª0ª0ª 0ª0ªþ/ª÷/ªð/ªé/ªâ/ªÛ/ªÔ/ªÍ/ªÆ/ª¿/ª¸/ª±/ªª/ª£/ªœ/ª•/ªŽ/ª‡/ª€/ªy/ªr/ªk/ªd/ª]/ªV/ªO/ªH/ªA/ª:/ª3/ª,/ª%/ª/ª/ª/ª /ª/ªû.ªô.ªí.ªæ.ªß.ªØ.ªÑ.ªÊ.ªÃ.ª¼.ªµ.ª®.ª§.ª .ª™.ª’.ª‹.ª„.ª}.ªv.ªo.ªh.ªa.ªZ.ªS.ªL.ªE.ª>.ª7.ª0.ª).ª".ª.ª.ª .ª.ªÿ-ªø-ªñ-ªê-ªã-ªÜ-ªÕ-ªÎ-ªÇ-ªÀ-ª¹-ª²-ª«-ª¤-ª-ª–-ª-ªˆ-ª-ªz-ªs-ªl-ªe-ª^-ªW-ªP-ªI-ªB-ª;-ª4-ª--ª&-ª-ª-ª-ª -ª-ªü,ªõ,ªî,ªç,ªà,ªÙ,ªÒ,ªË,ªÄ,ª½,ª¶,ª¯,ª¨,ª¡,ªš,ª“,ªŒ,ª…,ª~,ªw,ªp,ªi,ªb,ª[,ªT,ªM,ªF,ª?,ª8,ª1,ª*,ª#,ª,ª,ª,ª,ª,ªù+ªò+ªë+ªä+ªÝ+ªÖ+ªÏ+ªÈ+ªÁ+ªº+ª³+ª¬+ª¥+ªž+ª—+ª+ª‰+ª‚+ª{+ªt+ªm+ªf+ª_+ªX+ªQ+ªJ+ªC+ª<+ª5+ª.+ª'+ª +ª+ª+ª +ª+ªý*ªö*ªï*ªè*ªá*ªÚ*ªÓ*ªÌ*ªÅ*ª¾*ª·*ª°*ª©*ª¢*ª›*ª”*ª*ª†*ª*ªx*ªq*ªj*ªc*ª\*ªU*ªN*ªG*ª@*ª9*ª2*ª+*ª$*ª*ª*ª*ª*ª*ªú)ªó)ªì)ªå)ªÞ)ª×)ªÐ)ªÉ)ªÂ)ª»)ª´)ª­)ª¦)ªŸ)ª˜)ª‘)ªŠ)ªƒ)ª|)ªu)ªn)ªg)ª`)ªY)ªR)ªK)ªD)ª=)ª6)ª/)ª()ª!)ª)ª)ª )ª)ªþ(ª÷(ªð(ªé(ªâ(ªÛ(ªÔ(ªÍ(ªÆ(ª¿(ª¸(ª±(ªª(ª£(ªœ(ª•(ªŽ(ª‡(ª€(ªy(ªr(ªk(ªd(ª](ªV(ªO(ªH(ªA(ª:(ª3(ª,(ª%(ª(ª(ª(ª (ª(ªû'ªô'ªí'ªæ'ªß'ªØ'ªÑ'ªÊ'ªÃ'ª¼'ªµ'ª®'ª§'ª 'ª™'ª’'ª‹'ª„'ª}'ªv'ªo'ªh'ªa'ªZ'ªS'ªL'ªE'ª>'ª7'ª0'ª)'ª"'ª'ª'ª 'ª'ªÿ&ªø&ªñ&ªê&ªã&ªÜ&ªÕ&ªÎ&ªÇ&ªÀ&ª¹&ª²&ª«&ª¤&ª&ª–&ª&ªˆ&ª&ªz&ªs&ªl&ªe&ª^&ªW&ªP&ªI&ªB&ª;&ª4&ª-&ª&&ª&ª&ª&ª &ª&ªü%ªõ%ªî%ªç%ªà%ªÙ%ªÒ%ªË%ªÄ%ª½%ª¶%ª¯%ª¨%ª¡%ªš%ª“%ªŒ%ª…%ª~%ªw%ªp%ªi%ªb%ª[%ªT%ªM%ªF%ª?%ª8%ª1%ª*%ª#%ª%ª%ª%ª%ª%ªù$ªò$ªë$ªä$ªÝ$ªÖ$ªÏ$ªÈ$ªÁ$ªº$ª³$ª¬$ª¥$ªž$ª—$ª$ª‰$ª‚$ª{$ªt$ªm$ªf$ª_$ªX$ªQ$ªJ$ªC$ª<$ª5$ª.$ª'$ª $ª$ª$ª $ª$ªý#ªö#ªï#ªè#ªá#ªÚ#ªÓ#ªÌ#ªÅ#ª¾#ª·#ª°#ª©#ª¢#ª›#ª”#ª#ª†#ª#ªx#ªq#ªj#ªc#ª\#ªU#ªN#ªG#ª@#ª9#ª2#ª+#ª$#ª#ª#ª#ª#ª#ªú"ªó"ªì"ªå"ªÞ"ª×"ªÐ"ªÉ"ªÂ"ª»"ª´"ª­"ª¦"ªŸ"ª˜"ª‘"ªŠ"ªƒ"ª|"ªu"ªn"ªg"ª`"ªY"ªR"ªK"ªD"ª="ª6"ª/"ª("ª!"ª"ª"ª "ª"ªþ!ª÷!ªð!ªé!ªâ!ªÛ!ªÔ!ªÍ!ªÆ!ª¿!ª¸!ª±!ªª!ª£!ªœ!ª•!ªŽ!ª‡!ª€!ªy!ªr!ªk!ªd!ª]!ªV!ªO!ªH!ªA!ª:!ª3!ª,!ª%!ª!ª!ª!ª !ª!ªû ªô ªí ªæ ªß ªØ ªÑ ªÊ ªà ª¼ ªµ ª® ª§ ª  ª™ ª’ ª‹ ª„ ª} ªv ªo ªh ªa ªZ ªS ªL ªE ª> ª7 ª0 ª) ª" ª ª ª ª ªÿªøªñªêªãªÜªÕªÎªÇªÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüªõªîªçªàªÙªÒªËªÄª½ª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýªöªïªèªáªÚªÓªÌªÅª¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªúªóªìªåªÞª×ªÐªÉªÂª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþª÷ªðªéªâªÛªÔªÍªÆª¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªûªôªíªæªßªØªÑªÊªÃª¼ªµª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿªøªñªêªãªÜªÕªÎªÇªÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüªõªîªçªàªÙªÒªËªÄª½ª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýªöªïªèªáªÚªÓªÌªÅª¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªúªóªìªåªÞª×ªÐªÉªÂª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþª÷ªðªéªâªÛªÔªÍªÆª¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªûªôªíªæªßªØªÑªÊªÃª¼ªµª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿªøªñªêªãªÜªÕªÎªÇªÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüªõªîªçªàªÙªÒªËªÄª½ª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýªöªïªèªáªÚªÓªÌªÅª¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªú ªó ªì ªå ªÞ ª× ªÐ ªÉ ª ª» ª´ ª­ ª¦ ªŸ ª˜ ª‘ ªŠ ªƒ ª| ªu ªn ªg ª` ªY ªR ªK ªD ª= ª6 ª/ ª( ª! ª ª ª ª ªþ ª÷ ªð ªé ªâ ªÛ ªÔ ªÍ ªÆ ª¿ ª¸ ª± ªª ª£ ªœ ª• ªŽ ª‡ ª€ ªy ªr ªk ªd ª] ªV ªO ªH ªA ª: ª3 ª, ª% ª ª ª ª ª ªû ªô ªí ªæ ªß ªØ ªÑ ªÊ ªà ª¼ ªµ ª® ª§ ª  ª™ ª’ ª‹ ª„ ª} ªv ªo ªh ªa ªZ ªS ªL ªE ª> ª7 ª0 ª) ª" ª ª ª ª ªÿ ªø ªñ ªê ªã ªÜ ªÕ ªÎ ªÇ ªÀ ª¹ ª² ª« ª¤ ª ª– ª ªˆ ª ªz ªs ªl ªe ª^ ªW ªP ªI ªB ª; ª4 ª- ª& ª ª ª ª ª ªü ªõ ªî ªç ªà ªÙ ªÒ ªË ªÄ ª½ ª¶ ª¯ ª¨ ª¡ ªš ª“ ªŒ ª… ª~ ªw ªp ªi ªb ª[ ªT ªM ªF ª? ª8 ª1 ª* ª# ª ª ª ª ª ªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýªöªïªèªáªÚªÓªÌªÅª¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªúªóªìªåªÞª×ªÐªÉªÂª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþª÷ªðªéªâªÛªÔªÍªÆª¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªûªôªíªæªßªØªÑªÊªÃª¼ªµª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿªøªñªêªãªÜªÕªÎªÇªÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªüªõªîªçªàªÙªÒªËªÄª½ª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªùªòªëªäªÝªÖªÏªÈªÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªýªöªïªèªáªÚªÓª̪Ū¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªúÿ©óÿ©ìÿ©åÿ©Þÿ©×ÿ©Ðÿ©Éÿ©Âÿ©»ÿ©´ÿ©­ÿ©¦ÿ©Ÿÿ©˜ÿ©‘ÿ©Šÿ©ƒÿ©|ÿ©uÿ©nÿ©gÿ©`ÿ©Yÿ©Rÿ©Kÿ©Dÿ©=ÿ©6ÿ©/ÿ©(ÿ©!ÿ©ÿ©ÿ© ÿ©ÿ©þþ©÷þ©ðþ©éþ©âþ©Ûþ©Ôþ©Íþ©Æþ©¿þ©¸þ©±þ©ªþ©£þ©œþ©•þ©Žþ©‡þ©€þ©yþ©rþ©kþ©dþ©]þ©Vþ©Oþ©Hþ©Aþ©:þ©3þ©,þ©%þ©þ©þ©þ© þ©þ©ûý©ôý©íý©æý©ßý©Øý©Ñý©Êý©Ãý©¼ý©µý©®ý©§ý© ý©™ý©’ý©‹ý©„ý©}ý©vý©oý©hý©aý©Zý©Sý©Lý©Eý©>ý©7ý©0ý©)ý©"ý©ý©ý© ý©ý©ÿü©øü©ñü©êü©ãü©Üü©Õü©Îü©Çü©Àü©¹ü©²ü©«ü©¤ü©ü©–ü©ü©ˆü©ü©zü©sü©lü©eü©^ü©Wü©Pü©Iü©Bü©;ü©4ü©-ü©&ü©ü©ü©ü© ü©ü©üû©õû©îû©çû©àû©Ùû©Òû©Ëû©Äû©½û©¶û©¯û©¨û©¡û©šû©“û©Œû©…û©~û©wû©pû©iû©bû©[û©Tû©Mû©Fû©?û©8û©1û©*û©#û©û©û©û©û©û©ùú©òú©ëú©äú©Ýú©Öú©Ïú©Èú©Áú©ºú©³ú©¬ú©¥ú©žú©—ú©ú©‰ú©‚ú©{ú©tú©mú©fú©_ú©Xú©Qú©Jú©Cú©<ú©5ú©.ú©'ú© ú©ú©ú© ú©ú©ýù©öù©ïù©èù©áù©Úù©Óù©Ìù©Åù©¾ù©·ù©°ù©©ù©¢ù©›ù©”ù©ù©†ù©ù©xù©qù©jù©cù©\ù©Uù©Nù©Gù©@ù©9ù©2ù©+ù©$ù©ù©ù©ù©ù©ù©úø©óø©ìø©åø©Þø©×ø©Ðø©Éø©Âø©»ø©´ø©­ø©¦ø©Ÿø©˜ø©‘ø©Šø©ƒø©|ø©uø©nø©gø©`ø©Yø©Rø©Kø©Dø©=ø©6ø©/ø©(ø©!ø©ø©ø© ø©ø©þ÷©÷÷©ð÷©é÷©â÷©Û÷©Ô÷©Í÷©Æ÷©¿÷©¸÷©±÷©ª÷©£÷©œ÷©•÷©Ž÷©‡÷©€÷©y÷©r÷©k÷©d÷©]÷©V÷©O÷©H÷©A÷©:÷©3÷©,÷©%÷©÷©÷©÷© ÷©÷©ûö©ôö©íö©æö©ßö©Øö©Ñö©Êö©Ãö©¼ö©µö©®ö©§ö© ö©™ö©’ö©‹ö©„ö©}ö©vö©oö©hö©aö©Zö©Sö©Lö©Eö©>ö©7ö©0ö©)ö©"ö©ö©ö© ö©ö©ÿõ©øõ©ñõ©êõ©ãõ©Üõ©Õõ©Îõ©Çõ©Àõ©¹õ©²õ©«õ©¤õ©õ©–õ©õ©ˆõ©õ©zõ©sõ©lõ©eõ©^õ©Wõ©Põ©Iõ©Bõ©;õ©4õ©-õ©&õ©õ©õ©õ© õ©õ©üô©õô©îô©çô©àô©Ùô©Òô©Ëô©Äô©½ô©¶ô©¯ô©¨ô©¡ô©šô©“ô©Œô©…ô©~ô©wô©pô©iô©bô©[ô©Tô©Mô©Fô©?ô©8ô©1ô©*ô©#ô©ô©ô©ô©ô©ô©ùó©òó©ëó©äó©Ýó©Öó©Ïó©Èó©Áó©ºó©³ó©¬ó©¥ó©žó©—ó©ó©‰ó©‚ó©{ó©tó©mó©fó©_ó©Xó©Qó©Jó©Có©<ó©5ó©.ó©'ó© ó©ó©ó© ó©ó©ýò©öò©ïò©èò©áò©Úò©Óò©Ìò©Åò©¾ò©·ò©°ò©©ò©¢ò©›ò©”ò©ò©†ò©ò©xò©qò©jò©cò©\ò©Uò©Nò©Gò©@ò©9ò©2ò©+ò©$ò©ò©ò©ò©ò©ò©úñ©óñ©ìñ©åñ©Þñ©×ñ©Ðñ©Éñ©Âñ©»ñ©´ñ©­ñ©¦ñ©Ÿñ©˜ñ©‘ñ©Šñ©ƒñ©|ñ©uñ©nñ©gñ©`ñ©Yñ©Rñ©Kñ©Dñ©=ñ©6ñ©/ñ©(ñ©!ñ©ñ©ñ© ñ©ñ©þð©÷ð©ðð©éð©âð©Ûð©Ôð©Íð©Æð©¿ð©¸ð©±ð©ªð©£ð©œð©•ð©Žð©‡ð©€ð©yð©rð©kð©dð©]ð©Vð©Oð©Hð©Að©:ð©3ð©,ð©%ð©ð©ð©ð© ð©ð©ûï©ôï©íï©æï©ßï©Øï©Ñï©Êï©Ã塚冀﩮逸褐繁禍碑梅ï©}ï©vï©oï©hï©aï©Zï©Sï©Lï©Eï©>ï©7ï©0ï©)ï©"ï©ï©ï© ï©ï©ÿî©øî©ñî©êî©ãî©Üî©Õî©Îî©Çî©Àî©î©–î©î©ˆî©î©zî©sî©lî©eî©^î©Wî©Pî©Iî©Bî©;î©4î©-î©&î©î©î©î© î©î©üí©õí©îí©çí©àí©Ùí©Òí©Ëí©Äí©½í©¶í©¯í©¨í©¡í©ší©“í©Œí©…í©~í©wí©pí©ií©bí©[í©Tí©Mí©Fí©?í©8í©1í©*í©#í©í©í©í©í©í©ùì©òì©ëì©äì©Ýì©Öì©Ïì©Èì©Á쩺쩳쩬쩥쩞쩗ì©ì©‰ì©‚ì©{ì©tì©mì©fì©_ì©Xì©Qì©Jì©Cì©<ì©5ì©.ì©'ì© ì©ì©ì© ì©ì©ýë©öë©ïë©èë©áë©Úë©Óë©Ìë©Å멾멷며멩멢멛메ë©ë©†ë©ë©xë©që©jë©cë©\ë©Uë©Në©Gë©@ë©9ë©2ë©+ë©$ë©ë©ë©ë©ë©ë©úê©óê©ìê©åê©Þê©×ê©Ðê©Éê©Âꩻꩴꩭꩦ꩟꩘꩑ꩊꩃê©|ê©uê©nê©gê©`ê©Yê©Rê©Kê©Dê©=ê©6ê©/ê©(ê©!ê©ê©ê© ê©ê©þé©÷é©ðé©éé©âé©Ûé©Ôé©Íé©Æé©¿é©¸é©±é©ªé©£é©œé©•é©Žé©‡é©€é©yé©ré©ké©dé©]é©Vé©Oé©Hé©Aé©:é©3é©,é©%é©é©é©é© é©é©ûè©ôè©íè©æè©ßè©Øè©Ñè©Êè©Ã詼詵詮詧詠詙詒詋詄è©}è©vè©oè©hè©aè©Zè©Sè©Lè©Eè©>è©7è©0è©)è©"è©è©è© è©è©ÿç©øç©ñç©êç©ãç©Üç©Õç©Îç©Çç©À穹穲穫穤ç©ç©–ç©ç©ˆç©ç©zç©sç©lç©eç©^ç©Wç©Pç©Iç©Bç©;ç©4ç©-ç©&ç©ç©ç©ç© ç©ç©üæ©õæ©îæ©çæ©àæ©Ùæ©Òæ©Ëæ©Ä橽橶橯橨橡橚橓橌橅æ©~æ©wæ©pæ©iæ©bæ©[æ©Tæ©Mæ©Fæ©?æ©8æ©1æ©*æ©#æ©æ©æ©æ©æ©æ©ùå©òå©ëå©äå©Ýå©Öå©Ïå©Èå©Á婺婳婬婥婞婗å©å©‰å©‚å©{å©tå©må©få©_å©Xå©Qå©Jå©Cå©<å©5å©.å©'å© å©å©å© å©å©ýä©öä©ïä©èä©áä©Úä©Óä©Ìä©Å䩾䩷䩰䩩䩢䩛䩔ä©ä©†ä©ä©xä©qä©jä©cä©\ä©Uä©Nä©Gä©@ä©9ä©2ä©+ä©$ä©ä©ä©ä©ä©ä©úã©óã©ìã©åã©Þã©×ã©Ðã©Éã©Â㩻㩴㩭㩦㩟㩘㩑㩊㩃ã©|ã©uã©nã©gã©`ã©Yã©Rã©Kã©Dã©=ã©6ã©/ã©(ã©!ã©ã©ã© ã©ã©þâ©÷â©ðâ©éâ©ââ©Ûâ©Ôâ©Íâ©Æâ©¿â©¸â©±â©ªâ©£â©œâ©•â©Žâ©‡â©€â©yâ©râ©kâ©dâ©]â©Vâ©Oâ©Hâ©Aâ©:â©3â©,â©%â©â©â©â© â©â©ûá©ôá©íá©æá©ßá©Øá©Ñá©Êá©Ã᩼᩵ᩮᩧ᩠ᩙᩒᩋᩄá©}á©vá©oá©há©aá©Zá©Sá©Lá©Eá©>á©7á©0á©)á©"á©á©á© á©á©ÿà©øà©ñà©êà©ãà©Üà©Õà©Îà©Çà©À੹ੲ੫੤à©à©–à©à©ˆà©à©zà©sà©là©eà©^à©Wà©Pà©Ià©Bà©;à©4à©-à©&à©à©à©à© à©à©üß©õß©îß©çß©àß©Ùß©Òß©Ëß©Äß©½ß©¶ß©¯ß©¨ß©¡ß©šß©“ß©Œß©…ß©~ß©wß©pß©iß©bß©[ß©Tß©Mß©Fß©?ß©8ß©1ß©*ß©#ߩߩߩߩߩߩùÞ©òÞ©ëÞ©äÞ©ÝÞ©ÖÞ©ÏÞ©ÈÞ©ÁÞ©ºÞ©³Þ©¬Þ©¥Þ©žÞ©—Þ©Þ©‰Þ©‚Þ©{Þ©tÞ©mÞ©fÞ©_Þ©XÞ©QÞ©JÞ©CÞ©<Þ©5Þ©.Þ©'Þ© Þ©Þ©Þ© Þ©Þ©ýÝ©öÝ©ïÝ©èÝ©áÝ©ÚÝ©ÓÝ©ÌÝ©ÅÝ©¾Ý©·Ý©°Ý©©Ý©¢Ý©›Ý©”ݩݩ†Ý©Ý©xÝ©qÝ©jÝ©cÝ©\Ý©UÝ©NÝ©GÝ©@Ý©9Ý©2Ý©+Ý©$ݩݩݩݩݩݩúÜ©óÜ©ìÜ©åÜ©ÞÜ©×Ü©ÐÜ©ÉÜ©ÂÜ©»Ü©´Ü©­Ü©¦Ü©ŸÜ©˜Ü©‘Ü©ŠÜ©ƒÜ©|Ü©uÜ©nÜ©gÜ©`Ü©YÜ©RÜ©KÜ©DÜ©=Ü©6Ü©/Ü©(Ü©!ܩܩܩ ܩܩþÛ©÷Û©ðÛ©éÛ©âÛ©ÛÛ©ÔÛ©ÍÛ©ÆÛ©¿Û©¸Û©±Û©ªÛ©£Û©œÛ©•Û©ŽÛ©‡Û©€Û©yÛ©rÛ©kÛ©dÛ©]Û©VÛ©OÛ©HÛ©AÛ©:Û©3Û©,Û©%Û©Û©Û©Û© Û©Û©ûÚ©ôÚ©íÚ©æÚ©ßÚ©ØÚ©ÑÚ©ÊÚ©ÃÚ©¼Ú©µÚ©®Ú©§Ú© Ú©™Ú©’Ú©‹Ú©„Ú©}Ú©vÚ©oÚ©hÚ©aÚ©ZÚ©SÚ©LÚ©EÚ©>Ú©7Ú©0Ú©)Ú©"Ú©Ú©Ú© Ú©Ú©ÿÙ©øÙ©ñÙ©êÙ©ãÙ©ÜÙ©ÕÙ©ÎÙ©ÇÙ©ÀÙ©¹Ù©²Ù©«Ù©¤Ù©Ù©–٩٩ˆÙ©Ù©zÙ©sÙ©lÙ©eÙ©^Ù©WÙ©PÙ©IÙ©BÙ©;Ù©4Ù©-Ù©&٩٩٩٩ ٩٩üØ©õØ©îØ©çØ©àØ©ÙØ©ÒØ©ËØ©ÄØ©½Ø©¶Ø©¯Ø©¨Ø©¡Ø©šØ©“Ø©ŒØ©…Ø©~Ø©wØ©pØ©iØ©bØ©[Ø©TØ©MØ©FØ©?Ø©8Ø©1Ø©*Ø©#ةةةةةةùשòשëשäשÝשÖשÏשÈשÁשº×©³×©¬×©¥×©ž×©—שש‰×©‚ש{שtשmשfש_שXשQשJשCש<ש5ש.ש'ש ששש ששýÖ©öÖ©ïÖ©èÖ©áÖ©ÚÖ©ÓÖ©ÌÖ©ÅÖ©¾Ö©·Ö©°Ö©©Ö©¢Ö©›Ö©”Ö©Ö©†Ö©Ö©xÖ©qÖ©jÖ©cÖ©\Ö©UÖ©NÖ©GÖ©@Ö©9Ö©2Ö©+Ö©$Ö©Ö©Ö©Ö©Ö©Ö©úÕ©óÕ©ìÕ©åÕ©ÞÕ©×Õ©ÐÕ©ÉÕ©ÂÕ©»Õ©´Õ©­Õ©¦Õ©ŸÕ©˜Õ©‘Õ©ŠÕ©ƒÕ©|Õ©uÕ©nÕ©gÕ©`Õ©YÕ©RÕ©KÕ©DÕ©=Õ©6Õ©/Õ©(Õ©!Õ©Õ©Õ© Õ©Õ©þÔ©÷Ô©ðÔ©éÔ©âÔ©ÛÔ©ÔÔ©ÍÔ©ÆÔ©¿Ô©¸Ô©±Ô©ªÔ©£Ô©œÔ©•Ô©ŽÔ©‡Ô©€Ô©yÔ©rÔ©kÔ©dÔ©]Ô©VÔ©OÔ©HÔ©AÔ©:Ô©3Ô©,Ô©%Ô©Ô©Ô©Ô© Ô©Ô©ûÓ©ôÓ©íÓ©æÓ©ßÓ©ØÓ©ÑÓ©ÊÓ©ÃÓ©¼Ó©µÓ©®Ó©§Ó© Ó©™Ó©’Ó©‹Ó©„Ó©}Ó©vÓ©oÓ©hÓ©aÓ©ZÓ©SÓ©LÓ©EÓ©>Ó©7Ó©0Ó©)Ó©"Ó©Ó©Ó© Ó©Ó©ÿÒ©øÒ©ñÒ©êÒ©ãÒ©ÜÒ©ÕÒ©ÎÒ©ÇÒ©ÀÒ©¹Ò©²Ò©«Ò©¤Ò©Ò©–Ò©Ò©ˆÒ©Ò©zÒ©sÒ©lÒ©eÒ©^Ò©WÒ©PÒ©IÒ©BÒ©;Ò©4Ò©-Ò©&Ò©Ò©Ò©Ò© Ò©Ò©üÑ©õÑ©îÑ©çÑ©àÑ©ÙÑ©ÒÑ©ËÑ©ÄÑ©½Ñ©¶Ñ©¯Ñ©¨Ñ©¡Ñ©šÑ©“Ñ©ŒÑ©…Ñ©~Ñ©wÑ©pÑ©iÑ©bÑ©[Ñ©TÑ©MÑ©FÑ©?Ñ©8Ñ©1Ñ©*Ñ©#ѩѩѩѩѩѩùЩòЩëЩäЩÝЩÖЩÏЩÈЩÁЩºÐ©³Ð©¬Ð©¥Ð©žÐ©—ЩЩ‰Ð©‚Щ{ЩtЩmЩfЩ_ЩXЩQЩJЩCЩ<Щ5Щ.Щ'Щ ЩЩЩ ЩЩýÏ©öÏ©ïÏ©èÏ©áÏ©ÚÏ©ÓÏ©ÌÏ©ÅÏ©¾Ï©·Ï©°Ï©©Ï©¢Ï©›Ï©”ϩϩ†Ï©Ï©xÏ©qÏ©jÏ©cÏ©\Ï©UÏ©NÏ©GÏ©@Ï©9Ï©2Ï©+Ï©$ϩϩϩϩϩϩúΩóΩìΩåΩÞΩ×ΩÐΩÉΩÂΩ»Î©´Î©­Î©¦Î©ŸÎ©˜Î©‘ΩŠÎ©ƒÎ©|ΩuΩnΩgΩ`ΩYΩRΩKΩDΩ=Ω6Ω/Ω(Ω!ΩΩΩ ΩΩþÍ©÷Í©ðÍ©éÍ©âÍ©ÛÍ©ÔÍ©ÍÍ©ÆÍ©¿Í©¸Í©±Í©ªÍ©£Í©œÍ©•Í©ŽÍ©‡Í©€Í©yÍ©rÍ©kÍ©dÍ©]Í©VÍ©OÍ©HÍ©AÍ©:Í©3Í©,Í©%ͩͩͩͩ ͩͩûÌ©ôÌ©íÌ©æÌ©ßÌ©ØÌ©ÑÌ©ÊÌ©ÃÌ©¼Ì©µÌ©®Ì©§Ì© Ì©™Ì©’Ì©‹Ì©„Ì©}Ì©vÌ©oÌ©hÌ©aÌ©ZÌ©SÌ©LÌ©EÌ©>Ì©7Ì©0Ì©)Ì©"̩̩̩ ̩̩ÿË©øË©ñË©êË©ãË©ÜË©ÕË©ÎË©ÇË©ÀË©¹Ë©²Ë©«Ë©¤Ë©Ë©–˩˩ˆË©Ë©zË©sË©lË©eË©^Ë©WË©PË©IË©BË©;Ë©4Ë©-Ë©&˩˩˩˩ ˩˩üÊ©õÊ©îÊ©çÊ©àÊ©ÙÊ©ÒÊ©ËÊ©ÄÊ©½Ê©¶Ê©¯Ê©¨Ê©¡Ê©šÊ©“Ê©ŒÊ©…Ê©~Ê©wÊ©pÊ©iÊ©bÊ©[Ê©TÊ©MÊ©FÊ©?Ê©8Ê©1Ê©*Ê©#ʩʩʩʩʩʩùÉ©òÉ©ëÉ©äÉ©ÝÉ©ÖÉ©ÏÉ©ÈÉ©ÁÉ©ºÉ©³É©¬É©¥É©žÉ©—ɩɩ‰É©‚É©{É©tÉ©mÉ©fÉ©_É©XÉ©QÉ©JÉ©CÉ©<É©5É©.É©'É© ɩɩɩ ɩɩýÈ©öÈ©ïÈ©èÈ©áÈ©ÚÈ©ÓÈ©ÌÈ©ÅÈ©¾È©·È©°È©©È©¢È©›È©”ȩȩ†È©È©xÈ©qÈ©jÈ©cÈ©\È©UÈ©NÈ©GÈ©@È©9È©2È©+È©$ȩȩȩȩȩȩúÇ©óÇ©ìÇ©åÇ©ÞÇ©×Ç©ÐÇ©ÉÇ©ÂÇ©»Ç©´Ç©­Ç©¦Ç©ŸÇ©˜Ç©‘Ç©ŠÇ©ƒÇ©|Ç©uÇ©nÇ©gÇ©`Ç©YÇ©RÇ©KÇ©DÇ©=Ç©6Ç©/Ç©(Ç©!ǩǩǩ ǩǩþÆ©÷Æ©ðÆ©鯩âÆ©ÛÆ©ÔÆ©ÍÆ©ÆÆ©¿Æ©¸Æ©±Æ©ªÆ©£Æ©œÆ©•Æ©ŽÆ©‡Æ©€Æ©yÆ©rÆ©kÆ©dÆ©]Æ©VÆ©OÆ©HÆ©AÆ©:Æ©3Æ©,Æ©%ƩƩƩƩ ƩƩûÅ©ôÅ©íÅ©æÅ©ßÅ©ØÅ©ÑÅ©ÊÅ©ÃÅ©¼Å©µÅ©®Å©§Å© Å©™Å©’Å©‹Å©„Å©}Å©vÅ©oÅ©hÅ©aÅ©ZÅ©SÅ©LÅ©EÅ©>Å©7Å©0Å©)Å©"ũũũ ũũÿÄ©øÄ©ñÄ©êÄ©ãÄ©ÜÄ©ÕÄ©ÎÄ©ÇÄ©ÀÄ©¹Ä©²Ä©«Ä©¤Ä©Ä©–ĩĩˆÄ©Ä©zÄ©sÄ©lÄ©eÄ©^Ä©WÄ©PÄ©IÄ©BÄ©;Ä©4Ä©-Ä©&ĩĩĩĩ ĩĩüéõéîéçéàéÙéÒéËéÄé½Ã©¶Ã©¯Ã©¨Ã©¡Ã©šÃ©“éŒÃ©…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééù©ò©ë©ä©Ý©Ö©Ï©È©Á©ºÂ©³Â©¬Â©¥Â©žÂ©—©©‰Â©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ýÁ©öÁ©ïÁ©èÁ©áÁ©ÚÁ©ÓÁ©ÌÁ©ÅÁ©¾Á©·Á©°Á©©Á©¢Á©›Á©”Á©Á©†Á©Á©xÁ©qÁ©jÁ©cÁ©\Á©UÁ©NÁ©GÁ©@Á©9Á©2Á©+Á©$Á©Á©Á©Á©Á©Á©úÀ©óÀ©ìÀ©åÀ©ÞÀ©×À©ÐÀ©ÉÀ©ÂÀ©»À©´À©­À©¦À©ŸÀ©˜À©‘À©ŠÀ©ƒÀ©|À©uÀ©nÀ©gÀ©`À©YÀ©RÀ©KÀ©DÀ©=À©6À©/À©(À©!À©À©À© À©À©þ¿©÷¿©ð¿©é¿©â¿©Û¿©Ô¿©Í¿©Æ¿©¿¿©¸¿©±¿©ª¿©£¿©œ¿©•¿©Ž¿©‡¿©€¿©y¿©r¿©k¿©d¿©]¿©V¿©O¿©H¿©A¿©:¿©3¿©,¿©%¿©¿©¿©¿© ¿©¿©û¾©ô¾©í¾©澩ß¾©ؾ©Ѿ©ʾ©þ©¼¾©µ¾©®¾©§¾© ¾©™¾©’¾©‹¾©„¾©}¾©v¾©o¾©h¾©a¾©Z¾©S¾©L¾©E¾©>¾©7¾©0¾©)¾©"¾©¾©¾© ¾©¾©ÿ½©ø½©ñ½©꽩㽩ܽ©Õ½©ν©ǽ©À½©¹½©²½©«½©¤½©½©–½©½©ˆ½©½©z½©s½©l½©e½©^½©W½©P½©I½©B½©;½©4½©-½©&½©½©½©½© ½©½©ü¼©õ¼©缩༩Ù¼©Ò¼©˼©ļ©½¼©¶¼©¯¼©¨¼©¡¼©š¼©“¼©Œ¼©…¼©~¼©w¼©p¼©i¼©b¼©[¼©T¼©M¼©F¼©?¼©8¼©1¼©*¼©#¼©¼©¼©¼©¼©¼©ù»©ò»©뻩仩Ý»©Ö»©Ï»©È»©Á»©º»©³»©¬»©¥»©ž»©—»©»©‰»©‚»©{»©t»©m»©f»©_»©X»©Q»©J»©C»©<»©5»©.»©'»© »©»©»© »©»©ýº©öº©ﺩ躩ẩÚº©Óº©̺©ź©¾º©·º©°º©©º©¢º©›º©”º©º©†º©º©xº©qº©jº©cº©\º©Uº©Nº©Gº©@º©9º©2º©+º©$º©º©º©º©º©º©ú¹©ó¹©칩幩Þ¹©×¹©й©ɹ©¹©»¹©´¹©­¹©¦¹©Ÿ¹©˜¹©‘¹©й©ƒ¹©|¹©u¹©n¹©g¹©`¹©Y¹©R¹©K¹©D¹©=¹©6¹©/¹©(¹©!¹©¹©¹© ¹©¹©þ¸©÷¸©ð¸©鸩⸩Û¸©Ô¸©͸©Ƹ©¿¸©¸¸©±¸©ª¸©£¸©œ¸©•¸©ޏ©‡¸©€¸©y¸©r¸©k¸©d¸©]¸©V¸©O¸©H¸©A¸©:¸©3¸©,¸©%¸©¸©¸©¸© ¸©¸©û·©ô·©í·©æ·©ß·©Ø·©Ñ·©Ê·©÷©¼·©µ·©®·©§·© ·©™·©’·©‹·©„·©}·©v·©o·©h·©a·©Z·©S·©L·©E·©>·©7·©0·©)·©"·©·©·© ·©·©ÿ¶©ø¶©ñ¶©ê¶©ã¶©ܶ©Õ¶©ζ©Ƕ©À¶©¹¶©²¶©«¶©¤¶©¶©–¶©¶©ˆ¶©¶©z¶©s¶©l¶©e¶©^¶©W¶©P¶©I¶©B¶©;¶©4¶©-¶©&¶©¶©¶©¶© ¶©¶©üµ©õµ©絩൩Ùµ©Òµ©˵©ĵ©½µ©¶µ©¯µ©¨µ©¡µ©šµ©“µ©Œµ©…µ©~µ©wµ©pµ©iµ©bµ©[µ©Tµ©Mµ©Fµ©?µ©8µ©1µ©*µ©#µ©µ©µ©µ©µ©µ©ù´©ò´©ë´©ä´©Ý´©Ö´©Ï´©È´©Á´©º´©³´©¬´©¥´©ž´©—´©´©‰´©‚´©{´©t´©m´©f´©_´©X´©Q´©J´©C´©<´©5´©.´©'´© ´©´©´© ´©´©ý³©ö³©ﳩ賩ᳩÚ³©Ó³©̳©ų©¾³©·³©°³©©³©¢³©›³©”³©³©†³©³©x³©q³©j³©c³©\³©U³©N³©G³©@³©9³©2³©+³©$³©³©³©³©³©³©ú²©ó²©첩岩Þ²©ײ©в©ɲ©²©»²©´²©­²©¦²©Ÿ²©˜²©‘²©в©ƒ²©|²©u²©n²©g²©`²©Y²©R²©K²©D²©=²©6²©/²©(²©!²©²©²© ²©²©þ±©÷±©ð±©鱩ⱩÛ±©Ô±©ͱ©Ʊ©¿±©¸±©±±©ª±©£±©œ±©•±©ޱ©‡±©€±©y±©r±©k±©d±©]±©V±©O±©H±©A±©:±©3±©,±©%±©±©±©±© ±©±©û°©ô°©í°©æ°©ß°©ذ©Ѱ©ʰ©ð©¼°©µ°©®°©§°© °©™°©’°©‹°©„°©}°©v°©o°©h°©a°©Z°©S°©L°©E°©>°©7°©0°©)°©"°©°©°© °©°©ÿ¯©ø¯©ñ¯©ꯩ㯩ܯ©Õ¯©ί©ǯ©À¯©¹¯©²¯©«¯©¤¯©¯©–¯©¯©ˆ¯©¯©z¯©s¯©l¯©e¯©^¯©W¯©P¯©I¯©B¯©;¯©4¯©-¯©&¯©¯©¯©¯© ¯©¯©ü®©õ®©箩னÙ®©Ò®©Ë®©Ä®©½®©¶®©¯®©¨®©¡®©š®©“®©Œ®©…®©~®©w®©p®©i®©b®©[®©T®©M®©F®©?®©8®©1®©*®©#®©®©®©®©®©®©ù­©ò­©ë­©ä­©Ý­©Ö­©Ï­©È­©Á­©º­©³­©¬­©¥­©ž­©—­©­©‰­©‚­©{­©t­©m­©f­©_­©X­©Q­©J­©C­©<­©5­©.­©'­© ­©­©­© ­©­©ý¬©ö¬©﬩謩ᬩÚ¬©Ó¬©̬©Ŭ©¾¬©·¬©°¬©©¬©¢¬©›¬©”¬©¬©†¬©¬©x¬©q¬©j¬©c¬©\¬©U¬©N¬©G¬©@¬©9¬©2¬©+¬©$¬©¬©¬©¬©¬©¬©ú«©ó«©ì«©å«©Þ«©׫©Ы©É«©«©»«©´«©­«©¦«©Ÿ«©˜«©‘«©Š«©ƒ«©|«©u«©n«©g«©`«©Y«©R«©K«©D«©=«©6«©/«©(«©!«©«©«© «©«©þª©÷ª©ðª©骩⪩Ûª©Ôª©ͪ©ƪ©¿ª©¸ª©±ª©ªª©£ª©œª©•ª©Žª©‡ª©€ª©yª©rª©kª©dª©]ª©Vª©Oª©Hª©Aª©:ª©3ª©,ª©%ª©ª©ª©ª© ª©ª©û©©ô©©í©©æ©©ß©©Ø©©Ñ©©Ê©©é©¼©©µ©©®©©§©© ©©™©©’©©‹©©„©©}©©v©©o©©h©©a©©Z©©S©©L©©E©©>©©7©©0©©)©©"©©©©©© ©©©©ÿ¨©ø¨©ñ¨©ꨩ㨩ܨ©Õ¨©Ψ©Ǩ©À¨©¹¨©²¨©«¨©¤¨©¨©–¨©¨©ˆ¨©¨©z¨©s¨©l¨©e¨©^¨©W¨©P¨©I¨©B¨©;¨©4¨©-¨©&¨©¨©¨©¨© ¨©¨©ü§©õ§©î§©ç§©à§©Ù§©Ò§©˧©ħ©½§©¶§©¯§©¨§©¡§©š§©“§©Œ§©…§©~§©w§©p§©i§©b§©[§©T§©M§©F§©?§©8§©1§©*§©#§©§©§©§©§©§©ù¦©ò¦©릩䦩ݦ©Ö¦©Ϧ©Ȧ©Á¦©º¦©³¦©¬¦©¥¦©ž¦©—¦©¦©‰¦©‚¦©{¦©t¦©m¦©f¦©_¦©X¦©Q¦©J¦©C¦©<¦©5¦©.¦©'¦© ¦©¦©¦© ¦©¦©ý¥©ö¥©數襩ᥩÚ¥©Ó¥©Ì¥©Å¥©¾¥©·¥©°¥©©¥©¢¥©›¥©”¥©¥©†¥©¥©x¥©q¥©j¥©c¥©\¥©U¥©N¥©G¥©@¥©9¥©2¥©+¥©$¥©¥©¥©¥©¥©¥©ú¤©ó¤©줩天Þ¤©פ©Ф©ɤ©¤©»¤©´¤©­¤©¦¤©Ÿ¤©˜¤©‘¤©Ф©ƒ¤©|¤©u¤©n¤©g¤©`¤©Y¤©R¤©K¤©D¤©=¤©6¤©/¤©(¤©!¤©¤©¤© ¤©¤©þ£©÷£©ð£©飩⣩Û£©Ô£©Í£©Æ£©¿£©¸£©±£©ª£©££©œ£©•£©Ž£©‡£©€£©y£©r£©k£©d£©]£©V£©O£©H£©A£©:£©3£©,£©%£©£©£©£© £©£©û¢©ô¢©í¢©梩ߢ©Ø¢©Ñ¢©Ê¢©â©¼¢©µ¢©®¢©§¢© ¢©™¢©’¢©‹¢©„¢©}¢©v¢©o¢©h¢©a¢©Z¢©S¢©L¢©E¢©>¢©7¢©0¢©)¢©"¢©¢©¢© ¢©¢©ÿ¡©ø¡©ñ¡©ê¡©ã¡©Ü¡©Õ¡©Ρ©Ç¡©À¡©¹¡©²¡©«¡©¤¡©¡©–¡©¡©ˆ¡©¡©z¡©s¡©l¡©e¡©^¡©W¡©P¡©I¡©B¡©;¡©4¡©-¡©&¡©¡©¡©¡© ¡©¡©ü ©õ ©î ©ç ©à ©Ù ©Ò ©Ë ©Ä ©½ ©¶ ©¯ ©¨ ©¡ ©š ©“ ©Œ ©… ©~ ©w ©p ©i ©b ©[ ©T ©M ©F ©? ©8 ©1 ©* ©# © © © © © ©ùŸ©òŸ©럩䟩ÝŸ©ÖŸ©ÏŸ©ÈŸ©ÁŸ©ºŸ©³Ÿ©¬Ÿ©¥Ÿ©žŸ©—Ÿ©Ÿ©‰Ÿ©‚Ÿ©{Ÿ©tŸ©mŸ©fŸ©_Ÿ©XŸ©QŸ©JŸ©CŸ©<Ÿ©5Ÿ©.Ÿ©'Ÿ© Ÿ©Ÿ©Ÿ© Ÿ©Ÿ©ýž©öž©ïž©èž©áž©Úž©Óž©Ìž©Åž©¾ž©·ž©°ž©©ž©¢ž©›ž©”ž©ž©†ž©ž©xž©qž©jž©cž©\ž©Už©Nž©Gž©@ž©9ž©2ž©+ž©$ž©ž©ž©ž©ž©ž©ú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þœ©÷œ©ðœ©霩✩Ûœ©Ôœ©Íœ©Æœ©¿œ©¸œ©±œ©ªœ©£œ©œœ©•œ©Žœ©‡œ©€œ©yœ©rœ©kœ©dœ©]œ©Vœ©Oœ©Hœ©Aœ©:œ©3œ©,œ©%œ©œ©œ©œ© œ©œ©û›©ô›©훩曩ß›©Ø›©Ñ›©Ê›©Û©¼›©µ›©®›©§›© ›©™›©’›©‹›©„›©}›©v›©o›©h›©a›©Z›©S›©L›©E›©>›©7›©0›©)›©"›©›©›© ›©›©ÿš©øš©ñš©êš©ãš©Üš©Õš©Κ©Çš©Àš©¹š©²š©«š©¤š©š©–š©š©ˆš©š©zš©sš©lš©eš©^š©Wš©Pš©Iš©Bš©;š©4š©-š©&š©š©š©š© š©š©ü™©õ™©癩à™©Ù™©Ò™©Ë™©Ä™©½™©¶™©¯™©¨™©¡™©š™©“™©Œ™©…™©~™©w™©p™©i™©b™©[™©T™©M™©F™©?™©8™©1™©*™©#™©™©™©™©™©™©ù˜©ò˜©똩䘩ݘ©Ö˜©Ϙ©Ș©Á˜©º˜©³˜©¬˜©¥˜©ž˜©—˜©˜©‰˜©‚˜©{˜©t˜©m˜©f˜©_˜©X˜©Q˜©J˜©C˜©<˜©5˜©.˜©'˜© ˜©˜©˜© ˜©˜©ý—©ö—©ï—©è—©á—©Ú—©Ó—©Ì—©Å—©¾—©·—©°—©©—©¢—©›—©”—©—©†—©—©x—©q—©j—©c—©\—©U—©N—©G—©@—©9—©2—©+—©$—©—©—©—©—©—©ú–©ó–©ì–©å–©Þ–©×–©Ж©É–©–©»–©´–©­–©¦–©Ÿ–©˜–©‘–©Š–©ƒ–©|–©u–©n–©g–©`–©Y–©R–©K–©D–©=–©6–©/–©(–©!–©–©–© –©–©þ•©÷•©ð•©é•©â•©Û•©Ô•©Í•©Æ•©¿•©¸•©±•©ª•©£•©œ•©••©Ž•©‡•©€•©y•©r•©k•©d•©]•©V•©O•©H•©A•©:•©3•©,•©%•©•©•©•© •©•©û”©ô”©픩攩ß”©Ø”©Ñ”©Ê”©Ô©¼”©µ”©®”©§”© ”©™”©’”©‹”©„”©}”©v”©o”©h”©a”©Z”©S”©L”©E”©>”©7”©0”©)”©"”©”©”© ”©”©ÿ“©ø“©ñ“©ê“©ã“©Ü“©Õ“©Γ©Ç“©À“©¹“©²“©«“©¤“©“©–“©“©ˆ“©“©z“©s“©l“©e“©^“©W“©P“©I“©B“©;“©4“©-“©&“©“©“©“© “©“©ü’©õ’©î’©ç’©à’©Ù’©Ò’©Ë’©Ä’©½’©¶’©¯’©¨’©¡’©š’©“’©Œ’©…’©~’©w’©p’©i’©b’©[’©T’©M’©F’©?’©8’©1’©*’©#’©’©’©’©’©’©ù‘©ò‘©ë‘©ä‘©Ý‘©Ö‘©Ï‘©È‘©Á‘©º‘©³‘©¬‘©¥‘©ž‘©—‘©‘©‰‘©‚‘©{‘©t‘©m‘©f‘©_‘©X‘©Q‘©J‘©C‘©<‘©5‘©.‘©'‘© ‘©‘©‘© ‘©‘©ý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þŽ©÷Ž©ðŽ©鎩⎩ÛŽ©ÔŽ©ÍŽ©ÆŽ©¿Ž©¸Ž©±Ž©ªŽ©£Ž©œŽ©•Ž©ŽŽ©‡Ž©€Ž©yŽ©rŽ©kŽ©dŽ©]Ž©VŽ©OŽ©HŽ©AŽ©:Ž©3Ž©,Ž©%ީީީީ ީީû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿŒ©øŒ©ñŒ©ꌩ㌩ÜŒ©ÕŒ©ÎŒ©ÇŒ©ÀŒ©¹Œ©²Œ©«Œ©¤Œ©Œ©–Œ©Œ©ˆŒ©Œ©zŒ©sŒ©lŒ©eŒ©^Œ©WŒ©PŒ©IŒ©BŒ©;Œ©4Œ©-Œ©&Œ©Œ©Œ©Œ© Œ©Œ©ü‹©õ‹©î‹©ç‹©à‹©Ù‹©Ò‹©Ë‹©Ä‹©½‹©¶‹©¯‹©¨‹©¡‹©š‹©“‹©Œ‹©…‹©~‹©w‹©p‹©i‹©b‹©[‹©T‹©M‹©F‹©?‹©8‹©1‹©*‹©#‹©‹©‹©‹©‹©‹©ùŠ©òŠ©늩䊩ÝŠ©ÖŠ©ÏŠ©ÈŠ©ÁŠ©ºŠ©³Š©¬Š©¥Š©žŠ©—ЩЩ‰Š©‚Š©{Š©tŠ©mŠ©fŠ©_Š©XŠ©QŠ©JŠ©CŠ©<Š©5Š©.Š©'Š© ЩЩЩ ЩЩý‰©ö‰©艩ቩÚ‰©Ó‰©̉©ʼn©¾‰©·‰©°‰©©‰©¢‰©›‰©”‰©‰©†‰©‰©x‰©q‰©j‰©c‰©\‰©U‰©N‰©G‰©@‰©9‰©2‰©+‰©$‰©‰©‰©‰©‰©‰©úˆ©óˆ©숩利Þˆ©׈©Ј©Ɉ©ˆ©»ˆ©´ˆ©­ˆ©¦ˆ©Ÿˆ©˜ˆ©‘ˆ©Šˆ©ƒˆ©|ˆ©uˆ©nˆ©gˆ©`ˆ©Yˆ©Rˆ©Kˆ©Dˆ©=ˆ©6ˆ©/ˆ©(ˆ©!ˆ©ˆ©ˆ© ˆ©ˆ©þ‡©÷‡©ð‡©釩⇩Û‡©Ô‡©͇©Ƈ©¿‡©¸‡©±‡©ª‡©£‡©œ‡©•‡©އ©‡‡©€‡©y‡©r‡©k‡©d‡©]‡©V‡©O‡©H‡©A‡©:‡©3‡©,‡©%‡©‡©‡©‡© ‡©‡©û†©ô†©톩憩߆©؆©ц©ʆ©Æ©¼†©µ†©®†©§†© †©™†©’†©‹†©„†©}†©v†©o†©h†©a†©Z†©S†©L†©E†©>†©7†©0†©)†©"†©†©†© †©†©ÿ…©ø…©ñ…©ê…©ã…©Ü…©Õ…©Î…©Ç…©À…©¹…©²…©«…©¤…©…©–…©…©ˆ…©…©z…©s…©l…©e…©^…©W…©P…©I…©B…©;…©4…©-…©&…©…©…©…© …©…©ü„©õ„©î„©ç„©à„©Ù„©Ò„©Ë„©Ä„©½„©¶„©¯„©¨„©¡„©š„©“„©Œ„©…„©~„©w„©p„©i„©b„©[„©T„©M„©F„©?„©8„©1„©*„©#„©„©„©„©„©„©ùƒ©òƒ©냩䃩݃©Öƒ©σ©ȃ©Áƒ©ºƒ©³ƒ©¬ƒ©¥ƒ©žƒ©—ƒ©ƒ©‰ƒ©‚ƒ©{ƒ©tƒ©mƒ©fƒ©_ƒ©Xƒ©Qƒ©Jƒ©Cƒ©<ƒ©5ƒ©.ƒ©'ƒ© ƒ©ƒ©ƒ© ƒ©ƒ©ý‚©ö‚©ï‚©è‚©á‚©Ú‚©Ó‚©Ì‚©Å‚©¾‚©·‚©°‚©©‚©¢‚©›‚©”‚©‚©†‚©‚©x‚©q‚©j‚©c‚©\‚©U‚©N‚©G‚©@‚©9‚©2‚©+‚©$‚©‚©‚©‚©‚©‚©ú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ€©÷€©ð€©逩
Û€©Ô€©Í€©Æ€©¿€©¸€©±€©ª€©£€©œ€©•€©Ž€©‡€©€€©y€©r€©k€©d€©]€©V€©O€©H€©A€©:€©3€©,€©%€©€©€©€© €©€©û©ô©í©æ©ß©Ø©Ñ©Ê©Ã©¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ~©ø~©ñ~©ê~©ã~©Ü~©Õ~©Î~©Ç~©À~©¹~©²~©«~©¤~©~©–~©~©ˆ~©~©z~©s~©l~©e~©^~©W~©P~©I~©B~©;~©4~©-~©&~©~©~©~© ~©~©ü}©õ}©î}©ç}©à}©Ù}©Ò}©Ë}©Ä}©½}©¶}©¯}©¨}©¡}©š}©“}©Œ}©…}©~}©w}©p}©i}©b}©[}©T}©M}©F}©?}©8}©1}©*}©#}©}©}©}©}©}©ù|©ò|©ë|©ä|©Ý|©Ö|©Ï|©È|©Á|©º|©³|©¬|©¥|©ž|©—|©|©‰|©‚|©{|©t|©m|©f|©_|©X|©Q|©J|©C|©<|©5|©.|©'|© |©|©|© |©|©ý{©ö{©ï{©è{©á{©Ú{©Ó{©Ì{©Å{©¾{©·{©°{©©{©¢{©›{©”{©{©†{©{©x{©q{©j{©c{©\{©U{©N{©G{©@{©9{©2{©+{©${©{©{©{©{©{©úz©óz©ìz©åz©Þz©×z©Ðz©Éz©Âz©»z©´z©­z©¦z©Ÿz©˜z©‘z©Šz©ƒz©|z©uz©nz©gz©`z©Yz©Rz©Kz©Dz©=z©6z©/z©(z©!z©z©z© z©z©þy©÷y©ðy©éy©ây©Ûy©Ôy©Íy©Æy©¿y©¸y©±y©ªy©£y©œy©•y©Žy©‡y©€y©yy©ry©ky©dy©]y©Vy©Oy©Hy©Ay©:y©3y©,y©%y©y©y©y© y©y©ûx©ôx©íx©æx©ßx©Øx©Ñx©Êx©Ãx©¼x©µx©®x©§x© x©™x©’x©‹x©„x©}x©vx©ox©hx©ax©Zx©Sx©Lx©Ex©>x©7x©0x©)x©"x©x©x© x©x©ÿw©øw©ñw©êw©ãw©Üw©Õw©Îw©Çw©Àw©¹w©²w©«w©¤w©w©–w©w©ˆw©w©zw©sw©lw©ew©^w©Ww©Pw©Iw©Bw©;w©4w©-w©&w©w©w©w© w©w©üv©õv©îv©çv©àv©Ùv©Òv©Ëv©Äv©½v©¶v©¯v©¨v©¡v©šv©“v©Œv©…v©~v©wv©pv©iv©bv©[v©Tv©Mv©Fv©?v©8v©1v©*v©#v©v©v©v©v©v©ùu©òu©ëu©äu©Ýu©Öu©Ïu©Èu©Áu©ºu©³u©¬u©¥u©žu©—u©u©‰u©‚u©{u©tu©mu©fu©_u©Xu©Qu©Ju©Cu©q©7q©0q©)q©"q©q©q© q©q©ÿp©øp©ñp©êp©ãp©Üp©Õp©Îp©Çp©Àp©¹p©²p©«p©¤p©p©–p©p©ˆp©p©zp©sp©lp©ep©^p©Wp©Pp©Ip©Bp©;p©4p©-p©&p©p©p©p© p©p©üo©õo©îo©ço©ào©Ùo©Òo©Ëo©Äo©½o©¶o©¯o©¨o©¡o©šo©“o©Œo©…o©~o©wo©po©io©bo©[o©To©Mo©Fo©?o©8o©1o©*o©#o©o©o©o©o©o©ùn©òn©ën©än©Ýn©Ön©Ïn©Èn©Án©ºn©³n©¬n©¥n©žn©—n©n©‰n©‚n©{n©tn©mn©fn©_n©Xn©Qn©Jn©Cn©j©7j©0j©)j©"j©j©j© j©j©ÿi©øi©ñi©êi©ãi©Üi©Õi©Îi©Çi©Ài©¹i©²i©«i©¤i©i©–i©i©ˆi©i©zi©si©li©ei©^i©Wi©Pi©Ii©Bi©;i©4i©-i©&i©i©i©i© i©i©üh©õh©îh©çh©àh©Ùh©Òh©Ëh©Äh©½h©¶h©¯h©¨h©¡h©šh©“h©Œh©…h©~h©wh©ph©ih©bh©[h©Th©Mh©Fh©?h©8h©1h©*h©#h©h©h©h©h©h©ùg©òg©ëg©äg©Ýg©Ög©Ïg©Èg©Ág©ºg©³g©¬g©¥g©žg©—g©g©‰g©‚g©{g©tg©mg©fg©_g©Xg©Qg©Jg©Cg©c©7c©0c©)c©"c©c©c© c©c©ÿb©øb©ñb©êb©ãb©Üb©Õb©Îb©Çb©Àb©¹b©²b©«b©¤b©b©–b©b©ˆb©b©zb©sb©lb©eb©^b©Wb©Pb©Ib©Bb©;b©4b©-b©&b©b©b©b© b©b©üa©õa©îa©ça©àa©Ùa©Òa©Ëa©Äa©½a©¶a©¯a©¨a©¡a©ša©“a©Œa©…a©~a©wa©pa©ia©ba©[a©Ta©Ma©Fa©?a©8a©1a©*a©#a©a©a©a©a©a©ù`©ò`©ë`©ä`©Ý`©Ö`©Ï`©È`©Á`©º`©³`©¬`©¥`©ž`©—`©`©‰`©‚`©{`©t`©m`©f`©_`©X`©Q`©J`©C`©<`©5`©.`©'`© `©`©`© `©`©ý_©ö_©ï_©è_©á_©Ú_©Ó_©Ì_©Å_©¾_©·_©°_©©_©¢_©›_©”_©_©†_©_©x_©q_©j_©c_©\_©U_©N_©G_©@_©9_©2_©+_©$_©_©_©_©_©_©ú^©ó^©ì^©å^©Þ^©×^©Ð^©É^©Â^©»^©´^©­^©¦^©Ÿ^©˜^©‘^©Š^©ƒ^©|^©u^©n^©g^©`^©Y^©R^©K^©D^©=^©6^©/^©(^©!^©^©^© ^©^©þ]©÷]©ð]©é]©â]©Û]©Ô]©Í]©Æ]©¿]©¸]©±]©ª]©£]©œ]©•]©Ž]©‡]©€]©y]©r]©k]©d]©]]©V]©O]©H]©A]©:]©3]©,]©%]©]©]©]© ]©]©û\©ô\©í\©æ\©ß\©Ø\©Ñ\©Ê\©Ã\©¼\©µ\©®\©§\© \©™\©’\©‹\©„\©}\©v\©o\©h\©a\©Z\©S\©L\©E\©>\©7\©0\©)\©"\©\©\© \©\©ÿ[©ø[©ñ[©ê[©ã[©Ü[©Õ[©Î[©Ç[©À[©¹[©²[©«[©¤[©[©–[©[©ˆ[©[©z[©s[©l[©e[©^[©W[©P[©I[©B[©;[©4[©-[©&[©[©[©[© [©[©üZ©õZ©îZ©çZ©àZ©ÙZ©ÒZ©ËZ©ÄZ©½Z©¶Z©¯Z©¨Z©¡Z©šZ©“Z©ŒZ©…Z©~Z©wZ©pZ©iZ©bZ©[Z©TZ©MZ©FZ©?Z©8Z©1Z©*Z©#Z©Z©Z©Z©Z©Z©ùY©òY©ëY©äY©ÝY©ÖY©ÏY©ÈY©ÁY©ºY©³Y©¬Y©¥Y©žY©—Y©Y©‰Y©‚Y©{Y©tY©mY©fY©_Y©XY©QY©JY©CY©U©7U©0U©)U©"U©U©U© U©U©ÿT©øT©ñT©êT©ãT©ÜT©ÕT©ÎT©ÇT©ÀT©¹T©²T©«T©¤T©T©–T©T©ˆT©T©zT©sT©lT©eT©^T©WT©PT©IT©BT©;T©4T©-T©&T©T©T©T© T©T©üS©õS©îS©çS©àS©ÙS©ÒS©ËS©ÄS©½S©¶S©¯S©¨S©¡S©šS©“S©ŒS©…S©~S©wS©pS©iS©bS©[S©TS©MS©FS©?S©8S©1S©*S©#S©S©S©S©S©S©ùR©òR©ëR©äR©ÝR©ÖR©ÏR©ÈR©ÁR©ºR©³R©¬R©¥R©žR©—R©R©‰R©‚R©{R©tR©mR©fR©_R©XR©QR©JR©CR©N©7N©0N©)N©"N©N©N© N©N©ÿM©øM©ñM©êM©ãM©ÜM©ÕM©ÎM©ÇM©ÀM©¹M©²M©«M©¤M©M©–M©M©ˆM©M©zM©sM©lM©eM©^M©WM©PM©IM©BM©;M©4M©-M©&M©M©M©M© M©M©üL©õL©îL©çL©àL©ÙL©ÒL©ËL©ÄL©½L©¶L©¯L©¨L©¡L©šL©“L©ŒL©…L©~L©wL©pL©iL©bL©[L©TL©ML©FL©?L©8L©1L©*L©#L©L©L©L©L©L©ùK©òK©ëK©äK©ÝK©ÖK©ÏK©ÈK©ÁK©ºK©³K©¬K©¥K©žK©—K©K©‰K©‚K©{K©tK©mK©fK©_K©XK©QK©JK©CK©G©7G©0G©)G©"G©G©G© G©G©ÿF©øF©ñF©êF©ãF©ÜF©ÕF©ÎF©ÇF©ÀF©¹F©²F©«F©¤F©F©–F©F©ˆF©F©zF©sF©lF©eF©^F©WF©PF©IF©BF©;F©4F©-F©&F©F©F©F© F©F©üE©õE©îE©çE©àE©ÙE©ÒE©ËE©ÄE©½E©¶E©¯E©¨E©¡E©šE©“E©ŒE©…E©~E©wE©pE©iE©bE©[E©TE©ME©FE©?E©8E©1E©*E©#E©E©E©E©E©E©ùD©òD©ëD©äD©ÝD©ÖD©ÏD©ÈD©ÁD©ºD©³D©¬D©¥D©žD©—D©D©‰D©‚D©{D©tD©mD©fD©_D©XD©QD©JD©CD©@©7@©0@©)@©"@©@©@© @©@©ÿ?©ø?©ñ?©ê?©ã?©Ü?©Õ?©Î?©Ç?©À?©¹?©²?©«?©¤?©?©–?©?©ˆ?©?©z?©s?©l?©e?©^?©W?©P?©I?©B?©;?©4?©-?©&?©?©?©?© ?©?©ü>©õ>©î>©ç>©à>©Ù>©Ò>©Ë>©Ä>©½>©¶>©¯>©¨>©¡>©š>©“>©Œ>©…>©~>©w>©p>©i>©b>©[>©T>©M>©F>©?>©8>©1>©*>©#>©>©>©>©>©>©ù=©ò=©ë=©ä=©Ý=©Ö=©Ï=©È=©Á=©º=©³=©¬=©¥=©ž=©—=©=©‰=©‚=©{=©t=©m=©f=©_=©X=©Q=©J=©C=©<=©5=©.=©'=© =©=©=© =©=©ý<©ö<©ï<©è<©á<©Ú<©Ó<©Ì<©Å<©¾<©·<©°<©©<©¢<©›<©”<©<©†<©<©x<©q<©j<©c<©\<©U<©N<©G<©@<©9<©2<©+<©$<©<©<©<©<©<©ú;©ó;©ì;©å;©Þ;©×;©Ð;©É;©Â;©»;©´;©­;©¦;©Ÿ;©˜;©‘;©Š;©ƒ;©|;©u;©n;©g;©`;©Y;©R;©K;©D;©=;©6;©/;©(;©!;©;©;© ;©;©þ:©÷:©ð:©é:©â:©Û:©Ô:©Í:©Æ:©¿:©¸:©±:©ª:©£:©œ:©•:©Ž:©‡:©€:©y:©r:©k:©d:©]:©V:©O:©H:©A:©::©3:©,:©%:©:©:©:© :©:©û9©ô9©í9©æ9©ß9©Ø9©Ñ9©Ê9©Ã9©¼9©µ9©®9©§9© 9©™9©’9©‹9©„9©}9©v9©o9©h9©a9©Z9©S9©L9©E9©>9©79©09©)9©"9©9©9© 9©9©ÿ8©ø8©ñ8©ê8©ã8©Ü8©Õ8©Î8©Ç8©À8©¹8©²8©«8©¤8©8©–8©8©ˆ8©8©z8©s8©l8©e8©^8©W8©P8©I8©B8©;8©48©-8©&8©8©8©8© 8©8©ü7©õ7©î7©ç7©à7©Ù7©Ò7©Ë7©Ä7©½7©¶7©¯7©¨7©¡7©š7©“7©Œ7©…7©~7©w7©p7©i7©b7©[7©T7©M7©F7©?7©87©17©*7©#7©7©7©7©7©7©ù6©ò6©ë6©ä6©Ý6©Ö6©Ï6©È6©Á6©º6©³6©¬6©¥6©ž6©—6©6©‰6©‚6©{6©t6©m6©f6©_6©X6©Q6©J6©C6©<6©56©.6©'6© 6©6©6© 6©6©ý5©ö5©ï5©è5©á5©Ú5©Ó5©Ì5©Å5©¾5©·5©°5©©5©¢5©›5©”5©5©†5©5©x5©q5©j5©c5©\5©U5©N5©G5©@5©95©25©+5©$5©5©5©5©5©5©ú4©ó4©ì4©å4©Þ4©×4©Ð4©É4©Â4©»4©´4©­4©¦4©Ÿ4©˜4©‘4©Š4©ƒ4©|4©u4©n4©g4©`4©Y4©R4©K4©D4©=4©64©/4©(4©!4©4©4© 4©4©þ3©÷3©ð3©é3©â3©Û3©Ô3©Í3©Æ3©¿3©¸3©±3©ª3©£3©œ3©•3©Ž3©‡3©€3©y3©r3©k3©d3©]3©V3©O3©H3©A3©:3©33©,3©%3©3©3©3© 3©3©û2©ô2©í2©æ2©ß2©Ø2©Ñ2©Ê2©Ã2©¼2©µ2©®2©§2© 2©™2©’2©‹2©„2©}2©v2©o2©h2©a2©Z2©S2©L2©E2©>2©72©02©)2©"2©2©2© 2©2©ÿ1©ø1©ñ1©ê1©ã1©Ü1©Õ1©Î1©Ç1©À1©¹1©²1©«1©¤1©1©–1©1©ˆ1©1©z1©s1©l1©e1©^1©W1©P1©I1©B1©;1©41©-1©&1©1©1©1© 1©1©ü0©õ0©î0©ç0©à0©Ù0©Ò0©Ë0©Ä0©½0©¶0©¯0©¨0©¡0©š0©“0©Œ0©…0©~0©w0©p0©i0©b0©[0©T0©M0©F0©?0©80©10©*0©#0©0©0©0©0©0©ù/©ò/©ë/©ä/©Ý/©Ö/©Ï/©È/©Á/©º/©³/©¬/©¥/©ž/©—/©/©‰/©‚/©{/©t/©m/©f/©_/©X/©Q/©J/©C/©+©7+©0+©)+©"+©+©+© +©+©ÿ*©ø*©ñ*©ê*©ã*©Ü*©Õ*©Î*©Ç*©À*©¹*©²*©«*©¤*©*©–*©*©ˆ*©*©z*©s*©l*©e*©^*©W*©P*©I*©B*©;*©4*©-*©&*©*©*©*© *©*©ü)©õ)©î)©ç)©à)©Ù)©Ò)©Ë)©Ä)©½)©¶)©¯)©¨)©¡)©š)©“)©Œ)©…)©~)©w)©p)©i)©b)©[)©T)©M)©F)©?)©8)©1)©*)©#)©)©)©)©)©)©ù(©ò(©ë(©ä(©Ý(©Ö(©Ï(©È(©Á(©º(©³(©¬(©¥(©ž(©—(©(©‰(©‚(©{(©t(©m(©f(©_(©X(©Q(©J(©C(©<(©5(©.(©'(© (©(©(© (©(©ý'©ö'©ï'©è'©á'©Ú'©Ó'©Ì'©Å'©¾'©·'©°'©©'©¢'©›'©”'©'©†'©'©x'©q'©j'©c'©\'©U'©N'©G'©@'©9'©2'©+'©$'©'©'©'©'©'©ú&©ó&©ì&©å&©Þ&©×&©Ð&©É&©Â&©»&©´&©­&©¦&©Ÿ&©˜&©‘&©Š&©ƒ&©|&©u&©n&©g&©`&©Y&©R&©K&©D&©=&©6&©/&©(&©!&©&©&© &©&©þ%©÷%©ð%©é%©â%©Û%©Ô%©Í%©Æ%©¿%©¸%©±%©ª%©£%©œ%©•%©Ž%©‡%©€%©y%©r%©k%©d%©]%©V%©O%©H%©A%©:%©3%©,%©%%©%©%©%© %©%©û$©ô$©í$©æ$©ß$©Ø$©Ñ$©Ê$©Ã$©¼$©µ$©®$©§$© $©™$©’$©‹$©„$©}$©v$©o$©h$©a$©Z$©S$©L$©E$©>$©7$©0$©)$©"$©$©$© $©$©ÿ#©ø#©ñ#©ê#©ã#©Ü#©Õ#©Î#©Ç#©À#©¹#©²#©«#©¤#©#©–#©#©ˆ#©#©z#©s#©l#©e#©^#©W#©P#©I#©B#©;#©4#©-#©&#©#©#©#© #©#©ü"©õ"©î"©ç"©à"©Ù"©Ò"©Ë"©Ä"©½"©¶"©¯"©¨"©¡"©š"©“"©Œ"©…"©~"©w"©p"©i"©b"©["©T"©M"©F"©?"©8"©1"©*"©#"©"©"©"©"©"©ù!©ò!©ë!©ä!©Ý!©Ö!©Ï!©È!©Á!©º!©³!©¬!©¥!©ž!©—!©!©‰!©‚!©{!©t!©m!©f!©_!©X!©Q!©J!©C!©©7©0©)©"©©© ©©ÿ©ø©ñ©ê©ã©Ü©Õ©Î©Ç©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú©ó©ì©å©Þ©×©Ð©É©Â©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û©ô©í©æ©ß©Ø©Ñ©Ê©Ã©¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ©ø©ñ©ê©ã©Ü©Õ©Î©Ç©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú©ó©ì©å©Þ©×©Ð©É©Â©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û©ô©í©æ©ß©Ø©Ñ©Ê©Ã©¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ©ø©ñ©ê©ã©Ü©Õ©Î©Ç©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü ©õ ©î ©ç ©à ©Ù ©Ò ©Ë ©Ä ©½ ©¶ ©¯ ©¨ ©¡ ©š ©“ ©Œ ©… ©~ ©w ©p ©i ©b ©[ ©T ©M ©F ©? ©8 ©1 ©* ©# © © © © © ©ù ©ò ©ë ©ä ©Ý ©Ö ©Ï ©È ©Á ©º ©³ ©¬ ©¥ ©ž ©— © ©‰ ©‚ ©{ ©t ©m ©f ©_ ©X ©Q ©J ©C ©< ©5 ©. ©' © © © © © ©ý ©ö ©ï ©è ©á ©Ú ©Ó ©Ì ©Å ©¾ ©· ©° ©© ©¢ ©› ©” © ©† © ©x ©q ©j ©c ©\ ©U ©N ©G ©@ ©9 ©2 ©+ ©$ © © © © © ©ú ©ó ©ì ©å ©Þ ©× ©Ð ©É © ©» ©´ ©­ ©¦ ©Ÿ ©˜ ©‘ ©Š ©ƒ ©| ©u ©n ©g ©` ©Y ©R ©K ©D ©= ©6 ©/ ©( ©! © © © © ©þ ©÷ ©ð ©é ©â ©Û ©Ô ©Í ©Æ ©¿ ©¸ ©± ©ª ©£ ©œ ©• ©Ž ©‡ ©€ ©y ©r ©k ©d ©] ©V ©O ©H ©A ©: ©3 ©, ©% © © © © © ©û©ô©í©æ©ß©Ø©Ñ©Ê©Ã©¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ©ø©ñ©ê©ã©Ü©Õ©Î©Ç©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú©ó©ì©å©Þ©×©Ð©É©Â©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û©ô©í©æ©ß©Ø©Ñ©Ê©Ã©¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ©ø©ñ©ê©ã©Ü©Õ©ΩÇ©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©üÿ¨õÿ¨îÿ¨çÿ¨àÿ¨Ùÿ¨Òÿ¨Ëÿ¨Äÿ¨½ÿ¨¶ÿ¨¯ÿ¨¨ÿ¨¡ÿ¨šÿ¨“ÿ¨Œÿ¨…ÿ¨~ÿ¨wÿ¨pÿ¨iÿ¨bÿ¨[ÿ¨Tÿ¨Mÿ¨Fÿ¨?ÿ¨8ÿ¨1ÿ¨*ÿ¨#ÿ¨ÿ¨ÿ¨ÿ¨ÿ¨ÿ¨ùþ¨òþ¨ëþ¨äþ¨Ýþ¨Öþ¨Ïþ¨Èþ¨Áþ¨ºþ¨³þ¨¬þ¨¥þ¨žþ¨—þ¨þ¨‰þ¨‚þ¨{þ¨tþ¨mþ¨fþ¨_þ¨Xþ¨Qþ¨Jþ¨Cþ¨<þ¨5þ¨.þ¨'þ¨ þ¨þ¨þ¨ þ¨þ¨ýý¨öý¨ïý¨èý¨áý¨Úý¨Óý¨Ìý¨Åý¨¾ý¨·ý¨°ý¨©ý¨¢ý¨›ý¨”ý¨ý¨†ý¨ý¨xý¨qý¨jý¨cý¨\ý¨Uý¨Ný¨Gý¨@ý¨9ý¨2ý¨+ý¨$ý¨ý¨ý¨ý¨ý¨ý¨úü¨óü¨ìü¨åü¨Þü¨×ü¨Ðü¨Éü¨Âü¨»ü¨´ü¨­ü¨¦ü¨Ÿü¨˜ü¨‘ü¨Šü¨ƒü¨|ü¨uü¨nü¨gü¨`ü¨Yü¨Rü¨Kü¨Dü¨=ü¨6ü¨/ü¨(ü¨!ü¨ü¨ü¨ ü¨ü¨þû¨÷û¨ðû¨éû¨âû¨Ûû¨Ôû¨Íû¨Æû¨¿û¨¸û¨±û¨ªû¨£û¨œû¨•û¨Žû¨‡û¨€û¨yû¨rû¨kû¨dû¨]û¨Vû¨Oû¨Hû¨Aû¨:û¨3û¨,û¨%û¨û¨û¨û¨ û¨û¨ûú¨ôú¨íú¨æú¨ßú¨Øú¨Ñú¨Êú¨Ãú¨¼ú¨µú¨®ú¨§ú¨ ú¨™ú¨’ú¨‹ú¨„ú¨}ú¨vú¨oú¨hú¨aú¨Zú¨Sú¨Lú¨Eú¨>ú¨7ú¨0ú¨)ú¨"ú¨ú¨ú¨ ú¨ú¨ÿù¨øù¨ñù¨êù¨ãù¨Üù¨Õù¨Îù¨Çù¨Àù¨¹ù¨²ù¨«ù¨¤ù¨ù¨–ù¨ù¨ˆù¨ù¨zù¨sù¨lù¨eù¨^ù¨Wù¨Pù¨Iù¨Bù¨;ù¨4ù¨-ù¨&ù¨ù¨ù¨ù¨ ù¨ù¨üø¨õø¨îø¨çø¨àø¨Ùø¨Òø¨Ëø¨Äø¨½ø¨¶ø¨¯ø¨¨ø¨¡ø¨šø¨“ø¨Œø¨…ø¨~ø¨wø¨pø¨iø¨bø¨[ø¨Tø¨Mø¨Fø¨?ø¨8ø¨1ø¨*ø¨#ø¨ø¨ø¨ø¨ø¨ø¨ù÷¨ò÷¨ë÷¨ä÷¨Ý÷¨Ö÷¨Ï÷¨È÷¨Á÷¨º÷¨³÷¨¬÷¨¥÷¨ž÷¨—÷¨÷¨‰÷¨‚÷¨{÷¨t÷¨m÷¨f÷¨_÷¨X÷¨Q÷¨J÷¨C÷¨<÷¨5÷¨.÷¨'÷¨ ÷¨÷¨÷¨ ÷¨÷¨ýö¨öö¨ïö¨èö¨áö¨Úö¨Óö¨Ìö¨Åö¨¾ö¨·ö¨°ö¨©ö¨¢ö¨›ö¨”ö¨ö¨†ö¨ö¨xö¨qö¨jö¨cö¨\ö¨Uö¨Nö¨Gö¨@ö¨9ö¨2ö¨+ö¨$ö¨ö¨ö¨ö¨ö¨ö¨úõ¨óõ¨ìõ¨åõ¨Þõ¨×õ¨Ðõ¨Éõ¨Âõ¨»õ¨´õ¨­õ¨¦õ¨Ÿõ¨˜õ¨‘õ¨Šõ¨ƒõ¨|õ¨uõ¨nõ¨gõ¨`õ¨Yõ¨Rõ¨Kõ¨Dõ¨=õ¨6õ¨/õ¨(õ¨!õ¨õ¨õ¨ õ¨õ¨þô¨÷ô¨ðô¨éô¨âô¨Ûô¨Ôô¨Íô¨Æô¨¿ô¨¸ô¨±ô¨ªô¨£ô¨œô¨•ô¨Žô¨‡ô¨€ô¨yô¨rô¨kô¨dô¨]ô¨Vô¨Oô¨Hô¨Aô¨:ô¨3ô¨,ô¨%ô¨ô¨ô¨ô¨ ô¨ô¨ûó¨ôó¨íó¨æó¨ßó¨Øó¨Ñó¨Êó¨Ãó¨¼ó¨µó¨®ó¨§ó¨ ó¨™ó¨’ó¨‹ó¨„ó¨}ó¨vó¨oó¨hó¨aó¨Zó¨Só¨Ló¨Eó¨>ó¨7ó¨0ó¨)ó¨"ó¨ó¨ó¨ ó¨ó¨ÿò¨øò¨ñò¨êò¨ãò¨Üò¨Õò¨Îò¨Çò¨Àò¨¹ò¨²ò¨«ò¨¤ò¨ò¨–ò¨ò¨ˆò¨ò¨zò¨sò¨lò¨eò¨^ò¨Wò¨Pò¨Iò¨Bò¨;ò¨4ò¨-ò¨&ò¨ò¨ò¨ò¨ ò¨ò¨üñ¨õñ¨îñ¨çñ¨àñ¨Ùñ¨Òñ¨Ëñ¨Äñ¨½ñ¨¶ñ¨¯ñ¨¨ñ¨¡ñ¨šñ¨“ñ¨Œñ¨…ñ¨~ñ¨wñ¨pñ¨iñ¨bñ¨[ñ¨Tñ¨Mñ¨Fñ¨?ñ¨8ñ¨1ñ¨*ñ¨#ñ¨ñ¨ñ¨ñ¨ñ¨ñ¨ùð¨òð¨ëð¨äð¨Ýð¨Öð¨Ïð¨Èð¨Áð¨ºð¨³ð¨¬ð¨¥ð¨žð¨—ð¨ð¨‰ð¨‚ð¨{ð¨tð¨mð¨fð¨_ð¨Xð¨Qð¨Jð¨Cð¨<ð¨5ð¨.ð¨'ð¨ ð¨ð¨ð¨ ð¨ð¨ýï¨öï¨ïï¨èï¨áï¨Úï¨Óï¨Ìï¨Å慨嘆侮﨩諸福﨔ï¨ï¨†ï¨ï¨xï¨qï¨jï¨cï¨\ï¨Uï¨Nï¨Gï¨@ï¨9ï¨2ï¨+ï¨$ï¨ï¨ï¨ï¨ï¨ï¨úî¨óî¨ìî¨åî¨Þî¨×î¨Ðî¨Éî¨Âî¨|î¨uî¨nî¨gî¨`î¨Yî¨Rî¨Kî¨Dî¨=î¨6î¨/î¨(î¨!î¨î¨î¨ î¨î¨þí¨÷í¨ðí¨éí¨âí¨Ûí¨Ôí¨Íí¨Æí¨¿í¨¸í¨±í¨ªí¨£í¨œí¨•í¨Ží¨‡í¨€í¨yí¨rí¨kí¨dí¨]í¨Ví¨Oí¨Hí¨Aí¨:í¨3í¨,í¨%í¨í¨í¨í¨ í¨í¨ûì¨ôì¨íì¨æì¨ßì¨Øì¨Ñì¨Êì¨Ã쨼쨵쨮쨧쨠쨙쨒쨋쨄ì¨}ì¨vì¨oì¨hì¨aì¨Zì¨Sì¨Lì¨Eì¨>ì¨7ì¨0ì¨)ì¨"ì¨ì¨ì¨ ì¨ì¨ÿë¨øë¨ñë¨êë¨ãë¨Üë¨Õë¨Îë¨Çë¨À먹먲먫먤ë¨ë¨–ë¨ë¨ˆë¨ë¨zë¨së¨lë¨eë¨^ë¨Wë¨Pë¨Ië¨Bë¨;ë¨4ë¨-ë¨&ë¨ë¨ë¨ë¨ ë¨ë¨üê¨õê¨îê¨çê¨àê¨Ùê¨Òê¨Ëê¨Ä꨽ꨶꨯꨨꨡꨚꨓꨌꨅê¨~ê¨wê¨pê¨iê¨bê¨[ê¨Tê¨Mê¨Fê¨?ê¨8ê¨1ê¨*ê¨#ê¨ê¨ê¨ê¨ê¨ê¨ùé¨òé¨ëé¨äé¨Ýé¨Öé¨Ïé¨Èé¨Á騺騳騬騥騞騗é¨é¨‰é¨‚é¨{é¨té¨mé¨fé¨_é¨Xé¨Qé¨Jé¨Cé¨<é¨5é¨.é¨'é¨ é¨é¨é¨ é¨é¨ýè¨öè¨ïè¨èè¨áè¨Úè¨Óè¨Ìè¨Å訾訷訰訩訢訛訔è¨è¨†è¨è¨xè¨qè¨jè¨cè¨\è¨Uè¨Nè¨Gè¨@è¨9è¨2è¨+è¨$è¨è¨è¨è¨è¨è¨úç¨óç¨ìç¨åç¨Þç¨×ç¨Ðç¨Éç¨Â稻稴稭稦稟稘稑稊稃ç¨|ç¨uç¨nç¨gç¨`ç¨Yç¨Rç¨Kç¨Dç¨=ç¨6ç¨/ç¨(ç¨!ç¨ç¨ç¨ ç¨ç¨þæ¨÷æ¨ðæ¨鿍âæ¨Ûæ¨Ôæ¨Íæ¨Ææ¨¿æ¨¸æ¨±æ¨ªæ¨£æ¨œæ¨•æ¨Žæ¨‡æ¨€æ¨yæ¨ræ¨kæ¨dæ¨]æ¨Væ¨Oæ¨Hæ¨Aæ¨:æ¨3æ¨,æ¨%æ¨æ¨æ¨æ¨ æ¨æ¨ûå¨ôå¨í卿å¨ß卨å¨Ñå¨Êå¨Ã娼娵娮娧娠娙娒娋娄å¨}å¨vå¨oå¨hå¨aå¨Zå¨Så¨Lå¨Eå¨>å¨7å¨0å¨)å¨"å¨å¨å¨ å¨å¨ÿ䍸ä¨ñä¨êä¨ãä¨Üä¨Õä¨Îä¨Çä¨À䨹䨲䨫䨤ä¨ä¨–ä¨ä¨ˆä¨ä¨zä¨sä¨lä¨eä¨^ä¨Wä¨Pä¨Iä¨Bä¨;ä¨4ä¨-ä¨&ä¨ä¨ä¨ä¨ ä¨ä¨üã¨õã¨îã¨çã¨àã¨Ùã¨Òã¨Ëã¨Ä㨽㨶㨯㨨㨡㨚㨓㨌㨅ã¨~ã¨wã¨pã¨iã¨bã¨[ã¨Tã¨Mã¨Fã¨?ã¨8ã¨1ã¨*ã¨#ã¨ã¨ã¨ã¨ã¨ã¨ùâ¨òâ¨ëâ¨äâ¨Ýâ¨Öâ¨Ïâ¨Èâ¨Á⨺⨳⨬⨥⨞⨗â¨â¨‰â¨‚â¨{â¨tâ¨mâ¨fâ¨_â¨Xâ¨Qâ¨Jâ¨Câ¨<â¨5â¨.â¨'⨠â¨â¨â¨ â¨â¨ýá¨öá¨ïá¨èá¨áá¨Úá¨Óá¨Ìá¨Åᨾᨷᨰᨩᨢᨛᨔá¨á¨†á¨á¨xá¨qá¨já¨cá¨\á¨Uá¨Ná¨Gá¨@á¨9á¨2á¨+á¨$á¨á¨á¨á¨á¨á¨úà¨óà¨ìà¨åà¨Þà¨×à¨Ðà¨Éà¨Â਻਴ਭਦਟਘ਑ਊਃà¨|à¨uà¨nà¨gà¨`à¨Yà¨Rà¨Kà¨Dà¨=à¨6à¨/à¨(à¨!à¨à¨à¨ à¨à¨þߨ÷ߨðߨéߨâߨÛߨÔߨÍߨÆß¨¿ß¨¸ß¨±ß¨ªß¨£ß¨œß¨•ߨŽß¨‡ß¨€ß¨yߨrߨkߨdߨ]ߨVߨOߨHߨAߨ:ߨ3ߨ,ߨ%ߨߨߨߨ ߨߨûÞ¨ôÞ¨íÞ¨æÞ¨ßÞ¨ØÞ¨ÑÞ¨ÊÞ¨ÃÞ¨¼Þ¨µÞ¨®Þ¨§Þ¨ Þ¨™Þ¨’Þ¨‹Þ¨„Þ¨}Þ¨vÞ¨oÞ¨hÞ¨aÞ¨ZÞ¨SÞ¨LÞ¨EÞ¨>Þ¨7Þ¨0Þ¨)Þ¨"Þ¨Þ¨Þ¨ Þ¨Þ¨ÿݨøÝ¨ñݨêݨãݨÜݨÕݨÎݨÇݨÀݨ¹Ý¨²Ý¨«Ý¨¤Ý¨ݨ–ݨݨˆÝ¨ݨzݨsݨlݨeݨ^ݨWݨPݨIݨBݨ;ݨ4ݨ-ݨ&ݨݨݨݨ ݨݨüܨõܨîܨçܨàܨÙܨÒܨËܨÄܨ½Ü¨¶Ü¨¯Ü¨¨Ü¨¡Ü¨šÜ¨“ܨŒÜ¨…ܨ~ܨwܨpܨiܨbܨ[ܨTܨMܨFܨ?ܨ8ܨ1ܨ*ܨ#ܨܨܨܨܨܨùÛ¨òÛ¨ëÛ¨äÛ¨ÝÛ¨ÖÛ¨ÏÛ¨ÈÛ¨ÁÛ¨ºÛ¨³Û¨¬Û¨¥Û¨žÛ¨—Û¨Û¨‰Û¨‚Û¨{Û¨tÛ¨mÛ¨fÛ¨_Û¨XÛ¨QÛ¨JÛ¨CÛ¨<Û¨5Û¨.Û¨'Û¨ Û¨Û¨Û¨ Û¨Û¨ýÚ¨öÚ¨ïÚ¨èÚ¨áÚ¨ÚÚ¨ÓÚ¨ÌÚ¨ÅÚ¨¾Ú¨·Ú¨°Ú¨©Ú¨¢Ú¨›Ú¨”Ú¨Ú¨†Ú¨Ú¨xÚ¨qÚ¨jÚ¨cÚ¨\Ú¨UÚ¨NÚ¨GÚ¨@Ú¨9Ú¨2Ú¨+Ú¨$Ú¨Ú¨Ú¨Ú¨Ú¨Ú¨úÙ¨óÙ¨ìÙ¨åÙ¨ÞÙ¨×Ù¨ÐÙ¨ÉÙ¨ÂÙ¨»Ù¨´Ù¨­Ù¨¦Ù¨ŸÙ¨˜Ù¨‘Ù¨ŠÙ¨ƒÙ¨|Ù¨uÙ¨nÙ¨gÙ¨`Ù¨YÙ¨RÙ¨KÙ¨DÙ¨=Ù¨6Ù¨/Ù¨(Ù¨!٨٨٨ ٨٨þب÷بðب騍âØ¨ÛØ¨ÔØ¨ÍØ¨ÆØ¨¿Ø¨¸Ø¨±Ø¨ªØ¨£Ø¨œØ¨•بŽØ¨‡Ø¨€Ø¨yبrبkبdب]بVبOبHبAب:ب3ب,ب%بببب ببûרôרíרæ×¨ßרØ×¨ÑרÊרÃר¼×¨µ×¨®×¨§×¨ ×¨™×¨’ר‹×¨„ר}רvרoרhרaרZרSרLרEר>ר7ר0ר)ר"ררר ררÿÖ¨øÖ¨ñÖ¨êÖ¨ãÖ¨ÜÖ¨ÕÖ¨ÎÖ¨ÇÖ¨ÀÖ¨¹Ö¨²Ö¨«Ö¨¤Ö¨Ö¨–Ö¨Ö¨ˆÖ¨Ö¨zÖ¨sÖ¨lÖ¨eÖ¨^Ö¨WÖ¨PÖ¨IÖ¨BÖ¨;Ö¨4Ö¨-Ö¨&Ö¨Ö¨Ö¨Ö¨ Ö¨Ö¨üÕ¨õÕ¨îÕ¨çÕ¨àÕ¨ÙÕ¨ÒÕ¨ËÕ¨ÄÕ¨½Õ¨¶Õ¨¯Õ¨¨Õ¨¡Õ¨šÕ¨“Õ¨ŒÕ¨…Õ¨~Õ¨wÕ¨pÕ¨iÕ¨bÕ¨[Õ¨TÕ¨MÕ¨FÕ¨?Õ¨8Õ¨1Õ¨*Õ¨#Õ¨Õ¨Õ¨Õ¨Õ¨Õ¨ùÔ¨òÔ¨ëÔ¨äÔ¨ÝÔ¨ÖÔ¨ÏÔ¨ÈÔ¨ÁÔ¨ºÔ¨³Ô¨¬Ô¨¥Ô¨žÔ¨—Ô¨Ô¨‰Ô¨‚Ô¨{Ô¨tÔ¨mÔ¨fÔ¨_Ô¨XÔ¨QÔ¨JÔ¨CÔ¨<Ô¨5Ô¨.Ô¨'Ô¨ Ô¨Ô¨Ô¨ Ô¨Ô¨ýÓ¨öÓ¨ïÓ¨èÓ¨áÓ¨ÚÓ¨ÓÓ¨ÌÓ¨ÅÓ¨¾Ó¨·Ó¨°Ó¨©Ó¨¢Ó¨›Ó¨”Ó¨Ó¨†Ó¨Ó¨xÓ¨qÓ¨jÓ¨cÓ¨\Ó¨UÓ¨NÓ¨GÓ¨@Ó¨9Ó¨2Ó¨+Ó¨$Ó¨Ó¨Ó¨Ó¨Ó¨Ó¨úÒ¨óÒ¨ìÒ¨åÒ¨ÞÒ¨×Ò¨ÐÒ¨ÉÒ¨ÂÒ¨»Ò¨´Ò¨­Ò¨¦Ò¨ŸÒ¨˜Ò¨‘Ò¨ŠÒ¨ƒÒ¨|Ò¨uÒ¨nÒ¨gÒ¨`Ò¨YÒ¨RÒ¨KÒ¨DÒ¨=Ò¨6Ò¨/Ò¨(Ò¨!Ò¨Ò¨Ò¨ Ò¨Ò¨þѨ÷ѨðѨéѨâѨÛѨÔѨÍѨÆÑ¨¿Ñ¨¸Ñ¨±Ñ¨ªÑ¨£Ñ¨œÑ¨•ѨŽÑ¨‡Ñ¨€Ñ¨yѨrѨkѨdѨ]ѨVѨOѨHѨAѨ:Ѩ3Ѩ,Ѩ%ѨѨѨѨ ѨѨûШôШíШæÐ¨ßШØÐ¨ÑШÊШÃШ¼Ð¨µÐ¨®Ð¨§Ð¨ Ð¨™Ð¨’Ш‹Ð¨„Ш}ШvШoШhШaШZШSШLШEШ>Ш7Ш0Ш)Ш"ШШШ ШШÿϨøÏ¨ñϨêϨãϨÜϨÕϨÎϨÇϨÀϨ¹Ï¨²Ï¨«Ï¨¤Ï¨Ϩ–ϨϨˆÏ¨ϨzϨsϨlϨeϨ^ϨWϨPϨIϨBϨ;Ϩ4Ϩ-Ϩ&ϨϨϨϨ ϨϨüΨõΨîΨçΨàΨÙΨÒΨËΨÄΨ½Î¨¶Î¨¯Î¨¨Î¨¡Î¨šÎ¨“ΨŒÎ¨…Ψ~ΨwΨpΨiΨbΨ[ΨTΨMΨFΨ?Ψ8Ψ1Ψ*Ψ#ΨΨΨΨΨΨùͨòͨëͨäͨÝͨÖͨÏͨÈͨÁͨºÍ¨³Í¨¬Í¨¥Í¨žÍ¨—ͨͨ‰Í¨‚ͨ{ͨtͨmͨfͨ_ͨXͨQͨJͨCͨ<ͨ5ͨ.ͨ'ͨ ͨͨͨ ͨͨý̨ǫ̈į̈ę̀ą́Ų́Ǫ́Į̀Ą̊¾Ì¨·Ì¨°Ì¨©Ì¨¢Ì¨›Ì¨”̨̨†Ì¨̨x̨q̨j̨c̨\̨ŲN̨G̨@̨9̨2̨+̨$̨̨̨̨̨̨ú˨ó˨ì˨å˨Þ˨×˨Ð˨É˨Â˨»Ë¨´Ë¨­Ë¨¦Ë¨ŸË¨˜Ë¨‘˨ŠË¨ƒË¨|˨u˨n˨g˨`˨Y˨R˨K˨D˨=˨6˨/˨(˨!˨˨˨ ˨˨þʨ÷ʨðʨéʨâʨÛʨÔʨÍʨÆÊ¨¿Ê¨¸Ê¨±Ê¨ªÊ¨£Ê¨œÊ¨•ʨŽÊ¨‡Ê¨€Ê¨yʨrʨkʨdʨ]ʨVʨOʨHʨAʨ:ʨ3ʨ,ʨ%ʨʨʨʨ ʨʨûɨôɨíɨæÉ¨ßɨØÉ¨ÑɨÊɨÃɨ¼É¨µÉ¨®É¨§É¨ É¨™É¨’ɨ‹É¨„ɨ}ɨvɨoɨhɨaɨZɨSɨLɨEɨ>ɨ7ɨ0ɨ)ɨ"ɨɨɨ ɨɨÿȨøÈ¨ñȨêȨãȨÜȨÕȨÎȨÇȨÀȨ¹È¨²È¨«È¨¤È¨Ȩ–ȨȨˆÈ¨ȨzȨsȨlȨeȨ^ȨWȨPȨIȨBȨ;Ȩ4Ȩ-Ȩ&ȨȨȨȨ ȨȨüǨõǨîǨçǨàǨÙǨÒǨËǨÄǨ½Ç¨¶Ç¨¯Ç¨¨Ç¨¡Ç¨šÇ¨“ǨŒÇ¨…Ǩ~ǨwǨpǨiǨbǨ[ǨTǨMǨFǨ?Ǩ8Ǩ1Ǩ*Ǩ#ǨǨǨǨǨǨùƨòƨëÆ¨䯍ÝÆ¨ÖÆ¨ÏÆ¨ÈƨÁƨºÆ¨³Æ¨¬Æ¨¥Æ¨žÆ¨—ƨƨ‰Æ¨‚ƨ{ƨtƨmƨfƨ_ƨXƨQƨJƨCƨ<ƨ5ƨ.ƨ'ƨ ƨƨƨ ƨƨýŨöŨïŨèŨáŨÚŨÓŨÌŨÅŨ¾Å¨·Å¨°Å¨©Å¨¢Å¨›Å¨”ŨŨ†Å¨ŨxŨqŨjŨcŨ\ŨUŨNŨGŨ@Ũ9Ũ2Ũ+Ũ$ŨŨŨŨŨŨúĨóĨìĨåĨÞĨ×ĨÐĨÉĨÂĨ»Ä¨´Ä¨­Ä¨¦Ä¨ŸÄ¨˜Ä¨‘ĨŠÄ¨ƒÄ¨|ĨuĨnĨgĨ`ĨYĨRĨKĨDĨ=Ĩ6Ĩ/Ĩ(Ĩ!ĨĨĨ ĨĨþè÷èðèéèâèÛèÔèÍèÆÃ¨¿Ã¨¸Ã¨±Ã¨ªÃ¨£Ã¨œÃ¨•èŽÃ¨‡Ã¨€Ã¨yèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèû¨ô¨í¨æÂ¨ߨØÂ¨Ѩʨè¼Â¨µÂ¨®Â¨§Â¨ Â¨™Â¨’¨‹Â¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿÁ¨øÁ¨ñÁ¨êÁ¨ãÁ¨ÜÁ¨ÕÁ¨ÎÁ¨ÇÁ¨ÀÁ¨¹Á¨²Á¨«Á¨¤Á¨Á¨–Á¨Á¨ˆÁ¨Á¨zÁ¨sÁ¨lÁ¨eÁ¨^Á¨WÁ¨PÁ¨IÁ¨BÁ¨;Á¨4Á¨-Á¨&Á¨Á¨Á¨Á¨ Á¨Á¨üÀ¨õÀ¨îÀ¨çÀ¨àÀ¨ÙÀ¨ÒÀ¨ËÀ¨ÄÀ¨½À¨¶À¨¯À¨¨À¨¡À¨šÀ¨“À¨ŒÀ¨…À¨~À¨wÀ¨pÀ¨iÀ¨bÀ¨[À¨TÀ¨MÀ¨FÀ¨?À¨8À¨1À¨*À¨#À¨À¨À¨À¨À¨À¨ù¿¨ò¿¨뿨俨Ý¿¨Ö¿¨Ï¿¨È¿¨Á¿¨º¿¨³¿¨¬¿¨¥¿¨ž¿¨—¿¨¿¨‰¿¨‚¿¨{¿¨t¿¨m¿¨f¿¨_¿¨X¿¨Q¿¨J¿¨C¿¨<¿¨5¿¨.¿¨'¿¨ ¿¨¿¨¿¨ ¿¨¿¨ý¾¨ö¾¨ᄄ辨ᾨÚ¾¨Ó¾¨̾¨ž¨¾¾¨·¾¨°¾¨©¾¨¢¾¨›¾¨”¾¨¾¨†¾¨¾¨x¾¨q¾¨j¾¨c¾¨\¾¨U¾¨N¾¨G¾¨@¾¨9¾¨2¾¨+¾¨$¾¨¾¨¾¨¾¨¾¨¾¨ú½¨ó½¨콨彨Þ½¨×½¨н¨ɽ¨½¨»½¨´½¨­½¨¦½¨Ÿ½¨˜½¨‘½¨н¨ƒ½¨|½¨u½¨n½¨g½¨`½¨Y½¨R½¨K½¨D½¨=½¨6½¨/½¨(½¨!½¨½¨½¨ ½¨½¨þ¼¨÷¼¨ð¼¨鼨⼨Û¼¨Ô¼¨ͼ¨Ƽ¨¿¼¨¸¼¨±¼¨ª¼¨£¼¨œ¼¨•¼¨޼¨‡¼¨€¼¨y¼¨r¼¨k¼¨d¼¨]¼¨V¼¨O¼¨H¼¨A¼¨:¼¨3¼¨,¼¨%¼¨¼¨¼¨¼¨ ¼¨¼¨û»¨ô»¨í»¨滨ß»¨Ø»¨Ñ»¨Ê»¨û¨¼»¨µ»¨®»¨§»¨ »¨™»¨’»¨‹»¨„»¨}»¨v»¨o»¨h»¨a»¨Z»¨S»¨L»¨E»¨>»¨7»¨0»¨)»¨"»¨»¨»¨ »¨»¨ÿº¨øº¨ñº¨꺨㺨ܺ¨Õº¨κ¨Ǻ¨Àº¨¹º¨²º¨«º¨¤º¨º¨–º¨º¨ˆº¨º¨zº¨sº¨lº¨eº¨^º¨Wº¨Pº¨Iº¨Bº¨;º¨4º¨-º¨&º¨º¨º¨º¨ º¨º¨ü¹¨õ¹¨繨๨Ù¹¨Ò¹¨˹¨Ũ½¹¨¶¹¨¯¹¨¨¹¨¡¹¨š¹¨“¹¨Œ¹¨…¹¨~¹¨w¹¨p¹¨i¹¨b¹¨[¹¨T¹¨M¹¨F¹¨?¹¨8¹¨1¹¨*¹¨#¹¨¹¨¹¨¹¨¹¨¹¨ù¸¨ò¸¨븨丨ݸ¨Ö¸¨ϸ¨ȸ¨Á¸¨º¸¨³¸¨¬¸¨¥¸¨ž¸¨—¸¨¸¨‰¸¨‚¸¨{¸¨t¸¨m¸¨f¸¨_¸¨X¸¨Q¸¨J¸¨C¸¨<¸¨5¸¨.¸¨'¸¨ ¸¨¸¨¸¨ ¸¨¸¨ý·¨ö·¨ï·¨è·¨á·¨Ú·¨Ó·¨Ì·¨Å·¨¾·¨··¨°·¨©·¨¢·¨›·¨”·¨·¨†·¨·¨x·¨q·¨j·¨c·¨\·¨U·¨N·¨G·¨@·¨9·¨2·¨+·¨$·¨·¨·¨·¨·¨·¨ú¶¨ó¶¨춨嶨Þ¶¨×¶¨ж¨ɶ¨¶¨»¶¨´¶¨­¶¨¦¶¨Ÿ¶¨˜¶¨‘¶¨ж¨ƒ¶¨|¶¨u¶¨n¶¨g¶¨`¶¨Y¶¨R¶¨K¶¨D¶¨=¶¨6¶¨/¶¨(¶¨!¶¨¶¨¶¨ ¶¨¶¨þµ¨÷µ¨ðµ¨鵨⵨Ûµ¨Ôµ¨͵¨Ƶ¨¿µ¨¸µ¨±µ¨ªµ¨£µ¨œµ¨•µ¨޵¨‡µ¨€µ¨yµ¨rµ¨kµ¨dµ¨]µ¨Vµ¨Oµ¨Hµ¨Aµ¨:µ¨3µ¨,µ¨%µ¨µ¨µ¨µ¨ µ¨µ¨û´¨ô´¨í´¨æ´¨ß´¨Ø´¨Ñ´¨Ê´¨ô¨¼´¨µ´¨®´¨§´¨ ´¨™´¨’´¨‹´¨„´¨}´¨v´¨o´¨h´¨a´¨Z´¨S´¨L´¨E´¨>´¨7´¨0´¨)´¨"´¨´¨´¨ ´¨´¨ÿ³¨ø³¨ñ³¨골㳨ܳ¨Õ³¨γ¨dz¨À³¨¹³¨²³¨«³¨¤³¨³¨–³¨³¨ˆ³¨³¨z³¨s³¨l³¨e³¨^³¨W³¨P³¨I³¨B³¨;³¨4³¨-³¨&³¨³¨³¨³¨ ³¨³¨ü²¨õ²¨粨ನÙ²¨Ò²¨˲¨IJ¨½²¨¶²¨¯²¨¨²¨¡²¨š²¨“²¨Œ²¨…²¨~²¨w²¨p²¨i²¨b²¨[²¨T²¨M²¨F²¨?²¨8²¨1²¨*²¨#²¨²¨²¨²¨²¨²¨ù±¨ò±¨뱨䱨ݱ¨Ö±¨ϱ¨ȱ¨Á±¨º±¨³±¨¬±¨¥±¨ž±¨—±¨±¨‰±¨‚±¨{±¨t±¨m±¨f±¨_±¨X±¨Q±¨J±¨C±¨<±¨5±¨.±¨'±¨ ±¨±¨±¨ ±¨±¨ý°¨ö°¨ï°¨è°¨á°¨Ú°¨Ó°¨̰¨ۨ¾°¨·°¨°°¨©°¨¢°¨›°¨”°¨°¨†°¨°¨x°¨q°¨j°¨c°¨\°¨U°¨N°¨G°¨@°¨9°¨2°¨+°¨$°¨°¨°¨°¨°¨°¨ú¯¨ó¯¨쯨寨Þ¯¨ׯ¨Я¨ɯ¨¯¨»¯¨´¯¨­¯¨¦¯¨Ÿ¯¨˜¯¨‘¯¨Н¨ƒ¯¨|¯¨u¯¨n¯¨g¯¨`¯¨Y¯¨R¯¨K¯¨D¯¨=¯¨6¯¨/¯¨(¯¨!¯¨¯¨¯¨ ¯¨¯¨þ®¨÷®¨ð®¨鮨⮨Û®¨Ô®¨Í®¨Æ®¨¿®¨¸®¨±®¨ª®¨£®¨œ®¨•®¨Ž®¨‡®¨€®¨y®¨r®¨k®¨d®¨]®¨V®¨O®¨H®¨A®¨:®¨3®¨,®¨%®¨®¨®¨®¨ ®¨®¨û­¨ô­¨í­¨æ­¨ß­¨Ø­¨Ñ­¨Ê­¨í¨¼­¨µ­¨®­¨§­¨ ­¨™­¨’­¨‹­¨„­¨}­¨v­¨o­¨h­¨a­¨Z­¨S­¨L­¨E­¨>­¨7­¨0­¨)­¨"­¨­¨­¨ ­¨­¨ÿ¬¨ø¬¨ñ¬¨ꬨ㬨ܬ¨Õ¬¨ά¨Ǭ¨À¬¨¹¬¨²¬¨«¬¨¤¬¨¬¨–¬¨¬¨ˆ¬¨¬¨z¬¨s¬¨l¬¨e¬¨^¬¨W¬¨P¬¨I¬¨B¬¨;¬¨4¬¨-¬¨&¬¨¬¨¬¨¬¨ ¬¨¬¨ü«¨õ«¨竨૨Ù«¨Ò«¨Ë«¨Ä«¨½«¨¶«¨¯«¨¨«¨¡«¨š«¨“«¨Œ«¨…«¨~«¨w«¨p«¨i«¨b«¨[«¨T«¨M«¨F«¨?«¨8«¨1«¨*«¨#«¨«¨«¨«¨«¨«¨ùª¨òª¨모䪨ݪ¨Öª¨Ϫ¨Ȫ¨Áª¨ºª¨³ª¨¬ª¨¥ª¨žª¨—ª¨ª¨‰ª¨‚ª¨{ª¨tª¨mª¨fª¨_ª¨Xª¨Qª¨Jª¨Cª¨<ª¨5ª¨.ª¨'ª¨ ª¨ª¨ª¨ ª¨ª¨ý©¨ö©¨難詨ᩨÚ©¨Ó©¨Ì©¨Å©¨¾©¨·©¨°©¨©©¨¢©¨›©¨”©¨©¨†©¨©¨x©¨q©¨j©¨c©¨\©¨U©¨N©¨G©¨@©¨9©¨2©¨+©¨$©¨©¨©¨©¨©¨©¨ú¨¨ó¨¨쨨娨Þ¨¨ר¨Ш¨ɨ¨¨¨»¨¨´¨¨­¨¨¦¨¨Ÿ¨¨˜¨¨‘¨¨Ѝ¨ƒ¨¨|¨¨u¨¨n¨¨g¨¨`¨¨Y¨¨R¨¨K¨¨D¨¨=¨¨6¨¨/¨¨(¨¨!¨¨¨¨¨¨ ¨¨¨¨þ§¨÷§¨ð§¨駨⧨Û§¨Ô§¨ͧ¨Ƨ¨¿§¨¸§¨±§¨ª§¨£§¨œ§¨•§¨ާ¨‡§¨€§¨y§¨r§¨k§¨d§¨]§¨V§¨O§¨H§¨A§¨:§¨3§¨,§¨%§¨§¨§¨§¨ §¨§¨û¦¨ô¦¨í¦¨榨ߦ¨ئ¨Ѧ¨ʦ¨æ¨¼¦¨µ¦¨®¦¨§¦¨ ¦¨™¦¨’¦¨‹¦¨„¦¨}¦¨v¦¨o¦¨h¦¨a¦¨Z¦¨S¦¨L¦¨E¦¨>¦¨7¦¨0¦¨)¦¨"¦¨¦¨¦¨ ¦¨¦¨ÿ¥¨ø¥¨ñ¥¨ꥨ㥨Ü¥¨Õ¥¨Î¥¨Ç¥¨À¥¨¹¥¨²¥¨«¥¨¤¥¨¥¨–¥¨¥¨ˆ¥¨¥¨z¥¨s¥¨l¥¨e¥¨^¥¨W¥¨P¥¨I¥¨B¥¨;¥¨4¥¨-¥¨&¥¨¥¨¥¨¥¨ ¥¨¥¨ü¤¨õ¤¨礨नÙ¤¨Ò¤¨ˤ¨Ĥ¨½¤¨¶¤¨¯¤¨¨¤¨¡¤¨š¤¨“¤¨Œ¤¨…¤¨~¤¨w¤¨p¤¨i¤¨b¤¨[¤¨T¤¨M¤¨F¤¨?¤¨8¤¨1¤¨*¤¨#¤¨¤¨¤¨¤¨¤¨¤¨ù£¨ò£¨루䣨Ý£¨Ö£¨Ï£¨È£¨Á£¨º£¨³£¨¬£¨¥£¨ž£¨—£¨£¨‰£¨‚£¨{£¨t£¨m£¨f£¨_£¨X£¨Q£¨J£¨C£¨<£¨5£¨.£¨'£¨ £¨£¨£¨ £¨£¨ý¢¨ö¢¨袨ᢨÚ¢¨Ó¢¨Ì¢¨Å¢¨¾¢¨·¢¨°¢¨©¢¨¢¢¨›¢¨”¢¨¢¨†¢¨¢¨x¢¨q¢¨j¢¨c¢¨\¢¨U¢¨N¢¨G¢¨@¢¨9¢¨2¢¨+¢¨$¢¨¢¨¢¨¢¨¢¨¢¨ú¡¨ó¡¨졨塨Þ¡¨ס¨С¨É¡¨¡¨»¡¨´¡¨­¡¨¦¡¨Ÿ¡¨˜¡¨‘¡¨Š¡¨ƒ¡¨|¡¨u¡¨n¡¨g¡¨`¡¨Y¡¨R¡¨K¡¨D¡¨=¡¨6¡¨/¡¨(¡¨!¡¨¡¨¡¨ ¡¨¡¨þ ¨÷ ¨ð ¨é ¨â ¨Û ¨Ô ¨Í ¨Æ ¨¿ ¨¸ ¨± ¨ª ¨£ ¨œ ¨• ¨Ž ¨‡ ¨€ ¨y ¨r ¨k ¨d ¨] ¨V ¨O ¨H ¨A ¨: ¨3 ¨, ¨% ¨ ¨ ¨ ¨  ¨ ¨ûŸ¨ôŸ¨ퟨ柨ߟ¨ØŸ¨ÑŸ¨ÊŸ¨ߨ¼Ÿ¨µŸ¨®Ÿ¨§Ÿ¨ Ÿ¨™Ÿ¨’Ÿ¨‹Ÿ¨„Ÿ¨}Ÿ¨vŸ¨oŸ¨hŸ¨aŸ¨ZŸ¨SŸ¨LŸ¨EŸ¨>Ÿ¨7Ÿ¨0Ÿ¨)Ÿ¨"Ÿ¨Ÿ¨Ÿ¨ Ÿ¨Ÿ¨ÿž¨øž¨ñž¨Ꞩ㞨Üž¨Õž¨Ξ¨Çž¨Àž¨¹ž¨²ž¨«ž¨¤ž¨ž¨–ž¨ž¨ˆž¨ž¨zž¨sž¨lž¨ež¨^ž¨Wž¨Pž¨Iž¨Bž¨;ž¨4ž¨-ž¨&ž¨ž¨ž¨ž¨ ž¨ž¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ùœ¨òœ¨뜨䜨Ýœ¨Öœ¨Ïœ¨Èœ¨Áœ¨ºœ¨³œ¨¬œ¨¥œ¨žœ¨—œ¨œ¨‰œ¨‚œ¨{œ¨tœ¨mœ¨fœ¨_œ¨Xœ¨Qœ¨Jœ¨Cœ¨<œ¨5œ¨.œ¨'œ¨ œ¨œ¨œ¨ œ¨œ¨ý›¨ö›¨蛨ᛨÚ›¨Ó›¨Ì›¨Å›¨¾›¨·›¨°›¨©›¨¢›¨››¨”›¨›¨†›¨›¨x›¨q›¨j›¨c›¨\›¨U›¨N›¨G›¨@›¨9›¨2›¨+›¨$›¨›¨›¨›¨›¨›¨úš¨óš¨욨嚨Þš¨ך¨К¨Éš¨š¨»š¨´š¨­š¨¦š¨Ÿš¨˜š¨‘š¨Šš¨ƒš¨|š¨uš¨nš¨gš¨`š¨Yš¨Rš¨Kš¨Dš¨=š¨6š¨/š¨(š¨!š¨š¨š¨ š¨š¨þ™¨÷™¨ð™¨陨♨Û™¨Ô™¨Í™¨Æ™¨¿™¨¸™¨±™¨ª™¨£™¨œ™¨•™¨Ž™¨‡™¨€™¨y™¨r™¨k™¨d™¨]™¨V™¨O™¨H™¨A™¨:™¨3™¨,™¨%™¨™¨™¨™¨ ™¨™¨û˜¨ô˜¨혨昨ߘ¨ؘ¨ј¨ʘ¨ب¼˜¨µ˜¨®˜¨§˜¨ ˜¨™˜¨’˜¨‹˜¨„˜¨}˜¨v˜¨o˜¨h˜¨a˜¨Z˜¨S˜¨L˜¨E˜¨>˜¨7˜¨0˜¨)˜¨"˜¨˜¨˜¨ ˜¨˜¨ÿ—¨ø—¨ñ—¨ê—¨ã—¨Ü—¨Õ—¨Η¨Ç—¨À—¨¹—¨²—¨«—¨¤—¨—¨–—¨—¨ˆ—¨—¨z—¨s—¨l—¨e—¨^—¨W—¨P—¨I—¨B—¨;—¨4—¨-—¨&—¨—¨—¨—¨ —¨—¨ü–¨õ–¨î–¨ç–¨à–¨Ù–¨Ò–¨Ë–¨Ä–¨½–¨¶–¨¯–¨¨–¨¡–¨š–¨“–¨Œ–¨…–¨~–¨w–¨p–¨i–¨b–¨[–¨T–¨M–¨F–¨?–¨8–¨1–¨*–¨#–¨–¨–¨–¨–¨–¨ù•¨ò•¨땨䕨Ý•¨Ö•¨Ï•¨È•¨Á•¨º•¨³•¨¬•¨¥•¨ž•¨—•¨•¨‰•¨‚•¨{•¨t•¨m•¨f•¨_•¨X•¨Q•¨J•¨C•¨<•¨5•¨.•¨'•¨ •¨•¨•¨ •¨•¨ý”¨ö”¨蔨ᔨÚ”¨Ó”¨Ì”¨Å”¨¾”¨·”¨°”¨©”¨¢”¨›”¨””¨”¨†”¨”¨x”¨q”¨j”¨c”¨\”¨U”¨N”¨G”¨@”¨9”¨2”¨+”¨$”¨”¨”¨”¨”¨”¨ú“¨ó“¨쓨哨Þ“¨ד¨Г¨É“¨“¨»“¨´“¨­“¨¦“¨Ÿ“¨˜“¨‘“¨Š“¨ƒ“¨|“¨u“¨n“¨g“¨`“¨Y“¨R“¨K“¨D“¨=“¨6“¨/“¨(“¨!“¨“¨“¨ “¨“¨þ’¨÷’¨ð’¨é’¨â’¨Û’¨Ô’¨Í’¨Æ’¨¿’¨¸’¨±’¨ª’¨£’¨œ’¨•’¨Ž’¨‡’¨€’¨y’¨r’¨k’¨d’¨]’¨V’¨O’¨H’¨A’¨:’¨3’¨,’¨%’¨’¨’¨’¨ ’¨’¨û‘¨ô‘¨푨摨ß‘¨Ø‘¨Ñ‘¨Ê‘¨Ѩ¼‘¨µ‘¨®‘¨§‘¨ ‘¨™‘¨’‘¨‹‘¨„‘¨}‘¨v‘¨o‘¨h‘¨a‘¨Z‘¨S‘¨L‘¨E‘¨>‘¨7‘¨0‘¨)‘¨"‘¨‘¨‘¨ ‘¨‘¨ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ùލòލ뎨䎨ÝŽ¨ÖŽ¨ÏŽ¨ÈލÁލºŽ¨³Ž¨¬Ž¨¥Ž¨žŽ¨—ލލ‰Ž¨‚ލ{ލtލmލfލ_ލXލQލJލCލ<ލ5ލ.ލ'ލ ލލލ ލލý¨ö¨ï¨è¨á¨Ú¨Ó¨̨Ũ¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨úŒ¨óŒ¨쌨匨ÞŒ¨׌¨ÐŒ¨ÉŒ¨ÂŒ¨»Œ¨´Œ¨­Œ¨¦Œ¨ŸŒ¨˜Œ¨‘Œ¨ŠŒ¨ƒŒ¨|Œ¨uŒ¨nŒ¨gŒ¨`Œ¨YŒ¨RŒ¨KŒ¨DŒ¨=Œ¨6Œ¨/Œ¨(Œ¨!Œ¨Œ¨Œ¨ Œ¨Œ¨þ‹¨÷‹¨ð‹¨鋨⋨Û‹¨Ô‹¨Í‹¨Æ‹¨¿‹¨¸‹¨±‹¨ª‹¨£‹¨œ‹¨•‹¨Ž‹¨‡‹¨€‹¨y‹¨r‹¨k‹¨d‹¨]‹¨V‹¨O‹¨H‹¨A‹¨:‹¨3‹¨,‹¨%‹¨‹¨‹¨‹¨ ‹¨‹¨ûЍôЍ튨抨ߊ¨ØŠ¨ÑŠ¨ÊŠ¨ʨ¼Š¨µŠ¨®Š¨§Š¨ Š¨™Š¨’Ѝ‹Š¨„Ѝ}ЍvЍoЍhЍaЍZЍSЍLЍEЍ>Ѝ7Ѝ0Ѝ)Ѝ"ЍЍЍ ЍЍÿ‰¨ø‰¨ñ‰¨ꉨ㉨܉¨Õ‰¨Ή¨lj¨À‰¨¹‰¨²‰¨«‰¨¤‰¨‰¨–‰¨‰¨ˆ‰¨‰¨z‰¨s‰¨l‰¨e‰¨^‰¨W‰¨P‰¨I‰¨B‰¨;‰¨4‰¨-‰¨&‰¨‰¨‰¨‰¨ ‰¨‰¨üˆ¨õˆ¨爨àˆ¨Ùˆ¨Òˆ¨ˈ¨Ĉ¨½ˆ¨¶ˆ¨¯ˆ¨¨ˆ¨¡ˆ¨šˆ¨“ˆ¨Œˆ¨…ˆ¨~ˆ¨wˆ¨pˆ¨iˆ¨bˆ¨[ˆ¨Tˆ¨Mˆ¨Fˆ¨?ˆ¨8ˆ¨1ˆ¨*ˆ¨#ˆ¨ˆ¨ˆ¨ˆ¨ˆ¨ˆ¨ù‡¨ò‡¨뇨䇨݇¨Ö‡¨χ¨ȇ¨Á‡¨º‡¨³‡¨¬‡¨¥‡¨ž‡¨—‡¨‡¨‰‡¨‚‡¨{‡¨t‡¨m‡¨f‡¨_‡¨X‡¨Q‡¨J‡¨C‡¨<‡¨5‡¨.‡¨'‡¨ ‡¨‡¨‡¨ ‡¨‡¨ý†¨ö†¨膨ᆨÚ†¨Ó†¨̆¨ņ¨¾†¨·†¨°†¨©†¨¢†¨›†¨”†¨†¨††¨†¨x†¨q†¨j†¨c†¨\†¨U†¨N†¨G†¨@†¨9†¨2†¨+†¨$†¨†¨†¨†¨†¨†¨ú…¨ó…¨ì…¨å…¨Þ…¨×…¨Ð…¨É…¨Â…¨»…¨´…¨­…¨¦…¨Ÿ…¨˜…¨‘…¨Š…¨ƒ…¨|…¨u…¨n…¨g…¨`…¨Y…¨R…¨K…¨D…¨=…¨6…¨/…¨(…¨!…¨…¨…¨ …¨…¨þ„¨÷„¨ð„¨鄨ℨÛ„¨Ô„¨Í„¨Æ„¨¿„¨¸„¨±„¨ª„¨£„¨œ„¨•„¨Ž„¨‡„¨€„¨y„¨r„¨k„¨d„¨]„¨V„¨O„¨H„¨A„¨:„¨3„¨,„¨%„¨„¨„¨„¨ „¨„¨ûƒ¨ôƒ¨탨惨߃¨؃¨у¨ʃ¨è¼ƒ¨µƒ¨®ƒ¨§ƒ¨ ƒ¨™ƒ¨’ƒ¨‹ƒ¨„ƒ¨}ƒ¨vƒ¨oƒ¨hƒ¨aƒ¨Zƒ¨Sƒ¨Lƒ¨Eƒ¨>ƒ¨7ƒ¨0ƒ¨)ƒ¨"ƒ¨ƒ¨ƒ¨ ƒ¨ƒ¨ÿ‚¨ø‚¨ñ‚¨ꂨエÜ‚¨Õ‚¨΂¨Ç‚¨À‚¨¹‚¨²‚¨«‚¨¤‚¨‚¨–‚¨‚¨ˆ‚¨‚¨z‚¨s‚¨l‚¨e‚¨^‚¨W‚¨P‚¨I‚¨B‚¨;‚¨4‚¨-‚¨&‚¨‚¨‚¨‚¨ ‚¨‚¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù€¨ò€¨뀨䀨Ý€¨Ö€¨Ï€¨È€¨Á€¨º€¨³€¨¬€¨¥€¨ž€¨—€¨€¨‰€¨‚€¨{€¨t€¨m€¨f€¨_€¨X€¨Q€¨J€¨C€¨<€¨5€¨.€¨'€¨ €¨€¨€¨ €¨€¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú~¨ó~¨ì~¨å~¨Þ~¨×~¨Ð~¨É~¨Â~¨»~¨´~¨­~¨¦~¨Ÿ~¨˜~¨‘~¨Š~¨ƒ~¨|~¨u~¨n~¨g~¨`~¨Y~¨R~¨K~¨D~¨=~¨6~¨/~¨(~¨!~¨~¨~¨ ~¨~¨þ}¨÷}¨ð}¨é}¨â}¨Û}¨Ô}¨Í}¨Æ}¨¿}¨¸}¨±}¨ª}¨£}¨œ}¨•}¨Ž}¨‡}¨€}¨y}¨r}¨k}¨d}¨]}¨V}¨O}¨H}¨A}¨:}¨3}¨,}¨%}¨}¨}¨}¨ }¨}¨û|¨ô|¨í|¨æ|¨ß|¨Ø|¨Ñ|¨Ê|¨Ã|¨¼|¨µ|¨®|¨§|¨ |¨™|¨’|¨‹|¨„|¨}|¨v|¨o|¨h|¨a|¨Z|¨S|¨L|¨E|¨>|¨7|¨0|¨)|¨"|¨|¨|¨ |¨|¨ÿ{¨ø{¨ñ{¨ê{¨ã{¨Ü{¨Õ{¨Î{¨Ç{¨À{¨¹{¨²{¨«{¨¤{¨{¨–{¨{¨ˆ{¨{¨z{¨s{¨l{¨e{¨^{¨W{¨P{¨I{¨B{¨;{¨4{¨-{¨&{¨{¨{¨{¨ {¨{¨üz¨õz¨îz¨çz¨àz¨Ùz¨Òz¨Ëz¨Äz¨½z¨¶z¨¯z¨¨z¨¡z¨šz¨“z¨Œz¨…z¨~z¨wz¨pz¨iz¨bz¨[z¨Tz¨Mz¨Fz¨?z¨8z¨1z¨*z¨#z¨z¨z¨z¨z¨z¨ùy¨òy¨ëy¨äy¨Ýy¨Öy¨Ïy¨Èy¨Áy¨ºy¨³y¨¬y¨¥y¨žy¨—y¨y¨‰y¨‚y¨{y¨ty¨my¨fy¨_y¨Xy¨Qy¨Jy¨Cy¨u¨7u¨0u¨)u¨"u¨u¨u¨ u¨u¨ÿt¨øt¨ñt¨êt¨ãt¨Üt¨Õt¨Ît¨Çt¨Àt¨¹t¨²t¨«t¨¤t¨t¨–t¨t¨ˆt¨t¨zt¨st¨lt¨et¨^t¨Wt¨Pt¨It¨Bt¨;t¨4t¨-t¨&t¨t¨t¨t¨ t¨t¨üs¨õs¨îs¨çs¨às¨Ùs¨Òs¨Ës¨Äs¨½s¨¶s¨¯s¨¨s¨¡s¨šs¨“s¨Œs¨…s¨~s¨ws¨ps¨is¨bs¨[s¨Ts¨Ms¨Fs¨?s¨8s¨1s¨*s¨#s¨s¨s¨s¨s¨s¨ùr¨òr¨ër¨är¨Ýr¨Ör¨Ïr¨Èr¨Ár¨ºr¨³r¨¬r¨¥r¨žr¨—r¨r¨‰r¨‚r¨{r¨tr¨mr¨fr¨_r¨Xr¨Qr¨Jr¨Cr¨n¨7n¨0n¨)n¨"n¨n¨n¨ n¨n¨ÿm¨øm¨ñm¨êm¨ãm¨Üm¨Õm¨Îm¨Çm¨Àm¨¹m¨²m¨«m¨¤m¨m¨–m¨m¨ˆm¨m¨zm¨sm¨lm¨em¨^m¨Wm¨Pm¨Im¨Bm¨;m¨4m¨-m¨&m¨m¨m¨m¨ m¨m¨ül¨õl¨îl¨çl¨àl¨Ùl¨Òl¨Ël¨Äl¨½l¨¶l¨¯l¨¨l¨¡l¨šl¨“l¨Œl¨…l¨~l¨wl¨pl¨il¨bl¨[l¨Tl¨Ml¨Fl¨?l¨8l¨1l¨*l¨#l¨l¨l¨l¨l¨l¨ùk¨òk¨ëk¨äk¨Ýk¨Ök¨Ïk¨Èk¨Ák¨ºk¨³k¨¬k¨¥k¨žk¨—k¨k¨‰k¨‚k¨{k¨tk¨mk¨fk¨_k¨Xk¨Qk¨Jk¨Ck¨g¨7g¨0g¨)g¨"g¨g¨g¨ g¨g¨ÿf¨øf¨ñf¨êf¨ãf¨Üf¨Õf¨Îf¨Çf¨Àf¨¹f¨²f¨«f¨¤f¨f¨–f¨f¨ˆf¨f¨zf¨sf¨lf¨ef¨^f¨Wf¨Pf¨If¨Bf¨;f¨4f¨-f¨&f¨f¨f¨f¨ f¨f¨üe¨õe¨îe¨çe¨àe¨Ùe¨Òe¨Ëe¨Äe¨½e¨¶e¨¯e¨¨e¨¡e¨še¨“e¨Œe¨…e¨~e¨we¨pe¨ie¨be¨[e¨Te¨Me¨Fe¨?e¨8e¨1e¨*e¨#e¨e¨e¨e¨e¨e¨ùd¨òd¨ëd¨äd¨Ýd¨Öd¨Ïd¨Èd¨Ád¨ºd¨³d¨¬d¨¥d¨žd¨—d¨d¨‰d¨‚d¨{d¨td¨md¨fd¨_d¨Xd¨Qd¨Jd¨Cd¨`¨7`¨0`¨)`¨"`¨`¨`¨ `¨`¨ÿ_¨ø_¨ñ_¨ê_¨ã_¨Ü_¨Õ_¨Î_¨Ç_¨À_¨¹_¨²_¨«_¨¤_¨_¨–_¨_¨ˆ_¨_¨z_¨s_¨l_¨e_¨^_¨W_¨P_¨I_¨B_¨;_¨4_¨-_¨&_¨_¨_¨_¨ _¨_¨ü^¨õ^¨î^¨ç^¨à^¨Ù^¨Ò^¨Ë^¨Ä^¨½^¨¶^¨¯^¨¨^¨¡^¨š^¨“^¨Œ^¨…^¨~^¨w^¨p^¨i^¨b^¨[^¨T^¨M^¨F^¨?^¨8^¨1^¨*^¨#^¨^¨^¨^¨^¨^¨ù]¨ò]¨ë]¨ä]¨Ý]¨Ö]¨Ï]¨È]¨Á]¨º]¨³]¨¬]¨¥]¨ž]¨—]¨]¨‰]¨‚]¨{]¨t]¨m]¨f]¨_]¨X]¨Q]¨J]¨C]¨<]¨5]¨.]¨']¨ ]¨]¨]¨ ]¨]¨ý\¨ö\¨ï\¨è\¨á\¨Ú\¨Ó\¨Ì\¨Å\¨¾\¨·\¨°\¨©\¨¢\¨›\¨”\¨\¨†\¨\¨x\¨q\¨j\¨c\¨\\¨U\¨N\¨G\¨@\¨9\¨2\¨+\¨$\¨\¨\¨\¨\¨\¨ú[¨ó[¨ì[¨å[¨Þ[¨×[¨Ð[¨É[¨Â[¨»[¨´[¨­[¨¦[¨Ÿ[¨˜[¨‘[¨Š[¨ƒ[¨|[¨u[¨n[¨g[¨`[¨Y[¨R[¨K[¨D[¨=[¨6[¨/[¨([¨![¨[¨[¨ [¨[¨þZ¨÷Z¨ðZ¨éZ¨âZ¨ÛZ¨ÔZ¨ÍZ¨ÆZ¨¿Z¨¸Z¨±Z¨ªZ¨£Z¨œZ¨•Z¨ŽZ¨‡Z¨€Z¨yZ¨rZ¨kZ¨dZ¨]Z¨VZ¨OZ¨HZ¨AZ¨:Z¨3Z¨,Z¨%Z¨Z¨Z¨Z¨ Z¨Z¨ûY¨ôY¨íY¨æY¨ßY¨ØY¨ÑY¨ÊY¨ÃY¨¼Y¨µY¨®Y¨§Y¨ Y¨™Y¨’Y¨‹Y¨„Y¨}Y¨vY¨oY¨hY¨aY¨ZY¨SY¨LY¨EY¨>Y¨7Y¨0Y¨)Y¨"Y¨Y¨Y¨ Y¨Y¨ÿX¨øX¨ñX¨êX¨ãX¨ÜX¨ÕX¨ÎX¨ÇX¨ÀX¨¹X¨²X¨«X¨¤X¨X¨–X¨X¨ˆX¨X¨zX¨sX¨lX¨eX¨^X¨WX¨PX¨IX¨BX¨;X¨4X¨-X¨&X¨X¨X¨X¨ X¨X¨üW¨õW¨îW¨çW¨àW¨ÙW¨ÒW¨ËW¨ÄW¨½W¨¶W¨¯W¨¨W¨¡W¨šW¨“W¨ŒW¨…W¨~W¨wW¨pW¨iW¨bW¨[W¨TW¨MW¨FW¨?W¨8W¨1W¨*W¨#W¨W¨W¨W¨W¨W¨ùV¨òV¨ëV¨äV¨ÝV¨ÖV¨ÏV¨ÈV¨ÁV¨ºV¨³V¨¬V¨¥V¨žV¨—V¨V¨‰V¨‚V¨{V¨tV¨mV¨fV¨_V¨XV¨QV¨JV¨CV¨R¨7R¨0R¨)R¨"R¨R¨R¨ R¨R¨ÿQ¨øQ¨ñQ¨êQ¨ãQ¨ÜQ¨ÕQ¨ÎQ¨ÇQ¨ÀQ¨¹Q¨²Q¨«Q¨¤Q¨Q¨–Q¨Q¨ˆQ¨Q¨zQ¨sQ¨lQ¨eQ¨^Q¨WQ¨PQ¨IQ¨BQ¨;Q¨4Q¨-Q¨&Q¨Q¨Q¨Q¨ Q¨Q¨üP¨õP¨îP¨çP¨àP¨ÙP¨ÒP¨ËP¨ÄP¨½P¨¶P¨¯P¨¨P¨¡P¨šP¨“P¨ŒP¨…P¨~P¨wP¨pP¨iP¨bP¨[P¨TP¨MP¨FP¨?P¨8P¨1P¨*P¨#P¨P¨P¨P¨P¨P¨ùO¨òO¨ëO¨äO¨ÝO¨ÖO¨ÏO¨ÈO¨ÁO¨ºO¨³O¨¬O¨¥O¨žO¨—O¨O¨‰O¨‚O¨{O¨tO¨mO¨fO¨_O¨XO¨QO¨JO¨CO¨K¨7K¨0K¨)K¨"K¨K¨K¨ K¨K¨ÿJ¨øJ¨ñJ¨êJ¨ãJ¨ÜJ¨ÕJ¨ÎJ¨ÇJ¨ÀJ¨¹J¨²J¨«J¨¤J¨J¨–J¨J¨ˆJ¨J¨zJ¨sJ¨lJ¨eJ¨^J¨WJ¨PJ¨IJ¨BJ¨;J¨4J¨-J¨&J¨J¨J¨J¨ J¨J¨üI¨õI¨îI¨çI¨àI¨ÙI¨ÒI¨ËI¨ÄI¨½I¨¶I¨¯I¨¨I¨¡I¨šI¨“I¨ŒI¨…I¨~I¨wI¨pI¨iI¨bI¨[I¨TI¨MI¨FI¨?I¨8I¨1I¨*I¨#I¨I¨I¨I¨I¨I¨ùH¨òH¨ëH¨äH¨ÝH¨ÖH¨ÏH¨ÈH¨ÁH¨ºH¨³H¨¬H¨¥H¨žH¨—H¨H¨‰H¨‚H¨{H¨tH¨mH¨fH¨_H¨XH¨QH¨JH¨CH¨D¨7D¨0D¨)D¨"D¨D¨D¨ D¨D¨ÿC¨øC¨ñC¨êC¨ãC¨ÜC¨ÕC¨ÎC¨ÇC¨ÀC¨¹C¨²C¨«C¨¤C¨C¨–C¨C¨ˆC¨C¨zC¨sC¨lC¨eC¨^C¨WC¨PC¨IC¨BC¨;C¨4C¨-C¨&C¨C¨C¨C¨ C¨C¨üB¨õB¨îB¨çB¨àB¨ÙB¨ÒB¨ËB¨ÄB¨½B¨¶B¨¯B¨¨B¨¡B¨šB¨“B¨ŒB¨…B¨~B¨wB¨pB¨iB¨bB¨[B¨TB¨MB¨FB¨?B¨8B¨1B¨*B¨#B¨B¨B¨B¨B¨B¨ùA¨òA¨ëA¨äA¨ÝA¨ÖA¨ÏA¨ÈA¨ÁA¨ºA¨³A¨¬A¨¥A¨žA¨—A¨A¨‰A¨‚A¨{A¨tA¨mA¨fA¨_A¨XA¨QA¨JA¨CA¨¨÷>¨ð>¨é>¨â>¨Û>¨Ô>¨Í>¨Æ>¨¿>¨¸>¨±>¨ª>¨£>¨œ>¨•>¨Ž>¨‡>¨€>¨y>¨r>¨k>¨d>¨]>¨V>¨O>¨H>¨A>¨:>¨3>¨,>¨%>¨>¨>¨>¨ >¨>¨û=¨ô=¨í=¨æ=¨ß=¨Ø=¨Ñ=¨Ê=¨Ã=¨¼=¨µ=¨®=¨§=¨ =¨™=¨’=¨‹=¨„=¨}=¨v=¨o=¨h=¨a=¨Z=¨S=¨L=¨E=¨>=¨7=¨0=¨)=¨"=¨=¨=¨ =¨=¨ÿ<¨ø<¨ñ<¨ê<¨ã<¨Ü<¨Õ<¨Î<¨Ç<¨À<¨¹<¨²<¨«<¨¤<¨<¨–<¨<¨ˆ<¨<¨z<¨s<¨l<¨e<¨^<¨W<¨P<¨I<¨B<¨;<¨4<¨-<¨&<¨<¨<¨<¨ <¨<¨ü;¨õ;¨î;¨ç;¨à;¨Ù;¨Ò;¨Ë;¨Ä;¨½;¨¶;¨¯;¨¨;¨¡;¨š;¨“;¨Œ;¨…;¨~;¨w;¨p;¨i;¨b;¨[;¨T;¨M;¨F;¨?;¨8;¨1;¨*;¨#;¨;¨;¨;¨;¨;¨ù:¨ò:¨ë:¨ä:¨Ý:¨Ö:¨Ï:¨È:¨Á:¨º:¨³:¨¬:¨¥:¨ž:¨—:¨:¨‰:¨‚:¨{:¨t:¨m:¨f:¨_:¨X:¨Q:¨J:¨C:¨<:¨5:¨.:¨':¨ :¨:¨:¨ :¨:¨ý9¨ö9¨ï9¨è9¨á9¨Ú9¨Ó9¨Ì9¨Å9¨¾9¨·9¨°9¨©9¨¢9¨›9¨”9¨9¨†9¨9¨x9¨q9¨j9¨c9¨\9¨U9¨N9¨G9¨@9¨99¨29¨+9¨$9¨9¨9¨9¨9¨9¨ú8¨ó8¨ì8¨å8¨Þ8¨×8¨Ð8¨É8¨Â8¨»8¨´8¨­8¨¦8¨Ÿ8¨˜8¨‘8¨Š8¨ƒ8¨|8¨u8¨n8¨g8¨`8¨Y8¨R8¨K8¨D8¨=8¨68¨/8¨(8¨!8¨8¨8¨ 8¨8¨þ7¨÷7¨ð7¨é7¨â7¨Û7¨Ô7¨Í7¨Æ7¨¿7¨¸7¨±7¨ª7¨£7¨œ7¨•7¨Ž7¨‡7¨€7¨y7¨r7¨k7¨d7¨]7¨V7¨O7¨H7¨A7¨:7¨37¨,7¨%7¨7¨7¨7¨ 7¨7¨û6¨ô6¨í6¨æ6¨ß6¨Ø6¨Ñ6¨Ê6¨Ã6¨¼6¨µ6¨®6¨§6¨ 6¨™6¨’6¨‹6¨„6¨}6¨v6¨o6¨h6¨a6¨Z6¨S6¨L6¨E6¨>6¨76¨06¨)6¨"6¨6¨6¨ 6¨6¨ÿ5¨ø5¨ñ5¨ê5¨ã5¨Ü5¨Õ5¨Î5¨Ç5¨À5¨¹5¨²5¨«5¨¤5¨5¨–5¨5¨ˆ5¨5¨z5¨s5¨l5¨e5¨^5¨W5¨P5¨I5¨B5¨;5¨45¨-5¨&5¨5¨5¨5¨ 5¨5¨ü4¨õ4¨î4¨ç4¨à4¨Ù4¨Ò4¨Ë4¨Ä4¨½4¨¶4¨¯4¨¨4¨¡4¨š4¨“4¨Œ4¨…4¨~4¨w4¨p4¨i4¨b4¨[4¨T4¨M4¨F4¨?4¨84¨14¨*4¨#4¨4¨4¨4¨4¨4¨ù3¨ò3¨ë3¨ä3¨Ý3¨Ö3¨Ï3¨È3¨Á3¨º3¨³3¨¬3¨¥3¨ž3¨—3¨3¨‰3¨‚3¨{3¨t3¨m3¨f3¨_3¨X3¨Q3¨J3¨C3¨<3¨53¨.3¨'3¨ 3¨3¨3¨ 3¨3¨ý2¨ö2¨ï2¨è2¨á2¨Ú2¨Ó2¨Ì2¨Å2¨¾2¨·2¨°2¨©2¨¢2¨›2¨”2¨2¨†2¨2¨x2¨q2¨j2¨c2¨\2¨U2¨N2¨G2¨@2¨92¨22¨+2¨$2¨2¨2¨2¨2¨2¨ú1¨ó1¨ì1¨å1¨Þ1¨×1¨Ð1¨É1¨Â1¨»1¨´1¨­1¨¦1¨Ÿ1¨˜1¨‘1¨Š1¨ƒ1¨|1¨u1¨n1¨g1¨`1¨Y1¨R1¨K1¨D1¨=1¨61¨/1¨(1¨!1¨1¨1¨ 1¨1¨þ0¨÷0¨ð0¨é0¨â0¨Û0¨Ô0¨Í0¨Æ0¨¿0¨¸0¨±0¨ª0¨£0¨œ0¨•0¨Ž0¨‡0¨€0¨y0¨r0¨k0¨d0¨]0¨V0¨O0¨H0¨A0¨:0¨30¨,0¨%0¨0¨0¨0¨ 0¨0¨û/¨ô/¨í/¨æ/¨ß/¨Ø/¨Ñ/¨Ê/¨Ã/¨¼/¨µ/¨®/¨§/¨ /¨™/¨’/¨‹/¨„/¨}/¨v/¨o/¨h/¨a/¨Z/¨S/¨L/¨E/¨>/¨7/¨0/¨)/¨"/¨/¨/¨ /¨/¨ÿ.¨ø.¨ñ.¨ê.¨ã.¨Ü.¨Õ.¨Î.¨Ç.¨À.¨¹.¨².¨«.¨¤.¨.¨–.¨.¨ˆ.¨.¨z.¨s.¨l.¨e.¨^.¨W.¨P.¨I.¨B.¨;.¨4.¨-.¨&.¨.¨.¨.¨ .¨.¨ü-¨õ-¨î-¨ç-¨à-¨Ù-¨Ò-¨Ë-¨Ä-¨½-¨¶-¨¯-¨¨-¨¡-¨š-¨“-¨Œ-¨…-¨~-¨w-¨p-¨i-¨b-¨[-¨T-¨M-¨F-¨?-¨8-¨1-¨*-¨#-¨-¨-¨-¨-¨-¨ù,¨ò,¨ë,¨ä,¨Ý,¨Ö,¨Ï,¨È,¨Á,¨º,¨³,¨¬,¨¥,¨ž,¨—,¨,¨‰,¨‚,¨{,¨t,¨m,¨f,¨_,¨X,¨Q,¨J,¨C,¨<,¨5,¨.,¨',¨ ,¨,¨,¨ ,¨,¨ý+¨ö+¨ï+¨è+¨á+¨Ú+¨Ó+¨Ì+¨Å+¨¾+¨·+¨°+¨©+¨¢+¨›+¨”+¨+¨†+¨+¨x+¨q+¨j+¨c+¨\+¨U+¨N+¨G+¨@+¨9+¨2+¨++¨$+¨+¨+¨+¨+¨+¨ú*¨ó*¨ì*¨å*¨Þ*¨×*¨Ð*¨É*¨Â*¨»*¨´*¨­*¨¦*¨Ÿ*¨˜*¨‘*¨Š*¨ƒ*¨|*¨u*¨n*¨g*¨`*¨Y*¨R*¨K*¨D*¨=*¨6*¨/*¨(*¨!*¨*¨*¨ *¨*¨þ)¨÷)¨ð)¨é)¨â)¨Û)¨Ô)¨Í)¨Æ)¨¿)¨¸)¨±)¨ª)¨£)¨œ)¨•)¨Ž)¨‡)¨€)¨y)¨r)¨k)¨d)¨])¨V)¨O)¨H)¨A)¨:)¨3)¨,)¨%)¨)¨)¨)¨ )¨)¨û(¨ô(¨í(¨æ(¨ß(¨Ø(¨Ñ(¨Ê(¨Ã(¨¼(¨µ(¨®(¨§(¨ (¨™(¨’(¨‹(¨„(¨}(¨v(¨o(¨h(¨a(¨Z(¨S(¨L(¨E(¨>(¨7(¨0(¨)(¨"(¨(¨(¨ (¨(¨ÿ'¨ø'¨ñ'¨ê'¨ã'¨Ü'¨Õ'¨Î'¨Ç'¨À'¨¹'¨²'¨«'¨¤'¨'¨–'¨'¨ˆ'¨'¨z'¨s'¨l'¨e'¨^'¨W'¨P'¨I'¨B'¨;'¨4'¨-'¨&'¨'¨'¨'¨ '¨'¨ü&¨õ&¨î&¨ç&¨à&¨Ù&¨Ò&¨Ë&¨Ä&¨½&¨¶&¨¯&¨¨&¨¡&¨š&¨“&¨Œ&¨…&¨~&¨w&¨p&¨i&¨b&¨[&¨T&¨M&¨F&¨?&¨8&¨1&¨*&¨#&¨&¨&¨&¨&¨&¨ù%¨ò%¨ë%¨ä%¨Ý%¨Ö%¨Ï%¨È%¨Á%¨º%¨³%¨¬%¨¥%¨ž%¨—%¨%¨‰%¨‚%¨{%¨t%¨m%¨f%¨_%¨X%¨Q%¨J%¨C%¨<%¨5%¨.%¨'%¨ %¨%¨%¨ %¨%¨ý$¨ö$¨ï$¨è$¨á$¨Ú$¨Ó$¨Ì$¨Å$¨¾$¨·$¨°$¨©$¨¢$¨›$¨”$¨$¨†$¨$¨x$¨q$¨j$¨c$¨\$¨U$¨N$¨G$¨@$¨9$¨2$¨+$¨$$¨$¨$¨$¨$¨$¨ú#¨ó#¨ì#¨å#¨Þ#¨×#¨Ð#¨É#¨Â#¨»#¨´#¨­#¨¦#¨Ÿ#¨˜#¨‘#¨Š#¨ƒ#¨|#¨u#¨n#¨g#¨`#¨Y#¨R#¨K#¨D#¨=#¨6#¨/#¨(#¨!#¨#¨#¨ #¨#¨þ"¨÷"¨ð"¨é"¨â"¨Û"¨Ô"¨Í"¨Æ"¨¿"¨¸"¨±"¨ª"¨£"¨œ"¨•"¨Ž"¨‡"¨€"¨y"¨r"¨k"¨d"¨]"¨V"¨O"¨H"¨A"¨:"¨3"¨,"¨%"¨"¨"¨"¨ "¨"¨û!¨ô!¨í!¨æ!¨ß!¨Ø!¨Ñ!¨Ê!¨Ã!¨¼!¨µ!¨®!¨§!¨ !¨™!¨’!¨‹!¨„!¨}!¨v!¨o!¨h!¨a!¨Z!¨S!¨L!¨E!¨>!¨7!¨0!¨)!¨"!¨!¨!¨ !¨!¨ÿ ¨ø ¨ñ ¨ê ¨ã ¨Ü ¨Õ ¨Î ¨Ç ¨À ¨¹ ¨² ¨« ¨¤ ¨ ¨– ¨ ¨ˆ ¨ ¨z ¨s ¨l ¨e ¨^ ¨W ¨P ¨I ¨B ¨; ¨4 ¨- ¨& ¨ ¨ ¨ ¨ ¨ ¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨Ë¨Ä¨½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù¨ò¨ë¨ä¨Ý¨Ö¨Ï¨È¨Á¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú¨ó¨ì¨å¨Þ¨×¨Ð¨É¨Â¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Š¨ƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ¨÷¨ð¨é¨â¨Û¨Ô¨Í¨Æ¨¿¨¸¨±¨ª¨£¨œ¨•¨Ž¨‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û¨ô¨í¨æ¨ß¨Ø¨Ñ¨Ê¨Ã¨¼¨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ¨ø¨ñ¨ê¨ã¨Ü¨Õ¨Î¨Ç¨À¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨Ë¨Ä¨½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù¨ò¨ë¨ä¨Ý¨Ö¨Ï¨È¨Á¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú¨ó¨ì¨å¨Þ¨×¨Ð¨É¨Â¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Š¨ƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ¨÷¨ð¨é¨â¨Û¨Ô¨Í¨Æ¨¿¨¸¨±¨ª¨£¨œ¨•¨Ž¨‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û¨ô¨í¨æ¨ß¨Ø¨Ñ¨Ê¨Ã¨¼¨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ¨ø¨ñ¨ê¨ã¨Ü¨Õ¨Î¨Ç¨À¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨Ë¨Ä¨½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù¨ò¨ë¨ä¨Ý¨Ö¨Ï¨È¨Á¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú¨ó¨ì¨å¨Þ¨×¨Ð¨É¨Â¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Š¨ƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ ¨÷ ¨ð ¨é ¨â ¨Û ¨Ô ¨Í ¨Æ ¨¿ ¨¸ ¨± ¨ª ¨£ ¨œ ¨• ¨Ž ¨‡ ¨€ ¨y ¨r ¨k ¨d ¨] ¨V ¨O ¨H ¨A ¨: ¨3 ¨, ¨% ¨ ¨ ¨ ¨ ¨ ¨û ¨ô ¨í ¨æ ¨ß ¨Ø ¨Ñ ¨Ê ¨à ¨¼ ¨µ ¨® ¨§ ¨  ¨™ ¨’ ¨‹ ¨„ ¨} ¨v ¨o ¨h ¨a ¨Z ¨S ¨L ¨E ¨> ¨7 ¨0 ¨) ¨" ¨ ¨ ¨ ¨ ¨ÿ ¨ø ¨ñ ¨ê ¨ã ¨Ü ¨Õ ¨Î ¨Ç ¨À ¨¹ ¨² ¨« ¨¤ ¨ ¨– ¨ ¨ˆ ¨ ¨z ¨s ¨l ¨e ¨^ ¨W ¨P ¨I ¨B ¨; ¨4 ¨- ¨& ¨ ¨ ¨ ¨ ¨ ¨ü ¨õ ¨î ¨ç ¨à ¨Ù ¨Ò ¨Ë ¨Ä ¨½ ¨¶ ¨¯ ¨¨ ¨¡ ¨š ¨“ ¨Œ ¨… ¨~ ¨w ¨p ¨i ¨b ¨[ ¨T ¨M ¨F ¨? ¨8 ¨1 ¨* ¨# ¨ ¨ ¨ ¨ ¨ ¨ù ¨ò ¨ë ¨ä ¨Ý ¨Ö ¨Ï ¨È ¨Á ¨º ¨³ ¨¬ ¨¥ ¨ž ¨— ¨ ¨‰ ¨‚ ¨{ ¨t ¨m ¨f ¨_ ¨X ¨Q ¨J ¨C ¨< ¨5 ¨. ¨' ¨ ¨ ¨ ¨ ¨ ¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú¨ó¨ì¨å¨Þ¨×¨Ð¨É¨Â¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Š¨ƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ¨÷¨ð¨é¨â¨Û¨Ô¨Í¨Æ¨¿¨¸¨±¨ª¨£¨œ¨•¨Ž¨‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û¨ô¨í¨æ¨ß¨Ø¨Ñ¨Ê¨Ã¨¼¨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ¨ø¨ñ¨ê¨ã¨Ü¨Õ¨Î¨Ç¨À¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü¨õ¨î¨ç¨à¨Ù¨Ò¨Ë¨Ä¨½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù¨ò¨ë¨ä¨Ý¨Ö¨Ï¨È¨Á¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý¨ö¨ï¨è¨á¨Ú¨Ó¨Ì¨Å¨¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þÿ§÷ÿ§ðÿ§éÿ§âÿ§Ûÿ§Ôÿ§Íÿ§Æÿ§¿ÿ§¸ÿ§±ÿ§ªÿ§£ÿ§œÿ§•ÿ§Žÿ§‡ÿ§€ÿ§yÿ§rÿ§kÿ§dÿ§]ÿ§Vÿ§Oÿ§Hÿ§Aÿ§:ÿ§3ÿ§,ÿ§%ÿ§ÿ§ÿ§ÿ§ ÿ§ÿ§ûþ§ôþ§íþ§æþ§ßþ§Øþ§Ñþ§Êþ§Ãþ§¼þ§µþ§®þ§§þ§ þ§™þ§’þ§‹þ§„þ§}þ§vþ§oþ§hþ§aþ§Zþ§Sþ§Lþ§Eþ§>þ§7þ§0þ§)þ§"þ§þ§þ§ þ§þ§ÿý§øý§ñý§êý§ãý§Üý§Õý§Îý§Çý§Àý§¹ý§²ý§«ý§¤ý§ý§–ý§ý§ˆý§ý§zý§sý§lý§eý§^ý§Wý§Pý§Iý§Bý§;ý§4ý§-ý§&ý§ý§ý§ý§ ý§ý§üü§õü§îü§çü§àü§Ùü§Òü§Ëü§Äü§½ü§¶ü§¯ü§¨ü§¡ü§šü§“ü§Œü§…ü§~ü§wü§pü§iü§bü§[ü§Tü§Mü§Fü§?ü§8ü§1ü§*ü§#ü§ü§ü§ü§ü§ü§ùû§òû§ëû§äû§Ýû§Öû§Ïû§Èû§Áû§ºû§³û§¬û§¥û§žû§—û§û§‰û§‚û§{û§tû§mû§fû§_û§Xû§Qû§Jû§Cû§<û§5û§.û§'û§ û§û§û§ û§û§ýú§öú§ïú§èú§áú§Úú§Óú§Ìú§Åú§¾ú§·ú§°ú§©ú§¢ú§›ú§”ú§ú§†ú§ú§xú§qú§jú§cú§\ú§Uú§Nú§Gú§@ú§9ú§2ú§+ú§$ú§ú§ú§ú§ú§ú§úù§óù§ìù§åù§Þù§×ù§Ðù§Éù§Âù§»ù§´ù§­ù§¦ù§Ÿù§˜ù§‘ù§Šù§ƒù§|ù§uù§nù§gù§`ù§Yù§Rù§Kù§Dù§=ù§6ù§/ù§(ù§!ù§ù§ù§ ù§ù§þø§÷ø§ðø§éø§âø§Ûø§Ôø§Íø§Æø§¿ø§¸ø§±ø§ªø§£ø§œø§•ø§Žø§‡ø§€ø§yø§rø§kø§dø§]ø§Vø§Oø§Hø§Aø§:ø§3ø§,ø§%ø§ø§ø§ø§ ø§ø§û÷§ô÷§í÷§æ÷§ß÷§Ø÷§Ñ÷§Ê÷§Ã÷§¼÷§µ÷§®÷§§÷§ ÷§™÷§’÷§‹÷§„÷§}÷§v÷§o÷§h÷§a÷§Z÷§S÷§L÷§E÷§>÷§7÷§0÷§)÷§"÷§÷§÷§ ÷§÷§ÿö§øö§ñö§êö§ãö§Üö§Õö§Îö§Çö§Àö§¹ö§²ö§«ö§¤ö§ö§–ö§ö§ˆö§ö§zö§sö§lö§eö§^ö§Wö§Pö§Iö§Bö§;ö§4ö§-ö§&ö§ö§ö§ö§ ö§ö§üõ§õõ§îõ§çõ§àõ§Ùõ§Òõ§Ëõ§Äõ§½õ§¶õ§¯õ§¨õ§¡õ§šõ§“õ§Œõ§…õ§~õ§wõ§põ§iõ§bõ§[õ§Tõ§Mõ§Fõ§?õ§8õ§1õ§*õ§#õ§õ§õ§õ§õ§õ§ùô§òô§ëô§äô§Ýô§Öô§Ïô§Èô§Áô§ºô§³ô§¬ô§¥ô§žô§—ô§ô§‰ô§‚ô§{ô§tô§mô§fô§_ô§Xô§Qô§Jô§Cô§<ô§5ô§.ô§'ô§ ô§ô§ô§ ô§ô§ýó§öó§ïó§èó§áó§Úó§Óó§Ìó§Åó§¾ó§·ó§°ó§©ó§¢ó§›ó§”ó§ó§†ó§ó§xó§qó§jó§có§\ó§Uó§Nó§Gó§@ó§9ó§2ó§+ó§$ó§ó§ó§ó§ó§ó§úò§óò§ìò§åò§Þò§×ò§Ðò§Éò§Âò§»ò§´ò§­ò§¦ò§Ÿò§˜ò§‘ò§Šò§ƒò§|ò§uò§nò§gò§`ò§Yò§Rò§Kò§Dò§=ò§6ò§/ò§(ò§!ò§ò§ò§ ò§ò§þñ§÷ñ§ðñ§éñ§âñ§Ûñ§Ôñ§Íñ§Æñ§¿ñ§¸ñ§±ñ§ªñ§£ñ§œñ§•ñ§Žñ§‡ñ§€ñ§yñ§rñ§kñ§dñ§]ñ§Vñ§Oñ§Hñ§Añ§:ñ§3ñ§,ñ§%ñ§ñ§ñ§ñ§ ñ§ñ§ûð§ôð§íð§æð§ßð§Øð§Ñð§Êð§Ãð§¼ð§µð§®ð§§ð§ ð§™ð§’ð§‹ð§„ð§}ð§vð§oð§hð§að§Zð§Sð§Lð§Eð§>ð§7ð§0ð§)ð§"ð§ð§ð§ ð§ð§ÿï§øï§ñï§êï§ãï§Üï§Õï§Îï§Çï§À粒鱗匿理ï§ï§–ï§ï§ˆï§ï§zï§sï§lï§eï§^ï§Wï§Pï§Iï§Bï§;ï§4ï§-ï§&ï§ï§ï§ï§ ï§ï§üî§õî§îî§çî§àî§Ùî§Òî§Ëî§Äî§~î§wî§pî§iî§bî§[î§Tî§Mî§Fî§?î§8î§1î§*î§#î§î§î§î§î§î§ùí§òí§ëí§äí§Ýí§Öí§Ïí§Èí§Áí§ºí§³í§¬í§¥í§ží§—í§í§‰í§‚í§{í§tí§mí§fí§_í§Xí§Qí§Jí§Cí§<í§5í§.í§'í§ í§í§í§ í§í§ýì§öì§ïì§èì§áì§Úì§Óì§Ìì§Å짾짷짰짩짢짛짔ì§ì§†ì§ì§xì§qì§jì§cì§\ì§Uì§Nì§Gì§@ì§9ì§2ì§+ì§$ì§ì§ì§ì§ì§ì§úë§óë§ìë§åë§Þë§×ë§Ðë§Éë§Â맻맴맭맦맟맘맑맊맃ë§|ë§uë§në§gë§`ë§Yë§Rë§Kë§Dë§=ë§6ë§/ë§(ë§!ë§ë§ë§ ë§ë§þê§÷ê§ðê§éê§âê§Ûê§Ôê§Íê§Æê§¿ê§¸ê§±ê§ªê§£ê§œê§•ê§Žê§‡ê§€ê§yê§rê§kê§dê§]ê§Vê§Oê§Hê§Aê§:ê§3ê§,ê§%ê§ê§ê§ê§ ê§ê§ûé§ôé§íé§æé§ßé§Øé§Ñé§Êé§Ã駼駵駮駧駠駙駒駋駄é§}é§vé§oé§hé§aé§Zé§Sé§Lé§Eé§>é§7é§0é§)é§"é§é§é§ é§é§ÿè§øè§ñè§êè§ãè§Üè§Õè§Îè§Çè§À觹觲觫觤è§è§–è§è§ˆè§è§zè§sè§lè§eè§^è§Wè§Pè§Iè§Bè§;è§4è§-è§&è§è§è§è§ è§è§üç§õç§îç§çç§àç§Ùç§Òç§Ëç§Ä秽秶积秨秡秚秓秌秅ç§~ç§wç§pç§iç§bç§[ç§Tç§Mç§Fç§?ç§8ç§1ç§*ç§#ç§ç§ç§ç§ç§ç§ùæ§òæ§ëæ§äæ§Ýæ§Öæ§Ïæ§Èæ§Áæ§ºæ§³æ§¬æ§¥æ§žæ§—æ§æ§‰æ§‚æ§{æ§tæ§mæ§fæ§_æ§Xæ§Qæ§Jæ§Cæ§<æ§5æ§.æ§'æ§ æ§æ§æ§ æ§æ§ýå§öå§ïå§èå§áå§Úå§Óå§Ìå§Å姾姷姰姩姢姛委å§å§†å§å§xå§qå§jå§cå§\å§Uå§Nå§Gå§@å§9å§2å§+å§$å§å§å§å§å§å§úä§óä§ìä§åä§Þä§×ä§Ðä§Éä§Â䧻䧴䧭䧦䧟䧘䧑䧊䧃ä§|ä§uä§nä§gä§`ä§Yä§Rä§Kä§Dä§=ä§6ä§/ä§(ä§!ä§ä§ä§ ä§ä§þã§÷ã§ðã§éã§âã§Ûã§Ôã§Íã§Æã§¿ã§¸ã§±ã§ªã§£ã§œã§•ã§Žã§‡ã§€ã§yã§rã§kã§dã§]ã§Vã§Oã§Hã§Aã§:ã§3ã§,ã§%ã§ã§ã§ã§ ã§ã§ûâ§ôâ§íâ§æâ§ßâ§Øâ§Ñâ§Êâ§Ã⧼⧵⧮⧧⧠⧙⧒⧋⧄â§}â§vâ§oâ§hâ§aâ§Zâ§Sâ§Lâ§Eâ§>â§7â§0â§)â§"â§â§â§ â§â§ÿá§øá§ñá§êá§ãá§Üá§Õá§Îá§Çá§À᧹᧲᧫᧤á§á§–á§á§ˆá§á§zá§sá§lá§eá§^á§Wá§Pá§Iá§Bá§;á§4á§-á§&á§á§á§á§ á§á§üà§õà§îà§çà§àà§Ùà§Òà§Ëà§Ä৽৶৯২ৡ৚৓ৌ৅à§~à§wà§pà§ià§bà§[à§Tà§Mà§Fà§?à§8à§1à§*à§#à§à§à§à§à§à§ùß§òß§ëß§äß§Ýß§Öß§Ïß§Èß§Áß§ºß§³ß§¬ß§¥ß§žß§—ß§ß§‰ß§‚ß§{ß§tß§mß§fß§_ß§Xß§Qß§Jß§Cß§<ß§5ß§.ß§'ß§ ß§ß§ß§ ß§ß§ýÞ§öÞ§ïÞ§èÞ§áÞ§ÚÞ§ÓÞ§ÌÞ§ÅÞ§¾Þ§·Þ§°Þ§©Þ§¢Þ§›Þ§”Þ§Þ§†Þ§Þ§xÞ§qÞ§jÞ§cÞ§\Þ§UÞ§NÞ§GÞ§@Þ§9Þ§2Þ§+Þ§$Þ§Þ§Þ§Þ§Þ§Þ§úݧóݧìݧåݧÞݧ×ݧÐݧÉݧÂݧ»Ý§´Ý§­Ý§¦Ý§ŸÝ§˜Ý§‘ݧŠÝ§ƒÝ§|ݧuݧnݧgݧ`ݧYݧRݧKݧDݧ=ݧ6ݧ/ݧ(ݧ!ݧݧݧ ݧݧþܧ÷ܧðܧéܧâܧÛܧÔܧÍܧÆÜ§¿Ü§¸Ü§±Ü§ªÜ§£Ü§œÜ§•ܧŽÜ§‡Ü§€Ü§yܧrܧkܧdܧ]ܧVܧOܧHܧAܧ:ܧ3ܧ,ܧ%ܧܧܧܧ ܧܧûÛ§ôÛ§íÛ§æÛ§ßÛ§ØÛ§ÑÛ§ÊÛ§ÃÛ§¼Û§µÛ§®Û§§Û§ Û§™Û§’Û§‹Û§„Û§}Û§vÛ§oÛ§hÛ§aÛ§ZÛ§SÛ§LÛ§EÛ§>Û§7Û§0Û§)Û§"Û§Û§Û§ Û§Û§ÿÚ§øÚ§ñÚ§êÚ§ãÚ§ÜÚ§ÕÚ§ÎÚ§ÇÚ§ÀÚ§¹Ú§²Ú§«Ú§¤Ú§Ú§–Ú§Ú§ˆÚ§Ú§zÚ§sÚ§lÚ§eÚ§^Ú§WÚ§PÚ§IÚ§BÚ§;Ú§4Ú§-Ú§&Ú§Ú§Ú§Ú§ Ú§Ú§üÙ§õÙ§îÙ§çÙ§àÙ§ÙÙ§ÒÙ§ËÙ§ÄÙ§½Ù§¶Ù§¯Ù§¨Ù§¡Ù§šÙ§“Ù§ŒÙ§…Ù§~Ù§wÙ§pÙ§iÙ§bÙ§[Ù§TÙ§MÙ§FÙ§?Ù§8Ù§1Ù§*Ù§#Ù§Ù§Ù§Ù§Ù§Ù§ùاòاëØ§䨧ÝØ§ÖØ§ÏØ§ÈاÁاºØ§³Ø§¬Ø§¥Ø§žØ§—اا‰Ø§‚ا{اtاmاfا_اXاQاJاCا<ا5ا.ا'ا ااا ااý×§ö×§ï×§è×§á×§Ú×§Ó×§Ì×§Å×§¾×§·×§°×§©×§¢×§›×§”×§×§†×§×§x×§q×§j×§c×§\×§U×§N×§G×§@×§9×§2×§+×§$×§×§×§×§×§×§úÖ§óÖ§ìÖ§åÖ§ÞÖ§×Ö§ÐÖ§ÉÖ§ÂÖ§»Ö§´Ö§­Ö§¦Ö§ŸÖ§˜Ö§‘Ö§ŠÖ§ƒÖ§|Ö§uÖ§nÖ§gÖ§`Ö§YÖ§RÖ§KÖ§DÖ§=Ö§6Ö§/Ö§(Ö§!Ö§Ö§Ö§ Ö§Ö§þÕ§÷Õ§ðÕ§éÕ§âÕ§ÛÕ§ÔÕ§ÍÕ§ÆÕ§¿Õ§¸Õ§±Õ§ªÕ§£Õ§œÕ§•Õ§ŽÕ§‡Õ§€Õ§yÕ§rÕ§kÕ§dÕ§]Õ§VÕ§OÕ§HÕ§AÕ§:Õ§3Õ§,Õ§%Õ§Õ§Õ§Õ§ Õ§Õ§ûÔ§ôÔ§íÔ§æÔ§ßÔ§ØÔ§ÑÔ§ÊÔ§ÃÔ§¼Ô§µÔ§®Ô§§Ô§ Ô§™Ô§’Ô§‹Ô§„Ô§}Ô§vÔ§oÔ§hÔ§aÔ§ZÔ§SÔ§LÔ§EÔ§>Ô§7Ô§0Ô§)Ô§"Ô§Ô§Ô§ Ô§Ô§ÿÓ§øÓ§ñÓ§êÓ§ãÓ§ÜÓ§ÕÓ§ÎÓ§ÇÓ§ÀÓ§¹Ó§²Ó§«Ó§¤Ó§Ó§–Ó§Ó§ˆÓ§Ó§zÓ§sÓ§lÓ§eÓ§^Ó§WÓ§PÓ§IÓ§BÓ§;Ó§4Ó§-Ó§&Ó§Ó§Ó§Ó§ Ó§Ó§üÒ§õÒ§îÒ§çÒ§àÒ§ÙÒ§ÒÒ§ËÒ§ÄÒ§½Ò§¶Ò§¯Ò§¨Ò§¡Ò§šÒ§“Ò§ŒÒ§…Ò§~Ò§wÒ§pÒ§iÒ§bÒ§[Ò§TÒ§MÒ§FÒ§?Ò§8Ò§1Ò§*Ò§#Ò§Ò§Ò§Ò§Ò§Ò§ùѧòѧëѧäѧÝѧÖѧÏѧÈѧÁѧºÑ§³Ñ§¬Ñ§¥Ñ§žÑ§—ѧѧ‰Ñ§‚ѧ{ѧtѧmѧfѧ_ѧXѧQѧJѧCѧ<ѧ5ѧ.ѧ'ѧ ѧѧѧ ѧѧýЧöЧïЧèЧáЧÚЧÓЧÌЧÅЧ¾Ð§·Ð§°Ð§©Ð§¢Ð§›Ð§”ЧЧ†Ð§ЧxЧqЧjЧcЧ\ЧUЧNЧGЧ@Ч9Ч2Ч+Ч$ЧЧЧЧЧЧúϧóϧìϧåϧÞϧ×ϧÐϧÉϧÂϧ»Ï§´Ï§­Ï§¦Ï§ŸÏ§˜Ï§‘ϧŠÏ§ƒÏ§|ϧuϧnϧgϧ`ϧYϧRϧKϧDϧ=ϧ6ϧ/ϧ(ϧ!ϧϧϧ ϧϧþΧ÷ΧðΧéΧâΧÛΧÔΧÍΧÆÎ§¿Î§¸Î§±Î§ªÎ§£Î§œÎ§•ΧŽÎ§‡Î§€Î§yΧrΧkΧdΧ]ΧVΧOΧHΧAΧ:Χ3Χ,Χ%ΧΧΧΧ ΧΧûͧôͧíͧæÍ§ßͧØÍ§ÑͧÊͧÃͧ¼Í§µÍ§®Í§§Í§ Í§™Í§’ͧ‹Í§„ͧ}ͧvͧoͧhͧaͧZͧSͧLͧEͧ>ͧ7ͧ0ͧ)ͧ"ͧͧͧ ͧͧÿ̧øÌ§ņ̃ȩ̂ã̧Ü̧Õ̧Î̧Ç̧À̧¹Ì§²Ì§«Ì§¤Ì§̧–̧̧ˆÌ§̧z̧şļȩ^̧W̧P̧I̧B̧;̧4̧-̧&̧̧̧̧ ̧̧ü˧õ˧î˧ç˧à˧Ù˧Ò˧Ë˧Ä˧½Ë§¶Ë§¯Ë§¨Ë§¡Ë§šË§“˧ŒË§…˧~˧w˧p˧i˧b˧[˧T˧M˧F˧?˧8˧1˧*˧#˧˧˧˧˧˧ùʧòʧëʧäʧÝʧÖʧÏʧÈʧÁʧºÊ§³Ê§¬Ê§¥Ê§žÊ§—ʧʧ‰Ê§‚ʧ{ʧtʧmʧfʧ_ʧXʧQʧJʧCʧ<ʧ5ʧ.ʧ'ʧ ʧʧʧ ʧʧýɧöɧïɧèɧáɧÚɧÓɧÌɧÅɧ¾É§·É§°É§©É§¢É§›É§”ɧɧ†É§ɧxɧqɧjɧcɧ\ɧUɧNɧGɧ@ɧ9ɧ2ɧ+ɧ$ɧɧɧɧɧɧúȧóȧìȧåȧÞȧ×ȧÐȧÉȧÂȧ»È§´È§­È§¦È§ŸÈ§˜È§‘ȧŠÈ§ƒÈ§|ȧuȧnȧgȧ`ȧYȧRȧKȧDȧ=ȧ6ȧ/ȧ(ȧ!ȧȧȧ ȧȧþǧ÷ǧðǧéǧâǧÛǧÔǧÍǧÆÇ§¿Ç§¸Ç§±Ç§ªÇ§£Ç§œÇ§•ǧŽÇ§‡Ç§€Ç§yǧrǧkǧdǧ]ǧVǧOǧHǧAǧ:ǧ3ǧ,ǧ%ǧǧǧǧ ǧǧûƧôƧíÆ§æÆ§߯§ØÆ§ÑÆ§ÊÆ§ÃƧ¼Æ§µÆ§®Æ§§Æ§ Æ§™Æ§’Ƨ‹Æ§„Ƨ}ƧvƧoƧhƧaƧZƧSƧLƧEƧ>Ƨ7Ƨ0Ƨ)Ƨ"ƧƧƧ ƧƧÿŧøÅ§ñŧêŧãŧÜŧÕŧÎŧÇŧÀŧ¹Å§²Å§«Å§¤Å§ŧ–ŧŧˆÅ§ŧzŧsŧlŧeŧ^ŧWŧPŧIŧBŧ;ŧ4ŧ-ŧ&ŧŧŧŧ ŧŧüħõħîħçħàħÙħÒħËħÄħ½Ä§¶Ä§¯Ä§¨Ä§¡Ä§šÄ§“ħŒÄ§…ħ~ħwħpħiħbħ[ħTħMħFħ?ħ8ħ1ħ*ħ#ħħħħħħùçòçëçäçÝçÖçÏçÈçÁçºÃ§³Ã§¬Ã§¥Ã§žÃ§—çç‰Ã§‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççý§ö§ï§è§á§Ú§Ó§̧ŧ¾Â§·Â§°Â§©Â§¢Â§›Â§”§§†Â§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§úÁ§óÁ§ìÁ§åÁ§ÞÁ§×Á§ÐÁ§ÉÁ§ÂÁ§»Á§´Á§­Á§¦Á§ŸÁ§˜Á§‘Á§ŠÁ§ƒÁ§|Á§uÁ§nÁ§gÁ§`Á§YÁ§RÁ§KÁ§DÁ§=Á§6Á§/Á§(Á§!Á§Á§Á§ Á§Á§þÀ§÷À§ðÀ§éÀ§âÀ§ÛÀ§ÔÀ§ÍÀ§ÆÀ§¿À§¸À§±À§ªÀ§£À§œÀ§•À§ŽÀ§‡À§€À§yÀ§rÀ§kÀ§dÀ§]À§VÀ§OÀ§HÀ§AÀ§:À§3À§,À§%À§À§À§À§ À§À§û¿§ô¿§í¿§æ¿§ß¿§Ø¿§Ñ¿§Ê¿§ÿ§¼¿§µ¿§®¿§§¿§ ¿§™¿§’¿§‹¿§„¿§}¿§v¿§o¿§h¿§a¿§Z¿§S¿§L¿§E¿§>¿§7¿§0¿§)¿§"¿§¿§¿§ ¿§¿§ÿ¾§ø¾§ñ¾§ê¾§ã¾§ܾ§Õ¾§ξ§Ǿ§À¾§¹¾§²¾§«¾§¤¾§¾§–¾§¾§ˆ¾§¾§z¾§s¾§l¾§e¾§^¾§W¾§P¾§I¾§B¾§;¾§4¾§-¾§&¾§¾§¾§¾§ ¾§¾§ü½§õ½§î½§ç½§ཧÙ½§Ò½§˽§Ľ§½½§¶½§¯½§¨½§¡½§š½§“½§Œ½§…½§~½§w½§p½§i½§b½§[½§T½§M½§F½§?½§8½§1½§*½§#½§½§½§½§½§½§ù¼§ò¼§ë¼§ä¼§ݼ§Ö¼§ϼ§ȼ§Á¼§º¼§³¼§¬¼§¥¼§ž¼§—¼§¼§‰¼§‚¼§{¼§t¼§m¼§f¼§_¼§X¼§Q¼§J¼§C¼§<¼§5¼§.¼§'¼§ ¼§¼§¼§ ¼§¼§ý»§ö»§ï»§è»§á»§Ú»§Ó»§Ì»§Å»§¾»§·»§°»§©»§¢»§›»§”»§»§†»§»§x»§q»§j»§c»§\»§U»§N»§G»§@»§9»§2»§+»§$»§»§»§»§»§»§úº§óº§캧座Þº§׺§к§ɺ§º§»º§´º§­º§¦º§Ÿº§˜º§‘º§Šº§ƒº§|º§uº§nº§gº§`º§Yº§Rº§Kº§Dº§=º§6º§/º§(º§!º§º§º§ º§º§þ¹§÷¹§ð¹§é¹§â¹§Û¹§Ô¹§͹§ƹ§¿¹§¸¹§±¹§ª¹§£¹§œ¹§•¹§޹§‡¹§€¹§y¹§r¹§k¹§d¹§]¹§V¹§O¹§H¹§A¹§:¹§3¹§,¹§%¹§¹§¹§¹§ ¹§¹§û¸§ô¸§í¸§渧߸§ظ§Ѹ§ʸ§ø§¼¸§µ¸§®¸§§¸§ ¸§™¸§’¸§‹¸§„¸§}¸§v¸§o¸§h¸§a¸§Z¸§S¸§L¸§E¸§>¸§7¸§0¸§)¸§"¸§¸§¸§ ¸§¸§ÿ·§ø·§ñ·§ê·§ã·§Ü·§Õ·§η§Ç·§À·§¹·§²·§«·§¤·§·§–·§·§ˆ·§·§z·§s·§l·§e·§^·§W·§P·§I·§B·§;·§4·§-·§&·§·§·§·§ ·§·§ü¶§õ¶§î¶§ç¶§à¶§Ù¶§Ò¶§˶§ͧ½¶§¶¶§¯¶§¨¶§¡¶§š¶§“¶§Œ¶§…¶§~¶§w¶§p¶§i¶§b¶§[¶§T¶§M¶§F¶§?¶§8¶§1¶§*¶§#¶§¶§¶§¶§¶§¶§ùµ§òµ§ëµ§äµ§ݵ§Öµ§ϵ§ȵ§Áµ§ºµ§³µ§¬µ§¥µ§žµ§—µ§µ§‰µ§‚µ§{µ§tµ§mµ§fµ§_µ§Xµ§Qµ§Jµ§Cµ§<µ§5µ§.µ§'µ§ µ§µ§µ§ µ§µ§ý´§ö´§ï´§è´§á´§Ú´§Ó´§Ì´§Å´§¾´§·´§°´§©´§¢´§›´§”´§´§†´§´§x´§q´§j´§c´§\´§U´§N´§G´§@´§9´§2´§+´§$´§´§´§´§´§´§ú³§ó³§ì³§å³§Þ³§׳§г§ɳ§³§»³§´³§­³§¦³§Ÿ³§˜³§‘³§г§ƒ³§|³§u³§n³§g³§`³§Y³§R³§K³§D³§=³§6³§/³§(³§!³§³§³§ ³§³§þ²§÷²§ð²§é²§â²§Û²§Ô²§Ͳ§Ʋ§¿²§¸²§±²§ª²§£²§œ²§•²§޲§‡²§€²§y²§r²§k²§d²§]²§V²§O²§H²§A²§:²§3²§,²§%²§²§²§²§ ²§²§û±§ô±§í±§æ±§ß±§ر§ѱ§ʱ§ñ§¼±§µ±§®±§§±§ ±§™±§’±§‹±§„±§}±§v±§o±§h±§a±§Z±§S±§L±§E±§>±§7±§0±§)±§"±§±§±§ ±§±§ÿ°§ø°§ñ°§ê°§ã°§ܰ§Õ°§ΰ§ǰ§À°§¹°§²°§«°§¤°§°§–°§°§ˆ°§°§z°§s°§l°§e°§^°§W°§P°§I°§B°§;°§4°§-°§&°§°§°§°§ °§°§ü¯§õ¯§篧௧Ù¯§Ò¯§˯§į§½¯§¶¯§¯¯§¨¯§¡¯§š¯§“¯§Œ¯§…¯§~¯§w¯§p¯§i¯§b¯§[¯§T¯§M¯§F¯§?¯§8¯§1¯§*¯§#¯§¯§¯§¯§¯§¯§ù®§ò®§ë®§ä®§Ý®§Ö®§Ï®§È®§Á®§º®§³®§¬®§¥®§ž®§—®§®§‰®§‚®§{®§t®§m®§f®§_®§X®§Q®§J®§C®§<®§5®§.®§'®§ ®§®§®§ ®§®§ý­§ö­§ï­§è­§á­§Ú­§Ó­§Ì­§Å­§¾­§·­§°­§©­§¢­§›­§”­§­§†­§­§x­§q­§j­§c­§\­§U­§N­§G­§@­§9­§2­§+­§$­§­§­§­§­§­§ú¬§ó¬§쬧嬧Þ¬§׬§Ь§ɬ§¬§»¬§´¬§­¬§¦¬§Ÿ¬§˜¬§‘¬§Ь§ƒ¬§|¬§u¬§n¬§g¬§`¬§Y¬§R¬§K¬§D¬§=¬§6¬§/¬§(¬§!¬§¬§¬§ ¬§¬§þ«§÷«§ð«§é«§â«§Û«§Ô«§Í«§Æ«§¿«§¸«§±«§ª«§£«§œ«§•«§Ž«§‡«§€«§y«§r«§k«§d«§]«§V«§O«§H«§A«§:«§3«§,«§%«§«§«§«§ «§«§ûª§ôª§íª§檧ߪ§ت§Ѫ§ʪ§ê§¼ª§µª§®ª§§ª§ ª§™ª§’ª§‹ª§„ª§}ª§vª§oª§hª§aª§Zª§Sª§Lª§Eª§>ª§7ª§0ª§)ª§"ª§ª§ª§ ª§ª§ÿ©§ø©§ñ©§ê©§ã©§Ü©§Õ©§Ω§Ç©§À©§¹©§²©§«©§¤©§©§–©§©§ˆ©§©§z©§s©§l©§e©§^©§W©§P©§I©§B©§;©§4©§-©§&©§©§©§©§ ©§©§ü¨§õ¨§稧ਧÙ¨§Ò¨§˨§Ĩ§½¨§¶¨§¯¨§¨¨§¡¨§š¨§“¨§Œ¨§…¨§~¨§w¨§p¨§i¨§b¨§[¨§T¨§M¨§F¨§?¨§8¨§1¨§*¨§#¨§¨§¨§¨§¨§¨§ù§§ò§§ë§§ä§§ݧ§Ö§§ϧ§ȧ§Á§§º§§³§§¬§§¥§§ž§§—§§§§‰§§‚§§{§§t§§m§§f§§_§§X§§Q§§J§§C§§<§§5§§.§§'§§ §§§§§§ §§§§ý¦§ö¦§獵覧ᦧÚ¦§Ó¦§̦§Ŧ§¾¦§·¦§°¦§©¦§¢¦§›¦§”¦§¦§†¦§¦§x¦§q¦§j¦§c¦§\¦§U¦§N¦§G¦§@¦§9¦§2¦§+¦§$¦§¦§¦§¦§¦§¦§ú¥§ó¥§쥧奧Þ¥§×¥§Ð¥§É¥§Â¥§»¥§´¥§­¥§¦¥§Ÿ¥§˜¥§‘¥§Š¥§ƒ¥§|¥§u¥§n¥§g¥§`¥§Y¥§R¥§K¥§D¥§=¥§6¥§/¥§(¥§!¥§¥§¥§ ¥§¥§þ¤§÷¤§ð¤§餧⤧Û¤§Ô¤§ͤ§Ƥ§¿¤§¸¤§±¤§ª¤§£¤§œ¤§•¤§ޤ§‡¤§€¤§y¤§r¤§k¤§d¤§]¤§V¤§O¤§H¤§A¤§:¤§3¤§,¤§%¤§¤§¤§¤§ ¤§¤§û£§ô£§í£§棧ߣ§Ø£§Ñ£§Ê£§ã§¼£§µ£§®£§§£§ £§™£§’£§‹£§„£§}£§v£§o£§h£§a£§Z£§S£§L£§E£§>£§7£§0£§)£§"£§£§£§ £§£§ÿ¢§ø¢§ñ¢§ꢧ㢧Ü¢§Õ¢§΢§Ç¢§À¢§¹¢§²¢§«¢§¤¢§¢§–¢§¢§ˆ¢§¢§z¢§s¢§l¢§e¢§^¢§W¢§P¢§I¢§B¢§;¢§4¢§-¢§&¢§¢§¢§¢§ ¢§¢§ü¡§õ¡§î¡§ç¡§à¡§Ù¡§Ò¡§Ë¡§Ä¡§½¡§¶¡§¯¡§¨¡§¡¡§š¡§“¡§Œ¡§…¡§~¡§w¡§p¡§i¡§b¡§[¡§T¡§M¡§F¡§?¡§8¡§1¡§*¡§#¡§¡§¡§¡§¡§¡§ù §ò §ë §ä §Ý §Ö §Ï §È §Á §º §³ §¬ §¥ §ž §— § §‰ §‚ §{ §t §m §f §_ §X §Q §J §C §< §5 §. §' §  § § §  § §ýŸ§öŸ§蟧៧ÚŸ§ÓŸ§ÌŸ§ÅŸ§¾Ÿ§·Ÿ§°Ÿ§©Ÿ§¢Ÿ§›Ÿ§”Ÿ§Ÿ§†Ÿ§Ÿ§xŸ§qŸ§jŸ§cŸ§\Ÿ§UŸ§NŸ§GŸ§@Ÿ§9Ÿ§2Ÿ§+Ÿ§$Ÿ§Ÿ§Ÿ§Ÿ§Ÿ§Ÿ§úž§óž§ìž§åž§Þž§מ§О§Éž§ž§»ž§´ž§­ž§¦ž§Ÿž§˜ž§‘ž§Šž§ƒž§|ž§už§nž§gž§`ž§Yž§Rž§Kž§Dž§=ž§6ž§/ž§(ž§!ž§ž§ž§ ž§ž§þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§ûœ§ôœ§휧朧ßœ§Øœ§Ñœ§Êœ§ܧ¼œ§µœ§®œ§§œ§ œ§™œ§’œ§‹œ§„œ§}œ§vœ§oœ§hœ§aœ§Zœ§Sœ§Lœ§Eœ§>œ§7œ§0œ§)œ§"œ§œ§œ§ œ§œ§ÿ›§ø›§ñ›§ê›§ã›§Ü›§Õ›§Λ§Ç›§À›§¹›§²›§«›§¤›§›§–›§›§ˆ›§›§z›§s›§l›§e›§^›§W›§P›§I›§B›§;›§4›§-›§&›§›§›§›§ ›§›§üš§õš§îš§çš§àš§Ùš§Òš§Ëš§Äš§½š§¶š§¯š§¨š§¡š§šš§“š§Œš§…š§~š§wš§pš§iš§bš§[š§Tš§Mš§Fš§?š§8š§1š§*š§#š§š§š§š§š§š§ù™§ò™§ë™§ä™§Ý™§Ö™§Ï™§È™§Á™§º™§³™§¬™§¥™§ž™§—™§™§‰™§‚™§{™§t™§m™§f™§_™§X™§Q™§J™§C™§<™§5™§.™§'™§ ™§™§™§ ™§™§ý˜§ö˜§蘧ᘧÚ˜§Ó˜§̘§ا¾˜§·˜§°˜§©˜§¢˜§›˜§”˜§˜§†˜§˜§x˜§q˜§j˜§c˜§\˜§U˜§N˜§G˜§@˜§9˜§2˜§+˜§$˜§˜§˜§˜§˜§˜§ú—§ó—§ì—§å—§Þ—§×—§З§É—§—§»—§´—§­—§¦—§Ÿ—§˜—§‘—§Š—§ƒ—§|—§u—§n—§g—§`—§Y—§R—§K—§D—§=—§6—§/—§(—§!—§—§—§ —§—§þ–§÷–§ð–§é–§â–§Û–§Ô–§Í–§Æ–§¿–§¸–§±–§ª–§£–§œ–§•–§Ž–§‡–§€–§y–§r–§k–§d–§]–§V–§O–§H–§A–§:–§3–§,–§%–§–§–§–§ –§–§û•§ô•§í•§æ•§ß•§Ø•§Ñ•§Ê•§Õ§¼•§µ•§®•§§•§ •§™•§’•§‹•§„•§}•§v•§o•§h•§a•§Z•§S•§L•§E•§>•§7•§0•§)•§"•§•§•§ •§•§ÿ”§ø”§ñ”§ê”§ã”§Ü”§Õ”§Δ§Ç”§À”§¹”§²”§«”§¤”§”§–”§”§ˆ”§”§z”§s”§l”§e”§^”§W”§P”§I”§B”§;”§4”§-”§&”§”§”§”§ ”§”§ü“§õ“§î“§ç“§à“§Ù“§Ò“§Ë“§Ä“§½“§¶“§¯“§¨“§¡“§š“§““§Œ“§…“§~“§w“§p“§i“§b“§[“§T“§M“§F“§?“§8“§1“§*“§#“§“§“§“§“§“§ù’§ò’§ë’§ä’§Ý’§Ö’§Ï’§È’§Á’§º’§³’§¬’§¥’§ž’§—’§’§‰’§‚’§{’§t’§m’§f’§_’§X’§Q’§J’§C’§<’§5’§.’§'’§ ’§’§’§ ’§’§ý‘§ö‘§ï‘§è‘§á‘§Ú‘§Ó‘§Ì‘§Å‘§¾‘§·‘§°‘§©‘§¢‘§›‘§”‘§‘§†‘§‘§x‘§q‘§j‘§c‘§\‘§U‘§N‘§G‘§@‘§9‘§2‘§+‘§$‘§‘§‘§‘§‘§‘§ú§ó§ì§å§Þ§×§Чɧ§»§´§­§¦§Ÿ§˜§‘§Чƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§ûާôާ펧控ߎ§ØŽ§ÑŽ§ÊŽ§Ãާ¼Ž§µŽ§®Ž§§Ž§ Ž§™Ž§’ާ‹Ž§„ާ}ާvާoާhާaާZާSާLާEާ>ާ7ާ0ާ)ާ"ާާާ ާާÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§üŒ§õŒ§猧àŒ§ÙŒ§ÒŒ§ËŒ§ÄŒ§½Œ§¶Œ§¯Œ§¨Œ§¡Œ§šŒ§“Œ§ŒŒ§…Œ§~Œ§wŒ§pŒ§iŒ§bŒ§[Œ§TŒ§MŒ§FŒ§?Œ§8Œ§1Œ§*Œ§#Œ§Œ§Œ§Œ§Œ§Œ§ù‹§ò‹§ë‹§ä‹§Ý‹§Ö‹§Ï‹§È‹§Á‹§º‹§³‹§¬‹§¥‹§ž‹§—‹§‹§‰‹§‚‹§{‹§t‹§m‹§f‹§_‹§X‹§Q‹§J‹§C‹§<‹§5‹§.‹§'‹§ ‹§‹§‹§ ‹§‹§ýЧöЧ芧ኧÚŠ§ÓŠ§ÌŠ§ÅЧ¾Š§·Š§°Š§©Š§¢Š§›Š§”ЧЧ†Š§ЧxЧqЧjЧcЧ\ЧUЧNЧGЧ@Ч9Ч2Ч+Ч$ЧЧЧЧЧЧú‰§ó‰§쉧剧Þ‰§׉§Љ§ɉ§‰§»‰§´‰§­‰§¦‰§Ÿ‰§˜‰§‘‰§Љ§ƒ‰§|‰§u‰§n‰§g‰§`‰§Y‰§R‰§K‰§D‰§=‰§6‰§/‰§(‰§!‰§‰§‰§ ‰§‰§þˆ§÷ˆ§ðˆ§鈧∧Ûˆ§Ôˆ§͈§ƈ§¿ˆ§¸ˆ§±ˆ§ªˆ§£ˆ§œˆ§•ˆ§Žˆ§‡ˆ§€ˆ§yˆ§rˆ§kˆ§dˆ§]ˆ§Vˆ§Oˆ§Hˆ§Aˆ§:ˆ§3ˆ§,ˆ§%ˆ§ˆ§ˆ§ˆ§ ˆ§ˆ§û‡§ô‡§퇧懧߇§؇§ч§ʇ§ǧ¼‡§µ‡§®‡§§‡§ ‡§™‡§’‡§‹‡§„‡§}‡§v‡§o‡§h‡§a‡§Z‡§S‡§L‡§E‡§>‡§7‡§0‡§)‡§"‡§‡§‡§ ‡§‡§ÿ†§ø†§ñ†§ꆧㆧ܆§Õ†§Ά§dž§À†§¹†§²†§«†§¤†§†§–†§†§ˆ†§†§z†§s†§l†§e†§^†§W†§P†§I†§B†§;†§4†§-†§&†§†§†§†§ †§†§ü…§õ…§î…§ç…§à…§Ù…§Ò…§Ë…§Ä…§½…§¶…§¯…§¨…§¡…§š…§“…§Œ…§……§~…§w…§p…§i…§b…§[…§T…§M…§F…§?…§8…§1…§*…§#…§…§…§…§…§…§ù„§ò„§ë„§ä„§Ý„§Ö„§Ï„§È„§Á„§º„§³„§¬„§¥„§ž„§—„§„§‰„§‚„§{„§t„§m„§f„§_„§X„§Q„§J„§C„§<„§5„§.„§'„§ „§„§„§ „§„§ýƒ§öƒ§胧ყÚƒ§Óƒ§̃§ѧ¾ƒ§·ƒ§°ƒ§©ƒ§¢ƒ§›ƒ§”ƒ§ƒ§†ƒ§ƒ§xƒ§qƒ§jƒ§cƒ§\ƒ§Uƒ§Nƒ§Gƒ§@ƒ§9ƒ§2ƒ§+ƒ§$ƒ§ƒ§ƒ§ƒ§ƒ§ƒ§ú‚§ó‚§ì‚§å‚§Þ‚§ׂ§Ђ§É‚§‚§»‚§´‚§­‚§¦‚§Ÿ‚§˜‚§‘‚§Š‚§ƒ‚§|‚§u‚§n‚§g‚§`‚§Y‚§R‚§K‚§D‚§=‚§6‚§/‚§(‚§!‚§‚§‚§ ‚§‚§þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û€§ô€§퀧性߀§Ø€§Ñ€§Ê€§À§¼€§µ€§®€§§€§ €§™€§’€§‹€§„€§}€§v€§o€§h€§a€§Z€§S€§L€§E€§>€§7€§0€§)€§"€§€§€§ €§€§ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü~§õ~§î~§ç~§à~§Ù~§Ò~§Ë~§Ä~§½~§¶~§¯~§¨~§¡~§š~§“~§Œ~§…~§~~§w~§p~§i~§b~§[~§T~§M~§F~§?~§8~§1~§*~§#~§~§~§~§~§~§ù}§ò}§ë}§ä}§Ý}§Ö}§Ï}§È}§Á}§º}§³}§¬}§¥}§ž}§—}§}§‰}§‚}§{}§t}§m}§f}§_}§X}§Q}§J}§C}§<}§5}§.}§'}§ }§}§}§ }§}§ý|§ö|§ï|§è|§á|§Ú|§Ó|§Ì|§Å|§¾|§·|§°|§©|§¢|§›|§”|§|§†|§|§x|§q|§j|§c|§\|§U|§N|§G|§@|§9|§2|§+|§$|§|§|§|§|§|§ú{§ó{§ì{§å{§Þ{§×{§Ð{§É{§Â{§»{§´{§­{§¦{§Ÿ{§˜{§‘{§Š{§ƒ{§|{§u{§n{§g{§`{§Y{§R{§K{§D{§={§6{§/{§({§!{§{§{§ {§{§þz§÷z§ðz§éz§âz§Ûz§Ôz§Íz§Æz§¿z§¸z§±z§ªz§£z§œz§•z§Žz§‡z§€z§yz§rz§kz§dz§]z§Vz§Oz§Hz§Az§:z§3z§,z§%z§z§z§z§ z§z§ûy§ôy§íy§æy§ßy§Øy§Ñy§Êy§Ãy§¼y§µy§®y§§y§ y§™y§’y§‹y§„y§}y§vy§oy§hy§ay§Zy§Sy§Ly§Ey§>y§7y§0y§)y§"y§y§y§ y§y§ÿx§øx§ñx§êx§ãx§Üx§Õx§Îx§Çx§Àx§¹x§²x§«x§¤x§x§–x§x§ˆx§x§zx§sx§lx§ex§^x§Wx§Px§Ix§Bx§;x§4x§-x§&x§x§x§x§ x§x§üw§õw§îw§çw§àw§Ùw§Òw§Ëw§Äw§½w§¶w§¯w§¨w§¡w§šw§“w§Œw§…w§~w§ww§pw§iw§bw§[w§Tw§Mw§Fw§?w§8w§1w§*w§#w§w§w§w§w§w§ùv§òv§ëv§äv§Ýv§Öv§Ïv§Èv§Áv§ºv§³v§¬v§¥v§žv§—v§v§‰v§‚v§{v§tv§mv§fv§_v§Xv§Qv§Jv§Cv§r§7r§0r§)r§"r§r§r§ r§r§ÿq§øq§ñq§êq§ãq§Üq§Õq§Îq§Çq§Àq§¹q§²q§«q§¤q§q§–q§q§ˆq§q§zq§sq§lq§eq§^q§Wq§Pq§Iq§Bq§;q§4q§-q§&q§q§q§q§ q§q§üp§õp§îp§çp§àp§Ùp§Òp§Ëp§Äp§½p§¶p§¯p§¨p§¡p§šp§“p§Œp§…p§~p§wp§pp§ip§bp§[p§Tp§Mp§Fp§?p§8p§1p§*p§#p§p§p§p§p§p§ùo§òo§ëo§äo§Ýo§Öo§Ïo§Èo§Áo§ºo§³o§¬o§¥o§žo§—o§o§‰o§‚o§{o§to§mo§fo§_o§Xo§Qo§Jo§Co§k§7k§0k§)k§"k§k§k§ k§k§ÿj§øj§ñj§êj§ãj§Üj§Õj§Îj§Çj§Àj§¹j§²j§«j§¤j§j§–j§j§ˆj§j§zj§sj§lj§ej§^j§Wj§Pj§Ij§Bj§;j§4j§-j§&j§j§j§j§ j§j§üi§õi§îi§çi§ài§Ùi§Òi§Ëi§Äi§½i§¶i§¯i§¨i§¡i§ši§“i§Œi§…i§~i§wi§pi§ii§bi§[i§Ti§Mi§Fi§?i§8i§1i§*i§#i§i§i§i§i§i§ùh§òh§ëh§äh§Ýh§Öh§Ïh§Èh§Áh§ºh§³h§¬h§¥h§žh§—h§h§‰h§‚h§{h§th§mh§fh§_h§Xh§Qh§Jh§Ch§d§7d§0d§)d§"d§d§d§ d§d§ÿc§øc§ñc§êc§ãc§Üc§Õc§Îc§Çc§Àc§¹c§²c§«c§¤c§c§–c§c§ˆc§c§zc§sc§lc§ec§^c§Wc§Pc§Ic§Bc§;c§4c§-c§&c§c§c§c§ c§c§üb§õb§îb§çb§àb§Ùb§Òb§Ëb§Äb§½b§¶b§¯b§¨b§¡b§šb§“b§Œb§…b§~b§wb§pb§ib§bb§[b§Tb§Mb§Fb§?b§8b§1b§*b§#b§b§b§b§b§b§ùa§òa§ëa§äa§Ýa§Öa§Ïa§Èa§Áa§ºa§³a§¬a§¥a§ža§—a§a§‰a§‚a§{a§ta§ma§fa§_a§Xa§Qa§Ja§Ca§]§7]§0]§)]§"]§]§]§ ]§]§ÿ\§ø\§ñ\§ê\§ã\§Ü\§Õ\§Î\§Ç\§À\§¹\§²\§«\§¤\§\§–\§\§ˆ\§\§z\§s\§l\§e\§^\§W\§P\§I\§B\§;\§4\§-\§&\§\§\§\§ \§\§ü[§õ[§î[§ç[§à[§Ù[§Ò[§Ë[§Ä[§½[§¶[§¯[§¨[§¡[§š[§“[§Œ[§…[§~[§w[§p[§i[§b[§[[§T[§M[§F[§?[§8[§1[§*[§#[§[§[§[§[§[§ùZ§òZ§ëZ§äZ§ÝZ§ÖZ§ÏZ§ÈZ§ÁZ§ºZ§³Z§¬Z§¥Z§žZ§—Z§Z§‰Z§‚Z§{Z§tZ§mZ§fZ§_Z§XZ§QZ§JZ§CZ§V§7V§0V§)V§"V§V§V§ V§V§ÿU§øU§ñU§êU§ãU§ÜU§ÕU§ÎU§ÇU§ÀU§¹U§²U§«U§¤U§U§–U§U§ˆU§U§zU§sU§lU§eU§^U§WU§PU§IU§BU§;U§4U§-U§&U§U§U§U§ U§U§üT§õT§îT§çT§àT§ÙT§ÒT§ËT§ÄT§½T§¶T§¯T§¨T§¡T§šT§“T§ŒT§…T§~T§wT§pT§iT§bT§[T§TT§MT§FT§?T§8T§1T§*T§#T§T§T§T§T§T§ùS§òS§ëS§äS§ÝS§ÖS§ÏS§ÈS§ÁS§ºS§³S§¬S§¥S§žS§—S§S§‰S§‚S§{S§tS§mS§fS§_S§XS§QS§JS§CS§O§7O§0O§)O§"O§O§O§ O§O§ÿN§øN§ñN§êN§ãN§ÜN§ÕN§ÎN§ÇN§ÀN§¹N§²N§«N§¤N§N§–N§N§ˆN§N§zN§sN§lN§eN§^N§WN§PN§IN§BN§;N§4N§-N§&N§N§N§N§ N§N§üM§õM§îM§çM§àM§ÙM§ÒM§ËM§ÄM§½M§¶M§¯M§¨M§¡M§šM§“M§ŒM§…M§~M§wM§pM§iM§bM§[M§TM§MM§FM§?M§8M§1M§*M§#M§M§M§M§M§M§ùL§òL§ëL§äL§ÝL§ÖL§ÏL§ÈL§ÁL§ºL§³L§¬L§¥L§žL§—L§L§‰L§‚L§{L§tL§mL§fL§_L§XL§QL§JL§CL§H§7H§0H§)H§"H§H§H§ H§H§ÿG§øG§ñG§êG§ãG§ÜG§ÕG§ÎG§ÇG§ÀG§¹G§²G§«G§¤G§G§–G§G§ˆG§G§zG§sG§lG§eG§^G§WG§PG§IG§BG§;G§4G§-G§&G§G§G§G§ G§G§üF§õF§îF§çF§àF§ÙF§ÒF§ËF§ÄF§½F§¶F§¯F§¨F§¡F§šF§“F§ŒF§…F§~F§wF§pF§iF§bF§[F§TF§MF§FF§?F§8F§1F§*F§#F§F§F§F§F§F§ùE§òE§ëE§äE§ÝE§ÖE§ÏE§ÈE§ÁE§ºE§³E§¬E§¥E§žE§—E§E§‰E§‚E§{E§tE§mE§fE§_E§XE§QE§JE§CE§A§7A§0A§)A§"A§A§A§ A§A§ÿ@§ø@§ñ@§ê@§ã@§Ü@§Õ@§Î@§Ç@§À@§¹@§²@§«@§¤@§@§–@§@§ˆ@§@§z@§s@§l@§e@§^@§W@§P@§I@§B@§;@§4@§-@§&@§@§@§@§ @§@§ü?§õ?§î?§ç?§à?§Ù?§Ò?§Ë?§Ä?§½?§¶?§¯?§¨?§¡?§š?§“?§Œ?§…?§~?§w?§p?§i?§b?§[?§T?§M?§F?§??§8?§1?§*?§#?§?§?§?§?§?§ù>§ò>§ë>§ä>§Ý>§Ö>§Ï>§È>§Á>§º>§³>§¬>§¥>§ž>§—>§>§‰>§‚>§{>§t>§m>§f>§_>§X>§Q>§J>§C>§<>§5>§.>§'>§ >§>§>§ >§>§ý=§ö=§ï=§è=§á=§Ú=§Ó=§Ì=§Å=§¾=§·=§°=§©=§¢=§›=§”=§=§†=§=§x=§q=§j=§c=§\=§U=§N=§G=§@=§9=§2=§+=§$=§=§=§=§=§=§ú<§ó<§ì<§å<§Þ<§×<§Ð<§É<§Â<§»<§´<§­<§¦<§Ÿ<§˜<§‘<§Š<§ƒ<§|<§u<§n<§g<§`<§Y<§R<§K<§D<§=<§6<§/<§(<§!<§<§<§ <§<§þ;§÷;§ð;§é;§â;§Û;§Ô;§Í;§Æ;§¿;§¸;§±;§ª;§£;§œ;§•;§Ž;§‡;§€;§y;§r;§k;§d;§];§V;§O;§H;§A;§:;§3;§,;§%;§;§;§;§ ;§;§û:§ô:§í:§æ:§ß:§Ø:§Ñ:§Ê:§Ã:§¼:§µ:§®:§§:§ :§™:§’:§‹:§„:§}:§v:§o:§h:§a:§Z:§S:§L:§E:§>:§7:§0:§):§":§:§:§ :§:§ÿ9§ø9§ñ9§ê9§ã9§Ü9§Õ9§Î9§Ç9§À9§¹9§²9§«9§¤9§9§–9§9§ˆ9§9§z9§s9§l9§e9§^9§W9§P9§I9§B9§;9§49§-9§&9§9§9§9§ 9§9§ü8§õ8§î8§ç8§à8§Ù8§Ò8§Ë8§Ä8§½8§¶8§¯8§¨8§¡8§š8§“8§Œ8§…8§~8§w8§p8§i8§b8§[8§T8§M8§F8§?8§88§18§*8§#8§8§8§8§8§8§ù7§ò7§ë7§ä7§Ý7§Ö7§Ï7§È7§Á7§º7§³7§¬7§¥7§ž7§—7§7§‰7§‚7§{7§t7§m7§f7§_7§X7§Q7§J7§C7§<7§57§.7§'7§ 7§7§7§ 7§7§ý6§ö6§ï6§è6§á6§Ú6§Ó6§Ì6§Å6§¾6§·6§°6§©6§¢6§›6§”6§6§†6§6§x6§q6§j6§c6§\6§U6§N6§G6§@6§96§26§+6§$6§6§6§6§6§6§ú5§ó5§ì5§å5§Þ5§×5§Ð5§É5§Â5§»5§´5§­5§¦5§Ÿ5§˜5§‘5§Š5§ƒ5§|5§u5§n5§g5§`5§Y5§R5§K5§D5§=5§65§/5§(5§!5§5§5§ 5§5§þ4§÷4§ð4§é4§â4§Û4§Ô4§Í4§Æ4§¿4§¸4§±4§ª4§£4§œ4§•4§Ž4§‡4§€4§y4§r4§k4§d4§]4§V4§O4§H4§A4§:4§34§,4§%4§4§4§4§ 4§4§û3§ô3§í3§æ3§ß3§Ø3§Ñ3§Ê3§Ã3§¼3§µ3§®3§§3§ 3§™3§’3§‹3§„3§}3§v3§o3§h3§a3§Z3§S3§L3§E3§>3§73§03§)3§"3§3§3§ 3§3§ÿ2§ø2§ñ2§ê2§ã2§Ü2§Õ2§Î2§Ç2§À2§¹2§²2§«2§¤2§2§–2§2§ˆ2§2§z2§s2§l2§e2§^2§W2§P2§I2§B2§;2§42§-2§&2§2§2§2§ 2§2§ü1§õ1§î1§ç1§à1§Ù1§Ò1§Ë1§Ä1§½1§¶1§¯1§¨1§¡1§š1§“1§Œ1§…1§~1§w1§p1§i1§b1§[1§T1§M1§F1§?1§81§11§*1§#1§1§1§1§1§1§ù0§ò0§ë0§ä0§Ý0§Ö0§Ï0§È0§Á0§º0§³0§¬0§¥0§ž0§—0§0§‰0§‚0§{0§t0§m0§f0§_0§X0§Q0§J0§C0§<0§50§.0§'0§ 0§0§0§ 0§0§ý/§ö/§ï/§è/§á/§Ú/§Ó/§Ì/§Å/§¾/§·/§°/§©/§¢/§›/§”/§/§†/§/§x/§q/§j/§c/§\/§U/§N/§G/§@/§9/§2/§+/§$/§/§/§/§/§/§ú.§ó.§ì.§å.§Þ.§×.§Ð.§É.§Â.§».§´.§­.§¦.§Ÿ.§˜.§‘.§Š.§ƒ.§|.§u.§n.§g.§`.§Y.§R.§K.§D.§=.§6.§/.§(.§!.§.§.§ .§.§þ-§÷-§ð-§é-§â-§Û-§Ô-§Í-§Æ-§¿-§¸-§±-§ª-§£-§œ-§•-§Ž-§‡-§€-§y-§r-§k-§d-§]-§V-§O-§H-§A-§:-§3-§,-§%-§-§-§-§ -§-§û,§ô,§í,§æ,§ß,§Ø,§Ñ,§Ê,§Ã,§¼,§µ,§®,§§,§ ,§™,§’,§‹,§„,§},§v,§o,§h,§a,§Z,§S,§L,§E,§>,§7,§0,§),§",§,§,§ ,§,§ÿ+§ø+§ñ+§ê+§ã+§Ü+§Õ+§Î+§Ç+§À+§¹+§²+§«+§¤+§+§–+§+§ˆ+§+§z+§s+§l+§e+§^+§W+§P+§I+§B+§;+§4+§-+§&+§+§+§+§ +§+§ü*§õ*§î*§ç*§à*§Ù*§Ò*§Ë*§Ä*§½*§¶*§¯*§¨*§¡*§š*§“*§Œ*§…*§~*§w*§p*§i*§b*§[*§T*§M*§F*§?*§8*§1*§**§#*§*§*§*§*§*§ù)§ò)§ë)§ä)§Ý)§Ö)§Ï)§È)§Á)§º)§³)§¬)§¥)§ž)§—)§)§‰)§‚)§{)§t)§m)§f)§_)§X)§Q)§J)§C)§<)§5)§.)§')§ )§)§)§ )§)§ý(§ö(§ï(§è(§á(§Ú(§Ó(§Ì(§Å(§¾(§·(§°(§©(§¢(§›(§”(§(§†(§(§x(§q(§j(§c(§\(§U(§N(§G(§@(§9(§2(§+(§$(§(§(§(§(§(§ú'§ó'§ì'§å'§Þ'§×'§Ð'§É'§Â'§»'§´'§­'§¦'§Ÿ'§˜'§‘'§Š'§ƒ'§|'§u'§n'§g'§`'§Y'§R'§K'§D'§='§6'§/'§('§!'§'§'§ '§'§þ&§÷&§ð&§é&§â&§Û&§Ô&§Í&§Æ&§¿&§¸&§±&§ª&§£&§œ&§•&§Ž&§‡&§€&§y&§r&§k&§d&§]&§V&§O&§H&§A&§:&§3&§,&§%&§&§&§&§ &§&§û%§ô%§í%§æ%§ß%§Ø%§Ñ%§Ê%§Ã%§¼%§µ%§®%§§%§ %§™%§’%§‹%§„%§}%§v%§o%§h%§a%§Z%§S%§L%§E%§>%§7%§0%§)%§"%§%§%§ %§%§ÿ$§ø$§ñ$§ê$§ã$§Ü$§Õ$§Î$§Ç$§À$§¹$§²$§«$§¤$§$§–$§$§ˆ$§$§z$§s$§l$§e$§^$§W$§P$§I$§B$§;$§4$§-$§&$§$§$§$§ $§$§ü#§õ#§î#§ç#§à#§Ù#§Ò#§Ë#§Ä#§½#§¶#§¯#§¨#§¡#§š#§“#§Œ#§…#§~#§w#§p#§i#§b#§[#§T#§M#§F#§?#§8#§1#§*#§##§#§#§#§#§#§ù"§ò"§ë"§ä"§Ý"§Ö"§Ï"§È"§Á"§º"§³"§¬"§¥"§ž"§—"§"§‰"§‚"§{"§t"§m"§f"§_"§X"§Q"§J"§C"§<"§5"§."§'"§ "§"§"§ "§"§ý!§ö!§ï!§è!§á!§Ú!§Ó!§Ì!§Å!§¾!§·!§°!§©!§¢!§›!§”!§!§†!§!§x!§q!§j!§c!§\!§U!§N!§G!§@!§9!§2!§+!§$!§!§!§!§!§!§ú §ó §ì §å §Þ §× §Ð §É § §» §´ §­ §¦ §Ÿ §˜ §‘ §Š §ƒ §| §u §n §g §` §Y §R §K §D §= §6 §/ §( §! § § § § §þ§÷§ð§é§â§Û§Ô§Í§Æ§¿§¸§±§ª§£§œ§•§Ž§‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û§ô§í§æ§ß§Ø§Ñ§Ê§Ã§¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü§õ§î§ç§à§Ù§Ò§Ë§Ä§½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù§ò§ë§ä§Ý§Ö§Ï§È§Á§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý§ö§ï§è§á§Ú§Ó§Ì§Å§¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú§ó§ì§å§Þ§×§Ð§É§Â§»§´§­§¦§Ÿ§˜§‘§Š§ƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ§÷§ð§é§â§Û§Ô§Í§Æ§¿§¸§±§ª§£§œ§•§Ž§‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û§ô§í§æ§ß§Ø§Ñ§Ê§Ã§¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü§õ§î§ç§à§Ù§Ò§Ë§Ä§½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù§ò§ë§ä§Ý§Ö§Ï§È§Á§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý§ö§ï§è§á§Ú§Ó§Ì§Å§¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú§ó§ì§å§Þ§×§Ð§É§Â§»§´§­§¦§Ÿ§˜§‘§Š§ƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ§÷§ð§é§â§Û§Ô§Í§Æ§¿§¸§±§ª§£§œ§•§Ž§‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û§ô§í§æ§ß§Ø§Ñ§Ê§Ã§¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü§õ§î§ç§à§Ù§Ò§Ë§Ä§½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù §ò §ë §ä §Ý §Ö §Ï §È §Á §º §³ §¬ §¥ §ž §— § §‰ §‚ §{ §t §m §f §_ §X §Q §J §C §< §5 §. §' § § § § § §ý §ö §ï §è §á §Ú §Ó §Ì §Å §¾ §· §° §© §¢ §› §” § §† § §x §q §j §c §\ §U §N §G §@ §9 §2 §+ §$ § § § § § §ú §ó §ì §å §Þ §× §Ð §É § §» §´ §­ §¦ §Ÿ §˜ §‘ §Š §ƒ §| §u §n §g §` §Y §R §K §D §= §6 §/ §( §! § § § § §þ §÷ §ð §é §â §Û §Ô §Í §Æ §¿ §¸ §± §ª §£ §œ §• §Ž §‡ §€ §y §r §k §d §] §V §O §H §A §: §3 §, §% § § § § § §û §ô §í §æ §ß §Ø §Ñ §Ê §à §¼ §µ §® §§ §  §™ §’ §‹ §„ §} §v §o §h §a §Z §S §L §E §> §7 §0 §) §" § § § § §ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü§õ§î§ç§à§Ù§Ò§Ë§Ä§½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù§ò§ë§ä§Ý§Ö§Ï§È§Á§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý§ö§ï§è§á§Ú§Ó§Ì§Å§¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú§ó§ì§å§Þ§×§Ð§É§Â§»§´§­§¦§Ÿ§˜§‘§Š§ƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ§÷§ð§é§â§Û§Ô§Í§Æ§¿§¸§±§ª§£§œ§•§Ž§‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û§ô§í§æ§ß§Ø§Ñ§Ê§Ã§¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ§ø§ñ§ê§ã§Ü§Õ§Î§Ç§À§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ùÿ¦òÿ¦ëÿ¦äÿ¦Ýÿ¦Öÿ¦Ïÿ¦Èÿ¦Áÿ¦ºÿ¦³ÿ¦¬ÿ¦¥ÿ¦žÿ¦—ÿ¦ÿ¦‰ÿ¦‚ÿ¦{ÿ¦tÿ¦mÿ¦fÿ¦_ÿ¦Xÿ¦Qÿ¦Jÿ¦Cÿ¦<ÿ¦5ÿ¦.ÿ¦'ÿ¦ ÿ¦ÿ¦ÿ¦ ÿ¦ÿ¦ýþ¦öþ¦ïþ¦èþ¦áþ¦Úþ¦Óþ¦Ìþ¦Åþ¦¾þ¦·þ¦°þ¦©þ¦¢þ¦›þ¦”þ¦þ¦†þ¦þ¦xþ¦qþ¦jþ¦cþ¦\þ¦Uþ¦Nþ¦Gþ¦@þ¦9þ¦2þ¦+þ¦$þ¦þ¦þ¦þ¦þ¦þ¦úý¦óý¦ìý¦åý¦Þý¦×ý¦Ðý¦Éý¦Âý¦»ý¦´ý¦­ý¦¦ý¦Ÿý¦˜ý¦‘ý¦Šý¦ƒý¦|ý¦uý¦ný¦gý¦`ý¦Yý¦Rý¦Ký¦Dý¦=ý¦6ý¦/ý¦(ý¦!ý¦ý¦ý¦ ý¦ý¦þü¦÷ü¦ðü¦éü¦âü¦Ûü¦Ôü¦Íü¦Æü¦¿ü¦¸ü¦±ü¦ªü¦£ü¦œü¦•ü¦Žü¦‡ü¦€ü¦yü¦rü¦kü¦dü¦]ü¦Vü¦Oü¦Hü¦Aü¦:ü¦3ü¦,ü¦%ü¦ü¦ü¦ü¦ ü¦ü¦ûû¦ôû¦íû¦æû¦ßû¦Øû¦Ñû¦Êû¦Ãû¦¼û¦µû¦®û¦§û¦ û¦™û¦’û¦‹û¦„û¦}û¦vû¦oû¦hû¦aû¦Zû¦Sû¦Lû¦Eû¦>û¦7û¦0û¦)û¦"û¦û¦û¦ û¦û¦ÿú¦øú¦ñú¦êú¦ãú¦Üú¦Õú¦Îú¦Çú¦Àú¦¹ú¦²ú¦«ú¦¤ú¦ú¦–ú¦ú¦ˆú¦ú¦zú¦sú¦lú¦eú¦^ú¦Wú¦Pú¦Iú¦Bú¦;ú¦4ú¦-ú¦&ú¦ú¦ú¦ú¦ ú¦ú¦üù¦õù¦îù¦çù¦àù¦Ùù¦Òù¦Ëù¦Äù¦½ù¦¶ù¦¯ù¦¨ù¦¡ù¦šù¦“ù¦Œù¦…ù¦~ù¦wù¦pù¦iù¦bù¦[ù¦Tù¦Mù¦Fù¦?ù¦8ù¦1ù¦*ù¦#ù¦ù¦ù¦ù¦ù¦ù¦ùø¦òø¦ëø¦äø¦Ýø¦Öø¦Ïø¦Èø¦Áø¦ºø¦³ø¦¬ø¦¥ø¦žø¦—ø¦ø¦‰ø¦‚ø¦{ø¦tø¦mø¦fø¦_ø¦Xø¦Qø¦Jø¦Cø¦<ø¦5ø¦.ø¦'ø¦ ø¦ø¦ø¦ ø¦ø¦ý÷¦ö÷¦ï÷¦è÷¦á÷¦Ú÷¦Ó÷¦Ì÷¦Å÷¦¾÷¦·÷¦°÷¦©÷¦¢÷¦›÷¦”÷¦÷¦†÷¦÷¦x÷¦q÷¦j÷¦c÷¦\÷¦U÷¦N÷¦G÷¦@÷¦9÷¦2÷¦+÷¦$÷¦÷¦÷¦÷¦÷¦÷¦úö¦óö¦ìö¦åö¦Þö¦×ö¦Ðö¦Éö¦Âö¦»ö¦´ö¦­ö¦¦ö¦Ÿö¦˜ö¦‘ö¦Šö¦ƒö¦|ö¦uö¦nö¦gö¦`ö¦Yö¦Rö¦Kö¦Dö¦=ö¦6ö¦/ö¦(ö¦!ö¦ö¦ö¦ ö¦ö¦þõ¦÷õ¦ðõ¦éõ¦âõ¦Ûõ¦Ôõ¦Íõ¦Æõ¦¿õ¦¸õ¦±õ¦ªõ¦£õ¦œõ¦•õ¦Žõ¦‡õ¦€õ¦yõ¦rõ¦kõ¦dõ¦]õ¦Võ¦Oõ¦Hõ¦Aõ¦:õ¦3õ¦,õ¦%õ¦õ¦õ¦õ¦ õ¦õ¦ûô¦ôô¦íô¦æô¦ßô¦Øô¦Ñô¦Êô¦Ãô¦¼ô¦µô¦®ô¦§ô¦ ô¦™ô¦’ô¦‹ô¦„ô¦}ô¦vô¦oô¦hô¦aô¦Zô¦Sô¦Lô¦Eô¦>ô¦7ô¦0ô¦)ô¦"ô¦ô¦ô¦ ô¦ô¦ÿó¦øó¦ñó¦êó¦ãó¦Üó¦Õó¦Îó¦Çó¦Àó¦¹ó¦²ó¦«ó¦¤ó¦ó¦–ó¦ó¦ˆó¦ó¦zó¦só¦ló¦eó¦^ó¦Wó¦Pó¦Ió¦Bó¦;ó¦4ó¦-ó¦&ó¦ó¦ó¦ó¦ ó¦ó¦üò¦õò¦îò¦çò¦àò¦Ùò¦Òò¦Ëò¦Äò¦½ò¦¶ò¦¯ò¦¨ò¦¡ò¦šò¦“ò¦Œò¦…ò¦~ò¦wò¦pò¦iò¦bò¦[ò¦Tò¦Mò¦Fò¦?ò¦8ò¦1ò¦*ò¦#ò¦ò¦ò¦ò¦ò¦ò¦ùñ¦òñ¦ëñ¦äñ¦Ýñ¦Öñ¦Ïñ¦Èñ¦Áñ¦ºñ¦³ñ¦¬ñ¦¥ñ¦žñ¦—ñ¦ñ¦‰ñ¦‚ñ¦{ñ¦tñ¦mñ¦fñ¦_ñ¦Xñ¦Qñ¦Jñ¦Cñ¦<ñ¦5ñ¦.ñ¦'ñ¦ ñ¦ñ¦ñ¦ ñ¦ñ¦ýð¦öð¦ïð¦èð¦áð¦Úð¦Óð¦Ìð¦Åð¦¾ð¦·ð¦°ð¦©ð¦¢ð¦›ð¦”ð¦ð¦†ð¦ð¦xð¦qð¦jð¦cð¦\ð¦Uð¦Nð¦Gð¦@ð¦9ð¦2ð¦+ð¦$ð¦ð¦ð¦ð¦ð¦ð¦úï¦óï¦ìï¦åï¦Þï¦×ï¦Ðï¦Éï¦Â僚領玲簾烈輦撚力旅ï¦|ï¦uï¦nï¦gï¦`ï¦Yï¦Rï¦Kï¦Dï¦=ï¦6ï¦/ï¦(ï¦!ï¦ï¦ï¦ ï¦ï¦þî¦÷î¦ðî¦éî¦âî¦Ûî¦Ôî¦Íî¦Æî¦¿î¦¸î¦±î¦ªî¦£î¦œî¦•î¦Žî¦‡î¦€î¦yî¦rî¦kî¦dî¦]î¦Vî¦Oî¦Hî¦Aî¦:î¦3î¦,î¦%î¦î¦î¦î¦ î¦î¦ûí¦ôí¦íí¦æí¦ßí¦Øí¦Ñí¦Êí¦Ãí¦¼í¦µí¦®í¦§í¦ í¦™í¦’í¦‹í¦„í¦}í¦ví¦oí¦hí¦aí¦Zí¦Sí¦Lí¦Eí¦>í¦7í¦0í¦)í¦"í¦í¦í¦ í¦í¦ÿì¦øì¦ñì¦êì¦ãì¦Üì¦Õì¦Îì¦Çì¦À즹즲즫즤ì¦ì¦–ì¦ì¦ˆì¦ì¦zì¦sì¦lì¦eì¦^ì¦Wì¦Pì¦Iì¦Bì¦;ì¦4ì¦-ì¦&ì¦ì¦ì¦ì¦ ì¦ì¦üë¦õë¦îë¦çë¦àë¦Ùë¦Òë¦Ëë¦Ä립릶릯릨릡릚릓릌릅ë¦~ë¦wë¦pë¦ië¦bë¦[ë¦Të¦Më¦Fë¦?ë¦8ë¦1ë¦*ë¦#ë¦ë¦ë¦ë¦ë¦ë¦ùê¦òê¦ëê¦äê¦Ýê¦Öê¦Ïê¦Èê¦Áꦺ꦳ꦬꦥꦞꦗê¦ê¦‰ê¦‚ê¦{ê¦tê¦mê¦fê¦_ê¦Xê¦Qê¦Jê¦Cê¦<ê¦5ê¦.ê¦'ê¦ ê¦ê¦ê¦ ê¦ê¦ýé¦öé¦ïé¦èé¦áé¦Úé¦Óé¦Ìé¦Å馾馷馰馩馢馛馔é¦é¦†é¦é¦xé¦qé¦jé¦cé¦\é¦Ué¦Né¦Gé¦@é¦9é¦2é¦+é¦$é¦é¦é¦é¦é¦é¦úè¦óè¦ìè¦åè¦Þè¦×è¦Ðè¦Éè¦Â覻覴覭覦覟覘覑覊覃è¦|è¦uè¦nè¦gè¦`è¦Yè¦Rè¦Kè¦Dè¦=è¦6è¦/è¦(è¦!è¦è¦è¦ è¦è¦þç¦÷ç¦ðç¦éç¦âç¦Ûç¦Ôç¦Íç¦Æç¦¿ç¦¸ç¦±ç¦ªç¦£ç¦œç¦•ç¦Žç¦‡ç¦€ç¦yç¦rç¦kç¦dç¦]ç¦Vç¦Oç¦Hç¦Aç¦:ç¦3ç¦,ç¦%ç¦ç¦ç¦ç¦ ç¦ç¦ûæ¦ôæ¦íæ¦ææ¦ßæ¦Øæ¦Ñæ¦Êæ¦Ã榼榵榮榧榠榙榒榋榄æ¦}æ¦væ¦oæ¦hæ¦aæ¦Zæ¦Sæ¦Læ¦Eæ¦>æ¦7æ¦0æ¦)æ¦"æ¦æ¦æ¦ æ¦æ¦ÿ妸å¦ñå¦êå¦ãå¦Üå¦Õå¦Îå¦Çå¦À妹妲妫妤å¦å¦–å¦å¦ˆå¦å¦zå¦så¦lå¦eå¦^å¦Wå¦På¦Iå¦Bå¦;å¦4å¦-å¦&å¦å¦å¦å¦ å¦å¦üä¦õä¦îä¦çä¦àä¦Ùä¦Òä¦Ëä¦Ä䦽䦶䦯䦨䦡䦚䦓䦌䦅ä¦~ä¦wä¦pä¦iä¦bä¦[ä¦Tä¦Mä¦Fä¦?ä¦8ä¦1ä¦*ä¦#ä¦ä¦ä¦ä¦ä¦ä¦ùã¦òã¦ëã¦äã¦Ýã¦Öã¦Ïã¦Èã¦Á㦺㦳㦬㦥㦞㦗ã¦ã¦‰ã¦‚ã¦{ã¦tã¦mã¦fã¦_ã¦Xã¦Qã¦Jã¦Cã¦<ã¦5ã¦.ã¦'㦠ã¦ã¦ã¦ ã¦ã¦ýâ¦öâ¦ïâ¦èâ¦áâ¦Úâ¦Óâ¦Ìâ¦Å⦾⦷⦰⦩⦢⦛⦔â¦â¦†â¦â¦xâ¦qâ¦jâ¦câ¦\â¦Uâ¦Nâ¦Gâ¦@â¦9â¦2â¦+â¦$â¦â¦â¦â¦â¦â¦úá¦óá¦ìá¦åá¦Þá¦×á¦Ðá¦Éá¦Âᦻᦴ᦭ᦦᦟᦘᦑᦊᦃá¦|á¦uá¦ná¦gá¦`á¦Yá¦Rá¦Ká¦Dá¦=á¦6á¦/á¦(á¦!á¦á¦á¦ á¦á¦þà¦÷à¦ðà¦éà¦âà¦Ûà¦Ôà¦Íà¦Æà¦¿à¦¸à¦±à¦ªà¦£à¦œà¦•à¦Žà¦‡à¦€à¦yà¦rà¦kà¦dà¦]à¦Và¦Oà¦Hà¦Aà¦:à¦3à¦,à¦%à¦à¦à¦à¦ à¦à¦ûߦôߦíߦæß¦ßߦØß¦ÑߦÊߦÃߦ¼ß¦µß¦®ß¦§ß¦ ß¦™ß¦’ߦ‹ß¦„ߦ}ߦvߦoߦhߦaߦZߦSߦLߦEߦ>ߦ7ߦ0ߦ)ߦ"ߦߦߦ ߦߦÿÞ¦øÞ¦ñÞ¦êÞ¦ãÞ¦ÜÞ¦ÕÞ¦ÎÞ¦ÇÞ¦ÀÞ¦¹Þ¦²Þ¦«Þ¦¤Þ¦Þ¦–Þ¦Þ¦ˆÞ¦Þ¦zÞ¦sÞ¦lÞ¦eÞ¦^Þ¦WÞ¦PÞ¦IÞ¦BÞ¦;Þ¦4Þ¦-Þ¦&Þ¦Þ¦Þ¦Þ¦ Þ¦Þ¦üݦõݦîݦçݦàݦÙݦÒݦËݦÄݦ½Ý¦¶Ý¦¯Ý¦¨Ý¦¡Ý¦šÝ¦“ݦŒÝ¦…ݦ~ݦwݦpݦiݦbݦ[ݦTݦMݦFݦ?ݦ8ݦ1ݦ*ݦ#ݦݦݦݦݦݦùܦòܦëܦäܦÝܦÖܦÏܦÈܦÁܦºÜ¦³Ü¦¬Ü¦¥Ü¦žÜ¦—ܦܦ‰Ü¦‚ܦ{ܦtܦmܦfܦ_ܦXܦQܦJܦCܦ<ܦ5ܦ.ܦ'ܦ ܦܦܦ ܦܦýÛ¦öÛ¦ïÛ¦èÛ¦áÛ¦ÚÛ¦ÓÛ¦ÌÛ¦ÅÛ¦¾Û¦·Û¦°Û¦©Û¦¢Û¦›Û¦”Û¦Û¦†Û¦Û¦xÛ¦qÛ¦jÛ¦cÛ¦\Û¦UÛ¦NÛ¦GÛ¦@Û¦9Û¦2Û¦+Û¦$Û¦Û¦Û¦Û¦Û¦Û¦úÚ¦óÚ¦ìÚ¦åÚ¦ÞÚ¦×Ú¦ÐÚ¦ÉÚ¦ÂÚ¦»Ú¦´Ú¦­Ú¦¦Ú¦ŸÚ¦˜Ú¦‘Ú¦ŠÚ¦ƒÚ¦|Ú¦uÚ¦nÚ¦gÚ¦`Ú¦YÚ¦RÚ¦KÚ¦DÚ¦=Ú¦6Ú¦/Ú¦(Ú¦!Ú¦Ú¦Ú¦ Ú¦Ú¦þÙ¦÷Ù¦ðÙ¦éÙ¦âÙ¦ÛÙ¦ÔÙ¦ÍÙ¦ÆÙ¦¿Ù¦¸Ù¦±Ù¦ªÙ¦£Ù¦œÙ¦•Ù¦ŽÙ¦‡Ù¦€Ù¦yÙ¦rÙ¦kÙ¦dÙ¦]Ù¦VÙ¦OÙ¦HÙ¦AÙ¦:Ù¦3Ù¦,Ù¦%٦٦٦٦ ٦٦ûئôئíØ¦æØ¦ߨ¦ØØ¦ÑØ¦ÊØ¦Ãئ¼Ø¦µØ¦®Ø¦§Ø¦ Ø¦™Ø¦’ئ‹Ø¦„ئ}ئvئoئhئaئZئSئLئEئ>ئ7ئ0ئ)ئ"ئئئ ئئÿצø×¦ñצêצãצÜצÕצÎצÇצÀצ¹×¦²×¦«×¦¤×¦צ–צצˆ×¦צzצsצlצeצ^צWצPצIצBצ;צ4צ-צ&צצצצ צצüÖ¦õÖ¦îÖ¦çÖ¦àÖ¦ÙÖ¦ÒÖ¦ËÖ¦ÄÖ¦½Ö¦¶Ö¦¯Ö¦¨Ö¦¡Ö¦šÖ¦“Ö¦ŒÖ¦…Ö¦~Ö¦wÖ¦pÖ¦iÖ¦bÖ¦[Ö¦TÖ¦MÖ¦FÖ¦?Ö¦8Ö¦1Ö¦*Ö¦#Ö¦Ö¦Ö¦Ö¦Ö¦Ö¦ùÕ¦òÕ¦ëÕ¦äÕ¦ÝÕ¦ÖÕ¦ÏÕ¦ÈÕ¦ÁÕ¦ºÕ¦³Õ¦¬Õ¦¥Õ¦žÕ¦—Õ¦Õ¦‰Õ¦‚Õ¦{Õ¦tÕ¦mÕ¦fÕ¦_Õ¦XÕ¦QÕ¦JÕ¦CÕ¦<Õ¦5Õ¦.Õ¦'Õ¦ Õ¦Õ¦Õ¦ Õ¦Õ¦ýÔ¦öÔ¦ïÔ¦èÔ¦áÔ¦ÚÔ¦ÓÔ¦ÌÔ¦ÅÔ¦¾Ô¦·Ô¦°Ô¦©Ô¦¢Ô¦›Ô¦”Ô¦Ô¦†Ô¦Ô¦xÔ¦qÔ¦jÔ¦cÔ¦\Ô¦UÔ¦NÔ¦GÔ¦@Ô¦9Ô¦2Ô¦+Ô¦$Ô¦Ô¦Ô¦Ô¦Ô¦Ô¦úÓ¦óÓ¦ìÓ¦åÓ¦ÞÓ¦×Ó¦ÐÓ¦ÉÓ¦ÂÓ¦»Ó¦´Ó¦­Ó¦¦Ó¦ŸÓ¦˜Ó¦‘Ó¦ŠÓ¦ƒÓ¦|Ó¦uÓ¦nÓ¦gÓ¦`Ó¦YÓ¦RÓ¦KÓ¦DÓ¦=Ó¦6Ó¦/Ó¦(Ó¦!Ó¦Ó¦Ó¦ Ó¦Ó¦þÒ¦÷Ò¦ðÒ¦éÒ¦âÒ¦ÛÒ¦ÔÒ¦ÍÒ¦ÆÒ¦¿Ò¦¸Ò¦±Ò¦ªÒ¦£Ò¦œÒ¦•Ò¦ŽÒ¦‡Ò¦€Ò¦yÒ¦rÒ¦kÒ¦dÒ¦]Ò¦VÒ¦OÒ¦HÒ¦AÒ¦:Ò¦3Ò¦,Ò¦%Ò¦Ò¦Ò¦Ò¦ Ò¦Ò¦ûѦôѦíѦæÑ¦ßѦØÑ¦ÑѦÊѦÃѦ¼Ñ¦µÑ¦®Ñ¦§Ñ¦ Ñ¦™Ñ¦’Ѧ‹Ñ¦„Ѧ}ѦvѦoѦhѦaѦZѦSѦLѦEѦ>Ѧ7Ѧ0Ѧ)Ѧ"ѦѦѦ ѦѦÿЦøÐ¦ñЦêЦãЦÜЦÕЦÎЦÇЦÀЦ¹Ð¦²Ð¦«Ð¦¤Ð¦Ц–ЦЦˆÐ¦ЦzЦsЦlЦeЦ^ЦWЦPЦIЦBЦ;Ц4Ц-Ц&ЦЦЦЦ ЦЦüϦõϦîϦçϦàϦÙϦÒϦËϦÄϦ½Ï¦¶Ï¦¯Ï¦¨Ï¦¡Ï¦šÏ¦“ϦŒÏ¦…Ϧ~ϦwϦpϦiϦbϦ[ϦTϦMϦFϦ?Ϧ8Ϧ1Ϧ*Ϧ#ϦϦϦϦϦϦùΦòΦëΦäΦÝΦÖΦÏΦÈΦÁΦºÎ¦³Î¦¬Î¦¥Î¦žÎ¦—ΦΦ‰Î¦‚Φ{ΦtΦmΦfΦ_ΦXΦQΦJΦCΦ<Φ5Φ.Φ'Φ ΦΦΦ ΦΦýͦöͦïͦèͦáͦÚͦÓͦÌͦÅͦ¾Í¦·Í¦°Í¦©Í¦¢Í¦›Í¦”ͦͦ†Í¦ͦxͦqͦjͦcͦ\ͦUͦNͦGͦ@ͦ9ͦ2ͦ+ͦ$ͦͦͦͦͦͦú̦ó̦ì̦å̦Þ̦×̦Ð̦É̦Â̦»Ì¦´Ì¦­Ì¦¦Ì¦ŸÌ¦˜Ì¦‘̦ŠÌ¦ƒÌ¦|̦u̦n̦g̦`̦Y̦R̦K̦D̦=̦6̦/̦(̦!̦̦̦ ̦̦þ˦÷˦ð˦é˦â˦Û˦Ô˦Í˦ÆË¦¿Ë¦¸Ë¦±Ë¦ªË¦£Ë¦œË¦•˦ŽË¦‡Ë¦€Ë¦y˦r˦k˦d˦]˦V˦O˦H˦A˦:˦3˦,˦%˦˦˦˦ ˦˦ûʦôʦíʦæÊ¦ßʦØÊ¦ÑʦÊʦÃʦ¼Ê¦µÊ¦®Ê¦§Ê¦ Ê¦™Ê¦’ʦ‹Ê¦„ʦ}ʦvʦoʦhʦaʦZʦSʦLʦEʦ>ʦ7ʦ0ʦ)ʦ"ʦʦʦ ʦʦÿɦøÉ¦ñɦêɦãɦÜɦÕɦÎɦÇɦÀɦ¹É¦²É¦«É¦¤É¦ɦ–ɦɦˆÉ¦ɦzɦsɦlɦeɦ^ɦWɦPɦIɦBɦ;ɦ4ɦ-ɦ&ɦɦɦɦ ɦɦüȦõȦîȦçȦàȦÙȦÒȦËȦÄȦ½È¦¶È¦¯È¦¨È¦¡È¦šÈ¦“ȦŒÈ¦…Ȧ~ȦwȦpȦiȦbȦ[ȦTȦMȦFȦ?Ȧ8Ȧ1Ȧ*Ȧ#ȦȦȦȦȦȦùǦòǦëǦäǦÝǦÖǦÏǦÈǦÁǦºÇ¦³Ç¦¬Ç¦¥Ç¦žÇ¦—ǦǦ‰Ç¦‚Ǧ{ǦtǦmǦfǦ_ǦXǦQǦJǦCǦ<Ǧ5Ǧ.Ǧ'Ǧ ǦǦǦ ǦǦýƦöƦïÆ¦èÆ¦áÆ¦ÚÆ¦ÓÆ¦ÌÆ¦ÅƦ¾Æ¦·Æ¦°Æ¦©Æ¦¢Æ¦›Æ¦”ƦƦ†Æ¦ƦxƦqƦjƦcƦ\ƦUƦNƦGƦ@Ʀ9Ʀ2Ʀ+Ʀ$ƦƦƦƦƦƦúŦóŦìŦåŦÞŦ×ŦÐŦÉŦÂŦ»Å¦´Å¦­Å¦¦Å¦ŸÅ¦˜Å¦‘ŦŠÅ¦ƒÅ¦|ŦuŦnŦgŦ`ŦYŦRŦKŦDŦ=Ŧ6Ŧ/Ŧ(Ŧ!ŦŦŦ ŦŦþĦ÷ĦðĦéĦâĦÛĦÔĦÍĦÆÄ¦¿Ä¦¸Ä¦±Ä¦ªÄ¦£Ä¦œÄ¦•ĦŽÄ¦‡Ä¦€Ä¦yĦrĦkĦdĦ]ĦVĦOĦHĦAĦ:Ħ3Ħ,Ħ%ĦĦĦĦ ĦĦûæôæíææÃ¦ßæØÃ¦ÑæÊæÃæ¼Ã¦µÃ¦®Ã¦§Ã¦ Ã¦™Ã¦’æ‹Ã¦„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿ¦øÂ¦ñ¦ê¦ã¦ܦÕ¦ΦǦÀ¦¹Â¦²Â¦«Â¦¤Â¦¦–¦¦ˆÂ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦üÁ¦õÁ¦îÁ¦çÁ¦àÁ¦ÙÁ¦ÒÁ¦ËÁ¦ÄÁ¦½Á¦¶Á¦¯Á¦¨Á¦¡Á¦šÁ¦“Á¦ŒÁ¦…Á¦~Á¦wÁ¦pÁ¦iÁ¦bÁ¦[Á¦TÁ¦MÁ¦FÁ¦?Á¦8Á¦1Á¦*Á¦#Á¦Á¦Á¦Á¦Á¦Á¦ùÀ¦òÀ¦ëÀ¦äÀ¦ÝÀ¦ÖÀ¦ÏÀ¦ÈÀ¦ÁÀ¦ºÀ¦³À¦¬À¦¥À¦žÀ¦—À¦À¦‰À¦‚À¦{À¦tÀ¦mÀ¦fÀ¦_À¦XÀ¦QÀ¦JÀ¦CÀ¦<À¦5À¦.À¦'À¦ À¦À¦À¦ À¦À¦ý¿¦ö¿¦₩迦ῦÚ¿¦Ó¿¦Ì¿¦Å¿¦¾¿¦·¿¦°¿¦©¿¦¢¿¦›¿¦”¿¦¿¦†¿¦¿¦x¿¦q¿¦j¿¦c¿¦\¿¦U¿¦N¿¦G¿¦@¿¦9¿¦2¿¦+¿¦$¿¦¿¦¿¦¿¦¿¦¿¦ú¾¦ó¾¦쾦徦Þ¾¦×¾¦о¦ɾ¦¾¦»¾¦´¾¦­¾¦¦¾¦Ÿ¾¦˜¾¦‘¾¦о¦ƒ¾¦|¾¦u¾¦n¾¦g¾¦`¾¦Y¾¦R¾¦K¾¦D¾¦=¾¦6¾¦/¾¦(¾¦!¾¦¾¦¾¦ ¾¦¾¦þ½¦÷½¦ð½¦齦⽦Û½¦Ô½¦ͽ¦ƽ¦¿½¦¸½¦±½¦ª½¦£½¦œ½¦•½¦޽¦‡½¦€½¦y½¦r½¦k½¦d½¦]½¦V½¦O½¦H½¦A½¦:½¦3½¦,½¦%½¦½¦½¦½¦ ½¦½¦û¼¦ô¼¦í¼¦漦ß¼¦ؼ¦Ѽ¦ʼ¦ü¦¼¼¦µ¼¦®¼¦§¼¦ ¼¦™¼¦’¼¦‹¼¦„¼¦}¼¦v¼¦o¼¦h¼¦a¼¦Z¼¦S¼¦L¼¦E¼¦>¼¦7¼¦0¼¦)¼¦"¼¦¼¦¼¦ ¼¦¼¦ÿ»¦ø»¦ñ»¦껦㻦Ü»¦Õ»¦λ¦Ç»¦À»¦¹»¦²»¦«»¦¤»¦»¦–»¦»¦ˆ»¦»¦z»¦s»¦l»¦e»¦^»¦W»¦P»¦I»¦B»¦;»¦4»¦-»¦&»¦»¦»¦»¦ »¦»¦üº¦õº¦约຦Ùº¦Òº¦˺¦ĺ¦½º¦¶º¦¯º¦¨º¦¡º¦šº¦“º¦Œº¦…º¦~º¦wº¦pº¦iº¦bº¦[º¦Tº¦Mº¦Fº¦?º¦8º¦1º¦*º¦#º¦º¦º¦º¦º¦º¦ù¹¦ò¹¦빦书ݹ¦Ö¹¦Ϲ¦ȹ¦Á¹¦º¹¦³¹¦¬¹¦¥¹¦ž¹¦—¹¦¹¦‰¹¦‚¹¦{¹¦t¹¦m¹¦f¹¦_¹¦X¹¦Q¹¦J¹¦C¹¦<¹¦5¹¦.¹¦'¹¦ ¹¦¹¦¹¦ ¹¦¹¦ý¸¦ö¸¦︦踦ḦÚ¸¦Ó¸¦̸¦Ÿ¦¾¸¦·¸¦°¸¦©¸¦¢¸¦›¸¦”¸¦¸¦†¸¦¸¦x¸¦q¸¦j¸¦c¸¦\¸¦U¸¦N¸¦G¸¦@¸¦9¸¦2¸¦+¸¦$¸¦¸¦¸¦¸¦¸¦¸¦ú·¦ó·¦ì·¦å·¦Þ·¦×·¦з¦É·¦·¦»·¦´·¦­·¦¦·¦Ÿ·¦˜·¦‘·¦Š·¦ƒ·¦|·¦u·¦n·¦g·¦`·¦Y·¦R·¦K·¦D·¦=·¦6·¦/·¦(·¦!·¦·¦·¦ ·¦·¦þ¶¦÷¶¦ð¶¦鶦ⶦÛ¶¦Ô¶¦Ͷ¦ƶ¦¿¶¦¸¶¦±¶¦ª¶¦£¶¦œ¶¦•¶¦޶¦‡¶¦€¶¦y¶¦r¶¦k¶¦d¶¦]¶¦V¶¦O¶¦H¶¦A¶¦:¶¦3¶¦,¶¦%¶¦¶¦¶¦¶¦ ¶¦¶¦ûµ¦ôµ¦íµ¦浦ßµ¦ص¦ѵ¦ʵ¦õ¦¼µ¦µµ¦®µ¦§µ¦ µ¦™µ¦’µ¦‹µ¦„µ¦}µ¦vµ¦oµ¦hµ¦aµ¦Zµ¦Sµ¦Lµ¦Eµ¦>µ¦7µ¦0µ¦)µ¦"µ¦µ¦µ¦ µ¦µ¦ÿ´¦ø´¦ñ´¦ê´¦ã´¦Ü´¦Õ´¦δ¦Ç´¦À´¦¹´¦²´¦«´¦¤´¦´¦–´¦´¦ˆ´¦´¦z´¦s´¦l´¦e´¦^´¦W´¦P´¦I´¦B´¦;´¦4´¦-´¦&´¦´¦´¦´¦ ´¦´¦ü³¦õ³¦糦೦Ù³¦Ò³¦˳¦ij¦½³¦¶³¦¯³¦¨³¦¡³¦š³¦“³¦Œ³¦…³¦~³¦w³¦p³¦i³¦b³¦[³¦T³¦M³¦F³¦?³¦8³¦1³¦*³¦#³¦³¦³¦³¦³¦³¦ù²¦ò²¦벦䲦ݲ¦Ö²¦ϲ¦Ȳ¦Á²¦º²¦³²¦¬²¦¥²¦ž²¦—²¦²¦‰²¦‚²¦{²¦t²¦m²¦f²¦_²¦X²¦Q²¦J²¦C²¦<²¦5²¦.²¦'²¦ ²¦²¦²¦ ²¦²¦ý±¦ö±¦ﱦ豦ᱦÚ±¦Ó±¦̱¦ű¦¾±¦·±¦°±¦©±¦¢±¦›±¦”±¦±¦†±¦±¦x±¦q±¦j±¦c±¦\±¦U±¦N±¦G±¦@±¦9±¦2±¦+±¦$±¦±¦±¦±¦±¦±¦ú°¦ó°¦ì°¦å°¦Þ°¦×°¦а¦ɰ¦°¦»°¦´°¦­°¦¦°¦Ÿ°¦˜°¦‘°¦а¦ƒ°¦|°¦u°¦n°¦g°¦`°¦Y°¦R°¦K°¦D°¦=°¦6°¦/°¦(°¦!°¦°¦°¦ °¦°¦þ¯¦÷¯¦ð¯¦鯦⯦Û¯¦Ô¯¦ͯ¦Ư¦¿¯¦¸¯¦±¯¦ª¯¦£¯¦œ¯¦•¯¦ޝ¦‡¯¦€¯¦y¯¦r¯¦k¯¦d¯¦]¯¦V¯¦O¯¦H¯¦A¯¦:¯¦3¯¦,¯¦%¯¦¯¦¯¦¯¦ ¯¦¯¦û®¦ô®¦í®¦殦ß®¦Ø®¦Ñ®¦Ê®¦î¦¼®¦µ®¦®®¦§®¦ ®¦™®¦’®¦‹®¦„®¦}®¦v®¦o®¦h®¦a®¦Z®¦S®¦L®¦E®¦>®¦7®¦0®¦)®¦"®¦®¦®¦ ®¦®¦ÿ­¦ø­¦ñ­¦ê­¦ã­¦Ü­¦Õ­¦έ¦Ç­¦À­¦¹­¦²­¦«­¦¤­¦­¦–­¦­¦ˆ­¦­¦z­¦s­¦l­¦e­¦^­¦W­¦P­¦I­¦B­¦;­¦4­¦-­¦&­¦­¦­¦­¦ ­¦­¦ü¬¦õ¬¦符ଦÙ¬¦Ò¬¦ˬ¦Ĭ¦½¬¦¶¬¦¯¬¦¨¬¦¡¬¦š¬¦“¬¦Œ¬¦…¬¦~¬¦w¬¦p¬¦i¬¦b¬¦[¬¦T¬¦M¬¦F¬¦?¬¦8¬¦1¬¦*¬¦#¬¦¬¦¬¦¬¦¬¦¬¦ù«¦ò«¦뫦䫦Ý«¦Ö«¦Ï«¦È«¦Á«¦º«¦³«¦¬«¦¥«¦ž«¦—«¦«¦‰«¦‚«¦{«¦t«¦m«¦f«¦_«¦X«¦Q«¦J«¦C«¦<«¦5«¦.«¦'«¦ «¦«¦«¦ «¦«¦ýª¦öª¦益誦᪦Úª¦Óª¦̪¦Ū¦¾ª¦·ª¦°ª¦©ª¦¢ª¦›ª¦”ª¦ª¦†ª¦ª¦xª¦qª¦jª¦cª¦\ª¦Uª¦Nª¦Gª¦@ª¦9ª¦2ª¦+ª¦$ª¦ª¦ª¦ª¦ª¦ª¦ú©¦ó©¦쩦婦Þ©¦ש¦Щ¦É©¦©¦»©¦´©¦­©¦¦©¦Ÿ©¦˜©¦‘©¦Š©¦ƒ©¦|©¦u©¦n©¦g©¦`©¦Y©¦R©¦K©¦D©¦=©¦6©¦/©¦(©¦!©¦©¦©¦ ©¦©¦þ¨¦÷¨¦ð¨¦騦⨦Û¨¦Ô¨¦ͨ¦ƨ¦¿¨¦¸¨¦±¨¦ª¨¦£¨¦œ¨¦•¨¦ލ¦‡¨¦€¨¦y¨¦r¨¦k¨¦d¨¦]¨¦V¨¦O¨¦H¨¦A¨¦:¨¦3¨¦,¨¦%¨¦¨¦¨¦¨¦ ¨¦¨¦û§¦ô§¦í§¦槦ß§¦ا¦ѧ¦ʧ¦ç¦¼§¦µ§¦®§¦§§¦ §¦™§¦’§¦‹§¦„§¦}§¦v§¦o§¦h§¦a§¦Z§¦S§¦L§¦E§¦>§¦7§¦0§¦)§¦"§¦§¦§¦ §¦§¦ÿ¦¦ø¦¦ñ¦¦ꦦ㦦ܦ¦Õ¦¦Φ¦Ǧ¦À¦¦¹¦¦²¦¦«¦¦¤¦¦¦¦–¦¦¦¦ˆ¦¦¦¦z¦¦s¦¦l¦¦e¦¦^¦¦W¦¦P¦¦I¦¦B¦¦;¦¦4¦¦-¦¦&¦¦¦¦¦¦¦¦ ¦¦¦¦ü¥¦õ¥¦祦०Ù¥¦Ò¥¦Ë¥¦Ä¥¦½¥¦¶¥¦¯¥¦¨¥¦¡¥¦š¥¦“¥¦Œ¥¦…¥¦~¥¦w¥¦p¥¦i¥¦b¥¦[¥¦T¥¦M¥¦F¥¦?¥¦8¥¦1¥¦*¥¦#¥¦¥¦¥¦¥¦¥¦¥¦ù¤¦ò¤¦뤦䤦ݤ¦Ö¤¦Ϥ¦Ȥ¦Á¤¦º¤¦³¤¦¬¤¦¥¤¦ž¤¦—¤¦¤¦‰¤¦‚¤¦{¤¦t¤¦m¤¦f¤¦_¤¦X¤¦Q¤¦J¤¦C¤¦<¤¦5¤¦.¤¦'¤¦ ¤¦¤¦¤¦ ¤¦¤¦ý£¦ö£¦裦ᣦÚ£¦Ó£¦Ì£¦Å£¦¾£¦·£¦°£¦©£¦¢£¦›£¦”£¦£¦†£¦£¦x£¦q£¦j£¦c£¦\£¦U£¦N£¦G£¦@£¦9£¦2£¦+£¦$£¦£¦£¦£¦£¦£¦ú¢¦ó¢¦좦墦Þ¢¦×¢¦Т¦É¢¦¢¦»¢¦´¢¦­¢¦¦¢¦Ÿ¢¦˜¢¦‘¢¦Š¢¦ƒ¢¦|¢¦u¢¦n¢¦g¢¦`¢¦Y¢¦R¢¦K¢¦D¢¦=¢¦6¢¦/¢¦(¢¦!¢¦¢¦¢¦ ¢¦¢¦þ¡¦÷¡¦ð¡¦顦⡦Û¡¦Ô¡¦Í¡¦Æ¡¦¿¡¦¸¡¦±¡¦ª¡¦£¡¦œ¡¦•¡¦Ž¡¦‡¡¦€¡¦y¡¦r¡¦k¡¦d¡¦]¡¦V¡¦O¡¦H¡¦A¡¦:¡¦3¡¦,¡¦%¡¦¡¦¡¦¡¦ ¡¦¡¦û ¦ô ¦í ¦æ ¦ß ¦Ø ¦Ñ ¦Ê ¦à¦¼ ¦µ ¦® ¦§ ¦  ¦™ ¦’ ¦‹ ¦„ ¦} ¦v ¦o ¦h ¦a ¦Z ¦S ¦L ¦E ¦> ¦7 ¦0 ¦) ¦" ¦ ¦ ¦  ¦ ¦ÿŸ¦øŸ¦ñŸ¦꟦㟦ÜŸ¦ÕŸ¦Ο¦ÇŸ¦ÀŸ¦¹Ÿ¦²Ÿ¦«Ÿ¦¤Ÿ¦Ÿ¦–Ÿ¦Ÿ¦ˆŸ¦Ÿ¦zŸ¦sŸ¦lŸ¦eŸ¦^Ÿ¦WŸ¦PŸ¦IŸ¦BŸ¦;Ÿ¦4Ÿ¦-Ÿ¦&Ÿ¦Ÿ¦Ÿ¦Ÿ¦ Ÿ¦Ÿ¦üž¦õž¦瞦àž¦Ùž¦Òž¦Ëž¦Äž¦½ž¦¶ž¦¯ž¦¨ž¦¡ž¦šž¦“ž¦Œž¦…ž¦~ž¦wž¦pž¦iž¦bž¦[ž¦Tž¦Mž¦Fž¦?ž¦8ž¦1ž¦*ž¦#ž¦ž¦ž¦ž¦ž¦ž¦ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ýœ¦öœ¦蜦ᜦÚœ¦Óœ¦Ìœ¦Åœ¦¾œ¦·œ¦°œ¦©œ¦¢œ¦›œ¦”œ¦œ¦†œ¦œ¦xœ¦qœ¦jœ¦cœ¦\œ¦Uœ¦Nœ¦Gœ¦@œ¦9œ¦2œ¦+œ¦$œ¦œ¦œ¦œ¦œ¦œ¦ú›¦ó›¦웦囦Þ›¦×›¦Л¦É›¦›¦»›¦´›¦­›¦¦›¦Ÿ›¦˜›¦‘›¦Š›¦ƒ›¦|›¦u›¦n›¦g›¦`›¦Y›¦R›¦K›¦D›¦=›¦6›¦/›¦(›¦!›¦›¦›¦ ›¦›¦þš¦÷š¦ðš¦隦⚦Ûš¦Ôš¦Íš¦Æš¦¿š¦¸š¦±š¦ªš¦£š¦œš¦•š¦Žš¦‡š¦€š¦yš¦rš¦kš¦dš¦]š¦Vš¦Oš¦Hš¦Aš¦:š¦3š¦,š¦%š¦š¦š¦š¦ š¦š¦û™¦ô™¦홦晦ß™¦Ø™¦Ñ™¦Ê™¦Ù¦¼™¦µ™¦®™¦§™¦ ™¦™™¦’™¦‹™¦„™¦}™¦v™¦o™¦h™¦a™¦Z™¦S™¦L™¦E™¦>™¦7™¦0™¦)™¦"™¦™¦™¦ ™¦™¦ÿ˜¦ø˜¦ñ˜¦꘦㘦ܘ¦Õ˜¦Θ¦ǘ¦À˜¦¹˜¦²˜¦«˜¦¤˜¦˜¦–˜¦˜¦ˆ˜¦˜¦z˜¦s˜¦l˜¦e˜¦^˜¦W˜¦P˜¦I˜¦B˜¦;˜¦4˜¦-˜¦&˜¦˜¦˜¦˜¦ ˜¦˜¦ü—¦õ—¦î—¦ç—¦à—¦Ù—¦Ò—¦Ë—¦Ä—¦½—¦¶—¦¯—¦¨—¦¡—¦š—¦“—¦Œ—¦…—¦~—¦w—¦p—¦i—¦b—¦[—¦T—¦M—¦F—¦?—¦8—¦1—¦*—¦#—¦—¦—¦—¦—¦—¦ù–¦ò–¦ë–¦ä–¦Ý–¦Ö–¦Ï–¦È–¦Á–¦º–¦³–¦¬–¦¥–¦ž–¦—–¦–¦‰–¦‚–¦{–¦t–¦m–¦f–¦_–¦X–¦Q–¦J–¦C–¦<–¦5–¦.–¦'–¦ –¦–¦–¦ –¦–¦ý•¦ö•¦蕦ᕦÚ•¦Ó•¦Ì•¦Å•¦¾•¦·•¦°•¦©•¦¢•¦›•¦”•¦•¦†•¦•¦x•¦q•¦j•¦c•¦\•¦U•¦N•¦G•¦@•¦9•¦2•¦+•¦$•¦•¦•¦•¦•¦•¦ú”¦ó”¦씦唦Þ”¦×”¦Д¦É”¦”¦»”¦´”¦­”¦¦”¦Ÿ”¦˜”¦‘”¦Š”¦ƒ”¦|”¦u”¦n”¦g”¦`”¦Y”¦R”¦K”¦D”¦=”¦6”¦/”¦(”¦!”¦”¦”¦ ”¦”¦þ“¦÷“¦ð“¦铦ⓦÛ“¦Ô“¦Í“¦Æ“¦¿“¦¸“¦±“¦ª“¦£“¦œ“¦•“¦Ž“¦‡“¦€“¦y“¦r“¦k“¦d“¦]“¦V“¦O“¦H“¦A“¦:“¦3“¦,“¦%“¦“¦“¦“¦ “¦“¦û’¦ô’¦í’¦æ’¦ß’¦Ø’¦Ñ’¦Ê’¦Ã’¦¼’¦µ’¦®’¦§’¦ ’¦™’¦’’¦‹’¦„’¦}’¦v’¦o’¦h’¦a’¦Z’¦S’¦L’¦E’¦>’¦7’¦0’¦)’¦"’¦’¦’¦ ’¦’¦ÿ‘¦ø‘¦ñ‘¦ꑦ㑦Ü‘¦Õ‘¦Α¦Ç‘¦À‘¦¹‘¦²‘¦«‘¦¤‘¦‘¦–‘¦‘¦ˆ‘¦‘¦z‘¦s‘¦l‘¦e‘¦^‘¦W‘¦P‘¦I‘¦B‘¦;‘¦4‘¦-‘¦&‘¦‘¦‘¦‘¦ ‘¦‘¦ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ýަöަ莦ᎦÚŽ¦ÓŽ¦ÌŽ¦Åަ¾Ž¦·Ž¦°Ž¦©Ž¦¢Ž¦›Ž¦”ަަ†Ž¦ަxަqަjަcަ\ަUަNަGަ@ަ9ަ2ަ+ަ$ަަަަަަú¦ó¦ì¦å¦Þ¦צЦɦ¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Цƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þŒ¦÷Œ¦ðŒ¦錦⌦ÛŒ¦ÔŒ¦ÍŒ¦ÆŒ¦¿Œ¦¸Œ¦±Œ¦ªŒ¦£Œ¦œŒ¦•Œ¦ŽŒ¦‡Œ¦€Œ¦yŒ¦rŒ¦kŒ¦dŒ¦]Œ¦VŒ¦OŒ¦HŒ¦AŒ¦:Œ¦3Œ¦,Œ¦%Œ¦Œ¦Œ¦Œ¦ Œ¦Œ¦û‹¦ô‹¦틦拦ß‹¦Ø‹¦Ñ‹¦Ê‹¦˦¼‹¦µ‹¦®‹¦§‹¦ ‹¦™‹¦’‹¦‹‹¦„‹¦}‹¦v‹¦o‹¦h‹¦a‹¦Z‹¦S‹¦L‹¦E‹¦>‹¦7‹¦0‹¦)‹¦"‹¦‹¦‹¦ ‹¦‹¦ÿЦøŠ¦ñЦꊦ㊦ÜŠ¦ÕЦΊ¦ÇЦÀЦ¹Š¦²Š¦«Š¦¤Š¦Ц–ЦЦˆŠ¦ЦzЦsЦlЦeЦ^ЦWЦPЦIЦBЦ;Ц4Ц-Ц&ЦЦЦЦ ЦЦü‰¦õ‰¦牦à‰¦Ù‰¦Ò‰¦ˉ¦ĉ¦½‰¦¶‰¦¯‰¦¨‰¦¡‰¦š‰¦“‰¦Œ‰¦…‰¦~‰¦w‰¦p‰¦i‰¦b‰¦[‰¦T‰¦M‰¦F‰¦?‰¦8‰¦1‰¦*‰¦#‰¦‰¦‰¦‰¦‰¦‰¦ùˆ¦òˆ¦눦䈦݈¦Öˆ¦ψ¦Ȉ¦Áˆ¦ºˆ¦³ˆ¦¬ˆ¦¥ˆ¦žˆ¦—ˆ¦ˆ¦‰ˆ¦‚ˆ¦{ˆ¦tˆ¦mˆ¦fˆ¦_ˆ¦Xˆ¦Qˆ¦Jˆ¦Cˆ¦<ˆ¦5ˆ¦.ˆ¦'ˆ¦ ˆ¦ˆ¦ˆ¦ ˆ¦ˆ¦ý‡¦ö‡¦臦ᇦÚ‡¦Ó‡¦̇¦Ҧ¾‡¦·‡¦°‡¦©‡¦¢‡¦›‡¦”‡¦‡¦†‡¦‡¦x‡¦q‡¦j‡¦c‡¦\‡¦U‡¦N‡¦G‡¦@‡¦9‡¦2‡¦+‡¦$‡¦‡¦‡¦‡¦‡¦‡¦ú†¦ó†¦솦冦Þ†¦׆¦І¦Ɇ¦†¦»†¦´†¦­†¦¦†¦Ÿ†¦˜†¦‘†¦І¦ƒ†¦|†¦u†¦n†¦g†¦`†¦Y†¦R†¦K†¦D†¦=†¦6†¦/†¦(†¦!†¦†¦†¦ †¦†¦þ…¦÷…¦ð…¦é…¦â…¦Û…¦Ô…¦Í…¦Æ…¦¿…¦¸…¦±…¦ª…¦£…¦œ…¦•…¦Ž…¦‡…¦€…¦y…¦r…¦k…¦d…¦]…¦V…¦O…¦H…¦A…¦:…¦3…¦,…¦%…¦…¦…¦…¦ …¦…¦û„¦ô„¦턦愦ß„¦Ø„¦Ñ„¦Ê„¦Ħ¼„¦µ„¦®„¦§„¦ „¦™„¦’„¦‹„¦„„¦}„¦v„¦o„¦h„¦a„¦Z„¦S„¦L„¦E„¦>„¦7„¦0„¦)„¦"„¦„¦„¦ „¦„¦ÿƒ¦øƒ¦ñƒ¦ꃦユ܃¦Õƒ¦΃¦ǃ¦Àƒ¦¹ƒ¦²ƒ¦«ƒ¦¤ƒ¦ƒ¦–ƒ¦ƒ¦ˆƒ¦ƒ¦zƒ¦sƒ¦lƒ¦eƒ¦^ƒ¦Wƒ¦Pƒ¦Iƒ¦Bƒ¦;ƒ¦4ƒ¦-ƒ¦&ƒ¦ƒ¦ƒ¦ƒ¦ ƒ¦ƒ¦ü‚¦õ‚¦炦à‚¦Ù‚¦Ò‚¦Ë‚¦Ä‚¦½‚¦¶‚¦¯‚¦¨‚¦¡‚¦š‚¦“‚¦Œ‚¦…‚¦~‚¦w‚¦p‚¦i‚¦b‚¦[‚¦T‚¦M‚¦F‚¦?‚¦8‚¦1‚¦*‚¦#‚¦‚¦‚¦‚¦‚¦‚¦ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý€¦ö€¦耦ဦÚ€¦Ó€¦Ì€¦Å€¦¾€¦·€¦°€¦©€¦¢€¦›€¦”€¦€¦†€¦€¦x€¦q€¦j€¦c€¦\€¦U€¦N€¦G€¦@€¦9€¦2€¦+€¦$€¦€¦€¦€¦€¦€¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ~¦÷~¦ð~¦é~¦â~¦Û~¦Ô~¦Í~¦Æ~¦¿~¦¸~¦±~¦ª~¦£~¦œ~¦•~¦Ž~¦‡~¦€~¦y~¦r~¦k~¦d~¦]~¦V~¦O~¦H~¦A~¦:~¦3~¦,~¦%~¦~¦~¦~¦ ~¦~¦û}¦ô}¦í}¦æ}¦ß}¦Ø}¦Ñ}¦Ê}¦Ã}¦¼}¦µ}¦®}¦§}¦ }¦™}¦’}¦‹}¦„}¦}}¦v}¦o}¦h}¦a}¦Z}¦S}¦L}¦E}¦>}¦7}¦0}¦)}¦"}¦}¦}¦ }¦}¦ÿ|¦ø|¦ñ|¦ê|¦ã|¦Ü|¦Õ|¦Î|¦Ç|¦À|¦¹|¦²|¦«|¦¤|¦|¦–|¦|¦ˆ|¦|¦z|¦s|¦l|¦e|¦^|¦W|¦P|¦I|¦B|¦;|¦4|¦-|¦&|¦|¦|¦|¦ |¦|¦ü{¦õ{¦î{¦ç{¦à{¦Ù{¦Ò{¦Ë{¦Ä{¦½{¦¶{¦¯{¦¨{¦¡{¦š{¦“{¦Œ{¦…{¦~{¦w{¦p{¦i{¦b{¦[{¦T{¦M{¦F{¦?{¦8{¦1{¦*{¦#{¦{¦{¦{¦{¦{¦ùz¦òz¦ëz¦äz¦Ýz¦Öz¦Ïz¦Èz¦Áz¦ºz¦³z¦¬z¦¥z¦žz¦—z¦z¦‰z¦‚z¦{z¦tz¦mz¦fz¦_z¦Xz¦Qz¦Jz¦Cz¦v¦7v¦0v¦)v¦"v¦v¦v¦ v¦v¦ÿu¦øu¦ñu¦êu¦ãu¦Üu¦Õu¦Îu¦Çu¦Àu¦¹u¦²u¦«u¦¤u¦u¦–u¦u¦ˆu¦u¦zu¦su¦lu¦eu¦^u¦Wu¦Pu¦Iu¦Bu¦;u¦4u¦-u¦&u¦u¦u¦u¦ u¦u¦üt¦õt¦ît¦çt¦àt¦Ùt¦Òt¦Ët¦Ät¦½t¦¶t¦¯t¦¨t¦¡t¦št¦“t¦Œt¦…t¦~t¦wt¦pt¦it¦bt¦[t¦Tt¦Mt¦Ft¦?t¦8t¦1t¦*t¦#t¦t¦t¦t¦t¦t¦ùs¦òs¦ës¦äs¦Ýs¦Ös¦Ïs¦Ès¦Ás¦ºs¦³s¦¬s¦¥s¦žs¦—s¦s¦‰s¦‚s¦{s¦ts¦ms¦fs¦_s¦Xs¦Qs¦Js¦Cs¦o¦7o¦0o¦)o¦"o¦o¦o¦ o¦o¦ÿn¦øn¦ñn¦ên¦ãn¦Ün¦Õn¦În¦Çn¦Àn¦¹n¦²n¦«n¦¤n¦n¦–n¦n¦ˆn¦n¦zn¦sn¦ln¦en¦^n¦Wn¦Pn¦In¦Bn¦;n¦4n¦-n¦&n¦n¦n¦n¦ n¦n¦üm¦õm¦îm¦çm¦àm¦Ùm¦Òm¦Ëm¦Äm¦½m¦¶m¦¯m¦¨m¦¡m¦šm¦“m¦Œm¦…m¦~m¦wm¦pm¦im¦bm¦[m¦Tm¦Mm¦Fm¦?m¦8m¦1m¦*m¦#m¦m¦m¦m¦m¦m¦ùl¦òl¦ël¦äl¦Ýl¦Öl¦Ïl¦Èl¦Ál¦ºl¦³l¦¬l¦¥l¦žl¦—l¦l¦‰l¦‚l¦{l¦tl¦ml¦fl¦_l¦Xl¦Ql¦Jl¦Cl¦h¦7h¦0h¦)h¦"h¦h¦h¦ h¦h¦ÿg¦øg¦ñg¦êg¦ãg¦Üg¦Õg¦Îg¦Çg¦Àg¦¹g¦²g¦«g¦¤g¦g¦–g¦g¦ˆg¦g¦zg¦sg¦lg¦eg¦^g¦Wg¦Pg¦Ig¦Bg¦;g¦4g¦-g¦&g¦g¦g¦g¦ g¦g¦üf¦õf¦îf¦çf¦àf¦Ùf¦Òf¦Ëf¦Äf¦½f¦¶f¦¯f¦¨f¦¡f¦šf¦“f¦Œf¦…f¦~f¦wf¦pf¦if¦bf¦[f¦Tf¦Mf¦Ff¦?f¦8f¦1f¦*f¦#f¦f¦f¦f¦f¦f¦ùe¦òe¦ëe¦äe¦Ýe¦Öe¦Ïe¦Èe¦Áe¦ºe¦³e¦¬e¦¥e¦že¦—e¦e¦‰e¦‚e¦{e¦te¦me¦fe¦_e¦Xe¦Qe¦Je¦Ce¦a¦7a¦0a¦)a¦"a¦a¦a¦ a¦a¦ÿ`¦ø`¦ñ`¦ê`¦ã`¦Ü`¦Õ`¦Î`¦Ç`¦À`¦¹`¦²`¦«`¦¤`¦`¦–`¦`¦ˆ`¦`¦z`¦s`¦l`¦e`¦^`¦W`¦P`¦I`¦B`¦;`¦4`¦-`¦&`¦`¦`¦`¦ `¦`¦ü_¦õ_¦î_¦ç_¦à_¦Ù_¦Ò_¦Ë_¦Ä_¦½_¦¶_¦¯_¦¨_¦¡_¦š_¦“_¦Œ_¦…_¦~_¦w_¦p_¦i_¦b_¦[_¦T_¦M_¦F_¦?_¦8_¦1_¦*_¦#_¦_¦_¦_¦_¦_¦ù^¦ò^¦ë^¦ä^¦Ý^¦Ö^¦Ï^¦È^¦Á^¦º^¦³^¦¬^¦¥^¦ž^¦—^¦^¦‰^¦‚^¦{^¦t^¦m^¦f^¦_^¦X^¦Q^¦J^¦C^¦<^¦5^¦.^¦'^¦ ^¦^¦^¦ ^¦^¦ý]¦ö]¦ï]¦è]¦á]¦Ú]¦Ó]¦Ì]¦Å]¦¾]¦·]¦°]¦©]¦¢]¦›]¦”]¦]¦†]¦]¦x]¦q]¦j]¦c]¦\]¦U]¦N]¦G]¦@]¦9]¦2]¦+]¦$]¦]¦]¦]¦]¦]¦ú\¦ó\¦ì\¦å\¦Þ\¦×\¦Ð\¦É\¦Â\¦»\¦´\¦­\¦¦\¦Ÿ\¦˜\¦‘\¦Š\¦ƒ\¦|\¦u\¦n\¦g\¦`\¦Y\¦R\¦K\¦D\¦=\¦6\¦/\¦(\¦!\¦\¦\¦ \¦\¦þ[¦÷[¦ð[¦é[¦â[¦Û[¦Ô[¦Í[¦Æ[¦¿[¦¸[¦±[¦ª[¦£[¦œ[¦•[¦Ž[¦‡[¦€[¦y[¦r[¦k[¦d[¦][¦V[¦O[¦H[¦A[¦:[¦3[¦,[¦%[¦[¦[¦[¦ [¦[¦ûZ¦ôZ¦íZ¦æZ¦ßZ¦ØZ¦ÑZ¦ÊZ¦ÃZ¦¼Z¦µZ¦®Z¦§Z¦ Z¦™Z¦’Z¦‹Z¦„Z¦}Z¦vZ¦oZ¦hZ¦aZ¦ZZ¦SZ¦LZ¦EZ¦>Z¦7Z¦0Z¦)Z¦"Z¦Z¦Z¦ Z¦Z¦ÿY¦øY¦ñY¦êY¦ãY¦ÜY¦ÕY¦ÎY¦ÇY¦ÀY¦¹Y¦²Y¦«Y¦¤Y¦Y¦–Y¦Y¦ˆY¦Y¦zY¦sY¦lY¦eY¦^Y¦WY¦PY¦IY¦BY¦;Y¦4Y¦-Y¦&Y¦Y¦Y¦Y¦ Y¦Y¦üX¦õX¦îX¦çX¦àX¦ÙX¦ÒX¦ËX¦ÄX¦½X¦¶X¦¯X¦¨X¦¡X¦šX¦“X¦ŒX¦…X¦~X¦wX¦pX¦iX¦bX¦[X¦TX¦MX¦FX¦?X¦8X¦1X¦*X¦#X¦X¦X¦X¦X¦X¦ùW¦òW¦ëW¦äW¦ÝW¦ÖW¦ÏW¦ÈW¦ÁW¦ºW¦³W¦¬W¦¥W¦žW¦—W¦W¦‰W¦‚W¦{W¦tW¦mW¦fW¦_W¦XW¦QW¦JW¦CW¦S¦7S¦0S¦)S¦"S¦S¦S¦ S¦S¦ÿR¦øR¦ñR¦êR¦ãR¦ÜR¦ÕR¦ÎR¦ÇR¦ÀR¦¹R¦²R¦«R¦¤R¦R¦–R¦R¦ˆR¦R¦zR¦sR¦lR¦eR¦^R¦WR¦PR¦IR¦BR¦;R¦4R¦-R¦&R¦R¦R¦R¦ R¦R¦üQ¦õQ¦îQ¦çQ¦àQ¦ÙQ¦ÒQ¦ËQ¦ÄQ¦½Q¦¶Q¦¯Q¦¨Q¦¡Q¦šQ¦“Q¦ŒQ¦…Q¦~Q¦wQ¦pQ¦iQ¦bQ¦[Q¦TQ¦MQ¦FQ¦?Q¦8Q¦1Q¦*Q¦#Q¦Q¦Q¦Q¦Q¦Q¦ùP¦òP¦ëP¦äP¦ÝP¦ÖP¦ÏP¦ÈP¦ÁP¦ºP¦³P¦¬P¦¥P¦žP¦—P¦P¦‰P¦‚P¦{P¦tP¦mP¦fP¦_P¦XP¦QP¦JP¦CP¦L¦7L¦0L¦)L¦"L¦L¦L¦ L¦L¦ÿK¦øK¦ñK¦êK¦ãK¦ÜK¦ÕK¦ÎK¦ÇK¦ÀK¦¹K¦²K¦«K¦¤K¦K¦–K¦K¦ˆK¦K¦zK¦sK¦lK¦eK¦^K¦WK¦PK¦IK¦BK¦;K¦4K¦-K¦&K¦K¦K¦K¦ K¦K¦üJ¦õJ¦îJ¦çJ¦àJ¦ÙJ¦ÒJ¦ËJ¦ÄJ¦½J¦¶J¦¯J¦¨J¦¡J¦šJ¦“J¦ŒJ¦…J¦~J¦wJ¦pJ¦iJ¦bJ¦[J¦TJ¦MJ¦FJ¦?J¦8J¦1J¦*J¦#J¦J¦J¦J¦J¦J¦ùI¦òI¦ëI¦äI¦ÝI¦ÖI¦ÏI¦ÈI¦ÁI¦ºI¦³I¦¬I¦¥I¦žI¦—I¦I¦‰I¦‚I¦{I¦tI¦mI¦fI¦_I¦XI¦QI¦JI¦CI¦E¦7E¦0E¦)E¦"E¦E¦E¦ E¦E¦ÿD¦øD¦ñD¦êD¦ãD¦ÜD¦ÕD¦ÎD¦ÇD¦ÀD¦¹D¦²D¦«D¦¤D¦D¦–D¦D¦ˆD¦D¦zD¦sD¦lD¦eD¦^D¦WD¦PD¦ID¦BD¦;D¦4D¦-D¦&D¦D¦D¦D¦ D¦D¦üC¦õC¦îC¦çC¦àC¦ÙC¦ÒC¦ËC¦ÄC¦½C¦¶C¦¯C¦¨C¦¡C¦šC¦“C¦ŒC¦…C¦~C¦wC¦pC¦iC¦bC¦[C¦TC¦MC¦FC¦?C¦8C¦1C¦*C¦#C¦C¦C¦C¦C¦C¦ùB¦òB¦ëB¦äB¦ÝB¦ÖB¦ÏB¦ÈB¦ÁB¦ºB¦³B¦¬B¦¥B¦žB¦—B¦B¦‰B¦‚B¦{B¦tB¦mB¦fB¦_B¦XB¦QB¦JB¦CB¦¦ô>¦í>¦æ>¦ß>¦Ø>¦Ñ>¦Ê>¦Ã>¦¼>¦µ>¦®>¦§>¦ >¦™>¦’>¦‹>¦„>¦}>¦v>¦o>¦h>¦a>¦Z>¦S>¦L>¦E>¦>>¦7>¦0>¦)>¦">¦>¦>¦ >¦>¦ÿ=¦ø=¦ñ=¦ê=¦ã=¦Ü=¦Õ=¦Î=¦Ç=¦À=¦¹=¦²=¦«=¦¤=¦=¦–=¦=¦ˆ=¦=¦z=¦s=¦l=¦e=¦^=¦W=¦P=¦I=¦B=¦;=¦4=¦-=¦&=¦=¦=¦=¦ =¦=¦ü<¦õ<¦î<¦ç<¦à<¦Ù<¦Ò<¦Ë<¦Ä<¦½<¦¶<¦¯<¦¨<¦¡<¦š<¦“<¦Œ<¦…<¦~<¦w<¦p<¦i<¦b<¦[<¦T<¦M<¦F<¦?<¦8<¦1<¦*<¦#<¦<¦<¦<¦<¦<¦ù;¦ò;¦ë;¦ä;¦Ý;¦Ö;¦Ï;¦È;¦Á;¦º;¦³;¦¬;¦¥;¦ž;¦—;¦;¦‰;¦‚;¦{;¦t;¦m;¦f;¦_;¦X;¦Q;¦J;¦C;¦<;¦5;¦.;¦';¦ ;¦;¦;¦ ;¦;¦ý:¦ö:¦ï:¦è:¦á:¦Ú:¦Ó:¦Ì:¦Å:¦¾:¦·:¦°:¦©:¦¢:¦›:¦”:¦:¦†:¦:¦x:¦q:¦j:¦c:¦\:¦U:¦N:¦G:¦@:¦9:¦2:¦+:¦$:¦:¦:¦:¦:¦:¦ú9¦ó9¦ì9¦å9¦Þ9¦×9¦Ð9¦É9¦Â9¦»9¦´9¦­9¦¦9¦Ÿ9¦˜9¦‘9¦Š9¦ƒ9¦|9¦u9¦n9¦g9¦`9¦Y9¦R9¦K9¦D9¦=9¦69¦/9¦(9¦!9¦9¦9¦ 9¦9¦þ8¦÷8¦ð8¦é8¦â8¦Û8¦Ô8¦Í8¦Æ8¦¿8¦¸8¦±8¦ª8¦£8¦œ8¦•8¦Ž8¦‡8¦€8¦y8¦r8¦k8¦d8¦]8¦V8¦O8¦H8¦A8¦:8¦38¦,8¦%8¦8¦8¦8¦ 8¦8¦û7¦ô7¦í7¦æ7¦ß7¦Ø7¦Ñ7¦Ê7¦Ã7¦¼7¦µ7¦®7¦§7¦ 7¦™7¦’7¦‹7¦„7¦}7¦v7¦o7¦h7¦a7¦Z7¦S7¦L7¦E7¦>7¦77¦07¦)7¦"7¦7¦7¦ 7¦7¦ÿ6¦ø6¦ñ6¦ê6¦ã6¦Ü6¦Õ6¦Î6¦Ç6¦À6¦¹6¦²6¦«6¦¤6¦6¦–6¦6¦ˆ6¦6¦z6¦s6¦l6¦e6¦^6¦W6¦P6¦I6¦B6¦;6¦46¦-6¦&6¦6¦6¦6¦ 6¦6¦ü5¦õ5¦î5¦ç5¦à5¦Ù5¦Ò5¦Ë5¦Ä5¦½5¦¶5¦¯5¦¨5¦¡5¦š5¦“5¦Œ5¦…5¦~5¦w5¦p5¦i5¦b5¦[5¦T5¦M5¦F5¦?5¦85¦15¦*5¦#5¦5¦5¦5¦5¦5¦ù4¦ò4¦ë4¦ä4¦Ý4¦Ö4¦Ï4¦È4¦Á4¦º4¦³4¦¬4¦¥4¦ž4¦—4¦4¦‰4¦‚4¦{4¦t4¦m4¦f4¦_4¦X4¦Q4¦J4¦C4¦<4¦54¦.4¦'4¦ 4¦4¦4¦ 4¦4¦ý3¦ö3¦ï3¦è3¦á3¦Ú3¦Ó3¦Ì3¦Å3¦¾3¦·3¦°3¦©3¦¢3¦›3¦”3¦3¦†3¦3¦x3¦q3¦j3¦c3¦\3¦U3¦N3¦G3¦@3¦93¦23¦+3¦$3¦3¦3¦3¦3¦3¦ú2¦ó2¦ì2¦å2¦Þ2¦×2¦Ð2¦É2¦Â2¦»2¦´2¦­2¦¦2¦Ÿ2¦˜2¦‘2¦Š2¦ƒ2¦|2¦u2¦n2¦g2¦`2¦Y2¦R2¦K2¦D2¦=2¦62¦/2¦(2¦!2¦2¦2¦ 2¦2¦þ1¦÷1¦ð1¦é1¦â1¦Û1¦Ô1¦Í1¦Æ1¦¿1¦¸1¦±1¦ª1¦£1¦œ1¦•1¦Ž1¦‡1¦€1¦y1¦r1¦k1¦d1¦]1¦V1¦O1¦H1¦A1¦:1¦31¦,1¦%1¦1¦1¦1¦ 1¦1¦û0¦ô0¦í0¦æ0¦ß0¦Ø0¦Ñ0¦Ê0¦Ã0¦¼0¦µ0¦®0¦§0¦ 0¦™0¦’0¦‹0¦„0¦}0¦v0¦o0¦h0¦a0¦Z0¦S0¦L0¦E0¦>0¦70¦00¦)0¦"0¦0¦0¦ 0¦0¦ÿ/¦ø/¦ñ/¦ê/¦ã/¦Ü/¦Õ/¦Î/¦Ç/¦À/¦¹/¦²/¦«/¦¤/¦/¦–/¦/¦ˆ/¦/¦z/¦s/¦l/¦e/¦^/¦W/¦P/¦I/¦B/¦;/¦4/¦-/¦&/¦/¦/¦/¦ /¦/¦ü.¦õ.¦î.¦ç.¦à.¦Ù.¦Ò.¦Ë.¦Ä.¦½.¦¶.¦¯.¦¨.¦¡.¦š.¦“.¦Œ.¦….¦~.¦w.¦p.¦i.¦b.¦[.¦T.¦M.¦F.¦?.¦8.¦1.¦*.¦#.¦.¦.¦.¦.¦.¦ù-¦ò-¦ë-¦ä-¦Ý-¦Ö-¦Ï-¦È-¦Á-¦º-¦³-¦¬-¦¥-¦ž-¦—-¦-¦‰-¦‚-¦{-¦t-¦m-¦f-¦_-¦X-¦Q-¦J-¦C-¦<-¦5-¦.-¦'-¦ -¦-¦-¦ -¦-¦ý,¦ö,¦ï,¦è,¦á,¦Ú,¦Ó,¦Ì,¦Å,¦¾,¦·,¦°,¦©,¦¢,¦›,¦”,¦,¦†,¦,¦x,¦q,¦j,¦c,¦\,¦U,¦N,¦G,¦@,¦9,¦2,¦+,¦$,¦,¦,¦,¦,¦,¦ú+¦ó+¦ì+¦å+¦Þ+¦×+¦Ð+¦É+¦Â+¦»+¦´+¦­+¦¦+¦Ÿ+¦˜+¦‘+¦Š+¦ƒ+¦|+¦u+¦n+¦g+¦`+¦Y+¦R+¦K+¦D+¦=+¦6+¦/+¦(+¦!+¦+¦+¦ +¦+¦þ*¦÷*¦ð*¦é*¦â*¦Û*¦Ô*¦Í*¦Æ*¦¿*¦¸*¦±*¦ª*¦£*¦œ*¦•*¦Ž*¦‡*¦€*¦y*¦r*¦k*¦d*¦]*¦V*¦O*¦H*¦A*¦:*¦3*¦,*¦%*¦*¦*¦*¦ *¦*¦û)¦ô)¦í)¦æ)¦ß)¦Ø)¦Ñ)¦Ê)¦Ã)¦¼)¦µ)¦®)¦§)¦ )¦™)¦’)¦‹)¦„)¦})¦v)¦o)¦h)¦a)¦Z)¦S)¦L)¦E)¦>)¦7)¦0)¦))¦")¦)¦)¦ )¦)¦ÿ(¦ø(¦ñ(¦ê(¦ã(¦Ü(¦Õ(¦Î(¦Ç(¦À(¦¹(¦²(¦«(¦¤(¦(¦–(¦(¦ˆ(¦(¦z(¦s(¦l(¦e(¦^(¦W(¦P(¦I(¦B(¦;(¦4(¦-(¦&(¦(¦(¦(¦ (¦(¦ü'¦õ'¦î'¦ç'¦à'¦Ù'¦Ò'¦Ë'¦Ä'¦½'¦¶'¦¯'¦¨'¦¡'¦š'¦“'¦Œ'¦…'¦~'¦w'¦p'¦i'¦b'¦['¦T'¦M'¦F'¦?'¦8'¦1'¦*'¦#'¦'¦'¦'¦'¦'¦ù&¦ò&¦ë&¦ä&¦Ý&¦Ö&¦Ï&¦È&¦Á&¦º&¦³&¦¬&¦¥&¦ž&¦—&¦&¦‰&¦‚&¦{&¦t&¦m&¦f&¦_&¦X&¦Q&¦J&¦C&¦<&¦5&¦.&¦'&¦ &¦&¦&¦ &¦&¦ý%¦ö%¦ï%¦è%¦á%¦Ú%¦Ó%¦Ì%¦Å%¦¾%¦·%¦°%¦©%¦¢%¦›%¦”%¦%¦†%¦%¦x%¦q%¦j%¦c%¦\%¦U%¦N%¦G%¦@%¦9%¦2%¦+%¦$%¦%¦%¦%¦%¦%¦ú$¦ó$¦ì$¦å$¦Þ$¦×$¦Ð$¦É$¦Â$¦»$¦´$¦­$¦¦$¦Ÿ$¦˜$¦‘$¦Š$¦ƒ$¦|$¦u$¦n$¦g$¦`$¦Y$¦R$¦K$¦D$¦=$¦6$¦/$¦($¦!$¦$¦$¦ $¦$¦þ#¦÷#¦ð#¦é#¦â#¦Û#¦Ô#¦Í#¦Æ#¦¿#¦¸#¦±#¦ª#¦£#¦œ#¦•#¦Ž#¦‡#¦€#¦y#¦r#¦k#¦d#¦]#¦V#¦O#¦H#¦A#¦:#¦3#¦,#¦%#¦#¦#¦#¦ #¦#¦û"¦ô"¦í"¦æ"¦ß"¦Ø"¦Ñ"¦Ê"¦Ã"¦¼"¦µ"¦®"¦§"¦ "¦™"¦’"¦‹"¦„"¦}"¦v"¦o"¦h"¦a"¦Z"¦S"¦L"¦E"¦>"¦7"¦0"¦)"¦""¦"¦"¦ "¦"¦ÿ!¦ø!¦ñ!¦ê!¦ã!¦Ü!¦Õ!¦Î!¦Ç!¦À!¦¹!¦²!¦«!¦¤!¦!¦–!¦!¦ˆ!¦!¦z!¦s!¦l!¦e!¦^!¦W!¦P!¦I!¦B!¦;!¦4!¦-!¦&!¦!¦!¦!¦ !¦!¦ü ¦õ ¦î ¦ç ¦à ¦Ù ¦Ò ¦Ë ¦Ä ¦½ ¦¶ ¦¯ ¦¨ ¦¡ ¦š ¦“ ¦Œ ¦… ¦~ ¦w ¦p ¦i ¦b ¦[ ¦T ¦M ¦F ¦? ¦8 ¦1 ¦* ¦# ¦ ¦ ¦ ¦ ¦ ¦ù¦ò¦ë¦ä¦Ý¦Ö¦Ï¦È¦Á¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¦ö¦ï¦è¦á¦Ú¦Ó¦Ì¦Å¦¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¦÷¦ð¦é¦â¦Û¦Ô¦Í¦Æ¦¿¦¸¦±¦ª¦£¦œ¦•¦Ž¦‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¦ô¦í¦æ¦ß¦Ø¦Ñ¦Ê¦Ã¦¼¦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¦ø¦ñ¦ê¦ã¦Ü¦Õ¦Î¦Ç¦À¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¦õ¦î¦ç¦à¦Ù¦Ò¦Ë¦Ä¦½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¦ò¦ë¦ä¦Ý¦Ö¦Ï¦È¦Á¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¦ö¦ï¦è¦á¦Ú¦Ó¦Ì¦Å¦¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¦÷¦ð¦é¦â¦Û¦Ô¦Í¦Æ¦¿¦¸¦±¦ª¦£¦œ¦•¦Ž¦‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¦ô¦í¦æ¦ß¦Ø¦Ñ¦Ê¦Ã¦¼¦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¦ø¦ñ¦ê¦ã¦Ü¦Õ¦Î¦Ç¦À¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¦õ¦î¦ç¦à¦Ù¦Ò¦Ë¦Ä¦½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¦ò¦ë¦ä¦Ý¦Ö¦Ï¦È¦Á¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¦ö¦ï¦è¦á¦Ú¦Ó¦Ì¦Å¦¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¦÷¦ð¦é¦â¦Û¦Ô¦Í¦Æ¦¿¦¸¦±¦ª¦£¦œ¦•¦Ž¦‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û ¦ô ¦í ¦æ ¦ß ¦Ø ¦Ñ ¦Ê ¦à ¦¼ ¦µ ¦® ¦§ ¦  ¦™ ¦’ ¦‹ ¦„ ¦} ¦v ¦o ¦h ¦a ¦Z ¦S ¦L ¦E ¦> ¦7 ¦0 ¦) ¦" ¦ ¦ ¦ ¦ ¦ÿ ¦ø ¦ñ ¦ê ¦ã ¦Ü ¦Õ ¦Î ¦Ç ¦À ¦¹ ¦² ¦« ¦¤ ¦ ¦– ¦ ¦ˆ ¦ ¦z ¦s ¦l ¦e ¦^ ¦W ¦P ¦I ¦B ¦; ¦4 ¦- ¦& ¦ ¦ ¦ ¦ ¦ ¦ü ¦õ ¦î ¦ç ¦à ¦Ù ¦Ò ¦Ë ¦Ä ¦½ ¦¶ ¦¯ ¦¨ ¦¡ ¦š ¦“ ¦Œ ¦… ¦~ ¦w ¦p ¦i ¦b ¦[ ¦T ¦M ¦F ¦? ¦8 ¦1 ¦* ¦# ¦ ¦ ¦ ¦ ¦ ¦ù ¦ò ¦ë ¦ä ¦Ý ¦Ö ¦Ï ¦È ¦Á ¦º ¦³ ¦¬ ¦¥ ¦ž ¦— ¦ ¦‰ ¦‚ ¦{ ¦t ¦m ¦f ¦_ ¦X ¦Q ¦J ¦C ¦< ¦5 ¦. ¦' ¦ ¦ ¦ ¦ ¦ ¦ý ¦ö ¦ï ¦è ¦á ¦Ú ¦Ó ¦Ì ¦Å ¦¾ ¦· ¦° ¦© ¦¢ ¦› ¦” ¦ ¦† ¦ ¦x ¦q ¦j ¦c ¦\ ¦U ¦N ¦G ¦@ ¦9 ¦2 ¦+ ¦$ ¦ ¦ ¦ ¦ ¦ ¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¦÷¦ð¦é¦â¦Û¦Ô¦Í¦Æ¦¿¦¸¦±¦ª¦£¦œ¦•¦Ž¦‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¦ô¦í¦æ¦ß¦Ø¦Ñ¦Ê¦Ã¦¼¦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¦ø¦ñ¦ê¦ã¦Ü¦Õ¦Î¦Ç¦À¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¦õ¦î¦ç¦à¦Ù¦Ò¦Ë¦Ä¦½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¦ò¦ë¦ä¦Ý¦Ö¦Ï¦È¦Á¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¦ö¦ï¦è¦á¦Ú¦Ó¦Ì¦Å¦¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¦ó¦ì¦å¦Þ¦×¦Ð¦É¦Â¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Š¦ƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¦÷¦ð¦é¦â¦Û¦Ô¦ͦƦ¿¦¸¦±¦ª¦£¦œ¦•¦ަ‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦ûÿ¥ôÿ¥íÿ¥æÿ¥ßÿ¥Øÿ¥Ñÿ¥Êÿ¥Ãÿ¥¼ÿ¥µÿ¥®ÿ¥§ÿ¥ ÿ¥™ÿ¥’ÿ¥‹ÿ¥„ÿ¥}ÿ¥vÿ¥oÿ¥hÿ¥aÿ¥Zÿ¥Sÿ¥Lÿ¥Eÿ¥>ÿ¥7ÿ¥0ÿ¥)ÿ¥"ÿ¥ÿ¥ÿ¥ ÿ¥ÿ¥ÿþ¥øþ¥ñþ¥êþ¥ãþ¥Üþ¥Õþ¥Îþ¥Çþ¥Àþ¥¹þ¥²þ¥«þ¥¤þ¥þ¥–þ¥þ¥ˆþ¥þ¥zþ¥sþ¥lþ¥eþ¥^þ¥Wþ¥Pþ¥Iþ¥Bþ¥;þ¥4þ¥-þ¥&þ¥þ¥þ¥þ¥ þ¥þ¥üý¥õý¥îý¥çý¥àý¥Ùý¥Òý¥Ëý¥Äý¥½ý¥¶ý¥¯ý¥¨ý¥¡ý¥šý¥“ý¥Œý¥…ý¥~ý¥wý¥pý¥iý¥bý¥[ý¥Tý¥Mý¥Fý¥?ý¥8ý¥1ý¥*ý¥#ý¥ý¥ý¥ý¥ý¥ý¥ùü¥òü¥ëü¥äü¥Ýü¥Öü¥Ïü¥Èü¥Áü¥ºü¥³ü¥¬ü¥¥ü¥žü¥—ü¥ü¥‰ü¥‚ü¥{ü¥tü¥mü¥fü¥_ü¥Xü¥Qü¥Jü¥Cü¥<ü¥5ü¥.ü¥'ü¥ ü¥ü¥ü¥ ü¥ü¥ýû¥öû¥ïû¥èû¥áû¥Úû¥Óû¥Ìû¥Åû¥¾û¥·û¥°û¥©û¥¢û¥›û¥”û¥û¥†û¥û¥xû¥qû¥jû¥cû¥\û¥Uû¥Nû¥Gû¥@û¥9û¥2û¥+û¥$û¥û¥û¥û¥û¥û¥úú¥óú¥ìú¥åú¥Þú¥×ú¥Ðú¥Éú¥Âú¥»ú¥´ú¥­ú¥¦ú¥Ÿú¥˜ú¥‘ú¥Šú¥ƒú¥|ú¥uú¥nú¥gú¥`ú¥Yú¥Rú¥Kú¥Dú¥=ú¥6ú¥/ú¥(ú¥!ú¥ú¥ú¥ ú¥ú¥þù¥÷ù¥ðù¥éù¥âù¥Ûù¥Ôù¥Íù¥Æù¥¿ù¥¸ù¥±ù¥ªù¥£ù¥œù¥•ù¥Žù¥‡ù¥€ù¥yù¥rù¥kù¥dù¥]ù¥Vù¥Où¥Hù¥Aù¥:ù¥3ù¥,ù¥%ù¥ù¥ù¥ù¥ ù¥ù¥ûø¥ôø¥íø¥æø¥ßø¥Øø¥Ñø¥Êø¥Ãø¥¼ø¥µø¥®ø¥§ø¥ ø¥™ø¥’ø¥‹ø¥„ø¥}ø¥vø¥oø¥hø¥aø¥Zø¥Sø¥Lø¥Eø¥>ø¥7ø¥0ø¥)ø¥"ø¥ø¥ø¥ ø¥ø¥ÿ÷¥ø÷¥ñ÷¥ê÷¥ã÷¥Ü÷¥Õ÷¥Î÷¥Ç÷¥À÷¥¹÷¥²÷¥«÷¥¤÷¥÷¥–÷¥÷¥ˆ÷¥÷¥z÷¥s÷¥l÷¥e÷¥^÷¥W÷¥P÷¥I÷¥B÷¥;÷¥4÷¥-÷¥&÷¥÷¥÷¥÷¥ ÷¥÷¥üö¥õö¥îö¥çö¥àö¥Ùö¥Òö¥Ëö¥Äö¥½ö¥¶ö¥¯ö¥¨ö¥¡ö¥šö¥“ö¥Œö¥…ö¥~ö¥wö¥pö¥iö¥bö¥[ö¥Tö¥Mö¥Fö¥?ö¥8ö¥1ö¥*ö¥#ö¥ö¥ö¥ö¥ö¥ö¥ùõ¥òõ¥ëõ¥äõ¥Ýõ¥Öõ¥Ïõ¥Èõ¥Áõ¥ºõ¥³õ¥¬õ¥¥õ¥žõ¥—õ¥õ¥‰õ¥‚õ¥{õ¥tõ¥mõ¥fõ¥_õ¥Xõ¥Qõ¥Jõ¥Cõ¥<õ¥5õ¥.õ¥'õ¥ õ¥õ¥õ¥ õ¥õ¥ýô¥öô¥ïô¥èô¥áô¥Úô¥Óô¥Ìô¥Åô¥¾ô¥·ô¥°ô¥©ô¥¢ô¥›ô¥”ô¥ô¥†ô¥ô¥xô¥qô¥jô¥cô¥\ô¥Uô¥Nô¥Gô¥@ô¥9ô¥2ô¥+ô¥$ô¥ô¥ô¥ô¥ô¥ô¥úó¥óó¥ìó¥åó¥Þó¥×ó¥Ðó¥Éó¥Âó¥»ó¥´ó¥­ó¥¦ó¥Ÿó¥˜ó¥‘ó¥Šó¥ƒó¥|ó¥uó¥nó¥gó¥`ó¥Yó¥Ró¥Kó¥Dó¥=ó¥6ó¥/ó¥(ó¥!ó¥ó¥ó¥ ó¥ó¥þò¥÷ò¥ðò¥éò¥âò¥Ûò¥Ôò¥Íò¥Æò¥¿ò¥¸ò¥±ò¥ªò¥£ò¥œò¥•ò¥Žò¥‡ò¥€ò¥yò¥rò¥kò¥dò¥]ò¥Vò¥Oò¥Hò¥Aò¥:ò¥3ò¥,ò¥%ò¥ò¥ò¥ò¥ ò¥ò¥ûñ¥ôñ¥íñ¥æñ¥ßñ¥Øñ¥Ññ¥Êñ¥Ãñ¥¼ñ¥µñ¥®ñ¥§ñ¥ ñ¥™ñ¥’ñ¥‹ñ¥„ñ¥}ñ¥vñ¥oñ¥hñ¥añ¥Zñ¥Sñ¥Lñ¥Eñ¥>ñ¥7ñ¥0ñ¥)ñ¥"ñ¥ñ¥ñ¥ ñ¥ñ¥ÿð¥øð¥ñð¥êð¥ãð¥Üð¥Õð¥Îð¥Çð¥Àð¥¹ð¥²ð¥«ð¥¤ð¥ð¥–ð¥ð¥ˆð¥ð¥zð¥sð¥lð¥eð¥^ð¥Wð¥Pð¥Ið¥Bð¥;ð¥4ð¥-ð¥&ð¥ð¥ð¥ð¥ ð¥ð¥üï¥õï¥îï¥çï¥àï¥Ùï¥Òï¥Ëï¥Ä諒略說泌率讀肋樓聾ï¥~ï¥wï¥pï¥iï¥bï¥[ï¥Tï¥Mï¥Fï¥?ï¥8ï¥1ï¥*ï¥#ï¥ï¥ï¥ï¥ï¥ï¥ùî¥òî¥ëî¥äî¥Ýî¥Öî¥Ïî¥Èî¥Áî¥î¥‰î¥‚î¥{î¥tî¥mî¥fî¥_î¥Xî¥Qî¥Jî¥Cî¥<î¥5î¥.î¥'î¥ î¥î¥î¥ î¥î¥ýí¥öí¥ïí¥èí¥áí¥Úí¥Óí¥Ìí¥Åí¥¾í¥·í¥°í¥©í¥¢í¥›í¥”í¥í¥†í¥í¥xí¥qí¥jí¥cí¥\í¥Uí¥Ní¥Gí¥@í¥9í¥2í¥+í¥$í¥í¥í¥í¥í¥í¥úì¥óì¥ìì¥åì¥Þì¥×ì¥Ðì¥Éì¥Â쥻쥴쥭쥦쥟쥘쥑쥊쥃ì¥|ì¥uì¥nì¥gì¥`ì¥Yì¥Rì¥Kì¥Dì¥=ì¥6ì¥/ì¥(ì¥!ì¥ì¥ì¥ ì¥ì¥þë¥÷ë¥ðë¥éë¥âë¥Ûë¥Ôë¥Íë¥Æë¥¿ë¥¸ë¥±ë¥ªë¥£ë¥œë¥•ë¥Žë¥‡ë¥€ë¥yë¥rë¥kë¥dë¥]ë¥Vë¥Oë¥Hë¥Aë¥:ë¥3ë¥,ë¥%ë¥ë¥ë¥ë¥ ë¥ë¥ûê¥ôê¥íê¥æê¥ßê¥Øê¥Ñê¥Êê¥Ãꥼꥵꥮꥧꥠ꥙ꥒꥋꥄê¥}ê¥vê¥oê¥hê¥aê¥Zê¥Sê¥Lê¥Eê¥>ê¥7ê¥0ê¥)ê¥"ê¥ê¥ê¥ ê¥ê¥ÿ饸é¥ñé¥êé¥ãé¥Üé¥Õé¥Îé¥Çé¥À饹饲饫饤é¥é¥–é¥é¥ˆé¥é¥zé¥sé¥lé¥eé¥^é¥Wé¥Pé¥Ié¥Bé¥;é¥4é¥-é¥&é¥é¥é¥é¥ é¥é¥üè¥õè¥îè¥çè¥àè¥Ùè¥Òè¥Ëè¥Ä襽襶襯襨襡襚襓襌襅è¥~è¥wè¥pè¥iè¥bè¥[è¥Tè¥Mè¥Fè¥?è¥8è¥1è¥*è¥#è¥è¥è¥è¥è¥è¥ùç¥òç¥ëç¥äç¥Ýç¥Öç¥Ïç¥Èç¥Á祺祳祬祥神祗ç¥ç¥‰ç¥‚ç¥{ç¥tç¥mç¥fç¥_ç¥Xç¥Qç¥Jç¥Cç¥<ç¥5ç¥.ç¥'ç¥ ç¥ç¥ç¥ ç¥ç¥ýæ¥öæ¥ïæ¥èæ¥áæ¥Úæ¥Óæ¥Ìæ¥Åæ¥¾æ¥·æ¥°æ¥©æ¥¢æ¥›æ¥”æ¥æ¥†æ¥æ¥xæ¥qæ¥jæ¥cæ¥\æ¥Uæ¥Næ¥Gæ¥@æ¥9æ¥2æ¥+æ¥$æ¥æ¥æ¥æ¥æ¥æ¥úå¥óå¥ìå¥åå¥Þå¥×å¥Ðå¥Éå¥Â奻奴奭奦奟奘契奊奃å¥|å¥uå¥nå¥gå¥`å¥Yå¥Rå¥Kå¥Då¥=å¥6å¥/å¥(å¥!å¥å¥å¥ å¥å¥þä¥÷ä¥ðä¥éä¥âä¥Ûä¥Ôä¥Íä¥Æä¥¿ä¥¸ä¥±ä¥ªä¥£ä¥œä¥•ä¥Žä¥‡ä¥€ä¥yä¥rä¥kä¥dä¥]ä¥Vä¥Oä¥Hä¥Aä¥:ä¥3ä¥,ä¥%ä¥ä¥ä¥ä¥ ä¥ä¥ûã¥ôã¥íã¥æã¥ßã¥Øã¥Ñã¥Êã¥Ã㥼㥵㥮㥧㥠㥙㥒㥋㥄ã¥}ã¥vã¥oã¥hã¥aã¥Zã¥Sã¥Lã¥Eã¥>ã¥7ã¥0ã¥)ã¥"ã¥ã¥ã¥ ã¥ã¥ÿâ¥øâ¥ñâ¥êâ¥ãâ¥Üâ¥Õâ¥Îâ¥Çâ¥À⥹⥲⥫⥤â¥â¥–â¥â¥ˆâ¥â¥zâ¥sâ¥lâ¥eâ¥^â¥Wâ¥Pâ¥Iâ¥Bâ¥;â¥4â¥-â¥&â¥â¥â¥â¥ â¥â¥üá¥õá¥îá¥çá¥àá¥Ùá¥Òá¥Ëá¥Ä᥽᥶᥯ᥨᥡᥚᥓ᥌᥅á¥~á¥wá¥pá¥iá¥bá¥[á¥Tá¥Má¥Fá¥?á¥8á¥1á¥*á¥#á¥á¥á¥á¥á¥á¥ùà¥òà¥ëà¥äà¥Ýà¥Öà¥Ïà¥Èà¥Áॺॳ६॥फ़ॗà¥à¥‰à¥‚à¥{à¥tà¥mà¥fà¥_à¥Xà¥Qà¥Jà¥Cà¥<à¥5à¥.à¥'ॠà¥à¥à¥ à¥à¥ýߥöߥïߥèߥáߥÚߥÓߥÌߥÅߥ¾ß¥·ß¥°ß¥©ß¥¢ß¥›ß¥”ߥߥ†ß¥ߥxߥqߥjߥcߥ\ߥUߥNߥGߥ@ߥ9ߥ2ߥ+ߥ$ߥߥߥߥߥߥúÞ¥óÞ¥ìÞ¥åÞ¥ÞÞ¥×Þ¥ÐÞ¥ÉÞ¥ÂÞ¥»Þ¥´Þ¥­Þ¥¦Þ¥ŸÞ¥˜Þ¥‘Þ¥ŠÞ¥ƒÞ¥|Þ¥uÞ¥nÞ¥gÞ¥`Þ¥YÞ¥RÞ¥KÞ¥DÞ¥=Þ¥6Þ¥/Þ¥(Þ¥!Þ¥Þ¥Þ¥ Þ¥Þ¥þÝ¥÷Ý¥ðÝ¥éÝ¥âÝ¥ÛÝ¥ÔÝ¥ÍÝ¥ÆÝ¥¿Ý¥¸Ý¥±Ý¥ªÝ¥£Ý¥œÝ¥•Ý¥ŽÝ¥‡Ý¥€Ý¥yÝ¥rÝ¥kÝ¥dÝ¥]Ý¥VÝ¥OÝ¥HÝ¥AÝ¥:Ý¥3Ý¥,Ý¥%ݥݥݥݥ ݥݥûÜ¥ôÜ¥íÜ¥æÜ¥ßÜ¥ØÜ¥ÑÜ¥ÊÜ¥ÃÜ¥¼Ü¥µÜ¥®Ü¥§Ü¥ Ü¥™Ü¥’Ü¥‹Ü¥„Ü¥}Ü¥vÜ¥oÜ¥hÜ¥aÜ¥ZÜ¥SÜ¥LÜ¥EÜ¥>Ü¥7Ü¥0Ü¥)Ü¥"ܥܥܥ ܥܥÿÛ¥øÛ¥ñÛ¥êÛ¥ãÛ¥ÜÛ¥ÕÛ¥ÎÛ¥ÇÛ¥ÀÛ¥¹Û¥²Û¥«Û¥¤Û¥Û¥–Û¥Û¥ˆÛ¥Û¥zÛ¥sÛ¥lÛ¥eÛ¥^Û¥WÛ¥PÛ¥IÛ¥BÛ¥;Û¥4Û¥-Û¥&Û¥Û¥Û¥Û¥ Û¥Û¥üÚ¥õÚ¥îÚ¥çÚ¥àÚ¥ÙÚ¥ÒÚ¥ËÚ¥ÄÚ¥½Ú¥¶Ú¥¯Ú¥¨Ú¥¡Ú¥šÚ¥“Ú¥ŒÚ¥…Ú¥~Ú¥wÚ¥pÚ¥iÚ¥bÚ¥[Ú¥TÚ¥MÚ¥FÚ¥?Ú¥8Ú¥1Ú¥*Ú¥#Ú¥Ú¥Ú¥Ú¥Ú¥Ú¥ùÙ¥òÙ¥ëÙ¥äÙ¥ÝÙ¥ÖÙ¥ÏÙ¥ÈÙ¥ÁÙ¥ºÙ¥³Ù¥¬Ù¥¥Ù¥žÙ¥—٥٥‰Ù¥‚Ù¥{Ù¥tÙ¥mÙ¥fÙ¥_Ù¥XÙ¥QÙ¥JÙ¥CÙ¥<Ù¥5Ù¥.Ù¥'Ù¥ ٥٥٥ ٥٥ýØ¥öØ¥ïØ¥èØ¥áØ¥ÚØ¥ÓØ¥ÌØ¥ÅØ¥¾Ø¥·Ø¥°Ø¥©Ø¥¢Ø¥›Ø¥”إإ†Ø¥Ø¥xØ¥qØ¥jØ¥cØ¥\Ø¥UØ¥NØ¥GØ¥@Ø¥9Ø¥2Ø¥+Ø¥$إإإإإإú×¥ó×¥ì×¥å×¥Þ×¥××¥Ð×¥É×¥Â×¥»×¥´×¥­×¥¦×¥Ÿ×¥˜×¥‘×¥Š×¥ƒ×¥|×¥u×¥n×¥g×¥`×¥Y×¥R×¥K×¥D×¥=×¥6×¥/×¥(×¥!×¥×¥×¥ ×¥×¥þÖ¥÷Ö¥ðÖ¥éÖ¥âÖ¥ÛÖ¥ÔÖ¥ÍÖ¥ÆÖ¥¿Ö¥¸Ö¥±Ö¥ªÖ¥£Ö¥œÖ¥•Ö¥ŽÖ¥‡Ö¥€Ö¥yÖ¥rÖ¥kÖ¥dÖ¥]Ö¥VÖ¥OÖ¥HÖ¥AÖ¥:Ö¥3Ö¥,Ö¥%Ö¥Ö¥Ö¥Ö¥ Ö¥Ö¥ûÕ¥ôÕ¥íÕ¥æÕ¥ßÕ¥ØÕ¥ÑÕ¥ÊÕ¥ÃÕ¥¼Õ¥µÕ¥®Õ¥§Õ¥ Õ¥™Õ¥’Õ¥‹Õ¥„Õ¥}Õ¥vÕ¥oÕ¥hÕ¥aÕ¥ZÕ¥SÕ¥LÕ¥EÕ¥>Õ¥7Õ¥0Õ¥)Õ¥"Õ¥Õ¥Õ¥ Õ¥Õ¥ÿÔ¥øÔ¥ñÔ¥êÔ¥ãÔ¥ÜÔ¥ÕÔ¥ÎÔ¥ÇÔ¥ÀÔ¥¹Ô¥²Ô¥«Ô¥¤Ô¥Ô¥–Ô¥Ô¥ˆÔ¥Ô¥zÔ¥sÔ¥lÔ¥eÔ¥^Ô¥WÔ¥PÔ¥IÔ¥BÔ¥;Ô¥4Ô¥-Ô¥&Ô¥Ô¥Ô¥Ô¥ Ô¥Ô¥üÓ¥õÓ¥îÓ¥çÓ¥àÓ¥ÙÓ¥ÒÓ¥ËÓ¥ÄÓ¥½Ó¥¶Ó¥¯Ó¥¨Ó¥¡Ó¥šÓ¥“Ó¥ŒÓ¥…Ó¥~Ó¥wÓ¥pÓ¥iÓ¥bÓ¥[Ó¥TÓ¥MÓ¥FÓ¥?Ó¥8Ó¥1Ó¥*Ó¥#Ó¥Ó¥Ó¥Ó¥Ó¥Ó¥ùÒ¥òÒ¥ëÒ¥äÒ¥ÝÒ¥ÖÒ¥ÏÒ¥ÈÒ¥ÁÒ¥ºÒ¥³Ò¥¬Ò¥¥Ò¥žÒ¥—Ò¥Ò¥‰Ò¥‚Ò¥{Ò¥tÒ¥mÒ¥fÒ¥_Ò¥XÒ¥QÒ¥JÒ¥CÒ¥<Ò¥5Ò¥.Ò¥'Ò¥ Ò¥Ò¥Ò¥ Ò¥Ò¥ýÑ¥öÑ¥ïÑ¥èÑ¥áÑ¥ÚÑ¥ÓÑ¥ÌÑ¥ÅÑ¥¾Ñ¥·Ñ¥°Ñ¥©Ñ¥¢Ñ¥›Ñ¥”ѥѥ†Ñ¥Ñ¥xÑ¥qÑ¥jÑ¥cÑ¥\Ñ¥UÑ¥NÑ¥GÑ¥@Ñ¥9Ñ¥2Ñ¥+Ñ¥$ѥѥѥѥѥѥúÐ¥óÐ¥ìÐ¥åÐ¥ÞÐ¥×Ð¥ÐÐ¥ÉÐ¥ÂÐ¥»Ð¥´Ð¥­Ð¥¦Ð¥ŸÐ¥˜Ð¥‘Ð¥ŠÐ¥ƒÐ¥|Ð¥uÐ¥nÐ¥gÐ¥`Ð¥YÐ¥RÐ¥KÐ¥DÐ¥=Ð¥6Ð¥/Ð¥(Ð¥!ХХХ ХХþÏ¥÷Ï¥ðÏ¥éÏ¥âÏ¥ÛÏ¥ÔÏ¥ÍÏ¥ÆÏ¥¿Ï¥¸Ï¥±Ï¥ªÏ¥£Ï¥œÏ¥•Ï¥ŽÏ¥‡Ï¥€Ï¥yÏ¥rÏ¥kÏ¥dÏ¥]Ï¥VÏ¥OÏ¥HÏ¥AÏ¥:Ï¥3Ï¥,Ï¥%ϥϥϥϥ ϥϥûÎ¥ôÎ¥íÎ¥æÎ¥ßÎ¥ØÎ¥ÑÎ¥ÊÎ¥ÃÎ¥¼Î¥µÎ¥®Î¥§Î¥ Î¥™Î¥’Î¥‹Î¥„Î¥}Î¥vÎ¥oÎ¥hÎ¥aÎ¥ZÎ¥SÎ¥LÎ¥EÎ¥>Î¥7Î¥0Î¥)Î¥"ΥΥΥ ΥΥÿÍ¥øÍ¥ñÍ¥êÍ¥ãÍ¥ÜÍ¥ÕÍ¥ÎÍ¥ÇÍ¥ÀÍ¥¹Í¥²Í¥«Í¥¤Í¥Í¥–ͥͥˆÍ¥Í¥zÍ¥sÍ¥lÍ¥eÍ¥^Í¥WÍ¥PÍ¥IÍ¥BÍ¥;Í¥4Í¥-Í¥&ͥͥͥͥ ͥͥüÌ¥õÌ¥îÌ¥çÌ¥àÌ¥ÙÌ¥ÒÌ¥ËÌ¥ÄÌ¥½Ì¥¶Ì¥¯Ì¥¨Ì¥¡Ì¥šÌ¥“Ì¥ŒÌ¥…Ì¥~Ì¥wÌ¥pÌ¥iÌ¥bÌ¥[Ì¥TÌ¥MÌ¥FÌ¥?Ì¥8Ì¥1Ì¥*Ì¥#̥̥̥̥̥̥ùË¥òË¥ëË¥äË¥ÝË¥ÖË¥ÏË¥ÈË¥ÁË¥ºË¥³Ë¥¬Ë¥¥Ë¥žË¥—˥˥‰Ë¥‚Ë¥{Ë¥tË¥mË¥fË¥_Ë¥XË¥QË¥JË¥CË¥<Ë¥5Ë¥.Ë¥'Ë¥ ˥˥˥ ˥˥ýÊ¥öÊ¥ïÊ¥èÊ¥áÊ¥ÚÊ¥ÓÊ¥ÌÊ¥ÅÊ¥¾Ê¥·Ê¥°Ê¥©Ê¥¢Ê¥›Ê¥”ʥʥ†Ê¥Ê¥xÊ¥qÊ¥jÊ¥cÊ¥\Ê¥UÊ¥NÊ¥GÊ¥@Ê¥9Ê¥2Ê¥+Ê¥$ʥʥʥʥʥʥúÉ¥óÉ¥ìÉ¥åÉ¥ÞÉ¥×É¥ÐÉ¥ÉÉ¥ÂÉ¥»É¥´É¥­É¥¦É¥ŸÉ¥˜É¥‘É¥ŠÉ¥ƒÉ¥|É¥uÉ¥nÉ¥gÉ¥`É¥YÉ¥RÉ¥KÉ¥DÉ¥=É¥6É¥/É¥(É¥!ɥɥɥ ɥɥþÈ¥÷È¥ðÈ¥éÈ¥âÈ¥ÛÈ¥ÔÈ¥ÍÈ¥ÆÈ¥¿È¥¸È¥±È¥ªÈ¥£È¥œÈ¥•È¥ŽÈ¥‡È¥€È¥yÈ¥rÈ¥kÈ¥dÈ¥]È¥VÈ¥OÈ¥HÈ¥AÈ¥:È¥3È¥,È¥%ȥȥȥȥ ȥȥûÇ¥ôÇ¥íÇ¥æÇ¥ßÇ¥ØÇ¥ÑÇ¥ÊÇ¥ÃÇ¥¼Ç¥µÇ¥®Ç¥§Ç¥ Ç¥™Ç¥’Ç¥‹Ç¥„Ç¥}Ç¥vÇ¥oÇ¥hÇ¥aÇ¥ZÇ¥SÇ¥LÇ¥EÇ¥>Ç¥7Ç¥0Ç¥)Ç¥"ǥǥǥ ǥǥÿÆ¥øÆ¥ñÆ¥êÆ¥ãÆ¥ÜÆ¥ÕÆ¥ÎÆ¥ÇÆ¥ÀÆ¥¹Æ¥²Æ¥«Æ¥¤Æ¥Æ¥–ƥƥˆÆ¥Æ¥zÆ¥sÆ¥lÆ¥eÆ¥^Æ¥WÆ¥PÆ¥IÆ¥BÆ¥;Æ¥4Æ¥-Æ¥&ƥƥƥƥ ƥƥüÅ¥õÅ¥îÅ¥çÅ¥àÅ¥ÙÅ¥ÒÅ¥ËÅ¥ÄÅ¥½Å¥¶Å¥¯Å¥¨Å¥¡Å¥šÅ¥“Å¥ŒÅ¥…Å¥~Å¥wÅ¥pÅ¥iÅ¥bÅ¥[Å¥TÅ¥MÅ¥FÅ¥?Å¥8Å¥1Å¥*Å¥#ťťťťťťùÄ¥òÄ¥ëÄ¥äÄ¥ÝÄ¥ÖÄ¥ÏÄ¥ÈÄ¥ÁÄ¥ºÄ¥³Ä¥¬Ä¥¥Ä¥žÄ¥—ĥĥ‰Ä¥‚Ä¥{Ä¥tÄ¥mÄ¥fÄ¥_Ä¥XÄ¥QÄ¥JÄ¥CÄ¥<Ä¥5Ä¥.Ä¥'Ä¥ ĥĥĥ ĥĥýÃ¥öÃ¥ïÃ¥èÃ¥áÃ¥ÚÃ¥ÓÃ¥ÌÃ¥ÅÃ¥¾Ã¥·Ã¥°Ã¥©Ã¥¢Ã¥›Ã¥”åå†Ã¥Ã¥xÃ¥qÃ¥jÃ¥cÃ¥\Ã¥UÃ¥NÃ¥GÃ¥@Ã¥9Ã¥2Ã¥+Ã¥$ååååååúÂ¥óÂ¥ìÂ¥åÂ¥ÞÂ¥×Â¥ÐÂ¥ÉÂ¥ÂÂ¥»Â¥´Â¥­Â¥¦Â¥ŸÂ¥˜Â¥‘Â¥ŠÂ¥ƒÂ¥|Â¥uÂ¥nÂ¥gÂ¥`Â¥YÂ¥RÂ¥KÂ¥DÂ¥=Â¥6Â¥/Â¥(Â¥!¥¥¥ ¥¥þÁ¥÷Á¥ðÁ¥éÁ¥âÁ¥ÛÁ¥ÔÁ¥ÍÁ¥ÆÁ¥¿Á¥¸Á¥±Á¥ªÁ¥£Á¥œÁ¥•Á¥ŽÁ¥‡Á¥€Á¥yÁ¥rÁ¥kÁ¥dÁ¥]Á¥VÁ¥OÁ¥HÁ¥AÁ¥:Á¥3Á¥,Á¥%Á¥Á¥Á¥Á¥ Á¥Á¥ûÀ¥ôÀ¥íÀ¥æÀ¥ßÀ¥ØÀ¥ÑÀ¥ÊÀ¥ÃÀ¥¼À¥µÀ¥®À¥§À¥ À¥™À¥’À¥‹À¥„À¥}À¥vÀ¥oÀ¥hÀ¥aÀ¥ZÀ¥SÀ¥LÀ¥EÀ¥>À¥7À¥0À¥)À¥"À¥À¥À¥ À¥À¥ÿ¿¥ø¿¥ñ¿¥ê¿¥ã¿¥Ü¿¥Õ¿¥ο¥Ç¿¥À¿¥¹¿¥²¿¥«¿¥¤¿¥¿¥–¿¥¿¥ˆ¿¥¿¥z¿¥s¿¥l¿¥e¿¥^¿¥W¿¥P¿¥I¿¥B¿¥;¿¥4¿¥-¿¥&¿¥¿¥¿¥¿¥ ¿¥¿¥ü¾¥õ¾¥î¾¥ç¾¥ྥÙ¾¥Ò¾¥˾¥ľ¥½¾¥¶¾¥¯¾¥¨¾¥¡¾¥š¾¥“¾¥Œ¾¥…¾¥~¾¥w¾¥p¾¥i¾¥b¾¥[¾¥T¾¥M¾¥F¾¥?¾¥8¾¥1¾¥*¾¥#¾¥¾¥¾¥¾¥¾¥¾¥ù½¥ò½¥ë½¥ä½¥ݽ¥Ö½¥Ͻ¥Ƚ¥Á½¥º½¥³½¥¬½¥¥½¥ž½¥—½¥½¥‰½¥‚½¥{½¥t½¥m½¥f½¥_½¥X½¥Q½¥J½¥C½¥<½¥5½¥.½¥'½¥ ½¥½¥½¥ ½¥½¥ý¼¥ö¼¥ï¼¥è¼¥á¼¥Ú¼¥Ó¼¥̼¥ż¥¾¼¥·¼¥°¼¥©¼¥¢¼¥›¼¥”¼¥¼¥†¼¥¼¥x¼¥q¼¥j¼¥c¼¥\¼¥U¼¥N¼¥G¼¥@¼¥9¼¥2¼¥+¼¥$¼¥¼¥¼¥¼¥¼¥¼¥ú»¥ó»¥컥廥Þ»¥×»¥л¥É»¥»¥»»¥´»¥­»¥¦»¥Ÿ»¥˜»¥‘»¥Š»¥ƒ»¥|»¥u»¥n»¥g»¥`»¥Y»¥R»¥K»¥D»¥=»¥6»¥/»¥(»¥!»¥»¥»¥ »¥»¥þº¥÷º¥ðº¥麥⺥Ûº¥Ôº¥ͺ¥ƺ¥¿º¥¸º¥±º¥ªº¥£º¥œº¥•º¥Žº¥‡º¥€º¥yº¥rº¥kº¥dº¥]º¥Vº¥Oº¥Hº¥Aº¥:º¥3º¥,º¥%º¥º¥º¥º¥ º¥º¥û¹¥ô¹¥í¹¥æ¹¥ß¹¥ع¥ѹ¥ʹ¥ù¥¼¹¥µ¹¥®¹¥§¹¥ ¹¥™¹¥’¹¥‹¹¥„¹¥}¹¥v¹¥o¹¥h¹¥a¹¥Z¹¥S¹¥L¹¥E¹¥>¹¥7¹¥0¹¥)¹¥"¹¥¹¥¹¥ ¹¥¹¥ÿ¸¥ø¸¥ñ¸¥긥㸥ܸ¥Õ¸¥θ¥Ǹ¥À¸¥¹¸¥²¸¥«¸¥¤¸¥¸¥–¸¥¸¥ˆ¸¥¸¥z¸¥s¸¥l¸¥e¸¥^¸¥W¸¥P¸¥I¸¥B¸¥;¸¥4¸¥-¸¥&¸¥¸¥¸¥¸¥ ¸¥¸¥ü·¥õ·¥î·¥ç·¥à·¥Ù·¥Ò·¥Ë·¥Ä·¥½·¥¶·¥¯·¥¨·¥¡·¥š·¥“·¥Œ·¥…·¥~·¥w·¥p·¥i·¥b·¥[·¥T·¥M·¥F·¥?·¥8·¥1·¥*·¥#·¥·¥·¥·¥·¥·¥ù¶¥ò¶¥ë¶¥ä¶¥ݶ¥Ö¶¥϶¥ȶ¥Á¶¥º¶¥³¶¥¬¶¥¥¶¥ž¶¥—¶¥¶¥‰¶¥‚¶¥{¶¥t¶¥m¶¥f¶¥_¶¥X¶¥Q¶¥J¶¥C¶¥<¶¥5¶¥.¶¥'¶¥ ¶¥¶¥¶¥ ¶¥¶¥ýµ¥öµ¥ïµ¥èµ¥áµ¥Úµ¥Óµ¥̵¥ŵ¥¾µ¥·µ¥°µ¥©µ¥¢µ¥›µ¥”µ¥µ¥†µ¥µ¥xµ¥qµ¥jµ¥cµ¥\µ¥Uµ¥Nµ¥Gµ¥@µ¥9µ¥2µ¥+µ¥$µ¥µ¥µ¥µ¥µ¥µ¥ú´¥ó´¥ì´¥å´¥Þ´¥×´¥д¥É´¥´¥»´¥´´¥­´¥¦´¥Ÿ´¥˜´¥‘´¥Š´¥ƒ´¥|´¥u´¥n´¥g´¥`´¥Y´¥R´¥K´¥D´¥=´¥6´¥/´¥(´¥!´¥´¥´¥ ´¥´¥þ³¥÷³¥ð³¥é³¥â³¥Û³¥Ô³¥ͳ¥Ƴ¥¿³¥¸³¥±³¥ª³¥£³¥œ³¥•³¥޳¥‡³¥€³¥y³¥r³¥k³¥d³¥]³¥V³¥O³¥H³¥A³¥:³¥3³¥,³¥%³¥³¥³¥³¥ ³¥³¥û²¥ô²¥í²¥æ²¥ß²¥ز¥Ѳ¥ʲ¥ò¥¼²¥µ²¥®²¥§²¥ ²¥™²¥’²¥‹²¥„²¥}²¥v²¥o²¥h²¥a²¥Z²¥S²¥L²¥E²¥>²¥7²¥0²¥)²¥"²¥²¥²¥ ²¥²¥ÿ±¥ø±¥ñ±¥ê±¥ã±¥ܱ¥Õ±¥α¥DZ¥À±¥¹±¥²±¥«±¥¤±¥±¥–±¥±¥ˆ±¥±¥z±¥s±¥l±¥e±¥^±¥W±¥P±¥I±¥B±¥;±¥4±¥-±¥&±¥±¥±¥±¥ ±¥±¥ü°¥õ°¥î°¥ç°¥à°¥Ù°¥Ò°¥˰¥İ¥½°¥¶°¥¯°¥¨°¥¡°¥š°¥“°¥Œ°¥…°¥~°¥w°¥p°¥i°¥b°¥[°¥T°¥M°¥F°¥?°¥8°¥1°¥*°¥#°¥°¥°¥°¥°¥°¥ù¯¥ò¯¥믥䯥ݯ¥Ö¯¥ϯ¥ȯ¥Á¯¥º¯¥³¯¥¬¯¥¥¯¥ž¯¥—¯¥¯¥‰¯¥‚¯¥{¯¥t¯¥m¯¥f¯¥_¯¥X¯¥Q¯¥J¯¥C¯¥<¯¥5¯¥.¯¥'¯¥ ¯¥¯¥¯¥ ¯¥¯¥ý®¥ö®¥ﮥ讥ᮥÚ®¥Ó®¥Ì®¥Å®¥¾®¥·®¥°®¥©®¥¢®¥›®¥”®¥®¥†®¥®¥x®¥q®¥j®¥c®¥\®¥U®¥N®¥G®¥@®¥9®¥2®¥+®¥$®¥®¥®¥®¥®¥®¥ú­¥ó­¥ì­¥å­¥Þ­¥×­¥Э¥É­¥­¥»­¥´­¥­­¥¦­¥Ÿ­¥˜­¥‘­¥Š­¥ƒ­¥|­¥u­¥n­¥g­¥`­¥Y­¥R­¥K­¥D­¥=­¥6­¥/­¥(­¥!­¥­¥­¥ ­¥­¥þ¬¥÷¬¥ð¬¥鬥⬥Û¬¥Ô¬¥ͬ¥Ƭ¥¿¬¥¸¬¥±¬¥ª¬¥£¬¥œ¬¥•¬¥ެ¥‡¬¥€¬¥y¬¥r¬¥k¬¥d¬¥]¬¥V¬¥O¬¥H¬¥A¬¥:¬¥3¬¥,¬¥%¬¥¬¥¬¥¬¥ ¬¥¬¥û«¥ô«¥í«¥æ«¥ß«¥Ø«¥Ñ«¥Ê«¥ë¥¼«¥µ«¥®«¥§«¥ «¥™«¥’«¥‹«¥„«¥}«¥v«¥o«¥h«¥a«¥Z«¥S«¥L«¥E«¥>«¥7«¥0«¥)«¥"«¥«¥«¥ «¥«¥ÿª¥øª¥ñª¥ꪥ㪥ܪ¥Õª¥Ϊ¥Ǫ¥Àª¥¹ª¥²ª¥«ª¥¤ª¥ª¥–ª¥ª¥ˆª¥ª¥zª¥sª¥lª¥eª¥^ª¥Wª¥Pª¥Iª¥Bª¥;ª¥4ª¥-ª¥&ª¥ª¥ª¥ª¥ ª¥ª¥ü©¥õ©¥î©¥ç©¥à©¥Ù©¥Ò©¥Ë©¥Ä©¥½©¥¶©¥¯©¥¨©¥¡©¥š©¥“©¥Œ©¥…©¥~©¥w©¥p©¥i©¥b©¥[©¥T©¥M©¥F©¥?©¥8©¥1©¥*©¥#©¥©¥©¥©¥©¥©¥ù¨¥ò¨¥먥䨥ݨ¥Ö¨¥Ϩ¥Ȩ¥Á¨¥º¨¥³¨¥¬¨¥¥¨¥ž¨¥—¨¥¨¥‰¨¥‚¨¥{¨¥t¨¥m¨¥f¨¥_¨¥X¨¥Q¨¥J¨¥C¨¥<¨¥5¨¥.¨¥'¨¥ ¨¥¨¥¨¥ ¨¥¨¥ý§¥ö§¥ï§¥è§¥á§¥Ú§¥Ó§¥̧¥ŧ¥¾§¥·§¥°§¥©§¥¢§¥›§¥”§¥§¥†§¥§¥x§¥q§¥j§¥c§¥\§¥U§¥N§¥G§¥@§¥9§¥2§¥+§¥$§¥§¥§¥§¥§¥§¥ú¦¥ó¦¥즥妥Þ¦¥צ¥Ц¥ɦ¥¦¥»¦¥´¦¥­¦¥¦¦¥Ÿ¦¥˜¦¥‘¦¥Ц¥ƒ¦¥|¦¥u¦¥n¦¥g¦¥`¦¥Y¦¥R¦¥K¦¥D¦¥=¦¥6¦¥/¦¥(¦¥!¦¥¦¥¦¥ ¦¥¦¥þ¥¥÷¥¥ð¥¥饥⥥Û¥¥Ô¥¥Í¥¥Æ¥¥¿¥¥¸¥¥±¥¥ª¥¥£¥¥œ¥¥•¥¥Ž¥¥‡¥¥€¥¥y¥¥r¥¥k¥¥d¥¥]¥¥V¥¥O¥¥H¥¥A¥¥:¥¥3¥¥,¥¥%¥¥¥¥¥¥¥¥ ¥¥¥¥û¤¥ô¤¥í¤¥椥ߤ¥ؤ¥Ѥ¥ʤ¥ä¥¼¤¥µ¤¥®¤¥§¤¥ ¤¥™¤¥’¤¥‹¤¥„¤¥}¤¥v¤¥o¤¥h¤¥a¤¥Z¤¥S¤¥L¤¥E¤¥>¤¥7¤¥0¤¥)¤¥"¤¥¤¥¤¥ ¤¥¤¥ÿ£¥ø£¥ñ£¥꣥㣥Ü£¥Õ£¥Σ¥Ç£¥À£¥¹£¥²£¥«£¥¤£¥£¥–£¥£¥ˆ£¥£¥z£¥s£¥l£¥e£¥^£¥W£¥P£¥I£¥B£¥;£¥4£¥-£¥&£¥£¥£¥£¥ £¥£¥ü¢¥õ¢¥碥ࢥÙ¢¥Ò¢¥Ë¢¥Ä¢¥½¢¥¶¢¥¯¢¥¨¢¥¡¢¥š¢¥“¢¥Œ¢¥…¢¥~¢¥w¢¥p¢¥i¢¥b¢¥[¢¥T¢¥M¢¥F¢¥?¢¥8¢¥1¢¥*¢¥#¢¥¢¥¢¥¢¥¢¥¢¥ù¡¥ò¡¥ë¡¥ä¡¥Ý¡¥Ö¡¥Ï¡¥È¡¥Á¡¥º¡¥³¡¥¬¡¥¥¡¥ž¡¥—¡¥¡¥‰¡¥‚¡¥{¡¥t¡¥m¡¥f¡¥_¡¥X¡¥Q¡¥J¡¥C¡¥<¡¥5¡¥.¡¥'¡¥ ¡¥¡¥¡¥ ¡¥¡¥ý ¥ö ¥ï ¥è ¥á ¥Ú ¥Ó ¥Ì ¥Å ¥¾ ¥· ¥° ¥© ¥¢ ¥› ¥” ¥ ¥† ¥ ¥x ¥q ¥j ¥c ¥\ ¥U ¥N ¥G ¥@ ¥9 ¥2 ¥+ ¥$ ¥ ¥ ¥ ¥ ¥ ¥úŸ¥óŸ¥쟥埥ÞŸ¥ן¥П¥ÉŸ¥Ÿ¥»Ÿ¥´Ÿ¥­Ÿ¥¦Ÿ¥ŸŸ¥˜Ÿ¥‘Ÿ¥ŠŸ¥ƒŸ¥|Ÿ¥uŸ¥nŸ¥gŸ¥`Ÿ¥YŸ¥RŸ¥KŸ¥DŸ¥=Ÿ¥6Ÿ¥/Ÿ¥(Ÿ¥!Ÿ¥Ÿ¥Ÿ¥ Ÿ¥Ÿ¥þž¥÷ž¥ðž¥鞥➥Ûž¥Ôž¥Íž¥Æž¥¿ž¥¸ž¥±ž¥ªž¥£ž¥œž¥•ž¥Žž¥‡ž¥€ž¥yž¥rž¥kž¥dž¥]ž¥Vž¥Ož¥Hž¥Až¥:ž¥3ž¥,ž¥%ž¥ž¥ž¥ž¥ ž¥ž¥û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿœ¥øœ¥ñœ¥ꜥ㜥Üœ¥Õœ¥Μ¥Çœ¥Àœ¥¹œ¥²œ¥«œ¥¤œ¥œ¥–œ¥œ¥ˆœ¥œ¥zœ¥sœ¥lœ¥eœ¥^œ¥Wœ¥Pœ¥Iœ¥Bœ¥;œ¥4œ¥-œ¥&œ¥œ¥œ¥œ¥ œ¥œ¥ü›¥õ›¥盥à›¥Ù›¥Ò›¥Ë›¥Ä›¥½›¥¶›¥¯›¥¨›¥¡›¥š›¥“›¥Œ›¥…›¥~›¥w›¥p›¥i›¥b›¥[›¥T›¥M›¥F›¥?›¥8›¥1›¥*›¥#›¥›¥›¥›¥›¥›¥ùš¥òš¥뚥䚥Ýš¥Öš¥Ïš¥Èš¥Áš¥ºš¥³š¥¬š¥¥š¥žš¥—š¥š¥‰š¥‚š¥{š¥tš¥mš¥fš¥_š¥Xš¥Qš¥Jš¥Cš¥<š¥5š¥.š¥'š¥ š¥š¥š¥ š¥š¥ý™¥ö™¥虥ᙥÚ™¥Ó™¥Ì™¥Å™¥¾™¥·™¥°™¥©™¥¢™¥›™¥”™¥™¥†™¥™¥x™¥q™¥j™¥c™¥\™¥U™¥N™¥G™¥@™¥9™¥2™¥+™¥$™¥™¥™¥™¥™¥™¥ú˜¥ó˜¥옥嘥Þ˜¥ט¥И¥ɘ¥˜¥»˜¥´˜¥­˜¥¦˜¥Ÿ˜¥˜˜¥‘˜¥Š˜¥ƒ˜¥|˜¥u˜¥n˜¥g˜¥`˜¥Y˜¥R˜¥K˜¥D˜¥=˜¥6˜¥/˜¥(˜¥!˜¥˜¥˜¥ ˜¥˜¥þ—¥÷—¥ð—¥é—¥â—¥Û—¥Ô—¥Í—¥Æ—¥¿—¥¸—¥±—¥ª—¥£—¥œ—¥•—¥Ž—¥‡—¥€—¥y—¥r—¥k—¥d—¥]—¥V—¥O—¥H—¥A—¥:—¥3—¥,—¥%—¥—¥—¥—¥ —¥—¥û–¥ô–¥í–¥æ–¥ß–¥Ø–¥Ñ–¥Ê–¥Ö¥¼–¥µ–¥®–¥§–¥ –¥™–¥’–¥‹–¥„–¥}–¥v–¥o–¥h–¥a–¥Z–¥S–¥L–¥E–¥>–¥7–¥0–¥)–¥"–¥–¥–¥ –¥–¥ÿ•¥ø•¥ñ•¥ê•¥ã•¥Ü•¥Õ•¥Ε¥Ç•¥À•¥¹•¥²•¥«•¥¤•¥•¥–•¥•¥ˆ•¥•¥z•¥s•¥l•¥e•¥^•¥W•¥P•¥I•¥B•¥;•¥4•¥-•¥&•¥•¥•¥•¥ •¥•¥ü”¥õ”¥甥à”¥Ù”¥Ò”¥Ë”¥Ä”¥½”¥¶”¥¯”¥¨”¥¡”¥š”¥“”¥Œ”¥…”¥~”¥w”¥p”¥i”¥b”¥[”¥T”¥M”¥F”¥?”¥8”¥1”¥*”¥#”¥”¥”¥”¥”¥”¥ù“¥ò“¥ë“¥ä“¥Ý“¥Ö“¥Ï“¥È“¥Á“¥º“¥³“¥¬“¥¥“¥ž“¥—“¥“¥‰“¥‚“¥{“¥t“¥m“¥f“¥_“¥X“¥Q“¥J“¥C“¥<“¥5“¥.“¥'“¥ “¥“¥“¥ “¥“¥ý’¥ö’¥ï’¥è’¥á’¥Ú’¥Ó’¥Ì’¥Å’¥¾’¥·’¥°’¥©’¥¢’¥›’¥”’¥’¥†’¥’¥x’¥q’¥j’¥c’¥\’¥U’¥N’¥G’¥@’¥9’¥2’¥+’¥$’¥’¥’¥’¥’¥’¥ú‘¥ó‘¥ì‘¥å‘¥Þ‘¥ב¥Б¥É‘¥‘¥»‘¥´‘¥­‘¥¦‘¥Ÿ‘¥˜‘¥‘‘¥Š‘¥ƒ‘¥|‘¥u‘¥n‘¥g‘¥`‘¥Y‘¥R‘¥K‘¥D‘¥=‘¥6‘¥/‘¥(‘¥!‘¥‘¥‘¥ ‘¥‘¥þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿŽ¥øŽ¥ñŽ¥ꎥ㎥ÜŽ¥ÕŽ¥ÎŽ¥ÇŽ¥ÀŽ¥¹Ž¥²Ž¥«Ž¥¤Ž¥Ž¥–ޥޥˆŽ¥Ž¥zŽ¥sŽ¥lŽ¥eŽ¥^Ž¥WŽ¥PŽ¥IŽ¥BŽ¥;Ž¥4Ž¥-Ž¥&ޥޥޥޥ ޥޥü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ùŒ¥òŒ¥댥䌥ÝŒ¥ÖŒ¥ÏŒ¥ÈŒ¥ÁŒ¥ºŒ¥³Œ¥¬Œ¥¥Œ¥žŒ¥—Œ¥Œ¥‰Œ¥‚Œ¥{Œ¥tŒ¥mŒ¥fŒ¥_Œ¥XŒ¥QŒ¥JŒ¥CŒ¥<Œ¥5Œ¥.Œ¥'Œ¥ Œ¥Œ¥Œ¥ Œ¥Œ¥ý‹¥ö‹¥ï‹¥è‹¥á‹¥Ú‹¥Ó‹¥Ì‹¥Å‹¥¾‹¥·‹¥°‹¥©‹¥¢‹¥›‹¥”‹¥‹¥†‹¥‹¥x‹¥q‹¥j‹¥c‹¥\‹¥U‹¥N‹¥G‹¥@‹¥9‹¥2‹¥+‹¥$‹¥‹¥‹¥‹¥‹¥‹¥úŠ¥óŠ¥슥劥ÞŠ¥׊¥Њ¥ÉХХ»Š¥´Š¥­Š¥¦Š¥ŸŠ¥˜Š¥‘Š¥ŠŠ¥ƒŠ¥|Š¥uŠ¥nŠ¥gŠ¥`Š¥YŠ¥RŠ¥KŠ¥DŠ¥=Š¥6Š¥/Š¥(Š¥!ХХХ ХХþ‰¥÷‰¥ð‰¥鉥≥Û‰¥Ô‰¥͉¥Ɖ¥¿‰¥¸‰¥±‰¥ª‰¥£‰¥œ‰¥•‰¥މ¥‡‰¥€‰¥y‰¥r‰¥k‰¥d‰¥]‰¥V‰¥O‰¥H‰¥A‰¥:‰¥3‰¥,‰¥%‰¥‰¥‰¥‰¥ ‰¥‰¥ûˆ¥ôˆ¥툥戥߈¥؈¥ш¥ʈ¥È¥¼ˆ¥µˆ¥®ˆ¥§ˆ¥ ˆ¥™ˆ¥’ˆ¥‹ˆ¥„ˆ¥}ˆ¥vˆ¥oˆ¥hˆ¥aˆ¥Zˆ¥Sˆ¥Lˆ¥Eˆ¥>ˆ¥7ˆ¥0ˆ¥)ˆ¥"ˆ¥ˆ¥ˆ¥ ˆ¥ˆ¥ÿ‡¥ø‡¥ñ‡¥ꇥ㇥܇¥Õ‡¥·¥LJ¥À‡¥¹‡¥²‡¥«‡¥¤‡¥‡¥–‡¥‡¥ˆ‡¥‡¥z‡¥s‡¥l‡¥e‡¥^‡¥W‡¥P‡¥I‡¥B‡¥;‡¥4‡¥-‡¥&‡¥‡¥‡¥‡¥ ‡¥‡¥ü†¥õ†¥熥à†¥Ù†¥Ò†¥ˆ¥Ć¥½†¥¶†¥¯†¥¨†¥¡†¥š†¥“†¥Œ†¥…†¥~†¥w†¥p†¥i†¥b†¥[†¥T†¥M†¥F†¥?†¥8†¥1†¥*†¥#†¥†¥†¥†¥†¥†¥ù…¥ò…¥ë…¥ä…¥Ý…¥Ö…¥Ï…¥È…¥Á…¥º…¥³…¥¬…¥¥…¥ž…¥—…¥…¥‰…¥‚…¥{…¥t…¥m…¥f…¥_…¥X…¥Q…¥J…¥C…¥<…¥5…¥.…¥'…¥ …¥…¥…¥ …¥…¥ý„¥ö„¥ï„¥è„¥á„¥Ú„¥Ó„¥Ì„¥Å„¥¾„¥·„¥°„¥©„¥¢„¥›„¥”„¥„¥†„¥„¥x„¥q„¥j„¥c„¥\„¥U„¥N„¥G„¥@„¥9„¥2„¥+„¥$„¥„¥„¥„¥„¥„¥úƒ¥óƒ¥샥僥Þƒ¥׃¥Ѓ¥Ƀ¥ƒ¥»ƒ¥´ƒ¥­ƒ¥¦ƒ¥Ÿƒ¥˜ƒ¥‘ƒ¥Šƒ¥ƒƒ¥|ƒ¥uƒ¥nƒ¥gƒ¥`ƒ¥Yƒ¥Rƒ¥Kƒ¥Dƒ¥=ƒ¥6ƒ¥/ƒ¥(ƒ¥!ƒ¥ƒ¥ƒ¥ ƒ¥ƒ¥þ‚¥÷‚¥ð‚¥é‚¥â‚¥Û‚¥Ô‚¥Í‚¥Æ‚¥¿‚¥¸‚¥±‚¥ª‚¥£‚¥œ‚¥•‚¥Ž‚¥‡‚¥€‚¥y‚¥r‚¥k‚¥d‚¥]‚¥V‚¥O‚¥H‚¥A‚¥:‚¥3‚¥,‚¥%‚¥‚¥‚¥‚¥ ‚¥‚¥û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ€¥ø€¥ñ€¥ꀥ〥Ü€¥Õ€¥΀¥Ç€¥À€¥¹€¥²€¥«€¥¤€¥€¥–€¥€¥ˆ€¥€¥z€¥s€¥l€¥e€¥^€¥W€¥P€¥I€¥B€¥;€¥4€¥-€¥&€¥€¥€¥€¥ €¥€¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù~¥ò~¥ë~¥ä~¥Ý~¥Ö~¥Ï~¥È~¥Á~¥º~¥³~¥¬~¥¥~¥ž~¥—~¥~¥‰~¥‚~¥{~¥t~¥m~¥f~¥_~¥X~¥Q~¥J~¥C~¥<~¥5~¥.~¥'~¥ ~¥~¥~¥ ~¥~¥ý}¥ö}¥ï}¥è}¥á}¥Ú}¥Ó}¥Ì}¥Å}¥¾}¥·}¥°}¥©}¥¢}¥›}¥”}¥}¥†}¥}¥x}¥q}¥j}¥c}¥\}¥U}¥N}¥G}¥@}¥9}¥2}¥+}¥$}¥}¥}¥}¥}¥}¥ú|¥ó|¥ì|¥å|¥Þ|¥×|¥Ð|¥É|¥Â|¥»|¥´|¥­|¥¦|¥Ÿ|¥˜|¥‘|¥Š|¥ƒ|¥||¥u|¥n|¥g|¥`|¥Y|¥R|¥K|¥D|¥=|¥6|¥/|¥(|¥!|¥|¥|¥ |¥|¥þ{¥÷{¥ð{¥é{¥â{¥Û{¥Ô{¥Í{¥Æ{¥¿{¥¸{¥±{¥ª{¥£{¥œ{¥•{¥Ž{¥‡{¥€{¥y{¥r{¥k{¥d{¥]{¥V{¥O{¥H{¥A{¥:{¥3{¥,{¥%{¥{¥{¥{¥ {¥{¥ûz¥ôz¥íz¥æz¥ßz¥Øz¥Ñz¥Êz¥Ãz¥¼z¥µz¥®z¥§z¥ z¥™z¥’z¥‹z¥„z¥}z¥vz¥oz¥hz¥az¥Zz¥Sz¥Lz¥Ez¥>z¥7z¥0z¥)z¥"z¥z¥z¥ z¥z¥ÿy¥øy¥ñy¥êy¥ãy¥Üy¥Õy¥Îy¥Çy¥Ày¥¹y¥²y¥«y¥¤y¥y¥–y¥y¥ˆy¥y¥zy¥sy¥ly¥ey¥^y¥Wy¥Py¥Iy¥By¥;y¥4y¥-y¥&y¥y¥y¥y¥ y¥y¥üx¥õx¥îx¥çx¥àx¥Ùx¥Òx¥Ëx¥Äx¥½x¥¶x¥¯x¥¨x¥¡x¥šx¥“x¥Œx¥…x¥~x¥wx¥px¥ix¥bx¥[x¥Tx¥Mx¥Fx¥?x¥8x¥1x¥*x¥#x¥x¥x¥x¥x¥x¥ùw¥òw¥ëw¥äw¥Ýw¥Öw¥Ïw¥Èw¥Áw¥ºw¥³w¥¬w¥¥w¥žw¥—w¥w¥‰w¥‚w¥{w¥tw¥mw¥fw¥_w¥Xw¥Qw¥Jw¥Cw¥s¥7s¥0s¥)s¥"s¥s¥s¥ s¥s¥ÿr¥ør¥ñr¥êr¥ãr¥Ür¥Õr¥Îr¥Çr¥Àr¥¹r¥²r¥«r¥¤r¥r¥–r¥r¥ˆr¥r¥zr¥sr¥lr¥er¥^r¥Wr¥Pr¥Ir¥Br¥;r¥4r¥-r¥&r¥r¥r¥r¥ r¥r¥üq¥õq¥îq¥çq¥àq¥Ùq¥Òq¥Ëq¥Äq¥½q¥¶q¥¯q¥¨q¥¡q¥šq¥“q¥Œq¥…q¥~q¥wq¥pq¥iq¥bq¥[q¥Tq¥Mq¥Fq¥?q¥8q¥1q¥*q¥#q¥q¥q¥q¥q¥q¥ùp¥òp¥ëp¥äp¥Ýp¥Öp¥Ïp¥Èp¥Áp¥ºp¥³p¥¬p¥¥p¥žp¥—p¥p¥‰p¥‚p¥{p¥tp¥mp¥fp¥_p¥Xp¥Qp¥Jp¥Cp¥l¥7l¥0l¥)l¥"l¥l¥l¥ l¥l¥ÿk¥øk¥ñk¥êk¥ãk¥Ük¥Õk¥Îk¥Çk¥Àk¥¹k¥²k¥«k¥¤k¥k¥–k¥k¥ˆk¥k¥zk¥sk¥lk¥ek¥^k¥Wk¥Pk¥Ik¥Bk¥;k¥4k¥-k¥&k¥k¥k¥k¥ k¥k¥üj¥õj¥îj¥çj¥àj¥Ùj¥Òj¥Ëj¥Äj¥½j¥¶j¥¯j¥¨j¥¡j¥šj¥“j¥Œj¥…j¥~j¥wj¥pj¥ij¥bj¥[j¥Tj¥Mj¥Fj¥?j¥8j¥1j¥*j¥#j¥j¥j¥j¥j¥j¥ùi¥òi¥ëi¥äi¥Ýi¥Öi¥Ïi¥Èi¥Ái¥ºi¥³i¥¬i¥¥i¥ži¥—i¥i¥‰i¥‚i¥{i¥ti¥mi¥fi¥_i¥Xi¥Qi¥Ji¥Ci¥e¥7e¥0e¥)e¥"e¥e¥e¥ e¥e¥ÿd¥ød¥ñd¥êd¥ãd¥Üd¥Õd¥Îd¥Çd¥Àd¥¹d¥²d¥«d¥¤d¥d¥–d¥d¥ˆd¥d¥zd¥sd¥ld¥ed¥^d¥Wd¥Pd¥Id¥Bd¥;d¥4d¥-d¥&d¥d¥d¥d¥ d¥d¥üc¥õc¥îc¥çc¥àc¥Ùc¥Òc¥Ëc¥Äc¥½c¥¶c¥¯c¥¨c¥¡c¥šc¥“c¥Œc¥…c¥~c¥wc¥pc¥ic¥bc¥[c¥Tc¥Mc¥Fc¥?c¥8c¥1c¥*c¥#c¥c¥c¥c¥c¥c¥ùb¥òb¥ëb¥äb¥Ýb¥Öb¥Ïb¥Èb¥Áb¥ºb¥³b¥¬b¥¥b¥žb¥—b¥b¥‰b¥‚b¥{b¥tb¥mb¥fb¥_b¥Xb¥Qb¥Jb¥Cb¥^¥7^¥0^¥)^¥"^¥^¥^¥ ^¥^¥ÿ]¥ø]¥ñ]¥ê]¥ã]¥Ü]¥Õ]¥Î]¥Ç]¥À]¥¹]¥²]¥«]¥¤]¥]¥–]¥]¥ˆ]¥]¥z]¥s]¥l]¥e]¥^]¥W]¥P]¥I]¥B]¥;]¥4]¥-]¥&]¥]¥]¥]¥ ]¥]¥ü\¥õ\¥î\¥ç\¥à\¥Ù\¥Ò\¥Ë\¥Ä\¥½\¥¶\¥¯\¥¨\¥¡\¥š\¥“\¥Œ\¥…\¥~\¥w\¥p\¥i\¥b\¥[\¥T\¥M\¥F\¥?\¥8\¥1\¥*\¥#\¥\¥\¥\¥\¥\¥ù[¥ò[¥ë[¥ä[¥Ý[¥Ö[¥Ï[¥È[¥Á[¥º[¥³[¥¬[¥¥[¥ž[¥—[¥[¥‰[¥‚[¥{[¥t[¥m[¥f[¥_[¥X[¥Q[¥J[¥C[¥<[¥5[¥.[¥'[¥ [¥[¥[¥ [¥[¥ýZ¥öZ¥ïZ¥èZ¥áZ¥ÚZ¥ÓZ¥ÌZ¥ÅZ¥¾Z¥·Z¥°Z¥©Z¥¢Z¥›Z¥”Z¥Z¥†Z¥Z¥xZ¥qZ¥jZ¥cZ¥\Z¥UZ¥NZ¥GZ¥@Z¥9Z¥2Z¥+Z¥$Z¥Z¥Z¥Z¥Z¥Z¥úY¥óY¥ìY¥åY¥ÞY¥×Y¥ÐY¥ÉY¥ÂY¥»Y¥´Y¥­Y¥¦Y¥ŸY¥˜Y¥‘Y¥ŠY¥ƒY¥|Y¥uY¥nY¥gY¥`Y¥YY¥RY¥KY¥DY¥=Y¥6Y¥/Y¥(Y¥!Y¥Y¥Y¥ Y¥Y¥þX¥÷X¥ðX¥éX¥âX¥ÛX¥ÔX¥ÍX¥ÆX¥¿X¥¸X¥±X¥ªX¥£X¥œX¥•X¥ŽX¥‡X¥€X¥yX¥rX¥kX¥dX¥]X¥VX¥OX¥HX¥AX¥:X¥3X¥,X¥%X¥X¥X¥X¥ X¥X¥ûW¥ôW¥íW¥æW¥ßW¥ØW¥ÑW¥ÊW¥ÃW¥¼W¥µW¥®W¥§W¥ W¥™W¥’W¥‹W¥„W¥}W¥vW¥oW¥hW¥aW¥ZW¥SW¥LW¥EW¥>W¥7W¥0W¥)W¥"W¥W¥W¥ W¥W¥ÿV¥øV¥ñV¥êV¥ãV¥ÜV¥ÕV¥ÎV¥ÇV¥ÀV¥¹V¥²V¥«V¥¤V¥V¥–V¥V¥ˆV¥V¥zV¥sV¥lV¥eV¥^V¥WV¥PV¥IV¥BV¥;V¥4V¥-V¥&V¥V¥V¥V¥ V¥V¥üU¥õU¥îU¥çU¥àU¥ÙU¥ÒU¥ËU¥ÄU¥½U¥¶U¥¯U¥¨U¥¡U¥šU¥“U¥ŒU¥…U¥~U¥wU¥pU¥iU¥bU¥[U¥TU¥MU¥FU¥?U¥8U¥1U¥*U¥#U¥U¥U¥U¥U¥U¥ùT¥òT¥ëT¥äT¥ÝT¥ÖT¥ÏT¥ÈT¥ÁT¥ºT¥³T¥¬T¥¥T¥žT¥—T¥T¥‰T¥‚T¥{T¥tT¥mT¥fT¥_T¥XT¥QT¥JT¥CT¥P¥7P¥0P¥)P¥"P¥P¥P¥ P¥P¥ÿO¥øO¥ñO¥êO¥ãO¥ÜO¥ÕO¥ÎO¥ÇO¥ÀO¥¹O¥²O¥«O¥¤O¥O¥–O¥O¥ˆO¥O¥zO¥sO¥lO¥eO¥^O¥WO¥PO¥IO¥BO¥;O¥4O¥-O¥&O¥O¥O¥O¥ O¥O¥üN¥õN¥îN¥çN¥àN¥ÙN¥ÒN¥ËN¥ÄN¥½N¥¶N¥¯N¥¨N¥¡N¥šN¥“N¥ŒN¥…N¥~N¥wN¥pN¥iN¥bN¥[N¥TN¥MN¥FN¥?N¥8N¥1N¥*N¥#N¥N¥N¥N¥N¥N¥ùM¥òM¥ëM¥äM¥ÝM¥ÖM¥ÏM¥ÈM¥ÁM¥ºM¥³M¥¬M¥¥M¥žM¥—M¥M¥‰M¥‚M¥{M¥tM¥mM¥fM¥_M¥XM¥QM¥JM¥CM¥I¥7I¥0I¥)I¥"I¥I¥I¥ I¥I¥ÿH¥øH¥ñH¥êH¥ãH¥ÜH¥ÕH¥ÎH¥ÇH¥ÀH¥¹H¥²H¥«H¥¤H¥H¥–H¥H¥ˆH¥H¥zH¥sH¥lH¥eH¥^H¥WH¥PH¥IH¥BH¥;H¥4H¥-H¥&H¥H¥H¥H¥ H¥H¥üG¥õG¥îG¥çG¥àG¥ÙG¥ÒG¥ËG¥ÄG¥½G¥¶G¥¯G¥¨G¥¡G¥šG¥“G¥ŒG¥…G¥~G¥wG¥pG¥iG¥bG¥[G¥TG¥MG¥FG¥?G¥8G¥1G¥*G¥#G¥G¥G¥G¥G¥G¥ùF¥òF¥ëF¥äF¥ÝF¥ÖF¥ÏF¥ÈF¥ÁF¥ºF¥³F¥¬F¥¥F¥žF¥—F¥F¥‰F¥‚F¥{F¥tF¥mF¥fF¥_F¥XF¥QF¥JF¥CF¥B¥7B¥0B¥)B¥"B¥B¥B¥ B¥B¥ÿA¥øA¥ñA¥êA¥ãA¥ÜA¥ÕA¥ÎA¥ÇA¥ÀA¥¹A¥²A¥«A¥¤A¥A¥–A¥A¥ˆA¥A¥zA¥sA¥lA¥eA¥^A¥WA¥PA¥IA¥BA¥;A¥4A¥-A¥&A¥A¥A¥A¥ A¥A¥ü@¥õ@¥î@¥ç@¥à@¥Ù@¥Ò@¥Ë@¥Ä@¥½@¥¶@¥¯@¥¨@¥¡@¥š@¥“@¥Œ@¥…@¥~@¥w@¥p@¥i@¥b@¥[@¥T@¥M@¥F@¥?@¥8@¥1@¥*@¥#@¥@¥@¥@¥@¥@¥ù?¥ò?¥ë?¥ä?¥Ý?¥Ö?¥Ï?¥È?¥Á?¥º?¥³?¥¬?¥¥?¥ž?¥—?¥?¥‰?¥‚?¥{?¥t?¥m?¥f?¥_?¥X?¥Q?¥J?¥C?¥¥ö>¥ï>¥è>¥á>¥Ú>¥Ó>¥Ì>¥Å>¥¾>¥·>¥°>¥©>¥¢>¥›>¥”>¥>¥†>¥>¥x>¥q>¥j>¥c>¥\>¥U>¥N>¥G>¥@>¥9>¥2>¥+>¥$>¥>¥>¥>¥>¥>¥ú=¥ó=¥ì=¥å=¥Þ=¥×=¥Ð=¥É=¥Â=¥»=¥´=¥­=¥¦=¥Ÿ=¥˜=¥‘=¥Š=¥ƒ=¥|=¥u=¥n=¥g=¥`=¥Y=¥R=¥K=¥D=¥==¥6=¥/=¥(=¥!=¥=¥=¥ =¥=¥þ<¥÷<¥ð<¥é<¥â<¥Û<¥Ô<¥Í<¥Æ<¥¿<¥¸<¥±<¥ª<¥£<¥œ<¥•<¥Ž<¥‡<¥€<¥y<¥r<¥k<¥d<¥]<¥V<¥O<¥H<¥A<¥:<¥3<¥,<¥%<¥<¥<¥<¥ <¥<¥û;¥ô;¥í;¥æ;¥ß;¥Ø;¥Ñ;¥Ê;¥Ã;¥¼;¥µ;¥®;¥§;¥ ;¥™;¥’;¥‹;¥„;¥};¥v;¥o;¥h;¥a;¥Z;¥S;¥L;¥E;¥>;¥7;¥0;¥);¥";¥;¥;¥ ;¥;¥ÿ:¥ø:¥ñ:¥ê:¥ã:¥Ü:¥Õ:¥Î:¥Ç:¥À:¥¹:¥²:¥«:¥¤:¥:¥–:¥:¥ˆ:¥:¥z:¥s:¥l:¥e:¥^:¥W:¥P:¥I:¥B:¥;:¥4:¥-:¥&:¥:¥:¥:¥ :¥:¥ü9¥õ9¥î9¥ç9¥à9¥Ù9¥Ò9¥Ë9¥Ä9¥½9¥¶9¥¯9¥¨9¥¡9¥š9¥“9¥Œ9¥…9¥~9¥w9¥p9¥i9¥b9¥[9¥T9¥M9¥F9¥?9¥89¥19¥*9¥#9¥9¥9¥9¥9¥9¥ù8¥ò8¥ë8¥ä8¥Ý8¥Ö8¥Ï8¥È8¥Á8¥º8¥³8¥¬8¥¥8¥ž8¥—8¥8¥‰8¥‚8¥{8¥t8¥m8¥f8¥_8¥X8¥Q8¥J8¥C8¥<8¥58¥.8¥'8¥ 8¥8¥8¥ 8¥8¥ý7¥ö7¥ï7¥è7¥á7¥Ú7¥Ó7¥Ì7¥Å7¥¾7¥·7¥°7¥©7¥¢7¥›7¥”7¥7¥†7¥7¥x7¥q7¥j7¥c7¥\7¥U7¥N7¥G7¥@7¥97¥27¥+7¥$7¥7¥7¥7¥7¥7¥ú6¥ó6¥ì6¥å6¥Þ6¥×6¥Ð6¥É6¥Â6¥»6¥´6¥­6¥¦6¥Ÿ6¥˜6¥‘6¥Š6¥ƒ6¥|6¥u6¥n6¥g6¥`6¥Y6¥R6¥K6¥D6¥=6¥66¥/6¥(6¥!6¥6¥6¥ 6¥6¥þ5¥÷5¥ð5¥é5¥â5¥Û5¥Ô5¥Í5¥Æ5¥¿5¥¸5¥±5¥ª5¥£5¥œ5¥•5¥Ž5¥‡5¥€5¥y5¥r5¥k5¥d5¥]5¥V5¥O5¥H5¥A5¥:5¥35¥,5¥%5¥5¥5¥5¥ 5¥5¥û4¥ô4¥í4¥æ4¥ß4¥Ø4¥Ñ4¥Ê4¥Ã4¥¼4¥µ4¥®4¥§4¥ 4¥™4¥’4¥‹4¥„4¥}4¥v4¥o4¥h4¥a4¥Z4¥S4¥L4¥E4¥>4¥74¥04¥)4¥"4¥4¥4¥ 4¥4¥ÿ3¥ø3¥ñ3¥ê3¥ã3¥Ü3¥Õ3¥Î3¥Ç3¥À3¥¹3¥²3¥«3¥¤3¥3¥–3¥3¥ˆ3¥3¥z3¥s3¥l3¥e3¥^3¥W3¥P3¥I3¥B3¥;3¥43¥-3¥&3¥3¥3¥3¥ 3¥3¥ü2¥õ2¥î2¥ç2¥à2¥Ù2¥Ò2¥Ë2¥Ä2¥½2¥¶2¥¯2¥¨2¥¡2¥š2¥“2¥Œ2¥…2¥~2¥w2¥p2¥i2¥b2¥[2¥T2¥M2¥F2¥?2¥82¥12¥*2¥#2¥2¥2¥2¥2¥2¥ù1¥ò1¥ë1¥ä1¥Ý1¥Ö1¥Ï1¥È1¥Á1¥º1¥³1¥¬1¥¥1¥ž1¥—1¥1¥‰1¥‚1¥{1¥t1¥m1¥f1¥_1¥X1¥Q1¥J1¥C1¥<1¥51¥.1¥'1¥ 1¥1¥1¥ 1¥1¥ý0¥ö0¥ï0¥è0¥á0¥Ú0¥Ó0¥Ì0¥Å0¥¾0¥·0¥°0¥©0¥¢0¥›0¥”0¥0¥†0¥0¥x0¥q0¥j0¥c0¥\0¥U0¥N0¥G0¥@0¥90¥20¥+0¥$0¥0¥0¥0¥0¥0¥ú/¥ó/¥ì/¥å/¥Þ/¥×/¥Ð/¥É/¥Â/¥»/¥´/¥­/¥¦/¥Ÿ/¥˜/¥‘/¥Š/¥ƒ/¥|/¥u/¥n/¥g/¥`/¥Y/¥R/¥K/¥D/¥=/¥6/¥//¥(/¥!/¥/¥/¥ /¥/¥þ.¥÷.¥ð.¥é.¥â.¥Û.¥Ô.¥Í.¥Æ.¥¿.¥¸.¥±.¥ª.¥£.¥œ.¥•.¥Ž.¥‡.¥€.¥y.¥r.¥k.¥d.¥].¥V.¥O.¥H.¥A.¥:.¥3.¥,.¥%.¥.¥.¥.¥ .¥.¥û-¥ô-¥í-¥æ-¥ß-¥Ø-¥Ñ-¥Ê-¥Ã-¥¼-¥µ-¥®-¥§-¥ -¥™-¥’-¥‹-¥„-¥}-¥v-¥o-¥h-¥a-¥Z-¥S-¥L-¥E-¥>-¥7-¥0-¥)-¥"-¥-¥-¥ -¥-¥ÿ,¥ø,¥ñ,¥ê,¥ã,¥Ü,¥Õ,¥Î,¥Ç,¥À,¥¹,¥²,¥«,¥¤,¥,¥–,¥,¥ˆ,¥,¥z,¥s,¥l,¥e,¥^,¥W,¥P,¥I,¥B,¥;,¥4,¥-,¥&,¥,¥,¥,¥ ,¥,¥ü+¥õ+¥î+¥ç+¥à+¥Ù+¥Ò+¥Ë+¥Ä+¥½+¥¶+¥¯+¥¨+¥¡+¥š+¥“+¥Œ+¥…+¥~+¥w+¥p+¥i+¥b+¥[+¥T+¥M+¥F+¥?+¥8+¥1+¥*+¥#+¥+¥+¥+¥+¥+¥ù*¥ò*¥ë*¥ä*¥Ý*¥Ö*¥Ï*¥È*¥Á*¥º*¥³*¥¬*¥¥*¥ž*¥—*¥*¥‰*¥‚*¥{*¥t*¥m*¥f*¥_*¥X*¥Q*¥J*¥C*¥<*¥5*¥.*¥'*¥ *¥*¥*¥ *¥*¥ý)¥ö)¥ï)¥è)¥á)¥Ú)¥Ó)¥Ì)¥Å)¥¾)¥·)¥°)¥©)¥¢)¥›)¥”)¥)¥†)¥)¥x)¥q)¥j)¥c)¥\)¥U)¥N)¥G)¥@)¥9)¥2)¥+)¥$)¥)¥)¥)¥)¥)¥ú(¥ó(¥ì(¥å(¥Þ(¥×(¥Ð(¥É(¥Â(¥»(¥´(¥­(¥¦(¥Ÿ(¥˜(¥‘(¥Š(¥ƒ(¥|(¥u(¥n(¥g(¥`(¥Y(¥R(¥K(¥D(¥=(¥6(¥/(¥((¥!(¥(¥(¥ (¥(¥þ'¥÷'¥ð'¥é'¥â'¥Û'¥Ô'¥Í'¥Æ'¥¿'¥¸'¥±'¥ª'¥£'¥œ'¥•'¥Ž'¥‡'¥€'¥y'¥r'¥k'¥d'¥]'¥V'¥O'¥H'¥A'¥:'¥3'¥,'¥%'¥'¥'¥'¥ '¥'¥û&¥ô&¥í&¥æ&¥ß&¥Ø&¥Ñ&¥Ê&¥Ã&¥¼&¥µ&¥®&¥§&¥ &¥™&¥’&¥‹&¥„&¥}&¥v&¥o&¥h&¥a&¥Z&¥S&¥L&¥E&¥>&¥7&¥0&¥)&¥"&¥&¥&¥ &¥&¥ÿ%¥ø%¥ñ%¥ê%¥ã%¥Ü%¥Õ%¥Î%¥Ç%¥À%¥¹%¥²%¥«%¥¤%¥%¥–%¥%¥ˆ%¥%¥z%¥s%¥l%¥e%¥^%¥W%¥P%¥I%¥B%¥;%¥4%¥-%¥&%¥%¥%¥%¥ %¥%¥ü$¥õ$¥î$¥ç$¥à$¥Ù$¥Ò$¥Ë$¥Ä$¥½$¥¶$¥¯$¥¨$¥¡$¥š$¥“$¥Œ$¥…$¥~$¥w$¥p$¥i$¥b$¥[$¥T$¥M$¥F$¥?$¥8$¥1$¥*$¥#$¥$¥$¥$¥$¥$¥ù#¥ò#¥ë#¥ä#¥Ý#¥Ö#¥Ï#¥È#¥Á#¥º#¥³#¥¬#¥¥#¥ž#¥—#¥#¥‰#¥‚#¥{#¥t#¥m#¥f#¥_#¥X#¥Q#¥J#¥C#¥<#¥5#¥.#¥'#¥ #¥#¥#¥ #¥#¥ý"¥ö"¥ï"¥è"¥á"¥Ú"¥Ó"¥Ì"¥Å"¥¾"¥·"¥°"¥©"¥¢"¥›"¥”"¥"¥†"¥"¥x"¥q"¥j"¥c"¥\"¥U"¥N"¥G"¥@"¥9"¥2"¥+"¥$"¥"¥"¥"¥"¥"¥ú!¥ó!¥ì!¥å!¥Þ!¥×!¥Ð!¥É!¥Â!¥»!¥´!¥­!¥¦!¥Ÿ!¥˜!¥‘!¥Š!¥ƒ!¥|!¥u!¥n!¥g!¥`!¥Y!¥R!¥K!¥D!¥=!¥6!¥/!¥(!¥!!¥!¥!¥ !¥!¥þ ¥÷ ¥ð ¥é ¥â ¥Û ¥Ô ¥Í ¥Æ ¥¿ ¥¸ ¥± ¥ª ¥£ ¥œ ¥• ¥Ž ¥‡ ¥€ ¥y ¥r ¥k ¥d ¥] ¥V ¥O ¥H ¥A ¥: ¥3 ¥, ¥% ¥ ¥ ¥ ¥ ¥ ¥û¥ô¥í¥æ¥ß¥Ø¥Ñ¥Ê¥Ã¥¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¥ô¥í¥æ¥ß¥Ø¥Ñ¥Ê¥Ã¥¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¥ô¥í¥æ¥ß¥Ø¥Ñ¥Ê¥Ã¥¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý ¥ö ¥ï ¥è ¥á ¥Ú ¥Ó ¥Ì ¥Å ¥¾ ¥· ¥° ¥© ¥¢ ¥› ¥” ¥ ¥† ¥ ¥x ¥q ¥j ¥c ¥\ ¥U ¥N ¥G ¥@ ¥9 ¥2 ¥+ ¥$ ¥ ¥ ¥ ¥ ¥ ¥ú ¥ó ¥ì ¥å ¥Þ ¥× ¥Ð ¥É ¥ ¥» ¥´ ¥­ ¥¦ ¥Ÿ ¥˜ ¥‘ ¥Š ¥ƒ ¥| ¥u ¥n ¥g ¥` ¥Y ¥R ¥K ¥D ¥= ¥6 ¥/ ¥( ¥! ¥ ¥ ¥ ¥ ¥þ ¥÷ ¥ð ¥é ¥â ¥Û ¥Ô ¥Í ¥Æ ¥¿ ¥¸ ¥± ¥ª ¥£ ¥œ ¥• ¥Ž ¥‡ ¥€ ¥y ¥r ¥k ¥d ¥] ¥V ¥O ¥H ¥A ¥: ¥3 ¥, ¥% ¥ ¥ ¥ ¥ ¥ ¥û ¥ô ¥í ¥æ ¥ß ¥Ø ¥Ñ ¥Ê ¥à ¥¼ ¥µ ¥® ¥§ ¥  ¥™ ¥’ ¥‹ ¥„ ¥} ¥v ¥o ¥h ¥a ¥Z ¥S ¥L ¥E ¥> ¥7 ¥0 ¥) ¥" ¥ ¥ ¥ ¥ ¥ÿ ¥ø ¥ñ ¥ê ¥ã ¥Ü ¥Õ ¥Î ¥Ç ¥À ¥¹ ¥² ¥« ¥¤ ¥ ¥– ¥ ¥ˆ ¥ ¥z ¥s ¥l ¥e ¥^ ¥W ¥P ¥I ¥B ¥; ¥4 ¥- ¥& ¥ ¥ ¥ ¥ ¥ ¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¥ô¥í¥æ¥ß¥Ø¥Ñ¥Ê¥Ã¥¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ýÿ¤öÿ¤ïÿ¤èÿ¤áÿ¤Úÿ¤Óÿ¤Ìÿ¤Åÿ¤¾ÿ¤·ÿ¤°ÿ¤©ÿ¤¢ÿ¤›ÿ¤”ÿ¤ÿ¤†ÿ¤ÿ¤xÿ¤qÿ¤jÿ¤cÿ¤\ÿ¤Uÿ¤Nÿ¤Gÿ¤@ÿ¤9ÿ¤2ÿ¤+ÿ¤$ÿ¤ÿ¤ÿ¤ÿ¤ÿ¤ÿ¤úþ¤óþ¤ìþ¤åþ¤Þþ¤×þ¤Ðþ¤Éþ¤Âþ¤»þ¤´þ¤­þ¤¦þ¤Ÿþ¤˜þ¤‘þ¤Šþ¤ƒþ¤|þ¤uþ¤nþ¤gþ¤`þ¤Yþ¤Rþ¤Kþ¤Dþ¤=þ¤6þ¤/þ¤(þ¤!þ¤þ¤þ¤ þ¤þ¤þý¤÷ý¤ðý¤éý¤âý¤Ûý¤Ôý¤Íý¤Æý¤¿ý¤¸ý¤±ý¤ªý¤£ý¤œý¤•ý¤Žý¤‡ý¤€ý¤yý¤rý¤ký¤dý¤]ý¤Vý¤Oý¤Hý¤Aý¤:ý¤3ý¤,ý¤%ý¤ý¤ý¤ý¤ ý¤ý¤ûü¤ôü¤íü¤æü¤ßü¤Øü¤Ñü¤Êü¤Ãü¤¼ü¤µü¤®ü¤§ü¤ ü¤™ü¤’ü¤‹ü¤„ü¤}ü¤vü¤oü¤hü¤aü¤Zü¤Sü¤Lü¤Eü¤>ü¤7ü¤0ü¤)ü¤"ü¤ü¤ü¤ ü¤ü¤ÿû¤øû¤ñû¤êû¤ãû¤Üû¤Õû¤Îû¤Çû¤Àû¤¹û¤²û¤«û¤¤û¤û¤–û¤û¤ˆû¤û¤zû¤sû¤lû¤eû¤^û¤Wû¤Pû¤Iû¤Bû¤;û¤4û¤-û¤&û¤û¤û¤û¤ û¤û¤üú¤õú¤îú¤çú¤àú¤Ùú¤Òú¤Ëú¤Äú¤½ú¤¶ú¤¯ú¤¨ú¤¡ú¤šú¤“ú¤Œú¤…ú¤~ú¤wú¤pú¤iú¤bú¤[ú¤Tú¤Mú¤Fú¤?ú¤8ú¤1ú¤*ú¤#ú¤ú¤ú¤ú¤ú¤ú¤ùù¤òù¤ëù¤äù¤Ýù¤Öù¤Ïù¤Èù¤Áù¤ºù¤³ù¤¬ù¤¥ù¤žù¤—ù¤ù¤‰ù¤‚ù¤{ù¤tù¤mù¤fù¤_ù¤Xù¤Qù¤Jù¤Cù¤<ù¤5ù¤.ù¤'ù¤ ù¤ù¤ù¤ ù¤ù¤ýø¤öø¤ïø¤èø¤áø¤Úø¤Óø¤Ìø¤Åø¤¾ø¤·ø¤°ø¤©ø¤¢ø¤›ø¤”ø¤ø¤†ø¤ø¤xø¤qø¤jø¤cø¤\ø¤Uø¤Nø¤Gø¤@ø¤9ø¤2ø¤+ø¤$ø¤ø¤ø¤ø¤ø¤ø¤ú÷¤ó÷¤ì÷¤å÷¤Þ÷¤×÷¤Ð÷¤É÷¤Â÷¤»÷¤´÷¤­÷¤¦÷¤Ÿ÷¤˜÷¤‘÷¤Š÷¤ƒ÷¤|÷¤u÷¤n÷¤g÷¤`÷¤Y÷¤R÷¤K÷¤D÷¤=÷¤6÷¤/÷¤(÷¤!÷¤÷¤÷¤ ÷¤÷¤þö¤÷ö¤ðö¤éö¤âö¤Ûö¤Ôö¤Íö¤Æö¤¿ö¤¸ö¤±ö¤ªö¤£ö¤œö¤•ö¤Žö¤‡ö¤€ö¤yö¤rö¤kö¤dö¤]ö¤Vö¤Oö¤Hö¤Aö¤:ö¤3ö¤,ö¤%ö¤ö¤ö¤ö¤ ö¤ö¤ûõ¤ôõ¤íõ¤æõ¤ßõ¤Øõ¤Ñõ¤Êõ¤Ãõ¤¼õ¤µõ¤®õ¤§õ¤ õ¤™õ¤’õ¤‹õ¤„õ¤}õ¤võ¤oõ¤hõ¤aõ¤Zõ¤Sõ¤Lõ¤Eõ¤>õ¤7õ¤0õ¤)õ¤"õ¤õ¤õ¤ õ¤õ¤ÿô¤øô¤ñô¤êô¤ãô¤Üô¤Õô¤Îô¤Çô¤Àô¤¹ô¤²ô¤«ô¤¤ô¤ô¤–ô¤ô¤ˆô¤ô¤zô¤sô¤lô¤eô¤^ô¤Wô¤Pô¤Iô¤Bô¤;ô¤4ô¤-ô¤&ô¤ô¤ô¤ô¤ ô¤ô¤üó¤õó¤îó¤çó¤àó¤Ùó¤Òó¤Ëó¤Äó¤½ó¤¶ó¤¯ó¤¨ó¤¡ó¤šó¤“ó¤Œó¤…ó¤~ó¤wó¤pó¤ió¤bó¤[ó¤Tó¤Mó¤Fó¤?ó¤8ó¤1ó¤*ó¤#ó¤ó¤ó¤ó¤ó¤ó¤ùò¤òò¤ëò¤äò¤Ýò¤Öò¤Ïò¤Èò¤Áò¤ºò¤³ò¤¬ò¤¥ò¤žò¤—ò¤ò¤‰ò¤‚ò¤{ò¤tò¤mò¤fò¤_ò¤Xò¤Qò¤Jò¤Cò¤<ò¤5ò¤.ò¤'ò¤ ò¤ò¤ò¤ ò¤ò¤ýñ¤öñ¤ïñ¤èñ¤áñ¤Úñ¤Óñ¤Ìñ¤Åñ¤¾ñ¤·ñ¤°ñ¤©ñ¤¢ñ¤›ñ¤”ñ¤ñ¤†ñ¤ñ¤xñ¤qñ¤jñ¤cñ¤\ñ¤Uñ¤Nñ¤Gñ¤@ñ¤9ñ¤2ñ¤+ñ¤$ñ¤ñ¤ñ¤ñ¤ñ¤ñ¤úð¤óð¤ìð¤åð¤Þð¤×ð¤Ðð¤Éð¤Âð¤»ð¤´ð¤­ð¤¦ð¤Ÿð¤˜ð¤‘ð¤Šð¤ƒð¤|ð¤uð¤nð¤gð¤`ð¤Yð¤Rð¤Kð¤Dð¤=ð¤6ð¤/ð¤(ð¤!ð¤ð¤ð¤ ð¤ð¤þï¤÷ï¤ðï¤éï¤âï¤Ûï¤Ôï¤Íï¤Æï¤¿ï¤¸ï¤±ï¤ªï¤£ï¤œï¤•ï¤Žï¤‡ï¤€ï¤yï¤rï¤kï¤dï¤]ï¤Vï¤Oï¤Hï¤Aï¤:ï¤3ï¤,ï¤%ï¤ï¤ï¤ï¤ ï¤ï¤ûî¤ôî¤íî¤æî¤ßî¤Øî¤Ñî¤Êî¤Ãî¤}î¤vî¤oî¤hî¤aî¤Zî¤Sî¤Lî¤Eî¤>î¤7î¤0î¤)î¤"î¤î¤î¤ î¤î¤ÿí¤øí¤ñí¤êí¤ãí¤Üí¤Õí¤Îí¤Çí¤Àí¤¹í¤²í¤«í¤¤í¤í¤–í¤í¤ˆí¤í¤zí¤sí¤lí¤eí¤^í¤Wí¤Pí¤Ií¤Bí¤;í¤4í¤-í¤&í¤í¤í¤í¤ í¤í¤üì¤õì¤îì¤çì¤àì¤Ùì¤Òì¤Ëì¤Ä줽줶줯줨줡줚줓줌줅ì¤~ì¤wì¤pì¤iì¤bì¤[ì¤Tì¤Mì¤Fì¤?ì¤8ì¤1ì¤*ì¤#ì¤ì¤ì¤ì¤ì¤ì¤ùë¤òë¤ëë¤äë¤Ýë¤Öë¤Ïë¤Èë¤Á뤺뤳뤬뤥뤞뤗ë¤ë¤‰ë¤‚ë¤{ë¤të¤më¤fë¤_ë¤Xë¤Që¤Jë¤Cë¤<ë¤5ë¤.ë¤'ë¤ ë¤ë¤ë¤ ë¤ë¤ýê¤öê¤ïê¤èê¤áê¤Úê¤Óê¤Ìê¤Åꤾꤷꤰꤩꤢꤛꤔê¤ê¤†ê¤ê¤xê¤qê¤jê¤cê¤\ê¤Uê¤Nê¤Gê¤@ê¤9ê¤2ê¤+ê¤$ê¤ê¤ê¤ê¤ê¤ê¤úé¤óé¤ìé¤åé¤Þé¤×é¤Ðé¤Éé¤Â餻餴餭餦餟餘餑養餃é¤|é¤ué¤né¤gé¤`é¤Yé¤Ré¤Ké¤Dé¤=é¤6é¤/é¤(é¤!é¤é¤é¤ é¤é¤þè¤÷è¤ðè¤éè¤âè¤Ûè¤Ôè¤Íè¤Æè¤¿è¤¸è¤±è¤ªè¤£è¤œè¤•è¤Žè¤‡è¤€è¤yè¤rè¤kè¤dè¤]è¤Vè¤Oè¤Hè¤Aè¤:è¤3è¤,è¤%è¤è¤è¤è¤ è¤è¤ûç¤ôç¤íç¤æç¤ßç¤Øç¤Ñç¤Êç¤Ã礼礵礮礧礠礙礒礋礄ç¤}ç¤vç¤oç¤hç¤aç¤Zç¤Sç¤Lç¤Eç¤>ç¤7ç¤0ç¤)ç¤"ç¤ç¤ç¤ ç¤ç¤ÿæ¤øæ¤ñæ¤êæ¤ãæ¤Üæ¤Õæ¤Îæ¤Çæ¤Àæ¤¹æ¤²æ¤«æ¤¤æ¤æ¤–æ¤æ¤ˆæ¤æ¤zæ¤sæ¤læ¤eæ¤^æ¤Wæ¤Pæ¤Iæ¤Bæ¤;æ¤4æ¤-æ¤&æ¤æ¤æ¤æ¤ æ¤æ¤üå¤õå¤îå¤çå¤àå¤Ùå¤Òå¤Ëå¤Ä夽夶夯夨夡多夓夌夅å¤~å¤wå¤på¤iå¤bå¤[å¤Tå¤Må¤Få¤?å¤8å¤1å¤*å¤#å¤å¤å¤å¤å¤å¤ùä¤òä¤ëä¤ää¤Ýä¤Öä¤Ïä¤Èä¤Á䤺䤳䤬䤥䤞䤗ä¤ä¤‰ä¤‚ä¤{ä¤tä¤mä¤fä¤_ä¤Xä¤Qä¤Jä¤Cä¤<ä¤5ä¤.ä¤'ä¤ ä¤ä¤ä¤ ä¤ä¤ýã¤öã¤ïã¤èã¤áã¤Úã¤Óã¤Ìã¤Å㤾㤷㤰㤩㤢㤛㤔ã¤ã¤†ã¤ã¤xã¤qã¤jã¤cã¤\ã¤Uã¤Nã¤Gã¤@ã¤9ã¤2ã¤+ã¤$ã¤ã¤ã¤ã¤ã¤ã¤úâ¤óâ¤ìâ¤åâ¤Þâ¤×â¤Ðâ¤Éâ¤Â⤻⤴⤭⤦⤟⤘⤑⤊⤃â¤|â¤uâ¤nâ¤gâ¤`â¤Yâ¤Râ¤Kâ¤Dâ¤=â¤6â¤/â¤(â¤!â¤â¤â¤ â¤â¤þá¤÷á¤ðá¤éá¤âá¤Ûá¤Ôá¤Íá¤Æá¤¿á¤¸á¤±á¤ªá¤£á¤œá¤•á¤Žá¤‡á¤€á¤yá¤rá¤ká¤dá¤]á¤Vá¤Oá¤Há¤Aá¤:á¤3á¤,á¤%á¤á¤á¤á¤ á¤á¤ûà¤ôà¤íà¤æà¤ßà¤Øà¤Ñà¤Êà¤Ã़वमधठङऒऋऄà¤}à¤và¤oà¤hà¤aà¤Zà¤Sà¤Là¤Eà¤>à¤7à¤0à¤)à¤"à¤à¤à¤ à¤à¤ÿߤøß¤ñߤêߤãߤÜߤÕߤÎߤÇߤÀߤ¹ß¤²ß¤«ß¤¤ß¤ߤ–ߤߤˆß¤ߤzߤsߤlߤeߤ^ߤWߤPߤIߤBߤ;ߤ4ߤ-ߤ&ߤߤߤߤ ߤߤüÞ¤õÞ¤îÞ¤çÞ¤àÞ¤ÙÞ¤ÒÞ¤ËÞ¤ÄÞ¤½Þ¤¶Þ¤¯Þ¤¨Þ¤¡Þ¤šÞ¤“Þ¤ŒÞ¤…Þ¤~Þ¤wÞ¤pÞ¤iÞ¤bÞ¤[Þ¤TÞ¤MÞ¤FÞ¤?Þ¤8Þ¤1Þ¤*Þ¤#Þ¤Þ¤Þ¤Þ¤Þ¤Þ¤ùݤòݤëݤäݤÝݤÖݤÏݤÈݤÁݤºÝ¤³Ý¤¬Ý¤¥Ý¤žÝ¤—ݤݤ‰Ý¤‚ݤ{ݤtݤmݤfݤ_ݤXݤQݤJݤCݤ<ݤ5ݤ.ݤ'ݤ ݤݤݤ ݤݤýܤöܤïܤèܤáܤÚܤÓܤÌܤÅܤ¾Ü¤·Ü¤°Ü¤©Ü¤¢Ü¤›Ü¤”ܤܤ†Ü¤ܤxܤqܤjܤcܤ\ܤUܤNܤGܤ@ܤ9ܤ2ܤ+ܤ$ܤܤܤܤܤܤúÛ¤óÛ¤ìÛ¤åÛ¤ÞÛ¤×Û¤ÐÛ¤ÉÛ¤ÂÛ¤»Û¤´Û¤­Û¤¦Û¤ŸÛ¤˜Û¤‘Û¤ŠÛ¤ƒÛ¤|Û¤uÛ¤nÛ¤gÛ¤`Û¤YÛ¤RÛ¤KÛ¤DÛ¤=Û¤6Û¤/Û¤(Û¤!Û¤Û¤Û¤ Û¤Û¤þÚ¤÷Ú¤ðÚ¤éÚ¤âÚ¤ÛÚ¤ÔÚ¤ÍÚ¤ÆÚ¤¿Ú¤¸Ú¤±Ú¤ªÚ¤£Ú¤œÚ¤•Ú¤ŽÚ¤‡Ú¤€Ú¤yÚ¤rÚ¤kÚ¤dÚ¤]Ú¤VÚ¤OÚ¤HÚ¤AÚ¤:Ú¤3Ú¤,Ú¤%Ú¤Ú¤Ú¤Ú¤ Ú¤Ú¤ûÙ¤ôÙ¤íÙ¤æÙ¤ßÙ¤ØÙ¤ÑÙ¤ÊÙ¤ÃÙ¤¼Ù¤µÙ¤®Ù¤§Ù¤ Ù¤™Ù¤’Ù¤‹Ù¤„Ù¤}Ù¤vÙ¤oÙ¤hÙ¤aÙ¤ZÙ¤SÙ¤LÙ¤EÙ¤>Ù¤7Ù¤0Ù¤)Ù¤"٤٤٤ ٤٤ÿؤøØ¤ñؤêØ¤ãØ¤ÜØ¤ÕØ¤ÎØ¤ÇؤÀؤ¹Ø¤²Ø¤«Ø¤¤Ø¤ؤ–ؤؤˆØ¤ؤzؤsؤlؤeؤ^ؤWؤPؤIؤBؤ;ؤ4ؤ-ؤ&ؤؤؤؤ ؤؤüפõפîפçפàפÙפÒפËפÄפ½×¤¶×¤¯×¤¨×¤¡×¤š×¤“פŒ×¤…פ~פwפpפiפbפ[פTפMפFפ?פ8פ1פ*פ#פפפפפפùÖ¤òÖ¤ëÖ¤äÖ¤ÝÖ¤ÖÖ¤ÏÖ¤ÈÖ¤ÁÖ¤ºÖ¤³Ö¤¬Ö¤¥Ö¤žÖ¤—Ö¤Ö¤‰Ö¤‚Ö¤{Ö¤tÖ¤mÖ¤fÖ¤_Ö¤XÖ¤QÖ¤JÖ¤CÖ¤<Ö¤5Ö¤.Ö¤'Ö¤ Ö¤Ö¤Ö¤ Ö¤Ö¤ýÕ¤öÕ¤ïÕ¤èÕ¤áÕ¤ÚÕ¤ÓÕ¤ÌÕ¤ÅÕ¤¾Õ¤·Õ¤°Õ¤©Õ¤¢Õ¤›Õ¤”Õ¤Õ¤†Õ¤Õ¤xÕ¤qÕ¤jÕ¤cÕ¤\Õ¤UÕ¤NÕ¤GÕ¤@Õ¤9Õ¤2Õ¤+Õ¤$Õ¤Õ¤Õ¤Õ¤Õ¤Õ¤úÔ¤óÔ¤ìÔ¤åÔ¤ÞÔ¤×Ô¤ÐÔ¤ÉÔ¤ÂÔ¤»Ô¤´Ô¤­Ô¤¦Ô¤ŸÔ¤˜Ô¤‘Ô¤ŠÔ¤ƒÔ¤|Ô¤uÔ¤nÔ¤gÔ¤`Ô¤YÔ¤RÔ¤KÔ¤DÔ¤=Ô¤6Ô¤/Ô¤(Ô¤!Ô¤Ô¤Ô¤ Ô¤Ô¤þÓ¤÷Ó¤ðÓ¤éÓ¤âÓ¤ÛÓ¤ÔÓ¤ÍÓ¤ÆÓ¤¿Ó¤¸Ó¤±Ó¤ªÓ¤£Ó¤œÓ¤•Ó¤ŽÓ¤‡Ó¤€Ó¤yÓ¤rÓ¤kÓ¤dÓ¤]Ó¤VÓ¤OÓ¤HÓ¤AÓ¤:Ó¤3Ó¤,Ó¤%Ó¤Ó¤Ó¤Ó¤ Ó¤Ó¤ûÒ¤ôÒ¤íÒ¤æÒ¤ßÒ¤ØÒ¤ÑÒ¤ÊÒ¤ÃÒ¤¼Ò¤µÒ¤®Ò¤§Ò¤ Ò¤™Ò¤’Ò¤‹Ò¤„Ò¤}Ò¤vÒ¤oÒ¤hÒ¤aÒ¤ZÒ¤SÒ¤LÒ¤EÒ¤>Ò¤7Ò¤0Ò¤)Ò¤"Ò¤Ò¤Ò¤ Ò¤Ò¤ÿѤøÑ¤ñѤêѤãѤÜѤÕѤÎѤÇѤÀѤ¹Ñ¤²Ñ¤«Ñ¤¤Ñ¤Ѥ–ѤѤˆÑ¤ѤzѤsѤlѤeѤ^ѤWѤPѤIѤBѤ;Ѥ4Ѥ-Ѥ&ѤѤѤѤ ѤѤüФõФîФçФàФÙФÒФËФÄФ½Ð¤¶Ð¤¯Ð¤¨Ð¤¡Ð¤šÐ¤“ФŒÐ¤…Ф~ФwФpФiФbФ[ФTФMФFФ?Ф8Ф1Ф*Ф#ФФФФФФùϤòϤëϤäϤÝϤÖϤÏϤÈϤÁϤºÏ¤³Ï¤¬Ï¤¥Ï¤žÏ¤—ϤϤ‰Ï¤‚Ϥ{ϤtϤmϤfϤ_ϤXϤQϤJϤCϤ<Ϥ5Ϥ.Ϥ'Ϥ ϤϤϤ ϤϤýΤöΤïΤèΤáΤÚΤÓΤÌΤÅΤ¾Î¤·Î¤°Î¤©Î¤¢Î¤›Î¤”ΤΤ†Î¤ΤxΤqΤjΤcΤ\ΤUΤNΤGΤ@Τ9Τ2Τ+Τ$ΤΤΤΤΤΤúͤóͤìͤåͤÞͤ×ͤÐͤÉͤÂͤ»Í¤´Í¤­Í¤¦Í¤ŸÍ¤˜Í¤‘ͤŠÍ¤ƒÍ¤|ͤuͤnͤgͤ`ͤYͤRͤKͤDͤ=ͤ6ͤ/ͤ(ͤ!ͤͤͤ ͤͤþ̤÷̤ð̤é̤â̤Ṳ̂Ô̤Í̤ÆÌ¤¿Ì¤¸Ì¤±Ì¤ªÌ¤£Ì¤œÌ¤•̤ŽÌ¤‡Ì¤€Ì¤y̤r̤k̤d̤]̤V̤O̤H̤A̤:̤3̤,̤%̤̤̤̤ ̤̤ûˤôˤíˤæË¤ßˤØË¤ÑˤÊˤÃˤ¼Ë¤µË¤®Ë¤§Ë¤ Ë¤™Ë¤’ˤ‹Ë¤„ˤ}ˤvˤoˤhˤaˤZˤSˤLˤEˤ>ˤ7ˤ0ˤ)ˤ"ˤˤˤ ˤˤÿʤøÊ¤ñʤêʤãʤÜʤÕʤÎʤÇʤÀʤ¹Ê¤²Ê¤«Ê¤¤Ê¤ʤ–ʤʤˆÊ¤ʤzʤsʤlʤeʤ^ʤWʤPʤIʤBʤ;ʤ4ʤ-ʤ&ʤʤʤʤ ʤʤüɤõɤîɤçɤàɤÙɤÒɤËɤÄɤ½É¤¶É¤¯É¤¨É¤¡É¤šÉ¤“ɤŒÉ¤…ɤ~ɤwɤpɤiɤbɤ[ɤTɤMɤFɤ?ɤ8ɤ1ɤ*ɤ#ɤɤɤɤɤɤùȤòȤëȤäȤÝȤÖȤÏȤÈȤÁȤºÈ¤³È¤¬È¤¥È¤žÈ¤—ȤȤ‰È¤‚Ȥ{ȤtȤmȤfȤ_ȤXȤQȤJȤCȤ<Ȥ5Ȥ.Ȥ'Ȥ ȤȤȤ ȤȤýǤöǤïǤèǤáǤÚǤÓǤÌǤÅǤ¾Ç¤·Ç¤°Ç¤©Ç¤¢Ç¤›Ç¤”ǤǤ†Ç¤ǤxǤqǤjǤcǤ\ǤUǤNǤGǤ@Ǥ9Ǥ2Ǥ+Ǥ$ǤǤǤǤǤǤúƤóƤìÆ¤寤ÞÆ¤ׯ¤ÐÆ¤ÉÆ¤ÂƤ»Æ¤´Æ¤­Æ¤¦Æ¤ŸÆ¤˜Æ¤‘ƤŠÆ¤ƒÆ¤|ƤuƤnƤgƤ`ƤYƤRƤKƤDƤ=Ƥ6Ƥ/Ƥ(Ƥ!ƤƤƤ ƤƤþŤ÷ŤðŤéŤâŤÛŤÔŤÍŤÆÅ¤¿Å¤¸Å¤±Å¤ªÅ¤£Å¤œÅ¤•ŤŽÅ¤‡Å¤€Å¤yŤrŤkŤdŤ]ŤVŤOŤHŤAŤ:Ť3Ť,Ť%ŤŤŤŤ ŤŤûĤôĤíĤæÄ¤ßĤØÄ¤ÑĤÊĤÃĤ¼Ä¤µÄ¤®Ä¤§Ä¤ Ä¤™Ä¤’Ĥ‹Ä¤„Ĥ}ĤvĤoĤhĤaĤZĤSĤLĤEĤ>Ĥ7Ĥ0Ĥ)Ĥ"ĤĤĤ ĤĤÿäøÃ¤ñäêäãäÜäÕäÎäÇäÀä¹Ã¤²Ã¤«Ã¤¤Ã¤ä–ääˆÃ¤äzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½Â¤¶Â¤¯Â¤¨Â¤¡Â¤šÂ¤“¤ŒÂ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ùÁ¤òÁ¤ëÁ¤äÁ¤ÝÁ¤ÖÁ¤ÏÁ¤ÈÁ¤ÁÁ¤ºÁ¤³Á¤¬Á¤¥Á¤žÁ¤—Á¤Á¤‰Á¤‚Á¤{Á¤tÁ¤mÁ¤fÁ¤_Á¤XÁ¤QÁ¤JÁ¤CÁ¤<Á¤5Á¤.Á¤'Á¤ Á¤Á¤Á¤ Á¤Á¤ýÀ¤öÀ¤ïÀ¤èÀ¤áÀ¤ÚÀ¤ÓÀ¤ÌÀ¤ÅÀ¤¾À¤·À¤°À¤©À¤¢À¤›À¤”À¤À¤†À¤À¤xÀ¤qÀ¤jÀ¤cÀ¤\À¤UÀ¤NÀ¤GÀ¤@À¤9À¤2À¤+À¤$À¤À¤À¤À¤À¤À¤ú¿¤ó¿¤쿤忤Þ¿¤׿¤п¤É¿¤¿¤»¿¤´¿¤­¿¤¦¿¤Ÿ¿¤˜¿¤‘¿¤Š¿¤ƒ¿¤|¿¤u¿¤n¿¤g¿¤`¿¤Y¿¤R¿¤K¿¤D¿¤=¿¤6¿¤/¿¤(¿¤!¿¤¿¤¿¤ ¿¤¿¤þ¾¤÷¾¤ð¾¤龤⾤Û¾¤Ô¾¤;¤ƾ¤¿¾¤¸¾¤±¾¤ª¾¤£¾¤œ¾¤•¾¤޾¤‡¾¤€¾¤y¾¤r¾¤k¾¤d¾¤]¾¤V¾¤O¾¤H¾¤A¾¤:¾¤3¾¤,¾¤%¾¤¾¤¾¤¾¤ ¾¤¾¤û½¤ô½¤í½¤潤ß½¤ؽ¤ѽ¤ʽ¤ý¤¼½¤µ½¤®½¤§½¤ ½¤™½¤’½¤‹½¤„½¤}½¤v½¤o½¤h½¤a½¤Z½¤S½¤L½¤E½¤>½¤7½¤0½¤)½¤"½¤½¤½¤ ½¤½¤ÿ¼¤ø¼¤ñ¼¤꼤㼤ܼ¤Õ¼¤μ¤Ǽ¤À¼¤¹¼¤²¼¤«¼¤¤¼¤¼¤–¼¤¼¤ˆ¼¤¼¤z¼¤s¼¤l¼¤e¼¤^¼¤W¼¤P¼¤I¼¤B¼¤;¼¤4¼¤-¼¤&¼¤¼¤¼¤¼¤ ¼¤¼¤ü»¤õ»¤绤໤Ù»¤Ò»¤Ë»¤Ä»¤½»¤¶»¤¯»¤¨»¤¡»¤š»¤“»¤Œ»¤…»¤~»¤w»¤p»¤i»¤b»¤[»¤T»¤M»¤F»¤?»¤8»¤1»¤*»¤#»¤»¤»¤»¤»¤»¤ùº¤òº¤뺤交ݺ¤Öº¤Ϻ¤Ⱥ¤Áº¤ºº¤³º¤¬º¤¥º¤žº¤—º¤º¤‰º¤‚º¤{º¤tº¤mº¤fº¤_º¤Xº¤Qº¤Jº¤Cº¤<º¤5º¤.º¤'º¤ º¤º¤º¤ º¤º¤ý¹¤ö¹¤﹤蹤ṤÚ¹¤Ó¹¤̹¤ʤ¾¹¤·¹¤°¹¤©¹¤¢¹¤›¹¤”¹¤¹¤†¹¤¹¤x¹¤q¹¤j¹¤c¹¤\¹¤U¹¤N¹¤G¹¤@¹¤9¹¤2¹¤+¹¤$¹¤¹¤¹¤¹¤¹¤¹¤ú¸¤ó¸¤츤帤Þ¸¤׸¤и¤ɸ¤¸¤»¸¤´¸¤­¸¤¦¸¤Ÿ¸¤˜¸¤‘¸¤Џ¤ƒ¸¤|¸¤u¸¤n¸¤g¸¤`¸¤Y¸¤R¸¤K¸¤D¸¤=¸¤6¸¤/¸¤(¸¤!¸¤¸¤¸¤ ¸¤¸¤þ·¤÷·¤ð·¤é·¤â·¤Û·¤Ô·¤Í·¤Æ·¤¿·¤¸·¤±·¤ª·¤£·¤œ·¤•·¤Ž·¤‡·¤€·¤y·¤r·¤k·¤d·¤]·¤V·¤O·¤H·¤A·¤:·¤3·¤,·¤%·¤·¤·¤·¤ ·¤·¤û¶¤ô¶¤í¶¤涤ß¶¤ض¤Ѷ¤ʶ¤ö¤¼¶¤µ¶¤®¶¤§¶¤ ¶¤™¶¤’¶¤‹¶¤„¶¤}¶¤v¶¤o¶¤h¶¤a¶¤Z¶¤S¶¤L¶¤E¶¤>¶¤7¶¤0¶¤)¶¤"¶¤¶¤¶¤ ¶¤¶¤ÿµ¤øµ¤ñµ¤굤㵤ܵ¤Õµ¤ε¤ǵ¤Àµ¤¹µ¤²µ¤«µ¤¤µ¤µ¤–µ¤µ¤ˆµ¤µ¤zµ¤sµ¤lµ¤eµ¤^µ¤Wµ¤Pµ¤Iµ¤Bµ¤;µ¤4µ¤-µ¤&µ¤µ¤µ¤µ¤ µ¤µ¤ü´¤õ´¤î´¤ç´¤à´¤Ù´¤Ò´¤Ë´¤Ä´¤½´¤¶´¤¯´¤¨´¤¡´¤š´¤“´¤Œ´¤…´¤~´¤w´¤p´¤i´¤b´¤[´¤T´¤M´¤F´¤?´¤8´¤1´¤*´¤#´¤´¤´¤´¤´¤´¤ù³¤ò³¤볤䳤ݳ¤Ö³¤ϳ¤ȳ¤Á³¤º³¤³³¤¬³¤¥³¤ž³¤—³¤³¤‰³¤‚³¤{³¤t³¤m³¤f³¤_³¤X³¤Q³¤J³¤C³¤<³¤5³¤.³¤'³¤ ³¤³¤³¤ ³¤³¤ý²¤ö²¤ﲤ貤ᲤÚ²¤Ó²¤̲¤Ų¤¾²¤·²¤°²¤©²¤¢²¤›²¤”²¤²¤†²¤²¤x²¤q²¤j²¤c²¤\²¤U²¤N²¤G²¤@²¤9²¤2²¤+²¤$²¤²¤²¤²¤²¤²¤ú±¤ó±¤챤層Þ±¤×±¤б¤ɱ¤±¤»±¤´±¤­±¤¦±¤Ÿ±¤˜±¤‘±¤б¤ƒ±¤|±¤u±¤n±¤g±¤`±¤Y±¤R±¤K±¤D±¤=±¤6±¤/±¤(±¤!±¤±¤±¤ ±¤±¤þ°¤÷°¤ð°¤é°¤â°¤Û°¤Ô°¤Ͱ¤ư¤¿°¤¸°¤±°¤ª°¤£°¤œ°¤•°¤ް¤‡°¤€°¤y°¤r°¤k°¤d°¤]°¤V°¤O°¤H°¤A°¤:°¤3°¤,°¤%°¤°¤°¤°¤ °¤°¤û¯¤ô¯¤í¯¤毤߯¤د¤ѯ¤ʯ¤ï¤¼¯¤µ¯¤®¯¤§¯¤ ¯¤™¯¤’¯¤‹¯¤„¯¤}¯¤v¯¤o¯¤h¯¤a¯¤Z¯¤S¯¤L¯¤E¯¤>¯¤7¯¤0¯¤)¯¤"¯¤¯¤¯¤ ¯¤¯¤ÿ®¤ø®¤ñ®¤ꮤ㮤Ü®¤Õ®¤ή¤Ç®¤À®¤¹®¤²®¤«®¤¤®¤®¤–®¤®¤ˆ®¤®¤z®¤s®¤l®¤e®¤^®¤W®¤P®¤I®¤B®¤;®¤4®¤-®¤&®¤®¤®¤®¤ ®¤®¤ü­¤õ­¤î­¤ç­¤à­¤Ù­¤Ò­¤Ë­¤Ä­¤½­¤¶­¤¯­¤¨­¤¡­¤š­¤“­¤Œ­¤…­¤~­¤w­¤p­¤i­¤b­¤[­¤T­¤M­¤F­¤?­¤8­¤1­¤*­¤#­¤­¤­¤­¤­¤­¤ù¬¤ò¬¤묤䬤ݬ¤Ö¬¤Ϭ¤Ȭ¤Á¬¤º¬¤³¬¤¬¬¤¥¬¤ž¬¤—¬¤¬¤‰¬¤‚¬¤{¬¤t¬¤m¬¤f¬¤_¬¤X¬¤Q¬¤J¬¤C¬¤<¬¤5¬¤.¬¤'¬¤ ¬¤¬¤¬¤ ¬¤¬¤ý«¤ö«¤﫤諤᫤Ú«¤Ó«¤Ì«¤Å«¤¾«¤·«¤°«¤©«¤¢«¤›«¤”«¤«¤†«¤«¤x«¤q«¤j«¤c«¤\«¤U«¤N«¤G«¤@«¤9«¤2«¤+«¤$«¤«¤«¤«¤«¤«¤úª¤óª¤쪤媤Þª¤ת¤Ъ¤ɪ¤ª¤»ª¤´ª¤­ª¤¦ª¤Ÿª¤˜ª¤‘ª¤Šª¤ƒª¤|ª¤uª¤nª¤gª¤`ª¤Yª¤Rª¤Kª¤Dª¤=ª¤6ª¤/ª¤(ª¤!ª¤ª¤ª¤ ª¤ª¤þ©¤÷©¤ð©¤驤⩤Û©¤Ô©¤Í©¤Æ©¤¿©¤¸©¤±©¤ª©¤£©¤œ©¤•©¤Ž©¤‡©¤€©¤y©¤r©¤k©¤d©¤]©¤V©¤O©¤H©¤A©¤:©¤3©¤,©¤%©¤©¤©¤©¤ ©¤©¤û¨¤ô¨¤í¨¤樤ߨ¤ب¤Ѩ¤ʨ¤è¤¼¨¤µ¨¤®¨¤§¨¤ ¨¤™¨¤’¨¤‹¨¤„¨¤}¨¤v¨¤o¨¤h¨¤a¨¤Z¨¤S¨¤L¨¤E¨¤>¨¤7¨¤0¨¤)¨¤"¨¤¨¤¨¤ ¨¤¨¤ÿ§¤ø§¤ñ§¤ꧤ㧤ܧ¤Õ§¤Χ¤ǧ¤À§¤¹§¤²§¤«§¤¤§¤§¤–§¤§¤ˆ§¤§¤z§¤s§¤l§¤e§¤^§¤W§¤P§¤I§¤B§¤;§¤4§¤-§¤&§¤§¤§¤§¤ §¤§¤ü¦¤õ¦¤禤তÙ¦¤Ò¦¤˦¤Ħ¤½¦¤¶¦¤¯¦¤¨¦¤¡¦¤š¦¤“¦¤Œ¦¤…¦¤~¦¤w¦¤p¦¤i¦¤b¦¤[¦¤T¦¤M¦¤F¦¤?¦¤8¦¤1¦¤*¦¤#¦¤¦¤¦¤¦¤¦¤¦¤ù¥¤ò¥¤륤䥤Ý¥¤Ö¥¤Ï¥¤È¥¤Á¥¤º¥¤³¥¤¬¥¤¥¥¤ž¥¤—¥¤¥¤‰¥¤‚¥¤{¥¤t¥¤m¥¤f¥¤_¥¤X¥¤Q¥¤J¥¤C¥¤<¥¤5¥¤.¥¤'¥¤ ¥¤¥¤¥¤ ¥¤¥¤ý¤¤ö¤¤襤褤ᤤÚ¤¤Ó¤¤̤¤Ť¤¾¤¤·¤¤°¤¤©¤¤¢¤¤›¤¤”¤¤¤¤†¤¤¤¤x¤¤q¤¤j¤¤c¤¤\¤¤U¤¤N¤¤G¤¤@¤¤9¤¤2¤¤+¤¤$¤¤¤¤¤¤¤¤¤¤¤¤ú£¤ó£¤죤壤Þ£¤×£¤У¤É£¤£¤»£¤´£¤­£¤¦£¤Ÿ£¤˜£¤‘£¤Š£¤ƒ£¤|£¤u£¤n£¤g£¤`£¤Y£¤R£¤K£¤D£¤=£¤6£¤/£¤(£¤!£¤£¤£¤ £¤£¤þ¢¤÷¢¤ð¢¤颤⢤Û¢¤Ô¢¤Í¢¤Æ¢¤¿¢¤¸¢¤±¢¤ª¢¤£¢¤œ¢¤•¢¤Ž¢¤‡¢¤€¢¤y¢¤r¢¤k¢¤d¢¤]¢¤V¢¤O¢¤H¢¤A¢¤:¢¤3¢¤,¢¤%¢¤¢¤¢¤¢¤ ¢¤¢¤û¡¤ô¡¤í¡¤桤ß¡¤Ø¡¤Ñ¡¤Ê¡¤á¤¼¡¤µ¡¤®¡¤§¡¤ ¡¤™¡¤’¡¤‹¡¤„¡¤}¡¤v¡¤o¡¤h¡¤a¡¤Z¡¤S¡¤L¡¤E¡¤>¡¤7¡¤0¡¤)¡¤"¡¤¡¤¡¤ ¡¤¡¤ÿ ¤ø ¤ñ ¤ê ¤ã ¤Ü ¤Õ ¤Π¤Ç ¤À ¤¹ ¤² ¤« ¤¤ ¤ ¤– ¤ ¤ˆ ¤ ¤z ¤s ¤l ¤e ¤^ ¤W ¤P ¤I ¤B ¤; ¤4 ¤- ¤& ¤ ¤ ¤ ¤  ¤ ¤üŸ¤õŸ¤矤àŸ¤ÙŸ¤ÒŸ¤ËŸ¤ÄŸ¤½Ÿ¤¶Ÿ¤¯Ÿ¤¨Ÿ¤¡Ÿ¤šŸ¤“Ÿ¤ŒŸ¤…Ÿ¤~Ÿ¤wŸ¤pŸ¤iŸ¤bŸ¤[Ÿ¤TŸ¤MŸ¤FŸ¤?Ÿ¤8Ÿ¤1Ÿ¤*Ÿ¤#Ÿ¤Ÿ¤Ÿ¤Ÿ¤Ÿ¤Ÿ¤ùž¤òž¤랤䞤Ýž¤Öž¤Ïž¤Èž¤Áž¤ºž¤³ž¤¬ž¤¥ž¤žž¤—ž¤ž¤‰ž¤‚ž¤{ž¤tž¤mž¤fž¤_ž¤Xž¤Qž¤Jž¤Cž¤<ž¤5ž¤.ž¤'ž¤ ž¤ž¤ž¤ ž¤ž¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤úœ¤óœ¤윤圤Þœ¤ל¤М¤Éœ¤œ¤»œ¤´œ¤­œ¤¦œ¤Ÿœ¤˜œ¤‘œ¤Šœ¤ƒœ¤|œ¤uœ¤nœ¤gœ¤`œ¤Yœ¤Rœ¤Kœ¤Dœ¤=œ¤6œ¤/œ¤(œ¤!œ¤œ¤œ¤ œ¤œ¤þ›¤÷›¤ð›¤雤⛤Û›¤Ô›¤Í›¤Æ›¤¿›¤¸›¤±›¤ª›¤£›¤œ›¤•›¤Ž›¤‡›¤€›¤y›¤r›¤k›¤d›¤]›¤V›¤O›¤H›¤A›¤:›¤3›¤,›¤%›¤›¤›¤›¤ ›¤›¤ûš¤ôš¤횤暤ßš¤Øš¤Ñš¤Êš¤Ú¤¼š¤µš¤®š¤§š¤ š¤™š¤’š¤‹š¤„š¤}š¤vš¤oš¤hš¤aš¤Zš¤Sš¤Lš¤Eš¤>š¤7š¤0š¤)š¤"š¤š¤š¤ š¤š¤ÿ™¤ø™¤ñ™¤Ꙥ㙤Ü™¤Õ™¤Ι¤Ç™¤À™¤¹™¤²™¤«™¤¤™¤™¤–™¤™¤ˆ™¤™¤z™¤s™¤l™¤e™¤^™¤W™¤P™¤I™¤B™¤;™¤4™¤-™¤&™¤™¤™¤™¤ ™¤™¤ü˜¤õ˜¤瘤à˜¤Ù˜¤Ò˜¤˘¤ʤ½˜¤¶˜¤¯˜¤¨˜¤¡˜¤š˜¤“˜¤Œ˜¤…˜¤~˜¤w˜¤p˜¤i˜¤b˜¤[˜¤T˜¤M˜¤F˜¤?˜¤8˜¤1˜¤*˜¤#˜¤˜¤˜¤˜¤˜¤˜¤ù—¤ò—¤ë—¤ä—¤Ý—¤Ö—¤Ï—¤È—¤Á—¤º—¤³—¤¬—¤¥—¤ž—¤——¤—¤‰—¤‚—¤{—¤t—¤m—¤f—¤_—¤X—¤Q—¤J—¤C—¤<—¤5—¤.—¤'—¤ —¤—¤—¤ —¤—¤ý–¤ö–¤ï–¤è–¤á–¤Ú–¤Ó–¤Ì–¤Å–¤¾–¤·–¤°–¤©–¤¢–¤›–¤”–¤–¤†–¤–¤x–¤q–¤j–¤c–¤\–¤U–¤N–¤G–¤@–¤9–¤2–¤+–¤$–¤–¤–¤–¤–¤–¤ú•¤ó•¤앤啤Þ•¤ו¤Е¤É•¤•¤»•¤´•¤­•¤¦•¤Ÿ•¤˜•¤‘•¤Š•¤ƒ•¤|•¤u•¤n•¤g•¤`•¤Y•¤R•¤K•¤D•¤=•¤6•¤/•¤(•¤!•¤•¤•¤ •¤•¤þ”¤÷”¤ð”¤锤┤Û”¤Ô”¤Í”¤Æ”¤¿”¤¸”¤±”¤ª”¤£”¤œ”¤•”¤Ž”¤‡”¤€”¤y”¤r”¤k”¤d”¤]”¤V”¤O”¤H”¤A”¤:”¤3”¤,”¤%”¤”¤”¤”¤ ”¤”¤û“¤ô“¤퓤擤ß“¤Ø“¤Ñ“¤Ê“¤Ó¤¼“¤µ“¤®“¤§“¤ “¤™“¤’“¤‹“¤„“¤}“¤v“¤o“¤h“¤a“¤Z“¤S“¤L“¤E“¤>“¤7“¤0“¤)“¤"“¤“¤“¤ “¤“¤ÿ’¤ø’¤ñ’¤ê’¤ã’¤Ü’¤Õ’¤Î’¤Ç’¤À’¤¹’¤²’¤«’¤¤’¤’¤–’¤’¤ˆ’¤’¤z’¤s’¤l’¤e’¤^’¤W’¤P’¤I’¤B’¤;’¤4’¤-’¤&’¤’¤’¤’¤ ’¤’¤ü‘¤õ‘¤瑤à‘¤Ù‘¤Ò‘¤Ë‘¤Ä‘¤½‘¤¶‘¤¯‘¤¨‘¤¡‘¤š‘¤“‘¤Œ‘¤…‘¤~‘¤w‘¤p‘¤i‘¤b‘¤[‘¤T‘¤M‘¤F‘¤?‘¤8‘¤1‘¤*‘¤#‘¤‘¤‘¤‘¤‘¤‘¤ù¤ò¤ë¤ä¤ݤÖ¤ϤȤÁ¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤úޤóޤ쎤厤ÞŽ¤׎¤ÐŽ¤ÉŽ¤Âޤ»Ž¤´Ž¤­Ž¤¦Ž¤ŸŽ¤˜Ž¤‘ޤŠŽ¤ƒŽ¤|ޤuޤnޤgޤ`ޤYޤRޤKޤDޤ=ޤ6ޤ/ޤ(ޤ!ޤޤޤ ޤޤþ¤÷¤ð¤é¤â¤Û¤Ô¤ͤƤ¿¤¸¤±¤ª¤£¤œ¤•¤ޤ‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤ûŒ¤ôŒ¤팤挤ߌ¤ØŒ¤ÑŒ¤ÊŒ¤ÃŒ¤¼Œ¤µŒ¤®Œ¤§Œ¤ Œ¤™Œ¤’Œ¤‹Œ¤„Œ¤}Œ¤vŒ¤oŒ¤hŒ¤aŒ¤ZŒ¤SŒ¤LŒ¤EŒ¤>Œ¤7Œ¤0Œ¤)Œ¤"Œ¤Œ¤Œ¤ Œ¤Œ¤ÿ‹¤ø‹¤ñ‹¤ꋤ㋤Ü‹¤Õ‹¤΋¤Ç‹¤À‹¤¹‹¤²‹¤«‹¤¤‹¤‹¤–‹¤‹¤ˆ‹¤‹¤z‹¤s‹¤l‹¤e‹¤^‹¤W‹¤P‹¤I‹¤B‹¤;‹¤4‹¤-‹¤&‹¤‹¤‹¤‹¤ ‹¤‹¤üФõФ犤àŠ¤ÙŠ¤ÒŠ¤ËŠ¤ÄФ½Š¤¶Š¤¯Š¤¨Š¤¡Š¤šŠ¤“ФŒŠ¤…Ф~ФwФpФiФbФ[ФTФMФFФ?Ф8Ф1Ф*Ф#ФФФФФФù‰¤ò‰¤뉤䉤݉¤Ö‰¤ω¤ȉ¤Á‰¤º‰¤³‰¤¬‰¤¥‰¤ž‰¤—‰¤‰¤‰‰¤‚‰¤{‰¤t‰¤m‰¤f‰¤_‰¤X‰¤Q‰¤J‰¤C‰¤<‰¤5‰¤.‰¤'‰¤ ‰¤‰¤‰¤ ‰¤‰¤ýˆ¤öˆ¤舤ሤÚˆ¤Óˆ¤̈¤ň¤¾ˆ¤·ˆ¤°ˆ¤©ˆ¤¢ˆ¤›ˆ¤”ˆ¤ˆ¤†ˆ¤ˆ¤xˆ¤qˆ¤jˆ¤cˆ¤\ˆ¤Uˆ¤Nˆ¤Gˆ¤@ˆ¤9ˆ¤2ˆ¤+ˆ¤$ˆ¤ˆ¤ˆ¤ˆ¤ˆ¤ˆ¤ú‡¤ó‡¤쇤凤Þ‡¤ׇ¤Ї¤ɇ¤‡¤»‡¤´‡¤­‡¤¦‡¤Ÿ‡¤˜‡¤‘‡¤Ї¤ƒ‡¤|‡¤u‡¤n‡¤g‡¤`‡¤Y‡¤R‡¤K‡¤D‡¤=‡¤6‡¤/‡¤(‡¤!‡¤‡¤‡¤ ‡¤‡¤þ†¤÷†¤ð†¤醤↤Û†¤Ô†¤͆¤Ɔ¤¿†¤¸†¤±†¤ª†¤£†¤œ†¤•†¤ކ¤‡†¤€†¤y†¤r†¤k†¤d†¤]†¤V†¤O†¤H†¤A†¤:†¤3†¤,†¤%†¤†¤†¤†¤ †¤†¤û…¤ô…¤í…¤æ…¤ß…¤Ø…¤Ñ…¤Ê…¤Ã…¤¼…¤µ…¤®…¤§…¤ …¤™…¤’…¤‹…¤„…¤}…¤v…¤o…¤h…¤a…¤Z…¤S…¤L…¤E…¤>…¤7…¤0…¤)…¤"…¤…¤…¤ …¤…¤ÿ„¤ø„¤ñ„¤ꄤㄤÜ„¤Õ„¤΄¤Ç„¤À„¤¹„¤²„¤«„¤¤„¤„¤–„¤„¤ˆ„¤„¤z„¤s„¤l„¤e„¤^„¤W„¤P„¤I„¤B„¤;„¤4„¤-„¤&„¤„¤„¤„¤ „¤„¤üƒ¤õƒ¤烤àƒ¤Ùƒ¤Òƒ¤˃¤ă¤½ƒ¤¶ƒ¤¯ƒ¤¨ƒ¤¡ƒ¤šƒ¤“ƒ¤Œƒ¤…ƒ¤~ƒ¤wƒ¤pƒ¤iƒ¤bƒ¤[ƒ¤Tƒ¤Mƒ¤Fƒ¤?ƒ¤8ƒ¤1ƒ¤*ƒ¤#ƒ¤ƒ¤ƒ¤ƒ¤ƒ¤ƒ¤ù‚¤ò‚¤낤䂤Ý‚¤Ö‚¤Ï‚¤È‚¤Á‚¤º‚¤³‚¤¬‚¤¥‚¤ž‚¤—‚¤‚¤‰‚¤‚‚¤{‚¤t‚¤m‚¤f‚¤_‚¤X‚¤Q‚¤J‚¤C‚¤<‚¤5‚¤.‚¤'‚¤ ‚¤‚¤‚¤ ‚¤‚¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú€¤ó€¤쀤値Þ€¤×€¤Ѐ¤É€¤€¤»€¤´€¤­€¤¦€¤Ÿ€¤˜€¤‘€¤Š€¤ƒ€¤|€¤u€¤n€¤g€¤`€¤Y€¤R€¤K€¤D€¤=€¤6€¤/€¤(€¤!€¤€¤€¤ €¤€¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û~¤ô~¤í~¤æ~¤ß~¤Ø~¤Ñ~¤Ê~¤Ã~¤¼~¤µ~¤®~¤§~¤ ~¤™~¤’~¤‹~¤„~¤}~¤v~¤o~¤h~¤a~¤Z~¤S~¤L~¤E~¤>~¤7~¤0~¤)~¤"~¤~¤~¤ ~¤~¤ÿ}¤ø}¤ñ}¤ê}¤ã}¤Ü}¤Õ}¤Î}¤Ç}¤À}¤¹}¤²}¤«}¤¤}¤}¤–}¤}¤ˆ}¤}¤z}¤s}¤l}¤e}¤^}¤W}¤P}¤I}¤B}¤;}¤4}¤-}¤&}¤}¤}¤}¤ }¤}¤ü|¤õ|¤î|¤ç|¤à|¤Ù|¤Ò|¤Ë|¤Ä|¤½|¤¶|¤¯|¤¨|¤¡|¤š|¤“|¤Œ|¤…|¤~|¤w|¤p|¤i|¤b|¤[|¤T|¤M|¤F|¤?|¤8|¤1|¤*|¤#|¤|¤|¤|¤|¤|¤ù{¤ò{¤ë{¤ä{¤Ý{¤Ö{¤Ï{¤È{¤Á{¤º{¤³{¤¬{¤¥{¤ž{¤—{¤{¤‰{¤‚{¤{{¤t{¤m{¤f{¤_{¤X{¤Q{¤J{¤C{¤<{¤5{¤.{¤'{¤ {¤{¤{¤ {¤{¤ýz¤öz¤ïz¤èz¤áz¤Úz¤Óz¤Ìz¤Åz¤¾z¤·z¤°z¤©z¤¢z¤›z¤”z¤z¤†z¤z¤xz¤qz¤jz¤cz¤\z¤Uz¤Nz¤Gz¤@z¤9z¤2z¤+z¤$z¤z¤z¤z¤z¤z¤úy¤óy¤ìy¤åy¤Þy¤×y¤Ðy¤Éy¤Ây¤»y¤´y¤­y¤¦y¤Ÿy¤˜y¤‘y¤Šy¤ƒy¤|y¤uy¤ny¤gy¤`y¤Yy¤Ry¤Ky¤Dy¤=y¤6y¤/y¤(y¤!y¤y¤y¤ y¤y¤þx¤÷x¤ðx¤éx¤âx¤Ûx¤Ôx¤Íx¤Æx¤¿x¤¸x¤±x¤ªx¤£x¤œx¤•x¤Žx¤‡x¤€x¤yx¤rx¤kx¤dx¤]x¤Vx¤Ox¤Hx¤Ax¤:x¤3x¤,x¤%x¤x¤x¤x¤ x¤x¤ûw¤ôw¤íw¤æw¤ßw¤Øw¤Ñw¤Êw¤Ãw¤¼w¤µw¤®w¤§w¤ w¤™w¤’w¤‹w¤„w¤}w¤vw¤ow¤hw¤aw¤Zw¤Sw¤Lw¤Ew¤>w¤7w¤0w¤)w¤"w¤w¤w¤ w¤w¤ÿv¤øv¤ñv¤êv¤ãv¤Üv¤Õv¤Îv¤Çv¤Àv¤¹v¤²v¤«v¤¤v¤v¤–v¤v¤ˆv¤v¤zv¤sv¤lv¤ev¤^v¤Wv¤Pv¤Iv¤Bv¤;v¤4v¤-v¤&v¤v¤v¤v¤ v¤v¤üu¤õu¤îu¤çu¤àu¤Ùu¤Òu¤Ëu¤Äu¤½u¤¶u¤¯u¤¨u¤¡u¤šu¤“u¤Œu¤…u¤~u¤wu¤pu¤iu¤bu¤[u¤Tu¤Mu¤Fu¤?u¤8u¤1u¤*u¤#u¤u¤u¤u¤u¤u¤ùt¤òt¤ët¤ät¤Ýt¤Öt¤Ït¤Èt¤Át¤ºt¤³t¤¬t¤¥t¤žt¤—t¤t¤‰t¤‚t¤{t¤tt¤mt¤ft¤_t¤Xt¤Qt¤Jt¤Ct¤p¤7p¤0p¤)p¤"p¤p¤p¤ p¤p¤ÿo¤øo¤ño¤êo¤ão¤Üo¤Õo¤Îo¤Ço¤Ào¤¹o¤²o¤«o¤¤o¤o¤–o¤o¤ˆo¤o¤zo¤so¤lo¤eo¤^o¤Wo¤Po¤Io¤Bo¤;o¤4o¤-o¤&o¤o¤o¤o¤ o¤o¤ün¤õn¤în¤çn¤àn¤Ùn¤Òn¤Ën¤Än¤½n¤¶n¤¯n¤¨n¤¡n¤šn¤“n¤Œn¤…n¤~n¤wn¤pn¤in¤bn¤[n¤Tn¤Mn¤Fn¤?n¤8n¤1n¤*n¤#n¤n¤n¤n¤n¤n¤ùm¤òm¤ëm¤äm¤Ým¤Öm¤Ïm¤Èm¤Ám¤ºm¤³m¤¬m¤¥m¤žm¤—m¤m¤‰m¤‚m¤{m¤tm¤mm¤fm¤_m¤Xm¤Qm¤Jm¤Cm¤i¤7i¤0i¤)i¤"i¤i¤i¤ i¤i¤ÿh¤øh¤ñh¤êh¤ãh¤Üh¤Õh¤Îh¤Çh¤Àh¤¹h¤²h¤«h¤¤h¤h¤–h¤h¤ˆh¤h¤zh¤sh¤lh¤eh¤^h¤Wh¤Ph¤Ih¤Bh¤;h¤4h¤-h¤&h¤h¤h¤h¤ h¤h¤üg¤õg¤îg¤çg¤àg¤Ùg¤Òg¤Ëg¤Äg¤½g¤¶g¤¯g¤¨g¤¡g¤šg¤“g¤Œg¤…g¤~g¤wg¤pg¤ig¤bg¤[g¤Tg¤Mg¤Fg¤?g¤8g¤1g¤*g¤#g¤g¤g¤g¤g¤g¤ùf¤òf¤ëf¤äf¤Ýf¤Öf¤Ïf¤Èf¤Áf¤ºf¤³f¤¬f¤¥f¤žf¤—f¤f¤‰f¤‚f¤{f¤tf¤mf¤ff¤_f¤Xf¤Qf¤Jf¤Cf¤b¤7b¤0b¤)b¤"b¤b¤b¤ b¤b¤ÿa¤øa¤ña¤êa¤ãa¤Üa¤Õa¤Îa¤Ça¤Àa¤¹a¤²a¤«a¤¤a¤a¤–a¤a¤ˆa¤a¤za¤sa¤la¤ea¤^a¤Wa¤Pa¤Ia¤Ba¤;a¤4a¤-a¤&a¤a¤a¤a¤ a¤a¤ü`¤õ`¤î`¤ç`¤à`¤Ù`¤Ò`¤Ë`¤Ä`¤½`¤¶`¤¯`¤¨`¤¡`¤š`¤“`¤Œ`¤…`¤~`¤w`¤p`¤i`¤b`¤[`¤T`¤M`¤F`¤?`¤8`¤1`¤*`¤#`¤`¤`¤`¤`¤`¤ù_¤ò_¤ë_¤ä_¤Ý_¤Ö_¤Ï_¤È_¤Á_¤º_¤³_¤¬_¤¥_¤ž_¤—_¤_¤‰_¤‚_¤{_¤t_¤m_¤f_¤__¤X_¤Q_¤J_¤C_¤<_¤5_¤._¤'_¤ _¤_¤_¤ _¤_¤ý^¤ö^¤ï^¤è^¤á^¤Ú^¤Ó^¤Ì^¤Å^¤¾^¤·^¤°^¤©^¤¢^¤›^¤”^¤^¤†^¤^¤x^¤q^¤j^¤c^¤\^¤U^¤N^¤G^¤@^¤9^¤2^¤+^¤$^¤^¤^¤^¤^¤^¤ú]¤ó]¤ì]¤å]¤Þ]¤×]¤Ð]¤É]¤Â]¤»]¤´]¤­]¤¦]¤Ÿ]¤˜]¤‘]¤Š]¤ƒ]¤|]¤u]¤n]¤g]¤`]¤Y]¤R]¤K]¤D]¤=]¤6]¤/]¤(]¤!]¤]¤]¤ ]¤]¤þ\¤÷\¤ð\¤é\¤â\¤Û\¤Ô\¤Í\¤Æ\¤¿\¤¸\¤±\¤ª\¤£\¤œ\¤•\¤Ž\¤‡\¤€\¤y\¤r\¤k\¤d\¤]\¤V\¤O\¤H\¤A\¤:\¤3\¤,\¤%\¤\¤\¤\¤ \¤\¤û[¤ô[¤í[¤æ[¤ß[¤Ø[¤Ñ[¤Ê[¤Ã[¤¼[¤µ[¤®[¤§[¤ [¤™[¤’[¤‹[¤„[¤}[¤v[¤o[¤h[¤a[¤Z[¤S[¤L[¤E[¤>[¤7[¤0[¤)[¤"[¤[¤[¤ [¤[¤ÿZ¤øZ¤ñZ¤êZ¤ãZ¤ÜZ¤ÕZ¤ÎZ¤ÇZ¤ÀZ¤¹Z¤²Z¤«Z¤¤Z¤Z¤–Z¤Z¤ˆZ¤Z¤zZ¤sZ¤lZ¤eZ¤^Z¤WZ¤PZ¤IZ¤BZ¤;Z¤4Z¤-Z¤&Z¤Z¤Z¤Z¤ Z¤Z¤üY¤õY¤îY¤çY¤àY¤ÙY¤ÒY¤ËY¤ÄY¤½Y¤¶Y¤¯Y¤¨Y¤¡Y¤šY¤“Y¤ŒY¤…Y¤~Y¤wY¤pY¤iY¤bY¤[Y¤TY¤MY¤FY¤?Y¤8Y¤1Y¤*Y¤#Y¤Y¤Y¤Y¤Y¤Y¤ùX¤òX¤ëX¤äX¤ÝX¤ÖX¤ÏX¤ÈX¤ÁX¤ºX¤³X¤¬X¤¥X¤žX¤—X¤X¤‰X¤‚X¤{X¤tX¤mX¤fX¤_X¤XX¤QX¤JX¤CX¤T¤7T¤0T¤)T¤"T¤T¤T¤ T¤T¤ÿS¤øS¤ñS¤êS¤ãS¤ÜS¤ÕS¤ÎS¤ÇS¤ÀS¤¹S¤²S¤«S¤¤S¤S¤–S¤S¤ˆS¤S¤zS¤sS¤lS¤eS¤^S¤WS¤PS¤IS¤BS¤;S¤4S¤-S¤&S¤S¤S¤S¤ S¤S¤üR¤õR¤îR¤çR¤àR¤ÙR¤ÒR¤ËR¤ÄR¤½R¤¶R¤¯R¤¨R¤¡R¤šR¤“R¤ŒR¤…R¤~R¤wR¤pR¤iR¤bR¤[R¤TR¤MR¤FR¤?R¤8R¤1R¤*R¤#R¤R¤R¤R¤R¤R¤ùQ¤òQ¤ëQ¤äQ¤ÝQ¤ÖQ¤ÏQ¤ÈQ¤ÁQ¤ºQ¤³Q¤¬Q¤¥Q¤žQ¤—Q¤Q¤‰Q¤‚Q¤{Q¤tQ¤mQ¤fQ¤_Q¤XQ¤QQ¤JQ¤CQ¤M¤7M¤0M¤)M¤"M¤M¤M¤ M¤M¤ÿL¤øL¤ñL¤êL¤ãL¤ÜL¤ÕL¤ÎL¤ÇL¤ÀL¤¹L¤²L¤«L¤¤L¤L¤–L¤L¤ˆL¤L¤zL¤sL¤lL¤eL¤^L¤WL¤PL¤IL¤BL¤;L¤4L¤-L¤&L¤L¤L¤L¤ L¤L¤üK¤õK¤îK¤çK¤àK¤ÙK¤ÒK¤ËK¤ÄK¤½K¤¶K¤¯K¤¨K¤¡K¤šK¤“K¤ŒK¤…K¤~K¤wK¤pK¤iK¤bK¤[K¤TK¤MK¤FK¤?K¤8K¤1K¤*K¤#K¤K¤K¤K¤K¤K¤ùJ¤òJ¤ëJ¤äJ¤ÝJ¤ÖJ¤ÏJ¤ÈJ¤ÁJ¤ºJ¤³J¤¬J¤¥J¤žJ¤—J¤J¤‰J¤‚J¤{J¤tJ¤mJ¤fJ¤_J¤XJ¤QJ¤JJ¤CJ¤F¤7F¤0F¤)F¤"F¤F¤F¤ F¤F¤ÿE¤øE¤ñE¤êE¤ãE¤ÜE¤ÕE¤ÎE¤ÇE¤ÀE¤¹E¤²E¤«E¤¤E¤E¤–E¤E¤ˆE¤E¤zE¤sE¤lE¤eE¤^E¤WE¤PE¤IE¤BE¤;E¤4E¤-E¤&E¤E¤E¤E¤ E¤E¤üD¤õD¤îD¤çD¤àD¤ÙD¤ÒD¤ËD¤ÄD¤½D¤¶D¤¯D¤¨D¤¡D¤šD¤“D¤ŒD¤…D¤~D¤wD¤pD¤iD¤bD¤[D¤TD¤MD¤FD¤?D¤8D¤1D¤*D¤#D¤D¤D¤D¤D¤D¤ùC¤òC¤ëC¤äC¤ÝC¤ÖC¤ÏC¤ÈC¤ÁC¤ºC¤³C¤¬C¤¥C¤žC¤—C¤C¤‰C¤‚C¤{C¤tC¤mC¤fC¤_C¤XC¤QC¤JC¤CC¤?¤7?¤0?¤)?¤"?¤?¤?¤ ?¤?¤ÿ>¤ø>¤ñ>¤ê>¤ã>¤Ü>¤Õ>¤Î>¤Ç>¤À>¤¹>¤²>¤«>¤¤>¤>¤–>¤>¤ˆ>¤>¤z>¤s>¤l>¤e>¤^>¤W>¤P>¤I>¤B>¤;>¤4>¤->¤&>¤>¤>¤>¤ >¤>¤ü=¤õ=¤î=¤ç=¤à=¤Ù=¤Ò=¤Ë=¤Ä=¤½=¤¶=¤¯=¤¨=¤¡=¤š=¤“=¤Œ=¤…=¤~=¤w=¤p=¤i=¤b=¤[=¤T=¤M=¤F=¤?=¤8=¤1=¤*=¤#=¤=¤=¤=¤=¤=¤ù<¤ò<¤ë<¤ä<¤Ý<¤Ö<¤Ï<¤È<¤Á<¤º<¤³<¤¬<¤¥<¤ž<¤—<¤<¤‰<¤‚<¤{<¤t<¤m<¤f<¤_<¤X<¤Q<¤J<¤C<¤<<¤5<¤.<¤'<¤ <¤<¤<¤ <¤<¤ý;¤ö;¤ï;¤è;¤á;¤Ú;¤Ó;¤Ì;¤Å;¤¾;¤·;¤°;¤©;¤¢;¤›;¤”;¤;¤†;¤;¤x;¤q;¤j;¤c;¤\;¤U;¤N;¤G;¤@;¤9;¤2;¤+;¤$;¤;¤;¤;¤;¤;¤ú:¤ó:¤ì:¤å:¤Þ:¤×:¤Ð:¤É:¤Â:¤»:¤´:¤­:¤¦:¤Ÿ:¤˜:¤‘:¤Š:¤ƒ:¤|:¤u:¤n:¤g:¤`:¤Y:¤R:¤K:¤D:¤=:¤6:¤/:¤(:¤!:¤:¤:¤ :¤:¤þ9¤÷9¤ð9¤é9¤â9¤Û9¤Ô9¤Í9¤Æ9¤¿9¤¸9¤±9¤ª9¤£9¤œ9¤•9¤Ž9¤‡9¤€9¤y9¤r9¤k9¤d9¤]9¤V9¤O9¤H9¤A9¤:9¤39¤,9¤%9¤9¤9¤9¤ 9¤9¤û8¤ô8¤í8¤æ8¤ß8¤Ø8¤Ñ8¤Ê8¤Ã8¤¼8¤µ8¤®8¤§8¤ 8¤™8¤’8¤‹8¤„8¤}8¤v8¤o8¤h8¤a8¤Z8¤S8¤L8¤E8¤>8¤78¤08¤)8¤"8¤8¤8¤ 8¤8¤ÿ7¤ø7¤ñ7¤ê7¤ã7¤Ü7¤Õ7¤Î7¤Ç7¤À7¤¹7¤²7¤«7¤¤7¤7¤–7¤7¤ˆ7¤7¤z7¤s7¤l7¤e7¤^7¤W7¤P7¤I7¤B7¤;7¤47¤-7¤&7¤7¤7¤7¤ 7¤7¤ü6¤õ6¤î6¤ç6¤à6¤Ù6¤Ò6¤Ë6¤Ä6¤½6¤¶6¤¯6¤¨6¤¡6¤š6¤“6¤Œ6¤…6¤~6¤w6¤p6¤i6¤b6¤[6¤T6¤M6¤F6¤?6¤86¤16¤*6¤#6¤6¤6¤6¤6¤6¤ù5¤ò5¤ë5¤ä5¤Ý5¤Ö5¤Ï5¤È5¤Á5¤º5¤³5¤¬5¤¥5¤ž5¤—5¤5¤‰5¤‚5¤{5¤t5¤m5¤f5¤_5¤X5¤Q5¤J5¤C5¤<5¤55¤.5¤'5¤ 5¤5¤5¤ 5¤5¤ý4¤ö4¤ï4¤è4¤á4¤Ú4¤Ó4¤Ì4¤Å4¤¾4¤·4¤°4¤©4¤¢4¤›4¤”4¤4¤†4¤4¤x4¤q4¤j4¤c4¤\4¤U4¤N4¤G4¤@4¤94¤24¤+4¤$4¤4¤4¤4¤4¤4¤ú3¤ó3¤ì3¤å3¤Þ3¤×3¤Ð3¤É3¤Â3¤»3¤´3¤­3¤¦3¤Ÿ3¤˜3¤‘3¤Š3¤ƒ3¤|3¤u3¤n3¤g3¤`3¤Y3¤R3¤K3¤D3¤=3¤63¤/3¤(3¤!3¤3¤3¤ 3¤3¤þ2¤÷2¤ð2¤é2¤â2¤Û2¤Ô2¤Í2¤Æ2¤¿2¤¸2¤±2¤ª2¤£2¤œ2¤•2¤Ž2¤‡2¤€2¤y2¤r2¤k2¤d2¤]2¤V2¤O2¤H2¤A2¤:2¤32¤,2¤%2¤2¤2¤2¤ 2¤2¤û1¤ô1¤í1¤æ1¤ß1¤Ø1¤Ñ1¤Ê1¤Ã1¤¼1¤µ1¤®1¤§1¤ 1¤™1¤’1¤‹1¤„1¤}1¤v1¤o1¤h1¤a1¤Z1¤S1¤L1¤E1¤>1¤71¤01¤)1¤"1¤1¤1¤ 1¤1¤ÿ0¤ø0¤ñ0¤ê0¤ã0¤Ü0¤Õ0¤Î0¤Ç0¤À0¤¹0¤²0¤«0¤¤0¤0¤–0¤0¤ˆ0¤0¤z0¤s0¤l0¤e0¤^0¤W0¤P0¤I0¤B0¤;0¤40¤-0¤&0¤0¤0¤0¤ 0¤0¤ü/¤õ/¤î/¤ç/¤à/¤Ù/¤Ò/¤Ë/¤Ä/¤½/¤¶/¤¯/¤¨/¤¡/¤š/¤“/¤Œ/¤…/¤~/¤w/¤p/¤i/¤b/¤[/¤T/¤M/¤F/¤?/¤8/¤1/¤*/¤#/¤/¤/¤/¤/¤/¤ù.¤ò.¤ë.¤ä.¤Ý.¤Ö.¤Ï.¤È.¤Á.¤º.¤³.¤¬.¤¥.¤ž.¤—.¤.¤‰.¤‚.¤{.¤t.¤m.¤f.¤_.¤X.¤Q.¤J.¤C.¤<.¤5.¤..¤'.¤ .¤.¤.¤ .¤.¤ý-¤ö-¤ï-¤è-¤á-¤Ú-¤Ó-¤Ì-¤Å-¤¾-¤·-¤°-¤©-¤¢-¤›-¤”-¤-¤†-¤-¤x-¤q-¤j-¤c-¤\-¤U-¤N-¤G-¤@-¤9-¤2-¤+-¤$-¤-¤-¤-¤-¤-¤ú,¤ó,¤ì,¤å,¤Þ,¤×,¤Ð,¤É,¤Â,¤»,¤´,¤­,¤¦,¤Ÿ,¤˜,¤‘,¤Š,¤ƒ,¤|,¤u,¤n,¤g,¤`,¤Y,¤R,¤K,¤D,¤=,¤6,¤/,¤(,¤!,¤,¤,¤ ,¤,¤þ+¤÷+¤ð+¤é+¤â+¤Û+¤Ô+¤Í+¤Æ+¤¿+¤¸+¤±+¤ª+¤£+¤œ+¤•+¤Ž+¤‡+¤€+¤y+¤r+¤k+¤d+¤]+¤V+¤O+¤H+¤A+¤:+¤3+¤,+¤%+¤+¤+¤+¤ +¤+¤û*¤ô*¤í*¤æ*¤ß*¤Ø*¤Ñ*¤Ê*¤Ã*¤¼*¤µ*¤®*¤§*¤ *¤™*¤’*¤‹*¤„*¤}*¤v*¤o*¤h*¤a*¤Z*¤S*¤L*¤E*¤>*¤7*¤0*¤)*¤"*¤*¤*¤ *¤*¤ÿ)¤ø)¤ñ)¤ê)¤ã)¤Ü)¤Õ)¤Î)¤Ç)¤À)¤¹)¤²)¤«)¤¤)¤)¤–)¤)¤ˆ)¤)¤z)¤s)¤l)¤e)¤^)¤W)¤P)¤I)¤B)¤;)¤4)¤-)¤&)¤)¤)¤)¤ )¤)¤ü(¤õ(¤î(¤ç(¤à(¤Ù(¤Ò(¤Ë(¤Ä(¤½(¤¶(¤¯(¤¨(¤¡(¤š(¤“(¤Œ(¤…(¤~(¤w(¤p(¤i(¤b(¤[(¤T(¤M(¤F(¤?(¤8(¤1(¤*(¤#(¤(¤(¤(¤(¤(¤ù'¤ò'¤ë'¤ä'¤Ý'¤Ö'¤Ï'¤È'¤Á'¤º'¤³'¤¬'¤¥'¤ž'¤—'¤'¤‰'¤‚'¤{'¤t'¤m'¤f'¤_'¤X'¤Q'¤J'¤C'¤<'¤5'¤.'¤''¤ '¤'¤'¤ '¤'¤ý&¤ö&¤ï&¤è&¤á&¤Ú&¤Ó&¤Ì&¤Å&¤¾&¤·&¤°&¤©&¤¢&¤›&¤”&¤&¤†&¤&¤x&¤q&¤j&¤c&¤\&¤U&¤N&¤G&¤@&¤9&¤2&¤+&¤$&¤&¤&¤&¤&¤&¤ú%¤ó%¤ì%¤å%¤Þ%¤×%¤Ð%¤É%¤Â%¤»%¤´%¤­%¤¦%¤Ÿ%¤˜%¤‘%¤Š%¤ƒ%¤|%¤u%¤n%¤g%¤`%¤Y%¤R%¤K%¤D%¤=%¤6%¤/%¤(%¤!%¤%¤%¤ %¤%¤þ$¤÷$¤ð$¤é$¤â$¤Û$¤Ô$¤Í$¤Æ$¤¿$¤¸$¤±$¤ª$¤£$¤œ$¤•$¤Ž$¤‡$¤€$¤y$¤r$¤k$¤d$¤]$¤V$¤O$¤H$¤A$¤:$¤3$¤,$¤%$¤$¤$¤$¤ $¤$¤û#¤ô#¤í#¤æ#¤ß#¤Ø#¤Ñ#¤Ê#¤Ã#¤¼#¤µ#¤®#¤§#¤ #¤™#¤’#¤‹#¤„#¤}#¤v#¤o#¤h#¤a#¤Z#¤S#¤L#¤E#¤>#¤7#¤0#¤)#¤"#¤#¤#¤ #¤#¤ÿ"¤ø"¤ñ"¤ê"¤ã"¤Ü"¤Õ"¤Î"¤Ç"¤À"¤¹"¤²"¤«"¤¤"¤"¤–"¤"¤ˆ"¤"¤z"¤s"¤l"¤e"¤^"¤W"¤P"¤I"¤B"¤;"¤4"¤-"¤&"¤"¤"¤"¤ "¤"¤ü!¤õ!¤î!¤ç!¤à!¤Ù!¤Ò!¤Ë!¤Ä!¤½!¤¶!¤¯!¤¨!¤¡!¤š!¤“!¤Œ!¤…!¤~!¤w!¤p!¤i!¤b!¤[!¤T!¤M!¤F!¤?!¤8!¤1!¤*!¤#!¤!¤!¤!¤!¤!¤ù ¤ò ¤ë ¤ä ¤Ý ¤Ö ¤Ï ¤È ¤Á ¤º ¤³ ¤¬ ¤¥ ¤ž ¤— ¤ ¤‰ ¤‚ ¤{ ¤t ¤m ¤f ¤_ ¤X ¤Q ¤J ¤C ¤< ¤5 ¤. ¤' ¤ ¤ ¤ ¤ ¤ ¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤Ì¤Å¤¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú¤ó¤ì¤å¤Þ¤×¤Ð¤É¤Â¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Š¤ƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û¤ô¤í¤æ¤ß¤Ø¤Ñ¤Ê¤Ã¤¼¤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ¤ø¤ñ¤ê¤ã¤Ü¤Õ¤Î¤Ç¤À¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü¤õ¤î¤ç¤à¤Ù¤Ò¤Ë¤Ä¤½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù¤ò¤ë¤ä¤Ý¤Ö¤Ï¤È¤Á¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤Ì¤Å¤¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú¤ó¤ì¤å¤Þ¤×¤Ð¤É¤Â¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Š¤ƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û¤ô¤í¤æ¤ß¤Ø¤Ñ¤Ê¤Ã¤¼¤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ¤ø¤ñ¤ê¤ã¤Ü¤Õ¤Î¤Ç¤À¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü¤õ¤î¤ç¤à¤Ù¤Ò¤Ë¤Ä¤½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù¤ò¤ë¤ä¤Ý¤Ö¤Ï¤È¤Á¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤Ì¤Å¤¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú¤ó¤ì¤å¤Þ¤×¤Ð¤É¤Â¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Š¤ƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û¤ô¤í¤æ¤ß¤Ø¤Ñ¤Ê¤Ã¤¼¤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ ¤ø ¤ñ ¤ê ¤ã ¤Ü ¤Õ ¤Î ¤Ç ¤À ¤¹ ¤² ¤« ¤¤ ¤ ¤– ¤ ¤ˆ ¤ ¤z ¤s ¤l ¤e ¤^ ¤W ¤P ¤I ¤B ¤; ¤4 ¤- ¤& ¤ ¤ ¤ ¤ ¤ ¤ü ¤õ ¤î ¤ç ¤à ¤Ù ¤Ò ¤Ë ¤Ä ¤½ ¤¶ ¤¯ ¤¨ ¤¡ ¤š ¤“ ¤Œ ¤… ¤~ ¤w ¤p ¤i ¤b ¤[ ¤T ¤M ¤F ¤? ¤8 ¤1 ¤* ¤# ¤ ¤ ¤ ¤ ¤ ¤ù ¤ò ¤ë ¤ä ¤Ý ¤Ö ¤Ï ¤È ¤Á ¤º ¤³ ¤¬ ¤¥ ¤ž ¤— ¤ ¤‰ ¤‚ ¤{ ¤t ¤m ¤f ¤_ ¤X ¤Q ¤J ¤C ¤< ¤5 ¤. ¤' ¤ ¤ ¤ ¤ ¤ ¤ý ¤ö ¤ï ¤è ¤á ¤Ú ¤Ó ¤Ì ¤Å ¤¾ ¤· ¤° ¤© ¤¢ ¤› ¤” ¤ ¤† ¤ ¤x ¤q ¤j ¤c ¤\ ¤U ¤N ¤G ¤@ ¤9 ¤2 ¤+ ¤$ ¤ ¤ ¤ ¤ ¤ ¤ú ¤ó ¤ì ¤å ¤Þ ¤× ¤Ð ¤É ¤ ¤» ¤´ ¤­ ¤¦ ¤Ÿ ¤˜ ¤‘ ¤Š ¤ƒ ¤| ¤u ¤n ¤g ¤` ¤Y ¤R ¤K ¤D ¤= ¤6 ¤/ ¤( ¤! ¤ ¤ ¤ ¤ ¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û¤ô¤í¤æ¤ß¤Ø¤Ñ¤Ê¤Ã¤¼¤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ¤ø¤ñ¤ê¤ã¤Ü¤Õ¤Î¤Ç¤À¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü¤õ¤î¤ç¤à¤Ù¤Ò¤Ë¤Ä¤½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù¤ò¤ë¤ä¤Ý¤Ö¤Ï¤È¤Á¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý¤ö¤ï¤è¤á¤Ú¤Ó¤Ì¤Å¤¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú¤ó¤ì¤å¤Þ¤×¤Ð¤É¤Â¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Š¤ƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ¤÷¤ð¤é¤â¤Û¤Ô¤Í¤Æ¤¿¤¸¤±¤ª¤£¤œ¤•¤Ž¤‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û¤ô¤í¤æ¤ߤؤѤʤ伤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿÿ£øÿ£ñÿ£êÿ£ãÿ£Üÿ£Õÿ£Îÿ£Çÿ£Àÿ£¹ÿ£²ÿ£«ÿ£¤ÿ£ÿ£–ÿ£ÿ£ˆÿ£ÿ£zÿ£sÿ£lÿ£eÿ£^ÿ£Wÿ£Pÿ£Iÿ£Bÿ£;ÿ£4ÿ£-ÿ£&ÿ£ÿ£ÿ£ÿ£ ÿ£ÿ£üþ£õþ£îþ£çþ£àþ£Ùþ£Òþ£Ëþ£Äþ£½þ£¶þ£¯þ£¨þ£¡þ£šþ£“þ£Œþ£…þ£~þ£wþ£pþ£iþ£bþ£[þ£Tþ£Mþ£Fþ£?þ£8þ£1þ£*þ£#þ£þ£þ£þ£þ£þ£ùý£òý£ëý£äý£Ýý£Öý£Ïý£Èý£Áý£ºý£³ý£¬ý£¥ý£žý£—ý£ý£‰ý£‚ý£{ý£tý£mý£fý£_ý£Xý£Qý£Jý£Cý£<ý£5ý£.ý£'ý£ ý£ý£ý£ ý£ý£ýü£öü£ïü£èü£áü£Úü£Óü£Ìü£Åü£¾ü£·ü£°ü£©ü£¢ü£›ü£”ü£ü£†ü£ü£xü£qü£jü£cü£\ü£Uü£Nü£Gü£@ü£9ü£2ü£+ü£$ü£ü£ü£ü£ü£ü£úû£óû£ìû£åû£Þû£×û£Ðû£Éû£Âû£»û£´û£­û£¦û£Ÿû£˜û£‘û£Šû£ƒû£|û£uû£nû£gû£`û£Yû£Rû£Kû£Dû£=û£6û£/û£(û£!û£û£û£ û£û£þú£÷ú£ðú£éú£âú£Ûú£Ôú£Íú£Æú£¿ú£¸ú£±ú£ªú££ú£œú£•ú£Žú£‡ú£€ú£yú£rú£kú£dú£]ú£Vú£Oú£Hú£Aú£:ú£3ú£,ú£%ú£ú£ú£ú£ ú£ú£ûù£ôù£íù£æù£ßù£Øù£Ñù£Êù£Ãù£¼ù£µù£®ù£§ù£ ù£™ù£’ù£‹ù£„ù£}ù£vù£où£hù£aù£Zù£Sù£Lù£Eù£>ù£7ù£0ù£)ù£"ù£ù£ù£ ù£ù£ÿø£øø£ñø£êø£ãø£Üø£Õø£Îø£Çø£Àø£¹ø£²ø£«ø£¤ø£ø£–ø£ø£ˆø£ø£zø£sø£lø£eø£^ø£Wø£Pø£Iø£Bø£;ø£4ø£-ø£&ø£ø£ø£ø£ ø£ø£ü÷£õ÷£î÷£ç÷£à÷£Ù÷£Ò÷£Ë÷£Ä÷£½÷£¶÷£¯÷£¨÷£¡÷£š÷£“÷£Œ÷£…÷£~÷£w÷£p÷£i÷£b÷£[÷£T÷£M÷£F÷£?÷£8÷£1÷£*÷£#÷£÷£÷£÷£÷£÷£ùö£òö£ëö£äö£Ýö£Öö£Ïö£Èö£Áö£ºö£³ö£¬ö£¥ö£žö£—ö£ö£‰ö£‚ö£{ö£tö£mö£fö£_ö£Xö£Qö£Jö£Cö£<ö£5ö£.ö£'ö£ ö£ö£ö£ ö£ö£ýõ£öõ£ïõ£èõ£áõ£Úõ£Óõ£Ìõ£Åõ£¾õ£·õ£°õ£©õ£¢õ£›õ£”õ£õ£†õ£õ£xõ£qõ£jõ£cõ£\õ£Uõ£Nõ£Gõ£@õ£9õ£2õ£+õ£$õ£õ£õ£õ£õ£õ£úô£óô£ìô£åô£Þô£×ô£Ðô£Éô£Âô£»ô£´ô£­ô£¦ô£Ÿô£˜ô£‘ô£Šô£ƒô£|ô£uô£nô£gô£`ô£Yô£Rô£Kô£Dô£=ô£6ô£/ô£(ô£!ô£ô£ô£ ô£ô£þó£÷ó£ðó£éó£âó£Ûó£Ôó£Íó£Æó£¿ó£¸ó£±ó£ªó££ó£œó£•ó£Žó£‡ó£€ó£yó£ró£kó£dó£]ó£Vó£Oó£Hó£Aó£:ó£3ó£,ó£%ó£ó£ó£ó£ ó£ó£ûò£ôò£íò£æò£ßò£Øò£Ñò£Êò£Ãò£¼ò£µò£®ò£§ò£ ò£™ò£’ò£‹ò£„ò£}ò£vò£oò£hò£aò£Zò£Sò£Lò£Eò£>ò£7ò£0ò£)ò£"ò£ò£ò£ ò£ò£ÿñ£øñ£ññ£êñ£ãñ£Üñ£Õñ£Îñ£Çñ£Àñ£¹ñ£²ñ£«ñ£¤ñ£ñ£–ñ£ñ£ˆñ£ñ£zñ£sñ£lñ£eñ£^ñ£Wñ£Pñ£Iñ£Bñ£;ñ£4ñ£-ñ£&ñ£ñ£ñ£ñ£ ñ£ñ£üð£õð£îð£çð£àð£Ùð£Òð£Ëð£Äð£½ð£¶ð£¯ð£¨ð£¡ð£šð£“ð£Œð£…ð£~ð£wð£pð£ið£bð£[ð£Tð£Mð£Fð£?ð£8ð£1ð£*ð£#ð£ð£ð£ð£ð£ð£ùï£òï£ëï£äï£Ýï£Öï£Ïï£Èï£Áï£ï£‰ï£‚ï£{ï£tï£mï£fï£_ï£Xï£Qï£Jï£Cï£<ï£5ï£.ï£'ï£ ï£ï£ï£ ï£ï£ýî£öî£ïî£èî£áî£Úî£Óî£Ìî£Åî£î£†î£î£xî£qî£jî£cî£\î£Uî£Nî£Gî£@î£9î£2î£+î£$î£î£î£î£î£î£úí£óí£ìí£åí£Þí£×í£Ðí£Éí£Âí£»í£´í£­í£¦í£Ÿí£˜í£‘í£Ší£ƒí£|í£uí£ní£gí£`í£Yí£Rí£Kí£Dí£=í£6í£/í£(í£!í£í£í£ í£í£þì£÷ì£ðì£éì£âì£Ûì£Ôì£Íì£Æì£¿ì£¸ì£±ì£ªì££ì£œì£•ì£Žì£‡ì£€ì£yì£rì£kì£dì£]ì£Vì£Oì£Hì£Aì£:ì£3ì£,ì£%ì£ì£ì£ì£ ì£ì£ûë£ôë£íë£æë£ßë£Øë£Ñë£Êë£Ã룼룵룮룧룠룙룒룋룄ë£}ë£vë£oë£hë£aë£Zë£Së£Lë£Eë£>ë£7ë£0ë£)ë£"ë£ë£ë£ ë£ë£ÿê£øê£ñê£êê£ãê£Üê£Õê£Îê£Çê£À꣹ꣲ꣫꣤ê£ê£–ê£ê£ˆê£ê£zê£sê£lê£eê£^ê£Wê£Pê£Iê£Bê£;ê£4ê£-ê£&ê£ê£ê£ê£ ê£ê£üé£õé£îé£çé£àé£Ùé£Òé£Ëé£Ä飽飶飯飨飡飚飓飌飅é£~é£wé£pé£ié£bé£[é£Té£Mé£Fé£?é£8é£1é£*é£#é£é£é£é£é£é£ùè£òè£ëè£äè£Ýè£Öè£Ïè£Èè£Á裺裳裬裥裞裗è£è£‰è£‚è£{è£tè£mè£fè£_è£Xè£Qè£Jè£Cè£<è£5è£.è£'è£ è£è£è£ è£è£ýç£öç£ïç£èç£áç£Úç£Óç£Ìç£Å磾磷磰磩磢磛磔ç£ç£†ç£ç£xç£qç£jç£cç£\ç£Uç£Nç£Gç£@ç£9ç£2ç£+ç£$ç£ç£ç£ç£ç£ç£úæ£óæ£ìæ£忣Þæ£׿£Ðæ£Éæ£Â棻棴棭棦棟棘棑棊棃æ£|æ£uæ£næ£gæ£`æ£Yæ£Ræ£Kæ£Dæ£=æ£6æ£/æ£(æ£!æ£æ£æ£ æ£æ£þå£÷å£ðå£éå£âå£Ûå£Ôå£Íå£Æå£¿å£¸å£±å£ªå££å£œå£•å£Žå£‡å£€å£yå£rå£kå£då£]å£Vå£Oå£Hå£Aå£:å£3å£,å£%å£å£å£å£ å£å£ûä£ôä£í䣿ä£ß䣨ä£Ñä£Êä£Ã䣼䣵䣮䣧䣠䣙䣒䣋䣄ä£}ä£vä£oä£hä£aä£Zä£Sä£Lä£Eä£>ä£7ä£0ä£)ä£"ä£ä£ä£ ä£ä£ÿã£øã£ñã£êã£ãã£Üã£Õã£Îã£Çã£À㣹㣲㣫㣤ã£ã£–ã£ã£ˆã£ã£zã£sã£lã£eã£^ã£Wã£Pã£Iã£Bã£;ã£4ã£-ã£&ã£ã£ã£ã£ ã£ã£üâ£õâ£îâ£çâ£àâ£Ùâ£Òâ£Ëâ£Ä⣽⣶⣯⣨⣡⣚⣓⣌⣅â£~â£wâ£pâ£iâ£bâ£[â£Tâ£Mâ£Fâ£?â£8â£1â£*â£#â£â£â£â£â£â£ùá£òá£ëá£äá£Ýá£Öá£Ïá£Èá£Á᣺ᣳᣬᣥᣞᣗá£á£‰á£‚á£{á£tá£má£fá£_á£Xá£Qá£Já£Cá£<á£5á£.á£'ᣠá£á£á£ á£á£ýà£öà£ïà£èà£áà£Úà£Óà£Ìà£Åࣰࣩࣾࣷ࣢ࣛࣔà£à£†à£à£xà£qà£jà£cà£\à£Uà£Nà£Gà£@à£9à£2à£+à£$à£à£à£à£à£à£úߣóߣìߣåߣÞߣ×ߣÐߣÉߣÂߣ»ß£´ß£­ß£¦ß£Ÿß£˜ß£‘ߣŠß£ƒß£|ߣuߣnߣgߣ`ߣYߣRߣKߣDߣ=ߣ6ߣ/ߣ(ߣ!ߣߣߣ ߣߣþÞ£÷Þ£ðÞ£éÞ£âÞ£ÛÞ£ÔÞ£ÍÞ£ÆÞ£¿Þ£¸Þ£±Þ£ªÞ££Þ£œÞ£•Þ£ŽÞ£‡Þ£€Þ£yÞ£rÞ£kÞ£dÞ£]Þ£VÞ£OÞ£HÞ£AÞ£:Þ£3Þ£,Þ£%Þ£Þ£Þ£Þ£ Þ£Þ£ûÝ£ôÝ£íÝ£æÝ£ßÝ£ØÝ£ÑÝ£ÊÝ£ÃÝ£¼Ý£µÝ£®Ý£§Ý£ Ý£™Ý£’Ý£‹Ý£„Ý£}Ý£vÝ£oÝ£hÝ£aÝ£ZÝ£SÝ£LÝ£EÝ£>Ý£7Ý£0Ý£)Ý£"ݣݣݣ ݣݣÿÜ£øÜ£ñÜ£êÜ£ãÜ£ÜÜ£ÕÜ£ÎÜ£ÇÜ£ÀÜ£¹Ü£²Ü£«Ü£¤Ü£Ü£–ܣܣˆÜ£Ü£zÜ£sÜ£lÜ£eÜ£^Ü£WÜ£PÜ£IÜ£BÜ£;Ü£4Ü£-Ü£&ܣܣܣܣ ܣܣüÛ£õÛ£îÛ£çÛ£àÛ£ÙÛ£ÒÛ£ËÛ£ÄÛ£½Û£¶Û£¯Û£¨Û£¡Û£šÛ£“Û£ŒÛ£…Û£~Û£wÛ£pÛ£iÛ£bÛ£[Û£TÛ£MÛ£FÛ£?Û£8Û£1Û£*Û£#Û£Û£Û£Û£Û£Û£ùÚ£òÚ£ëÚ£äÚ£ÝÚ£ÖÚ£ÏÚ£ÈÚ£ÁÚ£ºÚ£³Ú£¬Ú£¥Ú£žÚ£—Ú£Ú£‰Ú£‚Ú£{Ú£tÚ£mÚ£fÚ£_Ú£XÚ£QÚ£JÚ£CÚ£<Ú£5Ú£.Ú£'Ú£ Ú£Ú£Ú£ Ú£Ú£ýÙ£öÙ£ïÙ£èÙ£áÙ£ÚÙ£ÓÙ£ÌÙ£ÅÙ£¾Ù£·Ù£°Ù£©Ù£¢Ù£›Ù£”٣٣†Ù£Ù£xÙ£qÙ£jÙ£cÙ£\Ù£UÙ£NÙ£GÙ£@Ù£9Ù£2Ù£+Ù£$٣٣٣٣٣٣úØ£óØ£ìØ£娣ÞØ£ר£ÐØ£ÉØ£ÂØ£»Ø£´Ø£­Ø£¦Ø£ŸØ£˜Ø£‘Ø£ŠØ£ƒØ£|Ø£uØ£nØ£gØ£`Ø£YØ£RØ£KØ£DØ£=Ø£6Ø£/Ø£(Ø£!أأأ أأþ×£÷×£ð×£é×£â×£Û×£Ô×£Í×£Æ×£¿×£¸×£±×£ª×££×£œ×£•×£Ž×£‡×£€×£y×£r×£k×£d×£]×£V×£O×£H×£A×£:×£3×£,×£%×£×£×£×£ ×£×£ûÖ£ôÖ£íÖ£æÖ£ßÖ£ØÖ£ÑÖ£ÊÖ£ÃÖ£¼Ö£µÖ£®Ö£§Ö£ Ö£™Ö£’Ö£‹Ö£„Ö£}Ö£vÖ£oÖ£hÖ£aÖ£ZÖ£SÖ£LÖ£EÖ£>Ö£7Ö£0Ö£)Ö£"Ö£Ö£Ö£ Ö£Ö£ÿÕ£øÕ£ñÕ£êÕ£ãÕ£ÜÕ£ÕÕ£ÎÕ£ÇÕ£ÀÕ£¹Õ£²Õ£«Õ£¤Õ£Õ£–Õ£Õ£ˆÕ£Õ£zÕ£sÕ£lÕ£eÕ£^Õ£WÕ£PÕ£IÕ£BÕ£;Õ£4Õ£-Õ£&Õ£Õ£Õ£Õ£ Õ£Õ£üÔ£õÔ£îÔ£çÔ£àÔ£ÙÔ£ÒÔ£ËÔ£ÄÔ£½Ô£¶Ô£¯Ô£¨Ô£¡Ô£šÔ£“Ô£ŒÔ£…Ô£~Ô£wÔ£pÔ£iÔ£bÔ£[Ô£TÔ£MÔ£FÔ£?Ô£8Ô£1Ô£*Ô£#Ô£Ô£Ô£Ô£Ô£Ô£ùÓ£òÓ£ëÓ£äÓ£ÝÓ£ÖÓ£ÏÓ£ÈÓ£ÁÓ£ºÓ£³Ó£¬Ó£¥Ó£žÓ£—Ó£Ó£‰Ó£‚Ó£{Ó£tÓ£mÓ£fÓ£_Ó£XÓ£QÓ£JÓ£CÓ£<Ó£5Ó£.Ó£'Ó£ Ó£Ó£Ó£ Ó£Ó£ýÒ£öÒ£ïÒ£èÒ£áÒ£ÚÒ£ÓÒ£ÌÒ£ÅÒ£¾Ò£·Ò£°Ò£©Ò£¢Ò£›Ò£”Ò£Ò£†Ò£Ò£xÒ£qÒ£jÒ£cÒ£\Ò£UÒ£NÒ£GÒ£@Ò£9Ò£2Ò£+Ò£$Ò£Ò£Ò£Ò£Ò£Ò£úÑ£óÑ£ìÑ£åÑ£ÞÑ£×Ñ£ÐÑ£ÉÑ£ÂÑ£»Ñ£´Ñ£­Ñ£¦Ñ£ŸÑ£˜Ñ£‘Ñ£ŠÑ£ƒÑ£|Ñ£uÑ£nÑ£gÑ£`Ñ£YÑ£RÑ£KÑ£DÑ£=Ñ£6Ñ£/Ñ£(Ñ£!ѣѣѣ ѣѣþУ÷УðУéУâУÛУÔУÍУÆÐ£¿Ð£¸Ð£±Ð£ªÐ££Ð£œÐ£•УŽÐ£‡Ð£€Ð£yУrУkУdУ]УVУOУHУAУ:У3У,У%УУУУ УУûÏ£ôÏ£íÏ£æÏ£ßÏ£ØÏ£ÑÏ£ÊÏ£ÃÏ£¼Ï£µÏ£®Ï£§Ï£ Ï£™Ï£’Ï£‹Ï£„Ï£}Ï£vÏ£oÏ£hÏ£aÏ£ZÏ£SÏ£LÏ£EÏ£>Ï£7Ï£0Ï£)Ï£"ϣϣϣ ϣϣÿΣøÎ£ñΣêΣãΣÜΣÕΣÎΣÇΣÀΣ¹Î£²Î£«Î£¤Î£Σ–ΣΣˆÎ£ΣzΣsΣlΣeΣ^ΣWΣPΣIΣBΣ;Σ4Σ-Σ&ΣΣΣΣ ΣΣüÍ£õÍ£îÍ£çÍ£àÍ£ÙÍ£ÒÍ£ËÍ£ÄÍ£½Í£¶Í£¯Í£¨Í£¡Í£šÍ£“Í£ŒÍ£…Í£~Í£wÍ£pÍ£iÍ£bÍ£[Í£TÍ£MÍ£FÍ£?Í£8Í£1Í£*Í£#ͣͣͣͣͣͣùÌ£òÌ£ëÌ£äÌ£ÝÌ£ÖÌ£ÏÌ£ÈÌ£ÁÌ£ºÌ£³Ì£¬Ì£¥Ì£žÌ£—̣̣‰Ì£‚Ì£{Ì£tÌ£mÌ£fÌ£_Ì£XÌ£QÌ£JÌ£CÌ£<Ì£5Ì£.Ì£'Ì£ ̣̣̣ ̣̣ýË£öË£ïË£èË£áË£ÚË£ÓË£ÌË£ÅË£¾Ë£·Ë£°Ë£©Ë£¢Ë£›Ë£”ˣˣ†Ë£Ë£xË£qË£jË£cË£\Ë£UË£NË£GË£@Ë£9Ë£2Ë£+Ë£$ˣˣˣˣˣˣúÊ£óÊ£ìÊ£åÊ£ÞÊ£×Ê£ÐÊ£ÉÊ£ÂÊ£»Ê£´Ê£­Ê£¦Ê£ŸÊ£˜Ê£‘Ê£ŠÊ£ƒÊ£|Ê£uÊ£nÊ£gÊ£`Ê£YÊ£RÊ£KÊ£DÊ£=Ê£6Ê£/Ê£(Ê£!ʣʣʣ ʣʣþÉ£÷É£ðÉ£éÉ£âÉ£ÛÉ£ÔÉ£ÍÉ£ÆÉ£¿É£¸É£±É£ªÉ££É£œÉ£•É£ŽÉ£‡É£€É£yÉ£rÉ£kÉ£dÉ£]É£VÉ£OÉ£HÉ£AÉ£:É£3É£,É£%ɣɣɣɣ ɣɣûÈ£ôÈ£íÈ£æÈ£ßÈ£ØÈ£ÑÈ£ÊÈ£ÃÈ£¼È£µÈ£®È£§È£ È£™È£’È£‹È£„È£}È£vÈ£oÈ£hÈ£aÈ£ZÈ£SÈ£LÈ£EÈ£>È£7È£0È£)È£"ȣȣȣ ȣȣÿÇ£øÇ£ñÇ£êÇ£ãÇ£ÜÇ£ÕÇ£ÎÇ£ÇÇ£ÀÇ£¹Ç£²Ç£«Ç£¤Ç£Ç£–ǣǣˆÇ£Ç£zÇ£sÇ£lÇ£eÇ£^Ç£WÇ£PÇ£IÇ£BÇ£;Ç£4Ç£-Ç£&ǣǣǣǣ ǣǣüÆ£õÆ£îÆ£çÆ£àÆ£ÙÆ£ÒÆ£ËÆ£ÄÆ£½Æ£¶Æ£¯Æ£¨Æ£¡Æ£šÆ£“Æ£ŒÆ£…Æ£~Æ£wÆ£pÆ£iÆ£bÆ£[Æ£TÆ£MÆ£FÆ£?Æ£8Æ£1Æ£*Æ£#ƣƣƣƣƣƣùÅ£òÅ£ëÅ£äÅ£ÝÅ£ÖÅ£ÏÅ£ÈÅ£ÁÅ£ºÅ£³Å£¬Å£¥Å£žÅ£—ţţ‰Å£‚Å£{Å£tÅ£mÅ£fÅ£_Å£XÅ£QÅ£JÅ£CÅ£<Å£5Å£.Å£'Å£ ţţţ ţţýÄ£öÄ£ïÄ£èÄ£áÄ£ÚÄ£ÓÄ£ÌÄ£ÅÄ£¾Ä£·Ä£°Ä£©Ä£¢Ä£›Ä£”ģģ†Ä£Ä£xÄ£qÄ£jÄ£cÄ£\Ä£UÄ£NÄ£GÄ£@Ä£9Ä£2Ä£+Ä£$ģģģģģģúãóãìãåãÞã×ãÐãÉãÂã»Ã£´Ã£­Ã£¦Ã£ŸÃ£˜Ã£‘ãŠÃ£ƒÃ£|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþ£÷£ð£é£â£Û£Ô£Í£ÆÂ£¿Â£¸Â£±Â£ªÂ££Â£œÂ£•£ŽÂ£‡Â£€Â£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££ûÁ£ôÁ£íÁ£æÁ£ßÁ£ØÁ£ÑÁ£ÊÁ£ÃÁ£¼Á£µÁ£®Á£§Á£ Á£™Á£’Á£‹Á£„Á£}Á£vÁ£oÁ£hÁ£aÁ£ZÁ£SÁ£LÁ£EÁ£>Á£7Á£0Á£)Á£"Á£Á£Á£ Á£Á£ÿÀ£øÀ£ñÀ£êÀ£ãÀ£ÜÀ£ÕÀ£ÎÀ£ÇÀ£ÀÀ£¹À£²À£«À£¤À£À£–À£À£ˆÀ£À£zÀ£sÀ£lÀ£eÀ£^À£WÀ£PÀ£IÀ£BÀ£;À£4À£-À£&À£À£À£À£ À£À£ü¿£õ¿£î¿£ç¿£à¿£Ù¿£Ò¿£Ë¿£Ä¿£½¿£¶¿£¯¿£¨¿£¡¿£š¿£“¿£Œ¿£…¿£~¿£w¿£p¿£i¿£b¿£[¿£T¿£M¿£F¿£?¿£8¿£1¿£*¿£#¿£¿£¿£¿£¿£¿£ù¾£ò¾£ë¾£ä¾£ݾ£Ö¾£Ͼ£Ⱦ£Á¾£º¾£³¾£¬¾£¥¾£ž¾£—¾£¾£‰¾£‚¾£{¾£t¾£m¾£f¾£_¾£X¾£Q¾£J¾£C¾£<¾£5¾£.¾£'¾£ ¾£¾£¾£ ¾£¾£ý½£ö½£ï½£è½£á½£Ú½£Ó½£̽£Ž£¾½£·½£°½£©½£¢½£›½£”½£½£†½£½£x½£q½£j½£c½£\½£U½£N½£G½£@½£9½£2½£+½£$½£½£½£½£½£½£ú¼£ó¼£ì¼£å¼£Þ¼£×¼£м£ɼ£¼£»¼£´¼£­¼£¦¼£Ÿ¼£˜¼£‘¼£м£ƒ¼£|¼£u¼£n¼£g¼£`¼£Y¼£R¼£K¼£D¼£=¼£6¼£/¼£(¼£!¼£¼£¼£ ¼£¼£þ»£÷»£ð»£黣⻣Û»£Ô»£Í»£Æ»£¿»£¸»£±»£ª»££»£œ»£•»£Ž»£‡»£€»£y»£r»£k»£d»£]»£V»£O»£H»£A»£:»£3»£,»£%»£»£»£»£ »£»£ûº£ôº£íº£溣ߺ£غ£Ѻ£ʺ£ú£¼º£µº£®º£§º£ º£™º£’º£‹º£„º£}º£vº£oº£hº£aº£Zº£Sº£Lº£Eº£>º£7º£0º£)º£"º£º£º£ º£º£ÿ¹£ø¹£ñ¹£ê¹£ã¹£ܹ£Õ¹£ι£ǹ£À¹£¹¹£²¹£«¹£¤¹£¹£–¹£¹£ˆ¹£¹£z¹£s¹£l¹£e¹£^¹£W¹£P¹£I¹£B¹£;¹£4¹£-¹£&¹£¹£¹£¹£ ¹£¹£ü¸£õ¸£縣รÙ¸£Ò¸£˸£ĸ£½¸£¶¸£¯¸£¨¸£¡¸£š¸£“¸£Œ¸£…¸£~¸£w¸£p¸£i¸£b¸£[¸£T¸£M¸£F¸£?¸£8¸£1¸£*¸£#¸£¸£¸£¸£¸£¸£ù·£ò·£ë·£ä·£Ý·£Ö·£Ï·£È·£Á·£º·£³·£¬·£¥·£ž·£—·£·£‰·£‚·£{·£t·£m·£f·£_·£X·£Q·£J·£C·£<·£5·£.·£'·£ ·£·£·£ ·£·£ý¶£ö¶£ï¶£è¶£á¶£Ú¶£Ó¶£̶£Ŷ£¾¶£·¶£°¶£©¶£¢¶£›¶£”¶£¶£†¶£¶£x¶£q¶£j¶£c¶£\¶£U¶£N¶£G¶£@¶£9¶£2¶£+¶£$¶£¶£¶£¶£¶£¶£úµ£óµ£ìµ£åµ£Þµ£×µ£е£ɵ£µ£»µ£´µ£­µ£¦µ£Ÿµ£˜µ£‘µ£е£ƒµ£|µ£uµ£nµ£gµ£`µ£Yµ£Rµ£Kµ£Dµ£=µ£6µ£/µ£(µ£!µ£µ£µ£ µ£µ£þ´£÷´£ð´£é´£â´£Û´£Ô´£Í´£Æ´£¿´£¸´£±´£ª´££´£œ´£•´£Ž´£‡´£€´£y´£r´£k´£d´£]´£V´£O´£H´£A´£:´£3´£,´£%´£´£´£´£ ´£´£û³£ô³£í³£æ³£ß³£س£ѳ£ʳ£ó£¼³£µ³£®³£§³£ ³£™³£’³£‹³£„³£}³£v³£o³£h³£a³£Z³£S³£L³£E³£>³£7³£0³£)³£"³£³£³£ ³£³£ÿ²£ø²£ñ²£ê²£ã²£ܲ£Õ²£β£Dz£À²£¹²£²²£«²£¤²£²£–²£²£ˆ²£²£z²£s²£l²£e²£^²£W²£P²£I²£B²£;²£4²£-²£&²£²£²£²£ ²£²£ü±£õ±£î±£ç±£à±£Ù±£Ò±£˱£ı£½±£¶±£¯±£¨±£¡±£š±£“±£Œ±£…±£~±£w±£p±£i±£b±£[±£T±£M±£F±£?±£8±£1±£*±£#±£±£±£±£±£±£ù°£ò°£ë°£ä°£ݰ£Ö°£ϰ£Ȱ£Á°£º°£³°£¬°£¥°£ž°£—°£°£‰°£‚°£{°£t°£m°£f°£_°£X°£Q°£J°£C°£<°£5°£.°£'°£ °£°£°£ °£°£ý¯£ö¯£ﯣ诣ᯣÚ¯£Ó¯£̯£ů£¾¯£·¯£°¯£©¯£¢¯£›¯£”¯£¯£†¯£¯£x¯£q¯£j¯£c¯£\¯£U¯£N¯£G¯£@¯£9¯£2¯£+¯£$¯£¯£¯£¯£¯£¯£ú®£ó®£쮣宣Þ®£×®£Ю£É®£®£»®£´®£­®£¦®£Ÿ®£˜®£‘®£Š®£ƒ®£|®£u®£n®£g®£`®£Y®£R®£K®£D®£=®£6®£/®£(®£!®£®£®£ ®£®£þ­£÷­£ð­£é­£â­£Û­£Ô­£Í­£Æ­£¿­£¸­£±­£ª­££­£œ­£•­£Ž­£‡­£€­£y­£r­£k­£d­£]­£V­£O­£H­£A­£:­£3­£,­£%­£­£­£­£ ­£­£û¬£ô¬£í¬£欣߬£ج£Ѭ£ʬ£ì£¼¬£µ¬£®¬£§¬£ ¬£™¬£’¬£‹¬£„¬£}¬£v¬£o¬£h¬£a¬£Z¬£S¬£L¬£E¬£>¬£7¬£0¬£)¬£"¬£¬£¬£ ¬£¬£ÿ«£ø«£ñ«£ê«£ã«£Ü«£Õ«£Ϋ£Ç«£À«£¹«£²«£««£¤«£«£–«£«£ˆ«£«£z«£s«£l«£e«£^«£W«£P«£I«£B«£;«£4«£-«£&«£«£«£«£ «£«£üª£õª£窣ણÙª£Òª£˪£Ī£½ª£¶ª£¯ª£¨ª£¡ª£šª£“ª£Œª£…ª£~ª£wª£pª£iª£bª£[ª£Tª£Mª£Fª£?ª£8ª£1ª£*ª£#ª£ª£ª£ª£ª£ª£ù©£ò©£ë©£ä©£Ý©£Ö©£Ï©£È©£Á©£º©£³©£¬©£¥©£ž©£—©£©£‰©£‚©£{©£t©£m©£f©£_©£X©£Q©£J©£C©£<©£5©£.©£'©£ ©£©£©£ ©£©£ý¨£ö¨£﨣訣ᨣÚ¨£Ó¨£̨£Ũ£¾¨£·¨£°¨£©¨£¢¨£›¨£”¨£¨£†¨£¨£x¨£q¨£j¨£c¨£\¨£U¨£N¨£G¨£@¨£9¨£2¨£+¨£$¨£¨£¨£¨£¨£¨£ú§£ó§£ì§£å§£Þ§£×§£Ч£ɧ£§£»§£´§£­§£¦§£Ÿ§£˜§£‘§£Ч£ƒ§£|§£u§£n§£g§£`§£Y§£R§£K§£D§£=§£6§£/§£(§£!§£§£§£ §£§£þ¦£÷¦£ð¦£馣⦣Û¦£Ô¦£ͦ£Ʀ£¿¦£¸¦£±¦£ª¦££¦£œ¦£•¦£ަ£‡¦£€¦£y¦£r¦£k¦£d¦£]¦£V¦£O¦£H¦£A¦£:¦£3¦£,¦£%¦£¦£¦£¦£ ¦£¦£û¥£ô¥£í¥£楣ߥ£Ø¥£Ñ¥£Ê¥£Ã¥£¼¥£µ¥£®¥£§¥£ ¥£™¥£’¥£‹¥£„¥£}¥£v¥£o¥£h¥£a¥£Z¥£S¥£L¥£E¥£>¥£7¥£0¥£)¥£"¥£¥£¥£ ¥£¥£ÿ¤£ø¤£ñ¤£ꤣ㤣ܤ£Õ¤£Τ£Ǥ£À¤£¹¤£²¤£«¤£¤¤£¤£–¤£¤£ˆ¤£¤£z¤£s¤£l¤£e¤£^¤£W¤£P¤£I¤£B¤£;¤£4¤£-¤£&¤£¤£¤£¤£ ¤£¤£ü££õ££磣ࣣÙ££Ò££Ë££Ä££½££¶££¯££¨££¡££š££“££Œ££…££~££w££p££i££b££[££T££M££F££?££8££1££*££#££££££££££££ù¢£ò¢£뢣䢣Ý¢£Ö¢£Ï¢£È¢£Á¢£º¢£³¢£¬¢£¥¢£ž¢£—¢£¢£‰¢£‚¢£{¢£t¢£m¢£f¢£_¢£X¢£Q¢£J¢£C¢£<¢£5¢£.¢£'¢£ ¢£¢£¢£ ¢£¢£ý¡£ö¡£ï¡£è¡£á¡£Ú¡£Ó¡£Ì¡£Å¡£¾¡£·¡£°¡£©¡£¢¡£›¡£”¡£¡£†¡£¡£x¡£q¡£j¡£c¡£\¡£U¡£N¡£G¡£@¡£9¡£2¡£+¡£$¡£¡£¡£¡£¡£¡£ú £ó £ì £å £Þ £× £Р£É £ £» £´ £­ £¦ £Ÿ £˜ £‘ £Š £ƒ £| £u £n £g £` £Y £R £K £D £= £6 £/ £( £! £ £ £  £ £þŸ£÷Ÿ£ðŸ£韣⟣ÛŸ£ÔŸ£ÍŸ£ÆŸ£¿Ÿ£¸Ÿ£±Ÿ£ªŸ££Ÿ£œŸ£•Ÿ£ŽŸ£‡Ÿ£€Ÿ£yŸ£rŸ£kŸ£dŸ£]Ÿ£VŸ£OŸ£HŸ£AŸ£:Ÿ£3Ÿ£,Ÿ£%Ÿ£Ÿ£Ÿ£Ÿ£ Ÿ£Ÿ£ûž£ôž£힣枣ßž£Øž£Ñž£Êž£Þ£¼ž£µž£®ž£§ž£ ž£™ž£’ž£‹ž£„ž£}ž£vž£ož£hž£až£Zž£Sž£Lž£Ež£>ž£7ž£0ž£)ž£"ž£ž£ž£ ž£ž£ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££üœ£õœ£眣àœ£Ùœ£Òœ£Ëœ£Äœ£½œ£¶œ£¯œ£¨œ£¡œ£šœ£“œ£Œœ£…œ£~œ£wœ£pœ£iœ£bœ£[œ£Tœ£Mœ£Fœ£?œ£8œ£1œ£*œ£#œ£œ£œ£œ£œ£œ£ù›£ò›£뛣䛣Ý›£Ö›£Ï›£È›£Á›£º›£³›£¬›£¥›£ž›£—›£›£‰›£‚›£{›£t›£m›£f›£_›£X›£Q›£J›£C›£<›£5›£.›£'›£ ›£›£›£ ›£›£ýš£öš£蚣ᚣÚš£Óš£Ìš£Åš£¾š£·š£°š£©š£¢š£›š£”š£š£†š£š£xš£qš£jš£cš£\š£Uš£Nš£Gš£@š£9š£2š£+š£$š£š£š£š£š£š£ú™£ó™£왣噣Þ™£×™£Й£É™£™£»™£´™£­™£¦™£Ÿ™£˜™£‘™£Š™£ƒ™£|™£u™£n™£g™£`™£Y™£R™£K™£D™£=™£6™£/™£(™£!™£™£™£ ™£™£þ˜£÷˜£ð˜£阣☣Û˜£Ô˜£͘£Ƙ£¿˜£¸˜£±˜£ª˜££˜£œ˜£•˜£Ž˜£‡˜£€˜£y˜£r˜£k˜£d˜£]˜£V˜£O˜£H˜£A˜£:˜£3˜£,˜£%˜£˜£˜£˜£ ˜£˜£û—£ô—£í—£æ—£ß—£Ø—£Ñ—£Ê—£×£¼—£µ—£®—£§—£ —£™—£’—£‹—£„—£}—£v—£o—£h—£a—£Z—£S—£L—£E—£>—£7—£0—£)—£"—£—£—£ —£—£ÿ–£ø–£ñ–£ê–£ã–£Ü–£Õ–£Ζ£Ç–£À–£¹–£²–£«–£¤–£–£––£–£ˆ–£–£z–£s–£l–£e–£^–£W–£P–£I–£B–£;–£4–£-–£&–£–£–£–£ –£–£ü•£õ•£î•£ç•£à•£Ù•£Ò•£Ë•£Ä•£½•£¶•£¯•£¨•£¡•£š•£“•£Œ•£…•£~•£w•£p•£i•£b•£[•£T•£M•£F•£?•£8•£1•£*•£#•£•£•£•£•£•£ù”£ò”£딣䔣Ý”£Ö”£Ï”£È”£Á”£º”£³”£¬”£¥”£ž”£—”£”£‰”£‚”£{”£t”£m”£f”£_”£X”£Q”£J”£C”£<”£5”£.”£'”£ ”£”£”£ ”£”£ý“£ö“£ï“£è“£á“£Ú“£Ó“£Ì“£Å“£¾“£·“£°“£©“£¢“£›“£”“£“£†“£“£x“£q“£j“£c“£\“£U“£N“£G“£@“£9“£2“£+“£$“£“£“£“£“£“£ú’£ó’£ì’£å’£Þ’£×’£Ð’£É’£Â’£»’£´’£­’£¦’£Ÿ’£˜’£‘’£Š’£ƒ’£|’£u’£n’£g’£`’£Y’£R’£K’£D’£=’£6’£/’£(’£!’£’£’£ ’£’£þ‘£÷‘£ð‘£é‘£â‘£Û‘£Ô‘£Í‘£Æ‘£¿‘£¸‘£±‘£ª‘££‘£œ‘£•‘£Ž‘£‡‘£€‘£y‘£r‘£k‘£d‘£]‘£V‘£O‘£H‘£A‘£:‘£3‘£,‘£%‘£‘£‘£‘£ ‘£‘£û£ô£í£æ£ߣأѣʣ㼣µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££üŽ£õŽ£玣àŽ£ÙŽ£ÒŽ£ËŽ£ÄŽ£½Ž£¶Ž£¯Ž£¨Ž£¡Ž£šŽ£“Ž£ŒŽ£…Ž£~Ž£wŽ£pŽ£iŽ£bŽ£[Ž£TŽ£MŽ£FŽ£?Ž£8Ž£1Ž£*Ž£#ޣޣޣޣޣޣù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ýŒ£öŒ£茣ጣÚŒ£ÓŒ£ÌŒ£ÅŒ£¾Œ£·Œ£°Œ£©Œ£¢Œ£›Œ£”Œ£Œ£†Œ£Œ£xŒ£qŒ£jŒ£cŒ£\Œ£UŒ£NŒ£GŒ£@Œ£9Œ£2Œ£+Œ£$Œ£Œ£Œ£Œ£Œ£Œ£ú‹£ó‹£ì‹£å‹£Þ‹£׋£Ћ£É‹£‹£»‹£´‹£­‹£¦‹£Ÿ‹£˜‹£‘‹£Š‹£ƒ‹£|‹£u‹£n‹£g‹£`‹£Y‹£R‹£K‹£D‹£=‹£6‹£/‹£(‹£!‹£‹£‹£ ‹£‹£þŠ£÷Š£ðŠ£銣⊣ÛŠ£ÔŠ£ÍŠ£ÆŠ£¿Š£¸Š£±Š£ªŠ££Š£œŠ£•Š£ŽŠ£‡Š£€Š£yŠ£rŠ£kŠ£dŠ£]Š£VŠ£OŠ£HŠ£AŠ£:Š£3Š£,Š£%УУУУ УУû‰£ô‰£퉣扣߉£؉£щ£ʉ£É£¼‰£µ‰£®‰£§‰£ ‰£™‰£’‰£‹‰£„‰£}‰£v‰£o‰£h‰£a‰£Z‰£S‰£L‰£E‰£>‰£7‰£0‰£)‰£"‰£‰£‰£ ‰£‰£ÿˆ£øˆ£ñˆ£ꈣ㈣܈£Õˆ£Έ£Lj£Àˆ£¹ˆ£²ˆ£«ˆ£¤ˆ£ˆ£–ˆ£ˆ£ˆˆ£ˆ£zˆ£sˆ£lˆ£eˆ£^ˆ£Wˆ£Pˆ£Iˆ£Bˆ£;ˆ£4ˆ£-ˆ£&ˆ£ˆ£ˆ£ˆ£ ˆ£ˆ£ü‡£õ‡£燣à‡£Ù‡£Ò‡£ˇ£ć£½‡£¶‡£¯‡£¨‡£¡‡£š‡£“‡£Œ‡£…‡£~‡£w‡£p‡£i‡£b‡£[‡£T‡£M‡£F‡£?‡£8‡£1‡£*‡£#‡£‡£‡£‡£‡£‡£ù†£ò†£놣䆣݆£Ö†£φ£Ȇ£Á†£º†£³†£¬†£¥†£ž†£—†£†£‰†£‚†£{†£t†£m†£f†£_†£X†£Q†£J†£C†£<†£5†£.†£'†£ †£†£†£ †£†£ý…£ö…£ï…£è…£á…£Ú…£Ó…£Ì…£Å…£¾…£·…£°…£©…£¢…£›…£”…£…£†…£…£x…£q…£j…£c…£\…£U…£N…£G…£@…£9…£2…£+…£$…£…£…£…£…£…£ú„£ó„£ì„£å„£Þ„£ׄ£Є£É„£„£»„£´„£­„£¦„£Ÿ„£˜„£‘„£Š„£ƒ„£|„£u„£n„£g„£`„£Y„£R„£K„£D„£=„£6„£/„£(„£!„£„£„£ „£„£þƒ£÷ƒ£ðƒ£郣⃣Ûƒ£Ôƒ£̓£ƃ£¿ƒ£¸ƒ£±ƒ£ªƒ££ƒ£œƒ£•ƒ£Žƒ£‡ƒ£€ƒ£yƒ£rƒ£kƒ£dƒ£]ƒ£Vƒ£Oƒ£Hƒ£Aƒ£:ƒ£3ƒ£,ƒ£%ƒ£ƒ£ƒ£ƒ£ ƒ£ƒ£û‚£ô‚£í‚£æ‚£ß‚£Ø‚£Ñ‚£Ê‚££¼‚£µ‚£®‚£§‚£ ‚£™‚£’‚£‹‚£„‚£}‚£v‚£o‚£h‚£a‚£Z‚£S‚£L‚£E‚£>‚£7‚£0‚£)‚£"‚£‚£‚£ ‚£‚£ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü€£õ€£瀣à€£Ù€£Ò€£Ë€£Ä€£½€£¶€£¯€£¨€£¡€£š€£“€£Œ€£…€£~€£w€£p€£i€£b€£[€£T€£M€£F€£?€£8€£1€£*€£#€£€£€£€£€£€£ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý~£ö~£ï~£è~£á~£Ú~£Ó~£Ì~£Å~£¾~£·~£°~£©~£¢~£›~£”~£~£†~£~£x~£q~£j~£c~£\~£U~£N~£G~£@~£9~£2~£+~£$~£~£~£~£~£~£ú}£ó}£ì}£å}£Þ}£×}£Ð}£É}£Â}£»}£´}£­}£¦}£Ÿ}£˜}£‘}£Š}£ƒ}£|}£u}£n}£g}£`}£Y}£R}£K}£D}£=}£6}£/}£(}£!}£}£}£ }£}£þ|£÷|£ð|£é|£â|£Û|£Ô|£Í|£Æ|£¿|£¸|£±|£ª|££|£œ|£•|£Ž|£‡|£€|£y|£r|£k|£d|£]|£V|£O|£H|£A|£:|£3|£,|£%|£|£|£|£ |£|£û{£ô{£í{£æ{£ß{£Ø{£Ñ{£Ê{£Ã{£¼{£µ{£®{£§{£ {£™{£’{£‹{£„{£}{£v{£o{£h{£a{£Z{£S{£L{£E{£>{£7{£0{£){£"{£{£{£ {£{£ÿz£øz£ñz£êz£ãz£Üz£Õz£Îz£Çz£Àz£¹z£²z£«z£¤z£z£–z£z£ˆz£z£zz£sz£lz£ez£^z£Wz£Pz£Iz£Bz£;z£4z£-z£&z£z£z£z£ z£z£üy£õy£îy£çy£ày£Ùy£Òy£Ëy£Äy£½y£¶y£¯y£¨y£¡y£šy£“y£Œy£…y£~y£wy£py£iy£by£[y£Ty£My£Fy£?y£8y£1y£*y£#y£y£y£y£y£y£ùx£òx£ëx£äx£Ýx£Öx£Ïx£Èx£Áx£ºx£³x£¬x£¥x£žx£—x£x£‰x£‚x£{x£tx£mx£fx£_x£Xx£Qx£Jx£Cx£t£7t£0t£)t£"t£t£t£ t£t£ÿs£øs£ñs£ês£ãs£Üs£Õs£Îs£Çs£Às£¹s£²s£«s£¤s£s£–s£s£ˆs£s£zs£ss£ls£es£^s£Ws£Ps£Is£Bs£;s£4s£-s£&s£s£s£s£ s£s£ür£õr£îr£çr£àr£Ùr£Òr£Ër£Är£½r£¶r£¯r£¨r£¡r£šr£“r£Œr£…r£~r£wr£pr£ir£br£[r£Tr£Mr£Fr£?r£8r£1r£*r£#r£r£r£r£r£r£ùq£òq£ëq£äq£Ýq£Öq£Ïq£Èq£Áq£ºq£³q£¬q£¥q£žq£—q£q£‰q£‚q£{q£tq£mq£fq£_q£Xq£Qq£Jq£Cq£m£7m£0m£)m£"m£m£m£ m£m£ÿl£øl£ñl£êl£ãl£Ül£Õl£Îl£Çl£Àl£¹l£²l£«l£¤l£l£–l£l£ˆl£l£zl£sl£ll£el£^l£Wl£Pl£Il£Bl£;l£4l£-l£&l£l£l£l£ l£l£ük£õk£îk£çk£àk£Ùk£Òk£Ëk£Äk£½k£¶k£¯k£¨k£¡k£šk£“k£Œk£…k£~k£wk£pk£ik£bk£[k£Tk£Mk£Fk£?k£8k£1k£*k£#k£k£k£k£k£k£ùj£òj£ëj£äj£Ýj£Öj£Ïj£Èj£Áj£ºj£³j£¬j£¥j£žj£—j£j£‰j£‚j£{j£tj£mj£fj£_j£Xj£Qj£Jj£Cj£f£7f£0f£)f£"f£f£f£ f£f£ÿe£øe£ñe£êe£ãe£Üe£Õe£Îe£Çe£Àe£¹e£²e£«e£¤e£e£–e£e£ˆe£e£ze£se£le£ee£^e£We£Pe£Ie£Be£;e£4e£-e£&e£e£e£e£ e£e£üd£õd£îd£çd£àd£Ùd£Òd£Ëd£Äd£½d£¶d£¯d£¨d£¡d£šd£“d£Œd£…d£~d£wd£pd£id£bd£[d£Td£Md£Fd£?d£8d£1d£*d£#d£d£d£d£d£d£ùc£òc£ëc£äc£Ýc£Öc£Ïc£Èc£Ác£ºc£³c£¬c£¥c£žc£—c£c£‰c£‚c£{c£tc£mc£fc£_c£Xc£Qc£Jc£Cc£_£7_£0_£)_£"_£_£_£ _£_£ÿ^£ø^£ñ^£ê^£ã^£Ü^£Õ^£Î^£Ç^£À^£¹^£²^£«^£¤^£^£–^£^£ˆ^£^£z^£s^£l^£e^£^^£W^£P^£I^£B^£;^£4^£-^£&^£^£^£^£ ^£^£ü]£õ]£î]£ç]£à]£Ù]£Ò]£Ë]£Ä]£½]£¶]£¯]£¨]£¡]£š]£“]£Œ]£…]£~]£w]£p]£i]£b]£[]£T]£M]£F]£?]£8]£1]£*]£#]£]£]£]£]£]£ù\£ò\£ë\£ä\£Ý\£Ö\£Ï\£È\£Á\£º\£³\£¬\£¥\£ž\£—\£\£‰\£‚\£{\£t\£m\£f\£_\£X\£Q\£J\£C\£<\£5\£.\£'\£ \£\£\£ \£\£ý[£ö[£ï[£è[£á[£Ú[£Ó[£Ì[£Å[£¾[£·[£°[£©[£¢[£›[£”[£[£†[£[£x[£q[£j[£c[£\[£U[£N[£G[£@[£9[£2[£+[£$[£[£[£[£[£[£úZ£óZ£ìZ£åZ£ÞZ£×Z£ÐZ£ÉZ£ÂZ£»Z£´Z£­Z£¦Z£ŸZ£˜Z£‘Z£ŠZ£ƒZ£|Z£uZ£nZ£gZ£`Z£YZ£RZ£KZ£DZ£=Z£6Z£/Z£(Z£!Z£Z£Z£ Z£Z£þY£÷Y£ðY£éY£âY£ÛY£ÔY£ÍY£ÆY£¿Y£¸Y£±Y£ªY££Y£œY£•Y£ŽY£‡Y£€Y£yY£rY£kY£dY£]Y£VY£OY£HY£AY£:Y£3Y£,Y£%Y£Y£Y£Y£ Y£Y£ûX£ôX£íX£æX£ßX£ØX£ÑX£ÊX£ÃX£¼X£µX£®X£§X£ X£™X£’X£‹X£„X£}X£vX£oX£hX£aX£ZX£SX£LX£EX£>X£7X£0X£)X£"X£X£X£ X£X£ÿW£øW£ñW£êW£ãW£ÜW£ÕW£ÎW£ÇW£ÀW£¹W£²W£«W£¤W£W£–W£W£ˆW£W£zW£sW£lW£eW£^W£WW£PW£IW£BW£;W£4W£-W£&W£W£W£W£ W£W£üV£õV£îV£çV£àV£ÙV£ÒV£ËV£ÄV£½V£¶V£¯V£¨V£¡V£šV£“V£ŒV£…V£~V£wV£pV£iV£bV£[V£TV£MV£FV£?V£8V£1V£*V£#V£V£V£V£V£V£ùU£òU£ëU£äU£ÝU£ÖU£ÏU£ÈU£ÁU£ºU£³U£¬U£¥U£žU£—U£U£‰U£‚U£{U£tU£mU£fU£_U£XU£QU£JU£CU£Q£7Q£0Q£)Q£"Q£Q£Q£ Q£Q£ÿP£øP£ñP£êP£ãP£ÜP£ÕP£ÎP£ÇP£ÀP£¹P£²P£«P£¤P£P£–P£P£ˆP£P£zP£sP£lP£eP£^P£WP£PP£IP£BP£;P£4P£-P£&P£P£P£P£ P£P£üO£õO£îO£çO£àO£ÙO£ÒO£ËO£ÄO£½O£¶O£¯O£¨O£¡O£šO£“O£ŒO£…O£~O£wO£pO£iO£bO£[O£TO£MO£FO£?O£8O£1O£*O£#O£O£O£O£O£O£ùN£òN£ëN£äN£ÝN£ÖN£ÏN£ÈN£ÁN£ºN£³N£¬N£¥N£žN£—N£N£‰N£‚N£{N£tN£mN£fN£_N£XN£QN£JN£CN£J£7J£0J£)J£"J£J£J£ J£J£ÿI£øI£ñI£êI£ãI£ÜI£ÕI£ÎI£ÇI£ÀI£¹I£²I£«I£¤I£I£–I£I£ˆI£I£zI£sI£lI£eI£^I£WI£PI£II£BI£;I£4I£-I£&I£I£I£I£ I£I£üH£õH£îH£çH£àH£ÙH£ÒH£ËH£ÄH£½H£¶H£¯H£¨H£¡H£šH£“H£ŒH£…H£~H£wH£pH£iH£bH£[H£TH£MH£FH£?H£8H£1H£*H£#H£H£H£H£H£H£ùG£òG£ëG£äG£ÝG£ÖG£ÏG£ÈG£ÁG£ºG£³G£¬G£¥G£žG£—G£G£‰G£‚G£{G£tG£mG£fG£_G£XG£QG£JG£CG£C£7C£0C£)C£"C£C£C£ C£C£ÿB£øB£ñB£êB£ãB£ÜB£ÕB£ÎB£ÇB£ÀB£¹B£²B£«B£¤B£B£–B£B£ˆB£B£zB£sB£lB£eB£^B£WB£PB£IB£BB£;B£4B£-B£&B£B£B£B£ B£B£üA£õA£îA£çA£àA£ÙA£ÒA£ËA£ÄA£½A£¶A£¯A£¨A£¡A£šA£“A£ŒA£…A£~A£wA£pA£iA£bA£[A£TA£MA£FA£?A£8A£1A£*A£#A£A£A£A£A£A£ù@£ò@£ë@£ä@£Ý@£Ö@£Ï@£È@£Á@£º@£³@£¬@£¥@£ž@£—@£@£‰@£‚@£{@£t@£m@£f@£_@£X@£Q@£J@£C@£<@£5@£.@£'@£ @£@£@£ @£@£ý?£ö?£ï?£è?£á?£Ú?£Ó?£Ì?£Å?£¾?£·?£°?£©?£¢?£›?£”?£?£†?£?£x?£q?£j?£c?£\?£U?£N?£G?£@?£9?£2?£+?£$?£?£?£?£?£?£ú>£ó>£ì>£å>£Þ>£×>£Ð>£É>£Â>£»>£´>£­>£¦>£Ÿ>£˜>£‘>£Š>£ƒ>£|>£u>£n>£g>£`>£Y>£R>£K>£D>£=>£6>£/>£(>£!>£>£>£ >£>£þ=£÷=£ð=£é=£â=£Û=£Ô=£Í=£Æ=£¿=£¸=£±=£ª=££=£œ=£•=£Ž=£‡=£€=£y=£r=£k=£d=£]=£V=£O=£H=£A=£:=£3=£,=£%=£=£=£=£ =£=£û<£ô<£í<£æ<£ß<£Ø<£Ñ<£Ê<£Ã<£¼<£µ<£®<£§<£ <£™<£’<£‹<£„<£}<£v<£o<£h<£a<£Z<£S<£L<£E<£><£7<£0<£)<£"<£<£<£ <£<£ÿ;£ø;£ñ;£ê;£ã;£Ü;£Õ;£Î;£Ç;£À;£¹;£²;£«;£¤;£;£–;£;£ˆ;£;£z;£s;£l;£e;£^;£W;£P;£I;£B;£;;£4;£-;£&;£;£;£;£ ;£;£ü:£õ:£î:£ç:£à:£Ù:£Ò:£Ë:£Ä:£½:£¶:£¯:£¨:£¡:£š:£“:£Œ:£…:£~:£w:£p:£i:£b:£[:£T:£M:£F:£?:£8:£1:£*:£#:£:£:£:£:£:£ù9£ò9£ë9£ä9£Ý9£Ö9£Ï9£È9£Á9£º9£³9£¬9£¥9£ž9£—9£9£‰9£‚9£{9£t9£m9£f9£_9£X9£Q9£J9£C9£<9£59£.9£'9£ 9£9£9£ 9£9£ý8£ö8£ï8£è8£á8£Ú8£Ó8£Ì8£Å8£¾8£·8£°8£©8£¢8£›8£”8£8£†8£8£x8£q8£j8£c8£\8£U8£N8£G8£@8£98£28£+8£$8£8£8£8£8£8£ú7£ó7£ì7£å7£Þ7£×7£Ð7£É7£Â7£»7£´7£­7£¦7£Ÿ7£˜7£‘7£Š7£ƒ7£|7£u7£n7£g7£`7£Y7£R7£K7£D7£=7£67£/7£(7£!7£7£7£ 7£7£þ6£÷6£ð6£é6£â6£Û6£Ô6£Í6£Æ6£¿6£¸6£±6£ª6££6£œ6£•6£Ž6£‡6£€6£y6£r6£k6£d6£]6£V6£O6£H6£A6£:6£36£,6£%6£6£6£6£ 6£6£û5£ô5£í5£æ5£ß5£Ø5£Ñ5£Ê5£Ã5£¼5£µ5£®5£§5£ 5£™5£’5£‹5£„5£}5£v5£o5£h5£a5£Z5£S5£L5£E5£>5£75£05£)5£"5£5£5£ 5£5£ÿ4£ø4£ñ4£ê4£ã4£Ü4£Õ4£Î4£Ç4£À4£¹4£²4£«4£¤4£4£–4£4£ˆ4£4£z4£s4£l4£e4£^4£W4£P4£I4£B4£;4£44£-4£&4£4£4£4£ 4£4£ü3£õ3£î3£ç3£à3£Ù3£Ò3£Ë3£Ä3£½3£¶3£¯3£¨3£¡3£š3£“3£Œ3£…3£~3£w3£p3£i3£b3£[3£T3£M3£F3£?3£83£13£*3£#3£3£3£3£3£3£ù2£ò2£ë2£ä2£Ý2£Ö2£Ï2£È2£Á2£º2£³2£¬2£¥2£ž2£—2£2£‰2£‚2£{2£t2£m2£f2£_2£X2£Q2£J2£C2£<2£52£.2£'2£ 2£2£2£ 2£2£ý1£ö1£ï1£è1£á1£Ú1£Ó1£Ì1£Å1£¾1£·1£°1£©1£¢1£›1£”1£1£†1£1£x1£q1£j1£c1£\1£U1£N1£G1£@1£91£21£+1£$1£1£1£1£1£1£ú0£ó0£ì0£å0£Þ0£×0£Ð0£É0£Â0£»0£´0£­0£¦0£Ÿ0£˜0£‘0£Š0£ƒ0£|0£u0£n0£g0£`0£Y0£R0£K0£D0£=0£60£/0£(0£!0£0£0£ 0£0£þ/£÷/£ð/£é/£â/£Û/£Ô/£Í/£Æ/£¿/£¸/£±/£ª/££/£œ/£•/£Ž/£‡/£€/£y/£r/£k/£d/£]/£V/£O/£H/£A/£:/£3/£,/£%/£/£/£/£ /£/£û.£ô.£í.£æ.£ß.£Ø.£Ñ.£Ê.£Ã.£¼.£µ.£®.£§.£ .£™.£’.£‹.£„.£}.£v.£o.£h.£a.£Z.£S.£L.£E.£>.£7.£0.£).£".£.£.£ .£.£ÿ-£ø-£ñ-£ê-£ã-£Ü-£Õ-£Î-£Ç-£À-£¹-£²-£«-£¤-£-£–-£-£ˆ-£-£z-£s-£l-£e-£^-£W-£P-£I-£B-£;-£4-£--£&-£-£-£-£ -£-£ü,£õ,£î,£ç,£à,£Ù,£Ò,£Ë,£Ä,£½,£¶,£¯,£¨,£¡,£š,£“,£Œ,£…,£~,£w,£p,£i,£b,£[,£T,£M,£F,£?,£8,£1,£*,£#,£,£,£,£,£,£ù+£ò+£ë+£ä+£Ý+£Ö+£Ï+£È+£Á+£º+£³+£¬+£¥+£ž+£—+£+£‰+£‚+£{+£t+£m+£f+£_+£X+£Q+£J+£C+£<+£5+£.+£'+£ +£+£+£ +£+£ý*£ö*£ï*£è*£á*£Ú*£Ó*£Ì*£Å*£¾*£·*£°*£©*£¢*£›*£”*£*£†*£*£x*£q*£j*£c*£\*£U*£N*£G*£@*£9*£2*£+*£$*£*£*£*£*£*£ú)£ó)£ì)£å)£Þ)£×)£Ð)£É)£Â)£»)£´)£­)£¦)£Ÿ)£˜)£‘)£Š)£ƒ)£|)£u)£n)£g)£`)£Y)£R)£K)£D)£=)£6)£/)£()£!)£)£)£ )£)£þ(£÷(£ð(£é(£â(£Û(£Ô(£Í(£Æ(£¿(£¸(£±(£ª(££(£œ(£•(£Ž(£‡(£€(£y(£r(£k(£d(£](£V(£O(£H(£A(£:(£3(£,(£%(£(£(£(£ (£(£û'£ô'£í'£æ'£ß'£Ø'£Ñ'£Ê'£Ã'£¼'£µ'£®'£§'£ '£™'£’'£‹'£„'£}'£v'£o'£h'£a'£Z'£S'£L'£E'£>'£7'£0'£)'£"'£'£'£ '£'£ÿ&£ø&£ñ&£ê&£ã&£Ü&£Õ&£Î&£Ç&£À&£¹&£²&£«&£¤&£&£–&£&£ˆ&£&£z&£s&£l&£e&£^&£W&£P&£I&£B&£;&£4&£-&£&&£&£&£&£ &£&£ü%£õ%£î%£ç%£à%£Ù%£Ò%£Ë%£Ä%£½%£¶%£¯%£¨%£¡%£š%£“%£Œ%£…%£~%£w%£p%£i%£b%£[%£T%£M%£F%£?%£8%£1%£*%£#%£%£%£%£%£%£ù$£ò$£ë$£ä$£Ý$£Ö$£Ï$£È$£Á$£º$£³$£¬$£¥$£ž$£—$£$£‰$£‚$£{$£t$£m$£f$£_$£X$£Q$£J$£C$£<$£5$£.$£'$£ $£$£$£ $£$£ý#£ö#£ï#£è#£á#£Ú#£Ó#£Ì#£Å#£¾#£·#£°#£©#£¢#£›#£”#£#£†#£#£x#£q#£j#£c#£\#£U#£N#£G#£@#£9#£2#£+#£$#£#£#£#£#£#£ú"£ó"£ì"£å"£Þ"£×"£Ð"£É"£Â"£»"£´"£­"£¦"£Ÿ"£˜"£‘"£Š"£ƒ"£|"£u"£n"£g"£`"£Y"£R"£K"£D"£="£6"£/"£("£!"£"£"£ "£"£þ!£÷!£ð!£é!£â!£Û!£Ô!£Í!£Æ!£¿!£¸!£±!£ª!££!£œ!£•!£Ž!£‡!£€!£y!£r!£k!£d!£]!£V!£O!£H!£A!£:!£3!£,!£%!£!£!£!£ !£!£û £ô £í £æ £ß £Ø £Ñ £Ê £à £¼ £µ £® £§ £  £™ £’ £‹ £„ £} £v £o £h £a £Z £S £L £E £> £7 £0 £) £" £ £ £ £ £ÿ£ø£ñ£ê£ã£Ü£Õ£Î£Ç£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú£ó£ì£å£Þ£×£Ð£É£Â£»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û£ô£í£æ£ß£Ø£Ñ£Ê£Ã£¼£µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ£ø£ñ£ê£ã£Ü£Õ£Î£Ç£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú£ó£ì£å£Þ£×£Ð£É£Â£»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û£ô£í£æ£ß£Ø£Ñ£Ê£Ã£¼£µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ£ø£ñ£ê£ã£Ü£Õ£Î£Ç£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú £ó £ì £å £Þ £× £Ð £É £ £» £´ £­ £¦ £Ÿ £˜ £‘ £Š £ƒ £| £u £n £g £` £Y £R £K £D £= £6 £/ £( £! £ £ £ £ £þ £÷ £ð £é £â £Û £Ô £Í £Æ £¿ £¸ £± £ª ££ £œ £• £Ž £‡ £€ £y £r £k £d £] £V £O £H £A £: £3 £, £% £ £ £ £ £ £û £ô £í £æ £ß £Ø £Ñ £Ê £à £¼ £µ £® £§ £  £™ £’ £‹ £„ £} £v £o £h £a £Z £S £L £E £> £7 £0 £) £" £ £ £ £ £ÿ £ø £ñ £ê £ã £Ü £Õ £Î £Ç £À £¹ £² £« £¤ £ £– £ £ˆ £ £z £s £l £e £^ £W £P £I £B £; £4 £- £& £ £ £ £ £ £ü £õ £î £ç £à £Ù £Ò £Ë £Ä £½ £¶ £¯ £¨ £¡ £š £“ £Œ £… £~ £w £p £i £b £[ £T £M £F £? £8 £1 £* £# £ £ £ £ £ £ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú£ó£ì£å£Þ£×£Ð£É£Â£»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û£ô£í£æ£ß£Ø£Ñ£Ê£Ã£¼£µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ£ø£ñ£ê£ã£Ü£Õ£Î£Ç£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££úÿ¢óÿ¢ìÿ¢åÿ¢Þÿ¢×ÿ¢Ðÿ¢Éÿ¢Âÿ¢»ÿ¢´ÿ¢­ÿ¢¦ÿ¢Ÿÿ¢˜ÿ¢‘ÿ¢Šÿ¢ƒÿ¢|ÿ¢uÿ¢nÿ¢gÿ¢`ÿ¢Yÿ¢Rÿ¢Kÿ¢Dÿ¢=ÿ¢6ÿ¢/ÿ¢(ÿ¢!ÿ¢ÿ¢ÿ¢ ÿ¢ÿ¢þþ¢÷þ¢ðþ¢éþ¢âþ¢Ûþ¢Ôþ¢Íþ¢Æþ¢¿þ¢¸þ¢±þ¢ªþ¢£þ¢œþ¢•þ¢Žþ¢‡þ¢€þ¢yþ¢rþ¢kþ¢dþ¢]þ¢Vþ¢Oþ¢Hþ¢Aþ¢:þ¢3þ¢,þ¢%þ¢þ¢þ¢þ¢ þ¢þ¢ûý¢ôý¢íý¢æý¢ßý¢Øý¢Ñý¢Êý¢Ãý¢¼ý¢µý¢®ý¢§ý¢ ý¢™ý¢’ý¢‹ý¢„ý¢}ý¢vý¢oý¢hý¢aý¢Zý¢Sý¢Lý¢Eý¢>ý¢7ý¢0ý¢)ý¢"ý¢ý¢ý¢ ý¢ý¢ÿü¢øü¢ñü¢êü¢ãü¢Üü¢Õü¢Îü¢Çü¢Àü¢¹ü¢²ü¢«ü¢¤ü¢ü¢–ü¢ü¢ˆü¢ü¢zü¢sü¢lü¢eü¢^ü¢Wü¢Pü¢Iü¢Bü¢;ü¢4ü¢-ü¢&ü¢ü¢ü¢ü¢ ü¢ü¢üû¢õû¢îû¢çû¢àû¢Ùû¢Òû¢Ëû¢Äû¢½û¢¶û¢¯û¢¨û¢¡û¢šû¢“û¢Œû¢…û¢~û¢wû¢pû¢iû¢bû¢[û¢Tû¢Mû¢Fû¢?û¢8û¢1û¢*û¢#û¢û¢û¢û¢û¢û¢ùú¢òú¢ëú¢äú¢Ýú¢Öú¢Ïú¢Èú¢Áú¢ºú¢³ú¢¬ú¢¥ú¢žú¢—ú¢ú¢‰ú¢‚ú¢{ú¢tú¢mú¢fú¢_ú¢Xú¢Qú¢Jú¢Cú¢<ú¢5ú¢.ú¢'ú¢ ú¢ú¢ú¢ ú¢ú¢ýù¢öù¢ïù¢èù¢áù¢Úù¢Óù¢Ìù¢Åù¢¾ù¢·ù¢°ù¢©ù¢¢ù¢›ù¢”ù¢ù¢†ù¢ù¢xù¢qù¢jù¢cù¢\ù¢Uù¢Nù¢Gù¢@ù¢9ù¢2ù¢+ù¢$ù¢ù¢ù¢ù¢ù¢ù¢úø¢óø¢ìø¢åø¢Þø¢×ø¢Ðø¢Éø¢Âø¢»ø¢´ø¢­ø¢¦ø¢Ÿø¢˜ø¢‘ø¢Šø¢ƒø¢|ø¢uø¢nø¢gø¢`ø¢Yø¢Rø¢Kø¢Dø¢=ø¢6ø¢/ø¢(ø¢!ø¢ø¢ø¢ ø¢ø¢þ÷¢÷÷¢ð÷¢é÷¢â÷¢Û÷¢Ô÷¢Í÷¢Æ÷¢¿÷¢¸÷¢±÷¢ª÷¢£÷¢œ÷¢•÷¢Ž÷¢‡÷¢€÷¢y÷¢r÷¢k÷¢d÷¢]÷¢V÷¢O÷¢H÷¢A÷¢:÷¢3÷¢,÷¢%÷¢÷¢÷¢÷¢ ÷¢÷¢ûö¢ôö¢íö¢æö¢ßö¢Øö¢Ñö¢Êö¢Ãö¢¼ö¢µö¢®ö¢§ö¢ ö¢™ö¢’ö¢‹ö¢„ö¢}ö¢vö¢oö¢hö¢aö¢Zö¢Sö¢Lö¢Eö¢>ö¢7ö¢0ö¢)ö¢"ö¢ö¢ö¢ ö¢ö¢ÿõ¢øõ¢ñõ¢êõ¢ãõ¢Üõ¢Õõ¢Îõ¢Çõ¢Àõ¢¹õ¢²õ¢«õ¢¤õ¢õ¢–õ¢õ¢ˆõ¢õ¢zõ¢sõ¢lõ¢eõ¢^õ¢Wõ¢Põ¢Iõ¢Bõ¢;õ¢4õ¢-õ¢&õ¢õ¢õ¢õ¢ õ¢õ¢üô¢õô¢îô¢çô¢àô¢Ùô¢Òô¢Ëô¢Äô¢½ô¢¶ô¢¯ô¢¨ô¢¡ô¢šô¢“ô¢Œô¢…ô¢~ô¢wô¢pô¢iô¢bô¢[ô¢Tô¢Mô¢Fô¢?ô¢8ô¢1ô¢*ô¢#ô¢ô¢ô¢ô¢ô¢ô¢ùó¢òó¢ëó¢äó¢Ýó¢Öó¢Ïó¢Èó¢Áó¢ºó¢³ó¢¬ó¢¥ó¢žó¢—ó¢ó¢‰ó¢‚ó¢{ó¢tó¢mó¢fó¢_ó¢Xó¢Qó¢Jó¢Có¢<ó¢5ó¢.ó¢'ó¢ ó¢ó¢ó¢ ó¢ó¢ýò¢öò¢ïò¢èò¢áò¢Úò¢Óò¢Ìò¢Åò¢¾ò¢·ò¢°ò¢©ò¢¢ò¢›ò¢”ò¢ò¢†ò¢ò¢xò¢qò¢jò¢cò¢\ò¢Uò¢Nò¢Gò¢@ò¢9ò¢2ò¢+ò¢$ò¢ò¢ò¢ò¢ò¢ò¢úñ¢óñ¢ìñ¢åñ¢Þñ¢×ñ¢Ðñ¢Éñ¢Âñ¢»ñ¢´ñ¢­ñ¢¦ñ¢Ÿñ¢˜ñ¢‘ñ¢Šñ¢ƒñ¢|ñ¢uñ¢nñ¢gñ¢`ñ¢Yñ¢Rñ¢Kñ¢Dñ¢=ñ¢6ñ¢/ñ¢(ñ¢!ñ¢ñ¢ñ¢ ñ¢ñ¢þð¢÷ð¢ðð¢éð¢âð¢Ûð¢Ôð¢Íð¢Æð¢¿ð¢¸ð¢±ð¢ªð¢£ð¢œð¢•ð¢Žð¢‡ð¢€ð¢yð¢rð¢kð¢dð¢]ð¢Vð¢Oð¢Hð¢Að¢:ð¢3ð¢,ð¢%ð¢ð¢ð¢ð¢ ð¢ð¢ûï¢ôï¢íï¢æï¢ßï¢Øï¢Ñï¢Êï¢Ãï¢}ï¢vï¢oï¢hï¢aï¢Zï¢Sï¢Lï¢Eï¢>ï¢7ï¢0ï¢)ï¢"ï¢ï¢ï¢ ï¢ï¢ÿî¢øî¢ñî¢êî¢ãî¢Üî¢Õî¢Îî¢Çî¢Àî¢î¢–î¢î¢ˆî¢î¢zî¢sî¢lî¢eî¢^î¢Wî¢Pî¢Iî¢Bî¢;î¢4î¢-î¢&î¢î¢î¢î¢ î¢î¢üí¢õí¢îí¢çí¢àí¢Ùí¢Òí¢Ëí¢Äí¢½í¢¶í¢¯í¢¨í¢¡í¢ší¢“í¢Œí¢…í¢~í¢wí¢pí¢ií¢bí¢[í¢Tí¢Mí¢Fí¢?í¢8í¢1í¢*í¢#í¢í¢í¢í¢í¢í¢ùì¢òì¢ëì¢äì¢Ýì¢Öì¢Ïì¢Èì¢Á좺좳좬좥좞좗ì¢ì¢‰ì¢‚ì¢{ì¢tì¢mì¢fì¢_ì¢Xì¢Qì¢Jì¢Cì¢<ì¢5ì¢.ì¢'ì¢ ì¢ì¢ì¢ ì¢ì¢ýë¢öë¢ïë¢èë¢áë¢Úë¢Óë¢Ìë¢Å뢾뢷뢰뢩뢢뢛뢔ë¢ë¢†ë¢ë¢xë¢që¢jë¢cë¢\ë¢Uë¢Në¢Gë¢@ë¢9ë¢2ë¢+ë¢$ë¢ë¢ë¢ë¢ë¢ë¢úê¢óê¢ìê¢åê¢Þê¢×ê¢Ðê¢Éê¢Âꢻꢴꢭꢦꢟꢘꢑꢊꢃê¢|ê¢uê¢nê¢gê¢`ê¢Yê¢Rê¢Kê¢Dê¢=ê¢6ê¢/ê¢(ê¢!ê¢ê¢ê¢ ê¢ê¢þé¢÷é¢ðé¢éé¢âé¢Ûé¢Ôé¢Íé¢Æé¢¿é¢¸é¢±é¢ªé¢£é¢œé¢•é¢Žé¢‡é¢€é¢yé¢ré¢ké¢dé¢]é¢Vé¢Oé¢Hé¢Aé¢:é¢3é¢,é¢%é¢é¢é¢é¢ é¢é¢ûè¢ôè¢íè¢æè¢ßè¢Øè¢Ñè¢Êè¢Ã袼袵袮袧袠袙袒袋袄è¢}è¢vè¢oè¢hè¢aè¢Zè¢Sè¢Lè¢Eè¢>è¢7è¢0è¢)è¢"è¢è¢è¢ è¢è¢ÿç¢øç¢ñç¢êç¢ãç¢Üç¢Õç¢Îç¢Çç¢À碹碲碫碤ç¢ç¢–ç¢ç¢ˆç¢ç¢zç¢sç¢lç¢eç¢^ç¢Wç¢Pç¢Iç¢Bç¢;ç¢4ç¢-ç¢&ç¢ç¢ç¢ç¢ ç¢ç¢üæ¢õæ¢îæ¢çæ¢àæ¢Ùæ¢Òæ¢Ëæ¢Ä梽梶梯梨梡梚梓梌梅æ¢~æ¢wæ¢pæ¢iæ¢bæ¢[æ¢Tæ¢Mæ¢Fæ¢?æ¢8æ¢1æ¢*æ¢#æ¢æ¢æ¢æ¢æ¢æ¢ùå¢òå¢ëå¢äå¢Ýå¢Öå¢Ïå¢Èå¢Á墺墳墬墥增増å¢å¢‰å¢‚å¢{å¢tå¢må¢få¢_å¢Xå¢Qå¢Jå¢Cå¢<å¢5å¢.å¢'å¢ å¢å¢å¢ å¢å¢ýä¢öä¢ïä¢èä¢áä¢Úä¢Óä¢Ìä¢Å䢾䢷䢰䢩䢢䢛䢔ä¢ä¢†ä¢ä¢xä¢qä¢jä¢cä¢\ä¢Uä¢Nä¢Gä¢@ä¢9ä¢2ä¢+ä¢$ä¢ä¢ä¢ä¢ä¢ä¢úã¢óã¢ìã¢åã¢Þã¢×ã¢Ðã¢Éã¢Â㢻㢴㢭㢦㢟㢘㢑㢊㢃ã¢|ã¢uã¢nã¢gã¢`ã¢Yã¢Rã¢Kã¢Dã¢=ã¢6ã¢/ã¢(ã¢!ã¢ã¢ã¢ ã¢ã¢þâ¢÷â¢ðâ¢éâ¢ââ¢Ûâ¢Ôâ¢Íâ¢Æâ¢¿â¢¸â¢±â¢ªâ¢£â¢œâ¢•â¢Žâ¢‡â¢€â¢yâ¢râ¢kâ¢dâ¢]â¢Vâ¢Oâ¢Hâ¢Aâ¢:â¢3â¢,â¢%â¢â¢â¢â¢ â¢â¢ûá¢ôá¢íá¢æá¢ßá¢Øá¢Ñá¢Êá¢Ãᢼᢵ᢮ᢧᢠᢙᢒᢋᢄá¢}á¢vá¢oá¢há¢aá¢Zá¢Sá¢Lá¢Eá¢>á¢7á¢0á¢)á¢"á¢á¢á¢ á¢á¢ÿà¢øà¢ñà¢êà¢ãà¢Üà¢Õà¢Îà¢Çà¢Àࢹࢲࢫࢤà¢à¢–à¢à¢ˆà¢à¢zà¢sà¢là¢eà¢^à¢Wà¢Pà¢Ià¢Bà¢;à¢4à¢-à¢&à¢à¢à¢à¢ à¢à¢üߢõߢîߢçߢàߢÙߢÒߢËߢÄߢ½ß¢¶ß¢¯ß¢¨ß¢¡ß¢šß¢“ߢŒß¢…ߢ~ߢwߢpߢiߢbߢ[ߢTߢMߢFߢ?ߢ8ߢ1ߢ*ߢ#ߢߢߢߢߢߢùÞ¢òÞ¢ëÞ¢äÞ¢ÝÞ¢ÖÞ¢ÏÞ¢ÈÞ¢ÁÞ¢ºÞ¢³Þ¢¬Þ¢¥Þ¢žÞ¢—Þ¢Þ¢‰Þ¢‚Þ¢{Þ¢tÞ¢mÞ¢fÞ¢_Þ¢XÞ¢QÞ¢JÞ¢CÞ¢<Þ¢5Þ¢.Þ¢'Þ¢ Þ¢Þ¢Þ¢ Þ¢Þ¢ýÝ¢öÝ¢ïÝ¢èÝ¢áÝ¢ÚÝ¢ÓÝ¢ÌÝ¢ÅÝ¢¾Ý¢·Ý¢°Ý¢©Ý¢¢Ý¢›Ý¢”ݢݢ†Ý¢Ý¢xÝ¢qÝ¢jÝ¢cÝ¢\Ý¢UÝ¢NÝ¢GÝ¢@Ý¢9Ý¢2Ý¢+Ý¢$ݢݢݢݢݢݢúÜ¢óÜ¢ìÜ¢åÜ¢ÞÜ¢×Ü¢ÐÜ¢ÉÜ¢ÂÜ¢»Ü¢´Ü¢­Ü¢¦Ü¢ŸÜ¢˜Ü¢‘Ü¢ŠÜ¢ƒÜ¢|Ü¢uÜ¢nÜ¢gÜ¢`Ü¢YÜ¢RÜ¢KÜ¢DÜ¢=Ü¢6Ü¢/Ü¢(Ü¢!ܢܢܢ ܢܢþÛ¢÷Û¢ðÛ¢éÛ¢âÛ¢ÛÛ¢ÔÛ¢ÍÛ¢ÆÛ¢¿Û¢¸Û¢±Û¢ªÛ¢£Û¢œÛ¢•Û¢ŽÛ¢‡Û¢€Û¢yÛ¢rÛ¢kÛ¢dÛ¢]Û¢VÛ¢OÛ¢HÛ¢AÛ¢:Û¢3Û¢,Û¢%Û¢Û¢Û¢Û¢ Û¢Û¢ûÚ¢ôÚ¢íÚ¢æÚ¢ßÚ¢ØÚ¢ÑÚ¢ÊÚ¢ÃÚ¢¼Ú¢µÚ¢®Ú¢§Ú¢ Ú¢™Ú¢’Ú¢‹Ú¢„Ú¢}Ú¢vÚ¢oÚ¢hÚ¢aÚ¢ZÚ¢SÚ¢LÚ¢EÚ¢>Ú¢7Ú¢0Ú¢)Ú¢"Ú¢Ú¢Ú¢ Ú¢Ú¢ÿÙ¢øÙ¢ñÙ¢êÙ¢ãÙ¢ÜÙ¢ÕÙ¢ÎÙ¢ÇÙ¢ÀÙ¢¹Ù¢²Ù¢«Ù¢¤Ù¢Ù¢–٢٢ˆÙ¢Ù¢zÙ¢sÙ¢lÙ¢eÙ¢^Ù¢WÙ¢PÙ¢IÙ¢BÙ¢;Ù¢4Ù¢-Ù¢&٢٢٢٢ ٢٢üØ¢õØ¢îØ¢çØ¢àØ¢ÙØ¢ÒØ¢ËØ¢ÄØ¢½Ø¢¶Ø¢¯Ø¢¨Ø¢¡Ø¢šØ¢“Ø¢ŒØ¢…Ø¢~Ø¢wØ¢pØ¢iØ¢bØ¢[Ø¢TØ¢MØ¢FØ¢?Ø¢8Ø¢1Ø¢*Ø¢#آآآآآآù×¢ò×¢ë×¢ä×¢Ý×¢Ö×¢Ï×¢È×¢Á×¢º×¢³×¢¬×¢¥×¢ž×¢—×¢×¢‰×¢‚×¢{×¢t×¢m×¢f×¢_×¢X×¢Q×¢J×¢C×¢<×¢5×¢.×¢'×¢ ×¢×¢×¢ ×¢×¢ýÖ¢öÖ¢ïÖ¢èÖ¢áÖ¢ÚÖ¢ÓÖ¢ÌÖ¢ÅÖ¢¾Ö¢·Ö¢°Ö¢©Ö¢¢Ö¢›Ö¢”Ö¢Ö¢†Ö¢Ö¢xÖ¢qÖ¢jÖ¢cÖ¢\Ö¢UÖ¢NÖ¢GÖ¢@Ö¢9Ö¢2Ö¢+Ö¢$Ö¢Ö¢Ö¢Ö¢Ö¢Ö¢úÕ¢óÕ¢ìÕ¢åÕ¢ÞÕ¢×Õ¢ÐÕ¢ÉÕ¢ÂÕ¢»Õ¢´Õ¢­Õ¢¦Õ¢ŸÕ¢˜Õ¢‘Õ¢ŠÕ¢ƒÕ¢|Õ¢uÕ¢nÕ¢gÕ¢`Õ¢YÕ¢RÕ¢KÕ¢DÕ¢=Õ¢6Õ¢/Õ¢(Õ¢!Õ¢Õ¢Õ¢ Õ¢Õ¢þÔ¢÷Ô¢ðÔ¢éÔ¢âÔ¢ÛÔ¢ÔÔ¢ÍÔ¢ÆÔ¢¿Ô¢¸Ô¢±Ô¢ªÔ¢£Ô¢œÔ¢•Ô¢ŽÔ¢‡Ô¢€Ô¢yÔ¢rÔ¢kÔ¢dÔ¢]Ô¢VÔ¢OÔ¢HÔ¢AÔ¢:Ô¢3Ô¢,Ô¢%Ô¢Ô¢Ô¢Ô¢ Ô¢Ô¢ûÓ¢ôÓ¢íÓ¢æÓ¢ßÓ¢ØÓ¢ÑÓ¢ÊÓ¢ÃÓ¢¼Ó¢µÓ¢®Ó¢§Ó¢ Ó¢™Ó¢’Ó¢‹Ó¢„Ó¢}Ó¢vÓ¢oÓ¢hÓ¢aÓ¢ZÓ¢SÓ¢LÓ¢EÓ¢>Ó¢7Ó¢0Ó¢)Ó¢"Ó¢Ó¢Ó¢ Ó¢Ó¢ÿÒ¢øÒ¢ñÒ¢êÒ¢ãÒ¢ÜÒ¢ÕÒ¢ÎÒ¢ÇÒ¢ÀÒ¢¹Ò¢²Ò¢«Ò¢¤Ò¢Ò¢–Ò¢Ò¢ˆÒ¢Ò¢zÒ¢sÒ¢lÒ¢eÒ¢^Ò¢WÒ¢PÒ¢IÒ¢BÒ¢;Ò¢4Ò¢-Ò¢&Ò¢Ò¢Ò¢Ò¢ Ò¢Ò¢üÑ¢õÑ¢îÑ¢çÑ¢àÑ¢ÙÑ¢ÒÑ¢ËÑ¢ÄÑ¢½Ñ¢¶Ñ¢¯Ñ¢¨Ñ¢¡Ñ¢šÑ¢“Ñ¢ŒÑ¢…Ñ¢~Ñ¢wÑ¢pÑ¢iÑ¢bÑ¢[Ñ¢TÑ¢MÑ¢FÑ¢?Ñ¢8Ñ¢1Ñ¢*Ñ¢#ѢѢѢѢѢѢùТòТëТäТÝТÖТÏТÈТÁТºÐ¢³Ð¢¬Ð¢¥Ð¢žÐ¢—ТТ‰Ð¢‚Т{ТtТmТfТ_ТXТQТJТCТ<Т5Т.Т'Т ТТТ ТТýÏ¢öÏ¢ïÏ¢èÏ¢áÏ¢ÚÏ¢ÓÏ¢ÌÏ¢ÅÏ¢¾Ï¢·Ï¢°Ï¢©Ï¢¢Ï¢›Ï¢”ϢϢ†Ï¢Ï¢xÏ¢qÏ¢jÏ¢cÏ¢\Ï¢UÏ¢NÏ¢GÏ¢@Ï¢9Ï¢2Ï¢+Ï¢$ϢϢϢϢϢϢú΢ó΢ì΢å΢Þ΢×΢Ð΢É΢Â΢»Î¢´Î¢­Î¢¦Î¢ŸÎ¢˜Î¢‘΢ŠÎ¢ƒÎ¢|΢u΢n΢g΢`΢Y΢R΢K΢D΢=΢6΢/΢(΢!΢΢΢ ΢΢þÍ¢÷Í¢ðÍ¢éÍ¢âÍ¢ÛÍ¢ÔÍ¢ÍÍ¢ÆÍ¢¿Í¢¸Í¢±Í¢ªÍ¢£Í¢œÍ¢•Í¢ŽÍ¢‡Í¢€Í¢yÍ¢rÍ¢kÍ¢dÍ¢]Í¢VÍ¢OÍ¢HÍ¢AÍ¢:Í¢3Í¢,Í¢%͢͢͢͢ ͢͢ûÌ¢ôÌ¢íÌ¢æÌ¢ßÌ¢ØÌ¢ÑÌ¢ÊÌ¢ÃÌ¢¼Ì¢µÌ¢®Ì¢§Ì¢ Ì¢™Ì¢’Ì¢‹Ì¢„Ì¢}Ì¢vÌ¢oÌ¢hÌ¢aÌ¢ZÌ¢SÌ¢LÌ¢EÌ¢>Ì¢7Ì¢0Ì¢)Ì¢"̢̢̢ ̢̢ÿË¢øË¢ñË¢êË¢ãË¢ÜË¢ÕË¢ÎË¢ÇË¢ÀË¢¹Ë¢²Ë¢«Ë¢¤Ë¢Ë¢–ˢˢˆË¢Ë¢zË¢sË¢lË¢eË¢^Ë¢WË¢PË¢IË¢BË¢;Ë¢4Ë¢-Ë¢&ˢˢˢˢ ˢˢüÊ¢õÊ¢îÊ¢çÊ¢àÊ¢ÙÊ¢ÒÊ¢ËÊ¢ÄÊ¢½Ê¢¶Ê¢¯Ê¢¨Ê¢¡Ê¢šÊ¢“Ê¢ŒÊ¢…Ê¢~Ê¢wÊ¢pÊ¢iÊ¢bÊ¢[Ê¢TÊ¢MÊ¢FÊ¢?Ê¢8Ê¢1Ê¢*Ê¢#ʢʢʢʢʢʢùÉ¢òÉ¢ëÉ¢äÉ¢ÝÉ¢ÖÉ¢ÏÉ¢ÈÉ¢ÁÉ¢ºÉ¢³É¢¬É¢¥É¢žÉ¢—ɢɢ‰É¢‚É¢{É¢tÉ¢mÉ¢fÉ¢_É¢XÉ¢QÉ¢JÉ¢CÉ¢<É¢5É¢.É¢'É¢ ɢɢɢ ɢɢýÈ¢öÈ¢ïÈ¢èÈ¢áÈ¢ÚÈ¢ÓÈ¢ÌÈ¢ÅÈ¢¾È¢·È¢°È¢©È¢¢È¢›È¢”ȢȢ†È¢È¢xÈ¢qÈ¢jÈ¢cÈ¢\È¢UÈ¢NÈ¢GÈ¢@È¢9È¢2È¢+È¢$ȢȢȢȢȢȢúÇ¢óÇ¢ìÇ¢åÇ¢ÞÇ¢×Ç¢ÐÇ¢ÉÇ¢ÂÇ¢»Ç¢´Ç¢­Ç¢¦Ç¢ŸÇ¢˜Ç¢‘Ç¢ŠÇ¢ƒÇ¢|Ç¢uÇ¢nÇ¢gÇ¢`Ç¢YÇ¢RÇ¢KÇ¢DÇ¢=Ç¢6Ç¢/Ç¢(Ç¢!ǢǢǢ ǢǢþÆ¢÷Æ¢ðÆ¢鯢âÆ¢ÛÆ¢ÔÆ¢ÍÆ¢ÆÆ¢¿Æ¢¸Æ¢±Æ¢ªÆ¢£Æ¢œÆ¢•Æ¢ŽÆ¢‡Æ¢€Æ¢yÆ¢rÆ¢kÆ¢dÆ¢]Æ¢VÆ¢OÆ¢HÆ¢AÆ¢:Æ¢3Æ¢,Æ¢%ƢƢƢƢ ƢƢûÅ¢ôÅ¢íÅ¢æÅ¢ßÅ¢ØÅ¢ÑÅ¢ÊÅ¢ÃÅ¢¼Å¢µÅ¢®Å¢§Å¢ Å¢™Å¢’Å¢‹Å¢„Å¢}Å¢vÅ¢oÅ¢hÅ¢aÅ¢ZÅ¢SÅ¢LÅ¢EÅ¢>Å¢7Å¢0Å¢)Å¢"ŢŢŢ ŢŢÿÄ¢øÄ¢ñÄ¢êÄ¢ãÄ¢ÜÄ¢ÕÄ¢ÎÄ¢ÇÄ¢ÀÄ¢¹Ä¢²Ä¢«Ä¢¤Ä¢Ä¢–ĢĢˆÄ¢Ä¢zÄ¢sÄ¢lÄ¢eÄ¢^Ä¢WÄ¢PÄ¢IÄ¢BÄ¢;Ä¢4Ä¢-Ä¢&ĢĢĢĢ ĢĢüâõâîâçâàâÙâÒâËâÄâ½Ã¢¶Ã¢¯Ã¢¨Ã¢¡Ã¢šÃ¢“âŒÃ¢…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢ºÂ¢³Â¢¬Â¢¥Â¢žÂ¢—¢¢‰Â¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ýÁ¢öÁ¢ïÁ¢èÁ¢áÁ¢ÚÁ¢ÓÁ¢ÌÁ¢ÅÁ¢¾Á¢·Á¢°Á¢©Á¢¢Á¢›Á¢”Á¢Á¢†Á¢Á¢xÁ¢qÁ¢jÁ¢cÁ¢\Á¢UÁ¢NÁ¢GÁ¢@Á¢9Á¢2Á¢+Á¢$Á¢Á¢Á¢Á¢Á¢Á¢úÀ¢óÀ¢ìÀ¢åÀ¢ÞÀ¢×À¢ÐÀ¢ÉÀ¢ÂÀ¢»À¢´À¢­À¢¦À¢ŸÀ¢˜À¢‘À¢ŠÀ¢ƒÀ¢|À¢uÀ¢nÀ¢gÀ¢`À¢YÀ¢RÀ¢KÀ¢DÀ¢=À¢6À¢/À¢(À¢!À¢À¢À¢ À¢À¢þ¿¢÷¿¢ð¿¢é¿¢â¿¢Û¿¢Ô¿¢Í¿¢Æ¿¢¿¿¢¸¿¢±¿¢ª¿¢£¿¢œ¿¢•¿¢Ž¿¢‡¿¢€¿¢y¿¢r¿¢k¿¢d¿¢]¿¢V¿¢O¿¢H¿¢A¿¢:¿¢3¿¢,¿¢%¿¢¿¢¿¢¿¢ ¿¢¿¢û¾¢ô¾¢í¾¢æ¾¢ß¾¢ؾ¢Ѿ¢ʾ¢þ¢¼¾¢µ¾¢®¾¢§¾¢ ¾¢™¾¢’¾¢‹¾¢„¾¢}¾¢v¾¢o¾¢h¾¢a¾¢Z¾¢S¾¢L¾¢E¾¢>¾¢7¾¢0¾¢)¾¢"¾¢¾¢¾¢ ¾¢¾¢ÿ½¢ø½¢ñ½¢ê½¢ã½¢ܽ¢Õ½¢ν¢ǽ¢À½¢¹½¢²½¢«½¢¤½¢½¢–½¢½¢ˆ½¢½¢z½¢s½¢l½¢e½¢^½¢W½¢P½¢I½¢B½¢;½¢4½¢-½¢&½¢½¢½¢½¢ ½¢½¢ü¼¢õ¼¢î¼¢ç¼¢༢Ù¼¢Ò¼¢˼¢ļ¢½¼¢¶¼¢¯¼¢¨¼¢¡¼¢š¼¢“¼¢Œ¼¢…¼¢~¼¢w¼¢p¼¢i¼¢b¼¢[¼¢T¼¢M¼¢F¼¢?¼¢8¼¢1¼¢*¼¢#¼¢¼¢¼¢¼¢¼¢¼¢ù»¢ò»¢뻢仢Ý»¢Ö»¢Ï»¢È»¢Á»¢º»¢³»¢¬»¢¥»¢ž»¢—»¢»¢‰»¢‚»¢{»¢t»¢m»¢f»¢_»¢X»¢Q»¢J»¢C»¢<»¢5»¢.»¢'»¢ »¢»¢»¢ »¢»¢ýº¢öº¢ﺢ躢ẢÚº¢Óº¢̺¢ź¢¾º¢·º¢°º¢©º¢¢º¢›º¢”º¢º¢†º¢º¢xº¢qº¢jº¢cº¢\º¢Uº¢Nº¢Gº¢@º¢9º¢2º¢+º¢$º¢º¢º¢º¢º¢º¢ú¹¢ó¹¢ì¹¢å¹¢Þ¹¢×¹¢й¢ɹ¢¹¢»¹¢´¹¢­¹¢¦¹¢Ÿ¹¢˜¹¢‘¹¢й¢ƒ¹¢|¹¢u¹¢n¹¢g¹¢`¹¢Y¹¢R¹¢K¹¢D¹¢=¹¢6¹¢/¹¢(¹¢!¹¢¹¢¹¢ ¹¢¹¢þ¸¢÷¸¢ð¸¢鸢⸢Û¸¢Ô¸¢͸¢Ƹ¢¿¸¢¸¸¢±¸¢ª¸¢£¸¢œ¸¢•¸¢ޏ¢‡¸¢€¸¢y¸¢r¸¢k¸¢d¸¢]¸¢V¸¢O¸¢H¸¢A¸¢:¸¢3¸¢,¸¢%¸¢¸¢¸¢¸¢ ¸¢¸¢û·¢ô·¢í·¢æ·¢ß·¢Ø·¢Ñ·¢Ê·¢÷¢¼·¢µ·¢®·¢§·¢ ·¢™·¢’·¢‹·¢„·¢}·¢v·¢o·¢h·¢a·¢Z·¢S·¢L·¢E·¢>·¢7·¢0·¢)·¢"·¢·¢·¢ ·¢·¢ÿ¶¢ø¶¢ñ¶¢ê¶¢ã¶¢ܶ¢Õ¶¢ζ¢Ƕ¢À¶¢¹¶¢²¶¢«¶¢¤¶¢¶¢–¶¢¶¢ˆ¶¢¶¢z¶¢s¶¢l¶¢e¶¢^¶¢W¶¢P¶¢I¶¢B¶¢;¶¢4¶¢-¶¢&¶¢¶¢¶¢¶¢ ¶¢¶¢üµ¢õµ¢îµ¢çµ¢ൢÙµ¢Òµ¢˵¢ĵ¢½µ¢¶µ¢¯µ¢¨µ¢¡µ¢šµ¢“µ¢Œµ¢…µ¢~µ¢wµ¢pµ¢iµ¢bµ¢[µ¢Tµ¢Mµ¢Fµ¢?µ¢8µ¢1µ¢*µ¢#µ¢µ¢µ¢µ¢µ¢µ¢ù´¢ò´¢ë´¢ä´¢Ý´¢Ö´¢Ï´¢È´¢Á´¢º´¢³´¢¬´¢¥´¢ž´¢—´¢´¢‰´¢‚´¢{´¢t´¢m´¢f´¢_´¢X´¢Q´¢J´¢C´¢<´¢5´¢.´¢'´¢ ´¢´¢´¢ ´¢´¢ý³¢ö³¢ï³¢è³¢á³¢Ú³¢Ó³¢̳¢ų¢¾³¢·³¢°³¢©³¢¢³¢›³¢”³¢³¢†³¢³¢x³¢q³¢j³¢c³¢\³¢U³¢N³¢G³¢@³¢9³¢2³¢+³¢$³¢³¢³¢³¢³¢³¢ú²¢ó²¢ì²¢å²¢Þ²¢ײ¢в¢ɲ¢²¢»²¢´²¢­²¢¦²¢Ÿ²¢˜²¢‘²¢в¢ƒ²¢|²¢u²¢n²¢g²¢`²¢Y²¢R²¢K²¢D²¢=²¢6²¢/²¢(²¢!²¢²¢²¢ ²¢²¢þ±¢÷±¢ð±¢é±¢â±¢Û±¢Ô±¢ͱ¢Ʊ¢¿±¢¸±¢±±¢ª±¢£±¢œ±¢•±¢ޱ¢‡±¢€±¢y±¢r±¢k±¢d±¢]±¢V±¢O±¢H±¢A±¢:±¢3±¢,±¢%±¢±¢±¢±¢ ±¢±¢û°¢ô°¢í°¢æ°¢ß°¢ذ¢Ѱ¢ʰ¢ð¢¼°¢µ°¢®°¢§°¢ °¢™°¢’°¢‹°¢„°¢}°¢v°¢o°¢h°¢a°¢Z°¢S°¢L°¢E°¢>°¢7°¢0°¢)°¢"°¢°¢°¢ °¢°¢ÿ¯¢ø¯¢ñ¯¢ꯢ㯢ܯ¢Õ¯¢ί¢ǯ¢À¯¢¹¯¢²¯¢«¯¢¤¯¢¯¢–¯¢¯¢ˆ¯¢¯¢z¯¢s¯¢l¯¢e¯¢^¯¢W¯¢P¯¢I¯¢B¯¢;¯¢4¯¢-¯¢&¯¢¯¢¯¢¯¢ ¯¢¯¢ü®¢õ®¢箢஢Ù®¢Ò®¢Ë®¢Ä®¢½®¢¶®¢¯®¢¨®¢¡®¢š®¢“®¢Œ®¢…®¢~®¢w®¢p®¢i®¢b®¢[®¢T®¢M®¢F®¢?®¢8®¢1®¢*®¢#®¢®¢®¢®¢®¢®¢ù­¢ò­¢ë­¢ä­¢Ý­¢Ö­¢Ï­¢È­¢Á­¢º­¢³­¢¬­¢¥­¢ž­¢—­¢­¢‰­¢‚­¢{­¢t­¢m­¢f­¢_­¢X­¢Q­¢J­¢C­¢<­¢5­¢.­¢'­¢ ­¢­¢­¢ ­¢­¢ý¬¢ö¬¢ﬢ謢ᬢÚ¬¢Ó¬¢̬¢Ŭ¢¾¬¢·¬¢°¬¢©¬¢¢¬¢›¬¢”¬¢¬¢†¬¢¬¢x¬¢q¬¢j¬¢c¬¢\¬¢U¬¢N¬¢G¬¢@¬¢9¬¢2¬¢+¬¢$¬¢¬¢¬¢¬¢¬¢¬¢ú«¢ó«¢ì«¢å«¢Þ«¢׫¢Ы¢É«¢«¢»«¢´«¢­«¢¦«¢Ÿ«¢˜«¢‘«¢Š«¢ƒ«¢|«¢u«¢n«¢g«¢`«¢Y«¢R«¢K«¢D«¢=«¢6«¢/«¢(«¢!«¢«¢«¢ «¢«¢þª¢÷ª¢ðª¢骢⪢Ûª¢Ôª¢ͪ¢ƪ¢¿ª¢¸ª¢±ª¢ªª¢£ª¢œª¢•ª¢Žª¢‡ª¢€ª¢yª¢rª¢kª¢dª¢]ª¢Vª¢Oª¢Hª¢Aª¢:ª¢3ª¢,ª¢%ª¢ª¢ª¢ª¢ ª¢ª¢û©¢ô©¢í©¢æ©¢ß©¢Ø©¢Ñ©¢Ê©¢é¢¼©¢µ©¢®©¢§©¢ ©¢™©¢’©¢‹©¢„©¢}©¢v©¢o©¢h©¢a©¢Z©¢S©¢L©¢E©¢>©¢7©¢0©¢)©¢"©¢©¢©¢ ©¢©¢ÿ¨¢ø¨¢ñ¨¢ꨢ㨢ܨ¢Õ¨¢Ψ¢Ǩ¢À¨¢¹¨¢²¨¢«¨¢¤¨¢¨¢–¨¢¨¢ˆ¨¢¨¢z¨¢s¨¢l¨¢e¨¢^¨¢W¨¢P¨¢I¨¢B¨¢;¨¢4¨¢-¨¢&¨¢¨¢¨¢¨¢ ¨¢¨¢ü§¢õ§¢î§¢ç§¢à§¢Ù§¢Ò§¢˧¢ħ¢½§¢¶§¢¯§¢¨§¢¡§¢š§¢“§¢Œ§¢…§¢~§¢w§¢p§¢i§¢b§¢[§¢T§¢M§¢F§¢?§¢8§¢1§¢*§¢#§¢§¢§¢§¢§¢§¢ù¦¢ò¦¢릢䦢ݦ¢Ö¦¢Ϧ¢Ȧ¢Á¦¢º¦¢³¦¢¬¦¢¥¦¢ž¦¢—¦¢¦¢‰¦¢‚¦¢{¦¢t¦¢m¦¢f¦¢_¦¢X¦¢Q¦¢J¦¢C¦¢<¦¢5¦¢.¦¢'¦¢ ¦¢¦¢¦¢ ¦¢¦¢ý¥¢ö¥¢異襢ᥢÚ¥¢Ó¥¢Ì¥¢Å¥¢¾¥¢·¥¢°¥¢©¥¢¢¥¢›¥¢”¥¢¥¢†¥¢¥¢x¥¢q¥¢j¥¢c¥¢\¥¢U¥¢N¥¢G¥¢@¥¢9¥¢2¥¢+¥¢$¥¢¥¢¥¢¥¢¥¢¥¢ú¤¢ó¤¢줢夢Þ¤¢פ¢Ф¢ɤ¢¤¢»¤¢´¤¢­¤¢¦¤¢Ÿ¤¢˜¤¢‘¤¢Ф¢ƒ¤¢|¤¢u¤¢n¤¢g¤¢`¤¢Y¤¢R¤¢K¤¢D¤¢=¤¢6¤¢/¤¢(¤¢!¤¢¤¢¤¢ ¤¢¤¢þ£¢÷£¢ð£¢飢⣢Û£¢Ô£¢Í£¢Æ£¢¿£¢¸£¢±£¢ª£¢££¢œ£¢•£¢Ž£¢‡£¢€£¢y£¢r£¢k£¢d£¢]£¢V£¢O£¢H£¢A£¢:£¢3£¢,£¢%£¢£¢£¢£¢ £¢£¢û¢¢ô¢¢í¢¢梢ߢ¢Ø¢¢Ñ¢¢Ê¢¢â¢¼¢¢µ¢¢®¢¢§¢¢ ¢¢™¢¢’¢¢‹¢¢„¢¢}¢¢v¢¢o¢¢h¢¢a¢¢Z¢¢S¢¢L¢¢E¢¢>¢¢7¢¢0¢¢)¢¢"¢¢¢¢¢¢ ¢¢¢¢ÿ¡¢ø¡¢ñ¡¢ê¡¢ã¡¢Ü¡¢Õ¡¢Ρ¢Ç¡¢À¡¢¹¡¢²¡¢«¡¢¤¡¢¡¢–¡¢¡¢ˆ¡¢¡¢z¡¢s¡¢l¡¢e¡¢^¡¢W¡¢P¡¢I¡¢B¡¢;¡¢4¡¢-¡¢&¡¢¡¢¡¢¡¢ ¡¢¡¢ü ¢õ ¢î ¢ç ¢à ¢Ù ¢Ò ¢Ë ¢Ä ¢½ ¢¶ ¢¯ ¢¨ ¢¡ ¢š ¢“ ¢Œ ¢… ¢~ ¢w ¢p ¢i ¢b ¢[ ¢T ¢M ¢F ¢? ¢8 ¢1 ¢* ¢# ¢ ¢ ¢ ¢ ¢ ¢ùŸ¢òŸ¢럢䟢ÝŸ¢ÖŸ¢ÏŸ¢ÈŸ¢ÁŸ¢ºŸ¢³Ÿ¢¬Ÿ¢¥Ÿ¢žŸ¢—Ÿ¢Ÿ¢‰Ÿ¢‚Ÿ¢{Ÿ¢tŸ¢mŸ¢fŸ¢_Ÿ¢XŸ¢QŸ¢JŸ¢CŸ¢<Ÿ¢5Ÿ¢.Ÿ¢'Ÿ¢ Ÿ¢Ÿ¢Ÿ¢ Ÿ¢Ÿ¢ýž¢öž¢螢អÚž¢Óž¢Ìž¢Åž¢¾ž¢·ž¢°ž¢©ž¢¢ž¢›ž¢”ž¢ž¢†ž¢ž¢xž¢qž¢jž¢cž¢\ž¢Už¢Nž¢Gž¢@ž¢9ž¢2ž¢+ž¢$ž¢ž¢ž¢ž¢ž¢ž¢ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þœ¢÷œ¢ðœ¢霢✢Ûœ¢Ôœ¢Íœ¢Æœ¢¿œ¢¸œ¢±œ¢ªœ¢£œ¢œœ¢•œ¢Žœ¢‡œ¢€œ¢yœ¢rœ¢kœ¢dœ¢]œ¢Vœ¢Oœ¢Hœ¢Aœ¢:œ¢3œ¢,œ¢%œ¢œ¢œ¢œ¢ œ¢œ¢û›¢ô›¢훢曢ß›¢Ø›¢Ñ›¢Ê›¢Û¢¼›¢µ›¢®›¢§›¢ ›¢™›¢’›¢‹›¢„›¢}›¢v›¢o›¢h›¢a›¢Z›¢S›¢L›¢E›¢>›¢7›¢0›¢)›¢"›¢›¢›¢ ›¢›¢ÿš¢øš¢ñš¢ꚢ㚢Üš¢Õš¢Κ¢Çš¢Àš¢¹š¢²š¢«š¢¤š¢š¢–š¢š¢ˆš¢š¢zš¢sš¢lš¢eš¢^š¢Wš¢Pš¢Iš¢Bš¢;š¢4š¢-š¢&š¢š¢š¢š¢ š¢š¢ü™¢õ™¢癢à™¢Ù™¢Ò™¢Ë™¢Ä™¢½™¢¶™¢¯™¢¨™¢¡™¢š™¢“™¢Œ™¢…™¢~™¢w™¢p™¢i™¢b™¢[™¢T™¢M™¢F™¢?™¢8™¢1™¢*™¢#™¢™¢™¢™¢™¢™¢ù˜¢ò˜¢똢䘢ݘ¢Ö˜¢Ϙ¢Ș¢Á˜¢º˜¢³˜¢¬˜¢¥˜¢ž˜¢—˜¢˜¢‰˜¢‚˜¢{˜¢t˜¢m˜¢f˜¢_˜¢X˜¢Q˜¢J˜¢C˜¢<˜¢5˜¢.˜¢'˜¢ ˜¢˜¢˜¢ ˜¢˜¢ý—¢ö—¢ï—¢è—¢á—¢Ú—¢Ó—¢Ì—¢Å—¢¾—¢·—¢°—¢©—¢¢—¢›—¢”—¢—¢†—¢—¢x—¢q—¢j—¢c—¢\—¢U—¢N—¢G—¢@—¢9—¢2—¢+—¢$—¢—¢—¢—¢—¢—¢ú–¢ó–¢ì–¢å–¢Þ–¢×–¢Ж¢É–¢–¢»–¢´–¢­–¢¦–¢Ÿ–¢˜–¢‘–¢Š–¢ƒ–¢|–¢u–¢n–¢g–¢`–¢Y–¢R–¢K–¢D–¢=–¢6–¢/–¢(–¢!–¢–¢–¢ –¢–¢þ•¢÷•¢ð•¢é•¢â•¢Û•¢Ô•¢Í•¢Æ•¢¿•¢¸•¢±•¢ª•¢£•¢œ•¢••¢Ž•¢‡•¢€•¢y•¢r•¢k•¢d•¢]•¢V•¢O•¢H•¢A•¢:•¢3•¢,•¢%•¢•¢•¢•¢ •¢•¢û”¢ô”¢픢攢ß”¢Ø”¢Ñ”¢Ê”¢Ô¢¼”¢µ”¢®”¢§”¢ ”¢™”¢’”¢‹”¢„”¢}”¢v”¢o”¢h”¢a”¢Z”¢S”¢L”¢E”¢>”¢7”¢0”¢)”¢"”¢”¢”¢ ”¢”¢ÿ“¢ø“¢ñ“¢ê“¢ã“¢Ü“¢Õ“¢Γ¢Ç“¢À“¢¹“¢²“¢«“¢¤“¢“¢–“¢“¢ˆ“¢“¢z“¢s“¢l“¢e“¢^“¢W“¢P“¢I“¢B“¢;“¢4“¢-“¢&“¢“¢“¢“¢ “¢“¢ü’¢õ’¢î’¢ç’¢à’¢Ù’¢Ò’¢Ë’¢Ä’¢½’¢¶’¢¯’¢¨’¢¡’¢š’¢“’¢Œ’¢…’¢~’¢w’¢p’¢i’¢b’¢[’¢T’¢M’¢F’¢?’¢8’¢1’¢*’¢#’¢’¢’¢’¢’¢’¢ù‘¢ò‘¢ë‘¢ä‘¢Ý‘¢Ö‘¢Ï‘¢È‘¢Á‘¢º‘¢³‘¢¬‘¢¥‘¢ž‘¢—‘¢‘¢‰‘¢‚‘¢{‘¢t‘¢m‘¢f‘¢_‘¢X‘¢Q‘¢J‘¢C‘¢<‘¢5‘¢.‘¢'‘¢ ‘¢‘¢‘¢ ‘¢‘¢ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þŽ¢÷Ž¢ðŽ¢鎢⎢ÛŽ¢ÔŽ¢ÍŽ¢ÆŽ¢¿Ž¢¸Ž¢±Ž¢ªŽ¢£Ž¢œŽ¢•Ž¢ŽŽ¢‡Ž¢€Ž¢yŽ¢rŽ¢kŽ¢dŽ¢]Ž¢VŽ¢OŽ¢HŽ¢AŽ¢:Ž¢3Ž¢,Ž¢%ޢޢޢޢ ޢޢû¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿŒ¢øŒ¢ñŒ¢ꌢ㌢ÜŒ¢ÕŒ¢ÎŒ¢ÇŒ¢ÀŒ¢¹Œ¢²Œ¢«Œ¢¤Œ¢Œ¢–Œ¢Œ¢ˆŒ¢Œ¢zŒ¢sŒ¢lŒ¢eŒ¢^Œ¢WŒ¢PŒ¢IŒ¢BŒ¢;Œ¢4Œ¢-Œ¢&Œ¢Œ¢Œ¢Œ¢ Œ¢Œ¢ü‹¢õ‹¢î‹¢ç‹¢à‹¢Ù‹¢Ò‹¢Ë‹¢Ä‹¢½‹¢¶‹¢¯‹¢¨‹¢¡‹¢š‹¢“‹¢Œ‹¢…‹¢~‹¢w‹¢p‹¢i‹¢b‹¢[‹¢T‹¢M‹¢F‹¢?‹¢8‹¢1‹¢*‹¢#‹¢‹¢‹¢‹¢‹¢‹¢ùŠ¢òŠ¢늢䊢ÝŠ¢ÖŠ¢ÏŠ¢ÈŠ¢ÁŠ¢ºŠ¢³Š¢¬Š¢¥Š¢žŠ¢—ТТ‰Š¢‚Š¢{Š¢tŠ¢mŠ¢fŠ¢_Š¢XŠ¢QŠ¢JŠ¢CŠ¢<Š¢5Š¢.Š¢'Š¢ ТТТ ТТý‰¢ö‰¢艢ቢÚ‰¢Ó‰¢̉¢ʼn¢¾‰¢·‰¢°‰¢©‰¢¢‰¢›‰¢”‰¢‰¢†‰¢‰¢x‰¢q‰¢j‰¢c‰¢\‰¢U‰¢N‰¢G‰¢@‰¢9‰¢2‰¢+‰¢$‰¢‰¢‰¢‰¢‰¢‰¢úˆ¢óˆ¢숢刢Þˆ¢׈¢Ј¢Ɉ¢ˆ¢»ˆ¢´ˆ¢­ˆ¢¦ˆ¢Ÿˆ¢˜ˆ¢‘ˆ¢Šˆ¢ƒˆ¢|ˆ¢uˆ¢nˆ¢gˆ¢`ˆ¢Yˆ¢Rˆ¢Kˆ¢Dˆ¢=ˆ¢6ˆ¢/ˆ¢(ˆ¢!ˆ¢ˆ¢ˆ¢ ˆ¢ˆ¢þ‡¢÷‡¢ð‡¢釢⇢Û‡¢Ô‡¢͇¢Ƈ¢¿‡¢¸‡¢±‡¢ª‡¢£‡¢œ‡¢•‡¢އ¢‡‡¢€‡¢y‡¢r‡¢k‡¢d‡¢]‡¢V‡¢O‡¢H‡¢A‡¢:‡¢3‡¢,‡¢%‡¢‡¢‡¢‡¢ ‡¢‡¢û†¢ô†¢톢憢߆¢؆¢ц¢ʆ¢Æ¢¼†¢µ†¢®†¢§†¢ †¢™†¢’†¢‹†¢„†¢}†¢v†¢o†¢h†¢a†¢Z†¢S†¢L†¢E†¢>†¢7†¢0†¢)†¢"†¢†¢†¢ †¢†¢ÿ…¢ø…¢ñ…¢ê…¢ã…¢Ü…¢Õ…¢Î…¢Ç…¢À…¢¹…¢²…¢«…¢¤…¢…¢–…¢…¢ˆ…¢…¢z…¢s…¢l…¢e…¢^…¢W…¢P…¢I…¢B…¢;…¢4…¢-…¢&…¢…¢…¢…¢ …¢…¢ü„¢õ„¢î„¢ç„¢à„¢Ù„¢Ò„¢Ë„¢Ä„¢½„¢¶„¢¯„¢¨„¢¡„¢š„¢“„¢Œ„¢…„¢~„¢w„¢p„¢i„¢b„¢[„¢T„¢M„¢F„¢?„¢8„¢1„¢*„¢#„¢„¢„¢„¢„¢„¢ùƒ¢òƒ¢냢䃢݃¢Öƒ¢σ¢ȃ¢Áƒ¢ºƒ¢³ƒ¢¬ƒ¢¥ƒ¢žƒ¢—ƒ¢ƒ¢‰ƒ¢‚ƒ¢{ƒ¢tƒ¢mƒ¢fƒ¢_ƒ¢Xƒ¢Qƒ¢Jƒ¢Cƒ¢<ƒ¢5ƒ¢.ƒ¢'ƒ¢ ƒ¢ƒ¢ƒ¢ ƒ¢ƒ¢ý‚¢ö‚¢ï‚¢è‚¢á‚¢Ú‚¢Ó‚¢Ì‚¢Å‚¢¾‚¢·‚¢°‚¢©‚¢¢‚¢›‚¢”‚¢‚¢†‚¢‚¢x‚¢q‚¢j‚¢c‚¢\‚¢U‚¢N‚¢G‚¢@‚¢9‚¢2‚¢+‚¢$‚¢‚¢‚¢‚¢‚¢‚¢ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ€¢÷€¢ð€¢逢•Û€¢Ô€¢Í€¢Æ€¢¿€¢¸€¢±€¢ª€¢£€¢œ€¢•€¢Ž€¢‡€¢€€¢y€¢r€¢k€¢d€¢]€¢V€¢O€¢H€¢A€¢:€¢3€¢,€¢%€¢€¢€¢€¢ €¢€¢û¢ô¢í¢æ¢ß¢Ø¢Ñ¢Ê¢Ã¢¼¢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ~¢ø~¢ñ~¢ê~¢ã~¢Ü~¢Õ~¢Î~¢Ç~¢À~¢¹~¢²~¢«~¢¤~¢~¢–~¢~¢ˆ~¢~¢z~¢s~¢l~¢e~¢^~¢W~¢P~¢I~¢B~¢;~¢4~¢-~¢&~¢~¢~¢~¢ ~¢~¢ü}¢õ}¢î}¢ç}¢à}¢Ù}¢Ò}¢Ë}¢Ä}¢½}¢¶}¢¯}¢¨}¢¡}¢š}¢“}¢Œ}¢…}¢~}¢w}¢p}¢i}¢b}¢[}¢T}¢M}¢F}¢?}¢8}¢1}¢*}¢#}¢}¢}¢}¢}¢}¢ù|¢ò|¢ë|¢ä|¢Ý|¢Ö|¢Ï|¢È|¢Á|¢º|¢³|¢¬|¢¥|¢ž|¢—|¢|¢‰|¢‚|¢{|¢t|¢m|¢f|¢_|¢X|¢Q|¢J|¢C|¢<|¢5|¢.|¢'|¢ |¢|¢|¢ |¢|¢ý{¢ö{¢ï{¢è{¢á{¢Ú{¢Ó{¢Ì{¢Å{¢¾{¢·{¢°{¢©{¢¢{¢›{¢”{¢{¢†{¢{¢x{¢q{¢j{¢c{¢\{¢U{¢N{¢G{¢@{¢9{¢2{¢+{¢${¢{¢{¢{¢{¢{¢úz¢óz¢ìz¢åz¢Þz¢×z¢Ðz¢Éz¢Âz¢»z¢´z¢­z¢¦z¢Ÿz¢˜z¢‘z¢Šz¢ƒz¢|z¢uz¢nz¢gz¢`z¢Yz¢Rz¢Kz¢Dz¢=z¢6z¢/z¢(z¢!z¢z¢z¢ z¢z¢þy¢÷y¢ðy¢éy¢ây¢Ûy¢Ôy¢Íy¢Æy¢¿y¢¸y¢±y¢ªy¢£y¢œy¢•y¢Žy¢‡y¢€y¢yy¢ry¢ky¢dy¢]y¢Vy¢Oy¢Hy¢Ay¢:y¢3y¢,y¢%y¢y¢y¢y¢ y¢y¢ûx¢ôx¢íx¢æx¢ßx¢Øx¢Ñx¢Êx¢Ãx¢¼x¢µx¢®x¢§x¢ x¢™x¢’x¢‹x¢„x¢}x¢vx¢ox¢hx¢ax¢Zx¢Sx¢Lx¢Ex¢>x¢7x¢0x¢)x¢"x¢x¢x¢ x¢x¢ÿw¢øw¢ñw¢êw¢ãw¢Üw¢Õw¢Îw¢Çw¢Àw¢¹w¢²w¢«w¢¤w¢w¢–w¢w¢ˆw¢w¢zw¢sw¢lw¢ew¢^w¢Ww¢Pw¢Iw¢Bw¢;w¢4w¢-w¢&w¢w¢w¢w¢ w¢w¢üv¢õv¢îv¢çv¢àv¢Ùv¢Òv¢Ëv¢Äv¢½v¢¶v¢¯v¢¨v¢¡v¢šv¢“v¢Œv¢…v¢~v¢wv¢pv¢iv¢bv¢[v¢Tv¢Mv¢Fv¢?v¢8v¢1v¢*v¢#v¢v¢v¢v¢v¢v¢ùu¢òu¢ëu¢äu¢Ýu¢Öu¢Ïu¢Èu¢Áu¢ºu¢³u¢¬u¢¥u¢žu¢—u¢u¢‰u¢‚u¢{u¢tu¢mu¢fu¢_u¢Xu¢Qu¢Ju¢Cu¢q¢7q¢0q¢)q¢"q¢q¢q¢ q¢q¢ÿp¢øp¢ñp¢êp¢ãp¢Üp¢Õp¢Îp¢Çp¢Àp¢¹p¢²p¢«p¢¤p¢p¢–p¢p¢ˆp¢p¢zp¢sp¢lp¢ep¢^p¢Wp¢Pp¢Ip¢Bp¢;p¢4p¢-p¢&p¢p¢p¢p¢ p¢p¢üo¢õo¢îo¢ço¢ào¢Ùo¢Òo¢Ëo¢Äo¢½o¢¶o¢¯o¢¨o¢¡o¢šo¢“o¢Œo¢…o¢~o¢wo¢po¢io¢bo¢[o¢To¢Mo¢Fo¢?o¢8o¢1o¢*o¢#o¢o¢o¢o¢o¢o¢ùn¢òn¢ën¢än¢Ýn¢Ön¢Ïn¢Èn¢Án¢ºn¢³n¢¬n¢¥n¢žn¢—n¢n¢‰n¢‚n¢{n¢tn¢mn¢fn¢_n¢Xn¢Qn¢Jn¢Cn¢j¢7j¢0j¢)j¢"j¢j¢j¢ j¢j¢ÿi¢øi¢ñi¢êi¢ãi¢Üi¢Õi¢Îi¢Çi¢Ài¢¹i¢²i¢«i¢¤i¢i¢–i¢i¢ˆi¢i¢zi¢si¢li¢ei¢^i¢Wi¢Pi¢Ii¢Bi¢;i¢4i¢-i¢&i¢i¢i¢i¢ i¢i¢üh¢õh¢îh¢çh¢àh¢Ùh¢Òh¢Ëh¢Äh¢½h¢¶h¢¯h¢¨h¢¡h¢šh¢“h¢Œh¢…h¢~h¢wh¢ph¢ih¢bh¢[h¢Th¢Mh¢Fh¢?h¢8h¢1h¢*h¢#h¢h¢h¢h¢h¢h¢ùg¢òg¢ëg¢äg¢Ýg¢Ög¢Ïg¢Èg¢Ág¢ºg¢³g¢¬g¢¥g¢žg¢—g¢g¢‰g¢‚g¢{g¢tg¢mg¢fg¢_g¢Xg¢Qg¢Jg¢Cg¢c¢7c¢0c¢)c¢"c¢c¢c¢ c¢c¢ÿb¢øb¢ñb¢êb¢ãb¢Üb¢Õb¢Îb¢Çb¢Àb¢¹b¢²b¢«b¢¤b¢b¢–b¢b¢ˆb¢b¢zb¢sb¢lb¢eb¢^b¢Wb¢Pb¢Ib¢Bb¢;b¢4b¢-b¢&b¢b¢b¢b¢ b¢b¢üa¢õa¢îa¢ça¢àa¢Ùa¢Òa¢Ëa¢Äa¢½a¢¶a¢¯a¢¨a¢¡a¢ša¢“a¢Œa¢…a¢~a¢wa¢pa¢ia¢ba¢[a¢Ta¢Ma¢Fa¢?a¢8a¢1a¢*a¢#a¢a¢a¢a¢a¢a¢ù`¢ò`¢ë`¢ä`¢Ý`¢Ö`¢Ï`¢È`¢Á`¢º`¢³`¢¬`¢¥`¢ž`¢—`¢`¢‰`¢‚`¢{`¢t`¢m`¢f`¢_`¢X`¢Q`¢J`¢C`¢<`¢5`¢.`¢'`¢ `¢`¢`¢ `¢`¢ý_¢ö_¢ï_¢è_¢á_¢Ú_¢Ó_¢Ì_¢Å_¢¾_¢·_¢°_¢©_¢¢_¢›_¢”_¢_¢†_¢_¢x_¢q_¢j_¢c_¢\_¢U_¢N_¢G_¢@_¢9_¢2_¢+_¢$_¢_¢_¢_¢_¢_¢ú^¢ó^¢ì^¢å^¢Þ^¢×^¢Ð^¢É^¢Â^¢»^¢´^¢­^¢¦^¢Ÿ^¢˜^¢‘^¢Š^¢ƒ^¢|^¢u^¢n^¢g^¢`^¢Y^¢R^¢K^¢D^¢=^¢6^¢/^¢(^¢!^¢^¢^¢ ^¢^¢þ]¢÷]¢ð]¢é]¢â]¢Û]¢Ô]¢Í]¢Æ]¢¿]¢¸]¢±]¢ª]¢£]¢œ]¢•]¢Ž]¢‡]¢€]¢y]¢r]¢k]¢d]¢]]¢V]¢O]¢H]¢A]¢:]¢3]¢,]¢%]¢]¢]¢]¢ ]¢]¢û\¢ô\¢í\¢æ\¢ß\¢Ø\¢Ñ\¢Ê\¢Ã\¢¼\¢µ\¢®\¢§\¢ \¢™\¢’\¢‹\¢„\¢}\¢v\¢o\¢h\¢a\¢Z\¢S\¢L\¢E\¢>\¢7\¢0\¢)\¢"\¢\¢\¢ \¢\¢ÿ[¢ø[¢ñ[¢ê[¢ã[¢Ü[¢Õ[¢Î[¢Ç[¢À[¢¹[¢²[¢«[¢¤[¢[¢–[¢[¢ˆ[¢[¢z[¢s[¢l[¢e[¢^[¢W[¢P[¢I[¢B[¢;[¢4[¢-[¢&[¢[¢[¢[¢ [¢[¢üZ¢õZ¢îZ¢çZ¢àZ¢ÙZ¢ÒZ¢ËZ¢ÄZ¢½Z¢¶Z¢¯Z¢¨Z¢¡Z¢šZ¢“Z¢ŒZ¢…Z¢~Z¢wZ¢pZ¢iZ¢bZ¢[Z¢TZ¢MZ¢FZ¢?Z¢8Z¢1Z¢*Z¢#Z¢Z¢Z¢Z¢Z¢Z¢ùY¢òY¢ëY¢äY¢ÝY¢ÖY¢ÏY¢ÈY¢ÁY¢ºY¢³Y¢¬Y¢¥Y¢žY¢—Y¢Y¢‰Y¢‚Y¢{Y¢tY¢mY¢fY¢_Y¢XY¢QY¢JY¢CY¢U¢7U¢0U¢)U¢"U¢U¢U¢ U¢U¢ÿT¢øT¢ñT¢êT¢ãT¢ÜT¢ÕT¢ÎT¢ÇT¢ÀT¢¹T¢²T¢«T¢¤T¢T¢–T¢T¢ˆT¢T¢zT¢sT¢lT¢eT¢^T¢WT¢PT¢IT¢BT¢;T¢4T¢-T¢&T¢T¢T¢T¢ T¢T¢üS¢õS¢îS¢çS¢àS¢ÙS¢ÒS¢ËS¢ÄS¢½S¢¶S¢¯S¢¨S¢¡S¢šS¢“S¢ŒS¢…S¢~S¢wS¢pS¢iS¢bS¢[S¢TS¢MS¢FS¢?S¢8S¢1S¢*S¢#S¢S¢S¢S¢S¢S¢ùR¢òR¢ëR¢äR¢ÝR¢ÖR¢ÏR¢ÈR¢ÁR¢ºR¢³R¢¬R¢¥R¢žR¢—R¢R¢‰R¢‚R¢{R¢tR¢mR¢fR¢_R¢XR¢QR¢JR¢CR¢N¢7N¢0N¢)N¢"N¢N¢N¢ N¢N¢ÿM¢øM¢ñM¢êM¢ãM¢ÜM¢ÕM¢ÎM¢ÇM¢ÀM¢¹M¢²M¢«M¢¤M¢M¢–M¢M¢ˆM¢M¢zM¢sM¢lM¢eM¢^M¢WM¢PM¢IM¢BM¢;M¢4M¢-M¢&M¢M¢M¢M¢ M¢M¢üL¢õL¢îL¢çL¢àL¢ÙL¢ÒL¢ËL¢ÄL¢½L¢¶L¢¯L¢¨L¢¡L¢šL¢“L¢ŒL¢…L¢~L¢wL¢pL¢iL¢bL¢[L¢TL¢ML¢FL¢?L¢8L¢1L¢*L¢#L¢L¢L¢L¢L¢L¢ùK¢òK¢ëK¢äK¢ÝK¢ÖK¢ÏK¢ÈK¢ÁK¢ºK¢³K¢¬K¢¥K¢žK¢—K¢K¢‰K¢‚K¢{K¢tK¢mK¢fK¢_K¢XK¢QK¢JK¢CK¢G¢7G¢0G¢)G¢"G¢G¢G¢ G¢G¢ÿF¢øF¢ñF¢êF¢ãF¢ÜF¢ÕF¢ÎF¢ÇF¢ÀF¢¹F¢²F¢«F¢¤F¢F¢–F¢F¢ˆF¢F¢zF¢sF¢lF¢eF¢^F¢WF¢PF¢IF¢BF¢;F¢4F¢-F¢&F¢F¢F¢F¢ F¢F¢üE¢õE¢îE¢çE¢àE¢ÙE¢ÒE¢ËE¢ÄE¢½E¢¶E¢¯E¢¨E¢¡E¢šE¢“E¢ŒE¢…E¢~E¢wE¢pE¢iE¢bE¢[E¢TE¢ME¢FE¢?E¢8E¢1E¢*E¢#E¢E¢E¢E¢E¢E¢ùD¢òD¢ëD¢äD¢ÝD¢ÖD¢ÏD¢ÈD¢ÁD¢ºD¢³D¢¬D¢¥D¢žD¢—D¢D¢‰D¢‚D¢{D¢tD¢mD¢fD¢_D¢XD¢QD¢JD¢CD¢@¢7@¢0@¢)@¢"@¢@¢@¢ @¢@¢ÿ?¢ø?¢ñ?¢ê?¢ã?¢Ü?¢Õ?¢Î?¢Ç?¢À?¢¹?¢²?¢«?¢¤?¢?¢–?¢?¢ˆ?¢?¢z?¢s?¢l?¢e?¢^?¢W?¢P?¢I?¢B?¢;?¢4?¢-?¢&?¢?¢?¢?¢ ?¢?¢ü>¢õ>¢î>¢ç>¢à>¢Ù>¢Ò>¢Ë>¢Ä>¢½>¢¶>¢¯>¢¨>¢¡>¢š>¢“>¢Œ>¢…>¢~>¢w>¢p>¢i>¢b>¢[>¢T>¢M>¢F>¢?>¢8>¢1>¢*>¢#>¢>¢>¢>¢>¢>¢ù=¢ò=¢ë=¢ä=¢Ý=¢Ö=¢Ï=¢È=¢Á=¢º=¢³=¢¬=¢¥=¢ž=¢—=¢=¢‰=¢‚=¢{=¢t=¢m=¢f=¢_=¢X=¢Q=¢J=¢C=¢<=¢5=¢.=¢'=¢ =¢=¢=¢ =¢=¢ý<¢ö<¢ï<¢è<¢á<¢Ú<¢Ó<¢Ì<¢Å<¢¾<¢·<¢°<¢©<¢¢<¢›<¢”<¢<¢†<¢<¢x<¢q<¢j<¢c<¢\<¢U<¢N<¢G<¢@<¢9<¢2<¢+<¢$<¢<¢<¢<¢<¢<¢ú;¢ó;¢ì;¢å;¢Þ;¢×;¢Ð;¢É;¢Â;¢»;¢´;¢­;¢¦;¢Ÿ;¢˜;¢‘;¢Š;¢ƒ;¢|;¢u;¢n;¢g;¢`;¢Y;¢R;¢K;¢D;¢=;¢6;¢/;¢(;¢!;¢;¢;¢ ;¢;¢þ:¢÷:¢ð:¢é:¢â:¢Û:¢Ô:¢Í:¢Æ:¢¿:¢¸:¢±:¢ª:¢£:¢œ:¢•:¢Ž:¢‡:¢€:¢y:¢r:¢k:¢d:¢]:¢V:¢O:¢H:¢A:¢::¢3:¢,:¢%:¢:¢:¢:¢ :¢:¢û9¢ô9¢í9¢æ9¢ß9¢Ø9¢Ñ9¢Ê9¢Ã9¢¼9¢µ9¢®9¢§9¢ 9¢™9¢’9¢‹9¢„9¢}9¢v9¢o9¢h9¢a9¢Z9¢S9¢L9¢E9¢>9¢79¢09¢)9¢"9¢9¢9¢ 9¢9¢ÿ8¢ø8¢ñ8¢ê8¢ã8¢Ü8¢Õ8¢Î8¢Ç8¢À8¢¹8¢²8¢«8¢¤8¢8¢–8¢8¢ˆ8¢8¢z8¢s8¢l8¢e8¢^8¢W8¢P8¢I8¢B8¢;8¢48¢-8¢&8¢8¢8¢8¢ 8¢8¢ü7¢õ7¢î7¢ç7¢à7¢Ù7¢Ò7¢Ë7¢Ä7¢½7¢¶7¢¯7¢¨7¢¡7¢š7¢“7¢Œ7¢…7¢~7¢w7¢p7¢i7¢b7¢[7¢T7¢M7¢F7¢?7¢87¢17¢*7¢#7¢7¢7¢7¢7¢7¢ù6¢ò6¢ë6¢ä6¢Ý6¢Ö6¢Ï6¢È6¢Á6¢º6¢³6¢¬6¢¥6¢ž6¢—6¢6¢‰6¢‚6¢{6¢t6¢m6¢f6¢_6¢X6¢Q6¢J6¢C6¢<6¢56¢.6¢'6¢ 6¢6¢6¢ 6¢6¢ý5¢ö5¢ï5¢è5¢á5¢Ú5¢Ó5¢Ì5¢Å5¢¾5¢·5¢°5¢©5¢¢5¢›5¢”5¢5¢†5¢5¢x5¢q5¢j5¢c5¢\5¢U5¢N5¢G5¢@5¢95¢25¢+5¢$5¢5¢5¢5¢5¢5¢ú4¢ó4¢ì4¢å4¢Þ4¢×4¢Ð4¢É4¢Â4¢»4¢´4¢­4¢¦4¢Ÿ4¢˜4¢‘4¢Š4¢ƒ4¢|4¢u4¢n4¢g4¢`4¢Y4¢R4¢K4¢D4¢=4¢64¢/4¢(4¢!4¢4¢4¢ 4¢4¢þ3¢÷3¢ð3¢é3¢â3¢Û3¢Ô3¢Í3¢Æ3¢¿3¢¸3¢±3¢ª3¢£3¢œ3¢•3¢Ž3¢‡3¢€3¢y3¢r3¢k3¢d3¢]3¢V3¢O3¢H3¢A3¢:3¢33¢,3¢%3¢3¢3¢3¢ 3¢3¢û2¢ô2¢í2¢æ2¢ß2¢Ø2¢Ñ2¢Ê2¢Ã2¢¼2¢µ2¢®2¢§2¢ 2¢™2¢’2¢‹2¢„2¢}2¢v2¢o2¢h2¢a2¢Z2¢S2¢L2¢E2¢>2¢72¢02¢)2¢"2¢2¢2¢ 2¢2¢ÿ1¢ø1¢ñ1¢ê1¢ã1¢Ü1¢Õ1¢Î1¢Ç1¢À1¢¹1¢²1¢«1¢¤1¢1¢–1¢1¢ˆ1¢1¢z1¢s1¢l1¢e1¢^1¢W1¢P1¢I1¢B1¢;1¢41¢-1¢&1¢1¢1¢1¢ 1¢1¢ü0¢õ0¢î0¢ç0¢à0¢Ù0¢Ò0¢Ë0¢Ä0¢½0¢¶0¢¯0¢¨0¢¡0¢š0¢“0¢Œ0¢…0¢~0¢w0¢p0¢i0¢b0¢[0¢T0¢M0¢F0¢?0¢80¢10¢*0¢#0¢0¢0¢0¢0¢0¢ù/¢ò/¢ë/¢ä/¢Ý/¢Ö/¢Ï/¢È/¢Á/¢º/¢³/¢¬/¢¥/¢ž/¢—/¢/¢‰/¢‚/¢{/¢t/¢m/¢f/¢_/¢X/¢Q/¢J/¢C/¢+¢7+¢0+¢)+¢"+¢+¢+¢ +¢+¢ÿ*¢ø*¢ñ*¢ê*¢ã*¢Ü*¢Õ*¢Î*¢Ç*¢À*¢¹*¢²*¢«*¢¤*¢*¢–*¢*¢ˆ*¢*¢z*¢s*¢l*¢e*¢^*¢W*¢P*¢I*¢B*¢;*¢4*¢-*¢&*¢*¢*¢*¢ *¢*¢ü)¢õ)¢î)¢ç)¢à)¢Ù)¢Ò)¢Ë)¢Ä)¢½)¢¶)¢¯)¢¨)¢¡)¢š)¢“)¢Œ)¢…)¢~)¢w)¢p)¢i)¢b)¢[)¢T)¢M)¢F)¢?)¢8)¢1)¢*)¢#)¢)¢)¢)¢)¢)¢ù(¢ò(¢ë(¢ä(¢Ý(¢Ö(¢Ï(¢È(¢Á(¢º(¢³(¢¬(¢¥(¢ž(¢—(¢(¢‰(¢‚(¢{(¢t(¢m(¢f(¢_(¢X(¢Q(¢J(¢C(¢<(¢5(¢.(¢'(¢ (¢(¢(¢ (¢(¢ý'¢ö'¢ï'¢è'¢á'¢Ú'¢Ó'¢Ì'¢Å'¢¾'¢·'¢°'¢©'¢¢'¢›'¢”'¢'¢†'¢'¢x'¢q'¢j'¢c'¢\'¢U'¢N'¢G'¢@'¢9'¢2'¢+'¢$'¢'¢'¢'¢'¢'¢ú&¢ó&¢ì&¢å&¢Þ&¢×&¢Ð&¢É&¢Â&¢»&¢´&¢­&¢¦&¢Ÿ&¢˜&¢‘&¢Š&¢ƒ&¢|&¢u&¢n&¢g&¢`&¢Y&¢R&¢K&¢D&¢=&¢6&¢/&¢(&¢!&¢&¢&¢ &¢&¢þ%¢÷%¢ð%¢é%¢â%¢Û%¢Ô%¢Í%¢Æ%¢¿%¢¸%¢±%¢ª%¢£%¢œ%¢•%¢Ž%¢‡%¢€%¢y%¢r%¢k%¢d%¢]%¢V%¢O%¢H%¢A%¢:%¢3%¢,%¢%%¢%¢%¢%¢ %¢%¢û$¢ô$¢í$¢æ$¢ß$¢Ø$¢Ñ$¢Ê$¢Ã$¢¼$¢µ$¢®$¢§$¢ $¢™$¢’$¢‹$¢„$¢}$¢v$¢o$¢h$¢a$¢Z$¢S$¢L$¢E$¢>$¢7$¢0$¢)$¢"$¢$¢$¢ $¢$¢ÿ#¢ø#¢ñ#¢ê#¢ã#¢Ü#¢Õ#¢Î#¢Ç#¢À#¢¹#¢²#¢«#¢¤#¢#¢–#¢#¢ˆ#¢#¢z#¢s#¢l#¢e#¢^#¢W#¢P#¢I#¢B#¢;#¢4#¢-#¢&#¢#¢#¢#¢ #¢#¢ü"¢õ"¢î"¢ç"¢à"¢Ù"¢Ò"¢Ë"¢Ä"¢½"¢¶"¢¯"¢¨"¢¡"¢š"¢“"¢Œ"¢…"¢~"¢w"¢p"¢i"¢b"¢["¢T"¢M"¢F"¢?"¢8"¢1"¢*"¢#"¢"¢"¢"¢"¢"¢ù!¢ò!¢ë!¢ä!¢Ý!¢Ö!¢Ï!¢È!¢Á!¢º!¢³!¢¬!¢¥!¢ž!¢—!¢!¢‰!¢‚!¢{!¢t!¢m!¢f!¢_!¢X!¢Q!¢J!¢C!¢¢7¢0¢)¢"¢¢¢ ¢¢ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢Î¢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¢ó¢ì¢å¢Þ¢×¢Ð¢É¢Â¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¢ô¢í¢æ¢ß¢Ø¢Ñ¢Ê¢Ã¢¼¢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢Î¢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¢ó¢ì¢å¢Þ¢×¢Ð¢É¢Â¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¢ô¢í¢æ¢ß¢Ø¢Ñ¢Ê¢Ã¢¼¢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢Î¢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü ¢õ ¢î ¢ç ¢à ¢Ù ¢Ò ¢Ë ¢Ä ¢½ ¢¶ ¢¯ ¢¨ ¢¡ ¢š ¢“ ¢Œ ¢… ¢~ ¢w ¢p ¢i ¢b ¢[ ¢T ¢M ¢F ¢? ¢8 ¢1 ¢* ¢# ¢ ¢ ¢ ¢ ¢ ¢ù ¢ò ¢ë ¢ä ¢Ý ¢Ö ¢Ï ¢È ¢Á ¢º ¢³ ¢¬ ¢¥ ¢ž ¢— ¢ ¢‰ ¢‚ ¢{ ¢t ¢m ¢f ¢_ ¢X ¢Q ¢J ¢C ¢< ¢5 ¢. ¢' ¢ ¢ ¢ ¢ ¢ ¢ý ¢ö ¢ï ¢è ¢á ¢Ú ¢Ó ¢Ì ¢Å ¢¾ ¢· ¢° ¢© ¢¢ ¢› ¢” ¢ ¢† ¢ ¢x ¢q ¢j ¢c ¢\ ¢U ¢N ¢G ¢@ ¢9 ¢2 ¢+ ¢$ ¢ ¢ ¢ ¢ ¢ ¢ú ¢ó ¢ì ¢å ¢Þ ¢× ¢Ð ¢É ¢ ¢» ¢´ ¢­ ¢¦ ¢Ÿ ¢˜ ¢‘ ¢Š ¢ƒ ¢| ¢u ¢n ¢g ¢` ¢Y ¢R ¢K ¢D ¢= ¢6 ¢/ ¢( ¢! ¢ ¢ ¢ ¢ ¢þ ¢÷ ¢ð ¢é ¢â ¢Û ¢Ô ¢Í ¢Æ ¢¿ ¢¸ ¢± ¢ª ¢£ ¢œ ¢• ¢Ž ¢‡ ¢€ ¢y ¢r ¢k ¢d ¢] ¢V ¢O ¢H ¢A ¢: ¢3 ¢, ¢% ¢ ¢ ¢ ¢ ¢ ¢û¢ô¢í¢æ¢ß¢Ø¢Ñ¢Ê¢Ã¢¼¢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢Î¢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¢ó¢ì¢å¢Þ¢×¢Ð¢É¢Â¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¢ô¢í¢æ¢ß¢Ø¢Ñ¢Ê¢Ã¢¼¢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢΢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢üÿ¡õÿ¡îÿ¡çÿ¡àÿ¡Ùÿ¡Òÿ¡Ëÿ¡Äÿ¡½ÿ¡¶ÿ¡¯ÿ¡¨ÿ¡¡ÿ¡šÿ¡“ÿ¡Œÿ¡…ÿ¡~ÿ¡wÿ¡pÿ¡iÿ¡bÿ¡[ÿ¡Tÿ¡Mÿ¡Fÿ¡?ÿ¡8ÿ¡1ÿ¡*ÿ¡#ÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ÿ¡ùþ¡òþ¡ëþ¡äþ¡Ýþ¡Öþ¡Ïþ¡Èþ¡Áþ¡ºþ¡³þ¡¬þ¡¥þ¡žþ¡—þ¡þ¡‰þ¡‚þ¡{þ¡tþ¡mþ¡fþ¡_þ¡Xþ¡Qþ¡Jþ¡Cþ¡<þ¡5þ¡.þ¡'þ¡ þ¡þ¡þ¡ þ¡þ¡ýý¡öý¡ïý¡èý¡áý¡Úý¡Óý¡Ìý¡Åý¡¾ý¡·ý¡°ý¡©ý¡¢ý¡›ý¡”ý¡ý¡†ý¡ý¡xý¡qý¡jý¡cý¡\ý¡Uý¡Ný¡Gý¡@ý¡9ý¡2ý¡+ý¡$ý¡ý¡ý¡ý¡ý¡ý¡úü¡óü¡ìü¡åü¡Þü¡×ü¡Ðü¡Éü¡Âü¡»ü¡´ü¡­ü¡¦ü¡Ÿü¡˜ü¡‘ü¡Šü¡ƒü¡|ü¡uü¡nü¡gü¡`ü¡Yü¡Rü¡Kü¡Dü¡=ü¡6ü¡/ü¡(ü¡!ü¡ü¡ü¡ ü¡ü¡þû¡÷û¡ðû¡éû¡âû¡Ûû¡Ôû¡Íû¡Æû¡¿û¡¸û¡±û¡ªû¡£û¡œû¡•û¡Žû¡‡û¡€û¡yû¡rû¡kû¡dû¡]û¡Vû¡Oû¡Hû¡Aû¡:û¡3û¡,û¡%û¡û¡û¡û¡ û¡û¡ûú¡ôú¡íú¡æú¡ßú¡Øú¡Ñú¡Êú¡Ãú¡¼ú¡µú¡®ú¡§ú¡ ú¡™ú¡’ú¡‹ú¡„ú¡}ú¡vú¡oú¡hú¡aú¡Zú¡Sú¡Lú¡Eú¡>ú¡7ú¡0ú¡)ú¡"ú¡ú¡ú¡ ú¡ú¡ÿù¡øù¡ñù¡êù¡ãù¡Üù¡Õù¡Îù¡Çù¡Àù¡¹ù¡²ù¡«ù¡¤ù¡ù¡–ù¡ù¡ˆù¡ù¡zù¡sù¡lù¡eù¡^ù¡Wù¡Pù¡Iù¡Bù¡;ù¡4ù¡-ù¡&ù¡ù¡ù¡ù¡ ù¡ù¡üø¡õø¡îø¡çø¡àø¡Ùø¡Òø¡Ëø¡Äø¡½ø¡¶ø¡¯ø¡¨ø¡¡ø¡šø¡“ø¡Œø¡…ø¡~ø¡wø¡pø¡iø¡bø¡[ø¡Tø¡Mø¡Fø¡?ø¡8ø¡1ø¡*ø¡#ø¡ø¡ø¡ø¡ø¡ø¡ù÷¡ò÷¡ë÷¡ä÷¡Ý÷¡Ö÷¡Ï÷¡È÷¡Á÷¡º÷¡³÷¡¬÷¡¥÷¡ž÷¡—÷¡÷¡‰÷¡‚÷¡{÷¡t÷¡m÷¡f÷¡_÷¡X÷¡Q÷¡J÷¡C÷¡<÷¡5÷¡.÷¡'÷¡ ÷¡÷¡÷¡ ÷¡÷¡ýö¡öö¡ïö¡èö¡áö¡Úö¡Óö¡Ìö¡Åö¡¾ö¡·ö¡°ö¡©ö¡¢ö¡›ö¡”ö¡ö¡†ö¡ö¡xö¡qö¡jö¡cö¡\ö¡Uö¡Nö¡Gö¡@ö¡9ö¡2ö¡+ö¡$ö¡ö¡ö¡ö¡ö¡ö¡úõ¡óõ¡ìõ¡åõ¡Þõ¡×õ¡Ðõ¡Éõ¡Âõ¡»õ¡´õ¡­õ¡¦õ¡Ÿõ¡˜õ¡‘õ¡Šõ¡ƒõ¡|õ¡uõ¡nõ¡gõ¡`õ¡Yõ¡Rõ¡Kõ¡Dõ¡=õ¡6õ¡/õ¡(õ¡!õ¡õ¡õ¡ õ¡õ¡þô¡÷ô¡ðô¡éô¡âô¡Ûô¡Ôô¡Íô¡Æô¡¿ô¡¸ô¡±ô¡ªô¡£ô¡œô¡•ô¡Žô¡‡ô¡€ô¡yô¡rô¡kô¡dô¡]ô¡Vô¡Oô¡Hô¡Aô¡:ô¡3ô¡,ô¡%ô¡ô¡ô¡ô¡ ô¡ô¡ûó¡ôó¡íó¡æó¡ßó¡Øó¡Ñó¡Êó¡Ãó¡¼ó¡µó¡®ó¡§ó¡ ó¡™ó¡’ó¡‹ó¡„ó¡}ó¡vó¡oó¡hó¡aó¡Zó¡Só¡Ló¡Eó¡>ó¡7ó¡0ó¡)ó¡"ó¡ó¡ó¡ ó¡ó¡ÿò¡øò¡ñò¡êò¡ãò¡Üò¡Õò¡Îò¡Çò¡Àò¡¹ò¡²ò¡«ò¡¤ò¡ò¡–ò¡ò¡ˆò¡ò¡zò¡sò¡lò¡eò¡^ò¡Wò¡Pò¡Iò¡Bò¡;ò¡4ò¡-ò¡&ò¡ò¡ò¡ò¡ ò¡ò¡üñ¡õñ¡îñ¡çñ¡àñ¡Ùñ¡Òñ¡Ëñ¡Äñ¡½ñ¡¶ñ¡¯ñ¡¨ñ¡¡ñ¡šñ¡“ñ¡Œñ¡…ñ¡~ñ¡wñ¡pñ¡iñ¡bñ¡[ñ¡Tñ¡Mñ¡Fñ¡?ñ¡8ñ¡1ñ¡*ñ¡#ñ¡ñ¡ñ¡ñ¡ñ¡ñ¡ùð¡òð¡ëð¡äð¡Ýð¡Öð¡Ïð¡Èð¡Áð¡ºð¡³ð¡¬ð¡¥ð¡žð¡—ð¡ð¡‰ð¡‚ð¡{ð¡tð¡mð¡fð¡_ð¡Xð¡Qð¡Jð¡Cð¡<ð¡5ð¡.ð¡'ð¡ ð¡ð¡ð¡ ð¡ð¡ýï¡öï¡ïï¡èï¡áï¡Úï¡Óï¡Ìï¡Åï¡ï¡†ï¡ï¡xï¡qï¡jï¡cï¡\ï¡Uï¡Nï¡Gï¡@ï¡9ï¡2ï¡+ï¡$ï¡ï¡ï¡ï¡ï¡ï¡úî¡óî¡ìî¡åî¡Þî¡×î¡Ðî¡Éî¡Âî¡|î¡uî¡nî¡gî¡`î¡Yî¡Rî¡Kî¡Dî¡=î¡6î¡/î¡(î¡!î¡î¡î¡ î¡î¡þí¡÷í¡ðí¡éí¡âí¡Ûí¡Ôí¡Íí¡Æí¡¿í¡¸í¡±í¡ªí¡£í¡œí¡•í¡Ží¡‡í¡€í¡yí¡rí¡kí¡dí¡]í¡Ví¡Oí¡Hí¡Aí¡:í¡3í¡,í¡%í¡í¡í¡í¡ í¡í¡ûì¡ôì¡íì¡æì¡ßì¡Øì¡Ñì¡Êì¡Ã졼졵졮졧졠졙졒졋졄ì¡}ì¡vì¡oì¡hì¡aì¡Zì¡Sì¡Lì¡Eì¡>ì¡7ì¡0ì¡)ì¡"ì¡ì¡ì¡ ì¡ì¡ÿë¡øë¡ñë¡êë¡ãë¡Üë¡Õë¡Îë¡Çë¡À롹롲롫롤ë¡ë¡–ë¡ë¡ˆë¡ë¡zë¡së¡lë¡eë¡^ë¡Wë¡Pë¡Ië¡Bë¡;ë¡4ë¡-ë¡&ë¡ë¡ë¡ë¡ ë¡ë¡üê¡õê¡îê¡çê¡àê¡Ùê¡Òê¡Ëê¡Ä꡽꡶ꡯꡨꡡꡚꡓꡌꡅê¡~ê¡wê¡pê¡iê¡bê¡[ê¡Tê¡Mê¡Fê¡?ê¡8ê¡1ê¡*ê¡#ê¡ê¡ê¡ê¡ê¡ê¡ùé¡òé¡ëé¡äé¡Ýé¡Öé¡Ïé¡Èé¡Á顺顳顬顥類顗é¡é¡‰é¡‚é¡{é¡té¡mé¡fé¡_é¡Xé¡Qé¡Jé¡Cé¡<é¡5é¡.é¡'é¡ é¡é¡é¡ é¡é¡ýè¡öè¡ïè¡èè¡áè¡Úè¡Óè¡Ìè¡Å衾衷衰衩衢衛衔è¡è¡†è¡è¡xè¡qè¡jè¡cè¡\è¡Uè¡Nè¡Gè¡@è¡9è¡2è¡+è¡$è¡è¡è¡è¡è¡è¡úç¡óç¡ìç¡åç¡Þç¡×ç¡Ðç¡Éç¡Â硻硴硭硦硟硘硑硊硃ç¡|ç¡uç¡nç¡gç¡`ç¡Yç¡Rç¡Kç¡Dç¡=ç¡6ç¡/ç¡(ç¡!ç¡ç¡ç¡ ç¡ç¡þæ¡÷æ¡ðæ¡éæ¡âæ¡Ûæ¡Ôæ¡Íæ¡Ææ¡¿æ¡¸æ¡±æ¡ªæ¡£æ¡œæ¡•æ¡Žæ¡‡æ¡€æ¡yæ¡ræ¡kæ¡dæ¡]æ¡Væ¡Oæ¡Hæ¡Aæ¡:æ¡3æ¡,æ¡%æ¡æ¡æ¡æ¡ æ¡æ¡ûå¡ôå¡í塿å¡ß塨å¡Ñå¡Êå¡Ã塼塵塮塧塠塙塒塋塄å¡}å¡vå¡oå¡hå¡aå¡Zå¡Så¡Lå¡Eå¡>å¡7å¡0å¡)å¡"å¡å¡å¡ å¡å¡ÿ䡸ä¡ñä¡êä¡ãä¡Üä¡Õä¡Îä¡Çä¡À䡹䡲䡫䡤ä¡ä¡–ä¡ä¡ˆä¡ä¡zä¡sä¡lä¡eä¡^ä¡Wä¡Pä¡Iä¡Bä¡;ä¡4ä¡-ä¡&ä¡ä¡ä¡ä¡ ä¡ä¡üã¡õã¡îã¡çã¡àã¡Ùã¡Òã¡Ëã¡Ä㡽㡶㡯㡨㡡㡚㡓㡌㡅ã¡~ã¡wã¡pã¡iã¡bã¡[ã¡Tã¡Mã¡Fã¡?ã¡8ã¡1ã¡*ã¡#ã¡ã¡ã¡ã¡ã¡ã¡ùâ¡òâ¡ëâ¡äâ¡Ýâ¡Öâ¡Ïâ¡Èâ¡Á⡺⡳⡬⡥⡞⡗â¡â¡‰â¡‚â¡{â¡tâ¡mâ¡fâ¡_â¡Xâ¡Qâ¡Jâ¡Câ¡<â¡5â¡.â¡'â¡ â¡â¡â¡ â¡â¡ýá¡öá¡ïá¡èá¡áá¡Úá¡Óá¡Ìá¡Å᡾ᡷᡰᡩᡢᡛᡔá¡á¡†á¡á¡xá¡qá¡já¡cá¡\á¡Uá¡Ná¡Gá¡@á¡9á¡2á¡+á¡$á¡á¡á¡á¡á¡á¡úà¡óà¡ìà¡åà¡Þà¡×à¡Ðà¡Éà¡Âࡻࡴ࡭ࡦ࡟ࡘࡑࡊࡃà¡|à¡uà¡nà¡gà¡`à¡Yà¡Rà¡Kà¡Dà¡=à¡6à¡/à¡(à¡!à¡à¡à¡ à¡à¡þß¡÷ß¡ðß¡éß¡âß¡Ûß¡Ôß¡Íß¡Æß¡¿ß¡¸ß¡±ß¡ªß¡£ß¡œß¡•ß¡Žß¡‡ß¡€ß¡yß¡rß¡kß¡dß¡]ß¡Vß¡Oß¡Hß¡Aß¡:ß¡3ß¡,ß¡%ߡߡߡߡ ߡߡûÞ¡ôÞ¡íÞ¡æÞ¡ßÞ¡ØÞ¡ÑÞ¡ÊÞ¡ÃÞ¡¼Þ¡µÞ¡®Þ¡§Þ¡ Þ¡™Þ¡’Þ¡‹Þ¡„Þ¡}Þ¡vÞ¡oÞ¡hÞ¡aÞ¡ZÞ¡SÞ¡LÞ¡EÞ¡>Þ¡7Þ¡0Þ¡)Þ¡"Þ¡Þ¡Þ¡ Þ¡Þ¡ÿÝ¡øÝ¡ñÝ¡êÝ¡ãÝ¡ÜÝ¡ÕÝ¡ÎÝ¡ÇÝ¡ÀÝ¡¹Ý¡²Ý¡«Ý¡¤Ý¡Ý¡–ݡݡˆÝ¡Ý¡zÝ¡sÝ¡lÝ¡eÝ¡^Ý¡WÝ¡PÝ¡IÝ¡BÝ¡;Ý¡4Ý¡-Ý¡&ݡݡݡݡ ݡݡüÜ¡õÜ¡îÜ¡çÜ¡àÜ¡ÙÜ¡ÒÜ¡ËÜ¡ÄÜ¡½Ü¡¶Ü¡¯Ü¡¨Ü¡¡Ü¡šÜ¡“Ü¡ŒÜ¡…Ü¡~Ü¡wÜ¡pÜ¡iÜ¡bÜ¡[Ü¡TÜ¡MÜ¡FÜ¡?Ü¡8Ü¡1Ü¡*Ü¡#ܡܡܡܡܡܡùÛ¡òÛ¡ëÛ¡äÛ¡ÝÛ¡ÖÛ¡ÏÛ¡ÈÛ¡ÁÛ¡ºÛ¡³Û¡¬Û¡¥Û¡žÛ¡—Û¡Û¡‰Û¡‚Û¡{Û¡tÛ¡mÛ¡fÛ¡_Û¡XÛ¡QÛ¡JÛ¡CÛ¡<Û¡5Û¡.Û¡'Û¡ Û¡Û¡Û¡ Û¡Û¡ýÚ¡öÚ¡ïÚ¡èÚ¡áÚ¡ÚÚ¡ÓÚ¡ÌÚ¡ÅÚ¡¾Ú¡·Ú¡°Ú¡©Ú¡¢Ú¡›Ú¡”Ú¡Ú¡†Ú¡Ú¡xÚ¡qÚ¡jÚ¡cÚ¡\Ú¡UÚ¡NÚ¡GÚ¡@Ú¡9Ú¡2Ú¡+Ú¡$Ú¡Ú¡Ú¡Ú¡Ú¡Ú¡úÙ¡óÙ¡ìÙ¡åÙ¡ÞÙ¡×Ù¡ÐÙ¡ÉÙ¡ÂÙ¡»Ù¡´Ù¡­Ù¡¦Ù¡ŸÙ¡˜Ù¡‘Ù¡ŠÙ¡ƒÙ¡|Ù¡uÙ¡nÙ¡gÙ¡`Ù¡YÙ¡RÙ¡KÙ¡DÙ¡=Ù¡6Ù¡/Ù¡(Ù¡!١١١ ١١þØ¡÷Ø¡ðØ¡騡âØ¡ÛØ¡ÔØ¡ÍØ¡ÆØ¡¿Ø¡¸Ø¡±Ø¡ªØ¡£Ø¡œØ¡•Ø¡ŽØ¡‡Ø¡€Ø¡yØ¡rØ¡kØ¡dØ¡]Ø¡VØ¡OØ¡HØ¡AØ¡:Ø¡3Ø¡,Ø¡%ءءءء ءءûסôסíסæ×¡ßסØ×¡ÑסÊסÃס¼×¡µ×¡®×¡§×¡ ×¡™×¡’ס‹×¡„ס}סvסoסhסaסZסSסLסEס>ס7ס0ס)ס"ססס ססÿÖ¡øÖ¡ñÖ¡êÖ¡ãÖ¡ÜÖ¡ÕÖ¡ÎÖ¡ÇÖ¡ÀÖ¡¹Ö¡²Ö¡«Ö¡¤Ö¡Ö¡–Ö¡Ö¡ˆÖ¡Ö¡zÖ¡sÖ¡lÖ¡eÖ¡^Ö¡WÖ¡PÖ¡IÖ¡BÖ¡;Ö¡4Ö¡-Ö¡&Ö¡Ö¡Ö¡Ö¡ Ö¡Ö¡üÕ¡õÕ¡îÕ¡çÕ¡àÕ¡ÙÕ¡ÒÕ¡ËÕ¡ÄÕ¡½Õ¡¶Õ¡¯Õ¡¨Õ¡¡Õ¡šÕ¡“Õ¡ŒÕ¡…Õ¡~Õ¡wÕ¡pÕ¡iÕ¡bÕ¡[Õ¡TÕ¡MÕ¡FÕ¡?Õ¡8Õ¡1Õ¡*Õ¡#Õ¡Õ¡Õ¡Õ¡Õ¡Õ¡ùÔ¡òÔ¡ëÔ¡äÔ¡ÝÔ¡ÖÔ¡ÏÔ¡ÈÔ¡ÁÔ¡ºÔ¡³Ô¡¬Ô¡¥Ô¡žÔ¡—Ô¡Ô¡‰Ô¡‚Ô¡{Ô¡tÔ¡mÔ¡fÔ¡_Ô¡XÔ¡QÔ¡JÔ¡CÔ¡<Ô¡5Ô¡.Ô¡'Ô¡ Ô¡Ô¡Ô¡ Ô¡Ô¡ýÓ¡öÓ¡ïÓ¡èÓ¡áÓ¡ÚÓ¡ÓÓ¡ÌÓ¡ÅÓ¡¾Ó¡·Ó¡°Ó¡©Ó¡¢Ó¡›Ó¡”Ó¡Ó¡†Ó¡Ó¡xÓ¡qÓ¡jÓ¡cÓ¡\Ó¡UÓ¡NÓ¡GÓ¡@Ó¡9Ó¡2Ó¡+Ó¡$Ó¡Ó¡Ó¡Ó¡Ó¡Ó¡úÒ¡óÒ¡ìÒ¡åÒ¡ÞÒ¡×Ò¡ÐÒ¡ÉÒ¡ÂÒ¡»Ò¡´Ò¡­Ò¡¦Ò¡ŸÒ¡˜Ò¡‘Ò¡ŠÒ¡ƒÒ¡|Ò¡uÒ¡nÒ¡gÒ¡`Ò¡YÒ¡RÒ¡KÒ¡DÒ¡=Ò¡6Ò¡/Ò¡(Ò¡!Ò¡Ò¡Ò¡ Ò¡Ò¡þÑ¡÷Ñ¡ðÑ¡éÑ¡âÑ¡ÛÑ¡ÔÑ¡ÍÑ¡ÆÑ¡¿Ñ¡¸Ñ¡±Ñ¡ªÑ¡£Ñ¡œÑ¡•Ñ¡ŽÑ¡‡Ñ¡€Ñ¡yÑ¡rÑ¡kÑ¡dÑ¡]Ñ¡VÑ¡OÑ¡HÑ¡AÑ¡:Ñ¡3Ñ¡,Ñ¡%ѡѡѡѡ ѡѡûСôСíСæÐ¡ßСØÐ¡ÑСÊСÃС¼Ð¡µÐ¡®Ð¡§Ð¡ Ð¡™Ð¡’С‹Ð¡„С}СvСoСhСaСZСSСLСEС>С7С0С)С"ССС ССÿÏ¡øÏ¡ñÏ¡êÏ¡ãÏ¡ÜÏ¡ÕÏ¡ÎÏ¡ÇÏ¡ÀÏ¡¹Ï¡²Ï¡«Ï¡¤Ï¡Ï¡–ϡϡˆÏ¡Ï¡zÏ¡sÏ¡lÏ¡eÏ¡^Ï¡WÏ¡PÏ¡IÏ¡BÏ¡;Ï¡4Ï¡-Ï¡&ϡϡϡϡ ϡϡüΡõΡîΡçΡàΡÙΡÒΡËΡÄΡ½Î¡¶Î¡¯Î¡¨Î¡¡Î¡šÎ¡“ΡŒÎ¡…Ρ~ΡwΡpΡiΡbΡ[ΡTΡMΡFΡ?Ρ8Ρ1Ρ*Ρ#ΡΡΡΡΡΡùÍ¡òÍ¡ëÍ¡äÍ¡ÝÍ¡ÖÍ¡ÏÍ¡ÈÍ¡ÁÍ¡ºÍ¡³Í¡¬Í¡¥Í¡žÍ¡—͡͡‰Í¡‚Í¡{Í¡tÍ¡mÍ¡fÍ¡_Í¡XÍ¡QÍ¡JÍ¡CÍ¡<Í¡5Í¡.Í¡'Í¡ ͡͡͡ ͡͡ýÌ¡öÌ¡ïÌ¡èÌ¡áÌ¡ÚÌ¡ÓÌ¡ÌÌ¡ÅÌ¡¾Ì¡·Ì¡°Ì¡©Ì¡¢Ì¡›Ì¡”̡̡†Ì¡Ì¡xÌ¡qÌ¡jÌ¡cÌ¡\Ì¡UÌ¡NÌ¡GÌ¡@Ì¡9Ì¡2Ì¡+Ì¡$̡̡̡̡̡̡úË¡óË¡ìË¡åË¡ÞË¡×Ë¡ÐË¡ÉË¡ÂË¡»Ë¡´Ë¡­Ë¡¦Ë¡ŸË¡˜Ë¡‘Ë¡ŠË¡ƒË¡|Ë¡uË¡nË¡gË¡`Ë¡YË¡RË¡KË¡DË¡=Ë¡6Ë¡/Ë¡(Ë¡!ˡˡˡ ˡˡþÊ¡÷Ê¡ðÊ¡éÊ¡âÊ¡ÛÊ¡ÔÊ¡ÍÊ¡ÆÊ¡¿Ê¡¸Ê¡±Ê¡ªÊ¡£Ê¡œÊ¡•Ê¡ŽÊ¡‡Ê¡€Ê¡yÊ¡rÊ¡kÊ¡dÊ¡]Ê¡VÊ¡OÊ¡HÊ¡AÊ¡:Ê¡3Ê¡,Ê¡%ʡʡʡʡ ʡʡûÉ¡ôÉ¡íÉ¡æÉ¡ßÉ¡ØÉ¡ÑÉ¡ÊÉ¡ÃÉ¡¼É¡µÉ¡®É¡§É¡ É¡™É¡’É¡‹É¡„É¡}É¡vÉ¡oÉ¡hÉ¡aÉ¡ZÉ¡SÉ¡LÉ¡EÉ¡>É¡7É¡0É¡)É¡"ɡɡɡ ɡɡÿÈ¡øÈ¡ñÈ¡êÈ¡ãÈ¡ÜÈ¡ÕÈ¡ÎÈ¡ÇÈ¡ÀÈ¡¹È¡²È¡«È¡¤È¡È¡–ȡȡˆÈ¡È¡zÈ¡sÈ¡lÈ¡eÈ¡^È¡WÈ¡PÈ¡IÈ¡BÈ¡;È¡4È¡-È¡&ȡȡȡȡ ȡȡüÇ¡õÇ¡îÇ¡çÇ¡àÇ¡ÙÇ¡ÒÇ¡ËÇ¡ÄÇ¡½Ç¡¶Ç¡¯Ç¡¨Ç¡¡Ç¡šÇ¡“Ç¡ŒÇ¡…Ç¡~Ç¡wÇ¡pÇ¡iÇ¡bÇ¡[Ç¡TÇ¡MÇ¡FÇ¡?Ç¡8Ç¡1Ç¡*Ç¡#ǡǡǡǡǡǡùÆ¡òÆ¡ëÆ¡䯡ÝÆ¡ÖÆ¡ÏÆ¡ÈÆ¡ÁÆ¡ºÆ¡³Æ¡¬Æ¡¥Æ¡žÆ¡—ơơ‰Æ¡‚Æ¡{Æ¡tÆ¡mÆ¡fÆ¡_Æ¡XÆ¡QÆ¡JÆ¡CÆ¡<Æ¡5Æ¡.Æ¡'Æ¡ ơơơ ơơýÅ¡öÅ¡ïÅ¡èÅ¡áÅ¡ÚÅ¡ÓÅ¡ÌÅ¡ÅÅ¡¾Å¡·Å¡°Å¡©Å¡¢Å¡›Å¡”šš†Å¡Å¡xÅ¡qÅ¡jÅ¡cÅ¡\Å¡UÅ¡NÅ¡GÅ¡@Å¡9Å¡2Å¡+Å¡$ššššššúÄ¡óÄ¡ìÄ¡åÄ¡ÞÄ¡×Ä¡ÐÄ¡ÉÄ¡ÂÄ¡»Ä¡´Ä¡­Ä¡¦Ä¡ŸÄ¡˜Ä¡‘Ä¡ŠÄ¡ƒÄ¡|Ä¡uÄ¡nÄ¡gÄ¡`Ä¡YÄ¡RÄ¡KÄ¡DÄ¡=Ä¡6Ä¡/Ä¡(Ä¡!ġġġ ġġþá÷áðáéáâáÛáÔáÍáÆÃ¡¿Ã¡¸Ã¡±Ã¡ªÃ¡£Ã¡œÃ¡•áŽÃ¡‡Ã¡€Ã¡yárákádá]áVáOáHáAá:á3á,á%áááá ááû¡ô¡í¡æÂ¡ß¡ØÂ¡Ñ¡Ê¡á¼Â¡µÂ¡®Â¡§Â¡ Â¡™Â¡’¡‹Â¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿÁ¡øÁ¡ñÁ¡êÁ¡ãÁ¡ÜÁ¡ÕÁ¡ÎÁ¡ÇÁ¡ÀÁ¡¹Á¡²Á¡«Á¡¤Á¡Á¡–Á¡Á¡ˆÁ¡Á¡zÁ¡sÁ¡lÁ¡eÁ¡^Á¡WÁ¡PÁ¡IÁ¡BÁ¡;Á¡4Á¡-Á¡&Á¡Á¡Á¡Á¡ Á¡Á¡üÀ¡õÀ¡îÀ¡çÀ¡àÀ¡ÙÀ¡ÒÀ¡ËÀ¡ÄÀ¡½À¡¶À¡¯À¡¨À¡¡À¡šÀ¡“À¡ŒÀ¡…À¡~À¡wÀ¡pÀ¡iÀ¡bÀ¡[À¡TÀ¡MÀ¡FÀ¡?À¡8À¡1À¡*À¡#À¡À¡À¡À¡À¡À¡ù¿¡ò¿¡ë¿¡ä¿¡Ý¿¡Ö¿¡Ï¿¡È¿¡Á¿¡º¿¡³¿¡¬¿¡¥¿¡ž¿¡—¿¡¿¡‰¿¡‚¿¡{¿¡t¿¡m¿¡f¿¡_¿¡X¿¡Q¿¡J¿¡C¿¡<¿¡5¿¡.¿¡'¿¡ ¿¡¿¡¿¡ ¿¡¿¡ý¾¡ö¾¡ᄀ辡ᾡÚ¾¡Ó¾¡̾¡ž¡¾¾¡·¾¡°¾¡©¾¡¢¾¡›¾¡”¾¡¾¡†¾¡¾¡x¾¡q¾¡j¾¡c¾¡\¾¡U¾¡N¾¡G¾¡@¾¡9¾¡2¾¡+¾¡$¾¡¾¡¾¡¾¡¾¡¾¡ú½¡ó½¡콡彡Þ½¡×½¡н¡ɽ¡½¡»½¡´½¡­½¡¦½¡Ÿ½¡˜½¡‘½¡н¡ƒ½¡|½¡u½¡n½¡g½¡`½¡Y½¡R½¡K½¡D½¡=½¡6½¡/½¡(½¡!½¡½¡½¡ ½¡½¡þ¼¡÷¼¡ð¼¡鼡⼡Û¼¡Ô¼¡ͼ¡Ƽ¡¿¼¡¸¼¡±¼¡ª¼¡£¼¡œ¼¡•¼¡޼¡‡¼¡€¼¡y¼¡r¼¡k¼¡d¼¡]¼¡V¼¡O¼¡H¼¡A¼¡:¼¡3¼¡,¼¡%¼¡¼¡¼¡¼¡ ¼¡¼¡û»¡ô»¡í»¡满ß»¡Ø»¡Ñ»¡Ê»¡û¡¼»¡µ»¡®»¡§»¡ »¡™»¡’»¡‹»¡„»¡}»¡v»¡o»¡h»¡a»¡Z»¡S»¡L»¡E»¡>»¡7»¡0»¡)»¡"»¡»¡»¡ »¡»¡ÿº¡øº¡ñº¡꺡㺡ܺ¡Õº¡κ¡Ǻ¡Àº¡¹º¡²º¡«º¡¤º¡º¡–º¡º¡ˆº¡º¡zº¡sº¡lº¡eº¡^º¡Wº¡Pº¡Iº¡Bº¡;º¡4º¡-º¡&º¡º¡º¡º¡ º¡º¡ü¹¡õ¹¡繡๡Ù¹¡Ò¹¡˹¡Ĺ¡½¹¡¶¹¡¯¹¡¨¹¡¡¹¡š¹¡“¹¡Œ¹¡…¹¡~¹¡w¹¡p¹¡i¹¡b¹¡[¹¡T¹¡M¹¡F¹¡?¹¡8¹¡1¹¡*¹¡#¹¡¹¡¹¡¹¡¹¡¹¡ù¸¡ò¸¡븡両ݸ¡Ö¸¡ϸ¡ȸ¡Á¸¡º¸¡³¸¡¬¸¡¥¸¡ž¸¡—¸¡¸¡‰¸¡‚¸¡{¸¡t¸¡m¸¡f¸¡_¸¡X¸¡Q¸¡J¸¡C¸¡<¸¡5¸¡.¸¡'¸¡ ¸¡¸¡¸¡ ¸¡¸¡ý·¡ö·¡ï·¡è·¡á·¡Ú·¡Ó·¡Ì·¡Å·¡¾·¡··¡°·¡©·¡¢·¡›·¡”·¡·¡†·¡·¡x·¡q·¡j·¡c·¡\·¡U·¡N·¡G·¡@·¡9·¡2·¡+·¡$·¡·¡·¡·¡·¡·¡ú¶¡ó¶¡ì¶¡å¶¡Þ¶¡×¶¡ж¡ɶ¡¶¡»¶¡´¶¡­¶¡¦¶¡Ÿ¶¡˜¶¡‘¶¡ж¡ƒ¶¡|¶¡u¶¡n¶¡g¶¡`¶¡Y¶¡R¶¡K¶¡D¶¡=¶¡6¶¡/¶¡(¶¡!¶¡¶¡¶¡ ¶¡¶¡þµ¡÷µ¡ðµ¡鵡ⵡÛµ¡Ôµ¡͵¡Ƶ¡¿µ¡¸µ¡±µ¡ªµ¡£µ¡œµ¡•µ¡޵¡‡µ¡€µ¡yµ¡rµ¡kµ¡dµ¡]µ¡Vµ¡Oµ¡Hµ¡Aµ¡:µ¡3µ¡,µ¡%µ¡µ¡µ¡µ¡ µ¡µ¡û´¡ô´¡í´¡æ´¡ß´¡Ø´¡Ñ´¡Ê´¡ô¡¼´¡µ´¡®´¡§´¡ ´¡™´¡’´¡‹´¡„´¡}´¡v´¡o´¡h´¡a´¡Z´¡S´¡L´¡E´¡>´¡7´¡0´¡)´¡"´¡´¡´¡ ´¡´¡ÿ³¡ø³¡ñ³¡곡㳡ܳ¡Õ³¡γ¡dz¡À³¡¹³¡²³¡«³¡¤³¡³¡–³¡³¡ˆ³¡³¡z³¡s³¡l³¡e³¡^³¡W³¡P³¡I³¡B³¡;³¡4³¡-³¡&³¡³¡³¡³¡ ³¡³¡ü²¡õ²¡粡ಡÙ²¡Ò²¡˲¡IJ¡½²¡¶²¡¯²¡¨²¡¡²¡š²¡“²¡Œ²¡…²¡~²¡w²¡p²¡i²¡b²¡[²¡T²¡M²¡F²¡?²¡8²¡1²¡*²¡#²¡²¡²¡²¡²¡²¡ù±¡ò±¡뱡䱡ݱ¡Ö±¡ϱ¡ȱ¡Á±¡º±¡³±¡¬±¡¥±¡ž±¡—±¡±¡‰±¡‚±¡{±¡t±¡m±¡f±¡_±¡X±¡Q±¡J±¡C±¡<±¡5±¡.±¡'±¡ ±¡±¡±¡ ±¡±¡ý°¡ö°¡ï°¡è°¡á°¡Ú°¡Ó°¡̰¡Ű¡¾°¡·°¡°°¡©°¡¢°¡›°¡”°¡°¡†°¡°¡x°¡q°¡j°¡c°¡\°¡U°¡N°¡G°¡@°¡9°¡2°¡+°¡$°¡°¡°¡°¡°¡°¡ú¯¡ó¯¡쯡寡Þ¯¡ׯ¡Я¡ɯ¡¯¡»¯¡´¯¡­¯¡¦¯¡Ÿ¯¡˜¯¡‘¯¡Н¡ƒ¯¡|¯¡u¯¡n¯¡g¯¡`¯¡Y¯¡R¯¡K¯¡D¯¡=¯¡6¯¡/¯¡(¯¡!¯¡¯¡¯¡ ¯¡¯¡þ®¡÷®¡ð®¡鮡⮡Û®¡Ô®¡Í®¡Æ®¡¿®¡¸®¡±®¡ª®¡£®¡œ®¡•®¡Ž®¡‡®¡€®¡y®¡r®¡k®¡d®¡]®¡V®¡O®¡H®¡A®¡:®¡3®¡,®¡%®¡®¡®¡®¡ ®¡®¡û­¡ô­¡í­¡æ­¡ß­¡Ø­¡Ñ­¡Ê­¡í¡¼­¡µ­¡®­¡§­¡ ­¡™­¡’­¡‹­¡„­¡}­¡v­¡o­¡h­¡a­¡Z­¡S­¡L­¡E­¡>­¡7­¡0­¡)­¡"­¡­¡­¡ ­¡­¡ÿ¬¡ø¬¡ñ¬¡ꬡ㬡ܬ¡Õ¬¡ά¡Ǭ¡À¬¡¹¬¡²¬¡«¬¡¤¬¡¬¡–¬¡¬¡ˆ¬¡¬¡z¬¡s¬¡l¬¡e¬¡^¬¡W¬¡P¬¡I¬¡B¬¡;¬¡4¬¡-¬¡&¬¡¬¡¬¡¬¡ ¬¡¬¡ü«¡õ«¡î«¡ç«¡à«¡Ù«¡Ò«¡Ë«¡Ä«¡½«¡¶«¡¯«¡¨«¡¡«¡š«¡“«¡Œ«¡…«¡~«¡w«¡p«¡i«¡b«¡[«¡T«¡M«¡F«¡?«¡8«¡1«¡*«¡#«¡«¡«¡«¡«¡«¡ùª¡òª¡몡䪡ݪ¡Öª¡Ϫ¡Ȫ¡Áª¡ºª¡³ª¡¬ª¡¥ª¡žª¡—ª¡ª¡‰ª¡‚ª¡{ª¡tª¡mª¡fª¡_ª¡Xª¡Qª¡Jª¡Cª¡<ª¡5ª¡.ª¡'ª¡ ª¡ª¡ª¡ ª¡ª¡ý©¡ö©¡ï©¡è©¡á©¡Ú©¡Ó©¡Ì©¡Å©¡¾©¡·©¡°©¡©©¡¢©¡›©¡”©¡©¡†©¡©¡x©¡q©¡j©¡c©¡\©¡U©¡N©¡G©¡@©¡9©¡2©¡+©¡$©¡©¡©¡©¡©¡©¡ú¨¡ó¨¡쨡娡Þ¨¡ר¡Ш¡ɨ¡¨¡»¨¡´¨¡­¨¡¦¨¡Ÿ¨¡˜¨¡‘¨¡Ѝ¡ƒ¨¡|¨¡u¨¡n¨¡g¨¡`¨¡Y¨¡R¨¡K¨¡D¨¡=¨¡6¨¡/¨¡(¨¡!¨¡¨¡¨¡ ¨¡¨¡þ§¡÷§¡ð§¡é§¡â§¡Û§¡Ô§¡ͧ¡Ƨ¡¿§¡¸§¡±§¡ª§¡£§¡œ§¡•§¡ާ¡‡§¡€§¡y§¡r§¡k§¡d§¡]§¡V§¡O§¡H§¡A§¡:§¡3§¡,§¡%§¡§¡§¡§¡ §¡§¡û¦¡ô¦¡í¦¡榡ߦ¡ئ¡Ѧ¡ʦ¡æ¡¼¦¡µ¦¡®¦¡§¦¡ ¦¡™¦¡’¦¡‹¦¡„¦¡}¦¡v¦¡o¦¡h¦¡a¦¡Z¦¡S¦¡L¦¡E¦¡>¦¡7¦¡0¦¡)¦¡"¦¡¦¡¦¡ ¦¡¦¡ÿ¥¡ø¥¡ñ¥¡ꥡ㥡Ü¥¡Õ¥¡Î¥¡Ç¥¡À¥¡¹¥¡²¥¡«¥¡¤¥¡¥¡–¥¡¥¡ˆ¥¡¥¡z¥¡s¥¡l¥¡e¥¡^¥¡W¥¡P¥¡I¥¡B¥¡;¥¡4¥¡-¥¡&¥¡¥¡¥¡¥¡ ¥¡¥¡ü¤¡õ¤¡礡डÙ¤¡Ò¤¡ˤ¡Ĥ¡½¤¡¶¤¡¯¤¡¨¤¡¡¤¡š¤¡“¤¡Œ¤¡…¤¡~¤¡w¤¡p¤¡i¤¡b¤¡[¤¡T¤¡M¤¡F¤¡?¤¡8¤¡1¤¡*¤¡#¤¡¤¡¤¡¤¡¤¡¤¡ù£¡ò£¡룡䣡Ý£¡Ö£¡Ï£¡È£¡Á£¡º£¡³£¡¬£¡¥£¡ž£¡—£¡£¡‰£¡‚£¡{£¡t£¡m£¡f£¡_£¡X£¡Q£¡J£¡C£¡<£¡5£¡.£¡'£¡ £¡£¡£¡ £¡£¡ý¢¡ö¢¡袡ᢡÚ¢¡Ó¢¡Ì¢¡Å¢¡¾¢¡·¢¡°¢¡©¢¡¢¢¡›¢¡”¢¡¢¡†¢¡¢¡x¢¡q¢¡j¢¡c¢¡\¢¡U¢¡N¢¡G¢¡@¢¡9¢¡2¢¡+¢¡$¢¡¢¡¢¡¢¡¢¡¢¡ú¡¡ó¡¡ì¡¡å¡¡Þ¡¡ס¡С¡É¡¡¡¡»¡¡´¡¡­¡¡¦¡¡Ÿ¡¡˜¡¡‘¡¡Š¡¡ƒ¡¡|¡¡u¡¡n¡¡g¡¡`¡¡Y¡¡R¡¡K¡¡D¡¡=¡¡6¡¡/¡¡(¡¡!¡¡¡¡¡¡ ¡¡¡¡þ ¡÷ ¡ð ¡é ¡â ¡Û ¡Ô ¡Í ¡Æ ¡¿ ¡¸ ¡± ¡ª ¡£ ¡œ ¡• ¡Ž ¡‡ ¡€ ¡y ¡r ¡k ¡d ¡] ¡V ¡O ¡H ¡A ¡: ¡3 ¡, ¡% ¡ ¡ ¡ ¡  ¡ ¡ûŸ¡ôŸ¡ퟡ柡ߟ¡ØŸ¡ÑŸ¡ÊŸ¡ß¡¼Ÿ¡µŸ¡®Ÿ¡§Ÿ¡ Ÿ¡™Ÿ¡’Ÿ¡‹Ÿ¡„Ÿ¡}Ÿ¡vŸ¡oŸ¡hŸ¡aŸ¡ZŸ¡SŸ¡LŸ¡EŸ¡>Ÿ¡7Ÿ¡0Ÿ¡)Ÿ¡"Ÿ¡Ÿ¡Ÿ¡ Ÿ¡Ÿ¡ÿž¡øž¡ñž¡êž¡ãž¡Üž¡Õž¡Ξ¡Çž¡Àž¡¹ž¡²ž¡«ž¡¤ž¡ž¡–ž¡ž¡ˆž¡ž¡zž¡sž¡lž¡ež¡^ž¡Wž¡Pž¡Iž¡Bž¡;ž¡4ž¡-ž¡&ž¡ž¡ž¡ž¡ ž¡ž¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ùœ¡òœ¡뜡䜡Ýœ¡Öœ¡Ïœ¡Èœ¡Áœ¡ºœ¡³œ¡¬œ¡¥œ¡žœ¡—œ¡œ¡‰œ¡‚œ¡{œ¡tœ¡mœ¡fœ¡_œ¡Xœ¡Qœ¡Jœ¡Cœ¡<œ¡5œ¡.œ¡'œ¡ œ¡œ¡œ¡ œ¡œ¡ý›¡ö›¡蛡ᛡÚ›¡Ó›¡Ì›¡Å›¡¾›¡·›¡°›¡©›¡¢›¡››¡”›¡›¡†›¡›¡x›¡q›¡j›¡c›¡\›¡U›¡N›¡G›¡@›¡9›¡2›¡+›¡$›¡›¡›¡›¡›¡›¡úš¡óš¡ìš¡åš¡Þš¡ך¡К¡Éš¡š¡»š¡´š¡­š¡¦š¡Ÿš¡˜š¡‘š¡Šš¡ƒš¡|š¡uš¡nš¡gš¡`š¡Yš¡Rš¡Kš¡Dš¡=š¡6š¡/š¡(š¡!š¡š¡š¡ š¡š¡þ™¡÷™¡ð™¡陡♡Û™¡Ô™¡Í™¡Æ™¡¿™¡¸™¡±™¡ª™¡£™¡œ™¡•™¡Ž™¡‡™¡€™¡y™¡r™¡k™¡d™¡]™¡V™¡O™¡H™¡A™¡:™¡3™¡,™¡%™¡™¡™¡™¡ ™¡™¡û˜¡ô˜¡혡昡ߘ¡ؘ¡ј¡ʘ¡Ø¡¼˜¡µ˜¡®˜¡§˜¡ ˜¡™˜¡’˜¡‹˜¡„˜¡}˜¡v˜¡o˜¡h˜¡a˜¡Z˜¡S˜¡L˜¡E˜¡>˜¡7˜¡0˜¡)˜¡"˜¡˜¡˜¡ ˜¡˜¡ÿ—¡ø—¡ñ—¡ê—¡ã—¡Ü—¡Õ—¡Η¡Ç—¡À—¡¹—¡²—¡«—¡¤—¡—¡–—¡—¡ˆ—¡—¡z—¡s—¡l—¡e—¡^—¡W—¡P—¡I—¡B—¡;—¡4—¡-—¡&—¡—¡—¡—¡ —¡—¡ü–¡õ–¡î–¡ç–¡à–¡Ù–¡Ò–¡Ë–¡Ä–¡½–¡¶–¡¯–¡¨–¡¡–¡š–¡“–¡Œ–¡…–¡~–¡w–¡p–¡i–¡b–¡[–¡T–¡M–¡F–¡?–¡8–¡1–¡*–¡#–¡–¡–¡–¡–¡–¡ù•¡ò•¡ë•¡ä•¡Ý•¡Ö•¡Ï•¡È•¡Á•¡º•¡³•¡¬•¡¥•¡ž•¡—•¡•¡‰•¡‚•¡{•¡t•¡m•¡f•¡_•¡X•¡Q•¡J•¡C•¡<•¡5•¡.•¡'•¡ •¡•¡•¡ •¡•¡ý”¡ö”¡蔡ᔡÚ”¡Ó”¡Ì”¡Å”¡¾”¡·”¡°”¡©”¡¢”¡›”¡””¡”¡†”¡”¡x”¡q”¡j”¡c”¡\”¡U”¡N”¡G”¡@”¡9”¡2”¡+”¡$”¡”¡”¡”¡”¡”¡ú“¡ó“¡ì“¡å“¡Þ“¡ד¡Г¡É“¡“¡»“¡´“¡­“¡¦“¡Ÿ“¡˜“¡‘“¡Š“¡ƒ“¡|“¡u“¡n“¡g“¡`“¡Y“¡R“¡K“¡D“¡=“¡6“¡/“¡(“¡!“¡“¡“¡ “¡“¡þ’¡÷’¡ð’¡é’¡â’¡Û’¡Ô’¡Í’¡Æ’¡¿’¡¸’¡±’¡ª’¡£’¡œ’¡•’¡Ž’¡‡’¡€’¡y’¡r’¡k’¡d’¡]’¡V’¡O’¡H’¡A’¡:’¡3’¡,’¡%’¡’¡’¡’¡ ’¡’¡û‘¡ô‘¡í‘¡æ‘¡ß‘¡Ø‘¡Ñ‘¡Ê‘¡Ñ¡¼‘¡µ‘¡®‘¡§‘¡ ‘¡™‘¡’‘¡‹‘¡„‘¡}‘¡v‘¡o‘¡h‘¡a‘¡Z‘¡S‘¡L‘¡E‘¡>‘¡7‘¡0‘¡)‘¡"‘¡‘¡‘¡ ‘¡‘¡ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ùŽ¡òŽ¡뎡䎡ÝŽ¡ÖŽ¡ÏŽ¡ÈŽ¡ÁŽ¡ºŽ¡³Ž¡¬Ž¡¥Ž¡žŽ¡—ޡޡ‰Ž¡‚Ž¡{Ž¡tŽ¡mŽ¡fŽ¡_Ž¡XŽ¡QŽ¡JŽ¡CŽ¡<Ž¡5Ž¡.Ž¡'Ž¡ ޡޡޡ ޡޡý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡úŒ¡óŒ¡쌡匡ÞŒ¡׌¡ÐŒ¡ÉŒ¡ÂŒ¡»Œ¡´Œ¡­Œ¡¦Œ¡ŸŒ¡˜Œ¡‘Œ¡ŠŒ¡ƒŒ¡|Œ¡uŒ¡nŒ¡gŒ¡`Œ¡YŒ¡RŒ¡KŒ¡DŒ¡=Œ¡6Œ¡/Œ¡(Œ¡!Œ¡Œ¡Œ¡ Œ¡Œ¡þ‹¡÷‹¡ð‹¡é‹¡â‹¡Û‹¡Ô‹¡Í‹¡Æ‹¡¿‹¡¸‹¡±‹¡ª‹¡£‹¡œ‹¡•‹¡Ž‹¡‡‹¡€‹¡y‹¡r‹¡k‹¡d‹¡]‹¡V‹¡O‹¡H‹¡A‹¡:‹¡3‹¡,‹¡%‹¡‹¡‹¡‹¡ ‹¡‹¡ûŠ¡ôŠ¡튡抡ߊ¡ØŠ¡ÑŠ¡ÊŠ¡Ê¡¼Š¡µŠ¡®Š¡§Š¡ Š¡™Š¡’Š¡‹Š¡„Š¡}Š¡vŠ¡oŠ¡hŠ¡aŠ¡ZŠ¡SŠ¡LŠ¡EŠ¡>Š¡7Š¡0Š¡)Š¡"ССС ССÿ‰¡ø‰¡ñ‰¡ꉡ㉡܉¡Õ‰¡Ή¡lj¡À‰¡¹‰¡²‰¡«‰¡¤‰¡‰¡–‰¡‰¡ˆ‰¡‰¡z‰¡s‰¡l‰¡e‰¡^‰¡W‰¡P‰¡I‰¡B‰¡;‰¡4‰¡-‰¡&‰¡‰¡‰¡‰¡ ‰¡‰¡üˆ¡õˆ¡爡àˆ¡Ùˆ¡Òˆ¡ˈ¡Ĉ¡½ˆ¡¶ˆ¡¯ˆ¡¨ˆ¡¡ˆ¡šˆ¡“ˆ¡Œˆ¡…ˆ¡~ˆ¡wˆ¡pˆ¡iˆ¡bˆ¡[ˆ¡Tˆ¡Mˆ¡Fˆ¡?ˆ¡8ˆ¡1ˆ¡*ˆ¡#ˆ¡ˆ¡ˆ¡ˆ¡ˆ¡ˆ¡ù‡¡ò‡¡뇡䇡݇¡Ö‡¡χ¡ȇ¡Á‡¡º‡¡³‡¡¬‡¡¥‡¡ž‡¡—‡¡‡¡‰‡¡‚‡¡{‡¡t‡¡m‡¡f‡¡_‡¡X‡¡Q‡¡J‡¡C‡¡<‡¡5‡¡.‡¡'‡¡ ‡¡‡¡‡¡ ‡¡‡¡ý†¡ö†¡膡ᆡÚ†¡Ó†¡̆¡ņ¡¾†¡·†¡°†¡©†¡¢†¡›†¡”†¡†¡††¡†¡x†¡q†¡j†¡c†¡\†¡U†¡N†¡G†¡@†¡9†¡2†¡+†¡$†¡†¡†¡†¡†¡†¡ú…¡ó…¡ì…¡å…¡Þ…¡×…¡Ð…¡É…¡Â…¡»…¡´…¡­…¡¦…¡Ÿ…¡˜…¡‘…¡Š…¡ƒ…¡|…¡u…¡n…¡g…¡`…¡Y…¡R…¡K…¡D…¡=…¡6…¡/…¡(…¡!…¡…¡…¡ …¡…¡þ„¡÷„¡ð„¡é„¡â„¡Û„¡Ô„¡Í„¡Æ„¡¿„¡¸„¡±„¡ª„¡£„¡œ„¡•„¡Ž„¡‡„¡€„¡y„¡r„¡k„¡d„¡]„¡V„¡O„¡H„¡A„¡:„¡3„¡,„¡%„¡„¡„¡„¡ „¡„¡ûƒ¡ôƒ¡탡惡߃¡؃¡у¡ʃ¡á¼ƒ¡µƒ¡®ƒ¡§ƒ¡ ƒ¡™ƒ¡’ƒ¡‹ƒ¡„ƒ¡}ƒ¡vƒ¡oƒ¡hƒ¡aƒ¡Zƒ¡Sƒ¡Lƒ¡Eƒ¡>ƒ¡7ƒ¡0ƒ¡)ƒ¡"ƒ¡ƒ¡ƒ¡ ƒ¡ƒ¡ÿ‚¡ø‚¡ñ‚¡ê‚¡ã‚¡Ü‚¡Õ‚¡΂¡Ç‚¡À‚¡¹‚¡²‚¡«‚¡¤‚¡‚¡–‚¡‚¡ˆ‚¡‚¡z‚¡s‚¡l‚¡e‚¡^‚¡W‚¡P‚¡I‚¡B‚¡;‚¡4‚¡-‚¡&‚¡‚¡‚¡‚¡ ‚¡‚¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù€¡ò€¡뀡䀡Ý€¡Ö€¡Ï€¡È€¡Á€¡º€¡³€¡¬€¡¥€¡ž€¡—€¡€¡‰€¡‚€¡{€¡t€¡m€¡f€¡_€¡X€¡Q€¡J€¡C€¡<€¡5€¡.€¡'€¡ €¡€¡€¡ €¡€¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú~¡ó~¡ì~¡å~¡Þ~¡×~¡Ð~¡É~¡Â~¡»~¡´~¡­~¡¦~¡Ÿ~¡˜~¡‘~¡Š~¡ƒ~¡|~¡u~¡n~¡g~¡`~¡Y~¡R~¡K~¡D~¡=~¡6~¡/~¡(~¡!~¡~¡~¡ ~¡~¡þ}¡÷}¡ð}¡é}¡â}¡Û}¡Ô}¡Í}¡Æ}¡¿}¡¸}¡±}¡ª}¡£}¡œ}¡•}¡Ž}¡‡}¡€}¡y}¡r}¡k}¡d}¡]}¡V}¡O}¡H}¡A}¡:}¡3}¡,}¡%}¡}¡}¡}¡ }¡}¡û|¡ô|¡í|¡æ|¡ß|¡Ø|¡Ñ|¡Ê|¡Ã|¡¼|¡µ|¡®|¡§|¡ |¡™|¡’|¡‹|¡„|¡}|¡v|¡o|¡h|¡a|¡Z|¡S|¡L|¡E|¡>|¡7|¡0|¡)|¡"|¡|¡|¡ |¡|¡ÿ{¡ø{¡ñ{¡ê{¡ã{¡Ü{¡Õ{¡Î{¡Ç{¡À{¡¹{¡²{¡«{¡¤{¡{¡–{¡{¡ˆ{¡{¡z{¡s{¡l{¡e{¡^{¡W{¡P{¡I{¡B{¡;{¡4{¡-{¡&{¡{¡{¡{¡ {¡{¡üz¡õz¡îz¡çz¡àz¡Ùz¡Òz¡Ëz¡Äz¡½z¡¶z¡¯z¡¨z¡¡z¡šz¡“z¡Œz¡…z¡~z¡wz¡pz¡iz¡bz¡[z¡Tz¡Mz¡Fz¡?z¡8z¡1z¡*z¡#z¡z¡z¡z¡z¡z¡ùy¡òy¡ëy¡äy¡Ýy¡Öy¡Ïy¡Èy¡Áy¡ºy¡³y¡¬y¡¥y¡žy¡—y¡y¡‰y¡‚y¡{y¡ty¡my¡fy¡_y¡Xy¡Qy¡Jy¡Cy¡u¡7u¡0u¡)u¡"u¡u¡u¡ u¡u¡ÿt¡øt¡ñt¡êt¡ãt¡Üt¡Õt¡Ît¡Çt¡Àt¡¹t¡²t¡«t¡¤t¡t¡–t¡t¡ˆt¡t¡zt¡st¡lt¡et¡^t¡Wt¡Pt¡It¡Bt¡;t¡4t¡-t¡&t¡t¡t¡t¡ t¡t¡üs¡õs¡îs¡çs¡às¡Ùs¡Òs¡Ës¡Äs¡½s¡¶s¡¯s¡¨s¡¡s¡šs¡“s¡Œs¡…s¡~s¡ws¡ps¡is¡bs¡[s¡Ts¡Ms¡Fs¡?s¡8s¡1s¡*s¡#s¡s¡s¡s¡s¡s¡ùr¡òr¡ër¡är¡Ýr¡Ör¡Ïr¡Èr¡Ár¡ºr¡³r¡¬r¡¥r¡žr¡—r¡r¡‰r¡‚r¡{r¡tr¡mr¡fr¡_r¡Xr¡Qr¡Jr¡Cr¡n¡7n¡0n¡)n¡"n¡n¡n¡ n¡n¡ÿm¡øm¡ñm¡êm¡ãm¡Üm¡Õm¡Îm¡Çm¡Àm¡¹m¡²m¡«m¡¤m¡m¡–m¡m¡ˆm¡m¡zm¡sm¡lm¡em¡^m¡Wm¡Pm¡Im¡Bm¡;m¡4m¡-m¡&m¡m¡m¡m¡ m¡m¡ül¡õl¡îl¡çl¡àl¡Ùl¡Òl¡Ël¡Äl¡½l¡¶l¡¯l¡¨l¡¡l¡šl¡“l¡Œl¡…l¡~l¡wl¡pl¡il¡bl¡[l¡Tl¡Ml¡Fl¡?l¡8l¡1l¡*l¡#l¡l¡l¡l¡l¡l¡ùk¡òk¡ëk¡äk¡Ýk¡Ök¡Ïk¡Èk¡Ák¡ºk¡³k¡¬k¡¥k¡žk¡—k¡k¡‰k¡‚k¡{k¡tk¡mk¡fk¡_k¡Xk¡Qk¡Jk¡Ck¡g¡7g¡0g¡)g¡"g¡g¡g¡ g¡g¡ÿf¡øf¡ñf¡êf¡ãf¡Üf¡Õf¡Îf¡Çf¡Àf¡¹f¡²f¡«f¡¤f¡f¡–f¡f¡ˆf¡f¡zf¡sf¡lf¡ef¡^f¡Wf¡Pf¡If¡Bf¡;f¡4f¡-f¡&f¡f¡f¡f¡ f¡f¡üe¡õe¡îe¡çe¡àe¡Ùe¡Òe¡Ëe¡Äe¡½e¡¶e¡¯e¡¨e¡¡e¡še¡“e¡Œe¡…e¡~e¡we¡pe¡ie¡be¡[e¡Te¡Me¡Fe¡?e¡8e¡1e¡*e¡#e¡e¡e¡e¡e¡e¡ùd¡òd¡ëd¡äd¡Ýd¡Öd¡Ïd¡Èd¡Ád¡ºd¡³d¡¬d¡¥d¡žd¡—d¡d¡‰d¡‚d¡{d¡td¡md¡fd¡_d¡Xd¡Qd¡Jd¡Cd¡`¡7`¡0`¡)`¡"`¡`¡`¡ `¡`¡ÿ_¡ø_¡ñ_¡ê_¡ã_¡Ü_¡Õ_¡Î_¡Ç_¡À_¡¹_¡²_¡«_¡¤_¡_¡–_¡_¡ˆ_¡_¡z_¡s_¡l_¡e_¡^_¡W_¡P_¡I_¡B_¡;_¡4_¡-_¡&_¡_¡_¡_¡ _¡_¡ü^¡õ^¡î^¡ç^¡à^¡Ù^¡Ò^¡Ë^¡Ä^¡½^¡¶^¡¯^¡¨^¡¡^¡š^¡“^¡Œ^¡…^¡~^¡w^¡p^¡i^¡b^¡[^¡T^¡M^¡F^¡?^¡8^¡1^¡*^¡#^¡^¡^¡^¡^¡^¡ù]¡ò]¡ë]¡ä]¡Ý]¡Ö]¡Ï]¡È]¡Á]¡º]¡³]¡¬]¡¥]¡ž]¡—]¡]¡‰]¡‚]¡{]¡t]¡m]¡f]¡_]¡X]¡Q]¡J]¡C]¡<]¡5]¡.]¡']¡ ]¡]¡]¡ ]¡]¡ý\¡ö\¡ï\¡è\¡á\¡Ú\¡Ó\¡Ì\¡Å\¡¾\¡·\¡°\¡©\¡¢\¡›\¡”\¡\¡†\¡\¡x\¡q\¡j\¡c\¡\\¡U\¡N\¡G\¡@\¡9\¡2\¡+\¡$\¡\¡\¡\¡\¡\¡ú[¡ó[¡ì[¡å[¡Þ[¡×[¡Ð[¡É[¡Â[¡»[¡´[¡­[¡¦[¡Ÿ[¡˜[¡‘[¡Š[¡ƒ[¡|[¡u[¡n[¡g[¡`[¡Y[¡R[¡K[¡D[¡=[¡6[¡/[¡([¡![¡[¡[¡ [¡[¡þZ¡÷Z¡ðZ¡éZ¡âZ¡ÛZ¡ÔZ¡ÍZ¡ÆZ¡¿Z¡¸Z¡±Z¡ªZ¡£Z¡œZ¡•Z¡ŽZ¡‡Z¡€Z¡yZ¡rZ¡kZ¡dZ¡]Z¡VZ¡OZ¡HZ¡AZ¡:Z¡3Z¡,Z¡%Z¡Z¡Z¡Z¡ Z¡Z¡ûY¡ôY¡íY¡æY¡ßY¡ØY¡ÑY¡ÊY¡ÃY¡¼Y¡µY¡®Y¡§Y¡ Y¡™Y¡’Y¡‹Y¡„Y¡}Y¡vY¡oY¡hY¡aY¡ZY¡SY¡LY¡EY¡>Y¡7Y¡0Y¡)Y¡"Y¡Y¡Y¡ Y¡Y¡ÿX¡øX¡ñX¡êX¡ãX¡ÜX¡ÕX¡ÎX¡ÇX¡ÀX¡¹X¡²X¡«X¡¤X¡X¡–X¡X¡ˆX¡X¡zX¡sX¡lX¡eX¡^X¡WX¡PX¡IX¡BX¡;X¡4X¡-X¡&X¡X¡X¡X¡ X¡X¡üW¡õW¡îW¡çW¡àW¡ÙW¡ÒW¡ËW¡ÄW¡½W¡¶W¡¯W¡¨W¡¡W¡šW¡“W¡ŒW¡…W¡~W¡wW¡pW¡iW¡bW¡[W¡TW¡MW¡FW¡?W¡8W¡1W¡*W¡#W¡W¡W¡W¡W¡W¡ùV¡òV¡ëV¡äV¡ÝV¡ÖV¡ÏV¡ÈV¡ÁV¡ºV¡³V¡¬V¡¥V¡žV¡—V¡V¡‰V¡‚V¡{V¡tV¡mV¡fV¡_V¡XV¡QV¡JV¡CV¡R¡7R¡0R¡)R¡"R¡R¡R¡ R¡R¡ÿQ¡øQ¡ñQ¡êQ¡ãQ¡ÜQ¡ÕQ¡ÎQ¡ÇQ¡ÀQ¡¹Q¡²Q¡«Q¡¤Q¡Q¡–Q¡Q¡ˆQ¡Q¡zQ¡sQ¡lQ¡eQ¡^Q¡WQ¡PQ¡IQ¡BQ¡;Q¡4Q¡-Q¡&Q¡Q¡Q¡Q¡ Q¡Q¡üP¡õP¡îP¡çP¡àP¡ÙP¡ÒP¡ËP¡ÄP¡½P¡¶P¡¯P¡¨P¡¡P¡šP¡“P¡ŒP¡…P¡~P¡wP¡pP¡iP¡bP¡[P¡TP¡MP¡FP¡?P¡8P¡1P¡*P¡#P¡P¡P¡P¡P¡P¡ùO¡òO¡ëO¡äO¡ÝO¡ÖO¡ÏO¡ÈO¡ÁO¡ºO¡³O¡¬O¡¥O¡žO¡—O¡O¡‰O¡‚O¡{O¡tO¡mO¡fO¡_O¡XO¡QO¡JO¡CO¡K¡7K¡0K¡)K¡"K¡K¡K¡ K¡K¡ÿJ¡øJ¡ñJ¡êJ¡ãJ¡ÜJ¡ÕJ¡ÎJ¡ÇJ¡ÀJ¡¹J¡²J¡«J¡¤J¡J¡–J¡J¡ˆJ¡J¡zJ¡sJ¡lJ¡eJ¡^J¡WJ¡PJ¡IJ¡BJ¡;J¡4J¡-J¡&J¡J¡J¡J¡ J¡J¡üI¡õI¡îI¡çI¡àI¡ÙI¡ÒI¡ËI¡ÄI¡½I¡¶I¡¯I¡¨I¡¡I¡šI¡“I¡ŒI¡…I¡~I¡wI¡pI¡iI¡bI¡[I¡TI¡MI¡FI¡?I¡8I¡1I¡*I¡#I¡I¡I¡I¡I¡I¡ùH¡òH¡ëH¡äH¡ÝH¡ÖH¡ÏH¡ÈH¡ÁH¡ºH¡³H¡¬H¡¥H¡žH¡—H¡H¡‰H¡‚H¡{H¡tH¡mH¡fH¡_H¡XH¡QH¡JH¡CH¡D¡7D¡0D¡)D¡"D¡D¡D¡ D¡D¡ÿC¡øC¡ñC¡êC¡ãC¡ÜC¡ÕC¡ÎC¡ÇC¡ÀC¡¹C¡²C¡«C¡¤C¡C¡–C¡C¡ˆC¡C¡zC¡sC¡lC¡eC¡^C¡WC¡PC¡IC¡BC¡;C¡4C¡-C¡&C¡C¡C¡C¡ C¡C¡üB¡õB¡îB¡çB¡àB¡ÙB¡ÒB¡ËB¡ÄB¡½B¡¶B¡¯B¡¨B¡¡B¡šB¡“B¡ŒB¡…B¡~B¡wB¡pB¡iB¡bB¡[B¡TB¡MB¡FB¡?B¡8B¡1B¡*B¡#B¡B¡B¡B¡B¡B¡ùA¡òA¡ëA¡äA¡ÝA¡ÖA¡ÏA¡ÈA¡ÁA¡ºA¡³A¡¬A¡¥A¡žA¡—A¡A¡‰A¡‚A¡{A¡tA¡mA¡fA¡_A¡XA¡QA¡JA¡CA¡¡÷>¡ð>¡é>¡â>¡Û>¡Ô>¡Í>¡Æ>¡¿>¡¸>¡±>¡ª>¡£>¡œ>¡•>¡Ž>¡‡>¡€>¡y>¡r>¡k>¡d>¡]>¡V>¡O>¡H>¡A>¡:>¡3>¡,>¡%>¡>¡>¡>¡ >¡>¡û=¡ô=¡í=¡æ=¡ß=¡Ø=¡Ñ=¡Ê=¡Ã=¡¼=¡µ=¡®=¡§=¡ =¡™=¡’=¡‹=¡„=¡}=¡v=¡o=¡h=¡a=¡Z=¡S=¡L=¡E=¡>=¡7=¡0=¡)=¡"=¡=¡=¡ =¡=¡ÿ<¡ø<¡ñ<¡ê<¡ã<¡Ü<¡Õ<¡Î<¡Ç<¡À<¡¹<¡²<¡«<¡¤<¡<¡–<¡<¡ˆ<¡<¡z<¡s<¡l<¡e<¡^<¡W<¡P<¡I<¡B<¡;<¡4<¡-<¡&<¡<¡<¡<¡ <¡<¡ü;¡õ;¡î;¡ç;¡à;¡Ù;¡Ò;¡Ë;¡Ä;¡½;¡¶;¡¯;¡¨;¡¡;¡š;¡“;¡Œ;¡…;¡~;¡w;¡p;¡i;¡b;¡[;¡T;¡M;¡F;¡?;¡8;¡1;¡*;¡#;¡;¡;¡;¡;¡;¡ù:¡ò:¡ë:¡ä:¡Ý:¡Ö:¡Ï:¡È:¡Á:¡º:¡³:¡¬:¡¥:¡ž:¡—:¡:¡‰:¡‚:¡{:¡t:¡m:¡f:¡_:¡X:¡Q:¡J:¡C:¡<:¡5:¡.:¡':¡ :¡:¡:¡ :¡:¡ý9¡ö9¡ï9¡è9¡á9¡Ú9¡Ó9¡Ì9¡Å9¡¾9¡·9¡°9¡©9¡¢9¡›9¡”9¡9¡†9¡9¡x9¡q9¡j9¡c9¡\9¡U9¡N9¡G9¡@9¡99¡29¡+9¡$9¡9¡9¡9¡9¡9¡ú8¡ó8¡ì8¡å8¡Þ8¡×8¡Ð8¡É8¡Â8¡»8¡´8¡­8¡¦8¡Ÿ8¡˜8¡‘8¡Š8¡ƒ8¡|8¡u8¡n8¡g8¡`8¡Y8¡R8¡K8¡D8¡=8¡68¡/8¡(8¡!8¡8¡8¡ 8¡8¡þ7¡÷7¡ð7¡é7¡â7¡Û7¡Ô7¡Í7¡Æ7¡¿7¡¸7¡±7¡ª7¡£7¡œ7¡•7¡Ž7¡‡7¡€7¡y7¡r7¡k7¡d7¡]7¡V7¡O7¡H7¡A7¡:7¡37¡,7¡%7¡7¡7¡7¡ 7¡7¡û6¡ô6¡í6¡æ6¡ß6¡Ø6¡Ñ6¡Ê6¡Ã6¡¼6¡µ6¡®6¡§6¡ 6¡™6¡’6¡‹6¡„6¡}6¡v6¡o6¡h6¡a6¡Z6¡S6¡L6¡E6¡>6¡76¡06¡)6¡"6¡6¡6¡ 6¡6¡ÿ5¡ø5¡ñ5¡ê5¡ã5¡Ü5¡Õ5¡Î5¡Ç5¡À5¡¹5¡²5¡«5¡¤5¡5¡–5¡5¡ˆ5¡5¡z5¡s5¡l5¡e5¡^5¡W5¡P5¡I5¡B5¡;5¡45¡-5¡&5¡5¡5¡5¡ 5¡5¡ü4¡õ4¡î4¡ç4¡à4¡Ù4¡Ò4¡Ë4¡Ä4¡½4¡¶4¡¯4¡¨4¡¡4¡š4¡“4¡Œ4¡…4¡~4¡w4¡p4¡i4¡b4¡[4¡T4¡M4¡F4¡?4¡84¡14¡*4¡#4¡4¡4¡4¡4¡4¡ù3¡ò3¡ë3¡ä3¡Ý3¡Ö3¡Ï3¡È3¡Á3¡º3¡³3¡¬3¡¥3¡ž3¡—3¡3¡‰3¡‚3¡{3¡t3¡m3¡f3¡_3¡X3¡Q3¡J3¡C3¡<3¡53¡.3¡'3¡ 3¡3¡3¡ 3¡3¡ý2¡ö2¡ï2¡è2¡á2¡Ú2¡Ó2¡Ì2¡Å2¡¾2¡·2¡°2¡©2¡¢2¡›2¡”2¡2¡†2¡2¡x2¡q2¡j2¡c2¡\2¡U2¡N2¡G2¡@2¡92¡22¡+2¡$2¡2¡2¡2¡2¡2¡ú1¡ó1¡ì1¡å1¡Þ1¡×1¡Ð1¡É1¡Â1¡»1¡´1¡­1¡¦1¡Ÿ1¡˜1¡‘1¡Š1¡ƒ1¡|1¡u1¡n1¡g1¡`1¡Y1¡R1¡K1¡D1¡=1¡61¡/1¡(1¡!1¡1¡1¡ 1¡1¡þ0¡÷0¡ð0¡é0¡â0¡Û0¡Ô0¡Í0¡Æ0¡¿0¡¸0¡±0¡ª0¡£0¡œ0¡•0¡Ž0¡‡0¡€0¡y0¡r0¡k0¡d0¡]0¡V0¡O0¡H0¡A0¡:0¡30¡,0¡%0¡0¡0¡0¡ 0¡0¡û/¡ô/¡í/¡æ/¡ß/¡Ø/¡Ñ/¡Ê/¡Ã/¡¼/¡µ/¡®/¡§/¡ /¡™/¡’/¡‹/¡„/¡}/¡v/¡o/¡h/¡a/¡Z/¡S/¡L/¡E/¡>/¡7/¡0/¡)/¡"/¡/¡/¡ /¡/¡ÿ.¡ø.¡ñ.¡ê.¡ã.¡Ü.¡Õ.¡Î.¡Ç.¡À.¡¹.¡².¡«.¡¤.¡.¡–.¡.¡ˆ.¡.¡z.¡s.¡l.¡e.¡^.¡W.¡P.¡I.¡B.¡;.¡4.¡-.¡&.¡.¡.¡.¡ .¡.¡ü-¡õ-¡î-¡ç-¡à-¡Ù-¡Ò-¡Ë-¡Ä-¡½-¡¶-¡¯-¡¨-¡¡-¡š-¡“-¡Œ-¡…-¡~-¡w-¡p-¡i-¡b-¡[-¡T-¡M-¡F-¡?-¡8-¡1-¡*-¡#-¡-¡-¡-¡-¡-¡ù,¡ò,¡ë,¡ä,¡Ý,¡Ö,¡Ï,¡È,¡Á,¡º,¡³,¡¬,¡¥,¡ž,¡—,¡,¡‰,¡‚,¡{,¡t,¡m,¡f,¡_,¡X,¡Q,¡J,¡C,¡<,¡5,¡.,¡',¡ ,¡,¡,¡ ,¡,¡ý+¡ö+¡ï+¡è+¡á+¡Ú+¡Ó+¡Ì+¡Å+¡¾+¡·+¡°+¡©+¡¢+¡›+¡”+¡+¡†+¡+¡x+¡q+¡j+¡c+¡\+¡U+¡N+¡G+¡@+¡9+¡2+¡++¡$+¡+¡+¡+¡+¡+¡ú*¡ó*¡ì*¡å*¡Þ*¡×*¡Ð*¡É*¡Â*¡»*¡´*¡­*¡¦*¡Ÿ*¡˜*¡‘*¡Š*¡ƒ*¡|*¡u*¡n*¡g*¡`*¡Y*¡R*¡K*¡D*¡=*¡6*¡/*¡(*¡!*¡*¡*¡ *¡*¡þ)¡÷)¡ð)¡é)¡â)¡Û)¡Ô)¡Í)¡Æ)¡¿)¡¸)¡±)¡ª)¡£)¡œ)¡•)¡Ž)¡‡)¡€)¡y)¡r)¡k)¡d)¡])¡V)¡O)¡H)¡A)¡:)¡3)¡,)¡%)¡)¡)¡)¡ )¡)¡û(¡ô(¡í(¡æ(¡ß(¡Ø(¡Ñ(¡Ê(¡Ã(¡¼(¡µ(¡®(¡§(¡ (¡™(¡’(¡‹(¡„(¡}(¡v(¡o(¡h(¡a(¡Z(¡S(¡L(¡E(¡>(¡7(¡0(¡)(¡"(¡(¡(¡ (¡(¡ÿ'¡ø'¡ñ'¡ê'¡ã'¡Ü'¡Õ'¡Î'¡Ç'¡À'¡¹'¡²'¡«'¡¤'¡'¡–'¡'¡ˆ'¡'¡z'¡s'¡l'¡e'¡^'¡W'¡P'¡I'¡B'¡;'¡4'¡-'¡&'¡'¡'¡'¡ '¡'¡ü&¡õ&¡î&¡ç&¡à&¡Ù&¡Ò&¡Ë&¡Ä&¡½&¡¶&¡¯&¡¨&¡¡&¡š&¡“&¡Œ&¡…&¡~&¡w&¡p&¡i&¡b&¡[&¡T&¡M&¡F&¡?&¡8&¡1&¡*&¡#&¡&¡&¡&¡&¡&¡ù%¡ò%¡ë%¡ä%¡Ý%¡Ö%¡Ï%¡È%¡Á%¡º%¡³%¡¬%¡¥%¡ž%¡—%¡%¡‰%¡‚%¡{%¡t%¡m%¡f%¡_%¡X%¡Q%¡J%¡C%¡<%¡5%¡.%¡'%¡ %¡%¡%¡ %¡%¡ý$¡ö$¡ï$¡è$¡á$¡Ú$¡Ó$¡Ì$¡Å$¡¾$¡·$¡°$¡©$¡¢$¡›$¡”$¡$¡†$¡$¡x$¡q$¡j$¡c$¡\$¡U$¡N$¡G$¡@$¡9$¡2$¡+$¡$$¡$¡$¡$¡$¡$¡ú#¡ó#¡ì#¡å#¡Þ#¡×#¡Ð#¡É#¡Â#¡»#¡´#¡­#¡¦#¡Ÿ#¡˜#¡‘#¡Š#¡ƒ#¡|#¡u#¡n#¡g#¡`#¡Y#¡R#¡K#¡D#¡=#¡6#¡/#¡(#¡!#¡#¡#¡ #¡#¡þ"¡÷"¡ð"¡é"¡â"¡Û"¡Ô"¡Í"¡Æ"¡¿"¡¸"¡±"¡ª"¡£"¡œ"¡•"¡Ž"¡‡"¡€"¡y"¡r"¡k"¡d"¡]"¡V"¡O"¡H"¡A"¡:"¡3"¡,"¡%"¡"¡"¡"¡ "¡"¡û!¡ô!¡í!¡æ!¡ß!¡Ø!¡Ñ!¡Ê!¡Ã!¡¼!¡µ!¡®!¡§!¡ !¡™!¡’!¡‹!¡„!¡}!¡v!¡o!¡h!¡a!¡Z!¡S!¡L!¡E!¡>!¡7!¡0!¡)!¡"!¡!¡!¡ !¡!¡ÿ ¡ø ¡ñ ¡ê ¡ã ¡Ü ¡Õ ¡Î ¡Ç ¡À ¡¹ ¡² ¡« ¡¤ ¡ ¡– ¡ ¡ˆ ¡ ¡z ¡s ¡l ¡e ¡^ ¡W ¡P ¡I ¡B ¡; ¡4 ¡- ¡& ¡ ¡ ¡ ¡ ¡ ¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú¡ó¡ì¡å¡Þ¡×¡Ð¡É¡Â¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡Ã¡¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡Î¡Ç¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú¡ó¡ì¡å¡Þ¡×¡Ð¡É¡Â¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡Ã¡¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡Î¡Ç¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú¡ó¡ì¡å¡Þ¡×¡Ð¡É¡Â¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ¡÷ ¡ð ¡é ¡â ¡Û ¡Ô ¡Í ¡Æ ¡¿ ¡¸ ¡± ¡ª ¡£ ¡œ ¡• ¡Ž ¡‡ ¡€ ¡y ¡r ¡k ¡d ¡] ¡V ¡O ¡H ¡A ¡: ¡3 ¡, ¡% ¡ ¡ ¡ ¡ ¡ ¡û ¡ô ¡í ¡æ ¡ß ¡Ø ¡Ñ ¡Ê ¡à ¡¼ ¡µ ¡® ¡§ ¡  ¡™ ¡’ ¡‹ ¡„ ¡} ¡v ¡o ¡h ¡a ¡Z ¡S ¡L ¡E ¡> ¡7 ¡0 ¡) ¡" ¡ ¡ ¡ ¡ ¡ÿ ¡ø ¡ñ ¡ê ¡ã ¡Ü ¡Õ ¡Î ¡Ç ¡À ¡¹ ¡² ¡« ¡¤ ¡ ¡– ¡ ¡ˆ ¡ ¡z ¡s ¡l ¡e ¡^ ¡W ¡P ¡I ¡B ¡; ¡4 ¡- ¡& ¡ ¡ ¡ ¡ ¡ ¡ü ¡õ ¡î ¡ç ¡à ¡Ù ¡Ò ¡Ë ¡Ä ¡½ ¡¶ ¡¯ ¡¨ ¡¡ ¡š ¡“ ¡Œ ¡… ¡~ ¡w ¡p ¡i ¡b ¡[ ¡T ¡M ¡F ¡? ¡8 ¡1 ¡* ¡# ¡ ¡ ¡ ¡ ¡ ¡ù ¡ò ¡ë ¡ä ¡Ý ¡Ö ¡Ï ¡È ¡Á ¡º ¡³ ¡¬ ¡¥ ¡ž ¡— ¡ ¡‰ ¡‚ ¡{ ¡t ¡m ¡f ¡_ ¡X ¡Q ¡J ¡C ¡< ¡5 ¡. ¡' ¡ ¡ ¡ ¡ ¡ ¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú¡ó¡ì¡å¡Þ¡×¡Ð¡É¡Â¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡Ã¡¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡Î¡Ç¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þÿ ÷ÿ ðÿ éÿ âÿ Ûÿ Ôÿ Íÿ Æÿ ¿ÿ ¸ÿ ±ÿ ªÿ £ÿ œÿ •ÿ Žÿ ‡ÿ €ÿ yÿ rÿ kÿ dÿ ]ÿ Vÿ Oÿ Hÿ Aÿ :ÿ 3ÿ ,ÿ %ÿ ÿ ÿ ÿ  ÿ ÿ ûþ ôþ íþ æþ ßþ Øþ Ñþ Êþ Ãþ ¼þ µþ ®þ §þ  þ ™þ ’þ ‹þ „þ }þ vþ oþ hþ aþ Zþ Sþ Lþ Eþ >þ 7þ 0þ )þ "þ þ þ  þ þ ÿý øý ñý êý ãý Üý Õý Îý Çý Àý ¹ý ²ý «ý ¤ý ý –ý ý ˆý ý zý sý lý eý ^ý Wý Pý Iý Bý ;ý 4ý -ý &ý ý ý ý  ý ý üü õü îü çü àü Ùü Òü Ëü Äü ½ü ¶ü ¯ü ¨ü ¡ü šü “ü Œü …ü ~ü wü pü iü bü [ü Tü Mü Fü ?ü 8ü 1ü *ü #ü ü ü ü ü ü ùû òû ëû äû Ýû Öû Ïû Èû Áû ºû ³û ¬û ¥û žû —û û ‰û ‚û {û tû mû fû _û Xû Qû Jû Cû <û 5û .û 'û  û û û  û û ýú öú ïú èú áú Úú Óú Ìú Åú ¾ú ·ú °ú ©ú ¢ú ›ú ”ú ú †ú ú xú qú jú cú \ú Uú Nú Gú @ú 9ú 2ú +ú $ú ú ú ú ú ú úù óù ìù åù Þù ×ù Ðù Éù Âù »ù ´ù ­ù ¦ù Ÿù ˜ù ‘ù Šù ƒù |ù uù nù gù `ù Yù Rù Kù Dù =ù 6ù /ù (ù !ù ù ù  ù ù þø ÷ø ðø éø âø Ûø Ôø Íø Æø ¿ø ¸ø ±ø ªø £ø œø •ø Žø ‡ø €ø yø rø kø dø ]ø Vø Oø Hø Aø :ø 3ø ,ø %ø ø ø ø  ø ø û÷ ô÷ í÷ æ÷ ß÷ Ø÷ Ñ÷ Ê÷ Ã÷ ¼÷ µ÷ ®÷ §÷  ÷ ™÷ ’÷ ‹÷ „÷ }÷ v÷ o÷ h÷ a÷ Z÷ S÷ L÷ E÷ >÷ 7÷ 0÷ )÷ "÷ ÷ ÷  ÷ ÷ ÿö øö ñö êö ãö Üö Õö Îö Çö Àö ¹ö ²ö «ö ¤ö ö –ö ö ˆö ö zö sö lö eö ^ö Wö Pö Iö Bö ;ö 4ö -ö &ö ö ö ö  ö ö üõ õõ îõ çõ àõ Ùõ Òõ Ëõ Äõ ½õ ¶õ ¯õ ¨õ ¡õ šõ “õ Œõ …õ ~õ wõ põ iõ bõ [õ Tõ Mõ Fõ ?õ 8õ 1õ *õ #õ õ õ õ õ õ ùô òô ëô äô Ýô Öô Ïô Èô Áô ºô ³ô ¬ô ¥ô žô —ô ô ‰ô ‚ô {ô tô mô fô _ô Xô Qô Jô Cô <ô 5ô .ô 'ô  ô ô ô  ô ô ýó öó ïó èó áó Úó Óó Ìó Åó ¾ó ·ó °ó ©ó ¢ó ›ó ”ó ó †ó ó xó qó jó có \ó Uó Nó Gó @ó 9ó 2ó +ó $ó ó ó ó ó ó úò óò ìò åò Þò ×ò Ðò Éò Âò »ò ´ò ­ò ¦ò Ÿò ˜ò ‘ò Šò ƒò |ò uò nò gò `ò Yò Rò Kò Dò =ò 6ò /ò (ò !ò ò ò  ò ò þñ ÷ñ ðñ éñ âñ Ûñ Ôñ Íñ Æñ ¿ñ ¸ñ ±ñ ªñ £ñ œñ •ñ Žñ ‡ñ €ñ yñ rñ kñ dñ ]ñ Vñ Oñ Hñ Añ :ñ 3ñ ,ñ %ñ ñ ñ ñ  ñ ñ ûð ôð íð æð ßð Øð Ñð Êð Ãð ¼ð µð ®ð §ð  ð ™ð ’ð ‹ð „ð }ð vð oð hð að Zð Sð Lð Eð >ð 7ð 0ð )ð "ð ð ð  ð ð ÿï øï ñï êï ãï Üï Õï Îï Çï Àï ï –ï ï ˆï ï zï sï lï eï ^ï Wï Pï Iï Bï ;ï 4ï -ï &ï ï ï ï  ï ï üî õî îî çî àî Ùî Òî Ëî Äî ~î wî pî iî bî [î Tî Mî Fî ?î 8î 1î *î #î î î î î î ùí òí ëí äí Ýí Öí Ïí Èí Áí ºí ³í ¬í ¥í ží —í í ‰í ‚í {í tí mí fí _í Xí Qí Jí Cí <í 5í .í 'í  í í í  í í ýì öì ïì èì áì Úì Óì Ìì Å젾젷젰젩젢젛젔ì ì †ì ì xì qì jì cì \ì Uì Nì Gì @ì 9ì 2ì +ì $ì ì ì ì ì ì úë óë ìë åë Þë ×ë Ðë Éë Â렻렴렭렦렟렘렑렊렃ë |ë uë në gë `ë Yë Rë Kë Dë =ë 6ë /ë (ë !ë ë ë  ë ë þê ÷ê ðê éê âê Ûê Ôê Íê Æê ¿ê ¸ê ±ê ªê £ê œê •ê Žê ‡ê €ê yê rê kê dê ]ê Vê Oê Hê Aê :ê 3ê ,ê %ê ê ê ê  ê ê ûé ôé íé æé ßé Øé Ñé Êé Ã頼頵頮頧頠頙頒頋頄é }é vé oé hé aé Zé Sé Lé Eé >é 7é 0é )é "é é é  é é ÿè øè ñè êè ãè Üè Õè Îè Çè À蠹蠲蠫蠤è è –è è ˆè è zè sè lè eè ^è Wè Pè Iè Bè ;è 4è -è &è è è è  è è üç õç îç çç àç Ùç Òç Ëç Ä砽砶砯砨砡砚砓砌砅ç ~ç wç pç iç bç [ç Tç Mç Fç ?ç 8ç 1ç *ç #ç ç ç ç ç ç ùæ òæ ëæ äæ Ýæ Öæ Ïæ Èæ Áæ ºæ ³æ ¬æ ¥æ žæ —æ æ ‰æ ‚æ {æ tæ mæ fæ _æ Xæ Qæ Jæ Cæ <æ 5æ .æ 'æ  æ æ æ  æ æ ýå öå ïå èå áå Úå Óå Ìå Å堾堷堰堩堢堛堔å å †å å xå qå jå cå \å Uå Nå Gå @å 9å 2å +å $å å å å å å úä óä ìä åä Þä ×ä Ðä Éä Â䠻䠴䠭䠦䠟䠘䠑䠊䠃ä |ä uä nä gä `ä Yä Rä Kä Dä =ä 6ä /ä (ä !ä ä ä  ä ä þã ÷ã ðã éã âã Ûã Ôã Íã Æã ¿ã ¸ã ±ã ªã £ã œã •ã Žã ‡ã €ã yã rã kã dã ]ã Vã Oã Hã Aã :ã 3ã ,ã %ã ã ã ã  ã ã ûâ ôâ íâ æâ ßâ Øâ Ñâ Êâ Ã⠼⠵⠮⠧⠠⠙⠒⠋⠄â }â vâ oâ hâ aâ Zâ Sâ Lâ Eâ >â 7â 0â )â "â â â  â â ÿá øá ñá êá ãá Üá Õá Îá Çá Àᠹᠲᠫᠤá á –á á ˆá á zá sá lá eá ^á Wá Pá Iá Bá ;á 4á -á &á á á á  á á üà õà îà çà àà Ùà Òà Ëà Ä࠽࠶࠯ࠨࠡࠚࠓࠌࠅà ~à wà pà ià bà [à Tà Mà Fà ?à 8à 1à *à #à à à à à à ùß òß ëß äß Ýß Öß Ïß Èß Áß ºß ³ß ¬ß ¥ß žß —ß ß ‰ß ‚ß {ß tß mß fß _ß Xß Qß Jß Cß <ß 5ß .ß 'ß  ß ß ß  ß ß ýÞ öÞ ïÞ èÞ áÞ ÚÞ ÓÞ ÌÞ ÅÞ ¾Þ ·Þ °Þ ©Þ ¢Þ ›Þ ”Þ Þ †Þ Þ xÞ qÞ jÞ cÞ \Þ UÞ NÞ GÞ @Þ 9Þ 2Þ +Þ $Þ Þ Þ Þ Þ Þ úÝ óÝ ìÝ åÝ ÞÝ ×Ý ÐÝ ÉÝ ÂÝ »Ý ´Ý ­Ý ¦Ý ŸÝ ˜Ý ‘Ý ŠÝ ƒÝ |Ý uÝ nÝ gÝ `Ý YÝ RÝ KÝ DÝ =Ý 6Ý /Ý (Ý !Ý Ý Ý  Ý Ý þÜ ÷Ü ðÜ éÜ âÜ ÛÜ ÔÜ ÍÜ ÆÜ ¿Ü ¸Ü ±Ü ªÜ £Ü œÜ •Ü ŽÜ ‡Ü €Ü yÜ rÜ kÜ dÜ ]Ü VÜ OÜ HÜ AÜ :Ü 3Ü ,Ü %Ü Ü Ü Ü  Ü Ü ûÛ ôÛ íÛ æÛ ßÛ ØÛ ÑÛ ÊÛ ÃÛ ¼Û µÛ ®Û §Û  Û ™Û ’Û ‹Û „Û }Û vÛ oÛ hÛ aÛ ZÛ SÛ LÛ EÛ >Û 7Û 0Û )Û "Û Û Û  Û Û ÿÚ øÚ ñÚ êÚ ãÚ ÜÚ ÕÚ ÎÚ ÇÚ ÀÚ ¹Ú ²Ú «Ú ¤Ú Ú –Ú Ú ˆÚ Ú zÚ sÚ lÚ eÚ ^Ú WÚ PÚ IÚ BÚ ;Ú 4Ú -Ú &Ú Ú Ú Ú  Ú Ú üÙ õÙ îÙ çÙ àÙ ÙÙ ÒÙ ËÙ ÄÙ ½Ù ¶Ù ¯Ù ¨Ù ¡Ù šÙ “Ù ŒÙ …Ù ~Ù wÙ pÙ iÙ bÙ [Ù TÙ MÙ FÙ ?Ù 8Ù 1Ù *Ù #٠٠٠٠٠٠ùØ òØ ëØ 䨠ÝØ ÖØ ÏØ ÈØ ÁØ ºØ ³Ø ¬Ø ¥Ø žØ —ؠؠ‰Ø ‚Ø {Ø tØ mØ fØ _Ø XØ QØ JØ CØ <Ø 5Ø .Ø 'Ø  ؠؠؠ ؠؠý× ö× ï× è× á× Ú× Ó× Ì× Å× ¾× ·× °× ©× ¢× ›× ”× × †× × x× q× j× c× \× U× N× G× @× 9× 2× +× $× × × × × × úÖ óÖ ìÖ åÖ ÞÖ ×Ö ÐÖ ÉÖ ÂÖ »Ö ´Ö ­Ö ¦Ö ŸÖ ˜Ö ‘Ö ŠÖ ƒÖ |Ö uÖ nÖ gÖ `Ö YÖ RÖ KÖ DÖ =Ö 6Ö /Ö (Ö !Ö Ö Ö  Ö Ö þÕ ÷Õ ðÕ éÕ âÕ ÛÕ ÔÕ ÍÕ ÆÕ ¿Õ ¸Õ ±Õ ªÕ £Õ œÕ •Õ ŽÕ ‡Õ €Õ yÕ rÕ kÕ dÕ ]Õ VÕ OÕ HÕ AÕ :Õ 3Õ ,Õ %Õ Õ Õ Õ  Õ Õ ûÔ ôÔ íÔ æÔ ßÔ ØÔ ÑÔ ÊÔ ÃÔ ¼Ô µÔ ®Ô §Ô  Ô ™Ô ’Ô ‹Ô „Ô }Ô vÔ oÔ hÔ aÔ ZÔ SÔ LÔ EÔ >Ô 7Ô 0Ô )Ô "Ô Ô Ô  Ô Ô ÿÓ øÓ ñÓ êÓ ãÓ ÜÓ ÕÓ ÎÓ ÇÓ ÀÓ ¹Ó ²Ó «Ó ¤Ó Ó –Ó Ó ˆÓ Ó zÓ sÓ lÓ eÓ ^Ó WÓ PÓ IÓ BÓ ;Ó 4Ó -Ó &Ó Ó Ó Ó  Ó Ó üÒ õÒ îÒ çÒ àÒ ÙÒ ÒÒ ËÒ ÄÒ ½Ò ¶Ò ¯Ò ¨Ò ¡Ò šÒ “Ò ŒÒ …Ò ~Ò wÒ pÒ iÒ bÒ [Ò TÒ MÒ FÒ ?Ò 8Ò 1Ò *Ò #Ò Ò Ò Ò Ò Ò ùÑ òÑ ëÑ äÑ ÝÑ ÖÑ ÏÑ ÈÑ ÁÑ ºÑ ³Ñ ¬Ñ ¥Ñ žÑ —Ñ Ñ ‰Ñ ‚Ñ {Ñ tÑ mÑ fÑ _Ñ XÑ QÑ JÑ CÑ <Ñ 5Ñ .Ñ 'Ñ  Ñ Ñ Ñ  Ñ Ñ ýРöРïРèРáРÚРÓРÌРÅР¾Ð ·Ð °Ð ©Ð ¢Ð ›Ð ”РР†Ð РxРqРjРcР\РUРNРGР@Р9Р2Р+Р$РРРРРРúÏ óÏ ìÏ åÏ ÞÏ ×Ï ÐÏ ÉÏ ÂÏ »Ï ´Ï ­Ï ¦Ï ŸÏ ˜Ï ‘Ï ŠÏ ƒÏ |Ï uÏ nÏ gÏ `Ï YÏ RÏ KÏ DÏ =Ï 6Ï /Ï (Ï !Ï Ï Ï  Ï Ï þΠ÷ΠðΠéΠâΠÛΠÔΠÍΠÆÎ ¿Î ¸Î ±Î ªÎ £Î œÎ •ΠŽÎ ‡Î €Î yΠrΠkΠdΠ]ΠVΠOΠHΠAΠ:Π3Π,Π%ΠΠΠΠ ΠΠûÍ ôÍ íÍ æÍ ßÍ ØÍ ÑÍ ÊÍ ÃÍ ¼Í µÍ ®Í §Í  Í ™Í ’Í ‹Í „Í }Í vÍ oÍ hÍ aÍ ZÍ SÍ LÍ EÍ >Í 7Í 0Í )Í "Í Í Í  Í Í ÿÌ øÌ ñÌ êÌ ãÌ ÜÌ ÕÌ ÎÌ ÇÌ ÀÌ ¹Ì ²Ì «Ì ¤Ì Ì –Ì Ì ˆÌ Ì zÌ sÌ lÌ eÌ ^Ì WÌ PÌ IÌ BÌ ;Ì 4Ì -Ì &Ì Ì Ì Ì  Ì Ì üË õË îË çË àË ÙË ÒË ËË ÄË ½Ë ¶Ë ¯Ë ¨Ë ¡Ë šË “Ë ŒË …Ë ~Ë wË pË iË bË [Ë TË MË FË ?Ë 8Ë 1Ë *Ë #Ë Ë Ë Ë Ë Ë ùÊ òÊ ëÊ äÊ ÝÊ ÖÊ ÏÊ ÈÊ ÁÊ ºÊ ³Ê ¬Ê ¥Ê žÊ —Ê Ê ‰Ê ‚Ê {Ê tÊ mÊ fÊ _Ê XÊ QÊ JÊ CÊ <Ê 5Ê .Ê 'Ê  Ê Ê Ê  Ê Ê ýÉ öÉ ïÉ èÉ áÉ ÚÉ ÓÉ ÌÉ ÅÉ ¾É ·É °É ©É ¢É ›É ”É É †É É xÉ qÉ jÉ cÉ \É UÉ NÉ GÉ @É 9É 2É +É $É É É É É É úÈ óÈ ìÈ åÈ ÞÈ ×È ÐÈ ÉÈ ÂÈ »È ´È ­È ¦È ŸÈ ˜È ‘È ŠÈ ƒÈ |È uÈ nÈ gÈ `È YÈ RÈ KÈ DÈ =È 6È /È (È !È È È  È È þÇ ÷Ç ðÇ éÇ âÇ ÛÇ ÔÇ ÍÇ ÆÇ ¿Ç ¸Ç ±Ç ªÇ £Ç œÇ •Ç ŽÇ ‡Ç €Ç yÇ rÇ kÇ dÇ ]Ç VÇ OÇ HÇ AÇ :Ç 3Ç ,Ç %Ç Ç Ç Ç  Ç Ç ûÆ ôÆ íÆ æÆ ߯ ØÆ ÑÆ ÊÆ ÃÆ ¼Æ µÆ ®Æ §Æ  Æ ™Æ ’Æ ‹Æ „Æ }Æ vÆ oÆ hÆ aÆ ZÆ SÆ LÆ EÆ >Æ 7Æ 0Æ )Æ "Æ Æ Æ  Æ Æ ÿÅ øÅ ñÅ êÅ ãÅ ÜÅ ÕÅ ÎÅ ÇÅ ÀÅ ¹Å ²Å «Å ¤Å Å –Å Å ˆÅ Å zÅ sÅ lÅ eÅ ^Å WÅ PÅ IÅ BÅ ;Å 4Å -Å &Å Å Å Å  Å Å üÄ õÄ îÄ çÄ àÄ ÙÄ ÒÄ ËÄ ÄÄ ½Ä ¶Ä ¯Ä ¨Ä ¡Ä šÄ “Ä ŒÄ …Ä ~Ä wÄ pÄ iÄ bÄ [Ä TÄ MÄ FÄ ?Ä 8Ä 1Ä *Ä #Ä Ä Ä Ä Ä Ä ùàòàëàäàÝàÖàÏàÈàÁàºÃ ³Ã ¬Ã ¥Ã žÃ —àà‰Ã ‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààý ö ï è á Ú Ó Ì Å ¾Â ·Â °Â ©Â ¢Â ›Â ”  †Â  x q j c \ U N G @ 9 2 + $      úÁ óÁ ìÁ åÁ ÞÁ ×Á ÐÁ ÉÁ ÂÁ »Á ´Á ­Á ¦Á ŸÁ ˜Á ‘Á ŠÁ ƒÁ |Á uÁ nÁ gÁ `Á YÁ RÁ KÁ DÁ =Á 6Á /Á (Á !Á Á Á  Á Á þÀ ÷À ðÀ éÀ âÀ ÛÀ ÔÀ ÍÀ ÆÀ ¿À ¸À ±À ªÀ £À œÀ •À ŽÀ ‡À €À yÀ rÀ kÀ dÀ ]À VÀ OÀ HÀ AÀ :À 3À ,À %À À À À  À À û¿ ô¿ í¿ æ¿ ß¿ Ø¿ Ñ¿ Ê¿ ÿ ¼¿ µ¿ ®¿ §¿  ¿ ™¿ ’¿ ‹¿ „¿ }¿ v¿ o¿ h¿ a¿ Z¿ S¿ L¿ E¿ >¿ 7¿ 0¿ )¿ "¿ ¿ ¿  ¿ ¿ ÿ¾ ø¾ ñ¾ ê¾ ã¾ ܾ Õ¾ ξ Ǿ À¾ ¹¾ ²¾ «¾ ¤¾ ¾ –¾ ¾ ˆ¾ ¾ z¾ s¾ l¾ e¾ ^¾ W¾ P¾ I¾ B¾ ;¾ 4¾ -¾ &¾ ¾ ¾ ¾  ¾ ¾ ü½ õ½ î½ ç½ འÙ½ Ò½ ˽ Ľ ½½ ¶½ ¯½ ¨½ ¡½ š½ “½ Œ½ …½ ~½ w½ p½ i½ b½ [½ T½ M½ F½ ?½ 8½ 1½ *½ #½ ½ ½ ½ ½ ½ ù¼ ò¼ ë¼ ä¼ ݼ Ö¼ ϼ ȼ Á¼ º¼ ³¼ ¬¼ ¥¼ ž¼ —¼ ¼ ‰¼ ‚¼ {¼ t¼ m¼ f¼ _¼ X¼ Q¼ J¼ C¼ <¼ 5¼ .¼ '¼  ¼ ¼ ¼  ¼ ¼ ý» ö» ï» è» á» Ú» Ó» Ì» Å» ¾» ·» °» ©» ¢» ›» ”» » †» » x» q» j» c» \» U» N» G» @» 9» 2» +» $» » » » » » úº óº 캠庠Þº ׺ к ɺ º »º ´º ­º ¦º Ÿº ˜º ‘º Šº ƒº |º uº nº gº `º Yº Rº Kº Dº =º 6º /º (º !º º º  º º þ¹ ÷¹ ð¹ é¹ â¹ Û¹ Ô¹ ͹ ƹ ¿¹ ¸¹ ±¹ ª¹ £¹ œ¹ •¹ ޹ ‡¹ €¹ y¹ r¹ k¹ d¹ ]¹ V¹ O¹ H¹ A¹ :¹ 3¹ ,¹ %¹ ¹ ¹ ¹  ¹ ¹ û¸ ô¸ í¸ 渠߸ ظ Ѹ ʸ ø ¼¸ µ¸ ®¸ §¸  ¸ ™¸ ’¸ ‹¸ „¸ }¸ v¸ o¸ h¸ a¸ Z¸ S¸ L¸ E¸ >¸ 7¸ 0¸ )¸ "¸ ¸ ¸  ¸ ¸ ÿ· ø· ñ· ê· ã· Ü· Õ· η Ç· À· ¹· ²· «· ¤· · –· · ˆ· · z· s· l· e· ^· W· P· I· B· ;· 4· -· &· · · ·  · · ü¶ õ¶ î¶ ç¶ à¶ Ù¶ Ò¶ ˶ Ķ ½¶ ¶¶ ¯¶ ¨¶ ¡¶ š¶ “¶ Œ¶ …¶ ~¶ w¶ p¶ i¶ b¶ [¶ T¶ M¶ F¶ ?¶ 8¶ 1¶ *¶ #¶ ¶ ¶ ¶ ¶ ¶ ùµ òµ ëµ äµ ݵ Öµ ϵ ȵ Áµ ºµ ³µ ¬µ ¥µ žµ —µ µ ‰µ ‚µ {µ tµ mµ fµ _µ Xµ Qµ Jµ Cµ <µ 5µ .µ 'µ  µ µ µ  µ µ ý´ ö´ ï´ è´ á´ Ú´ Ó´ Ì´ Å´ ¾´ ·´ °´ ©´ ¢´ ›´ ”´ ´ †´ ´ x´ q´ j´ c´ \´ U´ N´ G´ @´ 9´ 2´ +´ $´ ´ ´ ´ ´ ´ ú³ ó³ ì³ å³ Þ³ ׳ г ɳ ³ »³ ´³ ­³ ¦³ Ÿ³ ˜³ ‘³ г ƒ³ |³ u³ n³ g³ `³ Y³ R³ K³ D³ =³ 6³ /³ (³ !³ ³ ³  ³ ³ þ² ÷² ð² é² â² Û² Ô² Ͳ Ʋ ¿² ¸² ±² ª² £² œ² •² ޲ ‡² €² y² r² k² d² ]² V² O² H² A² :² 3² ,² %² ² ² ²  ² ² û± ô± í± æ± ß± ر ѱ ʱ ñ ¼± µ± ®± §±  ± ™± ’± ‹± „± }± v± o± h± a± Z± S± L± E± >± 7± 0± )± "± ± ±  ± ± ÿ° ø° ñ° ê° ã° ܰ Õ° ΰ ǰ À° ¹° ²° «° ¤° ° –° ° ˆ° ° z° s° l° e° ^° W° P° I° B° ;° 4° -° &° ° ° °  ° ° ü¯ õ¯ 篠௠Ù¯ Ò¯ ˯ į ½¯ ¶¯ ¯¯ ¨¯ ¡¯ š¯ “¯ Œ¯ …¯ ~¯ w¯ p¯ i¯ b¯ [¯ T¯ M¯ F¯ ?¯ 8¯ 1¯ *¯ #¯ ¯ ¯ ¯ ¯ ¯ ù® ò® ë® ä® Ý® Ö® Ï® È® Á® º® ³® ¬® ¥® ž® —® ® ‰® ‚® {® t® m® f® _® X® Q® J® C® <® 5® .® '®  ® ® ®  ® ® ý­ ö­ ï­ è­ á­ Ú­ Ó­ Ì­ Å­ ¾­ ·­ °­ ©­ ¢­ ›­ ”­ ­ †­ ­ x­ q­ j­ c­ \­ U­ N­ G­ @­ 9­ 2­ +­ $­ ­ ­ ­ ­ ­ ú¬ ó¬ 쬠嬠Þ¬ ׬ Ь ɬ ¬ »¬ ´¬ ­¬ ¦¬ Ÿ¬ ˜¬ ‘¬ Ь ƒ¬ |¬ u¬ n¬ g¬ `¬ Y¬ R¬ K¬ D¬ =¬ 6¬ /¬ (¬ !¬ ¬ ¬  ¬ ¬ þ« ÷« ð« é« â« Û« Ô« Í« Æ« ¿« ¸« ±« ª« £« œ« •« Ž« ‡« €« y« r« k« d« ]« V« O« H« A« :« 3« ,« %« « « «  « « ûª ôª íª 檠ߪ ت Ѫ ʪ ê ¼ª µª ®ª §ª  ª ™ª ’ª ‹ª „ª }ª vª oª hª aª Zª Sª Lª Eª >ª 7ª 0ª )ª "ª ª ª  ª ª ÿ© ø© ñ© ê© ã© Ü© Õ© Ω Ç© À© ¹© ²© «© ¤© © –© © ˆ© © z© s© l© e© ^© W© P© I© B© ;© 4© -© &© © © ©  © © ü¨ õ¨ 稠ਠÙ¨ Ò¨ ˨ Ĩ ½¨ ¶¨ ¯¨ ¨¨ ¡¨ š¨ “¨ Œ¨ …¨ ~¨ w¨ p¨ i¨ b¨ [¨ T¨ M¨ F¨ ?¨ 8¨ 1¨ *¨ #¨ ¨ ¨ ¨ ¨ ¨ ù§ ò§ ë§ ä§ ݧ Ö§ ϧ ȧ Á§ º§ ³§ ¬§ ¥§ ž§ —§ § ‰§ ‚§ {§ t§ m§ f§ _§ X§ Q§ J§ C§ <§ 5§ .§ '§  § § §  § § ý¦ ö¦ 裂覠ᦠÚ¦ Ó¦ ̦ Ŧ ¾¦ ·¦ °¦ ©¦ ¢¦ ›¦ ”¦ ¦ †¦ ¦ x¦ q¦ j¦ c¦ \¦ U¦ N¦ G¦ @¦ 9¦ 2¦ +¦ $¦ ¦ ¦ ¦ ¦ ¦ ú¥ ó¥ 쥠奠Þ¥ ×¥ Ð¥ É¥ Â¥ »¥ ´¥ ­¥ ¦¥ Ÿ¥ ˜¥ ‘¥ Š¥ ƒ¥ |¥ u¥ n¥ g¥ `¥ Y¥ R¥ K¥ D¥ =¥ 6¥ /¥ (¥ !¥ ¥ ¥  ¥ ¥ þ¤ ÷¤ ð¤ 餠⤠Û¤ Ô¤ ͤ Ƥ ¿¤ ¸¤ ±¤ ª¤ £¤ œ¤ •¤ ޤ ‡¤ €¤ y¤ r¤ k¤ d¤ ]¤ V¤ O¤ H¤ A¤ :¤ 3¤ ,¤ %¤ ¤ ¤ ¤  ¤ ¤ û£ ô£ í£ 棠ߣ Ø£ Ñ£ Ê£ ã ¼£ µ£ ®£ §£  £ ™£ ’£ ‹£ „£ }£ v£ o£ h£ a£ Z£ S£ L£ E£ >£ 7£ 0£ )£ "£ £ £  £ £ ÿ¢ ø¢ ñ¢ ꢠ㢠Ü¢ Õ¢ ΢ Ç¢ À¢ ¹¢ ²¢ «¢ ¤¢ ¢ –¢ ¢ ˆ¢ ¢ z¢ s¢ l¢ e¢ ^¢ W¢ P¢ I¢ B¢ ;¢ 4¢ -¢ &¢ ¢ ¢ ¢  ¢ ¢ ü¡ õ¡ î¡ ç¡ à¡ Ù¡ Ò¡ Ë¡ Ä¡ ½¡ ¶¡ ¯¡ ¨¡ ¡¡ š¡ “¡ Œ¡ …¡ ~¡ w¡ p¡ i¡ b¡ [¡ T¡ M¡ F¡ ?¡ 8¡ 1¡ *¡ #¡ ¡ ¡ ¡ ¡ ¡ ù  ò  ë  ä  Ý  Ö  Ï  È  Á  º  ³  ¬  ¥  ž  —    ‰  ‚  {  t  m  f  _  X  Q  J  C  <  5  .  '              ýŸ öŸ 蟠០ÚŸ ÓŸ ÌŸ ÅŸ ¾Ÿ ·Ÿ °Ÿ ©Ÿ ¢Ÿ ›Ÿ ”Ÿ Ÿ †Ÿ Ÿ xŸ qŸ jŸ cŸ \Ÿ UŸ NŸ GŸ @Ÿ 9Ÿ 2Ÿ +Ÿ $Ÿ Ÿ Ÿ Ÿ Ÿ Ÿ úž óž ìž åž Þž מ О Éž ž »ž ´ž ­ž ¦ž Ÿž ˜ž ‘ž Šž ƒž |ž už nž gž `ž Yž Rž Kž Dž =ž 6ž /ž (ž !ž ž ž  ž ž þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûœ ôœ 휠朠ßœ Øœ Ñœ Êœ Ü ¼œ µœ ®œ §œ  œ ™œ ’œ ‹œ „œ }œ vœ oœ hœ aœ Zœ Sœ Lœ Eœ >œ 7œ 0œ )œ "œ œ œ  œ œ ÿ› ø› ñ› ê› ã› Ü› Õ› Λ Ç› À› ¹› ²› «› ¤› › –› › ˆ› › z› s› l› e› ^› W› P› I› B› ;› 4› -› &› › › ›  › › üš õš îš çš àš Ùš Òš Ëš Äš ½š ¶š ¯š ¨š ¡š šš “š Œš …š ~š wš pš iš bš [š Tš Mš Fš ?š 8š 1š *š #š š š š š š ù™ ò™ ë™ ä™ Ý™ Ö™ Ï™ È™ Á™ º™ ³™ ¬™ ¥™ ž™ —™ ™ ‰™ ‚™ {™ t™ m™ f™ _™ X™ Q™ J™ C™ <™ 5™ .™ '™  ™ ™ ™  ™ ™ ý˜ ö˜ 蘠ᘠÚ˜ Ó˜ ̘ Ř ¾˜ ·˜ °˜ ©˜ ¢˜ ›˜ ”˜ ˜ †˜ ˜ x˜ q˜ j˜ c˜ \˜ U˜ N˜ G˜ @˜ 9˜ 2˜ +˜ $˜ ˜ ˜ ˜ ˜ ˜ ú— ó— ì— å— Þ— ×— З É— — »— ´— ­— ¦— Ÿ— ˜— ‘— Š— ƒ— |— u— n— g— `— Y— R— K— D— =— 6— /— (— !— — —  — — þ– ÷– ð– é– â– Û– Ô– Í– Æ– ¿– ¸– ±– ª– £– œ– •– Ž– ‡– €– y– r– k– d– ]– V– O– H– A– :– 3– ,– %– – – –  – – û• ô• í• æ• ß• Ø• Ñ• Ê• Õ ¼• µ• ®• §•  • ™• ’• ‹• „• }• v• o• h• a• Z• S• L• E• >• 7• 0• )• "• • •  • • ÿ” ø” ñ” ê” ã” Ü” Õ” Δ Ç” À” ¹” ²” «” ¤” ” –” ” ˆ” ” z” s” l” e” ^” W” P” I” B” ;” 4” -” &” ” ” ”  ” ” ü“ õ“ î“ ç“ à“ Ù“ Ò“ Ë“ Ä“ ½“ ¶“ ¯“ ¨“ ¡“ š“ ““ Œ“ …“ ~“ w“ p“ i“ b“ [“ T“ M“ F“ ?“ 8“ 1“ *“ #“ “ “ “ “ “ ù’ ò’ ë’ ä’ Ý’ Ö’ Ï’ È’ Á’ º’ ³’ ¬’ ¥’ ž’ —’ ’ ‰’ ‚’ {’ t’ m’ f’ _’ X’ Q’ J’ C’ <’ 5’ .’ '’  ’ ’ ’  ’ ’ ý‘ ö‘ ï‘ è‘ á‘ Ú‘ Ó‘ Ì‘ Å‘ ¾‘ ·‘ °‘ ©‘ ¢‘ ›‘ ”‘ ‘ †‘ ‘ x‘ q‘ j‘ c‘ \‘ U‘ N‘ G‘ @‘ 9‘ 2‘ +‘ $‘ ‘ ‘ ‘ ‘ ‘ ú ó ì å Þ × РÉ  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŽ ôŽ 펠掠ߎ ØŽ ÑŽ ÊŽ ÃŽ ¼Ž µŽ ®Ž §Ž  Ž ™Ž ’Ž ‹Ž „Ž }Ž vŽ oŽ hŽ aŽ ZŽ SŽ LŽ EŽ >Ž 7Ž 0Ž )Ž "Ž Ž Ž  Ž Ž ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŒ õŒ 猠àŒ ÙŒ ÒŒ ËŒ ÄŒ ½Œ ¶Œ ¯Œ ¨Œ ¡Œ šŒ “Œ ŒŒ …Œ ~Œ wŒ pŒ iŒ bŒ [Œ TŒ MŒ FŒ ?Œ 8Œ 1Œ *Œ #Œ Œ Œ Œ Œ Œ ù‹ ò‹ ë‹ ä‹ Ý‹ Ö‹ Ï‹ È‹ Á‹ º‹ ³‹ ¬‹ ¥‹ ž‹ —‹ ‹ ‰‹ ‚‹ {‹ t‹ m‹ f‹ _‹ X‹ Q‹ J‹ C‹ <‹ 5‹ .‹ '‹  ‹ ‹ ‹  ‹ ‹ ýŠ öŠ 芠አÚŠ ÓŠ ÌŠ ÅŠ ¾Š ·Š °Š ©Š ¢Š ›Š ”Š Š †Š Š xŠ qŠ jŠ cŠ \Š UŠ NŠ GŠ @Š 9Š 2Š +Š $Š Š Š Š Š Š ú‰ ó‰ 쉠剠Þ‰ ׉ Љ ɉ ‰ »‰ ´‰ ­‰ ¦‰ Ÿ‰ ˜‰ ‘‰ Љ ƒ‰ |‰ u‰ n‰ g‰ `‰ Y‰ R‰ K‰ D‰ =‰ 6‰ /‰ (‰ !‰ ‰ ‰  ‰ ‰ þˆ ÷ˆ ðˆ 鈠∠Ûˆ Ôˆ ͈ ƈ ¿ˆ ¸ˆ ±ˆ ªˆ £ˆ œˆ •ˆ Žˆ ‡ˆ €ˆ yˆ rˆ kˆ dˆ ]ˆ Vˆ Oˆ Hˆ Aˆ :ˆ 3ˆ ,ˆ %ˆ ˆ ˆ ˆ  ˆ ˆ û‡ ô‡ 퇠懠߇ ؇ ч ʇ Ç ¼‡ µ‡ ®‡ §‡  ‡ ™‡ ’‡ ‹‡ „‡ }‡ v‡ o‡ h‡ a‡ Z‡ S‡ L‡ E‡ >‡ 7‡ 0‡ )‡ "‡ ‡ ‡  ‡ ‡ ÿ† ø† ñ† ꆠㆠ܆ Õ† Ά dž À† ¹† ²† «† ¤† † –† † ˆ† † z† s† l† e† ^† W† P† I† B† ;† 4† -† &† † † †  † † ü… õ… î… ç… à… Ù… Ò… Ë… Ä… ½… ¶… ¯… ¨… ¡… š… “… Œ… …… ~… w… p… i… b… [… T… M… F… ?… 8… 1… *… #… … … … … … ù„ ò„ ë„ ä„ Ý„ Ö„ Ï„ È„ Á„ º„ ³„ ¬„ ¥„ ž„ —„ „ ‰„ ‚„ {„ t„ m„ f„ _„ X„ Q„ J„ C„ <„ 5„ .„ '„  „ „ „  „ „ ýƒ öƒ 胠რÚƒ Óƒ ̃ Ń ¾ƒ ·ƒ °ƒ ©ƒ ¢ƒ ›ƒ ”ƒ ƒ †ƒ ƒ xƒ qƒ jƒ cƒ \ƒ Uƒ Nƒ Gƒ @ƒ 9ƒ 2ƒ +ƒ $ƒ ƒ ƒ ƒ ƒ ƒ ú‚ ó‚ ì‚ å‚ Þ‚ ׂ Ђ É‚ ‚ »‚ ´‚ ­‚ ¦‚ Ÿ‚ ˜‚ ‘‚ Š‚ ƒ‚ |‚ u‚ n‚ g‚ `‚ Y‚ R‚ K‚ D‚ =‚ 6‚ /‚ (‚ !‚ ‚ ‚  ‚ ‚ þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û€ ô€ 퀠怠߀ Ø€ Ñ€ Ê€ À ¼€ µ€ ®€ §€  € ™€ ’€ ‹€ „€ }€ v€ o€ h€ a€ Z€ S€ L€ E€ >€ 7€ 0€ )€ "€ € €  € € ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü~ õ~ î~ ç~ à~ Ù~ Ò~ Ë~ Ä~ ½~ ¶~ ¯~ ¨~ ¡~ š~ “~ Œ~ …~ ~~ w~ p~ i~ b~ [~ T~ M~ F~ ?~ 8~ 1~ *~ #~ ~ ~ ~ ~ ~ ù} ò} ë} ä} Ý} Ö} Ï} È} Á} º} ³} ¬} ¥} ž} —} } ‰} ‚} {} t} m} f} _} X} Q} J} C} <} 5} .} '}  } } }  } } ý| ö| ï| è| á| Ú| Ó| Ì| Å| ¾| ·| °| ©| ¢| ›| ”| | †| | x| q| j| c| \| U| N| G| @| 9| 2| +| $| | | | | | ú{ ó{ ì{ å{ Þ{ ×{ Ð{ É{ Â{ »{ ´{ ­{ ¦{ Ÿ{ ˜{ ‘{ Š{ ƒ{ |{ u{ n{ g{ `{ Y{ R{ K{ D{ ={ 6{ /{ ({ !{ { {  { { þz ÷z ðz éz âz Ûz Ôz Íz Æz ¿z ¸z ±z ªz £z œz •z Žz ‡z €z yz rz kz dz ]z Vz Oz Hz Az :z 3z ,z %z z z z  z z ûy ôy íy æy ßy Øy Ñy Êy Ãy ¼y µy ®y §y  y ™y ’y ‹y „y }y vy oy hy ay Zy Sy Ly Ey >y 7y 0y )y "y y y  y y ÿx øx ñx êx ãx Üx Õx Îx Çx Àx ¹x ²x «x ¤x x –x x ˆx x zx sx lx ex ^x Wx Px Ix Bx ;x 4x -x &x x x x  x x üw õw îw çw àw Ùw Òw Ëw Äw ½w ¶w ¯w ¨w ¡w šw “w Œw …w ~w ww pw iw bw [w Tw Mw Fw ?w 8w 1w *w #w w w w w w ùv òv ëv äv Ýv Öv Ïv Èv Áv ºv ³v ¬v ¥v žv —v v ‰v ‚v {v tv mv fv _v Xv Qv Jv Cv r 7r 0r )r "r r r  r r ÿq øq ñq êq ãq Üq Õq Îq Çq Àq ¹q ²q «q ¤q q –q q ˆq q zq sq lq eq ^q Wq Pq Iq Bq ;q 4q -q &q q q q  q q üp õp îp çp àp Ùp Òp Ëp Äp ½p ¶p ¯p ¨p ¡p šp “p Œp …p ~p wp pp ip bp [p Tp Mp Fp ?p 8p 1p *p #p p p p p p ùo òo ëo äo Ýo Öo Ïo Èo Áo ºo ³o ¬o ¥o žo —o o ‰o ‚o {o to mo fo _o Xo Qo Jo Co k 7k 0k )k "k k k  k k ÿj øj ñj êj ãj Üj Õj Îj Çj Àj ¹j ²j «j ¤j j –j j ˆj j zj sj lj ej ^j Wj Pj Ij Bj ;j 4j -j &j j j j  j j üi õi îi çi ài Ùi Òi Ëi Äi ½i ¶i ¯i ¨i ¡i ši “i Œi …i ~i wi pi ii bi [i Ti Mi Fi ?i 8i 1i *i #i i i i i i ùh òh ëh äh Ýh Öh Ïh Èh Áh ºh ³h ¬h ¥h žh —h h ‰h ‚h {h th mh fh _h Xh Qh Jh Ch d 7d 0d )d "d d d  d d ÿc øc ñc êc ãc Üc Õc Îc Çc Àc ¹c ²c «c ¤c c –c c ˆc c zc sc lc ec ^c Wc Pc Ic Bc ;c 4c -c &c c c c  c c üb õb îb çb àb Ùb Òb Ëb Äb ½b ¶b ¯b ¨b ¡b šb “b Œb …b ~b wb pb ib bb [b Tb Mb Fb ?b 8b 1b *b #b b b b b b ùa òa ëa äa Ýa Öa Ïa Èa Áa ºa ³a ¬a ¥a ža —a a ‰a ‚a {a ta ma fa _a Xa Qa Ja Ca ] 7] 0] )] "] ] ]  ] ] ÿ\ ø\ ñ\ ê\ ã\ Ü\ Õ\ Î\ Ç\ À\ ¹\ ²\ «\ ¤\ \ –\ \ ˆ\ \ z\ s\ l\ e\ ^\ W\ P\ I\ B\ ;\ 4\ -\ &\ \ \ \  \ \ ü[ õ[ î[ ç[ à[ Ù[ Ò[ Ë[ Ä[ ½[ ¶[ ¯[ ¨[ ¡[ š[ “[ Œ[ …[ ~[ w[ p[ i[ b[ [[ T[ M[ F[ ?[ 8[ 1[ *[ #[ [ [ [ [ [ ùZ òZ ëZ äZ ÝZ ÖZ ÏZ ÈZ ÁZ ºZ ³Z ¬Z ¥Z žZ —Z Z ‰Z ‚Z {Z tZ mZ fZ _Z XZ QZ JZ CZ V 7V 0V )V "V V V  V V ÿU øU ñU êU ãU ÜU ÕU ÎU ÇU ÀU ¹U ²U «U ¤U U –U U ˆU U zU sU lU eU ^U WU PU IU BU ;U 4U -U &U U U U  U U üT õT îT çT àT ÙT ÒT ËT ÄT ½T ¶T ¯T ¨T ¡T šT “T ŒT …T ~T wT pT iT bT [T TT MT FT ?T 8T 1T *T #T T T T T T ùS òS ëS äS ÝS ÖS ÏS ÈS ÁS ºS ³S ¬S ¥S žS —S S ‰S ‚S {S tS mS fS _S XS QS JS CS O 7O 0O )O "O O O  O O ÿN øN ñN êN ãN ÜN ÕN ÎN ÇN ÀN ¹N ²N «N ¤N N –N N ˆN N zN sN lN eN ^N WN PN IN BN ;N 4N -N &N N N N  N N üM õM îM çM àM ÙM ÒM ËM ÄM ½M ¶M ¯M ¨M ¡M šM “M ŒM …M ~M wM pM iM bM [M TM MM FM ?M 8M 1M *M #M M M M M M ùL òL ëL äL ÝL ÖL ÏL ÈL ÁL ºL ³L ¬L ¥L žL —L L ‰L ‚L {L tL mL fL _L XL QL JL CL H 7H 0H )H "H H H  H H ÿG øG ñG êG ãG ÜG ÕG ÎG ÇG ÀG ¹G ²G «G ¤G G –G G ˆG G zG sG lG eG ^G WG PG IG BG ;G 4G -G &G G G G  G G üF õF îF çF àF ÙF ÒF ËF ÄF ½F ¶F ¯F ¨F ¡F šF “F ŒF …F ~F wF pF iF bF [F TF MF FF ?F 8F 1F *F #F F F F F F ùE òE ëE äE ÝE ÖE ÏE ÈE ÁE ºE ³E ¬E ¥E žE —E E ‰E ‚E {E tE mE fE _E XE QE JE CE A 7A 0A )A "A A A  A A ÿ@ ø@ ñ@ ê@ ã@ Ü@ Õ@ Î@ Ç@ À@ ¹@ ²@ «@ ¤@ @ –@ @ ˆ@ @ z@ s@ l@ e@ ^@ W@ P@ I@ B@ ;@ 4@ -@ &@ @ @ @  @ @ ü? õ? î? ç? à? Ù? Ò? Ë? Ä? ½? ¶? ¯? ¨? ¡? š? “? Œ? …? ~? w? p? i? b? [? T? M? F? ?? 8? 1? *? #? ? ? ? ? ? ù> ò> ë> ä> Ý> Ö> Ï> È> Á> º> ³> ¬> ¥> ž> —> > ‰> ‚> {> t> m> f> _> X> Q> J> C> <> 5> .> '>  > > >  > > ý= ö= ï= è= á= Ú= Ó= Ì= Å= ¾= ·= °= ©= ¢= ›= ”= = †= = x= q= j= c= \= U= N= G= @= 9= 2= += $= = = = = = ú< ó< ì< å< Þ< ×< Ð< É< Â< »< ´< ­< ¦< Ÿ< ˜< ‘< Š< ƒ< |< u< n< g< `< Y< R< K< D< =< 6< /< (< !< < <  < < þ; ÷; ð; é; â; Û; Ô; Í; Æ; ¿; ¸; ±; ª; £; œ; •; Ž; ‡; €; y; r; k; d; ]; V; O; H; A; :; 3; ,; %; ; ; ;  ; ; û: ô: í: æ: ß: Ø: Ñ: Ê: Ã: ¼: µ: ®: §:  : ™: ’: ‹: „: }: v: o: h: a: Z: S: L: E: >: 7: 0: ): ": : :  : : ÿ9 ø9 ñ9 ê9 ã9 Ü9 Õ9 Î9 Ç9 À9 ¹9 ²9 «9 ¤9 9 –9 9 ˆ9 9 z9 s9 l9 e9 ^9 W9 P9 I9 B9 ;9 49 -9 &9 9 9 9  9 9 ü8 õ8 î8 ç8 à8 Ù8 Ò8 Ë8 Ä8 ½8 ¶8 ¯8 ¨8 ¡8 š8 “8 Œ8 …8 ~8 w8 p8 i8 b8 [8 T8 M8 F8 ?8 88 18 *8 #8 8 8 8 8 8 ù7 ò7 ë7 ä7 Ý7 Ö7 Ï7 È7 Á7 º7 ³7 ¬7 ¥7 ž7 —7 7 ‰7 ‚7 {7 t7 m7 f7 _7 X7 Q7 J7 C7 <7 57 .7 '7  7 7 7  7 7 ý6 ö6 ï6 è6 á6 Ú6 Ó6 Ì6 Å6 ¾6 ·6 °6 ©6 ¢6 ›6 ”6 6 †6 6 x6 q6 j6 c6 \6 U6 N6 G6 @6 96 26 +6 $6 6 6 6 6 6 ú5 ó5 ì5 å5 Þ5 ×5 Ð5 É5 Â5 »5 ´5 ­5 ¦5 Ÿ5 ˜5 ‘5 Š5 ƒ5 |5 u5 n5 g5 `5 Y5 R5 K5 D5 =5 65 /5 (5 !5 5 5  5 5 þ4 ÷4 ð4 é4 â4 Û4 Ô4 Í4 Æ4 ¿4 ¸4 ±4 ª4 £4 œ4 •4 Ž4 ‡4 €4 y4 r4 k4 d4 ]4 V4 O4 H4 A4 :4 34 ,4 %4 4 4 4  4 4 û3 ô3 í3 æ3 ß3 Ø3 Ñ3 Ê3 Ã3 ¼3 µ3 ®3 §3  3 ™3 ’3 ‹3 „3 }3 v3 o3 h3 a3 Z3 S3 L3 E3 >3 73 03 )3 "3 3 3  3 3 ÿ2 ø2 ñ2 ê2 ã2 Ü2 Õ2 Î2 Ç2 À2 ¹2 ²2 «2 ¤2 2 –2 2 ˆ2 2 z2 s2 l2 e2 ^2 W2 P2 I2 B2 ;2 42 -2 &2 2 2 2  2 2 ü1 õ1 î1 ç1 à1 Ù1 Ò1 Ë1 Ä1 ½1 ¶1 ¯1 ¨1 ¡1 š1 “1 Œ1 …1 ~1 w1 p1 i1 b1 [1 T1 M1 F1 ?1 81 11 *1 #1 1 1 1 1 1 ù0 ò0 ë0 ä0 Ý0 Ö0 Ï0 È0 Á0 º0 ³0 ¬0 ¥0 ž0 —0 0 ‰0 ‚0 {0 t0 m0 f0 _0 X0 Q0 J0 C0 <0 50 .0 '0  0 0 0  0 0 ý/ ö/ ï/ è/ á/ Ú/ Ó/ Ì/ Å/ ¾/ ·/ °/ ©/ ¢/ ›/ ”/ / †/ / x/ q/ j/ c/ \/ U/ N/ G/ @/ 9/ 2/ +/ $/ / / / / / ú. ó. ì. å. Þ. ×. Ð. É. Â. ». ´. ­. ¦. Ÿ. ˜. ‘. Š. ƒ. |. u. n. g. `. Y. R. K. D. =. 6. /. (. !. . .  . . þ- ÷- ð- é- â- Û- Ô- Í- Æ- ¿- ¸- ±- ª- £- œ- •- Ž- ‡- €- y- r- k- d- ]- V- O- H- A- :- 3- ,- %- - - -  - - û, ô, í, æ, ß, Ø, Ñ, Ê, Ã, ¼, µ, ®, §,  , ™, ’, ‹, „, }, v, o, h, a, Z, S, L, E, >, 7, 0, ), ", , ,  , , ÿ+ ø+ ñ+ ê+ ã+ Ü+ Õ+ Î+ Ç+ À+ ¹+ ²+ «+ ¤+ + –+ + ˆ+ + z+ s+ l+ e+ ^+ W+ P+ I+ B+ ;+ 4+ -+ &+ + + +  + + ü* õ* î* ç* à* Ù* Ò* Ë* Ä* ½* ¶* ¯* ¨* ¡* š* “* Œ* …* ~* w* p* i* b* [* T* M* F* ?* 8* 1* ** #* * * * * * ù) ò) ë) ä) Ý) Ö) Ï) È) Á) º) ³) ¬) ¥) ž) —) ) ‰) ‚) {) t) m) f) _) X) Q) J) C) <) 5) .) ')  ) ) )  ) ) ý( ö( ï( è( á( Ú( Ó( Ì( Å( ¾( ·( °( ©( ¢( ›( ”( ( †( ( x( q( j( c( \( U( N( G( @( 9( 2( +( $( ( ( ( ( ( ú' ó' ì' å' Þ' ×' Ð' É' Â' »' ´' ­' ¦' Ÿ' ˜' ‘' Š' ƒ' |' u' n' g' `' Y' R' K' D' =' 6' /' (' !' ' '  ' ' þ& ÷& ð& é& â& Û& Ô& Í& Æ& ¿& ¸& ±& ª& £& œ& •& Ž& ‡& €& y& r& k& d& ]& V& O& H& A& :& 3& ,& %& & & &  & & û% ô% í% æ% ß% Ø% Ñ% Ê% Ã% ¼% µ% ®% §%  % ™% ’% ‹% „% }% v% o% h% a% Z% S% L% E% >% 7% 0% )% "% % %  % % ÿ$ ø$ ñ$ ê$ ã$ Ü$ Õ$ Î$ Ç$ À$ ¹$ ²$ «$ ¤$ $ –$ $ ˆ$ $ z$ s$ l$ e$ ^$ W$ P$ I$ B$ ;$ 4$ -$ &$ $ $ $  $ $ ü# õ# î# ç# à# Ù# Ò# Ë# Ä# ½# ¶# ¯# ¨# ¡# š# “# Œ# …# ~# w# p# i# b# [# T# M# F# ?# 8# 1# *# ## # # # # # ù" ò" ë" ä" Ý" Ö" Ï" È" Á" º" ³" ¬" ¥" ž" —" " ‰" ‚" {" t" m" f" _" X" Q" J" C" <" 5" ." '"  " " "  " " ý! ö! ï! è! á! Ú! Ó! Ì! Å! ¾! ·! °! ©! ¢! ›! ”! ! †! ! x! q! j! c! \! U! N! G! @! 9! 2! +! $! ! ! ! ! ! ú  ó  ì  å  Þ  ×  Ð  É    »  ´  ­  ¦  Ÿ  ˜  ‘  Š  ƒ  |  u  n  g  `  Y  R  K  D  =  6  /  (  !          þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù  ò  ë  ä  Ý  Ö  Ï  È  Á  º  ³  ¬  ¥  ž  —    ‰  ‚  {  t  m  f  _  X  Q  J  C  <  5  .  '            ý  ö  ï  è  á  Ú  Ó  Ì  Å  ¾  ·  °  ©  ¢  ›  ”    †    x  q  j  c  \  U  N  G  @  9  2  +  $            ú  ó  ì  å  Þ  ×  Ð  É    »  ´  ­  ¦  Ÿ  ˜  ‘  Š  ƒ  |  u  n  g  `  Y  R  K  D  =  6  /  (  !          þ  ÷  ð  é  â  Û  Ô  Í  Æ  ¿  ¸  ±  ª  £  œ  •  Ž  ‡  €  y  r  k  d  ]  V  O  H  A  :  3  ,  %            û  ô  í  æ  ß  Ø  Ñ  Ê  à  ¼  µ  ®  §     ™  ’  ‹  „  }  v  o  h  a  Z  S  L  E  >  7  0  )  "          ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùÿŸòÿŸëÿŸäÿŸÝÿŸÖÿŸÏÿŸÈÿŸÁÿŸºÿŸ³ÿŸ¬ÿŸ¥ÿŸžÿŸ—ÿŸÿŸ‰ÿŸ‚ÿŸ{ÿŸtÿŸmÿŸfÿŸ_ÿŸXÿŸQÿŸJÿŸCÿŸ<ÿŸ5ÿŸ.ÿŸ'ÿŸ ÿŸÿŸÿŸ ÿŸÿŸýþŸöþŸïþŸèþŸáþŸÚþŸÓþŸÌþŸÅþŸ¾þŸ·þŸ°þŸ©þŸ¢þŸ›þŸ”þŸþŸ†þŸþŸxþŸqþŸjþŸcþŸ\þŸUþŸNþŸGþŸ@þŸ9þŸ2þŸ+þŸ$þŸþŸþŸþŸþŸþŸúýŸóýŸìýŸåýŸÞýŸ×ýŸÐýŸÉýŸÂýŸ»ýŸ´ýŸ­ýŸ¦ýŸŸýŸ˜ýŸ‘ýŸŠýŸƒýŸ|ýŸuýŸnýŸgýŸ`ýŸYýŸRýŸKýŸDýŸ=ýŸ6ýŸ/ýŸ(ýŸ!ýŸýŸýŸ ýŸýŸþüŸ÷üŸðüŸéüŸâüŸÛüŸÔüŸÍüŸÆüŸ¿üŸ¸üŸ±üŸªüŸ£üŸœüŸ•üŸŽüŸ‡üŸ€üŸyüŸrüŸküŸdüŸ]üŸVüŸOüŸHüŸAüŸ:üŸ3üŸ,üŸ%üŸüŸüŸüŸ üŸüŸûûŸôûŸíûŸæûŸßûŸØûŸÑûŸÊûŸÃûŸ¼ûŸµûŸ®ûŸ§ûŸ ûŸ™ûŸ’ûŸ‹ûŸ„ûŸ}ûŸvûŸoûŸhûŸaûŸZûŸSûŸLûŸEûŸ>ûŸ7ûŸ0ûŸ)ûŸ"ûŸûŸûŸ ûŸûŸÿúŸøúŸñúŸêúŸãúŸÜúŸÕúŸÎúŸÇúŸÀúŸ¹úŸ²úŸ«úŸ¤úŸúŸ–úŸúŸˆúŸúŸzúŸsúŸlúŸeúŸ^úŸWúŸPúŸIúŸBúŸ;úŸ4úŸ-úŸ&úŸúŸúŸúŸ úŸúŸüùŸõùŸîùŸçùŸàùŸÙùŸÒùŸËùŸÄùŸ½ùŸ¶ùŸ¯ùŸ¨ùŸ¡ùŸšùŸ“ùŸŒùŸ…ùŸ~ùŸwùŸpùŸiùŸbùŸ[ùŸTùŸMùŸFùŸ?ùŸ8ùŸ1ùŸ*ùŸ#ùŸùŸùŸùŸùŸùŸùøŸòøŸëøŸäøŸÝøŸÖøŸÏøŸÈøŸÁøŸºøŸ³øŸ¬øŸ¥øŸžøŸ—øŸøŸ‰øŸ‚øŸ{øŸtøŸmøŸføŸ_øŸXøŸQøŸJøŸCøŸ<øŸ5øŸ.øŸ'øŸ øŸøŸøŸ øŸøŸý÷Ÿö÷Ÿï÷Ÿè÷Ÿá÷ŸÚ÷ŸÓ÷ŸÌ÷ŸÅ÷Ÿ¾÷Ÿ·÷Ÿ°÷Ÿ©÷Ÿ¢÷Ÿ›÷Ÿ”÷Ÿ÷Ÿ†÷Ÿ÷Ÿx÷Ÿq÷Ÿj÷Ÿc÷Ÿ\÷ŸU÷ŸN÷ŸG÷Ÿ@÷Ÿ9÷Ÿ2÷Ÿ+÷Ÿ$÷Ÿ÷Ÿ÷Ÿ÷Ÿ÷Ÿ÷ŸúöŸóöŸìöŸåöŸÞöŸ×öŸÐöŸÉöŸÂöŸ»öŸ´öŸ­öŸ¦öŸŸöŸ˜öŸ‘öŸŠöŸƒöŸ|öŸuöŸnöŸgöŸ`öŸYöŸRöŸKöŸDöŸ=öŸ6öŸ/öŸ(öŸ!öŸöŸöŸ öŸöŸþõŸ÷õŸðõŸéõŸâõŸÛõŸÔõŸÍõŸÆõŸ¿õŸ¸õŸ±õŸªõŸ£õŸœõŸ•õŸŽõŸ‡õŸ€õŸyõŸrõŸkõŸdõŸ]õŸVõŸOõŸHõŸAõŸ:õŸ3õŸ,õŸ%õŸõŸõŸõŸ õŸõŸûôŸôôŸíôŸæôŸßôŸØôŸÑôŸÊôŸÃôŸ¼ôŸµôŸ®ôŸ§ôŸ ôŸ™ôŸ’ôŸ‹ôŸ„ôŸ}ôŸvôŸoôŸhôŸaôŸZôŸSôŸLôŸEôŸ>ôŸ7ôŸ0ôŸ)ôŸ"ôŸôŸôŸ ôŸôŸÿóŸøóŸñóŸêóŸãóŸÜóŸÕóŸÎóŸÇóŸÀóŸ¹óŸ²óŸ«óŸ¤óŸóŸ–óŸóŸˆóŸóŸzóŸsóŸlóŸeóŸ^óŸWóŸPóŸIóŸBóŸ;óŸ4óŸ-óŸ&óŸóŸóŸóŸ óŸóŸüòŸõòŸîòŸçòŸàòŸÙòŸÒòŸËòŸÄòŸ½òŸ¶òŸ¯òŸ¨òŸ¡òŸšòŸ“òŸŒòŸ…òŸ~òŸwòŸpòŸiòŸbòŸ[òŸTòŸMòŸFòŸ?òŸ8òŸ1òŸ*òŸ#òŸòŸòŸòŸòŸòŸùñŸòñŸëñŸäñŸÝñŸÖñŸÏñŸÈñŸÁñŸºñŸ³ñŸ¬ñŸ¥ñŸžñŸ—ñŸñŸ‰ñŸ‚ñŸ{ñŸtñŸmñŸfñŸ_ñŸXñŸQñŸJñŸCñŸ<ñŸ5ñŸ.ñŸ'ñŸ ñŸñŸñŸ ñŸñŸýðŸöðŸïðŸèðŸáðŸÚðŸÓðŸÌðŸÅðŸ¾ðŸ·ðŸ°ðŸ©ðŸ¢ðŸ›ðŸ”ðŸðŸ†ðŸðŸxðŸqðŸjðŸcðŸ\ðŸUðŸNðŸGðŸ@ðŸ9ðŸ2ðŸ+ðŸ$ðŸðŸðŸðŸðŸðŸúïŸóïŸìïŸåïŸÞïŸ×ïŸÐïŸÉïŸÂïŸ|ïŸuïŸnïŸgïŸ`ïŸYïŸRïŸKïŸDïŸ=ïŸ6ïŸ/ïŸ(ïŸ!ïŸïŸïŸ ïŸïŸþîŸ÷îŸðîŸéîŸâîŸÛîŸÔîŸÍîŸÆîŸ¿îŸ¸îŸ±îŸªîŸ£îŸœîŸ•îŸŽîŸ‡îŸ€îŸyîŸrîŸkîŸdîŸ]îŸVîŸOîŸHîŸAîŸ:îŸ3îŸ,îŸ%îŸîŸîŸîŸ îŸîŸûíŸôíŸííŸæíŸßíŸØíŸÑíŸÊíŸÃ퟼ퟵퟮퟧퟠퟙퟒퟋퟄíŸ}íŸvíŸoíŸhíŸaíŸZíŸSíŸLíŸEíŸ>íŸ7íŸ0íŸ)íŸ"íŸíŸíŸ íŸíŸÿìŸøìŸñìŸêìŸãìŸÜìŸÕìŸÎìŸÇìŸÀ쟹쟲쟫쟤ìŸìŸ–ìŸìŸˆìŸìŸzìŸsìŸlìŸeìŸ^ìŸWìŸPìŸIìŸBìŸ;ìŸ4ìŸ-ìŸ&ìŸìŸìŸìŸ ìŸìŸüëŸõëŸîëŸçëŸàëŸÙëŸÒëŸËëŸÄ럽럶럯럨럡럚럓럌럅ëŸ~ëŸwëŸpëŸiëŸbëŸ[ëŸTëŸMëŸFëŸ?ëŸ8ëŸ1ëŸ*ëŸ#ëŸëŸëŸëŸëŸëŸùêŸòêŸëêŸäêŸÝêŸÖêŸÏêŸÈêŸÁꟺꟳ꟬꟥꟞ꟗêŸêŸ‰êŸ‚êŸ{êŸtêŸmêŸfêŸ_êŸXêŸQêŸJêŸCêŸ<êŸ5êŸ.êŸ'êŸ êŸêŸêŸ êŸêŸýéŸöéŸïéŸèéŸáéŸÚéŸÓéŸÌéŸÅ韾韷韰韩韢韛韔éŸéŸ†éŸéŸxéŸqéŸjéŸcéŸ\éŸUéŸNéŸGéŸ@éŸ9éŸ2éŸ+éŸ$éŸéŸéŸéŸéŸéŸúèŸóèŸìèŸåèŸÞèŸ×èŸÐèŸÉèŸÂ蟻蟴蟭蟦蟟蟘蟑蟊蟃èŸ|èŸuèŸnèŸgèŸ`èŸYèŸRèŸKèŸDèŸ=èŸ6èŸ/èŸ(èŸ!èŸèŸèŸ èŸèŸþçŸ÷çŸðçŸéçŸâçŸÛçŸÔçŸÍçŸÆçŸ¿çŸ¸çŸ±çŸªçŸ£çŸœçŸ•çŸŽçŸ‡çŸ€çŸyçŸrçŸkçŸdçŸ]çŸVçŸOçŸHçŸAçŸ:çŸ3çŸ,çŸ%çŸçŸçŸçŸ çŸçŸûæŸôæŸíæŸææŸßæŸØæŸÑæŸÊæŸÃ柼柵柮柧柠柙柒柋柄æŸ}æŸvæŸoæŸhæŸaæŸZæŸSæŸLæŸEæŸ>æŸ7æŸ0æŸ)æŸ"æŸæŸæŸ æŸæŸÿåŸøåŸñåŸêåŸãåŸÜåŸÕåŸÎåŸÇåŸÀ培埲埫埤åŸåŸ–åŸåŸˆåŸåŸzåŸsåŸlåŸeåŸ^åŸWåŸPåŸIåŸBåŸ;åŸ4åŸ-åŸ&åŸåŸåŸåŸ åŸåŸüäŸõäŸîäŸçäŸàäŸÙäŸÒäŸËäŸÄ䟽䟶䟯䟨䟡䟚䟓䟌䟅äŸ~äŸwäŸpäŸiäŸbäŸ[äŸTäŸMäŸFäŸ?äŸ8äŸ1äŸ*äŸ#äŸäŸäŸäŸäŸäŸùãŸòãŸëãŸäãŸÝãŸÖãŸÏãŸÈãŸÁ㟺㟳㟬㟥㟞㟗ãŸãŸ‰ãŸ‚ãŸ{ãŸtãŸmãŸfãŸ_ãŸXãŸQãŸJãŸCãŸ<ãŸ5ãŸ.ãŸ'㟠ãŸãŸãŸ ãŸãŸýâŸöâŸïâŸèâŸáâŸÚâŸÓâŸÌâŸÅ⟾⟷⟰⟩⟢⟛⟔âŸâŸ†âŸâŸxâŸqâŸjâŸcâŸ\âŸUâŸNâŸGâŸ@âŸ9âŸ2âŸ+âŸ$âŸâŸâŸâŸâŸâŸúáŸóáŸìáŸåáŸÞáŸ×áŸÐáŸÉáŸÂ៻៴៭៦៟៘៑៊ៃáŸ|áŸuáŸnáŸgáŸ`áŸYáŸRáŸKáŸDáŸ=áŸ6áŸ/áŸ(áŸ!áŸáŸáŸ áŸáŸþàŸ÷àŸðàŸéàŸâàŸÛàŸÔàŸÍàŸÆàŸ¿àŸ¸àŸ±àŸªàŸ£àŸœàŸ•àŸŽàŸ‡àŸ€àŸyàŸràŸkàŸdàŸ]àŸVàŸOàŸHàŸAàŸ:àŸ3àŸ,àŸ%àŸàŸàŸàŸ àŸàŸûߟôߟíߟæßŸßߟØßŸÑߟÊߟÃߟ¼ßŸµßŸ®ßŸ§ßŸ ßŸ™ßŸ’ߟ‹ßŸ„ߟ}ߟvߟoߟhߟaߟZߟSߟLߟEߟ>ߟ7ߟ0ߟ)ߟ"ߟߟߟ ߟߟÿÞŸøÞŸñÞŸêÞŸãÞŸÜÞŸÕÞŸÎÞŸÇÞŸÀÞŸ¹ÞŸ²ÞŸ«ÞŸ¤ÞŸÞŸ–ÞŸÞŸˆÞŸÞŸzÞŸsÞŸlÞŸeÞŸ^ÞŸWÞŸPÞŸIÞŸBÞŸ;ÞŸ4ÞŸ-ÞŸ&ÞŸÞŸÞŸÞŸ ÞŸÞŸüÝŸõÝŸîÝŸçÝŸàÝŸÙÝŸÒÝŸËÝŸÄÝŸ½ÝŸ¶ÝŸ¯ÝŸ¨ÝŸ¡ÝŸšÝŸ“ÝŸŒÝŸ…ÝŸ~ÝŸwÝŸpÝŸiÝŸbÝŸ[ÝŸTÝŸMÝŸFÝŸ?ÝŸ8ÝŸ1ÝŸ*ÝŸ#ÝŸÝŸÝŸÝŸÝŸÝŸùÜŸòÜŸëÜŸäÜŸÝÜŸÖÜŸÏÜŸÈÜŸÁÜŸºÜŸ³ÜŸ¬ÜŸ¥ÜŸžÜŸ—ÜŸÜŸ‰ÜŸ‚ÜŸ{ÜŸtÜŸmÜŸfÜŸ_ÜŸXÜŸQÜŸJÜŸCÜŸ<ÜŸ5ÜŸ.ÜŸ'ÜŸ ÜŸÜŸÜŸ ÜŸÜŸýÛŸöÛŸïÛŸèÛŸáÛŸÚÛŸÓÛŸÌÛŸÅÛŸ¾ÛŸ·ÛŸ°ÛŸ©ÛŸ¢ÛŸ›ÛŸ”ÛŸÛŸ†ÛŸÛŸxÛŸqÛŸjÛŸcÛŸ\ÛŸUÛŸNÛŸGÛŸ@ÛŸ9ÛŸ2ÛŸ+ÛŸ$ÛŸÛŸÛŸÛŸÛŸÛŸúÚŸóÚŸìÚŸåÚŸÞÚŸ×ÚŸÐÚŸÉÚŸÂÚŸ»ÚŸ´ÚŸ­ÚŸ¦ÚŸŸÚŸ˜ÚŸ‘ÚŸŠÚŸƒÚŸ|ÚŸuÚŸnÚŸgÚŸ`ÚŸYÚŸRÚŸKÚŸDÚŸ=ÚŸ6ÚŸ/ÚŸ(ÚŸ!ÚŸÚŸÚŸ ÚŸÚŸþÙŸ÷ÙŸðÙŸéÙŸâÙŸÛÙŸÔÙŸÍÙŸÆÙŸ¿ÙŸ¸ÙŸ±ÙŸªÙŸ£ÙŸœÙŸ•ÙŸŽÙŸ‡ÙŸ€ÙŸyÙŸrÙŸkÙŸdÙŸ]ÙŸVÙŸOÙŸHÙŸAÙŸ:ÙŸ3ÙŸ,ÙŸ%ٟٟٟٟ ٟٟûØŸôØŸíØŸæØŸߨŸØØŸÑØŸÊØŸÃØŸ¼ØŸµØŸ®ØŸ§ØŸ ØŸ™ØŸ’ØŸ‹ØŸ„ØŸ}ØŸvØŸoØŸhØŸaØŸZØŸSØŸLØŸEØŸ>ØŸ7ØŸ0ØŸ)ØŸ"؟؟؟ ؟؟ÿןø×ŸñןêןãןÜןÕןÎןÇןÀן¹×Ÿ²×Ÿ«×Ÿ¤×Ÿן–ןןˆ×Ÿןzןsןlןeן^ןWןPןIןBן;ן4ן-ן&ןןןן ןןüÖŸõÖŸîÖŸçÖŸàÖŸÙÖŸÒÖŸËÖŸÄÖŸ½ÖŸ¶ÖŸ¯ÖŸ¨ÖŸ¡ÖŸšÖŸ“ÖŸŒÖŸ…ÖŸ~ÖŸwÖŸpÖŸiÖŸbÖŸ[ÖŸTÖŸMÖŸFÖŸ?ÖŸ8ÖŸ1ÖŸ*ÖŸ#ÖŸÖŸÖŸÖŸÖŸÖŸùÕŸòÕŸëÕŸäÕŸÝÕŸÖÕŸÏÕŸÈÕŸÁÕŸºÕŸ³ÕŸ¬ÕŸ¥ÕŸžÕŸ—ÕŸÕŸ‰ÕŸ‚ÕŸ{ÕŸtÕŸmÕŸfÕŸ_ÕŸXÕŸQÕŸJÕŸCÕŸ<ÕŸ5ÕŸ.ÕŸ'ÕŸ ÕŸÕŸÕŸ ÕŸÕŸýÔŸöÔŸïÔŸèÔŸáÔŸÚÔŸÓÔŸÌÔŸÅÔŸ¾ÔŸ·ÔŸ°ÔŸ©ÔŸ¢ÔŸ›ÔŸ”ÔŸÔŸ†ÔŸÔŸxÔŸqÔŸjÔŸcÔŸ\ÔŸUÔŸNÔŸGÔŸ@ÔŸ9ÔŸ2ÔŸ+ÔŸ$ÔŸÔŸÔŸÔŸÔŸÔŸúÓŸóÓŸìÓŸåÓŸÞÓŸ×ÓŸÐÓŸÉÓŸÂÓŸ»ÓŸ´ÓŸ­ÓŸ¦ÓŸŸÓŸ˜ÓŸ‘ÓŸŠÓŸƒÓŸ|ÓŸuÓŸnÓŸgÓŸ`ÓŸYÓŸRÓŸKÓŸDÓŸ=ÓŸ6ÓŸ/ÓŸ(ÓŸ!ÓŸÓŸÓŸ ÓŸÓŸþÒŸ÷ÒŸðÒŸéÒŸâÒŸÛÒŸÔÒŸÍÒŸÆÒŸ¿ÒŸ¸ÒŸ±ÒŸªÒŸ£ÒŸœÒŸ•ÒŸŽÒŸ‡ÒŸ€ÒŸyÒŸrÒŸkÒŸdÒŸ]ÒŸVÒŸOÒŸHÒŸAÒŸ:ÒŸ3ÒŸ,ÒŸ%ÒŸÒŸÒŸÒŸ ÒŸÒŸûÑŸôÑŸíÑŸæÑŸßÑŸØÑŸÑÑŸÊÑŸÃÑŸ¼ÑŸµÑŸ®ÑŸ§ÑŸ ÑŸ™ÑŸ’ÑŸ‹ÑŸ„ÑŸ}ÑŸvÑŸoÑŸhÑŸaÑŸZÑŸSÑŸLÑŸEÑŸ>ÑŸ7ÑŸ0ÑŸ)ÑŸ"ÑŸÑŸÑŸ ÑŸÑŸÿПøÐŸñПêПãПÜПÕПÎПÇПÀП¹ÐŸ²ÐŸ«ÐŸ¤ÐŸП–ППˆÐŸПzПsПlПeП^ПWПPПIПBП;П4П-П&ПППП ППüÏŸõÏŸîÏŸçÏŸàÏŸÙÏŸÒÏŸËÏŸÄÏŸ½ÏŸ¶ÏŸ¯ÏŸ¨ÏŸ¡ÏŸšÏŸ“ÏŸŒÏŸ…ÏŸ~ÏŸwÏŸpÏŸiÏŸbÏŸ[ÏŸTÏŸMÏŸFÏŸ?ÏŸ8ÏŸ1ÏŸ*ÏŸ#ÏŸÏŸÏŸÏŸÏŸÏŸùΟòΟëΟäΟÝΟÖΟÏΟÈΟÁΟºÎŸ³ÎŸ¬ÎŸ¥ÎŸžÎŸ—ΟΟ‰ÎŸ‚Ο{ΟtΟmΟfΟ_ΟXΟQΟJΟCΟ<Ο5Ο.Ο'Ο ΟΟΟ ΟΟýÍŸöÍŸïÍŸèÍŸáÍŸÚÍŸÓÍŸÌÍŸÅÍŸ¾ÍŸ·ÍŸ°ÍŸ©ÍŸ¢ÍŸ›ÍŸ”ÍŸÍŸ†ÍŸÍŸxÍŸqÍŸjÍŸcÍŸ\ÍŸUÍŸNÍŸGÍŸ@ÍŸ9ÍŸ2ÍŸ+ÍŸ$ÍŸÍŸÍŸÍŸÍŸÍŸúÌŸóÌŸìÌŸåÌŸÞÌŸ×ÌŸÐÌŸÉÌŸÂÌŸ»ÌŸ´ÌŸ­ÌŸ¦ÌŸŸÌŸ˜ÌŸ‘ÌŸŠÌŸƒÌŸ|ÌŸuÌŸnÌŸgÌŸ`ÌŸYÌŸRÌŸKÌŸDÌŸ=ÌŸ6ÌŸ/ÌŸ(ÌŸ!ÌŸÌŸÌŸ ÌŸÌŸþËŸ÷ËŸðËŸéËŸâËŸÛËŸÔËŸÍËŸÆËŸ¿ËŸ¸ËŸ±ËŸªËŸ£ËŸœËŸ•ËŸŽËŸ‡ËŸ€ËŸyËŸrËŸkËŸdËŸ]ËŸVËŸOËŸHËŸAËŸ:ËŸ3ËŸ,ËŸ%ËŸËŸËŸËŸ ËŸËŸûÊŸôÊŸíÊŸæÊŸßÊŸØÊŸÑÊŸÊÊŸÃÊŸ¼ÊŸµÊŸ®ÊŸ§ÊŸ ÊŸ™ÊŸ’ÊŸ‹ÊŸ„ÊŸ}ÊŸvÊŸoÊŸhÊŸaÊŸZÊŸSÊŸLÊŸEÊŸ>ÊŸ7ÊŸ0ÊŸ)ÊŸ"ÊŸÊŸÊŸ ÊŸÊŸÿÉŸøÉŸñÉŸêÉŸãÉŸÜÉŸÕÉŸÎÉŸÇÉŸÀÉŸ¹ÉŸ²ÉŸ«ÉŸ¤ÉŸÉŸ–ÉŸÉŸˆÉŸÉŸzÉŸsÉŸlÉŸeÉŸ^ÉŸWÉŸPÉŸIÉŸBÉŸ;ÉŸ4ÉŸ-ÉŸ&ÉŸÉŸÉŸÉŸ ÉŸÉŸüÈŸõÈŸîÈŸçÈŸàÈŸÙÈŸÒÈŸËÈŸÄÈŸ½ÈŸ¶ÈŸ¯ÈŸ¨ÈŸ¡ÈŸšÈŸ“ÈŸŒÈŸ…ÈŸ~ÈŸwÈŸpÈŸiÈŸbÈŸ[ÈŸTÈŸMÈŸFÈŸ?ÈŸ8ÈŸ1ÈŸ*ÈŸ#ÈŸÈŸÈŸÈŸÈŸÈŸùÇŸòÇŸëÇŸäÇŸÝÇŸÖÇŸÏÇŸÈÇŸÁÇŸºÇŸ³ÇŸ¬ÇŸ¥ÇŸžÇŸ—ÇŸÇŸ‰ÇŸ‚ÇŸ{ÇŸtÇŸmÇŸfÇŸ_ÇŸXÇŸQÇŸJÇŸCÇŸ<ÇŸ5ÇŸ.ÇŸ'ÇŸ ÇŸÇŸÇŸ ÇŸÇŸýÆŸöÆŸïÆŸèÆŸáÆŸÚÆŸÓÆŸÌÆŸÅÆŸ¾ÆŸ·ÆŸ°ÆŸ©ÆŸ¢ÆŸ›ÆŸ”ÆŸÆŸ†ÆŸÆŸxÆŸqÆŸjÆŸcÆŸ\ÆŸUÆŸNÆŸGÆŸ@ÆŸ9ÆŸ2ÆŸ+ÆŸ$ÆŸÆŸÆŸÆŸÆŸÆŸúÅŸóÅŸìÅŸåÅŸÞÅŸ×ÅŸÐÅŸÉÅŸÂÅŸ»ÅŸ´ÅŸ­ÅŸ¦ÅŸŸÅŸ˜ÅŸ‘ÅŸŠÅŸƒÅŸ|ÅŸuÅŸnÅŸgÅŸ`ÅŸYÅŸRÅŸKÅŸDÅŸ=ÅŸ6ÅŸ/ÅŸ(ÅŸ!ÅŸÅŸÅŸ ÅŸÅŸþÄŸ÷ÄŸðÄŸéÄŸâÄŸÛÄŸÔÄŸÍÄŸÆÄŸ¿ÄŸ¸ÄŸ±ÄŸªÄŸ£ÄŸœÄŸ•ÄŸŽÄŸ‡ÄŸ€ÄŸyÄŸrÄŸkÄŸdÄŸ]ÄŸVÄŸOÄŸHÄŸAÄŸ:ÄŸ3ÄŸ,ÄŸ%ÄŸÄŸÄŸÄŸ ÄŸÄŸûßôßíßæÃŸßßØÃŸÑßÊßÃ߼ߵ߮ߧߠߙß’ߋß„ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿŸøÂŸñŸêŸãŸÜŸÕŸΟÇŸÀŸ¹ÂŸ²ÂŸ«ÂŸ¤ÂŸŸ–ŸŸˆÂŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüÁŸõÁŸîÁŸçÁŸàÁŸÙÁŸÒÁŸËÁŸÄÁŸ½ÁŸ¶ÁŸ¯ÁŸ¨ÁŸ¡ÁŸšÁŸ“ÁŸŒÁŸ…ÁŸ~ÁŸwÁŸpÁŸiÁŸbÁŸ[ÁŸTÁŸMÁŸFÁŸ?ÁŸ8ÁŸ1ÁŸ*ÁŸ#ÁŸÁŸÁŸÁŸÁŸÁŸùÀŸòÀŸëÀŸäÀŸÝÀŸÖÀŸÏÀŸÈÀŸÁÀŸºÀŸ³ÀŸ¬ÀŸ¥ÀŸžÀŸ—ÀŸÀŸ‰ÀŸ‚ÀŸ{ÀŸtÀŸmÀŸfÀŸ_ÀŸXÀŸQÀŸJÀŸCÀŸ<ÀŸ5ÀŸ.ÀŸ'ÀŸ ÀŸÀŸÀŸ ÀŸÀŸý¿Ÿö¿Ÿ￟迟῟Ú¿ŸÓ¿ŸÌ¿ŸÅ¿Ÿ¾¿Ÿ·¿Ÿ°¿Ÿ©¿Ÿ¢¿Ÿ›¿Ÿ”¿Ÿ¿Ÿ†¿Ÿ¿Ÿx¿Ÿq¿Ÿj¿Ÿc¿Ÿ\¿ŸU¿ŸN¿ŸG¿Ÿ@¿Ÿ9¿Ÿ2¿Ÿ+¿Ÿ$¿Ÿ¿Ÿ¿Ÿ¿Ÿ¿Ÿ¿Ÿú¾Ÿó¾Ÿ쾟徟Þ¾Ÿ×¾ŸоŸɾŸ¾Ÿ»¾Ÿ´¾Ÿ­¾Ÿ¦¾ŸŸ¾Ÿ˜¾Ÿ‘¾ŸоŸƒ¾Ÿ|¾Ÿu¾Ÿn¾Ÿg¾Ÿ`¾ŸY¾ŸR¾ŸK¾ŸD¾Ÿ=¾Ÿ6¾Ÿ/¾Ÿ(¾Ÿ!¾Ÿ¾Ÿ¾Ÿ ¾Ÿ¾Ÿþ½Ÿ÷½Ÿð½Ÿ齟⽟Û½ŸÔ½ŸͽŸƽŸ¿½Ÿ¸½Ÿ±½Ÿª½Ÿ£½Ÿœ½Ÿ•½Ÿ޽Ÿ‡½Ÿ€½Ÿy½Ÿr½Ÿk½Ÿd½Ÿ]½ŸV½ŸO½ŸH½ŸA½Ÿ:½Ÿ3½Ÿ,½Ÿ%½Ÿ½Ÿ½Ÿ½Ÿ ½Ÿ½Ÿû¼Ÿô¼Ÿí¼Ÿ漟ß¼ŸؼŸѼŸʼŸüŸ¼¼Ÿµ¼Ÿ®¼Ÿ§¼Ÿ ¼Ÿ™¼Ÿ’¼Ÿ‹¼Ÿ„¼Ÿ}¼Ÿv¼Ÿo¼Ÿh¼Ÿa¼ŸZ¼ŸS¼ŸL¼ŸE¼Ÿ>¼Ÿ7¼Ÿ0¼Ÿ)¼Ÿ"¼Ÿ¼Ÿ¼Ÿ ¼Ÿ¼Ÿÿ»Ÿø»Ÿñ»Ÿ껟㻟Ü»ŸÕ»ŸλŸÇ»ŸÀ»Ÿ¹»Ÿ²»Ÿ«»Ÿ¤»Ÿ»Ÿ–»Ÿ»Ÿˆ»Ÿ»Ÿz»Ÿs»Ÿl»Ÿe»Ÿ^»ŸW»ŸP»ŸI»ŸB»Ÿ;»Ÿ4»Ÿ-»Ÿ&»Ÿ»Ÿ»Ÿ»Ÿ »Ÿ»ŸüºŸõºŸ纟ຟÙºŸÒºŸ˺ŸĺŸ½ºŸ¶ºŸ¯ºŸ¨ºŸ¡ºŸšºŸ“ºŸŒºŸ…ºŸ~ºŸwºŸpºŸiºŸbºŸ[ºŸTºŸMºŸFºŸ?ºŸ8ºŸ1ºŸ*ºŸ#ºŸºŸºŸºŸºŸºŸù¹Ÿò¹Ÿ빟也ݹŸÖ¹ŸϹŸȹŸÁ¹Ÿº¹Ÿ³¹Ÿ¬¹Ÿ¥¹Ÿž¹Ÿ—¹Ÿ¹Ÿ‰¹Ÿ‚¹Ÿ{¹Ÿt¹Ÿm¹Ÿf¹Ÿ_¹ŸX¹ŸQ¹ŸJ¹ŸC¹Ÿ<¹Ÿ5¹Ÿ.¹Ÿ'¹Ÿ ¹Ÿ¹Ÿ¹Ÿ ¹Ÿ¹Ÿý¸Ÿö¸Ÿ︟踟ḟÚ¸ŸÓ¸Ÿ̸ŸŸŸ¾¸Ÿ·¸Ÿ°¸Ÿ©¸Ÿ¢¸Ÿ›¸Ÿ”¸Ÿ¸Ÿ†¸Ÿ¸Ÿx¸Ÿq¸Ÿj¸Ÿc¸Ÿ\¸ŸU¸ŸN¸ŸG¸Ÿ@¸Ÿ9¸Ÿ2¸Ÿ+¸Ÿ$¸Ÿ¸Ÿ¸Ÿ¸Ÿ¸Ÿ¸Ÿú·Ÿó·Ÿì·Ÿå·ŸÞ·Ÿ×·ŸзŸÉ·Ÿ·Ÿ»·Ÿ´·Ÿ­·Ÿ¦·ŸŸ·Ÿ˜·Ÿ‘·ŸŠ·Ÿƒ·Ÿ|·Ÿu·Ÿn·Ÿg·Ÿ`·ŸY·ŸR·ŸK·ŸD·Ÿ=·Ÿ6·Ÿ/·Ÿ(·Ÿ!·Ÿ·Ÿ·Ÿ ·Ÿ·Ÿþ¶Ÿ÷¶Ÿð¶Ÿé¶Ÿâ¶ŸÛ¶ŸÔ¶ŸͶŸƶŸ¿¶Ÿ¸¶Ÿ±¶Ÿª¶Ÿ£¶Ÿœ¶Ÿ•¶Ÿ޶Ÿ‡¶Ÿ€¶Ÿy¶Ÿr¶Ÿk¶Ÿd¶Ÿ]¶ŸV¶ŸO¶ŸH¶ŸA¶Ÿ:¶Ÿ3¶Ÿ,¶Ÿ%¶Ÿ¶Ÿ¶Ÿ¶Ÿ ¶Ÿ¶ŸûµŸôµŸíµŸ浟ßµŸصŸѵŸʵŸõŸ¼µŸµµŸ®µŸ§µŸ µŸ™µŸ’µŸ‹µŸ„µŸ}µŸvµŸoµŸhµŸaµŸZµŸSµŸLµŸEµŸ>µŸ7µŸ0µŸ)µŸ"µŸµŸµŸ µŸµŸÿ´Ÿø´Ÿñ´Ÿê´Ÿã´ŸÜ´ŸÕ´ŸδŸÇ´ŸÀ´Ÿ¹´Ÿ²´Ÿ«´Ÿ¤´Ÿ´Ÿ–´Ÿ´Ÿˆ´Ÿ´Ÿz´Ÿs´Ÿl´Ÿe´Ÿ^´ŸW´ŸP´ŸI´ŸB´Ÿ;´Ÿ4´Ÿ-´Ÿ&´Ÿ´Ÿ´Ÿ´Ÿ ´Ÿ´Ÿü³Ÿõ³Ÿ糟೟Ù³ŸÒ³Ÿ˳ŸijŸ½³Ÿ¶³Ÿ¯³Ÿ¨³Ÿ¡³Ÿš³Ÿ“³ŸŒ³Ÿ…³Ÿ~³Ÿw³Ÿp³Ÿi³Ÿb³Ÿ[³ŸT³ŸM³ŸF³Ÿ?³Ÿ8³Ÿ1³Ÿ*³Ÿ#³Ÿ³Ÿ³Ÿ³Ÿ³Ÿ³Ÿù²Ÿò²Ÿ벟䲟ݲŸÖ²ŸϲŸȲŸÁ²Ÿº²Ÿ³²Ÿ¬²Ÿ¥²Ÿž²Ÿ—²Ÿ²Ÿ‰²Ÿ‚²Ÿ{²Ÿt²Ÿm²Ÿf²Ÿ_²ŸX²ŸQ²ŸJ²ŸC²Ÿ<²Ÿ5²Ÿ.²Ÿ'²Ÿ ²Ÿ²Ÿ²Ÿ ²Ÿ²Ÿý±Ÿö±Ÿﱟ豟ᱟÚ±ŸÓ±Ÿ̱ŸűŸ¾±Ÿ·±Ÿ°±Ÿ©±Ÿ¢±Ÿ›±Ÿ”±Ÿ±Ÿ†±Ÿ±Ÿx±Ÿq±Ÿj±Ÿc±Ÿ\±ŸU±ŸN±ŸG±Ÿ@±Ÿ9±Ÿ2±Ÿ+±Ÿ$±Ÿ±Ÿ±Ÿ±Ÿ±Ÿ±Ÿú°Ÿó°Ÿì°Ÿå°ŸÞ°Ÿ×°ŸаŸɰŸ°Ÿ»°Ÿ´°Ÿ­°Ÿ¦°ŸŸ°Ÿ˜°Ÿ‘°ŸаŸƒ°Ÿ|°Ÿu°Ÿn°Ÿg°Ÿ`°ŸY°ŸR°ŸK°ŸD°Ÿ=°Ÿ6°Ÿ/°Ÿ(°Ÿ!°Ÿ°Ÿ°Ÿ °Ÿ°Ÿþ¯Ÿ÷¯Ÿð¯Ÿ鯟⯟Û¯ŸÔ¯ŸͯŸƯŸ¿¯Ÿ¸¯Ÿ±¯Ÿª¯Ÿ£¯Ÿœ¯Ÿ•¯ŸޝŸ‡¯Ÿ€¯Ÿy¯Ÿr¯Ÿk¯Ÿd¯Ÿ]¯ŸV¯ŸO¯ŸH¯ŸA¯Ÿ:¯Ÿ3¯Ÿ,¯Ÿ%¯Ÿ¯Ÿ¯Ÿ¯Ÿ ¯Ÿ¯Ÿû®Ÿô®Ÿí®Ÿ殟ß®ŸØ®ŸÑ®ŸÊ®ŸîŸ¼®Ÿµ®Ÿ®®Ÿ§®Ÿ ®Ÿ™®Ÿ’®Ÿ‹®Ÿ„®Ÿ}®Ÿv®Ÿo®Ÿh®Ÿa®ŸZ®ŸS®ŸL®ŸE®Ÿ>®Ÿ7®Ÿ0®Ÿ)®Ÿ"®Ÿ®Ÿ®Ÿ ®Ÿ®Ÿÿ­Ÿø­Ÿñ­Ÿê­Ÿã­ŸÜ­ŸÕ­ŸέŸÇ­ŸÀ­Ÿ¹­Ÿ²­Ÿ«­Ÿ¤­Ÿ­Ÿ–­Ÿ­Ÿˆ­Ÿ­Ÿz­Ÿs­Ÿl­Ÿe­Ÿ^­ŸW­ŸP­ŸI­ŸB­Ÿ;­Ÿ4­Ÿ-­Ÿ&­Ÿ­Ÿ­Ÿ­Ÿ ­Ÿ­Ÿü¬Ÿõ¬Ÿ笟ଟÙ¬ŸÒ¬ŸˬŸĬŸ½¬Ÿ¶¬Ÿ¯¬Ÿ¨¬Ÿ¡¬Ÿš¬Ÿ“¬ŸŒ¬Ÿ…¬Ÿ~¬Ÿw¬Ÿp¬Ÿi¬Ÿb¬Ÿ[¬ŸT¬ŸM¬ŸF¬Ÿ?¬Ÿ8¬Ÿ1¬Ÿ*¬Ÿ#¬Ÿ¬Ÿ¬Ÿ¬Ÿ¬Ÿ¬Ÿù«Ÿò«Ÿ뫟䫟Ý«ŸÖ«ŸÏ«ŸÈ«ŸÁ«Ÿº«Ÿ³«Ÿ¬«Ÿ¥«Ÿž«Ÿ—«Ÿ«Ÿ‰«Ÿ‚«Ÿ{«Ÿt«Ÿm«Ÿf«Ÿ_«ŸX«ŸQ«ŸJ«ŸC«Ÿ<«Ÿ5«Ÿ.«Ÿ'«Ÿ «Ÿ«Ÿ«Ÿ «Ÿ«ŸýªŸöªŸ犯誟᪟ÚªŸÓªŸ̪ŸŪŸ¾ªŸ·ªŸ°ªŸ©ªŸ¢ªŸ›ªŸ”ªŸªŸ†ªŸªŸxªŸqªŸjªŸcªŸ\ªŸUªŸNªŸGªŸ@ªŸ9ªŸ2ªŸ+ªŸ$ªŸªŸªŸªŸªŸªŸú©Ÿó©Ÿ쩟婟Þ©ŸשŸЩŸÉ©Ÿ©Ÿ»©Ÿ´©Ÿ­©Ÿ¦©ŸŸ©Ÿ˜©Ÿ‘©ŸŠ©Ÿƒ©Ÿ|©Ÿu©Ÿn©Ÿg©Ÿ`©ŸY©ŸR©ŸK©ŸD©Ÿ=©Ÿ6©Ÿ/©Ÿ(©Ÿ!©Ÿ©Ÿ©Ÿ ©Ÿ©Ÿþ¨Ÿ÷¨Ÿð¨Ÿ騟⨟Û¨ŸÔ¨ŸͨŸƨŸ¿¨Ÿ¸¨Ÿ±¨Ÿª¨Ÿ£¨Ÿœ¨Ÿ•¨ŸލŸ‡¨Ÿ€¨Ÿy¨Ÿr¨Ÿk¨Ÿd¨Ÿ]¨ŸV¨ŸO¨ŸH¨ŸA¨Ÿ:¨Ÿ3¨Ÿ,¨Ÿ%¨Ÿ¨Ÿ¨Ÿ¨Ÿ ¨Ÿ¨Ÿû§Ÿô§Ÿí§Ÿæ§Ÿß§ŸاŸѧŸʧŸçŸ¼§Ÿµ§Ÿ®§Ÿ§§Ÿ §Ÿ™§Ÿ’§Ÿ‹§Ÿ„§Ÿ}§Ÿv§Ÿo§Ÿh§Ÿa§ŸZ§ŸS§ŸL§ŸE§Ÿ>§Ÿ7§Ÿ0§Ÿ)§Ÿ"§Ÿ§Ÿ§Ÿ §Ÿ§Ÿÿ¦Ÿø¦Ÿñ¦Ÿꦟ㦟ܦŸÕ¦ŸΦŸǦŸÀ¦Ÿ¹¦Ÿ²¦Ÿ«¦Ÿ¤¦Ÿ¦Ÿ–¦Ÿ¦Ÿˆ¦Ÿ¦Ÿz¦Ÿs¦Ÿl¦Ÿe¦Ÿ^¦ŸW¦ŸP¦ŸI¦ŸB¦Ÿ;¦Ÿ4¦Ÿ-¦Ÿ&¦Ÿ¦Ÿ¦Ÿ¦Ÿ ¦Ÿ¦Ÿü¥Ÿõ¥Ÿ祟य़Ù¥ŸÒ¥ŸË¥ŸÄ¥Ÿ½¥Ÿ¶¥Ÿ¯¥Ÿ¨¥Ÿ¡¥Ÿš¥Ÿ“¥ŸŒ¥Ÿ…¥Ÿ~¥Ÿw¥Ÿp¥Ÿi¥Ÿb¥Ÿ[¥ŸT¥ŸM¥ŸF¥Ÿ?¥Ÿ8¥Ÿ1¥Ÿ*¥Ÿ#¥Ÿ¥Ÿ¥Ÿ¥Ÿ¥Ÿ¥Ÿù¤Ÿò¤Ÿ뤟䤟ݤŸÖ¤ŸϤŸȤŸÁ¤Ÿº¤Ÿ³¤Ÿ¬¤Ÿ¥¤Ÿž¤Ÿ—¤Ÿ¤Ÿ‰¤Ÿ‚¤Ÿ{¤Ÿt¤Ÿm¤Ÿf¤Ÿ_¤ŸX¤ŸQ¤ŸJ¤ŸC¤Ÿ<¤Ÿ5¤Ÿ.¤Ÿ'¤Ÿ ¤Ÿ¤Ÿ¤Ÿ ¤Ÿ¤Ÿý£Ÿö£Ÿ裟ᣟÚ£ŸÓ£ŸÌ£ŸÅ£Ÿ¾£Ÿ·£Ÿ°£Ÿ©£Ÿ¢£Ÿ›£Ÿ”£Ÿ£Ÿ†£Ÿ£Ÿx£Ÿq£Ÿj£Ÿc£Ÿ\£ŸU£ŸN£ŸG£Ÿ@£Ÿ9£Ÿ2£Ÿ+£Ÿ$£Ÿ£Ÿ£Ÿ£Ÿ£Ÿ£Ÿú¢Ÿó¢Ÿ좟墟Þ¢Ÿ×¢ŸТŸÉ¢Ÿ¢Ÿ»¢Ÿ´¢Ÿ­¢Ÿ¦¢ŸŸ¢Ÿ˜¢Ÿ‘¢ŸŠ¢Ÿƒ¢Ÿ|¢Ÿu¢Ÿn¢Ÿg¢Ÿ`¢ŸY¢ŸR¢ŸK¢ŸD¢Ÿ=¢Ÿ6¢Ÿ/¢Ÿ(¢Ÿ!¢Ÿ¢Ÿ¢Ÿ ¢Ÿ¢Ÿþ¡Ÿ÷¡Ÿð¡Ÿ顟⡟Û¡ŸÔ¡ŸÍ¡ŸÆ¡Ÿ¿¡Ÿ¸¡Ÿ±¡Ÿª¡Ÿ£¡Ÿœ¡Ÿ•¡ŸŽ¡Ÿ‡¡Ÿ€¡Ÿy¡Ÿr¡Ÿk¡Ÿd¡Ÿ]¡ŸV¡ŸO¡ŸH¡ŸA¡Ÿ:¡Ÿ3¡Ÿ,¡Ÿ%¡Ÿ¡Ÿ¡Ÿ¡Ÿ ¡Ÿ¡Ÿû Ÿô Ÿí Ÿæ Ÿß ŸØ ŸÑ ŸÊ ŸàŸ¼ Ÿµ Ÿ® Ÿ§ Ÿ  Ÿ™ Ÿ’ Ÿ‹ Ÿ„ Ÿ} Ÿv Ÿo Ÿh Ÿa ŸZ ŸS ŸL ŸE Ÿ> Ÿ7 Ÿ0 Ÿ) Ÿ" Ÿ Ÿ Ÿ  Ÿ ŸÿŸŸøŸŸñŸŸ꟟㟟ÜŸŸÕŸŸΟŸÇŸŸÀŸŸ¹ŸŸ²ŸŸ«ŸŸ¤ŸŸŸŸ–ŸŸŸŸˆŸŸŸŸzŸŸsŸŸlŸŸeŸŸ^ŸŸWŸŸPŸŸIŸŸBŸŸ;ŸŸ4ŸŸ-ŸŸ&ŸŸŸŸŸŸŸŸ ŸŸŸŸüžŸõžŸ瞟àžŸÙžŸÒžŸËžŸÄžŸ½žŸ¶žŸ¯žŸ¨žŸ¡žŸšžŸ“žŸŒžŸ…žŸ~žŸwžŸpžŸižŸbžŸ[žŸTžŸMžŸFžŸ?žŸ8žŸ1žŸ*žŸ#žŸžŸžŸžŸžŸžŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýœŸöœŸ蜟ᜟÚœŸÓœŸÌœŸÅœŸ¾œŸ·œŸ°œŸ©œŸ¢œŸ›œŸ”œŸœŸ†œŸœŸxœŸqœŸjœŸcœŸ\œŸUœŸNœŸGœŸ@œŸ9œŸ2œŸ+œŸ$œŸœŸœŸœŸœŸœŸú›Ÿó›Ÿ웟囟Þ›Ÿ×›ŸЛŸÉ›Ÿ›Ÿ»›Ÿ´›Ÿ­›Ÿ¦›ŸŸ›Ÿ˜›Ÿ‘›ŸŠ›Ÿƒ›Ÿ|›Ÿu›Ÿn›Ÿg›Ÿ`›ŸY›ŸR›ŸK›ŸD›Ÿ=›Ÿ6›Ÿ/›Ÿ(›Ÿ!›Ÿ›Ÿ›Ÿ ›Ÿ›ŸþšŸ÷šŸðšŸ隟⚟ÛšŸÔšŸÍšŸÆšŸ¿šŸ¸šŸ±šŸªšŸ£šŸœšŸ•šŸŽšŸ‡šŸ€šŸyšŸršŸkšŸdšŸ]šŸVšŸOšŸHšŸAšŸ:šŸ3šŸ,šŸ%šŸšŸšŸšŸ šŸšŸû™Ÿô™Ÿ홟晟ß™ŸØ™ŸÑ™ŸÊ™ŸÙŸ¼™Ÿµ™Ÿ®™Ÿ§™Ÿ ™Ÿ™™Ÿ’™Ÿ‹™Ÿ„™Ÿ}™Ÿv™Ÿo™Ÿh™Ÿa™ŸZ™ŸS™ŸL™ŸE™Ÿ>™Ÿ7™Ÿ0™Ÿ)™Ÿ"™Ÿ™Ÿ™Ÿ ™Ÿ™Ÿÿ˜Ÿø˜Ÿñ˜Ÿꘟ㘟ܘŸÕ˜ŸΘŸǘŸÀ˜Ÿ¹˜Ÿ²˜Ÿ«˜Ÿ¤˜Ÿ˜Ÿ–˜Ÿ˜Ÿˆ˜Ÿ˜Ÿz˜Ÿs˜Ÿl˜Ÿe˜Ÿ^˜ŸW˜ŸP˜ŸI˜ŸB˜Ÿ;˜Ÿ4˜Ÿ-˜Ÿ&˜Ÿ˜Ÿ˜Ÿ˜Ÿ ˜Ÿ˜Ÿü—Ÿõ—Ÿî—Ÿç—Ÿà—ŸÙ—ŸÒ—ŸË—ŸÄ—Ÿ½—Ÿ¶—Ÿ¯—Ÿ¨—Ÿ¡—Ÿš—Ÿ“—ŸŒ—Ÿ…—Ÿ~—Ÿw—Ÿp—Ÿi—Ÿb—Ÿ[—ŸT—ŸM—ŸF—Ÿ?—Ÿ8—Ÿ1—Ÿ*—Ÿ#—Ÿ—Ÿ—Ÿ—Ÿ—Ÿ—Ÿù–Ÿò–Ÿë–Ÿä–ŸÝ–ŸÖ–ŸÏ–ŸÈ–ŸÁ–Ÿº–Ÿ³–Ÿ¬–Ÿ¥–Ÿž–Ÿ—–Ÿ–Ÿ‰–Ÿ‚–Ÿ{–Ÿt–Ÿm–Ÿf–Ÿ_–ŸX–ŸQ–ŸJ–ŸC–Ÿ<–Ÿ5–Ÿ.–Ÿ'–Ÿ –Ÿ–Ÿ–Ÿ –Ÿ–Ÿý•Ÿö•Ÿ蕟ᕟÚ•ŸÓ•ŸÌ•ŸÅ•Ÿ¾•Ÿ·•Ÿ°•Ÿ©•Ÿ¢•Ÿ›•Ÿ”•Ÿ•Ÿ†•Ÿ•Ÿx•Ÿq•Ÿj•Ÿc•Ÿ\•ŸU•ŸN•ŸG•Ÿ@•Ÿ9•Ÿ2•Ÿ+•Ÿ$•Ÿ•Ÿ•Ÿ•Ÿ•Ÿ•Ÿú”Ÿó”Ÿ씟唟Þ”Ÿ×”ŸДŸÉ”Ÿ”Ÿ»”Ÿ´”Ÿ­”Ÿ¦”ŸŸ”Ÿ˜”Ÿ‘”ŸŠ”Ÿƒ”Ÿ|”Ÿu”Ÿn”Ÿg”Ÿ`”ŸY”ŸR”ŸK”ŸD”Ÿ=”Ÿ6”Ÿ/”Ÿ(”Ÿ!”Ÿ”Ÿ”Ÿ ”Ÿ”Ÿþ“Ÿ÷“Ÿð“Ÿ铟ⓟÛ“ŸÔ“ŸÍ“ŸÆ“Ÿ¿“Ÿ¸“Ÿ±“Ÿª“Ÿ£“Ÿœ“Ÿ•“ŸŽ“Ÿ‡“Ÿ€“Ÿy“Ÿr“Ÿk“Ÿd“Ÿ]“ŸV“ŸO“ŸH“ŸA“Ÿ:“Ÿ3“Ÿ,“Ÿ%“Ÿ“Ÿ“Ÿ“Ÿ “Ÿ“Ÿû’Ÿô’Ÿí’Ÿæ’Ÿß’ŸØ’ŸÑ’ŸÊ’ŸÃ’Ÿ¼’Ÿµ’Ÿ®’Ÿ§’Ÿ ’Ÿ™’Ÿ’’Ÿ‹’Ÿ„’Ÿ}’Ÿv’Ÿo’Ÿh’Ÿa’ŸZ’ŸS’ŸL’ŸE’Ÿ>’Ÿ7’Ÿ0’Ÿ)’Ÿ"’Ÿ’Ÿ’Ÿ ’Ÿ’Ÿÿ‘Ÿø‘Ÿñ‘Ÿꑟ㑟Ü‘ŸÕ‘ŸΑŸÇ‘ŸÀ‘Ÿ¹‘Ÿ²‘Ÿ«‘Ÿ¤‘Ÿ‘Ÿ–‘Ÿ‘Ÿˆ‘Ÿ‘Ÿz‘Ÿs‘Ÿl‘Ÿe‘Ÿ^‘ŸW‘ŸP‘ŸI‘ŸB‘Ÿ;‘Ÿ4‘Ÿ-‘Ÿ&‘Ÿ‘Ÿ‘Ÿ‘Ÿ ‘Ÿ‘ŸüŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýŽŸöŽŸ莟᎟ÚŽŸÓŽŸÌŽŸÅŽŸ¾ŽŸ·ŽŸ°ŽŸ©ŽŸ¢ŽŸ›ŽŸ”ŽŸŽŸ†ŽŸŽŸxŽŸqŽŸjŽŸcŽŸ\ŽŸUŽŸNŽŸGŽŸ@ŽŸ9ŽŸ2ŽŸ+ŽŸ$ŽŸŽŸŽŸŽŸŽŸŽŸúŸóŸìŸåŸÞŸןПÉŸŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŒŸ÷ŒŸðŒŸ錟⌟ÛŒŸÔŒŸÍŒŸÆŒŸ¿ŒŸ¸ŒŸ±ŒŸªŒŸ£ŒŸœŒŸ•ŒŸŽŒŸ‡ŒŸ€ŒŸyŒŸrŒŸkŒŸdŒŸ]ŒŸVŒŸOŒŸHŒŸAŒŸ:ŒŸ3ŒŸ,ŒŸ%ŒŸŒŸŒŸŒŸ ŒŸŒŸû‹Ÿô‹Ÿ틟拟ß‹ŸØ‹ŸÑ‹ŸÊ‹ŸËŸ¼‹Ÿµ‹Ÿ®‹Ÿ§‹Ÿ ‹Ÿ™‹Ÿ’‹Ÿ‹‹Ÿ„‹Ÿ}‹Ÿv‹Ÿo‹Ÿh‹Ÿa‹ŸZ‹ŸS‹ŸL‹ŸE‹Ÿ>‹Ÿ7‹Ÿ0‹Ÿ)‹Ÿ"‹Ÿ‹Ÿ‹Ÿ ‹Ÿ‹ŸÿŠŸøŠŸñŠŸꊟ㊟ÜŠŸÕŠŸΊŸÇŠŸÀŠŸ¹ŠŸ²ŠŸ«ŠŸ¤ŠŸŠŸ–ŠŸŠŸˆŠŸŠŸzŠŸsŠŸlŠŸeŠŸ^ŠŸWŠŸPŠŸIŠŸBŠŸ;ŠŸ4ŠŸ-ŠŸ&ŠŸŠŸŠŸŠŸ ŠŸŠŸü‰Ÿõ‰Ÿ牟à‰ŸÙ‰ŸÒ‰ŸˉŸĉŸ½‰Ÿ¶‰Ÿ¯‰Ÿ¨‰Ÿ¡‰Ÿš‰Ÿ“‰ŸŒ‰Ÿ…‰Ÿ~‰Ÿw‰Ÿp‰Ÿi‰Ÿb‰Ÿ[‰ŸT‰ŸM‰ŸF‰Ÿ?‰Ÿ8‰Ÿ1‰Ÿ*‰Ÿ#‰Ÿ‰Ÿ‰Ÿ‰Ÿ‰Ÿ‰ŸùˆŸòˆŸ눟䈟݈ŸÖˆŸψŸȈŸÁˆŸºˆŸ³ˆŸ¬ˆŸ¥ˆŸžˆŸ—ˆŸˆŸ‰ˆŸ‚ˆŸ{ˆŸtˆŸmˆŸfˆŸ_ˆŸXˆŸQˆŸJˆŸCˆŸ<ˆŸ5ˆŸ.ˆŸ'ˆŸ ˆŸˆŸˆŸ ˆŸˆŸý‡Ÿö‡Ÿ臟ᇟÚ‡ŸÓ‡Ÿ̇ŸŇŸ¾‡Ÿ·‡Ÿ°‡Ÿ©‡Ÿ¢‡Ÿ›‡Ÿ”‡Ÿ‡Ÿ†‡Ÿ‡Ÿx‡Ÿq‡Ÿj‡Ÿc‡Ÿ\‡ŸU‡ŸN‡ŸG‡Ÿ@‡Ÿ9‡Ÿ2‡Ÿ+‡Ÿ$‡Ÿ‡Ÿ‡Ÿ‡Ÿ‡Ÿ‡Ÿú†Ÿó†Ÿ솟冟Þ†Ÿ׆ŸІŸɆŸ†Ÿ»†Ÿ´†Ÿ­†Ÿ¦†ŸŸ†Ÿ˜†Ÿ‘†ŸІŸƒ†Ÿ|†Ÿu†Ÿn†Ÿg†Ÿ`†ŸY†ŸR†ŸK†ŸD†Ÿ=†Ÿ6†Ÿ/†Ÿ(†Ÿ!†Ÿ†Ÿ†Ÿ †Ÿ†Ÿþ…Ÿ÷…Ÿð…Ÿé…Ÿâ…ŸÛ…ŸÔ…ŸÍ…ŸÆ…Ÿ¿…Ÿ¸…Ÿ±…Ÿª…Ÿ£…Ÿœ…Ÿ•…ŸŽ…Ÿ‡…Ÿ€…Ÿy…Ÿr…Ÿk…Ÿd…Ÿ]…ŸV…ŸO…ŸH…ŸA…Ÿ:…Ÿ3…Ÿ,…Ÿ%…Ÿ…Ÿ…Ÿ…Ÿ …Ÿ…Ÿû„Ÿô„Ÿ턟感ß„ŸØ„ŸÑ„ŸÊ„ŸÄŸ¼„Ÿµ„Ÿ®„Ÿ§„Ÿ „Ÿ™„Ÿ’„Ÿ‹„Ÿ„„Ÿ}„Ÿv„Ÿo„Ÿh„Ÿa„ŸZ„ŸS„ŸL„ŸE„Ÿ>„Ÿ7„Ÿ0„Ÿ)„Ÿ"„Ÿ„Ÿ„Ÿ „Ÿ„ŸÿƒŸøƒŸñƒŸꃟミ܃ŸÕƒŸ΃ŸǃŸÀƒŸ¹ƒŸ²ƒŸ«ƒŸ¤ƒŸƒŸ–ƒŸƒŸˆƒŸƒŸzƒŸsƒŸlƒŸeƒŸ^ƒŸWƒŸPƒŸIƒŸBƒŸ;ƒŸ4ƒŸ-ƒŸ&ƒŸƒŸƒŸƒŸ ƒŸƒŸü‚Ÿõ‚Ÿ炟à‚ŸÙ‚ŸÒ‚ŸË‚ŸÄ‚Ÿ½‚Ÿ¶‚Ÿ¯‚Ÿ¨‚Ÿ¡‚Ÿš‚Ÿ“‚ŸŒ‚Ÿ…‚Ÿ~‚Ÿw‚Ÿp‚Ÿi‚Ÿb‚Ÿ[‚ŸT‚ŸM‚ŸF‚Ÿ?‚Ÿ8‚Ÿ1‚Ÿ*‚Ÿ#‚Ÿ‚Ÿ‚Ÿ‚Ÿ‚Ÿ‚ŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸý€Ÿö€Ÿ耟ဟÚ€ŸÓ€ŸÌ€ŸÅ€Ÿ¾€Ÿ·€Ÿ°€Ÿ©€Ÿ¢€Ÿ›€Ÿ”€Ÿ€Ÿ†€Ÿ€Ÿx€Ÿq€Ÿj€Ÿc€Ÿ\€ŸU€ŸN€ŸG€Ÿ@€Ÿ9€Ÿ2€Ÿ+€Ÿ$€Ÿ€Ÿ€Ÿ€Ÿ€Ÿ€ŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþ~Ÿ÷~Ÿð~Ÿé~Ÿâ~ŸÛ~ŸÔ~ŸÍ~ŸÆ~Ÿ¿~Ÿ¸~Ÿ±~Ÿª~Ÿ£~Ÿœ~Ÿ•~ŸŽ~Ÿ‡~Ÿ€~Ÿy~Ÿr~Ÿk~Ÿd~Ÿ]~ŸV~ŸO~ŸH~ŸA~Ÿ:~Ÿ3~Ÿ,~Ÿ%~Ÿ~Ÿ~Ÿ~Ÿ ~Ÿ~Ÿû}Ÿô}Ÿí}Ÿæ}Ÿß}ŸØ}ŸÑ}ŸÊ}ŸÃ}Ÿ¼}Ÿµ}Ÿ®}Ÿ§}Ÿ }Ÿ™}Ÿ’}Ÿ‹}Ÿ„}Ÿ}}Ÿv}Ÿo}Ÿh}Ÿa}ŸZ}ŸS}ŸL}ŸE}Ÿ>}Ÿ7}Ÿ0}Ÿ)}Ÿ"}Ÿ}Ÿ}Ÿ }Ÿ}Ÿÿ|Ÿø|Ÿñ|Ÿê|Ÿã|ŸÜ|ŸÕ|ŸÎ|ŸÇ|ŸÀ|Ÿ¹|Ÿ²|Ÿ«|Ÿ¤|Ÿ|Ÿ–|Ÿ|Ÿˆ|Ÿ|Ÿz|Ÿs|Ÿl|Ÿe|Ÿ^|ŸW|ŸP|ŸI|ŸB|Ÿ;|Ÿ4|Ÿ-|Ÿ&|Ÿ|Ÿ|Ÿ|Ÿ |Ÿ|Ÿü{Ÿõ{Ÿî{Ÿç{Ÿà{ŸÙ{ŸÒ{ŸË{ŸÄ{Ÿ½{Ÿ¶{Ÿ¯{Ÿ¨{Ÿ¡{Ÿš{Ÿ“{ŸŒ{Ÿ…{Ÿ~{Ÿw{Ÿp{Ÿi{Ÿb{Ÿ[{ŸT{ŸM{ŸF{Ÿ?{Ÿ8{Ÿ1{Ÿ*{Ÿ#{Ÿ{Ÿ{Ÿ{Ÿ{Ÿ{ŸùzŸòzŸëzŸäzŸÝzŸÖzŸÏzŸÈzŸÁzŸºzŸ³zŸ¬zŸ¥zŸžzŸ—zŸzŸ‰zŸ‚zŸ{zŸtzŸmzŸfzŸ_zŸXzŸQzŸJzŸCzŸvŸ7vŸ0vŸ)vŸ"vŸvŸvŸ vŸvŸÿuŸøuŸñuŸêuŸãuŸÜuŸÕuŸÎuŸÇuŸÀuŸ¹uŸ²uŸ«uŸ¤uŸuŸ–uŸuŸˆuŸuŸzuŸsuŸluŸeuŸ^uŸWuŸPuŸIuŸBuŸ;uŸ4uŸ-uŸ&uŸuŸuŸuŸ uŸuŸütŸõtŸîtŸçtŸàtŸÙtŸÒtŸËtŸÄtŸ½tŸ¶tŸ¯tŸ¨tŸ¡tŸštŸ“tŸŒtŸ…tŸ~tŸwtŸptŸitŸbtŸ[tŸTtŸMtŸFtŸ?tŸ8tŸ1tŸ*tŸ#tŸtŸtŸtŸtŸtŸùsŸòsŸësŸäsŸÝsŸÖsŸÏsŸÈsŸÁsŸºsŸ³sŸ¬sŸ¥sŸžsŸ—sŸsŸ‰sŸ‚sŸ{sŸtsŸmsŸfsŸ_sŸXsŸQsŸJsŸCsŸoŸ7oŸ0oŸ)oŸ"oŸoŸoŸ oŸoŸÿnŸønŸñnŸênŸãnŸÜnŸÕnŸÎnŸÇnŸÀnŸ¹nŸ²nŸ«nŸ¤nŸnŸ–nŸnŸˆnŸnŸznŸsnŸlnŸenŸ^nŸWnŸPnŸInŸBnŸ;nŸ4nŸ-nŸ&nŸnŸnŸnŸ nŸnŸümŸõmŸîmŸçmŸàmŸÙmŸÒmŸËmŸÄmŸ½mŸ¶mŸ¯mŸ¨mŸ¡mŸšmŸ“mŸŒmŸ…mŸ~mŸwmŸpmŸimŸbmŸ[mŸTmŸMmŸFmŸ?mŸ8mŸ1mŸ*mŸ#mŸmŸmŸmŸmŸmŸùlŸòlŸëlŸälŸÝlŸÖlŸÏlŸÈlŸÁlŸºlŸ³lŸ¬lŸ¥lŸžlŸ—lŸlŸ‰lŸ‚lŸ{lŸtlŸmlŸflŸ_lŸXlŸQlŸJlŸClŸhŸ7hŸ0hŸ)hŸ"hŸhŸhŸ hŸhŸÿgŸøgŸñgŸêgŸãgŸÜgŸÕgŸÎgŸÇgŸÀgŸ¹gŸ²gŸ«gŸ¤gŸgŸ–gŸgŸˆgŸgŸzgŸsgŸlgŸegŸ^gŸWgŸPgŸIgŸBgŸ;gŸ4gŸ-gŸ&gŸgŸgŸgŸ gŸgŸüfŸõfŸîfŸçfŸàfŸÙfŸÒfŸËfŸÄfŸ½fŸ¶fŸ¯fŸ¨fŸ¡fŸšfŸ“fŸŒfŸ…fŸ~fŸwfŸpfŸifŸbfŸ[fŸTfŸMfŸFfŸ?fŸ8fŸ1fŸ*fŸ#fŸfŸfŸfŸfŸfŸùeŸòeŸëeŸäeŸÝeŸÖeŸÏeŸÈeŸÁeŸºeŸ³eŸ¬eŸ¥eŸžeŸ—eŸeŸ‰eŸ‚eŸ{eŸteŸmeŸfeŸ_eŸXeŸQeŸJeŸCeŸaŸ7aŸ0aŸ)aŸ"aŸaŸaŸ aŸaŸÿ`Ÿø`Ÿñ`Ÿê`Ÿã`ŸÜ`ŸÕ`ŸÎ`ŸÇ`ŸÀ`Ÿ¹`Ÿ²`Ÿ«`Ÿ¤`Ÿ`Ÿ–`Ÿ`Ÿˆ`Ÿ`Ÿz`Ÿs`Ÿl`Ÿe`Ÿ^`ŸW`ŸP`ŸI`ŸB`Ÿ;`Ÿ4`Ÿ-`Ÿ&`Ÿ`Ÿ`Ÿ`Ÿ `Ÿ`Ÿü_Ÿõ_Ÿî_Ÿç_Ÿà_ŸÙ_ŸÒ_ŸË_ŸÄ_Ÿ½_Ÿ¶_Ÿ¯_Ÿ¨_Ÿ¡_Ÿš_Ÿ“_ŸŒ_Ÿ…_Ÿ~_Ÿw_Ÿp_Ÿi_Ÿb_Ÿ[_ŸT_ŸM_ŸF_Ÿ?_Ÿ8_Ÿ1_Ÿ*_Ÿ#_Ÿ_Ÿ_Ÿ_Ÿ_Ÿ_Ÿù^Ÿò^Ÿë^Ÿä^ŸÝ^ŸÖ^ŸÏ^ŸÈ^ŸÁ^Ÿº^Ÿ³^Ÿ¬^Ÿ¥^Ÿž^Ÿ—^Ÿ^Ÿ‰^Ÿ‚^Ÿ{^Ÿt^Ÿm^Ÿf^Ÿ_^ŸX^ŸQ^ŸJ^ŸC^Ÿ<^Ÿ5^Ÿ.^Ÿ'^Ÿ ^Ÿ^Ÿ^Ÿ ^Ÿ^Ÿý]Ÿö]Ÿï]Ÿè]Ÿá]ŸÚ]ŸÓ]ŸÌ]ŸÅ]Ÿ¾]Ÿ·]Ÿ°]Ÿ©]Ÿ¢]Ÿ›]Ÿ”]Ÿ]Ÿ†]Ÿ]Ÿx]Ÿq]Ÿj]Ÿc]Ÿ\]ŸU]ŸN]ŸG]Ÿ@]Ÿ9]Ÿ2]Ÿ+]Ÿ$]Ÿ]Ÿ]Ÿ]Ÿ]Ÿ]Ÿú\Ÿó\Ÿì\Ÿå\ŸÞ\Ÿ×\ŸÐ\ŸÉ\ŸÂ\Ÿ»\Ÿ´\Ÿ­\Ÿ¦\ŸŸ\Ÿ˜\Ÿ‘\ŸŠ\Ÿƒ\Ÿ|\Ÿu\Ÿn\Ÿg\Ÿ`\ŸY\ŸR\ŸK\ŸD\Ÿ=\Ÿ6\Ÿ/\Ÿ(\Ÿ!\Ÿ\Ÿ\Ÿ \Ÿ\Ÿþ[Ÿ÷[Ÿð[Ÿé[Ÿâ[ŸÛ[ŸÔ[ŸÍ[ŸÆ[Ÿ¿[Ÿ¸[Ÿ±[Ÿª[Ÿ£[Ÿœ[Ÿ•[ŸŽ[Ÿ‡[Ÿ€[Ÿy[Ÿr[Ÿk[Ÿd[Ÿ][ŸV[ŸO[ŸH[ŸA[Ÿ:[Ÿ3[Ÿ,[Ÿ%[Ÿ[Ÿ[Ÿ[Ÿ [Ÿ[ŸûZŸôZŸíZŸæZŸßZŸØZŸÑZŸÊZŸÃZŸ¼ZŸµZŸ®ZŸ§ZŸ ZŸ™ZŸ’ZŸ‹ZŸ„ZŸ}ZŸvZŸoZŸhZŸaZŸZZŸSZŸLZŸEZŸ>ZŸ7ZŸ0ZŸ)ZŸ"ZŸZŸZŸ ZŸZŸÿYŸøYŸñYŸêYŸãYŸÜYŸÕYŸÎYŸÇYŸÀYŸ¹YŸ²YŸ«YŸ¤YŸYŸ–YŸYŸˆYŸYŸzYŸsYŸlYŸeYŸ^YŸWYŸPYŸIYŸBYŸ;YŸ4YŸ-YŸ&YŸYŸYŸYŸ YŸYŸüXŸõXŸîXŸçXŸàXŸÙXŸÒXŸËXŸÄXŸ½XŸ¶XŸ¯XŸ¨XŸ¡XŸšXŸ“XŸŒXŸ…XŸ~XŸwXŸpXŸiXŸbXŸ[XŸTXŸMXŸFXŸ?XŸ8XŸ1XŸ*XŸ#XŸXŸXŸXŸXŸXŸùWŸòWŸëWŸäWŸÝWŸÖWŸÏWŸÈWŸÁWŸºWŸ³WŸ¬WŸ¥WŸžWŸ—WŸWŸ‰WŸ‚WŸ{WŸtWŸmWŸfWŸ_WŸXWŸQWŸJWŸCWŸSŸ7SŸ0SŸ)SŸ"SŸSŸSŸ SŸSŸÿRŸøRŸñRŸêRŸãRŸÜRŸÕRŸÎRŸÇRŸÀRŸ¹RŸ²RŸ«RŸ¤RŸRŸ–RŸRŸˆRŸRŸzRŸsRŸlRŸeRŸ^RŸWRŸPRŸIRŸBRŸ;RŸ4RŸ-RŸ&RŸRŸRŸRŸ RŸRŸüQŸõQŸîQŸçQŸàQŸÙQŸÒQŸËQŸÄQŸ½QŸ¶QŸ¯QŸ¨QŸ¡QŸšQŸ“QŸŒQŸ…QŸ~QŸwQŸpQŸiQŸbQŸ[QŸTQŸMQŸFQŸ?QŸ8QŸ1QŸ*QŸ#QŸQŸQŸQŸQŸQŸùPŸòPŸëPŸäPŸÝPŸÖPŸÏPŸÈPŸÁPŸºPŸ³PŸ¬PŸ¥PŸžPŸ—PŸPŸ‰PŸ‚PŸ{PŸtPŸmPŸfPŸ_PŸXPŸQPŸJPŸCPŸLŸ7LŸ0LŸ)LŸ"LŸLŸLŸ LŸLŸÿKŸøKŸñKŸêKŸãKŸÜKŸÕKŸÎKŸÇKŸÀKŸ¹KŸ²KŸ«KŸ¤KŸKŸ–KŸKŸˆKŸKŸzKŸsKŸlKŸeKŸ^KŸWKŸPKŸIKŸBKŸ;KŸ4KŸ-KŸ&KŸKŸKŸKŸ KŸKŸüJŸõJŸîJŸçJŸàJŸÙJŸÒJŸËJŸÄJŸ½JŸ¶JŸ¯JŸ¨JŸ¡JŸšJŸ“JŸŒJŸ…JŸ~JŸwJŸpJŸiJŸbJŸ[JŸTJŸMJŸFJŸ?JŸ8JŸ1JŸ*JŸ#JŸJŸJŸJŸJŸJŸùIŸòIŸëIŸäIŸÝIŸÖIŸÏIŸÈIŸÁIŸºIŸ³IŸ¬IŸ¥IŸžIŸ—IŸIŸ‰IŸ‚IŸ{IŸtIŸmIŸfIŸ_IŸXIŸQIŸJIŸCIŸEŸ7EŸ0EŸ)EŸ"EŸEŸEŸ EŸEŸÿDŸøDŸñDŸêDŸãDŸÜDŸÕDŸÎDŸÇDŸÀDŸ¹DŸ²DŸ«DŸ¤DŸDŸ–DŸDŸˆDŸDŸzDŸsDŸlDŸeDŸ^DŸWDŸPDŸIDŸBDŸ;DŸ4DŸ-DŸ&DŸDŸDŸDŸ DŸDŸüCŸõCŸîCŸçCŸàCŸÙCŸÒCŸËCŸÄCŸ½CŸ¶CŸ¯CŸ¨CŸ¡CŸšCŸ“CŸŒCŸ…CŸ~CŸwCŸpCŸiCŸbCŸ[CŸTCŸMCŸFCŸ?CŸ8CŸ1CŸ*CŸ#CŸCŸCŸCŸCŸCŸùBŸòBŸëBŸäBŸÝBŸÖBŸÏBŸÈBŸÁBŸºBŸ³BŸ¬BŸ¥BŸžBŸ—BŸBŸ‰BŸ‚BŸ{BŸtBŸmBŸfBŸ_BŸXBŸQBŸJBŸCBŸŸô>Ÿí>Ÿæ>Ÿß>ŸØ>ŸÑ>ŸÊ>ŸÃ>Ÿ¼>Ÿµ>Ÿ®>Ÿ§>Ÿ >Ÿ™>Ÿ’>Ÿ‹>Ÿ„>Ÿ}>Ÿv>Ÿo>Ÿh>Ÿa>ŸZ>ŸS>ŸL>ŸE>Ÿ>>Ÿ7>Ÿ0>Ÿ)>Ÿ">Ÿ>Ÿ>Ÿ >Ÿ>Ÿÿ=Ÿø=Ÿñ=Ÿê=Ÿã=ŸÜ=ŸÕ=ŸÎ=ŸÇ=ŸÀ=Ÿ¹=Ÿ²=Ÿ«=Ÿ¤=Ÿ=Ÿ–=Ÿ=Ÿˆ=Ÿ=Ÿz=Ÿs=Ÿl=Ÿe=Ÿ^=ŸW=ŸP=ŸI=ŸB=Ÿ;=Ÿ4=Ÿ-=Ÿ&=Ÿ=Ÿ=Ÿ=Ÿ =Ÿ=Ÿü<Ÿõ<Ÿî<Ÿç<Ÿà<ŸÙ<ŸÒ<ŸË<ŸÄ<Ÿ½<Ÿ¶<Ÿ¯<Ÿ¨<Ÿ¡<Ÿš<Ÿ“<ŸŒ<Ÿ…<Ÿ~<Ÿw<Ÿp<Ÿi<Ÿb<Ÿ[<ŸT<ŸM<ŸF<Ÿ?<Ÿ8<Ÿ1<Ÿ*<Ÿ#<Ÿ<Ÿ<Ÿ<Ÿ<Ÿ<Ÿù;Ÿò;Ÿë;Ÿä;ŸÝ;ŸÖ;ŸÏ;ŸÈ;ŸÁ;Ÿº;Ÿ³;Ÿ¬;Ÿ¥;Ÿž;Ÿ—;Ÿ;Ÿ‰;Ÿ‚;Ÿ{;Ÿt;Ÿm;Ÿf;Ÿ_;ŸX;ŸQ;ŸJ;ŸC;Ÿ<;Ÿ5;Ÿ.;Ÿ';Ÿ ;Ÿ;Ÿ;Ÿ ;Ÿ;Ÿý:Ÿö:Ÿï:Ÿè:Ÿá:ŸÚ:ŸÓ:ŸÌ:ŸÅ:Ÿ¾:Ÿ·:Ÿ°:Ÿ©:Ÿ¢:Ÿ›:Ÿ”:Ÿ:Ÿ†:Ÿ:Ÿx:Ÿq:Ÿj:Ÿc:Ÿ\:ŸU:ŸN:ŸG:Ÿ@:Ÿ9:Ÿ2:Ÿ+:Ÿ$:Ÿ:Ÿ:Ÿ:Ÿ:Ÿ:Ÿú9Ÿó9Ÿì9Ÿå9ŸÞ9Ÿ×9ŸÐ9ŸÉ9ŸÂ9Ÿ»9Ÿ´9Ÿ­9Ÿ¦9ŸŸ9Ÿ˜9Ÿ‘9ŸŠ9Ÿƒ9Ÿ|9Ÿu9Ÿn9Ÿg9Ÿ`9ŸY9ŸR9ŸK9ŸD9Ÿ=9Ÿ69Ÿ/9Ÿ(9Ÿ!9Ÿ9Ÿ9Ÿ 9Ÿ9Ÿþ8Ÿ÷8Ÿð8Ÿé8Ÿâ8ŸÛ8ŸÔ8ŸÍ8ŸÆ8Ÿ¿8Ÿ¸8Ÿ±8Ÿª8Ÿ£8Ÿœ8Ÿ•8ŸŽ8Ÿ‡8Ÿ€8Ÿy8Ÿr8Ÿk8Ÿd8Ÿ]8ŸV8ŸO8ŸH8ŸA8Ÿ:8Ÿ38Ÿ,8Ÿ%8Ÿ8Ÿ8Ÿ8Ÿ 8Ÿ8Ÿû7Ÿô7Ÿí7Ÿæ7Ÿß7ŸØ7ŸÑ7ŸÊ7ŸÃ7Ÿ¼7Ÿµ7Ÿ®7Ÿ§7Ÿ 7Ÿ™7Ÿ’7Ÿ‹7Ÿ„7Ÿ}7Ÿv7Ÿo7Ÿh7Ÿa7ŸZ7ŸS7ŸL7ŸE7Ÿ>7Ÿ77Ÿ07Ÿ)7Ÿ"7Ÿ7Ÿ7Ÿ 7Ÿ7Ÿÿ6Ÿø6Ÿñ6Ÿê6Ÿã6ŸÜ6ŸÕ6ŸÎ6ŸÇ6ŸÀ6Ÿ¹6Ÿ²6Ÿ«6Ÿ¤6Ÿ6Ÿ–6Ÿ6Ÿˆ6Ÿ6Ÿz6Ÿs6Ÿl6Ÿe6Ÿ^6ŸW6ŸP6ŸI6ŸB6Ÿ;6Ÿ46Ÿ-6Ÿ&6Ÿ6Ÿ6Ÿ6Ÿ 6Ÿ6Ÿü5Ÿõ5Ÿî5Ÿç5Ÿà5ŸÙ5ŸÒ5ŸË5ŸÄ5Ÿ½5Ÿ¶5Ÿ¯5Ÿ¨5Ÿ¡5Ÿš5Ÿ“5ŸŒ5Ÿ…5Ÿ~5Ÿw5Ÿp5Ÿi5Ÿb5Ÿ[5ŸT5ŸM5ŸF5Ÿ?5Ÿ85Ÿ15Ÿ*5Ÿ#5Ÿ5Ÿ5Ÿ5Ÿ5Ÿ5Ÿù4Ÿò4Ÿë4Ÿä4ŸÝ4ŸÖ4ŸÏ4ŸÈ4ŸÁ4Ÿº4Ÿ³4Ÿ¬4Ÿ¥4Ÿž4Ÿ—4Ÿ4Ÿ‰4Ÿ‚4Ÿ{4Ÿt4Ÿm4Ÿf4Ÿ_4ŸX4ŸQ4ŸJ4ŸC4Ÿ<4Ÿ54Ÿ.4Ÿ'4Ÿ 4Ÿ4Ÿ4Ÿ 4Ÿ4Ÿý3Ÿö3Ÿï3Ÿè3Ÿá3ŸÚ3ŸÓ3ŸÌ3ŸÅ3Ÿ¾3Ÿ·3Ÿ°3Ÿ©3Ÿ¢3Ÿ›3Ÿ”3Ÿ3Ÿ†3Ÿ3Ÿx3Ÿq3Ÿj3Ÿc3Ÿ\3ŸU3ŸN3ŸG3Ÿ@3Ÿ93Ÿ23Ÿ+3Ÿ$3Ÿ3Ÿ3Ÿ3Ÿ3Ÿ3Ÿú2Ÿó2Ÿì2Ÿå2ŸÞ2Ÿ×2ŸÐ2ŸÉ2ŸÂ2Ÿ»2Ÿ´2Ÿ­2Ÿ¦2ŸŸ2Ÿ˜2Ÿ‘2ŸŠ2Ÿƒ2Ÿ|2Ÿu2Ÿn2Ÿg2Ÿ`2ŸY2ŸR2ŸK2ŸD2Ÿ=2Ÿ62Ÿ/2Ÿ(2Ÿ!2Ÿ2Ÿ2Ÿ 2Ÿ2Ÿþ1Ÿ÷1Ÿð1Ÿé1Ÿâ1ŸÛ1ŸÔ1ŸÍ1ŸÆ1Ÿ¿1Ÿ¸1Ÿ±1Ÿª1Ÿ£1Ÿœ1Ÿ•1ŸŽ1Ÿ‡1Ÿ€1Ÿy1Ÿr1Ÿk1Ÿd1Ÿ]1ŸV1ŸO1ŸH1ŸA1Ÿ:1Ÿ31Ÿ,1Ÿ%1Ÿ1Ÿ1Ÿ1Ÿ 1Ÿ1Ÿû0Ÿô0Ÿí0Ÿæ0Ÿß0ŸØ0ŸÑ0ŸÊ0ŸÃ0Ÿ¼0Ÿµ0Ÿ®0Ÿ§0Ÿ 0Ÿ™0Ÿ’0Ÿ‹0Ÿ„0Ÿ}0Ÿv0Ÿo0Ÿh0Ÿa0ŸZ0ŸS0ŸL0ŸE0Ÿ>0Ÿ70Ÿ00Ÿ)0Ÿ"0Ÿ0Ÿ0Ÿ 0Ÿ0Ÿÿ/Ÿø/Ÿñ/Ÿê/Ÿã/ŸÜ/ŸÕ/ŸÎ/ŸÇ/ŸÀ/Ÿ¹/Ÿ²/Ÿ«/Ÿ¤/Ÿ/Ÿ–/Ÿ/Ÿˆ/Ÿ/Ÿz/Ÿs/Ÿl/Ÿe/Ÿ^/ŸW/ŸP/ŸI/ŸB/Ÿ;/Ÿ4/Ÿ-/Ÿ&/Ÿ/Ÿ/Ÿ/Ÿ /Ÿ/Ÿü.Ÿõ.Ÿî.Ÿç.Ÿà.ŸÙ.ŸÒ.ŸË.ŸÄ.Ÿ½.Ÿ¶.Ÿ¯.Ÿ¨.Ÿ¡.Ÿš.Ÿ“.ŸŒ.Ÿ….Ÿ~.Ÿw.Ÿp.Ÿi.Ÿb.Ÿ[.ŸT.ŸM.ŸF.Ÿ?.Ÿ8.Ÿ1.Ÿ*.Ÿ#.Ÿ.Ÿ.Ÿ.Ÿ.Ÿ.Ÿù-Ÿò-Ÿë-Ÿä-ŸÝ-ŸÖ-ŸÏ-ŸÈ-ŸÁ-Ÿº-Ÿ³-Ÿ¬-Ÿ¥-Ÿž-Ÿ—-Ÿ-Ÿ‰-Ÿ‚-Ÿ{-Ÿt-Ÿm-Ÿf-Ÿ_-ŸX-ŸQ-ŸJ-ŸC-Ÿ<-Ÿ5-Ÿ.-Ÿ'-Ÿ -Ÿ-Ÿ-Ÿ -Ÿ-Ÿý,Ÿö,Ÿï,Ÿè,Ÿá,ŸÚ,ŸÓ,ŸÌ,ŸÅ,Ÿ¾,Ÿ·,Ÿ°,Ÿ©,Ÿ¢,Ÿ›,Ÿ”,Ÿ,Ÿ†,Ÿ,Ÿx,Ÿq,Ÿj,Ÿc,Ÿ\,ŸU,ŸN,ŸG,Ÿ@,Ÿ9,Ÿ2,Ÿ+,Ÿ$,Ÿ,Ÿ,Ÿ,Ÿ,Ÿ,Ÿú+Ÿó+Ÿì+Ÿå+ŸÞ+Ÿ×+ŸÐ+ŸÉ+ŸÂ+Ÿ»+Ÿ´+Ÿ­+Ÿ¦+ŸŸ+Ÿ˜+Ÿ‘+ŸŠ+Ÿƒ+Ÿ|+Ÿu+Ÿn+Ÿg+Ÿ`+ŸY+ŸR+ŸK+ŸD+Ÿ=+Ÿ6+Ÿ/+Ÿ(+Ÿ!+Ÿ+Ÿ+Ÿ +Ÿ+Ÿþ*Ÿ÷*Ÿð*Ÿé*Ÿâ*ŸÛ*ŸÔ*ŸÍ*ŸÆ*Ÿ¿*Ÿ¸*Ÿ±*Ÿª*Ÿ£*Ÿœ*Ÿ•*ŸŽ*Ÿ‡*Ÿ€*Ÿy*Ÿr*Ÿk*Ÿd*Ÿ]*ŸV*ŸO*ŸH*ŸA*Ÿ:*Ÿ3*Ÿ,*Ÿ%*Ÿ*Ÿ*Ÿ*Ÿ *Ÿ*Ÿû)Ÿô)Ÿí)Ÿæ)Ÿß)ŸØ)ŸÑ)ŸÊ)ŸÃ)Ÿ¼)Ÿµ)Ÿ®)Ÿ§)Ÿ )Ÿ™)Ÿ’)Ÿ‹)Ÿ„)Ÿ})Ÿv)Ÿo)Ÿh)Ÿa)ŸZ)ŸS)ŸL)ŸE)Ÿ>)Ÿ7)Ÿ0)Ÿ))Ÿ")Ÿ)Ÿ)Ÿ )Ÿ)Ÿÿ(Ÿø(Ÿñ(Ÿê(Ÿã(ŸÜ(ŸÕ(ŸÎ(ŸÇ(ŸÀ(Ÿ¹(Ÿ²(Ÿ«(Ÿ¤(Ÿ(Ÿ–(Ÿ(Ÿˆ(Ÿ(Ÿz(Ÿs(Ÿl(Ÿe(Ÿ^(ŸW(ŸP(ŸI(ŸB(Ÿ;(Ÿ4(Ÿ-(Ÿ&(Ÿ(Ÿ(Ÿ(Ÿ (Ÿ(Ÿü'Ÿõ'Ÿî'Ÿç'Ÿà'ŸÙ'ŸÒ'ŸË'ŸÄ'Ÿ½'Ÿ¶'Ÿ¯'Ÿ¨'Ÿ¡'Ÿš'Ÿ“'ŸŒ'Ÿ…'Ÿ~'Ÿw'Ÿp'Ÿi'Ÿb'Ÿ['ŸT'ŸM'ŸF'Ÿ?'Ÿ8'Ÿ1'Ÿ*'Ÿ#'Ÿ'Ÿ'Ÿ'Ÿ'Ÿ'Ÿù&Ÿò&Ÿë&Ÿä&ŸÝ&ŸÖ&ŸÏ&ŸÈ&ŸÁ&Ÿº&Ÿ³&Ÿ¬&Ÿ¥&Ÿž&Ÿ—&Ÿ&Ÿ‰&Ÿ‚&Ÿ{&Ÿt&Ÿm&Ÿf&Ÿ_&ŸX&ŸQ&ŸJ&ŸC&Ÿ<&Ÿ5&Ÿ.&Ÿ'&Ÿ &Ÿ&Ÿ&Ÿ &Ÿ&Ÿý%Ÿö%Ÿï%Ÿè%Ÿá%ŸÚ%ŸÓ%ŸÌ%ŸÅ%Ÿ¾%Ÿ·%Ÿ°%Ÿ©%Ÿ¢%Ÿ›%Ÿ”%Ÿ%Ÿ†%Ÿ%Ÿx%Ÿq%Ÿj%Ÿc%Ÿ\%ŸU%ŸN%ŸG%Ÿ@%Ÿ9%Ÿ2%Ÿ+%Ÿ$%Ÿ%Ÿ%Ÿ%Ÿ%Ÿ%Ÿú$Ÿó$Ÿì$Ÿå$ŸÞ$Ÿ×$ŸÐ$ŸÉ$ŸÂ$Ÿ»$Ÿ´$Ÿ­$Ÿ¦$ŸŸ$Ÿ˜$Ÿ‘$ŸŠ$Ÿƒ$Ÿ|$Ÿu$Ÿn$Ÿg$Ÿ`$ŸY$ŸR$ŸK$ŸD$Ÿ=$Ÿ6$Ÿ/$Ÿ($Ÿ!$Ÿ$Ÿ$Ÿ $Ÿ$Ÿþ#Ÿ÷#Ÿð#Ÿé#Ÿâ#ŸÛ#ŸÔ#ŸÍ#ŸÆ#Ÿ¿#Ÿ¸#Ÿ±#Ÿª#Ÿ£#Ÿœ#Ÿ•#ŸŽ#Ÿ‡#Ÿ€#Ÿy#Ÿr#Ÿk#Ÿd#Ÿ]#ŸV#ŸO#ŸH#ŸA#Ÿ:#Ÿ3#Ÿ,#Ÿ%#Ÿ#Ÿ#Ÿ#Ÿ #Ÿ#Ÿû"Ÿô"Ÿí"Ÿæ"Ÿß"ŸØ"ŸÑ"ŸÊ"ŸÃ"Ÿ¼"Ÿµ"Ÿ®"Ÿ§"Ÿ "Ÿ™"Ÿ’"Ÿ‹"Ÿ„"Ÿ}"Ÿv"Ÿo"Ÿh"Ÿa"ŸZ"ŸS"ŸL"ŸE"Ÿ>"Ÿ7"Ÿ0"Ÿ)"Ÿ""Ÿ"Ÿ"Ÿ "Ÿ"Ÿÿ!Ÿø!Ÿñ!Ÿê!Ÿã!ŸÜ!ŸÕ!ŸÎ!ŸÇ!ŸÀ!Ÿ¹!Ÿ²!Ÿ«!Ÿ¤!Ÿ!Ÿ–!Ÿ!Ÿˆ!Ÿ!Ÿz!Ÿs!Ÿl!Ÿe!Ÿ^!ŸW!ŸP!ŸI!ŸB!Ÿ;!Ÿ4!Ÿ-!Ÿ&!Ÿ!Ÿ!Ÿ!Ÿ !Ÿ!Ÿü Ÿõ Ÿî Ÿç Ÿà ŸÙ ŸÒ ŸË ŸÄ Ÿ½ Ÿ¶ Ÿ¯ Ÿ¨ Ÿ¡ Ÿš Ÿ“ ŸŒ Ÿ… Ÿ~ Ÿw Ÿp Ÿi Ÿb Ÿ[ ŸT ŸM ŸF Ÿ? Ÿ8 Ÿ1 Ÿ* Ÿ# Ÿ Ÿ Ÿ Ÿ Ÿ ŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûŸôŸíŸæŸßŸØŸÑŸÊŸÃŸ¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿŸøŸñŸêŸãŸÜŸÕŸÎŸÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûŸôŸíŸæŸßŸØŸÑŸÊŸÃŸ¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿŸøŸñŸêŸãŸÜŸÕŸÎŸÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸû Ÿô Ÿí Ÿæ Ÿß ŸØ ŸÑ ŸÊ Ÿà Ÿ¼ Ÿµ Ÿ® Ÿ§ Ÿ  Ÿ™ Ÿ’ Ÿ‹ Ÿ„ Ÿ} Ÿv Ÿo Ÿh Ÿa ŸZ ŸS ŸL ŸE Ÿ> Ÿ7 Ÿ0 Ÿ) Ÿ" Ÿ Ÿ Ÿ Ÿ Ÿÿ Ÿø Ÿñ Ÿê Ÿã ŸÜ ŸÕ ŸÎ ŸÇ ŸÀ Ÿ¹ Ÿ² Ÿ« Ÿ¤ Ÿ Ÿ– Ÿ Ÿˆ Ÿ Ÿz Ÿs Ÿl Ÿe Ÿ^ ŸW ŸP ŸI ŸB Ÿ; Ÿ4 Ÿ- Ÿ& Ÿ Ÿ Ÿ Ÿ Ÿ Ÿü Ÿõ Ÿî Ÿç Ÿà ŸÙ ŸÒ ŸË ŸÄ Ÿ½ Ÿ¶ Ÿ¯ Ÿ¨ Ÿ¡ Ÿš Ÿ“ ŸŒ Ÿ… Ÿ~ Ÿw Ÿp Ÿi Ÿb Ÿ[ ŸT ŸM ŸF Ÿ? Ÿ8 Ÿ1 Ÿ* Ÿ# Ÿ Ÿ Ÿ Ÿ Ÿ Ÿù Ÿò Ÿë Ÿä ŸÝ ŸÖ ŸÏ ŸÈ ŸÁ Ÿº Ÿ³ Ÿ¬ Ÿ¥ Ÿž Ÿ— Ÿ Ÿ‰ Ÿ‚ Ÿ{ Ÿt Ÿm Ÿf Ÿ_ ŸX ŸQ ŸJ ŸC Ÿ< Ÿ5 Ÿ. Ÿ' Ÿ Ÿ Ÿ Ÿ Ÿ Ÿý Ÿö Ÿï Ÿè Ÿá ŸÚ ŸÓ ŸÌ ŸÅ Ÿ¾ Ÿ· Ÿ° Ÿ© Ÿ¢ Ÿ› Ÿ” Ÿ Ÿ† Ÿ Ÿx Ÿq Ÿj Ÿc Ÿ\ ŸU ŸN ŸG Ÿ@ Ÿ9 Ÿ2 Ÿ+ Ÿ$ Ÿ Ÿ Ÿ Ÿ Ÿ ŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûŸôŸíŸæŸßŸØŸÑŸÊŸÃŸ¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿŸøŸñŸêŸãŸÜŸÕŸÎŸÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúŸóŸìŸåŸÞŸ×ŸÐŸÉŸÂŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûÿžôÿžíÿžæÿžßÿžØÿžÑÿžÊÿžÃÿž¼ÿžµÿž®ÿž§ÿž ÿž™ÿž’ÿž‹ÿž„ÿž}ÿžvÿžoÿžhÿžaÿžZÿžSÿžLÿžEÿž>ÿž7ÿž0ÿž)ÿž"ÿžÿžÿž ÿžÿžÿþžøþžñþžêþžãþžÜþžÕþžÎþžÇþžÀþž¹þž²þž«þž¤þžþž–þžþžˆþžþžzþžsþžlþžeþž^þžWþžPþžIþžBþž;þž4þž-þž&þžþžþžþž þžþžüýžõýžîýžçýžàýžÙýžÒýžËýžÄýž½ýž¶ýž¯ýž¨ýž¡ýžšýž“ýžŒýž…ýž~ýžwýžpýžiýžbýž[ýžTýžMýžFýž?ýž8ýž1ýž*ýž#ýžýžýžýžýžýžùüžòüžëüžäüžÝüžÖüžÏüžÈüžÁüžºüž³üž¬üž¥üžžüž—üžüž‰üž‚üž{üžtüžmüžfüž_üžXüžQüžJüžCüž<üž5üž.üž'üž üžüžüž üžüžýûžöûžïûžèûžáûžÚûžÓûžÌûžÅûž¾ûž·ûž°ûž©ûž¢ûž›ûž”ûžûž†ûžûžxûžqûžjûžcûž\ûžUûžNûžGûž@ûž9ûž2ûž+ûž$ûžûžûžûžûžûžúúžóúžìúžåúžÞúž×úžÐúžÉúžÂúž»úž´úž­úž¦úžŸúž˜úž‘úžŠúžƒúž|úžuúžnúžgúž`úžYúžRúžKúžDúž=úž6úž/úž(úž!úžúžúž úžúžþùž÷ùžðùžéùžâùžÛùžÔùžÍùžÆùž¿ùž¸ùž±ùžªùž£ùžœùž•ùžŽùž‡ùž€ùžyùžrùžkùždùž]ùžVùžOùžHùžAùž:ùž3ùž,ùž%ùžùžùžùž ùžùžûøžôøžíøžæøžßøžØøžÑøžÊøžÃøž¼øžµøž®øž§øž øž™øž’øž‹øž„øž}øžvøžoøžhøžaøžZøžSøžLøžEøž>øž7øž0øž)øž"øžøžøž øžøžÿ÷žø÷žñ÷žê÷žã÷žÜ÷žÕ÷žÎ÷žÇ÷žÀ÷ž¹÷ž²÷ž«÷ž¤÷ž÷ž–÷ž÷žˆ÷ž÷žz÷žs÷žl÷že÷ž^÷žW÷žP÷žI÷žB÷ž;÷ž4÷ž-÷ž&÷ž÷ž÷ž÷ž ÷ž÷žüöžõöžîöžçöžàöžÙöžÒöžËöžÄöž½öž¶öž¯öž¨öž¡öžšöž“öžŒöž…öž~öžwöžpöžiöžböž[öžTöžMöžFöž?öž8öž1öž*öž#öžöžöžöžöžöžùõžòõžëõžäõžÝõžÖõžÏõžÈõžÁõžºõž³õž¬õž¥õžžõž—õžõž‰õž‚õž{õžtõžmõžfõž_õžXõžQõžJõžCõž<õž5õž.õž'õž õžõžõž õžõžýôžöôžïôžèôžáôžÚôžÓôžÌôžÅôž¾ôž·ôž°ôž©ôž¢ôž›ôž”ôžôž†ôžôžxôžqôžjôžcôž\ôžUôžNôžGôž@ôž9ôž2ôž+ôž$ôžôžôžôžôžôžúóžóóžìóžåóžÞóž×óžÐóžÉóžÂóž»óž´óž­óž¦óžŸóž˜óž‘óžŠóžƒóž|óžuóžnóžgóž`óžYóžRóžKóžDóž=óž6óž/óž(óž!óžóžóž óžóžþòž÷òžðòžéòžâòžÛòžÔòžÍòžÆòž¿òž¸òž±òžªòž£òžœòž•òžŽòž‡òž€òžyòžròžkòždòž]òžVòžOòžHòžAòž:òž3òž,òž%òžòžòžòž òžòžûñžôñžíñžæñžßñžØñžÑñžÊñžÃñž¼ñžµñž®ñž§ñž ñž™ñž’ñž‹ñž„ñž}ñžvñžoñžhñžañžZñžSñžLñžEñž>ñž7ñž0ñž)ñž"ñžñžñž ñžñžÿðžøðžñðžêðžãðžÜðžÕðžÎðžÇðžÀðž¹ðž²ðž«ðž¤ðžðž–ðžðžˆðžðžzðžsðžlðžeðž^ðžWðžPðžIðžBðž;ðž4ðž-ðž&ðžðžðžðž ðžðžüïžõïžîïžçïžàïžÙïžÒïžËïžÄïž~ïžwïžpïžiïžbïž[ïžTïžMïžFïž?ïž8ïž1ïž*ïž#ïžïžïžïžïžïžùîžòîžëîžäîžÝîžÖîžÏîžÈîžÁîžîž‰îž‚îž{îžtîžmîžfîž_îžXîžQîžJîžCîž<îž5îž.îž'îž îžîžîž îžîžýížöížïížèížáížÚížÓížÌížÅힾힷힰ힩힢힛힔ížíž†ížížxížqížjížcíž\ížUížNížGíž@íž9íž2íž+íž$ížížížížížížúìžóìžììžåìžÞìž×ìžÐìžÉìžÂ잻잴잭잦잟잘작잊잃ìž|ìžuìžnìžgìž`ìžYìžRìžKìžDìž=ìž6ìž/ìž(ìž!ìžìžìž ìžìžþëž÷ëžðëžéëžâëžÛëžÔëžÍëžÆëž¿ëž¸ëž±ëžªëž£ëžœëž•ëžŽëž‡ëž€ëžyëžrëžkëždëž]ëžVëžOëžHëžAëž:ëž3ëž,ëž%ëžëžëžëž ëžëžûêžôêžíêžæêžßêžØêžÑêžÊêžÃꞼꞵꞮꞧꞠꞙꞒꞋꞄêž}êžvêžoêžhêžaêžZêžSêžLêžEêž>êž7êž0êž)êž"êžêžêž êžêžÿéžøéžñéžêéžãéžÜéžÕéžÎéžÇéžÀ鞹鞲鞫鞤éžéž–éžéžˆéžéžzéžséžléžeéž^éžWéžPéžIéžBéž;éž4éž-éž&éžéžéžéž éžéžüèžõèžîèžçèžàèžÙèžÒèžËèžÄ螽螶螯螨螡螚螓螌螅èž~èžwèžpèžièžbèž[èžTèžMèžFèž?èž8èž1èž*èž#èžèžèžèžèžèžùçžòçžëçžäçžÝçžÖçžÏçžÈçžÁ瞺瞳瞬瞥瞞瞗çžçž‰çž‚çž{çžtçžmçžfçž_çžXçžQçžJçžCçž<çž5çž.çž'çž çžçžçž çžçžýæžöæžïæžèæžáæžÚæžÓæžÌæžÅæž¾æž·æž°æž©æž¢æž›æž”æžæž†æžæžxæžqæžjæžcæž\æžUæžNæžGæž@æž9æž2æž+æž$æžæžæžæžæžæžúåžóåžìåžååžÞåž×åžÐåžÉåžÂ垻垴垭垦垟垘垑垊垃åž|åžuåžnåžgåž`åžYåžRåžKåžDåž=åž6åž/åž(åž!åžåžåž åžåžþäž÷äžðäžéäžâäžÛäžÔäžÍäžÆäž¿äž¸äž±äžªäž£äžœäž•äžŽäž‡äž€äžyäžräžkäždäž]äžVäžOäžHäžAäž:äž3äž,äž%äžäžäžäž äžäžûãžôãžíãžæãžßãžØãžÑãžÊãžÃ㞼㞵㞮㞧㞠㞙㞒㞋㞄ãž}ãžvãžoãžhãžaãžZãžSãžLãžEãž>ãž7ãž0ãž)ãž"ãžãžãž ãžãžÿâžøâžñâžêâžãâžÜâžÕâžÎâžÇâžÀ➹➲➫➤âžâž–âžâžˆâžâžzâžsâžlâžeâž^âžWâžPâžIâžBâž;âž4âž-âž&âžâžâžâž âžâžüážõážîážçážàážÙážÒážËážÄួាឯឨឡរនឌចáž~ážwážpážiážbáž[ážTážMážFáž?áž8áž1áž*áž#ážážážážážážùàžòàžëàžäàžÝàžÖàžÏàžÈàžÁàžºàž³àž¬àž¥àžžàž—àžàž‰àž‚àž{àžtàžmàžfàž_àžXàžQàžJàžCàž<àž5àž.àž'àž àžàžàž àžàžýßžößžïßžèßžáßžÚßžÓßžÌßžÅßž¾ßž·ßž°ßž©ßž¢ßž›ßž”ßžßž†ßžßžxßžqßžjßžcßž\ßžUßžNßžGßž@ßž9ßž2ßž+ßž$ßžßžßžßžßžßžúÞžóÞžìÞžåÞžÞÞž×ÞžÐÞžÉÞžÂÞž»Þž´Þž­Þž¦ÞžŸÞž˜Þž‘ÞžŠÞžƒÞž|ÞžuÞžnÞžgÞž`ÞžYÞžRÞžKÞžDÞž=Þž6Þž/Þž(Þž!ÞžÞžÞž ÞžÞžþÝž÷ÝžðÝžéÝžâÝžÛÝžÔÝžÍÝžÆÝž¿Ýž¸Ýž±ÝžªÝž£ÝžœÝž•ÝžŽÝž‡Ýž€ÝžyÝžrÝžkÝždÝž]ÝžVÝžOÝžHÝžAÝž:Ýž3Ýž,Ýž%ݞݞݞݞ ݞݞûÜžôÜžíÜžæÜžßÜžØÜžÑÜžÊÜžÃÜž¼ÜžµÜž®Üž§Üž Üž™Üž’Üž‹Üž„Üž}ÜžvÜžoÜžhÜžaÜžZÜžSÜžLÜžEÜž>Üž7Üž0Üž)Üž"ܞܞܞ ܞܞÿÛžøÛžñÛžêÛžãÛžÜÛžÕÛžÎÛžÇÛžÀÛž¹Ûž²Ûž«Ûž¤ÛžÛž–ÛžÛžˆÛžÛžzÛžsÛžlÛžeÛž^ÛžWÛžPÛžIÛžBÛž;Ûž4Ûž-Ûž&ÛžÛžÛžÛž ÛžÛžüÚžõÚžîÚžçÚžàÚžÙÚžÒÚžËÚžÄÚž½Úž¶Úž¯Úž¨Úž¡ÚžšÚž“ÚžŒÚž…Úž~ÚžwÚžpÚžiÚžbÚž[ÚžTÚžMÚžFÚž?Úž8Úž1Úž*Úž#ÚžÚžÚžÚžÚžÚžùÙžòÙžëÙžäÙžÝÙžÖÙžÏÙžÈÙžÁÙžºÙž³Ùž¬Ùž¥ÙžžÙž—ÙžÙž‰Ùž‚Ùž{ÙžtÙžmÙžfÙž_ÙžXÙžQÙžJÙžCÙž<Ùž5Ùž.Ùž'Ùž ÙžÙžÙž ÙžÙžýØžöØžïØžèØžáØžÚØžÓØžÌØžÅØž¾Øž·Øž°Øž©Øž¢Øž›Øž”؞؞†ØžØžxØžqØžjØžcØž\ØžUØžNØžGØž@Øž9Øž2Øž+Øž$؞؞؞؞؞؞úמóמìמåמÞמ×מÐמÉמÂמ»×ž´×ž­×ž¦×žŸ×ž˜×ž‘מŠ×žƒ×ž|מuמnמgמ`מYמRמKמDמ=מ6מ/מ(מ!מממ ממþÖž÷ÖžðÖžéÖžâÖžÛÖžÔÖžÍÖžÆÖž¿Öž¸Öž±ÖžªÖž£ÖžœÖž•ÖžŽÖž‡Öž€ÖžyÖžrÖžkÖždÖž]ÖžVÖžOÖžHÖžAÖž:Öž3Öž,Öž%ÖžÖžÖžÖž ÖžÖžûÕžôÕžíÕžæÕžßÕžØÕžÑÕžÊÕžÃÕž¼ÕžµÕž®Õž§Õž Õž™Õž’Õž‹Õž„Õž}ÕžvÕžoÕžhÕžaÕžZÕžSÕžLÕžEÕž>Õž7Õž0Õž)Õž"ÕžÕžÕž ÕžÕžÿÔžøÔžñÔžêÔžãÔžÜÔžÕÔžÎÔžÇÔžÀÔž¹Ôž²Ôž«Ôž¤ÔžÔž–ÔžÔžˆÔžÔžzÔžsÔžlÔžeÔž^ÔžWÔžPÔžIÔžBÔž;Ôž4Ôž-Ôž&ÔžÔžÔžÔž ÔžÔžüÓžõÓžîÓžçÓžàÓžÙÓžÒÓžËÓžÄÓž½Óž¶Óž¯Óž¨Óž¡ÓžšÓž“ÓžŒÓž…Óž~ÓžwÓžpÓžiÓžbÓž[ÓžTÓžMÓžFÓž?Óž8Óž1Óž*Óž#ÓžÓžÓžÓžÓžÓžùÒžòÒžëÒžäÒžÝÒžÖÒžÏÒžÈÒžÁÒžºÒž³Òž¬Òž¥ÒžžÒž—ÒžÒž‰Òž‚Òž{ÒžtÒžmÒžfÒž_ÒžXÒžQÒžJÒžCÒž<Òž5Òž.Òž'Òž ÒžÒžÒž ÒžÒžýÑžöÑžïÑžèÑžáÑžÚÑžÓÑžÌÑžÅÑž¾Ñž·Ñž°Ñž©Ñž¢Ñž›Ñž”ўў†ÑžÑžxÑžqÑžjÑžcÑž\ÑžUÑžNÑžGÑž@Ñž9Ñž2Ñž+Ñž$ўўўўўўúОóОìОåОÞО×ОÐОÉОÂО»Ðž´Ðž­Ðž¦ÐžŸÐž˜Ðž‘ОŠÐžƒÐž|ОuОnОgО`ОYОRОKОDО=О6О/О(О!ООО ООþÏž÷ÏžðÏžéÏžâÏžÛÏžÔÏžÍÏžÆÏž¿Ïž¸Ïž±ÏžªÏž£ÏžœÏž•ÏžŽÏž‡Ïž€ÏžyÏžrÏžkÏždÏž]ÏžVÏžOÏžHÏžAÏž:Ïž3Ïž,Ïž%ϞϞϞϞ ϞϞûΞôΞíΞæÎžßΞØÎžÑΞÊΞÃΞ¼ÎžµÎž®Îž§Îž Îž™Îž’Ξ‹Îž„Ξ}ΞvΞoΞhΞaΞZΞSΞLΞEΞ>Ξ7Ξ0Ξ)Ξ"ΞΞΞ ΞΞÿÍžøÍžñÍžêÍžãÍžÜÍžÕÍžÎÍžÇÍžÀÍž¹Íž²Íž«Íž¤ÍžÍž–͞͞ˆÍžÍžzÍžsÍžlÍžeÍž^ÍžWÍžPÍžIÍžBÍž;Íž4Íž-Íž&͞͞͞͞ ͞͞üÌžõÌžîÌžçÌžàÌžÙÌžÒÌžËÌžÄÌž½Ìž¶Ìž¯Ìž¨Ìž¡ÌžšÌž“ÌžŒÌž…Ìž~ÌžwÌžpÌžiÌžbÌž[ÌžTÌžMÌžFÌž?Ìž8Ìž1Ìž*Ìž#̞̞̞̞̞̞ùËžòËžëËžäËžÝËžÖËžÏËžÈËžÁËžºËž³Ëž¬Ëž¥ËžžËž—˞˞‰Ëž‚Ëž{ËžtËžmËžfËž_ËžXËžQËžJËžCËž<Ëž5Ëž.Ëž'Ëž ˞˞˞ ˞˞ýÊžöÊžïÊžèÊžáÊžÚÊžÓÊžÌÊžÅÊž¾Êž·Êž°Êž©Êž¢Êž›Êž”ʞʞ†ÊžÊžxÊžqÊžjÊžcÊž\ÊžUÊžNÊžGÊž@Êž9Êž2Êž+Êž$ʞʞʞʞʞʞúÉžóÉžìÉžåÉžÞÉž×ÉžÐÉžÉÉžÂÉž»Éž´Éž­Éž¦ÉžŸÉž˜Éž‘ÉžŠÉžƒÉž|ÉžuÉžnÉžgÉž`ÉžYÉžRÉžKÉžDÉž=Éž6Éž/Éž(Éž!ɞɞɞ ɞɞþÈž÷ÈžðÈžéÈžâÈžÛÈžÔÈžÍÈžÆÈž¿Èž¸Èž±ÈžªÈž£ÈžœÈž•ÈžŽÈž‡Èž€ÈžyÈžrÈžkÈždÈž]ÈžVÈžOÈžHÈžAÈž:Èž3Èž,Èž%ȞȞȞȞ ȞȞûÇžôÇžíÇžæÇžßÇžØÇžÑÇžÊÇžÃÇž¼ÇžµÇž®Çž§Çž Çž™Çž’Çž‹Çž„Çž}ÇžvÇžoÇžhÇžaÇžZÇžSÇžLÇžEÇž>Çž7Çž0Çž)Çž"ǞǞǞ ǞǞÿÆžøÆžñÆžêÆžãÆžÜÆžÕÆžÎÆžÇÆžÀÆž¹Æž²Æž«Æž¤ÆžÆž–ƞƞˆÆžÆžzÆžsÆžlÆžeÆž^ÆžWÆžPÆžIÆžBÆž;Æž4Æž-Æž&ƞƞƞƞ ƞƞüÅžõÅžîÅžçÅžàÅžÙÅžÒÅžËÅžÄÅž½Åž¶Åž¯Åž¨Åž¡ÅžšÅž“ÅžŒÅž…Åž~ÅžwÅžpÅžiÅžbÅž[ÅžTÅžMÅžFÅž?Åž8Åž1Åž*Åž#ŞŞŞŞŞŞùÄžòÄžëÄžäÄžÝÄžÖÄžÏÄžÈÄžÁÄžºÄž³Äž¬Äž¥ÄžžÄž—ĞĞ‰Äž‚Äž{ÄžtÄžmÄžfÄž_ÄžXÄžQÄžJÄžCÄž<Äž5Äž.Äž'Äž ĞĞĞ ĞĞýÞöÞïÞèÞáÞÚÞÓÞÌÞÅ޾޷ްީޢޛÞ”ÞކÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúžóžìžåžÞžמОÉžž»Âž´Âž­Âž¦ÂžŸÂž˜Âž‘žŠÂžƒÂž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþÁž÷ÁžðÁžéÁžâÁžÛÁžÔÁžÍÁžÆÁž¿Áž¸Áž±ÁžªÁž£ÁžœÁž•ÁžŽÁž‡Áž€ÁžyÁžrÁžkÁždÁž]ÁžVÁžOÁžHÁžAÁž:Áž3Áž,Áž%ÁžÁžÁžÁž ÁžÁžûÀžôÀžíÀžæÀžßÀžØÀžÑÀžÊÀžÃÀž¼ÀžµÀž®Àž§Àž Àž™Àž’Àž‹Àž„Àž}ÀžvÀžoÀžhÀžaÀžZÀžSÀžLÀžEÀž>Àž7Àž0Àž)Àž"ÀžÀžÀž ÀžÀžÿ¿žø¿žñ¿ž꿞㿞Ü¿žÕ¿žοžÇ¿žÀ¿ž¹¿ž²¿ž«¿ž¤¿ž¿ž–¿ž¿žˆ¿ž¿žz¿žs¿žl¿že¿ž^¿žW¿žP¿žI¿žB¿ž;¿ž4¿ž-¿ž&¿ž¿ž¿ž¿ž ¿ž¿žü¾žõ¾ž羞ྞÙ¾žÒ¾ž˾žľž½¾ž¶¾ž¯¾ž¨¾ž¡¾žš¾ž“¾žŒ¾ž…¾ž~¾žw¾žp¾ži¾žb¾ž[¾žT¾žM¾žF¾ž?¾ž8¾ž1¾ž*¾ž#¾ž¾ž¾ž¾ž¾ž¾žù½žò½ž뽞佞ݽžÖ½žϽžȽžÁ½žº½ž³½ž¬½ž¥½žž½ž—½ž½ž‰½ž‚½ž{½žt½žm½žf½ž_½žX½žQ½žJ½žC½ž<½ž5½ž.½ž'½ž ½ž½ž½ž ½ž½žý¼žö¼ž>輞἞Ú¼žÓ¼ž̼žżž¾¼ž·¼ž°¼ž©¼ž¢¼ž›¼ž”¼ž¼ž†¼ž¼žx¼žq¼žj¼žc¼ž\¼žU¼žN¼žG¼ž@¼ž9¼ž2¼ž+¼ž$¼ž¼ž¼ž¼ž¼ž¼žú»žó»ž컞廞Þ»ž×»žлžÉ»ž»ž»»ž´»ž­»ž¦»žŸ»ž˜»ž‘»žŠ»žƒ»ž|»žu»žn»žg»ž`»žY»žR»žK»žD»ž=»ž6»ž/»ž(»ž!»ž»ž»ž »ž»žþºž÷ºžðºž麞⺞ÛºžÔºžͺžƺž¿ºž¸ºž±ºžªºž£ºžœºž•ºžŽºž‡ºž€ºžyºžrºžkºždºž]ºžVºžOºžHºžAºž:ºž3ºž,ºž%ºžºžºžºž ºžºžû¹žô¹ží¹ž湞ß¹žعžѹžʹžùž¼¹žµ¹ž®¹ž§¹ž ¹ž™¹ž’¹ž‹¹ž„¹ž}¹žv¹žo¹žh¹ža¹žZ¹žS¹žL¹žE¹ž>¹ž7¹ž0¹ž)¹ž"¹ž¹ž¹ž ¹ž¹žÿ¸žø¸žñ¸ž긞㸞ܸžÕ¸žθžǸžÀ¸ž¹¸ž²¸ž«¸ž¤¸ž¸ž–¸ž¸žˆ¸ž¸žz¸žs¸žl¸že¸ž^¸žW¸žP¸žI¸žB¸ž;¸ž4¸ž-¸ž&¸ž¸ž¸ž¸ž ¸ž¸žü·žõ·žî·žç·žà·žÙ·žÒ·žË·žÄ·ž½·ž¶·ž¯·ž¨·ž¡·žš·ž“·žŒ·ž…·ž~·žw·žp·ži·žb·ž[·žT·žM·žF·ž?·ž8·ž1·ž*·ž#·ž·ž·ž·ž·ž·žù¶žò¶žë¶žä¶žݶžÖ¶ž϶žȶžÁ¶žº¶ž³¶ž¬¶ž¥¶žž¶ž—¶ž¶ž‰¶ž‚¶ž{¶žt¶žm¶žf¶ž_¶žX¶žQ¶žJ¶žC¶ž<¶ž5¶ž.¶ž'¶ž ¶ž¶ž¶ž ¶ž¶žýµžöµžﵞ赞ᵞÚµžÓµž̵žŵž¾µž·µž°µž©µž¢µž›µž”µžµž†µžµžxµžqµžjµžcµž\µžUµžNµžGµž@µž9µž2µž+µž$µžµžµžµžµžµžú´žó´žì´žå´žÞ´ž×´žдžÉ´ž´ž»´ž´´ž­´ž¦´žŸ´ž˜´ž‘´žŠ´žƒ´ž|´žu´žn´žg´ž`´žY´žR´žK´žD´ž=´ž6´ž/´ž(´ž!´ž´ž´ž ´ž´žþ³ž÷³žð³ž鳞ⳞÛ³žÔ³žͳžƳž¿³ž¸³ž±³žª³ž£³žœ³ž•³ž޳ž‡³ž€³žy³žr³žk³žd³ž]³žV³žO³žH³žA³ž:³ž3³ž,³ž%³ž³ž³ž³ž ³ž³žû²žô²ží²ž沞ß²žزžѲžʲžòž¼²žµ²ž®²ž§²ž ²ž™²ž’²ž‹²ž„²ž}²žv²žo²žh²ža²žZ²žS²žL²žE²ž>²ž7²ž0²ž)²ž"²ž²ž²ž ²ž²žÿ±žø±žñ±ž걞㱞ܱžÕ±žαžDZžÀ±ž¹±ž²±ž«±ž¤±ž±ž–±ž±žˆ±ž±žz±žs±žl±že±ž^±žW±žP±žI±žB±ž;±ž4±ž-±ž&±ž±ž±ž±ž ±ž±žü°žõ°žî°žç°žà°žÙ°žÒ°ž˰žİž½°ž¶°ž¯°ž¨°ž¡°žš°ž“°žŒ°ž…°ž~°žw°žp°ži°žb°ž[°žT°žM°žF°ž?°ž8°ž1°ž*°ž#°ž°ž°ž°ž°ž°žù¯žò¯ž믞䯞ݯžÖ¯žϯžȯžÁ¯žº¯ž³¯ž¬¯ž¥¯žž¯ž—¯ž¯ž‰¯ž‚¯ž{¯žt¯žm¯žf¯ž_¯žX¯žQ¯žJ¯žC¯ž<¯ž5¯ž.¯ž'¯ž ¯ž¯ž¯ž ¯ž¯žý®žö®žﮞ讞ᮞÚ®žÓ®žÌ®žÅ®ž¾®ž·®ž°®ž©®ž¢®ž›®ž”®ž®ž†®ž®žx®žq®žj®žc®ž\®žU®žN®žG®ž@®ž9®ž2®ž+®ž$®ž®ž®ž®ž®ž®žú­žó­žì­žå­žÞ­ž×­žЭžÉ­ž­ž»­ž´­ž­­ž¦­žŸ­ž˜­ž‘­žŠ­žƒ­ž|­žu­žn­žg­ž`­žY­žR­žK­žD­ž=­ž6­ž/­ž(­ž!­ž­ž­ž ­ž­žþ¬ž÷¬žð¬ž鬞⬞Û¬žÔ¬žͬžƬž¿¬ž¸¬ž±¬žª¬ž£¬žœ¬ž•¬žެž‡¬ž€¬žy¬žr¬žk¬žd¬ž]¬žV¬žO¬žH¬žA¬ž:¬ž3¬ž,¬ž%¬ž¬ž¬ž¬ž ¬ž¬žû«žô«ží«ž櫞ß«žØ«žÑ«žÊ«žëž¼«žµ«ž®«ž§«ž «ž™«ž’«ž‹«ž„«ž}«žv«žo«žh«ža«žZ«žS«žL«žE«ž>«ž7«ž0«ž)«ž"«ž«ž«ž «ž«žÿªžøªžñªžꪞ㪞ܪžÕªžΪžǪžÀªž¹ªž²ªž«ªž¤ªžªž–ªžªžˆªžªžzªžsªžlªžeªž^ªžWªžPªžIªžBªž;ªž4ªž-ªž&ªžªžªžªž ªžªžü©žõ©ž穞ਫ਼Ù©žÒ©žË©žÄ©ž½©ž¶©ž¯©ž¨©ž¡©žš©ž“©žŒ©ž…©ž~©žw©žp©ži©žb©ž[©žT©žM©žF©ž?©ž8©ž1©ž*©ž#©ž©ž©ž©ž©ž©žù¨žò¨ž먞䨞ݨžÖ¨žϨžȨžÁ¨žº¨ž³¨ž¬¨ž¥¨žž¨ž—¨ž¨ž‰¨ž‚¨ž{¨žt¨žm¨žf¨ž_¨žX¨žQ¨žJ¨žC¨ž<¨ž5¨ž.¨ž'¨ž ¨ž¨ž¨ž ¨ž¨žý§žö§žï§žè§žá§žÚ§žÓ§ž̧žŧž¾§ž·§ž°§ž©§ž¢§ž›§ž”§ž§ž†§ž§žx§žq§žj§žc§ž\§žU§žN§žG§ž@§ž9§ž2§ž+§ž$§ž§ž§ž§ž§ž§žú¦žó¦ž즞妞Þ¦žצžЦžɦž¦ž»¦ž´¦ž­¦ž¦¦žŸ¦ž˜¦ž‘¦žЦžƒ¦ž|¦žu¦žn¦žg¦ž`¦žY¦žR¦žK¦žD¦ž=¦ž6¦ž/¦ž(¦ž!¦ž¦ž¦ž ¦ž¦žþ¥ž÷¥žð¥ž饞⥞Û¥žÔ¥žÍ¥žÆ¥ž¿¥ž¸¥ž±¥žª¥ž£¥žœ¥ž•¥žŽ¥ž‡¥ž€¥žy¥žr¥žk¥žd¥ž]¥žV¥žO¥žH¥žA¥ž:¥ž3¥ž,¥ž%¥ž¥ž¥ž¥ž ¥ž¥žû¤žô¤ží¤ž椞ߤžؤžѤžʤžäž¼¤žµ¤ž®¤ž§¤ž ¤ž™¤ž’¤ž‹¤ž„¤ž}¤žv¤žo¤žh¤ža¤žZ¤žS¤žL¤žE¤ž>¤ž7¤ž0¤ž)¤ž"¤ž¤ž¤ž ¤ž¤žÿ£žø£žñ£ž꣞㣞Ü£žÕ£žΣžÇ£žÀ£ž¹£ž²£ž«£ž¤£ž£ž–£ž£žˆ£ž£žz£žs£žl£že£ž^£žW£žP£žI£žB£ž;£ž4£ž-£ž&£ž£ž£ž£ž £ž£žü¢žõ¢ž碞࢞Ù¢žÒ¢žË¢žÄ¢ž½¢ž¶¢ž¯¢ž¨¢ž¡¢žš¢ž“¢žŒ¢ž…¢ž~¢žw¢žp¢ži¢žb¢ž[¢žT¢žM¢žF¢ž?¢ž8¢ž1¢ž*¢ž#¢ž¢ž¢ž¢ž¢ž¢žù¡žò¡ž롞䡞Ý¡žÖ¡žÏ¡žÈ¡žÁ¡žº¡ž³¡ž¬¡ž¥¡žž¡ž—¡ž¡ž‰¡ž‚¡ž{¡žt¡žm¡žf¡ž_¡žX¡žQ¡žJ¡žC¡ž<¡ž5¡ž.¡ž'¡ž ¡ž¡ž¡ž ¡ž¡žý žö žï žè žá žÚ žÓ žÌ žÅ ž¾ ž· ž° ž© ž¢ ž› ž” ž ž† ž žx žq žj žc ž\ žU žN žG ž@ ž9 ž2 ž+ ž$ ž ž ž ž ž žúŸžóŸž쟞埞ÞŸžןžПžÉŸžŸž»Ÿž´Ÿž­Ÿž¦ŸžŸŸž˜Ÿž‘ŸžŠŸžƒŸž|ŸžuŸžnŸžgŸž`ŸžYŸžRŸžKŸžDŸž=Ÿž6Ÿž/Ÿž(Ÿž!ŸžŸžŸž ŸžŸžþžž÷žžðžžéžžâžžÛžžÔžžÍžžÆžž¿žž¸žž±žžªžž£žžœžž•žžŽžž‡žž€žžyžžržžkžždžž]žžVžžOžžHžžAžž:žž3žž,žž%žžžžžžžž žžžžûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿœžøœžñœžꜞ㜞ÜœžÕœžΜžÇœžÀœž¹œž²œž«œž¤œžœž–œžœžˆœžœžzœžsœžlœžeœž^œžWœžPœžIœžBœž;œž4œž-œž&œžœžœžœž œžœžü›žõ›ž盞à›žÙ›žÒ›žË›žÄ›ž½›ž¶›ž¯›ž¨›ž¡›žš›ž“›žŒ›ž…›ž~›žw›žp›ži›žb›ž[›žT›žM›žF›ž?›ž8›ž1›ž*›ž#›ž›ž›ž›ž›ž›žùšžòšžëšžäšžÝšžÖšžÏšžÈšžÁšžºšž³šž¬šž¥šžžšž—šžšž‰šž‚šž{šžtšžmšžfšž_šžXšžQšžJšžCšž<šž5šž.šž'šž šžšžšž šžšžý™žö™ž虞ᙞÚ™žÓ™žÌ™žÅ™ž¾™ž·™ž°™ž©™ž¢™ž›™ž”™ž™ž†™ž™žx™žq™žj™žc™ž\™žU™žN™žG™ž@™ž9™ž2™ž+™ž$™ž™ž™ž™ž™ž™žú˜žó˜ž옞嘞Þ˜žטžИžɘž˜ž»˜ž´˜ž­˜ž¦˜žŸ˜ž˜˜ž‘˜žŠ˜žƒ˜ž|˜žu˜žn˜žg˜ž`˜žY˜žR˜žK˜žD˜ž=˜ž6˜ž/˜ž(˜ž!˜ž˜ž˜ž ˜ž˜žþ—ž÷—žð—žé—žâ—žÛ—žÔ—žÍ—žÆ—ž¿—ž¸—ž±—žª—ž£—žœ—ž•—žŽ—ž‡—ž€—žy—žr—žk—žd—ž]—žV—žO—žH—žA—ž:—ž3—ž,—ž%—ž—ž—ž—ž —ž—žû–žô–ží–žæ–žß–žØ–žÑ–žÊ–žÖž¼–žµ–ž®–ž§–ž –ž™–ž’–ž‹–ž„–ž}–žv–žo–žh–ža–žZ–žS–žL–žE–ž>–ž7–ž0–ž)–ž"–ž–ž–ž –ž–žÿ•žø•žñ•žꕞ㕞Ü•žÕ•žΕžÇ•žÀ•ž¹•ž²•ž«•ž¤•ž•ž–•ž•žˆ•ž•žz•žs•žl•že•ž^•žW•žP•žI•žB•ž;•ž4•ž-•ž&•ž•ž•ž•ž •ž•žü”žõ”ž甞à”žÙ”žÒ”žË”žÄ”ž½”ž¶”ž¯”ž¨”ž¡”žš”ž“”žŒ”ž…”ž~”žw”žp”ži”žb”ž[”žT”žM”žF”ž?”ž8”ž1”ž*”ž#”ž”ž”ž”ž”ž”žù“žò“ž듞䓞Ý“žÖ“žÏ“žÈ“žÁ“žº“ž³“ž¬“ž¥“žž“ž—“ž“ž‰“ž‚“ž{“žt“žm“žf“ž_“žX“žQ“žJ“žC“ž<“ž5“ž.“ž'“ž “ž“ž“ž “ž“žý’žö’žï’žè’žá’žÚ’žÓ’žÌ’žÅ’ž¾’ž·’ž°’ž©’ž¢’ž›’ž”’ž’ž†’ž’žx’žq’žj’žc’ž\’žU’žN’žG’ž@’ž9’ž2’ž+’ž$’ž’ž’ž’ž’ž’žú‘žó‘ž쑞呞Þ‘žבžБžÉ‘ž‘ž»‘ž´‘ž­‘ž¦‘žŸ‘ž˜‘ž‘‘žŠ‘žƒ‘ž|‘žu‘žn‘žg‘ž`‘žY‘žR‘žK‘žD‘ž=‘ž6‘ž/‘ž(‘ž!‘ž‘ž‘ž ‘ž‘žþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿŽžøŽžñŽžꎞ㎞ÜŽžÕŽžÎŽžÇŽžÀŽž¹Žž²Žž«Žž¤ŽžŽž–ŽžŽžˆŽžŽžzŽžsŽžlŽžeŽž^ŽžWŽžPŽžIŽžBŽž;Žž4Žž-Žž&ŽžŽžŽžŽž ŽžŽžüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùŒžòŒž댞䌞ÝŒžÖŒžÏŒžÈŒžÁŒžºŒž³Œž¬Œž¥ŒžžŒž—ŒžŒž‰Œž‚Œž{ŒžtŒžmŒžfŒž_ŒžXŒžQŒžJŒžCŒž<Œž5Œž.Œž'Œž ŒžŒžŒž ŒžŒžý‹žö‹ž苞ዞÚ‹žÓ‹žÌ‹žÅ‹ž¾‹ž·‹ž°‹ž©‹ž¢‹ž›‹ž”‹ž‹ž†‹ž‹žx‹žq‹žj‹žc‹ž\‹žU‹žN‹žG‹ž@‹ž9‹ž2‹ž+‹ž$‹ž‹ž‹ž‹ž‹ž‹žúŠžóŠž슞办ÞŠž׊žЊžÉŠžŠž»Šž´Šž­Šž¦ŠžŸŠž˜Šž‘ŠžŠŠžƒŠž|ŠžuŠžnŠžgŠž`ŠžYŠžRŠžKŠžDŠž=Šž6Šž/Šž(Šž!ŠžŠžŠž ŠžŠžþ‰ž÷‰žð‰ž鉞≞Û‰žÔ‰ž͉žƉž¿‰ž¸‰ž±‰žª‰ž£‰žœ‰ž•‰žމž‡‰ž€‰žy‰žr‰žk‰žd‰ž]‰žV‰žO‰žH‰žA‰ž:‰ž3‰ž,‰ž%‰ž‰ž‰ž‰ž ‰ž‰žûˆžôˆž툞戞߈ž؈žшžʈžÈž¼ˆžµˆž®ˆž§ˆž ˆž™ˆž’ˆž‹ˆž„ˆž}ˆžvˆžoˆžhˆžaˆžZˆžSˆžLˆžEˆž>ˆž7ˆž0ˆž)ˆž"ˆžˆžˆž ˆžˆžÿ‡žø‡žñ‡žꇞ㇞܇žÕ‡ž·žLJžÀ‡ž¹‡ž²‡ž«‡ž¤‡ž‡ž–‡ž‡žˆ‡ž‡žz‡žs‡žl‡že‡ž^‡žW‡žP‡žI‡žB‡ž;‡ž4‡ž-‡ž&‡ž‡ž‡ž‡ž ‡ž‡žü†žõ†ž熞à†žÙ†žÒ†žˆžĆž½†ž¶†ž¯†ž¨†ž¡†žš†ž“†žŒ†ž…†ž~†žw†žp†ži†žb†ž[†žT†žM†žF†ž?†ž8†ž1†ž*†ž#†ž†ž†ž†ž†ž†žù…žò…žë…žä…žÝ…žÖ…žÏ…žÈ…žÁ…žº…ž³…ž¬…ž¥…žž…ž—…ž…ž‰…ž‚…ž{…žt…žm…žf…ž_…žX…žQ…žJ…žC…ž<…ž5…ž.…ž'…ž …ž…ž…ž …ž…žý„žö„ž脞ᄞÚ„žÓ„žÌ„žÅ„ž¾„ž·„ž°„ž©„ž¢„ž›„ž”„ž„ž†„ž„žx„žq„žj„žc„ž\„žU„žN„žG„ž@„ž9„ž2„ž+„ž$„ž„ž„ž„ž„ž„žúƒžóƒž샞僞Þƒž׃žЃžɃžƒž»ƒž´ƒž­ƒž¦ƒžŸƒž˜ƒž‘ƒžŠƒžƒƒž|ƒžuƒžnƒžgƒž`ƒžYƒžRƒžKƒžDƒž=ƒž6ƒž/ƒž(ƒž!ƒžƒžƒž ƒžƒžþ‚ž÷‚žð‚ž邞₞Û‚žÔ‚žÍ‚žÆ‚ž¿‚ž¸‚ž±‚žª‚ž£‚žœ‚ž•‚žŽ‚ž‡‚ž€‚žy‚žr‚žk‚žd‚ž]‚žV‚žO‚žH‚žA‚ž:‚ž3‚ž,‚ž%‚ž‚ž‚ž‚ž ‚ž‚žûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿ€žø€žñ€žꀞ〞Ü€žÕ€ž΀žÇ€žÀ€ž¹€ž²€ž«€ž¤€ž€ž–€ž€žˆ€ž€žz€žs€žl€že€ž^€žW€žP€žI€žB€ž;€ž4€ž-€ž&€ž€ž€ž€ž €ž€žüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžù~žò~žë~žä~žÝ~žÖ~žÏ~žÈ~žÁ~žº~ž³~ž¬~ž¥~žž~ž—~ž~ž‰~ž‚~ž{~žt~žm~žf~ž_~žX~žQ~žJ~žC~ž<~ž5~ž.~ž'~ž ~ž~ž~ž ~ž~žý}žö}žï}žè}žá}žÚ}žÓ}žÌ}žÅ}ž¾}ž·}ž°}ž©}ž¢}ž›}ž”}ž}ž†}ž}žx}žq}žj}žc}ž\}žU}žN}žG}ž@}ž9}ž2}ž+}ž$}ž}ž}ž}ž}ž}žú|žó|žì|žå|žÞ|ž×|žÐ|žÉ|žÂ|ž»|ž´|ž­|ž¦|žŸ|ž˜|ž‘|žŠ|žƒ|ž||žu|žn|žg|ž`|žY|žR|žK|žD|ž=|ž6|ž/|ž(|ž!|ž|ž|ž |ž|žþ{ž÷{žð{žé{žâ{žÛ{žÔ{žÍ{žÆ{ž¿{ž¸{ž±{žª{ž£{žœ{ž•{žŽ{ž‡{ž€{žy{žr{žk{žd{ž]{žV{žO{žH{žA{ž:{ž3{ž,{ž%{ž{ž{ž{ž {ž{žûzžôzžízžæzžßzžØzžÑzžÊzžÃzž¼zžµzž®zž§zž zž™zž’zž‹zž„zž}zžvzžozžhzžazžZzžSzžLzžEzž>zž7zž0zž)zž"zžzžzž zžzžÿyžøyžñyžêyžãyžÜyžÕyžÎyžÇyžÀyž¹yž²yž«yž¤yžyž–yžyžˆyžyžzyžsyžlyžeyž^yžWyžPyžIyžByž;yž4yž-yž&yžyžyžyž yžyžüxžõxžîxžçxžàxžÙxžÒxžËxžÄxž½xž¶xž¯xž¨xž¡xžšxž“xžŒxž…xž~xžwxžpxžixžbxž[xžTxžMxžFxž?xž8xž1xž*xž#xžxžxžxžxžxžùwžòwžëwžäwžÝwžÖwžÏwžÈwžÁwžºwž³wž¬wž¥wžžwž—wžwž‰wž‚wž{wžtwžmwžfwž_wžXwžQwžJwžCwžsž7sž0sž)sž"sžsžsž sžsžÿržøržñržêržãržÜržÕržÎržÇržÀrž¹rž²rž«rž¤ržrž–ržržˆržržzržsržlržerž^ržWržPržIržBrž;rž4rž-rž&ržržržrž ržržüqžõqžîqžçqžàqžÙqžÒqžËqžÄqž½qž¶qž¯qž¨qž¡qžšqž“qžŒqž…qž~qžwqžpqžiqžbqž[qžTqžMqžFqž?qž8qž1qž*qž#qžqžqžqžqžqžùpžòpžëpžäpžÝpžÖpžÏpžÈpžÁpžºpž³pž¬pž¥pžžpž—pžpž‰pž‚pž{pžtpžmpžfpž_pžXpžQpžJpžCpžlž7lž0lž)lž"lžlžlž lžlžÿkžøkžñkžêkžãkžÜkžÕkžÎkžÇkžÀkž¹kž²kž«kž¤kžkž–kžkžˆkžkžzkžskžlkžekž^kžWkžPkžIkžBkž;kž4kž-kž&kžkžkžkž kžkžüjžõjžîjžçjžàjžÙjžÒjžËjžÄjž½jž¶jž¯jž¨jž¡jžšjž“jžŒjž…jž~jžwjžpjžijžbjž[jžTjžMjžFjž?jž8jž1jž*jž#jžjžjžjžjžjžùižòižëižäižÝižÖižÏižÈižÁižºiž³iž¬iž¥ižžiž—ižiž‰iž‚iž{ižtižmižfiž_ižXižQižJižCižež7ež0ež)ež"ežežež ežežÿdžødžñdžêdžãdžÜdžÕdžÎdžÇdžÀdž¹dž²dž«dž¤dždž–dždžˆdždžzdžsdžldžedž^džWdžPdžIdžBdž;dž4dž-dž&dždždždž dždžücžõcžîcžçcžàcžÙcžÒcžËcžÄcž½cž¶cž¯cž¨cž¡cžšcž“cžŒcž…cž~cžwcžpcžicžbcž[cžTcžMcžFcž?cž8cž1cž*cž#cžcžcžcžcžcžùbžòbžëbžäbžÝbžÖbžÏbžÈbžÁbžºbž³bž¬bž¥bžžbž—bžbž‰bž‚bž{bžtbžmbžfbž_bžXbžQbžJbžCbž^ž7^ž0^ž)^ž"^ž^ž^ž ^ž^žÿ]žø]žñ]žê]žã]žÜ]žÕ]žÎ]žÇ]žÀ]ž¹]ž²]ž«]ž¤]ž]ž–]ž]žˆ]ž]žz]žs]žl]že]ž^]žW]žP]žI]žB]ž;]ž4]ž-]ž&]ž]ž]ž]ž ]ž]žü\žõ\žî\žç\žà\žÙ\žÒ\žË\žÄ\ž½\ž¶\ž¯\ž¨\ž¡\žš\ž“\žŒ\ž…\ž~\žw\žp\ži\žb\ž[\žT\žM\žF\ž?\ž8\ž1\ž*\ž#\ž\ž\ž\ž\ž\žù[žò[žë[žä[žÝ[žÖ[žÏ[žÈ[žÁ[žº[ž³[ž¬[ž¥[žž[ž—[ž[ž‰[ž‚[ž{[žt[žm[žf[ž_[žX[žQ[žJ[žC[ž<[ž5[ž.[ž'[ž [ž[ž[ž [ž[žýZžöZžïZžèZžáZžÚZžÓZžÌZžÅZž¾Zž·Zž°Zž©Zž¢Zž›Zž”ZžZž†ZžZžxZžqZžjZžcZž\ZžUZžNZžGZž@Zž9Zž2Zž+Zž$ZžZžZžZžZžZžúYžóYžìYžåYžÞYž×YžÐYžÉYžÂYž»Yž´Yž­Yž¦YžŸYž˜Yž‘YžŠYžƒYž|YžuYžnYžgYž`YžYYžRYžKYžDYž=Yž6Yž/Yž(Yž!YžYžYž YžYžþXž÷XžðXžéXžâXžÛXžÔXžÍXžÆXž¿Xž¸Xž±XžªXž£XžœXž•XžŽXž‡Xž€XžyXžrXžkXždXž]XžVXžOXžHXžAXž:Xž3Xž,Xž%XžXžXžXž XžXžûWžôWžíWžæWžßWžØWžÑWžÊWžÃWž¼WžµWž®Wž§Wž Wž™Wž’Wž‹Wž„Wž}WžvWžoWžhWžaWžZWžSWžLWžEWž>Wž7Wž0Wž)Wž"WžWžWž WžWžÿVžøVžñVžêVžãVžÜVžÕVžÎVžÇVžÀVž¹Vž²Vž«Vž¤VžVž–VžVžˆVžVžzVžsVžlVžeVž^VžWVžPVžIVžBVž;Vž4Vž-Vž&VžVžVžVž VžVžüUžõUžîUžçUžàUžÙUžÒUžËUžÄUž½Už¶Už¯Už¨Už¡UžšUž“UžŒUž…Už~UžwUžpUžiUžbUž[UžTUžMUžFUž?Už8Už1Už*Už#UžUžUžUžUžUžùTžòTžëTžäTžÝTžÖTžÏTžÈTžÁTžºTž³Tž¬Tž¥TžžTž—TžTž‰Tž‚Tž{TžtTžmTžfTž_TžXTžQTžJTžCTžPž7Pž0Pž)Pž"PžPžPž PžPžÿOžøOžñOžêOžãOžÜOžÕOžÎOžÇOžÀOž¹Ož²Ož«Ož¤OžOž–OžOžˆOžOžzOžsOžlOžeOž^OžWOžPOžIOžBOž;Ož4Ož-Ož&OžOžOžOž OžOžüNžõNžîNžçNžàNžÙNžÒNžËNžÄNž½Nž¶Nž¯Nž¨Nž¡NžšNž“NžŒNž…Nž~NžwNžpNžiNžbNž[NžTNžMNžFNž?Nž8Nž1Nž*Nž#NžNžNžNžNžNžùMžòMžëMžäMžÝMžÖMžÏMžÈMžÁMžºMž³Mž¬Mž¥MžžMž—MžMž‰Mž‚Mž{MžtMžmMžfMž_MžXMžQMžJMžCMžIž7Iž0Iž)Iž"IžIžIž IžIžÿHžøHžñHžêHžãHžÜHžÕHžÎHžÇHžÀHž¹Hž²Hž«Hž¤HžHž–HžHžˆHžHžzHžsHžlHžeHž^HžWHžPHžIHžBHž;Hž4Hž-Hž&HžHžHžHž HžHžüGžõGžîGžçGžàGžÙGžÒGžËGžÄGž½Gž¶Gž¯Gž¨Gž¡GžšGž“GžŒGž…Gž~GžwGžpGžiGžbGž[GžTGžMGžFGž?Gž8Gž1Gž*Gž#GžGžGžGžGžGžùFžòFžëFžäFžÝFžÖFžÏFžÈFžÁFžºFž³Fž¬Fž¥FžžFž—FžFž‰Fž‚Fž{FžtFžmFžfFž_FžXFžQFžJFžCFžBž7Bž0Bž)Bž"BžBžBž BžBžÿAžøAžñAžêAžãAžÜAžÕAžÎAžÇAžÀAž¹Až²Až«Až¤AžAž–AžAžˆAžAžzAžsAžlAžeAž^AžWAžPAžIAžBAž;Až4Až-Až&AžAžAžAž AžAžü@žõ@žî@žç@žà@žÙ@žÒ@žË@žÄ@ž½@ž¶@ž¯@ž¨@ž¡@žš@ž“@žŒ@ž…@ž~@žw@žp@ži@žb@ž[@žT@žM@žF@ž?@ž8@ž1@ž*@ž#@ž@ž@ž@ž@ž@žù?žò?žë?žä?žÝ?žÖ?žÏ?žÈ?žÁ?žº?ž³?ž¬?ž¥?žž?ž—?ž?ž‰?ž‚?ž{?žt?žm?žf?ž_?žX?žQ?žJ?žC?žžö>žï>žè>žá>žÚ>žÓ>žÌ>žÅ>ž¾>ž·>ž°>ž©>ž¢>ž›>ž”>ž>ž†>ž>žx>žq>žj>žc>ž\>žU>žN>žG>ž@>ž9>ž2>ž+>ž$>ž>ž>ž>ž>ž>žú=žó=žì=žå=žÞ=ž×=žÐ=žÉ=žÂ=ž»=ž´=ž­=ž¦=žŸ=ž˜=ž‘=žŠ=žƒ=ž|=žu=žn=žg=ž`=žY=žR=žK=žD=ž==ž6=ž/=ž(=ž!=ž=ž=ž =ž=žþ<ž÷<žð<žé<žâ<žÛ<žÔ<žÍ<žÆ<ž¿<ž¸<ž±<žª<ž£<žœ<ž•<žŽ<ž‡<ž€<žy<žr<žk<žd<ž]<žV<žO<žH<žA<ž:<ž3<ž,<ž%<ž<ž<ž<ž <ž<žû;žô;ží;žæ;žß;žØ;žÑ;žÊ;žÃ;ž¼;žµ;ž®;ž§;ž ;ž™;ž’;ž‹;ž„;ž};žv;žo;žh;ža;žZ;žS;žL;žE;ž>;ž7;ž0;ž);ž";ž;ž;ž ;ž;žÿ:žø:žñ:žê:žã:žÜ:žÕ:žÎ:žÇ:žÀ:ž¹:ž²:ž«:ž¤:ž:ž–:ž:žˆ:ž:žz:žs:žl:že:ž^:žW:žP:žI:žB:ž;:ž4:ž-:ž&:ž:ž:ž:ž :ž:žü9žõ9žî9žç9žà9žÙ9žÒ9žË9žÄ9ž½9ž¶9ž¯9ž¨9ž¡9žš9ž“9žŒ9ž…9ž~9žw9žp9ži9žb9ž[9žT9žM9žF9ž?9ž89ž19ž*9ž#9ž9ž9ž9ž9ž9žù8žò8žë8žä8žÝ8žÖ8žÏ8žÈ8žÁ8žº8ž³8ž¬8ž¥8žž8ž—8ž8ž‰8ž‚8ž{8žt8žm8žf8ž_8žX8žQ8žJ8žC8ž<8ž58ž.8ž'8ž 8ž8ž8ž 8ž8žý7žö7žï7žè7žá7žÚ7žÓ7žÌ7žÅ7ž¾7ž·7ž°7ž©7ž¢7ž›7ž”7ž7ž†7ž7žx7žq7žj7žc7ž\7žU7žN7žG7ž@7ž97ž27ž+7ž$7ž7ž7ž7ž7ž7žú6žó6žì6žå6žÞ6ž×6žÐ6žÉ6žÂ6ž»6ž´6ž­6ž¦6žŸ6ž˜6ž‘6žŠ6žƒ6ž|6žu6žn6žg6ž`6žY6žR6žK6žD6ž=6ž66ž/6ž(6ž!6ž6ž6ž 6ž6žþ5ž÷5žð5žé5žâ5žÛ5žÔ5žÍ5žÆ5ž¿5ž¸5ž±5žª5ž£5žœ5ž•5žŽ5ž‡5ž€5žy5žr5žk5žd5ž]5žV5žO5žH5žA5ž:5ž35ž,5ž%5ž5ž5ž5ž 5ž5žû4žô4ží4žæ4žß4žØ4žÑ4žÊ4žÃ4ž¼4žµ4ž®4ž§4ž 4ž™4ž’4ž‹4ž„4ž}4žv4žo4žh4ža4žZ4žS4žL4žE4ž>4ž74ž04ž)4ž"4ž4ž4ž 4ž4žÿ3žø3žñ3žê3žã3žÜ3žÕ3žÎ3žÇ3žÀ3ž¹3ž²3ž«3ž¤3ž3ž–3ž3žˆ3ž3žz3žs3žl3že3ž^3žW3žP3žI3žB3ž;3ž43ž-3ž&3ž3ž3ž3ž 3ž3žü2žõ2žî2žç2žà2žÙ2žÒ2žË2žÄ2ž½2ž¶2ž¯2ž¨2ž¡2žš2ž“2žŒ2ž…2ž~2žw2žp2ži2žb2ž[2žT2žM2žF2ž?2ž82ž12ž*2ž#2ž2ž2ž2ž2ž2žù1žò1žë1žä1žÝ1žÖ1žÏ1žÈ1žÁ1žº1ž³1ž¬1ž¥1žž1ž—1ž1ž‰1ž‚1ž{1žt1žm1žf1ž_1žX1žQ1žJ1žC1ž<1ž51ž.1ž'1ž 1ž1ž1ž 1ž1žý0žö0žï0žè0žá0žÚ0žÓ0žÌ0žÅ0ž¾0ž·0ž°0ž©0ž¢0ž›0ž”0ž0ž†0ž0žx0žq0žj0žc0ž\0žU0žN0žG0ž@0ž90ž20ž+0ž$0ž0ž0ž0ž0ž0žú/žó/žì/žå/žÞ/ž×/žÐ/žÉ/žÂ/ž»/ž´/ž­/ž¦/žŸ/ž˜/ž‘/žŠ/žƒ/ž|/žu/žn/žg/ž`/žY/žR/žK/žD/ž=/ž6/ž//ž(/ž!/ž/ž/ž /ž/žþ.ž÷.žð.žé.žâ.žÛ.žÔ.žÍ.žÆ.ž¿.ž¸.ž±.žª.ž£.žœ.ž•.žŽ.ž‡.ž€.žy.žr.žk.žd.ž].žV.žO.žH.žA.ž:.ž3.ž,.ž%.ž.ž.ž.ž .ž.žû-žô-ží-žæ-žß-žØ-žÑ-žÊ-žÃ-ž¼-žµ-ž®-ž§-ž -ž™-ž’-ž‹-ž„-ž}-žv-žo-žh-ža-žZ-žS-žL-žE-ž>-ž7-ž0-ž)-ž"-ž-ž-ž -ž-žÿ,žø,žñ,žê,žã,žÜ,žÕ,žÎ,žÇ,žÀ,ž¹,ž²,ž«,ž¤,ž,ž–,ž,žˆ,ž,žz,žs,žl,že,ž^,žW,žP,žI,žB,ž;,ž4,ž-,ž&,ž,ž,ž,ž ,ž,žü+žõ+žî+žç+žà+žÙ+žÒ+žË+žÄ+ž½+ž¶+ž¯+ž¨+ž¡+žš+ž“+žŒ+ž…+ž~+žw+žp+ži+žb+ž[+žT+žM+žF+ž?+ž8+ž1+ž*+ž#+ž+ž+ž+ž+ž+žù*žò*žë*žä*žÝ*žÖ*žÏ*žÈ*žÁ*žº*ž³*ž¬*ž¥*žž*ž—*ž*ž‰*ž‚*ž{*žt*žm*žf*ž_*žX*žQ*žJ*žC*ž<*ž5*ž.*ž'*ž *ž*ž*ž *ž*žý)žö)žï)žè)žá)žÚ)žÓ)žÌ)žÅ)ž¾)ž·)ž°)ž©)ž¢)ž›)ž”)ž)ž†)ž)žx)žq)žj)žc)ž\)žU)žN)žG)ž@)ž9)ž2)ž+)ž$)ž)ž)ž)ž)ž)žú(žó(žì(žå(žÞ(ž×(žÐ(žÉ(žÂ(ž»(ž´(ž­(ž¦(žŸ(ž˜(ž‘(žŠ(žƒ(ž|(žu(žn(žg(ž`(žY(žR(žK(žD(ž=(ž6(ž/(ž((ž!(ž(ž(ž (ž(žþ'ž÷'žð'žé'žâ'žÛ'žÔ'žÍ'žÆ'ž¿'ž¸'ž±'žª'ž£'žœ'ž•'žŽ'ž‡'ž€'žy'žr'žk'žd'ž]'žV'žO'žH'žA'ž:'ž3'ž,'ž%'ž'ž'ž'ž 'ž'žû&žô&ží&žæ&žß&žØ&žÑ&žÊ&žÃ&ž¼&žµ&ž®&ž§&ž &ž™&ž’&ž‹&ž„&ž}&žv&žo&žh&ža&žZ&žS&žL&žE&ž>&ž7&ž0&ž)&ž"&ž&ž&ž &ž&žÿ%žø%žñ%žê%žã%žÜ%žÕ%žÎ%žÇ%žÀ%ž¹%ž²%ž«%ž¤%ž%ž–%ž%žˆ%ž%žz%žs%žl%že%ž^%žW%žP%žI%žB%ž;%ž4%ž-%ž&%ž%ž%ž%ž %ž%žü$žõ$žî$žç$žà$žÙ$žÒ$žË$žÄ$ž½$ž¶$ž¯$ž¨$ž¡$žš$ž“$žŒ$ž…$ž~$žw$žp$ži$žb$ž[$žT$žM$žF$ž?$ž8$ž1$ž*$ž#$ž$ž$ž$ž$ž$žù#žò#žë#žä#žÝ#žÖ#žÏ#žÈ#žÁ#žº#ž³#ž¬#ž¥#žž#ž—#ž#ž‰#ž‚#ž{#žt#žm#žf#ž_#žX#žQ#žJ#žC#ž<#ž5#ž.#ž'#ž #ž#ž#ž #ž#žý"žö"žï"žè"žá"žÚ"žÓ"žÌ"žÅ"ž¾"ž·"ž°"ž©"ž¢"ž›"ž”"ž"ž†"ž"žx"žq"žj"žc"ž\"žU"žN"žG"ž@"ž9"ž2"ž+"ž$"ž"ž"ž"ž"ž"žú!žó!žì!žå!žÞ!ž×!žÐ!žÉ!žÂ!ž»!ž´!ž­!ž¦!žŸ!ž˜!ž‘!žŠ!žƒ!ž|!žu!žn!žg!ž`!žY!žR!žK!žD!ž=!ž6!ž/!ž(!ž!!ž!ž!ž !ž!žþ ž÷ žð žé žâ žÛ žÔ žÍ žÆ ž¿ ž¸ ž± žª ž£ žœ ž• žŽ ž‡ ž€ žy žr žk žd ž] žV žO žH žA ž: ž3 ž, ž% ž ž ž ž ž žûžôžížæžßžØžÑžÊžÃž¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿžøžñžêžãžÜžÕžÎžÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúžóžìžåžÞž×žÐžÉžÂž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûžôžížæžßžØžÑžÊžÃž¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿžøžñžêžãžÜžÕžÎžÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúžóžìžåžÞž×žÐžÉžÂž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûžôžížæžßžØžÑžÊžÃž¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿžøžñžêžãžÜžÕžÎžÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžý žö žï žè žá žÚ žÓ žÌ žÅ ž¾ ž· ž° ž© ž¢ ž› ž” ž ž† ž žx žq žj žc ž\ žU žN žG ž@ ž9 ž2 ž+ ž$ ž ž ž ž ž žú žó žì žå žÞ ž× žÐ žÉ ž ž» ž´ ž­ ž¦ žŸ ž˜ ž‘ žŠ žƒ ž| žu žn žg ž` žY žR žK žD ž= ž6 ž/ ž( ž! ž ž ž ž žþ ž÷ žð žé žâ žÛ žÔ žÍ žÆ ž¿ ž¸ ž± žª ž£ žœ ž• žŽ ž‡ ž€ žy žr žk žd ž] žV žO žH žA ž: ž3 ž, ž% ž ž ž ž ž žû žô ží žæ žß žØ žÑ žÊ žà ž¼ žµ ž® ž§ ž  ž™ ž’ ž‹ ž„ ž} žv žo žh ža žZ žS žL žE ž> ž7 ž0 ž) ž" ž ž ž ž žÿ žø žñ žê žã žÜ žÕ žÎ žÇ žÀ ž¹ ž² ž« ž¤ ž ž– ž žˆ ž žz žs žl že ž^ žW žP žI žB ž; ž4 ž- ž& ž ž ž ž ž žüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúžóžìžåžÞž×žÐžÉžÂž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûžôžížæžßžØžÑžÊžÃž¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿžøžñžêžãžÜžÕžÎžÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿœøÿœñÿœêÿœãÿœÜÿœÕÿœÎÿœÇÿœÀÿœ¹ÿœ²ÿœ«ÿœ¤ÿœÿœ–ÿœÿœˆÿœÿœzÿœsÿœlÿœeÿœ^ÿœWÿœPÿœIÿœBÿœ;ÿœ4ÿœ-ÿœ&ÿœÿœÿœÿœ ÿœÿœüþœõþœîþœçþœàþœÙþœÒþœËþœÄþœ½þœ¶þœ¯þœ¨þœ¡þœšþœ“þœŒþœ…þœ~þœwþœpþœiþœbþœ[þœTþœMþœFþœ?þœ8þœ1þœ*þœ#þœþœþœþœþœþœùýœòýœëýœäýœÝýœÖýœÏýœÈýœÁýœºýœ³ýœ¬ýœ¥ýœžýœ—ýœýœ‰ýœ‚ýœ{ýœtýœmýœfýœ_ýœXýœQýœJýœCýœ<ýœ5ýœ.ýœ'ýœ ýœýœýœ ýœýœýüœöüœïüœèüœáüœÚüœÓüœÌüœÅüœ¾üœ·üœ°üœ©üœ¢üœ›üœ”üœüœ†üœüœxüœqüœjüœcüœ\üœUüœNüœGüœ@üœ9üœ2üœ+üœ$üœüœüœüœüœüœúûœóûœìûœåûœÞûœ×ûœÐûœÉûœÂûœ»ûœ´ûœ­ûœ¦ûœŸûœ˜ûœ‘ûœŠûœƒûœ|ûœuûœnûœgûœ`ûœYûœRûœKûœDûœ=ûœ6ûœ/ûœ(ûœ!ûœûœûœ ûœûœþúœ÷úœðúœéúœâúœÛúœÔúœÍúœÆúœ¿úœ¸úœ±úœªúœ£úœœúœ•úœŽúœ‡úœ€úœyúœrúœkúœdúœ]úœVúœOúœHúœAúœ:úœ3úœ,úœ%úœúœúœúœ úœúœûùœôùœíùœæùœßùœØùœÑùœÊùœÃùœ¼ùœµùœ®ùœ§ùœ ùœ™ùœ’ùœ‹ùœ„ùœ}ùœvùœoùœhùœaùœZùœSùœLùœEùœ>ùœ7ùœ0ùœ)ùœ"ùœùœùœ ùœùœÿøœøøœñøœêøœãøœÜøœÕøœÎøœÇøœÀøœ¹øœ²øœ«øœ¤øœøœ–øœøœˆøœøœzøœsøœløœeøœ^øœWøœPøœIøœBøœ;øœ4øœ-øœ&øœøœøœøœ øœøœü÷œõ÷œî÷œç÷œà÷œÙ÷œÒ÷œË÷œÄ÷œ½÷œ¶÷œ¯÷œ¨÷œ¡÷œš÷œ“÷œŒ÷œ…÷œ~÷œw÷œp÷œi÷œb÷œ[÷œT÷œM÷œF÷œ?÷œ8÷œ1÷œ*÷œ#÷œ÷œ÷œ÷œ÷œ÷œùöœòöœëöœäöœÝöœÖöœÏöœÈöœÁöœºöœ³öœ¬öœ¥öœžöœ—öœöœ‰öœ‚öœ{öœtöœmöœföœ_öœXöœQöœJöœCöœ<öœ5öœ.öœ'öœ öœöœöœ öœöœýõœöõœïõœèõœáõœÚõœÓõœÌõœÅõœ¾õœ·õœ°õœ©õœ¢õœ›õœ”õœõœ†õœõœxõœqõœjõœcõœ\õœUõœNõœGõœ@õœ9õœ2õœ+õœ$õœõœõœõœõœõœúôœóôœìôœåôœÞôœ×ôœÐôœÉôœÂôœ»ôœ´ôœ­ôœ¦ôœŸôœ˜ôœ‘ôœŠôœƒôœ|ôœuôœnôœgôœ`ôœYôœRôœKôœDôœ=ôœ6ôœ/ôœ(ôœ!ôœôœôœ ôœôœþóœ÷óœðóœéóœâóœÛóœÔóœÍóœÆóœ¿óœ¸óœ±óœªóœ£óœœóœ•óœŽóœ‡óœ€óœyóœróœkóœdóœ]óœVóœOóœHóœAóœ:óœ3óœ,óœ%óœóœóœóœ óœóœûòœôòœíòœæòœßòœØòœÑòœÊòœÃòœ¼òœµòœ®òœ§òœ òœ™òœ’òœ‹òœ„òœ}òœvòœoòœhòœaòœZòœSòœLòœEòœ>òœ7òœ0òœ)òœ"òœòœòœ òœòœÿñœøñœññœêñœãñœÜñœÕñœÎñœÇñœÀñœ¹ñœ²ñœ«ñœ¤ñœñœ–ñœñœˆñœñœzñœsñœlñœeñœ^ñœWñœPñœIñœBñœ;ñœ4ñœ-ñœ&ñœñœñœñœ ñœñœüðœõðœîðœçðœàðœÙðœÒðœËðœÄðœ½ðœ¶ðœ¯ðœ¨ðœ¡ðœšðœ“ðœŒðœ…ðœ~ðœwðœpðœiðœbðœ[ðœTðœMðœFðœ?ðœ8ðœ1ðœ*ðœ#ðœðœðœðœðœðœùïœòïœëïœäïœÝïœÖïœÏïœÈïœÁïœïœ‰ïœ‚ïœ{ïœtïœmïœfïœ_ïœXïœQïœJïœCïœ<ïœ5ïœ.ïœ'ïœ ïœïœïœ ïœïœýîœöîœïîœèîœáîœÚîœÓîœÌîœÅîœîœ†îœîœxîœqîœjîœcîœ\îœUîœNîœGîœ@îœ9îœ2îœ+îœ$îœîœîœîœîœîœúíœóíœìíœåíœÞíœ×íœÐíœÉíœÂ휻휴휭휦휟휘휑휊휃íœ|íœuíœníœgíœ`íœYíœRíœKíœDíœ=íœ6íœ/íœ(íœ!íœíœíœ íœíœþìœ÷ìœðìœéìœâìœÛìœÔìœÍìœÆìœ¿ìœ¸ìœ±ìœªìœ£ìœœìœ•ìœŽìœ‡ìœ€ìœyìœrìœkìœdìœ]ìœVìœOìœHìœAìœ:ìœ3ìœ,ìœ%ìœìœìœìœ ìœìœûëœôëœíëœæëœßëœØëœÑëœÊëœÃ뜼뜵뜮뜧뜠뜙뜒뜋뜄ëœ}ëœvëœoëœhëœaëœZëœSëœLëœEëœ>ëœ7ëœ0ëœ)ëœ"ëœëœëœ ëœëœÿêœøêœñêœêêœãêœÜêœÕêœÎêœÇêœÀꜹꜲꜫꜤêœêœ–êœêœˆêœêœzêœsêœlêœeêœ^êœWêœPêœIêœBêœ;êœ4êœ-êœ&êœêœêœêœ êœêœüéœõéœîéœçéœàéœÙéœÒéœËéœÄ霽霶霯霨霡霚霓霌霅éœ~éœwéœpéœiéœbéœ[éœTéœMéœFéœ?éœ8éœ1éœ*éœ#éœéœéœéœéœéœùèœòèœëèœäèœÝèœÖèœÏèœÈèœÁ蜺蜳蜬蜥蜞蜗èœèœ‰èœ‚èœ{èœtèœmèœfèœ_èœXèœQèœJèœCèœ<èœ5èœ.èœ'èœ èœèœèœ èœèœýçœöçœïçœèçœáçœÚçœÓçœÌçœÅ眾眷眰眩眢眛眔çœçœ†çœçœxçœqçœjçœcçœ\çœUçœNçœGçœ@çœ9çœ2çœ+çœ$çœçœçœçœçœçœúæœóæœìæœåæœÞæœ׿œÐæœÉæœÂ朻朴札朦期朘朑朊會æœ|æœuæœnæœgæœ`æœYæœRæœKæœDæœ=æœ6æœ/æœ(æœ!æœæœæœ æœæœþåœ÷åœðåœéåœâåœÛåœÔåœÍåœÆåœ¿åœ¸åœ±åœªåœ£åœœåœ•åœŽåœ‡åœ€åœyåœråœkåœdåœ]åœVåœOåœHåœAåœ:åœ3åœ,åœ%åœåœåœåœ åœåœûäœôäœíäœæäœßäœØäœÑäœÊäœÃ䜼䜵䜮䜧䜠䜙䜒䜋䜄äœ}äœväœoäœhäœaäœZäœSäœLäœEäœ>äœ7äœ0äœ)äœ"äœäœäœ äœäœÿãœøãœñãœêãœããœÜãœÕãœÎãœÇãœÀ㜹㜲㜫㜤ãœãœ–ãœãœˆãœãœzãœsãœlãœeãœ^ãœWãœPãœIãœBãœ;ãœ4ãœ-ãœ&ãœãœãœãœ ãœãœüâœõâœîâœçâœàâœÙâœÒâœËâœÄ✽✶✯✨✡✚✓✌✅âœ~âœwâœpâœiâœbâœ[âœTâœMâœFâœ?âœ8âœ1âœ*âœ#âœâœâœâœâœâœùáœòáœëáœäáœÝáœÖáœÏáœÈáœÁ᜺ᜳᜬᜥ᜞᜗áœáœ‰áœ‚áœ{áœtáœmáœfáœ_áœXáœQáœJáœCáœ<áœ5áœ.áœ'ᜠáœáœáœ áœáœýàœöàœïàœèàœáàœÚàœÓàœÌàœÅàœ¾àœ·àœ°àœ©àœ¢àœ›àœ”àœàœ†àœàœxàœqàœjàœcàœ\àœUàœNàœGàœ@àœ9àœ2àœ+àœ$àœàœàœàœàœàœúßœóßœìßœåßœÞßœ×ßœÐßœÉßœÂßœ»ßœ´ßœ­ßœ¦ßœŸßœ˜ßœ‘ßœŠßœƒßœ|ßœußœnßœgßœ`ßœYßœRßœKßœDßœ=ßœ6ßœ/ßœ(ßœ!ߜߜߜ ߜߜþÞœ÷ÞœðÞœéÞœâÞœÛÞœÔÞœÍÞœÆÞœ¿Þœ¸Þœ±ÞœªÞœ£ÞœœÞœ•ÞœŽÞœ‡Þœ€ÞœyÞœrÞœkÞœdÞœ]ÞœVÞœOÞœHÞœAÞœ:Þœ3Þœ,Þœ%ޜޜޜޜ ޜޜûÝœôÝœíÝœæÝœßÝœØÝœÑÝœÊÝœÃÝœ¼ÝœµÝœ®Ýœ§Ýœ Ýœ™Ýœ’Ýœ‹Ýœ„Ýœ}ÝœvÝœoÝœhÝœaÝœZÝœSÝœLÝœEÝœ>Ýœ7Ýœ0Ýœ)Ýœ"ݜݜݜ ݜݜÿÜœøÜœñÜœêÜœãÜœÜÜœÕÜœÎÜœÇÜœÀÜœ¹Üœ²Üœ«Üœ¤ÜœÜœ–ܜܜˆÜœÜœzÜœsÜœlÜœeÜœ^ÜœWÜœPÜœIÜœBÜœ;Üœ4Üœ-Üœ&ܜܜܜܜ ܜܜüÛœõÛœîÛœçÛœàÛœÙÛœÒÛœËÛœÄÛœ½Ûœ¶Ûœ¯Ûœ¨Ûœ¡ÛœšÛœ“ÛœŒÛœ…Ûœ~ÛœwÛœpÛœiÛœbÛœ[ÛœTÛœMÛœFÛœ?Ûœ8Ûœ1Ûœ*Ûœ#ۜۜۜۜۜۜùÚœòÚœëÚœäÚœÝÚœÖÚœÏÚœÈÚœÁÚœºÚœ³Úœ¬Úœ¥ÚœžÚœ—ڜڜ‰Úœ‚Úœ{ÚœtÚœmÚœfÚœ_ÚœXÚœQÚœJÚœCÚœ<Úœ5Úœ.Úœ'Úœ ڜڜڜ ڜڜýÙœöÙœïÙœèÙœáÙœÚÙœÓÙœÌÙœÅÙœ¾Ùœ·Ùœ°Ùœ©Ùœ¢Ùœ›Ùœ”ٜٜ†ÙœÙœxÙœqÙœjÙœcÙœ\ÙœUÙœNÙœGÙœ@Ùœ9Ùœ2Ùœ+Ùœ$ٜٜٜٜٜٜúØœóØœìØœåØœÞØœרœÐØœÉØœÂØœ»Øœ´Øœ­Øœ¦ØœŸØœ˜Øœ‘ØœŠØœƒØœ|ØœuØœnØœgØœ`ØœYØœRØœKØœDØœ=Øœ6Øœ/Øœ(Øœ!؜؜؜ ؜؜þל÷לðלéלâלÛלÔלÍלÆ×œ¿×œ¸×œ±×œª×œ£×œœ×œ•לŽ×œ‡×œ€×œyלrלkלdל]לVלOלHלAל:ל3ל,ל%לללל ללûÖœôÖœíÖœæÖœßÖœØÖœÑÖœÊÖœÃÖœ¼ÖœµÖœ®Öœ§Öœ Öœ™Öœ’Öœ‹Öœ„Öœ}ÖœvÖœoÖœhÖœaÖœZÖœSÖœLÖœEÖœ>Öœ7Öœ0Öœ)Öœ"֜֜֜ ֜֜ÿÕœøÕœñÕœêÕœãÕœÜÕœÕÕœÎÕœÇÕœÀÕœ¹Õœ²Õœ«Õœ¤ÕœÕœ–՜՜ˆÕœÕœzÕœsÕœlÕœeÕœ^ÕœWÕœPÕœIÕœBÕœ;Õœ4Õœ-Õœ&՜՜՜՜ ՜՜üÔœõÔœîÔœçÔœàÔœÙÔœÒÔœËÔœÄÔœ½Ôœ¶Ôœ¯Ôœ¨Ôœ¡ÔœšÔœ“ÔœŒÔœ…Ôœ~ÔœwÔœpÔœiÔœbÔœ[ÔœTÔœMÔœFÔœ?Ôœ8Ôœ1Ôœ*Ôœ#ԜԜԜԜԜԜùÓœòÓœëÓœäÓœÝÓœÖÓœÏÓœÈÓœÁÓœºÓœ³Óœ¬Óœ¥ÓœžÓœ—ӜӜ‰Óœ‚Óœ{ÓœtÓœmÓœfÓœ_ÓœXÓœQÓœJÓœCÓœ<Óœ5Óœ.Óœ'Óœ ӜӜӜ ӜӜýÒœöÒœïÒœèÒœáÒœÚÒœÓÒœÌÒœÅÒœ¾Òœ·Òœ°Òœ©Òœ¢Òœ›Òœ”ҜҜ†ÒœÒœxÒœqÒœjÒœcÒœ\ÒœUÒœNÒœGÒœ@Òœ9Òœ2Òœ+Òœ$ҜҜҜҜҜҜúÑœóÑœìÑœåÑœÞÑœ×ÑœÐÑœÉÑœÂÑœ»Ñœ´Ñœ­Ñœ¦ÑœŸÑœ˜Ñœ‘ÑœŠÑœƒÑœ|ÑœuÑœnÑœgÑœ`ÑœYÑœRÑœKÑœDÑœ=Ñœ6Ñœ/Ñœ(Ñœ!ќќќ ќќþМ÷МðМéМâМÛМÔМÍМÆÐœ¿Ðœ¸Ðœ±ÐœªÐœ£ÐœœÐœ•МŽÐœ‡Ðœ€ÐœyМrМkМdМ]МVМOМHМAМ:М3М,М%ММММ ММûÏœôÏœíÏœæÏœßÏœØÏœÑÏœÊÏœÃÏœ¼ÏœµÏœ®Ïœ§Ïœ Ïœ™Ïœ’Ïœ‹Ïœ„Ïœ}ÏœvÏœoÏœhÏœaÏœZÏœSÏœLÏœEÏœ>Ïœ7Ïœ0Ïœ)Ïœ"ϜϜϜ ϜϜÿΜøÎœñΜêΜãΜÜΜÕΜÎΜÇΜÀΜ¹Îœ²Îœ«Îœ¤ÎœΜ–ΜΜˆÎœΜzΜsΜlΜeΜ^ΜWΜPΜIΜBΜ;Μ4Μ-Μ&ΜΜΜΜ ΜΜüÍœõÍœîÍœçÍœàÍœÙÍœÒÍœËÍœÄÍœ½Íœ¶Íœ¯Íœ¨Íœ¡ÍœšÍœ“ÍœŒÍœ…Íœ~ÍœwÍœpÍœiÍœbÍœ[ÍœTÍœMÍœFÍœ?Íœ8Íœ1Íœ*Íœ#͜͜͜͜͜͜ùÌœòÌœëÌœäÌœÝÌœÖÌœÏÌœÈÌœÁÌœºÌœ³Ìœ¬Ìœ¥ÌœžÌœ—̜̜‰Ìœ‚Ìœ{ÌœtÌœmÌœfÌœ_ÌœXÌœQÌœJÌœCÌœ<Ìœ5Ìœ.Ìœ'Ìœ ̜̜̜ ̜̜ýËœöËœïËœèËœáËœÚËœÓËœÌËœÅËœ¾Ëœ·Ëœ°Ëœ©Ëœ¢Ëœ›Ëœ”˜˜†ËœËœxËœqËœjËœcËœ\ËœUËœNËœGËœ@Ëœ9Ëœ2Ëœ+Ëœ$˜˜˜˜˜˜úÊœóÊœìÊœåÊœÞÊœ×ÊœÐÊœÉÊœÂÊœ»Êœ´Êœ­Êœ¦ÊœŸÊœ˜Êœ‘ÊœŠÊœƒÊœ|ÊœuÊœnÊœgÊœ`ÊœYÊœRÊœKÊœDÊœ=Êœ6Êœ/Êœ(Êœ!ʜʜʜ ʜʜþÉœ÷ÉœðÉœéÉœâÉœÛÉœÔÉœÍÉœÆÉœ¿Éœ¸Éœ±ÉœªÉœ£ÉœœÉœ•ÉœŽÉœ‡Éœ€ÉœyÉœrÉœkÉœdÉœ]ÉœVÉœOÉœHÉœAÉœ:Éœ3Éœ,Éœ%ɜɜɜɜ ɜɜûÈœôÈœíÈœæÈœßÈœØÈœÑÈœÊÈœÃÈœ¼ÈœµÈœ®Èœ§Èœ Èœ™Èœ’Èœ‹Èœ„Èœ}ÈœvÈœoÈœhÈœaÈœZÈœSÈœLÈœEÈœ>Èœ7Èœ0Èœ)Èœ"ȜȜȜ ȜȜÿÇœøÇœñÇœêÇœãÇœÜÇœÕÇœÎÇœÇÇœÀÇœ¹Çœ²Çœ«Çœ¤ÇœÇœ–ǜǜˆÇœÇœzÇœsÇœlÇœeÇœ^ÇœWÇœPÇœIÇœBÇœ;Çœ4Çœ-Çœ&ǜǜǜǜ ǜǜüÆœõÆœîÆœçÆœàÆœÙÆœÒÆœËÆœÄÆœ½Æœ¶Æœ¯Æœ¨Æœ¡ÆœšÆœ“ÆœŒÆœ…Æœ~ÆœwÆœpÆœiÆœbÆœ[ÆœTÆœMÆœFÆœ?Æœ8Æœ1Æœ*Æœ#ƜƜƜƜƜƜùÅœòÅœëÅœäÅœÝÅœÖÅœÏÅœÈÅœÁÅœºÅœ³Åœ¬Åœ¥ÅœžÅœ—ŜŜ‰Åœ‚Åœ{ÅœtÅœmÅœfÅœ_ÅœXÅœQÅœJÅœCÅœ<Åœ5Åœ.Åœ'Åœ ŜŜŜ ŜŜýÄœöÄœïÄœèÄœáÄœÚÄœÓÄœÌÄœÅÄœ¾Äœ·Äœ°Äœ©Äœ¢Äœ›Äœ”ĜĜ†ÄœÄœxÄœqÄœjÄœcÄœ\ÄœUÄœNÄœGÄœ@Äœ9Äœ2Äœ+Äœ$ĜĜĜĜĜĜúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘÜ‘܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþœ÷œðœéœâœÛœÔœÍœÆÂœ¿Âœ¸Âœ±ÂœªÂœ£ÂœœÂœ•œŽÂœ‡Âœ€Âœyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœûÁœôÁœíÁœæÁœßÁœØÁœÑÁœÊÁœÃÁœ¼ÁœµÁœ®Áœ§Áœ Áœ™Áœ’Áœ‹Áœ„Áœ}ÁœvÁœoÁœhÁœaÁœZÁœSÁœLÁœEÁœ>Áœ7Áœ0Áœ)Áœ"ÁœÁœÁœ ÁœÁœÿÀœøÀœñÀœêÀœãÀœÜÀœÕÀœÎÀœÇÀœÀÀœ¹Àœ²Àœ«Àœ¤ÀœÀœ–ÀœÀœˆÀœÀœzÀœsÀœlÀœeÀœ^ÀœWÀœPÀœIÀœBÀœ;Àœ4Àœ-Àœ&ÀœÀœÀœÀœ ÀœÀœü¿œõ¿œ翜࿜Ù¿œÒ¿œË¿œÄ¿œ½¿œ¶¿œ¯¿œ¨¿œ¡¿œš¿œ“¿œŒ¿œ…¿œ~¿œw¿œp¿œi¿œb¿œ[¿œT¿œM¿œF¿œ?¿œ8¿œ1¿œ*¿œ#¿œ¿œ¿œ¿œ¿œ¿œù¾œò¾œ뾜侜ݾœÖ¾œϾœȾœÁ¾œº¾œ³¾œ¬¾œ¥¾œž¾œ—¾œ¾œ‰¾œ‚¾œ{¾œt¾œm¾œf¾œ_¾œX¾œQ¾œJ¾œC¾œ<¾œ5¾œ.¾œ'¾œ ¾œ¾œ¾œ ¾œ¾œý½œö½œ|轜὜Ú½œÓ½œ̽œŽœ¾½œ·½œ°½œ©½œ¢½œ›½œ”½œ½œ†½œ½œx½œq½œj½œc½œ\½œU½œN½œG½œ@½œ9½œ2½œ+½œ$½œ½œ½œ½œ½œ½œú¼œó¼œ켜弜Þ¼œ×¼œмœɼœ¼œ»¼œ´¼œ­¼œ¦¼œŸ¼œ˜¼œ‘¼œмœƒ¼œ|¼œu¼œn¼œg¼œ`¼œY¼œR¼œK¼œD¼œ=¼œ6¼œ/¼œ(¼œ!¼œ¼œ¼œ ¼œ¼œþ»œ÷»œð»œ黜⻜Û»œÔ»œÍ»œÆ»œ¿»œ¸»œ±»œª»œ£»œœ»œ•»œŽ»œ‡»œ€»œy»œr»œk»œd»œ]»œV»œO»œH»œA»œ:»œ3»œ,»œ%»œ»œ»œ»œ »œ»œûºœôºœíºœ溜ߺœغœѺœʺœúœ¼ºœµºœ®ºœ§ºœ ºœ™ºœ’ºœ‹ºœ„ºœ}ºœvºœoºœhºœaºœZºœSºœLºœEºœ>ºœ7ºœ0ºœ)ºœ"ºœºœºœ ºœºœÿ¹œø¹œñ¹œ깜㹜ܹœÕ¹œιœǹœÀ¹œ¹¹œ²¹œ«¹œ¤¹œ¹œ–¹œ¹œˆ¹œ¹œz¹œs¹œl¹œe¹œ^¹œW¹œP¹œI¹œB¹œ;¹œ4¹œ-¹œ&¹œ¹œ¹œ¹œ ¹œ¹œü¸œõ¸œ縜ผÙ¸œÒ¸œ˸œĸœ½¸œ¶¸œ¯¸œ¨¸œ¡¸œš¸œ“¸œŒ¸œ…¸œ~¸œw¸œp¸œi¸œb¸œ[¸œT¸œM¸œF¸œ?¸œ8¸œ1¸œ*¸œ#¸œ¸œ¸œ¸œ¸œ¸œù·œò·œë·œä·œÝ·œÖ·œÏ·œÈ·œÁ·œº·œ³·œ¬·œ¥·œž·œ—·œ·œ‰·œ‚·œ{·œt·œm·œf·œ_·œX·œQ·œJ·œC·œ<·œ5·œ.·œ'·œ ·œ·œ·œ ·œ·œý¶œö¶œï¶œè¶œá¶œÚ¶œÓ¶œ̶œŶœ¾¶œ·¶œ°¶œ©¶œ¢¶œ›¶œ”¶œ¶œ†¶œ¶œx¶œq¶œj¶œc¶œ\¶œU¶œN¶œG¶œ@¶œ9¶œ2¶œ+¶œ$¶œ¶œ¶œ¶œ¶œ¶œúµœóµœ최嵜Þµœ×µœеœɵœµœ»µœ´µœ­µœ¦µœŸµœ˜µœ‘µœеœƒµœ|µœuµœnµœgµœ`µœYµœRµœKµœDµœ=µœ6µœ/µœ(µœ!µœµœµœ µœµœþ´œ÷´œð´œé´œâ´œÛ´œÔ´œÍ´œÆ´œ¿´œ¸´œ±´œª´œ£´œœ´œ•´œŽ´œ‡´œ€´œy´œr´œk´œd´œ]´œV´œO´œH´œA´œ:´œ3´œ,´œ%´œ´œ´œ´œ ´œ´œû³œô³œí³œ泜ß³œسœѳœʳœóœ¼³œµ³œ®³œ§³œ ³œ™³œ’³œ‹³œ„³œ}³œv³œo³œh³œa³œZ³œS³œL³œE³œ>³œ7³œ0³œ)³œ"³œ³œ³œ ³œ³œÿ²œø²œñ²œ겜㲜ܲœÕ²œβœDzœÀ²œ¹²œ²²œ«²œ¤²œ²œ–²œ²œˆ²œ²œz²œs²œl²œe²œ^²œW²œP²œI²œB²œ;²œ4²œ-²œ&²œ²œ²œ²œ ²œ²œü±œõ±œ籜౜Ù±œÒ±œ˱œıœ½±œ¶±œ¯±œ¨±œ¡±œš±œ“±œŒ±œ…±œ~±œw±œp±œi±œb±œ[±œT±œM±œF±œ?±œ8±œ1±œ*±œ#±œ±œ±œ±œ±œ±œù°œò°œë°œä°œݰœÖ°œϰœȰœÁ°œº°œ³°œ¬°œ¥°œž°œ—°œ°œ‰°œ‚°œ{°œt°œm°œf°œ_°œX°œQ°œJ°œC°œ<°œ5°œ.°œ'°œ °œ°œ°œ °œ°œý¯œö¯œﯜ诜ᯜÚ¯œÓ¯œ̯œůœ¾¯œ·¯œ°¯œ©¯œ¢¯œ›¯œ”¯œ¯œ†¯œ¯œx¯œq¯œj¯œc¯œ\¯œU¯œN¯œG¯œ@¯œ9¯œ2¯œ+¯œ$¯œ¯œ¯œ¯œ¯œ¯œú®œó®œ쮜宜Þ®œ×®œЮœÉ®œ®œ»®œ´®œ­®œ¦®œŸ®œ˜®œ‘®œŠ®œƒ®œ|®œu®œn®œg®œ`®œY®œR®œK®œD®œ=®œ6®œ/®œ(®œ!®œ®œ®œ ®œ®œþ­œ÷­œð­œé­œâ­œÛ­œÔ­œÍ­œÆ­œ¿­œ¸­œ±­œª­œ£­œœ­œ•­œŽ­œ‡­œ€­œy­œr­œk­œd­œ]­œV­œO­œH­œA­œ:­œ3­œ,­œ%­œ­œ­œ­œ ­œ­œû¬œô¬œí¬œ欜߬œجœѬœʬœìœ¼¬œµ¬œ®¬œ§¬œ ¬œ™¬œ’¬œ‹¬œ„¬œ}¬œv¬œo¬œh¬œa¬œZ¬œS¬œL¬œE¬œ>¬œ7¬œ0¬œ)¬œ"¬œ¬œ¬œ ¬œ¬œÿ«œø«œñ«œꫜ㫜Ü«œÕ«œΫœÇ«œÀ«œ¹«œ²«œ««œ¤«œ«œ–«œ«œˆ«œ«œz«œs«œl«œe«œ^«œW«œP«œI«œB«œ;«œ4«œ-«œ&«œ«œ«œ«œ «œ«œüªœõªœ窜જÙªœÒªœ˪œĪœ½ªœ¶ªœ¯ªœ¨ªœ¡ªœšªœ“ªœŒªœ…ªœ~ªœwªœpªœiªœbªœ[ªœTªœMªœFªœ?ªœ8ªœ1ªœ*ªœ#ªœªœªœªœªœªœù©œò©œ멜䩜Ý©œÖ©œÏ©œÈ©œÁ©œº©œ³©œ¬©œ¥©œž©œ—©œ©œ‰©œ‚©œ{©œt©œm©œf©œ_©œX©œQ©œJ©œC©œ<©œ5©œ.©œ'©œ ©œ©œ©œ ©œ©œý¨œö¨œ靖訜᨜Ú¨œÓ¨œ̨œŨœ¾¨œ·¨œ°¨œ©¨œ¢¨œ›¨œ”¨œ¨œ†¨œ¨œx¨œq¨œj¨œc¨œ\¨œU¨œN¨œG¨œ@¨œ9¨œ2¨œ+¨œ$¨œ¨œ¨œ¨œ¨œ¨œú§œó§œì§œå§œÞ§œ×§œЧœɧœ§œ»§œ´§œ­§œ¦§œŸ§œ˜§œ‘§œЧœƒ§œ|§œu§œn§œg§œ`§œY§œR§œK§œD§œ=§œ6§œ/§œ(§œ!§œ§œ§œ §œ§œþ¦œ÷¦œð¦œ馜⦜Û¦œÔ¦œͦœƦœ¿¦œ¸¦œ±¦œª¦œ£¦œœ¦œ•¦œަœ‡¦œ€¦œy¦œr¦œk¦œd¦œ]¦œV¦œO¦œH¦œA¦œ:¦œ3¦œ,¦œ%¦œ¦œ¦œ¦œ ¦œ¦œû¥œô¥œí¥œ楜ߥœØ¥œÑ¥œÊ¥œÃ¥œ¼¥œµ¥œ®¥œ§¥œ ¥œ™¥œ’¥œ‹¥œ„¥œ}¥œv¥œo¥œh¥œa¥œZ¥œS¥œL¥œE¥œ>¥œ7¥œ0¥œ)¥œ"¥œ¥œ¥œ ¥œ¥œÿ¤œø¤œñ¤œꤜ㤜ܤœÕ¤œΤœǤœÀ¤œ¹¤œ²¤œ«¤œ¤¤œ¤œ–¤œ¤œˆ¤œ¤œz¤œs¤œl¤œe¤œ^¤œW¤œP¤œI¤œB¤œ;¤œ4¤œ-¤œ&¤œ¤œ¤œ¤œ ¤œ¤œü£œõ£œ磜ࣜÙ£œÒ£œË£œÄ£œ½£œ¶£œ¯£œ¨£œ¡£œš£œ“£œŒ£œ…£œ~£œw£œp£œi£œb£œ[£œT£œM£œF£œ?£œ8£œ1£œ*£œ#£œ£œ£œ£œ£œ£œù¢œò¢œ뢜䢜Ý¢œÖ¢œÏ¢œÈ¢œÁ¢œº¢œ³¢œ¬¢œ¥¢œž¢œ—¢œ¢œ‰¢œ‚¢œ{¢œt¢œm¢œf¢œ_¢œX¢œQ¢œJ¢œC¢œ<¢œ5¢œ.¢œ'¢œ ¢œ¢œ¢œ ¢œ¢œý¡œö¡œ衜ᡜÚ¡œÓ¡œÌ¡œÅ¡œ¾¡œ·¡œ°¡œ©¡œ¢¡œ›¡œ”¡œ¡œ†¡œ¡œx¡œq¡œj¡œc¡œ\¡œU¡œN¡œG¡œ@¡œ9¡œ2¡œ+¡œ$¡œ¡œ¡œ¡œ¡œ¡œú œó œì œå œÞ œ× œРœÉ œ œ» œ´ œ­ œ¦ œŸ œ˜ œ‘ œŠ œƒ œ| œu œn œg œ` œY œR œK œD œ= œ6 œ/ œ( œ! œ œ œ  œ œþŸœ÷ŸœðŸœ韜⟜ÛŸœÔŸœÍŸœÆŸœ¿Ÿœ¸Ÿœ±ŸœªŸœ£ŸœœŸœ•ŸœŽŸœ‡Ÿœ€ŸœyŸœrŸœkŸœdŸœ]ŸœVŸœOŸœHŸœAŸœ:Ÿœ3Ÿœ,Ÿœ%ŸœŸœŸœŸœ ŸœŸœûžœôžœížœæžœßžœØžœÑžœÊžœÞœ¼žœµžœ®žœ§žœ žœ™žœ’žœ‹žœ„žœ}žœvžœožœhžœažœZžœSžœLžœEžœ>žœ7žœ0žœ)žœ"žœžœžœ žœžœÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüœœõœœ眜àœœÙœœÒœœËœœÄœœ½œœ¶œœ¯œœ¨œœ¡œœšœœ“œœŒœœ…œœ~œœwœœpœœiœœbœœ[œœTœœMœœFœœ?œœ8œœ1œœ*œœ#œœœœœœœœœœœœù›œò›œ뛜䛜Ý›œÖ›œÏ›œÈ›œÁ›œº›œ³›œ¬›œ¥›œž›œ—›œ›œ‰›œ‚›œ{›œt›œm›œf›œ_›œX›œQ›œJ›œC›œ<›œ5›œ.›œ'›œ ›œ›œ›œ ›œ›œýšœöšœïšœèšœášœÚšœÓšœÌšœÅšœ¾šœ·šœ°šœ©šœ¢šœ›šœ”šœšœ†šœšœxšœqšœjšœcšœ\šœUšœNšœGšœ@šœ9šœ2šœ+šœ$šœšœšœšœšœšœú™œó™œ왜噜Þ™œ×™œЙœÉ™œ™œ»™œ´™œ­™œ¦™œŸ™œ˜™œ‘™œŠ™œƒ™œ|™œu™œn™œg™œ`™œY™œR™œK™œD™œ=™œ6™œ/™œ(™œ!™œ™œ™œ ™œ™œþ˜œ÷˜œð˜œ阜☜Û˜œÔ˜œ͘œƘœ¿˜œ¸˜œ±˜œª˜œ£˜œœ˜œ•˜œŽ˜œ‡˜œ€˜œy˜œr˜œk˜œd˜œ]˜œV˜œO˜œH˜œA˜œ:˜œ3˜œ,˜œ%˜œ˜œ˜œ˜œ ˜œ˜œû—œô—œí—œæ—œß—œØ—œÑ—œÊ—œל¼—œµ—œ®—œ§—œ —œ™—œ’—œ‹—œ„—œ}—œv—œo—œh—œa—œZ—œS—œL—œE—œ>—œ7—œ0—œ)—œ"—œ—œ—œ —œ—œÿ–œø–œñ–œê–œã–œÜ–œÕ–œΖœÇ–œÀ–œ¹–œ²–œ«–œ¤–œ–œ––œ–œˆ–œ–œz–œs–œl–œe–œ^–œW–œP–œI–œB–œ;–œ4–œ-–œ&–œ–œ–œ–œ –œ–œü•œõ•œ畜à•œÙ•œÒ•œË•œÄ•œ½•œ¶•œ¯•œ¨•œ¡•œš•œ“•œŒ•œ…•œ~•œw•œp•œi•œb•œ[•œT•œM•œF•œ?•œ8•œ1•œ*•œ#•œ•œ•œ•œ•œ•œù”œò”œ딜䔜Ý”œÖ”œÏ”œÈ”œÁ”œº”œ³”œ¬”œ¥”œž”œ—”œ”œ‰”œ‚”œ{”œt”œm”œf”œ_”œX”œQ”œJ”œC”œ<”œ5”œ.”œ'”œ ”œ”œ”œ ”œ”œý“œö“œ蓜ᓜÚ“œÓ“œÌ“œÅ“œ¾“œ·“œ°“œ©“œ¢“œ›“œ”“œ“œ†“œ“œx“œq“œj“œc“œ\“œU“œN“œG“œ@“œ9“œ2“œ+“œ$“œ“œ“œ“œ“œ“œú’œó’œì’œå’œÞ’œ×’œÐ’œÉ’œÂ’œ»’œ´’œ­’œ¦’œŸ’œ˜’œ‘’œŠ’œƒ’œ|’œu’œn’œg’œ`’œY’œR’œK’œD’œ=’œ6’œ/’œ(’œ!’œ’œ’œ ’œ’œþ‘œ÷‘œð‘œ鑜⑜Û‘œÔ‘œÍ‘œÆ‘œ¿‘œ¸‘œ±‘œª‘œ£‘œœ‘œ•‘œŽ‘œ‡‘œ€‘œy‘œr‘œk‘œd‘œ]‘œV‘œO‘œH‘œA‘œ:‘œ3‘œ,‘œ%‘œ‘œ‘œ‘œ ‘œ‘œûœôœíœæœßœØœÑœÊœÜ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüŽœõŽœ玜àŽœÙŽœÒŽœËŽœÄŽœ½Žœ¶Žœ¯Žœ¨Žœ¡ŽœšŽœ“ŽœŒŽœ…Žœ~ŽœwŽœpŽœiŽœbŽœ[ŽœTŽœMŽœFŽœ?Žœ8Žœ1Žœ*Žœ#ŽœŽœŽœŽœŽœŽœùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýŒœöŒœ茜ጜÚŒœÓŒœÌŒœÅŒœ¾Œœ·Œœ°Œœ©Œœ¢Œœ›Œœ”ŒœŒœ†ŒœŒœxŒœqŒœjŒœcŒœ\ŒœUŒœNŒœGŒœ@Œœ9Œœ2Œœ+Œœ$ŒœŒœŒœŒœŒœŒœú‹œó‹œ시勜Þ‹œ׋œЋœÉ‹œ‹œ»‹œ´‹œ­‹œ¦‹œŸ‹œ˜‹œ‘‹œŠ‹œƒ‹œ|‹œu‹œn‹œg‹œ`‹œY‹œR‹œK‹œD‹œ=‹œ6‹œ/‹œ(‹œ!‹œ‹œ‹œ ‹œ‹œþŠœ÷ŠœðŠœ銜⊜ÛŠœÔŠœÍŠœÆŠœ¿Šœ¸Šœ±ŠœªŠœ£ŠœœŠœ•ŠœŽŠœ‡Šœ€ŠœyŠœrŠœkŠœdŠœ]ŠœVŠœOŠœHŠœAŠœ:Šœ3Šœ,Šœ%ŠœŠœŠœŠœ ŠœŠœû‰œô‰œ퉜扜߉œ؉œщœʉœÉœ¼‰œµ‰œ®‰œ§‰œ ‰œ™‰œ’‰œ‹‰œ„‰œ}‰œv‰œo‰œh‰œa‰œZ‰œS‰œL‰œE‰œ>‰œ7‰œ0‰œ)‰œ"‰œ‰œ‰œ ‰œ‰œÿˆœøˆœñˆœꈜ㈜܈œÕˆœΈœLjœÀˆœ¹ˆœ²ˆœ«ˆœ¤ˆœˆœ–ˆœˆœˆˆœˆœzˆœsˆœlˆœeˆœ^ˆœWˆœPˆœIˆœBˆœ;ˆœ4ˆœ-ˆœ&ˆœˆœˆœˆœ ˆœˆœü‡œõ‡œ燜à‡œÙ‡œÒ‡œˇœćœ½‡œ¶‡œ¯‡œ¨‡œ¡‡œš‡œ“‡œŒ‡œ…‡œ~‡œw‡œp‡œi‡œb‡œ[‡œT‡œM‡œF‡œ?‡œ8‡œ1‡œ*‡œ#‡œ‡œ‡œ‡œ‡œ‡œù†œò†œ놜䆜݆œÖ†œφœȆœÁ†œº†œ³†œ¬†œ¥†œž†œ—†œ†œ‰†œ‚†œ{†œt†œm†œf†œ_†œX†œQ†œJ†œC†œ<†œ5†œ.†œ'†œ †œ†œ†œ †œ†œý…œö…œï…œè…œá…œÚ…œÓ…œÌ…œÅ…œ¾…œ·…œ°…œ©…œ¢…œ›…œ”…œ…œ†…œ…œx…œq…œj…œc…œ\…œU…œN…œG…œ@…œ9…œ2…œ+…œ$…œ…œ…œ…œ…œ…œú„œó„œ서儜Þ„œׄœЄœÉ„œ„œ»„œ´„œ­„œ¦„œŸ„œ˜„œ‘„œŠ„œƒ„œ|„œu„œn„œg„œ`„œY„œR„œK„œD„œ=„œ6„œ/„œ(„œ!„œ„œ„œ „œ„œþƒœ÷ƒœðƒœ郜⃜ÛƒœÔƒœ̓œƃœ¿ƒœ¸ƒœ±ƒœªƒœ£ƒœœƒœ•ƒœŽƒœ‡ƒœ€ƒœyƒœrƒœkƒœdƒœ]ƒœVƒœOƒœHƒœAƒœ:ƒœ3ƒœ,ƒœ%ƒœƒœƒœƒœ ƒœƒœû‚œô‚œ킜悜ß‚œØ‚œÑ‚œÊ‚œœ¼‚œµ‚œ®‚œ§‚œ ‚œ™‚œ’‚œ‹‚œ„‚œ}‚œv‚œo‚œh‚œa‚œZ‚œS‚œL‚œE‚œ>‚œ7‚œ0‚œ)‚œ"‚œ‚œ‚œ ‚œ‚œÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœü€œõ€œ瀜à€œÙ€œÒ€œË€œÄ€œ½€œ¶€œ¯€œ¨€œ¡€œš€œ“€œŒ€œ…€œ~€œw€œp€œi€œb€œ[€œT€œM€œF€œ?€œ8€œ1€œ*€œ#€œ€œ€œ€œ€œ€œùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý~œö~œï~œè~œá~œÚ~œÓ~œÌ~œÅ~œ¾~œ·~œ°~œ©~œ¢~œ›~œ”~œ~œ†~œ~œx~œq~œj~œc~œ\~œU~œN~œG~œ@~œ9~œ2~œ+~œ$~œ~œ~œ~œ~œ~œú}œó}œì}œå}œÞ}œ×}œÐ}œÉ}œÂ}œ»}œ´}œ­}œ¦}œŸ}œ˜}œ‘}œŠ}œƒ}œ|}œu}œn}œg}œ`}œY}œR}œK}œD}œ=}œ6}œ/}œ(}œ!}œ}œ}œ }œ}œþ|œ÷|œð|œé|œâ|œÛ|œÔ|œÍ|œÆ|œ¿|œ¸|œ±|œª|œ£|œœ|œ•|œŽ|œ‡|œ€|œy|œr|œk|œd|œ]|œV|œO|œH|œA|œ:|œ3|œ,|œ%|œ|œ|œ|œ |œ|œû{œô{œí{œæ{œß{œØ{œÑ{œÊ{œÃ{œ¼{œµ{œ®{œ§{œ {œ™{œ’{œ‹{œ„{œ}{œv{œo{œh{œa{œZ{œS{œL{œE{œ>{œ7{œ0{œ){œ"{œ{œ{œ {œ{œÿzœøzœñzœêzœãzœÜzœÕzœÎzœÇzœÀzœ¹zœ²zœ«zœ¤zœzœ–zœzœˆzœzœzzœszœlzœezœ^zœWzœPzœIzœBzœ;zœ4zœ-zœ&zœzœzœzœ zœzœüyœõyœîyœçyœàyœÙyœÒyœËyœÄyœ½yœ¶yœ¯yœ¨yœ¡yœšyœ“yœŒyœ…yœ~yœwyœpyœiyœbyœ[yœTyœMyœFyœ?yœ8yœ1yœ*yœ#yœyœyœyœyœyœùxœòxœëxœäxœÝxœÖxœÏxœÈxœÁxœºxœ³xœ¬xœ¥xœžxœ—xœxœ‰xœ‚xœ{xœtxœmxœfxœ_xœXxœQxœJxœCxœtœ7tœ0tœ)tœ"tœtœtœ tœtœÿsœøsœñsœêsœãsœÜsœÕsœÎsœÇsœÀsœ¹sœ²sœ«sœ¤sœsœ–sœsœˆsœsœzsœssœlsœesœ^sœWsœPsœIsœBsœ;sœ4sœ-sœ&sœsœsœsœ sœsœürœõrœîrœçrœàrœÙrœÒrœËrœÄrœ½rœ¶rœ¯rœ¨rœ¡rœšrœ“rœŒrœ…rœ~rœwrœprœirœbrœ[rœTrœMrœFrœ?rœ8rœ1rœ*rœ#rœrœrœrœrœrœùqœòqœëqœäqœÝqœÖqœÏqœÈqœÁqœºqœ³qœ¬qœ¥qœžqœ—qœqœ‰qœ‚qœ{qœtqœmqœfqœ_qœXqœQqœJqœCqœmœ7mœ0mœ)mœ"mœmœmœ mœmœÿlœølœñlœêlœãlœÜlœÕlœÎlœÇlœÀlœ¹lœ²lœ«lœ¤lœlœ–lœlœˆlœlœzlœslœllœelœ^lœWlœPlœIlœBlœ;lœ4lœ-lœ&lœlœlœlœ lœlœükœõkœîkœçkœàkœÙkœÒkœËkœÄkœ½kœ¶kœ¯kœ¨kœ¡kœškœ“kœŒkœ…kœ~kœwkœpkœikœbkœ[kœTkœMkœFkœ?kœ8kœ1kœ*kœ#kœkœkœkœkœkœùjœòjœëjœäjœÝjœÖjœÏjœÈjœÁjœºjœ³jœ¬jœ¥jœžjœ—jœjœ‰jœ‚jœ{jœtjœmjœfjœ_jœXjœQjœJjœCjœfœ7fœ0fœ)fœ"fœfœfœ fœfœÿeœøeœñeœêeœãeœÜeœÕeœÎeœÇeœÀeœ¹eœ²eœ«eœ¤eœeœ–eœeœˆeœeœzeœseœleœeeœ^eœWeœPeœIeœBeœ;eœ4eœ-eœ&eœeœeœeœ eœeœüdœõdœîdœçdœàdœÙdœÒdœËdœÄdœ½dœ¶dœ¯dœ¨dœ¡dœšdœ“dœŒdœ…dœ~dœwdœpdœidœbdœ[dœTdœMdœFdœ?dœ8dœ1dœ*dœ#dœdœdœdœdœdœùcœòcœëcœäcœÝcœÖcœÏcœÈcœÁcœºcœ³cœ¬cœ¥cœžcœ—cœcœ‰cœ‚cœ{cœtcœmcœfcœ_cœXcœQcœJcœCcœ_œ7_œ0_œ)_œ"_œ_œ_œ _œ_œÿ^œø^œñ^œê^œã^œÜ^œÕ^œÎ^œÇ^œÀ^œ¹^œ²^œ«^œ¤^œ^œ–^œ^œˆ^œ^œz^œs^œl^œe^œ^^œW^œP^œI^œB^œ;^œ4^œ-^œ&^œ^œ^œ^œ ^œ^œü]œõ]œî]œç]œà]œÙ]œÒ]œË]œÄ]œ½]œ¶]œ¯]œ¨]œ¡]œš]œ“]œŒ]œ…]œ~]œw]œp]œi]œb]œ[]œT]œM]œF]œ?]œ8]œ1]œ*]œ#]œ]œ]œ]œ]œ]œù\œò\œë\œä\œÝ\œÖ\œÏ\œÈ\œÁ\œº\œ³\œ¬\œ¥\œž\œ—\œ\œ‰\œ‚\œ{\œt\œm\œf\œ_\œX\œQ\œJ\œC\œ<\œ5\œ.\œ'\œ \œ\œ\œ \œ\œý[œö[œï[œè[œá[œÚ[œÓ[œÌ[œÅ[œ¾[œ·[œ°[œ©[œ¢[œ›[œ”[œ[œ†[œ[œx[œq[œj[œc[œ\[œU[œN[œG[œ@[œ9[œ2[œ+[œ$[œ[œ[œ[œ[œ[œúZœóZœìZœåZœÞZœ×ZœÐZœÉZœÂZœ»Zœ´Zœ­Zœ¦ZœŸZœ˜Zœ‘ZœŠZœƒZœ|ZœuZœnZœgZœ`ZœYZœRZœKZœDZœ=Zœ6Zœ/Zœ(Zœ!ZœZœZœ ZœZœþYœ÷YœðYœéYœâYœÛYœÔYœÍYœÆYœ¿Yœ¸Yœ±YœªYœ£YœœYœ•YœŽYœ‡Yœ€YœyYœrYœkYœdYœ]YœVYœOYœHYœAYœ:Yœ3Yœ,Yœ%YœYœYœYœ YœYœûXœôXœíXœæXœßXœØXœÑXœÊXœÃXœ¼XœµXœ®Xœ§Xœ Xœ™Xœ’Xœ‹Xœ„Xœ}XœvXœoXœhXœaXœZXœSXœLXœEXœ>Xœ7Xœ0Xœ)Xœ"XœXœXœ XœXœÿWœøWœñWœêWœãWœÜWœÕWœÎWœÇWœÀWœ¹Wœ²Wœ«Wœ¤WœWœ–WœWœˆWœWœzWœsWœlWœeWœ^WœWWœPWœIWœBWœ;Wœ4Wœ-Wœ&WœWœWœWœ WœWœüVœõVœîVœçVœàVœÙVœÒVœËVœÄVœ½Vœ¶Vœ¯Vœ¨Vœ¡VœšVœ“VœŒVœ…Vœ~VœwVœpVœiVœbVœ[VœTVœMVœFVœ?Vœ8Vœ1Vœ*Vœ#VœVœVœVœVœVœùUœòUœëUœäUœÝUœÖUœÏUœÈUœÁUœºUœ³Uœ¬Uœ¥UœžUœ—UœUœ‰Uœ‚Uœ{UœtUœmUœfUœ_UœXUœQUœJUœCUœQœ7Qœ0Qœ)Qœ"QœQœQœ QœQœÿPœøPœñPœêPœãPœÜPœÕPœÎPœÇPœÀPœ¹Pœ²Pœ«Pœ¤PœPœ–PœPœˆPœPœzPœsPœlPœePœ^PœWPœPPœIPœBPœ;Pœ4Pœ-Pœ&PœPœPœPœ PœPœüOœõOœîOœçOœàOœÙOœÒOœËOœÄOœ½Oœ¶Oœ¯Oœ¨Oœ¡OœšOœ“OœŒOœ…Oœ~OœwOœpOœiOœbOœ[OœTOœMOœFOœ?Oœ8Oœ1Oœ*Oœ#OœOœOœOœOœOœùNœòNœëNœäNœÝNœÖNœÏNœÈNœÁNœºNœ³Nœ¬Nœ¥NœžNœ—NœNœ‰Nœ‚Nœ{NœtNœmNœfNœ_NœXNœQNœJNœCNœJœ7Jœ0Jœ)Jœ"JœJœJœ JœJœÿIœøIœñIœêIœãIœÜIœÕIœÎIœÇIœÀIœ¹Iœ²Iœ«Iœ¤IœIœ–IœIœˆIœIœzIœsIœlIœeIœ^IœWIœPIœIIœBIœ;Iœ4Iœ-Iœ&IœIœIœIœ IœIœüHœõHœîHœçHœàHœÙHœÒHœËHœÄHœ½Hœ¶Hœ¯Hœ¨Hœ¡HœšHœ“HœŒHœ…Hœ~HœwHœpHœiHœbHœ[HœTHœMHœFHœ?Hœ8Hœ1Hœ*Hœ#HœHœHœHœHœHœùGœòGœëGœäGœÝGœÖGœÏGœÈGœÁGœºGœ³Gœ¬Gœ¥GœžGœ—GœGœ‰Gœ‚Gœ{GœtGœmGœfGœ_GœXGœQGœJGœCGœCœ7Cœ0Cœ)Cœ"CœCœCœ CœCœÿBœøBœñBœêBœãBœÜBœÕBœÎBœÇBœÀBœ¹Bœ²Bœ«Bœ¤BœBœ–BœBœˆBœBœzBœsBœlBœeBœ^BœWBœPBœIBœBBœ;Bœ4Bœ-Bœ&BœBœBœBœ BœBœüAœõAœîAœçAœàAœÙAœÒAœËAœÄAœ½Aœ¶Aœ¯Aœ¨Aœ¡AœšAœ“AœŒAœ…Aœ~AœwAœpAœiAœbAœ[AœTAœMAœFAœ?Aœ8Aœ1Aœ*Aœ#AœAœAœAœAœAœù@œò@œë@œä@œÝ@œÖ@œÏ@œÈ@œÁ@œº@œ³@œ¬@œ¥@œž@œ—@œ@œ‰@œ‚@œ{@œt@œm@œf@œ_@œX@œQ@œJ@œC@œ<@œ5@œ.@œ'@œ @œ@œ@œ @œ@œý?œö?œï?œè?œá?œÚ?œÓ?œÌ?œÅ?œ¾?œ·?œ°?œ©?œ¢?œ›?œ”?œ?œ†?œ?œx?œq?œj?œc?œ\?œU?œN?œG?œ@?œ9?œ2?œ+?œ$?œ?œ?œ?œ?œ?œú>œó>œì>œå>œÞ>œ×>œÐ>œÉ>œÂ>œ»>œ´>œ­>œ¦>œŸ>œ˜>œ‘>œŠ>œƒ>œ|>œu>œn>œg>œ`>œY>œR>œK>œD>œ=>œ6>œ/>œ(>œ!>œ>œ>œ >œ>œþ=œ÷=œð=œé=œâ=œÛ=œÔ=œÍ=œÆ=œ¿=œ¸=œ±=œª=œ£=œœ=œ•=œŽ=œ‡=œ€=œy=œr=œk=œd=œ]=œV=œO=œH=œA=œ:=œ3=œ,=œ%=œ=œ=œ=œ =œ=œû<œô<œí<œæ<œß<œØ<œÑ<œÊ<œÃ<œ¼<œµ<œ®<œ§<œ <œ™<œ’<œ‹<œ„<œ}<œv<œo<œh<œa<œZ<œS<œL<œE<œ><œ7<œ0<œ)<œ"<œ<œ<œ <œ<œÿ;œø;œñ;œê;œã;œÜ;œÕ;œÎ;œÇ;œÀ;œ¹;œ²;œ«;œ¤;œ;œ–;œ;œˆ;œ;œz;œs;œl;œe;œ^;œW;œP;œI;œB;œ;;œ4;œ-;œ&;œ;œ;œ;œ ;œ;œü:œõ:œî:œç:œà:œÙ:œÒ:œË:œÄ:œ½:œ¶:œ¯:œ¨:œ¡:œš:œ“:œŒ:œ…:œ~:œw:œp:œi:œb:œ[:œT:œM:œF:œ?:œ8:œ1:œ*:œ#:œ:œ:œ:œ:œ:œù9œò9œë9œä9œÝ9œÖ9œÏ9œÈ9œÁ9œº9œ³9œ¬9œ¥9œž9œ—9œ9œ‰9œ‚9œ{9œt9œm9œf9œ_9œX9œQ9œJ9œC9œ<9œ59œ.9œ'9œ 9œ9œ9œ 9œ9œý8œö8œï8œè8œá8œÚ8œÓ8œÌ8œÅ8œ¾8œ·8œ°8œ©8œ¢8œ›8œ”8œ8œ†8œ8œx8œq8œj8œc8œ\8œU8œN8œG8œ@8œ98œ28œ+8œ$8œ8œ8œ8œ8œ8œú7œó7œì7œå7œÞ7œ×7œÐ7œÉ7œÂ7œ»7œ´7œ­7œ¦7œŸ7œ˜7œ‘7œŠ7œƒ7œ|7œu7œn7œg7œ`7œY7œR7œK7œD7œ=7œ67œ/7œ(7œ!7œ7œ7œ 7œ7œþ6œ÷6œð6œé6œâ6œÛ6œÔ6œÍ6œÆ6œ¿6œ¸6œ±6œª6œ£6œœ6œ•6œŽ6œ‡6œ€6œy6œr6œk6œd6œ]6œV6œO6œH6œA6œ:6œ36œ,6œ%6œ6œ6œ6œ 6œ6œû5œô5œí5œæ5œß5œØ5œÑ5œÊ5œÃ5œ¼5œµ5œ®5œ§5œ 5œ™5œ’5œ‹5œ„5œ}5œv5œo5œh5œa5œZ5œS5œL5œE5œ>5œ75œ05œ)5œ"5œ5œ5œ 5œ5œÿ4œø4œñ4œê4œã4œÜ4œÕ4œÎ4œÇ4œÀ4œ¹4œ²4œ«4œ¤4œ4œ–4œ4œˆ4œ4œz4œs4œl4œe4œ^4œW4œP4œI4œB4œ;4œ44œ-4œ&4œ4œ4œ4œ 4œ4œü3œõ3œî3œç3œà3œÙ3œÒ3œË3œÄ3œ½3œ¶3œ¯3œ¨3œ¡3œš3œ“3œŒ3œ…3œ~3œw3œp3œi3œb3œ[3œT3œM3œF3œ?3œ83œ13œ*3œ#3œ3œ3œ3œ3œ3œù2œò2œë2œä2œÝ2œÖ2œÏ2œÈ2œÁ2œº2œ³2œ¬2œ¥2œž2œ—2œ2œ‰2œ‚2œ{2œt2œm2œf2œ_2œX2œQ2œJ2œC2œ<2œ52œ.2œ'2œ 2œ2œ2œ 2œ2œý1œö1œï1œè1œá1œÚ1œÓ1œÌ1œÅ1œ¾1œ·1œ°1œ©1œ¢1œ›1œ”1œ1œ†1œ1œx1œq1œj1œc1œ\1œU1œN1œG1œ@1œ91œ21œ+1œ$1œ1œ1œ1œ1œ1œú0œó0œì0œå0œÞ0œ×0œÐ0œÉ0œÂ0œ»0œ´0œ­0œ¦0œŸ0œ˜0œ‘0œŠ0œƒ0œ|0œu0œn0œg0œ`0œY0œR0œK0œD0œ=0œ60œ/0œ(0œ!0œ0œ0œ 0œ0œþ/œ÷/œð/œé/œâ/œÛ/œÔ/œÍ/œÆ/œ¿/œ¸/œ±/œª/œ£/œœ/œ•/œŽ/œ‡/œ€/œy/œr/œk/œd/œ]/œV/œO/œH/œA/œ:/œ3/œ,/œ%/œ/œ/œ/œ /œ/œû.œô.œí.œæ.œß.œØ.œÑ.œÊ.œÃ.œ¼.œµ.œ®.œ§.œ .œ™.œ’.œ‹.œ„.œ}.œv.œo.œh.œa.œZ.œS.œL.œE.œ>.œ7.œ0.œ).œ".œ.œ.œ .œ.œÿ-œø-œñ-œê-œã-œÜ-œÕ-œÎ-œÇ-œÀ-œ¹-œ²-œ«-œ¤-œ-œ–-œ-œˆ-œ-œz-œs-œl-œe-œ^-œW-œP-œI-œB-œ;-œ4-œ--œ&-œ-œ-œ-œ -œ-œü,œõ,œî,œç,œà,œÙ,œÒ,œË,œÄ,œ½,œ¶,œ¯,œ¨,œ¡,œš,œ“,œŒ,œ…,œ~,œw,œp,œi,œb,œ[,œT,œM,œF,œ?,œ8,œ1,œ*,œ#,œ,œ,œ,œ,œ,œù+œò+œë+œä+œÝ+œÖ+œÏ+œÈ+œÁ+œº+œ³+œ¬+œ¥+œž+œ—+œ+œ‰+œ‚+œ{+œt+œm+œf+œ_+œX+œQ+œJ+œC+œ<+œ5+œ.+œ'+œ +œ+œ+œ +œ+œý*œö*œï*œè*œá*œÚ*œÓ*œÌ*œÅ*œ¾*œ·*œ°*œ©*œ¢*œ›*œ”*œ*œ†*œ*œx*œq*œj*œc*œ\*œU*œN*œG*œ@*œ9*œ2*œ+*œ$*œ*œ*œ*œ*œ*œú)œó)œì)œå)œÞ)œ×)œÐ)œÉ)œÂ)œ»)œ´)œ­)œ¦)œŸ)œ˜)œ‘)œŠ)œƒ)œ|)œu)œn)œg)œ`)œY)œR)œK)œD)œ=)œ6)œ/)œ()œ!)œ)œ)œ )œ)œþ(œ÷(œð(œé(œâ(œÛ(œÔ(œÍ(œÆ(œ¿(œ¸(œ±(œª(œ£(œœ(œ•(œŽ(œ‡(œ€(œy(œr(œk(œd(œ](œV(œO(œH(œA(œ:(œ3(œ,(œ%(œ(œ(œ(œ (œ(œû'œô'œí'œæ'œß'œØ'œÑ'œÊ'œÃ'œ¼'œµ'œ®'œ§'œ 'œ™'œ’'œ‹'œ„'œ}'œv'œo'œh'œa'œZ'œS'œL'œE'œ>'œ7'œ0'œ)'œ"'œ'œ'œ 'œ'œÿ&œø&œñ&œê&œã&œÜ&œÕ&œÎ&œÇ&œÀ&œ¹&œ²&œ«&œ¤&œ&œ–&œ&œˆ&œ&œz&œs&œl&œe&œ^&œW&œP&œI&œB&œ;&œ4&œ-&œ&&œ&œ&œ&œ &œ&œü%œõ%œî%œç%œà%œÙ%œÒ%œË%œÄ%œ½%œ¶%œ¯%œ¨%œ¡%œš%œ“%œŒ%œ…%œ~%œw%œp%œi%œb%œ[%œT%œM%œF%œ?%œ8%œ1%œ*%œ#%œ%œ%œ%œ%œ%œù$œò$œë$œä$œÝ$œÖ$œÏ$œÈ$œÁ$œº$œ³$œ¬$œ¥$œž$œ—$œ$œ‰$œ‚$œ{$œt$œm$œf$œ_$œX$œQ$œJ$œC$œ<$œ5$œ.$œ'$œ $œ$œ$œ $œ$œý#œö#œï#œè#œá#œÚ#œÓ#œÌ#œÅ#œ¾#œ·#œ°#œ©#œ¢#œ›#œ”#œ#œ†#œ#œx#œq#œj#œc#œ\#œU#œN#œG#œ@#œ9#œ2#œ+#œ$#œ#œ#œ#œ#œ#œú"œó"œì"œå"œÞ"œ×"œÐ"œÉ"œÂ"œ»"œ´"œ­"œ¦"œŸ"œ˜"œ‘"œŠ"œƒ"œ|"œu"œn"œg"œ`"œY"œR"œK"œD"œ="œ6"œ/"œ("œ!"œ"œ"œ "œ"œþ!œ÷!œð!œé!œâ!œÛ!œÔ!œÍ!œÆ!œ¿!œ¸!œ±!œª!œ£!œœ!œ•!œŽ!œ‡!œ€!œy!œr!œk!œd!œ]!œV!œO!œH!œA!œ:!œ3!œ,!œ%!œ!œ!œ!œ !œ!œû œô œí œæ œß œØ œÑ œÊ œà œ¼ œµ œ® œ§ œ  œ™ œ’ œ‹ œ„ œ} œv œo œh œa œZ œS œL œE œ> œ7 œ0 œ) œ" œ œ œ œ œÿœøœñœêœãœÜœÕœÎœÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœúœóœìœåœÞœ×œÐœÉœÂœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœûœôœíœæœßœØœÑœÊœÃœ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿœøœñœêœãœÜœÕœÎœÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœúœóœìœåœÞœ×œÐœÉœÂœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœûœôœíœæœßœØœÑœÊœÃœ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿœøœñœêœãœÜœÕœÎœÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœú œó œì œå œÞ œ× œÐ œÉ œ œ» œ´ œ­ œ¦ œŸ œ˜ œ‘ œŠ œƒ œ| œu œn œg œ` œY œR œK œD œ= œ6 œ/ œ( œ! œ œ œ œ œþ œ÷ œð œé œâ œÛ œÔ œÍ œÆ œ¿ œ¸ œ± œª œ£ œœ œ• œŽ œ‡ œ€ œy œr œk œd œ] œV œO œH œA œ: œ3 œ, œ% œ œ œ œ œ œû œô œí œæ œß œØ œÑ œÊ œà œ¼ œµ œ® œ§ œ  œ™ œ’ œ‹ œ„ œ} œv œo œh œa œZ œS œL œE œ> œ7 œ0 œ) œ" œ œ œ œ œÿ œø œñ œê œã œÜ œÕ œÎ œÇ œÀ œ¹ œ² œ« œ¤ œ œ– œ œˆ œ œz œs œl œe œ^ œW œP œI œB œ; œ4 œ- œ& œ œ œ œ œ œü œõ œî œç œà œÙ œÒ œË œÄ œ½ œ¶ œ¯ œ¨ œ¡ œš œ“ œŒ œ… œ~ œw œp œi œb œ[ œT œM œF œ? œ8 œ1 œ* œ# œ œ œ œ œ œùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœúœóœìœåœÞœ×œÐœÉœÂœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœûœôœíœæœßœØœÑœÊœÃœ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿœøœñœêœãœÜœÕœÎœÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœüœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœúÿ›óÿ›ìÿ›åÿ›Þÿ›×ÿ›Ðÿ›Éÿ›Âÿ›»ÿ›´ÿ›­ÿ›¦ÿ›Ÿÿ›˜ÿ›‘ÿ›Šÿ›ƒÿ›|ÿ›uÿ›nÿ›gÿ›`ÿ›Yÿ›Rÿ›Kÿ›Dÿ›=ÿ›6ÿ›/ÿ›(ÿ›!ÿ›ÿ›ÿ› ÿ›ÿ›þþ›÷þ›ðþ›éþ›âþ›Ûþ›Ôþ›Íþ›Æþ›¿þ›¸þ›±þ›ªþ›£þ›œþ›•þ›Žþ›‡þ›€þ›yþ›rþ›kþ›dþ›]þ›Vþ›Oþ›Hþ›Aþ›:þ›3þ›,þ›%þ›þ›þ›þ› þ›þ›ûý›ôý›íý›æý›ßý›Øý›Ñý›Êý›Ãý›¼ý›µý›®ý›§ý› ý›™ý›’ý›‹ý›„ý›}ý›vý›oý›hý›aý›Zý›Sý›Lý›Eý›>ý›7ý›0ý›)ý›"ý›ý›ý› ý›ý›ÿü›øü›ñü›êü›ãü›Üü›Õü›Îü›Çü›Àü›¹ü›²ü›«ü›¤ü›ü›–ü›ü›ˆü›ü›zü›sü›lü›eü›^ü›Wü›Pü›Iü›Bü›;ü›4ü›-ü›&ü›ü›ü›ü› ü›ü›üû›õû›îû›çû›àû›Ùû›Òû›Ëû›Äû›½û›¶û›¯û›¨û›¡û›šû›“û›Œû›…û›~û›wû›pû›iû›bû›[û›Tû›Mû›Fû›?û›8û›1û›*û›#û›û›û›û›û›û›ùú›òú›ëú›äú›Ýú›Öú›Ïú›Èú›Áú›ºú›³ú›¬ú›¥ú›žú›—ú›ú›‰ú›‚ú›{ú›tú›mú›fú›_ú›Xú›Qú›Jú›Cú›<ú›5ú›.ú›'ú› ú›ú›ú› ú›ú›ýù›öù›ïù›èù›áù›Úù›Óù›Ìù›Åù›¾ù›·ù›°ù›©ù›¢ù››ù›”ù›ù›†ù›ù›xù›qù›jù›cù›\ù›Uù›Nù›Gù›@ù›9ù›2ù›+ù›$ù›ù›ù›ù›ù›ù›úø›óø›ìø›åø›Þø›×ø›Ðø›Éø›Âø›»ø›´ø›­ø›¦ø›Ÿø›˜ø›‘ø›Šø›ƒø›|ø›uø›nø›gø›`ø›Yø›Rø›Kø›Dø›=ø›6ø›/ø›(ø›!ø›ø›ø› ø›ø›þ÷›÷÷›ð÷›é÷›â÷›Û÷›Ô÷›Í÷›Æ÷›¿÷›¸÷›±÷›ª÷›£÷›œ÷›•÷›Ž÷›‡÷›€÷›y÷›r÷›k÷›d÷›]÷›V÷›O÷›H÷›A÷›:÷›3÷›,÷›%÷›÷›÷›÷› ÷›÷›ûö›ôö›íö›æö›ßö›Øö›Ñö›Êö›Ãö›¼ö›µö›®ö›§ö› ö›™ö›’ö›‹ö›„ö›}ö›vö›oö›hö›aö›Zö›Sö›Lö›Eö›>ö›7ö›0ö›)ö›"ö›ö›ö› ö›ö›ÿõ›øõ›ñõ›êõ›ãõ›Üõ›Õõ›Îõ›Çõ›Àõ›¹õ›²õ›«õ›¤õ›õ›–õ›õ›ˆõ›õ›zõ›sõ›lõ›eõ›^õ›Wõ›Põ›Iõ›Bõ›;õ›4õ›-õ›&õ›õ›õ›õ› õ›õ›üô›õô›îô›çô›àô›Ùô›Òô›Ëô›Äô›½ô›¶ô›¯ô›¨ô›¡ô›šô›“ô›Œô›…ô›~ô›wô›pô›iô›bô›[ô›Tô›Mô›Fô›?ô›8ô›1ô›*ô›#ô›ô›ô›ô›ô›ô›ùó›òó›ëó›äó›Ýó›Öó›Ïó›Èó›Áó›ºó›³ó›¬ó›¥ó›žó›—ó›ó›‰ó›‚ó›{ó›tó›mó›fó›_ó›Xó›Qó›Jó›Có›<ó›5ó›.ó›'ó› ó›ó›ó› ó›ó›ýò›öò›ïò›èò›áò›Úò›Óò›Ìò›Åò›¾ò›·ò›°ò›©ò›¢ò››ò›”ò›ò›†ò›ò›xò›qò›jò›cò›\ò›Uò›Nò›Gò›@ò›9ò›2ò›+ò›$ò›ò›ò›ò›ò›ò›úñ›óñ›ìñ›åñ›Þñ›×ñ›Ðñ›Éñ›Âñ›»ñ›´ñ›­ñ›¦ñ›Ÿñ›˜ñ›‘ñ›Šñ›ƒñ›|ñ›uñ›nñ›gñ›`ñ›Yñ›Rñ›Kñ›Dñ›=ñ›6ñ›/ñ›(ñ›!ñ›ñ›ñ› ñ›ñ›þð›÷ð›ðð›éð›âð›Ûð›Ôð›Íð›Æð›¿ð›¸ð›±ð›ªð›£ð›œð›•ð›Žð›‡ð›€ð›yð›rð›kð›dð›]ð›Vð›Oð›Hð›Að›:ð›3ð›,ð›%ð›ð›ð›ð› ð›ð›ûï›ôï›íï›æï›ßï›Øï›Ñï›Êï›Ãï›}ï›vï›oï›hï›aï›Zï›Sï›Lï›Eï›>ï›7ï›0ï›)ï›"ï›ï›ï› ï›ï›ÿî›øî›ñî›êî›ãî›Üî›Õî›Îî›Çî›Àî›î›–î›î›ˆî›î›zî›sî›lî›eî›^î›Wî›Pî›Iî›Bî›;î›4î›-î›&î›î›î›î› î›î›üí›õí›îí›çí›àí›Ùí›Òí›Ëí›Ä훽훶훯훨훡훚훓훌훅í›~í›wí›pí›ií›bí›[í›Tí›Mí›Fí›?í›8í›1í›*í›#í›í›í›í›í›í›ùì›òì›ëì›äì›Ýì›Öì›Ïì›Èì›Á웺웳웬웥웞웗ì›ì›‰ì›‚ì›{ì›tì›mì›fì›_ì›Xì›Qì›Jì›Cì›<ì›5ì›.ì›'ì› ì›ì›ì› ì›ì›ýë›öë›ïë›èë›áë›Úë›Óë›Ìë›Å뛾뛷뛰뛩뛢뛛뛔ë›ë›†ë›ë›xë›që›jë›cë›\ë›Uë›Në›Gë›@ë›9ë›2ë›+ë›$ë›ë›ë›ë›ë›ë›úê›óê›ìê›åê›Þê›×ê›Ðê›Éê›Â꛻꛴ꛭꛦꛟꛘꛑꛊꛃê›|ê›uê›nê›gê›`ê›Yê›Rê›Kê›Dê›=ê›6ê›/ê›(ê›!ê›ê›ê› ê›ê›þé›÷é›ðé›éé›âé›Ûé›Ôé›Íé›Æé›¿é›¸é›±é›ªé›£é›œé›•é›Žé›‡é›€é›yé›ré›ké›dé›]é›Vé›Oé›Hé›Aé›:é›3é›,é›%é›é›é›é› é›é›ûè›ôè›íè›æè›ßè›Øè›Ñè›Êè›Ã蛼蛵蛮蛧蛠蛙蛒蛋蛄è›}è›vè›oè›hè›aè›Zè›Sè›Lè›Eè›>è›7è›0è›)è›"è›è›è› è›è›ÿç›øç›ñç›êç›ãç›Üç›Õç›Îç›Çç›À盹盲盫盤ç›ç›–ç›ç›ˆç›ç›zç›sç›lç›eç›^ç›Wç›Pç›Iç›Bç›;ç›4ç›-ç›&ç›ç›ç›ç› ç›ç›üæ›õæ›îæ›çæ›àæ›Ùæ›Òæ›Ëæ›Ä曽曶曯曨曡曚曓曌曅æ›~æ›wæ›pæ›iæ›bæ›[æ›Tæ›Mæ›Fæ›?æ›8æ›1æ›*æ›#æ›æ›æ›æ›æ›æ›ùå›òå›ëå›äå›Ýå›Öå›Ïå›Èå›Á固図囬囥回囗å›å›‰å›‚å›{å›tå›må›få›_å›Xå›Qå›Jå›Cå›<å›5å›.å›'å› å›å›å› å›å›ýä›öä›ïä›èä›áä›Úä›Óä›Ìä›Å䛾䛷䛰䛩䛢䛛䛔ä›ä›†ä›ä›xä›qä›jä›cä›\ä›Uä›Nä›Gä›@ä›9ä›2ä›+ä›$ä›ä›ä›ä›ä›ä›úã›óã›ìã›åã›Þã›×ã›Ðã›Éã›Â㛻㛴㛭㛦㛟㛘㛑㛊㛃ã›|ã›uã›nã›gã›`ã›Yã›Rã›Kã›Dã›=ã›6ã›/ã›(ã›!ã›ã›ã› ã›ã›þâ›÷â›ðâ›éâ›ââ›Ûâ›Ôâ›Íâ›Æâ›¿â›¸â›±â›ªâ›£â›œâ›•â›Žâ›‡â›€â›yâ›râ›kâ›dâ›]â›Vâ›Oâ›Hâ›Aâ›:â›3â›,â›%â›â›â›â› â›â›ûá›ôá›íá›æá›ßá›Øá›Ñá›Êá›Ã᛼ᛵᛮᛧᛠᛙᛒᛋᛄá›}á›vá›oá›há›aá›Zá›Sá›Lá›Eá›>á›7á›0á›)á›"á›á›á› á›á›ÿà›øà›ñà›êà›ãà›Üà›Õà›Îà›Çà›Àà›¹à›²à›«à›¤à›à›–à›à›ˆà›à›zà›sà›là›eà›^à›Wà›Pà›Ià›Bà›;à›4à›-à›&à›à›à›à› à›à›üß›õß›îß›çß›àß›Ùß›Òß›Ëß›Äß›½ß›¶ß›¯ß›¨ß›¡ß›šß›“ß›Œß›…ß›~ß›wß›pß›iß›bß›[ß›Tß›Mß›Fß›?ß›8ß›1ß›*ß›#ߛߛߛߛߛߛùÞ›òÞ›ëÞ›äÞ›ÝÞ›ÖÞ›ÏÞ›ÈÞ›ÁÞ›ºÞ›³Þ›¬Þ›¥Þ›žÞ›—Þ›Þ›‰Þ›‚Þ›{Þ›tÞ›mÞ›fÞ›_Þ›XÞ›QÞ›JÞ›CÞ›<Þ›5Þ›.Þ›'Þ› Þ›Þ›Þ› Þ›Þ›ýÝ›öÝ›ïÝ›èÝ›áÝ›ÚÝ›ÓÝ›ÌÝ›ÅÝ›¾Ý›·Ý›°Ý›©Ý›¢Ý››Ý›”ݛݛ†Ý›Ý›xÝ›qÝ›jÝ›cÝ›\Ý›UÝ›NÝ›GÝ›@Ý›9Ý›2Ý›+Ý›$ݛݛݛݛݛݛúÜ›óÜ›ìÜ›åÜ›ÞÜ›×Ü›ÐÜ›ÉÜ›ÂÜ›»Ü›´Ü›­Ü›¦Ü›ŸÜ›˜Ü›‘Ü›ŠÜ›ƒÜ›|Ü›uÜ›nÜ›gÜ›`Ü›YÜ›RÜ›KÜ›DÜ›=Ü›6Ü›/Ü›(Ü›!ܛܛܛ ܛܛþÛ›÷Û›ðÛ›éÛ›âÛ›ÛÛ›ÔÛ›ÍÛ›ÆÛ›¿Û›¸Û›±Û›ªÛ›£Û›œÛ›•Û›ŽÛ›‡Û›€Û›yÛ›rÛ›kÛ›dÛ›]Û›VÛ›OÛ›HÛ›AÛ›:Û›3Û›,Û›%Û›Û›Û›Û› Û›Û›ûÚ›ôÚ›íÚ›æÚ›ßÚ›ØÚ›ÑÚ›ÊÚ›ÃÚ›¼Ú›µÚ›®Ú›§Ú› Ú›™Ú›’Ú›‹Ú›„Ú›}Ú›vÚ›oÚ›hÚ›aÚ›ZÚ›SÚ›LÚ›EÚ›>Ú›7Ú›0Ú›)Ú›"Ú›Ú›Ú› Ú›Ú›ÿÙ›øÙ›ñÙ›êÙ›ãÙ›ÜÙ›ÕÙ›ÎÙ›ÇÙ›ÀÙ›¹Ù›²Ù›«Ù›¤Ù›Ù›–Ù›Ù›ˆÙ›Ù›zÙ›sÙ›lÙ›eÙ›^Ù›WÙ›PÙ›IÙ›BÙ›;Ù›4Ù›-Ù›&Ù›Ù›Ù›Ù› Ù›Ù›üØ›õØ›îØ›çØ›àØ›ÙØ›ÒØ›ËØ›ÄØ›½Ø›¶Ø›¯Ø›¨Ø›¡Ø›šØ›“Ø›ŒØ›…Ø›~Ø›wØ›pØ›iØ›bØ›[Ø›TØ›MØ›FØ›?Ø›8Ø›1Ø›*Ø›#؛؛؛؛؛؛ù×›ò×›ë×›ä×›Ý×›Ö×›Ï×›È×›Á×›º×›³×›¬×›¥×›ž×›—×›×›‰×›‚×›{×›t×›m×›f×›_×›X×›Q×›J×›C×›<×›5×›.×›'×› ×›×›×› ×›×›ýÖ›öÖ›ïÖ›èÖ›áÖ›ÚÖ›ÓÖ›ÌÖ›ÅÖ›¾Ö›·Ö›°Ö›©Ö›¢Ö››Ö›”Ö›Ö›†Ö›Ö›xÖ›qÖ›jÖ›cÖ›\Ö›UÖ›NÖ›GÖ›@Ö›9Ö›2Ö›+Ö›$Ö›Ö›Ö›Ö›Ö›Ö›úÕ›óÕ›ìÕ›åÕ›ÞÕ›×Õ›ÐÕ›ÉÕ›ÂÕ›»Õ›´Õ›­Õ›¦Õ›ŸÕ›˜Õ›‘Õ›ŠÕ›ƒÕ›|Õ›uÕ›nÕ›gÕ›`Õ›YÕ›RÕ›KÕ›DÕ›=Õ›6Õ›/Õ›(Õ›!Õ›Õ›Õ› Õ›Õ›þÔ›÷Ô›ðÔ›éÔ›âÔ›ÛÔ›ÔÔ›ÍÔ›ÆÔ›¿Ô›¸Ô›±Ô›ªÔ›£Ô›œÔ›•Ô›ŽÔ›‡Ô›€Ô›yÔ›rÔ›kÔ›dÔ›]Ô›VÔ›OÔ›HÔ›AÔ›:Ô›3Ô›,Ô›%Ô›Ô›Ô›Ô› Ô›Ô›ûÓ›ôÓ›íÓ›æÓ›ßÓ›ØÓ›ÑÓ›ÊÓ›ÃÓ›¼Ó›µÓ›®Ó›§Ó› Ó›™Ó›’Ó›‹Ó›„Ó›}Ó›vÓ›oÓ›hÓ›aÓ›ZÓ›SÓ›LÓ›EÓ›>Ó›7Ó›0Ó›)Ó›"Ó›Ó›Ó› Ó›Ó›ÿÒ›øÒ›ñÒ›êÒ›ãÒ›ÜÒ›ÕÒ›ÎÒ›ÇÒ›ÀÒ›¹Ò›²Ò›«Ò›¤Ò›Ò›–Ò›Ò›ˆÒ›Ò›zÒ›sÒ›lÒ›eÒ›^Ò›WÒ›PÒ›IÒ›BÒ›;Ò›4Ò›-Ò›&Ò›Ò›Ò›Ò› Ò›Ò›üÑ›õÑ›îÑ›çÑ›àÑ›ÙÑ›ÒÑ›ËÑ›ÄÑ›½Ñ›¶Ñ›¯Ñ›¨Ñ›¡Ñ›šÑ›“Ñ›ŒÑ›…Ñ›~Ñ›wÑ›pÑ›iÑ›bÑ›[Ñ›TÑ›MÑ›FÑ›?Ñ›8Ñ›1Ñ›*Ñ›#ћћћћћћùЛòЛëЛäЛÝЛÖЛÏЛÈЛÁЛºÐ›³Ð›¬Ð›¥Ð›žÐ›—ЛЛ‰Ð›‚Л{ЛtЛmЛfЛ_ЛXЛQЛJЛCЛ<Л5Л.Л'Л ЛЛЛ ЛЛýÏ›öÏ›ïÏ›èÏ›áÏ›ÚÏ›ÓÏ›ÌÏ›ÅÏ›¾Ï›·Ï›°Ï›©Ï›¢Ï››Ï›”ϛϛ†Ï›Ï›xÏ›qÏ›jÏ›cÏ›\Ï›UÏ›NÏ›GÏ›@Ï›9Ï›2Ï›+Ï›$ϛϛϛϛϛϛúΛóΛìΛåΛÞΛ×ΛÐΛÉΛÂΛ»Î›´Î›­Î›¦Î›ŸÎ›˜Î›‘ΛŠÎ›ƒÎ›|ΛuΛnΛgΛ`ΛYΛRΛKΛDΛ=Λ6Λ/Λ(Λ!ΛΛΛ ΛΛþÍ›÷Í›ðÍ›éÍ›âÍ›ÛÍ›ÔÍ›ÍÍ›ÆÍ›¿Í›¸Í›±Í›ªÍ›£Í›œÍ›•Í›ŽÍ›‡Í›€Í›yÍ›rÍ›kÍ›dÍ›]Í›VÍ›OÍ›HÍ›AÍ›:Í›3Í›,Í›%͛͛͛͛ ͛͛ûÌ›ôÌ›íÌ›æÌ›ßÌ›ØÌ›ÑÌ›ÊÌ›ÃÌ›¼Ì›µÌ›®Ì›§Ì› Ì›™Ì›’Ì›‹Ì›„Ì›}Ì›vÌ›oÌ›hÌ›aÌ›ZÌ›SÌ›LÌ›EÌ›>Ì›7Ì›0Ì›)Ì›"̛̛̛ ̛̛ÿË›øË›ñË›êË›ãË›ÜË›ÕË›ÎË›ÇË›ÀË›¹Ë›²Ë›«Ë›¤Ë›Ë›–˛˛ˆË›Ë›zË›sË›lË›eË›^Ë›WË›PË›IË›BË›;Ë›4Ë›-Ë›&˛˛˛˛ ˛˛üÊ›õÊ›îÊ›çÊ›àÊ›ÙÊ›ÒÊ›ËÊ›ÄÊ›½Ê›¶Ê›¯Ê›¨Ê›¡Ê›šÊ›“Ê›ŒÊ›…Ê›~Ê›wÊ›pÊ›iÊ›bÊ›[Ê›TÊ›MÊ›FÊ›?Ê›8Ê›1Ê›*Ê›#ʛʛʛʛʛʛùÉ›òÉ›ëÉ›äÉ›ÝÉ›ÖÉ›ÏÉ›ÈÉ›ÁÉ›ºÉ›³É›¬É›¥É›žÉ›—ɛɛ‰É›‚É›{É›tÉ›mÉ›fÉ›_É›XÉ›QÉ›JÉ›CÉ›<É›5É›.É›'É› ɛɛɛ ɛɛýÈ›öÈ›ïÈ›èÈ›áÈ›ÚÈ›ÓÈ›ÌÈ›ÅÈ›¾È›·È›°È›©È›¢È››È›”țț†È›È›xÈ›qÈ›jÈ›cÈ›\È›UÈ›NÈ›GÈ›@È›9È›2È›+È›$țțțțțțúÇ›óÇ›ìÇ›åÇ›ÞÇ›×Ç›ÐÇ›ÉÇ›ÂÇ›»Ç›´Ç›­Ç›¦Ç›ŸÇ›˜Ç›‘Ç›ŠÇ›ƒÇ›|Ç›uÇ›nÇ›gÇ›`Ç›YÇ›RÇ›KÇ›DÇ›=Ç›6Ç›/Ç›(Ç›!ǛǛǛ ǛǛþÆ›÷Æ›ðÆ›鯛âÆ›ÛÆ›ÔÆ›ÍÆ›ÆÆ›¿Æ›¸Æ›±Æ›ªÆ›£Æ›œÆ›•Æ›ŽÆ›‡Æ›€Æ›yÆ›rÆ›kÆ›dÆ›]Æ›VÆ›OÆ›HÆ›AÆ›:Æ›3Æ›,Æ›%ƛƛƛƛ ƛƛûÅ›ôÅ›íÅ›æÅ›ßÅ›ØÅ›ÑÅ›ÊÅ›ÃÅ›¼Å›µÅ›®Å›§Å› Å›™Å›’Å›‹Å›„Å›}Å›vÅ›oÅ›hÅ›aÅ›ZÅ›SÅ›LÅ›EÅ›>Å›7Å›0Å›)Å›"śśś śśÿÄ›øÄ›ñÄ›êÄ›ãÄ›ÜÄ›ÕÄ›ÎÄ›ÇÄ›ÀÄ›¹Ä›²Ä›«Ä›¤Ä›Ä›–ěěˆÄ›Ä›zÄ›sÄ›lÄ›eÄ›^Ä›WÄ›PÄ›IÄ›BÄ›;Ä›4Ä›-Ä›&ěěěě ěěüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚÛ“یÛ…Û~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛù›ò›ë›ä›Ý›Ö›Ï›È›Á›ºÂ›³Â›¬Â›¥Â›žÂ›—››‰Â›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ýÁ›öÁ›ïÁ›èÁ›áÁ›ÚÁ›ÓÁ›ÌÁ›ÅÁ›¾Á›·Á›°Á›©Á›¢Á››Á›”Á›Á›†Á›Á›xÁ›qÁ›jÁ›cÁ›\Á›UÁ›NÁ›GÁ›@Á›9Á›2Á›+Á›$Á›Á›Á›Á›Á›Á›úÀ›óÀ›ìÀ›åÀ›ÞÀ›×À›ÐÀ›ÉÀ›ÂÀ›»À›´À›­À›¦À›ŸÀ›˜À›‘À›ŠÀ›ƒÀ›|À›uÀ›nÀ›gÀ›`À›YÀ›RÀ›KÀ›DÀ›=À›6À›/À›(À›!À›À›À› À›À›þ¿›÷¿›ð¿›é¿›â¿›Û¿›Ô¿›Í¿›Æ¿›¿¿›¸¿›±¿›ª¿›£¿›œ¿›•¿›Ž¿›‡¿›€¿›y¿›r¿›k¿›d¿›]¿›V¿›O¿›H¿›A¿›:¿›3¿›,¿›%¿›¿›¿›¿› ¿›¿›û¾›ô¾›í¾›æ¾›ß¾›ؾ›Ѿ›ʾ›þ›¼¾›µ¾›®¾›§¾› ¾›™¾›’¾›‹¾›„¾›}¾›v¾›o¾›h¾›a¾›Z¾›S¾›L¾›E¾›>¾›7¾›0¾›)¾›"¾›¾›¾› ¾›¾›ÿ½›ø½›ñ½›ê½›ã½›ܽ›Õ½›ν›ǽ›À½›¹½›²½›«½›¤½›½›–½›½›ˆ½›½›z½›s½›l½›e½›^½›W½›P½›I½›B½›;½›4½›-½›&½›½›½›½› ½›½›ü¼›õ¼›î¼›ç¼›༛Ù¼›Ò¼›˼›ļ›½¼›¶¼›¯¼›¨¼›¡¼›š¼›“¼›Œ¼›…¼›~¼›w¼›p¼›i¼›b¼›[¼›T¼›M¼›F¼›?¼›8¼›1¼›*¼›#¼›¼›¼›¼›¼›¼›ù»›ò»›ë»›ä»›Ý»›Ö»›Ï»›È»›Á»›º»›³»›¬»›¥»›ž»›—»›»›‰»›‚»›{»›t»›m»›f»›_»›X»›Q»›J»›C»›<»›5»›.»›'»› »›»›»› »›»›ýº›öº›ﺛ躛ẛÚº›Óº›̺›ź›¾º›·º›°º›©º›¢º››º›”º›º›†º›º›xº›qº›jº›cº›\º›Uº›Nº›Gº›@º›9º›2º›+º›$º›º›º›º›º›º›ú¹›ó¹›ì¹›å¹›Þ¹›×¹›й›ɹ›¹›»¹›´¹›­¹›¦¹›Ÿ¹›˜¹›‘¹›й›ƒ¹›|¹›u¹›n¹›g¹›`¹›Y¹›R¹›K¹›D¹›=¹›6¹›/¹›(¹›!¹›¹›¹› ¹›¹›þ¸›÷¸›ð¸›鸛⸛Û¸›Ô¸›͸›Ƹ›¿¸›¸¸›±¸›ª¸›£¸›œ¸›•¸›ޏ›‡¸›€¸›y¸›r¸›k¸›d¸›]¸›V¸›O¸›H¸›A¸›:¸›3¸›,¸›%¸›¸›¸›¸› ¸›¸›û·›ô·›í·›æ·›ß·›Ø·›Ñ·›Ê·›÷›¼·›µ·›®·›§·› ·›™·›’·›‹·›„·›}·›v·›o·›h·›a·›Z·›S·›L·›E·›>·›7·›0·›)·›"·›·›·› ·›·›ÿ¶›ø¶›ñ¶›ê¶›ã¶›ܶ›Õ¶›ζ›Ƕ›À¶›¹¶›²¶›«¶›¤¶›¶›–¶›¶›ˆ¶›¶›z¶›s¶›l¶›e¶›^¶›W¶›P¶›I¶›B¶›;¶›4¶›-¶›&¶›¶›¶›¶› ¶›¶›üµ›õµ›îµ›çµ›൛Ùµ›Òµ›˵›ĵ›½µ›¶µ›¯µ›¨µ›¡µ›šµ›“µ›Œµ›…µ›~µ›wµ›pµ›iµ›bµ›[µ›Tµ›Mµ›Fµ›?µ›8µ›1µ›*µ›#µ›µ›µ›µ›µ›µ›ù´›ò´›ë´›ä´›Ý´›Ö´›Ï´›È´›Á´›º´›³´›¬´›¥´›ž´›—´›´›‰´›‚´›{´›t´›m´›f´›_´›X´›Q´›J´›C´›<´›5´›.´›'´› ´›´›´› ´›´›ý³›ö³›ï³›è³›á³›Ú³›Ó³›̳›ų›¾³›·³›°³›©³›¢³››³›”³›³›†³›³›x³›q³›j³›c³›\³›U³›N³›G³›@³›9³›2³›+³›$³›³›³›³›³›³›ú²›ó²›ì²›å²›Þ²›ײ›в›ɲ›²›»²›´²›­²›¦²›Ÿ²›˜²›‘²›в›ƒ²›|²›u²›n²›g²›`²›Y²›R²›K²›D²›=²›6²›/²›(²›!²›²›²› ²›²›þ±›÷±›ð±›é±›â±›Û±›Ô±›ͱ›Ʊ›¿±›¸±›±±›ª±›£±›œ±›•±›ޱ›‡±›€±›y±›r±›k±›d±›]±›V±›O±›H±›A±›:±›3±›,±›%±›±›±›±› ±›±›û°›ô°›í°›æ°›ß°›ذ›Ѱ›ʰ›ð›¼°›µ°›®°›§°› °›™°›’°›‹°›„°›}°›v°›o°›h°›a°›Z°›S°›L°›E°›>°›7°›0°›)°›"°›°›°› °›°›ÿ¯›ø¯›ñ¯›ꯛ㯛ܯ›Õ¯›ί›ǯ›À¯›¹¯›²¯›«¯›¤¯›¯›–¯›¯›ˆ¯›¯›z¯›s¯›l¯›e¯›^¯›W¯›P¯›I¯›B¯›;¯›4¯›-¯›&¯›¯›¯›¯› ¯›¯›ü®›õ®›î®›ç®›à®›Ù®›Ò®›Ë®›Ä®›½®›¶®›¯®›¨®›¡®›š®›“®›Œ®›…®›~®›w®›p®›i®›b®›[®›T®›M®›F®›?®›8®›1®›*®›#®›®›®›®›®›®›ù­›ò­›ë­›ä­›Ý­›Ö­›Ï­›È­›Á­›º­›³­›¬­›¥­›ž­›—­›­›‰­›‚­›{­›t­›m­›f­›_­›X­›Q­›J­›C­›<­›5­›.­›'­› ­›­›­› ­›­›ý¬›ö¬›﬛講ᬛÚ¬›Ó¬›̬›Ŭ›¾¬›·¬›°¬›©¬›¢¬››¬›”¬›¬›†¬›¬›x¬›q¬›j¬›c¬›\¬›U¬›N¬›G¬›@¬›9¬›2¬›+¬›$¬›¬›¬›¬›¬›¬›ú«›ó«›ì«›å«›Þ«›׫›Ы›É«›«›»«›´«›­«›¦«›Ÿ«›˜«›‘«›Š«›ƒ«›|«›u«›n«›g«›`«›Y«›R«›K«›D«›=«›6«›/«›(«›!«›«›«› «›«›þª›÷ª›ðª›骛⪛Ûª›Ôª›ͪ›ƪ›¿ª›¸ª›±ª›ªª›£ª›œª›•ª›Žª›‡ª›€ª›yª›rª›kª›dª›]ª›Vª›Oª›Hª›Aª›:ª›3ª›,ª›%ª›ª›ª›ª› ª›ª›û©›ô©›í©›æ©›ß©›Ø©›Ñ©›Ê©›é›¼©›µ©›®©›§©› ©›™©›’©›‹©›„©›}©›v©›o©›h©›a©›Z©›S©›L©›E©›>©›7©›0©›)©›"©›©›©› ©›©›ÿ¨›ø¨›ñ¨›ꨛ㨛ܨ›Õ¨›Ψ›Ǩ›À¨›¹¨›²¨›«¨›¤¨›¨›–¨›¨›ˆ¨›¨›z¨›s¨›l¨›e¨›^¨›W¨›P¨›I¨›B¨›;¨›4¨›-¨›&¨›¨›¨›¨› ¨›¨›ü§›õ§›î§›ç§›à§›Ù§›Ò§›˧›ħ›½§›¶§›¯§›¨§›¡§›š§›“§›Œ§›…§›~§›w§›p§›i§›b§›[§›T§›M§›F§›?§›8§›1§›*§›#§›§›§›§›§›§›ù¦›ò¦›릛䦛ݦ›Ö¦›Ϧ›Ȧ›Á¦›º¦›³¦›¬¦›¥¦›ž¦›—¦›¦›‰¦›‚¦›{¦›t¦›m¦›f¦›_¦›X¦›Q¦›J¦›C¦›<¦›5¦›.¦›'¦› ¦›¦›¦› ¦›¦›ý¥›ö¥›拏襛ᥛÚ¥›Ó¥›Ì¥›Å¥›¾¥›·¥›°¥›©¥›¢¥››¥›”¥›¥›†¥›¥›x¥›q¥›j¥›c¥›\¥›U¥›N¥›G¥›@¥›9¥›2¥›+¥›$¥›¥›¥›¥›¥›¥›ú¤›ó¤›줛夛Þ¤›פ›Ф›ɤ›¤›»¤›´¤›­¤›¦¤›Ÿ¤›˜¤›‘¤›Ф›ƒ¤›|¤›u¤›n¤›g¤›`¤›Y¤›R¤›K¤›D¤›=¤›6¤›/¤›(¤›!¤›¤›¤› ¤›¤›þ£›÷£›ð£›飛⣛Û£›Ô£›Í£›Æ£›¿£›¸£›±£›ª£›££›œ£›•£›Ž£›‡£›€£›y£›r£›k£›d£›]£›V£›O£›H£›A£›:£›3£›,£›%£›£›£›£› £›£›û¢›ô¢›í¢›梛ߢ›Ø¢›Ñ¢›Ê¢›â›¼¢›µ¢›®¢›§¢› ¢›™¢›’¢›‹¢›„¢›}¢›v¢›o¢›h¢›a¢›Z¢›S¢›L¢›E¢›>¢›7¢›0¢›)¢›"¢›¢›¢› ¢›¢›ÿ¡›ø¡›ñ¡›ê¡›ã¡›Ü¡›Õ¡›Ρ›Ç¡›À¡›¹¡›²¡›«¡›¤¡›¡›–¡›¡›ˆ¡›¡›z¡›s¡›l¡›e¡›^¡›W¡›P¡›I¡›B¡›;¡›4¡›-¡›&¡›¡›¡›¡› ¡›¡›ü ›õ ›î ›ç ›à ›Ù ›Ò ›Ë ›Ä ›½ ›¶ ›¯ ›¨ ›¡ ›š ›“ ›Œ ›… ›~ ›w ›p ›i ›b ›[ ›T ›M ›F ›? ›8 ›1 ›* ›# › › › › › ›ùŸ›òŸ›럛䟛ÝŸ›ÖŸ›ÏŸ›ÈŸ›ÁŸ›ºŸ›³Ÿ›¬Ÿ›¥Ÿ›žŸ›—Ÿ›Ÿ›‰Ÿ›‚Ÿ›{Ÿ›tŸ›mŸ›fŸ›_Ÿ›XŸ›QŸ›JŸ›CŸ›<Ÿ›5Ÿ›.Ÿ›'Ÿ› Ÿ›Ÿ›Ÿ› Ÿ›Ÿ›ýž›öž›ïž›èž›áž›Úž›Óž›Ìž›Åž›¾ž›·ž›°ž›©ž›¢ž››ž›”ž›ž›†ž›ž›xž›qž›jž›cž›\ž›Už›Nž›Gž›@ž›9ž›2ž›+ž›$ž›ž›ž›ž›ž›ž›ú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þœ›÷œ›ðœ›霛✛Ûœ›Ôœ›Íœ›Æœ›¿œ›¸œ›±œ›ªœ›£œ›œœ›•œ›Žœ›‡œ›€œ›yœ›rœ›kœ›dœ›]œ›Vœ›Oœ›Hœ›Aœ›:œ›3œ›,œ›%œ›œ›œ›œ› œ›œ›û››ô››í››æ››ß››Ø››Ñ››Ê››Û›¼››µ››®››§›› ››™››’››‹››„››}››v››o››h››a››Z››S››L››E››>››7››0››)››"›››››› ››››ÿš›øš›ñš›êš›ãš›Üš›Õš›Κ›Çš›Àš›¹š›²š›«š›¤š›š›–š›š›ˆš›š›zš›sš›lš›eš›^š›Wš›Pš›Iš›Bš›;š›4š›-š›&š›š›š›š› š›š›ü™›õ™›î™›ç™›à™›Ù™›Ò™›Ë™›Ä™›½™›¶™›¯™›¨™›¡™›š™›“™›Œ™›…™›~™›w™›p™›i™›b™›[™›T™›M™›F™›?™›8™›1™›*™›#™›™›™›™›™›™›ù˜›ò˜›똛䘛ݘ›Ö˜›Ϙ›Ș›Á˜›º˜›³˜›¬˜›¥˜›ž˜›—˜›˜›‰˜›‚˜›{˜›t˜›m˜›f˜›_˜›X˜›Q˜›J˜›C˜›<˜›5˜›.˜›'˜› ˜›˜›˜› ˜›˜›ý—›ö—›ï—›è—›á—›Ú—›Ó—›Ì—›Å—›¾—›·—›°—›©—›¢—››—›”—›—›†—›—›x—›q—›j—›c—›\—›U—›N—›G—›@—›9—›2—›+—›$—›—›—›—›—›—›ú–›ó–›ì–›å–›Þ–›×–›Ж›É–›–›»–›´–›­–›¦–›Ÿ–›˜–›‘–›Š–›ƒ–›|–›u–›n–›g–›`–›Y–›R–›K–›D–›=–›6–›/–›(–›!–›–›–› –›–›þ•›÷•›ð•›é•›â•›Û•›Ô•›Í•›Æ•›¿•›¸•›±•›ª•›£•›œ•›••›Ž•›‡•›€•›y•›r•›k•›d•›]•›V•›O•›H•›A•›:•›3•›,•›%•›•›•›•› •›•›û”›ô”›í”›æ”›ß”›Ø”›Ñ”›Ê”›Ô›¼”›µ”›®”›§”› ”›™”›’”›‹”›„”›}”›v”›o”›h”›a”›Z”›S”›L”›E”›>”›7”›0”›)”›"”›”›”› ”›”›ÿ“›ø“›ñ“›ê“›ã“›Ü“›Õ“›Γ›Ç“›À“›¹“›²“›«“›¤“›“›–“›“›ˆ“›“›z“›s“›l“›e“›^“›W“›P“›I“›B“›;“›4“›-“›&“›“›“›“› “›“›ü’›õ’›î’›ç’›à’›Ù’›Ò’›Ë’›Ä’›½’›¶’›¯’›¨’›¡’›š’›“’›Œ’›…’›~’›w’›p’›i’›b’›[’›T’›M’›F’›?’›8’›1’›*’›#’›’›’›’›’›’›ù‘›ò‘›ë‘›ä‘›Ý‘›Ö‘›Ï‘›È‘›Á‘›º‘›³‘›¬‘›¥‘›ž‘›—‘›‘›‰‘›‚‘›{‘›t‘›m‘›f‘›_‘›X‘›Q‘›J‘›C‘›<‘›5‘›.‘›'‘› ‘›‘›‘› ‘›‘›ý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››ú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þŽ›÷Ž›ðŽ›鎛⎛ÛŽ›ÔŽ›ÍŽ›ÆŽ›¿Ž›¸Ž›±Ž›ªŽ›£Ž›œŽ›•Ž›ŽŽ›‡Ž›€Ž›yŽ›rŽ›kŽ›dŽ›]Ž›VŽ›OŽ›HŽ›AŽ›:Ž›3Ž›,Ž›%ޛޛޛޛ ޛޛû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿŒ›øŒ›ñŒ›ꌛ㌛ÜŒ›ÕŒ›ÎŒ›ÇŒ›ÀŒ›¹Œ›²Œ›«Œ›¤Œ›Œ›–Œ›Œ›ˆŒ›Œ›zŒ›sŒ›lŒ›eŒ›^Œ›WŒ›PŒ›IŒ›BŒ›;Œ›4Œ›-Œ›&Œ›Œ›Œ›Œ› Œ›Œ›ü‹›õ‹›î‹›ç‹›à‹›Ù‹›Ò‹›Ë‹›Ä‹›½‹›¶‹›¯‹›¨‹›¡‹›š‹›“‹›Œ‹›…‹›~‹›w‹›p‹›i‹›b‹›[‹›T‹›M‹›F‹›?‹›8‹›1‹›*‹›#‹›‹›‹›‹›‹›‹›ùŠ›òŠ›늛䊛ÝŠ›ÖŠ›ÏŠ›ÈŠ›ÁŠ›ºŠ›³Š›¬Š›¥Š›žŠ›—ЛЛ‰Š›‚Š›{Š›tŠ›mŠ›fŠ›_Š›XŠ›QŠ›JŠ›CŠ›<Š›5Š›.Š›'Š› ЛЛЛ ЛЛý‰›ö‰›艛ቛÚ‰›Ó‰›̉›ʼn›¾‰›·‰›°‰›©‰›¢‰››‰›”‰›‰›†‰›‰›x‰›q‰›j‰›c‰›\‰›U‰›N‰›G‰›@‰›9‰›2‰›+‰›$‰›‰›‰›‰›‰›‰›úˆ›óˆ›숛创Þˆ›׈›Ј›Ɉ›ˆ›»ˆ›´ˆ›­ˆ›¦ˆ›Ÿˆ›˜ˆ›‘ˆ›Šˆ›ƒˆ›|ˆ›uˆ›nˆ›gˆ›`ˆ›Yˆ›Rˆ›Kˆ›Dˆ›=ˆ›6ˆ›/ˆ›(ˆ›!ˆ›ˆ›ˆ› ˆ›ˆ›þ‡›÷‡›ð‡›釛⇛Û‡›Ô‡›͇›Ƈ›¿‡›¸‡›±‡›ª‡›£‡›œ‡›•‡›އ›‡‡›€‡›y‡›r‡›k‡›d‡›]‡›V‡›O‡›H‡›A‡›:‡›3‡›,‡›%‡›‡›‡›‡› ‡›‡›û†›ô†›톛憛߆›؆›ц›ʆ›Æ›¼†›µ†›®†›§†› †›™†›’†›‹†›„†›}†›v†›o†›h†›a†›Z†›S†›L†›E†›>†›7†›0†›)†›"†›†›†› †›†›ÿ…›ø…›ñ…›ê…›ã…›Ü…›Õ…›Î…›Ç…›À…›¹…›²…›«…›¤…›…›–…›…›ˆ…›…›z…›s…›l…›e…›^…›W…›P…›I…›B…›;…›4…›-…›&…›…›…›…› …›…›ü„›õ„›î„›ç„›à„›Ù„›Ò„›Ë„›Ä„›½„›¶„›¯„›¨„›¡„›š„›“„›Œ„›…„›~„›w„›p„›i„›b„›[„›T„›M„›F„›?„›8„›1„›*„›#„›„›„›„›„›„›ùƒ›òƒ›냛䃛݃›Öƒ›σ›ȃ›Áƒ›ºƒ›³ƒ›¬ƒ›¥ƒ›žƒ›—ƒ›ƒ›‰ƒ›‚ƒ›{ƒ›tƒ›mƒ›fƒ›_ƒ›Xƒ›Qƒ›Jƒ›Cƒ›<ƒ›5ƒ›.ƒ›'ƒ› ƒ›ƒ›ƒ› ƒ›ƒ›ý‚›ö‚›ï‚›è‚›á‚›Ú‚›Ó‚›Ì‚›Å‚›¾‚›·‚›°‚›©‚›¢‚››‚›”‚›‚›†‚›‚›x‚›q‚›j‚›c‚›\‚›U‚›N‚›G‚›@‚›9‚›2‚›+‚›$‚›‚›‚›‚›‚›‚›ú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þ€›÷€›ð€›逛‛Û€›Ô€›Í€›Æ€›¿€›¸€›±€›ª€›£€›œ€›•€›Ž€›‡€›€€›y€›r€›k€›d€›]€›V€›O€›H€›A€›:€›3€›,€›%€›€›€›€› €›€›û›ô›í›æ›ß›Ø›Ñ›Ê›Ã›¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿ~›ø~›ñ~›ê~›ã~›Ü~›Õ~›Î~›Ç~›À~›¹~›²~›«~›¤~›~›–~›~›ˆ~›~›z~›s~›l~›e~›^~›W~›P~›I~›B~›;~›4~›-~›&~›~›~›~› ~›~›ü}›õ}›î}›ç}›à}›Ù}›Ò}›Ë}›Ä}›½}›¶}›¯}›¨}›¡}›š}›“}›Œ}›…}›~}›w}›p}›i}›b}›[}›T}›M}›F}›?}›8}›1}›*}›#}›}›}›}›}›}›ù|›ò|›ë|›ä|›Ý|›Ö|›Ï|›È|›Á|›º|›³|›¬|›¥|›ž|›—|›|›‰|›‚|›{|›t|›m|›f|›_|›X|›Q|›J|›C|›<|›5|›.|›'|› |›|›|› |›|›ý{›ö{›ï{›è{›á{›Ú{›Ó{›Ì{›Å{›¾{›·{›°{›©{›¢{››{›”{›{›†{›{›x{›q{›j{›c{›\{›U{›N{›G{›@{›9{›2{›+{›${›{›{›{›{›{›úz›óz›ìz›åz›Þz›×z›Ðz›Éz›Âz›»z›´z›­z›¦z›Ÿz›˜z›‘z›Šz›ƒz›|z›uz›nz›gz›`z›Yz›Rz›Kz›Dz›=z›6z›/z›(z›!z›z›z› z›z›þy›÷y›ðy›éy›ây›Ûy›Ôy›Íy›Æy›¿y›¸y›±y›ªy›£y›œy›•y›Žy›‡y›€y›yy›ry›ky›dy›]y›Vy›Oy›Hy›Ay›:y›3y›,y›%y›y›y›y› y›y›ûx›ôx›íx›æx›ßx›Øx›Ñx›Êx›Ãx›¼x›µx›®x›§x› x›™x›’x›‹x›„x›}x›vx›ox›hx›ax›Zx›Sx›Lx›Ex›>x›7x›0x›)x›"x›x›x› x›x›ÿw›øw›ñw›êw›ãw›Üw›Õw›Îw›Çw›Àw›¹w›²w›«w›¤w›w›–w›w›ˆw›w›zw›sw›lw›ew›^w›Ww›Pw›Iw›Bw›;w›4w›-w›&w›w›w›w› w›w›üv›õv›îv›çv›àv›Ùv›Òv›Ëv›Äv›½v›¶v›¯v›¨v›¡v›šv›“v›Œv›…v›~v›wv›pv›iv›bv›[v›Tv›Mv›Fv›?v›8v›1v›*v›#v›v›v›v›v›v›ùu›òu›ëu›äu›Ýu›Öu›Ïu›Èu›Áu›ºu›³u›¬u›¥u›žu›—u›u›‰u›‚u›{u›tu›mu›fu›_u›Xu›Qu›Ju›Cu›q›7q›0q›)q›"q›q›q› q›q›ÿp›øp›ñp›êp›ãp›Üp›Õp›Îp›Çp›Àp›¹p›²p›«p›¤p›p›–p›p›ˆp›p›zp›sp›lp›ep›^p›Wp›Pp›Ip›Bp›;p›4p›-p›&p›p›p›p› p›p›üo›õo›îo›ço›ào›Ùo›Òo›Ëo›Äo›½o›¶o›¯o›¨o›¡o›šo›“o›Œo›…o›~o›wo›po›io›bo›[o›To›Mo›Fo›?o›8o›1o›*o›#o›o›o›o›o›o›ùn›òn›ën›än›Ýn›Ön›Ïn›Èn›Án›ºn›³n›¬n›¥n›žn›—n›n›‰n›‚n›{n›tn›mn›fn›_n›Xn›Qn›Jn›Cn›j›7j›0j›)j›"j›j›j› j›j›ÿi›øi›ñi›êi›ãi›Üi›Õi›Îi›Çi›Ài›¹i›²i›«i›¤i›i›–i›i›ˆi›i›zi›si›li›ei›^i›Wi›Pi›Ii›Bi›;i›4i›-i›&i›i›i›i› i›i›üh›õh›îh›çh›àh›Ùh›Òh›Ëh›Äh›½h›¶h›¯h›¨h›¡h›šh›“h›Œh›…h›~h›wh›ph›ih›bh›[h›Th›Mh›Fh›?h›8h›1h›*h›#h›h›h›h›h›h›ùg›òg›ëg›äg›Ýg›Ög›Ïg›Èg›Ág›ºg›³g›¬g›¥g›žg›—g›g›‰g›‚g›{g›tg›mg›fg›_g›Xg›Qg›Jg›Cg›c›7c›0c›)c›"c›c›c› c›c›ÿb›øb›ñb›êb›ãb›Üb›Õb›Îb›Çb›Àb›¹b›²b›«b›¤b›b›–b›b›ˆb›b›zb›sb›lb›eb›^b›Wb›Pb›Ib›Bb›;b›4b›-b›&b›b›b›b› b›b›üa›õa›îa›ça›àa›Ùa›Òa›Ëa›Äa›½a›¶a›¯a›¨a›¡a›ša›“a›Œa›…a›~a›wa›pa›ia›ba›[a›Ta›Ma›Fa›?a›8a›1a›*a›#a›a›a›a›a›a›ù`›ò`›ë`›ä`›Ý`›Ö`›Ï`›È`›Á`›º`›³`›¬`›¥`›ž`›—`›`›‰`›‚`›{`›t`›m`›f`›_`›X`›Q`›J`›C`›<`›5`›.`›'`› `›`›`› `›`›ý_›ö_›ï_›è_›á_›Ú_›Ó_›Ì_›Å_›¾_›·_›°_›©_›¢_››_›”_›_›†_›_›x_›q_›j_›c_›\_›U_›N_›G_›@_›9_›2_›+_›$_›_›_›_›_›_›ú^›ó^›ì^›å^›Þ^›×^›Ð^›É^›Â^›»^›´^›­^›¦^›Ÿ^›˜^›‘^›Š^›ƒ^›|^›u^›n^›g^›`^›Y^›R^›K^›D^›=^›6^›/^›(^›!^›^›^› ^›^›þ]›÷]›ð]›é]›â]›Û]›Ô]›Í]›Æ]›¿]›¸]›±]›ª]›£]›œ]›•]›Ž]›‡]›€]›y]›r]›k]›d]›]]›V]›O]›H]›A]›:]›3]›,]›%]›]›]›]› ]›]›û\›ô\›í\›æ\›ß\›Ø\›Ñ\›Ê\›Ã\›¼\›µ\›®\›§\› \›™\›’\›‹\›„\›}\›v\›o\›h\›a\›Z\›S\›L\›E\›>\›7\›0\›)\›"\›\›\› \›\›ÿ[›ø[›ñ[›ê[›ã[›Ü[›Õ[›Î[›Ç[›À[›¹[›²[›«[›¤[›[›–[›[›ˆ[›[›z[›s[›l[›e[›^[›W[›P[›I[›B[›;[›4[›-[›&[›[›[›[› [›[›üZ›õZ›îZ›çZ›àZ›ÙZ›ÒZ›ËZ›ÄZ›½Z›¶Z›¯Z›¨Z›¡Z›šZ›“Z›ŒZ›…Z›~Z›wZ›pZ›iZ›bZ›[Z›TZ›MZ›FZ›?Z›8Z›1Z›*Z›#Z›Z›Z›Z›Z›Z›ùY›òY›ëY›äY›ÝY›ÖY›ÏY›ÈY›ÁY›ºY›³Y›¬Y›¥Y›žY›—Y›Y›‰Y›‚Y›{Y›tY›mY›fY›_Y›XY›QY›JY›CY›U›7U›0U›)U›"U›U›U› U›U›ÿT›øT›ñT›êT›ãT›ÜT›ÕT›ÎT›ÇT›ÀT›¹T›²T›«T›¤T›T›–T›T›ˆT›T›zT›sT›lT›eT›^T›WT›PT›IT›BT›;T›4T›-T›&T›T›T›T› T›T›üS›õS›îS›çS›àS›ÙS›ÒS›ËS›ÄS›½S›¶S›¯S›¨S›¡S›šS›“S›ŒS›…S›~S›wS›pS›iS›bS›[S›TS›MS›FS›?S›8S›1S›*S›#S›S›S›S›S›S›ùR›òR›ëR›äR›ÝR›ÖR›ÏR›ÈR›ÁR›ºR›³R›¬R›¥R›žR›—R›R›‰R›‚R›{R›tR›mR›fR›_R›XR›QR›JR›CR›N›7N›0N›)N›"N›N›N› N›N›ÿM›øM›ñM›êM›ãM›ÜM›ÕM›ÎM›ÇM›ÀM›¹M›²M›«M›¤M›M›–M›M›ˆM›M›zM›sM›lM›eM›^M›WM›PM›IM›BM›;M›4M›-M›&M›M›M›M› M›M›üL›õL›îL›çL›àL›ÙL›ÒL›ËL›ÄL›½L›¶L›¯L›¨L›¡L›šL›“L›ŒL›…L›~L›wL›pL›iL›bL›[L›TL›ML›FL›?L›8L›1L›*L›#L›L›L›L›L›L›ùK›òK›ëK›äK›ÝK›ÖK›ÏK›ÈK›ÁK›ºK›³K›¬K›¥K›žK›—K›K›‰K›‚K›{K›tK›mK›fK›_K›XK›QK›JK›CK›G›7G›0G›)G›"G›G›G› G›G›ÿF›øF›ñF›êF›ãF›ÜF›ÕF›ÎF›ÇF›ÀF›¹F›²F›«F›¤F›F›–F›F›ˆF›F›zF›sF›lF›eF›^F›WF›PF›IF›BF›;F›4F›-F›&F›F›F›F› F›F›üE›õE›îE›çE›àE›ÙE›ÒE›ËE›ÄE›½E›¶E›¯E›¨E›¡E›šE›“E›ŒE›…E›~E›wE›pE›iE›bE›[E›TE›ME›FE›?E›8E›1E›*E›#E›E›E›E›E›E›ùD›òD›ëD›äD›ÝD›ÖD›ÏD›ÈD›ÁD›ºD›³D›¬D›¥D›žD›—D›D›‰D›‚D›{D›tD›mD›fD›_D›XD›QD›JD›CD›@›7@›0@›)@›"@›@›@› @›@›ÿ?›ø?›ñ?›ê?›ã?›Ü?›Õ?›Î?›Ç?›À?›¹?›²?›«?›¤?›?›–?›?›ˆ?›?›z?›s?›l?›e?›^?›W?›P?›I?›B?›;?›4?›-?›&?›?›?›?› ?›?›ü>›õ>›î>›ç>›à>›Ù>›Ò>›Ë>›Ä>›½>›¶>›¯>›¨>›¡>›š>›“>›Œ>›…>›~>›w>›p>›i>›b>›[>›T>›M>›F>›?>›8>›1>›*>›#>›>›>›>›>›>›ù=›ò=›ë=›ä=›Ý=›Ö=›Ï=›È=›Á=›º=›³=›¬=›¥=›ž=›—=›=›‰=›‚=›{=›t=›m=›f=›_=›X=›Q=›J=›C=›<=›5=›.=›'=› =›=›=› =›=›ý<›ö<›ï<›è<›á<›Ú<›Ó<›Ì<›Å<›¾<›·<›°<›©<›¢<››<›”<›<›†<›<›x<›q<›j<›c<›\<›U<›N<›G<›@<›9<›2<›+<›$<›<›<›<›<›<›ú;›ó;›ì;›å;›Þ;›×;›Ð;›É;›Â;›»;›´;›­;›¦;›Ÿ;›˜;›‘;›Š;›ƒ;›|;›u;›n;›g;›`;›Y;›R;›K;›D;›=;›6;›/;›(;›!;›;›;› ;›;›þ:›÷:›ð:›é:›â:›Û:›Ô:›Í:›Æ:›¿:›¸:›±:›ª:›£:›œ:›•:›Ž:›‡:›€:›y:›r:›k:›d:›]:›V:›O:›H:›A:›::›3:›,:›%:›:›:›:› :›:›û9›ô9›í9›æ9›ß9›Ø9›Ñ9›Ê9›Ã9›¼9›µ9›®9›§9› 9›™9›’9›‹9›„9›}9›v9›o9›h9›a9›Z9›S9›L9›E9›>9›79›09›)9›"9›9›9› 9›9›ÿ8›ø8›ñ8›ê8›ã8›Ü8›Õ8›Î8›Ç8›À8›¹8›²8›«8›¤8›8›–8›8›ˆ8›8›z8›s8›l8›e8›^8›W8›P8›I8›B8›;8›48›-8›&8›8›8›8› 8›8›ü7›õ7›î7›ç7›à7›Ù7›Ò7›Ë7›Ä7›½7›¶7›¯7›¨7›¡7›š7›“7›Œ7›…7›~7›w7›p7›i7›b7›[7›T7›M7›F7›?7›87›17›*7›#7›7›7›7›7›7›ù6›ò6›ë6›ä6›Ý6›Ö6›Ï6›È6›Á6›º6›³6›¬6›¥6›ž6›—6›6›‰6›‚6›{6›t6›m6›f6›_6›X6›Q6›J6›C6›<6›56›.6›'6› 6›6›6› 6›6›ý5›ö5›ï5›è5›á5›Ú5›Ó5›Ì5›Å5›¾5›·5›°5›©5›¢5››5›”5›5›†5›5›x5›q5›j5›c5›\5›U5›N5›G5›@5›95›25›+5›$5›5›5›5›5›5›ú4›ó4›ì4›å4›Þ4›×4›Ð4›É4›Â4›»4›´4›­4›¦4›Ÿ4›˜4›‘4›Š4›ƒ4›|4›u4›n4›g4›`4›Y4›R4›K4›D4›=4›64›/4›(4›!4›4›4› 4›4›þ3›÷3›ð3›é3›â3›Û3›Ô3›Í3›Æ3›¿3›¸3›±3›ª3›£3›œ3›•3›Ž3›‡3›€3›y3›r3›k3›d3›]3›V3›O3›H3›A3›:3›33›,3›%3›3›3›3› 3›3›û2›ô2›í2›æ2›ß2›Ø2›Ñ2›Ê2›Ã2›¼2›µ2›®2›§2› 2›™2›’2›‹2›„2›}2›v2›o2›h2›a2›Z2›S2›L2›E2›>2›72›02›)2›"2›2›2› 2›2›ÿ1›ø1›ñ1›ê1›ã1›Ü1›Õ1›Î1›Ç1›À1›¹1›²1›«1›¤1›1›–1›1›ˆ1›1›z1›s1›l1›e1›^1›W1›P1›I1›B1›;1›41›-1›&1›1›1›1› 1›1›ü0›õ0›î0›ç0›à0›Ù0›Ò0›Ë0›Ä0›½0›¶0›¯0›¨0›¡0›š0›“0›Œ0›…0›~0›w0›p0›i0›b0›[0›T0›M0›F0›?0›80›10›*0›#0›0›0›0›0›0›ù/›ò/›ë/›ä/›Ý/›Ö/›Ï/›È/›Á/›º/›³/›¬/›¥/›ž/›—/›/›‰/›‚/›{/›t/›m/›f/›_/›X/›Q/›J/›C/›+›7+›0+›)+›"+›+›+› +›+›ÿ*›ø*›ñ*›ê*›ã*›Ü*›Õ*›Î*›Ç*›À*›¹*›²*›«*›¤*›*›–*›*›ˆ*›*›z*›s*›l*›e*›^*›W*›P*›I*›B*›;*›4*›-*›&*›*›*›*› *›*›ü)›õ)›î)›ç)›à)›Ù)›Ò)›Ë)›Ä)›½)›¶)›¯)›¨)›¡)›š)›“)›Œ)›…)›~)›w)›p)›i)›b)›[)›T)›M)›F)›?)›8)›1)›*)›#)›)›)›)›)›)›ù(›ò(›ë(›ä(›Ý(›Ö(›Ï(›È(›Á(›º(›³(›¬(›¥(›ž(›—(›(›‰(›‚(›{(›t(›m(›f(›_(›X(›Q(›J(›C(›<(›5(›.(›'(› (›(›(› (›(›ý'›ö'›ï'›è'›á'›Ú'›Ó'›Ì'›Å'›¾'›·'›°'›©'›¢'››'›”'›'›†'›'›x'›q'›j'›c'›\'›U'›N'›G'›@'›9'›2'›+'›$'›'›'›'›'›'›ú&›ó&›ì&›å&›Þ&›×&›Ð&›É&›Â&›»&›´&›­&›¦&›Ÿ&›˜&›‘&›Š&›ƒ&›|&›u&›n&›g&›`&›Y&›R&›K&›D&›=&›6&›/&›(&›!&›&›&› &›&›þ%›÷%›ð%›é%›â%›Û%›Ô%›Í%›Æ%›¿%›¸%›±%›ª%›£%›œ%›•%›Ž%›‡%›€%›y%›r%›k%›d%›]%›V%›O%›H%›A%›:%›3%›,%›%%›%›%›%› %›%›û$›ô$›í$›æ$›ß$›Ø$›Ñ$›Ê$›Ã$›¼$›µ$›®$›§$› $›™$›’$›‹$›„$›}$›v$›o$›h$›a$›Z$›S$›L$›E$›>$›7$›0$›)$›"$›$›$› $›$›ÿ#›ø#›ñ#›ê#›ã#›Ü#›Õ#›Î#›Ç#›À#›¹#›²#›«#›¤#›#›–#›#›ˆ#›#›z#›s#›l#›e#›^#›W#›P#›I#›B#›;#›4#›-#›&#›#›#›#› #›#›ü"›õ"›î"›ç"›à"›Ù"›Ò"›Ë"›Ä"›½"›¶"›¯"›¨"›¡"›š"›“"›Œ"›…"›~"›w"›p"›i"›b"›["›T"›M"›F"›?"›8"›1"›*"›#"›"›"›"›"›"›ù!›ò!›ë!›ä!›Ý!›Ö!›Ï!›È!›Á!›º!›³!›¬!›¥!›ž!›—!›!›‰!›‚!›{!›t!›m!›f!›_!›X!›Q!›J!›C!››7›0›)›"››› ››ÿ›ø›ñ›ê›ã›Ü›Õ›Î›Ç›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››ü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››ú›ó›ì›å›Þ›×›Ð›É›Â›»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››û›ô›í›æ›ß›Ø›Ñ›Ê›Ã›¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿ›ø›ñ›ê›ã›Ü›Õ›Î›Ç›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››ü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››ú›ó›ì›å›Þ›×›Ð›É›Â›»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››û›ô›í›æ›ß›Ø›Ñ›Ê›Ã›¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿ›ø›ñ›ê›ã›Ü›Õ›Î›Ç›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››ü ›õ ›î ›ç ›à ›Ù ›Ò ›Ë ›Ä ›½ ›¶ ›¯ ›¨ ›¡ ›š ›“ ›Œ ›… ›~ ›w ›p ›i ›b ›[ ›T ›M ›F ›? ›8 ›1 ›* ›# › › › › › ›ù ›ò ›ë ›ä ›Ý ›Ö ›Ï ›È ›Á ›º ›³ ›¬ ›¥ ›ž ›— › ›‰ ›‚ ›{ ›t ›m ›f ›_ ›X ›Q ›J ›C ›< ›5 ›. ›' › › › › › ›ý ›ö ›ï ›è ›á ›Ú ›Ó ›Ì ›Å ›¾ ›· ›° ›© ›¢ ›› ›” › ›† › ›x ›q ›j ›c ›\ ›U ›N ›G ›@ ›9 ›2 ›+ ›$ › › › › › ›ú ›ó ›ì ›å ›Þ ›× ›Ð ›É › ›» ›´ ›­ ›¦ ›Ÿ ›˜ ›‘ ›Š ›ƒ ›| ›u ›n ›g ›` ›Y ›R ›K ›D ›= ›6 ›/ ›( ›! › › › › ›þ ›÷ ›ð ›é ›â ›Û ›Ô ›Í ›Æ ›¿ ›¸ ›± ›ª ›£ ›œ ›• ›Ž ›‡ ›€ ›y ›r ›k ›d ›] ›V ›O ›H ›A ›: ›3 ›, ›% › › › › › ›û›ô›í›æ›ß›Ø›Ñ›Ê›Ã›¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿ›ø›ñ›ê›ã›Ü›Õ›Î›Ç›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››ü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››ú›ó›ì›å›Þ›×›Ð›É›Â›»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››û›ô›í›æ›ß›Ø›Ñ›Ê›Ã›¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿ›ø›ñ›ê›ã›Ü›Õ›ΛÇ›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››üÿšõÿšîÿšçÿšàÿšÙÿšÒÿšËÿšÄÿš½ÿš¶ÿš¯ÿš¨ÿš¡ÿššÿš“ÿšŒÿš…ÿš~ÿšwÿšpÿšiÿšbÿš[ÿšTÿšMÿšFÿš?ÿš8ÿš1ÿš*ÿš#ÿšÿšÿšÿšÿšÿšùþšòþšëþšäþšÝþšÖþšÏþšÈþšÁþšºþš³þš¬þš¥þšžþš—þšþš‰þš‚þš{þštþšmþšfþš_þšXþšQþšJþšCþš<þš5þš.þš'þš þšþšþš þšþšýýšöýšïýšèýšáýšÚýšÓýšÌýšÅýš¾ýš·ýš°ýš©ýš¢ýš›ýš”ýšýš†ýšýšxýšqýšjýšcýš\ýšUýšNýšGýš@ýš9ýš2ýš+ýš$ýšýšýšýšýšýšúüšóüšìüšåüšÞüš×üšÐüšÉüšÂüš»üš´üš­üš¦üšŸüš˜üš‘üšŠüšƒüš|üšuüšnüšgüš`üšYüšRüšKüšDüš=üš6üš/üš(üš!üšüšüš üšüšþûš÷ûšðûšéûšâûšÛûšÔûšÍûšÆûš¿ûš¸ûš±ûšªûš£ûšœûš•ûšŽûš‡ûš€ûšyûšrûškûšdûš]ûšVûšOûšHûšAûš:ûš3ûš,ûš%ûšûšûšûš ûšûšûúšôúšíúšæúšßúšØúšÑúšÊúšÃúš¼úšµúš®úš§úš úš™úš’úš‹úš„úš}úšvúšoúšhúšaúšZúšSúšLúšEúš>úš7úš0úš)úš"úšúšúš úšúšÿùšøùšñùšêùšãùšÜùšÕùšÎùšÇùšÀùš¹ùš²ùš«ùš¤ùšùš–ùšùšˆùšùšzùšsùšlùšeùš^ùšWùšPùšIùšBùš;ùš4ùš-ùš&ùšùšùšùš ùšùšüøšõøšîøšçøšàøšÙøšÒøšËøšÄøš½øš¶øš¯øš¨øš¡øššøš“øšŒøš…øš~øšwøšpøšiøšbøš[øšTøšMøšFøš?øš8øš1øš*øš#øšøšøšøšøšøšù÷šò÷šë÷šä÷šÝ÷šÖ÷šÏ÷šÈ÷šÁ÷šº÷š³÷š¬÷š¥÷šž÷š—÷š÷š‰÷š‚÷š{÷št÷šm÷šf÷š_÷šX÷šQ÷šJ÷šC÷š<÷š5÷š.÷š'÷š ÷š÷š÷š ÷š÷šýöšööšïöšèöšáöšÚöšÓöšÌöšÅöš¾öš·öš°öš©öš¢öš›öš”öšöš†öšöšxöšqöšjöšcöš\öšUöšNöšGöš@öš9öš2öš+öš$öšöšöšöšöšöšúõšóõšìõšåõšÞõš×õšÐõšÉõšÂõš»õš´õš­õš¦õšŸõš˜õš‘õšŠõšƒõš|õšuõšnõšgõš`õšYõšRõšKõšDõš=õš6õš/õš(õš!õšõšõš õšõšþôš÷ôšðôšéôšâôšÛôšÔôšÍôšÆôš¿ôš¸ôš±ôšªôš£ôšœôš•ôšŽôš‡ôš€ôšyôšrôškôšdôš]ôšVôšOôšHôšAôš:ôš3ôš,ôš%ôšôšôšôš ôšôšûóšôóšíóšæóšßóšØóšÑóšÊóšÃóš¼óšµóš®óš§óš óš™óš’óš‹óš„óš}óšvóšoóšhóšaóšZóšSóšLóšEóš>óš7óš0óš)óš"óšóšóš óšóšÿòšøòšñòšêòšãòšÜòšÕòšÎòšÇòšÀòš¹òš²òš«òš¤òšòš–òšòšˆòšòšzòšsòšlòšeòš^òšWòšPòšIòšBòš;òš4òš-òš&òšòšòšòš òšòšüñšõñšîñšçñšàñšÙñšÒñšËñšÄñš½ñš¶ñš¯ñš¨ñš¡ñššñš“ñšŒñš…ñš~ñšwñšpñšiñšbñš[ñšTñšMñšFñš?ñš8ñš1ñš*ñš#ñšñšñšñšñšñšùðšòðšëðšäðšÝðšÖðšÏðšÈðšÁðšºðš³ðš¬ðš¥ðšžðš—ðšðš‰ðš‚ðš{ðštðšmðšfðš_ðšXðšQðšJðšCðš<ðš5ðš.ðš'ðš ðšðšðš ðšðšýïšöïšïïšèïšáïšÚïšÓïšÌïšÅïšïš†ïšïšxïšqïšjïšcïš\ïšUïšNïšGïš@ïš9ïš2ïš+ïš$ïšïšïšïšïšïšúîšóîšìîšåîšÞîš×îšÐîšÉîšÂîš|îšuîšnîšgîš`îšYîšRîšKîšDîš=îš6îš/îš(îš!îšîšîš îšîšþíš÷íšðíšéíšâíšÛíšÔíšÍíšÆíš¿íš¸íš±íšªíš£íšœíš•íšŽíš‡íš€íšyíšríškíšdíš]íšVíšOíšHíšAíš:íš3íš,íš%íšíšíšíš íšíšûìšôìšíìšæìšßìšØìšÑìšÊìšÃ욼욵욮욧욠욙욒욋욄ìš}ìšvìšoìšhìšaìšZìšSìšLìšEìš>ìš7ìš0ìš)ìš"ìšìšìš ìšìšÿëšøëšñëšêëšãëšÜëšÕëšÎëšÇëšÀ뚹뚲뚫뚤ëšëš–ëšëšˆëšëšzëšsëšlëšeëš^ëšWëšPëšIëšBëš;ëš4ëš-ëš&ëšëšëšëš ëšëšüêšõêšîêšçêšàêšÙêšÒêšËêšÄꚽꚶꚯꚨꚡꚚꚓꚌꚅêš~êšwêšpêšiêšbêš[êšTêšMêšFêš?êš8êš1êš*êš#êšêšêšêšêšêšùéšòéšëéšäéšÝéšÖéšÏéšÈéšÁ隺隳隬隥隞隗éšéš‰éš‚éš{éštéšméšféš_éšXéšQéšJéšCéš<éš5éš.éš'éš éšéšéš éšéšýèšöèšïèšèèšáèšÚèšÓèšÌèšÅ蚾蚷蚰蚩蚢蚛蚔èšèš†èšèšxèšqèšjèšcèš\èšUèšNèšGèš@èš9èš2èš+èš$èšèšèšèšèšèšúçšóçšìçšåçšÞçš×çšÐçšÉçšÂ皻皴皭皦皟皘皑皊皃çš|çšuçšnçšgçš`çšYçšRçšKçšDçš=çš6çš/çš(çš!çšçšçš çšçšþæš÷æšðæšéæšâæšÛæšÔæšÍæšÆæš¿æš¸æš±æšªæš£æšœæš•æšŽæš‡æš€æšyæšræškæšdæš]æšVæšOæšHæšAæš:æš3æš,æš%æšæšæšæš æšæšûåšôåšíåšæåšßåšØåšÑåšÊåšÃ嚼嚵嚮嚧嚠嚙嚒嚋嚄åš}åšvåšoåšhåšaåšZåšSåšLåšEåš>åš7åš0åš)åš"åšåšåš åšåšÿäšøäšñäšêäšãäšÜäšÕäšÎäšÇäšÀ䚹䚲䚫䚤äšäš–äšäšˆäšäšzäšsäšläšeäš^äšWäšPäšIäšBäš;äš4äš-äš&äšäšäšäš äšäšüãšõãšîãšçãšàãšÙãšÒãšËãšÄ㚽㚶㚯㚨㚡㚚㚓㚌㚅ãš~ãšwãšpãšiãšbãš[ãšTãšMãšFãš?ãš8ãš1ãš*ãš#ãšãšãšãšãšãšùâšòâšëâšäâšÝâšÖâšÏâšÈâšÁ⚺⚳⚬⚥⚞⚗âšâš‰âš‚âš{âštâšmâšfâš_âšXâšQâšJâšCâš<âš5âš.âš'âš âšâšâš âšâšýášöášïášèášáášÚášÓášÌášÅᚾᚷᚰᚩᚢ᚛ᚔášáš†ášášxášqášjášcáš\ášUášNášGáš@áš9áš2áš+áš$ášášášášášášúàšóàšìàšåàšÞàš×àšÐàšÉàšÂàš»àš´àš­àš¦àšŸàš˜àš‘àšŠàšƒàš|àšuàšnàšgàš`àšYàšRàšKàšDàš=àš6àš/àš(àš!àšàšàš àšàšþßš÷ßšðßšéßšâßšÛßšÔßšÍßšÆßš¿ßš¸ßš±ßšªßš£ßšœßš•ßšŽßš‡ßš€ßšyßšrßškßšdßš]ßšVßšOßšHßšAßš:ßš3ßš,ßš%ßšßšßšßš ßšßšûÞšôÞšíÞšæÞšßÞšØÞšÑÞšÊÞšÃÞš¼ÞšµÞš®Þš§Þš Þš™Þš’Þš‹Þš„Þš}ÞšvÞšoÞšhÞšaÞšZÞšSÞšLÞšEÞš>Þš7Þš0Þš)Þš"ÞšÞšÞš ÞšÞšÿÝšøÝšñÝšêÝšãÝšÜÝšÕÝšÎÝšÇÝšÀÝš¹Ýš²Ýš«Ýš¤ÝšÝš–ݚݚˆÝšÝšzÝšsÝšlÝšeÝš^ÝšWÝšPÝšIÝšBÝš;Ýš4Ýš-Ýš&ݚݚݚݚ ݚݚüÜšõÜšîÜšçÜšàÜšÙÜšÒÜšËÜšÄÜš½Üš¶Üš¯Üš¨Üš¡ÜššÜš“ÜšŒÜš…Üš~ÜšwÜšpÜšiÜšbÜš[ÜšTÜšMÜšFÜš?Üš8Üš1Üš*Üš#ܚܚܚܚܚܚùÛšòÛšëÛšäÛšÝÛšÖÛšÏÛšÈÛšÁÛšºÛš³Ûš¬Ûš¥ÛšžÛš—ÛšÛš‰Ûš‚Ûš{ÛštÛšmÛšfÛš_ÛšXÛšQÛšJÛšCÛš<Ûš5Ûš.Ûš'Ûš ÛšÛšÛš ÛšÛšýÚšöÚšïÚšèÚšáÚšÚÚšÓÚšÌÚšÅÚš¾Úš·Úš°Úš©Úš¢Úš›Úš”ÚšÚš†ÚšÚšxÚšqÚšjÚšcÚš\ÚšUÚšNÚšGÚš@Úš9Úš2Úš+Úš$ÚšÚšÚšÚšÚšÚšúÙšóÙšìÙšåÙšÞÙš×ÙšÐÙšÉÙšÂÙš»Ùš´Ùš­Ùš¦ÙšŸÙš˜Ùš‘ÙšŠÙšƒÙš|ÙšuÙšnÙšgÙš`ÙšYÙšRÙšKÙšDÙš=Ùš6Ùš/Ùš(Ùš!ÙšÙšÙš ÙšÙšþØš÷ØšðØšéØšâØšÛØšÔØšÍØšÆØš¿Øš¸Øš±ØšªØš£ØšœØš•ØšŽØš‡Øš€ØšyØšrØškØšdØš]ØšVØšOØšHØšAØš:Øš3Øš,Øš%ؚؚؚؚ ؚؚûךôךíךæ×šßךØ×šÑךÊךÃך¼×šµ×š®×š§×š ×š™×š’ך‹×š„ך}ךvךoךhךaךZךSךLךEך>ך7ך0ך)ך"ךךך ךךÿÖšøÖšñÖšêÖšãÖšÜÖšÕÖšÎÖšÇÖšÀÖš¹Öš²Öš«Öš¤ÖšÖš–ÖšÖšˆÖšÖšzÖšsÖšlÖšeÖš^ÖšWÖšPÖšIÖšBÖš;Öš4Öš-Öš&ÖšÖšÖšÖš ÖšÖšüÕšõÕšîÕšçÕšàÕšÙÕšÒÕšËÕšÄÕš½Õš¶Õš¯Õš¨Õš¡ÕššÕš“ÕšŒÕš…Õš~ÕšwÕšpÕšiÕšbÕš[ÕšTÕšMÕšFÕš?Õš8Õš1Õš*Õš#ÕšÕšÕšÕšÕšÕšùÔšòÔšëÔšäÔšÝÔšÖÔšÏÔšÈÔšÁÔšºÔš³Ôš¬Ôš¥ÔšžÔš—ÔšÔš‰Ôš‚Ôš{ÔštÔšmÔšfÔš_ÔšXÔšQÔšJÔšCÔš<Ôš5Ôš.Ôš'Ôš ÔšÔšÔš ÔšÔšýÓšöÓšïÓšèÓšáÓšÚÓšÓÓšÌÓšÅÓš¾Óš·Óš°Óš©Óš¢Óš›Óš”ÓšÓš†ÓšÓšxÓšqÓšjÓšcÓš\ÓšUÓšNÓšGÓš@Óš9Óš2Óš+Óš$ÓšÓšÓšÓšÓšÓšúÒšóÒšìÒšåÒšÞÒš×ÒšÐÒšÉÒšÂÒš»Òš´Òš­Òš¦ÒšŸÒš˜Òš‘ÒšŠÒšƒÒš|ÒšuÒšnÒšgÒš`ÒšYÒšRÒšKÒšDÒš=Òš6Òš/Òš(Òš!ÒšÒšÒš ÒšÒšþÑš÷ÑšðÑšéÑšâÑšÛÑšÔÑšÍÑšÆÑš¿Ñš¸Ñš±ÑšªÑš£ÑšœÑš•ÑšŽÑš‡Ñš€ÑšyÑšrÑškÑšdÑš]ÑšVÑšOÑšHÑšAÑš:Ñš3Ñš,Ñš%њњњњ њњûКôКíКæÐšßКØÐšÑКÊКÃК¼ÐšµÐš®Ðš§Ðš Ðš™Ðš’К‹Ðš„К}КvКoКhКaКZКSКLКEК>К7К0К)К"ККК ККÿÏšøÏšñÏšêÏšãÏšÜÏšÕÏšÎÏšÇÏšÀÏš¹Ïš²Ïš«Ïš¤ÏšÏš–ϚϚˆÏšÏšzÏšsÏšlÏšeÏš^ÏšWÏšPÏšIÏšBÏš;Ïš4Ïš-Ïš&ϚϚϚϚ ϚϚüΚõΚîΚçΚàΚÙΚÒΚËΚÄΚ½Îš¶Îš¯Îš¨Îš¡ÎššÎš“ΚŒÎš…Κ~ΚwΚpΚiΚbΚ[ΚTΚMΚFΚ?Κ8Κ1Κ*Κ#ΚΚΚΚΚΚùÍšòÍšëÍšäÍšÝÍšÖÍšÏÍšÈÍšÁÍšºÍš³Íš¬Íš¥ÍšžÍš—͚͚‰Íš‚Íš{ÍštÍšmÍšfÍš_ÍšXÍšQÍšJÍšCÍš<Íš5Íš.Íš'Íš ͚͚͚ ͚͚ýÌšöÌšïÌšèÌšáÌšÚÌšÓÌšÌÌšÅÌš¾Ìš·Ìš°Ìš©Ìš¢Ìš›Ìš”̚̚†ÌšÌšxÌšqÌšjÌšcÌš\ÌšUÌšNÌšGÌš@Ìš9Ìš2Ìš+Ìš$̚̚̚̚̚̚úËšóËšìËšåËšÞËš×ËšÐËšÉËšÂËš»Ëš´Ëš­Ëš¦ËšŸËš˜Ëš‘ËšŠËšƒËš|ËšuËšnËšgËš`ËšYËšRËšKËšDËš=Ëš6Ëš/Ëš(Ëš!˚˚˚ ˚˚þÊš÷ÊšðÊšéÊšâÊšÛÊšÔÊšÍÊšÆÊš¿Êš¸Êš±ÊšªÊš£ÊšœÊš•ÊšŽÊš‡Êš€ÊšyÊšrÊškÊšdÊš]ÊšVÊšOÊšHÊšAÊš:Êš3Êš,Êš%ʚʚʚʚ ʚʚûÉšôÉšíÉšæÉšßÉšØÉšÑÉšÊÉšÃÉš¼ÉšµÉš®Éš§Éš Éš™Éš’Éš‹Éš„Éš}ÉšvÉšoÉšhÉšaÉšZÉšSÉšLÉšEÉš>Éš7Éš0Éš)Éš"ɚɚɚ ɚɚÿÈšøÈšñÈšêÈšãÈšÜÈšÕÈšÎÈšÇÈšÀÈš¹Èš²Èš«Èš¤ÈšÈš–ȚȚˆÈšÈšzÈšsÈšlÈšeÈš^ÈšWÈšPÈšIÈšBÈš;Èš4Èš-Èš&ȚȚȚȚ ȚȚüÇšõÇšîÇšçÇšàÇšÙÇšÒÇšËÇšÄÇš½Çš¶Çš¯Çš¨Çš¡ÇššÇš“ÇšŒÇš…Çš~ÇšwÇšpÇšiÇšbÇš[ÇšTÇšMÇšFÇš?Çš8Çš1Çš*Çš#ǚǚǚǚǚǚùÆšòÆšëÆšäÆšÝÆšÖÆšÏÆšÈÆšÁÆšºÆš³Æš¬Æš¥ÆšžÆš—ƚƚ‰Æš‚Æš{ÆštÆšmÆšfÆš_ÆšXÆšQÆšJÆšCÆš<Æš5Æš.Æš'Æš ƚƚƚ ƚƚýÅšöÅšïÅšèÅšáÅšÚÅšÓÅšÌÅšÅÅš¾Åš·Åš°Åš©Åš¢Åš›Åš”ŚŚ†ÅšÅšxÅšqÅšjÅšcÅš\ÅšUÅšNÅšGÅš@Åš9Åš2Åš+Åš$ŚŚŚŚŚŚúÄšóÄšìÄšåÄšÞÄš×ÄšÐÄšÉÄšÂÄš»Äš´Äš­Äš¦ÄšŸÄš˜Äš‘ÄšŠÄšƒÄš|ÄšuÄšnÄšgÄš`ÄšYÄšRÄšKÄšDÄš=Äš6Äš/Äš(Äš!ĚĚĚ ĚĚþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÃš¿Ãš¸Ãš±ÃšªÃš£ÃšœÃš•ڎڇڀÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûšôšíšæÂšßšØÂšÑšÊšÚ¼ÂšµÂš®Âš§Âš Âš™Âš’š‹Âš„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿÁšøÁšñÁšêÁšãÁšÜÁšÕÁšÎÁšÇÁšÀÁš¹Áš²Áš«Áš¤ÁšÁš–ÁšÁšˆÁšÁšzÁšsÁšlÁšeÁš^ÁšWÁšPÁšIÁšBÁš;Áš4Áš-Áš&ÁšÁšÁšÁš ÁšÁšüÀšõÀšîÀšçÀšàÀšÙÀšÒÀšËÀšÄÀš½Àš¶Àš¯Àš¨Àš¡ÀššÀš“ÀšŒÀš…Àš~ÀšwÀšpÀšiÀšbÀš[ÀšTÀšMÀšFÀš?Àš8Àš1Àš*Àš#ÀšÀšÀšÀšÀšÀšù¿šò¿š뿚俚Ý¿šÖ¿šÏ¿šÈ¿šÁ¿šº¿š³¿š¬¿š¥¿šž¿š—¿š¿š‰¿š‚¿š{¿št¿šm¿šf¿š_¿šX¿šQ¿šJ¿šC¿š<¿š5¿š.¿š'¿š ¿š¿š¿š ¿š¿šý¾šö¾šレ辚ᾚÚ¾šÓ¾š̾šžš¾¾š·¾š°¾š©¾š¢¾š›¾š”¾š¾š†¾š¾šx¾šq¾šj¾šc¾š\¾šU¾šN¾šG¾š@¾š9¾š2¾š+¾š$¾š¾š¾š¾š¾š¾šú½šó½š콚彚Þ½š×½šнšɽš½š»½š´½š­½š¦½šŸ½š˜½š‘½šнšƒ½š|½šu½šn½šg½š`½šY½šR½šK½šD½š=½š6½š/½š(½š!½š½š½š ½š½šþ¼š÷¼šð¼š鼚⼚Û¼šÔ¼šͼšƼš¿¼š¸¼š±¼šª¼š£¼šœ¼š•¼š޼š‡¼š€¼šy¼šr¼šk¼šd¼š]¼šV¼šO¼šH¼šA¼š:¼š3¼š,¼š%¼š¼š¼š¼š ¼š¼šû»šô»ší»š滚ß»šØ»šÑ»šÊ»šûš¼»šµ»š®»š§»š »š™»š’»š‹»š„»š}»šv»šo»šh»ša»šZ»šS»šL»šE»š>»š7»š0»š)»š"»š»š»š »š»šÿºšøºšñºš꺚㺚ܺšÕºšκšǺšÀºš¹ºš²ºš«ºš¤ºšºš–ºšºšˆºšºšzºšsºšlºšeºš^ºšWºšPºšIºšBºš;ºš4ºš-ºš&ºšºšºšºš ºšºšü¹šõ¹š繚๚Ù¹šÒ¹š˹šĹš½¹š¶¹š¯¹š¨¹š¡¹šš¹š“¹šŒ¹š…¹š~¹šw¹šp¹ši¹šb¹š[¹šT¹šM¹šF¹š?¹š8¹š1¹š*¹š#¹š¹š¹š¹š¹š¹šù¸šò¸š븚业ݸšÖ¸šϸšȸšÁ¸šº¸š³¸š¬¸š¥¸šž¸š—¸š¸š‰¸š‚¸š{¸št¸šm¸šf¸š_¸šX¸šQ¸šJ¸šC¸š<¸š5¸š.¸š'¸š ¸š¸š¸š ¸š¸šý·šö·šï·šè·šá·šÚ·šÓ·šÌ·šÅ·š¾·š··š°·š©·š¢·š›·š”·š·š†·š·šx·šq·šj·šc·š\·šU·šN·šG·š@·š9·š2·š+·š$·š·š·š·š·š·šú¶šó¶šì¶šå¶šÞ¶š×¶šжšɶš¶š»¶š´¶š­¶š¦¶šŸ¶š˜¶š‘¶šжšƒ¶š|¶šu¶šn¶šg¶š`¶šY¶šR¶šK¶šD¶š=¶š6¶š/¶š(¶š!¶š¶š¶š ¶š¶šþµš÷µšðµš鵚ⵚÛµšÔµš͵šƵš¿µš¸µš±µšªµš£µšœµš•µš޵š‡µš€µšyµšrµškµšdµš]µšVµšOµšHµšAµš:µš3µš,µš%µšµšµšµš µšµšû´šô´ší´šæ´šß´šØ´šÑ´šÊ´šôš¼´šµ´š®´š§´š ´š™´š’´š‹´š„´š}´šv´šo´šh´ša´šZ´šS´šL´šE´š>´š7´š0´š)´š"´š´š´š ´š´šÿ³šø³šñ³š곚㳚ܳšÕ³šγšdzšÀ³š¹³š²³š«³š¤³š³š–³š³šˆ³š³šz³šs³šl³še³š^³šW³šP³šI³šB³š;³š4³š-³š&³š³š³š³š ³š³šü²šõ²š粚ಚÙ²šÒ²š˲šIJš½²š¶²š¯²š¨²š¡²šš²š“²šŒ²š…²š~²šw²šp²ši²šb²š[²šT²šM²šF²š?²š8²š1²š*²š#²š²š²š²š²š²šù±šò±š뱚䱚ݱšÖ±šϱšȱšÁ±šº±š³±š¬±š¥±šž±š—±š±š‰±š‚±š{±št±šm±šf±š_±šX±šQ±šJ±šC±š<±š5±š.±š'±š ±š±š±š ±š±šý°šö°šï°šè°šá°šÚ°šÓ°š̰šŰš¾°š·°š°°š©°š¢°š›°š”°š°š†°š°šx°šq°šj°šc°š\°šU°šN°šG°š@°š9°š2°š+°š$°š°š°š°š°š°šú¯šó¯š쯚寚Þ¯šׯšЯšɯš¯š»¯š´¯š­¯š¦¯šŸ¯š˜¯š‘¯šНšƒ¯š|¯šu¯šn¯šg¯š`¯šY¯šR¯šK¯šD¯š=¯š6¯š/¯š(¯š!¯š¯š¯š ¯š¯šþ®š÷®šð®š鮚⮚Û®šÔ®šÍ®šÆ®š¿®š¸®š±®šª®š£®šœ®š•®šŽ®š‡®š€®šy®šr®šk®šd®š]®šV®šO®šH®šA®š:®š3®š,®š%®š®š®š®š ®š®šû­šô­ší­šæ­šß­šØ­šÑ­šÊ­šíš¼­šµ­š®­š§­š ­š™­š’­š‹­š„­š}­šv­šo­šh­ša­šZ­šS­šL­šE­š>­š7­š0­š)­š"­š­š­š ­š­šÿ¬šø¬šñ¬š꬚㬚ܬšÕ¬šάšǬšÀ¬š¹¬š²¬š«¬š¤¬š¬š–¬š¬šˆ¬š¬šz¬šs¬šl¬še¬š^¬šW¬šP¬šI¬šB¬š;¬š4¬š-¬š&¬š¬š¬š¬š ¬š¬šü«šõ«š竚૚Ù«šÒ«šË«šÄ«š½«š¶«š¯«š¨«š¡«šš«š“«šŒ«š…«š~«šw«šp«ši«šb«š[«šT«šM«šF«š?«š8«š1«š*«š#«š«š«š«š«š«šùªšòªš몚䪚ݪšÖªšϪšȪšÁªšºªš³ªš¬ªš¥ªšžªš—ªšªš‰ªš‚ªš{ªštªšmªšfªš_ªšXªšQªšJªšCªš<ªš5ªš.ªš'ªš ªšªšªš ªšªšý©šö©š署詚ᩚÚ©šÓ©šÌ©šÅ©š¾©š·©š°©š©©š¢©š›©š”©š©š†©š©šx©šq©šj©šc©š\©šU©šN©šG©š@©š9©š2©š+©š$©š©š©š©š©š©šú¨šó¨š쨚娚Þ¨šרšШšɨš¨š»¨š´¨š­¨š¦¨šŸ¨š˜¨š‘¨šЍšƒ¨š|¨šu¨šn¨šg¨š`¨šY¨šR¨šK¨šD¨š=¨š6¨š/¨š(¨š!¨š¨š¨š ¨š¨šþ§š÷§šð§šé§šâ§šÛ§šÔ§šͧšƧš¿§š¸§š±§šª§š£§šœ§š•§šާš‡§š€§šy§šr§šk§šd§š]§šV§šO§šH§šA§š:§š3§š,§š%§š§š§š§š §š§šû¦šô¦ší¦š榚ߦšئšѦšʦšæš¼¦šµ¦š®¦š§¦š ¦š™¦š’¦š‹¦š„¦š}¦šv¦šo¦šh¦ša¦šZ¦šS¦šL¦šE¦š>¦š7¦š0¦š)¦š"¦š¦š¦š ¦š¦šÿ¥šø¥šñ¥š꥚㥚Ü¥šÕ¥šÎ¥šÇ¥šÀ¥š¹¥š²¥š«¥š¤¥š¥š–¥š¥šˆ¥š¥šz¥šs¥šl¥še¥š^¥šW¥šP¥šI¥šB¥š;¥š4¥š-¥š&¥š¥š¥š¥š ¥š¥šü¤šõ¤š礚चÙ¤šÒ¤šˤšĤš½¤š¶¤š¯¤š¨¤š¡¤šš¤š“¤šŒ¤š…¤š~¤šw¤šp¤ši¤šb¤š[¤šT¤šM¤šF¤š?¤š8¤š1¤š*¤š#¤š¤š¤š¤š¤š¤šù£šò£š룚䣚Ý£šÖ£šÏ£šÈ£šÁ£šº£š³£š¬£š¥£šž£š—£š£š‰£š‚£š{£št£šm£šf£š_£šX£šQ£šJ£šC£š<£š5£š.£š'£š £š£š£š £š£šý¢šö¢š袚ᢚÚ¢šÓ¢šÌ¢šÅ¢š¾¢š·¢š°¢š©¢š¢¢š›¢š”¢š¢š†¢š¢šx¢šq¢šj¢šc¢š\¢šU¢šN¢šG¢š@¢š9¢š2¢š+¢š$¢š¢š¢š¢š¢š¢šú¡šó¡š졚塚Þ¡šסšСšÉ¡š¡š»¡š´¡š­¡š¦¡šŸ¡š˜¡š‘¡šŠ¡šƒ¡š|¡šu¡šn¡šg¡š`¡šY¡šR¡šK¡šD¡š=¡š6¡š/¡š(¡š!¡š¡š¡š ¡š¡šþ š÷ šð šé šâ šÛ šÔ šÍ šÆ š¿ š¸ š± šª š£ šœ š• šŽ š‡ š€ šy šr šk šd š] šV šO šH šA š: š3 š, š% š š š š  š šûŸšôŸšퟚ柚ߟšØŸšÑŸšÊŸšßš¼ŸšµŸš®Ÿš§Ÿš Ÿš™Ÿš’Ÿš‹Ÿš„Ÿš}ŸšvŸšoŸšhŸšaŸšZŸšSŸšLŸšEŸš>Ÿš7Ÿš0Ÿš)Ÿš"ŸšŸšŸš ŸšŸšÿžšøžšñžšêžšãžšÜžšÕžšΞšÇžšÀžš¹žš²žš«žš¤žšžš–žšžšˆžšžšzžšsžšlžšežš^žšWžšPžšIžšBžš;žš4žš-žš&žšžšžšžš žšžšüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùœšòœš뜚䜚ÝœšÖœšÏœšÈœšÁœšºœš³œš¬œš¥œšžœš—œšœš‰œš‚œš{œštœšmœšfœš_œšXœšQœšJœšCœš<œš5œš.œš'œš œšœšœš œšœšý›šö›š蛚ᛚÚ›šÓ›šÌ›šÅ›š¾›š·›š°›š©›š¢›š››š”›š›š†›š›šx›šq›šj›šc›š\›šU›šN›šG›š@›š9›š2›š+›š$›š›š›š›š›š›šúššóššìššåššÞššךšКšÉšššš»šš´šš­šš¦ššŸšš˜šš‘ššŠššƒšš|ššuššnššgšš`ššYššRššKššDšš=šš6šš/šš(šš!šššššš ššššþ™š÷™šð™š陚♚Û™šÔ™šÍ™šÆ™š¿™š¸™š±™šª™š£™šœ™š•™šŽ™š‡™š€™šy™šr™šk™šd™š]™šV™šO™šH™šA™š:™š3™š,™š%™š™š™š™š ™š™šû˜šô˜š혚昚ߘšؘšјšʘšØš¼˜šµ˜š®˜š§˜š ˜š™˜š’˜š‹˜š„˜š}˜šv˜šo˜šh˜ša˜šZ˜šS˜šL˜šE˜š>˜š7˜š0˜š)˜š"˜š˜š˜š ˜š˜šÿ—šø—šñ—šê—šã—šÜ—šÕ—šΗšÇ—šÀ—š¹—š²—š«—š¤—š—š–—š—šˆ—š—šz—šs—šl—še—š^—šW—šP—šI—šB—š;—š4—š-—š&—š—š—š—š —š—šü–šõ–šî–šç–šà–šÙ–šÒ–šË–šÄ–š½–š¶–š¯–š¨–š¡–šš–š“–šŒ–š…–š~–šw–šp–ši–šb–š[–šT–šM–šF–š?–š8–š1–š*–š#–š–š–š–š–š–šù•šò•š땚䕚Ý•šÖ•šÏ•šÈ•šÁ•šº•š³•š¬•š¥•šž•š—•š•š‰•š‚•š{•št•šm•šf•š_•šX•šQ•šJ•šC•š<•š5•š.•š'•š •š•š•š •š•šý”šö”š蔚ᔚÚ”šÓ”šÌ”šÅ”š¾”š·”š°”š©”š¢”š›”š””š”š†”š”šx”šq”šj”šc”š\”šU”šN”šG”š@”š9”š2”š+”š$”š”š”š”š”š”šú“šó“š쓚哚Þ“šדšГšÉ“š“š»“š´“š­“š¦“šŸ“š˜“š‘“šŠ“šƒ“š|“šu“šn“šg“š`“šY“šR“šK“šD“š=“š6“š/“š(“š!“š“š“š “š“šþ’š÷’šð’šé’šâ’šÛ’šÔ’šÍ’šÆ’š¿’š¸’š±’šª’š£’šœ’š•’šŽ’š‡’š€’šy’šr’šk’šd’š]’šV’šO’šH’šA’š:’š3’š,’š%’š’š’š’š ’š’šû‘šô‘š푚摚ß‘šØ‘šÑ‘šÊ‘šÑš¼‘šµ‘š®‘š§‘š ‘š™‘š’‘š‹‘š„‘š}‘šv‘šo‘šh‘ša‘šZ‘šS‘šL‘šE‘š>‘š7‘š0‘š)‘š"‘š‘š‘š ‘š‘šÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùŽšòŽš뎚䎚ÝŽšÖŽšÏŽšÈŽšÁŽšºŽš³Žš¬Žš¥ŽšžŽš—ŽšŽš‰Žš‚Žš{ŽštŽšmŽšfŽš_ŽšXŽšQŽšJŽšCŽš<Žš5Žš.Žš'Žš ŽšŽšŽš ŽšŽšýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúŒšóŒš쌚匚ÞŒš׌šÐŒšÉŒšÂŒš»Œš´Œš­Œš¦ŒšŸŒš˜Œš‘ŒšŠŒšƒŒš|ŒšuŒšnŒšgŒš`ŒšYŒšRŒšKŒšDŒš=Œš6Œš/Œš(Œš!ŒšŒšŒš ŒšŒšþ‹š÷‹šð‹š鋚⋚Û‹šÔ‹šÍ‹šÆ‹š¿‹š¸‹š±‹šª‹š£‹šœ‹š•‹šŽ‹š‡‹š€‹šy‹šr‹šk‹šd‹š]‹šV‹šO‹šH‹šA‹š:‹š3‹š,‹š%‹š‹š‹š‹š ‹š‹šûŠšôŠš튚抚ߊšØŠšÑŠšÊŠšÊš¼ŠšµŠš®Šš§Šš Šš™Šš’Šš‹Šš„Šš}ŠšvŠšoŠšhŠšaŠšZŠšSŠšLŠšEŠš>Šš7Šš0Šš)Šš"ŠšŠšŠš ŠšŠšÿ‰šø‰šñ‰šꉚ㉚܉šÕ‰šΉšljšÀ‰š¹‰š²‰š«‰š¤‰š‰š–‰š‰šˆ‰š‰šz‰šs‰šl‰še‰š^‰šW‰šP‰šI‰šB‰š;‰š4‰š-‰š&‰š‰š‰š‰š ‰š‰šüˆšõˆš爚àˆšÙˆšÒˆšˈšĈš½ˆš¶ˆš¯ˆš¨ˆš¡ˆššˆš“ˆšŒˆš…ˆš~ˆšwˆšpˆšiˆšbˆš[ˆšTˆšMˆšFˆš?ˆš8ˆš1ˆš*ˆš#ˆšˆšˆšˆšˆšˆšù‡šò‡š뇚䇚݇šÖ‡šχšȇšÁ‡šº‡š³‡š¬‡š¥‡šž‡š—‡š‡š‰‡š‚‡š{‡št‡šm‡šf‡š_‡šX‡šQ‡šJ‡šC‡š<‡š5‡š.‡š'‡š ‡š‡š‡š ‡š‡šý†šö†š膚ᆚÚ†šÓ†š̆šņš¾†š·†š°†š©†š¢†š›†š”†š†š††š†šx†šq†šj†šc†š\†šU†šN†šG†š@†š9†š2†š+†š$†š†š†š†š†š†šú…šó…šì…šå…šÞ…š×…šÐ…šÉ…šÂ…š»…š´…š­…š¦…šŸ…š˜…š‘…šŠ…šƒ…š|…šu…šn…šg…š`…šY…šR…šK…šD…š=…š6…š/…š(…š!…š…š…š …š…šþ„š÷„šð„š鄚ℚÛ„šÔ„šÍ„šÆ„š¿„š¸„š±„šª„š£„šœ„š•„šŽ„š‡„š€„šy„šr„šk„šd„š]„šV„šO„šH„šA„š:„š3„š,„š%„š„š„š„š „š„šûƒšôƒš탚惚߃š؃šуšʃšÚ¼ƒšµƒš®ƒš§ƒš ƒš™ƒš’ƒš‹ƒš„ƒš}ƒšvƒšoƒšhƒšaƒšZƒšSƒšLƒšEƒš>ƒš7ƒš0ƒš)ƒš"ƒšƒšƒš ƒšƒšÿ‚šø‚šñ‚šꂚ゚Ü‚šÕ‚š΂šÇ‚šÀ‚š¹‚š²‚š«‚š¤‚š‚š–‚š‚šˆ‚š‚šz‚šs‚šl‚še‚š^‚šW‚šP‚šI‚šB‚š;‚š4‚š-‚š&‚š‚š‚š‚š ‚š‚šüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššù€šò€š뀚䀚Ý€šÖ€šÏ€šÈ€šÁ€šº€š³€š¬€š¥€šž€š—€š€š‰€š‚€š{€št€šm€šf€š_€šX€šQ€šJ€šC€š<€š5€š.€š'€š €š€š€š €š€šýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššú~šó~šì~šå~šÞ~š×~šÐ~šÉ~šÂ~š»~š´~š­~š¦~šŸ~š˜~š‘~šŠ~šƒ~š|~šu~šn~šg~š`~šY~šR~šK~šD~š=~š6~š/~š(~š!~š~š~š ~š~šþ}š÷}šð}šé}šâ}šÛ}šÔ}šÍ}šÆ}š¿}š¸}š±}šª}š£}šœ}š•}šŽ}š‡}š€}šy}šr}šk}šd}š]}šV}šO}šH}šA}š:}š3}š,}š%}š}š}š}š }š}šû|šô|ší|šæ|šß|šØ|šÑ|šÊ|šÃ|š¼|šµ|š®|š§|š |š™|š’|š‹|š„|š}|šv|šo|šh|ša|šZ|šS|šL|šE|š>|š7|š0|š)|š"|š|š|š |š|šÿ{šø{šñ{šê{šã{šÜ{šÕ{šÎ{šÇ{šÀ{š¹{š²{š«{š¤{š{š–{š{šˆ{š{šz{šs{šl{še{š^{šW{šP{šI{šB{š;{š4{š-{š&{š{š{š{š {š{šüzšõzšîzšçzšàzšÙzšÒzšËzšÄzš½zš¶zš¯zš¨zš¡zššzš“zšŒzš…zš~zšwzšpzšizšbzš[zšTzšMzšFzš?zš8zš1zš*zš#zšzšzšzšzšzšùyšòyšëyšäyšÝyšÖyšÏyšÈyšÁyšºyš³yš¬yš¥yšžyš—yšyš‰yš‚yš{yštyšmyšfyš_yšXyšQyšJyšCyšuš7uš0uš)uš"ušušuš ušušÿtšøtšñtšêtšãtšÜtšÕtšÎtšÇtšÀtš¹tš²tš«tš¤tštš–tštšˆtštšztšstšltšetš^tšWtšPtšItšBtš;tš4tš-tš&tštštštš tštšüsšõsšîsšçsšàsšÙsšÒsšËsšÄsš½sš¶sš¯sš¨sš¡sššsš“sšŒsš…sš~sšwsšpsšisšbsš[sšTsšMsšFsš?sš8sš1sš*sš#sšsšsšsšsšsšùršòršëršäršÝršÖršÏršÈršÁršºrš³rš¬rš¥ršžrš—ršrš‰rš‚rš{rštršmršfrš_ršXršQršJršCršnš7nš0nš)nš"nšnšnš nšnšÿmšømšñmšêmšãmšÜmšÕmšÎmšÇmšÀmš¹mš²mš«mš¤mšmš–mšmšˆmšmšzmšsmšlmšemš^mšWmšPmšImšBmš;mš4mš-mš&mšmšmšmš mšmšülšõlšîlšçlšàlšÙlšÒlšËlšÄlš½lš¶lš¯lš¨lš¡lššlš“lšŒlš…lš~lšwlšplšilšblš[lšTlšMlšFlš?lš8lš1lš*lš#lšlšlšlšlšlšùkšòkšëkšäkšÝkšÖkšÏkšÈkšÁkšºkš³kš¬kš¥kšžkš—kškš‰kš‚kš{kštkšmkšfkš_kšXkšQkšJkšCkšgš7gš0gš)gš"gšgšgš gšgšÿfšøfšñfšêfšãfšÜfšÕfšÎfšÇfšÀfš¹fš²fš«fš¤fšfš–fšfšˆfšfšzfšsfšlfšefš^fšWfšPfšIfšBfš;fš4fš-fš&fšfšfšfš fšfšüešõešîešçešàešÙešÒešËešÄeš½eš¶eš¯eš¨eš¡eššeš“ešŒeš…eš~ešwešpešiešbeš[ešTešMešFeš?eš8eš1eš*eš#ešešešešešešùdšòdšëdšädšÝdšÖdšÏdšÈdšÁdšºdš³dš¬dš¥dšždš—dšdš‰dš‚dš{dštdšmdšfdš_dšXdšQdšJdšCdš`š7`š0`š)`š"`š`š`š `š`šÿ_šø_šñ_šê_šã_šÜ_šÕ_šÎ_šÇ_šÀ_š¹_š²_š«_š¤_š_š–_š_šˆ_š_šz_šs_šl_še_š^_šW_šP_šI_šB_š;_š4_š-_š&_š_š_š_š _š_šü^šõ^šî^šç^šà^šÙ^šÒ^šË^šÄ^š½^š¶^š¯^š¨^š¡^šš^š“^šŒ^š…^š~^šw^šp^ši^šb^š[^šT^šM^šF^š?^š8^š1^š*^š#^š^š^š^š^š^šù]šò]šë]šä]šÝ]šÖ]šÏ]šÈ]šÁ]šº]š³]š¬]š¥]šž]š—]š]š‰]š‚]š{]št]šm]šf]š_]šX]šQ]šJ]šC]š<]š5]š.]š']š ]š]š]š ]š]šý\šö\šï\šè\šá\šÚ\šÓ\šÌ\šÅ\š¾\š·\š°\š©\š¢\š›\š”\š\š†\š\šx\šq\šj\šc\š\\šU\šN\šG\š@\š9\š2\š+\š$\š\š\š\š\š\šú[šó[šì[šå[šÞ[š×[šÐ[šÉ[šÂ[š»[š´[š­[š¦[šŸ[š˜[š‘[šŠ[šƒ[š|[šu[šn[šg[š`[šY[šR[šK[šD[š=[š6[š/[š([š![š[š[š [š[šþZš÷ZšðZšéZšâZšÛZšÔZšÍZšÆZš¿Zš¸Zš±ZšªZš£ZšœZš•ZšŽZš‡Zš€ZšyZšrZškZšdZš]ZšVZšOZšHZšAZš:Zš3Zš,Zš%ZšZšZšZš ZšZšûYšôYšíYšæYšßYšØYšÑYšÊYšÃYš¼YšµYš®Yš§Yš Yš™Yš’Yš‹Yš„Yš}YšvYšoYšhYšaYšZYšSYšLYšEYš>Yš7Yš0Yš)Yš"YšYšYš YšYšÿXšøXšñXšêXšãXšÜXšÕXšÎXšÇXšÀXš¹Xš²Xš«Xš¤XšXš–XšXšˆXšXšzXšsXšlXšeXš^XšWXšPXšIXšBXš;Xš4Xš-Xš&XšXšXšXš XšXšüWšõWšîWšçWšàWšÙWšÒWšËWšÄWš½Wš¶Wš¯Wš¨Wš¡WššWš“WšŒWš…Wš~WšwWšpWšiWšbWš[WšTWšMWšFWš?Wš8Wš1Wš*Wš#WšWšWšWšWšWšùVšòVšëVšäVšÝVšÖVšÏVšÈVšÁVšºVš³Vš¬Vš¥VšžVš—VšVš‰Vš‚Vš{VštVšmVšfVš_VšXVšQVšJVšCVšRš7Rš0Rš)Rš"RšRšRš RšRšÿQšøQšñQšêQšãQšÜQšÕQšÎQšÇQšÀQš¹Qš²Qš«Qš¤QšQš–QšQšˆQšQšzQšsQšlQšeQš^QšWQšPQšIQšBQš;Qš4Qš-Qš&QšQšQšQš QšQšüPšõPšîPšçPšàPšÙPšÒPšËPšÄPš½Pš¶Pš¯Pš¨Pš¡PššPš“PšŒPš…Pš~PšwPšpPšiPšbPš[PšTPšMPšFPš?Pš8Pš1Pš*Pš#PšPšPšPšPšPšùOšòOšëOšäOšÝOšÖOšÏOšÈOšÁOšºOš³Oš¬Oš¥OšžOš—OšOš‰Oš‚Oš{OštOšmOšfOš_OšXOšQOšJOšCOšKš7Kš0Kš)Kš"KšKšKš KšKšÿJšøJšñJšêJšãJšÜJšÕJšÎJšÇJšÀJš¹Jš²Jš«Jš¤JšJš–JšJšˆJšJšzJšsJšlJšeJš^JšWJšPJšIJšBJš;Jš4Jš-Jš&JšJšJšJš JšJšüIšõIšîIšçIšàIšÙIšÒIšËIšÄIš½Iš¶Iš¯Iš¨Iš¡IššIš“IšŒIš…Iš~IšwIšpIšiIšbIš[IšTIšMIšFIš?Iš8Iš1Iš*Iš#IšIšIšIšIšIšùHšòHšëHšäHšÝHšÖHšÏHšÈHšÁHšºHš³Hš¬Hš¥HšžHš—HšHš‰Hš‚Hš{HštHšmHšfHš_HšXHšQHšJHšCHšDš7Dš0Dš)Dš"DšDšDš DšDšÿCšøCšñCšêCšãCšÜCšÕCšÎCšÇCšÀCš¹Cš²Cš«Cš¤CšCš–CšCšˆCšCšzCšsCšlCšeCš^CšWCšPCšICšBCš;Cš4Cš-Cš&CšCšCšCš CšCšüBšõBšîBšçBšàBšÙBšÒBšËBšÄBš½Bš¶Bš¯Bš¨Bš¡BššBš“BšŒBš…Bš~BšwBšpBšiBšbBš[BšTBšMBšFBš?Bš8Bš1Bš*Bš#BšBšBšBšBšBšùAšòAšëAšäAšÝAšÖAšÏAšÈAšÁAšºAš³Aš¬Aš¥AšžAš—AšAš‰Aš‚Aš{AštAšmAšfAš_AšXAšQAšJAšCAšš÷>šð>šé>šâ>šÛ>šÔ>šÍ>šÆ>š¿>š¸>š±>šª>š£>šœ>š•>šŽ>š‡>š€>šy>šr>šk>šd>š]>šV>šO>šH>šA>š:>š3>š,>š%>š>š>š>š >š>šû=šô=ší=šæ=šß=šØ=šÑ=šÊ=šÃ=š¼=šµ=š®=š§=š =š™=š’=š‹=š„=š}=šv=šo=šh=ša=šZ=šS=šL=šE=š>=š7=š0=š)=š"=š=š=š =š=šÿ<šø<šñ<šê<šã<šÜ<šÕ<šÎ<šÇ<šÀ<š¹<š²<š«<š¤<š<š–<š<šˆ<š<šz<šs<šl<še<š^<šW<šP<šI<šB<š;<š4<š-<š&<š<š<š<š <š<šü;šõ;šî;šç;šà;šÙ;šÒ;šË;šÄ;š½;š¶;š¯;š¨;š¡;šš;š“;šŒ;š…;š~;šw;šp;ši;šb;š[;šT;šM;šF;š?;š8;š1;š*;š#;š;š;š;š;š;šù:šò:šë:šä:šÝ:šÖ:šÏ:šÈ:šÁ:šº:š³:š¬:š¥:šž:š—:š:š‰:š‚:š{:št:šm:šf:š_:šX:šQ:šJ:šC:š<:š5:š.:š':š :š:š:š :š:šý9šö9šï9šè9šá9šÚ9šÓ9šÌ9šÅ9š¾9š·9š°9š©9š¢9š›9š”9š9š†9š9šx9šq9šj9šc9š\9šU9šN9šG9š@9š99š29š+9š$9š9š9š9š9š9šú8šó8šì8šå8šÞ8š×8šÐ8šÉ8šÂ8š»8š´8š­8š¦8šŸ8š˜8š‘8šŠ8šƒ8š|8šu8šn8šg8š`8šY8šR8šK8šD8š=8š68š/8š(8š!8š8š8š 8š8šþ7š÷7šð7šé7šâ7šÛ7šÔ7šÍ7šÆ7š¿7š¸7š±7šª7š£7šœ7š•7šŽ7š‡7š€7šy7šr7šk7šd7š]7šV7šO7šH7šA7š:7š37š,7š%7š7š7š7š 7š7šû6šô6ší6šæ6šß6šØ6šÑ6šÊ6šÃ6š¼6šµ6š®6š§6š 6š™6š’6š‹6š„6š}6šv6šo6šh6ša6šZ6šS6šL6šE6š>6š76š06š)6š"6š6š6š 6š6šÿ5šø5šñ5šê5šã5šÜ5šÕ5šÎ5šÇ5šÀ5š¹5š²5š«5š¤5š5š–5š5šˆ5š5šz5šs5šl5še5š^5šW5šP5šI5šB5š;5š45š-5š&5š5š5š5š 5š5šü4šõ4šî4šç4šà4šÙ4šÒ4šË4šÄ4š½4š¶4š¯4š¨4š¡4šš4š“4šŒ4š…4š~4šw4šp4ši4šb4š[4šT4šM4šF4š?4š84š14š*4š#4š4š4š4š4š4šù3šò3šë3šä3šÝ3šÖ3šÏ3šÈ3šÁ3šº3š³3š¬3š¥3šž3š—3š3š‰3š‚3š{3št3šm3šf3š_3šX3šQ3šJ3šC3š<3š53š.3š'3š 3š3š3š 3š3šý2šö2šï2šè2šá2šÚ2šÓ2šÌ2šÅ2š¾2š·2š°2š©2š¢2š›2š”2š2š†2š2šx2šq2šj2šc2š\2šU2šN2šG2š@2š92š22š+2š$2š2š2š2š2š2šú1šó1šì1šå1šÞ1š×1šÐ1šÉ1šÂ1š»1š´1š­1š¦1šŸ1š˜1š‘1šŠ1šƒ1š|1šu1šn1šg1š`1šY1šR1šK1šD1š=1š61š/1š(1š!1š1š1š 1š1šþ0š÷0šð0šé0šâ0šÛ0šÔ0šÍ0šÆ0š¿0š¸0š±0šª0š£0šœ0š•0šŽ0š‡0š€0šy0šr0šk0šd0š]0šV0šO0šH0šA0š:0š30š,0š%0š0š0š0š 0š0šû/šô/ší/šæ/šß/šØ/šÑ/šÊ/šÃ/š¼/šµ/š®/š§/š /š™/š’/š‹/š„/š}/šv/šo/šh/ša/šZ/šS/šL/šE/š>/š7/š0/š)/š"/š/š/š /š/šÿ.šø.šñ.šê.šã.šÜ.šÕ.šÎ.šÇ.šÀ.š¹.š².š«.š¤.š.š–.š.šˆ.š.šz.šs.šl.še.š^.šW.šP.šI.šB.š;.š4.š-.š&.š.š.š.š .š.šü-šõ-šî-šç-šà-šÙ-šÒ-šË-šÄ-š½-š¶-š¯-š¨-š¡-šš-š“-šŒ-š…-š~-šw-šp-ši-šb-š[-šT-šM-šF-š?-š8-š1-š*-š#-š-š-š-š-š-šù,šò,šë,šä,šÝ,šÖ,šÏ,šÈ,šÁ,šº,š³,š¬,š¥,šž,š—,š,š‰,š‚,š{,št,šm,šf,š_,šX,šQ,šJ,šC,š<,š5,š.,š',š ,š,š,š ,š,šý+šö+šï+šè+šá+šÚ+šÓ+šÌ+šÅ+š¾+š·+š°+š©+š¢+š›+š”+š+š†+š+šx+šq+šj+šc+š\+šU+šN+šG+š@+š9+š2+š++š$+š+š+š+š+š+šú*šó*šì*šå*šÞ*š×*šÐ*šÉ*šÂ*š»*š´*š­*š¦*šŸ*š˜*š‘*šŠ*šƒ*š|*šu*šn*šg*š`*šY*šR*šK*šD*š=*š6*š/*š(*š!*š*š*š *š*šþ)š÷)šð)šé)šâ)šÛ)šÔ)šÍ)šÆ)š¿)š¸)š±)šª)š£)šœ)š•)šŽ)š‡)š€)šy)šr)šk)šd)š])šV)šO)šH)šA)š:)š3)š,)š%)š)š)š)š )š)šû(šô(ší(šæ(šß(šØ(šÑ(šÊ(šÃ(š¼(šµ(š®(š§(š (š™(š’(š‹(š„(š}(šv(šo(šh(ša(šZ(šS(šL(šE(š>(š7(š0(š)(š"(š(š(š (š(šÿ'šø'šñ'šê'šã'šÜ'šÕ'šÎ'šÇ'šÀ'š¹'š²'š«'š¤'š'š–'š'šˆ'š'šz'šs'šl'še'š^'šW'šP'šI'šB'š;'š4'š-'š&'š'š'š'š 'š'šü&šõ&šî&šç&šà&šÙ&šÒ&šË&šÄ&š½&š¶&š¯&š¨&š¡&šš&š“&šŒ&š…&š~&šw&šp&ši&šb&š[&šT&šM&šF&š?&š8&š1&š*&š#&š&š&š&š&š&šù%šò%šë%šä%šÝ%šÖ%šÏ%šÈ%šÁ%šº%š³%š¬%š¥%šž%š—%š%š‰%š‚%š{%št%šm%šf%š_%šX%šQ%šJ%šC%š<%š5%š.%š'%š %š%š%š %š%šý$šö$šï$šè$šá$šÚ$šÓ$šÌ$šÅ$š¾$š·$š°$š©$š¢$š›$š”$š$š†$š$šx$šq$šj$šc$š\$šU$šN$šG$š@$š9$š2$š+$š$$š$š$š$š$š$šú#šó#šì#šå#šÞ#š×#šÐ#šÉ#šÂ#š»#š´#š­#š¦#šŸ#š˜#š‘#šŠ#šƒ#š|#šu#šn#šg#š`#šY#šR#šK#šD#š=#š6#š/#š(#š!#š#š#š #š#šþ"š÷"šð"šé"šâ"šÛ"šÔ"šÍ"šÆ"š¿"š¸"š±"šª"š£"šœ"š•"šŽ"š‡"š€"šy"šr"šk"šd"š]"šV"šO"šH"šA"š:"š3"š,"š%"š"š"š"š "š"šû!šô!ší!šæ!šß!šØ!šÑ!šÊ!šÃ!š¼!šµ!š®!š§!š !š™!š’!š‹!š„!š}!šv!šo!šh!ša!šZ!šS!šL!šE!š>!š7!š0!š)!š"!š!š!š !š!šÿ šø šñ šê šã šÜ šÕ šÎ šÇ šÀ š¹ š² š« š¤ š š– š šˆ š šz šs šl še š^ šW šP šI šB š; š4 š- š& š š š š š šüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúšóšìšåšÞš×šÐšÉšÂš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššûšôšíšæšßšØšÑšÊšÃš¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿšøšñšêšãšÜšÕšÎšÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúšóšìšåšÞš×šÐšÉšÂš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššûšôšíšæšßšØšÑšÊšÃš¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿšøšñšêšãšÜšÕšÎšÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúšóšìšåšÞš×šÐšÉšÂš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ š÷ šð šé šâ šÛ šÔ šÍ šÆ š¿ š¸ š± šª š£ šœ š• šŽ š‡ š€ šy šr šk šd š] šV šO šH šA š: š3 š, š% š š š š š šû šô ší šæ šß šØ šÑ šÊ šà š¼ šµ š® š§ š  š™ š’ š‹ š„ š} šv šo šh ša šZ šS šL šE š> š7 š0 š) š" š š š š šÿ šø šñ šê šã šÜ šÕ šÎ šÇ šÀ š¹ š² š« š¤ š š– š šˆ š šz šs šl še š^ šW šP šI šB š; š4 š- š& š š š š š šü šõ šî šç šà šÙ šÒ šË šÄ š½ š¶ š¯ š¨ š¡ šš š“ šŒ š… š~ šw šp ši šb š[ šT šM šF š? š8 š1 š* š# š š š š š šù šò šë šä šÝ šÖ šÏ šÈ šÁ šº š³ š¬ š¥ šž š— š š‰ š‚ š{ št šm šf š_ šX šQ šJ šC š< š5 š. š' š š š š š šýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúšóšìšåšÞš×šÐšÉšÂš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššûšôšíšæšßšØšÑšÊšÃš¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿšøšñšêšãšÜšÕšÎšÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššüšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššúšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþÿ™÷ÿ™ðÿ™éÿ™âÿ™Ûÿ™Ôÿ™Íÿ™Æÿ™¿ÿ™¸ÿ™±ÿ™ªÿ™£ÿ™œÿ™•ÿ™Žÿ™‡ÿ™€ÿ™yÿ™rÿ™kÿ™dÿ™]ÿ™Vÿ™Oÿ™Hÿ™Aÿ™:ÿ™3ÿ™,ÿ™%ÿ™ÿ™ÿ™ÿ™ ÿ™ÿ™ûþ™ôþ™íþ™æþ™ßþ™Øþ™Ñþ™Êþ™Ãþ™¼þ™µþ™®þ™§þ™ þ™™þ™’þ™‹þ™„þ™}þ™vþ™oþ™hþ™aþ™Zþ™Sþ™Lþ™Eþ™>þ™7þ™0þ™)þ™"þ™þ™þ™ þ™þ™ÿý™øý™ñý™êý™ãý™Üý™Õý™Îý™Çý™Àý™¹ý™²ý™«ý™¤ý™ý™–ý™ý™ˆý™ý™zý™sý™lý™eý™^ý™Wý™Pý™Iý™Bý™;ý™4ý™-ý™&ý™ý™ý™ý™ ý™ý™üü™õü™îü™çü™àü™Ùü™Òü™Ëü™Äü™½ü™¶ü™¯ü™¨ü™¡ü™šü™“ü™Œü™…ü™~ü™wü™pü™iü™bü™[ü™Tü™Mü™Fü™?ü™8ü™1ü™*ü™#ü™ü™ü™ü™ü™ü™ùû™òû™ëû™äû™Ýû™Öû™Ïû™Èû™Áû™ºû™³û™¬û™¥û™žû™—û™û™‰û™‚û™{û™tû™mû™fû™_û™Xû™Qû™Jû™Cû™<û™5û™.û™'û™ û™û™û™ û™û™ýú™öú™ïú™èú™áú™Úú™Óú™Ìú™Åú™¾ú™·ú™°ú™©ú™¢ú™›ú™”ú™ú™†ú™ú™xú™qú™jú™cú™\ú™Uú™Nú™Gú™@ú™9ú™2ú™+ú™$ú™ú™ú™ú™ú™ú™úù™óù™ìù™åù™Þù™×ù™Ðù™Éù™Âù™»ù™´ù™­ù™¦ù™Ÿù™˜ù™‘ù™Šù™ƒù™|ù™uù™nù™gù™`ù™Yù™Rù™Kù™Dù™=ù™6ù™/ù™(ù™!ù™ù™ù™ ù™ù™þø™÷ø™ðø™éø™âø™Ûø™Ôø™Íø™Æø™¿ø™¸ø™±ø™ªø™£ø™œø™•ø™Žø™‡ø™€ø™yø™rø™kø™dø™]ø™Vø™Oø™Hø™Aø™:ø™3ø™,ø™%ø™ø™ø™ø™ ø™ø™û÷™ô÷™í÷™æ÷™ß÷™Ø÷™Ñ÷™Ê÷™Ã÷™¼÷™µ÷™®÷™§÷™ ÷™™÷™’÷™‹÷™„÷™}÷™v÷™o÷™h÷™a÷™Z÷™S÷™L÷™E÷™>÷™7÷™0÷™)÷™"÷™÷™÷™ ÷™÷™ÿö™øö™ñö™êö™ãö™Üö™Õö™Îö™Çö™Àö™¹ö™²ö™«ö™¤ö™ö™–ö™ö™ˆö™ö™zö™sö™lö™eö™^ö™Wö™Pö™Iö™Bö™;ö™4ö™-ö™&ö™ö™ö™ö™ ö™ö™üõ™õõ™îõ™çõ™àõ™Ùõ™Òõ™Ëõ™Äõ™½õ™¶õ™¯õ™¨õ™¡õ™šõ™“õ™Œõ™…õ™~õ™wõ™põ™iõ™bõ™[õ™Tõ™Mõ™Fõ™?õ™8õ™1õ™*õ™#õ™õ™õ™õ™õ™õ™ùô™òô™ëô™äô™Ýô™Öô™Ïô™Èô™Áô™ºô™³ô™¬ô™¥ô™žô™—ô™ô™‰ô™‚ô™{ô™tô™mô™fô™_ô™Xô™Qô™Jô™Cô™<ô™5ô™.ô™'ô™ ô™ô™ô™ ô™ô™ýó™öó™ïó™èó™áó™Úó™Óó™Ìó™Åó™¾ó™·ó™°ó™©ó™¢ó™›ó™”ó™ó™†ó™ó™xó™qó™jó™có™\ó™Uó™Nó™Gó™@ó™9ó™2ó™+ó™$ó™ó™ó™ó™ó™ó™úò™óò™ìò™åò™Þò™×ò™Ðò™Éò™Âò™»ò™´ò™­ò™¦ò™Ÿò™˜ò™‘ò™Šò™ƒò™|ò™uò™nò™gò™`ò™Yò™Rò™Kò™Dò™=ò™6ò™/ò™(ò™!ò™ò™ò™ ò™ò™þñ™÷ñ™ðñ™éñ™âñ™Ûñ™Ôñ™Íñ™Æñ™¿ñ™¸ñ™±ñ™ªñ™£ñ™œñ™•ñ™Žñ™‡ñ™€ñ™yñ™rñ™kñ™dñ™]ñ™Vñ™Oñ™Hñ™Añ™:ñ™3ñ™,ñ™%ñ™ñ™ñ™ñ™ ñ™ñ™ûð™ôð™íð™æð™ßð™Øð™Ñð™Êð™Ãð™¼ð™µð™®ð™§ð™ ð™™ð™’ð™‹ð™„ð™}ð™vð™oð™hð™að™Zð™Sð™Lð™Eð™>ð™7ð™0ð™)ð™"ð™ð™ð™ ð™ð™ÿï™øï™ñï™êï™ãï™Üï™Õï™Îï™Çï™Àï™ï™–ï™ï™ˆï™ï™zï™sï™lï™eï™^ï™Wï™Pï™Iï™Bï™;ï™4ï™-ï™&ï™ï™ï™ï™ ï™ï™üî™õî™îî™çî™àî™Ùî™Òî™Ëî™Äî™~î™wî™pî™iî™bî™[î™Tî™Mî™Fî™?î™8î™1î™*î™#î™î™î™î™î™î™ùí™òí™ëí™äí™Ýí™Öí™Ïí™Èí™Á홺홳홬홥홞홗í™í™‰í™‚í™{í™tí™mí™fí™_í™Xí™Qí™Jí™Cí™<í™5í™.í™'í™ í™í™í™ í™í™ýì™öì™ïì™èì™áì™Úì™Óì™Ìì™Å왾왷왰왩왢왛왔ì™ì™†ì™ì™xì™qì™jì™cì™\ì™Uì™Nì™Gì™@ì™9ì™2ì™+ì™$ì™ì™ì™ì™ì™ì™úë™óë™ìë™åë™Þë™×ë™Ðë™Éë™Â뙻뙴뙭뙦뙟뙘뙑뙊뙃ë™|ë™uë™në™gë™`ë™Yë™Rë™Kë™Dë™=ë™6ë™/ë™(ë™!ë™ë™ë™ ë™ë™þê™÷ê™ðê™éê™âê™Ûê™Ôê™Íê™Æê™¿ê™¸ê™±ê™ªê™£ê™œê™•ê™Žê™‡ê™€ê™yê™rê™kê™dê™]ê™Vê™Oê™Hê™Aê™:ê™3ê™,ê™%ê™ê™ê™ê™ ê™ê™ûé™ôé™í陿é™ß陨é™Ñé™Êé™Ã陼陵陮陧陠陙陒陋附é™}é™vé™oé™hé™aé™Zé™Sé™Lé™Eé™>é™7é™0é™)é™"é™é™é™ é™é™ÿè™øè™ñè™êè™ãè™Üè™Õè™Îè™Çè™À虹虲虫虤è™è™–è™è™ˆè™è™zè™sè™lè™eè™^è™Wè™Pè™Iè™Bè™;è™4è™-è™&è™è™è™è™ è™è™üç™õç™îç™çç™àç™Ùç™Òç™Ëç™Ä白癶癯癨癡癚癓癌癅ç™~ç™wç™pç™iç™bç™[ç™Tç™Mç™Fç™?ç™8ç™1ç™*ç™#ç™ç™ç™ç™ç™ç™ùæ™òæ™ëæ™äæ™Ýæ™Öæ™Ïæ™Èæ™Áæ™ºæ™³æ™¬æ™¥æ™žæ™—æ™æ™‰æ™‚æ™{æ™tæ™mæ™fæ™_æ™Xæ™Qæ™Jæ™Cæ™<æ™5æ™.æ™'æ™ æ™æ™æ™ æ™æ™ýå™öå™ïå™èå™áå™Úå™Óå™Ìå™Å噾噷噰噩噢噛噔å™å™†å™å™xå™qå™jå™cå™\å™Uå™Nå™Gå™@å™9å™2å™+å™$å™å™å™å™å™å™úä™óä™ìä™åä™Þä™×ä™Ðä™Éä™Â䙻䙴䙭䙦䙟䙘䙑䙊䙃ä™|ä™uä™nä™gä™`ä™Yä™Rä™Kä™Dä™=ä™6ä™/ä™(ä™!ä™ä™ä™ ä™ä™þã™÷ã™ðã™éã™âã™Ûã™Ôã™Íã™Æã™¿ã™¸ã™±ã™ªã™£ã™œã™•ã™Žã™‡ã™€ã™yã™rã™kã™dã™]ã™Vã™Oã™Hã™Aã™:ã™3ã™,ã™%ã™ã™ã™ã™ ã™ã™ûâ™ôâ™íâ™æâ™ßâ™Øâ™Ñâ™Êâ™Ã♼♵♮♧♠♙♒♋♄â™}â™vâ™oâ™hâ™aâ™Zâ™Sâ™Lâ™Eâ™>â™7â™0â™)â™"â™â™â™ â™â™ÿá™øá™ñá™êá™ãá™Üá™Õá™Îá™Çá™Àᙹᙲᙫᙤá™á™–á™á™ˆá™á™zá™sá™lá™eá™^á™Wá™Pá™Iá™Bá™;á™4á™-á™&á™á™á™á™ á™á™üà™õà™îà™çà™àà™Ùà™Òà™Ëà™Äà™½à™¶à™¯à™¨à™¡à™šà™“à™Œà™…à™~à™wà™pà™ià™bà™[à™Tà™Mà™Fà™?à™8à™1à™*à™#à™à™à™à™à™à™ùß™òß™ëß™äß™Ýß™Öß™Ïß™Èß™Áß™ºß™³ß™¬ß™¥ß™žß™—ߙߙ‰ß™‚ß™{ß™tß™mß™fß™_ß™Xß™Qß™Jß™Cß™<ß™5ß™.ß™'ß™ ߙߙߙ ߙߙýÞ™öÞ™ïÞ™èÞ™áÞ™ÚÞ™ÓÞ™ÌÞ™ÅÞ™¾Þ™·Þ™°Þ™©Þ™¢Þ™›Þ™”Þ™Þ™†Þ™Þ™xÞ™qÞ™jÞ™cÞ™\Þ™UÞ™NÞ™GÞ™@Þ™9Þ™2Þ™+Þ™$Þ™Þ™Þ™Þ™Þ™Þ™úÝ™óÝ™ìÝ™åÝ™ÞÝ™×Ý™ÐÝ™ÉÝ™ÂÝ™»Ý™´Ý™­Ý™¦Ý™ŸÝ™˜Ý™‘Ý™ŠÝ™ƒÝ™|Ý™uÝ™nÝ™gÝ™`Ý™YÝ™RÝ™KÝ™DÝ™=Ý™6Ý™/Ý™(Ý™!ݙݙݙ ݙݙþÜ™÷Ü™ðÜ™éÜ™âÜ™ÛÜ™ÔÜ™ÍÜ™ÆÜ™¿Ü™¸Ü™±Ü™ªÜ™£Ü™œÜ™•Ü™ŽÜ™‡Ü™€Ü™yÜ™rÜ™kÜ™dÜ™]Ü™VÜ™OÜ™HÜ™AÜ™:Ü™3Ü™,Ü™%ܙܙܙܙ ܙܙûÛ™ôÛ™íÛ™æÛ™ßÛ™ØÛ™ÑÛ™ÊÛ™ÃÛ™¼Û™µÛ™®Û™§Û™ Û™™Û™’Û™‹Û™„Û™}Û™vÛ™oÛ™hÛ™aÛ™ZÛ™SÛ™LÛ™EÛ™>Û™7Û™0Û™)Û™"Û™Û™Û™ Û™Û™ÿÚ™øÚ™ñÚ™êÚ™ãÚ™ÜÚ™ÕÚ™ÎÚ™ÇÚ™ÀÚ™¹Ú™²Ú™«Ú™¤Ú™Ú™–Ú™Ú™ˆÚ™Ú™zÚ™sÚ™lÚ™eÚ™^Ú™WÚ™PÚ™IÚ™BÚ™;Ú™4Ú™-Ú™&Ú™Ú™Ú™Ú™ Ú™Ú™üÙ™õÙ™îÙ™çÙ™àÙ™ÙÙ™ÒÙ™ËÙ™ÄÙ™½Ù™¶Ù™¯Ù™¨Ù™¡Ù™šÙ™“Ù™ŒÙ™…Ù™~Ù™wÙ™pÙ™iÙ™bÙ™[Ù™TÙ™MÙ™FÙ™?Ù™8Ù™1Ù™*Ù™#Ù™Ù™Ù™Ù™Ù™Ù™ùØ™òØ™ëØ™䨙ÝØ™ÖØ™ÏØ™ÈØ™ÁØ™ºØ™³Ø™¬Ø™¥Ø™žØ™—ؙؙ‰Ø™‚Ø™{Ø™tØ™mØ™fØ™_Ø™XØ™QØ™JØ™CØ™<Ø™5Ø™.Ø™'Ø™ ؙؙؙ ؙؙý×™ö×™ï×™è×™á×™Ú×™Ó×™Ì×™Å×™¾×™·×™°×™©×™¢×™›×™”×™×™†×™×™x×™q×™j×™c×™\×™U×™N×™G×™@×™9×™2×™+×™$×™×™×™×™×™×™úÖ™óÖ™ìÖ™åÖ™ÞÖ™×Ö™ÐÖ™ÉÖ™ÂÖ™»Ö™´Ö™­Ö™¦Ö™ŸÖ™˜Ö™‘Ö™ŠÖ™ƒÖ™|Ö™uÖ™nÖ™gÖ™`Ö™YÖ™RÖ™KÖ™DÖ™=Ö™6Ö™/Ö™(Ö™!Ö™Ö™Ö™ Ö™Ö™þÕ™÷Õ™ðÕ™éÕ™âÕ™ÛÕ™ÔÕ™ÍÕ™ÆÕ™¿Õ™¸Õ™±Õ™ªÕ™£Õ™œÕ™•Õ™ŽÕ™‡Õ™€Õ™yÕ™rÕ™kÕ™dÕ™]Õ™VÕ™OÕ™HÕ™AÕ™:Õ™3Õ™,Õ™%Õ™Õ™Õ™Õ™ Õ™Õ™ûÔ™ôÔ™íÔ™æÔ™ßÔ™ØÔ™ÑÔ™ÊÔ™ÃÔ™¼Ô™µÔ™®Ô™§Ô™ Ô™™Ô™’Ô™‹Ô™„Ô™}Ô™vÔ™oÔ™hÔ™aÔ™ZÔ™SÔ™LÔ™EÔ™>Ô™7Ô™0Ô™)Ô™"Ô™Ô™Ô™ Ô™Ô™ÿÓ™øÓ™ñÓ™êÓ™ãÓ™ÜÓ™ÕÓ™ÎÓ™ÇÓ™ÀÓ™¹Ó™²Ó™«Ó™¤Ó™Ó™–Ó™Ó™ˆÓ™Ó™zÓ™sÓ™lÓ™eÓ™^Ó™WÓ™PÓ™IÓ™BÓ™;Ó™4Ó™-Ó™&Ó™Ó™Ó™Ó™ Ó™Ó™üÒ™õÒ™îÒ™çÒ™àÒ™ÙÒ™ÒÒ™ËÒ™ÄÒ™½Ò™¶Ò™¯Ò™¨Ò™¡Ò™šÒ™“Ò™ŒÒ™…Ò™~Ò™wÒ™pÒ™iÒ™bÒ™[Ò™TÒ™MÒ™FÒ™?Ò™8Ò™1Ò™*Ò™#Ò™Ò™Ò™Ò™Ò™Ò™ùÑ™òÑ™ëÑ™äÑ™ÝÑ™ÖÑ™ÏÑ™ÈÑ™ÁÑ™ºÑ™³Ñ™¬Ñ™¥Ñ™žÑ™—љљ‰Ñ™‚Ñ™{Ñ™tÑ™mÑ™fÑ™_Ñ™XÑ™QÑ™JÑ™CÑ™<Ñ™5Ñ™.Ñ™'Ñ™ љљљ љљýЙöЙïЙèЙáЙÚЙÓЙÌЙÅЙ¾Ð™·Ð™°Ð™©Ð™¢Ð™›Ð™”ЙЙ†Ð™ЙxЙqЙjЙcЙ\ЙUЙNЙGЙ@Й9Й2Й+Й$ЙЙЙЙЙЙúÏ™óÏ™ìÏ™åÏ™ÞÏ™×Ï™ÐÏ™ÉÏ™ÂÏ™»Ï™´Ï™­Ï™¦Ï™ŸÏ™˜Ï™‘Ï™ŠÏ™ƒÏ™|Ï™uÏ™nÏ™gÏ™`Ï™YÏ™RÏ™KÏ™DÏ™=Ï™6Ï™/Ï™(Ï™!ϙϙϙ ϙϙþΙ÷ΙðΙéΙâΙÛΙÔΙÍΙÆÎ™¿Î™¸Î™±Î™ªÎ™£Î™œÎ™•ΙŽÎ™‡Î™€Î™yΙrΙkΙdΙ]ΙVΙOΙHΙAΙ:Ι3Ι,Ι%ΙΙΙΙ ΙΙûÍ™ôÍ™íÍ™æÍ™ßÍ™ØÍ™ÑÍ™ÊÍ™ÃÍ™¼Í™µÍ™®Í™§Í™ Í™™Í™’Í™‹Í™„Í™}Í™vÍ™oÍ™hÍ™aÍ™ZÍ™SÍ™LÍ™EÍ™>Í™7Í™0Í™)Í™"͙͙͙ ͙͙ÿÌ™øÌ™ñÌ™êÌ™ãÌ™ÜÌ™ÕÌ™ÎÌ™ÇÌ™ÀÌ™¹Ì™²Ì™«Ì™¤Ì™Ì™–̙̙ˆÌ™Ì™zÌ™sÌ™lÌ™eÌ™^Ì™WÌ™PÌ™IÌ™BÌ™;Ì™4Ì™-Ì™&̙̙̙̙ ̙̙üË™õË™îË™çË™àË™ÙË™ÒË™ËË™ÄË™½Ë™¶Ë™¯Ë™¨Ë™¡Ë™šË™“Ë™ŒË™…Ë™~Ë™wË™pË™iË™bË™[Ë™TË™MË™FË™?Ë™8Ë™1Ë™*Ë™#˙˙˙˙˙˙ùÊ™òÊ™ëÊ™äÊ™ÝÊ™ÖÊ™ÏÊ™ÈÊ™ÁÊ™ºÊ™³Ê™¬Ê™¥Ê™žÊ™—ʙʙ‰Ê™‚Ê™{Ê™tÊ™mÊ™fÊ™_Ê™XÊ™QÊ™JÊ™CÊ™<Ê™5Ê™.Ê™'Ê™ ʙʙʙ ʙʙýÉ™öÉ™ïÉ™èÉ™áÉ™ÚÉ™ÓÉ™ÌÉ™ÅÉ™¾É™·É™°É™©É™¢É™›É™”əə†É™É™xÉ™qÉ™jÉ™cÉ™\É™UÉ™NÉ™GÉ™@É™9É™2É™+É™$əəəəəəúÈ™óÈ™ìÈ™åÈ™ÞÈ™×È™ÐÈ™ÉÈ™ÂÈ™»È™´È™­È™¦È™ŸÈ™˜È™‘È™ŠÈ™ƒÈ™|È™uÈ™nÈ™gÈ™`È™YÈ™RÈ™KÈ™DÈ™=È™6È™/È™(È™!șșș șșþÇ™÷Ç™ðÇ™éÇ™âÇ™ÛÇ™ÔÇ™ÍÇ™ÆÇ™¿Ç™¸Ç™±Ç™ªÇ™£Ç™œÇ™•Ç™ŽÇ™‡Ç™€Ç™yÇ™rÇ™kÇ™dÇ™]Ç™VÇ™OÇ™HÇ™AÇ™:Ç™3Ç™,Ç™%ǙǙǙǙ ǙǙûÆ™ôÆ™íÆ™æÆ™߯™ØÆ™ÑÆ™ÊÆ™ÃÆ™¼Æ™µÆ™®Æ™§Æ™ Æ™™Æ™’Æ™‹Æ™„Æ™}Æ™vÆ™oÆ™hÆ™aÆ™ZÆ™SÆ™LÆ™EÆ™>Æ™7Æ™0Æ™)Æ™"ƙƙƙ ƙƙÿÅ™øÅ™ñÅ™êÅ™ãÅ™ÜÅ™ÕÅ™ÎÅ™ÇÅ™ÀÅ™¹Å™²Å™«Å™¤Å™Å™–řřˆÅ™Å™zÅ™sÅ™lÅ™eÅ™^Å™WÅ™PÅ™IÅ™BÅ™;Å™4Å™-Å™&řřřř řřüÄ™õÄ™îÄ™çÄ™àÄ™ÙÄ™ÒÄ™ËÄ™ÄÄ™½Ä™¶Ä™¯Ä™¨Ä™¡Ä™šÄ™“Ä™ŒÄ™…Ä™~Ä™wÄ™pÄ™iÄ™bÄ™[Ä™TÄ™MÄ™FÄ™?Ä™8Ä™1Ä™*Ä™#ęęęęęęùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞÙ—ÙىÙ‚Ù{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙý™ö™ï™è™á™Ú™Ó™Ì™Å™¾Â™·Â™°Â™©Â™¢Â™›Â™”™™†Â™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™úÁ™óÁ™ìÁ™åÁ™ÞÁ™×Á™ÐÁ™ÉÁ™ÂÁ™»Á™´Á™­Á™¦Á™ŸÁ™˜Á™‘Á™ŠÁ™ƒÁ™|Á™uÁ™nÁ™gÁ™`Á™YÁ™RÁ™KÁ™DÁ™=Á™6Á™/Á™(Á™!Á™Á™Á™ Á™Á™þÀ™÷À™ðÀ™éÀ™âÀ™ÛÀ™ÔÀ™ÍÀ™ÆÀ™¿À™¸À™±À™ªÀ™£À™œÀ™•À™ŽÀ™‡À™€À™yÀ™rÀ™kÀ™dÀ™]À™VÀ™OÀ™HÀ™AÀ™:À™3À™,À™%À™À™À™À™ À™À™û¿™ô¿™í¿™æ¿™ß¿™Ø¿™Ñ¿™Ê¿™ÿ™¼¿™µ¿™®¿™§¿™ ¿™™¿™’¿™‹¿™„¿™}¿™v¿™o¿™h¿™a¿™Z¿™S¿™L¿™E¿™>¿™7¿™0¿™)¿™"¿™¿™¿™ ¿™¿™ÿ¾™ø¾™ñ¾™ê¾™ã¾™ܾ™Õ¾™ξ™Ǿ™À¾™¹¾™²¾™«¾™¤¾™¾™–¾™¾™ˆ¾™¾™z¾™s¾™l¾™e¾™^¾™W¾™P¾™I¾™B¾™;¾™4¾™-¾™&¾™¾™¾™¾™ ¾™¾™ü½™õ½™î½™ç½™ཙÙ½™Ò½™˽™Ľ™½½™¶½™¯½™¨½™¡½™š½™“½™Œ½™…½™~½™w½™p½™i½™b½™[½™T½™M½™F½™?½™8½™1½™*½™#½™½™½™½™½™½™ù¼™ò¼™ë¼™ä¼™ݼ™Ö¼™ϼ™ȼ™Á¼™º¼™³¼™¬¼™¥¼™ž¼™—¼™¼™‰¼™‚¼™{¼™t¼™m¼™f¼™_¼™X¼™Q¼™J¼™C¼™<¼™5¼™.¼™'¼™ ¼™¼™¼™ ¼™¼™ý»™ö»™ï»™è»™á»™Ú»™Ó»™Ì»™Å»™¾»™·»™°»™©»™¢»™›»™”»™»™†»™»™x»™q»™j»™c»™\»™U»™N»™G»™@»™9»™2»™+»™$»™»™»™»™»™»™úº™óº™캙庙Þº™׺™к™ɺ™º™»º™´º™­º™¦º™Ÿº™˜º™‘º™Šº™ƒº™|º™uº™nº™gº™`º™Yº™Rº™Kº™Dº™=º™6º™/º™(º™!º™º™º™ º™º™þ¹™÷¹™ð¹™é¹™â¹™Û¹™Ô¹™͹™ƹ™¿¹™¸¹™±¹™ª¹™£¹™œ¹™•¹™޹™‡¹™€¹™y¹™r¹™k¹™d¹™]¹™V¹™O¹™H¹™A¹™:¹™3¹™,¹™%¹™¹™¹™¹™ ¹™¹™û¸™ô¸™í¸™渙߸™ظ™Ѹ™ʸ™ø™¼¸™µ¸™®¸™§¸™ ¸™™¸™’¸™‹¸™„¸™}¸™v¸™o¸™h¸™a¸™Z¸™S¸™L¸™E¸™>¸™7¸™0¸™)¸™"¸™¸™¸™ ¸™¸™ÿ·™ø·™ñ·™ê·™ã·™Ü·™Õ·™η™Ç·™À·™¹·™²·™«·™¤·™·™–·™·™ˆ·™·™z·™s·™l·™e·™^·™W·™P·™I·™B·™;·™4·™-·™&·™·™·™·™ ·™·™ü¶™õ¶™î¶™ç¶™à¶™Ù¶™Ò¶™˶™Ķ™½¶™¶¶™¯¶™¨¶™¡¶™š¶™“¶™Œ¶™…¶™~¶™w¶™p¶™i¶™b¶™[¶™T¶™M¶™F¶™?¶™8¶™1¶™*¶™#¶™¶™¶™¶™¶™¶™ùµ™òµ™ëµ™äµ™ݵ™Öµ™ϵ™ȵ™Áµ™ºµ™³µ™¬µ™¥µ™žµ™—µ™µ™‰µ™‚µ™{µ™tµ™mµ™fµ™_µ™Xµ™Qµ™Jµ™Cµ™<µ™5µ™.µ™'µ™ µ™µ™µ™ µ™µ™ý´™ö´™ï´™è´™á´™Ú´™Ó´™Ì´™Å´™¾´™·´™°´™©´™¢´™›´™”´™´™†´™´™x´™q´™j´™c´™\´™U´™N´™G´™@´™9´™2´™+´™$´™´™´™´™´™´™ú³™ó³™ì³™å³™Þ³™׳™г™ɳ™³™»³™´³™­³™¦³™Ÿ³™˜³™‘³™г™ƒ³™|³™u³™n³™g³™`³™Y³™R³™K³™D³™=³™6³™/³™(³™!³™³™³™ ³™³™þ²™÷²™ð²™é²™â²™Û²™Ô²™Ͳ™Ʋ™¿²™¸²™±²™ª²™£²™œ²™•²™޲™‡²™€²™y²™r²™k²™d²™]²™V²™O²™H²™A²™:²™3²™,²™%²™²™²™²™ ²™²™û±™ô±™í±™æ±™ß±™ر™ѱ™ʱ™ñ™¼±™µ±™®±™§±™ ±™™±™’±™‹±™„±™}±™v±™o±™h±™a±™Z±™S±™L±™E±™>±™7±™0±™)±™"±™±™±™ ±™±™ÿ°™ø°™ñ°™ê°™ã°™ܰ™Õ°™ΰ™ǰ™À°™¹°™²°™«°™¤°™°™–°™°™ˆ°™°™z°™s°™l°™e°™^°™W°™P°™I°™B°™;°™4°™-°™&°™°™°™°™ °™°™ü¯™õ¯™篙௙Ù¯™Ò¯™˯™į™½¯™¶¯™¯¯™¨¯™¡¯™š¯™“¯™Œ¯™…¯™~¯™w¯™p¯™i¯™b¯™[¯™T¯™M¯™F¯™?¯™8¯™1¯™*¯™#¯™¯™¯™¯™¯™¯™ù®™ò®™ë®™ä®™Ý®™Ö®™Ï®™È®™Á®™º®™³®™¬®™¥®™ž®™—®™®™‰®™‚®™{®™t®™m®™f®™_®™X®™Q®™J®™C®™<®™5®™.®™'®™ ®™®™®™ ®™®™ý­™ö­™ï­™è­™á­™Ú­™Ó­™Ì­™Å­™¾­™·­™°­™©­™¢­™›­™”­™­™†­™­™x­™q­™j­™c­™\­™U­™N­™G­™@­™9­™2­™+­™$­™­™­™­™­™­™ú¬™ó¬™쬙嬙Þ¬™׬™Ь™ɬ™¬™»¬™´¬™­¬™¦¬™Ÿ¬™˜¬™‘¬™Ь™ƒ¬™|¬™u¬™n¬™g¬™`¬™Y¬™R¬™K¬™D¬™=¬™6¬™/¬™(¬™!¬™¬™¬™ ¬™¬™þ«™÷«™ð«™é«™â«™Û«™Ô«™Í«™Æ«™¿«™¸«™±«™ª«™£«™œ«™•«™Ž«™‡«™€«™y«™r«™k«™d«™]«™V«™O«™H«™A«™:«™3«™,«™%«™«™«™«™ «™«™ûª™ôª™íª™檙ߪ™ت™Ѫ™ʪ™ê™¼ª™µª™®ª™§ª™ ª™™ª™’ª™‹ª™„ª™}ª™vª™oª™hª™aª™Zª™Sª™Lª™Eª™>ª™7ª™0ª™)ª™"ª™ª™ª™ ª™ª™ÿ©™ø©™ñ©™ê©™ã©™Ü©™Õ©™Ω™Ç©™À©™¹©™²©™«©™¤©™©™–©™©™ˆ©™©™z©™s©™l©™e©™^©™W©™P©™I©™B©™;©™4©™-©™&©™©™©™©™ ©™©™ü¨™õ¨™稙ਙÙ¨™Ò¨™˨™Ĩ™½¨™¶¨™¯¨™¨¨™¡¨™š¨™“¨™Œ¨™…¨™~¨™w¨™p¨™i¨™b¨™[¨™T¨™M¨™F¨™?¨™8¨™1¨™*¨™#¨™¨™¨™¨™¨™¨™ù§™ò§™ë§™ä§™ݧ™Ö§™ϧ™ȧ™Á§™º§™³§™¬§™¥§™ž§™—§™§™‰§™‚§™{§™t§™m§™f§™_§™X§™Q§™J§™C§™<§™5§™.§™'§™ §™§™§™ §™§™ý¦™ö¦™蓮覙ᦙÚ¦™Ó¦™̦™Ŧ™¾¦™·¦™°¦™©¦™¢¦™›¦™”¦™¦™†¦™¦™x¦™q¦™j¦™c¦™\¦™U¦™N¦™G¦™@¦™9¦™2¦™+¦™$¦™¦™¦™¦™¦™¦™ú¥™ó¥™쥙奙Þ¥™×¥™Ð¥™É¥™Â¥™»¥™´¥™­¥™¦¥™Ÿ¥™˜¥™‘¥™Š¥™ƒ¥™|¥™u¥™n¥™g¥™`¥™Y¥™R¥™K¥™D¥™=¥™6¥™/¥™(¥™!¥™¥™¥™ ¥™¥™þ¤™÷¤™ð¤™餙⤙Û¤™Ô¤™ͤ™Ƥ™¿¤™¸¤™±¤™ª¤™£¤™œ¤™•¤™ޤ™‡¤™€¤™y¤™r¤™k¤™d¤™]¤™V¤™O¤™H¤™A¤™:¤™3¤™,¤™%¤™¤™¤™¤™ ¤™¤™û£™ô£™í£™棙ߣ™Ø£™Ñ£™Ê£™ã™¼£™µ£™®£™§£™ £™™£™’£™‹£™„£™}£™v£™o£™h£™a£™Z£™S£™L£™E£™>£™7£™0£™)£™"£™£™£™ £™£™ÿ¢™ø¢™ñ¢™ꢙ㢙Ü¢™Õ¢™΢™Ç¢™À¢™¹¢™²¢™«¢™¤¢™¢™–¢™¢™ˆ¢™¢™z¢™s¢™l¢™e¢™^¢™W¢™P¢™I¢™B¢™;¢™4¢™-¢™&¢™¢™¢™¢™ ¢™¢™ü¡™õ¡™î¡™ç¡™à¡™Ù¡™Ò¡™Ë¡™Ä¡™½¡™¶¡™¯¡™¨¡™¡¡™š¡™“¡™Œ¡™…¡™~¡™w¡™p¡™i¡™b¡™[¡™T¡™M¡™F¡™?¡™8¡™1¡™*¡™#¡™¡™¡™¡™¡™¡™ù ™ò ™ë ™ä ™Ý ™Ö ™Ï ™È ™Á ™º ™³ ™¬ ™¥ ™ž ™— ™ ™‰ ™‚ ™{ ™t ™m ™f ™_ ™X ™Q ™J ™C ™< ™5 ™. ™' ™  ™ ™ ™  ™ ™ýŸ™öŸ™蟙៙ÚŸ™ÓŸ™ÌŸ™ÅŸ™¾Ÿ™·Ÿ™°Ÿ™©Ÿ™¢Ÿ™›Ÿ™”Ÿ™Ÿ™†Ÿ™Ÿ™xŸ™qŸ™jŸ™cŸ™\Ÿ™UŸ™NŸ™GŸ™@Ÿ™9Ÿ™2Ÿ™+Ÿ™$Ÿ™Ÿ™Ÿ™Ÿ™Ÿ™Ÿ™úž™óž™ìž™åž™Þž™מ™О™Éž™ž™»ž™´ž™­ž™¦ž™Ÿž™˜ž™‘ž™Šž™ƒž™|ž™už™nž™gž™`ž™Yž™Rž™Kž™Dž™=ž™6ž™/ž™(ž™!ž™ž™ž™ ž™ž™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™ûœ™ôœ™휙朙ßœ™Øœ™Ñœ™Êœ™Ü™¼œ™µœ™®œ™§œ™ œ™™œ™’œ™‹œ™„œ™}œ™vœ™oœ™hœ™aœ™Zœ™Sœ™Lœ™Eœ™>œ™7œ™0œ™)œ™"œ™œ™œ™ œ™œ™ÿ›™ø›™ñ›™ê›™ã›™Ü›™Õ›™Λ™Ç›™À›™¹›™²›™«›™¤›™›™–›™›™ˆ›™›™z›™s›™l›™e›™^›™W›™P›™I›™B›™;›™4›™-›™&›™›™›™›™ ›™›™üš™õš™îš™çš™àš™Ùš™Òš™Ëš™Äš™½š™¶š™¯š™¨š™¡š™šš™“š™Œš™…š™~š™wš™pš™iš™bš™[š™Tš™Mš™Fš™?š™8š™1š™*š™#š™š™š™š™š™š™ù™™ò™™ë™™ä™™Ý™™Ö™™Ï™™È™™Á™™º™™³™™¬™™¥™™ž™™—™™™™‰™™‚™™{™™t™™m™™f™™_™™X™™Q™™J™™C™™<™™5™™.™™'™™ ™™™™™™ ™™™™ý˜™ö˜™蘙ᘙÚ˜™Ó˜™̘™Ř™¾˜™·˜™°˜™©˜™¢˜™›˜™”˜™˜™†˜™˜™x˜™q˜™j˜™c˜™\˜™U˜™N˜™G˜™@˜™9˜™2˜™+˜™$˜™˜™˜™˜™˜™˜™ú—™ó—™ì—™å—™Þ—™×—™З™É—™—™»—™´—™­—™¦—™Ÿ—™˜—™‘—™Š—™ƒ—™|—™u—™n—™g—™`—™Y—™R—™K—™D—™=—™6—™/—™(—™!—™—™—™ —™—™þ–™÷–™ð–™é–™â–™Û–™Ô–™Í–™Æ–™¿–™¸–™±–™ª–™£–™œ–™•–™Ž–™‡–™€–™y–™r–™k–™d–™]–™V–™O–™H–™A–™:–™3–™,–™%–™–™–™–™ –™–™û•™ô•™í•™æ•™ß•™Ø•™Ñ•™Ê•™Õ™¼•™µ•™®•™§•™ •™™•™’•™‹•™„•™}•™v•™o•™h•™a•™Z•™S•™L•™E•™>•™7•™0•™)•™"•™•™•™ •™•™ÿ”™ø”™ñ”™ê”™ã”™Ü”™Õ”™Δ™Ç”™À”™¹”™²”™«”™¤”™”™–”™”™ˆ”™”™z”™s”™l”™e”™^”™W”™P”™I”™B”™;”™4”™-”™&”™”™”™”™ ”™”™ü“™õ“™î“™ç“™à“™Ù“™Ò“™Ë“™Ä“™½“™¶“™¯“™¨“™¡“™š“™““™Œ“™…“™~“™w“™p“™i“™b“™[“™T“™M“™F“™?“™8“™1“™*“™#“™“™“™“™“™“™ù’™ò’™ë’™ä’™Ý’™Ö’™Ï’™È’™Á’™º’™³’™¬’™¥’™ž’™—’™’™‰’™‚’™{’™t’™m’™f’™_’™X’™Q’™J’™C’™<’™5’™.’™'’™ ’™’™’™ ’™’™ý‘™ö‘™ï‘™è‘™á‘™Ú‘™Ó‘™Ì‘™Å‘™¾‘™·‘™°‘™©‘™¢‘™›‘™”‘™‘™†‘™‘™x‘™q‘™j‘™c‘™\‘™U‘™N‘™G‘™@‘™9‘™2‘™+‘™$‘™‘™‘™‘™‘™‘™ú™ó™ì™å™Þ™×™ЙÉ™™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™ûŽ™ôŽ™펙掙ߎ™ØŽ™ÑŽ™ÊŽ™ÃŽ™¼Ž™µŽ™®Ž™§Ž™ Ž™™Ž™’Ž™‹Ž™„Ž™}Ž™vŽ™oŽ™hŽ™aŽ™ZŽ™SŽ™LŽ™EŽ™>Ž™7Ž™0Ž™)Ž™"ޙޙޙ ޙޙÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™üŒ™õŒ™猙àŒ™ÙŒ™ÒŒ™ËŒ™ÄŒ™½Œ™¶Œ™¯Œ™¨Œ™¡Œ™šŒ™“Œ™ŒŒ™…Œ™~Œ™wŒ™pŒ™iŒ™bŒ™[Œ™TŒ™MŒ™FŒ™?Œ™8Œ™1Œ™*Œ™#Œ™Œ™Œ™Œ™Œ™Œ™ù‹™ò‹™ë‹™ä‹™Ý‹™Ö‹™Ï‹™È‹™Á‹™º‹™³‹™¬‹™¥‹™ž‹™—‹™‹™‰‹™‚‹™{‹™t‹™m‹™f‹™_‹™X‹™Q‹™J‹™C‹™<‹™5‹™.‹™'‹™ ‹™‹™‹™ ‹™‹™ýŠ™öŠ™芙ኙÚŠ™ÓŠ™ÌŠ™ÅŠ™¾Š™·Š™°Š™©Š™¢Š™›Š™”ЙЙ†Š™Š™xŠ™qŠ™jŠ™cŠ™\Š™UŠ™NŠ™GŠ™@Š™9Š™2Š™+Š™$ЙЙЙЙЙЙú‰™ó‰™쉙剙Þ‰™׉™Љ™ɉ™‰™»‰™´‰™­‰™¦‰™Ÿ‰™˜‰™‘‰™Љ™ƒ‰™|‰™u‰™n‰™g‰™`‰™Y‰™R‰™K‰™D‰™=‰™6‰™/‰™(‰™!‰™‰™‰™ ‰™‰™þˆ™÷ˆ™ðˆ™鈙∙Ûˆ™Ôˆ™͈™ƈ™¿ˆ™¸ˆ™±ˆ™ªˆ™£ˆ™œˆ™•ˆ™Žˆ™‡ˆ™€ˆ™yˆ™rˆ™kˆ™dˆ™]ˆ™Vˆ™Oˆ™Hˆ™Aˆ™:ˆ™3ˆ™,ˆ™%ˆ™ˆ™ˆ™ˆ™ ˆ™ˆ™û‡™ô‡™퇙懙߇™؇™ч™ʇ™Ç™¼‡™µ‡™®‡™§‡™ ‡™™‡™’‡™‹‡™„‡™}‡™v‡™o‡™h‡™a‡™Z‡™S‡™L‡™E‡™>‡™7‡™0‡™)‡™"‡™‡™‡™ ‡™‡™ÿ†™ø†™ñ†™ꆙ㆙܆™Õ†™Ά™dž™À†™¹†™²†™«†™¤†™†™–†™†™ˆ†™†™z†™s†™l†™e†™^†™W†™P†™I†™B†™;†™4†™-†™&†™†™†™†™ †™†™ü…™õ…™î…™ç…™à…™Ù…™Ò…™Ë…™Ä…™½…™¶…™¯…™¨…™¡…™š…™“…™Œ…™……™~…™w…™p…™i…™b…™[…™T…™M…™F…™?…™8…™1…™*…™#…™…™…™…™…™…™ù„™ò„™ë„™ä„™Ý„™Ö„™Ï„™È„™Á„™º„™³„™¬„™¥„™ž„™—„™„™‰„™‚„™{„™t„™m„™f„™_„™X„™Q„™J„™C„™<„™5„™.„™'„™ „™„™„™ „™„™ýƒ™öƒ™胙კÚƒ™Óƒ™̃™Ń™¾ƒ™·ƒ™°ƒ™©ƒ™¢ƒ™›ƒ™”ƒ™ƒ™†ƒ™ƒ™xƒ™qƒ™jƒ™cƒ™\ƒ™Uƒ™Nƒ™Gƒ™@ƒ™9ƒ™2ƒ™+ƒ™$ƒ™ƒ™ƒ™ƒ™ƒ™ƒ™ú‚™ó‚™ì‚™å‚™Þ‚™ׂ™Ђ™É‚™‚™»‚™´‚™­‚™¦‚™Ÿ‚™˜‚™‘‚™Š‚™ƒ‚™|‚™u‚™n‚™g‚™`‚™Y‚™R‚™K‚™D‚™=‚™6‚™/‚™(‚™!‚™‚™‚™ ‚™‚™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û€™ô€™퀙怙߀™Ø€™Ñ€™Ê€™À™¼€™µ€™®€™§€™ €™™€™’€™‹€™„€™}€™v€™o€™h€™a€™Z€™S€™L€™E€™>€™7€™0€™)€™"€™€™€™ €™€™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü~™õ~™î~™ç~™à~™Ù~™Ò~™Ë~™Ä~™½~™¶~™¯~™¨~™¡~™š~™“~™Œ~™…~™~~™w~™p~™i~™b~™[~™T~™M~™F~™?~™8~™1~™*~™#~™~™~™~™~™~™ù}™ò}™ë}™ä}™Ý}™Ö}™Ï}™È}™Á}™º}™³}™¬}™¥}™ž}™—}™}™‰}™‚}™{}™t}™m}™f}™_}™X}™Q}™J}™C}™<}™5}™.}™'}™ }™}™}™ }™}™ý|™ö|™ï|™è|™á|™Ú|™Ó|™Ì|™Å|™¾|™·|™°|™©|™¢|™›|™”|™|™†|™|™x|™q|™j|™c|™\|™U|™N|™G|™@|™9|™2|™+|™$|™|™|™|™|™|™ú{™ó{™ì{™å{™Þ{™×{™Ð{™É{™Â{™»{™´{™­{™¦{™Ÿ{™˜{™‘{™Š{™ƒ{™|{™u{™n{™g{™`{™Y{™R{™K{™D{™={™6{™/{™({™!{™{™{™ {™{™þz™÷z™ðz™éz™âz™Ûz™Ôz™Íz™Æz™¿z™¸z™±z™ªz™£z™œz™•z™Žz™‡z™€z™yz™rz™kz™dz™]z™Vz™Oz™Hz™Az™:z™3z™,z™%z™z™z™z™ z™z™ûy™ôy™íy™æy™ßy™Øy™Ñy™Êy™Ãy™¼y™µy™®y™§y™ y™™y™’y™‹y™„y™}y™vy™oy™hy™ay™Zy™Sy™Ly™Ey™>y™7y™0y™)y™"y™y™y™ y™y™ÿx™øx™ñx™êx™ãx™Üx™Õx™Îx™Çx™Àx™¹x™²x™«x™¤x™x™–x™x™ˆx™x™zx™sx™lx™ex™^x™Wx™Px™Ix™Bx™;x™4x™-x™&x™x™x™x™ x™x™üw™õw™îw™çw™àw™Ùw™Òw™Ëw™Äw™½w™¶w™¯w™¨w™¡w™šw™“w™Œw™…w™~w™ww™pw™iw™bw™[w™Tw™Mw™Fw™?w™8w™1w™*w™#w™w™w™w™w™w™ùv™òv™ëv™äv™Ýv™Öv™Ïv™Èv™Áv™ºv™³v™¬v™¥v™žv™—v™v™‰v™‚v™{v™tv™mv™fv™_v™Xv™Qv™Jv™Cv™r™7r™0r™)r™"r™r™r™ r™r™ÿq™øq™ñq™êq™ãq™Üq™Õq™Îq™Çq™Àq™¹q™²q™«q™¤q™q™–q™q™ˆq™q™zq™sq™lq™eq™^q™Wq™Pq™Iq™Bq™;q™4q™-q™&q™q™q™q™ q™q™üp™õp™îp™çp™àp™Ùp™Òp™Ëp™Äp™½p™¶p™¯p™¨p™¡p™šp™“p™Œp™…p™~p™wp™pp™ip™bp™[p™Tp™Mp™Fp™?p™8p™1p™*p™#p™p™p™p™p™p™ùo™òo™ëo™äo™Ýo™Öo™Ïo™Èo™Áo™ºo™³o™¬o™¥o™žo™—o™o™‰o™‚o™{o™to™mo™fo™_o™Xo™Qo™Jo™Co™k™7k™0k™)k™"k™k™k™ k™k™ÿj™øj™ñj™êj™ãj™Üj™Õj™Îj™Çj™Àj™¹j™²j™«j™¤j™j™–j™j™ˆj™j™zj™sj™lj™ej™^j™Wj™Pj™Ij™Bj™;j™4j™-j™&j™j™j™j™ j™j™üi™õi™îi™çi™ài™Ùi™Òi™Ëi™Äi™½i™¶i™¯i™¨i™¡i™ši™“i™Œi™…i™~i™wi™pi™ii™bi™[i™Ti™Mi™Fi™?i™8i™1i™*i™#i™i™i™i™i™i™ùh™òh™ëh™äh™Ýh™Öh™Ïh™Èh™Áh™ºh™³h™¬h™¥h™žh™—h™h™‰h™‚h™{h™th™mh™fh™_h™Xh™Qh™Jh™Ch™d™7d™0d™)d™"d™d™d™ d™d™ÿc™øc™ñc™êc™ãc™Üc™Õc™Îc™Çc™Àc™¹c™²c™«c™¤c™c™–c™c™ˆc™c™zc™sc™lc™ec™^c™Wc™Pc™Ic™Bc™;c™4c™-c™&c™c™c™c™ c™c™üb™õb™îb™çb™àb™Ùb™Òb™Ëb™Äb™½b™¶b™¯b™¨b™¡b™šb™“b™Œb™…b™~b™wb™pb™ib™bb™[b™Tb™Mb™Fb™?b™8b™1b™*b™#b™b™b™b™b™b™ùa™òa™ëa™äa™Ýa™Öa™Ïa™Èa™Áa™ºa™³a™¬a™¥a™ža™—a™a™‰a™‚a™{a™ta™ma™fa™_a™Xa™Qa™Ja™Ca™]™7]™0]™)]™"]™]™]™ ]™]™ÿ\™ø\™ñ\™ê\™ã\™Ü\™Õ\™Î\™Ç\™À\™¹\™²\™«\™¤\™\™–\™\™ˆ\™\™z\™s\™l\™e\™^\™W\™P\™I\™B\™;\™4\™-\™&\™\™\™\™ \™\™ü[™õ[™î[™ç[™à[™Ù[™Ò[™Ë[™Ä[™½[™¶[™¯[™¨[™¡[™š[™“[™Œ[™…[™~[™w[™p[™i[™b[™[[™T[™M[™F[™?[™8[™1[™*[™#[™[™[™[™[™[™ùZ™òZ™ëZ™äZ™ÝZ™ÖZ™ÏZ™ÈZ™ÁZ™ºZ™³Z™¬Z™¥Z™žZ™—Z™Z™‰Z™‚Z™{Z™tZ™mZ™fZ™_Z™XZ™QZ™JZ™CZ™V™7V™0V™)V™"V™V™V™ V™V™ÿU™øU™ñU™êU™ãU™ÜU™ÕU™ÎU™ÇU™ÀU™¹U™²U™«U™¤U™U™–U™U™ˆU™U™zU™sU™lU™eU™^U™WU™PU™IU™BU™;U™4U™-U™&U™U™U™U™ U™U™üT™õT™îT™çT™àT™ÙT™ÒT™ËT™ÄT™½T™¶T™¯T™¨T™¡T™šT™“T™ŒT™…T™~T™wT™pT™iT™bT™[T™TT™MT™FT™?T™8T™1T™*T™#T™T™T™T™T™T™ùS™òS™ëS™äS™ÝS™ÖS™ÏS™ÈS™ÁS™ºS™³S™¬S™¥S™žS™—S™S™‰S™‚S™{S™tS™mS™fS™_S™XS™QS™JS™CS™O™7O™0O™)O™"O™O™O™ O™O™ÿN™øN™ñN™êN™ãN™ÜN™ÕN™ÎN™ÇN™ÀN™¹N™²N™«N™¤N™N™–N™N™ˆN™N™zN™sN™lN™eN™^N™WN™PN™IN™BN™;N™4N™-N™&N™N™N™N™ N™N™üM™õM™îM™çM™àM™ÙM™ÒM™ËM™ÄM™½M™¶M™¯M™¨M™¡M™šM™“M™ŒM™…M™~M™wM™pM™iM™bM™[M™TM™MM™FM™?M™8M™1M™*M™#M™M™M™M™M™M™ùL™òL™ëL™äL™ÝL™ÖL™ÏL™ÈL™ÁL™ºL™³L™¬L™¥L™žL™—L™L™‰L™‚L™{L™tL™mL™fL™_L™XL™QL™JL™CL™H™7H™0H™)H™"H™H™H™ H™H™ÿG™øG™ñG™êG™ãG™ÜG™ÕG™ÎG™ÇG™ÀG™¹G™²G™«G™¤G™G™–G™G™ˆG™G™zG™sG™lG™eG™^G™WG™PG™IG™BG™;G™4G™-G™&G™G™G™G™ G™G™üF™õF™îF™çF™àF™ÙF™ÒF™ËF™ÄF™½F™¶F™¯F™¨F™¡F™šF™“F™ŒF™…F™~F™wF™pF™iF™bF™[F™TF™MF™FF™?F™8F™1F™*F™#F™F™F™F™F™F™ùE™òE™ëE™äE™ÝE™ÖE™ÏE™ÈE™ÁE™ºE™³E™¬E™¥E™žE™—E™E™‰E™‚E™{E™tE™mE™fE™_E™XE™QE™JE™CE™A™7A™0A™)A™"A™A™A™ A™A™ÿ@™ø@™ñ@™ê@™ã@™Ü@™Õ@™Î@™Ç@™À@™¹@™²@™«@™¤@™@™–@™@™ˆ@™@™z@™s@™l@™e@™^@™W@™P@™I@™B@™;@™4@™-@™&@™@™@™@™ @™@™ü?™õ?™î?™ç?™à?™Ù?™Ò?™Ë?™Ä?™½?™¶?™¯?™¨?™¡?™š?™“?™Œ?™…?™~?™w?™p?™i?™b?™[?™T?™M?™F?™??™8?™1?™*?™#?™?™?™?™?™?™ù>™ò>™ë>™ä>™Ý>™Ö>™Ï>™È>™Á>™º>™³>™¬>™¥>™ž>™—>™>™‰>™‚>™{>™t>™m>™f>™_>™X>™Q>™J>™C>™<>™5>™.>™'>™ >™>™>™ >™>™ý=™ö=™ï=™è=™á=™Ú=™Ó=™Ì=™Å=™¾=™·=™°=™©=™¢=™›=™”=™=™†=™=™x=™q=™j=™c=™\=™U=™N=™G=™@=™9=™2=™+=™$=™=™=™=™=™=™ú<™ó<™ì<™å<™Þ<™×<™Ð<™É<™Â<™»<™´<™­<™¦<™Ÿ<™˜<™‘<™Š<™ƒ<™|<™u<™n<™g<™`<™Y<™R<™K<™D<™=<™6<™/<™(<™!<™<™<™ <™<™þ;™÷;™ð;™é;™â;™Û;™Ô;™Í;™Æ;™¿;™¸;™±;™ª;™£;™œ;™•;™Ž;™‡;™€;™y;™r;™k;™d;™];™V;™O;™H;™A;™:;™3;™,;™%;™;™;™;™ ;™;™û:™ô:™í:™æ:™ß:™Ø:™Ñ:™Ê:™Ã:™¼:™µ:™®:™§:™ :™™:™’:™‹:™„:™}:™v:™o:™h:™a:™Z:™S:™L:™E:™>:™7:™0:™):™":™:™:™ :™:™ÿ9™ø9™ñ9™ê9™ã9™Ü9™Õ9™Î9™Ç9™À9™¹9™²9™«9™¤9™9™–9™9™ˆ9™9™z9™s9™l9™e9™^9™W9™P9™I9™B9™;9™49™-9™&9™9™9™9™ 9™9™ü8™õ8™î8™ç8™à8™Ù8™Ò8™Ë8™Ä8™½8™¶8™¯8™¨8™¡8™š8™“8™Œ8™…8™~8™w8™p8™i8™b8™[8™T8™M8™F8™?8™88™18™*8™#8™8™8™8™8™8™ù7™ò7™ë7™ä7™Ý7™Ö7™Ï7™È7™Á7™º7™³7™¬7™¥7™ž7™—7™7™‰7™‚7™{7™t7™m7™f7™_7™X7™Q7™J7™C7™<7™57™.7™'7™ 7™7™7™ 7™7™ý6™ö6™ï6™è6™á6™Ú6™Ó6™Ì6™Å6™¾6™·6™°6™©6™¢6™›6™”6™6™†6™6™x6™q6™j6™c6™\6™U6™N6™G6™@6™96™26™+6™$6™6™6™6™6™6™ú5™ó5™ì5™å5™Þ5™×5™Ð5™É5™Â5™»5™´5™­5™¦5™Ÿ5™˜5™‘5™Š5™ƒ5™|5™u5™n5™g5™`5™Y5™R5™K5™D5™=5™65™/5™(5™!5™5™5™ 5™5™þ4™÷4™ð4™é4™â4™Û4™Ô4™Í4™Æ4™¿4™¸4™±4™ª4™£4™œ4™•4™Ž4™‡4™€4™y4™r4™k4™d4™]4™V4™O4™H4™A4™:4™34™,4™%4™4™4™4™ 4™4™û3™ô3™í3™æ3™ß3™Ø3™Ñ3™Ê3™Ã3™¼3™µ3™®3™§3™ 3™™3™’3™‹3™„3™}3™v3™o3™h3™a3™Z3™S3™L3™E3™>3™73™03™)3™"3™3™3™ 3™3™ÿ2™ø2™ñ2™ê2™ã2™Ü2™Õ2™Î2™Ç2™À2™¹2™²2™«2™¤2™2™–2™2™ˆ2™2™z2™s2™l2™e2™^2™W2™P2™I2™B2™;2™42™-2™&2™2™2™2™ 2™2™ü1™õ1™î1™ç1™à1™Ù1™Ò1™Ë1™Ä1™½1™¶1™¯1™¨1™¡1™š1™“1™Œ1™…1™~1™w1™p1™i1™b1™[1™T1™M1™F1™?1™81™11™*1™#1™1™1™1™1™1™ù0™ò0™ë0™ä0™Ý0™Ö0™Ï0™È0™Á0™º0™³0™¬0™¥0™ž0™—0™0™‰0™‚0™{0™t0™m0™f0™_0™X0™Q0™J0™C0™<0™50™.0™'0™ 0™0™0™ 0™0™ý/™ö/™ï/™è/™á/™Ú/™Ó/™Ì/™Å/™¾/™·/™°/™©/™¢/™›/™”/™/™†/™/™x/™q/™j/™c/™\/™U/™N/™G/™@/™9/™2/™+/™$/™/™/™/™/™/™ú.™ó.™ì.™å.™Þ.™×.™Ð.™É.™Â.™».™´.™­.™¦.™Ÿ.™˜.™‘.™Š.™ƒ.™|.™u.™n.™g.™`.™Y.™R.™K.™D.™=.™6.™/.™(.™!.™.™.™ .™.™þ-™÷-™ð-™é-™â-™Û-™Ô-™Í-™Æ-™¿-™¸-™±-™ª-™£-™œ-™•-™Ž-™‡-™€-™y-™r-™k-™d-™]-™V-™O-™H-™A-™:-™3-™,-™%-™-™-™-™ -™-™û,™ô,™í,™æ,™ß,™Ø,™Ñ,™Ê,™Ã,™¼,™µ,™®,™§,™ ,™™,™’,™‹,™„,™},™v,™o,™h,™a,™Z,™S,™L,™E,™>,™7,™0,™),™",™,™,™ ,™,™ÿ+™ø+™ñ+™ê+™ã+™Ü+™Õ+™Î+™Ç+™À+™¹+™²+™«+™¤+™+™–+™+™ˆ+™+™z+™s+™l+™e+™^+™W+™P+™I+™B+™;+™4+™-+™&+™+™+™+™ +™+™ü*™õ*™î*™ç*™à*™Ù*™Ò*™Ë*™Ä*™½*™¶*™¯*™¨*™¡*™š*™“*™Œ*™…*™~*™w*™p*™i*™b*™[*™T*™M*™F*™?*™8*™1*™**™#*™*™*™*™*™*™ù)™ò)™ë)™ä)™Ý)™Ö)™Ï)™È)™Á)™º)™³)™¬)™¥)™ž)™—)™)™‰)™‚)™{)™t)™m)™f)™_)™X)™Q)™J)™C)™<)™5)™.)™')™ )™)™)™ )™)™ý(™ö(™ï(™è(™á(™Ú(™Ó(™Ì(™Å(™¾(™·(™°(™©(™¢(™›(™”(™(™†(™(™x(™q(™j(™c(™\(™U(™N(™G(™@(™9(™2(™+(™$(™(™(™(™(™(™ú'™ó'™ì'™å'™Þ'™×'™Ð'™É'™Â'™»'™´'™­'™¦'™Ÿ'™˜'™‘'™Š'™ƒ'™|'™u'™n'™g'™`'™Y'™R'™K'™D'™='™6'™/'™('™!'™'™'™ '™'™þ&™÷&™ð&™é&™â&™Û&™Ô&™Í&™Æ&™¿&™¸&™±&™ª&™£&™œ&™•&™Ž&™‡&™€&™y&™r&™k&™d&™]&™V&™O&™H&™A&™:&™3&™,&™%&™&™&™&™ &™&™û%™ô%™í%™æ%™ß%™Ø%™Ñ%™Ê%™Ã%™¼%™µ%™®%™§%™ %™™%™’%™‹%™„%™}%™v%™o%™h%™a%™Z%™S%™L%™E%™>%™7%™0%™)%™"%™%™%™ %™%™ÿ$™ø$™ñ$™ê$™ã$™Ü$™Õ$™Î$™Ç$™À$™¹$™²$™«$™¤$™$™–$™$™ˆ$™$™z$™s$™l$™e$™^$™W$™P$™I$™B$™;$™4$™-$™&$™$™$™$™ $™$™ü#™õ#™î#™ç#™à#™Ù#™Ò#™Ë#™Ä#™½#™¶#™¯#™¨#™¡#™š#™“#™Œ#™…#™~#™w#™p#™i#™b#™[#™T#™M#™F#™?#™8#™1#™*#™##™#™#™#™#™#™ù"™ò"™ë"™ä"™Ý"™Ö"™Ï"™È"™Á"™º"™³"™¬"™¥"™ž"™—"™"™‰"™‚"™{"™t"™m"™f"™_"™X"™Q"™J"™C"™<"™5"™."™'"™ "™"™"™ "™"™ý!™ö!™ï!™è!™á!™Ú!™Ó!™Ì!™Å!™¾!™·!™°!™©!™¢!™›!™”!™!™†!™!™x!™q!™j!™c!™\!™U!™N!™G!™@!™9!™2!™+!™$!™!™!™!™!™!™ú ™ó ™ì ™å ™Þ ™× ™Ð ™É ™ ™» ™´ ™­ ™¦ ™Ÿ ™˜ ™‘ ™Š ™ƒ ™| ™u ™n ™g ™` ™Y ™R ™K ™D ™= ™6 ™/ ™( ™! ™ ™ ™ ™ ™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û™ô™í™æ™ß™Ø™Ñ™Ê™Ã™¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú™ó™ì™å™Þ™×™Ð™É™Â™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û™ô™í™æ™ß™Ø™Ñ™Ê™Ã™¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú™ó™ì™å™Þ™×™Ð™É™Â™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û™ô™í™æ™ß™Ø™Ñ™Ê™Ã™¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù ™ò ™ë ™ä ™Ý ™Ö ™Ï ™È ™Á ™º ™³ ™¬ ™¥ ™ž ™— ™ ™‰ ™‚ ™{ ™t ™m ™f ™_ ™X ™Q ™J ™C ™< ™5 ™. ™' ™ ™ ™ ™ ™ ™ý ™ö ™ï ™è ™á ™Ú ™Ó ™Ì ™Å ™¾ ™· ™° ™© ™¢ ™› ™” ™ ™† ™ ™x ™q ™j ™c ™\ ™U ™N ™G ™@ ™9 ™2 ™+ ™$ ™ ™ ™ ™ ™ ™ú ™ó ™ì ™å ™Þ ™× ™Ð ™É ™ ™» ™´ ™­ ™¦ ™Ÿ ™˜ ™‘ ™Š ™ƒ ™| ™u ™n ™g ™` ™Y ™R ™K ™D ™= ™6 ™/ ™( ™! ™ ™ ™ ™ ™þ ™÷ ™ð ™é ™â ™Û ™Ô ™Í ™Æ ™¿ ™¸ ™± ™ª ™£ ™œ ™• ™Ž ™‡ ™€ ™y ™r ™k ™d ™] ™V ™O ™H ™A ™: ™3 ™, ™% ™ ™ ™ ™ ™ ™û ™ô ™í ™æ ™ß ™Ø ™Ñ ™Ê ™à ™¼ ™µ ™® ™§ ™  ™™ ™’ ™‹ ™„ ™} ™v ™o ™h ™a ™Z ™S ™L ™E ™> ™7 ™0 ™) ™" ™ ™ ™ ™ ™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú™ó™ì™å™Þ™×™Ð™É™Â™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û™ô™í™æ™ß™Ø™Ñ™Ê™Ã™¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ™ø™ñ™ê™ã™Ü™Õ™Î™Ç™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ùÿ˜òÿ˜ëÿ˜äÿ˜Ýÿ˜Öÿ˜Ïÿ˜Èÿ˜Áÿ˜ºÿ˜³ÿ˜¬ÿ˜¥ÿ˜žÿ˜—ÿ˜ÿ˜‰ÿ˜‚ÿ˜{ÿ˜tÿ˜mÿ˜fÿ˜_ÿ˜Xÿ˜Qÿ˜Jÿ˜Cÿ˜<ÿ˜5ÿ˜.ÿ˜'ÿ˜ ÿ˜ÿ˜ÿ˜ ÿ˜ÿ˜ýþ˜öþ˜ïþ˜èþ˜áþ˜Úþ˜Óþ˜Ìþ˜Åþ˜¾þ˜·þ˜°þ˜©þ˜¢þ˜›þ˜”þ˜þ˜†þ˜þ˜xþ˜qþ˜jþ˜cþ˜\þ˜Uþ˜Nþ˜Gþ˜@þ˜9þ˜2þ˜+þ˜$þ˜þ˜þ˜þ˜þ˜þ˜úý˜óý˜ìý˜åý˜Þý˜×ý˜Ðý˜Éý˜Âý˜»ý˜´ý˜­ý˜¦ý˜Ÿý˜˜ý˜‘ý˜Šý˜ƒý˜|ý˜uý˜ný˜gý˜`ý˜Yý˜Rý˜Ký˜Dý˜=ý˜6ý˜/ý˜(ý˜!ý˜ý˜ý˜ ý˜ý˜þü˜÷ü˜ðü˜éü˜âü˜Ûü˜Ôü˜Íü˜Æü˜¿ü˜¸ü˜±ü˜ªü˜£ü˜œü˜•ü˜Žü˜‡ü˜€ü˜yü˜rü˜kü˜dü˜]ü˜Vü˜Oü˜Hü˜Aü˜:ü˜3ü˜,ü˜%ü˜ü˜ü˜ü˜ ü˜ü˜ûû˜ôû˜íû˜æû˜ßû˜Øû˜Ñû˜Êû˜Ãû˜¼û˜µû˜®û˜§û˜ û˜™û˜’û˜‹û˜„û˜}û˜vû˜oû˜hû˜aû˜Zû˜Sû˜Lû˜Eû˜>û˜7û˜0û˜)û˜"û˜û˜û˜ û˜û˜ÿú˜øú˜ñú˜êú˜ãú˜Üú˜Õú˜Îú˜Çú˜Àú˜¹ú˜²ú˜«ú˜¤ú˜ú˜–ú˜ú˜ˆú˜ú˜zú˜sú˜lú˜eú˜^ú˜Wú˜Pú˜Iú˜Bú˜;ú˜4ú˜-ú˜&ú˜ú˜ú˜ú˜ ú˜ú˜üù˜õù˜îù˜çù˜àù˜Ùù˜Òù˜Ëù˜Äù˜½ù˜¶ù˜¯ù˜¨ù˜¡ù˜šù˜“ù˜Œù˜…ù˜~ù˜wù˜pù˜iù˜bù˜[ù˜Tù˜Mù˜Fù˜?ù˜8ù˜1ù˜*ù˜#ù˜ù˜ù˜ù˜ù˜ù˜ùø˜òø˜ëø˜äø˜Ýø˜Öø˜Ïø˜Èø˜Áø˜ºø˜³ø˜¬ø˜¥ø˜žø˜—ø˜ø˜‰ø˜‚ø˜{ø˜tø˜mø˜fø˜_ø˜Xø˜Qø˜Jø˜Cø˜<ø˜5ø˜.ø˜'ø˜ ø˜ø˜ø˜ ø˜ø˜ý÷˜ö÷˜ï÷˜è÷˜á÷˜Ú÷˜Ó÷˜Ì÷˜Å÷˜¾÷˜·÷˜°÷˜©÷˜¢÷˜›÷˜”÷˜÷˜†÷˜÷˜x÷˜q÷˜j÷˜c÷˜\÷˜U÷˜N÷˜G÷˜@÷˜9÷˜2÷˜+÷˜$÷˜÷˜÷˜÷˜÷˜÷˜úö˜óö˜ìö˜åö˜Þö˜×ö˜Ðö˜Éö˜Âö˜»ö˜´ö˜­ö˜¦ö˜Ÿö˜˜ö˜‘ö˜Šö˜ƒö˜|ö˜uö˜nö˜gö˜`ö˜Yö˜Rö˜Kö˜Dö˜=ö˜6ö˜/ö˜(ö˜!ö˜ö˜ö˜ ö˜ö˜þõ˜÷õ˜ðõ˜éõ˜âõ˜Ûõ˜Ôõ˜Íõ˜Æõ˜¿õ˜¸õ˜±õ˜ªõ˜£õ˜œõ˜•õ˜Žõ˜‡õ˜€õ˜yõ˜rõ˜kõ˜dõ˜]õ˜Võ˜Oõ˜Hõ˜Aõ˜:õ˜3õ˜,õ˜%õ˜õ˜õ˜õ˜ õ˜õ˜ûô˜ôô˜íô˜æô˜ßô˜Øô˜Ñô˜Êô˜Ãô˜¼ô˜µô˜®ô˜§ô˜ ô˜™ô˜’ô˜‹ô˜„ô˜}ô˜vô˜oô˜hô˜aô˜Zô˜Sô˜Lô˜Eô˜>ô˜7ô˜0ô˜)ô˜"ô˜ô˜ô˜ ô˜ô˜ÿó˜øó˜ñó˜êó˜ãó˜Üó˜Õó˜Îó˜Çó˜Àó˜¹ó˜²ó˜«ó˜¤ó˜ó˜–ó˜ó˜ˆó˜ó˜zó˜só˜ló˜eó˜^ó˜Wó˜Pó˜Ió˜Bó˜;ó˜4ó˜-ó˜&ó˜ó˜ó˜ó˜ ó˜ó˜üò˜õò˜îò˜çò˜àò˜Ùò˜Òò˜Ëò˜Äò˜½ò˜¶ò˜¯ò˜¨ò˜¡ò˜šò˜“ò˜Œò˜…ò˜~ò˜wò˜pò˜iò˜bò˜[ò˜Tò˜Mò˜Fò˜?ò˜8ò˜1ò˜*ò˜#ò˜ò˜ò˜ò˜ò˜ò˜ùñ˜òñ˜ëñ˜äñ˜Ýñ˜Öñ˜Ïñ˜Èñ˜Áñ˜ºñ˜³ñ˜¬ñ˜¥ñ˜žñ˜—ñ˜ñ˜‰ñ˜‚ñ˜{ñ˜tñ˜mñ˜fñ˜_ñ˜Xñ˜Qñ˜Jñ˜Cñ˜<ñ˜5ñ˜.ñ˜'ñ˜ ñ˜ñ˜ñ˜ ñ˜ñ˜ýð˜öð˜ïð˜èð˜áð˜Úð˜Óð˜Ìð˜Åð˜¾ð˜·ð˜°ð˜©ð˜¢ð˜›ð˜”ð˜ð˜†ð˜ð˜xð˜qð˜jð˜cð˜\ð˜Uð˜Nð˜Gð˜@ð˜9ð˜2ð˜+ð˜$ð˜ð˜ð˜ð˜ð˜ð˜úï˜óï˜ìï˜åï˜Þï˜×ï˜Ðï˜Éï˜Âï˜|ï˜uï˜nï˜gï˜`ï˜Yï˜Rï˜Kï˜Dï˜=ï˜6ï˜/ï˜(ï˜!ï˜ï˜ï˜ ï˜ï˜þî˜÷î˜ðî˜éî˜âî˜Ûî˜Ôî˜Íî˜Æî˜¿î˜¸î˜±î˜ªî˜£î˜œî˜•î˜Žî˜‡î˜€î˜yî˜rî˜kî˜dî˜]î˜Vî˜Oî˜Hî˜Aî˜:î˜3î˜,î˜%î˜î˜î˜î˜ î˜î˜ûí˜ôí˜íí˜æí˜ßí˜Øí˜Ñí˜Êí˜Ã혼혵혮혧혠혙혒혋현í˜}í˜ví˜oí˜hí˜aí˜Zí˜Sí˜Lí˜Eí˜>í˜7í˜0í˜)í˜"í˜í˜í˜ í˜í˜ÿì˜øì˜ñì˜êì˜ãì˜Üì˜Õì˜Îì˜Çì˜À옹옲옫오ì˜ì˜–ì˜ì˜ˆì˜ì˜zì˜sì˜lì˜eì˜^ì˜Wì˜Pì˜Iì˜Bì˜;ì˜4ì˜-ì˜&ì˜ì˜ì˜ì˜ ì˜ì˜üë˜õë˜îë˜çë˜àë˜Ùë˜Òë˜Ëë˜Ä똽똶똯똨똡똚똓똌똅ë˜~ë˜wë˜pë˜ië˜bë˜[ë˜Të˜Më˜Fë˜?ë˜8ë˜1ë˜*ë˜#ë˜ë˜ë˜ë˜ë˜ë˜ùê˜òê˜ëê˜äê˜Ýê˜Öê˜Ïê˜Èê˜Á꘺꘳꘬꘥ꘞꘗê˜ê˜‰ê˜‚ê˜{ê˜tê˜mê˜fê˜_ê˜Xê˜Qê˜Jê˜Cê˜<ê˜5ê˜.ê˜'ê˜ ê˜ê˜ê˜ ê˜ê˜ýé˜öé˜ïé˜èé˜áé˜Úé˜Óé˜Ìé˜Å阾阷阰阩阢阛阔é˜é˜†é˜é˜xé˜qé˜jé˜cé˜\é˜Ué˜Né˜Gé˜@é˜9é˜2é˜+é˜$é˜é˜é˜é˜é˜é˜úè˜óè˜ìè˜åè˜Þè˜×è˜Ðè˜Éè˜Â蘻蘴蘭蘦蘟蘘蘑蘊蘃è˜|è˜uè˜nè˜gè˜`è˜Yè˜Rè˜Kè˜Dè˜=è˜6è˜/è˜(è˜!è˜è˜è˜ è˜è˜þç˜÷ç˜ðç˜éç˜âç˜Ûç˜Ôç˜Íç˜Æç˜¿ç˜¸ç˜±ç˜ªç˜£ç˜œç˜•ç˜Žç˜‡ç˜€ç˜yç˜rç˜kç˜dç˜]ç˜Vç˜Oç˜Hç˜Aç˜:ç˜3ç˜,ç˜%ç˜ç˜ç˜ç˜ ç˜ç˜ûæ˜ôæ˜íæ˜ææ˜ßæ˜Øæ˜Ñæ˜Êæ˜Ã昼昵昮昧映昙昒昋昄æ˜}æ˜væ˜oæ˜hæ˜aæ˜Zæ˜Sæ˜Læ˜Eæ˜>æ˜7æ˜0æ˜)æ˜"æ˜æ˜æ˜ æ˜æ˜ÿå˜øå˜ñå˜êå˜ãå˜Üå˜Õå˜Îå˜Çå˜À嘹嘲嘫嘤å˜å˜–å˜å˜ˆå˜å˜zå˜så˜lå˜eå˜^å˜Wå˜På˜Iå˜Bå˜;å˜4å˜-å˜&å˜å˜å˜å˜ å˜å˜üä˜õä˜îä˜çä˜àä˜Ùä˜Òä˜Ëä˜Ä䘽䘶䘯䘨䘡䘚䘓䘌䘅ä˜~ä˜wä˜pä˜iä˜bä˜[ä˜Tä˜Mä˜Fä˜?ä˜8ä˜1ä˜*ä˜#ä˜ä˜ä˜ä˜ä˜ä˜ùã˜òã˜ëã˜äã˜Ýã˜Öã˜Ïã˜Èã˜Á㘺㘳㘬㘥㘞㘗ã˜ã˜‰ã˜‚ã˜{ã˜tã˜mã˜fã˜_ã˜Xã˜Qã˜Jã˜Cã˜<ã˜5ã˜.ã˜'㘠ã˜ã˜ã˜ ã˜ã˜ýâ˜öâ˜ïâ˜èâ˜áâ˜Úâ˜Óâ˜Ìâ˜Å☾☷☰☩☢☛☔â˜â˜†â˜â˜xâ˜qâ˜jâ˜câ˜\â˜Uâ˜Nâ˜Gâ˜@â˜9â˜2â˜+â˜$â˜â˜â˜â˜â˜â˜úá˜óá˜ìá˜åá˜Þá˜×á˜Ðá˜Éá˜Âᘻᘴᘭᘦᘟᘘᘑᘊᘃá˜|á˜uá˜ná˜gá˜`á˜Yá˜Rá˜Ká˜Dá˜=á˜6á˜/á˜(á˜!á˜á˜á˜ á˜á˜þà˜÷à˜ðà˜éà˜âà˜Ûà˜Ôà˜Íà˜Æà˜¿à˜¸à˜±à˜ªà˜£à˜œà˜•à˜Žà˜‡à˜€à˜yà˜rà˜kà˜dà˜]à˜Và˜Oà˜Hà˜Aà˜:à˜3à˜,à˜%à˜à˜à˜à˜ à˜à˜ûߘôߘíߘæß˜ßߘØß˜ÑߘÊߘÃߘ¼ß˜µß˜®ß˜§ß˜ ß˜™ß˜’ߘ‹ß˜„ߘ}ߘvߘoߘhߘaߘZߘSߘLߘEߘ>ߘ7ߘ0ߘ)ߘ"ߘߘߘ ߘߘÿÞ˜øÞ˜ñÞ˜êÞ˜ãÞ˜ÜÞ˜ÕÞ˜ÎÞ˜ÇÞ˜ÀÞ˜¹Þ˜²Þ˜«Þ˜¤Þ˜Þ˜–Þ˜Þ˜ˆÞ˜Þ˜zÞ˜sÞ˜lÞ˜eÞ˜^Þ˜WÞ˜PÞ˜IÞ˜BÞ˜;Þ˜4Þ˜-Þ˜&Þ˜Þ˜Þ˜Þ˜ Þ˜Þ˜üݘõݘîݘçݘàݘÙݘÒݘËݘÄݘ½Ý˜¶Ý˜¯Ý˜¨Ý˜¡Ý˜šÝ˜“ݘŒÝ˜…ݘ~ݘwݘpݘiݘbݘ[ݘTݘMݘFݘ?ݘ8ݘ1ݘ*ݘ#ݘݘݘݘݘݘùܘòܘëܘäܘÝܘÖܘÏܘÈܘÁܘºÜ˜³Ü˜¬Ü˜¥Ü˜žÜ˜—ܘܘ‰Ü˜‚ܘ{ܘtܘmܘfܘ_ܘXܘQܘJܘCܘ<ܘ5ܘ.ܘ'ܘ ܘܘܘ ܘܘýÛ˜öÛ˜ïÛ˜èÛ˜áÛ˜ÚÛ˜ÓÛ˜ÌÛ˜ÅÛ˜¾Û˜·Û˜°Û˜©Û˜¢Û˜›Û˜”Û˜Û˜†Û˜Û˜xÛ˜qÛ˜jÛ˜cÛ˜\Û˜UÛ˜NÛ˜GÛ˜@Û˜9Û˜2Û˜+Û˜$Û˜Û˜Û˜Û˜Û˜Û˜úÚ˜óÚ˜ìÚ˜åÚ˜ÞÚ˜×Ú˜ÐÚ˜ÉÚ˜ÂÚ˜»Ú˜´Ú˜­Ú˜¦Ú˜ŸÚ˜˜Ú˜‘Ú˜ŠÚ˜ƒÚ˜|Ú˜uÚ˜nÚ˜gÚ˜`Ú˜YÚ˜RÚ˜KÚ˜DÚ˜=Ú˜6Ú˜/Ú˜(Ú˜!Ú˜Ú˜Ú˜ Ú˜Ú˜þÙ˜÷Ù˜ðÙ˜éÙ˜âÙ˜ÛÙ˜ÔÙ˜ÍÙ˜ÆÙ˜¿Ù˜¸Ù˜±Ù˜ªÙ˜£Ù˜œÙ˜•Ù˜ŽÙ˜‡Ù˜€Ù˜yÙ˜rÙ˜kÙ˜dÙ˜]Ù˜VÙ˜OÙ˜HÙ˜AÙ˜:Ù˜3Ù˜,Ù˜%٘٘٘٘ ٘٘ûؘôؘíØ˜æØ˜ߨ˜ØØ˜ÑØ˜ÊØ˜Ãؘ¼Ø˜µØ˜®Ø˜§Ø˜ Ø˜™Ø˜’ؘ‹Ø˜„ؘ}ؘvؘoؘhؘaؘZؘSؘLؘEؘ>ؘ7ؘ0ؘ)ؘ"ؘؘؘ ؘؘÿטø×˜ñטêטãטÜטÕטÎטÇטÀט¹×˜²×˜«×˜¤×˜ט–טטˆ×˜טzטsטlטeט^טWטPטIטBט;ט4ט-ט&טטטט טטüÖ˜õÖ˜îÖ˜çÖ˜àÖ˜ÙÖ˜ÒÖ˜ËÖ˜ÄÖ˜½Ö˜¶Ö˜¯Ö˜¨Ö˜¡Ö˜šÖ˜“Ö˜ŒÖ˜…Ö˜~Ö˜wÖ˜pÖ˜iÖ˜bÖ˜[Ö˜TÖ˜MÖ˜FÖ˜?Ö˜8Ö˜1Ö˜*Ö˜#Ö˜Ö˜Ö˜Ö˜Ö˜Ö˜ùÕ˜òÕ˜ëÕ˜äÕ˜ÝÕ˜ÖÕ˜ÏÕ˜ÈÕ˜ÁÕ˜ºÕ˜³Õ˜¬Õ˜¥Õ˜žÕ˜—Õ˜Õ˜‰Õ˜‚Õ˜{Õ˜tÕ˜mÕ˜fÕ˜_Õ˜XÕ˜QÕ˜JÕ˜CÕ˜<Õ˜5Õ˜.Õ˜'Õ˜ Õ˜Õ˜Õ˜ Õ˜Õ˜ýÔ˜öÔ˜ïÔ˜èÔ˜áÔ˜ÚÔ˜ÓÔ˜ÌÔ˜ÅÔ˜¾Ô˜·Ô˜°Ô˜©Ô˜¢Ô˜›Ô˜”Ô˜Ô˜†Ô˜Ô˜xÔ˜qÔ˜jÔ˜cÔ˜\Ô˜UÔ˜NÔ˜GÔ˜@Ô˜9Ô˜2Ô˜+Ô˜$Ô˜Ô˜Ô˜Ô˜Ô˜Ô˜úÓ˜óÓ˜ìÓ˜åÓ˜ÞÓ˜×Ó˜ÐÓ˜ÉÓ˜ÂÓ˜»Ó˜´Ó˜­Ó˜¦Ó˜ŸÓ˜˜Ó˜‘Ó˜ŠÓ˜ƒÓ˜|Ó˜uÓ˜nÓ˜gÓ˜`Ó˜YÓ˜RÓ˜KÓ˜DÓ˜=Ó˜6Ó˜/Ó˜(Ó˜!Ó˜Ó˜Ó˜ Ó˜Ó˜þÒ˜÷Ò˜ðÒ˜éÒ˜âÒ˜ÛÒ˜ÔÒ˜ÍÒ˜ÆÒ˜¿Ò˜¸Ò˜±Ò˜ªÒ˜£Ò˜œÒ˜•Ò˜ŽÒ˜‡Ò˜€Ò˜yÒ˜rÒ˜kÒ˜dÒ˜]Ò˜VÒ˜OÒ˜HÒ˜AÒ˜:Ò˜3Ò˜,Ò˜%Ò˜Ò˜Ò˜Ò˜ Ò˜Ò˜ûјôјíјæÑ˜ßјØÑ˜ÑјÊјÃј¼Ñ˜µÑ˜®Ñ˜§Ñ˜ Ñ˜™Ñ˜’ј‹Ñ˜„ј}јvјoјhјaјZјSјLјEј>ј7ј0ј)ј"јјј јјÿИøÐ˜ñИêИãИÜИÕИÎИÇИÀИ¹Ð˜²Ð˜«Ð˜¤Ð˜И–ИИˆÐ˜ИzИsИlИeИ^ИWИPИIИBИ;И4И-И&ИИИИ ИИüϘõϘîϘçϘàϘÙϘÒϘËϘÄϘ½Ï˜¶Ï˜¯Ï˜¨Ï˜¡Ï˜šÏ˜“ϘŒÏ˜…Ϙ~ϘwϘpϘiϘbϘ[ϘTϘMϘFϘ?Ϙ8Ϙ1Ϙ*Ϙ#ϘϘϘϘϘϘùΘòΘëΘäΘÝΘÖΘÏΘÈΘÁΘºÎ˜³Î˜¬Î˜¥Î˜žÎ˜—ΘΘ‰Î˜‚Θ{ΘtΘmΘfΘ_ΘXΘQΘJΘCΘ<Θ5Θ.Θ'Θ ΘΘΘ ΘΘý͘ö͘ï͘è͘á͘Ú͘Ó͘Ì͘Å͘¾Í˜·Í˜°Í˜©Í˜¢Í˜›Í˜”͘͘†Í˜͘x͘q͘j͘c͘\͘U͘N͘G͘@͘9͘2͘+͘$͘͘͘͘͘͘ú̘ó̘ì̘å̘Þ̘×̘Ð̘É̘Â̘»Ì˜´Ì˜­Ì˜¦Ì˜ŸÌ˜˜Ì˜‘̘ŠÌ˜ƒÌ˜|̘u̘n̘g̘`̘Y̘R̘K̘D̘=̘6̘/̘(̘!̘̘̘ ̘̘þ˘÷˘ð˘é˘â˘Û˘Ô˘͢ÆË˜¿Ë˜¸Ë˜±Ë˜ªË˜£Ë˜œË˜•˘ŽË˜‡Ë˜€Ë˜y˘r˘k˘d˘]˘V˘O˘H˘A˘:˘3˘,˘%˘˘˘˘ ˘˘ûʘôʘíʘæÊ˜ßʘØÊ˜ÑʘÊʘÃʘ¼Ê˜µÊ˜®Ê˜§Ê˜ Ê˜™Ê˜’ʘ‹Ê˜„ʘ}ʘvʘoʘhʘaʘZʘSʘLʘEʘ>ʘ7ʘ0ʘ)ʘ"ʘʘʘ ʘʘÿɘøÉ˜ñɘêɘãɘÜɘÕɘÎɘÇɘÀɘ¹É˜²É˜«É˜¤É˜ɘ–ɘɘˆÉ˜ɘzɘsɘlɘeɘ^ɘWɘPɘIɘBɘ;ɘ4ɘ-ɘ&ɘɘɘɘ ɘɘüȘõȘîȘçȘàȘÙȘÒȘËȘÄȘ½È˜¶È˜¯È˜¨È˜¡È˜šÈ˜“ȘŒÈ˜…Ș~ȘwȘpȘiȘbȘ[ȘTȘMȘFȘ?Ș8Ș1Ș*Ș#ȘȘȘȘȘȘùǘòǘëǘäǘÝǘÖǘÏǘÈǘÁǘºÇ˜³Ç˜¬Ç˜¥Ç˜žÇ˜—ǘǘ‰Ç˜‚ǘ{ǘtǘmǘfǘ_ǘXǘQǘJǘCǘ<ǘ5ǘ.ǘ'ǘ ǘǘǘ ǘǘýƘöƘïÆ˜èÆ˜áÆ˜ÚÆ˜ÓÆ˜ÌÆ˜ÅƘ¾Æ˜·Æ˜°Æ˜©Æ˜¢Æ˜›Æ˜”ƘƘ†Æ˜ƘxƘqƘjƘcƘ\ƘUƘNƘGƘ@Ƙ9Ƙ2Ƙ+Ƙ$ƘƘƘƘƘƘúŘóŘìŘåŘÞŘ×ŘÐŘÉŘÂŘ»Å˜´Å˜­Å˜¦Å˜ŸÅ˜˜Å˜‘ŘŠÅ˜ƒÅ˜|ŘuŘnŘgŘ`ŘYŘRŘKŘDŘ=Ř6Ř/Ř(Ř!ŘŘŘ ŘŘþĘ÷ĘðĘéĘâĘÛĘÔĘÍĘÆÄ˜¿Ä˜¸Ä˜±Ä˜ªÄ˜£Ä˜œÄ˜•ĘŽÄ˜‡Ä˜€Ä˜yĘrĘkĘdĘ]ĘVĘOĘHĘAĘ:Ę3Ę,Ę%ĘĘĘĘ ĘĘûØôØíØæÃ˜ߨØÃ˜ÑØÊØÃؼصخاؠؙØ’؋Ø„Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿ˜øÂ˜ñ˜ê˜ã˜ܘÕ˜ΘǘÀ˜¹Â˜²Â˜«Â˜¤Â˜˜–˜˜ˆÂ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜üÁ˜õÁ˜îÁ˜çÁ˜àÁ˜ÙÁ˜ÒÁ˜ËÁ˜ÄÁ˜½Á˜¶Á˜¯Á˜¨Á˜¡Á˜šÁ˜“Á˜ŒÁ˜…Á˜~Á˜wÁ˜pÁ˜iÁ˜bÁ˜[Á˜TÁ˜MÁ˜FÁ˜?Á˜8Á˜1Á˜*Á˜#Á˜Á˜Á˜Á˜Á˜Á˜ùÀ˜òÀ˜ëÀ˜äÀ˜ÝÀ˜ÖÀ˜ÏÀ˜ÈÀ˜ÁÀ˜ºÀ˜³À˜¬À˜¥À˜žÀ˜—À˜À˜‰À˜‚À˜{À˜tÀ˜mÀ˜fÀ˜_À˜XÀ˜QÀ˜JÀ˜CÀ˜<À˜5À˜.À˜'À˜ À˜À˜À˜ À˜À˜ý¿˜ö¿˜￘还ῘÚ¿˜Ó¿˜Ì¿˜Å¿˜¾¿˜·¿˜°¿˜©¿˜¢¿˜›¿˜”¿˜¿˜†¿˜¿˜x¿˜q¿˜j¿˜c¿˜\¿˜U¿˜N¿˜G¿˜@¿˜9¿˜2¿˜+¿˜$¿˜¿˜¿˜¿˜¿˜¿˜ú¾˜ó¾˜쾘徘Þ¾˜×¾˜о˜ɾ˜¾˜»¾˜´¾˜­¾˜¦¾˜Ÿ¾˜˜¾˜‘¾˜о˜ƒ¾˜|¾˜u¾˜n¾˜g¾˜`¾˜Y¾˜R¾˜K¾˜D¾˜=¾˜6¾˜/¾˜(¾˜!¾˜¾˜¾˜ ¾˜¾˜þ½˜÷½˜ð½˜齘⽘Û½˜Ô½˜ͽ˜ƽ˜¿½˜¸½˜±½˜ª½˜£½˜œ½˜•½˜޽˜‡½˜€½˜y½˜r½˜k½˜d½˜]½˜V½˜O½˜H½˜A½˜:½˜3½˜,½˜%½˜½˜½˜½˜ ½˜½˜û¼˜ô¼˜í¼˜漘ß¼˜ؼ˜Ѽ˜ʼ˜ü˜¼¼˜µ¼˜®¼˜§¼˜ ¼˜™¼˜’¼˜‹¼˜„¼˜}¼˜v¼˜o¼˜h¼˜a¼˜Z¼˜S¼˜L¼˜E¼˜>¼˜7¼˜0¼˜)¼˜"¼˜¼˜¼˜ ¼˜¼˜ÿ»˜ø»˜ñ»˜께㻘Ü»˜Õ»˜λ˜Ç»˜À»˜¹»˜²»˜«»˜¤»˜»˜–»˜»˜ˆ»˜»˜z»˜s»˜l»˜e»˜^»˜W»˜P»˜I»˜B»˜;»˜4»˜-»˜&»˜»˜»˜»˜ »˜»˜üº˜õº˜纘ຘÙº˜Òº˜˺˜ĺ˜½º˜¶º˜¯º˜¨º˜¡º˜šº˜“º˜Œº˜…º˜~º˜wº˜pº˜iº˜bº˜[º˜Tº˜Mº˜Fº˜?º˜8º˜1º˜*º˜#º˜º˜º˜º˜º˜º˜ù¹˜ò¹˜빘乘ݹ˜Ö¹˜Ϲ˜ȹ˜Á¹˜º¹˜³¹˜¬¹˜¥¹˜ž¹˜—¹˜¹˜‰¹˜‚¹˜{¹˜t¹˜m¹˜f¹˜_¹˜X¹˜Q¹˜J¹˜C¹˜<¹˜5¹˜.¹˜'¹˜ ¹˜¹˜¹˜ ¹˜¹˜ý¸˜ö¸˜︘踘ḘÚ¸˜Ó¸˜̸˜Ÿ˜¾¸˜·¸˜°¸˜©¸˜¢¸˜›¸˜”¸˜¸˜†¸˜¸˜x¸˜q¸˜j¸˜c¸˜\¸˜U¸˜N¸˜G¸˜@¸˜9¸˜2¸˜+¸˜$¸˜¸˜¸˜¸˜¸˜¸˜ú·˜ó·˜ì·˜å·˜Þ·˜×·˜з˜É·˜·˜»·˜´·˜­·˜¦·˜Ÿ·˜˜·˜‘·˜Š·˜ƒ·˜|·˜u·˜n·˜g·˜`·˜Y·˜R·˜K·˜D·˜=·˜6·˜/·˜(·˜!·˜·˜·˜ ·˜·˜þ¶˜÷¶˜ð¶˜鶘⶘Û¶˜Ô¶˜Ͷ˜ƶ˜¿¶˜¸¶˜±¶˜ª¶˜£¶˜œ¶˜•¶˜޶˜‡¶˜€¶˜y¶˜r¶˜k¶˜d¶˜]¶˜V¶˜O¶˜H¶˜A¶˜:¶˜3¶˜,¶˜%¶˜¶˜¶˜¶˜ ¶˜¶˜ûµ˜ôµ˜íµ˜浘ßµ˜ص˜ѵ˜ʵ˜õ˜¼µ˜µµ˜®µ˜§µ˜ µ˜™µ˜’µ˜‹µ˜„µ˜}µ˜vµ˜oµ˜hµ˜aµ˜Zµ˜Sµ˜Lµ˜Eµ˜>µ˜7µ˜0µ˜)µ˜"µ˜µ˜µ˜ µ˜µ˜ÿ´˜ø´˜ñ´˜ê´˜ã´˜Ü´˜Õ´˜δ˜Ç´˜À´˜¹´˜²´˜«´˜¤´˜´˜–´˜´˜ˆ´˜´˜z´˜s´˜l´˜e´˜^´˜W´˜P´˜I´˜B´˜;´˜4´˜-´˜&´˜´˜´˜´˜ ´˜´˜ü³˜õ³˜糘೘Ù³˜Ò³˜˳˜ij˜½³˜¶³˜¯³˜¨³˜¡³˜š³˜“³˜Œ³˜…³˜~³˜w³˜p³˜i³˜b³˜[³˜T³˜M³˜F³˜?³˜8³˜1³˜*³˜#³˜³˜³˜³˜³˜³˜ù²˜ò²˜벘䲘ݲ˜Ö²˜ϲ˜Ȳ˜Á²˜º²˜³²˜¬²˜¥²˜ž²˜—²˜²˜‰²˜‚²˜{²˜t²˜m²˜f²˜_²˜X²˜Q²˜J²˜C²˜<²˜5²˜.²˜'²˜ ²˜²˜²˜ ²˜²˜ý±˜ö±˜ﱘ豘᱘Ú±˜Ó±˜̱˜ű˜¾±˜·±˜°±˜©±˜¢±˜›±˜”±˜±˜†±˜±˜x±˜q±˜j±˜c±˜\±˜U±˜N±˜G±˜@±˜9±˜2±˜+±˜$±˜±˜±˜±˜±˜±˜ú°˜ó°˜ì°˜å°˜Þ°˜×°˜а˜ɰ˜°˜»°˜´°˜­°˜¦°˜Ÿ°˜˜°˜‘°˜а˜ƒ°˜|°˜u°˜n°˜g°˜`°˜Y°˜R°˜K°˜D°˜=°˜6°˜/°˜(°˜!°˜°˜°˜ °˜°˜þ¯˜÷¯˜ð¯˜鯘⯘Û¯˜Ô¯˜ͯ˜Ư˜¿¯˜¸¯˜±¯˜ª¯˜£¯˜œ¯˜•¯˜ޝ˜‡¯˜€¯˜y¯˜r¯˜k¯˜d¯˜]¯˜V¯˜O¯˜H¯˜A¯˜:¯˜3¯˜,¯˜%¯˜¯˜¯˜¯˜ ¯˜¯˜û®˜ô®˜í®˜殘ß®˜Ø®˜Ñ®˜Ê®˜î˜¼®˜µ®˜®®˜§®˜ ®˜™®˜’®˜‹®˜„®˜}®˜v®˜o®˜h®˜a®˜Z®˜S®˜L®˜E®˜>®˜7®˜0®˜)®˜"®˜®˜®˜ ®˜®˜ÿ­˜ø­˜ñ­˜ê­˜ã­˜Ü­˜Õ­˜έ˜Ç­˜À­˜¹­˜²­˜«­˜¤­˜­˜–­˜­˜ˆ­˜­˜z­˜s­˜l­˜e­˜^­˜W­˜P­˜I­˜B­˜;­˜4­˜-­˜&­˜­˜­˜­˜ ­˜­˜ü¬˜õ¬˜笘ଘÙ¬˜Ò¬˜ˬ˜Ĭ˜½¬˜¶¬˜¯¬˜¨¬˜¡¬˜š¬˜“¬˜Œ¬˜…¬˜~¬˜w¬˜p¬˜i¬˜b¬˜[¬˜T¬˜M¬˜F¬˜?¬˜8¬˜1¬˜*¬˜#¬˜¬˜¬˜¬˜¬˜¬˜ù«˜ò«˜뫘䫘Ý«˜Ö«˜Ï«˜È«˜Á«˜º«˜³«˜¬«˜¥«˜ž«˜—«˜«˜‰«˜‚«˜{«˜t«˜m«˜f«˜_«˜X«˜Q«˜J«˜C«˜<«˜5«˜.«˜'«˜ «˜«˜«˜ «˜«˜ýª˜öª˜滛誘᪘Úª˜Óª˜̪˜Ū˜¾ª˜·ª˜°ª˜©ª˜¢ª˜›ª˜”ª˜ª˜†ª˜ª˜xª˜qª˜jª˜cª˜\ª˜Uª˜Nª˜Gª˜@ª˜9ª˜2ª˜+ª˜$ª˜ª˜ª˜ª˜ª˜ª˜ú©˜ó©˜쩘婘Þ©˜ש˜Щ˜É©˜©˜»©˜´©˜­©˜¦©˜Ÿ©˜˜©˜‘©˜Š©˜ƒ©˜|©˜u©˜n©˜g©˜`©˜Y©˜R©˜K©˜D©˜=©˜6©˜/©˜(©˜!©˜©˜©˜ ©˜©˜þ¨˜÷¨˜ð¨˜騘⨘Û¨˜Ô¨˜ͨ˜ƨ˜¿¨˜¸¨˜±¨˜ª¨˜£¨˜œ¨˜•¨˜ލ˜‡¨˜€¨˜y¨˜r¨˜k¨˜d¨˜]¨˜V¨˜O¨˜H¨˜A¨˜:¨˜3¨˜,¨˜%¨˜¨˜¨˜¨˜ ¨˜¨˜û§˜ô§˜í§˜様ß§˜ا˜ѧ˜ʧ˜ç˜¼§˜µ§˜®§˜§§˜ §˜™§˜’§˜‹§˜„§˜}§˜v§˜o§˜h§˜a§˜Z§˜S§˜L§˜E§˜>§˜7§˜0§˜)§˜"§˜§˜§˜ §˜§˜ÿ¦˜ø¦˜ñ¦˜ꦘ㦘ܦ˜Õ¦˜Φ˜Ǧ˜À¦˜¹¦˜²¦˜«¦˜¤¦˜¦˜–¦˜¦˜ˆ¦˜¦˜z¦˜s¦˜l¦˜e¦˜^¦˜W¦˜P¦˜I¦˜B¦˜;¦˜4¦˜-¦˜&¦˜¦˜¦˜¦˜ ¦˜¦˜ü¥˜õ¥˜祘क़Ù¥˜Ò¥˜Ë¥˜Ä¥˜½¥˜¶¥˜¯¥˜¨¥˜¡¥˜š¥˜“¥˜Œ¥˜…¥˜~¥˜w¥˜p¥˜i¥˜b¥˜[¥˜T¥˜M¥˜F¥˜?¥˜8¥˜1¥˜*¥˜#¥˜¥˜¥˜¥˜¥˜¥˜ù¤˜ò¤˜뤘䤘ݤ˜Ö¤˜Ϥ˜Ȥ˜Á¤˜º¤˜³¤˜¬¤˜¥¤˜ž¤˜—¤˜¤˜‰¤˜‚¤˜{¤˜t¤˜m¤˜f¤˜_¤˜X¤˜Q¤˜J¤˜C¤˜<¤˜5¤˜.¤˜'¤˜ ¤˜¤˜¤˜ ¤˜¤˜ý£˜ö£˜裘ᣘÚ£˜Ó£˜Ì£˜Å£˜¾£˜·£˜°£˜©£˜¢£˜›£˜”£˜£˜†£˜£˜x£˜q£˜j£˜c£˜\£˜U£˜N£˜G£˜@£˜9£˜2£˜+£˜$£˜£˜£˜£˜£˜£˜ú¢˜ó¢˜좘墘Þ¢˜×¢˜Т˜É¢˜¢˜»¢˜´¢˜­¢˜¦¢˜Ÿ¢˜˜¢˜‘¢˜Š¢˜ƒ¢˜|¢˜u¢˜n¢˜g¢˜`¢˜Y¢˜R¢˜K¢˜D¢˜=¢˜6¢˜/¢˜(¢˜!¢˜¢˜¢˜ ¢˜¢˜þ¡˜÷¡˜ð¡˜願⡘Û¡˜Ô¡˜Í¡˜Æ¡˜¿¡˜¸¡˜±¡˜ª¡˜£¡˜œ¡˜•¡˜Ž¡˜‡¡˜€¡˜y¡˜r¡˜k¡˜d¡˜]¡˜V¡˜O¡˜H¡˜A¡˜:¡˜3¡˜,¡˜%¡˜¡˜¡˜¡˜ ¡˜¡˜û ˜ô ˜í ˜æ ˜ß ˜Ø ˜Ñ ˜Ê ˜à˜¼ ˜µ ˜® ˜§ ˜  ˜™ ˜’ ˜‹ ˜„ ˜} ˜v ˜o ˜h ˜a ˜Z ˜S ˜L ˜E ˜> ˜7 ˜0 ˜) ˜" ˜ ˜ ˜  ˜ ˜ÿŸ˜øŸ˜ñŸ˜Ꟙ㟘ÜŸ˜ÕŸ˜Ο˜ÇŸ˜ÀŸ˜¹Ÿ˜²Ÿ˜«Ÿ˜¤Ÿ˜Ÿ˜–Ÿ˜Ÿ˜ˆŸ˜Ÿ˜zŸ˜sŸ˜lŸ˜eŸ˜^Ÿ˜WŸ˜PŸ˜IŸ˜BŸ˜;Ÿ˜4Ÿ˜-Ÿ˜&Ÿ˜Ÿ˜Ÿ˜Ÿ˜ Ÿ˜Ÿ˜üž˜õž˜瞘àž˜Ùž˜Òž˜Ëž˜Äž˜½ž˜¶ž˜¯ž˜¨ž˜¡ž˜šž˜“ž˜Œž˜…ž˜~ž˜wž˜pž˜iž˜bž˜[ž˜Tž˜Mž˜Fž˜?ž˜8ž˜1ž˜*ž˜#ž˜ž˜ž˜ž˜ž˜ž˜ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ýœ˜öœ˜蜘᜘Úœ˜Óœ˜Ìœ˜Åœ˜¾œ˜·œ˜°œ˜©œ˜¢œ˜›œ˜”œ˜œ˜†œ˜œ˜xœ˜qœ˜jœ˜cœ˜\œ˜Uœ˜Nœ˜Gœ˜@œ˜9œ˜2œ˜+œ˜$œ˜œ˜œ˜œ˜œ˜œ˜ú›˜ó›˜웘囘Þ›˜×›˜Л˜É›˜›˜»›˜´›˜­›˜¦›˜Ÿ›˜˜›˜‘›˜Š›˜ƒ›˜|›˜u›˜n›˜g›˜`›˜Y›˜R›˜K›˜D›˜=›˜6›˜/›˜(›˜!›˜›˜›˜ ›˜›˜þš˜÷š˜ðš˜隘⚘Ûš˜Ôš˜Íš˜Æš˜¿š˜¸š˜±š˜ªš˜£š˜œš˜•š˜Žš˜‡š˜€š˜yš˜rš˜kš˜dš˜]š˜Vš˜Oš˜Hš˜Aš˜:š˜3š˜,š˜%š˜š˜š˜š˜ š˜š˜û™˜ô™˜환晘ß™˜Ø™˜Ñ™˜Ê™˜Ù˜¼™˜µ™˜®™˜§™˜ ™˜™™˜’™˜‹™˜„™˜}™˜v™˜o™˜h™˜a™˜Z™˜S™˜L™˜E™˜>™˜7™˜0™˜)™˜"™˜™˜™˜ ™˜™˜ÿ˜˜ø˜˜ñ˜˜ꘘ㘘ܘ˜Õ˜˜Θ˜ǘ˜À˜˜¹˜˜²˜˜«˜˜¤˜˜˜˜–˜˜˜˜ˆ˜˜˜˜z˜˜s˜˜l˜˜e˜˜^˜˜W˜˜P˜˜I˜˜B˜˜;˜˜4˜˜-˜˜&˜˜˜˜˜˜˜˜ ˜˜˜˜ü—˜õ—˜î—˜ç—˜à—˜Ù—˜Ò—˜Ë—˜Ä—˜½—˜¶—˜¯—˜¨—˜¡—˜š—˜“—˜Œ—˜…—˜~—˜w—˜p—˜i—˜b—˜[—˜T—˜M—˜F—˜?—˜8—˜1—˜*—˜#—˜—˜—˜—˜—˜—˜ù–˜ò–˜ë–˜ä–˜Ý–˜Ö–˜Ï–˜È–˜Á–˜º–˜³–˜¬–˜¥–˜ž–˜—–˜–˜‰–˜‚–˜{–˜t–˜m–˜f–˜_–˜X–˜Q–˜J–˜C–˜<–˜5–˜.–˜'–˜ –˜–˜–˜ –˜–˜ý•˜ö•˜蕘ᕘÚ•˜Ó•˜Ì•˜Å•˜¾•˜·•˜°•˜©•˜¢•˜›•˜”•˜•˜†•˜•˜x•˜q•˜j•˜c•˜\•˜U•˜N•˜G•˜@•˜9•˜2•˜+•˜$•˜•˜•˜•˜•˜•˜ú”˜ó”˜씘唘Þ”˜×”˜Д˜É”˜”˜»”˜´”˜­”˜¦”˜Ÿ”˜˜”˜‘”˜Š”˜ƒ”˜|”˜u”˜n”˜g”˜`”˜Y”˜R”˜K”˜D”˜=”˜6”˜/”˜(”˜!”˜”˜”˜ ”˜”˜þ“˜÷“˜ð“˜铘ⓘÛ“˜Ô“˜Í“˜Æ“˜¿“˜¸“˜±“˜ª“˜£“˜œ“˜•“˜Ž“˜‡“˜€“˜y“˜r“˜k“˜d“˜]“˜V“˜O“˜H“˜A“˜:“˜3“˜,“˜%“˜“˜“˜“˜ “˜“˜û’˜ô’˜í’˜æ’˜ß’˜Ø’˜Ñ’˜Ê’˜Ã’˜¼’˜µ’˜®’˜§’˜ ’˜™’˜’’˜‹’˜„’˜}’˜v’˜o’˜h’˜a’˜Z’˜S’˜L’˜E’˜>’˜7’˜0’˜)’˜"’˜’˜’˜ ’˜’˜ÿ‘˜ø‘˜ñ‘˜ꑘ㑘Ü‘˜Õ‘˜Α˜Ç‘˜À‘˜¹‘˜²‘˜«‘˜¤‘˜‘˜–‘˜‘˜ˆ‘˜‘˜z‘˜s‘˜l‘˜e‘˜^‘˜W‘˜P‘˜I‘˜B‘˜;‘˜4‘˜-‘˜&‘˜‘˜‘˜‘˜ ‘˜‘˜ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ýŽ˜öŽ˜莘᎘ÚŽ˜ÓŽ˜ÌŽ˜ÅŽ˜¾Ž˜·Ž˜°Ž˜©Ž˜¢Ž˜›Ž˜”Ž˜Ž˜†Ž˜Ž˜xŽ˜qŽ˜jŽ˜cŽ˜\Ž˜UŽ˜NŽ˜GŽ˜@Ž˜9Ž˜2Ž˜+Ž˜$Ž˜Ž˜Ž˜Ž˜Ž˜Ž˜ú˜ó˜ì˜å˜Þ˜טИɘ˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þŒ˜÷Œ˜ðŒ˜錘⌘ÛŒ˜ÔŒ˜ÍŒ˜ÆŒ˜¿Œ˜¸Œ˜±Œ˜ªŒ˜£Œ˜œŒ˜•Œ˜ŽŒ˜‡Œ˜€Œ˜yŒ˜rŒ˜kŒ˜dŒ˜]Œ˜VŒ˜OŒ˜HŒ˜AŒ˜:Œ˜3Œ˜,Œ˜%Œ˜Œ˜Œ˜Œ˜ Œ˜Œ˜û‹˜ô‹˜틘拘ß‹˜Ø‹˜Ñ‹˜Ê‹˜˘¼‹˜µ‹˜®‹˜§‹˜ ‹˜™‹˜’‹˜‹‹˜„‹˜}‹˜v‹˜o‹˜h‹˜a‹˜Z‹˜S‹˜L‹˜E‹˜>‹˜7‹˜0‹˜)‹˜"‹˜‹˜‹˜ ‹˜‹˜ÿŠ˜øŠ˜ñŠ˜ꊘ㊘ÜŠ˜ÕŠ˜Ί˜ÇŠ˜ÀŠ˜¹Š˜²Š˜«Š˜¤Š˜Š˜–Š˜Š˜ˆŠ˜Š˜zŠ˜sŠ˜lŠ˜eŠ˜^Š˜WŠ˜PŠ˜IŠ˜BŠ˜;Š˜4Š˜-Š˜&Š˜Š˜Š˜Š˜ Š˜Š˜ü‰˜õ‰˜牘à‰˜Ù‰˜Ò‰˜ˉ˜ĉ˜½‰˜¶‰˜¯‰˜¨‰˜¡‰˜š‰˜“‰˜Œ‰˜…‰˜~‰˜w‰˜p‰˜i‰˜b‰˜[‰˜T‰˜M‰˜F‰˜?‰˜8‰˜1‰˜*‰˜#‰˜‰˜‰˜‰˜‰˜‰˜ùˆ˜òˆ˜눘䈘݈˜Öˆ˜ψ˜Ȉ˜Áˆ˜ºˆ˜³ˆ˜¬ˆ˜¥ˆ˜žˆ˜—ˆ˜ˆ˜‰ˆ˜‚ˆ˜{ˆ˜tˆ˜mˆ˜fˆ˜_ˆ˜Xˆ˜Qˆ˜Jˆ˜Cˆ˜<ˆ˜5ˆ˜.ˆ˜'ˆ˜ ˆ˜ˆ˜ˆ˜ ˆ˜ˆ˜ý‡˜ö‡˜臘ᇘÚ‡˜Ó‡˜̇˜Ň˜¾‡˜·‡˜°‡˜©‡˜¢‡˜›‡˜”‡˜‡˜†‡˜‡˜x‡˜q‡˜j‡˜c‡˜\‡˜U‡˜N‡˜G‡˜@‡˜9‡˜2‡˜+‡˜$‡˜‡˜‡˜‡˜‡˜‡˜ú†˜ó†˜솘冘Þ†˜׆˜І˜Ɇ˜†˜»†˜´†˜­†˜¦†˜Ÿ†˜˜†˜‘†˜І˜ƒ†˜|†˜u†˜n†˜g†˜`†˜Y†˜R†˜K†˜D†˜=†˜6†˜/†˜(†˜!†˜†˜†˜ †˜†˜þ…˜÷…˜ð…˜é…˜â…˜Û…˜Ô…˜Í…˜Æ…˜¿…˜¸…˜±…˜ª…˜£…˜œ…˜•…˜Ž…˜‡…˜€…˜y…˜r…˜k…˜d…˜]…˜V…˜O…˜H…˜A…˜:…˜3…˜,…˜%…˜…˜…˜…˜ …˜…˜û„˜ô„˜턘愘ß„˜Ø„˜Ñ„˜Ê„˜Ę¼„˜µ„˜®„˜§„˜ „˜™„˜’„˜‹„˜„„˜}„˜v„˜o„˜h„˜a„˜Z„˜S„˜L„˜E„˜>„˜7„˜0„˜)„˜"„˜„˜„˜ „˜„˜ÿƒ˜øƒ˜ñƒ˜ꃘヘ܃˜Õƒ˜΃˜ǃ˜Àƒ˜¹ƒ˜²ƒ˜«ƒ˜¤ƒ˜ƒ˜–ƒ˜ƒ˜ˆƒ˜ƒ˜zƒ˜sƒ˜lƒ˜eƒ˜^ƒ˜Wƒ˜Pƒ˜Iƒ˜Bƒ˜;ƒ˜4ƒ˜-ƒ˜&ƒ˜ƒ˜ƒ˜ƒ˜ ƒ˜ƒ˜ü‚˜õ‚˜炘à‚˜Ù‚˜Ò‚˜Ë‚˜Ä‚˜½‚˜¶‚˜¯‚˜¨‚˜¡‚˜š‚˜“‚˜Œ‚˜…‚˜~‚˜w‚˜p‚˜i‚˜b‚˜[‚˜T‚˜M‚˜F‚˜?‚˜8‚˜1‚˜*‚˜#‚˜‚˜‚˜‚˜‚˜‚˜ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý€˜ö€˜耘ဘÚ€˜Ó€˜Ì€˜Å€˜¾€˜·€˜°€˜©€˜¢€˜›€˜”€˜€˜†€˜€˜x€˜q€˜j€˜c€˜\€˜U€˜N€˜G€˜@€˜9€˜2€˜+€˜$€˜€˜€˜€˜€˜€˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ~˜÷~˜ð~˜é~˜â~˜Û~˜Ô~˜Í~˜Æ~˜¿~˜¸~˜±~˜ª~˜£~˜œ~˜•~˜Ž~˜‡~˜€~˜y~˜r~˜k~˜d~˜]~˜V~˜O~˜H~˜A~˜:~˜3~˜,~˜%~˜~˜~˜~˜ ~˜~˜û}˜ô}˜í}˜æ}˜ß}˜Ø}˜Ñ}˜Ê}˜Ã}˜¼}˜µ}˜®}˜§}˜ }˜™}˜’}˜‹}˜„}˜}}˜v}˜o}˜h}˜a}˜Z}˜S}˜L}˜E}˜>}˜7}˜0}˜)}˜"}˜}˜}˜ }˜}˜ÿ|˜ø|˜ñ|˜ê|˜ã|˜Ü|˜Õ|˜Î|˜Ç|˜À|˜¹|˜²|˜«|˜¤|˜|˜–|˜|˜ˆ|˜|˜z|˜s|˜l|˜e|˜^|˜W|˜P|˜I|˜B|˜;|˜4|˜-|˜&|˜|˜|˜|˜ |˜|˜ü{˜õ{˜î{˜ç{˜à{˜Ù{˜Ò{˜Ë{˜Ä{˜½{˜¶{˜¯{˜¨{˜¡{˜š{˜“{˜Œ{˜…{˜~{˜w{˜p{˜i{˜b{˜[{˜T{˜M{˜F{˜?{˜8{˜1{˜*{˜#{˜{˜{˜{˜{˜{˜ùz˜òz˜ëz˜äz˜Ýz˜Öz˜Ïz˜Èz˜Áz˜ºz˜³z˜¬z˜¥z˜žz˜—z˜z˜‰z˜‚z˜{z˜tz˜mz˜fz˜_z˜Xz˜Qz˜Jz˜Cz˜v˜7v˜0v˜)v˜"v˜v˜v˜ v˜v˜ÿu˜øu˜ñu˜êu˜ãu˜Üu˜Õu˜Îu˜Çu˜Àu˜¹u˜²u˜«u˜¤u˜u˜–u˜u˜ˆu˜u˜zu˜su˜lu˜eu˜^u˜Wu˜Pu˜Iu˜Bu˜;u˜4u˜-u˜&u˜u˜u˜u˜ u˜u˜üt˜õt˜ît˜çt˜àt˜Ùt˜Òt˜Ët˜Ät˜½t˜¶t˜¯t˜¨t˜¡t˜št˜“t˜Œt˜…t˜~t˜wt˜pt˜it˜bt˜[t˜Tt˜Mt˜Ft˜?t˜8t˜1t˜*t˜#t˜t˜t˜t˜t˜t˜ùs˜òs˜ës˜äs˜Ýs˜Ös˜Ïs˜Ès˜Ás˜ºs˜³s˜¬s˜¥s˜žs˜—s˜s˜‰s˜‚s˜{s˜ts˜ms˜fs˜_s˜Xs˜Qs˜Js˜Cs˜o˜7o˜0o˜)o˜"o˜o˜o˜ o˜o˜ÿn˜øn˜ñn˜ên˜ãn˜Ün˜Õn˜În˜Çn˜Àn˜¹n˜²n˜«n˜¤n˜n˜–n˜n˜ˆn˜n˜zn˜sn˜ln˜en˜^n˜Wn˜Pn˜In˜Bn˜;n˜4n˜-n˜&n˜n˜n˜n˜ n˜n˜üm˜õm˜îm˜çm˜àm˜Ùm˜Òm˜Ëm˜Äm˜½m˜¶m˜¯m˜¨m˜¡m˜šm˜“m˜Œm˜…m˜~m˜wm˜pm˜im˜bm˜[m˜Tm˜Mm˜Fm˜?m˜8m˜1m˜*m˜#m˜m˜m˜m˜m˜m˜ùl˜òl˜ël˜äl˜Ýl˜Öl˜Ïl˜Èl˜Ál˜ºl˜³l˜¬l˜¥l˜žl˜—l˜l˜‰l˜‚l˜{l˜tl˜ml˜fl˜_l˜Xl˜Ql˜Jl˜Cl˜h˜7h˜0h˜)h˜"h˜h˜h˜ h˜h˜ÿg˜øg˜ñg˜êg˜ãg˜Üg˜Õg˜Îg˜Çg˜Àg˜¹g˜²g˜«g˜¤g˜g˜–g˜g˜ˆg˜g˜zg˜sg˜lg˜eg˜^g˜Wg˜Pg˜Ig˜Bg˜;g˜4g˜-g˜&g˜g˜g˜g˜ g˜g˜üf˜õf˜îf˜çf˜àf˜Ùf˜Òf˜Ëf˜Äf˜½f˜¶f˜¯f˜¨f˜¡f˜šf˜“f˜Œf˜…f˜~f˜wf˜pf˜if˜bf˜[f˜Tf˜Mf˜Ff˜?f˜8f˜1f˜*f˜#f˜f˜f˜f˜f˜f˜ùe˜òe˜ëe˜äe˜Ýe˜Öe˜Ïe˜Èe˜Áe˜ºe˜³e˜¬e˜¥e˜že˜—e˜e˜‰e˜‚e˜{e˜te˜me˜fe˜_e˜Xe˜Qe˜Je˜Ce˜a˜7a˜0a˜)a˜"a˜a˜a˜ a˜a˜ÿ`˜ø`˜ñ`˜ê`˜ã`˜Ü`˜Õ`˜Î`˜Ç`˜À`˜¹`˜²`˜«`˜¤`˜`˜–`˜`˜ˆ`˜`˜z`˜s`˜l`˜e`˜^`˜W`˜P`˜I`˜B`˜;`˜4`˜-`˜&`˜`˜`˜`˜ `˜`˜ü_˜õ_˜î_˜ç_˜à_˜Ù_˜Ò_˜Ë_˜Ä_˜½_˜¶_˜¯_˜¨_˜¡_˜š_˜“_˜Œ_˜…_˜~_˜w_˜p_˜i_˜b_˜[_˜T_˜M_˜F_˜?_˜8_˜1_˜*_˜#_˜_˜_˜_˜_˜_˜ù^˜ò^˜ë^˜ä^˜Ý^˜Ö^˜Ï^˜È^˜Á^˜º^˜³^˜¬^˜¥^˜ž^˜—^˜^˜‰^˜‚^˜{^˜t^˜m^˜f^˜_^˜X^˜Q^˜J^˜C^˜<^˜5^˜.^˜'^˜ ^˜^˜^˜ ^˜^˜ý]˜ö]˜ï]˜è]˜á]˜Ú]˜Ó]˜Ì]˜Å]˜¾]˜·]˜°]˜©]˜¢]˜›]˜”]˜]˜†]˜]˜x]˜q]˜j]˜c]˜\]˜U]˜N]˜G]˜@]˜9]˜2]˜+]˜$]˜]˜]˜]˜]˜]˜ú\˜ó\˜ì\˜å\˜Þ\˜×\˜Ð\˜É\˜Â\˜»\˜´\˜­\˜¦\˜Ÿ\˜˜\˜‘\˜Š\˜ƒ\˜|\˜u\˜n\˜g\˜`\˜Y\˜R\˜K\˜D\˜=\˜6\˜/\˜(\˜!\˜\˜\˜ \˜\˜þ[˜÷[˜ð[˜é[˜â[˜Û[˜Ô[˜Í[˜Æ[˜¿[˜¸[˜±[˜ª[˜£[˜œ[˜•[˜Ž[˜‡[˜€[˜y[˜r[˜k[˜d[˜][˜V[˜O[˜H[˜A[˜:[˜3[˜,[˜%[˜[˜[˜[˜ [˜[˜ûZ˜ôZ˜íZ˜æZ˜ßZ˜ØZ˜ÑZ˜ÊZ˜ÃZ˜¼Z˜µZ˜®Z˜§Z˜ Z˜™Z˜’Z˜‹Z˜„Z˜}Z˜vZ˜oZ˜hZ˜aZ˜ZZ˜SZ˜LZ˜EZ˜>Z˜7Z˜0Z˜)Z˜"Z˜Z˜Z˜ Z˜Z˜ÿY˜øY˜ñY˜êY˜ãY˜ÜY˜ÕY˜ÎY˜ÇY˜ÀY˜¹Y˜²Y˜«Y˜¤Y˜Y˜–Y˜Y˜ˆY˜Y˜zY˜sY˜lY˜eY˜^Y˜WY˜PY˜IY˜BY˜;Y˜4Y˜-Y˜&Y˜Y˜Y˜Y˜ Y˜Y˜üX˜õX˜îX˜çX˜àX˜ÙX˜ÒX˜ËX˜ÄX˜½X˜¶X˜¯X˜¨X˜¡X˜šX˜“X˜ŒX˜…X˜~X˜wX˜pX˜iX˜bX˜[X˜TX˜MX˜FX˜?X˜8X˜1X˜*X˜#X˜X˜X˜X˜X˜X˜ùW˜òW˜ëW˜äW˜ÝW˜ÖW˜ÏW˜ÈW˜ÁW˜ºW˜³W˜¬W˜¥W˜žW˜—W˜W˜‰W˜‚W˜{W˜tW˜mW˜fW˜_W˜XW˜QW˜JW˜CW˜S˜7S˜0S˜)S˜"S˜S˜S˜ S˜S˜ÿR˜øR˜ñR˜êR˜ãR˜ÜR˜ÕR˜ÎR˜ÇR˜ÀR˜¹R˜²R˜«R˜¤R˜R˜–R˜R˜ˆR˜R˜zR˜sR˜lR˜eR˜^R˜WR˜PR˜IR˜BR˜;R˜4R˜-R˜&R˜R˜R˜R˜ R˜R˜üQ˜õQ˜îQ˜çQ˜àQ˜ÙQ˜ÒQ˜ËQ˜ÄQ˜½Q˜¶Q˜¯Q˜¨Q˜¡Q˜šQ˜“Q˜ŒQ˜…Q˜~Q˜wQ˜pQ˜iQ˜bQ˜[Q˜TQ˜MQ˜FQ˜?Q˜8Q˜1Q˜*Q˜#Q˜Q˜Q˜Q˜Q˜Q˜ùP˜òP˜ëP˜äP˜ÝP˜ÖP˜ÏP˜ÈP˜ÁP˜ºP˜³P˜¬P˜¥P˜žP˜—P˜P˜‰P˜‚P˜{P˜tP˜mP˜fP˜_P˜XP˜QP˜JP˜CP˜L˜7L˜0L˜)L˜"L˜L˜L˜ L˜L˜ÿK˜øK˜ñK˜êK˜ãK˜ÜK˜ÕK˜ÎK˜ÇK˜ÀK˜¹K˜²K˜«K˜¤K˜K˜–K˜K˜ˆK˜K˜zK˜sK˜lK˜eK˜^K˜WK˜PK˜IK˜BK˜;K˜4K˜-K˜&K˜K˜K˜K˜ K˜K˜üJ˜õJ˜îJ˜çJ˜àJ˜ÙJ˜ÒJ˜ËJ˜ÄJ˜½J˜¶J˜¯J˜¨J˜¡J˜šJ˜“J˜ŒJ˜…J˜~J˜wJ˜pJ˜iJ˜bJ˜[J˜TJ˜MJ˜FJ˜?J˜8J˜1J˜*J˜#J˜J˜J˜J˜J˜J˜ùI˜òI˜ëI˜äI˜ÝI˜ÖI˜ÏI˜ÈI˜ÁI˜ºI˜³I˜¬I˜¥I˜žI˜—I˜I˜‰I˜‚I˜{I˜tI˜mI˜fI˜_I˜XI˜QI˜JI˜CI˜E˜7E˜0E˜)E˜"E˜E˜E˜ E˜E˜ÿD˜øD˜ñD˜êD˜ãD˜ÜD˜ÕD˜ÎD˜ÇD˜ÀD˜¹D˜²D˜«D˜¤D˜D˜–D˜D˜ˆD˜D˜zD˜sD˜lD˜eD˜^D˜WD˜PD˜ID˜BD˜;D˜4D˜-D˜&D˜D˜D˜D˜ D˜D˜üC˜õC˜îC˜çC˜àC˜ÙC˜ÒC˜ËC˜ÄC˜½C˜¶C˜¯C˜¨C˜¡C˜šC˜“C˜ŒC˜…C˜~C˜wC˜pC˜iC˜bC˜[C˜TC˜MC˜FC˜?C˜8C˜1C˜*C˜#C˜C˜C˜C˜C˜C˜ùB˜òB˜ëB˜äB˜ÝB˜ÖB˜ÏB˜ÈB˜ÁB˜ºB˜³B˜¬B˜¥B˜žB˜—B˜B˜‰B˜‚B˜{B˜tB˜mB˜fB˜_B˜XB˜QB˜JB˜CB˜˜ô>˜í>˜æ>˜ß>˜Ø>˜Ñ>˜Ê>˜Ã>˜¼>˜µ>˜®>˜§>˜ >˜™>˜’>˜‹>˜„>˜}>˜v>˜o>˜h>˜a>˜Z>˜S>˜L>˜E>˜>>˜7>˜0>˜)>˜">˜>˜>˜ >˜>˜ÿ=˜ø=˜ñ=˜ê=˜ã=˜Ü=˜Õ=˜Î=˜Ç=˜À=˜¹=˜²=˜«=˜¤=˜=˜–=˜=˜ˆ=˜=˜z=˜s=˜l=˜e=˜^=˜W=˜P=˜I=˜B=˜;=˜4=˜-=˜&=˜=˜=˜=˜ =˜=˜ü<˜õ<˜î<˜ç<˜à<˜Ù<˜Ò<˜Ë<˜Ä<˜½<˜¶<˜¯<˜¨<˜¡<˜š<˜“<˜Œ<˜…<˜~<˜w<˜p<˜i<˜b<˜[<˜T<˜M<˜F<˜?<˜8<˜1<˜*<˜#<˜<˜<˜<˜<˜<˜ù;˜ò;˜ë;˜ä;˜Ý;˜Ö;˜Ï;˜È;˜Á;˜º;˜³;˜¬;˜¥;˜ž;˜—;˜;˜‰;˜‚;˜{;˜t;˜m;˜f;˜_;˜X;˜Q;˜J;˜C;˜<;˜5;˜.;˜';˜ ;˜;˜;˜ ;˜;˜ý:˜ö:˜ï:˜è:˜á:˜Ú:˜Ó:˜Ì:˜Å:˜¾:˜·:˜°:˜©:˜¢:˜›:˜”:˜:˜†:˜:˜x:˜q:˜j:˜c:˜\:˜U:˜N:˜G:˜@:˜9:˜2:˜+:˜$:˜:˜:˜:˜:˜:˜ú9˜ó9˜ì9˜å9˜Þ9˜×9˜Ð9˜É9˜Â9˜»9˜´9˜­9˜¦9˜Ÿ9˜˜9˜‘9˜Š9˜ƒ9˜|9˜u9˜n9˜g9˜`9˜Y9˜R9˜K9˜D9˜=9˜69˜/9˜(9˜!9˜9˜9˜ 9˜9˜þ8˜÷8˜ð8˜é8˜â8˜Û8˜Ô8˜Í8˜Æ8˜¿8˜¸8˜±8˜ª8˜£8˜œ8˜•8˜Ž8˜‡8˜€8˜y8˜r8˜k8˜d8˜]8˜V8˜O8˜H8˜A8˜:8˜38˜,8˜%8˜8˜8˜8˜ 8˜8˜û7˜ô7˜í7˜æ7˜ß7˜Ø7˜Ñ7˜Ê7˜Ã7˜¼7˜µ7˜®7˜§7˜ 7˜™7˜’7˜‹7˜„7˜}7˜v7˜o7˜h7˜a7˜Z7˜S7˜L7˜E7˜>7˜77˜07˜)7˜"7˜7˜7˜ 7˜7˜ÿ6˜ø6˜ñ6˜ê6˜ã6˜Ü6˜Õ6˜Î6˜Ç6˜À6˜¹6˜²6˜«6˜¤6˜6˜–6˜6˜ˆ6˜6˜z6˜s6˜l6˜e6˜^6˜W6˜P6˜I6˜B6˜;6˜46˜-6˜&6˜6˜6˜6˜ 6˜6˜ü5˜õ5˜î5˜ç5˜à5˜Ù5˜Ò5˜Ë5˜Ä5˜½5˜¶5˜¯5˜¨5˜¡5˜š5˜“5˜Œ5˜…5˜~5˜w5˜p5˜i5˜b5˜[5˜T5˜M5˜F5˜?5˜85˜15˜*5˜#5˜5˜5˜5˜5˜5˜ù4˜ò4˜ë4˜ä4˜Ý4˜Ö4˜Ï4˜È4˜Á4˜º4˜³4˜¬4˜¥4˜ž4˜—4˜4˜‰4˜‚4˜{4˜t4˜m4˜f4˜_4˜X4˜Q4˜J4˜C4˜<4˜54˜.4˜'4˜ 4˜4˜4˜ 4˜4˜ý3˜ö3˜ï3˜è3˜á3˜Ú3˜Ó3˜Ì3˜Å3˜¾3˜·3˜°3˜©3˜¢3˜›3˜”3˜3˜†3˜3˜x3˜q3˜j3˜c3˜\3˜U3˜N3˜G3˜@3˜93˜23˜+3˜$3˜3˜3˜3˜3˜3˜ú2˜ó2˜ì2˜å2˜Þ2˜×2˜Ð2˜É2˜Â2˜»2˜´2˜­2˜¦2˜Ÿ2˜˜2˜‘2˜Š2˜ƒ2˜|2˜u2˜n2˜g2˜`2˜Y2˜R2˜K2˜D2˜=2˜62˜/2˜(2˜!2˜2˜2˜ 2˜2˜þ1˜÷1˜ð1˜é1˜â1˜Û1˜Ô1˜Í1˜Æ1˜¿1˜¸1˜±1˜ª1˜£1˜œ1˜•1˜Ž1˜‡1˜€1˜y1˜r1˜k1˜d1˜]1˜V1˜O1˜H1˜A1˜:1˜31˜,1˜%1˜1˜1˜1˜ 1˜1˜û0˜ô0˜í0˜æ0˜ß0˜Ø0˜Ñ0˜Ê0˜Ã0˜¼0˜µ0˜®0˜§0˜ 0˜™0˜’0˜‹0˜„0˜}0˜v0˜o0˜h0˜a0˜Z0˜S0˜L0˜E0˜>0˜70˜00˜)0˜"0˜0˜0˜ 0˜0˜ÿ/˜ø/˜ñ/˜ê/˜ã/˜Ü/˜Õ/˜Î/˜Ç/˜À/˜¹/˜²/˜«/˜¤/˜/˜–/˜/˜ˆ/˜/˜z/˜s/˜l/˜e/˜^/˜W/˜P/˜I/˜B/˜;/˜4/˜-/˜&/˜/˜/˜/˜ /˜/˜ü.˜õ.˜î.˜ç.˜à.˜Ù.˜Ò.˜Ë.˜Ä.˜½.˜¶.˜¯.˜¨.˜¡.˜š.˜“.˜Œ.˜….˜~.˜w.˜p.˜i.˜b.˜[.˜T.˜M.˜F.˜?.˜8.˜1.˜*.˜#.˜.˜.˜.˜.˜.˜ù-˜ò-˜ë-˜ä-˜Ý-˜Ö-˜Ï-˜È-˜Á-˜º-˜³-˜¬-˜¥-˜ž-˜—-˜-˜‰-˜‚-˜{-˜t-˜m-˜f-˜_-˜X-˜Q-˜J-˜C-˜<-˜5-˜.-˜'-˜ -˜-˜-˜ -˜-˜ý,˜ö,˜ï,˜è,˜á,˜Ú,˜Ó,˜Ì,˜Å,˜¾,˜·,˜°,˜©,˜¢,˜›,˜”,˜,˜†,˜,˜x,˜q,˜j,˜c,˜\,˜U,˜N,˜G,˜@,˜9,˜2,˜+,˜$,˜,˜,˜,˜,˜,˜ú+˜ó+˜ì+˜å+˜Þ+˜×+˜Ð+˜É+˜Â+˜»+˜´+˜­+˜¦+˜Ÿ+˜˜+˜‘+˜Š+˜ƒ+˜|+˜u+˜n+˜g+˜`+˜Y+˜R+˜K+˜D+˜=+˜6+˜/+˜(+˜!+˜+˜+˜ +˜+˜þ*˜÷*˜ð*˜é*˜â*˜Û*˜Ô*˜Í*˜Æ*˜¿*˜¸*˜±*˜ª*˜£*˜œ*˜•*˜Ž*˜‡*˜€*˜y*˜r*˜k*˜d*˜]*˜V*˜O*˜H*˜A*˜:*˜3*˜,*˜%*˜*˜*˜*˜ *˜*˜û)˜ô)˜í)˜æ)˜ß)˜Ø)˜Ñ)˜Ê)˜Ã)˜¼)˜µ)˜®)˜§)˜ )˜™)˜’)˜‹)˜„)˜})˜v)˜o)˜h)˜a)˜Z)˜S)˜L)˜E)˜>)˜7)˜0)˜))˜")˜)˜)˜ )˜)˜ÿ(˜ø(˜ñ(˜ê(˜ã(˜Ü(˜Õ(˜Î(˜Ç(˜À(˜¹(˜²(˜«(˜¤(˜(˜–(˜(˜ˆ(˜(˜z(˜s(˜l(˜e(˜^(˜W(˜P(˜I(˜B(˜;(˜4(˜-(˜&(˜(˜(˜(˜ (˜(˜ü'˜õ'˜î'˜ç'˜à'˜Ù'˜Ò'˜Ë'˜Ä'˜½'˜¶'˜¯'˜¨'˜¡'˜š'˜“'˜Œ'˜…'˜~'˜w'˜p'˜i'˜b'˜['˜T'˜M'˜F'˜?'˜8'˜1'˜*'˜#'˜'˜'˜'˜'˜'˜ù&˜ò&˜ë&˜ä&˜Ý&˜Ö&˜Ï&˜È&˜Á&˜º&˜³&˜¬&˜¥&˜ž&˜—&˜&˜‰&˜‚&˜{&˜t&˜m&˜f&˜_&˜X&˜Q&˜J&˜C&˜<&˜5&˜.&˜'&˜ &˜&˜&˜ &˜&˜ý%˜ö%˜ï%˜è%˜á%˜Ú%˜Ó%˜Ì%˜Å%˜¾%˜·%˜°%˜©%˜¢%˜›%˜”%˜%˜†%˜%˜x%˜q%˜j%˜c%˜\%˜U%˜N%˜G%˜@%˜9%˜2%˜+%˜$%˜%˜%˜%˜%˜%˜ú$˜ó$˜ì$˜å$˜Þ$˜×$˜Ð$˜É$˜Â$˜»$˜´$˜­$˜¦$˜Ÿ$˜˜$˜‘$˜Š$˜ƒ$˜|$˜u$˜n$˜g$˜`$˜Y$˜R$˜K$˜D$˜=$˜6$˜/$˜($˜!$˜$˜$˜ $˜$˜þ#˜÷#˜ð#˜é#˜â#˜Û#˜Ô#˜Í#˜Æ#˜¿#˜¸#˜±#˜ª#˜£#˜œ#˜•#˜Ž#˜‡#˜€#˜y#˜r#˜k#˜d#˜]#˜V#˜O#˜H#˜A#˜:#˜3#˜,#˜%#˜#˜#˜#˜ #˜#˜û"˜ô"˜í"˜æ"˜ß"˜Ø"˜Ñ"˜Ê"˜Ã"˜¼"˜µ"˜®"˜§"˜ "˜™"˜’"˜‹"˜„"˜}"˜v"˜o"˜h"˜a"˜Z"˜S"˜L"˜E"˜>"˜7"˜0"˜)"˜""˜"˜"˜ "˜"˜ÿ!˜ø!˜ñ!˜ê!˜ã!˜Ü!˜Õ!˜Î!˜Ç!˜À!˜¹!˜²!˜«!˜¤!˜!˜–!˜!˜ˆ!˜!˜z!˜s!˜l!˜e!˜^!˜W!˜P!˜I!˜B!˜;!˜4!˜-!˜&!˜!˜!˜!˜ !˜!˜ü ˜õ ˜î ˜ç ˜à ˜Ù ˜Ò ˜Ë ˜Ä ˜½ ˜¶ ˜¯ ˜¨ ˜¡ ˜š ˜“ ˜Œ ˜… ˜~ ˜w ˜p ˜i ˜b ˜[ ˜T ˜M ˜F ˜? ˜8 ˜1 ˜* ˜# ˜ ˜ ˜ ˜ ˜ ˜ù˜ò˜ë˜ä˜Ý˜Ö˜Ï˜È˜Á˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý˜ö˜ï˜è˜á˜Ú˜Ó˜Ì˜Å˜¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ˜÷˜ð˜é˜â˜Û˜Ô˜Í˜Æ˜¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û˜ô˜í˜æ˜ß˜Ø˜Ñ˜Ê˜Ã˜¼˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ˜ø˜ñ˜ê˜ã˜Ü˜Õ˜Î˜Ç˜À˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü˜õ˜î˜ç˜à˜Ù˜Ò˜Ë˜Ä˜½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù˜ò˜ë˜ä˜Ý˜Ö˜Ï˜È˜Á˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý˜ö˜ï˜è˜á˜Ú˜Ó˜Ì˜Å˜¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ˜÷˜ð˜é˜â˜Û˜Ô˜Í˜Æ˜¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û˜ô˜í˜æ˜ß˜Ø˜Ñ˜Ê˜Ã˜¼˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ˜ø˜ñ˜ê˜ã˜Ü˜Õ˜Î˜Ç˜À˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü˜õ˜î˜ç˜à˜Ù˜Ò˜Ë˜Ä˜½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù˜ò˜ë˜ä˜Ý˜Ö˜Ï˜È˜Á˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý˜ö˜ï˜è˜á˜Ú˜Ó˜Ì˜Å˜¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ˜÷˜ð˜é˜â˜Û˜Ô˜Í˜Æ˜¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û ˜ô ˜í ˜æ ˜ß ˜Ø ˜Ñ ˜Ê ˜à ˜¼ ˜µ ˜® ˜§ ˜  ˜™ ˜’ ˜‹ ˜„ ˜} ˜v ˜o ˜h ˜a ˜Z ˜S ˜L ˜E ˜> ˜7 ˜0 ˜) ˜" ˜ ˜ ˜ ˜ ˜ÿ ˜ø ˜ñ ˜ê ˜ã ˜Ü ˜Õ ˜Î ˜Ç ˜À ˜¹ ˜² ˜« ˜¤ ˜ ˜– ˜ ˜ˆ ˜ ˜z ˜s ˜l ˜e ˜^ ˜W ˜P ˜I ˜B ˜; ˜4 ˜- ˜& ˜ ˜ ˜ ˜ ˜ ˜ü ˜õ ˜î ˜ç ˜à ˜Ù ˜Ò ˜Ë ˜Ä ˜½ ˜¶ ˜¯ ˜¨ ˜¡ ˜š ˜“ ˜Œ ˜… ˜~ ˜w ˜p ˜i ˜b ˜[ ˜T ˜M ˜F ˜? ˜8 ˜1 ˜* ˜# ˜ ˜ ˜ ˜ ˜ ˜ù ˜ò ˜ë ˜ä ˜Ý ˜Ö ˜Ï ˜È ˜Á ˜º ˜³ ˜¬ ˜¥ ˜ž ˜— ˜ ˜‰ ˜‚ ˜{ ˜t ˜m ˜f ˜_ ˜X ˜Q ˜J ˜C ˜< ˜5 ˜. ˜' ˜ ˜ ˜ ˜ ˜ ˜ý ˜ö ˜ï ˜è ˜á ˜Ú ˜Ó ˜Ì ˜Å ˜¾ ˜· ˜° ˜© ˜¢ ˜› ˜” ˜ ˜† ˜ ˜x ˜q ˜j ˜c ˜\ ˜U ˜N ˜G ˜@ ˜9 ˜2 ˜+ ˜$ ˜ ˜ ˜ ˜ ˜ ˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ˜÷˜ð˜é˜â˜Û˜Ô˜Í˜Æ˜¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û˜ô˜í˜æ˜ß˜Ø˜Ñ˜Ê˜Ã˜¼˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ˜ø˜ñ˜ê˜ã˜Ü˜Õ˜Î˜Ç˜À˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü˜õ˜î˜ç˜à˜Ù˜Ò˜Ë˜Ä˜½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù˜ò˜ë˜ä˜Ý˜Ö˜Ï˜È˜Á˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý˜ö˜ï˜è˜á˜Ú˜Ó˜Ì˜Å˜¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú˜ó˜ì˜å˜Þ˜×˜Ð˜É˜Â˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ˜÷˜ð˜é˜â˜Û˜Ô˜͘Ƙ¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜ûÿ—ôÿ—íÿ—æÿ—ßÿ—Øÿ—Ñÿ—Êÿ—Ãÿ—¼ÿ—µÿ—®ÿ—§ÿ— ÿ—™ÿ—’ÿ—‹ÿ—„ÿ—}ÿ—vÿ—oÿ—hÿ—aÿ—Zÿ—Sÿ—Lÿ—Eÿ—>ÿ—7ÿ—0ÿ—)ÿ—"ÿ—ÿ—ÿ— ÿ—ÿ—ÿþ—øþ—ñþ—êþ—ãþ—Üþ—Õþ—Îþ—Çþ—Àþ—¹þ—²þ—«þ—¤þ—þ—–þ—þ—ˆþ—þ—zþ—sþ—lþ—eþ—^þ—Wþ—Pþ—Iþ—Bþ—;þ—4þ—-þ—&þ—þ—þ—þ— þ—þ—üý—õý—îý—çý—àý—Ùý—Òý—Ëý—Äý—½ý—¶ý—¯ý—¨ý—¡ý—šý—“ý—Œý—…ý—~ý—wý—pý—iý—bý—[ý—Tý—Mý—Fý—?ý—8ý—1ý—*ý—#ý—ý—ý—ý—ý—ý—ùü—òü—ëü—äü—Ýü—Öü—Ïü—Èü—Áü—ºü—³ü—¬ü—¥ü—žü——ü—ü—‰ü—‚ü—{ü—tü—mü—fü—_ü—Xü—Qü—Jü—Cü—<ü—5ü—.ü—'ü— ü—ü—ü— ü—ü—ýû—öû—ïû—èû—áû—Úû—Óû—Ìû—Åû—¾û—·û—°û—©û—¢û—›û—”û—û—†û—û—xû—qû—jû—cû—\û—Uû—Nû—Gû—@û—9û—2û—+û—$û—û—û—û—û—û—úú—óú—ìú—åú—Þú—×ú—Ðú—Éú—Âú—»ú—´ú—­ú—¦ú—Ÿú—˜ú—‘ú—Šú—ƒú—|ú—uú—nú—gú—`ú—Yú—Rú—Kú—Dú—=ú—6ú—/ú—(ú—!ú—ú—ú— ú—ú—þù—÷ù—ðù—éù—âù—Ûù—Ôù—Íù—Æù—¿ù—¸ù—±ù—ªù—£ù—œù—•ù—Žù—‡ù—€ù—yù—rù—kù—dù—]ù—Vù—Où—Hù—Aù—:ù—3ù—,ù—%ù—ù—ù—ù— ù—ù—ûø—ôø—íø—æø—ßø—Øø—Ñø—Êø—Ãø—¼ø—µø—®ø—§ø— ø—™ø—’ø—‹ø—„ø—}ø—vø—oø—hø—aø—Zø—Sø—Lø—Eø—>ø—7ø—0ø—)ø—"ø—ø—ø— ø—ø—ÿ÷—ø÷—ñ÷—ê÷—ã÷—Ü÷—Õ÷—Î÷—Ç÷—À÷—¹÷—²÷—«÷—¤÷—÷—–÷—÷—ˆ÷—÷—z÷—s÷—l÷—e÷—^÷—W÷—P÷—I÷—B÷—;÷—4÷—-÷—&÷—÷—÷—÷— ÷—÷—üö—õö—îö—çö—àö—Ùö—Òö—Ëö—Äö—½ö—¶ö—¯ö—¨ö—¡ö—šö—“ö—Œö—…ö—~ö—wö—pö—iö—bö—[ö—Tö—Mö—Fö—?ö—8ö—1ö—*ö—#ö—ö—ö—ö—ö—ö—ùõ—òõ—ëõ—äõ—Ýõ—Öõ—Ïõ—Èõ—Áõ—ºõ—³õ—¬õ—¥õ—žõ——õ—õ—‰õ—‚õ—{õ—tõ—mõ—fõ—_õ—Xõ—Qõ—Jõ—Cõ—<õ—5õ—.õ—'õ— õ—õ—õ— õ—õ—ýô—öô—ïô—èô—áô—Úô—Óô—Ìô—Åô—¾ô—·ô—°ô—©ô—¢ô—›ô—”ô—ô—†ô—ô—xô—qô—jô—cô—\ô—Uô—Nô—Gô—@ô—9ô—2ô—+ô—$ô—ô—ô—ô—ô—ô—úó—óó—ìó—åó—Þó—×ó—Ðó—Éó—Âó—»ó—´ó—­ó—¦ó—Ÿó—˜ó—‘ó—Šó—ƒó—|ó—uó—nó—gó—`ó—Yó—Ró—Kó—Dó—=ó—6ó—/ó—(ó—!ó—ó—ó— ó—ó—þò—÷ò—ðò—éò—âò—Ûò—Ôò—Íò—Æò—¿ò—¸ò—±ò—ªò—£ò—œò—•ò—Žò—‡ò—€ò—yò—rò—kò—dò—]ò—Vò—Oò—Hò—Aò—:ò—3ò—,ò—%ò—ò—ò—ò— ò—ò—ûñ—ôñ—íñ—æñ—ßñ—Øñ—Ññ—Êñ—Ãñ—¼ñ—µñ—®ñ—§ñ— ñ—™ñ—’ñ—‹ñ—„ñ—}ñ—vñ—oñ—hñ—añ—Zñ—Sñ—Lñ—Eñ—>ñ—7ñ—0ñ—)ñ—"ñ—ñ—ñ— ñ—ñ—ÿð—øð—ñð—êð—ãð—Üð—Õð—Îð—Çð—Àð—¹ð—²ð—«ð—¤ð—ð—–ð—ð—ˆð—ð—zð—sð—lð—eð—^ð—Wð—Pð—Ið—Bð—;ð—4ð—-ð—&ð—ð—ð—ð— ð—ð—üï—õï—îï—çï—àï—Ùï—Òï—Ëï—Äï—~ï—wï—pï—iï—bï—[ï—Tï—Mï—Fï—?ï—8ï—1ï—*ï—#ï—ï—ï—ï—ï—ï—ùî—òî—ëî—äî—Ýî—Öî—Ïî—Èî—Áî—î—{î—tî—mî—fî—_î—Xî—Qî—Jî—Cî—<î—5î—.î—'î— î—î—î— î—î—ýí—öí—ïí—èí—áí—Úí—Óí—Ìí—Å헾헷헰헩헢헛헔í—í—†í—í—xí—qí—jí—cí—\í—Uí—Ní—Gí—@í—9í—2í—+í—$í—í—í—í—í—í—úì—óì—ìì—åì—Þì—×ì—Ðì—Éì—Â엻열역엦엟엘엑엊엃ì—|ì—uì—nì—gì—`ì—Yì—Rì—Kì—Dì—=ì—6ì—/ì—(ì—!ì—ì—ì— ì—ì—þë—÷ë—ðë—éë—âë—Ûë—Ôë—Íë—Æë—¿ë—¸ë—±ë—ªë—£ë—œë—•ë—Žë—‡ë—€ë—yë—rë—kë—dë—]ë—Vë—Oë—Hë—Aë—:ë—3ë—,ë—%ë—ë—ë—ë— ë—ë—ûê—ôê—íê—æê—ßê—Øê—Ñê—Êê—Ãꗼꗵꗮꗧꗠꗙꗒꗋꗄê—}ê—vê—oê—hê—aê—Zê—Sê—Lê—Eê—>ê—7ê—0ê—)ê—"ê—ê—ê— ê—ê—ÿé—øé—ñé—êé—ãé—Üé—Õé—Îé—Çé—À闹闲闫闤é—é—–é—é—ˆé—é—zé—sé—lé—eé—^é—Wé—Pé—Ié—Bé—;é—4é—-é—&é—é—é—é— é—é—üè—õè—îè—çè—àè—Ùè—Òè—Ëè—Ä藽藶藯藨藡藚藓藌藅è—~è—wè—pè—iè—bè—[è—Tè—Mè—Fè—?è—8è—1è—*è—#è—è—è—è—è—è—ùç—òç—ëç—äç—Ýç—Öç—Ïç—Èç—Á痺痳痬痥痞痗ç—痉痂ç—{ç—tç—mç—fç—_ç—Xç—Qç—Jç—Cç—<ç—5ç—.ç—'ç— ç—ç—ç— ç—ç—ýæ—öæ—ïæ—èæ—áæ—Úæ—Óæ—Ìæ—Åæ—¾æ—·æ—°æ—©æ—¢æ—›æ—”æ—æ—†æ—æ—xæ—qæ—jæ—cæ—\æ—Uæ—Næ—Gæ—@æ—9æ—2æ—+æ—$æ—æ—æ—æ—æ—æ—úå—óå—ìå—åå—Þå—×å—Ðå—Éå—Â嗻嗴嗭嗦嗟嗘嗑嗊嗃å—|å—uå—nå—gå—`å—Yå—Rå—Kå—Då—=å—6å—/å—(å—!å—å—å— å—å—þä—÷ä—ðä—éä—âä—Ûä—Ôä—Íä—Æä—¿ä—¸ä—±ä—ªä—£ä—œä—•ä—Žä—‡ä—€ä—yä—rä—kä—dä—]ä—Vä—Oä—Hä—Aä—:ä—3ä—,ä—%ä—ä—ä—ä— ä—ä—ûã—ôã—íã—æã—ßã—Øã—Ñã—Êã—Ã㗼㗵㗮㗧㗠㗙㗒㗋㗄ã—}ã—vã—oã—hã—aã—Zã—Sã—Lã—Eã—>ã—7ã—0ã—)ã—"ã—ã—ã— ã—ã—ÿâ—øâ—ñâ—êâ—ãâ—Üâ—Õâ—Îâ—Çâ—À◹◲◫◤â—â—–â—â—ˆâ—â—zâ—sâ—lâ—eâ—^â—Wâ—Pâ—Iâ—Bâ—;â—4â—-â—&â—â—â—â— â—â—üá—õá—îá—çá—àá—Ùá—Òá—Ëá—Äᗽᗶᗯᗨᗡᗚᗓᗌᗅá—~á—wá—pá—iá—bá—[á—Tá—Má—Fá—?á—8á—1á—*á—#á—á—á—á—á—á—ùà—òà—ëà—äà—Ýà—Öà—Ïà—Èà—Áà—ºà—³à—¬à—¥à—žà——à—à—‰à—‚à—{à—tà—mà—fà—_à—Xà—Qà—Jà—Cà—<à—5à—.à—'à— à—à—à— à—à—ýß—öß—ïß—èß—áß—Úß—Óß—Ìß—Åß—¾ß—·ß—°ß—©ß—¢ß—›ß—”ß—ß—†ß—ß—xß—qß—jß—cß—\ß—Uß—Nß—Gß—@ß—9ß—2ß—+ß—$ß—ß—ß—ß—ß—ß—úÞ—óÞ—ìÞ—åÞ—ÞÞ—×Þ—ÐÞ—ÉÞ—ÂÞ—»Þ—´Þ—­Þ—¦Þ—ŸÞ—˜Þ—‘Þ—ŠÞ—ƒÞ—|Þ—uÞ—nÞ—gÞ—`Þ—YÞ—RÞ—KÞ—DÞ—=Þ—6Þ—/Þ—(Þ—!Þ—Þ—Þ— Þ—Þ—þÝ—÷Ý—ðÝ—éÝ—âÝ—ÛÝ—ÔÝ—ÍÝ—ÆÝ—¿Ý—¸Ý—±Ý—ªÝ—£Ý—œÝ—•Ý—ŽÝ—‡Ý—€Ý—yÝ—rÝ—kÝ—dÝ—]Ý—VÝ—OÝ—HÝ—AÝ—:Ý—3Ý—,Ý—%Ý—Ý—Ý—Ý— Ý—Ý—ûÜ—ôÜ—íÜ—æÜ—ßÜ—ØÜ—ÑÜ—ÊÜ—ÃÜ—¼Ü—µÜ—®Ü—§Ü— Ü—™Ü—’Ü—‹Ü—„Ü—}Ü—vÜ—oÜ—hÜ—aÜ—ZÜ—SÜ—LÜ—EÜ—>Ü—7Ü—0Ü—)Ü—"Ü—Ü—Ü— Ü—Ü—ÿÛ—øÛ—ñÛ—êÛ—ãÛ—ÜÛ—ÕÛ—ÎÛ—ÇÛ—ÀÛ—¹Û—²Û—«Û—¤Û—Û—–Û—Û—ˆÛ—Û—zÛ—sÛ—lÛ—eÛ—^Û—WÛ—PÛ—IÛ—BÛ—;Û—4Û—-Û—&Û—Û—Û—Û— Û—Û—üÚ—õÚ—îÚ—çÚ—àÚ—ÙÚ—ÒÚ—ËÚ—ÄÚ—½Ú—¶Ú—¯Ú—¨Ú—¡Ú—šÚ—“Ú—ŒÚ—…Ú—~Ú—wÚ—pÚ—iÚ—bÚ—[Ú—TÚ—MÚ—FÚ—?Ú—8Ú—1Ú—*Ú—#Ú—Ú—Ú—Ú—Ú—Ú—ùÙ—òÙ—ëÙ—äÙ—ÝÙ—ÖÙ—ÏÙ—ÈÙ—ÁÙ—ºÙ—³Ù—¬Ù—¥Ù—žÙ——ٗٗ‰Ù—‚Ù—{Ù—tÙ—mÙ—fÙ—_Ù—XÙ—QÙ—JÙ—CÙ—<Ù—5Ù—.Ù—'Ù— ٗٗٗ ٗٗýØ—öØ—ïØ—èØ—áØ—ÚØ—ÓØ—ÌØ—ÅØ—¾Ø—·Ø—°Ø—©Ø—¢Ø—›Ø—”ؗؗ†Ø—Ø—xØ—qØ—jØ—cØ—\Ø—UØ—NØ—GØ—@Ø—9Ø—2Ø—+Ø—$ؗؗؗؗؗؗú×—ó×—ì×—å×—Þ×—××—Ð×—É×—Â×—»×—´×—­×—¦×—Ÿ×—˜×—‘×—Š×—ƒ×—|×—u×—n×—g×—`×—Y×—R×—K×—D×—=×—6×—/×—(×—!×—×—×— ×—×—þÖ—÷Ö—ðÖ—éÖ—âÖ—ÛÖ—ÔÖ—ÍÖ—ÆÖ—¿Ö—¸Ö—±Ö—ªÖ—£Ö—œÖ—•Ö—ŽÖ—‡Ö—€Ö—yÖ—rÖ—kÖ—dÖ—]Ö—VÖ—OÖ—HÖ—AÖ—:Ö—3Ö—,Ö—%Ö—Ö—Ö—Ö— Ö—Ö—ûÕ—ôÕ—íÕ—æÕ—ßÕ—ØÕ—ÑÕ—ÊÕ—ÃÕ—¼Õ—µÕ—®Õ—§Õ— Õ—™Õ—’Õ—‹Õ—„Õ—}Õ—vÕ—oÕ—hÕ—aÕ—ZÕ—SÕ—LÕ—EÕ—>Õ—7Õ—0Õ—)Õ—"Õ—Õ—Õ— Õ—Õ—ÿÔ—øÔ—ñÔ—êÔ—ãÔ—ÜÔ—ÕÔ—ÎÔ—ÇÔ—ÀÔ—¹Ô—²Ô—«Ô—¤Ô—Ô—–Ô—Ô—ˆÔ—Ô—zÔ—sÔ—lÔ—eÔ—^Ô—WÔ—PÔ—IÔ—BÔ—;Ô—4Ô—-Ô—&Ô—Ô—Ô—Ô— Ô—Ô—üÓ—õÓ—îÓ—çÓ—àÓ—ÙÓ—ÒÓ—ËÓ—ÄÓ—½Ó—¶Ó—¯Ó—¨Ó—¡Ó—šÓ—“Ó—ŒÓ—…Ó—~Ó—wÓ—pÓ—iÓ—bÓ—[Ó—TÓ—MÓ—FÓ—?Ó—8Ó—1Ó—*Ó—#Ó—Ó—Ó—Ó—Ó—Ó—ùÒ—òÒ—ëÒ—äÒ—ÝÒ—ÖÒ—ÏÒ—ÈÒ—ÁÒ—ºÒ—³Ò—¬Ò—¥Ò—žÒ——Ò—Ò—‰Ò—‚Ò—{Ò—tÒ—mÒ—fÒ—_Ò—XÒ—QÒ—JÒ—CÒ—<Ò—5Ò—.Ò—'Ò— Ò—Ò—Ò— Ò—Ò—ýÑ—öÑ—ïÑ—èÑ—áÑ—ÚÑ—ÓÑ—ÌÑ—ÅÑ—¾Ñ—·Ñ—°Ñ—©Ñ—¢Ñ—›Ñ—”Ñ—Ñ—†Ñ—Ñ—xÑ—qÑ—jÑ—cÑ—\Ñ—UÑ—NÑ—GÑ—@Ñ—9Ñ—2Ñ—+Ñ—$Ñ—Ñ—Ñ—Ñ—Ñ—Ñ—úЗóЗìЗåЗÞЗ×ЗÐЗÉЗÂЗ»Ð—´Ð—­Ð—¦Ð—ŸÐ—˜Ð—‘ЗŠÐ—ƒÐ—|ЗuЗnЗgЗ`ЗYЗRЗKЗDЗ=З6З/З(З!ЗЗЗ ЗЗþÏ—÷Ï—ðÏ—éÏ—âÏ—ÛÏ—ÔÏ—ÍÏ—ÆÏ—¿Ï—¸Ï—±Ï—ªÏ—£Ï—œÏ—•Ï—ŽÏ—‡Ï—€Ï—yÏ—rÏ—kÏ—dÏ—]Ï—VÏ—OÏ—HÏ—AÏ—:Ï—3Ï—,Ï—%Ï—Ï—Ï—Ï— Ï—Ï—ûΗôΗíΗæÎ—ßΗØÎ—ÑΗÊΗÃΗ¼Î—µÎ—®Î—§Î— Î—™Î—’Η‹Î—„Η}ΗvΗoΗhΗaΗZΗSΗLΗEΗ>Η7Η0Η)Η"ΗΗΗ ΗΗÿÍ—øÍ—ñÍ—êÍ—ãÍ—ÜÍ—ÕÍ—ÎÍ—ÇÍ—ÀÍ—¹Í—²Í—«Í—¤Í—Í—–Í—Í—ˆÍ—Í—zÍ—sÍ—lÍ—eÍ—^Í—WÍ—PÍ—IÍ—BÍ—;Í—4Í—-Í—&Í—Í—Í—Í— Í—Í—üÌ—õÌ—îÌ—çÌ—àÌ—ÙÌ—ÒÌ—ËÌ—ÄÌ—½Ì—¶Ì—¯Ì—¨Ì—¡Ì—šÌ—“Ì—ŒÌ—…Ì—~Ì—wÌ—pÌ—iÌ—bÌ—[Ì—TÌ—MÌ—FÌ—?Ì—8Ì—1Ì—*Ì—#Ì—Ì—Ì—Ì—Ì—Ì—ùË—òË—ëË—äË—ÝË—ÖË—ÏË—ÈË—ÁË—ºË—³Ë—¬Ë—¥Ë—žË——Ë—Ë—‰Ë—‚Ë—{Ë—tË—mË—fË—_Ë—XË—QË—JË—CË—<Ë—5Ë—.Ë—'Ë— Ë—Ë—Ë— Ë—Ë—ýÊ—öÊ—ïÊ—èÊ—áÊ—ÚÊ—ÓÊ—ÌÊ—ÅÊ—¾Ê—·Ê—°Ê—©Ê—¢Ê—›Ê—”Ê—Ê—†Ê—Ê—xÊ—qÊ—jÊ—cÊ—\Ê—UÊ—NÊ—GÊ—@Ê—9Ê—2Ê—+Ê—$Ê—Ê—Ê—Ê—Ê—Ê—úÉ—óÉ—ìÉ—åÉ—ÞÉ—×É—ÐÉ—ÉÉ—ÂÉ—»É—´É—­É—¦É—ŸÉ—˜É—‘É—ŠÉ—ƒÉ—|É—uÉ—nÉ—gÉ—`É—YÉ—RÉ—KÉ—DÉ—=É—6É—/É—(É—!É—É—É— É—É—þÈ—÷È—ðÈ—éÈ—âÈ—ÛÈ—ÔÈ—ÍÈ—ÆÈ—¿È—¸È—±È—ªÈ—£È—œÈ—•È—ŽÈ—‡È—€È—yÈ—rÈ—kÈ—dÈ—]È—VÈ—OÈ—HÈ—AÈ—:È—3È—,È—%È—È—È—È— È—È—ûÇ—ôÇ—íÇ—æÇ—ßÇ—ØÇ—ÑÇ—ÊÇ—ÃÇ—¼Ç—µÇ—®Ç—§Ç— Ç—™Ç—’Ç—‹Ç—„Ç—}Ç—vÇ—oÇ—hÇ—aÇ—ZÇ—SÇ—LÇ—EÇ—>Ç—7Ç—0Ç—)Ç—"Ç—Ç—Ç— Ç—Ç—ÿÆ—øÆ—ñÆ—êÆ—ãÆ—ÜÆ—ÕÆ—ÎÆ—ÇÆ—ÀÆ—¹Æ—²Æ—«Æ—¤Æ—Æ—–Æ—Æ—ˆÆ—Æ—zÆ—sÆ—lÆ—eÆ—^Æ—WÆ—PÆ—IÆ—BÆ—;Æ—4Æ—-Æ—&Æ—Æ—Æ—Æ— Æ—Æ—üÅ—õÅ—îÅ—çÅ—àÅ—ÙÅ—ÒÅ—ËÅ—ÄÅ—½Å—¶Å—¯Å—¨Å—¡Å—šÅ—“Å—ŒÅ—…Å—~Å—wÅ—pÅ—iÅ—bÅ—[Å—TÅ—MÅ—FÅ—?Å—8Å—1Å—*Å—#Å—Å—Å—Å—Å—Å—ùÄ—òÄ—ëÄ—äÄ—ÝÄ—ÖÄ—ÏÄ—ÈÄ—ÁÄ—ºÄ—³Ä—¬Ä—¥Ä—žÄ——Ä—Ä—‰Ä—‚Ä—{Ä—tÄ—mÄ—fÄ—_Ä—XÄ—QÄ—JÄ—CÄ—<Ä—5Ä—.Ä—'Ä— Ä—Ä—Ä— Ä—Ä—ý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכ×”×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××ú—ó—ì—å—Þ—×—ЗÉ——»Â—´Â—­Â—¦Â—ŸÂ—˜Â—‘—ŠÂ—ƒÂ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þÁ—÷Á—ðÁ—éÁ—âÁ—ÛÁ—ÔÁ—ÍÁ—ÆÁ—¿Á—¸Á—±Á—ªÁ—£Á—œÁ—•Á—ŽÁ—‡Á—€Á—yÁ—rÁ—kÁ—dÁ—]Á—VÁ—OÁ—HÁ—AÁ—:Á—3Á—,Á—%Á—Á—Á—Á— Á—Á—ûÀ—ôÀ—íÀ—æÀ—ßÀ—ØÀ—ÑÀ—ÊÀ—ÃÀ—¼À—µÀ—®À—§À— À—™À—’À—‹À—„À—}À—vÀ—oÀ—hÀ—aÀ—ZÀ—SÀ—LÀ—EÀ—>À—7À—0À—)À—"À—À—À— À—À—ÿ¿—ø¿—ñ¿—ê¿—ã¿—Ü¿—Õ¿—ο—Ç¿—À¿—¹¿—²¿—«¿—¤¿—¿—–¿—¿—ˆ¿—¿—z¿—s¿—l¿—e¿—^¿—W¿—P¿—I¿—B¿—;¿—4¿—-¿—&¿—¿—¿—¿— ¿—¿—ü¾—õ¾—î¾—ç¾—ྗÙ¾—Ò¾—˾—ľ—½¾—¶¾—¯¾—¨¾—¡¾—š¾—“¾—Œ¾—…¾—~¾—w¾—p¾—i¾—b¾—[¾—T¾—M¾—F¾—?¾—8¾—1¾—*¾—#¾—¾—¾—¾—¾—¾—ù½—ò½—ë½—ä½—ݽ—Ö½—Ͻ—Ƚ—Á½—º½—³½—¬½—¥½—ž½——½—½—‰½—‚½—{½—t½—m½—f½—_½—X½—Q½—J½—C½—<½—5½—.½—'½— ½—½—½— ½—½—ý¼—ö¼—ï¼—è¼—á¼—Ú¼—Ó¼—̼—ż—¾¼—·¼—°¼—©¼—¢¼—›¼—”¼—¼—†¼—¼—x¼—q¼—j¼—c¼—\¼—U¼—N¼—G¼—@¼—9¼—2¼—+¼—$¼—¼—¼—¼—¼—¼—ú»—ó»—ì»—å»—Þ»—×»—л—É»—»—»»—´»—­»—¦»—Ÿ»—˜»—‘»—Š»—ƒ»—|»—u»—n»—g»—`»—Y»—R»—K»—D»—=»—6»—/»—(»—!»—»—»— »—»—þº—÷º—ðº—麗⺗Ûº—Ôº—ͺ—ƺ—¿º—¸º—±º—ªº—£º—œº—•º—Žº—‡º—€º—yº—rº—kº—dº—]º—Vº—Oº—Hº—Aº—:º—3º—,º—%º—º—º—º— º—º—û¹—ô¹—í¹—æ¹—ß¹—ع—ѹ—ʹ—ù—¼¹—µ¹—®¹—§¹— ¹—™¹—’¹—‹¹—„¹—}¹—v¹—o¹—h¹—a¹—Z¹—S¹—L¹—E¹—>¹—7¹—0¹—)¹—"¹—¹—¹— ¹—¹—ÿ¸—ø¸—ñ¸—긗㸗ܸ—Õ¸—θ—Ǹ—À¸—¹¸—²¸—«¸—¤¸—¸—–¸—¸—ˆ¸—¸—z¸—s¸—l¸—e¸—^¸—W¸—P¸—I¸—B¸—;¸—4¸—-¸—&¸—¸—¸—¸— ¸—¸—ü·—õ·—î·—ç·—à·—Ù·—Ò·—Ë·—Ä·—½·—¶·—¯·—¨·—¡·—š·—“·—Œ·—…·—~·—w·—p·—i·—b·—[·—T·—M·—F·—?·—8·—1·—*·—#·—·—·—·—·—·—ù¶—ò¶—ë¶—ä¶—ݶ—Ö¶—϶—ȶ—Á¶—º¶—³¶—¬¶—¥¶—ž¶——¶—¶—‰¶—‚¶—{¶—t¶—m¶—f¶—_¶—X¶—Q¶—J¶—C¶—<¶—5¶—.¶—'¶— ¶—¶—¶— ¶—¶—ýµ—öµ—ïµ—èµ—áµ—Úµ—Óµ—̵—ŵ—¾µ—·µ—°µ—©µ—¢µ—›µ—”µ—µ—†µ—µ—xµ—qµ—jµ—cµ—\µ—Uµ—Nµ—Gµ—@µ—9µ—2µ—+µ—$µ—µ—µ—µ—µ—µ—ú´—ó´—ì´—å´—Þ´—×´—д—É´—´—»´—´´—­´—¦´—Ÿ´—˜´—‘´—Š´—ƒ´—|´—u´—n´—g´—`´—Y´—R´—K´—D´—=´—6´—/´—(´—!´—´—´— ´—´—þ³—÷³—ð³—é³—â³—Û³—Ô³—ͳ—Ƴ—¿³—¸³—±³—ª³—£³—œ³—•³—޳—‡³—€³—y³—r³—k³—d³—]³—V³—O³—H³—A³—:³—3³—,³—%³—³—³—³— ³—³—û²—ô²—í²—æ²—ß²—ز—Ѳ—ʲ—ò—¼²—µ²—®²—§²— ²—™²—’²—‹²—„²—}²—v²—o²—h²—a²—Z²—S²—L²—E²—>²—7²—0²—)²—"²—²—²— ²—²—ÿ±—ø±—ñ±—ê±—ã±—ܱ—Õ±—α—DZ—À±—¹±—²±—«±—¤±—±—–±—±—ˆ±—±—z±—s±—l±—e±—^±—W±—P±—I±—B±—;±—4±—-±—&±—±—±—±— ±—±—ü°—õ°—î°—ç°—à°—Ù°—Ò°—˰—İ—½°—¶°—¯°—¨°—¡°—š°—“°—Œ°—…°—~°—w°—p°—i°—b°—[°—T°—M°—F°—?°—8°—1°—*°—#°—°—°—°—°—°—ù¯—ò¯—믗䯗ݯ—Ö¯—ϯ—ȯ—Á¯—º¯—³¯—¬¯—¥¯—ž¯——¯—¯—‰¯—‚¯—{¯—t¯—m¯—f¯—_¯—X¯—Q¯—J¯—C¯—<¯—5¯—.¯—'¯— ¯—¯—¯— ¯—¯—ý®—ö®—ï®—è®—á®—Ú®—Ó®—Ì®—Å®—¾®—·®—°®—©®—¢®—›®—”®—®—†®—®—x®—q®—j®—c®—\®—U®—N®—G®—@®—9®—2®—+®—$®—®—®—®—®—®—ú­—ó­—ì­—å­—Þ­—×­—Э—É­—­—»­—´­—­­—¦­—Ÿ­—˜­—‘­—Š­—ƒ­—|­—u­—n­—g­—`­—Y­—R­—K­—D­—=­—6­—/­—(­—!­—­—­— ­—­—þ¬—÷¬—ð¬—鬗⬗Û¬—Ô¬—ͬ—Ƭ—¿¬—¸¬—±¬—ª¬—£¬—œ¬—•¬—ެ—‡¬—€¬—y¬—r¬—k¬—d¬—]¬—V¬—O¬—H¬—A¬—:¬—3¬—,¬—%¬—¬—¬—¬— ¬—¬—û«—ô«—í«—æ«—ß«—Ø«—Ñ«—Ê«—ë—¼«—µ«—®«—§«— «—™«—’«—‹«—„«—}«—v«—o«—h«—a«—Z«—S«—L«—E«—>«—7«—0«—)«—"«—«—«— «—«—ÿª—øª—ñª—ꪗ㪗ܪ—Õª—Ϊ—Ǫ—Àª—¹ª—²ª—«ª—¤ª—ª—–ª—ª—ˆª—ª—zª—sª—lª—eª—^ª—Wª—Pª—Iª—Bª—;ª—4ª—-ª—&ª—ª—ª—ª— ª—ª—ü©—õ©—î©—ç©—à©—Ù©—Ò©—Ë©—Ä©—½©—¶©—¯©—¨©—¡©—š©—“©—Œ©—…©—~©—w©—p©—i©—b©—[©—T©—M©—F©—?©—8©—1©—*©—#©—©—©—©—©—©—ù¨—ò¨—먗䨗ݨ—Ö¨—Ϩ—Ȩ—Á¨—º¨—³¨—¬¨—¥¨—ž¨——¨—¨—‰¨—‚¨—{¨—t¨—m¨—f¨—_¨—X¨—Q¨—J¨—C¨—<¨—5¨—.¨—'¨— ¨—¨—¨— ¨—¨—ý§—ö§—ï§—è§—á§—Ú§—Ó§—̧—ŧ—¾§—·§—°§—©§—¢§—›§—”§—§—†§—§—x§—q§—j§—c§—\§—U§—N§—G§—@§—9§—2§—+§—$§—§—§—§—§—§—ú¦—ó¦—즗妗Þ¦—צ—Ц—ɦ—¦—»¦—´¦—­¦—¦¦—Ÿ¦—˜¦—‘¦—Ц—ƒ¦—|¦—u¦—n¦—g¦—`¦—Y¦—R¦—K¦—D¦—=¦—6¦—/¦—(¦—!¦—¦—¦— ¦—¦—þ¥—÷¥—ð¥—饗⥗Û¥—Ô¥—Í¥—Æ¥—¿¥—¸¥—±¥—ª¥—£¥—œ¥—•¥—Ž¥—‡¥—€¥—y¥—r¥—k¥—d¥—]¥—V¥—O¥—H¥—A¥—:¥—3¥—,¥—%¥—¥—¥—¥— ¥—¥—û¤—ô¤—í¤—椗ߤ—ؤ—Ѥ—ʤ—ä—¼¤—µ¤—®¤—§¤— ¤—™¤—’¤—‹¤—„¤—}¤—v¤—o¤—h¤—a¤—Z¤—S¤—L¤—E¤—>¤—7¤—0¤—)¤—"¤—¤—¤— ¤—¤—ÿ£—ø£—ñ£—꣗㣗Ü£—Õ£—Σ—Ç£—À£—¹£—²£—«£—¤£—£—–£—£—ˆ£—£—z£—s£—l£—e£—^£—W£—P£—I£—B£—;£—4£—-£—&£—£—£—£— £—£—ü¢—õ¢—碗ࢗÙ¢—Ò¢—Ë¢—Ä¢—½¢—¶¢—¯¢—¨¢—¡¢—𢗓¢—Œ¢—…¢—~¢—w¢—p¢—i¢—b¢—[¢—T¢—M¢—F¢—?¢—8¢—1¢—*¢—#¢—¢—¢—¢—¢—¢—ù¡—ò¡—ë¡—ä¡—Ý¡—Ö¡—Ï¡—È¡—Á¡—º¡—³¡—¬¡—¥¡—ž¡——¡—¡—‰¡—‚¡—{¡—t¡—m¡—f¡—_¡—X¡—Q¡—J¡—C¡—<¡—5¡—.¡—'¡— ¡—¡—¡— ¡—¡—ý —ö —ï —è —á —Ú —Ó —Ì —Å —¾ —· —° —© —¢ —› —” — —† — —x —q —j —c —\ —U —N —G —@ —9 —2 —+ —$ — — — — — —úŸ—óŸ—쟗埗ÞŸ—ן—П—ÉŸ—Ÿ—»Ÿ—´Ÿ—­Ÿ—¦Ÿ—ŸŸ—˜Ÿ—‘Ÿ—ŠŸ—ƒŸ—|Ÿ—uŸ—nŸ—gŸ—`Ÿ—YŸ—RŸ—KŸ—DŸ—=Ÿ—6Ÿ—/Ÿ—(Ÿ—!Ÿ—Ÿ—Ÿ— Ÿ—Ÿ—þž—÷ž—ðž—éž—âž—Ûž—Ôž—Íž—Æž—¿ž—¸ž—±ž—ªž—£ž—œž—•ž—Žž—‡ž—€ž—yž—rž—kž—dž—]ž—Vž—Ož—Hž—Až—:ž—3ž—,ž—%ž—ž—ž—ž— ž—ž—û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿœ—øœ—ñœ—ꜗ㜗Üœ—Õœ—Μ—Çœ—Àœ—¹œ—²œ—«œ—¤œ—œ—–œ—œ—ˆœ—œ—zœ—sœ—lœ—eœ—^œ—Wœ—Pœ—Iœ—Bœ—;œ—4œ—-œ—&œ—œ—œ—œ— œ—œ—ü›—õ›—î›—ç›—à›—Ù›—Ò›—Ë›—Ä›—½›—¶›—¯›—¨›—¡›—š›—“›—Œ›—…›—~›—w›—p›—i›—b›—[›—T›—M›—F›—?›—8›—1›—*›—#›—›—›—›—›—›—ùš—òš—ëš—äš—Ýš—Öš—Ïš—Èš—Áš—ºš—³š—¬š—¥š—žš——š—š—‰š—‚š—{š—tš—mš—fš—_š—Xš—Qš—Jš—Cš—<š—5š—.š—'š— š—š—š— š—š—ý™—ö™—ï™—è™—á™—Ú™—Ó™—Ì™—Å™—¾™—·™—°™—©™—¢™—›™—”™—™—†™—™—x™—q™—j™—c™—\™—U™—N™—G™—@™—9™—2™—+™—$™—™—™—™—™—™—ú˜—ó˜—옗嘗Þ˜—ט—И—ɘ—˜—»˜—´˜—­˜—¦˜—Ÿ˜—˜˜—‘˜—Š˜—ƒ˜—|˜—u˜—n˜—g˜—`˜—Y˜—R˜—K˜—D˜—=˜—6˜—/˜—(˜—!˜—˜—˜— ˜—˜—þ——÷——ð——é——â——Û——Ô——Í——Æ——¿——¸——±——ª——£——œ——•——Ž——‡——€——y——r——k——d——]——V——O——H——A——:——3——,——%———————— ————û–—ô–—í–—æ–—ß–—Ø–—Ñ–—Ê–—Ö—¼–—µ–—®–—§–— –—™–—’–—‹–—„–—}–—v–—o–—h–—a–—Z–—S–—L–—E–—>–—7–—0–—)–—"–—–—–— –—–—ÿ•—ø•—ñ•—ê•—ã•—Ü•—Õ•—Ε—Ç•—À•—¹•—²•—«•—¤•—•—–•—•—ˆ•—•—z•—s•—l•—e•—^•—W•—P•—I•—B•—;•—4•—-•—&•—•—•—•— •—•—ü”—õ”—î”—ç”—à”—Ù”—Ò”—Ë”—Ä”—½”—¶”—¯”—¨”—¡”—š”—“”—Œ”—…”—~”—w”—p”—i”—b”—[”—T”—M”—F”—?”—8”—1”—*”—#”—”—”—”—”—”—ù“—ò“—ë“—ä“—Ý“—Ö“—Ï“—È“—Á“—º“—³“—¬“—¥“—ž“——“—“—‰“—‚“—{“—t“—m“—f“—_“—X“—Q“—J“—C“—<“—5“—.“—'“— “—“—“— “—“—ý’—ö’—ï’—è’—á’—Ú’—Ó’—Ì’—Å’—¾’—·’—°’—©’—¢’—›’—”’—’—†’—’—x’—q’—j’—c’—\’—U’—N’—G’—@’—9’—2’—+’—$’—’—’—’—’—’—ú‘—ó‘—ì‘—å‘—Þ‘—ב—Б—É‘—‘—»‘—´‘—­‘—¦‘—Ÿ‘—˜‘—‘‘—Š‘—ƒ‘—|‘—u‘—n‘—g‘—`‘—Y‘—R‘—K‘—D‘—=‘—6‘—/‘—(‘—!‘—‘—‘— ‘—‘—þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿŽ—øŽ—ñŽ—ꎗ㎗ÜŽ—ÕŽ—ÎŽ—ÇŽ—ÀŽ—¹Ž—²Ž—«Ž—¤Ž—Ž—–Ž—Ž—ˆŽ—Ž—zŽ—sŽ—lŽ—eŽ—^Ž—WŽ—PŽ—IŽ—BŽ—;Ž—4Ž—-Ž—&Ž—Ž—Ž—Ž— Ž—Ž—ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ùŒ—òŒ—댗䌗ÝŒ—ÖŒ—ÏŒ—ÈŒ—ÁŒ—ºŒ—³Œ—¬Œ—¥Œ—žŒ——Œ—Œ—‰Œ—‚Œ—{Œ—tŒ—mŒ—fŒ—_Œ—XŒ—QŒ—JŒ—CŒ—<Œ—5Œ—.Œ—'Œ— Œ—Œ—Œ— Œ—Œ—ý‹—ö‹—ï‹—è‹—á‹—Ú‹—Ó‹—Ì‹—Å‹—¾‹—·‹—°‹—©‹—¢‹—›‹—”‹—‹—†‹—‹—x‹—q‹—j‹—c‹—\‹—U‹—N‹—G‹—@‹—9‹—2‹—+‹—$‹—‹—‹—‹—‹—‹—úŠ—óŠ—슗劗ÞŠ—׊—Њ—ÉŠ—Š—»Š—´Š—­Š—¦Š—ŸŠ—˜Š—‘Š—ŠŠ—ƒŠ—|Š—uŠ—nŠ—gŠ—`Š—YŠ—RŠ—KŠ—DŠ—=Š—6Š—/Š—(Š—!Š—Š—Š— Š—Š—þ‰—÷‰—ð‰—鉗≗Û‰—Ô‰—͉—Ɖ—¿‰—¸‰—±‰—ª‰—£‰—œ‰—•‰—މ—‡‰—€‰—y‰—r‰—k‰—d‰—]‰—V‰—O‰—H‰—A‰—:‰—3‰—,‰—%‰—‰—‰—‰— ‰—‰—ûˆ—ôˆ—툗戗߈—؈—ш—ʈ—È—¼ˆ—µˆ—®ˆ—§ˆ— ˆ—™ˆ—’ˆ—‹ˆ—„ˆ—}ˆ—vˆ—oˆ—hˆ—aˆ—Zˆ—Sˆ—Lˆ—Eˆ—>ˆ—7ˆ—0ˆ—)ˆ—"ˆ—ˆ—ˆ— ˆ—ˆ—ÿ‡—ø‡—ñ‡—ꇗ㇗܇—Õ‡—·—LJ—À‡—¹‡—²‡—«‡—¤‡—‡—–‡—‡—ˆ‡—‡—z‡—s‡—l‡—e‡—^‡—W‡—P‡—I‡—B‡—;‡—4‡—-‡—&‡—‡—‡—‡— ‡—‡—ü†—õ†—熗à†—Ù†—Ò†—ˆ—Ć—½†—¶†—¯†—¨†—¡†—š†—“†—Œ†—…†—~†—w†—p†—i†—b†—[†—T†—M†—F†—?†—8†—1†—*†—#†—†—†—†—†—†—ù…—ò…—ë…—ä…—Ý…—Ö…—Ï…—È…—Á…—º…—³…—¬…—¥…—ž…——…—…—‰…—‚…—{…—t…—m…—f…—_…—X…—Q…—J…—C…—<…—5…—.…—'…— …—…—…— …—…—ý„—ö„—ï„—è„—á„—Ú„—Ó„—Ì„—Å„—¾„—·„—°„—©„—¢„—›„—”„—„—†„—„—x„—q„—j„—c„—\„—U„—N„—G„—@„—9„—2„—+„—$„—„—„—„—„—„—úƒ—óƒ—샗僗Þƒ—׃—Ѓ—Ƀ—ƒ—»ƒ—´ƒ—­ƒ—¦ƒ—Ÿƒ—˜ƒ—‘ƒ—Šƒ—ƒƒ—|ƒ—uƒ—nƒ—gƒ—`ƒ—Yƒ—Rƒ—Kƒ—Dƒ—=ƒ—6ƒ—/ƒ—(ƒ—!ƒ—ƒ—ƒ— ƒ—ƒ—þ‚—÷‚—ð‚—é‚—â‚—Û‚—Ô‚—Í‚—Æ‚—¿‚—¸‚—±‚—ª‚—£‚—œ‚—•‚—Ž‚—‡‚—€‚—y‚—r‚—k‚—d‚—]‚—V‚—O‚—H‚—A‚—:‚—3‚—,‚—%‚—‚—‚—‚— ‚—‚—û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ€—ø€—ñ€—ꀗ〗Ü€—Õ€—΀—Ç€—À€—¹€—²€—«€—¤€—€—–€—€—ˆ€—€—z€—s€—l€—e€—^€—W€—P€—I€—B€—;€—4€—-€—&€—€—€—€— €—€—ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù~—ò~—ë~—ä~—Ý~—Ö~—Ï~—È~—Á~—º~—³~—¬~—¥~—ž~——~—~—‰~—‚~—{~—t~—m~—f~—_~—X~—Q~—J~—C~—<~—5~—.~—'~— ~—~—~— ~—~—ý}—ö}—ï}—è}—á}—Ú}—Ó}—Ì}—Å}—¾}—·}—°}—©}—¢}—›}—”}—}—†}—}—x}—q}—j}—c}—\}—U}—N}—G}—@}—9}—2}—+}—$}—}—}—}—}—}—ú|—ó|—ì|—å|—Þ|—×|—Ð|—É|—Â|—»|—´|—­|—¦|—Ÿ|—˜|—‘|—Š|—ƒ|—||—u|—n|—g|—`|—Y|—R|—K|—D|—=|—6|—/|—(|—!|—|—|— |—|—þ{—÷{—ð{—é{—â{—Û{—Ô{—Í{—Æ{—¿{—¸{—±{—ª{—£{—œ{—•{—Ž{—‡{—€{—y{—r{—k{—d{—]{—V{—O{—H{—A{—:{—3{—,{—%{—{—{—{— {—{—ûz—ôz—íz—æz—ßz—Øz—Ñz—Êz—Ãz—¼z—µz—®z—§z— z—™z—’z—‹z—„z—}z—vz—oz—hz—az—Zz—Sz—Lz—Ez—>z—7z—0z—)z—"z—z—z— z—z—ÿy—øy—ñy—êy—ãy—Üy—Õy—Îy—Çy—Ày—¹y—²y—«y—¤y—y—–y—y—ˆy—y—zy—sy—ly—ey—^y—Wy—Py—Iy—By—;y—4y—-y—&y—y—y—y— y—y—üx—õx—îx—çx—àx—Ùx—Òx—Ëx—Äx—½x—¶x—¯x—¨x—¡x—šx—“x—Œx—…x—~x—wx—px—ix—bx—[x—Tx—Mx—Fx—?x—8x—1x—*x—#x—x—x—x—x—x—ùw—òw—ëw—äw—Ýw—Öw—Ïw—Èw—Áw—ºw—³w—¬w—¥w—žw——w—w—‰w—‚w—{w—tw—mw—fw—_w—Xw—Qw—Jw—Cw—s—7s—0s—)s—"s—s—s— s—s—ÿr—ør—ñr—êr—ãr—Ür—Õr—Îr—Çr—Àr—¹r—²r—«r—¤r—r—–r—r—ˆr—r—zr—sr—lr—er—^r—Wr—Pr—Ir—Br—;r—4r—-r—&r—r—r—r— r—r—üq—õq—îq—çq—àq—Ùq—Òq—Ëq—Äq—½q—¶q—¯q—¨q—¡q—šq—“q—Œq—…q—~q—wq—pq—iq—bq—[q—Tq—Mq—Fq—?q—8q—1q—*q—#q—q—q—q—q—q—ùp—òp—ëp—äp—Ýp—Öp—Ïp—Èp—Áp—ºp—³p—¬p—¥p—žp——p—p—‰p—‚p—{p—tp—mp—fp—_p—Xp—Qp—Jp—Cp—l—7l—0l—)l—"l—l—l— l—l—ÿk—øk—ñk—êk—ãk—Ük—Õk—Îk—Çk—Àk—¹k—²k—«k—¤k—k—–k—k—ˆk—k—zk—sk—lk—ek—^k—Wk—Pk—Ik—Bk—;k—4k—-k—&k—k—k—k— k—k—üj—õj—îj—çj—àj—Ùj—Òj—Ëj—Äj—½j—¶j—¯j—¨j—¡j—šj—“j—Œj—…j—~j—wj—pj—ij—bj—[j—Tj—Mj—Fj—?j—8j—1j—*j—#j—j—j—j—j—j—ùi—òi—ëi—äi—Ýi—Öi—Ïi—Èi—Ái—ºi—³i—¬i—¥i—ži——i—i—‰i—‚i—{i—ti—mi—fi—_i—Xi—Qi—Ji—Ci—e—7e—0e—)e—"e—e—e— e—e—ÿd—ød—ñd—êd—ãd—Üd—Õd—Îd—Çd—Àd—¹d—²d—«d—¤d—d—–d—d—ˆd—d—zd—sd—ld—ed—^d—Wd—Pd—Id—Bd—;d—4d—-d—&d—d—d—d— d—d—üc—õc—îc—çc—àc—Ùc—Òc—Ëc—Äc—½c—¶c—¯c—¨c—¡c—šc—“c—Œc—…c—~c—wc—pc—ic—bc—[c—Tc—Mc—Fc—?c—8c—1c—*c—#c—c—c—c—c—c—ùb—òb—ëb—äb—Ýb—Öb—Ïb—Èb—Áb—ºb—³b—¬b—¥b—žb——b—b—‰b—‚b—{b—tb—mb—fb—_b—Xb—Qb—Jb—Cb—^—7^—0^—)^—"^—^—^— ^—^—ÿ]—ø]—ñ]—ê]—ã]—Ü]—Õ]—Î]—Ç]—À]—¹]—²]—«]—¤]—]—–]—]—ˆ]—]—z]—s]—l]—e]—^]—W]—P]—I]—B]—;]—4]—-]—&]—]—]—]— ]—]—ü\—õ\—î\—ç\—à\—Ù\—Ò\—Ë\—Ä\—½\—¶\—¯\—¨\—¡\—š\—“\—Œ\—…\—~\—w\—p\—i\—b\—[\—T\—M\—F\—?\—8\—1\—*\—#\—\—\—\—\—\—ù[—ò[—ë[—ä[—Ý[—Ö[—Ï[—È[—Á[—º[—³[—¬[—¥[—ž[——[—[—‰[—‚[—{[—t[—m[—f[—_[—X[—Q[—J[—C[—<[—5[—.[—'[— [—[—[— [—[—ýZ—öZ—ïZ—èZ—áZ—ÚZ—ÓZ—ÌZ—ÅZ—¾Z—·Z—°Z—©Z—¢Z—›Z—”Z—Z—†Z—Z—xZ—qZ—jZ—cZ—\Z—UZ—NZ—GZ—@Z—9Z—2Z—+Z—$Z—Z—Z—Z—Z—Z—úY—óY—ìY—åY—ÞY—×Y—ÐY—ÉY—ÂY—»Y—´Y—­Y—¦Y—ŸY—˜Y—‘Y—ŠY—ƒY—|Y—uY—nY—gY—`Y—YY—RY—KY—DY—=Y—6Y—/Y—(Y—!Y—Y—Y— Y—Y—þX—÷X—ðX—éX—âX—ÛX—ÔX—ÍX—ÆX—¿X—¸X—±X—ªX—£X—œX—•X—ŽX—‡X—€X—yX—rX—kX—dX—]X—VX—OX—HX—AX—:X—3X—,X—%X—X—X—X— X—X—ûW—ôW—íW—æW—ßW—ØW—ÑW—ÊW—ÃW—¼W—µW—®W—§W— W—™W—’W—‹W—„W—}W—vW—oW—hW—aW—ZW—SW—LW—EW—>W—7W—0W—)W—"W—W—W— W—W—ÿV—øV—ñV—êV—ãV—ÜV—ÕV—ÎV—ÇV—ÀV—¹V—²V—«V—¤V—V—–V—V—ˆV—V—zV—sV—lV—eV—^V—WV—PV—IV—BV—;V—4V—-V—&V—V—V—V— V—V—üU—õU—îU—çU—àU—ÙU—ÒU—ËU—ÄU—½U—¶U—¯U—¨U—¡U—šU—“U—ŒU—…U—~U—wU—pU—iU—bU—[U—TU—MU—FU—?U—8U—1U—*U—#U—U—U—U—U—U—ùT—òT—ëT—äT—ÝT—ÖT—ÏT—ÈT—ÁT—ºT—³T—¬T—¥T—žT——T—T—‰T—‚T—{T—tT—mT—fT—_T—XT—QT—JT—CT—P—7P—0P—)P—"P—P—P— P—P—ÿO—øO—ñO—êO—ãO—ÜO—ÕO—ÎO—ÇO—ÀO—¹O—²O—«O—¤O—O—–O—O—ˆO—O—zO—sO—lO—eO—^O—WO—PO—IO—BO—;O—4O—-O—&O—O—O—O— O—O—üN—õN—îN—çN—àN—ÙN—ÒN—ËN—ÄN—½N—¶N—¯N—¨N—¡N—šN—“N—ŒN—…N—~N—wN—pN—iN—bN—[N—TN—MN—FN—?N—8N—1N—*N—#N—N—N—N—N—N—ùM—òM—ëM—äM—ÝM—ÖM—ÏM—ÈM—ÁM—ºM—³M—¬M—¥M—žM——M—M—‰M—‚M—{M—tM—mM—fM—_M—XM—QM—JM—CM—I—7I—0I—)I—"I—I—I— I—I—ÿH—øH—ñH—êH—ãH—ÜH—ÕH—ÎH—ÇH—ÀH—¹H—²H—«H—¤H—H—–H—H—ˆH—H—zH—sH—lH—eH—^H—WH—PH—IH—BH—;H—4H—-H—&H—H—H—H— H—H—üG—õG—îG—çG—àG—ÙG—ÒG—ËG—ÄG—½G—¶G—¯G—¨G—¡G—šG—“G—ŒG—…G—~G—wG—pG—iG—bG—[G—TG—MG—FG—?G—8G—1G—*G—#G—G—G—G—G—G—ùF—òF—ëF—äF—ÝF—ÖF—ÏF—ÈF—ÁF—ºF—³F—¬F—¥F—žF——F—F—‰F—‚F—{F—tF—mF—fF—_F—XF—QF—JF—CF—B—7B—0B—)B—"B—B—B— B—B—ÿA—øA—ñA—êA—ãA—ÜA—ÕA—ÎA—ÇA—ÀA—¹A—²A—«A—¤A—A—–A—A—ˆA—A—zA—sA—lA—eA—^A—WA—PA—IA—BA—;A—4A—-A—&A—A—A—A— A—A—ü@—õ@—î@—ç@—à@—Ù@—Ò@—Ë@—Ä@—½@—¶@—¯@—¨@—¡@—š@—“@—Œ@—…@—~@—w@—p@—i@—b@—[@—T@—M@—F@—?@—8@—1@—*@—#@—@—@—@—@—@—ù?—ò?—ë?—ä?—Ý?—Ö?—Ï?—È?—Á?—º?—³?—¬?—¥?—ž?——?—?—‰?—‚?—{?—t?—m?—f?—_?—X?—Q?—J?—C?——ö>—ï>—è>—á>—Ú>—Ó>—Ì>—Å>—¾>—·>—°>—©>—¢>—›>—”>—>—†>—>—x>—q>—j>—c>—\>—U>—N>—G>—@>—9>—2>—+>—$>—>—>—>—>—>—ú=—ó=—ì=—å=—Þ=—×=—Ð=—É=—Â=—»=—´=—­=—¦=—Ÿ=—˜=—‘=—Š=—ƒ=—|=—u=—n=—g=—`=—Y=—R=—K=—D=—==—6=—/=—(=—!=—=—=— =—=—þ<—÷<—ð<—é<—â<—Û<—Ô<—Í<—Æ<—¿<—¸<—±<—ª<—£<—œ<—•<—Ž<—‡<—€<—y<—r<—k<—d<—]<—V<—O<—H<—A<—:<—3<—,<—%<—<—<—<— <—<—û;—ô;—í;—æ;—ß;—Ø;—Ñ;—Ê;—Ã;—¼;—µ;—®;—§;— ;—™;—’;—‹;—„;—};—v;—o;—h;—a;—Z;—S;—L;—E;—>;—7;—0;—);—";—;—;— ;—;—ÿ:—ø:—ñ:—ê:—ã:—Ü:—Õ:—Î:—Ç:—À:—¹:—²:—«:—¤:—:—–:—:—ˆ:—:—z:—s:—l:—e:—^:—W:—P:—I:—B:—;:—4:—-:—&:—:—:—:— :—:—ü9—õ9—î9—ç9—à9—Ù9—Ò9—Ë9—Ä9—½9—¶9—¯9—¨9—¡9—š9—“9—Œ9—…9—~9—w9—p9—i9—b9—[9—T9—M9—F9—?9—89—19—*9—#9—9—9—9—9—9—ù8—ò8—ë8—ä8—Ý8—Ö8—Ï8—È8—Á8—º8—³8—¬8—¥8—ž8——8—8—‰8—‚8—{8—t8—m8—f8—_8—X8—Q8—J8—C8—<8—58—.8—'8— 8—8—8— 8—8—ý7—ö7—ï7—è7—á7—Ú7—Ó7—Ì7—Å7—¾7—·7—°7—©7—¢7—›7—”7—7—†7—7—x7—q7—j7—c7—\7—U7—N7—G7—@7—97—27—+7—$7—7—7—7—7—7—ú6—ó6—ì6—å6—Þ6—×6—Ð6—É6—Â6—»6—´6—­6—¦6—Ÿ6—˜6—‘6—Š6—ƒ6—|6—u6—n6—g6—`6—Y6—R6—K6—D6—=6—66—/6—(6—!6—6—6— 6—6—þ5—÷5—ð5—é5—â5—Û5—Ô5—Í5—Æ5—¿5—¸5—±5—ª5—£5—œ5—•5—Ž5—‡5—€5—y5—r5—k5—d5—]5—V5—O5—H5—A5—:5—35—,5—%5—5—5—5— 5—5—û4—ô4—í4—æ4—ß4—Ø4—Ñ4—Ê4—Ã4—¼4—µ4—®4—§4— 4—™4—’4—‹4—„4—}4—v4—o4—h4—a4—Z4—S4—L4—E4—>4—74—04—)4—"4—4—4— 4—4—ÿ3—ø3—ñ3—ê3—ã3—Ü3—Õ3—Î3—Ç3—À3—¹3—²3—«3—¤3—3—–3—3—ˆ3—3—z3—s3—l3—e3—^3—W3—P3—I3—B3—;3—43—-3—&3—3—3—3— 3—3—ü2—õ2—î2—ç2—à2—Ù2—Ò2—Ë2—Ä2—½2—¶2—¯2—¨2—¡2—š2—“2—Œ2—…2—~2—w2—p2—i2—b2—[2—T2—M2—F2—?2—82—12—*2—#2—2—2—2—2—2—ù1—ò1—ë1—ä1—Ý1—Ö1—Ï1—È1—Á1—º1—³1—¬1—¥1—ž1——1—1—‰1—‚1—{1—t1—m1—f1—_1—X1—Q1—J1—C1—<1—51—.1—'1— 1—1—1— 1—1—ý0—ö0—ï0—è0—á0—Ú0—Ó0—Ì0—Å0—¾0—·0—°0—©0—¢0—›0—”0—0—†0—0—x0—q0—j0—c0—\0—U0—N0—G0—@0—90—20—+0—$0—0—0—0—0—0—ú/—ó/—ì/—å/—Þ/—×/—Ð/—É/—Â/—»/—´/—­/—¦/—Ÿ/—˜/—‘/—Š/—ƒ/—|/—u/—n/—g/—`/—Y/—R/—K/—D/—=/—6/—//—(/—!/—/—/— /—/—þ.—÷.—ð.—é.—â.—Û.—Ô.—Í.—Æ.—¿.—¸.—±.—ª.—£.—œ.—•.—Ž.—‡.—€.—y.—r.—k.—d.—].—V.—O.—H.—A.—:.—3.—,.—%.—.—.—.— .—.—û-—ô-—í-—æ-—ß-—Ø-—Ñ-—Ê-—Ã-—¼-—µ-—®-—§-— -—™-—’-—‹-—„-—}-—v-—o-—h-—a-—Z-—S-—L-—E-—>-—7-—0-—)-—"-—-—-— -—-—ÿ,—ø,—ñ,—ê,—ã,—Ü,—Õ,—Î,—Ç,—À,—¹,—²,—«,—¤,—,—–,—,—ˆ,—,—z,—s,—l,—e,—^,—W,—P,—I,—B,—;,—4,—-,—&,—,—,—,— ,—,—ü+—õ+—î+—ç+—à+—Ù+—Ò+—Ë+—Ä+—½+—¶+—¯+—¨+—¡+—š+—“+—Œ+—…+—~+—w+—p+—i+—b+—[+—T+—M+—F+—?+—8+—1+—*+—#+—+—+—+—+—+—ù*—ò*—ë*—ä*—Ý*—Ö*—Ï*—È*—Á*—º*—³*—¬*—¥*—ž*——*—*—‰*—‚*—{*—t*—m*—f*—_*—X*—Q*—J*—C*—<*—5*—.*—'*— *—*—*— *—*—ý)—ö)—ï)—è)—á)—Ú)—Ó)—Ì)—Å)—¾)—·)—°)—©)—¢)—›)—”)—)—†)—)—x)—q)—j)—c)—\)—U)—N)—G)—@)—9)—2)—+)—$)—)—)—)—)—)—ú(—ó(—ì(—å(—Þ(—×(—Ð(—É(—Â(—»(—´(—­(—¦(—Ÿ(—˜(—‘(—Š(—ƒ(—|(—u(—n(—g(—`(—Y(—R(—K(—D(—=(—6(—/(—((—!(—(—(— (—(—þ'—÷'—ð'—é'—â'—Û'—Ô'—Í'—Æ'—¿'—¸'—±'—ª'—£'—œ'—•'—Ž'—‡'—€'—y'—r'—k'—d'—]'—V'—O'—H'—A'—:'—3'—,'—%'—'—'—'— '—'—û&—ô&—í&—æ&—ß&—Ø&—Ñ&—Ê&—Ã&—¼&—µ&—®&—§&— &—™&—’&—‹&—„&—}&—v&—o&—h&—a&—Z&—S&—L&—E&—>&—7&—0&—)&—"&—&—&— &—&—ÿ%—ø%—ñ%—ê%—ã%—Ü%—Õ%—Î%—Ç%—À%—¹%—²%—«%—¤%—%—–%—%—ˆ%—%—z%—s%—l%—e%—^%—W%—P%—I%—B%—;%—4%—-%—&%—%—%—%— %—%—ü$—õ$—î$—ç$—à$—Ù$—Ò$—Ë$—Ä$—½$—¶$—¯$—¨$—¡$—š$—“$—Œ$—…$—~$—w$—p$—i$—b$—[$—T$—M$—F$—?$—8$—1$—*$—#$—$—$—$—$—$—ù#—ò#—ë#—ä#—Ý#—Ö#—Ï#—È#—Á#—º#—³#—¬#—¥#—ž#——#—#—‰#—‚#—{#—t#—m#—f#—_#—X#—Q#—J#—C#—<#—5#—.#—'#— #—#—#— #—#—ý"—ö"—ï"—è"—á"—Ú"—Ó"—Ì"—Å"—¾"—·"—°"—©"—¢"—›"—”"—"—†"—"—x"—q"—j"—c"—\"—U"—N"—G"—@"—9"—2"—+"—$"—"—"—"—"—"—ú!—ó!—ì!—å!—Þ!—×!—Ð!—É!—Â!—»!—´!—­!—¦!—Ÿ!—˜!—‘!—Š!—ƒ!—|!—u!—n!—g!—`!—Y!—R!—K!—D!—=!—6!—/!—(!—!!—!—!— !—!—þ —÷ —ð —é —â —Û —Ô —Í —Æ —¿ —¸ —± —ª —£ —œ —• —Ž —‡ —€ —y —r —k —d —] —V —O —H —A —: —3 —, —% — — — — — —û—ô—í—æ—ߗؗїʗ×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ—ø—ñ—ê—ã—ܗ՗ΗǗÀ—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú—ó—ì—å—ޗחЗɗ—»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û—ô—í—æ—ߗؗїʗ×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ—ø—ñ—ê—ã—ܗ՗ΗǗÀ—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú—ó—ì—å—ޗחЗɗ—»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û—ô—í—æ—ߗؗїʗ×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ—ø—ñ—ê—ã—ܗ՗ΗǗÀ—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý —ö —ï —è —á —Ú —Ó —Ì —Å —¾ —· —° —© —¢ —› —” — —† — —x —q —j —c —\ —U —N —G —@ —9 —2 —+ —$ — — — — — —ú —ó —ì —å —Þ —× —Ð —É — —» —´ —­ —¦ —Ÿ —˜ —‘ —Š —ƒ —| —u —n —g —` —Y —R —K —D —= —6 —/ —( —! — — — — —þ —÷ —ð —é —â —Û —Ô —Í —Æ —¿ —¸ —± —ª —£ —œ —• —Ž —‡ —€ —y —r —k —d —] —V —O —H —A —: —3 —, —% — — — — — —û —ô —í —æ —ß —Ø —Ñ —Ê —à —¼ —µ —® —§ —  —™ —’ —‹ —„ —} —v —o —h —a —Z —S —L —E —> —7 —0 —) —" — — — — —ÿ —ø —ñ —ê —ã —Ü —Õ —Î —Ç —À —¹ —² —« —¤ — —– — —ˆ — —z —s —l —e —^ —W —P —I —B —; —4 —- —& — — — — — —ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú—ó—ì—å—ޗחЗɗ—»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û—ô—í—æ—ߗؗїʗ×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ—ø—ñ—ê—ã—ܗ՗ΗǗÀ—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ýÿ–öÿ–ïÿ–èÿ–áÿ–Úÿ–Óÿ–Ìÿ–Åÿ–¾ÿ–·ÿ–°ÿ–©ÿ–¢ÿ–›ÿ–”ÿ–ÿ–†ÿ–ÿ–xÿ–qÿ–jÿ–cÿ–\ÿ–Uÿ–Nÿ–Gÿ–@ÿ–9ÿ–2ÿ–+ÿ–$ÿ–ÿ–ÿ–ÿ–ÿ–ÿ–úþ–óþ–ìþ–åþ–Þþ–×þ–Ðþ–Éþ–Âþ–»þ–´þ–­þ–¦þ–Ÿþ–˜þ–‘þ–Šþ–ƒþ–|þ–uþ–nþ–gþ–`þ–Yþ–Rþ–Kþ–Dþ–=þ–6þ–/þ–(þ–!þ–þ–þ– þ–þ–þý–÷ý–ðý–éý–âý–Ûý–Ôý–Íý–Æý–¿ý–¸ý–±ý–ªý–£ý–œý–•ý–Žý–‡ý–€ý–yý–rý–ký–dý–]ý–Vý–Oý–Hý–Aý–:ý–3ý–,ý–%ý–ý–ý–ý– ý–ý–ûü–ôü–íü–æü–ßü–Øü–Ñü–Êü–Ãü–¼ü–µü–®ü–§ü– ü–™ü–’ü–‹ü–„ü–}ü–vü–oü–hü–aü–Zü–Sü–Lü–Eü–>ü–7ü–0ü–)ü–"ü–ü–ü– ü–ü–ÿû–øû–ñû–êû–ãû–Üû–Õû–Îû–Çû–Àû–¹û–²û–«û–¤û–û––û–û–ˆû–û–zû–sû–lû–eû–^û–Wû–Pû–Iû–Bû–;û–4û–-û–&û–û–û–û– û–û–üú–õú–îú–çú–àú–Ùú–Òú–Ëú–Äú–½ú–¶ú–¯ú–¨ú–¡ú–šú–“ú–Œú–…ú–~ú–wú–pú–iú–bú–[ú–Tú–Mú–Fú–?ú–8ú–1ú–*ú–#ú–ú–ú–ú–ú–ú–ùù–òù–ëù–äù–Ýù–Öù–Ïù–Èù–Áù–ºù–³ù–¬ù–¥ù–žù–—ù–ù–‰ù–‚ù–{ù–tù–mù–fù–_ù–Xù–Qù–Jù–Cù–<ù–5ù–.ù–'ù– ù–ù–ù– ù–ù–ýø–öø–ïø–èø–áø–Úø–Óø–Ìø–Åø–¾ø–·ø–°ø–©ø–¢ø–›ø–”ø–ø–†ø–ø–xø–qø–jø–cø–\ø–Uø–Nø–Gø–@ø–9ø–2ø–+ø–$ø–ø–ø–ø–ø–ø–ú÷–ó÷–ì÷–å÷–Þ÷–×÷–Ð÷–É÷–Â÷–»÷–´÷–­÷–¦÷–Ÿ÷–˜÷–‘÷–Š÷–ƒ÷–|÷–u÷–n÷–g÷–`÷–Y÷–R÷–K÷–D÷–=÷–6÷–/÷–(÷–!÷–÷–÷– ÷–÷–þö–÷ö–ðö–éö–âö–Ûö–Ôö–Íö–Æö–¿ö–¸ö–±ö–ªö–£ö–œö–•ö–Žö–‡ö–€ö–yö–rö–kö–dö–]ö–Vö–Oö–Hö–Aö–:ö–3ö–,ö–%ö–ö–ö–ö– ö–ö–ûõ–ôõ–íõ–æõ–ßõ–Øõ–Ñõ–Êõ–Ãõ–¼õ–µõ–®õ–§õ– õ–™õ–’õ–‹õ–„õ–}õ–võ–oõ–hõ–aõ–Zõ–Sõ–Lõ–Eõ–>õ–7õ–0õ–)õ–"õ–õ–õ– õ–õ–ÿô–øô–ñô–êô–ãô–Üô–Õô–Îô–Çô–Àô–¹ô–²ô–«ô–¤ô–ô––ô–ô–ˆô–ô–zô–sô–lô–eô–^ô–Wô–Pô–Iô–Bô–;ô–4ô–-ô–&ô–ô–ô–ô– ô–ô–üó–õó–îó–çó–àó–Ùó–Òó–Ëó–Äó–½ó–¶ó–¯ó–¨ó–¡ó–šó–“ó–Œó–…ó–~ó–wó–pó–ió–bó–[ó–Tó–Mó–Fó–?ó–8ó–1ó–*ó–#ó–ó–ó–ó–ó–ó–ùò–òò–ëò–äò–Ýò–Öò–Ïò–Èò–Áò–ºò–³ò–¬ò–¥ò–žò–—ò–ò–‰ò–‚ò–{ò–tò–mò–fò–_ò–Xò–Qò–Jò–Cò–<ò–5ò–.ò–'ò– ò–ò–ò– ò–ò–ýñ–öñ–ïñ–èñ–áñ–Úñ–Óñ–Ìñ–Åñ–¾ñ–·ñ–°ñ–©ñ–¢ñ–›ñ–”ñ–ñ–†ñ–ñ–xñ–qñ–jñ–cñ–\ñ–Uñ–Nñ–Gñ–@ñ–9ñ–2ñ–+ñ–$ñ–ñ–ñ–ñ–ñ–ñ–úð–óð–ìð–åð–Þð–×ð–Ðð–Éð–Âð–»ð–´ð–­ð–¦ð–Ÿð–˜ð–‘ð–Šð–ƒð–|ð–uð–nð–gð–`ð–Yð–Rð–Kð–Dð–=ð–6ð–/ð–(ð–!ð–ð–ð– ð–ð–þï–÷ï–ðï–éï–âï–Ûï–Ôï–Íï–Æï–¿ï–¸ï–±ï–ªï–£ï–œï–•ï–Žï–‡ï–€ï–yï–rï–kï–dï–]ï–Vï–Oï–Hï–Aï–:ï–3ï–,ï–%ï–ï–ï–ï– ï–ï–ûî–ôî–íî–æî–ßî–Øî–Ñî–Êî–Ãî–}î–vî–oî–hî–aî–Zî–Sî–Lî–Eî–>î–7î–0î–)î–"î–î–î– î–î–ÿí–øí–ñí–êí–ãí–Üí–Õí–Îí–Çí–À햹햲햫햤í–í––í–í–ˆí–í–zí–sí–lí–eí–^í–Wí–Pí–Ií–Bí–;í–4í–-í–&í–í–í–í– í–í–üì–õì–îì–çì–àì–Ùì–Òì–Ëì–Ä얽얶얯얨얡얚얓얌얅ì–~ì–wì–pì–iì–bì–[ì–Tì–Mì–Fì–?ì–8ì–1ì–*ì–#ì–ì–ì–ì–ì–ì–ùë–òë–ëë–äë–Ýë–Öë–Ïë–Èë–Á떺떳떬떥떞떗ë–떉떂ë–{ë–të–më–fë–_ë–Xë–Që–Jë–Cë–<ë–5ë–.ë–'ë– ë–ë–ë– ë–ë–ýê–öê–ïê–èê–áê–Úê–Óê–Ìê–Åꖾꖷꖰꖩꖢꖛꖔê–ê–†ê–ê–xê–qê–jê–cê–\ê–Uê–Nê–Gê–@ê–9ê–2ê–+ê–$ê–ê–ê–ê–ê–ê–úé–óé–ìé–åé–Þé–×é–Ðé–Éé–Â閻閴閭閦閟閘閑閊閃é–|é–ué–né–gé–`é–Yé–Ré–Ké–Dé–=é–6é–/é–(é–!é–é–é– é–é–þè–÷è–ðè–éè–âè–Ûè–Ôè–Íè–Æè–¿è–¸è–±è–ªè–£è–œè–•è–Žè–‡è–€è–yè–rè–kè–dè–]è–Vè–Oè–Hè–Aè–:è–3è–,è–%è–è–è–è– è–è–ûç–ôç–íç–æç–ßç–Øç–Ñç–Êç–Ã疼疵疮疧疠疙疒疋疄ç–}ç–vç–oç–hç–aç–Zç–Sç–Lç–Eç–>ç–7ç–0ç–)ç–"ç–ç–ç– ç–ç–ÿæ–øæ–ñæ–êæ–ãæ–Üæ–Õæ–Îæ–Çæ–Àæ–¹æ–²æ–«æ–¤æ–æ––æ–æ–ˆæ–æ–zæ–sæ–læ–eæ–^æ–Wæ–Pæ–Iæ–Bæ–;æ–4æ–-æ–&æ–æ–æ–æ– æ–æ–üå–õå–îå–çå–àå–Ùå–Òå–Ëå–Ä喽営喯喨喡喚喓喌喅å–~å–wå–på–iå–bå–[å–Tå–Må–Få–?å–8å–1å–*å–#å–å–å–å–å–å–ùä–òä–ëä–ää–Ýä–Öä–Ïä–Èä–Á䖺䖳䖬䖥䖞䖗ä–䖉䖂ä–{ä–tä–mä–fä–_ä–Xä–Qä–Jä–Cä–<ä–5ä–.ä–'ä– ä–ä–ä– ä–ä–ýã–öã–ïã–èã–áã–Úã–Óã–Ìã–Å㖾㖷㖰㖩㖢㖛㖔ã–ã–†ã–ã–xã–qã–jã–cã–\ã–Uã–Nã–Gã–@ã–9ã–2ã–+ã–$ã–ã–ã–ã–ã–ã–úâ–óâ–ìâ–åâ–Þâ–×â–Ðâ–Éâ–Â▻▴▭▦▟▘░▊▃â–|â–uâ–nâ–gâ–`â–Yâ–Râ–Kâ–Dâ–=â–6â–/â–(â–!â–â–â– â–â–þá–÷á–ðá–éá–âá–Ûá–Ôá–Íá–Æá–¿á–¸á–±á–ªá–£á–œá–•á–Žá–‡á–€á–yá–rá–ká–dá–]á–Vá–Oá–Há–Aá–:á–3á–,á–%á–á–á–á– á–á–ûà–ôà–íà–æà–ßà–Øà–Ñà–Êà–Ãà–¼à–µà–®à–§à– à–™à–’à–‹à–„à–}à–và–oà–hà–aà–Zà–Sà–Là–Eà–>à–7à–0à–)à–"à–à–à– à–à–ÿß–øß–ñß–êß–ãß–Üß–Õß–Îß–Çß–Àß–¹ß–²ß–«ß–¤ß–ß––ß–ß–ˆß–ß–zß–sß–lß–eß–^ß–Wß–Pß–Iß–Bß–;ß–4ß–-ß–&ß–ß–ß–ß– ß–ß–üÞ–õÞ–îÞ–çÞ–àÞ–ÙÞ–ÒÞ–ËÞ–ÄÞ–½Þ–¶Þ–¯Þ–¨Þ–¡Þ–šÞ–“Þ–ŒÞ–…Þ–~Þ–wÞ–pÞ–iÞ–bÞ–[Þ–TÞ–MÞ–FÞ–?Þ–8Þ–1Þ–*Þ–#Þ–Þ–Þ–Þ–Þ–Þ–ùÝ–òÝ–ëÝ–äÝ–ÝÝ–ÖÝ–ÏÝ–ÈÝ–ÁÝ–ºÝ–³Ý–¬Ý–¥Ý–žÝ–—Ý–Ý–‰Ý–‚Ý–{Ý–tÝ–mÝ–fÝ–_Ý–XÝ–QÝ–JÝ–CÝ–<Ý–5Ý–.Ý–'Ý– Ý–Ý–Ý– Ý–Ý–ýÜ–öÜ–ïÜ–èÜ–áÜ–ÚÜ–ÓÜ–ÌÜ–ÅÜ–¾Ü–·Ü–°Ü–©Ü–¢Ü–›Ü–”Ü–Ü–†Ü–Ü–xÜ–qÜ–jÜ–cÜ–\Ü–UÜ–NÜ–GÜ–@Ü–9Ü–2Ü–+Ü–$Ü–Ü–Ü–Ü–Ü–Ü–úÛ–óÛ–ìÛ–åÛ–ÞÛ–×Û–ÐÛ–ÉÛ–ÂÛ–»Û–´Û–­Û–¦Û–ŸÛ–˜Û–‘Û–ŠÛ–ƒÛ–|Û–uÛ–nÛ–gÛ–`Û–YÛ–RÛ–KÛ–DÛ–=Û–6Û–/Û–(Û–!Û–Û–Û– Û–Û–þÚ–÷Ú–ðÚ–éÚ–âÚ–ÛÚ–ÔÚ–ÍÚ–ÆÚ–¿Ú–¸Ú–±Ú–ªÚ–£Ú–œÚ–•Ú–ŽÚ–‡Ú–€Ú–yÚ–rÚ–kÚ–dÚ–]Ú–VÚ–OÚ–HÚ–AÚ–:Ú–3Ú–,Ú–%Ú–Ú–Ú–Ú– Ú–Ú–ûÙ–ôÙ–íÙ–æÙ–ßÙ–ØÙ–ÑÙ–ÊÙ–ÃÙ–¼Ù–µÙ–®Ù–§Ù– Ù–™Ù–’Ù–‹Ù–„Ù–}Ù–vÙ–oÙ–hÙ–aÙ–ZÙ–SÙ–LÙ–EÙ–>Ù–7Ù–0Ù–)Ù–"ٖٖٖ ٖٖÿØ–øØ–ñØ–êØ–ãØ–ÜØ–ÕØ–ÎØ–ÇØ–ÀØ–¹Ø–²Ø–«Ø–¤Ø–Ø––ؖؖˆØ–Ø–zØ–sØ–lØ–eØ–^Ø–WØ–PØ–IØ–BØ–;Ø–4Ø–-Ø–&ؖؖؖؖ ؖؖü×–õ×–î×–ç×–à×–Ù×–Ò×–Ë×–Ä×–½×–¶×–¯×–¨×–¡×–š×–“×–Œ×–…×–~×–w×–p×–i×–b×–[×–T×–M×–F×–?×–8×–1×–*×–#×–×–×–×–×–×–ùÖ–òÖ–ëÖ–äÖ–ÝÖ–ÖÖ–ÏÖ–ÈÖ–ÁÖ–ºÖ–³Ö–¬Ö–¥Ö–žÖ–—Ö–Ö–‰Ö–‚Ö–{Ö–tÖ–mÖ–fÖ–_Ö–XÖ–QÖ–JÖ–CÖ–<Ö–5Ö–.Ö–'Ö– Ö–Ö–Ö– Ö–Ö–ýÕ–öÕ–ïÕ–èÕ–áÕ–ÚÕ–ÓÕ–ÌÕ–ÅÕ–¾Õ–·Õ–°Õ–©Õ–¢Õ–›Õ–”Õ–Õ–†Õ–Õ–xÕ–qÕ–jÕ–cÕ–\Õ–UÕ–NÕ–GÕ–@Õ–9Õ–2Õ–+Õ–$Õ–Õ–Õ–Õ–Õ–Õ–úÔ–óÔ–ìÔ–åÔ–ÞÔ–×Ô–ÐÔ–ÉÔ–ÂÔ–»Ô–´Ô–­Ô–¦Ô–ŸÔ–˜Ô–‘Ô–ŠÔ–ƒÔ–|Ô–uÔ–nÔ–gÔ–`Ô–YÔ–RÔ–KÔ–DÔ–=Ô–6Ô–/Ô–(Ô–!Ô–Ô–Ô– Ô–Ô–þÓ–÷Ó–ðÓ–éÓ–âÓ–ÛÓ–ÔÓ–ÍÓ–ÆÓ–¿Ó–¸Ó–±Ó–ªÓ–£Ó–œÓ–•Ó–ŽÓ–‡Ó–€Ó–yÓ–rÓ–kÓ–dÓ–]Ó–VÓ–OÓ–HÓ–AÓ–:Ó–3Ó–,Ó–%Ó–Ó–Ó–Ó– Ó–Ó–ûÒ–ôÒ–íÒ–æÒ–ßÒ–ØÒ–ÑÒ–ÊÒ–ÃÒ–¼Ò–µÒ–®Ò–§Ò– Ò–™Ò–’Ò–‹Ò–„Ò–}Ò–vÒ–oÒ–hÒ–aÒ–ZÒ–SÒ–LÒ–EÒ–>Ò–7Ò–0Ò–)Ò–"Ò–Ò–Ò– Ò–Ò–ÿÑ–øÑ–ñÑ–êÑ–ãÑ–ÜÑ–ÕÑ–ÎÑ–ÇÑ–ÀÑ–¹Ñ–²Ñ–«Ñ–¤Ñ–Ñ––Ñ–Ñ–ˆÑ–Ñ–zÑ–sÑ–lÑ–eÑ–^Ñ–WÑ–PÑ–IÑ–BÑ–;Ñ–4Ñ–-Ñ–&Ñ–Ñ–Ñ–Ñ– Ñ–Ñ–üЖõЖîЖçЖàЖÙЖÒЖËЖÄЖ½Ð–¶Ð–¯Ð–¨Ð–¡Ð–šÐ–“ЖŒÐ–…Ж~ЖwЖpЖiЖbЖ[ЖTЖMЖFЖ?Ж8Ж1Ж*Ж#ЖЖЖЖЖЖùÏ–òÏ–ëÏ–äÏ–ÝÏ–ÖÏ–ÏÏ–ÈÏ–ÁÏ–ºÏ–³Ï–¬Ï–¥Ï–žÏ–—Ï–Ï–‰Ï–‚Ï–{Ï–tÏ–mÏ–fÏ–_Ï–XÏ–QÏ–JÏ–CÏ–<Ï–5Ï–.Ï–'Ï– Ï–Ï–Ï– Ï–Ï–ýΖöΖïΖèΖáΖÚΖÓΖÌΖÅΖ¾Î–·Î–°Î–©Î–¢Î–›Î–”ΖΖ†Î–ΖxΖqΖjΖcΖ\ΖUΖNΖGΖ@Ζ9Ζ2Ζ+Ζ$ΖΖΖΖΖΖúÍ–óÍ–ìÍ–åÍ–ÞÍ–×Í–ÐÍ–ÉÍ–ÂÍ–»Í–´Í–­Í–¦Í–ŸÍ–˜Í–‘Í–ŠÍ–ƒÍ–|Í–uÍ–nÍ–gÍ–`Í–YÍ–RÍ–KÍ–DÍ–=Í–6Í–/Í–(Í–!Í–Í–Í– Í–Í–þÌ–÷Ì–ðÌ–éÌ–âÌ–ÛÌ–ÔÌ–ÍÌ–ÆÌ–¿Ì–¸Ì–±Ì–ªÌ–£Ì–œÌ–•Ì–ŽÌ–‡Ì–€Ì–yÌ–rÌ–kÌ–dÌ–]Ì–VÌ–OÌ–HÌ–AÌ–:Ì–3Ì–,Ì–%Ì–Ì–Ì–Ì– Ì–Ì–ûË–ôË–íË–æË–ßË–ØË–ÑË–ÊË–ÃË–¼Ë–µË–®Ë–§Ë– Ë–™Ë–’Ë–‹Ë–„Ë–}Ë–vË–oË–hË–aË–ZË–SË–LË–EË–>Ë–7Ë–0Ë–)Ë–"Ë–Ë–Ë– Ë–Ë–ÿÊ–øÊ–ñÊ–êÊ–ãÊ–ÜÊ–ÕÊ–ÎÊ–ÇÊ–ÀÊ–¹Ê–²Ê–«Ê–¤Ê–Ê––Ê–Ê–ˆÊ–Ê–zÊ–sÊ–lÊ–eÊ–^Ê–WÊ–PÊ–IÊ–BÊ–;Ê–4Ê–-Ê–&Ê–Ê–Ê–Ê– Ê–Ê–üÉ–õÉ–îÉ–çÉ–àÉ–ÙÉ–ÒÉ–ËÉ–ÄÉ–½É–¶É–¯É–¨É–¡É–šÉ–“É–ŒÉ–…É–~É–wÉ–pÉ–iÉ–bÉ–[É–TÉ–MÉ–FÉ–?É–8É–1É–*É–#É–É–É–É–É–É–ùÈ–òÈ–ëÈ–äÈ–ÝÈ–ÖÈ–ÏÈ–ÈÈ–ÁÈ–ºÈ–³È–¬È–¥È–žÈ–—È–È–‰È–‚È–{È–tÈ–mÈ–fÈ–_È–XÈ–QÈ–JÈ–CÈ–<È–5È–.È–'È– È–È–È– È–È–ýÇ–öÇ–ïÇ–èÇ–áÇ–ÚÇ–ÓÇ–ÌÇ–ÅÇ–¾Ç–·Ç–°Ç–©Ç–¢Ç–›Ç–”Ç–Ç–†Ç–Ç–xÇ–qÇ–jÇ–cÇ–\Ç–UÇ–NÇ–GÇ–@Ç–9Ç–2Ç–+Ç–$Ç–Ç–Ç–Ç–Ç–Ç–úÆ–óÆ–ìÆ–寖ÞÆ–ׯ–ÐÆ–ÉÆ–ÂÆ–»Æ–´Æ–­Æ–¦Æ–ŸÆ–˜Æ–‘Æ–ŠÆ–ƒÆ–|Æ–uÆ–nÆ–gÆ–`Æ–YÆ–RÆ–KÆ–DÆ–=Æ–6Æ–/Æ–(Æ–!Æ–Æ–Æ– Æ–Æ–þÅ–÷Å–ðÅ–éÅ–âÅ–ÛÅ–ÔÅ–ÍÅ–ÆÅ–¿Å–¸Å–±Å–ªÅ–£Å–œÅ–•Å–ŽÅ–‡Å–€Å–yÅ–rÅ–kÅ–dÅ–]Å–VÅ–OÅ–HÅ–AÅ–:Å–3Å–,Å–%Å–Å–Å–Å– Å–Å–ûÄ–ôÄ–íÄ–æÄ–ßÄ–ØÄ–ÑÄ–ÊÄ–ÃÄ–¼Ä–µÄ–®Ä–§Ä– Ä–™Ä–’Ä–‹Ä–„Ä–}Ä–vÄ–oÄ–hÄ–aÄ–ZÄ–SÄ–LÄ–EÄ–>Ä–7Ä–0Ä–)Ä–"Ä–Ä–Ä– Ä–Ä–ÿÖøÃ–ñÖêÖãÖÜÖÕÖÎÖÇÖÀֲֹ֤֫Ö֖ÖֈÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖü–õ–î–ç–à–Ù–Ò–Ë–Ä–½Â–¶Â–¯Â–¨Â–¡Â–šÂ–“–ŒÂ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ùÁ–òÁ–ëÁ–äÁ–ÝÁ–ÖÁ–ÏÁ–ÈÁ–ÁÁ–ºÁ–³Á–¬Á–¥Á–žÁ–—Á–Á–‰Á–‚Á–{Á–tÁ–mÁ–fÁ–_Á–XÁ–QÁ–JÁ–CÁ–<Á–5Á–.Á–'Á– Á–Á–Á– Á–Á–ýÀ–öÀ–ïÀ–èÀ–áÀ–ÚÀ–ÓÀ–ÌÀ–ÅÀ–¾À–·À–°À–©À–¢À–›À–”À–À–†À–À–xÀ–qÀ–jÀ–cÀ–\À–UÀ–NÀ–GÀ–@À–9À–2À–+À–$À–À–À–À–À–À–ú¿–ó¿–ì¿–å¿–Þ¿–׿–п–É¿–¿–»¿–´¿–­¿–¦¿–Ÿ¿–˜¿–‘¿–Š¿–ƒ¿–|¿–u¿–n¿–g¿–`¿–Y¿–R¿–K¿–D¿–=¿–6¿–/¿–(¿–!¿–¿–¿– ¿–¿–þ¾–÷¾–ð¾–é¾–â¾–Û¾–Ô¾–;–ƾ–¿¾–¸¾–±¾–ª¾–£¾–œ¾–•¾–޾–‡¾–€¾–y¾–r¾–k¾–d¾–]¾–V¾–O¾–H¾–A¾–:¾–3¾–,¾–%¾–¾–¾–¾– ¾–¾–û½–ô½–í½–æ½–ß½–ؽ–ѽ–ʽ–ý–¼½–µ½–®½–§½– ½–™½–’½–‹½–„½–}½–v½–o½–h½–a½–Z½–S½–L½–E½–>½–7½–0½–)½–"½–½–½– ½–½–ÿ¼–ø¼–ñ¼–ê¼–ã¼–ܼ–Õ¼–μ–Ǽ–À¼–¹¼–²¼–«¼–¤¼–¼––¼–¼–ˆ¼–¼–z¼–s¼–l¼–e¼–^¼–W¼–P¼–I¼–B¼–;¼–4¼–-¼–&¼–¼–¼–¼– ¼–¼–ü»–õ»–î»–ç»–à»–Ù»–Ò»–Ë»–Ä»–½»–¶»–¯»–¨»–¡»–š»–“»–Œ»–…»–~»–w»–p»–i»–b»–[»–T»–M»–F»–?»–8»–1»–*»–#»–»–»–»–»–»–ùº–òº–뺖亖ݺ–Öº–Ϻ–Ⱥ–Áº–ºº–³º–¬º–¥º–žº–—º–º–‰º–‚º–{º–tº–mº–fº–_º–Xº–Qº–Jº–Cº–<º–5º–.º–'º– º–º–º– º–º–ý¹–ö¹–ï¹–è¹–á¹–Ú¹–Ó¹–̹–Ź–¾¹–·¹–°¹–©¹–¢¹–›¹–”¹–¹–†¹–¹–x¹–q¹–j¹–c¹–\¹–U¹–N¹–G¹–@¹–9¹–2¹–+¹–$¹–¹–¹–¹–¹–¹–ú¸–ó¸–츖帖Þ¸–׸–и–ɸ–¸–»¸–´¸–­¸–¦¸–Ÿ¸–˜¸–‘¸–Џ–ƒ¸–|¸–u¸–n¸–g¸–`¸–Y¸–R¸–K¸–D¸–=¸–6¸–/¸–(¸–!¸–¸–¸– ¸–¸–þ·–÷·–ð·–é·–â·–Û·–Ô·–Í·–Æ·–¿·–¸·–±·–ª·–£·–œ·–•·–Ž·–‡·–€·–y·–r·–k·–d·–]·–V·–O·–H·–A·–:·–3·–,·–%·–·–·–·– ·–·–û¶–ô¶–í¶–æ¶–ß¶–ض–Ѷ–ʶ–ö–¼¶–µ¶–®¶–§¶– ¶–™¶–’¶–‹¶–„¶–}¶–v¶–o¶–h¶–a¶–Z¶–S¶–L¶–E¶–>¶–7¶–0¶–)¶–"¶–¶–¶– ¶–¶–ÿµ–øµ–ñµ–êµ–ãµ–ܵ–Õµ–ε–ǵ–Àµ–¹µ–²µ–«µ–¤µ–µ––µ–µ–ˆµ–µ–zµ–sµ–lµ–eµ–^µ–Wµ–Pµ–Iµ–Bµ–;µ–4µ–-µ–&µ–µ–µ–µ– µ–µ–ü´–õ´–î´–ç´–à´–Ù´–Ò´–Ë´–Ä´–½´–¶´–¯´–¨´–¡´–š´–“´–Œ´–…´–~´–w´–p´–i´–b´–[´–T´–M´–F´–?´–8´–1´–*´–#´–´–´–´–´–´–ù³–ò³–ë³–ä³–ݳ–Ö³–ϳ–ȳ–Á³–º³–³³–¬³–¥³–ž³–—³–³–‰³–‚³–{³–t³–m³–f³–_³–X³–Q³–J³–C³–<³–5³–.³–'³– ³–³–³– ³–³–ý²–ö²–ï²–è²–á²–Ú²–Ó²–̲–Ų–¾²–·²–°²–©²–¢²–›²–”²–²–†²–²–x²–q²–j²–c²–\²–U²–N²–G²–@²–9²–2²–+²–$²–²–²–²–²–²–ú±–ó±–ì±–å±–Þ±–×±–б–ɱ–±–»±–´±–­±–¦±–Ÿ±–˜±–‘±–б–ƒ±–|±–u±–n±–g±–`±–Y±–R±–K±–D±–=±–6±–/±–(±–!±–±–±– ±–±–þ°–÷°–ð°–é°–â°–Û°–Ô°–Ͱ–ư–¿°–¸°–±°–ª°–£°–œ°–•°–ް–‡°–€°–y°–r°–k°–d°–]°–V°–O°–H°–A°–:°–3°–,°–%°–°–°–°– °–°–û¯–ô¯–í¯–毖߯–د–ѯ–ʯ–ï–¼¯–µ¯–®¯–§¯– ¯–™¯–’¯–‹¯–„¯–}¯–v¯–o¯–h¯–a¯–Z¯–S¯–L¯–E¯–>¯–7¯–0¯–)¯–"¯–¯–¯– ¯–¯–ÿ®–ø®–ñ®–ê®–ã®–Ü®–Õ®–ή–Ç®–À®–¹®–²®–«®–¤®–®––®–®–ˆ®–®–z®–s®–l®–e®–^®–W®–P®–I®–B®–;®–4®–-®–&®–®–®–®– ®–®–ü­–õ­–î­–ç­–à­–Ù­–Ò­–Ë­–Ä­–½­–¶­–¯­–¨­–¡­–š­–“­–Œ­–…­–~­–w­–p­–i­–b­–[­–T­–M­–F­–?­–8­–1­–*­–#­–­–­–­–­–­–ù¬–ò¬–묖䬖ݬ–Ö¬–Ϭ–Ȭ–Á¬–º¬–³¬–¬¬–¥¬–ž¬–—¬–¬–‰¬–‚¬–{¬–t¬–m¬–f¬–_¬–X¬–Q¬–J¬–C¬–<¬–5¬–.¬–'¬– ¬–¬–¬– ¬–¬–ý«–ö«–ï«–è«–á«–Ú«–Ó«–Ì«–Å«–¾«–·«–°«–©«–¢«–›«–”«–«–†«–«–x«–q«–j«–c«–\«–U«–N«–G«–@«–9«–2«–+«–$«–«–«–«–«–«–úª–óª–쪖媖Þª–ת–Ъ–ɪ–ª–»ª–´ª–­ª–¦ª–Ÿª–˜ª–‘ª–Šª–ƒª–|ª–uª–nª–gª–`ª–Yª–Rª–Kª–Dª–=ª–6ª–/ª–(ª–!ª–ª–ª– ª–ª–þ©–÷©–ð©–é©–â©–Û©–Ô©–Í©–Æ©–¿©–¸©–±©–ª©–£©–œ©–•©–Ž©–‡©–€©–y©–r©–k©–d©–]©–V©–O©–H©–A©–:©–3©–,©–%©–©–©–©– ©–©–û¨–ô¨–í¨–樖ߨ–ب–Ѩ–ʨ–è–¼¨–µ¨–®¨–§¨– ¨–™¨–’¨–‹¨–„¨–}¨–v¨–o¨–h¨–a¨–Z¨–S¨–L¨–E¨–>¨–7¨–0¨–)¨–"¨–¨–¨– ¨–¨–ÿ§–ø§–ñ§–ê§–ã§–ܧ–Õ§–Χ–ǧ–À§–¹§–²§–«§–¤§–§––§–§–ˆ§–§–z§–s§–l§–e§–^§–W§–P§–I§–B§–;§–4§–-§–&§–§–§–§– §–§–ü¦–õ¦–禖খÙ¦–Ò¦–˦–Ħ–½¦–¶¦–¯¦–¨¦–¡¦–𦖓¦–Œ¦–…¦–~¦–w¦–p¦–i¦–b¦–[¦–T¦–M¦–F¦–?¦–8¦–1¦–*¦–#¦–¦–¦–¦–¦–¦–ù¥–ò¥–륖䥖Ý¥–Ö¥–Ï¥–È¥–Á¥–º¥–³¥–¬¥–¥¥–ž¥–—¥–¥–‰¥–‚¥–{¥–t¥–m¥–f¥–_¥–X¥–Q¥–J¥–C¥–<¥–5¥–.¥–'¥– ¥–¥–¥– ¥–¥–ý¤–ö¤–烙褖ᤖÚ¤–Ó¤–̤–Ť–¾¤–·¤–°¤–©¤–¢¤–›¤–”¤–¤–†¤–¤–x¤–q¤–j¤–c¤–\¤–U¤–N¤–G¤–@¤–9¤–2¤–+¤–$¤–¤–¤–¤–¤–¤–ú£–ó£–죖壖Þ£–×£–У–É£–£–»£–´£–­£–¦£–Ÿ£–˜£–‘£–Š£–ƒ£–|£–u£–n£–g£–`£–Y£–R£–K£–D£–=£–6£–/£–(£–!£–£–£– £–£–þ¢–÷¢–ð¢–颖⢖Û¢–Ô¢–Í¢–Æ¢–¿¢–¸¢–±¢–ª¢–£¢–œ¢–•¢–Ž¢–‡¢–€¢–y¢–r¢–k¢–d¢–]¢–V¢–O¢–H¢–A¢–:¢–3¢–,¢–%¢–¢–¢–¢– ¢–¢–û¡–ô¡–í¡–æ¡–ß¡–Ø¡–Ñ¡–Ê¡–á–¼¡–µ¡–®¡–§¡– ¡–™¡–’¡–‹¡–„¡–}¡–v¡–o¡–h¡–a¡–Z¡–S¡–L¡–E¡–>¡–7¡–0¡–)¡–"¡–¡–¡– ¡–¡–ÿ –ø –ñ –ê –ã –Ü –Õ –Π–Ç –À –¹ –² –« –¤ – –– – –ˆ – –z –s –l –e –^ –W –P –I –B –; –4 –- –& – – – –  – –üŸ–õŸ–矖àŸ–ÙŸ–ÒŸ–ËŸ–ÄŸ–½Ÿ–¶Ÿ–¯Ÿ–¨Ÿ–¡Ÿ–šŸ–“Ÿ–ŒŸ–…Ÿ–~Ÿ–wŸ–pŸ–iŸ–bŸ–[Ÿ–TŸ–MŸ–FŸ–?Ÿ–8Ÿ–1Ÿ–*Ÿ–#Ÿ–Ÿ–Ÿ–Ÿ–Ÿ–Ÿ–ùž–òž–ëž–äž–Ýž–Öž–Ïž–Èž–Áž–ºž–³ž–¬ž–¥ž–žž–—ž–ž–‰ž–‚ž–{ž–tž–mž–fž–_ž–Xž–Qž–Jž–Cž–<ž–5ž–.ž–'ž– ž–ž–ž– ž–ž–ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––úœ–óœ–윖圖Þœ–ל–М–Éœ–œ–»œ–´œ–­œ–¦œ–Ÿœ–˜œ–‘œ–Šœ–ƒœ–|œ–uœ–nœ–gœ–`œ–Yœ–Rœ–Kœ–Dœ–=œ–6œ–/œ–(œ–!œ–œ–œ– œ–œ–þ›–÷›–ð›–é›–â›–Û›–Ô›–Í›–Æ›–¿›–¸›–±›–ª›–£›–œ›–•›–Ž›–‡›–€›–y›–r›–k›–d›–]›–V›–O›–H›–A›–:›–3›–,›–%›–›–›–›– ›–›–ûš–ôš–íš–æš–ßš–Øš–Ñš–Êš–Ú–¼š–µš–®š–§š– š–™š–’š–‹š–„š–}š–vš–oš–hš–aš–Zš–Sš–Lš–Eš–>š–7š–0š–)š–"š–š–š– š–š–ÿ™–ø™–ñ™–ê™–ã™–Ü™–Õ™–Ι–Ç™–À™–¹™–²™–«™–¤™–™––™–™–ˆ™–™–z™–s™–l™–e™–^™–W™–P™–I™–B™–;™–4™–-™–&™–™–™–™– ™–™–ü˜–õ˜–瘖à˜–Ù˜–Ò˜–˘–Ę–½˜–¶˜–¯˜–¨˜–¡˜–š˜–“˜–Œ˜–…˜–~˜–w˜–p˜–i˜–b˜–[˜–T˜–M˜–F˜–?˜–8˜–1˜–*˜–#˜–˜–˜–˜–˜–˜–ù—–ò—–ë—–ä—–Ý—–Ö—–Ï—–È—–Á—–º—–³—–¬—–¥—–ž—–——–—–‰—–‚—–{—–t—–m—–f—–_—–X—–Q—–J—–C—–<—–5—–.—–'—– —–—–—– —–—–ý––ö––ï––è––á––Ú––Ó––Ì––Å––¾––·––°––©––¢––›––”––––†––––x––q––j––c––\––U––N––G––@––9––2––+––$––––––––––––ú•–ó•–ì•–å•–Þ•–ו–Е–É•–•–»•–´•–­•–¦•–Ÿ•–˜•–‘•–Š•–ƒ•–|•–u•–n•–g•–`•–Y•–R•–K•–D•–=•–6•–/•–(•–!•–•–•– •–•–þ”–÷”–ð”–é”–â”–Û”–Ô”–Í”–Æ”–¿”–¸”–±”–ª”–£”–œ”–•”–Ž”–‡”–€”–y”–r”–k”–d”–]”–V”–O”–H”–A”–:”–3”–,”–%”–”–”–”– ”–”–û“–ô“–í“–æ“–ß“–Ø“–Ñ“–Ê“–Ó–¼“–µ“–®“–§“– “–™“–’“–‹“–„“–}“–v“–o“–h“–a“–Z“–S“–L“–E“–>“–7“–0“–)“–"“–“–“– “–“–ÿ’–ø’–ñ’–ê’–ã’–Ü’–Õ’–Î’–Ç’–À’–¹’–²’–«’–¤’–’––’–’–ˆ’–’–z’–s’–l’–e’–^’–W’–P’–I’–B’–;’–4’–-’–&’–’–’–’– ’–’–ü‘–õ‘–î‘–ç‘–à‘–Ù‘–Ò‘–Ë‘–Ä‘–½‘–¶‘–¯‘–¨‘–¡‘–š‘–“‘–Œ‘–…‘–~‘–w‘–p‘–i‘–b‘–[‘–T‘–M‘–F‘–?‘–8‘–1‘–*‘–#‘–‘–‘–‘–‘–‘–ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––úŽ–óŽ–쎖厖ÞŽ–׎–ÐŽ–ÉŽ–ÂŽ–»Ž–´Ž–­Ž–¦Ž–ŸŽ–˜Ž–‘Ž–ŠŽ–ƒŽ–|Ž–uŽ–nŽ–gŽ–`Ž–YŽ–RŽ–KŽ–DŽ–=Ž–6Ž–/Ž–(Ž–!Ž–Ž–Ž– Ž–Ž–þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––ûŒ–ôŒ–팖挖ߌ–ØŒ–ÑŒ–ÊŒ–ÃŒ–¼Œ–µŒ–®Œ–§Œ– Œ–™Œ–’Œ–‹Œ–„Œ–}Œ–vŒ–oŒ–hŒ–aŒ–ZŒ–SŒ–LŒ–EŒ–>Œ–7Œ–0Œ–)Œ–"Œ–Œ–Œ– Œ–Œ–ÿ‹–ø‹–ñ‹–ê‹–ã‹–Ü‹–Õ‹–΋–Ç‹–À‹–¹‹–²‹–«‹–¤‹–‹––‹–‹–ˆ‹–‹–z‹–s‹–l‹–e‹–^‹–W‹–P‹–I‹–B‹–;‹–4‹–-‹–&‹–‹–‹–‹– ‹–‹–üŠ–õŠ–犖àŠ–ÙŠ–ÒŠ–ËŠ–ÄŠ–½Š–¶Š–¯Š–¨Š–¡Š–šŠ–“Š–ŒŠ–…Š–~Š–wŠ–pŠ–iŠ–bŠ–[Š–TŠ–MŠ–FŠ–?Š–8Š–1Š–*Š–#Š–Š–Š–Š–Š–Š–ù‰–ò‰–뉖䉖݉–Ö‰–ω–ȉ–Á‰–º‰–³‰–¬‰–¥‰–ž‰–—‰–‰–‰‰–‚‰–{‰–t‰–m‰–f‰–_‰–X‰–Q‰–J‰–C‰–<‰–5‰–.‰–'‰– ‰–‰–‰– ‰–‰–ýˆ–öˆ–舖ሖÚˆ–Óˆ–̈–ň–¾ˆ–·ˆ–°ˆ–©ˆ–¢ˆ–›ˆ–”ˆ–ˆ–†ˆ–ˆ–xˆ–qˆ–jˆ–cˆ–\ˆ–Uˆ–Nˆ–Gˆ–@ˆ–9ˆ–2ˆ–+ˆ–$ˆ–ˆ–ˆ–ˆ–ˆ–ˆ–ú‡–ó‡–쇖凖Þ‡–ׇ–Ї–ɇ–‡–»‡–´‡–­‡–¦‡–Ÿ‡–˜‡–‘‡–Ї–ƒ‡–|‡–u‡–n‡–g‡–`‡–Y‡–R‡–K‡–D‡–=‡–6‡–/‡–(‡–!‡–‡–‡– ‡–‡–þ†–÷†–ð†–醖↖Û†–Ô†–͆–Ɔ–¿†–¸†–±†–ª†–£†–œ†–•†–ކ–‡†–€†–y†–r†–k†–d†–]†–V†–O†–H†–A†–:†–3†–,†–%†–†–†–†– †–†–û…–ô…–í…–æ…–ß…–Ø…–Ñ…–Ê…–Ã…–¼…–µ…–®…–§…– …–™…–’…–‹…–„…–}…–v…–o…–h…–a…–Z…–S…–L…–E…–>…–7…–0…–)…–"…–…–…– …–…–ÿ„–ø„–ñ„–ê„–ã„–Ü„–Õ„–΄–Ç„–À„–¹„–²„–«„–¤„–„––„–„–ˆ„–„–z„–s„–l„–e„–^„–W„–P„–I„–B„–;„–4„–-„–&„–„–„–„– „–„–üƒ–õƒ–烖àƒ–Ùƒ–Òƒ–˃–ă–½ƒ–¶ƒ–¯ƒ–¨ƒ–¡ƒ–šƒ–“ƒ–Œƒ–…ƒ–~ƒ–wƒ–pƒ–iƒ–bƒ–[ƒ–Tƒ–Mƒ–Fƒ–?ƒ–8ƒ–1ƒ–*ƒ–#ƒ–ƒ–ƒ–ƒ–ƒ–ƒ–ù‚–ò‚–ë‚–ä‚–Ý‚–Ö‚–Ï‚–È‚–Á‚–º‚–³‚–¬‚–¥‚–ž‚–—‚–‚–‰‚–‚‚–{‚–t‚–m‚–f‚–_‚–X‚–Q‚–J‚–C‚–<‚–5‚–.‚–'‚– ‚–‚–‚– ‚–‚–ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú€–ó€–쀖倖Þ€–×€–Ѐ–É€–€–»€–´€–­€–¦€–Ÿ€–˜€–‘€–Š€–ƒ€–|€–u€–n€–g€–`€–Y€–R€–K€–D€–=€–6€–/€–(€–!€–€–€– €–€–þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û~–ô~–í~–æ~–ß~–Ø~–Ñ~–Ê~–Ã~–¼~–µ~–®~–§~– ~–™~–’~–‹~–„~–}~–v~–o~–h~–a~–Z~–S~–L~–E~–>~–7~–0~–)~–"~–~–~– ~–~–ÿ}–ø}–ñ}–ê}–ã}–Ü}–Õ}–Î}–Ç}–À}–¹}–²}–«}–¤}–}––}–}–ˆ}–}–z}–s}–l}–e}–^}–W}–P}–I}–B}–;}–4}–-}–&}–}–}–}– }–}–ü|–õ|–î|–ç|–à|–Ù|–Ò|–Ë|–Ä|–½|–¶|–¯|–¨|–¡|–š|–“|–Œ|–…|–~|–w|–p|–i|–b|–[|–T|–M|–F|–?|–8|–1|–*|–#|–|–|–|–|–|–ù{–ò{–ë{–ä{–Ý{–Ö{–Ï{–È{–Á{–º{–³{–¬{–¥{–ž{–—{–{–‰{–‚{–{{–t{–m{–f{–_{–X{–Q{–J{–C{–<{–5{–.{–'{– {–{–{– {–{–ýz–öz–ïz–èz–áz–Úz–Óz–Ìz–Åz–¾z–·z–°z–©z–¢z–›z–”z–z–†z–z–xz–qz–jz–cz–\z–Uz–Nz–Gz–@z–9z–2z–+z–$z–z–z–z–z–z–úy–óy–ìy–åy–Þy–×y–Ðy–Éy–Ây–»y–´y–­y–¦y–Ÿy–˜y–‘y–Šy–ƒy–|y–uy–ny–gy–`y–Yy–Ry–Ky–Dy–=y–6y–/y–(y–!y–y–y– y–y–þx–÷x–ðx–éx–âx–Ûx–Ôx–Íx–Æx–¿x–¸x–±x–ªx–£x–œx–•x–Žx–‡x–€x–yx–rx–kx–dx–]x–Vx–Ox–Hx–Ax–:x–3x–,x–%x–x–x–x– x–x–ûw–ôw–íw–æw–ßw–Øw–Ñw–Êw–Ãw–¼w–µw–®w–§w– w–™w–’w–‹w–„w–}w–vw–ow–hw–aw–Zw–Sw–Lw–Ew–>w–7w–0w–)w–"w–w–w– w–w–ÿv–øv–ñv–êv–ãv–Üv–Õv–Îv–Çv–Àv–¹v–²v–«v–¤v–v––v–v–ˆv–v–zv–sv–lv–ev–^v–Wv–Pv–Iv–Bv–;v–4v–-v–&v–v–v–v– v–v–üu–õu–îu–çu–àu–Ùu–Òu–Ëu–Äu–½u–¶u–¯u–¨u–¡u–šu–“u–Œu–…u–~u–wu–pu–iu–bu–[u–Tu–Mu–Fu–?u–8u–1u–*u–#u–u–u–u–u–u–ùt–òt–ët–ät–Ýt–Öt–Ït–Èt–Át–ºt–³t–¬t–¥t–žt–—t–t–‰t–‚t–{t–tt–mt–ft–_t–Xt–Qt–Jt–Ct–p–7p–0p–)p–"p–p–p– p–p–ÿo–øo–ño–êo–ão–Üo–Õo–Îo–Ço–Ào–¹o–²o–«o–¤o–o––o–o–ˆo–o–zo–so–lo–eo–^o–Wo–Po–Io–Bo–;o–4o–-o–&o–o–o–o– o–o–ün–õn–în–çn–àn–Ùn–Òn–Ën–Än–½n–¶n–¯n–¨n–¡n–šn–“n–Œn–…n–~n–wn–pn–in–bn–[n–Tn–Mn–Fn–?n–8n–1n–*n–#n–n–n–n–n–n–ùm–òm–ëm–äm–Ým–Öm–Ïm–Èm–Ám–ºm–³m–¬m–¥m–žm–—m–m–‰m–‚m–{m–tm–mm–fm–_m–Xm–Qm–Jm–Cm–i–7i–0i–)i–"i–i–i– i–i–ÿh–øh–ñh–êh–ãh–Üh–Õh–Îh–Çh–Àh–¹h–²h–«h–¤h–h––h–h–ˆh–h–zh–sh–lh–eh–^h–Wh–Ph–Ih–Bh–;h–4h–-h–&h–h–h–h– h–h–üg–õg–îg–çg–àg–Ùg–Òg–Ëg–Äg–½g–¶g–¯g–¨g–¡g–šg–“g–Œg–…g–~g–wg–pg–ig–bg–[g–Tg–Mg–Fg–?g–8g–1g–*g–#g–g–g–g–g–g–ùf–òf–ëf–äf–Ýf–Öf–Ïf–Èf–Áf–ºf–³f–¬f–¥f–žf–—f–f–‰f–‚f–{f–tf–mf–ff–_f–Xf–Qf–Jf–Cf–b–7b–0b–)b–"b–b–b– b–b–ÿa–øa–ña–êa–ãa–Üa–Õa–Îa–Ça–Àa–¹a–²a–«a–¤a–a––a–a–ˆa–a–za–sa–la–ea–^a–Wa–Pa–Ia–Ba–;a–4a–-a–&a–a–a–a– a–a–ü`–õ`–î`–ç`–à`–Ù`–Ò`–Ë`–Ä`–½`–¶`–¯`–¨`–¡`–š`–“`–Œ`–…`–~`–w`–p`–i`–b`–[`–T`–M`–F`–?`–8`–1`–*`–#`–`–`–`–`–`–ù_–ò_–ë_–ä_–Ý_–Ö_–Ï_–È_–Á_–º_–³_–¬_–¥_–ž_–—_–_–‰_–‚_–{_–t_–m_–f_–__–X_–Q_–J_–C_–<_–5_–._–'_– _–_–_– _–_–ý^–ö^–ï^–è^–á^–Ú^–Ó^–Ì^–Å^–¾^–·^–°^–©^–¢^–›^–”^–^–†^–^–x^–q^–j^–c^–\^–U^–N^–G^–@^–9^–2^–+^–$^–^–^–^–^–^–ú]–ó]–ì]–å]–Þ]–×]–Ð]–É]–Â]–»]–´]–­]–¦]–Ÿ]–˜]–‘]–Š]–ƒ]–|]–u]–n]–g]–`]–Y]–R]–K]–D]–=]–6]–/]–(]–!]–]–]– ]–]–þ\–÷\–ð\–é\–â\–Û\–Ô\–Í\–Æ\–¿\–¸\–±\–ª\–£\–œ\–•\–Ž\–‡\–€\–y\–r\–k\–d\–]\–V\–O\–H\–A\–:\–3\–,\–%\–\–\–\– \–\–û[–ô[–í[–æ[–ß[–Ø[–Ñ[–Ê[–Ã[–¼[–µ[–®[–§[– [–™[–’[–‹[–„[–}[–v[–o[–h[–a[–Z[–S[–L[–E[–>[–7[–0[–)[–"[–[–[– [–[–ÿZ–øZ–ñZ–êZ–ãZ–ÜZ–ÕZ–ÎZ–ÇZ–ÀZ–¹Z–²Z–«Z–¤Z–Z––Z–Z–ˆZ–Z–zZ–sZ–lZ–eZ–^Z–WZ–PZ–IZ–BZ–;Z–4Z–-Z–&Z–Z–Z–Z– Z–Z–üY–õY–îY–çY–àY–ÙY–ÒY–ËY–ÄY–½Y–¶Y–¯Y–¨Y–¡Y–šY–“Y–ŒY–…Y–~Y–wY–pY–iY–bY–[Y–TY–MY–FY–?Y–8Y–1Y–*Y–#Y–Y–Y–Y–Y–Y–ùX–òX–ëX–äX–ÝX–ÖX–ÏX–ÈX–ÁX–ºX–³X–¬X–¥X–žX–—X–X–‰X–‚X–{X–tX–mX–fX–_X–XX–QX–JX–CX–T–7T–0T–)T–"T–T–T– T–T–ÿS–øS–ñS–êS–ãS–ÜS–ÕS–ÎS–ÇS–ÀS–¹S–²S–«S–¤S–S––S–S–ˆS–S–zS–sS–lS–eS–^S–WS–PS–IS–BS–;S–4S–-S–&S–S–S–S– S–S–üR–õR–îR–çR–àR–ÙR–ÒR–ËR–ÄR–½R–¶R–¯R–¨R–¡R–šR–“R–ŒR–…R–~R–wR–pR–iR–bR–[R–TR–MR–FR–?R–8R–1R–*R–#R–R–R–R–R–R–ùQ–òQ–ëQ–äQ–ÝQ–ÖQ–ÏQ–ÈQ–ÁQ–ºQ–³Q–¬Q–¥Q–žQ–—Q–Q–‰Q–‚Q–{Q–tQ–mQ–fQ–_Q–XQ–QQ–JQ–CQ–M–7M–0M–)M–"M–M–M– M–M–ÿL–øL–ñL–êL–ãL–ÜL–ÕL–ÎL–ÇL–ÀL–¹L–²L–«L–¤L–L––L–L–ˆL–L–zL–sL–lL–eL–^L–WL–PL–IL–BL–;L–4L–-L–&L–L–L–L– L–L–üK–õK–îK–çK–àK–ÙK–ÒK–ËK–ÄK–½K–¶K–¯K–¨K–¡K–šK–“K–ŒK–…K–~K–wK–pK–iK–bK–[K–TK–MK–FK–?K–8K–1K–*K–#K–K–K–K–K–K–ùJ–òJ–ëJ–äJ–ÝJ–ÖJ–ÏJ–ÈJ–ÁJ–ºJ–³J–¬J–¥J–žJ–—J–J–‰J–‚J–{J–tJ–mJ–fJ–_J–XJ–QJ–JJ–CJ–F–7F–0F–)F–"F–F–F– F–F–ÿE–øE–ñE–êE–ãE–ÜE–ÕE–ÎE–ÇE–ÀE–¹E–²E–«E–¤E–E––E–E–ˆE–E–zE–sE–lE–eE–^E–WE–PE–IE–BE–;E–4E–-E–&E–E–E–E– E–E–üD–õD–îD–çD–àD–ÙD–ÒD–ËD–ÄD–½D–¶D–¯D–¨D–¡D–šD–“D–ŒD–…D–~D–wD–pD–iD–bD–[D–TD–MD–FD–?D–8D–1D–*D–#D–D–D–D–D–D–ùC–òC–ëC–äC–ÝC–ÖC–ÏC–ÈC–ÁC–ºC–³C–¬C–¥C–žC–—C–C–‰C–‚C–{C–tC–mC–fC–_C–XC–QC–JC–CC–?–7?–0?–)?–"?–?–?– ?–?–ÿ>–ø>–ñ>–ê>–ã>–Ü>–Õ>–Î>–Ç>–À>–¹>–²>–«>–¤>–>––>–>–ˆ>–>–z>–s>–l>–e>–^>–W>–P>–I>–B>–;>–4>–->–&>–>–>–>– >–>–ü=–õ=–î=–ç=–à=–Ù=–Ò=–Ë=–Ä=–½=–¶=–¯=–¨=–¡=–š=–“=–Œ=–…=–~=–w=–p=–i=–b=–[=–T=–M=–F=–?=–8=–1=–*=–#=–=–=–=–=–=–ù<–ò<–ë<–ä<–Ý<–Ö<–Ï<–È<–Á<–º<–³<–¬<–¥<–ž<–—<–<–‰<–‚<–{<–t<–m<–f<–_<–X<–Q<–J<–C<–<<–5<–.<–'<– <–<–<– <–<–ý;–ö;–ï;–è;–á;–Ú;–Ó;–Ì;–Å;–¾;–·;–°;–©;–¢;–›;–”;–;–†;–;–x;–q;–j;–c;–\;–U;–N;–G;–@;–9;–2;–+;–$;–;–;–;–;–;–ú:–ó:–ì:–å:–Þ:–×:–Ð:–É:–Â:–»:–´:–­:–¦:–Ÿ:–˜:–‘:–Š:–ƒ:–|:–u:–n:–g:–`:–Y:–R:–K:–D:–=:–6:–/:–(:–!:–:–:– :–:–þ9–÷9–ð9–é9–â9–Û9–Ô9–Í9–Æ9–¿9–¸9–±9–ª9–£9–œ9–•9–Ž9–‡9–€9–y9–r9–k9–d9–]9–V9–O9–H9–A9–:9–39–,9–%9–9–9–9– 9–9–û8–ô8–í8–æ8–ß8–Ø8–Ñ8–Ê8–Ã8–¼8–µ8–®8–§8– 8–™8–’8–‹8–„8–}8–v8–o8–h8–a8–Z8–S8–L8–E8–>8–78–08–)8–"8–8–8– 8–8–ÿ7–ø7–ñ7–ê7–ã7–Ü7–Õ7–Î7–Ç7–À7–¹7–²7–«7–¤7–7––7–7–ˆ7–7–z7–s7–l7–e7–^7–W7–P7–I7–B7–;7–47–-7–&7–7–7–7– 7–7–ü6–õ6–î6–ç6–à6–Ù6–Ò6–Ë6–Ä6–½6–¶6–¯6–¨6–¡6–š6–“6–Œ6–…6–~6–w6–p6–i6–b6–[6–T6–M6–F6–?6–86–16–*6–#6–6–6–6–6–6–ù5–ò5–ë5–ä5–Ý5–Ö5–Ï5–È5–Á5–º5–³5–¬5–¥5–ž5–—5–5–‰5–‚5–{5–t5–m5–f5–_5–X5–Q5–J5–C5–<5–55–.5–'5– 5–5–5– 5–5–ý4–ö4–ï4–è4–á4–Ú4–Ó4–Ì4–Å4–¾4–·4–°4–©4–¢4–›4–”4–4–†4–4–x4–q4–j4–c4–\4–U4–N4–G4–@4–94–24–+4–$4–4–4–4–4–4–ú3–ó3–ì3–å3–Þ3–×3–Ð3–É3–Â3–»3–´3–­3–¦3–Ÿ3–˜3–‘3–Š3–ƒ3–|3–u3–n3–g3–`3–Y3–R3–K3–D3–=3–63–/3–(3–!3–3–3– 3–3–þ2–÷2–ð2–é2–â2–Û2–Ô2–Í2–Æ2–¿2–¸2–±2–ª2–£2–œ2–•2–Ž2–‡2–€2–y2–r2–k2–d2–]2–V2–O2–H2–A2–:2–32–,2–%2–2–2–2– 2–2–û1–ô1–í1–æ1–ß1–Ø1–Ñ1–Ê1–Ã1–¼1–µ1–®1–§1– 1–™1–’1–‹1–„1–}1–v1–o1–h1–a1–Z1–S1–L1–E1–>1–71–01–)1–"1–1–1– 1–1–ÿ0–ø0–ñ0–ê0–ã0–Ü0–Õ0–Î0–Ç0–À0–¹0–²0–«0–¤0–0––0–0–ˆ0–0–z0–s0–l0–e0–^0–W0–P0–I0–B0–;0–40–-0–&0–0–0–0– 0–0–ü/–õ/–î/–ç/–à/–Ù/–Ò/–Ë/–Ä/–½/–¶/–¯/–¨/–¡/–š/–“/–Œ/–…/–~/–w/–p/–i/–b/–[/–T/–M/–F/–?/–8/–1/–*/–#/–/–/–/–/–/–ù.–ò.–ë.–ä.–Ý.–Ö.–Ï.–È.–Á.–º.–³.–¬.–¥.–ž.–—.–.–‰.–‚.–{.–t.–m.–f.–_.–X.–Q.–J.–C.–<.–5.–..–'.– .–.–.– .–.–ý-–ö-–ï-–è-–á-–Ú-–Ó-–Ì-–Å-–¾-–·-–°-–©-–¢-–›-–”-–-–†-–-–x-–q-–j-–c-–\-–U-–N-–G-–@-–9-–2-–+-–$-–-–-–-–-–-–ú,–ó,–ì,–å,–Þ,–×,–Ð,–É,–Â,–»,–´,–­,–¦,–Ÿ,–˜,–‘,–Š,–ƒ,–|,–u,–n,–g,–`,–Y,–R,–K,–D,–=,–6,–/,–(,–!,–,–,– ,–,–þ+–÷+–ð+–é+–â+–Û+–Ô+–Í+–Æ+–¿+–¸+–±+–ª+–£+–œ+–•+–Ž+–‡+–€+–y+–r+–k+–d+–]+–V+–O+–H+–A+–:+–3+–,+–%+–+–+–+– +–+–û*–ô*–í*–æ*–ß*–Ø*–Ñ*–Ê*–Ã*–¼*–µ*–®*–§*– *–™*–’*–‹*–„*–}*–v*–o*–h*–a*–Z*–S*–L*–E*–>*–7*–0*–)*–"*–*–*– *–*–ÿ)–ø)–ñ)–ê)–ã)–Ü)–Õ)–Î)–Ç)–À)–¹)–²)–«)–¤)–)––)–)–ˆ)–)–z)–s)–l)–e)–^)–W)–P)–I)–B)–;)–4)–-)–&)–)–)–)– )–)–ü(–õ(–î(–ç(–à(–Ù(–Ò(–Ë(–Ä(–½(–¶(–¯(–¨(–¡(–š(–“(–Œ(–…(–~(–w(–p(–i(–b(–[(–T(–M(–F(–?(–8(–1(–*(–#(–(–(–(–(–(–ù'–ò'–ë'–ä'–Ý'–Ö'–Ï'–È'–Á'–º'–³'–¬'–¥'–ž'–—'–'–‰'–‚'–{'–t'–m'–f'–_'–X'–Q'–J'–C'–<'–5'–.'–''– '–'–'– '–'–ý&–ö&–ï&–è&–á&–Ú&–Ó&–Ì&–Å&–¾&–·&–°&–©&–¢&–›&–”&–&–†&–&–x&–q&–j&–c&–\&–U&–N&–G&–@&–9&–2&–+&–$&–&–&–&–&–&–ú%–ó%–ì%–å%–Þ%–×%–Ð%–É%–Â%–»%–´%–­%–¦%–Ÿ%–˜%–‘%–Š%–ƒ%–|%–u%–n%–g%–`%–Y%–R%–K%–D%–=%–6%–/%–(%–!%–%–%– %–%–þ$–÷$–ð$–é$–â$–Û$–Ô$–Í$–Æ$–¿$–¸$–±$–ª$–£$–œ$–•$–Ž$–‡$–€$–y$–r$–k$–d$–]$–V$–O$–H$–A$–:$–3$–,$–%$–$–$–$– $–$–û#–ô#–í#–æ#–ß#–Ø#–Ñ#–Ê#–Ã#–¼#–µ#–®#–§#– #–™#–’#–‹#–„#–}#–v#–o#–h#–a#–Z#–S#–L#–E#–>#–7#–0#–)#–"#–#–#– #–#–ÿ"–ø"–ñ"–ê"–ã"–Ü"–Õ"–Î"–Ç"–À"–¹"–²"–«"–¤"–"––"–"–ˆ"–"–z"–s"–l"–e"–^"–W"–P"–I"–B"–;"–4"–-"–&"–"–"–"– "–"–ü!–õ!–î!–ç!–à!–Ù!–Ò!–Ë!–Ä!–½!–¶!–¯!–¨!–¡!–š!–“!–Œ!–…!–~!–w!–p!–i!–b!–[!–T!–M!–F!–?!–8!–1!–*!–#!–!–!–!–!–!–ù –ò –ë –ä –Ý –Ö –Ï –È –Á –º –³ –¬ –¥ –ž –— – –‰ –‚ –{ –t –m –f –_ –X –Q –J –C –< –5 –. –' – – – – – –ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú–ó–ì–å–ޖזЖɖ–»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û–ô–í–æ–ߖؖіʖÖ¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ–ø–ñ–ê–ã–ܖՖΖǖÀ–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú–ó–ì–å–ޖזЖɖ–»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û–ô–í–æ–ߖؖіʖÖ¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ–ø–ñ–ê–ã–ܖՖΖǖÀ–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú–ó–ì–å–ޖזЖɖ–»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û–ô–í–æ–ߖؖіʖÖ¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ –ø –ñ –ê –ã –Ü –Õ –Î –Ç –À –¹ –² –« –¤ – –– – –ˆ – –z –s –l –e –^ –W –P –I –B –; –4 –- –& – – – – – –ü –õ –î –ç –à –Ù –Ò –Ë –Ä –½ –¶ –¯ –¨ –¡ –š –“ –Œ –… –~ –w –p –i –b –[ –T –M –F –? –8 –1 –* –# – – – – – –ù –ò –ë –ä –Ý –Ö –Ï –È –Á –º –³ –¬ –¥ –ž –— – –‰ –‚ –{ –t –m –f –_ –X –Q –J –C –< –5 –. –' – – – – – –ý –ö –ï –è –á –Ú –Ó –Ì –Å –¾ –· –° –© –¢ –› –” – –† – –x –q –j –c –\ –U –N –G –@ –9 –2 –+ –$ – – – – – –ú –ó –ì –å –Þ –× –Ð –É – –» –´ –­ –¦ –Ÿ –˜ –‘ –Š –ƒ –| –u –n –g –` –Y –R –K –D –= –6 –/ –( –! – – – – –þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û–ô–í–æ–ߖؖіʖÖ¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ–ø–ñ–ê–ã–ܖՖΖǖÀ–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú–ó–ì–å–ޖזЖɖ–»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û–ô–í–æ–ß–Ø–Ñ–Ê–Ö¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿÿ•øÿ•ñÿ•êÿ•ãÿ•Üÿ•Õÿ•Îÿ•Çÿ•Àÿ•¹ÿ•²ÿ•«ÿ•¤ÿ•ÿ•–ÿ•ÿ•ˆÿ•ÿ•zÿ•sÿ•lÿ•eÿ•^ÿ•Wÿ•Pÿ•Iÿ•Bÿ•;ÿ•4ÿ•-ÿ•&ÿ•ÿ•ÿ•ÿ• ÿ•ÿ•üþ•õþ•îþ•çþ•àþ•Ùþ•Òþ•Ëþ•Äþ•½þ•¶þ•¯þ•¨þ•¡þ•šþ•“þ•Œþ•…þ•~þ•wþ•pþ•iþ•bþ•[þ•Tþ•Mþ•Fþ•?þ•8þ•1þ•*þ•#þ•þ•þ•þ•þ•þ•ùý•òý•ëý•äý•Ýý•Öý•Ïý•Èý•Áý•ºý•³ý•¬ý•¥ý•žý•—ý•ý•‰ý•‚ý•{ý•tý•mý•fý•_ý•Xý•Qý•Jý•Cý•<ý•5ý•.ý•'ý• ý•ý•ý• ý•ý•ýü•öü•ïü•èü•áü•Úü•Óü•Ìü•Åü•¾ü•·ü•°ü•©ü•¢ü•›ü•”ü•ü•†ü•ü•xü•qü•jü•cü•\ü•Uü•Nü•Gü•@ü•9ü•2ü•+ü•$ü•ü•ü•ü•ü•ü•úû•óû•ìû•åû•Þû•×û•Ðû•Éû•Âû•»û•´û•­û•¦û•Ÿû•˜û•‘û•Šû•ƒû•|û•uû•nû•gû•`û•Yû•Rû•Kû•Dû•=û•6û•/û•(û•!û•û•û• û•û•þú•÷ú•ðú•éú•âú•Ûú•Ôú•Íú•Æú•¿ú•¸ú•±ú•ªú•£ú•œú••ú•Žú•‡ú•€ú•yú•rú•kú•dú•]ú•Vú•Oú•Hú•Aú•:ú•3ú•,ú•%ú•ú•ú•ú• ú•ú•ûù•ôù•íù•æù•ßù•Øù•Ñù•Êù•Ãù•¼ù•µù•®ù•§ù• ù•™ù•’ù•‹ù•„ù•}ù•vù•où•hù•aù•Zù•Sù•Lù•Eù•>ù•7ù•0ù•)ù•"ù•ù•ù• ù•ù•ÿø•øø•ñø•êø•ãø•Üø•Õø•Îø•Çø•Àø•¹ø•²ø•«ø•¤ø•ø•–ø•ø•ˆø•ø•zø•sø•lø•eø•^ø•Wø•Pø•Iø•Bø•;ø•4ø•-ø•&ø•ø•ø•ø• ø•ø•ü÷•õ÷•î÷•ç÷•à÷•Ù÷•Ò÷•Ë÷•Ä÷•½÷•¶÷•¯÷•¨÷•¡÷•š÷•“÷•Œ÷•…÷•~÷•w÷•p÷•i÷•b÷•[÷•T÷•M÷•F÷•?÷•8÷•1÷•*÷•#÷•÷•÷•÷•÷•÷•ùö•òö•ëö•äö•Ýö•Öö•Ïö•Èö•Áö•ºö•³ö•¬ö•¥ö•žö•—ö•ö•‰ö•‚ö•{ö•tö•mö•fö•_ö•Xö•Qö•Jö•Cö•<ö•5ö•.ö•'ö• ö•ö•ö• ö•ö•ýõ•öõ•ïõ•èõ•áõ•Úõ•Óõ•Ìõ•Åõ•¾õ•·õ•°õ•©õ•¢õ•›õ•”õ•õ•†õ•õ•xõ•qõ•jõ•cõ•\õ•Uõ•Nõ•Gõ•@õ•9õ•2õ•+õ•$õ•õ•õ•õ•õ•õ•úô•óô•ìô•åô•Þô•×ô•Ðô•Éô•Âô•»ô•´ô•­ô•¦ô•Ÿô•˜ô•‘ô•Šô•ƒô•|ô•uô•nô•gô•`ô•Yô•Rô•Kô•Dô•=ô•6ô•/ô•(ô•!ô•ô•ô• ô•ô•þó•÷ó•ðó•éó•âó•Ûó•Ôó•Íó•Æó•¿ó•¸ó•±ó•ªó•£ó•œó••ó•Žó•‡ó•€ó•yó•ró•kó•dó•]ó•Vó•Oó•Hó•Aó•:ó•3ó•,ó•%ó•ó•ó•ó• ó•ó•ûò•ôò•íò•æò•ßò•Øò•Ñò•Êò•Ãò•¼ò•µò•®ò•§ò• ò•™ò•’ò•‹ò•„ò•}ò•vò•oò•hò•aò•Zò•Sò•Lò•Eò•>ò•7ò•0ò•)ò•"ò•ò•ò• ò•ò•ÿñ•øñ•ññ•êñ•ãñ•Üñ•Õñ•Îñ•Çñ•Àñ•¹ñ•²ñ•«ñ•¤ñ•ñ•–ñ•ñ•ˆñ•ñ•zñ•sñ•lñ•eñ•^ñ•Wñ•Pñ•Iñ•Bñ•;ñ•4ñ•-ñ•&ñ•ñ•ñ•ñ• ñ•ñ•üð•õð•îð•çð•àð•Ùð•Òð•Ëð•Äð•½ð•¶ð•¯ð•¨ð•¡ð•šð•“ð•Œð•…ð•~ð•wð•pð•ið•bð•[ð•Tð•Mð•Fð•?ð•8ð•1ð•*ð•#ð•ð•ð•ð•ð•ð•ùï•òï•ëï•äï•Ýï•Öï•Ïï•Èï•Áï•ï•{ï•tï•mï•fï•_ï•Xï•Qï•Jï•Cï•<ï•5ï•.ï•'ï• ï•ï•ï• ï•ï•ýî•öî•ïî•èî•áî•Úî•Óî•Ìî•Åî•î•î•xî•qî•jî•cî•\î•Uî•Nî•Gî•@î•9î•2î•+î•$î•î•î•î•î•î•úí•óí•ìí•åí•Þí•×í•Ðí•Éí•Â핻해항핦핟하핑핊핃í•|í•uí•ní•gí•`í•Yí•Rí•Kí•Dí•=í•6í•/í•(í•!í•í•í• í•í•þì•÷ì•ðì•éì•âì•Ûì•Ôì•Íì•Æì•¿ì•¸ì•±ì•ªì•£ì•œì••ì•Žì•‡ì•€ì•yì•rì•kì•dì•]ì•Vì•Oì•Hì•Aì•:ì•3ì•,ì•%ì•ì•ì•ì• ì•ì•ûë•ôë•íë•æë•ßë•Øë•Ñë•Êë•Ã땼땵땮땧땠땙땒땋땄ë•}ë•vë•oë•hë•aë•Zë•Së•Lë•Eë•>ë•7ë•0ë•)ë•"ë•ë•ë• ë•ë•ÿê•øê•ñê•êê•ãê•Üê•Õê•Îê•Çê•Àꕹꕲꕫꕤê•ê•–ê•ꕈê•ê•zê•sê•lê•eê•^ê•Wê•Pê•Iê•Bê•;ê•4ê•-ê•&ê•ê•ê•ê• ê•ê•üé•õé•îé•çé•àé•Ùé•Òé•Ëé•Ä镽镶镯镨镡镚镓镌镅é•~é•wé•pé•ié•bé•[é•Té•Mé•Fé•?é•8é•1é•*é•#é•é•é•é•é•é•ùè•òè•ëè•äè•Ýè•Öè•Ïè•Èè•Á蕺蕳蕬蕥蕞蕗è•蕉蕂è•{è•tè•mè•fè•_è•Xè•Qè•Jè•Cè•<è•5è•.è•'è• è•è•è• è•è•ýç•öç•ïç•èç•áç•Úç•Óç•Ìç•Å畾畷異畩畢畛畔ç•畆ç•ç•xç•qç•jç•cç•\ç•Uç•Nç•Gç•@ç•9ç•2ç•+ç•$ç•ç•ç•ç•ç•ç•úæ•óæ•ìæ•åæ•Þæ•׿•Ðæ•Éæ•Âæ•»æ•´æ•­æ•¦æ•Ÿæ•˜æ•‘敊敃æ•|æ•uæ•næ•gæ•`æ•Yæ•Ræ•Kæ•Dæ•=æ•6æ•/æ•(æ•!æ•æ•æ• æ•æ•þå•÷å•ðå•éå•âå•Ûå•Ôå•Íå•Æå•¿å•¸å•±å•ªå•£å•œå••å•Žå•‡å•€å•yå•rå•kå•då•]å•Vå•Oå•Hå•Aå•:å•3å•,å•%å•å•å•å• å•å•ûä•ôä•í䕿ä•ß䕨ä•Ñä•Êä•Ã䕼䕵䕮䕧䕠䕙䕒䕋䕄ä•}ä•vä•oä•hä•aä•Zä•Sä•Lä•Eä•>ä•7ä•0ä•)ä•"ä•ä•ä• ä•ä•ÿã•øã•ñã•êã•ãã•Üã•Õã•Îã•Çã•À㕹㕲㕫㕤ã•ã•–ã•㕈ã•ã•zã•sã•lã•eã•^ã•Wã•Pã•Iã•Bã•;ã•4ã•-ã•&ã•ã•ã•ã• ã•ã•üâ•õâ•îâ•çâ•àâ•Ùâ•Òâ•Ëâ•Ä╽╶╯╨╡╚╓╌╅â•~â•wâ•pâ•iâ•bâ•[â•Tâ•Mâ•Fâ•?â•8â•1â•*â•#â•â•â•â•â•â•ùá•òá•ëá•äá•Ýá•Öá•Ïá•Èá•Áᕺᕳᕬᕥᕞᕗá•ᕉᕂá•{á•tá•má•fá•_á•Xá•Qá•Já•Cá•<á•5á•.á•'á• á•á•á• á•á•ýà•öà•ïà•èà•áà•Úà•Óà•Ìà•Åà•¾à•·à•°à•©à•¢à•›à•”à•à•†à•à•xà•qà•jà•cà•\à•Uà•Nà•Gà•@à•9à•2à•+à•$à•à•à•à•à•à•úß•óß•ìß•åß•Þß•×ß•Ðß•Éß•Âß•»ß•´ß•­ß•¦ß•Ÿß•˜ß•‘ß•Šß•ƒß•|ß•uß•nß•gß•`ß•Yß•Rß•Kß•Dß•=ß•6ß•/ß•(ß•!ߕߕߕ ߕߕþÞ•÷Þ•ðÞ•éÞ•âÞ•ÛÞ•ÔÞ•ÍÞ•ÆÞ•¿Þ•¸Þ•±Þ•ªÞ•£Þ•œÞ••Þ•ŽÞ•‡Þ•€Þ•yÞ•rÞ•kÞ•dÞ•]Þ•VÞ•OÞ•HÞ•AÞ•:Þ•3Þ•,Þ•%Þ•Þ•Þ•Þ• Þ•Þ•ûÝ•ôÝ•íÝ•æÝ•ßÝ•ØÝ•ÑÝ•ÊÝ•ÃÝ•¼Ý•µÝ•®Ý•§Ý• Ý•™Ý•’Ý•‹Ý•„Ý•}Ý•vÝ•oÝ•hÝ•aÝ•ZÝ•SÝ•LÝ•EÝ•>Ý•7Ý•0Ý•)Ý•"ݕݕݕ ݕݕÿÜ•øÜ•ñÜ•êÜ•ãÜ•ÜÜ•ÕÜ•ÎÜ•ÇÜ•ÀÜ•¹Ü•²Ü•«Ü•¤Ü•Ü•–ܕܕˆÜ•Ü•zÜ•sÜ•lÜ•eÜ•^Ü•WÜ•PÜ•IÜ•BÜ•;Ü•4Ü•-Ü•&ܕܕܕܕ ܕܕüÛ•õÛ•îÛ•çÛ•àÛ•ÙÛ•ÒÛ•ËÛ•ÄÛ•½Û•¶Û•¯Û•¨Û•¡Û•šÛ•“Û•ŒÛ•…Û•~Û•wÛ•pÛ•iÛ•bÛ•[Û•TÛ•MÛ•FÛ•?Û•8Û•1Û•*Û•#Û•Û•Û•Û•Û•Û•ùÚ•òÚ•ëÚ•äÚ•ÝÚ•ÖÚ•ÏÚ•ÈÚ•ÁÚ•ºÚ•³Ú•¬Ú•¥Ú•žÚ•—Ú•Ú•‰Ú•‚Ú•{Ú•tÚ•mÚ•fÚ•_Ú•XÚ•QÚ•JÚ•CÚ•<Ú•5Ú•.Ú•'Ú• Ú•Ú•Ú• Ú•Ú•ýÙ•öÙ•ïÙ•èÙ•áÙ•ÚÙ•ÓÙ•ÌÙ•ÅÙ•¾Ù•·Ù•°Ù•©Ù•¢Ù•›Ù•”ٕٕ†Ù•Ù•xÙ•qÙ•jÙ•cÙ•\Ù•UÙ•NÙ•GÙ•@Ù•9Ù•2Ù•+Ù•$ٕٕٕٕٕٕúØ•óØ•ìØ•娕ÞØ•ר•ÐØ•ÉØ•ÂØ•»Ø•´Ø•­Ø•¦Ø•ŸØ•˜Ø•‘Ø•ŠØ•ƒØ•|Ø•uØ•nØ•gØ•`Ø•YØ•RØ•KØ•DØ•=Ø•6Ø•/Ø•(Ø•!ؕؕؕ ؕؕþו÷וðוéוâוÛוÔוÍוÆ×•¿×•¸×•±×•ª×•£×•œ×••וŽ×•‡×•€×•yוrוkוdו]וVוOוHוAו:ו3ו,ו%וווו ווûÖ•ôÖ•íÖ•æÖ•ßÖ•ØÖ•ÑÖ•ÊÖ•ÃÖ•¼Ö•µÖ•®Ö•§Ö• Ö•™Ö•’Ö•‹Ö•„Ö•}Ö•vÖ•oÖ•hÖ•aÖ•ZÖ•SÖ•LÖ•EÖ•>Ö•7Ö•0Ö•)Ö•"Ö•Ö•Ö• Ö•Ö•ÿÕ•øÕ•ñÕ•êÕ•ãÕ•ÜÕ•ÕÕ•ÎÕ•ÇÕ•ÀÕ•¹Õ•²Õ•«Õ•¤Õ•Õ•–Õ•Õ•ˆÕ•Õ•zÕ•sÕ•lÕ•eÕ•^Õ•WÕ•PÕ•IÕ•BÕ•;Õ•4Õ•-Õ•&Õ•Õ•Õ•Õ• Õ•Õ•üÔ•õÔ•îÔ•çÔ•àÔ•ÙÔ•ÒÔ•ËÔ•ÄÔ•½Ô•¶Ô•¯Ô•¨Ô•¡Ô•šÔ•“Ô•ŒÔ•…Ô•~Ô•wÔ•pÔ•iÔ•bÔ•[Ô•TÔ•MÔ•FÔ•?Ô•8Ô•1Ô•*Ô•#Ô•Ô•Ô•Ô•Ô•Ô•ùÓ•òÓ•ëÓ•äÓ•ÝÓ•ÖÓ•ÏÓ•ÈÓ•ÁÓ•ºÓ•³Ó•¬Ó•¥Ó•žÓ•—Ó•Ó•‰Ó•‚Ó•{Ó•tÓ•mÓ•fÓ•_Ó•XÓ•QÓ•JÓ•CÓ•<Ó•5Ó•.Ó•'Ó• Ó•Ó•Ó• Ó•Ó•ýÒ•öÒ•ïÒ•èÒ•áÒ•ÚÒ•ÓÒ•ÌÒ•ÅÒ•¾Ò•·Ò•°Ò•©Ò•¢Ò•›Ò•”Ò•Ò•†Ò•Ò•xÒ•qÒ•jÒ•cÒ•\Ò•UÒ•NÒ•GÒ•@Ò•9Ò•2Ò•+Ò•$Ò•Ò•Ò•Ò•Ò•Ò•úÑ•óÑ•ìÑ•åÑ•ÞÑ•×Ñ•ÐÑ•ÉÑ•ÂÑ•»Ñ•´Ñ•­Ñ•¦Ñ•ŸÑ•˜Ñ•‘Ñ•ŠÑ•ƒÑ•|Ñ•uÑ•nÑ•gÑ•`Ñ•YÑ•RÑ•KÑ•DÑ•=Ñ•6Ñ•/Ñ•(Ñ•!ѕѕѕ ѕѕþЕ÷ЕðЕéЕâЕÛЕÔЕÍЕÆÐ•¿Ð•¸Ð•±Ð•ªÐ•£Ð•œÐ••ЕŽÐ•‡Ð•€Ð•yЕrЕkЕdЕ]ЕVЕOЕHЕAЕ:Е3Е,Е%ЕЕЕЕ ЕЕûÏ•ôÏ•íÏ•æÏ•ßÏ•ØÏ•ÑÏ•ÊÏ•ÃÏ•¼Ï•µÏ•®Ï•§Ï• Ï•™Ï•’Ï•‹Ï•„Ï•}Ï•vÏ•oÏ•hÏ•aÏ•ZÏ•SÏ•LÏ•EÏ•>Ï•7Ï•0Ï•)Ï•"ϕϕϕ ϕϕÿΕøÎ•ñΕêΕãΕÜΕÕΕÎΕÇΕÀΕ¹Î•²Î•«Î•¤Î•Ε–ΕΕˆÎ•ΕzΕsΕlΕeΕ^ΕWΕPΕIΕBΕ;Ε4Ε-Ε&ΕΕΕΕ ΕΕüÍ•õÍ•îÍ•çÍ•àÍ•ÙÍ•ÒÍ•ËÍ•ÄÍ•½Í•¶Í•¯Í•¨Í•¡Í•šÍ•“Í•ŒÍ•…Í•~Í•wÍ•pÍ•iÍ•bÍ•[Í•TÍ•MÍ•FÍ•?Í•8Í•1Í•*Í•#͕͕͕͕͕͕ùÌ•òÌ•ëÌ•äÌ•ÝÌ•ÖÌ•ÏÌ•ÈÌ•ÁÌ•ºÌ•³Ì•¬Ì•¥Ì•žÌ•—̕̕‰Ì•‚Ì•{Ì•tÌ•mÌ•fÌ•_Ì•XÌ•QÌ•JÌ•CÌ•<Ì•5Ì•.Ì•'Ì• ̕̕̕ ̕̕ýË•öË•ïË•èË•áË•ÚË•ÓË•ÌË•ÅË•¾Ë•·Ë•°Ë•©Ë•¢Ë•›Ë•”˕˕†Ë•Ë•xË•qË•jË•cË•\Ë•UË•NË•GË•@Ë•9Ë•2Ë•+Ë•$˕˕˕˕˕˕úÊ•óÊ•ìÊ•åÊ•ÞÊ•×Ê•ÐÊ•ÉÊ•ÂÊ•»Ê•´Ê•­Ê•¦Ê•ŸÊ•˜Ê•‘Ê•ŠÊ•ƒÊ•|Ê•uÊ•nÊ•gÊ•`Ê•YÊ•RÊ•KÊ•DÊ•=Ê•6Ê•/Ê•(Ê•!ʕʕʕ ʕʕþÉ•÷É•ðÉ•éÉ•âÉ•ÛÉ•ÔÉ•ÍÉ•ÆÉ•¿É•¸É•±É•ªÉ•£É•œÉ••É•ŽÉ•‡É•€É•yÉ•rÉ•kÉ•dÉ•]É•VÉ•OÉ•HÉ•AÉ•:É•3É•,É•%ɕɕɕɕ ɕɕûÈ•ôÈ•íÈ•æÈ•ßÈ•ØÈ•ÑÈ•ÊÈ•ÃÈ•¼È•µÈ•®È•§È• È•™È•’È•‹È•„È•}È•vÈ•oÈ•hÈ•aÈ•ZÈ•SÈ•LÈ•EÈ•>È•7È•0È•)È•"ȕȕȕ ȕȕÿÇ•øÇ•ñÇ•êÇ•ãÇ•ÜÇ•ÕÇ•ÎÇ•ÇÇ•ÀÇ•¹Ç•²Ç•«Ç•¤Ç•Ç•–ǕǕˆÇ•Ç•zÇ•sÇ•lÇ•eÇ•^Ç•WÇ•PÇ•IÇ•BÇ•;Ç•4Ç•-Ç•&ǕǕǕǕ ǕǕüÆ•õÆ•îÆ•çÆ•àÆ•ÙÆ•ÒÆ•ËÆ•ÄÆ•½Æ•¶Æ•¯Æ•¨Æ•¡Æ•šÆ•“Æ•ŒÆ•…Æ•~Æ•wÆ•pÆ•iÆ•bÆ•[Æ•TÆ•MÆ•FÆ•?Æ•8Æ•1Æ•*Æ•#ƕƕƕƕƕƕùÅ•òÅ•ëÅ•äÅ•ÝÅ•ÖÅ•ÏÅ•ÈÅ•ÁÅ•ºÅ•³Å•¬Å•¥Å•žÅ•—ŕŕ‰Å•‚Å•{Å•tÅ•mÅ•fÅ•_Å•XÅ•QÅ•JÅ•CÅ•<Å•5Å•.Å•'Å• ŕŕŕ ŕŕýÄ•öÄ•ïÄ•èÄ•áÄ•ÚÄ•ÓÄ•ÌÄ•ÅÄ•¾Ä•·Ä•°Ä•©Ä•¢Ä•›Ä•”ĕĕ†Ä•Ä•xÄ•qÄ•jÄ•cÄ•\Ä•UÄ•NÄ•GÄ•@Ä•9Ä•2Ä•+Ä•$ĕĕĕĕĕĕúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂջմխզ՟՘Õ‘ՊՃÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþ•÷•ð•é•â•Û•Ô•Í•ÆÂ•¿Â•¸Â•±Â•ªÂ•£Â•œÂ•••ŽÂ•‡Â•€Â•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••ûÁ•ôÁ•íÁ•æÁ•ßÁ•ØÁ•ÑÁ•ÊÁ•ÃÁ•¼Á•µÁ•®Á•§Á• Á•™Á•’Á•‹Á•„Á•}Á•vÁ•oÁ•hÁ•aÁ•ZÁ•SÁ•LÁ•EÁ•>Á•7Á•0Á•)Á•"Á•Á•Á• Á•Á•ÿÀ•øÀ•ñÀ•êÀ•ãÀ•ÜÀ•ÕÀ•ÎÀ•ÇÀ•ÀÀ•¹À•²À•«À•¤À•À•–À•À•ˆÀ•À•zÀ•sÀ•lÀ•eÀ•^À•WÀ•PÀ•IÀ•BÀ•;À•4À•-À•&À•À•À•À• À•À•ü¿•õ¿•î¿•ç¿•à¿•Ù¿•Ò¿•Ë¿•Ä¿•½¿•¶¿•¯¿•¨¿•¡¿•š¿•“¿•Œ¿•…¿•~¿•w¿•p¿•i¿•b¿•[¿•T¿•M¿•F¿•?¿•8¿•1¿•*¿•#¿•¿•¿•¿•¿•¿•ù¾•ò¾•뾕侕ݾ•Ö¾•Ͼ•Ⱦ•Á¾•º¾•³¾•¬¾•¥¾•ž¾•—¾•¾•‰¾•‚¾•{¾•t¾•m¾•f¾•_¾•X¾•Q¾•J¾•C¾•<¾•5¾•.¾•'¾• ¾•¾•¾• ¾•¾•ý½•ö½•u轕ὕÚ½•Ó½•̽•Ž•¾½•·½•°½•©½•¢½•›½•”½•½•†½•½•x½•q½•j½•c½•\½•U½•N½•G½•@½•9½•2½•+½•$½•½•½•½•½•½•ú¼•ó¼•켕引Þ¼•×¼•м•ɼ•¼•»¼•´¼•­¼•¦¼•Ÿ¼•˜¼•‘¼•м•ƒ¼•|¼•u¼•n¼•g¼•`¼•Y¼•R¼•K¼•D¼•=¼•6¼•/¼•(¼•!¼•¼•¼• ¼•¼•þ»•÷»•ð»•黕⻕Û»•Ô»•Í»•Æ»•¿»•¸»•±»•ª»•£»•œ»••»•Ž»•‡»•€»•y»•r»•k»•d»•]»•V»•O»•H»•A»•:»•3»•,»•%»•»•»•»• »•»•ûº•ôº•íº•溕ߺ•غ•Ѻ•ʺ•ú•¼º•µº•®º•§º• º•™º•’º•‹º•„º•}º•vº•oº•hº•aº•Zº•Sº•Lº•Eº•>º•7º•0º•)º•"º•º•º• º•º•ÿ¹•ø¹•ñ¹•깕㹕ܹ•Õ¹•ι•ǹ•À¹•¹¹•²¹•«¹•¤¹•¹•–¹•¹•ˆ¹•¹•z¹•s¹•l¹•e¹•^¹•W¹•P¹•I¹•B¹•;¹•4¹•-¹•&¹•¹•¹•¹• ¹•¹•ü¸•õ¸•縕ตÙ¸•Ò¸•˸•ĸ•½¸•¶¸•¯¸•¨¸•¡¸•š¸•“¸•Œ¸•…¸•~¸•w¸•p¸•i¸•b¸•[¸•T¸•M¸•F¸•?¸•8¸•1¸•*¸•#¸•¸•¸•¸•¸•¸•ù·•ò·•ë·•ä·•Ý·•Ö·•Ï·•È·•Á·•º·•³·•¬·•¥·•ž·•—·•·•‰·•‚·•{·•t·•m·•f·•_·•X·•Q·•J·•C·•<·•5·•.·•'·• ·•·•·• ·•·•ý¶•ö¶•ï¶•è¶•á¶•Ú¶•Ó¶•̶•Ŷ•¾¶•·¶•°¶•©¶•¢¶•›¶•”¶•¶•†¶•¶•x¶•q¶•j¶•c¶•\¶•U¶•N¶•G¶•@¶•9¶•2¶•+¶•$¶•¶•¶•¶•¶•¶•úµ•óµ•쵕嵕Þµ•×µ•е•ɵ•µ•»µ•´µ•­µ•¦µ•Ÿµ•˜µ•‘µ•е•ƒµ•|µ•uµ•nµ•gµ•`µ•Yµ•Rµ•Kµ•Dµ•=µ•6µ•/µ•(µ•!µ•µ•µ• µ•µ•þ´•÷´•ð´•é´•â´•Û´•Ô´•Í´•Æ´•¿´•¸´•±´•ª´•£´•œ´••´•Ž´•‡´•€´•y´•r´•k´•d´•]´•V´•O´•H´•A´•:´•3´•,´•%´•´•´•´• ´•´•û³•ô³•í³•法ß³•س•ѳ•ʳ•ó•¼³•µ³•®³•§³• ³•™³•’³•‹³•„³•}³•v³•o³•h³•a³•Z³•S³•L³•E³•>³•7³•0³•)³•"³•³•³• ³•³•ÿ²•ø²•ñ²•겕㲕ܲ•Õ²•β•Dz•À²•¹²•²²•«²•¤²•²•–²•²•ˆ²•²•z²•s²•l²•e²•^²•W²•P²•I²•B²•;²•4²•-²•&²•²•²•²• ²•²•ü±•õ±•籕ౕÙ±•Ò±•˱•ı•½±•¶±•¯±•¨±•¡±•𱕓±•Œ±•…±•~±•w±•p±•i±•b±•[±•T±•M±•F±•?±•8±•1±•*±•#±•±•±•±•±•±•ù°•ò°•ë°•ä°•ݰ•Ö°•ϰ•Ȱ•Á°•º°•³°•¬°•¥°•ž°•—°•°•‰°•‚°•{°•t°•m°•f°•_°•X°•Q°•J°•C°•<°•5°•.°•'°• °•°•°• °•°•ý¯•ö¯•ﯕ试ᯕÚ¯•Ó¯•̯•ů•¾¯•·¯•°¯•©¯•¢¯•›¯•”¯•¯•†¯•¯•x¯•q¯•j¯•c¯•\¯•U¯•N¯•G¯•@¯•9¯•2¯•+¯•$¯•¯•¯•¯•¯•¯•ú®•ó®•쮕宕Þ®•×®•Ю•É®•®•»®•´®•­®•¦®•Ÿ®•˜®•‘®•Š®•ƒ®•|®•u®•n®•g®•`®•Y®•R®•K®•D®•=®•6®•/®•(®•!®•®•®• ®•®•þ­•÷­•ð­•é­•â­•Û­•Ô­•Í­•Æ­•¿­•¸­•±­•ª­•£­•œ­••­•Ž­•‡­•€­•y­•r­•k­•d­•]­•V­•O­•H­•A­•:­•3­•,­•%­•­•­•­• ­•­•û¬•ô¬•í¬•欕߬•ج•Ѭ•ʬ•야¬•µ¬•®¬•§¬• ¬•™¬•’¬•‹¬•„¬•}¬•v¬•o¬•h¬•a¬•Z¬•S¬•L¬•E¬•>¬•7¬•0¬•)¬•"¬•¬•¬• ¬•¬•ÿ«•ø«•ñ«•ê«•ã«•Ü«•Õ«•Ϋ•Ç«•À«•¹«•²«•««•¤«•«•–«•«•ˆ«•«•z«•s«•l«•e«•^«•W«•P«•I«•B«•;«•4«•-«•&«•«•«•«• «•«•üª•õª•窕કÙª•Òª•˪•Ī•½ª•¶ª•¯ª•¨ª•¡ª•šª•“ª•Œª•…ª•~ª•wª•pª•iª•bª•[ª•Tª•Mª•Fª•?ª•8ª•1ª•*ª•#ª•ª•ª•ª•ª•ª•ù©•ò©•ë©•ä©•Ý©•Ö©•Ï©•È©•Á©•º©•³©•¬©•¥©•ž©•—©•©•‰©•‚©•{©•t©•m©•f©•_©•X©•Q©•J©•C©•<©•5©•.©•'©• ©•©•©• ©•©•ý¨•ö¨•凞訕ᨕÚ¨•Ó¨•̨•Ũ•¾¨•·¨•°¨•©¨•¢¨•›¨•”¨•¨•†¨•¨•x¨•q¨•j¨•c¨•\¨•U¨•N¨•G¨•@¨•9¨•2¨•+¨•$¨•¨•¨•¨•¨•¨•ú§•ó§•ì§•å§•Þ§•×§•Ч•ɧ•§•»§•´§•­§•¦§•Ÿ§•˜§•‘§•Ч•ƒ§•|§•u§•n§•g§•`§•Y§•R§•K§•D§•=§•6§•/§•(§•!§•§•§• §•§•þ¦•÷¦•ð¦•馕⦕Û¦•Ô¦•ͦ•Ʀ•¿¦•¸¦•±¦•ª¦•£¦•œ¦••¦•ަ•‡¦•€¦•y¦•r¦•k¦•d¦•]¦•V¦•O¦•H¦•A¦•:¦•3¦•,¦•%¦•¦•¦•¦• ¦•¦•û¥•ô¥•í¥•楕ߥ•Ø¥•Ñ¥•Ê¥•Ã¥•¼¥•µ¥•®¥•§¥• ¥•™¥•’¥•‹¥•„¥•}¥•v¥•o¥•h¥•a¥•Z¥•S¥•L¥•E¥•>¥•7¥•0¥•)¥•"¥•¥•¥• ¥•¥•ÿ¤•ø¤•ñ¤•ꤕ㤕ܤ•Õ¤•Τ•Ǥ•À¤•¹¤•²¤•«¤•¤¤•¤•–¤•¤•ˆ¤•¤•z¤•s¤•l¤•e¤•^¤•W¤•P¤•I¤•B¤•;¤•4¤•-¤•&¤•¤•¤•¤• ¤•¤•ü£•õ£•磕ࣕÙ£•Ò£•Ë£•Ä£•½£•¶£•¯£•¨£•¡£•𣕓£•Œ£•…£•~£•w£•p£•i£•b£•[£•T£•M£•F£•?£•8£•1£•*£•#£•£•£•£•£•£•ù¢•ò¢•뢕䢕Ý¢•Ö¢•Ï¢•È¢•Á¢•º¢•³¢•¬¢•¥¢•ž¢•—¢•¢•‰¢•‚¢•{¢•t¢•m¢•f¢•_¢•X¢•Q¢•J¢•C¢•<¢•5¢•.¢•'¢• ¢•¢•¢• ¢•¢•ý¡•ö¡•ï¡•è¡•á¡•Ú¡•Ó¡•Ì¡•Å¡•¾¡•·¡•°¡•©¡•¢¡•›¡•”¡•¡•†¡•¡•x¡•q¡•j¡•c¡•\¡•U¡•N¡•G¡•@¡•9¡•2¡•+¡•$¡•¡•¡•¡•¡•¡•ú •ó •ì •å •Þ •× •Р•É • •» •´ •­ •¦ •Ÿ •˜ •‘ •Š •ƒ •| •u •n •g •` •Y •R •K •D •= •6 •/ •( •! • • •  • •þŸ•÷Ÿ•ðŸ•韕⟕ÛŸ•ÔŸ•ÍŸ•ÆŸ•¿Ÿ•¸Ÿ•±Ÿ•ªŸ•£Ÿ•œŸ••Ÿ•ŽŸ•‡Ÿ•€Ÿ•yŸ•rŸ•kŸ•dŸ•]Ÿ•VŸ•OŸ•HŸ•AŸ•:Ÿ•3Ÿ•,Ÿ•%Ÿ•Ÿ•Ÿ•Ÿ• Ÿ•Ÿ•ûž•ôž•힕枕ߞ•Øž•Ñž•Êž•Þ•¼ž•µž•®ž•§ž• ž•™ž•’ž•‹ž•„ž•}ž•vž•ož•hž•až•Zž•Sž•Lž•Ež•>ž•7ž•0ž•)ž•"ž•ž•ž• ž•ž•ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••üœ•õœ•眕àœ•Ùœ•Òœ•Ëœ•Äœ•½œ•¶œ•¯œ•¨œ•¡œ•šœ•“œ•Œœ•…œ•~œ•wœ•pœ•iœ•bœ•[œ•Tœ•Mœ•Fœ•?œ•8œ•1œ•*œ•#œ•œ•œ•œ•œ•œ•ù›•ò›•뛕䛕Ý›•Ö›•Ï›•È›•Á›•º›•³›•¬›•¥›•ž›•—›•›•‰›•‚›•{›•t›•m›•f›•_›•X›•Q›•J›•C›•<›•5›•.›•'›• ›•›•›• ›•›•ýš•öš•蚕ᚕښ•Óš•Ìš•Åš•¾š•·š•°š•©š•¢š•›š•”š•š•†š•š•xš•qš•jš•cš•\š•Uš•Nš•Gš•@š•9š•2š•+š•$š•š•š•š•š•š•ú™•ó™•왕噕Þ™•×™•Й•É™•™•»™•´™•­™•¦™•Ÿ™•˜™•‘™•Š™•ƒ™•|™•u™•n™•g™•`™•Y™•R™•K™•D™•=™•6™•/™•(™•!™•™•™• ™•™•þ˜•÷˜•ð˜•阕☕Û˜•Ô˜•͘•Ƙ•¿˜•¸˜•±˜•ª˜•£˜•œ˜••˜•Ž˜•‡˜•€˜•y˜•r˜•k˜•d˜•]˜•V˜•O˜•H˜•A˜•:˜•3˜•,˜•%˜•˜•˜•˜• ˜•˜•û—•ô—•í—•æ—•ß—•Ø—•Ñ—•Ê—•ו¼—•µ—•®—•§—• —•™—•’—•‹—•„—•}—•v—•o—•h—•a—•Z—•S—•L—•E—•>—•7—•0—•)—•"—•—•—• —•—•ÿ–•ø–•ñ–•ê–•ã–•Ü–•Õ–•Ζ•Ç–•À–•¹–•²–•«–•¤–•–•––•–•ˆ–•–•z–•s–•l–•e–•^–•W–•P–•I–•B–•;–•4–•-–•&–•–•–•–• –•–•ü••õ••î••ç••à••Ù••Ò••Ë••Ä••½••¶••¯••¨••¡••š••“••Œ••…••~••w••p••i••b••[••T••M••F••?••8••1••*••#••••••••••••ù”•ò”•딕䔕Ý”•Ö”•Ï”•È”•Á”•º”•³”•¬”•¥”•ž”•—”•”•‰”•‚”•{”•t”•m”•f”•_”•X”•Q”•J”•C”•<”•5”•.”•'”• ”•”•”• ”•”•ý“•ö“•ï“•è“•á“•Ú“•Ó“•Ì“•Å“•¾“•·“•°“•©“•¢“•›“•”“•“•†“•“•x“•q“•j“•c“•\“•U“•N“•G“•@“•9“•2“•+“•$“•“•“•“•“•“•ú’•ó’•ì’•å’•Þ’•×’•Ð’•É’•Â’•»’•´’•­’•¦’•Ÿ’•˜’•‘’•Š’•ƒ’•|’•u’•n’•g’•`’•Y’•R’•K’•D’•=’•6’•/’•(’•!’•’•’• ’•’•þ‘•÷‘•ð‘•é‘•â‘•Û‘•Ô‘•Í‘•Æ‘•¿‘•¸‘•±‘•ª‘•£‘•œ‘••‘•Ž‘•‡‘•€‘•y‘•r‘•k‘•d‘•]‘•V‘•O‘•H‘•A‘•:‘•3‘•,‘•%‘•‘•‘•‘• ‘•‘•û•ô•í•æ•ߕؕѕʕռ•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••üŽ•õŽ•玕àŽ•ÙŽ•ÒŽ•ËŽ•ÄŽ•½Ž•¶Ž•¯Ž•¨Ž•¡Ž•šŽ•“Ž•ŒŽ•…Ž•~Ž•wŽ•pŽ•iŽ•bŽ•[Ž•TŽ•MŽ•FŽ•?Ž•8Ž•1Ž•*Ž•#ޕޕޕޕޕޕù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ýŒ•öŒ•茕ጕÚŒ•ÓŒ•ÌŒ•ÅŒ•¾Œ•·Œ•°Œ•©Œ•¢Œ•›Œ•”Œ•Œ•†Œ•Œ•xŒ•qŒ•jŒ•cŒ•\Œ•UŒ•NŒ•GŒ•@Œ•9Œ•2Œ•+Œ•$Œ•Œ•Œ•Œ•Œ•Œ•ú‹•ó‹•ì‹•å‹•Þ‹•׋•Ћ•É‹•‹•»‹•´‹•­‹•¦‹•Ÿ‹•˜‹•‘‹•Š‹•ƒ‹•|‹•u‹•n‹•g‹•`‹•Y‹•R‹•K‹•D‹•=‹•6‹•/‹•(‹•!‹•‹•‹• ‹•‹•þŠ•÷Š•ðŠ•銕⊕ÛŠ•ÔŠ•ÍŠ•ÆŠ•¿Š•¸Š•±Š•ªŠ•£Š•œŠ••Š•ŽŠ•‡Š•€Š•yŠ•rŠ•kŠ•dŠ•]Š•VŠ•OŠ•HŠ•AŠ•:Š•3Š•,Š•%ЕЕЕЕ ЕЕû‰•ô‰•퉕払߉•؉•щ•ʉ•É•¼‰•µ‰•®‰•§‰• ‰•™‰•’‰•‹‰•„‰•}‰•v‰•o‰•h‰•a‰•Z‰•S‰•L‰•E‰•>‰•7‰•0‰•)‰•"‰•‰•‰• ‰•‰•ÿˆ•øˆ•ñˆ•ꈕ㈕܈•Õˆ•Έ•Lj•Àˆ•¹ˆ•²ˆ•«ˆ•¤ˆ•ˆ•–ˆ•ˆ•ˆˆ•ˆ•zˆ•sˆ•lˆ•eˆ•^ˆ•Wˆ•Pˆ•Iˆ•Bˆ•;ˆ•4ˆ•-ˆ•&ˆ•ˆ•ˆ•ˆ• ˆ•ˆ•ü‡•õ‡•燕à‡•Ù‡•Ò‡•ˇ•㕽‡•¶‡•¯‡•¨‡•¡‡•š‡•“‡•Œ‡•…‡•~‡•w‡•p‡•i‡•b‡•[‡•T‡•M‡•F‡•?‡•8‡•1‡•*‡•#‡•‡•‡•‡•‡•‡•ù†•ò†•놕䆕݆•Ö†•φ•Ȇ•Á†•º†•³†•¬†•¥†•ž†•—†•†•‰†•‚†•{†•t†•m†•f†•_†•X†•Q†•J†•C†•<†•5†•.†•'†• †•†•†• †•†•ý…•ö…•ï…•è…•á…•Ú…•Ó…•Ì…•Å…•¾…•·…•°…•©…•¢…•›…•”…•…•†…•…•x…•q…•j…•c…•\…•U…•N…•G…•@…•9…•2…•+…•$…•…•…•…•…•…•ú„•ó„•ì„•å„•Þ„•ׄ•Є•É„•„•»„•´„•­„•¦„•Ÿ„•˜„•‘„•Š„•ƒ„•|„•u„•n„•g„•`„•Y„•R„•K„•D„•=„•6„•/„•(„•!„•„•„• „•„•þƒ•÷ƒ•ðƒ•郕⃕Ûƒ•Ôƒ•̓•ƃ•¿ƒ•¸ƒ•±ƒ•ªƒ•£ƒ•œƒ••ƒ•Žƒ•‡ƒ•€ƒ•yƒ•rƒ•kƒ•dƒ•]ƒ•Vƒ•Oƒ•Hƒ•Aƒ•:ƒ•3ƒ•,ƒ•%ƒ•ƒ•ƒ•ƒ• ƒ•ƒ•û‚•ô‚•í‚•æ‚•ß‚•Ø‚•Ñ‚•Ê‚••¼‚•µ‚•®‚•§‚• ‚•™‚•’‚•‹‚•„‚•}‚•v‚•o‚•h‚•a‚•Z‚•S‚•L‚•E‚•>‚•7‚•0‚•)‚•"‚•‚•‚• ‚•‚•ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü€•õ€•瀕à€•Ù€•Ò€•Ë€•Ä€•½€•¶€•¯€•¨€•¡€•š€•“€•Œ€•…€•~€•w€•p€•i€•b€•[€•T€•M€•F€•?€•8€•1€•*€•#€•€•€•€•€•€•ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý~•ö~•ï~•è~•á~•Ú~•Ó~•Ì~•Å~•¾~•·~•°~•©~•¢~•›~•”~•~•†~•~•x~•q~•j~•c~•\~•U~•N~•G~•@~•9~•2~•+~•$~•~•~•~•~•~•ú}•ó}•ì}•å}•Þ}•×}•Ð}•É}•Â}•»}•´}•­}•¦}•Ÿ}•˜}•‘}•Š}•ƒ}•|}•u}•n}•g}•`}•Y}•R}•K}•D}•=}•6}•/}•(}•!}•}•}• }•}•þ|•÷|•ð|•é|•â|•Û|•Ô|•Í|•Æ|•¿|•¸|•±|•ª|•£|•œ|••|•Ž|•‡|•€|•y|•r|•k|•d|•]|•V|•O|•H|•A|•:|•3|•,|•%|•|•|•|• |•|•û{•ô{•í{•æ{•ß{•Ø{•Ñ{•Ê{•Ã{•¼{•µ{•®{•§{• {•™{•’{•‹{•„{•}{•v{•o{•h{•a{•Z{•S{•L{•E{•>{•7{•0{•){•"{•{•{• {•{•ÿz•øz•ñz•êz•ãz•Üz•Õz•Îz•Çz•Àz•¹z•²z•«z•¤z•z•–z•z•ˆz•z•zz•sz•lz•ez•^z•Wz•Pz•Iz•Bz•;z•4z•-z•&z•z•z•z• z•z•üy•õy•îy•çy•ày•Ùy•Òy•Ëy•Äy•½y•¶y•¯y•¨y•¡y•šy•“y•Œy•…y•~y•wy•py•iy•by•[y•Ty•My•Fy•?y•8y•1y•*y•#y•y•y•y•y•y•ùx•òx•ëx•äx•Ýx•Öx•Ïx•Èx•Áx•ºx•³x•¬x•¥x•žx•—x•x•‰x•‚x•{x•tx•mx•fx•_x•Xx•Qx•Jx•Cx•t•7t•0t•)t•"t•t•t• t•t•ÿs•øs•ñs•ês•ãs•Üs•Õs•Îs•Çs•Às•¹s•²s•«s•¤s•s•–s•s•ˆs•s•zs•ss•ls•es•^s•Ws•Ps•Is•Bs•;s•4s•-s•&s•s•s•s• s•s•ür•õr•îr•çr•àr•Ùr•Òr•Ër•Är•½r•¶r•¯r•¨r•¡r•šr•“r•Œr•…r•~r•wr•pr•ir•br•[r•Tr•Mr•Fr•?r•8r•1r•*r•#r•r•r•r•r•r•ùq•òq•ëq•äq•Ýq•Öq•Ïq•Èq•Áq•ºq•³q•¬q•¥q•žq•—q•q•‰q•‚q•{q•tq•mq•fq•_q•Xq•Qq•Jq•Cq•m•7m•0m•)m•"m•m•m• m•m•ÿl•øl•ñl•êl•ãl•Ül•Õl•Îl•Çl•Àl•¹l•²l•«l•¤l•l•–l•l•ˆl•l•zl•sl•ll•el•^l•Wl•Pl•Il•Bl•;l•4l•-l•&l•l•l•l• l•l•ük•õk•îk•çk•àk•Ùk•Òk•Ëk•Äk•½k•¶k•¯k•¨k•¡k•šk•“k•Œk•…k•~k•wk•pk•ik•bk•[k•Tk•Mk•Fk•?k•8k•1k•*k•#k•k•k•k•k•k•ùj•òj•ëj•äj•Ýj•Öj•Ïj•Èj•Áj•ºj•³j•¬j•¥j•žj•—j•j•‰j•‚j•{j•tj•mj•fj•_j•Xj•Qj•Jj•Cj•f•7f•0f•)f•"f•f•f• f•f•ÿe•øe•ñe•êe•ãe•Üe•Õe•Îe•Çe•Àe•¹e•²e•«e•¤e•e•–e•e•ˆe•e•ze•se•le•ee•^e•We•Pe•Ie•Be•;e•4e•-e•&e•e•e•e• e•e•üd•õd•îd•çd•àd•Ùd•Òd•Ëd•Äd•½d•¶d•¯d•¨d•¡d•šd•“d•Œd•…d•~d•wd•pd•id•bd•[d•Td•Md•Fd•?d•8d•1d•*d•#d•d•d•d•d•d•ùc•òc•ëc•äc•Ýc•Öc•Ïc•Èc•Ác•ºc•³c•¬c•¥c•žc•—c•c•‰c•‚c•{c•tc•mc•fc•_c•Xc•Qc•Jc•Cc•_•7_•0_•)_•"_•_•_• _•_•ÿ^•ø^•ñ^•ê^•ã^•Ü^•Õ^•Î^•Ç^•À^•¹^•²^•«^•¤^•^•–^•^•ˆ^•^•z^•s^•l^•e^•^^•W^•P^•I^•B^•;^•4^•-^•&^•^•^•^• ^•^•ü]•õ]•î]•ç]•à]•Ù]•Ò]•Ë]•Ä]•½]•¶]•¯]•¨]•¡]•š]•“]•Œ]•…]•~]•w]•p]•i]•b]•[]•T]•M]•F]•?]•8]•1]•*]•#]•]•]•]•]•]•ù\•ò\•ë\•ä\•Ý\•Ö\•Ï\•È\•Á\•º\•³\•¬\•¥\•ž\•—\•\•‰\•‚\•{\•t\•m\•f\•_\•X\•Q\•J\•C\•<\•5\•.\•'\• \•\•\• \•\•ý[•ö[•ï[•è[•á[•Ú[•Ó[•Ì[•Å[•¾[•·[•°[•©[•¢[•›[•”[•[•†[•[•x[•q[•j[•c[•\[•U[•N[•G[•@[•9[•2[•+[•$[•[•[•[•[•[•úZ•óZ•ìZ•åZ•ÞZ•×Z•ÐZ•ÉZ•ÂZ•»Z•´Z•­Z•¦Z•ŸZ•˜Z•‘Z•ŠZ•ƒZ•|Z•uZ•nZ•gZ•`Z•YZ•RZ•KZ•DZ•=Z•6Z•/Z•(Z•!Z•Z•Z• Z•Z•þY•÷Y•ðY•éY•âY•ÛY•ÔY•ÍY•ÆY•¿Y•¸Y•±Y•ªY•£Y•œY••Y•ŽY•‡Y•€Y•yY•rY•kY•dY•]Y•VY•OY•HY•AY•:Y•3Y•,Y•%Y•Y•Y•Y• Y•Y•ûX•ôX•íX•æX•ßX•ØX•ÑX•ÊX•ÃX•¼X•µX•®X•§X• X•™X•’X•‹X•„X•}X•vX•oX•hX•aX•ZX•SX•LX•EX•>X•7X•0X•)X•"X•X•X• X•X•ÿW•øW•ñW•êW•ãW•ÜW•ÕW•ÎW•ÇW•ÀW•¹W•²W•«W•¤W•W•–W•W•ˆW•W•zW•sW•lW•eW•^W•WW•PW•IW•BW•;W•4W•-W•&W•W•W•W• W•W•üV•õV•îV•çV•àV•ÙV•ÒV•ËV•ÄV•½V•¶V•¯V•¨V•¡V•šV•“V•ŒV•…V•~V•wV•pV•iV•bV•[V•TV•MV•FV•?V•8V•1V•*V•#V•V•V•V•V•V•ùU•òU•ëU•äU•ÝU•ÖU•ÏU•ÈU•ÁU•ºU•³U•¬U•¥U•žU•—U•U•‰U•‚U•{U•tU•mU•fU•_U•XU•QU•JU•CU•Q•7Q•0Q•)Q•"Q•Q•Q• Q•Q•ÿP•øP•ñP•êP•ãP•ÜP•ÕP•ÎP•ÇP•ÀP•¹P•²P•«P•¤P•P•–P•P•ˆP•P•zP•sP•lP•eP•^P•WP•PP•IP•BP•;P•4P•-P•&P•P•P•P• P•P•üO•õO•îO•çO•àO•ÙO•ÒO•ËO•ÄO•½O•¶O•¯O•¨O•¡O•šO•“O•ŒO•…O•~O•wO•pO•iO•bO•[O•TO•MO•FO•?O•8O•1O•*O•#O•O•O•O•O•O•ùN•òN•ëN•äN•ÝN•ÖN•ÏN•ÈN•ÁN•ºN•³N•¬N•¥N•žN•—N•N•‰N•‚N•{N•tN•mN•fN•_N•XN•QN•JN•CN•J•7J•0J•)J•"J•J•J• J•J•ÿI•øI•ñI•êI•ãI•ÜI•ÕI•ÎI•ÇI•ÀI•¹I•²I•«I•¤I•I•–I•I•ˆI•I•zI•sI•lI•eI•^I•WI•PI•II•BI•;I•4I•-I•&I•I•I•I• I•I•üH•õH•îH•çH•àH•ÙH•ÒH•ËH•ÄH•½H•¶H•¯H•¨H•¡H•šH•“H•ŒH•…H•~H•wH•pH•iH•bH•[H•TH•MH•FH•?H•8H•1H•*H•#H•H•H•H•H•H•ùG•òG•ëG•äG•ÝG•ÖG•ÏG•ÈG•ÁG•ºG•³G•¬G•¥G•žG•—G•G•‰G•‚G•{G•tG•mG•fG•_G•XG•QG•JG•CG•C•7C•0C•)C•"C•C•C• C•C•ÿB•øB•ñB•êB•ãB•ÜB•ÕB•ÎB•ÇB•ÀB•¹B•²B•«B•¤B•B•–B•B•ˆB•B•zB•sB•lB•eB•^B•WB•PB•IB•BB•;B•4B•-B•&B•B•B•B• B•B•üA•õA•îA•çA•àA•ÙA•ÒA•ËA•ÄA•½A•¶A•¯A•¨A•¡A•šA•“A•ŒA•…A•~A•wA•pA•iA•bA•[A•TA•MA•FA•?A•8A•1A•*A•#A•A•A•A•A•A•ù@•ò@•ë@•ä@•Ý@•Ö@•Ï@•È@•Á@•º@•³@•¬@•¥@•ž@•—@•@•‰@•‚@•{@•t@•m@•f@•_@•X@•Q@•J@•C@•<@•5@•.@•'@• @•@•@• @•@•ý?•ö?•ï?•è?•á?•Ú?•Ó?•Ì?•Å?•¾?•·?•°?•©?•¢?•›?•”?•?•†?•?•x?•q?•j?•c?•\?•U?•N?•G?•@?•9?•2?•+?•$?•?•?•?•?•?•ú>•ó>•ì>•å>•Þ>•×>•Ð>•É>•Â>•»>•´>•­>•¦>•Ÿ>•˜>•‘>•Š>•ƒ>•|>•u>•n>•g>•`>•Y>•R>•K>•D>•=>•6>•/>•(>•!>•>•>• >•>•þ=•÷=•ð=•é=•â=•Û=•Ô=•Í=•Æ=•¿=•¸=•±=•ª=•£=•œ=••=•Ž=•‡=•€=•y=•r=•k=•d=•]=•V=•O=•H=•A=•:=•3=•,=•%=•=•=•=• =•=•û<•ô<•í<•æ<•ß<•Ø<•Ñ<•Ê<•Ã<•¼<•µ<•®<•§<• <•™<•’<•‹<•„<•}<•v<•o<•h<•a<•Z<•S<•L<•E<•><•7<•0<•)<•"<•<•<• <•<•ÿ;•ø;•ñ;•ê;•ã;•Ü;•Õ;•Î;•Ç;•À;•¹;•²;•«;•¤;•;•–;•;•ˆ;•;•z;•s;•l;•e;•^;•W;•P;•I;•B;•;;•4;•-;•&;•;•;•;• ;•;•ü:•õ:•î:•ç:•à:•Ù:•Ò:•Ë:•Ä:•½:•¶:•¯:•¨:•¡:•š:•“:•Œ:•…:•~:•w:•p:•i:•b:•[:•T:•M:•F:•?:•8:•1:•*:•#:•:•:•:•:•:•ù9•ò9•ë9•ä9•Ý9•Ö9•Ï9•È9•Á9•º9•³9•¬9•¥9•ž9•—9•9•‰9•‚9•{9•t9•m9•f9•_9•X9•Q9•J9•C9•<9•59•.9•'9• 9•9•9• 9•9•ý8•ö8•ï8•è8•á8•Ú8•Ó8•Ì8•Å8•¾8•·8•°8•©8•¢8•›8•”8•8•†8•8•x8•q8•j8•c8•\8•U8•N8•G8•@8•98•28•+8•$8•8•8•8•8•8•ú7•ó7•ì7•å7•Þ7•×7•Ð7•É7•Â7•»7•´7•­7•¦7•Ÿ7•˜7•‘7•Š7•ƒ7•|7•u7•n7•g7•`7•Y7•R7•K7•D7•=7•67•/7•(7•!7•7•7• 7•7•þ6•÷6•ð6•é6•â6•Û6•Ô6•Í6•Æ6•¿6•¸6•±6•ª6•£6•œ6••6•Ž6•‡6•€6•y6•r6•k6•d6•]6•V6•O6•H6•A6•:6•36•,6•%6•6•6•6• 6•6•û5•ô5•í5•æ5•ß5•Ø5•Ñ5•Ê5•Ã5•¼5•µ5•®5•§5• 5•™5•’5•‹5•„5•}5•v5•o5•h5•a5•Z5•S5•L5•E5•>5•75•05•)5•"5•5•5• 5•5•ÿ4•ø4•ñ4•ê4•ã4•Ü4•Õ4•Î4•Ç4•À4•¹4•²4•«4•¤4•4•–4•4•ˆ4•4•z4•s4•l4•e4•^4•W4•P4•I4•B4•;4•44•-4•&4•4•4•4• 4•4•ü3•õ3•î3•ç3•à3•Ù3•Ò3•Ë3•Ä3•½3•¶3•¯3•¨3•¡3•š3•“3•Œ3•…3•~3•w3•p3•i3•b3•[3•T3•M3•F3•?3•83•13•*3•#3•3•3•3•3•3•ù2•ò2•ë2•ä2•Ý2•Ö2•Ï2•È2•Á2•º2•³2•¬2•¥2•ž2•—2•2•‰2•‚2•{2•t2•m2•f2•_2•X2•Q2•J2•C2•<2•52•.2•'2• 2•2•2• 2•2•ý1•ö1•ï1•è1•á1•Ú1•Ó1•Ì1•Å1•¾1•·1•°1•©1•¢1•›1•”1•1•†1•1•x1•q1•j1•c1•\1•U1•N1•G1•@1•91•21•+1•$1•1•1•1•1•1•ú0•ó0•ì0•å0•Þ0•×0•Ð0•É0•Â0•»0•´0•­0•¦0•Ÿ0•˜0•‘0•Š0•ƒ0•|0•u0•n0•g0•`0•Y0•R0•K0•D0•=0•60•/0•(0•!0•0•0• 0•0•þ/•÷/•ð/•é/•â/•Û/•Ô/•Í/•Æ/•¿/•¸/•±/•ª/•£/•œ/••/•Ž/•‡/•€/•y/•r/•k/•d/•]/•V/•O/•H/•A/•:/•3/•,/•%/•/•/•/• /•/•û.•ô.•í.•æ.•ß.•Ø.•Ñ.•Ê.•Ã.•¼.•µ.•®.•§.• .•™.•’.•‹.•„.•}.•v.•o.•h.•a.•Z.•S.•L.•E.•>.•7.•0.•).•".•.•.• .•.•ÿ-•ø-•ñ-•ê-•ã-•Ü-•Õ-•Î-•Ç-•À-•¹-•²-•«-•¤-•-•–-•-•ˆ-•-•z-•s-•l-•e-•^-•W-•P-•I-•B-•;-•4-•--•&-•-•-•-• -•-•ü,•õ,•î,•ç,•à,•Ù,•Ò,•Ë,•Ä,•½,•¶,•¯,•¨,•¡,•š,•“,•Œ,•…,•~,•w,•p,•i,•b,•[,•T,•M,•F,•?,•8,•1,•*,•#,•,•,•,•,•,•ù+•ò+•ë+•ä+•Ý+•Ö+•Ï+•È+•Á+•º+•³+•¬+•¥+•ž+•—+•+•‰+•‚+•{+•t+•m+•f+•_+•X+•Q+•J+•C+•<+•5+•.+•'+• +•+•+• +•+•ý*•ö*•ï*•è*•á*•Ú*•Ó*•Ì*•Å*•¾*•·*•°*•©*•¢*•›*•”*•*•†*•*•x*•q*•j*•c*•\*•U*•N*•G*•@*•9*•2*•+*•$*•*•*•*•*•*•ú)•ó)•ì)•å)•Þ)•×)•Ð)•É)•Â)•»)•´)•­)•¦)•Ÿ)•˜)•‘)•Š)•ƒ)•|)•u)•n)•g)•`)•Y)•R)•K)•D)•=)•6)•/)•()•!)•)•)• )•)•þ(•÷(•ð(•é(•â(•Û(•Ô(•Í(•Æ(•¿(•¸(•±(•ª(•£(•œ(••(•Ž(•‡(•€(•y(•r(•k(•d(•](•V(•O(•H(•A(•:(•3(•,(•%(•(•(•(• (•(•û'•ô'•í'•æ'•ß'•Ø'•Ñ'•Ê'•Ã'•¼'•µ'•®'•§'• '•™'•’'•‹'•„'•}'•v'•o'•h'•a'•Z'•S'•L'•E'•>'•7'•0'•)'•"'•'•'• '•'•ÿ&•ø&•ñ&•ê&•ã&•Ü&•Õ&•Î&•Ç&•À&•¹&•²&•«&•¤&•&•–&•&•ˆ&•&•z&•s&•l&•e&•^&•W&•P&•I&•B&•;&•4&•-&•&&•&•&•&• &•&•ü%•õ%•î%•ç%•à%•Ù%•Ò%•Ë%•Ä%•½%•¶%•¯%•¨%•¡%•š%•“%•Œ%•…%•~%•w%•p%•i%•b%•[%•T%•M%•F%•?%•8%•1%•*%•#%•%•%•%•%•%•ù$•ò$•ë$•ä$•Ý$•Ö$•Ï$•È$•Á$•º$•³$•¬$•¥$•ž$•—$•$•‰$•‚$•{$•t$•m$•f$•_$•X$•Q$•J$•C$•<$•5$•.$•'$• $•$•$• $•$•ý#•ö#•ï#•è#•á#•Ú#•Ó#•Ì#•Å#•¾#•·#•°#•©#•¢#•›#•”#•#•†#•#•x#•q#•j#•c#•\#•U#•N#•G#•@#•9#•2#•+#•$#•#•#•#•#•#•ú"•ó"•ì"•å"•Þ"•×"•Ð"•É"•Â"•»"•´"•­"•¦"•Ÿ"•˜"•‘"•Š"•ƒ"•|"•u"•n"•g"•`"•Y"•R"•K"•D"•="•6"•/"•("•!"•"•"• "•"•þ!•÷!•ð!•é!•â!•Û!•Ô!•Í!•Æ!•¿!•¸!•±!•ª!•£!•œ!••!•Ž!•‡!•€!•y!•r!•k!•d!•]!•V!•O!•H!•A!•:!•3!•,!•%!•!•!•!• !•!•û •ô •í •æ •ß •Ø •Ñ •Ê •à •¼ •µ •® •§ •  •™ •’ •‹ •„ •} •v •o •h •a •Z •S •L •E •> •7 •0 •) •" • • • • •ÿ•ø•ñ•ê•ã•ܕՕΕǕÀ•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú•ó•ì•å•ޕוЕɕ•»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û•ô•í•æ•ߕؕѕʕÕ¼•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ•ø•ñ•ê•ã•ܕՕΕǕÀ•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú•ó•ì•å•ޕוЕɕ•»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û•ô•í•æ•ߕؕѕʕÕ¼•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ•ø•ñ•ê•ã•ܕՕΕǕÀ•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú •ó •ì •å •Þ •× •Ð •É • •» •´ •­ •¦ •Ÿ •˜ •‘ •Š •ƒ •| •u •n •g •` •Y •R •K •D •= •6 •/ •( •! • • • • •þ •÷ •ð •é •â •Û •Ô •Í •Æ •¿ •¸ •± •ª •£ •œ •• •Ž •‡ •€ •y •r •k •d •] •V •O •H •A •: •3 •, •% • • • • • •û •ô •í •æ •ß •Ø •Ñ •Ê •à •¼ •µ •® •§ •  •™ •’ •‹ •„ •} •v •o •h •a •Z •S •L •E •> •7 •0 •) •" • • • • •ÿ •ø •ñ •ê •ã •Ü •Õ •Î •Ç •À •¹ •² •« •¤ • •– • •ˆ • •z •s •l •e •^ •W •P •I •B •; •4 •- •& • • • • • •ü •õ •î •ç •à •Ù •Ò •Ë •Ä •½ •¶ •¯ •¨ •¡ •š •“ •Œ •… •~ •w •p •i •b •[ •T •M •F •? •8 •1 •* •# • • • • • •ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú•ó•ì•å•ޕוЕɕ•»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û•ô•í•æ•ߕؕѕʕÕ¼•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ•ø•ñ•ê•ã•ܕՕΕǕÀ•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••úÿ”óÿ”ìÿ”åÿ”Þÿ”×ÿ”Ðÿ”Éÿ”Âÿ”»ÿ”´ÿ”­ÿ”¦ÿ”Ÿÿ”˜ÿ”‘ÿ”Šÿ”ƒÿ”|ÿ”uÿ”nÿ”gÿ”`ÿ”Yÿ”Rÿ”Kÿ”Dÿ”=ÿ”6ÿ”/ÿ”(ÿ”!ÿ”ÿ”ÿ” ÿ”ÿ”þþ”÷þ”ðþ”éþ”âþ”Ûþ”Ôþ”Íþ”Æþ”¿þ”¸þ”±þ”ªþ”£þ”œþ”•þ”Žþ”‡þ”€þ”yþ”rþ”kþ”dþ”]þ”Vþ”Oþ”Hþ”Aþ”:þ”3þ”,þ”%þ”þ”þ”þ” þ”þ”ûý”ôý”íý”æý”ßý”Øý”Ñý”Êý”Ãý”¼ý”µý”®ý”§ý” ý”™ý”’ý”‹ý”„ý”}ý”vý”oý”hý”aý”Zý”Sý”Lý”Eý”>ý”7ý”0ý”)ý”"ý”ý”ý” ý”ý”ÿü”øü”ñü”êü”ãü”Üü”Õü”Îü”Çü”Àü”¹ü”²ü”«ü”¤ü”ü”–ü”ü”ˆü”ü”zü”sü”lü”eü”^ü”Wü”Pü”Iü”Bü”;ü”4ü”-ü”&ü”ü”ü”ü” ü”ü”üû”õû”îû”çû”àû”Ùû”Òû”Ëû”Äû”½û”¶û”¯û”¨û”¡û”šû”“û”Œû”…û”~û”wû”pû”iû”bû”[û”Tû”Mû”Fû”?û”8û”1û”*û”#û”û”û”û”û”û”ùú”òú”ëú”äú”Ýú”Öú”Ïú”Èú”Áú”ºú”³ú”¬ú”¥ú”žú”—ú”ú”‰ú”‚ú”{ú”tú”mú”fú”_ú”Xú”Qú”Jú”Cú”<ú”5ú”.ú”'ú” ú”ú”ú” ú”ú”ýù”öù”ïù”èù”áù”Úù”Óù”Ìù”Åù”¾ù”·ù”°ù”©ù”¢ù”›ù””ù”ù”†ù”ù”xù”qù”jù”cù”\ù”Uù”Nù”Gù”@ù”9ù”2ù”+ù”$ù”ù”ù”ù”ù”ù”úø”óø”ìø”åø”Þø”×ø”Ðø”Éø”Âø”»ø”´ø”­ø”¦ø”Ÿø”˜ø”‘ø”Šø”ƒø”|ø”uø”nø”gø”`ø”Yø”Rø”Kø”Dø”=ø”6ø”/ø”(ø”!ø”ø”ø” ø”ø”þ÷”÷÷”ð÷”é÷”â÷”Û÷”Ô÷”Í÷”Æ÷”¿÷”¸÷”±÷”ª÷”£÷”œ÷”•÷”Ž÷”‡÷”€÷”y÷”r÷”k÷”d÷”]÷”V÷”O÷”H÷”A÷”:÷”3÷”,÷”%÷”÷”÷”÷” ÷”÷”ûö”ôö”íö”æö”ßö”Øö”Ñö”Êö”Ãö”¼ö”µö”®ö”§ö” ö”™ö”’ö”‹ö”„ö”}ö”vö”oö”hö”aö”Zö”Sö”Lö”Eö”>ö”7ö”0ö”)ö”"ö”ö”ö” ö”ö”ÿõ”øõ”ñõ”êõ”ãõ”Üõ”Õõ”Îõ”Çõ”Àõ”¹õ”²õ”«õ”¤õ”õ”–õ”õ”ˆõ”õ”zõ”sõ”lõ”eõ”^õ”Wõ”Põ”Iõ”Bõ”;õ”4õ”-õ”&õ”õ”õ”õ” õ”õ”üô”õô”îô”çô”àô”Ùô”Òô”Ëô”Äô”½ô”¶ô”¯ô”¨ô”¡ô”šô”“ô”Œô”…ô”~ô”wô”pô”iô”bô”[ô”Tô”Mô”Fô”?ô”8ô”1ô”*ô”#ô”ô”ô”ô”ô”ô”ùó”òó”ëó”äó”Ýó”Öó”Ïó”Èó”Áó”ºó”³ó”¬ó”¥ó”žó”—ó”ó”‰ó”‚ó”{ó”tó”mó”fó”_ó”Xó”Qó”Jó”Có”<ó”5ó”.ó”'ó” ó”ó”ó” ó”ó”ýò”öò”ïò”èò”áò”Úò”Óò”Ìò”Åò”¾ò”·ò”°ò”©ò”¢ò”›ò””ò”ò”†ò”ò”xò”qò”jò”cò”\ò”Uò”Nò”Gò”@ò”9ò”2ò”+ò”$ò”ò”ò”ò”ò”ò”úñ”óñ”ìñ”åñ”Þñ”×ñ”Ðñ”Éñ”Âñ”»ñ”´ñ”­ñ”¦ñ”Ÿñ”˜ñ”‘ñ”Šñ”ƒñ”|ñ”uñ”nñ”gñ”`ñ”Yñ”Rñ”Kñ”Dñ”=ñ”6ñ”/ñ”(ñ”!ñ”ñ”ñ” ñ”ñ”þð”÷ð”ðð”éð”âð”Ûð”Ôð”Íð”Æð”¿ð”¸ð”±ð”ªð”£ð”œð”•ð”Žð”‡ð”€ð”yð”rð”kð”dð”]ð”Vð”Oð”Hð”Að”:ð”3ð”,ð”%ð”ð”ð”ð” ð”ð”ûï”ôï”íï”æï”ßï”Øï”Ñï”Êï”Ãï”}ï”vï”oï”hï”aï”Zï”Sï”Lï”Eï”>ï”7ï”0ï”)ï”"ï”ï”ï” ï”ï”ÿî”øî”ñî”êî”ãî”Üî”Õî”Îî”Çî”Àî”î”–î”î”î”zî”sî”lî”eî”^î”Wî”Pî”Iî”Bî”;î”4î”-î”&î”î”î”î” î”î”üí”õí”îí”çí”àí”Ùí”Òí”Ëí”Ä픽픶픯픨픡픚픓플픅í”~í”wí”pí”ií”bí”[í”Tí”Mí”Fí”?í”8í”1í”*í”#í”í”í”í”í”í”ùì”òì”ëì”äì”Ýì”Öì”Ïì”Èì”Á씺씳씬씥씞씗ì”씉씂ì”{ì”tì”mì”fì”_ì”Xì”Qì”Jì”Cì”<ì”5ì”.ì”'ì” ì”ì”ì” ì”ì”ýë”öë”ïë”èë”áë”Úë”Óë”Ìë”Å딾딷따딩딢딛디ë”딆ë”ë”xë”që”jë”cë”\ë”Uë”Në”Gë”@ë”9ë”2ë”+ë”$ë”ë”ë”ë”ë”ë”úê”óê”ìê”åê”Þê”×ê”Ðê”Éê”Âꔻꔴꔭꔦꔟꔘꔑꔊꔃê”|ê”uê”nê”gê”`ê”Yê”Rê”Kê”Dê”=ê”6ê”/ê”(ê”!ê”ê”ê” ê”ê”þé”÷é”ðé”éé”âé”Ûé”Ôé”Íé”Æé”¿é”¸é”±é”ªé”£é”œé”•é”Žé”‡é”€é”yé”ré”ké”dé”]é”Vé”Oé”Hé”Aé”:é”3é”,é”%é”é”é”é” é”é”ûè”ôè”íè”æè”ßè”Øè”Ñè”Êè”Ã蔼蔵蔮蔧蔠蔙蔒蔋蔄è”}è”vè”oè”hè”aè”Zè”Sè”Lè”Eè”>è”7è”0è”)è”"è”è”è” è”è”ÿç”øç”ñç”êç”ãç”Üç”Õç”Îç”Çç”À甹甲甫甤ç”ç”–ç”甈ç”ç”zç”sç”lç”eç”^ç”Wç”Pç”Iç”Bç”;ç”4ç”-ç”&ç”ç”ç”ç” ç”ç”üæ”õæ”îæ”çæ”àæ”Ùæ”Òæ”Ëæ”Äæ”½æ”¶æ”¯æ”¨æ”¡æ”šæ”“æ”Œæ”…æ”~æ”wæ”pæ”iæ”bæ”[æ”Tæ”Mæ”Fæ”?æ”8æ”1æ”*æ”#æ”æ”æ”æ”æ”æ”ùå”òå”ëå”äå”Ýå”Öå”Ïå”Èå”Á唺唳唬唥唞唗å”唉唂å”{å”tå”må”få”_å”Xå”Qå”Jå”Cå”<å”5å”.å”'å” å”å”å” å”å”ýä”öä”ïä”èä”áä”Úä”Óä”Ìä”Å䔾䔷䔰䔩䔢䔛䔔ä”䔆ä”ä”xä”qä”jä”cä”\ä”Uä”Nä”Gä”@ä”9ä”2ä”+ä”$ä”ä”ä”ä”ä”ä”úã”óã”ìã”åã”Þã”×ã”Ðã”Éã”Â㔻㔴㔭㔦㔟㔘㔑㔊㔃ã”|ã”uã”nã”gã”`ã”Yã”Rã”Kã”Dã”=ã”6ã”/ã”(ã”!ã”ã”ã” ã”ã”þâ”÷â”ðâ”éâ”ââ”Ûâ”Ôâ”Íâ”Æâ”¿â”¸â”±â”ªâ”£â”œâ”•â”Žâ”‡â”€â”yâ”râ”kâ”dâ”]â”Vâ”Oâ”Hâ”Aâ”:â”3â”,â”%â”â”â”â” â”â”ûá”ôá”íá”æá”ßá”Øá”Ñá”Êá”Ãᔼᔵᔮᔧᔠᔙᔒᔋᔄá”}á”vá”oá”há”aá”Zá”Sá”Lá”Eá”>á”7á”0á”)á”"á”á”á” á”á”ÿà”øà”ñà”êà”ãà”Üà”Õà”Îà”Çà”Àà”¹à”²à”«à”¤à”à”–à”à”ˆà”à”zà”sà”là”eà”^à”Wà”Pà”Ià”Bà”;à”4à”-à”&à”à”à”à” à”à”üß”õß”îß”çß”àß”Ùß”Òß”Ëß”Äß”½ß”¶ß”¯ß”¨ß”¡ß”šß”“ß”Œß”…ß”~ß”wß”pß”iß”bß”[ß”Tß”Mß”Fß”?ß”8ß”1ß”*ß”#ߔߔߔߔߔߔùÞ”òÞ”ëÞ”äÞ”ÝÞ”ÖÞ”ÏÞ”ÈÞ”ÁÞ”ºÞ”³Þ”¬Þ”¥Þ”žÞ”—Þ”Þ”‰Þ”‚Þ”{Þ”tÞ”mÞ”fÞ”_Þ”XÞ”QÞ”JÞ”CÞ”<Þ”5Þ”.Þ”'Þ” Þ”Þ”Þ” Þ”Þ”ýÝ”öÝ”ïÝ”èÝ”áÝ”ÚÝ”ÓÝ”ÌÝ”ÅÝ”¾Ý”·Ý”°Ý”©Ý”¢Ý”›Ý””ݔݔ†Ý”Ý”xÝ”qÝ”jÝ”cÝ”\Ý”UÝ”NÝ”GÝ”@Ý”9Ý”2Ý”+Ý”$ݔݔݔݔݔݔúÜ”óÜ”ìÜ”åÜ”ÞÜ”×Ü”ÐÜ”ÉÜ”ÂÜ”»Ü”´Ü”­Ü”¦Ü”ŸÜ”˜Ü”‘Ü”ŠÜ”ƒÜ”|Ü”uÜ”nÜ”gÜ”`Ü”YÜ”RÜ”KÜ”DÜ”=Ü”6Ü”/Ü”(Ü”!ܔܔܔ ܔܔþÛ”÷Û”ðÛ”éÛ”âÛ”ÛÛ”ÔÛ”ÍÛ”ÆÛ”¿Û”¸Û”±Û”ªÛ”£Û”œÛ”•Û”ŽÛ”‡Û”€Û”yÛ”rÛ”kÛ”dÛ”]Û”VÛ”OÛ”HÛ”AÛ”:Û”3Û”,Û”%Û”Û”Û”Û” Û”Û”ûÚ”ôÚ”íÚ”æÚ”ßÚ”ØÚ”ÑÚ”ÊÚ”ÃÚ”¼Ú”µÚ”®Ú”§Ú” Ú”™Ú”’Ú”‹Ú”„Ú”}Ú”vÚ”oÚ”hÚ”aÚ”ZÚ”SÚ”LÚ”EÚ”>Ú”7Ú”0Ú”)Ú”"Ú”Ú”Ú” Ú”Ú”ÿÙ”øÙ”ñÙ”êÙ”ãÙ”ÜÙ”ÕÙ”ÎÙ”ÇÙ”ÀÙ”¹Ù”²Ù”«Ù”¤Ù”Ù”–Ù”Ù”ˆÙ”Ù”zÙ”sÙ”lÙ”eÙ”^Ù”WÙ”PÙ”IÙ”BÙ”;Ù”4Ù”-Ù”&Ù”Ù”Ù”Ù” Ù”Ù”üØ”õØ”îØ”çØ”àØ”ÙØ”ÒØ”ËØ”ÄØ”½Ø”¶Ø”¯Ø”¨Ø”¡Ø”šØ”“Ø”ŒØ”…Ø”~Ø”wØ”pØ”iØ”bØ”[Ø”TØ”MØ”FØ”?Ø”8Ø”1Ø”*Ø”#ؔؔؔؔؔؔù×”ò×”ë×”ä×”Ý×”Ö×”Ï×”È×”Á×”º×”³×”¬×”¥×”ž×”—×”×”‰×”‚×”{×”t×”m×”f×”_×”X×”Q×”J×”C×”<×”5×”.×”'×” ×”×”×” ×”×”ýÖ”öÖ”ïÖ”èÖ”áÖ”ÚÖ”ÓÖ”ÌÖ”ÅÖ”¾Ö”·Ö”°Ö”©Ö”¢Ö”›Ö””Ö”Ö”†Ö”Ö”xÖ”qÖ”jÖ”cÖ”\Ö”UÖ”NÖ”GÖ”@Ö”9Ö”2Ö”+Ö”$Ö”Ö”Ö”Ö”Ö”Ö”úÕ”óÕ”ìÕ”åÕ”ÞÕ”×Õ”ÐÕ”ÉÕ”ÂÕ”»Õ”´Õ”­Õ”¦Õ”ŸÕ”˜Õ”‘Õ”ŠÕ”ƒÕ”|Õ”uÕ”nÕ”gÕ”`Õ”YÕ”RÕ”KÕ”DÕ”=Õ”6Õ”/Õ”(Õ”!Õ”Õ”Õ” Õ”Õ”þÔ”÷Ô”ðÔ”éÔ”âÔ”ÛÔ”ÔÔ”ÍÔ”ÆÔ”¿Ô”¸Ô”±Ô”ªÔ”£Ô”œÔ”•Ô”ŽÔ”‡Ô”€Ô”yÔ”rÔ”kÔ”dÔ”]Ô”VÔ”OÔ”HÔ”AÔ”:Ô”3Ô”,Ô”%Ô”Ô”Ô”Ô” Ô”Ô”ûÓ”ôÓ”íÓ”æÓ”ßÓ”ØÓ”ÑÓ”ÊÓ”ÃÓ”¼Ó”µÓ”®Ó”§Ó” Ó”™Ó”’Ó”‹Ó”„Ó”}Ó”vÓ”oÓ”hÓ”aÓ”ZÓ”SÓ”LÓ”EÓ”>Ó”7Ó”0Ó”)Ó”"Ó”Ó”Ó” Ó”Ó”ÿÒ”øÒ”ñÒ”êÒ”ãÒ”ÜÒ”ÕÒ”ÎÒ”ÇÒ”ÀÒ”¹Ò”²Ò”«Ò”¤Ò”Ò”–Ò”Ò”ˆÒ”Ò”zÒ”sÒ”lÒ”eÒ”^Ò”WÒ”PÒ”IÒ”BÒ”;Ò”4Ò”-Ò”&Ò”Ò”Ò”Ò” Ò”Ò”üÑ”õÑ”îÑ”çÑ”àÑ”ÙÑ”ÒÑ”ËÑ”ÄÑ”½Ñ”¶Ñ”¯Ñ”¨Ñ”¡Ñ”šÑ”“Ñ”ŒÑ”…Ñ”~Ñ”wÑ”pÑ”iÑ”bÑ”[Ñ”TÑ”MÑ”FÑ”?Ñ”8Ñ”1Ñ”*Ñ”#єєєєєєùДòДëДäДÝДÖДÏДÈДÁДºÐ”³Ð”¬Ð”¥Ð”žÐ”—ДД‰Ð”‚Д{ДtДmДfД_ДXДQДJДCД<Д5Д.Д'Д ДДД ДДýÏ”öÏ”ïÏ”èÏ”áÏ”ÚÏ”ÓÏ”ÌÏ”ÅÏ”¾Ï”·Ï”°Ï”©Ï”¢Ï”›Ï””ϔϔ†Ï”Ï”xÏ”qÏ”jÏ”cÏ”\Ï”UÏ”NÏ”GÏ”@Ï”9Ï”2Ï”+Ï”$ϔϔϔϔϔϔúΔóΔìΔåΔÞΔ×ΔÐΔÉΔÂΔ»Î”´Î”­Î”¦Î”ŸÎ”˜Î”‘ΔŠÎ”ƒÎ”|ΔuΔnΔgΔ`ΔYΔRΔKΔDΔ=Δ6Δ/Δ(Δ!ΔΔΔ ΔΔþÍ”÷Í”ðÍ”éÍ”âÍ”ÛÍ”ÔÍ”ÍÍ”ÆÍ”¿Í”¸Í”±Í”ªÍ”£Í”œÍ”•Í”ŽÍ”‡Í”€Í”yÍ”rÍ”kÍ”dÍ”]Í”VÍ”OÍ”HÍ”AÍ”:Í”3Í”,Í”%͔͔͔͔ ͔͔ûÌ”ôÌ”íÌ”æÌ”ßÌ”ØÌ”ÑÌ”ÊÌ”ÃÌ”¼Ì”µÌ”®Ì”§Ì” Ì”™Ì”’Ì”‹Ì”„Ì”}Ì”vÌ”oÌ”hÌ”aÌ”ZÌ”SÌ”LÌ”EÌ”>Ì”7Ì”0Ì”)Ì”"̔̔̔ ̔̔ÿË”øË”ñË”êË”ãË”ÜË”ÕË”ÎË”ÇË”ÀË”¹Ë”²Ë”«Ë”¤Ë”Ë”–˔˔ˆË”Ë”zË”sË”lË”eË”^Ë”WË”PË”IË”BË”;Ë”4Ë”-Ë”&˔˔˔˔ ˔˔üÊ”õÊ”îÊ”çÊ”àÊ”ÙÊ”ÒÊ”ËÊ”ÄÊ”½Ê”¶Ê”¯Ê”¨Ê”¡Ê”šÊ”“Ê”ŒÊ”…Ê”~Ê”wÊ”pÊ”iÊ”bÊ”[Ê”TÊ”MÊ”FÊ”?Ê”8Ê”1Ê”*Ê”#ʔʔʔʔʔʔùÉ”òÉ”ëÉ”äÉ”ÝÉ”ÖÉ”ÏÉ”ÈÉ”ÁÉ”ºÉ”³É”¬É”¥É”žÉ”—ɔɔ‰É”‚É”{É”tÉ”mÉ”fÉ”_É”XÉ”QÉ”JÉ”CÉ”<É”5É”.É”'É” ɔɔɔ ɔɔýÈ”öÈ”ïÈ”èÈ”áÈ”ÚÈ”ÓÈ”ÌÈ”ÅÈ”¾È”·È”°È”©È”¢È”›È””ȔȔ†È”È”xÈ”qÈ”jÈ”cÈ”\È”UÈ”NÈ”GÈ”@È”9È”2È”+È”$ȔȔȔȔȔȔúÇ”óÇ”ìÇ”åÇ”ÞÇ”×Ç”ÐÇ”ÉÇ”ÂÇ”»Ç”´Ç”­Ç”¦Ç”ŸÇ”˜Ç”‘Ç”ŠÇ”ƒÇ”|Ç”uÇ”nÇ”gÇ”`Ç”YÇ”RÇ”KÇ”DÇ”=Ç”6Ç”/Ç”(Ç”!ǔǔǔ ǔǔþÆ”÷Æ”ðÆ”鯔âÆ”ÛÆ”ÔÆ”ÍÆ”ÆÆ”¿Æ”¸Æ”±Æ”ªÆ”£Æ”œÆ”•Æ”ŽÆ”‡Æ”€Æ”yÆ”rÆ”kÆ”dÆ”]Æ”VÆ”OÆ”HÆ”AÆ”:Æ”3Æ”,Æ”%ƔƔƔƔ ƔƔûÅ”ôÅ”íÅ”æÅ”ßÅ”ØÅ”ÑÅ”ÊÅ”ÃÅ”¼Å”µÅ”®Å”§Å” Å”™Å”’Å”‹Å”„Å”}Å”vÅ”oÅ”hÅ”aÅ”ZÅ”SÅ”LÅ”EÅ”>Å”7Å”0Å”)Å”"ŔŔŔ ŔŔÿÄ”øÄ”ñÄ”êÄ”ãÄ”ÜÄ”ÕÄ”ÎÄ”ÇÄ”ÀÄ”¹Ä”²Ä”«Ä”¤Ä”Ä”–ĔĔˆÄ”Ä”zÄ”sÄ”lÄ”eÄ”^Ä”WÄ”PÄ”IÄ”BÄ”;Ä”4Ä”-Ä”&ĔĔĔĔ ĔĔüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚÔ“ԌÔ…Ô~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔù”ò”ë”ä”ݔ֔ϔȔÁ”ºÂ”³Â”¬Â”¥Â”žÂ”—””‰Â”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ýÁ”öÁ”ïÁ”èÁ”áÁ”ÚÁ”ÓÁ”ÌÁ”ÅÁ”¾Á”·Á”°Á”©Á”¢Á”›Á””Á”Á”†Á”Á”xÁ”qÁ”jÁ”cÁ”\Á”UÁ”NÁ”GÁ”@Á”9Á”2Á”+Á”$Á”Á”Á”Á”Á”Á”úÀ”óÀ”ìÀ”åÀ”ÞÀ”×À”ÐÀ”ÉÀ”ÂÀ”»À”´À”­À”¦À”ŸÀ”˜À”‘À”ŠÀ”ƒÀ”|À”uÀ”nÀ”gÀ”`À”YÀ”RÀ”KÀ”DÀ”=À”6À”/À”(À”!À”À”À” À”À”þ¿”÷¿”ð¿”鿔⿔ۿ”Ô¿”Í¿”Æ¿”¿¿”¸¿”±¿”ª¿”£¿”œ¿”•¿”Ž¿”‡¿”€¿”y¿”r¿”k¿”d¿”]¿”V¿”O¿”H¿”A¿”:¿”3¿”,¿”%¿”¿”¿”¿” ¿”¿”û¾”ô¾”í¾”æ¾”ß¾”ؾ”Ѿ”ʾ”þ”¼¾”µ¾”®¾”§¾” ¾”™¾”’¾”‹¾”„¾”}¾”v¾”o¾”h¾”a¾”Z¾”S¾”L¾”E¾”>¾”7¾”0¾”)¾”"¾”¾”¾” ¾”¾”ÿ½”ø½”ñ½”꽔㽔ܽ”Õ½”ν”ǽ”À½”¹½”²½”«½”¤½”½”–½”½”ˆ½”½”z½”s½”l½”e½”^½”W½”P½”I½”B½”;½”4½”-½”&½”½”½”½” ½”½”ü¼”õ¼”缔༔Ù¼”Ò¼”˼”¼”¶¼”¯¼”¨¼”¡¼”𼔓¼”Œ¼”…¼”~¼”w¼”p¼”i¼”b¼”[¼”T¼”M¼”F¼”?¼”8¼”1¼”*¼”#¼”¼”¼”¼”¼”¼”ù»”ò»”뻔仔ݻ”Ö»”Ï»”È»”Á»”º»”³»”¬»”¥»”ž»”—»”»”‰»”‚»”{»”t»”m»”f»”_»”X»”Q»”J»”C»”<»”5»”.»”'»” »”»”»” »”»”ýº”öº”ﺔ躔ẔÚº”Óº”̺”ꔾº”·º”°º”©º”¢º”›º””º”º”†º”º”xº”qº”jº”cº”\º”Uº”Nº”Gº”@º”9º”2º”+º”$º”º”º”º”º”º”ú¹”ó¹”칔幔޹”×¹”й”ɹ”¹”»¹”´¹”­¹”¦¹”Ÿ¹”˜¹”‘¹”й”ƒ¹”|¹”u¹”n¹”g¹”`¹”Y¹”R¹”K¹”D¹”=¹”6¹”/¹”(¹”!¹”¹”¹” ¹”¹”þ¸”÷¸”ð¸”鸔⸔Û¸”Ô¸”͸”Ƹ”¿¸”¸¸”±¸”ª¸”£¸”œ¸”•¸”ޏ”‡¸”€¸”y¸”r¸”k¸”d¸”]¸”V¸”O¸”H¸”A¸”:¸”3¸”,¸”%¸”¸”¸”¸” ¸”¸”û·”ô·”í·”æ·”ß·”Ø·”Ñ·”Ê·”÷”¼·”µ·”®·”§·” ·”™·”’·”‹·”„·”}·”v·”o·”h·”a·”Z·”S·”L·”E·”>·”7·”0·”)·”"·”·”·” ·”·”ÿ¶”ø¶”ñ¶”궔㶔ܶ”Õ¶”ζ”Ƕ”À¶”¹¶”²¶”«¶”¤¶”¶”–¶”¶”ˆ¶”¶”z¶”s¶”l¶”e¶”^¶”W¶”P¶”I¶”B¶”;¶”4¶”-¶”&¶”¶”¶”¶” ¶”¶”üµ”õµ”絔ൔÙµ”Òµ”˵”ĵ”½µ”¶µ”¯µ”¨µ”¡µ”𵔓µ”Œµ”…µ”~µ”wµ”pµ”iµ”bµ”[µ”Tµ”Mµ”Fµ”?µ”8µ”1µ”*µ”#µ”µ”µ”µ”µ”µ”ù´”ò´”봔䴔ݴ”Ö´”Ï´”È´”Á´”º´”³´”¬´”¥´”ž´”—´”´”‰´”‚´”{´”t´”m´”f´”_´”X´”Q´”J´”C´”<´”5´”.´”'´” ´”´”´” ´”´”ý³”ö³”ﳔ賔᳔ڳ”Ó³”̳”ų”¾³”·³”°³”©³”¢³”›³””³”³”†³”³”x³”q³”j³”c³”\³”U³”N³”G³”@³”9³”2³”+³”$³”³”³”³”³”³”ú²”ó²”첔岔޲”ײ”в”ɲ”²”»²”´²”­²”¦²”Ÿ²”˜²”‘²”в”ƒ²”|²”u²”n²”g²”`²”Y²”R²”K²”D²”=²”6²”/²”(²”!²”²”²” ²”²”þ±”÷±”ð±”鱔ⱔ۱”Ô±”ͱ”Ʊ”¿±”¸±”±±”ª±”£±”œ±”•±”ޱ”‡±”€±”y±”r±”k±”d±”]±”V±”O±”H±”A±”:±”3±”,±”%±”±”±”±” ±”±”û°”ô°”í°”æ°”ß°”ذ”Ѱ”ʰ”𔼰”µ°”®°”§°” °”™°”’°”‹°”„°”}°”v°”o°”h°”a°”Z°”S°”L°”E°”>°”7°”0°”)°”"°”°”°” °”°”ÿ¯”ø¯”ñ¯”ꯔ㯔ܯ”Õ¯”ί”ǯ”À¯”¹¯”²¯”«¯”¤¯”¯”–¯”¯”ˆ¯”¯”z¯”s¯”l¯”e¯”^¯”W¯”P¯”I¯”B¯”;¯”4¯”-¯”&¯”¯”¯”¯” ¯”¯”ü®”õ®”箔ஔٮ”Ò®”Ë®”Ä®”½®”¶®”¯®”¨®”¡®”š®”“®”Œ®”…®”~®”w®”p®”i®”b®”[®”T®”M®”F®”?®”8®”1®”*®”#®”®”®”®”®”®”ù­”ò­”뭔䭔ݭ”Ö­”Ï­”È­”Á­”º­”³­”¬­”¥­”ž­”—­”­”‰­”‚­”{­”t­”m­”f­”_­”X­”Q­”J­”C­”<­”5­”.­”'­” ­”­”­” ­”­”ý¬”ö¬”ﬔ謔ᬔÚ¬”Ó¬”̬”Ŭ”¾¬”·¬”°¬”©¬”¢¬”›¬””¬”¬”†¬”¬”x¬”q¬”j¬”c¬”\¬”U¬”N¬”G¬”@¬”9¬”2¬”+¬”$¬”¬”¬”¬”¬”¬”ú«”ó«”쫔嫔ޫ”׫”Ы”É«”«”»«”´«”­«”¦«”Ÿ«”˜«”‘«”Š«”ƒ«”|«”u«”n«”g«”`«”Y«”R«”K«”D«”=«”6«”/«”(«”!«”«”«” «”«”þª”÷ª”ðª”骔⪔Ûª”Ôª”ͪ”ƪ”¿ª”¸ª”±ª”ªª”£ª”œª”•ª”Žª”‡ª”€ª”yª”rª”kª”dª”]ª”Vª”Oª”Hª”Aª”:ª”3ª”,ª”%ª”ª”ª”ª” ª”ª”û©”ô©”í©”æ©”ß©”Ø©”Ñ©”Ê©”锼©”µ©”®©”§©” ©”™©”’©”‹©”„©”}©”v©”o©”h©”a©”Z©”S©”L©”E©”>©”7©”0©”)©”"©”©”©” ©”©”ÿ¨”ø¨”ñ¨”ꨔ㨔ܨ”Õ¨”Ψ”Ǩ”À¨”¹¨”²¨”«¨”¤¨”¨”–¨”¨”ˆ¨”¨”z¨”s¨”l¨”e¨”^¨”W¨”P¨”I¨”B¨”;¨”4¨”-¨”&¨”¨”¨”¨” ¨”¨”ü§”õ§”秔৔٧”Ò§”˧”ħ”½§”¶§”¯§”¨§”¡§”𧔓§”Œ§”…§”~§”w§”p§”i§”b§”[§”T§”M§”F§”?§”8§”1§”*§”#§”§”§”§”§”§”ù¦”ò¦”릔䦔ݦ”Ö¦”Ϧ”Ȧ”Á¦”º¦”³¦”¬¦”¥¦”ž¦”—¦”¦”‰¦”‚¦”{¦”t¦”m¦”f¦”_¦”X¦”Q¦”J¦”C¦”<¦”5¦”.¦”'¦” ¦”¦”¦” ¦”¦”ý¥”ö¥”凜襔ᥔÚ¥”Ó¥”Ì¥”Å¥”¾¥”·¥”°¥”©¥”¢¥”›¥””¥”¥”†¥”¥”x¥”q¥”j¥”c¥”\¥”U¥”N¥”G¥”@¥”9¥”2¥”+¥”$¥”¥”¥”¥”¥”¥”ú¤”ó¤”줔夔Þ¤”פ”Ф”ɤ”¤”»¤”´¤”­¤”¦¤”Ÿ¤”˜¤”‘¤”Ф”ƒ¤”|¤”u¤”n¤”g¤”`¤”Y¤”R¤”K¤”D¤”=¤”6¤”/¤”(¤”!¤”¤”¤” ¤”¤”þ£”÷£”ð£”飔⣔Û£”Ô£”Í£”Æ£”¿£”¸£”±£”ª£”££”œ£”•£”Ž£”‡£”€£”y£”r£”k£”d£”]£”V£”O£”H£”A£”:£”3£”,£”%£”£”£”£” £”£”û¢”ô¢”í¢”梔ߢ”Ø¢”Ñ¢”Ê¢”┼¢”µ¢”®¢”§¢” ¢”™¢”’¢”‹¢”„¢”}¢”v¢”o¢”h¢”a¢”Z¢”S¢”L¢”E¢”>¢”7¢”0¢”)¢”"¢”¢”¢” ¢”¢”ÿ¡”ø¡”ñ¡”ꡔ㡔ܡ”Õ¡”Ρ”Ç¡”À¡”¹¡”²¡”«¡”¤¡”¡”–¡”¡”ˆ¡”¡”z¡”s¡”l¡”e¡”^¡”W¡”P¡”I¡”B¡”;¡”4¡”-¡”&¡”¡”¡”¡” ¡”¡”ü ”õ ”研ࠔ٠”Ò ”Ë ”Ä ”½ ”¶ ”¯ ”¨ ”¡ ”š ”“ ”Œ ”… ”~ ”w ”p ”i ”b ”[ ”T ”M ”F ”? ”8 ”1 ”* ”# ” ” ” ” ” ”ùŸ”òŸ”럔䟔ÝŸ”ÖŸ”ÏŸ”ÈŸ”ÁŸ”ºŸ”³Ÿ”¬Ÿ”¥Ÿ”žŸ”—Ÿ”Ÿ”‰Ÿ”‚Ÿ”{Ÿ”tŸ”mŸ”fŸ”_Ÿ”XŸ”QŸ”JŸ”CŸ”<Ÿ”5Ÿ”.Ÿ”'Ÿ” Ÿ”Ÿ”Ÿ” Ÿ”Ÿ”ýž”öž”螔បڞ”Óž”Ìž”Åž”¾ž”·ž”°ž”©ž”¢ž”›ž””ž”ž”†ž”ž”xž”qž”jž”cž”\ž”Už”Nž”Gž”@ž”9ž”2ž”+ž”$ž”ž”ž”ž”ž”ž”ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þœ”÷œ”ðœ”霔✔Ûœ”Ôœ”Íœ”Æœ”¿œ”¸œ”±œ”ªœ”£œ”œœ”•œ”Žœ”‡œ”€œ”yœ”rœ”kœ”dœ”]œ”Vœ”Oœ”Hœ”Aœ”:œ”3œ”,œ”%œ”œ”œ”œ” œ”œ”û›”ô›”훔曔ߛ”Ø›”Ñ›”Ê›”Û”¼›”µ›”®›”§›” ›”™›”’›”‹›”„›”}›”v›”o›”h›”a›”Z›”S›”L›”E›”>›”7›”0›”)›”"›”›”›” ›”›”ÿš”øš”ñš”Ꚕ㚔ܚ”Õš”Κ”Çš”Àš”¹š”²š”«š”¤š”š”–š”š”ˆš”š”zš”sš”lš”eš”^š”Wš”Pš”Iš”Bš”;š”4š”-š”&š”š”š”š” š”š”ü™”õ™”î™”ç™”à™”Ù™”Ò™”Ë™”Ä™”½™”¶™”¯™”¨™”¡™”š™”“™”Œ™”…™”~™”w™”p™”i™”b™”[™”T™”M™”F™”?™”8™”1™”*™”#™”™”™”™”™”™”ù˜”ò˜”똔䘔ݘ”Ö˜”Ϙ”Ș”Á˜”º˜”³˜”¬˜”¥˜”ž˜”—˜”˜”‰˜”‚˜”{˜”t˜”m˜”f˜”_˜”X˜”Q˜”J˜”C˜”<˜”5˜”.˜”'˜” ˜”˜”˜” ˜”˜”ý—”ö—”藔ᗔڗ”Ó—”Ì—”Å—”¾—”·—”°—”©—”¢—”›—””—”—”†—”—”x—”q—”j—”c—”\—”U—”N—”G—”@—”9—”2—”+—”$—”—”—”—”—”—”ú–”ó–”얔喔ޖ”×–”Ж”É–”–”»–”´–”­–”¦–”Ÿ–”˜–”‘–”Š–”ƒ–”|–”u–”n–”g–”`–”Y–”R–”K–”D–”=–”6–”/–”(–”!–”–”–” –”–”þ•”÷•”ð•”镔╔ە”Ô•”Í•”Æ•”¿•”¸•”±•”ª•”£•”œ•”••”Ž•”‡•”€•”y•”r•”k•”d•”]•”V•”O•”H•”A•”:•”3•”,•”%•”•”•”•” •”•”û””ô””픔攔ߔ”Ø””Ñ””Ê””Ô”¼””µ””®””§”” ””™””’””‹””„””}””v””o””h””a””Z””S””L””E””>””7””0””)””"”””””” ””””ÿ“”ø“”ñ“”ꓔ㓔ܓ”Õ“”Γ”Ç“”À“”¹“”²“”«“”¤“”“”–“”“”ˆ“”“”z“”s“”l“”e“”^“”W“”P“”I“”B“”;“”4“”-“”&“”“”“”“” “”“”ü’”õ’”î’”ç’”à’”Ù’”Ò’”Ë’”Ä’”½’”¶’”¯’”¨’”¡’”š’”“’”Œ’”…’”~’”w’”p’”i’”b’”[’”T’”M’”F’”?’”8’”1’”*’”#’”’”’”’”’”’”ù‘”ò‘”둔䑔ݑ”Ö‘”Ï‘”È‘”Á‘”º‘”³‘”¬‘”¥‘”ž‘”—‘”‘”‰‘”‚‘”{‘”t‘”m‘”f‘”_‘”X‘”Q‘”J‘”C‘”<‘”5‘”.‘”'‘” ‘”‘”‘” ‘”‘”ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þŽ”÷Ž”ðŽ”鎔⎔ÛŽ”ÔŽ”ÍŽ”ÆŽ”¿Ž”¸Ž”±Ž”ªŽ”£Ž”œŽ”•Ž”ŽŽ”‡Ž”€Ž”yŽ”rŽ”kŽ”dŽ”]Ž”VŽ”OŽ”HŽ”AŽ”:Ž”3Ž”,Ž”%ޔޔޔޔ ޔޔû”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿŒ”øŒ”ñŒ”ꌔ㌔ÜŒ”ÕŒ”ÎŒ”ÇŒ”ÀŒ”¹Œ”²Œ”«Œ”¤Œ”Œ”–Œ”Œ”ˆŒ”Œ”zŒ”sŒ”lŒ”eŒ”^Œ”WŒ”PŒ”IŒ”BŒ”;Œ”4Œ”-Œ”&Œ”Œ”Œ”Œ” Œ”Œ”ü‹”õ‹”î‹”ç‹”à‹”Ù‹”Ò‹”Ë‹”Ä‹”½‹”¶‹”¯‹”¨‹”¡‹”š‹”“‹”Œ‹”…‹”~‹”w‹”p‹”i‹”b‹”[‹”T‹”M‹”F‹”?‹”8‹”1‹”*‹”#‹”‹”‹”‹”‹”‹”ùŠ”òŠ”는䊔ÝŠ”ÖŠ”ÏŠ”ÈŠ”ÁŠ”ºŠ”³Š”¬Š”¥Š”žŠ”—ДД‰Š”‚Š”{Š”tŠ”mŠ”fŠ”_Š”XŠ”QŠ”JŠ”CŠ”<Š”5Š”.Š”'Š” ДДД ДДý‰”ö‰”艔ቔÚ‰”Ó‰”̉”ʼn”¾‰”·‰”°‰”©‰”¢‰”›‰””‰”‰”†‰”‰”x‰”q‰”j‰”c‰”\‰”U‰”N‰”G‰”@‰”9‰”2‰”+‰”$‰”‰”‰”‰”‰”‰”úˆ”óˆ”숔刔Þˆ”׈”Ј”Ɉ”ˆ”»ˆ”´ˆ”­ˆ”¦ˆ”Ÿˆ”˜ˆ”‘ˆ”Šˆ”ƒˆ”|ˆ”uˆ”nˆ”gˆ”`ˆ”Yˆ”Rˆ”Kˆ”Dˆ”=ˆ”6ˆ”/ˆ”(ˆ”!ˆ”ˆ”ˆ” ˆ”ˆ”þ‡”÷‡”ð‡”釔⇔Û‡”Ô‡”͇”Ƈ”¿‡”¸‡”±‡”ª‡”£‡”œ‡”•‡”އ”‡‡”€‡”y‡”r‡”k‡”d‡”]‡”V‡”O‡”H‡”A‡”:‡”3‡”,‡”%‡”‡”‡”‡” ‡”‡”û†”ô†”톔憔߆”؆”ц”ʆ”Æ”¼†”µ†”®†”§†” †”™†”’†”‹†”„†”}†”v†”o†”h†”a†”Z†”S†”L†”E†”>†”7†”0†”)†”"†”†”†” †”†”ÿ…”ø…”ñ…”ꅔㅔ܅”Õ…”Î…”Ç…”À…”¹…”²…”«…”¤…”…”–…”…”ˆ…”…”z…”s…”l…”e…”^…”W…”P…”I…”B…”;…”4…”-…”&…”…”…”…” …”…”ü„”õ„”î„”ç„”à„”Ù„”Ò„”Ë„”Ä„”½„”¶„”¯„”¨„”¡„”š„”“„”Œ„”…„”~„”w„”p„”i„”b„”[„”T„”M„”F„”?„”8„”1„”*„”#„”„”„”„”„”„”ùƒ”òƒ”냔䃔݃”Öƒ”σ”ȃ”Áƒ”ºƒ”³ƒ”¬ƒ”¥ƒ”žƒ”—ƒ”ƒ”‰ƒ”‚ƒ”{ƒ”tƒ”mƒ”fƒ”_ƒ”Xƒ”Qƒ”Jƒ”Cƒ”<ƒ”5ƒ”.ƒ”'ƒ” ƒ”ƒ”ƒ” ƒ”ƒ”ý‚”ö‚”肔႔ڂ”Ó‚”Ì‚”Å‚”¾‚”·‚”°‚”©‚”¢‚”›‚””‚”‚”†‚”‚”x‚”q‚”j‚”c‚”\‚”U‚”N‚”G‚”@‚”9‚”2‚”+‚”$‚”‚”‚”‚”‚”‚”ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ€”÷€”ð€”途—Û€”Ô€”Í€”Æ€”¿€”¸€”±€”ª€”£€”œ€”•€”Ž€”‡€”€€”y€”r€”k€”d€”]€”V€”O€”H€”A€”:€”3€”,€”%€”€”€”€” €”€”û”ô”í”æ”ߔؔєʔÔ¼”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ~”ø~”ñ~”ê~”ã~”Ü~”Õ~”Î~”Ç~”À~”¹~”²~”«~”¤~”~”–~”~”ˆ~”~”z~”s~”l~”e~”^~”W~”P~”I~”B~”;~”4~”-~”&~”~”~”~” ~”~”ü}”õ}”î}”ç}”à}”Ù}”Ò}”Ë}”Ä}”½}”¶}”¯}”¨}”¡}”š}”“}”Œ}”…}”~}”w}”p}”i}”b}”[}”T}”M}”F}”?}”8}”1}”*}”#}”}”}”}”}”}”ù|”ò|”ë|”ä|”Ý|”Ö|”Ï|”È|”Á|”º|”³|”¬|”¥|”ž|”—|”|”‰|”‚|”{|”t|”m|”f|”_|”X|”Q|”J|”C|”<|”5|”.|”'|” |”|”|” |”|”ý{”ö{”ï{”è{”á{”Ú{”Ó{”Ì{”Å{”¾{”·{”°{”©{”¢{”›{””{”{”†{”{”x{”q{”j{”c{”\{”U{”N{”G{”@{”9{”2{”+{”${”{”{”{”{”{”úz”óz”ìz”åz”Þz”×z”Ðz”Éz”Âz”»z”´z”­z”¦z”Ÿz”˜z”‘z”Šz”ƒz”|z”uz”nz”gz”`z”Yz”Rz”Kz”Dz”=z”6z”/z”(z”!z”z”z” z”z”þy”÷y”ðy”éy”ây”Ûy”Ôy”Íy”Æy”¿y”¸y”±y”ªy”£y”œy”•y”Žy”‡y”€y”yy”ry”ky”dy”]y”Vy”Oy”Hy”Ay”:y”3y”,y”%y”y”y”y” y”y”ûx”ôx”íx”æx”ßx”Øx”Ñx”Êx”Ãx”¼x”µx”®x”§x” x”™x”’x”‹x”„x”}x”vx”ox”hx”ax”Zx”Sx”Lx”Ex”>x”7x”0x”)x”"x”x”x” x”x”ÿw”øw”ñw”êw”ãw”Üw”Õw”Îw”Çw”Àw”¹w”²w”«w”¤w”w”–w”w”ˆw”w”zw”sw”lw”ew”^w”Ww”Pw”Iw”Bw”;w”4w”-w”&w”w”w”w” w”w”üv”õv”îv”çv”àv”Ùv”Òv”Ëv”Äv”½v”¶v”¯v”¨v”¡v”šv”“v”Œv”…v”~v”wv”pv”iv”bv”[v”Tv”Mv”Fv”?v”8v”1v”*v”#v”v”v”v”v”v”ùu”òu”ëu”äu”Ýu”Öu”Ïu”Èu”Áu”ºu”³u”¬u”¥u”žu”—u”u”‰u”‚u”{u”tu”mu”fu”_u”Xu”Qu”Ju”Cu”q”7q”0q”)q”"q”q”q” q”q”ÿp”øp”ñp”êp”ãp”Üp”Õp”Îp”Çp”Àp”¹p”²p”«p”¤p”p”–p”p”ˆp”p”zp”sp”lp”ep”^p”Wp”Pp”Ip”Bp”;p”4p”-p”&p”p”p”p” p”p”üo”õo”îo”ço”ào”Ùo”Òo”Ëo”Äo”½o”¶o”¯o”¨o”¡o”šo”“o”Œo”…o”~o”wo”po”io”bo”[o”To”Mo”Fo”?o”8o”1o”*o”#o”o”o”o”o”o”ùn”òn”ën”än”Ýn”Ön”Ïn”Èn”Án”ºn”³n”¬n”¥n”žn”—n”n”‰n”‚n”{n”tn”mn”fn”_n”Xn”Qn”Jn”Cn”j”7j”0j”)j”"j”j”j” j”j”ÿi”øi”ñi”êi”ãi”Üi”Õi”Îi”Çi”Ài”¹i”²i”«i”¤i”i”–i”i”ˆi”i”zi”si”li”ei”^i”Wi”Pi”Ii”Bi”;i”4i”-i”&i”i”i”i” i”i”üh”õh”îh”çh”àh”Ùh”Òh”Ëh”Äh”½h”¶h”¯h”¨h”¡h”šh”“h”Œh”…h”~h”wh”ph”ih”bh”[h”Th”Mh”Fh”?h”8h”1h”*h”#h”h”h”h”h”h”ùg”òg”ëg”äg”Ýg”Ög”Ïg”Èg”Ág”ºg”³g”¬g”¥g”žg”—g”g”‰g”‚g”{g”tg”mg”fg”_g”Xg”Qg”Jg”Cg”c”7c”0c”)c”"c”c”c” c”c”ÿb”øb”ñb”êb”ãb”Üb”Õb”Îb”Çb”Àb”¹b”²b”«b”¤b”b”–b”b”ˆb”b”zb”sb”lb”eb”^b”Wb”Pb”Ib”Bb”;b”4b”-b”&b”b”b”b” b”b”üa”õa”îa”ça”àa”Ùa”Òa”Ëa”Äa”½a”¶a”¯a”¨a”¡a”ša”“a”Œa”…a”~a”wa”pa”ia”ba”[a”Ta”Ma”Fa”?a”8a”1a”*a”#a”a”a”a”a”a”ù`”ò`”ë`”ä`”Ý`”Ö`”Ï`”È`”Á`”º`”³`”¬`”¥`”ž`”—`”`”‰`”‚`”{`”t`”m`”f`”_`”X`”Q`”J`”C`”<`”5`”.`”'`” `”`”`” `”`”ý_”ö_”ï_”è_”á_”Ú_”Ó_”Ì_”Å_”¾_”·_”°_”©_”¢_”›_””_”_”†_”_”x_”q_”j_”c_”\_”U_”N_”G_”@_”9_”2_”+_”$_”_”_”_”_”_”ú^”ó^”ì^”å^”Þ^”×^”Ð^”É^”Â^”»^”´^”­^”¦^”Ÿ^”˜^”‘^”Š^”ƒ^”|^”u^”n^”g^”`^”Y^”R^”K^”D^”=^”6^”/^”(^”!^”^”^” ^”^”þ]”÷]”ð]”é]”â]”Û]”Ô]”Í]”Æ]”¿]”¸]”±]”ª]”£]”œ]”•]”Ž]”‡]”€]”y]”r]”k]”d]”]]”V]”O]”H]”A]”:]”3]”,]”%]”]”]”]” ]”]”û\”ô\”í\”æ\”ß\”Ø\”Ñ\”Ê\”Ã\”¼\”µ\”®\”§\” \”™\”’\”‹\”„\”}\”v\”o\”h\”a\”Z\”S\”L\”E\”>\”7\”0\”)\”"\”\”\” \”\”ÿ[”ø[”ñ[”ê[”ã[”Ü[”Õ[”Î[”Ç[”À[”¹[”²[”«[”¤[”[”–[”[”ˆ[”[”z[”s[”l[”e[”^[”W[”P[”I[”B[”;[”4[”-[”&[”[”[”[” [”[”üZ”õZ”îZ”çZ”àZ”ÙZ”ÒZ”ËZ”ÄZ”½Z”¶Z”¯Z”¨Z”¡Z”šZ”“Z”ŒZ”…Z”~Z”wZ”pZ”iZ”bZ”[Z”TZ”MZ”FZ”?Z”8Z”1Z”*Z”#Z”Z”Z”Z”Z”Z”ùY”òY”ëY”äY”ÝY”ÖY”ÏY”ÈY”ÁY”ºY”³Y”¬Y”¥Y”žY”—Y”Y”‰Y”‚Y”{Y”tY”mY”fY”_Y”XY”QY”JY”CY”U”7U”0U”)U”"U”U”U” U”U”ÿT”øT”ñT”êT”ãT”ÜT”ÕT”ÎT”ÇT”ÀT”¹T”²T”«T”¤T”T”–T”T”ˆT”T”zT”sT”lT”eT”^T”WT”PT”IT”BT”;T”4T”-T”&T”T”T”T” T”T”üS”õS”îS”çS”àS”ÙS”ÒS”ËS”ÄS”½S”¶S”¯S”¨S”¡S”šS”“S”ŒS”…S”~S”wS”pS”iS”bS”[S”TS”MS”FS”?S”8S”1S”*S”#S”S”S”S”S”S”ùR”òR”ëR”äR”ÝR”ÖR”ÏR”ÈR”ÁR”ºR”³R”¬R”¥R”žR”—R”R”‰R”‚R”{R”tR”mR”fR”_R”XR”QR”JR”CR”N”7N”0N”)N”"N”N”N” N”N”ÿM”øM”ñM”êM”ãM”ÜM”ÕM”ÎM”ÇM”ÀM”¹M”²M”«M”¤M”M”–M”M”ˆM”M”zM”sM”lM”eM”^M”WM”PM”IM”BM”;M”4M”-M”&M”M”M”M” M”M”üL”õL”îL”çL”àL”ÙL”ÒL”ËL”ÄL”½L”¶L”¯L”¨L”¡L”šL”“L”ŒL”…L”~L”wL”pL”iL”bL”[L”TL”ML”FL”?L”8L”1L”*L”#L”L”L”L”L”L”ùK”òK”ëK”äK”ÝK”ÖK”ÏK”ÈK”ÁK”ºK”³K”¬K”¥K”žK”—K”K”‰K”‚K”{K”tK”mK”fK”_K”XK”QK”JK”CK”G”7G”0G”)G”"G”G”G” G”G”ÿF”øF”ñF”êF”ãF”ÜF”ÕF”ÎF”ÇF”ÀF”¹F”²F”«F”¤F”F”–F”F”ˆF”F”zF”sF”lF”eF”^F”WF”PF”IF”BF”;F”4F”-F”&F”F”F”F” F”F”üE”õE”îE”çE”àE”ÙE”ÒE”ËE”ÄE”½E”¶E”¯E”¨E”¡E”šE”“E”ŒE”…E”~E”wE”pE”iE”bE”[E”TE”ME”FE”?E”8E”1E”*E”#E”E”E”E”E”E”ùD”òD”ëD”äD”ÝD”ÖD”ÏD”ÈD”ÁD”ºD”³D”¬D”¥D”žD”—D”D”‰D”‚D”{D”tD”mD”fD”_D”XD”QD”JD”CD”@”7@”0@”)@”"@”@”@” @”@”ÿ?”ø?”ñ?”ê?”ã?”Ü?”Õ?”Î?”Ç?”À?”¹?”²?”«?”¤?”?”–?”?”ˆ?”?”z?”s?”l?”e?”^?”W?”P?”I?”B?”;?”4?”-?”&?”?”?”?” ?”?”ü>”õ>”î>”ç>”à>”Ù>”Ò>”Ë>”Ä>”½>”¶>”¯>”¨>”¡>”š>”“>”Œ>”…>”~>”w>”p>”i>”b>”[>”T>”M>”F>”?>”8>”1>”*>”#>”>”>”>”>”>”ù=”ò=”ë=”ä=”Ý=”Ö=”Ï=”È=”Á=”º=”³=”¬=”¥=”ž=”—=”=”‰=”‚=”{=”t=”m=”f=”_=”X=”Q=”J=”C=”<=”5=”.=”'=” =”=”=” =”=”ý<”ö<”ï<”è<”á<”Ú<”Ó<”Ì<”Å<”¾<”·<”°<”©<”¢<”›<””<”<”†<”<”x<”q<”j<”c<”\<”U<”N<”G<”@<”9<”2<”+<”$<”<”<”<”<”<”ú;”ó;”ì;”å;”Þ;”×;”Ð;”É;”Â;”»;”´;”­;”¦;”Ÿ;”˜;”‘;”Š;”ƒ;”|;”u;”n;”g;”`;”Y;”R;”K;”D;”=;”6;”/;”(;”!;”;”;” ;”;”þ:”÷:”ð:”é:”â:”Û:”Ô:”Í:”Æ:”¿:”¸:”±:”ª:”£:”œ:”•:”Ž:”‡:”€:”y:”r:”k:”d:”]:”V:”O:”H:”A:”::”3:”,:”%:”:”:”:” :”:”û9”ô9”í9”æ9”ß9”Ø9”Ñ9”Ê9”Ã9”¼9”µ9”®9”§9” 9”™9”’9”‹9”„9”}9”v9”o9”h9”a9”Z9”S9”L9”E9”>9”79”09”)9”"9”9”9” 9”9”ÿ8”ø8”ñ8”ê8”ã8”Ü8”Õ8”Î8”Ç8”À8”¹8”²8”«8”¤8”8”–8”8”ˆ8”8”z8”s8”l8”e8”^8”W8”P8”I8”B8”;8”48”-8”&8”8”8”8” 8”8”ü7”õ7”î7”ç7”à7”Ù7”Ò7”Ë7”Ä7”½7”¶7”¯7”¨7”¡7”š7”“7”Œ7”…7”~7”w7”p7”i7”b7”[7”T7”M7”F7”?7”87”17”*7”#7”7”7”7”7”7”ù6”ò6”ë6”ä6”Ý6”Ö6”Ï6”È6”Á6”º6”³6”¬6”¥6”ž6”—6”6”‰6”‚6”{6”t6”m6”f6”_6”X6”Q6”J6”C6”<6”56”.6”'6” 6”6”6” 6”6”ý5”ö5”ï5”è5”á5”Ú5”Ó5”Ì5”Å5”¾5”·5”°5”©5”¢5”›5””5”5”†5”5”x5”q5”j5”c5”\5”U5”N5”G5”@5”95”25”+5”$5”5”5”5”5”5”ú4”ó4”ì4”å4”Þ4”×4”Ð4”É4”Â4”»4”´4”­4”¦4”Ÿ4”˜4”‘4”Š4”ƒ4”|4”u4”n4”g4”`4”Y4”R4”K4”D4”=4”64”/4”(4”!4”4”4” 4”4”þ3”÷3”ð3”é3”â3”Û3”Ô3”Í3”Æ3”¿3”¸3”±3”ª3”£3”œ3”•3”Ž3”‡3”€3”y3”r3”k3”d3”]3”V3”O3”H3”A3”:3”33”,3”%3”3”3”3” 3”3”û2”ô2”í2”æ2”ß2”Ø2”Ñ2”Ê2”Ã2”¼2”µ2”®2”§2” 2”™2”’2”‹2”„2”}2”v2”o2”h2”a2”Z2”S2”L2”E2”>2”72”02”)2”"2”2”2” 2”2”ÿ1”ø1”ñ1”ê1”ã1”Ü1”Õ1”Î1”Ç1”À1”¹1”²1”«1”¤1”1”–1”1”ˆ1”1”z1”s1”l1”e1”^1”W1”P1”I1”B1”;1”41”-1”&1”1”1”1” 1”1”ü0”õ0”î0”ç0”à0”Ù0”Ò0”Ë0”Ä0”½0”¶0”¯0”¨0”¡0”š0”“0”Œ0”…0”~0”w0”p0”i0”b0”[0”T0”M0”F0”?0”80”10”*0”#0”0”0”0”0”0”ù/”ò/”ë/”ä/”Ý/”Ö/”Ï/”È/”Á/”º/”³/”¬/”¥/”ž/”—/”/”‰/”‚/”{/”t/”m/”f/”_/”X/”Q/”J/”C/”+”7+”0+”)+”"+”+”+” +”+”ÿ*”ø*”ñ*”ê*”ã*”Ü*”Õ*”Î*”Ç*”À*”¹*”²*”«*”¤*”*”–*”*”ˆ*”*”z*”s*”l*”e*”^*”W*”P*”I*”B*”;*”4*”-*”&*”*”*”*” *”*”ü)”õ)”î)”ç)”à)”Ù)”Ò)”Ë)”Ä)”½)”¶)”¯)”¨)”¡)”š)”“)”Œ)”…)”~)”w)”p)”i)”b)”[)”T)”M)”F)”?)”8)”1)”*)”#)”)”)”)”)”)”ù(”ò(”ë(”ä(”Ý(”Ö(”Ï(”È(”Á(”º(”³(”¬(”¥(”ž(”—(”(”‰(”‚(”{(”t(”m(”f(”_(”X(”Q(”J(”C(”<(”5(”.(”'(” (”(”(” (”(”ý'”ö'”ï'”è'”á'”Ú'”Ó'”Ì'”Å'”¾'”·'”°'”©'”¢'”›'””'”'”†'”'”x'”q'”j'”c'”\'”U'”N'”G'”@'”9'”2'”+'”$'”'”'”'”'”'”ú&”ó&”ì&”å&”Þ&”×&”Ð&”É&”Â&”»&”´&”­&”¦&”Ÿ&”˜&”‘&”Š&”ƒ&”|&”u&”n&”g&”`&”Y&”R&”K&”D&”=&”6&”/&”(&”!&”&”&” &”&”þ%”÷%”ð%”é%”â%”Û%”Ô%”Í%”Æ%”¿%”¸%”±%”ª%”£%”œ%”•%”Ž%”‡%”€%”y%”r%”k%”d%”]%”V%”O%”H%”A%”:%”3%”,%”%%”%”%”%” %”%”û$”ô$”í$”æ$”ß$”Ø$”Ñ$”Ê$”Ã$”¼$”µ$”®$”§$” $”™$”’$”‹$”„$”}$”v$”o$”h$”a$”Z$”S$”L$”E$”>$”7$”0$”)$”"$”$”$” $”$”ÿ#”ø#”ñ#”ê#”ã#”Ü#”Õ#”Î#”Ç#”À#”¹#”²#”«#”¤#”#”–#”#”ˆ#”#”z#”s#”l#”e#”^#”W#”P#”I#”B#”;#”4#”-#”&#”#”#”#” #”#”ü"”õ"”î"”ç"”à"”Ù"”Ò"”Ë"”Ä"”½"”¶"”¯"”¨"”¡"”š"”“"”Œ"”…"”~"”w"”p"”i"”b"”["”T"”M"”F"”?"”8"”1"”*"”#"”"”"”"”"”"”ù!”ò!”ë!”ä!”Ý!”Ö!”Ï!”È!”Á!”º!”³!”¬!”¥!”ž!”—!”!”‰!”‚!”{!”t!”m!”f!”_!”X!”Q!”J!”C!””7”0”)”"””” ””ÿ”ø”ñ”ê”ã”ܔՔΔǔÀ”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú”ó”ì”å”ޔהДɔ”»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û”ô”í”æ”ߔؔєʔÔ¼”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ”ø”ñ”ê”ã”ܔՔΔǔÀ”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú”ó”ì”å”ޔהДɔ”»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û”ô”í”æ”ߔؔєʔÔ¼”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ”ø”ñ”ê”ã”ܔՔΔǔÀ”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü ”õ ”î ”ç ”à ”Ù ”Ò ”Ë ”Ä ”½ ”¶ ”¯ ”¨ ”¡ ”š ”“ ”Œ ”… ”~ ”w ”p ”i ”b ”[ ”T ”M ”F ”? ”8 ”1 ”* ”# ” ” ” ” ” ”ù ”ò ”ë ”ä ”Ý ”Ö ”Ï ”È ”Á ”º ”³ ”¬ ”¥ ”ž ”— ” ”‰ ”‚ ”{ ”t ”m ”f ”_ ”X ”Q ”J ”C ”< ”5 ”. ”' ” ” ” ” ” ”ý ”ö ”ï ”è ”á ”Ú ”Ó ”Ì ”Å ”¾ ”· ”° ”© ”¢ ”› ”” ” ”† ” ”x ”q ”j ”c ”\ ”U ”N ”G ”@ ”9 ”2 ”+ ”$ ” ” ” ” ” ”ú ”ó ”ì ”å ”Þ ”× ”Ð ”É ” ”» ”´ ”­ ”¦ ”Ÿ ”˜ ”‘ ”Š ”ƒ ”| ”u ”n ”g ”` ”Y ”R ”K ”D ”= ”6 ”/ ”( ”! ” ” ” ” ”þ ”÷ ”ð ”é ”â ”Û ”Ô ”Í ”Æ ”¿ ”¸ ”± ”ª ”£ ”œ ”• ”Ž ”‡ ”€ ”y ”r ”k ”d ”] ”V ”O ”H ”A ”: ”3 ”, ”% ” ” ” ” ” ”û”ô”í”æ”ߔؔєʔÔ¼”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ”ø”ñ”ê”ã”ܔՔΔǔÀ”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú”ó”ì”å”ޔהДɔ”»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û”ô”í”æ”ߔؔєʔÔ¼”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ”ø”ñ”ê”ã”ܔՔΔÇ”À”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””üÿ“õÿ“îÿ“çÿ“àÿ“Ùÿ“Òÿ“Ëÿ“Äÿ“½ÿ“¶ÿ“¯ÿ“¨ÿ“¡ÿ“šÿ““ÿ“Œÿ“…ÿ“~ÿ“wÿ“pÿ“iÿ“bÿ“[ÿ“Tÿ“Mÿ“Fÿ“?ÿ“8ÿ“1ÿ“*ÿ“#ÿ“ÿ“ÿ“ÿ“ÿ“ÿ“ùþ“òþ“ëþ“äþ“Ýþ“Öþ“Ïþ“Èþ“Áþ“ºþ“³þ“¬þ“¥þ“žþ“—þ“þ“‰þ“‚þ“{þ“tþ“mþ“fþ“_þ“Xþ“Qþ“Jþ“Cþ“<þ“5þ“.þ“'þ“ þ“þ“þ“ þ“þ“ýý“öý“ïý“èý“áý“Úý“Óý“Ìý“Åý“¾ý“·ý“°ý“©ý“¢ý“›ý“”ý“ý“†ý“ý“xý“qý“jý“cý“\ý“Uý“Ný“Gý“@ý“9ý“2ý“+ý“$ý“ý“ý“ý“ý“ý“úü“óü“ìü“åü“Þü“×ü“Ðü“Éü“Âü“»ü“´ü“­ü“¦ü“Ÿü“˜ü“‘ü“Šü“ƒü“|ü“uü“nü“gü“`ü“Yü“Rü“Kü“Dü“=ü“6ü“/ü“(ü“!ü“ü“ü“ ü“ü“þû“÷û“ðû“éû“âû“Ûû“Ôû“Íû“Æû“¿û“¸û“±û“ªû“£û“œû“•û“Žû“‡û“€û“yû“rû“kû“dû“]û“Vû“Oû“Hû“Aû“:û“3û“,û“%û“û“û“û“ û“û“ûú“ôú“íú“æú“ßú“Øú“Ñú“Êú“Ãú“¼ú“µú“®ú“§ú“ ú“™ú“’ú“‹ú“„ú“}ú“vú“oú“hú“aú“Zú“Sú“Lú“Eú“>ú“7ú“0ú“)ú“"ú“ú“ú“ ú“ú“ÿù“øù“ñù“êù“ãù“Üù“Õù“Îù“Çù“Àù“¹ù“²ù“«ù“¤ù“ù“–ù“ù“ˆù“ù“zù“sù“lù“eù“^ù“Wù“Pù“Iù“Bù“;ù“4ù“-ù“&ù“ù“ù“ù“ ù“ù“üø“õø“îø“çø“àø“Ùø“Òø“Ëø“Äø“½ø“¶ø“¯ø“¨ø“¡ø“šø““ø“Œø“…ø“~ø“wø“pø“iø“bø“[ø“Tø“Mø“Fø“?ø“8ø“1ø“*ø“#ø“ø“ø“ø“ø“ø“ù÷“ò÷“ë÷“ä÷“Ý÷“Ö÷“Ï÷“È÷“Á÷“º÷“³÷“¬÷“¥÷“ž÷“—÷“÷“‰÷“‚÷“{÷“t÷“m÷“f÷“_÷“X÷“Q÷“J÷“C÷“<÷“5÷“.÷“'÷“ ÷“÷“÷“ ÷“÷“ýö“öö“ïö“èö“áö“Úö“Óö“Ìö“Åö“¾ö“·ö“°ö“©ö“¢ö“›ö“”ö“ö“†ö“ö“xö“qö“jö“cö“\ö“Uö“Nö“Gö“@ö“9ö“2ö“+ö“$ö“ö“ö“ö“ö“ö“úõ“óõ“ìõ“åõ“Þõ“×õ“Ðõ“Éõ“Âõ“»õ“´õ“­õ“¦õ“Ÿõ“˜õ“‘õ“Šõ“ƒõ“|õ“uõ“nõ“gõ“`õ“Yõ“Rõ“Kõ“Dõ“=õ“6õ“/õ“(õ“!õ“õ“õ“ õ“õ“þô“÷ô“ðô“éô“âô“Ûô“Ôô“Íô“Æô“¿ô“¸ô“±ô“ªô“£ô“œô“•ô“Žô“‡ô“€ô“yô“rô“kô“dô“]ô“Vô“Oô“Hô“Aô“:ô“3ô“,ô“%ô“ô“ô“ô“ ô“ô“ûó“ôó“íó“æó“ßó“Øó“Ñó“Êó“Ãó“¼ó“µó“®ó“§ó“ ó“™ó“’ó“‹ó“„ó“}ó“vó“oó“hó“aó“Zó“Só“Ló“Eó“>ó“7ó“0ó“)ó“"ó“ó“ó“ ó“ó“ÿò“øò“ñò“êò“ãò“Üò“Õò“Îò“Çò“Àò“¹ò“²ò“«ò“¤ò“ò“–ò“ò“ˆò“ò“zò“sò“lò“eò“^ò“Wò“Pò“Iò“Bò“;ò“4ò“-ò“&ò“ò“ò“ò“ ò“ò“üñ“õñ“îñ“çñ“àñ“Ùñ“Òñ“Ëñ“Äñ“½ñ“¶ñ“¯ñ“¨ñ“¡ñ“šñ““ñ“Œñ“…ñ“~ñ“wñ“pñ“iñ“bñ“[ñ“Tñ“Mñ“Fñ“?ñ“8ñ“1ñ“*ñ“#ñ“ñ“ñ“ñ“ñ“ñ“ùð“òð“ëð“äð“Ýð“Öð“Ïð“Èð“Áð“ºð“³ð“¬ð“¥ð“žð“—ð“ð“‰ð“‚ð“{ð“tð“mð“fð“_ð“Xð“Qð“Jð“Cð“<ð“5ð“.ð“'ð“ ð“ð“ð“ ð“ð“ýï“öï“ïï“èï“áï“Úï“Óï“Ìï“Åï“ï“ï“xï“qï“jï“cï“\ï“Uï“Nï“Gï“@ï“9ï“2ï“+ï“$ï“ï“ï“ï“ï“ï“úî“óî“ìî“åî“Þî“×î“Ðî“Éî“Âî“|î“uî“nî“gî“`î“Yî“Rî“Kî“Dî“=î“6î“/î“(î“!î“î“î“ î“î“þí“÷í“ðí“éí“âí“Ûí“Ôí“Íí“Æí“¿í“¸í“±í“ªí“£í“œí“•í“Ží“‡í“€í“yí“rí“kí“dí“]í“Ví“Oí“Hí“Aí“:í“3í“,í“%í“í“í“í“ í“í“ûì“ôì“íì“æì“ßì“Øì“Ñì“Êì“Ã쓼쓵쓮쓧쓠쓙쓒쓋쓄ì“}ì“vì“oì“hì“aì“Zì“Sì“Lì“Eì“>ì“7ì“0ì“)ì“"ì“ì“ì“ ì“ì“ÿë“øë“ñë“êë“ãë“Üë“Õë“Îë“Çë“À듹듲듫들ë“ë“–ë“듈ë“ë“zë“së“lë“eë“^ë“Wë“Pë“Ië“Bë“;ë“4ë“-ë“&ë“ë“ë“ë“ ë“ë“üê“õê“îê“çê“àê“Ùê“Òê“Ëê“Äꓽꓶꓯꓨꓡꓚꓓ꓌꓅ê“~ê“wê“pê“iê“bê“[ê“Tê“Mê“Fê“?ê“8ê“1ê“*ê“#ê“ê“ê“ê“ê“ê“ùé“òé“ëé“äé“Ýé“Öé“Ïé“Èé“Á铺铳铬铥铞铗é“铉铂é“{é“té“mé“fé“_é“Xé“Qé“Jé“Cé“<é“5é“.é“'é“ é“é“é“ é“é“ýè“öè“ïè“èè“áè“Úè“Óè“Ìè“Å蓾蓷蓰蓩蓢蓛蓔è“蓆è“è“xè“qè“jè“cè“\è“Uè“Nè“Gè“@è“9è“2è“+è“$è“è“è“è“è“è“úç“óç“ìç“åç“Þç“×ç“Ðç“Éç“Â瓻瓴瓭瓦瓟瓘瓑瓊瓃ç“|ç“uç“nç“gç“`ç“Yç“Rç“Kç“Dç“=ç“6ç“/ç“(ç“!ç“ç“ç“ ç“ç“þæ“÷æ“ðæ“éæ“âæ“Ûæ“Ôæ“Íæ“Ææ“¿æ“¸æ“±æ“ªæ“£æ“œæ“•擎擇擀æ“yæ“ræ“kæ“dæ“]æ“Væ“Oæ“Hæ“Aæ“:æ“3æ“,æ“%æ“æ“æ“æ“ æ“æ“ûå“ôå“í哿å“ß哨å“Ñå“Êå“Ã哼哵哮哧哠哙哒哋哄å“}å“vå“oå“hå“aå“Zå“Så“Lå“Eå“>å“7å“0å“)å“"å“å“å“ å“å“ÿ䓸ä“ñä“êä“ãä“Üä“Õä“Îä“Çä“À䓹䓲䓫䓤ä“ä“–ä“䓈ä“ä“zä“sä“lä“eä“^ä“Wä“Pä“Iä“Bä“;ä“4ä“-ä“&ä“ä“ä“ä“ ä“ä“üã“õã“îã“çã“àã“Ùã“Òã“Ëã“Ä㓽㓶㓯㓨㓡㓚㓓㓌㓅ã“~ã“wã“pã“iã“bã“[ã“Tã“Mã“Fã“?ã“8ã“1ã“*ã“#ã“ã“ã“ã“ã“ã“ùâ“òâ“ëâ“äâ“Ýâ“Öâ“Ïâ“Èâ“Á⓺⓳⓬ⓥⓞⓗâ“ⓉⓂâ“{â“tâ“mâ“fâ“_â“Xâ“Qâ“Jâ“Câ“<â“5â“.â“'â“ â“â“â“ â“â“ýá“öá“ïá“èá“áá“Úá“Óá“Ìá“Åᓾᓷᓰᓩᓢᓛᓔá“ᓆá“á“xá“qá“já“cá“\á“Uá“Ná“Gá“@á“9á“2á“+á“$á“á“á“á“á“á“úà“óà“ìà“åà“Þà“×à“Ðà“Éà“Âà“»à“´à“­à“¦à“Ÿà“˜à“‘à“Šà“ƒà“|à“uà“nà“gà“`à“Yà“Rà“Kà“Dà“=à“6à“/à“(à“!à“à“à“ à“à“þß“÷ß“ðß“éß“âß“Ûß“Ôß“Íß“Æß“¿ß“¸ß“±ß“ªß“£ß“œß“•ß“Žß“‡ß“€ß“yß“rß“kß“dß“]ß“Vß“Oß“Hß“Aß“:ß“3ß“,ß“%ߓߓߓߓ ߓߓûÞ“ôÞ“íÞ“æÞ“ßÞ“ØÞ“ÑÞ“ÊÞ“ÃÞ“¼Þ“µÞ“®Þ“§Þ“ Þ“™Þ“’Þ“‹Þ“„Þ“}Þ“vÞ“oÞ“hÞ“aÞ“ZÞ“SÞ“LÞ“EÞ“>Þ“7Þ“0Þ“)Þ“"Þ“Þ“Þ“ Þ“Þ“ÿÝ“øÝ“ñÝ“êÝ“ãÝ“ÜÝ“ÕÝ“ÎÝ“ÇÝ“ÀÝ“¹Ý“²Ý“«Ý“¤Ý“Ý“–ݓݓˆÝ“Ý“zÝ“sÝ“lÝ“eÝ“^Ý“WÝ“PÝ“IÝ“BÝ“;Ý“4Ý“-Ý“&ݓݓݓݓ ݓݓüÜ“õÜ“îÜ“çÜ“àÜ“ÙÜ“ÒÜ“ËÜ“ÄÜ“½Ü“¶Ü“¯Ü“¨Ü“¡Ü“šÜ““Ü“ŒÜ“…Ü“~Ü“wÜ“pÜ“iÜ“bÜ“[Ü“TÜ“MÜ“FÜ“?Ü“8Ü“1Ü“*Ü“#ܓܓܓܓܓܓùÛ“òÛ“ëÛ“äÛ“ÝÛ“ÖÛ“ÏÛ“ÈÛ“ÁÛ“ºÛ“³Û“¬Û“¥Û“žÛ“—Û“Û“‰Û“‚Û“{Û“tÛ“mÛ“fÛ“_Û“XÛ“QÛ“JÛ“CÛ“<Û“5Û“.Û“'Û“ Û“Û“Û“ Û“Û“ýÚ“öÚ“ïÚ“èÚ“áÚ“ÚÚ“ÓÚ“ÌÚ“ÅÚ“¾Ú“·Ú“°Ú“©Ú“¢Ú“›Ú“”Ú“Ú“†Ú“Ú“xÚ“qÚ“jÚ“cÚ“\Ú“UÚ“NÚ“GÚ“@Ú“9Ú“2Ú“+Ú“$Ú“Ú“Ú“Ú“Ú“Ú“úÙ“óÙ“ìÙ“åÙ“ÞÙ“×Ù“ÐÙ“ÉÙ“ÂÙ“»Ù“´Ù“­Ù“¦Ù“ŸÙ“˜Ù“‘Ù“ŠÙ“ƒÙ“|Ù“uÙ“nÙ“gÙ“`Ù“YÙ“RÙ“KÙ“DÙ“=Ù“6Ù“/Ù“(Ù“!ٓٓٓ ٓٓþØ“÷Ø“ðØ“験âØ“ÛØ“ÔØ“ÍØ“ÆØ“¿Ø“¸Ø“±Ø“ªØ“£Ø“œØ“•Ø“ŽØ“‡Ø“€Ø“yØ“rØ“kØ“dØ“]Ø“VØ“OØ“HØ“AØ“:Ø“3Ø“,Ø“%ؓؓؓؓ ؓؓûדôדíדæ×“ßדØ×“ÑדÊדÃד¼×“µ×“®×“§×“ ×“™×“’ד‹×“„ד}דvדoדhדaדZדSדLדEד>ד7ד0ד)ד"דדד דדÿÖ“øÖ“ñÖ“êÖ“ãÖ“ÜÖ“ÕÖ“ÎÖ“ÇÖ“ÀÖ“¹Ö“²Ö“«Ö“¤Ö“Ö“–Ö“Ö“ˆÖ“Ö“zÖ“sÖ“lÖ“eÖ“^Ö“WÖ“PÖ“IÖ“BÖ“;Ö“4Ö“-Ö“&Ö“Ö“Ö“Ö“ Ö“Ö“üÕ“õÕ“îÕ“çÕ“àÕ“ÙÕ“ÒÕ“ËÕ“ÄÕ“½Õ“¶Õ“¯Õ“¨Õ“¡Õ“šÕ““Õ“ŒÕ“…Õ“~Õ“wÕ“pÕ“iÕ“bÕ“[Õ“TÕ“MÕ“FÕ“?Õ“8Õ“1Õ“*Õ“#Õ“Õ“Õ“Õ“Õ“Õ“ùÔ“òÔ“ëÔ“äÔ“ÝÔ“ÖÔ“ÏÔ“ÈÔ“ÁÔ“ºÔ“³Ô“¬Ô“¥Ô“žÔ“—Ô“Ô“‰Ô“‚Ô“{Ô“tÔ“mÔ“fÔ“_Ô“XÔ“QÔ“JÔ“CÔ“<Ô“5Ô“.Ô“'Ô“ Ô“Ô“Ô“ Ô“Ô“ýÓ“öÓ“ïÓ“èÓ“áÓ“ÚÓ“ÓÓ“ÌÓ“ÅÓ“¾Ó“·Ó“°Ó“©Ó“¢Ó“›Ó“”Ó“Ó“†Ó“Ó“xÓ“qÓ“jÓ“cÓ“\Ó“UÓ“NÓ“GÓ“@Ó“9Ó“2Ó“+Ó“$Ó“Ó“Ó“Ó“Ó“Ó“úÒ“óÒ“ìÒ“åÒ“ÞÒ“×Ò“ÐÒ“ÉÒ“ÂÒ“»Ò“´Ò“­Ò“¦Ò“ŸÒ“˜Ò“‘Ò“ŠÒ“ƒÒ“|Ò“uÒ“nÒ“gÒ“`Ò“YÒ“RÒ“KÒ“DÒ“=Ò“6Ò“/Ò“(Ò“!Ò“Ò“Ò“ Ò“Ò“þÑ“÷Ñ“ðÑ“éÑ“âÑ“ÛÑ“ÔÑ“ÍÑ“ÆÑ“¿Ñ“¸Ñ“±Ñ“ªÑ“£Ñ“œÑ“•Ñ“ŽÑ“‡Ñ“€Ñ“yÑ“rÑ“kÑ“dÑ“]Ñ“VÑ“OÑ“HÑ“AÑ“:Ñ“3Ñ“,Ñ“%ѓѓѓѓ ѓѓûГôГíГæÐ“ßГØÐ“ÑГÊГÃГ¼Ð“µÐ“®Ð“§Ð“ Ð“™Ð“’Г‹Ð“„Г}ГvГoГhГaГZГSГLГEГ>Г7Г0Г)Г"ГГГ ГГÿÏ“øÏ“ñÏ“êÏ“ãÏ“ÜÏ“ÕÏ“ÎÏ“ÇÏ“ÀÏ“¹Ï“²Ï“«Ï“¤Ï“Ï“–ϓϓˆÏ“Ï“zÏ“sÏ“lÏ“eÏ“^Ï“WÏ“PÏ“IÏ“BÏ“;Ï“4Ï“-Ï“&ϓϓϓϓ ϓϓüΓõΓîΓçΓàΓÙΓÒΓËΓÄΓ½Î“¶Î“¯Î“¨Î“¡Î“šÎ““ΓŒÎ“…Γ~ΓwΓpΓiΓbΓ[ΓTΓMΓFΓ?Γ8Γ1Γ*Γ#ΓΓΓΓΓΓùÍ“òÍ“ëÍ“äÍ“ÝÍ“ÖÍ“ÏÍ“ÈÍ“ÁÍ“ºÍ“³Í“¬Í“¥Í“žÍ“—͓͓‰Í“‚Í“{Í“tÍ“mÍ“fÍ“_Í“XÍ“QÍ“JÍ“CÍ“<Í“5Í“.Í“'Í“ ͓͓͓ ͓͓ýÌ“öÌ“ïÌ“èÌ“áÌ“ÚÌ“ÓÌ“ÌÌ“ÅÌ“¾Ì“·Ì“°Ì“©Ì“¢Ì“›Ì“”̓̓†Ì“Ì“xÌ“qÌ“jÌ“cÌ“\Ì“UÌ“NÌ“GÌ“@Ì“9Ì“2Ì“+Ì“$̓̓̓̓̓̓úË“óË“ìË“åË“ÞË“×Ë“ÐË“ÉË“ÂË“»Ë“´Ë“­Ë“¦Ë“ŸË“˜Ë“‘Ë“ŠË“ƒË“|Ë“uË“nË“gË“`Ë“YË“RË“KË“DË“=Ë“6Ë“/Ë“(Ë“!˓˓˓ ˓˓þÊ“÷Ê“ðÊ“éÊ“âÊ“ÛÊ“ÔÊ“ÍÊ“ÆÊ“¿Ê“¸Ê“±Ê“ªÊ“£Ê“œÊ“•Ê“ŽÊ“‡Ê“€Ê“yÊ“rÊ“kÊ“dÊ“]Ê“VÊ“OÊ“HÊ“AÊ“:Ê“3Ê“,Ê“%ʓʓʓʓ ʓʓûÉ“ôÉ“íÉ“æÉ“ßÉ“ØÉ“ÑÉ“ÊÉ“ÃÉ“¼É“µÉ“®É“§É“ É“™É“’É“‹É“„É“}É“vÉ“oÉ“hÉ“aÉ“ZÉ“SÉ“LÉ“EÉ“>É“7É“0É“)É“"ɓɓɓ ɓɓÿÈ“øÈ“ñÈ“êÈ“ãÈ“ÜÈ“ÕÈ“ÎÈ“ÇÈ“ÀÈ“¹È“²È“«È“¤È“È“–ȓȓˆÈ“È“zÈ“sÈ“lÈ“eÈ“^È“WÈ“PÈ“IÈ“BÈ“;È“4È“-È“&ȓȓȓȓ ȓȓüÇ“õÇ“îÇ“çÇ“àÇ“ÙÇ“ÒÇ“ËÇ“ÄÇ“½Ç“¶Ç“¯Ç“¨Ç“¡Ç“šÇ““Ç“ŒÇ“…Ç“~Ç“wÇ“pÇ“iÇ“bÇ“[Ç“TÇ“MÇ“FÇ“?Ç“8Ç“1Ç“*Ç“#ǓǓǓǓǓǓùÆ“òÆ“ëÆ“䯓ÝÆ“ÖÆ“ÏÆ“ÈÆ“ÁÆ“ºÆ“³Æ“¬Æ“¥Æ“žÆ“—ƓƓ‰Æ“‚Æ“{Æ“tÆ“mÆ“fÆ“_Æ“XÆ“QÆ“JÆ“CÆ“<Æ“5Æ“.Æ“'Æ“ ƓƓƓ ƓƓýÅ“öÅ“ïÅ“èÅ“áÅ“ÚÅ“ÓÅ“ÌÅ“ÅÅ“¾Å“·Å“°Å“©Å“¢Å“›Å“”œœ†Å“Å“xÅ“qÅ“jÅ“cÅ“\Å“UÅ“NÅ“GÅ“@Å“9Å“2Å“+Å“$œœœœœœúÄ“óÄ“ìÄ“åÄ“ÞÄ“×Ä“ÐÄ“ÉÄ“ÂÄ“»Ä“´Ä“­Ä“¦Ä“ŸÄ“˜Ä“‘Ä“ŠÄ“ƒÄ“|Ä“uÄ“nÄ“gÄ“`Ä“YÄ“RÄ“KÄ“DÄ“=Ä“6Ä“/Ä“(Ä“!ēēē ēēþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÃ“¿Ã“¸Ã“±Ã“ªÃ“£Ã“œÃ“•ӎӇӀÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓû“ô“í“æÂ“ß“ØÂ“ѓʓӼ“µÂ“®Â“§Â“ Â“™Â“’“‹Â“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿÁ“øÁ“ñÁ“êÁ“ãÁ“ÜÁ“ÕÁ“ÎÁ“ÇÁ“ÀÁ“¹Á“²Á“«Á“¤Á“Á“–Á“Á“ˆÁ“Á“zÁ“sÁ“lÁ“eÁ“^Á“WÁ“PÁ“IÁ“BÁ“;Á“4Á“-Á“&Á“Á“Á“Á“ Á“Á“üÀ“õÀ“îÀ“çÀ“àÀ“ÙÀ“ÒÀ“ËÀ“ÄÀ“½À“¶À“¯À“¨À“¡À“šÀ““À“ŒÀ“…À“~À“wÀ“pÀ“iÀ“bÀ“[À“TÀ“MÀ“FÀ“?À“8À“1À“*À“#À“À“À“À“À“À“ù¿“ò¿“ë¿“ä¿“Ý¿“Ö¿“Ï¿“È¿“Á¿“º¿“³¿“¬¿“¥¿“ž¿“—¿“¿“‰¿“‚¿“{¿“t¿“m¿“f¿“_¿“X¿“Q¿“J¿“C¿“<¿“5¿“.¿“'¿“ ¿“¿“¿“ ¿“¿“ý¾“ö¾“モ输ᾓÚ¾“Ó¾“̾“ž“¾¾“·¾“°¾“©¾“¢¾“›¾“”¾“¾“†¾“¾“x¾“q¾“j¾“c¾“\¾“U¾“N¾“G¾“@¾“9¾“2¾“+¾“$¾“¾“¾“¾“¾“¾“ú½“ó½“콓当Þ½“×½“н“ɽ“½“»½“´½“­½“¦½“Ÿ½“˜½“‘½“н“ƒ½“|½“u½“n½“g½“`½“Y½“R½“K½“D½“=½“6½“/½“(½“!½“½“½“ ½“½“þ¼“÷¼“ð¼“鼓⼓Û¼“Ô¼“ͼ“Ƽ“¿¼“¸¼“±¼“ª¼“£¼“œ¼“•¼“޼“‡¼“€¼“y¼“r¼“k¼“d¼“]¼“V¼“O¼“H¼“A¼“:¼“3¼“,¼“%¼“¼“¼“¼“ ¼“¼“û»“ô»“í»“滓ß»“Ø»“Ñ»“Ê»“û“¼»“µ»“®»“§»“ »“™»“’»“‹»“„»“}»“v»“o»“h»“a»“Z»“S»“L»“E»“>»“7»“0»“)»“"»“»“»“ »“»“ÿº“øº“ñº“꺓㺓ܺ“Õº“κ“Ǻ“Àº“¹º“²º“«º“¤º“º“–º“º“ˆº“º“zº“sº“lº“eº“^º“Wº“Pº“Iº“Bº“;º“4º“-º“&º“º“º“º“ º“º“ü¹“õ¹“繓๓Ù¹“Ò¹“˹“Ĺ“½¹“¶¹“¯¹“¨¹“¡¹“𹓓¹“Œ¹“…¹“~¹“w¹“p¹“i¹“b¹“[¹“T¹“M¹“F¹“?¹“8¹“1¹“*¹“#¹“¹“¹“¹“¹“¹“ù¸“ò¸“븓专ݸ“Ö¸“ϸ“ȸ“Á¸“º¸“³¸“¬¸“¥¸“ž¸“—¸“¸“‰¸“‚¸“{¸“t¸“m¸“f¸“_¸“X¸“Q¸“J¸“C¸“<¸“5¸“.¸“'¸“ ¸“¸“¸“ ¸“¸“ý·“ö·“ï·“è·“á·“Ú·“Ó·“Ì·“Å·“¾·“··“°·“©·“¢·“›·“”·“·“†·“·“x·“q·“j·“c·“\·“U·“N·“G·“@·“9·“2·“+·“$·“·“·“·“·“·“ú¶“ó¶“ì¶“å¶“Þ¶“×¶“ж“ɶ“¶“»¶“´¶“­¶“¦¶“Ÿ¶“˜¶“‘¶“ж“ƒ¶“|¶“u¶“n¶“g¶“`¶“Y¶“R¶“K¶“D¶“=¶“6¶“/¶“(¶“!¶“¶“¶“ ¶“¶“þµ“÷µ“ðµ“鵓ⵓÛµ“Ôµ“͵“Ƶ“¿µ“¸µ“±µ“ªµ“£µ“œµ“•µ“޵“‡µ“€µ“yµ“rµ“kµ“dµ“]µ“Vµ“Oµ“Hµ“Aµ“:µ“3µ“,µ“%µ“µ“µ“µ“ µ“µ“û´“ô´“í´“æ´“ß´“Ø´“Ñ´“Ê´“ô“¼´“µ´“®´“§´“ ´“™´“’´“‹´“„´“}´“v´“o´“h´“a´“Z´“S´“L´“E´“>´“7´“0´“)´“"´“´“´“ ´“´“ÿ³“ø³“ñ³“곓㳓ܳ“Õ³“γ“dz“À³“¹³“²³“«³“¤³“³“–³“³“ˆ³“³“z³“s³“l³“e³“^³“W³“P³“I³“B³“;³“4³“-³“&³“³“³“³“ ³“³“ü²“õ²“粓ಓÙ²“Ò²“˲“IJ“½²“¶²“¯²“¨²“¡²“𲓓²“Œ²“…²“~²“w²“p²“i²“b²“[²“T²“M²“F²“?²“8²“1²“*²“#²“²“²“²“²“²“ù±“ò±“뱓䱓ݱ“Ö±“ϱ“ȱ“Á±“º±“³±“¬±“¥±“ž±“—±“±“‰±“‚±“{±“t±“m±“f±“_±“X±“Q±“J±“C±“<±“5±“.±“'±“ ±“±“±“ ±“±“ý°“ö°“ï°“è°“á°“Ú°“Ó°“̰“Ű“¾°“·°“°°“©°“¢°“›°“”°“°“†°“°“x°“q°“j°“c°“\°“U°“N°“G°“@°“9°“2°“+°“$°“°“°“°“°“°“ú¯“ó¯“쯓寓Þ¯“ׯ“Я“ɯ“¯“»¯“´¯“­¯“¦¯“Ÿ¯“˜¯“‘¯“Н“ƒ¯“|¯“u¯“n¯“g¯“`¯“Y¯“R¯“K¯“D¯“=¯“6¯“/¯“(¯“!¯“¯“¯“ ¯“¯“þ®“÷®“ð®“鮓⮓Û®“Ô®“Í®“Æ®“¿®“¸®“±®“ª®“£®“œ®“•®“Ž®“‡®“€®“y®“r®“k®“d®“]®“V®“O®“H®“A®“:®“3®“,®“%®“®“®“®“ ®“®“û­“ô­“í­“æ­“ß­“Ø­“Ñ­“Ê­“퓼­“µ­“®­“§­“ ­“™­“’­“‹­“„­“}­“v­“o­“h­“a­“Z­“S­“L­“E­“>­“7­“0­“)­“"­“­“­“ ­“­“ÿ¬“ø¬“ñ¬“ꬓ㬓ܬ“Õ¬“ά“Ǭ“À¬“¹¬“²¬“«¬“¤¬“¬“–¬“¬“ˆ¬“¬“z¬“s¬“l¬“e¬“^¬“W¬“P¬“I¬“B¬“;¬“4¬“-¬“&¬“¬“¬“¬“ ¬“¬“ü«“õ«“î«“ç«“à«“Ù«“Ò«“Ë«“Ä«“½«“¶«“¯«“¨«“¡«“š«““«“Œ«“…«“~«“w«“p«“i«“b«“[«“T«“M«“F«“?«“8«“1«“*«“#«“«“«“«“«“«“ùª“òª“몓䪓ݪ“Öª“Ϫ“Ȫ“Áª“ºª“³ª“¬ª“¥ª“žª“—ª“ª“‰ª“‚ª“{ª“tª“mª“fª“_ª“Xª“Qª“Jª“Cª“<ª“5ª“.ª“'ª“ ª“ª“ª“ ª“ª“ý©“ö©“ï©“è©“á©“Ú©“Ó©“Ì©“Å©“¾©“·©“°©“©©“¢©“›©“”©“©“†©“©“x©“q©“j©“c©“\©“U©“N©“G©“@©“9©“2©“+©“$©“©“©“©“©“©“ú¨“ó¨“쨓娓Þ¨“ר“Ш“ɨ“¨“»¨“´¨“­¨“¦¨“Ÿ¨“˜¨“‘¨“Ѝ“ƒ¨“|¨“u¨“n¨“g¨“`¨“Y¨“R¨“K¨“D¨“=¨“6¨“/¨“(¨“!¨“¨“¨“ ¨“¨“þ§“÷§“ð§“é§“â§“Û§“Ô§“ͧ“Ƨ“¿§“¸§“±§“ª§“£§“œ§“•§“ާ“‡§“€§“y§“r§“k§“d§“]§“V§“O§“H§“A§“:§“3§“,§“%§“§“§“§“ §“§“û¦“ô¦“í¦“榓ߦ“ئ“Ѧ“ʦ“擼¦“µ¦“®¦“§¦“ ¦“™¦“’¦“‹¦“„¦“}¦“v¦“o¦“h¦“a¦“Z¦“S¦“L¦“E¦“>¦“7¦“0¦“)¦“"¦“¦“¦“ ¦“¦“ÿ¥“ø¥“ñ¥“꥓㥓Ü¥“Õ¥“Î¥“Ç¥“À¥“¹¥“²¥“«¥“¤¥“¥“–¥“¥“ˆ¥“¥“z¥“s¥“l¥“e¥“^¥“W¥“P¥“I¥“B¥“;¥“4¥“-¥“&¥“¥“¥“¥“ ¥“¥“ü¤“õ¤“礓ओÙ¤“Ò¤“ˤ“Ĥ“½¤“¶¤“¯¤“¨¤“¡¤“𤓓¤“Œ¤“…¤“~¤“w¤“p¤“i¤“b¤“[¤“T¤“M¤“F¤“?¤“8¤“1¤“*¤“#¤“¤“¤“¤“¤“¤“ù£“ò£“룓䣓Ý£“Ö£“Ï£“È£“Á£“º£“³£“¬£“¥£“ž£“—£“£“‰£“‚£“{£“t£“m£“f£“_£“X£“Q£“J£“C£“<£“5£“.£“'£“ £“£“£“ £“£“ý¢“ö¢“袓ᢓÚ¢“Ó¢“Ì¢“Å¢“¾¢“·¢“°¢“©¢“¢¢“›¢“”¢“¢“†¢“¢“x¢“q¢“j¢“c¢“\¢“U¢“N¢“G¢“@¢“9¢“2¢“+¢“$¢“¢“¢“¢“¢“¢“ú¡“ó¡“ì¡“å¡“Þ¡“ס“С“É¡“¡“»¡“´¡“­¡“¦¡“Ÿ¡“˜¡“‘¡“Š¡“ƒ¡“|¡“u¡“n¡“g¡“`¡“Y¡“R¡“K¡“D¡“=¡“6¡“/¡“(¡“!¡“¡“¡“ ¡“¡“þ “÷ “ð “é “â “Û “Ô “Í “Æ “¿ “¸ “± “ª “£ “œ “• “Ž “‡ “€ “y “r “k “d “] “V “O “H “A “: “3 “, “% “ “ “ “  “ “ûŸ“ôŸ“ퟓ染ߟ“ØŸ“ÑŸ“ÊŸ“ß“¼Ÿ“µŸ“®Ÿ“§Ÿ“ Ÿ“™Ÿ“’Ÿ“‹Ÿ“„Ÿ“}Ÿ“vŸ“oŸ“hŸ“aŸ“ZŸ“SŸ“LŸ“EŸ“>Ÿ“7Ÿ“0Ÿ“)Ÿ“"Ÿ“Ÿ“Ÿ“ Ÿ“Ÿ“ÿž“øž“ñž“ꞓ㞓ܞ“Õž“Ξ“Çž“Àž“¹ž“²ž“«ž“¤ž“ž“–ž“ž“ˆž“ž“zž“sž“lž“ež“^ž“Wž“Pž“Iž“Bž“;ž“4ž“-ž“&ž“ž“ž“ž“ ž“ž“ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ùœ“òœ“뜓䜓Ýœ“Öœ“Ïœ“Èœ“Áœ“ºœ“³œ“¬œ“¥œ“žœ“—œ“œ“‰œ“‚œ“{œ“tœ“mœ“fœ“_œ“Xœ“Qœ“Jœ“Cœ“<œ“5œ“.œ“'œ“ œ“œ“œ“ œ“œ“ý›“ö›“蛓ᛓÚ›“Ó›“Ì›“Å›“¾›“·›“°›“©›“¢›“››“”›“›“†›“›“x›“q›“j›“c›“\›“U›“N›“G›“@›“9›“2›“+›“$›“›“›“›“›“›“úš“óš“욓嚓ޚ“ך“К“Éš“š“»š“´š“­š“¦š“Ÿš“˜š“‘š“Šš“ƒš“|š“uš“nš“gš“`š“Yš“Rš“Kš“Dš“=š“6š“/š“(š“!š“š“š“ š“š“þ™“÷™“ð™“陓♓Û™“Ô™“Í™“Æ™“¿™“¸™“±™“ª™“£™“œ™“•™“Ž™“‡™“€™“y™“r™“k™“d™“]™“V™“O™“H™“A™“:™“3™“,™“%™“™“™“™“ ™“™“û˜“ô˜“혓易ߘ“ؘ“ј“ʘ“Ø“¼˜“µ˜“®˜“§˜“ ˜“™˜“’˜“‹˜“„˜“}˜“v˜“o˜“h˜“a˜“Z˜“S˜“L˜“E˜“>˜“7˜“0˜“)˜“"˜“˜“˜“ ˜“˜“ÿ—“ø—“ñ—“ê—“ã—“Ü—“Õ—“Η“Ç—“À—“¹—“²—“«—“¤—“—“–—“—“ˆ—“—“z—“s—“l—“e—“^—“W—“P—“I—“B—“;—“4—“-—“&—“—“—“—“ —“—“ü–“õ–“î–“ç–“à–“Ù–“Ò–“Ë–“Ä–“½–“¶–“¯–“¨–“¡–“š–““–“Œ–“…–“~–“w–“p–“i–“b–“[–“T–“M–“F–“?–“8–“1–“*–“#–“–“–“–“–“–“ù•“ò•“ë•“ä•“Ý•“Ö•“Ï•“È•“Á•“º•“³•“¬•“¥•“ž•“—•“•“‰•“‚•“{•“t•“m•“f•“_•“X•“Q•“J•“C•“<•“5•“.•“'•“ •“•“•“ •“•“ý”“ö”“蔓ᔓÚ”“Ó”“Ì”“Å”“¾”“·”“°”“©”“¢”“›”“””“”“†”“”“x”“q”“j”“c”“\”“U”“N”“G”“@”“9”“2”“+”“$”“”“”“”“”“”“ú““ó““ì““å““Þ““ד“Г“É““““»““´““­““¦““Ÿ““˜““‘““Š““ƒ““|““u““n““g““`““Y““R““K““D““=““6““/““(““!““““““ ““““þ’“÷’“ð’“é’“â’“Û’“Ô’“Í’“Æ’“¿’“¸’“±’“ª’“£’“œ’“•’“Ž’“‡’“€’“y’“r’“k’“d’“]’“V’“O’“H’“A’“:’“3’“,’“%’“’“’“’“ ’“’“û‘“ô‘“í‘“æ‘“ß‘“Ø‘“Ñ‘“Ê‘“Ñ“¼‘“µ‘“®‘“§‘“ ‘“™‘“’‘“‹‘“„‘“}‘“v‘“o‘“h‘“a‘“Z‘“S‘“L‘“E‘“>‘“7‘“0‘“)‘“"‘“‘“‘“ ‘“‘“ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ùŽ“òŽ“뎓䎓ÝŽ“ÖŽ“ÏŽ“ÈŽ“ÁŽ“ºŽ“³Ž“¬Ž“¥Ž“žŽ“—ޓޓ‰Ž“‚Ž“{Ž“tŽ“mŽ“fŽ“_Ž“XŽ“QŽ“JŽ“CŽ“<Ž“5Ž“.Ž“'Ž“ ޓޓޓ ޓޓý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““úŒ“óŒ“쌓匓ÞŒ“׌“ÐŒ“ÉŒ“ÂŒ“»Œ“´Œ“­Œ“¦Œ“ŸŒ“˜Œ“‘Œ“ŠŒ“ƒŒ“|Œ“uŒ“nŒ“gŒ“`Œ“YŒ“RŒ“KŒ“DŒ“=Œ“6Œ“/Œ“(Œ“!Œ“Œ“Œ“ Œ“Œ“þ‹“÷‹“ð‹“é‹“â‹“Û‹“Ô‹“Í‹“Æ‹“¿‹“¸‹“±‹“ª‹“£‹“œ‹“•‹“Ž‹“‡‹“€‹“y‹“r‹“k‹“d‹“]‹“V‹“O‹“H‹“A‹“:‹“3‹“,‹“%‹“‹“‹“‹“ ‹“‹“ûŠ“ôŠ“튓抓ߊ“ØŠ“ÑŠ“ÊŠ“Ê“¼Š“µŠ“®Š“§Š“ Š“™Š“’Š“‹Š“„Š“}Š“vŠ“oŠ“hŠ“aŠ“ZŠ“SŠ“LŠ“EŠ“>Š“7Š“0Š“)Š“"ГГГ ГГÿ‰“ø‰“ñ‰“ꉓ㉓܉“Õ‰“Ή“lj“À‰“¹‰“²‰“«‰“¤‰“‰“–‰“‰“ˆ‰“‰“z‰“s‰“l‰“e‰“^‰“W‰“P‰“I‰“B‰“;‰“4‰“-‰“&‰“‰“‰“‰“ ‰“‰“üˆ“õˆ“爓àˆ“Ùˆ“Òˆ“ˈ“Ĉ“½ˆ“¶ˆ“¯ˆ“¨ˆ“¡ˆ“šˆ““ˆ“Œˆ“…ˆ“~ˆ“wˆ“pˆ“iˆ“bˆ“[ˆ“Tˆ“Mˆ“Fˆ“?ˆ“8ˆ“1ˆ“*ˆ“#ˆ“ˆ“ˆ“ˆ“ˆ“ˆ“ù‡“ò‡“뇓䇓݇“Ö‡“χ“ȇ“Á‡“º‡“³‡“¬‡“¥‡“ž‡“—‡“‡“‰‡“‚‡“{‡“t‡“m‡“f‡“_‡“X‡“Q‡“J‡“C‡“<‡“5‡“.‡“'‡“ ‡“‡“‡“ ‡“‡“ý†“ö†“膓ᆓÚ†“Ó†“̆“ņ“¾†“·†“°†“©†“¢†“›†“”†“†“††“†“x†“q†“j†“c†“\†“U†“N†“G†“@†“9†“2†“+†“$†“†“†“†“†“†“ú…“ó…“ì…“å…“Þ…“×…“Ð…“É…“Â…“»…“´…“­…“¦…“Ÿ…“˜…“‘…“Š…“ƒ…“|…“u…“n…“g…“`…“Y…“R…“K…“D…“=…“6…“/…“(…“!…“…“…“ …“…“þ„“÷„“ð„“é„“â„“Û„“Ô„“Í„“Æ„“¿„“¸„“±„“ª„“£„“œ„“•„“Ž„“‡„“€„“y„“r„“k„“d„“]„“V„“O„“H„“A„“:„“3„“,„“%„“„“„“„“ „“„“ûƒ“ôƒ“탓惓߃“؃“у“ʃ“Ó¼ƒ“µƒ“®ƒ“§ƒ“ ƒ“™ƒ“’ƒ“‹ƒ“„ƒ“}ƒ“vƒ“oƒ“hƒ“aƒ“Zƒ“Sƒ“Lƒ“Eƒ“>ƒ“7ƒ“0ƒ“)ƒ“"ƒ“ƒ“ƒ“ ƒ“ƒ“ÿ‚“ø‚“ñ‚“ê‚“ã‚“Ü‚“Õ‚“΂“Ç‚“À‚“¹‚“²‚“«‚“¤‚“‚“–‚“‚“ˆ‚“‚“z‚“s‚“l‚“e‚“^‚“W‚“P‚“I‚“B‚“;‚“4‚“-‚“&‚“‚“‚“‚“ ‚“‚“ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù€“ò€“뀓䀓Ý€“Ö€“Ï€“È€“Á€“º€“³€“¬€“¥€“ž€“—€“€“‰€“‚€“{€“t€“m€“f€“_€“X€“Q€“J€“C€“<€“5€“.€“'€“ €“€“€“ €“€“ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú~“ó~“ì~“å~“Þ~“×~“Ð~“É~“Â~“»~“´~“­~“¦~“Ÿ~“˜~“‘~“Š~“ƒ~“|~“u~“n~“g~“`~“Y~“R~“K~“D~“=~“6~“/~“(~“!~“~“~“ ~“~“þ}“÷}“ð}“é}“â}“Û}“Ô}“Í}“Æ}“¿}“¸}“±}“ª}“£}“œ}“•}“Ž}“‡}“€}“y}“r}“k}“d}“]}“V}“O}“H}“A}“:}“3}“,}“%}“}“}“}“ }“}“û|“ô|“í|“æ|“ß|“Ø|“Ñ|“Ê|“Ã|“¼|“µ|“®|“§|“ |“™|“’|“‹|“„|“}|“v|“o|“h|“a|“Z|“S|“L|“E|“>|“7|“0|“)|“"|“|“|“ |“|“ÿ{“ø{“ñ{“ê{“ã{“Ü{“Õ{“Î{“Ç{“À{“¹{“²{“«{“¤{“{“–{“{“ˆ{“{“z{“s{“l{“e{“^{“W{“P{“I{“B{“;{“4{“-{“&{“{“{“{“ {“{“üz“õz“îz“çz“àz“Ùz“Òz“Ëz“Äz“½z“¶z“¯z“¨z“¡z“šz““z“Œz“…z“~z“wz“pz“iz“bz“[z“Tz“Mz“Fz“?z“8z“1z“*z“#z“z“z“z“z“z“ùy“òy“ëy“äy“Ýy“Öy“Ïy“Èy“Áy“ºy“³y“¬y“¥y“žy“—y“y“‰y“‚y“{y“ty“my“fy“_y“Xy“Qy“Jy“Cy“u“7u“0u“)u“"u“u“u“ u“u“ÿt“øt“ñt“êt“ãt“Üt“Õt“Ît“Çt“Àt“¹t“²t“«t“¤t“t“–t“t“ˆt“t“zt“st“lt“et“^t“Wt“Pt“It“Bt“;t“4t“-t“&t“t“t“t“ t“t“üs“õs“îs“çs“às“Ùs“Òs“Ës“Äs“½s“¶s“¯s“¨s“¡s“šs““s“Œs“…s“~s“ws“ps“is“bs“[s“Ts“Ms“Fs“?s“8s“1s“*s“#s“s“s“s“s“s“ùr“òr“ër“är“Ýr“Ör“Ïr“Èr“Ár“ºr“³r“¬r“¥r“žr“—r“r“‰r“‚r“{r“tr“mr“fr“_r“Xr“Qr“Jr“Cr“n“7n“0n“)n“"n“n“n“ n“n“ÿm“øm“ñm“êm“ãm“Üm“Õm“Îm“Çm“Àm“¹m“²m“«m“¤m“m“–m“m“ˆm“m“zm“sm“lm“em“^m“Wm“Pm“Im“Bm“;m“4m“-m“&m“m“m“m“ m“m“ül“õl“îl“çl“àl“Ùl“Òl“Ël“Äl“½l“¶l“¯l“¨l“¡l“šl““l“Œl“…l“~l“wl“pl“il“bl“[l“Tl“Ml“Fl“?l“8l“1l“*l“#l“l“l“l“l“l“ùk“òk“ëk“äk“Ýk“Ök“Ïk“Èk“Ák“ºk“³k“¬k“¥k“žk“—k“k“‰k“‚k“{k“tk“mk“fk“_k“Xk“Qk“Jk“Ck“g“7g“0g“)g“"g“g“g“ g“g“ÿf“øf“ñf“êf“ãf“Üf“Õf“Îf“Çf“Àf“¹f“²f“«f“¤f“f“–f“f“ˆf“f“zf“sf“lf“ef“^f“Wf“Pf“If“Bf“;f“4f“-f“&f“f“f“f“ f“f“üe“õe“îe“çe“àe“Ùe“Òe“Ëe“Äe“½e“¶e“¯e“¨e“¡e“še““e“Œe“…e“~e“we“pe“ie“be“[e“Te“Me“Fe“?e“8e“1e“*e“#e“e“e“e“e“e“ùd“òd“ëd“äd“Ýd“Öd“Ïd“Èd“Ád“ºd“³d“¬d“¥d“žd“—d“d“‰d“‚d“{d“td“md“fd“_d“Xd“Qd“Jd“Cd“`“7`“0`“)`“"`“`“`“ `“`“ÿ_“ø_“ñ_“ê_“ã_“Ü_“Õ_“Î_“Ç_“À_“¹_“²_“«_“¤_“_“–_“_“ˆ_“_“z_“s_“l_“e_“^_“W_“P_“I_“B_“;_“4_“-_“&_“_“_“_“ _“_“ü^“õ^“î^“ç^“à^“Ù^“Ò^“Ë^“Ä^“½^“¶^“¯^“¨^“¡^“š^““^“Œ^“…^“~^“w^“p^“i^“b^“[^“T^“M^“F^“?^“8^“1^“*^“#^“^“^“^“^“^“ù]“ò]“ë]“ä]“Ý]“Ö]“Ï]“È]“Á]“º]“³]“¬]“¥]“ž]“—]“]“‰]“‚]“{]“t]“m]“f]“_]“X]“Q]“J]“C]“<]“5]“.]“']“ ]“]“]“ ]“]“ý\“ö\“ï\“è\“á\“Ú\“Ó\“Ì\“Å\“¾\“·\“°\“©\“¢\“›\“”\“\“†\“\“x\“q\“j\“c\“\\“U\“N\“G\“@\“9\“2\“+\“$\“\“\“\“\“\“ú[“ó[“ì[“å[“Þ[“×[“Ð[“É[“Â[“»[“´[“­[“¦[“Ÿ[“˜[“‘[“Š[“ƒ[“|[“u[“n[“g[“`[“Y[“R[“K[“D[“=[“6[“/[“([“![“[“[“ [“[“þZ“÷Z“ðZ“éZ“âZ“ÛZ“ÔZ“ÍZ“ÆZ“¿Z“¸Z“±Z“ªZ“£Z“œZ“•Z“ŽZ“‡Z“€Z“yZ“rZ“kZ“dZ“]Z“VZ“OZ“HZ“AZ“:Z“3Z“,Z“%Z“Z“Z“Z“ Z“Z“ûY“ôY“íY“æY“ßY“ØY“ÑY“ÊY“ÃY“¼Y“µY“®Y“§Y“ Y“™Y“’Y“‹Y“„Y“}Y“vY“oY“hY“aY“ZY“SY“LY“EY“>Y“7Y“0Y“)Y“"Y“Y“Y“ Y“Y“ÿX“øX“ñX“êX“ãX“ÜX“ÕX“ÎX“ÇX“ÀX“¹X“²X“«X“¤X“X“–X“X“ˆX“X“zX“sX“lX“eX“^X“WX“PX“IX“BX“;X“4X“-X“&X“X“X“X“ X“X“üW“õW“îW“çW“àW“ÙW“ÒW“ËW“ÄW“½W“¶W“¯W“¨W“¡W“šW““W“ŒW“…W“~W“wW“pW“iW“bW“[W“TW“MW“FW“?W“8W“1W“*W“#W“W“W“W“W“W“ùV“òV“ëV“äV“ÝV“ÖV“ÏV“ÈV“ÁV“ºV“³V“¬V“¥V“žV“—V“V“‰V“‚V“{V“tV“mV“fV“_V“XV“QV“JV“CV“R“7R“0R“)R“"R“R“R“ R“R“ÿQ“øQ“ñQ“êQ“ãQ“ÜQ“ÕQ“ÎQ“ÇQ“ÀQ“¹Q“²Q“«Q“¤Q“Q“–Q“Q“ˆQ“Q“zQ“sQ“lQ“eQ“^Q“WQ“PQ“IQ“BQ“;Q“4Q“-Q“&Q“Q“Q“Q“ Q“Q“üP“õP“îP“çP“àP“ÙP“ÒP“ËP“ÄP“½P“¶P“¯P“¨P“¡P“šP““P“ŒP“…P“~P“wP“pP“iP“bP“[P“TP“MP“FP“?P“8P“1P“*P“#P“P“P“P“P“P“ùO“òO“ëO“äO“ÝO“ÖO“ÏO“ÈO“ÁO“ºO“³O“¬O“¥O“žO“—O“O“‰O“‚O“{O“tO“mO“fO“_O“XO“QO“JO“CO“K“7K“0K“)K“"K“K“K“ K“K“ÿJ“øJ“ñJ“êJ“ãJ“ÜJ“ÕJ“ÎJ“ÇJ“ÀJ“¹J“²J“«J“¤J“J“–J“J“ˆJ“J“zJ“sJ“lJ“eJ“^J“WJ“PJ“IJ“BJ“;J“4J“-J“&J“J“J“J“ J“J“üI“õI“îI“çI“àI“ÙI“ÒI“ËI“ÄI“½I“¶I“¯I“¨I“¡I“šI““I“ŒI“…I“~I“wI“pI“iI“bI“[I“TI“MI“FI“?I“8I“1I“*I“#I“I“I“I“I“I“ùH“òH“ëH“äH“ÝH“ÖH“ÏH“ÈH“ÁH“ºH“³H“¬H“¥H“žH“—H“H“‰H“‚H“{H“tH“mH“fH“_H“XH“QH“JH“CH“D“7D“0D“)D“"D“D“D“ D“D“ÿC“øC“ñC“êC“ãC“ÜC“ÕC“ÎC“ÇC“ÀC“¹C“²C“«C“¤C“C“–C“C“ˆC“C“zC“sC“lC“eC“^C“WC“PC“IC“BC“;C“4C“-C“&C“C“C“C“ C“C“üB“õB“îB“çB“àB“ÙB“ÒB“ËB“ÄB“½B“¶B“¯B“¨B“¡B“šB““B“ŒB“…B“~B“wB“pB“iB“bB“[B“TB“MB“FB“?B“8B“1B“*B“#B“B“B“B“B“B“ùA“òA“ëA“äA“ÝA“ÖA“ÏA“ÈA“ÁA“ºA“³A“¬A“¥A“žA“—A“A“‰A“‚A“{A“tA“mA“fA“_A“XA“QA“JA“CA““÷>“ð>“é>“â>“Û>“Ô>“Í>“Æ>“¿>“¸>“±>“ª>“£>“œ>“•>“Ž>“‡>“€>“y>“r>“k>“d>“]>“V>“O>“H>“A>“:>“3>“,>“%>“>“>“>“ >“>“û=“ô=“í=“æ=“ß=“Ø=“Ñ=“Ê=“Ã=“¼=“µ=“®=“§=“ =“™=“’=“‹=“„=“}=“v=“o=“h=“a=“Z=“S=“L=“E=“>=“7=“0=“)=“"=“=“=“ =“=“ÿ<“ø<“ñ<“ê<“ã<“Ü<“Õ<“Î<“Ç<“À<“¹<“²<“«<“¤<“<“–<“<“ˆ<“<“z<“s<“l<“e<“^<“W<“P<“I<“B<“;<“4<“-<“&<“<“<“<“ <“<“ü;“õ;“î;“ç;“à;“Ù;“Ò;“Ë;“Ä;“½;“¶;“¯;“¨;“¡;“š;““;“Œ;“…;“~;“w;“p;“i;“b;“[;“T;“M;“F;“?;“8;“1;“*;“#;“;“;“;“;“;“ù:“ò:“ë:“ä:“Ý:“Ö:“Ï:“È:“Á:“º:“³:“¬:“¥:“ž:“—:“:“‰:“‚:“{:“t:“m:“f:“_:“X:“Q:“J:“C:“<:“5:“.:“':“ :“:“:“ :“:“ý9“ö9“ï9“è9“á9“Ú9“Ó9“Ì9“Å9“¾9“·9“°9“©9“¢9“›9“”9“9“†9“9“x9“q9“j9“c9“\9“U9“N9“G9“@9“99“29“+9“$9“9“9“9“9“9“ú8“ó8“ì8“å8“Þ8“×8“Ð8“É8“Â8“»8“´8“­8“¦8“Ÿ8“˜8“‘8“Š8“ƒ8“|8“u8“n8“g8“`8“Y8“R8“K8“D8“=8“68“/8“(8“!8“8“8“ 8“8“þ7“÷7“ð7“é7“â7“Û7“Ô7“Í7“Æ7“¿7“¸7“±7“ª7“£7“œ7“•7“Ž7“‡7“€7“y7“r7“k7“d7“]7“V7“O7“H7“A7“:7“37“,7“%7“7“7“7“ 7“7“û6“ô6“í6“æ6“ß6“Ø6“Ñ6“Ê6“Ã6“¼6“µ6“®6“§6“ 6“™6“’6“‹6“„6“}6“v6“o6“h6“a6“Z6“S6“L6“E6“>6“76“06“)6“"6“6“6“ 6“6“ÿ5“ø5“ñ5“ê5“ã5“Ü5“Õ5“Î5“Ç5“À5“¹5“²5“«5“¤5“5“–5“5“ˆ5“5“z5“s5“l5“e5“^5“W5“P5“I5“B5“;5“45“-5“&5“5“5“5“ 5“5“ü4“õ4“î4“ç4“à4“Ù4“Ò4“Ë4“Ä4“½4“¶4“¯4“¨4“¡4“š4““4“Œ4“…4“~4“w4“p4“i4“b4“[4“T4“M4“F4“?4“84“14“*4“#4“4“4“4“4“4“ù3“ò3“ë3“ä3“Ý3“Ö3“Ï3“È3“Á3“º3“³3“¬3“¥3“ž3“—3“3“‰3“‚3“{3“t3“m3“f3“_3“X3“Q3“J3“C3“<3“53“.3“'3“ 3“3“3“ 3“3“ý2“ö2“ï2“è2“á2“Ú2“Ó2“Ì2“Å2“¾2“·2“°2“©2“¢2“›2“”2“2“†2“2“x2“q2“j2“c2“\2“U2“N2“G2“@2“92“22“+2“$2“2“2“2“2“2“ú1“ó1“ì1“å1“Þ1“×1“Ð1“É1“Â1“»1“´1“­1“¦1“Ÿ1“˜1“‘1“Š1“ƒ1“|1“u1“n1“g1“`1“Y1“R1“K1“D1“=1“61“/1“(1“!1“1“1“ 1“1“þ0“÷0“ð0“é0“â0“Û0“Ô0“Í0“Æ0“¿0“¸0“±0“ª0“£0“œ0“•0“Ž0“‡0“€0“y0“r0“k0“d0“]0“V0“O0“H0“A0“:0“30“,0“%0“0“0“0“ 0“0“û/“ô/“í/“æ/“ß/“Ø/“Ñ/“Ê/“Ã/“¼/“µ/“®/“§/“ /“™/“’/“‹/“„/“}/“v/“o/“h/“a/“Z/“S/“L/“E/“>/“7/“0/“)/“"/“/“/“ /“/“ÿ.“ø.“ñ.“ê.“ã.“Ü.“Õ.“Î.“Ç.“À.“¹.“².“«.“¤.“.“–.“.“ˆ.“.“z.“s.“l.“e.“^.“W.“P.“I.“B.“;.“4.“-.“&.“.“.“.“ .“.“ü-“õ-“î-“ç-“à-“Ù-“Ò-“Ë-“Ä-“½-“¶-“¯-“¨-“¡-“š-““-“Œ-“…-“~-“w-“p-“i-“b-“[-“T-“M-“F-“?-“8-“1-“*-“#-“-“-“-“-“-“ù,“ò,“ë,“ä,“Ý,“Ö,“Ï,“È,“Á,“º,“³,“¬,“¥,“ž,“—,“,“‰,“‚,“{,“t,“m,“f,“_,“X,“Q,“J,“C,“<,“5,“.,“',“ ,“,“,“ ,“,“ý+“ö+“ï+“è+“á+“Ú+“Ó+“Ì+“Å+“¾+“·+“°+“©+“¢+“›+“”+“+“†+“+“x+“q+“j+“c+“\+“U+“N+“G+“@+“9+“2+“++“$+“+“+“+“+“+“ú*“ó*“ì*“å*“Þ*“×*“Ð*“É*“Â*“»*“´*“­*“¦*“Ÿ*“˜*“‘*“Š*“ƒ*“|*“u*“n*“g*“`*“Y*“R*“K*“D*“=*“6*“/*“(*“!*“*“*“ *“*“þ)“÷)“ð)“é)“â)“Û)“Ô)“Í)“Æ)“¿)“¸)“±)“ª)“£)“œ)“•)“Ž)“‡)“€)“y)“r)“k)“d)“])“V)“O)“H)“A)“:)“3)“,)“%)“)“)“)“ )“)“û(“ô(“í(“æ(“ß(“Ø(“Ñ(“Ê(“Ã(“¼(“µ(“®(“§(“ (“™(“’(“‹(“„(“}(“v(“o(“h(“a(“Z(“S(“L(“E(“>(“7(“0(“)(“"(“(“(“ (“(“ÿ'“ø'“ñ'“ê'“ã'“Ü'“Õ'“Î'“Ç'“À'“¹'“²'“«'“¤'“'“–'“'“ˆ'“'“z'“s'“l'“e'“^'“W'“P'“I'“B'“;'“4'“-'“&'“'“'“'“ '“'“ü&“õ&“î&“ç&“à&“Ù&“Ò&“Ë&“Ä&“½&“¶&“¯&“¨&“¡&“š&““&“Œ&“…&“~&“w&“p&“i&“b&“[&“T&“M&“F&“?&“8&“1&“*&“#&“&“&“&“&“&“ù%“ò%“ë%“ä%“Ý%“Ö%“Ï%“È%“Á%“º%“³%“¬%“¥%“ž%“—%“%“‰%“‚%“{%“t%“m%“f%“_%“X%“Q%“J%“C%“<%“5%“.%“'%“ %“%“%“ %“%“ý$“ö$“ï$“è$“á$“Ú$“Ó$“Ì$“Å$“¾$“·$“°$“©$“¢$“›$“”$“$“†$“$“x$“q$“j$“c$“\$“U$“N$“G$“@$“9$“2$“+$“$$“$“$“$“$“$“ú#“ó#“ì#“å#“Þ#“×#“Ð#“É#“Â#“»#“´#“­#“¦#“Ÿ#“˜#“‘#“Š#“ƒ#“|#“u#“n#“g#“`#“Y#“R#“K#“D#“=#“6#“/#“(#“!#“#“#“ #“#“þ"“÷"“ð"“é"“â"“Û"“Ô"“Í"“Æ"“¿"“¸"“±"“ª"“£"“œ"“•"“Ž"“‡"“€"“y"“r"“k"“d"“]"“V"“O"“H"“A"“:"“3"“,"“%"“"“"“"“ "“"“û!“ô!“í!“æ!“ß!“Ø!“Ñ!“Ê!“Ã!“¼!“µ!“®!“§!“ !“™!“’!“‹!“„!“}!“v!“o!“h!“a!“Z!“S!“L!“E!“>!“7!“0!“)!“"!“!“!“ !“!“ÿ “ø “ñ “ê “ã “Ü “Õ “Î “Ç “À “¹ “² “« “¤ “ “– “ “ˆ “ “z “s “l “e “^ “W “P “I “B “; “4 “- “& “ “ “ “ “ “ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú“ó“ì“å“ޓדГɓ“»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û“ô“í“æ“ߓؓѓʓÓ¼“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ“ø“ñ“ê“ã“ܓՓΓǓÀ“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú“ó“ì“å“ޓדГɓ“»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û“ô“í“æ“ߓؓѓʓÓ¼“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ“ø“ñ“ê“ã“ܓՓΓǓÀ“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú“ó“ì“å“ޓדГɓ“»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ “÷ “ð “é “â “Û “Ô “Í “Æ “¿ “¸ “± “ª “£ “œ “• “Ž “‡ “€ “y “r “k “d “] “V “O “H “A “: “3 “, “% “ “ “ “ “ “û “ô “í “æ “ß “Ø “Ñ “Ê “à “¼ “µ “® “§ “  “™ “’ “‹ “„ “} “v “o “h “a “Z “S “L “E “> “7 “0 “) “" “ “ “ “ “ÿ “ø “ñ “ê “ã “Ü “Õ “Î “Ç “À “¹ “² “« “¤ “ “– “ “ˆ “ “z “s “l “e “^ “W “P “I “B “; “4 “- “& “ “ “ “ “ “ü “õ “î “ç “à “Ù “Ò “Ë “Ä “½ “¶ “¯ “¨ “¡ “š ““ “Œ “… “~ “w “p “i “b “[ “T “M “F “? “8 “1 “* “# “ “ “ “ “ “ù “ò “ë “ä “Ý “Ö “Ï “È “Á “º “³ “¬ “¥ “ž “— “ “‰ “‚ “{ “t “m “f “_ “X “Q “J “C “< “5 “. “' “ “ “ “ “ “ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú“ó“ì“å“ޓדГɓ“»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û“ô“í“æ“ߓؓѓʓÓ¼“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ“ø“ñ“ê“ã“ܓՓΓǓÀ“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þÿ’÷ÿ’ðÿ’éÿ’âÿ’Ûÿ’Ôÿ’Íÿ’Æÿ’¿ÿ’¸ÿ’±ÿ’ªÿ’£ÿ’œÿ’•ÿ’Žÿ’‡ÿ’€ÿ’yÿ’rÿ’kÿ’dÿ’]ÿ’Vÿ’Oÿ’Hÿ’Aÿ’:ÿ’3ÿ’,ÿ’%ÿ’ÿ’ÿ’ÿ’ ÿ’ÿ’ûþ’ôþ’íþ’æþ’ßþ’Øþ’Ñþ’Êþ’Ãþ’¼þ’µþ’®þ’§þ’ þ’™þ’’þ’‹þ’„þ’}þ’vþ’oþ’hþ’aþ’Zþ’Sþ’Lþ’Eþ’>þ’7þ’0þ’)þ’"þ’þ’þ’ þ’þ’ÿý’øý’ñý’êý’ãý’Üý’Õý’Îý’Çý’Àý’¹ý’²ý’«ý’¤ý’ý’–ý’ý’ˆý’ý’zý’sý’lý’eý’^ý’Wý’Pý’Iý’Bý’;ý’4ý’-ý’&ý’ý’ý’ý’ ý’ý’üü’õü’îü’çü’àü’Ùü’Òü’Ëü’Äü’½ü’¶ü’¯ü’¨ü’¡ü’šü’“ü’Œü’…ü’~ü’wü’pü’iü’bü’[ü’Tü’Mü’Fü’?ü’8ü’1ü’*ü’#ü’ü’ü’ü’ü’ü’ùû’òû’ëû’äû’Ýû’Öû’Ïû’Èû’Áû’ºû’³û’¬û’¥û’žû’—û’û’‰û’‚û’{û’tû’mû’fû’_û’Xû’Qû’Jû’Cû’<û’5û’.û’'û’ û’û’û’ û’û’ýú’öú’ïú’èú’áú’Úú’Óú’Ìú’Åú’¾ú’·ú’°ú’©ú’¢ú’›ú’”ú’ú’†ú’ú’xú’qú’jú’cú’\ú’Uú’Nú’Gú’@ú’9ú’2ú’+ú’$ú’ú’ú’ú’ú’ú’úù’óù’ìù’åù’Þù’×ù’Ðù’Éù’Âù’»ù’´ù’­ù’¦ù’Ÿù’˜ù’‘ù’Šù’ƒù’|ù’uù’nù’gù’`ù’Yù’Rù’Kù’Dù’=ù’6ù’/ù’(ù’!ù’ù’ù’ ù’ù’þø’÷ø’ðø’éø’âø’Ûø’Ôø’Íø’Æø’¿ø’¸ø’±ø’ªø’£ø’œø’•ø’Žø’‡ø’€ø’yø’rø’kø’dø’]ø’Vø’Oø’Hø’Aø’:ø’3ø’,ø’%ø’ø’ø’ø’ ø’ø’û÷’ô÷’í÷’æ÷’ß÷’Ø÷’Ñ÷’Ê÷’Ã÷’¼÷’µ÷’®÷’§÷’ ÷’™÷’’÷’‹÷’„÷’}÷’v÷’o÷’h÷’a÷’Z÷’S÷’L÷’E÷’>÷’7÷’0÷’)÷’"÷’÷’÷’ ÷’÷’ÿö’øö’ñö’êö’ãö’Üö’Õö’Îö’Çö’Àö’¹ö’²ö’«ö’¤ö’ö’–ö’ö’ˆö’ö’zö’sö’lö’eö’^ö’Wö’Pö’Iö’Bö’;ö’4ö’-ö’&ö’ö’ö’ö’ ö’ö’üõ’õõ’îõ’çõ’àõ’Ùõ’Òõ’Ëõ’Äõ’½õ’¶õ’¯õ’¨õ’¡õ’šõ’“õ’Œõ’…õ’~õ’wõ’põ’iõ’bõ’[õ’Tõ’Mõ’Fõ’?õ’8õ’1õ’*õ’#õ’õ’õ’õ’õ’õ’ùô’òô’ëô’äô’Ýô’Öô’Ïô’Èô’Áô’ºô’³ô’¬ô’¥ô’žô’—ô’ô’‰ô’‚ô’{ô’tô’mô’fô’_ô’Xô’Qô’Jô’Cô’<ô’5ô’.ô’'ô’ ô’ô’ô’ ô’ô’ýó’öó’ïó’èó’áó’Úó’Óó’Ìó’Åó’¾ó’·ó’°ó’©ó’¢ó’›ó’”ó’ó’†ó’ó’xó’qó’jó’có’\ó’Uó’Nó’Gó’@ó’9ó’2ó’+ó’$ó’ó’ó’ó’ó’ó’úò’óò’ìò’åò’Þò’×ò’Ðò’Éò’Âò’»ò’´ò’­ò’¦ò’Ÿò’˜ò’‘ò’Šò’ƒò’|ò’uò’nò’gò’`ò’Yò’Rò’Kò’Dò’=ò’6ò’/ò’(ò’!ò’ò’ò’ ò’ò’þñ’÷ñ’ðñ’éñ’âñ’Ûñ’Ôñ’Íñ’Æñ’¿ñ’¸ñ’±ñ’ªñ’£ñ’œñ’•ñ’Žñ’‡ñ’€ñ’yñ’rñ’kñ’dñ’]ñ’Vñ’Oñ’Hñ’Añ’:ñ’3ñ’,ñ’%ñ’ñ’ñ’ñ’ ñ’ñ’ûð’ôð’íð’æð’ßð’Øð’Ñð’Êð’Ãð’¼ð’µð’®ð’§ð’ ð’™ð’’ð’‹ð’„ð’}ð’vð’oð’hð’að’Zð’Sð’Lð’Eð’>ð’7ð’0ð’)ð’"ð’ð’ð’ ð’ð’ÿï’øï’ñï’êï’ãï’Üï’Õï’Îï’Çï’Àï’ï’–ï’ï’ˆï’ï’zï’sï’lï’eï’^ï’Wï’Pï’Iï’Bï’;ï’4ï’-ï’&ï’ï’ï’ï’ ï’ï’üî’õî’îî’çî’àî’Ùî’Òî’Ëî’Äî’~î’wî’pî’iî’bî’[î’Tî’Mî’Fî’?î’8î’1î’*î’#î’î’î’î’î’î’ùí’òí’ëí’äí’Ýí’Öí’Ïí’Èí’Á풺풳풬풥풞풗í’풉풂í’{í’tí’mí’fí’_í’Xí’Qí’Jí’Cí’<í’5í’.í’'í’ í’í’í’ í’í’ýì’öì’ïì’èì’áì’Úì’Óì’Ìì’Å쒾쒷쒰쒩쒢쒛쒔ì’ì’†ì’ì’xì’qì’jì’cì’\ì’Uì’Nì’Gì’@ì’9ì’2ì’+ì’$ì’ì’ì’ì’ì’ì’úë’óë’ìë’åë’Þë’×ë’Ðë’Éë’Â뒻뒴뒭뒦뒟뒘뒑뒊뒃ë’|ë’uë’në’gë’`ë’Yë’Rë’Kë’Dë’=ë’6ë’/ë’(ë’!ë’ë’ë’ ë’ë’þê’÷ê’ðê’éê’âê’Ûê’Ôê’Íê’Æê’¿ê’¸ê’±ê’ªê’£ê’œê’•ê’Žê’‡ê’€ê’yê’rê’kê’dê’]ê’Vê’Oê’Hê’Aê’:ê’3ê’,ê’%ê’ê’ê’ê’ ê’ê’ûé’ôé’íé’æé’ßé’Øé’Ñé’Êé’Ã钼钵钮钧钠钙钒钋钄é’}é’vé’oé’hé’aé’Zé’Sé’Lé’Eé’>é’7é’0é’)é’"é’é’é’ é’é’ÿè’øè’ñè’êè’ãè’Üè’Õè’Îè’Çè’À蒹蒲蒫蒤è’è’–è’è’ˆè’è’zè’sè’lè’eè’^è’Wè’Pè’Iè’Bè’;è’4è’-è’&è’è’è’è’ è’è’üç’õç’îç’çç’àç’Ùç’Òç’Ëç’Ä璽璶璯璨璡璚璓璌璅ç’~ç’wç’pç’iç’bç’[ç’Tç’Mç’Fç’?ç’8ç’1ç’*ç’#ç’ç’ç’ç’ç’ç’ùæ’òæ’ëæ’äæ’Ýæ’Öæ’Ïæ’Èæ’Áæ’ºæ’³æ’¬æ’¥æ’žæ’—æ’æ’‰æ’‚æ’{æ’tæ’mæ’fæ’_æ’Xæ’Qæ’Jæ’Cæ’<æ’5æ’.æ’'æ’ æ’æ’æ’ æ’æ’ýå’öå’ïå’èå’áå’Úå’Óå’Ìå’Å咾咷咰咩咢咛咔å’å’†å’å’xå’qå’jå’cå’\å’Uå’Nå’Gå’@å’9å’2å’+å’$å’å’å’å’å’å’úä’óä’ìä’åä’Þä’×ä’Ðä’Éä’Â䒻䒴䒭䒦䒟䒘䒑䒊䒃ä’|ä’uä’nä’gä’`ä’Yä’Rä’Kä’Dä’=ä’6ä’/ä’(ä’!ä’ä’ä’ ä’ä’þã’÷ã’ðã’éã’âã’Ûã’Ôã’Íã’Æã’¿ã’¸ã’±ã’ªã’£ã’œã’•ã’Žã’‡ã’€ã’yã’rã’kã’dã’]ã’Vã’Oã’Hã’Aã’:ã’3ã’,ã’%ã’ã’ã’ã’ ã’ã’ûâ’ôâ’íâ’æâ’ßâ’Øâ’Ñâ’Êâ’ÃⒼ⒵⒮⒧⒠⒙⒒⒋⒄â’}â’vâ’oâ’hâ’aâ’Zâ’Sâ’Lâ’Eâ’>â’7â’0â’)â’"â’â’â’ â’â’ÿá’øá’ñá’êá’ãá’Üá’Õá’Îá’Çá’Àᒹᒲᒫᒤá’á’–á’á’ˆá’á’zá’sá’lá’eá’^á’Wá’Pá’Iá’Bá’;á’4á’-á’&á’á’á’á’ á’á’üà’õà’îà’çà’àà’Ùà’Òà’Ëà’Äà’½à’¶à’¯à’¨à’¡à’šà’“à’Œà’…à’~à’wà’pà’ià’bà’[à’Tà’Mà’Fà’?à’8à’1à’*à’#à’à’à’à’à’à’ùß’òß’ëß’äß’Ýß’Öß’Ïß’Èß’Áß’ºß’³ß’¬ß’¥ß’žß’—ß’ß’‰ß’‚ß’{ß’tß’mß’fß’_ß’Xß’Qß’Jß’Cß’<ß’5ß’.ß’'ß’ ß’ß’ß’ ß’ß’ýÞ’öÞ’ïÞ’èÞ’áÞ’ÚÞ’ÓÞ’ÌÞ’ÅÞ’¾Þ’·Þ’°Þ’©Þ’¢Þ’›Þ’”Þ’Þ’†Þ’Þ’xÞ’qÞ’jÞ’cÞ’\Þ’UÞ’NÞ’GÞ’@Þ’9Þ’2Þ’+Þ’$Þ’Þ’Þ’Þ’Þ’Þ’úÝ’óÝ’ìÝ’åÝ’ÞÝ’×Ý’ÐÝ’ÉÝ’ÂÝ’»Ý’´Ý’­Ý’¦Ý’ŸÝ’˜Ý’‘Ý’ŠÝ’ƒÝ’|Ý’uÝ’nÝ’gÝ’`Ý’YÝ’RÝ’KÝ’DÝ’=Ý’6Ý’/Ý’(Ý’!Ý’Ý’Ý’ Ý’Ý’þÜ’÷Ü’ðÜ’éÜ’âÜ’ÛÜ’ÔÜ’ÍÜ’ÆÜ’¿Ü’¸Ü’±Ü’ªÜ’£Ü’œÜ’•Ü’ŽÜ’‡Ü’€Ü’yÜ’rÜ’kÜ’dÜ’]Ü’VÜ’OÜ’HÜ’AÜ’:Ü’3Ü’,Ü’%Ü’Ü’Ü’Ü’ Ü’Ü’ûÛ’ôÛ’íÛ’æÛ’ßÛ’ØÛ’ÑÛ’ÊÛ’ÃÛ’¼Û’µÛ’®Û’§Û’ Û’™Û’’Û’‹Û’„Û’}Û’vÛ’oÛ’hÛ’aÛ’ZÛ’SÛ’LÛ’EÛ’>Û’7Û’0Û’)Û’"Û’Û’Û’ Û’Û’ÿÚ’øÚ’ñÚ’êÚ’ãÚ’ÜÚ’ÕÚ’ÎÚ’ÇÚ’ÀÚ’¹Ú’²Ú’«Ú’¤Ú’Ú’–Ú’Ú’ˆÚ’Ú’zÚ’sÚ’lÚ’eÚ’^Ú’WÚ’PÚ’IÚ’BÚ’;Ú’4Ú’-Ú’&Ú’Ú’Ú’Ú’ Ú’Ú’üÙ’õÙ’îÙ’çÙ’àÙ’ÙÙ’ÒÙ’ËÙ’ÄÙ’½Ù’¶Ù’¯Ù’¨Ù’¡Ù’šÙ’“Ù’ŒÙ’…Ù’~Ù’wÙ’pÙ’iÙ’bÙ’[Ù’TÙ’MÙ’FÙ’?Ù’8Ù’1Ù’*Ù’#ْْْْْْùØ’òØ’ëØ’䨒ÝØ’ÖØ’ÏØ’ÈØ’ÁØ’ºØ’³Ø’¬Ø’¥Ø’žØ’—ؒؒ‰Ø’‚Ø’{Ø’tØ’mØ’fØ’_Ø’XØ’QØ’JØ’CØ’<Ø’5Ø’.Ø’'Ø’ ؒؒؒ ؒؒý×’ö×’ï×’è×’á×’Ú×’Ó×’Ì×’Å×’¾×’·×’°×’©×’¢×’›×’”×’×’†×’×’x×’q×’j×’c×’\×’U×’N×’G×’@×’9×’2×’+×’$×’×’×’×’×’×’úÖ’óÖ’ìÖ’åÖ’ÞÖ’×Ö’ÐÖ’ÉÖ’ÂÖ’»Ö’´Ö’­Ö’¦Ö’ŸÖ’˜Ö’‘Ö’ŠÖ’ƒÖ’|Ö’uÖ’nÖ’gÖ’`Ö’YÖ’RÖ’KÖ’DÖ’=Ö’6Ö’/Ö’(Ö’!Ö’Ö’Ö’ Ö’Ö’þÕ’÷Õ’ðÕ’éÕ’âÕ’ÛÕ’ÔÕ’ÍÕ’ÆÕ’¿Õ’¸Õ’±Õ’ªÕ’£Õ’œÕ’•Õ’ŽÕ’‡Õ’€Õ’yÕ’rÕ’kÕ’dÕ’]Õ’VÕ’OÕ’HÕ’AÕ’:Õ’3Õ’,Õ’%Õ’Õ’Õ’Õ’ Õ’Õ’ûÔ’ôÔ’íÔ’æÔ’ßÔ’ØÔ’ÑÔ’ÊÔ’ÃÔ’¼Ô’µÔ’®Ô’§Ô’ Ô’™Ô’’Ô’‹Ô’„Ô’}Ô’vÔ’oÔ’hÔ’aÔ’ZÔ’SÔ’LÔ’EÔ’>Ô’7Ô’0Ô’)Ô’"Ô’Ô’Ô’ Ô’Ô’ÿÓ’øÓ’ñÓ’êÓ’ãÓ’ÜÓ’ÕÓ’ÎÓ’ÇÓ’ÀÓ’¹Ó’²Ó’«Ó’¤Ó’Ó’–Ó’Ó’ˆÓ’Ó’zÓ’sÓ’lÓ’eÓ’^Ó’WÓ’PÓ’IÓ’BÓ’;Ó’4Ó’-Ó’&Ó’Ó’Ó’Ó’ Ó’Ó’üÒ’õÒ’îÒ’çÒ’àÒ’ÙÒ’ÒÒ’ËÒ’ÄÒ’½Ò’¶Ò’¯Ò’¨Ò’¡Ò’šÒ’“Ò’ŒÒ’…Ò’~Ò’wÒ’pÒ’iÒ’bÒ’[Ò’TÒ’MÒ’FÒ’?Ò’8Ò’1Ò’*Ò’#Ò’Ò’Ò’Ò’Ò’Ò’ùÑ’òÑ’ëÑ’äÑ’ÝÑ’ÖÑ’ÏÑ’ÈÑ’ÁÑ’ºÑ’³Ñ’¬Ñ’¥Ñ’žÑ’—Ñ’Ñ’‰Ñ’‚Ñ’{Ñ’tÑ’mÑ’fÑ’_Ñ’XÑ’QÑ’JÑ’CÑ’<Ñ’5Ñ’.Ñ’'Ñ’ Ñ’Ñ’Ñ’ Ñ’Ñ’ýÐ’öÐ’ïÐ’èÐ’áÐ’ÚÐ’ÓÐ’ÌÐ’ÅÐ’¾Ð’·Ð’°Ð’©Ð’¢Ð’›Ð’”Ð’Ð’†Ð’Ð’xÐ’qÐ’jÐ’cÐ’\Ð’UÐ’NÐ’GÐ’@Ð’9Ð’2Ð’+Ð’$Ð’Ð’Ð’Ð’Ð’Ð’úÏ’óÏ’ìÏ’åÏ’ÞÏ’×Ï’ÐÏ’ÉÏ’ÂÏ’»Ï’´Ï’­Ï’¦Ï’ŸÏ’˜Ï’‘Ï’ŠÏ’ƒÏ’|Ï’uÏ’nÏ’gÏ’`Ï’YÏ’RÏ’KÏ’DÏ’=Ï’6Ï’/Ï’(Ï’!Ï’Ï’Ï’ Ï’Ï’þÎ’÷Î’ðÎ’éÎ’âÎ’ÛÎ’ÔÎ’ÍÎ’ÆÎ’¿Î’¸Î’±Î’ªÎ’£Î’œÎ’•Î’ŽÎ’‡Î’€Î’yÎ’rÎ’kÎ’dÎ’]Î’VÎ’OÎ’HÎ’AÎ’:Î’3Î’,Î’%Î’Î’Î’Î’ Î’Î’ûÍ’ôÍ’íÍ’æÍ’ßÍ’ØÍ’ÑÍ’ÊÍ’ÃÍ’¼Í’µÍ’®Í’§Í’ Í’™Í’’Í’‹Í’„Í’}Í’vÍ’oÍ’hÍ’aÍ’ZÍ’SÍ’LÍ’EÍ’>Í’7Í’0Í’)Í’"Í’Í’Í’ Í’Í’ÿÌ’øÌ’ñÌ’êÌ’ãÌ’ÜÌ’ÕÌ’ÎÌ’ÇÌ’ÀÌ’¹Ì’²Ì’«Ì’¤Ì’Ì’–Ì’Ì’ˆÌ’Ì’zÌ’sÌ’lÌ’eÌ’^Ì’WÌ’PÌ’IÌ’BÌ’;Ì’4Ì’-Ì’&Ì’Ì’Ì’Ì’ Ì’Ì’üË’õË’îË’çË’àË’ÙË’ÒË’ËË’ÄË’½Ë’¶Ë’¯Ë’¨Ë’¡Ë’šË’“Ë’ŒË’…Ë’~Ë’wË’pË’iË’bË’[Ë’TË’MË’FË’?Ë’8Ë’1Ë’*Ë’#Ë’Ë’Ë’Ë’Ë’Ë’ùÊ’òÊ’ëÊ’äÊ’ÝÊ’ÖÊ’ÏÊ’ÈÊ’ÁÊ’ºÊ’³Ê’¬Ê’¥Ê’žÊ’—Ê’Ê’‰Ê’‚Ê’{Ê’tÊ’mÊ’fÊ’_Ê’XÊ’QÊ’JÊ’CÊ’<Ê’5Ê’.Ê’'Ê’ Ê’Ê’Ê’ Ê’Ê’ýÉ’öÉ’ïÉ’èÉ’áÉ’ÚÉ’ÓÉ’ÌÉ’ÅÉ’¾É’·É’°É’©É’¢É’›É’”É’É’†É’É’xÉ’qÉ’jÉ’cÉ’\É’UÉ’NÉ’GÉ’@É’9É’2É’+É’$É’É’É’É’É’É’úÈ’óÈ’ìÈ’åÈ’ÞÈ’×È’ÐÈ’ÉÈ’ÂÈ’»È’´È’­È’¦È’ŸÈ’˜È’‘È’ŠÈ’ƒÈ’|È’uÈ’nÈ’gÈ’`È’YÈ’RÈ’KÈ’DÈ’=È’6È’/È’(È’!È’È’È’ È’È’þÇ’÷Ç’ðÇ’éÇ’âÇ’ÛÇ’ÔÇ’ÍÇ’ÆÇ’¿Ç’¸Ç’±Ç’ªÇ’£Ç’œÇ’•Ç’ŽÇ’‡Ç’€Ç’yÇ’rÇ’kÇ’dÇ’]Ç’VÇ’OÇ’HÇ’AÇ’:Ç’3Ç’,Ç’%Ç’Ç’Ç’Ç’ Ç’Ç’ûÆ’ôÆ’íÆ’æÆ’߯’ØÆ’ÑÆ’ÊÆ’ÃÆ’¼Æ’µÆ’®Æ’§Æ’ Æ’™Æ’’Æ’‹Æ’„Æ’}Æ’vÆ’oÆ’hÆ’aÆ’ZÆ’SÆ’LÆ’EÆ’>Æ’7Æ’0Æ’)Æ’"Æ’Æ’Æ’ Æ’Æ’ÿÅ’øÅ’ñÅ’êÅ’ãÅ’ÜÅ’ÕÅ’ÎÅ’ÇÅ’ÀÅ’¹Å’²Å’«Å’¤Å’Å’–Å’Å’ˆÅ’Å’zÅ’sÅ’lÅ’eÅ’^Å’WÅ’PÅ’IÅ’BÅ’;Å’4Å’-Å’&Å’Å’Å’Å’ Å’Å’üÄ’õÄ’îÄ’çÄ’àÄ’ÙÄ’ÒÄ’ËÄ’ÄÄ’½Ä’¶Ä’¯Ä’¨Ä’¡Ä’šÄ’“Ä’ŒÄ’…Ä’~Ä’wÄ’pÄ’iÄ’bÄ’[Ä’TÄ’MÄ’FÄ’?Ä’8Ä’1Ä’*Ä’#Ä’Ä’Ä’Ä’Ä’Ä’ùÃ’òÃ’ëÃ’äÃ’ÝÃ’ÖÃ’ÏÃ’ÈÃ’ÁÃ’ºÃ’³Ã’¬Ã’¥Ã’žÃ’—Ã’Ã’‰Ã’‚Ã’{Ã’tÃ’mÃ’fÃ’_Ã’XÃ’QÃ’JÃ’CÃ’<Ã’5Ã’.Ã’'Ã’ Ã’Ã’Ã’ Ã’Ã’ýÂ’öÂ’ïÂ’èÂ’áÂ’ÚÂ’ÓÂ’ÌÂ’ÅÂ’¾Â’·Â’°Â’©Â’¢Â’›Â’”Â’Â’†Â’Â’xÂ’qÂ’jÂ’cÂ’\Â’UÂ’NÂ’GÂ’@Â’9Â’2Â’+Â’$Â’Â’Â’Â’Â’Â’úÁ’óÁ’ìÁ’åÁ’ÞÁ’×Á’ÐÁ’ÉÁ’ÂÁ’»Á’´Á’­Á’¦Á’ŸÁ’˜Á’‘Á’ŠÁ’ƒÁ’|Á’uÁ’nÁ’gÁ’`Á’YÁ’RÁ’KÁ’DÁ’=Á’6Á’/Á’(Á’!Á’Á’Á’ Á’Á’þÀ’÷À’ðÀ’éÀ’âÀ’ÛÀ’ÔÀ’ÍÀ’ÆÀ’¿À’¸À’±À’ªÀ’£À’œÀ’•À’ŽÀ’‡À’€À’yÀ’rÀ’kÀ’dÀ’]À’VÀ’OÀ’HÀ’AÀ’:À’3À’,À’%À’À’À’À’ À’À’û¿’ô¿’í¿’æ¿’ß¿’Ø¿’Ñ¿’Ê¿’ÿ’¼¿’µ¿’®¿’§¿’ ¿’™¿’’¿’‹¿’„¿’}¿’v¿’o¿’h¿’a¿’Z¿’S¿’L¿’E¿’>¿’7¿’0¿’)¿’"¿’¿’¿’ ¿’¿’ÿ¾’ø¾’ñ¾’ê¾’ã¾’ܾ’Õ¾’ξ’Ǿ’À¾’¹¾’²¾’«¾’¤¾’¾’–¾’¾’ˆ¾’¾’z¾’s¾’l¾’e¾’^¾’W¾’P¾’I¾’B¾’;¾’4¾’-¾’&¾’¾’¾’¾’ ¾’¾’ü½’õ½’î½’ç½’དྷÙ½’Ò½’˽’Ľ’½½’¶½’¯½’¨½’¡½’š½’“½’Œ½’…½’~½’w½’p½’i½’b½’[½’T½’M½’F½’?½’8½’1½’*½’#½’½’½’½’½’½’ù¼’ò¼’ë¼’ä¼’ݼ’Ö¼’ϼ’ȼ’Á¼’º¼’³¼’¬¼’¥¼’ž¼’—¼’¼’‰¼’‚¼’{¼’t¼’m¼’f¼’_¼’X¼’Q¼’J¼’C¼’<¼’5¼’.¼’'¼’ ¼’¼’¼’ ¼’¼’ý»’ö»’ï»’è»’á»’Ú»’Ó»’Ì»’Å»’¾»’·»’°»’©»’¢»’›»’”»’»’†»’»’x»’q»’j»’c»’\»’U»’N»’G»’@»’9»’2»’+»’$»’»’»’»’»’»’úº’óº’캒庒Þº’׺’к’ɺ’º’»º’´º’­º’¦º’Ÿº’˜º’‘º’Šº’ƒº’|º’uº’nº’gº’`º’Yº’Rº’Kº’Dº’=º’6º’/º’(º’!º’º’º’ º’º’þ¹’÷¹’ð¹’é¹’â¹’Û¹’Ô¹’͹’ƹ’¿¹’¸¹’±¹’ª¹’£¹’œ¹’•¹’޹’‡¹’€¹’y¹’r¹’k¹’d¹’]¹’V¹’O¹’H¹’A¹’:¹’3¹’,¹’%¹’¹’¹’¹’ ¹’¹’û¸’ô¸’í¸’渒߸’ظ’Ѹ’ʸ’ø’¼¸’µ¸’®¸’§¸’ ¸’™¸’’¸’‹¸’„¸’}¸’v¸’o¸’h¸’a¸’Z¸’S¸’L¸’E¸’>¸’7¸’0¸’)¸’"¸’¸’¸’ ¸’¸’ÿ·’ø·’ñ·’ê·’ã·’Ü·’Õ·’η’Ç·’À·’¹·’²·’«·’¤·’·’–·’·’ˆ·’·’z·’s·’l·’e·’^·’W·’P·’I·’B·’;·’4·’-·’&·’·’·’·’ ·’·’ü¶’õ¶’î¶’ç¶’à¶’Ù¶’Ò¶’˶’Ķ’½¶’¶¶’¯¶’¨¶’¡¶’š¶’“¶’Œ¶’…¶’~¶’w¶’p¶’i¶’b¶’[¶’T¶’M¶’F¶’?¶’8¶’1¶’*¶’#¶’¶’¶’¶’¶’¶’ùµ’òµ’ëµ’äµ’ݵ’Öµ’ϵ’ȵ’Áµ’ºµ’³µ’¬µ’¥µ’žµ’—µ’µ’‰µ’‚µ’{µ’tµ’mµ’fµ’_µ’Xµ’Qµ’Jµ’Cµ’<µ’5µ’.µ’'µ’ µ’µ’µ’ µ’µ’ý´’ö´’ï´’è´’á´’Ú´’Ó´’Ì´’Å´’¾´’·´’°´’©´’¢´’›´’”´’´’†´’´’x´’q´’j´’c´’\´’U´’N´’G´’@´’9´’2´’+´’$´’´’´’´’´’´’ú³’ó³’ì³’å³’Þ³’׳’г’ɳ’³’»³’´³’­³’¦³’Ÿ³’˜³’‘³’г’ƒ³’|³’u³’n³’g³’`³’Y³’R³’K³’D³’=³’6³’/³’(³’!³’³’³’ ³’³’þ²’÷²’ð²’é²’â²’Û²’Ô²’Ͳ’Ʋ’¿²’¸²’±²’ª²’£²’œ²’•²’޲’‡²’€²’y²’r²’k²’d²’]²’V²’O²’H²’A²’:²’3²’,²’%²’²’²’²’ ²’²’û±’ô±’í±’æ±’ß±’ر’ѱ’ʱ’ñ’¼±’µ±’®±’§±’ ±’™±’’±’‹±’„±’}±’v±’o±’h±’a±’Z±’S±’L±’E±’>±’7±’0±’)±’"±’±’±’ ±’±’ÿ°’ø°’ñ°’ê°’ã°’ܰ’Õ°’ΰ’ǰ’À°’¹°’²°’«°’¤°’°’–°’°’ˆ°’°’z°’s°’l°’e°’^°’W°’P°’I°’B°’;°’4°’-°’&°’°’°’°’ °’°’ü¯’õ¯’篒௒Ù¯’Ò¯’˯’į’½¯’¶¯’¯¯’¨¯’¡¯’𝒓¯’Œ¯’…¯’~¯’w¯’p¯’i¯’b¯’[¯’T¯’M¯’F¯’?¯’8¯’1¯’*¯’#¯’¯’¯’¯’¯’¯’ù®’ò®’ë®’ä®’Ý®’Ö®’Ï®’È®’Á®’º®’³®’¬®’¥®’ž®’—®’®’‰®’‚®’{®’t®’m®’f®’_®’X®’Q®’J®’C®’<®’5®’.®’'®’ ®’®’®’ ®’®’ý­’ö­’ï­’è­’á­’Ú­’Ó­’Ì­’Å­’¾­’·­’°­’©­’¢­’›­’”­’­’†­’­’x­’q­’j­’c­’\­’U­’N­’G­’@­’9­’2­’+­’$­’­’­’­’­’­’ú¬’ó¬’쬒嬒Þ¬’׬’Ь’ɬ’¬’»¬’´¬’­¬’¦¬’Ÿ¬’˜¬’‘¬’Ь’ƒ¬’|¬’u¬’n¬’g¬’`¬’Y¬’R¬’K¬’D¬’=¬’6¬’/¬’(¬’!¬’¬’¬’ ¬’¬’þ«’÷«’ð«’é«’â«’Û«’Ô«’Í«’Æ«’¿«’¸«’±«’ª«’£«’œ«’•«’Ž«’‡«’€«’y«’r«’k«’d«’]«’V«’O«’H«’A«’:«’3«’,«’%«’«’«’«’ «’«’ûª’ôª’íª’檒ߪ’ت’Ѫ’ʪ’ê’¼ª’µª’®ª’§ª’ ª’™ª’’ª’‹ª’„ª’}ª’vª’oª’hª’aª’Zª’Sª’Lª’Eª’>ª’7ª’0ª’)ª’"ª’ª’ª’ ª’ª’ÿ©’ø©’ñ©’ê©’ã©’Ü©’Õ©’Ω’Ç©’À©’¹©’²©’«©’¤©’©’–©’©’ˆ©’©’z©’s©’l©’e©’^©’W©’P©’I©’B©’;©’4©’-©’&©’©’©’©’ ©’©’ü¨’õ¨’稒਒Ù¨’Ò¨’˨’Ĩ’½¨’¶¨’¯¨’¨¨’¡¨’š¨’“¨’Œ¨’…¨’~¨’w¨’p¨’i¨’b¨’[¨’T¨’M¨’F¨’?¨’8¨’1¨’*¨’#¨’¨’¨’¨’¨’¨’ù§’ò§’ë§’ä§’ݧ’Ö§’ϧ’ȧ’Á§’º§’³§’¬§’¥§’ž§’—§’§’‰§’‚§’{§’t§’m§’f§’_§’X§’Q§’J§’C§’<§’5§’.§’'§’ §’§’§’ §’§’ý¦’ö¦’漣覒ᦒÚ¦’Ó¦’̦’Ŧ’¾¦’·¦’°¦’©¦’¢¦’›¦’”¦’¦’†¦’¦’x¦’q¦’j¦’c¦’\¦’U¦’N¦’G¦’@¦’9¦’2¦’+¦’$¦’¦’¦’¦’¦’¦’ú¥’ó¥’쥒奒Þ¥’×¥’Ð¥’É¥’Â¥’»¥’´¥’­¥’¦¥’Ÿ¥’˜¥’‘¥’Š¥’ƒ¥’|¥’u¥’n¥’g¥’`¥’Y¥’R¥’K¥’D¥’=¥’6¥’/¥’(¥’!¥’¥’¥’ ¥’¥’þ¤’÷¤’ð¤’餒⤒Û¤’Ô¤’ͤ’Ƥ’¿¤’¸¤’±¤’ª¤’£¤’œ¤’•¤’ޤ’‡¤’€¤’y¤’r¤’k¤’d¤’]¤’V¤’O¤’H¤’A¤’:¤’3¤’,¤’%¤’¤’¤’¤’ ¤’¤’û£’ô£’í£’棒ߣ’Ø£’Ñ£’Ê£’ã’¼£’µ£’®£’§£’ £’™£’’£’‹£’„£’}£’v£’o£’h£’a£’Z£’S£’L£’E£’>£’7£’0£’)£’"£’£’£’ £’£’ÿ¢’ø¢’ñ¢’ꢒ㢒Ü¢’Õ¢’΢’Ç¢’À¢’¹¢’²¢’«¢’¤¢’¢’–¢’¢’ˆ¢’¢’z¢’s¢’l¢’e¢’^¢’W¢’P¢’I¢’B¢’;¢’4¢’-¢’&¢’¢’¢’¢’ ¢’¢’ü¡’õ¡’î¡’ç¡’à¡’Ù¡’Ò¡’Ë¡’Ä¡’½¡’¶¡’¯¡’¨¡’¡¡’š¡’“¡’Œ¡’…¡’~¡’w¡’p¡’i¡’b¡’[¡’T¡’M¡’F¡’?¡’8¡’1¡’*¡’#¡’¡’¡’¡’¡’¡’ù ’ò ’ë ’ä ’Ý ’Ö ’Ï ’È ’Á ’º ’³ ’¬ ’¥ ’ž ’— ’ ’‰ ’‚ ’{ ’t ’m ’f ’_ ’X ’Q ’J ’C ’< ’5 ’. ’' ’  ’ ’ ’  ’ ’ýŸ’öŸ’蟒្ÚŸ’ÓŸ’ÌŸ’ÅŸ’¾Ÿ’·Ÿ’°Ÿ’©Ÿ’¢Ÿ’›Ÿ’”Ÿ’Ÿ’†Ÿ’Ÿ’xŸ’qŸ’jŸ’cŸ’\Ÿ’UŸ’NŸ’GŸ’@Ÿ’9Ÿ’2Ÿ’+Ÿ’$Ÿ’Ÿ’Ÿ’Ÿ’Ÿ’Ÿ’úž’óž’ìž’åž’Þž’מ’О’Éž’ž’»ž’´ž’­ž’¦ž’Ÿž’˜ž’‘ž’Šž’ƒž’|ž’už’nž’gž’`ž’Yž’Rž’Kž’Dž’=ž’6ž’/ž’(ž’!ž’ž’ž’ ž’ž’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’ûœ’ôœ’휒朒ßœ’Øœ’Ñœ’Êœ’Ü’¼œ’µœ’®œ’§œ’ œ’™œ’’œ’‹œ’„œ’}œ’vœ’oœ’hœ’aœ’Zœ’Sœ’Lœ’Eœ’>œ’7œ’0œ’)œ’"œ’œ’œ’ œ’œ’ÿ›’ø›’ñ›’ê›’ã›’Ü›’Õ›’Λ’Ç›’À›’¹›’²›’«›’¤›’›’–›’›’ˆ›’›’z›’s›’l›’e›’^›’W›’P›’I›’B›’;›’4›’-›’&›’›’›’›’ ›’›’üš’õš’îš’çš’àš’Ùš’Òš’Ëš’Äš’½š’¶š’¯š’¨š’¡š’šš’“š’Œš’…š’~š’wš’pš’iš’bš’[š’Tš’Mš’Fš’?š’8š’1š’*š’#š’š’š’š’š’š’ù™’ò™’ë™’ä™’Ý™’Ö™’Ï™’È™’Á™’º™’³™’¬™’¥™’ž™’—™’™’‰™’‚™’{™’t™’m™’f™’_™’X™’Q™’J™’C™’<™’5™’.™’'™’ ™’™’™’ ™’™’ý˜’ö˜’蘒ᘒÚ˜’Ó˜’̘’Ř’¾˜’·˜’°˜’©˜’¢˜’›˜’”˜’˜’†˜’˜’x˜’q˜’j˜’c˜’\˜’U˜’N˜’G˜’@˜’9˜’2˜’+˜’$˜’˜’˜’˜’˜’˜’ú—’ó—’ì—’å—’Þ—’×—’З’É—’—’»—’´—’­—’¦—’Ÿ—’˜—’‘—’Š—’ƒ—’|—’u—’n—’g—’`—’Y—’R—’K—’D—’=—’6—’/—’(—’!—’—’—’ —’—’þ–’÷–’ð–’é–’â–’Û–’Ô–’Í–’Æ–’¿–’¸–’±–’ª–’£–’œ–’•–’Ž–’‡–’€–’y–’r–’k–’d–’]–’V–’O–’H–’A–’:–’3–’,–’%–’–’–’–’ –’–’û•’ô•’í•’æ•’ß•’Ø•’Ñ•’Ê•’Õ’¼•’µ•’®•’§•’ •’™•’’•’‹•’„•’}•’v•’o•’h•’a•’Z•’S•’L•’E•’>•’7•’0•’)•’"•’•’•’ •’•’ÿ”’ø”’ñ”’ê”’ã”’Ü”’Õ”’Δ’Ç”’À”’¹”’²”’«”’¤”’”’–”’”’ˆ”’”’z”’s”’l”’e”’^”’W”’P”’I”’B”’;”’4”’-”’&”’”’”’”’ ”’”’ü“’õ“’î“’ç“’à“’Ù“’Ò“’Ë“’Ä“’½“’¶“’¯“’¨“’¡“’š“’““’Œ“’…“’~“’w“’p“’i“’b“’[“’T“’M“’F“’?“’8“’1“’*“’#“’“’“’“’“’“’ù’’ò’’ë’’ä’’Ý’’Ö’’Ï’’È’’Á’’º’’³’’¬’’¥’’ž’’—’’’’‰’’‚’’{’’t’’m’’f’’_’’X’’Q’’J’’C’’<’’5’’.’’'’’ ’’’’’’ ’’’’ý‘’ö‘’ï‘’è‘’á‘’Ú‘’Ó‘’Ì‘’Å‘’¾‘’·‘’°‘’©‘’¢‘’›‘’”‘’‘’†‘’‘’x‘’q‘’j‘’c‘’\‘’U‘’N‘’G‘’@‘’9‘’2‘’+‘’$‘’‘’‘’‘’‘’‘’ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’ûŽ’ôŽ’펒排ߎ’ØŽ’ÑŽ’ÊŽ’ÃŽ’¼Ž’µŽ’®Ž’§Ž’ Ž’™Ž’’Ž’‹Ž’„Ž’}Ž’vŽ’oŽ’hŽ’aŽ’ZŽ’SŽ’LŽ’EŽ’>Ž’7Ž’0Ž’)Ž’"Ž’Ž’Ž’ Ž’Ž’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’üŒ’õŒ’猒àŒ’ÙŒ’ÒŒ’ËŒ’ÄŒ’½Œ’¶Œ’¯Œ’¨Œ’¡Œ’šŒ’“Œ’ŒŒ’…Œ’~Œ’wŒ’pŒ’iŒ’bŒ’[Œ’TŒ’MŒ’FŒ’?Œ’8Œ’1Œ’*Œ’#Œ’Œ’Œ’Œ’Œ’Œ’ù‹’ò‹’ë‹’ä‹’Ý‹’Ö‹’Ï‹’È‹’Á‹’º‹’³‹’¬‹’¥‹’ž‹’—‹’‹’‰‹’‚‹’{‹’t‹’m‹’f‹’_‹’X‹’Q‹’J‹’C‹’<‹’5‹’.‹’'‹’ ‹’‹’‹’ ‹’‹’ýŠ’öŠ’芒ኒÚŠ’ÓŠ’ÌŠ’ÅŠ’¾Š’·Š’°Š’©Š’¢Š’›Š’”Š’Š’†Š’Š’xŠ’qŠ’jŠ’cŠ’\Š’UŠ’NŠ’GŠ’@Š’9Š’2Š’+Š’$Š’Š’Š’Š’Š’Š’ú‰’ó‰’쉒剒Þ‰’׉’Љ’ɉ’‰’»‰’´‰’­‰’¦‰’Ÿ‰’˜‰’‘‰’Љ’ƒ‰’|‰’u‰’n‰’g‰’`‰’Y‰’R‰’K‰’D‰’=‰’6‰’/‰’(‰’!‰’‰’‰’ ‰’‰’þˆ’÷ˆ’ðˆ’鈒−Ûˆ’Ôˆ’͈’ƈ’¿ˆ’¸ˆ’±ˆ’ªˆ’£ˆ’œˆ’•ˆ’Žˆ’‡ˆ’€ˆ’yˆ’rˆ’kˆ’dˆ’]ˆ’Vˆ’Oˆ’Hˆ’Aˆ’:ˆ’3ˆ’,ˆ’%ˆ’ˆ’ˆ’ˆ’ ˆ’ˆ’û‡’ô‡’퇒懒߇’؇’ч’ʇ’Ç’¼‡’µ‡’®‡’§‡’ ‡’™‡’’‡’‹‡’„‡’}‡’v‡’o‡’h‡’a‡’Z‡’S‡’L‡’E‡’>‡’7‡’0‡’)‡’"‡’‡’‡’ ‡’‡’ÿ†’ø†’ñ†’ꆒ㆒܆’Õ†’Ά’dž’À†’¹†’²†’«†’¤†’†’–†’†’ˆ†’†’z†’s†’l†’e†’^†’W†’P†’I†’B†’;†’4†’-†’&†’†’†’†’ †’†’ü…’õ…’î…’ç…’à…’Ù…’Ò…’Ë…’Ä…’½…’¶…’¯…’¨…’¡…’š…’“…’Œ…’……’~…’w…’p…’i…’b…’[…’T…’M…’F…’?…’8…’1…’*…’#…’…’…’…’…’…’ù„’ò„’ë„’ä„’Ý„’Ö„’Ï„’È„’Á„’º„’³„’¬„’¥„’ž„’—„’„’‰„’‚„’{„’t„’m„’f„’_„’X„’Q„’J„’C„’<„’5„’.„’'„’ „’„’„’ „’„’ýƒ’öƒ’胒გÚƒ’Óƒ’̃’Ń’¾ƒ’·ƒ’°ƒ’©ƒ’¢ƒ’›ƒ’”ƒ’ƒ’†ƒ’ƒ’xƒ’qƒ’jƒ’cƒ’\ƒ’Uƒ’Nƒ’Gƒ’@ƒ’9ƒ’2ƒ’+ƒ’$ƒ’ƒ’ƒ’ƒ’ƒ’ƒ’ú‚’ó‚’ì‚’å‚’Þ‚’ׂ’Ђ’É‚’‚’»‚’´‚’­‚’¦‚’Ÿ‚’˜‚’‘‚’Š‚’ƒ‚’|‚’u‚’n‚’g‚’`‚’Y‚’R‚’K‚’D‚’=‚’6‚’/‚’(‚’!‚’‚’‚’ ‚’‚’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û€’ô€’퀒怒߀’Ø€’Ñ€’Ê€’À’¼€’µ€’®€’§€’ €’™€’’€’‹€’„€’}€’v€’o€’h€’a€’Z€’S€’L€’E€’>€’7€’0€’)€’"€’€’€’ €’€’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü~’õ~’î~’ç~’à~’Ù~’Ò~’Ë~’Ä~’½~’¶~’¯~’¨~’¡~’š~’“~’Œ~’…~’~~’w~’p~’i~’b~’[~’T~’M~’F~’?~’8~’1~’*~’#~’~’~’~’~’~’ù}’ò}’ë}’ä}’Ý}’Ö}’Ï}’È}’Á}’º}’³}’¬}’¥}’ž}’—}’}’‰}’‚}’{}’t}’m}’f}’_}’X}’Q}’J}’C}’<}’5}’.}’'}’ }’}’}’ }’}’ý|’ö|’ï|’è|’á|’Ú|’Ó|’Ì|’Å|’¾|’·|’°|’©|’¢|’›|’”|’|’†|’|’x|’q|’j|’c|’\|’U|’N|’G|’@|’9|’2|’+|’$|’|’|’|’|’|’ú{’ó{’ì{’å{’Þ{’×{’Ð{’É{’Â{’»{’´{’­{’¦{’Ÿ{’˜{’‘{’Š{’ƒ{’|{’u{’n{’g{’`{’Y{’R{’K{’D{’={’6{’/{’({’!{’{’{’ {’{’þz’÷z’ðz’éz’âz’Ûz’Ôz’Íz’Æz’¿z’¸z’±z’ªz’£z’œz’•z’Žz’‡z’€z’yz’rz’kz’dz’]z’Vz’Oz’Hz’Az’:z’3z’,z’%z’z’z’z’ z’z’ûy’ôy’íy’æy’ßy’Øy’Ñy’Êy’Ãy’¼y’µy’®y’§y’ y’™y’’y’‹y’„y’}y’vy’oy’hy’ay’Zy’Sy’Ly’Ey’>y’7y’0y’)y’"y’y’y’ y’y’ÿx’øx’ñx’êx’ãx’Üx’Õx’Îx’Çx’Àx’¹x’²x’«x’¤x’x’–x’x’ˆx’x’zx’sx’lx’ex’^x’Wx’Px’Ix’Bx’;x’4x’-x’&x’x’x’x’ x’x’üw’õw’îw’çw’àw’Ùw’Òw’Ëw’Äw’½w’¶w’¯w’¨w’¡w’šw’“w’Œw’…w’~w’ww’pw’iw’bw’[w’Tw’Mw’Fw’?w’8w’1w’*w’#w’w’w’w’w’w’ùv’òv’ëv’äv’Ýv’Öv’Ïv’Èv’Áv’ºv’³v’¬v’¥v’žv’—v’v’‰v’‚v’{v’tv’mv’fv’_v’Xv’Qv’Jv’Cv’r’7r’0r’)r’"r’r’r’ r’r’ÿq’øq’ñq’êq’ãq’Üq’Õq’Îq’Çq’Àq’¹q’²q’«q’¤q’q’–q’q’ˆq’q’zq’sq’lq’eq’^q’Wq’Pq’Iq’Bq’;q’4q’-q’&q’q’q’q’ q’q’üp’õp’îp’çp’àp’Ùp’Òp’Ëp’Äp’½p’¶p’¯p’¨p’¡p’šp’“p’Œp’…p’~p’wp’pp’ip’bp’[p’Tp’Mp’Fp’?p’8p’1p’*p’#p’p’p’p’p’p’ùo’òo’ëo’äo’Ýo’Öo’Ïo’Èo’Áo’ºo’³o’¬o’¥o’žo’—o’o’‰o’‚o’{o’to’mo’fo’_o’Xo’Qo’Jo’Co’k’7k’0k’)k’"k’k’k’ k’k’ÿj’øj’ñj’êj’ãj’Üj’Õj’Îj’Çj’Àj’¹j’²j’«j’¤j’j’–j’j’ˆj’j’zj’sj’lj’ej’^j’Wj’Pj’Ij’Bj’;j’4j’-j’&j’j’j’j’ j’j’üi’õi’îi’çi’ài’Ùi’Òi’Ëi’Äi’½i’¶i’¯i’¨i’¡i’ši’“i’Œi’…i’~i’wi’pi’ii’bi’[i’Ti’Mi’Fi’?i’8i’1i’*i’#i’i’i’i’i’i’ùh’òh’ëh’äh’Ýh’Öh’Ïh’Èh’Áh’ºh’³h’¬h’¥h’žh’—h’h’‰h’‚h’{h’th’mh’fh’_h’Xh’Qh’Jh’Ch’d’7d’0d’)d’"d’d’d’ d’d’ÿc’øc’ñc’êc’ãc’Üc’Õc’Îc’Çc’Àc’¹c’²c’«c’¤c’c’–c’c’ˆc’c’zc’sc’lc’ec’^c’Wc’Pc’Ic’Bc’;c’4c’-c’&c’c’c’c’ c’c’üb’õb’îb’çb’àb’Ùb’Òb’Ëb’Äb’½b’¶b’¯b’¨b’¡b’šb’“b’Œb’…b’~b’wb’pb’ib’bb’[b’Tb’Mb’Fb’?b’8b’1b’*b’#b’b’b’b’b’b’ùa’òa’ëa’äa’Ýa’Öa’Ïa’Èa’Áa’ºa’³a’¬a’¥a’ža’—a’a’‰a’‚a’{a’ta’ma’fa’_a’Xa’Qa’Ja’Ca’]’7]’0]’)]’"]’]’]’ ]’]’ÿ\’ø\’ñ\’ê\’ã\’Ü\’Õ\’Î\’Ç\’À\’¹\’²\’«\’¤\’\’–\’\’ˆ\’\’z\’s\’l\’e\’^\’W\’P\’I\’B\’;\’4\’-\’&\’\’\’\’ \’\’ü[’õ[’î[’ç[’à[’Ù[’Ò[’Ë[’Ä[’½[’¶[’¯[’¨[’¡[’š[’“[’Œ[’…[’~[’w[’p[’i[’b[’[[’T[’M[’F[’?[’8[’1[’*[’#[’[’[’[’[’[’ùZ’òZ’ëZ’äZ’ÝZ’ÖZ’ÏZ’ÈZ’ÁZ’ºZ’³Z’¬Z’¥Z’žZ’—Z’Z’‰Z’‚Z’{Z’tZ’mZ’fZ’_Z’XZ’QZ’JZ’CZ’V’7V’0V’)V’"V’V’V’ V’V’ÿU’øU’ñU’êU’ãU’ÜU’ÕU’ÎU’ÇU’ÀU’¹U’²U’«U’¤U’U’–U’U’ˆU’U’zU’sU’lU’eU’^U’WU’PU’IU’BU’;U’4U’-U’&U’U’U’U’ U’U’üT’õT’îT’çT’àT’ÙT’ÒT’ËT’ÄT’½T’¶T’¯T’¨T’¡T’šT’“T’ŒT’…T’~T’wT’pT’iT’bT’[T’TT’MT’FT’?T’8T’1T’*T’#T’T’T’T’T’T’ùS’òS’ëS’äS’ÝS’ÖS’ÏS’ÈS’ÁS’ºS’³S’¬S’¥S’žS’—S’S’‰S’‚S’{S’tS’mS’fS’_S’XS’QS’JS’CS’O’7O’0O’)O’"O’O’O’ O’O’ÿN’øN’ñN’êN’ãN’ÜN’ÕN’ÎN’ÇN’ÀN’¹N’²N’«N’¤N’N’–N’N’ˆN’N’zN’sN’lN’eN’^N’WN’PN’IN’BN’;N’4N’-N’&N’N’N’N’ N’N’üM’õM’îM’çM’àM’ÙM’ÒM’ËM’ÄM’½M’¶M’¯M’¨M’¡M’šM’“M’ŒM’…M’~M’wM’pM’iM’bM’[M’TM’MM’FM’?M’8M’1M’*M’#M’M’M’M’M’M’ùL’òL’ëL’äL’ÝL’ÖL’ÏL’ÈL’ÁL’ºL’³L’¬L’¥L’žL’—L’L’‰L’‚L’{L’tL’mL’fL’_L’XL’QL’JL’CL’H’7H’0H’)H’"H’H’H’ H’H’ÿG’øG’ñG’êG’ãG’ÜG’ÕG’ÎG’ÇG’ÀG’¹G’²G’«G’¤G’G’–G’G’ˆG’G’zG’sG’lG’eG’^G’WG’PG’IG’BG’;G’4G’-G’&G’G’G’G’ G’G’üF’õF’îF’çF’àF’ÙF’ÒF’ËF’ÄF’½F’¶F’¯F’¨F’¡F’šF’“F’ŒF’…F’~F’wF’pF’iF’bF’[F’TF’MF’FF’?F’8F’1F’*F’#F’F’F’F’F’F’ùE’òE’ëE’äE’ÝE’ÖE’ÏE’ÈE’ÁE’ºE’³E’¬E’¥E’žE’—E’E’‰E’‚E’{E’tE’mE’fE’_E’XE’QE’JE’CE’A’7A’0A’)A’"A’A’A’ A’A’ÿ@’ø@’ñ@’ê@’ã@’Ü@’Õ@’Î@’Ç@’À@’¹@’²@’«@’¤@’@’–@’@’ˆ@’@’z@’s@’l@’e@’^@’W@’P@’I@’B@’;@’4@’-@’&@’@’@’@’ @’@’ü?’õ?’î?’ç?’à?’Ù?’Ò?’Ë?’Ä?’½?’¶?’¯?’¨?’¡?’š?’“?’Œ?’…?’~?’w?’p?’i?’b?’[?’T?’M?’F?’??’8?’1?’*?’#?’?’?’?’?’?’ù>’ò>’ë>’ä>’Ý>’Ö>’Ï>’È>’Á>’º>’³>’¬>’¥>’ž>’—>’>’‰>’‚>’{>’t>’m>’f>’_>’X>’Q>’J>’C>’<>’5>’.>’'>’ >’>’>’ >’>’ý=’ö=’ï=’è=’á=’Ú=’Ó=’Ì=’Å=’¾=’·=’°=’©=’¢=’›=’”=’=’†=’=’x=’q=’j=’c=’\=’U=’N=’G=’@=’9=’2=’+=’$=’=’=’=’=’=’ú<’ó<’ì<’å<’Þ<’×<’Ð<’É<’Â<’»<’´<’­<’¦<’Ÿ<’˜<’‘<’Š<’ƒ<’|<’u<’n<’g<’`<’Y<’R<’K<’D<’=<’6<’/<’(<’!<’<’<’ <’<’þ;’÷;’ð;’é;’â;’Û;’Ô;’Í;’Æ;’¿;’¸;’±;’ª;’£;’œ;’•;’Ž;’‡;’€;’y;’r;’k;’d;’];’V;’O;’H;’A;’:;’3;’,;’%;’;’;’;’ ;’;’û:’ô:’í:’æ:’ß:’Ø:’Ñ:’Ê:’Ã:’¼:’µ:’®:’§:’ :’™:’’:’‹:’„:’}:’v:’o:’h:’a:’Z:’S:’L:’E:’>:’7:’0:’):’":’:’:’ :’:’ÿ9’ø9’ñ9’ê9’ã9’Ü9’Õ9’Î9’Ç9’À9’¹9’²9’«9’¤9’9’–9’9’ˆ9’9’z9’s9’l9’e9’^9’W9’P9’I9’B9’;9’49’-9’&9’9’9’9’ 9’9’ü8’õ8’î8’ç8’à8’Ù8’Ò8’Ë8’Ä8’½8’¶8’¯8’¨8’¡8’š8’“8’Œ8’…8’~8’w8’p8’i8’b8’[8’T8’M8’F8’?8’88’18’*8’#8’8’8’8’8’8’ù7’ò7’ë7’ä7’Ý7’Ö7’Ï7’È7’Á7’º7’³7’¬7’¥7’ž7’—7’7’‰7’‚7’{7’t7’m7’f7’_7’X7’Q7’J7’C7’<7’57’.7’'7’ 7’7’7’ 7’7’ý6’ö6’ï6’è6’á6’Ú6’Ó6’Ì6’Å6’¾6’·6’°6’©6’¢6’›6’”6’6’†6’6’x6’q6’j6’c6’\6’U6’N6’G6’@6’96’26’+6’$6’6’6’6’6’6’ú5’ó5’ì5’å5’Þ5’×5’Ð5’É5’Â5’»5’´5’­5’¦5’Ÿ5’˜5’‘5’Š5’ƒ5’|5’u5’n5’g5’`5’Y5’R5’K5’D5’=5’65’/5’(5’!5’5’5’ 5’5’þ4’÷4’ð4’é4’â4’Û4’Ô4’Í4’Æ4’¿4’¸4’±4’ª4’£4’œ4’•4’Ž4’‡4’€4’y4’r4’k4’d4’]4’V4’O4’H4’A4’:4’34’,4’%4’4’4’4’ 4’4’û3’ô3’í3’æ3’ß3’Ø3’Ñ3’Ê3’Ã3’¼3’µ3’®3’§3’ 3’™3’’3’‹3’„3’}3’v3’o3’h3’a3’Z3’S3’L3’E3’>3’73’03’)3’"3’3’3’ 3’3’ÿ2’ø2’ñ2’ê2’ã2’Ü2’Õ2’Î2’Ç2’À2’¹2’²2’«2’¤2’2’–2’2’ˆ2’2’z2’s2’l2’e2’^2’W2’P2’I2’B2’;2’42’-2’&2’2’2’2’ 2’2’ü1’õ1’î1’ç1’à1’Ù1’Ò1’Ë1’Ä1’½1’¶1’¯1’¨1’¡1’š1’“1’Œ1’…1’~1’w1’p1’i1’b1’[1’T1’M1’F1’?1’81’11’*1’#1’1’1’1’1’1’ù0’ò0’ë0’ä0’Ý0’Ö0’Ï0’È0’Á0’º0’³0’¬0’¥0’ž0’—0’0’‰0’‚0’{0’t0’m0’f0’_0’X0’Q0’J0’C0’<0’50’.0’'0’ 0’0’0’ 0’0’ý/’ö/’ï/’è/’á/’Ú/’Ó/’Ì/’Å/’¾/’·/’°/’©/’¢/’›/’”/’/’†/’/’x/’q/’j/’c/’\/’U/’N/’G/’@/’9/’2/’+/’$/’/’/’/’/’/’ú.’ó.’ì.’å.’Þ.’×.’Ð.’É.’Â.’».’´.’­.’¦.’Ÿ.’˜.’‘.’Š.’ƒ.’|.’u.’n.’g.’`.’Y.’R.’K.’D.’=.’6.’/.’(.’!.’.’.’ .’.’þ-’÷-’ð-’é-’â-’Û-’Ô-’Í-’Æ-’¿-’¸-’±-’ª-’£-’œ-’•-’Ž-’‡-’€-’y-’r-’k-’d-’]-’V-’O-’H-’A-’:-’3-’,-’%-’-’-’-’ -’-’û,’ô,’í,’æ,’ß,’Ø,’Ñ,’Ê,’Ã,’¼,’µ,’®,’§,’ ,’™,’’,’‹,’„,’},’v,’o,’h,’a,’Z,’S,’L,’E,’>,’7,’0,’),’",’,’,’ ,’,’ÿ+’ø+’ñ+’ê+’ã+’Ü+’Õ+’Î+’Ç+’À+’¹+’²+’«+’¤+’+’–+’+’ˆ+’+’z+’s+’l+’e+’^+’W+’P+’I+’B+’;+’4+’-+’&+’+’+’+’ +’+’ü*’õ*’î*’ç*’à*’Ù*’Ò*’Ë*’Ä*’½*’¶*’¯*’¨*’¡*’š*’“*’Œ*’…*’~*’w*’p*’i*’b*’[*’T*’M*’F*’?*’8*’1*’**’#*’*’*’*’*’*’ù)’ò)’ë)’ä)’Ý)’Ö)’Ï)’È)’Á)’º)’³)’¬)’¥)’ž)’—)’)’‰)’‚)’{)’t)’m)’f)’_)’X)’Q)’J)’C)’<)’5)’.)’')’ )’)’)’ )’)’ý(’ö(’ï(’è(’á(’Ú(’Ó(’Ì(’Å(’¾(’·(’°(’©(’¢(’›(’”(’(’†(’(’x(’q(’j(’c(’\(’U(’N(’G(’@(’9(’2(’+(’$(’(’(’(’(’(’ú'’ó'’ì'’å'’Þ'’×'’Ð'’É'’Â'’»'’´'’­'’¦'’Ÿ'’˜'’‘'’Š'’ƒ'’|'’u'’n'’g'’`'’Y'’R'’K'’D'’='’6'’/'’('’!'’'’'’ '’'’þ&’÷&’ð&’é&’â&’Û&’Ô&’Í&’Æ&’¿&’¸&’±&’ª&’£&’œ&’•&’Ž&’‡&’€&’y&’r&’k&’d&’]&’V&’O&’H&’A&’:&’3&’,&’%&’&’&’&’ &’&’û%’ô%’í%’æ%’ß%’Ø%’Ñ%’Ê%’Ã%’¼%’µ%’®%’§%’ %’™%’’%’‹%’„%’}%’v%’o%’h%’a%’Z%’S%’L%’E%’>%’7%’0%’)%’"%’%’%’ %’%’ÿ$’ø$’ñ$’ê$’ã$’Ü$’Õ$’Î$’Ç$’À$’¹$’²$’«$’¤$’$’–$’$’ˆ$’$’z$’s$’l$’e$’^$’W$’P$’I$’B$’;$’4$’-$’&$’$’$’$’ $’$’ü#’õ#’î#’ç#’à#’Ù#’Ò#’Ë#’Ä#’½#’¶#’¯#’¨#’¡#’š#’“#’Œ#’…#’~#’w#’p#’i#’b#’[#’T#’M#’F#’?#’8#’1#’*#’##’#’#’#’#’#’ù"’ò"’ë"’ä"’Ý"’Ö"’Ï"’È"’Á"’º"’³"’¬"’¥"’ž"’—"’"’‰"’‚"’{"’t"’m"’f"’_"’X"’Q"’J"’C"’<"’5"’."’'"’ "’"’"’ "’"’ý!’ö!’ï!’è!’á!’Ú!’Ó!’Ì!’Å!’¾!’·!’°!’©!’¢!’›!’”!’!’†!’!’x!’q!’j!’c!’\!’U!’N!’G!’@!’9!’2!’+!’$!’!’!’!’!’!’ú ’ó ’ì ’å ’Þ ’× ’Ð ’É ’ ’» ’´ ’­ ’¦ ’Ÿ ’˜ ’‘ ’Š ’ƒ ’| ’u ’n ’g ’` ’Y ’R ’K ’D ’= ’6 ’/ ’( ’! ’ ’ ’ ’ ’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù ’ò ’ë ’ä ’Ý ’Ö ’Ï ’È ’Á ’º ’³ ’¬ ’¥ ’ž ’— ’ ’‰ ’‚ ’{ ’t ’m ’f ’_ ’X ’Q ’J ’C ’< ’5 ’. ’' ’ ’ ’ ’ ’ ’ý ’ö ’ï ’è ’á ’Ú ’Ó ’Ì ’Å ’¾ ’· ’° ’© ’¢ ’› ’” ’ ’† ’ ’x ’q ’j ’c ’\ ’U ’N ’G ’@ ’9 ’2 ’+ ’$ ’ ’ ’ ’ ’ ’ú ’ó ’ì ’å ’Þ ’× ’Ð ’É ’ ’» ’´ ’­ ’¦ ’Ÿ ’˜ ’‘ ’Š ’ƒ ’| ’u ’n ’g ’` ’Y ’R ’K ’D ’= ’6 ’/ ’( ’! ’ ’ ’ ’ ’þ ’÷ ’ð ’é ’â ’Û ’Ô ’Í ’Æ ’¿ ’¸ ’± ’ª ’£ ’œ ’• ’Ž ’‡ ’€ ’y ’r ’k ’d ’] ’V ’O ’H ’A ’: ’3 ’, ’% ’ ’ ’ ’ ’ ’û ’ô ’í ’æ ’ß ’Ø ’Ñ ’Ê ’à ’¼ ’µ ’® ’§ ’  ’™ ’’ ’‹ ’„ ’} ’v ’o ’h ’a ’Z ’S ’L ’E ’> ’7 ’0 ’) ’" ’ ’ ’ ’ ’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ùÿ‘òÿ‘ëÿ‘äÿ‘Ýÿ‘Öÿ‘Ïÿ‘Èÿ‘Áÿ‘ºÿ‘³ÿ‘¬ÿ‘¥ÿ‘žÿ‘—ÿ‘ÿ‘‰ÿ‘‚ÿ‘{ÿ‘tÿ‘mÿ‘fÿ‘_ÿ‘Xÿ‘Qÿ‘Jÿ‘Cÿ‘<ÿ‘5ÿ‘.ÿ‘'ÿ‘ ÿ‘ÿ‘ÿ‘ ÿ‘ÿ‘ýþ‘öþ‘ïþ‘èþ‘áþ‘Úþ‘Óþ‘Ìþ‘Åþ‘¾þ‘·þ‘°þ‘©þ‘¢þ‘›þ‘”þ‘þ‘†þ‘þ‘xþ‘qþ‘jþ‘cþ‘\þ‘Uþ‘Nþ‘Gþ‘@þ‘9þ‘2þ‘+þ‘$þ‘þ‘þ‘þ‘þ‘þ‘úý‘óý‘ìý‘åý‘Þý‘×ý‘Ðý‘Éý‘Âý‘»ý‘´ý‘­ý‘¦ý‘Ÿý‘˜ý‘‘ý‘Šý‘ƒý‘|ý‘uý‘ný‘gý‘`ý‘Yý‘Rý‘Ký‘Dý‘=ý‘6ý‘/ý‘(ý‘!ý‘ý‘ý‘ ý‘ý‘þü‘÷ü‘ðü‘éü‘âü‘Ûü‘Ôü‘Íü‘Æü‘¿ü‘¸ü‘±ü‘ªü‘£ü‘œü‘•ü‘Žü‘‡ü‘€ü‘yü‘rü‘kü‘dü‘]ü‘Vü‘Oü‘Hü‘Aü‘:ü‘3ü‘,ü‘%ü‘ü‘ü‘ü‘ ü‘ü‘ûû‘ôû‘íû‘æû‘ßû‘Øû‘Ñû‘Êû‘Ãû‘¼û‘µû‘®û‘§û‘ û‘™û‘’û‘‹û‘„û‘}û‘vû‘oû‘hû‘aû‘Zû‘Sû‘Lû‘Eû‘>û‘7û‘0û‘)û‘"û‘û‘û‘ û‘û‘ÿú‘øú‘ñú‘êú‘ãú‘Üú‘Õú‘Îú‘Çú‘Àú‘¹ú‘²ú‘«ú‘¤ú‘ú‘–ú‘ú‘ˆú‘ú‘zú‘sú‘lú‘eú‘^ú‘Wú‘Pú‘Iú‘Bú‘;ú‘4ú‘-ú‘&ú‘ú‘ú‘ú‘ ú‘ú‘üù‘õù‘îù‘çù‘àù‘Ùù‘Òù‘Ëù‘Äù‘½ù‘¶ù‘¯ù‘¨ù‘¡ù‘šù‘“ù‘Œù‘…ù‘~ù‘wù‘pù‘iù‘bù‘[ù‘Tù‘Mù‘Fù‘?ù‘8ù‘1ù‘*ù‘#ù‘ù‘ù‘ù‘ù‘ù‘ùø‘òø‘ëø‘äø‘Ýø‘Öø‘Ïø‘Èø‘Áø‘ºø‘³ø‘¬ø‘¥ø‘žø‘—ø‘ø‘‰ø‘‚ø‘{ø‘tø‘mø‘fø‘_ø‘Xø‘Qø‘Jø‘Cø‘<ø‘5ø‘.ø‘'ø‘ ø‘ø‘ø‘ ø‘ø‘ý÷‘ö÷‘ï÷‘è÷‘á÷‘Ú÷‘Ó÷‘Ì÷‘Å÷‘¾÷‘·÷‘°÷‘©÷‘¢÷‘›÷‘”÷‘÷‘†÷‘÷‘x÷‘q÷‘j÷‘c÷‘\÷‘U÷‘N÷‘G÷‘@÷‘9÷‘2÷‘+÷‘$÷‘÷‘÷‘÷‘÷‘÷‘úö‘óö‘ìö‘åö‘Þö‘×ö‘Ðö‘Éö‘Âö‘»ö‘´ö‘­ö‘¦ö‘Ÿö‘˜ö‘‘ö‘Šö‘ƒö‘|ö‘uö‘nö‘gö‘`ö‘Yö‘Rö‘Kö‘Dö‘=ö‘6ö‘/ö‘(ö‘!ö‘ö‘ö‘ ö‘ö‘þõ‘÷õ‘ðõ‘éõ‘âõ‘Ûõ‘Ôõ‘Íõ‘Æõ‘¿õ‘¸õ‘±õ‘ªõ‘£õ‘œõ‘•õ‘Žõ‘‡õ‘€õ‘yõ‘rõ‘kõ‘dõ‘]õ‘Võ‘Oõ‘Hõ‘Aõ‘:õ‘3õ‘,õ‘%õ‘õ‘õ‘õ‘ õ‘õ‘ûô‘ôô‘íô‘æô‘ßô‘Øô‘Ñô‘Êô‘Ãô‘¼ô‘µô‘®ô‘§ô‘ ô‘™ô‘’ô‘‹ô‘„ô‘}ô‘vô‘oô‘hô‘aô‘Zô‘Sô‘Lô‘Eô‘>ô‘7ô‘0ô‘)ô‘"ô‘ô‘ô‘ ô‘ô‘ÿó‘øó‘ñó‘êó‘ãó‘Üó‘Õó‘Îó‘Çó‘Àó‘¹ó‘²ó‘«ó‘¤ó‘ó‘–ó‘ó‘ˆó‘ó‘zó‘só‘ló‘eó‘^ó‘Wó‘Pó‘Ió‘Bó‘;ó‘4ó‘-ó‘&ó‘ó‘ó‘ó‘ ó‘ó‘üò‘õò‘îò‘çò‘àò‘Ùò‘Òò‘Ëò‘Äò‘½ò‘¶ò‘¯ò‘¨ò‘¡ò‘šò‘“ò‘Œò‘…ò‘~ò‘wò‘pò‘iò‘bò‘[ò‘Tò‘Mò‘Fò‘?ò‘8ò‘1ò‘*ò‘#ò‘ò‘ò‘ò‘ò‘ò‘ùñ‘òñ‘ëñ‘äñ‘Ýñ‘Öñ‘Ïñ‘Èñ‘Áñ‘ºñ‘³ñ‘¬ñ‘¥ñ‘žñ‘—ñ‘ñ‘‰ñ‘‚ñ‘{ñ‘tñ‘mñ‘fñ‘_ñ‘Xñ‘Qñ‘Jñ‘Cñ‘<ñ‘5ñ‘.ñ‘'ñ‘ ñ‘ñ‘ñ‘ ñ‘ñ‘ýð‘öð‘ïð‘èð‘áð‘Úð‘Óð‘Ìð‘Åð‘¾ð‘·ð‘°ð‘©ð‘¢ð‘›ð‘”ð‘ð‘†ð‘ð‘xð‘qð‘jð‘cð‘\ð‘Uð‘Nð‘Gð‘@ð‘9ð‘2ð‘+ð‘$ð‘ð‘ð‘ð‘ð‘ð‘úï‘óï‘ìï‘åï‘Þï‘×ï‘Ðï‘Éï‘Âï‘|ï‘uï‘nï‘gï‘`ï‘Yï‘Rï‘Kï‘Dï‘=ï‘6ï‘/ï‘(ï‘!ï‘ï‘ï‘ ï‘ï‘þî‘÷î‘ðî‘éî‘âî‘Ûî‘Ôî‘Íî‘Æî‘¿î‘¸î‘±î‘ªî‘£î‘œî‘•î‘Žî‘‡î‘€î‘yî‘rî‘kî‘dî‘]î‘Vî‘Oî‘Hî‘Aî‘:î‘3î‘,î‘%î‘î‘î‘î‘ î‘î‘ûí‘ôí‘íí‘æí‘ßí‘Øí‘Ñí‘Êí‘Ã푼푵푮푧푠푙푒푋푄í‘}í‘ví‘oí‘hí‘aí‘Zí‘Sí‘Lí‘Eí‘>í‘7í‘0í‘)í‘"í‘í‘í‘ í‘í‘ÿì‘øì‘ñì‘êì‘ãì‘Üì‘Õì‘Îì‘Çì‘À쑹쑲쑫쑤ì‘ì‘–ì‘쑈ì‘ì‘zì‘sì‘lì‘eì‘^ì‘Wì‘Pì‘Iì‘Bì‘;ì‘4ì‘-ì‘&ì‘ì‘ì‘ì‘ ì‘ì‘üë‘õë‘îë‘çë‘àë‘Ùë‘Òë‘Ëë‘Ä둽둶둯둨둡둚둓둌둅ë‘~ë‘wë‘pë‘ië‘bë‘[ë‘Të‘Më‘Fë‘?ë‘8ë‘1ë‘*ë‘#ë‘ë‘ë‘ë‘ë‘ë‘ùê‘òê‘ëê‘äê‘Ýê‘Öê‘Ïê‘Èê‘Áꑺꑳꑬꑥꑞꑗê‘ꑉꑂê‘{ê‘tê‘mê‘fê‘_ê‘Xê‘Qê‘Jê‘Cê‘<ê‘5ê‘.ê‘'ê‘ ê‘ê‘ê‘ ê‘ê‘ýé‘öé‘ïé‘èé‘áé‘Úé‘Óé‘Ìé‘Å鑾鑷鑰鑩鑢鑛鑔é‘鑆é‘é‘xé‘qé‘jé‘cé‘\é‘Ué‘Né‘Gé‘@é‘9é‘2é‘+é‘$é‘é‘é‘é‘é‘é‘úè‘óè‘ìè‘åè‘Þè‘×è‘Ðè‘Éè‘Â葻葴葭葦葟葘葑葊葃è‘|è‘uè‘nè‘gè‘`è‘Yè‘Rè‘Kè‘Dè‘=è‘6è‘/è‘(è‘!è‘è‘è‘ è‘è‘þç‘÷ç‘ðç‘éç‘âç‘Ûç‘Ôç‘Íç‘Æç‘¿ç‘¸ç‘±ç‘ªç‘£ç‘œç‘•ç‘Žç‘‡ç‘€ç‘yç‘rç‘kç‘dç‘]ç‘Vç‘Oç‘Hç‘Aç‘:ç‘3ç‘,ç‘%ç‘ç‘ç‘ç‘ ç‘ç‘ûæ‘ôæ‘íæ‘ææ‘ßæ‘Øæ‘Ñæ‘Êæ‘Ãæ‘¼æ‘µæ‘®æ‘§æ‘ æ‘™æ‘’æ‘‹æ‘„æ‘}æ‘væ‘oæ‘hæ‘aæ‘Zæ‘Sæ‘Læ‘Eæ‘>æ‘7æ‘0æ‘)æ‘"æ‘æ‘æ‘ æ‘æ‘ÿ呸å‘ñå‘êå‘ãå‘Üå‘Õå‘Îå‘Çå‘À呹呲呫呤å‘å‘–å‘呈å‘å‘zå‘så‘lå‘eå‘^å‘Wå‘På‘Iå‘Bå‘;å‘4å‘-å‘&å‘å‘å‘å‘ å‘å‘üä‘õä‘îä‘çä‘àä‘Ùä‘Òä‘Ëä‘Ä䑽䑶䑯䑨䑡䑚䑓䑌䑅ä‘~ä‘wä‘pä‘iä‘bä‘[ä‘Tä‘Mä‘Fä‘?ä‘8ä‘1ä‘*ä‘#ä‘ä‘ä‘ä‘ä‘ä‘ùã‘òã‘ëã‘äã‘Ýã‘Öã‘Ïã‘Èã‘Á㑺㑳㑬㑥㑞㑗ã‘㑉㑂ã‘{ã‘tã‘mã‘fã‘_ã‘Xã‘Qã‘Jã‘Cã‘<ã‘5ã‘.ã‘'ã‘ ã‘ã‘ã‘ ã‘ã‘ýâ‘öâ‘ïâ‘èâ‘áâ‘Úâ‘Óâ‘Ìâ‘Å⑾⑷⑰⑩③⑛⑔â‘⑆â‘â‘xâ‘qâ‘jâ‘câ‘\â‘Uâ‘Nâ‘Gâ‘@â‘9â‘2â‘+â‘$â‘â‘â‘â‘â‘â‘úá‘óá‘ìá‘åá‘Þá‘×á‘Ðá‘Éá‘Âᑻᑴᑭᑦᑟᑘᑑᑊᑃá‘|á‘uá‘ná‘gá‘`á‘Yá‘Rá‘Ká‘Dá‘=á‘6á‘/á‘(á‘!á‘á‘á‘ á‘á‘þà‘÷à‘ðà‘éà‘âà‘Ûà‘Ôà‘Íà‘Æà‘¿à‘¸à‘±à‘ªà‘£à‘œà‘•à‘Žà‘‡à‘€à‘yà‘rà‘kà‘dà‘]à‘Và‘Oà‘Hà‘Aà‘:à‘3à‘,à‘%à‘à‘à‘à‘ à‘à‘ûß‘ôß‘íß‘æß‘ßß‘Øß‘Ñß‘Êß‘Ãß‘¼ß‘µß‘®ß‘§ß‘ ß‘™ß‘’ß‘‹ß‘„ß‘}ß‘vß‘oß‘hß‘aß‘Zß‘Sß‘Lß‘Eß‘>ß‘7ß‘0ß‘)ß‘"ߑߑߑ ߑߑÿÞ‘øÞ‘ñÞ‘êÞ‘ãÞ‘ÜÞ‘ÕÞ‘ÎÞ‘ÇÞ‘ÀÞ‘¹Þ‘²Þ‘«Þ‘¤Þ‘Þ‘–Þ‘Þ‘ˆÞ‘Þ‘zÞ‘sÞ‘lÞ‘eÞ‘^Þ‘WÞ‘PÞ‘IÞ‘BÞ‘;Þ‘4Þ‘-Þ‘&Þ‘Þ‘Þ‘Þ‘ Þ‘Þ‘üÝ‘õÝ‘îÝ‘çÝ‘àÝ‘ÙÝ‘ÒÝ‘ËÝ‘ÄÝ‘½Ý‘¶Ý‘¯Ý‘¨Ý‘¡Ý‘šÝ‘“Ý‘ŒÝ‘…Ý‘~Ý‘wÝ‘pÝ‘iÝ‘bÝ‘[Ý‘TÝ‘MÝ‘FÝ‘?Ý‘8Ý‘1Ý‘*Ý‘#ݑݑݑݑݑݑùÜ‘òÜ‘ëÜ‘äÜ‘ÝÜ‘ÖÜ‘ÏÜ‘ÈÜ‘ÁÜ‘ºÜ‘³Ü‘¬Ü‘¥Ü‘žÜ‘—ܑܑ‰Ü‘‚Ü‘{Ü‘tÜ‘mÜ‘fÜ‘_Ü‘XÜ‘QÜ‘JÜ‘CÜ‘<Ü‘5Ü‘.Ü‘'Ü‘ ܑܑܑ ܑܑýÛ‘öÛ‘ïÛ‘èÛ‘áÛ‘ÚÛ‘ÓÛ‘ÌÛ‘ÅÛ‘¾Û‘·Û‘°Û‘©Û‘¢Û‘›Û‘”Û‘Û‘†Û‘Û‘xÛ‘qÛ‘jÛ‘cÛ‘\Û‘UÛ‘NÛ‘GÛ‘@Û‘9Û‘2Û‘+Û‘$Û‘Û‘Û‘Û‘Û‘Û‘úÚ‘óÚ‘ìÚ‘åÚ‘ÞÚ‘×Ú‘ÐÚ‘ÉÚ‘ÂÚ‘»Ú‘´Ú‘­Ú‘¦Ú‘ŸÚ‘˜Ú‘‘Ú‘ŠÚ‘ƒÚ‘|Ú‘uÚ‘nÚ‘gÚ‘`Ú‘YÚ‘RÚ‘KÚ‘DÚ‘=Ú‘6Ú‘/Ú‘(Ú‘!Ú‘Ú‘Ú‘ Ú‘Ú‘þÙ‘÷Ù‘ðÙ‘éÙ‘âÙ‘ÛÙ‘ÔÙ‘ÍÙ‘ÆÙ‘¿Ù‘¸Ù‘±Ù‘ªÙ‘£Ù‘œÙ‘•Ù‘ŽÙ‘‡Ù‘€Ù‘yÙ‘rÙ‘kÙ‘dÙ‘]Ù‘VÙ‘OÙ‘HÙ‘AÙ‘:Ù‘3Ù‘,Ù‘%ّّّّ ّّûØ‘ôØ‘íØ‘æØ‘ߨ‘ØØ‘ÑØ‘ÊØ‘ÃØ‘¼Ø‘µØ‘®Ø‘§Ø‘ Ø‘™Ø‘’Ø‘‹Ø‘„Ø‘}Ø‘vØ‘oØ‘hØ‘aØ‘ZØ‘SØ‘LØ‘EØ‘>Ø‘7Ø‘0Ø‘)Ø‘"ؑؑؑ ؑؑÿבø×‘ñבêבãבÜבÕבÎבÇבÀב¹×‘²×‘«×‘¤×‘ב–בבˆ×‘בzבsבlבeב^בWבPבIבBב;ב4ב-ב&בבבב בבüÖ‘õÖ‘îÖ‘çÖ‘àÖ‘ÙÖ‘ÒÖ‘ËÖ‘ÄÖ‘½Ö‘¶Ö‘¯Ö‘¨Ö‘¡Ö‘šÖ‘“Ö‘ŒÖ‘…Ö‘~Ö‘wÖ‘pÖ‘iÖ‘bÖ‘[Ö‘TÖ‘MÖ‘FÖ‘?Ö‘8Ö‘1Ö‘*Ö‘#Ö‘Ö‘Ö‘Ö‘Ö‘Ö‘ùÕ‘òÕ‘ëÕ‘äÕ‘ÝÕ‘ÖÕ‘ÏÕ‘ÈÕ‘ÁÕ‘ºÕ‘³Õ‘¬Õ‘¥Õ‘žÕ‘—Õ‘Õ‘‰Õ‘‚Õ‘{Õ‘tÕ‘mÕ‘fÕ‘_Õ‘XÕ‘QÕ‘JÕ‘CÕ‘<Õ‘5Õ‘.Õ‘'Õ‘ Õ‘Õ‘Õ‘ Õ‘Õ‘ýÔ‘öÔ‘ïÔ‘èÔ‘áÔ‘ÚÔ‘ÓÔ‘ÌÔ‘ÅÔ‘¾Ô‘·Ô‘°Ô‘©Ô‘¢Ô‘›Ô‘”Ô‘Ô‘†Ô‘Ô‘xÔ‘qÔ‘jÔ‘cÔ‘\Ô‘UÔ‘NÔ‘GÔ‘@Ô‘9Ô‘2Ô‘+Ô‘$Ô‘Ô‘Ô‘Ô‘Ô‘Ô‘úÓ‘óÓ‘ìÓ‘åÓ‘ÞÓ‘×Ó‘ÐÓ‘ÉÓ‘ÂÓ‘»Ó‘´Ó‘­Ó‘¦Ó‘ŸÓ‘˜Ó‘‘Ó‘ŠÓ‘ƒÓ‘|Ó‘uÓ‘nÓ‘gÓ‘`Ó‘YÓ‘RÓ‘KÓ‘DÓ‘=Ó‘6Ó‘/Ó‘(Ó‘!Ó‘Ó‘Ó‘ Ó‘Ó‘þÒ‘÷Ò‘ðÒ‘éÒ‘âÒ‘ÛÒ‘ÔÒ‘ÍÒ‘ÆÒ‘¿Ò‘¸Ò‘±Ò‘ªÒ‘£Ò‘œÒ‘•Ò‘ŽÒ‘‡Ò‘€Ò‘yÒ‘rÒ‘kÒ‘dÒ‘]Ò‘VÒ‘OÒ‘HÒ‘AÒ‘:Ò‘3Ò‘,Ò‘%Ò‘Ò‘Ò‘Ò‘ Ò‘Ò‘ûÑ‘ôÑ‘íÑ‘æÑ‘ßÑ‘ØÑ‘ÑÑ‘ÊÑ‘ÃÑ‘¼Ñ‘µÑ‘®Ñ‘§Ñ‘ Ñ‘™Ñ‘’Ñ‘‹Ñ‘„Ñ‘}Ñ‘vÑ‘oÑ‘hÑ‘aÑ‘ZÑ‘SÑ‘LÑ‘EÑ‘>Ñ‘7Ñ‘0Ñ‘)Ñ‘"ёёё ёёÿБøÐ‘ñБêБãБÜБÕБÎБÇБÀБ¹Ð‘²Ð‘«Ð‘¤Ð‘Б–ББˆÐ‘БzБsБlБeБ^БWБPБIБBБ;Б4Б-Б&ББББ ББüÏ‘õÏ‘îÏ‘çÏ‘àÏ‘ÙÏ‘ÒÏ‘ËÏ‘ÄÏ‘½Ï‘¶Ï‘¯Ï‘¨Ï‘¡Ï‘šÏ‘“Ï‘ŒÏ‘…Ï‘~Ï‘wÏ‘pÏ‘iÏ‘bÏ‘[Ï‘TÏ‘MÏ‘FÏ‘?Ï‘8Ï‘1Ï‘*Ï‘#ϑϑϑϑϑϑùΑòΑëΑäΑÝΑÖΑÏΑÈΑÁΑºÎ‘³Î‘¬Î‘¥Î‘žÎ‘—ΑΑ‰Î‘‚Α{ΑtΑmΑfΑ_ΑXΑQΑJΑCΑ<Α5Α.Α'Α ΑΑΑ ΑΑýÍ‘öÍ‘ïÍ‘èÍ‘áÍ‘ÚÍ‘ÓÍ‘ÌÍ‘ÅÍ‘¾Í‘·Í‘°Í‘©Í‘¢Í‘›Í‘”͑͑†Í‘Í‘xÍ‘qÍ‘jÍ‘cÍ‘\Í‘UÍ‘NÍ‘GÍ‘@Í‘9Í‘2Í‘+Í‘$͑͑͑͑͑͑úÌ‘óÌ‘ìÌ‘åÌ‘ÞÌ‘×Ì‘ÐÌ‘ÉÌ‘ÂÌ‘»Ì‘´Ì‘­Ì‘¦Ì‘ŸÌ‘˜Ì‘‘Ì‘ŠÌ‘ƒÌ‘|Ì‘uÌ‘nÌ‘gÌ‘`Ì‘YÌ‘RÌ‘KÌ‘DÌ‘=Ì‘6Ì‘/Ì‘(Ì‘!̑̑̑ ̑̑þË‘÷Ë‘ðË‘éË‘âË‘ÛË‘ÔË‘ÍË‘ÆË‘¿Ë‘¸Ë‘±Ë‘ªË‘£Ë‘œË‘•Ë‘ŽË‘‡Ë‘€Ë‘yË‘rË‘kË‘dË‘]Ë‘VË‘OË‘HË‘AË‘:Ë‘3Ë‘,Ë‘%ˑˑˑˑ ˑˑûÊ‘ôÊ‘íÊ‘æÊ‘ßÊ‘ØÊ‘ÑÊ‘ÊÊ‘ÃÊ‘¼Ê‘µÊ‘®Ê‘§Ê‘ Ê‘™Ê‘’Ê‘‹Ê‘„Ê‘}Ê‘vÊ‘oÊ‘hÊ‘aÊ‘ZÊ‘SÊ‘LÊ‘EÊ‘>Ê‘7Ê‘0Ê‘)Ê‘"ʑʑʑ ʑʑÿÉ‘øÉ‘ñÉ‘êÉ‘ãÉ‘ÜÉ‘ÕÉ‘ÎÉ‘ÇÉ‘ÀÉ‘¹É‘²É‘«É‘¤É‘É‘–ɑɑˆÉ‘É‘zÉ‘sÉ‘lÉ‘eÉ‘^É‘WÉ‘PÉ‘IÉ‘BÉ‘;É‘4É‘-É‘&ɑɑɑɑ ɑɑüÈ‘õÈ‘îÈ‘çÈ‘àÈ‘ÙÈ‘ÒÈ‘ËÈ‘ÄÈ‘½È‘¶È‘¯È‘¨È‘¡È‘šÈ‘“È‘ŒÈ‘…È‘~È‘wÈ‘pÈ‘iÈ‘bÈ‘[È‘TÈ‘MÈ‘FÈ‘?È‘8È‘1È‘*È‘#ȑȑȑȑȑȑùÇ‘òÇ‘ëÇ‘äÇ‘ÝÇ‘ÖÇ‘ÏÇ‘ÈÇ‘ÁÇ‘ºÇ‘³Ç‘¬Ç‘¥Ç‘žÇ‘—ǑǑ‰Ç‘‚Ç‘{Ç‘tÇ‘mÇ‘fÇ‘_Ç‘XÇ‘QÇ‘JÇ‘CÇ‘<Ç‘5Ç‘.Ç‘'Ç‘ ǑǑǑ ǑǑýÆ‘öÆ‘ïÆ‘èÆ‘áÆ‘ÚÆ‘ÓÆ‘ÌÆ‘ÅÆ‘¾Æ‘·Æ‘°Æ‘©Æ‘¢Æ‘›Æ‘”ƑƑ†Æ‘Æ‘xÆ‘qÆ‘jÆ‘cÆ‘\Æ‘UÆ‘NÆ‘GÆ‘@Æ‘9Æ‘2Æ‘+Æ‘$ƑƑƑƑƑƑúÅ‘óÅ‘ìÅ‘åÅ‘ÞÅ‘×Å‘ÐÅ‘ÉÅ‘ÂÅ‘»Å‘´Å‘­Å‘¦Å‘ŸÅ‘˜Å‘‘Å‘ŠÅ‘ƒÅ‘|Å‘uÅ‘nÅ‘gÅ‘`Å‘YÅ‘RÅ‘KÅ‘DÅ‘=Å‘6Å‘/Å‘(Å‘!őőő őőþÄ‘÷Ä‘ðÄ‘éÄ‘âÄ‘ÛÄ‘ÔÄ‘ÍÄ‘ÆÄ‘¿Ä‘¸Ä‘±Ä‘ªÄ‘£Ä‘œÄ‘•Ä‘ŽÄ‘‡Ä‘€Ä‘yÄ‘rÄ‘kÄ‘dÄ‘]Ä‘VÄ‘OÄ‘HÄ‘AÄ‘:Ä‘3Ä‘,Ä‘%đđđđ đđûÑôÑíÑæÃ‘ßÑØÃ‘ÑÑÊÑÃѼѵѮѧѠљÑ’ыÑ„Ñ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿ‘øÂ‘ñ‘ê‘ã‘ܑՑΑÇ‘À‘¹Â‘²Â‘«Â‘¤Â‘‘–‘‘ˆÂ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘üÁ‘õÁ‘îÁ‘çÁ‘àÁ‘ÙÁ‘ÒÁ‘ËÁ‘ÄÁ‘½Á‘¶Á‘¯Á‘¨Á‘¡Á‘šÁ‘“Á‘ŒÁ‘…Á‘~Á‘wÁ‘pÁ‘iÁ‘bÁ‘[Á‘TÁ‘MÁ‘FÁ‘?Á‘8Á‘1Á‘*Á‘#Á‘Á‘Á‘Á‘Á‘Á‘ùÀ‘òÀ‘ëÀ‘äÀ‘ÝÀ‘ÖÀ‘ÏÀ‘ÈÀ‘ÁÀ‘ºÀ‘³À‘¬À‘¥À‘žÀ‘—À‘À‘‰À‘‚À‘{À‘tÀ‘mÀ‘fÀ‘_À‘XÀ‘QÀ‘JÀ‘CÀ‘<À‘5À‘.À‘'À‘ À‘À‘À‘ À‘À‘ý¿‘ö¿‘ï¿‘è¿‘á¿‘Ú¿‘Ó¿‘Ì¿‘Å¿‘¾¿‘·¿‘°¿‘©¿‘¢¿‘›¿‘”¿‘¿‘†¿‘¿‘x¿‘q¿‘j¿‘c¿‘\¿‘U¿‘N¿‘G¿‘@¿‘9¿‘2¿‘+¿‘$¿‘¿‘¿‘¿‘¿‘¿‘ú¾‘ó¾‘쾑徑Þ¾‘×¾‘о‘ɾ‘¾‘»¾‘´¾‘­¾‘¦¾‘Ÿ¾‘˜¾‘‘¾‘о‘ƒ¾‘|¾‘u¾‘n¾‘g¾‘`¾‘Y¾‘R¾‘K¾‘D¾‘=¾‘6¾‘/¾‘(¾‘!¾‘¾‘¾‘ ¾‘¾‘þ½‘÷½‘ð½‘齑⽑Û½‘Ô½‘ͽ‘ƽ‘¿½‘¸½‘±½‘ª½‘£½‘œ½‘•½‘޽‘‡½‘€½‘y½‘r½‘k½‘d½‘]½‘V½‘O½‘H½‘A½‘:½‘3½‘,½‘%½‘½‘½‘½‘ ½‘½‘û¼‘ô¼‘í¼‘漑ß¼‘ؼ‘Ѽ‘ʼ‘ü‘¼¼‘µ¼‘®¼‘§¼‘ ¼‘™¼‘’¼‘‹¼‘„¼‘}¼‘v¼‘o¼‘h¼‘a¼‘Z¼‘S¼‘L¼‘E¼‘>¼‘7¼‘0¼‘)¼‘"¼‘¼‘¼‘ ¼‘¼‘ÿ»‘ø»‘ñ»‘껑㻑Ü»‘Õ»‘λ‘Ç»‘À»‘¹»‘²»‘«»‘¤»‘»‘–»‘»‘ˆ»‘»‘z»‘s»‘l»‘e»‘^»‘W»‘P»‘I»‘B»‘;»‘4»‘-»‘&»‘»‘»‘»‘ »‘»‘üº‘õº‘纑ຑÙº‘Òº‘˺‘ĺ‘½º‘¶º‘¯º‘¨º‘¡º‘šº‘“º‘Œº‘…º‘~º‘wº‘pº‘iº‘bº‘[º‘Tº‘Mº‘Fº‘?º‘8º‘1º‘*º‘#º‘º‘º‘º‘º‘º‘ù¹‘ò¹‘빑乑ݹ‘Ö¹‘Ϲ‘ȹ‘Á¹‘º¹‘³¹‘¬¹‘¥¹‘ž¹‘—¹‘¹‘‰¹‘‚¹‘{¹‘t¹‘m¹‘f¹‘_¹‘X¹‘Q¹‘J¹‘C¹‘<¹‘5¹‘.¹‘'¹‘ ¹‘¹‘¹‘ ¹‘¹‘ý¸‘ö¸‘︑踑ḑÚ¸‘Ó¸‘̸‘Ÿ‘¾¸‘·¸‘°¸‘©¸‘¢¸‘›¸‘”¸‘¸‘†¸‘¸‘x¸‘q¸‘j¸‘c¸‘\¸‘U¸‘N¸‘G¸‘@¸‘9¸‘2¸‘+¸‘$¸‘¸‘¸‘¸‘¸‘¸‘ú·‘ó·‘ì·‘å·‘Þ·‘×·‘з‘É·‘·‘»·‘´·‘­·‘¦·‘Ÿ·‘˜·‘‘·‘Š·‘ƒ·‘|·‘u·‘n·‘g·‘`·‘Y·‘R·‘K·‘D·‘=·‘6·‘/·‘(·‘!·‘·‘·‘ ·‘·‘þ¶‘÷¶‘ð¶‘é¶‘â¶‘Û¶‘Ô¶‘Ͷ‘ƶ‘¿¶‘¸¶‘±¶‘ª¶‘£¶‘œ¶‘•¶‘޶‘‡¶‘€¶‘y¶‘r¶‘k¶‘d¶‘]¶‘V¶‘O¶‘H¶‘A¶‘:¶‘3¶‘,¶‘%¶‘¶‘¶‘¶‘ ¶‘¶‘ûµ‘ôµ‘íµ‘浑ßµ‘ص‘ѵ‘ʵ‘õ‘¼µ‘µµ‘®µ‘§µ‘ µ‘™µ‘’µ‘‹µ‘„µ‘}µ‘vµ‘oµ‘hµ‘aµ‘Zµ‘Sµ‘Lµ‘Eµ‘>µ‘7µ‘0µ‘)µ‘"µ‘µ‘µ‘ µ‘µ‘ÿ´‘ø´‘ñ´‘ê´‘ã´‘Ü´‘Õ´‘δ‘Ç´‘À´‘¹´‘²´‘«´‘¤´‘´‘–´‘´‘ˆ´‘´‘z´‘s´‘l´‘e´‘^´‘W´‘P´‘I´‘B´‘;´‘4´‘-´‘&´‘´‘´‘´‘ ´‘´‘ü³‘õ³‘糑೑Ù³‘Ò³‘˳‘ij‘½³‘¶³‘¯³‘¨³‘¡³‘𳑓³‘Œ³‘…³‘~³‘w³‘p³‘i³‘b³‘[³‘T³‘M³‘F³‘?³‘8³‘1³‘*³‘#³‘³‘³‘³‘³‘³‘ù²‘ò²‘벑䲑ݲ‘Ö²‘ϲ‘Ȳ‘Á²‘º²‘³²‘¬²‘¥²‘ž²‘—²‘²‘‰²‘‚²‘{²‘t²‘m²‘f²‘_²‘X²‘Q²‘J²‘C²‘<²‘5²‘.²‘'²‘ ²‘²‘²‘ ²‘²‘ý±‘ö±‘ﱑ豑᱑Ú±‘Ó±‘̱‘ű‘¾±‘·±‘°±‘©±‘¢±‘›±‘”±‘±‘†±‘±‘x±‘q±‘j±‘c±‘\±‘U±‘N±‘G±‘@±‘9±‘2±‘+±‘$±‘±‘±‘±‘±‘±‘ú°‘ó°‘ì°‘å°‘Þ°‘×°‘а‘ɰ‘°‘»°‘´°‘­°‘¦°‘Ÿ°‘˜°‘‘°‘а‘ƒ°‘|°‘u°‘n°‘g°‘`°‘Y°‘R°‘K°‘D°‘=°‘6°‘/°‘(°‘!°‘°‘°‘ °‘°‘þ¯‘÷¯‘ð¯‘鯑⯑Û¯‘Ô¯‘ͯ‘Ư‘¿¯‘¸¯‘±¯‘ª¯‘£¯‘œ¯‘•¯‘ޝ‘‡¯‘€¯‘y¯‘r¯‘k¯‘d¯‘]¯‘V¯‘O¯‘H¯‘A¯‘:¯‘3¯‘,¯‘%¯‘¯‘¯‘¯‘ ¯‘¯‘û®‘ô®‘í®‘殑ß®‘Ø®‘Ñ®‘Ê®‘®‘µ®‘®®‘§®‘ ®‘™®‘’®‘‹®‘„®‘}®‘v®‘o®‘h®‘a®‘Z®‘S®‘L®‘E®‘>®‘7®‘0®‘)®‘"®‘®‘®‘ ®‘®‘ÿ­‘ø­‘ñ­‘ê­‘ã­‘Ü­‘Õ­‘έ‘Ç­‘À­‘¹­‘²­‘«­‘¤­‘­‘–­‘­‘ˆ­‘­‘z­‘s­‘l­‘e­‘^­‘W­‘P­‘I­‘B­‘;­‘4­‘-­‘&­‘­‘­‘­‘ ­‘­‘ü¬‘õ¬‘笑଑Ù¬‘Ò¬‘ˬ‘Ĭ‘½¬‘¶¬‘¯¬‘¨¬‘¡¬‘𬑓¬‘Œ¬‘…¬‘~¬‘w¬‘p¬‘i¬‘b¬‘[¬‘T¬‘M¬‘F¬‘?¬‘8¬‘1¬‘*¬‘#¬‘¬‘¬‘¬‘¬‘¬‘ù«‘ò«‘ë«‘ä«‘Ý«‘Ö«‘Ï«‘È«‘Á«‘º«‘³«‘¬«‘¥«‘ž«‘—«‘«‘‰«‘‚«‘{«‘t«‘m«‘f«‘_«‘X«‘Q«‘J«‘C«‘<«‘5«‘.«‘'«‘ «‘«‘«‘ «‘«‘ýª‘öª‘晴誑᪑Úª‘Óª‘̪‘Ū‘¾ª‘·ª‘°ª‘©ª‘¢ª‘›ª‘”ª‘ª‘†ª‘ª‘xª‘qª‘jª‘cª‘\ª‘Uª‘Nª‘Gª‘@ª‘9ª‘2ª‘+ª‘$ª‘ª‘ª‘ª‘ª‘ª‘ú©‘ó©‘ì©‘å©‘Þ©‘ש‘Щ‘É©‘©‘»©‘´©‘­©‘¦©‘Ÿ©‘˜©‘‘©‘Š©‘ƒ©‘|©‘u©‘n©‘g©‘`©‘Y©‘R©‘K©‘D©‘=©‘6©‘/©‘(©‘!©‘©‘©‘ ©‘©‘þ¨‘÷¨‘ð¨‘騑⨑Û¨‘Ô¨‘ͨ‘ƨ‘¿¨‘¸¨‘±¨‘ª¨‘£¨‘œ¨‘•¨‘ލ‘‡¨‘€¨‘y¨‘r¨‘k¨‘d¨‘]¨‘V¨‘O¨‘H¨‘A¨‘:¨‘3¨‘,¨‘%¨‘¨‘¨‘¨‘ ¨‘¨‘û§‘ô§‘í§‘æ§‘ß§‘ا‘ѧ‘ʧ‘瑼§‘µ§‘®§‘§§‘ §‘™§‘’§‘‹§‘„§‘}§‘v§‘o§‘h§‘a§‘Z§‘S§‘L§‘E§‘>§‘7§‘0§‘)§‘"§‘§‘§‘ §‘§‘ÿ¦‘ø¦‘ñ¦‘ꦑ㦑ܦ‘Õ¦‘Φ‘Ǧ‘À¦‘¹¦‘²¦‘«¦‘¤¦‘¦‘–¦‘¦‘ˆ¦‘¦‘z¦‘s¦‘l¦‘e¦‘^¦‘W¦‘P¦‘I¦‘B¦‘;¦‘4¦‘-¦‘&¦‘¦‘¦‘¦‘ ¦‘¦‘ü¥‘õ¥‘祑॑Ù¥‘Ò¥‘Ë¥‘Ä¥‘½¥‘¶¥‘¯¥‘¨¥‘¡¥‘𥑓¥‘Œ¥‘…¥‘~¥‘w¥‘p¥‘i¥‘b¥‘[¥‘T¥‘M¥‘F¥‘?¥‘8¥‘1¥‘*¥‘#¥‘¥‘¥‘¥‘¥‘¥‘ù¤‘ò¤‘뤑䤑ݤ‘Ö¤‘Ϥ‘Ȥ‘Á¤‘º¤‘³¤‘¬¤‘¥¤‘ž¤‘—¤‘¤‘‰¤‘‚¤‘{¤‘t¤‘m¤‘f¤‘_¤‘X¤‘Q¤‘J¤‘C¤‘<¤‘5¤‘.¤‘'¤‘ ¤‘¤‘¤‘ ¤‘¤‘ý£‘ö£‘裑ᣑÚ£‘Ó£‘Ì£‘Å£‘¾£‘·£‘°£‘©£‘¢£‘›£‘”£‘£‘†£‘£‘x£‘q£‘j£‘c£‘\£‘U£‘N£‘G£‘@£‘9£‘2£‘+£‘$£‘£‘£‘£‘£‘£‘ú¢‘ó¢‘좑墑Þ¢‘×¢‘Т‘É¢‘¢‘»¢‘´¢‘­¢‘¦¢‘Ÿ¢‘˜¢‘‘¢‘Š¢‘ƒ¢‘|¢‘u¢‘n¢‘g¢‘`¢‘Y¢‘R¢‘K¢‘D¢‘=¢‘6¢‘/¢‘(¢‘!¢‘¢‘¢‘ ¢‘¢‘þ¡‘÷¡‘ð¡‘é¡‘â¡‘Û¡‘Ô¡‘Í¡‘Æ¡‘¿¡‘¸¡‘±¡‘ª¡‘£¡‘œ¡‘•¡‘Ž¡‘‡¡‘€¡‘y¡‘r¡‘k¡‘d¡‘]¡‘V¡‘O¡‘H¡‘A¡‘:¡‘3¡‘,¡‘%¡‘¡‘¡‘¡‘ ¡‘¡‘û ‘ô ‘í ‘æ ‘ß ‘Ø ‘Ñ ‘Ê ‘à‘¼ ‘µ ‘® ‘§ ‘  ‘™ ‘’ ‘‹ ‘„ ‘} ‘v ‘o ‘h ‘a ‘Z ‘S ‘L ‘E ‘> ‘7 ‘0 ‘) ‘" ‘ ‘ ‘  ‘ ‘ÿŸ‘øŸ‘ñŸ‘ꟑ㟑ÜŸ‘ÕŸ‘Ο‘ÇŸ‘ÀŸ‘¹Ÿ‘²Ÿ‘«Ÿ‘¤Ÿ‘Ÿ‘–Ÿ‘Ÿ‘ˆŸ‘Ÿ‘zŸ‘sŸ‘lŸ‘eŸ‘^Ÿ‘WŸ‘PŸ‘IŸ‘BŸ‘;Ÿ‘4Ÿ‘-Ÿ‘&Ÿ‘Ÿ‘Ÿ‘Ÿ‘ Ÿ‘Ÿ‘üž‘õž‘îž‘çž‘àž‘Ùž‘Òž‘Ëž‘Äž‘½ž‘¶ž‘¯ž‘¨ž‘¡ž‘šž‘“ž‘Œž‘…ž‘~ž‘wž‘pž‘iž‘bž‘[ž‘Tž‘Mž‘Fž‘?ž‘8ž‘1ž‘*ž‘#ž‘ž‘ž‘ž‘ž‘ž‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýœ‘öœ‘蜑ᜑÚœ‘Óœ‘Ìœ‘Åœ‘¾œ‘·œ‘°œ‘©œ‘¢œ‘›œ‘”œ‘œ‘†œ‘œ‘xœ‘qœ‘jœ‘cœ‘\œ‘Uœ‘Nœ‘Gœ‘@œ‘9œ‘2œ‘+œ‘$œ‘œ‘œ‘œ‘œ‘œ‘ú›‘ó›‘웑囑Þ›‘×›‘Л‘É›‘›‘»›‘´›‘­›‘¦›‘Ÿ›‘˜›‘‘›‘Š›‘ƒ›‘|›‘u›‘n›‘g›‘`›‘Y›‘R›‘K›‘D›‘=›‘6›‘/›‘(›‘!›‘›‘›‘ ›‘›‘þš‘÷š‘ðš‘隑⚑ۚ‘Ôš‘Íš‘Æš‘¿š‘¸š‘±š‘ªš‘£š‘œš‘•š‘Žš‘‡š‘€š‘yš‘rš‘kš‘dš‘]š‘Vš‘Oš‘Hš‘Aš‘:š‘3š‘,š‘%š‘š‘š‘š‘ š‘š‘û™‘ô™‘홑晑ß™‘Ø™‘Ñ™‘Ê™‘Ù‘¼™‘µ™‘®™‘§™‘ ™‘™™‘’™‘‹™‘„™‘}™‘v™‘o™‘h™‘a™‘Z™‘S™‘L™‘E™‘>™‘7™‘0™‘)™‘"™‘™‘™‘ ™‘™‘ÿ˜‘ø˜‘ñ˜‘ꘑ㘑ܘ‘Õ˜‘Θ‘ǘ‘À˜‘¹˜‘²˜‘«˜‘¤˜‘˜‘–˜‘˜‘ˆ˜‘˜‘z˜‘s˜‘l˜‘e˜‘^˜‘W˜‘P˜‘I˜‘B˜‘;˜‘4˜‘-˜‘&˜‘˜‘˜‘˜‘ ˜‘˜‘ü—‘õ—‘î—‘ç—‘à—‘Ù—‘Ò—‘Ë—‘Ä—‘½—‘¶—‘¯—‘¨—‘¡—‘š—‘“—‘Œ—‘…—‘~—‘w—‘p—‘i—‘b—‘[—‘T—‘M—‘F—‘?—‘8—‘1—‘*—‘#—‘—‘—‘—‘—‘—‘ù–‘ò–‘ë–‘ä–‘Ý–‘Ö–‘Ï–‘È–‘Á–‘º–‘³–‘¬–‘¥–‘ž–‘—–‘–‘‰–‘‚–‘{–‘t–‘m–‘f–‘_–‘X–‘Q–‘J–‘C–‘<–‘5–‘.–‘'–‘ –‘–‘–‘ –‘–‘ý•‘ö•‘ï•‘è•‘á•‘Ú•‘Ó•‘Ì•‘Å•‘¾•‘·•‘°•‘©•‘¢•‘›•‘”•‘•‘†•‘•‘x•‘q•‘j•‘c•‘\•‘U•‘N•‘G•‘@•‘9•‘2•‘+•‘$•‘•‘•‘•‘•‘•‘ú”‘ó”‘씑唑Þ”‘×”‘Д‘É”‘”‘»”‘´”‘­”‘¦”‘Ÿ”‘˜”‘‘”‘Š”‘ƒ”‘|”‘u”‘n”‘g”‘`”‘Y”‘R”‘K”‘D”‘=”‘6”‘/”‘(”‘!”‘”‘”‘ ”‘”‘þ“‘÷“‘ð“‘é“‘â“‘Û“‘Ô“‘Í“‘Æ“‘¿“‘¸“‘±“‘ª“‘£“‘œ“‘•“‘Ž“‘‡“‘€“‘y“‘r“‘k“‘d“‘]“‘V“‘O“‘H“‘A“‘:“‘3“‘,“‘%“‘“‘“‘“‘ “‘“‘û’‘ô’‘í’‘æ’‘ß’‘Ø’‘Ñ’‘Ê’‘Ã’‘¼’‘µ’‘®’‘§’‘ ’‘™’‘’’‘‹’‘„’‘}’‘v’‘o’‘h’‘a’‘Z’‘S’‘L’‘E’‘>’‘7’‘0’‘)’‘"’‘’‘’‘ ’‘’‘ÿ‘‘ø‘‘ñ‘‘ê‘‘ã‘‘Ü‘‘Õ‘‘Α‘Ç‘‘À‘‘¹‘‘²‘‘«‘‘¤‘‘‘‘–‘‘‘‘ˆ‘‘‘‘z‘‘s‘‘l‘‘e‘‘^‘‘W‘‘P‘‘I‘‘B‘‘;‘‘4‘‘-‘‘&‘‘‘‘‘‘‘‘ ‘‘‘‘ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýŽ‘öŽ‘莑᎑ÚŽ‘ÓŽ‘ÌŽ‘ÅŽ‘¾Ž‘·Ž‘°Ž‘©Ž‘¢Ž‘›Ž‘”ޑޑ†Ž‘Ž‘xŽ‘qŽ‘jŽ‘cŽ‘\Ž‘UŽ‘NŽ‘GŽ‘@Ž‘9Ž‘2Ž‘+Ž‘$ޑޑޑޑޑޑú‘ó‘ì‘å‘Þ‘בБÉ‘‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þŒ‘÷Œ‘ðŒ‘錑⌑ÛŒ‘ÔŒ‘ÍŒ‘ÆŒ‘¿Œ‘¸Œ‘±Œ‘ªŒ‘£Œ‘œŒ‘•Œ‘ŽŒ‘‡Œ‘€Œ‘yŒ‘rŒ‘kŒ‘dŒ‘]Œ‘VŒ‘OŒ‘HŒ‘AŒ‘:Œ‘3Œ‘,Œ‘%Œ‘Œ‘Œ‘Œ‘ Œ‘Œ‘û‹‘ô‹‘í‹‘æ‹‘ß‹‘Ø‹‘Ñ‹‘Ê‹‘Ë‘¼‹‘µ‹‘®‹‘§‹‘ ‹‘™‹‘’‹‘‹‹‘„‹‘}‹‘v‹‘o‹‘h‹‘a‹‘Z‹‘S‹‘L‹‘E‹‘>‹‘7‹‘0‹‘)‹‘"‹‘‹‘‹‘ ‹‘‹‘ÿŠ‘øŠ‘ñŠ‘ꊑ㊑ÜŠ‘ÕŠ‘Ί‘ÇŠ‘ÀŠ‘¹Š‘²Š‘«Š‘¤Š‘Š‘–ББˆŠ‘Š‘zŠ‘sŠ‘lŠ‘eŠ‘^Š‘WŠ‘PŠ‘IŠ‘BŠ‘;Š‘4Š‘-Š‘&ББББ ББü‰‘õ‰‘牑à‰‘Ù‰‘Ò‰‘ˉ‘ĉ‘½‰‘¶‰‘¯‰‘¨‰‘¡‰‘š‰‘“‰‘Œ‰‘…‰‘~‰‘w‰‘p‰‘i‰‘b‰‘[‰‘T‰‘M‰‘F‰‘?‰‘8‰‘1‰‘*‰‘#‰‘‰‘‰‘‰‘‰‘‰‘ùˆ‘òˆ‘눑䈑݈‘Öˆ‘ψ‘Ȉ‘Áˆ‘ºˆ‘³ˆ‘¬ˆ‘¥ˆ‘žˆ‘—ˆ‘ˆ‘‰ˆ‘‚ˆ‘{ˆ‘tˆ‘mˆ‘fˆ‘_ˆ‘Xˆ‘Qˆ‘Jˆ‘Cˆ‘<ˆ‘5ˆ‘.ˆ‘'ˆ‘ ˆ‘ˆ‘ˆ‘ ˆ‘ˆ‘ý‡‘ö‡‘臑ᇑÚ‡‘Ó‡‘̇‘Ň‘¾‡‘·‡‘°‡‘©‡‘¢‡‘›‡‘”‡‘‡‘†‡‘‡‘x‡‘q‡‘j‡‘c‡‘\‡‘U‡‘N‡‘G‡‘@‡‘9‡‘2‡‘+‡‘$‡‘‡‘‡‘‡‘‡‘‡‘ú†‘ó†‘솑冑Þ†‘׆‘І‘Ɇ‘†‘»†‘´†‘­†‘¦†‘Ÿ†‘˜†‘‘†‘І‘ƒ†‘|†‘u†‘n†‘g†‘`†‘Y†‘R†‘K†‘D†‘=†‘6†‘/†‘(†‘!†‘†‘†‘ †‘†‘þ…‘÷…‘ð…‘é…‘â…‘Û…‘Ô…‘Í…‘Æ…‘¿…‘¸…‘±…‘ª…‘£…‘œ…‘•…‘Ž…‘‡…‘€…‘y…‘r…‘k…‘d…‘]…‘V…‘O…‘H…‘A…‘:…‘3…‘,…‘%…‘…‘…‘…‘ …‘…‘û„‘ô„‘í„‘æ„‘ß„‘Ø„‘Ñ„‘Ê„‘Ä‘¼„‘µ„‘®„‘§„‘ „‘™„‘’„‘‹„‘„„‘}„‘v„‘o„‘h„‘a„‘Z„‘S„‘L„‘E„‘>„‘7„‘0„‘)„‘"„‘„‘„‘ „‘„‘ÿƒ‘øƒ‘ñƒ‘ꃑパ܃‘Õƒ‘΃‘ǃ‘Àƒ‘¹ƒ‘²ƒ‘«ƒ‘¤ƒ‘ƒ‘–ƒ‘ƒ‘ˆƒ‘ƒ‘zƒ‘sƒ‘lƒ‘eƒ‘^ƒ‘Wƒ‘Pƒ‘Iƒ‘Bƒ‘;ƒ‘4ƒ‘-ƒ‘&ƒ‘ƒ‘ƒ‘ƒ‘ ƒ‘ƒ‘ü‚‘õ‚‘î‚‘ç‚‘à‚‘Ù‚‘Ò‚‘Ë‚‘Ä‚‘½‚‘¶‚‘¯‚‘¨‚‘¡‚‘š‚‘“‚‘Œ‚‘…‚‘~‚‘w‚‘p‚‘i‚‘b‚‘[‚‘T‚‘M‚‘F‚‘?‚‘8‚‘1‚‘*‚‘#‚‘‚‘‚‘‚‘‚‘‚‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ý€‘ö€‘耑ထÚ€‘Ó€‘Ì€‘Å€‘¾€‘·€‘°€‘©€‘¢€‘›€‘”€‘€‘†€‘€‘x€‘q€‘j€‘c€‘\€‘U€‘N€‘G€‘@€‘9€‘2€‘+€‘$€‘€‘€‘€‘€‘€‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ~‘÷~‘ð~‘é~‘â~‘Û~‘Ô~‘Í~‘Æ~‘¿~‘¸~‘±~‘ª~‘£~‘œ~‘•~‘Ž~‘‡~‘€~‘y~‘r~‘k~‘d~‘]~‘V~‘O~‘H~‘A~‘:~‘3~‘,~‘%~‘~‘~‘~‘ ~‘~‘û}‘ô}‘í}‘æ}‘ß}‘Ø}‘Ñ}‘Ê}‘Ã}‘¼}‘µ}‘®}‘§}‘ }‘™}‘’}‘‹}‘„}‘}}‘v}‘o}‘h}‘a}‘Z}‘S}‘L}‘E}‘>}‘7}‘0}‘)}‘"}‘}‘}‘ }‘}‘ÿ|‘ø|‘ñ|‘ê|‘ã|‘Ü|‘Õ|‘Î|‘Ç|‘À|‘¹|‘²|‘«|‘¤|‘|‘–|‘|‘ˆ|‘|‘z|‘s|‘l|‘e|‘^|‘W|‘P|‘I|‘B|‘;|‘4|‘-|‘&|‘|‘|‘|‘ |‘|‘ü{‘õ{‘î{‘ç{‘à{‘Ù{‘Ò{‘Ë{‘Ä{‘½{‘¶{‘¯{‘¨{‘¡{‘š{‘“{‘Œ{‘…{‘~{‘w{‘p{‘i{‘b{‘[{‘T{‘M{‘F{‘?{‘8{‘1{‘*{‘#{‘{‘{‘{‘{‘{‘ùz‘òz‘ëz‘äz‘Ýz‘Öz‘Ïz‘Èz‘Áz‘ºz‘³z‘¬z‘¥z‘žz‘—z‘z‘‰z‘‚z‘{z‘tz‘mz‘fz‘_z‘Xz‘Qz‘Jz‘Cz‘v‘7v‘0v‘)v‘"v‘v‘v‘ v‘v‘ÿu‘øu‘ñu‘êu‘ãu‘Üu‘Õu‘Îu‘Çu‘Àu‘¹u‘²u‘«u‘¤u‘u‘–u‘u‘ˆu‘u‘zu‘su‘lu‘eu‘^u‘Wu‘Pu‘Iu‘Bu‘;u‘4u‘-u‘&u‘u‘u‘u‘ u‘u‘üt‘õt‘ît‘çt‘àt‘Ùt‘Òt‘Ët‘Ät‘½t‘¶t‘¯t‘¨t‘¡t‘št‘“t‘Œt‘…t‘~t‘wt‘pt‘it‘bt‘[t‘Tt‘Mt‘Ft‘?t‘8t‘1t‘*t‘#t‘t‘t‘t‘t‘t‘ùs‘òs‘ës‘äs‘Ýs‘Ös‘Ïs‘Ès‘Ás‘ºs‘³s‘¬s‘¥s‘žs‘—s‘s‘‰s‘‚s‘{s‘ts‘ms‘fs‘_s‘Xs‘Qs‘Js‘Cs‘o‘7o‘0o‘)o‘"o‘o‘o‘ o‘o‘ÿn‘øn‘ñn‘ên‘ãn‘Ün‘Õn‘În‘Çn‘Àn‘¹n‘²n‘«n‘¤n‘n‘–n‘n‘ˆn‘n‘zn‘sn‘ln‘en‘^n‘Wn‘Pn‘In‘Bn‘;n‘4n‘-n‘&n‘n‘n‘n‘ n‘n‘üm‘õm‘îm‘çm‘àm‘Ùm‘Òm‘Ëm‘Äm‘½m‘¶m‘¯m‘¨m‘¡m‘šm‘“m‘Œm‘…m‘~m‘wm‘pm‘im‘bm‘[m‘Tm‘Mm‘Fm‘?m‘8m‘1m‘*m‘#m‘m‘m‘m‘m‘m‘ùl‘òl‘ël‘äl‘Ýl‘Öl‘Ïl‘Èl‘Ál‘ºl‘³l‘¬l‘¥l‘žl‘—l‘l‘‰l‘‚l‘{l‘tl‘ml‘fl‘_l‘Xl‘Ql‘Jl‘Cl‘h‘7h‘0h‘)h‘"h‘h‘h‘ h‘h‘ÿg‘øg‘ñg‘êg‘ãg‘Üg‘Õg‘Îg‘Çg‘Àg‘¹g‘²g‘«g‘¤g‘g‘–g‘g‘ˆg‘g‘zg‘sg‘lg‘eg‘^g‘Wg‘Pg‘Ig‘Bg‘;g‘4g‘-g‘&g‘g‘g‘g‘ g‘g‘üf‘õf‘îf‘çf‘àf‘Ùf‘Òf‘Ëf‘Äf‘½f‘¶f‘¯f‘¨f‘¡f‘šf‘“f‘Œf‘…f‘~f‘wf‘pf‘if‘bf‘[f‘Tf‘Mf‘Ff‘?f‘8f‘1f‘*f‘#f‘f‘f‘f‘f‘f‘ùe‘òe‘ëe‘äe‘Ýe‘Öe‘Ïe‘Èe‘Áe‘ºe‘³e‘¬e‘¥e‘že‘—e‘e‘‰e‘‚e‘{e‘te‘me‘fe‘_e‘Xe‘Qe‘Je‘Ce‘a‘7a‘0a‘)a‘"a‘a‘a‘ a‘a‘ÿ`‘ø`‘ñ`‘ê`‘ã`‘Ü`‘Õ`‘Î`‘Ç`‘À`‘¹`‘²`‘«`‘¤`‘`‘–`‘`‘ˆ`‘`‘z`‘s`‘l`‘e`‘^`‘W`‘P`‘I`‘B`‘;`‘4`‘-`‘&`‘`‘`‘`‘ `‘`‘ü_‘õ_‘î_‘ç_‘à_‘Ù_‘Ò_‘Ë_‘Ä_‘½_‘¶_‘¯_‘¨_‘¡_‘š_‘“_‘Œ_‘…_‘~_‘w_‘p_‘i_‘b_‘[_‘T_‘M_‘F_‘?_‘8_‘1_‘*_‘#_‘_‘_‘_‘_‘_‘ù^‘ò^‘ë^‘ä^‘Ý^‘Ö^‘Ï^‘È^‘Á^‘º^‘³^‘¬^‘¥^‘ž^‘—^‘^‘‰^‘‚^‘{^‘t^‘m^‘f^‘_^‘X^‘Q^‘J^‘C^‘<^‘5^‘.^‘'^‘ ^‘^‘^‘ ^‘^‘ý]‘ö]‘ï]‘è]‘á]‘Ú]‘Ó]‘Ì]‘Å]‘¾]‘·]‘°]‘©]‘¢]‘›]‘”]‘]‘†]‘]‘x]‘q]‘j]‘c]‘\]‘U]‘N]‘G]‘@]‘9]‘2]‘+]‘$]‘]‘]‘]‘]‘]‘ú\‘ó\‘ì\‘å\‘Þ\‘×\‘Ð\‘É\‘Â\‘»\‘´\‘­\‘¦\‘Ÿ\‘˜\‘‘\‘Š\‘ƒ\‘|\‘u\‘n\‘g\‘`\‘Y\‘R\‘K\‘D\‘=\‘6\‘/\‘(\‘!\‘\‘\‘ \‘\‘þ[‘÷[‘ð[‘é[‘â[‘Û[‘Ô[‘Í[‘Æ[‘¿[‘¸[‘±[‘ª[‘£[‘œ[‘•[‘Ž[‘‡[‘€[‘y[‘r[‘k[‘d[‘][‘V[‘O[‘H[‘A[‘:[‘3[‘,[‘%[‘[‘[‘[‘ [‘[‘ûZ‘ôZ‘íZ‘æZ‘ßZ‘ØZ‘ÑZ‘ÊZ‘ÃZ‘¼Z‘µZ‘®Z‘§Z‘ Z‘™Z‘’Z‘‹Z‘„Z‘}Z‘vZ‘oZ‘hZ‘aZ‘ZZ‘SZ‘LZ‘EZ‘>Z‘7Z‘0Z‘)Z‘"Z‘Z‘Z‘ Z‘Z‘ÿY‘øY‘ñY‘êY‘ãY‘ÜY‘ÕY‘ÎY‘ÇY‘ÀY‘¹Y‘²Y‘«Y‘¤Y‘Y‘–Y‘Y‘ˆY‘Y‘zY‘sY‘lY‘eY‘^Y‘WY‘PY‘IY‘BY‘;Y‘4Y‘-Y‘&Y‘Y‘Y‘Y‘ Y‘Y‘üX‘õX‘îX‘çX‘àX‘ÙX‘ÒX‘ËX‘ÄX‘½X‘¶X‘¯X‘¨X‘¡X‘šX‘“X‘ŒX‘…X‘~X‘wX‘pX‘iX‘bX‘[X‘TX‘MX‘FX‘?X‘8X‘1X‘*X‘#X‘X‘X‘X‘X‘X‘ùW‘òW‘ëW‘äW‘ÝW‘ÖW‘ÏW‘ÈW‘ÁW‘ºW‘³W‘¬W‘¥W‘žW‘—W‘W‘‰W‘‚W‘{W‘tW‘mW‘fW‘_W‘XW‘QW‘JW‘CW‘S‘7S‘0S‘)S‘"S‘S‘S‘ S‘S‘ÿR‘øR‘ñR‘êR‘ãR‘ÜR‘ÕR‘ÎR‘ÇR‘ÀR‘¹R‘²R‘«R‘¤R‘R‘–R‘R‘ˆR‘R‘zR‘sR‘lR‘eR‘^R‘WR‘PR‘IR‘BR‘;R‘4R‘-R‘&R‘R‘R‘R‘ R‘R‘üQ‘õQ‘îQ‘çQ‘àQ‘ÙQ‘ÒQ‘ËQ‘ÄQ‘½Q‘¶Q‘¯Q‘¨Q‘¡Q‘šQ‘“Q‘ŒQ‘…Q‘~Q‘wQ‘pQ‘iQ‘bQ‘[Q‘TQ‘MQ‘FQ‘?Q‘8Q‘1Q‘*Q‘#Q‘Q‘Q‘Q‘Q‘Q‘ùP‘òP‘ëP‘äP‘ÝP‘ÖP‘ÏP‘ÈP‘ÁP‘ºP‘³P‘¬P‘¥P‘žP‘—P‘P‘‰P‘‚P‘{P‘tP‘mP‘fP‘_P‘XP‘QP‘JP‘CP‘L‘7L‘0L‘)L‘"L‘L‘L‘ L‘L‘ÿK‘øK‘ñK‘êK‘ãK‘ÜK‘ÕK‘ÎK‘ÇK‘ÀK‘¹K‘²K‘«K‘¤K‘K‘–K‘K‘ˆK‘K‘zK‘sK‘lK‘eK‘^K‘WK‘PK‘IK‘BK‘;K‘4K‘-K‘&K‘K‘K‘K‘ K‘K‘üJ‘õJ‘îJ‘çJ‘àJ‘ÙJ‘ÒJ‘ËJ‘ÄJ‘½J‘¶J‘¯J‘¨J‘¡J‘šJ‘“J‘ŒJ‘…J‘~J‘wJ‘pJ‘iJ‘bJ‘[J‘TJ‘MJ‘FJ‘?J‘8J‘1J‘*J‘#J‘J‘J‘J‘J‘J‘ùI‘òI‘ëI‘äI‘ÝI‘ÖI‘ÏI‘ÈI‘ÁI‘ºI‘³I‘¬I‘¥I‘žI‘—I‘I‘‰I‘‚I‘{I‘tI‘mI‘fI‘_I‘XI‘QI‘JI‘CI‘E‘7E‘0E‘)E‘"E‘E‘E‘ E‘E‘ÿD‘øD‘ñD‘êD‘ãD‘ÜD‘ÕD‘ÎD‘ÇD‘ÀD‘¹D‘²D‘«D‘¤D‘D‘–D‘D‘ˆD‘D‘zD‘sD‘lD‘eD‘^D‘WD‘PD‘ID‘BD‘;D‘4D‘-D‘&D‘D‘D‘D‘ D‘D‘üC‘õC‘îC‘çC‘àC‘ÙC‘ÒC‘ËC‘ÄC‘½C‘¶C‘¯C‘¨C‘¡C‘šC‘“C‘ŒC‘…C‘~C‘wC‘pC‘iC‘bC‘[C‘TC‘MC‘FC‘?C‘8C‘1C‘*C‘#C‘C‘C‘C‘C‘C‘ùB‘òB‘ëB‘äB‘ÝB‘ÖB‘ÏB‘ÈB‘ÁB‘ºB‘³B‘¬B‘¥B‘žB‘—B‘B‘‰B‘‚B‘{B‘tB‘mB‘fB‘_B‘XB‘QB‘JB‘CB‘‘ô>‘í>‘æ>‘ß>‘Ø>‘Ñ>‘Ê>‘Ã>‘¼>‘µ>‘®>‘§>‘ >‘™>‘’>‘‹>‘„>‘}>‘v>‘o>‘h>‘a>‘Z>‘S>‘L>‘E>‘>>‘7>‘0>‘)>‘">‘>‘>‘ >‘>‘ÿ=‘ø=‘ñ=‘ê=‘ã=‘Ü=‘Õ=‘Î=‘Ç=‘À=‘¹=‘²=‘«=‘¤=‘=‘–=‘=‘ˆ=‘=‘z=‘s=‘l=‘e=‘^=‘W=‘P=‘I=‘B=‘;=‘4=‘-=‘&=‘=‘=‘=‘ =‘=‘ü<‘õ<‘î<‘ç<‘à<‘Ù<‘Ò<‘Ë<‘Ä<‘½<‘¶<‘¯<‘¨<‘¡<‘š<‘“<‘Œ<‘…<‘~<‘w<‘p<‘i<‘b<‘[<‘T<‘M<‘F<‘?<‘8<‘1<‘*<‘#<‘<‘<‘<‘<‘<‘ù;‘ò;‘ë;‘ä;‘Ý;‘Ö;‘Ï;‘È;‘Á;‘º;‘³;‘¬;‘¥;‘ž;‘—;‘;‘‰;‘‚;‘{;‘t;‘m;‘f;‘_;‘X;‘Q;‘J;‘C;‘<;‘5;‘.;‘';‘ ;‘;‘;‘ ;‘;‘ý:‘ö:‘ï:‘è:‘á:‘Ú:‘Ó:‘Ì:‘Å:‘¾:‘·:‘°:‘©:‘¢:‘›:‘”:‘:‘†:‘:‘x:‘q:‘j:‘c:‘\:‘U:‘N:‘G:‘@:‘9:‘2:‘+:‘$:‘:‘:‘:‘:‘:‘ú9‘ó9‘ì9‘å9‘Þ9‘×9‘Ð9‘É9‘Â9‘»9‘´9‘­9‘¦9‘Ÿ9‘˜9‘‘9‘Š9‘ƒ9‘|9‘u9‘n9‘g9‘`9‘Y9‘R9‘K9‘D9‘=9‘69‘/9‘(9‘!9‘9‘9‘ 9‘9‘þ8‘÷8‘ð8‘é8‘â8‘Û8‘Ô8‘Í8‘Æ8‘¿8‘¸8‘±8‘ª8‘£8‘œ8‘•8‘Ž8‘‡8‘€8‘y8‘r8‘k8‘d8‘]8‘V8‘O8‘H8‘A8‘:8‘38‘,8‘%8‘8‘8‘8‘ 8‘8‘û7‘ô7‘í7‘æ7‘ß7‘Ø7‘Ñ7‘Ê7‘Ã7‘¼7‘µ7‘®7‘§7‘ 7‘™7‘’7‘‹7‘„7‘}7‘v7‘o7‘h7‘a7‘Z7‘S7‘L7‘E7‘>7‘77‘07‘)7‘"7‘7‘7‘ 7‘7‘ÿ6‘ø6‘ñ6‘ê6‘ã6‘Ü6‘Õ6‘Î6‘Ç6‘À6‘¹6‘²6‘«6‘¤6‘6‘–6‘6‘ˆ6‘6‘z6‘s6‘l6‘e6‘^6‘W6‘P6‘I6‘B6‘;6‘46‘-6‘&6‘6‘6‘6‘ 6‘6‘ü5‘õ5‘î5‘ç5‘à5‘Ù5‘Ò5‘Ë5‘Ä5‘½5‘¶5‘¯5‘¨5‘¡5‘š5‘“5‘Œ5‘…5‘~5‘w5‘p5‘i5‘b5‘[5‘T5‘M5‘F5‘?5‘85‘15‘*5‘#5‘5‘5‘5‘5‘5‘ù4‘ò4‘ë4‘ä4‘Ý4‘Ö4‘Ï4‘È4‘Á4‘º4‘³4‘¬4‘¥4‘ž4‘—4‘4‘‰4‘‚4‘{4‘t4‘m4‘f4‘_4‘X4‘Q4‘J4‘C4‘<4‘54‘.4‘'4‘ 4‘4‘4‘ 4‘4‘ý3‘ö3‘ï3‘è3‘á3‘Ú3‘Ó3‘Ì3‘Å3‘¾3‘·3‘°3‘©3‘¢3‘›3‘”3‘3‘†3‘3‘x3‘q3‘j3‘c3‘\3‘U3‘N3‘G3‘@3‘93‘23‘+3‘$3‘3‘3‘3‘3‘3‘ú2‘ó2‘ì2‘å2‘Þ2‘×2‘Ð2‘É2‘Â2‘»2‘´2‘­2‘¦2‘Ÿ2‘˜2‘‘2‘Š2‘ƒ2‘|2‘u2‘n2‘g2‘`2‘Y2‘R2‘K2‘D2‘=2‘62‘/2‘(2‘!2‘2‘2‘ 2‘2‘þ1‘÷1‘ð1‘é1‘â1‘Û1‘Ô1‘Í1‘Æ1‘¿1‘¸1‘±1‘ª1‘£1‘œ1‘•1‘Ž1‘‡1‘€1‘y1‘r1‘k1‘d1‘]1‘V1‘O1‘H1‘A1‘:1‘31‘,1‘%1‘1‘1‘1‘ 1‘1‘û0‘ô0‘í0‘æ0‘ß0‘Ø0‘Ñ0‘Ê0‘Ã0‘¼0‘µ0‘®0‘§0‘ 0‘™0‘’0‘‹0‘„0‘}0‘v0‘o0‘h0‘a0‘Z0‘S0‘L0‘E0‘>0‘70‘00‘)0‘"0‘0‘0‘ 0‘0‘ÿ/‘ø/‘ñ/‘ê/‘ã/‘Ü/‘Õ/‘Î/‘Ç/‘À/‘¹/‘²/‘«/‘¤/‘/‘–/‘/‘ˆ/‘/‘z/‘s/‘l/‘e/‘^/‘W/‘P/‘I/‘B/‘;/‘4/‘-/‘&/‘/‘/‘/‘ /‘/‘ü.‘õ.‘î.‘ç.‘à.‘Ù.‘Ò.‘Ë.‘Ä.‘½.‘¶.‘¯.‘¨.‘¡.‘š.‘“.‘Œ.‘….‘~.‘w.‘p.‘i.‘b.‘[.‘T.‘M.‘F.‘?.‘8.‘1.‘*.‘#.‘.‘.‘.‘.‘.‘ù-‘ò-‘ë-‘ä-‘Ý-‘Ö-‘Ï-‘È-‘Á-‘º-‘³-‘¬-‘¥-‘ž-‘—-‘-‘‰-‘‚-‘{-‘t-‘m-‘f-‘_-‘X-‘Q-‘J-‘C-‘<-‘5-‘.-‘'-‘ -‘-‘-‘ -‘-‘ý,‘ö,‘ï,‘è,‘á,‘Ú,‘Ó,‘Ì,‘Å,‘¾,‘·,‘°,‘©,‘¢,‘›,‘”,‘,‘†,‘,‘x,‘q,‘j,‘c,‘\,‘U,‘N,‘G,‘@,‘9,‘2,‘+,‘$,‘,‘,‘,‘,‘,‘ú+‘ó+‘ì+‘å+‘Þ+‘×+‘Ð+‘É+‘Â+‘»+‘´+‘­+‘¦+‘Ÿ+‘˜+‘‘+‘Š+‘ƒ+‘|+‘u+‘n+‘g+‘`+‘Y+‘R+‘K+‘D+‘=+‘6+‘/+‘(+‘!+‘+‘+‘ +‘+‘þ*‘÷*‘ð*‘é*‘â*‘Û*‘Ô*‘Í*‘Æ*‘¿*‘¸*‘±*‘ª*‘£*‘œ*‘•*‘Ž*‘‡*‘€*‘y*‘r*‘k*‘d*‘]*‘V*‘O*‘H*‘A*‘:*‘3*‘,*‘%*‘*‘*‘*‘ *‘*‘û)‘ô)‘í)‘æ)‘ß)‘Ø)‘Ñ)‘Ê)‘Ã)‘¼)‘µ)‘®)‘§)‘ )‘™)‘’)‘‹)‘„)‘})‘v)‘o)‘h)‘a)‘Z)‘S)‘L)‘E)‘>)‘7)‘0)‘))‘")‘)‘)‘ )‘)‘ÿ(‘ø(‘ñ(‘ê(‘ã(‘Ü(‘Õ(‘Î(‘Ç(‘À(‘¹(‘²(‘«(‘¤(‘(‘–(‘(‘ˆ(‘(‘z(‘s(‘l(‘e(‘^(‘W(‘P(‘I(‘B(‘;(‘4(‘-(‘&(‘(‘(‘(‘ (‘(‘ü'‘õ'‘î'‘ç'‘à'‘Ù'‘Ò'‘Ë'‘Ä'‘½'‘¶'‘¯'‘¨'‘¡'‘š'‘“'‘Œ'‘…'‘~'‘w'‘p'‘i'‘b'‘['‘T'‘M'‘F'‘?'‘8'‘1'‘*'‘#'‘'‘'‘'‘'‘'‘ù&‘ò&‘ë&‘ä&‘Ý&‘Ö&‘Ï&‘È&‘Á&‘º&‘³&‘¬&‘¥&‘ž&‘—&‘&‘‰&‘‚&‘{&‘t&‘m&‘f&‘_&‘X&‘Q&‘J&‘C&‘<&‘5&‘.&‘'&‘ &‘&‘&‘ &‘&‘ý%‘ö%‘ï%‘è%‘á%‘Ú%‘Ó%‘Ì%‘Å%‘¾%‘·%‘°%‘©%‘¢%‘›%‘”%‘%‘†%‘%‘x%‘q%‘j%‘c%‘\%‘U%‘N%‘G%‘@%‘9%‘2%‘+%‘$%‘%‘%‘%‘%‘%‘ú$‘ó$‘ì$‘å$‘Þ$‘×$‘Ð$‘É$‘Â$‘»$‘´$‘­$‘¦$‘Ÿ$‘˜$‘‘$‘Š$‘ƒ$‘|$‘u$‘n$‘g$‘`$‘Y$‘R$‘K$‘D$‘=$‘6$‘/$‘($‘!$‘$‘$‘ $‘$‘þ#‘÷#‘ð#‘é#‘â#‘Û#‘Ô#‘Í#‘Æ#‘¿#‘¸#‘±#‘ª#‘£#‘œ#‘•#‘Ž#‘‡#‘€#‘y#‘r#‘k#‘d#‘]#‘V#‘O#‘H#‘A#‘:#‘3#‘,#‘%#‘#‘#‘#‘ #‘#‘û"‘ô"‘í"‘æ"‘ß"‘Ø"‘Ñ"‘Ê"‘Ã"‘¼"‘µ"‘®"‘§"‘ "‘™"‘’"‘‹"‘„"‘}"‘v"‘o"‘h"‘a"‘Z"‘S"‘L"‘E"‘>"‘7"‘0"‘)"‘""‘"‘"‘ "‘"‘ÿ!‘ø!‘ñ!‘ê!‘ã!‘Ü!‘Õ!‘Î!‘Ç!‘À!‘¹!‘²!‘«!‘¤!‘!‘–!‘!‘ˆ!‘!‘z!‘s!‘l!‘e!‘^!‘W!‘P!‘I!‘B!‘;!‘4!‘-!‘&!‘!‘!‘!‘ !‘!‘ü ‘õ ‘î ‘ç ‘à ‘Ù ‘Ò ‘Ë ‘Ä ‘½ ‘¶ ‘¯ ‘¨ ‘¡ ‘š ‘“ ‘Œ ‘… ‘~ ‘w ‘p ‘i ‘b ‘[ ‘T ‘M ‘F ‘? ‘8 ‘1 ‘* ‘# ‘ ‘ ‘ ‘ ‘ ‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑǑÀ‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑǑÀ‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘û ‘ô ‘í ‘æ ‘ß ‘Ø ‘Ñ ‘Ê ‘à ‘¼ ‘µ ‘® ‘§ ‘  ‘™ ‘’ ‘‹ ‘„ ‘} ‘v ‘o ‘h ‘a ‘Z ‘S ‘L ‘E ‘> ‘7 ‘0 ‘) ‘" ‘ ‘ ‘ ‘ ‘ÿ ‘ø ‘ñ ‘ê ‘ã ‘Ü ‘Õ ‘Î ‘Ç ‘À ‘¹ ‘² ‘« ‘¤ ‘ ‘– ‘ ‘ˆ ‘ ‘z ‘s ‘l ‘e ‘^ ‘W ‘P ‘I ‘B ‘; ‘4 ‘- ‘& ‘ ‘ ‘ ‘ ‘ ‘ü ‘õ ‘î ‘ç ‘à ‘Ù ‘Ò ‘Ë ‘Ä ‘½ ‘¶ ‘¯ ‘¨ ‘¡ ‘š ‘“ ‘Œ ‘… ‘~ ‘w ‘p ‘i ‘b ‘[ ‘T ‘M ‘F ‘? ‘8 ‘1 ‘* ‘# ‘ ‘ ‘ ‘ ‘ ‘ù ‘ò ‘ë ‘ä ‘Ý ‘Ö ‘Ï ‘È ‘Á ‘º ‘³ ‘¬ ‘¥ ‘ž ‘— ‘ ‘‰ ‘‚ ‘{ ‘t ‘m ‘f ‘_ ‘X ‘Q ‘J ‘C ‘< ‘5 ‘. ‘' ‘ ‘ ‘ ‘ ‘ ‘ý ‘ö ‘ï ‘è ‘á ‘Ú ‘Ó ‘Ì ‘Å ‘¾ ‘· ‘° ‘© ‘¢ ‘› ‘” ‘ ‘† ‘ ‘x ‘q ‘j ‘c ‘\ ‘U ‘N ‘G ‘@ ‘9 ‘2 ‘+ ‘$ ‘ ‘ ‘ ‘ ‘ ‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑǑÀ‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘ú‘ó‘ì‘å‘ޑבБɑ‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘ûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¾õ¾î¾ç¾à¾Ù¾Ò¾˾ľ½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù½ò½ë½ä½ݽÖ½ϽȽÁ½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý¼ö¼ï¼è¼á¼Ú¼Ó¼̼ż¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú»ó»ì»å»Þ»×»лÉ»»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þº÷ºðºéºâºÛºÔºͺƺ¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººû¹ô¹í¹æ¹ß¹عѹʹù¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù¶ò¶ë¶ä¶ݶÖ¶϶ȶÁ¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ýµöµïµèµáµÚµÓµ̵ŵ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµú´ó´ì´å´Þ´×´дÉ´´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ³÷³ð³é³â³Û³Ô³ͳƳ¿³¸³±³ª³£³œ³•³޳‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û²ô²í²æ²ß²زѲʲò¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü°õ°î°ç°à°Ù°Ò°˰ݽ°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù¯ò¯ë¯ä¯ݯÖ¯ϯȯÁ¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú­ó­ì­å­Þ­×­ЭÉ­­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ¬÷¬ð¬é¬â¬Û¬Ô¬ͬƬ¿¬¸¬±¬ª¬£¬œ¬•¬ެ‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û«ô«í«æ«ß«Ø«Ñ«Ê«ë¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù¨ò¨ë¨ä¨ݨÖ¨ϨȨÁ¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý§ö§ï§è§á§Ú§Ó§̧ŧ¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú¦ó¦ì¦å¦Þ¦צЦɦ¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Цƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¤ô¤í¤æ¤ߤؤѤʤ伤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úŸóŸìŸåŸÞŸןПÉŸŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú˜ó˜ì˜å˜Þ˜טИɘ˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û–ô–í–æ–ß–Ø–Ñ–Ê–Ö¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú‘ó‘ì‘å‘Þ‘בБÉ‘‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹úŠóŠìŠåŠÞŠ׊ЊÉŠŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþ‰÷‰ð‰é‰â‰Û‰Ô‰͉Ɖ¿‰¸‰±‰ª‰£‰œ‰•‰މ‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰ûˆôˆíˆæˆ߈؈шʈȼˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü†õ†î†ç†à†Ù†Ò†ˆĆ½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„úƒóƒìƒåƒÞƒ׃ЃɃƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{ûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCws7s0s)s"sss ssÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCpl7l0l)l"lll llÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCie7e0e)e"eee eeÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCMI7I0I)I"III IIÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿŽøÿŽñÿŽêÿŽãÿŽÜÿŽÕÿŽÎÿŽÇÿŽÀÿ޹ÿ޲ÿŽ«ÿޤÿŽÿŽ–ÿŽÿŽˆÿŽÿŽzÿŽsÿŽlÿŽeÿŽ^ÿŽWÿŽPÿŽIÿŽBÿŽ;ÿŽ4ÿŽ-ÿŽ&ÿŽÿŽÿŽÿŽ ÿŽÿŽüþŽõþŽîþŽçþŽàþŽÙþŽÒþŽËþŽÄþ޽þ޶þޝþލþŽ¡þŽšþŽ“þŽŒþŽ…þŽ~þŽwþŽpþŽiþŽbþŽ[þŽTþŽMþŽFþŽ?þŽ8þŽ1þŽ*þŽ#þŽþŽþŽþŽþŽþŽùýŽòýŽëýŽäýŽÝýŽÖýŽÏýŽÈýŽÁýŽºý޳ýެýŽ¥ýŽžýŽ—ýŽýމýŽ‚ýŽ{ýŽtýŽmýŽfýŽ_ýŽXýŽQýŽJýŽCýŽ<ýŽ5ýŽ.ýŽ'ýŽ ýŽýŽýŽ ýŽýŽýüŽöüŽïüŽèüŽáüŽÚüŽÓüŽÌüŽÅü޾üŽ·üްüŽ©üŽ¢üŽ›üŽ”üŽüކüŽüŽxüŽqüŽjüŽcüŽ\üŽUüŽNüŽGüŽ@üŽ9üŽ2üŽ+üŽ$üŽüŽüŽüŽüŽüŽúûŽóûŽìûŽåûŽÞûŽ×ûŽÐûŽÉûŽÂûŽ»ûŽ´ûŽ­ûަûŽŸûŽ˜ûŽ‘ûŽŠûŽƒûŽ|ûŽuûŽnûŽgûŽ`ûŽYûŽRûŽKûŽDûŽ=ûŽ6ûŽ/ûŽ(ûŽ!ûŽûŽûŽ ûŽûŽþúŽ÷úŽðúŽéúŽâúŽÛúŽÔúŽÍúŽÆúŽ¿úޏúޱúŽªúŽ£úŽœúŽ•úŽŽúއúŽ€úŽyúŽrúŽkúŽdúŽ]úŽVúŽOúŽHúŽAúŽ:úŽ3úŽ,úŽ%úŽúŽúŽúŽ úŽúŽûùŽôùŽíùŽæùŽßùŽØùŽÑùŽÊùŽÃù޼ù޵ùŽ®ùާùŽ ùŽ™ùŽ’ùŽ‹ùŽ„ùŽ}ùŽvùŽoùŽhùŽaùŽZùŽSùŽLùŽEùŽ>ùŽ7ùŽ0ùŽ)ùŽ"ùŽùŽùŽ ùŽùŽÿøŽøøŽñøŽêøŽãøŽÜøŽÕøŽÎøŽÇøŽÀøŽ¹øŽ²øŽ«øŽ¤øŽøŽ–øŽøŽˆøŽøŽzøŽsøŽløŽeøŽ^øŽWøŽPøŽIøŽBøŽ;øŽ4øŽ-øŽ&øŽøŽøŽøŽ øŽøŽü÷Žõ÷Žî÷Žç÷Žà÷ŽÙ÷ŽÒ÷ŽË÷ŽÄ÷޽÷޶÷ޝ÷ލ÷Ž¡÷Žš÷Ž“÷ŽŒ÷Ž…÷Ž~÷Žw÷Žp÷Ži÷Žb÷Ž[÷ŽT÷ŽM÷ŽF÷Ž?÷Ž8÷Ž1÷Ž*÷Ž#÷Ž÷Ž÷Ž÷Ž÷Ž÷ŽùöŽòöŽëöŽäöŽÝöŽÖöŽÏöŽÈöŽÁöŽºö޳öެöŽ¥öŽžöŽ—öŽöމöŽ‚öŽ{öŽtöŽmöŽföŽ_öŽXöŽQöŽJöŽCöŽ<öŽ5öŽ.öŽ'öŽ öŽöŽöŽ öŽöŽýõŽöõŽïõŽèõŽáõŽÚõŽÓõŽÌõŽÅõ޾õŽ·õްõŽ©õŽ¢õŽ›õŽ”õŽõކõŽõŽxõŽqõŽjõŽcõŽ\õŽUõŽNõŽGõŽ@õŽ9õŽ2õŽ+õŽ$õŽõŽõŽõŽõŽõŽúôŽóôŽìôŽåôŽÞôŽ×ôŽÐôŽÉôŽÂôŽ»ôŽ´ôŽ­ôަôŽŸôŽ˜ôŽ‘ôŽŠôŽƒôŽ|ôŽuôŽnôŽgôŽ`ôŽYôŽRôŽKôŽDôŽ=ôŽ6ôŽ/ôŽ(ôŽ!ôŽôŽôŽ ôŽôŽþóŽ÷óŽðóŽéóŽâóŽÛóŽÔóŽÍóŽÆóŽ¿óޏóޱóŽªóŽ£óŽœóŽ•óŽŽóއóŽ€óŽyóŽróŽkóŽdóŽ]óŽVóŽOóŽHóŽAóŽ:óŽ3óŽ,óŽ%óŽóŽóŽóŽ óŽóŽûòŽôòŽíòŽæòŽßòŽØòŽÑòŽÊòŽÃò޼ò޵òŽ®òާòŽ òŽ™òŽ’òŽ‹òŽ„òŽ}òŽvòŽoòŽhòŽaòŽZòŽSòŽLòŽEòŽ>òŽ7òŽ0òŽ)òŽ"òŽòŽòŽ òŽòŽÿñŽøñŽññŽêñŽãñŽÜñŽÕñŽÎñŽÇñŽÀñ޹ñ޲ñŽ«ñޤñŽñŽ–ñŽñŽˆñŽñŽzñŽsñŽlñŽeñŽ^ñŽWñŽPñŽIñŽBñŽ;ñŽ4ñŽ-ñŽ&ñŽñŽñŽñŽ ñŽñŽüðŽõðŽîðŽçðŽàðŽÙðŽÒðŽËðŽÄð޽ð޶ðޝðލðŽ¡ðŽšðŽ“ðŽŒðŽ…ðŽ~ðŽwðŽpðŽiðŽbðŽ[ðŽTðŽMðŽFðŽ?ðŽ8ðŽ1ðŽ*ðŽ#ðŽðŽðŽðŽðŽðŽùïŽòïŽëïŽäïŽÝïŽÖïŽÏïŽÈïŽÁïŽïŽ‰ïŽ‚ïŽ{ïŽtïŽmïŽfïŽ_ïŽXïŽQïŽJïŽCïŽ<ïŽ5ïŽ.ïŽ'ïŽ ïŽïŽïŽ ïŽïŽýîŽöîŽïîŽèîŽáîŽÚîŽÓîŽÌîŽÅîŽîކîŽîŽxîŽqîŽjîŽcîŽ\îŽUîŽNîŽGîŽ@îŽ9îŽ2îŽ+îŽ$îŽîŽîŽîŽîŽîŽúíŽóíŽìíŽåíŽÞíŽ×íŽÐíŽÉíŽÂ펻펴펭펦펟페펑펊펃íŽ|íŽuíŽníŽgíŽ`íŽYíŽRíŽKíŽDíŽ=íŽ6íŽ/íŽ(íŽ!íŽíŽíŽ íŽíŽþìŽ÷ìŽðìŽéìŽâìŽÛìŽÔìŽÍìŽÆìŽ¿ìŽ¸ìŽ±ìŽªìŽ£ìŽœìŽ•ìŽŽìŽ‡ìŽ€ìŽyìŽrìŽkìŽdìŽ]ìŽVìŽOìŽHìŽAìŽ:ìŽ3ìŽ,ìŽ%ìŽìŽìŽìŽ ìŽìŽûëŽôëŽíëŽæëŽßëŽØëŽÑëŽÊëŽÃ뎼뎵뎮뎧뎠뎙뎒뎋뎄ëŽ}ëŽvëŽoëŽhëŽaëŽZëŽSëŽLëŽEëŽ>ëŽ7ëŽ0ëŽ)ëŽ"ëŽëŽëŽ ëŽëŽÿêŽøêŽñêŽêêŽãêŽÜêŽÕêŽÎêŽÇêŽÀꎹꎲꎫꎤêŽêŽ–êŽêŽˆêŽêŽzêŽsêŽlêŽeêŽ^êŽWêŽPêŽIêŽBêŽ;êŽ4êŽ-êŽ&êŽêŽêŽêŽ êŽêŽüéŽõéŽîéŽçéŽàéŽÙéŽÒéŽËéŽÄ鎽鎶鎯鎨鎡鎚鎓鎌鎅éŽ~éŽwéŽpéŽiéŽbéŽ[éŽTéŽMéŽFéŽ?éŽ8éŽ1éŽ*éŽ#éŽéŽéŽéŽéŽéŽùèŽòèŽëèŽäèŽÝèŽÖèŽÏèŽÈèŽÁ莺莳莬莥莞莗èŽèŽ‰èŽ‚èŽ{èŽtèŽmèŽfèŽ_èŽXèŽQèŽJèŽCèŽ<èŽ5èŽ.èŽ'èŽ èŽèŽèŽ èŽèŽýçŽöçŽïçŽèçŽáçŽÚçŽÓçŽÌçŽÅ玾玷现玩玢玛玔çŽçކçŽçŽxçŽqçŽjçŽcçŽ\çŽUçŽNçŽGçŽ@çŽ9çŽ2çŽ+çŽ$çŽçŽçŽçŽçŽçŽúæŽóæŽìæŽåæŽÞæŽ׿ŽÐæŽÉæŽÂ掻掴掭掦掟掘掑掊掃æŽ|æŽuæŽnæŽgæŽ`æŽYæŽRæŽKæŽDæŽ=æŽ6æŽ/æŽ(æŽ!æŽæŽæŽ æŽæŽþåŽ÷åŽðåŽéåŽâåŽÛåŽÔåŽÍåŽÆåŽ¿åŽ¸åŽ±åŽªåŽ£åŽœåŽ•åŽŽåŽ‡åŽ€åŽyåŽråŽkåŽdåŽ]åŽVåŽOåŽHåŽAåŽ:åŽ3åŽ,åŽ%åŽåŽåŽåŽ åŽåŽûäŽôäŽíäŽæäŽßäŽØäŽÑäŽÊäŽÃ䎼䎵䎮䎧䎠䎙䎒䎋䎄äŽ}äŽväŽoäŽhäŽaäŽZäŽSäŽLäŽEäŽ>äŽ7äŽ0äŽ)äŽ"äŽäŽäŽ äŽäŽÿãŽøãŽñãŽêãŽããŽÜãŽÕãŽÎãŽÇãŽÀ㎹㎲㎫㎤ãŽãŽ–ãŽãŽˆãŽãŽzãŽsãŽlãŽeãŽ^ãŽWãŽPãŽIãŽBãŽ;ãŽ4ãŽ-ãŽ&ãŽãŽãŽãŽ ãŽãŽüâŽõâŽîâŽçâŽàâŽÙâŽÒâŽËâŽÄ⎽⎶⎯⎨⎡⎚⎓⎌⎅âŽ~âŽwâŽpâŽiâŽbâŽ[âŽTâŽMâŽFâŽ?âŽ8âŽ1âŽ*âŽ#âŽâŽâŽâŽâŽâŽùáŽòáŽëáŽäáŽÝáŽÖáŽÏáŽÈáŽÁᎺᎳᎬᎥ᎞᎗áŽáŽ‰áŽ‚áŽ{áŽtáŽmáŽfáŽ_áŽXáŽQáŽJáŽCáŽ<áŽ5áŽ.áŽ'ᎠáŽáŽáŽ áŽáŽýàŽöàŽïàŽèàŽáàŽÚàŽÓàŽÌàŽÅàŽ¾àŽ·àŽ°àŽ©àŽ¢àŽ›àŽ”àŽàކàŽàŽxàŽqàŽjàŽcàŽ\àŽUàŽNàŽGàŽ@àŽ9àŽ2àŽ+àŽ$àŽàŽàŽàŽàŽàŽúߎóߎìߎåߎÞߎ×ߎÐߎÉߎÂߎ»ßŽ´ßŽ­ßŽ¦ßŽŸßŽ˜ßŽ‘ߎŠßŽƒßŽ|ߎuߎnߎgߎ`ߎYߎRߎKߎDߎ=ߎ6ߎ/ߎ(ߎ!ߎߎߎ ߎߎþÞŽ÷ÞŽðÞŽéÞŽâÞŽÛÞŽÔÞŽÍÞŽÆÞŽ¿ÞŽ¸ÞŽ±ÞŽªÞŽ£ÞŽœÞŽ•ÞŽŽÞŽ‡ÞŽ€ÞŽyÞŽrÞŽkÞŽdÞŽ]ÞŽVÞŽOÞŽHÞŽAÞŽ:ÞŽ3ÞŽ,ÞŽ%ÞŽÞŽÞŽÞŽ ÞŽÞŽûÝŽôÝŽíÝŽæÝŽßÝŽØÝŽÑÝŽÊÝŽÃÝŽ¼ÝŽµÝŽ®ÝŽ§ÝŽ ÝŽ™ÝŽ’ÝŽ‹ÝŽ„ÝŽ}ÝŽvÝŽoÝŽhÝŽaÝŽZÝŽSÝŽLÝŽEÝŽ>ÝŽ7ÝŽ0ÝŽ)ÝŽ"ÝŽÝŽÝŽ ÝŽÝŽÿÜŽøÜŽñÜŽêÜŽãÜŽÜÜŽÕÜŽÎÜŽÇÜŽÀÜŽ¹ÜŽ²ÜŽ«ÜŽ¤ÜŽÜŽ–ÜŽÜŽˆÜŽÜŽzÜŽsÜŽlÜŽeÜŽ^ÜŽWÜŽPÜŽIÜŽBÜŽ;ÜŽ4ÜŽ-ÜŽ&ÜŽÜŽÜŽÜŽ ÜŽÜŽüÛŽõÛŽîÛŽçÛŽàÛŽÙÛŽÒÛŽËÛŽÄÛŽ½ÛŽ¶ÛŽ¯ÛŽ¨ÛŽ¡ÛŽšÛŽ“ÛŽŒÛŽ…ÛŽ~ÛŽwÛŽpÛŽiÛŽbÛŽ[ÛŽTÛŽMÛŽFÛŽ?ÛŽ8ÛŽ1ÛŽ*ÛŽ#ÛŽÛŽÛŽÛŽÛŽÛŽùÚŽòÚŽëÚŽäÚŽÝÚŽÖÚŽÏÚŽÈÚŽÁÚŽºÚŽ³ÚŽ¬ÚŽ¥ÚŽžÚŽ—ÚŽÚŽ‰ÚŽ‚ÚŽ{ÚŽtÚŽmÚŽfÚŽ_ÚŽXÚŽQÚŽJÚŽCÚŽ<ÚŽ5ÚŽ.ÚŽ'ÚŽ ÚŽÚŽÚŽ ÚŽÚŽýÙŽöÙŽïÙŽèÙŽáÙŽÚÙŽÓÙŽÌÙŽÅÙŽ¾ÙŽ·ÙŽ°ÙŽ©ÙŽ¢ÙŽ›ÙŽ”ÙŽÙŽ†ÙŽÙŽxÙŽqÙŽjÙŽcÙŽ\ÙŽUÙŽNÙŽGÙŽ@ÙŽ9ÙŽ2ÙŽ+ÙŽ$ÙŽÙŽÙŽÙŽÙŽÙŽúØŽóØŽìØŽåØŽÞØŽרŽÐØŽÉØŽÂØŽ»ØŽ´ØŽ­ØŽ¦ØŽŸØŽ˜ØŽ‘ØŽŠØŽƒØŽ|ØŽuØŽnØŽgØŽ`ØŽYØŽRØŽKØŽDØŽ=ØŽ6ØŽ/ØŽ(ØŽ!ØŽØŽØŽ ØŽØŽþ׎÷׎ð׎é׎â׎Û׎Ô׎Í׎Æ×Ž¿×Ž¸×Ž±×Žª×Ž£×Žœ×Ž•׎Ž×Ž‡×Ž€×Žy׎r׎k׎d׎]׎V׎O׎H׎A׎:׎3׎,׎%׎׎׎׎ ׎׎ûÖŽôÖŽíÖŽæÖŽßÖŽØÖŽÑÖŽÊÖŽÃÖŽ¼ÖŽµÖŽ®ÖŽ§ÖŽ ÖŽ™ÖŽ’ÖŽ‹ÖŽ„ÖŽ}ÖŽvÖŽoÖŽhÖŽaÖŽZÖŽSÖŽLÖŽEÖŽ>ÖŽ7ÖŽ0ÖŽ)ÖŽ"ÖŽÖŽÖŽ ÖŽÖŽÿÕŽøÕŽñÕŽêÕŽãÕŽÜÕŽÕÕŽÎÕŽÇÕŽÀÕŽ¹ÕŽ²ÕŽ«ÕŽ¤ÕŽÕŽ–ÕŽÕŽˆÕŽÕŽzÕŽsÕŽlÕŽeÕŽ^ÕŽWÕŽPÕŽIÕŽBÕŽ;ÕŽ4ÕŽ-ÕŽ&ÕŽÕŽÕŽÕŽ ÕŽÕŽüÔŽõÔŽîÔŽçÔŽàÔŽÙÔŽÒÔŽËÔŽÄÔŽ½ÔŽ¶ÔŽ¯ÔŽ¨ÔŽ¡ÔŽšÔŽ“ÔŽŒÔŽ…ÔŽ~ÔŽwÔŽpÔŽiÔŽbÔŽ[ÔŽTÔŽMÔŽFÔŽ?ÔŽ8ÔŽ1ÔŽ*ÔŽ#ÔŽÔŽÔŽÔŽÔŽÔŽùÓŽòÓŽëÓŽäÓŽÝÓŽÖÓŽÏÓŽÈÓŽÁÓŽºÓŽ³ÓŽ¬ÓŽ¥ÓŽžÓŽ—ÓŽÓŽ‰ÓŽ‚ÓŽ{ÓŽtÓŽmÓŽfÓŽ_ÓŽXÓŽQÓŽJÓŽCÓŽ<ÓŽ5ÓŽ.ÓŽ'ÓŽ ÓŽÓŽÓŽ ÓŽÓŽýÒŽöÒŽïÒŽèÒŽáÒŽÚÒŽÓÒŽÌÒŽÅÒŽ¾ÒŽ·ÒŽ°ÒŽ©ÒŽ¢ÒŽ›ÒŽ”ÒŽÒŽ†ÒŽÒŽxÒŽqÒŽjÒŽcÒŽ\ÒŽUÒŽNÒŽGÒŽ@ÒŽ9ÒŽ2ÒŽ+ÒŽ$ÒŽÒŽÒŽÒŽÒŽÒŽúÑŽóÑŽìÑŽåÑŽÞÑŽ×ÑŽÐÑŽÉÑŽÂÑŽ»ÑŽ´ÑŽ­ÑŽ¦ÑŽŸÑŽ˜ÑŽ‘ÑŽŠÑŽƒÑŽ|ÑŽuÑŽnÑŽgÑŽ`ÑŽYÑŽRÑŽKÑŽDÑŽ=ÑŽ6ÑŽ/ÑŽ(ÑŽ!ÑŽÑŽÑŽ ÑŽÑŽþÐŽ÷ÐŽðÐŽéÐŽâÐŽÛÐŽÔÐŽÍÐŽÆÐŽ¿ÐŽ¸ÐŽ±ÐŽªÐŽ£ÐŽœÐŽ•ÐŽŽÐŽ‡ÐŽ€ÐŽyÐŽrÐŽkÐŽdÐŽ]ÐŽVÐŽOÐŽHÐŽAÐŽ:ÐŽ3ÐŽ,ÐŽ%ÐŽÐŽÐŽÐŽ ÐŽÐŽûÏŽôÏŽíÏŽæÏŽßÏŽØÏŽÑÏŽÊÏŽÃÏŽ¼ÏŽµÏŽ®ÏŽ§ÏŽ ÏŽ™ÏŽ’ÏŽ‹ÏŽ„ÏŽ}ÏŽvÏŽoÏŽhÏŽaÏŽZÏŽSÏŽLÏŽEÏŽ>ÏŽ7ÏŽ0ÏŽ)ÏŽ"ÏŽÏŽÏŽ ÏŽÏŽÿÎŽøÎŽñÎŽêÎŽãÎŽÜÎŽÕÎŽÎÎŽÇÎŽÀÎŽ¹ÎŽ²ÎŽ«ÎŽ¤ÎŽÎŽ–ÎŽÎŽˆÎŽÎŽzÎŽsÎŽlÎŽeÎŽ^ÎŽWÎŽPÎŽIÎŽBÎŽ;ÎŽ4ÎŽ-ÎŽ&ÎŽÎŽÎŽÎŽ ÎŽÎŽüÍŽõÍŽîÍŽçÍŽàÍŽÙÍŽÒÍŽËÍŽÄÍŽ½ÍŽ¶ÍŽ¯ÍŽ¨ÍŽ¡ÍŽšÍŽ“ÍŽŒÍŽ…ÍŽ~ÍŽwÍŽpÍŽiÍŽbÍŽ[ÍŽTÍŽMÍŽFÍŽ?ÍŽ8ÍŽ1ÍŽ*ÍŽ#ÍŽÍŽÍŽÍŽÍŽÍŽùÌŽòÌŽëÌŽäÌŽÝÌŽÖÌŽÏÌŽÈÌŽÁÌŽºÌŽ³ÌŽ¬ÌŽ¥ÌŽžÌŽ—ÌŽÌŽ‰ÌŽ‚ÌŽ{ÌŽtÌŽmÌŽfÌŽ_ÌŽXÌŽQÌŽJÌŽCÌŽ<ÌŽ5ÌŽ.ÌŽ'ÌŽ ÌŽÌŽÌŽ ÌŽÌŽýËŽöËŽïËŽèËŽáËŽÚËŽÓËŽÌËŽÅËŽ¾ËŽ·ËŽ°ËŽ©ËŽ¢ËŽ›ËŽ”ËŽËŽ†ËŽËŽxËŽqËŽjËŽcËŽ\ËŽUËŽNËŽGËŽ@ËŽ9ËŽ2ËŽ+ËŽ$ËŽËŽËŽËŽËŽËŽúÊŽóÊŽìÊŽåÊŽÞÊŽ×ÊŽÐÊŽÉÊŽÂÊŽ»ÊŽ´ÊŽ­ÊŽ¦ÊŽŸÊŽ˜ÊŽ‘ÊŽŠÊŽƒÊŽ|ÊŽuÊŽnÊŽgÊŽ`ÊŽYÊŽRÊŽKÊŽDÊŽ=ÊŽ6ÊŽ/ÊŽ(ÊŽ!ÊŽÊŽÊŽ ÊŽÊŽþÉŽ÷ÉŽðÉŽéÉŽâÉŽÛÉŽÔÉŽÍÉŽÆÉŽ¿ÉŽ¸ÉŽ±ÉŽªÉŽ£ÉŽœÉŽ•ÉŽŽÉŽ‡ÉŽ€ÉŽyÉŽrÉŽkÉŽdÉŽ]ÉŽVÉŽOÉŽHÉŽAÉŽ:ÉŽ3ÉŽ,ÉŽ%ÉŽÉŽÉŽÉŽ ÉŽÉŽûÈŽôÈŽíÈŽæÈŽßÈŽØÈŽÑÈŽÊÈŽÃÈŽ¼ÈŽµÈŽ®ÈŽ§ÈŽ ÈŽ™ÈŽ’ÈŽ‹ÈŽ„ÈŽ}ÈŽvÈŽoÈŽhÈŽaÈŽZÈŽSÈŽLÈŽEÈŽ>ÈŽ7ÈŽ0ÈŽ)ÈŽ"ÈŽÈŽÈŽ ÈŽÈŽÿÇŽøÇŽñÇŽêÇŽãÇŽÜÇŽÕÇŽÎÇŽÇÇŽÀÇŽ¹ÇŽ²ÇŽ«ÇŽ¤ÇŽÇŽ–ÇŽÇŽˆÇŽÇŽzÇŽsÇŽlÇŽeÇŽ^ÇŽWÇŽPÇŽIÇŽBÇŽ;ÇŽ4ÇŽ-ÇŽ&ÇŽÇŽÇŽÇŽ ÇŽÇŽüÆŽõÆŽîÆŽçÆŽàÆŽÙÆŽÒÆŽËÆŽÄÆŽ½ÆŽ¶ÆŽ¯ÆŽ¨ÆŽ¡ÆŽšÆŽ“ÆŽŒÆŽ…ÆŽ~ÆŽwÆŽpÆŽiÆŽbÆŽ[ÆŽTÆŽMÆŽFÆŽ?ÆŽ8ÆŽ1ÆŽ*ÆŽ#ÆŽÆŽÆŽÆŽÆŽÆŽùÅŽòÅŽëÅŽäÅŽÝÅŽÖÅŽÏÅŽÈÅŽÁÅŽºÅŽ³ÅŽ¬ÅŽ¥ÅŽžÅŽ—ÅŽÅŽ‰ÅŽ‚ÅŽ{ÅŽtÅŽmÅŽfÅŽ_ÅŽXÅŽQÅŽJÅŽCÅŽ<ÅŽ5ÅŽ.ÅŽ'ÅŽ ÅŽÅŽÅŽ ÅŽÅŽýÄŽöÄŽïÄŽèÄŽáÄŽÚÄŽÓÄŽÌÄŽÅÄŽ¾ÄŽ·ÄŽ°ÄŽ©ÄŽ¢ÄŽ›ÄŽ”ÄŽÄŽ†ÄŽÄŽxÄŽqÄŽjÄŽcÄŽ\ÄŽUÄŽNÄŽGÄŽ@ÄŽ9ÄŽ2ÄŽ+ÄŽ$ÄŽÄŽÄŽÄŽÄŽÄŽúÃŽóÃŽìÃŽåÃŽÞÃŽ×ÃŽÐÃŽÉÃŽÂÃŽ»ÃŽ´ÃŽ­ÃŽ¦ÃŽŸÃŽ˜ÃŽ‘ÃŽŠÃŽƒÃŽ|ÃŽuÃŽnÃŽgÃŽ`ÃŽYÃŽRÃŽKÃŽDÃŽ=ÃŽ6ÃŽ/ÃŽ(ÃŽ!ÃŽÃŽÃŽ ÃŽÃŽþÂŽ÷ÂŽðÂŽéÂŽâÂŽÛÂŽÔÂŽÍÂŽÆÂŽ¿ÂŽ¸ÂŽ±ÂŽªÂŽ£ÂŽœÂŽ•ÂŽŽÂŽ‡ÂŽ€ÂŽyÂŽrÂŽkÂŽdÂŽ]ÂŽVÂŽOÂŽHÂŽAÂŽ:ÂŽ3ÂŽ,ÂŽ%ÂŽÂŽÂŽÂŽ ÂŽÂŽûÁŽôÁŽíÁŽæÁŽßÁŽØÁŽÑÁŽÊÁŽÃÁ޼Á޵ÁŽ®ÁާÁŽ ÁŽ™ÁŽ’ÁŽ‹ÁŽ„ÁŽ}ÁŽvÁŽoÁŽhÁŽaÁŽZÁŽSÁŽLÁŽEÁŽ>ÁŽ7ÁŽ0ÁŽ)ÁŽ"ÁŽÁŽÁŽ ÁŽÁŽÿÀŽøÀŽñÀŽêÀŽãÀŽÜÀŽÕÀŽÎÀŽÇÀŽÀÀ޹À޲ÀŽ«ÀޤÀŽÀŽ–ÀŽÀŽˆÀŽÀŽzÀŽsÀŽlÀŽeÀŽ^ÀŽWÀŽPÀŽIÀŽBÀŽ;ÀŽ4ÀŽ-ÀŽ&ÀŽÀŽÀŽÀŽ ÀŽÀŽü¿Žõ¿Ž翎࿎Ù¿ŽÒ¿ŽË¿ŽÄ¿Ž½¿Ž¶¿Ž¯¿Ž¨¿Ž¡¿Žš¿Ž“¿ŽŒ¿Ž…¿Ž~¿Žw¿Žp¿Ži¿Žb¿Ž[¿ŽT¿ŽM¿ŽF¿Ž?¿Ž8¿Ž1¿Ž*¿Ž#¿Ž¿Ž¿Ž¿Ž¿Ž¿Žù¾Žò¾Ž뾎侎ݾŽÖ¾ŽϾŽȾŽÁ¾Žº¾Ž³¾Ž¬¾Ž¥¾Žž¾Ž—¾Ž¾Ž‰¾Ž‚¾Ž{¾Žt¾Žm¾Žf¾Ž_¾ŽX¾ŽQ¾ŽJ¾ŽC¾Ž<¾Ž5¾Ž.¾Ž'¾Ž ¾Ž¾Ž¾Ž ¾Ž¾Žý½Žö½Žn轎὎Ú½ŽÓ½Ž̽ŽŽŽ¾½Ž·½Ž°½Ž©½Ž¢½Ž›½Ž”½Ž½Ž†½Ž½Žx½Žq½Žj½Žc½Ž\½ŽU½ŽN½ŽG½Ž@½Ž9½Ž2½Ž+½Ž$½Ž½Ž½Ž½Ž½Ž½Žú¼Žó¼Ž켎弎Þ¼Ž×¼ŽмŽɼ޼޻¼Ž´¼Ž­¼Ž¦¼ŽŸ¼Ž˜¼Ž‘¼ŽмŽƒ¼Ž|¼Žu¼Žn¼Žg¼Ž`¼ŽY¼ŽR¼ŽK¼ŽD¼Ž=¼Ž6¼Ž/¼Ž(¼Ž!¼Ž¼Ž¼Ž ¼Ž¼Žþ»Ž÷»Žð»Ž黎⻎Û»ŽÔ»ŽÍ»ŽÆ»Ž¿»Ž¸»Ž±»Žª»Ž£»Žœ»Ž•»ŽŽ»Ž‡»Ž€»Žy»Žr»Žk»Žd»Ž]»ŽV»ŽO»ŽH»ŽA»Ž:»Ž3»Ž,»Ž%»Ž»Ž»Ž»Ž »Ž»ŽûºŽôºŽíºŽ溎ߺŽغŽѺŽʺŽú޼ºŽµºŽ®ºŽ§ºŽ ºŽ™ºŽ’ºŽ‹ºŽ„ºŽ}ºŽvºŽoºŽhºŽaºŽZºŽSºŽLºŽEºŽ>ºŽ7ºŽ0ºŽ)ºŽ"ºŽºŽºŽ ºŽºŽÿ¹Žø¹Žñ¹Ž깎㹎ܹŽÕ¹ŽιŽǹŽÀ¹Ž¹¹Ž²¹Ž«¹Ž¤¹Ž¹Ž–¹Ž¹Žˆ¹Ž¹Žz¹Žs¹Žl¹Že¹Ž^¹ŽW¹ŽP¹ŽI¹ŽB¹Ž;¹Ž4¹Ž-¹Ž&¹Ž¹Ž¹Ž¹Ž ¹Ž¹Žü¸Žõ¸Ž縎ฎÙ¸ŽÒ¸Ž˸Žĸ޽¸Ž¶¸Ž¯¸Ž¨¸Ž¡¸Žš¸Ž“¸ŽŒ¸Ž…¸Ž~¸Žw¸Žp¸Ži¸Žb¸Ž[¸ŽT¸ŽM¸ŽF¸Ž?¸Ž8¸Ž1¸Ž*¸Ž#¸Ž¸Ž¸Ž¸Ž¸Ž¸Žù·Žò·Žë·Žä·ŽÝ·ŽÖ·ŽÏ·ŽÈ·ŽÁ·Žº·Ž³·Ž¬·Ž¥·Žž·Ž—·Ž·Ž‰·Ž‚·Ž{·Žt·Žm·Žf·Ž_·ŽX·ŽQ·ŽJ·ŽC·Ž<·Ž5·Ž.·Ž'·Ž ·Ž·Ž·Ž ·Ž·Žý¶Žö¶Žï¶Žè¶Žá¶ŽÚ¶ŽÓ¶Ž̶ŽŶ޾¶Ž·¶Ž°¶Ž©¶Ž¢¶Ž›¶Ž”¶Ž¶Ž†¶Ž¶Žx¶Žq¶Žj¶Žc¶Ž\¶ŽU¶ŽN¶ŽG¶Ž@¶Ž9¶Ž2¶Ž+¶Ž$¶Ž¶Ž¶Ž¶Ž¶Ž¶ŽúµŽóµŽ쵎嵎ÞµŽ×µŽеŽɵ޵޻µŽ´µŽ­µŽ¦µŽŸµŽ˜µŽ‘µŽеŽƒµŽ|µŽuµŽnµŽgµŽ`µŽYµŽRµŽKµŽDµŽ=µŽ6µŽ/µŽ(µŽ!µŽµŽµŽ µŽµŽþ´Ž÷´Žð´Žé´Žâ´ŽÛ´ŽÔ´ŽÍ´ŽÆ´Ž¿´Ž¸´Ž±´Žª´Ž£´Žœ´Ž•´ŽŽ´Ž‡´Ž€´Žy´Žr´Žk´Žd´Ž]´ŽV´ŽO´ŽH´ŽA´Ž:´Ž3´Ž,´Ž%´Ž´Ž´Ž´Ž ´Ž´Žû³Žô³Ží³Ž泎ß³ŽسŽѳŽʳŽó޼³Žµ³Ž®³Ž§³Ž ³Ž™³Ž’³Ž‹³Ž„³Ž}³Žv³Žo³Žh³Ža³ŽZ³ŽS³ŽL³ŽE³Ž>³Ž7³Ž0³Ž)³Ž"³Ž³Ž³Ž ³Ž³Žÿ²Žø²Žñ²Ž겎㲎ܲŽÕ²ŽβŽDzŽÀ²Ž¹²Ž²²Ž«²Ž¤²Ž²Ž–²Ž²Žˆ²Ž²Žz²Žs²Žl²Že²Ž^²ŽW²ŽP²ŽI²ŽB²Ž;²Ž4²Ž-²Ž&²Ž²Ž²Ž²Ž ²Ž²Žü±Žõ±Ž籎౎Ù±ŽÒ±Ž˱Žı޽±Ž¶±Ž¯±Ž¨±Ž¡±Žš±Ž“±ŽŒ±Ž…±Ž~±Žw±Žp±Ži±Žb±Ž[±ŽT±ŽM±ŽF±Ž?±Ž8±Ž1±Ž*±Ž#±Ž±Ž±Ž±Ž±Ž±Žù°Žò°Žë°Žä°ŽݰŽÖ°ŽϰŽȰŽÁ°Žº°Ž³°Ž¬°Ž¥°Žž°Ž—°Ž°Ž‰°Ž‚°Ž{°Žt°Žm°Žf°Ž_°ŽX°ŽQ°ŽJ°ŽC°Ž<°Ž5°Ž.°Ž'°Ž °Ž°Ž°Ž °Ž°Žý¯Žö¯Ž﯎诎ᯎÚ¯ŽÓ¯Ž̯Žů޾¯Ž·¯Ž°¯Ž©¯Ž¢¯Ž›¯Ž”¯Ž¯Ž†¯Ž¯Žx¯Žq¯Žj¯Žc¯Ž\¯ŽU¯ŽN¯ŽG¯Ž@¯Ž9¯Ž2¯Ž+¯Ž$¯Ž¯Ž¯Ž¯Ž¯Ž¯Žú®Žó®Ž쮎宎Þ®Ž×®ŽЮŽÉ®Ž®Ž»®Ž´®Ž­®Ž¦®ŽŸ®Ž˜®Ž‘®ŽŠ®Žƒ®Ž|®Žu®Žn®Žg®Ž`®ŽY®ŽR®ŽK®ŽD®Ž=®Ž6®Ž/®Ž(®Ž!®Ž®Ž®Ž ®Ž®Žþ­Ž÷­Žð­Žé­Žâ­ŽÛ­ŽÔ­ŽÍ­ŽÆ­Ž¿­Ž¸­Ž±­Žª­Ž£­Žœ­Ž•­ŽŽ­Ž‡­Ž€­Žy­Žr­Žk­Žd­Ž]­ŽV­ŽO­ŽH­ŽA­Ž:­Ž3­Ž,­Ž%­Ž­Ž­Ž­Ž ­Ž­Žû¬Žô¬Ží¬Ž欎߬ŽجŽѬŽʬŽì޼¬Žµ¬Ž®¬Ž§¬Ž ¬Ž™¬Ž’¬Ž‹¬Ž„¬Ž}¬Žv¬Žo¬Žh¬Ža¬ŽZ¬ŽS¬ŽL¬ŽE¬Ž>¬Ž7¬Ž0¬Ž)¬Ž"¬Ž¬Ž¬Ž ¬Ž¬Žÿ«Žø«Žñ«Ž꫎㫎Ü«ŽÕ«ŽΫŽÇ«ŽÀ«Ž¹«Ž²«Ž««Ž¤«Ž«Ž–«Ž«Žˆ«Ž«Žz«Žs«Žl«Že«Ž^«ŽW«ŽP«ŽI«ŽB«Ž;«Ž4«Ž-«Ž&«Ž«Ž«Ž«Ž «Ž«ŽüªŽõªŽ窎઎ÙªŽÒªŽ˪ŽĪ޽ªŽ¶ªŽ¯ªŽ¨ªŽ¡ªŽšªŽ“ªŽŒªŽ…ªŽ~ªŽwªŽpªŽiªŽbªŽ[ªŽTªŽMªŽFªŽ?ªŽ8ªŽ1ªŽ*ªŽ#ªŽªŽªŽªŽªŽªŽù©Žò©Ž멎䩎Ý©ŽÖ©ŽÏ©ŽÈ©ŽÁ©Žº©Ž³©Ž¬©Ž¥©Žž©Ž—©Ž©Ž‰©Ž‚©Ž{©Žt©Žm©Žf©Ž_©ŽX©ŽQ©ŽJ©ŽC©Ž<©Ž5©Ž.©Ž'©Ž ©Ž©Ž©Ž ©Ž©Žý¨Žö¨Ž﨎討ᨎÚ¨ŽÓ¨Ž̨ŽŨ޾¨Ž·¨Ž°¨Ž©¨Ž¢¨Ž›¨Ž”¨Ž¨Ž†¨Ž¨Žx¨Žq¨Žj¨Žc¨Ž\¨ŽU¨ŽN¨ŽG¨Ž@¨Ž9¨Ž2¨Ž+¨Ž$¨Ž¨Ž¨Ž¨Ž¨Ž¨Žú§Žó§Žì§Žå§ŽÞ§Ž×§ŽЧŽɧާ޻§Ž´§Ž­§Ž¦§ŽŸ§Ž˜§Ž‘§ŽЧŽƒ§Ž|§Žu§Žn§Žg§Ž`§ŽY§ŽR§ŽK§ŽD§Ž=§Ž6§Ž/§Ž(§Ž!§Ž§Ž§Ž §Ž§Žþ¦Ž÷¦Žð¦Ž馎⦎Û¦ŽÔ¦ŽͦŽƦŽ¿¦Ž¸¦Ž±¦Žª¦Ž£¦Žœ¦Ž•¦Žައ¦Ž€¦Žy¦Žr¦Žk¦Žd¦Ž]¦ŽV¦ŽO¦ŽH¦ŽA¦Ž:¦Ž3¦Ž,¦Ž%¦Ž¦Ž¦Ž¦Ž ¦Ž¦Žû¥Žô¥Ží¥Ž楎ߥŽØ¥ŽÑ¥ŽÊ¥ŽÃ¥Ž¼¥Žµ¥Ž®¥Ž§¥Ž ¥Ž™¥Ž’¥Ž‹¥Ž„¥Ž}¥Žv¥Žo¥Žh¥Ža¥ŽZ¥ŽS¥ŽL¥ŽE¥Ž>¥Ž7¥Ž0¥Ž)¥Ž"¥Ž¥Ž¥Ž ¥Ž¥Žÿ¤Žø¤Žñ¤Žꤎ㤎ܤŽÕ¤ŽΤŽǤŽÀ¤Ž¹¤Ž²¤Ž«¤Ž¤¤Ž¤Ž–¤Ž¤Žˆ¤Ž¤Žz¤Žs¤Žl¤Že¤Ž^¤ŽW¤ŽP¤ŽI¤ŽB¤Ž;¤Ž4¤Ž-¤Ž&¤Ž¤Ž¤Ž¤Ž ¤Ž¤Žü£Žõ£Ž磎࣎Ù£ŽÒ£ŽË£ŽÄ£Ž½£Ž¶£Ž¯£Ž¨£Ž¡£Žš£Ž“£ŽŒ£Ž…£Ž~£Žw£Žp£Ži£Žb£Ž[£ŽT£ŽM£ŽF£Ž?£Ž8£Ž1£Ž*£Ž#£Ž£Ž£Ž£Ž£Ž£Žù¢Žò¢Ž뢎䢎Ý¢ŽÖ¢ŽÏ¢ŽÈ¢ŽÁ¢Žº¢Ž³¢Ž¬¢Ž¥¢Žž¢Ž—¢Ž¢Ž‰¢Ž‚¢Ž{¢Žt¢Žm¢Žf¢Ž_¢ŽX¢ŽQ¢ŽJ¢ŽC¢Ž<¢Ž5¢Ž.¢Ž'¢Ž ¢Ž¢Ž¢Ž ¢Ž¢Žý¡Žö¡Ž衎ᡎÚ¡ŽÓ¡ŽÌ¡ŽÅ¡Ž¾¡Ž·¡Ž°¡Ž©¡Ž¢¡Ž›¡Ž”¡Ž¡Ž†¡Ž¡Žx¡Žq¡Žj¡Žc¡Ž\¡ŽU¡ŽN¡ŽG¡Ž@¡Ž9¡Ž2¡Ž+¡Ž$¡Ž¡Ž¡Ž¡Ž¡Ž¡Žú Žó Žì Žå ŽÞ Ž× ŽРŽÉ Ž Ž» Ž´ Ž­ Ž¦ ŽŸ Ž˜ Ž‘ ŽŠ Žƒ Ž| Žu Žn Žg Ž` ŽY ŽR ŽK ŽD Ž= Ž6 Ž/ Ž( Ž! Ž Ž Ž  Ž ŽþŸŽ÷ŸŽðŸŽ韎⟎ÛŸŽÔŸŽÍŸŽÆŸŽ¿ŸŽ¸ŸŽ±ŸŽªŸŽ£ŸŽœŸŽ•ŸŽŽŸŽ‡ŸŽ€ŸŽyŸŽrŸŽkŸŽdŸŽ]ŸŽVŸŽOŸŽHŸŽAŸŽ:ŸŽ3ŸŽ,ŸŽ%ŸŽŸŽŸŽŸŽ ŸŽŸŽûžŽôžŽ힎枎ßžŽØžŽÑžŽÊžŽÞ޼žŽµžŽ®žŽ§žŽ žŽ™žŽ’žŽ‹žŽ„žŽ}žŽvžŽožŽhžŽažŽZžŽSžŽLžŽEžŽ>žŽ7žŽ0žŽ)žŽ"žŽžŽžŽ žŽžŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüœŽõœŽ眎àœŽÙœŽÒœŽËœŽÄœŽ½œŽ¶œŽ¯œŽ¨œŽ¡œŽšœŽ“œŽŒœŽ…œŽ~œŽwœŽpœŽiœŽbœŽ[œŽTœŽMœŽFœŽ?œŽ8œŽ1œŽ*œŽ#œŽœŽœŽœŽœŽœŽù›Žò›Ž뛎䛎Ý›ŽÖ›ŽÏ›ŽÈ›ŽÁ›Žº›Ž³›Ž¬›Ž¥›Žž›Ž—›Ž›Ž‰›Ž‚›Ž{›Žt›Žm›Žf›Ž_›ŽX›ŽQ›ŽJ›ŽC›Ž<›Ž5›Ž.›Ž'›Ž ›Ž›Ž›Ž ›Ž›ŽýšŽöšŽ蚎ᚎÚšŽÓšŽÌšŽÅšŽ¾šŽ·šŽ°šŽ©šŽ¢šŽ›šŽ”šŽšŽ†šŽšŽxšŽqšŽjšŽcšŽ\šŽUšŽNšŽGšŽ@šŽ9šŽ2šŽ+šŽ$šŽšŽšŽšŽšŽšŽú™Žó™Ž왎噎Þ™Ž×™ŽЙŽÉ™Ž™Ž»™Ž´™Ž­™Ž¦™ŽŸ™Ž˜™Ž‘™ŽŠ™Žƒ™Ž|™Žu™Žn™Žg™Ž`™ŽY™ŽR™ŽK™ŽD™Ž=™Ž6™Ž/™Ž(™Ž!™Ž™Ž™Ž ™Ž™Žþ˜Ž÷˜Žð˜Ž阎☎Û˜ŽÔ˜Ž͘ŽƘŽ¿˜Ž¸˜Ž±˜Žª˜Ž£˜Žœ˜Ž•˜ŽŽ˜Ž‡˜Ž€˜Žy˜Žr˜Žk˜Žd˜Ž]˜ŽV˜ŽO˜ŽH˜ŽA˜Ž:˜Ž3˜Ž,˜Ž%˜Ž˜Ž˜Ž˜Ž ˜Ž˜Žû—Žô—Ží—Žæ—Žß—ŽØ—ŽÑ—ŽÊ—Ž׎¼—޵—Ž®—ާ—Ž —Ž™—Ž’—Ž‹—Ž„—Ž}—Žv—Žo—Žh—Ža—ŽZ—ŽS—ŽL—ŽE—Ž>—Ž7—Ž0—Ž)—Ž"—Ž—Ž—Ž —Ž—Žÿ–Žø–Žñ–Žê–Žã–ŽÜ–ŽÕ–ŽΖŽÇ–ŽÀ–޹–޲–Ž«–ޤ–Ž–Ž––Ž–Žˆ–Ž–Žz–Žs–Žl–Že–Ž^–ŽW–ŽP–ŽI–ŽB–Ž;–Ž4–Ž-–Ž&–Ž–Ž–Ž–Ž –Ž–Žü•Žõ•Ž畎à•ŽÙ•ŽÒ•ŽË•ŽÄ•޽•޶•ޝ•ލ•Ž¡•Žš•Ž“•ŽŒ•Ž…•Ž~•Žw•Žp•Ži•Žb•Ž[•ŽT•ŽM•ŽF•Ž?•Ž8•Ž1•Ž*•Ž#•ޕޕޕޕޕŽù”Žò”Ž딎䔎Ý”ŽÖ”ŽÏ”ŽÈ”ŽÁ”Žº”޳”ެ”Ž¥”Žž”Ž—”ޔމ”Ž‚”Ž{”Žt”Žm”Žf”Ž_”ŽX”ŽQ”ŽJ”ŽC”Ž<”Ž5”Ž.”Ž'”Ž ”Ž”Ž”Ž ”Ž”Žý“Žö“Ž蓎ᓎÚ“ŽÓ“ŽÌ“ŽÅ“޾“Ž·“ް“Ž©“Ž¢“Ž›“Ž”“ޓކ“Ž“Žx“Žq“Žj“Žc“Ž\“ŽU“ŽN“ŽG“Ž@“Ž9“Ž2“Ž+“Ž$“ޓޓޓޓޓŽú’Žó’Žì’Žå’ŽÞ’Ž×’ŽÐ’ŽÉ’ŽÂ’Ž»’Ž´’Ž­’ަ’ŽŸ’Ž˜’Ž‘’ŽŠ’Žƒ’Ž|’Žu’Žn’Žg’Ž`’ŽY’ŽR’ŽK’ŽD’Ž=’Ž6’Ž/’Ž(’Ž!’Ž’Ž’Ž ’Ž’Žþ‘Ž÷‘Žð‘Ž鑎⑎Û‘ŽÔ‘ŽÍ‘ŽÆ‘Ž¿‘ޏ‘ޱ‘Žª‘Ž£‘Žœ‘Ž•‘ŽŽ‘އ‘Ž€‘Žy‘Žr‘Žk‘Žd‘Ž]‘ŽV‘ŽO‘ŽH‘ŽA‘Ž:‘Ž3‘Ž,‘Ž%‘Ž‘Ž‘Ž‘Ž ‘Ž‘ŽûŽôŽíŽæŽߎØŽÑŽÊŽÃŽ¼ŽµŽ®Ž§Ž Ž™Ž’ދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüŽŽõŽŽ玎àŽŽÙŽŽÒŽŽËŽŽÄŽŽ½ŽŽ¶ŽŽ¯ŽŽ¨ŽŽ¡ŽŽšŽŽ“ŽŽŒŽŽ…ŽŽ~ŽŽwŽŽpŽŽiŽŽbŽŽ[ŽŽTŽŽMŽŽFŽŽ?ŽŽ8ŽŽ1ŽŽ*ŽŽ#ŽŽŽŽŽŽŽŽŽŽŽŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŒŽöŒŽ茎ጎÚŒŽÓŒŽÌŒŽÅŒŽ¾ŒŽ·ŒŽ°ŒŽ©ŒŽ¢ŒŽ›ŒŽ”ŒŽŒŽ†ŒŽŒŽxŒŽqŒŽjŒŽcŒŽ\ŒŽUŒŽNŒŽGŒŽ@ŒŽ9ŒŽ2ŒŽ+ŒŽ$ŒŽŒŽŒŽŒŽŒŽŒŽú‹Žó‹Ž싎勎Þ‹Ž׋ŽЋŽÉ‹Ž‹Ž»‹Ž´‹Ž­‹Ž¦‹ŽŸ‹Ž˜‹Ž‘‹ŽŠ‹Žƒ‹Ž|‹Žu‹Žn‹Žg‹Ž`‹ŽY‹ŽR‹ŽK‹ŽD‹Ž=‹Ž6‹Ž/‹Ž(‹Ž!‹Ž‹Ž‹Ž ‹Ž‹ŽþŠŽ÷ŠŽðŠŽ銎⊎ÛŠŽÔŠŽÍŠŽÆŠŽ¿ŠŽ¸ŠŽ±ŠŽªŠŽ£ŠŽœŠŽ•ŠŽŽŠŽ‡ŠŽ€ŠŽyŠŽrŠŽkŠŽdŠŽ]ŠŽVŠŽOŠŽHŠŽAŠŽ:ŠŽ3ŠŽ,ŠŽ%ŠŽŠŽŠŽŠŽ ŠŽŠŽû‰Žô‰Ž퉎扎߉Ž؉ŽщŽʉŽÉ޼‰Žµ‰Ž®‰Ž§‰Ž ‰Ž™‰Ž’‰Ž‹‰Ž„‰Ž}‰Žv‰Žo‰Žh‰Ža‰ŽZ‰ŽS‰ŽL‰ŽE‰Ž>‰Ž7‰Ž0‰Ž)‰Ž"‰Ž‰Ž‰Ž ‰Ž‰ŽÿˆŽøˆŽñˆŽꈎ㈎܈ŽÕˆŽΈŽLjŽÀˆŽ¹ˆŽ²ˆŽ«ˆŽ¤ˆŽˆŽ–ˆŽˆŽˆˆŽˆŽzˆŽsˆŽlˆŽeˆŽ^ˆŽWˆŽPˆŽIˆŽBˆŽ;ˆŽ4ˆŽ-ˆŽ&ˆŽˆŽˆŽˆŽ ˆŽˆŽü‡Žõ‡Ž燎à‡ŽÙ‡ŽÒ‡ŽˇŽć޽‡Ž¶‡Ž¯‡Ž¨‡Ž¡‡Žš‡Ž“‡ŽŒ‡Ž…‡Ž~‡Žw‡Žp‡Ži‡Žb‡Ž[‡ŽT‡ŽM‡ŽF‡Ž?‡Ž8‡Ž1‡Ž*‡Ž#‡Ž‡Ž‡Ž‡Ž‡Ž‡Žù†Žò†Ž놎䆎݆ŽÖ†ŽφŽȆŽÁ†Žº†Ž³†Ž¬†Ž¥†Žž†Ž—†Ž†Ž‰†Ž‚†Ž{†Žt†Žm†Žf†Ž_†ŽX†ŽQ†ŽJ†ŽC†Ž<†Ž5†Ž.†Ž'†Ž †Ž†Ž†Ž †Ž†Žý…Žö…Žï…Žè…Žá…ŽÚ…ŽÓ…ŽÌ…ŽÅ…޾…Ž·…ް…Ž©…Ž¢…Ž›…Ž”…ޅކ…Ž…Žx…Žq…Žj…Žc…Ž\…ŽU…ŽN…ŽG…Ž@…Ž9…Ž2…Ž+…Ž$…Ž…Ž…Ž…Ž…Ž…Žú„Žó„Ž섎儎Þ„ŽׄŽЄŽÉ„ބ޻„Ž´„Ž­„ަ„ŽŸ„Ž˜„Ž‘„ŽŠ„Žƒ„Ž|„Žu„Žn„Žg„Ž`„ŽY„ŽR„ŽK„ŽD„Ž=„Ž6„Ž/„Ž(„Ž!„Ž„Ž„Ž „Ž„ŽþƒŽ÷ƒŽðƒŽ郎⃎ÛƒŽÔƒŽ̓ŽƃŽ¿ƒŽ¸ƒŽ±ƒŽªƒŽ£ƒŽœƒŽ•ƒŽŽƒŽ‡ƒŽ€ƒŽyƒŽrƒŽkƒŽdƒŽ]ƒŽVƒŽOƒŽHƒŽAƒŽ:ƒŽ3ƒŽ,ƒŽ%ƒŽƒŽƒŽƒŽ ƒŽƒŽû‚Žô‚Ž킎悎߂ި‚ŽÑ‚ŽÊ‚ŽÂ޼‚޵‚Ž®‚ާ‚Ž ‚Ž™‚Ž’‚Ž‹‚Ž„‚Ž}‚Žv‚Žo‚Žh‚Ža‚ŽZ‚ŽS‚ŽL‚ŽE‚Ž>‚Ž7‚Ž0‚Ž)‚Ž"‚Ž‚Ž‚Ž ‚Ž‚ŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽü€Žõ€Ž瀎à€ŽÙ€ŽÒ€ŽË€ŽÄ€Ž½€Ž¶€Ž¯€Ž¨€Ž¡€Žš€Ž“€ŽŒ€Ž…€Ž~€Žw€Žp€Ži€Žb€Ž[€ŽT€ŽM€ŽF€Ž?€Ž8€Ž1€Ž*€Ž#€Ž€Ž€Ž€Ž€Ž€ŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽý~Žö~Žï~Žè~Žá~ŽÚ~ŽÓ~ŽÌ~ŽÅ~޾~Ž·~ް~Ž©~Ž¢~Ž›~Ž”~Ž~ކ~Ž~Žx~Žq~Žj~Žc~Ž\~ŽU~ŽN~ŽG~Ž@~Ž9~Ž2~Ž+~Ž$~Ž~Ž~Ž~Ž~Ž~Žú}Žó}Žì}Žå}ŽÞ}Ž×}ŽÐ}ŽÉ}ŽÂ}Ž»}Ž´}Ž­}ަ}ŽŸ}Ž˜}Ž‘}ŽŠ}Žƒ}Ž|}Žu}Žn}Žg}Ž`}ŽY}ŽR}ŽK}ŽD}Ž=}Ž6}Ž/}Ž(}Ž!}Ž}Ž}Ž }Ž}Žþ|Ž÷|Žð|Žé|Žâ|ŽÛ|ŽÔ|ŽÍ|ŽÆ|Ž¿|ޏ|ޱ|Žª|Ž£|Žœ|Ž•|ŽŽ|އ|Ž€|Žy|Žr|Žk|Žd|Ž]|ŽV|ŽO|ŽH|ŽA|Ž:|Ž3|Ž,|Ž%|Ž|Ž|Ž|Ž |Ž|Žû{Žô{Ží{Žæ{Žß{ŽØ{ŽÑ{ŽÊ{ŽÃ{޼{޵{Ž®{ާ{Ž {Ž™{Ž’{Ž‹{Ž„{Ž}{Žv{Žo{Žh{Ža{ŽZ{ŽS{ŽL{ŽE{Ž>{Ž7{Ž0{Ž){Ž"{Ž{Ž{Ž {Ž{ŽÿzŽøzŽñzŽêzŽãzŽÜzŽÕzŽÎzŽÇzŽÀz޹z޲zŽ«zޤzŽzŽ–zŽzŽˆzŽzŽzzŽszŽlzŽezŽ^zŽWzŽPzŽIzŽBzŽ;zŽ4zŽ-zŽ&zŽzŽzŽzŽ zŽzŽüyŽõyŽîyŽçyŽàyŽÙyŽÒyŽËyŽÄy޽y޶yޝyލyŽ¡yŽšyŽ“yŽŒyŽ…yŽ~yŽwyŽpyŽiyŽbyŽ[yŽTyŽMyŽFyŽ?yŽ8yŽ1yŽ*yŽ#yŽyŽyŽyŽyŽyŽùxŽòxŽëxŽäxŽÝxŽÖxŽÏxŽÈxŽÁxŽºx޳xެxŽ¥xŽžxŽ—xŽxމxŽ‚xŽ{xŽtxŽmxŽfxŽ_xŽXxŽQxŽJxŽCxŽtŽ7tŽ0tŽ)tŽ"tŽtŽtŽ tŽtŽÿsŽøsŽñsŽêsŽãsŽÜsŽÕsŽÎsŽÇsŽÀs޹s޲sŽ«sޤsŽsŽ–sŽsŽˆsŽsŽzsŽssŽlsŽesŽ^sŽWsŽPsŽIsŽBsŽ;sŽ4sŽ-sŽ&sŽsŽsŽsŽ sŽsŽürŽõrŽîrŽçrŽàrŽÙrŽÒrŽËrŽÄr޽r޶rޝrލrŽ¡rŽšrŽ“rŽŒrŽ…rŽ~rŽwrŽprŽirŽbrŽ[rŽTrŽMrŽFrŽ?rŽ8rŽ1rŽ*rŽ#rŽrŽrŽrŽrŽrŽùqŽòqŽëqŽäqŽÝqŽÖqŽÏqŽÈqŽÁqŽºq޳qެqŽ¥qŽžqŽ—qŽqމqŽ‚qŽ{qŽtqŽmqŽfqŽ_qŽXqŽQqŽJqŽCqŽmŽ7mŽ0mŽ)mŽ"mŽmŽmŽ mŽmŽÿlŽølŽñlŽêlŽãlŽÜlŽÕlŽÎlŽÇlŽÀl޹l޲lŽ«lޤlŽlŽ–lŽlŽˆlŽlŽzlŽslŽllŽelŽ^lŽWlŽPlŽIlŽBlŽ;lŽ4lŽ-lŽ&lŽlŽlŽlŽ lŽlŽükŽõkŽîkŽçkŽàkŽÙkŽÒkŽËkŽÄk޽k޶kޝkލkŽ¡kŽškŽ“kŽŒkŽ…kŽ~kŽwkŽpkŽikŽbkŽ[kŽTkŽMkŽFkŽ?kŽ8kŽ1kŽ*kŽ#kŽkŽkŽkŽkŽkŽùjŽòjŽëjŽäjŽÝjŽÖjŽÏjŽÈjŽÁjŽºj޳jެjŽ¥jŽžjŽ—jŽjމjŽ‚jŽ{jŽtjŽmjŽfjŽ_jŽXjŽQjŽJjŽCjŽfŽ7fŽ0fŽ)fŽ"fŽfŽfŽ fŽfŽÿeŽøeŽñeŽêeŽãeŽÜeŽÕeŽÎeŽÇeŽÀe޹e޲eŽ«eޤeŽeŽ–eŽeŽˆeŽeŽzeŽseŽleŽeeŽ^eŽWeŽPeŽIeŽBeŽ;eŽ4eŽ-eŽ&eŽeŽeŽeŽ eŽeŽüdŽõdŽîdŽçdŽàdŽÙdŽÒdŽËdŽÄd޽d޶dޝdލdŽ¡dŽšdŽ“dŽŒdŽ…dŽ~dŽwdŽpdŽidŽbdŽ[dŽTdŽMdŽFdŽ?dŽ8dŽ1dŽ*dŽ#dŽdŽdŽdŽdŽdŽùcŽòcŽëcŽäcŽÝcŽÖcŽÏcŽÈcŽÁcŽºc޳cެcŽ¥cŽžcŽ—cŽcމcŽ‚cŽ{cŽtcŽmcŽfcŽ_cŽXcŽQcŽJcŽCcŽ_Ž7_Ž0_Ž)_Ž"_Ž_Ž_Ž _Ž_Žÿ^Žø^Žñ^Žê^Žã^ŽÜ^ŽÕ^ŽÎ^ŽÇ^ŽÀ^޹^޲^Ž«^ޤ^Ž^Ž–^Ž^Žˆ^Ž^Žz^Žs^Žl^Že^Ž^^ŽW^ŽP^ŽI^ŽB^Ž;^Ž4^Ž-^Ž&^Ž^Ž^Ž^Ž ^Ž^Žü]Žõ]Žî]Žç]Žà]ŽÙ]ŽÒ]ŽË]ŽÄ]޽]޶]ޝ]ލ]Ž¡]Žš]Ž“]ŽŒ]Ž…]Ž~]Žw]Žp]Ži]Žb]Ž[]ŽT]ŽM]ŽF]Ž?]Ž8]Ž1]Ž*]Ž#]Ž]Ž]Ž]Ž]Ž]Žù\Žò\Žë\Žä\ŽÝ\ŽÖ\ŽÏ\ŽÈ\ŽÁ\Žº\޳\ެ\Ž¥\Žž\Ž—\Ž\މ\Ž‚\Ž{\Žt\Žm\Žf\Ž_\ŽX\ŽQ\ŽJ\ŽC\Ž<\Ž5\Ž.\Ž'\Ž \Ž\Ž\Ž \Ž\Žý[Žö[Žï[Žè[Žá[ŽÚ[ŽÓ[ŽÌ[ŽÅ[޾[Ž·[ް[Ž©[Ž¢[Ž›[Ž”[Ž[ކ[Ž[Žx[Žq[Žj[Žc[Ž\[ŽU[ŽN[ŽG[Ž@[Ž9[Ž2[Ž+[Ž$[Ž[Ž[Ž[Ž[Ž[ŽúZŽóZŽìZŽåZŽÞZŽ×ZŽÐZŽÉZŽÂZŽ»ZŽ´ZŽ­ZަZŽŸZŽ˜ZŽ‘ZŽŠZŽƒZŽ|ZŽuZŽnZŽgZŽ`ZŽYZŽRZŽKZŽDZŽ=ZŽ6ZŽ/ZŽ(ZŽ!ZŽZŽZŽ ZŽZŽþYŽ÷YŽðYŽéYŽâYŽÛYŽÔYŽÍYŽÆYŽ¿YޏYޱYŽªYŽ£YŽœYŽ•YŽŽYއYŽ€YŽyYŽrYŽkYŽdYŽ]YŽVYŽOYŽHYŽAYŽ:YŽ3YŽ,YŽ%YŽYŽYŽYŽ YŽYŽûXŽôXŽíXŽæXŽßXŽØXŽÑXŽÊXŽÃX޼X޵XŽ®XާXŽ XŽ™XŽ’XŽ‹XŽ„XŽ}XŽvXŽoXŽhXŽaXŽZXŽSXŽLXŽEXŽ>XŽ7XŽ0XŽ)XŽ"XŽXŽXŽ XŽXŽÿWŽøWŽñWŽêWŽãWŽÜWŽÕWŽÎWŽÇWŽÀW޹W޲WŽ«WޤWŽWŽ–WŽWŽˆWŽWŽzWŽsWŽlWŽeWŽ^WŽWWŽPWŽIWŽBWŽ;WŽ4WŽ-WŽ&WŽWŽWŽWŽ WŽWŽüVŽõVŽîVŽçVŽàVŽÙVŽÒVŽËVŽÄV޽V޶VޝVލVŽ¡VŽšVŽ“VŽŒVŽ…VŽ~VŽwVŽpVŽiVŽbVŽ[VŽTVŽMVŽFVŽ?VŽ8VŽ1VŽ*VŽ#VŽVŽVŽVŽVŽVŽùUŽòUŽëUŽäUŽÝUŽÖUŽÏUŽÈUŽÁUŽºU޳UެUŽ¥UŽžUŽ—UŽUމUŽ‚UŽ{UŽtUŽmUŽfUŽ_UŽXUŽQUŽJUŽCUŽQŽ7QŽ0QŽ)QŽ"QŽQŽQŽ QŽQŽÿPŽøPŽñPŽêPŽãPŽÜPŽÕPŽÎPŽÇPŽÀP޹P޲PŽ«PޤPŽPŽ–PŽPŽˆPŽPŽzPŽsPŽlPŽePŽ^PŽWPŽPPŽIPŽBPŽ;PŽ4PŽ-PŽ&PŽPŽPŽPŽ PŽPŽüOŽõOŽîOŽçOŽàOŽÙOŽÒOŽËOŽÄO޽O޶OޝOލOŽ¡OŽšOŽ“OŽŒOŽ…OŽ~OŽwOŽpOŽiOŽbOŽ[OŽTOŽMOŽFOŽ?OŽ8OŽ1OŽ*OŽ#OŽOŽOŽOŽOŽOŽùNŽòNŽëNŽäNŽÝNŽÖNŽÏNŽÈNŽÁNŽºN޳NެNŽ¥NŽžNŽ—NŽNމNŽ‚NŽ{NŽtNŽmNŽfNŽ_NŽXNŽQNŽJNŽCNŽJŽ7JŽ0JŽ)JŽ"JŽJŽJŽ JŽJŽÿIŽøIŽñIŽêIŽãIŽÜIŽÕIŽÎIŽÇIŽÀI޹I޲IŽ«IޤIŽIŽ–IŽIŽˆIŽIŽzIŽsIŽlIŽeIŽ^IŽWIŽPIŽIIŽBIŽ;IŽ4IŽ-IŽ&IŽIŽIŽIŽ IŽIŽüHŽõHŽîHŽçHŽàHŽÙHŽÒHŽËHŽÄH޽H޶HޝHލHŽ¡HŽšHŽ“HŽŒHŽ…HŽ~HŽwHŽpHŽiHŽbHŽ[HŽTHŽMHŽFHŽ?HŽ8HŽ1HŽ*HŽ#HŽHŽHŽHŽHŽHŽùGŽòGŽëGŽäGŽÝGŽÖGŽÏGŽÈGŽÁGŽºG޳GެGŽ¥GŽžGŽ—GŽGމGŽ‚GŽ{GŽtGŽmGŽfGŽ_GŽXGŽQGŽJGŽCGŽCŽ7CŽ0CŽ)CŽ"CŽCŽCŽ CŽCŽÿBŽøBŽñBŽêBŽãBŽÜBŽÕBŽÎBŽÇBŽÀB޹B޲BŽ«BޤBŽBŽ–BŽBŽˆBŽBŽzBŽsBŽlBŽeBŽ^BŽWBŽPBŽIBŽBBŽ;BŽ4BŽ-BŽ&BŽBŽBŽBŽ BŽBŽüAŽõAŽîAŽçAŽàAŽÙAŽÒAŽËAŽÄA޽A޶AޝAލAŽ¡AŽšAŽ“AŽŒAŽ…AŽ~AŽwAŽpAŽiAŽbAŽ[AŽTAŽMAŽFAŽ?AŽ8AŽ1AŽ*AŽ#AŽAŽAŽAŽAŽAŽù@Žò@Žë@Žä@ŽÝ@ŽÖ@ŽÏ@ŽÈ@ŽÁ@Žº@޳@ެ@Ž¥@Žž@Ž—@Ž@މ@Ž‚@Ž{@Žt@Žm@Žf@Ž_@ŽX@ŽQ@ŽJ@ŽC@Ž<@Ž5@Ž.@Ž'@Ž @Ž@Ž@Ž @Ž@Žý?Žö?Žï?Žè?Žá?ŽÚ?ŽÓ?ŽÌ?ŽÅ?޾?Ž·?ް?Ž©?Ž¢?Ž›?Ž”?Ž?ކ?Ž?Žx?Žq?Žj?Žc?Ž\?ŽU?ŽN?ŽG?Ž@?Ž9?Ž2?Ž+?Ž$?Ž?Ž?Ž?Ž?Ž?Žú>Žó>Žì>Žå>ŽÞ>Ž×>ŽÐ>ŽÉ>ŽÂ>Ž»>Ž´>Ž­>ަ>ŽŸ>Ž˜>Ž‘>ŽŠ>Žƒ>Ž|>Žu>Žn>Žg>Ž`>ŽY>ŽR>ŽK>ŽD>Ž=>Ž6>Ž/>Ž(>Ž!>Ž>Ž>Ž >Ž>Žþ=Ž÷=Žð=Žé=Žâ=ŽÛ=ŽÔ=ŽÍ=ŽÆ=Ž¿=ޏ=ޱ=Žª=Ž£=Žœ=Ž•=ŽŽ=އ=Ž€=Žy=Žr=Žk=Žd=Ž]=ŽV=ŽO=ŽH=ŽA=Ž:=Ž3=Ž,=Ž%=Ž=Ž=Ž=Ž =Ž=Žû<Žô<Ží<Žæ<Žß<ŽØ<ŽÑ<ŽÊ<ŽÃ<޼<޵<Ž®<ާ<Ž <Ž™<Ž’<Ž‹<Ž„<Ž}<Žv<Žo<Žh<Ža<ŽZ<ŽS<ŽL<ŽE<Ž><Ž7<Ž0<Ž)<Ž"<Ž<Ž<Ž <Ž<Žÿ;Žø;Žñ;Žê;Žã;ŽÜ;ŽÕ;ŽÎ;ŽÇ;ŽÀ;޹;޲;Ž«;ޤ;Ž;Ž–;Ž;Žˆ;Ž;Žz;Žs;Žl;Že;Ž^;ŽW;ŽP;ŽI;ŽB;Ž;;Ž4;Ž-;Ž&;Ž;Ž;Ž;Ž ;Ž;Žü:Žõ:Žî:Žç:Žà:ŽÙ:ŽÒ:ŽË:ŽÄ:޽:޶:ޝ:ލ:Ž¡:Žš:Ž“:ŽŒ:Ž…:Ž~:Žw:Žp:Ži:Žb:Ž[:ŽT:ŽM:ŽF:Ž?:Ž8:Ž1:Ž*:Ž#:Ž:Ž:Ž:Ž:Ž:Žù9Žò9Žë9Žä9ŽÝ9ŽÖ9ŽÏ9ŽÈ9ŽÁ9Žº9޳9ެ9Ž¥9Žž9Ž—9Ž9މ9Ž‚9Ž{9Žt9Žm9Žf9Ž_9ŽX9ŽQ9ŽJ9ŽC9Ž<9Ž59Ž.9Ž'9Ž 9Ž9Ž9Ž 9Ž9Žý8Žö8Žï8Žè8Žá8ŽÚ8ŽÓ8ŽÌ8ŽÅ8޾8Ž·8ް8Ž©8Ž¢8Ž›8Ž”8Ž8ކ8Ž8Žx8Žq8Žj8Žc8Ž\8ŽU8ŽN8ŽG8Ž@8Ž98Ž28Ž+8Ž$8Ž8Ž8Ž8Ž8Ž8Žú7Žó7Žì7Žå7ŽÞ7Ž×7ŽÐ7ŽÉ7ŽÂ7Ž»7Ž´7Ž­7ަ7ŽŸ7Ž˜7Ž‘7ŽŠ7Žƒ7Ž|7Žu7Žn7Žg7Ž`7ŽY7ŽR7ŽK7ŽD7Ž=7Ž67Ž/7Ž(7Ž!7Ž7Ž7Ž 7Ž7Žþ6Ž÷6Žð6Žé6Žâ6ŽÛ6ŽÔ6ŽÍ6ŽÆ6Ž¿6ޏ6ޱ6Žª6Ž£6Žœ6Ž•6ŽŽ6އ6Ž€6Žy6Žr6Žk6Žd6Ž]6ŽV6ŽO6ŽH6ŽA6Ž:6Ž36Ž,6Ž%6Ž6Ž6Ž6Ž 6Ž6Žû5Žô5Ží5Žæ5Žß5ŽØ5ŽÑ5ŽÊ5ŽÃ5޼5޵5Ž®5ާ5Ž 5Ž™5Ž’5Ž‹5Ž„5Ž}5Žv5Žo5Žh5Ža5ŽZ5ŽS5ŽL5ŽE5Ž>5Ž75Ž05Ž)5Ž"5Ž5Ž5Ž 5Ž5Žÿ4Žø4Žñ4Žê4Žã4ŽÜ4ŽÕ4ŽÎ4ŽÇ4ŽÀ4޹4޲4Ž«4ޤ4Ž4Ž–4Ž4Žˆ4Ž4Žz4Žs4Žl4Že4Ž^4ŽW4ŽP4ŽI4ŽB4Ž;4Ž44Ž-4Ž&4Ž4Ž4Ž4Ž 4Ž4Žü3Žõ3Žî3Žç3Žà3ŽÙ3ŽÒ3ŽË3ŽÄ3޽3޶3ޝ3ލ3Ž¡3Žš3Ž“3ŽŒ3Ž…3Ž~3Žw3Žp3Ži3Žb3Ž[3ŽT3ŽM3ŽF3Ž?3Ž83Ž13Ž*3Ž#3Ž3Ž3Ž3Ž3Ž3Žù2Žò2Žë2Žä2ŽÝ2ŽÖ2ŽÏ2ŽÈ2ŽÁ2Žº2޳2ެ2Ž¥2Žž2Ž—2Ž2މ2Ž‚2Ž{2Žt2Žm2Žf2Ž_2ŽX2ŽQ2ŽJ2ŽC2Ž<2Ž52Ž.2Ž'2Ž 2Ž2Ž2Ž 2Ž2Žý1Žö1Žï1Žè1Žá1ŽÚ1ŽÓ1ŽÌ1ŽÅ1޾1Ž·1ް1Ž©1Ž¢1Ž›1Ž”1Ž1ކ1Ž1Žx1Žq1Žj1Žc1Ž\1ŽU1ŽN1ŽG1Ž@1Ž91Ž21Ž+1Ž$1Ž1Ž1Ž1Ž1Ž1Žú0Žó0Žì0Žå0ŽÞ0Ž×0ŽÐ0ŽÉ0ŽÂ0Ž»0Ž´0Ž­0ަ0ŽŸ0Ž˜0Ž‘0ŽŠ0Žƒ0Ž|0Žu0Žn0Žg0Ž`0ŽY0ŽR0ŽK0ŽD0Ž=0Ž60Ž/0Ž(0Ž!0Ž0Ž0Ž 0Ž0Žþ/Ž÷/Žð/Žé/Žâ/ŽÛ/ŽÔ/ŽÍ/ŽÆ/Ž¿/ޏ/ޱ/Žª/Ž£/Žœ/Ž•/ŽŽ/އ/Ž€/Žy/Žr/Žk/Žd/Ž]/ŽV/ŽO/ŽH/ŽA/Ž:/Ž3/Ž,/Ž%/Ž/Ž/Ž/Ž /Ž/Žû.Žô.Ží.Žæ.Žß.ŽØ.ŽÑ.ŽÊ.ŽÃ.޼.޵.Ž®.ާ.Ž .Ž™.Ž’.Ž‹.Ž„.Ž}.Žv.Žo.Žh.Ža.ŽZ.ŽS.ŽL.ŽE.Ž>.Ž7.Ž0.Ž).Ž".Ž.Ž.Ž .Ž.Žÿ-Žø-Žñ-Žê-Žã-ŽÜ-ŽÕ-ŽÎ-ŽÇ-ŽÀ-޹-޲-Ž«-ޤ-Ž-Ž–-Ž-Žˆ-Ž-Žz-Žs-Žl-Že-Ž^-ŽW-ŽP-ŽI-ŽB-Ž;-Ž4-Ž--Ž&-Ž-Ž-Ž-Ž -Ž-Žü,Žõ,Žî,Žç,Žà,ŽÙ,ŽÒ,ŽË,ŽÄ,޽,޶,ޝ,ލ,Ž¡,Žš,Ž“,ŽŒ,Ž…,Ž~,Žw,Žp,Ži,Žb,Ž[,ŽT,ŽM,ŽF,Ž?,Ž8,Ž1,Ž*,Ž#,Ž,Ž,Ž,Ž,Ž,Žù+Žò+Žë+Žä+ŽÝ+ŽÖ+ŽÏ+ŽÈ+ŽÁ+Žº+޳+ެ+Ž¥+Žž+Ž—+Ž+މ+Ž‚+Ž{+Žt+Žm+Žf+Ž_+ŽX+ŽQ+ŽJ+ŽC+Ž<+Ž5+Ž.+Ž'+Ž +Ž+Ž+Ž +Ž+Žý*Žö*Žï*Žè*Žá*ŽÚ*ŽÓ*ŽÌ*ŽÅ*޾*Ž·*ް*Ž©*Ž¢*Ž›*Ž”*Ž*ކ*Ž*Žx*Žq*Žj*Žc*Ž\*ŽU*ŽN*ŽG*Ž@*Ž9*Ž2*Ž+*Ž$*Ž*Ž*Ž*Ž*Ž*Žú)Žó)Žì)Žå)ŽÞ)Ž×)ŽÐ)ŽÉ)ŽÂ)Ž»)Ž´)Ž­)ަ)ŽŸ)Ž˜)Ž‘)ŽŠ)Žƒ)Ž|)Žu)Žn)Žg)Ž`)ŽY)ŽR)ŽK)ŽD)Ž=)Ž6)Ž/)Ž()Ž!)Ž)Ž)Ž )Ž)Žþ(Ž÷(Žð(Žé(Žâ(ŽÛ(ŽÔ(ŽÍ(ŽÆ(Ž¿(ޏ(ޱ(Žª(Ž£(Žœ(Ž•(ŽŽ(އ(Ž€(Žy(Žr(Žk(Žd(Ž](ŽV(ŽO(ŽH(ŽA(Ž:(Ž3(Ž,(Ž%(Ž(Ž(Ž(Ž (Ž(Žû'Žô'Ží'Žæ'Žß'ŽØ'ŽÑ'ŽÊ'ŽÃ'޼'޵'Ž®'ާ'Ž 'Ž™'Ž’'Ž‹'Ž„'Ž}'Žv'Žo'Žh'Ža'ŽZ'ŽS'ŽL'ŽE'Ž>'Ž7'Ž0'Ž)'Ž"'Ž'Ž'Ž 'Ž'Žÿ&Žø&Žñ&Žê&Žã&ŽÜ&ŽÕ&ŽÎ&ŽÇ&ŽÀ&޹&޲&Ž«&ޤ&Ž&Ž–&Ž&Žˆ&Ž&Žz&Žs&Žl&Že&Ž^&ŽW&ŽP&ŽI&ŽB&Ž;&Ž4&Ž-&Ž&&Ž&Ž&Ž&Ž &Ž&Žü%Žõ%Žî%Žç%Žà%ŽÙ%ŽÒ%ŽË%ŽÄ%޽%޶%ޝ%ލ%Ž¡%Žš%Ž“%ŽŒ%Ž…%Ž~%Žw%Žp%Ži%Žb%Ž[%ŽT%ŽM%ŽF%Ž?%Ž8%Ž1%Ž*%Ž#%Ž%Ž%Ž%Ž%Ž%Žù$Žò$Žë$Žä$ŽÝ$ŽÖ$ŽÏ$ŽÈ$ŽÁ$Žº$޳$ެ$Ž¥$Žž$Ž—$Ž$މ$Ž‚$Ž{$Žt$Žm$Žf$Ž_$ŽX$ŽQ$ŽJ$ŽC$Ž<$Ž5$Ž.$Ž'$Ž $Ž$Ž$Ž $Ž$Žý#Žö#Žï#Žè#Žá#ŽÚ#ŽÓ#ŽÌ#ŽÅ#޾#Ž·#ް#Ž©#Ž¢#Ž›#Ž”#Ž#ކ#Ž#Žx#Žq#Žj#Žc#Ž\#ŽU#ŽN#ŽG#Ž@#Ž9#Ž2#Ž+#Ž$#Ž#Ž#Ž#Ž#Ž#Žú"Žó"Žì"Žå"ŽÞ"Ž×"ŽÐ"ŽÉ"ŽÂ"Ž»"Ž´"Ž­"ަ"ŽŸ"Ž˜"Ž‘"ŽŠ"Žƒ"Ž|"Žu"Žn"Žg"Ž`"ŽY"ŽR"ŽK"ŽD"Ž="Ž6"Ž/"Ž("Ž!"Ž"Ž"Ž "Ž"Žþ!Ž÷!Žð!Žé!Žâ!ŽÛ!ŽÔ!ŽÍ!ŽÆ!Ž¿!ޏ!ޱ!Žª!Ž£!Žœ!Ž•!ŽŽ!އ!Ž€!Žy!Žr!Žk!Žd!Ž]!ŽV!ŽO!ŽH!ŽA!Ž:!Ž3!Ž,!Ž%!Ž!Ž!Ž!Ž !Ž!Žû Žô Ží Žæ Žß ŽØ ŽÑ ŽÊ Žà ޼ ޵ Ž® ާ Ž  Ž™ Ž’ Ž‹ Ž„ Ž} Žv Žo Žh Ža ŽZ ŽS ŽL ŽE Ž> Ž7 Ž0 Ž) Ž" Ž Ž Ž Ž ŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúŽóŽìŽåŽÞŽ×ŽÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûŽôŽíŽæŽßŽØŽÑŽÊŽÃ޼޵ޮާޠޙޒދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúŽóŽìŽåŽÞŽ×ŽÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûŽôŽíŽæŽßŽØŽÑŽÊŽÃ޼޵ޮާޠޙޒދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽú Žó Žì Žå ŽÞ Ž× ŽÐ ŽÉ Ž Ž» Ž´ Ž­ ަ ŽŸ Ž˜ Ž‘ ŽŠ Žƒ Ž| Žu Žn Žg Ž` ŽY ŽR ŽK ŽD Ž= Ž6 Ž/ Ž( Ž! Ž Ž Ž Ž Žþ Ž÷ Žð Žé Žâ ŽÛ ŽÔ ŽÍ ŽÆ Ž¿ ޏ ޱ Žª Ž£ Žœ Ž• ŽŽ އ Ž€ Žy Žr Žk Žd Ž] ŽV ŽO ŽH ŽA Ž: Ž3 Ž, Ž% Ž Ž Ž Ž Ž Žû Žô Ží Žæ Žß ŽØ ŽÑ ŽÊ Žà ޼ ޵ Ž® ާ Ž  Ž™ Ž’ Ž‹ Ž„ Ž} Žv Žo Žh Ža ŽZ ŽS ŽL ŽE Ž> Ž7 Ž0 Ž) Ž" Ž Ž Ž Ž Žÿ Žø Žñ Žê Žã ŽÜ ŽÕ ŽÎ ŽÇ ŽÀ ޹ ޲ Ž« ޤ Ž Ž– Ž Žˆ Ž Žz Žs Žl Že Ž^ ŽW ŽP ŽI ŽB Ž; Ž4 Ž- Ž& Ž Ž Ž Ž Ž Žü Žõ Žî Žç Žà ŽÙ ŽÒ ŽË ŽÄ ޽ ޶ ޝ ލ Ž¡ Žš Ž“ ŽŒ Ž… Ž~ Žw Žp Ži Žb Ž[ ŽT ŽM ŽF Ž? Ž8 Ž1 Ž* Ž# Ž Ž Ž Ž Ž ŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúŽóŽìŽåŽÞŽ×ŽÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûŽôŽíŽæŽßŽØŽÑŽÊŽÃ޼޵ޮާޠޙޒދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿŒõÿŒîÿŒçÿŒàÿŒÙÿŒÒÿŒËÿŒÄÿŒ½ÿŒ¶ÿŒ¯ÿŒ¨ÿŒ¡ÿŒšÿŒ“ÿŒŒÿŒ…ÿŒ~ÿŒwÿŒpÿŒiÿŒbÿŒ[ÿŒTÿŒMÿŒFÿŒ?ÿŒ8ÿŒ1ÿŒ*ÿŒ#ÿŒÿŒÿŒÿŒÿŒÿŒùþŒòþŒëþŒäþŒÝþŒÖþŒÏþŒÈþŒÁþŒºþŒ³þŒ¬þŒ¥þŒžþŒ—þŒþŒ‰þŒ‚þŒ{þŒtþŒmþŒfþŒ_þŒXþŒQþŒJþŒCþŒ<þŒ5þŒ.þŒ'þŒ þŒþŒþŒ þŒþŒýýŒöýŒïýŒèýŒáýŒÚýŒÓýŒÌýŒÅýŒ¾ýŒ·ýŒ°ýŒ©ýŒ¢ýŒ›ýŒ”ýŒýŒ†ýŒýŒxýŒqýŒjýŒcýŒ\ýŒUýŒNýŒGýŒ@ýŒ9ýŒ2ýŒ+ýŒ$ýŒýŒýŒýŒýŒýŒúüŒóüŒìüŒåüŒÞüŒ×üŒÐüŒÉüŒÂüŒ»üŒ´üŒ­üŒ¦üŒŸüŒ˜üŒ‘üŒŠüŒƒüŒ|üŒuüŒnüŒgüŒ`üŒYüŒRüŒKüŒDüŒ=üŒ6üŒ/üŒ(üŒ!üŒüŒüŒ üŒüŒþûŒ÷ûŒðûŒéûŒâûŒÛûŒÔûŒÍûŒÆûŒ¿ûŒ¸ûŒ±ûŒªûŒ£ûŒœûŒ•ûŒŽûŒ‡ûŒ€ûŒyûŒrûŒkûŒdûŒ]ûŒVûŒOûŒHûŒAûŒ:ûŒ3ûŒ,ûŒ%ûŒûŒûŒûŒ ûŒûŒûúŒôúŒíúŒæúŒßúŒØúŒÑúŒÊúŒÃúŒ¼úŒµúŒ®úŒ§úŒ úŒ™úŒ’úŒ‹úŒ„úŒ}úŒvúŒoúŒhúŒaúŒZúŒSúŒLúŒEúŒ>úŒ7úŒ0úŒ)úŒ"úŒúŒúŒ úŒúŒÿùŒøùŒñùŒêùŒãùŒÜùŒÕùŒÎùŒÇùŒÀùŒ¹ùŒ²ùŒ«ùŒ¤ùŒùŒ–ùŒùŒˆùŒùŒzùŒsùŒlùŒeùŒ^ùŒWùŒPùŒIùŒBùŒ;ùŒ4ùŒ-ùŒ&ùŒùŒùŒùŒ ùŒùŒüøŒõøŒîøŒçøŒàøŒÙøŒÒøŒËøŒÄøŒ½øŒ¶øŒ¯øŒ¨øŒ¡øŒšøŒ“øŒŒøŒ…øŒ~øŒwøŒpøŒiøŒbøŒ[øŒTøŒMøŒFøŒ?øŒ8øŒ1øŒ*øŒ#øŒøŒøŒøŒøŒøŒù÷Œò÷Œë÷Œä÷ŒÝ÷ŒÖ÷ŒÏ÷ŒÈ÷ŒÁ÷Œº÷Œ³÷Œ¬÷Œ¥÷Œž÷Œ—÷Œ÷Œ‰÷Œ‚÷Œ{÷Œt÷Œm÷Œf÷Œ_÷ŒX÷ŒQ÷ŒJ÷ŒC÷Œ<÷Œ5÷Œ.÷Œ'÷Œ ÷Œ÷Œ÷Œ ÷Œ÷ŒýöŒööŒïöŒèöŒáöŒÚöŒÓöŒÌöŒÅöŒ¾öŒ·öŒ°öŒ©öŒ¢öŒ›öŒ”öŒöŒ†öŒöŒxöŒqöŒjöŒcöŒ\öŒUöŒNöŒGöŒ@öŒ9öŒ2öŒ+öŒ$öŒöŒöŒöŒöŒöŒúõŒóõŒìõŒåõŒÞõŒ×õŒÐõŒÉõŒÂõŒ»õŒ´õŒ­õŒ¦õŒŸõŒ˜õŒ‘õŒŠõŒƒõŒ|õŒuõŒnõŒgõŒ`õŒYõŒRõŒKõŒDõŒ=õŒ6õŒ/õŒ(õŒ!õŒõŒõŒ õŒõŒþôŒ÷ôŒðôŒéôŒâôŒÛôŒÔôŒÍôŒÆôŒ¿ôŒ¸ôŒ±ôŒªôŒ£ôŒœôŒ•ôŒŽôŒ‡ôŒ€ôŒyôŒrôŒkôŒdôŒ]ôŒVôŒOôŒHôŒAôŒ:ôŒ3ôŒ,ôŒ%ôŒôŒôŒôŒ ôŒôŒûóŒôóŒíóŒæóŒßóŒØóŒÑóŒÊóŒÃóŒ¼óŒµóŒ®óŒ§óŒ óŒ™óŒ’óŒ‹óŒ„óŒ}óŒvóŒoóŒhóŒaóŒZóŒSóŒLóŒEóŒ>óŒ7óŒ0óŒ)óŒ"óŒóŒóŒ óŒóŒÿòŒøòŒñòŒêòŒãòŒÜòŒÕòŒÎòŒÇòŒÀòŒ¹òŒ²òŒ«òŒ¤òŒòŒ–òŒòŒˆòŒòŒzòŒsòŒlòŒeòŒ^òŒWòŒPòŒIòŒBòŒ;òŒ4òŒ-òŒ&òŒòŒòŒòŒ òŒòŒüñŒõñŒîñŒçñŒàñŒÙñŒÒñŒËñŒÄñŒ½ñŒ¶ñŒ¯ñŒ¨ñŒ¡ñŒšñŒ“ñŒŒñŒ…ñŒ~ñŒwñŒpñŒiñŒbñŒ[ñŒTñŒMñŒFñŒ?ñŒ8ñŒ1ñŒ*ñŒ#ñŒñŒñŒñŒñŒñŒùðŒòðŒëðŒäðŒÝðŒÖðŒÏðŒÈðŒÁðŒºðŒ³ðŒ¬ðŒ¥ðŒžðŒ—ðŒðŒ‰ðŒ‚ðŒ{ðŒtðŒmðŒfðŒ_ðŒXðŒQðŒJðŒCðŒ<ðŒ5ðŒ.ðŒ'ðŒ ðŒðŒðŒ ðŒðŒýïŒöïŒïïŒèïŒáïŒÚïŒÓïŒÌïŒÅïŒïŒ†ïŒïŒxïŒqïŒjïŒcïŒ\ïŒUïŒNïŒGïŒ@ïŒ9ïŒ2ïŒ+ïŒ$ïŒïŒïŒïŒïŒïŒúîŒóîŒìîŒåîŒÞîŒ×îŒÐîŒÉîŒÂîŒ|îŒuîŒnîŒgîŒ`îŒYîŒRîŒKîŒDîŒ=îŒ6îŒ/îŒ(îŒ!îŒîŒîŒ îŒîŒþíŒ÷íŒðíŒéíŒâíŒÛíŒÔíŒÍíŒÆíŒ¿íŒ¸íŒ±íŒªíŒ£íŒœíŒ•íŒŽíŒ‡íŒ€íŒyíŒríŒkíŒdíŒ]íŒVíŒOíŒHíŒAíŒ:íŒ3íŒ,íŒ%íŒíŒíŒíŒ íŒíŒûìŒôìŒíìŒæìŒßìŒØìŒÑìŒÊìŒÃ쌼쌵쌮쌧쌠쌙쌒쌋쌄ìŒ}ìŒvìŒoìŒhìŒaìŒZìŒSìŒLìŒEìŒ>ìŒ7ìŒ0ìŒ)ìŒ"ìŒìŒìŒ ìŒìŒÿëŒøëŒñëŒêëŒãëŒÜëŒÕëŒÎëŒÇëŒÀ댹댲댫댤ëŒëŒ–ëŒëŒˆëŒëŒzëŒsëŒlëŒeëŒ^ëŒWëŒPëŒIëŒBëŒ;ëŒ4ëŒ-ëŒ&ëŒëŒëŒëŒ ëŒëŒüêŒõêŒîêŒçêŒàêŒÙêŒÒêŒËêŒÄꌽꌶꌯꌨꌡꌚꌓꌌꌅêŒ~êŒwêŒpêŒiêŒbêŒ[êŒTêŒMêŒFêŒ?êŒ8êŒ1êŒ*êŒ#êŒêŒêŒêŒêŒêŒùéŒòéŒëéŒäéŒÝéŒÖéŒÏéŒÈéŒÁ錺錳錬錥錞錗éŒéŒ‰éŒ‚éŒ{éŒtéŒméŒféŒ_éŒXéŒQéŒJéŒCéŒ<éŒ5éŒ.éŒ'éŒ éŒéŒéŒ éŒéŒýèŒöèŒïèŒèèŒáèŒÚèŒÓèŒÌèŒÅ茾茷茰茩茢茛茔èŒèŒ†èŒèŒxèŒqèŒjèŒcèŒ\èŒUèŒNèŒGèŒ@èŒ9èŒ2èŒ+èŒ$èŒèŒèŒèŒèŒèŒúçŒóçŒìçŒåçŒÞçŒ×çŒÐçŒÉçŒÂ猻猴猭猦猟猘猑猊猃çŒ|çŒuçŒnçŒgçŒ`çŒYçŒRçŒKçŒDçŒ=çŒ6çŒ/çŒ(çŒ!çŒçŒçŒ çŒçŒþæŒ÷æŒðæŒéæŒâæŒÛæŒÔæŒÍæŒÆæŒ¿æŒ¸æŒ±æŒªæŒ£æŒœæŒ•æŒŽæŒ‡æŒ€æŒyæŒræŒkæŒdæŒ]æŒVæŒOæŒHæŒAæŒ:æŒ3æŒ,æŒ%æŒæŒæŒæŒ æŒæŒûåŒôåŒíåŒæåŒßåŒØåŒÑåŒÊåŒÃ匼匵匮匧匠匙匒匋匄åŒ}åŒvåŒoåŒhåŒaåŒZåŒSåŒLåŒEåŒ>åŒ7åŒ0åŒ)åŒ"åŒåŒåŒ åŒåŒÿäŒøäŒñäŒêäŒãäŒÜäŒÕäŒÎäŒÇäŒÀ䌹䌲䌫䌤äŒäŒ–äŒäŒˆäŒäŒzäŒsäŒläŒeäŒ^äŒWäŒPäŒIäŒBäŒ;äŒ4äŒ-äŒ&äŒäŒäŒäŒ äŒäŒüãŒõãŒîãŒçãŒàãŒÙãŒÒãŒËãŒÄ㌽㌶㌯㌨㌡㌚㌓㌌㌅ãŒ~ãŒwãŒpãŒiãŒbãŒ[ãŒTãŒMãŒFãŒ?ãŒ8ãŒ1ãŒ*ãŒ#ãŒãŒãŒãŒãŒãŒùâŒòâŒëâŒäâŒÝâŒÖâŒÏâŒÈâŒÁ⌺⌳⌬⌥⌞⌗âŒâŒ‰âŒ‚âŒ{âŒtâŒmâŒfâŒ_âŒXâŒQâŒJâŒCâŒ<âŒ5âŒ.âŒ'⌠âŒâŒâŒ âŒâŒýáŒöáŒïáŒèáŒááŒÚáŒÓáŒÌáŒÅጾጷጰጩጢጛጔáŒáŒ†áŒáŒxáŒqáŒjáŒcáŒ\áŒUáŒNáŒGáŒ@áŒ9áŒ2áŒ+áŒ$áŒáŒáŒáŒáŒáŒúàŒóàŒìàŒåàŒÞàŒ×àŒÐàŒÉàŒÂàŒ»àŒ´àŒ­àŒ¦àŒŸàŒ˜àŒ‘àŒŠàŒƒàŒ|àŒuàŒnàŒgàŒ`àŒYàŒRàŒKàŒDàŒ=àŒ6àŒ/àŒ(àŒ!àŒàŒàŒ àŒàŒþߌ÷ߌðߌéߌâߌÛߌÔߌÍߌÆßŒ¿ßŒ¸ßŒ±ßŒªßŒ£ßŒœßŒ•ߌŽßŒ‡ßŒ€ßŒyߌrߌkߌdߌ]ߌVߌOߌHߌAߌ:ߌ3ߌ,ߌ%ߌߌߌߌ ߌߌûÞŒôÞŒíÞŒæÞŒßÞŒØÞŒÑÞŒÊÞŒÃÞŒ¼ÞŒµÞŒ®ÞŒ§ÞŒ ÞŒ™ÞŒ’ÞŒ‹ÞŒ„ÞŒ}ÞŒvÞŒoÞŒhÞŒaÞŒZÞŒSÞŒLÞŒEÞŒ>ÞŒ7ÞŒ0ÞŒ)ÞŒ"ތތތ ތތÿÝŒøÝŒñÝŒêÝŒãÝŒÜÝŒÕÝŒÎÝŒÇÝŒÀÝŒ¹ÝŒ²ÝŒ«ÝŒ¤ÝŒÝŒ–݌݌ˆÝŒÝŒzÝŒsÝŒlÝŒeÝŒ^ÝŒWÝŒPÝŒIÝŒBÝŒ;ÝŒ4ÝŒ-ÝŒ&݌݌݌݌ ݌݌üÜŒõÜŒîÜŒçÜŒàÜŒÙÜŒÒÜŒËÜŒÄÜŒ½ÜŒ¶ÜŒ¯ÜŒ¨ÜŒ¡ÜŒšÜŒ“ÜŒŒÜŒ…ÜŒ~ÜŒwÜŒpÜŒiÜŒbÜŒ[ÜŒTÜŒMÜŒFÜŒ?ÜŒ8ÜŒ1ÜŒ*ÜŒ#܌܌܌܌܌܌ùÛŒòÛŒëÛŒäÛŒÝÛŒÖÛŒÏÛŒÈÛŒÁÛŒºÛŒ³ÛŒ¬ÛŒ¥ÛŒžÛŒ—یی‰ÛŒ‚ÛŒ{ÛŒtÛŒmÛŒfÛŒ_ÛŒXÛŒQÛŒJÛŒCÛŒ<ÛŒ5ÛŒ.ÛŒ'ÛŒ ییی ییýÚŒöÚŒïÚŒèÚŒáÚŒÚÚŒÓÚŒÌÚŒÅÚŒ¾ÚŒ·ÚŒ°ÚŒ©ÚŒ¢ÚŒ›ÚŒ”ڌڌ†ÚŒÚŒxÚŒqÚŒjÚŒcÚŒ\ÚŒUÚŒNÚŒGÚŒ@ÚŒ9ÚŒ2ÚŒ+ÚŒ$ڌڌڌڌڌڌúÙŒóÙŒìÙŒåÙŒÞÙŒ×ÙŒÐÙŒÉÙŒÂÙŒ»ÙŒ´ÙŒ­ÙŒ¦ÙŒŸÙŒ˜ÙŒ‘ÙŒŠÙŒƒÙŒ|ÙŒuÙŒnÙŒgÙŒ`ÙŒYÙŒRÙŒKÙŒDÙŒ=ÙŒ6ÙŒ/ÙŒ(ÙŒ!ٌٌٌ ٌٌþØŒ÷ØŒðØŒéØŒâØŒÛØŒÔØŒÍØŒÆØŒ¿ØŒ¸ØŒ±ØŒªØŒ£ØŒœØŒ•ØŒŽØŒ‡ØŒ€ØŒyØŒrØŒkØŒdØŒ]ØŒVØŒOØŒHØŒAØŒ:ØŒ3ØŒ,ØŒ%،،،، ،،û׌ô׌í׌æ×Œß׌Ø×ŒÑ׌Ê׌Ã׌¼×Œµ×Œ®×Œ§×Œ ×Œ™×Œ’׌‹×Œ„׌}׌v׌o׌h׌a׌Z׌S׌L׌E׌>׌7׌0׌)׌"׌׌׌ ׌׌ÿÖŒøÖŒñÖŒêÖŒãÖŒÜÖŒÕÖŒÎÖŒÇÖŒÀÖŒ¹ÖŒ²ÖŒ«ÖŒ¤ÖŒÖŒ–֌֌ˆÖŒÖŒzÖŒsÖŒlÖŒeÖŒ^ÖŒWÖŒPÖŒIÖŒBÖŒ;ÖŒ4ÖŒ-ÖŒ&֌֌֌֌ ֌֌üÕŒõÕŒîÕŒçÕŒàÕŒÙÕŒÒÕŒËÕŒÄÕŒ½ÕŒ¶ÕŒ¯ÕŒ¨ÕŒ¡ÕŒšÕŒ“ÕŒŒÕŒ…ÕŒ~ÕŒwÕŒpÕŒiÕŒbÕŒ[ÕŒTÕŒMÕŒFÕŒ?ÕŒ8ÕŒ1ÕŒ*ÕŒ#ՌՌՌՌՌՌùÔŒòÔŒëÔŒäÔŒÝÔŒÖÔŒÏÔŒÈÔŒÁÔŒºÔŒ³ÔŒ¬ÔŒ¥ÔŒžÔŒ—ԌԌ‰ÔŒ‚ÔŒ{ÔŒtÔŒmÔŒfÔŒ_ÔŒXÔŒQÔŒJÔŒCÔŒ<ÔŒ5ÔŒ.ÔŒ'ÔŒ ԌԌԌ ԌԌýÓŒöÓŒïÓŒèÓŒáÓŒÚÓŒÓÓŒÌÓŒÅÓŒ¾ÓŒ·ÓŒ°ÓŒ©ÓŒ¢ÓŒ›ÓŒ”ӌӌ†ÓŒÓŒxÓŒqÓŒjÓŒcÓŒ\ÓŒUÓŒNÓŒGÓŒ@ÓŒ9ÓŒ2ÓŒ+ÓŒ$ӌӌӌӌӌӌúÒŒóÒŒìÒŒåÒŒÞÒŒ×ÒŒÐÒŒÉÒŒÂÒŒ»ÒŒ´ÒŒ­ÒŒ¦ÒŒŸÒŒ˜ÒŒ‘ÒŒŠÒŒƒÒŒ|ÒŒuÒŒnÒŒgÒŒ`ÒŒYÒŒRÒŒKÒŒDÒŒ=ÒŒ6ÒŒ/ÒŒ(ÒŒ!ҌҌҌ ҌҌþÑŒ÷ÑŒðÑŒéÑŒâÑŒÛÑŒÔÑŒÍÑŒÆÑŒ¿ÑŒ¸ÑŒ±ÑŒªÑŒ£ÑŒœÑŒ•ÑŒŽÑŒ‡ÑŒ€ÑŒyÑŒrÑŒkÑŒdÑŒ]ÑŒVÑŒOÑŒHÑŒAÑŒ:ÑŒ3ÑŒ,ÑŒ%ьььь ььûÐŒôÐŒíÐŒæÐŒßÐŒØÐŒÑÐŒÊÐŒÃÐŒ¼ÐŒµÐŒ®ÐŒ§ÐŒ ÐŒ™ÐŒ’ÐŒ‹ÐŒ„ÐŒ}ÐŒvÐŒoÐŒhÐŒaÐŒZÐŒSÐŒLÐŒEÐŒ>ÐŒ7ÐŒ0ÐŒ)ÐŒ"ЌЌЌ ЌЌÿÏŒøÏŒñÏŒêÏŒãÏŒÜÏŒÕÏŒÎÏŒÇÏŒÀÏŒ¹ÏŒ²ÏŒ«ÏŒ¤ÏŒÏŒ–όόˆÏŒÏŒzÏŒsÏŒlÏŒeÏŒ^ÏŒWÏŒPÏŒIÏŒBÏŒ;ÏŒ4ÏŒ-ÏŒ&όόόό όόüÎŒõÎŒîÎŒçÎŒàÎŒÙÎŒÒÎŒËÎŒÄÎŒ½ÎŒ¶ÎŒ¯ÎŒ¨ÎŒ¡ÎŒšÎŒ“ÎŒŒÎŒ…ÎŒ~ÎŒwÎŒpÎŒiÎŒbÎŒ[ÎŒTÎŒMÎŒFÎŒ?ÎŒ8ÎŒ1ÎŒ*ÎŒ#ΌΌΌΌΌΌùÍŒòÍŒëÍŒäÍŒÝÍŒÖÍŒÏÍŒÈÍŒÁÍŒºÍŒ³ÍŒ¬ÍŒ¥ÍŒžÍŒ—͌͌‰ÍŒ‚ÍŒ{ÍŒtÍŒmÍŒfÍŒ_ÍŒXÍŒQÍŒJÍŒCÍŒ<ÍŒ5ÍŒ.ÍŒ'ÍŒ ͌͌͌ ͌͌ýÌŒöÌŒïÌŒèÌŒáÌŒÚÌŒÓÌŒÌÌŒÅÌŒ¾ÌŒ·ÌŒ°ÌŒ©ÌŒ¢ÌŒ›ÌŒ”̌̌†ÌŒÌŒxÌŒqÌŒjÌŒcÌŒ\ÌŒUÌŒNÌŒGÌŒ@ÌŒ9ÌŒ2ÌŒ+ÌŒ$̌̌̌̌̌̌úËŒóËŒìËŒåËŒÞËŒ×ËŒÐËŒÉËŒÂËŒ»ËŒ´ËŒ­ËŒ¦ËŒŸËŒ˜ËŒ‘ËŒŠËŒƒËŒ|ËŒuËŒnËŒgËŒ`ËŒYËŒRËŒKËŒDËŒ=ËŒ6ËŒ/ËŒ(ËŒ!ˌˌˌ ˌˌþÊŒ÷ÊŒðÊŒéÊŒâÊŒÛÊŒÔÊŒÍÊŒÆÊŒ¿ÊŒ¸ÊŒ±ÊŒªÊŒ£ÊŒœÊŒ•ÊŒŽÊŒ‡ÊŒ€ÊŒyÊŒrÊŒkÊŒdÊŒ]ÊŒVÊŒOÊŒHÊŒAÊŒ:ÊŒ3ÊŒ,ÊŒ%ʌʌʌʌ ʌʌûÉŒôÉŒíÉŒæÉŒßÉŒØÉŒÑÉŒÊÉŒÃÉŒ¼ÉŒµÉŒ®ÉŒ§ÉŒ ÉŒ™ÉŒ’ÉŒ‹ÉŒ„ÉŒ}ÉŒvÉŒoÉŒhÉŒaÉŒZÉŒSÉŒLÉŒEÉŒ>ÉŒ7ÉŒ0ÉŒ)ÉŒ"ɌɌɌ ɌɌÿÈŒøÈŒñÈŒêÈŒãÈŒÜÈŒÕÈŒÎÈŒÇÈŒÀÈŒ¹ÈŒ²ÈŒ«ÈŒ¤ÈŒÈŒ–ȌȌˆÈŒÈŒzÈŒsÈŒlÈŒeÈŒ^ÈŒWÈŒPÈŒIÈŒBÈŒ;ÈŒ4ÈŒ-ÈŒ&ȌȌȌȌ ȌȌüÇŒõÇŒîÇŒçÇŒàÇŒÙÇŒÒÇŒËÇŒÄÇŒ½ÇŒ¶ÇŒ¯ÇŒ¨ÇŒ¡ÇŒšÇŒ“ÇŒŒÇŒ…ÇŒ~ÇŒwÇŒpÇŒiÇŒbÇŒ[ÇŒTÇŒMÇŒFÇŒ?ÇŒ8ÇŒ1ÇŒ*ÇŒ#njnjnjnjnjnjùÆŒòÆŒëÆŒäÆŒÝÆŒÖÆŒÏÆŒÈÆŒÁÆŒºÆŒ³ÆŒ¬ÆŒ¥ÆŒžÆŒ—ƌƌ‰ÆŒ‚ÆŒ{ÆŒtÆŒmÆŒfÆŒ_ÆŒXÆŒQÆŒJÆŒCÆŒ<ÆŒ5ÆŒ.ÆŒ'ÆŒ ƌƌƌ ƌƌýÅŒöÅŒïÅŒèÅŒáÅŒÚÅŒÓÅŒÌÅŒÅÅŒ¾ÅŒ·ÅŒ°ÅŒ©ÅŒ¢ÅŒ›ÅŒ”ŌŌ†ÅŒÅŒxÅŒqÅŒjÅŒcÅŒ\ÅŒUÅŒNÅŒGÅŒ@ÅŒ9ÅŒ2ÅŒ+ÅŒ$ŌŌŌŌŌŌúÄŒóÄŒìÄŒåÄŒÞÄŒ×ÄŒÐÄŒÉÄŒÂÄŒ»ÄŒ´ÄŒ­ÄŒ¦ÄŒŸÄŒ˜ÄŒ‘ÄŒŠÄŒƒÄŒ|ÄŒuÄŒnÄŒgÄŒ`ÄŒYÄŒRÄŒKÄŒDÄŒ=ÄŒ6ÄŒ/ÄŒ(ÄŒ!ČČČ ČČþÃŒ÷ÃŒðÃŒéÃŒâÃŒÛÃŒÔÃŒÍÃŒÆÃŒ¿ÃŒ¸ÃŒ±ÃŒªÃŒ£ÃŒœÃŒ•ÃŒŽÃŒ‡ÃŒ€ÃŒyÃŒrÃŒkÃŒdÃŒ]ÃŒVÃŒOÃŒHÃŒAÃŒ:ÃŒ3ÃŒ,ÃŒ%ÌÌÌÌ ÌÌûÂŒôÂŒíÂŒæÂŒßÂŒØÂŒÑÂŒÊÂŒÃÂŒ¼ÂŒµÂŒ®ÂŒ§ÂŒ ÂŒ™ÂŒ’ÂŒ‹ÂŒ„ÂŒ}ÂŒvÂŒoÂŒhÂŒaÂŒZÂŒSÂŒLÂŒEÂŒ>ÂŒ7ÂŒ0ÂŒ)ÂŒ"ŒŒŒ ŒŒÿÁŒøÁŒñÁŒêÁŒãÁŒÜÁŒÕÁŒÎÁŒÇÁŒÀÁŒ¹ÁŒ²ÁŒ«ÁŒ¤ÁŒÁŒ–ÁŒÁŒˆÁŒÁŒzÁŒsÁŒlÁŒeÁŒ^ÁŒWÁŒPÁŒIÁŒBÁŒ;ÁŒ4ÁŒ-ÁŒ&ÁŒÁŒÁŒÁŒ ÁŒÁŒüÀŒõÀŒîÀŒçÀŒàÀŒÙÀŒÒÀŒËÀŒÄÀŒ½ÀŒ¶ÀŒ¯ÀŒ¨ÀŒ¡ÀŒšÀŒ“ÀŒŒÀŒ…ÀŒ~ÀŒwÀŒpÀŒiÀŒbÀŒ[ÀŒTÀŒMÀŒFÀŒ?ÀŒ8ÀŒ1ÀŒ*ÀŒ#ÀŒÀŒÀŒÀŒÀŒÀŒù¿Œò¿Œ뿌俌Ý¿ŒÖ¿ŒÏ¿ŒÈ¿ŒÁ¿Œº¿Œ³¿Œ¬¿Œ¥¿Œž¿Œ—¿Œ¿Œ‰¿Œ‚¿Œ{¿Œt¿Œm¿Œf¿Œ_¿ŒX¿ŒQ¿ŒJ¿ŒC¿Œ<¿Œ5¿Œ.¿Œ'¿Œ ¿Œ¿Œ¿Œ ¿Œ¿Œý¾Œö¾Œフ辌ᾌÚ¾ŒÓ¾Œ̾ŒžŒ¾¾Œ·¾Œ°¾Œ©¾Œ¢¾Œ›¾Œ”¾Œ¾Œ†¾Œ¾Œx¾Œq¾Œj¾Œc¾Œ\¾ŒU¾ŒN¾ŒG¾Œ@¾Œ9¾Œ2¾Œ+¾Œ$¾Œ¾Œ¾Œ¾Œ¾Œ¾Œú½Œó½Œ콌彌Þ½Œ×½ŒнŒɽŒ½Œ»½Œ´½Œ­½Œ¦½ŒŸ½Œ˜½Œ‘½ŒнŒƒ½Œ|½Œu½Œn½Œg½Œ`½ŒY½ŒR½ŒK½ŒD½Œ=½Œ6½Œ/½Œ(½Œ!½Œ½Œ½Œ ½Œ½Œþ¼Œ÷¼Œð¼Œ鼌⼌Û¼ŒÔ¼ŒͼŒƼŒ¿¼Œ¸¼Œ±¼Œª¼Œ£¼Œœ¼Œ•¼Œ޼Œ‡¼Œ€¼Œy¼Œr¼Œk¼Œd¼Œ]¼ŒV¼ŒO¼ŒH¼ŒA¼Œ:¼Œ3¼Œ,¼Œ%¼Œ¼Œ¼Œ¼Œ ¼Œ¼Œû»Œô»Œí»Œ滌ß»ŒØ»ŒÑ»ŒÊ»ŒûŒ¼»Œµ»Œ®»Œ§»Œ »Œ™»Œ’»Œ‹»Œ„»Œ}»Œv»Œo»Œh»Œa»ŒZ»ŒS»ŒL»ŒE»Œ>»Œ7»Œ0»Œ)»Œ"»Œ»Œ»Œ »Œ»ŒÿºŒøºŒñºŒ꺌㺌ܺŒÕºŒκŒǺŒÀºŒ¹ºŒ²ºŒ«ºŒ¤ºŒºŒ–ºŒºŒˆºŒºŒzºŒsºŒlºŒeºŒ^ºŒWºŒPºŒIºŒBºŒ;ºŒ4ºŒ-ºŒ&ºŒºŒºŒºŒ ºŒºŒü¹Œõ¹Œ繌์Ù¹ŒÒ¹Œ˹ŒĹŒ½¹Œ¶¹Œ¯¹Œ¨¹Œ¡¹Œš¹Œ“¹ŒŒ¹Œ…¹Œ~¹Œw¹Œp¹Œi¹Œb¹Œ[¹ŒT¹ŒM¹ŒF¹Œ?¹Œ8¹Œ1¹Œ*¹Œ#¹Œ¹Œ¹Œ¹Œ¹Œ¹Œù¸Œò¸Œ브丌ݸŒÖ¸ŒϸŒȸŒÁ¸Œº¸Œ³¸Œ¬¸Œ¥¸Œž¸Œ—¸Œ¸Œ‰¸Œ‚¸Œ{¸Œt¸Œm¸Œf¸Œ_¸ŒX¸ŒQ¸ŒJ¸ŒC¸Œ<¸Œ5¸Œ.¸Œ'¸Œ ¸Œ¸Œ¸Œ ¸Œ¸Œý·Œö·Œï·Œè·Œá·ŒÚ·ŒÓ·ŒÌ·ŒÅ·Œ¾·Œ··Œ°·Œ©·Œ¢·Œ›·Œ”·Œ·Œ†·Œ·Œx·Œq·Œj·Œc·Œ\·ŒU·ŒN·ŒG·Œ@·Œ9·Œ2·Œ+·Œ$·Œ·Œ·Œ·Œ·Œ·Œú¶Œó¶Œì¶Œå¶ŒÞ¶Œ×¶ŒжŒɶŒ¶Œ»¶Œ´¶Œ­¶Œ¦¶ŒŸ¶Œ˜¶Œ‘¶ŒжŒƒ¶Œ|¶Œu¶Œn¶Œg¶Œ`¶ŒY¶ŒR¶ŒK¶ŒD¶Œ=¶Œ6¶Œ/¶Œ(¶Œ!¶Œ¶Œ¶Œ ¶Œ¶ŒþµŒ÷µŒðµŒ鵌ⵌÛµŒÔµŒ͵ŒƵŒ¿µŒ¸µŒ±µŒªµŒ£µŒœµŒ•µŒ޵Œ‡µŒ€µŒyµŒrµŒkµŒdµŒ]µŒVµŒOµŒHµŒAµŒ:µŒ3µŒ,µŒ%µŒµŒµŒµŒ µŒµŒû´Œô´Œí´Œæ´Œß´ŒØ´ŒÑ´ŒÊ´ŒôŒ¼´Œµ´Œ®´Œ§´Œ ´Œ™´Œ’´Œ‹´Œ„´Œ}´Œv´Œo´Œh´Œa´ŒZ´ŒS´ŒL´ŒE´Œ>´Œ7´Œ0´Œ)´Œ"´Œ´Œ´Œ ´Œ´Œÿ³Œø³Œñ³Œ곌㳌ܳŒÕ³ŒγŒdzŒÀ³Œ¹³Œ²³Œ«³Œ¤³Œ³Œ–³Œ³Œˆ³Œ³Œz³Œs³Œl³Œe³Œ^³ŒW³ŒP³ŒI³ŒB³Œ;³Œ4³Œ-³Œ&³Œ³Œ³Œ³Œ ³Œ³Œü²Œõ²Œ粌ಌÙ²ŒÒ²Œ˲ŒIJŒ½²Œ¶²Œ¯²Œ¨²Œ¡²Œš²Œ“²ŒŒ²Œ…²Œ~²Œw²Œp²Œi²Œb²Œ[²ŒT²ŒM²ŒF²Œ?²Œ8²Œ1²Œ*²Œ#²Œ²Œ²Œ²Œ²Œ²Œù±Œò±Œ뱌䱌ݱŒÖ±ŒϱŒȱŒÁ±Œº±Œ³±Œ¬±Œ¥±Œž±Œ—±Œ±Œ‰±Œ‚±Œ{±Œt±Œm±Œf±Œ_±ŒX±ŒQ±ŒJ±ŒC±Œ<±Œ5±Œ.±Œ'±Œ ±Œ±Œ±Œ ±Œ±Œý°Œö°Œï°Œè°Œá°ŒÚ°ŒÓ°Œ̰ŒŰŒ¾°Œ·°Œ°°Œ©°Œ¢°Œ›°Œ”°Œ°Œ†°Œ°Œx°Œq°Œj°Œc°Œ\°ŒU°ŒN°ŒG°Œ@°Œ9°Œ2°Œ+°Œ$°Œ°Œ°Œ°Œ°Œ°Œú¯Œó¯Œ쯌富Þ¯ŒׯŒЯŒɯŒ¯Œ»¯Œ´¯Œ­¯Œ¦¯ŒŸ¯Œ˜¯Œ‘¯ŒНŒƒ¯Œ|¯Œu¯Œn¯Œg¯Œ`¯ŒY¯ŒR¯ŒK¯ŒD¯Œ=¯Œ6¯Œ/¯Œ(¯Œ!¯Œ¯Œ¯Œ ¯Œ¯Œþ®Œ÷®Œð®Œ鮌⮌Û®ŒÔ®ŒÍ®ŒÆ®Œ¿®Œ¸®Œ±®Œª®Œ£®Œœ®Œ•®ŒŽ®Œ‡®Œ€®Œy®Œr®Œk®Œd®Œ]®ŒV®ŒO®ŒH®ŒA®Œ:®Œ3®Œ,®Œ%®Œ®Œ®Œ®Œ ®Œ®Œû­Œô­Œí­Œæ­Œß­ŒØ­ŒÑ­ŒÊ­ŒíŒ¼­Œµ­Œ®­Œ§­Œ ­Œ™­Œ’­Œ‹­Œ„­Œ}­Œv­Œo­Œh­Œa­ŒZ­ŒS­ŒL­ŒE­Œ>­Œ7­Œ0­Œ)­Œ"­Œ­Œ­Œ ­Œ­Œÿ¬Œø¬Œñ¬Œꬌ㬌ܬŒÕ¬ŒάŒǬŒÀ¬Œ¹¬Œ²¬Œ«¬Œ¤¬Œ¬Œ–¬Œ¬Œˆ¬Œ¬Œz¬Œs¬Œl¬Œe¬Œ^¬ŒW¬ŒP¬ŒI¬ŒB¬Œ;¬Œ4¬Œ-¬Œ&¬Œ¬Œ¬Œ¬Œ ¬Œ¬Œü«Œõ«Œ竌ૌÙ«ŒÒ«ŒË«ŒÄ«Œ½«Œ¶«Œ¯«Œ¨«Œ¡«Œš«Œ“«ŒŒ«Œ…«Œ~«Œw«Œp«Œi«Œb«Œ[«ŒT«ŒM«ŒF«Œ?«Œ8«Œ1«Œ*«Œ#«Œ«Œ«Œ«Œ«Œ«ŒùªŒòªŒ몌䪌ݪŒÖªŒϪŒȪŒÁªŒºªŒ³ªŒ¬ªŒ¥ªŒžªŒ—ªŒªŒ‰ªŒ‚ªŒ{ªŒtªŒmªŒfªŒ_ªŒXªŒQªŒJªŒCªŒ<ªŒ5ªŒ.ªŒ'ªŒ ªŒªŒªŒ ªŒªŒý©Œö©Œ社詌ᩌÚ©ŒÓ©ŒÌ©ŒÅ©Œ¾©Œ·©Œ°©Œ©©Œ¢©Œ›©Œ”©Œ©Œ†©Œ©Œx©Œq©Œj©Œc©Œ\©ŒU©ŒN©ŒG©Œ@©Œ9©Œ2©Œ+©Œ$©Œ©Œ©Œ©Œ©Œ©Œú¨Œó¨Œ쨌娌Þ¨ŒרŒШŒɨŒ¨Œ»¨Œ´¨Œ­¨Œ¦¨ŒŸ¨Œ˜¨Œ‘¨ŒЍŒƒ¨Œ|¨Œu¨Œn¨Œg¨Œ`¨ŒY¨ŒR¨ŒK¨ŒD¨Œ=¨Œ6¨Œ/¨Œ(¨Œ!¨Œ¨Œ¨Œ ¨Œ¨Œþ§Œ÷§Œð§Œé§Œâ§ŒÛ§ŒÔ§ŒͧŒƧŒ¿§Œ¸§Œ±§Œª§Œ£§Œœ§Œ•§ŒާŒ‡§Œ€§Œy§Œr§Œk§Œd§Œ]§ŒV§ŒO§ŒH§ŒA§Œ:§Œ3§Œ,§Œ%§Œ§Œ§Œ§Œ §Œ§Œû¦Œô¦Œí¦Œ榌ߦŒئŒѦŒʦŒæŒ¼¦Œµ¦Œ®¦Œ§¦Œ ¦Œ™¦Œ’¦Œ‹¦Œ„¦Œ}¦Œv¦Œo¦Œh¦Œa¦ŒZ¦ŒS¦ŒL¦ŒE¦Œ>¦Œ7¦Œ0¦Œ)¦Œ"¦Œ¦Œ¦Œ ¦Œ¦Œÿ¥Œø¥Œñ¥Œꥌ㥌Ü¥ŒÕ¥ŒÎ¥ŒÇ¥ŒÀ¥Œ¹¥Œ²¥Œ«¥Œ¤¥Œ¥Œ–¥Œ¥Œˆ¥Œ¥Œz¥Œs¥Œl¥Œe¥Œ^¥ŒW¥ŒP¥ŒI¥ŒB¥Œ;¥Œ4¥Œ-¥Œ&¥Œ¥Œ¥Œ¥Œ ¥Œ¥Œü¤Œõ¤Œ礌ऌÙ¤ŒÒ¤ŒˤŒĤŒ½¤Œ¶¤Œ¯¤Œ¨¤Œ¡¤Œš¤Œ“¤ŒŒ¤Œ…¤Œ~¤Œw¤Œp¤Œi¤Œb¤Œ[¤ŒT¤ŒM¤ŒF¤Œ?¤Œ8¤Œ1¤Œ*¤Œ#¤Œ¤Œ¤Œ¤Œ¤Œ¤Œù£Œò£Œ료䣌Ý£ŒÖ£ŒÏ£ŒÈ£ŒÁ£Œº£Œ³£Œ¬£Œ¥£Œž£Œ—£Œ£Œ‰£Œ‚£Œ{£Œt£Œm£Œf£Œ_£ŒX£ŒQ£ŒJ£ŒC£Œ<£Œ5£Œ.£Œ'£Œ £Œ£Œ£Œ £Œ£Œý¢Œö¢Œ袌ᢌÚ¢ŒÓ¢ŒÌ¢ŒÅ¢Œ¾¢Œ·¢Œ°¢Œ©¢Œ¢¢Œ›¢Œ”¢Œ¢Œ†¢Œ¢Œx¢Œq¢Œj¢Œc¢Œ\¢ŒU¢ŒN¢ŒG¢Œ@¢Œ9¢Œ2¢Œ+¢Œ$¢Œ¢Œ¢Œ¢Œ¢Œ¢Œú¡Œó¡Œ졌塌Þ¡ŒסŒСŒÉ¡Œ¡Œ»¡Œ´¡Œ­¡Œ¦¡ŒŸ¡Œ˜¡Œ‘¡ŒŠ¡Œƒ¡Œ|¡Œu¡Œn¡Œg¡Œ`¡ŒY¡ŒR¡ŒK¡ŒD¡Œ=¡Œ6¡Œ/¡Œ(¡Œ!¡Œ¡Œ¡Œ ¡Œ¡Œþ Œ÷ Œð Œé Œâ ŒÛ ŒÔ ŒÍ ŒÆ Œ¿ Œ¸ Œ± Œª Œ£ Œœ Œ• ŒŽ Œ‡ Œ€ Œy Œr Œk Œd Œ] ŒV ŒO ŒH ŒA Œ: Œ3 Œ, Œ% Œ Œ Œ Œ  Œ ŒûŸŒôŸŒퟌ柌ߟŒØŸŒÑŸŒÊŸŒߌ¼ŸŒµŸŒ®ŸŒ§ŸŒ ŸŒ™ŸŒ’ŸŒ‹ŸŒ„ŸŒ}ŸŒvŸŒoŸŒhŸŒaŸŒZŸŒSŸŒLŸŒEŸŒ>ŸŒ7ŸŒ0ŸŒ)ŸŒ"ŸŒŸŒŸŒ ŸŒŸŒÿžŒøžŒñžŒꞌ㞌ÜžŒÕžŒΞŒÇžŒÀžŒ¹žŒ²žŒ«žŒ¤žŒžŒ–žŒžŒˆžŒžŒzžŒsžŒlžŒežŒ^žŒWžŒPžŒIžŒBžŒ;žŒ4žŒ-žŒ&žŒžŒžŒžŒ žŒžŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùœŒòœŒ뜌䜌ÝœŒÖœŒÏœŒÈœŒÁœŒºœŒ³œŒ¬œŒ¥œŒžœŒ—œŒœŒ‰œŒ‚œŒ{œŒtœŒmœŒfœŒ_œŒXœŒQœŒJœŒCœŒ<œŒ5œŒ.œŒ'œŒ œŒœŒœŒ œŒœŒý›Œö›Œ蛌ᛌÚ›ŒÓ›ŒÌ›ŒÅ›Œ¾›Œ·›Œ°›Œ©›Œ¢›Œ››Œ”›Œ›Œ†›Œ›Œx›Œq›Œj›Œc›Œ\›ŒU›ŒN›ŒG›Œ@›Œ9›Œ2›Œ+›Œ$›Œ›Œ›Œ›Œ›Œ›ŒúšŒóšŒ욌嚌ÞšŒךŒКŒÉšŒšŒ»šŒ´šŒ­šŒ¦šŒŸšŒ˜šŒ‘šŒŠšŒƒšŒ|šŒušŒnšŒgšŒ`šŒYšŒRšŒKšŒDšŒ=šŒ6šŒ/šŒ(šŒ!šŒšŒšŒ šŒšŒþ™Œ÷™Œð™Œ陌♌Û™ŒÔ™ŒÍ™ŒÆ™Œ¿™Œ¸™Œ±™Œª™Œ£™Œœ™Œ•™ŒŽ™Œ‡™Œ€™Œy™Œr™Œk™Œd™Œ]™ŒV™ŒO™ŒH™ŒA™Œ:™Œ3™Œ,™Œ%™Œ™Œ™Œ™Œ ™Œ™Œû˜Œô˜Œ혌昌ߘŒؘŒјŒʘŒØŒ¼˜Œµ˜Œ®˜Œ§˜Œ ˜Œ™˜Œ’˜Œ‹˜Œ„˜Œ}˜Œv˜Œo˜Œh˜Œa˜ŒZ˜ŒS˜ŒL˜ŒE˜Œ>˜Œ7˜Œ0˜Œ)˜Œ"˜Œ˜Œ˜Œ ˜Œ˜Œÿ—Œø—Œñ—Œê—Œã—ŒÜ—ŒÕ—ŒΗŒÇ—ŒÀ—Œ¹—Œ²—Œ«—Œ¤—Œ—Œ–—Œ—Œˆ—Œ—Œz—Œs—Œl—Œe—Œ^—ŒW—ŒP—ŒI—ŒB—Œ;—Œ4—Œ-—Œ&—Œ—Œ—Œ—Œ —Œ—Œü–Œõ–Œî–Œç–Œà–ŒÙ–ŒÒ–ŒË–ŒÄ–Œ½–Œ¶–Œ¯–Œ¨–Œ¡–Œš–Œ“–ŒŒ–Œ…–Œ~–Œw–Œp–Œi–Œb–Œ[–ŒT–ŒM–ŒF–Œ?–Œ8–Œ1–Œ*–Œ#–Œ–Œ–Œ–Œ–Œ–Œù•Œò•Œ때䕌Ý•ŒÖ•ŒÏ•ŒÈ•ŒÁ•Œº•Œ³•Œ¬•Œ¥•Œž•Œ—•Œ•Œ‰•Œ‚•Œ{•Œt•Œm•Œf•Œ_•ŒX•ŒQ•ŒJ•ŒC•Œ<•Œ5•Œ.•Œ'•Œ •Œ•Œ•Œ •Œ•Œý”Œö”Œ蔌ᔌÚ”ŒÓ”ŒÌ”ŒÅ”Œ¾”Œ·”Œ°”Œ©”Œ¢”Œ›”Œ””Œ”Œ†”Œ”Œx”Œq”Œj”Œc”Œ\”ŒU”ŒN”ŒG”Œ@”Œ9”Œ2”Œ+”Œ$”Œ”Œ”Œ”Œ”Œ”Œú“Œó“Œ쓌哌Þ“ŒדŒГŒÉ“Œ“Œ»“Œ´“Œ­“Œ¦“ŒŸ“Œ˜“Œ‘“ŒŠ“Œƒ“Œ|“Œu“Œn“Œg“Œ`“ŒY“ŒR“ŒK“ŒD“Œ=“Œ6“Œ/“Œ(“Œ!“Œ“Œ“Œ “Œ“Œþ’Œ÷’Œð’Œé’Œâ’ŒÛ’ŒÔ’ŒÍ’ŒÆ’Œ¿’Œ¸’Œ±’Œª’Œ£’Œœ’Œ•’ŒŽ’Œ‡’Œ€’Œy’Œr’Œk’Œd’Œ]’ŒV’ŒO’ŒH’ŒA’Œ:’Œ3’Œ,’Œ%’Œ’Œ’Œ’Œ ’Œ’Œû‘Œô‘Œ푌摌ß‘ŒØ‘ŒÑ‘ŒÊ‘ŒÑŒ¼‘Œµ‘Œ®‘Œ§‘Œ ‘Œ™‘Œ’‘Œ‹‘Œ„‘Œ}‘Œv‘Œo‘Œh‘Œa‘ŒZ‘ŒS‘ŒL‘ŒE‘Œ>‘Œ7‘Œ0‘Œ)‘Œ"‘Œ‘Œ‘Œ ‘Œ‘ŒÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùŽŒòŽŒ뎌䎌ÝŽŒÖŽŒÏŽŒÈŽŒÁŽŒºŽŒ³ŽŒ¬ŽŒ¥ŽŒžŽŒ—ŽŒŽŒ‰ŽŒ‚ŽŒ{ŽŒtŽŒmŽŒfŽŒ_ŽŒXŽŒQŽŒJŽŒCŽŒ<ŽŒ5ŽŒ.ŽŒ'ŽŒ ŽŒŽŒŽŒ ŽŒŽŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒŒóŒŒ쌌匌ÞŒŒ׌ŒÐŒŒÉŒŒÂŒŒ»ŒŒ´ŒŒ­ŒŒ¦ŒŒŸŒŒ˜ŒŒ‘ŒŒŠŒŒƒŒŒ|ŒŒuŒŒnŒŒgŒŒ`ŒŒYŒŒRŒŒKŒŒDŒŒ=ŒŒ6ŒŒ/ŒŒ(ŒŒ!ŒŒŒŒŒŒ ŒŒŒŒþ‹Œ÷‹Œð‹Œ鋌⋌Û‹ŒÔ‹ŒÍ‹ŒÆ‹Œ¿‹Œ¸‹Œ±‹Œª‹Œ£‹Œœ‹Œ•‹ŒŽ‹Œ‡‹Œ€‹Œy‹Œr‹Œk‹Œd‹Œ]‹ŒV‹ŒO‹ŒH‹ŒA‹Œ:‹Œ3‹Œ,‹Œ%‹Œ‹Œ‹Œ‹Œ ‹Œ‹ŒûŠŒôŠŒ튌抌ߊŒØŠŒÑŠŒÊŠŒÊŒ¼ŠŒµŠŒ®ŠŒ§ŠŒ ŠŒ™ŠŒ’ŠŒ‹ŠŒ„ŠŒ}ŠŒvŠŒoŠŒhŠŒaŠŒZŠŒSŠŒLŠŒEŠŒ>ŠŒ7ŠŒ0ŠŒ)ŠŒ"ŠŒŠŒŠŒ ŠŒŠŒÿ‰Œø‰Œñ‰Œꉌ㉌܉ŒÕ‰ŒΉŒljŒÀ‰Œ¹‰Œ²‰Œ«‰Œ¤‰Œ‰Œ–‰Œ‰Œˆ‰Œ‰Œz‰Œs‰Œl‰Œe‰Œ^‰ŒW‰ŒP‰ŒI‰ŒB‰Œ;‰Œ4‰Œ-‰Œ&‰Œ‰Œ‰Œ‰Œ ‰Œ‰ŒüˆŒõˆŒ爌àˆŒÙˆŒÒˆŒˈŒĈŒ½ˆŒ¶ˆŒ¯ˆŒ¨ˆŒ¡ˆŒšˆŒ“ˆŒŒˆŒ…ˆŒ~ˆŒwˆŒpˆŒiˆŒbˆŒ[ˆŒTˆŒMˆŒFˆŒ?ˆŒ8ˆŒ1ˆŒ*ˆŒ#ˆŒˆŒˆŒˆŒˆŒˆŒù‡Œò‡Œ뇌䇌݇ŒÖ‡ŒχŒȇŒÁ‡Œº‡Œ³‡Œ¬‡Œ¥‡Œž‡Œ—‡Œ‡Œ‰‡Œ‚‡Œ{‡Œt‡Œm‡Œf‡Œ_‡ŒX‡ŒQ‡ŒJ‡ŒC‡Œ<‡Œ5‡Œ.‡Œ'‡Œ ‡Œ‡Œ‡Œ ‡Œ‡Œý†Œö†Œ膌ᆌÚ†ŒÓ†Œ̆ŒņŒ¾†Œ·†Œ°†Œ©†Œ¢†Œ›†Œ”†Œ†Œ††Œ†Œx†Œq†Œj†Œc†Œ\†ŒU†ŒN†ŒG†Œ@†Œ9†Œ2†Œ+†Œ$†Œ†Œ†Œ†Œ†Œ†Œú…Œó…Œì…Œå…ŒÞ…Œ×…ŒÐ…ŒÉ…ŒÂ…Œ»…Œ´…Œ­…Œ¦…ŒŸ…Œ˜…Œ‘…ŒŠ…Œƒ…Œ|…Œu…Œn…Œg…Œ`…ŒY…ŒR…ŒK…ŒD…Œ=…Œ6…Œ/…Œ(…Œ!…Œ…Œ…Œ …Œ…Œþ„Œ÷„Œð„Œ鄌ℌÛ„ŒÔ„ŒÍ„ŒÆ„Œ¿„Œ¸„Œ±„Œª„Œ£„Œœ„Œ•„ŒŽ„Œ‡„Œ€„Œy„Œr„Œk„Œd„Œ]„ŒV„ŒO„ŒH„ŒA„Œ:„Œ3„Œ,„Œ%„Œ„Œ„Œ„Œ „Œ„ŒûƒŒôƒŒ탌惌߃Œ؃ŒуŒʃŒÃŒ¼ƒŒµƒŒ®ƒŒ§ƒŒ ƒŒ™ƒŒ’ƒŒ‹ƒŒ„ƒŒ}ƒŒvƒŒoƒŒhƒŒaƒŒZƒŒSƒŒLƒŒEƒŒ>ƒŒ7ƒŒ0ƒŒ)ƒŒ"ƒŒƒŒƒŒ ƒŒƒŒÿ‚Œø‚Œñ‚ŒꂌれÜ‚ŒÕ‚Œ΂ŒÇ‚ŒÀ‚Œ¹‚Œ²‚Œ«‚Œ¤‚Œ‚Œ–‚Œ‚Œˆ‚Œ‚Œz‚Œs‚Œl‚Œe‚Œ^‚ŒW‚ŒP‚ŒI‚ŒB‚Œ;‚Œ4‚Œ-‚Œ&‚Œ‚Œ‚Œ‚Œ ‚Œ‚ŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒù€Œò€Œ뀌䀌Ý€ŒÖ€ŒÏ€ŒÈ€ŒÁ€Œº€Œ³€Œ¬€Œ¥€Œž€Œ—€Œ€Œ‰€Œ‚€Œ{€Œt€Œm€Œf€Œ_€ŒX€ŒQ€ŒJ€ŒC€Œ<€Œ5€Œ.€Œ'€Œ €Œ€Œ€Œ €Œ€ŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒú~Œó~Œì~Œå~ŒÞ~Œ×~ŒÐ~ŒÉ~ŒÂ~Œ»~Œ´~Œ­~Œ¦~ŒŸ~Œ˜~Œ‘~ŒŠ~Œƒ~Œ|~Œu~Œn~Œg~Œ`~ŒY~ŒR~ŒK~ŒD~Œ=~Œ6~Œ/~Œ(~Œ!~Œ~Œ~Œ ~Œ~Œþ}Œ÷}Œð}Œé}Œâ}ŒÛ}ŒÔ}ŒÍ}ŒÆ}Œ¿}Œ¸}Œ±}Œª}Œ£}Œœ}Œ•}ŒŽ}Œ‡}Œ€}Œy}Œr}Œk}Œd}Œ]}ŒV}ŒO}ŒH}ŒA}Œ:}Œ3}Œ,}Œ%}Œ}Œ}Œ}Œ }Œ}Œû|Œô|Œí|Œæ|Œß|ŒØ|ŒÑ|ŒÊ|ŒÃ|Œ¼|Œµ|Œ®|Œ§|Œ |Œ™|Œ’|Œ‹|Œ„|Œ}|Œv|Œo|Œh|Œa|ŒZ|ŒS|ŒL|ŒE|Œ>|Œ7|Œ0|Œ)|Œ"|Œ|Œ|Œ |Œ|Œÿ{Œø{Œñ{Œê{Œã{ŒÜ{ŒÕ{ŒÎ{ŒÇ{ŒÀ{Œ¹{Œ²{Œ«{Œ¤{Œ{Œ–{Œ{Œˆ{Œ{Œz{Œs{Œl{Œe{Œ^{ŒW{ŒP{ŒI{ŒB{Œ;{Œ4{Œ-{Œ&{Œ{Œ{Œ{Œ {Œ{ŒüzŒõzŒîzŒçzŒàzŒÙzŒÒzŒËzŒÄzŒ½zŒ¶zŒ¯zŒ¨zŒ¡zŒšzŒ“zŒŒzŒ…zŒ~zŒwzŒpzŒizŒbzŒ[zŒTzŒMzŒFzŒ?zŒ8zŒ1zŒ*zŒ#zŒzŒzŒzŒzŒzŒùyŒòyŒëyŒäyŒÝyŒÖyŒÏyŒÈyŒÁyŒºyŒ³yŒ¬yŒ¥yŒžyŒ—yŒyŒ‰yŒ‚yŒ{yŒtyŒmyŒfyŒ_yŒXyŒQyŒJyŒCyŒuŒ7uŒ0uŒ)uŒ"uŒuŒuŒ uŒuŒÿtŒøtŒñtŒêtŒãtŒÜtŒÕtŒÎtŒÇtŒÀtŒ¹tŒ²tŒ«tŒ¤tŒtŒ–tŒtŒˆtŒtŒztŒstŒltŒetŒ^tŒWtŒPtŒItŒBtŒ;tŒ4tŒ-tŒ&tŒtŒtŒtŒ tŒtŒüsŒõsŒîsŒçsŒàsŒÙsŒÒsŒËsŒÄsŒ½sŒ¶sŒ¯sŒ¨sŒ¡sŒšsŒ“sŒŒsŒ…sŒ~sŒwsŒpsŒisŒbsŒ[sŒTsŒMsŒFsŒ?sŒ8sŒ1sŒ*sŒ#sŒsŒsŒsŒsŒsŒùrŒòrŒërŒärŒÝrŒÖrŒÏrŒÈrŒÁrŒºrŒ³rŒ¬rŒ¥rŒžrŒ—rŒrŒ‰rŒ‚rŒ{rŒtrŒmrŒfrŒ_rŒXrŒQrŒJrŒCrŒnŒ7nŒ0nŒ)nŒ"nŒnŒnŒ nŒnŒÿmŒømŒñmŒêmŒãmŒÜmŒÕmŒÎmŒÇmŒÀmŒ¹mŒ²mŒ«mŒ¤mŒmŒ–mŒmŒˆmŒmŒzmŒsmŒlmŒemŒ^mŒWmŒPmŒImŒBmŒ;mŒ4mŒ-mŒ&mŒmŒmŒmŒ mŒmŒülŒõlŒîlŒçlŒàlŒÙlŒÒlŒËlŒÄlŒ½lŒ¶lŒ¯lŒ¨lŒ¡lŒšlŒ“lŒŒlŒ…lŒ~lŒwlŒplŒilŒblŒ[lŒTlŒMlŒFlŒ?lŒ8lŒ1lŒ*lŒ#lŒlŒlŒlŒlŒlŒùkŒòkŒëkŒäkŒÝkŒÖkŒÏkŒÈkŒÁkŒºkŒ³kŒ¬kŒ¥kŒžkŒ—kŒkŒ‰kŒ‚kŒ{kŒtkŒmkŒfkŒ_kŒXkŒQkŒJkŒCkŒgŒ7gŒ0gŒ)gŒ"gŒgŒgŒ gŒgŒÿfŒøfŒñfŒêfŒãfŒÜfŒÕfŒÎfŒÇfŒÀfŒ¹fŒ²fŒ«fŒ¤fŒfŒ–fŒfŒˆfŒfŒzfŒsfŒlfŒefŒ^fŒWfŒPfŒIfŒBfŒ;fŒ4fŒ-fŒ&fŒfŒfŒfŒ fŒfŒüeŒõeŒîeŒçeŒàeŒÙeŒÒeŒËeŒÄeŒ½eŒ¶eŒ¯eŒ¨eŒ¡eŒšeŒ“eŒŒeŒ…eŒ~eŒweŒpeŒieŒbeŒ[eŒTeŒMeŒFeŒ?eŒ8eŒ1eŒ*eŒ#eŒeŒeŒeŒeŒeŒùdŒòdŒëdŒädŒÝdŒÖdŒÏdŒÈdŒÁdŒºdŒ³dŒ¬dŒ¥dŒždŒ—dŒdŒ‰dŒ‚dŒ{dŒtdŒmdŒfdŒ_dŒXdŒQdŒJdŒCdŒ`Œ7`Œ0`Œ)`Œ"`Œ`Œ`Œ `Œ`Œÿ_Œø_Œñ_Œê_Œã_ŒÜ_ŒÕ_ŒÎ_ŒÇ_ŒÀ_Œ¹_Œ²_Œ«_Œ¤_Œ_Œ–_Œ_Œˆ_Œ_Œz_Œs_Œl_Œe_Œ^_ŒW_ŒP_ŒI_ŒB_Œ;_Œ4_Œ-_Œ&_Œ_Œ_Œ_Œ _Œ_Œü^Œõ^Œî^Œç^Œà^ŒÙ^ŒÒ^ŒË^ŒÄ^Œ½^Œ¶^Œ¯^Œ¨^Œ¡^Œš^Œ“^ŒŒ^Œ…^Œ~^Œw^Œp^Œi^Œb^Œ[^ŒT^ŒM^ŒF^Œ?^Œ8^Œ1^Œ*^Œ#^Œ^Œ^Œ^Œ^Œ^Œù]Œò]Œë]Œä]ŒÝ]ŒÖ]ŒÏ]ŒÈ]ŒÁ]Œº]Œ³]Œ¬]Œ¥]Œž]Œ—]Œ]Œ‰]Œ‚]Œ{]Œt]Œm]Œf]Œ_]ŒX]ŒQ]ŒJ]ŒC]Œ<]Œ5]Œ.]Œ']Œ ]Œ]Œ]Œ ]Œ]Œý\Œö\Œï\Œè\Œá\ŒÚ\ŒÓ\ŒÌ\ŒÅ\Œ¾\Œ·\Œ°\Œ©\Œ¢\Œ›\Œ”\Œ\Œ†\Œ\Œx\Œq\Œj\Œc\Œ\\ŒU\ŒN\ŒG\Œ@\Œ9\Œ2\Œ+\Œ$\Œ\Œ\Œ\Œ\Œ\Œú[Œó[Œì[Œå[ŒÞ[Œ×[ŒÐ[ŒÉ[ŒÂ[Œ»[Œ´[Œ­[Œ¦[ŒŸ[Œ˜[Œ‘[ŒŠ[Œƒ[Œ|[Œu[Œn[Œg[Œ`[ŒY[ŒR[ŒK[ŒD[Œ=[Œ6[Œ/[Œ([Œ![Œ[Œ[Œ [Œ[ŒþZŒ÷ZŒðZŒéZŒâZŒÛZŒÔZŒÍZŒÆZŒ¿ZŒ¸ZŒ±ZŒªZŒ£ZŒœZŒ•ZŒŽZŒ‡ZŒ€ZŒyZŒrZŒkZŒdZŒ]ZŒVZŒOZŒHZŒAZŒ:ZŒ3ZŒ,ZŒ%ZŒZŒZŒZŒ ZŒZŒûYŒôYŒíYŒæYŒßYŒØYŒÑYŒÊYŒÃYŒ¼YŒµYŒ®YŒ§YŒ YŒ™YŒ’YŒ‹YŒ„YŒ}YŒvYŒoYŒhYŒaYŒZYŒSYŒLYŒEYŒ>YŒ7YŒ0YŒ)YŒ"YŒYŒYŒ YŒYŒÿXŒøXŒñXŒêXŒãXŒÜXŒÕXŒÎXŒÇXŒÀXŒ¹XŒ²XŒ«XŒ¤XŒXŒ–XŒXŒˆXŒXŒzXŒsXŒlXŒeXŒ^XŒWXŒPXŒIXŒBXŒ;XŒ4XŒ-XŒ&XŒXŒXŒXŒ XŒXŒüWŒõWŒîWŒçWŒàWŒÙWŒÒWŒËWŒÄWŒ½WŒ¶WŒ¯WŒ¨WŒ¡WŒšWŒ“WŒŒWŒ…WŒ~WŒwWŒpWŒiWŒbWŒ[WŒTWŒMWŒFWŒ?WŒ8WŒ1WŒ*WŒ#WŒWŒWŒWŒWŒWŒùVŒòVŒëVŒäVŒÝVŒÖVŒÏVŒÈVŒÁVŒºVŒ³VŒ¬VŒ¥VŒžVŒ—VŒVŒ‰VŒ‚VŒ{VŒtVŒmVŒfVŒ_VŒXVŒQVŒJVŒCVŒRŒ7RŒ0RŒ)RŒ"RŒRŒRŒ RŒRŒÿQŒøQŒñQŒêQŒãQŒÜQŒÕQŒÎQŒÇQŒÀQŒ¹QŒ²QŒ«QŒ¤QŒQŒ–QŒQŒˆQŒQŒzQŒsQŒlQŒeQŒ^QŒWQŒPQŒIQŒBQŒ;QŒ4QŒ-QŒ&QŒQŒQŒQŒ QŒQŒüPŒõPŒîPŒçPŒàPŒÙPŒÒPŒËPŒÄPŒ½PŒ¶PŒ¯PŒ¨PŒ¡PŒšPŒ“PŒŒPŒ…PŒ~PŒwPŒpPŒiPŒbPŒ[PŒTPŒMPŒFPŒ?PŒ8PŒ1PŒ*PŒ#PŒPŒPŒPŒPŒPŒùOŒòOŒëOŒäOŒÝOŒÖOŒÏOŒÈOŒÁOŒºOŒ³OŒ¬OŒ¥OŒžOŒ—OŒOŒ‰OŒ‚OŒ{OŒtOŒmOŒfOŒ_OŒXOŒQOŒJOŒCOŒKŒ7KŒ0KŒ)KŒ"KŒKŒKŒ KŒKŒÿJŒøJŒñJŒêJŒãJŒÜJŒÕJŒÎJŒÇJŒÀJŒ¹JŒ²JŒ«JŒ¤JŒJŒ–JŒJŒˆJŒJŒzJŒsJŒlJŒeJŒ^JŒWJŒPJŒIJŒBJŒ;JŒ4JŒ-JŒ&JŒJŒJŒJŒ JŒJŒüIŒõIŒîIŒçIŒàIŒÙIŒÒIŒËIŒÄIŒ½IŒ¶IŒ¯IŒ¨IŒ¡IŒšIŒ“IŒŒIŒ…IŒ~IŒwIŒpIŒiIŒbIŒ[IŒTIŒMIŒFIŒ?IŒ8IŒ1IŒ*IŒ#IŒIŒIŒIŒIŒIŒùHŒòHŒëHŒäHŒÝHŒÖHŒÏHŒÈHŒÁHŒºHŒ³HŒ¬HŒ¥HŒžHŒ—HŒHŒ‰HŒ‚HŒ{HŒtHŒmHŒfHŒ_HŒXHŒQHŒJHŒCHŒDŒ7DŒ0DŒ)DŒ"DŒDŒDŒ DŒDŒÿCŒøCŒñCŒêCŒãCŒÜCŒÕCŒÎCŒÇCŒÀCŒ¹CŒ²CŒ«CŒ¤CŒCŒ–CŒCŒˆCŒCŒzCŒsCŒlCŒeCŒ^CŒWCŒPCŒICŒBCŒ;CŒ4CŒ-CŒ&CŒCŒCŒCŒ CŒCŒüBŒõBŒîBŒçBŒàBŒÙBŒÒBŒËBŒÄBŒ½BŒ¶BŒ¯BŒ¨BŒ¡BŒšBŒ“BŒŒBŒ…BŒ~BŒwBŒpBŒiBŒbBŒ[BŒTBŒMBŒFBŒ?BŒ8BŒ1BŒ*BŒ#BŒBŒBŒBŒBŒBŒùAŒòAŒëAŒäAŒÝAŒÖAŒÏAŒÈAŒÁAŒºAŒ³AŒ¬AŒ¥AŒžAŒ—AŒAŒ‰AŒ‚AŒ{AŒtAŒmAŒfAŒ_AŒXAŒQAŒJAŒCAŒŒ÷>Œð>Œé>Œâ>ŒÛ>ŒÔ>ŒÍ>ŒÆ>Œ¿>Œ¸>Œ±>Œª>Œ£>Œœ>Œ•>ŒŽ>Œ‡>Œ€>Œy>Œr>Œk>Œd>Œ]>ŒV>ŒO>ŒH>ŒA>Œ:>Œ3>Œ,>Œ%>Œ>Œ>Œ>Œ >Œ>Œû=Œô=Œí=Œæ=Œß=ŒØ=ŒÑ=ŒÊ=ŒÃ=Œ¼=Œµ=Œ®=Œ§=Œ =Œ™=Œ’=Œ‹=Œ„=Œ}=Œv=Œo=Œh=Œa=ŒZ=ŒS=ŒL=ŒE=Œ>=Œ7=Œ0=Œ)=Œ"=Œ=Œ=Œ =Œ=Œÿ<Œø<Œñ<Œê<Œã<ŒÜ<ŒÕ<ŒÎ<ŒÇ<ŒÀ<Œ¹<Œ²<Œ«<Œ¤<Œ<Œ–<Œ<Œˆ<Œ<Œz<Œs<Œl<Œe<Œ^<ŒW<ŒP<ŒI<ŒB<Œ;<Œ4<Œ-<Œ&<Œ<Œ<Œ<Œ <Œ<Œü;Œõ;Œî;Œç;Œà;ŒÙ;ŒÒ;ŒË;ŒÄ;Œ½;Œ¶;Œ¯;Œ¨;Œ¡;Œš;Œ“;ŒŒ;Œ…;Œ~;Œw;Œp;Œi;Œb;Œ[;ŒT;ŒM;ŒF;Œ?;Œ8;Œ1;Œ*;Œ#;Œ;Œ;Œ;Œ;Œ;Œù:Œò:Œë:Œä:ŒÝ:ŒÖ:ŒÏ:ŒÈ:ŒÁ:Œº:Œ³:Œ¬:Œ¥:Œž:Œ—:Œ:Œ‰:Œ‚:Œ{:Œt:Œm:Œf:Œ_:ŒX:ŒQ:ŒJ:ŒC:Œ<:Œ5:Œ.:Œ':Œ :Œ:Œ:Œ :Œ:Œý9Œö9Œï9Œè9Œá9ŒÚ9ŒÓ9ŒÌ9ŒÅ9Œ¾9Œ·9Œ°9Œ©9Œ¢9Œ›9Œ”9Œ9Œ†9Œ9Œx9Œq9Œj9Œc9Œ\9ŒU9ŒN9ŒG9Œ@9Œ99Œ29Œ+9Œ$9Œ9Œ9Œ9Œ9Œ9Œú8Œó8Œì8Œå8ŒÞ8Œ×8ŒÐ8ŒÉ8ŒÂ8Œ»8Œ´8Œ­8Œ¦8ŒŸ8Œ˜8Œ‘8ŒŠ8Œƒ8Œ|8Œu8Œn8Œg8Œ`8ŒY8ŒR8ŒK8ŒD8Œ=8Œ68Œ/8Œ(8Œ!8Œ8Œ8Œ 8Œ8Œþ7Œ÷7Œð7Œé7Œâ7ŒÛ7ŒÔ7ŒÍ7ŒÆ7Œ¿7Œ¸7Œ±7Œª7Œ£7Œœ7Œ•7ŒŽ7Œ‡7Œ€7Œy7Œr7Œk7Œd7Œ]7ŒV7ŒO7ŒH7ŒA7Œ:7Œ37Œ,7Œ%7Œ7Œ7Œ7Œ 7Œ7Œû6Œô6Œí6Œæ6Œß6ŒØ6ŒÑ6ŒÊ6ŒÃ6Œ¼6Œµ6Œ®6Œ§6Œ 6Œ™6Œ’6Œ‹6Œ„6Œ}6Œv6Œo6Œh6Œa6ŒZ6ŒS6ŒL6ŒE6Œ>6Œ76Œ06Œ)6Œ"6Œ6Œ6Œ 6Œ6Œÿ5Œø5Œñ5Œê5Œã5ŒÜ5ŒÕ5ŒÎ5ŒÇ5ŒÀ5Œ¹5Œ²5Œ«5Œ¤5Œ5Œ–5Œ5Œˆ5Œ5Œz5Œs5Œl5Œe5Œ^5ŒW5ŒP5ŒI5ŒB5Œ;5Œ45Œ-5Œ&5Œ5Œ5Œ5Œ 5Œ5Œü4Œõ4Œî4Œç4Œà4ŒÙ4ŒÒ4ŒË4ŒÄ4Œ½4Œ¶4Œ¯4Œ¨4Œ¡4Œš4Œ“4ŒŒ4Œ…4Œ~4Œw4Œp4Œi4Œb4Œ[4ŒT4ŒM4ŒF4Œ?4Œ84Œ14Œ*4Œ#4Œ4Œ4Œ4Œ4Œ4Œù3Œò3Œë3Œä3ŒÝ3ŒÖ3ŒÏ3ŒÈ3ŒÁ3Œº3Œ³3Œ¬3Œ¥3Œž3Œ—3Œ3Œ‰3Œ‚3Œ{3Œt3Œm3Œf3Œ_3ŒX3ŒQ3ŒJ3ŒC3Œ<3Œ53Œ.3Œ'3Œ 3Œ3Œ3Œ 3Œ3Œý2Œö2Œï2Œè2Œá2ŒÚ2ŒÓ2ŒÌ2ŒÅ2Œ¾2Œ·2Œ°2Œ©2Œ¢2Œ›2Œ”2Œ2Œ†2Œ2Œx2Œq2Œj2Œc2Œ\2ŒU2ŒN2ŒG2Œ@2Œ92Œ22Œ+2Œ$2Œ2Œ2Œ2Œ2Œ2Œú1Œó1Œì1Œå1ŒÞ1Œ×1ŒÐ1ŒÉ1ŒÂ1Œ»1Œ´1Œ­1Œ¦1ŒŸ1Œ˜1Œ‘1ŒŠ1Œƒ1Œ|1Œu1Œn1Œg1Œ`1ŒY1ŒR1ŒK1ŒD1Œ=1Œ61Œ/1Œ(1Œ!1Œ1Œ1Œ 1Œ1Œþ0Œ÷0Œð0Œé0Œâ0ŒÛ0ŒÔ0ŒÍ0ŒÆ0Œ¿0Œ¸0Œ±0Œª0Œ£0Œœ0Œ•0ŒŽ0Œ‡0Œ€0Œy0Œr0Œk0Œd0Œ]0ŒV0ŒO0ŒH0ŒA0Œ:0Œ30Œ,0Œ%0Œ0Œ0Œ0Œ 0Œ0Œû/Œô/Œí/Œæ/Œß/ŒØ/ŒÑ/ŒÊ/ŒÃ/Œ¼/Œµ/Œ®/Œ§/Œ /Œ™/Œ’/Œ‹/Œ„/Œ}/Œv/Œo/Œh/Œa/ŒZ/ŒS/ŒL/ŒE/Œ>/Œ7/Œ0/Œ)/Œ"/Œ/Œ/Œ /Œ/Œÿ.Œø.Œñ.Œê.Œã.ŒÜ.ŒÕ.ŒÎ.ŒÇ.ŒÀ.Œ¹.Œ².Œ«.Œ¤.Œ.Œ–.Œ.Œˆ.Œ.Œz.Œs.Œl.Œe.Œ^.ŒW.ŒP.ŒI.ŒB.Œ;.Œ4.Œ-.Œ&.Œ.Œ.Œ.Œ .Œ.Œü-Œõ-Œî-Œç-Œà-ŒÙ-ŒÒ-ŒË-ŒÄ-Œ½-Œ¶-Œ¯-Œ¨-Œ¡-Œš-Œ“-ŒŒ-Œ…-Œ~-Œw-Œp-Œi-Œb-Œ[-ŒT-ŒM-ŒF-Œ?-Œ8-Œ1-Œ*-Œ#-Œ-Œ-Œ-Œ-Œ-Œù,Œò,Œë,Œä,ŒÝ,ŒÖ,ŒÏ,ŒÈ,ŒÁ,Œº,Œ³,Œ¬,Œ¥,Œž,Œ—,Œ,Œ‰,Œ‚,Œ{,Œt,Œm,Œf,Œ_,ŒX,ŒQ,ŒJ,ŒC,Œ<,Œ5,Œ.,Œ',Œ ,Œ,Œ,Œ ,Œ,Œý+Œö+Œï+Œè+Œá+ŒÚ+ŒÓ+ŒÌ+ŒÅ+Œ¾+Œ·+Œ°+Œ©+Œ¢+Œ›+Œ”+Œ+Œ†+Œ+Œx+Œq+Œj+Œc+Œ\+ŒU+ŒN+ŒG+Œ@+Œ9+Œ2+Œ++Œ$+Œ+Œ+Œ+Œ+Œ+Œú*Œó*Œì*Œå*ŒÞ*Œ×*ŒÐ*ŒÉ*ŒÂ*Œ»*Œ´*Œ­*Œ¦*ŒŸ*Œ˜*Œ‘*ŒŠ*Œƒ*Œ|*Œu*Œn*Œg*Œ`*ŒY*ŒR*ŒK*ŒD*Œ=*Œ6*Œ/*Œ(*Œ!*Œ*Œ*Œ *Œ*Œþ)Œ÷)Œð)Œé)Œâ)ŒÛ)ŒÔ)ŒÍ)ŒÆ)Œ¿)Œ¸)Œ±)Œª)Œ£)Œœ)Œ•)ŒŽ)Œ‡)Œ€)Œy)Œr)Œk)Œd)Œ])ŒV)ŒO)ŒH)ŒA)Œ:)Œ3)Œ,)Œ%)Œ)Œ)Œ)Œ )Œ)Œû(Œô(Œí(Œæ(Œß(ŒØ(ŒÑ(ŒÊ(ŒÃ(Œ¼(Œµ(Œ®(Œ§(Œ (Œ™(Œ’(Œ‹(Œ„(Œ}(Œv(Œo(Œh(Œa(ŒZ(ŒS(ŒL(ŒE(Œ>(Œ7(Œ0(Œ)(Œ"(Œ(Œ(Œ (Œ(Œÿ'Œø'Œñ'Œê'Œã'ŒÜ'ŒÕ'ŒÎ'ŒÇ'ŒÀ'Œ¹'Œ²'Œ«'Œ¤'Œ'Œ–'Œ'Œˆ'Œ'Œz'Œs'Œl'Œe'Œ^'ŒW'ŒP'ŒI'ŒB'Œ;'Œ4'Œ-'Œ&'Œ'Œ'Œ'Œ 'Œ'Œü&Œõ&Œî&Œç&Œà&ŒÙ&ŒÒ&ŒË&ŒÄ&Œ½&Œ¶&Œ¯&Œ¨&Œ¡&Œš&Œ“&ŒŒ&Œ…&Œ~&Œw&Œp&Œi&Œb&Œ[&ŒT&ŒM&ŒF&Œ?&Œ8&Œ1&Œ*&Œ#&Œ&Œ&Œ&Œ&Œ&Œù%Œò%Œë%Œä%ŒÝ%ŒÖ%ŒÏ%ŒÈ%ŒÁ%Œº%Œ³%Œ¬%Œ¥%Œž%Œ—%Œ%Œ‰%Œ‚%Œ{%Œt%Œm%Œf%Œ_%ŒX%ŒQ%ŒJ%ŒC%Œ<%Œ5%Œ.%Œ'%Œ %Œ%Œ%Œ %Œ%Œý$Œö$Œï$Œè$Œá$ŒÚ$ŒÓ$ŒÌ$ŒÅ$Œ¾$Œ·$Œ°$Œ©$Œ¢$Œ›$Œ”$Œ$Œ†$Œ$Œx$Œq$Œj$Œc$Œ\$ŒU$ŒN$ŒG$Œ@$Œ9$Œ2$Œ+$Œ$$Œ$Œ$Œ$Œ$Œ$Œú#Œó#Œì#Œå#ŒÞ#Œ×#ŒÐ#ŒÉ#ŒÂ#Œ»#Œ´#Œ­#Œ¦#ŒŸ#Œ˜#Œ‘#ŒŠ#Œƒ#Œ|#Œu#Œn#Œg#Œ`#ŒY#ŒR#ŒK#ŒD#Œ=#Œ6#Œ/#Œ(#Œ!#Œ#Œ#Œ #Œ#Œþ"Œ÷"Œð"Œé"Œâ"ŒÛ"ŒÔ"ŒÍ"ŒÆ"Œ¿"Œ¸"Œ±"Œª"Œ£"Œœ"Œ•"ŒŽ"Œ‡"Œ€"Œy"Œr"Œk"Œd"Œ]"ŒV"ŒO"ŒH"ŒA"Œ:"Œ3"Œ,"Œ%"Œ"Œ"Œ"Œ "Œ"Œû!Œô!Œí!Œæ!Œß!ŒØ!ŒÑ!ŒÊ!ŒÃ!Œ¼!Œµ!Œ®!Œ§!Œ !Œ™!Œ’!Œ‹!Œ„!Œ}!Œv!Œo!Œh!Œa!ŒZ!ŒS!ŒL!ŒE!Œ>!Œ7!Œ0!Œ)!Œ"!Œ!Œ!Œ !Œ!Œÿ Œø Œñ Œê Œã ŒÜ ŒÕ ŒÎ ŒÇ ŒÀ Œ¹ Œ² Œ« Œ¤ Œ Œ– Œ Œˆ Œ Œz Œs Œl Œe Œ^ ŒW ŒP ŒI ŒB Œ; Œ4 Œ- Œ& Œ Œ Œ Œ Œ ŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒóŒìŒåŒÞŒ×ŒÐŒÉŒÂŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒûŒôŒíŒæŒßŒØŒÑŒÊŒÃŒ¼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒóŒìŒåŒÞŒ×ŒÐŒÉŒÂŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒûŒôŒíŒæŒßŒØŒÑŒÊŒÃŒ¼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒóŒìŒåŒÞŒ×ŒÐŒÉŒÂŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ Œ÷ Œð Œé Œâ ŒÛ ŒÔ ŒÍ ŒÆ Œ¿ Œ¸ Œ± Œª Œ£ Œœ Œ• ŒŽ Œ‡ Œ€ Œy Œr Œk Œd Œ] ŒV ŒO ŒH ŒA Œ: Œ3 Œ, Œ% Œ Œ Œ Œ Œ Œû Œô Œí Œæ Œß ŒØ ŒÑ ŒÊ Œà Œ¼ Œµ Œ® Œ§ Œ  Œ™ Œ’ Œ‹ Œ„ Œ} Œv Œo Œh Œa ŒZ ŒS ŒL ŒE Œ> Œ7 Œ0 Œ) Œ" Œ Œ Œ Œ Œÿ Œø Œñ Œê Œã ŒÜ ŒÕ ŒÎ ŒÇ ŒÀ Œ¹ Œ² Œ« Œ¤ Œ Œ– Œ Œˆ Œ Œz Œs Œl Œe Œ^ ŒW ŒP ŒI ŒB Œ; Œ4 Œ- Œ& Œ Œ Œ Œ Œ Œü Œõ Œî Œç Œà ŒÙ ŒÒ ŒË ŒÄ Œ½ Œ¶ Œ¯ Œ¨ Œ¡ Œš Œ“ ŒŒ Œ… Œ~ Œw Œp Œi Œb Œ[ ŒT ŒM ŒF Œ? Œ8 Œ1 Œ* Œ# Œ Œ Œ Œ Œ Œù Œò Œë Œä ŒÝ ŒÖ ŒÏ ŒÈ ŒÁ Œº Œ³ Œ¬ Œ¥ Œž Œ— Œ Œ‰ Œ‚ Œ{ Œt Œm Œf Œ_ ŒX ŒQ ŒJ ŒC Œ< Œ5 Œ. Œ' Œ Œ Œ Œ Œ ŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒóŒìŒåŒÞŒ×ŒÐŒÉŒÂŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒûŒôŒíŒæŒßŒØŒÑŒÊŒÃŒ¼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒüŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒúŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþÿ‹÷ÿ‹ðÿ‹éÿ‹âÿ‹Ûÿ‹Ôÿ‹Íÿ‹Æÿ‹¿ÿ‹¸ÿ‹±ÿ‹ªÿ‹£ÿ‹œÿ‹•ÿ‹Žÿ‹‡ÿ‹€ÿ‹yÿ‹rÿ‹kÿ‹dÿ‹]ÿ‹Vÿ‹Oÿ‹Hÿ‹Aÿ‹:ÿ‹3ÿ‹,ÿ‹%ÿ‹ÿ‹ÿ‹ÿ‹ ÿ‹ÿ‹ûþ‹ôþ‹íþ‹æþ‹ßþ‹Øþ‹Ñþ‹Êþ‹Ãþ‹¼þ‹µþ‹®þ‹§þ‹ þ‹™þ‹’þ‹‹þ‹„þ‹}þ‹vþ‹oþ‹hþ‹aþ‹Zþ‹Sþ‹Lþ‹Eþ‹>þ‹7þ‹0þ‹)þ‹"þ‹þ‹þ‹ þ‹þ‹ÿý‹øý‹ñý‹êý‹ãý‹Üý‹Õý‹Îý‹Çý‹Àý‹¹ý‹²ý‹«ý‹¤ý‹ý‹–ý‹ý‹ˆý‹ý‹zý‹sý‹lý‹eý‹^ý‹Wý‹Pý‹Iý‹Bý‹;ý‹4ý‹-ý‹&ý‹ý‹ý‹ý‹ ý‹ý‹üü‹õü‹îü‹çü‹àü‹Ùü‹Òü‹Ëü‹Äü‹½ü‹¶ü‹¯ü‹¨ü‹¡ü‹šü‹“ü‹Œü‹…ü‹~ü‹wü‹pü‹iü‹bü‹[ü‹Tü‹Mü‹Fü‹?ü‹8ü‹1ü‹*ü‹#ü‹ü‹ü‹ü‹ü‹ü‹ùû‹òû‹ëû‹äû‹Ýû‹Öû‹Ïû‹Èû‹Áû‹ºû‹³û‹¬û‹¥û‹žû‹—û‹û‹‰û‹‚û‹{û‹tû‹mû‹fû‹_û‹Xû‹Qû‹Jû‹Cû‹<û‹5û‹.û‹'û‹ û‹û‹û‹ û‹û‹ýú‹öú‹ïú‹èú‹áú‹Úú‹Óú‹Ìú‹Åú‹¾ú‹·ú‹°ú‹©ú‹¢ú‹›ú‹”ú‹ú‹†ú‹ú‹xú‹qú‹jú‹cú‹\ú‹Uú‹Nú‹Gú‹@ú‹9ú‹2ú‹+ú‹$ú‹ú‹ú‹ú‹ú‹ú‹úù‹óù‹ìù‹åù‹Þù‹×ù‹Ðù‹Éù‹Âù‹»ù‹´ù‹­ù‹¦ù‹Ÿù‹˜ù‹‘ù‹Šù‹ƒù‹|ù‹uù‹nù‹gù‹`ù‹Yù‹Rù‹Kù‹Dù‹=ù‹6ù‹/ù‹(ù‹!ù‹ù‹ù‹ ù‹ù‹þø‹÷ø‹ðø‹éø‹âø‹Ûø‹Ôø‹Íø‹Æø‹¿ø‹¸ø‹±ø‹ªø‹£ø‹œø‹•ø‹Žø‹‡ø‹€ø‹yø‹rø‹kø‹dø‹]ø‹Vø‹Oø‹Hø‹Aø‹:ø‹3ø‹,ø‹%ø‹ø‹ø‹ø‹ ø‹ø‹û÷‹ô÷‹í÷‹æ÷‹ß÷‹Ø÷‹Ñ÷‹Ê÷‹Ã÷‹¼÷‹µ÷‹®÷‹§÷‹ ÷‹™÷‹’÷‹‹÷‹„÷‹}÷‹v÷‹o÷‹h÷‹a÷‹Z÷‹S÷‹L÷‹E÷‹>÷‹7÷‹0÷‹)÷‹"÷‹÷‹÷‹ ÷‹÷‹ÿö‹øö‹ñö‹êö‹ãö‹Üö‹Õö‹Îö‹Çö‹Àö‹¹ö‹²ö‹«ö‹¤ö‹ö‹–ö‹ö‹ˆö‹ö‹zö‹sö‹lö‹eö‹^ö‹Wö‹Pö‹Iö‹Bö‹;ö‹4ö‹-ö‹&ö‹ö‹ö‹ö‹ ö‹ö‹üõ‹õõ‹îõ‹çõ‹àõ‹Ùõ‹Òõ‹Ëõ‹Äõ‹½õ‹¶õ‹¯õ‹¨õ‹¡õ‹šõ‹“õ‹Œõ‹…õ‹~õ‹wõ‹põ‹iõ‹bõ‹[õ‹Tõ‹Mõ‹Fõ‹?õ‹8õ‹1õ‹*õ‹#õ‹õ‹õ‹õ‹õ‹õ‹ùô‹òô‹ëô‹äô‹Ýô‹Öô‹Ïô‹Èô‹Áô‹ºô‹³ô‹¬ô‹¥ô‹žô‹—ô‹ô‹‰ô‹‚ô‹{ô‹tô‹mô‹fô‹_ô‹Xô‹Qô‹Jô‹Cô‹<ô‹5ô‹.ô‹'ô‹ ô‹ô‹ô‹ ô‹ô‹ýó‹öó‹ïó‹èó‹áó‹Úó‹Óó‹Ìó‹Åó‹¾ó‹·ó‹°ó‹©ó‹¢ó‹›ó‹”ó‹ó‹†ó‹ó‹xó‹qó‹jó‹có‹\ó‹Uó‹Nó‹Gó‹@ó‹9ó‹2ó‹+ó‹$ó‹ó‹ó‹ó‹ó‹ó‹úò‹óò‹ìò‹åò‹Þò‹×ò‹Ðò‹Éò‹Âò‹»ò‹´ò‹­ò‹¦ò‹Ÿò‹˜ò‹‘ò‹Šò‹ƒò‹|ò‹uò‹nò‹gò‹`ò‹Yò‹Rò‹Kò‹Dò‹=ò‹6ò‹/ò‹(ò‹!ò‹ò‹ò‹ ò‹ò‹þñ‹÷ñ‹ðñ‹éñ‹âñ‹Ûñ‹Ôñ‹Íñ‹Æñ‹¿ñ‹¸ñ‹±ñ‹ªñ‹£ñ‹œñ‹•ñ‹Žñ‹‡ñ‹€ñ‹yñ‹rñ‹kñ‹dñ‹]ñ‹Vñ‹Oñ‹Hñ‹Añ‹:ñ‹3ñ‹,ñ‹%ñ‹ñ‹ñ‹ñ‹ ñ‹ñ‹ûð‹ôð‹íð‹æð‹ßð‹Øð‹Ñð‹Êð‹Ãð‹¼ð‹µð‹®ð‹§ð‹ ð‹™ð‹’ð‹‹ð‹„ð‹}ð‹vð‹oð‹hð‹að‹Zð‹Sð‹Lð‹Eð‹>ð‹7ð‹0ð‹)ð‹"ð‹ð‹ð‹ ð‹ð‹ÿï‹øï‹ñï‹êï‹ãï‹Üï‹Õï‹Îï‹Çï‹Àï‹ï‹–ï‹ï‹ˆï‹ï‹zï‹sï‹lï‹eï‹^ï‹Wï‹Pï‹Iï‹Bï‹;ï‹4ï‹-ï‹&ï‹ï‹ï‹ï‹ ï‹ï‹üî‹õî‹îî‹çî‹àî‹Ùî‹Òî‹Ëî‹Äî‹~î‹wî‹pî‹iî‹bî‹[î‹Tî‹Mî‹Fî‹?î‹8î‹1î‹*î‹#î‹î‹î‹î‹î‹î‹ùí‹òí‹ëí‹äí‹Ýí‹Öí‹Ïí‹Èí‹Á틺틳틬틥틞틗í‹í‹‰í‹‚í‹{í‹tí‹mí‹fí‹_í‹Xí‹Qí‹Jí‹Cí‹<í‹5í‹.í‹'í‹ í‹í‹í‹ í‹í‹ýì‹öì‹ïì‹èì‹áì‹Úì‹Óì‹Ìì‹Å싾싷싰싩싢싛싔ì‹ì‹†ì‹ì‹xì‹qì‹jì‹cì‹\ì‹Uì‹Nì‹Gì‹@ì‹9ì‹2ì‹+ì‹$ì‹ì‹ì‹ì‹ì‹ì‹úë‹óë‹ìë‹åë‹Þë‹×ë‹Ðë‹Éë‹Â닻담닭닦닟님닑닊닃ë‹|ë‹uë‹në‹gë‹`ë‹Yë‹Rë‹Kë‹Dë‹=ë‹6ë‹/ë‹(ë‹!ë‹ë‹ë‹ ë‹ë‹þê‹÷ê‹ðê‹éê‹âê‹Ûê‹Ôê‹Íê‹Æê‹¿ê‹¸ê‹±ê‹ªê‹£ê‹œê‹•ê‹Žê‹‡ê‹€ê‹yê‹rê‹kê‹dê‹]ê‹Vê‹Oê‹Hê‹Aê‹:ê‹3ê‹,ê‹%ê‹ê‹ê‹ê‹ ê‹ê‹ûé‹ôé‹í鋿é‹ß鋨é‹Ñé‹Êé‹Ã鋼鋵鋮鋧鋠鋙鋒鋋鋄é‹}é‹vé‹oé‹hé‹aé‹Zé‹Sé‹Lé‹Eé‹>é‹7é‹0é‹)é‹"é‹é‹é‹ é‹é‹ÿè‹øè‹ñè‹êè‹ãè‹Üè‹Õè‹Îè‹Çè‹À苹苲苫苤è‹è‹–è‹è‹ˆè‹è‹zè‹sè‹lè‹eè‹^è‹Wè‹Pè‹Iè‹Bè‹;è‹4è‹-è‹&è‹è‹è‹è‹ è‹è‹üç‹õç‹îç‹çç‹àç‹Ùç‹Òç‹Ëç‹Ä狽狶狯狨狡狚狓狌狅ç‹~ç‹wç‹pç‹iç‹bç‹[ç‹Tç‹Mç‹Fç‹?ç‹8ç‹1ç‹*ç‹#ç‹ç‹ç‹ç‹ç‹ç‹ùæ‹òæ‹ëæ‹äæ‹Ýæ‹Öæ‹Ïæ‹Èæ‹Áæ‹ºæ‹³æ‹¬æ‹¥æ‹žæ‹—æ‹æ‹‰æ‹‚æ‹{æ‹tæ‹mæ‹fæ‹_æ‹Xæ‹Qæ‹Jæ‹Cæ‹<æ‹5æ‹.æ‹'æ‹ æ‹æ‹æ‹ æ‹æ‹ýå‹öå‹ïå‹èå‹áå‹Úå‹Óå‹Ìå‹Å勾勷勰勩勢勛勔å‹å‹†å‹å‹xå‹qå‹jå‹cå‹\å‹Uå‹Nå‹Gå‹@å‹9å‹2å‹+å‹$å‹å‹å‹å‹å‹å‹úä‹óä‹ìä‹åä‹Þä‹×ä‹Ðä‹Éä‹Â䋻䋴䋭䋦䋟䋘䋑䋊䋃ä‹|ä‹uä‹nä‹gä‹`ä‹Yä‹Rä‹Kä‹Dä‹=ä‹6ä‹/ä‹(ä‹!ä‹ä‹ä‹ ä‹ä‹þã‹÷ã‹ðã‹éã‹âã‹Ûã‹Ôã‹Íã‹Æã‹¿ã‹¸ã‹±ã‹ªã‹£ã‹œã‹•ã‹Žã‹‡ã‹€ã‹yã‹rã‹kã‹dã‹]ã‹Vã‹Oã‹Hã‹Aã‹:ã‹3ã‹,ã‹%ã‹ã‹ã‹ã‹ ã‹ã‹ûâ‹ôâ‹íâ‹æâ‹ßâ‹Øâ‹Ñâ‹Êâ‹Ã⋼⋵⋮⋧⋠⋙⋒⋋⋄â‹}â‹vâ‹oâ‹hâ‹aâ‹Zâ‹Sâ‹Lâ‹Eâ‹>â‹7â‹0â‹)â‹"â‹â‹â‹ â‹â‹ÿá‹øá‹ñá‹êá‹ãá‹Üá‹Õá‹Îá‹Çá‹Àዹዲያዤá‹á‹–á‹á‹ˆá‹á‹zá‹sá‹lá‹eá‹^á‹Wá‹Pá‹Iá‹Bá‹;á‹4á‹-á‹&á‹á‹á‹á‹ á‹á‹üà‹õà‹îà‹çà‹àà‹Ùà‹Òà‹Ëà‹Äà‹½à‹¶à‹¯à‹¨à‹¡à‹šà‹“à‹Œà‹…à‹~à‹wà‹pà‹ià‹bà‹[à‹Tà‹Mà‹Fà‹?à‹8à‹1à‹*à‹#à‹à‹à‹à‹à‹à‹ùß‹òß‹ëß‹äß‹Ýß‹Öß‹Ïß‹Èß‹Áß‹ºß‹³ß‹¬ß‹¥ß‹žß‹—ߋߋ‰ß‹‚ß‹{ß‹tß‹mß‹fß‹_ß‹Xß‹Qß‹Jß‹Cß‹<ß‹5ß‹.ß‹'ß‹ ߋߋߋ ߋߋýÞ‹öÞ‹ïÞ‹èÞ‹áÞ‹ÚÞ‹ÓÞ‹ÌÞ‹ÅÞ‹¾Þ‹·Þ‹°Þ‹©Þ‹¢Þ‹›Þ‹”Þ‹Þ‹†Þ‹Þ‹xÞ‹qÞ‹jÞ‹cÞ‹\Þ‹UÞ‹NÞ‹GÞ‹@Þ‹9Þ‹2Þ‹+Þ‹$Þ‹Þ‹Þ‹Þ‹Þ‹Þ‹úÝ‹óÝ‹ìÝ‹åÝ‹ÞÝ‹×Ý‹ÐÝ‹ÉÝ‹ÂÝ‹»Ý‹´Ý‹­Ý‹¦Ý‹ŸÝ‹˜Ý‹‘Ý‹ŠÝ‹ƒÝ‹|Ý‹uÝ‹nÝ‹gÝ‹`Ý‹YÝ‹RÝ‹KÝ‹DÝ‹=Ý‹6Ý‹/Ý‹(Ý‹!݋݋݋ ݋݋þÜ‹÷Ü‹ðÜ‹éÜ‹âÜ‹ÛÜ‹ÔÜ‹ÍÜ‹ÆÜ‹¿Ü‹¸Ü‹±Ü‹ªÜ‹£Ü‹œÜ‹•Ü‹ŽÜ‹‡Ü‹€Ü‹yÜ‹rÜ‹kÜ‹dÜ‹]Ü‹VÜ‹OÜ‹HÜ‹AÜ‹:Ü‹3Ü‹,Ü‹%܋܋܋܋ ܋܋ûÛ‹ôÛ‹íÛ‹æÛ‹ßÛ‹ØÛ‹ÑÛ‹ÊÛ‹ÃÛ‹¼Û‹µÛ‹®Û‹§Û‹ Û‹™Û‹’Û‹‹Û‹„Û‹}Û‹vÛ‹oÛ‹hÛ‹aÛ‹ZÛ‹SÛ‹LÛ‹EÛ‹>Û‹7Û‹0Û‹)Û‹"Û‹Û‹Û‹ Û‹Û‹ÿÚ‹øÚ‹ñÚ‹êÚ‹ãÚ‹ÜÚ‹ÕÚ‹ÎÚ‹ÇÚ‹ÀÚ‹¹Ú‹²Ú‹«Ú‹¤Ú‹Ú‹–Ú‹Ú‹ˆÚ‹Ú‹zÚ‹sÚ‹lÚ‹eÚ‹^Ú‹WÚ‹PÚ‹IÚ‹BÚ‹;Ú‹4Ú‹-Ú‹&Ú‹Ú‹Ú‹Ú‹ Ú‹Ú‹üÙ‹õÙ‹îÙ‹çÙ‹àÙ‹ÙÙ‹ÒÙ‹ËÙ‹ÄÙ‹½Ù‹¶Ù‹¯Ù‹¨Ù‹¡Ù‹šÙ‹“Ù‹ŒÙ‹…Ù‹~Ù‹wÙ‹pÙ‹iÙ‹bÙ‹[Ù‹TÙ‹MÙ‹FÙ‹?Ù‹8Ù‹1Ù‹*Ù‹#ًًًًًًùØ‹òØ‹ëØ‹䨋ÝØ‹ÖØ‹ÏØ‹ÈØ‹ÁØ‹ºØ‹³Ø‹¬Ø‹¥Ø‹žØ‹—؋؋‰Ø‹‚Ø‹{Ø‹tØ‹mØ‹fØ‹_Ø‹XØ‹QØ‹JØ‹CØ‹<Ø‹5Ø‹.Ø‹'Ø‹ ؋؋؋ ؋؋ý׋ö׋ï׋è׋á׋Ú׋Ó׋Ì׋Å׋¾×‹·×‹°×‹©×‹¢×‹›×‹”׋׋†×‹׋x׋q׋j׋c׋\׋U׋N׋G׋@׋9׋2׋+׋$׋׋׋׋׋׋úÖ‹óÖ‹ìÖ‹åÖ‹ÞÖ‹×Ö‹ÐÖ‹ÉÖ‹ÂÖ‹»Ö‹´Ö‹­Ö‹¦Ö‹ŸÖ‹˜Ö‹‘Ö‹ŠÖ‹ƒÖ‹|Ö‹uÖ‹nÖ‹gÖ‹`Ö‹YÖ‹RÖ‹KÖ‹DÖ‹=Ö‹6Ö‹/Ö‹(Ö‹!Ö‹Ö‹Ö‹ Ö‹Ö‹þÕ‹÷Õ‹ðÕ‹éÕ‹âÕ‹ÛÕ‹ÔÕ‹ÍÕ‹ÆÕ‹¿Õ‹¸Õ‹±Õ‹ªÕ‹£Õ‹œÕ‹•Õ‹ŽÕ‹‡Õ‹€Õ‹yÕ‹rÕ‹kÕ‹dÕ‹]Õ‹VÕ‹OÕ‹HÕ‹AÕ‹:Õ‹3Õ‹,Õ‹%Õ‹Õ‹Õ‹Õ‹ Õ‹Õ‹ûÔ‹ôÔ‹íÔ‹æÔ‹ßÔ‹ØÔ‹ÑÔ‹ÊÔ‹ÃÔ‹¼Ô‹µÔ‹®Ô‹§Ô‹ Ô‹™Ô‹’Ô‹‹Ô‹„Ô‹}Ô‹vÔ‹oÔ‹hÔ‹aÔ‹ZÔ‹SÔ‹LÔ‹EÔ‹>Ô‹7Ô‹0Ô‹)Ô‹"Ô‹Ô‹Ô‹ Ô‹Ô‹ÿÓ‹øÓ‹ñÓ‹êÓ‹ãÓ‹ÜÓ‹ÕÓ‹ÎÓ‹ÇÓ‹ÀÓ‹¹Ó‹²Ó‹«Ó‹¤Ó‹Ó‹–Ó‹Ó‹ˆÓ‹Ó‹zÓ‹sÓ‹lÓ‹eÓ‹^Ó‹WÓ‹PÓ‹IÓ‹BÓ‹;Ó‹4Ó‹-Ó‹&Ó‹Ó‹Ó‹Ó‹ Ó‹Ó‹üÒ‹õÒ‹îÒ‹çÒ‹àÒ‹ÙÒ‹ÒÒ‹ËÒ‹ÄÒ‹½Ò‹¶Ò‹¯Ò‹¨Ò‹¡Ò‹šÒ‹“Ò‹ŒÒ‹…Ò‹~Ò‹wÒ‹pÒ‹iÒ‹bÒ‹[Ò‹TÒ‹MÒ‹FÒ‹?Ò‹8Ò‹1Ò‹*Ò‹#Ò‹Ò‹Ò‹Ò‹Ò‹Ò‹ùÑ‹òÑ‹ëÑ‹äÑ‹ÝÑ‹ÖÑ‹ÏÑ‹ÈÑ‹ÁÑ‹ºÑ‹³Ñ‹¬Ñ‹¥Ñ‹žÑ‹—ыы‰Ñ‹‚Ñ‹{Ñ‹tÑ‹mÑ‹fÑ‹_Ñ‹XÑ‹QÑ‹JÑ‹CÑ‹<Ñ‹5Ñ‹.Ñ‹'Ñ‹ ыыы ыыýЋöЋïЋèЋáЋÚЋÓЋÌЋÅЋ¾Ð‹·Ð‹°Ð‹©Ð‹¢Ð‹›Ð‹”ЋЋ†Ð‹ЋxЋqЋjЋcЋ\ЋUЋNЋGЋ@Ћ9Ћ2Ћ+Ћ$ЋЋЋЋЋЋúÏ‹óÏ‹ìÏ‹åÏ‹ÞÏ‹×Ï‹ÐÏ‹ÉÏ‹ÂÏ‹»Ï‹´Ï‹­Ï‹¦Ï‹ŸÏ‹˜Ï‹‘Ï‹ŠÏ‹ƒÏ‹|Ï‹uÏ‹nÏ‹gÏ‹`Ï‹YÏ‹RÏ‹KÏ‹DÏ‹=Ï‹6Ï‹/Ï‹(Ï‹!ϋϋϋ ϋϋþ΋÷΋ð΋é΋â΋Û΋Ô΋Í΋ÆÎ‹¿Î‹¸Î‹±Î‹ªÎ‹£Î‹œÎ‹•΋ŽÎ‹‡Î‹€Î‹y΋r΋k΋d΋]΋V΋O΋H΋A΋:΋3΋,΋%΋΋΋΋ ΋΋ûÍ‹ôÍ‹íÍ‹æÍ‹ßÍ‹ØÍ‹ÑÍ‹ÊÍ‹ÃÍ‹¼Í‹µÍ‹®Í‹§Í‹ Í‹™Í‹’Í‹‹Í‹„Í‹}Í‹vÍ‹oÍ‹hÍ‹aÍ‹ZÍ‹SÍ‹LÍ‹EÍ‹>Í‹7Í‹0Í‹)Í‹"͋͋͋ ͋͋ÿÌ‹øÌ‹ñÌ‹êÌ‹ãÌ‹ÜÌ‹ÕÌ‹ÎÌ‹ÇÌ‹ÀÌ‹¹Ì‹²Ì‹«Ì‹¤Ì‹Ì‹–̋̋ˆÌ‹Ì‹zÌ‹sÌ‹lÌ‹eÌ‹^Ì‹WÌ‹PÌ‹IÌ‹BÌ‹;Ì‹4Ì‹-Ì‹&̋̋̋̋ ̋̋üË‹õË‹îË‹çË‹àË‹ÙË‹ÒË‹ËË‹ÄË‹½Ë‹¶Ë‹¯Ë‹¨Ë‹¡Ë‹šË‹“Ë‹ŒË‹…Ë‹~Ë‹wË‹pË‹iË‹bË‹[Ë‹TË‹MË‹FË‹?Ë‹8Ë‹1Ë‹*Ë‹#ˋˋˋˋˋˋùÊ‹òÊ‹ëÊ‹äÊ‹ÝÊ‹ÖÊ‹ÏÊ‹ÈÊ‹ÁÊ‹ºÊ‹³Ê‹¬Ê‹¥Ê‹žÊ‹—ʋʋ‰Ê‹‚Ê‹{Ê‹tÊ‹mÊ‹fÊ‹_Ê‹XÊ‹QÊ‹JÊ‹CÊ‹<Ê‹5Ê‹.Ê‹'Ê‹ ʋʋʋ ʋʋýÉ‹öÉ‹ïÉ‹èÉ‹áÉ‹ÚÉ‹ÓÉ‹ÌÉ‹ÅÉ‹¾É‹·É‹°É‹©É‹¢É‹›É‹”ɋɋ†É‹É‹xÉ‹qÉ‹jÉ‹cÉ‹\É‹UÉ‹NÉ‹GÉ‹@É‹9É‹2É‹+É‹$ɋɋɋɋɋɋúÈ‹óÈ‹ìÈ‹åÈ‹ÞÈ‹×È‹ÐÈ‹ÉÈ‹ÂÈ‹»È‹´È‹­È‹¦È‹ŸÈ‹˜È‹‘È‹ŠÈ‹ƒÈ‹|È‹uÈ‹nÈ‹gÈ‹`È‹YÈ‹RÈ‹KÈ‹DÈ‹=È‹6È‹/È‹(È‹!ȋȋȋ ȋȋþÇ‹÷Ç‹ðÇ‹éÇ‹âÇ‹ÛÇ‹ÔÇ‹ÍÇ‹ÆÇ‹¿Ç‹¸Ç‹±Ç‹ªÇ‹£Ç‹œÇ‹•Ç‹ŽÇ‹‡Ç‹€Ç‹yÇ‹rÇ‹kÇ‹dÇ‹]Ç‹VÇ‹OÇ‹HÇ‹AÇ‹:Ç‹3Ç‹,Ç‹%NjNjNjNj NjNjûÆ‹ôÆ‹íÆ‹æÆ‹߯‹ØÆ‹ÑÆ‹ÊÆ‹ÃÆ‹¼Æ‹µÆ‹®Æ‹§Æ‹ Æ‹™Æ‹’Æ‹‹Æ‹„Æ‹}Æ‹vÆ‹oÆ‹hÆ‹aÆ‹ZÆ‹SÆ‹LÆ‹EÆ‹>Æ‹7Æ‹0Æ‹)Æ‹"ƋƋƋ ƋƋÿÅ‹øÅ‹ñÅ‹êÅ‹ãÅ‹ÜÅ‹ÕÅ‹ÎÅ‹ÇÅ‹ÀÅ‹¹Å‹²Å‹«Å‹¤Å‹Å‹–ŋŋˆÅ‹Å‹zÅ‹sÅ‹lÅ‹eÅ‹^Å‹WÅ‹PÅ‹IÅ‹BÅ‹;Å‹4Å‹-Å‹&ŋŋŋŋ ŋŋüÄ‹õÄ‹îÄ‹çÄ‹àÄ‹ÙÄ‹ÒÄ‹ËÄ‹ÄÄ‹½Ä‹¶Ä‹¯Ä‹¨Ä‹¡Ä‹šÄ‹“Ä‹ŒÄ‹…Ä‹~Ä‹wÄ‹pÄ‹iÄ‹bÄ‹[Ä‹TÄ‹MÄ‹FÄ‹?Ä‹8Ä‹1Ä‹*Ä‹#ċċċċċċùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞Ë—ËˉË‚Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾Â‹·Â‹°Â‹©Â‹¢Â‹›Â‹”‹‹†Â‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹úÁ‹óÁ‹ìÁ‹åÁ‹ÞÁ‹×Á‹ÐÁ‹ÉÁ‹ÂÁ‹»Á‹´Á‹­Á‹¦Á‹ŸÁ‹˜Á‹‘Á‹ŠÁ‹ƒÁ‹|Á‹uÁ‹nÁ‹gÁ‹`Á‹YÁ‹RÁ‹KÁ‹DÁ‹=Á‹6Á‹/Á‹(Á‹!Á‹Á‹Á‹ Á‹Á‹þÀ‹÷À‹ðÀ‹éÀ‹âÀ‹ÛÀ‹ÔÀ‹ÍÀ‹ÆÀ‹¿À‹¸À‹±À‹ªÀ‹£À‹œÀ‹•À‹ŽÀ‹‡À‹€À‹yÀ‹rÀ‹kÀ‹dÀ‹]À‹VÀ‹OÀ‹HÀ‹AÀ‹:À‹3À‹,À‹%À‹À‹À‹À‹ À‹À‹û¿‹ô¿‹í¿‹æ¿‹ß¿‹Ø¿‹Ñ¿‹Ê¿‹ÿ‹¼¿‹µ¿‹®¿‹§¿‹ ¿‹™¿‹’¿‹‹¿‹„¿‹}¿‹v¿‹o¿‹h¿‹a¿‹Z¿‹S¿‹L¿‹E¿‹>¿‹7¿‹0¿‹)¿‹"¿‹¿‹¿‹ ¿‹¿‹ÿ¾‹ø¾‹ñ¾‹꾋㾋ܾ‹Õ¾‹ξ‹Ǿ‹À¾‹¹¾‹²¾‹«¾‹¤¾‹¾‹–¾‹¾‹ˆ¾‹¾‹z¾‹s¾‹l¾‹e¾‹^¾‹W¾‹P¾‹I¾‹B¾‹;¾‹4¾‹-¾‹&¾‹¾‹¾‹¾‹ ¾‹¾‹ü½‹õ½‹罋ཋÙ½‹Ò½‹˽‹Ľ‹½½‹¶½‹¯½‹¨½‹¡½‹š½‹“½‹Œ½‹…½‹~½‹w½‹p½‹i½‹b½‹[½‹T½‹M½‹F½‹?½‹8½‹1½‹*½‹#½‹½‹½‹½‹½‹½‹ù¼‹ò¼‹뼋伋ݼ‹Ö¼‹ϼ‹ȼ‹Á¼‹º¼‹³¼‹¬¼‹¥¼‹ž¼‹—¼‹¼‹‰¼‹‚¼‹{¼‹t¼‹m¼‹f¼‹_¼‹X¼‹Q¼‹J¼‹C¼‹<¼‹5¼‹.¼‹'¼‹ ¼‹¼‹¼‹ ¼‹¼‹ý»‹ö»‹ﻋ軋ịÚ»‹Ó»‹Ì»‹Å»‹¾»‹·»‹°»‹©»‹¢»‹›»‹”»‹»‹†»‹»‹x»‹q»‹j»‹c»‹\»‹U»‹N»‹G»‹@»‹9»‹2»‹+»‹$»‹»‹»‹»‹»‹»‹úº‹óº‹캋庋Þº‹׺‹к‹ɺ‹º‹»º‹´º‹­º‹¦º‹Ÿº‹˜º‹‘º‹Šº‹ƒº‹|º‹uº‹nº‹gº‹`º‹Yº‹Rº‹Kº‹Dº‹=º‹6º‹/º‹(º‹!º‹º‹º‹ º‹º‹þ¹‹÷¹‹ð¹‹鹋⹋Û¹‹Ô¹‹͹‹ƹ‹¿¹‹¸¹‹±¹‹ª¹‹£¹‹œ¹‹•¹‹޹‹‡¹‹€¹‹y¹‹r¹‹k¹‹d¹‹]¹‹V¹‹O¹‹H¹‹A¹‹:¹‹3¹‹,¹‹%¹‹¹‹¹‹¹‹ ¹‹¹‹û¸‹ô¸‹í¸‹渋߸‹ظ‹Ѹ‹ʸ‹ø‹¼¸‹µ¸‹®¸‹§¸‹ ¸‹™¸‹’¸‹‹¸‹„¸‹}¸‹v¸‹o¸‹h¸‹a¸‹Z¸‹S¸‹L¸‹E¸‹>¸‹7¸‹0¸‹)¸‹"¸‹¸‹¸‹ ¸‹¸‹ÿ·‹ø·‹ñ·‹ê·‹ã·‹Ü·‹Õ·‹η‹Ç·‹À·‹¹·‹²·‹«·‹¤·‹·‹–·‹·‹ˆ·‹·‹z·‹s·‹l·‹e·‹^·‹W·‹P·‹I·‹B·‹;·‹4·‹-·‹&·‹·‹·‹·‹ ·‹·‹ü¶‹õ¶‹î¶‹ç¶‹à¶‹Ù¶‹Ò¶‹˶‹Ķ‹½¶‹¶¶‹¯¶‹¨¶‹¡¶‹š¶‹“¶‹Œ¶‹…¶‹~¶‹w¶‹p¶‹i¶‹b¶‹[¶‹T¶‹M¶‹F¶‹?¶‹8¶‹1¶‹*¶‹#¶‹¶‹¶‹¶‹¶‹¶‹ùµ‹òµ‹뵋䵋ݵ‹Öµ‹ϵ‹ȵ‹Áµ‹ºµ‹³µ‹¬µ‹¥µ‹žµ‹—µ‹µ‹‰µ‹‚µ‹{µ‹tµ‹mµ‹fµ‹_µ‹Xµ‹Qµ‹Jµ‹Cµ‹<µ‹5µ‹.µ‹'µ‹ µ‹µ‹µ‹ µ‹µ‹ý´‹ö´‹ï´‹è´‹á´‹Ú´‹Ó´‹Ì´‹Å´‹¾´‹·´‹°´‹©´‹¢´‹›´‹”´‹´‹†´‹´‹x´‹q´‹j´‹c´‹\´‹U´‹N´‹G´‹@´‹9´‹2´‹+´‹$´‹´‹´‹´‹´‹´‹ú³‹ó³‹쳋峋Þ³‹׳‹г‹ɳ‹³‹»³‹´³‹­³‹¦³‹Ÿ³‹˜³‹‘³‹г‹ƒ³‹|³‹u³‹n³‹g³‹`³‹Y³‹R³‹K³‹D³‹=³‹6³‹/³‹(³‹!³‹³‹³‹ ³‹³‹þ²‹÷²‹ð²‹鲋ⲋÛ²‹Ô²‹Ͳ‹Ʋ‹¿²‹¸²‹±²‹ª²‹£²‹œ²‹•²‹޲‹‡²‹€²‹y²‹r²‹k²‹d²‹]²‹V²‹O²‹H²‹A²‹:²‹3²‹,²‹%²‹²‹²‹²‹ ²‹²‹û±‹ô±‹í±‹汋ß±‹ر‹ѱ‹ʱ‹ñ‹¼±‹µ±‹®±‹§±‹ ±‹™±‹’±‹‹±‹„±‹}±‹v±‹o±‹h±‹a±‹Z±‹S±‹L±‹E±‹>±‹7±‹0±‹)±‹"±‹±‹±‹ ±‹±‹ÿ°‹ø°‹ñ°‹ê°‹ã°‹ܰ‹Õ°‹ΰ‹ǰ‹À°‹¹°‹²°‹«°‹¤°‹°‹–°‹°‹ˆ°‹°‹z°‹s°‹l°‹e°‹^°‹W°‹P°‹I°‹B°‹;°‹4°‹-°‹&°‹°‹°‹°‹ °‹°‹ü¯‹õ¯‹篋ோÙ¯‹Ò¯‹˯‹į‹½¯‹¶¯‹¯¯‹¨¯‹¡¯‹š¯‹“¯‹Œ¯‹…¯‹~¯‹w¯‹p¯‹i¯‹b¯‹[¯‹T¯‹M¯‹F¯‹?¯‹8¯‹1¯‹*¯‹#¯‹¯‹¯‹¯‹¯‹¯‹ù®‹ò®‹뮋䮋Ý®‹Ö®‹Ï®‹È®‹Á®‹º®‹³®‹¬®‹¥®‹ž®‹—®‹®‹‰®‹‚®‹{®‹t®‹m®‹f®‹_®‹X®‹Q®‹J®‹C®‹<®‹5®‹.®‹'®‹ ®‹®‹®‹ ®‹®‹ý­‹ö­‹ï­‹è­‹á­‹Ú­‹Ó­‹Ì­‹Å­‹¾­‹·­‹°­‹©­‹¢­‹›­‹”­‹­‹†­‹­‹x­‹q­‹j­‹c­‹\­‹U­‹N­‹G­‹@­‹9­‹2­‹+­‹$­‹­‹­‹­‹­‹­‹ú¬‹ó¬‹쬋嬋Þ¬‹׬‹Ь‹ɬ‹¬‹»¬‹´¬‹­¬‹¦¬‹Ÿ¬‹˜¬‹‘¬‹Ь‹ƒ¬‹|¬‹u¬‹n¬‹g¬‹`¬‹Y¬‹R¬‹K¬‹D¬‹=¬‹6¬‹/¬‹(¬‹!¬‹¬‹¬‹ ¬‹¬‹þ«‹÷«‹ð«‹é«‹â«‹Û«‹Ô«‹Í«‹Æ«‹¿«‹¸«‹±«‹ª«‹£«‹œ«‹•«‹Ž«‹‡«‹€«‹y«‹r«‹k«‹d«‹]«‹V«‹O«‹H«‹A«‹:«‹3«‹,«‹%«‹«‹«‹«‹ «‹«‹ûª‹ôª‹íª‹檋ߪ‹ت‹Ѫ‹ʪ‹ê‹¼ª‹µª‹®ª‹§ª‹ ª‹™ª‹’ª‹‹ª‹„ª‹}ª‹vª‹oª‹hª‹aª‹Zª‹Sª‹Lª‹Eª‹>ª‹7ª‹0ª‹)ª‹"ª‹ª‹ª‹ ª‹ª‹ÿ©‹ø©‹ñ©‹ê©‹ã©‹Ü©‹Õ©‹Ω‹Ç©‹À©‹¹©‹²©‹«©‹¤©‹©‹–©‹©‹ˆ©‹©‹z©‹s©‹l©‹e©‹^©‹W©‹P©‹I©‹B©‹;©‹4©‹-©‹&©‹©‹©‹©‹ ©‹©‹ü¨‹õ¨‹程਋Ù¨‹Ò¨‹˨‹Ĩ‹½¨‹¶¨‹¯¨‹¨¨‹¡¨‹š¨‹“¨‹Œ¨‹…¨‹~¨‹w¨‹p¨‹i¨‹b¨‹[¨‹T¨‹M¨‹F¨‹?¨‹8¨‹1¨‹*¨‹#¨‹¨‹¨‹¨‹¨‹¨‹ù§‹ò§‹ë§‹ä§‹ݧ‹Ö§‹ϧ‹ȧ‹Á§‹º§‹³§‹¬§‹¥§‹ž§‹—§‹§‹‰§‹‚§‹{§‹t§‹m§‹f§‹_§‹X§‹Q§‹J§‹C§‹<§‹5§‹.§‹'§‹ §‹§‹§‹ §‹§‹ý¦‹ö¦‹曆見ᦋÚ¦‹Ó¦‹̦‹Ŧ‹¾¦‹·¦‹°¦‹©¦‹¢¦‹›¦‹”¦‹¦‹†¦‹¦‹x¦‹q¦‹j¦‹c¦‹\¦‹U¦‹N¦‹G¦‹@¦‹9¦‹2¦‹+¦‹$¦‹¦‹¦‹¦‹¦‹¦‹ú¥‹ó¥‹쥋奋Þ¥‹×¥‹Ð¥‹É¥‹Â¥‹»¥‹´¥‹­¥‹¦¥‹Ÿ¥‹˜¥‹‘¥‹Š¥‹ƒ¥‹|¥‹u¥‹n¥‹g¥‹`¥‹Y¥‹R¥‹K¥‹D¥‹=¥‹6¥‹/¥‹(¥‹!¥‹¥‹¥‹ ¥‹¥‹þ¤‹÷¤‹ð¤‹餋⤋Û¤‹Ô¤‹ͤ‹Ƥ‹¿¤‹¸¤‹±¤‹ª¤‹£¤‹œ¤‹•¤‹ޤ‹‡¤‹€¤‹y¤‹r¤‹k¤‹d¤‹]¤‹V¤‹O¤‹H¤‹A¤‹:¤‹3¤‹,¤‹%¤‹¤‹¤‹¤‹ ¤‹¤‹û£‹ô£‹í£‹棋ߣ‹Ø£‹Ñ£‹Ê£‹ã‹¼£‹µ£‹®£‹§£‹ £‹™£‹’£‹‹£‹„£‹}£‹v£‹o£‹h£‹a£‹Z£‹S£‹L£‹E£‹>£‹7£‹0£‹)£‹"£‹£‹£‹ £‹£‹ÿ¢‹ø¢‹ñ¢‹ꢋ㢋Ü¢‹Õ¢‹΢‹Ç¢‹À¢‹¹¢‹²¢‹«¢‹¤¢‹¢‹–¢‹¢‹ˆ¢‹¢‹z¢‹s¢‹l¢‹e¢‹^¢‹W¢‹P¢‹I¢‹B¢‹;¢‹4¢‹-¢‹&¢‹¢‹¢‹¢‹ ¢‹¢‹ü¡‹õ¡‹î¡‹ç¡‹à¡‹Ù¡‹Ò¡‹Ë¡‹Ä¡‹½¡‹¶¡‹¯¡‹¨¡‹¡¡‹š¡‹“¡‹Œ¡‹…¡‹~¡‹w¡‹p¡‹i¡‹b¡‹[¡‹T¡‹M¡‹F¡‹?¡‹8¡‹1¡‹*¡‹#¡‹¡‹¡‹¡‹¡‹¡‹ù ‹ò ‹ë ‹ä ‹Ý ‹Ö ‹Ï ‹È ‹Á ‹º ‹³ ‹¬ ‹¥ ‹ž ‹— ‹ ‹‰ ‹‚ ‹{ ‹t ‹m ‹f ‹_ ‹X ‹Q ‹J ‹C ‹< ‹5 ‹. ‹' ‹  ‹ ‹ ‹  ‹ ‹ýŸ‹öŸ‹蟋់ÚŸ‹ÓŸ‹ÌŸ‹ÅŸ‹¾Ÿ‹·Ÿ‹°Ÿ‹©Ÿ‹¢Ÿ‹›Ÿ‹”Ÿ‹Ÿ‹†Ÿ‹Ÿ‹xŸ‹qŸ‹jŸ‹cŸ‹\Ÿ‹UŸ‹NŸ‹GŸ‹@Ÿ‹9Ÿ‹2Ÿ‹+Ÿ‹$Ÿ‹Ÿ‹Ÿ‹Ÿ‹Ÿ‹Ÿ‹úž‹óž‹ìž‹åž‹Þž‹מ‹О‹Éž‹ž‹»ž‹´ž‹­ž‹¦ž‹Ÿž‹˜ž‹‘ž‹Šž‹ƒž‹|ž‹už‹nž‹gž‹`ž‹Yž‹Rž‹Kž‹Dž‹=ž‹6ž‹/ž‹(ž‹!ž‹ž‹ž‹ ž‹ž‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûœ‹ôœ‹휋朋ßœ‹Øœ‹Ñœ‹Êœ‹Ü‹¼œ‹µœ‹®œ‹§œ‹ œ‹™œ‹’œ‹‹œ‹„œ‹}œ‹vœ‹oœ‹hœ‹aœ‹Zœ‹Sœ‹Lœ‹Eœ‹>œ‹7œ‹0œ‹)œ‹"œ‹œ‹œ‹ œ‹œ‹ÿ›‹ø›‹ñ›‹ꛋ㛋Ü›‹Õ›‹Λ‹Ç›‹À›‹¹›‹²›‹«›‹¤›‹›‹–›‹›‹ˆ›‹›‹z›‹s›‹l›‹e›‹^›‹W›‹P›‹I›‹B›‹;›‹4›‹-›‹&›‹›‹›‹›‹ ›‹›‹üš‹õš‹îš‹çš‹àš‹Ùš‹Òš‹Ëš‹Äš‹½š‹¶š‹¯š‹¨š‹¡š‹šš‹“š‹Œš‹…š‹~š‹wš‹pš‹iš‹bš‹[š‹Tš‹Mš‹Fš‹?š‹8š‹1š‹*š‹#š‹š‹š‹š‹š‹š‹ù™‹ò™‹뙋䙋Ý™‹Ö™‹Ï™‹È™‹Á™‹º™‹³™‹¬™‹¥™‹ž™‹—™‹™‹‰™‹‚™‹{™‹t™‹m™‹f™‹_™‹X™‹Q™‹J™‹C™‹<™‹5™‹.™‹'™‹ ™‹™‹™‹ ™‹™‹ý˜‹ö˜‹蘋ᘋÚ˜‹Ó˜‹̘‹Ř‹¾˜‹·˜‹°˜‹©˜‹¢˜‹›˜‹”˜‹˜‹†˜‹˜‹x˜‹q˜‹j˜‹c˜‹\˜‹U˜‹N˜‹G˜‹@˜‹9˜‹2˜‹+˜‹$˜‹˜‹˜‹˜‹˜‹˜‹ú—‹ó—‹ì—‹å—‹Þ—‹×—‹З‹É—‹—‹»—‹´—‹­—‹¦—‹Ÿ—‹˜—‹‘—‹Š—‹ƒ—‹|—‹u—‹n—‹g—‹`—‹Y—‹R—‹K—‹D—‹=—‹6—‹/—‹(—‹!—‹—‹—‹ —‹—‹þ–‹÷–‹ð–‹é–‹â–‹Û–‹Ô–‹Í–‹Æ–‹¿–‹¸–‹±–‹ª–‹£–‹œ–‹•–‹Ž–‹‡–‹€–‹y–‹r–‹k–‹d–‹]–‹V–‹O–‹H–‹A–‹:–‹3–‹,–‹%–‹–‹–‹–‹ –‹–‹û•‹ô•‹í•‹æ•‹ß•‹Ø•‹Ñ•‹Ê•‹Õ‹¼•‹µ•‹®•‹§•‹ •‹™•‹’•‹‹•‹„•‹}•‹v•‹o•‹h•‹a•‹Z•‹S•‹L•‹E•‹>•‹7•‹0•‹)•‹"•‹•‹•‹ •‹•‹ÿ”‹ø”‹ñ”‹ꔋ㔋Ü”‹Õ”‹Δ‹Ç”‹À”‹¹”‹²”‹«”‹¤”‹”‹–”‹”‹ˆ”‹”‹z”‹s”‹l”‹e”‹^”‹W”‹P”‹I”‹B”‹;”‹4”‹-”‹&”‹”‹”‹”‹ ”‹”‹ü“‹õ“‹î“‹ç“‹à“‹Ù“‹Ò“‹Ë“‹Ä“‹½“‹¶“‹¯“‹¨“‹¡“‹š“‹““‹Œ“‹…“‹~“‹w“‹p“‹i“‹b“‹[“‹T“‹M“‹F“‹?“‹8“‹1“‹*“‹#“‹“‹“‹“‹“‹“‹ù’‹ò’‹ë’‹ä’‹Ý’‹Ö’‹Ï’‹È’‹Á’‹º’‹³’‹¬’‹¥’‹ž’‹—’‹’‹‰’‹‚’‹{’‹t’‹m’‹f’‹_’‹X’‹Q’‹J’‹C’‹<’‹5’‹.’‹'’‹ ’‹’‹’‹ ’‹’‹ý‘‹ö‘‹ï‘‹è‘‹á‘‹Ú‘‹Ó‘‹Ì‘‹Å‘‹¾‘‹·‘‹°‘‹©‘‹¢‘‹›‘‹”‘‹‘‹†‘‹‘‹x‘‹q‘‹j‘‹c‘‹\‘‹U‘‹N‘‹G‘‹@‘‹9‘‹2‘‹+‘‹$‘‹‘‹‘‹‘‹‘‹‘‹ú‹ó‹ì‹å‹Þ‹׋ЋÉ‹‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŽ‹ôŽ‹펋掋ߎ‹ØŽ‹ÑŽ‹ÊŽ‹ÃŽ‹¼Ž‹µŽ‹®Ž‹§Ž‹ Ž‹™Ž‹’Ž‹‹Ž‹„Ž‹}Ž‹vŽ‹oŽ‹hŽ‹aŽ‹ZŽ‹SŽ‹LŽ‹EŽ‹>Ž‹7Ž‹0Ž‹)Ž‹"ދދދ ދދÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŒ‹õŒ‹猋àŒ‹ÙŒ‹ÒŒ‹ËŒ‹ÄŒ‹½Œ‹¶Œ‹¯Œ‹¨Œ‹¡Œ‹šŒ‹“Œ‹ŒŒ‹…Œ‹~Œ‹wŒ‹pŒ‹iŒ‹bŒ‹[Œ‹TŒ‹MŒ‹FŒ‹?Œ‹8Œ‹1Œ‹*Œ‹#Œ‹Œ‹Œ‹Œ‹Œ‹Œ‹ù‹‹ò‹‹ë‹‹ä‹‹Ý‹‹Ö‹‹Ï‹‹È‹‹Á‹‹º‹‹³‹‹¬‹‹¥‹‹ž‹‹—‹‹‹‹‰‹‹‚‹‹{‹‹t‹‹m‹‹f‹‹_‹‹X‹‹Q‹‹J‹‹C‹‹<‹‹5‹‹.‹‹'‹‹ ‹‹‹‹‹‹ ‹‹‹‹ýŠ‹öŠ‹芋ኋÚŠ‹ÓŠ‹ÌŠ‹ÅŠ‹¾Š‹·Š‹°Š‹©Š‹¢Š‹›Š‹”ЋЋ†Š‹Š‹xŠ‹qŠ‹jŠ‹cŠ‹\Š‹UŠ‹NŠ‹GŠ‹@Š‹9Š‹2Š‹+Š‹$ЋЋЋЋЋЋú‰‹ó‰‹쉋剋Þ‰‹׉‹Љ‹ɉ‹‰‹»‰‹´‰‹­‰‹¦‰‹Ÿ‰‹˜‰‹‘‰‹Љ‹ƒ‰‹|‰‹u‰‹n‰‹g‰‹`‰‹Y‰‹R‰‹K‰‹D‰‹=‰‹6‰‹/‰‹(‰‹!‰‹‰‹‰‹ ‰‹‰‹þˆ‹÷ˆ‹ðˆ‹鈋∋Ûˆ‹Ôˆ‹͈‹ƈ‹¿ˆ‹¸ˆ‹±ˆ‹ªˆ‹£ˆ‹œˆ‹•ˆ‹Žˆ‹‡ˆ‹€ˆ‹yˆ‹rˆ‹kˆ‹dˆ‹]ˆ‹Vˆ‹Oˆ‹Hˆ‹Aˆ‹:ˆ‹3ˆ‹,ˆ‹%ˆ‹ˆ‹ˆ‹ˆ‹ ˆ‹ˆ‹û‡‹ô‡‹퇋懋߇‹؇‹ч‹ʇ‹Ç‹¼‡‹µ‡‹®‡‹§‡‹ ‡‹™‡‹’‡‹‹‡‹„‡‹}‡‹v‡‹o‡‹h‡‹a‡‹Z‡‹S‡‹L‡‹E‡‹>‡‹7‡‹0‡‹)‡‹"‡‹‡‹‡‹ ‡‹‡‹ÿ†‹ø†‹ñ†‹ꆋㆋ܆‹Õ†‹Ά‹dž‹À†‹¹†‹²†‹«†‹¤†‹†‹–†‹†‹ˆ†‹†‹z†‹s†‹l†‹e†‹^†‹W†‹P†‹I†‹B†‹;†‹4†‹-†‹&†‹†‹†‹†‹ †‹†‹ü…‹õ…‹î…‹ç…‹à…‹Ù…‹Ò…‹Ë…‹Ä…‹½…‹¶…‹¯…‹¨…‹¡…‹š…‹“…‹Œ…‹……‹~…‹w…‹p…‹i…‹b…‹[…‹T…‹M…‹F…‹?…‹8…‹1…‹*…‹#…‹…‹…‹…‹…‹…‹ù„‹ò„‹ë„‹ä„‹Ý„‹Ö„‹Ï„‹È„‹Á„‹º„‹³„‹¬„‹¥„‹ž„‹—„‹„‹‰„‹‚„‹{„‹t„‹m„‹f„‹_„‹X„‹Q„‹J„‹C„‹<„‹5„‹.„‹'„‹ „‹„‹„‹ „‹„‹ýƒ‹öƒ‹胋჋Úƒ‹Óƒ‹̃‹Ń‹¾ƒ‹·ƒ‹°ƒ‹©ƒ‹¢ƒ‹›ƒ‹”ƒ‹ƒ‹†ƒ‹ƒ‹xƒ‹qƒ‹jƒ‹cƒ‹\ƒ‹Uƒ‹Nƒ‹Gƒ‹@ƒ‹9ƒ‹2ƒ‹+ƒ‹$ƒ‹ƒ‹ƒ‹ƒ‹ƒ‹ƒ‹ú‚‹ó‚‹ì‚‹å‚‹Þ‚‹ׂ‹Ђ‹É‚‹‚‹»‚‹´‚‹­‚‹¦‚‹Ÿ‚‹˜‚‹‘‚‹Š‚‹ƒ‚‹|‚‹u‚‹n‚‹g‚‹`‚‹Y‚‹R‚‹K‚‹D‚‹=‚‹6‚‹/‚‹(‚‹!‚‹‚‹‚‹ ‚‹‚‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹û€‹ô€‹퀋怋߀‹Ø€‹Ñ€‹Ê€‹À‹¼€‹µ€‹®€‹§€‹ €‹™€‹’€‹‹€‹„€‹}€‹v€‹o€‹h€‹a€‹Z€‹S€‹L€‹E€‹>€‹7€‹0€‹)€‹"€‹€‹€‹ €‹€‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü~‹õ~‹î~‹ç~‹à~‹Ù~‹Ò~‹Ë~‹Ä~‹½~‹¶~‹¯~‹¨~‹¡~‹š~‹“~‹Œ~‹…~‹~~‹w~‹p~‹i~‹b~‹[~‹T~‹M~‹F~‹?~‹8~‹1~‹*~‹#~‹~‹~‹~‹~‹~‹ù}‹ò}‹ë}‹ä}‹Ý}‹Ö}‹Ï}‹È}‹Á}‹º}‹³}‹¬}‹¥}‹ž}‹—}‹}‹‰}‹‚}‹{}‹t}‹m}‹f}‹_}‹X}‹Q}‹J}‹C}‹<}‹5}‹.}‹'}‹ }‹}‹}‹ }‹}‹ý|‹ö|‹ï|‹è|‹á|‹Ú|‹Ó|‹Ì|‹Å|‹¾|‹·|‹°|‹©|‹¢|‹›|‹”|‹|‹†|‹|‹x|‹q|‹j|‹c|‹\|‹U|‹N|‹G|‹@|‹9|‹2|‹+|‹$|‹|‹|‹|‹|‹|‹ú{‹ó{‹ì{‹å{‹Þ{‹×{‹Ð{‹É{‹Â{‹»{‹´{‹­{‹¦{‹Ÿ{‹˜{‹‘{‹Š{‹ƒ{‹|{‹u{‹n{‹g{‹`{‹Y{‹R{‹K{‹D{‹={‹6{‹/{‹({‹!{‹{‹{‹ {‹{‹þz‹÷z‹ðz‹éz‹âz‹Ûz‹Ôz‹Íz‹Æz‹¿z‹¸z‹±z‹ªz‹£z‹œz‹•z‹Žz‹‡z‹€z‹yz‹rz‹kz‹dz‹]z‹Vz‹Oz‹Hz‹Az‹:z‹3z‹,z‹%z‹z‹z‹z‹ z‹z‹ûy‹ôy‹íy‹æy‹ßy‹Øy‹Ñy‹Êy‹Ãy‹¼y‹µy‹®y‹§y‹ y‹™y‹’y‹‹y‹„y‹}y‹vy‹oy‹hy‹ay‹Zy‹Sy‹Ly‹Ey‹>y‹7y‹0y‹)y‹"y‹y‹y‹ y‹y‹ÿx‹øx‹ñx‹êx‹ãx‹Üx‹Õx‹Îx‹Çx‹Àx‹¹x‹²x‹«x‹¤x‹x‹–x‹x‹ˆx‹x‹zx‹sx‹lx‹ex‹^x‹Wx‹Px‹Ix‹Bx‹;x‹4x‹-x‹&x‹x‹x‹x‹ x‹x‹üw‹õw‹îw‹çw‹àw‹Ùw‹Òw‹Ëw‹Äw‹½w‹¶w‹¯w‹¨w‹¡w‹šw‹“w‹Œw‹…w‹~w‹ww‹pw‹iw‹bw‹[w‹Tw‹Mw‹Fw‹?w‹8w‹1w‹*w‹#w‹w‹w‹w‹w‹w‹ùv‹òv‹ëv‹äv‹Ýv‹Öv‹Ïv‹Èv‹Áv‹ºv‹³v‹¬v‹¥v‹žv‹—v‹v‹‰v‹‚v‹{v‹tv‹mv‹fv‹_v‹Xv‹Qv‹Jv‹Cv‹r‹7r‹0r‹)r‹"r‹r‹r‹ r‹r‹ÿq‹øq‹ñq‹êq‹ãq‹Üq‹Õq‹Îq‹Çq‹Àq‹¹q‹²q‹«q‹¤q‹q‹–q‹q‹ˆq‹q‹zq‹sq‹lq‹eq‹^q‹Wq‹Pq‹Iq‹Bq‹;q‹4q‹-q‹&q‹q‹q‹q‹ q‹q‹üp‹õp‹îp‹çp‹àp‹Ùp‹Òp‹Ëp‹Äp‹½p‹¶p‹¯p‹¨p‹¡p‹šp‹“p‹Œp‹…p‹~p‹wp‹pp‹ip‹bp‹[p‹Tp‹Mp‹Fp‹?p‹8p‹1p‹*p‹#p‹p‹p‹p‹p‹p‹ùo‹òo‹ëo‹äo‹Ýo‹Öo‹Ïo‹Èo‹Áo‹ºo‹³o‹¬o‹¥o‹žo‹—o‹o‹‰o‹‚o‹{o‹to‹mo‹fo‹_o‹Xo‹Qo‹Jo‹Co‹k‹7k‹0k‹)k‹"k‹k‹k‹ k‹k‹ÿj‹øj‹ñj‹êj‹ãj‹Üj‹Õj‹Îj‹Çj‹Àj‹¹j‹²j‹«j‹¤j‹j‹–j‹j‹ˆj‹j‹zj‹sj‹lj‹ej‹^j‹Wj‹Pj‹Ij‹Bj‹;j‹4j‹-j‹&j‹j‹j‹j‹ j‹j‹üi‹õi‹îi‹çi‹ài‹Ùi‹Òi‹Ëi‹Äi‹½i‹¶i‹¯i‹¨i‹¡i‹ši‹“i‹Œi‹…i‹~i‹wi‹pi‹ii‹bi‹[i‹Ti‹Mi‹Fi‹?i‹8i‹1i‹*i‹#i‹i‹i‹i‹i‹i‹ùh‹òh‹ëh‹äh‹Ýh‹Öh‹Ïh‹Èh‹Áh‹ºh‹³h‹¬h‹¥h‹žh‹—h‹h‹‰h‹‚h‹{h‹th‹mh‹fh‹_h‹Xh‹Qh‹Jh‹Ch‹d‹7d‹0d‹)d‹"d‹d‹d‹ d‹d‹ÿc‹øc‹ñc‹êc‹ãc‹Üc‹Õc‹Îc‹Çc‹Àc‹¹c‹²c‹«c‹¤c‹c‹–c‹c‹ˆc‹c‹zc‹sc‹lc‹ec‹^c‹Wc‹Pc‹Ic‹Bc‹;c‹4c‹-c‹&c‹c‹c‹c‹ c‹c‹üb‹õb‹îb‹çb‹àb‹Ùb‹Òb‹Ëb‹Äb‹½b‹¶b‹¯b‹¨b‹¡b‹šb‹“b‹Œb‹…b‹~b‹wb‹pb‹ib‹bb‹[b‹Tb‹Mb‹Fb‹?b‹8b‹1b‹*b‹#b‹b‹b‹b‹b‹b‹ùa‹òa‹ëa‹äa‹Ýa‹Öa‹Ïa‹Èa‹Áa‹ºa‹³a‹¬a‹¥a‹ža‹—a‹a‹‰a‹‚a‹{a‹ta‹ma‹fa‹_a‹Xa‹Qa‹Ja‹Ca‹]‹7]‹0]‹)]‹"]‹]‹]‹ ]‹]‹ÿ\‹ø\‹ñ\‹ê\‹ã\‹Ü\‹Õ\‹Î\‹Ç\‹À\‹¹\‹²\‹«\‹¤\‹\‹–\‹\‹ˆ\‹\‹z\‹s\‹l\‹e\‹^\‹W\‹P\‹I\‹B\‹;\‹4\‹-\‹&\‹\‹\‹\‹ \‹\‹ü[‹õ[‹î[‹ç[‹à[‹Ù[‹Ò[‹Ë[‹Ä[‹½[‹¶[‹¯[‹¨[‹¡[‹š[‹“[‹Œ[‹…[‹~[‹w[‹p[‹i[‹b[‹[[‹T[‹M[‹F[‹?[‹8[‹1[‹*[‹#[‹[‹[‹[‹[‹[‹ùZ‹òZ‹ëZ‹äZ‹ÝZ‹ÖZ‹ÏZ‹ÈZ‹ÁZ‹ºZ‹³Z‹¬Z‹¥Z‹žZ‹—Z‹Z‹‰Z‹‚Z‹{Z‹tZ‹mZ‹fZ‹_Z‹XZ‹QZ‹JZ‹CZ‹V‹7V‹0V‹)V‹"V‹V‹V‹ V‹V‹ÿU‹øU‹ñU‹êU‹ãU‹ÜU‹ÕU‹ÎU‹ÇU‹ÀU‹¹U‹²U‹«U‹¤U‹U‹–U‹U‹ˆU‹U‹zU‹sU‹lU‹eU‹^U‹WU‹PU‹IU‹BU‹;U‹4U‹-U‹&U‹U‹U‹U‹ U‹U‹üT‹õT‹îT‹çT‹àT‹ÙT‹ÒT‹ËT‹ÄT‹½T‹¶T‹¯T‹¨T‹¡T‹šT‹“T‹ŒT‹…T‹~T‹wT‹pT‹iT‹bT‹[T‹TT‹MT‹FT‹?T‹8T‹1T‹*T‹#T‹T‹T‹T‹T‹T‹ùS‹òS‹ëS‹äS‹ÝS‹ÖS‹ÏS‹ÈS‹ÁS‹ºS‹³S‹¬S‹¥S‹žS‹—S‹S‹‰S‹‚S‹{S‹tS‹mS‹fS‹_S‹XS‹QS‹JS‹CS‹O‹7O‹0O‹)O‹"O‹O‹O‹ O‹O‹ÿN‹øN‹ñN‹êN‹ãN‹ÜN‹ÕN‹ÎN‹ÇN‹ÀN‹¹N‹²N‹«N‹¤N‹N‹–N‹N‹ˆN‹N‹zN‹sN‹lN‹eN‹^N‹WN‹PN‹IN‹BN‹;N‹4N‹-N‹&N‹N‹N‹N‹ N‹N‹üM‹õM‹îM‹çM‹àM‹ÙM‹ÒM‹ËM‹ÄM‹½M‹¶M‹¯M‹¨M‹¡M‹šM‹“M‹ŒM‹…M‹~M‹wM‹pM‹iM‹bM‹[M‹TM‹MM‹FM‹?M‹8M‹1M‹*M‹#M‹M‹M‹M‹M‹M‹ùL‹òL‹ëL‹äL‹ÝL‹ÖL‹ÏL‹ÈL‹ÁL‹ºL‹³L‹¬L‹¥L‹žL‹—L‹L‹‰L‹‚L‹{L‹tL‹mL‹fL‹_L‹XL‹QL‹JL‹CL‹H‹7H‹0H‹)H‹"H‹H‹H‹ H‹H‹ÿG‹øG‹ñG‹êG‹ãG‹ÜG‹ÕG‹ÎG‹ÇG‹ÀG‹¹G‹²G‹«G‹¤G‹G‹–G‹G‹ˆG‹G‹zG‹sG‹lG‹eG‹^G‹WG‹PG‹IG‹BG‹;G‹4G‹-G‹&G‹G‹G‹G‹ G‹G‹üF‹õF‹îF‹çF‹àF‹ÙF‹ÒF‹ËF‹ÄF‹½F‹¶F‹¯F‹¨F‹¡F‹šF‹“F‹ŒF‹…F‹~F‹wF‹pF‹iF‹bF‹[F‹TF‹MF‹FF‹?F‹8F‹1F‹*F‹#F‹F‹F‹F‹F‹F‹ùE‹òE‹ëE‹äE‹ÝE‹ÖE‹ÏE‹ÈE‹ÁE‹ºE‹³E‹¬E‹¥E‹žE‹—E‹E‹‰E‹‚E‹{E‹tE‹mE‹fE‹_E‹XE‹QE‹JE‹CE‹A‹7A‹0A‹)A‹"A‹A‹A‹ A‹A‹ÿ@‹ø@‹ñ@‹ê@‹ã@‹Ü@‹Õ@‹Î@‹Ç@‹À@‹¹@‹²@‹«@‹¤@‹@‹–@‹@‹ˆ@‹@‹z@‹s@‹l@‹e@‹^@‹W@‹P@‹I@‹B@‹;@‹4@‹-@‹&@‹@‹@‹@‹ @‹@‹ü?‹õ?‹î?‹ç?‹à?‹Ù?‹Ò?‹Ë?‹Ä?‹½?‹¶?‹¯?‹¨?‹¡?‹š?‹“?‹Œ?‹…?‹~?‹w?‹p?‹i?‹b?‹[?‹T?‹M?‹F?‹??‹8?‹1?‹*?‹#?‹?‹?‹?‹?‹?‹ù>‹ò>‹ë>‹ä>‹Ý>‹Ö>‹Ï>‹È>‹Á>‹º>‹³>‹¬>‹¥>‹ž>‹—>‹>‹‰>‹‚>‹{>‹t>‹m>‹f>‹_>‹X>‹Q>‹J>‹C>‹<>‹5>‹.>‹'>‹ >‹>‹>‹ >‹>‹ý=‹ö=‹ï=‹è=‹á=‹Ú=‹Ó=‹Ì=‹Å=‹¾=‹·=‹°=‹©=‹¢=‹›=‹”=‹=‹†=‹=‹x=‹q=‹j=‹c=‹\=‹U=‹N=‹G=‹@=‹9=‹2=‹+=‹$=‹=‹=‹=‹=‹=‹ú<‹ó<‹ì<‹å<‹Þ<‹×<‹Ð<‹É<‹Â<‹»<‹´<‹­<‹¦<‹Ÿ<‹˜<‹‘<‹Š<‹ƒ<‹|<‹u<‹n<‹g<‹`<‹Y<‹R<‹K<‹D<‹=<‹6<‹/<‹(<‹!<‹<‹<‹ <‹<‹þ;‹÷;‹ð;‹é;‹â;‹Û;‹Ô;‹Í;‹Æ;‹¿;‹¸;‹±;‹ª;‹£;‹œ;‹•;‹Ž;‹‡;‹€;‹y;‹r;‹k;‹d;‹];‹V;‹O;‹H;‹A;‹:;‹3;‹,;‹%;‹;‹;‹;‹ ;‹;‹û:‹ô:‹í:‹æ:‹ß:‹Ø:‹Ñ:‹Ê:‹Ã:‹¼:‹µ:‹®:‹§:‹ :‹™:‹’:‹‹:‹„:‹}:‹v:‹o:‹h:‹a:‹Z:‹S:‹L:‹E:‹>:‹7:‹0:‹):‹":‹:‹:‹ :‹:‹ÿ9‹ø9‹ñ9‹ê9‹ã9‹Ü9‹Õ9‹Î9‹Ç9‹À9‹¹9‹²9‹«9‹¤9‹9‹–9‹9‹ˆ9‹9‹z9‹s9‹l9‹e9‹^9‹W9‹P9‹I9‹B9‹;9‹49‹-9‹&9‹9‹9‹9‹ 9‹9‹ü8‹õ8‹î8‹ç8‹à8‹Ù8‹Ò8‹Ë8‹Ä8‹½8‹¶8‹¯8‹¨8‹¡8‹š8‹“8‹Œ8‹…8‹~8‹w8‹p8‹i8‹b8‹[8‹T8‹M8‹F8‹?8‹88‹18‹*8‹#8‹8‹8‹8‹8‹8‹ù7‹ò7‹ë7‹ä7‹Ý7‹Ö7‹Ï7‹È7‹Á7‹º7‹³7‹¬7‹¥7‹ž7‹—7‹7‹‰7‹‚7‹{7‹t7‹m7‹f7‹_7‹X7‹Q7‹J7‹C7‹<7‹57‹.7‹'7‹ 7‹7‹7‹ 7‹7‹ý6‹ö6‹ï6‹è6‹á6‹Ú6‹Ó6‹Ì6‹Å6‹¾6‹·6‹°6‹©6‹¢6‹›6‹”6‹6‹†6‹6‹x6‹q6‹j6‹c6‹\6‹U6‹N6‹G6‹@6‹96‹26‹+6‹$6‹6‹6‹6‹6‹6‹ú5‹ó5‹ì5‹å5‹Þ5‹×5‹Ð5‹É5‹Â5‹»5‹´5‹­5‹¦5‹Ÿ5‹˜5‹‘5‹Š5‹ƒ5‹|5‹u5‹n5‹g5‹`5‹Y5‹R5‹K5‹D5‹=5‹65‹/5‹(5‹!5‹5‹5‹ 5‹5‹þ4‹÷4‹ð4‹é4‹â4‹Û4‹Ô4‹Í4‹Æ4‹¿4‹¸4‹±4‹ª4‹£4‹œ4‹•4‹Ž4‹‡4‹€4‹y4‹r4‹k4‹d4‹]4‹V4‹O4‹H4‹A4‹:4‹34‹,4‹%4‹4‹4‹4‹ 4‹4‹û3‹ô3‹í3‹æ3‹ß3‹Ø3‹Ñ3‹Ê3‹Ã3‹¼3‹µ3‹®3‹§3‹ 3‹™3‹’3‹‹3‹„3‹}3‹v3‹o3‹h3‹a3‹Z3‹S3‹L3‹E3‹>3‹73‹03‹)3‹"3‹3‹3‹ 3‹3‹ÿ2‹ø2‹ñ2‹ê2‹ã2‹Ü2‹Õ2‹Î2‹Ç2‹À2‹¹2‹²2‹«2‹¤2‹2‹–2‹2‹ˆ2‹2‹z2‹s2‹l2‹e2‹^2‹W2‹P2‹I2‹B2‹;2‹42‹-2‹&2‹2‹2‹2‹ 2‹2‹ü1‹õ1‹î1‹ç1‹à1‹Ù1‹Ò1‹Ë1‹Ä1‹½1‹¶1‹¯1‹¨1‹¡1‹š1‹“1‹Œ1‹…1‹~1‹w1‹p1‹i1‹b1‹[1‹T1‹M1‹F1‹?1‹81‹11‹*1‹#1‹1‹1‹1‹1‹1‹ù0‹ò0‹ë0‹ä0‹Ý0‹Ö0‹Ï0‹È0‹Á0‹º0‹³0‹¬0‹¥0‹ž0‹—0‹0‹‰0‹‚0‹{0‹t0‹m0‹f0‹_0‹X0‹Q0‹J0‹C0‹<0‹50‹.0‹'0‹ 0‹0‹0‹ 0‹0‹ý/‹ö/‹ï/‹è/‹á/‹Ú/‹Ó/‹Ì/‹Å/‹¾/‹·/‹°/‹©/‹¢/‹›/‹”/‹/‹†/‹/‹x/‹q/‹j/‹c/‹\/‹U/‹N/‹G/‹@/‹9/‹2/‹+/‹$/‹/‹/‹/‹/‹/‹ú.‹ó.‹ì.‹å.‹Þ.‹×.‹Ð.‹É.‹Â.‹».‹´.‹­.‹¦.‹Ÿ.‹˜.‹‘.‹Š.‹ƒ.‹|.‹u.‹n.‹g.‹`.‹Y.‹R.‹K.‹D.‹=.‹6.‹/.‹(.‹!.‹.‹.‹ .‹.‹þ-‹÷-‹ð-‹é-‹â-‹Û-‹Ô-‹Í-‹Æ-‹¿-‹¸-‹±-‹ª-‹£-‹œ-‹•-‹Ž-‹‡-‹€-‹y-‹r-‹k-‹d-‹]-‹V-‹O-‹H-‹A-‹:-‹3-‹,-‹%-‹-‹-‹-‹ -‹-‹û,‹ô,‹í,‹æ,‹ß,‹Ø,‹Ñ,‹Ê,‹Ã,‹¼,‹µ,‹®,‹§,‹ ,‹™,‹’,‹‹,‹„,‹},‹v,‹o,‹h,‹a,‹Z,‹S,‹L,‹E,‹>,‹7,‹0,‹),‹",‹,‹,‹ ,‹,‹ÿ+‹ø+‹ñ+‹ê+‹ã+‹Ü+‹Õ+‹Î+‹Ç+‹À+‹¹+‹²+‹«+‹¤+‹+‹–+‹+‹ˆ+‹+‹z+‹s+‹l+‹e+‹^+‹W+‹P+‹I+‹B+‹;+‹4+‹-+‹&+‹+‹+‹+‹ +‹+‹ü*‹õ*‹î*‹ç*‹à*‹Ù*‹Ò*‹Ë*‹Ä*‹½*‹¶*‹¯*‹¨*‹¡*‹š*‹“*‹Œ*‹…*‹~*‹w*‹p*‹i*‹b*‹[*‹T*‹M*‹F*‹?*‹8*‹1*‹**‹#*‹*‹*‹*‹*‹*‹ù)‹ò)‹ë)‹ä)‹Ý)‹Ö)‹Ï)‹È)‹Á)‹º)‹³)‹¬)‹¥)‹ž)‹—)‹)‹‰)‹‚)‹{)‹t)‹m)‹f)‹_)‹X)‹Q)‹J)‹C)‹<)‹5)‹.)‹')‹ )‹)‹)‹ )‹)‹ý(‹ö(‹ï(‹è(‹á(‹Ú(‹Ó(‹Ì(‹Å(‹¾(‹·(‹°(‹©(‹¢(‹›(‹”(‹(‹†(‹(‹x(‹q(‹j(‹c(‹\(‹U(‹N(‹G(‹@(‹9(‹2(‹+(‹$(‹(‹(‹(‹(‹(‹ú'‹ó'‹ì'‹å'‹Þ'‹×'‹Ð'‹É'‹Â'‹»'‹´'‹­'‹¦'‹Ÿ'‹˜'‹‘'‹Š'‹ƒ'‹|'‹u'‹n'‹g'‹`'‹Y'‹R'‹K'‹D'‹='‹6'‹/'‹('‹!'‹'‹'‹ '‹'‹þ&‹÷&‹ð&‹é&‹â&‹Û&‹Ô&‹Í&‹Æ&‹¿&‹¸&‹±&‹ª&‹£&‹œ&‹•&‹Ž&‹‡&‹€&‹y&‹r&‹k&‹d&‹]&‹V&‹O&‹H&‹A&‹:&‹3&‹,&‹%&‹&‹&‹&‹ &‹&‹û%‹ô%‹í%‹æ%‹ß%‹Ø%‹Ñ%‹Ê%‹Ã%‹¼%‹µ%‹®%‹§%‹ %‹™%‹’%‹‹%‹„%‹}%‹v%‹o%‹h%‹a%‹Z%‹S%‹L%‹E%‹>%‹7%‹0%‹)%‹"%‹%‹%‹ %‹%‹ÿ$‹ø$‹ñ$‹ê$‹ã$‹Ü$‹Õ$‹Î$‹Ç$‹À$‹¹$‹²$‹«$‹¤$‹$‹–$‹$‹ˆ$‹$‹z$‹s$‹l$‹e$‹^$‹W$‹P$‹I$‹B$‹;$‹4$‹-$‹&$‹$‹$‹$‹ $‹$‹ü#‹õ#‹î#‹ç#‹à#‹Ù#‹Ò#‹Ë#‹Ä#‹½#‹¶#‹¯#‹¨#‹¡#‹š#‹“#‹Œ#‹…#‹~#‹w#‹p#‹i#‹b#‹[#‹T#‹M#‹F#‹?#‹8#‹1#‹*#‹##‹#‹#‹#‹#‹#‹ù"‹ò"‹ë"‹ä"‹Ý"‹Ö"‹Ï"‹È"‹Á"‹º"‹³"‹¬"‹¥"‹ž"‹—"‹"‹‰"‹‚"‹{"‹t"‹m"‹f"‹_"‹X"‹Q"‹J"‹C"‹<"‹5"‹."‹'"‹ "‹"‹"‹ "‹"‹ý!‹ö!‹ï!‹è!‹á!‹Ú!‹Ó!‹Ì!‹Å!‹¾!‹·!‹°!‹©!‹¢!‹›!‹”!‹!‹†!‹!‹x!‹q!‹j!‹c!‹\!‹U!‹N!‹G!‹@!‹9!‹2!‹+!‹$!‹!‹!‹!‹!‹!‹ú ‹ó ‹ì ‹å ‹Þ ‹× ‹Ð ‹É ‹ ‹» ‹´ ‹­ ‹¦ ‹Ÿ ‹˜ ‹‘ ‹Š ‹ƒ ‹| ‹u ‹n ‹g ‹` ‹Y ‹R ‹K ‹D ‹= ‹6 ‹/ ‹( ‹! ‹ ‹ ‹ ‹ ‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹û‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ã‹¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹ú‹ó‹ì‹å‹Þ‹×‹Ð‹É‹Â‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹û‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ã‹¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹ú‹ó‹ì‹å‹Þ‹×‹Ð‹É‹Â‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹û‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ã‹¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ù ‹ò ‹ë ‹ä ‹Ý ‹Ö ‹Ï ‹È ‹Á ‹º ‹³ ‹¬ ‹¥ ‹ž ‹— ‹ ‹‰ ‹‚ ‹{ ‹t ‹m ‹f ‹_ ‹X ‹Q ‹J ‹C ‹< ‹5 ‹. ‹' ‹ ‹ ‹ ‹ ‹ ‹ý ‹ö ‹ï ‹è ‹á ‹Ú ‹Ó ‹Ì ‹Å ‹¾ ‹· ‹° ‹© ‹¢ ‹› ‹” ‹ ‹† ‹ ‹x ‹q ‹j ‹c ‹\ ‹U ‹N ‹G ‹@ ‹9 ‹2 ‹+ ‹$ ‹ ‹ ‹ ‹ ‹ ‹ú ‹ó ‹ì ‹å ‹Þ ‹× ‹Ð ‹É ‹ ‹» ‹´ ‹­ ‹¦ ‹Ÿ ‹˜ ‹‘ ‹Š ‹ƒ ‹| ‹u ‹n ‹g ‹` ‹Y ‹R ‹K ‹D ‹= ‹6 ‹/ ‹( ‹! ‹ ‹ ‹ ‹ ‹þ ‹÷ ‹ð ‹é ‹â ‹Û ‹Ô ‹Í ‹Æ ‹¿ ‹¸ ‹± ‹ª ‹£ ‹œ ‹• ‹Ž ‹‡ ‹€ ‹y ‹r ‹k ‹d ‹] ‹V ‹O ‹H ‹A ‹: ‹3 ‹, ‹% ‹ ‹ ‹ ‹ ‹ ‹û ‹ô ‹í ‹æ ‹ß ‹Ø ‹Ñ ‹Ê ‹à ‹¼ ‹µ ‹® ‹§ ‹  ‹™ ‹’ ‹‹ ‹„ ‹} ‹v ‹o ‹h ‹a ‹Z ‹S ‹L ‹E ‹> ‹7 ‹0 ‹) ‹" ‹ ‹ ‹ ‹ ‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹ú‹ó‹ì‹å‹Þ‹×‹Ð‹É‹Â‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹û‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ã‹¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹Î‹Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹ü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùÿŠòÿŠëÿŠäÿŠÝÿŠÖÿŠÏÿŠÈÿŠÁÿŠºÿгÿЬÿŠ¥ÿŠžÿŠ—ÿŠÿЉÿŠ‚ÿŠ{ÿŠtÿŠmÿŠfÿŠ_ÿŠXÿŠQÿŠJÿŠCÿŠ<ÿŠ5ÿŠ.ÿŠ'ÿŠ ÿŠÿŠÿŠ ÿŠÿŠýþŠöþŠïþŠèþŠáþŠÚþŠÓþŠÌþŠÅþоþŠ·þаþŠ©þŠ¢þŠ›þŠ”þŠþІþŠþŠxþŠqþŠjþŠcþŠ\þŠUþŠNþŠGþŠ@þŠ9þŠ2þŠ+þŠ$þŠþŠþŠþŠþŠþŠúýŠóýŠìýŠåýŠÞýŠ×ýŠÐýŠÉýŠÂýŠ»ýŠ´ýŠ­ýЦýŠŸýŠ˜ýŠ‘ýŠŠýŠƒýŠ|ýŠuýŠnýŠgýŠ`ýŠYýŠRýŠKýŠDýŠ=ýŠ6ýŠ/ýŠ(ýŠ!ýŠýŠýŠ ýŠýŠþüŠ÷üŠðüŠéüŠâüŠÛüŠÔüŠÍüŠÆüŠ¿üЏüбüŠªüŠ£üŠœüŠ•üŠŽüЇüŠ€üŠyüŠrüŠküŠdüŠ]üŠVüŠOüŠHüŠAüŠ:üŠ3üŠ,üŠ%üŠüŠüŠüŠ üŠüŠûûŠôûŠíûŠæûŠßûŠØûŠÑûŠÊûŠÃûмûеûŠ®ûЧûŠ ûŠ™ûŠ’ûŠ‹ûŠ„ûŠ}ûŠvûŠoûŠhûŠaûŠZûŠSûŠLûŠEûŠ>ûŠ7ûŠ0ûŠ)ûŠ"ûŠûŠûŠ ûŠûŠÿúŠøúŠñúŠêúŠãúŠÜúŠÕúŠÎúŠÇúŠÀúйúвúŠ«úФúŠúŠ–úŠúŠˆúŠúŠzúŠsúŠlúŠeúŠ^úŠWúŠPúŠIúŠBúŠ;úŠ4úŠ-úŠ&úŠúŠúŠúŠ úŠúŠüùŠõùŠîùŠçùŠàùŠÙùŠÒùŠËùŠÄùнùжùНùЍùŠ¡ùŠšùŠ“ùŠŒùŠ…ùŠ~ùŠwùŠpùŠiùŠbùŠ[ùŠTùŠMùŠFùŠ?ùŠ8ùŠ1ùŠ*ùŠ#ùŠùŠùŠùŠùŠùŠùøŠòøŠëøŠäøŠÝøŠÖøŠÏøŠÈøŠÁøŠºøŠ³øŠ¬øŠ¥øŠžøŠ—øŠøŠ‰øŠ‚øŠ{øŠtøŠmøŠføŠ_øŠXøŠQøŠJøŠCøŠ<øŠ5øŠ.øŠ'øŠ øŠøŠøŠ øŠøŠý÷Šö÷Šï÷Šè÷Šá÷ŠÚ÷ŠÓ÷ŠÌ÷ŠÅ÷о÷Š·÷а÷Š©÷Š¢÷Š›÷Š”÷Š÷І÷Š÷Šx÷Šq÷Šj÷Šc÷Š\÷ŠU÷ŠN÷ŠG÷Š@÷Š9÷Š2÷Š+÷Š$÷Š÷Š÷Š÷Š÷Š÷ŠúöŠóöŠìöŠåöŠÞöŠ×öŠÐöŠÉöŠÂöŠ»öŠ´öŠ­öЦöŠŸöŠ˜öŠ‘öŠŠöŠƒöŠ|öŠuöŠnöŠgöŠ`öŠYöŠRöŠKöŠDöŠ=öŠ6öŠ/öŠ(öŠ!öŠöŠöŠ öŠöŠþõŠ÷õŠðõŠéõŠâõŠÛõŠÔõŠÍõŠÆõŠ¿õЏõбõŠªõŠ£õŠœõŠ•õŠŽõЇõŠ€õŠyõŠrõŠkõŠdõŠ]õŠVõŠOõŠHõŠAõŠ:õŠ3õŠ,õŠ%õŠõŠõŠõŠ õŠõŠûôŠôôŠíôŠæôŠßôŠØôŠÑôŠÊôŠÃôмôеôŠ®ôЧôŠ ôŠ™ôŠ’ôŠ‹ôŠ„ôŠ}ôŠvôŠoôŠhôŠaôŠZôŠSôŠLôŠEôŠ>ôŠ7ôŠ0ôŠ)ôŠ"ôŠôŠôŠ ôŠôŠÿóŠøóŠñóŠêóŠãóŠÜóŠÕóŠÎóŠÇóŠÀóйóвóŠ«óФóŠóŠ–óŠóŠˆóŠóŠzóŠsóŠlóŠeóŠ^óŠWóŠPóŠIóŠBóŠ;óŠ4óŠ-óŠ&óŠóŠóŠóŠ óŠóŠüòŠõòŠîòŠçòŠàòŠÙòŠÒòŠËòŠÄòнòжòНòЍòŠ¡òŠšòŠ“òŠŒòŠ…òŠ~òŠwòŠpòŠiòŠbòŠ[òŠTòŠMòŠFòŠ?òŠ8òŠ1òŠ*òŠ#òŠòŠòŠòŠòŠòŠùñŠòñŠëñŠäñŠÝñŠÖñŠÏñŠÈñŠÁñŠºñгñЬñŠ¥ñŠžñŠ—ñŠñЉñŠ‚ñŠ{ñŠtñŠmñŠfñŠ_ñŠXñŠQñŠJñŠCñŠ<ñŠ5ñŠ.ñŠ'ñŠ ñŠñŠñŠ ñŠñŠýðŠöðŠïðŠèðŠáðŠÚðŠÓðŠÌðŠÅðоðŠ·ðаðŠ©ðŠ¢ðŠ›ðŠ”ðŠðІðŠðŠxðŠqðŠjðŠcðŠ\ðŠUðŠNðŠGðŠ@ðŠ9ðŠ2ðŠ+ðŠ$ðŠðŠðŠðŠðŠðŠúïŠóïŠìïŠåïŠÞïŠ×ïŠÐïŠÉïŠÂïŠ|ïŠuïŠnïŠgïŠ`ïŠYïŠRïŠKïŠDïŠ=ïŠ6ïŠ/ïŠ(ïŠ!ïŠïŠïŠ ïŠïŠþîŠ÷îŠðîŠéîŠâîŠÛîŠÔîŠÍîŠÆîŠ¿îŠ¸îŠ±îŠªîŠ£îŠœîŠ•îŠŽîŠ‡îŠ€îŠyîŠrîŠkîŠdîŠ]îŠVîŠOîŠHîŠAîŠ:îŠ3îŠ,îŠ%îŠîŠîŠîŠ îŠîŠûíŠôíŠííŠæíŠßíŠØíŠÑíŠÊíŠÃ튼튵튮튧튠튙튒튋튄íŠ}íŠvíŠoíŠhíŠaíŠZíŠSíŠLíŠEíŠ>íŠ7íŠ0íŠ)íŠ"íŠíŠíŠ íŠíŠÿìŠøìŠñìŠêìŠãìŠÜìŠÕìŠÎìŠÇìŠÀ승슲슫스ìŠìŠ–ìŠìŠˆìŠìŠzìŠsìŠlìŠeìŠ^ìŠWìŠPìŠIìŠBìŠ;ìŠ4ìŠ-ìŠ&ìŠìŠìŠìŠ ìŠìŠüëŠõëŠîëŠçëŠàëŠÙëŠÒëŠËëŠÄ늽늶늯늨늡늚늓늌늅ëŠ~ëŠwëŠpëŠiëŠbëŠ[ëŠTëŠMëŠFëŠ?ëŠ8ëŠ1ëŠ*ëŠ#ëŠëŠëŠëŠëŠëŠùêŠòêŠëêŠäêŠÝêŠÖêŠÏêŠÈêŠÁꊺꊳꊬꊥꊞꊗêŠêŠ‰êŠ‚êŠ{êŠtêŠmêŠfêŠ_êŠXêŠQêŠJêŠCêŠ<êŠ5êŠ.êŠ'êŠ êŠêŠêŠ êŠêŠýéŠöéŠïéŠèéŠáéŠÚéŠÓéŠÌéŠÅ銾銷銰銩銢銛銔éŠéІéŠéŠxéŠqéŠjéŠcéŠ\éŠUéŠNéŠGéŠ@éŠ9éŠ2éŠ+éŠ$éŠéŠéŠéŠéŠéŠúèŠóèŠìèŠåèŠÞèŠ×èŠÐèŠÉèŠÂ芻芴芭芦芟芘芑芊芃èŠ|èŠuèŠnèŠgèŠ`èŠYèŠRèŠKèŠDèŠ=èŠ6èŠ/èŠ(èŠ!èŠèŠèŠ èŠèŠþçŠ÷çŠðçŠéçŠâçŠÛçŠÔçŠÍçŠÆçŠ¿çŠ¸çŠ±çŠªçŠ£çŠœçŠ•çŠŽçŠ‡çŠ€çŠyçŠrçŠkçŠdçŠ]çŠVçŠOçŠHçŠAçŠ:çŠ3çŠ,çŠ%çŠçŠçŠçŠ çŠçŠûæŠôæŠíæŠææŠßæŠØæŠÑæŠÊæŠÃ押抵抮抧抠抙抒抋抄æŠ}æŠvæŠoæŠhæŠaæŠZæŠSæŠLæŠEæŠ>æŠ7æŠ0æŠ)æŠ"æŠæŠæŠ æŠæŠÿåŠøåŠñåŠêåŠãåŠÜåŠÕåŠÎåŠÇåŠÀ効劲劫劤åŠåŠ–åŠåŠˆåŠåŠzåŠsåŠlåŠeåŠ^åŠWåŠPåŠIåŠBåŠ;åŠ4åŠ-åŠ&åŠåŠåŠåŠ åŠåŠüäŠõäŠîäŠçäŠàäŠÙäŠÒäŠËäŠÄ䊽䊶䊯䊨䊡䊚䊓䊌䊅äŠ~äŠwäŠpäŠiäŠbäŠ[äŠTäŠMäŠFäŠ?äŠ8äŠ1äŠ*äŠ#äŠäŠäŠäŠäŠäŠùãŠòãŠëãŠäãŠÝãŠÖãŠÏãŠÈãŠÁ㊺㊳㊬㊥㊞㊗ãŠãŠ‰ãŠ‚ãŠ{ãŠtãŠmãŠfãŠ_ãŠXãŠQãŠJãŠCãŠ<ãŠ5ãŠ.ãŠ'㊠ãŠãŠãŠ ãŠãŠýâŠöâŠïâŠèâŠáâŠÚâŠÓâŠÌâŠÅ⊾⊷⊰⊩⊢⊛⊔âŠâІâŠâŠxâŠqâŠjâŠcâŠ\âŠUâŠNâŠGâŠ@âŠ9âŠ2âŠ+âŠ$âŠâŠâŠâŠâŠâŠúáŠóáŠìáŠåáŠÞáŠ×áŠÐáŠÉáŠÂኻኴክኦኟኘኑኊኃáŠ|áŠuáŠnáŠgáŠ`áŠYáŠRáŠKáŠDáŠ=áŠ6áŠ/áŠ(áŠ!áŠáŠáŠ áŠáŠþàŠ÷àŠðàŠéàŠâàŠÛàŠÔàŠÍàŠÆàŠ¿àŠ¸àŠ±àŠªàŠ£àŠœàŠ•àŠŽàŠ‡àŠ€àŠyàŠràŠkàŠdàŠ]àŠVàŠOàŠHàŠAàŠ:àŠ3àŠ,àŠ%àŠàŠàŠàŠ àŠàŠûߊôߊíߊæßŠßߊØßŠÑߊÊߊÃߊ¼ßŠµßŠ®ßŠ§ßŠ ßŠ™ßŠ’ߊ‹ßŠ„ߊ}ߊvߊoߊhߊaߊZߊSߊLߊEߊ>ߊ7ߊ0ߊ)ߊ"ߊߊߊ ߊߊÿÞŠøÞŠñÞŠêÞŠãÞŠÜÞŠÕÞŠÎÞŠÇÞŠÀÞŠ¹ÞŠ²ÞŠ«ÞŠ¤ÞŠÞŠ–ÞŠÞŠˆÞŠÞŠzÞŠsÞŠlÞŠeÞŠ^ÞŠWÞŠPÞŠIÞŠBÞŠ;ÞŠ4ÞŠ-ÞŠ&ÞŠÞŠÞŠÞŠ ÞŠÞŠüÝŠõÝŠîÝŠçÝŠàÝŠÙÝŠÒÝŠËÝŠÄÝŠ½ÝŠ¶ÝŠ¯ÝŠ¨ÝŠ¡ÝŠšÝŠ“ÝŠŒÝŠ…ÝŠ~ÝŠwÝŠpÝŠiÝŠbÝŠ[ÝŠTÝŠMÝŠFÝŠ?ÝŠ8ÝŠ1ÝŠ*ÝŠ#ÝŠÝŠÝŠÝŠÝŠÝŠùÜŠòÜŠëÜŠäÜŠÝÜŠÖÜŠÏÜŠÈÜŠÁÜŠºÜŠ³ÜŠ¬ÜŠ¥ÜŠžÜŠ—ÜŠÜŠ‰ÜŠ‚ÜŠ{ÜŠtÜŠmÜŠfÜŠ_ÜŠXÜŠQÜŠJÜŠCÜŠ<ÜŠ5ÜŠ.ÜŠ'ÜŠ ÜŠÜŠÜŠ ÜŠÜŠýÛŠöÛŠïÛŠèÛŠáÛŠÚÛŠÓÛŠÌÛŠÅÛŠ¾ÛŠ·ÛŠ°ÛŠ©ÛŠ¢ÛŠ›ÛŠ”ÛŠÛŠ†ÛŠÛŠxÛŠqÛŠjÛŠcÛŠ\ÛŠUÛŠNÛŠGÛŠ@ÛŠ9ÛŠ2ÛŠ+ÛŠ$ÛŠÛŠÛŠÛŠÛŠÛŠúÚŠóÚŠìÚŠåÚŠÞÚŠ×ÚŠÐÚŠÉÚŠÂÚŠ»ÚŠ´ÚŠ­ÚŠ¦ÚŠŸÚŠ˜ÚŠ‘ÚŠŠÚŠƒÚŠ|ÚŠuÚŠnÚŠgÚŠ`ÚŠYÚŠRÚŠKÚŠDÚŠ=ÚŠ6ÚŠ/ÚŠ(ÚŠ!ÚŠÚŠÚŠ ÚŠÚŠþÙŠ÷ÙŠðÙŠéÙŠâÙŠÛÙŠÔÙŠÍÙŠÆÙŠ¿ÙŠ¸ÙŠ±ÙŠªÙŠ£ÙŠœÙŠ•ÙŠŽÙŠ‡ÙŠ€ÙŠyÙŠrÙŠkÙŠdÙŠ]ÙŠVÙŠOÙŠHÙŠAÙŠ:ÙŠ3ÙŠ,ÙŠ%يييي ييûØŠôØŠíØŠæØŠߨŠØØŠÑØŠÊØŠÃØŠ¼ØŠµØŠ®ØŠ§ØŠ ØŠ™ØŠ’ØŠ‹ØŠ„ØŠ}ØŠvØŠoØŠhØŠaØŠZØŠSØŠLØŠEØŠ>ØŠ7ØŠ0ØŠ)ØŠ"؊؊؊ ؊؊ÿ׊ø×Šñ׊ê׊ã׊Ü׊Õ׊Î׊Ç׊À׊¹×Š²×Š«×Š¤×Š׊–׊׊ˆ×Š׊z׊s׊l׊e׊^׊W׊P׊I׊B׊;׊4׊-׊&׊׊׊׊ ׊׊üÖŠõÖŠîÖŠçÖŠàÖŠÙÖŠÒÖŠËÖŠÄÖŠ½ÖŠ¶ÖŠ¯ÖŠ¨ÖŠ¡ÖŠšÖŠ“ÖŠŒÖŠ…ÖŠ~ÖŠwÖŠpÖŠiÖŠbÖŠ[ÖŠTÖŠMÖŠFÖŠ?ÖŠ8ÖŠ1ÖŠ*ÖŠ#ÖŠÖŠÖŠÖŠÖŠÖŠùÕŠòÕŠëÕŠäÕŠÝÕŠÖÕŠÏÕŠÈÕŠÁÕŠºÕŠ³ÕŠ¬ÕŠ¥ÕŠžÕŠ—ÕŠÕŠ‰ÕŠ‚ÕŠ{ÕŠtÕŠmÕŠfÕŠ_ÕŠXÕŠQÕŠJÕŠCÕŠ<ÕŠ5ÕŠ.ÕŠ'ÕŠ ÕŠÕŠÕŠ ÕŠÕŠýÔŠöÔŠïÔŠèÔŠáÔŠÚÔŠÓÔŠÌÔŠÅÔŠ¾ÔŠ·ÔŠ°ÔŠ©ÔŠ¢ÔŠ›ÔŠ”ÔŠÔŠ†ÔŠÔŠxÔŠqÔŠjÔŠcÔŠ\ÔŠUÔŠNÔŠGÔŠ@ÔŠ9ÔŠ2ÔŠ+ÔŠ$ÔŠÔŠÔŠÔŠÔŠÔŠúÓŠóÓŠìÓŠåÓŠÞÓŠ×ÓŠÐÓŠÉÓŠÂÓŠ»ÓŠ´ÓŠ­ÓŠ¦ÓŠŸÓŠ˜ÓŠ‘ÓŠŠÓŠƒÓŠ|ÓŠuÓŠnÓŠgÓŠ`ÓŠYÓŠRÓŠKÓŠDÓŠ=ÓŠ6ÓŠ/ÓŠ(ÓŠ!ÓŠÓŠÓŠ ÓŠÓŠþÒŠ÷ÒŠðÒŠéÒŠâÒŠÛÒŠÔÒŠÍÒŠÆÒŠ¿ÒŠ¸ÒŠ±ÒŠªÒŠ£ÒŠœÒŠ•ÒŠŽÒŠ‡ÒŠ€ÒŠyÒŠrÒŠkÒŠdÒŠ]ÒŠVÒŠOÒŠHÒŠAÒŠ:ÒŠ3ÒŠ,ÒŠ%ÒŠÒŠÒŠÒŠ ÒŠÒŠûÑŠôÑŠíÑŠæÑŠßÑŠØÑŠÑÑŠÊÑŠÃÑŠ¼ÑŠµÑŠ®ÑŠ§ÑŠ ÑŠ™ÑŠ’ÑŠ‹ÑŠ„ÑŠ}ÑŠvÑŠoÑŠhÑŠaÑŠZÑŠSÑŠLÑŠEÑŠ>ÑŠ7ÑŠ0ÑŠ)ÑŠ"ÑŠÑŠÑŠ ÑŠÑŠÿЊøÐŠñЊêЊãЊÜЊÕЊÎЊÇЊÀЊ¹ÐŠ²ÐŠ«ÐŠ¤ÐŠЊ–ЊЊˆÐŠЊzЊsЊlЊeЊ^ЊWЊPЊIЊBЊ;Њ4Њ-Њ&ЊЊЊЊ ЊЊüÏŠõÏŠîÏŠçÏŠàÏŠÙÏŠÒÏŠËÏŠÄÏŠ½ÏŠ¶ÏŠ¯ÏŠ¨ÏŠ¡ÏŠšÏŠ“ÏŠŒÏŠ…ÏŠ~ÏŠwÏŠpÏŠiÏŠbÏŠ[ÏŠTÏŠMÏŠFÏŠ?ÏŠ8ÏŠ1ÏŠ*ÏŠ#ÏŠÏŠÏŠÏŠÏŠÏŠùΊòΊëΊäΊÝΊÖΊÏΊÈΊÁΊºÎŠ³ÎŠ¬ÎŠ¥ÎŠžÎŠ—ΊΊ‰ÎŠ‚Ί{ΊtΊmΊfΊ_ΊXΊQΊJΊCΊ<Ί5Ί.Ί'Ί ΊΊΊ ΊΊýÍŠöÍŠïÍŠèÍŠáÍŠÚÍŠÓÍŠÌÍŠÅÍŠ¾ÍŠ·ÍŠ°ÍŠ©ÍŠ¢ÍŠ›ÍŠ”ÍŠÍŠ†ÍŠÍŠxÍŠqÍŠjÍŠcÍŠ\ÍŠUÍŠNÍŠGÍŠ@ÍŠ9ÍŠ2ÍŠ+ÍŠ$ÍŠÍŠÍŠÍŠÍŠÍŠúÌŠóÌŠìÌŠåÌŠÞÌŠ×ÌŠÐÌŠÉÌŠÂÌŠ»ÌŠ´ÌŠ­ÌŠ¦ÌŠŸÌŠ˜ÌŠ‘ÌŠŠÌŠƒÌŠ|ÌŠuÌŠnÌŠgÌŠ`ÌŠYÌŠRÌŠKÌŠDÌŠ=ÌŠ6ÌŠ/ÌŠ(ÌŠ!ÌŠÌŠÌŠ ÌŠÌŠþËŠ÷ËŠðËŠéËŠâËŠÛËŠÔËŠÍËŠÆËŠ¿ËŠ¸ËŠ±ËŠªËŠ£ËŠœËŠ•ËŠŽËŠ‡ËŠ€ËŠyËŠrËŠkËŠdËŠ]ËŠVËŠOËŠHËŠAËŠ:ËŠ3ËŠ,ËŠ%ËŠËŠËŠËŠ ËŠËŠûÊŠôÊŠíÊŠæÊŠßÊŠØÊŠÑÊŠÊÊŠÃÊŠ¼ÊŠµÊŠ®ÊŠ§ÊŠ ÊŠ™ÊŠ’ÊŠ‹ÊŠ„ÊŠ}ÊŠvÊŠoÊŠhÊŠaÊŠZÊŠSÊŠLÊŠEÊŠ>ÊŠ7ÊŠ0ÊŠ)ÊŠ"ÊŠÊŠÊŠ ÊŠÊŠÿÉŠøÉŠñÉŠêÉŠãÉŠÜÉŠÕÉŠÎÉŠÇÉŠÀÉŠ¹ÉŠ²ÉŠ«ÉŠ¤ÉŠÉŠ–ÉŠÉŠˆÉŠÉŠzÉŠsÉŠlÉŠeÉŠ^ÉŠWÉŠPÉŠIÉŠBÉŠ;ÉŠ4ÉŠ-ÉŠ&ÉŠÉŠÉŠÉŠ ÉŠÉŠüÈŠõÈŠîÈŠçÈŠàÈŠÙÈŠÒÈŠËÈŠÄÈŠ½ÈŠ¶ÈŠ¯ÈŠ¨ÈŠ¡ÈŠšÈŠ“ÈŠŒÈŠ…ÈŠ~ÈŠwÈŠpÈŠiÈŠbÈŠ[ÈŠTÈŠMÈŠFÈŠ?ÈŠ8ÈŠ1ÈŠ*ÈŠ#ÈŠÈŠÈŠÈŠÈŠÈŠùÇŠòÇŠëÇŠäÇŠÝÇŠÖÇŠÏÇŠÈÇŠÁÇŠºÇŠ³ÇŠ¬ÇŠ¥ÇŠžÇŠ—ÇŠÇŠ‰ÇŠ‚ÇŠ{ÇŠtÇŠmÇŠfÇŠ_ÇŠXÇŠQÇŠJÇŠCÇŠ<ÇŠ5ÇŠ.ÇŠ'ÇŠ ÇŠÇŠÇŠ ÇŠÇŠýÆŠöÆŠïÆŠèÆŠáÆŠÚÆŠÓÆŠÌÆŠÅÆŠ¾ÆŠ·ÆŠ°ÆŠ©ÆŠ¢ÆŠ›ÆŠ”ÆŠÆŠ†ÆŠÆŠxÆŠqÆŠjÆŠcÆŠ\ÆŠUÆŠNÆŠGÆŠ@ÆŠ9ÆŠ2ÆŠ+ÆŠ$ÆŠÆŠÆŠÆŠÆŠÆŠúÅŠóÅŠìÅŠåÅŠÞÅŠ×ÅŠÐÅŠÉÅŠÂÅŠ»ÅŠ´ÅŠ­ÅŠ¦ÅŠŸÅŠ˜ÅŠ‘ÅŠŠÅŠƒÅŠ|ÅŠuÅŠnÅŠgÅŠ`ÅŠYÅŠRÅŠKÅŠDÅŠ=ÅŠ6ÅŠ/ÅŠ(ÅŠ!ÅŠÅŠÅŠ ÅŠÅŠþÄŠ÷ÄŠðÄŠéÄŠâÄŠÛÄŠÔÄŠÍÄŠÆÄŠ¿ÄŠ¸ÄŠ±ÄŠªÄŠ£ÄŠœÄŠ•ÄŠŽÄŠ‡ÄŠ€ÄŠyÄŠrÄŠkÄŠdÄŠ]ÄŠVÄŠOÄŠHÄŠAÄŠ:ÄŠ3ÄŠ,ÄŠ%ÄŠÄŠÄŠÄŠ ÄŠÄŠûÊôÊíÊæÃŠßÊØÃŠÑÊÊÊÃʼʵʮʧʠʙÊ’ʋÊ„Ê}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿŠøÂŠñŠêŠãŠÜŠÕŠΊÇŠÀŠ¹ÂŠ²ÂŠ«ÂŠ¤ÂŠŠ–ŠŠˆÂŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠüÁŠõÁŠîÁŠçÁŠàÁŠÙÁŠÒÁŠËÁŠÄÁнÁжÁНÁЍÁŠ¡ÁŠšÁŠ“ÁŠŒÁŠ…ÁŠ~ÁŠwÁŠpÁŠiÁŠbÁŠ[ÁŠTÁŠMÁŠFÁŠ?ÁŠ8ÁŠ1ÁŠ*ÁŠ#ÁŠÁŠÁŠÁŠÁŠÁŠùÀŠòÀŠëÀŠäÀŠÝÀŠÖÀŠÏÀŠÈÀŠÁÀŠºÀгÀЬÀŠ¥ÀŠžÀŠ—ÀŠÀЉÀŠ‚ÀŠ{ÀŠtÀŠmÀŠfÀŠ_ÀŠXÀŠQÀŠJÀŠCÀŠ<ÀŠ5ÀŠ.ÀŠ'ÀŠ ÀŠÀŠÀŠ ÀŠÀŠý¿Šö¿Šᅧ迊ῊÚ¿ŠÓ¿ŠÌ¿ŠÅ¿Š¾¿Š·¿Š°¿Š©¿Š¢¿Š›¿Š”¿Š¿Š†¿Š¿Šx¿Šq¿Šj¿Šc¿Š\¿ŠU¿ŠN¿ŠG¿Š@¿Š9¿Š2¿Š+¿Š$¿Š¿Š¿Š¿Š¿Š¿Šú¾Šó¾Š쾊徊Þ¾Š×¾ŠоŠɾол¾Š´¾Š­¾Š¦¾ŠŸ¾Š˜¾Š‘¾ŠоŠƒ¾Š|¾Šu¾Šn¾Šg¾Š`¾ŠY¾ŠR¾ŠK¾ŠD¾Š=¾Š6¾Š/¾Š(¾Š!¾Š¾Š¾Š ¾Š¾Šþ½Š÷½Šð½Š齊⽊Û½ŠÔ½ŠͽŠƽŠ¿½Š¸½Š±½Šª½Š£½Šœ½Š•½Š޽Ї½Š€½Šy½Šr½Šk½Šd½Š]½ŠV½ŠO½ŠH½ŠA½Š:½Š3½Š,½Š%½Š½Š½Š½Š ½Š½Šû¼Šô¼Ší¼Š漊ß¼ŠؼŠѼŠʼŠüм¼Šµ¼Š®¼Š§¼Š ¼Š™¼Š’¼Š‹¼Š„¼Š}¼Šv¼Šo¼Šh¼Ša¼ŠZ¼ŠS¼ŠL¼ŠE¼Š>¼Š7¼Š0¼Š)¼Š"¼Š¼Š¼Š ¼Š¼Šÿ»Šø»Šñ»Š껊㻊Ü»ŠÕ»ŠλŠÇ»ŠÀ»Š¹»Š²»Š«»Š¤»Š»Š–»Š»Šˆ»Š»Šz»Šs»Šl»Še»Š^»ŠW»ŠP»ŠI»ŠB»Š;»Š4»Š-»Š&»Š»Š»Š»Š »Š»ŠüºŠõºŠ纊ຊÙºŠÒºŠ˺ŠĺнºŠ¶ºŠ¯ºŠ¨ºŠ¡ºŠšºŠ“ºŠŒºŠ…ºŠ~ºŠwºŠpºŠiºŠbºŠ[ºŠTºŠMºŠFºŠ?ºŠ8ºŠ1ºŠ*ºŠ#ºŠºŠºŠºŠºŠºŠù¹Šò¹Š빊乊ݹŠÖ¹ŠϹŠȹŠÁ¹Šº¹Š³¹Š¬¹Š¥¹Šž¹Š—¹Š¹Š‰¹Š‚¹Š{¹Št¹Šm¹Šf¹Š_¹ŠX¹ŠQ¹ŠJ¹ŠC¹Š<¹Š5¹Š.¹Š'¹Š ¹Š¹Š¹Š ¹Š¹Šý¸Šö¸Š︊踊ḊÚ¸ŠÓ¸Š̸ŠŸŠ¾¸Š·¸Š°¸Š©¸Š¢¸Š›¸Š”¸Š¸Š†¸Š¸Šx¸Šq¸Šj¸Šc¸Š\¸ŠU¸ŠN¸ŠG¸Š@¸Š9¸Š2¸Š+¸Š$¸Š¸Š¸Š¸Š¸Š¸Šú·Šó·Šì·Šå·ŠÞ·Š×·ŠзŠÉ·Š·Š»·Š´·Š­·Š¦·ŠŸ·Š˜·Š‘·ŠŠ·Šƒ·Š|·Šu·Šn·Šg·Š`·ŠY·ŠR·ŠK·ŠD·Š=·Š6·Š/·Š(·Š!·Š·Š·Š ·Š·Šþ¶Š÷¶Šð¶Šé¶Šâ¶ŠÛ¶ŠÔ¶ŠͶŠƶŠ¿¶Š¸¶Š±¶Šª¶Š£¶Šœ¶Š•¶Š޶Ї¶Š€¶Šy¶Šr¶Šk¶Šd¶Š]¶ŠV¶ŠO¶ŠH¶ŠA¶Š:¶Š3¶Š,¶Š%¶Š¶Š¶Š¶Š ¶Š¶ŠûµŠôµŠíµŠ浊ßµŠصŠѵŠʵŠõмµŠµµŠ®µŠ§µŠ µŠ™µŠ’µŠ‹µŠ„µŠ}µŠvµŠoµŠhµŠaµŠZµŠSµŠLµŠEµŠ>µŠ7µŠ0µŠ)µŠ"µŠµŠµŠ µŠµŠÿ´Šø´Šñ´Šê´Šã´ŠÜ´ŠÕ´ŠδŠÇ´ŠÀ´Š¹´Š²´Š«´Š¤´Š´Š–´Š´Šˆ´Š´Šz´Šs´Šl´Še´Š^´ŠW´ŠP´ŠI´ŠB´Š;´Š4´Š-´Š&´Š´Š´Š´Š ´Š´Šü³Šõ³Š糊ೊÙ³ŠÒ³Š˳Šijн³Š¶³Š¯³Š¨³Š¡³Šš³Š“³ŠŒ³Š…³Š~³Šw³Šp³Ši³Šb³Š[³ŠT³ŠM³ŠF³Š?³Š8³Š1³Š*³Š#³Š³Š³Š³Š³Š³Šù²Šò²Š벊䲊ݲŠÖ²ŠϲŠȲŠÁ²Šº²Š³²Š¬²Š¥²Šž²Š—²Š²Š‰²Š‚²Š{²Št²Šm²Šf²Š_²ŠX²ŠQ²ŠJ²ŠC²Š<²Š5²Š.²Š'²Š ²Š²Š²Š ²Š²Šý±Šö±Šﱊ豊᱊Ú±ŠÓ±Š̱Šűо±Š·±Š°±Š©±Š¢±Š›±Š”±Š±Š†±Š±Šx±Šq±Šj±Šc±Š\±ŠU±ŠN±ŠG±Š@±Š9±Š2±Š+±Š$±Š±Š±Š±Š±Š±Šú°Šó°Šì°Šå°ŠÞ°Š×°ŠаŠɰал°Š´°Š­°Š¦°ŠŸ°Š˜°Š‘°ŠаŠƒ°Š|°Šu°Šn°Šg°Š`°ŠY°ŠR°ŠK°ŠD°Š=°Š6°Š/°Š(°Š!°Š°Š°Š °Š°Šþ¯Š÷¯Šð¯Š鯊⯊Û¯ŠÔ¯ŠͯŠƯŠ¿¯Š¸¯Š±¯Šª¯Š£¯Šœ¯Š•¯ŠޝЇ¯Š€¯Šy¯Šr¯Šk¯Šd¯Š]¯ŠV¯ŠO¯ŠH¯ŠA¯Š:¯Š3¯Š,¯Š%¯Š¯Š¯Š¯Š ¯Š¯Šû®Šô®Ší®Š殊߮Ш®ŠÑ®ŠÊ®Šîм®Šµ®Š®®Š§®Š ®Š™®Š’®Š‹®Š„®Š}®Šv®Šo®Šh®Ša®ŠZ®ŠS®ŠL®ŠE®Š>®Š7®Š0®Š)®Š"®Š®Š®Š ®Š®Šÿ­Šø­Šñ­Šê­Šã­ŠÜ­ŠÕ­ŠέŠÇ­ŠÀ­Š¹­Š²­Š«­Š¤­Š­Š–­Š­Šˆ­Š­Šz­Šs­Šl­Še­Š^­ŠW­ŠP­ŠI­ŠB­Š;­Š4­Š-­Š&­Š­Š­Š­Š ­Š­Šü¬Šõ¬Š笊ଊÙ¬ŠÒ¬ŠˬŠĬн¬Š¶¬Š¯¬Š¨¬Š¡¬Šš¬Š“¬ŠŒ¬Š…¬Š~¬Šw¬Šp¬Ši¬Šb¬Š[¬ŠT¬ŠM¬ŠF¬Š?¬Š8¬Š1¬Š*¬Š#¬Š¬Š¬Š¬Š¬Š¬Šù«Šò«Š뫊䫊Ý«ŠÖ«ŠÏ«ŠÈ«ŠÁ«Šº«Š³«Š¬«Š¥«Šž«Š—«Š«Š‰«Š‚«Š{«Št«Šm«Šf«Š_«ŠX«ŠQ«ŠJ«ŠC«Š<«Š5«Š.«Š'«Š «Š«Š«Š «Š«ŠýªŠöªŠ慠誊᪊ÚªŠÓªŠ̪ŠŪоªŠ·ªŠ°ªŠ©ªŠ¢ªŠ›ªŠ”ªŠªŠ†ªŠªŠxªŠqªŠjªŠcªŠ\ªŠUªŠNªŠGªŠ@ªŠ9ªŠ2ªŠ+ªŠ$ªŠªŠªŠªŠªŠªŠú©Šó©Š쩊婊Þ©ŠשŠЩŠÉ©Š©Š»©Š´©Š­©Š¦©ŠŸ©Š˜©Š‘©ŠŠ©Šƒ©Š|©Šu©Šn©Šg©Š`©ŠY©ŠR©ŠK©ŠD©Š=©Š6©Š/©Š(©Š!©Š©Š©Š ©Š©Šþ¨Š÷¨Šð¨Š騊⨊Û¨ŠÔ¨ŠͨŠƨŠ¿¨Š¸¨Š±¨Šª¨Š£¨Šœ¨Š•¨ŠލЇ¨Š€¨Šy¨Šr¨Šk¨Šd¨Š]¨ŠV¨ŠO¨ŠH¨ŠA¨Š:¨Š3¨Š,¨Š%¨Š¨Š¨Š¨Š ¨Š¨Šû§Šô§Ší§Šæ§Šß§ŠاŠѧŠʧŠçм§Šµ§Š®§Š§§Š §Š™§Š’§Š‹§Š„§Š}§Šv§Šo§Šh§Ša§ŠZ§ŠS§ŠL§ŠE§Š>§Š7§Š0§Š)§Š"§Š§Š§Š §Š§Šÿ¦Šø¦Šñ¦Šꦊ㦊ܦŠÕ¦ŠΦŠǦŠÀ¦Š¹¦Š²¦Š«¦Š¤¦Š¦Š–¦Š¦Šˆ¦Š¦Šz¦Šs¦Šl¦Še¦Š^¦ŠW¦ŠP¦ŠI¦ŠB¦Š;¦Š4¦Š-¦Š&¦Š¦Š¦Š¦Š ¦Š¦Šü¥Šõ¥Š祊ॊÙ¥ŠÒ¥ŠË¥ŠÄ¥Š½¥Š¶¥Š¯¥Š¨¥Š¡¥Šš¥Š“¥ŠŒ¥Š…¥Š~¥Šw¥Šp¥Ši¥Šb¥Š[¥ŠT¥ŠM¥ŠF¥Š?¥Š8¥Š1¥Š*¥Š#¥Š¥Š¥Š¥Š¥Š¥Šù¤Šò¤Š뤊䤊ݤŠÖ¤ŠϤŠȤŠÁ¤Šº¤Š³¤Š¬¤Š¥¤Šž¤Š—¤Š¤Š‰¤Š‚¤Š{¤Št¤Šm¤Šf¤Š_¤ŠX¤ŠQ¤ŠJ¤ŠC¤Š<¤Š5¤Š.¤Š'¤Š ¤Š¤Š¤Š ¤Š¤Šý£Šö£Š裊ᣊÚ£ŠÓ£ŠÌ£ŠÅ£Š¾£Š·£Š°£Š©£Š¢£Š›£Š”£Š£Š†£Š£Šx£Šq£Šj£Šc£Š\£ŠU£ŠN£ŠG£Š@£Š9£Š2£Š+£Š$£Š£Š£Š£Š£Š£Šú¢Šó¢Š좊墊Þ¢Š×¢ŠТŠÉ¢Š¢Š»¢Š´¢Š­¢Š¦¢ŠŸ¢Š˜¢Š‘¢ŠŠ¢Šƒ¢Š|¢Šu¢Šn¢Šg¢Š`¢ŠY¢ŠR¢ŠK¢ŠD¢Š=¢Š6¢Š/¢Š(¢Š!¢Š¢Š¢Š ¢Š¢Šþ¡Š÷¡Šð¡Š顊⡊Û¡ŠÔ¡ŠÍ¡ŠÆ¡Š¿¡Š¸¡Š±¡Šª¡Š£¡Šœ¡Š•¡ŠŽ¡Š‡¡Š€¡Šy¡Šr¡Šk¡Šd¡Š]¡ŠV¡ŠO¡ŠH¡ŠA¡Š:¡Š3¡Š,¡Š%¡Š¡Š¡Š¡Š ¡Š¡Šû Šô Ší Šæ Šß ŠØ ŠÑ ŠÊ Šàм Šµ Š® Š§ Š  Š™ Š’ Š‹ Š„ Š} Šv Šo Šh Ša ŠZ ŠS ŠL ŠE Š> Š7 Š0 Š) Š" Š Š Š  Š ŠÿŸŠøŸŠñŸŠꟊ㟊ÜŸŠÕŸŠΟŠÇŸŠÀŸŠ¹ŸŠ²ŸŠ«ŸŠ¤ŸŠŸŠ–ŸŠŸŠˆŸŠŸŠzŸŠsŸŠlŸŠeŸŠ^ŸŠWŸŠPŸŠIŸŠBŸŠ;ŸŠ4ŸŠ-ŸŠ&ŸŠŸŠŸŠŸŠ ŸŠŸŠüžŠõžŠ瞊àžŠÙžŠÒžŠËžŠÄžŠ½žŠ¶žŠ¯žŠ¨žŠ¡žŠšžŠ“žŠŒžŠ…žŠ~žŠwžŠpžŠižŠbžŠ[žŠTžŠMžŠFžŠ?žŠ8žŠ1žŠ*žŠ#žŠžŠžŠžŠžŠžŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýœŠöœŠ蜊ᜊÚœŠÓœŠÌœŠÅœŠ¾œŠ·œŠ°œŠ©œŠ¢œŠ›œŠ”œŠœŠ†œŠœŠxœŠqœŠjœŠcœŠ\œŠUœŠNœŠGœŠ@œŠ9œŠ2œŠ+œŠ$œŠœŠœŠœŠœŠœŠú›Šó›Š웊囊Þ›Š×›ŠЛŠÉ›Š›Š»›Š´›Š­›Š¦›ŠŸ›Š˜›Š‘›ŠŠ›Šƒ›Š|›Šu›Šn›Šg›Š`›ŠY›ŠR›ŠK›ŠD›Š=›Š6›Š/›Š(›Š!›Š›Š›Š ›Š›ŠþšŠ÷šŠðšŠ隊⚊ÛšŠÔšŠÍšŠÆšŠ¿šŠ¸šŠ±šŠªšŠ£šŠœšŠ•šŠŽšŠ‡šŠ€šŠyšŠršŠkšŠdšŠ]šŠVšŠOšŠHšŠAšŠ:šŠ3šŠ,šŠ%šŠšŠšŠšŠ šŠšŠû™Šô™Š홊晊ߙШ™ŠÑ™ŠÊ™ŠÙм™Šµ™Š®™Š§™Š ™Š™™Š’™Š‹™Š„™Š}™Šv™Šo™Šh™Ša™ŠZ™ŠS™ŠL™ŠE™Š>™Š7™Š0™Š)™Š"™Š™Š™Š ™Š™Šÿ˜Šø˜Šñ˜Šꘊ㘊ܘŠÕ˜ŠΘŠǘŠÀ˜Š¹˜Š²˜Š«˜Š¤˜Š˜Š–˜Š˜Šˆ˜Š˜Šz˜Šs˜Šl˜Še˜Š^˜ŠW˜ŠP˜ŠI˜ŠB˜Š;˜Š4˜Š-˜Š&˜Š˜Š˜Š˜Š ˜Š˜Šü—Šõ—Šî—Šç—Šà—ŠÙ—ŠÒ—ŠË—ŠÄ—н—ж—Н—Ѝ—Š¡—Šš—Š“—ŠŒ—Š…—Š~—Šw—Šp—Ši—Šb—Š[—ŠT—ŠM—ŠF—Š?—Š8—Š1—Š*—Š#—Š—Š—Š—Š—Š—Šù–Šò–Šë–Šä–ŠÝ–ŠÖ–ŠÏ–ŠÈ–ŠÁ–Šº–г–Ь–Š¥–Šž–Š—–ЖЉ–Š‚–Š{–Št–Šm–Šf–Š_–ŠX–ŠQ–ŠJ–ŠC–Š<–Š5–Š.–Š'–Š –Š–Š–Š –Š–Šý•Šö•Š蕊ᕊÚ•ŠÓ•ŠÌ•ŠÅ•о•Š·•а•Š©•Š¢•Š›•Š”•ЕІ•Š•Šx•Šq•Šj•Šc•Š\•ŠU•ŠN•ŠG•Š@•Š9•Š2•Š+•Š$•ЕЕЕЕЕŠú”Šó”Š씊唊Þ”Š×”ŠДŠÉ”Дл”Š´”Š­”Ц”ŠŸ”Š˜”Š‘”ŠŠ”Šƒ”Š|”Šu”Šn”Šg”Š`”ŠY”ŠR”ŠK”ŠD”Š=”Š6”Š/”Š(”Š!”ДДР”Š”Šþ“Š÷“Šð“Š铊ⓊÛ“ŠÔ“ŠÍ“ŠÆ“Š¿“Џ“б“Šª“Š£“Šœ“Š•“ŠŽ“Ї“Š€“Šy“Šr“Šk“Šd“Š]“ŠV“ŠO“ŠH“ŠA“Š:“Š3“Š,“Š%“ГГГР“Š“Šû’Šô’Ší’Šæ’Šß’ŠØ’ŠÑ’ŠÊ’ŠÃ’м’е’Š®’Ч’Š ’Š™’Š’’Š‹’Š„’Š}’Šv’Šo’Šh’Ša’ŠZ’ŠS’ŠL’ŠE’Š>’Š7’Š0’Š)’Š"’Š’Š’Š ’Š’Šÿ‘Šø‘Šñ‘Šꑊ㑊Ü‘ŠÕ‘ŠΑŠÇ‘ŠÀ‘й‘в‘Š«‘Ф‘БЖ‘Š‘Šˆ‘Š‘Šz‘Šs‘Šl‘Še‘Š^‘ŠW‘ŠP‘ŠI‘ŠB‘Š;‘Š4‘Š-‘Š&‘БББР‘Š‘ŠüŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýŽŠöŽŠ莊ᎊÚŽŠÓŽŠÌŽŠÅŽŠ¾ŽŠ·ŽŠ°ŽŠ©ŽŠ¢ŽŠ›ŽŠ”ŽŠŽŠ†ŽŠŽŠxŽŠqŽŠjŽŠcŽŠ\ŽŠUŽŠNŽŠGŽŠ@ŽŠ9ŽŠ2ŽŠ+ŽŠ$ŽŠŽŠŽŠŽŠŽŠŽŠúŠóŠìŠåŠÞŠ׊ЊÉŠŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŒŠ÷ŒŠðŒŠ錊⌊ÛŒŠÔŒŠÍŒŠÆŒŠ¿ŒŠ¸ŒŠ±ŒŠªŒŠ£ŒŠœŒŠ•ŒŠŽŒŠ‡ŒŠ€ŒŠyŒŠrŒŠkŒŠdŒŠ]ŒŠVŒŠOŒŠHŒŠAŒŠ:ŒŠ3ŒŠ,ŒŠ%ŒŠŒŠŒŠŒŠ ŒŠŒŠû‹Šô‹Š틊拊ߋШ‹ŠÑ‹ŠÊ‹ŠËм‹Šµ‹Š®‹Š§‹Š ‹Š™‹Š’‹Š‹‹Š„‹Š}‹Šv‹Šo‹Šh‹Ša‹ŠZ‹ŠS‹ŠL‹ŠE‹Š>‹Š7‹Š0‹Š)‹Š"‹Š‹Š‹Š ‹Š‹ŠÿŠŠøŠŠñŠŠꊊ㊊ÜŠŠÕŠŠΊŠÇŠŠÀŠŠ¹ŠŠ²ŠŠ«ŠŠ¤ŠŠŠŠ–ŠŠŠŠˆŠŠŠŠzŠŠsŠŠlŠŠeŠŠ^ŠŠWŠŠPŠŠIŠŠBŠŠ;ŠŠ4ŠŠ-ŠŠ&ŠŠŠŠŠŠŠŠ ŠŠŠŠü‰Šõ‰Š牊à‰ŠÙ‰ŠÒ‰ŠˉŠĉн‰Š¶‰Š¯‰Š¨‰Š¡‰Šš‰Š“‰ŠŒ‰Š…‰Š~‰Šw‰Šp‰Ši‰Šb‰Š[‰ŠT‰ŠM‰ŠF‰Š?‰Š8‰Š1‰Š*‰Š#‰Š‰Š‰Š‰Š‰Š‰ŠùˆŠòˆŠ눊䈊݈ŠÖˆŠψŠȈŠÁˆŠºˆŠ³ˆŠ¬ˆŠ¥ˆŠžˆŠ—ˆŠˆŠ‰ˆŠ‚ˆŠ{ˆŠtˆŠmˆŠfˆŠ_ˆŠXˆŠQˆŠJˆŠCˆŠ<ˆŠ5ˆŠ.ˆŠ'ˆŠ ˆŠˆŠˆŠ ˆŠˆŠý‡Šö‡Š臊ᇊÚ‡ŠÓ‡ṦŠŇо‡Š·‡Š°‡Š©‡Š¢‡Š›‡Š”‡Š‡Š†‡Š‡Šx‡Šq‡Šj‡Šc‡Š\‡ŠU‡ŠN‡ŠG‡Š@‡Š9‡Š2‡Š+‡Š$‡Š‡Š‡Š‡Š‡Š‡Šú†Šó†Š솊冊Þ†Š׆ŠІŠɆІл†Š´†Š­†Š¦†ŠŸ†Š˜†Š‘†ŠІŠƒ†Š|†Šu†Šn†Šg†Š`†ŠY†ŠR†ŠK†ŠD†Š=†Š6†Š/†Š(†Š!†Š†Š†Š †Š†Šþ…Š÷…Šð…Šé…Šâ…ŠÛ…ŠÔ…ŠÍ…ŠÆ…Š¿…Џ…б…Šª…Š£…Šœ…Š•…ŠŽ…Ї…Š€…Šy…Šr…Šk…Šd…Š]…ŠV…ŠO…ŠH…ŠA…Š:…Š3…Š,…Š%…Š…Š…Š…Š …Š…Šû„Šô„Š턊愊߄Ш„ŠÑ„ŠÊ„ŠÄм„е„Š®„Ч„Š „Š™„Š’„Š‹„Š„„Š}„Šv„Šo„Šh„Ša„ŠZ„ŠS„ŠL„ŠE„Š>„Š7„Š0„Š)„Š"„ЄЄР„Š„ŠÿƒŠøƒŠñƒŠꃊナ܃ŠÕƒŠ΃ŠǃŠÀƒŠ¹ƒŠ²ƒŠ«ƒŠ¤ƒŠƒŠ–ƒŠƒŠˆƒŠƒŠzƒŠsƒŠlƒŠeƒŠ^ƒŠWƒŠPƒŠIƒŠBƒŠ;ƒŠ4ƒŠ-ƒŠ&ƒŠƒŠƒŠƒŠ ƒŠƒŠü‚Šõ‚Š炊à‚ŠÙ‚ŠÒ‚ŠË‚ŠÄ‚н‚ж‚Н‚Ѝ‚Š¡‚Šš‚Š“‚ŠŒ‚Š…‚Š~‚Šw‚Šp‚Ši‚Šb‚Š[‚ŠT‚ŠM‚ŠF‚Š?‚Š8‚Š1‚Š*‚Š#‚ЂЂЂЂЂŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý€Šö€Š耊ညÚ€ŠÓ€ŠÌ€ŠÅ€Š¾€Š·€Š°€Š©€Š¢€Š›€Š”€Š€Š†€Š€Šx€Šq€Šj€Šc€Š\€ŠU€ŠN€ŠG€Š@€Š9€Š2€Š+€Š$€Š€Š€Š€Š€Š€ŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþ~Š÷~Šð~Šé~Šâ~ŠÛ~ŠÔ~ŠÍ~ŠÆ~Š¿~Џ~б~Šª~Š£~Šœ~Š•~ŠŽ~Ї~Š€~Šy~Šr~Šk~Šd~Š]~ŠV~ŠO~ŠH~ŠA~Š:~Š3~Š,~Š%~Š~Š~Š~Š ~Š~Šû}Šô}Ší}Šæ}Šß}ŠØ}ŠÑ}ŠÊ}ŠÃ}м}е}Š®}Ч}Š }Š™}Š’}Š‹}Š„}Š}}Šv}Šo}Šh}Ša}ŠZ}ŠS}ŠL}ŠE}Š>}Š7}Š0}Š)}Š"}Š}Š}Š }Š}Šÿ|Šø|Šñ|Šê|Šã|ŠÜ|ŠÕ|ŠÎ|ŠÇ|ŠÀ|й|в|Š«|Ф|Š|Š–|Š|Šˆ|Š|Šz|Šs|Šl|Še|Š^|ŠW|ŠP|ŠI|ŠB|Š;|Š4|Š-|Š&|Š|Š|Š|Š |Š|Šü{Šõ{Šî{Šç{Šà{ŠÙ{ŠÒ{ŠË{ŠÄ{н{ж{Н{Ѝ{Š¡{Šš{Š“{ŠŒ{Š…{Š~{Šw{Šp{Ši{Šb{Š[{ŠT{ŠM{ŠF{Š?{Š8{Š1{Š*{Š#{Š{Š{Š{Š{Š{ŠùzŠòzŠëzŠäzŠÝzŠÖzŠÏzŠÈzŠÁzŠºzгzЬzŠ¥zŠžzŠ—zŠzЉzŠ‚zŠ{zŠtzŠmzŠfzŠ_zŠXzŠQzŠJzŠCzŠvŠ7vŠ0vŠ)vŠ"vŠvŠvŠ vŠvŠÿuŠøuŠñuŠêuŠãuŠÜuŠÕuŠÎuŠÇuŠÀuйuвuŠ«uФuŠuŠ–uŠuŠˆuŠuŠzuŠsuŠluŠeuŠ^uŠWuŠPuŠIuŠBuŠ;uŠ4uŠ-uŠ&uŠuŠuŠuŠ uŠuŠütŠõtŠîtŠçtŠàtŠÙtŠÒtŠËtŠÄtнtжtНtЍtŠ¡tŠštŠ“tŠŒtŠ…tŠ~tŠwtŠptŠitŠbtŠ[tŠTtŠMtŠFtŠ?tŠ8tŠ1tŠ*tŠ#tŠtŠtŠtŠtŠtŠùsŠòsŠësŠäsŠÝsŠÖsŠÏsŠÈsŠÁsŠºsгsЬsŠ¥sŠžsŠ—sŠsЉsŠ‚sŠ{sŠtsŠmsŠfsŠ_sŠXsŠQsŠJsŠCsŠoŠ7oŠ0oŠ)oŠ"oŠoŠoŠ oŠoŠÿnŠønŠñnŠênŠãnŠÜnŠÕnŠÎnŠÇnŠÀnйnвnŠ«nФnŠnŠ–nŠnŠˆnŠnŠznŠsnŠlnŠenŠ^nŠWnŠPnŠInŠBnŠ;nŠ4nŠ-nŠ&nŠnŠnŠnŠ nŠnŠümŠõmŠîmŠçmŠàmŠÙmŠÒmŠËmŠÄmнmжmНmЍmŠ¡mŠšmŠ“mŠŒmŠ…mŠ~mŠwmŠpmŠimŠbmŠ[mŠTmŠMmŠFmŠ?mŠ8mŠ1mŠ*mŠ#mŠmŠmŠmŠmŠmŠùlŠòlŠëlŠälŠÝlŠÖlŠÏlŠÈlŠÁlŠºlгlЬlŠ¥lŠžlŠ—lŠlЉlŠ‚lŠ{lŠtlŠmlŠflŠ_lŠXlŠQlŠJlŠClŠhŠ7hŠ0hŠ)hŠ"hŠhŠhŠ hŠhŠÿgŠøgŠñgŠêgŠãgŠÜgŠÕgŠÎgŠÇgŠÀgйgвgŠ«gФgŠgŠ–gŠgŠˆgŠgŠzgŠsgŠlgŠegŠ^gŠWgŠPgŠIgŠBgŠ;gŠ4gŠ-gŠ&gŠgŠgŠgŠ gŠgŠüfŠõfŠîfŠçfŠàfŠÙfŠÒfŠËfŠÄfнfжfНfЍfŠ¡fŠšfŠ“fŠŒfŠ…fŠ~fŠwfŠpfŠifŠbfŠ[fŠTfŠMfŠFfŠ?fŠ8fŠ1fŠ*fŠ#fŠfŠfŠfŠfŠfŠùeŠòeŠëeŠäeŠÝeŠÖeŠÏeŠÈeŠÁeŠºeгeЬeŠ¥eŠžeŠ—eŠeЉeŠ‚eŠ{eŠteŠmeŠfeŠ_eŠXeŠQeŠJeŠCeŠaŠ7aŠ0aŠ)aŠ"aŠaŠaŠ aŠaŠÿ`Šø`Šñ`Šê`Šã`ŠÜ`ŠÕ`ŠÎ`ŠÇ`ŠÀ`й`в`Š«`Ф`Š`Š–`Š`Šˆ`Š`Šz`Šs`Šl`Še`Š^`ŠW`ŠP`ŠI`ŠB`Š;`Š4`Š-`Š&`Š`Š`Š`Š `Š`Šü_Šõ_Šî_Šç_Šà_ŠÙ_ŠÒ_ŠË_ŠÄ_н_ж_Н_Ѝ_Š¡_Šš_Š“_ŠŒ_Š…_Š~_Šw_Šp_Ši_Šb_Š[_ŠT_ŠM_ŠF_Š?_Š8_Š1_Š*_Š#_Š_Š_Š_Š_Š_Šù^Šò^Šë^Šä^ŠÝ^ŠÖ^ŠÏ^ŠÈ^ŠÁ^Šº^г^Ь^Š¥^Šž^Š—^Š^Љ^Š‚^Š{^Št^Šm^Šf^Š_^ŠX^ŠQ^ŠJ^ŠC^Š<^Š5^Š.^Š'^Š ^Š^Š^Š ^Š^Šý]Šö]Šï]Šè]Šá]ŠÚ]ŠÓ]ŠÌ]ŠÅ]о]Š·]а]Š©]Š¢]Š›]Š”]Š]І]Š]Šx]Šq]Šj]Šc]Š\]ŠU]ŠN]ŠG]Š@]Š9]Š2]Š+]Š$]Š]Š]Š]Š]Š]Šú\Šó\Šì\Šå\ŠÞ\Š×\ŠÐ\ŠÉ\ŠÂ\Š»\Š´\Š­\Ц\ŠŸ\Š˜\Š‘\ŠŠ\Šƒ\Š|\Šu\Šn\Šg\Š`\ŠY\ŠR\ŠK\ŠD\Š=\Š6\Š/\Š(\Š!\Š\Š\Š \Š\Šþ[Š÷[Šð[Šé[Šâ[ŠÛ[ŠÔ[ŠÍ[ŠÆ[Š¿[Џ[б[Šª[Š£[Šœ[Š•[ŠŽ[Ї[Š€[Šy[Šr[Šk[Šd[Š][ŠV[ŠO[ŠH[ŠA[Š:[Š3[Š,[Š%[Š[Š[Š[Š [Š[ŠûZŠôZŠíZŠæZŠßZŠØZŠÑZŠÊZŠÃZмZеZŠ®ZЧZŠ ZŠ™ZŠ’ZŠ‹ZŠ„ZŠ}ZŠvZŠoZŠhZŠaZŠZZŠSZŠLZŠEZŠ>ZŠ7ZŠ0ZŠ)ZŠ"ZŠZŠZŠ ZŠZŠÿYŠøYŠñYŠêYŠãYŠÜYŠÕYŠÎYŠÇYŠÀYйYвYŠ«YФYŠYŠ–YŠYŠˆYŠYŠzYŠsYŠlYŠeYŠ^YŠWYŠPYŠIYŠBYŠ;YŠ4YŠ-YŠ&YŠYŠYŠYŠ YŠYŠüXŠõXŠîXŠçXŠàXŠÙXŠÒXŠËXŠÄXнXжXНXЍXŠ¡XŠšXŠ“XŠŒXŠ…XŠ~XŠwXŠpXŠiXŠbXŠ[XŠTXŠMXŠFXŠ?XŠ8XŠ1XŠ*XŠ#XŠXŠXŠXŠXŠXŠùWŠòWŠëWŠäWŠÝWŠÖWŠÏWŠÈWŠÁWŠºWгWЬWŠ¥WŠžWŠ—WŠWЉWŠ‚WŠ{WŠtWŠmWŠfWŠ_WŠXWŠQWŠJWŠCWŠSŠ7SŠ0SŠ)SŠ"SŠSŠSŠ SŠSŠÿRŠøRŠñRŠêRŠãRŠÜRŠÕRŠÎRŠÇRŠÀRйRвRŠ«RФRŠRŠ–RŠRŠˆRŠRŠzRŠsRŠlRŠeRŠ^RŠWRŠPRŠIRŠBRŠ;RŠ4RŠ-RŠ&RŠRŠRŠRŠ RŠRŠüQŠõQŠîQŠçQŠàQŠÙQŠÒQŠËQŠÄQнQжQНQЍQŠ¡QŠšQŠ“QŠŒQŠ…QŠ~QŠwQŠpQŠiQŠbQŠ[QŠTQŠMQŠFQŠ?QŠ8QŠ1QŠ*QŠ#QŠQŠQŠQŠQŠQŠùPŠòPŠëPŠäPŠÝPŠÖPŠÏPŠÈPŠÁPŠºPгPЬPŠ¥PŠžPŠ—PŠPЉPŠ‚PŠ{PŠtPŠmPŠfPŠ_PŠXPŠQPŠJPŠCPŠLŠ7LŠ0LŠ)LŠ"LŠLŠLŠ LŠLŠÿKŠøKŠñKŠêKŠãKŠÜKŠÕKŠÎKŠÇKŠÀKйKвKŠ«KФKŠKŠ–KŠKŠˆKŠKŠzKŠsKŠlKŠeKŠ^KŠWKŠPKŠIKŠBKŠ;KŠ4KŠ-KŠ&KŠKŠKŠKŠ KŠKŠüJŠõJŠîJŠçJŠàJŠÙJŠÒJŠËJŠÄJнJжJНJЍJŠ¡JŠšJŠ“JŠŒJŠ…JŠ~JŠwJŠpJŠiJŠbJŠ[JŠTJŠMJŠFJŠ?JŠ8JŠ1JŠ*JŠ#JŠJŠJŠJŠJŠJŠùIŠòIŠëIŠäIŠÝIŠÖIŠÏIŠÈIŠÁIŠºIгIЬIŠ¥IŠžIŠ—IŠIЉIŠ‚IŠ{IŠtIŠmIŠfIŠ_IŠXIŠQIŠJIŠCIŠEŠ7EŠ0EŠ)EŠ"EŠEŠEŠ EŠEŠÿDŠøDŠñDŠêDŠãDŠÜDŠÕDŠÎDŠÇDŠÀDйDвDŠ«DФDŠDŠ–DŠDŠˆDŠDŠzDŠsDŠlDŠeDŠ^DŠWDŠPDŠIDŠBDŠ;DŠ4DŠ-DŠ&DŠDŠDŠDŠ DŠDŠüCŠõCŠîCŠçCŠàCŠÙCŠÒCŠËCŠÄCнCжCНCЍCŠ¡CŠšCŠ“CŠŒCŠ…CŠ~CŠwCŠpCŠiCŠbCŠ[CŠTCŠMCŠFCŠ?CŠ8CŠ1CŠ*CŠ#CŠCŠCŠCŠCŠCŠùBŠòBŠëBŠäBŠÝBŠÖBŠÏBŠÈBŠÁBŠºBгBЬBŠ¥BŠžBŠ—BŠBЉBŠ‚BŠ{BŠtBŠmBŠfBŠ_BŠXBŠQBŠJBŠCBŠŠô>Ší>Šæ>Šß>ŠØ>ŠÑ>ŠÊ>ŠÃ>м>е>Š®>Ч>Š >Š™>Š’>Š‹>Š„>Š}>Šv>Šo>Šh>Ša>ŠZ>ŠS>ŠL>ŠE>Š>>Š7>Š0>Š)>Š">Š>Š>Š >Š>Šÿ=Šø=Šñ=Šê=Šã=ŠÜ=ŠÕ=ŠÎ=ŠÇ=ŠÀ=й=в=Š«=Ф=Š=Š–=Š=Šˆ=Š=Šz=Šs=Šl=Še=Š^=ŠW=ŠP=ŠI=ŠB=Š;=Š4=Š-=Š&=Š=Š=Š=Š =Š=Šü<Šõ<Šî<Šç<Šà<ŠÙ<ŠÒ<ŠË<ŠÄ<н<ж<Н<Ѝ<Š¡<Šš<Š“<ŠŒ<Š…<Š~<Šw<Šp<Ši<Šb<Š[<ŠT<ŠM<ŠF<Š?<Š8<Š1<Š*<Š#<Š<Š<Š<Š<Š<Šù;Šò;Šë;Šä;ŠÝ;ŠÖ;ŠÏ;ŠÈ;ŠÁ;Šº;г;Ь;Š¥;Šž;Š—;Š;Љ;Š‚;Š{;Št;Šm;Šf;Š_;ŠX;ŠQ;ŠJ;ŠC;Š<;Š5;Š.;Š';Š ;Š;Š;Š ;Š;Šý:Šö:Šï:Šè:Šá:ŠÚ:ŠÓ:ŠÌ:ŠÅ:о:Š·:а:Š©:Š¢:Š›:Š”:Š:І:Š:Šx:Šq:Šj:Šc:Š\:ŠU:ŠN:ŠG:Š@:Š9:Š2:Š+:Š$:Š:Š:Š:Š:Š:Šú9Šó9Šì9Šå9ŠÞ9Š×9ŠÐ9ŠÉ9ŠÂ9Š»9Š´9Š­9Ц9ŠŸ9Š˜9Š‘9ŠŠ9Šƒ9Š|9Šu9Šn9Šg9Š`9ŠY9ŠR9ŠK9ŠD9Š=9Š69Š/9Š(9Š!9Š9Š9Š 9Š9Šþ8Š÷8Šð8Šé8Šâ8ŠÛ8ŠÔ8ŠÍ8ŠÆ8Š¿8Џ8б8Šª8Š£8Šœ8Š•8ŠŽ8Ї8Š€8Šy8Šr8Šk8Šd8Š]8ŠV8ŠO8ŠH8ŠA8Š:8Š38Š,8Š%8Š8Š8Š8Š 8Š8Šû7Šô7Ší7Šæ7Šß7ŠØ7ŠÑ7ŠÊ7ŠÃ7м7е7Š®7Ч7Š 7Š™7Š’7Š‹7Š„7Š}7Šv7Šo7Šh7Ša7ŠZ7ŠS7ŠL7ŠE7Š>7Š77Š07Š)7Š"7Š7Š7Š 7Š7Šÿ6Šø6Šñ6Šê6Šã6ŠÜ6ŠÕ6ŠÎ6ŠÇ6ŠÀ6й6в6Š«6Ф6Š6Š–6Š6Šˆ6Š6Šz6Šs6Šl6Še6Š^6ŠW6ŠP6ŠI6ŠB6Š;6Š46Š-6Š&6Š6Š6Š6Š 6Š6Šü5Šõ5Šî5Šç5Šà5ŠÙ5ŠÒ5ŠË5ŠÄ5н5ж5Н5Ѝ5Š¡5Šš5Š“5ŠŒ5Š…5Š~5Šw5Šp5Ši5Šb5Š[5ŠT5ŠM5ŠF5Š?5Š85Š15Š*5Š#5Š5Š5Š5Š5Š5Šù4Šò4Šë4Šä4ŠÝ4ŠÖ4ŠÏ4ŠÈ4ŠÁ4Šº4г4Ь4Š¥4Šž4Š—4Š4Љ4Š‚4Š{4Št4Šm4Šf4Š_4ŠX4ŠQ4ŠJ4ŠC4Š<4Š54Š.4Š'4Š 4Š4Š4Š 4Š4Šý3Šö3Šï3Šè3Šá3ŠÚ3ŠÓ3ŠÌ3ŠÅ3о3Š·3а3Š©3Š¢3Š›3Š”3Š3І3Š3Šx3Šq3Šj3Šc3Š\3ŠU3ŠN3ŠG3Š@3Š93Š23Š+3Š$3Š3Š3Š3Š3Š3Šú2Šó2Šì2Šå2ŠÞ2Š×2ŠÐ2ŠÉ2ŠÂ2Š»2Š´2Š­2Ц2ŠŸ2Š˜2Š‘2ŠŠ2Šƒ2Š|2Šu2Šn2Šg2Š`2ŠY2ŠR2ŠK2ŠD2Š=2Š62Š/2Š(2Š!2Š2Š2Š 2Š2Šþ1Š÷1Šð1Šé1Šâ1ŠÛ1ŠÔ1ŠÍ1ŠÆ1Š¿1Џ1б1Šª1Š£1Šœ1Š•1ŠŽ1Ї1Š€1Šy1Šr1Šk1Šd1Š]1ŠV1ŠO1ŠH1ŠA1Š:1Š31Š,1Š%1Š1Š1Š1Š 1Š1Šû0Šô0Ší0Šæ0Šß0ŠØ0ŠÑ0ŠÊ0ŠÃ0м0е0Š®0Ч0Š 0Š™0Š’0Š‹0Š„0Š}0Šv0Šo0Šh0Ša0ŠZ0ŠS0ŠL0ŠE0Š>0Š70Š00Š)0Š"0Š0Š0Š 0Š0Šÿ/Šø/Šñ/Šê/Šã/ŠÜ/ŠÕ/ŠÎ/ŠÇ/ŠÀ/й/в/Š«/Ф/Š/Š–/Š/Šˆ/Š/Šz/Šs/Šl/Še/Š^/ŠW/ŠP/ŠI/ŠB/Š;/Š4/Š-/Š&/Š/Š/Š/Š /Š/Šü.Šõ.Šî.Šç.Šà.ŠÙ.ŠÒ.ŠË.ŠÄ.н.ж.Н.Ѝ.Š¡.Šš.Š“.ŠŒ.Š….Š~.Šw.Šp.Ši.Šb.Š[.ŠT.ŠM.ŠF.Š?.Š8.Š1.Š*.Š#.Š.Š.Š.Š.Š.Šù-Šò-Šë-Šä-ŠÝ-ŠÖ-ŠÏ-ŠÈ-ŠÁ-Šº-г-Ь-Š¥-Šž-Š—-Š-Љ-Š‚-Š{-Št-Šm-Šf-Š_-ŠX-ŠQ-ŠJ-ŠC-Š<-Š5-Š.-Š'-Š -Š-Š-Š -Š-Šý,Šö,Šï,Šè,Šá,ŠÚ,ŠÓ,ŠÌ,ŠÅ,о,Š·,а,Š©,Š¢,Š›,Š”,Š,І,Š,Šx,Šq,Šj,Šc,Š\,ŠU,ŠN,ŠG,Š@,Š9,Š2,Š+,Š$,Š,Š,Š,Š,Š,Šú+Šó+Šì+Šå+ŠÞ+Š×+ŠÐ+ŠÉ+ŠÂ+Š»+Š´+Š­+Ц+ŠŸ+Š˜+Š‘+ŠŠ+Šƒ+Š|+Šu+Šn+Šg+Š`+ŠY+ŠR+ŠK+ŠD+Š=+Š6+Š/+Š(+Š!+Š+Š+Š +Š+Šþ*Š÷*Šð*Šé*Šâ*ŠÛ*ŠÔ*ŠÍ*ŠÆ*Š¿*Џ*б*Šª*Š£*Šœ*Š•*ŠŽ*Ї*Š€*Šy*Šr*Šk*Šd*Š]*ŠV*ŠO*ŠH*ŠA*Š:*Š3*Š,*Š%*Š*Š*Š*Š *Š*Šû)Šô)Ší)Šæ)Šß)ŠØ)ŠÑ)ŠÊ)ŠÃ)м)е)Š®)Ч)Š )Š™)Š’)Š‹)Š„)Š})Šv)Šo)Šh)Ša)ŠZ)ŠS)ŠL)ŠE)Š>)Š7)Š0)Š))Š")Š)Š)Š )Š)Šÿ(Šø(Šñ(Šê(Šã(ŠÜ(ŠÕ(ŠÎ(ŠÇ(ŠÀ(й(в(Š«(Ф(Š(Š–(Š(Šˆ(Š(Šz(Šs(Šl(Še(Š^(ŠW(ŠP(ŠI(ŠB(Š;(Š4(Š-(Š&(Š(Š(Š(Š (Š(Šü'Šõ'Šî'Šç'Šà'ŠÙ'ŠÒ'ŠË'ŠÄ'н'ж'Н'Ѝ'Š¡'Šš'Š“'ŠŒ'Š…'Š~'Šw'Šp'Ši'Šb'Š['ŠT'ŠM'ŠF'Š?'Š8'Š1'Š*'Š#'Š'Š'Š'Š'Š'Šù&Šò&Šë&Šä&ŠÝ&ŠÖ&ŠÏ&ŠÈ&ŠÁ&Šº&г&Ь&Š¥&Šž&Š—&Š&Љ&Š‚&Š{&Št&Šm&Šf&Š_&ŠX&ŠQ&ŠJ&ŠC&Š<&Š5&Š.&Š'&Š &Š&Š&Š &Š&Šý%Šö%Šï%Šè%Šá%ŠÚ%ŠÓ%ŠÌ%ŠÅ%о%Š·%а%Š©%Š¢%Š›%Š”%Š%І%Š%Šx%Šq%Šj%Šc%Š\%ŠU%ŠN%ŠG%Š@%Š9%Š2%Š+%Š$%Š%Š%Š%Š%Š%Šú$Šó$Šì$Šå$ŠÞ$Š×$ŠÐ$ŠÉ$ŠÂ$Š»$Š´$Š­$Ц$ŠŸ$Š˜$Š‘$ŠŠ$Šƒ$Š|$Šu$Šn$Šg$Š`$ŠY$ŠR$ŠK$ŠD$Š=$Š6$Š/$Š($Š!$Š$Š$Š $Š$Šþ#Š÷#Šð#Šé#Šâ#ŠÛ#ŠÔ#ŠÍ#ŠÆ#Š¿#Џ#б#Šª#Š£#Šœ#Š•#ŠŽ#Ї#Š€#Šy#Šr#Šk#Šd#Š]#ŠV#ŠO#ŠH#ŠA#Š:#Š3#Š,#Š%#Š#Š#Š#Š #Š#Šû"Šô"Ší"Šæ"Šß"ŠØ"ŠÑ"ŠÊ"ŠÃ"м"е"Š®"Ч"Š "Š™"Š’"Š‹"Š„"Š}"Šv"Šo"Šh"Ša"ŠZ"ŠS"ŠL"ŠE"Š>"Š7"Š0"Š)"Š""Š"Š"Š "Š"Šÿ!Šø!Šñ!Šê!Šã!ŠÜ!ŠÕ!ŠÎ!ŠÇ!ŠÀ!й!в!Š«!Ф!Š!Š–!Š!Šˆ!Š!Šz!Šs!Šl!Še!Š^!ŠW!ŠP!ŠI!ŠB!Š;!Š4!Š-!Š&!Š!Š!Š!Š !Š!Šü Šõ Šî Šç Šà ŠÙ ŠÒ ŠË ŠÄ н ж Н Ѝ Š¡ Šš Š“ ŠŒ Š… Š~ Šw Šp Ši Šb Š[ ŠT ŠM ŠF Š? Š8 Š1 Š* Š# Š Š Š Š Š ŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠûŠôŠíŠæŠßŠØŠÑŠÊŠÃмеЮЧРЙВЋЄŠ}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿŠøŠñŠêŠãŠÜŠÕŠÎŠÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠüŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠûŠôŠíŠæŠßŠØŠÑŠÊŠÃмеЮЧРЙВЋЄŠ}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿŠøŠñŠêŠãŠÜŠÕŠÎŠÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠüŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠû Šô Ší Šæ Šß ŠØ ŠÑ ŠÊ Šà м е Š® Ч Š  Š™ Š’ Š‹ Š„ Š} Šv Šo Šh Ša ŠZ ŠS ŠL ŠE Š> Š7 Š0 Š) Š" Š Š Š Š Šÿ Šø Šñ Šê Šã ŠÜ ŠÕ ŠÎ ŠÇ ŠÀ й в Š« Ф Š Š– Š Šˆ Š Šz Šs Šl Še Š^ ŠW ŠP ŠI ŠB Š; Š4 Š- Š& Š Š Š Š Š Šü Šõ Šî Šç Šà ŠÙ ŠÒ ŠË ŠÄ н ж Н Ѝ Š¡ Šš Š“ ŠŒ Š… Š~ Šw Šp Ši Šb Š[ ŠT ŠM ŠF Š? Š8 Š1 Š* Š# Š Š Š Š Š Šù Šò Šë Šä ŠÝ ŠÖ ŠÏ ŠÈ ŠÁ Šº г Ь Š¥ Šž Š— РЉ Š‚ Š{ Št Šm Šf Š_ ŠX ŠQ ŠJ ŠC Š< Š5 Š. Š' Š Š Š Š Š Šý Šö Šï Šè Šá ŠÚ ŠÓ ŠÌ ŠÅ о Š· а Š© Š¢ Š› Š” РІ Š Šx Šq Šj Šc Š\ ŠU ŠN ŠG Š@ Š9 Š2 Š+ Š$ Š Š Š Š Š ŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠûŠôŠíŠæŠßŠØŠÑŠÊŠÃмеЮЧРЙВЋЄŠ}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿŠøŠñŠêŠãŠÜŠÕŠÎŠÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠüŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠúŠóŠìŠåŠÞŠ×ŠÐŠÉŠÂŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠûÿ‰ôÿ‰íÿ‰æÿ‰ßÿ‰Øÿ‰Ñÿ‰Êÿ‰Ãÿ‰¼ÿ‰µÿ‰®ÿ‰§ÿ‰ ÿ‰™ÿ‰’ÿ‰‹ÿ‰„ÿ‰}ÿ‰vÿ‰oÿ‰hÿ‰aÿ‰Zÿ‰Sÿ‰Lÿ‰Eÿ‰>ÿ‰7ÿ‰0ÿ‰)ÿ‰"ÿ‰ÿ‰ÿ‰ ÿ‰ÿ‰ÿþ‰øþ‰ñþ‰êþ‰ãþ‰Üþ‰Õþ‰Îþ‰Çþ‰Àþ‰¹þ‰²þ‰«þ‰¤þ‰þ‰–þ‰þ‰ˆþ‰þ‰zþ‰sþ‰lþ‰eþ‰^þ‰Wþ‰Pþ‰Iþ‰Bþ‰;þ‰4þ‰-þ‰&þ‰þ‰þ‰þ‰ þ‰þ‰üý‰õý‰îý‰çý‰àý‰Ùý‰Òý‰Ëý‰Äý‰½ý‰¶ý‰¯ý‰¨ý‰¡ý‰šý‰“ý‰Œý‰…ý‰~ý‰wý‰pý‰iý‰bý‰[ý‰Tý‰Mý‰Fý‰?ý‰8ý‰1ý‰*ý‰#ý‰ý‰ý‰ý‰ý‰ý‰ùü‰òü‰ëü‰äü‰Ýü‰Öü‰Ïü‰Èü‰Áü‰ºü‰³ü‰¬ü‰¥ü‰žü‰—ü‰ü‰‰ü‰‚ü‰{ü‰tü‰mü‰fü‰_ü‰Xü‰Qü‰Jü‰Cü‰<ü‰5ü‰.ü‰'ü‰ ü‰ü‰ü‰ ü‰ü‰ýû‰öû‰ïû‰èû‰áû‰Úû‰Óû‰Ìû‰Åû‰¾û‰·û‰°û‰©û‰¢û‰›û‰”û‰û‰†û‰û‰xû‰qû‰jû‰cû‰\û‰Uû‰Nû‰Gû‰@û‰9û‰2û‰+û‰$û‰û‰û‰û‰û‰û‰úú‰óú‰ìú‰åú‰Þú‰×ú‰Ðú‰Éú‰Âú‰»ú‰´ú‰­ú‰¦ú‰Ÿú‰˜ú‰‘ú‰Šú‰ƒú‰|ú‰uú‰nú‰gú‰`ú‰Yú‰Rú‰Kú‰Dú‰=ú‰6ú‰/ú‰(ú‰!ú‰ú‰ú‰ ú‰ú‰þù‰÷ù‰ðù‰éù‰âù‰Ûù‰Ôù‰Íù‰Æù‰¿ù‰¸ù‰±ù‰ªù‰£ù‰œù‰•ù‰Žù‰‡ù‰€ù‰yù‰rù‰kù‰dù‰]ù‰Vù‰Où‰Hù‰Aù‰:ù‰3ù‰,ù‰%ù‰ù‰ù‰ù‰ ù‰ù‰ûø‰ôø‰íø‰æø‰ßø‰Øø‰Ñø‰Êø‰Ãø‰¼ø‰µø‰®ø‰§ø‰ ø‰™ø‰’ø‰‹ø‰„ø‰}ø‰vø‰oø‰hø‰aø‰Zø‰Sø‰Lø‰Eø‰>ø‰7ø‰0ø‰)ø‰"ø‰ø‰ø‰ ø‰ø‰ÿ÷‰ø÷‰ñ÷‰ê÷‰ã÷‰Ü÷‰Õ÷‰Î÷‰Ç÷‰À÷‰¹÷‰²÷‰«÷‰¤÷‰÷‰–÷‰÷‰ˆ÷‰÷‰z÷‰s÷‰l÷‰e÷‰^÷‰W÷‰P÷‰I÷‰B÷‰;÷‰4÷‰-÷‰&÷‰÷‰÷‰÷‰ ÷‰÷‰üö‰õö‰îö‰çö‰àö‰Ùö‰Òö‰Ëö‰Äö‰½ö‰¶ö‰¯ö‰¨ö‰¡ö‰šö‰“ö‰Œö‰…ö‰~ö‰wö‰pö‰iö‰bö‰[ö‰Tö‰Mö‰Fö‰?ö‰8ö‰1ö‰*ö‰#ö‰ö‰ö‰ö‰ö‰ö‰ùõ‰òõ‰ëõ‰äõ‰Ýõ‰Öõ‰Ïõ‰Èõ‰Áõ‰ºõ‰³õ‰¬õ‰¥õ‰žõ‰—õ‰õ‰‰õ‰‚õ‰{õ‰tõ‰mõ‰fõ‰_õ‰Xõ‰Qõ‰Jõ‰Cõ‰<õ‰5õ‰.õ‰'õ‰ õ‰õ‰õ‰ õ‰õ‰ýô‰öô‰ïô‰èô‰áô‰Úô‰Óô‰Ìô‰Åô‰¾ô‰·ô‰°ô‰©ô‰¢ô‰›ô‰”ô‰ô‰†ô‰ô‰xô‰qô‰jô‰cô‰\ô‰Uô‰Nô‰Gô‰@ô‰9ô‰2ô‰+ô‰$ô‰ô‰ô‰ô‰ô‰ô‰úó‰óó‰ìó‰åó‰Þó‰×ó‰Ðó‰Éó‰Âó‰»ó‰´ó‰­ó‰¦ó‰Ÿó‰˜ó‰‘ó‰Šó‰ƒó‰|ó‰uó‰nó‰gó‰`ó‰Yó‰Ró‰Kó‰Dó‰=ó‰6ó‰/ó‰(ó‰!ó‰ó‰ó‰ ó‰ó‰þò‰÷ò‰ðò‰éò‰âò‰Ûò‰Ôò‰Íò‰Æò‰¿ò‰¸ò‰±ò‰ªò‰£ò‰œò‰•ò‰Žò‰‡ò‰€ò‰yò‰rò‰kò‰dò‰]ò‰Vò‰Oò‰Hò‰Aò‰:ò‰3ò‰,ò‰%ò‰ò‰ò‰ò‰ ò‰ò‰ûñ‰ôñ‰íñ‰æñ‰ßñ‰Øñ‰Ññ‰Êñ‰Ãñ‰¼ñ‰µñ‰®ñ‰§ñ‰ ñ‰™ñ‰’ñ‰‹ñ‰„ñ‰}ñ‰vñ‰oñ‰hñ‰añ‰Zñ‰Sñ‰Lñ‰Eñ‰>ñ‰7ñ‰0ñ‰)ñ‰"ñ‰ñ‰ñ‰ ñ‰ñ‰ÿð‰øð‰ñð‰êð‰ãð‰Üð‰Õð‰Îð‰Çð‰Àð‰¹ð‰²ð‰«ð‰¤ð‰ð‰–ð‰ð‰ˆð‰ð‰zð‰sð‰lð‰eð‰^ð‰Wð‰Pð‰Ið‰Bð‰;ð‰4ð‰-ð‰&ð‰ð‰ð‰ð‰ ð‰ð‰üï‰õï‰îï‰çï‰àï‰Ùï‰Òï‰Ëï‰Äï‰~ï‰wï‰pï‰iï‰bï‰[ï‰Tï‰Mï‰Fï‰?ï‰8ï‰1ï‰*ï‰#ï‰ï‰ï‰ï‰ï‰ï‰ùî‰òî‰ëî‰äî‰Ýî‰Öî‰Ïî‰Èî‰Áî‰î‰‰î‰‚î‰{î‰tî‰mî‰fî‰_î‰Xî‰Qî‰Jî‰Cî‰<î‰5î‰.î‰'î‰ î‰î‰î‰ î‰î‰ýí‰öí‰ïí‰èí‰áí‰Úí‰Óí‰Ìí‰Å퉾퉷퉰퉩퉢퉛퉔í‰í‰†í‰í‰xí‰qí‰jí‰cí‰\í‰Uí‰Ní‰Gí‰@í‰9í‰2í‰+í‰$í‰í‰í‰í‰í‰í‰úì‰óì‰ìì‰åì‰Þì‰×ì‰Ðì‰Éì‰Â쉻쉴쉭쉦쉟쉘쉑쉊쉃ì‰|ì‰uì‰nì‰gì‰`ì‰Yì‰Rì‰Kì‰Dì‰=ì‰6ì‰/ì‰(ì‰!ì‰ì‰ì‰ ì‰ì‰þë‰÷ë‰ðë‰éë‰âë‰Ûë‰Ôë‰Íë‰Æë‰¿ë‰¸ë‰±ë‰ªë‰£ë‰œë‰•ë‰Žë‰‡ë‰€ë‰yë‰rë‰kë‰dë‰]ë‰Vë‰Oë‰Hë‰Aë‰:ë‰3ë‰,ë‰%ë‰ë‰ë‰ë‰ ë‰ë‰ûê‰ôê‰íê‰æê‰ßê‰Øê‰Ñê‰Êê‰Ãꉼꉵꉮꉧꉠꉙꉒꉋꉄê‰}ê‰vê‰oê‰hê‰aê‰Zê‰Sê‰Lê‰Eê‰>ê‰7ê‰0ê‰)ê‰"ê‰ê‰ê‰ ê‰ê‰ÿ鉸é‰ñé‰êé‰ãé‰Üé‰Õé‰Îé‰Çé‰À鉹鉲鉫鉤é‰é‰–é‰é‰ˆé‰é‰zé‰sé‰lé‰eé‰^é‰Wé‰Pé‰Ié‰Bé‰;é‰4é‰-é‰&é‰é‰é‰é‰ é‰é‰üè‰õè‰îè‰çè‰àè‰Ùè‰Òè‰Ëè‰Ä艽艶良艨艡艚艓艌艅è‰~è‰wè‰pè‰iè‰bè‰[è‰Tè‰Mè‰Fè‰?è‰8è‰1è‰*è‰#è‰è‰è‰è‰è‰è‰ùç‰òç‰ëç‰äç‰Ýç‰Öç‰Ïç‰Èç‰Á牺牳牬牥牞牗ç‰ç‰‰ç‰‚ç‰{ç‰tç‰mç‰fç‰_ç‰Xç‰Qç‰Jç‰Cç‰<ç‰5ç‰.ç‰'ç‰ ç‰ç‰ç‰ ç‰ç‰ýæ‰öæ‰ïæ‰èæ‰áæ‰Úæ‰Óæ‰Ìæ‰Åæ‰¾æ‰·æ‰°æ‰©æ‰¢æ‰›æ‰”æ‰æ‰†æ‰æ‰xæ‰qæ‰jæ‰cæ‰\æ‰Uæ‰Næ‰Gæ‰@æ‰9æ‰2æ‰+æ‰$æ‰æ‰æ‰æ‰æ‰æ‰úå‰óå‰ìå‰åå‰Þå‰×å‰Ðå‰Éå‰Â剻剴剭剦剟剘剑削剃å‰|å‰uå‰nå‰gå‰`å‰Yå‰Rå‰Kå‰Då‰=å‰6å‰/å‰(å‰!å‰å‰å‰ å‰å‰þä‰÷ä‰ðä‰éä‰âä‰Ûä‰Ôä‰Íä‰Æä‰¿ä‰¸ä‰±ä‰ªä‰£ä‰œä‰•ä‰Žä‰‡ä‰€ä‰yä‰rä‰kä‰dä‰]ä‰Vä‰Oä‰Hä‰Aä‰:ä‰3ä‰,ä‰%ä‰ä‰ä‰ä‰ ä‰ä‰ûã‰ôã‰íã‰æã‰ßã‰Øã‰Ñã‰Êã‰Ã㉼㉵㉮㉧㉠㉙㉒㉋㉄ã‰}ã‰vã‰oã‰hã‰aã‰Zã‰Sã‰Lã‰Eã‰>ã‰7ã‰0ã‰)ã‰"ã‰ã‰ã‰ ã‰ã‰ÿâ‰øâ‰ñâ‰êâ‰ãâ‰Üâ‰Õâ‰Îâ‰Çâ‰À≹≲≫≤â‰â‰–â‰â‰ˆâ‰â‰zâ‰sâ‰lâ‰eâ‰^â‰Wâ‰Pâ‰Iâ‰Bâ‰;â‰4â‰-â‰&â‰â‰â‰â‰ â‰â‰üá‰õá‰îá‰çá‰àá‰Ùá‰Òá‰Ëá‰Äችቶቯቨቡቚቓቌቅá‰~á‰wá‰pá‰iá‰bá‰[á‰Tá‰Má‰Fá‰?á‰8á‰1á‰*á‰#á‰á‰á‰á‰á‰á‰ùà‰òà‰ëà‰äà‰Ýà‰Öà‰Ïà‰Èà‰Áà‰ºà‰³à‰¬à‰¥à‰žà‰—à‰à‰‰à‰‚à‰{à‰tà‰mà‰fà‰_à‰Xà‰Qà‰Jà‰Cà‰<à‰5à‰.à‰'à‰ à‰à‰à‰ à‰à‰ý߉ö߉ï߉è߉á߉Ú߉Ó߉Ì߉Å߉¾ß‰·ß‰°ß‰©ß‰¢ß‰›ß‰”߉߉†ß‰߉x߉q߉j߉c߉\߉U߉N߉G߉@߉9߉2߉+߉$߉߉߉߉߉߉úÞ‰óÞ‰ìÞ‰åÞ‰ÞÞ‰×Þ‰ÐÞ‰ÉÞ‰ÂÞ‰»Þ‰´Þ‰­Þ‰¦Þ‰ŸÞ‰˜Þ‰‘Þ‰ŠÞ‰ƒÞ‰|Þ‰uÞ‰nÞ‰gÞ‰`Þ‰YÞ‰RÞ‰KÞ‰DÞ‰=Þ‰6Þ‰/Þ‰(Þ‰!Þ‰Þ‰Þ‰ Þ‰Þ‰þ݉÷݉ð݉é݉â݉Û݉Ô݉Í݉ÆÝ‰¿Ý‰¸Ý‰±Ý‰ªÝ‰£Ý‰œÝ‰•݉ŽÝ‰‡Ý‰€Ý‰y݉r݉k݉d݉]݉V݉O݉H݉A݉:݉3݉,݉%݉݉݉݉ ݉݉û܉ô܉í܉æÜ‰ß܉ØÜ‰Ñ܉Ê܉Ã܉¼Ü‰µÜ‰®Ü‰§Ü‰ Ü‰™Ü‰’܉‹Ü‰„܉}܉v܉o܉h܉a܉Z܉S܉L܉E܉>܉7܉0܉)܉"܉܉܉ ܉܉ÿÛ‰øÛ‰ñÛ‰êÛ‰ãÛ‰ÜÛ‰ÕÛ‰ÎÛ‰ÇÛ‰ÀÛ‰¹Û‰²Û‰«Û‰¤Û‰Û‰–Û‰Û‰ˆÛ‰Û‰zÛ‰sÛ‰lÛ‰eÛ‰^Û‰WÛ‰PÛ‰IÛ‰BÛ‰;Û‰4Û‰-Û‰&Û‰Û‰Û‰Û‰ Û‰Û‰üÚ‰õÚ‰îÚ‰çÚ‰àÚ‰ÙÚ‰ÒÚ‰ËÚ‰ÄÚ‰½Ú‰¶Ú‰¯Ú‰¨Ú‰¡Ú‰šÚ‰“Ú‰ŒÚ‰…Ú‰~Ú‰wÚ‰pÚ‰iÚ‰bÚ‰[Ú‰TÚ‰MÚ‰FÚ‰?Ú‰8Ú‰1Ú‰*Ú‰#Ú‰Ú‰Ú‰Ú‰Ú‰Ú‰ùÙ‰òÙ‰ëÙ‰äÙ‰ÝÙ‰ÖÙ‰ÏÙ‰ÈÙ‰ÁÙ‰ºÙ‰³Ù‰¬Ù‰¥Ù‰žÙ‰—ىى‰Ù‰‚Ù‰{Ù‰tÙ‰mÙ‰fÙ‰_Ù‰XÙ‰QÙ‰JÙ‰CÙ‰<Ù‰5Ù‰.Ù‰'Ù‰ ىىى ىىý؉ö؉ïØ‰èØ‰áØ‰ÚØ‰ÓØ‰ÌØ‰Å؉¾Ø‰·Ø‰°Ø‰©Ø‰¢Ø‰›Ø‰”؉؉†Ø‰؉x؉q؉j؉c؉\؉U؉N؉G؉@؉9؉2؉+؉$؉؉؉؉؉؉ú׉ó׉ì׉å׉Þ׉×׉Ð׉É׉Â׉»×‰´×‰­×‰¦×‰Ÿ×‰˜×‰‘׉Š×‰ƒ×‰|׉u׉n׉g׉`׉Y׉R׉K׉D׉=׉6׉/׉(׉!׉׉׉ ׉׉þÖ‰÷Ö‰ðÖ‰éÖ‰âÖ‰ÛÖ‰ÔÖ‰ÍÖ‰ÆÖ‰¿Ö‰¸Ö‰±Ö‰ªÖ‰£Ö‰œÖ‰•Ö‰ŽÖ‰‡Ö‰€Ö‰yÖ‰rÖ‰kÖ‰dÖ‰]Ö‰VÖ‰OÖ‰HÖ‰AÖ‰:Ö‰3Ö‰,Ö‰%Ö‰Ö‰Ö‰Ö‰ Ö‰Ö‰ûÕ‰ôÕ‰íÕ‰æÕ‰ßÕ‰ØÕ‰ÑÕ‰ÊÕ‰ÃÕ‰¼Õ‰µÕ‰®Õ‰§Õ‰ Õ‰™Õ‰’Õ‰‹Õ‰„Õ‰}Õ‰vÕ‰oÕ‰hÕ‰aÕ‰ZÕ‰SÕ‰LÕ‰EÕ‰>Õ‰7Õ‰0Õ‰)Õ‰"Õ‰Õ‰Õ‰ Õ‰Õ‰ÿÔ‰øÔ‰ñÔ‰êÔ‰ãÔ‰ÜÔ‰ÕÔ‰ÎÔ‰ÇÔ‰ÀÔ‰¹Ô‰²Ô‰«Ô‰¤Ô‰Ô‰–Ô‰Ô‰ˆÔ‰Ô‰zÔ‰sÔ‰lÔ‰eÔ‰^Ô‰WÔ‰PÔ‰IÔ‰BÔ‰;Ô‰4Ô‰-Ô‰&Ô‰Ô‰Ô‰Ô‰ Ô‰Ô‰üÓ‰õÓ‰îÓ‰çÓ‰àÓ‰ÙÓ‰ÒÓ‰ËÓ‰ÄÓ‰½Ó‰¶Ó‰¯Ó‰¨Ó‰¡Ó‰šÓ‰“Ó‰ŒÓ‰…Ó‰~Ó‰wÓ‰pÓ‰iÓ‰bÓ‰[Ó‰TÓ‰MÓ‰FÓ‰?Ó‰8Ó‰1Ó‰*Ó‰#Ó‰Ó‰Ó‰Ó‰Ó‰Ó‰ùÒ‰òÒ‰ëÒ‰äÒ‰ÝÒ‰ÖÒ‰ÏÒ‰ÈÒ‰ÁÒ‰ºÒ‰³Ò‰¬Ò‰¥Ò‰žÒ‰—Ò‰Ò‰‰Ò‰‚Ò‰{Ò‰tÒ‰mÒ‰fÒ‰_Ò‰XÒ‰QÒ‰JÒ‰CÒ‰<Ò‰5Ò‰.Ò‰'Ò‰ Ò‰Ò‰Ò‰ Ò‰Ò‰ýщöщïщèщáщÚщÓщÌщÅщ¾Ñ‰·Ñ‰°Ñ‰©Ñ‰¢Ñ‰›Ñ‰”щщ†Ñ‰щxщqщjщcщ\щUщNщGщ@щ9щ2щ+щ$щщщщщщúЉóЉìЉåЉÞЉ×ЉÐЉÉЉÂЉ»Ð‰´Ð‰­Ð‰¦Ð‰ŸÐ‰˜Ð‰‘ЉŠÐ‰ƒÐ‰|ЉuЉnЉgЉ`ЉYЉRЉKЉDЉ=Љ6Љ/Љ(Љ!ЉЉЉ ЉЉþω÷ωðωéωâωÛωÔωÍωÆÏ‰¿Ï‰¸Ï‰±Ï‰ªÏ‰£Ï‰œÏ‰•ωŽÏ‰‡Ï‰€Ï‰yωrωkωdω]ωVωOωHωAω:ω3ω,ω%ωωωω ωωûΉôΉíΉæÎ‰ßΉØÎ‰ÑΉÊΉÃΉ¼Î‰µÎ‰®Î‰§Î‰ Î‰™Î‰’Ή‹Î‰„Ή}ΉvΉoΉhΉaΉZΉSΉLΉEΉ>Ή7Ή0Ή)Ή"ΉΉΉ ΉΉÿ͉øÍ‰ñ͉ê͉ã͉Ü͉Õ͉Î͉Ç͉À͉¹Í‰²Í‰«Í‰¤Í‰͉–͉͉ˆÍ‰͉z͉s͉l͉e͉^͉W͉P͉I͉B͉;͉4͉-͉&͉͉͉͉ ͉͉ü̉õ̉î̉ç̉à̉Ù̉Ò̉Ë̉Ä̉½Ì‰¶Ì‰¯Ì‰¨Ì‰¡Ì‰šÌ‰“̉ŒÌ‰…̉~̉w̉p̉ỉb̉[̉T̉M̉F̉?̉8̉1̉*̉#̉̉̉̉̉̉ùˉòˉëˉäˉÝˉÖˉÏˉÈˉÁˉºË‰³Ë‰¬Ë‰¥Ë‰žË‰—ˉˉ‰Ë‰‚ˉ{ˉtˉmˉfˉ_ˉXˉQˉJˉCˉ<ˉ5ˉ.ˉ'ˉ ˉˉˉ ˉˉýʉöʉïʉèʉáʉÚʉÓʉÌʉÅʉ¾Ê‰·Ê‰°Ê‰©Ê‰¢Ê‰›Ê‰”ʉʉ†Ê‰ʉxʉqʉjʉcʉ\ʉUʉNʉGʉ@ʉ9ʉ2ʉ+ʉ$ʉʉʉʉʉʉúɉóɉìɉåɉÞɉ×ɉÐɉÉɉÂɉ»É‰´É‰­É‰¦É‰ŸÉ‰˜É‰‘ɉŠÉ‰ƒÉ‰|ɉuɉnɉgɉ`ɉYɉRɉKɉDɉ=ɉ6ɉ/ɉ(ɉ!ɉɉɉ ɉɉþȉ÷ȉðȉéȉâȉÛȉÔȉÍȉÆÈ‰¿È‰¸È‰±È‰ªÈ‰£È‰œÈ‰•ȉŽÈ‰‡È‰€È‰yȉrȉkȉdȉ]ȉVȉOȉHȉAȉ:ȉ3ȉ,ȉ%ȉȉȉȉ ȉȉûljôljíljæÇ‰ßljØÇ‰ÑljÊljÃlj¼Ç‰µÇ‰®Ç‰§Ç‰ Ç‰™Ç‰’lj‹Ç‰„lj}ljvljoljhljaljZljSljLljElj>lj7lj0lj)lj"ljljlj ljljÿƉøÆ‰ñƉêÆ‰ãÆ‰ÜÆ‰ÕÆ‰ÎÆ‰ÇƉÀƉ¹Æ‰²Æ‰«Æ‰¤Æ‰Ɖ–ƉƉˆÆ‰ƉzƉsƉlƉeƉ^ƉWƉPƉIƉBƉ;Ɖ4Ɖ-Ɖ&ƉƉƉƉ ƉƉüʼnõʼnîʼnçʼnàʼnÙʼnÒʼnËʼnÄʼn½Å‰¶Å‰¯Å‰¨Å‰¡Å‰šÅ‰“ʼnŒÅ‰…ʼn~ʼnwʼnpʼniʼnbʼn[ʼnTʼnMʼnFʼn?ʼn8ʼn1ʼn*ʼn#ʼnʼnʼnʼnʼnʼnùĉòĉëĉäĉÝĉÖĉÏĉÈĉÁĉºÄ‰³Ä‰¬Ä‰¥Ä‰žÄ‰—ĉĉ‰Ä‰‚ĉ{ĉtĉmĉfĉ_ĉXĉQĉJĉCĉ<ĉ5ĉ.ĉ'ĉ ĉĉĉ ĉĉýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛÉ”ÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉú‰ó‰ì‰å‰Þ‰׉Љɉ‰»Â‰´Â‰­Â‰¦Â‰ŸÂ‰˜Â‰‘‰ŠÂ‰ƒÂ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þÁ‰÷Á‰ðÁ‰éÁ‰âÁ‰ÛÁ‰ÔÁ‰ÍÁ‰ÆÁ‰¿Á‰¸Á‰±Á‰ªÁ‰£Á‰œÁ‰•Á‰ŽÁ‰‡Á‰€Á‰yÁ‰rÁ‰kÁ‰dÁ‰]Á‰VÁ‰OÁ‰HÁ‰AÁ‰:Á‰3Á‰,Á‰%Á‰Á‰Á‰Á‰ Á‰Á‰ûÀ‰ôÀ‰íÀ‰æÀ‰ßÀ‰ØÀ‰ÑÀ‰ÊÀ‰ÃÀ‰¼À‰µÀ‰®À‰§À‰ À‰™À‰’À‰‹À‰„À‰}À‰vÀ‰oÀ‰hÀ‰aÀ‰ZÀ‰SÀ‰LÀ‰EÀ‰>À‰7À‰0À‰)À‰"À‰À‰À‰ À‰À‰ÿ¿‰ø¿‰ñ¿‰꿉㿉Ü¿‰Õ¿‰ο‰Ç¿‰À¿‰¹¿‰²¿‰«¿‰¤¿‰¿‰–¿‰¿‰ˆ¿‰¿‰z¿‰s¿‰l¿‰e¿‰^¿‰W¿‰P¿‰I¿‰B¿‰;¿‰4¿‰-¿‰&¿‰¿‰¿‰¿‰ ¿‰¿‰ü¾‰õ¾‰羉ྉÙ¾‰Ò¾‰˾‰ľ‰½¾‰¶¾‰¯¾‰¨¾‰¡¾‰š¾‰“¾‰Œ¾‰…¾‰~¾‰w¾‰p¾‰i¾‰b¾‰[¾‰T¾‰M¾‰F¾‰?¾‰8¾‰1¾‰*¾‰#¾‰¾‰¾‰¾‰¾‰¾‰ù½‰ò½‰뽉佉ݽ‰Ö½‰Ͻ‰Ƚ‰Á½‰º½‰³½‰¬½‰¥½‰ž½‰—½‰½‰‰½‰‚½‰{½‰t½‰m½‰f½‰_½‰X½‰Q½‰J½‰C½‰<½‰5½‰.½‰'½‰ ½‰½‰½‰ ½‰½‰ý¼‰ö¼‰)載ἉÚ¼‰Ó¼‰̼‰ż‰¾¼‰·¼‰°¼‰©¼‰¢¼‰›¼‰”¼‰¼‰†¼‰¼‰x¼‰q¼‰j¼‰c¼‰\¼‰U¼‰N¼‰G¼‰@¼‰9¼‰2¼‰+¼‰$¼‰¼‰¼‰¼‰¼‰¼‰ú»‰ó»‰컉廉Þ»‰×»‰л‰É»‰»‰»»‰´»‰­»‰¦»‰Ÿ»‰˜»‰‘»‰Š»‰ƒ»‰|»‰u»‰n»‰g»‰`»‰Y»‰R»‰K»‰D»‰=»‰6»‰/»‰(»‰!»‰»‰»‰ »‰»‰þº‰÷º‰ðº‰麉⺉Ûº‰Ôº‰ͺ‰ƺ‰¿º‰¸º‰±º‰ªº‰£º‰œº‰•º‰Žº‰‡º‰€º‰yº‰rº‰kº‰dº‰]º‰Vº‰Oº‰Hº‰Aº‰:º‰3º‰,º‰%º‰º‰º‰º‰ º‰º‰û¹‰ô¹‰í¹‰湉ß¹‰ع‰ѹ‰ʹ‰ù‰¼¹‰µ¹‰®¹‰§¹‰ ¹‰™¹‰’¹‰‹¹‰„¹‰}¹‰v¹‰o¹‰h¹‰a¹‰Z¹‰S¹‰L¹‰E¹‰>¹‰7¹‰0¹‰)¹‰"¹‰¹‰¹‰ ¹‰¹‰ÿ¸‰ø¸‰ñ¸‰급㸉ܸ‰Õ¸‰θ‰Ǹ‰À¸‰¹¸‰²¸‰«¸‰¤¸‰¸‰–¸‰¸‰ˆ¸‰¸‰z¸‰s¸‰l¸‰e¸‰^¸‰W¸‰P¸‰I¸‰B¸‰;¸‰4¸‰-¸‰&¸‰¸‰¸‰¸‰ ¸‰¸‰ü·‰õ·‰î·‰ç·‰à·‰Ù·‰Ò·‰Ë·‰Ä·‰½·‰¶·‰¯·‰¨·‰¡·‰š·‰“·‰Œ·‰…·‰~·‰w·‰p·‰i·‰b·‰[·‰T·‰M·‰F·‰?·‰8·‰1·‰*·‰#·‰·‰·‰·‰·‰·‰ù¶‰ò¶‰붉䶉ݶ‰Ö¶‰϶‰ȶ‰Á¶‰º¶‰³¶‰¬¶‰¥¶‰ž¶‰—¶‰¶‰‰¶‰‚¶‰{¶‰t¶‰m¶‰f¶‰_¶‰X¶‰Q¶‰J¶‰C¶‰<¶‰5¶‰.¶‰'¶‰ ¶‰¶‰¶‰ ¶‰¶‰ýµ‰öµ‰﵉赉ᵉÚµ‰Óµ‰̵‰ŵ‰¾µ‰·µ‰°µ‰©µ‰¢µ‰›µ‰”µ‰µ‰†µ‰µ‰xµ‰qµ‰jµ‰cµ‰\µ‰Uµ‰Nµ‰Gµ‰@µ‰9µ‰2µ‰+µ‰$µ‰µ‰µ‰µ‰µ‰µ‰ú´‰ó´‰ì´‰å´‰Þ´‰×´‰д‰É´‰´‰»´‰´´‰­´‰¦´‰Ÿ´‰˜´‰‘´‰Š´‰ƒ´‰|´‰u´‰n´‰g´‰`´‰Y´‰R´‰K´‰D´‰=´‰6´‰/´‰(´‰!´‰´‰´‰ ´‰´‰þ³‰÷³‰ð³‰鳉ⳉÛ³‰Ô³‰ͳ‰Ƴ‰¿³‰¸³‰±³‰ª³‰£³‰œ³‰•³‰޳‰‡³‰€³‰y³‰r³‰k³‰d³‰]³‰V³‰O³‰H³‰A³‰:³‰3³‰,³‰%³‰³‰³‰³‰ ³‰³‰û²‰ô²‰í²‰沉ß²‰ز‰Ѳ‰ʲ‰ò‰¼²‰µ²‰®²‰§²‰ ²‰™²‰’²‰‹²‰„²‰}²‰v²‰o²‰h²‰a²‰Z²‰S²‰L²‰E²‰>²‰7²‰0²‰)²‰"²‰²‰²‰ ²‰²‰ÿ±‰ø±‰ñ±‰걉㱉ܱ‰Õ±‰α‰DZ‰À±‰¹±‰²±‰«±‰¤±‰±‰–±‰±‰ˆ±‰±‰z±‰s±‰l±‰e±‰^±‰W±‰P±‰I±‰B±‰;±‰4±‰-±‰&±‰±‰±‰±‰ ±‰±‰ü°‰õ°‰î°‰ç°‰à°‰Ù°‰Ò°‰˰‰݉½°‰¶°‰¯°‰¨°‰¡°‰š°‰“°‰Œ°‰…°‰~°‰w°‰p°‰i°‰b°‰[°‰T°‰M°‰F°‰?°‰8°‰1°‰*°‰#°‰°‰°‰°‰°‰°‰ù¯‰ò¯‰믉䯉ݯ‰Ö¯‰ϯ‰ȯ‰Á¯‰º¯‰³¯‰¬¯‰¥¯‰ž¯‰—¯‰¯‰‰¯‰‚¯‰{¯‰t¯‰m¯‰f¯‰_¯‰X¯‰Q¯‰J¯‰C¯‰<¯‰5¯‰.¯‰'¯‰ ¯‰¯‰¯‰ ¯‰¯‰ý®‰ö®‰ﮉ讉ᮉÚ®‰Ó®‰Ì®‰Å®‰¾®‰·®‰°®‰©®‰¢®‰›®‰”®‰®‰†®‰®‰x®‰q®‰j®‰c®‰\®‰U®‰N®‰G®‰@®‰9®‰2®‰+®‰$®‰®‰®‰®‰®‰®‰ú­‰ó­‰ì­‰å­‰Þ­‰×­‰Э‰É­‰­‰»­‰´­‰­­‰¦­‰Ÿ­‰˜­‰‘­‰Š­‰ƒ­‰|­‰u­‰n­‰g­‰`­‰Y­‰R­‰K­‰D­‰=­‰6­‰/­‰(­‰!­‰­‰­‰ ­‰­‰þ¬‰÷¬‰ð¬‰鬉⬉Û¬‰Ô¬‰ͬ‰Ƭ‰¿¬‰¸¬‰±¬‰ª¬‰£¬‰œ¬‰•¬‰ެ‰‡¬‰€¬‰y¬‰r¬‰k¬‰d¬‰]¬‰V¬‰O¬‰H¬‰A¬‰:¬‰3¬‰,¬‰%¬‰¬‰¬‰¬‰ ¬‰¬‰û«‰ô«‰í«‰櫉ß«‰Ø«‰Ñ«‰Ê«‰ë‰¼«‰µ«‰®«‰§«‰ «‰™«‰’«‰‹«‰„«‰}«‰v«‰o«‰h«‰a«‰Z«‰S«‰L«‰E«‰>«‰7«‰0«‰)«‰"«‰«‰«‰ «‰«‰ÿª‰øª‰ñª‰ꪉ㪉ܪ‰Õª‰Ϊ‰Ǫ‰Àª‰¹ª‰²ª‰«ª‰¤ª‰ª‰–ª‰ª‰ˆª‰ª‰zª‰sª‰lª‰eª‰^ª‰Wª‰Pª‰Iª‰Bª‰;ª‰4ª‰-ª‰&ª‰ª‰ª‰ª‰ ª‰ª‰ü©‰õ©‰穉੉Ù©‰Ò©‰Ë©‰Ä©‰½©‰¶©‰¯©‰¨©‰¡©‰š©‰“©‰Œ©‰…©‰~©‰w©‰p©‰i©‰b©‰[©‰T©‰M©‰F©‰?©‰8©‰1©‰*©‰#©‰©‰©‰©‰©‰©‰ù¨‰ò¨‰먉䨉ݨ‰Ö¨‰Ϩ‰Ȩ‰Á¨‰º¨‰³¨‰¬¨‰¥¨‰ž¨‰—¨‰¨‰‰¨‰‚¨‰{¨‰t¨‰m¨‰f¨‰_¨‰X¨‰Q¨‰J¨‰C¨‰<¨‰5¨‰.¨‰'¨‰ ¨‰¨‰¨‰ ¨‰¨‰ý§‰ö§‰柳觉ᧉÚ§‰Ó§‰̧‰ŧ‰¾§‰·§‰°§‰©§‰¢§‰›§‰”§‰§‰†§‰§‰x§‰q§‰j§‰c§‰\§‰U§‰N§‰G§‰@§‰9§‰2§‰+§‰$§‰§‰§‰§‰§‰§‰ú¦‰ó¦‰즉妉Þ¦‰צ‰Ц‰ɦ‰¦‰»¦‰´¦‰­¦‰¦¦‰Ÿ¦‰˜¦‰‘¦‰Ц‰ƒ¦‰|¦‰u¦‰n¦‰g¦‰`¦‰Y¦‰R¦‰K¦‰D¦‰=¦‰6¦‰/¦‰(¦‰!¦‰¦‰¦‰ ¦‰¦‰þ¥‰÷¥‰ð¥‰饉⥉Û¥‰Ô¥‰Í¥‰Æ¥‰¿¥‰¸¥‰±¥‰ª¥‰£¥‰œ¥‰•¥‰Ž¥‰‡¥‰€¥‰y¥‰r¥‰k¥‰d¥‰]¥‰V¥‰O¥‰H¥‰A¥‰:¥‰3¥‰,¥‰%¥‰¥‰¥‰¥‰ ¥‰¥‰û¤‰ô¤‰í¤‰椉ߤ‰ؤ‰Ѥ‰ʤ‰ä‰¼¤‰µ¤‰®¤‰§¤‰ ¤‰™¤‰’¤‰‹¤‰„¤‰}¤‰v¤‰o¤‰h¤‰a¤‰Z¤‰S¤‰L¤‰E¤‰>¤‰7¤‰0¤‰)¤‰"¤‰¤‰¤‰ ¤‰¤‰ÿ£‰ø£‰ñ£‰꣉㣉Ü£‰Õ£‰Σ‰Ç£‰À£‰¹£‰²£‰«£‰¤£‰£‰–£‰£‰ˆ£‰£‰z£‰s£‰l£‰e£‰^£‰W£‰P£‰I£‰B£‰;£‰4£‰-£‰&£‰£‰£‰£‰ £‰£‰ü¢‰õ¢‰碉ࢉÙ¢‰Ò¢‰Ë¢‰Ä¢‰½¢‰¶¢‰¯¢‰¨¢‰¡¢‰š¢‰“¢‰Œ¢‰…¢‰~¢‰w¢‰p¢‰i¢‰b¢‰[¢‰T¢‰M¢‰F¢‰?¢‰8¢‰1¢‰*¢‰#¢‰¢‰¢‰¢‰¢‰¢‰ù¡‰ò¡‰롉䡉Ý¡‰Ö¡‰Ï¡‰È¡‰Á¡‰º¡‰³¡‰¬¡‰¥¡‰ž¡‰—¡‰¡‰‰¡‰‚¡‰{¡‰t¡‰m¡‰f¡‰_¡‰X¡‰Q¡‰J¡‰C¡‰<¡‰5¡‰.¡‰'¡‰ ¡‰¡‰¡‰ ¡‰¡‰ý ‰ö ‰ï ‰è ‰á ‰Ú ‰Ó ‰Ì ‰Å ‰¾ ‰· ‰° ‰© ‰¢ ‰› ‰” ‰ ‰† ‰ ‰x ‰q ‰j ‰c ‰\ ‰U ‰N ‰G ‰@ ‰9 ‰2 ‰+ ‰$ ‰ ‰ ‰ ‰ ‰ ‰úŸ‰óŸ‰쟉埉ÞŸ‰ן‰П‰ÉŸ‰Ÿ‰»Ÿ‰´Ÿ‰­Ÿ‰¦Ÿ‰ŸŸ‰˜Ÿ‰‘Ÿ‰ŠŸ‰ƒŸ‰|Ÿ‰uŸ‰nŸ‰gŸ‰`Ÿ‰YŸ‰RŸ‰KŸ‰DŸ‰=Ÿ‰6Ÿ‰/Ÿ‰(Ÿ‰!Ÿ‰Ÿ‰Ÿ‰ Ÿ‰Ÿ‰þž‰÷ž‰ðž‰鞉➉Ûž‰Ôž‰Íž‰Æž‰¿ž‰¸ž‰±ž‰ªž‰£ž‰œž‰•ž‰Žž‰‡ž‰€ž‰yž‰rž‰kž‰dž‰]ž‰Vž‰Ož‰Hž‰Až‰:ž‰3ž‰,ž‰%ž‰ž‰ž‰ž‰ ž‰ž‰û‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿœ‰øœ‰ñœ‰꜉㜉Üœ‰Õœ‰Μ‰Çœ‰Àœ‰¹œ‰²œ‰«œ‰¤œ‰œ‰–œ‰œ‰ˆœ‰œ‰zœ‰sœ‰lœ‰eœ‰^œ‰Wœ‰Pœ‰Iœ‰Bœ‰;œ‰4œ‰-œ‰&œ‰œ‰œ‰œ‰ œ‰œ‰ü›‰õ›‰盉à›‰Ù›‰Ò›‰Ë›‰Ä›‰½›‰¶›‰¯›‰¨›‰¡›‰š›‰“›‰Œ›‰…›‰~›‰w›‰p›‰i›‰b›‰[›‰T›‰M›‰F›‰?›‰8›‰1›‰*›‰#›‰›‰›‰›‰›‰›‰ùš‰òš‰뚉䚉Ýš‰Öš‰Ïš‰Èš‰Áš‰ºš‰³š‰¬š‰¥š‰žš‰—š‰š‰‰š‰‚š‰{š‰tš‰mš‰fš‰_š‰Xš‰Qš‰Jš‰Cš‰<š‰5š‰.š‰'š‰ š‰š‰š‰ š‰š‰ý™‰ö™‰虉ᙉÚ™‰Ó™‰Ì™‰Å™‰¾™‰·™‰°™‰©™‰¢™‰›™‰”™‰™‰†™‰™‰x™‰q™‰j™‰c™‰\™‰U™‰N™‰G™‰@™‰9™‰2™‰+™‰$™‰™‰™‰™‰™‰™‰ú˜‰ó˜‰옉嘉Þ˜‰ט‰И‰ɘ‰˜‰»˜‰´˜‰­˜‰¦˜‰Ÿ˜‰˜˜‰‘˜‰Š˜‰ƒ˜‰|˜‰u˜‰n˜‰g˜‰`˜‰Y˜‰R˜‰K˜‰D˜‰=˜‰6˜‰/˜‰(˜‰!˜‰˜‰˜‰ ˜‰˜‰þ—‰÷—‰ð—‰é—‰â—‰Û—‰Ô—‰Í—‰Æ—‰¿—‰¸—‰±—‰ª—‰£—‰œ—‰•—‰Ž—‰‡—‰€—‰y—‰r—‰k—‰d—‰]—‰V—‰O—‰H—‰A—‰:—‰3—‰,—‰%—‰—‰—‰—‰ —‰—‰û–‰ô–‰í–‰æ–‰ß–‰Ø–‰Ñ–‰Ê–‰Ö‰¼–‰µ–‰®–‰§–‰ –‰™–‰’–‰‹–‰„–‰}–‰v–‰o–‰h–‰a–‰Z–‰S–‰L–‰E–‰>–‰7–‰0–‰)–‰"–‰–‰–‰ –‰–‰ÿ•‰ø•‰ñ•‰ꕉ㕉Ü•‰Õ•‰Ε‰Ç•‰À•‰¹•‰²•‰«•‰¤•‰•‰–•‰•‰ˆ•‰•‰z•‰s•‰l•‰e•‰^•‰W•‰P•‰I•‰B•‰;•‰4•‰-•‰&•‰•‰•‰•‰ •‰•‰ü”‰õ”‰甉à”‰Ù”‰Ò”‰Ë”‰Ä”‰½”‰¶”‰¯”‰¨”‰¡”‰š”‰“”‰Œ”‰…”‰~”‰w”‰p”‰i”‰b”‰[”‰T”‰M”‰F”‰?”‰8”‰1”‰*”‰#”‰”‰”‰”‰”‰”‰ù“‰ò“‰듉䓉Ý“‰Ö“‰Ï“‰È“‰Á“‰º“‰³“‰¬“‰¥“‰ž“‰—“‰“‰‰“‰‚“‰{“‰t“‰m“‰f“‰_“‰X“‰Q“‰J“‰C“‰<“‰5“‰.“‰'“‰ “‰“‰“‰ “‰“‰ý’‰ö’‰ï’‰è’‰á’‰Ú’‰Ó’‰Ì’‰Å’‰¾’‰·’‰°’‰©’‰¢’‰›’‰”’‰’‰†’‰’‰x’‰q’‰j’‰c’‰\’‰U’‰N’‰G’‰@’‰9’‰2’‰+’‰$’‰’‰’‰’‰’‰’‰ú‘‰ó‘‰쑉呉Þ‘‰ב‰Б‰É‘‰‘‰»‘‰´‘‰­‘‰¦‘‰Ÿ‘‰˜‘‰‘‘‰Š‘‰ƒ‘‰|‘‰u‘‰n‘‰g‘‰`‘‰Y‘‰R‘‰K‘‰D‘‰=‘‰6‘‰/‘‰(‘‰!‘‰‘‰‘‰ ‘‰‘‰þ‰÷‰ð‰é‰â‰Û‰Ô‰͉Ɖ¿‰¸‰±‰ª‰£‰œ‰•‰މ‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰û‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿމøŽ‰ñމꎉ㎉ÜŽ‰ÕŽ‰ÎŽ‰ÇމÀމ¹Ž‰²Ž‰«Ž‰¤Ž‰މ–މމˆŽ‰މzމsމlމeމ^މWމPމIމBމ;މ4މ-މ&މމމމ މމü‰õ‰î‰ç‰à‰Ù‰Ò‰ˉĉ½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ùŒ‰òŒ‰댉䌉ÝŒ‰ÖŒ‰ÏŒ‰ÈŒ‰ÁŒ‰ºŒ‰³Œ‰¬Œ‰¥Œ‰žŒ‰—Œ‰Œ‰‰Œ‰‚Œ‰{Œ‰tŒ‰mŒ‰fŒ‰_Œ‰XŒ‰QŒ‰JŒ‰CŒ‰<Œ‰5Œ‰.Œ‰'Œ‰ Œ‰Œ‰Œ‰ Œ‰Œ‰ý‹‰ö‹‰苉ዉÚ‹‰Ó‹‰Ì‹‰Å‹‰¾‹‰·‹‰°‹‰©‹‰¢‹‰›‹‰”‹‰‹‰†‹‰‹‰x‹‰q‹‰j‹‰c‹‰\‹‰U‹‰N‹‰G‹‰@‹‰9‹‰2‹‰+‹‰$‹‰‹‰‹‰‹‰‹‰‹‰úЉóЉ슉劉ÞŠ‰׊‰Њ‰ÉЉЉ»Š‰´Š‰­Š‰¦Š‰ŸŠ‰˜Š‰‘ЉŠŠ‰ƒŠ‰|ЉuЉnЉgЉ`ЉYЉRЉKЉDЉ=Љ6Љ/Љ(Љ!ЉЉЉ ЉЉþ‰‰÷‰‰ð‰‰鉉≉Û‰‰Ô‰‰͉‰Ɖ‰¿‰‰¸‰‰±‰‰ª‰‰£‰‰œ‰‰•‰‰މ‰‡‰‰€‰‰y‰‰r‰‰k‰‰d‰‰]‰‰V‰‰O‰‰H‰‰A‰‰:‰‰3‰‰,‰‰%‰‰‰‰‰‰‰‰ ‰‰‰‰ûˆ‰ôˆ‰툉戉߈‰؈‰ш‰ʈ‰ȉ¼ˆ‰µˆ‰®ˆ‰§ˆ‰ ˆ‰™ˆ‰’ˆ‰‹ˆ‰„ˆ‰}ˆ‰vˆ‰oˆ‰hˆ‰aˆ‰Zˆ‰Sˆ‰Lˆ‰Eˆ‰>ˆ‰7ˆ‰0ˆ‰)ˆ‰"ˆ‰ˆ‰ˆ‰ ˆ‰ˆ‰ÿ‡‰ø‡‰ñ‡‰ꇉ㇉܇‰Õ‡‰·‰LJ‰À‡‰¹‡‰²‡‰«‡‰¤‡‰‡‰–‡‰‡‰ˆ‡‰‡‰z‡‰s‡‰l‡‰e‡‰^‡‰W‡‰P‡‰I‡‰B‡‰;‡‰4‡‰-‡‰&‡‰‡‰‡‰‡‰ ‡‰‡‰ü†‰õ†‰熉à†‰Ù†‰Ò†‰ˆ‰Ɖ½†‰¶†‰¯†‰¨†‰¡†‰š†‰“†‰Œ†‰…†‰~†‰w†‰p†‰i†‰b†‰[†‰T†‰M†‰F†‰?†‰8†‰1†‰*†‰#†‰†‰†‰†‰†‰†‰ù…‰ò…‰ë…‰ä…‰Ý…‰Ö…‰Ï…‰È…‰Á…‰º…‰³…‰¬…‰¥…‰ž…‰—…‰…‰‰…‰‚…‰{…‰t…‰m…‰f…‰_…‰X…‰Q…‰J…‰C…‰<…‰5…‰.…‰'…‰ …‰…‰…‰ …‰…‰ý„‰ö„‰脉ᄉÚ„‰Ó„‰Ì„‰Å„‰¾„‰·„‰°„‰©„‰¢„‰›„‰”„‰„‰†„‰„‰x„‰q„‰j„‰c„‰\„‰U„‰N„‰G„‰@„‰9„‰2„‰+„‰$„‰„‰„‰„‰„‰„‰úƒ‰óƒ‰색僉Þƒ‰׃‰Ѓ‰Ƀ‰ƒ‰»ƒ‰´ƒ‰­ƒ‰¦ƒ‰Ÿƒ‰˜ƒ‰‘ƒ‰Šƒ‰ƒƒ‰|ƒ‰uƒ‰nƒ‰gƒ‰`ƒ‰Yƒ‰Rƒ‰Kƒ‰Dƒ‰=ƒ‰6ƒ‰/ƒ‰(ƒ‰!ƒ‰ƒ‰ƒ‰ ƒ‰ƒ‰þ‚‰÷‚‰ð‚‰邉₉Û‚‰Ô‚‰Í‚‰Æ‚‰¿‚‰¸‚‰±‚‰ª‚‰£‚‰œ‚‰•‚‰Ž‚‰‡‚‰€‚‰y‚‰r‚‰k‚‰d‚‰]‚‰V‚‰O‚‰H‚‰A‚‰:‚‰3‚‰,‚‰%‚‰‚‰‚‰‚‰ ‚‰‚‰û‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿ€‰ø€‰ñ€‰ꀉ〉Ü€‰Õ€‰΀‰Ç€‰À€‰¹€‰²€‰«€‰¤€‰€‰–€‰€‰ˆ€‰€‰z€‰s€‰l€‰e€‰^€‰W€‰P€‰I€‰B€‰;€‰4€‰-€‰&€‰€‰€‰€‰ €‰€‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù~‰ò~‰ë~‰ä~‰Ý~‰Ö~‰Ï~‰È~‰Á~‰º~‰³~‰¬~‰¥~‰ž~‰—~‰~‰‰~‰‚~‰{~‰t~‰m~‰f~‰_~‰X~‰Q~‰J~‰C~‰<~‰5~‰.~‰'~‰ ~‰~‰~‰ ~‰~‰ý}‰ö}‰ï}‰è}‰á}‰Ú}‰Ó}‰Ì}‰Å}‰¾}‰·}‰°}‰©}‰¢}‰›}‰”}‰}‰†}‰}‰x}‰q}‰j}‰c}‰\}‰U}‰N}‰G}‰@}‰9}‰2}‰+}‰$}‰}‰}‰}‰}‰}‰ú|‰ó|‰ì|‰å|‰Þ|‰×|‰Ð|‰É|‰Â|‰»|‰´|‰­|‰¦|‰Ÿ|‰˜|‰‘|‰Š|‰ƒ|‰||‰u|‰n|‰g|‰`|‰Y|‰R|‰K|‰D|‰=|‰6|‰/|‰(|‰!|‰|‰|‰ |‰|‰þ{‰÷{‰ð{‰é{‰â{‰Û{‰Ô{‰Í{‰Æ{‰¿{‰¸{‰±{‰ª{‰£{‰œ{‰•{‰Ž{‰‡{‰€{‰y{‰r{‰k{‰d{‰]{‰V{‰O{‰H{‰A{‰:{‰3{‰,{‰%{‰{‰{‰{‰ {‰{‰ûz‰ôz‰íz‰æz‰ßz‰Øz‰Ñz‰Êz‰Ãz‰¼z‰µz‰®z‰§z‰ z‰™z‰’z‰‹z‰„z‰}z‰vz‰oz‰hz‰az‰Zz‰Sz‰Lz‰Ez‰>z‰7z‰0z‰)z‰"z‰z‰z‰ z‰z‰ÿy‰øy‰ñy‰êy‰ãy‰Üy‰Õy‰Îy‰Çy‰Ày‰¹y‰²y‰«y‰¤y‰y‰–y‰y‰ˆy‰y‰zy‰sy‰ly‰ey‰^y‰Wy‰Py‰Iy‰By‰;y‰4y‰-y‰&y‰y‰y‰y‰ y‰y‰üx‰õx‰îx‰çx‰àx‰Ùx‰Òx‰Ëx‰Äx‰½x‰¶x‰¯x‰¨x‰¡x‰šx‰“x‰Œx‰…x‰~x‰wx‰px‰ix‰bx‰[x‰Tx‰Mx‰Fx‰?x‰8x‰1x‰*x‰#x‰x‰x‰x‰x‰x‰ùw‰òw‰ëw‰äw‰Ýw‰Öw‰Ïw‰Èw‰Áw‰ºw‰³w‰¬w‰¥w‰žw‰—w‰w‰‰w‰‚w‰{w‰tw‰mw‰fw‰_w‰Xw‰Qw‰Jw‰Cw‰s‰7s‰0s‰)s‰"s‰s‰s‰ s‰s‰ÿr‰ør‰ñr‰êr‰ãr‰Ür‰Õr‰Îr‰Çr‰Àr‰¹r‰²r‰«r‰¤r‰r‰–r‰r‰ˆr‰r‰zr‰sr‰lr‰er‰^r‰Wr‰Pr‰Ir‰Br‰;r‰4r‰-r‰&r‰r‰r‰r‰ r‰r‰üq‰õq‰îq‰çq‰àq‰Ùq‰Òq‰Ëq‰Äq‰½q‰¶q‰¯q‰¨q‰¡q‰šq‰“q‰Œq‰…q‰~q‰wq‰pq‰iq‰bq‰[q‰Tq‰Mq‰Fq‰?q‰8q‰1q‰*q‰#q‰q‰q‰q‰q‰q‰ùp‰òp‰ëp‰äp‰Ýp‰Öp‰Ïp‰Èp‰Áp‰ºp‰³p‰¬p‰¥p‰žp‰—p‰p‰‰p‰‚p‰{p‰tp‰mp‰fp‰_p‰Xp‰Qp‰Jp‰Cp‰l‰7l‰0l‰)l‰"l‰l‰l‰ l‰l‰ÿk‰øk‰ñk‰êk‰ãk‰Ük‰Õk‰Îk‰Çk‰Àk‰¹k‰²k‰«k‰¤k‰k‰–k‰k‰ˆk‰k‰zk‰sk‰lk‰ek‰^k‰Wk‰Pk‰Ik‰Bk‰;k‰4k‰-k‰&k‰k‰k‰k‰ k‰k‰üj‰õj‰îj‰çj‰àj‰Ùj‰Òj‰Ëj‰Äj‰½j‰¶j‰¯j‰¨j‰¡j‰šj‰“j‰Œj‰…j‰~j‰wj‰pj‰ij‰bj‰[j‰Tj‰Mj‰Fj‰?j‰8j‰1j‰*j‰#j‰j‰j‰j‰j‰j‰ùi‰òi‰ëi‰äi‰Ýi‰Öi‰Ïi‰Èi‰Ái‰ºi‰³i‰¬i‰¥i‰ži‰—i‰i‰‰i‰‚i‰{i‰ti‰mi‰fi‰_i‰Xi‰Qi‰Ji‰Ci‰e‰7e‰0e‰)e‰"e‰e‰e‰ e‰e‰ÿd‰ød‰ñd‰êd‰ãd‰Üd‰Õd‰Îd‰Çd‰Àd‰¹d‰²d‰«d‰¤d‰d‰–d‰d‰ˆd‰d‰zd‰sd‰ld‰ed‰^d‰Wd‰Pd‰Id‰Bd‰;d‰4d‰-d‰&d‰d‰d‰d‰ d‰d‰üc‰õc‰îc‰çc‰àc‰Ùc‰Òc‰Ëc‰Äc‰½c‰¶c‰¯c‰¨c‰¡c‰šc‰“c‰Œc‰…c‰~c‰wc‰pc‰ic‰bc‰[c‰Tc‰Mc‰Fc‰?c‰8c‰1c‰*c‰#c‰c‰c‰c‰c‰c‰ùb‰òb‰ëb‰äb‰Ýb‰Öb‰Ïb‰Èb‰Áb‰ºb‰³b‰¬b‰¥b‰žb‰—b‰b‰‰b‰‚b‰{b‰tb‰mb‰fb‰_b‰Xb‰Qb‰Jb‰Cb‰^‰7^‰0^‰)^‰"^‰^‰^‰ ^‰^‰ÿ]‰ø]‰ñ]‰ê]‰ã]‰Ü]‰Õ]‰Î]‰Ç]‰À]‰¹]‰²]‰«]‰¤]‰]‰–]‰]‰ˆ]‰]‰z]‰s]‰l]‰e]‰^]‰W]‰P]‰I]‰B]‰;]‰4]‰-]‰&]‰]‰]‰]‰ ]‰]‰ü\‰õ\‰î\‰ç\‰à\‰Ù\‰Ò\‰Ë\‰Ä\‰½\‰¶\‰¯\‰¨\‰¡\‰š\‰“\‰Œ\‰…\‰~\‰w\‰p\‰i\‰b\‰[\‰T\‰M\‰F\‰?\‰8\‰1\‰*\‰#\‰\‰\‰\‰\‰\‰ù[‰ò[‰ë[‰ä[‰Ý[‰Ö[‰Ï[‰È[‰Á[‰º[‰³[‰¬[‰¥[‰ž[‰—[‰[‰‰[‰‚[‰{[‰t[‰m[‰f[‰_[‰X[‰Q[‰J[‰C[‰<[‰5[‰.[‰'[‰ [‰[‰[‰ [‰[‰ýZ‰öZ‰ïZ‰èZ‰áZ‰ÚZ‰ÓZ‰ÌZ‰ÅZ‰¾Z‰·Z‰°Z‰©Z‰¢Z‰›Z‰”Z‰Z‰†Z‰Z‰xZ‰qZ‰jZ‰cZ‰\Z‰UZ‰NZ‰GZ‰@Z‰9Z‰2Z‰+Z‰$Z‰Z‰Z‰Z‰Z‰Z‰úY‰óY‰ìY‰åY‰ÞY‰×Y‰ÐY‰ÉY‰ÂY‰»Y‰´Y‰­Y‰¦Y‰ŸY‰˜Y‰‘Y‰ŠY‰ƒY‰|Y‰uY‰nY‰gY‰`Y‰YY‰RY‰KY‰DY‰=Y‰6Y‰/Y‰(Y‰!Y‰Y‰Y‰ Y‰Y‰þX‰÷X‰ðX‰éX‰âX‰ÛX‰ÔX‰ÍX‰ÆX‰¿X‰¸X‰±X‰ªX‰£X‰œX‰•X‰ŽX‰‡X‰€X‰yX‰rX‰kX‰dX‰]X‰VX‰OX‰HX‰AX‰:X‰3X‰,X‰%X‰X‰X‰X‰ X‰X‰ûW‰ôW‰íW‰æW‰ßW‰ØW‰ÑW‰ÊW‰ÃW‰¼W‰µW‰®W‰§W‰ W‰™W‰’W‰‹W‰„W‰}W‰vW‰oW‰hW‰aW‰ZW‰SW‰LW‰EW‰>W‰7W‰0W‰)W‰"W‰W‰W‰ W‰W‰ÿV‰øV‰ñV‰êV‰ãV‰ÜV‰ÕV‰ÎV‰ÇV‰ÀV‰¹V‰²V‰«V‰¤V‰V‰–V‰V‰ˆV‰V‰zV‰sV‰lV‰eV‰^V‰WV‰PV‰IV‰BV‰;V‰4V‰-V‰&V‰V‰V‰V‰ V‰V‰üU‰õU‰îU‰çU‰àU‰ÙU‰ÒU‰ËU‰ÄU‰½U‰¶U‰¯U‰¨U‰¡U‰šU‰“U‰ŒU‰…U‰~U‰wU‰pU‰iU‰bU‰[U‰TU‰MU‰FU‰?U‰8U‰1U‰*U‰#U‰U‰U‰U‰U‰U‰ùT‰òT‰ëT‰äT‰ÝT‰ÖT‰ÏT‰ÈT‰ÁT‰ºT‰³T‰¬T‰¥T‰žT‰—T‰T‰‰T‰‚T‰{T‰tT‰mT‰fT‰_T‰XT‰QT‰JT‰CT‰P‰7P‰0P‰)P‰"P‰P‰P‰ P‰P‰ÿO‰øO‰ñO‰êO‰ãO‰ÜO‰ÕO‰ÎO‰ÇO‰ÀO‰¹O‰²O‰«O‰¤O‰O‰–O‰O‰ˆO‰O‰zO‰sO‰lO‰eO‰^O‰WO‰PO‰IO‰BO‰;O‰4O‰-O‰&O‰O‰O‰O‰ O‰O‰üN‰õN‰îN‰çN‰àN‰ÙN‰ÒN‰ËN‰ÄN‰½N‰¶N‰¯N‰¨N‰¡N‰šN‰“N‰ŒN‰…N‰~N‰wN‰pN‰iN‰bN‰[N‰TN‰MN‰FN‰?N‰8N‰1N‰*N‰#N‰N‰N‰N‰N‰N‰ùM‰òM‰ëM‰äM‰ÝM‰ÖM‰ÏM‰ÈM‰ÁM‰ºM‰³M‰¬M‰¥M‰žM‰—M‰M‰‰M‰‚M‰{M‰tM‰mM‰fM‰_M‰XM‰QM‰JM‰CM‰I‰7I‰0I‰)I‰"I‰I‰I‰ I‰I‰ÿH‰øH‰ñH‰êH‰ãH‰ÜH‰ÕH‰ÎH‰ÇH‰ÀH‰¹H‰²H‰«H‰¤H‰H‰–H‰H‰ˆH‰H‰zH‰sH‰lH‰eH‰^H‰WH‰PH‰IH‰BH‰;H‰4H‰-H‰&H‰H‰H‰H‰ H‰H‰üG‰õG‰îG‰çG‰àG‰ÙG‰ÒG‰ËG‰ÄG‰½G‰¶G‰¯G‰¨G‰¡G‰šG‰“G‰ŒG‰…G‰~G‰wG‰pG‰iG‰bG‰[G‰TG‰MG‰FG‰?G‰8G‰1G‰*G‰#G‰G‰G‰G‰G‰G‰ùF‰òF‰ëF‰äF‰ÝF‰ÖF‰ÏF‰ÈF‰ÁF‰ºF‰³F‰¬F‰¥F‰žF‰—F‰F‰‰F‰‚F‰{F‰tF‰mF‰fF‰_F‰XF‰QF‰JF‰CF‰B‰7B‰0B‰)B‰"B‰B‰B‰ B‰B‰ÿA‰øA‰ñA‰êA‰ãA‰ÜA‰ÕA‰ÎA‰ÇA‰ÀA‰¹A‰²A‰«A‰¤A‰A‰–A‰A‰ˆA‰A‰zA‰sA‰lA‰eA‰^A‰WA‰PA‰IA‰BA‰;A‰4A‰-A‰&A‰A‰A‰A‰ A‰A‰ü@‰õ@‰î@‰ç@‰à@‰Ù@‰Ò@‰Ë@‰Ä@‰½@‰¶@‰¯@‰¨@‰¡@‰š@‰“@‰Œ@‰…@‰~@‰w@‰p@‰i@‰b@‰[@‰T@‰M@‰F@‰?@‰8@‰1@‰*@‰#@‰@‰@‰@‰@‰@‰ù?‰ò?‰ë?‰ä?‰Ý?‰Ö?‰Ï?‰È?‰Á?‰º?‰³?‰¬?‰¥?‰ž?‰—?‰?‰‰?‰‚?‰{?‰t?‰m?‰f?‰_?‰X?‰Q?‰J?‰C?‰‰ö>‰ï>‰è>‰á>‰Ú>‰Ó>‰Ì>‰Å>‰¾>‰·>‰°>‰©>‰¢>‰›>‰”>‰>‰†>‰>‰x>‰q>‰j>‰c>‰\>‰U>‰N>‰G>‰@>‰9>‰2>‰+>‰$>‰>‰>‰>‰>‰>‰ú=‰ó=‰ì=‰å=‰Þ=‰×=‰Ð=‰É=‰Â=‰»=‰´=‰­=‰¦=‰Ÿ=‰˜=‰‘=‰Š=‰ƒ=‰|=‰u=‰n=‰g=‰`=‰Y=‰R=‰K=‰D=‰==‰6=‰/=‰(=‰!=‰=‰=‰ =‰=‰þ<‰÷<‰ð<‰é<‰â<‰Û<‰Ô<‰Í<‰Æ<‰¿<‰¸<‰±<‰ª<‰£<‰œ<‰•<‰Ž<‰‡<‰€<‰y<‰r<‰k<‰d<‰]<‰V<‰O<‰H<‰A<‰:<‰3<‰,<‰%<‰<‰<‰<‰ <‰<‰û;‰ô;‰í;‰æ;‰ß;‰Ø;‰Ñ;‰Ê;‰Ã;‰¼;‰µ;‰®;‰§;‰ ;‰™;‰’;‰‹;‰„;‰};‰v;‰o;‰h;‰a;‰Z;‰S;‰L;‰E;‰>;‰7;‰0;‰);‰";‰;‰;‰ ;‰;‰ÿ:‰ø:‰ñ:‰ê:‰ã:‰Ü:‰Õ:‰Î:‰Ç:‰À:‰¹:‰²:‰«:‰¤:‰:‰–:‰:‰ˆ:‰:‰z:‰s:‰l:‰e:‰^:‰W:‰P:‰I:‰B:‰;:‰4:‰-:‰&:‰:‰:‰:‰ :‰:‰ü9‰õ9‰î9‰ç9‰à9‰Ù9‰Ò9‰Ë9‰Ä9‰½9‰¶9‰¯9‰¨9‰¡9‰š9‰“9‰Œ9‰…9‰~9‰w9‰p9‰i9‰b9‰[9‰T9‰M9‰F9‰?9‰89‰19‰*9‰#9‰9‰9‰9‰9‰9‰ù8‰ò8‰ë8‰ä8‰Ý8‰Ö8‰Ï8‰È8‰Á8‰º8‰³8‰¬8‰¥8‰ž8‰—8‰8‰‰8‰‚8‰{8‰t8‰m8‰f8‰_8‰X8‰Q8‰J8‰C8‰<8‰58‰.8‰'8‰ 8‰8‰8‰ 8‰8‰ý7‰ö7‰ï7‰è7‰á7‰Ú7‰Ó7‰Ì7‰Å7‰¾7‰·7‰°7‰©7‰¢7‰›7‰”7‰7‰†7‰7‰x7‰q7‰j7‰c7‰\7‰U7‰N7‰G7‰@7‰97‰27‰+7‰$7‰7‰7‰7‰7‰7‰ú6‰ó6‰ì6‰å6‰Þ6‰×6‰Ð6‰É6‰Â6‰»6‰´6‰­6‰¦6‰Ÿ6‰˜6‰‘6‰Š6‰ƒ6‰|6‰u6‰n6‰g6‰`6‰Y6‰R6‰K6‰D6‰=6‰66‰/6‰(6‰!6‰6‰6‰ 6‰6‰þ5‰÷5‰ð5‰é5‰â5‰Û5‰Ô5‰Í5‰Æ5‰¿5‰¸5‰±5‰ª5‰£5‰œ5‰•5‰Ž5‰‡5‰€5‰y5‰r5‰k5‰d5‰]5‰V5‰O5‰H5‰A5‰:5‰35‰,5‰%5‰5‰5‰5‰ 5‰5‰û4‰ô4‰í4‰æ4‰ß4‰Ø4‰Ñ4‰Ê4‰Ã4‰¼4‰µ4‰®4‰§4‰ 4‰™4‰’4‰‹4‰„4‰}4‰v4‰o4‰h4‰a4‰Z4‰S4‰L4‰E4‰>4‰74‰04‰)4‰"4‰4‰4‰ 4‰4‰ÿ3‰ø3‰ñ3‰ê3‰ã3‰Ü3‰Õ3‰Î3‰Ç3‰À3‰¹3‰²3‰«3‰¤3‰3‰–3‰3‰ˆ3‰3‰z3‰s3‰l3‰e3‰^3‰W3‰P3‰I3‰B3‰;3‰43‰-3‰&3‰3‰3‰3‰ 3‰3‰ü2‰õ2‰î2‰ç2‰à2‰Ù2‰Ò2‰Ë2‰Ä2‰½2‰¶2‰¯2‰¨2‰¡2‰š2‰“2‰Œ2‰…2‰~2‰w2‰p2‰i2‰b2‰[2‰T2‰M2‰F2‰?2‰82‰12‰*2‰#2‰2‰2‰2‰2‰2‰ù1‰ò1‰ë1‰ä1‰Ý1‰Ö1‰Ï1‰È1‰Á1‰º1‰³1‰¬1‰¥1‰ž1‰—1‰1‰‰1‰‚1‰{1‰t1‰m1‰f1‰_1‰X1‰Q1‰J1‰C1‰<1‰51‰.1‰'1‰ 1‰1‰1‰ 1‰1‰ý0‰ö0‰ï0‰è0‰á0‰Ú0‰Ó0‰Ì0‰Å0‰¾0‰·0‰°0‰©0‰¢0‰›0‰”0‰0‰†0‰0‰x0‰q0‰j0‰c0‰\0‰U0‰N0‰G0‰@0‰90‰20‰+0‰$0‰0‰0‰0‰0‰0‰ú/‰ó/‰ì/‰å/‰Þ/‰×/‰Ð/‰É/‰Â/‰»/‰´/‰­/‰¦/‰Ÿ/‰˜/‰‘/‰Š/‰ƒ/‰|/‰u/‰n/‰g/‰`/‰Y/‰R/‰K/‰D/‰=/‰6/‰//‰(/‰!/‰/‰/‰ /‰/‰þ.‰÷.‰ð.‰é.‰â.‰Û.‰Ô.‰Í.‰Æ.‰¿.‰¸.‰±.‰ª.‰£.‰œ.‰•.‰Ž.‰‡.‰€.‰y.‰r.‰k.‰d.‰].‰V.‰O.‰H.‰A.‰:.‰3.‰,.‰%.‰.‰.‰.‰ .‰.‰û-‰ô-‰í-‰æ-‰ß-‰Ø-‰Ñ-‰Ê-‰Ã-‰¼-‰µ-‰®-‰§-‰ -‰™-‰’-‰‹-‰„-‰}-‰v-‰o-‰h-‰a-‰Z-‰S-‰L-‰E-‰>-‰7-‰0-‰)-‰"-‰-‰-‰ -‰-‰ÿ,‰ø,‰ñ,‰ê,‰ã,‰Ü,‰Õ,‰Î,‰Ç,‰À,‰¹,‰²,‰«,‰¤,‰,‰–,‰,‰ˆ,‰,‰z,‰s,‰l,‰e,‰^,‰W,‰P,‰I,‰B,‰;,‰4,‰-,‰&,‰,‰,‰,‰ ,‰,‰ü+‰õ+‰î+‰ç+‰à+‰Ù+‰Ò+‰Ë+‰Ä+‰½+‰¶+‰¯+‰¨+‰¡+‰š+‰“+‰Œ+‰…+‰~+‰w+‰p+‰i+‰b+‰[+‰T+‰M+‰F+‰?+‰8+‰1+‰*+‰#+‰+‰+‰+‰+‰+‰ù*‰ò*‰ë*‰ä*‰Ý*‰Ö*‰Ï*‰È*‰Á*‰º*‰³*‰¬*‰¥*‰ž*‰—*‰*‰‰*‰‚*‰{*‰t*‰m*‰f*‰_*‰X*‰Q*‰J*‰C*‰<*‰5*‰.*‰'*‰ *‰*‰*‰ *‰*‰ý)‰ö)‰ï)‰è)‰á)‰Ú)‰Ó)‰Ì)‰Å)‰¾)‰·)‰°)‰©)‰¢)‰›)‰”)‰)‰†)‰)‰x)‰q)‰j)‰c)‰\)‰U)‰N)‰G)‰@)‰9)‰2)‰+)‰$)‰)‰)‰)‰)‰)‰ú(‰ó(‰ì(‰å(‰Þ(‰×(‰Ð(‰É(‰Â(‰»(‰´(‰­(‰¦(‰Ÿ(‰˜(‰‘(‰Š(‰ƒ(‰|(‰u(‰n(‰g(‰`(‰Y(‰R(‰K(‰D(‰=(‰6(‰/(‰((‰!(‰(‰(‰ (‰(‰þ'‰÷'‰ð'‰é'‰â'‰Û'‰Ô'‰Í'‰Æ'‰¿'‰¸'‰±'‰ª'‰£'‰œ'‰•'‰Ž'‰‡'‰€'‰y'‰r'‰k'‰d'‰]'‰V'‰O'‰H'‰A'‰:'‰3'‰,'‰%'‰'‰'‰'‰ '‰'‰û&‰ô&‰í&‰æ&‰ß&‰Ø&‰Ñ&‰Ê&‰Ã&‰¼&‰µ&‰®&‰§&‰ &‰™&‰’&‰‹&‰„&‰}&‰v&‰o&‰h&‰a&‰Z&‰S&‰L&‰E&‰>&‰7&‰0&‰)&‰"&‰&‰&‰ &‰&‰ÿ%‰ø%‰ñ%‰ê%‰ã%‰Ü%‰Õ%‰Î%‰Ç%‰À%‰¹%‰²%‰«%‰¤%‰%‰–%‰%‰ˆ%‰%‰z%‰s%‰l%‰e%‰^%‰W%‰P%‰I%‰B%‰;%‰4%‰-%‰&%‰%‰%‰%‰ %‰%‰ü$‰õ$‰î$‰ç$‰à$‰Ù$‰Ò$‰Ë$‰Ä$‰½$‰¶$‰¯$‰¨$‰¡$‰š$‰“$‰Œ$‰…$‰~$‰w$‰p$‰i$‰b$‰[$‰T$‰M$‰F$‰?$‰8$‰1$‰*$‰#$‰$‰$‰$‰$‰$‰ù#‰ò#‰ë#‰ä#‰Ý#‰Ö#‰Ï#‰È#‰Á#‰º#‰³#‰¬#‰¥#‰ž#‰—#‰#‰‰#‰‚#‰{#‰t#‰m#‰f#‰_#‰X#‰Q#‰J#‰C#‰<#‰5#‰.#‰'#‰ #‰#‰#‰ #‰#‰ý"‰ö"‰ï"‰è"‰á"‰Ú"‰Ó"‰Ì"‰Å"‰¾"‰·"‰°"‰©"‰¢"‰›"‰”"‰"‰†"‰"‰x"‰q"‰j"‰c"‰\"‰U"‰N"‰G"‰@"‰9"‰2"‰+"‰$"‰"‰"‰"‰"‰"‰ú!‰ó!‰ì!‰å!‰Þ!‰×!‰Ð!‰É!‰Â!‰»!‰´!‰­!‰¦!‰Ÿ!‰˜!‰‘!‰Š!‰ƒ!‰|!‰u!‰n!‰g!‰`!‰Y!‰R!‰K!‰D!‰=!‰6!‰/!‰(!‰!!‰!‰!‰ !‰!‰þ ‰÷ ‰ð ‰é ‰â ‰Û ‰Ô ‰Í ‰Æ ‰¿ ‰¸ ‰± ‰ª ‰£ ‰œ ‰• ‰Ž ‰‡ ‰€ ‰y ‰r ‰k ‰d ‰] ‰V ‰O ‰H ‰A ‰: ‰3 ‰, ‰% ‰ ‰ ‰ ‰ ‰ ‰û‰ô‰í‰æ‰ß‰Ø‰Ñ‰Ê‰Ã‰¼‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿ‰ø‰ñ‰ê‰ã‰Ü‰Õ‰Î‰Ç‰À‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù‰ò‰ë‰ä‰Ý‰Ö‰Ï‰È‰Á‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ý‰ö‰ï‰è‰á‰Ú‰Ó‰Ì‰Å‰¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰ú‰ó‰ì‰å‰Þ‰×‰Ð‰É‰Â‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Š‰ƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þ‰÷‰ð‰é‰â‰Û‰Ô‰Í‰Æ‰¿‰¸‰±‰ª‰£‰œ‰•‰Ž‰‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰û‰ô‰í‰æ‰ß‰Ø‰Ñ‰Ê‰Ã‰¼‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿ‰ø‰ñ‰ê‰ã‰Ü‰Õ‰Î‰Ç‰À‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù‰ò‰ë‰ä‰Ý‰Ö‰Ï‰È‰Á‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ý‰ö‰ï‰è‰á‰Ú‰Ó‰Ì‰Å‰¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰ú‰ó‰ì‰å‰Þ‰×‰Ð‰É‰Â‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Š‰ƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þ‰÷‰ð‰é‰â‰Û‰Ô‰Í‰Æ‰¿‰¸‰±‰ª‰£‰œ‰•‰Ž‰‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰û‰ô‰í‰æ‰ß‰Ø‰Ñ‰Ê‰Ã‰¼‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿ‰ø‰ñ‰ê‰ã‰Ü‰Õ‰Î‰Ç‰À‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù‰ò‰ë‰ä‰Ý‰Ö‰Ï‰È‰Á‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ý ‰ö ‰ï ‰è ‰á ‰Ú ‰Ó ‰Ì ‰Å ‰¾ ‰· ‰° ‰© ‰¢ ‰› ‰” ‰ ‰† ‰ ‰x ‰q ‰j ‰c ‰\ ‰U ‰N ‰G ‰@ ‰9 ‰2 ‰+ ‰$ ‰ ‰ ‰ ‰ ‰ ‰ú ‰ó ‰ì ‰å ‰Þ ‰× ‰Ð ‰É ‰ ‰» ‰´ ‰­ ‰¦ ‰Ÿ ‰˜ ‰‘ ‰Š ‰ƒ ‰| ‰u ‰n ‰g ‰` ‰Y ‰R ‰K ‰D ‰= ‰6 ‰/ ‰( ‰! ‰ ‰ ‰ ‰ ‰þ ‰÷ ‰ð ‰é ‰â ‰Û ‰Ô ‰Í ‰Æ ‰¿ ‰¸ ‰± ‰ª ‰£ ‰œ ‰• ‰Ž ‰‡ ‰€ ‰y ‰r ‰k ‰d ‰] ‰V ‰O ‰H ‰A ‰: ‰3 ‰, ‰% ‰ ‰ ‰ ‰ ‰ ‰û ‰ô ‰í ‰æ ‰ß ‰Ø ‰Ñ ‰Ê ‰à ‰¼ ‰µ ‰® ‰§ ‰  ‰™ ‰’ ‰‹ ‰„ ‰} ‰v ‰o ‰h ‰a ‰Z ‰S ‰L ‰E ‰> ‰7 ‰0 ‰) ‰" ‰ ‰ ‰ ‰ ‰ÿ ‰ø ‰ñ ‰ê ‰ã ‰Ü ‰Õ ‰Î ‰Ç ‰À ‰¹ ‰² ‰« ‰¤ ‰ ‰– ‰ ‰ˆ ‰ ‰z ‰s ‰l ‰e ‰^ ‰W ‰P ‰I ‰B ‰; ‰4 ‰- ‰& ‰ ‰ ‰ ‰ ‰ ‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù‰ò‰ë‰ä‰Ý‰Ö‰Ï‰È‰Á‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ý‰ö‰ï‰è‰á‰Ú‰Ó‰Ì‰Å‰¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰ú‰ó‰ì‰å‰Þ‰×‰Ð‰É‰Â‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Š‰ƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þ‰÷‰ð‰é‰â‰Û‰Ô‰Í‰Æ‰¿‰¸‰±‰ª‰£‰œ‰•‰Ž‰‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰û‰ô‰í‰æ‰ß‰Ø‰Ñ‰Ê‰Ã‰¼‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿ‰ø‰ñ‰ê‰ã‰Ü‰Õ‰Î‰Ç‰À‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰ü‰õ‰î‰ç‰à‰Ù‰Ò‰Ë‰Ä‰½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýÿˆöÿˆïÿˆèÿˆáÿˆÚÿˆÓÿˆÌÿˆÅÿˆ¾ÿˆ·ÿˆ°ÿˆ©ÿˆ¢ÿˆ›ÿˆ”ÿˆÿˆ†ÿˆÿˆxÿˆqÿˆjÿˆcÿˆ\ÿˆUÿˆNÿˆGÿˆ@ÿˆ9ÿˆ2ÿˆ+ÿˆ$ÿˆÿˆÿˆÿˆÿˆÿˆúþˆóþˆìþˆåþˆÞþˆ×þˆÐþˆÉþˆÂþˆ»þˆ´þˆ­þˆ¦þˆŸþˆ˜þˆ‘þˆŠþˆƒþˆ|þˆuþˆnþˆgþˆ`þˆYþˆRþˆKþˆDþˆ=þˆ6þˆ/þˆ(þˆ!þˆþˆþˆ þˆþˆþýˆ÷ýˆðýˆéýˆâýˆÛýˆÔýˆÍýˆÆýˆ¿ýˆ¸ýˆ±ýˆªýˆ£ýˆœýˆ•ýˆŽýˆ‡ýˆ€ýˆyýˆrýˆkýˆdýˆ]ýˆVýˆOýˆHýˆAýˆ:ýˆ3ýˆ,ýˆ%ýˆýˆýˆýˆ ýˆýˆûüˆôüˆíüˆæüˆßüˆØüˆÑüˆÊüˆÃüˆ¼üˆµüˆ®üˆ§üˆ üˆ™üˆ’üˆ‹üˆ„üˆ}üˆvüˆoüˆhüˆaüˆZüˆSüˆLüˆEüˆ>üˆ7üˆ0üˆ)üˆ"üˆüˆüˆ üˆüˆÿûˆøûˆñûˆêûˆãûˆÜûˆÕûˆÎûˆÇûˆÀûˆ¹ûˆ²ûˆ«ûˆ¤ûˆûˆ–ûˆûˆˆûˆûˆzûˆsûˆlûˆeûˆ^ûˆWûˆPûˆIûˆBûˆ;ûˆ4ûˆ-ûˆ&ûˆûˆûˆûˆ ûˆûˆüúˆõúˆîúˆçúˆàúˆÙúˆÒúˆËúˆÄúˆ½úˆ¶úˆ¯úˆ¨úˆ¡úˆšúˆ“úˆŒúˆ…úˆ~úˆwúˆpúˆiúˆbúˆ[úˆTúˆMúˆFúˆ?úˆ8úˆ1úˆ*úˆ#úˆúˆúˆúˆúˆúˆùùˆòùˆëùˆäùˆÝùˆÖùˆÏùˆÈùˆÁùˆºùˆ³ùˆ¬ùˆ¥ùˆžùˆ—ùˆùˆ‰ùˆ‚ùˆ{ùˆtùˆmùˆfùˆ_ùˆXùˆQùˆJùˆCùˆ<ùˆ5ùˆ.ùˆ'ùˆ ùˆùˆùˆ ùˆùˆýøˆöøˆïøˆèøˆáøˆÚøˆÓøˆÌøˆÅøˆ¾øˆ·øˆ°øˆ©øˆ¢øˆ›øˆ”øˆøˆ†øˆøˆxøˆqøˆjøˆcøˆ\øˆUøˆNøˆGøˆ@øˆ9øˆ2øˆ+øˆ$øˆøˆøˆøˆøˆøˆú÷ˆó÷ˆì÷ˆå÷ˆÞ÷ˆ×÷ˆÐ÷ˆÉ÷ˆÂ÷ˆ»÷ˆ´÷ˆ­÷ˆ¦÷ˆŸ÷ˆ˜÷ˆ‘÷ˆŠ÷ˆƒ÷ˆ|÷ˆu÷ˆn÷ˆg÷ˆ`÷ˆY÷ˆR÷ˆK÷ˆD÷ˆ=÷ˆ6÷ˆ/÷ˆ(÷ˆ!÷ˆ÷ˆ÷ˆ ÷ˆ÷ˆþöˆ÷öˆðöˆéöˆâöˆÛöˆÔöˆÍöˆÆöˆ¿öˆ¸öˆ±öˆªöˆ£öˆœöˆ•öˆŽöˆ‡öˆ€öˆyöˆröˆköˆdöˆ]öˆVöˆOöˆHöˆAöˆ:öˆ3öˆ,öˆ%öˆöˆöˆöˆ öˆöˆûõˆôõˆíõˆæõˆßõˆØõˆÑõˆÊõˆÃõˆ¼õˆµõˆ®õˆ§õˆ õˆ™õˆ’õˆ‹õˆ„õˆ}õˆvõˆoõˆhõˆaõˆZõˆSõˆLõˆEõˆ>õˆ7õˆ0õˆ)õˆ"õˆõˆõˆ õˆõˆÿôˆøôˆñôˆêôˆãôˆÜôˆÕôˆÎôˆÇôˆÀôˆ¹ôˆ²ôˆ«ôˆ¤ôˆôˆ–ôˆôˆˆôˆôˆzôˆsôˆlôˆeôˆ^ôˆWôˆPôˆIôˆBôˆ;ôˆ4ôˆ-ôˆ&ôˆôˆôˆôˆ ôˆôˆüóˆõóˆîóˆçóˆàóˆÙóˆÒóˆËóˆÄóˆ½óˆ¶óˆ¯óˆ¨óˆ¡óˆšóˆ“óˆŒóˆ…óˆ~óˆwóˆpóˆióˆbóˆ[óˆTóˆMóˆFóˆ?óˆ8óˆ1óˆ*óˆ#óˆóˆóˆóˆóˆóˆùòˆòòˆëòˆäòˆÝòˆÖòˆÏòˆÈòˆÁòˆºòˆ³òˆ¬òˆ¥òˆžòˆ—òˆòˆ‰òˆ‚òˆ{òˆtòˆmòˆfòˆ_òˆXòˆQòˆJòˆCòˆ<òˆ5òˆ.òˆ'òˆ òˆòˆòˆ òˆòˆýñˆöñˆïñˆèñˆáñˆÚñˆÓñˆÌñˆÅñˆ¾ñˆ·ñˆ°ñˆ©ñˆ¢ñˆ›ñˆ”ñˆñˆ†ñˆñˆxñˆqñˆjñˆcñˆ\ñˆUñˆNñˆGñˆ@ñˆ9ñˆ2ñˆ+ñˆ$ñˆñˆñˆñˆñˆñˆúðˆóðˆìðˆåðˆÞðˆ×ðˆÐðˆÉðˆÂðˆ»ðˆ´ðˆ­ðˆ¦ðˆŸðˆ˜ðˆ‘ðˆŠðˆƒðˆ|ðˆuðˆnðˆgðˆ`ðˆYðˆRðˆKðˆDðˆ=ðˆ6ðˆ/ðˆ(ðˆ!ðˆðˆðˆ ðˆðˆþïˆ÷ïˆðïˆéïˆâïˆÛïˆÔïˆÍïˆÆïˆ¿ïˆ¸ïˆ±ïˆªïˆ£ïˆœïˆ•ïˆŽïˆ‡ïˆ€ïˆyïˆrïˆkïˆdïˆ]ïˆVïˆOïˆHïˆAïˆ:ïˆ3ïˆ,ïˆ%ïˆïˆïˆïˆ ïˆïˆûîˆôîˆíîˆæîˆßîˆØîˆÑîˆÊîˆÃîˆ}îˆvîˆoîˆhîˆaîˆZîˆSîˆLîˆEîˆ>îˆ7îˆ0îˆ)îˆ"îˆîˆîˆ îˆîˆÿíˆøíˆñíˆêíˆãíˆÜíˆÕíˆÎíˆÇíˆÀ툹툲툫툤íˆíˆ–íˆíˆˆíˆíˆzíˆsíˆlíˆeíˆ^íˆWíˆPíˆIíˆBíˆ;íˆ4íˆ-íˆ&íˆíˆíˆíˆ íˆíˆüìˆõìˆîìˆçìˆàìˆÙìˆÒìˆËìˆÄ숽숶숯숨숡숚숓숌숅ìˆ~ìˆwìˆpìˆiìˆbìˆ[ìˆTìˆMìˆFìˆ?ìˆ8ìˆ1ìˆ*ìˆ#ìˆìˆìˆìˆìˆìˆùëˆòëˆëëˆäëˆÝëˆÖëˆÏëˆÈëˆÁ눺눳눬눥눞눗ëˆëˆ‰ëˆ‚ëˆ{ëˆtëˆmëˆfëˆ_ëˆXëˆQëˆJëˆCëˆ<ëˆ5ëˆ.ëˆ'ëˆ ëˆëˆëˆ ëˆëˆýêˆöêˆïêˆèêˆáêˆÚêˆÓêˆÌêˆÅꈾꈷꈰꈩꈢꈛꈔêˆêˆ†êˆêˆxêˆqêˆjêˆcêˆ\êˆUêˆNêˆGêˆ@êˆ9êˆ2êˆ+êˆ$êˆêˆêˆêˆêˆêˆúéˆóéˆìéˆåéˆÞéˆ×éˆÐéˆÉéˆÂ鈻鈴鈭鈦鈟鈘鈑鈊鈃éˆ|éˆuéˆnéˆgéˆ`éˆYéˆRéˆKéˆDéˆ=éˆ6éˆ/éˆ(éˆ!éˆéˆéˆ éˆéˆþèˆ÷èˆðèˆéèˆâèˆÛèˆÔèˆÍèˆÆèˆ¿èˆ¸èˆ±èˆªèˆ£èˆœèˆ•èˆŽèˆ‡èˆ€èˆyèˆrèˆkèˆdèˆ]èˆVèˆOèˆHèˆAèˆ:èˆ3èˆ,èˆ%èˆèˆèˆèˆ èˆèˆûçˆôçˆíçˆæçˆßçˆØçˆÑçˆÊçˆÃ爼爵爮爧爠爙爒爋爄çˆ}çˆvçˆoçˆhçˆaçˆZçˆSçˆLçˆEçˆ>çˆ7çˆ0çˆ)çˆ"çˆçˆçˆ çˆçˆÿæˆøæˆñæˆêæˆãæˆÜæˆÕæˆÎæˆÇæˆÀæˆ¹æˆ²æˆ«æˆ¤æˆæˆ–æˆæˆˆæˆæˆzæˆsæˆlæˆeæˆ^æˆWæˆPæˆIæˆBæˆ;æˆ4æˆ-æˆ&æˆæˆæˆæˆ æˆæˆüåˆõåˆîåˆçåˆàåˆÙåˆÒåˆËåˆÄ刽制刯刨刡刚刓刌刅åˆ~åˆwåˆpåˆiåˆbåˆ[åˆTåˆMåˆFåˆ?åˆ8åˆ1åˆ*åˆ#åˆåˆåˆåˆåˆåˆùäˆòäˆëäˆääˆÝäˆÖäˆÏäˆÈäˆÁ䈺䈳䈬䈥䈞䈗äˆäˆ‰äˆ‚äˆ{äˆtäˆmäˆfäˆ_äˆXäˆQäˆJäˆCäˆ<äˆ5äˆ.äˆ'äˆ äˆäˆäˆ äˆäˆýãˆöãˆïãˆèãˆáãˆÚãˆÓãˆÌãˆÅ㈾㈷㈰㈩㈢㈛㈔ãˆãˆ†ãˆãˆxãˆqãˆjãˆcãˆ\ãˆUãˆNãˆGãˆ@ãˆ9ãˆ2ãˆ+ãˆ$ãˆãˆãˆãˆãˆãˆúâˆóâˆìâˆåâˆÞâˆ×âˆÐâˆÉâˆÂ∻∴∭∦∟∘∑∊∃âˆ|âˆuâˆnâˆgâˆ`âˆYâˆRâˆKâˆDâˆ=âˆ6âˆ/âˆ(âˆ!âˆâˆâˆ âˆâˆþáˆ÷áˆðáˆéáˆâáˆÛáˆÔáˆÍáˆÆáˆ¿áˆ¸áˆ±áˆªáˆ£áˆœáˆ•áˆŽáˆ‡áˆ€áˆyáˆráˆkáˆdáˆ]áˆVáˆOáˆHáˆAáˆ:áˆ3áˆ,áˆ%áˆáˆáˆáˆ áˆáˆûàˆôàˆíàˆæàˆßàˆØàˆÑàˆÊàˆÃàˆ¼àˆµàˆ®àˆ§àˆ àˆ™àˆ’àˆ‹àˆ„àˆ}àˆvàˆoàˆhàˆaàˆZàˆSàˆLàˆEàˆ>àˆ7àˆ0àˆ)àˆ"àˆàˆàˆ àˆàˆÿ߈øßˆñ߈ê߈ã߈Ü߈Õ߈Î߈Ç߈À߈¹ßˆ²ßˆ«ßˆ¤ßˆ߈–߈߈ˆßˆ߈z߈s߈l߈e߈^߈W߈P߈I߈B߈;߈4߈-߈&߈߈߈߈ ߈߈üÞˆõÞˆîÞˆçÞˆàÞˆÙÞˆÒÞˆËÞˆÄÞˆ½Þˆ¶Þˆ¯Þˆ¨Þˆ¡ÞˆšÞˆ“ÞˆŒÞˆ…Þˆ~ÞˆwÞˆpÞˆiÞˆbÞˆ[ÞˆTÞˆMÞˆFÞˆ?Þˆ8Þˆ1Þˆ*Þˆ#ÞˆÞˆÞˆÞˆÞˆÞˆù݈ò݈ë݈ä݈Ý݈Ö݈Ï݈È݈Á݈ºÝˆ³Ýˆ¬Ýˆ¥ÝˆžÝˆ—݈݈‰Ýˆ‚݈{݈t݈m݈f݈_݈X݈Q݈J݈C݈<݈5݈.݈'݈ ݈݈݈ ݈݈ý܈ö܈ï܈è܈á܈Ú܈Ó܈Ì܈Å܈¾Üˆ·Üˆ°Üˆ©Üˆ¢Üˆ›Üˆ”܈܈†Üˆ܈x܈q܈j܈c܈\܈U܈N܈G܈@܈9܈2܈+܈$܈܈܈܈܈܈úÛˆóÛˆìÛˆåÛˆÞÛˆ×ÛˆÐÛˆÉÛˆÂÛˆ»Ûˆ´Ûˆ­Ûˆ¦ÛˆŸÛˆ˜Ûˆ‘ÛˆŠÛˆƒÛˆ|ÛˆuÛˆnÛˆgÛˆ`ÛˆYÛˆRÛˆKÛˆDÛˆ=Ûˆ6Ûˆ/Ûˆ(Ûˆ!ÛˆÛˆÛˆ ÛˆÛˆþÚˆ÷ÚˆðÚˆéÚˆâÚˆÛÚˆÔÚˆÍÚˆÆÚˆ¿Úˆ¸Úˆ±ÚˆªÚˆ£ÚˆœÚˆ•ÚˆŽÚˆ‡Úˆ€ÚˆyÚˆrÚˆkÚˆdÚˆ]ÚˆVÚˆOÚˆHÚˆAÚˆ:Úˆ3Úˆ,Úˆ%ÚˆÚˆÚˆÚˆ ÚˆÚˆûÙˆôÙˆíÙˆæÙˆßÙˆØÙˆÑÙˆÊÙˆÃÙˆ¼ÙˆµÙˆ®Ùˆ§Ùˆ Ùˆ™Ùˆ’Ùˆ‹Ùˆ„Ùˆ}ÙˆvÙˆoÙˆhÙˆaÙˆZÙˆSÙˆLÙˆEÙˆ>Ùˆ7Ùˆ0Ùˆ)Ùˆ"ووو ووÿ؈øØˆñ؈êØˆãØˆÜØˆÕØˆÎØˆÇ؈À؈¹Øˆ²Øˆ«Øˆ¤Øˆ؈–؈؈ˆØˆ؈z؈s؈l؈e؈^؈W؈P؈I؈B؈;؈4؈-؈&؈؈؈؈ ؈؈ü׈õ׈î׈ç׈à׈Ù׈Ò׈Ë׈Ä׈½×ˆ¶×ˆ¯×ˆ¨×ˆ¡×ˆš×ˆ“׈Œ×ˆ…׈~׈w׈p׈i׈b׈[׈T׈M׈F׈?׈8׈1׈*׈#׈׈׈׈׈׈ùÖˆòÖˆëÖˆäÖˆÝÖˆÖÖˆÏÖˆÈÖˆÁÖˆºÖˆ³Öˆ¬Öˆ¥ÖˆžÖˆ—ÖˆÖˆ‰Öˆ‚Öˆ{ÖˆtÖˆmÖˆfÖˆ_ÖˆXÖˆQÖˆJÖˆCÖˆ<Öˆ5Öˆ.Öˆ'Öˆ ÖˆÖˆÖˆ ÖˆÖˆýÕˆöÕˆïÕˆèÕˆáÕˆÚÕˆÓÕˆÌÕˆÅÕˆ¾Õˆ·Õˆ°Õˆ©Õˆ¢Õˆ›Õˆ”ÕˆÕˆ†ÕˆÕˆxÕˆqÕˆjÕˆcÕˆ\ÕˆUÕˆNÕˆGÕˆ@Õˆ9Õˆ2Õˆ+Õˆ$ÕˆÕˆÕˆÕˆÕˆÕˆúÔˆóÔˆìÔˆåÔˆÞÔˆ×ÔˆÐÔˆÉÔˆÂÔˆ»Ôˆ´Ôˆ­Ôˆ¦ÔˆŸÔˆ˜Ôˆ‘ÔˆŠÔˆƒÔˆ|ÔˆuÔˆnÔˆgÔˆ`ÔˆYÔˆRÔˆKÔˆDÔˆ=Ôˆ6Ôˆ/Ôˆ(Ôˆ!ÔˆÔˆÔˆ ÔˆÔˆþÓˆ÷ÓˆðÓˆéÓˆâÓˆÛÓˆÔÓˆÍÓˆÆÓˆ¿Óˆ¸Óˆ±ÓˆªÓˆ£ÓˆœÓˆ•ÓˆŽÓˆ‡Óˆ€ÓˆyÓˆrÓˆkÓˆdÓˆ]ÓˆVÓˆOÓˆHÓˆAÓˆ:Óˆ3Óˆ,Óˆ%ÓˆÓˆÓˆÓˆ ÓˆÓˆûÒˆôÒˆíÒˆæÒˆßÒˆØÒˆÑÒˆÊÒˆÃÒˆ¼ÒˆµÒˆ®Òˆ§Òˆ Òˆ™Òˆ’Òˆ‹Òˆ„Òˆ}ÒˆvÒˆoÒˆhÒˆaÒˆZÒˆSÒˆLÒˆEÒˆ>Òˆ7Òˆ0Òˆ)Òˆ"ÒˆÒˆÒˆ ÒˆÒˆÿшøÑˆñшêшãшÜшÕшÎшÇшÀш¹Ñˆ²Ñˆ«Ñˆ¤Ñˆш–шшˆÑˆшzшsшlшeш^шWшPшIшBш;ш4ш-ш&шшшш шшüЈõЈîЈçЈàЈÙЈÒЈËЈÄЈ½Ðˆ¶Ðˆ¯Ðˆ¨Ðˆ¡ÐˆšÐˆ“ЈŒÐˆ…Ј~ЈwЈpЈiЈbЈ[ЈTЈMЈFЈ?Ј8Ј1Ј*Ј#ЈЈЈЈЈЈùψòψëψäψÝψÖψÏψÈψÁψºÏˆ³Ïˆ¬Ïˆ¥ÏˆžÏˆ—ψψ‰Ïˆ‚ψ{ψtψmψfψ_ψXψQψJψCψ<ψ5ψ.ψ'ψ ψψψ ψψýΈöΈïΈèΈáΈÚΈÓΈÌΈÅΈ¾Îˆ·Îˆ°Îˆ©Îˆ¢Îˆ›Îˆ”ΈΈ†ÎˆΈxΈqΈjΈcΈ\ΈUΈNΈGΈ@Έ9Έ2Έ+Έ$ΈΈΈΈΈΈú͈ó͈ì͈å͈Þ͈×͈Ð͈É͈Â͈»Íˆ´Íˆ­Íˆ¦ÍˆŸÍˆ˜Íˆ‘͈ŠÍˆƒÍˆ|͈u͈n͈g͈`͈Y͈R͈K͈D͈=͈6͈/͈(͈!͈͈͈ ͈͈þ̈÷̈ð̈é̈â̈Û̈Ô̈Í̈ÆÌˆ¿Ìˆ¸Ìˆ±ÌˆªÌˆ£ÌˆœÌˆ•̈ŽÌˆ‡Ìˆ€Ìˆÿr̈k̈d̈]̈V̈ÖḦÄ:̈3̈,̈%̈̈̈̈ ̈̈ûˈôˈíˈæËˆßˈØËˆÑˈÊˈÃˈ¼ËˆµËˆ®Ëˆ§Ëˆ Ëˆ™Ëˆ’ˈ‹Ëˆ„ˈ}ˈvˈoˈhˈaˈZˈSˈLˈEˈ>ˈ7ˈ0ˈ)ˈ"ˈˈˈ ˈˈÿʈøÊˆñʈêʈãʈÜʈÕʈÎʈÇʈÀʈ¹Êˆ²Êˆ«Êˆ¤Êˆʈ–ʈʈˆÊˆʈzʈsʈlʈeʈ^ʈWʈPʈIʈBʈ;ʈ4ʈ-ʈ&ʈʈʈʈ ʈʈüɈõɈîɈçɈàɈÙɈÒɈËɈÄɈ½Éˆ¶Éˆ¯Éˆ¨Éˆ¡ÉˆšÉˆ“ɈŒÉˆ…Ɉ~ɈwɈpɈiɈbɈ[ɈTɈMɈFɈ?Ɉ8Ɉ1Ɉ*Ɉ#ɈɈɈɈɈɈùȈòȈëȈäȈÝȈÖȈÏȈÈȈÁȈºÈˆ³Èˆ¬Èˆ¥ÈˆžÈˆ—ȈȈ‰Èˆ‚Ȉ{ȈtȈmȈfȈ_ȈXȈQȈJȈCȈ<Ȉ5Ȉ.Ȉ'Ȉ ȈȈȈ ȈȈýLjöLjïLjèLjáLjÚLjÓLjÌLjÅLj¾Çˆ·Çˆ°Çˆ©Çˆ¢Çˆ›Çˆ”LjLj†ÇˆLjxLjqLjjLjcLj\LjULjNLjGLj@Lj9Lj2Lj+Lj$LjLjLjLjLjLjúƈóƈìÆˆåÆˆÞÆˆׯˆÐÆˆÉÆˆÂƈ»Æˆ´Æˆ­Æˆ¦ÆˆŸÆˆ˜Æˆ‘ƈŠÆˆƒÆˆ|ƈuƈnƈgƈ`ƈYƈRƈKƈDƈ=ƈ6ƈ/ƈ(ƈ!ƈƈƈ ƈƈþň÷ňðňéňâňÛňÔňÍňÆÅˆ¿Åˆ¸Åˆ±ÅˆªÅˆ£ÅˆœÅˆ•ňŽÅˆ‡Åˆ€Åˆyňrňkňdň]ňVňOňHňAň:ň3ň,ň%ňňňň ňňûĈôĈíĈæÄˆßĈØÄˆÑĈÊĈÃĈ¼ÄˆµÄˆ®Äˆ§Äˆ Äˆ™Äˆ’Ĉ‹Äˆ„Ĉ}ĈvĈoĈhĈaĈZĈSĈLĈEĈ>Ĉ7Ĉ0Ĉ)Ĉ"ĈĈĈ ĈĈÿÈøÃˆñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈȖÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüˆõˆîˆçˆàˆÙˆÒˆˈĈ½Âˆ¶Âˆ¯Âˆ¨Âˆ¡ÂˆšÂˆ“ˆŒÂˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆùÁˆòÁˆëÁˆäÁˆÝÁˆÖÁˆÏÁˆÈÁˆÁÁˆºÁˆ³Áˆ¬Áˆ¥ÁˆžÁˆ—ÁˆÁˆ‰Áˆ‚Áˆ{ÁˆtÁˆmÁˆfÁˆ_ÁˆXÁˆQÁˆJÁˆCÁˆ<Áˆ5Áˆ.Áˆ'Áˆ ÁˆÁˆÁˆ ÁˆÁˆýÀˆöÀˆïÀˆèÀˆáÀˆÚÀˆÓÀˆÌÀˆÅÀˆ¾Àˆ·Àˆ°Àˆ©Àˆ¢Àˆ›Àˆ”ÀˆÀˆ†ÀˆÀˆxÀˆqÀˆjÀˆcÀˆ\ÀˆUÀˆNÀˆGÀˆ@Àˆ9Àˆ2Àˆ+Àˆ$ÀˆÀˆÀˆÀˆÀˆÀˆú¿ˆó¿ˆ쿈忈Þ¿ˆ׿ˆпˆÉ¿ˆ¿ˆ»¿ˆ´¿ˆ­¿ˆ¦¿ˆŸ¿ˆ˜¿ˆ‘¿ˆŠ¿ˆƒ¿ˆ|¿ˆu¿ˆn¿ˆg¿ˆ`¿ˆY¿ˆR¿ˆK¿ˆD¿ˆ=¿ˆ6¿ˆ/¿ˆ(¿ˆ!¿ˆ¿ˆ¿ˆ ¿ˆ¿ˆþ¾ˆ÷¾ˆð¾ˆ龈⾈Û¾ˆÔ¾ˆ;ˆƾˆ¿¾ˆ¸¾ˆ±¾ˆª¾ˆ£¾ˆœ¾ˆ•¾ˆ޾ˆ‡¾ˆ€¾ˆy¾ˆr¾ˆk¾ˆd¾ˆ]¾ˆV¾ˆO¾ˆH¾ˆA¾ˆ:¾ˆ3¾ˆ,¾ˆ%¾ˆ¾ˆ¾ˆ¾ˆ ¾ˆ¾ˆû½ˆô½ˆí½ˆ潈ß½ˆؽˆѽˆʽˆýˆ¼½ˆµ½ˆ®½ˆ§½ˆ ½ˆ™½ˆ’½ˆ‹½ˆ„½ˆ}½ˆv½ˆo½ˆh½ˆa½ˆZ½ˆS½ˆL½ˆE½ˆ>½ˆ7½ˆ0½ˆ)½ˆ"½ˆ½ˆ½ˆ ½ˆ½ˆÿ¼ˆø¼ˆñ¼ˆ꼈㼈ܼˆÕ¼ˆμˆǼˆÀ¼ˆ¹¼ˆ²¼ˆ«¼ˆ¤¼ˆ¼ˆ–¼ˆ¼ˆˆ¼ˆ¼ˆz¼ˆs¼ˆl¼ˆe¼ˆ^¼ˆW¼ˆP¼ˆI¼ˆB¼ˆ;¼ˆ4¼ˆ-¼ˆ&¼ˆ¼ˆ¼ˆ¼ˆ ¼ˆ¼ˆü»ˆõ»ˆ终່Ù»ˆÒ»ˆË»ˆÄ»ˆ½»ˆ¶»ˆ¯»ˆ¨»ˆ¡»ˆš»ˆ“»ˆŒ»ˆ…»ˆ~»ˆw»ˆp»ˆi»ˆb»ˆ[»ˆT»ˆM»ˆF»ˆ?»ˆ8»ˆ1»ˆ*»ˆ#»ˆ»ˆ»ˆ»ˆ»ˆ»ˆùºˆòºˆ뺈予ݺˆÖºˆϺˆȺˆÁºˆººˆ³ºˆ¬ºˆ¥ºˆžºˆ—ºˆºˆ‰ºˆ‚ºˆ{ºˆtºˆmºˆfºˆ_ºˆXºˆQºˆJºˆCºˆ<ºˆ5ºˆ.ºˆ'ºˆ ºˆºˆºˆ ºˆºˆý¹ˆö¹ˆ﹈蹈ṈÚ¹ˆÓ¹ˆ̹ˆŹˆ¾¹ˆ·¹ˆ°¹ˆ©¹ˆ¢¹ˆ›¹ˆ”¹ˆ¹ˆ†¹ˆ¹ˆx¹ˆq¹ˆj¹ˆc¹ˆ\¹ˆU¹ˆN¹ˆG¹ˆ@¹ˆ9¹ˆ2¹ˆ+¹ˆ$¹ˆ¹ˆ¹ˆ¹ˆ¹ˆ¹ˆú¸ˆó¸ˆ츈师Þ¸ˆ׸ˆиˆɸˆ¸ˆ»¸ˆ´¸ˆ­¸ˆ¦¸ˆŸ¸ˆ˜¸ˆ‘¸ˆЏˆƒ¸ˆ|¸ˆu¸ˆn¸ˆg¸ˆ`¸ˆY¸ˆR¸ˆK¸ˆD¸ˆ=¸ˆ6¸ˆ/¸ˆ(¸ˆ!¸ˆ¸ˆ¸ˆ ¸ˆ¸ˆþ·ˆ÷·ˆð·ˆé·ˆâ·ˆÛ·ˆÔ·ˆÍ·ˆÆ·ˆ¿·ˆ¸·ˆ±·ˆª·ˆ£·ˆœ·ˆ•·ˆŽ·ˆ‡·ˆ€·ˆy·ˆr·ˆk·ˆd·ˆ]·ˆV·ˆO·ˆH·ˆA·ˆ:·ˆ3·ˆ,·ˆ%·ˆ·ˆ·ˆ·ˆ ·ˆ·ˆû¶ˆô¶ˆí¶ˆ消ß¶ˆضˆѶˆʶˆöˆ¼¶ˆµ¶ˆ®¶ˆ§¶ˆ ¶ˆ™¶ˆ’¶ˆ‹¶ˆ„¶ˆ}¶ˆv¶ˆo¶ˆh¶ˆa¶ˆZ¶ˆS¶ˆL¶ˆE¶ˆ>¶ˆ7¶ˆ0¶ˆ)¶ˆ"¶ˆ¶ˆ¶ˆ ¶ˆ¶ˆÿµˆøµˆñµˆ굈㵈ܵˆÕµˆεˆǵˆÀµˆ¹µˆ²µˆ«µˆ¤µˆµˆ–µˆµˆˆµˆµˆzµˆsµˆlµˆeµˆ^µˆWµˆPµˆIµˆBµˆ;µˆ4µˆ-µˆ&µˆµˆµˆµˆ µˆµˆü´ˆõ´ˆî´ˆç´ˆà´ˆÙ´ˆÒ´ˆË´ˆÄ´ˆ½´ˆ¶´ˆ¯´ˆ¨´ˆ¡´ˆš´ˆ“´ˆŒ´ˆ…´ˆ~´ˆw´ˆp´ˆi´ˆb´ˆ[´ˆT´ˆM´ˆF´ˆ?´ˆ8´ˆ1´ˆ*´ˆ#´ˆ´ˆ´ˆ´ˆ´ˆ´ˆù³ˆò³ˆ볈䳈ݳˆÖ³ˆϳˆȳˆÁ³ˆº³ˆ³³ˆ¬³ˆ¥³ˆž³ˆ—³ˆ³ˆ‰³ˆ‚³ˆ{³ˆt³ˆm³ˆf³ˆ_³ˆX³ˆQ³ˆJ³ˆC³ˆ<³ˆ5³ˆ.³ˆ'³ˆ ³ˆ³ˆ³ˆ ³ˆ³ˆý²ˆö²ˆﲈ貈ᲈÚ²ˆÓ²ˆ̲ˆŲˆ¾²ˆ·²ˆ°²ˆ©²ˆ¢²ˆ›²ˆ”²ˆ²ˆ†²ˆ²ˆx²ˆq²ˆj²ˆc²ˆ\²ˆU²ˆN²ˆG²ˆ@²ˆ9²ˆ2²ˆ+²ˆ$²ˆ²ˆ²ˆ²ˆ²ˆ²ˆú±ˆó±ˆ챈屈Þ±ˆ×±ˆбˆɱˆ±ˆ»±ˆ´±ˆ­±ˆ¦±ˆŸ±ˆ˜±ˆ‘±ˆбˆƒ±ˆ|±ˆu±ˆn±ˆg±ˆ`±ˆY±ˆR±ˆK±ˆD±ˆ=±ˆ6±ˆ/±ˆ(±ˆ!±ˆ±ˆ±ˆ ±ˆ±ˆþ°ˆ÷°ˆð°ˆé°ˆâ°ˆÛ°ˆÔ°ˆͰˆưˆ¿°ˆ¸°ˆ±°ˆª°ˆ£°ˆœ°ˆ•°ˆްˆ‡°ˆ€°ˆy°ˆr°ˆk°ˆd°ˆ]°ˆV°ˆO°ˆH°ˆA°ˆ:°ˆ3°ˆ,°ˆ%°ˆ°ˆ°ˆ°ˆ °ˆ°ˆû¯ˆô¯ˆí¯ˆ毈߯ˆدˆѯˆʯˆïˆ¼¯ˆµ¯ˆ®¯ˆ§¯ˆ ¯ˆ™¯ˆ’¯ˆ‹¯ˆ„¯ˆ}¯ˆv¯ˆo¯ˆh¯ˆa¯ˆZ¯ˆS¯ˆL¯ˆE¯ˆ>¯ˆ7¯ˆ0¯ˆ)¯ˆ"¯ˆ¯ˆ¯ˆ ¯ˆ¯ˆÿ®ˆø®ˆñ®ˆꮈ㮈Ü®ˆÕ®ˆήˆÇ®ˆÀ®ˆ¹®ˆ²®ˆ«®ˆ¤®ˆ®ˆ–®ˆ®ˆˆ®ˆ®ˆz®ˆs®ˆl®ˆe®ˆ^®ˆW®ˆP®ˆI®ˆB®ˆ;®ˆ4®ˆ-®ˆ&®ˆ®ˆ®ˆ®ˆ ®ˆ®ˆü­ˆõ­ˆî­ˆç­ˆà­ˆÙ­ˆÒ­ˆË­ˆÄ­ˆ½­ˆ¶­ˆ¯­ˆ¨­ˆ¡­ˆš­ˆ“­ˆŒ­ˆ…­ˆ~­ˆw­ˆp­ˆi­ˆb­ˆ[­ˆT­ˆM­ˆF­ˆ?­ˆ8­ˆ1­ˆ*­ˆ#­ˆ­ˆ­ˆ­ˆ­ˆ­ˆù¬ˆò¬ˆ묈䬈ݬˆÖ¬ˆϬˆȬˆÁ¬ˆº¬ˆ³¬ˆ¬¬ˆ¥¬ˆž¬ˆ—¬ˆ¬ˆ‰¬ˆ‚¬ˆ{¬ˆt¬ˆm¬ˆf¬ˆ_¬ˆX¬ˆQ¬ˆJ¬ˆC¬ˆ<¬ˆ5¬ˆ.¬ˆ'¬ˆ ¬ˆ¬ˆ¬ˆ ¬ˆ¬ˆý«ˆö«ˆ靖諈᫈Ú«ˆÓ«ˆÌ«ˆÅ«ˆ¾«ˆ·«ˆ°«ˆ©«ˆ¢«ˆ›«ˆ”«ˆ«ˆ†«ˆ«ˆx«ˆq«ˆj«ˆc«ˆ\«ˆU«ˆN«ˆG«ˆ@«ˆ9«ˆ2«ˆ+«ˆ$«ˆ«ˆ«ˆ«ˆ«ˆ«ˆúªˆóªˆ쪈媈ÞªˆתˆЪˆɪˆªˆ»ªˆ´ªˆ­ªˆ¦ªˆŸªˆ˜ªˆ‘ªˆŠªˆƒªˆ|ªˆuªˆnªˆgªˆ`ªˆYªˆRªˆKªˆDªˆ=ªˆ6ªˆ/ªˆ(ªˆ!ªˆªˆªˆ ªˆªˆþ©ˆ÷©ˆð©ˆ驈⩈Û©ˆÔ©ˆÍ©ˆÆ©ˆ¿©ˆ¸©ˆ±©ˆª©ˆ£©ˆœ©ˆ•©ˆŽ©ˆ‡©ˆ€©ˆy©ˆr©ˆk©ˆd©ˆ]©ˆV©ˆO©ˆH©ˆA©ˆ:©ˆ3©ˆ,©ˆ%©ˆ©ˆ©ˆ©ˆ ©ˆ©ˆû¨ˆô¨ˆí¨ˆ樈ߨˆبˆѨˆʨˆèˆ¼¨ˆµ¨ˆ®¨ˆ§¨ˆ ¨ˆ™¨ˆ’¨ˆ‹¨ˆ„¨ˆ}¨ˆv¨ˆo¨ˆh¨ˆa¨ˆZ¨ˆS¨ˆL¨ˆE¨ˆ>¨ˆ7¨ˆ0¨ˆ)¨ˆ"¨ˆ¨ˆ¨ˆ ¨ˆ¨ˆÿ§ˆø§ˆñ§ˆ꧈㧈ܧˆÕ§ˆΧˆǧˆÀ§ˆ¹§ˆ²§ˆ«§ˆ¤§ˆ§ˆ–§ˆ§ˆˆ§ˆ§ˆz§ˆs§ˆl§ˆe§ˆ^§ˆW§ˆP§ˆI§ˆB§ˆ;§ˆ4§ˆ-§ˆ&§ˆ§ˆ§ˆ§ˆ §ˆ§ˆü¦ˆõ¦ˆ禈ঈÙ¦ˆÒ¦ˆ˦ˆĦˆ½¦ˆ¶¦ˆ¯¦ˆ¨¦ˆ¡¦ˆš¦ˆ“¦ˆŒ¦ˆ…¦ˆ~¦ˆw¦ˆp¦ˆi¦ˆb¦ˆ[¦ˆT¦ˆM¦ˆF¦ˆ?¦ˆ8¦ˆ1¦ˆ*¦ˆ#¦ˆ¦ˆ¦ˆ¦ˆ¦ˆ¦ˆù¥ˆò¥ˆ륈䥈Ý¥ˆÖ¥ˆÏ¥ˆÈ¥ˆÁ¥ˆº¥ˆ³¥ˆ¬¥ˆ¥¥ˆž¥ˆ—¥ˆ¥ˆ‰¥ˆ‚¥ˆ{¥ˆt¥ˆm¥ˆf¥ˆ_¥ˆX¥ˆQ¥ˆJ¥ˆC¥ˆ<¥ˆ5¥ˆ.¥ˆ'¥ˆ ¥ˆ¥ˆ¥ˆ ¥ˆ¥ˆý¤ˆö¤ˆ龜褈ᤈÚ¤ˆÓ¤ˆ̤ˆŤˆ¾¤ˆ·¤ˆ°¤ˆ©¤ˆ¢¤ˆ›¤ˆ”¤ˆ¤ˆ†¤ˆ¤ˆx¤ˆq¤ˆj¤ˆc¤ˆ\¤ˆU¤ˆN¤ˆG¤ˆ@¤ˆ9¤ˆ2¤ˆ+¤ˆ$¤ˆ¤ˆ¤ˆ¤ˆ¤ˆ¤ˆú£ˆó£ˆ죈壈Þ£ˆ×£ˆУˆÉ£ˆ£ˆ»£ˆ´£ˆ­£ˆ¦£ˆŸ£ˆ˜£ˆ‘£ˆŠ£ˆƒ£ˆ|£ˆu£ˆn£ˆg£ˆ`£ˆY£ˆR£ˆK£ˆD£ˆ=£ˆ6£ˆ/£ˆ(£ˆ!£ˆ£ˆ£ˆ £ˆ£ˆþ¢ˆ÷¢ˆð¢ˆ颈⢈Û¢ˆÔ¢ˆÍ¢ˆÆ¢ˆ¿¢ˆ¸¢ˆ±¢ˆª¢ˆ£¢ˆœ¢ˆ•¢ˆŽ¢ˆ‡¢ˆ€¢ˆy¢ˆr¢ˆk¢ˆd¢ˆ]¢ˆV¢ˆO¢ˆH¢ˆA¢ˆ:¢ˆ3¢ˆ,¢ˆ%¢ˆ¢ˆ¢ˆ¢ˆ ¢ˆ¢ˆû¡ˆô¡ˆí¡ˆ案ß¡ˆØ¡ˆÑ¡ˆÊ¡ˆáˆ¼¡ˆµ¡ˆ®¡ˆ§¡ˆ ¡ˆ™¡ˆ’¡ˆ‹¡ˆ„¡ˆ}¡ˆv¡ˆo¡ˆh¡ˆa¡ˆZ¡ˆS¡ˆL¡ˆE¡ˆ>¡ˆ7¡ˆ0¡ˆ)¡ˆ"¡ˆ¡ˆ¡ˆ ¡ˆ¡ˆÿ ˆø ˆñ ˆê ˆã ˆÜ ˆÕ ˆΠˆÇ ˆÀ ˆ¹ ˆ² ˆ« ˆ¤ ˆ ˆ– ˆ ˆˆ ˆ ˆz ˆs ˆl ˆe ˆ^ ˆW ˆP ˆI ˆB ˆ; ˆ4 ˆ- ˆ& ˆ ˆ ˆ ˆ  ˆ ˆüŸˆõŸˆ矈àŸˆÙŸˆÒŸˆËŸˆÄŸˆ½Ÿˆ¶Ÿˆ¯Ÿˆ¨Ÿˆ¡ŸˆšŸˆ“ŸˆŒŸˆ…Ÿˆ~ŸˆwŸˆpŸˆiŸˆbŸˆ[ŸˆTŸˆMŸˆFŸˆ?Ÿˆ8Ÿˆ1Ÿˆ*Ÿˆ#ŸˆŸˆŸˆŸˆŸˆŸˆùžˆòžˆ랈䞈ÝžˆÖžˆÏžˆÈžˆÁžˆºžˆ³žˆ¬žˆ¥žˆžžˆ—žˆžˆ‰žˆ‚žˆ{žˆtžˆmžˆfžˆ_žˆXžˆQžˆJžˆCžˆ<žˆ5žˆ.žˆ'žˆ žˆžˆžˆ žˆžˆýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúœˆóœˆ윈圈ÞœˆלˆМˆÉœˆœˆ»œˆ´œˆ­œˆ¦œˆŸœˆ˜œˆ‘œˆŠœˆƒœˆ|œˆuœˆnœˆgœˆ`œˆYœˆRœˆKœˆDœˆ=œˆ6œˆ/œˆ(œˆ!œˆœˆœˆ œˆœˆþ›ˆ÷›ˆð›ˆ雈⛈Û›ˆÔ›ˆÍ›ˆÆ›ˆ¿›ˆ¸›ˆ±›ˆª›ˆ£›ˆœ›ˆ•›ˆŽ›ˆ‡›ˆ€›ˆy›ˆr›ˆk›ˆd›ˆ]›ˆV›ˆO›ˆH›ˆA›ˆ:›ˆ3›ˆ,›ˆ%›ˆ›ˆ›ˆ›ˆ ›ˆ›ˆûšˆôšˆ횈暈ßšˆØšˆÑšˆÊšˆÚˆ¼šˆµšˆ®šˆ§šˆ šˆ™šˆ’šˆ‹šˆ„šˆ}šˆvšˆošˆhšˆašˆZšˆSšˆLšˆEšˆ>šˆ7šˆ0šˆ)šˆ"šˆšˆšˆ šˆšˆÿ™ˆø™ˆñ™ˆꙈ㙈Ü™ˆÕ™ˆΙˆÇ™ˆÀ™ˆ¹™ˆ²™ˆ«™ˆ¤™ˆ™ˆ–™ˆ™ˆˆ™ˆ™ˆz™ˆs™ˆl™ˆe™ˆ^™ˆW™ˆP™ˆI™ˆB™ˆ;™ˆ4™ˆ-™ˆ&™ˆ™ˆ™ˆ™ˆ ™ˆ™ˆü˜ˆõ˜ˆ瘈à˜ˆÙ˜ˆÒ˜ˆ˘ˆĘˆ½˜ˆ¶˜ˆ¯˜ˆ¨˜ˆ¡˜ˆš˜ˆ“˜ˆŒ˜ˆ…˜ˆ~˜ˆw˜ˆp˜ˆi˜ˆb˜ˆ[˜ˆT˜ˆM˜ˆF˜ˆ?˜ˆ8˜ˆ1˜ˆ*˜ˆ#˜ˆ˜ˆ˜ˆ˜ˆ˜ˆ˜ˆù—ˆò—ˆë—ˆä—ˆÝ—ˆÖ—ˆÏ—ˆÈ—ˆÁ—ˆº—ˆ³—ˆ¬—ˆ¥—ˆž—ˆ——ˆ—ˆ‰—ˆ‚—ˆ{—ˆt—ˆm—ˆf—ˆ_—ˆX—ˆQ—ˆJ—ˆC—ˆ<—ˆ5—ˆ.—ˆ'—ˆ —ˆ—ˆ—ˆ —ˆ—ˆý–ˆö–ˆï–ˆè–ˆá–ˆÚ–ˆÓ–ˆÌ–ˆÅ–ˆ¾–ˆ·–ˆ°–ˆ©–ˆ¢–ˆ›–ˆ”–ˆ–ˆ†–ˆ–ˆx–ˆq–ˆj–ˆc–ˆ\–ˆU–ˆN–ˆG–ˆ@–ˆ9–ˆ2–ˆ+–ˆ$–ˆ–ˆ–ˆ–ˆ–ˆ–ˆú•ˆó•ˆ안啈Þ•ˆוˆЕˆÉ•ˆ•ˆ»•ˆ´•ˆ­•ˆ¦•ˆŸ•ˆ˜•ˆ‘•ˆŠ•ˆƒ•ˆ|•ˆu•ˆn•ˆg•ˆ`•ˆY•ˆR•ˆK•ˆD•ˆ=•ˆ6•ˆ/•ˆ(•ˆ!•ˆ•ˆ•ˆ •ˆ•ˆþ”ˆ÷”ˆð”ˆ锈┈Û”ˆÔ”ˆÍ”ˆÆ”ˆ¿”ˆ¸”ˆ±”ˆª”ˆ£”ˆœ”ˆ•”ˆŽ”ˆ‡”ˆ€”ˆy”ˆr”ˆk”ˆd”ˆ]”ˆV”ˆO”ˆH”ˆA”ˆ:”ˆ3”ˆ,”ˆ%”ˆ”ˆ”ˆ”ˆ ”ˆ”ˆû“ˆô“ˆ퓈擈ß“ˆØ“ˆÑ“ˆÊ“ˆÓˆ¼“ˆµ“ˆ®“ˆ§“ˆ “ˆ™“ˆ’“ˆ‹“ˆ„“ˆ}“ˆv“ˆo“ˆh“ˆa“ˆZ“ˆS“ˆL“ˆE“ˆ>“ˆ7“ˆ0“ˆ)“ˆ"“ˆ“ˆ“ˆ “ˆ“ˆÿ’ˆø’ˆñ’ˆê’ˆã’ˆÜ’ˆÕ’ˆÎ’ˆÇ’ˆÀ’ˆ¹’ˆ²’ˆ«’ˆ¤’ˆ’ˆ–’ˆ’ˆˆ’ˆ’ˆz’ˆs’ˆl’ˆe’ˆ^’ˆW’ˆP’ˆI’ˆB’ˆ;’ˆ4’ˆ-’ˆ&’ˆ’ˆ’ˆ’ˆ ’ˆ’ˆü‘ˆõ‘ˆ瑈à‘ˆÙ‘ˆÒ‘ˆË‘ˆÄ‘ˆ½‘ˆ¶‘ˆ¯‘ˆ¨‘ˆ¡‘ˆš‘ˆ“‘ˆŒ‘ˆ…‘ˆ~‘ˆw‘ˆp‘ˆi‘ˆb‘ˆ[‘ˆT‘ˆM‘ˆF‘ˆ?‘ˆ8‘ˆ1‘ˆ*‘ˆ#‘ˆ‘ˆ‘ˆ‘ˆ‘ˆ‘ˆùˆòˆëˆäˆ݈ÖˆψȈÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúŽˆóŽˆ쎈厈ÞŽˆ׎ˆÐŽˆÉŽˆÂŽˆ»Žˆ´Žˆ­Žˆ¦ŽˆŸŽˆ˜Žˆ‘ŽˆŠŽˆƒŽˆ|ŽˆuŽˆnŽˆgŽˆ`ŽˆYŽˆRŽˆKŽˆDŽˆ=Žˆ6Žˆ/Žˆ(Žˆ!ŽˆŽˆŽˆ ŽˆŽˆþˆ÷ˆðˆéˆâˆÛˆÔˆ͈ƈ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûŒˆôŒˆ팈挈ߌˆØŒˆÑŒˆÊŒˆÃŒˆ¼ŒˆµŒˆ®Œˆ§Œˆ Œˆ™Œˆ’Œˆ‹Œˆ„Œˆ}ŒˆvŒˆoŒˆhŒˆaŒˆZŒˆSŒˆLŒˆEŒˆ>Œˆ7Œˆ0Œˆ)Œˆ"ŒˆŒˆŒˆ ŒˆŒˆÿ‹ˆø‹ˆñ‹ˆꋈ㋈Ü‹ˆÕ‹ˆ΋ˆÇ‹ˆÀ‹ˆ¹‹ˆ²‹ˆ«‹ˆ¤‹ˆ‹ˆ–‹ˆ‹ˆˆ‹ˆ‹ˆz‹ˆs‹ˆl‹ˆe‹ˆ^‹ˆW‹ˆP‹ˆI‹ˆB‹ˆ;‹ˆ4‹ˆ-‹ˆ&‹ˆ‹ˆ‹ˆ‹ˆ ‹ˆ‹ˆüŠˆõŠˆ犈àŠˆÙŠˆÒŠˆËŠˆÄŠˆ½Šˆ¶Šˆ¯Šˆ¨Šˆ¡ŠˆšŠˆ“ŠˆŒŠˆ…Šˆ~ŠˆwŠˆpŠˆiŠˆbŠˆ[ŠˆTŠˆMŠˆFŠˆ?Šˆ8Šˆ1Šˆ*Šˆ#ŠˆŠˆŠˆŠˆŠˆŠˆù‰ˆò‰ˆ뉈䉈݉ˆÖ‰ˆωˆȉˆÁ‰ˆº‰ˆ³‰ˆ¬‰ˆ¥‰ˆž‰ˆ—‰ˆ‰ˆ‰‰ˆ‚‰ˆ{‰ˆt‰ˆm‰ˆf‰ˆ_‰ˆX‰ˆQ‰ˆJ‰ˆC‰ˆ<‰ˆ5‰ˆ.‰ˆ'‰ˆ ‰ˆ‰ˆ‰ˆ ‰ˆ‰ˆýˆˆöˆˆ興ለÚˆˆÓˆˆ̈ˆňˆ¾ˆˆ·ˆˆ°ˆˆ©ˆˆ¢ˆˆ›ˆˆ”ˆˆˆˆ†ˆˆˆˆxˆˆqˆˆjˆˆcˆˆ\ˆˆUˆˆNˆˆGˆˆ@ˆˆ9ˆˆ2ˆˆ+ˆˆ$ˆˆˆˆˆˆˆˆˆˆˆˆú‡ˆó‡ˆ쇈凈Þ‡ˆׇˆЇˆɇˆ‡ˆ»‡ˆ´‡ˆ­‡ˆ¦‡ˆŸ‡ˆ˜‡ˆ‘‡ˆЇˆƒ‡ˆ|‡ˆu‡ˆn‡ˆg‡ˆ`‡ˆY‡ˆR‡ˆK‡ˆD‡ˆ=‡ˆ6‡ˆ/‡ˆ(‡ˆ!‡ˆ‡ˆ‡ˆ ‡ˆ‡ˆþ†ˆ÷†ˆð†ˆ醈ↈÛ†ˆÔ†ˆ͆ˆƆˆ¿†ˆ¸†ˆ±†ˆª†ˆ£†ˆœ†ˆ•†ˆކˆ‡†ˆ€†ˆy†ˆr†ˆk†ˆd†ˆ]†ˆV†ˆO†ˆH†ˆA†ˆ:†ˆ3†ˆ,†ˆ%†ˆ†ˆ†ˆ†ˆ †ˆ†ˆû…ˆô…ˆí…ˆæ…ˆß…ˆØ…ˆÑ…ˆÊ…ˆÃ…ˆ¼…ˆµ…ˆ®…ˆ§…ˆ …ˆ™…ˆ’…ˆ‹…ˆ„…ˆ}…ˆv…ˆo…ˆh…ˆa…ˆZ…ˆS…ˆL…ˆE…ˆ>…ˆ7…ˆ0…ˆ)…ˆ"…ˆ…ˆ…ˆ …ˆ…ˆÿ„ˆø„ˆñ„ˆꄈㄈÜ„ˆÕ„ˆ΄ˆÇ„ˆÀ„ˆ¹„ˆ²„ˆ«„ˆ¤„ˆ„ˆ–„ˆ„ˆˆ„ˆ„ˆz„ˆs„ˆl„ˆe„ˆ^„ˆW„ˆP„ˆI„ˆB„ˆ;„ˆ4„ˆ-„ˆ&„ˆ„ˆ„ˆ„ˆ „ˆ„ˆüƒˆõƒˆ烈àƒˆÙƒˆÒƒˆ˃ˆăˆ½ƒˆ¶ƒˆ¯ƒˆ¨ƒˆ¡ƒˆšƒˆ“ƒˆŒƒˆ…ƒˆ~ƒˆwƒˆpƒˆiƒˆbƒˆ[ƒˆTƒˆMƒˆFƒˆ?ƒˆ8ƒˆ1ƒˆ*ƒˆ#ƒˆƒˆƒˆƒˆƒˆƒˆù‚ˆò‚ˆ낈䂈Ý‚ˆÖ‚ˆÏ‚ˆÈ‚ˆÁ‚ˆº‚ˆ³‚ˆ¬‚ˆ¥‚ˆž‚ˆ—‚ˆ‚ˆ‰‚ˆ‚‚ˆ{‚ˆt‚ˆm‚ˆf‚ˆ_‚ˆX‚ˆQ‚ˆJ‚ˆC‚ˆ<‚ˆ5‚ˆ.‚ˆ'‚ˆ ‚ˆ‚ˆ‚ˆ ‚ˆ‚ˆýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú€ˆó€ˆ쀈倈Þ€ˆ×€ˆЀˆÉ€ˆ€ˆ»€ˆ´€ˆ­€ˆ¦€ˆŸ€ˆ˜€ˆ‘€ˆŠ€ˆƒ€ˆ|€ˆu€ˆn€ˆg€ˆ`€ˆY€ˆR€ˆK€ˆD€ˆ=€ˆ6€ˆ/€ˆ(€ˆ!€ˆ€ˆ€ˆ €ˆ€ˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆû~ˆô~ˆí~ˆæ~ˆß~ˆØ~ˆÑ~ˆÊ~ˆÃ~ˆ¼~ˆµ~ˆ®~ˆ§~ˆ ~ˆ™~ˆ’~ˆ‹~ˆ„~ˆ}~ˆv~ˆo~ˆh~ˆa~ˆZ~ˆS~ˆL~ˆE~ˆ>~ˆ7~ˆ0~ˆ)~ˆ"~ˆ~ˆ~ˆ ~ˆ~ˆÿ}ˆø}ˆñ}ˆê}ˆã}ˆÜ}ˆÕ}ˆÎ}ˆÇ}ˆÀ}ˆ¹}ˆ²}ˆ«}ˆ¤}ˆ}ˆ–}ˆ}ˆˆ}ˆ}ˆz}ˆs}ˆl}ˆe}ˆ^}ˆW}ˆP}ˆI}ˆB}ˆ;}ˆ4}ˆ-}ˆ&}ˆ}ˆ}ˆ}ˆ }ˆ}ˆü|ˆõ|ˆî|ˆç|ˆà|ˆÙ|ˆÒ|ˆË|ˆÄ|ˆ½|ˆ¶|ˆ¯|ˆ¨|ˆ¡|ˆš|ˆ“|ˆŒ|ˆ…|ˆ~|ˆw|ˆp|ˆi|ˆb|ˆ[|ˆT|ˆM|ˆF|ˆ?|ˆ8|ˆ1|ˆ*|ˆ#|ˆ|ˆ|ˆ|ˆ|ˆ|ˆù{ˆò{ˆë{ˆä{ˆÝ{ˆÖ{ˆÏ{ˆÈ{ˆÁ{ˆº{ˆ³{ˆ¬{ˆ¥{ˆž{ˆ—{ˆ{ˆ‰{ˆ‚{ˆ{{ˆt{ˆm{ˆf{ˆ_{ˆX{ˆQ{ˆJ{ˆC{ˆ<{ˆ5{ˆ.{ˆ'{ˆ {ˆ{ˆ{ˆ {ˆ{ˆýzˆözˆïzˆèzˆázˆÚzˆÓzˆÌzˆÅzˆ¾zˆ·zˆ°zˆ©zˆ¢zˆ›zˆ”zˆzˆ†zˆzˆxzˆqzˆjzˆczˆ\zˆUzˆNzˆGzˆ@zˆ9zˆ2zˆ+zˆ$zˆzˆzˆzˆzˆzˆúyˆóyˆìyˆåyˆÞyˆ×yˆÐyˆÉyˆÂyˆ»yˆ´yˆ­yˆ¦yˆŸyˆ˜yˆ‘yˆŠyˆƒyˆ|yˆuyˆnyˆgyˆ`yˆYyˆRyˆKyˆDyˆ=yˆ6yˆ/yˆ(yˆ!yˆyˆyˆ yˆyˆþxˆ÷xˆðxˆéxˆâxˆÛxˆÔxˆÍxˆÆxˆ¿xˆ¸xˆ±xˆªxˆ£xˆœxˆ•xˆŽxˆ‡xˆ€xˆyxˆrxˆkxˆdxˆ]xˆVxˆOxˆHxˆAxˆ:xˆ3xˆ,xˆ%xˆxˆxˆxˆ xˆxˆûwˆôwˆíwˆæwˆßwˆØwˆÑwˆÊwˆÃwˆ¼wˆµwˆ®wˆ§wˆ wˆ™wˆ’wˆ‹wˆ„wˆ}wˆvwˆowˆhwˆawˆZwˆSwˆLwˆEwˆ>wˆ7wˆ0wˆ)wˆ"wˆwˆwˆ wˆwˆÿvˆøvˆñvˆêvˆãvˆÜvˆÕvˆÎvˆÇvˆÀvˆ¹vˆ²vˆ«vˆ¤vˆvˆ–vˆvˆˆvˆvˆzvˆsvˆlvˆevˆ^vˆWvˆPvˆIvˆBvˆ;vˆ4vˆ-vˆ&vˆvˆvˆvˆ vˆvˆüuˆõuˆîuˆçuˆàuˆÙuˆÒuˆËuˆÄuˆ½uˆ¶uˆ¯uˆ¨uˆ¡uˆšuˆ“uˆŒuˆ…uˆ~uˆwuˆpuˆiuˆbuˆ[uˆTuˆMuˆFuˆ?uˆ8uˆ1uˆ*uˆ#uˆuˆuˆuˆuˆuˆùtˆòtˆëtˆätˆÝtˆÖtˆÏtˆÈtˆÁtˆºtˆ³tˆ¬tˆ¥tˆžtˆ—tˆtˆ‰tˆ‚tˆ{tˆttˆmtˆftˆ_tˆXtˆQtˆJtˆCtˆpˆ7pˆ0pˆ)pˆ"pˆpˆpˆ pˆpˆÿoˆøoˆñoˆêoˆãoˆÜoˆÕoˆÎoˆÇoˆÀoˆ¹oˆ²oˆ«oˆ¤oˆoˆ–oˆoˆˆoˆoˆzoˆsoˆloˆeoˆ^oˆWoˆPoˆIoˆBoˆ;oˆ4oˆ-oˆ&oˆoˆoˆoˆ oˆoˆünˆõnˆînˆçnˆànˆÙnˆÒnˆËnˆÄnˆ½nˆ¶nˆ¯nˆ¨nˆ¡nˆšnˆ“nˆŒnˆ…nˆ~nˆwnˆpnˆinˆbnˆ[nˆTnˆMnˆFnˆ?nˆ8nˆ1nˆ*nˆ#nˆnˆnˆnˆnˆnˆùmˆòmˆëmˆämˆÝmˆÖmˆÏmˆÈmˆÁmˆºmˆ³mˆ¬mˆ¥mˆžmˆ—mˆmˆ‰mˆ‚mˆ{mˆtmˆmmˆfmˆ_mˆXmˆQmˆJmˆCmˆiˆ7iˆ0iˆ)iˆ"iˆiˆiˆ iˆiˆÿhˆøhˆñhˆêhˆãhˆÜhˆÕhˆÎhˆÇhˆÀhˆ¹hˆ²hˆ«hˆ¤hˆhˆ–hˆhˆˆhˆhˆzhˆshˆlhˆehˆ^hˆWhˆPhˆIhˆBhˆ;hˆ4hˆ-hˆ&hˆhˆhˆhˆ hˆhˆügˆõgˆîgˆçgˆàgˆÙgˆÒgˆËgˆÄgˆ½gˆ¶gˆ¯gˆ¨gˆ¡gˆšgˆ“gˆŒgˆ…gˆ~gˆwgˆpgˆigˆbgˆ[gˆTgˆMgˆFgˆ?gˆ8gˆ1gˆ*gˆ#gˆgˆgˆgˆgˆgˆùfˆòfˆëfˆäfˆÝfˆÖfˆÏfˆÈfˆÁfˆºfˆ³fˆ¬fˆ¥fˆžfˆ—fˆfˆ‰fˆ‚fˆ{fˆtfˆmfˆffˆ_fˆXfˆQfˆJfˆCfˆbˆ7bˆ0bˆ)bˆ"bˆbˆbˆ bˆbˆÿaˆøaˆñaˆêaˆãaˆÜaˆÕaˆÎaˆÇaˆÀaˆ¹aˆ²aˆ«aˆ¤aˆaˆ–aˆaˆˆaˆaˆzaˆsaˆlaˆeaˆ^aˆWaˆPaˆIaˆBaˆ;aˆ4aˆ-aˆ&aˆaˆaˆaˆ aˆaˆü`ˆõ`ˆî`ˆç`ˆà`ˆÙ`ˆÒ`ˆË`ˆÄ`ˆ½`ˆ¶`ˆ¯`ˆ¨`ˆ¡`ˆš`ˆ“`ˆŒ`ˆ…`ˆ~`ˆw`ˆp`ˆi`ˆb`ˆ[`ˆT`ˆM`ˆF`ˆ?`ˆ8`ˆ1`ˆ*`ˆ#`ˆ`ˆ`ˆ`ˆ`ˆ`ˆù_ˆò_ˆë_ˆä_ˆÝ_ˆÖ_ˆÏ_ˆÈ_ˆÁ_ˆº_ˆ³_ˆ¬_ˆ¥_ˆž_ˆ—_ˆ_ˆ‰_ˆ‚_ˆ{_ˆt_ˆm_ˆf_ˆ__ˆX_ˆQ_ˆJ_ˆC_ˆ<_ˆ5_ˆ._ˆ'_ˆ _ˆ_ˆ_ˆ _ˆ_ˆý^ˆö^ˆï^ˆè^ˆá^ˆÚ^ˆÓ^ˆÌ^ˆÅ^ˆ¾^ˆ·^ˆ°^ˆ©^ˆ¢^ˆ›^ˆ”^ˆ^ˆ†^ˆ^ˆx^ˆq^ˆj^ˆc^ˆ\^ˆU^ˆN^ˆG^ˆ@^ˆ9^ˆ2^ˆ+^ˆ$^ˆ^ˆ^ˆ^ˆ^ˆ^ˆú]ˆó]ˆì]ˆå]ˆÞ]ˆ×]ˆÐ]ˆÉ]ˆÂ]ˆ»]ˆ´]ˆ­]ˆ¦]ˆŸ]ˆ˜]ˆ‘]ˆŠ]ˆƒ]ˆ|]ˆu]ˆn]ˆg]ˆ`]ˆY]ˆR]ˆK]ˆD]ˆ=]ˆ6]ˆ/]ˆ(]ˆ!]ˆ]ˆ]ˆ ]ˆ]ˆþ\ˆ÷\ˆð\ˆé\ˆâ\ˆÛ\ˆÔ\ˆÍ\ˆÆ\ˆ¿\ˆ¸\ˆ±\ˆª\ˆ£\ˆœ\ˆ•\ˆŽ\ˆ‡\ˆ€\ˆy\ˆr\ˆk\ˆd\ˆ]\ˆV\ˆO\ˆH\ˆA\ˆ:\ˆ3\ˆ,\ˆ%\ˆ\ˆ\ˆ\ˆ \ˆ\ˆû[ˆô[ˆí[ˆæ[ˆß[ˆØ[ˆÑ[ˆÊ[ˆÃ[ˆ¼[ˆµ[ˆ®[ˆ§[ˆ [ˆ™[ˆ’[ˆ‹[ˆ„[ˆ}[ˆv[ˆo[ˆh[ˆa[ˆZ[ˆS[ˆL[ˆE[ˆ>[ˆ7[ˆ0[ˆ)[ˆ"[ˆ[ˆ[ˆ [ˆ[ˆÿZˆøZˆñZˆêZˆãZˆÜZˆÕZˆÎZˆÇZˆÀZˆ¹Zˆ²Zˆ«Zˆ¤ZˆZˆ–ZˆZˆˆZˆZˆzZˆsZˆlZˆeZˆ^ZˆWZˆPZˆIZˆBZˆ;Zˆ4Zˆ-Zˆ&ZˆZˆZˆZˆ ZˆZˆüYˆõYˆîYˆçYˆàYˆÙYˆÒYˆËYˆÄYˆ½Yˆ¶Yˆ¯Yˆ¨Yˆ¡YˆšYˆ“YˆŒYˆ…Yˆ~YˆwYˆpYˆiYˆbYˆ[YˆTYˆMYˆFYˆ?Yˆ8Yˆ1Yˆ*Yˆ#YˆYˆYˆYˆYˆYˆùXˆòXˆëXˆäXˆÝXˆÖXˆÏXˆÈXˆÁXˆºXˆ³Xˆ¬Xˆ¥XˆžXˆ—XˆXˆ‰Xˆ‚Xˆ{XˆtXˆmXˆfXˆ_XˆXXˆQXˆJXˆCXˆTˆ7Tˆ0Tˆ)Tˆ"TˆTˆTˆ TˆTˆÿSˆøSˆñSˆêSˆãSˆÜSˆÕSˆÎSˆÇSˆÀSˆ¹Sˆ²Sˆ«Sˆ¤SˆSˆ–SˆSˆˆSˆSˆzSˆsSˆlSˆeSˆ^SˆWSˆPSˆISˆBSˆ;Sˆ4Sˆ-Sˆ&SˆSˆSˆSˆ SˆSˆüRˆõRˆîRˆçRˆàRˆÙRˆÒRˆËRˆÄRˆ½Rˆ¶Rˆ¯Rˆ¨Rˆ¡RˆšRˆ“RˆŒRˆ…Rˆ~RˆwRˆpRˆiRˆbRˆ[RˆTRˆMRˆFRˆ?Rˆ8Rˆ1Rˆ*Rˆ#RˆRˆRˆRˆRˆRˆùQˆòQˆëQˆäQˆÝQˆÖQˆÏQˆÈQˆÁQˆºQˆ³Qˆ¬Qˆ¥QˆžQˆ—QˆQˆ‰Qˆ‚Qˆ{QˆtQˆmQˆfQˆ_QˆXQˆQQˆJQˆCQˆMˆ7Mˆ0Mˆ)Mˆ"MˆMˆMˆ MˆMˆÿLˆøLˆñLˆêLˆãLˆÜLˆÕLˆÎLˆÇLˆÀLˆ¹Lˆ²Lˆ«Lˆ¤LˆLˆ–LˆLˆˆLˆLˆzLˆsLˆlLˆeLˆ^LˆWLˆPLˆILˆBLˆ;Lˆ4Lˆ-Lˆ&LˆLˆLˆLˆ LˆLˆüKˆõKˆîKˆçKˆàKˆÙKˆÒKˆËKˆÄKˆ½Kˆ¶Kˆ¯Kˆ¨Kˆ¡KˆšKˆ“KˆŒKˆ…Kˆ~KˆwKˆpKˆiKˆbKˆ[KˆTKˆMKˆFKˆ?Kˆ8Kˆ1Kˆ*Kˆ#KˆKˆKˆKˆKˆKˆùJˆòJˆëJˆäJˆÝJˆÖJˆÏJˆÈJˆÁJˆºJˆ³Jˆ¬Jˆ¥JˆžJˆ—JˆJˆ‰Jˆ‚Jˆ{JˆtJˆmJˆfJˆ_JˆXJˆQJˆJJˆCJˆFˆ7Fˆ0Fˆ)Fˆ"FˆFˆFˆ FˆFˆÿEˆøEˆñEˆêEˆãEˆÜEˆÕEˆÎEˆÇEˆÀEˆ¹Eˆ²Eˆ«Eˆ¤EˆEˆ–EˆEˆˆEˆEˆzEˆsEˆlEˆeEˆ^EˆWEˆPEˆIEˆBEˆ;Eˆ4Eˆ-Eˆ&EˆEˆEˆEˆ EˆEˆüDˆõDˆîDˆçDˆàDˆÙDˆÒDˆËDˆÄDˆ½Dˆ¶Dˆ¯Dˆ¨Dˆ¡DˆšDˆ“DˆŒDˆ…Dˆ~DˆwDˆpDˆiDˆbDˆ[DˆTDˆMDˆFDˆ?Dˆ8Dˆ1Dˆ*Dˆ#DˆDˆDˆDˆDˆDˆùCˆòCˆëCˆäCˆÝCˆÖCˆÏCˆÈCˆÁCˆºCˆ³Cˆ¬Cˆ¥CˆžCˆ—CˆCˆ‰Cˆ‚Cˆ{CˆtCˆmCˆfCˆ_CˆXCˆQCˆJCˆCCˆ?ˆ7?ˆ0?ˆ)?ˆ"?ˆ?ˆ?ˆ ?ˆ?ˆÿ>ˆø>ˆñ>ˆê>ˆã>ˆÜ>ˆÕ>ˆÎ>ˆÇ>ˆÀ>ˆ¹>ˆ²>ˆ«>ˆ¤>ˆ>ˆ–>ˆ>ˆˆ>ˆ>ˆz>ˆs>ˆl>ˆe>ˆ^>ˆW>ˆP>ˆI>ˆB>ˆ;>ˆ4>ˆ->ˆ&>ˆ>ˆ>ˆ>ˆ >ˆ>ˆü=ˆõ=ˆî=ˆç=ˆà=ˆÙ=ˆÒ=ˆË=ˆÄ=ˆ½=ˆ¶=ˆ¯=ˆ¨=ˆ¡=ˆš=ˆ“=ˆŒ=ˆ…=ˆ~=ˆw=ˆp=ˆi=ˆb=ˆ[=ˆT=ˆM=ˆF=ˆ?=ˆ8=ˆ1=ˆ*=ˆ#=ˆ=ˆ=ˆ=ˆ=ˆ=ˆù<ˆò<ˆë<ˆä<ˆÝ<ˆÖ<ˆÏ<ˆÈ<ˆÁ<ˆº<ˆ³<ˆ¬<ˆ¥<ˆž<ˆ—<ˆ<ˆ‰<ˆ‚<ˆ{<ˆt<ˆm<ˆf<ˆ_<ˆX<ˆQ<ˆJ<ˆC<ˆ<<ˆ5<ˆ.<ˆ'<ˆ <ˆ<ˆ<ˆ <ˆ<ˆý;ˆö;ˆï;ˆè;ˆá;ˆÚ;ˆÓ;ˆÌ;ˆÅ;ˆ¾;ˆ·;ˆ°;ˆ©;ˆ¢;ˆ›;ˆ”;ˆ;ˆ†;ˆ;ˆx;ˆq;ˆj;ˆc;ˆ\;ˆU;ˆN;ˆG;ˆ@;ˆ9;ˆ2;ˆ+;ˆ$;ˆ;ˆ;ˆ;ˆ;ˆ;ˆú:ˆó:ˆì:ˆå:ˆÞ:ˆ×:ˆÐ:ˆÉ:ˆÂ:ˆ»:ˆ´:ˆ­:ˆ¦:ˆŸ:ˆ˜:ˆ‘:ˆŠ:ˆƒ:ˆ|:ˆu:ˆn:ˆg:ˆ`:ˆY:ˆR:ˆK:ˆD:ˆ=:ˆ6:ˆ/:ˆ(:ˆ!:ˆ:ˆ:ˆ :ˆ:ˆþ9ˆ÷9ˆð9ˆé9ˆâ9ˆÛ9ˆÔ9ˆÍ9ˆÆ9ˆ¿9ˆ¸9ˆ±9ˆª9ˆ£9ˆœ9ˆ•9ˆŽ9ˆ‡9ˆ€9ˆy9ˆr9ˆk9ˆd9ˆ]9ˆV9ˆO9ˆH9ˆA9ˆ:9ˆ39ˆ,9ˆ%9ˆ9ˆ9ˆ9ˆ 9ˆ9ˆû8ˆô8ˆí8ˆæ8ˆß8ˆØ8ˆÑ8ˆÊ8ˆÃ8ˆ¼8ˆµ8ˆ®8ˆ§8ˆ 8ˆ™8ˆ’8ˆ‹8ˆ„8ˆ}8ˆv8ˆo8ˆh8ˆa8ˆZ8ˆS8ˆL8ˆE8ˆ>8ˆ78ˆ08ˆ)8ˆ"8ˆ8ˆ8ˆ 8ˆ8ˆÿ7ˆø7ˆñ7ˆê7ˆã7ˆÜ7ˆÕ7ˆÎ7ˆÇ7ˆÀ7ˆ¹7ˆ²7ˆ«7ˆ¤7ˆ7ˆ–7ˆ7ˆˆ7ˆ7ˆz7ˆs7ˆl7ˆe7ˆ^7ˆW7ˆP7ˆI7ˆB7ˆ;7ˆ47ˆ-7ˆ&7ˆ7ˆ7ˆ7ˆ 7ˆ7ˆü6ˆõ6ˆî6ˆç6ˆà6ˆÙ6ˆÒ6ˆË6ˆÄ6ˆ½6ˆ¶6ˆ¯6ˆ¨6ˆ¡6ˆš6ˆ“6ˆŒ6ˆ…6ˆ~6ˆw6ˆp6ˆi6ˆb6ˆ[6ˆT6ˆM6ˆF6ˆ?6ˆ86ˆ16ˆ*6ˆ#6ˆ6ˆ6ˆ6ˆ6ˆ6ˆù5ˆò5ˆë5ˆä5ˆÝ5ˆÖ5ˆÏ5ˆÈ5ˆÁ5ˆº5ˆ³5ˆ¬5ˆ¥5ˆž5ˆ—5ˆ5ˆ‰5ˆ‚5ˆ{5ˆt5ˆm5ˆf5ˆ_5ˆX5ˆQ5ˆJ5ˆC5ˆ<5ˆ55ˆ.5ˆ'5ˆ 5ˆ5ˆ5ˆ 5ˆ5ˆý4ˆö4ˆï4ˆè4ˆá4ˆÚ4ˆÓ4ˆÌ4ˆÅ4ˆ¾4ˆ·4ˆ°4ˆ©4ˆ¢4ˆ›4ˆ”4ˆ4ˆ†4ˆ4ˆx4ˆq4ˆj4ˆc4ˆ\4ˆU4ˆN4ˆG4ˆ@4ˆ94ˆ24ˆ+4ˆ$4ˆ4ˆ4ˆ4ˆ4ˆ4ˆú3ˆó3ˆì3ˆå3ˆÞ3ˆ×3ˆÐ3ˆÉ3ˆÂ3ˆ»3ˆ´3ˆ­3ˆ¦3ˆŸ3ˆ˜3ˆ‘3ˆŠ3ˆƒ3ˆ|3ˆu3ˆn3ˆg3ˆ`3ˆY3ˆR3ˆK3ˆD3ˆ=3ˆ63ˆ/3ˆ(3ˆ!3ˆ3ˆ3ˆ 3ˆ3ˆþ2ˆ÷2ˆð2ˆé2ˆâ2ˆÛ2ˆÔ2ˆÍ2ˆÆ2ˆ¿2ˆ¸2ˆ±2ˆª2ˆ£2ˆœ2ˆ•2ˆŽ2ˆ‡2ˆ€2ˆy2ˆr2ˆk2ˆd2ˆ]2ˆV2ˆO2ˆH2ˆA2ˆ:2ˆ32ˆ,2ˆ%2ˆ2ˆ2ˆ2ˆ 2ˆ2ˆû1ˆô1ˆí1ˆæ1ˆß1ˆØ1ˆÑ1ˆÊ1ˆÃ1ˆ¼1ˆµ1ˆ®1ˆ§1ˆ 1ˆ™1ˆ’1ˆ‹1ˆ„1ˆ}1ˆv1ˆo1ˆh1ˆa1ˆZ1ˆS1ˆL1ˆE1ˆ>1ˆ71ˆ01ˆ)1ˆ"1ˆ1ˆ1ˆ 1ˆ1ˆÿ0ˆø0ˆñ0ˆê0ˆã0ˆÜ0ˆÕ0ˆÎ0ˆÇ0ˆÀ0ˆ¹0ˆ²0ˆ«0ˆ¤0ˆ0ˆ–0ˆ0ˆˆ0ˆ0ˆz0ˆs0ˆl0ˆe0ˆ^0ˆW0ˆP0ˆI0ˆB0ˆ;0ˆ40ˆ-0ˆ&0ˆ0ˆ0ˆ0ˆ 0ˆ0ˆü/ˆõ/ˆî/ˆç/ˆà/ˆÙ/ˆÒ/ˆË/ˆÄ/ˆ½/ˆ¶/ˆ¯/ˆ¨/ˆ¡/ˆš/ˆ“/ˆŒ/ˆ…/ˆ~/ˆw/ˆp/ˆi/ˆb/ˆ[/ˆT/ˆM/ˆF/ˆ?/ˆ8/ˆ1/ˆ*/ˆ#/ˆ/ˆ/ˆ/ˆ/ˆ/ˆù.ˆò.ˆë.ˆä.ˆÝ.ˆÖ.ˆÏ.ˆÈ.ˆÁ.ˆº.ˆ³.ˆ¬.ˆ¥.ˆž.ˆ—.ˆ.ˆ‰.ˆ‚.ˆ{.ˆt.ˆm.ˆf.ˆ_.ˆX.ˆQ.ˆJ.ˆC.ˆ<.ˆ5.ˆ..ˆ'.ˆ .ˆ.ˆ.ˆ .ˆ.ˆý-ˆö-ˆï-ˆè-ˆá-ˆÚ-ˆÓ-ˆÌ-ˆÅ-ˆ¾-ˆ·-ˆ°-ˆ©-ˆ¢-ˆ›-ˆ”-ˆ-ˆ†-ˆ-ˆx-ˆq-ˆj-ˆc-ˆ\-ˆU-ˆN-ˆG-ˆ@-ˆ9-ˆ2-ˆ+-ˆ$-ˆ-ˆ-ˆ-ˆ-ˆ-ˆú,ˆó,ˆì,ˆå,ˆÞ,ˆ×,ˆÐ,ˆÉ,ˆÂ,ˆ»,ˆ´,ˆ­,ˆ¦,ˆŸ,ˆ˜,ˆ‘,ˆŠ,ˆƒ,ˆ|,ˆu,ˆn,ˆg,ˆ`,ˆY,ˆR,ˆK,ˆD,ˆ=,ˆ6,ˆ/,ˆ(,ˆ!,ˆ,ˆ,ˆ ,ˆ,ˆþ+ˆ÷+ˆð+ˆé+ˆâ+ˆÛ+ˆÔ+ˆÍ+ˆÆ+ˆ¿+ˆ¸+ˆ±+ˆª+ˆ£+ˆœ+ˆ•+ˆŽ+ˆ‡+ˆ€+ˆy+ˆr+ˆk+ˆd+ˆ]+ˆV+ˆO+ˆH+ˆA+ˆ:+ˆ3+ˆ,+ˆ%+ˆ+ˆ+ˆ+ˆ +ˆ+ˆû*ˆô*ˆí*ˆæ*ˆß*ˆØ*ˆÑ*ˆÊ*ˆÃ*ˆ¼*ˆµ*ˆ®*ˆ§*ˆ *ˆ™*ˆ’*ˆ‹*ˆ„*ˆ}*ˆv*ˆo*ˆh*ˆa*ˆZ*ˆS*ˆL*ˆE*ˆ>*ˆ7*ˆ0*ˆ)*ˆ"*ˆ*ˆ*ˆ *ˆ*ˆÿ)ˆø)ˆñ)ˆê)ˆã)ˆÜ)ˆÕ)ˆÎ)ˆÇ)ˆÀ)ˆ¹)ˆ²)ˆ«)ˆ¤)ˆ)ˆ–)ˆ)ˆˆ)ˆ)ˆz)ˆs)ˆl)ˆe)ˆ^)ˆW)ˆP)ˆI)ˆB)ˆ;)ˆ4)ˆ-)ˆ&)ˆ)ˆ)ˆ)ˆ )ˆ)ˆü(ˆõ(ˆî(ˆç(ˆà(ˆÙ(ˆÒ(ˆË(ˆÄ(ˆ½(ˆ¶(ˆ¯(ˆ¨(ˆ¡(ˆš(ˆ“(ˆŒ(ˆ…(ˆ~(ˆw(ˆp(ˆi(ˆb(ˆ[(ˆT(ˆM(ˆF(ˆ?(ˆ8(ˆ1(ˆ*(ˆ#(ˆ(ˆ(ˆ(ˆ(ˆ(ˆù'ˆò'ˆë'ˆä'ˆÝ'ˆÖ'ˆÏ'ˆÈ'ˆÁ'ˆº'ˆ³'ˆ¬'ˆ¥'ˆž'ˆ—'ˆ'ˆ‰'ˆ‚'ˆ{'ˆt'ˆm'ˆf'ˆ_'ˆX'ˆQ'ˆJ'ˆC'ˆ<'ˆ5'ˆ.'ˆ''ˆ 'ˆ'ˆ'ˆ 'ˆ'ˆý&ˆö&ˆï&ˆè&ˆá&ˆÚ&ˆÓ&ˆÌ&ˆÅ&ˆ¾&ˆ·&ˆ°&ˆ©&ˆ¢&ˆ›&ˆ”&ˆ&ˆ†&ˆ&ˆx&ˆq&ˆj&ˆc&ˆ\&ˆU&ˆN&ˆG&ˆ@&ˆ9&ˆ2&ˆ+&ˆ$&ˆ&ˆ&ˆ&ˆ&ˆ&ˆú%ˆó%ˆì%ˆå%ˆÞ%ˆ×%ˆÐ%ˆÉ%ˆÂ%ˆ»%ˆ´%ˆ­%ˆ¦%ˆŸ%ˆ˜%ˆ‘%ˆŠ%ˆƒ%ˆ|%ˆu%ˆn%ˆg%ˆ`%ˆY%ˆR%ˆK%ˆD%ˆ=%ˆ6%ˆ/%ˆ(%ˆ!%ˆ%ˆ%ˆ %ˆ%ˆþ$ˆ÷$ˆð$ˆé$ˆâ$ˆÛ$ˆÔ$ˆÍ$ˆÆ$ˆ¿$ˆ¸$ˆ±$ˆª$ˆ£$ˆœ$ˆ•$ˆŽ$ˆ‡$ˆ€$ˆy$ˆr$ˆk$ˆd$ˆ]$ˆV$ˆO$ˆH$ˆA$ˆ:$ˆ3$ˆ,$ˆ%$ˆ$ˆ$ˆ$ˆ $ˆ$ˆû#ˆô#ˆí#ˆæ#ˆß#ˆØ#ˆÑ#ˆÊ#ˆÃ#ˆ¼#ˆµ#ˆ®#ˆ§#ˆ #ˆ™#ˆ’#ˆ‹#ˆ„#ˆ}#ˆv#ˆo#ˆh#ˆa#ˆZ#ˆS#ˆL#ˆE#ˆ>#ˆ7#ˆ0#ˆ)#ˆ"#ˆ#ˆ#ˆ #ˆ#ˆÿ"ˆø"ˆñ"ˆê"ˆã"ˆÜ"ˆÕ"ˆÎ"ˆÇ"ˆÀ"ˆ¹"ˆ²"ˆ«"ˆ¤"ˆ"ˆ–"ˆ"ˆˆ"ˆ"ˆz"ˆs"ˆl"ˆe"ˆ^"ˆW"ˆP"ˆI"ˆB"ˆ;"ˆ4"ˆ-"ˆ&"ˆ"ˆ"ˆ"ˆ "ˆ"ˆü!ˆõ!ˆî!ˆç!ˆà!ˆÙ!ˆÒ!ˆË!ˆÄ!ˆ½!ˆ¶!ˆ¯!ˆ¨!ˆ¡!ˆš!ˆ“!ˆŒ!ˆ…!ˆ~!ˆw!ˆp!ˆi!ˆb!ˆ[!ˆT!ˆM!ˆF!ˆ?!ˆ8!ˆ1!ˆ*!ˆ#!ˆ!ˆ!ˆ!ˆ!ˆ!ˆù ˆò ˆë ˆä ˆÝ ˆÖ ˆÏ ˆÈ ˆÁ ˆº ˆ³ ˆ¬ ˆ¥ ˆž ˆ— ˆ ˆ‰ ˆ‚ ˆ{ ˆt ˆm ˆf ˆ_ ˆX ˆQ ˆJ ˆC ˆ< ˆ5 ˆ. ˆ' ˆ ˆ ˆ ˆ ˆ ˆýˆöˆïˆèˆáˆÚˆÓˆÌˆÅˆ¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúˆóˆìˆåˆÞˆ×ˆÐˆÉˆÂˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûˆôˆíˆæˆßˆØˆÑˆÊˆÃˆ¼ˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿˆøˆñˆêˆãˆÜˆÕˆÎˆÇˆÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆüˆõˆîˆçˆàˆÙˆÒˆËˆÄˆ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆùˆòˆëˆäˆÝˆÖˆÏˆÈˆÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆýˆöˆïˆèˆáˆÚˆÓˆÌˆÅˆ¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúˆóˆìˆåˆÞˆ×ˆÐˆÉˆÂˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûˆôˆíˆæˆßˆØˆÑˆÊˆÃˆ¼ˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿˆøˆñˆêˆãˆÜˆÕˆÎˆÇˆÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆüˆõˆîˆçˆàˆÙˆÒˆËˆÄˆ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆùˆòˆëˆäˆÝˆÖˆÏˆÈˆÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆýˆöˆïˆèˆáˆÚˆÓˆÌˆÅˆ¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúˆóˆìˆåˆÞˆ×ˆÐˆÉˆÂˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûˆôˆíˆæˆßˆØˆÑˆÊˆÃˆ¼ˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿ ˆø ˆñ ˆê ˆã ˆÜ ˆÕ ˆÎ ˆÇ ˆÀ ˆ¹ ˆ² ˆ« ˆ¤ ˆ ˆ– ˆ ˆˆ ˆ ˆz ˆs ˆl ˆe ˆ^ ˆW ˆP ˆI ˆB ˆ; ˆ4 ˆ- ˆ& ˆ ˆ ˆ ˆ ˆ ˆü ˆõ ˆî ˆç ˆà ˆÙ ˆÒ ˆË ˆÄ ˆ½ ˆ¶ ˆ¯ ˆ¨ ˆ¡ ˆš ˆ“ ˆŒ ˆ… ˆ~ ˆw ˆp ˆi ˆb ˆ[ ˆT ˆM ˆF ˆ? ˆ8 ˆ1 ˆ* ˆ# ˆ ˆ ˆ ˆ ˆ ˆù ˆò ˆë ˆä ˆÝ ˆÖ ˆÏ ˆÈ ˆÁ ˆº ˆ³ ˆ¬ ˆ¥ ˆž ˆ— ˆ ˆ‰ ˆ‚ ˆ{ ˆt ˆm ˆf ˆ_ ˆX ˆQ ˆJ ˆC ˆ< ˆ5 ˆ. ˆ' ˆ ˆ ˆ ˆ ˆ ˆý ˆö ˆï ˆè ˆá ˆÚ ˆÓ ˆÌ ˆÅ ˆ¾ ˆ· ˆ° ˆ© ˆ¢ ˆ› ˆ” ˆ ˆ† ˆ ˆx ˆq ˆj ˆc ˆ\ ˆU ˆN ˆG ˆ@ ˆ9 ˆ2 ˆ+ ˆ$ ˆ ˆ ˆ ˆ ˆ ˆú ˆó ˆì ˆå ˆÞ ˆ× ˆÐ ˆÉ ˆ ˆ» ˆ´ ˆ­ ˆ¦ ˆŸ ˆ˜ ˆ‘ ˆŠ ˆƒ ˆ| ˆu ˆn ˆg ˆ` ˆY ˆR ˆK ˆD ˆ= ˆ6 ˆ/ ˆ( ˆ! ˆ ˆ ˆ ˆ ˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûˆôˆíˆæˆßˆØˆÑˆÊˆÃˆ¼ˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿˆøˆñˆêˆãˆÜˆÕˆÎˆÇˆÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆüˆõˆîˆçˆàˆÙˆÒˆËˆÄˆ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆùˆòˆëˆäˆÝˆÖˆÏˆÈˆÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆýˆöˆïˆèˆáˆÚˆÓˆÌˆÅˆ¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆúˆóˆìˆåˆÞˆ×ˆÐˆÉˆÂˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþˆ÷ˆðˆéˆâˆÛˆÔˆÍˆÆˆ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆûˆôˆíˆæˆ߈؈шʈȼˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿÿ‡øÿ‡ñÿ‡êÿ‡ãÿ‡Üÿ‡Õÿ‡Îÿ‡Çÿ‡Àÿ‡¹ÿ‡²ÿ‡«ÿ‡¤ÿ‡ÿ‡–ÿ‡ÿ‡ˆÿ‡ÿ‡zÿ‡sÿ‡lÿ‡eÿ‡^ÿ‡Wÿ‡Pÿ‡Iÿ‡Bÿ‡;ÿ‡4ÿ‡-ÿ‡&ÿ‡ÿ‡ÿ‡ÿ‡ ÿ‡ÿ‡üþ‡õþ‡îþ‡çþ‡àþ‡Ùþ‡Òþ‡Ëþ‡Äþ‡½þ‡¶þ‡¯þ‡¨þ‡¡þ‡šþ‡“þ‡Œþ‡…þ‡~þ‡wþ‡pþ‡iþ‡bþ‡[þ‡Tþ‡Mþ‡Fþ‡?þ‡8þ‡1þ‡*þ‡#þ‡þ‡þ‡þ‡þ‡þ‡ùý‡òý‡ëý‡äý‡Ýý‡Öý‡Ïý‡Èý‡Áý‡ºý‡³ý‡¬ý‡¥ý‡žý‡—ý‡ý‡‰ý‡‚ý‡{ý‡tý‡mý‡fý‡_ý‡Xý‡Qý‡Jý‡Cý‡<ý‡5ý‡.ý‡'ý‡ ý‡ý‡ý‡ ý‡ý‡ýü‡öü‡ïü‡èü‡áü‡Úü‡Óü‡Ìü‡Åü‡¾ü‡·ü‡°ü‡©ü‡¢ü‡›ü‡”ü‡ü‡†ü‡ü‡xü‡qü‡jü‡cü‡\ü‡Uü‡Nü‡Gü‡@ü‡9ü‡2ü‡+ü‡$ü‡ü‡ü‡ü‡ü‡ü‡úû‡óû‡ìû‡åû‡Þû‡×û‡Ðû‡Éû‡Âû‡»û‡´û‡­û‡¦û‡Ÿû‡˜û‡‘û‡Šû‡ƒû‡|û‡uû‡nû‡gû‡`û‡Yû‡Rû‡Kû‡Dû‡=û‡6û‡/û‡(û‡!û‡û‡û‡ û‡û‡þú‡÷ú‡ðú‡éú‡âú‡Ûú‡Ôú‡Íú‡Æú‡¿ú‡¸ú‡±ú‡ªú‡£ú‡œú‡•ú‡Žú‡‡ú‡€ú‡yú‡rú‡kú‡dú‡]ú‡Vú‡Oú‡Hú‡Aú‡:ú‡3ú‡,ú‡%ú‡ú‡ú‡ú‡ ú‡ú‡ûù‡ôù‡íù‡æù‡ßù‡Øù‡Ñù‡Êù‡Ãù‡¼ù‡µù‡®ù‡§ù‡ ù‡™ù‡’ù‡‹ù‡„ù‡}ù‡vù‡où‡hù‡aù‡Zù‡Sù‡Lù‡Eù‡>ù‡7ù‡0ù‡)ù‡"ù‡ù‡ù‡ ù‡ù‡ÿø‡øø‡ñø‡êø‡ãø‡Üø‡Õø‡Îø‡Çø‡Àø‡¹ø‡²ø‡«ø‡¤ø‡ø‡–ø‡ø‡ˆø‡ø‡zø‡sø‡lø‡eø‡^ø‡Wø‡Pø‡Iø‡Bø‡;ø‡4ø‡-ø‡&ø‡ø‡ø‡ø‡ ø‡ø‡ü÷‡õ÷‡î÷‡ç÷‡à÷‡Ù÷‡Ò÷‡Ë÷‡Ä÷‡½÷‡¶÷‡¯÷‡¨÷‡¡÷‡š÷‡“÷‡Œ÷‡…÷‡~÷‡w÷‡p÷‡i÷‡b÷‡[÷‡T÷‡M÷‡F÷‡?÷‡8÷‡1÷‡*÷‡#÷‡÷‡÷‡÷‡÷‡÷‡ùö‡òö‡ëö‡äö‡Ýö‡Öö‡Ïö‡Èö‡Áö‡ºö‡³ö‡¬ö‡¥ö‡žö‡—ö‡ö‡‰ö‡‚ö‡{ö‡tö‡mö‡fö‡_ö‡Xö‡Qö‡Jö‡Cö‡<ö‡5ö‡.ö‡'ö‡ ö‡ö‡ö‡ ö‡ö‡ýõ‡öõ‡ïõ‡èõ‡áõ‡Úõ‡Óõ‡Ìõ‡Åõ‡¾õ‡·õ‡°õ‡©õ‡¢õ‡›õ‡”õ‡õ‡†õ‡õ‡xõ‡qõ‡jõ‡cõ‡\õ‡Uõ‡Nõ‡Gõ‡@õ‡9õ‡2õ‡+õ‡$õ‡õ‡õ‡õ‡õ‡õ‡úô‡óô‡ìô‡åô‡Þô‡×ô‡Ðô‡Éô‡Âô‡»ô‡´ô‡­ô‡¦ô‡Ÿô‡˜ô‡‘ô‡Šô‡ƒô‡|ô‡uô‡nô‡gô‡`ô‡Yô‡Rô‡Kô‡Dô‡=ô‡6ô‡/ô‡(ô‡!ô‡ô‡ô‡ ô‡ô‡þó‡÷ó‡ðó‡éó‡âó‡Ûó‡Ôó‡Íó‡Æó‡¿ó‡¸ó‡±ó‡ªó‡£ó‡œó‡•ó‡Žó‡‡ó‡€ó‡yó‡ró‡kó‡dó‡]ó‡Vó‡Oó‡Hó‡Aó‡:ó‡3ó‡,ó‡%ó‡ó‡ó‡ó‡ ó‡ó‡ûò‡ôò‡íò‡æò‡ßò‡Øò‡Ñò‡Êò‡Ãò‡¼ò‡µò‡®ò‡§ò‡ ò‡™ò‡’ò‡‹ò‡„ò‡}ò‡vò‡oò‡hò‡aò‡Zò‡Sò‡Lò‡Eò‡>ò‡7ò‡0ò‡)ò‡"ò‡ò‡ò‡ ò‡ò‡ÿñ‡øñ‡ññ‡êñ‡ãñ‡Üñ‡Õñ‡Îñ‡Çñ‡Àñ‡¹ñ‡²ñ‡«ñ‡¤ñ‡ñ‡–ñ‡ñ‡ˆñ‡ñ‡zñ‡sñ‡lñ‡eñ‡^ñ‡Wñ‡Pñ‡Iñ‡Bñ‡;ñ‡4ñ‡-ñ‡&ñ‡ñ‡ñ‡ñ‡ ñ‡ñ‡üð‡õð‡îð‡çð‡àð‡Ùð‡Òð‡Ëð‡Äð‡½ð‡¶ð‡¯ð‡¨ð‡¡ð‡šð‡“ð‡Œð‡…ð‡~ð‡wð‡pð‡ið‡bð‡[ð‡Tð‡Mð‡Fð‡?ð‡8ð‡1ð‡*ð‡#ð‡ð‡ð‡ð‡ð‡ð‡ùï‡òï‡ëï‡äï‡Ýï‡Öï‡Ïï‡Èï‡Áï‡ï‡‰ï‡‚ï‡{ï‡tï‡mï‡fï‡_ï‡Xï‡Qï‡Jï‡Cï‡<ï‡5ï‡.ï‡'ï‡ ï‡ï‡ï‡ ï‡ï‡ýî‡öî‡ïî‡èî‡áî‡Úî‡Óî‡Ìî‡Åî‡î‡†î‡î‡xî‡qî‡jî‡cî‡\î‡Uî‡Nî‡Gî‡@î‡9î‡2î‡+î‡$î‡î‡î‡î‡î‡î‡úí‡óí‡ìí‡åí‡Þí‡×í‡Ðí‡Éí‡Â퇻퇴퇭퇦퇟퇘퇑퇊퇃í‡|í‡uí‡ní‡gí‡`í‡Yí‡Rí‡Kí‡Dí‡=í‡6í‡/í‡(í‡!í‡í‡í‡ í‡í‡þì‡÷ì‡ðì‡éì‡âì‡Ûì‡Ôì‡Íì‡Æì‡¿ì‡¸ì‡±ì‡ªì‡£ì‡œì‡•ì‡Žì‡‡ì‡€ì‡yì‡rì‡kì‡dì‡]ì‡Vì‡Oì‡Hì‡Aì‡:ì‡3ì‡,ì‡%ì‡ì‡ì‡ì‡ ì‡ì‡ûë‡ôë‡íë‡æë‡ßë‡Øë‡Ñë‡Êë‡Ã뇼뇵뇮뇧뇠뇙뇒뇋뇄ë‡}ë‡vë‡oë‡hë‡aë‡Zë‡Së‡Lë‡Eë‡>ë‡7ë‡0ë‡)ë‡"ë‡ë‡ë‡ ë‡ë‡ÿê‡øê‡ñê‡êê‡ãê‡Üê‡Õê‡Îê‡Çê‡Àꇹꇲꇫꇤê‡ê‡–ê‡ê‡ˆê‡ê‡zê‡sê‡lê‡eê‡^ê‡Wê‡Pê‡Iê‡Bê‡;ê‡4ê‡-ê‡&ê‡ê‡ê‡ê‡ ê‡ê‡üé‡õé‡îé‡çé‡àé‡Ùé‡Òé‡Ëé‡Ä釽釶釯釨釡釚釓里釅é‡~é‡wé‡pé‡ié‡bé‡[é‡Té‡Mé‡Fé‡?é‡8é‡1é‡*é‡#é‡é‡é‡é‡é‡é‡ùè‡òè‡ëè‡äè‡Ýè‡Öè‡Ïè‡Èè‡Á臺至臬臥臞臗è‡è‡‰è‡‚è‡{è‡tè‡mè‡fè‡_è‡Xè‡Qè‡Jè‡Cè‡<è‡5è‡.è‡'è‡ è‡è‡è‡ è‡è‡ýç‡öç‡ïç‡èç‡áç‡Úç‡Óç‡Ìç‡Å燾燷燰燩燢燛燔ç‡ç‡†ç‡ç‡xç‡qç‡jç‡cç‡\ç‡Uç‡Nç‡Gç‡@ç‡9ç‡2ç‡+ç‡$ç‡ç‡ç‡ç‡ç‡ç‡úæ‡óæ‡ìæ‡忇Þæ‡׿‡Ðæ‡Éæ‡Â懻懴懭懦懟懘懑懊懃æ‡|æ‡uæ‡næ‡gæ‡`æ‡Yæ‡Ræ‡Kæ‡Dæ‡=æ‡6æ‡/æ‡(æ‡!æ‡æ‡æ‡ æ‡æ‡þå‡÷å‡ðå‡éå‡âå‡Ûå‡Ôå‡Íå‡Æå‡¿å‡¸å‡±å‡ªå‡£å‡œå‡•å‡Žå‡‡å‡€å‡yå‡rå‡kå‡då‡]å‡Vå‡Oå‡Hå‡Aå‡:å‡3å‡,å‡%å‡å‡å‡å‡ å‡å‡ûä‡ôä‡í䇿ä‡ß䇨ä‡Ñä‡Êä‡Ã䇼䇵䇮䇧䇠䇙䇒䇋䇄ä‡}ä‡vä‡oä‡hä‡aä‡Zä‡Sä‡Lä‡Eä‡>ä‡7ä‡0ä‡)ä‡"ä‡ä‡ä‡ ä‡ä‡ÿã‡øã‡ñã‡êã‡ãã‡Üã‡Õã‡Îã‡Çã‡Àㇹㇲ㇫㇤ã‡ã‡–ã‡ã‡ˆã‡ã‡zã‡sã‡lã‡eã‡^ã‡Wã‡Pã‡Iã‡Bã‡;ã‡4ã‡-ã‡&ã‡ã‡ã‡ã‡ ã‡ã‡üâ‡õâ‡îâ‡çâ‡àâ‡Ùâ‡Òâ‡Ëâ‡Ä⇽⇶⇯⇨⇡⇚⇓⇌⇅â‡~â‡wâ‡pâ‡iâ‡bâ‡[â‡Tâ‡Mâ‡Fâ‡?â‡8â‡1â‡*â‡#â‡â‡â‡â‡â‡â‡ùá‡òá‡ëá‡äá‡Ýá‡Öá‡Ïá‡Èá‡Áᇺᇳᇬᇥᇞᇗá‡á‡‰á‡‚á‡{á‡tá‡má‡fá‡_á‡Xá‡Qá‡Já‡Cá‡<á‡5á‡.á‡'ᇠá‡á‡á‡ á‡á‡ýà‡öà‡ïà‡èà‡áà‡Úà‡Óà‡Ìà‡Åà‡¾à‡·à‡°à‡©à‡¢à‡›à‡”à‡à‡†à‡à‡xà‡qà‡jà‡cà‡\à‡Uà‡Nà‡Gà‡@à‡9à‡2à‡+à‡$à‡à‡à‡à‡à‡à‡ú߇ó߇ì߇å߇Þ߇×߇Ð߇É߇Â߇»ß‡´ß‡­ß‡¦ß‡Ÿß‡˜ß‡‘߇Šß‡ƒß‡|߇u߇n߇g߇`߇Y߇R߇K߇D߇=߇6߇/߇(߇!߇߇߇ ߇߇þÞ‡÷Þ‡ðÞ‡éÞ‡âÞ‡ÛÞ‡ÔÞ‡ÍÞ‡ÆÞ‡¿Þ‡¸Þ‡±Þ‡ªÞ‡£Þ‡œÞ‡•Þ‡ŽÞ‡‡Þ‡€Þ‡yÞ‡rÞ‡kÞ‡dÞ‡]Þ‡VÞ‡OÞ‡HÞ‡AÞ‡:Þ‡3Þ‡,Þ‡%Þ‡Þ‡Þ‡Þ‡ Þ‡Þ‡û݇ô݇í݇æÝ‡ß݇ØÝ‡Ñ݇Ê݇Ã݇¼Ý‡µÝ‡®Ý‡§Ý‡ Ý‡™Ý‡’݇‹Ý‡„݇}݇v݇o݇h݇a݇Z݇S݇L݇E݇>݇7݇0݇)݇"݇݇݇ ݇݇ÿ܇øÜ‡ñ܇ê܇ã܇Ü܇Õ܇Î܇Ç܇À܇¹Ü‡²Ü‡«Ü‡¤Ü‡܇–܇܇ˆÜ‡܇z܇s܇l܇e܇^܇W܇P܇I܇B܇;܇4܇-܇&܇܇܇܇ ܇܇üÛ‡õÛ‡îÛ‡çÛ‡àÛ‡ÙÛ‡ÒÛ‡ËÛ‡ÄÛ‡½Û‡¶Û‡¯Û‡¨Û‡¡Û‡šÛ‡“Û‡ŒÛ‡…Û‡~Û‡wÛ‡pÛ‡iÛ‡bÛ‡[Û‡TÛ‡MÛ‡FÛ‡?Û‡8Û‡1Û‡*Û‡#Û‡Û‡Û‡Û‡Û‡Û‡ùÚ‡òÚ‡ëÚ‡äÚ‡ÝÚ‡ÖÚ‡ÏÚ‡ÈÚ‡ÁÚ‡ºÚ‡³Ú‡¬Ú‡¥Ú‡žÚ‡—Ú‡Ú‡‰Ú‡‚Ú‡{Ú‡tÚ‡mÚ‡fÚ‡_Ú‡XÚ‡QÚ‡JÚ‡CÚ‡<Ú‡5Ú‡.Ú‡'Ú‡ Ú‡Ú‡Ú‡ Ú‡Ú‡ýÙ‡öÙ‡ïÙ‡èÙ‡áÙ‡ÚÙ‡ÓÙ‡ÌÙ‡ÅÙ‡¾Ù‡·Ù‡°Ù‡©Ù‡¢Ù‡›Ù‡”هه†Ù‡Ù‡xÙ‡qÙ‡jÙ‡cÙ‡\Ù‡UÙ‡NÙ‡GÙ‡@Ù‡9Ù‡2Ù‡+Ù‡$ههههههú؇ó؇ìØ‡娇ÞØ‡ר‡ÐØ‡ÉØ‡Â؇»Ø‡´Ø‡­Ø‡¦Ø‡ŸØ‡˜Ø‡‘؇ŠØ‡ƒØ‡|؇u؇n؇g؇`؇Y؇R؇K؇D؇=؇6؇/؇(؇!؇؇؇ ؇؇þׇ÷ׇðׇéׇâׇÛׇÔׇÍׇÆ×‡¿×‡¸×‡±×‡ª×‡£×‡œ×‡•ׇŽ×‡‡×‡€×‡yׇrׇkׇdׇ]ׇVׇOׇHׇAׇ:ׇ3ׇ,ׇ%ׇׇׇׇ ׇׇûÖ‡ôÖ‡íÖ‡æÖ‡ßÖ‡ØÖ‡ÑÖ‡ÊÖ‡ÃÖ‡¼Ö‡µÖ‡®Ö‡§Ö‡ Ö‡™Ö‡’Ö‡‹Ö‡„Ö‡}Ö‡vÖ‡oÖ‡hÖ‡aÖ‡ZÖ‡SÖ‡LÖ‡EÖ‡>Ö‡7Ö‡0Ö‡)Ö‡"Ö‡Ö‡Ö‡ Ö‡Ö‡ÿÕ‡øÕ‡ñÕ‡êÕ‡ãÕ‡ÜÕ‡ÕÕ‡ÎÕ‡ÇÕ‡ÀÕ‡¹Õ‡²Õ‡«Õ‡¤Õ‡Õ‡–Õ‡Õ‡ˆÕ‡Õ‡zÕ‡sÕ‡lÕ‡eÕ‡^Õ‡WÕ‡PÕ‡IÕ‡BÕ‡;Õ‡4Õ‡-Õ‡&Õ‡Õ‡Õ‡Õ‡ Õ‡Õ‡üÔ‡õÔ‡îÔ‡çÔ‡àÔ‡ÙÔ‡ÒÔ‡ËÔ‡ÄÔ‡½Ô‡¶Ô‡¯Ô‡¨Ô‡¡Ô‡šÔ‡“Ô‡ŒÔ‡…Ô‡~Ô‡wÔ‡pÔ‡iÔ‡bÔ‡[Ô‡TÔ‡MÔ‡FÔ‡?Ô‡8Ô‡1Ô‡*Ô‡#Ô‡Ô‡Ô‡Ô‡Ô‡Ô‡ùÓ‡òÓ‡ëÓ‡äÓ‡ÝÓ‡ÖÓ‡ÏÓ‡ÈÓ‡ÁÓ‡ºÓ‡³Ó‡¬Ó‡¥Ó‡žÓ‡—Ó‡Ó‡‰Ó‡‚Ó‡{Ó‡tÓ‡mÓ‡fÓ‡_Ó‡XÓ‡QÓ‡JÓ‡CÓ‡<Ó‡5Ó‡.Ó‡'Ó‡ Ó‡Ó‡Ó‡ Ó‡Ó‡ýÒ‡öÒ‡ïÒ‡èÒ‡áÒ‡ÚÒ‡ÓÒ‡ÌÒ‡ÅÒ‡¾Ò‡·Ò‡°Ò‡©Ò‡¢Ò‡›Ò‡”Ò‡Ò‡†Ò‡Ò‡xÒ‡qÒ‡jÒ‡cÒ‡\Ò‡UÒ‡NÒ‡GÒ‡@Ò‡9Ò‡2Ò‡+Ò‡$Ò‡Ò‡Ò‡Ò‡Ò‡Ò‡úчóчìчåчÞч×чÐчÉчÂч»Ñ‡´Ñ‡­Ñ‡¦Ñ‡ŸÑ‡˜Ñ‡‘чŠÑ‡ƒÑ‡|чuчnчgч`чYчRчKчDч=ч6ч/ч(ч!ччч ччþЇ÷ЇðЇéЇâЇÛЇÔЇÍЇÆÐ‡¿Ð‡¸Ð‡±Ð‡ªÐ‡£Ð‡œÐ‡•ЇŽÐ‡‡Ð‡€Ð‡yЇrЇkЇdЇ]ЇVЇOЇHЇAЇ:Ї3Ї,Ї%ЇЇЇЇ ЇЇûχôχíχæÏ‡ßχØÏ‡ÑχÊχÃχ¼Ï‡µÏ‡®Ï‡§Ï‡ Ï‡™Ï‡’χ‹Ï‡„χ}χvχoχhχaχZχSχLχEχ>χ7χ0χ)χ"χχχ χχÿ·øÎ‡ñ·ê·ã·Ü·Õ·Î·Ç·À·¹Î‡²Î‡«Î‡¤Î‡·–··ˆÎ‡·z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü͇õ͇î͇ç͇à͇Ù͇Ò͇Ë͇Ä͇½Í‡¶Í‡¯Í‡¨Í‡¡Í‡šÍ‡“͇ŒÍ‡…͇~͇w͇p͇i͇b͇[͇T͇M͇F͇?͇8͇1͇*͇#͇͇͇͇͇͇ù̇ò̇ë̇ä̇Ý̇Ö̇Ï̇È̇Á̇ºÌ‡³Ì‡¬Ì‡¥Ì‡žÌ‡—̇̇‰Ì‡‚̇{̇ṫṁḟ_̇ẊQ̇J̇Ċ<̇5̇.̇'̇ ̇̇̇ ̇̇ýˇöˇïˇèˇáˇÚˇÓˇÌˇŎ¾Ë‡·Ë‡°Ë‡©Ë‡¢Ë‡›Ë‡”ˇˇ†Ë‡ˇxˇqˇjˇcˇ\ˇUˇNˇGˇ@ˇ9ˇ2ˇ+ˇ$ˇˇˇˇˇˇúʇóʇìʇåʇÞʇ×ʇÐʇÉʇÂʇ»Ê‡´Ê‡­Ê‡¦Ê‡ŸÊ‡˜Ê‡‘ʇŠÊ‡ƒÊ‡|ʇuʇnʇgʇ`ʇYʇRʇKʇDʇ=ʇ6ʇ/ʇ(ʇ!ʇʇʇ ʇʇþɇ÷ɇðɇéɇâɇÛɇÔɇÍɇÆÉ‡¿É‡¸É‡±É‡ªÉ‡£É‡œÉ‡•ɇŽÉ‡‡É‡€É‡yɇrɇkɇdɇ]ɇVɇOɇHɇAɇ:ɇ3ɇ,ɇ%ɇɇɇɇ ɇɇûȇôȇíȇæÈ‡ßȇØÈ‡ÑȇÊȇÃȇ¼È‡µÈ‡®È‡§È‡ È‡™È‡’ȇ‹È‡„ȇ}ȇvȇoȇhȇaȇZȇSȇLȇEȇ>ȇ7ȇ0ȇ)ȇ"ȇȇȇ ȇȇÿLJøÇ‡ñLJêLJãLJÜLJÕLJÎLJÇLJÀLJ¹Ç‡²Ç‡«Ç‡¤Ç‡LJ–LJLJˆÇ‡LJzLJsLJlLJeLJ^LJWLJPLJILJBLJ;LJ4LJ-LJ&LJLJLJLJ LJLJüƇõƇîÆ‡çÆ‡àÆ‡ÙÆ‡ÒÆ‡ËÆ‡ÄƇ½Æ‡¶Æ‡¯Æ‡¨Æ‡¡Æ‡šÆ‡“ƇŒÆ‡…Ƈ~ƇwƇpƇiƇbƇ[ƇTƇMƇFƇ?Ƈ8Ƈ1Ƈ*Ƈ#ƇƇƇƇƇƇùŇòŇëŇäŇÝŇÖŇÏŇÈŇÁŇºÅ‡³Å‡¬Å‡¥Å‡žÅ‡—ŇŇ‰Å‡‚Ň{ŇtŇmŇfŇ_ŇXŇQŇJŇCŇ<Ň5Ň.Ň'Ň ŇŇŇ ŇŇýćöćïćèćáćÚćÓćÌćÅć¾Ä‡·Ä‡°Ä‡©Ä‡¢Ä‡›Ä‡”ćć†Ä‡ćxćqćjćcć\ćUćNćGć@ć9ć2ć+ć$ććććććúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘÇ‘NJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþ‡÷‡ð‡é‡â‡Û‡Ô‡͇ÆÂ‡¿Â‡¸Â‡±Â‡ªÂ‡£Â‡œÂ‡•‡ŽÂ‡‡Â‡€Â‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡ûÁ‡ôÁ‡íÁ‡æÁ‡ßÁ‡ØÁ‡ÑÁ‡ÊÁ‡ÃÁ‡¼Á‡µÁ‡®Á‡§Á‡ Á‡™Á‡’Á‡‹Á‡„Á‡}Á‡vÁ‡oÁ‡hÁ‡aÁ‡ZÁ‡SÁ‡LÁ‡EÁ‡>Á‡7Á‡0Á‡)Á‡"Á‡Á‡Á‡ Á‡Á‡ÿÀ‡øÀ‡ñÀ‡êÀ‡ãÀ‡ÜÀ‡ÕÀ‡ÎÀ‡ÇÀ‡ÀÀ‡¹À‡²À‡«À‡¤À‡À‡–À‡À‡ˆÀ‡À‡zÀ‡sÀ‡lÀ‡eÀ‡^À‡WÀ‡PÀ‡IÀ‡BÀ‡;À‡4À‡-À‡&À‡À‡À‡À‡ À‡À‡ü¿‡õ¿‡翇࿇Ù¿‡Ò¿‡Ë¿‡Ä¿‡½¿‡¶¿‡¯¿‡¨¿‡¡¿‡š¿‡“¿‡Œ¿‡…¿‡~¿‡w¿‡p¿‡i¿‡b¿‡[¿‡T¿‡M¿‡F¿‡?¿‡8¿‡1¿‡*¿‡#¿‡¿‡¿‡¿‡¿‡¿‡ù¾‡ò¾‡뾇侇ݾ‡Ö¾‡Ͼ‡Ⱦ‡Á¾‡º¾‡³¾‡¬¾‡¥¾‡ž¾‡—¾‡¾‡‰¾‡‚¾‡{¾‡t¾‡m¾‡f¾‡_¾‡X¾‡Q¾‡J¾‡C¾‡<¾‡5¾‡.¾‡'¾‡ ¾‡¾‡¾‡ ¾‡¾‡ý½‡ö½‡g轇὇Ú½‡Ó½‡̽‡އ¾½‡·½‡°½‡©½‡¢½‡›½‡”½‡½‡†½‡½‡x½‡q½‡j½‡c½‡\½‡U½‡N½‡G½‡@½‡9½‡2½‡+½‡$½‡½‡½‡½‡½‡½‡ú¼‡ó¼‡켇弇Þ¼‡×¼‡м‡ɼ‡¼‡»¼‡´¼‡­¼‡¦¼‡Ÿ¼‡˜¼‡‘¼‡м‡ƒ¼‡|¼‡u¼‡n¼‡g¼‡`¼‡Y¼‡R¼‡K¼‡D¼‡=¼‡6¼‡/¼‡(¼‡!¼‡¼‡¼‡ ¼‡¼‡þ»‡÷»‡ð»‡黇⻇Û»‡Ô»‡Í»‡Æ»‡¿»‡¸»‡±»‡ª»‡£»‡œ»‡•»‡Ž»‡‡»‡€»‡y»‡r»‡k»‡d»‡]»‡V»‡O»‡H»‡A»‡:»‡3»‡,»‡%»‡»‡»‡»‡ »‡»‡ûº‡ôº‡íº‡溇ߺ‡غ‡Ѻ‡ʺ‡ú‡¼º‡µº‡®º‡§º‡ º‡™º‡’º‡‹º‡„º‡}º‡vº‡oº‡hº‡aº‡Zº‡Sº‡Lº‡Eº‡>º‡7º‡0º‡)º‡"º‡º‡º‡ º‡º‡ÿ¹‡ø¹‡ñ¹‡깇㹇ܹ‡Õ¹‡ι‡ǹ‡À¹‡¹¹‡²¹‡«¹‡¤¹‡¹‡–¹‡¹‡ˆ¹‡¹‡z¹‡s¹‡l¹‡e¹‡^¹‡W¹‡P¹‡I¹‡B¹‡;¹‡4¹‡-¹‡&¹‡¹‡¹‡¹‡ ¹‡¹‡ü¸‡õ¸‡縇งÙ¸‡Ò¸‡˸‡ĸ‡½¸‡¶¸‡¯¸‡¨¸‡¡¸‡š¸‡“¸‡Œ¸‡…¸‡~¸‡w¸‡p¸‡i¸‡b¸‡[¸‡T¸‡M¸‡F¸‡?¸‡8¸‡1¸‡*¸‡#¸‡¸‡¸‡¸‡¸‡¸‡ù·‡ò·‡ë·‡ä·‡Ý·‡Ö·‡Ï·‡È·‡Á·‡º·‡³·‡¬·‡¥·‡ž·‡—·‡·‡‰·‡‚·‡{·‡t·‡m·‡f·‡_·‡X·‡Q·‡J·‡C·‡<·‡5·‡.·‡'·‡ ·‡·‡·‡ ·‡·‡ý¶‡ö¶‡ﶇ趇ᶇÚ¶‡Ó¶‡̶‡Ŷ‡¾¶‡·¶‡°¶‡©¶‡¢¶‡›¶‡”¶‡¶‡†¶‡¶‡x¶‡q¶‡j¶‡c¶‡\¶‡U¶‡N¶‡G¶‡@¶‡9¶‡2¶‡+¶‡$¶‡¶‡¶‡¶‡¶‡¶‡úµ‡óµ‡쵇嵇Þµ‡×µ‡е‡ɵ‡µ‡»µ‡´µ‡­µ‡¦µ‡Ÿµ‡˜µ‡‘µ‡е‡ƒµ‡|µ‡uµ‡nµ‡gµ‡`µ‡Yµ‡Rµ‡Kµ‡Dµ‡=µ‡6µ‡/µ‡(µ‡!µ‡µ‡µ‡ µ‡µ‡þ´‡÷´‡ð´‡é´‡â´‡Û´‡Ô´‡Í´‡Æ´‡¿´‡¸´‡±´‡ª´‡£´‡œ´‡•´‡Ž´‡‡´‡€´‡y´‡r´‡k´‡d´‡]´‡V´‡O´‡H´‡A´‡:´‡3´‡,´‡%´‡´‡´‡´‡ ´‡´‡û³‡ô³‡í³‡泇ß³‡س‡ѳ‡ʳ‡ó‡¼³‡µ³‡®³‡§³‡ ³‡™³‡’³‡‹³‡„³‡}³‡v³‡o³‡h³‡a³‡Z³‡S³‡L³‡E³‡>³‡7³‡0³‡)³‡"³‡³‡³‡ ³‡³‡ÿ²‡ø²‡ñ²‡겇㲇ܲ‡Õ²‡β‡Dz‡À²‡¹²‡²²‡«²‡¤²‡²‡–²‡²‡ˆ²‡²‡z²‡s²‡l²‡e²‡^²‡W²‡P²‡I²‡B²‡;²‡4²‡-²‡&²‡²‡²‡²‡ ²‡²‡ü±‡õ±‡籇ేÙ±‡Ò±‡˱‡ı‡½±‡¶±‡¯±‡¨±‡¡±‡š±‡“±‡Œ±‡…±‡~±‡w±‡p±‡i±‡b±‡[±‡T±‡M±‡F±‡?±‡8±‡1±‡*±‡#±‡±‡±‡±‡±‡±‡ù°‡ò°‡ë°‡ä°‡ݰ‡Ö°‡ϰ‡Ȱ‡Á°‡º°‡³°‡¬°‡¥°‡ž°‡—°‡°‡‰°‡‚°‡{°‡t°‡m°‡f°‡_°‡X°‡Q°‡J°‡C°‡<°‡5°‡.°‡'°‡ °‡°‡°‡ °‡°‡ý¯‡ö¯‡﯇诇ᯇÚ¯‡Ó¯‡̯‡ů‡¾¯‡·¯‡°¯‡©¯‡¢¯‡›¯‡”¯‡¯‡†¯‡¯‡x¯‡q¯‡j¯‡c¯‡\¯‡U¯‡N¯‡G¯‡@¯‡9¯‡2¯‡+¯‡$¯‡¯‡¯‡¯‡¯‡¯‡ú®‡ó®‡쮇宇Þ®‡×®‡Ю‡É®‡®‡»®‡´®‡­®‡¦®‡Ÿ®‡˜®‡‘®‡Š®‡ƒ®‡|®‡u®‡n®‡g®‡`®‡Y®‡R®‡K®‡D®‡=®‡6®‡/®‡(®‡!®‡®‡®‡ ®‡®‡þ­‡÷­‡ð­‡é­‡â­‡Û­‡Ô­‡Í­‡Æ­‡¿­‡¸­‡±­‡ª­‡£­‡œ­‡•­‡Ž­‡‡­‡€­‡y­‡r­‡k­‡d­‡]­‡V­‡O­‡H­‡A­‡:­‡3­‡,­‡%­‡­‡­‡­‡ ­‡­‡û¬‡ô¬‡í¬‡欇߬‡ج‡Ѭ‡ʬ‡ì‡¼¬‡µ¬‡®¬‡§¬‡ ¬‡™¬‡’¬‡‹¬‡„¬‡}¬‡v¬‡o¬‡h¬‡a¬‡Z¬‡S¬‡L¬‡E¬‡>¬‡7¬‡0¬‡)¬‡"¬‡¬‡¬‡ ¬‡¬‡ÿ«‡ø«‡ñ«‡꫇㫇Ü«‡Õ«‡Ϋ‡Ç«‡À«‡¹«‡²«‡««‡¤«‡«‡–«‡«‡ˆ«‡«‡z«‡s«‡l«‡e«‡^«‡W«‡P«‡I«‡B«‡;«‡4«‡-«‡&«‡«‡«‡«‡ «‡«‡üª‡õª‡窇ઇÙª‡Òª‡˪‡·½ª‡¶ª‡¯ª‡¨ª‡¡ª‡šª‡“ª‡Œª‡…ª‡~ª‡wª‡pª‡iª‡bª‡[ª‡Tª‡Mª‡Fª‡?ª‡8ª‡1ª‡*ª‡#ª‡ª‡ª‡ª‡ª‡ª‡ù©‡ò©‡멇䩇Ý©‡Ö©‡Ï©‡È©‡Á©‡º©‡³©‡¬©‡¥©‡ž©‡—©‡©‡‰©‡‚©‡{©‡t©‡m©‡f©‡_©‡X©‡Q©‡J©‡C©‡<©‡5©‡.©‡'©‡ ©‡©‡©‡ ©‡©‡ý¨‡ö¨‡輻訇ᨇÚ¨‡Ó¨‡̨‡Ũ‡¾¨‡·¨‡°¨‡©¨‡¢¨‡›¨‡”¨‡¨‡†¨‡¨‡x¨‡q¨‡j¨‡c¨‡\¨‡U¨‡N¨‡G¨‡@¨‡9¨‡2¨‡+¨‡$¨‡¨‡¨‡¨‡¨‡¨‡ú§‡ó§‡짇姇Þ§‡×§‡Ч‡ɧ‡§‡»§‡´§‡­§‡¦§‡Ÿ§‡˜§‡‘§‡Ч‡ƒ§‡|§‡u§‡n§‡g§‡`§‡Y§‡R§‡K§‡D§‡=§‡6§‡/§‡(§‡!§‡§‡§‡ §‡§‡þ¦‡÷¦‡ð¦‡馇⦇Û¦‡Ô¦‡ͦ‡Ʀ‡¿¦‡¸¦‡±¦‡ª¦‡£¦‡œ¦‡•¦‡ަ‡‡¦‡€¦‡y¦‡r¦‡k¦‡d¦‡]¦‡V¦‡O¦‡H¦‡A¦‡:¦‡3¦‡,¦‡%¦‡¦‡¦‡¦‡ ¦‡¦‡û¥‡ô¥‡í¥‡楇ߥ‡Ø¥‡Ñ¥‡Ê¥‡Ã¥‡¼¥‡µ¥‡®¥‡§¥‡ ¥‡™¥‡’¥‡‹¥‡„¥‡}¥‡v¥‡o¥‡h¥‡a¥‡Z¥‡S¥‡L¥‡E¥‡>¥‡7¥‡0¥‡)¥‡"¥‡¥‡¥‡ ¥‡¥‡ÿ¤‡ø¤‡ñ¤‡꤇㤇ܤ‡Õ¤‡Τ‡Ǥ‡À¤‡¹¤‡²¤‡«¤‡¤¤‡¤‡–¤‡¤‡ˆ¤‡¤‡z¤‡s¤‡l¤‡e¤‡^¤‡W¤‡P¤‡I¤‡B¤‡;¤‡4¤‡-¤‡&¤‡¤‡¤‡¤‡ ¤‡¤‡ü£‡õ£‡磇ࣇÙ£‡Ò£‡Ë£‡Ä£‡½£‡¶£‡¯£‡¨£‡¡£‡š£‡“£‡Œ£‡…£‡~£‡w£‡p£‡i£‡b£‡[£‡T£‡M£‡F£‡?£‡8£‡1£‡*£‡#£‡£‡£‡£‡£‡£‡ù¢‡ò¢‡뢇䢇Ý¢‡Ö¢‡Ï¢‡È¢‡Á¢‡º¢‡³¢‡¬¢‡¥¢‡ž¢‡—¢‡¢‡‰¢‡‚¢‡{¢‡t¢‡m¢‡f¢‡_¢‡X¢‡Q¢‡J¢‡C¢‡<¢‡5¢‡.¢‡'¢‡ ¢‡¢‡¢‡ ¢‡¢‡ý¡‡ö¡‡衇ᡇÚ¡‡Ó¡‡Ì¡‡Å¡‡¾¡‡·¡‡°¡‡©¡‡¢¡‡›¡‡”¡‡¡‡†¡‡¡‡x¡‡q¡‡j¡‡c¡‡\¡‡U¡‡N¡‡G¡‡@¡‡9¡‡2¡‡+¡‡$¡‡¡‡¡‡¡‡¡‡¡‡ú ‡ó ‡ì ‡å ‡Þ ‡× ‡Р‡É ‡ ‡» ‡´ ‡­ ‡¦ ‡Ÿ ‡˜ ‡‘ ‡Š ‡ƒ ‡| ‡u ‡n ‡g ‡` ‡Y ‡R ‡K ‡D ‡= ‡6 ‡/ ‡( ‡! ‡ ‡ ‡  ‡ ‡þŸ‡÷Ÿ‡ðŸ‡韇⟇ÛŸ‡ÔŸ‡ÍŸ‡ÆŸ‡¿Ÿ‡¸Ÿ‡±Ÿ‡ªŸ‡£Ÿ‡œŸ‡•Ÿ‡ŽŸ‡‡Ÿ‡€Ÿ‡yŸ‡rŸ‡kŸ‡dŸ‡]Ÿ‡VŸ‡OŸ‡HŸ‡AŸ‡:Ÿ‡3Ÿ‡,Ÿ‡%Ÿ‡Ÿ‡Ÿ‡Ÿ‡ Ÿ‡Ÿ‡ûž‡ôž‡힇枇ßž‡Øž‡Ñž‡Êž‡Þ‡¼ž‡µž‡®ž‡§ž‡ ž‡™ž‡’ž‡‹ž‡„ž‡}ž‡vž‡ož‡hž‡až‡Zž‡Sž‡Lž‡Ež‡>ž‡7ž‡0ž‡)ž‡"ž‡ž‡ž‡ ž‡ž‡ÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡üœ‡õœ‡眇àœ‡Ùœ‡Òœ‡Ëœ‡Äœ‡½œ‡¶œ‡¯œ‡¨œ‡¡œ‡šœ‡“œ‡Œœ‡…œ‡~œ‡wœ‡pœ‡iœ‡bœ‡[œ‡Tœ‡Mœ‡Fœ‡?œ‡8œ‡1œ‡*œ‡#œ‡œ‡œ‡œ‡œ‡œ‡ù›‡ò›‡뛇䛇Ý›‡Ö›‡Ï›‡È›‡Á›‡º›‡³›‡¬›‡¥›‡ž›‡—›‡›‡‰›‡‚›‡{›‡t›‡m›‡f›‡_›‡X›‡Q›‡J›‡C›‡<›‡5›‡.›‡'›‡ ›‡›‡›‡ ›‡›‡ýš‡öš‡蚇ᚇÚš‡Óš‡Ìš‡Åš‡¾š‡·š‡°š‡©š‡¢š‡›š‡”š‡š‡†š‡š‡xš‡qš‡jš‡cš‡\š‡Uš‡Nš‡Gš‡@š‡9š‡2š‡+š‡$š‡š‡š‡š‡š‡š‡ú™‡ó™‡왇噇Þ™‡×™‡Й‡É™‡™‡»™‡´™‡­™‡¦™‡Ÿ™‡˜™‡‘™‡Š™‡ƒ™‡|™‡u™‡n™‡g™‡`™‡Y™‡R™‡K™‡D™‡=™‡6™‡/™‡(™‡!™‡™‡™‡ ™‡™‡þ˜‡÷˜‡ð˜‡阇☇Û˜‡Ô˜‡͘‡Ƙ‡¿˜‡¸˜‡±˜‡ª˜‡£˜‡œ˜‡•˜‡Ž˜‡‡˜‡€˜‡y˜‡r˜‡k˜‡d˜‡]˜‡V˜‡O˜‡H˜‡A˜‡:˜‡3˜‡,˜‡%˜‡˜‡˜‡˜‡ ˜‡˜‡û—‡ô—‡í—‡æ—‡ß—‡Ø—‡Ñ—‡Ê—‡ׇ¼—‡µ—‡®—‡§—‡ —‡™—‡’—‡‹—‡„—‡}—‡v—‡o—‡h—‡a—‡Z—‡S—‡L—‡E—‡>—‡7—‡0—‡)—‡"—‡—‡—‡ —‡—‡ÿ–‡ø–‡ñ–‡ê–‡ã–‡Ü–‡Õ–‡Ζ‡Ç–‡À–‡¹–‡²–‡«–‡¤–‡–‡––‡–‡ˆ–‡–‡z–‡s–‡l–‡e–‡^–‡W–‡P–‡I–‡B–‡;–‡4–‡-–‡&–‡–‡–‡–‡ –‡–‡ü•‡õ•‡畇à•‡Ù•‡Ò•‡Ë•‡Ä•‡½•‡¶•‡¯•‡¨•‡¡•‡š•‡“•‡Œ•‡…•‡~•‡w•‡p•‡i•‡b•‡[•‡T•‡M•‡F•‡?•‡8•‡1•‡*•‡#•‡•‡•‡•‡•‡•‡ù”‡ò”‡딇䔇Ý”‡Ö”‡Ï”‡È”‡Á”‡º”‡³”‡¬”‡¥”‡ž”‡—”‡”‡‰”‡‚”‡{”‡t”‡m”‡f”‡_”‡X”‡Q”‡J”‡C”‡<”‡5”‡.”‡'”‡ ”‡”‡”‡ ”‡”‡ý“‡ö“‡蓇ᓇÚ“‡Ó“‡Ì“‡Å“‡¾“‡·“‡°“‡©“‡¢“‡›“‡”“‡“‡†“‡“‡x“‡q“‡j“‡c“‡\“‡U“‡N“‡G“‡@“‡9“‡2“‡+“‡$“‡“‡“‡“‡“‡“‡ú’‡ó’‡ì’‡å’‡Þ’‡×’‡Ð’‡É’‡Â’‡»’‡´’‡­’‡¦’‡Ÿ’‡˜’‡‘’‡Š’‡ƒ’‡|’‡u’‡n’‡g’‡`’‡Y’‡R’‡K’‡D’‡=’‡6’‡/’‡(’‡!’‡’‡’‡ ’‡’‡þ‘‡÷‘‡ð‘‡鑇⑇Û‘‡Ô‘‡Í‘‡Æ‘‡¿‘‡¸‘‡±‘‡ª‘‡£‘‡œ‘‡•‘‡Ž‘‡‡‘‡€‘‡y‘‡r‘‡k‘‡d‘‡]‘‡V‘‡O‘‡H‘‡A‘‡:‘‡3‘‡,‘‡%‘‡‘‡‘‡‘‡ ‘‡‘‡û‡ô‡í‡æ‡߇؇чʇǼ‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡üއõއ率àŽ‡ÙŽ‡ÒŽ‡ËŽ‡Äއ½Ž‡¶Ž‡¯Ž‡¨Ž‡¡Ž‡šŽ‡“އŒŽ‡…އ~އwއpއiއbއ[އTއMއFއ?އ8އ1އ*އ#އއއއއއù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ýŒ‡öŒ‡茇ጇÚŒ‡ÓŒ‡ÌŒ‡ÅŒ‡¾Œ‡·Œ‡°Œ‡©Œ‡¢Œ‡›Œ‡”Œ‡Œ‡†Œ‡Œ‡xŒ‡qŒ‡jŒ‡cŒ‡\Œ‡UŒ‡NŒ‡GŒ‡@Œ‡9Œ‡2Œ‡+Œ‡$Œ‡Œ‡Œ‡Œ‡Œ‡Œ‡ú‹‡ó‹‡싇勇Þ‹‡׋‡Ћ‡É‹‡‹‡»‹‡´‹‡­‹‡¦‹‡Ÿ‹‡˜‹‡‘‹‡Š‹‡ƒ‹‡|‹‡u‹‡n‹‡g‹‡`‹‡Y‹‡R‹‡K‹‡D‹‡=‹‡6‹‡/‹‡(‹‡!‹‡‹‡‹‡ ‹‡‹‡þЇ÷ЇðЇ銇⊇ÛŠ‡ÔŠ‡ÍŠ‡ÆŠ‡¿Š‡¸Š‡±Š‡ªŠ‡£Š‡œŠ‡•ЇŽŠ‡‡Š‡€Š‡yЇrЇkЇdЇ]ЇVЇOЇHЇAЇ:Ї3Ї,Ї%ЇЇЇЇ ЇЇû‰‡ô‰‡퉇扇߉‡؉‡щ‡ʉ‡ɇ¼‰‡µ‰‡®‰‡§‰‡ ‰‡™‰‡’‰‡‹‰‡„‰‡}‰‡v‰‡o‰‡h‰‡a‰‡Z‰‡S‰‡L‰‡E‰‡>‰‡7‰‡0‰‡)‰‡"‰‡‰‡‰‡ ‰‡‰‡ÿˆ‡øˆ‡ñˆ‡ꈇ㈇܈‡Õˆ‡Έ‡Lj‡Àˆ‡¹ˆ‡²ˆ‡«ˆ‡¤ˆ‡ˆ‡–ˆ‡ˆ‡ˆˆ‡ˆ‡zˆ‡sˆ‡lˆ‡eˆ‡^ˆ‡Wˆ‡Pˆ‡Iˆ‡Bˆ‡;ˆ‡4ˆ‡-ˆ‡&ˆ‡ˆ‡ˆ‡ˆ‡ ˆ‡ˆ‡ü‡‡õ‡‡燇à‡‡Ù‡‡Ò‡‡ˇ‡ć‡½‡‡¶‡‡¯‡‡¨‡‡¡‡‡š‡‡“‡‡Œ‡‡…‡‡~‡‡w‡‡p‡‡i‡‡b‡‡[‡‡T‡‡M‡‡F‡‡?‡‡8‡‡1‡‡*‡‡#‡‡‡‡‡‡‡‡‡‡‡‡ù†‡ò†‡놇䆇݆‡Ö†‡φ‡Ȇ‡Á†‡º†‡³†‡¬†‡¥†‡ž†‡—†‡†‡‰†‡‚†‡{†‡t†‡m†‡f†‡_†‡X†‡Q†‡J†‡C†‡<†‡5†‡.†‡'†‡ †‡†‡†‡ †‡†‡ý…‡ö…‡ï…‡è…‡á…‡Ú…‡Ó…‡Ì…‡Å…‡¾…‡·…‡°…‡©…‡¢…‡›…‡”…‡…‡†…‡…‡x…‡q…‡j…‡c…‡\…‡U…‡N…‡G…‡@…‡9…‡2…‡+…‡$…‡…‡…‡…‡…‡…‡ú„‡ó„‡섇儇Þ„‡ׄ‡Є‡É„‡„‡»„‡´„‡­„‡¦„‡Ÿ„‡˜„‡‘„‡Š„‡ƒ„‡|„‡u„‡n„‡g„‡`„‡Y„‡R„‡K„‡D„‡=„‡6„‡/„‡(„‡!„‡„‡„‡ „‡„‡þƒ‡÷ƒ‡ðƒ‡郇⃇Ûƒ‡Ôƒ‡̓‡ƃ‡¿ƒ‡¸ƒ‡±ƒ‡ªƒ‡£ƒ‡œƒ‡•ƒ‡Žƒ‡‡ƒ‡€ƒ‡yƒ‡rƒ‡kƒ‡dƒ‡]ƒ‡Vƒ‡Oƒ‡Hƒ‡Aƒ‡:ƒ‡3ƒ‡,ƒ‡%ƒ‡ƒ‡ƒ‡ƒ‡ ƒ‡ƒ‡û‚‡ô‚‡킇悇ß‚‡Ø‚‡Ñ‚‡Ê‚‡‡¼‚‡µ‚‡®‚‡§‚‡ ‚‡™‚‡’‚‡‹‚‡„‚‡}‚‡v‚‡o‚‡h‚‡a‚‡Z‚‡S‚‡L‚‡E‚‡>‚‡7‚‡0‚‡)‚‡"‚‡‚‡‚‡ ‚‡‚‡ÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü€‡õ€‡瀇à€‡Ù€‡Ò€‡Ë€‡Ä€‡½€‡¶€‡¯€‡¨€‡¡€‡š€‡“€‡Œ€‡…€‡~€‡w€‡p€‡i€‡b€‡[€‡T€‡M€‡F€‡?€‡8€‡1€‡*€‡#€‡€‡€‡€‡€‡€‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý~‡ö~‡ï~‡è~‡á~‡Ú~‡Ó~‡Ì~‡Å~‡¾~‡·~‡°~‡©~‡¢~‡›~‡”~‡~‡†~‡~‡x~‡q~‡j~‡c~‡\~‡U~‡N~‡G~‡@~‡9~‡2~‡+~‡$~‡~‡~‡~‡~‡~‡ú}‡ó}‡ì}‡å}‡Þ}‡×}‡Ð}‡É}‡Â}‡»}‡´}‡­}‡¦}‡Ÿ}‡˜}‡‘}‡Š}‡ƒ}‡|}‡u}‡n}‡g}‡`}‡Y}‡R}‡K}‡D}‡=}‡6}‡/}‡(}‡!}‡}‡}‡ }‡}‡þ|‡÷|‡ð|‡é|‡â|‡Û|‡Ô|‡Í|‡Æ|‡¿|‡¸|‡±|‡ª|‡£|‡œ|‡•|‡Ž|‡‡|‡€|‡y|‡r|‡k|‡d|‡]|‡V|‡O|‡H|‡A|‡:|‡3|‡,|‡%|‡|‡|‡|‡ |‡|‡û{‡ô{‡í{‡æ{‡ß{‡Ø{‡Ñ{‡Ê{‡Ã{‡¼{‡µ{‡®{‡§{‡ {‡™{‡’{‡‹{‡„{‡}{‡v{‡o{‡h{‡a{‡Z{‡S{‡L{‡E{‡>{‡7{‡0{‡){‡"{‡{‡{‡ {‡{‡ÿz‡øz‡ñz‡êz‡ãz‡Üz‡Õz‡Îz‡Çz‡Àz‡¹z‡²z‡«z‡¤z‡z‡–z‡z‡ˆz‡z‡zz‡sz‡lz‡ez‡^z‡Wz‡Pz‡Iz‡Bz‡;z‡4z‡-z‡&z‡z‡z‡z‡ z‡z‡üy‡õy‡îy‡çy‡ày‡Ùy‡Òy‡Ëy‡Äy‡½y‡¶y‡¯y‡¨y‡¡y‡šy‡“y‡Œy‡…y‡~y‡wy‡py‡iy‡by‡[y‡Ty‡My‡Fy‡?y‡8y‡1y‡*y‡#y‡y‡y‡y‡y‡y‡ùx‡òx‡ëx‡äx‡Ýx‡Öx‡Ïx‡Èx‡Áx‡ºx‡³x‡¬x‡¥x‡žx‡—x‡x‡‰x‡‚x‡{x‡tx‡mx‡fx‡_x‡Xx‡Qx‡Jx‡Cx‡t‡7t‡0t‡)t‡"t‡t‡t‡ t‡t‡ÿs‡øs‡ñs‡ês‡ãs‡Üs‡Õs‡Îs‡Çs‡Às‡¹s‡²s‡«s‡¤s‡s‡–s‡s‡ˆs‡s‡zs‡ss‡ls‡es‡^s‡Ws‡Ps‡Is‡Bs‡;s‡4s‡-s‡&s‡s‡s‡s‡ s‡s‡ür‡õr‡îr‡çr‡àr‡Ùr‡Òr‡Ër‡Är‡½r‡¶r‡¯r‡¨r‡¡r‡šr‡“r‡Œr‡…r‡~r‡wr‡pr‡ir‡br‡[r‡Tr‡Mr‡Fr‡?r‡8r‡1r‡*r‡#r‡r‡r‡r‡r‡r‡ùq‡òq‡ëq‡äq‡Ýq‡Öq‡Ïq‡Èq‡Áq‡ºq‡³q‡¬q‡¥q‡žq‡—q‡q‡‰q‡‚q‡{q‡tq‡mq‡fq‡_q‡Xq‡Qq‡Jq‡Cq‡m‡7m‡0m‡)m‡"m‡m‡m‡ m‡m‡ÿl‡øl‡ñl‡êl‡ãl‡Ül‡Õl‡Îl‡Çl‡Àl‡¹l‡²l‡«l‡¤l‡l‡–l‡l‡ˆl‡l‡zl‡sl‡ll‡el‡^l‡Wl‡Pl‡Il‡Bl‡;l‡4l‡-l‡&l‡l‡l‡l‡ l‡l‡ük‡õk‡îk‡çk‡àk‡Ùk‡Òk‡Ëk‡Äk‡½k‡¶k‡¯k‡¨k‡¡k‡šk‡“k‡Œk‡…k‡~k‡wk‡pk‡ik‡bk‡[k‡Tk‡Mk‡Fk‡?k‡8k‡1k‡*k‡#k‡k‡k‡k‡k‡k‡ùj‡òj‡ëj‡äj‡Ýj‡Öj‡Ïj‡Èj‡Áj‡ºj‡³j‡¬j‡¥j‡žj‡—j‡j‡‰j‡‚j‡{j‡tj‡mj‡fj‡_j‡Xj‡Qj‡Jj‡Cj‡f‡7f‡0f‡)f‡"f‡f‡f‡ f‡f‡ÿe‡øe‡ñe‡êe‡ãe‡Üe‡Õe‡Îe‡Çe‡Àe‡¹e‡²e‡«e‡¤e‡e‡–e‡e‡ˆe‡e‡ze‡se‡le‡ee‡^e‡We‡Pe‡Ie‡Be‡;e‡4e‡-e‡&e‡e‡e‡e‡ e‡e‡üd‡õd‡îd‡çd‡àd‡Ùd‡Òd‡Ëd‡Äd‡½d‡¶d‡¯d‡¨d‡¡d‡šd‡“d‡Œd‡…d‡~d‡wd‡pd‡id‡bd‡[d‡Td‡Md‡Fd‡?d‡8d‡1d‡*d‡#d‡d‡d‡d‡d‡d‡ùc‡òc‡ëc‡äc‡Ýc‡Öc‡Ïc‡Èc‡Ác‡ºc‡³c‡¬c‡¥c‡žc‡—c‡c‡‰c‡‚c‡{c‡tc‡mc‡fc‡_c‡Xc‡Qc‡Jc‡Cc‡_‡7_‡0_‡)_‡"_‡_‡_‡ _‡_‡ÿ^‡ø^‡ñ^‡ê^‡ã^‡Ü^‡Õ^‡Î^‡Ç^‡À^‡¹^‡²^‡«^‡¤^‡^‡–^‡^‡ˆ^‡^‡z^‡s^‡l^‡e^‡^^‡W^‡P^‡I^‡B^‡;^‡4^‡-^‡&^‡^‡^‡^‡ ^‡^‡ü]‡õ]‡î]‡ç]‡à]‡Ù]‡Ò]‡Ë]‡Ä]‡½]‡¶]‡¯]‡¨]‡¡]‡š]‡“]‡Œ]‡…]‡~]‡w]‡p]‡i]‡b]‡[]‡T]‡M]‡F]‡?]‡8]‡1]‡*]‡#]‡]‡]‡]‡]‡]‡ù\‡ò\‡ë\‡ä\‡Ý\‡Ö\‡Ï\‡È\‡Á\‡º\‡³\‡¬\‡¥\‡ž\‡—\‡\‡‰\‡‚\‡{\‡t\‡m\‡f\‡_\‡X\‡Q\‡J\‡C\‡<\‡5\‡.\‡'\‡ \‡\‡\‡ \‡\‡ý[‡ö[‡ï[‡è[‡á[‡Ú[‡Ó[‡Ì[‡Å[‡¾[‡·[‡°[‡©[‡¢[‡›[‡”[‡[‡†[‡[‡x[‡q[‡j[‡c[‡\[‡U[‡N[‡G[‡@[‡9[‡2[‡+[‡$[‡[‡[‡[‡[‡[‡úZ‡óZ‡ìZ‡åZ‡ÞZ‡×Z‡ÐZ‡ÉZ‡ÂZ‡»Z‡´Z‡­Z‡¦Z‡ŸZ‡˜Z‡‘Z‡ŠZ‡ƒZ‡|Z‡uZ‡nZ‡gZ‡`Z‡YZ‡RZ‡KZ‡DZ‡=Z‡6Z‡/Z‡(Z‡!Z‡Z‡Z‡ Z‡Z‡þY‡÷Y‡ðY‡éY‡âY‡ÛY‡ÔY‡ÍY‡ÆY‡¿Y‡¸Y‡±Y‡ªY‡£Y‡œY‡•Y‡ŽY‡‡Y‡€Y‡yY‡rY‡kY‡dY‡]Y‡VY‡OY‡HY‡AY‡:Y‡3Y‡,Y‡%Y‡Y‡Y‡Y‡ Y‡Y‡ûX‡ôX‡íX‡æX‡ßX‡ØX‡ÑX‡ÊX‡ÃX‡¼X‡µX‡®X‡§X‡ X‡™X‡’X‡‹X‡„X‡}X‡vX‡oX‡hX‡aX‡ZX‡SX‡LX‡EX‡>X‡7X‡0X‡)X‡"X‡X‡X‡ X‡X‡ÿW‡øW‡ñW‡êW‡ãW‡ÜW‡ÕW‡ÎW‡ÇW‡ÀW‡¹W‡²W‡«W‡¤W‡W‡–W‡W‡ˆW‡W‡zW‡sW‡lW‡eW‡^W‡WW‡PW‡IW‡BW‡;W‡4W‡-W‡&W‡W‡W‡W‡ W‡W‡üV‡õV‡îV‡çV‡àV‡ÙV‡ÒV‡ËV‡ÄV‡½V‡¶V‡¯V‡¨V‡¡V‡šV‡“V‡ŒV‡…V‡~V‡wV‡pV‡iV‡bV‡[V‡TV‡MV‡FV‡?V‡8V‡1V‡*V‡#V‡V‡V‡V‡V‡V‡ùU‡òU‡ëU‡äU‡ÝU‡ÖU‡ÏU‡ÈU‡ÁU‡ºU‡³U‡¬U‡¥U‡žU‡—U‡U‡‰U‡‚U‡{U‡tU‡mU‡fU‡_U‡XU‡QU‡JU‡CU‡Q‡7Q‡0Q‡)Q‡"Q‡Q‡Q‡ Q‡Q‡ÿP‡øP‡ñP‡êP‡ãP‡ÜP‡ÕP‡ÎP‡ÇP‡ÀP‡¹P‡²P‡«P‡¤P‡P‡–P‡P‡ˆP‡P‡zP‡sP‡lP‡eP‡^P‡WP‡PP‡IP‡BP‡;P‡4P‡-P‡&P‡P‡P‡P‡ P‡P‡üO‡õO‡îO‡çO‡àO‡ÙO‡ÒO‡ËO‡ÄO‡½O‡¶O‡¯O‡¨O‡¡O‡šO‡“O‡ŒO‡…O‡~O‡wO‡pO‡iO‡bO‡[O‡TO‡MO‡FO‡?O‡8O‡1O‡*O‡#O‡O‡O‡O‡O‡O‡ùN‡òN‡ëN‡äN‡ÝN‡ÖN‡ÏN‡ÈN‡ÁN‡ºN‡³N‡¬N‡¥N‡žN‡—N‡N‡‰N‡‚N‡{N‡tN‡mN‡fN‡_N‡XN‡QN‡JN‡CN‡J‡7J‡0J‡)J‡"J‡J‡J‡ J‡J‡ÿI‡øI‡ñI‡êI‡ãI‡ÜI‡ÕI‡ÎI‡ÇI‡ÀI‡¹I‡²I‡«I‡¤I‡I‡–I‡I‡ˆI‡I‡zI‡sI‡lI‡eI‡^I‡WI‡PI‡II‡BI‡;I‡4I‡-I‡&I‡I‡I‡I‡ I‡I‡üH‡õH‡îH‡çH‡àH‡ÙH‡ÒH‡ËH‡ÄH‡½H‡¶H‡¯H‡¨H‡¡H‡šH‡“H‡ŒH‡…H‡~H‡wH‡pH‡iH‡bH‡[H‡TH‡MH‡FH‡?H‡8H‡1H‡*H‡#H‡H‡H‡H‡H‡H‡ùG‡òG‡ëG‡äG‡ÝG‡ÖG‡ÏG‡ÈG‡ÁG‡ºG‡³G‡¬G‡¥G‡žG‡—G‡G‡‰G‡‚G‡{G‡tG‡mG‡fG‡_G‡XG‡QG‡JG‡CG‡C‡7C‡0C‡)C‡"C‡C‡C‡ C‡C‡ÿB‡øB‡ñB‡êB‡ãB‡ÜB‡ÕB‡ÎB‡ÇB‡ÀB‡¹B‡²B‡«B‡¤B‡B‡–B‡B‡ˆB‡B‡zB‡sB‡lB‡eB‡^B‡WB‡PB‡IB‡BB‡;B‡4B‡-B‡&B‡B‡B‡B‡ B‡B‡üA‡õA‡îA‡çA‡àA‡ÙA‡ÒA‡ËA‡ÄA‡½A‡¶A‡¯A‡¨A‡¡A‡šA‡“A‡ŒA‡…A‡~A‡wA‡pA‡iA‡bA‡[A‡TA‡MA‡FA‡?A‡8A‡1A‡*A‡#A‡A‡A‡A‡A‡A‡ù@‡ò@‡ë@‡ä@‡Ý@‡Ö@‡Ï@‡È@‡Á@‡º@‡³@‡¬@‡¥@‡ž@‡—@‡@‡‰@‡‚@‡{@‡t@‡m@‡f@‡_@‡X@‡Q@‡J@‡C@‡<@‡5@‡.@‡'@‡ @‡@‡@‡ @‡@‡ý?‡ö?‡ï?‡è?‡á?‡Ú?‡Ó?‡Ì?‡Å?‡¾?‡·?‡°?‡©?‡¢?‡›?‡”?‡?‡†?‡?‡x?‡q?‡j?‡c?‡\?‡U?‡N?‡G?‡@?‡9?‡2?‡+?‡$?‡?‡?‡?‡?‡?‡ú>‡ó>‡ì>‡å>‡Þ>‡×>‡Ð>‡É>‡Â>‡»>‡´>‡­>‡¦>‡Ÿ>‡˜>‡‘>‡Š>‡ƒ>‡|>‡u>‡n>‡g>‡`>‡Y>‡R>‡K>‡D>‡=>‡6>‡/>‡(>‡!>‡>‡>‡ >‡>‡þ=‡÷=‡ð=‡é=‡â=‡Û=‡Ô=‡Í=‡Æ=‡¿=‡¸=‡±=‡ª=‡£=‡œ=‡•=‡Ž=‡‡=‡€=‡y=‡r=‡k=‡d=‡]=‡V=‡O=‡H=‡A=‡:=‡3=‡,=‡%=‡=‡=‡=‡ =‡=‡û<‡ô<‡í<‡æ<‡ß<‡Ø<‡Ñ<‡Ê<‡Ã<‡¼<‡µ<‡®<‡§<‡ <‡™<‡’<‡‹<‡„<‡}<‡v<‡o<‡h<‡a<‡Z<‡S<‡L<‡E<‡><‡7<‡0<‡)<‡"<‡<‡<‡ <‡<‡ÿ;‡ø;‡ñ;‡ê;‡ã;‡Ü;‡Õ;‡Î;‡Ç;‡À;‡¹;‡²;‡«;‡¤;‡;‡–;‡;‡ˆ;‡;‡z;‡s;‡l;‡e;‡^;‡W;‡P;‡I;‡B;‡;;‡4;‡-;‡&;‡;‡;‡;‡ ;‡;‡ü:‡õ:‡î:‡ç:‡à:‡Ù:‡Ò:‡Ë:‡Ä:‡½:‡¶:‡¯:‡¨:‡¡:‡š:‡“:‡Œ:‡…:‡~:‡w:‡p:‡i:‡b:‡[:‡T:‡M:‡F:‡?:‡8:‡1:‡*:‡#:‡:‡:‡:‡:‡:‡ù9‡ò9‡ë9‡ä9‡Ý9‡Ö9‡Ï9‡È9‡Á9‡º9‡³9‡¬9‡¥9‡ž9‡—9‡9‡‰9‡‚9‡{9‡t9‡m9‡f9‡_9‡X9‡Q9‡J9‡C9‡<9‡59‡.9‡'9‡ 9‡9‡9‡ 9‡9‡ý8‡ö8‡ï8‡è8‡á8‡Ú8‡Ó8‡Ì8‡Å8‡¾8‡·8‡°8‡©8‡¢8‡›8‡”8‡8‡†8‡8‡x8‡q8‡j8‡c8‡\8‡U8‡N8‡G8‡@8‡98‡28‡+8‡$8‡8‡8‡8‡8‡8‡ú7‡ó7‡ì7‡å7‡Þ7‡×7‡Ð7‡É7‡Â7‡»7‡´7‡­7‡¦7‡Ÿ7‡˜7‡‘7‡Š7‡ƒ7‡|7‡u7‡n7‡g7‡`7‡Y7‡R7‡K7‡D7‡=7‡67‡/7‡(7‡!7‡7‡7‡ 7‡7‡þ6‡÷6‡ð6‡é6‡â6‡Û6‡Ô6‡Í6‡Æ6‡¿6‡¸6‡±6‡ª6‡£6‡œ6‡•6‡Ž6‡‡6‡€6‡y6‡r6‡k6‡d6‡]6‡V6‡O6‡H6‡A6‡:6‡36‡,6‡%6‡6‡6‡6‡ 6‡6‡û5‡ô5‡í5‡æ5‡ß5‡Ø5‡Ñ5‡Ê5‡Ã5‡¼5‡µ5‡®5‡§5‡ 5‡™5‡’5‡‹5‡„5‡}5‡v5‡o5‡h5‡a5‡Z5‡S5‡L5‡E5‡>5‡75‡05‡)5‡"5‡5‡5‡ 5‡5‡ÿ4‡ø4‡ñ4‡ê4‡ã4‡Ü4‡Õ4‡Î4‡Ç4‡À4‡¹4‡²4‡«4‡¤4‡4‡–4‡4‡ˆ4‡4‡z4‡s4‡l4‡e4‡^4‡W4‡P4‡I4‡B4‡;4‡44‡-4‡&4‡4‡4‡4‡ 4‡4‡ü3‡õ3‡î3‡ç3‡à3‡Ù3‡Ò3‡Ë3‡Ä3‡½3‡¶3‡¯3‡¨3‡¡3‡š3‡“3‡Œ3‡…3‡~3‡w3‡p3‡i3‡b3‡[3‡T3‡M3‡F3‡?3‡83‡13‡*3‡#3‡3‡3‡3‡3‡3‡ù2‡ò2‡ë2‡ä2‡Ý2‡Ö2‡Ï2‡È2‡Á2‡º2‡³2‡¬2‡¥2‡ž2‡—2‡2‡‰2‡‚2‡{2‡t2‡m2‡f2‡_2‡X2‡Q2‡J2‡C2‡<2‡52‡.2‡'2‡ 2‡2‡2‡ 2‡2‡ý1‡ö1‡ï1‡è1‡á1‡Ú1‡Ó1‡Ì1‡Å1‡¾1‡·1‡°1‡©1‡¢1‡›1‡”1‡1‡†1‡1‡x1‡q1‡j1‡c1‡\1‡U1‡N1‡G1‡@1‡91‡21‡+1‡$1‡1‡1‡1‡1‡1‡ú0‡ó0‡ì0‡å0‡Þ0‡×0‡Ð0‡É0‡Â0‡»0‡´0‡­0‡¦0‡Ÿ0‡˜0‡‘0‡Š0‡ƒ0‡|0‡u0‡n0‡g0‡`0‡Y0‡R0‡K0‡D0‡=0‡60‡/0‡(0‡!0‡0‡0‡ 0‡0‡þ/‡÷/‡ð/‡é/‡â/‡Û/‡Ô/‡Í/‡Æ/‡¿/‡¸/‡±/‡ª/‡£/‡œ/‡•/‡Ž/‡‡/‡€/‡y/‡r/‡k/‡d/‡]/‡V/‡O/‡H/‡A/‡:/‡3/‡,/‡%/‡/‡/‡/‡ /‡/‡û.‡ô.‡í.‡æ.‡ß.‡Ø.‡Ñ.‡Ê.‡Ã.‡¼.‡µ.‡®.‡§.‡ .‡™.‡’.‡‹.‡„.‡}.‡v.‡o.‡h.‡a.‡Z.‡S.‡L.‡E.‡>.‡7.‡0.‡).‡".‡.‡.‡ .‡.‡ÿ-‡ø-‡ñ-‡ê-‡ã-‡Ü-‡Õ-‡Î-‡Ç-‡À-‡¹-‡²-‡«-‡¤-‡-‡–-‡-‡ˆ-‡-‡z-‡s-‡l-‡e-‡^-‡W-‡P-‡I-‡B-‡;-‡4-‡--‡&-‡-‡-‡-‡ -‡-‡ü,‡õ,‡î,‡ç,‡à,‡Ù,‡Ò,‡Ë,‡Ä,‡½,‡¶,‡¯,‡¨,‡¡,‡š,‡“,‡Œ,‡…,‡~,‡w,‡p,‡i,‡b,‡[,‡T,‡M,‡F,‡?,‡8,‡1,‡*,‡#,‡,‡,‡,‡,‡,‡ù+‡ò+‡ë+‡ä+‡Ý+‡Ö+‡Ï+‡È+‡Á+‡º+‡³+‡¬+‡¥+‡ž+‡—+‡+‡‰+‡‚+‡{+‡t+‡m+‡f+‡_+‡X+‡Q+‡J+‡C+‡<+‡5+‡.+‡'+‡ +‡+‡+‡ +‡+‡ý*‡ö*‡ï*‡è*‡á*‡Ú*‡Ó*‡Ì*‡Å*‡¾*‡·*‡°*‡©*‡¢*‡›*‡”*‡*‡†*‡*‡x*‡q*‡j*‡c*‡\*‡U*‡N*‡G*‡@*‡9*‡2*‡+*‡$*‡*‡*‡*‡*‡*‡ú)‡ó)‡ì)‡å)‡Þ)‡×)‡Ð)‡É)‡Â)‡»)‡´)‡­)‡¦)‡Ÿ)‡˜)‡‘)‡Š)‡ƒ)‡|)‡u)‡n)‡g)‡`)‡Y)‡R)‡K)‡D)‡=)‡6)‡/)‡()‡!)‡)‡)‡ )‡)‡þ(‡÷(‡ð(‡é(‡â(‡Û(‡Ô(‡Í(‡Æ(‡¿(‡¸(‡±(‡ª(‡£(‡œ(‡•(‡Ž(‡‡(‡€(‡y(‡r(‡k(‡d(‡](‡V(‡O(‡H(‡A(‡:(‡3(‡,(‡%(‡(‡(‡(‡ (‡(‡û'‡ô'‡í'‡æ'‡ß'‡Ø'‡Ñ'‡Ê'‡Ã'‡¼'‡µ'‡®'‡§'‡ '‡™'‡’'‡‹'‡„'‡}'‡v'‡o'‡h'‡a'‡Z'‡S'‡L'‡E'‡>'‡7'‡0'‡)'‡"'‡'‡'‡ '‡'‡ÿ&‡ø&‡ñ&‡ê&‡ã&‡Ü&‡Õ&‡Î&‡Ç&‡À&‡¹&‡²&‡«&‡¤&‡&‡–&‡&‡ˆ&‡&‡z&‡s&‡l&‡e&‡^&‡W&‡P&‡I&‡B&‡;&‡4&‡-&‡&&‡&‡&‡&‡ &‡&‡ü%‡õ%‡î%‡ç%‡à%‡Ù%‡Ò%‡Ë%‡Ä%‡½%‡¶%‡¯%‡¨%‡¡%‡š%‡“%‡Œ%‡…%‡~%‡w%‡p%‡i%‡b%‡[%‡T%‡M%‡F%‡?%‡8%‡1%‡*%‡#%‡%‡%‡%‡%‡%‡ù$‡ò$‡ë$‡ä$‡Ý$‡Ö$‡Ï$‡È$‡Á$‡º$‡³$‡¬$‡¥$‡ž$‡—$‡$‡‰$‡‚$‡{$‡t$‡m$‡f$‡_$‡X$‡Q$‡J$‡C$‡<$‡5$‡.$‡'$‡ $‡$‡$‡ $‡$‡ý#‡ö#‡ï#‡è#‡á#‡Ú#‡Ó#‡Ì#‡Å#‡¾#‡·#‡°#‡©#‡¢#‡›#‡”#‡#‡†#‡#‡x#‡q#‡j#‡c#‡\#‡U#‡N#‡G#‡@#‡9#‡2#‡+#‡$#‡#‡#‡#‡#‡#‡ú"‡ó"‡ì"‡å"‡Þ"‡×"‡Ð"‡É"‡Â"‡»"‡´"‡­"‡¦"‡Ÿ"‡˜"‡‘"‡Š"‡ƒ"‡|"‡u"‡n"‡g"‡`"‡Y"‡R"‡K"‡D"‡="‡6"‡/"‡("‡!"‡"‡"‡ "‡"‡þ!‡÷!‡ð!‡é!‡â!‡Û!‡Ô!‡Í!‡Æ!‡¿!‡¸!‡±!‡ª!‡£!‡œ!‡•!‡Ž!‡‡!‡€!‡y!‡r!‡k!‡d!‡]!‡V!‡O!‡H!‡A!‡:!‡3!‡,!‡%!‡!‡!‡!‡ !‡!‡û ‡ô ‡í ‡æ ‡ß ‡Ø ‡Ñ ‡Ê ‡à ‡¼ ‡µ ‡® ‡§ ‡  ‡™ ‡’ ‡‹ ‡„ ‡} ‡v ‡o ‡h ‡a ‡Z ‡S ‡L ‡E ‡> ‡7 ‡0 ‡) ‡" ‡ ‡ ‡ ‡ ‡ÿ‡ø‡ñ‡ê‡ã‡Ü‡Õ‡Î‡Ç‡À‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü‡õ‡î‡ç‡à‡Ù‡Ò‡Ë‡Ä‡½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý‡ö‡ï‡è‡á‡Ú‡Ó‡Ì‡Å‡¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú‡ó‡ì‡å‡Þ‡×‡Ð‡É‡Â‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Š‡ƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ‡÷‡ð‡é‡â‡Û‡Ô‡Í‡Æ‡¿‡¸‡±‡ª‡£‡œ‡•‡Ž‡‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û‡ô‡í‡æ‡ß‡Ø‡Ñ‡Ê‡Ã‡¼‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ‡ø‡ñ‡ê‡ã‡Ü‡Õ‡Î‡Ç‡À‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü‡õ‡î‡ç‡à‡Ù‡Ò‡Ë‡Ä‡½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý‡ö‡ï‡è‡á‡Ú‡Ó‡Ì‡Å‡¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú‡ó‡ì‡å‡Þ‡×‡Ð‡É‡Â‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Š‡ƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ‡÷‡ð‡é‡â‡Û‡Ô‡Í‡Æ‡¿‡¸‡±‡ª‡£‡œ‡•‡Ž‡‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û‡ô‡í‡æ‡ß‡Ø‡Ñ‡Ê‡Ã‡¼‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ‡ø‡ñ‡ê‡ã‡Ü‡Õ‡Î‡Ç‡À‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü‡õ‡î‡ç‡à‡Ù‡Ò‡Ë‡Ä‡½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý‡ö‡ï‡è‡á‡Ú‡Ó‡Ì‡Å‡¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú ‡ó ‡ì ‡å ‡Þ ‡× ‡Ð ‡É ‡ ‡» ‡´ ‡­ ‡¦ ‡Ÿ ‡˜ ‡‘ ‡Š ‡ƒ ‡| ‡u ‡n ‡g ‡` ‡Y ‡R ‡K ‡D ‡= ‡6 ‡/ ‡( ‡! ‡ ‡ ‡ ‡ ‡þ ‡÷ ‡ð ‡é ‡â ‡Û ‡Ô ‡Í ‡Æ ‡¿ ‡¸ ‡± ‡ª ‡£ ‡œ ‡• ‡Ž ‡‡ ‡€ ‡y ‡r ‡k ‡d ‡] ‡V ‡O ‡H ‡A ‡: ‡3 ‡, ‡% ‡ ‡ ‡ ‡ ‡ ‡û ‡ô ‡í ‡æ ‡ß ‡Ø ‡Ñ ‡Ê ‡à ‡¼ ‡µ ‡® ‡§ ‡  ‡™ ‡’ ‡‹ ‡„ ‡} ‡v ‡o ‡h ‡a ‡Z ‡S ‡L ‡E ‡> ‡7 ‡0 ‡) ‡" ‡ ‡ ‡ ‡ ‡ÿ ‡ø ‡ñ ‡ê ‡ã ‡Ü ‡Õ ‡Î ‡Ç ‡À ‡¹ ‡² ‡« ‡¤ ‡ ‡– ‡ ‡ˆ ‡ ‡z ‡s ‡l ‡e ‡^ ‡W ‡P ‡I ‡B ‡; ‡4 ‡- ‡& ‡ ‡ ‡ ‡ ‡ ‡ü ‡õ ‡î ‡ç ‡à ‡Ù ‡Ò ‡Ë ‡Ä ‡½ ‡¶ ‡¯ ‡¨ ‡¡ ‡š ‡“ ‡Œ ‡… ‡~ ‡w ‡p ‡i ‡b ‡[ ‡T ‡M ‡F ‡? ‡8 ‡1 ‡* ‡# ‡ ‡ ‡ ‡ ‡ ‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý‡ö‡ï‡è‡á‡Ú‡Ó‡Ì‡Å‡¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú‡ó‡ì‡å‡Þ‡×‡Ð‡É‡Â‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Š‡ƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ‡÷‡ð‡é‡â‡Û‡Ô‡Í‡Æ‡¿‡¸‡±‡ª‡£‡œ‡•‡Ž‡‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û‡ô‡í‡æ‡ß‡Ø‡Ñ‡Ê‡Ã‡¼‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ‡ø‡ñ‡ê‡ã‡Ü‡Õ‡Î‡Ç‡À‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü‡õ‡î‡ç‡à‡Ù‡Ò‡Ë‡Ä‡½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù‡ò‡ë‡ä‡Ý‡Ö‡Ï‡È‡Á‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý‡ö‡ï‡è‡á‡Ú‡Ó‡̇Ň¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡úÿ†óÿ†ìÿ†åÿ†Þÿ†×ÿ†Ðÿ†Éÿ†Âÿ†»ÿ†´ÿ†­ÿ†¦ÿ†Ÿÿ†˜ÿ†‘ÿ†Šÿ†ƒÿ†|ÿ†uÿ†nÿ†gÿ†`ÿ†Yÿ†Rÿ†Kÿ†Dÿ†=ÿ†6ÿ†/ÿ†(ÿ†!ÿ†ÿ†ÿ† ÿ†ÿ†þþ†÷þ†ðþ†éþ†âþ†Ûþ†Ôþ†Íþ†Æþ†¿þ†¸þ†±þ†ªþ†£þ†œþ†•þ†Žþ†‡þ†€þ†yþ†rþ†kþ†dþ†]þ†Vþ†Oþ†Hþ†Aþ†:þ†3þ†,þ†%þ†þ†þ†þ† þ†þ†ûý†ôý†íý†æý†ßý†Øý†Ñý†Êý†Ãý†¼ý†µý†®ý†§ý† ý†™ý†’ý†‹ý†„ý†}ý†vý†oý†hý†aý†Zý†Sý†Lý†Eý†>ý†7ý†0ý†)ý†"ý†ý†ý† ý†ý†ÿü†øü†ñü†êü†ãü†Üü†Õü†Îü†Çü†Àü†¹ü†²ü†«ü†¤ü†ü†–ü†ü†ˆü†ü†zü†sü†lü†eü†^ü†Wü†Pü†Iü†Bü†;ü†4ü†-ü†&ü†ü†ü†ü† ü†ü†üû†õû†îû†çû†àû†Ùû†Òû†Ëû†Äû†½û†¶û†¯û†¨û†¡û†šû†“û†Œû†…û†~û†wû†pû†iû†bû†[û†Tû†Mû†Fû†?û†8û†1û†*û†#û†û†û†û†û†û†ùú†òú†ëú†äú†Ýú†Öú†Ïú†Èú†Áú†ºú†³ú†¬ú†¥ú†žú†—ú†ú†‰ú†‚ú†{ú†tú†mú†fú†_ú†Xú†Qú†Jú†Cú†<ú†5ú†.ú†'ú† ú†ú†ú† ú†ú†ýù†öù†ïù†èù†áù†Úù†Óù†Ìù†Åù†¾ù†·ù†°ù†©ù†¢ù†›ù†”ù†ù††ù†ù†xù†qù†jù†cù†\ù†Uù†Nù†Gù†@ù†9ù†2ù†+ù†$ù†ù†ù†ù†ù†ù†úø†óø†ìø†åø†Þø†×ø†Ðø†Éø†Âø†»ø†´ø†­ø†¦ø†Ÿø†˜ø†‘ø†Šø†ƒø†|ø†uø†nø†gø†`ø†Yø†Rø†Kø†Dø†=ø†6ø†/ø†(ø†!ø†ø†ø† ø†ø†þ÷†÷÷†ð÷†é÷†â÷†Û÷†Ô÷†Í÷†Æ÷†¿÷†¸÷†±÷†ª÷†£÷†œ÷†•÷†Ž÷†‡÷†€÷†y÷†r÷†k÷†d÷†]÷†V÷†O÷†H÷†A÷†:÷†3÷†,÷†%÷†÷†÷†÷† ÷†÷†ûö†ôö†íö†æö†ßö†Øö†Ñö†Êö†Ãö†¼ö†µö†®ö†§ö† ö†™ö†’ö†‹ö†„ö†}ö†vö†oö†hö†aö†Zö†Sö†Lö†Eö†>ö†7ö†0ö†)ö†"ö†ö†ö† ö†ö†ÿõ†øõ†ñõ†êõ†ãõ†Üõ†Õõ†Îõ†Çõ†Àõ†¹õ†²õ†«õ†¤õ†õ†–õ†õ†ˆõ†õ†zõ†sõ†lõ†eõ†^õ†Wõ†Põ†Iõ†Bõ†;õ†4õ†-õ†&õ†õ†õ†õ† õ†õ†üô†õô†îô†çô†àô†Ùô†Òô†Ëô†Äô†½ô†¶ô†¯ô†¨ô†¡ô†šô†“ô†Œô†…ô†~ô†wô†pô†iô†bô†[ô†Tô†Mô†Fô†?ô†8ô†1ô†*ô†#ô†ô†ô†ô†ô†ô†ùó†òó†ëó†äó†Ýó†Öó†Ïó†Èó†Áó†ºó†³ó†¬ó†¥ó†žó†—ó†ó†‰ó†‚ó†{ó†tó†mó†fó†_ó†Xó†Qó†Jó†Có†<ó†5ó†.ó†'ó† ó†ó†ó† ó†ó†ýò†öò†ïò†èò†áò†Úò†Óò†Ìò†Åò†¾ò†·ò†°ò†©ò†¢ò†›ò†”ò†ò††ò†ò†xò†qò†jò†cò†\ò†Uò†Nò†Gò†@ò†9ò†2ò†+ò†$ò†ò†ò†ò†ò†ò†úñ†óñ†ìñ†åñ†Þñ†×ñ†Ðñ†Éñ†Âñ†»ñ†´ñ†­ñ†¦ñ†Ÿñ†˜ñ†‘ñ†Šñ†ƒñ†|ñ†uñ†nñ†gñ†`ñ†Yñ†Rñ†Kñ†Dñ†=ñ†6ñ†/ñ†(ñ†!ñ†ñ†ñ† ñ†ñ†þð†÷ð†ðð†éð†âð†Ûð†Ôð†Íð†Æð†¿ð†¸ð†±ð†ªð†£ð†œð†•ð†Žð†‡ð†€ð†yð†rð†kð†dð†]ð†Vð†Oð†Hð†Að†:ð†3ð†,ð†%ð†ð†ð†ð† ð†ð†ûï†ôï†íï†æï†ßï†Øï†Ñï†Êï†Ãï†}ï†vï†oï†hï†aï†Zï†Sï†Lï†Eï†>ï†7ï†0ï†)ï†"ï†ï†ï† ï†ï†ÿî†øî†ñî†êî†ãî†Üî†Õî†Îî†Çî†Àî†î†–î†î†ˆî†î†zî†sî†lî†eî†^î†Wî†Pî†Iî†Bî†;î†4î†-î†&î†î†î†î† î†î†üí†õí†îí†çí†àí†Ùí†Òí†Ëí†Ä톽톶톯톨톡톚톓톌톅í†~í†wí†pí†ií†bí†[í†Tí†Mí†Fí†?í†8í†1í†*í†#í†í†í†í†í†í†ùì†òì†ëì†äì†Ýì†Öì†Ïì†Èì†Á솺솳솬솥솞솗ì†ì†‰ì†‚ì†{ì†tì†mì†fì†_ì†Xì†Qì†Jì†Cì†<ì†5ì†.ì†'ì† ì†ì†ì† ì†ì†ýë†öë†ïë†èë†áë†Úë†Óë†Ìë†Å놾놷놰놩놢놛놔ë†ë††ë†ë†xë†që†jë†cë†\ë†Uë†Në†Gë†@ë†9ë†2ë†+ë†$ë†ë†ë†ë†ë†ë†úê†óê†ìê†åê†Þê†×ê†Ðê†Éê†Âꆻꆴꆭꆦꆟꆘꆑꆊꆃê†|ê†uê†nê†gê†`ê†Yê†Rê†Kê†Dê†=ê†6ê†/ê†(ê†!ê†ê†ê† ê†ê†þé†÷é†ðé†éé†âé†Ûé†Ôé†Íé†Æé†¿é†¸é†±é†ªé†£é†œé†•é†Žé†‡é†€é†yé†ré†ké†dé†]é†Vé†Oé†Hé†Aé†:é†3é†,é†%é†é†é†é† é†é†ûè†ôè†íè†æè†ßè†Øè†Ñè†Êè†Ã膼膵膮膧膠膙膒膋膄è†}è†vè†oè†hè†aè†Zè†Sè†Lè†Eè†>è†7è†0è†)è†"è†è†è† è†è†ÿç†øç†ñç†êç†ãç†Üç†Õç†Îç†Çç†À熹熲熫熤ç†ç†–ç†ç†ˆç†ç†zç†sç†lç†eç†^ç†Wç†Pç†Iç†Bç†;ç†4ç†-ç†&ç†ç†ç†ç† ç†ç†üæ†õæ†îæ†çæ†àæ†Ùæ†Òæ†Ëæ†Ä憽憶憯憨憡憚憓憌憅æ†~æ†wæ†pæ†iæ†bæ†[æ†Tæ†Mæ†Fæ†?æ†8æ†1æ†*æ†#æ†æ†æ†æ†æ†æ†ùå†òå†ëå†äå†Ýå†Öå†Ïå†Èå†Á冺决冬冥冞冗å†å†‰å†‚å†{å†tå†må†få†_å†Xå†Qå†Jå†Cå†<å†5å†.å†'å† å†å†å† å†å†ýä†öä†ïä†èä†áä†Úä†Óä†Ìä†Å䆾䆷䆰䆩䆢䆛䆔ä†ä††ä†ä†xä†qä†jä†cä†\ä†Uä†Nä†Gä†@ä†9ä†2ä†+ä†$ä†ä†ä†ä†ä†ä†úã†óã†ìã†åã†Þã†×ã†Ðã†Éã†Âㆻㆴㆭㆦ㆟㆘㆑ㆊㆃã†|ã†uã†nã†gã†`ã†Yã†Rã†Kã†Dã†=ã†6ã†/ã†(ã†!ã†ã†ã† ã†ã†þâ†÷â†ðâ†éâ†ââ†Ûâ†Ôâ†Íâ†Æâ†¿â†¸â†±â†ªâ†£â†œâ†•â†Žâ†‡â†€â†yâ†râ†kâ†dâ†]â†Vâ†Oâ†Hâ†Aâ†:â†3â†,â†%â†â†â†â† â†â†ûá†ôá†íá†æá†ßá†Øá†Ñá†Êá†Ãᆼᆵᆮᆧᆠᆙᆒᆋᆄá†}á†vá†oá†há†aá†Zá†Sá†Lá†Eá†>á†7á†0á†)á†"á†á†á† á†á†ÿà†øà†ñà†êà†ãà†Üà†Õà†Îà†Çà†Àà†¹à†²à†«à†¤à†à†–à†à†ˆà†à†zà†sà†là†eà†^à†Wà†Pà†Ià†Bà†;à†4à†-à†&à†à†à†à† à†à†ü߆õ߆î߆ç߆à߆Ù߆Ò߆Ë߆Ä߆½ß†¶ß†¯ß†¨ß†¡ß†šß†“߆Œß†…߆~߆w߆p߆i߆b߆[߆T߆M߆F߆?߆8߆1߆*߆#߆߆߆߆߆߆ùÞ†òÞ†ëÞ†äÞ†ÝÞ†ÖÞ†ÏÞ†ÈÞ†ÁÞ†ºÞ†³Þ†¬Þ†¥Þ†žÞ†—Þ†Þ†‰Þ†‚Þ†{Þ†tÞ†mÞ†fÞ†_Þ†XÞ†QÞ†JÞ†CÞ†<Þ†5Þ†.Þ†'Þ† Þ†Þ†Þ† Þ†Þ†ý݆ö݆ï݆è݆á݆Ú݆Ó݆Ì݆Å݆¾Ý†·Ý†°Ý†©Ý†¢Ý†›Ý†”݆݆†Ý†݆x݆q݆j݆c݆\݆U݆N݆G݆@݆9݆2݆+݆$݆݆݆݆݆݆ú܆ó܆ì܆å܆Þ܆×܆Ð܆É܆Â܆»Ü†´Ü†­Ü†¦Ü†ŸÜ†˜Ü†‘܆ŠÜ†ƒÜ†|܆u܆n܆g܆`܆Y܆R܆K܆D܆=܆6܆/܆(܆!܆܆܆ ܆܆þÛ†÷Û†ðÛ†éÛ†âÛ†ÛÛ†ÔÛ†ÍÛ†ÆÛ†¿Û†¸Û†±Û†ªÛ†£Û†œÛ†•Û†ŽÛ†‡Û†€Û†yÛ†rÛ†kÛ†dÛ†]Û†VÛ†OÛ†HÛ†AÛ†:Û†3Û†,Û†%Û†Û†Û†Û† Û†Û†ûÚ†ôÚ†íÚ†æÚ†ßÚ†ØÚ†ÑÚ†ÊÚ†ÃÚ†¼Ú†µÚ†®Ú†§Ú† Ú†™Ú†’Ú†‹Ú†„Ú†}Ú†vÚ†oÚ†hÚ†aÚ†ZÚ†SÚ†LÚ†EÚ†>Ú†7Ú†0Ú†)Ú†"Ú†Ú†Ú† Ú†Ú†ÿÙ†øÙ†ñÙ†êÙ†ãÙ†ÜÙ†ÕÙ†ÎÙ†ÇÙ†ÀÙ†¹Ù†²Ù†«Ù†¤Ù†Ù†–ننˆÙ†Ù†zÙ†sÙ†lÙ†eÙ†^Ù†WÙ†PÙ†IÙ†BÙ†;Ù†4Ù†-Ù†&نننن ننü؆õ؆îØ†çØ†àØ†ÙØ†ÒØ†ËØ†Ä؆½Ø†¶Ø†¯Ø†¨Ø†¡Ø†šØ†“؆ŒØ†…؆~؆w؆p؆i؆b؆[؆T؆M؆F؆?؆8؆1؆*؆#؆؆؆؆؆؆ù׆ò׆ë׆ä׆Ý׆Ö׆Ï׆È׆Á׆º×†³×†¬×†¥×†ž×†—׆׆‰×†‚׆{׆t׆m׆f׆_׆X׆Q׆J׆C׆<׆5׆.׆'׆ ׆׆׆ ׆׆ýÖ†öÖ†ïÖ†èÖ†áÖ†ÚÖ†ÓÖ†ÌÖ†ÅÖ†¾Ö†·Ö†°Ö†©Ö†¢Ö†›Ö†”Ö†Ö††Ö†Ö†xÖ†qÖ†jÖ†cÖ†\Ö†UÖ†NÖ†GÖ†@Ö†9Ö†2Ö†+Ö†$Ö†Ö†Ö†Ö†Ö†Ö†úÕ†óÕ†ìÕ†åÕ†ÞÕ†×Õ†ÐÕ†ÉÕ†ÂÕ†»Õ†´Õ†­Õ†¦Õ†ŸÕ†˜Õ†‘Õ†ŠÕ†ƒÕ†|Õ†uÕ†nÕ†gÕ†`Õ†YÕ†RÕ†KÕ†DÕ†=Õ†6Õ†/Õ†(Õ†!Õ†Õ†Õ† Õ†Õ†þÔ†÷Ô†ðÔ†éÔ†âÔ†ÛÔ†ÔÔ†ÍÔ†ÆÔ†¿Ô†¸Ô†±Ô†ªÔ†£Ô†œÔ†•Ô†ŽÔ†‡Ô†€Ô†yÔ†rÔ†kÔ†dÔ†]Ô†VÔ†OÔ†HÔ†AÔ†:Ô†3Ô†,Ô†%Ô†Ô†Ô†Ô† Ô†Ô†ûÓ†ôÓ†íÓ†æÓ†ßÓ†ØÓ†ÑÓ†ÊÓ†ÃÓ†¼Ó†µÓ†®Ó†§Ó† Ó†™Ó†’Ó†‹Ó†„Ó†}Ó†vÓ†oÓ†hÓ†aÓ†ZÓ†SÓ†LÓ†EÓ†>Ó†7Ó†0Ó†)Ó†"Ó†Ó†Ó† Ó†Ó†ÿÒ†øÒ†ñÒ†êÒ†ãÒ†ÜÒ†ÕÒ†ÎÒ†ÇÒ†ÀÒ†¹Ò†²Ò†«Ò†¤Ò†Ò†–Ò†Ò†ˆÒ†Ò†zÒ†sÒ†lÒ†eÒ†^Ò†WÒ†PÒ†IÒ†BÒ†;Ò†4Ò†-Ò†&Ò†Ò†Ò†Ò† Ò†Ò†üцõцîцçцàцÙцÒцËцÄц½Ñ†¶Ñ†¯Ñ†¨Ñ†¡Ñ†šÑ†“цŒÑ†…ц~цwцpцiцbц[цTцMцFц?ц8ц1ц*ц#ццццццùІòІëІäІÝІÖІÏІÈІÁІºÐ†³Ð†¬Ð†¥Ð†žÐ†—ІІ‰Ð†‚І{ІtІmІfІ_ІXІQІJІCІ<І5І.І'І ІІІ ІІýφöφïφèφáφÚφÓφÌφÅφ¾Ï†·Ï†°Ï†©Ï†¢Ï†›Ï†”φφ†Ï†φxφqφjφcφ\φUφNφGφ@φ9φ2φ+φ$φφφφφφúΆóΆìΆåΆÞΆ×ΆÐΆÉΆÂΆ»Î†´Î†­Î†¦Î†ŸÎ†˜Î†‘ΆŠÎ†ƒÎ†|ΆuΆnΆgΆ`ΆYΆRΆKΆDΆ=Ά6Ά/Ά(Ά!ΆΆΆ ΆΆþ͆÷͆ð͆é͆â͆Û͆Ô͆Í͆ÆÍ†¿Í†¸Í†±Í†ªÍ†£Í†œÍ†•͆ŽÍ†‡Í†€Í†y͆r͆k͆d͆]͆V͆O͆H͆A͆:͆3͆,͆%͆͆͆͆ ͆͆û̆ô̆í̆æÌ†ß̆ØÌ†Ñ̆Ê̆Ã̆¼Ì†µÌ†®Ì†§Ì† Ì†™Ì†’̆‹Ì†„̆}̆v̆ŏh̆ăZ̆S̆L̆Ĕ>̆7̆0̆)̆"̆̆̆ ̆̆ÿˆøË†ñˆêˆãˆ܈ÕˆΈLjÀˆ¹Ë†²Ë†«Ë†¤Ë†ˆ–ˆˆˆË†ˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆüʆõʆîʆçʆàʆÙʆÒʆËʆÄʆ½Ê†¶Ê†¯Ê†¨Ê†¡Ê†šÊ†“ʆŒÊ†…ʆ~ʆwʆpʆiʆbʆ[ʆTʆMʆFʆ?ʆ8ʆ1ʆ*ʆ#ʆʆʆʆʆʆùɆòɆëɆäɆÝɆÖɆÏɆÈɆÁɆºÉ†³É†¬É†¥É†žÉ†—ɆɆ‰É†‚Ɇ{ɆtɆmɆfɆ_ɆXɆQɆJɆCɆ<Ɇ5Ɇ.Ɇ'Ɇ ɆɆɆ ɆɆýȆöȆïȆèȆáȆÚȆÓȆÌȆÅȆ¾È†·È†°È†©È†¢È†›È†”ȆȆ†È†ȆxȆqȆjȆcȆ\ȆUȆNȆGȆ@Ȇ9Ȇ2Ȇ+Ȇ$ȆȆȆȆȆȆúdžódžìdžådžÞdž×džÐdžÉdžÂdž»Ç†´Ç†­Ç†¦Ç†ŸÇ†˜Ç†‘džŠÇ†ƒÇ†|džudžndžgdž`džYdžRdžKdžDdž=dž6dž/dž(dž!dždždž dždžþƆ÷ƆðƆ鯆âÆ†ÛÆ†ÔÆ†ÍÆ†ÆÆ†¿Æ†¸Æ†±Æ†ªÆ†£Æ†œÆ†•ƆŽÆ†‡Æ†€Æ†yƆrƆkƆdƆ]ƆVƆOƆHƆAƆ:Ɔ3Ɔ,Ɔ%ƆƆƆƆ ƆƆûņôņíņæÅ†ßņØÅ†ÑņÊņÃņ¼Å†µÅ†®Å†§Å† Å†™Å†’ņ‹Å†„ņ}ņvņoņhņaņZņSņLņEņ>ņ7ņ0ņ)ņ"ņņņ ņņÿøĆñĆêĆãĆÜĆÕĆÎĆÇĆÀùòƫƤĆƖĆĆˆÄ†ĆzĆsĆlĆeĆ^ĆWĆPĆIĆBĆ;Ć4Ć-Ć&ĆĆĆĆ ĆĆüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚÆ“ƌÆ…Æ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆù†ò†ë†ä†݆Ö†φȆÁ†ºÂ†³Â†¬Â†¥Â†žÂ†—††‰Â†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ýÁ†öÁ†ïÁ†èÁ†áÁ†ÚÁ†ÓÁ†ÌÁ†ÅÁ†¾Á†·Á†°Á†©Á†¢Á†›Á†”Á†Á††Á†Á†xÁ†qÁ†jÁ†cÁ†\Á†UÁ†NÁ†GÁ†@Á†9Á†2Á†+Á†$Á†Á†Á†Á†Á†Á†úÀ†óÀ†ìÀ†åÀ†ÞÀ†×À†ÐÀ†ÉÀ†ÂÀ†»À†´À†­À†¦À†ŸÀ†˜À†‘À†ŠÀ†ƒÀ†|À†uÀ†nÀ†gÀ†`À†YÀ†RÀ†KÀ†DÀ†=À†6À†/À†(À†!À†À†À† À†À†þ¿†÷¿†ð¿†鿆⿆Û¿†Ô¿†Í¿†Æ¿†¿¿†¸¿†±¿†ª¿†£¿†œ¿†•¿†Ž¿†‡¿†€¿†y¿†r¿†k¿†d¿†]¿†V¿†O¿†H¿†A¿†:¿†3¿†,¿†%¿†¿†¿†¿† ¿†¿†û¾†ô¾†í¾†澆ß¾†ؾ†Ѿ†ʾ†þ†¼¾†µ¾†®¾†§¾† ¾†™¾†’¾†‹¾†„¾†}¾†v¾†o¾†h¾†a¾†Z¾†S¾†L¾†E¾†>¾†7¾†0¾†)¾†"¾†¾†¾† ¾†¾†ÿ½†ø½†ñ½†꽆㽆ܽ†Õ½†ν†ǽ†À½†¹½†²½†«½†¤½†½†–½†½†ˆ½†½†z½†s½†l½†e½†^½†W½†P½†I½†B½†;½†4½†-½†&½†½†½†½† ½†½†ü¼†õ¼†缆༆Ù¼†Ò¼†˼†ļ†½¼†¶¼†¯¼†¨¼†¡¼†š¼†“¼†Œ¼†…¼†~¼†w¼†p¼†i¼†b¼†[¼†T¼†M¼†F¼†?¼†8¼†1¼†*¼†#¼†¼†¼†¼†¼†¼†ù»†ò»†뻆仆Ý»†Ö»†Ï»†È»†Á»†º»†³»†¬»†¥»†ž»†—»†»†‰»†‚»†{»†t»†m»†f»†_»†X»†Q»†J»†C»†<»†5»†.»†'»† »†»†»† »†»†ýº†öº†ﺆ躆ẆÚº†Óº†̺†ź†¾º†·º†°º†©º†¢º†›º†”º†º††º†º†xº†qº†jº†cº†\º†Uº†Nº†Gº†@º†9º†2º†+º†$º†º†º†º†º†º†ú¹†ó¹†칆幆Þ¹†×¹†й†ɹ†¹†»¹†´¹†­¹†¦¹†Ÿ¹†˜¹†‘¹†й†ƒ¹†|¹†u¹†n¹†g¹†`¹†Y¹†R¹†K¹†D¹†=¹†6¹†/¹†(¹†!¹†¹†¹† ¹†¹†þ¸†÷¸†ð¸†鸆⸆Û¸†Ô¸†͸†Ƹ†¿¸†¸¸†±¸†ª¸†£¸†œ¸†•¸†ޏ†‡¸†€¸†y¸†r¸†k¸†d¸†]¸†V¸†O¸†H¸†A¸†:¸†3¸†,¸†%¸†¸†¸†¸† ¸†¸†û·†ô·†í·†æ·†ß·†Ø·†Ñ·†Ê·†÷†¼·†µ·†®·†§·† ·†™·†’·†‹·†„·†}·†v·†o·†h·†a·†Z·†S·†L·†E·†>·†7·†0·†)·†"·†·†·† ·†·†ÿ¶†ø¶†ñ¶†궆㶆ܶ†Õ¶†ζ†Ƕ†À¶†¹¶†²¶†«¶†¤¶†¶†–¶†¶†ˆ¶†¶†z¶†s¶†l¶†e¶†^¶†W¶†P¶†I¶†B¶†;¶†4¶†-¶†&¶†¶†¶†¶† ¶†¶†üµ†õµ†絆െÙµ†Òµ†˵†ĵ†½µ†¶µ†¯µ†¨µ†¡µ†šµ†“µ†Œµ†…µ†~µ†wµ†pµ†iµ†bµ†[µ†Tµ†Mµ†Fµ†?µ†8µ†1µ†*µ†#µ†µ†µ†µ†µ†µ†ù´†ò´†ë´†ä´†Ý´†Ö´†Ï´†È´†Á´†º´†³´†¬´†¥´†ž´†—´†´†‰´†‚´†{´†t´†m´†f´†_´†X´†Q´†J´†C´†<´†5´†.´†'´† ´†´†´† ´†´†ý³†ö³†ﳆ賆᳆Ú³†Ó³†̳†ų†¾³†·³†°³†©³†¢³†›³†”³†³††³†³†x³†q³†j³†c³†\³†U³†N³†G³†@³†9³†2³†+³†$³†³†³†³†³†³†ú²†ó²†첆岆Þ²†ײ†в†ɲ†²†»²†´²†­²†¦²†Ÿ²†˜²†‘²†в†ƒ²†|²†u²†n²†g²†`²†Y²†R²†K²†D²†=²†6²†/²†(²†!²†²†²† ²†²†þ±†÷±†ð±†鱆ⱆÛ±†Ô±†ͱ†Ʊ†¿±†¸±†±±†ª±†£±†œ±†•±†ޱ†‡±†€±†y±†r±†k±†d±†]±†V±†O±†H±†A±†:±†3±†,±†%±†±†±†±† ±†±†û°†ô°†í°†æ°†ß°†ذ†Ѱ†ʰ†ð†¼°†µ°†®°†§°† °†™°†’°†‹°†„°†}°†v°†o°†h°†a°†Z°†S°†L°†E°†>°†7°†0°†)°†"°†°†°† °†°†ÿ¯†ø¯†ñ¯†ꯆ㯆ܯ†Õ¯†ί†ǯ†À¯†¹¯†²¯†«¯†¤¯†¯†–¯†¯†ˆ¯†¯†z¯†s¯†l¯†e¯†^¯†W¯†P¯†I¯†B¯†;¯†4¯†-¯†&¯†¯†¯†¯† ¯†¯†ü®†õ®†箆ஆÙ®†Ò®†Ë®†Ä®†½®†¶®†¯®†¨®†¡®†š®†“®†Œ®†…®†~®†w®†p®†i®†b®†[®†T®†M®†F®†?®†8®†1®†*®†#®†®†®†®†®†®†ù­†ò­†ë­†ä­†Ý­†Ö­†Ï­†È­†Á­†º­†³­†¬­†¥­†ž­†—­†­†‰­†‚­†{­†t­†m­†f­†_­†X­†Q­†J­†C­†<­†5­†.­†'­† ­†­†­† ­†­†ý¬†ö¬†st謆ᬆÚ¬†Ó¬†̬†Ŭ†¾¬†·¬†°¬†©¬†¢¬†›¬†”¬†¬††¬†¬†x¬†q¬†j¬†c¬†\¬†U¬†N¬†G¬†@¬†9¬†2¬†+¬†$¬†¬†¬†¬†¬†¬†ú«†ó«†쫆嫆Þ«†׫†Ы†É«†«†»«†´«†­«†¦«†Ÿ«†˜«†‘«†Š«†ƒ«†|«†u«†n«†g«†`«†Y«†R«†K«†D«†=«†6«†/«†(«†!«†«†«† «†«†þª†÷ª†ðª†骆⪆Ûª†Ôª†ͪ†ƪ†¿ª†¸ª†±ª†ªª†£ª†œª†•ª†Žª†‡ª†€ª†yª†rª†kª†dª†]ª†Vª†Oª†Hª†Aª†:ª†3ª†,ª†%ª†ª†ª†ª† ª†ª†û©†ô©†í©†橆ß©†Ø©†Ñ©†Ê©†é†¼©†µ©†®©†§©† ©†™©†’©†‹©†„©†}©†v©†o©†h©†a©†Z©†S©†L©†E©†>©†7©†0©†)©†"©†©†©† ©†©†ÿ¨†ø¨†ñ¨†ꨆ㨆ܨ†Õ¨†Ψ†Ǩ†À¨†¹¨†²¨†«¨†¤¨†¨†–¨†¨†ˆ¨†¨†z¨†s¨†l¨†e¨†^¨†W¨†P¨†I¨†B¨†;¨†4¨†-¨†&¨†¨†¨†¨† ¨†¨†ü§†õ§†秆৆Ù§†Ò§†˧†ħ†½§†¶§†¯§†¨§†¡§†š§†“§†Œ§†…§†~§†w§†p§†i§†b§†[§†T§†M§†F§†?§†8§†1§†*§†#§†§†§†§†§†§†ù¦†ò¦†릆䦆ݦ†Ö¦†Ϧ†Ȧ†Á¦†º¦†³¦†¬¦†¥¦†ž¦†—¦†¦†‰¦†‚¦†{¦†t¦†m¦†f¦†_¦†X¦†Q¦†J¦†C¦†<¦†5¦†.¦†'¦† ¦†¦†¦† ¦†¦†ý¥†ö¥†牢襆᥆Ú¥†Ó¥†Ì¥†Å¥†¾¥†·¥†°¥†©¥†¢¥†›¥†”¥†¥††¥†¥†x¥†q¥†j¥†c¥†\¥†U¥†N¥†G¥†@¥†9¥†2¥†+¥†$¥†¥†¥†¥†¥†¥†ú¤†ó¤†줆夆Þ¤†פ†Ф†ɤ†¤†»¤†´¤†­¤†¦¤†Ÿ¤†˜¤†‘¤†Ф†ƒ¤†|¤†u¤†n¤†g¤†`¤†Y¤†R¤†K¤†D¤†=¤†6¤†/¤†(¤†!¤†¤†¤† ¤†¤†þ£†÷£†ð£†飆⣆Û£†Ô£†Í£†Æ£†¿£†¸£†±£†ª£†££†œ£†•£†Ž£†‡£†€£†y£†r£†k£†d£†]£†V£†O£†H£†A£†:£†3£†,£†%£†£†£†£† £†£†û¢†ô¢†í¢†梆ߢ†Ø¢†Ñ¢†Ê¢†â†¼¢†µ¢†®¢†§¢† ¢†™¢†’¢†‹¢†„¢†}¢†v¢†o¢†h¢†a¢†Z¢†S¢†L¢†E¢†>¢†7¢†0¢†)¢†"¢†¢†¢† ¢†¢†ÿ¡†ø¡†ñ¡†ꡆ㡆Ü¡†Õ¡†Ρ†Ç¡†À¡†¹¡†²¡†«¡†¤¡†¡†–¡†¡†ˆ¡†¡†z¡†s¡†l¡†e¡†^¡†W¡†P¡†I¡†B¡†;¡†4¡†-¡†&¡†¡†¡†¡† ¡†¡†ü †õ †î †ç †à †Ù †Ò †Ë †Ä †½ †¶ †¯ †¨ †¡ †š †“ †Œ †… †~ †w †p †i †b †[ †T †M †F †? †8 †1 †* †# † † † † † †ùŸ†òŸ†럆䟆ÝŸ†ÖŸ†ÏŸ†ÈŸ†ÁŸ†ºŸ†³Ÿ†¬Ÿ†¥Ÿ†žŸ†—Ÿ†Ÿ†‰Ÿ†‚Ÿ†{Ÿ†tŸ†mŸ†fŸ†_Ÿ†XŸ†QŸ†JŸ†CŸ†<Ÿ†5Ÿ†.Ÿ†'Ÿ† Ÿ†Ÿ†Ÿ† Ÿ†Ÿ†ýž†öž†螆ឆÚž†Óž†Ìž†Åž†¾ž†·ž†°ž†©ž†¢ž†›ž†”ž†ž††ž†ž†xž†qž†jž†cž†\ž†Už†Nž†Gž†@ž†9ž†2ž†+ž†$ž†ž†ž†ž†ž†ž†ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þœ†÷œ†ðœ†霆✆Ûœ†Ôœ†Íœ†Æœ†¿œ†¸œ†±œ†ªœ†£œ†œœ†•œ†Žœ†‡œ†€œ†yœ†rœ†kœ†dœ†]œ†Vœ†Oœ†Hœ†Aœ†:œ†3œ†,œ†%œ†œ†œ†œ† œ†œ†û›†ô›†훆曆ß›†Ø›†Ñ›†Ê›†Û†¼›†µ›†®›†§›† ›†™›†’›†‹›†„›†}›†v›†o›†h›†a›†Z›†S›†L›†E›†>›†7›†0›†)›†"›†›†›† ›†›†ÿš†øš†ñš†Ꚇ㚆Üš†Õš†Κ†Çš†Àš†¹š†²š†«š†¤š†š†–š†š†ˆš†š†zš†sš†lš†eš†^š†Wš†Pš†Iš†Bš†;š†4š†-š†&š†š†š†š† š†š†ü™†õ™†癆à™†Ù™†Ò™†Ë™†Ä™†½™†¶™†¯™†¨™†¡™†š™†“™†Œ™†…™†~™†w™†p™†i™†b™†[™†T™†M™†F™†?™†8™†1™†*™†#™†™†™†™†™†™†ù˜†ò˜†똆䘆ݘ†Ö˜†Ϙ†Ș†Á˜†º˜†³˜†¬˜†¥˜†ž˜†—˜†˜†‰˜†‚˜†{˜†t˜†m˜†f˜†_˜†X˜†Q˜†J˜†C˜†<˜†5˜†.˜†'˜† ˜†˜†˜† ˜†˜†ý—†ö—†ï—†è—†á—†Ú—†Ó—†Ì—†Å—†¾—†·—†°—†©—†¢—†›—†”—†—††—†—†x—†q—†j—†c—†\—†U—†N—†G—†@—†9—†2—†+—†$—†—†—†—†—†—†ú–†ó–†ì–†å–†Þ–†×–†Ж†É–†–†»–†´–†­–†¦–†Ÿ–†˜–†‘–†Š–†ƒ–†|–†u–†n–†g–†`–†Y–†R–†K–†D–†=–†6–†/–†(–†!–†–†–† –†–†þ•†÷•†ð•†镆╆Û•†Ô•†Í•†Æ•†¿•†¸•†±•†ª•†£•†œ•†••†Ž•†‡•†€•†y•†r•†k•†d•†]•†V•†O•†H•†A•†:•†3•†,•†%•†•†•†•† •†•†û”†ô”†픆攆ß”†Ø”†Ñ”†Ê”†Ô†¼”†µ”†®”†§”† ”†™”†’”†‹”†„”†}”†v”†o”†h”†a”†Z”†S”†L”†E”†>”†7”†0”†)”†"”†”†”† ”†”†ÿ“†ø“†ñ“†꓆㓆Ü“†Õ“†Γ†Ç“†À“†¹“†²“†«“†¤“†“†–“†“†ˆ“†“†z“†s“†l“†e“†^“†W“†P“†I“†B“†;“†4“†-“†&“†“†“†“† “†“†ü’†õ’†î’†ç’†à’†Ù’†Ò’†Ë’†Ä’†½’†¶’†¯’†¨’†¡’†š’†“’†Œ’†…’†~’†w’†p’†i’†b’†[’†T’†M’†F’†?’†8’†1’†*’†#’†’†’†’†’†’†ù‘†ò‘†둆䑆Ý‘†Ö‘†Ï‘†È‘†Á‘†º‘†³‘†¬‘†¥‘†ž‘†—‘†‘†‰‘†‚‘†{‘†t‘†m‘†f‘†_‘†X‘†Q‘†J‘†C‘†<‘†5‘†.‘†'‘† ‘†‘†‘† ‘†‘†ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þކ÷ކðކ鎆⎆ÛŽ†ÔŽ†ÍŽ†ÆŽ†¿Ž†¸Ž†±Ž†ªŽ†£Ž†œŽ†•ކŽŽ†‡Ž†€Ž†yކrކkކdކ]ކVކOކHކAކ:ކ3ކ,ކ%ކކކކ ކކû†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿŒ†øŒ†ñŒ†ꌆ㌆ÜŒ†ÕŒ†ÎŒ†ÇŒ†ÀŒ†¹Œ†²Œ†«Œ†¤Œ†Œ†–Œ†Œ†ˆŒ†Œ†zŒ†sŒ†lŒ†eŒ†^Œ†WŒ†PŒ†IŒ†BŒ†;Œ†4Œ†-Œ†&Œ†Œ†Œ†Œ† Œ†Œ†ü‹†õ‹†狆à‹†Ù‹†Ò‹†Ë‹†Ä‹†½‹†¶‹†¯‹†¨‹†¡‹†š‹†“‹†Œ‹†…‹†~‹†w‹†p‹†i‹†b‹†[‹†T‹†M‹†F‹†?‹†8‹†1‹†*‹†#‹†‹†‹†‹†‹†‹†ùІòІ늆䊆ÝŠ†ÖŠ†ÏŠ†ÈІÁІºŠ†³Š†¬Š†¥Š†žŠ†—ІІ‰Š†‚І{ІtІmІfІ_ІXІQІJІCІ<І5І.І'І ІІІ ІІý‰†ö‰†艆ቆÚ‰†Ó‰†̉†ʼn†¾‰†·‰†°‰†©‰†¢‰†›‰†”‰†‰††‰†‰†x‰†q‰†j‰†c‰†\‰†U‰†N‰†G‰†@‰†9‰†2‰†+‰†$‰†‰†‰†‰†‰†‰†úˆ†óˆ†숆分Þˆ†׈†Ј†Ɉ†ˆ†»ˆ†´ˆ†­ˆ†¦ˆ†Ÿˆ†˜ˆ†‘ˆ†Šˆ†ƒˆ†|ˆ†uˆ†nˆ†gˆ†`ˆ†Yˆ†Rˆ†Kˆ†Dˆ†=ˆ†6ˆ†/ˆ†(ˆ†!ˆ†ˆ†ˆ† ˆ†ˆ†þ‡†÷‡†ð‡†釆⇆Û‡†Ô‡†͇†Ƈ†¿‡†¸‡†±‡†ª‡†£‡†œ‡†•‡†އ†‡‡†€‡†y‡†r‡†k‡†d‡†]‡†V‡†O‡†H‡†A‡†:‡†3‡†,‡†%‡†‡†‡†‡† ‡†‡†û††ô††톆憆߆†؆†ц†ʆ†Ɔ¼††µ††®††§†† ††™††’††‹††„††}††v††o††h††a††Z††S††L††E††>††7††0††)††"†††††† ††††ÿ…†ø…†ñ…†ê…†ã…†Ü…†Õ…†Î…†Ç…†À…†¹…†²…†«…†¤…†…†–…†…†ˆ…†…†z…†s…†l…†e…†^…†W…†P…†I…†B…†;…†4…†-…†&…†…†…†…† …†…†ü„†õ„†焆à„†Ù„†Ò„†Ë„†Ä„†½„†¶„†¯„†¨„†¡„†š„†“„†Œ„†…„†~„†w„†p„†i„†b„†[„†T„†M„†F„†?„†8„†1„†*„†#„†„†„†„†„†„†ùƒ†òƒ†냆䃆݃†Öƒ†σ†ȃ†Áƒ†ºƒ†³ƒ†¬ƒ†¥ƒ†žƒ†—ƒ†ƒ†‰ƒ†‚ƒ†{ƒ†tƒ†mƒ†fƒ†_ƒ†Xƒ†Qƒ†Jƒ†Cƒ†<ƒ†5ƒ†.ƒ†'ƒ† ƒ†ƒ†ƒ† ƒ†ƒ†ý‚†ö‚†肆ႆÚ‚†Ó‚†Ì‚†Å‚†¾‚†·‚†°‚†©‚†¢‚†›‚†”‚†‚††‚†‚†x‚†q‚†j‚†c‚†\‚†U‚†N‚†G‚†@‚†9‚†2‚†+‚†$‚†‚†‚†‚†‚†‚†ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ€†÷€†ð€†逆 Û€†Ô€†Í€†Æ€†¿€†¸€†±€†ª€†£€†œ€†•€†Ž€†‡€†€€†y€†r€†k€†d€†]€†V€†O€†H€†A€†:€†3€†,€†%€†€†€†€† €†€†û†ô†í†æ†ß†Ø†Ñ†Ê†Ã†¼†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ~†ø~†ñ~†ê~†ã~†Ü~†Õ~†Î~†Ç~†À~†¹~†²~†«~†¤~†~†–~†~†ˆ~†~†z~†s~†l~†e~†^~†W~†P~†I~†B~†;~†4~†-~†&~†~†~†~† ~†~†ü}†õ}†î}†ç}†à}†Ù}†Ò}†Ë}†Ä}†½}†¶}†¯}†¨}†¡}†š}†“}†Œ}†…}†~}†w}†p}†i}†b}†[}†T}†M}†F}†?}†8}†1}†*}†#}†}†}†}†}†}†ù|†ò|†ë|†ä|†Ý|†Ö|†Ï|†È|†Á|†º|†³|†¬|†¥|†ž|†—|†|†‰|†‚|†{|†t|†m|†f|†_|†X|†Q|†J|†C|†<|†5|†.|†'|† |†|†|† |†|†ý{†ö{†ï{†è{†á{†Ú{†Ó{†Ì{†Å{†¾{†·{†°{†©{†¢{†›{†”{†{††{†{†x{†q{†j{†c{†\{†U{†N{†G{†@{†9{†2{†+{†${†{†{†{†{†{†úz†óz†ìz†åz†Þz†×z†Ðz†Éz†Âz†»z†´z†­z†¦z†Ÿz†˜z†‘z†Šz†ƒz†|z†uz†nz†gz†`z†Yz†Rz†Kz†Dz†=z†6z†/z†(z†!z†z†z† z†z†þy†÷y†ðy†éy†ây†Ûy†Ôy†Íy†Æy†¿y†¸y†±y†ªy†£y†œy†•y†Žy†‡y†€y†yy†ry†ky†dy†]y†Vy†Oy†Hy†Ay†:y†3y†,y†%y†y†y†y† y†y†ûx†ôx†íx†æx†ßx†Øx†Ñx†Êx†Ãx†¼x†µx†®x†§x† x†™x†’x†‹x†„x†}x†vx†ox†hx†ax†Zx†Sx†Lx†Ex†>x†7x†0x†)x†"x†x†x† x†x†ÿw†øw†ñw†êw†ãw†Üw†Õw†Îw†Çw†Àw†¹w†²w†«w†¤w†w†–w†w†ˆw†w†zw†sw†lw†ew†^w†Ww†Pw†Iw†Bw†;w†4w†-w†&w†w†w†w† w†w†üv†õv†îv†çv†àv†Ùv†Òv†Ëv†Äv†½v†¶v†¯v†¨v†¡v†šv†“v†Œv†…v†~v†wv†pv†iv†bv†[v†Tv†Mv†Fv†?v†8v†1v†*v†#v†v†v†v†v†v†ùu†òu†ëu†äu†Ýu†Öu†Ïu†Èu†Áu†ºu†³u†¬u†¥u†žu†—u†u†‰u†‚u†{u†tu†mu†fu†_u†Xu†Qu†Ju†Cu†q†7q†0q†)q†"q†q†q† q†q†ÿp†øp†ñp†êp†ãp†Üp†Õp†Îp†Çp†Àp†¹p†²p†«p†¤p†p†–p†p†ˆp†p†zp†sp†lp†ep†^p†Wp†Pp†Ip†Bp†;p†4p†-p†&p†p†p†p† p†p†üo†õo†îo†ço†ào†Ùo†Òo†Ëo†Äo†½o†¶o†¯o†¨o†¡o†šo†“o†Œo†…o†~o†wo†po†io†bo†[o†To†Mo†Fo†?o†8o†1o†*o†#o†o†o†o†o†o†ùn†òn†ën†än†Ýn†Ön†Ïn†Èn†Án†ºn†³n†¬n†¥n†žn†—n†n†‰n†‚n†{n†tn†mn†fn†_n†Xn†Qn†Jn†Cn†j†7j†0j†)j†"j†j†j† j†j†ÿi†øi†ñi†êi†ãi†Üi†Õi†Îi†Çi†Ài†¹i†²i†«i†¤i†i†–i†i†ˆi†i†zi†si†li†ei†^i†Wi†Pi†Ii†Bi†;i†4i†-i†&i†i†i†i† i†i†üh†õh†îh†çh†àh†Ùh†Òh†Ëh†Äh†½h†¶h†¯h†¨h†¡h†šh†“h†Œh†…h†~h†wh†ph†ih†bh†[h†Th†Mh†Fh†?h†8h†1h†*h†#h†h†h†h†h†h†ùg†òg†ëg†äg†Ýg†Ög†Ïg†Èg†Ág†ºg†³g†¬g†¥g†žg†—g†g†‰g†‚g†{g†tg†mg†fg†_g†Xg†Qg†Jg†Cg†c†7c†0c†)c†"c†c†c† c†c†ÿb†øb†ñb†êb†ãb†Üb†Õb†Îb†Çb†Àb†¹b†²b†«b†¤b†b†–b†b†ˆb†b†zb†sb†lb†eb†^b†Wb†Pb†Ib†Bb†;b†4b†-b†&b†b†b†b† b†b†üa†õa†îa†ça†àa†Ùa†Òa†Ëa†Äa†½a†¶a†¯a†¨a†¡a†ša†“a†Œa†…a†~a†wa†pa†ia†ba†[a†Ta†Ma†Fa†?a†8a†1a†*a†#a†a†a†a†a†a†ù`†ò`†ë`†ä`†Ý`†Ö`†Ï`†È`†Á`†º`†³`†¬`†¥`†ž`†—`†`†‰`†‚`†{`†t`†m`†f`†_`†X`†Q`†J`†C`†<`†5`†.`†'`† `†`†`† `†`†ý_†ö_†ï_†è_†á_†Ú_†Ó_†Ì_†Å_†¾_†·_†°_†©_†¢_†›_†”_†_††_†_†x_†q_†j_†c_†\_†U_†N_†G_†@_†9_†2_†+_†$_†_†_†_†_†_†ú^†ó^†ì^†å^†Þ^†×^†Ð^†É^†Â^†»^†´^†­^†¦^†Ÿ^†˜^†‘^†Š^†ƒ^†|^†u^†n^†g^†`^†Y^†R^†K^†D^†=^†6^†/^†(^†!^†^†^† ^†^†þ]†÷]†ð]†é]†â]†Û]†Ô]†Í]†Æ]†¿]†¸]†±]†ª]†£]†œ]†•]†Ž]†‡]†€]†y]†r]†k]†d]†]]†V]†O]†H]†A]†:]†3]†,]†%]†]†]†]† ]†]†û\†ô\†í\†æ\†ß\†Ø\†Ñ\†Ê\†Ã\†¼\†µ\†®\†§\† \†™\†’\†‹\†„\†}\†v\†o\†h\†a\†Z\†S\†L\†E\†>\†7\†0\†)\†"\†\†\† \†\†ÿ[†ø[†ñ[†ê[†ã[†Ü[†Õ[†Î[†Ç[†À[†¹[†²[†«[†¤[†[†–[†[†ˆ[†[†z[†s[†l[†e[†^[†W[†P[†I[†B[†;[†4[†-[†&[†[†[†[† [†[†üZ†õZ†îZ†çZ†àZ†ÙZ†ÒZ†ËZ†ÄZ†½Z†¶Z†¯Z†¨Z†¡Z†šZ†“Z†ŒZ†…Z†~Z†wZ†pZ†iZ†bZ†[Z†TZ†MZ†FZ†?Z†8Z†1Z†*Z†#Z†Z†Z†Z†Z†Z†ùY†òY†ëY†äY†ÝY†ÖY†ÏY†ÈY†ÁY†ºY†³Y†¬Y†¥Y†žY†—Y†Y†‰Y†‚Y†{Y†tY†mY†fY†_Y†XY†QY†JY†CY†U†7U†0U†)U†"U†U†U† U†U†ÿT†øT†ñT†êT†ãT†ÜT†ÕT†ÎT†ÇT†ÀT†¹T†²T†«T†¤T†T†–T†T†ˆT†T†zT†sT†lT†eT†^T†WT†PT†IT†BT†;T†4T†-T†&T†T†T†T† T†T†üS†õS†îS†çS†àS†ÙS†ÒS†ËS†ÄS†½S†¶S†¯S†¨S†¡S†šS†“S†ŒS†…S†~S†wS†pS†iS†bS†[S†TS†MS†FS†?S†8S†1S†*S†#S†S†S†S†S†S†ùR†òR†ëR†äR†ÝR†ÖR†ÏR†ÈR†ÁR†ºR†³R†¬R†¥R†žR†—R†R†‰R†‚R†{R†tR†mR†fR†_R†XR†QR†JR†CR†N†7N†0N†)N†"N†N†N† N†N†ÿM†øM†ñM†êM†ãM†ÜM†ÕM†ÎM†ÇM†ÀM†¹M†²M†«M†¤M†M†–M†M†ˆM†M†zM†sM†lM†eM†^M†WM†PM†IM†BM†;M†4M†-M†&M†M†M†M† M†M†üL†õL†îL†çL†àL†ÙL†ÒL†ËL†ÄL†½L†¶L†¯L†¨L†¡L†šL†“L†ŒL†…L†~L†wL†pL†iL†bL†[L†TL†ML†FL†?L†8L†1L†*L†#L†L†L†L†L†L†ùK†òK†ëK†äK†ÝK†ÖK†ÏK†ÈK†ÁK†ºK†³K†¬K†¥K†žK†—K†K†‰K†‚K†{K†tK†mK†fK†_K†XK†QK†JK†CK†G†7G†0G†)G†"G†G†G† G†G†ÿF†øF†ñF†êF†ãF†ÜF†ÕF†ÎF†ÇF†ÀF†¹F†²F†«F†¤F†F†–F†F†ˆF†F†zF†sF†lF†eF†^F†WF†PF†IF†BF†;F†4F†-F†&F†F†F†F† F†F†üE†õE†îE†çE†àE†ÙE†ÒE†ËE†ÄE†½E†¶E†¯E†¨E†¡E†šE†“E†ŒE†…E†~E†wE†pE†iE†bE†[E†TE†ME†FE†?E†8E†1E†*E†#E†E†E†E†E†E†ùD†òD†ëD†äD†ÝD†ÖD†ÏD†ÈD†ÁD†ºD†³D†¬D†¥D†žD†—D†D†‰D†‚D†{D†tD†mD†fD†_D†XD†QD†JD†CD†@†7@†0@†)@†"@†@†@† @†@†ÿ?†ø?†ñ?†ê?†ã?†Ü?†Õ?†Î?†Ç?†À?†¹?†²?†«?†¤?†?†–?†?†ˆ?†?†z?†s?†l?†e?†^?†W?†P?†I?†B?†;?†4?†-?†&?†?†?†?† ?†?†ü>†õ>†î>†ç>†à>†Ù>†Ò>†Ë>†Ä>†½>†¶>†¯>†¨>†¡>†š>†“>†Œ>†…>†~>†w>†p>†i>†b>†[>†T>†M>†F>†?>†8>†1>†*>†#>†>†>†>†>†>†ù=†ò=†ë=†ä=†Ý=†Ö=†Ï=†È=†Á=†º=†³=†¬=†¥=†ž=†—=†=†‰=†‚=†{=†t=†m=†f=†_=†X=†Q=†J=†C=†<=†5=†.=†'=† =†=†=† =†=†ý<†ö<†ï<†è<†á<†Ú<†Ó<†Ì<†Å<†¾<†·<†°<†©<†¢<†›<†”<†<††<†<†x<†q<†j<†c<†\<†U<†N<†G<†@<†9<†2<†+<†$<†<†<†<†<†<†ú;†ó;†ì;†å;†Þ;†×;†Ð;†É;†Â;†»;†´;†­;†¦;†Ÿ;†˜;†‘;†Š;†ƒ;†|;†u;†n;†g;†`;†Y;†R;†K;†D;†=;†6;†/;†(;†!;†;†;† ;†;†þ:†÷:†ð:†é:†â:†Û:†Ô:†Í:†Æ:†¿:†¸:†±:†ª:†£:†œ:†•:†Ž:†‡:†€:†y:†r:†k:†d:†]:†V:†O:†H:†A:†::†3:†,:†%:†:†:†:† :†:†û9†ô9†í9†æ9†ß9†Ø9†Ñ9†Ê9†Ã9†¼9†µ9†®9†§9† 9†™9†’9†‹9†„9†}9†v9†o9†h9†a9†Z9†S9†L9†E9†>9†79†09†)9†"9†9†9† 9†9†ÿ8†ø8†ñ8†ê8†ã8†Ü8†Õ8†Î8†Ç8†À8†¹8†²8†«8†¤8†8†–8†8†ˆ8†8†z8†s8†l8†e8†^8†W8†P8†I8†B8†;8†48†-8†&8†8†8†8† 8†8†ü7†õ7†î7†ç7†à7†Ù7†Ò7†Ë7†Ä7†½7†¶7†¯7†¨7†¡7†š7†“7†Œ7†…7†~7†w7†p7†i7†b7†[7†T7†M7†F7†?7†87†17†*7†#7†7†7†7†7†7†ù6†ò6†ë6†ä6†Ý6†Ö6†Ï6†È6†Á6†º6†³6†¬6†¥6†ž6†—6†6†‰6†‚6†{6†t6†m6†f6†_6†X6†Q6†J6†C6†<6†56†.6†'6† 6†6†6† 6†6†ý5†ö5†ï5†è5†á5†Ú5†Ó5†Ì5†Å5†¾5†·5†°5†©5†¢5†›5†”5†5††5†5†x5†q5†j5†c5†\5†U5†N5†G5†@5†95†25†+5†$5†5†5†5†5†5†ú4†ó4†ì4†å4†Þ4†×4†Ð4†É4†Â4†»4†´4†­4†¦4†Ÿ4†˜4†‘4†Š4†ƒ4†|4†u4†n4†g4†`4†Y4†R4†K4†D4†=4†64†/4†(4†!4†4†4† 4†4†þ3†÷3†ð3†é3†â3†Û3†Ô3†Í3†Æ3†¿3†¸3†±3†ª3†£3†œ3†•3†Ž3†‡3†€3†y3†r3†k3†d3†]3†V3†O3†H3†A3†:3†33†,3†%3†3†3†3† 3†3†û2†ô2†í2†æ2†ß2†Ø2†Ñ2†Ê2†Ã2†¼2†µ2†®2†§2† 2†™2†’2†‹2†„2†}2†v2†o2†h2†a2†Z2†S2†L2†E2†>2†72†02†)2†"2†2†2† 2†2†ÿ1†ø1†ñ1†ê1†ã1†Ü1†Õ1†Î1†Ç1†À1†¹1†²1†«1†¤1†1†–1†1†ˆ1†1†z1†s1†l1†e1†^1†W1†P1†I1†B1†;1†41†-1†&1†1†1†1† 1†1†ü0†õ0†î0†ç0†à0†Ù0†Ò0†Ë0†Ä0†½0†¶0†¯0†¨0†¡0†š0†“0†Œ0†…0†~0†w0†p0†i0†b0†[0†T0†M0†F0†?0†80†10†*0†#0†0†0†0†0†0†ù/†ò/†ë/†ä/†Ý/†Ö/†Ï/†È/†Á/†º/†³/†¬/†¥/†ž/†—/†/†‰/†‚/†{/†t/†m/†f/†_/†X/†Q/†J/†C/†+†7+†0+†)+†"+†+†+† +†+†ÿ*†ø*†ñ*†ê*†ã*†Ü*†Õ*†Î*†Ç*†À*†¹*†²*†«*†¤*†*†–*†*†ˆ*†*†z*†s*†l*†e*†^*†W*†P*†I*†B*†;*†4*†-*†&*†*†*†*† *†*†ü)†õ)†î)†ç)†à)†Ù)†Ò)†Ë)†Ä)†½)†¶)†¯)†¨)†¡)†š)†“)†Œ)†…)†~)†w)†p)†i)†b)†[)†T)†M)†F)†?)†8)†1)†*)†#)†)†)†)†)†)†ù(†ò(†ë(†ä(†Ý(†Ö(†Ï(†È(†Á(†º(†³(†¬(†¥(†ž(†—(†(†‰(†‚(†{(†t(†m(†f(†_(†X(†Q(†J(†C(†<(†5(†.(†'(† (†(†(† (†(†ý'†ö'†ï'†è'†á'†Ú'†Ó'†Ì'†Å'†¾'†·'†°'†©'†¢'†›'†”'†'††'†'†x'†q'†j'†c'†\'†U'†N'†G'†@'†9'†2'†+'†$'†'†'†'†'†'†ú&†ó&†ì&†å&†Þ&†×&†Ð&†É&†Â&†»&†´&†­&†¦&†Ÿ&†˜&†‘&†Š&†ƒ&†|&†u&†n&†g&†`&†Y&†R&†K&†D&†=&†6&†/&†(&†!&†&†&† &†&†þ%†÷%†ð%†é%†â%†Û%†Ô%†Í%†Æ%†¿%†¸%†±%†ª%†£%†œ%†•%†Ž%†‡%†€%†y%†r%†k%†d%†]%†V%†O%†H%†A%†:%†3%†,%†%%†%†%†%† %†%†û$†ô$†í$†æ$†ß$†Ø$†Ñ$†Ê$†Ã$†¼$†µ$†®$†§$† $†™$†’$†‹$†„$†}$†v$†o$†h$†a$†Z$†S$†L$†E$†>$†7$†0$†)$†"$†$†$† $†$†ÿ#†ø#†ñ#†ê#†ã#†Ü#†Õ#†Î#†Ç#†À#†¹#†²#†«#†¤#†#†–#†#†ˆ#†#†z#†s#†l#†e#†^#†W#†P#†I#†B#†;#†4#†-#†&#†#†#†#† #†#†ü"†õ"†î"†ç"†à"†Ù"†Ò"†Ë"†Ä"†½"†¶"†¯"†¨"†¡"†š"†“"†Œ"†…"†~"†w"†p"†i"†b"†["†T"†M"†F"†?"†8"†1"†*"†#"†"†"†"†"†"†ù!†ò!†ë!†ä!†Ý!†Ö!†Ï!†È!†Á!†º!†³!†¬!†¥!†ž!†—!†!†‰!†‚!†{!†t!†m!†f!†_!†X!†Q!†J!†C!††7†0†)†"††† ††ÿ†ø†ñ†ê†ã†Ü†Õ†Î†Ç†À†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü†õ†î†ç†à†Ù†Ò†Ë†Ä†½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù†ò†ë†ä†Ý†Ö†Ï†È†Á†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý†ö†ï†è†á†Ú†Ó†Ì†Å†¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú†ó†ì†å†Þ†×†Ð†É†Â†»†´†­†¦†Ÿ†˜†‘†Š†ƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ†÷†ð†é†â†Û†Ô†Í†Æ†¿†¸†±†ª†£†œ†•†Ž†‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û†ô†í†æ†ß†Ø†Ñ†Ê†Ã†¼†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ†ø†ñ†ê†ã†Ü†Õ†Î†Ç†À†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü†õ†î†ç†à†Ù†Ò†Ë†Ä†½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù†ò†ë†ä†Ý†Ö†Ï†È†Á†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý†ö†ï†è†á†Ú†Ó†Ì†Å†¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú†ó†ì†å†Þ†×†Ð†É†Â†»†´†­†¦†Ÿ†˜†‘†Š†ƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ†÷†ð†é†â†Û†Ô†Í†Æ†¿†¸†±†ª†£†œ†•†Ž†‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û†ô†í†æ†ß†Ø†Ñ†Ê†Ã†¼†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ†ø†ñ†ê†ã†Ü†Õ†Î†Ç†À†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü †õ †î †ç †à †Ù †Ò †Ë †Ä †½ †¶ †¯ †¨ †¡ †š †“ †Œ †… †~ †w †p †i †b †[ †T †M †F †? †8 †1 †* †# † † † † † †ù †ò †ë †ä †Ý †Ö †Ï †È †Á †º †³ †¬ †¥ †ž †— † †‰ †‚ †{ †t †m †f †_ †X †Q †J †C †< †5 †. †' † † † † † †ý †ö †ï †è †á †Ú †Ó †Ì †Å †¾ †· †° †© †¢ †› †” † †† † †x †q †j †c †\ †U †N †G †@ †9 †2 †+ †$ † † † † † †ú †ó †ì †å †Þ †× †Ð †É † †» †´ †­ †¦ †Ÿ †˜ †‘ †Š †ƒ †| †u †n †g †` †Y †R †K †D †= †6 †/ †( †! † † † † †þ †÷ †ð †é †â †Û †Ô †Í †Æ †¿ †¸ †± †ª †£ †œ †• †Ž †‡ †€ †y †r †k †d †] †V †O †H †A †: †3 †, †% † † † † † †û†ô†í†æ†ß†Ø†Ñ†Ê†Ã†¼†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ†ø†ñ†ê†ã†Ü†Õ†Î†Ç†À†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü†õ†î†ç†à†Ù†Ò†Ë†Ä†½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù†ò†ë†ä†Ý†Ö†Ï†È†Á†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý†ö†ï†è†á†Ú†Ó†Ì†Å†¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú†ó†ì†å†Þ†×†Ð†É†Â†»†´†­†¦†Ÿ†˜†‘†Š†ƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ†÷†ð†é†â†Û†Ô†Í†Æ†¿†¸†±†ª†£†œ†•†Ž†‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û†ô†í†æ†ß†Ø†Ñ†Ê†Ã†¼†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ†ø†ñ†ê†ã†܆Õ†ΆdžÀ†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††üÿ…õÿ…îÿ…çÿ…àÿ…Ùÿ…Òÿ…Ëÿ…Äÿ…½ÿ…¶ÿ…¯ÿ…¨ÿ…¡ÿ…šÿ…“ÿ…Œÿ……ÿ…~ÿ…wÿ…pÿ…iÿ…bÿ…[ÿ…Tÿ…Mÿ…Fÿ…?ÿ…8ÿ…1ÿ…*ÿ…#ÿ…ÿ…ÿ…ÿ…ÿ…ÿ…ùþ…òþ…ëþ…äþ…Ýþ…Öþ…Ïþ…Èþ…Áþ…ºþ…³þ…¬þ…¥þ…žþ…—þ…þ…‰þ…‚þ…{þ…tþ…mþ…fþ…_þ…Xþ…Qþ…Jþ…Cþ…<þ…5þ….þ…'þ… þ…þ…þ… þ…þ…ýý…öý…ïý…èý…áý…Úý…Óý…Ìý…Åý…¾ý…·ý…°ý…©ý…¢ý…›ý…”ý…ý…†ý…ý…xý…qý…jý…cý…\ý…Uý…Ný…Gý…@ý…9ý…2ý…+ý…$ý…ý…ý…ý…ý…ý…úü…óü…ìü…åü…Þü…×ü…Ðü…Éü…Âü…»ü…´ü…­ü…¦ü…Ÿü…˜ü…‘ü…Šü…ƒü…|ü…uü…nü…gü…`ü…Yü…Rü…Kü…Dü…=ü…6ü…/ü…(ü…!ü…ü…ü… ü…ü…þû…÷û…ðû…éû…âû…Ûû…Ôû…Íû…Æû…¿û…¸û…±û…ªû…£û…œû…•û…Žû…‡û…€û…yû…rû…kû…dû…]û…Vû…Oû…Hû…Aû…:û…3û…,û…%û…û…û…û… û…û…ûú…ôú…íú…æú…ßú…Øú…Ñú…Êú…Ãú…¼ú…µú…®ú…§ú… ú…™ú…’ú…‹ú…„ú…}ú…vú…oú…hú…aú…Zú…Sú…Lú…Eú…>ú…7ú…0ú…)ú…"ú…ú…ú… ú…ú…ÿù…øù…ñù…êù…ãù…Üù…Õù…Îù…Çù…Àù…¹ù…²ù…«ù…¤ù…ù…–ù…ù…ˆù…ù…zù…sù…lù…eù…^ù…Wù…Pù…Iù…Bù…;ù…4ù…-ù…&ù…ù…ù…ù… ù…ù…üø…õø…îø…çø…àø…Ùø…Òø…Ëø…Äø…½ø…¶ø…¯ø…¨ø…¡ø…šø…“ø…Œø……ø…~ø…wø…pø…iø…bø…[ø…Tø…Mø…Fø…?ø…8ø…1ø…*ø…#ø…ø…ø…ø…ø…ø…ù÷…ò÷…ë÷…ä÷…Ý÷…Ö÷…Ï÷…È÷…Á÷…º÷…³÷…¬÷…¥÷…ž÷…—÷…÷…‰÷…‚÷…{÷…t÷…m÷…f÷…_÷…X÷…Q÷…J÷…C÷…<÷…5÷….÷…'÷… ÷…÷…÷… ÷…÷…ýö…öö…ïö…èö…áö…Úö…Óö…Ìö…Åö…¾ö…·ö…°ö…©ö…¢ö…›ö…”ö…ö…†ö…ö…xö…qö…jö…cö…\ö…Uö…Nö…Gö…@ö…9ö…2ö…+ö…$ö…ö…ö…ö…ö…ö…úõ…óõ…ìõ…åõ…Þõ…×õ…Ðõ…Éõ…Âõ…»õ…´õ…­õ…¦õ…Ÿõ…˜õ…‘õ…Šõ…ƒõ…|õ…uõ…nõ…gõ…`õ…Yõ…Rõ…Kõ…Dõ…=õ…6õ…/õ…(õ…!õ…õ…õ… õ…õ…þô…÷ô…ðô…éô…âô…Ûô…Ôô…Íô…Æô…¿ô…¸ô…±ô…ªô…£ô…œô…•ô…Žô…‡ô…€ô…yô…rô…kô…dô…]ô…Vô…Oô…Hô…Aô…:ô…3ô…,ô…%ô…ô…ô…ô… ô…ô…ûó…ôó…íó…æó…ßó…Øó…Ñó…Êó…Ãó…¼ó…µó…®ó…§ó… ó…™ó…’ó…‹ó…„ó…}ó…vó…oó…hó…aó…Zó…Só…Ló…Eó…>ó…7ó…0ó…)ó…"ó…ó…ó… ó…ó…ÿò…øò…ñò…êò…ãò…Üò…Õò…Îò…Çò…Àò…¹ò…²ò…«ò…¤ò…ò…–ò…ò…ˆò…ò…zò…sò…lò…eò…^ò…Wò…Pò…Iò…Bò…;ò…4ò…-ò…&ò…ò…ò…ò… ò…ò…üñ…õñ…îñ…çñ…àñ…Ùñ…Òñ…Ëñ…Äñ…½ñ…¶ñ…¯ñ…¨ñ…¡ñ…šñ…“ñ…Œñ……ñ…~ñ…wñ…pñ…iñ…bñ…[ñ…Tñ…Mñ…Fñ…?ñ…8ñ…1ñ…*ñ…#ñ…ñ…ñ…ñ…ñ…ñ…ùð…òð…ëð…äð…Ýð…Öð…Ïð…Èð…Áð…ºð…³ð…¬ð…¥ð…žð…—ð…ð…‰ð…‚ð…{ð…tð…mð…fð…_ð…Xð…Qð…Jð…Cð…<ð…5ð….ð…'ð… ð…ð…ð… ð…ð…ýï…öï…ïï…èï…áï…Úï…Óï…Ìï…Åï…ï…†ï…ï…xï…qï…jï…cï…\ï…Uï…Nï…Gï…@ï…9ï…2ï…+ï…$ï…ï…ï…ï…ï…ï…úî…óî…ìî…åî…Þî…×î…Ðî…Éî…Âî…|î…uî…nî…gî…`î…Yî…Rî…Kî…Dî…=î…6î…/î…(î…!î…î…î… î…î…þí…÷í…ðí…éí…âí…Ûí…Ôí…Íí…Æí…¿í…¸í…±í…ªí…£í…œí…•í…Ží…‡í…€í…yí…rí…kí…dí…]í…Ví…Oí…Hí…Aí…:í…3í…,í…%í…í…í…í… í…í…ûì…ôì…íì…æì…ßì…Øì…Ñì…Êì…Ã셼셵셮셧셠셙셒셋셄ì…}ì…vì…oì…hì…aì…Zì…Sì…Lì…Eì…>ì…7ì…0ì…)ì…"ì…ì…ì… ì…ì…ÿë…øë…ñë…êë…ãë…Üë…Õë…Îë…Çë…À녹녲녫녤ë…ë…–ë…ë…ˆë…ë…zë…së…lë…eë…^ë…Wë…Pë…Ië…Bë…;ë…4ë…-ë…&ë…ë…ë…ë… ë…ë…üê…õê…îê…çê…àê…Ùê…Òê…Ëê…Äꅽꅶꅯꅨꅡꅚꅓꅌꅅê…~ê…wê…pê…iê…bê…[ê…Tê…Mê…Fê…?ê…8ê…1ê…*ê…#ê…ê…ê…ê…ê…ê…ùé…òé…ëé…äé…Ýé…Öé…Ïé…Èé…Á酺酳酬酥酞酗é…酉酂é…{é…té…mé…fé…_é…Xé…Qé…Jé…Cé…<é…5é….é…'é… é…é…é… é…é…ýè…öè…ïè…èè…áè…Úè…Óè…Ìè…Å腾腷腰腩腢腛腔è…è…†è…è…xè…qè…jè…cè…\è…Uè…Nè…Gè…@è…9è…2è…+è…$è…è…è…è…è…è…úç…óç…ìç…åç…Þç…×ç…Ðç…Éç…Â煻煴煭煦煟煘煑煊煃ç…|ç…uç…nç…gç…`ç…Yç…Rç…Kç…Dç…=ç…6ç…/ç…(ç…!ç…ç…ç… ç…ç…þæ…÷æ…ðæ…éæ…âæ…Ûæ…Ôæ…Íæ…Ææ…¿æ…¸æ…±æ…ªæ…£æ…œæ…•慎慇慀æ…yæ…ræ…kæ…dæ…]æ…Væ…Oæ…Hæ…Aæ…:æ…3æ…,æ…%æ…æ…æ…æ… æ…æ…ûå…ôå…íå…æå…ßå…Øå…Ñå…Êå…Ã兼兵兮內兠兙兒克兄å…}å…vå…oå…hå…aå…Zå…Så…Lå…Eå…>å…7å…0å…)å…"å…å…å… å…å…ÿä…øä…ñä…êä…ãä…Üä…Õä…Îä…Çä…À䅹䅲䅫䅤ä…ä…–ä…ä…ˆä…ä…zä…sä…lä…eä…^ä…Wä…Pä…Iä…Bä…;ä…4ä…-ä…&ä…ä…ä…ä… ä…ä…üã…õã…îã…çã…àã…Ùã…Òã…Ëã…Äㅽㅶㅯㅨㅡㅚㅓㅌㅅã…~ã…wã…pã…iã…bã…[ã…Tã…Mã…Fã…?ã…8ã…1ã…*ã…#ã…ã…ã…ã…ã…ã…ùâ…òâ…ëâ…äâ…Ýâ…Öâ…Ïâ…Èâ…ÁⅺⅳⅬⅥ⅞⅗â…ⅉ⅂â…{â…tâ…mâ…fâ…_â…Xâ…Qâ…Jâ…Câ…<â…5â….â…'â… â…â…â… â…â…ýá…öá…ïá…èá…áá…Úá…Óá…Ìá…Åᅾᅷᅰᅩᅢᅛᅔá…á…†á…á…xá…qá…já…cá…\á…Uá…Ná…Gá…@á…9á…2á…+á…$á…á…á…á…á…á…úà…óà…ìà…åà…Þà…×à…Ðà…Éà…Âà…»à…´à…­à…¦à…Ÿà…˜à…‘à…Šà…ƒà…|à…uà…nà…gà…`à…Yà…Rà…Kà…Dà…=à…6à…/à…(à…!à…à…à… à…à…þß…÷ß…ðß…éß…âß…Ûß…Ôß…Íß…Æß…¿ß…¸ß…±ß…ªß…£ß…œß…•ß…Žß…‡ß…€ß…yß…rß…kß…dß…]ß…Vß…Oß…Hß…Aß…:ß…3ß…,ß…%ß…ß…ß…ß… ß…ß…ûÞ…ôÞ…íÞ…æÞ…ßÞ…ØÞ…ÑÞ…ÊÞ…ÃÞ…¼Þ…µÞ…®Þ…§Þ… Þ…™Þ…’Þ…‹Þ…„Þ…}Þ…vÞ…oÞ…hÞ…aÞ…ZÞ…SÞ…LÞ…EÞ…>Þ…7Þ…0Þ…)Þ…"Þ…Þ…Þ… Þ…Þ…ÿÝ…øÝ…ñÝ…êÝ…ãÝ…ÜÝ…ÕÝ…ÎÝ…ÇÝ…ÀÝ…¹Ý…²Ý…«Ý…¤Ý…Ý…–Ý…Ý…ˆÝ…Ý…zÝ…sÝ…lÝ…eÝ…^Ý…WÝ…PÝ…IÝ…BÝ…;Ý…4Ý…-Ý…&Ý…Ý…Ý…Ý… Ý…Ý…üÜ…õÜ…îÜ…çÜ…àÜ…ÙÜ…ÒÜ…ËÜ…ÄÜ…½Ü…¶Ü…¯Ü…¨Ü…¡Ü…šÜ…“Ü…ŒÜ……Ü…~Ü…wÜ…pÜ…iÜ…bÜ…[Ü…TÜ…MÜ…FÜ…?Ü…8Ü…1Ü…*Ü…#Ü…Ü…Ü…Ü…Ü…Ü…ùÛ…òÛ…ëÛ…äÛ…ÝÛ…ÖÛ…ÏÛ…ÈÛ…ÁÛ…ºÛ…³Û…¬Û…¥Û…žÛ…—Û…Û…‰Û…‚Û…{Û…tÛ…mÛ…fÛ…_Û…XÛ…QÛ…JÛ…CÛ…<Û…5Û….Û…'Û… Û…Û…Û… Û…Û…ýÚ…öÚ…ïÚ…èÚ…áÚ…ÚÚ…ÓÚ…ÌÚ…ÅÚ…¾Ú…·Ú…°Ú…©Ú…¢Ú…›Ú…”Ú…Ú…†Ú…Ú…xÚ…qÚ…jÚ…cÚ…\Ú…UÚ…NÚ…GÚ…@Ú…9Ú…2Ú…+Ú…$Ú…Ú…Ú…Ú…Ú…Ú…úÙ…óÙ…ìÙ…åÙ…ÞÙ…×Ù…ÐÙ…ÉÙ…ÂÙ…»Ù…´Ù…­Ù…¦Ù…ŸÙ…˜Ù…‘Ù…ŠÙ…ƒÙ…|Ù…uÙ…nÙ…gÙ…`Ù…YÙ…RÙ…KÙ…DÙ…=Ù…6Ù…/Ù…(Ù…!ممم ممþØ…÷Ø…ðØ…騅âØ…ÛØ…ÔØ…ÍØ…ÆØ…¿Ø…¸Ø…±Ø…ªØ…£Ø…œØ…•Ø…ŽØ…‡Ø…€Ø…yØ…rØ…kØ…dØ…]Ø…VØ…OØ…HØ…AØ…:Ø…3Ø…,Ø…%؅؅؅؅ ؅؅û×…ô×…í×…æ×…ß×…Ø×…Ñ×…Ê×…Ã×…¼×…µ×…®×…§×… ×…™×…’×…‹×…„×…}×…v×…o×…h×…a×…Z×…S×…L×…E×…>×…7×…0×…)×…"×…×…×… ×…×…ÿÖ…øÖ…ñÖ…êÖ…ãÖ…ÜÖ…ÕÖ…ÎÖ…ÇÖ…ÀÖ…¹Ö…²Ö…«Ö…¤Ö…Ö…–Ö…Ö…ˆÖ…Ö…zÖ…sÖ…lÖ…eÖ…^Ö…WÖ…PÖ…IÖ…BÖ…;Ö…4Ö…-Ö…&Ö…Ö…Ö…Ö… Ö…Ö…üÕ…õÕ…îÕ…çÕ…àÕ…ÙÕ…ÒÕ…ËÕ…ÄÕ…½Õ…¶Õ…¯Õ…¨Õ…¡Õ…šÕ…“Õ…ŒÕ……Õ…~Õ…wÕ…pÕ…iÕ…bÕ…[Õ…TÕ…MÕ…FÕ…?Õ…8Õ…1Õ…*Õ…#Õ…Õ…Õ…Õ…Õ…Õ…ùÔ…òÔ…ëÔ…äÔ…ÝÔ…ÖÔ…ÏÔ…ÈÔ…ÁÔ…ºÔ…³Ô…¬Ô…¥Ô…žÔ…—Ô…Ô…‰Ô…‚Ô…{Ô…tÔ…mÔ…fÔ…_Ô…XÔ…QÔ…JÔ…CÔ…<Ô…5Ô….Ô…'Ô… Ô…Ô…Ô… Ô…Ô…ýÓ…öÓ…ïÓ…èÓ…áÓ…ÚÓ…ÓÓ…ÌÓ…ÅÓ…¾Ó…·Ó…°Ó…©Ó…¢Ó…›Ó…”Ó…Ó…†Ó…Ó…xÓ…qÓ…jÓ…cÓ…\Ó…UÓ…NÓ…GÓ…@Ó…9Ó…2Ó…+Ó…$Ó…Ó…Ó…Ó…Ó…Ó…úÒ…óÒ…ìÒ…åÒ…ÞÒ…×Ò…ÐÒ…ÉÒ…ÂÒ…»Ò…´Ò…­Ò…¦Ò…ŸÒ…˜Ò…‘Ò…ŠÒ…ƒÒ…|Ò…uÒ…nÒ…gÒ…`Ò…YÒ…RÒ…KÒ…DÒ…=Ò…6Ò…/Ò…(Ò…!Ò…Ò…Ò… Ò…Ò…þÑ…÷Ñ…ðÑ…éÑ…âÑ…ÛÑ…ÔÑ…ÍÑ…ÆÑ…¿Ñ…¸Ñ…±Ñ…ªÑ…£Ñ…œÑ…•Ñ…ŽÑ…‡Ñ…€Ñ…yÑ…rÑ…kÑ…dÑ…]Ñ…VÑ…OÑ…HÑ…AÑ…:Ñ…3Ñ…,Ñ…%Ñ…Ñ…Ñ…Ñ… Ñ…Ñ…ûÐ…ôÐ…íÐ…æÐ…ßÐ…ØÐ…ÑÐ…ÊÐ…ÃÐ…¼Ð…µÐ…®Ð…§Ð… Ð…™Ð…’Ð…‹Ð…„Ð…}Ð…vÐ…oÐ…hÐ…aÐ…ZÐ…SÐ…LÐ…EÐ…>Ð…7Ð…0Ð…)Ð…"Ð…Ð…Ð… Ð…Ð…ÿÏ…øÏ…ñÏ…êÏ…ãÏ…ÜÏ…ÕÏ…ÎÏ…ÇÏ…ÀÏ…¹Ï…²Ï…«Ï…¤Ï…Ï…–Ï…Ï…ˆÏ…Ï…zÏ…sÏ…lÏ…eÏ…^Ï…WÏ…PÏ…IÏ…BÏ…;Ï…4Ï…-Ï…&Ï…Ï…Ï…Ï… Ï…Ï…üÎ…õÎ…îÎ…çÎ…àÎ…ÙÎ…ÒÎ…ËÎ…ÄÎ…½Î…¶Î…¯Î…¨Î…¡Î…šÎ…“Î…ŒÎ……Î…~Î…wÎ…pÎ…iÎ…bÎ…[Î…TÎ…MÎ…FÎ…?Î…8Î…1Î…*Î…#Î…Î…Î…Î…Î…Î…ùÍ…òÍ…ëÍ…äÍ…ÝÍ…ÖÍ…ÏÍ…ÈÍ…ÁÍ…ºÍ…³Í…¬Í…¥Í…žÍ…—Í…Í…‰Í…‚Í…{Í…tÍ…mÍ…fÍ…_Í…XÍ…QÍ…JÍ…CÍ…<Í…5Í….Í…'Í… Í…Í…Í… Í…Í…ýÌ…öÌ…ïÌ…èÌ…áÌ…ÚÌ…ÓÌ…ÌÌ…ÅÌ…¾Ì…·Ì…°Ì…©Ì…¢Ì…›Ì…”Ì…Ì…†Ì…Ì…xÌ…qÌ…jÌ…cÌ…\Ì…UÌ…NÌ…GÌ…@Ì…9Ì…2Ì…+Ì…$Ì…Ì…Ì…Ì…Ì…Ì…úË…óË…ìË…åË…ÞË…×Ë…ÐË…ÉË…ÂË…»Ë…´Ë…­Ë…¦Ë…ŸË…˜Ë…‘Ë…ŠË…ƒË…|Ë…uË…nË…gË…`Ë…YË…RË…KË…DË…=Ë…6Ë…/Ë…(Ë…!Ë…Ë…Ë… Ë…Ë…þÊ…÷Ê…ðÊ…éÊ…âÊ…ÛÊ…ÔÊ…ÍÊ…ÆÊ…¿Ê…¸Ê…±Ê…ªÊ…£Ê…œÊ…•Ê…ŽÊ…‡Ê…€Ê…yÊ…rÊ…kÊ…dÊ…]Ê…VÊ…OÊ…HÊ…AÊ…:Ê…3Ê…,Ê…%Ê…Ê…Ê…Ê… Ê…Ê…ûÉ…ôÉ…íÉ…æÉ…ßÉ…ØÉ…ÑÉ…ÊÉ…ÃÉ…¼É…µÉ…®É…§É… É…™É…’É…‹É…„É…}É…vÉ…oÉ…hÉ…aÉ…ZÉ…SÉ…LÉ…EÉ…>É…7É…0É…)É…"É…É…É… É…É…ÿÈ…øÈ…ñÈ…êÈ…ãÈ…ÜÈ…ÕÈ…ÎÈ…ÇÈ…ÀÈ…¹È…²È…«È…¤È…È…–È…È…ˆÈ…È…zÈ…sÈ…lÈ…eÈ…^È…WÈ…PÈ…IÈ…BÈ…;È…4È…-È…&È…È…È…È… È…È…üÇ…õÇ…îÇ…çÇ…àÇ…ÙÇ…ÒÇ…ËÇ…ÄÇ…½Ç…¶Ç…¯Ç…¨Ç…¡Ç…šÇ…“Ç…ŒÇ……Ç…~Ç…wÇ…pÇ…iÇ…bÇ…[Ç…TÇ…MÇ…FÇ…?Ç…8Ç…1Ç…*Ç…#Ç…Ç…Ç…Ç…Ç…Ç…ùÆ…òÆ…ëÆ…䯅ÝÆ…ÖÆ…ÏÆ…ÈÆ…ÁÆ…ºÆ…³Æ…¬Æ…¥Æ…žÆ…—Æ…Æ…‰Æ…‚Æ…{Æ…tÆ…mÆ…fÆ…_Æ…XÆ…QÆ…JÆ…CÆ…<Æ…5Æ….Æ…'Æ… Æ…Æ…Æ… Æ…Æ…ýÅ…öÅ…ïÅ…èÅ…áÅ…ÚÅ…ÓÅ…ÌÅ…ÅÅ…¾Å…·Å…°Å…©Å…¢Å…›Å…”Å…Å…†Å…Å…xÅ…qÅ…jÅ…cÅ…\Å…UÅ…NÅ…GÅ…@Å…9Å…2Å…+Å…$Å…Å…Å…Å…Å…Å…úÄ…óÄ…ìÄ…åÄ…ÞÄ…×Ä…ÐÄ…ÉÄ…ÂÄ…»Ä…´Ä…­Ä…¦Ä…ŸÄ…˜Ä…‘Ä…ŠÄ…ƒÄ…|Ä…uÄ…nÄ…gÄ…`Ä…YÄ…RÄ…KÄ…DÄ…=Ä…6Ä…/Ä…(Ä…!Ä…Ä…Ä… Ä…Ä…þÃ…÷Ã…ðÃ…éÃ…âÃ…ÛÃ…ÔÃ…ÍÃ…ÆÃ…¿Ã…¸Ã…±Ã…ªÃ…£Ã…œÃ…•Ã…ŽÃ…‡Ã…€Ã…yÃ…rÃ…kÃ…dÃ…]Ã…VÃ…OÃ…HÃ…AÃ…:Ã…3Ã…,Ã…%Ã…Ã…Ã…Ã… Ã…Ã…ûÂ…ôÂ…íÂ…æÂ…ßÂ…ØÂ…ÑÂ…ÊÂ…ÃÂ…¼Â…µÂ…®Â…§Â… Â…™Â…’Â…‹Â…„Â…}Â…vÂ…oÂ…hÂ…aÂ…ZÂ…SÂ…LÂ…EÂ…>Â…7Â…0Â…)Â…"Â…Â…Â… Â…Â…ÿÁ…øÁ…ñÁ…êÁ…ãÁ…ÜÁ…ÕÁ…ÎÁ…ÇÁ…ÀÁ…¹Á…²Á…«Á…¤Á…Á…–Á…Á…ˆÁ…Á…zÁ…sÁ…lÁ…eÁ…^Á…WÁ…PÁ…IÁ…BÁ…;Á…4Á…-Á…&Á…Á…Á…Á… Á…Á…üÀ…õÀ…îÀ…çÀ…àÀ…ÙÀ…ÒÀ…ËÀ…ÄÀ…½À…¶À…¯À…¨À…¡À…šÀ…“À…ŒÀ……À…~À…wÀ…pÀ…iÀ…bÀ…[À…TÀ…MÀ…FÀ…?À…8À…1À…*À…#À…À…À…À…À…À…ù¿…ò¿…ë¿…ä¿…Ý¿…Ö¿…Ï¿…È¿…Á¿…º¿…³¿…¬¿…¥¿…ž¿…—¿…¿…‰¿…‚¿…{¿…t¿…m¿…f¿…_¿…X¿…Q¿…J¿…C¿…<¿…5¿….¿…'¿… ¿…¿…¿… ¿…¿…ý¾…ö¾…ï¾…è¾…á¾…Ú¾…Ó¾…̾…ž…¾¾…·¾…°¾…©¾…¢¾…›¾…”¾…¾…†¾…¾…x¾…q¾…j¾…c¾…\¾…U¾…N¾…G¾…@¾…9¾…2¾…+¾…$¾…¾…¾…¾…¾…¾…ú½…ó½…ì½…å½…Þ½…×½…н…ɽ…½…»½…´½…­½…¦½…Ÿ½…˜½…‘½…н…ƒ½…|½…u½…n½…g½…`½…Y½…R½…K½…D½…=½…6½…/½…(½…!½…½…½… ½…½…þ¼…÷¼…ð¼…é¼…â¼…Û¼…Ô¼…ͼ…Ƽ…¿¼…¸¼…±¼…ª¼…£¼…œ¼…•¼…޼…‡¼…€¼…y¼…r¼…k¼…d¼…]¼…V¼…O¼…H¼…A¼…:¼…3¼…,¼…%¼…¼…¼…¼… ¼…¼…û»…ô»…í»…æ»…ß»…Ø»…Ñ»…Ê»…û…¼»…µ»…®»…§»… »…™»…’»…‹»…„»…}»…v»…o»…h»…a»…Z»…S»…L»…E»…>»…7»…0»…)»…"»…»…»… »…»…ÿº…øº…ñº…꺅㺅ܺ…Õº…κ…Ǻ…Àº…¹º…²º…«º…¤º…º…–º…º…ˆº…º…zº…sº…lº…eº…^º…Wº…Pº…Iº…Bº…;º…4º…-º…&º…º…º…º… º…º…ü¹…õ¹…î¹…ç¹…ๅÙ¹…Ò¹…˹…Ĺ…½¹…¶¹…¯¹…¨¹…¡¹…š¹…“¹…Œ¹……¹…~¹…w¹…p¹…i¹…b¹…[¹…T¹…M¹…F¹…?¹…8¹…1¹…*¹…#¹…¹…¹…¹…¹…¹…ù¸…ò¸…븅丅ݸ…Ö¸…ϸ…ȸ…Á¸…º¸…³¸…¬¸…¥¸…ž¸…—¸…¸…‰¸…‚¸…{¸…t¸…m¸…f¸…_¸…X¸…Q¸…J¸…C¸…<¸…5¸….¸…'¸… ¸…¸…¸… ¸…¸…ý·…ö·…ï·…è·…á·…Ú·…Ó·…Ì·…Å·…¾·…··…°·…©·…¢·…›·…”·…·…†·…·…x·…q·…j·…c·…\·…U·…N·…G·…@·…9·…2·…+·…$·…·…·…·…·…·…ú¶…ó¶…ì¶…å¶…Þ¶…×¶…ж…ɶ…¶…»¶…´¶…­¶…¦¶…Ÿ¶…˜¶…‘¶…ж…ƒ¶…|¶…u¶…n¶…g¶…`¶…Y¶…R¶…K¶…D¶…=¶…6¶…/¶…(¶…!¶…¶…¶… ¶…¶…þµ…÷µ…ðµ…éµ…âµ…Ûµ…Ôµ…͵…Ƶ…¿µ…¸µ…±µ…ªµ…£µ…œµ…•µ…޵…‡µ…€µ…yµ…rµ…kµ…dµ…]µ…Vµ…Oµ…Hµ…Aµ…:µ…3µ…,µ…%µ…µ…µ…µ… µ…µ…û´…ô´…í´…æ´…ß´…Ø´…Ñ´…Ê´…ô…¼´…µ´…®´…§´… ´…™´…’´…‹´…„´…}´…v´…o´…h´…a´…Z´…S´…L´…E´…>´…7´…0´…)´…"´…´…´… ´…´…ÿ³…ø³…ñ³…ê³…ã³…ܳ…Õ³…γ…dz…À³…¹³…²³…«³…¤³…³…–³…³…ˆ³…³…z³…s³…l³…e³…^³…W³…P³…I³…B³…;³…4³…-³…&³…³…³…³… ³…³…ü²…õ²…î²…ç²…ಅÙ²…Ò²…˲…IJ…½²…¶²…¯²…¨²…¡²…š²…“²…Œ²……²…~²…w²…p²…i²…b²…[²…T²…M²…F²…?²…8²…1²…*²…#²…²…²…²…²…²…ù±…ò±…ë±…ä±…ݱ…Ö±…ϱ…ȱ…Á±…º±…³±…¬±…¥±…ž±…—±…±…‰±…‚±…{±…t±…m±…f±…_±…X±…Q±…J±…C±…<±…5±….±…'±… ±…±…±… ±…±…ý°…ö°…ï°…è°…á°…Ú°…Ó°…̰…Ű…¾°…·°…°°…©°…¢°…›°…”°…°…†°…°…x°…q°…j°…c°…\°…U°…N°…G°…@°…9°…2°…+°…$°…°…°…°…°…°…ú¯…ó¯…쯅寅Þ¯…ׯ…Я…ɯ…¯…»¯…´¯…­¯…¦¯…Ÿ¯…˜¯…‘¯…Н…ƒ¯…|¯…u¯…n¯…g¯…`¯…Y¯…R¯…K¯…D¯…=¯…6¯…/¯…(¯…!¯…¯…¯… ¯…¯…þ®…÷®…ð®…é®…â®…Û®…Ô®…Í®…Æ®…¿®…¸®…±®…ª®…£®…œ®…•®…Ž®…‡®…€®…y®…r®…k®…d®…]®…V®…O®…H®…A®…:®…3®…,®…%®…®…®…®… ®…®…û­…ô­…í­…æ­…ß­…Ø­…Ñ­…Ê­…í…¼­…µ­…®­…§­… ­…™­…’­…‹­…„­…}­…v­…o­…h­…a­…Z­…S­…L­…E­…>­…7­…0­…)­…"­…­…­… ­…­…ÿ¬…ø¬…ñ¬…ꬅ㬅ܬ…Õ¬…ά…Ǭ…À¬…¹¬…²¬…«¬…¤¬…¬…–¬…¬…ˆ¬…¬…z¬…s¬…l¬…e¬…^¬…W¬…P¬…I¬…B¬…;¬…4¬…-¬…&¬…¬…¬…¬… ¬…¬…ü«…õ«…î«…ç«…à«…Ù«…Ò«…Ë«…Ä«…½«…¶«…¯«…¨«…¡«…š«…“«…Œ«……«…~«…w«…p«…i«…b«…[«…T«…M«…F«…?«…8«…1«…*«…#«…«…«…«…«…«…ùª…òª…명䪅ݪ…Öª…Ϫ…Ȫ…Áª…ºª…³ª…¬ª…¥ª…žª…—ª…ª…‰ª…‚ª…{ª…tª…mª…fª…_ª…Xª…Qª…Jª…Cª…<ª…5ª….ª…'ª… ª…ª…ª… ª…ª…ý©…ö©…ï©…è©…á©…Ú©…Ó©…Ì©…Å©…¾©…·©…°©…©©…¢©…›©…”©…©…†©…©…x©…q©…j©…c©…\©…U©…N©…G©…@©…9©…2©…+©…$©…©…©…©…©…©…ú¨…ó¨…쨅娅Þ¨…ר…Ш…ɨ…¨…»¨…´¨…­¨…¦¨…Ÿ¨…˜¨…‘¨…Ѝ…ƒ¨…|¨…u¨…n¨…g¨…`¨…Y¨…R¨…K¨…D¨…=¨…6¨…/¨…(¨…!¨…¨…¨… ¨…¨…þ§…÷§…ð§…é§…â§…Û§…Ô§…ͧ…Ƨ…¿§…¸§…±§…ª§…£§…œ§…•§…ާ…‡§…€§…y§…r§…k§…d§…]§…V§…O§…H§…A§…:§…3§…,§…%§…§…§…§… §…§…û¦…ô¦…í¦…榅ߦ…ئ…Ѧ…ʦ…æ…¼¦…µ¦…®¦…§¦… ¦…™¦…’¦…‹¦…„¦…}¦…v¦…o¦…h¦…a¦…Z¦…S¦…L¦…E¦…>¦…7¦…0¦…)¦…"¦…¦…¦… ¦…¦…ÿ¥…ø¥…ñ¥…ꥅ㥅Ü¥…Õ¥…Î¥…Ç¥…À¥…¹¥…²¥…«¥…¤¥…¥…–¥…¥…ˆ¥…¥…z¥…s¥…l¥…e¥…^¥…W¥…P¥…I¥…B¥…;¥…4¥…-¥…&¥…¥…¥…¥… ¥…¥…ü¤…õ¤…礅अÙ¤…Ò¤…ˤ…Ĥ…½¤…¶¤…¯¤…¨¤…¡¤…𤅓¤…Œ¤……¤…~¤…w¤…p¤…i¤…b¤…[¤…T¤…M¤…F¤…?¤…8¤…1¤…*¤…#¤…¤…¤…¤…¤…¤…ù£…ò£…룅䣅Ý£…Ö£…Ï£…È£…Á£…º£…³£…¬£…¥£…ž£…—£…£…‰£…‚£…{£…t£…m£…f£…_£…X£…Q£…J£…C£…<£…5£….£…'£… £…£…£… £…£…ý¢…ö¢…袅ᢅÚ¢…Ó¢…Ì¢…Å¢…¾¢…·¢…°¢…©¢…¢¢…›¢…”¢…¢…†¢…¢…x¢…q¢…j¢…c¢…\¢…U¢…N¢…G¢…@¢…9¢…2¢…+¢…$¢…¢…¢…¢…¢…¢…ú¡…ó¡…ì¡…å¡…Þ¡…ס…С…É¡…¡…»¡…´¡…­¡…¦¡…Ÿ¡…˜¡…‘¡…Š¡…ƒ¡…|¡…u¡…n¡…g¡…`¡…Y¡…R¡…K¡…D¡…=¡…6¡…/¡…(¡…!¡…¡…¡… ¡…¡…þ …÷ …ð …é …â …Û …Ô …Í …Æ …¿ …¸ …± …ª …£ …œ …• …Ž …‡ …€ …y …r …k …d …] …V …O …H …A …: …3 …, …% … … … …  … …ûŸ…ôŸ…ퟅ柅ߟ…ØŸ…ÑŸ…ÊŸ…ß…¼Ÿ…µŸ…®Ÿ…§Ÿ… Ÿ…™Ÿ…’Ÿ…‹Ÿ…„Ÿ…}Ÿ…vŸ…oŸ…hŸ…aŸ…ZŸ…SŸ…LŸ…EŸ…>Ÿ…7Ÿ…0Ÿ…)Ÿ…"Ÿ…Ÿ…Ÿ… Ÿ…Ÿ…ÿž…øž…ñž…êž…ãž…Üž…Õž…Ξ…Çž…Àž…¹ž…²ž…«ž…¤ž…ž…–ž…ž…ˆž…ž…zž…sž…lž…ež…^ž…Wž…Pž…Iž…Bž…;ž…4ž…-ž…&ž…ž…ž…ž… ž…ž…ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ùœ…òœ…뜅䜅Ýœ…Öœ…Ïœ…Èœ…Áœ…ºœ…³œ…¬œ…¥œ…žœ…—œ…œ…‰œ…‚œ…{œ…tœ…mœ…fœ…_œ…Xœ…Qœ…Jœ…Cœ…<œ…5œ….œ…'œ… œ…œ…œ… œ…œ…ý›…ö›…ï›…è›…á›…Ú›…Ó›…Ì›…Å›…¾›…·›…°›…©›…¢›…››…”›…›…†›…›…x›…q›…j›…c›…\›…U›…N›…G›…@›…9›…2›…+›…$›…›…›…›…›…›…úš…óš…ìš…åš…Þš…ך…К…Éš…š…»š…´š…­š…¦š…Ÿš…˜š…‘š…Šš…ƒš…|š…uš…nš…gš…`š…Yš…Rš…Kš…Dš…=š…6š…/š…(š…!š…š…š… š…š…þ™…÷™…ð™…é™…â™…Û™…Ô™…Í™…Æ™…¿™…¸™…±™…ª™…£™…œ™…•™…Ž™…‡™…€™…y™…r™…k™…d™…]™…V™…O™…H™…A™…:™…3™…,™…%™…™…™…™… ™…™…û˜…ô˜…혅昅ߘ…ؘ…ј…ʘ…Ø…¼˜…µ˜…®˜…§˜… ˜…™˜…’˜…‹˜…„˜…}˜…v˜…o˜…h˜…a˜…Z˜…S˜…L˜…E˜…>˜…7˜…0˜…)˜…"˜…˜…˜… ˜…˜…ÿ—…ø—…ñ—…ê—…ã—…Ü—…Õ—…Η…Ç—…À—…¹—…²—…«—…¤—…—…–—…—…ˆ—…—…z—…s—…l—…e—…^—…W—…P—…I—…B—…;—…4—…-—…&—…—…—…—… —…—…ü–…õ–…î–…ç–…à–…Ù–…Ò–…Ë–…Ä–…½–…¶–…¯–…¨–…¡–…š–…“–…Œ–……–…~–…w–…p–…i–…b–…[–…T–…M–…F–…?–…8–…1–…*–…#–…–…–…–…–…–…ù•…ò•…ë•…ä•…Ý•…Ö•…Ï•…È•…Á•…º•…³•…¬•…¥•…ž•…—•…•…‰•…‚•…{•…t•…m•…f•…_•…X•…Q•…J•…C•…<•…5•….•…'•… •…•…•… •…•…ý”…ö”…ï”…è”…á”…Ú”…Ó”…Ì”…Å”…¾”…·”…°”…©”…¢”…›”…””…”…†”…”…x”…q”…j”…c”…\”…U”…N”…G”…@”…9”…2”…+”…$”…”…”…”…”…”…ú“…ó“…ì“…å“…Þ“…ד…Г…É“…“…»“…´“…­“…¦“…Ÿ“…˜“…‘“…Š“…ƒ“…|“…u“…n“…g“…`“…Y“…R“…K“…D“…=“…6“…/“…(“…!“…“…“… “…“…þ’…÷’…ð’…é’…â’…Û’…Ô’…Í’…Æ’…¿’…¸’…±’…ª’…£’…œ’…•’…Ž’…‡’…€’…y’…r’…k’…d’…]’…V’…O’…H’…A’…:’…3’…,’…%’…’…’…’… ’…’…û‘…ô‘…í‘…æ‘…ß‘…Ø‘…Ñ‘…Ê‘…Ñ…¼‘…µ‘…®‘…§‘… ‘…™‘…’‘…‹‘…„‘…}‘…v‘…o‘…h‘…a‘…Z‘…S‘…L‘…E‘…>‘…7‘…0‘…)‘…"‘…‘…‘… ‘…‘…ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ùŽ…òŽ…뎅䎅ÝŽ…ÖŽ…ÏŽ…ÈŽ…ÁŽ…ºŽ…³Ž…¬Ž…¥Ž…žŽ…—Ž…Ž…‰Ž…‚Ž…{Ž…tŽ…mŽ…fŽ…_Ž…XŽ…QŽ…JŽ…CŽ…<Ž…5Ž….Ž…'Ž… Ž…Ž…Ž… Ž…Ž…ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………úŒ…óŒ…쌅包ÞŒ…׌…ÐŒ…ÉŒ…ÂŒ…»Œ…´Œ…­Œ…¦Œ…ŸŒ…˜Œ…‘Œ…ŠŒ…ƒŒ…|Œ…uŒ…nŒ…gŒ…`Œ…YŒ…RŒ…KŒ…DŒ…=Œ…6Œ…/Œ…(Œ…!Œ…Œ…Œ… Œ…Œ…þ‹…÷‹…ð‹…é‹…â‹…Û‹…Ô‹…Í‹…Æ‹…¿‹…¸‹…±‹…ª‹…£‹…œ‹…•‹…Ž‹…‡‹…€‹…y‹…r‹…k‹…d‹…]‹…V‹…O‹…H‹…A‹…:‹…3‹…,‹…%‹…‹…‹…‹… ‹…‹…ûŠ…ôŠ…튅抅ߊ…ØŠ…ÑŠ…ÊŠ…Ê…¼Š…µŠ…®Š…§Š… Š…™Š…’Š…‹Š…„Š…}Š…vŠ…oŠ…hŠ…aŠ…ZŠ…SŠ…LŠ…EŠ…>Š…7Š…0Š…)Š…"Š…Š…Š… Š…Š…ÿ‰…ø‰…ñ‰…ꉅ㉅܉…Õ‰…Ή…lj…À‰…¹‰…²‰…«‰…¤‰…‰…–‰…‰…ˆ‰…‰…z‰…s‰…l‰…e‰…^‰…W‰…P‰…I‰…B‰…;‰…4‰…-‰…&‰…‰…‰…‰… ‰…‰…üˆ…õˆ…爅àˆ…Ùˆ…Òˆ…ˈ…Ĉ…½ˆ…¶ˆ…¯ˆ…¨ˆ…¡ˆ…šˆ…“ˆ…Œˆ……ˆ…~ˆ…wˆ…pˆ…iˆ…bˆ…[ˆ…Tˆ…Mˆ…Fˆ…?ˆ…8ˆ…1ˆ…*ˆ…#ˆ…ˆ…ˆ…ˆ…ˆ…ˆ…ù‡…ò‡…뇅䇅݇…Ö‡…χ…ȇ…Á‡…º‡…³‡…¬‡…¥‡…ž‡…—‡…‡…‰‡…‚‡…{‡…t‡…m‡…f‡…_‡…X‡…Q‡…J‡…C‡…<‡…5‡….‡…'‡… ‡…‡…‡… ‡…‡…ý†…ö†…膅ᆅÚ†…Ó†…̆…ņ…¾†…·†…°†…©†…¢†…›†…”†…†…††…†…x†…q†…j†…c†…\†…U†…N†…G†…@†…9†…2†…+†…$†…†…†…†…†…†…ú……ó……ì……å……Þ……×……Ð……É……Â……»……´……­……¦……Ÿ……˜……‘……Š……ƒ……|……u……n……g……`……Y……R……K……D……=……6……/……(……!……………… …………þ„…÷„…ð„…é„…â„…Û„…Ô„…Í„…Æ„…¿„…¸„…±„…ª„…£„…œ„…•„…Ž„…‡„…€„…y„…r„…k„…d„…]„…V„…O„…H„…A„…:„…3„…,„…%„…„…„…„… „…„…ûƒ…ôƒ…탅情߃…؃…у…ʃ…Ã…¼ƒ…µƒ…®ƒ…§ƒ… ƒ…™ƒ…’ƒ…‹ƒ…„ƒ…}ƒ…vƒ…oƒ…hƒ…aƒ…Zƒ…Sƒ…Lƒ…Eƒ…>ƒ…7ƒ…0ƒ…)ƒ…"ƒ…ƒ…ƒ… ƒ…ƒ…ÿ‚…ø‚…ñ‚…ê‚…ã‚…Ü‚…Õ‚…΂…Ç‚…À‚…¹‚…²‚…«‚…¤‚…‚…–‚…‚…ˆ‚…‚…z‚…s‚…l‚…e‚…^‚…W‚…P‚…I‚…B‚…;‚…4‚…-‚…&‚…‚…‚…‚… ‚…‚…ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù€…ò€…뀅䀅Ý€…Ö€…Ï€…È€…Á€…º€…³€…¬€…¥€…ž€…—€…€…‰€…‚€…{€…t€…m€…f€…_€…X€…Q€…J€…C€…<€…5€….€…'€… €…€…€… €…€…ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú~…ó~…ì~…å~…Þ~…×~…Ð~…É~…Â~…»~…´~…­~…¦~…Ÿ~…˜~…‘~…Š~…ƒ~…|~…u~…n~…g~…`~…Y~…R~…K~…D~…=~…6~…/~…(~…!~…~…~… ~…~…þ}…÷}…ð}…é}…â}…Û}…Ô}…Í}…Æ}…¿}…¸}…±}…ª}…£}…œ}…•}…Ž}…‡}…€}…y}…r}…k}…d}…]}…V}…O}…H}…A}…:}…3}…,}…%}…}…}…}… }…}…û|…ô|…í|…æ|…ß|…Ø|…Ñ|…Ê|…Ã|…¼|…µ|…®|…§|… |…™|…’|…‹|…„|…}|…v|…o|…h|…a|…Z|…S|…L|…E|…>|…7|…0|…)|…"|…|…|… |…|…ÿ{…ø{…ñ{…ê{…ã{…Ü{…Õ{…Î{…Ç{…À{…¹{…²{…«{…¤{…{…–{…{…ˆ{…{…z{…s{…l{…e{…^{…W{…P{…I{…B{…;{…4{…-{…&{…{…{…{… {…{…üz…õz…îz…çz…àz…Ùz…Òz…Ëz…Äz…½z…¶z…¯z…¨z…¡z…šz…“z…Œz……z…~z…wz…pz…iz…bz…[z…Tz…Mz…Fz…?z…8z…1z…*z…#z…z…z…z…z…z…ùy…òy…ëy…äy…Ýy…Öy…Ïy…Èy…Áy…ºy…³y…¬y…¥y…žy…—y…y…‰y…‚y…{y…ty…my…fy…_y…Xy…Qy…Jy…Cy…u…7u…0u…)u…"u…u…u… u…u…ÿt…øt…ñt…êt…ãt…Üt…Õt…Ît…Çt…Àt…¹t…²t…«t…¤t…t…–t…t…ˆt…t…zt…st…lt…et…^t…Wt…Pt…It…Bt…;t…4t…-t…&t…t…t…t… t…t…üs…õs…îs…çs…às…Ùs…Òs…Ës…Äs…½s…¶s…¯s…¨s…¡s…šs…“s…Œs……s…~s…ws…ps…is…bs…[s…Ts…Ms…Fs…?s…8s…1s…*s…#s…s…s…s…s…s…ùr…òr…ër…är…Ýr…Ör…Ïr…Èr…Ár…ºr…³r…¬r…¥r…žr…—r…r…‰r…‚r…{r…tr…mr…fr…_r…Xr…Qr…Jr…Cr…n…7n…0n…)n…"n…n…n… n…n…ÿm…øm…ñm…êm…ãm…Üm…Õm…Îm…Çm…Àm…¹m…²m…«m…¤m…m…–m…m…ˆm…m…zm…sm…lm…em…^m…Wm…Pm…Im…Bm…;m…4m…-m…&m…m…m…m… m…m…ül…õl…îl…çl…àl…Ùl…Òl…Ël…Äl…½l…¶l…¯l…¨l…¡l…šl…“l…Œl……l…~l…wl…pl…il…bl…[l…Tl…Ml…Fl…?l…8l…1l…*l…#l…l…l…l…l…l…ùk…òk…ëk…äk…Ýk…Ök…Ïk…Èk…Ák…ºk…³k…¬k…¥k…žk…—k…k…‰k…‚k…{k…tk…mk…fk…_k…Xk…Qk…Jk…Ck…g…7g…0g…)g…"g…g…g… g…g…ÿf…øf…ñf…êf…ãf…Üf…Õf…Îf…Çf…Àf…¹f…²f…«f…¤f…f…–f…f…ˆf…f…zf…sf…lf…ef…^f…Wf…Pf…If…Bf…;f…4f…-f…&f…f…f…f… f…f…üe…õe…îe…çe…àe…Ùe…Òe…Ëe…Äe…½e…¶e…¯e…¨e…¡e…še…“e…Œe……e…~e…we…pe…ie…be…[e…Te…Me…Fe…?e…8e…1e…*e…#e…e…e…e…e…e…ùd…òd…ëd…äd…Ýd…Öd…Ïd…Èd…Ád…ºd…³d…¬d…¥d…žd…—d…d…‰d…‚d…{d…td…md…fd…_d…Xd…Qd…Jd…Cd…`…7`…0`…)`…"`…`…`… `…`…ÿ_…ø_…ñ_…ê_…ã_…Ü_…Õ_…Î_…Ç_…À_…¹_…²_…«_…¤_…_…–_…_…ˆ_…_…z_…s_…l_…e_…^_…W_…P_…I_…B_…;_…4_…-_…&_…_…_…_… _…_…ü^…õ^…î^…ç^…à^…Ù^…Ò^…Ë^…Ä^…½^…¶^…¯^…¨^…¡^…š^…“^…Œ^……^…~^…w^…p^…i^…b^…[^…T^…M^…F^…?^…8^…1^…*^…#^…^…^…^…^…^…ù]…ò]…ë]…ä]…Ý]…Ö]…Ï]…È]…Á]…º]…³]…¬]…¥]…ž]…—]…]…‰]…‚]…{]…t]…m]…f]…_]…X]…Q]…J]…C]…<]…5]….]…']… ]…]…]… ]…]…ý\…ö\…ï\…è\…á\…Ú\…Ó\…Ì\…Å\…¾\…·\…°\…©\…¢\…›\…”\…\…†\…\…x\…q\…j\…c\…\\…U\…N\…G\…@\…9\…2\…+\…$\…\…\…\…\…\…ú[…ó[…ì[…å[…Þ[…×[…Ð[…É[…Â[…»[…´[…­[…¦[…Ÿ[…˜[…‘[…Š[…ƒ[…|[…u[…n[…g[…`[…Y[…R[…K[…D[…=[…6[…/[…([…![…[…[… […[…þZ…÷Z…ðZ…éZ…âZ…ÛZ…ÔZ…ÍZ…ÆZ…¿Z…¸Z…±Z…ªZ…£Z…œZ…•Z…ŽZ…‡Z…€Z…yZ…rZ…kZ…dZ…]Z…VZ…OZ…HZ…AZ…:Z…3Z…,Z…%Z…Z…Z…Z… Z…Z…ûY…ôY…íY…æY…ßY…ØY…ÑY…ÊY…ÃY…¼Y…µY…®Y…§Y… Y…™Y…’Y…‹Y…„Y…}Y…vY…oY…hY…aY…ZY…SY…LY…EY…>Y…7Y…0Y…)Y…"Y…Y…Y… Y…Y…ÿX…øX…ñX…êX…ãX…ÜX…ÕX…ÎX…ÇX…ÀX…¹X…²X…«X…¤X…X…–X…X…ˆX…X…zX…sX…lX…eX…^X…WX…PX…IX…BX…;X…4X…-X…&X…X…X…X… X…X…üW…õW…îW…çW…àW…ÙW…ÒW…ËW…ÄW…½W…¶W…¯W…¨W…¡W…šW…“W…ŒW……W…~W…wW…pW…iW…bW…[W…TW…MW…FW…?W…8W…1W…*W…#W…W…W…W…W…W…ùV…òV…ëV…äV…ÝV…ÖV…ÏV…ÈV…ÁV…ºV…³V…¬V…¥V…žV…—V…V…‰V…‚V…{V…tV…mV…fV…_V…XV…QV…JV…CV…R…7R…0R…)R…"R…R…R… R…R…ÿQ…øQ…ñQ…êQ…ãQ…ÜQ…ÕQ…ÎQ…ÇQ…ÀQ…¹Q…²Q…«Q…¤Q…Q…–Q…Q…ˆQ…Q…zQ…sQ…lQ…eQ…^Q…WQ…PQ…IQ…BQ…;Q…4Q…-Q…&Q…Q…Q…Q… Q…Q…üP…õP…îP…çP…àP…ÙP…ÒP…ËP…ÄP…½P…¶P…¯P…¨P…¡P…šP…“P…ŒP……P…~P…wP…pP…iP…bP…[P…TP…MP…FP…?P…8P…1P…*P…#P…P…P…P…P…P…ùO…òO…ëO…äO…ÝO…ÖO…ÏO…ÈO…ÁO…ºO…³O…¬O…¥O…žO…—O…O…‰O…‚O…{O…tO…mO…fO…_O…XO…QO…JO…CO…K…7K…0K…)K…"K…K…K… K…K…ÿJ…øJ…ñJ…êJ…ãJ…ÜJ…ÕJ…ÎJ…ÇJ…ÀJ…¹J…²J…«J…¤J…J…–J…J…ˆJ…J…zJ…sJ…lJ…eJ…^J…WJ…PJ…IJ…BJ…;J…4J…-J…&J…J…J…J… J…J…üI…õI…îI…çI…àI…ÙI…ÒI…ËI…ÄI…½I…¶I…¯I…¨I…¡I…šI…“I…ŒI……I…~I…wI…pI…iI…bI…[I…TI…MI…FI…?I…8I…1I…*I…#I…I…I…I…I…I…ùH…òH…ëH…äH…ÝH…ÖH…ÏH…ÈH…ÁH…ºH…³H…¬H…¥H…žH…—H…H…‰H…‚H…{H…tH…mH…fH…_H…XH…QH…JH…CH…D…7D…0D…)D…"D…D…D… D…D…ÿC…øC…ñC…êC…ãC…ÜC…ÕC…ÎC…ÇC…ÀC…¹C…²C…«C…¤C…C…–C…C…ˆC…C…zC…sC…lC…eC…^C…WC…PC…IC…BC…;C…4C…-C…&C…C…C…C… C…C…üB…õB…îB…çB…àB…ÙB…ÒB…ËB…ÄB…½B…¶B…¯B…¨B…¡B…šB…“B…ŒB……B…~B…wB…pB…iB…bB…[B…TB…MB…FB…?B…8B…1B…*B…#B…B…B…B…B…B…ùA…òA…ëA…äA…ÝA…ÖA…ÏA…ÈA…ÁA…ºA…³A…¬A…¥A…žA…—A…A…‰A…‚A…{A…tA…mA…fA…_A…XA…QA…JA…CA……÷>…ð>…é>…â>…Û>…Ô>…Í>…Æ>…¿>…¸>…±>…ª>…£>…œ>…•>…Ž>…‡>…€>…y>…r>…k>…d>…]>…V>…O>…H>…A>…:>…3>…,>…%>…>…>…>… >…>…û=…ô=…í=…æ=…ß=…Ø=…Ñ=…Ê=…Ã=…¼=…µ=…®=…§=… =…™=…’=…‹=…„=…}=…v=…o=…h=…a=…Z=…S=…L=…E=…>=…7=…0=…)=…"=…=…=… =…=…ÿ<…ø<…ñ<…ê<…ã<…Ü<…Õ<…Î<…Ç<…À<…¹<…²<…«<…¤<…<…–<…<…ˆ<…<…z<…s<…l<…e<…^<…W<…P<…I<…B<…;<…4<…-<…&<…<…<…<… <…<…ü;…õ;…î;…ç;…à;…Ù;…Ò;…Ë;…Ä;…½;…¶;…¯;…¨;…¡;…š;…“;…Œ;……;…~;…w;…p;…i;…b;…[;…T;…M;…F;…?;…8;…1;…*;…#;…;…;…;…;…;…ù:…ò:…ë:…ä:…Ý:…Ö:…Ï:…È:…Á:…º:…³:…¬:…¥:…ž:…—:…:…‰:…‚:…{:…t:…m:…f:…_:…X:…Q:…J:…C:…<:…5:….:…':… :…:…:… :…:…ý9…ö9…ï9…è9…á9…Ú9…Ó9…Ì9…Å9…¾9…·9…°9…©9…¢9…›9…”9…9…†9…9…x9…q9…j9…c9…\9…U9…N9…G9…@9…99…29…+9…$9…9…9…9…9…9…ú8…ó8…ì8…å8…Þ8…×8…Ð8…É8…Â8…»8…´8…­8…¦8…Ÿ8…˜8…‘8…Š8…ƒ8…|8…u8…n8…g8…`8…Y8…R8…K8…D8…=8…68…/8…(8…!8…8…8… 8…8…þ7…÷7…ð7…é7…â7…Û7…Ô7…Í7…Æ7…¿7…¸7…±7…ª7…£7…œ7…•7…Ž7…‡7…€7…y7…r7…k7…d7…]7…V7…O7…H7…A7…:7…37…,7…%7…7…7…7… 7…7…û6…ô6…í6…æ6…ß6…Ø6…Ñ6…Ê6…Ã6…¼6…µ6…®6…§6… 6…™6…’6…‹6…„6…}6…v6…o6…h6…a6…Z6…S6…L6…E6…>6…76…06…)6…"6…6…6… 6…6…ÿ5…ø5…ñ5…ê5…ã5…Ü5…Õ5…Î5…Ç5…À5…¹5…²5…«5…¤5…5…–5…5…ˆ5…5…z5…s5…l5…e5…^5…W5…P5…I5…B5…;5…45…-5…&5…5…5…5… 5…5…ü4…õ4…î4…ç4…à4…Ù4…Ò4…Ë4…Ä4…½4…¶4…¯4…¨4…¡4…š4…“4…Œ4……4…~4…w4…p4…i4…b4…[4…T4…M4…F4…?4…84…14…*4…#4…4…4…4…4…4…ù3…ò3…ë3…ä3…Ý3…Ö3…Ï3…È3…Á3…º3…³3…¬3…¥3…ž3…—3…3…‰3…‚3…{3…t3…m3…f3…_3…X3…Q3…J3…C3…<3…53….3…'3… 3…3…3… 3…3…ý2…ö2…ï2…è2…á2…Ú2…Ó2…Ì2…Å2…¾2…·2…°2…©2…¢2…›2…”2…2…†2…2…x2…q2…j2…c2…\2…U2…N2…G2…@2…92…22…+2…$2…2…2…2…2…2…ú1…ó1…ì1…å1…Þ1…×1…Ð1…É1…Â1…»1…´1…­1…¦1…Ÿ1…˜1…‘1…Š1…ƒ1…|1…u1…n1…g1…`1…Y1…R1…K1…D1…=1…61…/1…(1…!1…1…1… 1…1…þ0…÷0…ð0…é0…â0…Û0…Ô0…Í0…Æ0…¿0…¸0…±0…ª0…£0…œ0…•0…Ž0…‡0…€0…y0…r0…k0…d0…]0…V0…O0…H0…A0…:0…30…,0…%0…0…0…0… 0…0…û/…ô/…í/…æ/…ß/…Ø/…Ñ/…Ê/…Ã/…¼/…µ/…®/…§/… /…™/…’/…‹/…„/…}/…v/…o/…h/…a/…Z/…S/…L/…E/…>/…7/…0/…)/…"/…/…/… /…/…ÿ.…ø.…ñ.…ê.…ã.…Ü.…Õ.…Î.…Ç.…À.…¹.…².…«.…¤.….…–.….…ˆ.….…z.…s.…l.…e.…^.…W.…P.…I.…B.…;.…4.…-.…&.….….….… .….…ü-…õ-…î-…ç-…à-…Ù-…Ò-…Ë-…Ä-…½-…¶-…¯-…¨-…¡-…š-…“-…Œ-……-…~-…w-…p-…i-…b-…[-…T-…M-…F-…?-…8-…1-…*-…#-…-…-…-…-…-…ù,…ò,…ë,…ä,…Ý,…Ö,…Ï,…È,…Á,…º,…³,…¬,…¥,…ž,…—,…,…‰,…‚,…{,…t,…m,…f,…_,…X,…Q,…J,…C,…<,…5,….,…',… ,…,…,… ,…,…ý+…ö+…ï+…è+…á+…Ú+…Ó+…Ì+…Å+…¾+…·+…°+…©+…¢+…›+…”+…+…†+…+…x+…q+…j+…c+…\+…U+…N+…G+…@+…9+…2+…++…$+…+…+…+…+…+…ú*…ó*…ì*…å*…Þ*…×*…Ð*…É*…Â*…»*…´*…­*…¦*…Ÿ*…˜*…‘*…Š*…ƒ*…|*…u*…n*…g*…`*…Y*…R*…K*…D*…=*…6*…/*…(*…!*…*…*… *…*…þ)…÷)…ð)…é)…â)…Û)…Ô)…Í)…Æ)…¿)…¸)…±)…ª)…£)…œ)…•)…Ž)…‡)…€)…y)…r)…k)…d)…])…V)…O)…H)…A)…:)…3)…,)…%)…)…)…)… )…)…û(…ô(…í(…æ(…ß(…Ø(…Ñ(…Ê(…Ã(…¼(…µ(…®(…§(… (…™(…’(…‹(…„(…}(…v(…o(…h(…a(…Z(…S(…L(…E(…>(…7(…0(…)(…"(…(…(… (…(…ÿ'…ø'…ñ'…ê'…ã'…Ü'…Õ'…Î'…Ç'…À'…¹'…²'…«'…¤'…'…–'…'…ˆ'…'…z'…s'…l'…e'…^'…W'…P'…I'…B'…;'…4'…-'…&'…'…'…'… '…'…ü&…õ&…î&…ç&…à&…Ù&…Ò&…Ë&…Ä&…½&…¶&…¯&…¨&…¡&…š&…“&…Œ&……&…~&…w&…p&…i&…b&…[&…T&…M&…F&…?&…8&…1&…*&…#&…&…&…&…&…&…ù%…ò%…ë%…ä%…Ý%…Ö%…Ï%…È%…Á%…º%…³%…¬%…¥%…ž%…—%…%…‰%…‚%…{%…t%…m%…f%…_%…X%…Q%…J%…C%…<%…5%….%…'%… %…%…%… %…%…ý$…ö$…ï$…è$…á$…Ú$…Ó$…Ì$…Å$…¾$…·$…°$…©$…¢$…›$…”$…$…†$…$…x$…q$…j$…c$…\$…U$…N$…G$…@$…9$…2$…+$…$$…$…$…$…$…$…ú#…ó#…ì#…å#…Þ#…×#…Ð#…É#…Â#…»#…´#…­#…¦#…Ÿ#…˜#…‘#…Š#…ƒ#…|#…u#…n#…g#…`#…Y#…R#…K#…D#…=#…6#…/#…(#…!#…#…#… #…#…þ"…÷"…ð"…é"…â"…Û"…Ô"…Í"…Æ"…¿"…¸"…±"…ª"…£"…œ"…•"…Ž"…‡"…€"…y"…r"…k"…d"…]"…V"…O"…H"…A"…:"…3"…,"…%"…"…"…"… "…"…û!…ô!…í!…æ!…ß!…Ø!…Ñ!…Ê!…Ã!…¼!…µ!…®!…§!… !…™!…’!…‹!…„!…}!…v!…o!…h!…a!…Z!…S!…L!…E!…>!…7!…0!…)!…"!…!…!… !…!…ÿ …ø …ñ …ê …ã …Ü …Õ …Î …Ç …À …¹ …² …« …¤ … …– … …ˆ … …z …s …l …e …^ …W …P …I …B …; …4 …- …& … … … … … …ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ …÷ …ð …é …â …Û …Ô …Í …Æ …¿ …¸ …± …ª …£ …œ …• …Ž …‡ …€ …y …r …k …d …] …V …O …H …A …: …3 …, …% … … … … … …û …ô …í …æ …ß …Ø …Ñ …Ê …à …¼ …µ …® …§ …  …™ …’ …‹ …„ …} …v …o …h …a …Z …S …L …E …> …7 …0 …) …" … … … … …ÿ …ø …ñ …ê …ã …Ü …Õ …Î …Ç …À …¹ …² …« …¤ … …– … …ˆ … …z …s …l …e …^ …W …P …I …B …; …4 …- …& … … … … … …ü …õ …î …ç …à …Ù …Ò …Ë …Ä …½ …¶ …¯ …¨ …¡ …š …“ …Œ …… …~ …w …p …i …b …[ …T …M …F …? …8 …1 …* …# … … … … … …ù …ò …ë …ä …Ý …Ö …Ï …È …Á …º …³ …¬ …¥ …ž …— … …‰ …‚ …{ …t …m …f …_ …X …Q …J …C …< …5 …. …' … … … … … …ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þÿ„÷ÿ„ðÿ„éÿ„âÿ„Ûÿ„Ôÿ„Íÿ„Æÿ„¿ÿ„¸ÿ„±ÿ„ªÿ„£ÿ„œÿ„•ÿ„Žÿ„‡ÿ„€ÿ„yÿ„rÿ„kÿ„dÿ„]ÿ„Vÿ„Oÿ„Hÿ„Aÿ„:ÿ„3ÿ„,ÿ„%ÿ„ÿ„ÿ„ÿ„ ÿ„ÿ„ûþ„ôþ„íþ„æþ„ßþ„Øþ„Ñþ„Êþ„Ãþ„¼þ„µþ„®þ„§þ„ þ„™þ„’þ„‹þ„„þ„}þ„vþ„oþ„hþ„aþ„Zþ„Sþ„Lþ„Eþ„>þ„7þ„0þ„)þ„"þ„þ„þ„ þ„þ„ÿý„øý„ñý„êý„ãý„Üý„Õý„Îý„Çý„Àý„¹ý„²ý„«ý„¤ý„ý„–ý„ý„ˆý„ý„zý„sý„lý„eý„^ý„Wý„Pý„Iý„Bý„;ý„4ý„-ý„&ý„ý„ý„ý„ ý„ý„üü„õü„îü„çü„àü„Ùü„Òü„Ëü„Äü„½ü„¶ü„¯ü„¨ü„¡ü„šü„“ü„Œü„…ü„~ü„wü„pü„iü„bü„[ü„Tü„Mü„Fü„?ü„8ü„1ü„*ü„#ü„ü„ü„ü„ü„ü„ùû„òû„ëû„äû„Ýû„Öû„Ïû„Èû„Áû„ºû„³û„¬û„¥û„žû„—û„û„‰û„‚û„{û„tû„mû„fû„_û„Xû„Qû„Jû„Cû„<û„5û„.û„'û„ û„û„û„ û„û„ýú„öú„ïú„èú„áú„Úú„Óú„Ìú„Åú„¾ú„·ú„°ú„©ú„¢ú„›ú„”ú„ú„†ú„ú„xú„qú„jú„cú„\ú„Uú„Nú„Gú„@ú„9ú„2ú„+ú„$ú„ú„ú„ú„ú„ú„úù„óù„ìù„åù„Þù„×ù„Ðù„Éù„Âù„»ù„´ù„­ù„¦ù„Ÿù„˜ù„‘ù„Šù„ƒù„|ù„uù„nù„gù„`ù„Yù„Rù„Kù„Dù„=ù„6ù„/ù„(ù„!ù„ù„ù„ ù„ù„þø„÷ø„ðø„éø„âø„Ûø„Ôø„Íø„Æø„¿ø„¸ø„±ø„ªø„£ø„œø„•ø„Žø„‡ø„€ø„yø„rø„kø„dø„]ø„Vø„Oø„Hø„Aø„:ø„3ø„,ø„%ø„ø„ø„ø„ ø„ø„û÷„ô÷„í÷„æ÷„ß÷„Ø÷„Ñ÷„Ê÷„Ã÷„¼÷„µ÷„®÷„§÷„ ÷„™÷„’÷„‹÷„„÷„}÷„v÷„o÷„h÷„a÷„Z÷„S÷„L÷„E÷„>÷„7÷„0÷„)÷„"÷„÷„÷„ ÷„÷„ÿö„øö„ñö„êö„ãö„Üö„Õö„Îö„Çö„Àö„¹ö„²ö„«ö„¤ö„ö„–ö„ö„ˆö„ö„zö„sö„lö„eö„^ö„Wö„Pö„Iö„Bö„;ö„4ö„-ö„&ö„ö„ö„ö„ ö„ö„üõ„õõ„îõ„çõ„àõ„Ùõ„Òõ„Ëõ„Äõ„½õ„¶õ„¯õ„¨õ„¡õ„šõ„“õ„Œõ„…õ„~õ„wõ„põ„iõ„bõ„[õ„Tõ„Mõ„Fõ„?õ„8õ„1õ„*õ„#õ„õ„õ„õ„õ„õ„ùô„òô„ëô„äô„Ýô„Öô„Ïô„Èô„Áô„ºô„³ô„¬ô„¥ô„žô„—ô„ô„‰ô„‚ô„{ô„tô„mô„fô„_ô„Xô„Qô„Jô„Cô„<ô„5ô„.ô„'ô„ ô„ô„ô„ ô„ô„ýó„öó„ïó„èó„áó„Úó„Óó„Ìó„Åó„¾ó„·ó„°ó„©ó„¢ó„›ó„”ó„ó„†ó„ó„xó„qó„jó„có„\ó„Uó„Nó„Gó„@ó„9ó„2ó„+ó„$ó„ó„ó„ó„ó„ó„úò„óò„ìò„åò„Þò„×ò„Ðò„Éò„Âò„»ò„´ò„­ò„¦ò„Ÿò„˜ò„‘ò„Šò„ƒò„|ò„uò„nò„gò„`ò„Yò„Rò„Kò„Dò„=ò„6ò„/ò„(ò„!ò„ò„ò„ ò„ò„þñ„÷ñ„ðñ„éñ„âñ„Ûñ„Ôñ„Íñ„Æñ„¿ñ„¸ñ„±ñ„ªñ„£ñ„œñ„•ñ„Žñ„‡ñ„€ñ„yñ„rñ„kñ„dñ„]ñ„Vñ„Oñ„Hñ„Añ„:ñ„3ñ„,ñ„%ñ„ñ„ñ„ñ„ ñ„ñ„ûð„ôð„íð„æð„ßð„Øð„Ñð„Êð„Ãð„¼ð„µð„®ð„§ð„ ð„™ð„’ð„‹ð„„ð„}ð„vð„oð„hð„að„Zð„Sð„Lð„Eð„>ð„7ð„0ð„)ð„"ð„ð„ð„ ð„ð„ÿï„øï„ñï„êï„ãï„Üï„Õï„Îï„Çï„Àï„ï„–ï„ï„ï„zï„sï„lï„eï„^ï„Wï„Pï„Iï„Bï„;ï„4ï„-ï„&ï„ï„ï„ï„ ï„ï„üî„õî„îî„çî„àî„Ùî„Òî„Ëî„Äî„~î„wî„pî„iî„bî„[î„Tî„Mî„Fî„?î„8î„1î„*î„#î„î„î„î„î„î„ùí„òí„ëí„äí„Ýí„Öí„Ïí„Èí„Á턺턳턬턥턞턗í„턉턂í„{í„tí„mí„fí„_í„Xí„Qí„Jí„Cí„<í„5í„.í„'í„ í„í„í„ í„í„ýì„öì„ïì„èì„áì„Úì„Óì„Ìì„Å섾섷섰섩섢섛섔ì„섆ì„ì„xì„qì„jì„cì„\ì„Uì„Nì„Gì„@ì„9ì„2ì„+ì„$ì„ì„ì„ì„ì„ì„úë„óë„ìë„åë„Þë„×ë„Ðë„Éë„Â넻넴넭넦넟넘넑넊넃ë„|ë„uë„në„gë„`ë„Yë„Rë„Kë„Dë„=ë„6ë„/ë„(ë„!ë„ë„ë„ ë„ë„þê„÷ê„ðê„éê„âê„Ûê„Ôê„Íê„Æê„¿ê„¸ê„±ê„ªê„£ê„œê„•ê„Žê„‡ê„€ê„yê„rê„kê„dê„]ê„Vê„Oê„Hê„Aê„:ê„3ê„,ê„%ê„ê„ê„ê„ ê„ê„ûé„ôé„í鄿é„ß鄨é„Ñé„Êé„Ã鄼鄵鄮鄧鄠鄙鄒鄋鄄é„}é„vé„oé„hé„aé„Zé„Sé„Lé„Eé„>é„7é„0é„)é„"é„é„é„ é„é„ÿè„øè„ñè„êè„ãè„Üè„Õè„Îè„Çè„À脹脲脫脤è„è„–è„脈è„è„zè„sè„lè„eè„^è„Wè„Pè„Iè„Bè„;è„4è„-è„&è„è„è„è„ è„è„üç„õç„îç„çç„àç„Ùç„Òç„Ëç„Ä焽然焯焨無焚焓焌焅ç„~ç„wç„pç„iç„bç„[ç„Tç„Mç„Fç„?ç„8ç„1ç„*ç„#ç„ç„ç„ç„ç„ç„ùæ„òæ„ëæ„äæ„Ýæ„Öæ„Ïæ„Èæ„Áæ„ºæ„³æ„¬æ„¥æ„žæ„—æ„æ„‰æ„‚æ„{æ„tæ„mæ„fæ„_æ„Xæ„Qæ„Jæ„Cæ„<æ„5æ„.æ„'æ„ æ„æ„æ„ æ„æ„ýå„öå„ïå„èå„áå„Úå„Óå„Ìå„Å儾儷儰儩儢儛儔å„儆å„å„xå„qå„jå„cå„\å„Uå„Nå„Gå„@å„9å„2å„+å„$å„å„å„å„å„å„úä„óä„ìä„åä„Þä„×ä„Ðä„Éä„Â䄻䄴䄭䄦䄟䄘䄑䄊䄃ä„|ä„uä„nä„gä„`ä„Yä„Rä„Kä„Dä„=ä„6ä„/ä„(ä„!ä„ä„ä„ ä„ä„þã„÷ã„ðã„éã„âã„Ûã„Ôã„Íã„Æã„¿ã„¸ã„±ã„ªã„£ã„œã„•ã„Žã„‡ã„€ã„yã„rã„kã„dã„]ã„Vã„Oã„Hã„Aã„:ã„3ã„,ã„%ã„ã„ã„ã„ ã„ã„ûâ„ôâ„íâ„æâ„ßâ„Øâ„Ñâ„Êâ„Ãℼℵ℮℧℠ℙℒℋ℄â„}â„vâ„oâ„hâ„aâ„Zâ„Sâ„Lâ„Eâ„>â„7â„0â„)â„"â„â„â„ â„â„ÿá„øá„ñá„êá„ãá„Üá„Õá„Îá„Çá„Àᄹᄲᄫᄤá„á„–á„ᄈá„á„zá„sá„lá„eá„^á„Wá„Pá„Iá„Bá„;á„4á„-á„&á„á„á„á„ á„á„üà„õà„îà„çà„àà„Ùà„Òà„Ëà„Äà„½à„¶à„¯à„¨à„¡à„šà„“à„Œà„…à„~à„wà„pà„ià„bà„[à„Tà„Mà„Fà„?à„8à„1à„*à„#à„à„à„à„à„à„ùß„òß„ëß„äß„Ýß„Öß„Ïß„Èß„Áß„ºß„³ß„¬ß„¥ß„žß„—߄߄‰ß„‚ß„{ß„tß„mß„fß„_ß„Xß„Qß„Jß„Cß„<ß„5ß„.ß„'ß„ ߄߄߄ ߄߄ýÞ„öÞ„ïÞ„èÞ„áÞ„ÚÞ„ÓÞ„ÌÞ„ÅÞ„¾Þ„·Þ„°Þ„©Þ„¢Þ„›Þ„”Þ„Þ„†Þ„Þ„xÞ„qÞ„jÞ„cÞ„\Þ„UÞ„NÞ„GÞ„@Þ„9Þ„2Þ„+Þ„$Þ„Þ„Þ„Þ„Þ„Þ„úÝ„óÝ„ìÝ„åÝ„ÞÝ„×Ý„ÐÝ„ÉÝ„ÂÝ„»Ý„´Ý„­Ý„¦Ý„ŸÝ„˜Ý„‘Ý„ŠÝ„ƒÝ„|Ý„uÝ„nÝ„gÝ„`Ý„YÝ„RÝ„KÝ„DÝ„=Ý„6Ý„/Ý„(Ý„!݄݄݄ ݄݄þÜ„÷Ü„ðÜ„éÜ„âÜ„ÛÜ„ÔÜ„ÍÜ„ÆÜ„¿Ü„¸Ü„±Ü„ªÜ„£Ü„œÜ„•Ü„ŽÜ„‡Ü„€Ü„yÜ„rÜ„kÜ„dÜ„]Ü„VÜ„OÜ„HÜ„AÜ„:Ü„3Ü„,Ü„%܄܄܄܄ ܄܄ûÛ„ôÛ„íÛ„æÛ„ßÛ„ØÛ„ÑÛ„ÊÛ„ÃÛ„¼Û„µÛ„®Û„§Û„ Û„™Û„’Û„‹Û„„Û„}Û„vÛ„oÛ„hÛ„aÛ„ZÛ„SÛ„LÛ„EÛ„>Û„7Û„0Û„)Û„"Û„Û„Û„ Û„Û„ÿÚ„øÚ„ñÚ„êÚ„ãÚ„ÜÚ„ÕÚ„ÎÚ„ÇÚ„ÀÚ„¹Ú„²Ú„«Ú„¤Ú„Ú„–Ú„Ú„ˆÚ„Ú„zÚ„sÚ„lÚ„eÚ„^Ú„WÚ„PÚ„IÚ„BÚ„;Ú„4Ú„-Ú„&Ú„Ú„Ú„Ú„ Ú„Ú„üÙ„õÙ„îÙ„çÙ„àÙ„ÙÙ„ÒÙ„ËÙ„ÄÙ„½Ù„¶Ù„¯Ù„¨Ù„¡Ù„šÙ„“Ù„ŒÙ„…Ù„~Ù„wÙ„pÙ„iÙ„bÙ„[Ù„TÙ„MÙ„FÙ„?Ù„8Ù„1Ù„*Ù„#للللللùØ„òØ„ëØ„䨄ÝØ„ÖØ„ÏØ„ÈØ„ÁØ„ºØ„³Ø„¬Ø„¥Ø„žØ„—؄؄‰Ø„‚Ø„{Ø„tØ„mØ„fØ„_Ø„XØ„QØ„JØ„CØ„<Ø„5Ø„.Ø„'Ø„ ؄؄؄ ؄؄ýׄöׄïׄèׄáׄÚׄÓׄÌׄÅׄ¾×„·×„°×„©×„¢×„›×„”ׄׄ†×„ׄxׄqׄjׄcׄ\ׄUׄNׄGׄ@ׄ9ׄ2ׄ+ׄ$ׄׄׄׄׄׄúÖ„óÖ„ìÖ„åÖ„ÞÖ„×Ö„ÐÖ„ÉÖ„ÂÖ„»Ö„´Ö„­Ö„¦Ö„ŸÖ„˜Ö„‘Ö„ŠÖ„ƒÖ„|Ö„uÖ„nÖ„gÖ„`Ö„YÖ„RÖ„KÖ„DÖ„=Ö„6Ö„/Ö„(Ö„!Ö„Ö„Ö„ Ö„Ö„þÕ„÷Õ„ðÕ„éÕ„âÕ„ÛÕ„ÔÕ„ÍÕ„ÆÕ„¿Õ„¸Õ„±Õ„ªÕ„£Õ„œÕ„•Õ„ŽÕ„‡Õ„€Õ„yÕ„rÕ„kÕ„dÕ„]Õ„VÕ„OÕ„HÕ„AÕ„:Õ„3Õ„,Õ„%Õ„Õ„Õ„Õ„ Õ„Õ„ûÔ„ôÔ„íÔ„æÔ„ßÔ„ØÔ„ÑÔ„ÊÔ„ÃÔ„¼Ô„µÔ„®Ô„§Ô„ Ô„™Ô„’Ô„‹Ô„„Ô„}Ô„vÔ„oÔ„hÔ„aÔ„ZÔ„SÔ„LÔ„EÔ„>Ô„7Ô„0Ô„)Ô„"Ô„Ô„Ô„ Ô„Ô„ÿÓ„øÓ„ñÓ„êÓ„ãÓ„ÜÓ„ÕÓ„ÎÓ„ÇÓ„ÀÓ„¹Ó„²Ó„«Ó„¤Ó„Ó„–Ó„Ó„ˆÓ„Ó„zÓ„sÓ„lÓ„eÓ„^Ó„WÓ„PÓ„IÓ„BÓ„;Ó„4Ó„-Ó„&Ó„Ó„Ó„Ó„ Ó„Ó„üÒ„õÒ„îÒ„çÒ„àÒ„ÙÒ„ÒÒ„ËÒ„ÄÒ„½Ò„¶Ò„¯Ò„¨Ò„¡Ò„šÒ„“Ò„ŒÒ„…Ò„~Ò„wÒ„pÒ„iÒ„bÒ„[Ò„TÒ„MÒ„FÒ„?Ò„8Ò„1Ò„*Ò„#Ò„Ò„Ò„Ò„Ò„Ò„ùÑ„òÑ„ëÑ„äÑ„ÝÑ„ÖÑ„ÏÑ„ÈÑ„ÁÑ„ºÑ„³Ñ„¬Ñ„¥Ñ„žÑ„—фф‰Ñ„‚Ñ„{Ñ„tÑ„mÑ„fÑ„_Ñ„XÑ„QÑ„JÑ„CÑ„<Ñ„5Ñ„.Ñ„'Ñ„ ффф ффýЄöЄïЄèЄáЄÚЄÓЄÌЄÅЄ¾Ð„·Ð„°Ð„©Ð„¢Ð„›Ð„”ЄЄ†Ð„ЄxЄqЄjЄcЄ\ЄUЄNЄGЄ@Є9Є2Є+Є$ЄЄЄЄЄЄúÏ„óÏ„ìÏ„åÏ„ÞÏ„×Ï„ÐÏ„ÉÏ„ÂÏ„»Ï„´Ï„­Ï„¦Ï„ŸÏ„˜Ï„‘Ï„ŠÏ„ƒÏ„|Ï„uÏ„nÏ„gÏ„`Ï„YÏ„RÏ„KÏ„DÏ„=Ï„6Ï„/Ï„(Ï„!τττ ττþ΄÷΄ð΄é΄â΄Û΄Ô΄Í΄ÆÎ„¿Î„¸Î„±Î„ªÎ„£Î„œÎ„•΄ŽÎ„‡Î„€Î„y΄r΄k΄d΄]΄V΄O΄H΄A΄:΄3΄,΄%΄΄΄΄ ΄΄ûÍ„ôÍ„íÍ„æÍ„ßÍ„ØÍ„ÑÍ„ÊÍ„ÃÍ„¼Í„µÍ„®Í„§Í„ Í„™Í„’Í„‹Í„„Í„}Í„vÍ„oÍ„hÍ„aÍ„ZÍ„SÍ„LÍ„EÍ„>Í„7Í„0Í„)Í„"̈́̈́̈́ ̈́̈́ÿÌ„øÌ„ñÌ„êÌ„ãÌ„ÜÌ„ÕÌ„ÎÌ„ÇÌ„ÀÌ„¹Ì„²Ì„«Ì„¤Ì„Ì„–̄̄ˆÌ„Ì„zÌ„sÌ„lÌ„eÌ„^Ì„WÌ„PÌ„IÌ„BÌ„;Ì„4Ì„-Ì„&̄̄̄̄ ̄̄üË„õË„îË„çË„àË„ÙË„ÒË„ËË„ÄË„½Ë„¶Ë„¯Ë„¨Ë„¡Ë„šË„“Ë„ŒË„…Ë„~Ë„wË„pË„iË„bË„[Ë„TË„MË„FË„?Ë„8Ë„1Ë„*Ë„#˄˄˄˄˄˄ùÊ„òÊ„ëÊ„äÊ„ÝÊ„ÖÊ„ÏÊ„ÈÊ„ÁÊ„ºÊ„³Ê„¬Ê„¥Ê„žÊ„—ʄʄ‰Ê„‚Ê„{Ê„tÊ„mÊ„fÊ„_Ê„XÊ„QÊ„JÊ„CÊ„<Ê„5Ê„.Ê„'Ê„ ʄʄʄ ʄʄýÉ„öÉ„ïÉ„èÉ„áÉ„ÚÉ„ÓÉ„ÌÉ„ÅÉ„¾É„·É„°É„©É„¢É„›É„”ɄɄ†É„É„xÉ„qÉ„jÉ„cÉ„\É„UÉ„NÉ„GÉ„@É„9É„2É„+É„$ɄɄɄɄɄɄúÈ„óÈ„ìÈ„åÈ„ÞÈ„×È„ÐÈ„ÉÈ„ÂÈ„»È„´È„­È„¦È„ŸÈ„˜È„‘È„ŠÈ„ƒÈ„|È„uÈ„nÈ„gÈ„`È„YÈ„RÈ„KÈ„DÈ„=È„6È„/È„(È„!ȄȄȄ ȄȄþÇ„÷Ç„ðÇ„éÇ„âÇ„ÛÇ„ÔÇ„ÍÇ„ÆÇ„¿Ç„¸Ç„±Ç„ªÇ„£Ç„œÇ„•Ç„ŽÇ„‡Ç„€Ç„yÇ„rÇ„kÇ„dÇ„]Ç„VÇ„OÇ„HÇ„AÇ„:Ç„3Ç„,Ç„%DŽDŽDŽDŽ DŽDŽûÆ„ôÆ„íÆ„æÆ„߯„ØÆ„ÑÆ„ÊÆ„ÃÆ„¼Æ„µÆ„®Æ„§Æ„ Æ„™Æ„’Æ„‹Æ„„Æ„}Æ„vÆ„oÆ„hÆ„aÆ„ZÆ„SÆ„LÆ„EÆ„>Æ„7Æ„0Æ„)Æ„"ƄƄƄ ƄƄÿÅ„øÅ„ñÅ„êÅ„ãÅ„ÜÅ„ÕÅ„ÎÅ„ÇÅ„ÀÅ„¹Å„²Å„«Å„¤Å„Å„–ńńˆÅ„Å„zÅ„sÅ„lÅ„eÅ„^Å„WÅ„PÅ„IÅ„BÅ„;Å„4Å„-Å„&ńńńń ńńüÄ„õÄ„îÄ„çÄ„àÄ„ÙÄ„ÒÄ„ËÄ„ÄÄ„½Ä„¶Ä„¯Ä„¨Ä„¡Ä„šÄ„“Ä„ŒÄ„…Ä„~Ä„wÄ„pÄ„iÄ„bÄ„[Ä„TÄ„MÄ„FÄ„?Ä„8Ä„1Ä„*Ä„#ĄĄĄĄĄĄùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞÄ—ÄĉÄ‚Ä{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄý„ö„ï„è„á„ڄӄ̄ń¾Â„·Â„°Â„©Â„¢Â„›Â„”„„†Â„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„úÁ„óÁ„ìÁ„åÁ„ÞÁ„×Á„ÐÁ„ÉÁ„ÂÁ„»Á„´Á„­Á„¦Á„ŸÁ„˜Á„‘Á„ŠÁ„ƒÁ„|Á„uÁ„nÁ„gÁ„`Á„YÁ„RÁ„KÁ„DÁ„=Á„6Á„/Á„(Á„!Á„Á„Á„ Á„Á„þÀ„÷À„ðÀ„éÀ„âÀ„ÛÀ„ÔÀ„ÍÀ„ÆÀ„¿À„¸À„±À„ªÀ„£À„œÀ„•À„ŽÀ„‡À„€À„yÀ„rÀ„kÀ„dÀ„]À„VÀ„OÀ„HÀ„AÀ„:À„3À„,À„%À„À„À„À„ À„À„û¿„ô¿„í¿„æ¿„ß¿„Ø¿„Ñ¿„Ê¿„ÿ„¼¿„µ¿„®¿„§¿„ ¿„™¿„’¿„‹¿„„¿„}¿„v¿„o¿„h¿„a¿„Z¿„S¿„L¿„E¿„>¿„7¿„0¿„)¿„"¿„¿„¿„ ¿„¿„ÿ¾„ø¾„ñ¾„꾄㾄ܾ„Õ¾„ξ„Ǿ„À¾„¹¾„²¾„«¾„¤¾„¾„–¾„¾„ˆ¾„¾„z¾„s¾„l¾„e¾„^¾„W¾„P¾„I¾„B¾„;¾„4¾„-¾„&¾„¾„¾„¾„ ¾„¾„ü½„õ½„罄ངÙ½„Ò½„˽„Ľ„½½„¶½„¯½„¨½„¡½„𽄓½„Œ½„…½„~½„w½„p½„i½„b½„[½„T½„M½„F½„?½„8½„1½„*½„#½„½„½„½„½„½„ù¼„ò¼„뼄伄ݼ„Ö¼„ϼ„ȼ„Á¼„º¼„³¼„¬¼„¥¼„ž¼„—¼„¼„‰¼„‚¼„{¼„t¼„m¼„f¼„_¼„X¼„Q¼„J¼„C¼„<¼„5¼„.¼„'¼„ ¼„¼„¼„ ¼„¼„ý»„ö»„ﻄ軄ỄÚ»„Ó»„Ì»„Å»„¾»„·»„°»„©»„¢»„›»„”»„»„†»„»„x»„q»„j»„c»„\»„U»„N»„G»„@»„9»„2»„+»„$»„»„»„»„»„»„úº„óº„캄庄Þº„׺„к„ɺ„º„»º„´º„­º„¦º„Ÿº„˜º„‘º„Šº„ƒº„|º„uº„nº„gº„`º„Yº„Rº„Kº„Dº„=º„6º„/º„(º„!º„º„º„ º„º„þ¹„÷¹„ð¹„鹄⹄Û¹„Ô¹„͹„ƹ„¿¹„¸¹„±¹„ª¹„£¹„œ¹„•¹„޹„‡¹„€¹„y¹„r¹„k¹„d¹„]¹„V¹„O¹„H¹„A¹„:¹„3¹„,¹„%¹„¹„¹„¹„ ¹„¹„û¸„ô¸„í¸„渄߸„ظ„Ѹ„ʸ„ø„¼¸„µ¸„®¸„§¸„ ¸„™¸„’¸„‹¸„„¸„}¸„v¸„o¸„h¸„a¸„Z¸„S¸„L¸„E¸„>¸„7¸„0¸„)¸„"¸„¸„¸„ ¸„¸„ÿ·„ø·„ñ·„ê·„ã·„Ü·„Õ·„η„Ç·„À·„¹·„²·„«·„¤·„·„–·„·„ˆ·„·„z·„s·„l·„e·„^·„W·„P·„I·„B·„;·„4·„-·„&·„·„·„·„ ·„·„ü¶„õ¶„î¶„ç¶„à¶„Ù¶„Ò¶„˶„Ķ„½¶„¶¶„¯¶„¨¶„¡¶„š¶„“¶„Œ¶„…¶„~¶„w¶„p¶„i¶„b¶„[¶„T¶„M¶„F¶„?¶„8¶„1¶„*¶„#¶„¶„¶„¶„¶„¶„ùµ„òµ„뵄䵄ݵ„Öµ„ϵ„ȵ„Áµ„ºµ„³µ„¬µ„¥µ„žµ„—µ„µ„‰µ„‚µ„{µ„tµ„mµ„fµ„_µ„Xµ„Qµ„Jµ„Cµ„<µ„5µ„.µ„'µ„ µ„µ„µ„ µ„µ„ý´„ö´„ï´„è´„á´„Ú´„Ó´„Ì´„Å´„¾´„·´„°´„©´„¢´„›´„”´„´„†´„´„x´„q´„j´„c´„\´„U´„N´„G´„@´„9´„2´„+´„$´„´„´„´„´„´„ú³„ó³„쳄峄Þ³„׳„г„ɳ„³„»³„´³„­³„¦³„Ÿ³„˜³„‘³„г„ƒ³„|³„u³„n³„g³„`³„Y³„R³„K³„D³„=³„6³„/³„(³„!³„³„³„ ³„³„þ²„÷²„ð²„鲄ⲄÛ²„Ô²„Ͳ„Ʋ„¿²„¸²„±²„ª²„£²„œ²„•²„޲„‡²„€²„y²„r²„k²„d²„]²„V²„O²„H²„A²„:²„3²„,²„%²„²„²„²„ ²„²„û±„ô±„í±„汄ß±„ر„ѱ„ʱ„ñ„¼±„µ±„®±„§±„ ±„™±„’±„‹±„„±„}±„v±„o±„h±„a±„Z±„S±„L±„E±„>±„7±„0±„)±„"±„±„±„ ±„±„ÿ°„ø°„ñ°„ê°„ã°„ܰ„Õ°„ΰ„ǰ„À°„¹°„²°„«°„¤°„°„–°„°„ˆ°„°„z°„s°„l°„e°„^°„W°„P°„I°„B°„;°„4°„-°„&°„°„°„°„ °„°„ü¯„õ¯„範௄Ù¯„Ò¯„˯„ᄽ¯„¶¯„¯¯„¨¯„¡¯„𝄓¯„Œ¯„…¯„~¯„w¯„p¯„i¯„b¯„[¯„T¯„M¯„F¯„?¯„8¯„1¯„*¯„#¯„¯„¯„¯„¯„¯„ù®„ò®„뮄䮄Ý®„Ö®„Ï®„È®„Á®„º®„³®„¬®„¥®„ž®„—®„®„‰®„‚®„{®„t®„m®„f®„_®„X®„Q®„J®„C®„<®„5®„.®„'®„ ®„®„®„ ®„®„ý­„ö­„ï­„è­„á­„Ú­„Ó­„Ì­„Å­„¾­„·­„°­„©­„¢­„›­„”­„­„†­„­„x­„q­„j­„c­„\­„U­„N­„G­„@­„9­„2­„+­„$­„­„­„­„­„­„ú¬„ó¬„쬄嬄Þ¬„׬„Ь„ɬ„¬„»¬„´¬„­¬„¦¬„Ÿ¬„˜¬„‘¬„Ь„ƒ¬„|¬„u¬„n¬„g¬„`¬„Y¬„R¬„K¬„D¬„=¬„6¬„/¬„(¬„!¬„¬„¬„ ¬„¬„þ«„÷«„ð«„é«„â«„Û«„Ô«„Í«„Æ«„¿«„¸«„±«„ª«„£«„œ«„•«„Ž«„‡«„€«„y«„r«„k«„d«„]«„V«„O«„H«„A«„:«„3«„,«„%«„«„«„«„ «„«„ûª„ôª„íª„檄ߪ„ت„Ѫ„ʪ„ꄼª„µª„®ª„§ª„ ª„™ª„’ª„‹ª„„ª„}ª„vª„oª„hª„aª„Zª„Sª„Lª„Eª„>ª„7ª„0ª„)ª„"ª„ª„ª„ ª„ª„ÿ©„ø©„ñ©„ê©„ã©„Ü©„Õ©„Ω„Ç©„À©„¹©„²©„«©„¤©„©„–©„©„ˆ©„©„z©„s©„l©„e©„^©„W©„P©„I©„B©„;©„4©„-©„&©„©„©„©„ ©„©„ü¨„õ¨„稄਄Ù¨„Ò¨„˨„Ĩ„½¨„¶¨„¯¨„¨¨„¡¨„š¨„“¨„Œ¨„…¨„~¨„w¨„p¨„i¨„b¨„[¨„T¨„M¨„F¨„?¨„8¨„1¨„*¨„#¨„¨„¨„¨„¨„¨„ù§„ò§„ë§„ä§„ݧ„Ö§„ϧ„ȧ„Á§„º§„³§„¬§„¥§„ž§„—§„§„‰§„‚§„{§„t§„m§„f§„_§„X§„Q§„J§„C§„<§„5§„.§„'§„ §„§„§„ §„§„ý¦„ö¦„濾覄ᦄÚ¦„Ó¦„̦„Ŧ„¾¦„·¦„°¦„©¦„¢¦„›¦„”¦„¦„†¦„¦„x¦„q¦„j¦„c¦„\¦„U¦„N¦„G¦„@¦„9¦„2¦„+¦„$¦„¦„¦„¦„¦„¦„ú¥„ó¥„쥄奄Þ¥„×¥„Ð¥„É¥„Â¥„»¥„´¥„­¥„¦¥„Ÿ¥„˜¥„‘¥„Š¥„ƒ¥„|¥„u¥„n¥„g¥„`¥„Y¥„R¥„K¥„D¥„=¥„6¥„/¥„(¥„!¥„¥„¥„ ¥„¥„þ¤„÷¤„ð¤„餄⤄Û¤„Ô¤„ͤ„Ƥ„¿¤„¸¤„±¤„ª¤„£¤„œ¤„•¤„ޤ„‡¤„€¤„y¤„r¤„k¤„d¤„]¤„V¤„O¤„H¤„A¤„:¤„3¤„,¤„%¤„¤„¤„¤„ ¤„¤„û£„ô£„í£„棄ߣ„Ø£„Ñ£„Ê£„ㄼ£„µ£„®£„§£„ £„™£„’£„‹£„„£„}£„v£„o£„h£„a£„Z£„S£„L£„E£„>£„7£„0£„)£„"£„£„£„ £„£„ÿ¢„ø¢„ñ¢„ꢄ㢄Ü¢„Õ¢„΢„Ç¢„À¢„¹¢„²¢„«¢„¤¢„¢„–¢„¢„ˆ¢„¢„z¢„s¢„l¢„e¢„^¢„W¢„P¢„I¢„B¢„;¢„4¢„-¢„&¢„¢„¢„¢„ ¢„¢„ü¡„õ¡„î¡„ç¡„à¡„Ù¡„Ò¡„Ë¡„Ä¡„½¡„¶¡„¯¡„¨¡„¡¡„š¡„“¡„Œ¡„…¡„~¡„w¡„p¡„i¡„b¡„[¡„T¡„M¡„F¡„?¡„8¡„1¡„*¡„#¡„¡„¡„¡„¡„¡„ù „ò „ë „ä „Ý „Ö „Ï „È „Á „º „³ „¬ „¥ „ž „— „ „‰ „‚ „{ „t „m „f „_ „X „Q „J „C „< „5 „. „' „  „ „ „  „ „ýŸ„öŸ„蟄ោÚŸ„ÓŸ„ÌŸ„ÅŸ„¾Ÿ„·Ÿ„°Ÿ„©Ÿ„¢Ÿ„›Ÿ„”Ÿ„Ÿ„†Ÿ„Ÿ„xŸ„qŸ„jŸ„cŸ„\Ÿ„UŸ„NŸ„GŸ„@Ÿ„9Ÿ„2Ÿ„+Ÿ„$Ÿ„Ÿ„Ÿ„Ÿ„Ÿ„Ÿ„úž„óž„임垄ޞ„מ„О„Éž„ž„»ž„´ž„­ž„¦ž„Ÿž„˜ž„‘ž„Šž„ƒž„|ž„už„nž„gž„`ž„Yž„Rž„Kž„Dž„=ž„6ž„/ž„(ž„!ž„ž„ž„ ž„ž„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûœ„ôœ„휄朄ßœ„Øœ„Ñœ„Êœ„Ü„¼œ„µœ„®œ„§œ„ œ„™œ„’œ„‹œ„„œ„}œ„vœ„oœ„hœ„aœ„Zœ„Sœ„Lœ„Eœ„>œ„7œ„0œ„)œ„"œ„œ„œ„ œ„œ„ÿ›„ø›„ñ›„ꛄ㛄Ü›„Õ›„Λ„Ç›„À›„¹›„²›„«›„¤›„›„–›„›„ˆ›„›„z›„s›„l›„e›„^›„W›„P›„I›„B›„;›„4›„-›„&›„›„›„›„ ›„›„üš„õš„îš„çš„àš„Ùš„Òš„Ëš„Äš„½š„¶š„¯š„¨š„¡š„šš„“š„Œš„…š„~š„wš„pš„iš„bš„[š„Tš„Mš„Fš„?š„8š„1š„*š„#š„š„š„š„š„š„ù™„ò™„뙄䙄Ý™„Ö™„Ï™„È™„Á™„º™„³™„¬™„¥™„ž™„—™„™„‰™„‚™„{™„t™„m™„f™„_™„X™„Q™„J™„C™„<™„5™„.™„'™„ ™„™„™„ ™„™„ý˜„ö˜„蘄ᘄÚ˜„Ó˜„̘„Ř„¾˜„·˜„°˜„©˜„¢˜„›˜„”˜„˜„†˜„˜„x˜„q˜„j˜„c˜„\˜„U˜„N˜„G˜„@˜„9˜„2˜„+˜„$˜„˜„˜„˜„˜„˜„ú—„ó—„ì—„å—„Þ—„×—„З„É—„—„»—„´—„­—„¦—„Ÿ—„˜—„‘—„Š—„ƒ—„|—„u—„n—„g—„`—„Y—„R—„K—„D—„=—„6—„/—„(—„!—„—„—„ —„—„þ–„÷–„ð–„é–„â–„Û–„Ô–„Í–„Æ–„¿–„¸–„±–„ª–„£–„œ–„•–„Ž–„‡–„€–„y–„r–„k–„d–„]–„V–„O–„H–„A–„:–„3–„,–„%–„–„–„–„ –„–„û•„ô•„í•„æ•„ß•„Ø•„Ñ•„Ê•„Õ„¼•„µ•„®•„§•„ •„™•„’•„‹•„„•„}•„v•„o•„h•„a•„Z•„S•„L•„E•„>•„7•„0•„)•„"•„•„•„ •„•„ÿ”„ø”„ñ”„ꔄ㔄Ü”„Õ”„Δ„Ç”„À”„¹”„²”„«”„¤”„”„–”„”„ˆ”„”„z”„s”„l”„e”„^”„W”„P”„I”„B”„;”„4”„-”„&”„”„”„”„ ”„”„ü“„õ“„î“„ç“„à“„Ù“„Ò“„Ë“„Ä“„½“„¶“„¯“„¨“„¡“„š“„““„Œ“„…“„~“„w“„p“„i“„b“„[“„T“„M“„F“„?“„8“„1“„*“„#“„“„“„“„“„“„ù’„ò’„ë’„ä’„Ý’„Ö’„Ï’„È’„Á’„º’„³’„¬’„¥’„ž’„—’„’„‰’„‚’„{’„t’„m’„f’„_’„X’„Q’„J’„C’„<’„5’„.’„'’„ ’„’„’„ ’„’„ý‘„ö‘„ï‘„è‘„á‘„Ú‘„Ó‘„Ì‘„Å‘„¾‘„·‘„°‘„©‘„¢‘„›‘„”‘„‘„†‘„‘„x‘„q‘„j‘„c‘„\‘„U‘„N‘„G‘„@‘„9‘„2‘„+‘„$‘„‘„‘„‘„‘„‘„ú„ó„ì„å„Þ„ׄЄÉ„„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûŽ„ôŽ„펄掄ߎ„ØŽ„ÑŽ„ÊŽ„ÃŽ„¼Ž„µŽ„®Ž„§Ž„ Ž„™Ž„’Ž„‹Ž„„Ž„}Ž„vŽ„oŽ„hŽ„aŽ„ZŽ„SŽ„LŽ„EŽ„>Ž„7Ž„0Ž„)Ž„"ބބބ ބބÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üŒ„õŒ„猄àŒ„ÙŒ„ÒŒ„ËŒ„ÄŒ„½Œ„¶Œ„¯Œ„¨Œ„¡Œ„šŒ„“Œ„ŒŒ„…Œ„~Œ„wŒ„pŒ„iŒ„bŒ„[Œ„TŒ„MŒ„FŒ„?Œ„8Œ„1Œ„*Œ„#Œ„Œ„Œ„Œ„Œ„Œ„ù‹„ò‹„ë‹„ä‹„Ý‹„Ö‹„Ï‹„È‹„Á‹„º‹„³‹„¬‹„¥‹„ž‹„—‹„‹„‰‹„‚‹„{‹„t‹„m‹„f‹„_‹„X‹„Q‹„J‹„C‹„<‹„5‹„.‹„'‹„ ‹„‹„‹„ ‹„‹„ýŠ„öŠ„芄ኄÚŠ„ÓŠ„ÌŠ„ÅŠ„¾Š„·Š„°Š„©Š„¢Š„›Š„”ЄЄ†Š„Š„xŠ„qŠ„jŠ„cŠ„\Š„UŠ„NŠ„GŠ„@Š„9Š„2Š„+Š„$ЄЄЄЄЄЄú‰„ó‰„쉄剄Þ‰„׉„Љ„ɉ„‰„»‰„´‰„­‰„¦‰„Ÿ‰„˜‰„‘‰„Љ„ƒ‰„|‰„u‰„n‰„g‰„`‰„Y‰„R‰„K‰„D‰„=‰„6‰„/‰„(‰„!‰„‰„‰„ ‰„‰„þˆ„÷ˆ„ðˆ„鈄∄Ûˆ„Ôˆ„͈„ƈ„¿ˆ„¸ˆ„±ˆ„ªˆ„£ˆ„œˆ„•ˆ„Žˆ„‡ˆ„€ˆ„yˆ„rˆ„kˆ„dˆ„]ˆ„Vˆ„Oˆ„Hˆ„Aˆ„:ˆ„3ˆ„,ˆ„%ˆ„ˆ„ˆ„ˆ„ ˆ„ˆ„û‡„ô‡„퇄懄߇„؇„ч„ʇ„Ç„¼‡„µ‡„®‡„§‡„ ‡„™‡„’‡„‹‡„„‡„}‡„v‡„o‡„h‡„a‡„Z‡„S‡„L‡„E‡„>‡„7‡„0‡„)‡„"‡„‡„‡„ ‡„‡„ÿ†„ø†„ñ†„ꆄㆄ܆„Õ†„Ά„dž„À†„¹†„²†„«†„¤†„†„–†„†„ˆ†„†„z†„s†„l†„e†„^†„W†„P†„I†„B†„;†„4†„-†„&†„†„†„†„ †„†„ü…„õ…„î…„ç…„à…„Ù…„Ò…„Ë…„Ä…„½…„¶…„¯…„¨…„¡…„š…„“…„Œ…„……„~…„w…„p…„i…„b…„[…„T…„M…„F…„?…„8…„1…„*…„#…„…„…„…„…„…„ù„„ò„„ë„„ä„„Ý„„Ö„„Ï„„È„„Á„„º„„³„„¬„„¥„„ž„„—„„„„‰„„‚„„{„„t„„m„„f„„_„„X„„Q„„J„„C„„<„„5„„.„„'„„ „„„„„„ „„„„ýƒ„öƒ„胄ჄÚƒ„Óƒ„̃„Ń„¾ƒ„·ƒ„°ƒ„©ƒ„¢ƒ„›ƒ„”ƒ„ƒ„†ƒ„ƒ„xƒ„qƒ„jƒ„cƒ„\ƒ„Uƒ„Nƒ„Gƒ„@ƒ„9ƒ„2ƒ„+ƒ„$ƒ„ƒ„ƒ„ƒ„ƒ„ƒ„ú‚„ó‚„ì‚„å‚„Þ‚„ׂ„Ђ„É‚„‚„»‚„´‚„­‚„¦‚„Ÿ‚„˜‚„‘‚„Š‚„ƒ‚„|‚„u‚„n‚„g‚„`‚„Y‚„R‚„K‚„D‚„=‚„6‚„/‚„(‚„!‚„‚„‚„ ‚„‚„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„û€„ô€„퀄怄߀„Ø€„Ñ€„Ê€„À„¼€„µ€„®€„§€„ €„™€„’€„‹€„„€„}€„v€„o€„h€„a€„Z€„S€„L€„E€„>€„7€„0€„)€„"€„€„€„ €„€„ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü~„õ~„î~„ç~„à~„Ù~„Ò~„Ë~„Ä~„½~„¶~„¯~„¨~„¡~„š~„“~„Œ~„…~„~~„w~„p~„i~„b~„[~„T~„M~„F~„?~„8~„1~„*~„#~„~„~„~„~„~„ù}„ò}„ë}„ä}„Ý}„Ö}„Ï}„È}„Á}„º}„³}„¬}„¥}„ž}„—}„}„‰}„‚}„{}„t}„m}„f}„_}„X}„Q}„J}„C}„<}„5}„.}„'}„ }„}„}„ }„}„ý|„ö|„ï|„è|„á|„Ú|„Ó|„Ì|„Å|„¾|„·|„°|„©|„¢|„›|„”|„|„†|„|„x|„q|„j|„c|„\|„U|„N|„G|„@|„9|„2|„+|„$|„|„|„|„|„|„ú{„ó{„ì{„å{„Þ{„×{„Ð{„É{„Â{„»{„´{„­{„¦{„Ÿ{„˜{„‘{„Š{„ƒ{„|{„u{„n{„g{„`{„Y{„R{„K{„D{„={„6{„/{„({„!{„{„{„ {„{„þz„÷z„ðz„éz„âz„Ûz„Ôz„Íz„Æz„¿z„¸z„±z„ªz„£z„œz„•z„Žz„‡z„€z„yz„rz„kz„dz„]z„Vz„Oz„Hz„Az„:z„3z„,z„%z„z„z„z„ z„z„ûy„ôy„íy„æy„ßy„Øy„Ñy„Êy„Ãy„¼y„µy„®y„§y„ y„™y„’y„‹y„„y„}y„vy„oy„hy„ay„Zy„Sy„Ly„Ey„>y„7y„0y„)y„"y„y„y„ y„y„ÿx„øx„ñx„êx„ãx„Üx„Õx„Îx„Çx„Àx„¹x„²x„«x„¤x„x„–x„x„ˆx„x„zx„sx„lx„ex„^x„Wx„Px„Ix„Bx„;x„4x„-x„&x„x„x„x„ x„x„üw„õw„îw„çw„àw„Ùw„Òw„Ëw„Äw„½w„¶w„¯w„¨w„¡w„šw„“w„Œw„…w„~w„ww„pw„iw„bw„[w„Tw„Mw„Fw„?w„8w„1w„*w„#w„w„w„w„w„w„ùv„òv„ëv„äv„Ýv„Öv„Ïv„Èv„Áv„ºv„³v„¬v„¥v„žv„—v„v„‰v„‚v„{v„tv„mv„fv„_v„Xv„Qv„Jv„Cv„r„7r„0r„)r„"r„r„r„ r„r„ÿq„øq„ñq„êq„ãq„Üq„Õq„Îq„Çq„Àq„¹q„²q„«q„¤q„q„–q„q„ˆq„q„zq„sq„lq„eq„^q„Wq„Pq„Iq„Bq„;q„4q„-q„&q„q„q„q„ q„q„üp„õp„îp„çp„àp„Ùp„Òp„Ëp„Äp„½p„¶p„¯p„¨p„¡p„šp„“p„Œp„…p„~p„wp„pp„ip„bp„[p„Tp„Mp„Fp„?p„8p„1p„*p„#p„p„p„p„p„p„ùo„òo„ëo„äo„Ýo„Öo„Ïo„Èo„Áo„ºo„³o„¬o„¥o„žo„—o„o„‰o„‚o„{o„to„mo„fo„_o„Xo„Qo„Jo„Co„k„7k„0k„)k„"k„k„k„ k„k„ÿj„øj„ñj„êj„ãj„Üj„Õj„Îj„Çj„Àj„¹j„²j„«j„¤j„j„–j„j„ˆj„j„zj„sj„lj„ej„^j„Wj„Pj„Ij„Bj„;j„4j„-j„&j„j„j„j„ j„j„üi„õi„îi„çi„ài„Ùi„Òi„Ëi„Äi„½i„¶i„¯i„¨i„¡i„ši„“i„Œi„…i„~i„wi„pi„ii„bi„[i„Ti„Mi„Fi„?i„8i„1i„*i„#i„i„i„i„i„i„ùh„òh„ëh„äh„Ýh„Öh„Ïh„Èh„Áh„ºh„³h„¬h„¥h„žh„—h„h„‰h„‚h„{h„th„mh„fh„_h„Xh„Qh„Jh„Ch„d„7d„0d„)d„"d„d„d„ d„d„ÿc„øc„ñc„êc„ãc„Üc„Õc„Îc„Çc„Àc„¹c„²c„«c„¤c„c„–c„c„ˆc„c„zc„sc„lc„ec„^c„Wc„Pc„Ic„Bc„;c„4c„-c„&c„c„c„c„ c„c„üb„õb„îb„çb„àb„Ùb„Òb„Ëb„Äb„½b„¶b„¯b„¨b„¡b„šb„“b„Œb„…b„~b„wb„pb„ib„bb„[b„Tb„Mb„Fb„?b„8b„1b„*b„#b„b„b„b„b„b„ùa„òa„ëa„äa„Ýa„Öa„Ïa„Èa„Áa„ºa„³a„¬a„¥a„ža„—a„a„‰a„‚a„{a„ta„ma„fa„_a„Xa„Qa„Ja„Ca„]„7]„0]„)]„"]„]„]„ ]„]„ÿ\„ø\„ñ\„ê\„ã\„Ü\„Õ\„Î\„Ç\„À\„¹\„²\„«\„¤\„\„–\„\„ˆ\„\„z\„s\„l\„e\„^\„W\„P\„I\„B\„;\„4\„-\„&\„\„\„\„ \„\„ü[„õ[„î[„ç[„à[„Ù[„Ò[„Ë[„Ä[„½[„¶[„¯[„¨[„¡[„š[„“[„Œ[„…[„~[„w[„p[„i[„b[„[[„T[„M[„F[„?[„8[„1[„*[„#[„[„[„[„[„[„ùZ„òZ„ëZ„äZ„ÝZ„ÖZ„ÏZ„ÈZ„ÁZ„ºZ„³Z„¬Z„¥Z„žZ„—Z„Z„‰Z„‚Z„{Z„tZ„mZ„fZ„_Z„XZ„QZ„JZ„CZ„V„7V„0V„)V„"V„V„V„ V„V„ÿU„øU„ñU„êU„ãU„ÜU„ÕU„ÎU„ÇU„ÀU„¹U„²U„«U„¤U„U„–U„U„ˆU„U„zU„sU„lU„eU„^U„WU„PU„IU„BU„;U„4U„-U„&U„U„U„U„ U„U„üT„õT„îT„çT„àT„ÙT„ÒT„ËT„ÄT„½T„¶T„¯T„¨T„¡T„šT„“T„ŒT„…T„~T„wT„pT„iT„bT„[T„TT„MT„FT„?T„8T„1T„*T„#T„T„T„T„T„T„ùS„òS„ëS„äS„ÝS„ÖS„ÏS„ÈS„ÁS„ºS„³S„¬S„¥S„žS„—S„S„‰S„‚S„{S„tS„mS„fS„_S„XS„QS„JS„CS„O„7O„0O„)O„"O„O„O„ O„O„ÿN„øN„ñN„êN„ãN„ÜN„ÕN„ÎN„ÇN„ÀN„¹N„²N„«N„¤N„N„–N„N„ˆN„N„zN„sN„lN„eN„^N„WN„PN„IN„BN„;N„4N„-N„&N„N„N„N„ N„N„üM„õM„îM„çM„àM„ÙM„ÒM„ËM„ÄM„½M„¶M„¯M„¨M„¡M„šM„“M„ŒM„…M„~M„wM„pM„iM„bM„[M„TM„MM„FM„?M„8M„1M„*M„#M„M„M„M„M„M„ùL„òL„ëL„äL„ÝL„ÖL„ÏL„ÈL„ÁL„ºL„³L„¬L„¥L„žL„—L„L„‰L„‚L„{L„tL„mL„fL„_L„XL„QL„JL„CL„H„7H„0H„)H„"H„H„H„ H„H„ÿG„øG„ñG„êG„ãG„ÜG„ÕG„ÎG„ÇG„ÀG„¹G„²G„«G„¤G„G„–G„G„ˆG„G„zG„sG„lG„eG„^G„WG„PG„IG„BG„;G„4G„-G„&G„G„G„G„ G„G„üF„õF„îF„çF„àF„ÙF„ÒF„ËF„ÄF„½F„¶F„¯F„¨F„¡F„šF„“F„ŒF„…F„~F„wF„pF„iF„bF„[F„TF„MF„FF„?F„8F„1F„*F„#F„F„F„F„F„F„ùE„òE„ëE„äE„ÝE„ÖE„ÏE„ÈE„ÁE„ºE„³E„¬E„¥E„žE„—E„E„‰E„‚E„{E„tE„mE„fE„_E„XE„QE„JE„CE„A„7A„0A„)A„"A„A„A„ A„A„ÿ@„ø@„ñ@„ê@„ã@„Ü@„Õ@„Î@„Ç@„À@„¹@„²@„«@„¤@„@„–@„@„ˆ@„@„z@„s@„l@„e@„^@„W@„P@„I@„B@„;@„4@„-@„&@„@„@„@„ @„@„ü?„õ?„î?„ç?„à?„Ù?„Ò?„Ë?„Ä?„½?„¶?„¯?„¨?„¡?„š?„“?„Œ?„…?„~?„w?„p?„i?„b?„[?„T?„M?„F?„??„8?„1?„*?„#?„?„?„?„?„?„ù>„ò>„ë>„ä>„Ý>„Ö>„Ï>„È>„Á>„º>„³>„¬>„¥>„ž>„—>„>„‰>„‚>„{>„t>„m>„f>„_>„X>„Q>„J>„C>„<>„5>„.>„'>„ >„>„>„ >„>„ý=„ö=„ï=„è=„á=„Ú=„Ó=„Ì=„Å=„¾=„·=„°=„©=„¢=„›=„”=„=„†=„=„x=„q=„j=„c=„\=„U=„N=„G=„@=„9=„2=„+=„$=„=„=„=„=„=„ú<„ó<„ì<„å<„Þ<„×<„Ð<„É<„Â<„»<„´<„­<„¦<„Ÿ<„˜<„‘<„Š<„ƒ<„|<„u<„n<„g<„`<„Y<„R<„K<„D<„=<„6<„/<„(<„!<„<„<„ <„<„þ;„÷;„ð;„é;„â;„Û;„Ô;„Í;„Æ;„¿;„¸;„±;„ª;„£;„œ;„•;„Ž;„‡;„€;„y;„r;„k;„d;„];„V;„O;„H;„A;„:;„3;„,;„%;„;„;„;„ ;„;„û:„ô:„í:„æ:„ß:„Ø:„Ñ:„Ê:„Ã:„¼:„µ:„®:„§:„ :„™:„’:„‹:„„:„}:„v:„o:„h:„a:„Z:„S:„L:„E:„>:„7:„0:„):„":„:„:„ :„:„ÿ9„ø9„ñ9„ê9„ã9„Ü9„Õ9„Î9„Ç9„À9„¹9„²9„«9„¤9„9„–9„9„ˆ9„9„z9„s9„l9„e9„^9„W9„P9„I9„B9„;9„49„-9„&9„9„9„9„ 9„9„ü8„õ8„î8„ç8„à8„Ù8„Ò8„Ë8„Ä8„½8„¶8„¯8„¨8„¡8„š8„“8„Œ8„…8„~8„w8„p8„i8„b8„[8„T8„M8„F8„?8„88„18„*8„#8„8„8„8„8„8„ù7„ò7„ë7„ä7„Ý7„Ö7„Ï7„È7„Á7„º7„³7„¬7„¥7„ž7„—7„7„‰7„‚7„{7„t7„m7„f7„_7„X7„Q7„J7„C7„<7„57„.7„'7„ 7„7„7„ 7„7„ý6„ö6„ï6„è6„á6„Ú6„Ó6„Ì6„Å6„¾6„·6„°6„©6„¢6„›6„”6„6„†6„6„x6„q6„j6„c6„\6„U6„N6„G6„@6„96„26„+6„$6„6„6„6„6„6„ú5„ó5„ì5„å5„Þ5„×5„Ð5„É5„Â5„»5„´5„­5„¦5„Ÿ5„˜5„‘5„Š5„ƒ5„|5„u5„n5„g5„`5„Y5„R5„K5„D5„=5„65„/5„(5„!5„5„5„ 5„5„þ4„÷4„ð4„é4„â4„Û4„Ô4„Í4„Æ4„¿4„¸4„±4„ª4„£4„œ4„•4„Ž4„‡4„€4„y4„r4„k4„d4„]4„V4„O4„H4„A4„:4„34„,4„%4„4„4„4„ 4„4„û3„ô3„í3„æ3„ß3„Ø3„Ñ3„Ê3„Ã3„¼3„µ3„®3„§3„ 3„™3„’3„‹3„„3„}3„v3„o3„h3„a3„Z3„S3„L3„E3„>3„73„03„)3„"3„3„3„ 3„3„ÿ2„ø2„ñ2„ê2„ã2„Ü2„Õ2„Î2„Ç2„À2„¹2„²2„«2„¤2„2„–2„2„ˆ2„2„z2„s2„l2„e2„^2„W2„P2„I2„B2„;2„42„-2„&2„2„2„2„ 2„2„ü1„õ1„î1„ç1„à1„Ù1„Ò1„Ë1„Ä1„½1„¶1„¯1„¨1„¡1„š1„“1„Œ1„…1„~1„w1„p1„i1„b1„[1„T1„M1„F1„?1„81„11„*1„#1„1„1„1„1„1„ù0„ò0„ë0„ä0„Ý0„Ö0„Ï0„È0„Á0„º0„³0„¬0„¥0„ž0„—0„0„‰0„‚0„{0„t0„m0„f0„_0„X0„Q0„J0„C0„<0„50„.0„'0„ 0„0„0„ 0„0„ý/„ö/„ï/„è/„á/„Ú/„Ó/„Ì/„Å/„¾/„·/„°/„©/„¢/„›/„”/„/„†/„/„x/„q/„j/„c/„\/„U/„N/„G/„@/„9/„2/„+/„$/„/„/„/„/„/„ú.„ó.„ì.„å.„Þ.„×.„Ð.„É.„Â.„».„´.„­.„¦.„Ÿ.„˜.„‘.„Š.„ƒ.„|.„u.„n.„g.„`.„Y.„R.„K.„D.„=.„6.„/.„(.„!.„.„.„ .„.„þ-„÷-„ð-„é-„â-„Û-„Ô-„Í-„Æ-„¿-„¸-„±-„ª-„£-„œ-„•-„Ž-„‡-„€-„y-„r-„k-„d-„]-„V-„O-„H-„A-„:-„3-„,-„%-„-„-„-„ -„-„û,„ô,„í,„æ,„ß,„Ø,„Ñ,„Ê,„Ã,„¼,„µ,„®,„§,„ ,„™,„’,„‹,„„,„},„v,„o,„h,„a,„Z,„S,„L,„E,„>,„7,„0,„),„",„,„,„ ,„,„ÿ+„ø+„ñ+„ê+„ã+„Ü+„Õ+„Î+„Ç+„À+„¹+„²+„«+„¤+„+„–+„+„ˆ+„+„z+„s+„l+„e+„^+„W+„P+„I+„B+„;+„4+„-+„&+„+„+„+„ +„+„ü*„õ*„î*„ç*„à*„Ù*„Ò*„Ë*„Ä*„½*„¶*„¯*„¨*„¡*„š*„“*„Œ*„…*„~*„w*„p*„i*„b*„[*„T*„M*„F*„?*„8*„1*„**„#*„*„*„*„*„*„ù)„ò)„ë)„ä)„Ý)„Ö)„Ï)„È)„Á)„º)„³)„¬)„¥)„ž)„—)„)„‰)„‚)„{)„t)„m)„f)„_)„X)„Q)„J)„C)„<)„5)„.)„')„ )„)„)„ )„)„ý(„ö(„ï(„è(„á(„Ú(„Ó(„Ì(„Å(„¾(„·(„°(„©(„¢(„›(„”(„(„†(„(„x(„q(„j(„c(„\(„U(„N(„G(„@(„9(„2(„+(„$(„(„(„(„(„(„ú'„ó'„ì'„å'„Þ'„×'„Ð'„É'„Â'„»'„´'„­'„¦'„Ÿ'„˜'„‘'„Š'„ƒ'„|'„u'„n'„g'„`'„Y'„R'„K'„D'„='„6'„/'„('„!'„'„'„ '„'„þ&„÷&„ð&„é&„â&„Û&„Ô&„Í&„Æ&„¿&„¸&„±&„ª&„£&„œ&„•&„Ž&„‡&„€&„y&„r&„k&„d&„]&„V&„O&„H&„A&„:&„3&„,&„%&„&„&„&„ &„&„û%„ô%„í%„æ%„ß%„Ø%„Ñ%„Ê%„Ã%„¼%„µ%„®%„§%„ %„™%„’%„‹%„„%„}%„v%„o%„h%„a%„Z%„S%„L%„E%„>%„7%„0%„)%„"%„%„%„ %„%„ÿ$„ø$„ñ$„ê$„ã$„Ü$„Õ$„Î$„Ç$„À$„¹$„²$„«$„¤$„$„–$„$„ˆ$„$„z$„s$„l$„e$„^$„W$„P$„I$„B$„;$„4$„-$„&$„$„$„$„ $„$„ü#„õ#„î#„ç#„à#„Ù#„Ò#„Ë#„Ä#„½#„¶#„¯#„¨#„¡#„š#„“#„Œ#„…#„~#„w#„p#„i#„b#„[#„T#„M#„F#„?#„8#„1#„*#„##„#„#„#„#„#„ù"„ò"„ë"„ä"„Ý"„Ö"„Ï"„È"„Á"„º"„³"„¬"„¥"„ž"„—"„"„‰"„‚"„{"„t"„m"„f"„_"„X"„Q"„J"„C"„<"„5"„."„'"„ "„"„"„ "„"„ý!„ö!„ï!„è!„á!„Ú!„Ó!„Ì!„Å!„¾!„·!„°!„©!„¢!„›!„”!„!„†!„!„x!„q!„j!„c!„\!„U!„N!„G!„@!„9!„2!„+!„$!„!„!„!„!„!„ú „ó „ì „å „Þ „× „Ð „É „ „» „´ „­ „¦ „Ÿ „˜ „‘ „Š „ƒ „| „u „n „g „` „Y „R „K „D „= „6 „/ „( „! „ „ „ „ „þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„ú„ó„ì„å„ބׄЄɄ„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„ú„ó„ì„å„ބׄЄɄ„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ù „ò „ë „ä „Ý „Ö „Ï „È „Á „º „³ „¬ „¥ „ž „— „ „‰ „‚ „{ „t „m „f „_ „X „Q „J „C „< „5 „. „' „ „ „ „ „ „ý „ö „ï „è „á „Ú „Ó „Ì „Å „¾ „· „° „© „¢ „› „” „ „† „ „x „q „j „c „\ „U „N „G „@ „9 „2 „+ „$ „ „ „ „ „ „ú „ó „ì „å „Þ „× „Ð „É „ „» „´ „­ „¦ „Ÿ „˜ „‘ „Š „ƒ „| „u „n „g „` „Y „R „K „D „= „6 „/ „( „! „ „ „ „ „þ „÷ „ð „é „â „Û „Ô „Í „Æ „¿ „¸ „± „ª „£ „œ „• „Ž „‡ „€ „y „r „k „d „] „V „O „H „A „: „3 „, „% „ „ „ „ „ „û „ô „í „æ „ß „Ø „Ñ „Ê „à „¼ „µ „® „§ „  „™ „’ „‹ „„ „} „v „o „h „a „Z „S „L „E „> „7 „0 „) „" „ „ „ „ „ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„ú„ó„ì„å„ބׄЄɄ„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿ„ø„ñ„ê„ã„܄Մ΄DŽÀ„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùÿƒòÿƒëÿƒäÿƒÝÿƒÖÿƒÏÿƒÈÿƒÁÿƒºÿƒ³ÿƒ¬ÿƒ¥ÿƒžÿƒ—ÿƒÿƒ‰ÿƒ‚ÿƒ{ÿƒtÿƒmÿƒfÿƒ_ÿƒXÿƒQÿƒJÿƒCÿƒ<ÿƒ5ÿƒ.ÿƒ'ÿƒ ÿƒÿƒÿƒ ÿƒÿƒýþƒöþƒïþƒèþƒáþƒÚþƒÓþƒÌþƒÅþƒ¾þƒ·þƒ°þƒ©þƒ¢þƒ›þƒ”þƒþƒ†þƒþƒxþƒqþƒjþƒcþƒ\þƒUþƒNþƒGþƒ@þƒ9þƒ2þƒ+þƒ$þƒþƒþƒþƒþƒþƒúýƒóýƒìýƒåýƒÞýƒ×ýƒÐýƒÉýƒÂýƒ»ýƒ´ýƒ­ýƒ¦ýƒŸýƒ˜ýƒ‘ýƒŠýƒƒýƒ|ýƒuýƒnýƒgýƒ`ýƒYýƒRýƒKýƒDýƒ=ýƒ6ýƒ/ýƒ(ýƒ!ýƒýƒýƒ ýƒýƒþüƒ÷üƒðüƒéüƒâüƒÛüƒÔüƒÍüƒÆüƒ¿üƒ¸üƒ±üƒªüƒ£üƒœüƒ•üƒŽüƒ‡üƒ€üƒyüƒrüƒküƒdüƒ]üƒVüƒOüƒHüƒAüƒ:üƒ3üƒ,üƒ%üƒüƒüƒüƒ üƒüƒûûƒôûƒíûƒæûƒßûƒØûƒÑûƒÊûƒÃûƒ¼ûƒµûƒ®ûƒ§ûƒ ûƒ™ûƒ’ûƒ‹ûƒ„ûƒ}ûƒvûƒoûƒhûƒaûƒZûƒSûƒLûƒEûƒ>ûƒ7ûƒ0ûƒ)ûƒ"ûƒûƒûƒ ûƒûƒÿúƒøúƒñúƒêúƒãúƒÜúƒÕúƒÎúƒÇúƒÀúƒ¹úƒ²úƒ«úƒ¤úƒúƒ–úƒúƒˆúƒúƒzúƒsúƒlúƒeúƒ^úƒWúƒPúƒIúƒBúƒ;úƒ4úƒ-úƒ&úƒúƒúƒúƒ úƒúƒüùƒõùƒîùƒçùƒàùƒÙùƒÒùƒËùƒÄùƒ½ùƒ¶ùƒ¯ùƒ¨ùƒ¡ùƒšùƒ“ùƒŒùƒ…ùƒ~ùƒwùƒpùƒiùƒbùƒ[ùƒTùƒMùƒFùƒ?ùƒ8ùƒ1ùƒ*ùƒ#ùƒùƒùƒùƒùƒùƒùøƒòøƒëøƒäøƒÝøƒÖøƒÏøƒÈøƒÁøƒºøƒ³øƒ¬øƒ¥øƒžøƒ—øƒøƒ‰øƒ‚øƒ{øƒtøƒmøƒføƒ_øƒXøƒQøƒJøƒCøƒ<øƒ5øƒ.øƒ'øƒ øƒøƒøƒ øƒøƒý÷ƒö÷ƒï÷ƒè÷ƒá÷ƒÚ÷ƒÓ÷ƒÌ÷ƒÅ÷ƒ¾÷ƒ·÷ƒ°÷ƒ©÷ƒ¢÷ƒ›÷ƒ”÷ƒ÷ƒ†÷ƒ÷ƒx÷ƒq÷ƒj÷ƒc÷ƒ\÷ƒU÷ƒN÷ƒG÷ƒ@÷ƒ9÷ƒ2÷ƒ+÷ƒ$÷ƒ÷ƒ÷ƒ÷ƒ÷ƒ÷ƒúöƒóöƒìöƒåöƒÞöƒ×öƒÐöƒÉöƒÂöƒ»öƒ´öƒ­öƒ¦öƒŸöƒ˜öƒ‘öƒŠöƒƒöƒ|öƒuöƒnöƒgöƒ`öƒYöƒRöƒKöƒDöƒ=öƒ6öƒ/öƒ(öƒ!öƒöƒöƒ öƒöƒþõƒ÷õƒðõƒéõƒâõƒÛõƒÔõƒÍõƒÆõƒ¿õƒ¸õƒ±õƒªõƒ£õƒœõƒ•õƒŽõƒ‡õƒ€õƒyõƒrõƒkõƒdõƒ]õƒVõƒOõƒHõƒAõƒ:õƒ3õƒ,õƒ%õƒõƒõƒõƒ õƒõƒûôƒôôƒíôƒæôƒßôƒØôƒÑôƒÊôƒÃôƒ¼ôƒµôƒ®ôƒ§ôƒ ôƒ™ôƒ’ôƒ‹ôƒ„ôƒ}ôƒvôƒoôƒhôƒaôƒZôƒSôƒLôƒEôƒ>ôƒ7ôƒ0ôƒ)ôƒ"ôƒôƒôƒ ôƒôƒÿóƒøóƒñóƒêóƒãóƒÜóƒÕóƒÎóƒÇóƒÀóƒ¹óƒ²óƒ«óƒ¤óƒóƒ–óƒóƒˆóƒóƒzóƒsóƒlóƒeóƒ^óƒWóƒPóƒIóƒBóƒ;óƒ4óƒ-óƒ&óƒóƒóƒóƒ óƒóƒüòƒõòƒîòƒçòƒàòƒÙòƒÒòƒËòƒÄòƒ½òƒ¶òƒ¯òƒ¨òƒ¡òƒšòƒ“òƒŒòƒ…òƒ~òƒwòƒpòƒiòƒbòƒ[òƒTòƒMòƒFòƒ?òƒ8òƒ1òƒ*òƒ#òƒòƒòƒòƒòƒòƒùñƒòñƒëñƒäñƒÝñƒÖñƒÏñƒÈñƒÁñƒºñƒ³ñƒ¬ñƒ¥ñƒžñƒ—ñƒñƒ‰ñƒ‚ñƒ{ñƒtñƒmñƒfñƒ_ñƒXñƒQñƒJñƒCñƒ<ñƒ5ñƒ.ñƒ'ñƒ ñƒñƒñƒ ñƒñƒýðƒöðƒïðƒèðƒáðƒÚðƒÓðƒÌðƒÅðƒ¾ðƒ·ðƒ°ðƒ©ðƒ¢ðƒ›ðƒ”ðƒðƒ†ðƒðƒxðƒqðƒjðƒcðƒ\ðƒUðƒNðƒGðƒ@ðƒ9ðƒ2ðƒ+ðƒ$ðƒðƒðƒðƒðƒðƒúïƒóïƒìïƒåïƒÞïƒ×ïƒÐïƒÉïƒÂïƒ|ïƒuïƒnïƒgïƒ`ïƒYïƒRïƒKïƒDïƒ=ïƒ6ïƒ/ïƒ(ïƒ!ïƒïƒïƒ ïƒïƒþîƒ÷îƒðîƒéîƒâîƒÛîƒÔîƒÍîƒÆîƒ¿îƒ¸îƒ±îƒªîƒ£îƒœîƒ•îƒŽîƒ‡îƒ€îƒyîƒrîƒkîƒdîƒ]îƒVîƒOîƒHîƒAîƒ:îƒ3îƒ,îƒ%îƒîƒîƒîƒ îƒîƒûíƒôíƒííƒæíƒßíƒØíƒÑíƒÊíƒÃ탼탵탮탧탠탙탒탋탄íƒ}íƒvíƒoíƒhíƒaíƒZíƒSíƒLíƒEíƒ>íƒ7íƒ0íƒ)íƒ"íƒíƒíƒ íƒíƒÿìƒøìƒñìƒêìƒãìƒÜìƒÕìƒÎìƒÇìƒÀ샹샲샫샤ìƒìƒ–ìƒìƒˆìƒìƒzìƒsìƒlìƒeìƒ^ìƒWìƒPìƒIìƒBìƒ;ìƒ4ìƒ-ìƒ&ìƒìƒìƒìƒ ìƒìƒüëƒõëƒîëƒçëƒàëƒÙëƒÒëƒËëƒÄ냽냶냯냨냡냚냓냌냅ëƒ~ëƒwëƒpëƒiëƒbëƒ[ëƒTëƒMëƒFëƒ?ëƒ8ëƒ1ëƒ*ëƒ#ëƒëƒëƒëƒëƒëƒùêƒòêƒëêƒäêƒÝêƒÖêƒÏêƒÈêƒÁꃺꃳꃬꃥꃞꃗêƒêƒ‰êƒ‚êƒ{êƒtêƒmêƒfêƒ_êƒXêƒQêƒJêƒCêƒ<êƒ5êƒ.êƒ'êƒ êƒêƒêƒ êƒêƒýéƒöéƒïéƒèéƒáéƒÚéƒÓéƒÌéƒÅ郾郷郰郩郢郛郔éƒéƒ†éƒéƒxéƒqéƒjéƒcéƒ\éƒUéƒNéƒGéƒ@éƒ9éƒ2éƒ+éƒ$éƒéƒéƒéƒéƒéƒúèƒóèƒìèƒåèƒÞèƒ×èƒÐèƒÉèƒÂ胻胴胭胦胟胘胑胊胃èƒ|èƒuèƒnèƒgèƒ`èƒYèƒRèƒKèƒDèƒ=èƒ6èƒ/èƒ(èƒ!èƒèƒèƒ èƒèƒþçƒ÷çƒðçƒéçƒâçƒÛçƒÔçƒÍçƒÆçƒ¿çƒ¸çƒ±çƒªçƒ£çƒœçƒ•çƒŽçƒ‡çƒ€çƒyçƒrçƒkçƒdçƒ]çƒVçƒOçƒHçƒAçƒ:çƒ3çƒ,çƒ%çƒçƒçƒçƒ çƒçƒûæƒôæƒíæƒææƒßæƒØæƒÑæƒÊæƒÃ惼惵惮惧惠惙惒惋惄æƒ}æƒvæƒoæƒhæƒaæƒZæƒSæƒLæƒEæƒ>æƒ7æƒ0æƒ)æƒ"æƒæƒæƒ æƒæƒÿåƒøåƒñåƒêåƒãåƒÜåƒÕåƒÎåƒÇåƒÀ價僲僫僤åƒåƒ–åƒåƒˆåƒåƒzåƒsåƒlåƒeåƒ^åƒWåƒPåƒIåƒBåƒ;åƒ4åƒ-åƒ&åƒåƒåƒåƒ åƒåƒüäƒõäƒîäƒçäƒàäƒÙäƒÒäƒËäƒÄ䃽䃶䃯䃨䃡䃚䃓䃌䃅äƒ~äƒwäƒpäƒiäƒbäƒ[äƒTäƒMäƒFäƒ?äƒ8äƒ1äƒ*äƒ#äƒäƒäƒäƒäƒäƒùãƒòãƒëãƒäãƒÝãƒÖãƒÏãƒÈãƒÁヺンレュマプãƒãƒ‰ãƒ‚ãƒ{ãƒtãƒmãƒfãƒ_ãƒXãƒQãƒJãƒCãƒ<ãƒ5ãƒ.ãƒ'ムãƒãƒãƒ ãƒãƒýâƒöâƒïâƒèâƒáâƒÚâƒÓâƒÌâƒÅ⃾⃷⃰⃩⃢⃛⃔âƒâƒ†âƒâƒxâƒqâƒjâƒcâƒ\âƒUâƒNâƒGâƒ@âƒ9âƒ2âƒ+âƒ$âƒâƒâƒâƒâƒâƒúáƒóáƒìáƒåáƒÞáƒ×áƒÐáƒÉáƒÂ჻ჴჭღჟიბ჊Ⴣáƒ|áƒuáƒnáƒgáƒ`áƒYáƒRáƒKáƒDáƒ=áƒ6áƒ/áƒ(áƒ!áƒáƒáƒ áƒáƒþàƒ÷àƒðàƒéàƒâàƒÛàƒÔàƒÍàƒÆàƒ¿àƒ¸àƒ±àƒªàƒ£àƒœàƒ•àƒŽàƒ‡àƒ€àƒyàƒràƒkàƒdàƒ]àƒVàƒOàƒHàƒAàƒ:àƒ3àƒ,àƒ%àƒàƒàƒàƒ àƒàƒû߃ô߃í߃æßƒß߃ØßƒÑ߃Ê߃Ã߃¼ßƒµßƒ®ßƒ§ßƒ ßƒ™ßƒ’߃‹ßƒ„߃}߃v߃o߃h߃a߃Z߃S߃L߃E߃>߃7߃0߃)߃"߃߃߃ ߃߃ÿÞƒøÞƒñÞƒêÞƒãÞƒÜÞƒÕÞƒÎÞƒÇÞƒÀÞƒ¹Þƒ²Þƒ«Þƒ¤ÞƒÞƒ–ÞƒÞƒˆÞƒÞƒzÞƒsÞƒlÞƒeÞƒ^ÞƒWÞƒPÞƒIÞƒBÞƒ;Þƒ4Þƒ-Þƒ&ÞƒÞƒÞƒÞƒ ÞƒÞƒü݃õ݃î݃ç݃à݃Ù݃Ò݃Ë݃Ä݃½Ýƒ¶Ýƒ¯Ýƒ¨Ýƒ¡ÝƒšÝƒ“݃ŒÝƒ…݃~݃w݃p݃i݃b݃[݃T݃M݃F݃?݃8݃1݃*݃#݃݃݃݃݃݃ù܃ò܃ë܃ä܃Ý܃Ö܃Ï܃È܃Á܃ºÜƒ³Üƒ¬Üƒ¥ÜƒžÜƒ—܃܃‰Üƒ‚܃{܃t܃m܃f܃_܃X܃Q܃J܃C܃<܃5܃.܃'܃ ܃܃܃ ܃܃ýÛƒöÛƒïÛƒèÛƒáÛƒÚÛƒÓÛƒÌÛƒÅÛƒ¾Ûƒ·Ûƒ°Ûƒ©Ûƒ¢Ûƒ›Ûƒ”ÛƒÛƒ†ÛƒÛƒxÛƒqÛƒjÛƒcÛƒ\ÛƒUÛƒNÛƒGÛƒ@Ûƒ9Ûƒ2Ûƒ+Ûƒ$ÛƒÛƒÛƒÛƒÛƒÛƒúÚƒóÚƒìÚƒåÚƒÞÚƒ×ÚƒÐÚƒÉÚƒÂÚƒ»Úƒ´Úƒ­Úƒ¦ÚƒŸÚƒ˜Úƒ‘ÚƒŠÚƒƒÚƒ|ÚƒuÚƒnÚƒgÚƒ`ÚƒYÚƒRÚƒKÚƒDÚƒ=Úƒ6Úƒ/Úƒ(Úƒ!ÚƒÚƒÚƒ ÚƒÚƒþÙƒ÷ÙƒðÙƒéÙƒâÙƒÛÙƒÔÙƒÍÙƒÆÙƒ¿Ùƒ¸Ùƒ±ÙƒªÙƒ£ÙƒœÙƒ•ÙƒŽÙƒ‡Ùƒ€ÙƒyÙƒrÙƒkÙƒdÙƒ]ÙƒVÙƒOÙƒHÙƒAÙƒ:Ùƒ3Ùƒ,Ùƒ%كككك ككû؃ô؃íØƒæØƒߨƒØØƒÑØƒÊØƒÃ؃¼ØƒµØƒ®Øƒ§Øƒ Øƒ™Øƒ’؃‹Øƒ„؃}؃v؃o؃h؃a؃Z؃S؃L؃E؃>؃7؃0؃)؃"؃؃؃ ؃؃ÿ׃ø×ƒñ׃ê׃ã׃Ü׃Õ׃Î׃Ç׃À׃¹×ƒ²×ƒ«×ƒ¤×ƒ׃–׃׃ˆ×ƒ׃z׃s׃l׃e׃^׃W׃P׃I׃B׃;׃4׃-׃&׃׃׃׃ ׃׃üÖƒõÖƒîÖƒçÖƒàÖƒÙÖƒÒÖƒËÖƒÄÖƒ½Öƒ¶Öƒ¯Öƒ¨Öƒ¡ÖƒšÖƒ“ÖƒŒÖƒ…Öƒ~ÖƒwÖƒpÖƒiÖƒbÖƒ[ÖƒTÖƒMÖƒFÖƒ?Öƒ8Öƒ1Öƒ*Öƒ#ÖƒÖƒÖƒÖƒÖƒÖƒùÕƒòÕƒëÕƒäÕƒÝÕƒÖÕƒÏÕƒÈÕƒÁÕƒºÕƒ³Õƒ¬Õƒ¥ÕƒžÕƒ—ÕƒÕƒ‰Õƒ‚Õƒ{ÕƒtÕƒmÕƒfÕƒ_ÕƒXÕƒQÕƒJÕƒCÕƒ<Õƒ5Õƒ.Õƒ'Õƒ ÕƒÕƒÕƒ ÕƒÕƒýÔƒöÔƒïÔƒèÔƒáÔƒÚÔƒÓÔƒÌÔƒÅÔƒ¾Ôƒ·Ôƒ°Ôƒ©Ôƒ¢Ôƒ›Ôƒ”ÔƒÔƒ†ÔƒÔƒxÔƒqÔƒjÔƒcÔƒ\ÔƒUÔƒNÔƒGÔƒ@Ôƒ9Ôƒ2Ôƒ+Ôƒ$ÔƒÔƒÔƒÔƒÔƒÔƒúÓƒóÓƒìÓƒåÓƒÞÓƒ×ÓƒÐÓƒÉÓƒÂÓƒ»Óƒ´Óƒ­Óƒ¦ÓƒŸÓƒ˜Óƒ‘ÓƒŠÓƒƒÓƒ|ÓƒuÓƒnÓƒgÓƒ`ÓƒYÓƒRÓƒKÓƒDÓƒ=Óƒ6Óƒ/Óƒ(Óƒ!ÓƒÓƒÓƒ ÓƒÓƒþÒƒ÷ÒƒðÒƒéÒƒâÒƒÛÒƒÔÒƒÍÒƒÆÒƒ¿Òƒ¸Òƒ±ÒƒªÒƒ£ÒƒœÒƒ•ÒƒŽÒƒ‡Òƒ€ÒƒyÒƒrÒƒkÒƒdÒƒ]ÒƒVÒƒOÒƒHÒƒAÒƒ:Òƒ3Òƒ,Òƒ%ÒƒÒƒÒƒÒƒ ÒƒÒƒûуôуíуæÑƒßуØÑƒÑуÊуÃу¼ÑƒµÑƒ®Ñƒ§Ñƒ Ñƒ™Ñƒ’у‹Ñƒ„у}уvуoуhуaуZуSуLуEу>у7у0у)у"ууу ууÿЃøÐƒñЃêЃãЃÜЃÕЃÎЃÇЃÀЃ¹Ðƒ²Ðƒ«Ðƒ¤ÐƒЃ–ЃЃˆÐƒЃzЃsЃlЃeЃ^ЃWЃPЃIЃBЃ;Ѓ4Ѓ-Ѓ&ЃЃЃЃ ЃЃüσõσîσçσàσÙσÒσËσÄσ½Ïƒ¶Ïƒ¯Ïƒ¨Ïƒ¡ÏƒšÏƒ“σŒÏƒ…σ~σwσpσiσbσ[σTσMσFσ?σ8σ1σ*σ#σσσσσσù΃ò΃ë΃ä΃Ý΃Ö΃Ï΃È΃Á΃ºÎƒ³Îƒ¬Îƒ¥ÎƒžÎƒ—΃΃‰Îƒ‚΃{΃t΃m΃f΃_΃X΃Q΃J΃C΃<΃5΃.΃'΃ ΃΃΃ ΃΃ý̓ö̓ï̓è̓á̓Ú̓Ó̓Ì̓Å̓¾Íƒ·Íƒ°Íƒ©Íƒ¢Íƒ›Íƒ”̓̓†Íƒ̓x̓q̓j̓c̓\̓U̓N̓G̓@̓9̓2̓+̓$̓̓̓̓̓̓ú̃ó̃ì̃å̃Þ̃×̃Ð̃É̃Ẫ»Ìƒ´Ìƒ­Ìƒ¦ÌƒŸÌƒ˜Ìƒ‘̃ŠÌƒƒÌƒ|̃ũñg̃`̃ỸR̃K̃D̃=̃6̃/̃(̃!̃̃̃ ̃̃þ˃÷˃ð˃é˃â˃Û˃Ô˃Í˃ÆËƒ¿Ëƒ¸Ëƒ±ËƒªËƒ£ËƒœËƒ•˃ŽËƒ‡Ëƒ€Ëƒy˃r˃k˃d˃]˃V˃O˃H˃A˃:˃3˃,˃%˃˃˃˃ ˃˃ûʃôʃíʃæÊƒßʃØÊƒÑʃÊʃÃʃ¼ÊƒµÊƒ®Êƒ§Êƒ Êƒ™Êƒ’ʃ‹Êƒ„ʃ}ʃvʃoʃhʃaʃZʃSʃLʃEʃ>ʃ7ʃ0ʃ)ʃ"ʃʃʃ ʃʃÿɃøÉƒñɃêɃãɃÜɃÕɃÎɃÇɃÀɃ¹Éƒ²Éƒ«Éƒ¤ÉƒɃ–ɃɃˆÉƒɃzɃsɃlɃeɃ^ɃWɃPɃIɃBɃ;Ƀ4Ƀ-Ƀ&ɃɃɃɃ ɃɃüȃõȃîȃçȃàȃÙȃÒȃËȃÄȃ½Èƒ¶Èƒ¯Èƒ¨Èƒ¡ÈƒšÈƒ“ȃŒÈƒ…ȃ~ȃwȃpȃiȃbȃ[ȃTȃMȃFȃ?ȃ8ȃ1ȃ*ȃ#ȃȃȃȃȃȃùǃòǃëǃäǃÝǃÖǃÏǃÈǃÁǃºÇƒ³Çƒ¬Çƒ¥ÇƒžÇƒ—ǃǃ‰Çƒ‚ǃ{ǃtǃmǃfǃ_ǃXǃQǃJǃCǃ<ǃ5ǃ.ǃ'ǃ ǃǃǃ ǃǃýƃöƃïÆƒèÆƒáÆƒÚÆƒÓÆƒÌÆƒÅƃ¾Æƒ·Æƒ°Æƒ©Æƒ¢Æƒ›Æƒ”ƃƃ†Æƒƃxƃqƃjƃcƃ\ƃUƃNƃGƃ@ƃ9ƃ2ƃ+ƃ$ƃƃƃƃƃƃúŃóŃìŃåŃÞŃ×ŃÐŃÉŃÂŃ»Åƒ´Åƒ­Åƒ¦ÅƒŸÅƒ˜Åƒ‘ŃŠÅƒƒÅƒ|ŃuŃnŃgŃ`ŃYŃRŃKŃDŃ=Ń6Ń/Ń(Ń!ŃŃŃ ŃŃþă÷ăðăéăâăÛăÔăÍăÆÄƒ¿Äƒ¸Äƒ±ÄƒªÄƒ£ÄƒœÄƒ•ăŽÄƒ‡Äƒ€Äƒyărăkădă]ăVăOăHăAă:ă3ă,ă%ăăăă ăăûÃôÃíÃæÃƒßÃØÃƒÑÃÊÃÃüõîçàÙÃ’ËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿƒøÂƒñƒêƒãƒ܃Õƒ΃ǃÀƒ¹Âƒ²Âƒ«Âƒ¤Âƒƒ–ƒƒˆÂƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒüÁƒõÁƒîÁƒçÁƒàÁƒÙÁƒÒÁƒËÁƒÄÁƒ½Áƒ¶Áƒ¯Áƒ¨Áƒ¡ÁƒšÁƒ“ÁƒŒÁƒ…Áƒ~ÁƒwÁƒpÁƒiÁƒbÁƒ[ÁƒTÁƒMÁƒFÁƒ?Áƒ8Áƒ1Áƒ*Áƒ#ÁƒÁƒÁƒÁƒÁƒÁƒùÀƒòÀƒëÀƒäÀƒÝÀƒÖÀƒÏÀƒÈÀƒÁÀƒºÀƒ³Àƒ¬Àƒ¥ÀƒžÀƒ—ÀƒÀƒ‰Àƒ‚Àƒ{ÀƒtÀƒmÀƒfÀƒ_ÀƒXÀƒQÀƒJÀƒCÀƒ<Àƒ5Àƒ.Àƒ'Àƒ ÀƒÀƒÀƒ ÀƒÀƒý¿ƒö¿ƒᅢ迃ῃÚ¿ƒÓ¿ƒÌ¿ƒÅ¿ƒ¾¿ƒ·¿ƒ°¿ƒ©¿ƒ¢¿ƒ›¿ƒ”¿ƒ¿ƒ†¿ƒ¿ƒx¿ƒq¿ƒj¿ƒc¿ƒ\¿ƒU¿ƒN¿ƒG¿ƒ@¿ƒ9¿ƒ2¿ƒ+¿ƒ$¿ƒ¿ƒ¿ƒ¿ƒ¿ƒ¿ƒú¾ƒó¾ƒ쾃徃Þ¾ƒ×¾ƒоƒɾƒ¾ƒ»¾ƒ´¾ƒ­¾ƒ¦¾ƒŸ¾ƒ˜¾ƒ‘¾ƒоƒƒ¾ƒ|¾ƒu¾ƒn¾ƒg¾ƒ`¾ƒY¾ƒR¾ƒK¾ƒD¾ƒ=¾ƒ6¾ƒ/¾ƒ(¾ƒ!¾ƒ¾ƒ¾ƒ ¾ƒ¾ƒþ½ƒ÷½ƒð½ƒ齃⽃Û½ƒÔ½ƒͽƒƽƒ¿½ƒ¸½ƒ±½ƒª½ƒ£½ƒœ½ƒ•½ƒ޽ƒ‡½ƒ€½ƒy½ƒr½ƒk½ƒd½ƒ]½ƒV½ƒO½ƒH½ƒA½ƒ:½ƒ3½ƒ,½ƒ%½ƒ½ƒ½ƒ½ƒ ½ƒ½ƒû¼ƒô¼ƒí¼ƒ漃ß¼ƒؼƒѼƒʼƒüƒ¼¼ƒµ¼ƒ®¼ƒ§¼ƒ ¼ƒ™¼ƒ’¼ƒ‹¼ƒ„¼ƒ}¼ƒv¼ƒo¼ƒh¼ƒa¼ƒZ¼ƒS¼ƒL¼ƒE¼ƒ>¼ƒ7¼ƒ0¼ƒ)¼ƒ"¼ƒ¼ƒ¼ƒ ¼ƒ¼ƒÿ»ƒø»ƒñ»ƒ껃㻃Ü»ƒÕ»ƒλƒÇ»ƒÀ»ƒ¹»ƒ²»ƒ«»ƒ¤»ƒ»ƒ–»ƒ»ƒˆ»ƒ»ƒz»ƒs»ƒl»ƒe»ƒ^»ƒW»ƒP»ƒI»ƒB»ƒ;»ƒ4»ƒ-»ƒ&»ƒ»ƒ»ƒ»ƒ »ƒ»ƒüºƒõºƒ纃຃ÙºƒÒºƒ˺ƒĺƒ½ºƒ¶ºƒ¯ºƒ¨ºƒ¡ºƒšºƒ“ºƒŒºƒ…ºƒ~ºƒwºƒpºƒiºƒbºƒ[ºƒTºƒMºƒFºƒ?ºƒ8ºƒ1ºƒ*ºƒ#ºƒºƒºƒºƒºƒºƒù¹ƒò¹ƒ빃乃ݹƒÖ¹ƒϹƒȹƒÁ¹ƒº¹ƒ³¹ƒ¬¹ƒ¥¹ƒž¹ƒ—¹ƒ¹ƒ‰¹ƒ‚¹ƒ{¹ƒt¹ƒm¹ƒf¹ƒ_¹ƒX¹ƒQ¹ƒJ¹ƒC¹ƒ<¹ƒ5¹ƒ.¹ƒ'¹ƒ ¹ƒ¹ƒ¹ƒ ¹ƒ¹ƒý¸ƒö¸ƒ︃踃ḃÚ¸ƒÓ¸ƒ̸ƒŸƒ¾¸ƒ·¸ƒ°¸ƒ©¸ƒ¢¸ƒ›¸ƒ”¸ƒ¸ƒ†¸ƒ¸ƒx¸ƒq¸ƒj¸ƒc¸ƒ\¸ƒU¸ƒN¸ƒG¸ƒ@¸ƒ9¸ƒ2¸ƒ+¸ƒ$¸ƒ¸ƒ¸ƒ¸ƒ¸ƒ¸ƒú·ƒó·ƒì·ƒå·ƒÞ·ƒ×·ƒзƒÉ·ƒ·ƒ»·ƒ´·ƒ­·ƒ¦·ƒŸ·ƒ˜·ƒ‘·ƒŠ·ƒƒ·ƒ|·ƒu·ƒn·ƒg·ƒ`·ƒY·ƒR·ƒK·ƒD·ƒ=·ƒ6·ƒ/·ƒ(·ƒ!·ƒ·ƒ·ƒ ·ƒ·ƒþ¶ƒ÷¶ƒð¶ƒ鶃ⶃÛ¶ƒÔ¶ƒͶƒƶƒ¿¶ƒ¸¶ƒ±¶ƒª¶ƒ£¶ƒœ¶ƒ•¶ƒ޶ƒ‡¶ƒ€¶ƒy¶ƒr¶ƒk¶ƒd¶ƒ]¶ƒV¶ƒO¶ƒH¶ƒA¶ƒ:¶ƒ3¶ƒ,¶ƒ%¶ƒ¶ƒ¶ƒ¶ƒ ¶ƒ¶ƒûµƒôµƒíµƒ浃ßµƒصƒѵƒʵƒõƒ¼µƒµµƒ®µƒ§µƒ µƒ™µƒ’µƒ‹µƒ„µƒ}µƒvµƒoµƒhµƒaµƒZµƒSµƒLµƒEµƒ>µƒ7µƒ0µƒ)µƒ"µƒµƒµƒ µƒµƒÿ´ƒø´ƒñ´ƒê´ƒã´ƒÜ´ƒÕ´ƒδƒÇ´ƒÀ´ƒ¹´ƒ²´ƒ«´ƒ¤´ƒ´ƒ–´ƒ´ƒˆ´ƒ´ƒz´ƒs´ƒl´ƒe´ƒ^´ƒW´ƒP´ƒI´ƒB´ƒ;´ƒ4´ƒ-´ƒ&´ƒ´ƒ´ƒ´ƒ ´ƒ´ƒü³ƒõ³ƒ糃ೃÙ³ƒÒ³ƒ˳ƒijƒ½³ƒ¶³ƒ¯³ƒ¨³ƒ¡³ƒš³ƒ“³ƒŒ³ƒ…³ƒ~³ƒw³ƒp³ƒi³ƒb³ƒ[³ƒT³ƒM³ƒF³ƒ?³ƒ8³ƒ1³ƒ*³ƒ#³ƒ³ƒ³ƒ³ƒ³ƒ³ƒù²ƒò²ƒ벃䲃ݲƒÖ²ƒϲƒȲƒÁ²ƒº²ƒ³²ƒ¬²ƒ¥²ƒž²ƒ—²ƒ²ƒ‰²ƒ‚²ƒ{²ƒt²ƒm²ƒf²ƒ_²ƒX²ƒQ²ƒJ²ƒC²ƒ<²ƒ5²ƒ.²ƒ'²ƒ ²ƒ²ƒ²ƒ ²ƒ²ƒý±ƒö±ƒﱃ豃᱃Ú±ƒÓ±ƒ̱ƒűƒ¾±ƒ·±ƒ°±ƒ©±ƒ¢±ƒ›±ƒ”±ƒ±ƒ†±ƒ±ƒx±ƒq±ƒj±ƒc±ƒ\±ƒU±ƒN±ƒG±ƒ@±ƒ9±ƒ2±ƒ+±ƒ$±ƒ±ƒ±ƒ±ƒ±ƒ±ƒú°ƒó°ƒì°ƒå°ƒÞ°ƒ×°ƒаƒɰƒ°ƒ»°ƒ´°ƒ­°ƒ¦°ƒŸ°ƒ˜°ƒ‘°ƒаƒƒ°ƒ|°ƒu°ƒn°ƒg°ƒ`°ƒY°ƒR°ƒK°ƒD°ƒ=°ƒ6°ƒ/°ƒ(°ƒ!°ƒ°ƒ°ƒ °ƒ°ƒþ¯ƒ÷¯ƒð¯ƒ鯃⯃Û¯ƒÔ¯ƒͯƒƯƒ¿¯ƒ¸¯ƒ±¯ƒª¯ƒ£¯ƒœ¯ƒ•¯ƒޝƒ‡¯ƒ€¯ƒy¯ƒr¯ƒk¯ƒd¯ƒ]¯ƒV¯ƒO¯ƒH¯ƒA¯ƒ:¯ƒ3¯ƒ,¯ƒ%¯ƒ¯ƒ¯ƒ¯ƒ ¯ƒ¯ƒû®ƒô®ƒí®ƒ殃ß®ƒØ®ƒÑ®ƒÊ®ƒîƒ¼®ƒµ®ƒ®®ƒ§®ƒ ®ƒ™®ƒ’®ƒ‹®ƒ„®ƒ}®ƒv®ƒo®ƒh®ƒa®ƒZ®ƒS®ƒL®ƒE®ƒ>®ƒ7®ƒ0®ƒ)®ƒ"®ƒ®ƒ®ƒ ®ƒ®ƒÿ­ƒø­ƒñ­ƒê­ƒã­ƒÜ­ƒÕ­ƒέƒÇ­ƒÀ­ƒ¹­ƒ²­ƒ«­ƒ¤­ƒ­ƒ–­ƒ­ƒˆ­ƒ­ƒz­ƒs­ƒl­ƒe­ƒ^­ƒW­ƒP­ƒI­ƒB­ƒ;­ƒ4­ƒ-­ƒ&­ƒ­ƒ­ƒ­ƒ ­ƒ­ƒü¬ƒõ¬ƒ笃ଃÙ¬ƒÒ¬ƒˬƒĬƒ½¬ƒ¶¬ƒ¯¬ƒ¨¬ƒ¡¬ƒš¬ƒ“¬ƒŒ¬ƒ…¬ƒ~¬ƒw¬ƒp¬ƒi¬ƒb¬ƒ[¬ƒT¬ƒM¬ƒF¬ƒ?¬ƒ8¬ƒ1¬ƒ*¬ƒ#¬ƒ¬ƒ¬ƒ¬ƒ¬ƒ¬ƒù«ƒò«ƒ뫃䫃Ý«ƒÖ«ƒÏ«ƒÈ«ƒÁ«ƒº«ƒ³«ƒ¬«ƒ¥«ƒž«ƒ—«ƒ«ƒ‰«ƒ‚«ƒ{«ƒt«ƒm«ƒf«ƒ_«ƒX«ƒQ«ƒJ«ƒC«ƒ<«ƒ5«ƒ.«ƒ'«ƒ «ƒ«ƒ«ƒ «ƒ«ƒýªƒöªƒ廙誃᪃ÚªƒÓªƒ̪ƒŪƒ¾ªƒ·ªƒ°ªƒ©ªƒ¢ªƒ›ªƒ”ªƒªƒ†ªƒªƒxªƒqªƒjªƒcªƒ\ªƒUªƒNªƒGªƒ@ªƒ9ªƒ2ªƒ+ªƒ$ªƒªƒªƒªƒªƒªƒú©ƒó©ƒ쩃婃Þ©ƒשƒЩƒÉ©ƒ©ƒ»©ƒ´©ƒ­©ƒ¦©ƒŸ©ƒ˜©ƒ‘©ƒŠ©ƒƒ©ƒ|©ƒu©ƒn©ƒg©ƒ`©ƒY©ƒR©ƒK©ƒD©ƒ=©ƒ6©ƒ/©ƒ(©ƒ!©ƒ©ƒ©ƒ ©ƒ©ƒþ¨ƒ÷¨ƒð¨ƒ騃⨃Û¨ƒÔ¨ƒͨƒƨƒ¿¨ƒ¸¨ƒ±¨ƒª¨ƒ£¨ƒœ¨ƒ•¨ƒލƒ‡¨ƒ€¨ƒy¨ƒr¨ƒk¨ƒd¨ƒ]¨ƒV¨ƒO¨ƒH¨ƒA¨ƒ:¨ƒ3¨ƒ,¨ƒ%¨ƒ¨ƒ¨ƒ¨ƒ ¨ƒ¨ƒû§ƒô§ƒí§ƒ槃ß§ƒاƒѧƒʧƒçƒ¼§ƒµ§ƒ®§ƒ§§ƒ §ƒ™§ƒ’§ƒ‹§ƒ„§ƒ}§ƒv§ƒo§ƒh§ƒa§ƒZ§ƒS§ƒL§ƒE§ƒ>§ƒ7§ƒ0§ƒ)§ƒ"§ƒ§ƒ§ƒ §ƒ§ƒÿ¦ƒø¦ƒñ¦ƒꦃ㦃ܦƒÕ¦ƒΦƒǦƒÀ¦ƒ¹¦ƒ²¦ƒ«¦ƒ¤¦ƒ¦ƒ–¦ƒ¦ƒˆ¦ƒ¦ƒz¦ƒs¦ƒl¦ƒe¦ƒ^¦ƒW¦ƒP¦ƒI¦ƒB¦ƒ;¦ƒ4¦ƒ-¦ƒ&¦ƒ¦ƒ¦ƒ¦ƒ ¦ƒ¦ƒü¥ƒõ¥ƒ祃ृÙ¥ƒÒ¥ƒË¥ƒÄ¥ƒ½¥ƒ¶¥ƒ¯¥ƒ¨¥ƒ¡¥ƒš¥ƒ“¥ƒŒ¥ƒ…¥ƒ~¥ƒw¥ƒp¥ƒi¥ƒb¥ƒ[¥ƒT¥ƒM¥ƒF¥ƒ?¥ƒ8¥ƒ1¥ƒ*¥ƒ#¥ƒ¥ƒ¥ƒ¥ƒ¥ƒ¥ƒù¤ƒò¤ƒ뤃䤃ݤƒÖ¤ƒϤƒȤƒÁ¤ƒº¤ƒ³¤ƒ¬¤ƒ¥¤ƒž¤ƒ—¤ƒ¤ƒ‰¤ƒ‚¤ƒ{¤ƒt¤ƒm¤ƒf¤ƒ_¤ƒX¤ƒQ¤ƒJ¤ƒC¤ƒ<¤ƒ5¤ƒ.¤ƒ'¤ƒ ¤ƒ¤ƒ¤ƒ ¤ƒ¤ƒý£ƒö£ƒ裃ᣃÚ£ƒÓ£ƒÌ£ƒÅ£ƒ¾£ƒ·£ƒ°£ƒ©£ƒ¢£ƒ›£ƒ”£ƒ£ƒ†£ƒ£ƒx£ƒq£ƒj£ƒc£ƒ\£ƒU£ƒN£ƒG£ƒ@£ƒ9£ƒ2£ƒ+£ƒ$£ƒ£ƒ£ƒ£ƒ£ƒ£ƒú¢ƒó¢ƒ좃境Þ¢ƒ×¢ƒТƒÉ¢ƒ¢ƒ»¢ƒ´¢ƒ­¢ƒ¦¢ƒŸ¢ƒ˜¢ƒ‘¢ƒŠ¢ƒƒ¢ƒ|¢ƒu¢ƒn¢ƒg¢ƒ`¢ƒY¢ƒR¢ƒK¢ƒD¢ƒ=¢ƒ6¢ƒ/¢ƒ(¢ƒ!¢ƒ¢ƒ¢ƒ ¢ƒ¢ƒþ¡ƒ÷¡ƒð¡ƒ顃⡃Û¡ƒÔ¡ƒÍ¡ƒÆ¡ƒ¿¡ƒ¸¡ƒ±¡ƒª¡ƒ£¡ƒœ¡ƒ•¡ƒŽ¡ƒ‡¡ƒ€¡ƒy¡ƒr¡ƒk¡ƒd¡ƒ]¡ƒV¡ƒO¡ƒH¡ƒA¡ƒ:¡ƒ3¡ƒ,¡ƒ%¡ƒ¡ƒ¡ƒ¡ƒ ¡ƒ¡ƒû ƒô ƒí ƒæ ƒß ƒØ ƒÑ ƒÊ ƒàƒ¼ ƒµ ƒ® ƒ§ ƒ  ƒ™ ƒ’ ƒ‹ ƒ„ ƒ} ƒv ƒo ƒh ƒa ƒZ ƒS ƒL ƒE ƒ> ƒ7 ƒ0 ƒ) ƒ" ƒ ƒ ƒ  ƒ ƒÿŸƒøŸƒñŸƒꟃ㟃ÜŸƒÕŸƒΟƒÇŸƒÀŸƒ¹Ÿƒ²Ÿƒ«Ÿƒ¤ŸƒŸƒ–ŸƒŸƒˆŸƒŸƒzŸƒsŸƒlŸƒeŸƒ^ŸƒWŸƒPŸƒIŸƒBŸƒ;Ÿƒ4Ÿƒ-Ÿƒ&ŸƒŸƒŸƒŸƒ ŸƒŸƒüžƒõžƒ瞃àžƒÙžƒÒžƒËžƒÄžƒ½žƒ¶žƒ¯žƒ¨žƒ¡žƒšžƒ“žƒŒžƒ…žƒ~žƒwžƒpžƒižƒbžƒ[žƒTžƒMžƒFžƒ?žƒ8žƒ1žƒ*žƒ#žƒžƒžƒžƒžƒžƒùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýœƒöœƒ蜃ᜃÚœƒÓœƒÌœƒÅœƒ¾œƒ·œƒ°œƒ©œƒ¢œƒ›œƒ”œƒœƒ†œƒœƒxœƒqœƒjœƒcœƒ\œƒUœƒNœƒGœƒ@œƒ9œƒ2œƒ+œƒ$œƒœƒœƒœƒœƒœƒú›ƒó›ƒ웃囃Þ›ƒ×›ƒЛƒÉ›ƒ›ƒ»›ƒ´›ƒ­›ƒ¦›ƒŸ›ƒ˜›ƒ‘›ƒŠ›ƒƒ›ƒ|›ƒu›ƒn›ƒg›ƒ`›ƒY›ƒR›ƒK›ƒD›ƒ=›ƒ6›ƒ/›ƒ(›ƒ!›ƒ›ƒ›ƒ ›ƒ›ƒþšƒ÷šƒðšƒ隃⚃ÛšƒÔšƒÍšƒÆšƒ¿šƒ¸šƒ±šƒªšƒ£šƒœšƒ•šƒŽšƒ‡šƒ€šƒyšƒršƒkšƒdšƒ]šƒVšƒOšƒHšƒAšƒ:šƒ3šƒ,šƒ%šƒšƒšƒšƒ šƒšƒû™ƒô™ƒ홃晃ß™ƒØ™ƒÑ™ƒÊ™ƒÙƒ¼™ƒµ™ƒ®™ƒ§™ƒ ™ƒ™™ƒ’™ƒ‹™ƒ„™ƒ}™ƒv™ƒo™ƒh™ƒa™ƒZ™ƒS™ƒL™ƒE™ƒ>™ƒ7™ƒ0™ƒ)™ƒ"™ƒ™ƒ™ƒ ™ƒ™ƒÿ˜ƒø˜ƒñ˜ƒꘃ㘃ܘƒÕ˜ƒΘƒǘƒÀ˜ƒ¹˜ƒ²˜ƒ«˜ƒ¤˜ƒ˜ƒ–˜ƒ˜ƒˆ˜ƒ˜ƒz˜ƒs˜ƒl˜ƒe˜ƒ^˜ƒW˜ƒP˜ƒI˜ƒB˜ƒ;˜ƒ4˜ƒ-˜ƒ&˜ƒ˜ƒ˜ƒ˜ƒ ˜ƒ˜ƒü—ƒõ—ƒî—ƒç—ƒà—ƒÙ—ƒÒ—ƒË—ƒÄ—ƒ½—ƒ¶—ƒ¯—ƒ¨—ƒ¡—ƒš—ƒ“—ƒŒ—ƒ…—ƒ~—ƒw—ƒp—ƒi—ƒb—ƒ[—ƒT—ƒM—ƒF—ƒ?—ƒ8—ƒ1—ƒ*—ƒ#—ƒ—ƒ—ƒ—ƒ—ƒ—ƒù–ƒò–ƒë–ƒä–ƒÝ–ƒÖ–ƒÏ–ƒÈ–ƒÁ–ƒº–ƒ³–ƒ¬–ƒ¥–ƒž–ƒ—–ƒ–ƒ‰–ƒ‚–ƒ{–ƒt–ƒm–ƒf–ƒ_–ƒX–ƒQ–ƒJ–ƒC–ƒ<–ƒ5–ƒ.–ƒ'–ƒ –ƒ–ƒ–ƒ –ƒ–ƒý•ƒö•ƒ蕃ᕃÚ•ƒÓ•ƒÌ•ƒÅ•ƒ¾•ƒ·•ƒ°•ƒ©•ƒ¢•ƒ›•ƒ”•ƒ•ƒ†•ƒ•ƒx•ƒq•ƒj•ƒc•ƒ\•ƒU•ƒN•ƒG•ƒ@•ƒ9•ƒ2•ƒ+•ƒ$•ƒ•ƒ•ƒ•ƒ•ƒ•ƒú”ƒó”ƒ씃唃Þ”ƒ×”ƒДƒÉ”ƒ”ƒ»”ƒ´”ƒ­”ƒ¦”ƒŸ”ƒ˜”ƒ‘”ƒŠ”ƒƒ”ƒ|”ƒu”ƒn”ƒg”ƒ`”ƒY”ƒR”ƒK”ƒD”ƒ=”ƒ6”ƒ/”ƒ(”ƒ!”ƒ”ƒ”ƒ ”ƒ”ƒþ“ƒ÷“ƒð“ƒ铃ⓃÛ“ƒÔ“ƒÍ“ƒÆ“ƒ¿“ƒ¸“ƒ±“ƒª“ƒ£“ƒœ“ƒ•“ƒŽ“ƒ‡“ƒ€“ƒy“ƒr“ƒk“ƒd“ƒ]“ƒV“ƒO“ƒH“ƒA“ƒ:“ƒ3“ƒ,“ƒ%“ƒ“ƒ“ƒ“ƒ “ƒ“ƒû’ƒô’ƒí’ƒæ’ƒß’ƒØ’ƒÑ’ƒÊ’ƒÃ’ƒ¼’ƒµ’ƒ®’ƒ§’ƒ ’ƒ™’ƒ’’ƒ‹’ƒ„’ƒ}’ƒv’ƒo’ƒh’ƒa’ƒZ’ƒS’ƒL’ƒE’ƒ>’ƒ7’ƒ0’ƒ)’ƒ"’ƒ’ƒ’ƒ ’ƒ’ƒÿ‘ƒø‘ƒñ‘ƒꑃ㑃Ü‘ƒÕ‘ƒΑƒÇ‘ƒÀ‘ƒ¹‘ƒ²‘ƒ«‘ƒ¤‘ƒ‘ƒ–‘ƒ‘ƒˆ‘ƒ‘ƒz‘ƒs‘ƒl‘ƒe‘ƒ^‘ƒW‘ƒP‘ƒI‘ƒB‘ƒ;‘ƒ4‘ƒ-‘ƒ&‘ƒ‘ƒ‘ƒ‘ƒ ‘ƒ‘ƒüƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýŽƒöŽƒ莃ᎃÚŽƒÓŽƒÌŽƒÅŽƒ¾Žƒ·Žƒ°Žƒ©Žƒ¢Žƒ›Žƒ”ŽƒŽƒ†ŽƒŽƒxŽƒqŽƒjŽƒcŽƒ\ŽƒUŽƒNŽƒGŽƒ@Žƒ9Žƒ2Žƒ+Žƒ$ŽƒŽƒŽƒŽƒŽƒŽƒúƒóƒìƒåƒÞƒ׃ЃɃƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþŒƒ÷ŒƒðŒƒ錃⌃ÛŒƒÔŒƒÍŒƒÆŒƒ¿Œƒ¸Œƒ±ŒƒªŒƒ£ŒƒœŒƒ•ŒƒŽŒƒ‡Œƒ€ŒƒyŒƒrŒƒkŒƒdŒƒ]ŒƒVŒƒOŒƒHŒƒAŒƒ:Œƒ3Œƒ,Œƒ%ŒƒŒƒŒƒŒƒ ŒƒŒƒû‹ƒô‹ƒ틃拃ß‹ƒØ‹ƒÑ‹ƒÊ‹ƒ˃¼‹ƒµ‹ƒ®‹ƒ§‹ƒ ‹ƒ™‹ƒ’‹ƒ‹‹ƒ„‹ƒ}‹ƒv‹ƒo‹ƒh‹ƒa‹ƒZ‹ƒS‹ƒL‹ƒE‹ƒ>‹ƒ7‹ƒ0‹ƒ)‹ƒ"‹ƒ‹ƒ‹ƒ ‹ƒ‹ƒÿŠƒøŠƒñŠƒꊃ㊃ÜŠƒÕŠƒΊƒÇŠƒÀŠƒ¹Šƒ²Šƒ«Šƒ¤ŠƒŠƒ–ŠƒŠƒˆŠƒŠƒzŠƒsŠƒlŠƒeŠƒ^ŠƒWŠƒPŠƒIŠƒBŠƒ;Šƒ4Šƒ-Šƒ&ŠƒŠƒŠƒŠƒ ŠƒŠƒü‰ƒõ‰ƒ牃à‰ƒÙ‰ƒÒ‰ƒˉƒĉƒ½‰ƒ¶‰ƒ¯‰ƒ¨‰ƒ¡‰ƒš‰ƒ“‰ƒŒ‰ƒ…‰ƒ~‰ƒw‰ƒp‰ƒi‰ƒb‰ƒ[‰ƒT‰ƒM‰ƒF‰ƒ?‰ƒ8‰ƒ1‰ƒ*‰ƒ#‰ƒ‰ƒ‰ƒ‰ƒ‰ƒ‰ƒùˆƒòˆƒ눃䈃݈ƒÖˆƒψƒȈƒÁˆƒºˆƒ³ˆƒ¬ˆƒ¥ˆƒžˆƒ—ˆƒˆƒ‰ˆƒ‚ˆƒ{ˆƒtˆƒmˆƒfˆƒ_ˆƒXˆƒQˆƒJˆƒCˆƒ<ˆƒ5ˆƒ.ˆƒ'ˆƒ ˆƒˆƒˆƒ ˆƒˆƒý‡ƒö‡ƒ臃ᇃÚ‡ƒÓ‡ƒ̇ƒŇƒ¾‡ƒ·‡ƒ°‡ƒ©‡ƒ¢‡ƒ›‡ƒ”‡ƒ‡ƒ†‡ƒ‡ƒx‡ƒq‡ƒj‡ƒc‡ƒ\‡ƒU‡ƒN‡ƒG‡ƒ@‡ƒ9‡ƒ2‡ƒ+‡ƒ$‡ƒ‡ƒ‡ƒ‡ƒ‡ƒ‡ƒú†ƒó†ƒ솃冃Þ†ƒ׆ƒІƒɆƒ†ƒ»†ƒ´†ƒ­†ƒ¦†ƒŸ†ƒ˜†ƒ‘†ƒІƒƒ†ƒ|†ƒu†ƒn†ƒg†ƒ`†ƒY†ƒR†ƒK†ƒD†ƒ=†ƒ6†ƒ/†ƒ(†ƒ!†ƒ†ƒ†ƒ †ƒ†ƒþ…ƒ÷…ƒð…ƒé…ƒâ…ƒÛ…ƒÔ…ƒÍ…ƒÆ…ƒ¿…ƒ¸…ƒ±…ƒª…ƒ£…ƒœ…ƒ•…ƒŽ…ƒ‡…ƒ€…ƒy…ƒr…ƒk…ƒd…ƒ]…ƒV…ƒO…ƒH…ƒA…ƒ:…ƒ3…ƒ,…ƒ%…ƒ…ƒ…ƒ…ƒ …ƒ…ƒû„ƒô„ƒ턃愃ß„ƒØ„ƒÑ„ƒÊ„ƒă¼„ƒµ„ƒ®„ƒ§„ƒ „ƒ™„ƒ’„ƒ‹„ƒ„„ƒ}„ƒv„ƒo„ƒh„ƒa„ƒZ„ƒS„ƒL„ƒE„ƒ>„ƒ7„ƒ0„ƒ)„ƒ"„ƒ„ƒ„ƒ „ƒ„ƒÿƒƒøƒƒñƒƒꃃッ܃ƒÕƒƒ΃ƒǃƒÀƒƒ¹ƒƒ²ƒƒ«ƒƒ¤ƒƒƒƒ–ƒƒƒƒˆƒƒƒƒzƒƒsƒƒlƒƒeƒƒ^ƒƒWƒƒPƒƒIƒƒBƒƒ;ƒƒ4ƒƒ-ƒƒ&ƒƒƒƒƒƒƒƒ ƒƒƒƒü‚ƒõ‚ƒ炃à‚ƒÙ‚ƒÒ‚ƒË‚ƒÄ‚ƒ½‚ƒ¶‚ƒ¯‚ƒ¨‚ƒ¡‚ƒš‚ƒ“‚ƒŒ‚ƒ…‚ƒ~‚ƒw‚ƒp‚ƒi‚ƒb‚ƒ[‚ƒT‚ƒM‚ƒF‚ƒ?‚ƒ8‚ƒ1‚ƒ*‚ƒ#‚ƒ‚ƒ‚ƒ‚ƒ‚ƒ‚ƒùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý€ƒö€ƒ考ဃÚ€ƒÓ€ƒÌ€ƒÅ€ƒ¾€ƒ·€ƒ°€ƒ©€ƒ¢€ƒ›€ƒ”€ƒ€ƒ†€ƒ€ƒx€ƒq€ƒj€ƒc€ƒ\€ƒU€ƒN€ƒG€ƒ@€ƒ9€ƒ2€ƒ+€ƒ$€ƒ€ƒ€ƒ€ƒ€ƒ€ƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþ~ƒ÷~ƒð~ƒé~ƒâ~ƒÛ~ƒÔ~ƒÍ~ƒÆ~ƒ¿~ƒ¸~ƒ±~ƒª~ƒ£~ƒœ~ƒ•~ƒŽ~ƒ‡~ƒ€~ƒy~ƒr~ƒk~ƒd~ƒ]~ƒV~ƒO~ƒH~ƒA~ƒ:~ƒ3~ƒ,~ƒ%~ƒ~ƒ~ƒ~ƒ ~ƒ~ƒû}ƒô}ƒí}ƒæ}ƒß}ƒØ}ƒÑ}ƒÊ}ƒÃ}ƒ¼}ƒµ}ƒ®}ƒ§}ƒ }ƒ™}ƒ’}ƒ‹}ƒ„}ƒ}}ƒv}ƒo}ƒh}ƒa}ƒZ}ƒS}ƒL}ƒE}ƒ>}ƒ7}ƒ0}ƒ)}ƒ"}ƒ}ƒ}ƒ }ƒ}ƒÿ|ƒø|ƒñ|ƒê|ƒã|ƒÜ|ƒÕ|ƒÎ|ƒÇ|ƒÀ|ƒ¹|ƒ²|ƒ«|ƒ¤|ƒ|ƒ–|ƒ|ƒˆ|ƒ|ƒz|ƒs|ƒl|ƒe|ƒ^|ƒW|ƒP|ƒI|ƒB|ƒ;|ƒ4|ƒ-|ƒ&|ƒ|ƒ|ƒ|ƒ |ƒ|ƒü{ƒõ{ƒî{ƒç{ƒà{ƒÙ{ƒÒ{ƒË{ƒÄ{ƒ½{ƒ¶{ƒ¯{ƒ¨{ƒ¡{ƒš{ƒ“{ƒŒ{ƒ…{ƒ~{ƒw{ƒp{ƒi{ƒb{ƒ[{ƒT{ƒM{ƒF{ƒ?{ƒ8{ƒ1{ƒ*{ƒ#{ƒ{ƒ{ƒ{ƒ{ƒ{ƒùzƒòzƒëzƒäzƒÝzƒÖzƒÏzƒÈzƒÁzƒºzƒ³zƒ¬zƒ¥zƒžzƒ—zƒzƒ‰zƒ‚zƒ{zƒtzƒmzƒfzƒ_zƒXzƒQzƒJzƒCzƒvƒ7vƒ0vƒ)vƒ"vƒvƒvƒ vƒvƒÿuƒøuƒñuƒêuƒãuƒÜuƒÕuƒÎuƒÇuƒÀuƒ¹uƒ²uƒ«uƒ¤uƒuƒ–uƒuƒˆuƒuƒzuƒsuƒluƒeuƒ^uƒWuƒPuƒIuƒBuƒ;uƒ4uƒ-uƒ&uƒuƒuƒuƒ uƒuƒütƒõtƒîtƒçtƒàtƒÙtƒÒtƒËtƒÄtƒ½tƒ¶tƒ¯tƒ¨tƒ¡tƒštƒ“tƒŒtƒ…tƒ~tƒwtƒptƒitƒbtƒ[tƒTtƒMtƒFtƒ?tƒ8tƒ1tƒ*tƒ#tƒtƒtƒtƒtƒtƒùsƒòsƒësƒäsƒÝsƒÖsƒÏsƒÈsƒÁsƒºsƒ³sƒ¬sƒ¥sƒžsƒ—sƒsƒ‰sƒ‚sƒ{sƒtsƒmsƒfsƒ_sƒXsƒQsƒJsƒCsƒoƒ7oƒ0oƒ)oƒ"oƒoƒoƒ oƒoƒÿnƒønƒñnƒênƒãnƒÜnƒÕnƒÎnƒÇnƒÀnƒ¹nƒ²nƒ«nƒ¤nƒnƒ–nƒnƒˆnƒnƒznƒsnƒlnƒenƒ^nƒWnƒPnƒInƒBnƒ;nƒ4nƒ-nƒ&nƒnƒnƒnƒ nƒnƒümƒõmƒîmƒçmƒàmƒÙmƒÒmƒËmƒÄmƒ½mƒ¶mƒ¯mƒ¨mƒ¡mƒšmƒ“mƒŒmƒ…mƒ~mƒwmƒpmƒimƒbmƒ[mƒTmƒMmƒFmƒ?mƒ8mƒ1mƒ*mƒ#mƒmƒmƒmƒmƒmƒùlƒòlƒëlƒälƒÝlƒÖlƒÏlƒÈlƒÁlƒºlƒ³lƒ¬lƒ¥lƒžlƒ—lƒlƒ‰lƒ‚lƒ{lƒtlƒmlƒflƒ_lƒXlƒQlƒJlƒClƒhƒ7hƒ0hƒ)hƒ"hƒhƒhƒ hƒhƒÿgƒøgƒñgƒêgƒãgƒÜgƒÕgƒÎgƒÇgƒÀgƒ¹gƒ²gƒ«gƒ¤gƒgƒ–gƒgƒˆgƒgƒzgƒsgƒlgƒegƒ^gƒWgƒPgƒIgƒBgƒ;gƒ4gƒ-gƒ&gƒgƒgƒgƒ gƒgƒüfƒõfƒîfƒçfƒàfƒÙfƒÒfƒËfƒÄfƒ½fƒ¶fƒ¯fƒ¨fƒ¡fƒšfƒ“fƒŒfƒ…fƒ~fƒwfƒpfƒifƒbfƒ[fƒTfƒMfƒFfƒ?fƒ8fƒ1fƒ*fƒ#fƒfƒfƒfƒfƒfƒùeƒòeƒëeƒäeƒÝeƒÖeƒÏeƒÈeƒÁeƒºeƒ³eƒ¬eƒ¥eƒžeƒ—eƒeƒ‰eƒ‚eƒ{eƒteƒmeƒfeƒ_eƒXeƒQeƒJeƒCeƒaƒ7aƒ0aƒ)aƒ"aƒaƒaƒ aƒaƒÿ`ƒø`ƒñ`ƒê`ƒã`ƒÜ`ƒÕ`ƒÎ`ƒÇ`ƒÀ`ƒ¹`ƒ²`ƒ«`ƒ¤`ƒ`ƒ–`ƒ`ƒˆ`ƒ`ƒz`ƒs`ƒl`ƒe`ƒ^`ƒW`ƒP`ƒI`ƒB`ƒ;`ƒ4`ƒ-`ƒ&`ƒ`ƒ`ƒ`ƒ `ƒ`ƒü_ƒõ_ƒî_ƒç_ƒà_ƒÙ_ƒÒ_ƒË_ƒÄ_ƒ½_ƒ¶_ƒ¯_ƒ¨_ƒ¡_ƒš_ƒ“_ƒŒ_ƒ…_ƒ~_ƒw_ƒp_ƒi_ƒb_ƒ[_ƒT_ƒM_ƒF_ƒ?_ƒ8_ƒ1_ƒ*_ƒ#_ƒ_ƒ_ƒ_ƒ_ƒ_ƒù^ƒò^ƒë^ƒä^ƒÝ^ƒÖ^ƒÏ^ƒÈ^ƒÁ^ƒº^ƒ³^ƒ¬^ƒ¥^ƒž^ƒ—^ƒ^ƒ‰^ƒ‚^ƒ{^ƒt^ƒm^ƒf^ƒ_^ƒX^ƒQ^ƒJ^ƒC^ƒ<^ƒ5^ƒ.^ƒ'^ƒ ^ƒ^ƒ^ƒ ^ƒ^ƒý]ƒö]ƒï]ƒè]ƒá]ƒÚ]ƒÓ]ƒÌ]ƒÅ]ƒ¾]ƒ·]ƒ°]ƒ©]ƒ¢]ƒ›]ƒ”]ƒ]ƒ†]ƒ]ƒx]ƒq]ƒj]ƒc]ƒ\]ƒU]ƒN]ƒG]ƒ@]ƒ9]ƒ2]ƒ+]ƒ$]ƒ]ƒ]ƒ]ƒ]ƒ]ƒú\ƒó\ƒì\ƒå\ƒÞ\ƒ×\ƒÐ\ƒÉ\ƒÂ\ƒ»\ƒ´\ƒ­\ƒ¦\ƒŸ\ƒ˜\ƒ‘\ƒŠ\ƒƒ\ƒ|\ƒu\ƒn\ƒg\ƒ`\ƒY\ƒR\ƒK\ƒD\ƒ=\ƒ6\ƒ/\ƒ(\ƒ!\ƒ\ƒ\ƒ \ƒ\ƒþ[ƒ÷[ƒð[ƒé[ƒâ[ƒÛ[ƒÔ[ƒÍ[ƒÆ[ƒ¿[ƒ¸[ƒ±[ƒª[ƒ£[ƒœ[ƒ•[ƒŽ[ƒ‡[ƒ€[ƒy[ƒr[ƒk[ƒd[ƒ][ƒV[ƒO[ƒH[ƒA[ƒ:[ƒ3[ƒ,[ƒ%[ƒ[ƒ[ƒ[ƒ [ƒ[ƒûZƒôZƒíZƒæZƒßZƒØZƒÑZƒÊZƒÃZƒ¼ZƒµZƒ®Zƒ§Zƒ Zƒ™Zƒ’Zƒ‹Zƒ„Zƒ}ZƒvZƒoZƒhZƒaZƒZZƒSZƒLZƒEZƒ>Zƒ7Zƒ0Zƒ)Zƒ"ZƒZƒZƒ ZƒZƒÿYƒøYƒñYƒêYƒãYƒÜYƒÕYƒÎYƒÇYƒÀYƒ¹Yƒ²Yƒ«Yƒ¤YƒYƒ–YƒYƒˆYƒYƒzYƒsYƒlYƒeYƒ^YƒWYƒPYƒIYƒBYƒ;Yƒ4Yƒ-Yƒ&YƒYƒYƒYƒ YƒYƒüXƒõXƒîXƒçXƒàXƒÙXƒÒXƒËXƒÄXƒ½Xƒ¶Xƒ¯Xƒ¨Xƒ¡XƒšXƒ“XƒŒXƒ…Xƒ~XƒwXƒpXƒiXƒbXƒ[XƒTXƒMXƒFXƒ?Xƒ8Xƒ1Xƒ*Xƒ#XƒXƒXƒXƒXƒXƒùWƒòWƒëWƒäWƒÝWƒÖWƒÏWƒÈWƒÁWƒºWƒ³Wƒ¬Wƒ¥WƒžWƒ—WƒWƒ‰Wƒ‚Wƒ{WƒtWƒmWƒfWƒ_WƒXWƒQWƒJWƒCWƒSƒ7Sƒ0Sƒ)Sƒ"SƒSƒSƒ SƒSƒÿRƒøRƒñRƒêRƒãRƒÜRƒÕRƒÎRƒÇRƒÀRƒ¹Rƒ²Rƒ«Rƒ¤RƒRƒ–RƒRƒˆRƒRƒzRƒsRƒlRƒeRƒ^RƒWRƒPRƒIRƒBRƒ;Rƒ4Rƒ-Rƒ&RƒRƒRƒRƒ RƒRƒüQƒõQƒîQƒçQƒàQƒÙQƒÒQƒËQƒÄQƒ½Qƒ¶Qƒ¯Qƒ¨Qƒ¡QƒšQƒ“QƒŒQƒ…Qƒ~QƒwQƒpQƒiQƒbQƒ[QƒTQƒMQƒFQƒ?Qƒ8Qƒ1Qƒ*Qƒ#QƒQƒQƒQƒQƒQƒùPƒòPƒëPƒäPƒÝPƒÖPƒÏPƒÈPƒÁPƒºPƒ³Pƒ¬Pƒ¥PƒžPƒ—PƒPƒ‰Pƒ‚Pƒ{PƒtPƒmPƒfPƒ_PƒXPƒQPƒJPƒCPƒLƒ7Lƒ0Lƒ)Lƒ"LƒLƒLƒ LƒLƒÿKƒøKƒñKƒêKƒãKƒÜKƒÕKƒÎKƒÇKƒÀKƒ¹Kƒ²Kƒ«Kƒ¤KƒKƒ–KƒKƒˆKƒKƒzKƒsKƒlKƒeKƒ^KƒWKƒPKƒIKƒBKƒ;Kƒ4Kƒ-Kƒ&KƒKƒKƒKƒ KƒKƒüJƒõJƒîJƒçJƒàJƒÙJƒÒJƒËJƒÄJƒ½Jƒ¶Jƒ¯Jƒ¨Jƒ¡JƒšJƒ“JƒŒJƒ…Jƒ~JƒwJƒpJƒiJƒbJƒ[JƒTJƒMJƒFJƒ?Jƒ8Jƒ1Jƒ*Jƒ#JƒJƒJƒJƒJƒJƒùIƒòIƒëIƒäIƒÝIƒÖIƒÏIƒÈIƒÁIƒºIƒ³Iƒ¬Iƒ¥IƒžIƒ—IƒIƒ‰Iƒ‚Iƒ{IƒtIƒmIƒfIƒ_IƒXIƒQIƒJIƒCIƒEƒ7Eƒ0Eƒ)Eƒ"EƒEƒEƒ EƒEƒÿDƒøDƒñDƒêDƒãDƒÜDƒÕDƒÎDƒÇDƒÀDƒ¹Dƒ²Dƒ«Dƒ¤DƒDƒ–DƒDƒˆDƒDƒzDƒsDƒlDƒeDƒ^DƒWDƒPDƒIDƒBDƒ;Dƒ4Dƒ-Dƒ&DƒDƒDƒDƒ DƒDƒüCƒõCƒîCƒçCƒàCƒÙCƒÒCƒËCƒÄCƒ½Cƒ¶Cƒ¯Cƒ¨Cƒ¡CƒšCƒ“CƒŒCƒ…Cƒ~CƒwCƒpCƒiCƒbCƒ[CƒTCƒMCƒFCƒ?Cƒ8Cƒ1Cƒ*Cƒ#CƒCƒCƒCƒCƒCƒùBƒòBƒëBƒäBƒÝBƒÖBƒÏBƒÈBƒÁBƒºBƒ³Bƒ¬Bƒ¥BƒžBƒ—BƒBƒ‰Bƒ‚Bƒ{BƒtBƒmBƒfBƒ_BƒXBƒQBƒJBƒCBƒƒô>ƒí>ƒæ>ƒß>ƒØ>ƒÑ>ƒÊ>ƒÃ>ƒ¼>ƒµ>ƒ®>ƒ§>ƒ >ƒ™>ƒ’>ƒ‹>ƒ„>ƒ}>ƒv>ƒo>ƒh>ƒa>ƒZ>ƒS>ƒL>ƒE>ƒ>>ƒ7>ƒ0>ƒ)>ƒ">ƒ>ƒ>ƒ >ƒ>ƒÿ=ƒø=ƒñ=ƒê=ƒã=ƒÜ=ƒÕ=ƒÎ=ƒÇ=ƒÀ=ƒ¹=ƒ²=ƒ«=ƒ¤=ƒ=ƒ–=ƒ=ƒˆ=ƒ=ƒz=ƒs=ƒl=ƒe=ƒ^=ƒW=ƒP=ƒI=ƒB=ƒ;=ƒ4=ƒ-=ƒ&=ƒ=ƒ=ƒ=ƒ =ƒ=ƒü<ƒõ<ƒî<ƒç<ƒà<ƒÙ<ƒÒ<ƒË<ƒÄ<ƒ½<ƒ¶<ƒ¯<ƒ¨<ƒ¡<ƒš<ƒ“<ƒŒ<ƒ…<ƒ~<ƒw<ƒp<ƒi<ƒb<ƒ[<ƒT<ƒM<ƒF<ƒ?<ƒ8<ƒ1<ƒ*<ƒ#<ƒ<ƒ<ƒ<ƒ<ƒ<ƒù;ƒò;ƒë;ƒä;ƒÝ;ƒÖ;ƒÏ;ƒÈ;ƒÁ;ƒº;ƒ³;ƒ¬;ƒ¥;ƒž;ƒ—;ƒ;ƒ‰;ƒ‚;ƒ{;ƒt;ƒm;ƒf;ƒ_;ƒX;ƒQ;ƒJ;ƒC;ƒ<;ƒ5;ƒ.;ƒ';ƒ ;ƒ;ƒ;ƒ ;ƒ;ƒý:ƒö:ƒï:ƒè:ƒá:ƒÚ:ƒÓ:ƒÌ:ƒÅ:ƒ¾:ƒ·:ƒ°:ƒ©:ƒ¢:ƒ›:ƒ”:ƒ:ƒ†:ƒ:ƒx:ƒq:ƒj:ƒc:ƒ\:ƒU:ƒN:ƒG:ƒ@:ƒ9:ƒ2:ƒ+:ƒ$:ƒ:ƒ:ƒ:ƒ:ƒ:ƒú9ƒó9ƒì9ƒå9ƒÞ9ƒ×9ƒÐ9ƒÉ9ƒÂ9ƒ»9ƒ´9ƒ­9ƒ¦9ƒŸ9ƒ˜9ƒ‘9ƒŠ9ƒƒ9ƒ|9ƒu9ƒn9ƒg9ƒ`9ƒY9ƒR9ƒK9ƒD9ƒ=9ƒ69ƒ/9ƒ(9ƒ!9ƒ9ƒ9ƒ 9ƒ9ƒþ8ƒ÷8ƒð8ƒé8ƒâ8ƒÛ8ƒÔ8ƒÍ8ƒÆ8ƒ¿8ƒ¸8ƒ±8ƒª8ƒ£8ƒœ8ƒ•8ƒŽ8ƒ‡8ƒ€8ƒy8ƒr8ƒk8ƒd8ƒ]8ƒV8ƒO8ƒH8ƒA8ƒ:8ƒ38ƒ,8ƒ%8ƒ8ƒ8ƒ8ƒ 8ƒ8ƒû7ƒô7ƒí7ƒæ7ƒß7ƒØ7ƒÑ7ƒÊ7ƒÃ7ƒ¼7ƒµ7ƒ®7ƒ§7ƒ 7ƒ™7ƒ’7ƒ‹7ƒ„7ƒ}7ƒv7ƒo7ƒh7ƒa7ƒZ7ƒS7ƒL7ƒE7ƒ>7ƒ77ƒ07ƒ)7ƒ"7ƒ7ƒ7ƒ 7ƒ7ƒÿ6ƒø6ƒñ6ƒê6ƒã6ƒÜ6ƒÕ6ƒÎ6ƒÇ6ƒÀ6ƒ¹6ƒ²6ƒ«6ƒ¤6ƒ6ƒ–6ƒ6ƒˆ6ƒ6ƒz6ƒs6ƒl6ƒe6ƒ^6ƒW6ƒP6ƒI6ƒB6ƒ;6ƒ46ƒ-6ƒ&6ƒ6ƒ6ƒ6ƒ 6ƒ6ƒü5ƒõ5ƒî5ƒç5ƒà5ƒÙ5ƒÒ5ƒË5ƒÄ5ƒ½5ƒ¶5ƒ¯5ƒ¨5ƒ¡5ƒš5ƒ“5ƒŒ5ƒ…5ƒ~5ƒw5ƒp5ƒi5ƒb5ƒ[5ƒT5ƒM5ƒF5ƒ?5ƒ85ƒ15ƒ*5ƒ#5ƒ5ƒ5ƒ5ƒ5ƒ5ƒù4ƒò4ƒë4ƒä4ƒÝ4ƒÖ4ƒÏ4ƒÈ4ƒÁ4ƒº4ƒ³4ƒ¬4ƒ¥4ƒž4ƒ—4ƒ4ƒ‰4ƒ‚4ƒ{4ƒt4ƒm4ƒf4ƒ_4ƒX4ƒQ4ƒJ4ƒC4ƒ<4ƒ54ƒ.4ƒ'4ƒ 4ƒ4ƒ4ƒ 4ƒ4ƒý3ƒö3ƒï3ƒè3ƒá3ƒÚ3ƒÓ3ƒÌ3ƒÅ3ƒ¾3ƒ·3ƒ°3ƒ©3ƒ¢3ƒ›3ƒ”3ƒ3ƒ†3ƒ3ƒx3ƒq3ƒj3ƒc3ƒ\3ƒU3ƒN3ƒG3ƒ@3ƒ93ƒ23ƒ+3ƒ$3ƒ3ƒ3ƒ3ƒ3ƒ3ƒú2ƒó2ƒì2ƒå2ƒÞ2ƒ×2ƒÐ2ƒÉ2ƒÂ2ƒ»2ƒ´2ƒ­2ƒ¦2ƒŸ2ƒ˜2ƒ‘2ƒŠ2ƒƒ2ƒ|2ƒu2ƒn2ƒg2ƒ`2ƒY2ƒR2ƒK2ƒD2ƒ=2ƒ62ƒ/2ƒ(2ƒ!2ƒ2ƒ2ƒ 2ƒ2ƒþ1ƒ÷1ƒð1ƒé1ƒâ1ƒÛ1ƒÔ1ƒÍ1ƒÆ1ƒ¿1ƒ¸1ƒ±1ƒª1ƒ£1ƒœ1ƒ•1ƒŽ1ƒ‡1ƒ€1ƒy1ƒr1ƒk1ƒd1ƒ]1ƒV1ƒO1ƒH1ƒA1ƒ:1ƒ31ƒ,1ƒ%1ƒ1ƒ1ƒ1ƒ 1ƒ1ƒû0ƒô0ƒí0ƒæ0ƒß0ƒØ0ƒÑ0ƒÊ0ƒÃ0ƒ¼0ƒµ0ƒ®0ƒ§0ƒ 0ƒ™0ƒ’0ƒ‹0ƒ„0ƒ}0ƒv0ƒo0ƒh0ƒa0ƒZ0ƒS0ƒL0ƒE0ƒ>0ƒ70ƒ00ƒ)0ƒ"0ƒ0ƒ0ƒ 0ƒ0ƒÿ/ƒø/ƒñ/ƒê/ƒã/ƒÜ/ƒÕ/ƒÎ/ƒÇ/ƒÀ/ƒ¹/ƒ²/ƒ«/ƒ¤/ƒ/ƒ–/ƒ/ƒˆ/ƒ/ƒz/ƒs/ƒl/ƒe/ƒ^/ƒW/ƒP/ƒI/ƒB/ƒ;/ƒ4/ƒ-/ƒ&/ƒ/ƒ/ƒ/ƒ /ƒ/ƒü.ƒõ.ƒî.ƒç.ƒà.ƒÙ.ƒÒ.ƒË.ƒÄ.ƒ½.ƒ¶.ƒ¯.ƒ¨.ƒ¡.ƒš.ƒ“.ƒŒ.ƒ….ƒ~.ƒw.ƒp.ƒi.ƒb.ƒ[.ƒT.ƒM.ƒF.ƒ?.ƒ8.ƒ1.ƒ*.ƒ#.ƒ.ƒ.ƒ.ƒ.ƒ.ƒù-ƒò-ƒë-ƒä-ƒÝ-ƒÖ-ƒÏ-ƒÈ-ƒÁ-ƒº-ƒ³-ƒ¬-ƒ¥-ƒž-ƒ—-ƒ-ƒ‰-ƒ‚-ƒ{-ƒt-ƒm-ƒf-ƒ_-ƒX-ƒQ-ƒJ-ƒC-ƒ<-ƒ5-ƒ.-ƒ'-ƒ -ƒ-ƒ-ƒ -ƒ-ƒý,ƒö,ƒï,ƒè,ƒá,ƒÚ,ƒÓ,ƒÌ,ƒÅ,ƒ¾,ƒ·,ƒ°,ƒ©,ƒ¢,ƒ›,ƒ”,ƒ,ƒ†,ƒ,ƒx,ƒq,ƒj,ƒc,ƒ\,ƒU,ƒN,ƒG,ƒ@,ƒ9,ƒ2,ƒ+,ƒ$,ƒ,ƒ,ƒ,ƒ,ƒ,ƒú+ƒó+ƒì+ƒå+ƒÞ+ƒ×+ƒÐ+ƒÉ+ƒÂ+ƒ»+ƒ´+ƒ­+ƒ¦+ƒŸ+ƒ˜+ƒ‘+ƒŠ+ƒƒ+ƒ|+ƒu+ƒn+ƒg+ƒ`+ƒY+ƒR+ƒK+ƒD+ƒ=+ƒ6+ƒ/+ƒ(+ƒ!+ƒ+ƒ+ƒ +ƒ+ƒþ*ƒ÷*ƒð*ƒé*ƒâ*ƒÛ*ƒÔ*ƒÍ*ƒÆ*ƒ¿*ƒ¸*ƒ±*ƒª*ƒ£*ƒœ*ƒ•*ƒŽ*ƒ‡*ƒ€*ƒy*ƒr*ƒk*ƒd*ƒ]*ƒV*ƒO*ƒH*ƒA*ƒ:*ƒ3*ƒ,*ƒ%*ƒ*ƒ*ƒ*ƒ *ƒ*ƒû)ƒô)ƒí)ƒæ)ƒß)ƒØ)ƒÑ)ƒÊ)ƒÃ)ƒ¼)ƒµ)ƒ®)ƒ§)ƒ )ƒ™)ƒ’)ƒ‹)ƒ„)ƒ})ƒv)ƒo)ƒh)ƒa)ƒZ)ƒS)ƒL)ƒE)ƒ>)ƒ7)ƒ0)ƒ))ƒ")ƒ)ƒ)ƒ )ƒ)ƒÿ(ƒø(ƒñ(ƒê(ƒã(ƒÜ(ƒÕ(ƒÎ(ƒÇ(ƒÀ(ƒ¹(ƒ²(ƒ«(ƒ¤(ƒ(ƒ–(ƒ(ƒˆ(ƒ(ƒz(ƒs(ƒl(ƒe(ƒ^(ƒW(ƒP(ƒI(ƒB(ƒ;(ƒ4(ƒ-(ƒ&(ƒ(ƒ(ƒ(ƒ (ƒ(ƒü'ƒõ'ƒî'ƒç'ƒà'ƒÙ'ƒÒ'ƒË'ƒÄ'ƒ½'ƒ¶'ƒ¯'ƒ¨'ƒ¡'ƒš'ƒ“'ƒŒ'ƒ…'ƒ~'ƒw'ƒp'ƒi'ƒb'ƒ['ƒT'ƒM'ƒF'ƒ?'ƒ8'ƒ1'ƒ*'ƒ#'ƒ'ƒ'ƒ'ƒ'ƒ'ƒù&ƒò&ƒë&ƒä&ƒÝ&ƒÖ&ƒÏ&ƒÈ&ƒÁ&ƒº&ƒ³&ƒ¬&ƒ¥&ƒž&ƒ—&ƒ&ƒ‰&ƒ‚&ƒ{&ƒt&ƒm&ƒf&ƒ_&ƒX&ƒQ&ƒJ&ƒC&ƒ<&ƒ5&ƒ.&ƒ'&ƒ &ƒ&ƒ&ƒ &ƒ&ƒý%ƒö%ƒï%ƒè%ƒá%ƒÚ%ƒÓ%ƒÌ%ƒÅ%ƒ¾%ƒ·%ƒ°%ƒ©%ƒ¢%ƒ›%ƒ”%ƒ%ƒ†%ƒ%ƒx%ƒq%ƒj%ƒc%ƒ\%ƒU%ƒN%ƒG%ƒ@%ƒ9%ƒ2%ƒ+%ƒ$%ƒ%ƒ%ƒ%ƒ%ƒ%ƒú$ƒó$ƒì$ƒå$ƒÞ$ƒ×$ƒÐ$ƒÉ$ƒÂ$ƒ»$ƒ´$ƒ­$ƒ¦$ƒŸ$ƒ˜$ƒ‘$ƒŠ$ƒƒ$ƒ|$ƒu$ƒn$ƒg$ƒ`$ƒY$ƒR$ƒK$ƒD$ƒ=$ƒ6$ƒ/$ƒ($ƒ!$ƒ$ƒ$ƒ $ƒ$ƒþ#ƒ÷#ƒð#ƒé#ƒâ#ƒÛ#ƒÔ#ƒÍ#ƒÆ#ƒ¿#ƒ¸#ƒ±#ƒª#ƒ£#ƒœ#ƒ•#ƒŽ#ƒ‡#ƒ€#ƒy#ƒr#ƒk#ƒd#ƒ]#ƒV#ƒO#ƒH#ƒA#ƒ:#ƒ3#ƒ,#ƒ%#ƒ#ƒ#ƒ#ƒ #ƒ#ƒû"ƒô"ƒí"ƒæ"ƒß"ƒØ"ƒÑ"ƒÊ"ƒÃ"ƒ¼"ƒµ"ƒ®"ƒ§"ƒ "ƒ™"ƒ’"ƒ‹"ƒ„"ƒ}"ƒv"ƒo"ƒh"ƒa"ƒZ"ƒS"ƒL"ƒE"ƒ>"ƒ7"ƒ0"ƒ)"ƒ""ƒ"ƒ"ƒ "ƒ"ƒÿ!ƒø!ƒñ!ƒê!ƒã!ƒÜ!ƒÕ!ƒÎ!ƒÇ!ƒÀ!ƒ¹!ƒ²!ƒ«!ƒ¤!ƒ!ƒ–!ƒ!ƒˆ!ƒ!ƒz!ƒs!ƒl!ƒe!ƒ^!ƒW!ƒP!ƒI!ƒB!ƒ;!ƒ4!ƒ-!ƒ&!ƒ!ƒ!ƒ!ƒ !ƒ!ƒü ƒõ ƒî ƒç ƒà ƒÙ ƒÒ ƒË ƒÄ ƒ½ ƒ¶ ƒ¯ ƒ¨ ƒ¡ ƒš ƒ“ ƒŒ ƒ… ƒ~ ƒw ƒp ƒi ƒb ƒ[ ƒT ƒM ƒF ƒ? ƒ8 ƒ1 ƒ* ƒ# ƒ ƒ ƒ ƒ ƒ ƒùƒòƒëƒäƒÝƒÖƒÏƒÈƒÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýƒöƒïƒèƒáƒÚƒÓƒÌƒÅƒ¾ƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþƒ÷ƒðƒéƒâƒÛƒÔƒÍƒÆƒ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒûƒôƒíƒæƒßƒØƒÑƒÊƒÃƒ¼ƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿƒøƒñƒêƒãƒÜƒÕƒÎƒÇƒÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒüƒõƒîƒçƒàƒÙƒÒƒËƒÄƒ½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒùƒòƒëƒäƒÝƒÖƒÏƒÈƒÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýƒöƒïƒèƒáƒÚƒÓƒÌƒÅƒ¾ƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþƒ÷ƒðƒéƒâƒÛƒÔƒÍƒÆƒ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒûƒôƒíƒæƒßƒØƒÑƒÊƒÃƒ¼ƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿƒøƒñƒêƒãƒÜƒÕƒÎƒÇƒÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒüƒõƒîƒçƒàƒÙƒÒƒËƒÄƒ½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒùƒòƒëƒäƒÝƒÖƒÏƒÈƒÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýƒöƒïƒèƒáƒÚƒÓƒÌƒÅƒ¾ƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþƒ÷ƒðƒéƒâƒÛƒÔƒÍƒÆƒ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒû ƒô ƒí ƒæ ƒß ƒØ ƒÑ ƒÊ ƒà ƒ¼ ƒµ ƒ® ƒ§ ƒ  ƒ™ ƒ’ ƒ‹ ƒ„ ƒ} ƒv ƒo ƒh ƒa ƒZ ƒS ƒL ƒE ƒ> ƒ7 ƒ0 ƒ) ƒ" ƒ ƒ ƒ ƒ ƒÿ ƒø ƒñ ƒê ƒã ƒÜ ƒÕ ƒÎ ƒÇ ƒÀ ƒ¹ ƒ² ƒ« ƒ¤ ƒ ƒ– ƒ ƒˆ ƒ ƒz ƒs ƒl ƒe ƒ^ ƒW ƒP ƒI ƒB ƒ; ƒ4 ƒ- ƒ& ƒ ƒ ƒ ƒ ƒ ƒü ƒõ ƒî ƒç ƒà ƒÙ ƒÒ ƒË ƒÄ ƒ½ ƒ¶ ƒ¯ ƒ¨ ƒ¡ ƒš ƒ“ ƒŒ ƒ… ƒ~ ƒw ƒp ƒi ƒb ƒ[ ƒT ƒM ƒF ƒ? ƒ8 ƒ1 ƒ* ƒ# ƒ ƒ ƒ ƒ ƒ ƒù ƒò ƒë ƒä ƒÝ ƒÖ ƒÏ ƒÈ ƒÁ ƒº ƒ³ ƒ¬ ƒ¥ ƒž ƒ— ƒ ƒ‰ ƒ‚ ƒ{ ƒt ƒm ƒf ƒ_ ƒX ƒQ ƒJ ƒC ƒ< ƒ5 ƒ. ƒ' ƒ ƒ ƒ ƒ ƒ ƒý ƒö ƒï ƒè ƒá ƒÚ ƒÓ ƒÌ ƒÅ ƒ¾ ƒ· ƒ° ƒ© ƒ¢ ƒ› ƒ” ƒ ƒ† ƒ ƒx ƒq ƒj ƒc ƒ\ ƒU ƒN ƒG ƒ@ ƒ9 ƒ2 ƒ+ ƒ$ ƒ ƒ ƒ ƒ ƒ ƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþƒ÷ƒðƒéƒâƒÛƒÔƒÍƒÆƒ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒûƒôƒíƒæƒßƒØƒÑƒÊƒÃƒ¼ƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿƒøƒñƒêƒãƒÜƒÕƒÎƒÇƒÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒüƒõƒîƒçƒàƒÙƒÒƒËƒÄƒ½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒùƒòƒëƒäƒÝƒÖƒÏƒÈƒÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒýƒöƒïƒèƒáƒÚƒÓƒÌƒÅƒ¾ƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒúƒóƒìƒåƒÞƒ×ƒÐƒÉƒÂƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþƒ÷ƒðƒéƒâƒÛƒÔƒ̓ƃ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒûÿ‚ôÿ‚íÿ‚æÿ‚ßÿ‚Øÿ‚Ñÿ‚Êÿ‚Ãÿ‚¼ÿ‚µÿ‚®ÿ‚§ÿ‚ ÿ‚™ÿ‚’ÿ‚‹ÿ‚„ÿ‚}ÿ‚vÿ‚oÿ‚hÿ‚aÿ‚Zÿ‚Sÿ‚Lÿ‚Eÿ‚>ÿ‚7ÿ‚0ÿ‚)ÿ‚"ÿ‚ÿ‚ÿ‚ ÿ‚ÿ‚ÿþ‚øþ‚ñþ‚êþ‚ãþ‚Üþ‚Õþ‚Îþ‚Çþ‚Àþ‚¹þ‚²þ‚«þ‚¤þ‚þ‚–þ‚þ‚ˆþ‚þ‚zþ‚sþ‚lþ‚eþ‚^þ‚Wþ‚Pþ‚Iþ‚Bþ‚;þ‚4þ‚-þ‚&þ‚þ‚þ‚þ‚ þ‚þ‚üý‚õý‚îý‚çý‚àý‚Ùý‚Òý‚Ëý‚Äý‚½ý‚¶ý‚¯ý‚¨ý‚¡ý‚šý‚“ý‚Œý‚…ý‚~ý‚wý‚pý‚iý‚bý‚[ý‚Tý‚Mý‚Fý‚?ý‚8ý‚1ý‚*ý‚#ý‚ý‚ý‚ý‚ý‚ý‚ùü‚òü‚ëü‚äü‚Ýü‚Öü‚Ïü‚Èü‚Áü‚ºü‚³ü‚¬ü‚¥ü‚žü‚—ü‚ü‚‰ü‚‚ü‚{ü‚tü‚mü‚fü‚_ü‚Xü‚Qü‚Jü‚Cü‚<ü‚5ü‚.ü‚'ü‚ ü‚ü‚ü‚ ü‚ü‚ýû‚öû‚ïû‚èû‚áû‚Úû‚Óû‚Ìû‚Åû‚¾û‚·û‚°û‚©û‚¢û‚›û‚”û‚û‚†û‚û‚xû‚qû‚jû‚cû‚\û‚Uû‚Nû‚Gû‚@û‚9û‚2û‚+û‚$û‚û‚û‚û‚û‚û‚úú‚óú‚ìú‚åú‚Þú‚×ú‚Ðú‚Éú‚Âú‚»ú‚´ú‚­ú‚¦ú‚Ÿú‚˜ú‚‘ú‚Šú‚ƒú‚|ú‚uú‚nú‚gú‚`ú‚Yú‚Rú‚Kú‚Dú‚=ú‚6ú‚/ú‚(ú‚!ú‚ú‚ú‚ ú‚ú‚þù‚÷ù‚ðù‚éù‚âù‚Ûù‚Ôù‚Íù‚Æù‚¿ù‚¸ù‚±ù‚ªù‚£ù‚œù‚•ù‚Žù‚‡ù‚€ù‚yù‚rù‚kù‚dù‚]ù‚Vù‚Où‚Hù‚Aù‚:ù‚3ù‚,ù‚%ù‚ù‚ù‚ù‚ ù‚ù‚ûø‚ôø‚íø‚æø‚ßø‚Øø‚Ñø‚Êø‚Ãø‚¼ø‚µø‚®ø‚§ø‚ ø‚™ø‚’ø‚‹ø‚„ø‚}ø‚vø‚oø‚hø‚aø‚Zø‚Sø‚Lø‚Eø‚>ø‚7ø‚0ø‚)ø‚"ø‚ø‚ø‚ ø‚ø‚ÿ÷‚ø÷‚ñ÷‚ê÷‚ã÷‚Ü÷‚Õ÷‚Î÷‚Ç÷‚À÷‚¹÷‚²÷‚«÷‚¤÷‚÷‚–÷‚÷‚ˆ÷‚÷‚z÷‚s÷‚l÷‚e÷‚^÷‚W÷‚P÷‚I÷‚B÷‚;÷‚4÷‚-÷‚&÷‚÷‚÷‚÷‚ ÷‚÷‚üö‚õö‚îö‚çö‚àö‚Ùö‚Òö‚Ëö‚Äö‚½ö‚¶ö‚¯ö‚¨ö‚¡ö‚šö‚“ö‚Œö‚…ö‚~ö‚wö‚pö‚iö‚bö‚[ö‚Tö‚Mö‚Fö‚?ö‚8ö‚1ö‚*ö‚#ö‚ö‚ö‚ö‚ö‚ö‚ùõ‚òõ‚ëõ‚äõ‚Ýõ‚Öõ‚Ïõ‚Èõ‚Áõ‚ºõ‚³õ‚¬õ‚¥õ‚žõ‚—õ‚õ‚‰õ‚‚õ‚{õ‚tõ‚mõ‚fõ‚_õ‚Xõ‚Qõ‚Jõ‚Cõ‚<õ‚5õ‚.õ‚'õ‚ õ‚õ‚õ‚ õ‚õ‚ýô‚öô‚ïô‚èô‚áô‚Úô‚Óô‚Ìô‚Åô‚¾ô‚·ô‚°ô‚©ô‚¢ô‚›ô‚”ô‚ô‚†ô‚ô‚xô‚qô‚jô‚cô‚\ô‚Uô‚Nô‚Gô‚@ô‚9ô‚2ô‚+ô‚$ô‚ô‚ô‚ô‚ô‚ô‚úó‚óó‚ìó‚åó‚Þó‚×ó‚Ðó‚Éó‚Âó‚»ó‚´ó‚­ó‚¦ó‚Ÿó‚˜ó‚‘ó‚Šó‚ƒó‚|ó‚uó‚nó‚gó‚`ó‚Yó‚Ró‚Kó‚Dó‚=ó‚6ó‚/ó‚(ó‚!ó‚ó‚ó‚ ó‚ó‚þò‚÷ò‚ðò‚éò‚âò‚Ûò‚Ôò‚Íò‚Æò‚¿ò‚¸ò‚±ò‚ªò‚£ò‚œò‚•ò‚Žò‚‡ò‚€ò‚yò‚rò‚kò‚dò‚]ò‚Vò‚Oò‚Hò‚Aò‚:ò‚3ò‚,ò‚%ò‚ò‚ò‚ò‚ ò‚ò‚ûñ‚ôñ‚íñ‚æñ‚ßñ‚Øñ‚Ññ‚Êñ‚Ãñ‚¼ñ‚µñ‚®ñ‚§ñ‚ ñ‚™ñ‚’ñ‚‹ñ‚„ñ‚}ñ‚vñ‚oñ‚hñ‚añ‚Zñ‚Sñ‚Lñ‚Eñ‚>ñ‚7ñ‚0ñ‚)ñ‚"ñ‚ñ‚ñ‚ ñ‚ñ‚ÿð‚øð‚ñð‚êð‚ãð‚Üð‚Õð‚Îð‚Çð‚Àð‚¹ð‚²ð‚«ð‚¤ð‚ð‚–ð‚ð‚ˆð‚ð‚zð‚sð‚lð‚eð‚^ð‚Wð‚Pð‚Ið‚Bð‚;ð‚4ð‚-ð‚&ð‚ð‚ð‚ð‚ ð‚ð‚üï‚õï‚îï‚çï‚àï‚Ùï‚Òï‚Ëï‚Äï‚~ï‚wï‚pï‚iï‚bï‚[ï‚Tï‚Mï‚Fï‚?ï‚8ï‚1ï‚*ï‚#ï‚ï‚ï‚ï‚ï‚ï‚ùî‚òî‚ëî‚äî‚Ýî‚Öî‚Ïî‚Èî‚Áî‚î‚{î‚tî‚mî‚fî‚_î‚Xî‚Qî‚Jî‚Cî‚<î‚5î‚.î‚'î‚ î‚î‚î‚ î‚î‚ýí‚öí‚ïí‚èí‚áí‚Úí‚Óí‚Ìí‚Å킾킷킰킩킢킛킔í‚킆í‚í‚xí‚qí‚jí‚cí‚\í‚Uí‚Ní‚Gí‚@í‚9í‚2í‚+í‚$í‚í‚í‚í‚í‚í‚úì‚óì‚ìì‚åì‚Þì‚×ì‚Ðì‚Éì‚Â삻살삭삦삟삘삑삊삃ì‚|ì‚uì‚nì‚gì‚`ì‚Yì‚Rì‚Kì‚Dì‚=ì‚6ì‚/ì‚(ì‚!ì‚ì‚ì‚ ì‚ì‚þë‚÷ë‚ðë‚éë‚âë‚Ûë‚Ôë‚Íë‚Æë‚¿ë‚¸ë‚±ë‚ªë‚£ë‚œë‚•ë‚Žë‚‡ë‚€ë‚yë‚rë‚kë‚dë‚]ë‚Vë‚Oë‚Hë‚Aë‚:ë‚3ë‚,ë‚%ë‚ë‚ë‚ë‚ ë‚ë‚ûê‚ôê‚íê‚æê‚ßê‚Øê‚Ñê‚Êê‚Ãꂼꂵꂮꂧꂠꂙꂒꂋꂄê‚}ê‚vê‚oê‚hê‚aê‚Zê‚Sê‚Lê‚Eê‚>ê‚7ê‚0ê‚)ê‚"ê‚ê‚ê‚ ê‚ê‚ÿ邸é‚ñé‚êé‚ãé‚Üé‚Õé‚Îé‚Çé‚À邹邲邫邤é‚é‚–é‚邈é‚é‚zé‚sé‚lé‚eé‚^é‚Wé‚Pé‚Ié‚Bé‚;é‚4é‚-é‚&é‚é‚é‚é‚ é‚é‚üè‚õè‚îè‚çè‚àè‚Ùè‚Òè‚Ëè‚Ä肽肶肯肨股肚肓肌肅è‚~è‚wè‚pè‚iè‚bè‚[è‚Tè‚Mè‚Fè‚?è‚8è‚1è‚*è‚#è‚è‚è‚è‚è‚è‚ùç‚òç‚ëç‚äç‚Ýç‚Öç‚Ïç‚Èç‚Á為炳炬炥炞炗ç‚炉炂ç‚{ç‚tç‚mç‚fç‚_ç‚Xç‚Qç‚Jç‚Cç‚<ç‚5ç‚.ç‚'ç‚ ç‚ç‚ç‚ ç‚ç‚ýæ‚öæ‚ïæ‚èæ‚áæ‚Úæ‚Óæ‚Ìæ‚Åæ‚¾æ‚·æ‚°æ‚©æ‚¢æ‚›æ‚”æ‚æ‚†æ‚æ‚xæ‚qæ‚jæ‚cæ‚\æ‚Uæ‚Næ‚Gæ‚@æ‚9æ‚2æ‚+æ‚$æ‚æ‚æ‚æ‚æ‚æ‚úå‚óå‚ìå‚åå‚Þå‚×å‚Ðå‚Éå‚Â傻傴傭傦傟傘傑傊傃å‚|å‚uå‚nå‚gå‚`å‚Yå‚Rå‚Kå‚Då‚=å‚6å‚/å‚(å‚!å‚å‚å‚ å‚å‚þä‚÷ä‚ðä‚éä‚âä‚Ûä‚Ôä‚Íä‚Æä‚¿ä‚¸ä‚±ä‚ªä‚£ä‚œä‚•ä‚Žä‚‡ä‚€ä‚yä‚rä‚kä‚dä‚]ä‚Vä‚Oä‚Hä‚Aä‚:ä‚3ä‚,ä‚%ä‚ä‚ä‚ä‚ ä‚ä‚ûã‚ôã‚íã‚æã‚ßã‚Øã‚Ñã‚Êã‚Ãゼサギェ゠゙をるやã‚}ã‚vã‚oã‚hã‚aã‚Zã‚Sã‚Lã‚Eã‚>ã‚7ã‚0ã‚)ã‚"ã‚ã‚ã‚ ã‚ã‚ÿâ‚øâ‚ñâ‚êâ‚ãâ‚Üâ‚Õâ‚Îâ‚Çâ‚À₹₲₫₤â‚â‚–â‚₈â‚â‚zâ‚sâ‚lâ‚eâ‚^â‚Wâ‚Pâ‚Iâ‚Bâ‚;â‚4â‚-â‚&â‚â‚â‚â‚ â‚â‚üá‚õá‚îá‚çá‚àá‚Ùá‚Òá‚Ëá‚ÄႽႶႯႨႡႚ႓ႌႅá‚~á‚wá‚pá‚iá‚bá‚[á‚Tá‚Má‚Fá‚?á‚8á‚1á‚*á‚#á‚á‚á‚á‚á‚á‚ùà‚òà‚ëà‚äà‚Ýà‚Öà‚Ïà‚Èà‚Áà‚ºà‚³à‚¬à‚¥à‚žà‚—à‚à‚‰à‚‚à‚{à‚tà‚mà‚fà‚_à‚Xà‚Qà‚Jà‚Cà‚<à‚5à‚.à‚'à‚ à‚à‚à‚ à‚à‚ýß‚öß‚ïß‚èß‚áß‚Úß‚Óß‚Ìß‚Åß‚¾ß‚·ß‚°ß‚©ß‚¢ß‚›ß‚”߂߂†ß‚ß‚xß‚qß‚jß‚cß‚\ß‚Uß‚Nß‚Gß‚@ß‚9ß‚2ß‚+ß‚$߂߂߂߂߂߂úÞ‚óÞ‚ìÞ‚åÞ‚ÞÞ‚×Þ‚ÐÞ‚ÉÞ‚ÂÞ‚»Þ‚´Þ‚­Þ‚¦Þ‚ŸÞ‚˜Þ‚‘Þ‚ŠÞ‚ƒÞ‚|Þ‚uÞ‚nÞ‚gÞ‚`Þ‚YÞ‚RÞ‚KÞ‚DÞ‚=Þ‚6Þ‚/Þ‚(Þ‚!Þ‚Þ‚Þ‚ Þ‚Þ‚þÝ‚÷Ý‚ðÝ‚éÝ‚âÝ‚ÛÝ‚ÔÝ‚ÍÝ‚ÆÝ‚¿Ý‚¸Ý‚±Ý‚ªÝ‚£Ý‚œÝ‚•Ý‚ŽÝ‚‡Ý‚€Ý‚yÝ‚rÝ‚kÝ‚dÝ‚]Ý‚VÝ‚OÝ‚HÝ‚AÝ‚:Ý‚3Ý‚,Ý‚%݂݂݂݂ ݂݂ûÜ‚ôÜ‚íÜ‚æÜ‚ßÜ‚ØÜ‚ÑÜ‚ÊÜ‚ÃÜ‚¼Ü‚µÜ‚®Ü‚§Ü‚ Ü‚™Ü‚’Ü‚‹Ü‚„Ü‚}Ü‚vÜ‚oÜ‚hÜ‚aÜ‚ZÜ‚SÜ‚LÜ‚EÜ‚>Ü‚7Ü‚0Ü‚)Ü‚"܂܂܂ ܂܂ÿÛ‚øÛ‚ñÛ‚êÛ‚ãÛ‚ÜÛ‚ÕÛ‚ÎÛ‚ÇÛ‚ÀÛ‚¹Û‚²Û‚«Û‚¤Û‚Û‚–Û‚Û‚ˆÛ‚Û‚zÛ‚sÛ‚lÛ‚eÛ‚^Û‚WÛ‚PÛ‚IÛ‚BÛ‚;Û‚4Û‚-Û‚&Û‚Û‚Û‚Û‚ Û‚Û‚üÚ‚õÚ‚îÚ‚çÚ‚àÚ‚ÙÚ‚ÒÚ‚ËÚ‚ÄÚ‚½Ú‚¶Ú‚¯Ú‚¨Ú‚¡Ú‚šÚ‚“Ú‚ŒÚ‚…Ú‚~Ú‚wÚ‚pÚ‚iÚ‚bÚ‚[Ú‚TÚ‚MÚ‚FÚ‚?Ú‚8Ú‚1Ú‚*Ú‚#Ú‚Ú‚Ú‚Ú‚Ú‚Ú‚ùÙ‚òÙ‚ëÙ‚äÙ‚ÝÙ‚ÖÙ‚ÏÙ‚ÈÙ‚ÁÙ‚ºÙ‚³Ù‚¬Ù‚¥Ù‚žÙ‚—قق‰Ù‚‚Ù‚{Ù‚tÙ‚mÙ‚fÙ‚_Ù‚XÙ‚QÙ‚JÙ‚CÙ‚<Ù‚5Ù‚.Ù‚'Ù‚ ققق ققýØ‚öØ‚ïØ‚èØ‚áØ‚ÚØ‚ÓØ‚ÌØ‚ÅØ‚¾Ø‚·Ø‚°Ø‚©Ø‚¢Ø‚›Ø‚”؂؂†Ø‚Ø‚xØ‚qØ‚jØ‚cØ‚\Ø‚UØ‚NØ‚GØ‚@Ø‚9Ø‚2Ø‚+Ø‚$؂؂؂؂؂؂úׂóׂìׂåׂÞׂ×ׂÐׂÉׂÂׂ»×‚´×‚­×‚¦×‚Ÿ×‚˜×‚‘ׂŠ×‚ƒ×‚|ׂuׂnׂgׂ`ׂYׂRׂKׂDׂ=ׂ6ׂ/ׂ(ׂ!ׂׂׂ ׂׂþÖ‚÷Ö‚ðÖ‚éÖ‚âÖ‚ÛÖ‚ÔÖ‚ÍÖ‚ÆÖ‚¿Ö‚¸Ö‚±Ö‚ªÖ‚£Ö‚œÖ‚•Ö‚ŽÖ‚‡Ö‚€Ö‚yÖ‚rÖ‚kÖ‚dÖ‚]Ö‚VÖ‚OÖ‚HÖ‚AÖ‚:Ö‚3Ö‚,Ö‚%Ö‚Ö‚Ö‚Ö‚ Ö‚Ö‚ûÕ‚ôÕ‚íÕ‚æÕ‚ßÕ‚ØÕ‚ÑÕ‚ÊÕ‚ÃÕ‚¼Õ‚µÕ‚®Õ‚§Õ‚ Õ‚™Õ‚’Õ‚‹Õ‚„Õ‚}Õ‚vÕ‚oÕ‚hÕ‚aÕ‚ZÕ‚SÕ‚LÕ‚EÕ‚>Õ‚7Õ‚0Õ‚)Õ‚"Õ‚Õ‚Õ‚ Õ‚Õ‚ÿÔ‚øÔ‚ñÔ‚êÔ‚ãÔ‚ÜÔ‚ÕÔ‚ÎÔ‚ÇÔ‚ÀÔ‚¹Ô‚²Ô‚«Ô‚¤Ô‚Ô‚–Ô‚Ô‚ˆÔ‚Ô‚zÔ‚sÔ‚lÔ‚eÔ‚^Ô‚WÔ‚PÔ‚IÔ‚BÔ‚;Ô‚4Ô‚-Ô‚&Ô‚Ô‚Ô‚Ô‚ Ô‚Ô‚üÓ‚õÓ‚îÓ‚çÓ‚àÓ‚ÙÓ‚ÒÓ‚ËÓ‚ÄÓ‚½Ó‚¶Ó‚¯Ó‚¨Ó‚¡Ó‚šÓ‚“Ó‚ŒÓ‚…Ó‚~Ó‚wÓ‚pÓ‚iÓ‚bÓ‚[Ó‚TÓ‚MÓ‚FÓ‚?Ó‚8Ó‚1Ó‚*Ó‚#Ó‚Ó‚Ó‚Ó‚Ó‚Ó‚ùÒ‚òÒ‚ëÒ‚äÒ‚ÝÒ‚ÖÒ‚ÏÒ‚ÈÒ‚ÁÒ‚ºÒ‚³Ò‚¬Ò‚¥Ò‚žÒ‚—Ò‚Ò‚‰Ò‚‚Ò‚{Ò‚tÒ‚mÒ‚fÒ‚_Ò‚XÒ‚QÒ‚JÒ‚CÒ‚<Ò‚5Ò‚.Ò‚'Ò‚ Ò‚Ò‚Ò‚ Ò‚Ò‚ýÑ‚öÑ‚ïÑ‚èÑ‚áÑ‚ÚÑ‚ÓÑ‚ÌÑ‚ÅÑ‚¾Ñ‚·Ñ‚°Ñ‚©Ñ‚¢Ñ‚›Ñ‚”тт†Ñ‚Ñ‚xÑ‚qÑ‚jÑ‚cÑ‚\Ñ‚UÑ‚NÑ‚GÑ‚@Ñ‚9Ñ‚2Ñ‚+Ñ‚$ттттттúЂóЂìЂåЂÞЂ×ЂÐЂÉЂÂЂ»Ð‚´Ð‚­Ð‚¦Ð‚ŸÐ‚˜Ð‚‘ЂŠÐ‚ƒÐ‚|ЂuЂnЂgЂ`ЂYЂRЂKЂDЂ=Ђ6Ђ/Ђ(Ђ!ЂЂЂ ЂЂþÏ‚÷Ï‚ðÏ‚éÏ‚âÏ‚ÛÏ‚ÔÏ‚ÍÏ‚ÆÏ‚¿Ï‚¸Ï‚±Ï‚ªÏ‚£Ï‚œÏ‚•Ï‚ŽÏ‚‡Ï‚€Ï‚yÏ‚rÏ‚kÏ‚dÏ‚]Ï‚VÏ‚OÏ‚HÏ‚AÏ‚:Ï‚3Ï‚,Ï‚%ςςςς ςςû΂ô΂í΂æÎ‚ß΂ØÎ‚Ñ΂Ê΂Ã΂¼Î‚µÎ‚®Î‚§Î‚ Î‚™Î‚’΂‹Î‚„΂}΂v΂o΂h΂a΂Z΂S΂L΂E΂>΂7΂0΂)΂"΂΂΂ ΂΂ÿÍ‚øÍ‚ñÍ‚êÍ‚ãÍ‚ÜÍ‚ÕÍ‚ÎÍ‚ÇÍ‚ÀÍ‚¹Í‚²Í‚«Í‚¤Í‚Í‚–͂͂ˆÍ‚Í‚zÍ‚sÍ‚lÍ‚eÍ‚^Í‚WÍ‚PÍ‚IÍ‚BÍ‚;Í‚4Í‚-Í‚&͂͂͂͂ ͂͂üÌ‚õÌ‚îÌ‚çÌ‚àÌ‚ÙÌ‚ÒÌ‚ËÌ‚ÄÌ‚½Ì‚¶Ì‚¯Ì‚¨Ì‚¡Ì‚šÌ‚“Ì‚ŒÌ‚…Ì‚~Ì‚wÌ‚pÌ‚iÌ‚bÌ‚[Ì‚TÌ‚MÌ‚FÌ‚?Ì‚8Ì‚1Ì‚*Ì‚#̂̂̂̂̂̂ùË‚òË‚ëË‚äË‚ÝË‚ÖË‚ÏË‚ÈË‚ÁË‚ºË‚³Ë‚¬Ë‚¥Ë‚žË‚—˂˂‰Ë‚‚Ë‚{Ë‚tË‚mË‚fË‚_Ë‚XË‚QË‚JË‚CË‚<Ë‚5Ë‚.Ë‚'Ë‚ ˂˂˂ ˂˂ýÊ‚öÊ‚ïÊ‚èÊ‚áÊ‚ÚÊ‚ÓÊ‚ÌÊ‚ÅÊ‚¾Ê‚·Ê‚°Ê‚©Ê‚¢Ê‚›Ê‚”ʂʂ†Ê‚Ê‚xÊ‚qÊ‚jÊ‚cÊ‚\Ê‚UÊ‚NÊ‚GÊ‚@Ê‚9Ê‚2Ê‚+Ê‚$ʂʂʂʂʂʂúÉ‚óÉ‚ìÉ‚åÉ‚ÞÉ‚×É‚ÐÉ‚ÉÉ‚ÂÉ‚»É‚´É‚­É‚¦É‚ŸÉ‚˜É‚‘É‚ŠÉ‚ƒÉ‚|É‚uÉ‚nÉ‚gÉ‚`É‚YÉ‚RÉ‚KÉ‚DÉ‚=É‚6É‚/É‚(É‚!ɂɂɂ ɂɂþÈ‚÷È‚ðÈ‚éÈ‚âÈ‚ÛÈ‚ÔÈ‚ÍÈ‚ÆÈ‚¿È‚¸È‚±È‚ªÈ‚£È‚œÈ‚•È‚ŽÈ‚‡È‚€È‚yÈ‚rÈ‚kÈ‚dÈ‚]È‚VÈ‚OÈ‚HÈ‚AÈ‚:È‚3È‚,È‚%ȂȂȂȂ ȂȂûÇ‚ôÇ‚íÇ‚æÇ‚ßÇ‚ØÇ‚ÑÇ‚ÊÇ‚ÃÇ‚¼Ç‚µÇ‚®Ç‚§Ç‚ Ç‚™Ç‚’Ç‚‹Ç‚„Ç‚}Ç‚vÇ‚oÇ‚hÇ‚aÇ‚ZÇ‚SÇ‚LÇ‚EÇ‚>Ç‚7Ç‚0Ç‚)Ç‚"ǂǂǂ ǂǂÿÆ‚øÆ‚ñÆ‚êÆ‚ãÆ‚ÜÆ‚ÕÆ‚ÎÆ‚ÇÆ‚ÀÆ‚¹Æ‚²Æ‚«Æ‚¤Æ‚Æ‚–ƂƂˆÆ‚Æ‚zÆ‚sÆ‚lÆ‚eÆ‚^Æ‚WÆ‚PÆ‚IÆ‚BÆ‚;Æ‚4Æ‚-Æ‚&ƂƂƂƂ ƂƂüÅ‚õÅ‚îÅ‚çÅ‚àÅ‚ÙÅ‚ÒÅ‚ËÅ‚ÄÅ‚½Å‚¶Å‚¯Å‚¨Å‚¡Å‚šÅ‚“Å‚ŒÅ‚…Å‚~Å‚wÅ‚pÅ‚iÅ‚bÅ‚[Å‚TÅ‚MÅ‚FÅ‚?Å‚8Å‚1Å‚*Å‚#łłłłłłùÄ‚òÄ‚ëÄ‚äÄ‚ÝÄ‚ÖÄ‚ÏÄ‚ÈÄ‚ÁÄ‚ºÄ‚³Ä‚¬Ä‚¥Ä‚žÄ‚—ĂÉÂĂ{Ä‚tÄ‚mÄ‚fÄ‚_Ä‚XÄ‚QÄ‚JÄ‚CÄ‚<Ä‚5Ä‚.Ä‚'Ä‚ ĂĂĂ ĂĂýÂöÂïÂèÂáÂÚÂÓÂÌž·Â°Ã‚©Ã‚¢Ã‚›Ã‚”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂú‚ó‚ì‚å‚Þ‚ׂЂÉ‚‚»Â‚´Â‚­Â‚¦Â‚ŸÂ‚˜Â‚‘‚ŠÂ‚ƒÂ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þÁ‚÷Á‚ðÁ‚éÁ‚âÁ‚ÛÁ‚ÔÁ‚ÍÁ‚ÆÁ‚¿Á‚¸Á‚±Á‚ªÁ‚£Á‚œÁ‚•Á‚ŽÁ‚‡Á‚€Á‚yÁ‚rÁ‚kÁ‚dÁ‚]Á‚VÁ‚OÁ‚HÁ‚AÁ‚:Á‚3Á‚,Á‚%Á‚Á‚Á‚Á‚ Á‚Á‚ûÀ‚ôÀ‚íÀ‚æÀ‚ßÀ‚ØÀ‚ÑÀ‚ÊÀ‚ÃÀ‚¼À‚µÀ‚®À‚§À‚ À‚™À‚’À‚‹À‚„À‚}À‚vÀ‚oÀ‚hÀ‚aÀ‚ZÀ‚SÀ‚LÀ‚EÀ‚>À‚7À‚0À‚)À‚"À‚À‚À‚ À‚À‚ÿ¿‚ø¿‚ñ¿‚ê¿‚ã¿‚Ü¿‚Õ¿‚ο‚Ç¿‚À¿‚¹¿‚²¿‚«¿‚¤¿‚¿‚–¿‚¿‚ˆ¿‚¿‚z¿‚s¿‚l¿‚e¿‚^¿‚W¿‚P¿‚I¿‚B¿‚;¿‚4¿‚-¿‚&¿‚¿‚¿‚¿‚ ¿‚¿‚ü¾‚õ¾‚羂ྂÙ¾‚Ò¾‚˾‚ľ‚½¾‚¶¾‚¯¾‚¨¾‚¡¾‚𾂓¾‚Œ¾‚…¾‚~¾‚w¾‚p¾‚i¾‚b¾‚[¾‚T¾‚M¾‚F¾‚?¾‚8¾‚1¾‚*¾‚#¾‚¾‚¾‚¾‚¾‚¾‚ù½‚ò½‚뽂佂ݽ‚Ö½‚Ͻ‚Ƚ‚Á½‚º½‚³½‚¬½‚¥½‚ž½‚—½‚½‚‰½‚‚½‚{½‚t½‚m½‚f½‚_½‚X½‚Q½‚J½‚C½‚<½‚5½‚.½‚'½‚ ½‚½‚½‚ ½‚½‚ý¼‚ö¼‚"輂ἂÚ¼‚Ó¼‚̼‚ż‚¾¼‚·¼‚°¼‚©¼‚¢¼‚›¼‚”¼‚¼‚†¼‚¼‚x¼‚q¼‚j¼‚c¼‚\¼‚U¼‚N¼‚G¼‚@¼‚9¼‚2¼‚+¼‚$¼‚¼‚¼‚¼‚¼‚¼‚ú»‚ó»‚컂廂Þ»‚×»‚л‚É»‚»‚»»‚´»‚­»‚¦»‚Ÿ»‚˜»‚‘»‚Š»‚ƒ»‚|»‚u»‚n»‚g»‚`»‚Y»‚R»‚K»‚D»‚=»‚6»‚/»‚(»‚!»‚»‚»‚ »‚»‚þº‚÷º‚ðº‚麂⺂Ûº‚Ôº‚ͺ‚ƺ‚¿º‚¸º‚±º‚ªº‚£º‚œº‚•º‚Žº‚‡º‚€º‚yº‚rº‚kº‚dº‚]º‚Vº‚Oº‚Hº‚Aº‚:º‚3º‚,º‚%º‚º‚º‚º‚ º‚º‚û¹‚ô¹‚í¹‚湂ß¹‚ع‚ѹ‚ʹ‚ù‚¼¹‚µ¹‚®¹‚§¹‚ ¹‚™¹‚’¹‚‹¹‚„¹‚}¹‚v¹‚o¹‚h¹‚a¹‚Z¹‚S¹‚L¹‚E¹‚>¹‚7¹‚0¹‚)¹‚"¹‚¹‚¹‚ ¹‚¹‚ÿ¸‚ø¸‚ñ¸‚긂㸂ܸ‚Õ¸‚θ‚Ǹ‚À¸‚¹¸‚²¸‚«¸‚¤¸‚¸‚–¸‚¸‚ˆ¸‚¸‚z¸‚s¸‚l¸‚e¸‚^¸‚W¸‚P¸‚I¸‚B¸‚;¸‚4¸‚-¸‚&¸‚¸‚¸‚¸‚ ¸‚¸‚ü·‚õ·‚î·‚ç·‚à·‚Ù·‚Ò·‚Ë·‚Ä·‚½·‚¶·‚¯·‚¨·‚¡·‚š·‚“·‚Œ·‚…·‚~·‚w·‚p·‚i·‚b·‚[·‚T·‚M·‚F·‚?·‚8·‚1·‚*·‚#·‚·‚·‚·‚·‚·‚ù¶‚ò¶‚ë¶‚ä¶‚ݶ‚Ö¶‚϶‚ȶ‚Á¶‚º¶‚³¶‚¬¶‚¥¶‚ž¶‚—¶‚¶‚‰¶‚‚¶‚{¶‚t¶‚m¶‚f¶‚_¶‚X¶‚Q¶‚J¶‚C¶‚<¶‚5¶‚.¶‚'¶‚ ¶‚¶‚¶‚ ¶‚¶‚ýµ‚öµ‚﵂赂ᵂÚµ‚Óµ‚̵‚ŵ‚¾µ‚·µ‚°µ‚©µ‚¢µ‚›µ‚”µ‚µ‚†µ‚µ‚xµ‚qµ‚jµ‚cµ‚\µ‚Uµ‚Nµ‚Gµ‚@µ‚9µ‚2µ‚+µ‚$µ‚µ‚µ‚µ‚µ‚µ‚ú´‚ó´‚ì´‚å´‚Þ´‚×´‚д‚É´‚´‚»´‚´´‚­´‚¦´‚Ÿ´‚˜´‚‘´‚Š´‚ƒ´‚|´‚u´‚n´‚g´‚`´‚Y´‚R´‚K´‚D´‚=´‚6´‚/´‚(´‚!´‚´‚´‚ ´‚´‚þ³‚÷³‚ð³‚鳂ⳂÛ³‚Ô³‚ͳ‚Ƴ‚¿³‚¸³‚±³‚ª³‚£³‚œ³‚•³‚޳‚‡³‚€³‚y³‚r³‚k³‚d³‚]³‚V³‚O³‚H³‚A³‚:³‚3³‚,³‚%³‚³‚³‚³‚ ³‚³‚û²‚ô²‚í²‚沂ß²‚ز‚Ѳ‚ʲ‚ò‚¼²‚µ²‚®²‚§²‚ ²‚™²‚’²‚‹²‚„²‚}²‚v²‚o²‚h²‚a²‚Z²‚S²‚L²‚E²‚>²‚7²‚0²‚)²‚"²‚²‚²‚ ²‚²‚ÿ±‚ø±‚ñ±‚걂㱂ܱ‚Õ±‚α‚DZ‚À±‚¹±‚²±‚«±‚¤±‚±‚–±‚±‚ˆ±‚±‚z±‚s±‚l±‚e±‚^±‚W±‚P±‚I±‚B±‚;±‚4±‚-±‚&±‚±‚±‚±‚ ±‚±‚ü°‚õ°‚î°‚ç°‚à°‚Ù°‚Ò°‚˰‚İ‚½°‚¶°‚¯°‚¨°‚¡°‚š°‚“°‚Œ°‚…°‚~°‚w°‚p°‚i°‚b°‚[°‚T°‚M°‚F°‚?°‚8°‚1°‚*°‚#°‚°‚°‚°‚°‚°‚ù¯‚ò¯‚믂䯂ݯ‚Ö¯‚ϯ‚ȯ‚Á¯‚º¯‚³¯‚¬¯‚¥¯‚ž¯‚—¯‚¯‚‰¯‚‚¯‚{¯‚t¯‚m¯‚f¯‚_¯‚X¯‚Q¯‚J¯‚C¯‚<¯‚5¯‚.¯‚'¯‚ ¯‚¯‚¯‚ ¯‚¯‚ý®‚ö®‚ﮂ讂ᮂÚ®‚Ó®‚Ì®‚Å®‚¾®‚·®‚°®‚©®‚¢®‚›®‚”®‚®‚†®‚®‚x®‚q®‚j®‚c®‚\®‚U®‚N®‚G®‚@®‚9®‚2®‚+®‚$®‚®‚®‚®‚®‚®‚ú­‚ó­‚ì­‚å­‚Þ­‚×­‚Э‚É­‚­‚»­‚´­‚­­‚¦­‚Ÿ­‚˜­‚‘­‚Š­‚ƒ­‚|­‚u­‚n­‚g­‚`­‚Y­‚R­‚K­‚D­‚=­‚6­‚/­‚(­‚!­‚­‚­‚ ­‚­‚þ¬‚÷¬‚ð¬‚鬂⬂Û¬‚Ô¬‚ͬ‚Ƭ‚¿¬‚¸¬‚±¬‚ª¬‚£¬‚œ¬‚•¬‚ެ‚‡¬‚€¬‚y¬‚r¬‚k¬‚d¬‚]¬‚V¬‚O¬‚H¬‚A¬‚:¬‚3¬‚,¬‚%¬‚¬‚¬‚¬‚ ¬‚¬‚û«‚ô«‚í«‚æ«‚ß«‚Ø«‚Ñ«‚Ê«‚낼«‚µ«‚®«‚§«‚ «‚™«‚’«‚‹«‚„«‚}«‚v«‚o«‚h«‚a«‚Z«‚S«‚L«‚E«‚>«‚7«‚0«‚)«‚"«‚«‚«‚ «‚«‚ÿª‚øª‚ñª‚ꪂ㪂ܪ‚Õª‚Ϊ‚Ǫ‚Àª‚¹ª‚²ª‚«ª‚¤ª‚ª‚–ª‚ª‚ˆª‚ª‚zª‚sª‚lª‚eª‚^ª‚Wª‚Pª‚Iª‚Bª‚;ª‚4ª‚-ª‚&ª‚ª‚ª‚ª‚ ª‚ª‚ü©‚õ©‚î©‚ç©‚à©‚Ù©‚Ò©‚Ë©‚Ä©‚½©‚¶©‚¯©‚¨©‚¡©‚š©‚“©‚Œ©‚…©‚~©‚w©‚p©‚i©‚b©‚[©‚T©‚M©‚F©‚?©‚8©‚1©‚*©‚#©‚©‚©‚©‚©‚©‚ù¨‚ò¨‚먂䨂ݨ‚Ö¨‚Ϩ‚Ȩ‚Á¨‚º¨‚³¨‚¬¨‚¥¨‚ž¨‚—¨‚¨‚‰¨‚‚¨‚{¨‚t¨‚m¨‚f¨‚_¨‚X¨‚Q¨‚J¨‚C¨‚<¨‚5¨‚.¨‚'¨‚ ¨‚¨‚¨‚ ¨‚¨‚ý§‚ö§‚ï§‚è§‚á§‚Ú§‚Ó§‚̧‚ŧ‚¾§‚·§‚°§‚©§‚¢§‚›§‚”§‚§‚†§‚§‚x§‚q§‚j§‚c§‚\§‚U§‚N§‚G§‚@§‚9§‚2§‚+§‚$§‚§‚§‚§‚§‚§‚ú¦‚ó¦‚즂如Þ¦‚צ‚Ц‚ɦ‚¦‚»¦‚´¦‚­¦‚¦¦‚Ÿ¦‚˜¦‚‘¦‚Ц‚ƒ¦‚|¦‚u¦‚n¦‚g¦‚`¦‚Y¦‚R¦‚K¦‚D¦‚=¦‚6¦‚/¦‚(¦‚!¦‚¦‚¦‚ ¦‚¦‚þ¥‚÷¥‚ð¥‚饂⥂Û¥‚Ô¥‚Í¥‚Æ¥‚¿¥‚¸¥‚±¥‚ª¥‚£¥‚œ¥‚•¥‚Ž¥‚‡¥‚€¥‚y¥‚r¥‚k¥‚d¥‚]¥‚V¥‚O¥‚H¥‚A¥‚:¥‚3¥‚,¥‚%¥‚¥‚¥‚¥‚ ¥‚¥‚û¤‚ô¤‚í¤‚椂ߤ‚ؤ‚Ѥ‚ʤ‚䂼¤‚µ¤‚®¤‚§¤‚ ¤‚™¤‚’¤‚‹¤‚„¤‚}¤‚v¤‚o¤‚h¤‚a¤‚Z¤‚S¤‚L¤‚E¤‚>¤‚7¤‚0¤‚)¤‚"¤‚¤‚¤‚ ¤‚¤‚ÿ£‚ø£‚ñ£‚ꣂ㣂Ü£‚Õ£‚Σ‚Ç£‚À£‚¹£‚²£‚«£‚¤£‚£‚–£‚£‚ˆ£‚£‚z£‚s£‚l£‚e£‚^£‚W£‚P£‚I£‚B£‚;£‚4£‚-£‚&£‚£‚£‚£‚ £‚£‚ü¢‚õ¢‚碂ࢂÙ¢‚Ò¢‚Ë¢‚Ä¢‚½¢‚¶¢‚¯¢‚¨¢‚¡¢‚𢂓¢‚Œ¢‚…¢‚~¢‚w¢‚p¢‚i¢‚b¢‚[¢‚T¢‚M¢‚F¢‚?¢‚8¢‚1¢‚*¢‚#¢‚¢‚¢‚¢‚¢‚¢‚ù¡‚ò¡‚ë¡‚ä¡‚Ý¡‚Ö¡‚Ï¡‚È¡‚Á¡‚º¡‚³¡‚¬¡‚¥¡‚ž¡‚—¡‚¡‚‰¡‚‚¡‚{¡‚t¡‚m¡‚f¡‚_¡‚X¡‚Q¡‚J¡‚C¡‚<¡‚5¡‚.¡‚'¡‚ ¡‚¡‚¡‚ ¡‚¡‚ý ‚ö ‚ï ‚è ‚á ‚Ú ‚Ó ‚Ì ‚Å ‚¾ ‚· ‚° ‚© ‚¢ ‚› ‚” ‚ ‚† ‚ ‚x ‚q ‚j ‚c ‚\ ‚U ‚N ‚G ‚@ ‚9 ‚2 ‚+ ‚$ ‚ ‚ ‚ ‚ ‚ ‚úŸ‚óŸ‚쟂埂ÞŸ‚ן‚П‚ÉŸ‚Ÿ‚»Ÿ‚´Ÿ‚­Ÿ‚¦Ÿ‚ŸŸ‚˜Ÿ‚‘Ÿ‚ŠŸ‚ƒŸ‚|Ÿ‚uŸ‚nŸ‚gŸ‚`Ÿ‚YŸ‚RŸ‚KŸ‚DŸ‚=Ÿ‚6Ÿ‚/Ÿ‚(Ÿ‚!Ÿ‚Ÿ‚Ÿ‚ Ÿ‚Ÿ‚þž‚÷ž‚ðž‚鞂➂۞‚Ôž‚Íž‚Æž‚¿ž‚¸ž‚±ž‚ªž‚£ž‚œž‚•ž‚Žž‚‡ž‚€ž‚yž‚rž‚kž‚dž‚]ž‚Vž‚Ož‚Hž‚Až‚:ž‚3ž‚,ž‚%ž‚ž‚ž‚ž‚ ž‚ž‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿœ‚øœ‚ñœ‚꜂㜂Üœ‚Õœ‚Μ‚Çœ‚Àœ‚¹œ‚²œ‚«œ‚¤œ‚œ‚–œ‚œ‚ˆœ‚œ‚zœ‚sœ‚lœ‚eœ‚^œ‚Wœ‚Pœ‚Iœ‚Bœ‚;œ‚4œ‚-œ‚&œ‚œ‚œ‚œ‚ œ‚œ‚ü›‚õ›‚盂à›‚Ù›‚Ò›‚Ë›‚Ä›‚½›‚¶›‚¯›‚¨›‚¡›‚𛂓›‚Œ›‚…›‚~›‚w›‚p›‚i›‚b›‚[›‚T›‚M›‚F›‚?›‚8›‚1›‚*›‚#›‚›‚›‚›‚›‚›‚ùš‚òš‚뚂䚂ݚ‚Öš‚Ïš‚Èš‚Áš‚ºš‚³š‚¬š‚¥š‚žš‚—š‚š‚‰š‚‚š‚{š‚tš‚mš‚fš‚_š‚Xš‚Qš‚Jš‚Cš‚<š‚5š‚.š‚'š‚ š‚š‚š‚ š‚š‚ý™‚ö™‚虂ᙂÚ™‚Ó™‚Ì™‚Å™‚¾™‚·™‚°™‚©™‚¢™‚›™‚”™‚™‚†™‚™‚x™‚q™‚j™‚c™‚\™‚U™‚N™‚G™‚@™‚9™‚2™‚+™‚$™‚™‚™‚™‚™‚™‚ú˜‚ó˜‚옂嘂Þ˜‚ט‚И‚ɘ‚˜‚»˜‚´˜‚­˜‚¦˜‚Ÿ˜‚˜˜‚‘˜‚Š˜‚ƒ˜‚|˜‚u˜‚n˜‚g˜‚`˜‚Y˜‚R˜‚K˜‚D˜‚=˜‚6˜‚/˜‚(˜‚!˜‚˜‚˜‚ ˜‚˜‚þ—‚÷—‚ð—‚é—‚â—‚Û—‚Ô—‚Í—‚Æ—‚¿—‚¸—‚±—‚ª—‚£—‚œ—‚•—‚Ž—‚‡—‚€—‚y—‚r—‚k—‚d—‚]—‚V—‚O—‚H—‚A—‚:—‚3—‚,—‚%—‚—‚—‚—‚ —‚—‚û–‚ô–‚í–‚æ–‚ß–‚Ø–‚Ñ–‚Ê–‚Ö‚¼–‚µ–‚®–‚§–‚ –‚™–‚’–‚‹–‚„–‚}–‚v–‚o–‚h–‚a–‚Z–‚S–‚L–‚E–‚>–‚7–‚0–‚)–‚"–‚–‚–‚ –‚–‚ÿ•‚ø•‚ñ•‚ê•‚ã•‚Ü•‚Õ•‚Ε‚Ç•‚À•‚¹•‚²•‚«•‚¤•‚•‚–•‚•‚ˆ•‚•‚z•‚s•‚l•‚e•‚^•‚W•‚P•‚I•‚B•‚;•‚4•‚-•‚&•‚•‚•‚•‚ •‚•‚ü”‚õ”‚甂à”‚Ù”‚Ò”‚Ë”‚Ä”‚½”‚¶”‚¯”‚¨”‚¡”‚𔂓”‚Œ”‚…”‚~”‚w”‚p”‚i”‚b”‚[”‚T”‚M”‚F”‚?”‚8”‚1”‚*”‚#”‚”‚”‚”‚”‚”‚ù“‚ò“‚ë“‚ä“‚Ý“‚Ö“‚Ï“‚È“‚Á“‚º“‚³“‚¬“‚¥“‚ž“‚—“‚“‚‰“‚‚“‚{“‚t“‚m“‚f“‚_“‚X“‚Q“‚J“‚C“‚<“‚5“‚.“‚'“‚ “‚“‚“‚ “‚“‚ý’‚ö’‚ï’‚è’‚á’‚Ú’‚Ó’‚Ì’‚Å’‚¾’‚·’‚°’‚©’‚¢’‚›’‚”’‚’‚†’‚’‚x’‚q’‚j’‚c’‚\’‚U’‚N’‚G’‚@’‚9’‚2’‚+’‚$’‚’‚’‚’‚’‚’‚ú‘‚ó‘‚ì‘‚å‘‚Þ‘‚ב‚Б‚É‘‚‘‚»‘‚´‘‚­‘‚¦‘‚Ÿ‘‚˜‘‚‘‘‚Š‘‚ƒ‘‚|‘‚u‘‚n‘‚g‘‚`‘‚Y‘‚R‘‚K‘‚D‘‚=‘‚6‘‚/‘‚(‘‚!‘‚‘‚‘‚ ‘‚‘‚þ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿŽ‚øŽ‚ñŽ‚ꎂ㎂ÜŽ‚ÕŽ‚ÎŽ‚ÇŽ‚ÀŽ‚¹Ž‚²Ž‚«Ž‚¤Ž‚Ž‚–ނނˆŽ‚Ž‚zŽ‚sŽ‚lŽ‚eŽ‚^Ž‚WŽ‚PŽ‚IŽ‚BŽ‚;Ž‚4Ž‚-Ž‚&ނނނނ ނނü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ùŒ‚òŒ‚댂䌂ÝŒ‚ÖŒ‚ÏŒ‚ÈŒ‚ÁŒ‚ºŒ‚³Œ‚¬Œ‚¥Œ‚žŒ‚—Œ‚Œ‚‰Œ‚‚Œ‚{Œ‚tŒ‚mŒ‚fŒ‚_Œ‚XŒ‚QŒ‚JŒ‚CŒ‚<Œ‚5Œ‚.Œ‚'Œ‚ Œ‚Œ‚Œ‚ Œ‚Œ‚ý‹‚ö‹‚ï‹‚è‹‚á‹‚Ú‹‚Ó‹‚Ì‹‚Å‹‚¾‹‚·‹‚°‹‚©‹‚¢‹‚›‹‚”‹‚‹‚†‹‚‹‚x‹‚q‹‚j‹‚c‹‚\‹‚U‹‚N‹‚G‹‚@‹‚9‹‚2‹‚+‹‚$‹‚‹‚‹‚‹‚‹‚‹‚úŠ‚óŠ‚슂劂ÞŠ‚׊‚Њ‚ÉŠ‚Š‚»Š‚´Š‚­Š‚¦Š‚ŸŠ‚˜Š‚‘Š‚ŠŠ‚ƒŠ‚|Š‚uŠ‚nŠ‚gŠ‚`Š‚YŠ‚RŠ‚KŠ‚DŠ‚=Š‚6Š‚/Š‚(Š‚!ЂЂЂ ЂЂþ‰‚÷‰‚ð‰‚鉂≂Û‰‚Ô‰‚͉‚Ɖ‚¿‰‚¸‰‚±‰‚ª‰‚£‰‚œ‰‚•‰‚މ‚‡‰‚€‰‚y‰‚r‰‚k‰‚d‰‚]‰‚V‰‚O‰‚H‰‚A‰‚:‰‚3‰‚,‰‚%‰‚‰‚‰‚‰‚ ‰‚‰‚ûˆ‚ôˆ‚툂戂߈‚؈‚ш‚ʈ‚È‚¼ˆ‚µˆ‚®ˆ‚§ˆ‚ ˆ‚™ˆ‚’ˆ‚‹ˆ‚„ˆ‚}ˆ‚vˆ‚oˆ‚hˆ‚aˆ‚Zˆ‚Sˆ‚Lˆ‚Eˆ‚>ˆ‚7ˆ‚0ˆ‚)ˆ‚"ˆ‚ˆ‚ˆ‚ ˆ‚ˆ‚ÿ‡‚ø‡‚ñ‡‚ꇂ㇂܇‚Õ‡‚·‚LJ‚À‡‚¹‡‚²‡‚«‡‚¤‡‚‡‚–‡‚‡‚ˆ‡‚‡‚z‡‚s‡‚l‡‚e‡‚^‡‚W‡‚P‡‚I‡‚B‡‚;‡‚4‡‚-‡‚&‡‚‡‚‡‚‡‚ ‡‚‡‚ü†‚õ†‚熂à†‚Ù†‚Ò†‚ˆ‚Ć‚½†‚¶†‚¯†‚¨†‚¡†‚š†‚“†‚Œ†‚…†‚~†‚w†‚p†‚i†‚b†‚[†‚T†‚M†‚F†‚?†‚8†‚1†‚*†‚#†‚†‚†‚†‚†‚†‚ù…‚ò…‚ë…‚ä…‚Ý…‚Ö…‚Ï…‚È…‚Á…‚º…‚³…‚¬…‚¥…‚ž…‚—…‚…‚‰…‚‚…‚{…‚t…‚m…‚f…‚_…‚X…‚Q…‚J…‚C…‚<…‚5…‚.…‚'…‚ …‚…‚…‚ …‚…‚ý„‚ö„‚ï„‚è„‚á„‚Ú„‚Ó„‚Ì„‚Å„‚¾„‚·„‚°„‚©„‚¢„‚›„‚”„‚„‚†„‚„‚x„‚q„‚j„‚c„‚\„‚U„‚N„‚G„‚@„‚9„‚2„‚+„‚$„‚„‚„‚„‚„‚„‚úƒ‚óƒ‚샂僂Þƒ‚׃‚Ѓ‚Ƀ‚ƒ‚»ƒ‚´ƒ‚­ƒ‚¦ƒ‚Ÿƒ‚˜ƒ‚‘ƒ‚Šƒ‚ƒƒ‚|ƒ‚uƒ‚nƒ‚gƒ‚`ƒ‚Yƒ‚Rƒ‚Kƒ‚Dƒ‚=ƒ‚6ƒ‚/ƒ‚(ƒ‚!ƒ‚ƒ‚ƒ‚ ƒ‚ƒ‚þ‚‚÷‚‚ð‚‚é‚‚â‚‚Û‚‚Ô‚‚Í‚‚Æ‚‚¿‚‚¸‚‚±‚‚ª‚‚£‚‚œ‚‚•‚‚Ž‚‚‡‚‚€‚‚y‚‚r‚‚k‚‚d‚‚]‚‚V‚‚O‚‚H‚‚A‚‚:‚‚3‚‚,‚‚%‚‚‚‚‚‚‚‚ ‚‚‚‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿ€‚ø€‚ñ€‚ꀂ。Ü€‚Õ€‚΀‚Ç€‚À€‚¹€‚²€‚«€‚¤€‚€‚–€‚€‚ˆ€‚€‚z€‚s€‚l€‚e€‚^€‚W€‚P€‚I€‚B€‚;€‚4€‚-€‚&€‚€‚€‚€‚ €‚€‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù~‚ò~‚ë~‚ä~‚Ý~‚Ö~‚Ï~‚È~‚Á~‚º~‚³~‚¬~‚¥~‚ž~‚—~‚~‚‰~‚‚~‚{~‚t~‚m~‚f~‚_~‚X~‚Q~‚J~‚C~‚<~‚5~‚.~‚'~‚ ~‚~‚~‚ ~‚~‚ý}‚ö}‚ï}‚è}‚á}‚Ú}‚Ó}‚Ì}‚Å}‚¾}‚·}‚°}‚©}‚¢}‚›}‚”}‚}‚†}‚}‚x}‚q}‚j}‚c}‚\}‚U}‚N}‚G}‚@}‚9}‚2}‚+}‚$}‚}‚}‚}‚}‚}‚ú|‚ó|‚ì|‚å|‚Þ|‚×|‚Ð|‚É|‚Â|‚»|‚´|‚­|‚¦|‚Ÿ|‚˜|‚‘|‚Š|‚ƒ|‚||‚u|‚n|‚g|‚`|‚Y|‚R|‚K|‚D|‚=|‚6|‚/|‚(|‚!|‚|‚|‚ |‚|‚þ{‚÷{‚ð{‚é{‚â{‚Û{‚Ô{‚Í{‚Æ{‚¿{‚¸{‚±{‚ª{‚£{‚œ{‚•{‚Ž{‚‡{‚€{‚y{‚r{‚k{‚d{‚]{‚V{‚O{‚H{‚A{‚:{‚3{‚,{‚%{‚{‚{‚{‚ {‚{‚ûz‚ôz‚íz‚æz‚ßz‚Øz‚Ñz‚Êz‚Ãz‚¼z‚µz‚®z‚§z‚ z‚™z‚’z‚‹z‚„z‚}z‚vz‚oz‚hz‚az‚Zz‚Sz‚Lz‚Ez‚>z‚7z‚0z‚)z‚"z‚z‚z‚ z‚z‚ÿy‚øy‚ñy‚êy‚ãy‚Üy‚Õy‚Îy‚Çy‚Ày‚¹y‚²y‚«y‚¤y‚y‚–y‚y‚ˆy‚y‚zy‚sy‚ly‚ey‚^y‚Wy‚Py‚Iy‚By‚;y‚4y‚-y‚&y‚y‚y‚y‚ y‚y‚üx‚õx‚îx‚çx‚àx‚Ùx‚Òx‚Ëx‚Äx‚½x‚¶x‚¯x‚¨x‚¡x‚šx‚“x‚Œx‚…x‚~x‚wx‚px‚ix‚bx‚[x‚Tx‚Mx‚Fx‚?x‚8x‚1x‚*x‚#x‚x‚x‚x‚x‚x‚ùw‚òw‚ëw‚äw‚Ýw‚Öw‚Ïw‚Èw‚Áw‚ºw‚³w‚¬w‚¥w‚žw‚—w‚w‚‰w‚‚w‚{w‚tw‚mw‚fw‚_w‚Xw‚Qw‚Jw‚Cw‚s‚7s‚0s‚)s‚"s‚s‚s‚ s‚s‚ÿr‚ør‚ñr‚êr‚ãr‚Ür‚Õr‚Îr‚Çr‚Àr‚¹r‚²r‚«r‚¤r‚r‚–r‚r‚ˆr‚r‚zr‚sr‚lr‚er‚^r‚Wr‚Pr‚Ir‚Br‚;r‚4r‚-r‚&r‚r‚r‚r‚ r‚r‚üq‚õq‚îq‚çq‚àq‚Ùq‚Òq‚Ëq‚Äq‚½q‚¶q‚¯q‚¨q‚¡q‚šq‚“q‚Œq‚…q‚~q‚wq‚pq‚iq‚bq‚[q‚Tq‚Mq‚Fq‚?q‚8q‚1q‚*q‚#q‚q‚q‚q‚q‚q‚ùp‚òp‚ëp‚äp‚Ýp‚Öp‚Ïp‚Èp‚Áp‚ºp‚³p‚¬p‚¥p‚žp‚—p‚p‚‰p‚‚p‚{p‚tp‚mp‚fp‚_p‚Xp‚Qp‚Jp‚Cp‚l‚7l‚0l‚)l‚"l‚l‚l‚ l‚l‚ÿk‚øk‚ñk‚êk‚ãk‚Ük‚Õk‚Îk‚Çk‚Àk‚¹k‚²k‚«k‚¤k‚k‚–k‚k‚ˆk‚k‚zk‚sk‚lk‚ek‚^k‚Wk‚Pk‚Ik‚Bk‚;k‚4k‚-k‚&k‚k‚k‚k‚ k‚k‚üj‚õj‚îj‚çj‚àj‚Ùj‚Òj‚Ëj‚Äj‚½j‚¶j‚¯j‚¨j‚¡j‚šj‚“j‚Œj‚…j‚~j‚wj‚pj‚ij‚bj‚[j‚Tj‚Mj‚Fj‚?j‚8j‚1j‚*j‚#j‚j‚j‚j‚j‚j‚ùi‚òi‚ëi‚äi‚Ýi‚Öi‚Ïi‚Èi‚Ái‚ºi‚³i‚¬i‚¥i‚ži‚—i‚i‚‰i‚‚i‚{i‚ti‚mi‚fi‚_i‚Xi‚Qi‚Ji‚Ci‚e‚7e‚0e‚)e‚"e‚e‚e‚ e‚e‚ÿd‚ød‚ñd‚êd‚ãd‚Üd‚Õd‚Îd‚Çd‚Àd‚¹d‚²d‚«d‚¤d‚d‚–d‚d‚ˆd‚d‚zd‚sd‚ld‚ed‚^d‚Wd‚Pd‚Id‚Bd‚;d‚4d‚-d‚&d‚d‚d‚d‚ d‚d‚üc‚õc‚îc‚çc‚àc‚Ùc‚Òc‚Ëc‚Äc‚½c‚¶c‚¯c‚¨c‚¡c‚šc‚“c‚Œc‚…c‚~c‚wc‚pc‚ic‚bc‚[c‚Tc‚Mc‚Fc‚?c‚8c‚1c‚*c‚#c‚c‚c‚c‚c‚c‚ùb‚òb‚ëb‚äb‚Ýb‚Öb‚Ïb‚Èb‚Áb‚ºb‚³b‚¬b‚¥b‚žb‚—b‚b‚‰b‚‚b‚{b‚tb‚mb‚fb‚_b‚Xb‚Qb‚Jb‚Cb‚^‚7^‚0^‚)^‚"^‚^‚^‚ ^‚^‚ÿ]‚ø]‚ñ]‚ê]‚ã]‚Ü]‚Õ]‚Î]‚Ç]‚À]‚¹]‚²]‚«]‚¤]‚]‚–]‚]‚ˆ]‚]‚z]‚s]‚l]‚e]‚^]‚W]‚P]‚I]‚B]‚;]‚4]‚-]‚&]‚]‚]‚]‚ ]‚]‚ü\‚õ\‚î\‚ç\‚à\‚Ù\‚Ò\‚Ë\‚Ä\‚½\‚¶\‚¯\‚¨\‚¡\‚š\‚“\‚Œ\‚…\‚~\‚w\‚p\‚i\‚b\‚[\‚T\‚M\‚F\‚?\‚8\‚1\‚*\‚#\‚\‚\‚\‚\‚\‚ù[‚ò[‚ë[‚ä[‚Ý[‚Ö[‚Ï[‚È[‚Á[‚º[‚³[‚¬[‚¥[‚ž[‚—[‚[‚‰[‚‚[‚{[‚t[‚m[‚f[‚_[‚X[‚Q[‚J[‚C[‚<[‚5[‚.[‚'[‚ [‚[‚[‚ [‚[‚ýZ‚öZ‚ïZ‚èZ‚áZ‚ÚZ‚ÓZ‚ÌZ‚ÅZ‚¾Z‚·Z‚°Z‚©Z‚¢Z‚›Z‚”Z‚Z‚†Z‚Z‚xZ‚qZ‚jZ‚cZ‚\Z‚UZ‚NZ‚GZ‚@Z‚9Z‚2Z‚+Z‚$Z‚Z‚Z‚Z‚Z‚Z‚úY‚óY‚ìY‚åY‚ÞY‚×Y‚ÐY‚ÉY‚ÂY‚»Y‚´Y‚­Y‚¦Y‚ŸY‚˜Y‚‘Y‚ŠY‚ƒY‚|Y‚uY‚nY‚gY‚`Y‚YY‚RY‚KY‚DY‚=Y‚6Y‚/Y‚(Y‚!Y‚Y‚Y‚ Y‚Y‚þX‚÷X‚ðX‚éX‚âX‚ÛX‚ÔX‚ÍX‚ÆX‚¿X‚¸X‚±X‚ªX‚£X‚œX‚•X‚ŽX‚‡X‚€X‚yX‚rX‚kX‚dX‚]X‚VX‚OX‚HX‚AX‚:X‚3X‚,X‚%X‚X‚X‚X‚ X‚X‚ûW‚ôW‚íW‚æW‚ßW‚ØW‚ÑW‚ÊW‚ÃW‚¼W‚µW‚®W‚§W‚ W‚™W‚’W‚‹W‚„W‚}W‚vW‚oW‚hW‚aW‚ZW‚SW‚LW‚EW‚>W‚7W‚0W‚)W‚"W‚W‚W‚ W‚W‚ÿV‚øV‚ñV‚êV‚ãV‚ÜV‚ÕV‚ÎV‚ÇV‚ÀV‚¹V‚²V‚«V‚¤V‚V‚–V‚V‚ˆV‚V‚zV‚sV‚lV‚eV‚^V‚WV‚PV‚IV‚BV‚;V‚4V‚-V‚&V‚V‚V‚V‚ V‚V‚üU‚õU‚îU‚çU‚àU‚ÙU‚ÒU‚ËU‚ÄU‚½U‚¶U‚¯U‚¨U‚¡U‚šU‚“U‚ŒU‚…U‚~U‚wU‚pU‚iU‚bU‚[U‚TU‚MU‚FU‚?U‚8U‚1U‚*U‚#U‚U‚U‚U‚U‚U‚ùT‚òT‚ëT‚äT‚ÝT‚ÖT‚ÏT‚ÈT‚ÁT‚ºT‚³T‚¬T‚¥T‚žT‚—T‚T‚‰T‚‚T‚{T‚tT‚mT‚fT‚_T‚XT‚QT‚JT‚CT‚P‚7P‚0P‚)P‚"P‚P‚P‚ P‚P‚ÿO‚øO‚ñO‚êO‚ãO‚ÜO‚ÕO‚ÎO‚ÇO‚ÀO‚¹O‚²O‚«O‚¤O‚O‚–O‚O‚ˆO‚O‚zO‚sO‚lO‚eO‚^O‚WO‚PO‚IO‚BO‚;O‚4O‚-O‚&O‚O‚O‚O‚ O‚O‚üN‚õN‚îN‚çN‚àN‚ÙN‚ÒN‚ËN‚ÄN‚½N‚¶N‚¯N‚¨N‚¡N‚šN‚“N‚ŒN‚…N‚~N‚wN‚pN‚iN‚bN‚[N‚TN‚MN‚FN‚?N‚8N‚1N‚*N‚#N‚N‚N‚N‚N‚N‚ùM‚òM‚ëM‚äM‚ÝM‚ÖM‚ÏM‚ÈM‚ÁM‚ºM‚³M‚¬M‚¥M‚žM‚—M‚M‚‰M‚‚M‚{M‚tM‚mM‚fM‚_M‚XM‚QM‚JM‚CM‚I‚7I‚0I‚)I‚"I‚I‚I‚ I‚I‚ÿH‚øH‚ñH‚êH‚ãH‚ÜH‚ÕH‚ÎH‚ÇH‚ÀH‚¹H‚²H‚«H‚¤H‚H‚–H‚H‚ˆH‚H‚zH‚sH‚lH‚eH‚^H‚WH‚PH‚IH‚BH‚;H‚4H‚-H‚&H‚H‚H‚H‚ H‚H‚üG‚õG‚îG‚çG‚àG‚ÙG‚ÒG‚ËG‚ÄG‚½G‚¶G‚¯G‚¨G‚¡G‚šG‚“G‚ŒG‚…G‚~G‚wG‚pG‚iG‚bG‚[G‚TG‚MG‚FG‚?G‚8G‚1G‚*G‚#G‚G‚G‚G‚G‚G‚ùF‚òF‚ëF‚äF‚ÝF‚ÖF‚ÏF‚ÈF‚ÁF‚ºF‚³F‚¬F‚¥F‚žF‚—F‚F‚‰F‚‚F‚{F‚tF‚mF‚fF‚_F‚XF‚QF‚JF‚CF‚B‚7B‚0B‚)B‚"B‚B‚B‚ B‚B‚ÿA‚øA‚ñA‚êA‚ãA‚ÜA‚ÕA‚ÎA‚ÇA‚ÀA‚¹A‚²A‚«A‚¤A‚A‚–A‚A‚ˆA‚A‚zA‚sA‚lA‚eA‚^A‚WA‚PA‚IA‚BA‚;A‚4A‚-A‚&A‚A‚A‚A‚ A‚A‚ü@‚õ@‚î@‚ç@‚à@‚Ù@‚Ò@‚Ë@‚Ä@‚½@‚¶@‚¯@‚¨@‚¡@‚š@‚“@‚Œ@‚…@‚~@‚w@‚p@‚i@‚b@‚[@‚T@‚M@‚F@‚?@‚8@‚1@‚*@‚#@‚@‚@‚@‚@‚@‚ù?‚ò?‚ë?‚ä?‚Ý?‚Ö?‚Ï?‚È?‚Á?‚º?‚³?‚¬?‚¥?‚ž?‚—?‚?‚‰?‚‚?‚{?‚t?‚m?‚f?‚_?‚X?‚Q?‚J?‚C?‚‚ö>‚ï>‚è>‚á>‚Ú>‚Ó>‚Ì>‚Å>‚¾>‚·>‚°>‚©>‚¢>‚›>‚”>‚>‚†>‚>‚x>‚q>‚j>‚c>‚\>‚U>‚N>‚G>‚@>‚9>‚2>‚+>‚$>‚>‚>‚>‚>‚>‚ú=‚ó=‚ì=‚å=‚Þ=‚×=‚Ð=‚É=‚Â=‚»=‚´=‚­=‚¦=‚Ÿ=‚˜=‚‘=‚Š=‚ƒ=‚|=‚u=‚n=‚g=‚`=‚Y=‚R=‚K=‚D=‚==‚6=‚/=‚(=‚!=‚=‚=‚ =‚=‚þ<‚÷<‚ð<‚é<‚â<‚Û<‚Ô<‚Í<‚Æ<‚¿<‚¸<‚±<‚ª<‚£<‚œ<‚•<‚Ž<‚‡<‚€<‚y<‚r<‚k<‚d<‚]<‚V<‚O<‚H<‚A<‚:<‚3<‚,<‚%<‚<‚<‚<‚ <‚<‚û;‚ô;‚í;‚æ;‚ß;‚Ø;‚Ñ;‚Ê;‚Ã;‚¼;‚µ;‚®;‚§;‚ ;‚™;‚’;‚‹;‚„;‚};‚v;‚o;‚h;‚a;‚Z;‚S;‚L;‚E;‚>;‚7;‚0;‚);‚";‚;‚;‚ ;‚;‚ÿ:‚ø:‚ñ:‚ê:‚ã:‚Ü:‚Õ:‚Î:‚Ç:‚À:‚¹:‚²:‚«:‚¤:‚:‚–:‚:‚ˆ:‚:‚z:‚s:‚l:‚e:‚^:‚W:‚P:‚I:‚B:‚;:‚4:‚-:‚&:‚:‚:‚:‚ :‚:‚ü9‚õ9‚î9‚ç9‚à9‚Ù9‚Ò9‚Ë9‚Ä9‚½9‚¶9‚¯9‚¨9‚¡9‚š9‚“9‚Œ9‚…9‚~9‚w9‚p9‚i9‚b9‚[9‚T9‚M9‚F9‚?9‚89‚19‚*9‚#9‚9‚9‚9‚9‚9‚ù8‚ò8‚ë8‚ä8‚Ý8‚Ö8‚Ï8‚È8‚Á8‚º8‚³8‚¬8‚¥8‚ž8‚—8‚8‚‰8‚‚8‚{8‚t8‚m8‚f8‚_8‚X8‚Q8‚J8‚C8‚<8‚58‚.8‚'8‚ 8‚8‚8‚ 8‚8‚ý7‚ö7‚ï7‚è7‚á7‚Ú7‚Ó7‚Ì7‚Å7‚¾7‚·7‚°7‚©7‚¢7‚›7‚”7‚7‚†7‚7‚x7‚q7‚j7‚c7‚\7‚U7‚N7‚G7‚@7‚97‚27‚+7‚$7‚7‚7‚7‚7‚7‚ú6‚ó6‚ì6‚å6‚Þ6‚×6‚Ð6‚É6‚Â6‚»6‚´6‚­6‚¦6‚Ÿ6‚˜6‚‘6‚Š6‚ƒ6‚|6‚u6‚n6‚g6‚`6‚Y6‚R6‚K6‚D6‚=6‚66‚/6‚(6‚!6‚6‚6‚ 6‚6‚þ5‚÷5‚ð5‚é5‚â5‚Û5‚Ô5‚Í5‚Æ5‚¿5‚¸5‚±5‚ª5‚£5‚œ5‚•5‚Ž5‚‡5‚€5‚y5‚r5‚k5‚d5‚]5‚V5‚O5‚H5‚A5‚:5‚35‚,5‚%5‚5‚5‚5‚ 5‚5‚û4‚ô4‚í4‚æ4‚ß4‚Ø4‚Ñ4‚Ê4‚Ã4‚¼4‚µ4‚®4‚§4‚ 4‚™4‚’4‚‹4‚„4‚}4‚v4‚o4‚h4‚a4‚Z4‚S4‚L4‚E4‚>4‚74‚04‚)4‚"4‚4‚4‚ 4‚4‚ÿ3‚ø3‚ñ3‚ê3‚ã3‚Ü3‚Õ3‚Î3‚Ç3‚À3‚¹3‚²3‚«3‚¤3‚3‚–3‚3‚ˆ3‚3‚z3‚s3‚l3‚e3‚^3‚W3‚P3‚I3‚B3‚;3‚43‚-3‚&3‚3‚3‚3‚ 3‚3‚ü2‚õ2‚î2‚ç2‚à2‚Ù2‚Ò2‚Ë2‚Ä2‚½2‚¶2‚¯2‚¨2‚¡2‚š2‚“2‚Œ2‚…2‚~2‚w2‚p2‚i2‚b2‚[2‚T2‚M2‚F2‚?2‚82‚12‚*2‚#2‚2‚2‚2‚2‚2‚ù1‚ò1‚ë1‚ä1‚Ý1‚Ö1‚Ï1‚È1‚Á1‚º1‚³1‚¬1‚¥1‚ž1‚—1‚1‚‰1‚‚1‚{1‚t1‚m1‚f1‚_1‚X1‚Q1‚J1‚C1‚<1‚51‚.1‚'1‚ 1‚1‚1‚ 1‚1‚ý0‚ö0‚ï0‚è0‚á0‚Ú0‚Ó0‚Ì0‚Å0‚¾0‚·0‚°0‚©0‚¢0‚›0‚”0‚0‚†0‚0‚x0‚q0‚j0‚c0‚\0‚U0‚N0‚G0‚@0‚90‚20‚+0‚$0‚0‚0‚0‚0‚0‚ú/‚ó/‚ì/‚å/‚Þ/‚×/‚Ð/‚É/‚Â/‚»/‚´/‚­/‚¦/‚Ÿ/‚˜/‚‘/‚Š/‚ƒ/‚|/‚u/‚n/‚g/‚`/‚Y/‚R/‚K/‚D/‚=/‚6/‚//‚(/‚!/‚/‚/‚ /‚/‚þ.‚÷.‚ð.‚é.‚â.‚Û.‚Ô.‚Í.‚Æ.‚¿.‚¸.‚±.‚ª.‚£.‚œ.‚•.‚Ž.‚‡.‚€.‚y.‚r.‚k.‚d.‚].‚V.‚O.‚H.‚A.‚:.‚3.‚,.‚%.‚.‚.‚.‚ .‚.‚û-‚ô-‚í-‚æ-‚ß-‚Ø-‚Ñ-‚Ê-‚Ã-‚¼-‚µ-‚®-‚§-‚ -‚™-‚’-‚‹-‚„-‚}-‚v-‚o-‚h-‚a-‚Z-‚S-‚L-‚E-‚>-‚7-‚0-‚)-‚"-‚-‚-‚ -‚-‚ÿ,‚ø,‚ñ,‚ê,‚ã,‚Ü,‚Õ,‚Î,‚Ç,‚À,‚¹,‚²,‚«,‚¤,‚,‚–,‚,‚ˆ,‚,‚z,‚s,‚l,‚e,‚^,‚W,‚P,‚I,‚B,‚;,‚4,‚-,‚&,‚,‚,‚,‚ ,‚,‚ü+‚õ+‚î+‚ç+‚à+‚Ù+‚Ò+‚Ë+‚Ä+‚½+‚¶+‚¯+‚¨+‚¡+‚š+‚“+‚Œ+‚…+‚~+‚w+‚p+‚i+‚b+‚[+‚T+‚M+‚F+‚?+‚8+‚1+‚*+‚#+‚+‚+‚+‚+‚+‚ù*‚ò*‚ë*‚ä*‚Ý*‚Ö*‚Ï*‚È*‚Á*‚º*‚³*‚¬*‚¥*‚ž*‚—*‚*‚‰*‚‚*‚{*‚t*‚m*‚f*‚_*‚X*‚Q*‚J*‚C*‚<*‚5*‚.*‚'*‚ *‚*‚*‚ *‚*‚ý)‚ö)‚ï)‚è)‚á)‚Ú)‚Ó)‚Ì)‚Å)‚¾)‚·)‚°)‚©)‚¢)‚›)‚”)‚)‚†)‚)‚x)‚q)‚j)‚c)‚\)‚U)‚N)‚G)‚@)‚9)‚2)‚+)‚$)‚)‚)‚)‚)‚)‚ú(‚ó(‚ì(‚å(‚Þ(‚×(‚Ð(‚É(‚Â(‚»(‚´(‚­(‚¦(‚Ÿ(‚˜(‚‘(‚Š(‚ƒ(‚|(‚u(‚n(‚g(‚`(‚Y(‚R(‚K(‚D(‚=(‚6(‚/(‚((‚!(‚(‚(‚ (‚(‚þ'‚÷'‚ð'‚é'‚â'‚Û'‚Ô'‚Í'‚Æ'‚¿'‚¸'‚±'‚ª'‚£'‚œ'‚•'‚Ž'‚‡'‚€'‚y'‚r'‚k'‚d'‚]'‚V'‚O'‚H'‚A'‚:'‚3'‚,'‚%'‚'‚'‚'‚ '‚'‚û&‚ô&‚í&‚æ&‚ß&‚Ø&‚Ñ&‚Ê&‚Ã&‚¼&‚µ&‚®&‚§&‚ &‚™&‚’&‚‹&‚„&‚}&‚v&‚o&‚h&‚a&‚Z&‚S&‚L&‚E&‚>&‚7&‚0&‚)&‚"&‚&‚&‚ &‚&‚ÿ%‚ø%‚ñ%‚ê%‚ã%‚Ü%‚Õ%‚Î%‚Ç%‚À%‚¹%‚²%‚«%‚¤%‚%‚–%‚%‚ˆ%‚%‚z%‚s%‚l%‚e%‚^%‚W%‚P%‚I%‚B%‚;%‚4%‚-%‚&%‚%‚%‚%‚ %‚%‚ü$‚õ$‚î$‚ç$‚à$‚Ù$‚Ò$‚Ë$‚Ä$‚½$‚¶$‚¯$‚¨$‚¡$‚š$‚“$‚Œ$‚…$‚~$‚w$‚p$‚i$‚b$‚[$‚T$‚M$‚F$‚?$‚8$‚1$‚*$‚#$‚$‚$‚$‚$‚$‚ù#‚ò#‚ë#‚ä#‚Ý#‚Ö#‚Ï#‚È#‚Á#‚º#‚³#‚¬#‚¥#‚ž#‚—#‚#‚‰#‚‚#‚{#‚t#‚m#‚f#‚_#‚X#‚Q#‚J#‚C#‚<#‚5#‚.#‚'#‚ #‚#‚#‚ #‚#‚ý"‚ö"‚ï"‚è"‚á"‚Ú"‚Ó"‚Ì"‚Å"‚¾"‚·"‚°"‚©"‚¢"‚›"‚”"‚"‚†"‚"‚x"‚q"‚j"‚c"‚\"‚U"‚N"‚G"‚@"‚9"‚2"‚+"‚$"‚"‚"‚"‚"‚"‚ú!‚ó!‚ì!‚å!‚Þ!‚×!‚Ð!‚É!‚Â!‚»!‚´!‚­!‚¦!‚Ÿ!‚˜!‚‘!‚Š!‚ƒ!‚|!‚u!‚n!‚g!‚`!‚Y!‚R!‚K!‚D!‚=!‚6!‚/!‚(!‚!!‚!‚!‚ !‚!‚þ ‚÷ ‚ð ‚é ‚â ‚Û ‚Ô ‚Í ‚Æ ‚¿ ‚¸ ‚± ‚ª ‚£ ‚œ ‚• ‚Ž ‚‡ ‚€ ‚y ‚r ‚k ‚d ‚] ‚V ‚O ‚H ‚A ‚: ‚3 ‚, ‚% ‚ ‚ ‚ ‚ ‚ ‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂ǂÀ‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚ú‚ó‚ì‚å‚ނׂЂɂ‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂ǂÀ‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚ú‚ó‚ì‚å‚ނׂЂɂ‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂ǂÀ‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ý ‚ö ‚ï ‚è ‚á ‚Ú ‚Ó ‚Ì ‚Å ‚¾ ‚· ‚° ‚© ‚¢ ‚› ‚” ‚ ‚† ‚ ‚x ‚q ‚j ‚c ‚\ ‚U ‚N ‚G ‚@ ‚9 ‚2 ‚+ ‚$ ‚ ‚ ‚ ‚ ‚ ‚ú ‚ó ‚ì ‚å ‚Þ ‚× ‚Ð ‚É ‚ ‚» ‚´ ‚­ ‚¦ ‚Ÿ ‚˜ ‚‘ ‚Š ‚ƒ ‚| ‚u ‚n ‚g ‚` ‚Y ‚R ‚K ‚D ‚= ‚6 ‚/ ‚( ‚! ‚ ‚ ‚ ‚ ‚þ ‚÷ ‚ð ‚é ‚â ‚Û ‚Ô ‚Í ‚Æ ‚¿ ‚¸ ‚± ‚ª ‚£ ‚œ ‚• ‚Ž ‚‡ ‚€ ‚y ‚r ‚k ‚d ‚] ‚V ‚O ‚H ‚A ‚: ‚3 ‚, ‚% ‚ ‚ ‚ ‚ ‚ ‚û ‚ô ‚í ‚æ ‚ß ‚Ø ‚Ñ ‚Ê ‚à ‚¼ ‚µ ‚® ‚§ ‚  ‚™ ‚’ ‚‹ ‚„ ‚} ‚v ‚o ‚h ‚a ‚Z ‚S ‚L ‚E ‚> ‚7 ‚0 ‚) ‚" ‚ ‚ ‚ ‚ ‚ÿ ‚ø ‚ñ ‚ê ‚ã ‚Ü ‚Õ ‚Î ‚Ç ‚À ‚¹ ‚² ‚« ‚¤ ‚ ‚– ‚ ‚ˆ ‚ ‚z ‚s ‚l ‚e ‚^ ‚W ‚P ‚I ‚B ‚; ‚4 ‚- ‚& ‚ ‚ ‚ ‚ ‚ ‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚ú‚ó‚ì‚å‚ނׂЂɂ‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚û‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂ǂÀ‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚ü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿ€øÿ€ñÿ€êÿ€ãÿ€Üÿ€Õÿ€Îÿ€Çÿ€Àÿ€¹ÿ€²ÿ€«ÿ€¤ÿ€ÿ€–ÿ€ÿ€ˆÿ€ÿ€zÿ€sÿ€lÿ€eÿ€^ÿ€Wÿ€Pÿ€Iÿ€Bÿ€;ÿ€4ÿ€-ÿ€&ÿ€ÿ€ÿ€ÿ€ ÿ€ÿ€üþ€õþ€îþ€çþ€àþ€Ùþ€Òþ€Ëþ€Äþ€½þ€¶þ€¯þ€¨þ€¡þ€šþ€“þ€Œþ€…þ€~þ€wþ€pþ€iþ€bþ€[þ€Tþ€Mþ€Fþ€?þ€8þ€1þ€*þ€#þ€þ€þ€þ€þ€þ€ùý€òý€ëý€äý€Ýý€Öý€Ïý€Èý€Áý€ºý€³ý€¬ý€¥ý€žý€—ý€ý€‰ý€‚ý€{ý€tý€mý€fý€_ý€Xý€Qý€Jý€Cý€<ý€5ý€.ý€'ý€ ý€ý€ý€ ý€ý€ýü€öü€ïü€èü€áü€Úü€Óü€Ìü€Åü€¾ü€·ü€°ü€©ü€¢ü€›ü€”ü€ü€†ü€ü€xü€qü€jü€cü€\ü€Uü€Nü€Gü€@ü€9ü€2ü€+ü€$ü€ü€ü€ü€ü€ü€úû€óû€ìû€åû€Þû€×û€Ðû€Éû€Âû€»û€´û€­û€¦û€Ÿû€˜û€‘û€Šû€ƒû€|û€uû€nû€gû€`û€Yû€Rû€Kû€Dû€=û€6û€/û€(û€!û€û€û€ û€û€þú€÷ú€ðú€éú€âú€Ûú€Ôú€Íú€Æú€¿ú€¸ú€±ú€ªú€£ú€œú€•ú€Žú€‡ú€€ú€yú€rú€kú€dú€]ú€Vú€Oú€Hú€Aú€:ú€3ú€,ú€%ú€ú€ú€ú€ ú€ú€ûù€ôù€íù€æù€ßù€Øù€Ñù€Êù€Ãù€¼ù€µù€®ù€§ù€ ù€™ù€’ù€‹ù€„ù€}ù€vù€où€hù€aù€Zù€Sù€Lù€Eù€>ù€7ù€0ù€)ù€"ù€ù€ù€ ù€ù€ÿø€øø€ñø€êø€ãø€Üø€Õø€Îø€Çø€Àø€¹ø€²ø€«ø€¤ø€ø€–ø€ø€ˆø€ø€zø€sø€lø€eø€^ø€Wø€Pø€Iø€Bø€;ø€4ø€-ø€&ø€ø€ø€ø€ ø€ø€ü÷€õ÷€î÷€ç÷€à÷€Ù÷€Ò÷€Ë÷€Ä÷€½÷€¶÷€¯÷€¨÷€¡÷€š÷€“÷€Œ÷€…÷€~÷€w÷€p÷€i÷€b÷€[÷€T÷€M÷€F÷€?÷€8÷€1÷€*÷€#÷€÷€÷€÷€÷€÷€ùö€òö€ëö€äö€Ýö€Öö€Ïö€Èö€Áö€ºö€³ö€¬ö€¥ö€žö€—ö€ö€‰ö€‚ö€{ö€tö€mö€fö€_ö€Xö€Qö€Jö€Cö€<ö€5ö€.ö€'ö€ ö€ö€ö€ ö€ö€ýõ€öõ€ïõ€èõ€áõ€Úõ€Óõ€Ìõ€Åõ€¾õ€·õ€°õ€©õ€¢õ€›õ€”õ€õ€†õ€õ€xõ€qõ€jõ€cõ€\õ€Uõ€Nõ€Gõ€@õ€9õ€2õ€+õ€$õ€õ€õ€õ€õ€õ€úô€óô€ìô€åô€Þô€×ô€Ðô€Éô€Âô€»ô€´ô€­ô€¦ô€Ÿô€˜ô€‘ô€Šô€ƒô€|ô€uô€nô€gô€`ô€Yô€Rô€Kô€Dô€=ô€6ô€/ô€(ô€!ô€ô€ô€ ô€ô€þó€÷ó€ðó€éó€âó€Ûó€Ôó€Íó€Æó€¿ó€¸ó€±ó€ªó€£ó€œó€•ó€Žó€‡ó€€ó€yó€ró€kó€dó€]ó€Vó€Oó€Hó€Aó€:ó€3ó€,ó€%ó€ó€ó€ó€ ó€ó€ûò€ôò€íò€æò€ßò€Øò€Ñò€Êò€Ãò€¼ò€µò€®ò€§ò€ ò€™ò€’ò€‹ò€„ò€}ò€vò€oò€hò€aò€Zò€Sò€Lò€Eò€>ò€7ò€0ò€)ò€"ò€ò€ò€ ò€ò€ÿñ€øñ€ññ€êñ€ãñ€Üñ€Õñ€Îñ€Çñ€Àñ€¹ñ€²ñ€«ñ€¤ñ€ñ€–ñ€ñ€ˆñ€ñ€zñ€sñ€lñ€eñ€^ñ€Wñ€Pñ€Iñ€Bñ€;ñ€4ñ€-ñ€&ñ€ñ€ñ€ñ€ ñ€ñ€üð€õð€îð€çð€àð€Ùð€Òð€Ëð€Äð€½ð€¶ð€¯ð€¨ð€¡ð€šð€“ð€Œð€…ð€~ð€wð€pð€ið€bð€[ð€Tð€Mð€Fð€?ð€8ð€1ð€*ð€#ð€ð€ð€ð€ð€ð€ùï€òï€ëï€äï€Ýï€Öï€Ïï€Èï€Áï€ï€‰ï€‚ï€{ï€tï€mï€fï€_ï€Xï€Qï€Jï€Cï€<ï€5ï€.ï€'ï€ ï€ï€ï€ ï€ï€ýî€öî€ïî€èî€áî€Úî€Óî€Ìî€Åî€î€†î€î€xî€qî€jî€cî€\î€Uî€Nî€Gî€@î€9î€2î€+î€$î€î€î€î€î€î€úí€óí€ìí€åí€Þí€×í€Ðí€Éí€Â퀻퀴퀭퀦퀟퀘퀑퀊퀃í€|í€uí€ní€gí€`í€Yí€Rí€Kí€Dí€=í€6í€/í€(í€!í€í€í€ í€í€þì€÷ì€ðì€éì€âì€Ûì€Ôì€Íì€Æì€¿ì€¸ì€±ì€ªì€£ì€œì€•ì€Žì€‡ì€€ì€yì€rì€kì€dì€]ì€Vì€Oì€Hì€Aì€:ì€3ì€,ì€%ì€ì€ì€ì€ ì€ì€ûë€ôë€íë€æë€ßë€Øë€Ñë€Êë€Ã뀼뀵뀮뀧뀠뀙뀒뀋뀄ë€}ë€vë€oë€hë€aë€Zë€Së€Lë€Eë€>ë€7ë€0ë€)ë€"ë€ë€ë€ ë€ë€ÿê€øê€ñê€êê€ãê€Üê€Õê€Îê€Çê€Àꀹꀲꀫꀤê€ê€–ê€ê€ˆê€ê€zê€sê€lê€eê€^ê€Wê€Pê€Iê€Bê€;ê€4ê€-ê€&ê€ê€ê€ê€ ê€ê€üé€õé€îé€çé€àé€Ùé€Òé€Ëé€Ä逽逶逯逨逡通逓逌逅é€~é€wé€pé€ié€bé€[é€Té€Mé€Fé€?é€8é€1é€*é€#é€é€é€é€é€é€ùè€òè€ëè€äè€Ýè€Öè€Ïè€Èè€Á耺耳耬耥耞耗è€è€‰è€‚è€{è€tè€mè€fè€_è€Xè€Qè€Jè€Cè€<è€5è€.è€'è€ è€è€è€ è€è€ýç€öç€ïç€èç€áç€Úç€Óç€Ìç€Å瀾瀷瀰瀩瀢瀛瀔ç€ç€†ç€ç€xç€qç€jç€cç€\ç€Uç€Nç€Gç€@ç€9ç€2ç€+ç€$ç€ç€ç€ç€ç€ç€úæ€óæ€ìæ€忀Þæ€׿€Ðæ€Éæ€Â总怴怭怦怟怘怑怊怃æ€|æ€uæ€næ€gæ€`æ€Yæ€Ræ€Kæ€Dæ€=æ€6æ€/æ€(æ€!æ€æ€æ€ æ€æ€þå€÷å€ðå€éå€âå€Ûå€Ôå€Íå€Æå€¿å€¸å€±å€ªå€£å€œå€•å€Žå€‡å€€å€yå€rå€kå€då€]å€Vå€Oå€Hå€Aå€:å€3å€,å€%å€å€å€å€ å€å€ûä€ôä€í䀿ä€ß䀨ä€Ñä€Êä€Ã䀼䀵䀮䀧䀠䀙䀒䀋䀄ä€}ä€vä€oä€hä€aä€Zä€Sä€Lä€Eä€>ä€7ä€0ä€)ä€"ä€ä€ä€ ä€ä€ÿã€øã€ñã€êã€ãã€Üã€Õã€Îã€Çã€À〹〲〫〤ã€ã€–ã€ã€ˆã€ã€zã€sã€lã€eã€^ã€Wã€Pã€Iã€Bã€;ã€4ã€-ã€&ã€ã€ã€ã€ ã€ã€üâ€õâ€îâ€çâ€àâ€Ùâ€Òâ€Ëâ€Ä‽‶ 
‡‚–‌ â€~â€wâ€pâ€iâ€bâ€[â€Tâ€Mâ€Fâ€?â€8â€1â€*â€#â€â€â€â€â€â€ùá€òá€ëá€äá€Ýá€Öá€Ïá€Èá€Á်ဳာဥသဗá€á€‰á€‚á€{á€tá€má€fá€_á€Xá€Qá€Já€Cá€<á€5á€.á€'ဠá€á€á€ á€á€ýà€öà€ïà€èà€áà€Úà€Óà€Ìà€Åà€¾à€·à€°à€©à€¢à€›à€”à€à€†à€à€xà€qà€jà€cà€\à€Uà€Nà€Gà€@à€9à€2à€+à€$à€à€à€à€à€à€ú߀ó߀ì߀å߀Þ߀×߀Ð߀É߀Â߀»ß€´ß€­ß€¦ß€Ÿß€˜ß€‘߀Šß€ƒß€|߀u߀n߀g߀`߀Y߀R߀K߀D߀=߀6߀/߀(߀!߀߀߀ ߀߀þÞ€÷Þ€ðÞ€éÞ€âÞ€ÛÞ€ÔÞ€ÍÞ€ÆÞ€¿Þ€¸Þ€±Þ€ªÞ€£Þ€œÞ€•Þ€ŽÞ€‡Þ€€Þ€yÞ€rÞ€kÞ€dÞ€]Þ€VÞ€OÞ€HÞ€AÞ€:Þ€3Þ€,Þ€%Þ€Þ€Þ€Þ€ Þ€Þ€ûÝ€ôÝ€íÝ€æÝ€ßÝ€ØÝ€ÑÝ€ÊÝ€ÃÝ€¼Ý€µÝ€®Ý€§Ý€ Ý€™Ý€’Ý€‹Ý€„Ý€}Ý€vÝ€oÝ€hÝ€aÝ€ZÝ€SÝ€LÝ€EÝ€>Ý€7Ý€0Ý€)Ý€"݀݀݀ ݀݀ÿÜ€øÜ€ñÜ€êÜ€ãÜ€ÜÜ€ÕÜ€ÎÜ€ÇÜ€ÀÜ€¹Ü€²Ü€«Ü€¤Ü€Ü€–܀܀ˆÜ€Ü€zÜ€sÜ€lÜ€eÜ€^Ü€WÜ€PÜ€IÜ€BÜ€;Ü€4Ü€-Ü€&܀܀܀܀ ܀܀üÛ€õÛ€îÛ€çÛ€àÛ€ÙÛ€ÒÛ€ËÛ€ÄÛ€½Û€¶Û€¯Û€¨Û€¡Û€šÛ€“Û€ŒÛ€…Û€~Û€wÛ€pÛ€iÛ€bÛ€[Û€TÛ€MÛ€FÛ€?Û€8Û€1Û€*Û€#Û€Û€Û€Û€Û€Û€ùÚ€òÚ€ëÚ€äÚ€ÝÚ€ÖÚ€ÏÚ€ÈÚ€ÁÚ€ºÚ€³Ú€¬Ú€¥Ú€žÚ€—Ú€Ú€‰Ú€‚Ú€{Ú€tÚ€mÚ€fÚ€_Ú€XÚ€QÚ€JÚ€CÚ€<Ú€5Ú€.Ú€'Ú€ Ú€Ú€Ú€ Ú€Ú€ýÙ€öÙ€ïÙ€èÙ€áÙ€ÚÙ€ÓÙ€ÌÙ€ÅÙ€¾Ù€·Ù€°Ù€©Ù€¢Ù€›Ù€”ــ†Ù€Ù€xÙ€qÙ€jÙ€cÙ€\Ù€UÙ€NÙ€GÙ€@Ù€9Ù€2Ù€+Ù€$ــــــúØ€óØ€ìØ€娀ÞØ€ר€ÐØ€ÉØ€ÂØ€»Ø€´Ø€­Ø€¦Ø€ŸØ€˜Ø€‘Ø€ŠØ€ƒØ€|Ø€uØ€nØ€gØ€`Ø€YØ€RØ€KØ€DØ€=Ø€6Ø€/Ø€(Ø€!؀؀؀ ؀؀þ×€÷×€ð×€é×€â×€Û×€Ô×€Í×€Æ×€¿×€¸×€±×€ª×€£×€œ×€•×€Ž×€‡×€€×€y×€r×€k×€d×€]×€V×€O×€H×€A×€:×€3×€,×€%×€×€×€×€ ×€×€ûÖ€ôÖ€íÖ€æÖ€ßÖ€ØÖ€ÑÖ€ÊÖ€ÃÖ€¼Ö€µÖ€®Ö€§Ö€ Ö€™Ö€’Ö€‹Ö€„Ö€}Ö€vÖ€oÖ€hÖ€aÖ€ZÖ€SÖ€LÖ€EÖ€>Ö€7Ö€0Ö€)Ö€"Ö€Ö€Ö€ Ö€Ö€ÿÕ€øÕ€ñÕ€êÕ€ãÕ€ÜÕ€ÕÕ€ÎÕ€ÇÕ€ÀÕ€¹Õ€²Õ€«Õ€¤Õ€Õ€–Õ€Õ€ˆÕ€Õ€zÕ€sÕ€lÕ€eÕ€^Õ€WÕ€PÕ€IÕ€BÕ€;Õ€4Õ€-Õ€&Õ€Õ€Õ€Õ€ Õ€Õ€üÔ€õÔ€îÔ€çÔ€àÔ€ÙÔ€ÒÔ€ËÔ€ÄÔ€½Ô€¶Ô€¯Ô€¨Ô€¡Ô€šÔ€“Ô€ŒÔ€…Ô€~Ô€wÔ€pÔ€iÔ€bÔ€[Ô€TÔ€MÔ€FÔ€?Ô€8Ô€1Ô€*Ô€#Ô€Ô€Ô€Ô€Ô€Ô€ùÓ€òÓ€ëÓ€äÓ€ÝÓ€ÖÓ€ÏÓ€ÈÓ€ÁÓ€ºÓ€³Ó€¬Ó€¥Ó€žÓ€—Ó€Ó€‰Ó€‚Ó€{Ó€tÓ€mÓ€fÓ€_Ó€XÓ€QÓ€JÓ€CÓ€<Ó€5Ó€.Ó€'Ó€ Ó€Ó€Ó€ Ó€Ó€ýÒ€öÒ€ïÒ€èÒ€áÒ€ÚÒ€ÓÒ€ÌÒ€ÅÒ€¾Ò€·Ò€°Ò€©Ò€¢Ò€›Ò€”Ò€Ò€†Ò€Ò€xÒ€qÒ€jÒ€cÒ€\Ò€UÒ€NÒ€GÒ€@Ò€9Ò€2Ò€+Ò€$Ò€Ò€Ò€Ò€Ò€Ò€úÑ€óÑ€ìÑ€åÑ€ÞÑ€×Ñ€ÐÑ€ÉÑ€ÂÑ€»Ñ€´Ñ€­Ñ€¦Ñ€ŸÑ€˜Ñ€‘Ñ€ŠÑ€ƒÑ€|Ñ€uÑ€nÑ€gÑ€`Ñ€YÑ€RÑ€KÑ€DÑ€=Ñ€6Ñ€/Ñ€(Ñ€!ррр ррþЀ÷ЀðЀéЀâЀÛЀÔЀÍЀÆÐ€¿Ð€¸Ð€±Ð€ªÐ€£Ð€œÐ€•ЀŽÐ€‡Ð€€Ð€yЀrЀkЀdЀ]ЀVЀOЀHЀAЀ:Ѐ3Ѐ,Ѐ%ЀЀЀЀ ЀЀûÏ€ôÏ€íÏ€æÏ€ßÏ€ØÏ€ÑÏ€ÊÏ€ÃÏ€¼Ï€µÏ€®Ï€§Ï€ Ï€™Ï€’Ï€‹Ï€„Ï€}Ï€vÏ€oÏ€hÏ€aÏ€ZÏ€SÏ€LÏ€EÏ€>Ï€7Ï€0Ï€)Ï€"πππ ππÿ΀øÎ€ñ΀ê΀ã΀Ü΀Õ΀Î΀Ç΀À΀¹Î€²Î€«Î€¤Î€΀–΀΀ˆÎ€΀z΀s΀l΀e΀^΀W΀P΀I΀B΀;΀4΀-΀&΀΀΀΀ ΀΀üÍ€õÍ€îÍ€çÍ€àÍ€ÙÍ€ÒÍ€ËÍ€ÄÍ€½Í€¶Í€¯Í€¨Í€¡Í€šÍ€“Í€ŒÍ€…Í€~Í€wÍ€pÍ€iÍ€bÍ€[Í€TÍ€MÍ€FÍ€?Í€8Í€1Í€*Í€#̀̀̀̀̀̀ùÌ€òÌ€ëÌ€äÌ€ÝÌ€ÖÌ€ÏÌ€ÈÌ€ÁÌ€ºÌ€³Ì€¬Ì€¥Ì€žÌ€—̀̀‰Ì€‚Ì€{Ì€tÌ€mÌ€fÌ€_Ì€XÌ€QÌ€JÌ€CÌ€<Ì€5Ì€.Ì€'Ì€ ̀̀̀ ̀̀ýË€öË€ïË€èË€áË€ÚË€ÓË€ÌË€ÅË€¾Ë€·Ë€°Ë€©Ë€¢Ë€›Ë€”ˀˀ†Ë€Ë€xË€qË€jË€cË€\Ë€UË€NË€GË€@Ë€9Ë€2Ë€+Ë€$ˀˀˀˀˀˀúÊ€óÊ€ìÊ€åÊ€ÞÊ€×Ê€ÐÊ€ÉÊ€ÂÊ€»Ê€´Ê€­Ê€¦Ê€ŸÊ€˜Ê€‘Ê€ŠÊ€ƒÊ€|Ê€uÊ€nÊ€gÊ€`Ê€YÊ€RÊ€KÊ€DÊ€=Ê€6Ê€/Ê€(Ê€!ʀʀʀ ʀʀþÉ€÷É€ðÉ€éÉ€âÉ€ÛÉ€ÔÉ€ÍÉ€ÆÉ€¿É€¸É€±É€ªÉ€£É€œÉ€•É€ŽÉ€‡É€€É€yÉ€rÉ€kÉ€dÉ€]É€VÉ€OÉ€HÉ€AÉ€:É€3É€,É€%ɀɀɀɀ ɀɀûÈ€ôÈ€íÈ€æÈ€ßÈ€ØÈ€ÑÈ€ÊÈ€ÃÈ€¼È€µÈ€®È€§È€ È€™È€’È€‹È€„È€}È€vÈ€oÈ€hÈ€aÈ€ZÈ€SÈ€LÈ€EÈ€>È€7È€0È€)È€"ȀȀȀ ȀȀÿÇ€øÇ€ñÇ€êÇ€ãÇ€ÜÇ€ÕÇ€ÎÇ€ÇÇ€ÀÇ€¹Ç€²Ç€«Ç€¤Ç€Ç€–ǀǀˆÇ€Ç€zÇ€sÇ€lÇ€eÇ€^Ç€WÇ€PÇ€IÇ€BÇ€;Ç€4Ç€-Ç€&ǀǀǀǀ ǀǀüÆ€õÆ€îÆ€çÆ€àÆ€ÙÆ€ÒÆ€ËÆ€ÄÆ€½Æ€¶Æ€¯Æ€¨Æ€¡Æ€šÆ€“Æ€ŒÆ€…Æ€~Æ€wÆ€pÆ€iÆ€bÆ€[Æ€TÆ€MÆ€FÆ€?Æ€8Æ€1Æ€*Æ€#ƀƀƀƀƀƀùÅ€òÅ€ëÅ€äÅ€ÝÅ€ÖÅ€ÏÅ€ÈÅ€ÁÅ€ºÅ€³Å€¬Å€¥Å€žÅ€—ŀŀ‰Å€‚Å€{Å€tÅ€mÅ€fÅ€_Å€XÅ€QÅ€JÅ€CÅ€<Å€5Å€.Å€'Å€ ŀŀŀ ŀŀýÄ€öÄ€ïÄ€èÄ€áÄ€ÚÄ€ÓÄ€ÌÄ€ÅÄ€¾Ä€·Ä€°Ä€©Ä€¢Ä€›Ä€”†ĀĀxÄ€qÄ€jÄ€cÄ€\Ä€UÄ€NÄ€GÄ€@Ä€9Ä€2Ä€+Ä€$ĀĀĀĀĀĀúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»Ã€´Ã€­Ã€¦Ã€ŸÃ€˜Ã€‘ÀŠÃ€ƒÃ€|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ€÷€ð€é€â€Û€Ô€Í€ÆÂ€¿Â€¸Â€±Â€ªÂ€£Â€œÂ€•€ŽÂ€‡Â€€Â€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûÁ€ôÁ€íÁ€æÁ€ßÁ€ØÁ€ÑÁ€ÊÁ€ÃÁ€¼Á€µÁ€®Á€§Á€ Á€™Á€’Á€‹Á€„Á€}Á€vÁ€oÁ€hÁ€aÁ€ZÁ€SÁ€LÁ€EÁ€>Á€7Á€0Á€)Á€"Á€Á€Á€ Á€Á€ÿÀ€øÀ€ñÀ€êÀ€ãÀ€ÜÀ€ÕÀ€ÎÀ€ÇÀ€ÀÀ€¹À€²À€«À€¤À€À€–À€À€ˆÀ€À€zÀ€sÀ€lÀ€eÀ€^À€WÀ€PÀ€IÀ€BÀ€;À€4À€-À€&À€À€À€À€ À€À€ü¿€õ¿€î¿€ç¿€à¿€Ù¿€Ò¿€Ë¿€Ä¿€½¿€¶¿€¯¿€¨¿€¡¿€š¿€“¿€Œ¿€…¿€~¿€w¿€p¿€i¿€b¿€[¿€T¿€M¿€F¿€?¿€8¿€1¿€*¿€#¿€¿€¿€¿€¿€¿€ù¾€ò¾€ë¾€ä¾€ݾ€Ö¾€Ͼ€Ⱦ€Á¾€º¾€³¾€¬¾€¥¾€ž¾€—¾€¾€‰¾€‚¾€{¾€t¾€m¾€f¾€_¾€X¾€Q¾€J¾€C¾€<¾€5¾€.¾€'¾€ ¾€¾€¾€ ¾€¾€ý½€ö½€ï½€è½€á½€Ú½€Ó½€̽€Ž€¾½€·½€°½€©½€¢½€›½€”½€½€†½€½€x½€q½€j½€c½€\½€U½€N½€G½€@½€9½€2½€+½€$½€½€½€½€½€½€ú¼€ó¼€ì¼€å¼€Þ¼€×¼€м€ɼ€¼€»¼€´¼€­¼€¦¼€Ÿ¼€˜¼€‘¼€м€ƒ¼€|¼€u¼€n¼€g¼€`¼€Y¼€R¼€K¼€D¼€=¼€6¼€/¼€(¼€!¼€¼€¼€ ¼€¼€þ»€÷»€ð»€黀⻀Û»€Ô»€Í»€Æ»€¿»€¸»€±»€ª»€£»€œ»€•»€Ž»€‡»€€»€y»€r»€k»€d»€]»€V»€O»€H»€A»€:»€3»€,»€%»€»€»€»€ »€»€ûº€ôº€íº€満ߺ€غ€Ѻ€ʺ€ú€¼º€µº€®º€§º€ º€™º€’º€‹º€„º€}º€vº€oº€hº€aº€Zº€Sº€Lº€Eº€>º€7º€0º€)º€"º€º€º€ º€º€ÿ¹€ø¹€ñ¹€ê¹€ã¹€ܹ€Õ¹€ι€ǹ€À¹€¹¹€²¹€«¹€¤¹€¹€–¹€¹€ˆ¹€¹€z¹€s¹€l¹€e¹€^¹€W¹€P¹€I¹€B¹€;¹€4¹€-¹€&¹€¹€¹€¹€ ¹€¹€ü¸€õ¸€縀฀Ù¸€Ò¸€˸€ĸ€½¸€¶¸€¯¸€¨¸€¡¸€š¸€“¸€Œ¸€…¸€~¸€w¸€p¸€i¸€b¸€[¸€T¸€M¸€F¸€?¸€8¸€1¸€*¸€#¸€¸€¸€¸€¸€¸€ù·€ò·€ë·€ä·€Ý·€Ö·€Ï·€È·€Á·€º·€³·€¬·€¥·€ž·€—·€·€‰·€‚·€{·€t·€m·€f·€_·€X·€Q·€J·€C·€<·€5·€.·€'·€ ·€·€·€ ·€·€ý¶€ö¶€ï¶€è¶€á¶€Ú¶€Ó¶€̶€Ŷ€¾¶€·¶€°¶€©¶€¢¶€›¶€”¶€¶€†¶€¶€x¶€q¶€j¶€c¶€\¶€U¶€N¶€G¶€@¶€9¶€2¶€+¶€$¶€¶€¶€¶€¶€¶€úµ€óµ€ìµ€åµ€Þµ€×µ€е€ɵ€µ€»µ€´µ€­µ€¦µ€Ÿµ€˜µ€‘µ€е€ƒµ€|µ€uµ€nµ€gµ€`µ€Yµ€Rµ€Kµ€Dµ€=µ€6µ€/µ€(µ€!µ€µ€µ€ µ€µ€þ´€÷´€ð´€é´€â´€Û´€Ô´€Í´€Æ´€¿´€¸´€±´€ª´€£´€œ´€•´€Ž´€‡´€€´€y´€r´€k´€d´€]´€V´€O´€H´€A´€:´€3´€,´€%´€´€´€´€ ´€´€û³€ô³€í³€æ³€ß³€س€ѳ€ʳ€ó€¼³€µ³€®³€§³€ ³€™³€’³€‹³€„³€}³€v³€o³€h³€a³€Z³€S³€L³€E³€>³€7³€0³€)³€"³€³€³€ ³€³€ÿ²€ø²€ñ²€ê²€ã²€ܲ€Õ²€β€Dz€À²€¹²€²²€«²€¤²€²€–²€²€ˆ²€²€z²€s²€l²€e²€^²€W²€P²€I²€B²€;²€4²€-²€&²€²€²€²€ ²€²€ü±€õ±€î±€ç±€à±€Ù±€Ò±€˱€ı€½±€¶±€¯±€¨±€¡±€š±€“±€Œ±€…±€~±€w±€p±€i±€b±€[±€T±€M±€F±€?±€8±€1±€*±€#±€±€±€±€±€±€ù°€ò°€ë°€ä°€ݰ€Ö°€ϰ€Ȱ€Á°€º°€³°€¬°€¥°€ž°€—°€°€‰°€‚°€{°€t°€m°€f°€_°€X°€Q°€J°€C°€<°€5°€.°€'°€ °€°€°€ °€°€ý¯€ö¯€﯀诀ᯀÚ¯€Ó¯€̯€ů€¾¯€·¯€°¯€©¯€¢¯€›¯€”¯€¯€†¯€¯€x¯€q¯€j¯€c¯€\¯€U¯€N¯€G¯€@¯€9¯€2¯€+¯€$¯€¯€¯€¯€¯€¯€ú®€ó®€쮀宀Þ®€×®€Ю€É®€®€»®€´®€­®€¦®€Ÿ®€˜®€‘®€Š®€ƒ®€|®€u®€n®€g®€`®€Y®€R®€K®€D®€=®€6®€/®€(®€!®€®€®€ ®€®€þ­€÷­€ð­€é­€â­€Û­€Ô­€Í­€Æ­€¿­€¸­€±­€ª­€£­€œ­€•­€Ž­€‡­€€­€y­€r­€k­€d­€]­€V­€O­€H­€A­€:­€3­€,­€%­€­€­€­€ ­€­€û¬€ô¬€í¬€欀߬€ج€Ѭ€ʬ€ì€¼¬€µ¬€®¬€§¬€ ¬€™¬€’¬€‹¬€„¬€}¬€v¬€o¬€h¬€a¬€Z¬€S¬€L¬€E¬€>¬€7¬€0¬€)¬€"¬€¬€¬€ ¬€¬€ÿ«€ø«€ñ«€ê«€ã«€Ü«€Õ«€Ϋ€Ç«€À«€¹«€²«€««€¤«€«€–«€«€ˆ«€«€z«€s«€l«€e«€^«€W«€P«€I«€B«€;«€4«€-«€&«€«€«€«€ «€«€üª€õª€窀઀Ùª€Òª€˪€Ī€½ª€¶ª€¯ª€¨ª€¡ª€šª€“ª€Œª€…ª€~ª€wª€pª€iª€bª€[ª€Tª€Mª€Fª€?ª€8ª€1ª€*ª€#ª€ª€ª€ª€ª€ª€ù©€ò©€ë©€ä©€Ý©€Ö©€Ï©€È©€Á©€º©€³©€¬©€¥©€ž©€—©€©€‰©€‚©€{©€t©€m©€f©€_©€X©€Q©€J©€C©€<©€5©€.©€'©€ ©€©€©€ ©€©€ý¨€ö¨€切言ᨀÚ¨€Ó¨€̨€Ũ€¾¨€·¨€°¨€©¨€¢¨€›¨€”¨€¨€†¨€¨€x¨€q¨€j¨€c¨€\¨€U¨€N¨€G¨€@¨€9¨€2¨€+¨€$¨€¨€¨€¨€¨€¨€ú§€ó§€ì§€å§€Þ§€×§€Ч€ɧ€§€»§€´§€­§€¦§€Ÿ§€˜§€‘§€Ч€ƒ§€|§€u§€n§€g§€`§€Y§€R§€K§€D§€=§€6§€/§€(§€!§€§€§€ §€§€þ¦€÷¦€ð¦€馀⦀Û¦€Ô¦€ͦ€Ʀ€¿¦€¸¦€±¦€ª¦€£¦€œ¦€•¦€ަ€‡¦€€¦€y¦€r¦€k¦€d¦€]¦€V¦€O¦€H¦€A¦€:¦€3¦€,¦€%¦€¦€¦€¦€ ¦€¦€û¥€ô¥€í¥€楀ߥ€Ø¥€Ñ¥€Ê¥€Ã¥€¼¥€µ¥€®¥€§¥€ ¥€™¥€’¥€‹¥€„¥€}¥€v¥€o¥€h¥€a¥€Z¥€S¥€L¥€E¥€>¥€7¥€0¥€)¥€"¥€¥€¥€ ¥€¥€ÿ¤€ø¤€ñ¤€꤀㤀ܤ€Õ¤€Τ€Ǥ€À¤€¹¤€²¤€«¤€¤¤€¤€–¤€¤€ˆ¤€¤€z¤€s¤€l¤€e¤€^¤€W¤€P¤€I¤€B¤€;¤€4¤€-¤€&¤€¤€¤€¤€ ¤€¤€ü£€õ£€磀ࣀÙ£€Ò£€Ë£€Ä£€½£€¶£€¯£€¨£€¡£€š£€“£€Œ£€…£€~£€w£€p£€i£€b£€[£€T£€M£€F£€?£€8£€1£€*£€#£€£€£€£€£€£€ù¢€ò¢€뢀䢀Ý¢€Ö¢€Ï¢€È¢€Á¢€º¢€³¢€¬¢€¥¢€ž¢€—¢€¢€‰¢€‚¢€{¢€t¢€m¢€f¢€_¢€X¢€Q¢€J¢€C¢€<¢€5¢€.¢€'¢€ ¢€¢€¢€ ¢€¢€ý¡€ö¡€ï¡€è¡€á¡€Ú¡€Ó¡€Ì¡€Å¡€¾¡€·¡€°¡€©¡€¢¡€›¡€”¡€¡€†¡€¡€x¡€q¡€j¡€c¡€\¡€U¡€N¡€G¡€@¡€9¡€2¡€+¡€$¡€¡€¡€¡€¡€¡€ú €ó €ì €å €Þ €× €Р€É € €» €´ €­ €¦ €Ÿ €˜ €‘ €Š €ƒ €| €u €n €g €` €Y €R €K €D €= €6 €/ €( €! € € €  € €þŸ€÷Ÿ€ðŸ€韀⟀ÛŸ€ÔŸ€ÍŸ€ÆŸ€¿Ÿ€¸Ÿ€±Ÿ€ªŸ€£Ÿ€œŸ€•Ÿ€ŽŸ€‡Ÿ€€Ÿ€yŸ€rŸ€kŸ€dŸ€]Ÿ€VŸ€OŸ€HŸ€AŸ€:Ÿ€3Ÿ€,Ÿ€%Ÿ€Ÿ€Ÿ€Ÿ€ Ÿ€Ÿ€ûž€ôž€힀枀ßž€Øž€Ñž€Êž€Þ€¼ž€µž€®ž€§ž€ ž€™ž€’ž€‹ž€„ž€}ž€vž€ož€hž€až€Zž€Sž€Lž€Ež€>ž€7ž€0ž€)ž€"ž€ž€ž€ ž€ž€ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üœ€õœ€眀àœ€Ùœ€Òœ€Ëœ€Äœ€½œ€¶œ€¯œ€¨œ€¡œ€šœ€“œ€Œœ€…œ€~œ€wœ€pœ€iœ€bœ€[œ€Tœ€Mœ€Fœ€?œ€8œ€1œ€*œ€#œ€œ€œ€œ€œ€œ€ù›€ò›€뛀䛀Ý›€Ö›€Ï›€È›€Á›€º›€³›€¬›€¥›€ž›€—›€›€‰›€‚›€{›€t›€m›€f›€_›€X›€Q›€J›€C›€<›€5›€.›€'›€ ›€›€›€ ›€›€ýš€öš€蚀 Úš€Óš€Ìš€Åš€¾š€·š€°š€©š€¢š€›š€”š€š€†š€š€xš€qš€jš€cš€\š€Uš€Nš€Gš€@š€9š€2š€+š€$š€š€š€š€š€š€ú™€ó™€와噀Þ™€×™€Й€É™€™€»™€´™€­™€¦™€Ÿ™€˜™€‘™€Š™€ƒ™€|™€u™€n™€g™€`™€Y™€R™€K™€D™€=™€6™€/™€(™€!™€™€™€ ™€™€þ˜€÷˜€ð˜€阀☀Û˜€Ô˜€͘€Ƙ€¿˜€¸˜€±˜€ª˜€£˜€œ˜€•˜€Ž˜€‡˜€€˜€y˜€r˜€k˜€d˜€]˜€V˜€O˜€H˜€A˜€:˜€3˜€,˜€%˜€˜€˜€˜€ ˜€˜€û—€ô—€í—€æ—€ß—€Ø—€Ñ—€Ê—€×€¼—€µ—€®—€§—€ —€™—€’—€‹—€„—€}—€v—€o—€h—€a—€Z—€S—€L—€E—€>—€7—€0—€)—€"—€—€—€ —€—€ÿ–€ø–€ñ–€ê–€ã–€Ü–€Õ–€Ζ€Ç–€À–€¹–€²–€«–€¤–€–€––€–€ˆ–€–€z–€s–€l–€e–€^–€W–€P–€I–€B–€;–€4–€-–€&–€–€–€–€ –€–€ü•€õ•€î•€ç•€à•€Ù•€Ò•€Ë•€Ä•€½•€¶•€¯•€¨•€¡•€š•€“•€Œ•€…•€~•€w•€p•€i•€b•€[•€T•€M•€F•€?•€8•€1•€*•€#•€•€•€•€•€•€ù”€ò”€딀䔀Ý”€Ö”€Ï”€È”€Á”€º”€³”€¬”€¥”€ž”€—”€”€‰”€‚”€{”€t”€m”€f”€_”€X”€Q”€J”€C”€<”€5”€.”€'”€ ”€”€”€ ”€”€ý“€ö“€ï“€è“€á“€Ú“€Ó“€Ì“€Å“€¾“€·“€°“€©“€¢“€›“€”“€“€†“€“€x“€q“€j“€c“€\“€U“€N“€G“€@“€9“€2“€+“€$“€“€“€“€“€“€ú’€ó’€ì’€å’€Þ’€×’€Ð’€É’€Â’€»’€´’€­’€¦’€Ÿ’€˜’€‘’€Š’€ƒ’€|’€u’€n’€g’€`’€Y’€R’€K’€D’€=’€6’€/’€(’€!’€’€’€ ’€’€þ‘€÷‘€ð‘€é‘€â‘€Û‘€Ô‘€Í‘€Æ‘€¿‘€¸‘€±‘€ª‘€£‘€œ‘€•‘€Ž‘€‡‘€€‘€y‘€r‘€k‘€d‘€]‘€V‘€O‘€H‘€A‘€:‘€3‘€,‘€%‘€‘€‘€‘€ ‘€‘€û€ô€í€æ€߀؀рʀÀ¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üŽ€õŽ€玀àŽ€ÙŽ€ÒŽ€ËŽ€ÄŽ€½Ž€¶Ž€¯Ž€¨Ž€¡Ž€šŽ€“Ž€ŒŽ€…Ž€~Ž€wŽ€pŽ€iŽ€bŽ€[Ž€TŽ€MŽ€FŽ€?Ž€8Ž€1Ž€*Ž€#ހހހހހހù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýŒ€öŒ€茀ጀÚŒ€ÓŒ€ÌŒ€ÅŒ€¾Œ€·Œ€°Œ€©Œ€¢Œ€›Œ€”Œ€Œ€†Œ€Œ€xŒ€qŒ€jŒ€cŒ€\Œ€UŒ€NŒ€GŒ€@Œ€9Œ€2Œ€+Œ€$Œ€Œ€Œ€Œ€Œ€Œ€ú‹€ó‹€ì‹€å‹€Þ‹€׋€Ћ€É‹€‹€»‹€´‹€­‹€¦‹€Ÿ‹€˜‹€‘‹€Š‹€ƒ‹€|‹€u‹€n‹€g‹€`‹€Y‹€R‹€K‹€D‹€=‹€6‹€/‹€(‹€!‹€‹€‹€ ‹€‹€þŠ€÷Š€ðŠ€銀⊀ÛŠ€ÔŠ€ÍŠ€ÆŠ€¿Š€¸Š€±Š€ªŠ€£Š€œŠ€•Š€ŽŠ€‡Š€€Š€yŠ€rŠ€kŠ€dŠ€]Š€VŠ€OŠ€HŠ€AŠ€:Š€3Š€,Š€%ЀЀЀЀ ЀЀû‰€ô‰€퉀所߉€؉€щ€ʉ€É€¼‰€µ‰€®‰€§‰€ ‰€™‰€’‰€‹‰€„‰€}‰€v‰€o‰€h‰€a‰€Z‰€S‰€L‰€E‰€>‰€7‰€0‰€)‰€"‰€‰€‰€ ‰€‰€ÿˆ€øˆ€ñˆ€ꈀ㈀܈€Õˆ€Έ€Lj€Àˆ€¹ˆ€²ˆ€«ˆ€¤ˆ€ˆ€–ˆ€ˆ€ˆˆ€ˆ€zˆ€sˆ€lˆ€eˆ€^ˆ€Wˆ€Pˆ€Iˆ€Bˆ€;ˆ€4ˆ€-ˆ€&ˆ€ˆ€ˆ€ˆ€ ˆ€ˆ€ü‡€õ‡€燀à‡€Ù‡€Ò‡€ˇ€ć€½‡€¶‡€¯‡€¨‡€¡‡€š‡€“‡€Œ‡€…‡€~‡€w‡€p‡€i‡€b‡€[‡€T‡€M‡€F‡€?‡€8‡€1‡€*‡€#‡€‡€‡€‡€‡€‡€ù†€ò†€놀䆀݆€Ö†€φ€Ȇ€Á†€º†€³†€¬†€¥†€ž†€—†€†€‰†€‚†€{†€t†€m†€f†€_†€X†€Q†€J†€C†€<†€5†€.†€'†€ †€†€†€ †€†€ý…€ö…€ï…€è…€á…€Ú…€Ó…€Ì…€Å…€¾…€·…€°…€©…€¢…€›…€”…€…€†…€…€x…€q…€j…€c…€\…€U…€N…€G…€@…€9…€2…€+…€$…€…€…€…€…€…€ú„€ó„€ì„€å„€Þ„€ׄ€Є€É„€„€»„€´„€­„€¦„€Ÿ„€˜„€‘„€Š„€ƒ„€|„€u„€n„€g„€`„€Y„€R„€K„€D„€=„€6„€/„€(„€!„€„€„€ „€„€þƒ€÷ƒ€ðƒ€郀⃀Ûƒ€Ôƒ€̓€ƃ€¿ƒ€¸ƒ€±ƒ€ªƒ€£ƒ€œƒ€•ƒ€Žƒ€‡ƒ€€ƒ€yƒ€rƒ€kƒ€dƒ€]ƒ€Vƒ€Oƒ€Hƒ€Aƒ€:ƒ€3ƒ€,ƒ€%ƒ€ƒ€ƒ€ƒ€ ƒ€ƒ€û‚€ô‚€í‚€æ‚€ß‚€Ø‚€Ñ‚€Ê‚€€¼‚€µ‚€®‚€§‚€ ‚€™‚€’‚€‹‚€„‚€}‚€v‚€o‚€h‚€a‚€Z‚€S‚€L‚€E‚€>‚€7‚€0‚€)‚€"‚€‚€‚€ ‚€‚€ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€ü€€õ€€瀀à€€Ù€€Ò€€Ë€€Ä€€½€€¶€€¯€€¨€€¡€€š€€“€€Œ€€…€€~€€w€€p€€i€€b€€[€€T€€M€€F€€?€€8€€1€€*€€#€€€€€€€€€€€€ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý~€ö~€ï~€è~€á~€Ú~€Ó~€Ì~€Å~€¾~€·~€°~€©~€¢~€›~€”~€~€†~€~€x~€q~€j~€c~€\~€U~€N~€G~€@~€9~€2~€+~€$~€~€~€~€~€~€ú}€ó}€ì}€å}€Þ}€×}€Ð}€É}€Â}€»}€´}€­}€¦}€Ÿ}€˜}€‘}€Š}€ƒ}€|}€u}€n}€g}€`}€Y}€R}€K}€D}€=}€6}€/}€(}€!}€}€}€ }€}€þ|€÷|€ð|€é|€â|€Û|€Ô|€Í|€Æ|€¿|€¸|€±|€ª|€£|€œ|€•|€Ž|€‡|€€|€y|€r|€k|€d|€]|€V|€O|€H|€A|€:|€3|€,|€%|€|€|€|€ |€|€û{€ô{€í{€æ{€ß{€Ø{€Ñ{€Ê{€Ã{€¼{€µ{€®{€§{€ {€™{€’{€‹{€„{€}{€v{€o{€h{€a{€Z{€S{€L{€E{€>{€7{€0{€){€"{€{€{€ {€{€ÿz€øz€ñz€êz€ãz€Üz€Õz€Îz€Çz€Àz€¹z€²z€«z€¤z€z€–z€z€ˆz€z€zz€sz€lz€ez€^z€Wz€Pz€Iz€Bz€;z€4z€-z€&z€z€z€z€ z€z€üy€õy€îy€çy€ày€Ùy€Òy€Ëy€Äy€½y€¶y€¯y€¨y€¡y€šy€“y€Œy€…y€~y€wy€py€iy€by€[y€Ty€My€Fy€?y€8y€1y€*y€#y€y€y€y€y€y€ùx€òx€ëx€äx€Ýx€Öx€Ïx€Èx€Áx€ºx€³x€¬x€¥x€žx€—x€x€‰x€‚x€{x€tx€mx€fx€_x€Xx€Qx€Jx€Cx€t€7t€0t€)t€"t€t€t€ t€t€ÿs€øs€ñs€ês€ãs€Üs€Õs€Îs€Çs€Às€¹s€²s€«s€¤s€s€–s€s€ˆs€s€zs€ss€ls€es€^s€Ws€Ps€Is€Bs€;s€4s€-s€&s€s€s€s€ s€s€ür€õr€îr€çr€àr€Ùr€Òr€Ër€Är€½r€¶r€¯r€¨r€¡r€šr€“r€Œr€…r€~r€wr€pr€ir€br€[r€Tr€Mr€Fr€?r€8r€1r€*r€#r€r€r€r€r€r€ùq€òq€ëq€äq€Ýq€Öq€Ïq€Èq€Áq€ºq€³q€¬q€¥q€žq€—q€q€‰q€‚q€{q€tq€mq€fq€_q€Xq€Qq€Jq€Cq€m€7m€0m€)m€"m€m€m€ m€m€ÿl€øl€ñl€êl€ãl€Ül€Õl€Îl€Çl€Àl€¹l€²l€«l€¤l€l€–l€l€ˆl€l€zl€sl€ll€el€^l€Wl€Pl€Il€Bl€;l€4l€-l€&l€l€l€l€ l€l€ük€õk€îk€çk€àk€Ùk€Òk€Ëk€Äk€½k€¶k€¯k€¨k€¡k€šk€“k€Œk€…k€~k€wk€pk€ik€bk€[k€Tk€Mk€Fk€?k€8k€1k€*k€#k€k€k€k€k€k€ùj€òj€ëj€äj€Ýj€Öj€Ïj€Èj€Áj€ºj€³j€¬j€¥j€žj€—j€j€‰j€‚j€{j€tj€mj€fj€_j€Xj€Qj€Jj€Cj€f€7f€0f€)f€"f€f€f€ f€f€ÿe€øe€ñe€êe€ãe€Üe€Õe€Îe€Çe€Àe€¹e€²e€«e€¤e€e€–e€e€ˆe€e€ze€se€le€ee€^e€We€Pe€Ie€Be€;e€4e€-e€&e€e€e€e€ e€e€üd€õd€îd€çd€àd€Ùd€Òd€Ëd€Äd€½d€¶d€¯d€¨d€¡d€šd€“d€Œd€…d€~d€wd€pd€id€bd€[d€Td€Md€Fd€?d€8d€1d€*d€#d€d€d€d€d€d€ùc€òc€ëc€äc€Ýc€Öc€Ïc€Èc€Ác€ºc€³c€¬c€¥c€žc€—c€c€‰c€‚c€{c€tc€mc€fc€_c€Xc€Qc€Jc€Cc€_€7_€0_€)_€"_€_€_€ _€_€ÿ^€ø^€ñ^€ê^€ã^€Ü^€Õ^€Î^€Ç^€À^€¹^€²^€«^€¤^€^€–^€^€ˆ^€^€z^€s^€l^€e^€^^€W^€P^€I^€B^€;^€4^€-^€&^€^€^€^€ ^€^€ü]€õ]€î]€ç]€à]€Ù]€Ò]€Ë]€Ä]€½]€¶]€¯]€¨]€¡]€š]€“]€Œ]€…]€~]€w]€p]€i]€b]€[]€T]€M]€F]€?]€8]€1]€*]€#]€]€]€]€]€]€ù\€ò\€ë\€ä\€Ý\€Ö\€Ï\€È\€Á\€º\€³\€¬\€¥\€ž\€—\€\€‰\€‚\€{\€t\€m\€f\€_\€X\€Q\€J\€C\€<\€5\€.\€'\€ \€\€\€ \€\€ý[€ö[€ï[€è[€á[€Ú[€Ó[€Ì[€Å[€¾[€·[€°[€©[€¢[€›[€”[€[€†[€[€x[€q[€j[€c[€\[€U[€N[€G[€@[€9[€2[€+[€$[€[€[€[€[€[€úZ€óZ€ìZ€åZ€ÞZ€×Z€ÐZ€ÉZ€ÂZ€»Z€´Z€­Z€¦Z€ŸZ€˜Z€‘Z€ŠZ€ƒZ€|Z€uZ€nZ€gZ€`Z€YZ€RZ€KZ€DZ€=Z€6Z€/Z€(Z€!Z€Z€Z€ Z€Z€þY€÷Y€ðY€éY€âY€ÛY€ÔY€ÍY€ÆY€¿Y€¸Y€±Y€ªY€£Y€œY€•Y€ŽY€‡Y€€Y€yY€rY€kY€dY€]Y€VY€OY€HY€AY€:Y€3Y€,Y€%Y€Y€Y€Y€ Y€Y€ûX€ôX€íX€æX€ßX€ØX€ÑX€ÊX€ÃX€¼X€µX€®X€§X€ X€™X€’X€‹X€„X€}X€vX€oX€hX€aX€ZX€SX€LX€EX€>X€7X€0X€)X€"X€X€X€ X€X€ÿW€øW€ñW€êW€ãW€ÜW€ÕW€ÎW€ÇW€ÀW€¹W€²W€«W€¤W€W€–W€W€ˆW€W€zW€sW€lW€eW€^W€WW€PW€IW€BW€;W€4W€-W€&W€W€W€W€ W€W€üV€õV€îV€çV€àV€ÙV€ÒV€ËV€ÄV€½V€¶V€¯V€¨V€¡V€šV€“V€ŒV€…V€~V€wV€pV€iV€bV€[V€TV€MV€FV€?V€8V€1V€*V€#V€V€V€V€V€V€ùU€òU€ëU€äU€ÝU€ÖU€ÏU€ÈU€ÁU€ºU€³U€¬U€¥U€žU€—U€U€‰U€‚U€{U€tU€mU€fU€_U€XU€QU€JU€CU€Q€7Q€0Q€)Q€"Q€Q€Q€ Q€Q€ÿP€øP€ñP€êP€ãP€ÜP€ÕP€ÎP€ÇP€ÀP€¹P€²P€«P€¤P€P€–P€P€ˆP€P€zP€sP€lP€eP€^P€WP€PP€IP€BP€;P€4P€-P€&P€P€P€P€ P€P€üO€õO€îO€çO€àO€ÙO€ÒO€ËO€ÄO€½O€¶O€¯O€¨O€¡O€šO€“O€ŒO€…O€~O€wO€pO€iO€bO€[O€TO€MO€FO€?O€8O€1O€*O€#O€O€O€O€O€O€ùN€òN€ëN€äN€ÝN€ÖN€ÏN€ÈN€ÁN€ºN€³N€¬N€¥N€žN€—N€N€‰N€‚N€{N€tN€mN€fN€_N€XN€QN€JN€CN€J€7J€0J€)J€"J€J€J€ J€J€ÿI€øI€ñI€êI€ãI€ÜI€ÕI€ÎI€ÇI€ÀI€¹I€²I€«I€¤I€I€–I€I€ˆI€I€zI€sI€lI€eI€^I€WI€PI€II€BI€;I€4I€-I€&I€I€I€I€ I€I€üH€õH€îH€çH€àH€ÙH€ÒH€ËH€ÄH€½H€¶H€¯H€¨H€¡H€šH€“H€ŒH€…H€~H€wH€pH€iH€bH€[H€TH€MH€FH€?H€8H€1H€*H€#H€H€H€H€H€H€ùG€òG€ëG€äG€ÝG€ÖG€ÏG€ÈG€ÁG€ºG€³G€¬G€¥G€žG€—G€G€‰G€‚G€{G€tG€mG€fG€_G€XG€QG€JG€CG€C€7C€0C€)C€"C€C€C€ C€C€ÿB€øB€ñB€êB€ãB€ÜB€ÕB€ÎB€ÇB€ÀB€¹B€²B€«B€¤B€B€–B€B€ˆB€B€zB€sB€lB€eB€^B€WB€PB€IB€BB€;B€4B€-B€&B€B€B€B€ B€B€üA€õA€îA€çA€àA€ÙA€ÒA€ËA€ÄA€½A€¶A€¯A€¨A€¡A€šA€“A€ŒA€…A€~A€wA€pA€iA€bA€[A€TA€MA€FA€?A€8A€1A€*A€#A€A€A€A€A€A€ù@€ò@€ë@€ä@€Ý@€Ö@€Ï@€È@€Á@€º@€³@€¬@€¥@€ž@€—@€@€‰@€‚@€{@€t@€m@€f@€_@€X@€Q@€J@€C@€<@€5@€.@€'@€ @€@€@€ @€@€ý?€ö?€ï?€è?€á?€Ú?€Ó?€Ì?€Å?€¾?€·?€°?€©?€¢?€›?€”?€?€†?€?€x?€q?€j?€c?€\?€U?€N?€G?€@?€9?€2?€+?€$?€?€?€?€?€?€ú>€ó>€ì>€å>€Þ>€×>€Ð>€É>€Â>€»>€´>€­>€¦>€Ÿ>€˜>€‘>€Š>€ƒ>€|>€u>€n>€g>€`>€Y>€R>€K>€D>€=>€6>€/>€(>€!>€>€>€ >€>€þ=€÷=€ð=€é=€â=€Û=€Ô=€Í=€Æ=€¿=€¸=€±=€ª=€£=€œ=€•=€Ž=€‡=€€=€y=€r=€k=€d=€]=€V=€O=€H=€A=€:=€3=€,=€%=€=€=€=€ =€=€û<€ô<€í<€æ<€ß<€Ø<€Ñ<€Ê<€Ã<€¼<€µ<€®<€§<€ <€™<€’<€‹<€„<€}<€v<€o<€h<€a<€Z<€S<€L<€E<€><€7<€0<€)<€"<€<€<€ <€<€ÿ;€ø;€ñ;€ê;€ã;€Ü;€Õ;€Î;€Ç;€À;€¹;€²;€«;€¤;€;€–;€;€ˆ;€;€z;€s;€l;€e;€^;€W;€P;€I;€B;€;;€4;€-;€&;€;€;€;€ ;€;€ü:€õ:€î:€ç:€à:€Ù:€Ò:€Ë:€Ä:€½:€¶:€¯:€¨:€¡:€š:€“:€Œ:€…:€~:€w:€p:€i:€b:€[:€T:€M:€F:€?:€8:€1:€*:€#:€:€:€:€:€:€ù9€ò9€ë9€ä9€Ý9€Ö9€Ï9€È9€Á9€º9€³9€¬9€¥9€ž9€—9€9€‰9€‚9€{9€t9€m9€f9€_9€X9€Q9€J9€C9€<9€59€.9€'9€ 9€9€9€ 9€9€ý8€ö8€ï8€è8€á8€Ú8€Ó8€Ì8€Å8€¾8€·8€°8€©8€¢8€›8€”8€8€†8€8€x8€q8€j8€c8€\8€U8€N8€G8€@8€98€28€+8€$8€8€8€8€8€8€ú7€ó7€ì7€å7€Þ7€×7€Ð7€É7€Â7€»7€´7€­7€¦7€Ÿ7€˜7€‘7€Š7€ƒ7€|7€u7€n7€g7€`7€Y7€R7€K7€D7€=7€67€/7€(7€!7€7€7€ 7€7€þ6€÷6€ð6€é6€â6€Û6€Ô6€Í6€Æ6€¿6€¸6€±6€ª6€£6€œ6€•6€Ž6€‡6€€6€y6€r6€k6€d6€]6€V6€O6€H6€A6€:6€36€,6€%6€6€6€6€ 6€6€û5€ô5€í5€æ5€ß5€Ø5€Ñ5€Ê5€Ã5€¼5€µ5€®5€§5€ 5€™5€’5€‹5€„5€}5€v5€o5€h5€a5€Z5€S5€L5€E5€>5€75€05€)5€"5€5€5€ 5€5€ÿ4€ø4€ñ4€ê4€ã4€Ü4€Õ4€Î4€Ç4€À4€¹4€²4€«4€¤4€4€–4€4€ˆ4€4€z4€s4€l4€e4€^4€W4€P4€I4€B4€;4€44€-4€&4€4€4€4€ 4€4€ü3€õ3€î3€ç3€à3€Ù3€Ò3€Ë3€Ä3€½3€¶3€¯3€¨3€¡3€š3€“3€Œ3€…3€~3€w3€p3€i3€b3€[3€T3€M3€F3€?3€83€13€*3€#3€3€3€3€3€3€ù2€ò2€ë2€ä2€Ý2€Ö2€Ï2€È2€Á2€º2€³2€¬2€¥2€ž2€—2€2€‰2€‚2€{2€t2€m2€f2€_2€X2€Q2€J2€C2€<2€52€.2€'2€ 2€2€2€ 2€2€ý1€ö1€ï1€è1€á1€Ú1€Ó1€Ì1€Å1€¾1€·1€°1€©1€¢1€›1€”1€1€†1€1€x1€q1€j1€c1€\1€U1€N1€G1€@1€91€21€+1€$1€1€1€1€1€1€ú0€ó0€ì0€å0€Þ0€×0€Ð0€É0€Â0€»0€´0€­0€¦0€Ÿ0€˜0€‘0€Š0€ƒ0€|0€u0€n0€g0€`0€Y0€R0€K0€D0€=0€60€/0€(0€!0€0€0€ 0€0€þ/€÷/€ð/€é/€â/€Û/€Ô/€Í/€Æ/€¿/€¸/€±/€ª/€£/€œ/€•/€Ž/€‡/€€/€y/€r/€k/€d/€]/€V/€O/€H/€A/€:/€3/€,/€%/€/€/€/€ /€/€û.€ô.€í.€æ.€ß.€Ø.€Ñ.€Ê.€Ã.€¼.€µ.€®.€§.€ .€™.€’.€‹.€„.€}.€v.€o.€h.€a.€Z.€S.€L.€E.€>.€7.€0.€).€".€.€.€ .€.€ÿ-€ø-€ñ-€ê-€ã-€Ü-€Õ-€Î-€Ç-€À-€¹-€²-€«-€¤-€-€–-€-€ˆ-€-€z-€s-€l-€e-€^-€W-€P-€I-€B-€;-€4-€--€&-€-€-€-€ -€-€ü,€õ,€î,€ç,€à,€Ù,€Ò,€Ë,€Ä,€½,€¶,€¯,€¨,€¡,€š,€“,€Œ,€…,€~,€w,€p,€i,€b,€[,€T,€M,€F,€?,€8,€1,€*,€#,€,€,€,€,€,€ù+€ò+€ë+€ä+€Ý+€Ö+€Ï+€È+€Á+€º+€³+€¬+€¥+€ž+€—+€+€‰+€‚+€{+€t+€m+€f+€_+€X+€Q+€J+€C+€<+€5+€.+€'+€ +€+€+€ +€+€ý*€ö*€ï*€è*€á*€Ú*€Ó*€Ì*€Å*€¾*€·*€°*€©*€¢*€›*€”*€*€†*€*€x*€q*€j*€c*€\*€U*€N*€G*€@*€9*€2*€+*€$*€*€*€*€*€*€ú)€ó)€ì)€å)€Þ)€×)€Ð)€É)€Â)€»)€´)€­)€¦)€Ÿ)€˜)€‘)€Š)€ƒ)€|)€u)€n)€g)€`)€Y)€R)€K)€D)€=)€6)€/)€()€!)€)€)€ )€)€þ(€÷(€ð(€é(€â(€Û(€Ô(€Í(€Æ(€¿(€¸(€±(€ª(€£(€œ(€•(€Ž(€‡(€€(€y(€r(€k(€d(€](€V(€O(€H(€A(€:(€3(€,(€%(€(€(€(€ (€(€û'€ô'€í'€æ'€ß'€Ø'€Ñ'€Ê'€Ã'€¼'€µ'€®'€§'€ '€™'€’'€‹'€„'€}'€v'€o'€h'€a'€Z'€S'€L'€E'€>'€7'€0'€)'€"'€'€'€ '€'€ÿ&€ø&€ñ&€ê&€ã&€Ü&€Õ&€Î&€Ç&€À&€¹&€²&€«&€¤&€&€–&€&€ˆ&€&€z&€s&€l&€e&€^&€W&€P&€I&€B&€;&€4&€-&€&&€&€&€&€ &€&€ü%€õ%€î%€ç%€à%€Ù%€Ò%€Ë%€Ä%€½%€¶%€¯%€¨%€¡%€š%€“%€Œ%€…%€~%€w%€p%€i%€b%€[%€T%€M%€F%€?%€8%€1%€*%€#%€%€%€%€%€%€ù$€ò$€ë$€ä$€Ý$€Ö$€Ï$€È$€Á$€º$€³$€¬$€¥$€ž$€—$€$€‰$€‚$€{$€t$€m$€f$€_$€X$€Q$€J$€C$€<$€5$€.$€'$€ $€$€$€ $€$€ý#€ö#€ï#€è#€á#€Ú#€Ó#€Ì#€Å#€¾#€·#€°#€©#€¢#€›#€”#€#€†#€#€x#€q#€j#€c#€\#€U#€N#€G#€@#€9#€2#€+#€$#€#€#€#€#€#€ú"€ó"€ì"€å"€Þ"€×"€Ð"€É"€Â"€»"€´"€­"€¦"€Ÿ"€˜"€‘"€Š"€ƒ"€|"€u"€n"€g"€`"€Y"€R"€K"€D"€="€6"€/"€("€!"€"€"€ "€"€þ!€÷!€ð!€é!€â!€Û!€Ô!€Í!€Æ!€¿!€¸!€±!€ª!€£!€œ!€•!€Ž!€‡!€€!€y!€r!€k!€d!€]!€V!€O!€H!€A!€:!€3!€,!€%!€!€!€!€ !€!€û €ô €í €æ €ß €Ø €Ñ €Ê €à €¼ €µ €® €§ €  €™ €’ €‹ €„ €} €v €o €h €a €Z €S €L €E €> €7 €0 €) €" € € € € €ÿ€ø€ñ€ê€ã€Ü€Õ€Î€Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€ú€ó€ì€å€Þ€×€Ð€É€Â€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€û€ô€í€æ€ß€Ø€Ñ€Ê€Ã€¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿ€ø€ñ€ê€ã€Ü€Õ€Î€Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€ú€ó€ì€å€Þ€×€Ð€É€Â€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€û€ô€í€æ€ß€Ø€Ñ€Ê€Ã€¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿ€ø€ñ€ê€ã€Ü€Õ€Î€Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€ú €ó €ì €å €Þ €× €Ð €É € €» €´ €­ €¦ €Ÿ €˜ €‘ €Š €ƒ €| €u €n €g €` €Y €R €K €D €= €6 €/ €( €! € € € € €þ €÷ €ð €é €â €Û €Ô €Í €Æ €¿ €¸ €± €ª €£ €œ €• €Ž €‡ €€ €y €r €k €d €] €V €O €H €A €: €3 €, €% € € € € € €û €ô €í €æ €ß €Ø €Ñ €Ê €à €¼ €µ €® €§ €  €™ €’ €‹ €„ €} €v €o €h €a €Z €S €L €E €> €7 €0 €) €" € € € € €ÿ €ø €ñ €ê €ã €Ü €Õ €Î €Ç €À €¹ €² €« €¤ € €– € €ˆ € €z €s €l €e €^ €W €P €I €B €; €4 €- €& € € € € € €ü €õ €î €ç €à €Ù €Ò €Ë €Ä €½ €¶ €¯ €¨ €¡ €š €“ €Œ €… €~ €w €p €i €b €[ €T €M €F €? €8 €1 €* €# € € € € € €ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€ú€ó€ì€å€Þ€×€Ð€É€Â€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€û€ô€í€æ€ß€Ø€Ñ€Ê€Ã€¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿ€ø€ñ€ê€ã€Ü€Õ€Î€Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿ~õÿ~îÿ~çÿ~àÿ~Ùÿ~Òÿ~Ëÿ~Äÿ~½ÿ~¶ÿ~¯ÿ~¨ÿ~¡ÿ~šÿ~“ÿ~Œÿ~…ÿ~~ÿ~wÿ~pÿ~iÿ~bÿ~[ÿ~Tÿ~Mÿ~Fÿ~?ÿ~8ÿ~1ÿ~*ÿ~#ÿ~ÿ~ÿ~ÿ~ÿ~ÿ~ùþ~òþ~ëþ~äþ~Ýþ~Öþ~Ïþ~Èþ~Áþ~ºþ~³þ~¬þ~¥þ~žþ~—þ~þ~‰þ~‚þ~{þ~tþ~mþ~fþ~_þ~Xþ~Qþ~Jþ~Cþ~<þ~5þ~.þ~'þ~ þ~þ~þ~ þ~þ~ýý~öý~ïý~èý~áý~Úý~Óý~Ìý~Åý~¾ý~·ý~°ý~©ý~¢ý~›ý~”ý~ý~†ý~ý~xý~qý~jý~cý~\ý~Uý~Ný~Gý~@ý~9ý~2ý~+ý~$ý~ý~ý~ý~ý~ý~úü~óü~ìü~åü~Þü~×ü~Ðü~Éü~Âü~»ü~´ü~­ü~¦ü~Ÿü~˜ü~‘ü~Šü~ƒü~|ü~uü~nü~gü~`ü~Yü~Rü~Kü~Dü~=ü~6ü~/ü~(ü~!ü~ü~ü~ ü~ü~þû~÷û~ðû~éû~âû~Ûû~Ôû~Íû~Æû~¿û~¸û~±û~ªû~£û~œû~•û~Žû~‡û~€û~yû~rû~kû~dû~]û~Vû~Oû~Hû~Aû~:û~3û~,û~%û~û~û~û~ û~û~ûú~ôú~íú~æú~ßú~Øú~Ñú~Êú~Ãú~¼ú~µú~®ú~§ú~ ú~™ú~’ú~‹ú~„ú~}ú~vú~oú~hú~aú~Zú~Sú~Lú~Eú~>ú~7ú~0ú~)ú~"ú~ú~ú~ ú~ú~ÿù~øù~ñù~êù~ãù~Üù~Õù~Îù~Çù~Àù~¹ù~²ù~«ù~¤ù~ù~–ù~ù~ˆù~ù~zù~sù~lù~eù~^ù~Wù~Pù~Iù~Bù~;ù~4ù~-ù~&ù~ù~ù~ù~ ù~ù~üø~õø~îø~çø~àø~Ùø~Òø~Ëø~Äø~½ø~¶ø~¯ø~¨ø~¡ø~šø~“ø~Œø~…ø~~ø~wø~pø~iø~bø~[ø~Tø~Mø~Fø~?ø~8ø~1ø~*ø~#ø~ø~ø~ø~ø~ø~ù÷~ò÷~ë÷~ä÷~Ý÷~Ö÷~Ï÷~È÷~Á÷~º÷~³÷~¬÷~¥÷~ž÷~—÷~÷~‰÷~‚÷~{÷~t÷~m÷~f÷~_÷~X÷~Q÷~J÷~C÷~<÷~5÷~.÷~'÷~ ÷~÷~÷~ ÷~÷~ýö~öö~ïö~èö~áö~Úö~Óö~Ìö~Åö~¾ö~·ö~°ö~©ö~¢ö~›ö~”ö~ö~†ö~ö~xö~qö~jö~cö~\ö~Uö~Nö~Gö~@ö~9ö~2ö~+ö~$ö~ö~ö~ö~ö~ö~úõ~óõ~ìõ~åõ~Þõ~×õ~Ðõ~Éõ~Âõ~»õ~´õ~­õ~¦õ~Ÿõ~˜õ~‘õ~Šõ~ƒõ~|õ~uõ~nõ~gõ~`õ~Yõ~Rõ~Kõ~Dõ~=õ~6õ~/õ~(õ~!õ~õ~õ~ õ~õ~þô~÷ô~ðô~éô~âô~Ûô~Ôô~Íô~Æô~¿ô~¸ô~±ô~ªô~£ô~œô~•ô~Žô~‡ô~€ô~yô~rô~kô~dô~]ô~Vô~Oô~Hô~Aô~:ô~3ô~,ô~%ô~ô~ô~ô~ ô~ô~ûó~ôó~íó~æó~ßó~Øó~Ñó~Êó~Ãó~¼ó~µó~®ó~§ó~ ó~™ó~’ó~‹ó~„ó~}ó~vó~oó~hó~aó~Zó~Só~Ló~Eó~>ó~7ó~0ó~)ó~"ó~ó~ó~ ó~ó~ÿò~øò~ñò~êò~ãò~Üò~Õò~Îò~Çò~Àò~¹ò~²ò~«ò~¤ò~ò~–ò~ò~ˆò~ò~zò~sò~lò~eò~^ò~Wò~Pò~Iò~Bò~;ò~4ò~-ò~&ò~ò~ò~ò~ ò~ò~üñ~õñ~îñ~çñ~àñ~Ùñ~Òñ~Ëñ~Äñ~½ñ~¶ñ~¯ñ~¨ñ~¡ñ~šñ~“ñ~Œñ~…ñ~~ñ~wñ~pñ~iñ~bñ~[ñ~Tñ~Mñ~Fñ~?ñ~8ñ~1ñ~*ñ~#ñ~ñ~ñ~ñ~ñ~ñ~ùð~òð~ëð~äð~Ýð~Öð~Ïð~Èð~Áð~ºð~³ð~¬ð~¥ð~žð~—ð~ð~‰ð~‚ð~{ð~tð~mð~fð~_ð~Xð~Qð~Jð~Cð~<ð~5ð~.ð~'ð~ ð~ð~ð~ ð~ð~ýï~öï~ïï~èï~áï~Úï~Óï~Ìï~Åï~¾ï~·ï~°ï~©ï~¢ï~›ï~”ï~ï~†ï~ï~xï~qï~jï~cï~\ï~Uï~Nï~Gï~@ï~9ï~2ï~+ï~$ï~ï~ï~ï~ï~ï~úî~óî~ìî~åî~Þî~×î~Ðî~Éî~Âî~»î~´î~­î~¦î~Ÿî~˜î~‘î~Šî~ƒî~|î~uî~nî~gî~`î~Yî~Rî~Kî~Dî~=î~6î~/î~(î~!î~î~î~ î~î~þí~÷í~ðí~éí~âí~Ûí~Ôí~Íí~Æí~¿í~¸í~±í~ªí~£í~œí~•í~Ží~‡í~€í~yí~rí~kí~dí~]í~Ví~Oí~Hí~Aí~:í~3í~,í~%í~í~í~í~ í~í~ûì~ôì~íì~æì~ßì~Øì~Ñì~Êì~Ãì~¼ì~µì~®ì~§ì~ ì~™ì~’ì~‹ì~„ì~}ì~vì~oì~hì~aì~Zì~Sì~Lì~Eì~>ì~7ì~0ì~)ì~"ì~ì~ì~ ì~ì~ÿë~øë~ñë~êë~ãë~Üë~Õë~Îë~Çë~Àë~¹ë~²ë~«ë~¤ë~ë~–ë~ë~ˆë~ë~zë~së~lë~eë~^ë~Wë~Pë~Ië~Bë~;ë~4ë~-ë~&ë~ë~ë~ë~ ë~ë~üê~õê~îê~çê~àê~Ùê~Òê~Ëê~Äê~½ê~¶ê~¯ê~¨ê~¡ê~šê~“ê~Œê~…ê~~ê~wê~pê~iê~bê~[ê~Tê~Mê~Fê~?ê~8ê~1ê~*ê~#ê~ê~ê~ê~ê~ê~ùé~òé~ëé~äé~Ýé~Öé~Ïé~Èé~Áé~ºé~³é~¬é~¥é~žé~—é~é~‰é~‚é~{é~té~mé~fé~_é~Xé~Qé~Jé~Cé~<é~5é~.é~'é~ é~é~é~ é~é~ýè~öè~ïè~èè~áè~Úè~Óè~Ìè~Åè~¾è~·è~°è~©è~¢è~›è~”è~è~†è~è~xè~qè~jè~cè~\è~Uè~Nè~Gè~@è~9è~2è~+è~$è~è~è~è~è~è~úç~óç~ìç~åç~Þç~×ç~Ðç~Éç~Âç~»ç~´ç~­ç~¦ç~Ÿç~˜ç~‘ç~Šç~ƒç~|ç~uç~nç~gç~`ç~Yç~Rç~Kç~Dç~=ç~6ç~/ç~(ç~!ç~ç~ç~ ç~ç~þæ~÷æ~ðæ~éæ~âæ~Ûæ~Ôæ~Íæ~Ææ~¿æ~¸æ~±æ~ªæ~£æ~œæ~•æ~Žæ~‡æ~€æ~yæ~ræ~kæ~dæ~]æ~Væ~Oæ~Hæ~Aæ~:æ~3æ~,æ~%æ~æ~æ~æ~ æ~æ~ûå~ôå~íå~æå~ßå~Øå~Ñå~Êå~Ãå~¼å~µå~®å~§å~ å~™å~’å~‹å~„å~}å~vå~oå~hå~aå~Zå~Så~Lå~Eå~>å~7å~0å~)å~"å~å~å~ å~å~ÿä~øä~ñä~êä~ãä~Üä~Õä~Îä~Çä~Àä~¹ä~²ä~«ä~¤ä~ä~–ä~ä~ˆä~ä~zä~sä~lä~eä~^ä~Wä~Pä~Iä~Bä~;ä~4ä~-ä~&ä~ä~ä~ä~ ä~ä~üã~õã~îã~çã~àã~Ùã~Òã~Ëã~Äã~½ã~¶ã~¯ã~¨ã~¡ã~šã~“ã~Œã~…ã~~ã~wã~pã~iã~bã~[ã~Tã~Mã~Fã~?ã~8ã~1ã~*ã~#ã~ã~ã~ã~ã~ã~ùâ~òâ~ëâ~äâ~Ýâ~Öâ~Ïâ~Èâ~Áâ~ºâ~³â~¬â~¥â~žâ~—â~â~‰â~‚â~{â~tâ~mâ~fâ~_â~Xâ~Qâ~Jâ~Câ~<â~5â~.â~'â~ â~â~â~ â~â~ýá~öá~ïá~èá~áá~Úá~Óá~Ìá~Åá~¾á~·á~°á~©á~¢á~›á~”á~á~†á~á~xá~qá~já~cá~\á~Uá~Ná~Gá~@á~9á~2á~+á~$á~á~á~á~á~á~úà~óà~ìà~åà~Þà~×à~Ðà~Éà~Âà~»à~´à~­à~¦à~Ÿà~˜à~‘à~Šà~ƒà~|à~uà~nà~gà~`à~Yà~Rà~Kà~Dà~=à~6à~/à~(à~!à~à~à~ à~à~þß~÷ß~ðß~éß~âß~Ûß~Ôß~Íß~Æß~¿ß~¸ß~±ß~ªß~£ß~œß~•ß~Žß~‡ß~€ß~yß~rß~kß~dß~]ß~Vß~Oß~Hß~Aß~:ß~3ß~,ß~%ß~ß~ß~ß~ ß~ß~ûÞ~ôÞ~íÞ~æÞ~ßÞ~ØÞ~ÑÞ~ÊÞ~ÃÞ~¼Þ~µÞ~®Þ~§Þ~ Þ~™Þ~’Þ~‹Þ~„Þ~}Þ~vÞ~oÞ~hÞ~aÞ~ZÞ~SÞ~LÞ~EÞ~>Þ~7Þ~0Þ~)Þ~"Þ~Þ~Þ~ Þ~Þ~ÿÝ~øÝ~ñÝ~êÝ~ãÝ~ÜÝ~ÕÝ~ÎÝ~ÇÝ~ÀÝ~¹Ý~²Ý~«Ý~¤Ý~Ý~–Ý~Ý~ˆÝ~Ý~zÝ~sÝ~lÝ~eÝ~^Ý~WÝ~PÝ~IÝ~BÝ~;Ý~4Ý~-Ý~&Ý~Ý~Ý~Ý~ Ý~Ý~üÜ~õÜ~îÜ~çÜ~àÜ~ÙÜ~ÒÜ~ËÜ~ÄÜ~½Ü~¶Ü~¯Ü~¨Ü~¡Ü~šÜ~“Ü~ŒÜ~…Ü~~Ü~wÜ~pÜ~iÜ~bÜ~[Ü~TÜ~MÜ~FÜ~?Ü~8Ü~1Ü~*Ü~#Ü~Ü~Ü~Ü~Ü~Ü~ùÛ~òÛ~ëÛ~äÛ~ÝÛ~ÖÛ~ÏÛ~ÈÛ~ÁÛ~ºÛ~³Û~¬Û~¥Û~žÛ~—Û~Û~‰Û~‚Û~{Û~tÛ~mÛ~fÛ~_Û~XÛ~QÛ~JÛ~CÛ~<Û~5Û~.Û~'Û~ Û~Û~Û~ Û~Û~ýÚ~öÚ~ïÚ~èÚ~áÚ~ÚÚ~ÓÚ~ÌÚ~ÅÚ~¾Ú~·Ú~°Ú~©Ú~¢Ú~›Ú~”Ú~Ú~†Ú~Ú~xÚ~qÚ~jÚ~cÚ~\Ú~UÚ~NÚ~GÚ~@Ú~9Ú~2Ú~+Ú~$Ú~Ú~Ú~Ú~Ú~Ú~úÙ~óÙ~ìÙ~åÙ~ÞÙ~×Ù~ÐÙ~ÉÙ~ÂÙ~»Ù~´Ù~­Ù~¦Ù~ŸÙ~˜Ù~‘Ù~ŠÙ~ƒÙ~|Ù~uÙ~nÙ~gÙ~`Ù~YÙ~RÙ~KÙ~DÙ~=Ù~6Ù~/Ù~(Ù~!Ù~Ù~Ù~ Ù~Ù~þØ~÷Ø~ðØ~éØ~âØ~ÛØ~ÔØ~ÍØ~ÆØ~¿Ø~¸Ø~±Ø~ªØ~£Ø~œØ~•Ø~ŽØ~‡Ø~€Ø~yØ~rØ~kØ~dØ~]Ø~VØ~OØ~HØ~AØ~:Ø~3Ø~,Ø~%Ø~Ø~Ø~Ø~ Ø~Ø~û×~ô×~í×~æ×~ß×~Ø×~Ñ×~Ê×~Ã×~¼×~µ×~®×~§×~ ×~™×~’×~‹×~„×~}×~v×~o×~h×~a×~Z×~S×~L×~E×~>×~7×~0×~)×~"×~×~×~ ×~×~ÿÖ~øÖ~ñÖ~êÖ~ãÖ~ÜÖ~ÕÖ~ÎÖ~ÇÖ~ÀÖ~¹Ö~²Ö~«Ö~¤Ö~Ö~–Ö~Ö~ˆÖ~Ö~zÖ~sÖ~lÖ~eÖ~^Ö~WÖ~PÖ~IÖ~BÖ~;Ö~4Ö~-Ö~&Ö~Ö~Ö~Ö~ Ö~Ö~üÕ~õÕ~îÕ~çÕ~àÕ~ÙÕ~ÒÕ~ËÕ~ÄÕ~½Õ~¶Õ~¯Õ~¨Õ~¡Õ~šÕ~“Õ~ŒÕ~…Õ~~Õ~wÕ~pÕ~iÕ~bÕ~[Õ~TÕ~MÕ~FÕ~?Õ~8Õ~1Õ~*Õ~#Õ~Õ~Õ~Õ~Õ~Õ~ùÔ~òÔ~ëÔ~äÔ~ÝÔ~ÖÔ~ÏÔ~ÈÔ~ÁÔ~ºÔ~³Ô~¬Ô~¥Ô~žÔ~—Ô~Ô~‰Ô~‚Ô~{Ô~tÔ~mÔ~fÔ~_Ô~XÔ~QÔ~JÔ~CÔ~<Ô~5Ô~.Ô~'Ô~ Ô~Ô~Ô~ Ô~Ô~ýÓ~öÓ~ïÓ~èÓ~áÓ~ÚÓ~ÓÓ~ÌÓ~ÅÓ~¾Ó~·Ó~°Ó~©Ó~¢Ó~›Ó~”Ó~Ó~†Ó~Ó~xÓ~qÓ~jÓ~cÓ~\Ó~UÓ~NÓ~GÓ~@Ó~9Ó~2Ó~+Ó~$Ó~Ó~Ó~Ó~Ó~Ó~úÒ~óÒ~ìÒ~åÒ~ÞÒ~×Ò~ÐÒ~ÉÒ~ÂÒ~»Ò~´Ò~­Ò~¦Ò~ŸÒ~˜Ò~‘Ò~ŠÒ~ƒÒ~|Ò~uÒ~nÒ~gÒ~`Ò~YÒ~RÒ~KÒ~DÒ~=Ò~6Ò~/Ò~(Ò~!Ò~Ò~Ò~ Ò~Ò~þÑ~÷Ñ~ðÑ~éÑ~âÑ~ÛÑ~ÔÑ~ÍÑ~ÆÑ~¿Ñ~¸Ñ~±Ñ~ªÑ~£Ñ~œÑ~•Ñ~ŽÑ~‡Ñ~€Ñ~yÑ~rÑ~kÑ~dÑ~]Ñ~VÑ~OÑ~HÑ~AÑ~:Ñ~3Ñ~,Ñ~%Ñ~Ñ~Ñ~Ñ~ Ñ~Ñ~ûÐ~ôÐ~íÐ~æÐ~ßÐ~ØÐ~ÑÐ~ÊÐ~ÃÐ~¼Ð~µÐ~®Ð~§Ð~ Ð~™Ð~’Ð~‹Ð~„Ð~}Ð~vÐ~oÐ~hÐ~aÐ~ZÐ~SÐ~LÐ~EÐ~>Ð~7Ð~0Ð~)Ð~"Ð~Ð~Ð~ Ð~Ð~ÿÏ~øÏ~ñÏ~êÏ~ãÏ~ÜÏ~ÕÏ~ÎÏ~ÇÏ~ÀÏ~¹Ï~²Ï~«Ï~¤Ï~Ï~–Ï~Ï~ˆÏ~Ï~zÏ~sÏ~lÏ~eÏ~^Ï~WÏ~PÏ~IÏ~BÏ~;Ï~4Ï~-Ï~&Ï~Ï~Ï~Ï~ Ï~Ï~üÎ~õÎ~îÎ~çÎ~àÎ~ÙÎ~ÒÎ~ËÎ~ÄÎ~½Î~¶Î~¯Î~¨Î~¡Î~šÎ~“Î~ŒÎ~…Î~~Î~wÎ~pÎ~iÎ~bÎ~[Î~TÎ~MÎ~FÎ~?Î~8Î~1Î~*Î~#Î~Î~Î~Î~Î~Î~ùÍ~òÍ~ëÍ~äÍ~ÝÍ~ÖÍ~ÏÍ~ÈÍ~ÁÍ~ºÍ~³Í~¬Í~¥Í~žÍ~—Í~Í~‰Í~‚Í~{Í~tÍ~mÍ~fÍ~_Í~XÍ~QÍ~JÍ~CÍ~<Í~5Í~.Í~'Í~ Í~Í~Í~ Í~Í~ýÌ~öÌ~ïÌ~èÌ~áÌ~ÚÌ~ÓÌ~ÌÌ~ÅÌ~¾Ì~·Ì~°Ì~©Ì~¢Ì~›Ì~”Ì~Ì~†Ì~Ì~xÌ~qÌ~jÌ~cÌ~\Ì~UÌ~NÌ~GÌ~@Ì~9Ì~2Ì~+Ì~$Ì~Ì~Ì~Ì~Ì~Ì~úË~óË~ìË~åË~ÞË~×Ë~ÐË~ÉË~ÂË~»Ë~´Ë~­Ë~¦Ë~ŸË~˜Ë~‘Ë~ŠË~ƒË~|Ë~uË~nË~gË~`Ë~YË~RË~KË~DË~=Ë~6Ë~/Ë~(Ë~!Ë~Ë~Ë~ Ë~Ë~þÊ~÷Ê~ðÊ~éÊ~âÊ~ÛÊ~ÔÊ~ÍÊ~ÆÊ~¿Ê~¸Ê~±Ê~ªÊ~£Ê~œÊ~•Ê~ŽÊ~‡Ê~€Ê~yÊ~rÊ~kÊ~dÊ~]Ê~VÊ~OÊ~HÊ~AÊ~:Ê~3Ê~,Ê~%Ê~Ê~Ê~Ê~ Ê~Ê~ûÉ~ôÉ~íÉ~æÉ~ßÉ~ØÉ~ÑÉ~ÊÉ~ÃÉ~¼É~µÉ~®É~§É~ É~™É~’É~‹É~„É~}É~vÉ~oÉ~hÉ~aÉ~ZÉ~SÉ~LÉ~EÉ~>É~7É~0É~)É~"É~É~É~ É~É~ÿÈ~øÈ~ñÈ~êÈ~ãÈ~ÜÈ~ÕÈ~ÎÈ~ÇÈ~ÀÈ~¹È~²È~«È~¤È~È~–È~È~ˆÈ~È~zÈ~sÈ~lÈ~eÈ~^È~WÈ~PÈ~IÈ~BÈ~;È~4È~-È~&È~È~È~È~ È~È~üÇ~õÇ~îÇ~çÇ~àÇ~ÙÇ~ÒÇ~ËÇ~ÄÇ~½Ç~¶Ç~¯Ç~¨Ç~¡Ç~šÇ~“Ç~ŒÇ~…Ç~~Ç~wÇ~pÇ~iÇ~bÇ~[Ç~TÇ~MÇ~FÇ~?Ç~8Ç~1Ç~*Ç~#Ç~Ç~Ç~Ç~Ç~Ç~ùÆ~òÆ~ëÆ~äÆ~ÝÆ~ÖÆ~ÏÆ~ÈÆ~ÁÆ~ºÆ~³Æ~¬Æ~¥Æ~žÆ~—Æ~Æ~‰Æ~‚Æ~{Æ~tÆ~mÆ~fÆ~_Æ~XÆ~QÆ~JÆ~CÆ~<Æ~5Æ~.Æ~'Æ~ Æ~Æ~Æ~ Æ~Æ~ýÅ~öÅ~ïÅ~èÅ~áÅ~ÚÅ~ÓÅ~ÌÅ~ÅÅ~¾Å~·Å~°Å~©Å~¢Å~›Å~”Å~Å~†Å~Å~xÅ~qÅ~jÅ~cÅ~\Å~UÅ~NÅ~GÅ~@Å~9Å~2Å~+Å~$Å~Å~Å~Å~Å~Å~úÄ~óÄ~ìÄ~åÄ~ÞÄ~×Ä~ÐÄ~ÉÄ~ÂÄ~»Ä~´Ä~­Ä~¦Ä~ŸÄ~˜Ä~‘Ä~ŠÄ~ƒÄ~|Ä~uÄ~nÄ~gÄ~`Ä~YÄ~RÄ~KÄ~DÄ~=Ä~6Ä~/Ä~(Ä~!Ä~Ä~Ä~ Ä~Ä~þÃ~÷Ã~ðÃ~éÃ~âÃ~ÛÃ~ÔÃ~ÍÃ~ÆÃ~¿Ã~¸Ã~±Ã~ªÃ~£Ã~œÃ~•Ã~ŽÃ~‡Ã~€Ã~yÃ~rÃ~kÃ~dÃ~]Ã~VÃ~OÃ~HÃ~AÃ~:Ã~3Ã~,Ã~%Ã~Ã~Ã~Ã~ Ã~Ã~ûÂ~ôÂ~íÂ~æÂ~ßÂ~ØÂ~ÑÂ~ÊÂ~ÃÂ~¼Â~µÂ~®Â~§Â~ Â~™Â~’Â~‹Â~„Â~}Â~vÂ~oÂ~hÂ~aÂ~ZÂ~SÂ~LÂ~EÂ~>Â~7Â~0Â~)Â~"Â~Â~Â~ Â~Â~ÿÁ~øÁ~ñÁ~êÁ~ãÁ~ÜÁ~ÕÁ~ÎÁ~ÇÁ~ÀÁ~¹Á~²Á~«Á~¤Á~Á~–Á~Á~ˆÁ~Á~zÁ~sÁ~lÁ~eÁ~^Á~WÁ~PÁ~IÁ~BÁ~;Á~4Á~-Á~&Á~Á~Á~Á~ Á~Á~üÀ~õÀ~îÀ~çÀ~àÀ~ÙÀ~ÒÀ~ËÀ~ÄÀ~½À~¶À~¯À~¨À~¡À~šÀ~“À~ŒÀ~…À~~À~wÀ~pÀ~iÀ~bÀ~[À~TÀ~MÀ~FÀ~?À~8À~1À~*À~#À~À~À~À~À~À~ù¿~ò¿~ë¿~ä¿~Ý¿~Ö¿~Ï¿~È¿~Á¿~º¿~³¿~¬¿~¥¿~ž¿~—¿~¿~‰¿~‚¿~{¿~t¿~m¿~f¿~_¿~X¿~Q¿~J¿~C¿~<¿~5¿~.¿~'¿~ ¿~¿~¿~ ¿~¿~ý¾~ö¾~ï¾~è¾~á¾~Ú¾~Ó¾~̾~ž~¾¾~·¾~°¾~©¾~¢¾~›¾~”¾~¾~†¾~¾~x¾~q¾~j¾~c¾~\¾~U¾~N¾~G¾~@¾~9¾~2¾~+¾~$¾~¾~¾~¾~¾~¾~ú½~ó½~ì½~å½~Þ½~×½~н~ɽ~½~»½~´½~­½~¦½~Ÿ½~˜½~‘½~н~ƒ½~|½~u½~n½~g½~`½~Y½~R½~K½~D½~=½~6½~/½~(½~!½~½~½~ ½~½~þ¼~÷¼~ð¼~é¼~â¼~Û¼~Ô¼~ͼ~Ƽ~¿¼~¸¼~±¼~ª¼~£¼~œ¼~•¼~޼~‡¼~€¼~y¼~r¼~k¼~d¼~]¼~V¼~O¼~H¼~A¼~:¼~3¼~,¼~%¼~¼~¼~¼~ ¼~¼~û»~ô»~í»~æ»~ß»~Ø»~Ñ»~Ê»~û~¼»~µ»~®»~§»~ »~™»~’»~‹»~„»~}»~v»~o»~h»~a»~Z»~S»~L»~E»~>»~7»~0»~)»~"»~»~»~ »~»~ÿº~øº~ñº~êº~ãº~ܺ~Õº~κ~Ǻ~Àº~¹º~²º~«º~¤º~º~–º~º~ˆº~º~zº~sº~lº~eº~^º~Wº~Pº~Iº~Bº~;º~4º~-º~&º~º~º~º~ º~º~ü¹~õ¹~î¹~ç¹~à¹~Ù¹~Ò¹~˹~Ĺ~½¹~¶¹~¯¹~¨¹~¡¹~š¹~“¹~Œ¹~…¹~~¹~w¹~p¹~i¹~b¹~[¹~T¹~M¹~F¹~?¹~8¹~1¹~*¹~#¹~¹~¹~¹~¹~¹~ù¸~ò¸~ë¸~ä¸~ݸ~Ö¸~ϸ~ȸ~Á¸~º¸~³¸~¬¸~¥¸~ž¸~—¸~¸~‰¸~‚¸~{¸~t¸~m¸~f¸~_¸~X¸~Q¸~J¸~C¸~<¸~5¸~.¸~'¸~ ¸~¸~¸~ ¸~¸~ý·~ö·~ï·~è·~á·~Ú·~Ó·~Ì·~Å·~¾·~··~°·~©·~¢·~›·~”·~·~†·~·~x·~q·~j·~c·~\·~U·~N·~G·~@·~9·~2·~+·~$·~·~·~·~·~·~ú¶~ó¶~ì¶~å¶~Þ¶~×¶~ж~ɶ~¶~»¶~´¶~­¶~¦¶~Ÿ¶~˜¶~‘¶~ж~ƒ¶~|¶~u¶~n¶~g¶~`¶~Y¶~R¶~K¶~D¶~=¶~6¶~/¶~(¶~!¶~¶~¶~ ¶~¶~þµ~÷µ~ðµ~éµ~âµ~Ûµ~Ôµ~͵~Ƶ~¿µ~¸µ~±µ~ªµ~£µ~œµ~•µ~޵~‡µ~€µ~yµ~rµ~kµ~dµ~]µ~Vµ~Oµ~Hµ~Aµ~:µ~3µ~,µ~%µ~µ~µ~µ~ µ~µ~û´~ô´~í´~æ´~ß´~Ø´~Ñ´~Ê´~ô~¼´~µ´~®´~§´~ ´~™´~’´~‹´~„´~}´~v´~o´~h´~a´~Z´~S´~L´~E´~>´~7´~0´~)´~"´~´~´~ ´~´~ÿ³~ø³~ñ³~ê³~ã³~ܳ~Õ³~γ~dz~À³~¹³~²³~«³~¤³~³~–³~³~ˆ³~³~z³~s³~l³~e³~^³~W³~P³~I³~B³~;³~4³~-³~&³~³~³~³~ ³~³~ü²~õ²~î²~ç²~à²~Ù²~Ò²~˲~IJ~½²~¶²~¯²~¨²~¡²~š²~“²~Œ²~…²~~²~w²~p²~i²~b²~[²~T²~M²~F²~?²~8²~1²~*²~#²~²~²~²~²~²~ù±~ò±~ë±~ä±~ݱ~Ö±~ϱ~ȱ~Á±~º±~³±~¬±~¥±~ž±~—±~±~‰±~‚±~{±~t±~m±~f±~_±~X±~Q±~J±~C±~<±~5±~.±~'±~ ±~±~±~ ±~±~ý°~ö°~ï°~è°~á°~Ú°~Ó°~̰~Ű~¾°~·°~°°~©°~¢°~›°~”°~°~†°~°~x°~q°~j°~c°~\°~U°~N°~G°~@°~9°~2°~+°~$°~°~°~°~°~°~ú¯~ó¯~ì¯~å¯~Þ¯~ׯ~Я~ɯ~¯~»¯~´¯~­¯~¦¯~Ÿ¯~˜¯~‘¯~Н~ƒ¯~|¯~u¯~n¯~g¯~`¯~Y¯~R¯~K¯~D¯~=¯~6¯~/¯~(¯~!¯~¯~¯~ ¯~¯~þ®~÷®~ð®~é®~â®~Û®~Ô®~Í®~Æ®~¿®~¸®~±®~ª®~£®~œ®~•®~Ž®~‡®~€®~y®~r®~k®~d®~]®~V®~O®~H®~A®~:®~3®~,®~%®~®~®~®~ ®~®~û­~ô­~í­~æ­~ß­~Ø­~Ñ­~Ê­~í~¼­~µ­~®­~§­~ ­~™­~’­~‹­~„­~}­~v­~o­~h­~a­~Z­~S­~L­~E­~>­~7­~0­~)­~"­~­~­~ ­~­~ÿ¬~ø¬~ñ¬~ê¬~ã¬~ܬ~Õ¬~ά~Ǭ~À¬~¹¬~²¬~«¬~¤¬~¬~–¬~¬~ˆ¬~¬~z¬~s¬~l¬~e¬~^¬~W¬~P¬~I¬~B¬~;¬~4¬~-¬~&¬~¬~¬~¬~ ¬~¬~ü«~õ«~î«~ç«~à«~Ù«~Ò«~Ë«~Ä«~½«~¶«~¯«~¨«~¡«~š«~“«~Œ«~…«~~«~w«~p«~i«~b«~[«~T«~M«~F«~?«~8«~1«~*«~#«~«~«~«~«~«~ùª~òª~ëª~äª~ݪ~Öª~Ϫ~Ȫ~Áª~ºª~³ª~¬ª~¥ª~žª~—ª~ª~‰ª~‚ª~{ª~tª~mª~fª~_ª~Xª~Qª~Jª~Cª~<ª~5ª~.ª~'ª~ ª~ª~ª~ ª~ª~ý©~ö©~ï©~è©~á©~Ú©~Ó©~Ì©~Å©~¾©~·©~°©~©©~¢©~›©~”©~©~†©~©~x©~q©~j©~c©~\©~U©~N©~G©~@©~9©~2©~+©~$©~©~©~©~©~©~ú¨~ó¨~ì¨~å¨~Þ¨~ר~Ш~ɨ~¨~»¨~´¨~­¨~¦¨~Ÿ¨~˜¨~‘¨~Ѝ~ƒ¨~|¨~u¨~n¨~g¨~`¨~Y¨~R¨~K¨~D¨~=¨~6¨~/¨~(¨~!¨~¨~¨~ ¨~¨~þ§~÷§~ð§~é§~â§~Û§~Ô§~ͧ~Ƨ~¿§~¸§~±§~ª§~£§~œ§~•§~ާ~‡§~€§~y§~r§~k§~d§~]§~V§~O§~H§~A§~:§~3§~,§~%§~§~§~§~ §~§~û¦~ô¦~í¦~æ¦~ߦ~ئ~Ѧ~ʦ~æ~¼¦~µ¦~®¦~§¦~ ¦~™¦~’¦~‹¦~„¦~}¦~v¦~o¦~h¦~a¦~Z¦~S¦~L¦~E¦~>¦~7¦~0¦~)¦~"¦~¦~¦~ ¦~¦~ÿ¥~ø¥~ñ¥~ê¥~ã¥~Ü¥~Õ¥~Î¥~Ç¥~À¥~¹¥~²¥~«¥~¤¥~¥~–¥~¥~ˆ¥~¥~z¥~s¥~l¥~e¥~^¥~W¥~P¥~I¥~B¥~;¥~4¥~-¥~&¥~¥~¥~¥~ ¥~¥~ü¤~õ¤~î¤~ç¤~à¤~Ù¤~Ò¤~ˤ~Ĥ~½¤~¶¤~¯¤~¨¤~¡¤~š¤~“¤~Œ¤~…¤~~¤~w¤~p¤~i¤~b¤~[¤~T¤~M¤~F¤~?¤~8¤~1¤~*¤~#¤~¤~¤~¤~¤~¤~ù£~ò£~ë£~ä£~Ý£~Ö£~Ï£~È£~Á£~º£~³£~¬£~¥£~ž£~—£~£~‰£~‚£~{£~t£~m£~f£~_£~X£~Q£~J£~C£~<£~5£~.£~'£~ £~£~£~ £~£~ý¢~ö¢~ï¢~è¢~á¢~Ú¢~Ó¢~Ì¢~Å¢~¾¢~·¢~°¢~©¢~¢¢~›¢~”¢~¢~†¢~¢~x¢~q¢~j¢~c¢~\¢~U¢~N¢~G¢~@¢~9¢~2¢~+¢~$¢~¢~¢~¢~¢~¢~ú¡~ó¡~ì¡~å¡~Þ¡~ס~С~É¡~¡~»¡~´¡~­¡~¦¡~Ÿ¡~˜¡~‘¡~Š¡~ƒ¡~|¡~u¡~n¡~g¡~`¡~Y¡~R¡~K¡~D¡~=¡~6¡~/¡~(¡~!¡~¡~¡~ ¡~¡~þ ~÷ ~ð ~é ~â ~Û ~Ô ~Í ~Æ ~¿ ~¸ ~± ~ª ~£ ~œ ~• ~Ž ~‡ ~€ ~y ~r ~k ~d ~] ~V ~O ~H ~A ~: ~3 ~, ~% ~ ~ ~ ~  ~ ~ûŸ~ôŸ~íŸ~æŸ~ߟ~ØŸ~ÑŸ~ÊŸ~ß~¼Ÿ~µŸ~®Ÿ~§Ÿ~ Ÿ~™Ÿ~’Ÿ~‹Ÿ~„Ÿ~}Ÿ~vŸ~oŸ~hŸ~aŸ~ZŸ~SŸ~LŸ~EŸ~>Ÿ~7Ÿ~0Ÿ~)Ÿ~"Ÿ~Ÿ~Ÿ~ Ÿ~Ÿ~ÿž~øž~ñž~êž~ãž~Üž~Õž~Ξ~Çž~Àž~¹ž~²ž~«ž~¤ž~ž~–ž~ž~ˆž~ž~zž~sž~lž~ež~^ž~Wž~Pž~Iž~Bž~;ž~4ž~-ž~&ž~ž~ž~ž~ ž~ž~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ùœ~òœ~ëœ~äœ~Ýœ~Öœ~Ïœ~Èœ~Áœ~ºœ~³œ~¬œ~¥œ~žœ~—œ~œ~‰œ~‚œ~{œ~tœ~mœ~fœ~_œ~Xœ~Qœ~Jœ~Cœ~<œ~5œ~.œ~'œ~ œ~œ~œ~ œ~œ~ý›~ö›~ï›~è›~á›~Ú›~Ó›~Ì›~Å›~¾›~·›~°›~©›~¢›~››~”›~›~†›~›~x›~q›~j›~c›~\›~U›~N›~G›~@›~9›~2›~+›~$›~›~›~›~›~›~úš~óš~ìš~åš~Þš~ך~К~Éš~š~»š~´š~­š~¦š~Ÿš~˜š~‘š~Šš~ƒš~|š~uš~nš~gš~`š~Yš~Rš~Kš~Dš~=š~6š~/š~(š~!š~š~š~ š~š~þ™~÷™~ð™~é™~â™~Û™~Ô™~Í™~Æ™~¿™~¸™~±™~ª™~£™~œ™~•™~Ž™~‡™~€™~y™~r™~k™~d™~]™~V™~O™~H™~A™~:™~3™~,™~%™~™~™~™~ ™~™~û˜~ô˜~í˜~æ˜~ߘ~ؘ~ј~ʘ~Ø~¼˜~µ˜~®˜~§˜~ ˜~™˜~’˜~‹˜~„˜~}˜~v˜~o˜~h˜~a˜~Z˜~S˜~L˜~E˜~>˜~7˜~0˜~)˜~"˜~˜~˜~ ˜~˜~ÿ—~ø—~ñ—~ê—~ã—~Ü—~Õ—~Η~Ç—~À—~¹—~²—~«—~¤—~—~–—~—~ˆ—~—~z—~s—~l—~e—~^—~W—~P—~I—~B—~;—~4—~-—~&—~—~—~—~ —~—~ü–~õ–~î–~ç–~à–~Ù–~Ò–~Ë–~Ä–~½–~¶–~¯–~¨–~¡–~š–~“–~Œ–~…–~~–~w–~p–~i–~b–~[–~T–~M–~F–~?–~8–~1–~*–~#–~–~–~–~–~–~ù•~ò•~ë•~ä•~Ý•~Ö•~Ï•~È•~Á•~º•~³•~¬•~¥•~ž•~—•~•~‰•~‚•~{•~t•~m•~f•~_•~X•~Q•~J•~C•~<•~5•~.•~'•~ •~•~•~ •~•~ý”~ö”~ï”~è”~á”~Ú”~Ó”~Ì”~Å”~¾”~·”~°”~©”~¢”~›”~””~”~†”~”~x”~q”~j”~c”~\”~U”~N”~G”~@”~9”~2”~+”~$”~”~”~”~”~”~ú“~ó“~ì“~å“~Þ“~ד~Г~É“~“~»“~´“~­“~¦“~Ÿ“~˜“~‘“~Š“~ƒ“~|“~u“~n“~g“~`“~Y“~R“~K“~D“~=“~6“~/“~(“~!“~“~“~ “~“~þ’~÷’~ð’~é’~â’~Û’~Ô’~Í’~Æ’~¿’~¸’~±’~ª’~£’~œ’~•’~Ž’~‡’~€’~y’~r’~k’~d’~]’~V’~O’~H’~A’~:’~3’~,’~%’~’~’~’~ ’~’~û‘~ô‘~í‘~æ‘~ß‘~Ø‘~Ñ‘~Ê‘~Ñ~¼‘~µ‘~®‘~§‘~ ‘~™‘~’‘~‹‘~„‘~}‘~v‘~o‘~h‘~a‘~Z‘~S‘~L‘~E‘~>‘~7‘~0‘~)‘~"‘~‘~‘~ ‘~‘~ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ùŽ~òŽ~ëŽ~äŽ~ÝŽ~ÖŽ~ÏŽ~ÈŽ~ÁŽ~ºŽ~³Ž~¬Ž~¥Ž~žŽ~—Ž~Ž~‰Ž~‚Ž~{Ž~tŽ~mŽ~fŽ~_Ž~XŽ~QŽ~JŽ~CŽ~<Ž~5Ž~.Ž~'Ž~ Ž~Ž~Ž~ Ž~Ž~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~úŒ~óŒ~ìŒ~åŒ~ÞŒ~׌~ÐŒ~ÉŒ~ÂŒ~»Œ~´Œ~­Œ~¦Œ~ŸŒ~˜Œ~‘Œ~ŠŒ~ƒŒ~|Œ~uŒ~nŒ~gŒ~`Œ~YŒ~RŒ~KŒ~DŒ~=Œ~6Œ~/Œ~(Œ~!Œ~Œ~Œ~ Œ~Œ~þ‹~÷‹~ð‹~é‹~â‹~Û‹~Ô‹~Í‹~Æ‹~¿‹~¸‹~±‹~ª‹~£‹~œ‹~•‹~Ž‹~‡‹~€‹~y‹~r‹~k‹~d‹~]‹~V‹~O‹~H‹~A‹~:‹~3‹~,‹~%‹~‹~‹~‹~ ‹~‹~ûŠ~ôŠ~íŠ~æŠ~ߊ~ØŠ~ÑŠ~ÊŠ~Ê~¼Š~µŠ~®Š~§Š~ Š~™Š~’Š~‹Š~„Š~}Š~vŠ~oŠ~hŠ~aŠ~ZŠ~SŠ~LŠ~EŠ~>Š~7Š~0Š~)Š~"Š~Š~Š~ Š~Š~ÿ‰~ø‰~ñ‰~ê‰~ã‰~܉~Õ‰~Ή~lj~À‰~¹‰~²‰~«‰~¤‰~‰~–‰~‰~ˆ‰~‰~z‰~s‰~l‰~e‰~^‰~W‰~P‰~I‰~B‰~;‰~4‰~-‰~&‰~‰~‰~‰~ ‰~‰~üˆ~õˆ~îˆ~çˆ~àˆ~Ùˆ~Òˆ~ˈ~Ĉ~½ˆ~¶ˆ~¯ˆ~¨ˆ~¡ˆ~šˆ~“ˆ~Œˆ~…ˆ~~ˆ~wˆ~pˆ~iˆ~bˆ~[ˆ~Tˆ~Mˆ~Fˆ~?ˆ~8ˆ~1ˆ~*ˆ~#ˆ~ˆ~ˆ~ˆ~ˆ~ˆ~ù‡~ò‡~ë‡~ä‡~݇~Ö‡~χ~ȇ~Á‡~º‡~³‡~¬‡~¥‡~ž‡~—‡~‡~‰‡~‚‡~{‡~t‡~m‡~f‡~_‡~X‡~Q‡~J‡~C‡~<‡~5‡~.‡~'‡~ ‡~‡~‡~ ‡~‡~ý†~ö†~ï†~è†~á†~Ú†~Ó†~̆~ņ~¾†~·†~°†~©†~¢†~›†~”†~†~††~†~x†~q†~j†~c†~\†~U†~N†~G†~@†~9†~2†~+†~$†~†~†~†~†~†~ú…~ó…~ì…~å…~Þ…~×…~Ð…~É…~Â…~»…~´…~­…~¦…~Ÿ…~˜…~‘…~Š…~ƒ…~|…~u…~n…~g…~`…~Y…~R…~K…~D…~=…~6…~/…~(…~!…~…~…~ …~…~þ„~÷„~ð„~é„~â„~Û„~Ô„~Í„~Æ„~¿„~¸„~±„~ª„~£„~œ„~•„~Ž„~‡„~€„~y„~r„~k„~d„~]„~V„~O„~H„~A„~:„~3„~,„~%„~„~„~„~ „~„~ûƒ~ôƒ~íƒ~æƒ~߃~؃~у~ʃ~Ã~¼ƒ~µƒ~®ƒ~§ƒ~ ƒ~™ƒ~’ƒ~‹ƒ~„ƒ~}ƒ~vƒ~oƒ~hƒ~aƒ~Zƒ~Sƒ~Lƒ~Eƒ~>ƒ~7ƒ~0ƒ~)ƒ~"ƒ~ƒ~ƒ~ ƒ~ƒ~ÿ‚~ø‚~ñ‚~ê‚~ã‚~Ü‚~Õ‚~΂~Ç‚~À‚~¹‚~²‚~«‚~¤‚~‚~–‚~‚~ˆ‚~‚~z‚~s‚~l‚~e‚~^‚~W‚~P‚~I‚~B‚~;‚~4‚~-‚~&‚~‚~‚~‚~ ‚~‚~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù€~ò€~ë€~ä€~Ý€~Ö€~Ï€~È€~Á€~º€~³€~¬€~¥€~ž€~—€~€~‰€~‚€~{€~t€~m€~f€~_€~X€~Q€~J€~C€~<€~5€~.€~'€~ €~€~€~ €~€~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~~ó~~ì~~å~~Þ~~×~~Ð~~É~~Â~~»~~´~~­~~¦~~Ÿ~~˜~~‘~~Š~~ƒ~~|~~u~~n~~g~~`~~Y~~R~~K~~D~~=~~6~~/~~(~~!~~~~~~ ~~~~þ}~÷}~ð}~é}~â}~Û}~Ô}~Í}~Æ}~¿}~¸}~±}~ª}~£}~œ}~•}~Ž}~‡}~€}~y}~r}~k}~d}~]}~V}~O}~H}~A}~:}~3}~,}~%}~}~}~}~ }~}~û|~ô|~í|~æ|~ß|~Ø|~Ñ|~Ê|~Ã|~¼|~µ|~®|~§|~ |~™|~’|~‹|~„|~}|~v|~o|~h|~a|~Z|~S|~L|~E|~>|~7|~0|~)|~"|~|~|~ |~|~ÿ{~ø{~ñ{~ê{~ã{~Ü{~Õ{~Î{~Ç{~À{~¹{~²{~«{~¤{~{~–{~{~ˆ{~{~z{~s{~l{~e{~^{~W{~P{~I{~B{~;{~4{~-{~&{~{~{~{~ {~{~üz~õz~îz~çz~àz~Ùz~Òz~Ëz~Äz~½z~¶z~¯z~¨z~¡z~šz~“z~Œz~…z~~z~wz~pz~iz~bz~[z~Tz~Mz~Fz~?z~8z~1z~*z~#z~z~z~z~z~z~ùy~òy~ëy~äy~Ýy~Öy~Ïy~Èy~Áy~ºy~³y~¬y~¥y~žy~—y~y~‰y~‚y~{y~ty~my~fy~_y~Xy~Qy~Jy~Cy~u~7u~0u~)u~"u~u~u~ u~u~ÿt~øt~ñt~êt~ãt~Üt~Õt~Ît~Çt~Àt~¹t~²t~«t~¤t~t~–t~t~ˆt~t~zt~st~lt~et~^t~Wt~Pt~It~Bt~;t~4t~-t~&t~t~t~t~ t~t~üs~õs~îs~çs~às~Ùs~Òs~Ës~Äs~½s~¶s~¯s~¨s~¡s~šs~“s~Œs~…s~~s~ws~ps~is~bs~[s~Ts~Ms~Fs~?s~8s~1s~*s~#s~s~s~s~s~s~ùr~òr~ër~är~Ýr~Ör~Ïr~Èr~Ár~ºr~³r~¬r~¥r~žr~—r~r~‰r~‚r~{r~tr~mr~fr~_r~Xr~Qr~Jr~Cr~n~7n~0n~)n~"n~n~n~ n~n~ÿm~øm~ñm~êm~ãm~Üm~Õm~Îm~Çm~Àm~¹m~²m~«m~¤m~m~–m~m~ˆm~m~zm~sm~lm~em~^m~Wm~Pm~Im~Bm~;m~4m~-m~&m~m~m~m~ m~m~ül~õl~îl~çl~àl~Ùl~Òl~Ël~Äl~½l~¶l~¯l~¨l~¡l~šl~“l~Œl~…l~~l~wl~pl~il~bl~[l~Tl~Ml~Fl~?l~8l~1l~*l~#l~l~l~l~l~l~ùk~òk~ëk~äk~Ýk~Ök~Ïk~Èk~Ák~ºk~³k~¬k~¥k~žk~—k~k~‰k~‚k~{k~tk~mk~fk~_k~Xk~Qk~Jk~Ck~g~7g~0g~)g~"g~g~g~ g~g~ÿf~øf~ñf~êf~ãf~Üf~Õf~Îf~Çf~Àf~¹f~²f~«f~¤f~f~–f~f~ˆf~f~zf~sf~lf~ef~^f~Wf~Pf~If~Bf~;f~4f~-f~&f~f~f~f~ f~f~üe~õe~îe~çe~àe~Ùe~Òe~Ëe~Äe~½e~¶e~¯e~¨e~¡e~še~“e~Œe~…e~~e~we~pe~ie~be~[e~Te~Me~Fe~?e~8e~1e~*e~#e~e~e~e~e~e~ùd~òd~ëd~äd~Ýd~Öd~Ïd~Èd~Ád~ºd~³d~¬d~¥d~žd~—d~d~‰d~‚d~{d~td~md~fd~_d~Xd~Qd~Jd~Cd~`~7`~0`~)`~"`~`~`~ `~`~ÿ_~ø_~ñ_~ê_~ã_~Ü_~Õ_~Î_~Ç_~À_~¹_~²_~«_~¤_~_~–_~_~ˆ_~_~z_~s_~l_~e_~^_~W_~P_~I_~B_~;_~4_~-_~&_~_~_~_~ _~_~ü^~õ^~î^~ç^~à^~Ù^~Ò^~Ë^~Ä^~½^~¶^~¯^~¨^~¡^~š^~“^~Œ^~…^~~^~w^~p^~i^~b^~[^~T^~M^~F^~?^~8^~1^~*^~#^~^~^~^~^~^~ù]~ò]~ë]~ä]~Ý]~Ö]~Ï]~È]~Á]~º]~³]~¬]~¥]~ž]~—]~]~‰]~‚]~{]~t]~m]~f]~_]~X]~Q]~J]~C]~<]~5]~.]~']~ ]~]~]~ ]~]~ý\~ö\~ï\~è\~á\~Ú\~Ó\~Ì\~Å\~¾\~·\~°\~©\~¢\~›\~”\~\~†\~\~x\~q\~j\~c\~\\~U\~N\~G\~@\~9\~2\~+\~$\~\~\~\~\~\~ú[~ó[~ì[~å[~Þ[~×[~Ð[~É[~Â[~»[~´[~­[~¦[~Ÿ[~˜[~‘[~Š[~ƒ[~|[~u[~n[~g[~`[~Y[~R[~K[~D[~=[~6[~/[~([~![~[~[~ [~[~þZ~÷Z~ðZ~éZ~âZ~ÛZ~ÔZ~ÍZ~ÆZ~¿Z~¸Z~±Z~ªZ~£Z~œZ~•Z~ŽZ~‡Z~€Z~yZ~rZ~kZ~dZ~]Z~VZ~OZ~HZ~AZ~:Z~3Z~,Z~%Z~Z~Z~Z~ Z~Z~ûY~ôY~íY~æY~ßY~ØY~ÑY~ÊY~ÃY~¼Y~µY~®Y~§Y~ Y~™Y~’Y~‹Y~„Y~}Y~vY~oY~hY~aY~ZY~SY~LY~EY~>Y~7Y~0Y~)Y~"Y~Y~Y~ Y~Y~ÿX~øX~ñX~êX~ãX~ÜX~ÕX~ÎX~ÇX~ÀX~¹X~²X~«X~¤X~X~–X~X~ˆX~X~zX~sX~lX~eX~^X~WX~PX~IX~BX~;X~4X~-X~&X~X~X~X~ X~X~üW~õW~îW~çW~àW~ÙW~ÒW~ËW~ÄW~½W~¶W~¯W~¨W~¡W~šW~“W~ŒW~…W~~W~wW~pW~iW~bW~[W~TW~MW~FW~?W~8W~1W~*W~#W~W~W~W~W~W~ùV~òV~ëV~äV~ÝV~ÖV~ÏV~ÈV~ÁV~ºV~³V~¬V~¥V~žV~—V~V~‰V~‚V~{V~tV~mV~fV~_V~XV~QV~JV~CV~R~7R~0R~)R~"R~R~R~ R~R~ÿQ~øQ~ñQ~êQ~ãQ~ÜQ~ÕQ~ÎQ~ÇQ~ÀQ~¹Q~²Q~«Q~¤Q~Q~–Q~Q~ˆQ~Q~zQ~sQ~lQ~eQ~^Q~WQ~PQ~IQ~BQ~;Q~4Q~-Q~&Q~Q~Q~Q~ Q~Q~üP~õP~îP~çP~àP~ÙP~ÒP~ËP~ÄP~½P~¶P~¯P~¨P~¡P~šP~“P~ŒP~…P~~P~wP~pP~iP~bP~[P~TP~MP~FP~?P~8P~1P~*P~#P~P~P~P~P~P~ùO~òO~ëO~äO~ÝO~ÖO~ÏO~ÈO~ÁO~ºO~³O~¬O~¥O~žO~—O~O~‰O~‚O~{O~tO~mO~fO~_O~XO~QO~JO~CO~K~7K~0K~)K~"K~K~K~ K~K~ÿJ~øJ~ñJ~êJ~ãJ~ÜJ~ÕJ~ÎJ~ÇJ~ÀJ~¹J~²J~«J~¤J~J~–J~J~ˆJ~J~zJ~sJ~lJ~eJ~^J~WJ~PJ~IJ~BJ~;J~4J~-J~&J~J~J~J~ J~J~üI~õI~îI~çI~àI~ÙI~ÒI~ËI~ÄI~½I~¶I~¯I~¨I~¡I~šI~“I~ŒI~…I~~I~wI~pI~iI~bI~[I~TI~MI~FI~?I~8I~1I~*I~#I~I~I~I~I~I~ùH~òH~ëH~äH~ÝH~ÖH~ÏH~ÈH~ÁH~ºH~³H~¬H~¥H~žH~—H~H~‰H~‚H~{H~tH~mH~fH~_H~XH~QH~JH~CH~D~7D~0D~)D~"D~D~D~ D~D~ÿC~øC~ñC~êC~ãC~ÜC~ÕC~ÎC~ÇC~ÀC~¹C~²C~«C~¤C~C~–C~C~ˆC~C~zC~sC~lC~eC~^C~WC~PC~IC~BC~;C~4C~-C~&C~C~C~C~ C~C~üB~õB~îB~çB~àB~ÙB~ÒB~ËB~ÄB~½B~¶B~¯B~¨B~¡B~šB~“B~ŒB~…B~~B~wB~pB~iB~bB~[B~TB~MB~FB~?B~8B~1B~*B~#B~B~B~B~B~B~ùA~òA~ëA~äA~ÝA~ÖA~ÏA~ÈA~ÁA~ºA~³A~¬A~¥A~žA~—A~A~‰A~‚A~{A~tA~mA~fA~_A~XA~QA~JA~CA~~÷>~ð>~é>~â>~Û>~Ô>~Í>~Æ>~¿>~¸>~±>~ª>~£>~œ>~•>~Ž>~‡>~€>~y>~r>~k>~d>~]>~V>~O>~H>~A>~:>~3>~,>~%>~>~>~>~ >~>~û=~ô=~í=~æ=~ß=~Ø=~Ñ=~Ê=~Ã=~¼=~µ=~®=~§=~ =~™=~’=~‹=~„=~}=~v=~o=~h=~a=~Z=~S=~L=~E=~>=~7=~0=~)=~"=~=~=~ =~=~ÿ<~ø<~ñ<~ê<~ã<~Ü<~Õ<~Î<~Ç<~À<~¹<~²<~«<~¤<~<~–<~<~ˆ<~<~z<~s<~l<~e<~^<~W<~P<~I<~B<~;<~4<~-<~&<~<~<~<~ <~<~ü;~õ;~î;~ç;~à;~Ù;~Ò;~Ë;~Ä;~½;~¶;~¯;~¨;~¡;~š;~“;~Œ;~…;~~;~w;~p;~i;~b;~[;~T;~M;~F;~?;~8;~1;~*;~#;~;~;~;~;~;~ù:~ò:~ë:~ä:~Ý:~Ö:~Ï:~È:~Á:~º:~³:~¬:~¥:~ž:~—:~:~‰:~‚:~{:~t:~m:~f:~_:~X:~Q:~J:~C:~<:~5:~.:~':~ :~:~:~ :~:~ý9~ö9~ï9~è9~á9~Ú9~Ó9~Ì9~Å9~¾9~·9~°9~©9~¢9~›9~”9~9~†9~9~x9~q9~j9~c9~\9~U9~N9~G9~@9~99~29~+9~$9~9~9~9~9~9~ú8~ó8~ì8~å8~Þ8~×8~Ð8~É8~Â8~»8~´8~­8~¦8~Ÿ8~˜8~‘8~Š8~ƒ8~|8~u8~n8~g8~`8~Y8~R8~K8~D8~=8~68~/8~(8~!8~8~8~ 8~8~þ7~÷7~ð7~é7~â7~Û7~Ô7~Í7~Æ7~¿7~¸7~±7~ª7~£7~œ7~•7~Ž7~‡7~€7~y7~r7~k7~d7~]7~V7~O7~H7~A7~:7~37~,7~%7~7~7~7~ 7~7~û6~ô6~í6~æ6~ß6~Ø6~Ñ6~Ê6~Ã6~¼6~µ6~®6~§6~ 6~™6~’6~‹6~„6~}6~v6~o6~h6~a6~Z6~S6~L6~E6~>6~76~06~)6~"6~6~6~ 6~6~ÿ5~ø5~ñ5~ê5~ã5~Ü5~Õ5~Î5~Ç5~À5~¹5~²5~«5~¤5~5~–5~5~ˆ5~5~z5~s5~l5~e5~^5~W5~P5~I5~B5~;5~45~-5~&5~5~5~5~ 5~5~ü4~õ4~î4~ç4~à4~Ù4~Ò4~Ë4~Ä4~½4~¶4~¯4~¨4~¡4~š4~“4~Œ4~…4~~4~w4~p4~i4~b4~[4~T4~M4~F4~?4~84~14~*4~#4~4~4~4~4~4~ù3~ò3~ë3~ä3~Ý3~Ö3~Ï3~È3~Á3~º3~³3~¬3~¥3~ž3~—3~3~‰3~‚3~{3~t3~m3~f3~_3~X3~Q3~J3~C3~<3~53~.3~'3~ 3~3~3~ 3~3~ý2~ö2~ï2~è2~á2~Ú2~Ó2~Ì2~Å2~¾2~·2~°2~©2~¢2~›2~”2~2~†2~2~x2~q2~j2~c2~\2~U2~N2~G2~@2~92~22~+2~$2~2~2~2~2~2~ú1~ó1~ì1~å1~Þ1~×1~Ð1~É1~Â1~»1~´1~­1~¦1~Ÿ1~˜1~‘1~Š1~ƒ1~|1~u1~n1~g1~`1~Y1~R1~K1~D1~=1~61~/1~(1~!1~1~1~ 1~1~þ0~÷0~ð0~é0~â0~Û0~Ô0~Í0~Æ0~¿0~¸0~±0~ª0~£0~œ0~•0~Ž0~‡0~€0~y0~r0~k0~d0~]0~V0~O0~H0~A0~:0~30~,0~%0~0~0~0~ 0~0~û/~ô/~í/~æ/~ß/~Ø/~Ñ/~Ê/~Ã/~¼/~µ/~®/~§/~ /~™/~’/~‹/~„/~}/~v/~o/~h/~a/~Z/~S/~L/~E/~>/~7/~0/~)/~"/~/~/~ /~/~ÿ.~ø.~ñ.~ê.~ã.~Ü.~Õ.~Î.~Ç.~À.~¹.~².~«.~¤.~.~–.~.~ˆ.~.~z.~s.~l.~e.~^.~W.~P.~I.~B.~;.~4.~-.~&.~.~.~.~ .~.~ü-~õ-~î-~ç-~à-~Ù-~Ò-~Ë-~Ä-~½-~¶-~¯-~¨-~¡-~š-~“-~Œ-~…-~~-~w-~p-~i-~b-~[-~T-~M-~F-~?-~8-~1-~*-~#-~-~-~-~-~-~ù,~ò,~ë,~ä,~Ý,~Ö,~Ï,~È,~Á,~º,~³,~¬,~¥,~ž,~—,~,~‰,~‚,~{,~t,~m,~f,~_,~X,~Q,~J,~C,~<,~5,~.,~',~ ,~,~,~ ,~,~ý+~ö+~ï+~è+~á+~Ú+~Ó+~Ì+~Å+~¾+~·+~°+~©+~¢+~›+~”+~+~†+~+~x+~q+~j+~c+~\+~U+~N+~G+~@+~9+~2+~++~$+~+~+~+~+~+~ú*~ó*~ì*~å*~Þ*~×*~Ð*~É*~Â*~»*~´*~­*~¦*~Ÿ*~˜*~‘*~Š*~ƒ*~|*~u*~n*~g*~`*~Y*~R*~K*~D*~=*~6*~/*~(*~!*~*~*~ *~*~þ)~÷)~ð)~é)~â)~Û)~Ô)~Í)~Æ)~¿)~¸)~±)~ª)~£)~œ)~•)~Ž)~‡)~€)~y)~r)~k)~d)~])~V)~O)~H)~A)~:)~3)~,)~%)~)~)~)~ )~)~û(~ô(~í(~æ(~ß(~Ø(~Ñ(~Ê(~Ã(~¼(~µ(~®(~§(~ (~™(~’(~‹(~„(~}(~v(~o(~h(~a(~Z(~S(~L(~E(~>(~7(~0(~)(~"(~(~(~ (~(~ÿ'~ø'~ñ'~ê'~ã'~Ü'~Õ'~Î'~Ç'~À'~¹'~²'~«'~¤'~'~–'~'~ˆ'~'~z'~s'~l'~e'~^'~W'~P'~I'~B'~;'~4'~-'~&'~'~'~'~ '~'~ü&~õ&~î&~ç&~à&~Ù&~Ò&~Ë&~Ä&~½&~¶&~¯&~¨&~¡&~š&~“&~Œ&~…&~~&~w&~p&~i&~b&~[&~T&~M&~F&~?&~8&~1&~*&~#&~&~&~&~&~&~ù%~ò%~ë%~ä%~Ý%~Ö%~Ï%~È%~Á%~º%~³%~¬%~¥%~ž%~—%~%~‰%~‚%~{%~t%~m%~f%~_%~X%~Q%~J%~C%~<%~5%~.%~'%~ %~%~%~ %~%~ý$~ö$~ï$~è$~á$~Ú$~Ó$~Ì$~Å$~¾$~·$~°$~©$~¢$~›$~”$~$~†$~$~x$~q$~j$~c$~\$~U$~N$~G$~@$~9$~2$~+$~$$~$~$~$~$~$~ú#~ó#~ì#~å#~Þ#~×#~Ð#~É#~Â#~»#~´#~­#~¦#~Ÿ#~˜#~‘#~Š#~ƒ#~|#~u#~n#~g#~`#~Y#~R#~K#~D#~=#~6#~/#~(#~!#~#~#~ #~#~þ"~÷"~ð"~é"~â"~Û"~Ô"~Í"~Æ"~¿"~¸"~±"~ª"~£"~œ"~•"~Ž"~‡"~€"~y"~r"~k"~d"~]"~V"~O"~H"~A"~:"~3"~,"~%"~"~"~"~ "~"~û!~ô!~í!~æ!~ß!~Ø!~Ñ!~Ê!~Ã!~¼!~µ!~®!~§!~ !~™!~’!~‹!~„!~}!~v!~o!~h!~a!~Z!~S!~L!~E!~>!~7!~0!~)!~"!~!~!~ !~!~ÿ ~ø ~ñ ~ê ~ã ~Ü ~Õ ~Î ~Ç ~À ~¹ ~² ~« ~¤ ~ ~– ~ ~ˆ ~ ~z ~s ~l ~e ~^ ~W ~P ~I ~B ~; ~4 ~- ~& ~ ~ ~ ~ ~ ~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ ~÷ ~ð ~é ~â ~Û ~Ô ~Í ~Æ ~¿ ~¸ ~± ~ª ~£ ~œ ~• ~Ž ~‡ ~€ ~y ~r ~k ~d ~] ~V ~O ~H ~A ~: ~3 ~, ~% ~ ~ ~ ~ ~ ~û ~ô ~í ~æ ~ß ~Ø ~Ñ ~Ê ~à ~¼ ~µ ~® ~§ ~  ~™ ~’ ~‹ ~„ ~} ~v ~o ~h ~a ~Z ~S ~L ~E ~> ~7 ~0 ~) ~" ~ ~ ~ ~ ~ÿ ~ø ~ñ ~ê ~ã ~Ü ~Õ ~Î ~Ç ~À ~¹ ~² ~« ~¤ ~ ~– ~ ~ˆ ~ ~z ~s ~l ~e ~^ ~W ~P ~I ~B ~; ~4 ~- ~& ~ ~ ~ ~ ~ ~ü ~õ ~î ~ç ~à ~Ù ~Ò ~Ë ~Ä ~½ ~¶ ~¯ ~¨ ~¡ ~š ~“ ~Œ ~… ~~ ~w ~p ~i ~b ~[ ~T ~M ~F ~? ~8 ~1 ~* ~# ~ ~ ~ ~ ~ ~ù ~ò ~ë ~ä ~Ý ~Ö ~Ï ~È ~Á ~º ~³ ~¬ ~¥ ~ž ~— ~ ~‰ ~‚ ~{ ~t ~m ~f ~_ ~X ~Q ~J ~C ~< ~5 ~. ~' ~ ~ ~ ~ ~ ~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þÿ}÷ÿ}ðÿ}éÿ}âÿ}Ûÿ}Ôÿ}Íÿ}Æÿ}¿ÿ}¸ÿ}±ÿ}ªÿ}£ÿ}œÿ}•ÿ}Žÿ}‡ÿ}€ÿ}yÿ}rÿ}kÿ}dÿ}]ÿ}Vÿ}Oÿ}Hÿ}Aÿ}:ÿ}3ÿ},ÿ}%ÿ}ÿ}ÿ}ÿ} ÿ}ÿ}ûþ}ôþ}íþ}æþ}ßþ}Øþ}Ñþ}Êþ}Ãþ}¼þ}µþ}®þ}§þ} þ}™þ}’þ}‹þ}„þ}}þ}vþ}oþ}hþ}aþ}Zþ}Sþ}Lþ}Eþ}>þ}7þ}0þ})þ}"þ}þ}þ} þ}þ}ÿý}øý}ñý}êý}ãý}Üý}Õý}Îý}Çý}Àý}¹ý}²ý}«ý}¤ý}ý}–ý}ý}ˆý}ý}zý}sý}lý}eý}^ý}Wý}Pý}Iý}Bý};ý}4ý}-ý}&ý}ý}ý}ý} ý}ý}üü}õü}îü}çü}àü}Ùü}Òü}Ëü}Äü}½ü}¶ü}¯ü}¨ü}¡ü}šü}“ü}Œü}…ü}~ü}wü}pü}iü}bü}[ü}Tü}Mü}Fü}?ü}8ü}1ü}*ü}#ü}ü}ü}ü}ü}ü}ùû}òû}ëû}äû}Ýû}Öû}Ïû}Èû}Áû}ºû}³û}¬û}¥û}žû}—û}û}‰û}‚û}{û}tû}mû}fû}_û}Xû}Qû}Jû}Cû}<û}5û}.û}'û} û}û}û} û}û}ýú}öú}ïú}èú}áú}Úú}Óú}Ìú}Åú}¾ú}·ú}°ú}©ú}¢ú}›ú}”ú}ú}†ú}ú}xú}qú}jú}cú}\ú}Uú}Nú}Gú}@ú}9ú}2ú}+ú}$ú}ú}ú}ú}ú}ú}úù}óù}ìù}åù}Þù}×ù}Ðù}Éù}Âù}»ù}´ù}­ù}¦ù}Ÿù}˜ù}‘ù}Šù}ƒù}|ù}uù}nù}gù}`ù}Yù}Rù}Kù}Dù}=ù}6ù}/ù}(ù}!ù}ù}ù} ù}ù}þø}÷ø}ðø}éø}âø}Ûø}Ôø}Íø}Æø}¿ø}¸ø}±ø}ªø}£ø}œø}•ø}Žø}‡ø}€ø}yø}rø}kø}dø}]ø}Vø}Oø}Hø}Aø}:ø}3ø},ø}%ø}ø}ø}ø} ø}ø}û÷}ô÷}í÷}æ÷}ß÷}Ø÷}Ñ÷}Ê÷}Ã÷}¼÷}µ÷}®÷}§÷} ÷}™÷}’÷}‹÷}„÷}}÷}v÷}o÷}h÷}a÷}Z÷}S÷}L÷}E÷}>÷}7÷}0÷})÷}"÷}÷}÷} ÷}÷}ÿö}øö}ñö}êö}ãö}Üö}Õö}Îö}Çö}Àö}¹ö}²ö}«ö}¤ö}ö}–ö}ö}ˆö}ö}zö}sö}lö}eö}^ö}Wö}Pö}Iö}Bö};ö}4ö}-ö}&ö}ö}ö}ö} ö}ö}üõ}õõ}îõ}çõ}àõ}Ùõ}Òõ}Ëõ}Äõ}½õ}¶õ}¯õ}¨õ}¡õ}šõ}“õ}Œõ}…õ}~õ}wõ}põ}iõ}bõ}[õ}Tõ}Mõ}Fõ}?õ}8õ}1õ}*õ}#õ}õ}õ}õ}õ}õ}ùô}òô}ëô}äô}Ýô}Öô}Ïô}Èô}Áô}ºô}³ô}¬ô}¥ô}žô}—ô}ô}‰ô}‚ô}{ô}tô}mô}fô}_ô}Xô}Qô}Jô}Cô}<ô}5ô}.ô}'ô} ô}ô}ô} ô}ô}ýó}öó}ïó}èó}áó}Úó}Óó}Ìó}Åó}¾ó}·ó}°ó}©ó}¢ó}›ó}”ó}ó}†ó}ó}xó}qó}jó}có}\ó}Uó}Nó}Gó}@ó}9ó}2ó}+ó}$ó}ó}ó}ó}ó}ó}úò}óò}ìò}åò}Þò}×ò}Ðò}Éò}Âò}»ò}´ò}­ò}¦ò}Ÿò}˜ò}‘ò}Šò}ƒò}|ò}uò}nò}gò}`ò}Yò}Rò}Kò}Dò}=ò}6ò}/ò}(ò}!ò}ò}ò} ò}ò}þñ}÷ñ}ðñ}éñ}âñ}Ûñ}Ôñ}Íñ}Æñ}¿ñ}¸ñ}±ñ}ªñ}£ñ}œñ}•ñ}Žñ}‡ñ}€ñ}yñ}rñ}kñ}dñ}]ñ}Vñ}Oñ}Hñ}Añ}:ñ}3ñ},ñ}%ñ}ñ}ñ}ñ} ñ}ñ}ûð}ôð}íð}æð}ßð}Øð}Ñð}Êð}Ãð}¼ð}µð}®ð}§ð} ð}™ð}’ð}‹ð}„ð}}ð}vð}oð}hð}að}Zð}Sð}Lð}Eð}>ð}7ð}0ð})ð}"ð}ð}ð} ð}ð}ÿï}øï}ñï}êï}ãï}Üï}Õï}Îï}Çï}Àï}¹ï}²ï}«ï}¤ï}ï}–ï}ï}ˆï}ï}zï}sï}lï}eï}^ï}Wï}Pï}Iï}Bï};ï}4ï}-ï}&ï}ï}ï}ï} ï}ï}üî}õî}îî}çî}àî}Ùî}Òî}Ëî}Äî}½î}¶î}¯î}¨î}¡î}šî}“î}Œî}…î}~î}wî}pî}iî}bî}[î}Tî}Mî}Fî}?î}8î}1î}*î}#î}î}î}î}î}î}ùí}òí}ëí}äí}Ýí}Öí}Ïí}Èí}Áí}ºí}³í}¬í}¥í}ží}—í}í}‰í}‚í}{í}tí}mí}fí}_í}Xí}Qí}Jí}Cí}<í}5í}.í}'í} í}í}í} í}í}ýì}öì}ïì}èì}áì}Úì}Óì}Ìì}Åì}¾ì}·ì}°ì}©ì}¢ì}›ì}”ì}ì}†ì}ì}xì}qì}jì}cì}\ì}Uì}Nì}Gì}@ì}9ì}2ì}+ì}$ì}ì}ì}ì}ì}ì}úë}óë}ìë}åë}Þë}×ë}Ðë}Éë}Âë}»ë}´ë}­ë}¦ë}Ÿë}˜ë}‘ë}Šë}ƒë}|ë}uë}në}gë}`ë}Yë}Rë}Kë}Dë}=ë}6ë}/ë}(ë}!ë}ë}ë} ë}ë}þê}÷ê}ðê}éê}âê}Ûê}Ôê}Íê}Æê}¿ê}¸ê}±ê}ªê}£ê}œê}•ê}Žê}‡ê}€ê}yê}rê}kê}dê}]ê}Vê}Oê}Hê}Aê}:ê}3ê},ê}%ê}ê}ê}ê} ê}ê}ûé}ôé}íé}æé}ßé}Øé}Ñé}Êé}Ãé}¼é}µé}®é}§é} é}™é}’é}‹é}„é}}é}vé}oé}hé}aé}Zé}Sé}Lé}Eé}>é}7é}0é})é}"é}é}é} é}é}ÿè}øè}ñè}êè}ãè}Üè}Õè}Îè}Çè}Àè}¹è}²è}«è}¤è}è}–è}è}ˆè}è}zè}sè}lè}eè}^è}Wè}Pè}Iè}Bè};è}4è}-è}&è}è}è}è} è}è}üç}õç}îç}çç}àç}Ùç}Òç}Ëç}Äç}½ç}¶ç}¯ç}¨ç}¡ç}šç}“ç}Œç}…ç}~ç}wç}pç}iç}bç}[ç}Tç}Mç}Fç}?ç}8ç}1ç}*ç}#ç}ç}ç}ç}ç}ç}ùæ}òæ}ëæ}äæ}Ýæ}Öæ}Ïæ}Èæ}Áæ}ºæ}³æ}¬æ}¥æ}žæ}—æ}æ}‰æ}‚æ}{æ}tæ}mæ}fæ}_æ}Xæ}Qæ}Jæ}Cæ}<æ}5æ}.æ}'æ} æ}æ}æ} æ}æ}ýå}öå}ïå}èå}áå}Úå}Óå}Ìå}Åå}¾å}·å}°å}©å}¢å}›å}”å}å}†å}å}xå}qå}jå}cå}\å}Uå}Nå}Gå}@å}9å}2å}+å}$å}å}å}å}å}å}úä}óä}ìä}åä}Þä}×ä}Ðä}Éä}Âä}»ä}´ä}­ä}¦ä}Ÿä}˜ä}‘ä}Šä}ƒä}|ä}uä}nä}gä}`ä}Yä}Rä}Kä}Dä}=ä}6ä}/ä}(ä}!ä}ä}ä} ä}ä}þã}÷ã}ðã}éã}âã}Ûã}Ôã}Íã}Æã}¿ã}¸ã}±ã}ªã}£ã}œã}•ã}Žã}‡ã}€ã}yã}rã}kã}dã}]ã}Vã}Oã}Hã}Aã}:ã}3ã},ã}%ã}ã}ã}ã} ã}ã}ûâ}ôâ}íâ}æâ}ßâ}Øâ}Ñâ}Êâ}Ãâ}¼â}µâ}®â}§â} â}™â}’â}‹â}„â}}â}vâ}oâ}hâ}aâ}Zâ}Sâ}Lâ}Eâ}>â}7â}0â})â}"â}â}â} â}â}ÿá}øá}ñá}êá}ãá}Üá}Õá}Îá}Çá}Àá}¹á}²á}«á}¤á}á}–á}á}ˆá}á}zá}sá}lá}eá}^á}Wá}Pá}Iá}Bá};á}4á}-á}&á}á}á}á} á}á}üà}õà}îà}çà}àà}Ùà}Òà}Ëà}Äà}½à}¶à}¯à}¨à}¡à}šà}“à}Œà}…à}~à}wà}pà}ià}bà}[à}Tà}Mà}Fà}?à}8à}1à}*à}#à}à}à}à}à}à}ùß}òß}ëß}äß}Ýß}Öß}Ïß}Èß}Áß}ºß}³ß}¬ß}¥ß}žß}—ß}ß}‰ß}‚ß}{ß}tß}mß}fß}_ß}Xß}Qß}Jß}Cß}<ß}5ß}.ß}'ß} ß}ß}ß} ß}ß}ýÞ}öÞ}ïÞ}èÞ}áÞ}ÚÞ}ÓÞ}ÌÞ}ÅÞ}¾Þ}·Þ}°Þ}©Þ}¢Þ}›Þ}”Þ}Þ}†Þ}Þ}xÞ}qÞ}jÞ}cÞ}\Þ}UÞ}NÞ}GÞ}@Þ}9Þ}2Þ}+Þ}$Þ}Þ}Þ}Þ}Þ}Þ}úÝ}óÝ}ìÝ}åÝ}ÞÝ}×Ý}ÐÝ}ÉÝ}ÂÝ}»Ý}´Ý}­Ý}¦Ý}ŸÝ}˜Ý}‘Ý}ŠÝ}ƒÝ}|Ý}uÝ}nÝ}gÝ}`Ý}YÝ}RÝ}KÝ}DÝ}=Ý}6Ý}/Ý}(Ý}!Ý}Ý}Ý} Ý}Ý}þÜ}÷Ü}ðÜ}éÜ}âÜ}ÛÜ}ÔÜ}ÍÜ}ÆÜ}¿Ü}¸Ü}±Ü}ªÜ}£Ü}œÜ}•Ü}ŽÜ}‡Ü}€Ü}yÜ}rÜ}kÜ}dÜ}]Ü}VÜ}OÜ}HÜ}AÜ}:Ü}3Ü},Ü}%Ü}Ü}Ü}Ü} Ü}Ü}ûÛ}ôÛ}íÛ}æÛ}ßÛ}ØÛ}ÑÛ}ÊÛ}ÃÛ}¼Û}µÛ}®Û}§Û} Û}™Û}’Û}‹Û}„Û}}Û}vÛ}oÛ}hÛ}aÛ}ZÛ}SÛ}LÛ}EÛ}>Û}7Û}0Û})Û}"Û}Û}Û} Û}Û}ÿÚ}øÚ}ñÚ}êÚ}ãÚ}ÜÚ}ÕÚ}ÎÚ}ÇÚ}ÀÚ}¹Ú}²Ú}«Ú}¤Ú}Ú}–Ú}Ú}ˆÚ}Ú}zÚ}sÚ}lÚ}eÚ}^Ú}WÚ}PÚ}IÚ}BÚ};Ú}4Ú}-Ú}&Ú}Ú}Ú}Ú} Ú}Ú}üÙ}õÙ}îÙ}çÙ}àÙ}ÙÙ}ÒÙ}ËÙ}ÄÙ}½Ù}¶Ù}¯Ù}¨Ù}¡Ù}šÙ}“Ù}ŒÙ}…Ù}~Ù}wÙ}pÙ}iÙ}bÙ}[Ù}TÙ}MÙ}FÙ}?Ù}8Ù}1Ù}*Ù}#Ù}Ù}Ù}Ù}Ù}Ù}ùØ}òØ}ëØ}äØ}ÝØ}ÖØ}ÏØ}ÈØ}ÁØ}ºØ}³Ø}¬Ø}¥Ø}žØ}—Ø}Ø}‰Ø}‚Ø}{Ø}tØ}mØ}fØ}_Ø}XØ}QØ}JØ}CØ}<Ø}5Ø}.Ø}'Ø} Ø}Ø}Ø} Ø}Ø}ý×}ö×}ï×}è×}á×}Ú×}Ó×}Ì×}Å×}¾×}·×}°×}©×}¢×}›×}”×}×}†×}×}x×}q×}j×}c×}\×}U×}N×}G×}@×}9×}2×}+×}$×}×}×}×}×}×}úÖ}óÖ}ìÖ}åÖ}ÞÖ}×Ö}ÐÖ}ÉÖ}ÂÖ}»Ö}´Ö}­Ö}¦Ö}ŸÖ}˜Ö}‘Ö}ŠÖ}ƒÖ}|Ö}uÖ}nÖ}gÖ}`Ö}YÖ}RÖ}KÖ}DÖ}=Ö}6Ö}/Ö}(Ö}!Ö}Ö}Ö} Ö}Ö}þÕ}÷Õ}ðÕ}éÕ}âÕ}ÛÕ}ÔÕ}ÍÕ}ÆÕ}¿Õ}¸Õ}±Õ}ªÕ}£Õ}œÕ}•Õ}ŽÕ}‡Õ}€Õ}yÕ}rÕ}kÕ}dÕ}]Õ}VÕ}OÕ}HÕ}AÕ}:Õ}3Õ},Õ}%Õ}Õ}Õ}Õ} Õ}Õ}ûÔ}ôÔ}íÔ}æÔ}ßÔ}ØÔ}ÑÔ}ÊÔ}ÃÔ}¼Ô}µÔ}®Ô}§Ô} Ô}™Ô}’Ô}‹Ô}„Ô}}Ô}vÔ}oÔ}hÔ}aÔ}ZÔ}SÔ}LÔ}EÔ}>Ô}7Ô}0Ô})Ô}"Ô}Ô}Ô} Ô}Ô}ÿÓ}øÓ}ñÓ}êÓ}ãÓ}ÜÓ}ÕÓ}ÎÓ}ÇÓ}ÀÓ}¹Ó}²Ó}«Ó}¤Ó}Ó}–Ó}Ó}ˆÓ}Ó}zÓ}sÓ}lÓ}eÓ}^Ó}WÓ}PÓ}IÓ}BÓ};Ó}4Ó}-Ó}&Ó}Ó}Ó}Ó} Ó}Ó}üÒ}õÒ}îÒ}çÒ}àÒ}ÙÒ}ÒÒ}ËÒ}ÄÒ}½Ò}¶Ò}¯Ò}¨Ò}¡Ò}šÒ}“Ò}ŒÒ}…Ò}~Ò}wÒ}pÒ}iÒ}bÒ}[Ò}TÒ}MÒ}FÒ}?Ò}8Ò}1Ò}*Ò}#Ò}Ò}Ò}Ò}Ò}Ò}ùÑ}òÑ}ëÑ}äÑ}ÝÑ}ÖÑ}ÏÑ}ÈÑ}ÁÑ}ºÑ}³Ñ}¬Ñ}¥Ñ}žÑ}—Ñ}Ñ}‰Ñ}‚Ñ}{Ñ}tÑ}mÑ}fÑ}_Ñ}XÑ}QÑ}JÑ}CÑ}<Ñ}5Ñ}.Ñ}'Ñ} Ñ}Ñ}Ñ} Ñ}Ñ}ýÐ}öÐ}ïÐ}èÐ}áÐ}ÚÐ}ÓÐ}ÌÐ}ÅÐ}¾Ð}·Ð}°Ð}©Ð}¢Ð}›Ð}”Ð}Ð}†Ð}Ð}xÐ}qÐ}jÐ}cÐ}\Ð}UÐ}NÐ}GÐ}@Ð}9Ð}2Ð}+Ð}$Ð}Ð}Ð}Ð}Ð}Ð}úÏ}óÏ}ìÏ}åÏ}ÞÏ}×Ï}ÐÏ}ÉÏ}ÂÏ}»Ï}´Ï}­Ï}¦Ï}ŸÏ}˜Ï}‘Ï}ŠÏ}ƒÏ}|Ï}uÏ}nÏ}gÏ}`Ï}YÏ}RÏ}KÏ}DÏ}=Ï}6Ï}/Ï}(Ï}!Ï}Ï}Ï} Ï}Ï}þÎ}÷Î}ðÎ}éÎ}âÎ}ÛÎ}ÔÎ}ÍÎ}ÆÎ}¿Î}¸Î}±Î}ªÎ}£Î}œÎ}•Î}ŽÎ}‡Î}€Î}yÎ}rÎ}kÎ}dÎ}]Î}VÎ}OÎ}HÎ}AÎ}:Î}3Î},Î}%Î}Î}Î}Î} Î}Î}ûÍ}ôÍ}íÍ}æÍ}ßÍ}ØÍ}ÑÍ}ÊÍ}ÃÍ}¼Í}µÍ}®Í}§Í} Í}™Í}’Í}‹Í}„Í}}Í}vÍ}oÍ}hÍ}aÍ}ZÍ}SÍ}LÍ}EÍ}>Í}7Í}0Í})Í}"Í}Í}Í} Í}Í}ÿÌ}øÌ}ñÌ}êÌ}ãÌ}ÜÌ}ÕÌ}ÎÌ}ÇÌ}ÀÌ}¹Ì}²Ì}«Ì}¤Ì}Ì}–Ì}Ì}ˆÌ}Ì}zÌ}sÌ}lÌ}eÌ}^Ì}WÌ}PÌ}IÌ}BÌ};Ì}4Ì}-Ì}&Ì}Ì}Ì}Ì} Ì}Ì}üË}õË}îË}çË}àË}ÙË}ÒË}ËË}ÄË}½Ë}¶Ë}¯Ë}¨Ë}¡Ë}šË}“Ë}ŒË}…Ë}~Ë}wË}pË}iË}bË}[Ë}TË}MË}FË}?Ë}8Ë}1Ë}*Ë}#Ë}Ë}Ë}Ë}Ë}Ë}ùÊ}òÊ}ëÊ}äÊ}ÝÊ}ÖÊ}ÏÊ}ÈÊ}ÁÊ}ºÊ}³Ê}¬Ê}¥Ê}žÊ}—Ê}Ê}‰Ê}‚Ê}{Ê}tÊ}mÊ}fÊ}_Ê}XÊ}QÊ}JÊ}CÊ}<Ê}5Ê}.Ê}'Ê} Ê}Ê}Ê} Ê}Ê}ýÉ}öÉ}ïÉ}èÉ}áÉ}ÚÉ}ÓÉ}ÌÉ}ÅÉ}¾É}·É}°É}©É}¢É}›É}”É}É}†É}É}xÉ}qÉ}jÉ}cÉ}\É}UÉ}NÉ}GÉ}@É}9É}2É}+É}$É}É}É}É}É}É}úÈ}óÈ}ìÈ}åÈ}ÞÈ}×È}ÐÈ}ÉÈ}ÂÈ}»È}´È}­È}¦È}ŸÈ}˜È}‘È}ŠÈ}ƒÈ}|È}uÈ}nÈ}gÈ}`È}YÈ}RÈ}KÈ}DÈ}=È}6È}/È}(È}!È}È}È} È}È}þÇ}÷Ç}ðÇ}éÇ}âÇ}ÛÇ}ÔÇ}ÍÇ}ÆÇ}¿Ç}¸Ç}±Ç}ªÇ}£Ç}œÇ}•Ç}ŽÇ}‡Ç}€Ç}yÇ}rÇ}kÇ}dÇ}]Ç}VÇ}OÇ}HÇ}AÇ}:Ç}3Ç},Ç}%Ç}Ç}Ç}Ç} Ç}Ç}ûÆ}ôÆ}íÆ}æÆ}߯}ØÆ}ÑÆ}ÊÆ}ÃÆ}¼Æ}µÆ}®Æ}§Æ} Æ}™Æ}’Æ}‹Æ}„Æ}}Æ}vÆ}oÆ}hÆ}aÆ}ZÆ}SÆ}LÆ}EÆ}>Æ}7Æ}0Æ})Æ}"Æ}Æ}Æ} Æ}Æ}ÿÅ}øÅ}ñÅ}êÅ}ãÅ}ÜÅ}ÕÅ}ÎÅ}ÇÅ}ÀÅ}¹Å}²Å}«Å}¤Å}Å}–Å}Å}ˆÅ}Å}zÅ}sÅ}lÅ}eÅ}^Å}WÅ}PÅ}IÅ}BÅ};Å}4Å}-Å}&Å}Å}Å}Å} Å}Å}üÄ}õÄ}îÄ}çÄ}àÄ}ÙÄ}ÒÄ}ËÄ}ÄÄ}½Ä}¶Ä}¯Ä}¨Ä}¡Ä}šÄ}“Ä}ŒÄ}…Ä}~Ä}wÄ}pÄ}iÄ}bÄ}[Ä}TÄ}MÄ}FÄ}?Ä}8Ä}1Ä}*Ä}#Ä}Ä}Ä}Ä}Ä}Ä}ùÃ}òÃ}ëÃ}äÃ}ÝÃ}ÖÃ}ÏÃ}ÈÃ}ÁÃ}ºÃ}³Ã}¬Ã}¥Ã}žÃ}—Ã}Ã}‰Ã}‚Ã}{Ã}tÃ}mÃ}fÃ}_Ã}XÃ}QÃ}JÃ}CÃ}<Ã}5Ã}.Ã}'Ã} Ã}Ã}Ã} Ã}Ã}ýÂ}öÂ}ïÂ}èÂ}áÂ}ÚÂ}ÓÂ}ÌÂ}ÅÂ}¾Â}·Â}°Â}©Â}¢Â}›Â}”Â}Â}†Â}Â}xÂ}qÂ}jÂ}cÂ}\Â}UÂ}NÂ}GÂ}@Â}9Â}2Â}+Â}$Â}Â}Â}Â}Â}Â}úÁ}óÁ}ìÁ}åÁ}ÞÁ}×Á}ÐÁ}ÉÁ}ÂÁ}»Á}´Á}­Á}¦Á}ŸÁ}˜Á}‘Á}ŠÁ}ƒÁ}|Á}uÁ}nÁ}gÁ}`Á}YÁ}RÁ}KÁ}DÁ}=Á}6Á}/Á}(Á}!Á}Á}Á} Á}Á}þÀ}÷À}ðÀ}éÀ}âÀ}ÛÀ}ÔÀ}ÍÀ}ÆÀ}¿À}¸À}±À}ªÀ}£À}œÀ}•À}ŽÀ}‡À}€À}yÀ}rÀ}kÀ}dÀ}]À}VÀ}OÀ}HÀ}AÀ}:À}3À},À}%À}À}À}À} À}À}û¿}ô¿}í¿}æ¿}ß¿}Ø¿}Ñ¿}Ê¿}ÿ}¼¿}µ¿}®¿}§¿} ¿}™¿}’¿}‹¿}„¿}}¿}v¿}o¿}h¿}a¿}Z¿}S¿}L¿}E¿}>¿}7¿}0¿})¿}"¿}¿}¿} ¿}¿}ÿ¾}ø¾}ñ¾}ê¾}ã¾}ܾ}Õ¾}ξ}Ǿ}À¾}¹¾}²¾}«¾}¤¾}¾}–¾}¾}ˆ¾}¾}z¾}s¾}l¾}e¾}^¾}W¾}P¾}I¾}B¾};¾}4¾}-¾}&¾}¾}¾}¾} ¾}¾}ü½}õ½}î½}ç½}à½}Ù½}Ò½}˽}Ľ}½½}¶½}¯½}¨½}¡½}š½}“½}Œ½}…½}~½}w½}p½}i½}b½}[½}T½}M½}F½}?½}8½}1½}*½}#½}½}½}½}½}½}ù¼}ò¼}ë¼}ä¼}ݼ}Ö¼}ϼ}ȼ}Á¼}º¼}³¼}¬¼}¥¼}ž¼}—¼}¼}‰¼}‚¼}{¼}t¼}m¼}f¼}_¼}X¼}Q¼}J¼}C¼}<¼}5¼}.¼}'¼} ¼}¼}¼} ¼}¼}ý»}ö»}ï»}è»}á»}Ú»}Ó»}Ì»}Å»}¾»}·»}°»}©»}¢»}›»}”»}»}†»}»}x»}q»}j»}c»}\»}U»}N»}G»}@»}9»}2»}+»}$»}»}»}»}»}»}úº}óº}ìº}åº}Þº}׺}к}ɺ}º}»º}´º}­º}¦º}Ÿº}˜º}‘º}Šº}ƒº}|º}uº}nº}gº}`º}Yº}Rº}Kº}Dº}=º}6º}/º}(º}!º}º}º} º}º}þ¹}÷¹}ð¹}é¹}â¹}Û¹}Ô¹}͹}ƹ}¿¹}¸¹}±¹}ª¹}£¹}œ¹}•¹}޹}‡¹}€¹}y¹}r¹}k¹}d¹}]¹}V¹}O¹}H¹}A¹}:¹}3¹},¹}%¹}¹}¹}¹} ¹}¹}û¸}ô¸}í¸}æ¸}߸}ظ}Ѹ}ʸ}ø}¼¸}µ¸}®¸}§¸} ¸}™¸}’¸}‹¸}„¸}}¸}v¸}o¸}h¸}a¸}Z¸}S¸}L¸}E¸}>¸}7¸}0¸})¸}"¸}¸}¸} ¸}¸}ÿ·}ø·}ñ·}ê·}ã·}Ü·}Õ·}η}Ç·}À·}¹·}²·}«·}¤·}·}–·}·}ˆ·}·}z·}s·}l·}e·}^·}W·}P·}I·}B·};·}4·}-·}&·}·}·}·} ·}·}ü¶}õ¶}î¶}ç¶}à¶}Ù¶}Ò¶}˶}Ķ}½¶}¶¶}¯¶}¨¶}¡¶}š¶}“¶}Œ¶}…¶}~¶}w¶}p¶}i¶}b¶}[¶}T¶}M¶}F¶}?¶}8¶}1¶}*¶}#¶}¶}¶}¶}¶}¶}ùµ}òµ}ëµ}äµ}ݵ}Öµ}ϵ}ȵ}Áµ}ºµ}³µ}¬µ}¥µ}žµ}—µ}µ}‰µ}‚µ}{µ}tµ}mµ}fµ}_µ}Xµ}Qµ}Jµ}Cµ}<µ}5µ}.µ}'µ} µ}µ}µ} µ}µ}ý´}ö´}ï´}è´}á´}Ú´}Ó´}Ì´}Å´}¾´}·´}°´}©´}¢´}›´}”´}´}†´}´}x´}q´}j´}c´}\´}U´}N´}G´}@´}9´}2´}+´}$´}´}´}´}´}´}ú³}ó³}ì³}å³}Þ³}׳}г}ɳ}³}»³}´³}­³}¦³}Ÿ³}˜³}‘³}г}ƒ³}|³}u³}n³}g³}`³}Y³}R³}K³}D³}=³}6³}/³}(³}!³}³}³} ³}³}þ²}÷²}ð²}é²}â²}Û²}Ô²}Ͳ}Ʋ}¿²}¸²}±²}ª²}£²}œ²}•²}޲}‡²}€²}y²}r²}k²}d²}]²}V²}O²}H²}A²}:²}3²},²}%²}²}²}²} ²}²}û±}ô±}í±}æ±}ß±}ر}ѱ}ʱ}ñ}¼±}µ±}®±}§±} ±}™±}’±}‹±}„±}}±}v±}o±}h±}a±}Z±}S±}L±}E±}>±}7±}0±})±}"±}±}±} ±}±}ÿ°}ø°}ñ°}ê°}ã°}ܰ}Õ°}ΰ}ǰ}À°}¹°}²°}«°}¤°}°}–°}°}ˆ°}°}z°}s°}l°}e°}^°}W°}P°}I°}B°};°}4°}-°}&°}°}°}°} °}°}ü¯}õ¯}î¯}ç¯}à¯}Ù¯}Ò¯}˯}į}½¯}¶¯}¯¯}¨¯}¡¯}š¯}“¯}Œ¯}…¯}~¯}w¯}p¯}i¯}b¯}[¯}T¯}M¯}F¯}?¯}8¯}1¯}*¯}#¯}¯}¯}¯}¯}¯}ù®}ò®}ë®}ä®}Ý®}Ö®}Ï®}È®}Á®}º®}³®}¬®}¥®}ž®}—®}®}‰®}‚®}{®}t®}m®}f®}_®}X®}Q®}J®}C®}<®}5®}.®}'®} ®}®}®} ®}®}ý­}ö­}ï­}è­}á­}Ú­}Ó­}Ì­}Å­}¾­}·­}°­}©­}¢­}›­}”­}­}†­}­}x­}q­}j­}c­}\­}U­}N­}G­}@­}9­}2­}+­}$­}­}­}­}­}­}ú¬}ó¬}ì¬}å¬}Þ¬}׬}Ь}ɬ}¬}»¬}´¬}­¬}¦¬}Ÿ¬}˜¬}‘¬}Ь}ƒ¬}|¬}u¬}n¬}g¬}`¬}Y¬}R¬}K¬}D¬}=¬}6¬}/¬}(¬}!¬}¬}¬} ¬}¬}þ«}÷«}ð«}é«}â«}Û«}Ô«}Í«}Æ«}¿«}¸«}±«}ª«}£«}œ«}•«}Ž«}‡«}€«}y«}r«}k«}d«}]«}V«}O«}H«}A«}:«}3«},«}%«}«}«}«} «}«}ûª}ôª}íª}æª}ߪ}ت}Ѫ}ʪ}ê}¼ª}µª}®ª}§ª} ª}™ª}’ª}‹ª}„ª}}ª}vª}oª}hª}aª}Zª}Sª}Lª}Eª}>ª}7ª}0ª})ª}"ª}ª}ª} ª}ª}ÿ©}ø©}ñ©}ê©}ã©}Ü©}Õ©}Ω}Ç©}À©}¹©}²©}«©}¤©}©}–©}©}ˆ©}©}z©}s©}l©}e©}^©}W©}P©}I©}B©};©}4©}-©}&©}©}©}©} ©}©}ü¨}õ¨}î¨}ç¨}à¨}Ù¨}Ò¨}˨}Ĩ}½¨}¶¨}¯¨}¨¨}¡¨}š¨}“¨}Œ¨}…¨}~¨}w¨}p¨}i¨}b¨}[¨}T¨}M¨}F¨}?¨}8¨}1¨}*¨}#¨}¨}¨}¨}¨}¨}ù§}ò§}ë§}ä§}ݧ}Ö§}ϧ}ȧ}Á§}º§}³§}¬§}¥§}ž§}—§}§}‰§}‚§}{§}t§}m§}f§}_§}X§}Q§}J§}C§}<§}5§}.§}'§} §}§}§} §}§}ý¦}ö¦}ï¦}è¦}á¦}Ú¦}Ó¦}̦}Ŧ}¾¦}·¦}°¦}©¦}¢¦}›¦}”¦}¦}†¦}¦}x¦}q¦}j¦}c¦}\¦}U¦}N¦}G¦}@¦}9¦}2¦}+¦}$¦}¦}¦}¦}¦}¦}ú¥}ó¥}ì¥}å¥}Þ¥}×¥}Ð¥}É¥}Â¥}»¥}´¥}­¥}¦¥}Ÿ¥}˜¥}‘¥}Š¥}ƒ¥}|¥}u¥}n¥}g¥}`¥}Y¥}R¥}K¥}D¥}=¥}6¥}/¥}(¥}!¥}¥}¥} ¥}¥}þ¤}÷¤}ð¤}é¤}â¤}Û¤}Ô¤}ͤ}Ƥ}¿¤}¸¤}±¤}ª¤}£¤}œ¤}•¤}ޤ}‡¤}€¤}y¤}r¤}k¤}d¤}]¤}V¤}O¤}H¤}A¤}:¤}3¤},¤}%¤}¤}¤}¤} ¤}¤}û£}ô£}í£}æ£}ߣ}Ø£}Ñ£}Ê£}ã}¼£}µ£}®£}§£} £}™£}’£}‹£}„£}}£}v£}o£}h£}a£}Z£}S£}L£}E£}>£}7£}0£})£}"£}£}£} £}£}ÿ¢}ø¢}ñ¢}ê¢}ã¢}Ü¢}Õ¢}΢}Ç¢}À¢}¹¢}²¢}«¢}¤¢}¢}–¢}¢}ˆ¢}¢}z¢}s¢}l¢}e¢}^¢}W¢}P¢}I¢}B¢};¢}4¢}-¢}&¢}¢}¢}¢} ¢}¢}ü¡}õ¡}î¡}ç¡}à¡}Ù¡}Ò¡}Ë¡}Ä¡}½¡}¶¡}¯¡}¨¡}¡¡}š¡}“¡}Œ¡}…¡}~¡}w¡}p¡}i¡}b¡}[¡}T¡}M¡}F¡}?¡}8¡}1¡}*¡}#¡}¡}¡}¡}¡}¡}ù }ò }ë }ä }Ý }Ö }Ï }È }Á }º }³ }¬ }¥ }ž }— } }‰ }‚ }{ }t }m }f }_ }X }Q }J }C }< }5 }. }' }  } } }  } }ýŸ}öŸ}ïŸ}èŸ}áŸ}ÚŸ}ÓŸ}ÌŸ}ÅŸ}¾Ÿ}·Ÿ}°Ÿ}©Ÿ}¢Ÿ}›Ÿ}”Ÿ}Ÿ}†Ÿ}Ÿ}xŸ}qŸ}jŸ}cŸ}\Ÿ}UŸ}NŸ}GŸ}@Ÿ}9Ÿ}2Ÿ}+Ÿ}$Ÿ}Ÿ}Ÿ}Ÿ}Ÿ}Ÿ}úž}óž}ìž}åž}Þž}מ}О}Éž}ž}»ž}´ž}­ž}¦ž}Ÿž}˜ž}‘ž}Šž}ƒž}|ž}už}nž}gž}`ž}Yž}Rž}Kž}Dž}=ž}6ž}/ž}(ž}!ž}ž}ž} ž}ž}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}ûœ}ôœ}íœ}æœ}ßœ}Øœ}Ñœ}Êœ}Ü}¼œ}µœ}®œ}§œ} œ}™œ}’œ}‹œ}„œ}}œ}vœ}oœ}hœ}aœ}Zœ}Sœ}Lœ}Eœ}>œ}7œ}0œ})œ}"œ}œ}œ} œ}œ}ÿ›}ø›}ñ›}ê›}ã›}Ü›}Õ›}Λ}Ç›}À›}¹›}²›}«›}¤›}›}–›}›}ˆ›}›}z›}s›}l›}e›}^›}W›}P›}I›}B›};›}4›}-›}&›}›}›}›} ›}›}üš}õš}îš}çš}àš}Ùš}Òš}Ëš}Äš}½š}¶š}¯š}¨š}¡š}šš}“š}Œš}…š}~š}wš}pš}iš}bš}[š}Tš}Mš}Fš}?š}8š}1š}*š}#š}š}š}š}š}š}ù™}ò™}ë™}ä™}Ý™}Ö™}Ï™}È™}Á™}º™}³™}¬™}¥™}ž™}—™}™}‰™}‚™}{™}t™}m™}f™}_™}X™}Q™}J™}C™}<™}5™}.™}'™} ™}™}™} ™}™}ý˜}ö˜}ï˜}è˜}á˜}Ú˜}Ó˜}̘}Ř}¾˜}·˜}°˜}©˜}¢˜}›˜}”˜}˜}†˜}˜}x˜}q˜}j˜}c˜}\˜}U˜}N˜}G˜}@˜}9˜}2˜}+˜}$˜}˜}˜}˜}˜}˜}ú—}ó—}ì—}å—}Þ—}×—}З}É—}—}»—}´—}­—}¦—}Ÿ—}˜—}‘—}Š—}ƒ—}|—}u—}n—}g—}`—}Y—}R—}K—}D—}=—}6—}/—}(—}!—}—}—} —}—}þ–}÷–}ð–}é–}â–}Û–}Ô–}Í–}Æ–}¿–}¸–}±–}ª–}£–}œ–}•–}Ž–}‡–}€–}y–}r–}k–}d–}]–}V–}O–}H–}A–}:–}3–},–}%–}–}–}–} –}–}û•}ô•}í•}æ•}ß•}Ø•}Ñ•}Ê•}Õ}¼•}µ•}®•}§•} •}™•}’•}‹•}„•}}•}v•}o•}h•}a•}Z•}S•}L•}E•}>•}7•}0•})•}"•}•}•} •}•}ÿ”}ø”}ñ”}ê”}ã”}Ü”}Õ”}Δ}Ç”}À”}¹”}²”}«”}¤”}”}–”}”}ˆ”}”}z”}s”}l”}e”}^”}W”}P”}I”}B”};”}4”}-”}&”}”}”}”} ”}”}ü“}õ“}î“}ç“}à“}Ù“}Ò“}Ë“}Ä“}½“}¶“}¯“}¨“}¡“}š“}““}Œ“}…“}~“}w“}p“}i“}b“}[“}T“}M“}F“}?“}8“}1“}*“}#“}“}“}“}“}“}ù’}ò’}ë’}ä’}Ý’}Ö’}Ï’}È’}Á’}º’}³’}¬’}¥’}ž’}—’}’}‰’}‚’}{’}t’}m’}f’}_’}X’}Q’}J’}C’}<’}5’}.’}'’} ’}’}’} ’}’}ý‘}ö‘}ï‘}è‘}á‘}Ú‘}Ó‘}Ì‘}Å‘}¾‘}·‘}°‘}©‘}¢‘}›‘}”‘}‘}†‘}‘}x‘}q‘}j‘}c‘}\‘}U‘}N‘}G‘}@‘}9‘}2‘}+‘}$‘}‘}‘}‘}‘}‘}ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}ûŽ}ôŽ}íŽ}æŽ}ߎ}ØŽ}ÑŽ}ÊŽ}ÃŽ}¼Ž}µŽ}®Ž}§Ž} Ž}™Ž}’Ž}‹Ž}„Ž}}Ž}vŽ}oŽ}hŽ}aŽ}ZŽ}SŽ}LŽ}EŽ}>Ž}7Ž}0Ž})Ž}"Ž}Ž}Ž} Ž}Ž}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}üŒ}õŒ}îŒ}çŒ}àŒ}ÙŒ}ÒŒ}ËŒ}ÄŒ}½Œ}¶Œ}¯Œ}¨Œ}¡Œ}šŒ}“Œ}ŒŒ}…Œ}~Œ}wŒ}pŒ}iŒ}bŒ}[Œ}TŒ}MŒ}FŒ}?Œ}8Œ}1Œ}*Œ}#Œ}Œ}Œ}Œ}Œ}Œ}ù‹}ò‹}ë‹}ä‹}Ý‹}Ö‹}Ï‹}È‹}Á‹}º‹}³‹}¬‹}¥‹}ž‹}—‹}‹}‰‹}‚‹}{‹}t‹}m‹}f‹}_‹}X‹}Q‹}J‹}C‹}<‹}5‹}.‹}'‹} ‹}‹}‹} ‹}‹}ýŠ}öŠ}ïŠ}èŠ}áŠ}ÚŠ}ÓŠ}ÌŠ}ÅŠ}¾Š}·Š}°Š}©Š}¢Š}›Š}”Š}Š}†Š}Š}xŠ}qŠ}jŠ}cŠ}\Š}UŠ}NŠ}GŠ}@Š}9Š}2Š}+Š}$Š}Š}Š}Š}Š}Š}ú‰}ó‰}ì‰}å‰}Þ‰}׉}Љ}ɉ}‰}»‰}´‰}­‰}¦‰}Ÿ‰}˜‰}‘‰}Љ}ƒ‰}|‰}u‰}n‰}g‰}`‰}Y‰}R‰}K‰}D‰}=‰}6‰}/‰}(‰}!‰}‰}‰} ‰}‰}þˆ}÷ˆ}ðˆ}éˆ}âˆ}Ûˆ}Ôˆ}͈}ƈ}¿ˆ}¸ˆ}±ˆ}ªˆ}£ˆ}œˆ}•ˆ}Žˆ}‡ˆ}€ˆ}yˆ}rˆ}kˆ}dˆ}]ˆ}Vˆ}Oˆ}Hˆ}Aˆ}:ˆ}3ˆ},ˆ}%ˆ}ˆ}ˆ}ˆ} ˆ}ˆ}û‡}ô‡}í‡}æ‡}߇}؇}ч}ʇ}Ç}¼‡}µ‡}®‡}§‡} ‡}™‡}’‡}‹‡}„‡}}‡}v‡}o‡}h‡}a‡}Z‡}S‡}L‡}E‡}>‡}7‡}0‡})‡}"‡}‡}‡} ‡}‡}ÿ†}ø†}ñ†}ê†}ã†}܆}Õ†}Ά}dž}À†}¹†}²†}«†}¤†}†}–†}†}ˆ†}†}z†}s†}l†}e†}^†}W†}P†}I†}B†};†}4†}-†}&†}†}†}†} †}†}ü…}õ…}î…}ç…}à…}Ù…}Ò…}Ë…}Ä…}½…}¶…}¯…}¨…}¡…}š…}“…}Œ…}……}~…}w…}p…}i…}b…}[…}T…}M…}F…}?…}8…}1…}*…}#…}…}…}…}…}…}ù„}ò„}ë„}ä„}Ý„}Ö„}Ï„}È„}Á„}º„}³„}¬„}¥„}ž„}—„}„}‰„}‚„}{„}t„}m„}f„}_„}X„}Q„}J„}C„}<„}5„}.„}'„} „}„}„} „}„}ýƒ}öƒ}ïƒ}èƒ}áƒ}Úƒ}Óƒ}̃}Ń}¾ƒ}·ƒ}°ƒ}©ƒ}¢ƒ}›ƒ}”ƒ}ƒ}†ƒ}ƒ}xƒ}qƒ}jƒ}cƒ}\ƒ}Uƒ}Nƒ}Gƒ}@ƒ}9ƒ}2ƒ}+ƒ}$ƒ}ƒ}ƒ}ƒ}ƒ}ƒ}ú‚}ó‚}ì‚}å‚}Þ‚}ׂ}Ђ}É‚}‚}»‚}´‚}­‚}¦‚}Ÿ‚}˜‚}‘‚}Š‚}ƒ‚}|‚}u‚}n‚}g‚}`‚}Y‚}R‚}K‚}D‚}=‚}6‚}/‚}(‚}!‚}‚}‚} ‚}‚}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û€}ô€}í€}æ€}߀}Ø€}Ñ€}Ê€}À}¼€}µ€}®€}§€} €}™€}’€}‹€}„€}}€}v€}o€}h€}a€}Z€}S€}L€}E€}>€}7€}0€})€}"€}€}€} €}€}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü~}õ~}î~}ç~}à~}Ù~}Ò~}Ë~}Ä~}½~}¶~}¯~}¨~}¡~}š~}“~}Œ~}…~}~~}w~}p~}i~}b~}[~}T~}M~}F~}?~}8~}1~}*~}#~}~}~}~}~}~}ù}}ò}}ë}}ä}}Ý}}Ö}}Ï}}È}}Á}}º}}³}}¬}}¥}}ž}}—}}}}‰}}‚}}{}}t}}m}}f}}_}}X}}Q}}J}}C}}<}}5}}.}}'}} }}}}}} }}}}ý|}ö|}ï|}è|}á|}Ú|}Ó|}Ì|}Å|}¾|}·|}°|}©|}¢|}›|}”|}|}†|}|}x|}q|}j|}c|}\|}U|}N|}G|}@|}9|}2|}+|}$|}|}|}|}|}|}ú{}ó{}ì{}å{}Þ{}×{}Ð{}É{}Â{}»{}´{}­{}¦{}Ÿ{}˜{}‘{}Š{}ƒ{}|{}u{}n{}g{}`{}Y{}R{}K{}D{}={}6{}/{}({}!{}{}{} {}{}þz}÷z}ðz}éz}âz}Ûz}Ôz}Íz}Æz}¿z}¸z}±z}ªz}£z}œz}•z}Žz}‡z}€z}yz}rz}kz}dz}]z}Vz}Oz}Hz}Az}:z}3z},z}%z}z}z}z} z}z}ûy}ôy}íy}æy}ßy}Øy}Ñy}Êy}Ãy}¼y}µy}®y}§y} y}™y}’y}‹y}„y}}y}vy}oy}hy}ay}Zy}Sy}Ly}Ey}>y}7y}0y})y}"y}y}y} y}y}ÿx}øx}ñx}êx}ãx}Üx}Õx}Îx}Çx}Àx}¹x}²x}«x}¤x}x}–x}x}ˆx}x}zx}sx}lx}ex}^x}Wx}Px}Ix}Bx};x}4x}-x}&x}x}x}x} x}x}üw}õw}îw}çw}àw}Ùw}Òw}Ëw}Äw}½w}¶w}¯w}¨w}¡w}šw}“w}Œw}…w}~w}ww}pw}iw}bw}[w}Tw}Mw}Fw}?w}8w}1w}*w}#w}w}w}w}w}w}ùv}òv}ëv}äv}Ýv}Öv}Ïv}Èv}Áv}ºv}³v}¬v}¥v}žv}—v}v}‰v}‚v}{v}tv}mv}fv}_v}Xv}Qv}Jv}Cv}r}7r}0r})r}"r}r}r} r}r}ÿq}øq}ñq}êq}ãq}Üq}Õq}Îq}Çq}Àq}¹q}²q}«q}¤q}q}–q}q}ˆq}q}zq}sq}lq}eq}^q}Wq}Pq}Iq}Bq};q}4q}-q}&q}q}q}q} q}q}üp}õp}îp}çp}àp}Ùp}Òp}Ëp}Äp}½p}¶p}¯p}¨p}¡p}šp}“p}Œp}…p}~p}wp}pp}ip}bp}[p}Tp}Mp}Fp}?p}8p}1p}*p}#p}p}p}p}p}p}ùo}òo}ëo}äo}Ýo}Öo}Ïo}Èo}Áo}ºo}³o}¬o}¥o}žo}—o}o}‰o}‚o}{o}to}mo}fo}_o}Xo}Qo}Jo}Co}k}7k}0k})k}"k}k}k} k}k}ÿj}øj}ñj}êj}ãj}Üj}Õj}Îj}Çj}Àj}¹j}²j}«j}¤j}j}–j}j}ˆj}j}zj}sj}lj}ej}^j}Wj}Pj}Ij}Bj};j}4j}-j}&j}j}j}j} j}j}üi}õi}îi}çi}ài}Ùi}Òi}Ëi}Äi}½i}¶i}¯i}¨i}¡i}ši}“i}Œi}…i}~i}wi}pi}ii}bi}[i}Ti}Mi}Fi}?i}8i}1i}*i}#i}i}i}i}i}i}ùh}òh}ëh}äh}Ýh}Öh}Ïh}Èh}Áh}ºh}³h}¬h}¥h}žh}—h}h}‰h}‚h}{h}th}mh}fh}_h}Xh}Qh}Jh}Ch}d}7d}0d})d}"d}d}d} d}d}ÿc}øc}ñc}êc}ãc}Üc}Õc}Îc}Çc}Àc}¹c}²c}«c}¤c}c}–c}c}ˆc}c}zc}sc}lc}ec}^c}Wc}Pc}Ic}Bc};c}4c}-c}&c}c}c}c} c}c}üb}õb}îb}çb}àb}Ùb}Òb}Ëb}Äb}½b}¶b}¯b}¨b}¡b}šb}“b}Œb}…b}~b}wb}pb}ib}bb}[b}Tb}Mb}Fb}?b}8b}1b}*b}#b}b}b}b}b}b}ùa}òa}ëa}äa}Ýa}Öa}Ïa}Èa}Áa}ºa}³a}¬a}¥a}ža}—a}a}‰a}‚a}{a}ta}ma}fa}_a}Xa}Qa}Ja}Ca}]}7]}0]})]}"]}]}]} ]}]}ÿ\}ø\}ñ\}ê\}ã\}Ü\}Õ\}Î\}Ç\}À\}¹\}²\}«\}¤\}\}–\}\}ˆ\}\}z\}s\}l\}e\}^\}W\}P\}I\}B\};\}4\}-\}&\}\}\}\} \}\}ü[}õ[}î[}ç[}à[}Ù[}Ò[}Ë[}Ä[}½[}¶[}¯[}¨[}¡[}š[}“[}Œ[}…[}~[}w[}p[}i[}b[}[[}T[}M[}F[}?[}8[}1[}*[}#[}[}[}[}[}[}ùZ}òZ}ëZ}äZ}ÝZ}ÖZ}ÏZ}ÈZ}ÁZ}ºZ}³Z}¬Z}¥Z}žZ}—Z}Z}‰Z}‚Z}{Z}tZ}mZ}fZ}_Z}XZ}QZ}JZ}CZ}V}7V}0V})V}"V}V}V} V}V}ÿU}øU}ñU}êU}ãU}ÜU}ÕU}ÎU}ÇU}ÀU}¹U}²U}«U}¤U}U}–U}U}ˆU}U}zU}sU}lU}eU}^U}WU}PU}IU}BU};U}4U}-U}&U}U}U}U} U}U}üT}õT}îT}çT}àT}ÙT}ÒT}ËT}ÄT}½T}¶T}¯T}¨T}¡T}šT}“T}ŒT}…T}~T}wT}pT}iT}bT}[T}TT}MT}FT}?T}8T}1T}*T}#T}T}T}T}T}T}ùS}òS}ëS}äS}ÝS}ÖS}ÏS}ÈS}ÁS}ºS}³S}¬S}¥S}žS}—S}S}‰S}‚S}{S}tS}mS}fS}_S}XS}QS}JS}CS}O}7O}0O})O}"O}O}O} O}O}ÿN}øN}ñN}êN}ãN}ÜN}ÕN}ÎN}ÇN}ÀN}¹N}²N}«N}¤N}N}–N}N}ˆN}N}zN}sN}lN}eN}^N}WN}PN}IN}BN};N}4N}-N}&N}N}N}N} N}N}üM}õM}îM}çM}àM}ÙM}ÒM}ËM}ÄM}½M}¶M}¯M}¨M}¡M}šM}“M}ŒM}…M}~M}wM}pM}iM}bM}[M}TM}MM}FM}?M}8M}1M}*M}#M}M}M}M}M}M}ùL}òL}ëL}äL}ÝL}ÖL}ÏL}ÈL}ÁL}ºL}³L}¬L}¥L}žL}—L}L}‰L}‚L}{L}tL}mL}fL}_L}XL}QL}JL}CL}H}7H}0H})H}"H}H}H} H}H}ÿG}øG}ñG}êG}ãG}ÜG}ÕG}ÎG}ÇG}ÀG}¹G}²G}«G}¤G}G}–G}G}ˆG}G}zG}sG}lG}eG}^G}WG}PG}IG}BG};G}4G}-G}&G}G}G}G} G}G}üF}õF}îF}çF}àF}ÙF}ÒF}ËF}ÄF}½F}¶F}¯F}¨F}¡F}šF}“F}ŒF}…F}~F}wF}pF}iF}bF}[F}TF}MF}FF}?F}8F}1F}*F}#F}F}F}F}F}F}ùE}òE}ëE}äE}ÝE}ÖE}ÏE}ÈE}ÁE}ºE}³E}¬E}¥E}žE}—E}E}‰E}‚E}{E}tE}mE}fE}_E}XE}QE}JE}CE}A}7A}0A})A}"A}A}A} A}A}ÿ@}ø@}ñ@}ê@}ã@}Ü@}Õ@}Î@}Ç@}À@}¹@}²@}«@}¤@}@}–@}@}ˆ@}@}z@}s@}l@}e@}^@}W@}P@}I@}B@};@}4@}-@}&@}@}@}@} @}@}ü?}õ?}î?}ç?}à?}Ù?}Ò?}Ë?}Ä?}½?}¶?}¯?}¨?}¡?}š?}“?}Œ?}…?}~?}w?}p?}i?}b?}[?}T?}M?}F?}??}8?}1?}*?}#?}?}?}?}?}?}ù>}ò>}ë>}ä>}Ý>}Ö>}Ï>}È>}Á>}º>}³>}¬>}¥>}ž>}—>}>}‰>}‚>}{>}t>}m>}f>}_>}X>}Q>}J>}C>}<>}5>}.>}'>} >}>}>} >}>}ý=}ö=}ï=}è=}á=}Ú=}Ó=}Ì=}Å=}¾=}·=}°=}©=}¢=}›=}”=}=}†=}=}x=}q=}j=}c=}\=}U=}N=}G=}@=}9=}2=}+=}$=}=}=}=}=}=}ú<}ó<}ì<}å<}Þ<}×<}Ð<}É<}Â<}»<}´<}­<}¦<}Ÿ<}˜<}‘<}Š<}ƒ<}|<}u<}n<}g<}`<}Y<}R<}K<}D<}=<}6<}/<}(<}!<}<}<} <}<}þ;}÷;}ð;}é;}â;}Û;}Ô;}Í;}Æ;}¿;}¸;}±;}ª;}£;}œ;}•;}Ž;}‡;}€;}y;}r;}k;}d;}];}V;}O;}H;}A;}:;}3;},;}%;};};};} ;};}û:}ô:}í:}æ:}ß:}Ø:}Ñ:}Ê:}Ã:}¼:}µ:}®:}§:} :}™:}’:}‹:}„:}}:}v:}o:}h:}a:}Z:}S:}L:}E:}>:}7:}0:}):}":}:}:} :}:}ÿ9}ø9}ñ9}ê9}ã9}Ü9}Õ9}Î9}Ç9}À9}¹9}²9}«9}¤9}9}–9}9}ˆ9}9}z9}s9}l9}e9}^9}W9}P9}I9}B9};9}49}-9}&9}9}9}9} 9}9}ü8}õ8}î8}ç8}à8}Ù8}Ò8}Ë8}Ä8}½8}¶8}¯8}¨8}¡8}š8}“8}Œ8}…8}~8}w8}p8}i8}b8}[8}T8}M8}F8}?8}88}18}*8}#8}8}8}8}8}8}ù7}ò7}ë7}ä7}Ý7}Ö7}Ï7}È7}Á7}º7}³7}¬7}¥7}ž7}—7}7}‰7}‚7}{7}t7}m7}f7}_7}X7}Q7}J7}C7}<7}57}.7}'7} 7}7}7} 7}7}ý6}ö6}ï6}è6}á6}Ú6}Ó6}Ì6}Å6}¾6}·6}°6}©6}¢6}›6}”6}6}†6}6}x6}q6}j6}c6}\6}U6}N6}G6}@6}96}26}+6}$6}6}6}6}6}6}ú5}ó5}ì5}å5}Þ5}×5}Ð5}É5}Â5}»5}´5}­5}¦5}Ÿ5}˜5}‘5}Š5}ƒ5}|5}u5}n5}g5}`5}Y5}R5}K5}D5}=5}65}/5}(5}!5}5}5} 5}5}þ4}÷4}ð4}é4}â4}Û4}Ô4}Í4}Æ4}¿4}¸4}±4}ª4}£4}œ4}•4}Ž4}‡4}€4}y4}r4}k4}d4}]4}V4}O4}H4}A4}:4}34},4}%4}4}4}4} 4}4}û3}ô3}í3}æ3}ß3}Ø3}Ñ3}Ê3}Ã3}¼3}µ3}®3}§3} 3}™3}’3}‹3}„3}}3}v3}o3}h3}a3}Z3}S3}L3}E3}>3}73}03})3}"3}3}3} 3}3}ÿ2}ø2}ñ2}ê2}ã2}Ü2}Õ2}Î2}Ç2}À2}¹2}²2}«2}¤2}2}–2}2}ˆ2}2}z2}s2}l2}e2}^2}W2}P2}I2}B2};2}42}-2}&2}2}2}2} 2}2}ü1}õ1}î1}ç1}à1}Ù1}Ò1}Ë1}Ä1}½1}¶1}¯1}¨1}¡1}š1}“1}Œ1}…1}~1}w1}p1}i1}b1}[1}T1}M1}F1}?1}81}11}*1}#1}1}1}1}1}1}ù0}ò0}ë0}ä0}Ý0}Ö0}Ï0}È0}Á0}º0}³0}¬0}¥0}ž0}—0}0}‰0}‚0}{0}t0}m0}f0}_0}X0}Q0}J0}C0}<0}50}.0}'0} 0}0}0} 0}0}ý/}ö/}ï/}è/}á/}Ú/}Ó/}Ì/}Å/}¾/}·/}°/}©/}¢/}›/}”/}/}†/}/}x/}q/}j/}c/}\/}U/}N/}G/}@/}9/}2/}+/}$/}/}/}/}/}/}ú.}ó.}ì.}å.}Þ.}×.}Ð.}É.}Â.}».}´.}­.}¦.}Ÿ.}˜.}‘.}Š.}ƒ.}|.}u.}n.}g.}`.}Y.}R.}K.}D.}=.}6.}/.}(.}!.}.}.} .}.}þ-}÷-}ð-}é-}â-}Û-}Ô-}Í-}Æ-}¿-}¸-}±-}ª-}£-}œ-}•-}Ž-}‡-}€-}y-}r-}k-}d-}]-}V-}O-}H-}A-}:-}3-},-}%-}-}-}-} -}-}û,}ô,}í,}æ,}ß,}Ø,}Ñ,}Ê,}Ã,}¼,}µ,}®,}§,} ,}™,}’,}‹,}„,}},}v,}o,}h,}a,}Z,}S,}L,}E,}>,}7,}0,}),}",},},} ,},}ÿ+}ø+}ñ+}ê+}ã+}Ü+}Õ+}Î+}Ç+}À+}¹+}²+}«+}¤+}+}–+}+}ˆ+}+}z+}s+}l+}e+}^+}W+}P+}I+}B+};+}4+}-+}&+}+}+}+} +}+}ü*}õ*}î*}ç*}à*}Ù*}Ò*}Ë*}Ä*}½*}¶*}¯*}¨*}¡*}š*}“*}Œ*}…*}~*}w*}p*}i*}b*}[*}T*}M*}F*}?*}8*}1*}**}#*}*}*}*}*}*}ù)}ò)}ë)}ä)}Ý)}Ö)}Ï)}È)}Á)}º)}³)}¬)}¥)}ž)}—)})}‰)}‚)}{)}t)}m)}f)}_)}X)}Q)}J)}C)}<)}5)}.)}')} )})})} )})}ý(}ö(}ï(}è(}á(}Ú(}Ó(}Ì(}Å(}¾(}·(}°(}©(}¢(}›(}”(}(}†(}(}x(}q(}j(}c(}\(}U(}N(}G(}@(}9(}2(}+(}$(}(}(}(}(}(}ú'}ó'}ì'}å'}Þ'}×'}Ð'}É'}Â'}»'}´'}­'}¦'}Ÿ'}˜'}‘'}Š'}ƒ'}|'}u'}n'}g'}`'}Y'}R'}K'}D'}='}6'}/'}('}!'}'}'} '}'}þ&}÷&}ð&}é&}â&}Û&}Ô&}Í&}Æ&}¿&}¸&}±&}ª&}£&}œ&}•&}Ž&}‡&}€&}y&}r&}k&}d&}]&}V&}O&}H&}A&}:&}3&},&}%&}&}&}&} &}&}û%}ô%}í%}æ%}ß%}Ø%}Ñ%}Ê%}Ã%}¼%}µ%}®%}§%} %}™%}’%}‹%}„%}}%}v%}o%}h%}a%}Z%}S%}L%}E%}>%}7%}0%})%}"%}%}%} %}%}ÿ$}ø$}ñ$}ê$}ã$}Ü$}Õ$}Î$}Ç$}À$}¹$}²$}«$}¤$}$}–$}$}ˆ$}$}z$}s$}l$}e$}^$}W$}P$}I$}B$};$}4$}-$}&$}$}$}$} $}$}ü#}õ#}î#}ç#}à#}Ù#}Ò#}Ë#}Ä#}½#}¶#}¯#}¨#}¡#}š#}“#}Œ#}…#}~#}w#}p#}i#}b#}[#}T#}M#}F#}?#}8#}1#}*#}##}#}#}#}#}#}ù"}ò"}ë"}ä"}Ý"}Ö"}Ï"}È"}Á"}º"}³"}¬"}¥"}ž"}—"}"}‰"}‚"}{"}t"}m"}f"}_"}X"}Q"}J"}C"}<"}5"}."}'"} "}"}"} "}"}ý!}ö!}ï!}è!}á!}Ú!}Ó!}Ì!}Å!}¾!}·!}°!}©!}¢!}›!}”!}!}†!}!}x!}q!}j!}c!}\!}U!}N!}G!}@!}9!}2!}+!}$!}!}!}!}!}!}ú }ó }ì }å }Þ }× }Ð }É } }» }´ }­ }¦ }Ÿ }˜ }‘ }Š }ƒ }| }u }n }g }` }Y }R }K }D }= }6 }/ }( }! } } } } }þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù }ò }ë }ä }Ý }Ö }Ï }È }Á }º }³ }¬ }¥ }ž }— } }‰ }‚ }{ }t }m }f }_ }X }Q }J }C }< }5 }. }' } } } } } }ý }ö }ï }è }á }Ú }Ó }Ì }Å }¾ }· }° }© }¢ }› }” } }† } }x }q }j }c }\ }U }N }G }@ }9 }2 }+ }$ } } } } } }ú }ó }ì }å }Þ }× }Ð }É } }» }´ }­ }¦ }Ÿ }˜ }‘ }Š }ƒ }| }u }n }g }` }Y }R }K }D }= }6 }/ }( }! } } } } }þ }÷ }ð }é }â }Û }Ô }Í }Æ }¿ }¸ }± }ª }£ }œ }• }Ž }‡ }€ }y }r }k }d }] }V }O }H }A }: }3 }, }% } } } } } }û }ô }í }æ }ß }Ø }Ñ }Ê }à }¼ }µ }® }§ }  }™ }’ }‹ }„ }} }v }o }h }a }Z }S }L }E }> }7 }0 }) }" } } } } }ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ùÿ|òÿ|ëÿ|äÿ|Ýÿ|Öÿ|Ïÿ|Èÿ|Áÿ|ºÿ|³ÿ|¬ÿ|¥ÿ|žÿ|—ÿ|ÿ|‰ÿ|‚ÿ|{ÿ|tÿ|mÿ|fÿ|_ÿ|Xÿ|Qÿ|Jÿ|Cÿ|<ÿ|5ÿ|.ÿ|'ÿ| ÿ|ÿ|ÿ| ÿ|ÿ|ýþ|öþ|ïþ|èþ|áþ|Úþ|Óþ|Ìþ|Åþ|¾þ|·þ|°þ|©þ|¢þ|›þ|”þ|þ|†þ|þ|xþ|qþ|jþ|cþ|\þ|Uþ|Nþ|Gþ|@þ|9þ|2þ|+þ|$þ|þ|þ|þ|þ|þ|úý|óý|ìý|åý|Þý|×ý|Ðý|Éý|Âý|»ý|´ý|­ý|¦ý|Ÿý|˜ý|‘ý|Šý|ƒý||ý|uý|ný|gý|`ý|Yý|Rý|Ký|Dý|=ý|6ý|/ý|(ý|!ý|ý|ý| ý|ý|þü|÷ü|ðü|éü|âü|Ûü|Ôü|Íü|Æü|¿ü|¸ü|±ü|ªü|£ü|œü|•ü|Žü|‡ü|€ü|yü|rü|kü|dü|]ü|Vü|Oü|Hü|Aü|:ü|3ü|,ü|%ü|ü|ü|ü| ü|ü|ûû|ôû|íû|æû|ßû|Øû|Ñû|Êû|Ãû|¼û|µû|®û|§û| û|™û|’û|‹û|„û|}û|vû|oû|hû|aû|Zû|Sû|Lû|Eû|>û|7û|0û|)û|"û|û|û| û|û|ÿú|øú|ñú|êú|ãú|Üú|Õú|Îú|Çú|Àú|¹ú|²ú|«ú|¤ú|ú|–ú|ú|ˆú|ú|zú|sú|lú|eú|^ú|Wú|Pú|Iú|Bú|;ú|4ú|-ú|&ú|ú|ú|ú| ú|ú|üù|õù|îù|çù|àù|Ùù|Òù|Ëù|Äù|½ù|¶ù|¯ù|¨ù|¡ù|šù|“ù|Œù|…ù|~ù|wù|pù|iù|bù|[ù|Tù|Mù|Fù|?ù|8ù|1ù|*ù|#ù|ù|ù|ù|ù|ù|ùø|òø|ëø|äø|Ýø|Öø|Ïø|Èø|Áø|ºø|³ø|¬ø|¥ø|žø|—ø|ø|‰ø|‚ø|{ø|tø|mø|fø|_ø|Xø|Qø|Jø|Cø|<ø|5ø|.ø|'ø| ø|ø|ø| ø|ø|ý÷|ö÷|ï÷|è÷|á÷|Ú÷|Ó÷|Ì÷|Å÷|¾÷|·÷|°÷|©÷|¢÷|›÷|”÷|÷|†÷|÷|x÷|q÷|j÷|c÷|\÷|U÷|N÷|G÷|@÷|9÷|2÷|+÷|$÷|÷|÷|÷|÷|÷|úö|óö|ìö|åö|Þö|×ö|Ðö|Éö|Âö|»ö|´ö|­ö|¦ö|Ÿö|˜ö|‘ö|Šö|ƒö||ö|uö|nö|gö|`ö|Yö|Rö|Kö|Dö|=ö|6ö|/ö|(ö|!ö|ö|ö| ö|ö|þõ|÷õ|ðõ|éõ|âõ|Ûõ|Ôõ|Íõ|Æõ|¿õ|¸õ|±õ|ªõ|£õ|œõ|•õ|Žõ|‡õ|€õ|yõ|rõ|kõ|dõ|]õ|Võ|Oõ|Hõ|Aõ|:õ|3õ|,õ|%õ|õ|õ|õ| õ|õ|ûô|ôô|íô|æô|ßô|Øô|Ñô|Êô|Ãô|¼ô|µô|®ô|§ô| ô|™ô|’ô|‹ô|„ô|}ô|vô|oô|hô|aô|Zô|Sô|Lô|Eô|>ô|7ô|0ô|)ô|"ô|ô|ô| ô|ô|ÿó|øó|ñó|êó|ãó|Üó|Õó|Îó|Çó|Àó|¹ó|²ó|«ó|¤ó|ó|–ó|ó|ˆó|ó|zó|só|ló|eó|^ó|Wó|Pó|Ió|Bó|;ó|4ó|-ó|&ó|ó|ó|ó| ó|ó|üò|õò|îò|çò|àò|Ùò|Òò|Ëò|Äò|½ò|¶ò|¯ò|¨ò|¡ò|šò|“ò|Œò|…ò|~ò|wò|pò|iò|bò|[ò|Tò|Mò|Fò|?ò|8ò|1ò|*ò|#ò|ò|ò|ò|ò|ò|ùñ|òñ|ëñ|äñ|Ýñ|Öñ|Ïñ|Èñ|Áñ|ºñ|³ñ|¬ñ|¥ñ|žñ|—ñ|ñ|‰ñ|‚ñ|{ñ|tñ|mñ|fñ|_ñ|Xñ|Qñ|Jñ|Cñ|<ñ|5ñ|.ñ|'ñ| ñ|ñ|ñ| ñ|ñ|ýð|öð|ïð|èð|áð|Úð|Óð|Ìð|Åð|¾ð|·ð|°ð|©ð|¢ð|›ð|”ð|ð|†ð|ð|xð|qð|jð|cð|\ð|Uð|Nð|Gð|@ð|9ð|2ð|+ð|$ð|ð|ð|ð|ð|ð|úï|óï|ìï|åï|Þï|×ï|Ðï|Éï|Âï|»ï|´ï|­ï|¦ï|Ÿï|˜ï|‘ï|Šï|ƒï||ï|uï|nï|gï|`ï|Yï|Rï|Kï|Dï|=ï|6ï|/ï|(ï|!ï|ï|ï| ï|ï|þî|÷î|ðî|éî|âî|Ûî|Ôî|Íî|Æî|¿î|¸î|±î|ªî|£î|œî|•î|Žî|‡î|€î|yî|rî|kî|dî|]î|Vî|Oî|Hî|Aî|:î|3î|,î|%î|î|î|î| î|î|ûí|ôí|íí|æí|ßí|Øí|Ñí|Êí|Ãí|¼í|µí|®í|§í| í|™í|’í|‹í|„í|}í|ví|oí|hí|aí|Zí|Sí|Lí|Eí|>í|7í|0í|)í|"í|í|í| í|í|ÿì|øì|ñì|êì|ãì|Üì|Õì|Îì|Çì|Àì|¹ì|²ì|«ì|¤ì|ì|–ì|ì|ˆì|ì|zì|sì|lì|eì|^ì|Wì|Pì|Iì|Bì|;ì|4ì|-ì|&ì|ì|ì|ì| ì|ì|üë|õë|îë|çë|àë|Ùë|Òë|Ëë|Äë|½ë|¶ë|¯ë|¨ë|¡ë|šë|“ë|Œë|…ë|~ë|wë|pë|ië|bë|[ë|Të|Më|Fë|?ë|8ë|1ë|*ë|#ë|ë|ë|ë|ë|ë|ùê|òê|ëê|äê|Ýê|Öê|Ïê|Èê|Áê|ºê|³ê|¬ê|¥ê|žê|—ê|ê|‰ê|‚ê|{ê|tê|mê|fê|_ê|Xê|Qê|Jê|Cê|<ê|5ê|.ê|'ê| ê|ê|ê| ê|ê|ýé|öé|ïé|èé|áé|Úé|Óé|Ìé|Åé|¾é|·é|°é|©é|¢é|›é|”é|é|†é|é|xé|qé|jé|cé|\é|Ué|Né|Gé|@é|9é|2é|+é|$é|é|é|é|é|é|úè|óè|ìè|åè|Þè|×è|Ðè|Éè|Âè|»è|´è|­è|¦è|Ÿè|˜è|‘è|Šè|ƒè||è|uè|nè|gè|`è|Yè|Rè|Kè|Dè|=è|6è|/è|(è|!è|è|è| è|è|þç|÷ç|ðç|éç|âç|Ûç|Ôç|Íç|Æç|¿ç|¸ç|±ç|ªç|£ç|œç|•ç|Žç|‡ç|€ç|yç|rç|kç|dç|]ç|Vç|Oç|Hç|Aç|:ç|3ç|,ç|%ç|ç|ç|ç| ç|ç|ûæ|ôæ|íæ|ææ|ßæ|Øæ|Ñæ|Êæ|Ãæ|¼æ|µæ|®æ|§æ| æ|™æ|’æ|‹æ|„æ|}æ|væ|oæ|hæ|aæ|Zæ|Sæ|Læ|Eæ|>æ|7æ|0æ|)æ|"æ|æ|æ| æ|æ|ÿå|øå|ñå|êå|ãå|Üå|Õå|Îå|Çå|Àå|¹å|²å|«å|¤å|å|–å|å|ˆå|å|zå|så|lå|eå|^å|Wå|På|Iå|Bå|;å|4å|-å|&å|å|å|å| å|å|üä|õä|îä|çä|àä|Ùä|Òä|Ëä|Ää|½ä|¶ä|¯ä|¨ä|¡ä|šä|“ä|Œä|…ä|~ä|wä|pä|iä|bä|[ä|Tä|Mä|Fä|?ä|8ä|1ä|*ä|#ä|ä|ä|ä|ä|ä|ùã|òã|ëã|äã|Ýã|Öã|Ïã|Èã|Áã|ºã|³ã|¬ã|¥ã|žã|—ã|ã|‰ã|‚ã|{ã|tã|mã|fã|_ã|Xã|Qã|Jã|Cã|<ã|5ã|.ã|'ã| ã|ã|ã| ã|ã|ýâ|öâ|ïâ|èâ|áâ|Úâ|Óâ|Ìâ|Åâ|¾â|·â|°â|©â|¢â|›â|”â|â|†â|â|xâ|qâ|jâ|câ|\â|Uâ|Nâ|Gâ|@â|9â|2â|+â|$â|â|â|â|â|â|úá|óá|ìá|åá|Þá|×á|Ðá|Éá|Âá|»á|´á|­á|¦á|Ÿá|˜á|‘á|Šá|ƒá||á|uá|ná|gá|`á|Yá|Rá|Ká|Dá|=á|6á|/á|(á|!á|á|á| á|á|þà|÷à|ðà|éà|âà|Ûà|Ôà|Íà|Æà|¿à|¸à|±à|ªà|£à|œà|•à|Žà|‡à|€à|yà|rà|kà|dà|]à|Và|Oà|Hà|Aà|:à|3à|,à|%à|à|à|à| à|à|ûß|ôß|íß|æß|ßß|Øß|Ñß|Êß|Ãß|¼ß|µß|®ß|§ß| ß|™ß|’ß|‹ß|„ß|}ß|vß|oß|hß|aß|Zß|Sß|Lß|Eß|>ß|7ß|0ß|)ß|"ß|ß|ß| ß|ß|ÿÞ|øÞ|ñÞ|êÞ|ãÞ|ÜÞ|ÕÞ|ÎÞ|ÇÞ|ÀÞ|¹Þ|²Þ|«Þ|¤Þ|Þ|–Þ|Þ|ˆÞ|Þ|zÞ|sÞ|lÞ|eÞ|^Þ|WÞ|PÞ|IÞ|BÞ|;Þ|4Þ|-Þ|&Þ|Þ|Þ|Þ| Þ|Þ|üÝ|õÝ|îÝ|çÝ|àÝ|ÙÝ|ÒÝ|ËÝ|ÄÝ|½Ý|¶Ý|¯Ý|¨Ý|¡Ý|šÝ|“Ý|ŒÝ|…Ý|~Ý|wÝ|pÝ|iÝ|bÝ|[Ý|TÝ|MÝ|FÝ|?Ý|8Ý|1Ý|*Ý|#Ý|Ý|Ý|Ý|Ý|Ý|ùÜ|òÜ|ëÜ|äÜ|ÝÜ|ÖÜ|ÏÜ|ÈÜ|ÁÜ|ºÜ|³Ü|¬Ü|¥Ü|žÜ|—Ü|Ü|‰Ü|‚Ü|{Ü|tÜ|mÜ|fÜ|_Ü|XÜ|QÜ|JÜ|CÜ|<Ü|5Ü|.Ü|'Ü| Ü|Ü|Ü| Ü|Ü|ýÛ|öÛ|ïÛ|èÛ|áÛ|ÚÛ|ÓÛ|ÌÛ|ÅÛ|¾Û|·Û|°Û|©Û|¢Û|›Û|”Û|Û|†Û|Û|xÛ|qÛ|jÛ|cÛ|\Û|UÛ|NÛ|GÛ|@Û|9Û|2Û|+Û|$Û|Û|Û|Û|Û|Û|úÚ|óÚ|ìÚ|åÚ|ÞÚ|×Ú|ÐÚ|ÉÚ|ÂÚ|»Ú|´Ú|­Ú|¦Ú|ŸÚ|˜Ú|‘Ú|ŠÚ|ƒÚ||Ú|uÚ|nÚ|gÚ|`Ú|YÚ|RÚ|KÚ|DÚ|=Ú|6Ú|/Ú|(Ú|!Ú|Ú|Ú| Ú|Ú|þÙ|÷Ù|ðÙ|éÙ|âÙ|ÛÙ|ÔÙ|ÍÙ|ÆÙ|¿Ù|¸Ù|±Ù|ªÙ|£Ù|œÙ|•Ù|ŽÙ|‡Ù|€Ù|yÙ|rÙ|kÙ|dÙ|]Ù|VÙ|OÙ|HÙ|AÙ|:Ù|3Ù|,Ù|%Ù|Ù|Ù|Ù| Ù|Ù|ûØ|ôØ|íØ|æØ|ߨ|ØØ|ÑØ|ÊØ|ÃØ|¼Ø|µØ|®Ø|§Ø| Ø|™Ø|’Ø|‹Ø|„Ø|}Ø|vØ|oØ|hØ|aØ|ZØ|SØ|LØ|EØ|>Ø|7Ø|0Ø|)Ø|"Ø|Ø|Ø| Ø|Ø|ÿ×|ø×|ñ×|ê×|ã×|Ü×|Õ×|Î×|Ç×|À×|¹×|²×|«×|¤×|×|–×|×|ˆ×|×|z×|s×|l×|e×|^×|W×|P×|I×|B×|;×|4×|-×|&×|×|×|×| ×|×|üÖ|õÖ|îÖ|çÖ|àÖ|ÙÖ|ÒÖ|ËÖ|ÄÖ|½Ö|¶Ö|¯Ö|¨Ö|¡Ö|šÖ|“Ö|ŒÖ|…Ö|~Ö|wÖ|pÖ|iÖ|bÖ|[Ö|TÖ|MÖ|FÖ|?Ö|8Ö|1Ö|*Ö|#Ö|Ö|Ö|Ö|Ö|Ö|ùÕ|òÕ|ëÕ|äÕ|ÝÕ|ÖÕ|ÏÕ|ÈÕ|ÁÕ|ºÕ|³Õ|¬Õ|¥Õ|žÕ|—Õ|Õ|‰Õ|‚Õ|{Õ|tÕ|mÕ|fÕ|_Õ|XÕ|QÕ|JÕ|CÕ|<Õ|5Õ|.Õ|'Õ| Õ|Õ|Õ| Õ|Õ|ýÔ|öÔ|ïÔ|èÔ|áÔ|ÚÔ|ÓÔ|ÌÔ|ÅÔ|¾Ô|·Ô|°Ô|©Ô|¢Ô|›Ô|”Ô|Ô|†Ô|Ô|xÔ|qÔ|jÔ|cÔ|\Ô|UÔ|NÔ|GÔ|@Ô|9Ô|2Ô|+Ô|$Ô|Ô|Ô|Ô|Ô|Ô|úÓ|óÓ|ìÓ|åÓ|ÞÓ|×Ó|ÐÓ|ÉÓ|ÂÓ|»Ó|´Ó|­Ó|¦Ó|ŸÓ|˜Ó|‘Ó|ŠÓ|ƒÓ||Ó|uÓ|nÓ|gÓ|`Ó|YÓ|RÓ|KÓ|DÓ|=Ó|6Ó|/Ó|(Ó|!Ó|Ó|Ó| Ó|Ó|þÒ|÷Ò|ðÒ|éÒ|âÒ|ÛÒ|ÔÒ|ÍÒ|ÆÒ|¿Ò|¸Ò|±Ò|ªÒ|£Ò|œÒ|•Ò|ŽÒ|‡Ò|€Ò|yÒ|rÒ|kÒ|dÒ|]Ò|VÒ|OÒ|HÒ|AÒ|:Ò|3Ò|,Ò|%Ò|Ò|Ò|Ò| Ò|Ò|ûÑ|ôÑ|íÑ|æÑ|ßÑ|ØÑ|ÑÑ|ÊÑ|ÃÑ|¼Ñ|µÑ|®Ñ|§Ñ| Ñ|™Ñ|’Ñ|‹Ñ|„Ñ|}Ñ|vÑ|oÑ|hÑ|aÑ|ZÑ|SÑ|LÑ|EÑ|>Ñ|7Ñ|0Ñ|)Ñ|"Ñ|Ñ|Ñ| Ñ|Ñ|ÿÐ|øÐ|ñÐ|êÐ|ãÐ|ÜÐ|ÕÐ|ÎÐ|ÇÐ|ÀÐ|¹Ð|²Ð|«Ð|¤Ð|Ð|–Ð|Ð|ˆÐ|Ð|zÐ|sÐ|lÐ|eÐ|^Ð|WÐ|PÐ|IÐ|BÐ|;Ð|4Ð|-Ð|&Ð|Ð|Ð|Ð| Ð|Ð|üÏ|õÏ|îÏ|çÏ|àÏ|ÙÏ|ÒÏ|ËÏ|ÄÏ|½Ï|¶Ï|¯Ï|¨Ï|¡Ï|šÏ|“Ï|ŒÏ|…Ï|~Ï|wÏ|pÏ|iÏ|bÏ|[Ï|TÏ|MÏ|FÏ|?Ï|8Ï|1Ï|*Ï|#Ï|Ï|Ï|Ï|Ï|Ï|ùÎ|òÎ|ëÎ|äÎ|ÝÎ|ÖÎ|ÏÎ|ÈÎ|ÁÎ|ºÎ|³Î|¬Î|¥Î|žÎ|—Î|Î|‰Î|‚Î|{Î|tÎ|mÎ|fÎ|_Î|XÎ|QÎ|JÎ|CÎ|<Î|5Î|.Î|'Î| Î|Î|Î| Î|Î|ýÍ|öÍ|ïÍ|èÍ|áÍ|ÚÍ|ÓÍ|ÌÍ|ÅÍ|¾Í|·Í|°Í|©Í|¢Í|›Í|”Í|Í|†Í|Í|xÍ|qÍ|jÍ|cÍ|\Í|UÍ|NÍ|GÍ|@Í|9Í|2Í|+Í|$Í|Í|Í|Í|Í|Í|úÌ|óÌ|ìÌ|åÌ|ÞÌ|×Ì|ÐÌ|ÉÌ|ÂÌ|»Ì|´Ì|­Ì|¦Ì|ŸÌ|˜Ì|‘Ì|ŠÌ|ƒÌ||Ì|uÌ|nÌ|gÌ|`Ì|YÌ|RÌ|KÌ|DÌ|=Ì|6Ì|/Ì|(Ì|!Ì|Ì|Ì| Ì|Ì|þË|÷Ë|ðË|éË|âË|ÛË|ÔË|ÍË|ÆË|¿Ë|¸Ë|±Ë|ªË|£Ë|œË|•Ë|ŽË|‡Ë|€Ë|yË|rË|kË|dË|]Ë|VË|OË|HË|AË|:Ë|3Ë|,Ë|%Ë|Ë|Ë|Ë| Ë|Ë|ûÊ|ôÊ|íÊ|æÊ|ßÊ|ØÊ|ÑÊ|ÊÊ|ÃÊ|¼Ê|µÊ|®Ê|§Ê| Ê|™Ê|’Ê|‹Ê|„Ê|}Ê|vÊ|oÊ|hÊ|aÊ|ZÊ|SÊ|LÊ|EÊ|>Ê|7Ê|0Ê|)Ê|"Ê|Ê|Ê| Ê|Ê|ÿÉ|øÉ|ñÉ|êÉ|ãÉ|ÜÉ|ÕÉ|ÎÉ|ÇÉ|ÀÉ|¹É|²É|«É|¤É|É|–É|É|ˆÉ|É|zÉ|sÉ|lÉ|eÉ|^É|WÉ|PÉ|IÉ|BÉ|;É|4É|-É|&É|É|É|É| É|É|üÈ|õÈ|îÈ|çÈ|àÈ|ÙÈ|ÒÈ|ËÈ|ÄÈ|½È|¶È|¯È|¨È|¡È|šÈ|“È|ŒÈ|…È|~È|wÈ|pÈ|iÈ|bÈ|[È|TÈ|MÈ|FÈ|?È|8È|1È|*È|#È|È|È|È|È|È|ùÇ|òÇ|ëÇ|äÇ|ÝÇ|ÖÇ|ÏÇ|ÈÇ|ÁÇ|ºÇ|³Ç|¬Ç|¥Ç|žÇ|—Ç|Ç|‰Ç|‚Ç|{Ç|tÇ|mÇ|fÇ|_Ç|XÇ|QÇ|JÇ|CÇ|<Ç|5Ç|.Ç|'Ç| Ç|Ç|Ç| Ç|Ç|ýÆ|öÆ|ïÆ|èÆ|áÆ|ÚÆ|ÓÆ|ÌÆ|ÅÆ|¾Æ|·Æ|°Æ|©Æ|¢Æ|›Æ|”Æ|Æ|†Æ|Æ|xÆ|qÆ|jÆ|cÆ|\Æ|UÆ|NÆ|GÆ|@Æ|9Æ|2Æ|+Æ|$Æ|Æ|Æ|Æ|Æ|Æ|úÅ|óÅ|ìÅ|åÅ|ÞÅ|×Å|ÐÅ|ÉÅ|ÂÅ|»Å|´Å|­Å|¦Å|ŸÅ|˜Å|‘Å|ŠÅ|ƒÅ||Å|uÅ|nÅ|gÅ|`Å|YÅ|RÅ|KÅ|DÅ|=Å|6Å|/Å|(Å|!Å|Å|Å| Å|Å|þÄ|÷Ä|ðÄ|éÄ|âÄ|ÛÄ|ÔÄ|ÍÄ|ÆÄ|¿Ä|¸Ä|±Ä|ªÄ|£Ä|œÄ|•Ä|ŽÄ|‡Ä|€Ä|yÄ|rÄ|kÄ|dÄ|]Ä|VÄ|OÄ|HÄ|AÄ|:Ä|3Ä|,Ä|%Ä|Ä|Ä|Ä| Ä|Ä|ûÃ|ôÃ|íÃ|æÃ|ßÃ|ØÃ|ÑÃ|ÊÃ|ÃÃ|¼Ã|µÃ|®Ã|§Ã| Ã|™Ã|’Ã|‹Ã|„Ã|}Ã|vÃ|oÃ|hÃ|aÃ|ZÃ|SÃ|LÃ|EÃ|>Ã|7Ã|0Ã|)Ã|"Ã|Ã|Ã| Ã|Ã|ÿÂ|øÂ|ñÂ|êÂ|ãÂ|ÜÂ|ÕÂ|ÎÂ|ÇÂ|ÀÂ|¹Â|²Â|«Â|¤Â|Â|–Â|Â|ˆÂ|Â|zÂ|sÂ|lÂ|eÂ|^Â|WÂ|PÂ|IÂ|BÂ|;Â|4Â|-Â|&Â|Â|Â|Â| Â|Â|üÁ|õÁ|îÁ|çÁ|àÁ|ÙÁ|ÒÁ|ËÁ|ÄÁ|½Á|¶Á|¯Á|¨Á|¡Á|šÁ|“Á|ŒÁ|…Á|~Á|wÁ|pÁ|iÁ|bÁ|[Á|TÁ|MÁ|FÁ|?Á|8Á|1Á|*Á|#Á|Á|Á|Á|Á|Á|ùÀ|òÀ|ëÀ|äÀ|ÝÀ|ÖÀ|ÏÀ|ÈÀ|ÁÀ|ºÀ|³À|¬À|¥À|žÀ|—À|À|‰À|‚À|{À|tÀ|mÀ|fÀ|_À|XÀ|QÀ|JÀ|CÀ|<À|5À|.À|'À| À|À|À| À|À|ý¿|ö¿|ï¿|è¿|á¿|Ú¿|Ó¿|Ì¿|Å¿|¾¿|·¿|°¿|©¿|¢¿|›¿|”¿|¿|†¿|¿|x¿|q¿|j¿|c¿|\¿|U¿|N¿|G¿|@¿|9¿|2¿|+¿|$¿|¿|¿|¿|¿|¿|ú¾|ó¾|ì¾|å¾|Þ¾|×¾|о|ɾ|¾|»¾|´¾|­¾|¦¾|Ÿ¾|˜¾|‘¾|о|ƒ¾||¾|u¾|n¾|g¾|`¾|Y¾|R¾|K¾|D¾|=¾|6¾|/¾|(¾|!¾|¾|¾| ¾|¾|þ½|÷½|ð½|é½|â½|Û½|Ô½|ͽ|ƽ|¿½|¸½|±½|ª½|£½|œ½|•½|޽|‡½|€½|y½|r½|k½|d½|]½|V½|O½|H½|A½|:½|3½|,½|%½|½|½|½| ½|½|û¼|ô¼|í¼|æ¼|ß¼|ؼ|Ѽ|ʼ|ü|¼¼|µ¼|®¼|§¼| ¼|™¼|’¼|‹¼|„¼|}¼|v¼|o¼|h¼|a¼|Z¼|S¼|L¼|E¼|>¼|7¼|0¼|)¼|"¼|¼|¼| ¼|¼|ÿ»|ø»|ñ»|ê»|ã»|Ü»|Õ»|λ|Ç»|À»|¹»|²»|«»|¤»|»|–»|»|ˆ»|»|z»|s»|l»|e»|^»|W»|P»|I»|B»|;»|4»|-»|&»|»|»|»| »|»|üº|õº|îº|çº|àº|Ùº|Òº|˺|ĺ|½º|¶º|¯º|¨º|¡º|šº|“º|Œº|…º|~º|wº|pº|iº|bº|[º|Tº|Mº|Fº|?º|8º|1º|*º|#º|º|º|º|º|º|ù¹|ò¹|ë¹|ä¹|ݹ|Ö¹|Ϲ|ȹ|Á¹|º¹|³¹|¬¹|¥¹|ž¹|—¹|¹|‰¹|‚¹|{¹|t¹|m¹|f¹|_¹|X¹|Q¹|J¹|C¹|<¹|5¹|.¹|'¹| ¹|¹|¹| ¹|¹|ý¸|ö¸|ï¸|è¸|á¸|Ú¸|Ó¸|̸|Ÿ|¾¸|·¸|°¸|©¸|¢¸|›¸|”¸|¸|†¸|¸|x¸|q¸|j¸|c¸|\¸|U¸|N¸|G¸|@¸|9¸|2¸|+¸|$¸|¸|¸|¸|¸|¸|ú·|ó·|ì·|å·|Þ·|×·|з|É·|·|»·|´·|­·|¦·|Ÿ·|˜·|‘·|Š·|ƒ·||·|u·|n·|g·|`·|Y·|R·|K·|D·|=·|6·|/·|(·|!·|·|·| ·|·|þ¶|÷¶|ð¶|é¶|â¶|Û¶|Ô¶|Ͷ|ƶ|¿¶|¸¶|±¶|ª¶|£¶|œ¶|•¶|޶|‡¶|€¶|y¶|r¶|k¶|d¶|]¶|V¶|O¶|H¶|A¶|:¶|3¶|,¶|%¶|¶|¶|¶| ¶|¶|ûµ|ôµ|íµ|æµ|ßµ|ص|ѵ|ʵ|õ|¼µ|µµ|®µ|§µ| µ|™µ|’µ|‹µ|„µ|}µ|vµ|oµ|hµ|aµ|Zµ|Sµ|Lµ|Eµ|>µ|7µ|0µ|)µ|"µ|µ|µ| µ|µ|ÿ´|ø´|ñ´|ê´|ã´|Ü´|Õ´|δ|Ç´|À´|¹´|²´|«´|¤´|´|–´|´|ˆ´|´|z´|s´|l´|e´|^´|W´|P´|I´|B´|;´|4´|-´|&´|´|´|´| ´|´|ü³|õ³|î³|ç³|à³|Ù³|Ò³|˳|ij|½³|¶³|¯³|¨³|¡³|š³|“³|Œ³|…³|~³|w³|p³|i³|b³|[³|T³|M³|F³|?³|8³|1³|*³|#³|³|³|³|³|³|ù²|ò²|ë²|ä²|ݲ|Ö²|ϲ|Ȳ|Á²|º²|³²|¬²|¥²|ž²|—²|²|‰²|‚²|{²|t²|m²|f²|_²|X²|Q²|J²|C²|<²|5²|.²|'²| ²|²|²| ²|²|ý±|ö±|ï±|è±|á±|Ú±|Ó±|̱|ű|¾±|·±|°±|©±|¢±|›±|”±|±|†±|±|x±|q±|j±|c±|\±|U±|N±|G±|@±|9±|2±|+±|$±|±|±|±|±|±|ú°|ó°|ì°|å°|Þ°|×°|а|ɰ|°|»°|´°|­°|¦°|Ÿ°|˜°|‘°|а|ƒ°||°|u°|n°|g°|`°|Y°|R°|K°|D°|=°|6°|/°|(°|!°|°|°| °|°|þ¯|÷¯|ð¯|é¯|â¯|Û¯|Ô¯|ͯ|Ư|¿¯|¸¯|±¯|ª¯|£¯|œ¯|•¯|ޝ|‡¯|€¯|y¯|r¯|k¯|d¯|]¯|V¯|O¯|H¯|A¯|:¯|3¯|,¯|%¯|¯|¯|¯| ¯|¯|û®|ô®|í®|æ®|ß®|Ø®|Ñ®|Ê®|î|¼®|µ®|®®|§®| ®|™®|’®|‹®|„®|}®|v®|o®|h®|a®|Z®|S®|L®|E®|>®|7®|0®|)®|"®|®|®| ®|®|ÿ­|ø­|ñ­|ê­|ã­|Ü­|Õ­|έ|Ç­|À­|¹­|²­|«­|¤­|­|–­|­|ˆ­|­|z­|s­|l­|e­|^­|W­|P­|I­|B­|;­|4­|-­|&­|­|­|­| ­|­|ü¬|õ¬|î¬|ç¬|à¬|Ù¬|Ò¬|ˬ|Ĭ|½¬|¶¬|¯¬|¨¬|¡¬|š¬|“¬|Œ¬|…¬|~¬|w¬|p¬|i¬|b¬|[¬|T¬|M¬|F¬|?¬|8¬|1¬|*¬|#¬|¬|¬|¬|¬|¬|ù«|ò«|ë«|ä«|Ý«|Ö«|Ï«|È«|Á«|º«|³«|¬«|¥«|ž«|—«|«|‰«|‚«|{«|t«|m«|f«|_«|X«|Q«|J«|C«|<«|5«|.«|'«| «|«|«| «|«|ýª|öª|ïª|èª|áª|Úª|Óª|̪|Ū|¾ª|·ª|°ª|©ª|¢ª|›ª|”ª|ª|†ª|ª|xª|qª|jª|cª|\ª|Uª|Nª|Gª|@ª|9ª|2ª|+ª|$ª|ª|ª|ª|ª|ª|ú©|ó©|ì©|å©|Þ©|ש|Щ|É©|©|»©|´©|­©|¦©|Ÿ©|˜©|‘©|Š©|ƒ©||©|u©|n©|g©|`©|Y©|R©|K©|D©|=©|6©|/©|(©|!©|©|©| ©|©|þ¨|÷¨|ð¨|é¨|â¨|Û¨|Ô¨|ͨ|ƨ|¿¨|¸¨|±¨|ª¨|£¨|œ¨|•¨|ލ|‡¨|€¨|y¨|r¨|k¨|d¨|]¨|V¨|O¨|H¨|A¨|:¨|3¨|,¨|%¨|¨|¨|¨| ¨|¨|û§|ô§|í§|æ§|ß§|ا|ѧ|ʧ|ç|¼§|µ§|®§|§§| §|™§|’§|‹§|„§|}§|v§|o§|h§|a§|Z§|S§|L§|E§|>§|7§|0§|)§|"§|§|§| §|§|ÿ¦|ø¦|ñ¦|ê¦|ã¦|ܦ|Õ¦|Φ|Ǧ|À¦|¹¦|²¦|«¦|¤¦|¦|–¦|¦|ˆ¦|¦|z¦|s¦|l¦|e¦|^¦|W¦|P¦|I¦|B¦|;¦|4¦|-¦|&¦|¦|¦|¦| ¦|¦|ü¥|õ¥|î¥|ç¥|à¥|Ù¥|Ò¥|Ë¥|Ä¥|½¥|¶¥|¯¥|¨¥|¡¥|š¥|“¥|Œ¥|…¥|~¥|w¥|p¥|i¥|b¥|[¥|T¥|M¥|F¥|?¥|8¥|1¥|*¥|#¥|¥|¥|¥|¥|¥|ù¤|ò¤|ë¤|ä¤|ݤ|Ö¤|Ϥ|Ȥ|Á¤|º¤|³¤|¬¤|¥¤|ž¤|—¤|¤|‰¤|‚¤|{¤|t¤|m¤|f¤|_¤|X¤|Q¤|J¤|C¤|<¤|5¤|.¤|'¤| ¤|¤|¤| ¤|¤|ý£|ö£|ï£|è£|á£|Ú£|Ó£|Ì£|Å£|¾£|·£|°£|©£|¢£|›£|”£|£|†£|£|x£|q£|j£|c£|\£|U£|N£|G£|@£|9£|2£|+£|$£|£|£|£|£|£|ú¢|ó¢|ì¢|å¢|Þ¢|×¢|Т|É¢|¢|»¢|´¢|­¢|¦¢|Ÿ¢|˜¢|‘¢|Š¢|ƒ¢||¢|u¢|n¢|g¢|`¢|Y¢|R¢|K¢|D¢|=¢|6¢|/¢|(¢|!¢|¢|¢| ¢|¢|þ¡|÷¡|ð¡|é¡|â¡|Û¡|Ô¡|Í¡|Æ¡|¿¡|¸¡|±¡|ª¡|£¡|œ¡|•¡|Ž¡|‡¡|€¡|y¡|r¡|k¡|d¡|]¡|V¡|O¡|H¡|A¡|:¡|3¡|,¡|%¡|¡|¡|¡| ¡|¡|û |ô |í |æ |ß |Ø |Ñ |Ê |à|¼ |µ |® |§ |  |™ |’ |‹ |„ |} |v |o |h |a |Z |S |L |E |> |7 |0 |) |" | | |  | |ÿŸ|øŸ|ñŸ|êŸ|ãŸ|ÜŸ|ÕŸ|Ο|ÇŸ|ÀŸ|¹Ÿ|²Ÿ|«Ÿ|¤Ÿ|Ÿ|–Ÿ|Ÿ|ˆŸ|Ÿ|zŸ|sŸ|lŸ|eŸ|^Ÿ|WŸ|PŸ|IŸ|BŸ|;Ÿ|4Ÿ|-Ÿ|&Ÿ|Ÿ|Ÿ|Ÿ| Ÿ|Ÿ|üž|õž|îž|çž|àž|Ùž|Òž|Ëž|Äž|½ž|¶ž|¯ž|¨ž|¡ž|šž|“ž|Œž|…ž|~ž|wž|pž|iž|bž|[ž|Tž|Mž|Fž|?ž|8ž|1ž|*ž|#ž|ž|ž|ž|ž|ž|ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ýœ|öœ|ïœ|èœ|áœ|Úœ|Óœ|Ìœ|Åœ|¾œ|·œ|°œ|©œ|¢œ|›œ|”œ|œ|†œ|œ|xœ|qœ|jœ|cœ|\œ|Uœ|Nœ|Gœ|@œ|9œ|2œ|+œ|$œ|œ|œ|œ|œ|œ|ú›|ó›|ì›|å›|Þ›|×›|Л|É›|›|»›|´›|­›|¦›|Ÿ›|˜›|‘›|Š›|ƒ›||›|u›|n›|g›|`›|Y›|R›|K›|D›|=›|6›|/›|(›|!›|›|›| ›|›|þš|÷š|ðš|éš|âš|Ûš|Ôš|Íš|Æš|¿š|¸š|±š|ªš|£š|œš|•š|Žš|‡š|€š|yš|rš|kš|dš|]š|Vš|Oš|Hš|Aš|:š|3š|,š|%š|š|š|š| š|š|û™|ô™|í™|æ™|ß™|Ø™|Ñ™|Ê™|Ù|¼™|µ™|®™|§™| ™|™™|’™|‹™|„™|}™|v™|o™|h™|a™|Z™|S™|L™|E™|>™|7™|0™|)™|"™|™|™| ™|™|ÿ˜|ø˜|ñ˜|ê˜|ã˜|ܘ|Õ˜|Θ|ǘ|À˜|¹˜|²˜|«˜|¤˜|˜|–˜|˜|ˆ˜|˜|z˜|s˜|l˜|e˜|^˜|W˜|P˜|I˜|B˜|;˜|4˜|-˜|&˜|˜|˜|˜| ˜|˜|ü—|õ—|î—|ç—|à—|Ù—|Ò—|Ë—|Ä—|½—|¶—|¯—|¨—|¡—|š—|“—|Œ—|…—|~—|w—|p—|i—|b—|[—|T—|M—|F—|?—|8—|1—|*—|#—|—|—|—|—|—|ù–|ò–|ë–|ä–|Ý–|Ö–|Ï–|È–|Á–|º–|³–|¬–|¥–|ž–|—–|–|‰–|‚–|{–|t–|m–|f–|_–|X–|Q–|J–|C–|<–|5–|.–|'–| –|–|–| –|–|ý•|ö•|ï•|è•|á•|Ú•|Ó•|Ì•|Å•|¾•|·•|°•|©•|¢•|›•|”•|•|†•|•|x•|q•|j•|c•|\•|U•|N•|G•|@•|9•|2•|+•|$•|•|•|•|•|•|ú”|ó”|ì”|å”|Þ”|×”|Д|É”|”|»”|´”|­”|¦”|Ÿ”|˜”|‘”|Š”|ƒ”||”|u”|n”|g”|`”|Y”|R”|K”|D”|=”|6”|/”|(”|!”|”|”| ”|”|þ“|÷“|ð“|é“|â“|Û“|Ô“|Í“|Æ“|¿“|¸“|±“|ª“|£“|œ“|•“|Ž“|‡“|€“|y“|r“|k“|d“|]“|V“|O“|H“|A“|:“|3“|,“|%“|“|“|“| “|“|û’|ô’|í’|æ’|ß’|Ø’|Ñ’|Ê’|Ã’|¼’|µ’|®’|§’| ’|™’|’’|‹’|„’|}’|v’|o’|h’|a’|Z’|S’|L’|E’|>’|7’|0’|)’|"’|’|’| ’|’|ÿ‘|ø‘|ñ‘|ê‘|ã‘|Ü‘|Õ‘|Α|Ç‘|À‘|¹‘|²‘|«‘|¤‘|‘|–‘|‘|ˆ‘|‘|z‘|s‘|l‘|e‘|^‘|W‘|P‘|I‘|B‘|;‘|4‘|-‘|&‘|‘|‘|‘| ‘|‘|ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ýŽ|öŽ|ïŽ|èŽ|áŽ|ÚŽ|ÓŽ|ÌŽ|ÅŽ|¾Ž|·Ž|°Ž|©Ž|¢Ž|›Ž|”Ž|Ž|†Ž|Ž|xŽ|qŽ|jŽ|cŽ|\Ž|UŽ|NŽ|GŽ|@Ž|9Ž|2Ž|+Ž|$Ž|Ž|Ž|Ž|Ž|Ž|ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þŒ|÷Œ|ðŒ|éŒ|âŒ|ÛŒ|ÔŒ|ÍŒ|ÆŒ|¿Œ|¸Œ|±Œ|ªŒ|£Œ|œŒ|•Œ|ŽŒ|‡Œ|€Œ|yŒ|rŒ|kŒ|dŒ|]Œ|VŒ|OŒ|HŒ|AŒ|:Œ|3Œ|,Œ|%Œ|Œ|Œ|Œ| Œ|Œ|û‹|ô‹|í‹|æ‹|ß‹|Ø‹|Ñ‹|Ê‹|Ë|¼‹|µ‹|®‹|§‹| ‹|™‹|’‹|‹‹|„‹|}‹|v‹|o‹|h‹|a‹|Z‹|S‹|L‹|E‹|>‹|7‹|0‹|)‹|"‹|‹|‹| ‹|‹|ÿŠ|øŠ|ñŠ|êŠ|ãŠ|ÜŠ|ÕŠ|Ί|ÇŠ|ÀŠ|¹Š|²Š|«Š|¤Š|Š|–Š|Š|ˆŠ|Š|zŠ|sŠ|lŠ|eŠ|^Š|WŠ|PŠ|IŠ|BŠ|;Š|4Š|-Š|&Š|Š|Š|Š| Š|Š|ü‰|õ‰|î‰|ç‰|à‰|Ù‰|Ò‰|ˉ|ĉ|½‰|¶‰|¯‰|¨‰|¡‰|š‰|“‰|Œ‰|…‰|~‰|w‰|p‰|i‰|b‰|[‰|T‰|M‰|F‰|?‰|8‰|1‰|*‰|#‰|‰|‰|‰|‰|‰|ùˆ|òˆ|ëˆ|äˆ|݈|Öˆ|ψ|Ȉ|Áˆ|ºˆ|³ˆ|¬ˆ|¥ˆ|žˆ|—ˆ|ˆ|‰ˆ|‚ˆ|{ˆ|tˆ|mˆ|fˆ|_ˆ|Xˆ|Qˆ|Jˆ|Cˆ|<ˆ|5ˆ|.ˆ|'ˆ| ˆ|ˆ|ˆ| ˆ|ˆ|ý‡|ö‡|ï‡|è‡|á‡|Ú‡|Ó‡|̇|Ň|¾‡|·‡|°‡|©‡|¢‡|›‡|”‡|‡|†‡|‡|x‡|q‡|j‡|c‡|\‡|U‡|N‡|G‡|@‡|9‡|2‡|+‡|$‡|‡|‡|‡|‡|‡|ú†|ó†|ì†|å†|Þ†|׆|І|Ɇ|†|»†|´†|­†|¦†|Ÿ†|˜†|‘†|І|ƒ†||†|u†|n†|g†|`†|Y†|R†|K†|D†|=†|6†|/†|(†|!†|†|†| †|†|þ…|÷…|ð…|é…|â…|Û…|Ô…|Í…|Æ…|¿…|¸…|±…|ª…|£…|œ…|•…|Ž…|‡…|€…|y…|r…|k…|d…|]…|V…|O…|H…|A…|:…|3…|,…|%…|…|…|…| …|…|û„|ô„|í„|æ„|ß„|Ø„|Ñ„|Ê„|Ä|¼„|µ„|®„|§„| „|™„|’„|‹„|„„|}„|v„|o„|h„|a„|Z„|S„|L„|E„|>„|7„|0„|)„|"„|„|„| „|„|ÿƒ|øƒ|ñƒ|êƒ|ãƒ|܃|Õƒ|΃|ǃ|Àƒ|¹ƒ|²ƒ|«ƒ|¤ƒ|ƒ|–ƒ|ƒ|ˆƒ|ƒ|zƒ|sƒ|lƒ|eƒ|^ƒ|Wƒ|Pƒ|Iƒ|Bƒ|;ƒ|4ƒ|-ƒ|&ƒ|ƒ|ƒ|ƒ| ƒ|ƒ|ü‚|õ‚|î‚|ç‚|à‚|Ù‚|Ò‚|Ë‚|Ä‚|½‚|¶‚|¯‚|¨‚|¡‚|š‚|“‚|Œ‚|…‚|~‚|w‚|p‚|i‚|b‚|[‚|T‚|M‚|F‚|?‚|8‚|1‚|*‚|#‚|‚|‚|‚|‚|‚|ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý€|ö€|ï€|è€|á€|Ú€|Ó€|Ì€|Å€|¾€|·€|°€|©€|¢€|›€|”€|€|†€|€|x€|q€|j€|c€|\€|U€|N€|G€|@€|9€|2€|+€|$€|€|€|€|€|€|ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ~|÷~|ð~|é~|â~|Û~|Ô~|Í~|Æ~|¿~|¸~|±~|ª~|£~|œ~|•~|Ž~|‡~|€~|y~|r~|k~|d~|]~|V~|O~|H~|A~|:~|3~|,~|%~|~|~|~| ~|~|û}|ô}|í}|æ}|ß}|Ø}|Ñ}|Ê}|Ã}|¼}|µ}|®}|§}| }|™}|’}|‹}|„}|}}|v}|o}|h}|a}|Z}|S}|L}|E}|>}|7}|0}|)}|"}|}|}| }|}|ÿ||ø||ñ||ê||ã||Ü||Õ||Î||Ç||À||¹||²||«||¤||||–||||ˆ||||z||s||l||e||^||W||P||I||B||;||4||-||&|||||||| ||||ü{|õ{|î{|ç{|à{|Ù{|Ò{|Ë{|Ä{|½{|¶{|¯{|¨{|¡{|š{|“{|Œ{|…{|~{|w{|p{|i{|b{|[{|T{|M{|F{|?{|8{|1{|*{|#{|{|{|{|{|{|ùz|òz|ëz|äz|Ýz|Öz|Ïz|Èz|Áz|ºz|³z|¬z|¥z|žz|—z|z|‰z|‚z|{z|tz|mz|fz|_z|Xz|Qz|Jz|Cz|v|7v|0v|)v|"v|v|v| v|v|ÿu|øu|ñu|êu|ãu|Üu|Õu|Îu|Çu|Àu|¹u|²u|«u|¤u|u|–u|u|ˆu|u|zu|su|lu|eu|^u|Wu|Pu|Iu|Bu|;u|4u|-u|&u|u|u|u| u|u|üt|õt|ît|çt|àt|Ùt|Òt|Ët|Ät|½t|¶t|¯t|¨t|¡t|št|“t|Œt|…t|~t|wt|pt|it|bt|[t|Tt|Mt|Ft|?t|8t|1t|*t|#t|t|t|t|t|t|ùs|òs|ës|äs|Ýs|Ös|Ïs|Ès|Ás|ºs|³s|¬s|¥s|žs|—s|s|‰s|‚s|{s|ts|ms|fs|_s|Xs|Qs|Js|Cs|o|7o|0o|)o|"o|o|o| o|o|ÿn|øn|ñn|ên|ãn|Ün|Õn|În|Çn|Àn|¹n|²n|«n|¤n|n|–n|n|ˆn|n|zn|sn|ln|en|^n|Wn|Pn|In|Bn|;n|4n|-n|&n|n|n|n| n|n|üm|õm|îm|çm|àm|Ùm|Òm|Ëm|Äm|½m|¶m|¯m|¨m|¡m|šm|“m|Œm|…m|~m|wm|pm|im|bm|[m|Tm|Mm|Fm|?m|8m|1m|*m|#m|m|m|m|m|m|ùl|òl|ël|äl|Ýl|Öl|Ïl|Èl|Ál|ºl|³l|¬l|¥l|žl|—l|l|‰l|‚l|{l|tl|ml|fl|_l|Xl|Ql|Jl|Cl|h|7h|0h|)h|"h|h|h| h|h|ÿg|øg|ñg|êg|ãg|Üg|Õg|Îg|Çg|Àg|¹g|²g|«g|¤g|g|–g|g|ˆg|g|zg|sg|lg|eg|^g|Wg|Pg|Ig|Bg|;g|4g|-g|&g|g|g|g| g|g|üf|õf|îf|çf|àf|Ùf|Òf|Ëf|Äf|½f|¶f|¯f|¨f|¡f|šf|“f|Œf|…f|~f|wf|pf|if|bf|[f|Tf|Mf|Ff|?f|8f|1f|*f|#f|f|f|f|f|f|ùe|òe|ëe|äe|Ýe|Öe|Ïe|Èe|Áe|ºe|³e|¬e|¥e|že|—e|e|‰e|‚e|{e|te|me|fe|_e|Xe|Qe|Je|Ce|a|7a|0a|)a|"a|a|a| a|a|ÿ`|ø`|ñ`|ê`|ã`|Ü`|Õ`|Î`|Ç`|À`|¹`|²`|«`|¤`|`|–`|`|ˆ`|`|z`|s`|l`|e`|^`|W`|P`|I`|B`|;`|4`|-`|&`|`|`|`| `|`|ü_|õ_|î_|ç_|à_|Ù_|Ò_|Ë_|Ä_|½_|¶_|¯_|¨_|¡_|š_|“_|Œ_|…_|~_|w_|p_|i_|b_|[_|T_|M_|F_|?_|8_|1_|*_|#_|_|_|_|_|_|ù^|ò^|ë^|ä^|Ý^|Ö^|Ï^|È^|Á^|º^|³^|¬^|¥^|ž^|—^|^|‰^|‚^|{^|t^|m^|f^|_^|X^|Q^|J^|C^|<^|5^|.^|'^| ^|^|^| ^|^|ý]|ö]|ï]|è]|á]|Ú]|Ó]|Ì]|Å]|¾]|·]|°]|©]|¢]|›]|”]|]|†]|]|x]|q]|j]|c]|\]|U]|N]|G]|@]|9]|2]|+]|$]|]|]|]|]|]|ú\|ó\|ì\|å\|Þ\|×\|Ð\|É\|Â\|»\|´\|­\|¦\|Ÿ\|˜\|‘\|Š\|ƒ\||\|u\|n\|g\|`\|Y\|R\|K\|D\|=\|6\|/\|(\|!\|\|\| \|\|þ[|÷[|ð[|é[|â[|Û[|Ô[|Í[|Æ[|¿[|¸[|±[|ª[|£[|œ[|•[|Ž[|‡[|€[|y[|r[|k[|d[|][|V[|O[|H[|A[|:[|3[|,[|%[|[|[|[| [|[|ûZ|ôZ|íZ|æZ|ßZ|ØZ|ÑZ|ÊZ|ÃZ|¼Z|µZ|®Z|§Z| Z|™Z|’Z|‹Z|„Z|}Z|vZ|oZ|hZ|aZ|ZZ|SZ|LZ|EZ|>Z|7Z|0Z|)Z|"Z|Z|Z| Z|Z|ÿY|øY|ñY|êY|ãY|ÜY|ÕY|ÎY|ÇY|ÀY|¹Y|²Y|«Y|¤Y|Y|–Y|Y|ˆY|Y|zY|sY|lY|eY|^Y|WY|PY|IY|BY|;Y|4Y|-Y|&Y|Y|Y|Y| Y|Y|üX|õX|îX|çX|àX|ÙX|ÒX|ËX|ÄX|½X|¶X|¯X|¨X|¡X|šX|“X|ŒX|…X|~X|wX|pX|iX|bX|[X|TX|MX|FX|?X|8X|1X|*X|#X|X|X|X|X|X|ùW|òW|ëW|äW|ÝW|ÖW|ÏW|ÈW|ÁW|ºW|³W|¬W|¥W|žW|—W|W|‰W|‚W|{W|tW|mW|fW|_W|XW|QW|JW|CW|S|7S|0S|)S|"S|S|S| S|S|ÿR|øR|ñR|êR|ãR|ÜR|ÕR|ÎR|ÇR|ÀR|¹R|²R|«R|¤R|R|–R|R|ˆR|R|zR|sR|lR|eR|^R|WR|PR|IR|BR|;R|4R|-R|&R|R|R|R| R|R|üQ|õQ|îQ|çQ|àQ|ÙQ|ÒQ|ËQ|ÄQ|½Q|¶Q|¯Q|¨Q|¡Q|šQ|“Q|ŒQ|…Q|~Q|wQ|pQ|iQ|bQ|[Q|TQ|MQ|FQ|?Q|8Q|1Q|*Q|#Q|Q|Q|Q|Q|Q|ùP|òP|ëP|äP|ÝP|ÖP|ÏP|ÈP|ÁP|ºP|³P|¬P|¥P|žP|—P|P|‰P|‚P|{P|tP|mP|fP|_P|XP|QP|JP|CP|L|7L|0L|)L|"L|L|L| L|L|ÿK|øK|ñK|êK|ãK|ÜK|ÕK|ÎK|ÇK|ÀK|¹K|²K|«K|¤K|K|–K|K|ˆK|K|zK|sK|lK|eK|^K|WK|PK|IK|BK|;K|4K|-K|&K|K|K|K| K|K|üJ|õJ|îJ|çJ|àJ|ÙJ|ÒJ|ËJ|ÄJ|½J|¶J|¯J|¨J|¡J|šJ|“J|ŒJ|…J|~J|wJ|pJ|iJ|bJ|[J|TJ|MJ|FJ|?J|8J|1J|*J|#J|J|J|J|J|J|ùI|òI|ëI|äI|ÝI|ÖI|ÏI|ÈI|ÁI|ºI|³I|¬I|¥I|žI|—I|I|‰I|‚I|{I|tI|mI|fI|_I|XI|QI|JI|CI|E|7E|0E|)E|"E|E|E| E|E|ÿD|øD|ñD|êD|ãD|ÜD|ÕD|ÎD|ÇD|ÀD|¹D|²D|«D|¤D|D|–D|D|ˆD|D|zD|sD|lD|eD|^D|WD|PD|ID|BD|;D|4D|-D|&D|D|D|D| D|D|üC|õC|îC|çC|àC|ÙC|ÒC|ËC|ÄC|½C|¶C|¯C|¨C|¡C|šC|“C|ŒC|…C|~C|wC|pC|iC|bC|[C|TC|MC|FC|?C|8C|1C|*C|#C|C|C|C|C|C|ùB|òB|ëB|äB|ÝB|ÖB|ÏB|ÈB|ÁB|ºB|³B|¬B|¥B|žB|—B|B|‰B|‚B|{B|tB|mB|fB|_B|XB|QB|JB|CB||ô>|í>|æ>|ß>|Ø>|Ñ>|Ê>|Ã>|¼>|µ>|®>|§>| >|™>|’>|‹>|„>|}>|v>|o>|h>|a>|Z>|S>|L>|E>|>>|7>|0>|)>|">|>|>| >|>|ÿ=|ø=|ñ=|ê=|ã=|Ü=|Õ=|Î=|Ç=|À=|¹=|²=|«=|¤=|=|–=|=|ˆ=|=|z=|s=|l=|e=|^=|W=|P=|I=|B=|;=|4=|-=|&=|=|=|=| =|=|ü<|õ<|î<|ç<|à<|Ù<|Ò<|Ë<|Ä<|½<|¶<|¯<|¨<|¡<|š<|“<|Œ<|…<|~<|w<|p<|i<|b<|[<|T<|M<|F<|?<|8<|1<|*<|#<|<|<|<|<|<|ù;|ò;|ë;|ä;|Ý;|Ö;|Ï;|È;|Á;|º;|³;|¬;|¥;|ž;|—;|;|‰;|‚;|{;|t;|m;|f;|_;|X;|Q;|J;|C;|<;|5;|.;|';| ;|;|;| ;|;|ý:|ö:|ï:|è:|á:|Ú:|Ó:|Ì:|Å:|¾:|·:|°:|©:|¢:|›:|”:|:|†:|:|x:|q:|j:|c:|\:|U:|N:|G:|@:|9:|2:|+:|$:|:|:|:|:|:|ú9|ó9|ì9|å9|Þ9|×9|Ð9|É9|Â9|»9|´9|­9|¦9|Ÿ9|˜9|‘9|Š9|ƒ9||9|u9|n9|g9|`9|Y9|R9|K9|D9|=9|69|/9|(9|!9|9|9| 9|9|þ8|÷8|ð8|é8|â8|Û8|Ô8|Í8|Æ8|¿8|¸8|±8|ª8|£8|œ8|•8|Ž8|‡8|€8|y8|r8|k8|d8|]8|V8|O8|H8|A8|:8|38|,8|%8|8|8|8| 8|8|û7|ô7|í7|æ7|ß7|Ø7|Ñ7|Ê7|Ã7|¼7|µ7|®7|§7| 7|™7|’7|‹7|„7|}7|v7|o7|h7|a7|Z7|S7|L7|E7|>7|77|07|)7|"7|7|7| 7|7|ÿ6|ø6|ñ6|ê6|ã6|Ü6|Õ6|Î6|Ç6|À6|¹6|²6|«6|¤6|6|–6|6|ˆ6|6|z6|s6|l6|e6|^6|W6|P6|I6|B6|;6|46|-6|&6|6|6|6| 6|6|ü5|õ5|î5|ç5|à5|Ù5|Ò5|Ë5|Ä5|½5|¶5|¯5|¨5|¡5|š5|“5|Œ5|…5|~5|w5|p5|i5|b5|[5|T5|M5|F5|?5|85|15|*5|#5|5|5|5|5|5|ù4|ò4|ë4|ä4|Ý4|Ö4|Ï4|È4|Á4|º4|³4|¬4|¥4|ž4|—4|4|‰4|‚4|{4|t4|m4|f4|_4|X4|Q4|J4|C4|<4|54|.4|'4| 4|4|4| 4|4|ý3|ö3|ï3|è3|á3|Ú3|Ó3|Ì3|Å3|¾3|·3|°3|©3|¢3|›3|”3|3|†3|3|x3|q3|j3|c3|\3|U3|N3|G3|@3|93|23|+3|$3|3|3|3|3|3|ú2|ó2|ì2|å2|Þ2|×2|Ð2|É2|Â2|»2|´2|­2|¦2|Ÿ2|˜2|‘2|Š2|ƒ2||2|u2|n2|g2|`2|Y2|R2|K2|D2|=2|62|/2|(2|!2|2|2| 2|2|þ1|÷1|ð1|é1|â1|Û1|Ô1|Í1|Æ1|¿1|¸1|±1|ª1|£1|œ1|•1|Ž1|‡1|€1|y1|r1|k1|d1|]1|V1|O1|H1|A1|:1|31|,1|%1|1|1|1| 1|1|û0|ô0|í0|æ0|ß0|Ø0|Ñ0|Ê0|Ã0|¼0|µ0|®0|§0| 0|™0|’0|‹0|„0|}0|v0|o0|h0|a0|Z0|S0|L0|E0|>0|70|00|)0|"0|0|0| 0|0|ÿ/|ø/|ñ/|ê/|ã/|Ü/|Õ/|Î/|Ç/|À/|¹/|²/|«/|¤/|/|–/|/|ˆ/|/|z/|s/|l/|e/|^/|W/|P/|I/|B/|;/|4/|-/|&/|/|/|/| /|/|ü.|õ.|î.|ç.|à.|Ù.|Ò.|Ë.|Ä.|½.|¶.|¯.|¨.|¡.|š.|“.|Œ.|….|~.|w.|p.|i.|b.|[.|T.|M.|F.|?.|8.|1.|*.|#.|.|.|.|.|.|ù-|ò-|ë-|ä-|Ý-|Ö-|Ï-|È-|Á-|º-|³-|¬-|¥-|ž-|—-|-|‰-|‚-|{-|t-|m-|f-|_-|X-|Q-|J-|C-|<-|5-|.-|'-| -|-|-| -|-|ý,|ö,|ï,|è,|á,|Ú,|Ó,|Ì,|Å,|¾,|·,|°,|©,|¢,|›,|”,|,|†,|,|x,|q,|j,|c,|\,|U,|N,|G,|@,|9,|2,|+,|$,|,|,|,|,|,|ú+|ó+|ì+|å+|Þ+|×+|Ð+|É+|Â+|»+|´+|­+|¦+|Ÿ+|˜+|‘+|Š+|ƒ+||+|u+|n+|g+|`+|Y+|R+|K+|D+|=+|6+|/+|(+|!+|+|+| +|+|þ*|÷*|ð*|é*|â*|Û*|Ô*|Í*|Æ*|¿*|¸*|±*|ª*|£*|œ*|•*|Ž*|‡*|€*|y*|r*|k*|d*|]*|V*|O*|H*|A*|:*|3*|,*|%*|*|*|*| *|*|û)|ô)|í)|æ)|ß)|Ø)|Ñ)|Ê)|Ã)|¼)|µ)|®)|§)| )|™)|’)|‹)|„)|})|v)|o)|h)|a)|Z)|S)|L)|E)|>)|7)|0)|))|")|)|)| )|)|ÿ(|ø(|ñ(|ê(|ã(|Ü(|Õ(|Î(|Ç(|À(|¹(|²(|«(|¤(|(|–(|(|ˆ(|(|z(|s(|l(|e(|^(|W(|P(|I(|B(|;(|4(|-(|&(|(|(|(| (|(|ü'|õ'|î'|ç'|à'|Ù'|Ò'|Ë'|Ä'|½'|¶'|¯'|¨'|¡'|š'|“'|Œ'|…'|~'|w'|p'|i'|b'|['|T'|M'|F'|?'|8'|1'|*'|#'|'|'|'|'|'|ù&|ò&|ë&|ä&|Ý&|Ö&|Ï&|È&|Á&|º&|³&|¬&|¥&|ž&|—&|&|‰&|‚&|{&|t&|m&|f&|_&|X&|Q&|J&|C&|<&|5&|.&|'&| &|&|&| &|&|ý%|ö%|ï%|è%|á%|Ú%|Ó%|Ì%|Å%|¾%|·%|°%|©%|¢%|›%|”%|%|†%|%|x%|q%|j%|c%|\%|U%|N%|G%|@%|9%|2%|+%|$%|%|%|%|%|%|ú$|ó$|ì$|å$|Þ$|×$|Ð$|É$|Â$|»$|´$|­$|¦$|Ÿ$|˜$|‘$|Š$|ƒ$||$|u$|n$|g$|`$|Y$|R$|K$|D$|=$|6$|/$|($|!$|$|$| $|$|þ#|÷#|ð#|é#|â#|Û#|Ô#|Í#|Æ#|¿#|¸#|±#|ª#|£#|œ#|•#|Ž#|‡#|€#|y#|r#|k#|d#|]#|V#|O#|H#|A#|:#|3#|,#|%#|#|#|#| #|#|û"|ô"|í"|æ"|ß"|Ø"|Ñ"|Ê"|Ã"|¼"|µ"|®"|§"| "|™"|’"|‹"|„"|}"|v"|o"|h"|a"|Z"|S"|L"|E"|>"|7"|0"|)"|""|"|"| "|"|ÿ!|ø!|ñ!|ê!|ã!|Ü!|Õ!|Î!|Ç!|À!|¹!|²!|«!|¤!|!|–!|!|ˆ!|!|z!|s!|l!|e!|^!|W!|P!|I!|B!|;!|4!|-!|&!|!|!|!| !|!|ü |õ |î |ç |à |Ù |Ò |Ë |Ä |½ |¶ |¯ |¨ |¡ |š |“ |Œ |… |~ |w |p |i |b |[ |T |M |F |? |8 |1 |* |# | | | | | |ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û |ô |í |æ |ß |Ø |Ñ |Ê |à |¼ |µ |® |§ |  |™ |’ |‹ |„ |} |v |o |h |a |Z |S |L |E |> |7 |0 |) |" | | | | |ÿ |ø |ñ |ê |ã |Ü |Õ |Î |Ç |À |¹ |² |« |¤ | |– | |ˆ | |z |s |l |e |^ |W |P |I |B |; |4 |- |& | | | | | |ü |õ |î |ç |à |Ù |Ò |Ë |Ä |½ |¶ |¯ |¨ |¡ |š |“ |Œ |… |~ |w |p |i |b |[ |T |M |F |? |8 |1 |* |# | | | | | |ù |ò |ë |ä |Ý |Ö |Ï |È |Á |º |³ |¬ |¥ |ž |— | |‰ |‚ |{ |t |m |f |_ |X |Q |J |C |< |5 |. |' | | | | | |ý |ö |ï |è |á |Ú |Ó |Ì |Å |¾ |· |° |© |¢ |› |” | |† | |x |q |j |c |\ |U |N |G |@ |9 |2 |+ |$ | | | | | |ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||ûÿ{ôÿ{íÿ{æÿ{ßÿ{Øÿ{Ñÿ{Êÿ{Ãÿ{¼ÿ{µÿ{®ÿ{§ÿ{ ÿ{™ÿ{’ÿ{‹ÿ{„ÿ{}ÿ{vÿ{oÿ{hÿ{aÿ{Zÿ{Sÿ{Lÿ{Eÿ{>ÿ{7ÿ{0ÿ{)ÿ{"ÿ{ÿ{ÿ{ ÿ{ÿ{ÿþ{øþ{ñþ{êþ{ãþ{Üþ{Õþ{Îþ{Çþ{Àþ{¹þ{²þ{«þ{¤þ{þ{–þ{þ{ˆþ{þ{zþ{sþ{lþ{eþ{^þ{Wþ{Pþ{Iþ{Bþ{;þ{4þ{-þ{&þ{þ{þ{þ{ þ{þ{üý{õý{îý{çý{àý{Ùý{Òý{Ëý{Äý{½ý{¶ý{¯ý{¨ý{¡ý{šý{“ý{Œý{…ý{~ý{wý{pý{iý{bý{[ý{Tý{Mý{Fý{?ý{8ý{1ý{*ý{#ý{ý{ý{ý{ý{ý{ùü{òü{ëü{äü{Ýü{Öü{Ïü{Èü{Áü{ºü{³ü{¬ü{¥ü{žü{—ü{ü{‰ü{‚ü{{ü{tü{mü{fü{_ü{Xü{Qü{Jü{Cü{<ü{5ü{.ü{'ü{ ü{ü{ü{ ü{ü{ýû{öû{ïû{èû{áû{Úû{Óû{Ìû{Åû{¾û{·û{°û{©û{¢û{›û{”û{û{†û{û{xû{qû{jû{cû{\û{Uû{Nû{Gû{@û{9û{2û{+û{$û{û{û{û{û{û{úú{óú{ìú{åú{Þú{×ú{Ðú{Éú{Âú{»ú{´ú{­ú{¦ú{Ÿú{˜ú{‘ú{Šú{ƒú{|ú{uú{nú{gú{`ú{Yú{Rú{Kú{Dú{=ú{6ú{/ú{(ú{!ú{ú{ú{ ú{ú{þù{÷ù{ðù{éù{âù{Ûù{Ôù{Íù{Æù{¿ù{¸ù{±ù{ªù{£ù{œù{•ù{Žù{‡ù{€ù{yù{rù{kù{dù{]ù{Vù{Où{Hù{Aù{:ù{3ù{,ù{%ù{ù{ù{ù{ ù{ù{ûø{ôø{íø{æø{ßø{Øø{Ñø{Êø{Ãø{¼ø{µø{®ø{§ø{ ø{™ø{’ø{‹ø{„ø{}ø{vø{oø{hø{aø{Zø{Sø{Lø{Eø{>ø{7ø{0ø{)ø{"ø{ø{ø{ ø{ø{ÿ÷{ø÷{ñ÷{ê÷{ã÷{Ü÷{Õ÷{Î÷{Ç÷{À÷{¹÷{²÷{«÷{¤÷{÷{–÷{÷{ˆ÷{÷{z÷{s÷{l÷{e÷{^÷{W÷{P÷{I÷{B÷{;÷{4÷{-÷{&÷{÷{÷{÷{ ÷{÷{üö{õö{îö{çö{àö{Ùö{Òö{Ëö{Äö{½ö{¶ö{¯ö{¨ö{¡ö{šö{“ö{Œö{…ö{~ö{wö{pö{iö{bö{[ö{Tö{Mö{Fö{?ö{8ö{1ö{*ö{#ö{ö{ö{ö{ö{ö{ùõ{òõ{ëõ{äõ{Ýõ{Öõ{Ïõ{Èõ{Áõ{ºõ{³õ{¬õ{¥õ{žõ{—õ{õ{‰õ{‚õ{{õ{tõ{mõ{fõ{_õ{Xõ{Qõ{Jõ{Cõ{<õ{5õ{.õ{'õ{ õ{õ{õ{ õ{õ{ýô{öô{ïô{èô{áô{Úô{Óô{Ìô{Åô{¾ô{·ô{°ô{©ô{¢ô{›ô{”ô{ô{†ô{ô{xô{qô{jô{cô{\ô{Uô{Nô{Gô{@ô{9ô{2ô{+ô{$ô{ô{ô{ô{ô{ô{úó{óó{ìó{åó{Þó{×ó{Ðó{Éó{Âó{»ó{´ó{­ó{¦ó{Ÿó{˜ó{‘ó{Šó{ƒó{|ó{uó{nó{gó{`ó{Yó{Ró{Kó{Dó{=ó{6ó{/ó{(ó{!ó{ó{ó{ ó{ó{þò{÷ò{ðò{éò{âò{Ûò{Ôò{Íò{Æò{¿ò{¸ò{±ò{ªò{£ò{œò{•ò{Žò{‡ò{€ò{yò{rò{kò{dò{]ò{Vò{Oò{Hò{Aò{:ò{3ò{,ò{%ò{ò{ò{ò{ ò{ò{ûñ{ôñ{íñ{æñ{ßñ{Øñ{Ññ{Êñ{Ãñ{¼ñ{µñ{®ñ{§ñ{ ñ{™ñ{’ñ{‹ñ{„ñ{}ñ{vñ{oñ{hñ{añ{Zñ{Sñ{Lñ{Eñ{>ñ{7ñ{0ñ{)ñ{"ñ{ñ{ñ{ ñ{ñ{ÿð{øð{ñð{êð{ãð{Üð{Õð{Îð{Çð{Àð{¹ð{²ð{«ð{¤ð{ð{–ð{ð{ˆð{ð{zð{sð{lð{eð{^ð{Wð{Pð{Ið{Bð{;ð{4ð{-ð{&ð{ð{ð{ð{ ð{ð{üï{õï{îï{çï{àï{Ùï{Òï{Ëï{Äï{½ï{¶ï{¯ï{¨ï{¡ï{šï{“ï{Œï{…ï{~ï{wï{pï{iï{bï{[ï{Tï{Mï{Fï{?ï{8ï{1ï{*ï{#ï{ï{ï{ï{ï{ï{ùî{òî{ëî{äî{Ýî{Öî{Ïî{Èî{Áî{ºî{³î{¬î{¥î{žî{—î{î{‰î{‚î{{î{tî{mî{fî{_î{Xî{Qî{Jî{Cî{<î{5î{.î{'î{ î{î{î{ î{î{ýí{öí{ïí{èí{áí{Úí{Óí{Ìí{Åí{¾í{·í{°í{©í{¢í{›í{”í{í{†í{í{xí{qí{jí{cí{\í{Uí{Ní{Gí{@í{9í{2í{+í{$í{í{í{í{í{í{úì{óì{ìì{åì{Þì{×ì{Ðì{Éì{Âì{»ì{´ì{­ì{¦ì{Ÿì{˜ì{‘ì{Šì{ƒì{|ì{uì{nì{gì{`ì{Yì{Rì{Kì{Dì{=ì{6ì{/ì{(ì{!ì{ì{ì{ ì{ì{þë{÷ë{ðë{éë{âë{Ûë{Ôë{Íë{Æë{¿ë{¸ë{±ë{ªë{£ë{œë{•ë{Žë{‡ë{€ë{yë{rë{kë{dë{]ë{Vë{Oë{Hë{Aë{:ë{3ë{,ë{%ë{ë{ë{ë{ ë{ë{ûê{ôê{íê{æê{ßê{Øê{Ñê{Êê{Ãê{¼ê{µê{®ê{§ê{ ê{™ê{’ê{‹ê{„ê{}ê{vê{oê{hê{aê{Zê{Sê{Lê{Eê{>ê{7ê{0ê{)ê{"ê{ê{ê{ ê{ê{ÿé{øé{ñé{êé{ãé{Üé{Õé{Îé{Çé{Àé{¹é{²é{«é{¤é{é{–é{é{ˆé{é{zé{sé{lé{eé{^é{Wé{Pé{Ié{Bé{;é{4é{-é{&é{é{é{é{ é{é{üè{õè{îè{çè{àè{Ùè{Òè{Ëè{Äè{½è{¶è{¯è{¨è{¡è{šè{“è{Œè{…è{~è{wè{pè{iè{bè{[è{Tè{Mè{Fè{?è{8è{1è{*è{#è{è{è{è{è{è{ùç{òç{ëç{äç{Ýç{Öç{Ïç{Èç{Áç{ºç{³ç{¬ç{¥ç{žç{—ç{ç{‰ç{‚ç{{ç{tç{mç{fç{_ç{Xç{Qç{Jç{Cç{<ç{5ç{.ç{'ç{ ç{ç{ç{ ç{ç{ýæ{öæ{ïæ{èæ{áæ{Úæ{Óæ{Ìæ{Åæ{¾æ{·æ{°æ{©æ{¢æ{›æ{”æ{æ{†æ{æ{xæ{qæ{jæ{cæ{\æ{Uæ{Næ{Gæ{@æ{9æ{2æ{+æ{$æ{æ{æ{æ{æ{æ{úå{óå{ìå{åå{Þå{×å{Ðå{Éå{Âå{»å{´å{­å{¦å{Ÿå{˜å{‘å{Šå{ƒå{|å{uå{nå{gå{`å{Yå{Rå{Kå{Då{=å{6å{/å{(å{!å{å{å{ å{å{þä{÷ä{ðä{éä{âä{Ûä{Ôä{Íä{Æä{¿ä{¸ä{±ä{ªä{£ä{œä{•ä{Žä{‡ä{€ä{yä{rä{kä{dä{]ä{Vä{Oä{Hä{Aä{:ä{3ä{,ä{%ä{ä{ä{ä{ ä{ä{ûã{ôã{íã{æã{ßã{Øã{Ñã{Êã{Ãã{¼ã{µã{®ã{§ã{ ã{™ã{’ã{‹ã{„ã{}ã{vã{oã{hã{aã{Zã{Sã{Lã{Eã{>ã{7ã{0ã{)ã{"ã{ã{ã{ ã{ã{ÿâ{øâ{ñâ{êâ{ãâ{Üâ{Õâ{Îâ{Çâ{Àâ{¹â{²â{«â{¤â{â{–â{â{ˆâ{â{zâ{sâ{lâ{eâ{^â{Wâ{Pâ{Iâ{Bâ{;â{4â{-â{&â{â{â{â{ â{â{üá{õá{îá{çá{àá{Ùá{Òá{Ëá{Äá{½á{¶á{¯á{¨á{¡á{šá{“á{Œá{…á{~á{wá{pá{iá{bá{[á{Tá{Má{Fá{?á{8á{1á{*á{#á{á{á{á{á{á{ùà{òà{ëà{äà{Ýà{Öà{Ïà{Èà{Áà{ºà{³à{¬à{¥à{žà{—à{à{‰à{‚à{{à{tà{mà{fà{_à{Xà{Qà{Jà{Cà{<à{5à{.à{'à{ à{à{à{ à{à{ýß{öß{ïß{èß{áß{Úß{Óß{Ìß{Åß{¾ß{·ß{°ß{©ß{¢ß{›ß{”ß{ß{†ß{ß{xß{qß{jß{cß{\ß{Uß{Nß{Gß{@ß{9ß{2ß{+ß{$ß{ß{ß{ß{ß{ß{úÞ{óÞ{ìÞ{åÞ{ÞÞ{×Þ{ÐÞ{ÉÞ{ÂÞ{»Þ{´Þ{­Þ{¦Þ{ŸÞ{˜Þ{‘Þ{ŠÞ{ƒÞ{|Þ{uÞ{nÞ{gÞ{`Þ{YÞ{RÞ{KÞ{DÞ{=Þ{6Þ{/Þ{(Þ{!Þ{Þ{Þ{ Þ{Þ{þÝ{÷Ý{ðÝ{éÝ{âÝ{ÛÝ{ÔÝ{ÍÝ{ÆÝ{¿Ý{¸Ý{±Ý{ªÝ{£Ý{œÝ{•Ý{ŽÝ{‡Ý{€Ý{yÝ{rÝ{kÝ{dÝ{]Ý{VÝ{OÝ{HÝ{AÝ{:Ý{3Ý{,Ý{%Ý{Ý{Ý{Ý{ Ý{Ý{ûÜ{ôÜ{íÜ{æÜ{ßÜ{ØÜ{ÑÜ{ÊÜ{ÃÜ{¼Ü{µÜ{®Ü{§Ü{ Ü{™Ü{’Ü{‹Ü{„Ü{}Ü{vÜ{oÜ{hÜ{aÜ{ZÜ{SÜ{LÜ{EÜ{>Ü{7Ü{0Ü{)Ü{"Ü{Ü{Ü{ Ü{Ü{ÿÛ{øÛ{ñÛ{êÛ{ãÛ{ÜÛ{ÕÛ{ÎÛ{ÇÛ{ÀÛ{¹Û{²Û{«Û{¤Û{Û{–Û{Û{ˆÛ{Û{zÛ{sÛ{lÛ{eÛ{^Û{WÛ{PÛ{IÛ{BÛ{;Û{4Û{-Û{&Û{Û{Û{Û{ Û{Û{üÚ{õÚ{îÚ{çÚ{àÚ{ÙÚ{ÒÚ{ËÚ{ÄÚ{½Ú{¶Ú{¯Ú{¨Ú{¡Ú{šÚ{“Ú{ŒÚ{…Ú{~Ú{wÚ{pÚ{iÚ{bÚ{[Ú{TÚ{MÚ{FÚ{?Ú{8Ú{1Ú{*Ú{#Ú{Ú{Ú{Ú{Ú{Ú{ùÙ{òÙ{ëÙ{äÙ{ÝÙ{ÖÙ{ÏÙ{ÈÙ{ÁÙ{ºÙ{³Ù{¬Ù{¥Ù{žÙ{—Ù{Ù{‰Ù{‚Ù{{Ù{tÙ{mÙ{fÙ{_Ù{XÙ{QÙ{JÙ{CÙ{<Ù{5Ù{.Ù{'Ù{ Ù{Ù{Ù{ Ù{Ù{ýØ{öØ{ïØ{èØ{áØ{ÚØ{ÓØ{ÌØ{ÅØ{¾Ø{·Ø{°Ø{©Ø{¢Ø{›Ø{”Ø{Ø{†Ø{Ø{xØ{qØ{jØ{cØ{\Ø{UØ{NØ{GØ{@Ø{9Ø{2Ø{+Ø{$Ø{Ø{Ø{Ø{Ø{Ø{ú×{ó×{ì×{å×{Þ×{××{Ð×{É×{Â×{»×{´×{­×{¦×{Ÿ×{˜×{‘×{Š×{ƒ×{|×{u×{n×{g×{`×{Y×{R×{K×{D×{=×{6×{/×{(×{!×{×{×{ ×{×{þÖ{÷Ö{ðÖ{éÖ{âÖ{ÛÖ{ÔÖ{ÍÖ{ÆÖ{¿Ö{¸Ö{±Ö{ªÖ{£Ö{œÖ{•Ö{ŽÖ{‡Ö{€Ö{yÖ{rÖ{kÖ{dÖ{]Ö{VÖ{OÖ{HÖ{AÖ{:Ö{3Ö{,Ö{%Ö{Ö{Ö{Ö{ Ö{Ö{ûÕ{ôÕ{íÕ{æÕ{ßÕ{ØÕ{ÑÕ{ÊÕ{ÃÕ{¼Õ{µÕ{®Õ{§Õ{ Õ{™Õ{’Õ{‹Õ{„Õ{}Õ{vÕ{oÕ{hÕ{aÕ{ZÕ{SÕ{LÕ{EÕ{>Õ{7Õ{0Õ{)Õ{"Õ{Õ{Õ{ Õ{Õ{ÿÔ{øÔ{ñÔ{êÔ{ãÔ{ÜÔ{ÕÔ{ÎÔ{ÇÔ{ÀÔ{¹Ô{²Ô{«Ô{¤Ô{Ô{–Ô{Ô{ˆÔ{Ô{zÔ{sÔ{lÔ{eÔ{^Ô{WÔ{PÔ{IÔ{BÔ{;Ô{4Ô{-Ô{&Ô{Ô{Ô{Ô{ Ô{Ô{üÓ{õÓ{îÓ{çÓ{àÓ{ÙÓ{ÒÓ{ËÓ{ÄÓ{½Ó{¶Ó{¯Ó{¨Ó{¡Ó{šÓ{“Ó{ŒÓ{…Ó{~Ó{wÓ{pÓ{iÓ{bÓ{[Ó{TÓ{MÓ{FÓ{?Ó{8Ó{1Ó{*Ó{#Ó{Ó{Ó{Ó{Ó{Ó{ùÒ{òÒ{ëÒ{äÒ{ÝÒ{ÖÒ{ÏÒ{ÈÒ{ÁÒ{ºÒ{³Ò{¬Ò{¥Ò{žÒ{—Ò{Ò{‰Ò{‚Ò{{Ò{tÒ{mÒ{fÒ{_Ò{XÒ{QÒ{JÒ{CÒ{<Ò{5Ò{.Ò{'Ò{ Ò{Ò{Ò{ Ò{Ò{ýÑ{öÑ{ïÑ{èÑ{áÑ{ÚÑ{ÓÑ{ÌÑ{ÅÑ{¾Ñ{·Ñ{°Ñ{©Ñ{¢Ñ{›Ñ{”Ñ{Ñ{†Ñ{Ñ{xÑ{qÑ{jÑ{cÑ{\Ñ{UÑ{NÑ{GÑ{@Ñ{9Ñ{2Ñ{+Ñ{$Ñ{Ñ{Ñ{Ñ{Ñ{Ñ{úÐ{óÐ{ìÐ{åÐ{ÞÐ{×Ð{ÐÐ{ÉÐ{ÂÐ{»Ð{´Ð{­Ð{¦Ð{ŸÐ{˜Ð{‘Ð{ŠÐ{ƒÐ{|Ð{uÐ{nÐ{gÐ{`Ð{YÐ{RÐ{KÐ{DÐ{=Ð{6Ð{/Ð{(Ð{!Ð{Ð{Ð{ Ð{Ð{þÏ{÷Ï{ðÏ{éÏ{âÏ{ÛÏ{ÔÏ{ÍÏ{ÆÏ{¿Ï{¸Ï{±Ï{ªÏ{£Ï{œÏ{•Ï{ŽÏ{‡Ï{€Ï{yÏ{rÏ{kÏ{dÏ{]Ï{VÏ{OÏ{HÏ{AÏ{:Ï{3Ï{,Ï{%Ï{Ï{Ï{Ï{ Ï{Ï{ûÎ{ôÎ{íÎ{æÎ{ßÎ{ØÎ{ÑÎ{ÊÎ{ÃÎ{¼Î{µÎ{®Î{§Î{ Î{™Î{’Î{‹Î{„Î{}Î{vÎ{oÎ{hÎ{aÎ{ZÎ{SÎ{LÎ{EÎ{>Î{7Î{0Î{)Î{"Î{Î{Î{ Î{Î{ÿÍ{øÍ{ñÍ{êÍ{ãÍ{ÜÍ{ÕÍ{ÎÍ{ÇÍ{ÀÍ{¹Í{²Í{«Í{¤Í{Í{–Í{Í{ˆÍ{Í{zÍ{sÍ{lÍ{eÍ{^Í{WÍ{PÍ{IÍ{BÍ{;Í{4Í{-Í{&Í{Í{Í{Í{ Í{Í{üÌ{õÌ{îÌ{çÌ{àÌ{ÙÌ{ÒÌ{ËÌ{ÄÌ{½Ì{¶Ì{¯Ì{¨Ì{¡Ì{šÌ{“Ì{ŒÌ{…Ì{~Ì{wÌ{pÌ{iÌ{bÌ{[Ì{TÌ{MÌ{FÌ{?Ì{8Ì{1Ì{*Ì{#Ì{Ì{Ì{Ì{Ì{Ì{ùË{òË{ëË{äË{ÝË{ÖË{ÏË{ÈË{ÁË{ºË{³Ë{¬Ë{¥Ë{žË{—Ë{Ë{‰Ë{‚Ë{{Ë{tË{mË{fË{_Ë{XË{QË{JË{CË{<Ë{5Ë{.Ë{'Ë{ Ë{Ë{Ë{ Ë{Ë{ýÊ{öÊ{ïÊ{èÊ{áÊ{ÚÊ{ÓÊ{ÌÊ{ÅÊ{¾Ê{·Ê{°Ê{©Ê{¢Ê{›Ê{”Ê{Ê{†Ê{Ê{xÊ{qÊ{jÊ{cÊ{\Ê{UÊ{NÊ{GÊ{@Ê{9Ê{2Ê{+Ê{$Ê{Ê{Ê{Ê{Ê{Ê{úÉ{óÉ{ìÉ{åÉ{ÞÉ{×É{ÐÉ{ÉÉ{ÂÉ{»É{´É{­É{¦É{ŸÉ{˜É{‘É{ŠÉ{ƒÉ{|É{uÉ{nÉ{gÉ{`É{YÉ{RÉ{KÉ{DÉ{=É{6É{/É{(É{!É{É{É{ É{É{þÈ{÷È{ðÈ{éÈ{âÈ{ÛÈ{ÔÈ{ÍÈ{ÆÈ{¿È{¸È{±È{ªÈ{£È{œÈ{•È{ŽÈ{‡È{€È{yÈ{rÈ{kÈ{dÈ{]È{VÈ{OÈ{HÈ{AÈ{:È{3È{,È{%È{È{È{È{ È{È{ûÇ{ôÇ{íÇ{æÇ{ßÇ{ØÇ{ÑÇ{ÊÇ{ÃÇ{¼Ç{µÇ{®Ç{§Ç{ Ç{™Ç{’Ç{‹Ç{„Ç{}Ç{vÇ{oÇ{hÇ{aÇ{ZÇ{SÇ{LÇ{EÇ{>Ç{7Ç{0Ç{)Ç{"Ç{Ç{Ç{ Ç{Ç{ÿÆ{øÆ{ñÆ{êÆ{ãÆ{ÜÆ{ÕÆ{ÎÆ{ÇÆ{ÀÆ{¹Æ{²Æ{«Æ{¤Æ{Æ{–Æ{Æ{ˆÆ{Æ{zÆ{sÆ{lÆ{eÆ{^Æ{WÆ{PÆ{IÆ{BÆ{;Æ{4Æ{-Æ{&Æ{Æ{Æ{Æ{ Æ{Æ{üÅ{õÅ{îÅ{çÅ{àÅ{ÙÅ{ÒÅ{ËÅ{ÄÅ{½Å{¶Å{¯Å{¨Å{¡Å{šÅ{“Å{ŒÅ{…Å{~Å{wÅ{pÅ{iÅ{bÅ{[Å{TÅ{MÅ{FÅ{?Å{8Å{1Å{*Å{#Å{Å{Å{Å{Å{Å{ùÄ{òÄ{ëÄ{äÄ{ÝÄ{ÖÄ{ÏÄ{ÈÄ{ÁÄ{ºÄ{³Ä{¬Ä{¥Ä{žÄ{—Ä{Ä{‰Ä{‚Ä{{Ä{tÄ{mÄ{fÄ{_Ä{XÄ{QÄ{JÄ{CÄ{<Ä{5Ä{.Ä{'Ä{ Ä{Ä{Ä{ Ä{Ä{ýÃ{öÃ{ïÃ{èÃ{áÃ{ÚÃ{ÓÃ{ÌÃ{ÅÃ{¾Ã{·Ã{°Ã{©Ã{¢Ã{›Ã{”Ã{Ã{†Ã{Ã{xÃ{qÃ{jÃ{cÃ{\Ã{UÃ{NÃ{GÃ{@Ã{9Ã{2Ã{+Ã{$Ã{Ã{Ã{Ã{Ã{Ã{úÂ{óÂ{ìÂ{åÂ{ÞÂ{×Â{ÐÂ{ÉÂ{ÂÂ{»Â{´Â{­Â{¦Â{ŸÂ{˜Â{‘Â{ŠÂ{ƒÂ{|Â{uÂ{nÂ{gÂ{`Â{YÂ{RÂ{KÂ{DÂ{=Â{6Â{/Â{(Â{!Â{Â{Â{ Â{Â{þÁ{÷Á{ðÁ{éÁ{âÁ{ÛÁ{ÔÁ{ÍÁ{ÆÁ{¿Á{¸Á{±Á{ªÁ{£Á{œÁ{•Á{ŽÁ{‡Á{€Á{yÁ{rÁ{kÁ{dÁ{]Á{VÁ{OÁ{HÁ{AÁ{:Á{3Á{,Á{%Á{Á{Á{Á{ Á{Á{ûÀ{ôÀ{íÀ{æÀ{ßÀ{ØÀ{ÑÀ{ÊÀ{ÃÀ{¼À{µÀ{®À{§À{ À{™À{’À{‹À{„À{}À{vÀ{oÀ{hÀ{aÀ{ZÀ{SÀ{LÀ{EÀ{>À{7À{0À{)À{"À{À{À{ À{À{ÿ¿{ø¿{ñ¿{ê¿{ã¿{Ü¿{Õ¿{ο{Ç¿{À¿{¹¿{²¿{«¿{¤¿{¿{–¿{¿{ˆ¿{¿{z¿{s¿{l¿{e¿{^¿{W¿{P¿{I¿{B¿{;¿{4¿{-¿{&¿{¿{¿{¿{ ¿{¿{ü¾{õ¾{î¾{ç¾{à¾{Ù¾{Ò¾{˾{ľ{½¾{¶¾{¯¾{¨¾{¡¾{š¾{“¾{Œ¾{…¾{~¾{w¾{p¾{i¾{b¾{[¾{T¾{M¾{F¾{?¾{8¾{1¾{*¾{#¾{¾{¾{¾{¾{¾{ù½{ò½{ë½{ä½{ݽ{Ö½{Ͻ{Ƚ{Á½{º½{³½{¬½{¥½{ž½{—½{½{‰½{‚½{{½{t½{m½{f½{_½{X½{Q½{J½{C½{<½{5½{.½{'½{ ½{½{½{ ½{½{ý¼{ö¼{ï¼{è¼{á¼{Ú¼{Ó¼{̼{ż{¾¼{·¼{°¼{©¼{¢¼{›¼{”¼{¼{†¼{¼{x¼{q¼{j¼{c¼{\¼{U¼{N¼{G¼{@¼{9¼{2¼{+¼{$¼{¼{¼{¼{¼{¼{ú»{ó»{ì»{å»{Þ»{×»{л{É»{»{»»{´»{­»{¦»{Ÿ»{˜»{‘»{Š»{ƒ»{|»{u»{n»{g»{`»{Y»{R»{K»{D»{=»{6»{/»{(»{!»{»{»{ »{»{þº{÷º{ðº{éº{âº{Ûº{Ôº{ͺ{ƺ{¿º{¸º{±º{ªº{£º{œº{•º{Žº{‡º{€º{yº{rº{kº{dº{]º{Vº{Oº{Hº{Aº{:º{3º{,º{%º{º{º{º{ º{º{û¹{ô¹{í¹{æ¹{ß¹{ع{ѹ{ʹ{ù{¼¹{µ¹{®¹{§¹{ ¹{™¹{’¹{‹¹{„¹{}¹{v¹{o¹{h¹{a¹{Z¹{S¹{L¹{E¹{>¹{7¹{0¹{)¹{"¹{¹{¹{ ¹{¹{ÿ¸{ø¸{ñ¸{ê¸{ã¸{ܸ{Õ¸{θ{Ǹ{À¸{¹¸{²¸{«¸{¤¸{¸{–¸{¸{ˆ¸{¸{z¸{s¸{l¸{e¸{^¸{W¸{P¸{I¸{B¸{;¸{4¸{-¸{&¸{¸{¸{¸{ ¸{¸{ü·{õ·{î·{ç·{à·{Ù·{Ò·{Ë·{Ä·{½·{¶·{¯·{¨·{¡·{š·{“·{Œ·{…·{~·{w·{p·{i·{b·{[·{T·{M·{F·{?·{8·{1·{*·{#·{·{·{·{·{·{ù¶{ò¶{ë¶{ä¶{ݶ{Ö¶{϶{ȶ{Á¶{º¶{³¶{¬¶{¥¶{ž¶{—¶{¶{‰¶{‚¶{{¶{t¶{m¶{f¶{_¶{X¶{Q¶{J¶{C¶{<¶{5¶{.¶{'¶{ ¶{¶{¶{ ¶{¶{ýµ{öµ{ïµ{èµ{áµ{Úµ{Óµ{̵{ŵ{¾µ{·µ{°µ{©µ{¢µ{›µ{”µ{µ{†µ{µ{xµ{qµ{jµ{cµ{\µ{Uµ{Nµ{Gµ{@µ{9µ{2µ{+µ{$µ{µ{µ{µ{µ{µ{ú´{ó´{ì´{å´{Þ´{×´{д{É´{´{»´{´´{­´{¦´{Ÿ´{˜´{‘´{Š´{ƒ´{|´{u´{n´{g´{`´{Y´{R´{K´{D´{=´{6´{/´{(´{!´{´{´{ ´{´{þ³{÷³{ð³{é³{â³{Û³{Ô³{ͳ{Ƴ{¿³{¸³{±³{ª³{£³{œ³{•³{޳{‡³{€³{y³{r³{k³{d³{]³{V³{O³{H³{A³{:³{3³{,³{%³{³{³{³{ ³{³{û²{ô²{í²{æ²{ß²{ز{Ѳ{ʲ{ò{¼²{µ²{®²{§²{ ²{™²{’²{‹²{„²{}²{v²{o²{h²{a²{Z²{S²{L²{E²{>²{7²{0²{)²{"²{²{²{ ²{²{ÿ±{ø±{ñ±{ê±{ã±{ܱ{Õ±{α{DZ{À±{¹±{²±{«±{¤±{±{–±{±{ˆ±{±{z±{s±{l±{e±{^±{W±{P±{I±{B±{;±{4±{-±{&±{±{±{±{ ±{±{ü°{õ°{î°{ç°{à°{Ù°{Ò°{˰{İ{½°{¶°{¯°{¨°{¡°{š°{“°{Œ°{…°{~°{w°{p°{i°{b°{[°{T°{M°{F°{?°{8°{1°{*°{#°{°{°{°{°{°{ù¯{ò¯{ë¯{ä¯{ݯ{Ö¯{ϯ{ȯ{Á¯{º¯{³¯{¬¯{¥¯{ž¯{—¯{¯{‰¯{‚¯{{¯{t¯{m¯{f¯{_¯{X¯{Q¯{J¯{C¯{<¯{5¯{.¯{'¯{ ¯{¯{¯{ ¯{¯{ý®{ö®{ï®{è®{á®{Ú®{Ó®{Ì®{Å®{¾®{·®{°®{©®{¢®{›®{”®{®{†®{®{x®{q®{j®{c®{\®{U®{N®{G®{@®{9®{2®{+®{$®{®{®{®{®{®{ú­{ó­{ì­{å­{Þ­{×­{Э{É­{­{»­{´­{­­{¦­{Ÿ­{˜­{‘­{Š­{ƒ­{|­{u­{n­{g­{`­{Y­{R­{K­{D­{=­{6­{/­{(­{!­{­{­{ ­{­{þ¬{÷¬{ð¬{é¬{â¬{Û¬{Ô¬{ͬ{Ƭ{¿¬{¸¬{±¬{ª¬{£¬{œ¬{•¬{ެ{‡¬{€¬{y¬{r¬{k¬{d¬{]¬{V¬{O¬{H¬{A¬{:¬{3¬{,¬{%¬{¬{¬{¬{ ¬{¬{û«{ô«{í«{æ«{ß«{Ø«{Ñ«{Ê«{ë{¼«{µ«{®«{§«{ «{™«{’«{‹«{„«{}«{v«{o«{h«{a«{Z«{S«{L«{E«{>«{7«{0«{)«{"«{«{«{ «{«{ÿª{øª{ñª{êª{ãª{ܪ{Õª{Ϊ{Ǫ{Àª{¹ª{²ª{«ª{¤ª{ª{–ª{ª{ˆª{ª{zª{sª{lª{eª{^ª{Wª{Pª{Iª{Bª{;ª{4ª{-ª{&ª{ª{ª{ª{ ª{ª{ü©{õ©{î©{ç©{à©{Ù©{Ò©{Ë©{Ä©{½©{¶©{¯©{¨©{¡©{š©{“©{Œ©{…©{~©{w©{p©{i©{b©{[©{T©{M©{F©{?©{8©{1©{*©{#©{©{©{©{©{©{ù¨{ò¨{ë¨{ä¨{ݨ{Ö¨{Ϩ{Ȩ{Á¨{º¨{³¨{¬¨{¥¨{ž¨{—¨{¨{‰¨{‚¨{{¨{t¨{m¨{f¨{_¨{X¨{Q¨{J¨{C¨{<¨{5¨{.¨{'¨{ ¨{¨{¨{ ¨{¨{ý§{ö§{ï§{è§{á§{Ú§{Ó§{̧{ŧ{¾§{·§{°§{©§{¢§{›§{”§{§{†§{§{x§{q§{j§{c§{\§{U§{N§{G§{@§{9§{2§{+§{$§{§{§{§{§{§{ú¦{ó¦{ì¦{å¦{Þ¦{צ{Ц{ɦ{¦{»¦{´¦{­¦{¦¦{Ÿ¦{˜¦{‘¦{Ц{ƒ¦{|¦{u¦{n¦{g¦{`¦{Y¦{R¦{K¦{D¦{=¦{6¦{/¦{(¦{!¦{¦{¦{ ¦{¦{þ¥{÷¥{ð¥{é¥{â¥{Û¥{Ô¥{Í¥{Æ¥{¿¥{¸¥{±¥{ª¥{£¥{œ¥{•¥{Ž¥{‡¥{€¥{y¥{r¥{k¥{d¥{]¥{V¥{O¥{H¥{A¥{:¥{3¥{,¥{%¥{¥{¥{¥{ ¥{¥{û¤{ô¤{í¤{æ¤{ߤ{ؤ{Ѥ{ʤ{ä{¼¤{µ¤{®¤{§¤{ ¤{™¤{’¤{‹¤{„¤{}¤{v¤{o¤{h¤{a¤{Z¤{S¤{L¤{E¤{>¤{7¤{0¤{)¤{"¤{¤{¤{ ¤{¤{ÿ£{ø£{ñ£{ê£{ã£{Ü£{Õ£{Σ{Ç£{À£{¹£{²£{«£{¤£{£{–£{£{ˆ£{£{z£{s£{l£{e£{^£{W£{P£{I£{B£{;£{4£{-£{&£{£{£{£{ £{£{ü¢{õ¢{î¢{ç¢{à¢{Ù¢{Ò¢{Ë¢{Ä¢{½¢{¶¢{¯¢{¨¢{¡¢{š¢{“¢{Œ¢{…¢{~¢{w¢{p¢{i¢{b¢{[¢{T¢{M¢{F¢{?¢{8¢{1¢{*¢{#¢{¢{¢{¢{¢{¢{ù¡{ò¡{ë¡{ä¡{Ý¡{Ö¡{Ï¡{È¡{Á¡{º¡{³¡{¬¡{¥¡{ž¡{—¡{¡{‰¡{‚¡{{¡{t¡{m¡{f¡{_¡{X¡{Q¡{J¡{C¡{<¡{5¡{.¡{'¡{ ¡{¡{¡{ ¡{¡{ý {ö {ï {è {á {Ú {Ó {Ì {Å {¾ {· {° {© {¢ {› {” { {† { {x {q {j {c {\ {U {N {G {@ {9 {2 {+ {$ { { { { { {úŸ{óŸ{ìŸ{åŸ{ÞŸ{ן{П{ÉŸ{Ÿ{»Ÿ{´Ÿ{­Ÿ{¦Ÿ{ŸŸ{˜Ÿ{‘Ÿ{ŠŸ{ƒŸ{|Ÿ{uŸ{nŸ{gŸ{`Ÿ{YŸ{RŸ{KŸ{DŸ{=Ÿ{6Ÿ{/Ÿ{(Ÿ{!Ÿ{Ÿ{Ÿ{ Ÿ{Ÿ{þž{÷ž{ðž{éž{âž{Ûž{Ôž{Íž{Æž{¿ž{¸ž{±ž{ªž{£ž{œž{•ž{Žž{‡ž{€ž{yž{rž{kž{dž{]ž{Vž{Ož{Hž{Až{:ž{3ž{,ž{%ž{ž{ž{ž{ ž{ž{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿœ{øœ{ñœ{êœ{ãœ{Üœ{Õœ{Μ{Çœ{Àœ{¹œ{²œ{«œ{¤œ{œ{–œ{œ{ˆœ{œ{zœ{sœ{lœ{eœ{^œ{Wœ{Pœ{Iœ{Bœ{;œ{4œ{-œ{&œ{œ{œ{œ{ œ{œ{ü›{õ›{î›{ç›{à›{Ù›{Ò›{Ë›{Ä›{½›{¶›{¯›{¨›{¡›{š›{“›{Œ›{…›{~›{w›{p›{i›{b›{[›{T›{M›{F›{?›{8›{1›{*›{#›{›{›{›{›{›{ùš{òš{ëš{äš{Ýš{Öš{Ïš{Èš{Áš{ºš{³š{¬š{¥š{žš{—š{š{‰š{‚š{{š{tš{mš{fš{_š{Xš{Qš{Jš{Cš{<š{5š{.š{'š{ š{š{š{ š{š{ý™{ö™{ï™{è™{á™{Ú™{Ó™{Ì™{Å™{¾™{·™{°™{©™{¢™{›™{”™{™{†™{™{x™{q™{j™{c™{\™{U™{N™{G™{@™{9™{2™{+™{$™{™{™{™{™{™{ú˜{ó˜{ì˜{å˜{Þ˜{ט{И{ɘ{˜{»˜{´˜{­˜{¦˜{Ÿ˜{˜˜{‘˜{Š˜{ƒ˜{|˜{u˜{n˜{g˜{`˜{Y˜{R˜{K˜{D˜{=˜{6˜{/˜{(˜{!˜{˜{˜{ ˜{˜{þ—{÷—{ð—{é—{â—{Û—{Ô—{Í—{Æ—{¿—{¸—{±—{ª—{£—{œ—{•—{Ž—{‡—{€—{y—{r—{k—{d—{]—{V—{O—{H—{A—{:—{3—{,—{%—{—{—{—{ —{—{û–{ô–{í–{æ–{ß–{Ø–{Ñ–{Ê–{Ö{¼–{µ–{®–{§–{ –{™–{’–{‹–{„–{}–{v–{o–{h–{a–{Z–{S–{L–{E–{>–{7–{0–{)–{"–{–{–{ –{–{ÿ•{ø•{ñ•{ê•{ã•{Ü•{Õ•{Ε{Ç•{À•{¹•{²•{«•{¤•{•{–•{•{ˆ•{•{z•{s•{l•{e•{^•{W•{P•{I•{B•{;•{4•{-•{&•{•{•{•{ •{•{ü”{õ”{î”{ç”{à”{Ù”{Ò”{Ë”{Ä”{½”{¶”{¯”{¨”{¡”{š”{“”{Œ”{…”{~”{w”{p”{i”{b”{[”{T”{M”{F”{?”{8”{1”{*”{#”{”{”{”{”{”{ù“{ò“{ë“{ä“{Ý“{Ö“{Ï“{È“{Á“{º“{³“{¬“{¥“{ž“{—“{“{‰“{‚“{{“{t“{m“{f“{_“{X“{Q“{J“{C“{<“{5“{.“{'“{ “{“{“{ “{“{ý’{ö’{ï’{è’{á’{Ú’{Ó’{Ì’{Å’{¾’{·’{°’{©’{¢’{›’{”’{’{†’{’{x’{q’{j’{c’{\’{U’{N’{G’{@’{9’{2’{+’{$’{’{’{’{’{’{ú‘{ó‘{ì‘{å‘{Þ‘{ב{Б{É‘{‘{»‘{´‘{­‘{¦‘{Ÿ‘{˜‘{‘‘{Š‘{ƒ‘{|‘{u‘{n‘{g‘{`‘{Y‘{R‘{K‘{D‘{=‘{6‘{/‘{(‘{!‘{‘{‘{ ‘{‘{þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿŽ{øŽ{ñŽ{êŽ{ãŽ{ÜŽ{ÕŽ{ÎŽ{ÇŽ{ÀŽ{¹Ž{²Ž{«Ž{¤Ž{Ž{–Ž{Ž{ˆŽ{Ž{zŽ{sŽ{lŽ{eŽ{^Ž{WŽ{PŽ{IŽ{BŽ{;Ž{4Ž{-Ž{&Ž{Ž{Ž{Ž{ Ž{Ž{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ùŒ{òŒ{ëŒ{äŒ{ÝŒ{ÖŒ{ÏŒ{ÈŒ{ÁŒ{ºŒ{³Œ{¬Œ{¥Œ{žŒ{—Œ{Œ{‰Œ{‚Œ{{Œ{tŒ{mŒ{fŒ{_Œ{XŒ{QŒ{JŒ{CŒ{<Œ{5Œ{.Œ{'Œ{ Œ{Œ{Œ{ Œ{Œ{ý‹{ö‹{ï‹{è‹{á‹{Ú‹{Ó‹{Ì‹{Å‹{¾‹{·‹{°‹{©‹{¢‹{›‹{”‹{‹{†‹{‹{x‹{q‹{j‹{c‹{\‹{U‹{N‹{G‹{@‹{9‹{2‹{+‹{$‹{‹{‹{‹{‹{‹{úŠ{óŠ{ìŠ{åŠ{ÞŠ{׊{Њ{ÉŠ{Š{»Š{´Š{­Š{¦Š{ŸŠ{˜Š{‘Š{ŠŠ{ƒŠ{|Š{uŠ{nŠ{gŠ{`Š{YŠ{RŠ{KŠ{DŠ{=Š{6Š{/Š{(Š{!Š{Š{Š{ Š{Š{þ‰{÷‰{ð‰{é‰{â‰{Û‰{Ô‰{͉{Ɖ{¿‰{¸‰{±‰{ª‰{£‰{œ‰{•‰{މ{‡‰{€‰{y‰{r‰{k‰{d‰{]‰{V‰{O‰{H‰{A‰{:‰{3‰{,‰{%‰{‰{‰{‰{ ‰{‰{ûˆ{ôˆ{íˆ{æˆ{߈{؈{ш{ʈ{È{¼ˆ{µˆ{®ˆ{§ˆ{ ˆ{™ˆ{’ˆ{‹ˆ{„ˆ{}ˆ{vˆ{oˆ{hˆ{aˆ{Zˆ{Sˆ{Lˆ{Eˆ{>ˆ{7ˆ{0ˆ{)ˆ{"ˆ{ˆ{ˆ{ ˆ{ˆ{ÿ‡{ø‡{ñ‡{ê‡{ã‡{܇{Õ‡{·{LJ{À‡{¹‡{²‡{«‡{¤‡{‡{–‡{‡{ˆ‡{‡{z‡{s‡{l‡{e‡{^‡{W‡{P‡{I‡{B‡{;‡{4‡{-‡{&‡{‡{‡{‡{ ‡{‡{ü†{õ†{î†{ç†{à†{Ù†{Ò†{ˆ{Ć{½†{¶†{¯†{¨†{¡†{š†{“†{Œ†{…†{~†{w†{p†{i†{b†{[†{T†{M†{F†{?†{8†{1†{*†{#†{†{†{†{†{†{ù…{ò…{ë…{ä…{Ý…{Ö…{Ï…{È…{Á…{º…{³…{¬…{¥…{ž…{—…{…{‰…{‚…{{…{t…{m…{f…{_…{X…{Q…{J…{C…{<…{5…{.…{'…{ …{…{…{ …{…{ý„{ö„{ï„{è„{á„{Ú„{Ó„{Ì„{Å„{¾„{·„{°„{©„{¢„{›„{”„{„{†„{„{x„{q„{j„{c„{\„{U„{N„{G„{@„{9„{2„{+„{$„{„{„{„{„{„{úƒ{óƒ{ìƒ{åƒ{Þƒ{׃{Ѓ{Ƀ{ƒ{»ƒ{´ƒ{­ƒ{¦ƒ{Ÿƒ{˜ƒ{‘ƒ{Šƒ{ƒƒ{|ƒ{uƒ{nƒ{gƒ{`ƒ{Yƒ{Rƒ{Kƒ{Dƒ{=ƒ{6ƒ{/ƒ{(ƒ{!ƒ{ƒ{ƒ{ ƒ{ƒ{þ‚{÷‚{ð‚{é‚{â‚{Û‚{Ô‚{Í‚{Æ‚{¿‚{¸‚{±‚{ª‚{£‚{œ‚{•‚{Ž‚{‡‚{€‚{y‚{r‚{k‚{d‚{]‚{V‚{O‚{H‚{A‚{:‚{3‚{,‚{%‚{‚{‚{‚{ ‚{‚{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿ€{ø€{ñ€{ê€{ã€{Ü€{Õ€{΀{Ç€{À€{¹€{²€{«€{¤€{€{–€{€{ˆ€{€{z€{s€{l€{e€{^€{W€{P€{I€{B€{;€{4€{-€{&€{€{€{€{ €{€{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù~{ò~{ë~{ä~{Ý~{Ö~{Ï~{È~{Á~{º~{³~{¬~{¥~{ž~{—~{~{‰~{‚~{{~{t~{m~{f~{_~{X~{Q~{J~{C~{<~{5~{.~{'~{ ~{~{~{ ~{~{ý}{ö}{ï}{è}{á}{Ú}{Ó}{Ì}{Å}{¾}{·}{°}{©}{¢}{›}{”}{}{†}{}{x}{q}{j}{c}{\}{U}{N}{G}{@}{9}{2}{+}{$}{}{}{}{}{}{ú|{ó|{ì|{å|{Þ|{×|{Ð|{É|{Â|{»|{´|{­|{¦|{Ÿ|{˜|{‘|{Š|{ƒ|{||{u|{n|{g|{`|{Y|{R|{K|{D|{=|{6|{/|{(|{!|{|{|{ |{|{þ{{÷{{ð{{é{{â{{Û{{Ô{{Í{{Æ{{¿{{¸{{±{{ª{{£{{œ{{•{{Ž{{‡{{€{{y{{r{{k{{d{{]{{V{{O{{H{{A{{:{{3{{,{{%{{{{{{{{ {{{{ûz{ôz{íz{æz{ßz{Øz{Ñz{Êz{Ãz{¼z{µz{®z{§z{ z{™z{’z{‹z{„z{}z{vz{oz{hz{az{Zz{Sz{Lz{Ez{>z{7z{0z{)z{"z{z{z{ z{z{ÿy{øy{ñy{êy{ãy{Üy{Õy{Îy{Çy{Ày{¹y{²y{«y{¤y{y{–y{y{ˆy{y{zy{sy{ly{ey{^y{Wy{Py{Iy{By{;y{4y{-y{&y{y{y{y{ y{y{üx{õx{îx{çx{àx{Ùx{Òx{Ëx{Äx{½x{¶x{¯x{¨x{¡x{šx{“x{Œx{…x{~x{wx{px{ix{bx{[x{Tx{Mx{Fx{?x{8x{1x{*x{#x{x{x{x{x{x{ùw{òw{ëw{äw{Ýw{Öw{Ïw{Èw{Áw{ºw{³w{¬w{¥w{žw{—w{w{‰w{‚w{{w{tw{mw{fw{_w{Xw{Qw{Jw{Cw{s{7s{0s{)s{"s{s{s{ s{s{ÿr{ør{ñr{êr{ãr{Ür{Õr{Îr{Çr{Àr{¹r{²r{«r{¤r{r{–r{r{ˆr{r{zr{sr{lr{er{^r{Wr{Pr{Ir{Br{;r{4r{-r{&r{r{r{r{ r{r{üq{õq{îq{çq{àq{Ùq{Òq{Ëq{Äq{½q{¶q{¯q{¨q{¡q{šq{“q{Œq{…q{~q{wq{pq{iq{bq{[q{Tq{Mq{Fq{?q{8q{1q{*q{#q{q{q{q{q{q{ùp{òp{ëp{äp{Ýp{Öp{Ïp{Èp{Áp{ºp{³p{¬p{¥p{žp{—p{p{‰p{‚p{{p{tp{mp{fp{_p{Xp{Qp{Jp{Cp{l{7l{0l{)l{"l{l{l{ l{l{ÿk{øk{ñk{êk{ãk{Ük{Õk{Îk{Çk{Àk{¹k{²k{«k{¤k{k{–k{k{ˆk{k{zk{sk{lk{ek{^k{Wk{Pk{Ik{Bk{;k{4k{-k{&k{k{k{k{ k{k{üj{õj{îj{çj{àj{Ùj{Òj{Ëj{Äj{½j{¶j{¯j{¨j{¡j{šj{“j{Œj{…j{~j{wj{pj{ij{bj{[j{Tj{Mj{Fj{?j{8j{1j{*j{#j{j{j{j{j{j{ùi{òi{ëi{äi{Ýi{Öi{Ïi{Èi{Ái{ºi{³i{¬i{¥i{ži{—i{i{‰i{‚i{{i{ti{mi{fi{_i{Xi{Qi{Ji{Ci{e{7e{0e{)e{"e{e{e{ e{e{ÿd{ød{ñd{êd{ãd{Üd{Õd{Îd{Çd{Àd{¹d{²d{«d{¤d{d{–d{d{ˆd{d{zd{sd{ld{ed{^d{Wd{Pd{Id{Bd{;d{4d{-d{&d{d{d{d{ d{d{üc{õc{îc{çc{àc{Ùc{Òc{Ëc{Äc{½c{¶c{¯c{¨c{¡c{šc{“c{Œc{…c{~c{wc{pc{ic{bc{[c{Tc{Mc{Fc{?c{8c{1c{*c{#c{c{c{c{c{c{ùb{òb{ëb{äb{Ýb{Öb{Ïb{Èb{Áb{ºb{³b{¬b{¥b{žb{—b{b{‰b{‚b{{b{tb{mb{fb{_b{Xb{Qb{Jb{Cb{^{7^{0^{)^{"^{^{^{ ^{^{ÿ]{ø]{ñ]{ê]{ã]{Ü]{Õ]{Î]{Ç]{À]{¹]{²]{«]{¤]{]{–]{]{ˆ]{]{z]{s]{l]{e]{^]{W]{P]{I]{B]{;]{4]{-]{&]{]{]{]{ ]{]{ü\{õ\{î\{ç\{à\{Ù\{Ò\{Ë\{Ä\{½\{¶\{¯\{¨\{¡\{š\{“\{Œ\{…\{~\{w\{p\{i\{b\{[\{T\{M\{F\{?\{8\{1\{*\{#\{\{\{\{\{\{ù[{ò[{ë[{ä[{Ý[{Ö[{Ï[{È[{Á[{º[{³[{¬[{¥[{ž[{—[{[{‰[{‚[{{[{t[{m[{f[{_[{X[{Q[{J[{C[{<[{5[{.[{'[{ [{[{[{ [{[{ýZ{öZ{ïZ{èZ{áZ{ÚZ{ÓZ{ÌZ{ÅZ{¾Z{·Z{°Z{©Z{¢Z{›Z{”Z{Z{†Z{Z{xZ{qZ{jZ{cZ{\Z{UZ{NZ{GZ{@Z{9Z{2Z{+Z{$Z{Z{Z{Z{Z{Z{úY{óY{ìY{åY{ÞY{×Y{ÐY{ÉY{ÂY{»Y{´Y{­Y{¦Y{ŸY{˜Y{‘Y{ŠY{ƒY{|Y{uY{nY{gY{`Y{YY{RY{KY{DY{=Y{6Y{/Y{(Y{!Y{Y{Y{ Y{Y{þX{÷X{ðX{éX{âX{ÛX{ÔX{ÍX{ÆX{¿X{¸X{±X{ªX{£X{œX{•X{ŽX{‡X{€X{yX{rX{kX{dX{]X{VX{OX{HX{AX{:X{3X{,X{%X{X{X{X{ X{X{ûW{ôW{íW{æW{ßW{ØW{ÑW{ÊW{ÃW{¼W{µW{®W{§W{ W{™W{’W{‹W{„W{}W{vW{oW{hW{aW{ZW{SW{LW{EW{>W{7W{0W{)W{"W{W{W{ W{W{ÿV{øV{ñV{êV{ãV{ÜV{ÕV{ÎV{ÇV{ÀV{¹V{²V{«V{¤V{V{–V{V{ˆV{V{zV{sV{lV{eV{^V{WV{PV{IV{BV{;V{4V{-V{&V{V{V{V{ V{V{üU{õU{îU{çU{àU{ÙU{ÒU{ËU{ÄU{½U{¶U{¯U{¨U{¡U{šU{“U{ŒU{…U{~U{wU{pU{iU{bU{[U{TU{MU{FU{?U{8U{1U{*U{#U{U{U{U{U{U{ùT{òT{ëT{äT{ÝT{ÖT{ÏT{ÈT{ÁT{ºT{³T{¬T{¥T{žT{—T{T{‰T{‚T{{T{tT{mT{fT{_T{XT{QT{JT{CT{P{7P{0P{)P{"P{P{P{ P{P{ÿO{øO{ñO{êO{ãO{ÜO{ÕO{ÎO{ÇO{ÀO{¹O{²O{«O{¤O{O{–O{O{ˆO{O{zO{sO{lO{eO{^O{WO{PO{IO{BO{;O{4O{-O{&O{O{O{O{ O{O{üN{õN{îN{çN{àN{ÙN{ÒN{ËN{ÄN{½N{¶N{¯N{¨N{¡N{šN{“N{ŒN{…N{~N{wN{pN{iN{bN{[N{TN{MN{FN{?N{8N{1N{*N{#N{N{N{N{N{N{ùM{òM{ëM{äM{ÝM{ÖM{ÏM{ÈM{ÁM{ºM{³M{¬M{¥M{žM{—M{M{‰M{‚M{{M{tM{mM{fM{_M{XM{QM{JM{CM{I{7I{0I{)I{"I{I{I{ I{I{ÿH{øH{ñH{êH{ãH{ÜH{ÕH{ÎH{ÇH{ÀH{¹H{²H{«H{¤H{H{–H{H{ˆH{H{zH{sH{lH{eH{^H{WH{PH{IH{BH{;H{4H{-H{&H{H{H{H{ H{H{üG{õG{îG{çG{àG{ÙG{ÒG{ËG{ÄG{½G{¶G{¯G{¨G{¡G{šG{“G{ŒG{…G{~G{wG{pG{iG{bG{[G{TG{MG{FG{?G{8G{1G{*G{#G{G{G{G{G{G{ùF{òF{ëF{äF{ÝF{ÖF{ÏF{ÈF{ÁF{ºF{³F{¬F{¥F{žF{—F{F{‰F{‚F{{F{tF{mF{fF{_F{XF{QF{JF{CF{B{7B{0B{)B{"B{B{B{ B{B{ÿA{øA{ñA{êA{ãA{ÜA{ÕA{ÎA{ÇA{ÀA{¹A{²A{«A{¤A{A{–A{A{ˆA{A{zA{sA{lA{eA{^A{WA{PA{IA{BA{;A{4A{-A{&A{A{A{A{ A{A{ü@{õ@{î@{ç@{à@{Ù@{Ò@{Ë@{Ä@{½@{¶@{¯@{¨@{¡@{š@{“@{Œ@{…@{~@{w@{p@{i@{b@{[@{T@{M@{F@{?@{8@{1@{*@{#@{@{@{@{@{@{ù?{ò?{ë?{ä?{Ý?{Ö?{Ï?{È?{Á?{º?{³?{¬?{¥?{ž?{—?{?{‰?{‚?{{?{t?{m?{f?{_?{X?{Q?{J?{C?{{ö>{ï>{è>{á>{Ú>{Ó>{Ì>{Å>{¾>{·>{°>{©>{¢>{›>{”>{>{†>{>{x>{q>{j>{c>{\>{U>{N>{G>{@>{9>{2>{+>{$>{>{>{>{>{>{ú={ó={ì={å={Þ={×={Ð={É={Â={»={´={­={¦={Ÿ={˜={‘={Š={ƒ={|={u={n={g={`={Y={R={K={D={=={6={/={(={!={={={ ={={þ<{÷<{ð<{é<{â<{Û<{Ô<{Í<{Æ<{¿<{¸<{±<{ª<{£<{œ<{•<{Ž<{‡<{€<{y<{r<{k<{d<{]<{V<{O<{H<{A<{:<{3<{,<{%<{<{<{<{ <{<{û;{ô;{í;{æ;{ß;{Ø;{Ñ;{Ê;{Ã;{¼;{µ;{®;{§;{ ;{™;{’;{‹;{„;{};{v;{o;{h;{a;{Z;{S;{L;{E;{>;{7;{0;{);{";{;{;{ ;{;{ÿ:{ø:{ñ:{ê:{ã:{Ü:{Õ:{Î:{Ç:{À:{¹:{²:{«:{¤:{:{–:{:{ˆ:{:{z:{s:{l:{e:{^:{W:{P:{I:{B:{;:{4:{-:{&:{:{:{:{ :{:{ü9{õ9{î9{ç9{à9{Ù9{Ò9{Ë9{Ä9{½9{¶9{¯9{¨9{¡9{š9{“9{Œ9{…9{~9{w9{p9{i9{b9{[9{T9{M9{F9{?9{89{19{*9{#9{9{9{9{9{9{ù8{ò8{ë8{ä8{Ý8{Ö8{Ï8{È8{Á8{º8{³8{¬8{¥8{ž8{—8{8{‰8{‚8{{8{t8{m8{f8{_8{X8{Q8{J8{C8{<8{58{.8{'8{ 8{8{8{ 8{8{ý7{ö7{ï7{è7{á7{Ú7{Ó7{Ì7{Å7{¾7{·7{°7{©7{¢7{›7{”7{7{†7{7{x7{q7{j7{c7{\7{U7{N7{G7{@7{97{27{+7{$7{7{7{7{7{7{ú6{ó6{ì6{å6{Þ6{×6{Ð6{É6{Â6{»6{´6{­6{¦6{Ÿ6{˜6{‘6{Š6{ƒ6{|6{u6{n6{g6{`6{Y6{R6{K6{D6{=6{66{/6{(6{!6{6{6{ 6{6{þ5{÷5{ð5{é5{â5{Û5{Ô5{Í5{Æ5{¿5{¸5{±5{ª5{£5{œ5{•5{Ž5{‡5{€5{y5{r5{k5{d5{]5{V5{O5{H5{A5{:5{35{,5{%5{5{5{5{ 5{5{û4{ô4{í4{æ4{ß4{Ø4{Ñ4{Ê4{Ã4{¼4{µ4{®4{§4{ 4{™4{’4{‹4{„4{}4{v4{o4{h4{a4{Z4{S4{L4{E4{>4{74{04{)4{"4{4{4{ 4{4{ÿ3{ø3{ñ3{ê3{ã3{Ü3{Õ3{Î3{Ç3{À3{¹3{²3{«3{¤3{3{–3{3{ˆ3{3{z3{s3{l3{e3{^3{W3{P3{I3{B3{;3{43{-3{&3{3{3{3{ 3{3{ü2{õ2{î2{ç2{à2{Ù2{Ò2{Ë2{Ä2{½2{¶2{¯2{¨2{¡2{š2{“2{Œ2{…2{~2{w2{p2{i2{b2{[2{T2{M2{F2{?2{82{12{*2{#2{2{2{2{2{2{ù1{ò1{ë1{ä1{Ý1{Ö1{Ï1{È1{Á1{º1{³1{¬1{¥1{ž1{—1{1{‰1{‚1{{1{t1{m1{f1{_1{X1{Q1{J1{C1{<1{51{.1{'1{ 1{1{1{ 1{1{ý0{ö0{ï0{è0{á0{Ú0{Ó0{Ì0{Å0{¾0{·0{°0{©0{¢0{›0{”0{0{†0{0{x0{q0{j0{c0{\0{U0{N0{G0{@0{90{20{+0{$0{0{0{0{0{0{ú/{ó/{ì/{å/{Þ/{×/{Ð/{É/{Â/{»/{´/{­/{¦/{Ÿ/{˜/{‘/{Š/{ƒ/{|/{u/{n/{g/{`/{Y/{R/{K/{D/{=/{6/{//{(/{!/{/{/{ /{/{þ.{÷.{ð.{é.{â.{Û.{Ô.{Í.{Æ.{¿.{¸.{±.{ª.{£.{œ.{•.{Ž.{‡.{€.{y.{r.{k.{d.{].{V.{O.{H.{A.{:.{3.{,.{%.{.{.{.{ .{.{û-{ô-{í-{æ-{ß-{Ø-{Ñ-{Ê-{Ã-{¼-{µ-{®-{§-{ -{™-{’-{‹-{„-{}-{v-{o-{h-{a-{Z-{S-{L-{E-{>-{7-{0-{)-{"-{-{-{ -{-{ÿ,{ø,{ñ,{ê,{ã,{Ü,{Õ,{Î,{Ç,{À,{¹,{²,{«,{¤,{,{–,{,{ˆ,{,{z,{s,{l,{e,{^,{W,{P,{I,{B,{;,{4,{-,{&,{,{,{,{ ,{,{ü+{õ+{î+{ç+{à+{Ù+{Ò+{Ë+{Ä+{½+{¶+{¯+{¨+{¡+{š+{“+{Œ+{…+{~+{w+{p+{i+{b+{[+{T+{M+{F+{?+{8+{1+{*+{#+{+{+{+{+{+{ù*{ò*{ë*{ä*{Ý*{Ö*{Ï*{È*{Á*{º*{³*{¬*{¥*{ž*{—*{*{‰*{‚*{{*{t*{m*{f*{_*{X*{Q*{J*{C*{<*{5*{.*{'*{ *{*{*{ *{*{ý){ö){ï){è){á){Ú){Ó){Ì){Å){¾){·){°){©){¢){›){”){){†){){x){q){j){c){\){U){N){G){@){9){2){+){$){){){){){){ú({ó({ì({å({Þ({×({Ð({É({Â({»({´({­({¦({Ÿ({˜({‘({Š({ƒ({|({u({n({g({`({Y({R({K({D({=({6({/({(({!({({({ ({({þ'{÷'{ð'{é'{â'{Û'{Ô'{Í'{Æ'{¿'{¸'{±'{ª'{£'{œ'{•'{Ž'{‡'{€'{y'{r'{k'{d'{]'{V'{O'{H'{A'{:'{3'{,'{%'{'{'{'{ '{'{û&{ô&{í&{æ&{ß&{Ø&{Ñ&{Ê&{Ã&{¼&{µ&{®&{§&{ &{™&{’&{‹&{„&{}&{v&{o&{h&{a&{Z&{S&{L&{E&{>&{7&{0&{)&{"&{&{&{ &{&{ÿ%{ø%{ñ%{ê%{ã%{Ü%{Õ%{Î%{Ç%{À%{¹%{²%{«%{¤%{%{–%{%{ˆ%{%{z%{s%{l%{e%{^%{W%{P%{I%{B%{;%{4%{-%{&%{%{%{%{ %{%{ü${õ${î${ç${à${Ù${Ò${Ë${Ä${½${¶${¯${¨${¡${š${“${Œ${…${~${w${p${i${b${[${T${M${F${?${8${1${*${#${${${${${${ù#{ò#{ë#{ä#{Ý#{Ö#{Ï#{È#{Á#{º#{³#{¬#{¥#{ž#{—#{#{‰#{‚#{{#{t#{m#{f#{_#{X#{Q#{J#{C#{<#{5#{.#{'#{ #{#{#{ #{#{ý"{ö"{ï"{è"{á"{Ú"{Ó"{Ì"{Å"{¾"{·"{°"{©"{¢"{›"{”"{"{†"{"{x"{q"{j"{c"{\"{U"{N"{G"{@"{9"{2"{+"{$"{"{"{"{"{"{ú!{ó!{ì!{å!{Þ!{×!{Ð!{É!{Â!{»!{´!{­!{¦!{Ÿ!{˜!{‘!{Š!{ƒ!{|!{u!{n!{g!{`!{Y!{R!{K!{D!{=!{6!{/!{(!{!!{!{!{ !{!{þ {÷ {ð {é {â {Û {Ô {Í {Æ {¿ {¸ {± {ª {£ {œ {• {Ž {‡ {€ {y {r {k {d {] {V {O {H {A {: {3 {, {% { { { { { {û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ý {ö {ï {è {á {Ú {Ó {Ì {Å {¾ {· {° {© {¢ {› {” { {† { {x {q {j {c {\ {U {N {G {@ {9 {2 {+ {$ { { { { { {ú {ó {ì {å {Þ {× {Ð {É { {» {´ {­ {¦ {Ÿ {˜ {‘ {Š {ƒ {| {u {n {g {` {Y {R {K {D {= {6 {/ {( {! { { { { {þ {÷ {ð {é {â {Û {Ô {Í {Æ {¿ {¸ {± {ª {£ {œ {• {Ž {‡ {€ {y {r {k {d {] {V {O {H {A {: {3 {, {% { { { { { {û {ô {í {æ {ß {Ø {Ñ {Ê {à {¼ {µ {® {§ {  {™ {’ {‹ {„ {} {v {o {h {a {Z {S {L {E {> {7 {0 {) {" { { { { {ÿ {ø {ñ {ê {ã {Ü {Õ {Î {Ç {À {¹ {² {« {¤ { {– { {ˆ { {z {s {l {e {^ {W {P {I {B {; {4 {- {& { { { { { {ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýÿzöÿzïÿzèÿzáÿzÚÿzÓÿzÌÿzÅÿz¾ÿz·ÿz°ÿz©ÿz¢ÿz›ÿz”ÿzÿz†ÿzÿzxÿzqÿzjÿzcÿz\ÿzUÿzNÿzGÿz@ÿz9ÿz2ÿz+ÿz$ÿzÿzÿzÿzÿzÿzúþzóþzìþzåþzÞþz×þzÐþzÉþzÂþz»þz´þz­þz¦þzŸþz˜þz‘þzŠþzƒþz|þzuþznþzgþz`þzYþzRþzKþzDþz=þz6þz/þz(þz!þzþzþz þzþzþýz÷ýzðýzéýzâýzÛýzÔýzÍýzÆýz¿ýz¸ýz±ýzªýz£ýzœýz•ýzŽýz‡ýz€ýzyýzrýzkýzdýz]ýzVýzOýzHýzAýz:ýz3ýz,ýz%ýzýzýzýz ýzýzûüzôüzíüzæüzßüzØüzÑüzÊüzÃüz¼üzµüz®üz§üz üz™üz’üz‹üz„üz}üzvüzoüzhüzaüzZüzSüzLüzEüz>üz7üz0üz)üz"üzüzüz üzüzÿûzøûzñûzêûzãûzÜûzÕûzÎûzÇûzÀûz¹ûz²ûz«ûz¤ûzûz–ûzûzˆûzûzzûzsûzlûzeûz^ûzWûzPûzIûzBûz;ûz4ûz-ûz&ûzûzûzûz ûzûzüúzõúzîúzçúzàúzÙúzÒúzËúzÄúz½úz¶úz¯úz¨úz¡úzšúz“úzŒúz…úz~úzwúzpúziúzbúz[úzTúzMúzFúz?úz8úz1úz*úz#úzúzúzúzúzúzùùzòùzëùzäùzÝùzÖùzÏùzÈùzÁùzºùz³ùz¬ùz¥ùzžùz—ùzùz‰ùz‚ùz{ùztùzmùzfùz_ùzXùzQùzJùzCùz<ùz5ùz.ùz'ùz ùzùzùz ùzùzýøzöøzïøzèøzáøzÚøzÓøzÌøzÅøz¾øz·øz°øz©øz¢øz›øz”øzøz†øzøzxøzqøzjøzcøz\øzUøzNøzGøz@øz9øz2øz+øz$øzøzøzøzøzøzú÷zó÷zì÷zå÷zÞ÷z×÷zÐ÷zÉ÷zÂ÷z»÷z´÷z­÷z¦÷zŸ÷z˜÷z‘÷zŠ÷zƒ÷z|÷zu÷zn÷zg÷z`÷zY÷zR÷zK÷zD÷z=÷z6÷z/÷z(÷z!÷z÷z÷z ÷z÷zþöz÷özðözéözâözÛözÔözÍözÆöz¿öz¸öz±özªöz£özœöz•özŽöz‡öz€özyözrözközdöz]özVözOözHözAöz:öz3öz,öz%özözözöz özözûõzôõzíõzæõzßõzØõzÑõzÊõzÃõz¼õzµõz®õz§õz õz™õz’õz‹õz„õz}õzvõzoõzhõzaõzZõzSõzLõzEõz>õz7õz0õz)õz"õzõzõz õzõzÿôzøôzñôzêôzãôzÜôzÕôzÎôzÇôzÀôz¹ôz²ôz«ôz¤ôzôz–ôzôzˆôzôzzôzsôzlôzeôz^ôzWôzPôzIôzBôz;ôz4ôz-ôz&ôzôzôzôz ôzôzüózõózîózçózàózÙózÒózËózÄóz½óz¶óz¯óz¨óz¡ózšóz“ózŒóz…óz~ózwózpóziózbóz[ózTózMózFóz?óz8óz1óz*óz#ózózózózózózùòzòòzëòzäòzÝòzÖòzÏòzÈòzÁòzºòz³òz¬òz¥òzžòz—òzòz‰òz‚òz{òztòzmòzfòz_òzXòzQòzJòzCòz<òz5òz.òz'òz òzòzòz òzòzýñzöñzïñzèñzáñzÚñzÓñzÌñzÅñz¾ñz·ñz°ñz©ñz¢ñz›ñz”ñzñz†ñzñzxñzqñzjñzcñz\ñzUñzNñzGñz@ñz9ñz2ñz+ñz$ñzñzñzñzñzñzúðzóðzìðzåðzÞðz×ðzÐðzÉðzÂðz»ðz´ðz­ðz¦ðzŸðz˜ðz‘ðzŠðzƒðz|ðzuðznðzgðz`ðzYðzRðzKðzDðz=ðz6ðz/ðz(ðz!ðzðzðz ðzðzþïz÷ïzðïzéïzâïzÛïzÔïzÍïzÆïz¿ïz¸ïz±ïzªïz£ïzœïz•ïzŽïz‡ïz€ïzyïzrïzkïzdïz]ïzVïzOïzHïzAïz:ïz3ïz,ïz%ïzïzïzïz ïzïzûîzôîzíîzæîzßîzØîzÑîzÊîzÃîz¼îzµîz®îz§îz îz™îz’îz‹îz„îz}îzvîzoîzhîzaîzZîzSîzLîzEîz>îz7îz0îz)îz"îzîzîz îzîzÿízøízñízêízãízÜízÕízÎízÇízÀíz¹íz²íz«íz¤ízíz–ízízˆízízzízsízlízeíz^ízWízPízIízBíz;íz4íz-íz&ízízízíz ízízüìzõìzîìzçìzàìzÙìzÒìzËìzÄìz½ìz¶ìz¯ìz¨ìz¡ìzšìz“ìzŒìz…ìz~ìzwìzpìziìzbìz[ìzTìzMìzFìz?ìz8ìz1ìz*ìz#ìzìzìzìzìzìzùëzòëzëëzäëzÝëzÖëzÏëzÈëzÁëzºëz³ëz¬ëz¥ëzžëz—ëzëz‰ëz‚ëz{ëztëzmëzfëz_ëzXëzQëzJëzCëz<ëz5ëz.ëz'ëz ëzëzëz ëzëzýêzöêzïêzèêzáêzÚêzÓêzÌêzÅêz¾êz·êz°êz©êz¢êz›êz”êzêz†êzêzxêzqêzjêzcêz\êzUêzNêzGêz@êz9êz2êz+êz$êzêzêzêzêzêzúézóézìézåézÞéz×ézÐézÉézÂéz»éz´éz­éz¦ézŸéz˜éz‘ézŠézƒéz|ézuéznézgéz`ézYézRézKézDéz=éz6éz/éz(éz!ézézéz ézézþèz÷èzðèzéèzâèzÛèzÔèzÍèzÆèz¿èz¸èz±èzªèz£èzœèz•èzŽèz‡èz€èzyèzrèzkèzdèz]èzVèzOèzHèzAèz:èz3èz,èz%èzèzèzèz èzèzûçzôçzíçzæçzßçzØçzÑçzÊçzÃçz¼çzµçz®çz§çz çz™çz’çz‹çz„çz}çzvçzoçzhçzaçzZçzSçzLçzEçz>çz7çz0çz)çz"çzçzçz çzçzÿæzøæzñæzêæzãæzÜæzÕæzÎæzÇæzÀæz¹æz²æz«æz¤æzæz–æzæzˆæzæzzæzsæzlæzeæz^æzWæzPæzIæzBæz;æz4æz-æz&æzæzæzæz æzæzüåzõåzîåzçåzàåzÙåzÒåzËåzÄåz½åz¶åz¯åz¨åz¡åzšåz“åzŒåz…åz~åzwåzpåziåzbåz[åzTåzMåzFåz?åz8åz1åz*åz#åzåzåzåzåzåzùäzòäzëäzääzÝäzÖäzÏäzÈäzÁäzºäz³äz¬äz¥äzžäz—äzäz‰äz‚äz{äztäzmäzfäz_äzXäzQäzJäzCäz<äz5äz.äz'äz äzäzäz äzäzýãzöãzïãzèãzáãzÚãzÓãzÌãzÅãz¾ãz·ãz°ãz©ãz¢ãz›ãz”ãzãz†ãzãzxãzqãzjãzcãz\ãzUãzNãzGãz@ãz9ãz2ãz+ãz$ãzãzãzãzãzãzúâzóâzìâzåâzÞâz×âzÐâzÉâzÂâz»âz´âz­âz¦âzŸâz˜âz‘âzŠâzƒâz|âzuâznâzgâz`âzYâzRâzKâzDâz=âz6âz/âz(âz!âzâzâz âzâzþáz÷ázðázéázâázÛázÔázÍázÆáz¿áz¸áz±ázªáz£ázœáz•ázŽáz‡áz€ázyázrázkázdáz]ázVázOázHázAáz:áz3áz,áz%ázázázáz ázázûàzôàzíàzæàzßàzØàzÑàzÊàzÃàz¼àzµàz®àz§àz àz™àz’àz‹àz„àz}àzvàzoàzhàzaàzZàzSàzLàzEàz>àz7àz0àz)àz"àzàzàz àzàzÿßzøßzñßzêßzãßzÜßzÕßzÎßzÇßzÀßz¹ßz²ßz«ßz¤ßzßz–ßzßzˆßzßzzßzsßzlßzeßz^ßzWßzPßzIßzBßz;ßz4ßz-ßz&ßzßzßzßz ßzßzüÞzõÞzîÞzçÞzàÞzÙÞzÒÞzËÞzÄÞz½Þz¶Þz¯Þz¨Þz¡ÞzšÞz“ÞzŒÞz…Þz~ÞzwÞzpÞziÞzbÞz[ÞzTÞzMÞzFÞz?Þz8Þz1Þz*Þz#ÞzÞzÞzÞzÞzÞzùÝzòÝzëÝzäÝzÝÝzÖÝzÏÝzÈÝzÁÝzºÝz³Ýz¬Ýz¥ÝzžÝz—ÝzÝz‰Ýz‚Ýz{ÝztÝzmÝzfÝz_ÝzXÝzQÝzJÝzCÝz<Ýz5Ýz.Ýz'Ýz ÝzÝzÝz ÝzÝzýÜzöÜzïÜzèÜzáÜzÚÜzÓÜzÌÜzÅÜz¾Üz·Üz°Üz©Üz¢Üz›Üz”ÜzÜz†ÜzÜzxÜzqÜzjÜzcÜz\ÜzUÜzNÜzGÜz@Üz9Üz2Üz+Üz$ÜzÜzÜzÜzÜzÜzúÛzóÛzìÛzåÛzÞÛz×ÛzÐÛzÉÛzÂÛz»Ûz´Ûz­Ûz¦ÛzŸÛz˜Ûz‘ÛzŠÛzƒÛz|ÛzuÛznÛzgÛz`ÛzYÛzRÛzKÛzDÛz=Ûz6Ûz/Ûz(Ûz!ÛzÛzÛz ÛzÛzþÚz÷ÚzðÚzéÚzâÚzÛÚzÔÚzÍÚzÆÚz¿Úz¸Úz±ÚzªÚz£ÚzœÚz•ÚzŽÚz‡Úz€ÚzyÚzrÚzkÚzdÚz]ÚzVÚzOÚzHÚzAÚz:Úz3Úz,Úz%ÚzÚzÚzÚz ÚzÚzûÙzôÙzíÙzæÙzßÙzØÙzÑÙzÊÙzÃÙz¼ÙzµÙz®Ùz§Ùz Ùz™Ùz’Ùz‹Ùz„Ùz}ÙzvÙzoÙzhÙzaÙzZÙzSÙzLÙzEÙz>Ùz7Ùz0Ùz)Ùz"ÙzÙzÙz ÙzÙzÿØzøØzñØzêØzãØzÜØzÕØzÎØzÇØzÀØz¹Øz²Øz«Øz¤ØzØz–ØzØzˆØzØzzØzsØzlØzeØz^ØzWØzPØzIØzBØz;Øz4Øz-Øz&ØzØzØzØz ØzØzü×zõ×zî×zç×zà×zÙ×zÒ×zË×zÄ×z½×z¶×z¯×z¨×z¡×zš×z“×zŒ×z…×z~×zw×zp×zi×zb×z[×zT×zM×zF×z?×z8×z1×z*×z#×z×z×z×z×z×zùÖzòÖzëÖzäÖzÝÖzÖÖzÏÖzÈÖzÁÖzºÖz³Öz¬Öz¥ÖzžÖz—ÖzÖz‰Öz‚Öz{ÖztÖzmÖzfÖz_ÖzXÖzQÖzJÖzCÖz<Öz5Öz.Öz'Öz ÖzÖzÖz ÖzÖzýÕzöÕzïÕzèÕzáÕzÚÕzÓÕzÌÕzÅÕz¾Õz·Õz°Õz©Õz¢Õz›Õz”ÕzÕz†ÕzÕzxÕzqÕzjÕzcÕz\ÕzUÕzNÕzGÕz@Õz9Õz2Õz+Õz$ÕzÕzÕzÕzÕzÕzúÔzóÔzìÔzåÔzÞÔz×ÔzÐÔzÉÔzÂÔz»Ôz´Ôz­Ôz¦ÔzŸÔz˜Ôz‘ÔzŠÔzƒÔz|ÔzuÔznÔzgÔz`ÔzYÔzRÔzKÔzDÔz=Ôz6Ôz/Ôz(Ôz!ÔzÔzÔz ÔzÔzþÓz÷ÓzðÓzéÓzâÓzÛÓzÔÓzÍÓzÆÓz¿Óz¸Óz±ÓzªÓz£ÓzœÓz•ÓzŽÓz‡Óz€ÓzyÓzrÓzkÓzdÓz]ÓzVÓzOÓzHÓzAÓz:Óz3Óz,Óz%ÓzÓzÓzÓz ÓzÓzûÒzôÒzíÒzæÒzßÒzØÒzÑÒzÊÒzÃÒz¼ÒzµÒz®Òz§Òz Òz™Òz’Òz‹Òz„Òz}ÒzvÒzoÒzhÒzaÒzZÒzSÒzLÒzEÒz>Òz7Òz0Òz)Òz"ÒzÒzÒz ÒzÒzÿÑzøÑzñÑzêÑzãÑzÜÑzÕÑzÎÑzÇÑzÀÑz¹Ñz²Ñz«Ñz¤ÑzÑz–ÑzÑzˆÑzÑzzÑzsÑzlÑzeÑz^ÑzWÑzPÑzIÑzBÑz;Ñz4Ñz-Ñz&ÑzÑzÑzÑz ÑzÑzüÐzõÐzîÐzçÐzàÐzÙÐzÒÐzËÐzÄÐz½Ðz¶Ðz¯Ðz¨Ðz¡ÐzšÐz“ÐzŒÐz…Ðz~ÐzwÐzpÐziÐzbÐz[ÐzTÐzMÐzFÐz?Ðz8Ðz1Ðz*Ðz#ÐzÐzÐzÐzÐzÐzùÏzòÏzëÏzäÏzÝÏzÖÏzÏÏzÈÏzÁÏzºÏz³Ïz¬Ïz¥ÏzžÏz—ÏzÏz‰Ïz‚Ïz{ÏztÏzmÏzfÏz_ÏzXÏzQÏzJÏzCÏz<Ïz5Ïz.Ïz'Ïz ÏzÏzÏz ÏzÏzýÎzöÎzïÎzèÎzáÎzÚÎzÓÎzÌÎzÅÎz¾Îz·Îz°Îz©Îz¢Îz›Îz”ÎzÎz†ÎzÎzxÎzqÎzjÎzcÎz\ÎzUÎzNÎzGÎz@Îz9Îz2Îz+Îz$ÎzÎzÎzÎzÎzÎzúÍzóÍzìÍzåÍzÞÍz×ÍzÐÍzÉÍzÂÍz»Íz´Íz­Íz¦ÍzŸÍz˜Íz‘ÍzŠÍzƒÍz|ÍzuÍznÍzgÍz`ÍzYÍzRÍzKÍzDÍz=Íz6Íz/Íz(Íz!ÍzÍzÍz ÍzÍzþÌz÷ÌzðÌzéÌzâÌzÛÌzÔÌzÍÌzÆÌz¿Ìz¸Ìz±ÌzªÌz£ÌzœÌz•ÌzŽÌz‡Ìz€ÌzyÌzrÌzkÌzdÌz]ÌzVÌzOÌzHÌzAÌz:Ìz3Ìz,Ìz%ÌzÌzÌzÌz ÌzÌzûËzôËzíËzæËzßËzØËzÑËzÊËzÃËz¼ËzµËz®Ëz§Ëz Ëz™Ëz’Ëz‹Ëz„Ëz}ËzvËzoËzhËzaËzZËzSËzLËzEËz>Ëz7Ëz0Ëz)Ëz"ËzËzËz ËzËzÿÊzøÊzñÊzêÊzãÊzÜÊzÕÊzÎÊzÇÊzÀÊz¹Êz²Êz«Êz¤ÊzÊz–ÊzÊzˆÊzÊzzÊzsÊzlÊzeÊz^ÊzWÊzPÊzIÊzBÊz;Êz4Êz-Êz&ÊzÊzÊzÊz ÊzÊzüÉzõÉzîÉzçÉzàÉzÙÉzÒÉzËÉzÄÉz½Éz¶Éz¯Éz¨Éz¡ÉzšÉz“ÉzŒÉz…Éz~ÉzwÉzpÉziÉzbÉz[ÉzTÉzMÉzFÉz?Éz8Éz1Éz*Éz#ÉzÉzÉzÉzÉzÉzùÈzòÈzëÈzäÈzÝÈzÖÈzÏÈzÈÈzÁÈzºÈz³Èz¬Èz¥ÈzžÈz—ÈzÈz‰Èz‚Èz{ÈztÈzmÈzfÈz_ÈzXÈzQÈzJÈzCÈz<Èz5Èz.Èz'Èz ÈzÈzÈz ÈzÈzýÇzöÇzïÇzèÇzáÇzÚÇzÓÇzÌÇzÅÇz¾Çz·Çz°Çz©Çz¢Çz›Çz”ÇzÇz†ÇzÇzxÇzqÇzjÇzcÇz\ÇzUÇzNÇzGÇz@Çz9Çz2Çz+Çz$ÇzÇzÇzÇzÇzÇzúÆzóÆzìÆzåÆzÞÆzׯzÐÆzÉÆzÂÆz»Æz´Æz­Æz¦ÆzŸÆz˜Æz‘ÆzŠÆzƒÆz|ÆzuÆznÆzgÆz`ÆzYÆzRÆzKÆzDÆz=Æz6Æz/Æz(Æz!ÆzÆzÆz ÆzÆzþÅz÷ÅzðÅzéÅzâÅzÛÅzÔÅzÍÅzÆÅz¿Åz¸Åz±ÅzªÅz£ÅzœÅz•ÅzŽÅz‡Åz€ÅzyÅzrÅzkÅzdÅz]ÅzVÅzOÅzHÅzAÅz:Åz3Åz,Åz%ÅzÅzÅzÅz ÅzÅzûÄzôÄzíÄzæÄzßÄzØÄzÑÄzÊÄzÃÄz¼ÄzµÄz®Äz§Äz Äz™Äz’Äz‹Äz„Äz}ÄzvÄzoÄzhÄzaÄzZÄzSÄzLÄzEÄz>Äz7Äz0Äz)Äz"ÄzÄzÄz ÄzÄzÿÃzøÃzñÃzêÃzãÃzÜÃzÕÃzÎÃzÇÃzÀÃz¹Ãz²Ãz«Ãz¤ÃzÃz–ÃzÃzˆÃzÃzzÃzsÃzlÃzeÃz^ÃzWÃzPÃzIÃzBÃz;Ãz4Ãz-Ãz&ÃzÃzÃzÃz ÃzÃzüÂzõÂzîÂzçÂzàÂzÙÂzÒÂzËÂzÄÂz½Âz¶Âz¯Âz¨Âz¡ÂzšÂz“ÂzŒÂz…Âz~ÂzwÂzpÂziÂzbÂz[ÂzTÂzMÂzFÂz?Âz8Âz1Âz*Âz#ÂzÂzÂzÂzÂzÂzùÁzòÁzëÁzäÁzÝÁzÖÁzÏÁzÈÁzÁÁzºÁz³Áz¬Áz¥ÁzžÁz—ÁzÁz‰Áz‚Áz{ÁztÁzmÁzfÁz_ÁzXÁzQÁzJÁzCÁz<Áz5Áz.Áz'Áz ÁzÁzÁz ÁzÁzýÀzöÀzïÀzèÀzáÀzÚÀzÓÀzÌÀzÅÀz¾Àz·Àz°Àz©Àz¢Àz›Àz”ÀzÀz†ÀzÀzxÀzqÀzjÀzcÀz\ÀzUÀzNÀzGÀz@Àz9Àz2Àz+Àz$ÀzÀzÀzÀzÀzÀzú¿zó¿zì¿zå¿zÞ¿z׿zпzÉ¿z¿z»¿z´¿z­¿z¦¿zŸ¿z˜¿z‘¿zŠ¿zƒ¿z|¿zu¿zn¿zg¿z`¿zY¿zR¿zK¿zD¿z=¿z6¿z/¿z(¿z!¿z¿z¿z ¿z¿zþ¾z÷¾zð¾zé¾zâ¾zÛ¾zÔ¾z;zƾz¿¾z¸¾z±¾zª¾z£¾zœ¾z•¾z޾z‡¾z€¾zy¾zr¾zk¾zd¾z]¾zV¾zO¾zH¾zA¾z:¾z3¾z,¾z%¾z¾z¾z¾z ¾z¾zû½zô½zí½zæ½zß½zؽzѽzʽzýz¼½zµ½z®½z§½z ½z™½z’½z‹½z„½z}½zv½zo½zh½za½zZ½zS½zL½zE½z>½z7½z0½z)½z"½z½z½z ½z½zÿ¼zø¼zñ¼zê¼zã¼zܼzÕ¼zμzǼzÀ¼z¹¼z²¼z«¼z¤¼z¼z–¼z¼zˆ¼z¼zz¼zs¼zl¼ze¼z^¼zW¼zP¼zI¼zB¼z;¼z4¼z-¼z&¼z¼z¼z¼z ¼z¼zü»zõ»zî»zç»zà»zÙ»zÒ»zË»zÄ»z½»z¶»z¯»z¨»z¡»zš»z“»zŒ»z…»z~»zw»zp»zi»zb»z[»zT»zM»zF»z?»z8»z1»z*»z#»z»z»z»z»z»zùºzòºzëºzäºzݺzÖºzϺzȺzÁºzººz³ºz¬ºz¥ºzžºz—ºzºz‰ºz‚ºz{ºztºzmºzfºz_ºzXºzQºzJºzCºz<ºz5ºz.ºz'ºz ºzºzºz ºzºzý¹zö¹zï¹zè¹zá¹zÚ¹zÓ¹z̹zŹz¾¹z·¹z°¹z©¹z¢¹z›¹z”¹z¹z†¹z¹zx¹zq¹zj¹zc¹z\¹zU¹zN¹zG¹z@¹z9¹z2¹z+¹z$¹z¹z¹z¹z¹z¹zú¸zó¸zì¸zå¸zÞ¸z׸zиzɸz¸z»¸z´¸z­¸z¦¸zŸ¸z˜¸z‘¸zЏzƒ¸z|¸zu¸zn¸zg¸z`¸zY¸zR¸zK¸zD¸z=¸z6¸z/¸z(¸z!¸z¸z¸z ¸z¸zþ·z÷·zð·zé·zâ·zÛ·zÔ·zÍ·zÆ·z¿·z¸·z±·zª·z£·zœ·z•·zŽ·z‡·z€·zy·zr·zk·zd·z]·zV·zO·zH·zA·z:·z3·z,·z%·z·z·z·z ·z·zû¶zô¶zí¶zæ¶zß¶zضzѶzʶzöz¼¶zµ¶z®¶z§¶z ¶z™¶z’¶z‹¶z„¶z}¶zv¶zo¶zh¶za¶zZ¶zS¶zL¶zE¶z>¶z7¶z0¶z)¶z"¶z¶z¶z ¶z¶zÿµzøµzñµzêµzãµzܵzÕµzεzǵzÀµz¹µz²µz«µz¤µzµz–µzµzˆµzµzzµzsµzlµzeµz^µzWµzPµzIµzBµz;µz4µz-µz&µzµzµzµz µzµzü´zõ´zî´zç´zà´zÙ´zÒ´zË´zÄ´z½´z¶´z¯´z¨´z¡´zš´z“´zŒ´z…´z~´zw´zp´zi´zb´z[´zT´zM´zF´z?´z8´z1´z*´z#´z´z´z´z´z´zù³zò³zë³zä³zݳzÖ³zϳzȳzÁ³zº³z³³z¬³z¥³zž³z—³z³z‰³z‚³z{³zt³zm³zf³z_³zX³zQ³zJ³zC³z<³z5³z.³z'³z ³z³z³z ³z³zý²zö²zï²zè²zá²zÚ²zÓ²z̲zŲz¾²z·²z°²z©²z¢²z›²z”²z²z†²z²zx²zq²zj²zc²z\²zU²zN²zG²z@²z9²z2²z+²z$²z²z²z²z²z²zú±zó±zì±zå±zÞ±z×±zбzɱz±z»±z´±z­±z¦±zŸ±z˜±z‘±zбzƒ±z|±zu±zn±zg±z`±zY±zR±zK±zD±z=±z6±z/±z(±z!±z±z±z ±z±zþ°z÷°zð°zé°zâ°zÛ°zÔ°zͰzưz¿°z¸°z±°zª°z£°zœ°z•°zްz‡°z€°zy°zr°zk°zd°z]°zV°zO°zH°zA°z:°z3°z,°z%°z°z°z°z °z°zû¯zô¯zí¯zæ¯z߯zدzѯzʯzïz¼¯zµ¯z®¯z§¯z ¯z™¯z’¯z‹¯z„¯z}¯zv¯zo¯zh¯za¯zZ¯zS¯zL¯zE¯z>¯z7¯z0¯z)¯z"¯z¯z¯z ¯z¯zÿ®zø®zñ®zê®zã®zÜ®zÕ®zήzÇ®zÀ®z¹®z²®z«®z¤®z®z–®z®zˆ®z®zz®zs®zl®ze®z^®zW®zP®zI®zB®z;®z4®z-®z&®z®z®z®z ®z®zü­zõ­zî­zç­zà­zÙ­zÒ­zË­zÄ­z½­z¶­z¯­z¨­z¡­zš­z“­zŒ­z…­z~­zw­zp­zi­zb­z[­zT­zM­zF­z?­z8­z1­z*­z#­z­z­z­z­z­zù¬zò¬zë¬zä¬zݬzÖ¬zϬzȬzÁ¬zº¬z³¬z¬¬z¥¬zž¬z—¬z¬z‰¬z‚¬z{¬zt¬zm¬zf¬z_¬zX¬zQ¬zJ¬zC¬z<¬z5¬z.¬z'¬z ¬z¬z¬z ¬z¬zý«zö«zï«zè«zá«zÚ«zÓ«zÌ«zÅ«z¾«z·«z°«z©«z¢«z›«z”«z«z†«z«zx«zq«zj«zc«z\«zU«zN«zG«z@«z9«z2«z+«z$«z«z«z«z«z«zúªzóªzìªzåªzÞªzתzЪzɪzªz»ªz´ªz­ªz¦ªzŸªz˜ªz‘ªzŠªzƒªz|ªzuªznªzgªz`ªzYªzRªzKªzDªz=ªz6ªz/ªz(ªz!ªzªzªz ªzªzþ©z÷©zð©zé©zâ©zÛ©zÔ©zÍ©zÆ©z¿©z¸©z±©zª©z£©zœ©z•©zŽ©z‡©z€©zy©zr©zk©zd©z]©zV©zO©zH©zA©z:©z3©z,©z%©z©z©z©z ©z©zû¨zô¨zí¨zæ¨zߨzبzѨzʨzèz¼¨zµ¨z®¨z§¨z ¨z™¨z’¨z‹¨z„¨z}¨zv¨zo¨zh¨za¨zZ¨zS¨zL¨zE¨z>¨z7¨z0¨z)¨z"¨z¨z¨z ¨z¨zÿ§zø§zñ§zê§zã§zܧzÕ§zΧzǧzÀ§z¹§z²§z«§z¤§z§z–§z§zˆ§z§zz§zs§zl§ze§z^§zW§zP§zI§zB§z;§z4§z-§z&§z§z§z§z §z§zü¦zõ¦zî¦zç¦zà¦zÙ¦zÒ¦z˦zĦz½¦z¶¦z¯¦z¨¦z¡¦zš¦z“¦zŒ¦z…¦z~¦zw¦zp¦zi¦zb¦z[¦zT¦zM¦zF¦z?¦z8¦z1¦z*¦z#¦z¦z¦z¦z¦z¦zù¥zò¥zë¥zä¥zÝ¥zÖ¥zÏ¥zÈ¥zÁ¥zº¥z³¥z¬¥z¥¥zž¥z—¥z¥z‰¥z‚¥z{¥zt¥zm¥zf¥z_¥zX¥zQ¥zJ¥zC¥z<¥z5¥z.¥z'¥z ¥z¥z¥z ¥z¥zý¤zö¤zï¤zè¤zá¤zÚ¤zÓ¤z̤zŤz¾¤z·¤z°¤z©¤z¢¤z›¤z”¤z¤z†¤z¤zx¤zq¤zj¤zc¤z\¤zU¤zN¤zG¤z@¤z9¤z2¤z+¤z$¤z¤z¤z¤z¤z¤zú£zó£zì£zå£zÞ£z×£zУzÉ£z£z»£z´£z­£z¦£zŸ£z˜£z‘£zŠ£zƒ£z|£zu£zn£zg£z`£zY£zR£zK£zD£z=£z6£z/£z(£z!£z£z£z £z£zþ¢z÷¢zð¢zé¢zâ¢zÛ¢zÔ¢zÍ¢zÆ¢z¿¢z¸¢z±¢zª¢z£¢zœ¢z•¢zŽ¢z‡¢z€¢zy¢zr¢zk¢zd¢z]¢zV¢zO¢zH¢zA¢z:¢z3¢z,¢z%¢z¢z¢z¢z ¢z¢zû¡zô¡zí¡zæ¡zß¡zØ¡zÑ¡zÊ¡záz¼¡zµ¡z®¡z§¡z ¡z™¡z’¡z‹¡z„¡z}¡zv¡zo¡zh¡za¡zZ¡zS¡zL¡zE¡z>¡z7¡z0¡z)¡z"¡z¡z¡z ¡z¡zÿ zø zñ zê zã zÜ zÕ zΠzÇ zÀ z¹ z² z« z¤ z z– z zˆ z zz zs zl ze z^ zW zP zI zB z; z4 z- z& z z z z  z züŸzõŸzîŸzçŸzàŸzÙŸzÒŸzËŸzÄŸz½Ÿz¶Ÿz¯Ÿz¨Ÿz¡ŸzšŸz“ŸzŒŸz…Ÿz~ŸzwŸzpŸziŸzbŸz[ŸzTŸzMŸzFŸz?Ÿz8Ÿz1Ÿz*Ÿz#ŸzŸzŸzŸzŸzŸzùžzòžzëžzäžzÝžzÖžzÏžzÈžzÁžzºžz³žz¬žz¥žzžžz—žzžz‰žz‚žz{žztžzmžzfžz_žzXžzQžzJžzCžz<žz5žz.žz'žz žzžzžz žzžzýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúœzóœzìœzåœzÞœzלzМzÉœzœz»œz´œz­œz¦œzŸœz˜œz‘œzŠœzƒœz|œzuœznœzgœz`œzYœzRœzKœzDœz=œz6œz/œz(œz!œzœzœz œzœzþ›z÷›zð›zé›zâ›zÛ›zÔ›zÍ›zÆ›z¿›z¸›z±›zª›z£›zœ›z•›zŽ›z‡›z€›zy›zr›zk›zd›z]›zV›zO›zH›zA›z:›z3›z,›z%›z›z›z›z ›z›zûšzôšzíšzæšzßšzØšzÑšzÊšzÚz¼šzµšz®šz§šz šz™šz’šz‹šz„šz}šzvšzošzhšzašzZšzSšzLšzEšz>šz7šz0šz)šz"šzšzšz šzšzÿ™zø™zñ™zê™zã™zÜ™zÕ™zΙzÇ™zÀ™z¹™z²™z«™z¤™z™z–™z™zˆ™z™zz™zs™zl™ze™z^™zW™zP™zI™zB™z;™z4™z-™z&™z™z™z™z ™z™zü˜zõ˜zî˜zç˜zà˜zÙ˜zÒ˜z˘zĘz½˜z¶˜z¯˜z¨˜z¡˜zš˜z“˜zŒ˜z…˜z~˜zw˜zp˜zi˜zb˜z[˜zT˜zM˜zF˜z?˜z8˜z1˜z*˜z#˜z˜z˜z˜z˜z˜zù—zò—zë—zä—zÝ—zÖ—zÏ—zÈ—zÁ—zº—z³—z¬—z¥—zž—z——z—z‰—z‚—z{—zt—zm—zf—z_—zX—zQ—zJ—zC—z<—z5—z.—z'—z —z—z—z —z—zý–zö–zï–zè–zá–zÚ–zÓ–zÌ–zÅ–z¾–z·–z°–z©–z¢–z›–z”–z–z†–z–zx–zq–zj–zc–z\–zU–zN–zG–z@–z9–z2–z+–z$–z–z–z–z–z–zú•zó•zì•zå•zÞ•zוzЕzÉ•z•z»•z´•z­•z¦•zŸ•z˜•z‘•zŠ•zƒ•z|•zu•zn•zg•z`•zY•zR•zK•zD•z=•z6•z/•z(•z!•z•z•z •z•zþ”z÷”zð”zé”zâ”zÛ”zÔ”zÍ”zÆ”z¿”z¸”z±”zª”z£”zœ”z•”zŽ”z‡”z€”zy”zr”zk”zd”z]”zV”zO”zH”zA”z:”z3”z,”z%”z”z”z”z ”z”zû“zô“zí“zæ“zß“zØ“zÑ“zÊ“zÓz¼“zµ“z®“z§“z “z™“z’“z‹“z„“z}“zv“zo“zh“za“zZ“zS“zL“zE“z>“z7“z0“z)“z"“z“z“z “z“zÿ’zø’zñ’zê’zã’zÜ’zÕ’zÎ’zÇ’zÀ’z¹’z²’z«’z¤’z’z–’z’zˆ’z’zz’zs’zl’ze’z^’zW’zP’zI’zB’z;’z4’z-’z&’z’z’z’z ’z’zü‘zõ‘zî‘zç‘zà‘zÙ‘zÒ‘zË‘zÄ‘z½‘z¶‘z¯‘z¨‘z¡‘zš‘z“‘zŒ‘z…‘z~‘zw‘zp‘zi‘zb‘z[‘zT‘zM‘zF‘z?‘z8‘z1‘z*‘z#‘z‘z‘z‘z‘z‘zùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCzŒz7Œz0Œz)Œz"ŒzŒzŒz ŒzŒzÿ‹zø‹zñ‹zê‹zã‹zÜ‹zÕ‹z΋zÇ‹zÀ‹z¹‹z²‹z«‹z¤‹z‹z–‹z‹zˆ‹z‹zz‹zs‹zl‹ze‹z^‹zW‹zP‹zI‹zB‹z;‹z4‹z-‹z&‹z‹z‹z‹z ‹z‹züŠzõŠzîŠzçŠzàŠzÙŠzÒŠzËŠzÄŠz½Šz¶Šz¯Šz¨Šz¡ŠzšŠz“ŠzŒŠz…Šz~ŠzwŠzpŠziŠzbŠz[ŠzTŠzMŠzFŠz?Šz8Šz1Šz*Šz#ŠzŠzŠzŠzŠzŠzù‰zò‰zë‰zä‰z݉zÖ‰zωzȉzÁ‰zº‰z³‰z¬‰z¥‰zž‰z—‰z‰z‰‰z‚‰z{‰zt‰zm‰zf‰z_‰zX‰zQ‰zJ‰zC‰z<‰z5‰z.‰z'‰z ‰z‰z‰z ‰z‰zýˆzöˆzïˆzèˆzáˆzÚˆzÓˆz̈zňz¾ˆz·ˆz°ˆz©ˆz¢ˆz›ˆz”ˆzˆz†ˆzˆzxˆzqˆzjˆzcˆz\ˆzUˆzNˆzGˆz@ˆz9ˆz2ˆz+ˆz$ˆzˆzˆzˆzˆzˆzú‡zó‡zì‡zå‡zÞ‡zׇzЇzɇz‡z»‡z´‡z­‡z¦‡zŸ‡z˜‡z‘‡zЇzƒ‡z|‡zu‡zn‡zg‡z`‡zY‡zR‡zK‡zD‡z=‡z6‡z/‡z(‡z!‡z‡z‡z ‡z‡zþ†z÷†zð†zé†zâ†zÛ†zÔ†z͆zƆz¿†z¸†z±†zª†z£†zœ†z•†zކz‡†z€†zy†zr†zk†zd†z]†zV†zO†zH†zA†z:†z3†z,†z%†z†z†z†z †z†zû…zô…zí…zæ…zß…zØ…zÑ…zÊ…zÃ…z¼…zµ…z®…z§…z …z™…z’…z‹…z„…z}…zv…zo…zh…za…zZ…zS…zL…zE…z>…z7…z0…z)…z"…z…z…z …z…zÿ„zø„zñ„zê„zã„zÜ„zÕ„z΄zÇ„zÀ„z¹„z²„z«„z¤„z„z–„z„zˆ„z„zz„zs„zl„ze„z^„zW„zP„zI„zB„z;„z4„z-„z&„z„z„z„z „z„züƒzõƒzîƒzçƒzàƒzÙƒzÒƒz˃zăz½ƒz¶ƒz¯ƒz¨ƒz¡ƒzšƒz“ƒzŒƒz…ƒz~ƒzwƒzpƒziƒzbƒz[ƒzTƒzMƒzFƒz?ƒz8ƒz1ƒz*ƒz#ƒzƒzƒzƒzƒzƒzù‚zò‚zë‚zä‚zÝ‚zÖ‚zÏ‚zÈ‚zÁ‚zº‚z³‚z¬‚z¥‚zž‚z—‚z‚z‰‚z‚‚z{‚zt‚zm‚zf‚z_‚zX‚zQ‚zJ‚zC‚z<‚z5‚z.‚z'‚z ‚z‚z‚z ‚z‚zýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzú€zó€zì€zå€zÞ€z×€zЀzÉ€z€z»€z´€z­€z¦€zŸ€z˜€z‘€zŠ€zƒ€z|€zu€zn€zg€z`€zY€zR€zK€zD€z=€z6€z/€z(€z!€z€z€z €z€zþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzû~zô~zí~zæ~zß~zØ~zÑ~zÊ~zÃ~z¼~zµ~z®~z§~z ~z™~z’~z‹~z„~z}~zv~zo~zh~za~zZ~zS~zL~zE~z>~z7~z0~z)~z"~z~z~z ~z~zÿ}zø}zñ}zê}zã}zÜ}zÕ}zÎ}zÇ}zÀ}z¹}z²}z«}z¤}z}z–}z}zˆ}z}zz}zs}zl}ze}z^}zW}zP}zI}zB}z;}z4}z-}z&}z}z}z}z }z}zü|zõ|zî|zç|zà|zÙ|zÒ|zË|zÄ|z½|z¶|z¯|z¨|z¡|zš|z“|zŒ|z…|z~|zw|zp|zi|zb|z[|zT|zM|zF|z?|z8|z1|z*|z#|z|z|z|z|z|zù{zò{zë{zä{zÝ{zÖ{zÏ{zÈ{zÁ{zº{z³{z¬{z¥{zž{z—{z{z‰{z‚{z{{zt{zm{zf{z_{zX{zQ{zJ{zC{z<{z5{z.{z'{z {z{z{z {z{zýzzözzïzzèzzázzÚzzÓzzÌzzÅzz¾zz·zz°zz©zz¢zz›zz”zzzz†zzzzxzzqzzjzzczz\zzUzzNzzGzz@zz9zz2zz+zz$zzzzzzzzzzzzúyzóyzìyzåyzÞyz×yzÐyzÉyzÂyz»yz´yz­yz¦yzŸyz˜yz‘yzŠyzƒyz|yzuyznyzgyz`yzYyzRyzKyzDyz=yz6yz/yz(yz!yzyzyz yzyzþxz÷xzðxzéxzâxzÛxzÔxzÍxzÆxz¿xz¸xz±xzªxz£xzœxz•xzŽxz‡xz€xzyxzrxzkxzdxz]xzVxzOxzHxzAxz:xz3xz,xz%xzxzxzxz xzxzûwzôwzíwzæwzßwzØwzÑwzÊwzÃwz¼wzµwz®wz§wz wz™wz’wz‹wz„wz}wzvwzowzhwzawzZwzSwzLwzEwz>wz7wz0wz)wz"wzwzwz wzwzÿvzøvzñvzêvzãvzÜvzÕvzÎvzÇvzÀvz¹vz²vz«vz¤vzvz–vzvzˆvzvzzvzsvzlvzevz^vzWvzPvzIvzBvz;vz4vz-vz&vzvzvzvz vzvzüuzõuzîuzçuzàuzÙuzÒuzËuzÄuz½uz¶uz¯uz¨uz¡uzšuz“uzŒuz…uz~uzwuzpuziuzbuz[uzTuzMuzFuz?uz8uz1uz*uz#uzuzuzuzuzuzùtzòtzëtzätzÝtzÖtzÏtzÈtzÁtzºtz³tz¬tz¥tzžtz—tztz‰tz‚tz{tzttzmtzftz_tzXtzQtzJtzCtzpz7pz0pz)pz"pzpzpz pzpzÿozøozñozêozãozÜozÕozÎozÇozÀoz¹oz²oz«oz¤ozoz–ozozˆozozzozsozlozeoz^ozWozPozIozBoz;oz4oz-oz&ozozozoz ozozünzõnzînzçnzànzÙnzÒnzËnzÄnz½nz¶nz¯nz¨nz¡nzšnz“nzŒnz…nz~nzwnzpnzinzbnz[nzTnzMnzFnz?nz8nz1nz*nz#nznznznznznzùmzòmzëmzämzÝmzÖmzÏmzÈmzÁmzºmz³mz¬mz¥mzžmz—mzmz‰mz‚mz{mztmzmmzfmz_mzXmzQmzJmzCmziz7iz0iz)iz"iziziz izizÿhzøhzñhzêhzãhzÜhzÕhzÎhzÇhzÀhz¹hz²hz«hz¤hzhz–hzhzˆhzhzzhzshzlhzehz^hzWhzPhzIhzBhz;hz4hz-hz&hzhzhzhz hzhzügzõgzîgzçgzàgzÙgzÒgzËgzÄgz½gz¶gz¯gz¨gz¡gzšgz“gzŒgz…gz~gzwgzpgzigzbgz[gzTgzMgzFgz?gz8gz1gz*gz#gzgzgzgzgzgzùfzòfzëfzäfzÝfzÖfzÏfzÈfzÁfzºfz³fz¬fz¥fzžfz—fzfz‰fz‚fz{fztfzmfzffz_fzXfzQfzJfzCfzbz7bz0bz)bz"bzbzbz bzbzÿazøazñazêazãazÜazÕazÎazÇazÀaz¹az²az«az¤azaz–azazˆazazzazsazlazeaz^azWazPazIazBaz;az4az-az&azazazaz azazü`zõ`zî`zç`zà`zÙ`zÒ`zË`zÄ`z½`z¶`z¯`z¨`z¡`zš`z“`zŒ`z…`z~`zw`zp`zi`zb`z[`zT`zM`zF`z?`z8`z1`z*`z#`z`z`z`z`z`zù_zò_zë_zä_zÝ_zÖ_zÏ_zÈ_zÁ_zº_z³_z¬_z¥_zž_z—_z_z‰_z‚_z{_zt_zm_zf_z__zX_zQ_zJ_zC_z<_z5_z._z'_z _z_z_z _z_zý^zö^zï^zè^zá^zÚ^zÓ^zÌ^zÅ^z¾^z·^z°^z©^z¢^z›^z”^z^z†^z^zx^zq^zj^zc^z\^zU^zN^zG^z@^z9^z2^z+^z$^z^z^z^z^z^zú]zó]zì]zå]zÞ]z×]zÐ]zÉ]zÂ]z»]z´]z­]z¦]zŸ]z˜]z‘]zŠ]zƒ]z|]zu]zn]zg]z`]zY]zR]zK]zD]z=]z6]z/]z(]z!]z]z]z ]z]zþ\z÷\zð\zé\zâ\zÛ\zÔ\zÍ\zÆ\z¿\z¸\z±\zª\z£\zœ\z•\zŽ\z‡\z€\zy\zr\zk\zd\z]\zV\zO\zH\zA\z:\z3\z,\z%\z\z\z\z \z\zû[zô[zí[zæ[zß[zØ[zÑ[zÊ[zÃ[z¼[zµ[z®[z§[z [z™[z’[z‹[z„[z}[zv[zo[zh[za[zZ[zS[zL[zE[z>[z7[z0[z)[z"[z[z [z[zÿZzøZzñZzêZzãZzÜZzÕZzÎZzÇZzÀZz¹Zz²Zz«Zz¤ZzZz–ZzZzˆZzZzzZzsZzlZzeZz^ZzWZzPZzIZzBZz;Zz4Zz-Zz&ZzZzZzZz ZzZzüYzõYzîYzçYzàYzÙYzÒYzËYzÄYz½Yz¶Yz¯Yz¨Yz¡YzšYz“YzŒYz…Yz~YzwYzpYziYzbYz[YzTYzMYzFYz?Yz8Yz1Yz*Yz#YzYzYzYzYzYzùXzòXzëXzäXzÝXzÖXzÏXzÈXzÁXzºXz³Xz¬Xz¥XzžXz—XzXz‰Xz‚Xz{XztXzmXzfXz_XzXXzQXzJXzCXzTz7Tz0Tz)Tz"TzTzTz TzTzÿSzøSzñSzêSzãSzÜSzÕSzÎSzÇSzÀSz¹Sz²Sz«Sz¤SzSz–SzSzˆSzSzzSzsSzlSzeSz^SzWSzPSzISzBSz;Sz4Sz-Sz&SzSzSzSz SzSzüRzõRzîRzçRzàRzÙRzÒRzËRzÄRz½Rz¶Rz¯Rz¨Rz¡RzšRz“RzŒRz…Rz~RzwRzpRziRzbRz[RzTRzMRzFRz?Rz8Rz1Rz*Rz#RzRzRzRzRzRzùQzòQzëQzäQzÝQzÖQzÏQzÈQzÁQzºQz³Qz¬Qz¥QzžQz—QzQz‰Qz‚Qz{QztQzmQzfQz_QzXQzQQzJQzCQzMz7Mz0Mz)Mz"MzMzMz MzMzÿLzøLzñLzêLzãLzÜLzÕLzÎLzÇLzÀLz¹Lz²Lz«Lz¤LzLz–LzLzˆLzLzzLzsLzlLzeLz^LzWLzPLzILzBLz;Lz4Lz-Lz&LzLzLzLz LzLzüKzõKzîKzçKzàKzÙKzÒKzËKzÄKz½Kz¶Kz¯Kz¨Kz¡KzšKz“KzŒKz…Kz~KzwKzpKziKzbKz[KzTKzMKzFKz?Kz8Kz1Kz*Kz#KzKzKzKzKzKzùJzòJzëJzäJzÝJzÖJzÏJzÈJzÁJzºJz³Jz¬Jz¥JzžJz—JzJz‰Jz‚Jz{JztJzmJzfJz_JzXJzQJzJJzCJzFz7Fz0Fz)Fz"FzFzFz FzFzÿEzøEzñEzêEzãEzÜEzÕEzÎEzÇEzÀEz¹Ez²Ez«Ez¤EzEz–EzEzˆEzEzzEzsEzlEzeEz^EzWEzPEzIEzBEz;Ez4Ez-Ez&EzEzEzEz EzEzüDzõDzîDzçDzàDzÙDzÒDzËDzÄDz½Dz¶Dz¯Dz¨Dz¡DzšDz“DzŒDz…Dz~DzwDzpDziDzbDz[DzTDzMDzFDz?Dz8Dz1Dz*Dz#DzDzDzDzDzDzùCzòCzëCzäCzÝCzÖCzÏCzÈCzÁCzºCz³Cz¬Cz¥CzžCz—CzCz‰Cz‚Cz{CztCzmCzfCz_CzXCzQCzJCzCCz?z7?z0?z)?z"?z?z?z ?z?zÿ>zø>zñ>zê>zã>zÜ>zÕ>zÎ>zÇ>zÀ>z¹>z²>z«>z¤>z>z–>z>zˆ>z>zz>zs>zl>ze>z^>zW>zP>zI>zB>z;>z4>z->z&>z>z>z>z >z>zü=zõ=zî=zç=zà=zÙ=zÒ=zË=zÄ=z½=z¶=z¯=z¨=z¡=zš=z“=zŒ=z…=z~=zw=zp=zi=zb=z[=zT=zM=zF=z?=z8=z1=z*=z#=z=z=z=z=z=zù8z78z08z)8z"8z8z8z 8z8zÿ7zø7zñ7zê7zã7zÜ7zÕ7zÎ7zÇ7zÀ7z¹7z²7z«7z¤7z7z–7z7zˆ7z7zz7zs7zl7ze7z^7zW7zP7zI7zB7z;7z47z-7z&7z7z7z7z 7z7zü6zõ6zî6zç6zà6zÙ6zÒ6zË6zÄ6z½6z¶6z¯6z¨6z¡6zš6z“6zŒ6z…6z~6zw6zp6zi6zb6z[6zT6zM6zF6z?6z86z16z*6z#6z6z6z6z6z6zù5zò5zë5zä5zÝ5zÖ5zÏ5zÈ5zÁ5zº5z³5z¬5z¥5zž5z—5z5z‰5z‚5z{5zt5zm5zf5z_5zX5zQ5zJ5zC5z<5z55z.5z'5z 5z5z5z 5z5zý4zö4zï4zè4zá4zÚ4zÓ4zÌ4zÅ4z¾4z·4z°4z©4z¢4z›4z”4z4z†4z4zx4zq4zj4zc4z\4zU4zN4zG4z@4z94z24z+4z$4z4z4z4z4z4zú3zó3zì3zå3zÞ3z×3zÐ3zÉ3zÂ3z»3z´3z­3z¦3zŸ3z˜3z‘3zŠ3zƒ3z|3zu3zn3zg3z`3zY3zR3zK3zD3z=3z63z/3z(3z!3z3z3z 3z3zþ2z÷2zð2zé2zâ2zÛ2zÔ2zÍ2zÆ2z¿2z¸2z±2zª2z£2zœ2z•2zŽ2z‡2z€2zy2zr2zk2zd2z]2zV2zO2zH2zA2z:2z32z,2z%2z2z2z2z 2z2zû1zô1zí1zæ1zß1zØ1zÑ1zÊ1zÃ1z¼1zµ1z®1z§1z 1z™1z’1z‹1z„1z}1zv1zo1zh1za1zZ1zS1zL1zE1z>1z71z01z)1z"1z1z1z 1z1zÿ0zø0zñ0zê0zã0zÜ0zÕ0zÎ0zÇ0zÀ0z¹0z²0z«0z¤0z0z–0z0zˆ0z0zz0zs0zl0ze0z^0zW0zP0zI0zB0z;0z40z-0z&0z0z0z0z 0z0zü/zõ/zî/zç/zà/zÙ/zÒ/zË/zÄ/z½/z¶/z¯/z¨/z¡/zš/z“/zŒ/z…/z~/zw/zp/zi/zb/z[/zT/zM/zF/z?/z8/z1/z*/z#/z/z/z/z/z/zù.zò.zë.zä.zÝ.zÖ.zÏ.zÈ.zÁ.zº.z³.z¬.z¥.zž.z—.z.z‰.z‚.z{.zt.zm.zf.z_.zX.zQ.zJ.zC.z<.z5.z..z'.z .z.z.z .z.zý-zö-zï-zè-zá-zÚ-zÓ-zÌ-zÅ-z¾-z·-z°-z©-z¢-z›-z”-z-z†-z-zx-zq-zj-zc-z\-zU-zN-zG-z@-z9-z2-z+-z$-z-z-z-z-z-zú,zó,zì,zå,zÞ,z×,zÐ,zÉ,zÂ,z»,z´,z­,z¦,zŸ,z˜,z‘,zŠ,zƒ,z|,zu,zn,zg,z`,zY,zR,zK,zD,z=,z6,z/,z(,z!,z,z,z ,z,zþ+z÷+zð+zé+zâ+zÛ+zÔ+zÍ+zÆ+z¿+z¸+z±+zª+z£+zœ+z•+zŽ+z‡+z€+zy+zr+zk+zd+z]+zV+zO+zH+zA+z:+z3+z,+z%+z+z+z+z +z+zû*zô*zí*zæ*zß*zØ*zÑ*zÊ*zÃ*z¼*zµ*z®*z§*z *z™*z’*z‹*z„*z}*zv*zo*zh*za*zZ*zS*zL*zE*z>*z7*z0*z)*z"*z*z*z *z*zÿ)zø)zñ)zê)zã)zÜ)zÕ)zÎ)zÇ)zÀ)z¹)z²)z«)z¤)z)z–)z)zˆ)z)zz)zs)zl)ze)z^)zW)zP)zI)zB)z;)z4)z-)z&)z)z)z)z )z)zü(zõ(zî(zç(zà(zÙ(zÒ(zË(zÄ(z½(z¶(z¯(z¨(z¡(zš(z“(zŒ(z…(z~(zw(zp(zi(zb(z[(zT(zM(zF(z?(z8(z1(z*(z#(z(z(z(z(z(zù'zò'zë'zä'zÝ'zÖ'zÏ'zÈ'zÁ'zº'z³'z¬'z¥'zž'z—'z'z‰'z‚'z{'zt'zm'zf'z_'zX'zQ'zJ'zC'z<'z5'z.'z''z 'z'z'z 'z'zý&zö&zï&zè&zá&zÚ&zÓ&zÌ&zÅ&z¾&z·&z°&z©&z¢&z›&z”&z&z†&z&zx&zq&zj&zc&z\&zU&zN&zG&z@&z9&z2&z+&z$&z&z&z&z&z&zú%zó%zì%zå%zÞ%z×%zÐ%zÉ%zÂ%z»%z´%z­%z¦%zŸ%z˜%z‘%zŠ%zƒ%z|%zu%zn%zg%z`%zY%zR%zK%zD%z=%z6%z/%z(%z!%z%z%z %z%zþ$z÷$zð$zé$zâ$zÛ$zÔ$zÍ$zÆ$z¿$z¸$z±$zª$z£$zœ$z•$zŽ$z‡$z€$zy$zr$zk$zd$z]$zV$zO$zH$zA$z:$z3$z,$z%$z$z$z$z $z$zû#zô#zí#zæ#zß#zØ#zÑ#zÊ#zÃ#z¼#zµ#z®#z§#z #z™#z’#z‹#z„#z}#zv#zo#zh#za#zZ#zS#zL#zE#z>#z7#z0#z)#z"#z#z#z #z#zÿ"zø"zñ"zê"zã"zÜ"zÕ"zÎ"zÇ"zÀ"z¹"z²"z«"z¤"z"z–"z"zˆ"z"zz"zs"zl"ze"z^"zW"zP"zI"zB"z;"z4"z-"z&"z"z"z"z "z"zü!zõ!zî!zç!zà!zÙ!zÒ!zË!zÄ!z½!z¶!z¯!z¨!z¡!zš!z“!zŒ!z…!z~!zw!zp!zi!zb!z[!zT!zM!zF!z?!z8!z1!z*!z#!z!z!z!z!z!zù zò zë zä zÝ zÖ zÏ zÈ zÁ zº z³ z¬ z¥ zž z— z z‰ z‚ z{ zt zm zf z_ zX zQ zJ zC z< z5 z. z' z z z z z zýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿ zø zñ zê zã zÜ zÕ zÎ zÇ zÀ z¹ z² z« z¤ z z– z zˆ z zz zs zl ze z^ zW zP zI zB z; z4 z- z& z z z z z zü zõ zî zç zà zÙ zÒ zË zÄ z½ z¶ z¯ z¨ z¡ zš z“ zŒ z… z~ zw zp zi zb z[ zT zM zF z? z8 z1 z* z# z z z z z zù zò zë zä zÝ zÖ zÏ zÈ zÁ zº z³ z¬ z¥ zž z— z z‰ z‚ z{ zt zm zf z_ zX zQ zJ zC z< z5 z. z' z z z z z zý zö zï zè zá zÚ zÓ zÌ zÅ z¾ z· z° z© z¢ z› z” z z† z zx zq zj zc z\ zU zN zG z@ z9 z2 z+ z$ z z z z z zú zó zì zå zÞ z× zÐ zÉ z z» z´ z­ z¦ zŸ z˜ z‘ zŠ zƒ z| zu zn zg z` zY zR zK zD z= z6 z/ z( z! z z z z zþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCz<z5z.z'z zzz zzýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿÿyøÿyñÿyêÿyãÿyÜÿyÕÿyÎÿyÇÿyÀÿy¹ÿy²ÿy«ÿy¤ÿyÿy–ÿyÿyˆÿyÿyzÿysÿylÿyeÿy^ÿyWÿyPÿyIÿyBÿy;ÿy4ÿy-ÿy&ÿyÿyÿyÿy ÿyÿyüþyõþyîþyçþyàþyÙþyÒþyËþyÄþy½þy¶þy¯þy¨þy¡þyšþy“þyŒþy…þy~þywþypþyiþybþy[þyTþyMþyFþy?þy8þy1þy*þy#þyþyþyþyþyþyùýyòýyëýyäýyÝýyÖýyÏýyÈýyÁýyºýy³ýy¬ýy¥ýyžýy—ýyýy‰ýy‚ýy{ýytýymýyfýy_ýyXýyQýyJýyCýy<ýy5ýy.ýy'ýy ýyýyýy ýyýyýüyöüyïüyèüyáüyÚüyÓüyÌüyÅüy¾üy·üy°üy©üy¢üy›üy”üyüy†üyüyxüyqüyjüycüy\üyUüyNüyGüy@üy9üy2üy+üy$üyüyüyüyüyüyúûyóûyìûyåûyÞûy×ûyÐûyÉûyÂûy»ûy´ûy­ûy¦ûyŸûy˜ûy‘ûyŠûyƒûy|ûyuûynûygûy`ûyYûyRûyKûyDûy=ûy6ûy/ûy(ûy!ûyûyûy ûyûyþúy÷úyðúyéúyâúyÛúyÔúyÍúyÆúy¿úy¸úy±úyªúy£úyœúy•úyŽúy‡úy€úyyúyrúykúydúy]úyVúyOúyHúyAúy:úy3úy,úy%úyúyúyúy úyúyûùyôùyíùyæùyßùyØùyÑùyÊùyÃùy¼ùyµùy®ùy§ùy ùy™ùy’ùy‹ùy„ùy}ùyvùyoùyhùyaùyZùySùyLùyEùy>ùy7ùy0ùy)ùy"ùyùyùy ùyùyÿøyøøyñøyêøyãøyÜøyÕøyÎøyÇøyÀøy¹øy²øy«øy¤øyøy–øyøyˆøyøyzøysøyløyeøy^øyWøyPøyIøyBøy;øy4øy-øy&øyøyøyøy øyøyü÷yõ÷yî÷yç÷yà÷yÙ÷yÒ÷yË÷yÄ÷y½÷y¶÷y¯÷y¨÷y¡÷yš÷y“÷yŒ÷y…÷y~÷yw÷yp÷yi÷yb÷y[÷yT÷yM÷yF÷y?÷y8÷y1÷y*÷y#÷y÷y÷y÷y÷y÷yùöyòöyëöyäöyÝöyÖöyÏöyÈöyÁöyºöy³öy¬öy¥öyžöy—öyöy‰öy‚öy{öytöymöyföy_öyXöyQöyJöyCöy<öy5öy.öy'öy öyöyöy öyöyýõyöõyïõyèõyáõyÚõyÓõyÌõyÅõy¾õy·õy°õy©õy¢õy›õy”õyõy†õyõyxõyqõyjõycõy\õyUõyNõyGõy@õy9õy2õy+õy$õyõyõyõyõyõyúôyóôyìôyåôyÞôy×ôyÐôyÉôyÂôy»ôy´ôy­ôy¦ôyŸôy˜ôy‘ôyŠôyƒôy|ôyuôynôygôy`ôyYôyRôyKôyDôy=ôy6ôy/ôy(ôy!ôyôyôy ôyôyþóy÷óyðóyéóyâóyÛóyÔóyÍóyÆóy¿óy¸óy±óyªóy£óyœóy•óyŽóy‡óy€óyyóyróykóydóy]óyVóyOóyHóyAóy:óy3óy,óy%óyóyóyóy óyóyûòyôòyíòyæòyßòyØòyÑòyÊòyÃòy¼òyµòy®òy§òy òy™òy’òy‹òy„òy}òyvòyoòyhòyaòyZòySòyLòyEòy>òy7òy0òy)òy"òyòyòy òyòyÿñyøñyññyêñyãñyÜñyÕñyÎñyÇñyÀñy¹ñy²ñy«ñy¤ñyñy–ñyñyˆñyñyzñysñylñyeñy^ñyWñyPñyIñyBñy;ñy4ñy-ñy&ñyñyñyñy ñyñyüðyõðyîðyçðyàðyÙðyÒðyËðyÄðy½ðy¶ðy¯ðy¨ðy¡ðyšðy“ðyŒðy…ðy~ðywðypðyiðybðy[ðyTðyMðyFðy?ðy8ðy1ðy*ðy#ðyðyðyðyðyðyùïyòïyëïyäïyÝïyÖïyÏïyÈïyÁïyºïy³ïy¬ïy¥ïyžïy—ïyïy‰ïy‚ïy{ïytïymïyfïy_ïyXïyQïyJïyCïy<ïy5ïy.ïy'ïy ïyïyïy ïyïyýîyöîyïîyèîyáîyÚîyÓîyÌîyÅîy¾îy·îy°îy©îy¢îy›îy”îyîy†îyîyxîyqîyjîycîy\îyUîyNîyGîy@îy9îy2îy+îy$îyîyîyîyîyîyúíyóíyìíyåíyÞíy×íyÐíyÉíyÂíy»íy´íy­íy¦íyŸíy˜íy‘íyŠíyƒíy|íyuíyníygíy`íyYíyRíyKíyDíy=íy6íy/íy(íy!íyíyíy íyíyþìy÷ìyðìyéìyâìyÛìyÔìyÍìyÆìy¿ìy¸ìy±ìyªìy£ìyœìy•ìyŽìy‡ìy€ìyyìyrìykìydìy]ìyVìyOìyHìyAìy:ìy3ìy,ìy%ìyìyìyìy ìyìyûëyôëyíëyæëyßëyØëyÑëyÊëyÃëy¼ëyµëy®ëy§ëy ëy™ëy’ëy‹ëy„ëy}ëyvëyoëyhëyaëyZëySëyLëyEëy>ëy7ëy0ëy)ëy"ëyëyëy ëyëyÿêyøêyñêyêêyãêyÜêyÕêyÎêyÇêyÀêy¹êy²êy«êy¤êyêy–êyêyˆêyêyzêysêylêyeêy^êyWêyPêyIêyBêy;êy4êy-êy&êyêyêyêy êyêyüéyõéyîéyçéyàéyÙéyÒéyËéyÄéy½éy¶éy¯éy¨éy¡éyšéy“éyŒéy…éy~éywéypéyiéybéy[éyTéyMéyFéy?éy8éy1éy*éy#éyéyéyéyéyéyùèyòèyëèyäèyÝèyÖèyÏèyÈèyÁèyºèy³èy¬èy¥èyžèy—èyèy‰èy‚èy{èytèymèyfèy_èyXèyQèyJèyCèy<èy5èy.èy'èy èyèyèy èyèyýçyöçyïçyèçyáçyÚçyÓçyÌçyÅçy¾çy·çy°çy©çy¢çy›çy”çyçy†çyçyxçyqçyjçycçy\çyUçyNçyGçy@çy9çy2çy+çy$çyçyçyçyçyçyúæyóæyìæyåæyÞæy׿yÐæyÉæyÂæy»æy´æy­æy¦æyŸæy˜æy‘æyŠæyƒæy|æyuæynæygæy`æyYæyRæyKæyDæy=æy6æy/æy(æy!æyæyæy æyæyþåy÷åyðåyéåyâåyÛåyÔåyÍåyÆåy¿åy¸åy±åyªåy£åyœåy•åyŽåy‡åy€åyyåyråykåydåy]åyVåyOåyHåyAåy:åy3åy,åy%åyåyåyåy åyåyûäyôäyíäyæäyßäyØäyÑäyÊäyÃäy¼äyµäy®äy§äy äy™äy’äy‹äy„äy}äyväyoäyhäyaäyZäySäyLäyEäy>äy7äy0äy)äy"äyäyäy äyäyÿãyøãyñãyêãyããyÜãyÕãyÎãyÇãyÀãy¹ãy²ãy«ãy¤ãyãy–ãyãyˆãyãyzãysãylãyeãy^ãyWãyPãyIãyBãy;ãy4ãy-ãy&ãyãyãyãy ãyãyüâyõâyîâyçâyàâyÙâyÒâyËâyÄây½ây¶ây¯ây¨ây¡âyšây“âyŒây…ây~âywâypâyiâybây[âyTâyMâyFây?ây8ây1ây*ây#âyâyâyâyâyâyùáyòáyëáyäáyÝáyÖáyÏáyÈáyÁáyºáy³áy¬áy¥áyžáy—áyáy‰áy‚áy{áytáymáyfáy_áyXáyQáyJáyCáy<áy5áy.áy'áy áyáyáy áyáyýàyöàyïàyèàyáàyÚàyÓàyÌàyÅày¾ày·ày°ày©ày¢ày›ày”àyày†àyàyxàyqàyjàycày\àyUàyNàyGày@ày9ày2ày+ày$àyàyàyàyàyàyúßyóßyìßyåßyÞßy×ßyÐßyÉßyÂßy»ßy´ßy­ßy¦ßyŸßy˜ßy‘ßyŠßyƒßy|ßyußynßygßy`ßyYßyRßyKßyDßy=ßy6ßy/ßy(ßy!ßyßyßy ßyßyþÞy÷ÞyðÞyéÞyâÞyÛÞyÔÞyÍÞyÆÞy¿Þy¸Þy±ÞyªÞy£ÞyœÞy•ÞyŽÞy‡Þy€ÞyyÞyrÞykÞydÞy]ÞyVÞyOÞyHÞyAÞy:Þy3Þy,Þy%ÞyÞyÞyÞy ÞyÞyûÝyôÝyíÝyæÝyßÝyØÝyÑÝyÊÝyÃÝy¼ÝyµÝy®Ýy§Ýy Ýy™Ýy’Ýy‹Ýy„Ýy}ÝyvÝyoÝyhÝyaÝyZÝySÝyLÝyEÝy>Ýy7Ýy0Ýy)Ýy"ÝyÝyÝy ÝyÝyÿÜyøÜyñÜyêÜyãÜyÜÜyÕÜyÎÜyÇÜyÀÜy¹Üy²Üy«Üy¤ÜyÜy–ÜyÜyˆÜyÜyzÜysÜylÜyeÜy^ÜyWÜyPÜyIÜyBÜy;Üy4Üy-Üy&ÜyÜyÜyÜy ÜyÜyüÛyõÛyîÛyçÛyàÛyÙÛyÒÛyËÛyÄÛy½Ûy¶Ûy¯Ûy¨Ûy¡ÛyšÛy“ÛyŒÛy…Ûy~ÛywÛypÛyiÛybÛy[ÛyTÛyMÛyFÛy?Ûy8Ûy1Ûy*Ûy#ÛyÛyÛyÛyÛyÛyùÚyòÚyëÚyäÚyÝÚyÖÚyÏÚyÈÚyÁÚyºÚy³Úy¬Úy¥ÚyžÚy—ÚyÚy‰Úy‚Úy{ÚytÚymÚyfÚy_ÚyXÚyQÚyJÚyCÚy<Úy5Úy.Úy'Úy ÚyÚyÚy ÚyÚyýÙyöÙyïÙyèÙyáÙyÚÙyÓÙyÌÙyÅÙy¾Ùy·Ùy°Ùy©Ùy¢Ùy›Ùy”ÙyÙy†ÙyÙyxÙyqÙyjÙycÙy\ÙyUÙyNÙyGÙy@Ùy9Ùy2Ùy+Ùy$ÙyÙyÙyÙyÙyÙyúØyóØyìØyåØyÞØyרyÐØyÉØyÂØy»Øy´Øy­Øy¦ØyŸØy˜Øy‘ØyŠØyƒØy|ØyuØynØygØy`ØyYØyRØyKØyDØy=Øy6Øy/Øy(Øy!ØyØyØy ØyØyþ×y÷×yð×yé×yâ×yÛ×yÔ×yÍ×yÆ×y¿×y¸×y±×yª×y£×yœ×y•×yŽ×y‡×y€×yy×yr×yk×yd×y]×yV×yO×yH×yA×y:×y3×y,×y%×y×y×y×y ×y×yûÖyôÖyíÖyæÖyßÖyØÖyÑÖyÊÖyÃÖy¼ÖyµÖy®Öy§Öy Öy™Öy’Öy‹Öy„Öy}ÖyvÖyoÖyhÖyaÖyZÖySÖyLÖyEÖy>Öy7Öy0Öy)Öy"ÖyÖyÖy ÖyÖyÿÕyøÕyñÕyêÕyãÕyÜÕyÕÕyÎÕyÇÕyÀÕy¹Õy²Õy«Õy¤ÕyÕy–ÕyÕyˆÕyÕyzÕysÕylÕyeÕy^ÕyWÕyPÕyIÕyBÕy;Õy4Õy-Õy&ÕyÕyÕyÕy ÕyÕyüÔyõÔyîÔyçÔyàÔyÙÔyÒÔyËÔyÄÔy½Ôy¶Ôy¯Ôy¨Ôy¡ÔyšÔy“ÔyŒÔy…Ôy~ÔywÔypÔyiÔybÔy[ÔyTÔyMÔyFÔy?Ôy8Ôy1Ôy*Ôy#ÔyÔyÔyÔyÔyÔyùÓyòÓyëÓyäÓyÝÓyÖÓyÏÓyÈÓyÁÓyºÓy³Óy¬Óy¥ÓyžÓy—ÓyÓy‰Óy‚Óy{ÓytÓymÓyfÓy_ÓyXÓyQÓyJÓyCÓy<Óy5Óy.Óy'Óy ÓyÓyÓy ÓyÓyýÒyöÒyïÒyèÒyáÒyÚÒyÓÒyÌÒyÅÒy¾Òy·Òy°Òy©Òy¢Òy›Òy”ÒyÒy†ÒyÒyxÒyqÒyjÒycÒy\ÒyUÒyNÒyGÒy@Òy9Òy2Òy+Òy$ÒyÒyÒyÒyÒyÒyúÑyóÑyìÑyåÑyÞÑy×ÑyÐÑyÉÑyÂÑy»Ñy´Ñy­Ñy¦ÑyŸÑy˜Ñy‘ÑyŠÑyƒÑy|ÑyuÑynÑygÑy`ÑyYÑyRÑyKÑyDÑy=Ñy6Ñy/Ñy(Ñy!ÑyÑyÑy ÑyÑyþÐy÷ÐyðÐyéÐyâÐyÛÐyÔÐyÍÐyÆÐy¿Ðy¸Ðy±ÐyªÐy£ÐyœÐy•ÐyŽÐy‡Ðy€ÐyyÐyrÐykÐydÐy]ÐyVÐyOÐyHÐyAÐy:Ðy3Ðy,Ðy%ÐyÐyÐyÐy ÐyÐyûÏyôÏyíÏyæÏyßÏyØÏyÑÏyÊÏyÃÏy¼ÏyµÏy®Ïy§Ïy Ïy™Ïy’Ïy‹Ïy„Ïy}ÏyvÏyoÏyhÏyaÏyZÏySÏyLÏyEÏy>Ïy7Ïy0Ïy)Ïy"ÏyÏyÏy ÏyÏyÿÎyøÎyñÎyêÎyãÎyÜÎyÕÎyÎÎyÇÎyÀÎy¹Îy²Îy«Îy¤ÎyÎy–ÎyÎyˆÎyÎyzÎysÎylÎyeÎy^ÎyWÎyPÎyIÎyBÎy;Îy4Îy-Îy&ÎyÎyÎyÎy ÎyÎyüÍyõÍyîÍyçÍyàÍyÙÍyÒÍyËÍyÄÍy½Íy¶Íy¯Íy¨Íy¡ÍyšÍy“ÍyŒÍy…Íy~ÍywÍypÍyiÍybÍy[ÍyTÍyMÍyFÍy?Íy8Íy1Íy*Íy#ÍyÍyÍyÍyÍyÍyùÌyòÌyëÌyäÌyÝÌyÖÌyÏÌyÈÌyÁÌyºÌy³Ìy¬Ìy¥ÌyžÌy—ÌyÌy‰Ìy‚Ìy{ÌytÌymÌyfÌy_ÌyXÌyQÌyJÌyCÌy<Ìy5Ìy.Ìy'Ìy ÌyÌyÌy ÌyÌyýËyöËyïËyèËyáËyÚËyÓËyÌËyÅËy¾Ëy·Ëy°Ëy©Ëy¢Ëy›Ëy”ËyËy†ËyËyxËyqËyjËycËy\ËyUËyNËyGËy@Ëy9Ëy2Ëy+Ëy$ËyËyËyËyËyËyúÊyóÊyìÊyåÊyÞÊy×ÊyÐÊyÉÊyÂÊy»Êy´Êy­Êy¦ÊyŸÊy˜Êy‘ÊyŠÊyƒÊy|ÊyuÊynÊygÊy`ÊyYÊyRÊyKÊyDÊy=Êy6Êy/Êy(Êy!ÊyÊyÊy ÊyÊyþÉy÷ÉyðÉyéÉyâÉyÛÉyÔÉyÍÉyÆÉy¿Éy¸Éy±ÉyªÉy£ÉyœÉy•ÉyŽÉy‡Éy€ÉyyÉyrÉykÉydÉy]ÉyVÉyOÉyHÉyAÉy:Éy3Éy,Éy%ÉyÉyÉyÉy ÉyÉyûÈyôÈyíÈyæÈyßÈyØÈyÑÈyÊÈyÃÈy¼ÈyµÈy®Èy§Èy Èy™Èy’Èy‹Èy„Èy}ÈyvÈyoÈyhÈyaÈyZÈySÈyLÈyEÈy>Èy7Èy0Èy)Èy"ÈyÈyÈy ÈyÈyÿÇyøÇyñÇyêÇyãÇyÜÇyÕÇyÎÇyÇÇyÀÇy¹Çy²Çy«Çy¤ÇyÇy–ÇyÇyˆÇyÇyzÇysÇylÇyeÇy^ÇyWÇyPÇyIÇyBÇy;Çy4Çy-Çy&ÇyÇyÇyÇy ÇyÇyüÆyõÆyîÆyçÆyàÆyÙÆyÒÆyËÆyÄÆy½Æy¶Æy¯Æy¨Æy¡ÆyšÆy“ÆyŒÆy…Æy~ÆywÆypÆyiÆybÆy[ÆyTÆyMÆyFÆy?Æy8Æy1Æy*Æy#ÆyÆyÆyÆyÆyÆyùÅyòÅyëÅyäÅyÝÅyÖÅyÏÅyÈÅyÁÅyºÅy³Åy¬Åy¥ÅyžÅy—ÅyÅy‰Åy‚Åy{ÅytÅymÅyfÅy_ÅyXÅyQÅyJÅyCÅy<Åy5Åy.Åy'Åy ÅyÅyÅy ÅyÅyýÄyöÄyïÄyèÄyáÄyÚÄyÓÄyÌÄyÅÄy¾Äy·Äy°Äy©Äy¢Äy›Äy”ÄyÄy†ÄyÄyxÄyqÄyjÄycÄy\ÄyUÄyNÄyGÄy@Äy9Äy2Äy+Äy$ÄyÄyÄyÄyÄyÄyúÃyóÃyìÃyåÃyÞÃy×ÃyÐÃyÉÃyÂÃy»Ãy´Ãy­Ãy¦ÃyŸÃy˜Ãy‘ÃyŠÃyƒÃy|ÃyuÃynÃygÃy`ÃyYÃyRÃyKÃyDÃy=Ãy6Ãy/Ãy(Ãy!ÃyÃyÃy ÃyÃyþÂy÷ÂyðÂyéÂyâÂyÛÂyÔÂyÍÂyÆÂy¿Ây¸Ây±ÂyªÂy£ÂyœÂy•ÂyŽÂy‡Ây€ÂyyÂyrÂykÂydÂy]ÂyVÂyOÂyHÂyAÂy:Ây3Ây,Ây%ÂyÂyÂyÂy ÂyÂyûÁyôÁyíÁyæÁyßÁyØÁyÑÁyÊÁyÃÁy¼ÁyµÁy®Áy§Áy Áy™Áy’Áy‹Áy„Áy}ÁyvÁyoÁyhÁyaÁyZÁySÁyLÁyEÁy>Áy7Áy0Áy)Áy"ÁyÁyÁy ÁyÁyÿÀyøÀyñÀyêÀyãÀyÜÀyÕÀyÎÀyÇÀyÀÀy¹Ày²Ày«Ày¤ÀyÀy–ÀyÀyˆÀyÀyzÀysÀylÀyeÀy^ÀyWÀyPÀyIÀyBÀy;Ày4Ày-Ày&ÀyÀyÀyÀy ÀyÀyü¿yõ¿yî¿yç¿yà¿yÙ¿yÒ¿yË¿yÄ¿y½¿y¶¿y¯¿y¨¿y¡¿yš¿y“¿yŒ¿y…¿y~¿yw¿yp¿yi¿yb¿y[¿yT¿yM¿yF¿y?¿y8¿y1¿y*¿y#¿y¿y¿y¿y¿y¿yù¾yò¾yë¾yä¾yݾyÖ¾yϾyȾyÁ¾yº¾y³¾y¬¾y¥¾yž¾y—¾y¾y‰¾y‚¾y{¾yt¾ym¾yf¾y_¾yX¾yQ¾yJ¾yC¾y<¾y5¾y.¾y'¾y ¾y¾y¾y ¾y¾yý½yö½yï½yè½yá½yÚ½yÓ½y̽yŽy¾½y·½y°½y©½y¢½y›½y”½y½y†½y½yx½yq½yj½yc½y\½yU½yN½yG½y@½y9½y2½y+½y$½y½y½y½y½y½yú¼yó¼yì¼yå¼yÞ¼y×¼yмyɼy¼y»¼y´¼y­¼y¦¼yŸ¼y˜¼y‘¼yмyƒ¼y|¼yu¼yn¼yg¼y`¼yY¼yR¼yK¼yD¼y=¼y6¼y/¼y(¼y!¼y¼y¼y ¼y¼yþ»y÷»yð»yé»yâ»yÛ»yÔ»yÍ»yÆ»y¿»y¸»y±»yª»y£»yœ»y•»yŽ»y‡»y€»yy»yr»yk»yd»y]»yV»yO»yH»yA»y:»y3»y,»y%»y»y»y»y »y»yûºyôºyíºyæºyߺyغyѺyʺyúy¼ºyµºy®ºy§ºy ºy™ºy’ºy‹ºy„ºy}ºyvºyoºyhºyaºyZºySºyLºyEºy>ºy7ºy0ºy)ºy"ºyºyºy ºyºyÿ¹yø¹yñ¹yê¹yã¹yܹyÕ¹yιyǹyÀ¹y¹¹y²¹y«¹y¤¹y¹y–¹y¹yˆ¹y¹yz¹ys¹yl¹ye¹y^¹yW¹yP¹yI¹yB¹y;¹y4¹y-¹y&¹y¹y¹y¹y ¹y¹yü¸yõ¸yî¸yç¸yà¸yÙ¸yÒ¸y˸yĸy½¸y¶¸y¯¸y¨¸y¡¸yš¸y“¸yŒ¸y…¸y~¸yw¸yp¸yi¸yb¸y[¸yT¸yM¸yF¸y?¸y8¸y1¸y*¸y#¸y¸y¸y¸y¸y¸yù·yò·yë·yä·yÝ·yÖ·yÏ·yÈ·yÁ·yº·y³·y¬·y¥·yž·y—·y·y‰·y‚·y{·yt·ym·yf·y_·yX·yQ·yJ·yC·y<·y5·y.·y'·y ·y·y·y ·y·yý¶yö¶yï¶yè¶yá¶yÚ¶yÓ¶y̶yŶy¾¶y·¶y°¶y©¶y¢¶y›¶y”¶y¶y†¶y¶yx¶yq¶yj¶yc¶y\¶yU¶yN¶yG¶y@¶y9¶y2¶y+¶y$¶y¶y¶y¶y¶y¶yúµyóµyìµyåµyÞµy×µyеyɵyµy»µy´µy­µy¦µyŸµy˜µy‘µyеyƒµy|µyuµynµygµy`µyYµyRµyKµyDµy=µy6µy/µy(µy!µyµyµy µyµyþ´y÷´yð´yé´yâ´yÛ´yÔ´yÍ´yÆ´y¿´y¸´y±´yª´y£´yœ´y•´yŽ´y‡´y€´yy´yr´yk´yd´y]´yV´yO´yH´yA´y:´y3´y,´y%´y´y´y´y ´y´yû³yô³yí³yæ³yß³yسyѳyʳyóy¼³yµ³y®³y§³y ³y™³y’³y‹³y„³y}³yv³yo³yh³ya³yZ³yS³yL³yE³y>³y7³y0³y)³y"³y³y³y ³y³yÿ²yø²yñ²yê²yã²yܲyÕ²yβyDzyÀ²y¹²y²²y«²y¤²y²y–²y²yˆ²y²yz²ys²yl²ye²y^²yW²yP²yI²yB²y;²y4²y-²y&²y²y²y²y ²y²yü±yõ±yî±yç±yà±yÙ±yÒ±y˱yıy½±y¶±y¯±y¨±y¡±yš±y“±yŒ±y…±y~±yw±yp±yi±yb±y[±yT±yM±yF±y?±y8±y1±y*±y#±y±y±y±y±y±yù°yò°yë°yä°yݰyÖ°yϰyȰyÁ°yº°y³°y¬°y¥°yž°y—°y°y‰°y‚°y{°yt°ym°yf°y_°yX°yQ°yJ°yC°y<°y5°y.°y'°y °y°y°y °y°yý¯yö¯yï¯yè¯yá¯yÚ¯yÓ¯y̯yůy¾¯y·¯y°¯y©¯y¢¯y›¯y”¯y¯y†¯y¯yx¯yq¯yj¯yc¯y\¯yU¯yN¯yG¯y@¯y9¯y2¯y+¯y$¯y¯y¯y¯y¯y¯yú®yó®yì®yå®yÞ®y×®yЮyÉ®y®y»®y´®y­®y¦®yŸ®y˜®y‘®yŠ®yƒ®y|®yu®yn®yg®y`®yY®yR®yK®yD®y=®y6®y/®y(®y!®y®y®y ®y®yþ­y÷­yð­yé­yâ­yÛ­yÔ­yÍ­yÆ­y¿­y¸­y±­yª­y£­yœ­y•­yŽ­y‡­y€­yy­yr­yk­yd­y]­yV­yO­yH­yA­y:­y3­y,­y%­y­y­y­y ­y­yû¬yô¬yí¬yæ¬y߬yجyѬyʬyìy¼¬yµ¬y®¬y§¬y ¬y™¬y’¬y‹¬y„¬y}¬yv¬yo¬yh¬ya¬yZ¬yS¬yL¬yE¬y>¬y7¬y0¬y)¬y"¬y¬y¬y ¬y¬yÿ«yø«yñ«yê«yã«yÜ«yÕ«yΫyÇ«yÀ«y¹«y²«y««y¤«y«y–«y«yˆ«y«yz«ys«yl«ye«y^«yW«yP«yI«yB«y;«y4«y-«y&«y«y«y«y «y«yüªyõªyîªyçªyàªyÙªyÒªy˪yĪy½ªy¶ªy¯ªy¨ªy¡ªyšªy“ªyŒªy…ªy~ªywªypªyiªybªy[ªyTªyMªyFªy?ªy8ªy1ªy*ªy#ªyªyªyªyªyªyù©yò©yë©yä©yÝ©yÖ©yÏ©yÈ©yÁ©yº©y³©y¬©y¥©yž©y—©y©y‰©y‚©y{©yt©ym©yf©y_©yX©yQ©yJ©yC©y<©y5©y.©y'©y ©y©y©y ©y©yý¨yö¨yï¨yè¨yá¨yÚ¨yÓ¨y̨yŨy¾¨y·¨y°¨y©¨y¢¨y›¨y”¨y¨y†¨y¨yx¨yq¨yj¨yc¨y\¨yU¨yN¨yG¨y@¨y9¨y2¨y+¨y$¨y¨y¨y¨y¨y¨yú§yó§yì§yå§yÞ§y×§yЧyɧy§y»§y´§y­§y¦§yŸ§y˜§y‘§yЧyƒ§y|§yu§yn§yg§y`§yY§yR§yK§yD§y=§y6§y/§y(§y!§y§y§y §y§yþ¦y÷¦yð¦yé¦yâ¦yÛ¦yÔ¦yͦyƦy¿¦y¸¦y±¦yª¦y£¦yœ¦y•¦yަy‡¦y€¦yy¦yr¦yk¦yd¦y]¦yV¦yO¦yH¦yA¦y:¦y3¦y,¦y%¦y¦y¦y¦y ¦y¦yû¥yô¥yí¥yæ¥yߥyØ¥yÑ¥yÊ¥yÃ¥y¼¥yµ¥y®¥y§¥y ¥y™¥y’¥y‹¥y„¥y}¥yv¥yo¥yh¥ya¥yZ¥yS¥yL¥yE¥y>¥y7¥y0¥y)¥y"¥y¥y¥y ¥y¥yÿ¤yø¤yñ¤yê¤yã¤yܤyÕ¤yΤyǤyÀ¤y¹¤y²¤y«¤y¤¤y¤y–¤y¤yˆ¤y¤yz¤ys¤yl¤ye¤y^¤yW¤yP¤yI¤yB¤y;¤y4¤y-¤y&¤y¤y¤y¤y ¤y¤yü£yõ£yî£yç£yà£yÙ£yÒ£yË£yÄ£y½£y¶£y¯£y¨£y¡£yš£y“£yŒ£y…£y~£yw£yp£yi£yb£y[£yT£yM£yF£y?£y8£y1£y*£y#£y£y£y£y£y£yù¢yò¢yë¢yä¢yÝ¢yÖ¢yÏ¢yÈ¢yÁ¢yº¢y³¢y¬¢y¥¢yž¢y—¢y¢y‰¢y‚¢y{¢yt¢ym¢yf¢y_¢yX¢yQ¢yJ¢yC¢y<¢y5¢y.¢y'¢y ¢y¢y¢y ¢y¢yý¡yö¡yï¡yè¡yá¡yÚ¡yÓ¡yÌ¡yÅ¡y¾¡y·¡y°¡y©¡y¢¡y›¡y”¡y¡y†¡y¡yx¡yq¡yj¡yc¡y\¡yU¡yN¡yG¡y@¡y9¡y2¡y+¡y$¡y¡y¡y¡y¡y¡yú yó yì yå yÞ y× yРyÉ y y» y´ y­ y¦ yŸ y˜ y‘ yŠ yƒ y| yu yn yg y` yY yR yK yD y= y6 y/ y( y! y y y  y yþŸy÷ŸyðŸyéŸyâŸyÛŸyÔŸyÍŸyÆŸy¿Ÿy¸Ÿy±ŸyªŸy£ŸyœŸy•ŸyŽŸy‡Ÿy€ŸyyŸyrŸykŸydŸy]ŸyVŸyOŸyHŸyAŸy:Ÿy3Ÿy,Ÿy%ŸyŸyŸyŸy ŸyŸyûžyôžyížyæžyßžyØžyÑžyÊžyÞy¼žyµžy®žy§žy žy™žy’žy‹žy„žy}žyvžyožyhžyažyZžySžyLžyEžy>žy7žy0žy)žy"žyžyžy žyžyÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüœyõœyîœyçœyàœyÙœyÒœyËœyÄœy½œy¶œy¯œy¨œy¡œyšœy“œyŒœy…œy~œywœypœyiœybœy[œyTœyMœyFœy?œy8œy1œy*œy#œyœyœyœyœyœyù›yò›yë›yä›yÝ›yÖ›yÏ›yÈ›yÁ›yº›y³›y¬›y¥›yž›y—›y›y‰›y‚›y{›yt›ym›yf›y_›yX›yQ›yJ›yC›y<›y5›y.›y'›y ›y›y›y ›y›yýšyöšyïšyèšyášyÚšyÓšyÌšyÅšy¾šy·šy°šy©šy¢šy›šy”šyšy†šyšyxšyqšyjšycšy\šyUšyNšyGšy@šy9šy2šy+šy$šyšyšyšyšyšyú™yó™yì™yå™yÞ™y×™yЙyÉ™y™y»™y´™y­™y¦™yŸ™y˜™y‘™yŠ™yƒ™y|™yu™yn™yg™y`™yY™yR™yK™yD™y=™y6™y/™y(™y!™y™y™y ™y™yþ˜y÷˜yð˜yé˜yâ˜yÛ˜yÔ˜y͘yƘy¿˜y¸˜y±˜yª˜y£˜yœ˜y•˜yŽ˜y‡˜y€˜yy˜yr˜yk˜yd˜y]˜yV˜yO˜yH˜yA˜y:˜y3˜y,˜y%˜y˜y˜y˜y ˜y˜yû—yô—yí—yæ—yß—yØ—yÑ—yÊ—y×y¼—yµ—y®—y§—y —y™—y’—y‹—y„—y}—yv—yo—yh—ya—yZ—yS—yL—yE—y>—y7—y0—y)—y"—y—y—y —y—yÿ–yø–yñ–yê–yã–yÜ–yÕ–yΖyÇ–yÀ–y¹–y²–y«–y¤–y–y––y–yˆ–y–yz–ys–yl–ye–y^–yW–yP–yI–yB–y;–y4–y-–y&–y–y–y–y –y–yü•yõ•yî•yç•yà•yÙ•yÒ•yË•yÄ•y½•y¶•y¯•y¨•y¡•yš•y“•yŒ•y…•y~•yw•yp•yi•yb•y[•yT•yM•yF•y?•y8•y1•y*•y#•y•y•y•y•y•yù”yò”yë”yä”yÝ”yÖ”yÏ”yÈ”yÁ”yº”y³”y¬”y¥”yž”y—”y”y‰”y‚”y{”yt”ym”yf”y_”yX”yQ”yJ”yC”y<”y5”y.”y'”y ”y”y”y ”y”yý“yö“yï“yè“yá“yÚ“yÓ“yÌ“yÅ“y¾“y·“y°“y©“y¢“y›“y”“y“y†“y“yx“yq“yj“yc“y\“yU“yN“yG“y@“y9“y2“y+“y$“y“y“y“y“y“yú’yó’yì’yå’yÞ’y×’yÐ’yÉ’yÂ’y»’y´’y­’y¦’yŸ’y˜’y‘’yŠ’yƒ’y|’yu’yn’yg’y`’yY’yR’yK’yD’y=’y6’y/’y(’y!’y’y’y ’y’yþ‘y÷‘yð‘yé‘yâ‘yÛ‘yÔ‘yÍ‘yÆ‘y¿‘y¸‘y±‘yª‘y£‘yœ‘y•‘yŽ‘y‡‘y€‘yy‘yr‘yk‘yd‘y]‘yV‘yO‘yH‘yA‘y:‘y3‘y,‘y%‘y‘y‘y‘y ‘y‘yûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüŽyõŽyîŽyçŽyàŽyÙŽyÒŽyËŽyÄŽy½Žy¶Žy¯Žy¨Žy¡ŽyšŽy“ŽyŒŽy…Žy~ŽywŽypŽyiŽybŽy[ŽyTŽyMŽyFŽy?Žy8Žy1Žy*Žy#ŽyŽyŽyŽyŽyŽyùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy‰y7‰y0‰y)‰y"‰y‰y‰y ‰y‰yÿˆyøˆyñˆyêˆyãˆy܈yÕˆyΈyLjyÀˆy¹ˆy²ˆy«ˆy¤ˆyˆy–ˆyˆyˆˆyˆyzˆysˆylˆyeˆy^ˆyWˆyPˆyIˆyBˆy;ˆy4ˆy-ˆy&ˆyˆyˆyˆy ˆyˆyü‡yõ‡yî‡yç‡yà‡yÙ‡yÒ‡yˇyćy½‡y¶‡y¯‡y¨‡y¡‡yš‡y“‡yŒ‡y…‡y~‡yw‡yp‡yi‡yb‡y[‡yT‡yM‡yF‡y?‡y8‡y1‡y*‡y#‡y‡y‡y‡y‡y‡yù†yò†yë†yä†y݆yÖ†yφyȆyÁ†yº†y³†y¬†y¥†yž†y—†y†y‰†y‚†y{†yt†ym†yf†y_†yX†yQ†yJ†yC†y<†y5†y.†y'†y †y†y†y †y†yý…yö…yï…yè…yá…yÚ…yÓ…yÌ…yÅ…y¾…y·…y°…y©…y¢…y›…y”…y…y†…y…yx…yq…yj…yc…y\…yU…yN…yG…y@…y9…y2…y+…y$…y…y…y…y…y…yú„yó„yì„yå„yÞ„yׄyЄyÉ„y„y»„y´„y­„y¦„yŸ„y˜„y‘„yŠ„yƒ„y|„yu„yn„yg„y`„yY„yR„yK„yD„y=„y6„y/„y(„y!„y„y„y „y„yþƒy÷ƒyðƒyéƒyâƒyÛƒyÔƒy̓yƃy¿ƒy¸ƒy±ƒyªƒy£ƒyœƒy•ƒyŽƒy‡ƒy€ƒyyƒyrƒykƒydƒy]ƒyVƒyOƒyHƒyAƒy:ƒy3ƒy,ƒy%ƒyƒyƒyƒy ƒyƒyû‚yô‚yí‚yæ‚yß‚yØ‚yÑ‚yÊ‚yÂy¼‚yµ‚y®‚y§‚y ‚y™‚y’‚y‹‚y„‚y}‚yv‚yo‚yh‚ya‚yZ‚yS‚yL‚yE‚y>‚y7‚y0‚y)‚y"‚y‚y‚y ‚y‚yÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyü€yõ€yî€yç€yà€yÙ€yÒ€yË€yÄ€y½€y¶€y¯€y¨€y¡€yš€y“€yŒ€y…€y~€yw€yp€yi€yb€y[€yT€yM€yF€y?€y8€y1€y*€y#€y€y€y€y€y€yùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyý~yö~yï~yè~yá~yÚ~yÓ~yÌ~yÅ~y¾~y·~y°~y©~y¢~y›~y”~y~y†~y~yx~yq~yj~yc~y\~yU~yN~yG~y@~y9~y2~y+~y$~y~y~y~y~y~yú}yó}yì}yå}yÞ}y×}yÐ}yÉ}yÂ}y»}y´}y­}y¦}yŸ}y˜}y‘}yŠ}yƒ}y|}yu}yn}yg}y`}yY}yR}yK}yD}y=}y6}y/}y(}y!}y}y}y }y}yþ|y÷|yð|yé|yâ|yÛ|yÔ|yÍ|yÆ|y¿|y¸|y±|yª|y£|yœ|y•|yŽ|y‡|y€|yy|yr|yk|yd|y]|yV|yO|yH|yA|y:|y3|y,|y%|y|y|y|y |y|yû{yô{yí{yæ{yß{yØ{yÑ{yÊ{yÃ{y¼{yµ{y®{y§{y {y™{y’{y‹{y„{y}{yv{yo{yh{ya{yZ{yS{yL{yE{y>{y7{y0{y){y"{y{y{y {y{yÿzyøzyñzyêzyãzyÜzyÕzyÎzyÇzyÀzy¹zy²zy«zy¤zyzy–zyzyˆzyzyzzyszylzyezy^zyWzyPzyIzyBzy;zy4zy-zy&zyzyzyzy zyzyüyyõyyîyyçyyàyyÙyyÒyyËyyÄyy½yy¶yy¯yy¨yy¡yyšyy“yyŒyy…yy~yywyypyyiyybyy[yyTyyMyyFyy?yy8yy1yy*yy#yyyyyyyyyyyyùxyòxyëxyäxyÝxyÖxyÏxyÈxyÁxyºxy³xy¬xy¥xyžxy—xyxy‰xy‚xy{xytxymxyfxy_xyXxyQxyJxyCxyty7ty0ty)ty"tytyty tytyÿsyøsyñsyêsyãsyÜsyÕsyÎsyÇsyÀsy¹sy²sy«sy¤sysy–sysyˆsysyzsyssylsyesy^syWsyPsyIsyBsy;sy4sy-sy&sysysysy sysyüryõryîryçryàryÙryÒryËryÄry½ry¶ry¯ry¨ry¡ryšry“ryŒry…ry~rywrypryirybry[ryTryMryFry?ry8ry1ry*ry#ryryryryryryùqyòqyëqyäqyÝqyÖqyÏqyÈqyÁqyºqy³qy¬qy¥qyžqy—qyqy‰qy‚qy{qytqymqyfqy_qyXqyQqyJqyCqymy7my0my)my"mymymy mymyÿlyølyñlyêlyãlyÜlyÕlyÎlyÇlyÀly¹ly²ly«ly¤lyly–lylyˆlylyzlyslyllyely^lyWlyPlyIlyBly;ly4ly-ly&lylylyly lylyükyõkyîkyçkyàkyÙkyÒkyËkyÄky½ky¶ky¯ky¨ky¡kyšky“kyŒky…ky~kywkypkyikybky[kyTkyMkyFky?ky8ky1ky*ky#kykykykykykyùjyòjyëjyäjyÝjyÖjyÏjyÈjyÁjyºjy³jy¬jy¥jyžjy—jyjy‰jy‚jy{jytjymjyfjy_jyXjyQjyJjyCjyfy7fy0fy)fy"fyfyfy fyfyÿeyøeyñeyêeyãeyÜeyÕeyÎeyÇeyÀey¹ey²ey«ey¤eyey–eyeyˆeyeyzeyseyleyeey^eyWeyPeyIeyBey;ey4ey-ey&eyeyeyey eyeyüdyõdyîdyçdyàdyÙdyÒdyËdyÄdy½dy¶dy¯dy¨dy¡dyšdy“dyŒdy…dy~dywdypdyidybdy[dyTdyMdyFdy?dy8dy1dy*dy#dydydydydydyùcyòcyëcyäcyÝcyÖcyÏcyÈcyÁcyºcy³cy¬cy¥cyžcy—cycy‰cy‚cy{cytcymcyfcy_cyXcyQcyJcyCcy_y7_y0_y)_y"_y_y_y _y_yÿ^yø^yñ^yê^yã^yÜ^yÕ^yÎ^yÇ^yÀ^y¹^y²^y«^y¤^y^y–^y^yˆ^y^yz^ys^yl^ye^y^^yW^yP^yI^yB^y;^y4^y-^y&^y^y^y^y ^y^yü]yõ]yî]yç]yà]yÙ]yÒ]yË]yÄ]y½]y¶]y¯]y¨]y¡]yš]y“]yŒ]y…]y~]yw]yp]yi]yb]y[]yT]yM]yF]y?]y8]y1]y*]y#]y]y]y]y]y]yù\yò\yë\yä\yÝ\yÖ\yÏ\yÈ\yÁ\yº\y³\y¬\y¥\yž\y—\y\y‰\y‚\y{\yt\ym\yf\y_\yX\yQ\yJ\yC\y<\y5\y.\y'\y \y\y\y \y\yý[yö[yï[yè[yá[yÚ[yÓ[yÌ[yÅ[y¾[y·[y°[y©[y¢[y›[y”[y[y†[y[yx[yq[yj[yc[y\[yU[yN[yG[y@[y9[y2[y+[y$[y[y[y[y[y[yúZyóZyìZyåZyÞZy×ZyÐZyÉZyÂZy»Zy´Zy­Zy¦ZyŸZy˜Zy‘ZyŠZyƒZy|ZyuZynZygZy`ZyYZyRZyKZyDZy=Zy6Zy/Zy(Zy!ZyZyZy ZyZyþYy÷YyðYyéYyâYyÛYyÔYyÍYyÆYy¿Yy¸Yy±YyªYy£YyœYy•YyŽYy‡Yy€YyyYyrYykYydYy]YyVYyOYyHYyAYy:Yy3Yy,Yy%YyYyYyYy YyYyûXyôXyíXyæXyßXyØXyÑXyÊXyÃXy¼XyµXy®Xy§Xy Xy™Xy’Xy‹Xy„Xy}XyvXyoXyhXyaXyZXySXyLXyEXy>Xy7Xy0Xy)Xy"XyXyXy XyXyÿWyøWyñWyêWyãWyÜWyÕWyÎWyÇWyÀWy¹Wy²Wy«Wy¤WyWy–WyWyˆWyWyzWysWylWyeWy^WyWWyPWyIWyBWy;Wy4Wy-Wy&WyWyWyWy WyWyüVyõVyîVyçVyàVyÙVyÒVyËVyÄVy½Vy¶Vy¯Vy¨Vy¡VyšVy“VyŒVy…Vy~VywVypVyiVybVy[VyTVyMVyFVy?Vy8Vy1Vy*Vy#VyVyVyVyVyVyùUyòUyëUyäUyÝUyÖUyÏUyÈUyÁUyºUy³Uy¬Uy¥UyžUy—UyUy‰Uy‚Uy{UytUymUyfUy_UyXUyQUyJUyCUyQy7Qy0Qy)Qy"QyQyQy QyQyÿPyøPyñPyêPyãPyÜPyÕPyÎPyÇPyÀPy¹Py²Py«Py¤PyPy–PyPyˆPyPyzPysPylPyePy^PyWPyPPyIPyBPy;Py4Py-Py&PyPyPyPy PyPyüOyõOyîOyçOyàOyÙOyÒOyËOyÄOy½Oy¶Oy¯Oy¨Oy¡OyšOy“OyŒOy…Oy~OywOypOyiOybOy[OyTOyMOyFOy?Oy8Oy1Oy*Oy#OyOyOyOyOyOyùNyòNyëNyäNyÝNyÖNyÏNyÈNyÁNyºNy³Ny¬Ny¥NyžNy—NyNy‰Ny‚Ny{NytNymNyfNy_NyXNyQNyJNyCNyJy7Jy0Jy)Jy"JyJyJy JyJyÿIyøIyñIyêIyãIyÜIyÕIyÎIyÇIyÀIy¹Iy²Iy«Iy¤IyIy–IyIyˆIyIyzIysIylIyeIy^IyWIyPIyIIyBIy;Iy4Iy-Iy&IyIyIyIy IyIyüHyõHyîHyçHyàHyÙHyÒHyËHyÄHy½Hy¶Hy¯Hy¨Hy¡HyšHy“HyŒHy…Hy~HywHypHyiHybHy[HyTHyMHyFHy?Hy8Hy1Hy*Hy#HyHyHyHyHyHyùGyòGyëGyäGyÝGyÖGyÏGyÈGyÁGyºGy³Gy¬Gy¥GyžGy—GyGy‰Gy‚Gy{GytGymGyfGy_GyXGyQGyJGyCGyCy7Cy0Cy)Cy"CyCyCy CyCyÿByøByñByêByãByÜByÕByÎByÇByÀBy¹By²By«By¤ByBy–ByByˆByByzBysBylByeBy^ByWByPByIByBBy;By4By-By&ByByByBy ByByüAyõAyîAyçAyàAyÙAyÒAyËAyÄAy½Ay¶Ay¯Ay¨Ay¡AyšAy“AyŒAy…Ay~AywAypAyiAybAy[AyTAyMAyFAy?Ay8Ay1Ay*Ay#AyAyAyAyAyAyù@yò@yë@yä@yÝ@yÖ@yÏ@yÈ@yÁ@yº@y³@y¬@y¥@yž@y—@y@y‰@y‚@y{@yt@ym@yf@y_@yX@yQ@yJ@yC@y<@y5@y.@y'@y @y@y@y @y@yý?yö?yï?yè?yá?yÚ?yÓ?yÌ?yÅ?y¾?y·?y°?y©?y¢?y›?y”?y?y†?y?yx?yq?yj?yc?y\?yU?yN?yG?y@?y9?y2?y+?y$?y?y?y?y?y?yú>yó>yì>yå>yÞ>y×>yÐ>yÉ>yÂ>y»>y´>y­>y¦>yŸ>y˜>y‘>yŠ>yƒ>y|>yu>yn>yg>y`>yY>yR>yK>yD>y=>y6>y/>y(>y!>y>y>y >y>yþ=y÷=yð=yé=yâ=yÛ=yÔ=yÍ=yÆ=y¿=y¸=y±=yª=y£=yœ=y•=yŽ=y‡=y€=yy=yr=yk=yd=y]=yV=yO=yH=yA=y:=y3=y,=y%=y=y=y=y =y=yû5y75y05y)5y"5y5y5y 5y5yÿ4yø4yñ4yê4yã4yÜ4yÕ4yÎ4yÇ4yÀ4y¹4y²4y«4y¤4y4y–4y4yˆ4y4yz4ys4yl4ye4y^4yW4yP4yI4yB4y;4y44y-4y&4y4y4y4y 4y4yü3yõ3yî3yç3yà3yÙ3yÒ3yË3yÄ3y½3y¶3y¯3y¨3y¡3yš3y“3yŒ3y…3y~3yw3yp3yi3yb3y[3yT3yM3yF3y?3y83y13y*3y#3y3y3y3y3y3yù2yò2yë2yä2yÝ2yÖ2yÏ2yÈ2yÁ2yº2y³2y¬2y¥2yž2y—2y2y‰2y‚2y{2yt2ym2yf2y_2yX2yQ2yJ2yC2y<2y52y.2y'2y 2y2y2y 2y2yý1yö1yï1yè1yá1yÚ1yÓ1yÌ1yÅ1y¾1y·1y°1y©1y¢1y›1y”1y1y†1y1yx1yq1yj1yc1y\1yU1yN1yG1y@1y91y21y+1y$1y1y1y1y1y1yú0yó0yì0yå0yÞ0y×0yÐ0yÉ0yÂ0y»0y´0y­0y¦0yŸ0y˜0y‘0yŠ0yƒ0y|0yu0yn0yg0y`0yY0yR0yK0yD0y=0y60y/0y(0y!0y0y0y 0y0yþ/y÷/yð/yé/yâ/yÛ/yÔ/yÍ/yÆ/y¿/y¸/y±/yª/y£/yœ/y•/yŽ/y‡/y€/yy/yr/yk/yd/y]/yV/yO/yH/yA/y:/y3/y,/y%/y/y/y/y /y/yû.yô.yí.yæ.yß.yØ.yÑ.yÊ.yÃ.y¼.yµ.y®.y§.y .y™.y’.y‹.y„.y}.yv.yo.yh.ya.yZ.yS.yL.yE.y>.y7.y0.y).y".y.y.y .y.yÿ-yø-yñ-yê-yã-yÜ-yÕ-yÎ-yÇ-yÀ-y¹-y²-y«-y¤-y-y–-y-yˆ-y-yz-ys-yl-ye-y^-yW-yP-yI-yB-y;-y4-y--y&-y-y-y-y -y-yü,yõ,yî,yç,yà,yÙ,yÒ,yË,yÄ,y½,y¶,y¯,y¨,y¡,yš,y“,yŒ,y…,y~,yw,yp,yi,yb,y[,yT,yM,yF,y?,y8,y1,y*,y#,y,y,y,y,y,yù+yò+yë+yä+yÝ+yÖ+yÏ+yÈ+yÁ+yº+y³+y¬+y¥+yž+y—+y+y‰+y‚+y{+yt+ym+yf+y_+yX+yQ+yJ+yC+y<+y5+y.+y'+y +y+y+y +y+yý*yö*yï*yè*yá*yÚ*yÓ*yÌ*yÅ*y¾*y·*y°*y©*y¢*y›*y”*y*y†*y*yx*yq*yj*yc*y\*yU*yN*yG*y@*y9*y2*y+*y$*y*y*y*y*y*yú)yó)yì)yå)yÞ)y×)yÐ)yÉ)yÂ)y»)y´)y­)y¦)yŸ)y˜)y‘)yŠ)yƒ)y|)yu)yn)yg)y`)yY)yR)yK)yD)y=)y6)y/)y()y!)y)y)y )y)yþ(y÷(yð(yé(yâ(yÛ(yÔ(yÍ(yÆ(y¿(y¸(y±(yª(y£(yœ(y•(yŽ(y‡(y€(yy(yr(yk(yd(y](yV(yO(yH(yA(y:(y3(y,(y%(y(y(y(y (y(yû'yô'yí'yæ'yß'yØ'yÑ'yÊ'yÃ'y¼'yµ'y®'y§'y 'y™'y’'y‹'y„'y}'yv'yo'yh'ya'yZ'yS'yL'yE'y>'y7'y0'y)'y"'y'y'y 'y'yÿ&yø&yñ&yê&yã&yÜ&yÕ&yÎ&yÇ&yÀ&y¹&y²&y«&y¤&y&y–&y&yˆ&y&yz&ys&yl&ye&y^&yW&yP&yI&yB&y;&y4&y-&y&&y&y&y&y &y&yü%yõ%yî%yç%yà%yÙ%yÒ%yË%yÄ%y½%y¶%y¯%y¨%y¡%yš%y“%yŒ%y…%y~%yw%yp%yi%yb%y[%yT%yM%yF%y?%y8%y1%y*%y#%y%y%y%y%y%yù$yò$yë$yä$yÝ$yÖ$yÏ$yÈ$yÁ$yº$y³$y¬$y¥$yž$y—$y$y‰$y‚$y{$yt$ym$yf$y_$yX$yQ$yJ$yC$y<$y5$y.$y'$y $y$y$y $y$yý#yö#yï#yè#yá#yÚ#yÓ#yÌ#yÅ#y¾#y·#y°#y©#y¢#y›#y”#y#y†#y#yx#yq#yj#yc#y\#yU#yN#yG#y@#y9#y2#y+#y$#y#y#y#y#y#yú"yó"yì"yå"yÞ"y×"yÐ"yÉ"yÂ"y»"y´"y­"y¦"yŸ"y˜"y‘"yŠ"yƒ"y|"yu"yn"yg"y`"yY"yR"yK"yD"y="y6"y/"y("y!"y"y"y "y"yþ!y÷!yð!yé!yâ!yÛ!yÔ!yÍ!yÆ!y¿!y¸!y±!yª!y£!yœ!y•!yŽ!y‡!y€!yy!yr!yk!yd!y]!yV!yO!yH!yA!y:!y3!y,!y%!y!y!y!y !y!yû yô yí yæ yß yØ yÑ yÊ yà y¼ yµ y® y§ y  y™ y’ y‹ y„ y} yv yo yh ya yZ yS yL yE y> y7 y0 y) y" y y y y yÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyýyöyïyèyáyÚyÓyÌyÅy¾y·y°y©y¢y›y”yy†yyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyýyöyïyèyáyÚyÓyÌyÅy¾y·y°y©y¢y›y”yy†yyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyýyöyïyèyáyÚyÓyÌyÅy¾y·y°y©y¢y›y”yy†yyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyú yó yì yå yÞ y× yÐ yÉ y y» y´ y­ y¦ yŸ y˜ y‘ yŠ yƒ y| yu yn yg y` yY yR yK yD y= y6 y/ y( y! y y y y yþ y÷ yð yé yâ yÛ yÔ yÍ yÆ y¿ y¸ y± yª y£ yœ y• yŽ y‡ y€ yy yr yk yd y] yV yO yH yA y: y3 y, y% y y y y y yû yô yí yæ yß yØ yÑ yÊ yà y¼ yµ y® y§ y  y™ y’ y‹ y„ y} yv yo yh ya yZ yS yL yE y> y7 y0 y) y" y y y y yÿ yø yñ yê yã yÜ yÕ yÎ yÇ yÀ y¹ y² y« y¤ y y– y yˆ y yz ys yl ye y^ yW yP yI yB y; y4 y- y& y y y y y yü yõ yî yç yà yÙ yÒ yË yÄ y½ y¶ y¯ y¨ y¡ yš y“ yŒ y… y~ yw yp yi yb y[ yT yM yF y? y8 y1 y* y# y y y y y yùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyýyöyïyèyáyÚyÓyÌyÅy¾y·y°y©y¢y›y”yy†yyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCy<y5y.y'y yyy yyýyöyïyèyáyÚyÓyÌyÅy¾y·y°y©y¢y›y”yy†yyxyqyjycy\yUyNyGy@y9y2y+y$yyyyyyúÿxóÿxìÿxåÿxÞÿx×ÿxÐÿxÉÿxÂÿx»ÿx´ÿx­ÿx¦ÿxŸÿx˜ÿx‘ÿxŠÿxƒÿx|ÿxuÿxnÿxgÿx`ÿxYÿxRÿxKÿxDÿx=ÿx6ÿx/ÿx(ÿx!ÿxÿxÿx ÿxÿxþþx÷þxðþxéþxâþxÛþxÔþxÍþxÆþx¿þx¸þx±þxªþx£þxœþx•þxŽþx‡þx€þxyþxrþxkþxdþx]þxVþxOþxHþxAþx:þx3þx,þx%þxþxþxþx þxþxûýxôýxíýxæýxßýxØýxÑýxÊýxÃýx¼ýxµýx®ýx§ýx ýx™ýx’ýx‹ýx„ýx}ýxvýxoýxhýxaýxZýxSýxLýxEýx>ýx7ýx0ýx)ýx"ýxýxýx ýxýxÿüxøüxñüxêüxãüxÜüxÕüxÎüxÇüxÀüx¹üx²üx«üx¤üxüx–üxüxˆüxüxzüxsüxlüxeüx^üxWüxPüxIüxBüx;üx4üx-üx&üxüxüxüx üxüxüûxõûxîûxçûxàûxÙûxÒûxËûxÄûx½ûx¶ûx¯ûx¨ûx¡ûxšûx“ûxŒûx…ûx~ûxwûxpûxiûxbûx[ûxTûxMûxFûx?ûx8ûx1ûx*ûx#ûxûxûxûxûxûxùúxòúxëúxäúxÝúxÖúxÏúxÈúxÁúxºúx³úx¬úx¥úxžúx—úxúx‰úx‚úx{úxtúxmúxfúx_úxXúxQúxJúxCúx<úx5úx.úx'úx úxúxúx úxúxýùxöùxïùxèùxáùxÚùxÓùxÌùxÅùx¾ùx·ùx°ùx©ùx¢ùx›ùx”ùxùx†ùxùxxùxqùxjùxcùx\ùxUùxNùxGùx@ùx9ùx2ùx+ùx$ùxùxùxùxùxùxúøxóøxìøxåøxÞøx×øxÐøxÉøxÂøx»øx´øx­øx¦øxŸøx˜øx‘øxŠøxƒøx|øxuøxnøxgøx`øxYøxRøxKøxDøx=øx6øx/øx(øx!øxøxøx øxøxþ÷x÷÷xð÷xé÷xâ÷xÛ÷xÔ÷xÍ÷xÆ÷x¿÷x¸÷x±÷xª÷x£÷xœ÷x•÷xŽ÷x‡÷x€÷xy÷xr÷xk÷xd÷x]÷xV÷xO÷xH÷xA÷x:÷x3÷x,÷x%÷x÷x÷x÷x ÷x÷xûöxôöxíöxæöxßöxØöxÑöxÊöxÃöx¼öxµöx®öx§öx öx™öx’öx‹öx„öx}öxvöxoöxhöxaöxZöxSöxLöxEöx>öx7öx0öx)öx"öxöxöx öxöxÿõxøõxñõxêõxãõxÜõxÕõxÎõxÇõxÀõx¹õx²õx«õx¤õxõx–õxõxˆõxõxzõxsõxlõxeõx^õxWõxPõxIõxBõx;õx4õx-õx&õxõxõxõx õxõxüôxõôxîôxçôxàôxÙôxÒôxËôxÄôx½ôx¶ôx¯ôx¨ôx¡ôxšôx“ôxŒôx…ôx~ôxwôxpôxiôxbôx[ôxTôxMôxFôx?ôx8ôx1ôx*ôx#ôxôxôxôxôxôxùóxòóxëóxäóxÝóxÖóxÏóxÈóxÁóxºóx³óx¬óx¥óxžóx—óxóx‰óx‚óx{óxtóxmóxfóx_óxXóxQóxJóxCóx<óx5óx.óx'óx óxóxóx óxóxýòxöòxïòxèòxáòxÚòxÓòxÌòxÅòx¾òx·òx°òx©òx¢òx›òx”òxòx†òxòxxòxqòxjòxcòx\òxUòxNòxGòx@òx9òx2òx+òx$òxòxòxòxòxòxúñxóñxìñxåñxÞñx×ñxÐñxÉñxÂñx»ñx´ñx­ñx¦ñxŸñx˜ñx‘ñxŠñxƒñx|ñxuñxnñxgñx`ñxYñxRñxKñxDñx=ñx6ñx/ñx(ñx!ñxñxñx ñxñxþðx÷ðxððxéðxâðxÛðxÔðxÍðxÆðx¿ðx¸ðx±ðxªðx£ðxœðx•ðxŽðx‡ðx€ðxyðxrðxkðxdðx]ðxVðxOðxHðxAðx:ðx3ðx,ðx%ðxðxðxðx ðxðxûïxôïxíïxæïxßïxØïxÑïxÊïxÃïx¼ïxµïx®ïx§ïx ïx™ïx’ïx‹ïx„ïx}ïxvïxoïxhïxaïxZïxSïxLïxEïx>ïx7ïx0ïx)ïx"ïxïxïx ïxïxÿîxøîxñîxêîxãîxÜîxÕîxÎîxÇîxÀîx¹îx²îx«îx¤îxîx–îxîxˆîxîxzîxsîxlîxeîx^îxWîxPîxIîxBîx;îx4îx-îx&îxîxîxîx îxîxüíxõíxîíxçíxàíxÙíxÒíxËíxÄíx½íx¶íx¯íx¨íx¡íxšíx“íxŒíx…íx~íxwíxpíxiíxbíx[íxTíxMíxFíx?íx8íx1íx*íx#íxíxíxíxíxíxùìxòìxëìxäìxÝìxÖìxÏìxÈìxÁìxºìx³ìx¬ìx¥ìxžìx—ìxìx‰ìx‚ìx{ìxtìxmìxfìx_ìxXìxQìxJìxCìx<ìx5ìx.ìx'ìx ìxìxìx ìxìxýëxöëxïëxèëxáëxÚëxÓëxÌëxÅëx¾ëx·ëx°ëx©ëx¢ëx›ëx”ëxëx†ëxëxxëxqëxjëxcëx\ëxUëxNëxGëx@ëx9ëx2ëx+ëx$ëxëxëxëxëxëxúêxóêxìêxåêxÞêx×êxÐêxÉêxÂêx»êx´êx­êx¦êxŸêx˜êx‘êxŠêxƒêx|êxuêxnêxgêx`êxYêxRêxKêxDêx=êx6êx/êx(êx!êxêxêx êxêxþéx÷éxðéxééxâéxÛéxÔéxÍéxÆéx¿éx¸éx±éxªéx£éxœéx•éxŽéx‡éx€éxyéxréxkéxdéx]éxVéxOéxHéxAéx:éx3éx,éx%éxéxéxéx éxéxûèxôèxíèxæèxßèxØèxÑèxÊèxÃèx¼èxµèx®èx§èx èx™èx’èx‹èx„èx}èxvèxoèxhèxaèxZèxSèxLèxEèx>èx7èx0èx)èx"èxèxèx èxèxÿçxøçxñçxêçxãçxÜçxÕçxÎçxÇçxÀçx¹çx²çx«çx¤çxçx–çxçxˆçxçxzçxsçxlçxeçx^çxWçxPçxIçxBçx;çx4çx-çx&çxçxçxçx çxçxüæxõæxîæxçæxàæxÙæxÒæxËæxÄæx½æx¶æx¯æx¨æx¡æxšæx“æxŒæx…æx~æxwæxpæxiæxbæx[æxTæxMæxFæx?æx8æx1æx*æx#æxæxæxæxæxæxùåxòåxëåxäåxÝåxÖåxÏåxÈåxÁåxºåx³åx¬åx¥åxžåx—åxåx‰åx‚åx{åxtåxmåxfåx_åxXåxQåxJåxCåx<åx5åx.åx'åx åxåxåx åxåxýäxöäxïäxèäxáäxÚäxÓäxÌäxÅäx¾äx·äx°äx©äx¢äx›äx”äxäx†äxäxxäxqäxjäxcäx\äxUäxNäxGäx@äx9äx2äx+äx$äxäxäxäxäxäxúãxóãxìãxåãxÞãx×ãxÐãxÉãxÂãx»ãx´ãx­ãx¦ãxŸãx˜ãx‘ãxŠãxƒãx|ãxuãxnãxgãx`ãxYãxRãxKãxDãx=ãx6ãx/ãx(ãx!ãxãxãx ãxãxþâx÷âxðâxéâxââxÛâxÔâxÍâxÆâx¿âx¸âx±âxªâx£âxœâx•âxŽâx‡âx€âxyâxrâxkâxdâx]âxVâxOâxHâxAâx:âx3âx,âx%âxâxâxâx âxâxûáxôáxíáxæáxßáxØáxÑáxÊáxÃáx¼áxµáx®áx§áx áx™áx’áx‹áx„áx}áxváxoáxháxaáxZáxSáxLáxEáx>áx7áx0áx)áx"áxáxáx áxáxÿàxøàxñàxêàxãàxÜàxÕàxÎàxÇàxÀàx¹àx²àx«àx¤àxàx–àxàxˆàxàxzàxsàxlàxeàx^àxWàxPàxIàxBàx;àx4àx-àx&àxàxàxàx àxàxüßxõßxîßxçßxàßxÙßxÒßxËßxÄßx½ßx¶ßx¯ßx¨ßx¡ßxšßx“ßxŒßx…ßx~ßxwßxpßxißxbßx[ßxTßxMßxFßx?ßx8ßx1ßx*ßx#ßxßxßxßxßxßxùÞxòÞxëÞxäÞxÝÞxÖÞxÏÞxÈÞxÁÞxºÞx³Þx¬Þx¥ÞxžÞx—ÞxÞx‰Þx‚Þx{ÞxtÞxmÞxfÞx_ÞxXÞxQÞxJÞxCÞx<Þx5Þx.Þx'Þx ÞxÞxÞx ÞxÞxýÝxöÝxïÝxèÝxáÝxÚÝxÓÝxÌÝxÅÝx¾Ýx·Ýx°Ýx©Ýx¢Ýx›Ýx”ÝxÝx†ÝxÝxxÝxqÝxjÝxcÝx\ÝxUÝxNÝxGÝx@Ýx9Ýx2Ýx+Ýx$ÝxÝxÝxÝxÝxÝxúÜxóÜxìÜxåÜxÞÜx×ÜxÐÜxÉÜxÂÜx»Üx´Üx­Üx¦ÜxŸÜx˜Üx‘ÜxŠÜxƒÜx|ÜxuÜxnÜxgÜx`ÜxYÜxRÜxKÜxDÜx=Üx6Üx/Üx(Üx!ÜxÜxÜx ÜxÜxþÛx÷ÛxðÛxéÛxâÛxÛÛxÔÛxÍÛxÆÛx¿Ûx¸Ûx±ÛxªÛx£ÛxœÛx•ÛxŽÛx‡Ûx€ÛxyÛxrÛxkÛxdÛx]ÛxVÛxOÛxHÛxAÛx:Ûx3Ûx,Ûx%ÛxÛxÛxÛx ÛxÛxûÚxôÚxíÚxæÚxßÚxØÚxÑÚxÊÚxÃÚx¼ÚxµÚx®Úx§Úx Úx™Úx’Úx‹Úx„Úx}ÚxvÚxoÚxhÚxaÚxZÚxSÚxLÚxEÚx>Úx7Úx0Úx)Úx"ÚxÚxÚx ÚxÚxÿÙxøÙxñÙxêÙxãÙxÜÙxÕÙxÎÙxÇÙxÀÙx¹Ùx²Ùx«Ùx¤ÙxÙx–ÙxÙxˆÙxÙxzÙxsÙxlÙxeÙx^ÙxWÙxPÙxIÙxBÙx;Ùx4Ùx-Ùx&ÙxÙxÙxÙx ÙxÙxüØxõØxîØxçØxàØxÙØxÒØxËØxÄØx½Øx¶Øx¯Øx¨Øx¡ØxšØx“ØxŒØx…Øx~ØxwØxpØxiØxbØx[ØxTØxMØxFØx?Øx8Øx1Øx*Øx#ØxØxØxØxØxØxù×xò×xë×xä×xÝ×xÖ×xÏ×xÈ×xÁ×xº×x³×x¬×x¥×xž×x—×x×x‰×x‚×x{×xt×xm×xf×x_×xX×xQ×xJ×xC×x<×x5×x.×x'×x ×x×x×x ×x×xýÖxöÖxïÖxèÖxáÖxÚÖxÓÖxÌÖxÅÖx¾Öx·Öx°Öx©Öx¢Öx›Öx”ÖxÖx†ÖxÖxxÖxqÖxjÖxcÖx\ÖxUÖxNÖxGÖx@Öx9Öx2Öx+Öx$ÖxÖxÖxÖxÖxÖxúÕxóÕxìÕxåÕxÞÕx×ÕxÐÕxÉÕxÂÕx»Õx´Õx­Õx¦ÕxŸÕx˜Õx‘ÕxŠÕxƒÕx|ÕxuÕxnÕxgÕx`ÕxYÕxRÕxKÕxDÕx=Õx6Õx/Õx(Õx!ÕxÕxÕx ÕxÕxþÔx÷ÔxðÔxéÔxâÔxÛÔxÔÔxÍÔxÆÔx¿Ôx¸Ôx±ÔxªÔx£ÔxœÔx•ÔxŽÔx‡Ôx€ÔxyÔxrÔxkÔxdÔx]ÔxVÔxOÔxHÔxAÔx:Ôx3Ôx,Ôx%ÔxÔxÔxÔx ÔxÔxûÓxôÓxíÓxæÓxßÓxØÓxÑÓxÊÓxÃÓx¼ÓxµÓx®Óx§Óx Óx™Óx’Óx‹Óx„Óx}ÓxvÓxoÓxhÓxaÓxZÓxSÓxLÓxEÓx>Óx7Óx0Óx)Óx"ÓxÓxÓx ÓxÓxÿÒxøÒxñÒxêÒxãÒxÜÒxÕÒxÎÒxÇÒxÀÒx¹Òx²Òx«Òx¤ÒxÒx–ÒxÒxˆÒxÒxzÒxsÒxlÒxeÒx^ÒxWÒxPÒxIÒxBÒx;Òx4Òx-Òx&ÒxÒxÒxÒx ÒxÒxüÑxõÑxîÑxçÑxàÑxÙÑxÒÑxËÑxÄÑx½Ñx¶Ñx¯Ñx¨Ñx¡ÑxšÑx“ÑxŒÑx…Ñx~ÑxwÑxpÑxiÑxbÑx[ÑxTÑxMÑxFÑx?Ñx8Ñx1Ñx*Ñx#ÑxÑxÑxÑxÑxÑxùÐxòÐxëÐxäÐxÝÐxÖÐxÏÐxÈÐxÁÐxºÐx³Ðx¬Ðx¥ÐxžÐx—ÐxÐx‰Ðx‚Ðx{ÐxtÐxmÐxfÐx_ÐxXÐxQÐxJÐxCÐx<Ðx5Ðx.Ðx'Ðx ÐxÐxÐx ÐxÐxýÏxöÏxïÏxèÏxáÏxÚÏxÓÏxÌÏxÅÏx¾Ïx·Ïx°Ïx©Ïx¢Ïx›Ïx”ÏxÏx†ÏxÏxxÏxqÏxjÏxcÏx\ÏxUÏxNÏxGÏx@Ïx9Ïx2Ïx+Ïx$ÏxÏxÏxÏxÏxÏxúÎxóÎxìÎxåÎxÞÎx×ÎxÐÎxÉÎxÂÎx»Îx´Îx­Îx¦ÎxŸÎx˜Îx‘ÎxŠÎxƒÎx|ÎxuÎxnÎxgÎx`ÎxYÎxRÎxKÎxDÎx=Îx6Îx/Îx(Îx!ÎxÎxÎx ÎxÎxþÍx÷ÍxðÍxéÍxâÍxÛÍxÔÍxÍÍxÆÍx¿Íx¸Íx±ÍxªÍx£ÍxœÍx•ÍxŽÍx‡Íx€ÍxyÍxrÍxkÍxdÍx]ÍxVÍxOÍxHÍxAÍx:Íx3Íx,Íx%ÍxÍxÍxÍx ÍxÍxûÌxôÌxíÌxæÌxßÌxØÌxÑÌxÊÌxÃÌx¼ÌxµÌx®Ìx§Ìx Ìx™Ìx’Ìx‹Ìx„Ìx}ÌxvÌxoÌxhÌxaÌxZÌxSÌxLÌxEÌx>Ìx7Ìx0Ìx)Ìx"ÌxÌxÌx ÌxÌxÿËxøËxñËxêËxãËxÜËxÕËxÎËxÇËxÀËx¹Ëx²Ëx«Ëx¤ËxËx–ËxËxˆËxËxzËxsËxlËxeËx^ËxWËxPËxIËxBËx;Ëx4Ëx-Ëx&ËxËxËxËx ËxËxüÊxõÊxîÊxçÊxàÊxÙÊxÒÊxËÊxÄÊx½Êx¶Êx¯Êx¨Êx¡ÊxšÊx“ÊxŒÊx…Êx~ÊxwÊxpÊxiÊxbÊx[ÊxTÊxMÊxFÊx?Êx8Êx1Êx*Êx#ÊxÊxÊxÊxÊxÊxùÉxòÉxëÉxäÉxÝÉxÖÉxÏÉxÈÉxÁÉxºÉx³Éx¬Éx¥ÉxžÉx—ÉxÉx‰Éx‚Éx{ÉxtÉxmÉxfÉx_ÉxXÉxQÉxJÉxCÉx<Éx5Éx.Éx'Éx ÉxÉxÉx ÉxÉxýÈxöÈxïÈxèÈxáÈxÚÈxÓÈxÌÈxÅÈx¾Èx·Èx°Èx©Èx¢Èx›Èx”ÈxÈx†ÈxÈxxÈxqÈxjÈxcÈx\ÈxUÈxNÈxGÈx@Èx9Èx2Èx+Èx$ÈxÈxÈxÈxÈxÈxúÇxóÇxìÇxåÇxÞÇx×ÇxÐÇxÉÇxÂÇx»Çx´Çx­Çx¦ÇxŸÇx˜Çx‘ÇxŠÇxƒÇx|ÇxuÇxnÇxgÇx`ÇxYÇxRÇxKÇxDÇx=Çx6Çx/Çx(Çx!ÇxÇxÇx ÇxÇxþÆx÷ÆxðÆxéÆxâÆxÛÆxÔÆxÍÆxÆÆx¿Æx¸Æx±ÆxªÆx£ÆxœÆx•ÆxŽÆx‡Æx€ÆxyÆxrÆxkÆxdÆx]ÆxVÆxOÆxHÆxAÆx:Æx3Æx,Æx%ÆxÆxÆxÆx ÆxÆxûÅxôÅxíÅxæÅxßÅxØÅxÑÅxÊÅxÃÅx¼ÅxµÅx®Åx§Åx Åx™Åx’Åx‹Åx„Åx}ÅxvÅxoÅxhÅxaÅxZÅxSÅxLÅxEÅx>Åx7Åx0Åx)Åx"ÅxÅxÅx ÅxÅxÿÄxøÄxñÄxêÄxãÄxÜÄxÕÄxÎÄxÇÄxÀÄx¹Äx²Äx«Äx¤ÄxÄx–ÄxÄxˆÄxÄxzÄxsÄxlÄxeÄx^ÄxWÄxPÄxIÄxBÄx;Äx4Äx-Äx&ÄxÄxÄxÄx ÄxÄxüÃxõÃxîÃxçÃxàÃxÙÃxÒÃxËÃxÄÃx½Ãx¶Ãx¯Ãx¨Ãx¡ÃxšÃx“ÃxŒÃx…Ãx~ÃxwÃxpÃxiÃxbÃx[ÃxTÃxMÃxFÃx?Ãx8Ãx1Ãx*Ãx#ÃxÃxÃxÃxÃxÃxùÂxòÂxëÂxäÂxÝÂxÖÂxÏÂxÈÂxÁÂxºÂx³Âx¬Âx¥ÂxžÂx—ÂxÂx‰Âx‚Âx{ÂxtÂxmÂxfÂx_ÂxXÂxQÂxJÂxCÂx<Âx5Âx.Âx'Âx ÂxÂxÂx ÂxÂxýÁxöÁxïÁxèÁxáÁxÚÁxÓÁxÌÁxÅÁx¾Áx·Áx°Áx©Áx¢Áx›Áx”ÁxÁx†ÁxÁxxÁxqÁxjÁxcÁx\ÁxUÁxNÁxGÁx@Áx9Áx2Áx+Áx$ÁxÁxÁxÁxÁxÁxúÀxóÀxìÀxåÀxÞÀx×ÀxÐÀxÉÀxÂÀx»Àx´Àx­Àx¦ÀxŸÀx˜Àx‘ÀxŠÀxƒÀx|ÀxuÀxnÀxgÀx`ÀxYÀxRÀxKÀxDÀx=Àx6Àx/Àx(Àx!ÀxÀxÀx ÀxÀxþ¿x÷¿xð¿xé¿xâ¿xÛ¿xÔ¿xÍ¿xÆ¿x¿¿x¸¿x±¿xª¿x£¿xœ¿x•¿xŽ¿x‡¿x€¿xy¿xr¿xk¿xd¿x]¿xV¿xO¿xH¿xA¿x:¿x3¿x,¿x%¿x¿x¿x¿x ¿x¿xû¾xô¾xí¾xæ¾xß¾xؾxѾxʾxþx¼¾xµ¾x®¾x§¾x ¾x™¾x’¾x‹¾x„¾x}¾xv¾xo¾xh¾xa¾xZ¾xS¾xL¾xE¾x>¾x7¾x0¾x)¾x"¾x¾x¾x ¾x¾xÿ½xø½xñ½xê½xã½xܽxÕ½xνxǽxÀ½x¹½x²½x«½x¤½x½x–½x½xˆ½x½xz½xs½xl½xe½x^½xW½xP½xI½xB½x;½x4½x-½x&½x½x½x½x ½x½xü¼xõ¼xî¼xç¼xà¼xÙ¼xÒ¼x˼xļx½¼x¶¼x¯¼x¨¼x¡¼xš¼x“¼xŒ¼x…¼x~¼xw¼xp¼xi¼xb¼x[¼xT¼xM¼xF¼x?¼x8¼x1¼x*¼x#¼x¼x¼x¼x¼x¼xù»xò»xë»xä»xÝ»xÖ»xÏ»xÈ»xÁ»xº»x³»x¬»x¥»xž»x—»x»x‰»x‚»x{»xt»xm»xf»x_»xX»xQ»xJ»xC»x<»x5»x.»x'»x »x»x»x »x»xýºxöºxïºxèºxáºxÚºxÓºx̺xźx¾ºx·ºx°ºx©ºx¢ºx›ºx”ºxºx†ºxºxxºxqºxjºxcºx\ºxUºxNºxGºx@ºx9ºx2ºx+ºx$ºxºxºxºxºxºxú¹xó¹xì¹xå¹xÞ¹x×¹xйxɹx¹x»¹x´¹x­¹x¦¹xŸ¹x˜¹x‘¹xйxƒ¹x|¹xu¹xn¹xg¹x`¹xY¹xR¹xK¹xD¹x=¹x6¹x/¹x(¹x!¹x¹x¹x ¹x¹xþ¸x÷¸xð¸xé¸xâ¸xÛ¸xÔ¸x͸xƸx¿¸x¸¸x±¸xª¸x£¸xœ¸x•¸xޏx‡¸x€¸xy¸xr¸xk¸xd¸x]¸xV¸xO¸xH¸xA¸x:¸x3¸x,¸x%¸x¸x¸x¸x ¸x¸xû·xô·xí·xæ·xß·xØ·xÑ·xÊ·x÷x¼·xµ·x®·x§·x ·x™·x’·x‹·x„·x}·xv·xo·xh·xa·xZ·xS·xL·xE·x>·x7·x0·x)·x"·x·x·x ·x·xÿ¶xø¶xñ¶xê¶xã¶xܶxÕ¶xζxǶxÀ¶x¹¶x²¶x«¶x¤¶x¶x–¶x¶xˆ¶x¶xz¶xs¶xl¶xe¶x^¶xW¶xP¶xI¶xB¶x;¶x4¶x-¶x&¶x¶x¶x¶x ¶x¶xüµxõµxîµxçµxàµxÙµxÒµx˵xĵx½µx¶µx¯µx¨µx¡µxšµx“µxŒµx…µx~µxwµxpµxiµxbµx[µxTµxMµxFµx?µx8µx1µx*µx#µxµxµxµxµxµxù´xò´xë´xä´xÝ´xÖ´xÏ´xÈ´xÁ´xº´x³´x¬´x¥´xž´x—´x´x‰´x‚´x{´xt´xm´xf´x_´xX´xQ´xJ´xC´x<´x5´x.´x'´x ´x´x´x ´x´xý³xö³xï³xè³xá³xÚ³xÓ³x̳xųx¾³x·³x°³x©³x¢³x›³x”³x³x†³x³xx³xq³xj³xc³x\³xU³xN³xG³x@³x9³x2³x+³x$³x³x³x³x³x³xú²xó²xì²xå²xÞ²xײxвxɲx²x»²x´²x­²x¦²xŸ²x˜²x‘²xвxƒ²x|²xu²xn²xg²x`²xY²xR²xK²xD²x=²x6²x/²x(²x!²x²x²x ²x²xþ±x÷±xð±xé±xâ±xÛ±xÔ±xͱxƱx¿±x¸±x±±xª±x£±xœ±x•±xޱx‡±x€±xy±xr±xk±xd±x]±xV±xO±xH±xA±x:±x3±x,±x%±x±x±x±x ±x±xû°xô°xí°xæ°xß°xذxѰxʰxðx¼°xµ°x®°x§°x °x™°x’°x‹°x„°x}°xv°xo°xh°xa°xZ°xS°xL°xE°x>°x7°x0°x)°x"°x°x°x °x°xÿ¯xø¯xñ¯xê¯xã¯xܯxÕ¯xίxǯxÀ¯x¹¯x²¯x«¯x¤¯x¯x–¯x¯xˆ¯x¯xz¯xs¯xl¯xe¯x^¯xW¯xP¯xI¯xB¯x;¯x4¯x-¯x&¯x¯x¯x¯x ¯x¯xü®xõ®xî®xç®xà®xÙ®xÒ®xË®xÄ®x½®x¶®x¯®x¨®x¡®xš®x“®xŒ®x…®x~®xw®xp®xi®xb®x[®xT®xM®xF®x?®x8®x1®x*®x#®x®x®x®x®x®xù­xò­xë­xä­xÝ­xÖ­xÏ­xÈ­xÁ­xº­x³­x¬­x¥­xž­x—­x­x‰­x‚­x{­xt­xm­xf­x_­xX­xQ­xJ­xC­x<­x5­x.­x'­x ­x­x­x ­x­xý¬xö¬xï¬xè¬xá¬xÚ¬xÓ¬x̬xŬx¾¬x·¬x°¬x©¬x¢¬x›¬x”¬x¬x†¬x¬xx¬xq¬xj¬xc¬x\¬xU¬xN¬xG¬x@¬x9¬x2¬x+¬x$¬x¬x¬x¬x¬x¬xú«xó«xì«xå«xÞ«x׫xЫxÉ«x«x»«x´«x­«x¦«xŸ«x˜«x‘«xŠ«xƒ«x|«xu«xn«xg«x`«xY«xR«xK«xD«x=«x6«x/«x(«x!«x«x«x «x«xþªx÷ªxðªxéªxâªxÛªxÔªxͪxƪx¿ªx¸ªx±ªxªªx£ªxœªx•ªxŽªx‡ªx€ªxyªxrªxkªxdªx]ªxVªxOªxHªxAªx:ªx3ªx,ªx%ªxªxªxªx ªxªxû©xô©xí©xæ©xß©xØ©xÑ©xÊ©xéx¼©xµ©x®©x§©x ©x™©x’©x‹©x„©x}©xv©xo©xh©xa©xZ©xS©xL©xE©x>©x7©x0©x)©x"©x©x©x ©x©xÿ¨xø¨xñ¨xê¨xã¨xܨxÕ¨xΨxǨxÀ¨x¹¨x²¨x«¨x¤¨x¨x–¨x¨xˆ¨x¨xz¨xs¨xl¨xe¨x^¨xW¨xP¨xI¨xB¨x;¨x4¨x-¨x&¨x¨x¨x¨x ¨x¨xü§xõ§xî§xç§xà§xÙ§xÒ§x˧xħx½§x¶§x¯§x¨§x¡§xš§x“§xŒ§x…§x~§xw§xp§xi§xb§x[§xT§xM§xF§x?§x8§x1§x*§x#§x§x§x§x§x§xù¦xò¦xë¦xä¦xݦxÖ¦xϦxȦxÁ¦xº¦x³¦x¬¦x¥¦xž¦x—¦x¦x‰¦x‚¦x{¦xt¦xm¦xf¦x_¦xX¦xQ¦xJ¦xC¦x<¦x5¦x.¦x'¦x ¦x¦x¦x ¦x¦xý¥xö¥xï¥xè¥xá¥xÚ¥xÓ¥xÌ¥xÅ¥x¾¥x·¥x°¥x©¥x¢¥x›¥x”¥x¥x†¥x¥xx¥xq¥xj¥xc¥x\¥xU¥xN¥xG¥x@¥x9¥x2¥x+¥x$¥x¥x¥x¥x¥x¥xú¤xó¤xì¤xå¤xÞ¤xפxФxɤx¤x»¤x´¤x­¤x¦¤xŸ¤x˜¤x‘¤xФxƒ¤x|¤xu¤xn¤xg¤x`¤xY¤xR¤xK¤xD¤x=¤x6¤x/¤x(¤x!¤x¤x¤x ¤x¤xþ£x÷£xð£xé£xâ£xÛ£xÔ£xÍ£xÆ£x¿£x¸£x±£xª£x££xœ£x•£xŽ£x‡£x€£xy£xr£xk£xd£x]£xV£xO£xH£xA£x:£x3£x,£x%£x£x£x£x £x£xû¢xô¢xí¢xæ¢xߢxØ¢xÑ¢xÊ¢xâx¼¢xµ¢x®¢x§¢x ¢x™¢x’¢x‹¢x„¢x}¢xv¢xo¢xh¢xa¢xZ¢xS¢xL¢xE¢x>¢x7¢x0¢x)¢x"¢x¢x¢x ¢x¢xÿ¡xø¡xñ¡xê¡xã¡xÜ¡xÕ¡xΡxÇ¡xÀ¡x¹¡x²¡x«¡x¤¡x¡x–¡x¡xˆ¡x¡xz¡xs¡xl¡xe¡x^¡xW¡xP¡xI¡xB¡x;¡x4¡x-¡x&¡x¡x¡x¡x ¡x¡xü xõ xî xç xà xÙ xÒ xË xÄ x½ x¶ x¯ x¨ x¡ xš x“ xŒ x… x~ xw xp xi xb x[ xT xM xF x? x8 x1 x* x# x x x x x xùŸxòŸxëŸxäŸxÝŸxÖŸxÏŸxÈŸxÁŸxºŸx³Ÿx¬Ÿx¥ŸxžŸx—ŸxŸx‰Ÿx‚Ÿx{ŸxtŸxmŸxfŸx_ŸxXŸxQŸxJŸxCŸx<Ÿx5Ÿx.Ÿx'Ÿx ŸxŸxŸx ŸxŸxýžxöžxïžxèžxážxÚžxÓžxÌžxÅžx¾žx·žx°žx©žx¢žx›žx”žxžx†žxžxxžxqžxjžxcžx\žxUžxNžxGžx@žx9žx2žx+žx$žxžxžxžxžxžxúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþœx÷œxðœxéœxâœxÛœxÔœxÍœxÆœx¿œx¸œx±œxªœx£œxœœx•œxŽœx‡œx€œxyœxrœxkœxdœx]œxVœxOœxHœxAœx:œx3œx,œx%œxœxœxœx œxœxû›xô›xí›xæ›xß›xØ›xÑ›xÊ›xÛx¼›xµ›x®›x§›x ›x™›x’›x‹›x„›x}›xv›xo›xh›xa›xZ›xS›xL›xE›x>›x7›x0›x)›x"›x›x›x ›x›xÿšxøšxñšxêšxãšxÜšxÕšxΚxÇšxÀšx¹šx²šx«šx¤šxšx–šxšxˆšxšxzšxsšxlšxešx^šxWšxPšxIšxBšx;šx4šx-šx&šxšxšxšx šxšxü™xõ™xî™xç™xà™xÙ™xÒ™xË™xÄ™x½™x¶™x¯™x¨™x¡™xš™x“™xŒ™x…™x~™xw™xp™xi™xb™x[™xT™xM™xF™x?™x8™x1™x*™x#™x™x™x™x™x™xù˜xò˜xë˜xä˜xݘxÖ˜xϘxȘxÁ˜xº˜x³˜x¬˜x¥˜xž˜x—˜x˜x‰˜x‚˜x{˜xt˜xm˜xf˜x_˜xX˜xQ˜xJ˜xC˜x<˜x5˜x.˜x'˜x ˜x˜x˜x ˜x˜xý—xö—xï—xè—xá—xÚ—xÓ—xÌ—xÅ—x¾—x·—x°—x©—x¢—x›—x”—x—x†—x—xx—xq—xj—xc—x\—xU—xN—xG—x@—x9—x2—x+—x$—x—x—x—x—x—xú–xó–xì–xå–xÞ–x×–xЖxÉ–x–x»–x´–x­–x¦–xŸ–x˜–x‘–xŠ–xƒ–x|–xu–xn–xg–x`–xY–xR–xK–xD–x=–x6–x/–x(–x!–x–x–x –x–xþ•x÷•xð•xé•xâ•xÛ•xÔ•xÍ•xÆ•x¿•x¸•x±•xª•x£•xœ•x••xŽ•x‡•x€•xy•xr•xk•xd•x]•xV•xO•xH•xA•x:•x3•x,•x%•x•x•x•x •x•xû”xô”xí”xæ”xß”xØ”xÑ”xÊ”xÔx¼”xµ”x®”x§”x ”x™”x’”x‹”x„”x}”xv”xo”xh”xa”xZ”xS”xL”xE”x>”x7”x0”x)”x"”x”x”x ”x”xÿ“xø“xñ“xê“xã“xÜ“xÕ“xΓxÇ“xÀ“x¹“x²“x«“x¤“x“x–“x“xˆ“x“xz“xs“xl“xe“x^“xW“xP“xI“xB“x;“x4“x-“x&“x“x“x“x “x“xü’xõ’xî’xç’xà’xÙ’xÒ’xË’xÄ’x½’x¶’x¯’x¨’x¡’xš’x“’xŒ’x…’x~’xw’xp’xi’xb’x[’xT’xM’xF’x?’x8’x1’x*’x#’x’x’x’x’x’xù‘xò‘xë‘xä‘xÝ‘xÖ‘xÏ‘xÈ‘xÁ‘xº‘x³‘x¬‘x¥‘xž‘x—‘x‘x‰‘x‚‘x{‘xt‘xm‘xf‘x_‘xX‘xQ‘xJ‘xC‘x<‘x5‘x.‘x'‘x ‘x‘x‘x ‘x‘xýxöxïxèxáxÚxÓxÌxÅx¾x·x°x©x¢x›x”xx†xxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþŽx÷ŽxðŽxéŽxâŽxÛŽxÔŽxÍŽxÆŽx¿Žx¸Žx±ŽxªŽx£ŽxœŽx•ŽxŽŽx‡Žx€ŽxyŽxrŽxkŽxdŽx]ŽxVŽxOŽxHŽxAŽx:Žx3Žx,Žx%ŽxŽxŽxŽx ŽxŽxûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿŒxøŒxñŒxêŒxãŒxÜŒxÕŒxÎŒxÇŒxÀŒx¹Œx²Œx«Œx¤ŒxŒx–ŒxŒxˆŒxŒxzŒxsŒxlŒxeŒx^ŒxWŒxPŒxIŒxBŒx;Œx4Œx-Œx&ŒxŒxŒxŒx ŒxŒxü‹xõ‹xî‹xç‹xà‹xÙ‹xÒ‹xË‹xÄ‹x½‹x¶‹x¯‹x¨‹x¡‹xš‹x“‹xŒ‹x…‹x~‹xw‹xp‹xi‹xb‹x[‹xT‹xM‹xF‹x?‹x8‹x1‹x*‹x#‹x‹x‹x‹x‹x‹xùŠxòŠxëŠxäŠxÝŠxÖŠxÏŠxÈŠxÁŠxºŠx³Šx¬Šx¥ŠxžŠx—ŠxŠx‰Šx‚Šx{ŠxtŠxmŠxfŠx_ŠxXŠxQŠxJŠxCŠx<Šx5Šx.Šx'Šx ŠxŠxŠx ŠxŠxý‰xö‰xï‰xè‰xá‰xÚ‰xÓ‰x̉xʼnx¾‰x·‰x°‰x©‰x¢‰x›‰x”‰x‰x†‰x‰xx‰xq‰xj‰xc‰x\‰xU‰xN‰xG‰x@‰x9‰x2‰x+‰x$‰x‰x‰x‰x‰x‰xúˆxóˆxìˆxåˆxÞˆx׈xЈxɈxˆx»ˆx´ˆx­ˆx¦ˆxŸˆx˜ˆx‘ˆxŠˆxƒˆx|ˆxuˆxnˆxgˆx`ˆxYˆxRˆxKˆxDˆx=ˆx6ˆx/ˆx(ˆx!ˆxˆxˆx ˆxˆxþ‡x÷‡xð‡xé‡xâ‡xÛ‡xÔ‡x͇xƇx¿‡x¸‡x±‡xª‡x£‡xœ‡x•‡xއx‡‡x€‡xy‡xr‡xk‡xd‡x]‡xV‡xO‡xH‡xA‡x:‡x3‡x,‡x%‡x‡x‡x‡x ‡x‡xû†xô†xí†xæ†x߆x؆xцxʆxÆx¼†xµ†x®†x§†x †x™†x’†x‹†x„†x}†xv†xo†xh†xa†xZ†xS†xL†xE†x>†x7†x0†x)†x"†x†x†x †x†xÿ…xø…xñ…xê…xã…xÜ…xÕ…xÎ…xÇ…xÀ…x¹…x²…x«…x¤…x…x–…x…xˆ…x…xz…xs…xl…xe…x^…xW…xP…xI…xB…x;…x4…x-…x&…x…x…x…x …x…xü„xõ„xî„xç„xà„xÙ„xÒ„xË„xÄ„x½„x¶„x¯„x¨„x¡„xš„x“„xŒ„x…„x~„xw„xp„xi„xb„x[„xT„xM„xF„x?„x8„x1„x*„x#„x„x„x„x„x„xùƒxòƒxëƒxäƒx݃xÖƒxσxȃxÁƒxºƒx³ƒx¬ƒx¥ƒxžƒx—ƒxƒx‰ƒx‚ƒx{ƒxtƒxmƒxfƒx_ƒxXƒxQƒxJƒxCƒx<ƒx5ƒx.ƒx'ƒx ƒxƒxƒx ƒxƒxý‚xö‚xï‚xè‚xá‚xÚ‚xÓ‚xÌ‚xÅ‚x¾‚x·‚x°‚x©‚x¢‚x›‚x”‚x‚x†‚x‚xx‚xq‚xj‚xc‚x\‚xU‚xN‚xG‚x@‚x9‚x2‚x+‚x$‚x‚x‚x‚x‚x‚xúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþ€x÷€xð€xé€xâ€xÛ€xÔ€xÍ€xÆ€x¿€x¸€x±€xª€x£€xœ€x•€xŽ€x‡€x€€xy€xr€xk€xd€x]€xV€xO€xH€xA€x:€x3€x,€x%€x€x€x€x €x€xûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿ~xø~xñ~xê~xã~xÜ~xÕ~xÎ~xÇ~xÀ~x¹~x²~x«~x¤~x~x–~x~xˆ~x~xz~xs~xl~xe~x^~xW~xP~xI~xB~x;~x4~x-~x&~x~x~x~x ~x~xü}xõ}xî}xç}xà}xÙ}xÒ}xË}xÄ}x½}x¶}x¯}x¨}x¡}xš}x“}xŒ}x…}x~}xw}xp}xi}xb}x[}xT}xM}xF}x?}x8}x1}x*}x#}x}x}x}x}x}xù|xò|xë|xä|xÝ|xÖ|xÏ|xÈ|xÁ|xº|x³|x¬|x¥|xž|x—|x|x‰|x‚|x{|xt|xm|xf|x_|xX|xQ|xJ|xC|x<|x5|x.|x'|x |x|x|x |x|xý{xö{xï{xè{xá{xÚ{xÓ{xÌ{xÅ{x¾{x·{x°{x©{x¢{x›{x”{x{x†{x{xx{xq{xj{xc{x\{xU{xN{xG{x@{x9{x2{x+{x${x{x{x{x{x{xúzxózxìzxåzxÞzx×zxÐzxÉzxÂzx»zx´zx­zx¦zxŸzx˜zx‘zxŠzxƒzx|zxuzxnzxgzx`zxYzxRzxKzxDzx=zx6zx/zx(zx!zxzxzx zxzxþyx÷yxðyxéyxâyxÛyxÔyxÍyxÆyx¿yx¸yx±yxªyx£yxœyx•yxŽyx‡yx€yxyyxryxkyxdyx]yxVyxOyxHyxAyx:yx3yx,yx%yxyxyxyx yxyxûxxôxxíxxæxxßxxØxxÑxxÊxxÃxx¼xxµxx®xx§xx xx™xx’xx‹xx„xx}xxvxxoxxhxxaxxZxxSxxLxxExx>xx7xx0xx)xx"xxxxxx xxxxÿwxøwxñwxêwxãwxÜwxÕwxÎwxÇwxÀwx¹wx²wx«wx¤wxwx–wxwxˆwxwxzwxswxlwxewx^wxWwxPwxIwxBwx;wx4wx-wx&wxwxwxwx wxwxüvxõvxîvxçvxàvxÙvxÒvxËvxÄvx½vx¶vx¯vx¨vx¡vxšvx“vxŒvx…vx~vxwvxpvxivxbvx[vxTvxMvxFvx?vx8vx1vx*vx#vxvxvxvxvxvxùuxòuxëuxäuxÝuxÖuxÏuxÈuxÁuxºux³ux¬ux¥uxžux—uxux‰ux‚ux{uxtuxmuxfux_uxXuxQuxJuxCuxqx7qx0qx)qx"qxqxqx qxqxÿpxøpxñpxêpxãpxÜpxÕpxÎpxÇpxÀpx¹px²px«px¤pxpx–pxpxˆpxpxzpxspxlpxepx^pxWpxPpxIpxBpx;px4px-px&pxpxpxpx pxpxüoxõoxîoxçoxàoxÙoxÒoxËoxÄox½ox¶ox¯ox¨ox¡oxšox“oxŒox…ox~oxwoxpoxioxbox[oxToxMoxFox?ox8ox1ox*ox#oxoxoxoxoxoxùnxònxënxänxÝnxÖnxÏnxÈnxÁnxºnx³nx¬nx¥nxžnx—nxnx‰nx‚nx{nxtnxmnxfnx_nxXnxQnxJnxCnxjx7jx0jx)jx"jxjxjx jxjxÿixøixñixêixãixÜixÕixÎixÇixÀix¹ix²ix«ix¤ixix–ixixˆixixzixsixlixeix^ixWixPixIixBix;ix4ix-ix&ixixixix ixixühxõhxîhxçhxàhxÙhxÒhxËhxÄhx½hx¶hx¯hx¨hx¡hxšhx“hxŒhx…hx~hxwhxphxihxbhx[hxThxMhxFhx?hx8hx1hx*hx#hxhxhxhxhxhxùgxògxëgxägxÝgxÖgxÏgxÈgxÁgxºgx³gx¬gx¥gxžgx—gxgx‰gx‚gx{gxtgxmgxfgx_gxXgxQgxJgxCgxcx7cx0cx)cx"cxcxcx cxcxÿbxøbxñbxêbxãbxÜbxÕbxÎbxÇbxÀbx¹bx²bx«bx¤bxbx–bxbxˆbxbxzbxsbxlbxebx^bxWbxPbxIbxBbx;bx4bx-bx&bxbxbxbx bxbxüaxõaxîaxçaxàaxÙaxÒaxËaxÄax½ax¶ax¯ax¨ax¡axšax“axŒax…ax~axwaxpaxiaxbax[axTaxMaxFax?ax8ax1ax*ax#axaxaxaxaxaxù`xò`xë`xä`xÝ`xÖ`xÏ`xÈ`xÁ`xº`x³`x¬`x¥`xž`x—`x`x‰`x‚`x{`xt`xm`xf`x_`xX`xQ`xJ`xC`x<`x5`x.`x'`x `x`x`x `x`xý_xö_xï_xè_xá_xÚ_xÓ_xÌ_xÅ_x¾_x·_x°_x©_x¢_x›_x”_x_x†_x_xx_xq_xj_xc_x\_xU_xN_xG_x@_x9_x2_x+_x$_x_x_x_x_x_xú^xó^xì^xå^xÞ^x×^xÐ^xÉ^xÂ^x»^x´^x­^x¦^xŸ^x˜^x‘^xŠ^xƒ^x|^xu^xn^xg^x`^xY^xR^xK^xD^x=^x6^x/^x(^x!^x^x^x ^x^xþ]x÷]xð]xé]xâ]xÛ]xÔ]xÍ]xÆ]x¿]x¸]x±]xª]x£]xœ]x•]xŽ]x‡]x€]xy]xr]xk]xd]x]]xV]xO]xH]xA]x:]x3]x,]x%]x]x]x]x ]x]xû\xô\xí\xæ\xß\xØ\xÑ\xÊ\xÃ\x¼\xµ\x®\x§\x \x™\x’\x‹\x„\x}\xv\xo\xh\xa\xZ\xS\xL\xE\x>\x7\x0\x)\x"\x\x\x \x\xÿ[xø[xñ[xê[xã[xÜ[xÕ[xÎ[xÇ[xÀ[x¹[x²[x«[x¤[x[x–[x[xˆ[x[xz[xs[xl[xe[x^[xW[xP[xI[xB[x;[x4[x-[x&[x[x[x[x [x[xüZxõZxîZxçZxàZxÙZxÒZxËZxÄZx½Zx¶Zx¯Zx¨Zx¡ZxšZx“ZxŒZx…Zx~ZxwZxpZxiZxbZx[ZxTZxMZxFZx?Zx8Zx1Zx*Zx#ZxZxZxZxZxZxùYxòYxëYxäYxÝYxÖYxÏYxÈYxÁYxºYx³Yx¬Yx¥YxžYx—YxYx‰Yx‚Yx{YxtYxmYxfYx_YxXYxQYxJYxCYxUx7Ux0Ux)Ux"UxUxUx UxUxÿTxøTxñTxêTxãTxÜTxÕTxÎTxÇTxÀTx¹Tx²Tx«Tx¤TxTx–TxTxˆTxTxzTxsTxlTxeTx^TxWTxPTxITxBTx;Tx4Tx-Tx&TxTxTxTx TxTxüSxõSxîSxçSxàSxÙSxÒSxËSxÄSx½Sx¶Sx¯Sx¨Sx¡SxšSx“SxŒSx…Sx~SxwSxpSxiSxbSx[SxTSxMSxFSx?Sx8Sx1Sx*Sx#SxSxSxSxSxSxùRxòRxëRxäRxÝRxÖRxÏRxÈRxÁRxºRx³Rx¬Rx¥RxžRx—RxRx‰Rx‚Rx{RxtRxmRxfRx_RxXRxQRxJRxCRxNx7Nx0Nx)Nx"NxNxNx NxNxÿMxøMxñMxêMxãMxÜMxÕMxÎMxÇMxÀMx¹Mx²Mx«Mx¤MxMx–MxMxˆMxMxzMxsMxlMxeMx^MxWMxPMxIMxBMx;Mx4Mx-Mx&MxMxMxMx MxMxüLxõLxîLxçLxàLxÙLxÒLxËLxÄLx½Lx¶Lx¯Lx¨Lx¡LxšLx“LxŒLx…Lx~LxwLxpLxiLxbLx[LxTLxMLxFLx?Lx8Lx1Lx*Lx#LxLxLxLxLxLxùKxòKxëKxäKxÝKxÖKxÏKxÈKxÁKxºKx³Kx¬Kx¥KxžKx—KxKx‰Kx‚Kx{KxtKxmKxfKx_KxXKxQKxJKxCKxGx7Gx0Gx)Gx"GxGxGx GxGxÿFxøFxñFxêFxãFxÜFxÕFxÎFxÇFxÀFx¹Fx²Fx«Fx¤FxFx–FxFxˆFxFxzFxsFxlFxeFx^FxWFxPFxIFxBFx;Fx4Fx-Fx&FxFxFxFx FxFxüExõExîExçExàExÙExÒExËExÄEx½Ex¶Ex¯Ex¨Ex¡ExšEx“ExŒEx…Ex~ExwExpExiExbEx[ExTExMExFEx?Ex8Ex1Ex*Ex#ExExExExExExùDxòDxëDxäDxÝDxÖDxÏDxÈDxÁDxºDx³Dx¬Dx¥DxžDx—DxDx‰Dx‚Dx{DxtDxmDxfDx_DxXDxQDxJDxCDx@x7@x0@x)@x"@x@x@x @x@xÿ?xø?xñ?xê?xã?xÜ?xÕ?xÎ?xÇ?xÀ?x¹?x²?x«?x¤?x?x–?x?xˆ?x?xz?xs?xl?xe?x^?xW?xP?xI?xB?x;?x4?x-?x&?x?x?x?x ?x?xü>xõ>xî>xç>xà>xÙ>xÒ>xË>xÄ>x½>x¶>x¯>x¨>x¡>xš>x“>xŒ>x…>x~>xw>xp>xi>xb>x[>xT>xM>xF>x?>x8>x1>x*>x#>x>x>x>x>x>xù=xò=xë=xä=xÝ=xÖ=xÏ=xÈ=xÁ=xº=x³=x¬=x¥=xž=x—=x=x‰=x‚=x{=xt=xm=xf=x_=xX=xQ=xJ=xC=x<=x5=x.=x'=x =x=x=x =x=xý9x79x09x)9x"9x9x9x 9x9xÿ8xø8xñ8xê8xã8xÜ8xÕ8xÎ8xÇ8xÀ8x¹8x²8x«8x¤8x8x–8x8xˆ8x8xz8xs8xl8xe8x^8xW8xP8xI8xB8x;8x48x-8x&8x8x8x8x 8x8xü7xõ7xî7xç7xà7xÙ7xÒ7xË7xÄ7x½7x¶7x¯7x¨7x¡7xš7x“7xŒ7x…7x~7xw7xp7xi7xb7x[7xT7xM7xF7x?7x87x17x*7x#7x7x7x7x7x7xù6xò6xë6xä6xÝ6xÖ6xÏ6xÈ6xÁ6xº6x³6x¬6x¥6xž6x—6x6x‰6x‚6x{6xt6xm6xf6x_6xX6xQ6xJ6xC6x<6x56x.6x'6x 6x6x6x 6x6xý5xö5xï5xè5xá5xÚ5xÓ5xÌ5xÅ5x¾5x·5x°5x©5x¢5x›5x”5x5x†5x5xx5xq5xj5xc5x\5xU5xN5xG5x@5x95x25x+5x$5x5x5x5x5x5xú4xó4xì4xå4xÞ4x×4xÐ4xÉ4xÂ4x»4x´4x­4x¦4xŸ4x˜4x‘4xŠ4xƒ4x|4xu4xn4xg4x`4xY4xR4xK4xD4x=4x64x/4x(4x!4x4x4x 4x4xþ3x÷3xð3xé3xâ3xÛ3xÔ3xÍ3xÆ3x¿3x¸3x±3xª3x£3xœ3x•3xŽ3x‡3x€3xy3xr3xk3xd3x]3xV3xO3xH3xA3x:3x33x,3x%3x3x3x3x 3x3xû2xô2xí2xæ2xß2xØ2xÑ2xÊ2xÃ2x¼2xµ2x®2x§2x 2x™2x’2x‹2x„2x}2xv2xo2xh2xa2xZ2xS2xL2xE2x>2x72x02x)2x"2x2x2x 2x2xÿ1xø1xñ1xê1xã1xÜ1xÕ1xÎ1xÇ1xÀ1x¹1x²1x«1x¤1x1x–1x1xˆ1x1xz1xs1xl1xe1x^1xW1xP1xI1xB1x;1x41x-1x&1x1x1x1x 1x1xü0xõ0xî0xç0xà0xÙ0xÒ0xË0xÄ0x½0x¶0x¯0x¨0x¡0xš0x“0xŒ0x…0x~0xw0xp0xi0xb0x[0xT0xM0xF0x?0x80x10x*0x#0x0x0x0x0x0xù/xò/xë/xä/xÝ/xÖ/xÏ/xÈ/xÁ/xº/x³/x¬/x¥/xž/x—/x/x‰/x‚/x{/xt/xm/xf/x_/xX/xQ/xJ/xC/x+x7+x0+x)+x"+x+x+x +x+xÿ*xø*xñ*xê*xã*xÜ*xÕ*xÎ*xÇ*xÀ*x¹*x²*x«*x¤*x*x–*x*xˆ*x*xz*xs*xl*xe*x^*xW*xP*xI*xB*x;*x4*x-*x&*x*x*x*x *x*xü)xõ)xî)xç)xà)xÙ)xÒ)xË)xÄ)x½)x¶)x¯)x¨)x¡)xš)x“)xŒ)x…)x~)xw)xp)xi)xb)x[)xT)xM)xF)x?)x8)x1)x*)x#)x)x)x)x)x)xù(xò(xë(xä(xÝ(xÖ(xÏ(xÈ(xÁ(xº(x³(x¬(x¥(xž(x—(x(x‰(x‚(x{(xt(xm(xf(x_(xX(xQ(xJ(xC(x<(x5(x.(x'(x (x(x(x (x(xý'xö'xï'xè'xá'xÚ'xÓ'xÌ'xÅ'x¾'x·'x°'x©'x¢'x›'x”'x'x†'x'xx'xq'xj'xc'x\'xU'xN'xG'x@'x9'x2'x+'x$'x'x'x'x'x'xú&xó&xì&xå&xÞ&x×&xÐ&xÉ&xÂ&x»&x´&x­&x¦&xŸ&x˜&x‘&xŠ&xƒ&x|&xu&xn&xg&x`&xY&xR&xK&xD&x=&x6&x/&x(&x!&x&x&x &x&xþ%x÷%xð%xé%xâ%xÛ%xÔ%xÍ%xÆ%x¿%x¸%x±%xª%x£%xœ%x•%xŽ%x‡%x€%xy%xr%xk%xd%x]%xV%xO%xH%xA%x:%x3%x,%x%%x%x%x%x %x%xû$xô$xí$xæ$xß$xØ$xÑ$xÊ$xÃ$x¼$xµ$x®$x§$x $x™$x’$x‹$x„$x}$xv$xo$xh$xa$xZ$xS$xL$xE$x>$x7$x0$x)$x"$x$x$x $x$xÿ#xø#xñ#xê#xã#xÜ#xÕ#xÎ#xÇ#xÀ#x¹#x²#x«#x¤#x#x–#x#xˆ#x#xz#xs#xl#xe#x^#xW#xP#xI#xB#x;#x4#x-#x&#x#x#x#x #x#xü"xõ"xî"xç"xà"xÙ"xÒ"xË"xÄ"x½"x¶"x¯"x¨"x¡"xš"x“"xŒ"x…"x~"xw"xp"xi"xb"x["xT"xM"xF"x?"x8"x1"x*"x#"x"x"x"x"x"xù!xò!xë!xä!xÝ!xÖ!xÏ!xÈ!xÁ!xº!x³!x¬!x¥!xž!x—!x!x‰!x‚!x{!xt!xm!xf!x_!xX!xQ!xJ!xC!xx7x0x)x"xxx xxÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxýxöxïxèxáxÚxÓxÌxÅx¾x·x°x©x¢x›x”xx†xxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxýxöxïxèxáxÚxÓxÌxÅx¾x·x°x©x¢x›x”xx†xxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxü xõ xî xç xà xÙ xÒ xË xÄ x½ x¶ x¯ x¨ x¡ xš x“ xŒ x… x~ xw xp xi xb x[ xT xM xF x? x8 x1 x* x# x x x x x xù xò xë xä xÝ xÖ xÏ xÈ xÁ xº x³ x¬ x¥ xž x— x x‰ x‚ x{ xt xm xf x_ xX xQ xJ xC x< x5 x. x' x x x x x xý xö xï xè xá xÚ xÓ xÌ xÅ x¾ x· x° x© x¢ x› x” x x† x xx xq xj xc x\ xU xN xG x@ x9 x2 x+ x$ x x x x x xú xó xì xå xÞ x× xÐ xÉ x x» x´ x­ x¦ xŸ x˜ x‘ xŠ xƒ x| xu xn xg x` xY xR xK xD x= x6 x/ x( x! x x x x xþ x÷ xð xé xâ xÛ xÔ xÍ xÆ x¿ x¸ x± xª x£ xœ x• xŽ x‡ x€ xy xr xk xd x] xV xO xH xA x: x3 x, x% x x x x x xûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCx<x5x.x'x xxx xxýxöxïxèxáxÚxÓxÌxÅx¾x·x°x©x¢x›x”xx†xxxxqxjxcx\xUxNxGx@x9x2x+x$xxxxxxúxóxìxåxÞx×xÐxÉxÂx»x´x­x¦xŸx˜x‘xŠxƒx|xuxnxgx`xYxRxKxDx=x6x/x(x!xxx xxþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüÿwõÿwîÿwçÿwàÿwÙÿwÒÿwËÿwÄÿw½ÿw¶ÿw¯ÿw¨ÿw¡ÿwšÿw“ÿwŒÿw…ÿw~ÿwwÿwpÿwiÿwbÿw[ÿwTÿwMÿwFÿw?ÿw8ÿw1ÿw*ÿw#ÿwÿwÿwÿwÿwÿwùþwòþwëþwäþwÝþwÖþwÏþwÈþwÁþwºþw³þw¬þw¥þwžþw—þwþw‰þw‚þw{þwtþwmþwfþw_þwXþwQþwJþwCþw<þw5þw.þw'þw þwþwþw þwþwýýwöýwïýwèýwáýwÚýwÓýwÌýwÅýw¾ýw·ýw°ýw©ýw¢ýw›ýw”ýwýw†ýwýwxýwqýwjýwcýw\ýwUýwNýwGýw@ýw9ýw2ýw+ýw$ýwýwýwýwýwýwúüwóüwìüwåüwÞüw×üwÐüwÉüwÂüw»üw´üw­üw¦üwŸüw˜üw‘üwŠüwƒüw|üwuüwnüwgüw`üwYüwRüwKüwDüw=üw6üw/üw(üw!üwüwüw üwüwþûw÷ûwðûwéûwâûwÛûwÔûwÍûwÆûw¿ûw¸ûw±ûwªûw£ûwœûw•ûwŽûw‡ûw€ûwyûwrûwkûwdûw]ûwVûwOûwHûwAûw:ûw3ûw,ûw%ûwûwûwûw ûwûwûúwôúwíúwæúwßúwØúwÑúwÊúwÃúw¼úwµúw®úw§úw úw™úw’úw‹úw„úw}úwvúwoúwhúwaúwZúwSúwLúwEúw>úw7úw0úw)úw"úwúwúw úwúwÿùwøùwñùwêùwãùwÜùwÕùwÎùwÇùwÀùw¹ùw²ùw«ùw¤ùwùw–ùwùwˆùwùwzùwsùwlùweùw^ùwWùwPùwIùwBùw;ùw4ùw-ùw&ùwùwùwùw ùwùwüøwõøwîøwçøwàøwÙøwÒøwËøwÄøw½øw¶øw¯øw¨øw¡øwšøw“øwŒøw…øw~øwwøwpøwiøwbøw[øwTøwMøwFøw?øw8øw1øw*øw#øwøwøwøwøwøwù÷wò÷wë÷wä÷wÝ÷wÖ÷wÏ÷wÈ÷wÁ÷wº÷w³÷w¬÷w¥÷wž÷w—÷w÷w‰÷w‚÷w{÷wt÷wm÷wf÷w_÷wX÷wQ÷wJ÷wC÷w<÷w5÷w.÷w'÷w ÷w÷w÷w ÷w÷wýöwööwïöwèöwáöwÚöwÓöwÌöwÅöw¾öw·öw°öw©öw¢öw›öw”öwöw†öwöwxöwqöwjöwcöw\öwUöwNöwGöw@öw9öw2öw+öw$öwöwöwöwöwöwúõwóõwìõwåõwÞõw×õwÐõwÉõwÂõw»õw´õw­õw¦õwŸõw˜õw‘õwŠõwƒõw|õwuõwnõwgõw`õwYõwRõwKõwDõw=õw6õw/õw(õw!õwõwõw õwõwþôw÷ôwðôwéôwâôwÛôwÔôwÍôwÆôw¿ôw¸ôw±ôwªôw£ôwœôw•ôwŽôw‡ôw€ôwyôwrôwkôwdôw]ôwVôwOôwHôwAôw:ôw3ôw,ôw%ôwôwôwôw ôwôwûówôówíówæówßówØówÑówÊówÃów¼ówµów®ów§ów ów™ów’ów‹ów„ów}ówvówoówhówaówZówSówLówEów>ów7ów0ów)ów"ówówów ówówÿòwøòwñòwêòwãòwÜòwÕòwÎòwÇòwÀòw¹òw²òw«òw¤òwòw–òwòwˆòwòwzòwsòwlòweòw^òwWòwPòwIòwBòw;òw4òw-òw&òwòwòwòw òwòwüñwõñwîñwçñwàñwÙñwÒñwËñwÄñw½ñw¶ñw¯ñw¨ñw¡ñwšñw“ñwŒñw…ñw~ñwwñwpñwiñwbñw[ñwTñwMñwFñw?ñw8ñw1ñw*ñw#ñwñwñwñwñwñwùðwòðwëðwäðwÝðwÖðwÏðwÈðwÁðwºðw³ðw¬ðw¥ðwžðw—ðwðw‰ðw‚ðw{ðwtðwmðwfðw_ðwXðwQðwJðwCðw<ðw5ðw.ðw'ðw ðwðwðw ðwðwýïwöïwïïwèïwáïwÚïwÓïwÌïwÅïw¾ïw·ïw°ïw©ïw¢ïw›ïw”ïwïw†ïwïwxïwqïwjïwcïw\ïwUïwNïwGïw@ïw9ïw2ïw+ïw$ïwïwïwïwïwïwúîwóîwìîwåîwÞîw×îwÐîwÉîwÂîw»îw´îw­îw¦îwŸîw˜îw‘îwŠîwƒîw|îwuîwnîwgîw`îwYîwRîwKîwDîw=îw6îw/îw(îw!îwîwîw îwîwþíw÷íwðíwéíwâíwÛíwÔíwÍíwÆíw¿íw¸íw±íwªíw£íwœíw•íwŽíw‡íw€íwyíwríwkíwdíw]íwVíwOíwHíwAíw:íw3íw,íw%íwíwíwíw íwíwûìwôìwíìwæìwßìwØìwÑìwÊìwÃìw¼ìwµìw®ìw§ìw ìw™ìw’ìw‹ìw„ìw}ìwvìwoìwhìwaìwZìwSìwLìwEìw>ìw7ìw0ìw)ìw"ìwìwìw ìwìwÿëwøëwñëwêëwãëwÜëwÕëwÎëwÇëwÀëw¹ëw²ëw«ëw¤ëwëw–ëwëwˆëwëwzëwsëwlëweëw^ëwWëwPëwIëwBëw;ëw4ëw-ëw&ëwëwëwëw ëwëwüêwõêwîêwçêwàêwÙêwÒêwËêwÄêw½êw¶êw¯êw¨êw¡êwšêw“êwŒêw…êw~êwwêwpêwiêwbêw[êwTêwMêwFêw?êw8êw1êw*êw#êwêwêwêwêwêwùéwòéwëéwäéwÝéwÖéwÏéwÈéwÁéwºéw³éw¬éw¥éwžéw—éwéw‰éw‚éw{éwtéwméwféw_éwXéwQéwJéwCéw<éw5éw.éw'éw éwéwéw éwéwýèwöèwïèwèèwáèwÚèwÓèwÌèwÅèw¾èw·èw°èw©èw¢èw›èw”èwèw†èwèwxèwqèwjèwcèw\èwUèwNèwGèw@èw9èw2èw+èw$èwèwèwèwèwèwúçwóçwìçwåçwÞçw×çwÐçwÉçwÂçw»çw´çw­çw¦çwŸçw˜çw‘çwŠçwƒçw|çwuçwnçwgçw`çwYçwRçwKçwDçw=çw6çw/çw(çw!çwçwçw çwçwþæw÷æwðæwéæwâæwÛæwÔæwÍæwÆæw¿æw¸æw±æwªæw£æwœæw•æwŽæw‡æw€æwyæwræwkæwdæw]æwVæwOæwHæwAæw:æw3æw,æw%æwæwæwæw æwæwûåwôåwíåwæåwßåwØåwÑåwÊåwÃåw¼åwµåw®åw§åw åw™åw’åw‹åw„åw}åwvåwoåwhåwaåwZåwSåwLåwEåw>åw7åw0åw)åw"åwåwåw åwåwÿäwøäwñäwêäwãäwÜäwÕäwÎäwÇäwÀäw¹äw²äw«äw¤äwäw–äwäwˆäwäwzäwsäwläweäw^äwWäwPäwIäwBäw;äw4äw-äw&äwäwäwäw äwäwüãwõãwîãwçãwàãwÙãwÒãwËãwÄãw½ãw¶ãw¯ãw¨ãw¡ãwšãw“ãwŒãw…ãw~ãwwãwpãwiãwbãw[ãwTãwMãwFãw?ãw8ãw1ãw*ãw#ãwãwãwãwãwãwùâwòâwëâwäâwÝâwÖâwÏâwÈâwÁâwºâw³âw¬âw¥âwžâw—âwâw‰âw‚âw{âwtâwmâwfâw_âwXâwQâwJâwCâw<âw5âw.âw'âw âwâwâw âwâwýáwöáwïáwèáwááwÚáwÓáwÌáwÅáw¾áw·áw°áw©áw¢áw›áw”áwáw†áwáwxáwqáwjáwcáw\áwUáwNáwGáw@áw9áw2áw+áw$áwáwáwáwáwáwúàwóàwìàwåàwÞàw×àwÐàwÉàwÂàw»àw´àw­àw¦àwŸàw˜àw‘àwŠàwƒàw|àwuàwnàwgàw`àwYàwRàwKàwDàw=àw6àw/àw(àw!àwàwàw àwàwþßw÷ßwðßwéßwâßwÛßwÔßwÍßwÆßw¿ßw¸ßw±ßwªßw£ßwœßw•ßwŽßw‡ßw€ßwyßwrßwkßwdßw]ßwVßwOßwHßwAßw:ßw3ßw,ßw%ßwßwßwßw ßwßwûÞwôÞwíÞwæÞwßÞwØÞwÑÞwÊÞwÃÞw¼ÞwµÞw®Þw§Þw Þw™Þw’Þw‹Þw„Þw}ÞwvÞwoÞwhÞwaÞwZÞwSÞwLÞwEÞw>Þw7Þw0Þw)Þw"ÞwÞwÞw ÞwÞwÿÝwøÝwñÝwêÝwãÝwÜÝwÕÝwÎÝwÇÝwÀÝw¹Ýw²Ýw«Ýw¤ÝwÝw–ÝwÝwˆÝwÝwzÝwsÝwlÝweÝw^ÝwWÝwPÝwIÝwBÝw;Ýw4Ýw-Ýw&ÝwÝwÝwÝw ÝwÝwüÜwõÜwîÜwçÜwàÜwÙÜwÒÜwËÜwÄÜw½Üw¶Üw¯Üw¨Üw¡ÜwšÜw“ÜwŒÜw…Üw~ÜwwÜwpÜwiÜwbÜw[ÜwTÜwMÜwFÜw?Üw8Üw1Üw*Üw#ÜwÜwÜwÜwÜwÜwùÛwòÛwëÛwäÛwÝÛwÖÛwÏÛwÈÛwÁÛwºÛw³Ûw¬Ûw¥ÛwžÛw—ÛwÛw‰Ûw‚Ûw{ÛwtÛwmÛwfÛw_ÛwXÛwQÛwJÛwCÛw<Ûw5Ûw.Ûw'Ûw ÛwÛwÛw ÛwÛwýÚwöÚwïÚwèÚwáÚwÚÚwÓÚwÌÚwÅÚw¾Úw·Úw°Úw©Úw¢Úw›Úw”ÚwÚw†ÚwÚwxÚwqÚwjÚwcÚw\ÚwUÚwNÚwGÚw@Úw9Úw2Úw+Úw$ÚwÚwÚwÚwÚwÚwúÙwóÙwìÙwåÙwÞÙw×ÙwÐÙwÉÙwÂÙw»Ùw´Ùw­Ùw¦ÙwŸÙw˜Ùw‘ÙwŠÙwƒÙw|ÙwuÙwnÙwgÙw`ÙwYÙwRÙwKÙwDÙw=Ùw6Ùw/Ùw(Ùw!ÙwÙwÙw ÙwÙwþØw÷ØwðØwéØwâØwÛØwÔØwÍØwÆØw¿Øw¸Øw±ØwªØw£ØwœØw•ØwŽØw‡Øw€ØwyØwrØwkØwdØw]ØwVØwOØwHØwAØw:Øw3Øw,Øw%ØwØwØwØw ØwØwû×wô×wí×wæ×wß×wØ×wÑ×wÊ×wÃ×w¼×wµ×w®×w§×w ×w™×w’×w‹×w„×w}×wv×wo×wh×wa×wZ×wS×wL×wE×w>×w7×w0×w)×w"×w×w×w ×w×wÿÖwøÖwñÖwêÖwãÖwÜÖwÕÖwÎÖwÇÖwÀÖw¹Öw²Öw«Öw¤ÖwÖw–ÖwÖwˆÖwÖwzÖwsÖwlÖweÖw^ÖwWÖwPÖwIÖwBÖw;Öw4Öw-Öw&ÖwÖwÖwÖw ÖwÖwüÕwõÕwîÕwçÕwàÕwÙÕwÒÕwËÕwÄÕw½Õw¶Õw¯Õw¨Õw¡ÕwšÕw“ÕwŒÕw…Õw~ÕwwÕwpÕwiÕwbÕw[ÕwTÕwMÕwFÕw?Õw8Õw1Õw*Õw#ÕwÕwÕwÕwÕwÕwùÔwòÔwëÔwäÔwÝÔwÖÔwÏÔwÈÔwÁÔwºÔw³Ôw¬Ôw¥ÔwžÔw—ÔwÔw‰Ôw‚Ôw{ÔwtÔwmÔwfÔw_ÔwXÔwQÔwJÔwCÔw<Ôw5Ôw.Ôw'Ôw ÔwÔwÔw ÔwÔwýÓwöÓwïÓwèÓwáÓwÚÓwÓÓwÌÓwÅÓw¾Ów·Ów°Ów©Ów¢Ów›Ów”ÓwÓw†ÓwÓwxÓwqÓwjÓwcÓw\ÓwUÓwNÓwGÓw@Ów9Ów2Ów+Ów$ÓwÓwÓwÓwÓwÓwúÒwóÒwìÒwåÒwÞÒw×ÒwÐÒwÉÒwÂÒw»Òw´Òw­Òw¦ÒwŸÒw˜Òw‘ÒwŠÒwƒÒw|ÒwuÒwnÒwgÒw`ÒwYÒwRÒwKÒwDÒw=Òw6Òw/Òw(Òw!ÒwÒwÒw ÒwÒwþÑw÷ÑwðÑwéÑwâÑwÛÑwÔÑwÍÑwÆÑw¿Ñw¸Ñw±ÑwªÑw£ÑwœÑw•ÑwŽÑw‡Ñw€ÑwyÑwrÑwkÑwdÑw]ÑwVÑwOÑwHÑwAÑw:Ñw3Ñw,Ñw%ÑwÑwÑwÑw ÑwÑwûÐwôÐwíÐwæÐwßÐwØÐwÑÐwÊÐwÃÐw¼ÐwµÐw®Ðw§Ðw Ðw™Ðw’Ðw‹Ðw„Ðw}ÐwvÐwoÐwhÐwaÐwZÐwSÐwLÐwEÐw>Ðw7Ðw0Ðw)Ðw"ÐwÐwÐw ÐwÐwÿÏwøÏwñÏwêÏwãÏwÜÏwÕÏwÎÏwÇÏwÀÏw¹Ïw²Ïw«Ïw¤ÏwÏw–ÏwÏwˆÏwÏwzÏwsÏwlÏweÏw^ÏwWÏwPÏwIÏwBÏw;Ïw4Ïw-Ïw&ÏwÏwÏwÏw ÏwÏwüÎwõÎwîÎwçÎwàÎwÙÎwÒÎwËÎwÄÎw½Îw¶Îw¯Îw¨Îw¡ÎwšÎw“ÎwŒÎw…Îw~ÎwwÎwpÎwiÎwbÎw[ÎwTÎwMÎwFÎw?Îw8Îw1Îw*Îw#ÎwÎwÎwÎwÎwÎwùÍwòÍwëÍwäÍwÝÍwÖÍwÏÍwÈÍwÁÍwºÍw³Íw¬Íw¥ÍwžÍw—ÍwÍw‰Íw‚Íw{ÍwtÍwmÍwfÍw_ÍwXÍwQÍwJÍwCÍw<Íw5Íw.Íw'Íw ÍwÍwÍw ÍwÍwýÌwöÌwïÌwèÌwáÌwÚÌwÓÌwÌÌwÅÌw¾Ìw·Ìw°Ìw©Ìw¢Ìw›Ìw”ÌwÌw†ÌwÌwxÌwqÌwjÌwcÌw\ÌwUÌwNÌwGÌw@Ìw9Ìw2Ìw+Ìw$ÌwÌwÌwÌwÌwÌwúËwóËwìËwåËwÞËw×ËwÐËwÉËwÂËw»Ëw´Ëw­Ëw¦ËwŸËw˜Ëw‘ËwŠËwƒËw|ËwuËwnËwgËw`ËwYËwRËwKËwDËw=Ëw6Ëw/Ëw(Ëw!ËwËwËw ËwËwþÊw÷ÊwðÊwéÊwâÊwÛÊwÔÊwÍÊwÆÊw¿Êw¸Êw±ÊwªÊw£ÊwœÊw•ÊwŽÊw‡Êw€ÊwyÊwrÊwkÊwdÊw]ÊwVÊwOÊwHÊwAÊw:Êw3Êw,Êw%ÊwÊwÊwÊw ÊwÊwûÉwôÉwíÉwæÉwßÉwØÉwÑÉwÊÉwÃÉw¼ÉwµÉw®Éw§Éw Éw™Éw’Éw‹Éw„Éw}ÉwvÉwoÉwhÉwaÉwZÉwSÉwLÉwEÉw>Éw7Éw0Éw)Éw"ÉwÉwÉw ÉwÉwÿÈwøÈwñÈwêÈwãÈwÜÈwÕÈwÎÈwÇÈwÀÈw¹Èw²Èw«Èw¤ÈwÈw–ÈwÈwˆÈwÈwzÈwsÈwlÈweÈw^ÈwWÈwPÈwIÈwBÈw;Èw4Èw-Èw&ÈwÈwÈwÈw ÈwÈwüÇwõÇwîÇwçÇwàÇwÙÇwÒÇwËÇwÄÇw½Çw¶Çw¯Çw¨Çw¡ÇwšÇw“ÇwŒÇw…Çw~ÇwwÇwpÇwiÇwbÇw[ÇwTÇwMÇwFÇw?Çw8Çw1Çw*Çw#ÇwÇwÇwÇwÇwÇwùÆwòÆwëÆwäÆwÝÆwÖÆwÏÆwÈÆwÁÆwºÆw³Æw¬Æw¥ÆwžÆw—ÆwÆw‰Æw‚Æw{ÆwtÆwmÆwfÆw_ÆwXÆwQÆwJÆwCÆw<Æw5Æw.Æw'Æw ÆwÆwÆw ÆwÆwýÅwöÅwïÅwèÅwáÅwÚÅwÓÅwÌÅwÅÅw¾Åw·Åw°Åw©Åw¢Åw›Åw”ÅwÅw†ÅwÅwxÅwqÅwjÅwcÅw\ÅwUÅwNÅwGÅw@Åw9Åw2Åw+Åw$ÅwÅwÅwÅwÅwÅwúÄwóÄwìÄwåÄwÞÄw×ÄwÐÄwÉÄwÂÄw»Äw´Äw­Äw¦ÄwŸÄw˜Äw‘ÄwŠÄwƒÄw|ÄwuÄwnÄwgÄw`ÄwYÄwRÄwKÄwDÄw=Äw6Äw/Äw(Äw!ÄwÄwÄw ÄwÄwþÃw÷ÃwðÃwéÃwâÃwÛÃwÔÃwÍÃwÆÃw¿Ãw¸Ãw±ÃwªÃw£ÃwœÃw•ÃwŽÃw‡Ãw€ÃwyÃwrÃwkÃwdÃw]ÃwVÃwOÃwHÃwAÃw:Ãw3Ãw,Ãw%ÃwÃwÃwÃw ÃwÃwûÂwôÂwíÂwæÂwßÂwØÂwÑÂwÊÂwÃÂw¼ÂwµÂw®Âw§Âw Âw™Âw’Âw‹Âw„Âw}ÂwvÂwoÂwhÂwaÂwZÂwSÂwLÂwEÂw>Âw7Âw0Âw)Âw"ÂwÂwÂw ÂwÂwÿÁwøÁwñÁwêÁwãÁwÜÁwÕÁwÎÁwÇÁwÀÁw¹Áw²Áw«Áw¤ÁwÁw–ÁwÁwˆÁwÁwzÁwsÁwlÁweÁw^ÁwWÁwPÁwIÁwBÁw;Áw4Áw-Áw&ÁwÁwÁwÁw ÁwÁwüÀwõÀwîÀwçÀwàÀwÙÀwÒÀwËÀwÄÀw½Àw¶Àw¯Àw¨Àw¡ÀwšÀw“ÀwŒÀw…Àw~ÀwwÀwpÀwiÀwbÀw[ÀwTÀwMÀwFÀw?Àw8Àw1Àw*Àw#ÀwÀwÀwÀwÀwÀwù¿wò¿wë¿wä¿wÝ¿wÖ¿wÏ¿wÈ¿wÁ¿wº¿w³¿w¬¿w¥¿wž¿w—¿w¿w‰¿w‚¿w{¿wt¿wm¿wf¿w_¿wX¿wQ¿wJ¿wC¿w<¿w5¿w.¿w'¿w ¿w¿w¿w ¿w¿wý¾wö¾wï¾wè¾wá¾wÚ¾wÓ¾w̾wžw¾¾w·¾w°¾w©¾w¢¾w›¾w”¾w¾w†¾w¾wx¾wq¾wj¾wc¾w\¾wU¾wN¾wG¾w@¾w9¾w2¾w+¾w$¾w¾w¾w¾w¾w¾wú½wó½wì½wå½wÞ½w×½wнwɽw½w»½w´½w­½w¦½wŸ½w˜½w‘½wнwƒ½w|½wu½wn½wg½w`½wY½wR½wK½wD½w=½w6½w/½w(½w!½w½w½w ½w½wþ¼w÷¼wð¼wé¼wâ¼wÛ¼wÔ¼wͼwƼw¿¼w¸¼w±¼wª¼w£¼wœ¼w•¼w޼w‡¼w€¼wy¼wr¼wk¼wd¼w]¼wV¼wO¼wH¼wA¼w:¼w3¼w,¼w%¼w¼w¼w¼w ¼w¼wû»wô»wí»wæ»wß»wØ»wÑ»wÊ»wûw¼»wµ»w®»w§»w »w™»w’»w‹»w„»w}»wv»wo»wh»wa»wZ»wS»wL»wE»w>»w7»w0»w)»w"»w»w»w »w»wÿºwøºwñºwêºwãºwܺwÕºwκwǺwÀºw¹ºw²ºw«ºw¤ºwºw–ºwºwˆºwºwzºwsºwlºweºw^ºwWºwPºwIºwBºw;ºw4ºw-ºw&ºwºwºwºw ºwºwü¹wõ¹wî¹wç¹wà¹wÙ¹wÒ¹w˹wĹw½¹w¶¹w¯¹w¨¹w¡¹wš¹w“¹wŒ¹w…¹w~¹ww¹wp¹wi¹wb¹w[¹wT¹wM¹wF¹w?¹w8¹w1¹w*¹w#¹w¹w¹w¹w¹w¹wù¸wò¸wë¸wä¸wݸwÖ¸wϸwȸwÁ¸wº¸w³¸w¬¸w¥¸wž¸w—¸w¸w‰¸w‚¸w{¸wt¸wm¸wf¸w_¸wX¸wQ¸wJ¸wC¸w<¸w5¸w.¸w'¸w ¸w¸w¸w ¸w¸wý·wö·wï·wè·wá·wÚ·wÓ·wÌ·wÅ·w¾·w··w°·w©·w¢·w›·w”·w·w†·w·wx·wq·wj·wc·w\·wU·wN·wG·w@·w9·w2·w+·w$·w·w·w·w·w·wú¶wó¶wì¶wå¶wÞ¶w×¶wжwɶw¶w»¶w´¶w­¶w¦¶wŸ¶w˜¶w‘¶wжwƒ¶w|¶wu¶wn¶wg¶w`¶wY¶wR¶wK¶wD¶w=¶w6¶w/¶w(¶w!¶w¶w¶w ¶w¶wþµw÷µwðµwéµwâµwÛµwÔµw͵wƵw¿µw¸µw±µwªµw£µwœµw•µw޵w‡µw€µwyµwrµwkµwdµw]µwVµwOµwHµwAµw:µw3µw,µw%µwµwµwµw µwµwû´wô´wí´wæ´wß´wØ´wÑ´wÊ´wôw¼´wµ´w®´w§´w ´w™´w’´w‹´w„´w}´wv´wo´wh´wa´wZ´wS´wL´wE´w>´w7´w0´w)´w"´w´w´w ´w´wÿ³wø³wñ³wê³wã³wܳwÕ³wγwdzwÀ³w¹³w²³w«³w¤³w³w–³w³wˆ³w³wz³ws³wl³we³w^³wW³wP³wI³wB³w;³w4³w-³w&³w³w³w³w ³w³wü²wõ²wî²wç²wà²wÙ²wÒ²w˲wIJw½²w¶²w¯²w¨²w¡²wš²w“²wŒ²w…²w~²ww²wp²wi²wb²w[²wT²wM²wF²w?²w8²w1²w*²w#²w²w²w²w²w²wù±wò±wë±wä±wݱwÖ±wϱwȱwÁ±wº±w³±w¬±w¥±wž±w—±w±w‰±w‚±w{±wt±wm±wf±w_±wX±wQ±wJ±wC±w<±w5±w.±w'±w ±w±w±w ±w±wý°wö°wï°wè°wá°wÚ°wÓ°w̰wŰw¾°w·°w°°w©°w¢°w›°w”°w°w†°w°wx°wq°wj°wc°w\°wU°wN°wG°w@°w9°w2°w+°w$°w°w°w°w°w°wú¯wó¯wì¯wå¯wÞ¯wׯwЯwɯw¯w»¯w´¯w­¯w¦¯wŸ¯w˜¯w‘¯wНwƒ¯w|¯wu¯wn¯wg¯w`¯wY¯wR¯wK¯wD¯w=¯w6¯w/¯w(¯w!¯w¯w¯w ¯w¯wþ®w÷®wð®wé®wâ®wÛ®wÔ®wÍ®wÆ®w¿®w¸®w±®wª®w£®wœ®w•®wŽ®w‡®w€®wy®wr®wk®wd®w]®wV®wO®wH®wA®w:®w3®w,®w%®w®w®w®w ®w®wû­wô­wí­wæ­wß­wØ­wÑ­wÊ­wíw¼­wµ­w®­w§­w ­w™­w’­w‹­w„­w}­wv­wo­wh­wa­wZ­wS­wL­wE­w>­w7­w0­w)­w"­w­w­w ­w­wÿ¬wø¬wñ¬wê¬wã¬wܬwÕ¬wάwǬwÀ¬w¹¬w²¬w«¬w¤¬w¬w–¬w¬wˆ¬w¬wz¬ws¬wl¬we¬w^¬wW¬wP¬wI¬wB¬w;¬w4¬w-¬w&¬w¬w¬w¬w ¬w¬wü«wõ«wî«wç«wà«wÙ«wÒ«wË«wÄ«w½«w¶«w¯«w¨«w¡«wš«w“«wŒ«w…«w~«ww«wp«wi«wb«w[«wT«wM«wF«w?«w8«w1«w*«w#«w«w«w«w«w«wùªwòªwëªwäªwݪwÖªwϪwȪwÁªwºªw³ªw¬ªw¥ªwžªw—ªwªw‰ªw‚ªw{ªwtªwmªwfªw_ªwXªwQªwJªwCªw<ªw5ªw.ªw'ªw ªwªwªw ªwªwý©wö©wï©wè©wá©wÚ©wÓ©wÌ©wÅ©w¾©w·©w°©w©©w¢©w›©w”©w©w†©w©wx©wq©wj©wc©w\©wU©wN©wG©w@©w9©w2©w+©w$©w©w©w©w©w©wú¨wó¨wì¨wå¨wÞ¨wרwШwɨw¨w»¨w´¨w­¨w¦¨wŸ¨w˜¨w‘¨wЍwƒ¨w|¨wu¨wn¨wg¨w`¨wY¨wR¨wK¨wD¨w=¨w6¨w/¨w(¨w!¨w¨w¨w ¨w¨wþ§w÷§wð§wé§wâ§wÛ§wÔ§wͧwƧw¿§w¸§w±§wª§w£§wœ§w•§wާw‡§w€§wy§wr§wk§wd§w]§wV§wO§wH§wA§w:§w3§w,§w%§w§w§w§w §w§wû¦wô¦wí¦wæ¦wߦwئwѦwʦwæw¼¦wµ¦w®¦w§¦w ¦w™¦w’¦w‹¦w„¦w}¦wv¦wo¦wh¦wa¦wZ¦wS¦wL¦wE¦w>¦w7¦w0¦w)¦w"¦w¦w¦w ¦w¦wÿ¥wø¥wñ¥wê¥wã¥wÜ¥wÕ¥wÎ¥wÇ¥wÀ¥w¹¥w²¥w«¥w¤¥w¥w–¥w¥wˆ¥w¥wz¥ws¥wl¥we¥w^¥wW¥wP¥wI¥wB¥w;¥w4¥w-¥w&¥w¥w¥w¥w ¥w¥wü¤wõ¤wî¤wç¤wà¤wÙ¤wÒ¤wˤwĤw½¤w¶¤w¯¤w¨¤w¡¤wš¤w“¤wŒ¤w…¤w~¤ww¤wp¤wi¤wb¤w[¤wT¤wM¤wF¤w?¤w8¤w1¤w*¤w#¤w¤w¤w¤w¤w¤wù£wò£wë£wä£wÝ£wÖ£wÏ£wÈ£wÁ£wº£w³£w¬£w¥£wž£w—£w£w‰£w‚£w{£wt£wm£wf£w_£wX£wQ£wJ£wC£w<£w5£w.£w'£w £w£w£w £w£wý¢wö¢wï¢wè¢wá¢wÚ¢wÓ¢wÌ¢wÅ¢w¾¢w·¢w°¢w©¢w¢¢w›¢w”¢w¢w†¢w¢wx¢wq¢wj¢wc¢w\¢wU¢wN¢wG¢w@¢w9¢w2¢w+¢w$¢w¢w¢w¢w¢w¢wú¡wó¡wì¡wå¡wÞ¡wסwСwÉ¡w¡w»¡w´¡w­¡w¦¡wŸ¡w˜¡w‘¡wŠ¡wƒ¡w|¡wu¡wn¡wg¡w`¡wY¡wR¡wK¡wD¡w=¡w6¡w/¡w(¡w!¡w¡w¡w ¡w¡wþ w÷ wð wé wâ wÛ wÔ wÍ wÆ w¿ w¸ w± wª w£ wœ w• wŽ w‡ w€ wy wr wk wd w] wV wO wH wA w: w3 w, w% w w w w  w wûŸwôŸwíŸwæŸwߟwØŸwÑŸwÊŸwßw¼ŸwµŸw®Ÿw§Ÿw Ÿw™Ÿw’Ÿw‹Ÿw„Ÿw}ŸwvŸwoŸwhŸwaŸwZŸwSŸwLŸwEŸw>Ÿw7Ÿw0Ÿw)Ÿw"ŸwŸwŸw ŸwŸwÿžwøžwñžwêžwãžwÜžwÕžwΞwÇžwÀžw¹žw²žw«žw¤žwžw–žwžwˆžwžwzžwsžwlžwežw^žwWžwPžwIžwBžw;žw4žw-žw&žwžwžwžw žwžwüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùœwòœwëœwäœwÝœwÖœwÏœwÈœwÁœwºœw³œw¬œw¥œwžœw—œwœw‰œw‚œw{œwtœwmœwfœw_œwXœwQœwJœwCœw<œw5œw.œw'œw œwœwœw œwœwý›wö›wï›wè›wá›wÚ›wÓ›wÌ›wÅ›w¾›w·›w°›w©›w¢›w››w”›w›w†›w›wx›wq›wj›wc›w\›wU›wN›wG›w@›w9›w2›w+›w$›w›w›w›w›w›wúšwóšwìšwåšwÞšwךwКwÉšwšw»šw´šw­šw¦šwŸšw˜šw‘šwŠšwƒšw|šwušwnšwgšw`šwYšwRšwKšwDšw=šw6šw/šw(šw!šwšwšw šwšwþ™w÷™wð™wé™wâ™wÛ™wÔ™wÍ™wÆ™w¿™w¸™w±™wª™w£™wœ™w•™wŽ™w‡™w€™wy™wr™wk™wd™w]™wV™wO™wH™wA™w:™w3™w,™w%™w™w™w™w ™w™wû˜wô˜wí˜wæ˜wߘwؘwјwʘwØw¼˜wµ˜w®˜w§˜w ˜w™˜w’˜w‹˜w„˜w}˜wv˜wo˜wh˜wa˜wZ˜wS˜wL˜wE˜w>˜w7˜w0˜w)˜w"˜w˜w˜w ˜w˜wÿ—wø—wñ—wê—wã—wÜ—wÕ—wΗwÇ—wÀ—w¹—w²—w«—w¤—w—w–—w—wˆ—w—wz—ws—wl—we—w^—wW—wP—wI—wB—w;—w4—w-—w&—w—w—w—w —w—wü–wõ–wî–wç–wà–wÙ–wÒ–wË–wÄ–w½–w¶–w¯–w¨–w¡–wš–w“–wŒ–w…–w~–ww–wp–wi–wb–w[–wT–wM–wF–w?–w8–w1–w*–w#–w–w–w–w–w–wù•wò•wë•wä•wÝ•wÖ•wÏ•wÈ•wÁ•wº•w³•w¬•w¥•wž•w—•w•w‰•w‚•w{•wt•wm•wf•w_•wX•wQ•wJ•wC•w<•w5•w.•w'•w •w•w•w •w•wý”wö”wï”wè”wá”wÚ”wÓ”wÌ”wÅ”w¾”w·”w°”w©”w¢”w›”w””w”w†”w”wx”wq”wj”wc”w\”wU”wN”wG”w@”w9”w2”w+”w$”w”w”w”w”w”wú“wó“wì“wå“wÞ“wדwГwÉ“w“w»“w´“w­“w¦“wŸ“w˜“w‘“wŠ“wƒ“w|“wu“wn“wg“w`“wY“wR“wK“wD“w=“w6“w/“w(“w!“w“w“w “w“wþ’w÷’wð’wé’wâ’wÛ’wÔ’wÍ’wÆ’w¿’w¸’w±’wª’w£’wœ’w•’wŽ’w‡’w€’wy’wr’wk’wd’w]’wV’wO’wH’wA’w:’w3’w,’w%’w’w’w’w ’w’wû‘wô‘wí‘wæ‘wß‘wØ‘wÑ‘wÊ‘wÑw¼‘wµ‘w®‘w§‘w ‘w™‘w’‘w‹‘w„‘w}‘wv‘wo‘wh‘wa‘wZ‘wS‘wL‘wE‘w>‘w7‘w0‘w)‘w"‘w‘w‘w ‘w‘wÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùŽwòŽwëŽwäŽwÝŽwÖŽwÏŽwÈŽwÁŽwºŽw³Žw¬Žw¥ŽwžŽw—ŽwŽw‰Žw‚Žw{ŽwtŽwmŽwfŽw_ŽwXŽwQŽwJŽwCŽw<Žw5Žw.Žw'Žw ŽwŽwŽw ŽwŽwýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúŒwóŒwìŒwåŒwÞŒw׌wÐŒwÉŒwÂŒw»Œw´Œw­Œw¦ŒwŸŒw˜Œw‘ŒwŠŒwƒŒw|ŒwuŒwnŒwgŒw`ŒwYŒwRŒwKŒwDŒw=Œw6Œw/Œw(Œw!ŒwŒwŒw ŒwŒwþ‹w÷‹wð‹wé‹wâ‹wÛ‹wÔ‹wÍ‹wÆ‹w¿‹w¸‹w±‹wª‹w£‹wœ‹w•‹wŽ‹w‡‹w€‹wy‹wr‹wk‹wd‹w]‹wV‹wO‹wH‹wA‹w:‹w3‹w,‹w%‹w‹w‹w‹w ‹w‹wûŠwôŠwíŠwæŠwߊwØŠwÑŠwÊŠwÊw¼ŠwµŠw®Šw§Šw Šw™Šw’Šw‹Šw„Šw}ŠwvŠwoŠwhŠwaŠwZŠwSŠwLŠwEŠw>Šw7Šw0Šw)Šw"ŠwŠwŠw ŠwŠwÿ‰wø‰wñ‰wê‰wã‰w܉wÕ‰wΉwljwÀ‰w¹‰w²‰w«‰w¤‰w‰w–‰w‰wˆ‰w‰wz‰ws‰wl‰we‰w^‰wW‰wP‰wI‰wB‰w;‰w4‰w-‰w&‰w‰w‰w‰w ‰w‰wüˆwõˆwîˆwçˆwàˆwÙˆwÒˆwˈwĈw½ˆw¶ˆw¯ˆw¨ˆw¡ˆwšˆw“ˆwŒˆw…ˆw~ˆwwˆwpˆwiˆwbˆw[ˆwTˆwMˆwFˆw?ˆw8ˆw1ˆw*ˆw#ˆwˆwˆwˆwˆwˆwù‡wò‡wë‡wä‡w݇wÖ‡wχwȇwÁ‡wº‡w³‡w¬‡w¥‡wž‡w—‡w‡w‰‡w‚‡w{‡wt‡wm‡wf‡w_‡wX‡wQ‡wJ‡wC‡w<‡w5‡w.‡w'‡w ‡w‡w‡w ‡w‡wý†wö†wï†wè†wá†wÚ†wÓ†w̆wņw¾†w·†w°†w©†w¢†w›†w”†w†w††w†wx†wq†wj†wc†w\†wU†wN†wG†w@†w9†w2†w+†w$†w†w†w†w†w†wú…wó…wì…wå…wÞ…w×…wÐ…wÉ…wÂ…w»…w´…w­…w¦…wŸ…w˜…w‘…wŠ…wƒ…w|…wu…wn…wg…w`…wY…wR…wK…wD…w=…w6…w/…w(…w!…w…w…w …w…wþ„w÷„wð„wé„wâ„wÛ„wÔ„wÍ„wÆ„w¿„w¸„w±„wª„w£„wœ„w•„wŽ„w‡„w€„wy„wr„wk„wd„w]„wV„wO„wH„wA„w:„w3„w,„w%„w„w„w„w „w„wûƒwôƒwíƒwæƒw߃w؃wуwʃwÃw¼ƒwµƒw®ƒw§ƒw ƒw™ƒw’ƒw‹ƒw„ƒw}ƒwvƒwoƒwhƒwaƒwZƒwSƒwLƒwEƒw>ƒw7ƒw0ƒw)ƒw"ƒwƒwƒw ƒwƒwÿ‚wø‚wñ‚wê‚wã‚wÜ‚wÕ‚w΂wÇ‚wÀ‚w¹‚w²‚w«‚w¤‚w‚w–‚w‚wˆ‚w‚wz‚ws‚wl‚we‚w^‚wW‚wP‚wI‚wB‚w;‚w4‚w-‚w&‚w‚w‚w‚w ‚w‚wüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwù€wò€wë€wä€wÝ€wÖ€wÏ€wÈ€wÁ€wº€w³€w¬€w¥€wž€w—€w€w‰€w‚€w{€wt€wm€wf€w_€wX€wQ€wJ€wC€w<€w5€w.€w'€w €w€w€w €w€wýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwú~wó~wì~wå~wÞ~w×~wÐ~wÉ~wÂ~w»~w´~w­~w¦~wŸ~w˜~w‘~wŠ~wƒ~w|~wu~wn~wg~w`~wY~wR~wK~wD~w=~w6~w/~w(~w!~w~w~w ~w~wþ}w÷}wð}wé}wâ}wÛ}wÔ}wÍ}wÆ}w¿}w¸}w±}wª}w£}wœ}w•}wŽ}w‡}w€}wy}wr}wk}wd}w]}wV}wO}wH}wA}w:}w3}w,}w%}w}w}w}w }w}wû|wô|wí|wæ|wß|wØ|wÑ|wÊ|wÃ|w¼|wµ|w®|w§|w |w™|w’|w‹|w„|w}|wv|wo|wh|wa|wZ|wS|wL|wE|w>|w7|w0|w)|w"|w|w|w |w|wÿ{wø{wñ{wê{wã{wÜ{wÕ{wÎ{wÇ{wÀ{w¹{w²{w«{w¤{w{w–{w{wˆ{w{wz{ws{wl{we{w^{wW{wP{wI{wB{w;{w4{w-{w&{w{w{w{w {w{wüzwõzwîzwçzwàzwÙzwÒzwËzwÄzw½zw¶zw¯zw¨zw¡zwšzw“zwŒzw…zw~zwwzwpzwizwbzw[zwTzwMzwFzw?zw8zw1zw*zw#zwzwzwzwzwzwùywòywëywäywÝywÖywÏywÈywÁywºyw³yw¬yw¥ywžyw—ywyw‰yw‚yw{ywtywmywfyw_ywXywQywJywCywuw7uw0uw)uw"uwuwuw uwuwÿtwøtwñtwêtwãtwÜtwÕtwÎtwÇtwÀtw¹tw²tw«tw¤twtw–twtwˆtwtwztwstwltwetw^twWtwPtwItwBtw;tw4tw-tw&twtwtwtw twtwüswõswîswçswàswÙswÒswËswÄsw½sw¶sw¯sw¨sw¡swšsw“swŒsw…sw~swwswpswiswbsw[swTswMswFsw?sw8sw1sw*sw#swswswswswswùrwòrwërwärwÝrwÖrwÏrwÈrwÁrwºrw³rw¬rw¥rwžrw—rwrw‰rw‚rw{rwtrwmrwfrw_rwXrwQrwJrwCrwnw7nw0nw)nw"nwnwnw nwnwÿmwømwñmwêmwãmwÜmwÕmwÎmwÇmwÀmw¹mw²mw«mw¤mwmw–mwmwˆmwmwzmwsmwlmwemw^mwWmwPmwImwBmw;mw4mw-mw&mwmwmwmw mwmwülwõlwîlwçlwàlwÙlwÒlwËlwÄlw½lw¶lw¯lw¨lw¡lwšlw“lwŒlw…lw~lwwlwplwilwblw[lwTlwMlwFlw?lw8lw1lw*lw#lwlwlwlwlwlwùkwòkwëkwäkwÝkwÖkwÏkwÈkwÁkwºkw³kw¬kw¥kwžkw—kwkw‰kw‚kw{kwtkwmkwfkw_kwXkwQkwJkwCkwgw7gw0gw)gw"gwgwgw gwgwÿfwøfwñfwêfwãfwÜfwÕfwÎfwÇfwÀfw¹fw²fw«fw¤fwfw–fwfwˆfwfwzfwsfwlfwefw^fwWfwPfwIfwBfw;fw4fw-fw&fwfwfwfw fwfwüewõewîewçewàewÙewÒewËewÄew½ew¶ew¯ew¨ew¡ewšew“ewŒew…ew~ewwewpewiewbew[ewTewMewFew?ew8ew1ew*ew#ewewewewewewùdwòdwëdwädwÝdwÖdwÏdwÈdwÁdwºdw³dw¬dw¥dwždw—dwdw‰dw‚dw{dwtdwmdwfdw_dwXdwQdwJdwCdw`w7`w0`w)`w"`w`w`w `w`wÿ_wø_wñ_wê_wã_wÜ_wÕ_wÎ_wÇ_wÀ_w¹_w²_w«_w¤_w_w–_w_wˆ_w_wz_ws_wl_we_w^_wW_wP_wI_wB_w;_w4_w-_w&_w_w_w_w _w_wü^wõ^wî^wç^wà^wÙ^wÒ^wË^wÄ^w½^w¶^w¯^w¨^w¡^wš^w“^wŒ^w…^w~^ww^wp^wi^wb^w[^wT^wM^wF^w?^w8^w1^w*^w#^w^w^w^w^w^wù]wò]wë]wä]wÝ]wÖ]wÏ]wÈ]wÁ]wº]w³]w¬]w¥]wž]w—]w]w‰]w‚]w{]wt]wm]wf]w_]wX]wQ]wJ]wC]w<]w5]w.]w']w ]w]w]w ]w]wý\wö\wï\wè\wá\wÚ\wÓ\wÌ\wÅ\w¾\w·\w°\w©\w¢\w›\w”\w\w†\w\wx\wq\wj\wc\w\\wU\wN\wG\w@\w9\w2\w+\w$\w\w\w\w\w\wú[wó[wì[wå[wÞ[w×[wÐ[wÉ[wÂ[w»[w´[w­[w¦[wŸ[w˜[w‘[wŠ[wƒ[w|[wu[wn[wg[w`[wY[wR[wK[wD[w=[w6[w/[w([w![w[w[w [w[wþZw÷ZwðZwéZwâZwÛZwÔZwÍZwÆZw¿Zw¸Zw±ZwªZw£ZwœZw•ZwŽZw‡Zw€ZwyZwrZwkZwdZw]ZwVZwOZwHZwAZw:Zw3Zw,Zw%ZwZwZwZw ZwZwûYwôYwíYwæYwßYwØYwÑYwÊYwÃYw¼YwµYw®Yw§Yw Yw™Yw’Yw‹Yw„Yw}YwvYwoYwhYwaYwZYwSYwLYwEYw>Yw7Yw0Yw)Yw"YwYwYw YwYwÿXwøXwñXwêXwãXwÜXwÕXwÎXwÇXwÀXw¹Xw²Xw«Xw¤XwXw–XwXwˆXwXwzXwsXwlXweXw^XwWXwPXwIXwBXw;Xw4Xw-Xw&XwXwXwXw XwXwüWwõWwîWwçWwàWwÙWwÒWwËWwÄWw½Ww¶Ww¯Ww¨Ww¡WwšWw“WwŒWw…Ww~WwwWwpWwiWwbWw[WwTWwMWwFWw?Ww8Ww1Ww*Ww#WwWwWwWwWwWwùVwòVwëVwäVwÝVwÖVwÏVwÈVwÁVwºVw³Vw¬Vw¥VwžVw—VwVw‰Vw‚Vw{VwtVwmVwfVw_VwXVwQVwJVwCVwRw7Rw0Rw)Rw"RwRwRw RwRwÿQwøQwñQwêQwãQwÜQwÕQwÎQwÇQwÀQw¹Qw²Qw«Qw¤QwQw–QwQwˆQwQwzQwsQwlQweQw^QwWQwPQwIQwBQw;Qw4Qw-Qw&QwQwQwQw QwQwüPwõPwîPwçPwàPwÙPwÒPwËPwÄPw½Pw¶Pw¯Pw¨Pw¡PwšPw“PwŒPw…Pw~PwwPwpPwiPwbPw[PwTPwMPwFPw?Pw8Pw1Pw*Pw#PwPwPwPwPwPwùOwòOwëOwäOwÝOwÖOwÏOwÈOwÁOwºOw³Ow¬Ow¥OwžOw—OwOw‰Ow‚Ow{OwtOwmOwfOw_OwXOwQOwJOwCOwKw7Kw0Kw)Kw"KwKwKw KwKwÿJwøJwñJwêJwãJwÜJwÕJwÎJwÇJwÀJw¹Jw²Jw«Jw¤JwJw–JwJwˆJwJwzJwsJwlJweJw^JwWJwPJwIJwBJw;Jw4Jw-Jw&JwJwJwJw JwJwüIwõIwîIwçIwàIwÙIwÒIwËIwÄIw½Iw¶Iw¯Iw¨Iw¡IwšIw“IwŒIw…Iw~IwwIwpIwiIwbIw[IwTIwMIwFIw?Iw8Iw1Iw*Iw#IwIwIwIwIwIwùHwòHwëHwäHwÝHwÖHwÏHwÈHwÁHwºHw³Hw¬Hw¥HwžHw—HwHw‰Hw‚Hw{HwtHwmHwfHw_HwXHwQHwJHwCHwDw7Dw0Dw)Dw"DwDwDw DwDwÿCwøCwñCwêCwãCwÜCwÕCwÎCwÇCwÀCw¹Cw²Cw«Cw¤CwCw–CwCwˆCwCwzCwsCwlCweCw^CwWCwPCwICwBCw;Cw4Cw-Cw&CwCwCwCw CwCwüBwõBwîBwçBwàBwÙBwÒBwËBwÄBw½Bw¶Bw¯Bw¨Bw¡BwšBw“BwŒBw…Bw~BwwBwpBwiBwbBw[BwTBwMBwFBw?Bw8Bw1Bw*Bw#BwBwBwBwBwBwùAwòAwëAwäAwÝAwÖAwÏAwÈAwÁAwºAw³Aw¬Aw¥AwžAw—AwAw‰Aw‚Aw{AwtAwmAwfAw_AwXAwQAwJAwCAww÷>wð>wé>wâ>wÛ>wÔ>wÍ>wÆ>w¿>w¸>w±>wª>w£>wœ>w•>wŽ>w‡>w€>wy>wr>wk>wd>w]>wV>wO>wH>wA>w:>w3>w,>w%>w>w>w>w >w>wû=wô=wí=wæ=wß=wØ=wÑ=wÊ=wÃ=w¼=wµ=w®=w§=w =w™=w’=w‹=w„=w}=wv=wo=wh=wa=wZ=wS=wL=wE=w>=w7=w0=w)=w"=w=w=w =w=wÿ6w76w06w)6w"6w6w6w 6w6wÿ5wø5wñ5wê5wã5wÜ5wÕ5wÎ5wÇ5wÀ5w¹5w²5w«5w¤5w5w–5w5wˆ5w5wz5ws5wl5we5w^5wW5wP5wI5wB5w;5w45w-5w&5w5w5w5w 5w5wü4wõ4wî4wç4wà4wÙ4wÒ4wË4wÄ4w½4w¶4w¯4w¨4w¡4wš4w“4wŒ4w…4w~4ww4wp4wi4wb4w[4wT4wM4wF4w?4w84w14w*4w#4w4w4w4w4w4wù3wò3wë3wä3wÝ3wÖ3wÏ3wÈ3wÁ3wº3w³3w¬3w¥3wž3w—3w3w‰3w‚3w{3wt3wm3wf3w_3wX3wQ3wJ3wC3w<3w53w.3w'3w 3w3w3w 3w3wý2wö2wï2wè2wá2wÚ2wÓ2wÌ2wÅ2w¾2w·2w°2w©2w¢2w›2w”2w2w†2w2wx2wq2wj2wc2w\2wU2wN2wG2w@2w92w22w+2w$2w2w2w2w2w2wú1wó1wì1wå1wÞ1w×1wÐ1wÉ1wÂ1w»1w´1w­1w¦1wŸ1w˜1w‘1wŠ1wƒ1w|1wu1wn1wg1w`1wY1wR1wK1wD1w=1w61w/1w(1w!1w1w1w 1w1wþ0w÷0wð0wé0wâ0wÛ0wÔ0wÍ0wÆ0w¿0w¸0w±0wª0w£0wœ0w•0wŽ0w‡0w€0wy0wr0wk0wd0w]0wV0wO0wH0wA0w:0w30w,0w%0w0w0w0w 0w0wû/wô/wí/wæ/wß/wØ/wÑ/wÊ/wÃ/w¼/wµ/w®/w§/w /w™/w’/w‹/w„/w}/wv/wo/wh/wa/wZ/wS/wL/wE/w>/w7/w0/w)/w"/w/w/w /w/wÿ.wø.wñ.wê.wã.wÜ.wÕ.wÎ.wÇ.wÀ.w¹.w².w«.w¤.w.w–.w.wˆ.w.wz.ws.wl.we.w^.wW.wP.wI.wB.w;.w4.w-.w&.w.w.w.w .w.wü-wõ-wî-wç-wà-wÙ-wÒ-wË-wÄ-w½-w¶-w¯-w¨-w¡-wš-w“-wŒ-w…-w~-ww-wp-wi-wb-w[-wT-wM-wF-w?-w8-w1-w*-w#-w-w-w-w-w-wù,wò,wë,wä,wÝ,wÖ,wÏ,wÈ,wÁ,wº,w³,w¬,w¥,wž,w—,w,w‰,w‚,w{,wt,wm,wf,w_,wX,wQ,wJ,wC,w<,w5,w.,w',w ,w,w,w ,w,wý+wö+wï+wè+wá+wÚ+wÓ+wÌ+wÅ+w¾+w·+w°+w©+w¢+w›+w”+w+w†+w+wx+wq+wj+wc+w\+wU+wN+wG+w@+w9+w2+w++w$+w+w+w+w+w+wú*wó*wì*wå*wÞ*w×*wÐ*wÉ*wÂ*w»*w´*w­*w¦*wŸ*w˜*w‘*wŠ*wƒ*w|*wu*wn*wg*w`*wY*wR*wK*wD*w=*w6*w/*w(*w!*w*w*w *w*wþ)w÷)wð)wé)wâ)wÛ)wÔ)wÍ)wÆ)w¿)w¸)w±)wª)w£)wœ)w•)wŽ)w‡)w€)wy)wr)wk)wd)w])wV)wO)wH)wA)w:)w3)w,)w%)w)w)w)w )w)wû(wô(wí(wæ(wß(wØ(wÑ(wÊ(wÃ(w¼(wµ(w®(w§(w (w™(w’(w‹(w„(w}(wv(wo(wh(wa(wZ(wS(wL(wE(w>(w7(w0(w)(w"(w(w(w (w(wÿ'wø'wñ'wê'wã'wÜ'wÕ'wÎ'wÇ'wÀ'w¹'w²'w«'w¤'w'w–'w'wˆ'w'wz'ws'wl'we'w^'wW'wP'wI'wB'w;'w4'w-'w&'w'w'w'w 'w'wü&wõ&wî&wç&wà&wÙ&wÒ&wË&wÄ&w½&w¶&w¯&w¨&w¡&wš&w“&wŒ&w…&w~&ww&wp&wi&wb&w[&wT&wM&wF&w?&w8&w1&w*&w#&w&w&w&w&w&wù%wò%wë%wä%wÝ%wÖ%wÏ%wÈ%wÁ%wº%w³%w¬%w¥%wž%w—%w%w‰%w‚%w{%wt%wm%wf%w_%wX%wQ%wJ%wC%w<%w5%w.%w'%w %w%w%w %w%wý$wö$wï$wè$wá$wÚ$wÓ$wÌ$wÅ$w¾$w·$w°$w©$w¢$w›$w”$w$w†$w$wx$wq$wj$wc$w\$wU$wN$wG$w@$w9$w2$w+$w$$w$w$w$w$w$wú#wó#wì#wå#wÞ#w×#wÐ#wÉ#wÂ#w»#w´#w­#w¦#wŸ#w˜#w‘#wŠ#wƒ#w|#wu#wn#wg#w`#wY#wR#wK#wD#w=#w6#w/#w(#w!#w#w#w #w#wþ"w÷"wð"wé"wâ"wÛ"wÔ"wÍ"wÆ"w¿"w¸"w±"wª"w£"wœ"w•"wŽ"w‡"w€"wy"wr"wk"wd"w]"wV"wO"wH"wA"w:"w3"w,"w%"w"w"w"w "w"wû!wô!wí!wæ!wß!wØ!wÑ!wÊ!wÃ!w¼!wµ!w®!w§!w !w™!w’!w‹!w„!w}!wv!wo!wh!wa!wZ!wS!wL!wE!w>!w7!w0!w)!w"!w!w!w !w!wÿ wø wñ wê wã wÜ wÕ wÎ wÇ wÀ w¹ w² w« w¤ w w– w wˆ w wz ws wl we w^ wW wP wI wB w; w4 w- w& w w w w w wüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCw<w5w.w'w www wwýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúwówìwåwÞw×wÐwÉwÂw»w´w­w¦wŸw˜w‘wŠwƒw|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwþw÷wðwéwâwÛwÔwÍwÆw¿w¸w±wªw£wœw•wŽw‡w€wywrwkwdw]wVwOwHwAw:w3w,w%wwww wwûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCw<w5w.w'w www wwýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúwówìwåwÞw×wÐwÉwÂw»w´w­w¦wŸw˜w‘wŠwƒw|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwþw÷wðwéwâwÛwÔwÍwÆw¿w¸w±wªw£wœw•wŽw‡w€wywrwkwdw]wVwOwHwAw:w3w,w%wwww wwûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCw<w5w.w'w www wwýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúwówìwåwÞw×wÐwÉwÂw»w´w­w¦wŸw˜w‘wŠwƒw|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwþ w÷ wð wé wâ wÛ wÔ wÍ wÆ w¿ w¸ w± wª w£ wœ w• wŽ w‡ w€ wy wr wk wd w] wV wO wH wA w: w3 w, w% w w w w w wû wô wí wæ wß wØ wÑ wÊ wà w¼ wµ w® w§ w  w™ w’ w‹ w„ w} wv wo wh wa wZ wS wL wE w> w7 w0 w) w" w w w w wÿ wø wñ wê wã wÜ wÕ wÎ wÇ wÀ w¹ w² w« w¤ w w– w wˆ w wz ws wl we w^ wW wP wI wB w; w4 w- w& w w w w w wü wõ wî wç wà wÙ wÒ wË wÄ w½ w¶ w¯ w¨ w¡ wš w“ wŒ w… w~ ww wp wi wb w[ wT wM wF w? w8 w1 w* w# w w w w w wù wò wë wä wÝ wÖ wÏ wÈ wÁ wº w³ w¬ w¥ wž w— w w‰ w‚ w{ wt wm wf w_ wX wQ wJ wC w< w5 w. w' w w w w w wýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúwówìwåwÞw×wÐwÉwÂw»w´w­w¦wŸw˜w‘wŠwƒw|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwþw÷wðwéwâwÛwÔwÍwÆw¿w¸w±wªw£wœw•wŽw‡w€wywrwkwdw]wVwOwHwAw:w3w,w%wwww wwûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCw<w5w.w'w www wwýwöwïwèwáwÚwÓwÌwÅw¾w·w°w©w¢w›w”ww†wwxwqwjwcw\wUwNwGw@w9w2w+w$wwwwwwúwówìwåwÞw×wÐwÉwÂw»w´w­w¦wŸw˜w‘wŠwƒw|wuwnwgw`wYwRwKwDw=w6w/w(w!www wwþÿv÷ÿvðÿvéÿvâÿvÛÿvÔÿvÍÿvÆÿv¿ÿv¸ÿv±ÿvªÿv£ÿvœÿv•ÿvŽÿv‡ÿv€ÿvyÿvrÿvkÿvdÿv]ÿvVÿvOÿvHÿvAÿv:ÿv3ÿv,ÿv%ÿvÿvÿvÿv ÿvÿvûþvôþvíþvæþvßþvØþvÑþvÊþvÃþv¼þvµþv®þv§þv þv™þv’þv‹þv„þv}þvvþvoþvhþvaþvZþvSþvLþvEþv>þv7þv0þv)þv"þvþvþv þvþvÿývøývñývêývãývÜývÕývÎývÇývÀýv¹ýv²ýv«ýv¤ývýv–ývývˆývývzývsývlýveýv^ývWývPývIývBýv;ýv4ýv-ýv&ývývývýv ývývüüvõüvîüvçüvàüvÙüvÒüvËüvÄüv½üv¶üv¯üv¨üv¡üvšüv“üvŒüv…üv~üvwüvpüviüvbüv[üvTüvMüvFüv?üv8üv1üv*üv#üvüvüvüvüvüvùûvòûvëûväûvÝûvÖûvÏûvÈûvÁûvºûv³ûv¬ûv¥ûvžûv—ûvûv‰ûv‚ûv{ûvtûvmûvfûv_ûvXûvQûvJûvCûv<ûv5ûv.ûv'ûv ûvûvûv ûvûvýúvöúvïúvèúváúvÚúvÓúvÌúvÅúv¾úv·úv°úv©úv¢úv›úv”úvúv†úvúvxúvqúvjúvcúv\úvUúvNúvGúv@úv9úv2úv+úv$úvúvúvúvúvúvúùvóùvìùvåùvÞùv×ùvÐùvÉùvÂùv»ùv´ùv­ùv¦ùvŸùv˜ùv‘ùvŠùvƒùv|ùvuùvnùvgùv`ùvYùvRùvKùvDùv=ùv6ùv/ùv(ùv!ùvùvùv ùvùvþøv÷øvðøvéøvâøvÛøvÔøvÍøvÆøv¿øv¸øv±øvªøv£øvœøv•øvŽøv‡øv€øvyøvrøvkøvdøv]øvVøvOøvHøvAøv:øv3øv,øv%øvøvøvøv øvøvû÷vô÷ví÷væ÷vß÷vØ÷vÑ÷vÊ÷vÃ÷v¼÷vµ÷v®÷v§÷v ÷v™÷v’÷v‹÷v„÷v}÷vv÷vo÷vh÷va÷vZ÷vS÷vL÷vE÷v>÷v7÷v0÷v)÷v"÷v÷v÷v ÷v÷vÿövøövñövêövãövÜövÕövÎövÇövÀöv¹öv²öv«öv¤övöv–övövˆövövzövsövlöveöv^övWövPövIövBöv;öv4öv-öv&övövövöv övövüõvõõvîõvçõvàõvÙõvÒõvËõvÄõv½õv¶õv¯õv¨õv¡õvšõv“õvŒõv…õv~õvwõvpõviõvbõv[õvTõvMõvFõv?õv8õv1õv*õv#õvõvõvõvõvõvùôvòôvëôväôvÝôvÖôvÏôvÈôvÁôvºôv³ôv¬ôv¥ôvžôv—ôvôv‰ôv‚ôv{ôvtôvmôvfôv_ôvXôvQôvJôvCôv<ôv5ôv.ôv'ôv ôvôvôv ôvôvýóvöóvïóvèóváóvÚóvÓóvÌóvÅóv¾óv·óv°óv©óv¢óv›óv”óvóv†óvóvxóvqóvjóvcóv\óvUóvNóvGóv@óv9óv2óv+óv$óvóvóvóvóvóvúòvóòvìòvåòvÞòv×òvÐòvÉòvÂòv»òv´òv­òv¦òvŸòv˜òv‘òvŠòvƒòv|òvuòvnòvgòv`òvYòvRòvKòvDòv=òv6òv/òv(òv!òvòvòv òvòvþñv÷ñvðñvéñvâñvÛñvÔñvÍñvÆñv¿ñv¸ñv±ñvªñv£ñvœñv•ñvŽñv‡ñv€ñvyñvrñvkñvdñv]ñvVñvOñvHñvAñv:ñv3ñv,ñv%ñvñvñvñv ñvñvûðvôðvíðvæðvßðvØðvÑðvÊðvÃðv¼ðvµðv®ðv§ðv ðv™ðv’ðv‹ðv„ðv}ðvvðvoðvhðvaðvZðvSðvLðvEðv>ðv7ðv0ðv)ðv"ðvðvðv ðvðvÿïvøïvñïvêïvãïvÜïvÕïvÎïvÇïvÀïv¹ïv²ïv«ïv¤ïvïv–ïvïvˆïvïvzïvsïvlïveïv^ïvWïvPïvIïvBïv;ïv4ïv-ïv&ïvïvïvïv ïvïvüîvõîvîîvçîvàîvÙîvÒîvËîvÄîv½îv¶îv¯îv¨îv¡îvšîv“îvŒîv…îv~îvwîvpîviîvbîv[îvTîvMîvFîv?îv8îv1îv*îv#îvîvîvîvîvîvùívòívëíväívÝívÖívÏívÈívÁívºív³ív¬ív¥ívžív—ívív‰ív‚ív{ívtívmívfív_ívXívQívJívCív<ív5ív.ív'ív ívívív ívívýìvöìvïìvèìváìvÚìvÓìvÌìvÅìv¾ìv·ìv°ìv©ìv¢ìv›ìv”ìvìv†ìvìvxìvqìvjìvcìv\ìvUìvNìvGìv@ìv9ìv2ìv+ìv$ìvìvìvìvìvìvúëvóëvìëvåëvÞëv×ëvÐëvÉëvÂëv»ëv´ëv­ëv¦ëvŸëv˜ëv‘ëvŠëvƒëv|ëvuëvnëvgëv`ëvYëvRëvKëvDëv=ëv6ëv/ëv(ëv!ëvëvëv ëvëvþêv÷êvðêvéêvâêvÛêvÔêvÍêvÆêv¿êv¸êv±êvªêv£êvœêv•êvŽêv‡êv€êvyêvrêvkêvdêv]êvVêvOêvHêvAêv:êv3êv,êv%êvêvêvêv êvêvûévôévíévæévßévØévÑévÊévÃév¼évµév®év§év év™év’év‹év„év}évvévoévhévaévZévSévLévEév>év7év0év)év"évévév évévÿèvøèvñèvêèvãèvÜèvÕèvÎèvÇèvÀèv¹èv²èv«èv¤èvèv–èvèvˆèvèvzèvsèvlèveèv^èvWèvPèvIèvBèv;èv4èv-èv&èvèvèvèv èvèvüçvõçvîçvççvàçvÙçvÒçvËçvÄçv½çv¶çv¯çv¨çv¡çvšçv“çvŒçv…çv~çvwçvpçviçvbçv[çvTçvMçvFçv?çv8çv1çv*çv#çvçvçvçvçvçvùævòævëæväævÝævÖævÏævÈævÁævºæv³æv¬æv¥ævžæv—ævæv‰æv‚æv{ævtævmævfæv_ævXævQævJævCæv<æv5æv.æv'æv ævævæv ævævýåvöåvïåvèåváåvÚåvÓåvÌåvÅåv¾åv·åv°åv©åv¢åv›åv”åvåv†åvåvxåvqåvjåvcåv\åvUåvNåvGåv@åv9åv2åv+åv$åvåvåvåvåvåvúävóävìävåävÞäv×ävÐävÉävÂäv»äv´äv­äv¦ävŸäv˜äv‘ävŠävƒäv|ävuävnävgäv`ävYävRävKävDäv=äv6äv/äv(äv!äväväv ävävþãv÷ãvðãvéãvâãvÛãvÔãvÍãvÆãv¿ãv¸ãv±ãvªãv£ãvœãv•ãvŽãv‡ãv€ãvyãvrãvkãvdãv]ãvVãvOãvHãvAãv:ãv3ãv,ãv%ãvãvãvãv ãvãvûâvôâvíâvæâvßâvØâvÑâvÊâvÃâv¼âvµâv®âv§âv âv™âv’âv‹âv„âv}âvvâvoâvhâvaâvZâvSâvLâvEâv>âv7âv0âv)âv"âvâvâv âvâvÿávøávñávêávãávÜávÕávÎávÇávÀáv¹áv²áv«áv¤áváv–ávávˆávávzávsávláveáv^ávWávPávIávBáv;áv4áv-áv&áváváváv ávávüàvõàvîàvçàvààvÙàvÒàvËàvÄàv½àv¶àv¯àv¨àv¡àvšàv“àvŒàv…àv~àvwàvpàviàvbàv[àvTàvMàvFàv?àv8àv1àv*àv#àvàvàvàvàvàvùßvòßvëßväßvÝßvÖßvÏßvÈßvÁßvºßv³ßv¬ßv¥ßvžßv—ßvßv‰ßv‚ßv{ßvtßvmßvfßv_ßvXßvQßvJßvCßv<ßv5ßv.ßv'ßv ßvßvßv ßvßvýÞvöÞvïÞvèÞváÞvÚÞvÓÞvÌÞvÅÞv¾Þv·Þv°Þv©Þv¢Þv›Þv”ÞvÞv†ÞvÞvxÞvqÞvjÞvcÞv\ÞvUÞvNÞvGÞv@Þv9Þv2Þv+Þv$ÞvÞvÞvÞvÞvÞvúÝvóÝvìÝvåÝvÞÝv×ÝvÐÝvÉÝvÂÝv»Ýv´Ýv­Ýv¦ÝvŸÝv˜Ýv‘ÝvŠÝvƒÝv|ÝvuÝvnÝvgÝv`ÝvYÝvRÝvKÝvDÝv=Ýv6Ýv/Ýv(Ýv!ÝvÝvÝv ÝvÝvþÜv÷ÜvðÜvéÜvâÜvÛÜvÔÜvÍÜvÆÜv¿Üv¸Üv±ÜvªÜv£ÜvœÜv•ÜvŽÜv‡Üv€ÜvyÜvrÜvkÜvdÜv]ÜvVÜvOÜvHÜvAÜv:Üv3Üv,Üv%ÜvÜvÜvÜv ÜvÜvûÛvôÛvíÛvæÛvßÛvØÛvÑÛvÊÛvÃÛv¼ÛvµÛv®Ûv§Ûv Ûv™Ûv’Ûv‹Ûv„Ûv}ÛvvÛvoÛvhÛvaÛvZÛvSÛvLÛvEÛv>Ûv7Ûv0Ûv)Ûv"ÛvÛvÛv ÛvÛvÿÚvøÚvñÚvêÚvãÚvÜÚvÕÚvÎÚvÇÚvÀÚv¹Úv²Úv«Úv¤ÚvÚv–ÚvÚvˆÚvÚvzÚvsÚvlÚveÚv^ÚvWÚvPÚvIÚvBÚv;Úv4Úv-Úv&ÚvÚvÚvÚv ÚvÚvüÙvõÙvîÙvçÙvàÙvÙÙvÒÙvËÙvÄÙv½Ùv¶Ùv¯Ùv¨Ùv¡ÙvšÙv“ÙvŒÙv…Ùv~ÙvwÙvpÙviÙvbÙv[ÙvTÙvMÙvFÙv?Ùv8Ùv1Ùv*Ùv#ÙvÙvÙvÙvÙvÙvùØvòØvëØväØvÝØvÖØvÏØvÈØvÁØvºØv³Øv¬Øv¥ØvžØv—ØvØv‰Øv‚Øv{ØvtØvmØvfØv_ØvXØvQØvJØvCØv<Øv5Øv.Øv'Øv ØvØvØv ØvØvý×vö×vï×vè×vá×vÚ×vÓ×vÌ×vÅ×v¾×v·×v°×v©×v¢×v›×v”×v×v†×v×vx×vq×vj×vc×v\×vU×vN×vG×v@×v9×v2×v+×v$×v×v×v×v×v×vúÖvóÖvìÖvåÖvÞÖv×ÖvÐÖvÉÖvÂÖv»Öv´Öv­Öv¦ÖvŸÖv˜Öv‘ÖvŠÖvƒÖv|ÖvuÖvnÖvgÖv`ÖvYÖvRÖvKÖvDÖv=Öv6Öv/Öv(Öv!ÖvÖvÖv ÖvÖvþÕv÷ÕvðÕvéÕvâÕvÛÕvÔÕvÍÕvÆÕv¿Õv¸Õv±ÕvªÕv£ÕvœÕv•ÕvŽÕv‡Õv€ÕvyÕvrÕvkÕvdÕv]ÕvVÕvOÕvHÕvAÕv:Õv3Õv,Õv%ÕvÕvÕvÕv ÕvÕvûÔvôÔvíÔvæÔvßÔvØÔvÑÔvÊÔvÃÔv¼ÔvµÔv®Ôv§Ôv Ôv™Ôv’Ôv‹Ôv„Ôv}ÔvvÔvoÔvhÔvaÔvZÔvSÔvLÔvEÔv>Ôv7Ôv0Ôv)Ôv"ÔvÔvÔv ÔvÔvÿÓvøÓvñÓvêÓvãÓvÜÓvÕÓvÎÓvÇÓvÀÓv¹Óv²Óv«Óv¤ÓvÓv–ÓvÓvˆÓvÓvzÓvsÓvlÓveÓv^ÓvWÓvPÓvIÓvBÓv;Óv4Óv-Óv&ÓvÓvÓvÓv ÓvÓvüÒvõÒvîÒvçÒvàÒvÙÒvÒÒvËÒvÄÒv½Òv¶Òv¯Òv¨Òv¡ÒvšÒv“ÒvŒÒv…Òv~ÒvwÒvpÒviÒvbÒv[ÒvTÒvMÒvFÒv?Òv8Òv1Òv*Òv#ÒvÒvÒvÒvÒvÒvùÑvòÑvëÑväÑvÝÑvÖÑvÏÑvÈÑvÁÑvºÑv³Ñv¬Ñv¥ÑvžÑv—ÑvÑv‰Ñv‚Ñv{ÑvtÑvmÑvfÑv_ÑvXÑvQÑvJÑvCÑv<Ñv5Ñv.Ñv'Ñv ÑvÑvÑv ÑvÑvýÐvöÐvïÐvèÐváÐvÚÐvÓÐvÌÐvÅÐv¾Ðv·Ðv°Ðv©Ðv¢Ðv›Ðv”ÐvÐv†ÐvÐvxÐvqÐvjÐvcÐv\ÐvUÐvNÐvGÐv@Ðv9Ðv2Ðv+Ðv$ÐvÐvÐvÐvÐvÐvúÏvóÏvìÏvåÏvÞÏv×ÏvÐÏvÉÏvÂÏv»Ïv´Ïv­Ïv¦ÏvŸÏv˜Ïv‘ÏvŠÏvƒÏv|ÏvuÏvnÏvgÏv`ÏvYÏvRÏvKÏvDÏv=Ïv6Ïv/Ïv(Ïv!ÏvÏvÏv ÏvÏvþÎv÷ÎvðÎvéÎvâÎvÛÎvÔÎvÍÎvÆÎv¿Îv¸Îv±ÎvªÎv£ÎvœÎv•ÎvŽÎv‡Îv€ÎvyÎvrÎvkÎvdÎv]ÎvVÎvOÎvHÎvAÎv:Îv3Îv,Îv%ÎvÎvÎvÎv ÎvÎvûÍvôÍvíÍvæÍvßÍvØÍvÑÍvÊÍvÃÍv¼ÍvµÍv®Ív§Ív Ív™Ív’Ív‹Ív„Ív}ÍvvÍvoÍvhÍvaÍvZÍvSÍvLÍvEÍv>Ív7Ív0Ív)Ív"ÍvÍvÍv ÍvÍvÿÌvøÌvñÌvêÌvãÌvÜÌvÕÌvÎÌvÇÌvÀÌv¹Ìv²Ìv«Ìv¤ÌvÌv–ÌvÌvˆÌvÌvzÌvsÌvlÌveÌv^ÌvWÌvPÌvIÌvBÌv;Ìv4Ìv-Ìv&ÌvÌvÌvÌv ÌvÌvüËvõËvîËvçËvàËvÙËvÒËvËËvÄËv½Ëv¶Ëv¯Ëv¨Ëv¡ËvšËv“ËvŒËv…Ëv~ËvwËvpËviËvbËv[ËvTËvMËvFËv?Ëv8Ëv1Ëv*Ëv#ËvËvËvËvËvËvùÊvòÊvëÊväÊvÝÊvÖÊvÏÊvÈÊvÁÊvºÊv³Êv¬Êv¥ÊvžÊv—ÊvÊv‰Êv‚Êv{ÊvtÊvmÊvfÊv_ÊvXÊvQÊvJÊvCÊv<Êv5Êv.Êv'Êv ÊvÊvÊv ÊvÊvýÉvöÉvïÉvèÉváÉvÚÉvÓÉvÌÉvÅÉv¾Év·Év°Év©Év¢Év›Év”ÉvÉv†ÉvÉvxÉvqÉvjÉvcÉv\ÉvUÉvNÉvGÉv@Év9Év2Év+Év$ÉvÉvÉvÉvÉvÉvúÈvóÈvìÈvåÈvÞÈv×ÈvÐÈvÉÈvÂÈv»Èv´Èv­Èv¦ÈvŸÈv˜Èv‘ÈvŠÈvƒÈv|ÈvuÈvnÈvgÈv`ÈvYÈvRÈvKÈvDÈv=Èv6Èv/Èv(Èv!ÈvÈvÈv ÈvÈvþÇv÷ÇvðÇvéÇvâÇvÛÇvÔÇvÍÇvÆÇv¿Çv¸Çv±ÇvªÇv£ÇvœÇv•ÇvŽÇv‡Çv€ÇvyÇvrÇvkÇvdÇv]ÇvVÇvOÇvHÇvAÇv:Çv3Çv,Çv%ÇvÇvÇvÇv ÇvÇvûÆvôÆvíÆvæÆv߯vØÆvÑÆvÊÆvÃÆv¼ÆvµÆv®Æv§Æv Æv™Æv’Æv‹Æv„Æv}ÆvvÆvoÆvhÆvaÆvZÆvSÆvLÆvEÆv>Æv7Æv0Æv)Æv"ÆvÆvÆv ÆvÆvÿÅvøÅvñÅvêÅvãÅvÜÅvÕÅvÎÅvÇÅvÀÅv¹Åv²Åv«Åv¤ÅvÅv–ÅvÅvˆÅvÅvzÅvsÅvlÅveÅv^ÅvWÅvPÅvIÅvBÅv;Åv4Åv-Åv&ÅvÅvÅvÅv ÅvÅvüÄvõÄvîÄvçÄvàÄvÙÄvÒÄvËÄvÄÄv½Äv¶Äv¯Äv¨Äv¡ÄvšÄv“ÄvŒÄv…Äv~ÄvwÄvpÄviÄvbÄv[ÄvTÄvMÄvFÄv?Äv8Äv1Äv*Äv#ÄvÄvÄvÄvÄvÄvùÃvòÃvëÃväÃvÝÃvÖÃvÏÃvÈÃvÁÃvºÃv³Ãv¬Ãv¥ÃvžÃv—ÃvÃv‰Ãv‚Ãv{ÃvtÃvmÃvfÃv_ÃvXÃvQÃvJÃvCÃv<Ãv5Ãv.Ãv'Ãv ÃvÃvÃv ÃvÃvýÂvöÂvïÂvèÂváÂvÚÂvÓÂvÌÂvÅÂv¾Âv·Âv°Âv©Âv¢Âv›Âv”ÂvÂv†ÂvÂvxÂvqÂvjÂvcÂv\ÂvUÂvNÂvGÂv@Âv9Âv2Âv+Âv$ÂvÂvÂvÂvÂvÂvúÁvóÁvìÁvåÁvÞÁv×ÁvÐÁvÉÁvÂÁv»Áv´Áv­Áv¦ÁvŸÁv˜Áv‘ÁvŠÁvƒÁv|ÁvuÁvnÁvgÁv`ÁvYÁvRÁvKÁvDÁv=Áv6Áv/Áv(Áv!ÁvÁvÁv ÁvÁvþÀv÷ÀvðÀvéÀvâÀvÛÀvÔÀvÍÀvÆÀv¿Àv¸Àv±ÀvªÀv£ÀvœÀv•ÀvŽÀv‡Àv€ÀvyÀvrÀvkÀvdÀv]ÀvVÀvOÀvHÀvAÀv:Àv3Àv,Àv%ÀvÀvÀvÀv ÀvÀvû¿vô¿ví¿væ¿vß¿vØ¿vÑ¿vÊ¿vÿv¼¿vµ¿v®¿v§¿v ¿v™¿v’¿v‹¿v„¿v}¿vv¿vo¿vh¿va¿vZ¿vS¿vL¿vE¿v>¿v7¿v0¿v)¿v"¿v¿v¿v ¿v¿vÿ¾vø¾vñ¾vê¾vã¾vܾvÕ¾vξvǾvÀ¾v¹¾v²¾v«¾v¤¾v¾v–¾v¾vˆ¾v¾vz¾vs¾vl¾ve¾v^¾vW¾vP¾vI¾vB¾v;¾v4¾v-¾v&¾v¾v¾v¾v ¾v¾vü½võ½vî½vç½và½vÙ½vÒ½v˽vĽv½½v¶½v¯½v¨½v¡½vš½v“½vŒ½v…½v~½vw½vp½vi½vb½v[½vT½vM½vF½v?½v8½v1½v*½v#½v½v½v½v½v½vù¼vò¼vë¼vä¼vݼvÖ¼vϼvȼvÁ¼vº¼v³¼v¬¼v¥¼vž¼v—¼v¼v‰¼v‚¼v{¼vt¼vm¼vf¼v_¼vX¼vQ¼vJ¼vC¼v<¼v5¼v.¼v'¼v ¼v¼v¼v ¼v¼vý»vö»vï»vè»vá»vÚ»vÓ»vÌ»vÅ»v¾»v·»v°»v©»v¢»v›»v”»v»v†»v»vx»vq»vj»vc»v\»vU»vN»vG»v@»v9»v2»v+»v$»v»v»v»v»v»vúºvóºvìºvåºvÞºv׺vкvɺvºv»ºv´ºv­ºv¦ºvŸºv˜ºv‘ºvŠºvƒºv|ºvuºvnºvgºv`ºvYºvRºvKºvDºv=ºv6ºv/ºv(ºv!ºvºvºv ºvºvþ¹v÷¹vð¹vé¹vâ¹vÛ¹vÔ¹v͹vƹv¿¹v¸¹v±¹vª¹v£¹vœ¹v•¹v޹v‡¹v€¹vy¹vr¹vk¹vd¹v]¹vV¹vO¹vH¹vA¹v:¹v3¹v,¹v%¹v¹v¹v¹v ¹v¹vû¸vô¸ví¸væ¸v߸vظvѸvʸvøv¼¸vµ¸v®¸v§¸v ¸v™¸v’¸v‹¸v„¸v}¸vv¸vo¸vh¸va¸vZ¸vS¸vL¸vE¸v>¸v7¸v0¸v)¸v"¸v¸v¸v ¸v¸vÿ·vø·vñ·vê·vã·vÜ·vÕ·vηvÇ·vÀ·v¹·v²·v«·v¤·v·v–·v·vˆ·v·vz·vs·vl·ve·v^·vW·vP·vI·vB·v;·v4·v-·v&·v·v·v·v ·v·vü¶võ¶vî¶vç¶và¶vÙ¶vÒ¶v˶vĶv½¶v¶¶v¯¶v¨¶v¡¶vš¶v“¶vŒ¶v…¶v~¶vw¶vp¶vi¶vb¶v[¶vT¶vM¶vF¶v?¶v8¶v1¶v*¶v#¶v¶v¶v¶v¶v¶vùµvòµvëµväµvݵvÖµvϵvȵvÁµvºµv³µv¬µv¥µvžµv—µvµv‰µv‚µv{µvtµvmµvfµv_µvXµvQµvJµvCµv<µv5µv.µv'µv µvµvµv µvµvý´vö´vï´vè´vá´vÚ´vÓ´vÌ´vÅ´v¾´v·´v°´v©´v¢´v›´v”´v´v†´v´vx´vq´vj´vc´v\´vU´vN´vG´v@´v9´v2´v+´v$´v´v´v´v´v´vú³vó³vì³vå³vÞ³v׳vгvɳv³v»³v´³v­³v¦³vŸ³v˜³v‘³vгvƒ³v|³vu³vn³vg³v`³vY³vR³vK³vD³v=³v6³v/³v(³v!³v³v³v ³v³vþ²v÷²vð²vé²vâ²vÛ²vÔ²vͲvƲv¿²v¸²v±²vª²v£²vœ²v•²v޲v‡²v€²vy²vr²vk²vd²v]²vV²vO²vH²vA²v:²v3²v,²v%²v²v²v²v ²v²vû±vô±ví±væ±vß±vرvѱvʱvñv¼±vµ±v®±v§±v ±v™±v’±v‹±v„±v}±vv±vo±vh±va±vZ±vS±vL±vE±v>±v7±v0±v)±v"±v±v±v ±v±vÿ°vø°vñ°vê°vã°vܰvÕ°vΰvǰvÀ°v¹°v²°v«°v¤°v°v–°v°vˆ°v°vz°vs°vl°ve°v^°vW°vP°vI°vB°v;°v4°v-°v&°v°v°v°v °v°vü¯võ¯vî¯vç¯và¯vÙ¯vÒ¯v˯vįv½¯v¶¯v¯¯v¨¯v¡¯vš¯v“¯vŒ¯v…¯v~¯vw¯vp¯vi¯vb¯v[¯vT¯vM¯vF¯v?¯v8¯v1¯v*¯v#¯v¯v¯v¯v¯v¯vù®vò®vë®vä®vÝ®vÖ®vÏ®vÈ®vÁ®vº®v³®v¬®v¥®vž®v—®v®v‰®v‚®v{®vt®vm®vf®v_®vX®vQ®vJ®vC®v<®v5®v.®v'®v ®v®v®v ®v®vý­vö­vï­vè­vá­vÚ­vÓ­vÌ­vÅ­v¾­v·­v°­v©­v¢­v›­v”­v­v†­v­vx­vq­vj­vc­v\­vU­vN­vG­v@­v9­v2­v+­v$­v­v­v­v­v­vú¬vó¬vì¬vå¬vÞ¬v׬vЬvɬv¬v»¬v´¬v­¬v¦¬vŸ¬v˜¬v‘¬vЬvƒ¬v|¬vu¬vn¬vg¬v`¬vY¬vR¬vK¬vD¬v=¬v6¬v/¬v(¬v!¬v¬v¬v ¬v¬vþ«v÷«vð«vé«vâ«vÛ«vÔ«vÍ«vÆ«v¿«v¸«v±«vª«v£«vœ«v•«vŽ«v‡«v€«vy«vr«vk«vd«v]«vV«vO«vH«vA«v:«v3«v,«v%«v«v«v«v «v«vûªvôªvíªvæªvߪvتvѪvʪvêv¼ªvµªv®ªv§ªv ªv™ªv’ªv‹ªv„ªv}ªvvªvoªvhªvaªvZªvSªvLªvEªv>ªv7ªv0ªv)ªv"ªvªvªv ªvªvÿ©vø©vñ©vê©vã©vÜ©vÕ©vΩvÇ©vÀ©v¹©v²©v«©v¤©v©v–©v©vˆ©v©vz©vs©vl©ve©v^©vW©vP©vI©vB©v;©v4©v-©v&©v©v©v©v ©v©vü¨võ¨vî¨vç¨và¨vÙ¨vÒ¨v˨vĨv½¨v¶¨v¯¨v¨¨v¡¨vš¨v“¨vŒ¨v…¨v~¨vw¨vp¨vi¨vb¨v[¨vT¨vM¨vF¨v?¨v8¨v1¨v*¨v#¨v¨v¨v¨v¨v¨vù§vò§vë§vä§vݧvÖ§vϧvȧvÁ§vº§v³§v¬§v¥§vž§v—§v§v‰§v‚§v{§vt§vm§vf§v_§vX§vQ§vJ§vC§v<§v5§v.§v'§v §v§v§v §v§vý¦vö¦vï¦vè¦vá¦vÚ¦vÓ¦v̦vŦv¾¦v·¦v°¦v©¦v¢¦v›¦v”¦v¦v†¦v¦vx¦vq¦vj¦vc¦v\¦vU¦vN¦vG¦v@¦v9¦v2¦v+¦v$¦v¦v¦v¦v¦v¦vú¥vó¥vì¥vå¥vÞ¥v×¥vÐ¥vÉ¥vÂ¥v»¥v´¥v­¥v¦¥vŸ¥v˜¥v‘¥vŠ¥vƒ¥v|¥vu¥vn¥vg¥v`¥vY¥vR¥vK¥vD¥v=¥v6¥v/¥v(¥v!¥v¥v¥v ¥v¥vþ¤v÷¤vð¤vé¤vâ¤vÛ¤vÔ¤vͤvƤv¿¤v¸¤v±¤vª¤v£¤vœ¤v•¤vޤv‡¤v€¤vy¤vr¤vk¤vd¤v]¤vV¤vO¤vH¤vA¤v:¤v3¤v,¤v%¤v¤v¤v¤v ¤v¤vû£vô£ví£væ£vߣvØ£vÑ£vÊ£vãv¼£vµ£v®£v§£v £v™£v’£v‹£v„£v}£vv£vo£vh£va£vZ£vS£vL£vE£v>£v7£v0£v)£v"£v£v£v £v£vÿ¢vø¢vñ¢vê¢vã¢vÜ¢vÕ¢v΢vÇ¢vÀ¢v¹¢v²¢v«¢v¤¢v¢v–¢v¢vˆ¢v¢vz¢vs¢vl¢ve¢v^¢vW¢vP¢vI¢vB¢v;¢v4¢v-¢v&¢v¢v¢v¢v ¢v¢vü¡võ¡vî¡vç¡và¡vÙ¡vÒ¡vË¡vÄ¡v½¡v¶¡v¯¡v¨¡v¡¡vš¡v“¡vŒ¡v…¡v~¡vw¡vp¡vi¡vb¡v[¡vT¡vM¡vF¡v?¡v8¡v1¡v*¡v#¡v¡v¡v¡v¡v¡vù vò vë vä vÝ vÖ vÏ vÈ vÁ vº v³ v¬ v¥ vž v— v v‰ v‚ v{ vt vm vf v_ vX vQ vJ vC v< v5 v. v' v  v v v  v výŸvöŸvïŸvèŸváŸvÚŸvÓŸvÌŸvÅŸv¾Ÿv·Ÿv°Ÿv©Ÿv¢Ÿv›Ÿv”ŸvŸv†ŸvŸvxŸvqŸvjŸvcŸv\ŸvUŸvNŸvGŸv@Ÿv9Ÿv2Ÿv+Ÿv$ŸvŸvŸvŸvŸvŸvúžvóžvìžvåžvÞžvמvОvÉžvžv»žv´žv­žv¦žvŸžv˜žv‘žvŠžvƒžv|žvužvnžvgžv`žvYžvRžvKžvDžv=žv6žv/žv(žv!žvžvžv žvžvþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûœvôœvíœvæœvßœvØœvÑœvÊœvÜv¼œvµœv®œv§œv œv™œv’œv‹œv„œv}œvvœvoœvhœvaœvZœvSœvLœvEœv>œv7œv0œv)œv"œvœvœv œvœvÿ›vø›vñ›vê›vã›vÜ›vÕ›vΛvÇ›vÀ›v¹›v²›v«›v¤›v›v–›v›vˆ›v›vz›vs›vl›ve›v^›vW›vP›vI›vB›v;›v4›v-›v&›v›v›v›v ›v›vüšvõšvîšvçšvàšvÙšvÒšvËšvÄšv½šv¶šv¯šv¨šv¡švššv“švŒšv…šv~švwšvpšvišvbšv[švTšvMšvFšv?šv8šv1šv*šv#švšvšvšvšvšvù™vò™vë™vä™vÝ™vÖ™vÏ™vÈ™vÁ™vº™v³™v¬™v¥™vž™v—™v™v‰™v‚™v{™vt™vm™vf™v_™vX™vQ™vJ™vC™v<™v5™v.™v'™v ™v™v™v ™v™vý˜vö˜vï˜vè˜vá˜vÚ˜vÓ˜v̘vŘv¾˜v·˜v°˜v©˜v¢˜v›˜v”˜v˜v†˜v˜vx˜vq˜vj˜vc˜v\˜vU˜vN˜vG˜v@˜v9˜v2˜v+˜v$˜v˜v˜v˜v˜v˜vú—vó—vì—vå—vÞ—v×—vЗvÉ—v—v»—v´—v­—v¦—vŸ—v˜—v‘—vŠ—vƒ—v|—vu—vn—vg—v`—vY—vR—vK—vD—v=—v6—v/—v(—v!—v—v—v —v—vþ–v÷–vð–vé–vâ–vÛ–vÔ–vÍ–vÆ–v¿–v¸–v±–vª–v£–vœ–v•–vŽ–v‡–v€–vy–vr–vk–vd–v]–vV–vO–vH–vA–v:–v3–v,–v%–v–v–v–v –v–vû•vô•ví•væ•vß•vØ•vÑ•vÊ•vÕv¼•vµ•v®•v§•v •v™•v’•v‹•v„•v}•vv•vo•vh•va•vZ•vS•vL•vE•v>•v7•v0•v)•v"•v•v•v •v•vÿ”vø”vñ”vê”vã”vÜ”vÕ”vΔvÇ”vÀ”v¹”v²”v«”v¤”v”v–”v”vˆ”v”vz”vs”vl”ve”v^”vW”vP”vI”vB”v;”v4”v-”v&”v”v”v”v ”v”vü“võ“vî“vç“và“vÙ“vÒ“vË“vÄ“v½“v¶“v¯“v¨“v¡“vš“v““vŒ“v…“v~“vw“vp“vi“vb“v[“vT“vM“vF“v?“v8“v1“v*“v#“v“v“v“v“v“vù’vò’vë’vä’vÝ’vÖ’vÏ’vÈ’vÁ’vº’v³’v¬’v¥’vž’v—’v’v‰’v‚’v{’vt’vm’vf’v_’vX’vQ’vJ’vC’v<’v5’v.’v'’v ’v’v’v ’v’vý‘vö‘vï‘vè‘vá‘vÚ‘vÓ‘vÌ‘vÅ‘v¾‘v·‘v°‘v©‘v¢‘v›‘v”‘v‘v†‘v‘vx‘vq‘vj‘vc‘v\‘vU‘vN‘vG‘v@‘v9‘v2‘v+‘v$‘v‘v‘v‘v‘v‘vúvóvìvåvÞv×vÐvÉvÂv»v´v­v¦vŸv˜v‘vŠvƒv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûŽvôŽvíŽvæŽvߎvØŽvÑŽvÊŽvÃŽv¼ŽvµŽv®Žv§Žv Žv™Žv’Žv‹Žv„Žv}ŽvvŽvoŽvhŽvaŽvZŽvSŽvLŽvEŽv>Žv7Žv0Žv)Žv"ŽvŽvŽv ŽvŽvÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüŒvõŒvîŒvçŒvàŒvÙŒvÒŒvËŒvÄŒv½Œv¶Œv¯Œv¨Œv¡ŒvšŒv“ŒvŒŒv…Œv~ŒvwŒvpŒviŒvbŒv[ŒvTŒvMŒvFŒv?Œv8Œv1Œv*Œv#ŒvŒvŒvŒvŒvŒvù‹vò‹vë‹vä‹vÝ‹vÖ‹vÏ‹vÈ‹vÁ‹vº‹v³‹v¬‹v¥‹vž‹v—‹v‹v‰‹v‚‹v{‹vt‹vm‹vf‹v_‹vX‹vQ‹vJ‹vC‹v<‹v5‹v.‹v'‹v ‹v‹v‹v ‹v‹výŠvöŠvïŠvèŠváŠvÚŠvÓŠvÌŠvÅŠv¾Šv·Šv°Šv©Šv¢Šv›Šv”ŠvŠv†ŠvŠvxŠvqŠvjŠvcŠv\ŠvUŠvNŠvGŠv@Šv9Šv2Šv+Šv$ŠvŠvŠvŠvŠvŠvú‰vó‰vì‰vå‰vÞ‰v׉vЉvɉv‰v»‰v´‰v­‰v¦‰vŸ‰v˜‰v‘‰vЉvƒ‰v|‰vu‰vn‰vg‰v`‰vY‰vR‰vK‰vD‰v=‰v6‰v/‰v(‰v!‰v‰v‰v ‰v‰vþˆv÷ˆvðˆvéˆvâˆvÛˆvÔˆv͈vƈv¿ˆv¸ˆv±ˆvªˆv£ˆvœˆv•ˆvŽˆv‡ˆv€ˆvyˆvrˆvkˆvdˆv]ˆvVˆvOˆvHˆvAˆv:ˆv3ˆv,ˆv%ˆvˆvˆvˆv ˆvˆvû‡vô‡ví‡væ‡v߇v؇vчvʇvÇv¼‡vµ‡v®‡v§‡v ‡v™‡v’‡v‹‡v„‡v}‡vv‡vo‡vh‡va‡vZ‡vS‡vL‡vE‡v>‡v7‡v0‡v)‡v"‡v‡v‡v ‡v‡vÿ†vø†vñ†vê†vã†v܆vÕ†vΆvdžvÀ†v¹†v²†v«†v¤†v†v–†v†vˆ†v†vz†vs†vl†ve†v^†vW†vP†vI†vB†v;†v4†v-†v&†v†v†v†v †v†vü…võ…vî…vç…và…vÙ…vÒ…vË…vÄ…v½…v¶…v¯…v¨…v¡…vš…v“…vŒ…v……v~…vw…vp…vi…vb…v[…vT…vM…vF…v?…v8…v1…v*…v#…v…v…v…v…v…vù„vò„vë„vä„vÝ„vÖ„vÏ„vÈ„vÁ„vº„v³„v¬„v¥„vž„v—„v„v‰„v‚„v{„vt„vm„vf„v_„vX„vQ„vJ„vC„v<„v5„v.„v'„v „v„v„v „v„výƒvöƒvïƒvèƒváƒvÚƒvÓƒṽvŃv¾ƒv·ƒv°ƒv©ƒv¢ƒv›ƒv”ƒvƒv†ƒvƒvxƒvqƒvjƒvcƒv\ƒvUƒvNƒvGƒv@ƒv9ƒv2ƒv+ƒv$ƒvƒvƒvƒvƒvƒvú‚vó‚vì‚vå‚vÞ‚vׂvЂvÉ‚v‚v»‚v´‚v­‚v¦‚vŸ‚v˜‚v‘‚vŠ‚vƒ‚v|‚vu‚vn‚vg‚v`‚vY‚vR‚vK‚vD‚v=‚v6‚v/‚v(‚v!‚v‚v‚v ‚v‚vþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvû€vô€ví€væ€v߀vØ€vÑ€vÊ€vÀv¼€vµ€v®€v§€v €v™€v’€v‹€v„€v}€vv€vo€vh€va€vZ€vS€vL€vE€v>€v7€v0€v)€v"€v€v€v €v€vÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvü~võ~vî~vç~và~vÙ~vÒ~vË~vÄ~v½~v¶~v¯~v¨~v¡~vš~v“~vŒ~v…~v~~vw~vp~vi~vb~v[~vT~vM~vF~v?~v8~v1~v*~v#~v~v~v~v~v~vù}vò}vë}vä}vÝ}vÖ}vÏ}vÈ}vÁ}vº}v³}v¬}v¥}vž}v—}v}v‰}v‚}v{}vt}vm}vf}v_}vX}vQ}vJ}vC}v<}v5}v.}v'}v }v}v}v }v}vý|vö|vï|vè|vá|vÚ|vÓ|vÌ|vÅ|v¾|v·|v°|v©|v¢|v›|v”|v|v†|v|vx|vq|vj|vc|v\|vU|vN|vG|v@|v9|v2|v+|v$|v|v|v|v|v|vú{vó{vì{vå{vÞ{v×{vÐ{vÉ{vÂ{v»{v´{v­{v¦{vŸ{v˜{v‘{vŠ{vƒ{v|{vu{vn{vg{v`{vY{vR{vK{vD{v={v6{v/{v({v!{v{v{v {v{vþzv÷zvðzvézvâzvÛzvÔzvÍzvÆzv¿zv¸zv±zvªzv£zvœzv•zvŽzv‡zv€zvyzvrzvkzvdzv]zvVzvOzvHzvAzv:zv3zv,zv%zvzvzvzv zvzvûyvôyvíyvæyvßyvØyvÑyvÊyvÃyv¼yvµyv®yv§yv yv™yv’yv‹yv„yv}yvvyvoyvhyvayvZyvSyvLyvEyv>yv7yv0yv)yv"yvyvyv yvyvÿxvøxvñxvêxvãxvÜxvÕxvÎxvÇxvÀxv¹xv²xv«xv¤xvxv–xvxvˆxvxvzxvsxvlxvexv^xvWxvPxvIxvBxv;xv4xv-xv&xvxvxvxv xvxvüwvõwvîwvçwvàwvÙwvÒwvËwvÄwv½wv¶wv¯wv¨wv¡wvšwv“wvŒwv…wv~wvwwvpwviwvbwv[wvTwvMwvFwv?wv8wv1wv*wv#wvwvwvwvwvwvùvvòvvëvvävvÝvvÖvvÏvvÈvvÁvvºvv³vv¬vv¥vvžvv—vvvv‰vv‚vv{vvtvvmvvfvv_vvXvvQvvJvvCvvrv7rv0rv)rv"rvrvrv rvrvÿqvøqvñqvêqvãqvÜqvÕqvÎqvÇqvÀqv¹qv²qv«qv¤qvqv–qvqvˆqvqvzqvsqvlqveqv^qvWqvPqvIqvBqv;qv4qv-qv&qvqvqvqv qvqvüpvõpvîpvçpvàpvÙpvÒpvËpvÄpv½pv¶pv¯pv¨pv¡pvšpv“pvŒpv…pv~pvwpvppvipvbpv[pvTpvMpvFpv?pv8pv1pv*pv#pvpvpvpvpvpvùovòovëoväovÝovÖovÏovÈovÁovºov³ov¬ov¥ovžov—ovov‰ov‚ov{ovtovmovfov_ovXovQovJovCovkv7kv0kv)kv"kvkvkv kvkvÿjvøjvñjvêjvãjvÜjvÕjvÎjvÇjvÀjv¹jv²jv«jv¤jvjv–jvjvˆjvjvzjvsjvljvejv^jvWjvPjvIjvBjv;jv4jv-jv&jvjvjvjv jvjvüivõivîivçivàivÙivÒivËivÄiv½iv¶iv¯iv¨iv¡ivšiv“ivŒiv…iv~ivwivpiviivbiv[ivTivMivFiv?iv8iv1iv*iv#ivivivivivivùhvòhvëhvähvÝhvÖhvÏhvÈhvÁhvºhv³hv¬hv¥hvžhv—hvhv‰hv‚hv{hvthvmhvfhv_hvXhvQhvJhvChvdv7dv0dv)dv"dvdvdv dvdvÿcvøcvñcvêcvãcvÜcvÕcvÎcvÇcvÀcv¹cv²cv«cv¤cvcv–cvcvˆcvcvzcvscvlcvecv^cvWcvPcvIcvBcv;cv4cv-cv&cvcvcvcv cvcvübvõbvîbvçbvàbvÙbvÒbvËbvÄbv½bv¶bv¯bv¨bv¡bvšbv“bvŒbv…bv~bvwbvpbvibvbbv[bvTbvMbvFbv?bv8bv1bv*bv#bvbvbvbvbvbvùavòavëaväavÝavÖavÏavÈavÁavºav³av¬av¥avžav—avav‰av‚av{avtavmavfav_avXavQavJavCav]v7]v0]v)]v"]v]v]v ]v]vÿ\vø\vñ\vê\vã\vÜ\vÕ\vÎ\vÇ\vÀ\v¹\v²\v«\v¤\v\v–\v\vˆ\v\vz\vs\vl\ve\v^\vW\vP\vI\vB\v;\v4\v-\v&\v\v\v\v \v\vü[võ[vî[vç[và[vÙ[vÒ[vË[vÄ[v½[v¶[v¯[v¨[v¡[vš[v“[vŒ[v…[v~[vw[vp[vi[vb[v[[vT[vM[vF[v?[v8[v1[v*[v#[v[v[v[v[v[vùZvòZvëZväZvÝZvÖZvÏZvÈZvÁZvºZv³Zv¬Zv¥ZvžZv—ZvZv‰Zv‚Zv{ZvtZvmZvfZv_ZvXZvQZvJZvCZvVv7Vv0Vv)Vv"VvVvVv VvVvÿUvøUvñUvêUvãUvÜUvÕUvÎUvÇUvÀUv¹Uv²Uv«Uv¤UvUv–UvUvˆUvUvzUvsUvlUveUv^UvWUvPUvIUvBUv;Uv4Uv-Uv&UvUvUvUv UvUvüTvõTvîTvçTvàTvÙTvÒTvËTvÄTv½Tv¶Tv¯Tv¨Tv¡TvšTv“TvŒTv…Tv~TvwTvpTviTvbTv[TvTTvMTvFTv?Tv8Tv1Tv*Tv#TvTvTvTvTvTvùSvòSvëSväSvÝSvÖSvÏSvÈSvÁSvºSv³Sv¬Sv¥SvžSv—SvSv‰Sv‚Sv{SvtSvmSvfSv_SvXSvQSvJSvCSvOv7Ov0Ov)Ov"OvOvOv OvOvÿNvøNvñNvêNvãNvÜNvÕNvÎNvÇNvÀNv¹Nv²Nv«Nv¤NvNv–NvNvˆNvNvzNvsNvlNveNv^NvWNvPNvINvBNv;Nv4Nv-Nv&NvNvNvNv NvNvüMvõMvîMvçMvàMvÙMvÒMvËMvÄMv½Mv¶Mv¯Mv¨Mv¡MvšMv“MvŒMv…Mv~MvwMvpMviMvbMv[MvTMvMMvFMv?Mv8Mv1Mv*Mv#MvMvMvMvMvMvùLvòLvëLväLvÝLvÖLvÏLvÈLvÁLvºLv³Lv¬Lv¥LvžLv—LvLv‰Lv‚Lv{LvtLvmLvfLv_LvXLvQLvJLvCLvHv7Hv0Hv)Hv"HvHvHv HvHvÿGvøGvñGvêGvãGvÜGvÕGvÎGvÇGvÀGv¹Gv²Gv«Gv¤GvGv–GvGvˆGvGvzGvsGvlGveGv^GvWGvPGvIGvBGv;Gv4Gv-Gv&GvGvGvGv GvGvüFvõFvîFvçFvàFvÙFvÒFvËFvÄFv½Fv¶Fv¯Fv¨Fv¡FvšFv“FvŒFv…Fv~FvwFvpFviFvbFv[FvTFvMFvFFv?Fv8Fv1Fv*Fv#FvFvFvFvFvFvùEvòEvëEväEvÝEvÖEvÏEvÈEvÁEvºEv³Ev¬Ev¥EvžEv—EvEv‰Ev‚Ev{EvtEvmEvfEv_EvXEvQEvJEvCEvAv7Av0Av)Av"AvAvAv AvAvÿ@vø@vñ@vê@vã@vÜ@vÕ@vÎ@vÇ@vÀ@v¹@v²@v«@v¤@v@v–@v@vˆ@v@vz@vs@vl@ve@v^@vW@vP@vI@vB@v;@v4@v-@v&@v@v@v@v @v@vü?võ?vî?vç?và?vÙ?vÒ?vË?vÄ?v½?v¶?v¯?v¨?v¡?vš?v“?vŒ?v…?v~?vw?vp?vi?vb?v[?vT?vM?vF?v??v8?v1?v*?v#?v?v?v?v?v?vù>vò>vë>vä>vÝ>vÖ>vÏ>vÈ>vÁ>vº>v³>v¬>v¥>vž>v—>v>v‰>v‚>v{>vt>vm>vf>v_>vX>vQ>vJ>vC>v<>v5>v.>v'>v >v>v>v >v>vý=vö=vï=vè=vá=vÚ=vÓ=vÌ=vÅ=v¾=v·=v°=v©=v¢=v›=v”=v=v†=v=vx=vq=vj=vc=v\=vU=vN=vG=v@=v9=v2=v+=v$=v=v=v=v=v=vú:v7:v0:v):v":v:v:v :v:vÿ9vø9vñ9vê9vã9vÜ9vÕ9vÎ9vÇ9vÀ9v¹9v²9v«9v¤9v9v–9v9vˆ9v9vz9vs9vl9ve9v^9vW9vP9vI9vB9v;9v49v-9v&9v9v9v9v 9v9vü8võ8vî8vç8và8vÙ8vÒ8vË8vÄ8v½8v¶8v¯8v¨8v¡8vš8v“8vŒ8v…8v~8vw8vp8vi8vb8v[8vT8vM8vF8v?8v88v18v*8v#8v8v8v8v8v8vù7vò7vë7vä7vÝ7vÖ7vÏ7vÈ7vÁ7vº7v³7v¬7v¥7vž7v—7v7v‰7v‚7v{7vt7vm7vf7v_7vX7vQ7vJ7vC7v<7v57v.7v'7v 7v7v7v 7v7vý6vö6vï6vè6vá6vÚ6vÓ6vÌ6vÅ6v¾6v·6v°6v©6v¢6v›6v”6v6v†6v6vx6vq6vj6vc6v\6vU6vN6vG6v@6v96v26v+6v$6v6v6v6v6v6vú5vó5vì5vå5vÞ5v×5vÐ5vÉ5vÂ5v»5v´5v­5v¦5vŸ5v˜5v‘5vŠ5vƒ5v|5vu5vn5vg5v`5vY5vR5vK5vD5v=5v65v/5v(5v!5v5v5v 5v5vþ4v÷4vð4vé4vâ4vÛ4vÔ4vÍ4vÆ4v¿4v¸4v±4vª4v£4vœ4v•4vŽ4v‡4v€4vy4vr4vk4vd4v]4vV4vO4vH4vA4v:4v34v,4v%4v4v4v4v 4v4vû3vô3ví3væ3vß3vØ3vÑ3vÊ3vÃ3v¼3vµ3v®3v§3v 3v™3v’3v‹3v„3v}3vv3vo3vh3va3vZ3vS3vL3vE3v>3v73v03v)3v"3v3v3v 3v3vÿ2vø2vñ2vê2vã2vÜ2vÕ2vÎ2vÇ2vÀ2v¹2v²2v«2v¤2v2v–2v2vˆ2v2vz2vs2vl2ve2v^2vW2vP2vI2vB2v;2v42v-2v&2v2v2v2v 2v2vü1võ1vî1vç1và1vÙ1vÒ1vË1vÄ1v½1v¶1v¯1v¨1v¡1vš1v“1vŒ1v…1v~1vw1vp1vi1vb1v[1vT1vM1vF1v?1v81v11v*1v#1v1v1v1v1v1vù0vò0vë0vä0vÝ0vÖ0vÏ0vÈ0vÁ0vº0v³0v¬0v¥0vž0v—0v0v‰0v‚0v{0vt0vm0vf0v_0vX0vQ0vJ0vC0v<0v50v.0v'0v 0v0v0v 0v0vý/vö/vï/vè/vá/vÚ/vÓ/vÌ/vÅ/v¾/v·/v°/v©/v¢/v›/v”/v/v†/v/vx/vq/vj/vc/v\/vU/vN/vG/v@/v9/v2/v+/v$/v/v/v/v/v/vú.vó.vì.vå.vÞ.v×.vÐ.vÉ.vÂ.v».v´.v­.v¦.vŸ.v˜.v‘.vŠ.vƒ.v|.vu.vn.vg.v`.vY.vR.vK.vD.v=.v6.v/.v(.v!.v.v.v .v.vþ-v÷-vð-vé-vâ-vÛ-vÔ-vÍ-vÆ-v¿-v¸-v±-vª-v£-vœ-v•-vŽ-v‡-v€-vy-vr-vk-vd-v]-vV-vO-vH-vA-v:-v3-v,-v%-v-v-v-v -v-vû,vô,ví,væ,vß,vØ,vÑ,vÊ,vÃ,v¼,vµ,v®,v§,v ,v™,v’,v‹,v„,v},vv,vo,vh,va,vZ,vS,vL,vE,v>,v7,v0,v),v",v,v,v ,v,vÿ+vø+vñ+vê+vã+vÜ+vÕ+vÎ+vÇ+vÀ+v¹+v²+v«+v¤+v+v–+v+vˆ+v+vz+vs+vl+ve+v^+vW+vP+vI+vB+v;+v4+v-+v&+v+v+v+v +v+vü*võ*vî*vç*và*vÙ*vÒ*vË*vÄ*v½*v¶*v¯*v¨*v¡*vš*v“*vŒ*v…*v~*vw*vp*vi*vb*v[*vT*vM*vF*v?*v8*v1*v**v#*v*v*v*v*v*vù)vò)vë)vä)vÝ)vÖ)vÏ)vÈ)vÁ)vº)v³)v¬)v¥)vž)v—)v)v‰)v‚)v{)vt)vm)vf)v_)vX)vQ)vJ)vC)v<)v5)v.)v')v )v)v)v )v)vý(vö(vï(vè(vá(vÚ(vÓ(vÌ(vÅ(v¾(v·(v°(v©(v¢(v›(v”(v(v†(v(vx(vq(vj(vc(v\(vU(vN(vG(v@(v9(v2(v+(v$(v(v(v(v(v(vú'vó'vì'vå'vÞ'v×'vÐ'vÉ'vÂ'v»'v´'v­'v¦'vŸ'v˜'v‘'vŠ'vƒ'v|'vu'vn'vg'v`'vY'vR'vK'vD'v='v6'v/'v('v!'v'v'v 'v'vþ&v÷&vð&vé&vâ&vÛ&vÔ&vÍ&vÆ&v¿&v¸&v±&vª&v£&vœ&v•&vŽ&v‡&v€&vy&vr&vk&vd&v]&vV&vO&vH&vA&v:&v3&v,&v%&v&v&v&v &v&vû%vô%ví%væ%vß%vØ%vÑ%vÊ%vÃ%v¼%vµ%v®%v§%v %v™%v’%v‹%v„%v}%vv%vo%vh%va%vZ%vS%vL%vE%v>%v7%v0%v)%v"%v%v%v %v%vÿ$vø$vñ$vê$vã$vÜ$vÕ$vÎ$vÇ$vÀ$v¹$v²$v«$v¤$v$v–$v$vˆ$v$vz$vs$vl$ve$v^$vW$vP$vI$vB$v;$v4$v-$v&$v$v$v$v $v$vü#võ#vî#vç#và#vÙ#vÒ#vË#vÄ#v½#v¶#v¯#v¨#v¡#vš#v“#vŒ#v…#v~#vw#vp#vi#vb#v[#vT#vM#vF#v?#v8#v1#v*#v##v#v#v#v#v#vù"vò"vë"vä"vÝ"vÖ"vÏ"vÈ"vÁ"vº"v³"v¬"v¥"vž"v—"v"v‰"v‚"v{"vt"vm"vf"v_"vX"vQ"vJ"vC"v<"v5"v."v'"v "v"v"v "v"vý!vö!vï!vè!vá!vÚ!vÓ!vÌ!vÅ!v¾!v·!v°!v©!v¢!v›!v”!v!v†!v!vx!vq!vj!vc!v\!vU!vN!vG!v@!v9!v2!v+!v$!v!v!v!v!v!vú vó vì vå vÞ v× vÐ vÉ v v» v´ v­ v¦ vŸ v˜ v‘ vŠ vƒ v| vu vn vg v` vY vR vK vD v= v6 v/ v( v! v v v v vþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûvôvívævßvØvÑvÊvÃv¼vµv®v§v v™v’v‹v„v}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvývövïvèvávÚvÓvÌvÅv¾v·v°v©v¢v›v”vv†vvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvúvóvìvåvÞv×vÐvÉvÂv»v´v­v¦vŸv˜v‘vŠvƒv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûvôvívævßvØvÑvÊvÃv¼vµv®v§v v™v’v‹v„v}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvývövïvèvávÚvÓvÌvÅv¾v·v°v©v¢v›v”vv†vvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvúvóvìvåvÞv×vÐvÉvÂv»v´v­v¦vŸv˜v‘vŠvƒv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûvôvívævßvØvÑvÊvÃv¼vµv®v§v v™v’v‹v„v}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvù vò vë vä vÝ vÖ vÏ vÈ vÁ vº v³ v¬ v¥ vž v— v v‰ v‚ v{ vt vm vf v_ vX vQ vJ vC v< v5 v. v' v v v v v vý vö vï vè vá vÚ vÓ vÌ vÅ v¾ v· v° v© v¢ v› v” v v† v vx vq vj vc v\ vU vN vG v@ v9 v2 v+ v$ v v v v v vú vó vì vå vÞ v× vÐ vÉ v v» v´ v­ v¦ vŸ v˜ v‘ vŠ vƒ v| vu vn vg v` vY vR vK vD v= v6 v/ v( v! v v v v vþ v÷ vð vé vâ vÛ vÔ vÍ vÆ v¿ v¸ v± vª v£ vœ v• vŽ v‡ v€ vy vr vk vd v] vV vO vH vA v: v3 v, v% v v v v v vû vô ví væ vß vØ vÑ vÊ và v¼ vµ v® v§ v  v™ v’ v‹ v„ v} vv vo vh va vZ vS vL vE v> v7 v0 v) v" v v v v vÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCv<v5v.v'v vvv vvývövïvèvávÚvÓvÌvÅv¾v·v°v©v¢v›v”vv†vvxvqvjvcv\vUvNvGv@v9v2v+v$vvvvvvúvóvìvåvÞv×vÐvÉvÂv»v´v­v¦vŸv˜v‘vŠvƒv|vuvnvgv`vYvRvKvDv=v6v/v(v!vvv vvþv÷vðvévâvÛvÔvÍvÆv¿v¸v±vªv£vœv•vŽv‡v€vyvrvkvdv]vVvOvHvAv:v3v,v%vvvv vvûvôvívævßvØvÑvÊvÃv¼vµv®v§v v™v’v‹v„v}vvvovhvavZvSvLvEv>v7v0v)v"vvv vvÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùÿuòÿuëÿuäÿuÝÿuÖÿuÏÿuÈÿuÁÿuºÿu³ÿu¬ÿu¥ÿužÿu—ÿuÿu‰ÿu‚ÿu{ÿutÿumÿufÿu_ÿuXÿuQÿuJÿuCÿu<ÿu5ÿu.ÿu'ÿu ÿuÿuÿu ÿuÿuýþuöþuïþuèþuáþuÚþuÓþuÌþuÅþu¾þu·þu°þu©þu¢þu›þu”þuþu†þuþuxþuqþujþucþu\þuUþuNþuGþu@þu9þu2þu+þu$þuþuþuþuþuþuúýuóýuìýuåýuÞýu×ýuÐýuÉýuÂýu»ýu´ýu­ýu¦ýuŸýu˜ýu‘ýuŠýuƒýu|ýuuýunýugýu`ýuYýuRýuKýuDýu=ýu6ýu/ýu(ýu!ýuýuýu ýuýuþüu÷üuðüuéüuâüuÛüuÔüuÍüuÆüu¿üu¸üu±üuªüu£üuœüu•üuŽüu‡üu€üuyüurüuküudüu]üuVüuOüuHüuAüu:üu3üu,üu%üuüuüuüu üuüuûûuôûuíûuæûußûuØûuÑûuÊûuÃûu¼ûuµûu®ûu§ûu ûu™ûu’ûu‹ûu„ûu}ûuvûuoûuhûuaûuZûuSûuLûuEûu>ûu7ûu0ûu)ûu"ûuûuûu ûuûuÿúuøúuñúuêúuãúuÜúuÕúuÎúuÇúuÀúu¹úu²úu«úu¤úuúu–úuúuˆúuúuzúusúulúueúu^úuWúuPúuIúuBúu;úu4úu-úu&úuúuúuúu úuúuüùuõùuîùuçùuàùuÙùuÒùuËùuÄùu½ùu¶ùu¯ùu¨ùu¡ùušùu“ùuŒùu…ùu~ùuwùupùuiùubùu[ùuTùuMùuFùu?ùu8ùu1ùu*ùu#ùuùuùuùuùuùuùøuòøuëøuäøuÝøuÖøuÏøuÈøuÁøuºøu³øu¬øu¥øužøu—øuøu‰øu‚øu{øutøumøuføu_øuXøuQøuJøuCøu<øu5øu.øu'øu øuøuøu øuøuý÷uö÷uï÷uè÷uá÷uÚ÷uÓ÷uÌ÷uÅ÷u¾÷u·÷u°÷u©÷u¢÷u›÷u”÷u÷u†÷u÷ux÷uq÷uj÷uc÷u\÷uU÷uN÷uG÷u@÷u9÷u2÷u+÷u$÷u÷u÷u÷u÷u÷uúöuóöuìöuåöuÞöu×öuÐöuÉöuÂöu»öu´öu­öu¦öuŸöu˜öu‘öuŠöuƒöu|öuuöunöugöu`öuYöuRöuKöuDöu=öu6öu/öu(öu!öuöuöu öuöuþõu÷õuðõuéõuâõuÛõuÔõuÍõuÆõu¿õu¸õu±õuªõu£õuœõu•õuŽõu‡õu€õuyõurõukõudõu]õuVõuOõuHõuAõu:õu3õu,õu%õuõuõuõu õuõuûôuôôuíôuæôußôuØôuÑôuÊôuÃôu¼ôuµôu®ôu§ôu ôu™ôu’ôu‹ôu„ôu}ôuvôuoôuhôuaôuZôuSôuLôuEôu>ôu7ôu0ôu)ôu"ôuôuôu ôuôuÿóuøóuñóuêóuãóuÜóuÕóuÎóuÇóuÀóu¹óu²óu«óu¤óuóu–óuóuˆóuóuzóusóulóueóu^óuWóuPóuIóuBóu;óu4óu-óu&óuóuóuóu óuóuüòuõòuîòuçòuàòuÙòuÒòuËòuÄòu½òu¶òu¯òu¨òu¡òušòu“òuŒòu…òu~òuwòupòuiòubòu[òuTòuMòuFòu?òu8òu1òu*òu#òuòuòuòuòuòuùñuòñuëñuäñuÝñuÖñuÏñuÈñuÁñuºñu³ñu¬ñu¥ñužñu—ñuñu‰ñu‚ñu{ñutñumñufñu_ñuXñuQñuJñuCñu<ñu5ñu.ñu'ñu ñuñuñu ñuñuýðuöðuïðuèðuáðuÚðuÓðuÌðuÅðu¾ðu·ðu°ðu©ðu¢ðu›ðu”ðuðu†ðuðuxðuqðujðucðu\ðuUðuNðuGðu@ðu9ðu2ðu+ðu$ðuðuðuðuðuðuúïuóïuìïuåïuÞïu×ïuÐïuÉïuÂïu»ïu´ïu­ïu¦ïuŸïu˜ïu‘ïuŠïuƒïu|ïuuïunïugïu`ïuYïuRïuKïuDïu=ïu6ïu/ïu(ïu!ïuïuïu ïuïuþîu÷îuðîuéîuâîuÛîuÔîuÍîuÆîu¿îu¸îu±îuªîu£îuœîu•îuŽîu‡îu€îuyîurîukîudîu]îuVîuOîuHîuAîu:îu3îu,îu%îuîuîuîu îuîuûíuôíuííuæíußíuØíuÑíuÊíuÃíu¼íuµíu®íu§íu íu™íu’íu‹íu„íu}íuvíuoíuhíuaíuZíuSíuLíuEíu>íu7íu0íu)íu"íuíuíu íuíuÿìuøìuñìuêìuãìuÜìuÕìuÎìuÇìuÀìu¹ìu²ìu«ìu¤ìuìu–ìuìuˆìuìuzìusìulìueìu^ìuWìuPìuIìuBìu;ìu4ìu-ìu&ìuìuìuìu ìuìuüëuõëuîëuçëuàëuÙëuÒëuËëuÄëu½ëu¶ëu¯ëu¨ëu¡ëušëu“ëuŒëu…ëu~ëuwëupëuiëubëu[ëuTëuMëuFëu?ëu8ëu1ëu*ëu#ëuëuëuëuëuëuùêuòêuëêuäêuÝêuÖêuÏêuÈêuÁêuºêu³êu¬êu¥êužêu—êuêu‰êu‚êu{êutêumêufêu_êuXêuQêuJêuCêu<êu5êu.êu'êu êuêuêu êuêuýéuöéuïéuèéuáéuÚéuÓéuÌéuÅéu¾éu·éu°éu©éu¢éu›éu”éuéu†éuéuxéuqéujéucéu\éuUéuNéuGéu@éu9éu2éu+éu$éuéuéuéuéuéuúèuóèuìèuåèuÞèu×èuÐèuÉèuÂèu»èu´èu­èu¦èuŸèu˜èu‘èuŠèuƒèu|èuuèunèugèu`èuYèuRèuKèuDèu=èu6èu/èu(èu!èuèuèu èuèuþçu÷çuðçuéçuâçuÛçuÔçuÍçuÆçu¿çu¸çu±çuªçu£çuœçu•çuŽçu‡çu€çuyçurçukçudçu]çuVçuOçuHçuAçu:çu3çu,çu%çuçuçuçu çuçuûæuôæuíæuææußæuØæuÑæuÊæuÃæu¼æuµæu®æu§æu æu™æu’æu‹æu„æu}æuvæuoæuhæuaæuZæuSæuLæuEæu>æu7æu0æu)æu"æuæuæu æuæuÿåuøåuñåuêåuãåuÜåuÕåuÎåuÇåuÀåu¹åu²åu«åu¤åuåu–åuåuˆåuåuzåusåulåueåu^åuWåuPåuIåuBåu;åu4åu-åu&åuåuåuåu åuåuüäuõäuîäuçäuàäuÙäuÒäuËäuÄäu½äu¶äu¯äu¨äu¡äušäu“äuŒäu…äu~äuwäupäuiäubäu[äuTäuMäuFäu?äu8äu1äu*äu#äuäuäuäuäuäuùãuòãuëãuäãuÝãuÖãuÏãuÈãuÁãuºãu³ãu¬ãu¥ãužãu—ãuãu‰ãu‚ãu{ãutãumãufãu_ãuXãuQãuJãuCãu<ãu5ãu.ãu'ãu ãuãuãu ãuãuýâuöâuïâuèâuáâuÚâuÓâuÌâuÅâu¾âu·âu°âu©âu¢âu›âu”âuâu†âuâuxâuqâujâucâu\âuUâuNâuGâu@âu9âu2âu+âu$âuâuâuâuâuâuúáuóáuìáuåáuÞáu×áuÐáuÉáuÂáu»áu´áu­áu¦áuŸáu˜áu‘áuŠáuƒáu|áuuáunáugáu`áuYáuRáuKáuDáu=áu6áu/áu(áu!áuáuáu áuáuþàu÷àuðàuéàuâàuÛàuÔàuÍàuÆàu¿àu¸àu±àuªàu£àuœàu•àuŽàu‡àu€àuyàuràukàudàu]àuVàuOàuHàuAàu:àu3àu,àu%àuàuàuàu àuàuûßuôßuíßuæßußßuØßuÑßuÊßuÃßu¼ßuµßu®ßu§ßu ßu™ßu’ßu‹ßu„ßu}ßuvßuoßuhßuaßuZßuSßuLßuEßu>ßu7ßu0ßu)ßu"ßußußu ßußuÿÞuøÞuñÞuêÞuãÞuÜÞuÕÞuÎÞuÇÞuÀÞu¹Þu²Þu«Þu¤ÞuÞu–ÞuÞuˆÞuÞuzÞusÞulÞueÞu^ÞuWÞuPÞuIÞuBÞu;Þu4Þu-Þu&ÞuÞuÞuÞu ÞuÞuüÝuõÝuîÝuçÝuàÝuÙÝuÒÝuËÝuÄÝu½Ýu¶Ýu¯Ýu¨Ýu¡ÝušÝu“ÝuŒÝu…Ýu~ÝuwÝupÝuiÝubÝu[ÝuTÝuMÝuFÝu?Ýu8Ýu1Ýu*Ýu#ÝuÝuÝuÝuÝuÝuùÜuòÜuëÜuäÜuÝÜuÖÜuÏÜuÈÜuÁÜuºÜu³Üu¬Üu¥ÜužÜu—ÜuÜu‰Üu‚Üu{ÜutÜumÜufÜu_ÜuXÜuQÜuJÜuCÜu<Üu5Üu.Üu'Üu ÜuÜuÜu ÜuÜuýÛuöÛuïÛuèÛuáÛuÚÛuÓÛuÌÛuÅÛu¾Ûu·Ûu°Ûu©Ûu¢Ûu›Ûu”ÛuÛu†ÛuÛuxÛuqÛujÛucÛu\ÛuUÛuNÛuGÛu@Ûu9Ûu2Ûu+Ûu$ÛuÛuÛuÛuÛuÛuúÚuóÚuìÚuåÚuÞÚu×ÚuÐÚuÉÚuÂÚu»Úu´Úu­Úu¦ÚuŸÚu˜Úu‘ÚuŠÚuƒÚu|ÚuuÚunÚugÚu`ÚuYÚuRÚuKÚuDÚu=Úu6Úu/Úu(Úu!ÚuÚuÚu ÚuÚuþÙu÷ÙuðÙuéÙuâÙuÛÙuÔÙuÍÙuÆÙu¿Ùu¸Ùu±ÙuªÙu£ÙuœÙu•ÙuŽÙu‡Ùu€ÙuyÙurÙukÙudÙu]ÙuVÙuOÙuHÙuAÙu:Ùu3Ùu,Ùu%ÙuÙuÙuÙu ÙuÙuûØuôØuíØuæØuߨuØØuÑØuÊØuÃØu¼ØuµØu®Øu§Øu Øu™Øu’Øu‹Øu„Øu}ØuvØuoØuhØuaØuZØuSØuLØuEØu>Øu7Øu0Øu)Øu"ØuØuØu ØuØuÿ×uø×uñ×uê×uã×uÜ×uÕ×uÎ×uÇ×uÀ×u¹×u²×u«×u¤×u×u–×u×uˆ×u×uz×us×ul×ue×u^×uW×uP×uI×uB×u;×u4×u-×u&×u×u×u×u ×u×uüÖuõÖuîÖuçÖuàÖuÙÖuÒÖuËÖuÄÖu½Öu¶Öu¯Öu¨Öu¡ÖušÖu“ÖuŒÖu…Öu~ÖuwÖupÖuiÖubÖu[ÖuTÖuMÖuFÖu?Öu8Öu1Öu*Öu#ÖuÖuÖuÖuÖuÖuùÕuòÕuëÕuäÕuÝÕuÖÕuÏÕuÈÕuÁÕuºÕu³Õu¬Õu¥ÕužÕu—ÕuÕu‰Õu‚Õu{ÕutÕumÕufÕu_ÕuXÕuQÕuJÕuCÕu<Õu5Õu.Õu'Õu ÕuÕuÕu ÕuÕuýÔuöÔuïÔuèÔuáÔuÚÔuÓÔuÌÔuÅÔu¾Ôu·Ôu°Ôu©Ôu¢Ôu›Ôu”ÔuÔu†ÔuÔuxÔuqÔujÔucÔu\ÔuUÔuNÔuGÔu@Ôu9Ôu2Ôu+Ôu$ÔuÔuÔuÔuÔuÔuúÓuóÓuìÓuåÓuÞÓu×ÓuÐÓuÉÓuÂÓu»Óu´Óu­Óu¦ÓuŸÓu˜Óu‘ÓuŠÓuƒÓu|ÓuuÓunÓugÓu`ÓuYÓuRÓuKÓuDÓu=Óu6Óu/Óu(Óu!ÓuÓuÓu ÓuÓuþÒu÷ÒuðÒuéÒuâÒuÛÒuÔÒuÍÒuÆÒu¿Òu¸Òu±ÒuªÒu£ÒuœÒu•ÒuŽÒu‡Òu€ÒuyÒurÒukÒudÒu]ÒuVÒuOÒuHÒuAÒu:Òu3Òu,Òu%ÒuÒuÒuÒu ÒuÒuûÑuôÑuíÑuæÑußÑuØÑuÑÑuÊÑuÃÑu¼ÑuµÑu®Ñu§Ñu Ñu™Ñu’Ñu‹Ñu„Ñu}ÑuvÑuoÑuhÑuaÑuZÑuSÑuLÑuEÑu>Ñu7Ñu0Ñu)Ñu"ÑuÑuÑu ÑuÑuÿÐuøÐuñÐuêÐuãÐuÜÐuÕÐuÎÐuÇÐuÀÐu¹Ðu²Ðu«Ðu¤ÐuÐu–ÐuÐuˆÐuÐuzÐusÐulÐueÐu^ÐuWÐuPÐuIÐuBÐu;Ðu4Ðu-Ðu&ÐuÐuÐuÐu ÐuÐuüÏuõÏuîÏuçÏuàÏuÙÏuÒÏuËÏuÄÏu½Ïu¶Ïu¯Ïu¨Ïu¡ÏušÏu“ÏuŒÏu…Ïu~ÏuwÏupÏuiÏubÏu[ÏuTÏuMÏuFÏu?Ïu8Ïu1Ïu*Ïu#ÏuÏuÏuÏuÏuÏuùÎuòÎuëÎuäÎuÝÎuÖÎuÏÎuÈÎuÁÎuºÎu³Îu¬Îu¥ÎužÎu—ÎuÎu‰Îu‚Îu{ÎutÎumÎufÎu_ÎuXÎuQÎuJÎuCÎu<Îu5Îu.Îu'Îu ÎuÎuÎu ÎuÎuýÍuöÍuïÍuèÍuáÍuÚÍuÓÍuÌÍuÅÍu¾Íu·Íu°Íu©Íu¢Íu›Íu”ÍuÍu†ÍuÍuxÍuqÍujÍucÍu\ÍuUÍuNÍuGÍu@Íu9Íu2Íu+Íu$ÍuÍuÍuÍuÍuÍuúÌuóÌuìÌuåÌuÞÌu×ÌuÐÌuÉÌuÂÌu»Ìu´Ìu­Ìu¦ÌuŸÌu˜Ìu‘ÌuŠÌuƒÌu|ÌuuÌunÌugÌu`ÌuYÌuRÌuKÌuDÌu=Ìu6Ìu/Ìu(Ìu!ÌuÌuÌu ÌuÌuþËu÷ËuðËuéËuâËuÛËuÔËuÍËuÆËu¿Ëu¸Ëu±ËuªËu£ËuœËu•ËuŽËu‡Ëu€ËuyËurËukËudËu]ËuVËuOËuHËuAËu:Ëu3Ëu,Ëu%ËuËuËuËu ËuËuûÊuôÊuíÊuæÊußÊuØÊuÑÊuÊÊuÃÊu¼ÊuµÊu®Êu§Êu Êu™Êu’Êu‹Êu„Êu}ÊuvÊuoÊuhÊuaÊuZÊuSÊuLÊuEÊu>Êu7Êu0Êu)Êu"ÊuÊuÊu ÊuÊuÿÉuøÉuñÉuêÉuãÉuÜÉuÕÉuÎÉuÇÉuÀÉu¹Éu²Éu«Éu¤ÉuÉu–ÉuÉuˆÉuÉuzÉusÉulÉueÉu^ÉuWÉuPÉuIÉuBÉu;Éu4Éu-Éu&ÉuÉuÉuÉu ÉuÉuüÈuõÈuîÈuçÈuàÈuÙÈuÒÈuËÈuÄÈu½Èu¶Èu¯Èu¨Èu¡ÈušÈu“ÈuŒÈu…Èu~ÈuwÈupÈuiÈubÈu[ÈuTÈuMÈuFÈu?Èu8Èu1Èu*Èu#ÈuÈuÈuÈuÈuÈuùÇuòÇuëÇuäÇuÝÇuÖÇuÏÇuÈÇuÁÇuºÇu³Çu¬Çu¥ÇužÇu—ÇuÇu‰Çu‚Çu{ÇutÇumÇufÇu_ÇuXÇuQÇuJÇuCÇu<Çu5Çu.Çu'Çu ÇuÇuÇu ÇuÇuýÆuöÆuïÆuèÆuáÆuÚÆuÓÆuÌÆuÅÆu¾Æu·Æu°Æu©Æu¢Æu›Æu”ÆuÆu†ÆuÆuxÆuqÆujÆucÆu\ÆuUÆuNÆuGÆu@Æu9Æu2Æu+Æu$ÆuÆuÆuÆuÆuÆuúÅuóÅuìÅuåÅuÞÅu×ÅuÐÅuÉÅuÂÅu»Åu´Åu­Åu¦ÅuŸÅu˜Åu‘ÅuŠÅuƒÅu|ÅuuÅunÅugÅu`ÅuYÅuRÅuKÅuDÅu=Åu6Åu/Åu(Åu!ÅuÅuÅu ÅuÅuþÄu÷ÄuðÄuéÄuâÄuÛÄuÔÄuÍÄuÆÄu¿Äu¸Äu±ÄuªÄu£ÄuœÄu•ÄuŽÄu‡Äu€ÄuyÄurÄukÄudÄu]ÄuVÄuOÄuHÄuAÄu:Äu3Äu,Äu%ÄuÄuÄuÄu ÄuÄuûÃuôÃuíÃuæÃußÃuØÃuÑÃuÊÃuÃÃu¼ÃuµÃu®Ãu§Ãu Ãu™Ãu’Ãu‹Ãu„Ãu}ÃuvÃuoÃuhÃuaÃuZÃuSÃuLÃuEÃu>Ãu7Ãu0Ãu)Ãu"ÃuÃuÃu ÃuÃuÿÂuøÂuñÂuêÂuãÂuÜÂuÕÂuÎÂuÇÂuÀÂu¹Âu²Âu«Âu¤ÂuÂu–ÂuÂuˆÂuÂuzÂusÂulÂueÂu^ÂuWÂuPÂuIÂuBÂu;Âu4Âu-Âu&ÂuÂuÂuÂu ÂuÂuüÁuõÁuîÁuçÁuàÁuÙÁuÒÁuËÁuÄÁu½Áu¶Áu¯Áu¨Áu¡ÁušÁu“ÁuŒÁu…Áu~ÁuwÁupÁuiÁubÁu[ÁuTÁuMÁuFÁu?Áu8Áu1Áu*Áu#ÁuÁuÁuÁuÁuÁuùÀuòÀuëÀuäÀuÝÀuÖÀuÏÀuÈÀuÁÀuºÀu³Àu¬Àu¥ÀužÀu—ÀuÀu‰Àu‚Àu{ÀutÀumÀufÀu_ÀuXÀuQÀuJÀuCÀu<Àu5Àu.Àu'Àu ÀuÀuÀu ÀuÀuý¿uö¿uï¿uè¿uá¿uÚ¿uÓ¿uÌ¿uÅ¿u¾¿u·¿u°¿u©¿u¢¿u›¿u”¿u¿u†¿u¿ux¿uq¿uj¿uc¿u\¿uU¿uN¿uG¿u@¿u9¿u2¿u+¿u$¿u¿u¿u¿u¿u¿uú¾uó¾uì¾uå¾uÞ¾u×¾uоuɾu¾u»¾u´¾u­¾u¦¾uŸ¾u˜¾u‘¾uоuƒ¾u|¾uu¾un¾ug¾u`¾uY¾uR¾uK¾uD¾u=¾u6¾u/¾u(¾u!¾u¾u¾u ¾u¾uþ½u÷½uð½ué½uâ½uÛ½uÔ½uͽuƽu¿½u¸½u±½uª½u£½uœ½u•½u޽u‡½u€½uy½ur½uk½ud½u]½uV½uO½uH½uA½u:½u3½u,½u%½u½u½u½u ½u½uû¼uô¼uí¼uæ¼uß¼uؼuѼuʼuüu¼¼uµ¼u®¼u§¼u ¼u™¼u’¼u‹¼u„¼u}¼uv¼uo¼uh¼ua¼uZ¼uS¼uL¼uE¼u>¼u7¼u0¼u)¼u"¼u¼u¼u ¼u¼uÿ»uø»uñ»uê»uã»uÜ»uÕ»uλuÇ»uÀ»u¹»u²»u«»u¤»u»u–»u»uˆ»u»uz»us»ul»ue»u^»uW»uP»uI»uB»u;»u4»u-»u&»u»u»u»u »u»uüºuõºuîºuçºuàºuÙºuÒºu˺uĺu½ºu¶ºu¯ºu¨ºu¡ºušºu“ºuŒºu…ºu~ºuwºupºuiºubºu[ºuTºuMºuFºu?ºu8ºu1ºu*ºu#ºuºuºuºuºuºuù¹uò¹uë¹uä¹uݹuÖ¹uϹuȹuÁ¹uº¹u³¹u¬¹u¥¹už¹u—¹u¹u‰¹u‚¹u{¹ut¹um¹uf¹u_¹uX¹uQ¹uJ¹uC¹u<¹u5¹u.¹u'¹u ¹u¹u¹u ¹u¹uý¸uö¸uï¸uè¸uá¸uÚ¸uÓ¸u̸uŸu¾¸u·¸u°¸u©¸u¢¸u›¸u”¸u¸u†¸u¸ux¸uq¸uj¸uc¸u\¸uU¸uN¸uG¸u@¸u9¸u2¸u+¸u$¸u¸u¸u¸u¸u¸uú·uó·uì·uå·uÞ·u×·uзuÉ·u·u»·u´·u­·u¦·uŸ·u˜·u‘·uŠ·uƒ·u|·uu·un·ug·u`·uY·uR·uK·uD·u=·u6·u/·u(·u!·u·u·u ·u·uþ¶u÷¶uð¶ué¶uâ¶uÛ¶uÔ¶uͶuƶu¿¶u¸¶u±¶uª¶u£¶uœ¶u•¶u޶u‡¶u€¶uy¶ur¶uk¶ud¶u]¶uV¶uO¶uH¶uA¶u:¶u3¶u,¶u%¶u¶u¶u¶u ¶u¶uûµuôµuíµuæµußµuصuѵuʵuõu¼µuµµu®µu§µu µu™µu’µu‹µu„µu}µuvµuoµuhµuaµuZµuSµuLµuEµu>µu7µu0µu)µu"µuµuµu µuµuÿ´uø´uñ´uê´uã´uÜ´uÕ´uδuÇ´uÀ´u¹´u²´u«´u¤´u´u–´u´uˆ´u´uz´us´ul´ue´u^´uW´uP´uI´uB´u;´u4´u-´u&´u´u´u´u ´u´uü³uõ³uî³uç³uà³uÙ³uÒ³u˳uiju½³u¶³u¯³u¨³u¡³uš³u“³uŒ³u…³u~³uw³up³ui³ub³u[³uT³uM³uF³u?³u8³u1³u*³u#³u³u³u³u³u³uù²uò²uë²uä²uݲuÖ²uϲuȲuÁ²uº²u³²u¬²u¥²už²u—²u²u‰²u‚²u{²ut²um²uf²u_²uX²uQ²uJ²uC²u<²u5²u.²u'²u ²u²u²u ²u²uý±uö±uï±uè±uá±uÚ±uÓ±u̱uűu¾±u·±u°±u©±u¢±u›±u”±u±u†±u±ux±uq±uj±uc±u\±uU±uN±uG±u@±u9±u2±u+±u$±u±u±u±u±u±uú°uó°uì°uå°uÞ°u×°uаuɰu°u»°u´°u­°u¦°uŸ°u˜°u‘°uаuƒ°u|°uu°un°ug°u`°uY°uR°uK°uD°u=°u6°u/°u(°u!°u°u°u °u°uþ¯u÷¯uð¯ué¯uâ¯uÛ¯uÔ¯uͯuƯu¿¯u¸¯u±¯uª¯u£¯uœ¯u•¯uޝu‡¯u€¯uy¯ur¯uk¯ud¯u]¯uV¯uO¯uH¯uA¯u:¯u3¯u,¯u%¯u¯u¯u¯u ¯u¯uû®uô®uí®uæ®uß®uØ®uÑ®uÊ®uîu¼®uµ®u®®u§®u ®u™®u’®u‹®u„®u}®uv®uo®uh®ua®uZ®uS®uL®uE®u>®u7®u0®u)®u"®u®u®u ®u®uÿ­uø­uñ­uê­uã­uÜ­uÕ­uέuÇ­uÀ­u¹­u²­u«­u¤­u­u–­u­uˆ­u­uz­us­ul­ue­u^­uW­uP­uI­uB­u;­u4­u-­u&­u­u­u­u ­u­uü¬uõ¬uî¬uç¬uà¬uÙ¬uÒ¬uˬuĬu½¬u¶¬u¯¬u¨¬u¡¬uš¬u“¬uŒ¬u…¬u~¬uw¬up¬ui¬ub¬u[¬uT¬uM¬uF¬u?¬u8¬u1¬u*¬u#¬u¬u¬u¬u¬u¬uù«uò«uë«uä«uÝ«uÖ«uÏ«uÈ«uÁ«uº«u³«u¬«u¥«už«u—«u«u‰«u‚«u{«ut«um«uf«u_«uX«uQ«uJ«uC«u<«u5«u.«u'«u «u«u«u «u«uýªuöªuïªuèªuáªuÚªuÓªu̪uŪu¾ªu·ªu°ªu©ªu¢ªu›ªu”ªuªu†ªuªuxªuqªujªucªu\ªuUªuNªuGªu@ªu9ªu2ªu+ªu$ªuªuªuªuªuªuú©uó©uì©uå©uÞ©uשuЩuÉ©u©u»©u´©u­©u¦©uŸ©u˜©u‘©uŠ©uƒ©u|©uu©un©ug©u`©uY©uR©uK©uD©u=©u6©u/©u(©u!©u©u©u ©u©uþ¨u÷¨uð¨ué¨uâ¨uÛ¨uÔ¨uͨuƨu¿¨u¸¨u±¨uª¨u£¨uœ¨u•¨uލu‡¨u€¨uy¨ur¨uk¨ud¨u]¨uV¨uO¨uH¨uA¨u:¨u3¨u,¨u%¨u¨u¨u¨u ¨u¨uû§uô§uí§uæ§uß§uاuѧuʧuçu¼§uµ§u®§u§§u §u™§u’§u‹§u„§u}§uv§uo§uh§ua§uZ§uS§uL§uE§u>§u7§u0§u)§u"§u§u§u §u§uÿ¦uø¦uñ¦uê¦uã¦uܦuÕ¦uΦuǦuÀ¦u¹¦u²¦u«¦u¤¦u¦u–¦u¦uˆ¦u¦uz¦us¦ul¦ue¦u^¦uW¦uP¦uI¦uB¦u;¦u4¦u-¦u&¦u¦u¦u¦u ¦u¦uü¥uõ¥uî¥uç¥uà¥uÙ¥uÒ¥uË¥uÄ¥u½¥u¶¥u¯¥u¨¥u¡¥uš¥u“¥uŒ¥u…¥u~¥uw¥up¥ui¥ub¥u[¥uT¥uM¥uF¥u?¥u8¥u1¥u*¥u#¥u¥u¥u¥u¥u¥uù¤uò¤uë¤uä¤uݤuÖ¤uϤuȤuÁ¤uº¤u³¤u¬¤u¥¤už¤u—¤u¤u‰¤u‚¤u{¤ut¤um¤uf¤u_¤uX¤uQ¤uJ¤uC¤u<¤u5¤u.¤u'¤u ¤u¤u¤u ¤u¤uý£uö£uï£uè£uá£uÚ£uÓ£uÌ£uÅ£u¾£u·£u°£u©£u¢£u›£u”£u£u†£u£ux£uq£uj£uc£u\£uU£uN£uG£u@£u9£u2£u+£u$£u£u£u£u£u£uú¢uó¢uì¢uå¢uÞ¢u×¢uТuÉ¢u¢u»¢u´¢u­¢u¦¢uŸ¢u˜¢u‘¢uŠ¢uƒ¢u|¢uu¢un¢ug¢u`¢uY¢uR¢uK¢uD¢u=¢u6¢u/¢u(¢u!¢u¢u¢u ¢u¢uþ¡u÷¡uð¡ué¡uâ¡uÛ¡uÔ¡uÍ¡uÆ¡u¿¡u¸¡u±¡uª¡u£¡uœ¡u•¡uŽ¡u‡¡u€¡uy¡ur¡uk¡ud¡u]¡uV¡uO¡uH¡uA¡u:¡u3¡u,¡u%¡u¡u¡u¡u ¡u¡uû uô uí uæ uß uØ uÑ uÊ uàu¼ uµ u® u§ u  u™ u’ u‹ u„ u} uv uo uh ua uZ uS uL uE u> u7 u0 u) u" u u u  u uÿŸuøŸuñŸuêŸuãŸuÜŸuÕŸuΟuÇŸuÀŸu¹Ÿu²Ÿu«Ÿu¤ŸuŸu–ŸuŸuˆŸuŸuzŸusŸulŸueŸu^ŸuWŸuPŸuIŸuBŸu;Ÿu4Ÿu-Ÿu&ŸuŸuŸuŸu ŸuŸuüžuõžuîžuçžuàžuÙžuÒžuËžuÄžu½žu¶žu¯žu¨žu¡žušžu“žuŒžu…žu~žuwžupžuižubžu[žuTžuMžuFžu?žu8žu1žu*žu#žužužužužužuùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu™u7™u0™u)™u"™u™u™u ™u™uÿ˜uø˜uñ˜uê˜uã˜uܘuÕ˜uΘuǘuÀ˜u¹˜u²˜u«˜u¤˜u˜u–˜u˜uˆ˜u˜uz˜us˜ul˜ue˜u^˜uW˜uP˜uI˜uB˜u;˜u4˜u-˜u&˜u˜u˜u˜u ˜u˜uü—uõ—uî—uç—uà—uÙ—uÒ—uË—uÄ—u½—u¶—u¯—u¨—u¡—uš—u“—uŒ—u…—u~—uw—up—ui—ub—u[—uT—uM—uF—u?—u8—u1—u*—u#—u—u—u—u—u—uù–uò–uë–uä–uÝ–uÖ–uÏ–uÈ–uÁ–uº–u³–u¬–u¥–už–u—–u–u‰–u‚–u{–ut–um–uf–u_–uX–uQ–uJ–uC–u<–u5–u.–u'–u –u–u–u –u–uý•uö•uï•uè•uá•uÚ•uÓ•uÌ•uÅ•u¾•u·•u°•u©•u¢•u›•u”•u•u†•u•ux•uq•uj•uc•u\•uU•uN•uG•u@•u9•u2•u+•u$•u•u•u•u•u•uú”uó”uì”uå”uÞ”u×”uДuÉ”u”u»”u´”u­”u¦”uŸ”u˜”u‘”uŠ”uƒ”u|”uu”un”ug”u`”uY”uR”uK”uD”u=”u6”u/”u(”u!”u”u”u ”u”uþ“u÷“uð“ué“uâ“uÛ“uÔ“uÍ“uÆ“u¿“u¸“u±“uª“u£“uœ“u•“uŽ“u‡“u€“uy“ur“uk“ud“u]“uV“uO“uH“uA“u:“u3“u,“u%“u“u“u“u “u“uû’uô’uí’uæ’uß’uØ’uÑ’uÊ’uÃ’u¼’uµ’u®’u§’u ’u™’u’’u‹’u„’u}’uv’uo’uh’ua’uZ’uS’uL’uE’u>’u7’u0’u)’u"’u’u’u ’u’uÿ‘uø‘uñ‘uê‘uã‘uÜ‘uÕ‘uΑuÇ‘uÀ‘u¹‘u²‘u«‘u¤‘u‘u–‘u‘uˆ‘u‘uz‘us‘ul‘ue‘u^‘uW‘uP‘uI‘uB‘u;‘u4‘u-‘u&‘u‘u‘u‘u ‘u‘uüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu‹u7‹u0‹u)‹u"‹u‹u‹u ‹u‹uÿŠuøŠuñŠuêŠuãŠuÜŠuÕŠuΊuÇŠuÀŠu¹Šu²Šu«Šu¤ŠuŠu–ŠuŠuˆŠuŠuzŠusŠulŠueŠu^ŠuWŠuPŠuIŠuBŠu;Šu4Šu-Šu&ŠuŠuŠuŠu ŠuŠuü‰uõ‰uî‰uç‰uà‰uÙ‰uÒ‰uˉuĉu½‰u¶‰u¯‰u¨‰u¡‰uš‰u“‰uŒ‰u…‰u~‰uw‰up‰ui‰ub‰u[‰uT‰uM‰uF‰u?‰u8‰u1‰u*‰u#‰u‰u‰u‰u‰u‰uùˆuòˆuëˆuäˆu݈uÖˆuψuȈuÁˆuºˆu³ˆu¬ˆu¥ˆužˆu—ˆuˆu‰ˆu‚ˆu{ˆutˆumˆufˆu_ˆuXˆuQˆuJˆuCˆu<ˆu5ˆu.ˆu'ˆu ˆuˆuˆu ˆuˆuý‡uö‡uï‡uè‡uá‡uÚ‡uÓ‡u̇uŇu¾‡u·‡u°‡u©‡u¢‡u›‡u”‡u‡u†‡u‡ux‡uq‡uj‡uc‡u\‡uU‡uN‡uG‡u@‡u9‡u2‡u+‡u$‡u‡u‡u‡u‡u‡uú†uó†uì†uå†uÞ†u׆uІuɆu†u»†u´†u­†u¦†uŸ†u˜†u‘†uІuƒ†u|†uu†un†ug†u`†uY†uR†uK†uD†u=†u6†u/†u(†u!†u†u†u †u†uþ…u÷…uð…ué…uâ…uÛ…uÔ…uÍ…uÆ…u¿…u¸…u±…uª…u£…uœ…u•…uŽ…u‡…u€…uy…ur…uk…ud…u]…uV…uO…uH…uA…u:…u3…u,…u%…u…u…u…u …u…uû„uô„uí„uæ„uß„uØ„uÑ„uÊ„uÄu¼„uµ„u®„u§„u „u™„u’„u‹„u„„u}„uv„uo„uh„ua„uZ„uS„uL„uE„u>„u7„u0„u)„u"„u„u„u „u„uÿƒuøƒuñƒuêƒuãƒu܃uÕƒu΃uǃuÀƒu¹ƒu²ƒu«ƒu¤ƒuƒu–ƒuƒuˆƒuƒuzƒusƒulƒueƒu^ƒuWƒuPƒuIƒuBƒu;ƒu4ƒu-ƒu&ƒuƒuƒuƒu ƒuƒuü‚uõ‚uî‚uç‚uà‚uÙ‚uÒ‚uË‚uÄ‚u½‚u¶‚u¯‚u¨‚u¡‚uš‚u“‚uŒ‚u…‚u~‚uw‚up‚ui‚ub‚u[‚uT‚uM‚uF‚u?‚u8‚u1‚u*‚u#‚u‚u‚u‚u‚u‚uùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu}u7}u0}u)}u"}u}u}u }u}uÿ|uø|uñ|uê|uã|uÜ|uÕ|uÎ|uÇ|uÀ|u¹|u²|u«|u¤|u|u–|u|uˆ|u|uz|us|ul|ue|u^|uW|uP|uI|uB|u;|u4|u-|u&|u|u|u|u |u|uü{uõ{uî{uç{uà{uÙ{uÒ{uË{uÄ{u½{u¶{u¯{u¨{u¡{uš{u“{uŒ{u…{u~{uw{up{ui{ub{u[{uT{uM{uF{u?{u8{u1{u*{u#{u{u{u{u{u{uùzuòzuëzuäzuÝzuÖzuÏzuÈzuÁzuºzu³zu¬zu¥zužzu—zuzu‰zu‚zu{zutzumzufzu_zuXzuQzuJzuCzuvu7vu0vu)vu"vuvuvu vuvuÿuuøuuñuuêuuãuuÜuuÕuuÎuuÇuuÀuu¹uu²uu«uu¤uuuu–uuuuˆuuuuzuusuuluueuu^uuWuuPuuIuuBuu;uu4uu-uu&uuuuuuuu uuuuütuõtuîtuçtuàtuÙtuÒtuËtuÄtu½tu¶tu¯tu¨tu¡tuštu“tuŒtu…tu~tuwtuptuitubtu[tuTtuMtuFtu?tu8tu1tu*tu#tutututututuùsuòsuësuäsuÝsuÖsuÏsuÈsuÁsuºsu³su¬su¥sužsu—susu‰su‚su{sutsumsufsu_suXsuQsuJsuCsuou7ou0ou)ou"ououou ououÿnuønuñnuênuãnuÜnuÕnuÎnuÇnuÀnu¹nu²nu«nu¤nunu–nunuˆnunuznusnulnuenu^nuWnuPnuInuBnu;nu4nu-nu&nunununu nunuümuõmuîmuçmuàmuÙmuÒmuËmuÄmu½mu¶mu¯mu¨mu¡mušmu“muŒmu…mu~muwmupmuimubmu[muTmuMmuFmu?mu8mu1mu*mu#mumumumumumuùluòluëluäluÝluÖluÏluÈluÁluºlu³lu¬lu¥lužlu—lulu‰lu‚lu{lutlumluflu_luXluQluJluCluhu7hu0hu)hu"huhuhu huhuÿguøguñguêguãguÜguÕguÎguÇguÀgu¹gu²gu«gu¤gugu–guguˆguguzgusgulguegu^guWguPguIguBgu;gu4gu-gu&gugugugu guguüfuõfuîfuçfuàfuÙfuÒfuËfuÄfu½fu¶fu¯fu¨fu¡fušfu“fuŒfu…fu~fuwfupfuifubfu[fuTfuMfuFfu?fu8fu1fu*fu#fufufufufufuùeuòeuëeuäeuÝeuÖeuÏeuÈeuÁeuºeu³eu¬eu¥eužeu—eueu‰eu‚eu{euteumeufeu_euXeuQeuJeuCeuau7au0au)au"auauau auauÿ`uø`uñ`uê`uã`uÜ`uÕ`uÎ`uÇ`uÀ`u¹`u²`u«`u¤`u`u–`u`uˆ`u`uz`us`ul`ue`u^`uW`uP`uI`uB`u;`u4`u-`u&`u`u`u`u `u`uü_uõ_uî_uç_uà_uÙ_uÒ_uË_uÄ_u½_u¶_u¯_u¨_u¡_uš_u“_uŒ_u…_u~_uw_up_ui_ub_u[_uT_uM_uF_u?_u8_u1_u*_u#_u_u_u_u_u_uù^uò^uë^uä^uÝ^uÖ^uÏ^uÈ^uÁ^uº^u³^u¬^u¥^už^u—^u^u‰^u‚^u{^ut^um^uf^u_^uX^uQ^uJ^uC^u<^u5^u.^u'^u ^u^u^u ^u^uý]uö]uï]uè]uá]uÚ]uÓ]uÌ]uÅ]u¾]u·]u°]u©]u¢]u›]u”]u]u†]u]ux]uq]uj]uc]u\]uU]uN]uG]u@]u9]u2]u+]u$]u]u]u]u]u]uú\uó\uì\uå\uÞ\u×\uÐ\uÉ\uÂ\u»\u´\u­\u¦\uŸ\u˜\u‘\uŠ\uƒ\u|\uu\un\ug\u`\uY\uR\uK\uD\u=\u6\u/\u(\u!\u\u\u \u\uþ[u÷[uð[ué[uâ[uÛ[uÔ[uÍ[uÆ[u¿[u¸[u±[uª[u£[uœ[u•[uŽ[u‡[u€[uy[ur[uk[ud[u][uV[uO[uH[uA[u:[u3[u,[u%[u[u[u[u [u[uûZuôZuíZuæZußZuØZuÑZuÊZuÃZu¼ZuµZu®Zu§Zu Zu™Zu’Zu‹Zu„Zu}ZuvZuoZuhZuaZuZZuSZuLZuEZu>Zu7Zu0Zu)Zu"ZuZuZu ZuZuÿYuøYuñYuêYuãYuÜYuÕYuÎYuÇYuÀYu¹Yu²Yu«Yu¤YuYu–YuYuˆYuYuzYusYulYueYu^YuWYuPYuIYuBYu;Yu4Yu-Yu&YuYuYuYu YuYuüXuõXuîXuçXuàXuÙXuÒXuËXuÄXu½Xu¶Xu¯Xu¨Xu¡XušXu“XuŒXu…Xu~XuwXupXuiXubXu[XuTXuMXuFXu?Xu8Xu1Xu*Xu#XuXuXuXuXuXuùWuòWuëWuäWuÝWuÖWuÏWuÈWuÁWuºWu³Wu¬Wu¥WužWu—WuWu‰Wu‚Wu{WutWumWufWu_WuXWuQWuJWuCWuSu7Su0Su)Su"SuSuSu SuSuÿRuøRuñRuêRuãRuÜRuÕRuÎRuÇRuÀRu¹Ru²Ru«Ru¤RuRu–RuRuˆRuRuzRusRulRueRu^RuWRuPRuIRuBRu;Ru4Ru-Ru&RuRuRuRu RuRuüQuõQuîQuçQuàQuÙQuÒQuËQuÄQu½Qu¶Qu¯Qu¨Qu¡QušQu“QuŒQu…Qu~QuwQupQuiQubQu[QuTQuMQuFQu?Qu8Qu1Qu*Qu#QuQuQuQuQuQuùPuòPuëPuäPuÝPuÖPuÏPuÈPuÁPuºPu³Pu¬Pu¥PužPu—PuPu‰Pu‚Pu{PutPumPufPu_PuXPuQPuJPuCPuLu7Lu0Lu)Lu"LuLuLu LuLuÿKuøKuñKuêKuãKuÜKuÕKuÎKuÇKuÀKu¹Ku²Ku«Ku¤KuKu–KuKuˆKuKuzKusKulKueKu^KuWKuPKuIKuBKu;Ku4Ku-Ku&KuKuKuKu KuKuüJuõJuîJuçJuàJuÙJuÒJuËJuÄJu½Ju¶Ju¯Ju¨Ju¡JušJu“JuŒJu…Ju~JuwJupJuiJubJu[JuTJuMJuFJu?Ju8Ju1Ju*Ju#JuJuJuJuJuJuùIuòIuëIuäIuÝIuÖIuÏIuÈIuÁIuºIu³Iu¬Iu¥IužIu—IuIu‰Iu‚Iu{IutIumIufIu_IuXIuQIuJIuCIuEu7Eu0Eu)Eu"EuEuEu EuEuÿDuøDuñDuêDuãDuÜDuÕDuÎDuÇDuÀDu¹Du²Du«Du¤DuDu–DuDuˆDuDuzDusDulDueDu^DuWDuPDuIDuBDu;Du4Du-Du&DuDuDuDu DuDuüCuõCuîCuçCuàCuÙCuÒCuËCuÄCu½Cu¶Cu¯Cu¨Cu¡CušCu“CuŒCu…Cu~CuwCupCuiCubCu[CuTCuMCuFCu?Cu8Cu1Cu*Cu#CuCuCuCuCuCuùBuòBuëBuäBuÝBuÖBuÏBuÈBuÁBuºBu³Bu¬Bu¥BužBu—BuBu‰Bu‚Bu{ButBumBufBu_BuXBuQBuJBuCBuuô>uí>uæ>uß>uØ>uÑ>uÊ>uÃ>u¼>uµ>u®>u§>u >u™>u’>u‹>u„>u}>uv>uo>uh>ua>uZ>uS>uL>uE>u>>u7>u0>u)>u">u>u>u >u>uÿ=uø=uñ=uê=uã=uÜ=uÕ=uÎ=uÇ=uÀ=u¹=u²=u«=u¤=u=u–=u=uˆ=u=uz=us=ul=ue=u^=uW=uP=uI=uB=u;=u4=u-=u&=u=u=u=u =u=uü7u77u07u)7u"7u7u7u 7u7uÿ6uø6uñ6uê6uã6uÜ6uÕ6uÎ6uÇ6uÀ6u¹6u²6u«6u¤6u6u–6u6uˆ6u6uz6us6ul6ue6u^6uW6uP6uI6uB6u;6u46u-6u&6u6u6u6u 6u6uü5uõ5uî5uç5uà5uÙ5uÒ5uË5uÄ5u½5u¶5u¯5u¨5u¡5uš5u“5uŒ5u…5u~5uw5up5ui5ub5u[5uT5uM5uF5u?5u85u15u*5u#5u5u5u5u5u5uù4uò4uë4uä4uÝ4uÖ4uÏ4uÈ4uÁ4uº4u³4u¬4u¥4už4u—4u4u‰4u‚4u{4ut4um4uf4u_4uX4uQ4uJ4uC4u<4u54u.4u'4u 4u4u4u 4u4uý3uö3uï3uè3uá3uÚ3uÓ3uÌ3uÅ3u¾3u·3u°3u©3u¢3u›3u”3u3u†3u3ux3uq3uj3uc3u\3uU3uN3uG3u@3u93u23u+3u$3u3u3u3u3u3uú2uó2uì2uå2uÞ2u×2uÐ2uÉ2uÂ2u»2u´2u­2u¦2uŸ2u˜2u‘2uŠ2uƒ2u|2uu2un2ug2u`2uY2uR2uK2uD2u=2u62u/2u(2u!2u2u2u 2u2uþ1u÷1uð1ué1uâ1uÛ1uÔ1uÍ1uÆ1u¿1u¸1u±1uª1u£1uœ1u•1uŽ1u‡1u€1uy1ur1uk1ud1u]1uV1uO1uH1uA1u:1u31u,1u%1u1u1u1u 1u1uû0uô0uí0uæ0uß0uØ0uÑ0uÊ0uÃ0u¼0uµ0u®0u§0u 0u™0u’0u‹0u„0u}0uv0uo0uh0ua0uZ0uS0uL0uE0u>0u70u00u)0u"0u0u0u 0u0uÿ/uø/uñ/uê/uã/uÜ/uÕ/uÎ/uÇ/uÀ/u¹/u²/u«/u¤/u/u–/u/uˆ/u/uz/us/ul/ue/u^/uW/uP/uI/uB/u;/u4/u-/u&/u/u/u/u /u/uü.uõ.uî.uç.uà.uÙ.uÒ.uË.uÄ.u½.u¶.u¯.u¨.u¡.uš.u“.uŒ.u….u~.uw.up.ui.ub.u[.uT.uM.uF.u?.u8.u1.u*.u#.u.u.u.u.u.uù-uò-uë-uä-uÝ-uÖ-uÏ-uÈ-uÁ-uº-u³-u¬-u¥-už-u—-u-u‰-u‚-u{-ut-um-uf-u_-uX-uQ-uJ-uC-u<-u5-u.-u'-u -u-u-u -u-uý,uö,uï,uè,uá,uÚ,uÓ,uÌ,uÅ,u¾,u·,u°,u©,u¢,u›,u”,u,u†,u,ux,uq,uj,uc,u\,uU,uN,uG,u@,u9,u2,u+,u$,u,u,u,u,u,uú+uó+uì+uå+uÞ+u×+uÐ+uÉ+uÂ+u»+u´+u­+u¦+uŸ+u˜+u‘+uŠ+uƒ+u|+uu+un+ug+u`+uY+uR+uK+uD+u=+u6+u/+u(+u!+u+u+u +u+uþ*u÷*uð*ué*uâ*uÛ*uÔ*uÍ*uÆ*u¿*u¸*u±*uª*u£*uœ*u•*uŽ*u‡*u€*uy*ur*uk*ud*u]*uV*uO*uH*uA*u:*u3*u,*u%*u*u*u*u *u*uû)uô)uí)uæ)uß)uØ)uÑ)uÊ)uÃ)u¼)uµ)u®)u§)u )u™)u’)u‹)u„)u})uv)uo)uh)ua)uZ)uS)uL)uE)u>)u7)u0)u))u")u)u)u )u)uÿ(uø(uñ(uê(uã(uÜ(uÕ(uÎ(uÇ(uÀ(u¹(u²(u«(u¤(u(u–(u(uˆ(u(uz(us(ul(ue(u^(uW(uP(uI(uB(u;(u4(u-(u&(u(u(u(u (u(uü'uõ'uî'uç'uà'uÙ'uÒ'uË'uÄ'u½'u¶'u¯'u¨'u¡'uš'u“'uŒ'u…'u~'uw'up'ui'ub'u['uT'uM'uF'u?'u8'u1'u*'u#'u'u'u'u'u'uù&uò&uë&uä&uÝ&uÖ&uÏ&uÈ&uÁ&uº&u³&u¬&u¥&už&u—&u&u‰&u‚&u{&ut&um&uf&u_&uX&uQ&uJ&uC&u<&u5&u.&u'&u &u&u&u &u&uý%uö%uï%uè%uá%uÚ%uÓ%uÌ%uÅ%u¾%u·%u°%u©%u¢%u›%u”%u%u†%u%ux%uq%uj%uc%u\%uU%uN%uG%u@%u9%u2%u+%u$%u%u%u%u%u%uú$uó$uì$uå$uÞ$u×$uÐ$uÉ$uÂ$u»$u´$u­$u¦$uŸ$u˜$u‘$uŠ$uƒ$u|$uu$un$ug$u`$uY$uR$uK$uD$u=$u6$u/$u($u!$u$u$u $u$uþ#u÷#uð#ué#uâ#uÛ#uÔ#uÍ#uÆ#u¿#u¸#u±#uª#u£#uœ#u•#uŽ#u‡#u€#uy#ur#uk#ud#u]#uV#uO#uH#uA#u:#u3#u,#u%#u#u#u#u #u#uû"uô"uí"uæ"uß"uØ"uÑ"uÊ"uÃ"u¼"uµ"u®"u§"u "u™"u’"u‹"u„"u}"uv"uo"uh"ua"uZ"uS"uL"uE"u>"u7"u0"u)"u""u"u"u "u"uÿ!uø!uñ!uê!uã!uÜ!uÕ!uÎ!uÇ!uÀ!u¹!u²!u«!u¤!u!u–!u!uˆ!u!uz!us!ul!ue!u^!uW!uP!uI!uB!u;!u4!u-!u&!u!u!u!u !u!uü uõ uî uç uà uÙ uÒ uË uÄ u½ u¶ u¯ u¨ u¡ uš u“ uŒ u… u~ uw up ui ub u[ uT uM uF u? u8 u1 u* u# u u u u u uùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu<u5u.u'u uuu uuýuöuïuèuáuÚuÓuÌuÅu¾u·u°u©u¢u›u”uu†uuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuúuóuìuåuÞu×uÐuÉuÂu»u´u­u¦uŸu˜u‘uŠuƒu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuþu÷uðuéuâuÛuÔuÍuÆu¿u¸u±uªu£uœu•uŽu‡u€uyurukudu]uVuOuHuAu:u3u,u%uuuu uuûuôuíuæußuØuÑuÊuÃu¼uµu®u§u u™u’u‹u„u}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu<u5u.u'u uuu uuýuöuïuèuáuÚuÓuÌuÅu¾u·u°u©u¢u›u”uu†uuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuúuóuìuåuÞu×uÐuÉuÂu»u´u­u¦uŸu˜u‘uŠuƒu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuþu÷uðuéuâuÛuÔuÍuÆu¿u¸u±uªu£uœu•uŽu‡u€uyurukudu]uVuOuHuAu:u3u,u%uuuu uuûuôuíuæußuØuÑuÊuÃu¼uµu®u§u u™u’u‹u„u}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu<u5u.u'u uuu uuýuöuïuèuáuÚuÓuÌuÅu¾u·u°u©u¢u›u”uu†uuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuúuóuìuåuÞu×uÐuÉuÂu»u´u­u¦uŸu˜u‘uŠuƒu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuþu÷uðuéuâuÛuÔuÍuÆu¿u¸u±uªu£uœu•uŽu‡u€uyurukudu]uVuOuHuAu:u3u,u%uuuu uuû uô uí uæ uß uØ uÑ uÊ uà u¼ uµ u® u§ u  u™ u’ u‹ u„ u} uv uo uh ua uZ uS uL uE u> u7 u0 u) u" u u u u uÿ uø uñ uê uã uÜ uÕ uÎ uÇ uÀ u¹ u² u« u¤ u u– u uˆ u uz us ul ue u^ uW uP uI uB u; u4 u- u& u u u u u uü uõ uî uç uà uÙ uÒ uË uÄ u½ u¶ u¯ u¨ u¡ uš u“ uŒ u… u~ uw up ui ub u[ uT uM uF u? u8 u1 u* u# u u u u u uù uò uë uä uÝ uÖ uÏ uÈ uÁ uº u³ u¬ u¥ už u— u u‰ u‚ u{ ut um uf u_ uX uQ uJ uC u< u5 u. u' u u u u u uý uö uï uè uá uÚ uÓ uÌ uÅ u¾ u· u° u© u¢ u› u” u u† u ux uq uj uc u\ uU uN uG u@ u9 u2 u+ u$ u u u u u uúuóuìuåuÞu×uÐuÉuÂu»u´u­u¦uŸu˜u‘uŠuƒu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuþu÷uðuéuâuÛuÔuÍuÆu¿u¸u±uªu£uœu•uŽu‡u€uyurukudu]uVuOuHuAu:u3u,u%uuuu uuûuôuíuæußuØuÑuÊuÃu¼uµu®u§u u™u’u‹u„u}uvuouhuauZuSuLuEu>u7u0u)u"uuu uuÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCu<u5u.u'u uuu uuýuöuïuèuáuÚuÓuÌuÅu¾u·u°u©u¢u›u”uu†uuxuqujucu\uUuNuGu@u9u2u+u$uuuuuuúuóuìuåuÞu×uÐuÉuÂu»u´u­u¦uŸu˜u‘uŠuƒu|uuunugu`uYuRuKuDu=u6u/u(u!uuu uuþu÷uðuéuâuÛuÔuÍuÆu¿u¸u±uªu£uœu•uŽu‡u€uyurukudu]uVuOuHuAu:u3u,u%uuuu uuûÿtôÿtíÿtæÿtßÿtØÿtÑÿtÊÿtÃÿt¼ÿtµÿt®ÿt§ÿt ÿt™ÿt’ÿt‹ÿt„ÿt}ÿtvÿtoÿthÿtaÿtZÿtSÿtLÿtEÿt>ÿt7ÿt0ÿt)ÿt"ÿtÿtÿt ÿtÿtÿþtøþtñþtêþtãþtÜþtÕþtÎþtÇþtÀþt¹þt²þt«þt¤þtþt–þtþtˆþtþtzþtsþtlþteþt^þtWþtPþtIþtBþt;þt4þt-þt&þtþtþtþt þtþtüýtõýtîýtçýtàýtÙýtÒýtËýtÄýt½ýt¶ýt¯ýt¨ýt¡ýtšýt“ýtŒýt…ýt~ýtwýtpýtiýtbýt[ýtTýtMýtFýt?ýt8ýt1ýt*ýt#ýtýtýtýtýtýtùütòütëütäütÝütÖütÏütÈütÁütºüt³üt¬üt¥ütžüt—ütüt‰üt‚üt{üttütmütfüt_ütXütQütJütCüt<üt5üt.üt'üt ütütüt ütütýûtöûtïûtèûtáûtÚûtÓûtÌûtÅût¾ût·ût°ût©ût¢ût›ût”ûtût†ûtûtxûtqûtjûtcût\ûtUûtNûtGût@ût9ût2ût+ût$ûtûtûtûtûtûtúútóútìútåútÞút×útÐútÉútÂút»út´út­út¦útŸút˜út‘útŠútƒút|útuútnútgút`útYútRútKútDút=út6út/út(út!útútút útútþùt÷ùtðùtéùtâùtÛùtÔùtÍùtÆùt¿ùt¸ùt±ùtªùt£ùtœùt•ùtŽùt‡ùt€ùtyùtrùtkùtdùt]ùtVùtOùtHùtAùt:ùt3ùt,ùt%ùtùtùtùt ùtùtûøtôøtíøtæøtßøtØøtÑøtÊøtÃøt¼øtµøt®øt§øt øt™øt’øt‹øt„øt}øtvøtoøthøtaøtZøtSøtLøtEøt>øt7øt0øt)øt"øtøtøt øtøtÿ÷tø÷tñ÷tê÷tã÷tÜ÷tÕ÷tÎ÷tÇ÷tÀ÷t¹÷t²÷t«÷t¤÷t÷t–÷t÷tˆ÷t÷tz÷ts÷tl÷te÷t^÷tW÷tP÷tI÷tB÷t;÷t4÷t-÷t&÷t÷t÷t÷t ÷t÷tüötõötîötçötàötÙötÒötËötÄöt½öt¶öt¯öt¨öt¡ötšöt“ötŒöt…öt~ötwötpötiötböt[ötTötMötFöt?öt8öt1öt*öt#ötötötötötötùõtòõtëõtäõtÝõtÖõtÏõtÈõtÁõtºõt³õt¬õt¥õtžõt—õtõt‰õt‚õt{õttõtmõtfõt_õtXõtQõtJõtCõt<õt5õt.õt'õt õtõtõt õtõtýôtöôtïôtèôtáôtÚôtÓôtÌôtÅôt¾ôt·ôt°ôt©ôt¢ôt›ôt”ôtôt†ôtôtxôtqôtjôtcôt\ôtUôtNôtGôt@ôt9ôt2ôt+ôt$ôtôtôtôtôtôtúótóótìótåótÞót×ótÐótÉótÂót»ót´ót­ót¦ótŸót˜ót‘ótŠótƒót|ótuótnótgót`ótYótRótKótDót=ót6ót/ót(ót!ótótót ótótþòt÷òtðòtéòtâòtÛòtÔòtÍòtÆòt¿òt¸òt±òtªòt£òtœòt•òtŽòt‡òt€òtyòtròtkòtdòt]òtVòtOòtHòtAòt:òt3òt,òt%òtòtòtòt òtòtûñtôñtíñtæñtßñtØñtÑñtÊñtÃñt¼ñtµñt®ñt§ñt ñt™ñt’ñt‹ñt„ñt}ñtvñtoñthñtañtZñtSñtLñtEñt>ñt7ñt0ñt)ñt"ñtñtñt ñtñtÿðtøðtñðtêðtãðtÜðtÕðtÎðtÇðtÀðt¹ðt²ðt«ðt¤ðtðt–ðtðtˆðtðtzðtsðtlðteðt^ðtWðtPðtIðtBðt;ðt4ðt-ðt&ðtðtðtðt ðtðtüïtõïtîïtçïtàïtÙïtÒïtËïtÄït½ït¶ït¯ït¨ït¡ïtšït“ïtŒït…ït~ïtwïtpïtiïtbït[ïtTïtMïtFït?ït8ït1ït*ït#ïtïtïtïtïtïtùîtòîtëîtäîtÝîtÖîtÏîtÈîtÁîtºît³ît¬ît¥îtžît—îtît‰ît‚ît{îttîtmîtfît_îtXîtQîtJîtCît<ît5ît.ît'ît îtîtît îtîtýítöítïítèítáítÚítÓítÌítÅít¾ít·ít°ít©ít¢ít›ít”ítít†ítítxítqítjítcít\ítUítNítGít@ít9ít2ít+ít$ítítítítítítúìtóìtììtåìtÞìt×ìtÐìtÉìtÂìt»ìt´ìt­ìt¦ìtŸìt˜ìt‘ìtŠìtƒìt|ìtuìtnìtgìt`ìtYìtRìtKìtDìt=ìt6ìt/ìt(ìt!ìtìtìt ìtìtþët÷ëtðëtéëtâëtÛëtÔëtÍëtÆët¿ët¸ët±ëtªët£ëtœët•ëtŽët‡ët€ëtyëtrëtkëtdët]ëtVëtOëtHëtAët:ët3ët,ët%ëtëtëtët ëtëtûêtôêtíêtæêtßêtØêtÑêtÊêtÃêt¼êtµêt®êt§êt êt™êt’êt‹êt„êt}êtvêtoêthêtaêtZêtSêtLêtEêt>êt7êt0êt)êt"êtêtêt êtêtÿétøétñétêétãétÜétÕétÎétÇétÀét¹ét²ét«ét¤étét–ététˆététzétsétléteét^étWétPétIétBét;ét4ét-ét&étététét ététüètõètîètçètàètÙètÒètËètÄèt½èt¶èt¯èt¨èt¡ètšèt“ètŒèt…èt~ètwètpètiètbèt[ètTètMètFèt?èt8èt1èt*èt#ètètètètètètùçtòçtëçtäçtÝçtÖçtÏçtÈçtÁçtºçt³çt¬çt¥çtžçt—çtçt‰çt‚çt{çttçtmçtfçt_çtXçtQçtJçtCçt<çt5çt.çt'çt çtçtçt çtçtýætöætïætèætáætÚætÓætÌætÅæt¾æt·æt°æt©æt¢æt›æt”ætæt†ætætxætqætjætcæt\ætUætNætGæt@æt9æt2æt+æt$ætætætætætætúåtóåtìåtååtÞåt×åtÐåtÉåtÂåt»åt´åt­åt¦åtŸåt˜åt‘åtŠåtƒåt|åtuåtnåtgåt`åtYåtRåtKåtDåt=åt6åt/åt(åt!åtåtåt åtåtþät÷ätðätéätâätÛätÔätÍätÆät¿ät¸ät±ätªät£ätœät•ätŽät‡ät€ätyäträtkätdät]ätVätOätHätAät:ät3ät,ät%ätätätät ätätûãtôãtíãtæãtßãtØãtÑãtÊãtÃãt¼ãtµãt®ãt§ãt ãt™ãt’ãt‹ãt„ãt}ãtvãtoãthãtaãtZãtSãtLãtEãt>ãt7ãt0ãt)ãt"ãtãtãt ãtãtÿâtøâtñâtêâtãâtÜâtÕâtÎâtÇâtÀât¹ât²ât«ât¤âtât–âtâtˆâtâtzâtsâtlâteât^âtWâtPâtIâtBât;ât4ât-ât&âtâtâtât âtâtüátõátîátçátàátÙátÒátËátÄát½át¶át¯át¨át¡átšát“átŒát…át~átwátpátiátbát[átTátMátFát?át8át1át*át#átátátátátátùàtòàtëàtäàtÝàtÖàtÏàtÈàtÁàtºàt³àt¬àt¥àtžàt—àtàt‰àt‚àt{àttàtmàtfàt_àtXàtQàtJàtCàt<àt5àt.àt'àt àtàtàt àtàtýßtößtïßtèßtáßtÚßtÓßtÌßtÅßt¾ßt·ßt°ßt©ßt¢ßt›ßt”ßtßt†ßtßtxßtqßtjßtcßt\ßtUßtNßtGßt@ßt9ßt2ßt+ßt$ßtßtßtßtßtßtúÞtóÞtìÞtåÞtÞÞt×ÞtÐÞtÉÞtÂÞt»Þt´Þt­Þt¦ÞtŸÞt˜Þt‘ÞtŠÞtƒÞt|ÞtuÞtnÞtgÞt`ÞtYÞtRÞtKÞtDÞt=Þt6Þt/Þt(Þt!ÞtÞtÞt ÞtÞtþÝt÷ÝtðÝtéÝtâÝtÛÝtÔÝtÍÝtÆÝt¿Ýt¸Ýt±ÝtªÝt£ÝtœÝt•ÝtŽÝt‡Ýt€ÝtyÝtrÝtkÝtdÝt]ÝtVÝtOÝtHÝtAÝt:Ýt3Ýt,Ýt%ÝtÝtÝtÝt ÝtÝtûÜtôÜtíÜtæÜtßÜtØÜtÑÜtÊÜtÃÜt¼ÜtµÜt®Üt§Üt Üt™Üt’Üt‹Üt„Üt}ÜtvÜtoÜthÜtaÜtZÜtSÜtLÜtEÜt>Üt7Üt0Üt)Üt"ÜtÜtÜt ÜtÜtÿÛtøÛtñÛtêÛtãÛtÜÛtÕÛtÎÛtÇÛtÀÛt¹Ût²Ût«Ût¤ÛtÛt–ÛtÛtˆÛtÛtzÛtsÛtlÛteÛt^ÛtWÛtPÛtIÛtBÛt;Ût4Ût-Ût&ÛtÛtÛtÛt ÛtÛtüÚtõÚtîÚtçÚtàÚtÙÚtÒÚtËÚtÄÚt½Út¶Út¯Út¨Út¡ÚtšÚt“ÚtŒÚt…Út~ÚtwÚtpÚtiÚtbÚt[ÚtTÚtMÚtFÚt?Út8Út1Út*Út#ÚtÚtÚtÚtÚtÚtùÙtòÙtëÙtäÙtÝÙtÖÙtÏÙtÈÙtÁÙtºÙt³Ùt¬Ùt¥ÙtžÙt—ÙtÙt‰Ùt‚Ùt{ÙttÙtmÙtfÙt_ÙtXÙtQÙtJÙtCÙt<Ùt5Ùt.Ùt'Ùt ÙtÙtÙt ÙtÙtýØtöØtïØtèØtáØtÚØtÓØtÌØtÅØt¾Øt·Øt°Øt©Øt¢Øt›Øt”ØtØt†ØtØtxØtqØtjØtcØt\ØtUØtNØtGØt@Øt9Øt2Øt+Øt$ØtØtØtØtØtØtú×tó×tì×tå×tÞ×t××tÐ×tÉ×tÂ×t»×t´×t­×t¦×tŸ×t˜×t‘×tŠ×tƒ×t|×tu×tn×tg×t`×tY×tR×tK×tD×t=×t6×t/×t(×t!×t×t×t ×t×tþÖt÷ÖtðÖtéÖtâÖtÛÖtÔÖtÍÖtÆÖt¿Öt¸Öt±ÖtªÖt£ÖtœÖt•ÖtŽÖt‡Öt€ÖtyÖtrÖtkÖtdÖt]ÖtVÖtOÖtHÖtAÖt:Öt3Öt,Öt%ÖtÖtÖtÖt ÖtÖtûÕtôÕtíÕtæÕtßÕtØÕtÑÕtÊÕtÃÕt¼ÕtµÕt®Õt§Õt Õt™Õt’Õt‹Õt„Õt}ÕtvÕtoÕthÕtaÕtZÕtSÕtLÕtEÕt>Õt7Õt0Õt)Õt"ÕtÕtÕt ÕtÕtÿÔtøÔtñÔtêÔtãÔtÜÔtÕÔtÎÔtÇÔtÀÔt¹Ôt²Ôt«Ôt¤ÔtÔt–ÔtÔtˆÔtÔtzÔtsÔtlÔteÔt^ÔtWÔtPÔtIÔtBÔt;Ôt4Ôt-Ôt&ÔtÔtÔtÔt ÔtÔtüÓtõÓtîÓtçÓtàÓtÙÓtÒÓtËÓtÄÓt½Ót¶Ót¯Ót¨Ót¡ÓtšÓt“ÓtŒÓt…Ót~ÓtwÓtpÓtiÓtbÓt[ÓtTÓtMÓtFÓt?Ót8Ót1Ót*Ót#ÓtÓtÓtÓtÓtÓtùÒtòÒtëÒtäÒtÝÒtÖÒtÏÒtÈÒtÁÒtºÒt³Òt¬Òt¥ÒtžÒt—ÒtÒt‰Òt‚Òt{ÒttÒtmÒtfÒt_ÒtXÒtQÒtJÒtCÒt<Òt5Òt.Òt'Òt ÒtÒtÒt ÒtÒtýÑtöÑtïÑtèÑtáÑtÚÑtÓÑtÌÑtÅÑt¾Ñt·Ñt°Ñt©Ñt¢Ñt›Ñt”ÑtÑt†ÑtÑtxÑtqÑtjÑtcÑt\ÑtUÑtNÑtGÑt@Ñt9Ñt2Ñt+Ñt$ÑtÑtÑtÑtÑtÑtúÐtóÐtìÐtåÐtÞÐt×ÐtÐÐtÉÐtÂÐt»Ðt´Ðt­Ðt¦ÐtŸÐt˜Ðt‘ÐtŠÐtƒÐt|ÐtuÐtnÐtgÐt`ÐtYÐtRÐtKÐtDÐt=Ðt6Ðt/Ðt(Ðt!ÐtÐtÐt ÐtÐtþÏt÷ÏtðÏtéÏtâÏtÛÏtÔÏtÍÏtÆÏt¿Ït¸Ït±ÏtªÏt£ÏtœÏt•ÏtŽÏt‡Ït€ÏtyÏtrÏtkÏtdÏt]ÏtVÏtOÏtHÏtAÏt:Ït3Ït,Ït%ÏtÏtÏtÏt ÏtÏtûÎtôÎtíÎtæÎtßÎtØÎtÑÎtÊÎtÃÎt¼ÎtµÎt®Ît§Ît Ît™Ît’Ît‹Ît„Ît}ÎtvÎtoÎthÎtaÎtZÎtSÎtLÎtEÎt>Ît7Ît0Ît)Ît"ÎtÎtÎt ÎtÎtÿÍtøÍtñÍtêÍtãÍtÜÍtÕÍtÎÍtÇÍtÀÍt¹Ít²Ít«Ít¤ÍtÍt–ÍtÍtˆÍtÍtzÍtsÍtlÍteÍt^ÍtWÍtPÍtIÍtBÍt;Ít4Ít-Ít&ÍtÍtÍtÍt ÍtÍtüÌtõÌtîÌtçÌtàÌtÙÌtÒÌtËÌtÄÌt½Ìt¶Ìt¯Ìt¨Ìt¡ÌtšÌt“ÌtŒÌt…Ìt~ÌtwÌtpÌtiÌtbÌt[ÌtTÌtMÌtFÌt?Ìt8Ìt1Ìt*Ìt#ÌtÌtÌtÌtÌtÌtùËtòËtëËtäËtÝËtÖËtÏËtÈËtÁËtºËt³Ët¬Ët¥ËtžËt—ËtËt‰Ët‚Ët{ËttËtmËtfËt_ËtXËtQËtJËtCËt<Ët5Ët.Ët'Ët ËtËtËt ËtËtýÊtöÊtïÊtèÊtáÊtÚÊtÓÊtÌÊtÅÊt¾Êt·Êt°Êt©Êt¢Êt›Êt”ÊtÊt†ÊtÊtxÊtqÊtjÊtcÊt\ÊtUÊtNÊtGÊt@Êt9Êt2Êt+Êt$ÊtÊtÊtÊtÊtÊtúÉtóÉtìÉtåÉtÞÉt×ÉtÐÉtÉÉtÂÉt»Ét´Ét­Ét¦ÉtŸÉt˜Ét‘ÉtŠÉtƒÉt|ÉtuÉtnÉtgÉt`ÉtYÉtRÉtKÉtDÉt=Ét6Ét/Ét(Ét!ÉtÉtÉt ÉtÉtþÈt÷ÈtðÈtéÈtâÈtÛÈtÔÈtÍÈtÆÈt¿Èt¸Èt±ÈtªÈt£ÈtœÈt•ÈtŽÈt‡Èt€ÈtyÈtrÈtkÈtdÈt]ÈtVÈtOÈtHÈtAÈt:Èt3Èt,Èt%ÈtÈtÈtÈt ÈtÈtûÇtôÇtíÇtæÇtßÇtØÇtÑÇtÊÇtÃÇt¼ÇtµÇt®Çt§Çt Çt™Çt’Çt‹Çt„Çt}ÇtvÇtoÇthÇtaÇtZÇtSÇtLÇtEÇt>Çt7Çt0Çt)Çt"ÇtÇtÇt ÇtÇtÿÆtøÆtñÆtêÆtãÆtÜÆtÕÆtÎÆtÇÆtÀÆt¹Æt²Æt«Æt¤ÆtÆt–ÆtÆtˆÆtÆtzÆtsÆtlÆteÆt^ÆtWÆtPÆtIÆtBÆt;Æt4Æt-Æt&ÆtÆtÆtÆt ÆtÆtüÅtõÅtîÅtçÅtàÅtÙÅtÒÅtËÅtÄÅt½Åt¶Åt¯Åt¨Åt¡ÅtšÅt“ÅtŒÅt…Åt~ÅtwÅtpÅtiÅtbÅt[ÅtTÅtMÅtFÅt?Åt8Åt1Åt*Åt#ÅtÅtÅtÅtÅtÅtùÄtòÄtëÄtäÄtÝÄtÖÄtÏÄtÈÄtÁÄtºÄt³Ät¬Ät¥ÄtžÄt—ÄtÄt‰Ät‚Ät{ÄttÄtmÄtfÄt_ÄtXÄtQÄtJÄtCÄt<Ät5Ät.Ät'Ät ÄtÄtÄt ÄtÄtýÃtöÃtïÃtèÃtáÃtÚÃtÓÃtÌÃtÅÃt¾Ãt·Ãt°Ãt©Ãt¢Ãt›Ãt”ÃtÃt†ÃtÃtxÃtqÃtjÃtcÃt\ÃtUÃtNÃtGÃt@Ãt9Ãt2Ãt+Ãt$ÃtÃtÃtÃtÃtÃtúÂtóÂtìÂtåÂtÞÂt×ÂtÐÂtÉÂtÂÂt»Ât´Ât­Ât¦ÂtŸÂt˜Ât‘ÂtŠÂtƒÂt|ÂtuÂtnÂtgÂt`ÂtYÂtRÂtKÂtDÂt=Ât6Ât/Ât(Ât!ÂtÂtÂt ÂtÂtþÁt÷ÁtðÁtéÁtâÁtÛÁtÔÁtÍÁtÆÁt¿Át¸Át±ÁtªÁt£ÁtœÁt•ÁtŽÁt‡Át€ÁtyÁtrÁtkÁtdÁt]ÁtVÁtOÁtHÁtAÁt:Át3Át,Át%ÁtÁtÁtÁt ÁtÁtûÀtôÀtíÀtæÀtßÀtØÀtÑÀtÊÀtÃÀt¼ÀtµÀt®Àt§Àt Àt™Àt’Àt‹Àt„Àt}ÀtvÀtoÀthÀtaÀtZÀtSÀtLÀtEÀt>Àt7Àt0Àt)Àt"ÀtÀtÀt ÀtÀtÿ¿tø¿tñ¿tê¿tã¿tÜ¿tÕ¿tοtÇ¿tÀ¿t¹¿t²¿t«¿t¤¿t¿t–¿t¿tˆ¿t¿tz¿ts¿tl¿te¿t^¿tW¿tP¿tI¿tB¿t;¿t4¿t-¿t&¿t¿t¿t¿t ¿t¿tü¾tõ¾tî¾tç¾tà¾tÙ¾tÒ¾t˾tľt½¾t¶¾t¯¾t¨¾t¡¾tš¾t“¾tŒ¾t…¾t~¾tw¾tp¾ti¾tb¾t[¾tT¾tM¾tF¾t?¾t8¾t1¾t*¾t#¾t¾t¾t¾t¾t¾tù½tò½të½tä½tݽtÖ½tϽtȽtÁ½tº½t³½t¬½t¥½tž½t—½t½t‰½t‚½t{½tt½tm½tf½t_½tX½tQ½tJ½tC½t<½t5½t.½t'½t ½t½t½t ½t½tý¼tö¼tï¼tè¼tá¼tÚ¼tÓ¼t̼tżt¾¼t·¼t°¼t©¼t¢¼t›¼t”¼t¼t†¼t¼tx¼tq¼tj¼tc¼t\¼tU¼tN¼tG¼t@¼t9¼t2¼t+¼t$¼t¼t¼t¼t¼t¼tú»tó»tì»tå»tÞ»t×»tлtÉ»t»t»»t´»t­»t¦»tŸ»t˜»t‘»tŠ»tƒ»t|»tu»tn»tg»t`»tY»tR»tK»tD»t=»t6»t/»t(»t!»t»t»t »t»tþºt÷ºtðºtéºtâºtÛºtÔºtͺtƺt¿ºt¸ºt±ºtªºt£ºtœºt•ºtŽºt‡ºt€ºtyºtrºtkºtdºt]ºtVºtOºtHºtAºt:ºt3ºt,ºt%ºtºtºtºt ºtºtû¹tô¹tí¹tæ¹tß¹tعtѹtʹtùt¼¹tµ¹t®¹t§¹t ¹t™¹t’¹t‹¹t„¹t}¹tv¹to¹th¹ta¹tZ¹tS¹tL¹tE¹t>¹t7¹t0¹t)¹t"¹t¹t¹t ¹t¹tÿ¸tø¸tñ¸tê¸tã¸tܸtÕ¸tθtǸtÀ¸t¹¸t²¸t«¸t¤¸t¸t–¸t¸tˆ¸t¸tz¸ts¸tl¸te¸t^¸tW¸tP¸tI¸tB¸t;¸t4¸t-¸t&¸t¸t¸t¸t ¸t¸tü·tõ·tî·tç·tà·tÙ·tÒ·tË·tÄ·t½·t¶·t¯·t¨·t¡·tš·t“·tŒ·t…·t~·tw·tp·ti·tb·t[·tT·tM·tF·t?·t8·t1·t*·t#·t·t·t·t·t·tù¶tò¶të¶tä¶tݶtÖ¶t϶tȶtÁ¶tº¶t³¶t¬¶t¥¶tž¶t—¶t¶t‰¶t‚¶t{¶tt¶tm¶tf¶t_¶tX¶tQ¶tJ¶tC¶t<¶t5¶t.¶t'¶t ¶t¶t¶t ¶t¶týµtöµtïµtèµtáµtÚµtÓµt̵tŵt¾µt·µt°µt©µt¢µt›µt”µtµt†µtµtxµtqµtjµtcµt\µtUµtNµtGµt@µt9µt2µt+µt$µtµtµtµtµtµtú´tó´tì´tå´tÞ´t×´tдtÉ´t´t»´t´´t­´t¦´tŸ´t˜´t‘´tŠ´tƒ´t|´tu´tn´tg´t`´tY´tR´tK´tD´t=´t6´t/´t(´t!´t´t´t ´t´tþ³t÷³tð³té³tâ³tÛ³tÔ³tͳtƳt¿³t¸³t±³tª³t£³tœ³t•³t޳t‡³t€³ty³tr³tk³td³t]³tV³tO³tH³tA³t:³t3³t,³t%³t³t³t³t ³t³tû²tô²tí²tæ²tß²tزtѲtʲtòt¼²tµ²t®²t§²t ²t™²t’²t‹²t„²t}²tv²to²th²ta²tZ²tS²tL²tE²t>²t7²t0²t)²t"²t²t²t ²t²tÿ±tø±tñ±tê±tã±tܱtÕ±tαtDZtÀ±t¹±t²±t«±t¤±t±t–±t±tˆ±t±tz±ts±tl±te±t^±tW±tP±tI±tB±t;±t4±t-±t&±t±t±t±t ±t±tü°tõ°tî°tç°tà°tÙ°tÒ°t˰tİt½°t¶°t¯°t¨°t¡°tš°t“°tŒ°t…°t~°tw°tp°ti°tb°t[°tT°tM°tF°t?°t8°t1°t*°t#°t°t°t°t°t°tù¯tò¯të¯tä¯tݯtÖ¯tϯtȯtÁ¯tº¯t³¯t¬¯t¥¯tž¯t—¯t¯t‰¯t‚¯t{¯tt¯tm¯tf¯t_¯tX¯tQ¯tJ¯tC¯t<¯t5¯t.¯t'¯t ¯t¯t¯t ¯t¯tý®tö®tï®tè®tá®tÚ®tÓ®tÌ®tÅ®t¾®t·®t°®t©®t¢®t›®t”®t®t†®t®tx®tq®tj®tc®t\®tU®tN®tG®t@®t9®t2®t+®t$®t®t®t®t®t®tú­tó­tì­tå­tÞ­t×­tЭtÉ­t­t»­t´­t­­t¦­tŸ­t˜­t‘­tŠ­tƒ­t|­tu­tn­tg­t`­tY­tR­tK­tD­t=­t6­t/­t(­t!­t­t­t ­t­tþ¬t÷¬tð¬té¬tâ¬tÛ¬tÔ¬tͬtƬt¿¬t¸¬t±¬tª¬t£¬tœ¬t•¬tެt‡¬t€¬ty¬tr¬tk¬td¬t]¬tV¬tO¬tH¬tA¬t:¬t3¬t,¬t%¬t¬t¬t¬t ¬t¬tû«tô«tí«tæ«tß«tØ«tÑ«tÊ«tët¼«tµ«t®«t§«t «t™«t’«t‹«t„«t}«tv«to«th«ta«tZ«tS«tL«tE«t>«t7«t0«t)«t"«t«t«t «t«tÿªtøªtñªtêªtãªtܪtÕªtΪtǪtÀªt¹ªt²ªt«ªt¤ªtªt–ªtªtˆªtªtzªtsªtlªteªt^ªtWªtPªtIªtBªt;ªt4ªt-ªt&ªtªtªtªt ªtªtü©tõ©tî©tç©tà©tÙ©tÒ©tË©tÄ©t½©t¶©t¯©t¨©t¡©tš©t“©tŒ©t…©t~©tw©tp©ti©tb©t[©tT©tM©tF©t?©t8©t1©t*©t#©t©t©t©t©t©tù¨tò¨të¨tä¨tݨtÖ¨tϨtȨtÁ¨tº¨t³¨t¬¨t¥¨tž¨t—¨t¨t‰¨t‚¨t{¨tt¨tm¨tf¨t_¨tX¨tQ¨tJ¨tC¨t<¨t5¨t.¨t'¨t ¨t¨t¨t ¨t¨tý§tö§tï§tè§tá§tÚ§tÓ§ţtŧt¾§t·§t°§t©§t¢§t›§t”§t§t†§t§tx§tq§tj§tc§t\§tU§tN§tG§t@§t9§t2§t+§t$§t§t§t§t§t§tú¦tó¦tì¦tå¦tÞ¦tצtЦtɦt¦t»¦t´¦t­¦t¦¦tŸ¦t˜¦t‘¦tЦtƒ¦t|¦tu¦tn¦tg¦t`¦tY¦tR¦tK¦tD¦t=¦t6¦t/¦t(¦t!¦t¦t¦t ¦t¦tþ¥t÷¥tð¥té¥tâ¥tÛ¥tÔ¥tÍ¥tÆ¥t¿¥t¸¥t±¥tª¥t£¥tœ¥t•¥tŽ¥t‡¥t€¥ty¥tr¥tk¥td¥t]¥tV¥tO¥tH¥tA¥t:¥t3¥t,¥t%¥t¥t¥t¥t ¥t¥tû¤tô¤tí¤tæ¤tߤtؤtѤtʤtät¼¤tµ¤t®¤t§¤t ¤t™¤t’¤t‹¤t„¤t}¤tv¤to¤th¤ta¤tZ¤tS¤tL¤tE¤t>¤t7¤t0¤t)¤t"¤t¤t¤t ¤t¤tÿ£tø£tñ£tê£tã£tÜ£tÕ£tΣtÇ£tÀ£t¹£t²£t«£t¤£t£t–£t£tˆ£t£tz£ts£tl£te£t^£tW£tP£tI£tB£t;£t4£t-£t&£t£t£t£t £t£tü¢tõ¢tî¢tç¢tà¢tÙ¢tÒ¢tË¢tÄ¢t½¢t¶¢t¯¢t¨¢t¡¢tš¢t“¢tŒ¢t…¢t~¢tw¢tp¢ti¢tb¢t[¢tT¢tM¢tF¢t?¢t8¢t1¢t*¢t#¢t¢t¢t¢t¢t¢tù¡tò¡të¡tä¡tÝ¡tÖ¡tÏ¡tÈ¡tÁ¡tº¡t³¡t¬¡t¥¡tž¡t—¡t¡t‰¡t‚¡t{¡tt¡tm¡tf¡t_¡tX¡tQ¡tJ¡tC¡t<¡t5¡t.¡t'¡t ¡t¡t¡t ¡t¡tý tö tï tè tá tÚ tÓ tÌ tÅ t¾ t· t° t© t¢ t› t” t t† t tx tq tj tc t\ tU tN tG t@ t9 t2 t+ t$ t t t t t túŸtóŸtìŸtåŸtÞŸtןtПtÉŸtŸt»Ÿt´Ÿt­Ÿt¦ŸtŸŸt˜Ÿt‘ŸtŠŸtƒŸt|ŸtuŸtnŸtgŸt`ŸtYŸtRŸtKŸtDŸt=Ÿt6Ÿt/Ÿt(Ÿt!ŸtŸtŸt ŸtŸtþžt÷žtðžtéžtâžtÛžtÔžtÍžtÆžt¿žt¸žt±žtªžt£žtœžt•žtŽžt‡žt€žtyžtržtkžtdžt]žtVžtOžtHžtAžt:žt3žt,žt%žtžtžtžt žtžtûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿœtøœtñœtêœtãœtÜœtÕœtΜtÇœtÀœt¹œt²œt«œt¤œtœt–œtœtˆœtœtzœtsœtlœteœt^œtWœtPœtIœtBœt;œt4œt-œt&œtœtœtœt œtœtü›tõ›tî›tç›tà›tÙ›tÒ›tË›tÄ›t½›t¶›t¯›t¨›t¡›tš›t“›tŒ›t…›t~›tw›tp›ti›tb›t[›tT›tM›tF›t?›t8›t1›t*›t#›t›t›t›t›t›tùštòštëštäštÝštÖštÏštÈštÁštºšt³št¬št¥štžšt—štšt‰št‚št{šttštmštfšt_štXštQštJštCšt<št5št.št'št štštšt štštý™tö™tï™tè™tá™tÚ™tÓ™tÌ™tÅ™t¾™t·™t°™t©™t¢™t›™t”™t™t†™t™tx™tq™tj™tc™t\™tU™tN™tG™t@™t9™t2™t+™t$™t™t™t™t™t™tú˜tó˜tì˜tå˜tÞ˜tטtИtɘt˜t»˜t´˜t­˜t¦˜tŸ˜t˜˜t‘˜tŠ˜tƒ˜t|˜tu˜tn˜tg˜t`˜tY˜tR˜tK˜tD˜t=˜t6˜t/˜t(˜t!˜t˜t˜t ˜t˜tþ—t÷—tð—té—tâ—tÛ—tÔ—tÍ—tÆ—t¿—t¸—t±—tª—t£—tœ—t•—tŽ—t‡—t€—ty—tr—tk—td—t]—tV—tO—tH—tA—t:—t3—t,—t%—t—t—t—t —t—tû–tô–tí–tæ–tß–tØ–tÑ–tÊ–tÖt¼–tµ–t®–t§–t –t™–t’–t‹–t„–t}–tv–to–th–ta–tZ–tS–tL–tE–t>–t7–t0–t)–t"–t–t–t –t–tÿ•tø•tñ•tê•tã•tÜ•tÕ•tΕtÇ•tÀ•t¹•t²•t«•t¤•t•t–•t•tˆ•t•tz•ts•tl•te•t^•tW•tP•tI•tB•t;•t4•t-•t&•t•t•t•t •t•tü”tõ”tî”tç”tà”tÙ”tÒ”tË”tÄ”t½”t¶”t¯”t¨”t¡”tš”t“”tŒ”t…”t~”tw”tp”ti”tb”t[”tT”tM”tF”t?”t8”t1”t*”t#”t”t”t”t”t”tù“tò“të“tä“tÝ“tÖ“tÏ“tÈ“tÁ“tº“t³“t¬“t¥“tž“t—“t“t‰“t‚“t{“tt“tm“tf“t_“tX“tQ“tJ“tC“t<“t5“t.“t'“t “t“t“t “t“tý’tö’tï’tè’tá’tÚ’tÓ’tÌ’tÅ’t¾’t·’t°’t©’t¢’t›’t”’t’t†’t’tx’tq’tj’tc’t\’tU’tN’tG’t@’t9’t2’t+’t$’t’t’t’t’t’tú‘tó‘tì‘tå‘tÞ‘tבtБtÉ‘t‘t»‘t´‘t­‘t¦‘tŸ‘t˜‘t‘‘tŠ‘tƒ‘t|‘tu‘tn‘tg‘t`‘tY‘tR‘tK‘tD‘t=‘t6‘t/‘t(‘t!‘t‘t‘t ‘t‘tþt÷tðtétâtÛtÔtÍtÆt¿t¸t±tªt£tœt•tŽt‡t€tytrtktdt]tVtOtHtAt:t3t,t%tttt ttûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿŽtøŽtñŽtêŽtãŽtÜŽtÕŽtÎŽtÇŽtÀŽt¹Žt²Žt«Žt¤ŽtŽt–ŽtŽtˆŽtŽtzŽtsŽtlŽteŽt^ŽtWŽtPŽtIŽtBŽt;Žt4Žt-Žt&ŽtŽtŽtŽt ŽtŽtütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùŒtòŒtëŒtäŒtÝŒtÖŒtÏŒtÈŒtÁŒtºŒt³Œt¬Œt¥ŒtžŒt—ŒtŒt‰Œt‚Œt{ŒttŒtmŒtfŒt_ŒtXŒtQŒtJŒtCŒt<Œt5Œt.Œt'Œt ŒtŒtŒt ŒtŒtý‹tö‹tï‹tè‹tá‹tÚ‹tÓ‹tÌ‹tÅ‹t¾‹t·‹t°‹t©‹t¢‹t›‹t”‹t‹t†‹t‹tx‹tq‹tj‹tc‹t\‹tU‹tN‹tG‹t@‹t9‹t2‹t+‹t$‹t‹t‹t‹t‹t‹túŠtóŠtìŠtåŠtÞŠt׊tЊtÉŠtŠt»Št´Št­Št¦ŠtŸŠt˜Št‘ŠtŠŠtƒŠt|ŠtuŠtnŠtgŠt`ŠtYŠtRŠtKŠtDŠt=Št6Št/Št(Št!ŠtŠtŠt ŠtŠtþ‰t÷‰tð‰té‰tâ‰tÛ‰tÔ‰t͉tƉt¿‰t¸‰t±‰tª‰t£‰tœ‰t•‰tމt‡‰t€‰ty‰tr‰tk‰td‰t]‰tV‰tO‰tH‰tA‰t:‰t3‰t,‰t%‰t‰t‰t‰t ‰t‰tûˆtôˆtíˆtæˆt߈t؈tшtʈtÈt¼ˆtµˆt®ˆt§ˆt ˆt™ˆt’ˆt‹ˆt„ˆt}ˆtvˆtoˆthˆtaˆtZˆtSˆtLˆtEˆt>ˆt7ˆt0ˆt)ˆt"ˆtˆtˆt ˆtˆtÿ‡tø‡tñ‡tê‡tã‡t܇tÕ‡t·tLJtÀ‡t¹‡t²‡t«‡t¤‡t‡t–‡t‡tˆ‡t‡tz‡ts‡tl‡te‡t^‡tW‡tP‡tI‡tB‡t;‡t4‡t-‡t&‡t‡t‡t‡t ‡t‡tü†tõ†tî†tç†tà†tÙ†tÒ†tˆtĆt½†t¶†t¯†t¨†t¡†tš†t“†tŒ†t…†t~†tw†tp†ti†tb†t[†tT†tM†tF†t?†t8†t1†t*†t#†t†t†t†t†t†tù…tò…të…tä…tÝ…tÖ…tÏ…tÈ…tÁ…tº…t³…t¬…t¥…tž…t—…t…t‰…t‚…t{…tt…tm…tf…t_…tX…tQ…tJ…tC…t<…t5…t.…t'…t …t…t…t …t…tý„tö„tï„tè„tá„tÚ„tÓ„tÌ„tÅ„t¾„t·„t°„t©„t¢„t›„t”„t„t†„t„tx„tq„tj„tc„t\„tU„tN„tG„t@„t9„t2„t+„t$„t„t„t„t„t„túƒtóƒtìƒtåƒtÞƒt׃tЃtɃtƒt»ƒt´ƒt­ƒt¦ƒtŸƒt˜ƒt‘ƒtŠƒtƒƒt|ƒtuƒtnƒtgƒt`ƒtYƒtRƒtKƒtDƒt=ƒt6ƒt/ƒt(ƒt!ƒtƒtƒt ƒtƒtþ‚t÷‚tð‚té‚tâ‚tÛ‚tÔ‚tÍ‚tÆ‚t¿‚t¸‚t±‚tª‚t£‚tœ‚t•‚tŽ‚t‡‚t€‚ty‚tr‚tk‚td‚t]‚tV‚tO‚tH‚tA‚t:‚t3‚t,‚t%‚t‚t‚t‚t ‚t‚tûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿ€tø€tñ€tê€tã€tÜ€tÕ€t΀tÇ€tÀ€t¹€t²€t«€t¤€t€t–€t€tˆ€t€tz€ts€tl€te€t^€tW€tP€tI€tB€t;€t4€t-€t&€t€t€t€t €t€tütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttù~tò~të~tä~tÝ~tÖ~tÏ~tÈ~tÁ~tº~t³~t¬~t¥~tž~t—~t~t‰~t‚~t{~tt~tm~tf~t_~tX~tQ~tJ~tC~t<~t5~t.~t'~t ~t~t~t ~t~tý}tö}tï}tè}tá}tÚ}tÓ}tÌ}tÅ}t¾}t·}t°}t©}t¢}t›}t”}t}t†}t}tx}tq}tj}tc}t\}tU}tN}tG}t@}t9}t2}t+}t$}t}t}t}t}t}tú|tó|tì|tå|tÞ|t×|tÐ|tÉ|tÂ|t»|t´|t­|t¦|tŸ|t˜|t‘|tŠ|tƒ|t||tu|tn|tg|t`|tY|tR|tK|tD|t=|t6|t/|t(|t!|t|t|t |t|tþ{t÷{tð{té{tâ{tÛ{tÔ{tÍ{tÆ{t¿{t¸{t±{tª{t£{tœ{t•{tŽ{t‡{t€{ty{tr{tk{td{t]{tV{tO{tH{tA{t:{t3{t,{t%{t{t{t{t {t{tûztôztíztæztßztØztÑztÊztÃzt¼ztµzt®zt§zt zt™zt’zt‹zt„zt}ztvztozthztaztZztSztLztEzt>zt7zt0zt)zt"ztztzt ztztÿytøytñytêytãytÜytÕytÎytÇytÀyt¹yt²yt«yt¤ytyt–ytytˆytytzytsytlyteyt^ytWytPytIytByt;yt4yt-yt&ytytytyt ytytüxtõxtîxtçxtàxtÙxtÒxtËxtÄxt½xt¶xt¯xt¨xt¡xtšxt“xtŒxt…xt~xtwxtpxtixtbxt[xtTxtMxtFxt?xt8xt1xt*xt#xtxtxtxtxtxtùwtòwtëwtäwtÝwtÖwtÏwtÈwtÁwtºwt³wt¬wt¥wtžwt—wtwt‰wt‚wt{wttwtmwtfwt_wtXwtQwtJwtCwtst7st0st)st"ststst ststÿrtørtñrtêrtãrtÜrtÕrtÎrtÇrtÀrt¹rt²rt«rt¤rtrt–rtrtˆrtrtzrtsrtlrtert^rtWrtPrtIrtBrt;rt4rt-rt&rtrtrtrt rtrtüqtõqtîqtçqtàqtÙqtÒqtËqtÄqt½qt¶qt¯qt¨qt¡qtšqt“qtŒqt…qt~qtwqtpqtiqtbqt[qtTqtMqtFqt?qt8qt1qt*qt#qtqtqtqtqtqtùptòptëptäptÝptÖptÏptÈptÁptºpt³pt¬pt¥ptžpt—ptpt‰pt‚pt{pttptmptfpt_ptXptQptJptCptlt7lt0lt)lt"ltltlt ltltÿktøktñktêktãktÜktÕktÎktÇktÀkt¹kt²kt«kt¤ktkt–ktktˆktktzktsktlktekt^ktWktPktIktBkt;kt4kt-kt&ktktktkt ktktüjtõjtîjtçjtàjtÙjtÒjtËjtÄjt½jt¶jt¯jt¨jt¡jtšjt“jtŒjt…jt~jtwjtpjtijtbjt[jtTjtMjtFjt?jt8jt1jt*jt#jtjtjtjtjtjtùitòitëitäitÝitÖitÏitÈitÁitºit³it¬it¥itžit—itit‰it‚it{ittitmitfit_itXitQitJitCitet7et0et)et"etetet etetÿdtødtñdtêdtãdtÜdtÕdtÎdtÇdtÀdt¹dt²dt«dt¤dtdt–dtdtˆdtdtzdtsdtldtedt^dtWdtPdtIdtBdt;dt4dt-dt&dtdtdtdt dtdtüctõctîctçctàctÙctÒctËctÄct½ct¶ct¯ct¨ct¡ctšct“ctŒct…ct~ctwctpctictbct[ctTctMctFct?ct8ct1ct*ct#ctctctctctctùbtòbtëbtäbtÝbtÖbtÏbtÈbtÁbtºbt³bt¬bt¥btžbt—btbt‰bt‚bt{bttbtmbtfbt_btXbtQbtJbtCbt^t7^t0^t)^t"^t^t^t ^t^tÿ]tø]tñ]tê]tã]tÜ]tÕ]tÎ]tÇ]tÀ]t¹]t²]t«]t¤]t]t–]t]tˆ]t]tz]ts]tl]te]t^]tW]tP]tI]tB]t;]t4]t-]t&]t]t]t]t ]t]tü\tõ\tî\tç\tà\tÙ\tÒ\tË\tÄ\t½\t¶\t¯\t¨\t¡\tš\t“\tŒ\t…\t~\tw\tp\ti\tb\t[\tT\tM\tF\t?\t8\t1\t*\t#\t\t\t\t\t\tù[tò[të[tä[tÝ[tÖ[tÏ[tÈ[tÁ[tº[t³[t¬[t¥[tž[t—[t[t‰[t‚[t{[tt[tm[tf[t_[tX[tQ[tJ[tC[t<[t5[t.[t'[t [t[t[t [t[týZtöZtïZtèZtáZtÚZtÓZtÌZtÅZt¾Zt·Zt°Zt©Zt¢Zt›Zt”ZtZt†ZtZtxZtqZtjZtcZt\ZtUZtNZtGZt@Zt9Zt2Zt+Zt$ZtZtZtZtZtZtúYtóYtìYtåYtÞYt×YtÐYtÉYtÂYt»Yt´Yt­Yt¦YtŸYt˜Yt‘YtŠYtƒYt|YtuYtnYtgYt`YtYYtRYtKYtDYt=Yt6Yt/Yt(Yt!YtYtYt YtYtþXt÷XtðXtéXtâXtÛXtÔXtÍXtÆXt¿Xt¸Xt±XtªXt£XtœXt•XtŽXt‡Xt€XtyXtrXtkXtdXt]XtVXtOXtHXtAXt:Xt3Xt,Xt%XtXtXtXt XtXtûWtôWtíWtæWtßWtØWtÑWtÊWtÃWt¼WtµWt®Wt§Wt Wt™Wt’Wt‹Wt„Wt}WtvWtoWthWtaWtZWtSWtLWtEWt>Wt7Wt0Wt)Wt"WtWtWt WtWtÿVtøVtñVtêVtãVtÜVtÕVtÎVtÇVtÀVt¹Vt²Vt«Vt¤VtVt–VtVtˆVtVtzVtsVtlVteVt^VtWVtPVtIVtBVt;Vt4Vt-Vt&VtVtVtVt VtVtüUtõUtîUtçUtàUtÙUtÒUtËUtÄUt½Ut¶Ut¯Ut¨Ut¡UtšUt“UtŒUt…Ut~UtwUtpUtiUtbUt[UtTUtMUtFUt?Ut8Ut1Ut*Ut#UtUtUtUtUtUtùTtòTtëTtäTtÝTtÖTtÏTtÈTtÁTtºTt³Tt¬Tt¥TtžTt—TtTt‰Tt‚Tt{TttTtmTtfTt_TtXTtQTtJTtCTtPt7Pt0Pt)Pt"PtPtPt PtPtÿOtøOtñOtêOtãOtÜOtÕOtÎOtÇOtÀOt¹Ot²Ot«Ot¤OtOt–OtOtˆOtOtzOtsOtlOteOt^OtWOtPOtIOtBOt;Ot4Ot-Ot&OtOtOtOt OtOtüNtõNtîNtçNtàNtÙNtÒNtËNtÄNt½Nt¶Nt¯Nt¨Nt¡NtšNt“NtŒNt…Nt~NtwNtpNtiNtbNt[NtTNtMNtFNt?Nt8Nt1Nt*Nt#NtNtNtNtNtNtùMtòMtëMtäMtÝMtÖMtÏMtÈMtÁMtºMt³Mt¬Mt¥MtžMt—MtMt‰Mt‚Mt{MttMtmMtfMt_MtXMtQMtJMtCMtIt7It0It)It"ItItIt ItItÿHtøHtñHtêHtãHtÜHtÕHtÎHtÇHtÀHt¹Ht²Ht«Ht¤HtHt–HtHtˆHtHtzHtsHtlHteHt^HtWHtPHtIHtBHt;Ht4Ht-Ht&HtHtHtHt HtHtüGtõGtîGtçGtàGtÙGtÒGtËGtÄGt½Gt¶Gt¯Gt¨Gt¡GtšGt“GtŒGt…Gt~GtwGtpGtiGtbGt[GtTGtMGtFGt?Gt8Gt1Gt*Gt#GtGtGtGtGtGtùFtòFtëFtäFtÝFtÖFtÏFtÈFtÁFtºFt³Ft¬Ft¥FtžFt—FtFt‰Ft‚Ft{FttFtmFtfFt_FtXFtQFtJFtCFtBt7Bt0Bt)Bt"BtBtBt BtBtÿAtøAtñAtêAtãAtÜAtÕAtÎAtÇAtÀAt¹At²At«At¤AtAt–AtAtˆAtAtzAtsAtlAteAt^AtWAtPAtIAtBAt;At4At-At&AtAtAtAt AtAtü@tõ@tî@tç@tà@tÙ@tÒ@tË@tÄ@t½@t¶@t¯@t¨@t¡@tš@t“@tŒ@t…@t~@tw@tp@ti@tb@t[@tT@tM@tF@t?@t8@t1@t*@t#@t@t@t@t@t@tù?tò?të?tä?tÝ?tÖ?tÏ?tÈ?tÁ?tº?t³?t¬?t¥?tž?t—?t?t‰?t‚?t{?tt?tm?tf?t_?tX?tQ?tJ?tC?ttö>tï>tè>tá>tÚ>tÓ>tÌ>tÅ>t¾>t·>t°>t©>t¢>t›>t”>t>t†>t>tx>tq>tj>tc>t\>tU>tN>tG>t@>t9>t2>t+>t$>t>t>t>t>t>tú=tó=tì=tå=tÞ=t×=tÐ=tÉ=tÂ=t»=t´=t­=t¦=tŸ=t˜=t‘=tŠ=tƒ=t|=tu=tn=tg=t`=tY=tR=tK=tD=t==t6=t/=t(=t!=t=t=t =t=tþ;t7;t0;t);t";t;t;t ;t;tÿ:tø:tñ:tê:tã:tÜ:tÕ:tÎ:tÇ:tÀ:t¹:t²:t«:t¤:t:t–:t:tˆ:t:tz:ts:tl:te:t^:tW:tP:tI:tB:t;:t4:t-:t&:t:t:t:t :t:tü9tõ9tî9tç9tà9tÙ9tÒ9tË9tÄ9t½9t¶9t¯9t¨9t¡9tš9t“9tŒ9t…9t~9tw9tp9ti9tb9t[9tT9tM9tF9t?9t89t19t*9t#9t9t9t9t9t9tù8tò8të8tä8tÝ8tÖ8tÏ8tÈ8tÁ8tº8t³8t¬8t¥8tž8t—8t8t‰8t‚8t{8tt8tm8tf8t_8tX8tQ8tJ8tC8t<8t58t.8t'8t 8t8t8t 8t8tý7tö7tï7tè7tá7tÚ7tÓ7tÌ7tÅ7t¾7t·7t°7t©7t¢7t›7t”7t7t†7t7tx7tq7tj7tc7t\7tU7tN7tG7t@7t97t27t+7t$7t7t7t7t7t7tú6tó6tì6tå6tÞ6t×6tÐ6tÉ6tÂ6t»6t´6t­6t¦6tŸ6t˜6t‘6tŠ6tƒ6t|6tu6tn6tg6t`6tY6tR6tK6tD6t=6t66t/6t(6t!6t6t6t 6t6tþ5t÷5tð5té5tâ5tÛ5tÔ5tÍ5tÆ5t¿5t¸5t±5tª5t£5tœ5t•5tŽ5t‡5t€5ty5tr5tk5td5t]5tV5tO5tH5tA5t:5t35t,5t%5t5t5t5t 5t5tû4tô4tí4tæ4tß4tØ4tÑ4tÊ4tÃ4t¼4tµ4t®4t§4t 4t™4t’4t‹4t„4t}4tv4to4th4ta4tZ4tS4tL4tE4t>4t74t04t)4t"4t4t4t 4t4tÿ3tø3tñ3tê3tã3tÜ3tÕ3tÎ3tÇ3tÀ3t¹3t²3t«3t¤3t3t–3t3tˆ3t3tz3ts3tl3te3t^3tW3tP3tI3tB3t;3t43t-3t&3t3t3t3t 3t3tü2tõ2tî2tç2tà2tÙ2tÒ2tË2tÄ2t½2t¶2t¯2t¨2t¡2tš2t“2tŒ2t…2t~2tw2tp2ti2tb2t[2tT2tM2tF2t?2t82t12t*2t#2t2t2t2t2t2tù1tò1të1tä1tÝ1tÖ1tÏ1tÈ1tÁ1tº1t³1t¬1t¥1tž1t—1t1t‰1t‚1t{1tt1tm1tf1t_1tX1tQ1tJ1tC1t<1t51t.1t'1t 1t1t1t 1t1tý0tö0tï0tè0tá0tÚ0tÓ0tÌ0tÅ0t¾0t·0t°0t©0t¢0t›0t”0t0t†0t0tx0tq0tj0tc0t\0tU0tN0tG0t@0t90t20t+0t$0t0t0t0t0t0tú/tó/tì/tå/tÞ/t×/tÐ/tÉ/tÂ/t»/t´/t­/t¦/tŸ/t˜/t‘/tŠ/tƒ/t|/tu/tn/tg/t`/tY/tR/tK/tD/t=/t6/t//t(/t!/t/t/t /t/tþ.t÷.tð.té.tâ.tÛ.tÔ.tÍ.tÆ.t¿.t¸.t±.tª.t£.tœ.t•.tŽ.t‡.t€.ty.tr.tk.td.t].tV.tO.tH.tA.t:.t3.t,.t%.t.t.t.t .t.tû-tô-tí-tæ-tß-tØ-tÑ-tÊ-tÃ-t¼-tµ-t®-t§-t -t™-t’-t‹-t„-t}-tv-to-th-ta-tZ-tS-tL-tE-t>-t7-t0-t)-t"-t-t-t -t-tÿ,tø,tñ,tê,tã,tÜ,tÕ,tÎ,tÇ,tÀ,t¹,t²,t«,t¤,t,t–,t,tˆ,t,tz,ts,tl,te,t^,tW,tP,tI,tB,t;,t4,t-,t&,t,t,t,t ,t,tü+tõ+tî+tç+tà+tÙ+tÒ+tË+tÄ+t½+t¶+t¯+t¨+t¡+tš+t“+tŒ+t…+t~+tw+tp+ti+tb+t[+tT+tM+tF+t?+t8+t1+t*+t#+t+t+t+t+t+tù*tò*të*tä*tÝ*tÖ*tÏ*tÈ*tÁ*tº*t³*t¬*t¥*tž*t—*t*t‰*t‚*t{*tt*tm*tf*t_*tX*tQ*tJ*tC*t<*t5*t.*t'*t *t*t*t *t*tý)tö)tï)tè)tá)tÚ)tÓ)tÌ)tÅ)t¾)t·)t°)t©)t¢)t›)t”)t)t†)t)tx)tq)tj)tc)t\)tU)tN)tG)t@)t9)t2)t+)t$)t)t)t)t)t)tú(tó(tì(tå(tÞ(t×(tÐ(tÉ(tÂ(t»(t´(t­(t¦(tŸ(t˜(t‘(tŠ(tƒ(t|(tu(tn(tg(t`(tY(tR(tK(tD(t=(t6(t/(t((t!(t(t(t (t(tþ't÷'tð'té'tâ'tÛ'tÔ'tÍ'tÆ't¿'t¸'t±'tª't£'tœ't•'tŽ't‡'t€'ty'tr'tk'td't]'tV'tO'tH'tA't:'t3't,'t%'t't't't 't'tû&tô&tí&tæ&tß&tØ&tÑ&tÊ&tÃ&t¼&tµ&t®&t§&t &t™&t’&t‹&t„&t}&tv&to&th&ta&tZ&tS&tL&tE&t>&t7&t0&t)&t"&t&t&t &t&tÿ%tø%tñ%tê%tã%tÜ%tÕ%tÎ%tÇ%tÀ%t¹%t²%t«%t¤%t%t–%t%tˆ%t%tz%ts%tl%te%t^%tW%tP%tI%tB%t;%t4%t-%t&%t%t%t%t %t%tü$tõ$tî$tç$tà$tÙ$tÒ$tË$tÄ$t½$t¶$t¯$t¨$t¡$tš$t“$tŒ$t…$t~$tw$tp$ti$tb$t[$tT$tM$tF$t?$t8$t1$t*$t#$t$t$t$t$t$tù#tò#të#tä#tÝ#tÖ#tÏ#tÈ#tÁ#tº#t³#t¬#t¥#tž#t—#t#t‰#t‚#t{#tt#tm#tf#t_#tX#tQ#tJ#tC#t<#t5#t.#t'#t #t#t#t #t#tý"tö"tï"tè"tá"tÚ"tÓ"tÌ"tÅ"t¾"t·"t°"t©"t¢"t›"t”"t"t†"t"tx"tq"tj"tc"t\"tU"tN"tG"t@"t9"t2"t+"t$"t"t"t"t"t"tú!tó!tì!tå!tÞ!t×!tÐ!tÉ!tÂ!t»!t´!t­!t¦!tŸ!t˜!t‘!tŠ!tƒ!t|!tu!tn!tg!t`!tY!tR!tK!tD!t=!t6!t/!t(!t!!t!t!t !t!tþ t÷ tð té tâ tÛ tÔ tÍ tÆ t¿ t¸ t± tª t£ tœ t• tŽ t‡ t€ ty tr tk td t] tV tO tH tA t: t3 t, t% t t t t t tûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCt<t5t.t't ttt ttýtötïtètátÚtÓtÌtÅt¾t·t°t©t¢t›t”tt†ttxtqtjtct\tUtNtGt@t9t2t+t$ttttttútótìtåtÞt×tÐtÉtÂt»t´t­t¦tŸt˜t‘tŠtƒt|tutntgt`tYtRtKtDt=t6t/t(t!ttt ttþt÷tðtétâtÛtÔtÍtÆt¿t¸t±tªt£tœt•tŽt‡t€tytrtktdt]tVtOtHtAt:t3t,t%tttt ttûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCt<t5t.t't ttt ttýtötïtètátÚtÓtÌtÅt¾t·t°t©t¢t›t”tt†ttxtqtjtct\tUtNtGt@t9t2t+t$ttttttútótìtåtÞt×tÐtÉtÂt»t´t­t¦tŸt˜t‘tŠtƒt|tutntgt`tYtRtKtDt=t6t/t(t!ttt ttþt÷tðtétâtÛtÔtÍtÆt¿t¸t±tªt£tœt•tŽt‡t€tytrtktdt]tVtOtHtAt:t3t,t%tttt ttûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCt<t5t.t't ttt ttý tö tï tè tá tÚ tÓ tÌ tÅ t¾ t· t° t© t¢ t› t” t t† t tx tq tj tc t\ tU tN tG t@ t9 t2 t+ t$ t t t t t tú tó tì tå tÞ t× tÐ tÉ t t» t´ t­ t¦ tŸ t˜ t‘ tŠ tƒ t| tu tn tg t` tY tR tK tD t= t6 t/ t( t! t t t t tþ t÷ tð té tâ tÛ tÔ tÍ tÆ t¿ t¸ t± tª t£ tœ t• tŽ t‡ t€ ty tr tk td t] tV tO tH tA t: t3 t, t% t t t t t tû tô tí tæ tß tØ tÑ tÊ tà t¼ tµ t® t§ t  t™ t’ t‹ t„ t} tv to th ta tZ tS tL tE t> t7 t0 t) t" t t t t tÿ tø tñ tê tã tÜ tÕ tÎ tÇ tÀ t¹ t² t« t¤ t t– t tˆ t tz ts tl te t^ tW tP tI tB t; t4 t- t& t t t t t tütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCt<t5t.t't ttt ttýtötïtètátÚtÓtÌtÅt¾t·t°t©t¢t›t”tt†ttxtqtjtct\tUtNtGt@t9t2t+t$ttttttútótìtåtÞt×tÐtÉtÂt»t´t­t¦tŸt˜t‘tŠtƒt|tutntgt`tYtRtKtDt=t6t/t(t!ttt ttþt÷tðtétâtÛtÔtÍtÆt¿t¸t±tªt£tœt•tŽt‡t€tytrtktdt]tVtOtHtAt:t3t,t%tttt ttûtôtítætßtØtÑtÊtÃt¼tµt®t§t t™t’t‹t„t}tvtothtatZtStLtEt>t7t0t)t"ttt ttÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCt<t5t.t't ttt ttýÿsöÿsïÿsèÿsáÿsÚÿsÓÿsÌÿsÅÿs¾ÿs·ÿs°ÿs©ÿs¢ÿs›ÿs”ÿsÿs†ÿsÿsxÿsqÿsjÿscÿs\ÿsUÿsNÿsGÿs@ÿs9ÿs2ÿs+ÿs$ÿsÿsÿsÿsÿsÿsúþsóþsìþsåþsÞþs×þsÐþsÉþsÂþs»þs´þs­þs¦þsŸþs˜þs‘þsŠþsƒþs|þsuþsnþsgþs`þsYþsRþsKþsDþs=þs6þs/þs(þs!þsþsþs þsþsþýs÷ýsðýséýsâýsÛýsÔýsÍýsÆýs¿ýs¸ýs±ýsªýs£ýsœýs•ýsŽýs‡ýs€ýsyýsrýskýsdýs]ýsVýsOýsHýsAýs:ýs3ýs,ýs%ýsýsýsýs ýsýsûüsôüsíüsæüsßüsØüsÑüsÊüsÃüs¼üsµüs®üs§üs üs™üs’üs‹üs„üs}üsvüsoüshüsaüsZüsSüsLüsEüs>üs7üs0üs)üs"üsüsüs üsüsÿûsøûsñûsêûsãûsÜûsÕûsÎûsÇûsÀûs¹ûs²ûs«ûs¤ûsûs–ûsûsˆûsûszûssûslûseûs^ûsWûsPûsIûsBûs;ûs4ûs-ûs&ûsûsûsûs ûsûsüúsõúsîúsçúsàúsÙúsÒúsËúsÄús½ús¶ús¯ús¨ús¡úsšús“úsŒús…ús~úswúspúsiúsbús[úsTúsMúsFús?ús8ús1ús*ús#úsúsúsúsúsúsùùsòùsëùsäùsÝùsÖùsÏùsÈùsÁùsºùs³ùs¬ùs¥ùsžùs—ùsùs‰ùs‚ùs{ùstùsmùsfùs_ùsXùsQùsJùsCùs<ùs5ùs.ùs'ùs ùsùsùs ùsùsýøsöøsïøsèøsáøsÚøsÓøsÌøsÅøs¾øs·øs°øs©øs¢øs›øs”øsøs†øsøsxøsqøsjøscøs\øsUøsNøsGøs@øs9øs2øs+øs$øsøsøsøsøsøsú÷só÷sì÷så÷sÞ÷s×÷sÐ÷sÉ÷sÂ÷s»÷s´÷s­÷s¦÷sŸ÷s˜÷s‘÷sŠ÷sƒ÷s|÷su÷sn÷sg÷s`÷sY÷sR÷sK÷sD÷s=÷s6÷s/÷s(÷s!÷s÷s÷s ÷s÷sþös÷ösðöséösâösÛösÔösÍösÆös¿ös¸ös±ösªös£ösœös•ösŽös‡ös€ösyösröskösdös]ösVösOösHösAös:ös3ös,ös%ösösösös ösösûõsôõsíõsæõsßõsØõsÑõsÊõsÃõs¼õsµõs®õs§õs õs™õs’õs‹õs„õs}õsvõsoõshõsaõsZõsSõsLõsEõs>õs7õs0õs)õs"õsõsõs õsõsÿôsøôsñôsêôsãôsÜôsÕôsÎôsÇôsÀôs¹ôs²ôs«ôs¤ôsôs–ôsôsˆôsôszôssôslôseôs^ôsWôsPôsIôsBôs;ôs4ôs-ôs&ôsôsôsôs ôsôsüósõósîósçósàósÙósÒósËósÄós½ós¶ós¯ós¨ós¡ósšós“ósŒós…ós~óswóspósiósbós[ósTósMósFós?ós8ós1ós*ós#ósósósósósósùòsòòsëòsäòsÝòsÖòsÏòsÈòsÁòsºòs³òs¬òs¥òsžòs—òsòs‰òs‚òs{òstòsmòsfòs_òsXòsQòsJòsCòs<òs5òs.òs'òs òsòsòs òsòsýñsöñsïñsèñsáñsÚñsÓñsÌñsÅñs¾ñs·ñs°ñs©ñs¢ñs›ñs”ñsñs†ñsñsxñsqñsjñscñs\ñsUñsNñsGñs@ñs9ñs2ñs+ñs$ñsñsñsñsñsñsúðsóðsìðsåðsÞðs×ðsÐðsÉðsÂðs»ðs´ðs­ðs¦ðsŸðs˜ðs‘ðsŠðsƒðs|ðsuðsnðsgðs`ðsYðsRðsKðsDðs=ðs6ðs/ðs(ðs!ðsðsðs ðsðsþïs÷ïsðïséïsâïsÛïsÔïsÍïsÆïs¿ïs¸ïs±ïsªïs£ïsœïs•ïsŽïs‡ïs€ïsyïsrïskïsdïs]ïsVïsOïsHïsAïs:ïs3ïs,ïs%ïsïsïsïs ïsïsûîsôîsíîsæîsßîsØîsÑîsÊîsÃîs¼îsµîs®îs§îs îs™îs’îs‹îs„îs}îsvîsoîshîsaîsZîsSîsLîsEîs>îs7îs0îs)îs"îsîsîs îsîsÿísøísñísêísãísÜísÕísÎísÇísÀís¹ís²ís«ís¤ísís–ísísˆísíszíssíslíseís^ísWísPísIísBís;ís4ís-ís&ísísísís ísísüìsõìsîìsçìsàìsÙìsÒìsËìsÄìs½ìs¶ìs¯ìs¨ìs¡ìsšìs“ìsŒìs…ìs~ìswìspìsiìsbìs[ìsTìsMìsFìs?ìs8ìs1ìs*ìs#ìsìsìsìsìsìsùësòësëësäësÝësÖësÏësÈësÁësºës³ës¬ës¥ësžës—ësës‰ës‚ës{ëstësmësfës_ësXësQësJësCës<ës5ës.ës'ës ësësës ësësýêsöêsïêsèêsáêsÚêsÓêsÌêsÅês¾ês·ês°ês©ês¢ês›ês”êsês†êsêsxêsqêsjêscês\êsUêsNêsGês@ês9ês2ês+ês$êsêsêsêsêsêsúésóésìésåésÞés×ésÐésÉésÂés»és´és­és¦ésŸés˜és‘ésŠésƒés|ésuésnésgés`ésYésRésKésDés=és6és/és(és!ésésés ésésþès÷èsðèséèsâèsÛèsÔèsÍèsÆès¿ès¸ès±èsªès£èsœès•èsŽès‡ès€èsyèsrèskèsdès]èsVèsOèsHèsAès:ès3ès,ès%èsèsèsès èsèsûçsôçsíçsæçsßçsØçsÑçsÊçsÃçs¼çsµçs®çs§çs çs™çs’çs‹çs„çs}çsvçsoçshçsaçsZçsSçsLçsEçs>çs7çs0çs)çs"çsçsçs çsçsÿæsøæsñæsêæsãæsÜæsÕæsÎæsÇæsÀæs¹æs²æs«æs¤æsæs–æsæsˆæsæszæssæslæseæs^æsWæsPæsIæsBæs;æs4æs-æs&æsæsæsæs æsæsüåsõåsîåsçåsàåsÙåsÒåsËåsÄås½ås¶ås¯ås¨ås¡åsšås“åsŒås…ås~åswåspåsiåsbås[åsTåsMåsFås?ås8ås1ås*ås#åsåsåsåsåsåsùäsòäsëäsääsÝäsÖäsÏäsÈäsÁäsºäs³äs¬äs¥äsžäs—äsäs‰äs‚äs{ästäsmäsfäs_äsXäsQäsJäsCäs<äs5äs.äs'äs äsäsäs äsäsýãsöãsïãsèãsáãsÚãsÓãsÌãsÅãs¾ãs·ãs°ãs©ãs¢ãs›ãs”ãsãs†ãsãsxãsqãsjãscãs\ãsUãsNãsGãs@ãs9ãs2ãs+ãs$ãsãsãsãsãsãsúâsóâsìâsåâsÞâs×âsÐâsÉâsÂâs»âs´âs­âs¦âsŸâs˜âs‘âsŠâsƒâs|âsuâsnâsgâs`âsYâsRâsKâsDâs=âs6âs/âs(âs!âsâsâs âsâsþás÷ásðáséásâásÛásÔásÍásÆás¿ás¸ás±ásªás£ásœás•ásŽás‡ás€ásyásráskásdás]ásVásOásHásAás:ás3ás,ás%ásásásás ásásûàsôàsíàsæàsßàsØàsÑàsÊàsÃàs¼àsµàs®às§às às™às’às‹às„às}àsvàsoàshàsaàsZàsSàsLàsEàs>às7às0às)às"àsàsàs àsàsÿßsøßsñßsêßsãßsÜßsÕßsÎßsÇßsÀßs¹ßs²ßs«ßs¤ßsßs–ßsßsˆßsßszßssßslßseßs^ßsWßsPßsIßsBßs;ßs4ßs-ßs&ßsßsßsßs ßsßsüÞsõÞsîÞsçÞsàÞsÙÞsÒÞsËÞsÄÞs½Þs¶Þs¯Þs¨Þs¡ÞsšÞs“ÞsŒÞs…Þs~ÞswÞspÞsiÞsbÞs[ÞsTÞsMÞsFÞs?Þs8Þs1Þs*Þs#ÞsÞsÞsÞsÞsÞsùÝsòÝsëÝsäÝsÝÝsÖÝsÏÝsÈÝsÁÝsºÝs³Ýs¬Ýs¥ÝsžÝs—ÝsÝs‰Ýs‚Ýs{ÝstÝsmÝsfÝs_ÝsXÝsQÝsJÝsCÝs<Ýs5Ýs.Ýs'Ýs ÝsÝsÝs ÝsÝsýÜsöÜsïÜsèÜsáÜsÚÜsÓÜsÌÜsÅÜs¾Üs·Üs°Üs©Üs¢Üs›Üs”ÜsÜs†ÜsÜsxÜsqÜsjÜscÜs\ÜsUÜsNÜsGÜs@Üs9Üs2Üs+Üs$ÜsÜsÜsÜsÜsÜsúÛsóÛsìÛsåÛsÞÛs×ÛsÐÛsÉÛsÂÛs»Ûs´Ûs­Ûs¦ÛsŸÛs˜Ûs‘ÛsŠÛsƒÛs|ÛsuÛsnÛsgÛs`ÛsYÛsRÛsKÛsDÛs=Ûs6Ûs/Ûs(Ûs!ÛsÛsÛs ÛsÛsþÚs÷ÚsðÚséÚsâÚsÛÚsÔÚsÍÚsÆÚs¿Ús¸Ús±ÚsªÚs£ÚsœÚs•ÚsŽÚs‡Ús€ÚsyÚsrÚskÚsdÚs]ÚsVÚsOÚsHÚsAÚs:Ús3Ús,Ús%ÚsÚsÚsÚs ÚsÚsûÙsôÙsíÙsæÙsßÙsØÙsÑÙsÊÙsÃÙs¼ÙsµÙs®Ùs§Ùs Ùs™Ùs’Ùs‹Ùs„Ùs}ÙsvÙsoÙshÙsaÙsZÙsSÙsLÙsEÙs>Ùs7Ùs0Ùs)Ùs"ÙsÙsÙs ÙsÙsÿØsøØsñØsêØsãØsÜØsÕØsÎØsÇØsÀØs¹Øs²Øs«Øs¤ØsØs–ØsØsˆØsØszØssØslØseØs^ØsWØsPØsIØsBØs;Øs4Øs-Øs&ØsØsØsØs ØsØsü×sõ×sî×sç×sà×sÙ×sÒ×sË×sÄ×s½×s¶×s¯×s¨×s¡×sš×s“×sŒ×s…×s~×sw×sp×si×sb×s[×sT×sM×sF×s?×s8×s1×s*×s#×s×s×s×s×s×sùÖsòÖsëÖsäÖsÝÖsÖÖsÏÖsÈÖsÁÖsºÖs³Ös¬Ös¥ÖsžÖs—ÖsÖs‰Ös‚Ös{ÖstÖsmÖsfÖs_ÖsXÖsQÖsJÖsCÖs<Ös5Ös.Ös'Ös ÖsÖsÖs ÖsÖsýÕsöÕsïÕsèÕsáÕsÚÕsÓÕsÌÕsÅÕs¾Õs·Õs°Õs©Õs¢Õs›Õs”ÕsÕs†ÕsÕsxÕsqÕsjÕscÕs\ÕsUÕsNÕsGÕs@Õs9Õs2Õs+Õs$ÕsÕsÕsÕsÕsÕsúÔsóÔsìÔsåÔsÞÔs×ÔsÐÔsÉÔsÂÔs»Ôs´Ôs­Ôs¦ÔsŸÔs˜Ôs‘ÔsŠÔsƒÔs|ÔsuÔsnÔsgÔs`ÔsYÔsRÔsKÔsDÔs=Ôs6Ôs/Ôs(Ôs!ÔsÔsÔs ÔsÔsþÓs÷ÓsðÓséÓsâÓsÛÓsÔÓsÍÓsÆÓs¿Ós¸Ós±ÓsªÓs£ÓsœÓs•ÓsŽÓs‡Ós€ÓsyÓsrÓskÓsdÓs]ÓsVÓsOÓsHÓsAÓs:Ós3Ós,Ós%ÓsÓsÓsÓs ÓsÓsûÒsôÒsíÒsæÒsßÒsØÒsÑÒsÊÒsÃÒs¼ÒsµÒs®Òs§Òs Òs™Òs’Òs‹Òs„Òs}ÒsvÒsoÒshÒsaÒsZÒsSÒsLÒsEÒs>Òs7Òs0Òs)Òs"ÒsÒsÒs ÒsÒsÿÑsøÑsñÑsêÑsãÑsÜÑsÕÑsÎÑsÇÑsÀÑs¹Ñs²Ñs«Ñs¤ÑsÑs–ÑsÑsˆÑsÑszÑssÑslÑseÑs^ÑsWÑsPÑsIÑsBÑs;Ñs4Ñs-Ñs&ÑsÑsÑsÑs ÑsÑsüÐsõÐsîÐsçÐsàÐsÙÐsÒÐsËÐsÄÐs½Ðs¶Ðs¯Ðs¨Ðs¡ÐsšÐs“ÐsŒÐs…Ðs~ÐswÐspÐsiÐsbÐs[ÐsTÐsMÐsFÐs?Ðs8Ðs1Ðs*Ðs#ÐsÐsÐsÐsÐsÐsùÏsòÏsëÏsäÏsÝÏsÖÏsÏÏsÈÏsÁÏsºÏs³Ïs¬Ïs¥ÏsžÏs—ÏsÏs‰Ïs‚Ïs{ÏstÏsmÏsfÏs_ÏsXÏsQÏsJÏsCÏs<Ïs5Ïs.Ïs'Ïs ÏsÏsÏs ÏsÏsýÎsöÎsïÎsèÎsáÎsÚÎsÓÎsÌÎsÅÎs¾Îs·Îs°Îs©Îs¢Îs›Îs”ÎsÎs†ÎsÎsxÎsqÎsjÎscÎs\ÎsUÎsNÎsGÎs@Îs9Îs2Îs+Îs$ÎsÎsÎsÎsÎsÎsúÍsóÍsìÍsåÍsÞÍs×ÍsÐÍsÉÍsÂÍs»Ís´Ís­Ís¦ÍsŸÍs˜Ís‘ÍsŠÍsƒÍs|ÍsuÍsnÍsgÍs`ÍsYÍsRÍsKÍsDÍs=Ís6Ís/Ís(Ís!ÍsÍsÍs ÍsÍsþÌs÷ÌsðÌséÌsâÌsÛÌsÔÌsÍÌsÆÌs¿Ìs¸Ìs±ÌsªÌs£ÌsœÌs•ÌsŽÌs‡Ìs€ÌsyÌsrÌskÌsdÌs]ÌsVÌsOÌsHÌsAÌs:Ìs3Ìs,Ìs%ÌsÌsÌsÌs ÌsÌsûËsôËsíËsæËsßËsØËsÑËsÊËsÃËs¼ËsµËs®Ës§Ës Ës™Ës’Ës‹Ës„Ës}ËsvËsoËshËsaËsZËsSËsLËsEËs>Ës7Ës0Ës)Ës"ËsËsËs ËsËsÿÊsøÊsñÊsêÊsãÊsÜÊsÕÊsÎÊsÇÊsÀÊs¹Ês²Ês«Ês¤ÊsÊs–ÊsÊsˆÊsÊszÊssÊslÊseÊs^ÊsWÊsPÊsIÊsBÊs;Ês4Ês-Ês&ÊsÊsÊsÊs ÊsÊsüÉsõÉsîÉsçÉsàÉsÙÉsÒÉsËÉsÄÉs½És¶És¯És¨És¡ÉsšÉs“ÉsŒÉs…És~ÉswÉspÉsiÉsbÉs[ÉsTÉsMÉsFÉs?És8És1És*És#ÉsÉsÉsÉsÉsÉsùÈsòÈsëÈsäÈsÝÈsÖÈsÏÈsÈÈsÁÈsºÈs³Ès¬Ès¥ÈsžÈs—ÈsÈs‰Ès‚Ès{ÈstÈsmÈsfÈs_ÈsXÈsQÈsJÈsCÈs<Ès5Ès.Ès'Ès ÈsÈsÈs ÈsÈsýÇsöÇsïÇsèÇsáÇsÚÇsÓÇsÌÇsÅÇs¾Çs·Çs°Çs©Çs¢Çs›Çs”ÇsÇs†ÇsÇsxÇsqÇsjÇscÇs\ÇsUÇsNÇsGÇs@Çs9Çs2Çs+Çs$ÇsÇsÇsÇsÇsÇsúÆsóÆsìÆsåÆsÞÆsׯsÐÆsÉÆsÂÆs»Æs´Æs­Æs¦ÆsŸÆs˜Æs‘ÆsŠÆsƒÆs|ÆsuÆsnÆsgÆs`ÆsYÆsRÆsKÆsDÆs=Æs6Æs/Æs(Æs!ÆsÆsÆs ÆsÆsþÅs÷ÅsðÅséÅsâÅsÛÅsÔÅsÍÅsÆÅs¿Ås¸Ås±ÅsªÅs£ÅsœÅs•ÅsŽÅs‡Ås€ÅsyÅsrÅskÅsdÅs]ÅsVÅsOÅsHÅsAÅs:Ås3Ås,Ås%ÅsÅsÅsÅs ÅsÅsûÄsôÄsíÄsæÄsßÄsØÄsÑÄsÊÄsÃÄs¼ÄsµÄs®Äs§Äs Äs™Äs’Äs‹Äs„Äs}ÄsvÄsoÄshÄsaÄsZÄsSÄsLÄsEÄs>Äs7Äs0Äs)Äs"ÄsÄsÄs ÄsÄsÿÃsøÃsñÃsêÃsãÃsÜÃsÕÃsÎÃsÇÃsÀÃs¹Ãs²Ãs«Ãs¤ÃsÃs–ÃsÃsˆÃsÃszÃssÃslÃseÃs^ÃsWÃsPÃsIÃsBÃs;Ãs4Ãs-Ãs&ÃsÃsÃsÃs ÃsÃsüÂsõÂsîÂsçÂsàÂsÙÂsÒÂsËÂsÄÂs½Âs¶Âs¯Âs¨Âs¡ÂsšÂs“ÂsŒÂs…Âs~ÂswÂspÂsiÂsbÂs[ÂsTÂsMÂsFÂs?Âs8Âs1Âs*Âs#ÂsÂsÂsÂsÂsÂsùÁsòÁsëÁsäÁsÝÁsÖÁsÏÁsÈÁsÁÁsºÁs³Ás¬Ás¥ÁsžÁs—ÁsÁs‰Ás‚Ás{ÁstÁsmÁsfÁs_ÁsXÁsQÁsJÁsCÁs<Ás5Ás.Ás'Ás ÁsÁsÁs ÁsÁsýÀsöÀsïÀsèÀsáÀsÚÀsÓÀsÌÀsÅÀs¾Às·Às°Às©Às¢Às›Às”ÀsÀs†ÀsÀsxÀsqÀsjÀscÀs\ÀsUÀsNÀsGÀs@Às9Às2Às+Às$ÀsÀsÀsÀsÀsÀsú¿só¿sì¿så¿sÞ¿s׿sпsÉ¿s¿s»¿s´¿s­¿s¦¿sŸ¿s˜¿s‘¿sŠ¿sƒ¿s|¿su¿sn¿sg¿s`¿sY¿sR¿sK¿sD¿s=¿s6¿s/¿s(¿s!¿s¿s¿s ¿s¿sþ¾s÷¾sð¾sé¾sâ¾sÛ¾sÔ¾s;sƾs¿¾s¸¾s±¾sª¾s£¾sœ¾s•¾s޾s‡¾s€¾sy¾sr¾sk¾sd¾s]¾sV¾sO¾sH¾sA¾s:¾s3¾s,¾s%¾s¾s¾s¾s ¾s¾sû½sô½sí½sæ½sß½sؽsѽsʽsýs¼½sµ½s®½s§½s ½s™½s’½s‹½s„½s}½sv½so½sh½sa½sZ½sS½sL½sE½s>½s7½s0½s)½s"½s½s½s ½s½sÿ¼sø¼sñ¼sê¼sã¼sܼsÕ¼sμsǼsÀ¼s¹¼s²¼s«¼s¤¼s¼s–¼s¼sˆ¼s¼sz¼ss¼sl¼se¼s^¼sW¼sP¼sI¼sB¼s;¼s4¼s-¼s&¼s¼s¼s¼s ¼s¼sü»sõ»sî»sç»sà»sÙ»sÒ»sË»sÄ»s½»s¶»s¯»s¨»s¡»sš»s“»sŒ»s…»s~»sw»sp»si»sb»s[»sT»sM»sF»s?»s8»s1»s*»s#»s»s»s»s»s»sùºsòºsëºsäºsݺsÖºsϺsȺsÁºsººs³ºs¬ºs¥ºsžºs—ºsºs‰ºs‚ºs{ºstºsmºsfºs_ºsXºsQºsJºsCºs<ºs5ºs.ºs'ºs ºsºsºs ºsºsý¹sö¹sï¹sè¹sá¹sÚ¹sÓ¹s̹sŹs¾¹s·¹s°¹s©¹s¢¹s›¹s”¹s¹s†¹s¹sx¹sq¹sj¹sc¹s\¹sU¹sN¹sG¹s@¹s9¹s2¹s+¹s$¹s¹s¹s¹s¹s¹sú¸só¸sì¸så¸sÞ¸s׸sиsɸs¸s»¸s´¸s­¸s¦¸sŸ¸s˜¸s‘¸sЏsƒ¸s|¸su¸sn¸sg¸s`¸sY¸sR¸sK¸sD¸s=¸s6¸s/¸s(¸s!¸s¸s¸s ¸s¸sþ·s÷·sð·sé·sâ·sÛ·sÔ·sÍ·sÆ·s¿·s¸·s±·sª·s£·sœ·s•·sŽ·s‡·s€·sy·sr·sk·sd·s]·sV·sO·sH·sA·s:·s3·s,·s%·s·s·s·s ·s·sû¶sô¶sí¶sæ¶sß¶sضsѶsʶsös¼¶sµ¶s®¶s§¶s ¶s™¶s’¶s‹¶s„¶s}¶sv¶so¶sh¶sa¶sZ¶sS¶sL¶sE¶s>¶s7¶s0¶s)¶s"¶s¶s¶s ¶s¶sÿµsøµsñµsêµsãµsܵsÕµsεsǵsÀµs¹µs²µs«µs¤µsµs–µsµsˆµsµszµssµslµseµs^µsWµsPµsIµsBµs;µs4µs-µs&µsµsµsµs µsµsü´sõ´sî´sç´sà´sÙ´sÒ´sË´sÄ´s½´s¶´s¯´s¨´s¡´sš´s“´sŒ´s…´s~´sw´sp´si´sb´s[´sT´sM´sF´s?´s8´s1´s*´s#´s´s´s´s´s´sù³sò³së³sä³sݳsÖ³sϳsȳsÁ³sº³s³³s¬³s¥³sž³s—³s³s‰³s‚³s{³st³sm³sf³s_³sX³sQ³sJ³sC³s<³s5³s.³s'³s ³s³s³s ³s³sý²sö²sï²sè²sá²sÚ²sÓ²s̲sŲs¾²s·²s°²s©²s¢²s›²s”²s²s†²s²sx²sq²sj²sc²s\²sU²sN²sG²s@²s9²s2²s+²s$²s²s²s²s²s²sú±só±sì±så±sÞ±s×±sбsɱs±s»±s´±s­±s¦±sŸ±s˜±s‘±sбsƒ±s|±su±sn±sg±s`±sY±sR±sK±sD±s=±s6±s/±s(±s!±s±s±s ±s±sþ°s÷°sð°sé°sâ°sÛ°sÔ°sͰsưs¿°s¸°s±°sª°s£°sœ°s•°sްs‡°s€°sy°sr°sk°sd°s]°sV°sO°sH°sA°s:°s3°s,°s%°s°s°s°s °s°sû¯sô¯sí¯sæ¯s߯sدsѯsʯsïs¼¯sµ¯s®¯s§¯s ¯s™¯s’¯s‹¯s„¯s}¯sv¯so¯sh¯sa¯sZ¯sS¯sL¯sE¯s>¯s7¯s0¯s)¯s"¯s¯s¯s ¯s¯sÿ®sø®sñ®sê®sã®sÜ®sÕ®sήsÇ®sÀ®s¹®s²®s«®s¤®s®s–®s®sˆ®s®sz®ss®sl®se®s^®sW®sP®sI®sB®s;®s4®s-®s&®s®s®s®s ®s®sü­sõ­sî­sç­sà­sÙ­sÒ­sË­sÄ­s½­s¶­s¯­s¨­s¡­sš­s“­sŒ­s…­s~­sw­sp­si­sb­s[­sT­sM­sF­s?­s8­s1­s*­s#­s­s­s­s­s­sù¬sò¬së¬sä¬sݬsÖ¬sϬsȬsÁ¬sº¬s³¬s¬¬s¥¬sž¬s—¬s¬s‰¬s‚¬s{¬st¬sm¬sf¬s_¬sX¬sQ¬sJ¬sC¬s<¬s5¬s.¬s'¬s ¬s¬s¬s ¬s¬sý«sö«sï«sè«sá«sÚ«sÓ«sÌ«sÅ«s¾«s·«s°«s©«s¢«s›«s”«s«s†«s«sx«sq«sj«sc«s\«sU«sN«sG«s@«s9«s2«s+«s$«s«s«s«s«s«súªsóªsìªsåªsÞªsתsЪsɪsªs»ªs´ªs­ªs¦ªsŸªs˜ªs‘ªsŠªsƒªs|ªsuªsnªsgªs`ªsYªsRªsKªsDªs=ªs6ªs/ªs(ªs!ªsªsªs ªsªsþ©s÷©sð©sé©sâ©sÛ©sÔ©sÍ©sÆ©s¿©s¸©s±©sª©s£©sœ©s•©sŽ©s‡©s€©sy©sr©sk©sd©s]©sV©sO©sH©sA©s:©s3©s,©s%©s©s©s©s ©s©sû¨sô¨sí¨sæ¨sߨsبsѨsʨsès¼¨sµ¨s®¨s§¨s ¨s™¨s’¨s‹¨s„¨s}¨sv¨so¨sh¨sa¨sZ¨sS¨sL¨sE¨s>¨s7¨s0¨s)¨s"¨s¨s¨s ¨s¨sÿ§sø§sñ§sê§sã§sܧsÕ§sΧsǧsÀ§s¹§s²§s«§s¤§s§s–§s§sˆ§s§sz§ss§sl§se§s^§sW§sP§sI§sB§s;§s4§s-§s&§s§s§s§s §s§sü¦sõ¦sî¦sç¦sà¦sÙ¦sÒ¦s˦sĦs½¦s¶¦s¯¦s¨¦s¡¦sš¦s“¦sŒ¦s…¦s~¦sw¦sp¦si¦sb¦s[¦sT¦sM¦sF¦s?¦s8¦s1¦s*¦s#¦s¦s¦s¦s¦s¦sù¥sò¥së¥sä¥sÝ¥sÖ¥sÏ¥sÈ¥sÁ¥sº¥s³¥s¬¥s¥¥sž¥s—¥s¥s‰¥s‚¥s{¥st¥sm¥sf¥s_¥sX¥sQ¥sJ¥sC¥s<¥s5¥s.¥s'¥s ¥s¥s¥s ¥s¥sý¤sö¤sï¤sè¤sá¤sÚ¤sÓ¤s̤sŤs¾¤s·¤s°¤s©¤s¢¤s›¤s”¤s¤s†¤s¤sx¤sq¤sj¤sc¤s\¤sU¤sN¤sG¤s@¤s9¤s2¤s+¤s$¤s¤s¤s¤s¤s¤sú£só£sì£så£sÞ£s×£sУsÉ£s£s»£s´£s­£s¦£sŸ£s˜£s‘£sŠ£sƒ£s|£su£sn£sg£s`£sY£sR£sK£sD£s=£s6£s/£s(£s!£s£s£s £s£sþ¢s÷¢sð¢sé¢sâ¢sÛ¢sÔ¢sÍ¢sÆ¢s¿¢s¸¢s±¢sª¢s£¢sœ¢s•¢sŽ¢s‡¢s€¢sy¢sr¢sk¢sd¢s]¢sV¢sO¢sH¢sA¢s:¢s3¢s,¢s%¢s¢s¢s¢s ¢s¢sû¡sô¡sí¡sæ¡sß¡sØ¡sÑ¡sÊ¡sás¼¡sµ¡s®¡s§¡s ¡s™¡s’¡s‹¡s„¡s}¡sv¡so¡sh¡sa¡sZ¡sS¡sL¡sE¡s>¡s7¡s0¡s)¡s"¡s¡s¡s ¡s¡sÿ sø sñ sê sã sÜ sÕ sΠsÇ sÀ s¹ s² s« s¤ s s– s sˆ s sz ss sl se s^ sW sP sI sB s; s4 s- s& s s s s  s süŸsõŸsîŸsçŸsàŸsÙŸsÒŸsËŸsÄŸs½Ÿs¶Ÿs¯Ÿs¨Ÿs¡ŸsšŸs“ŸsŒŸs…Ÿs~ŸswŸspŸsiŸsbŸs[ŸsTŸsMŸsFŸs?Ÿs8Ÿs1Ÿs*Ÿs#ŸsŸsŸsŸsŸsŸsùžsòžsëžsäžsÝžsÖžsÏžsÈžsÁžsºžs³žs¬žs¥žsžžs—žsžs‰žs‚žs{žstžsmžsfžs_žsXžsQžsJžsCžs<žs5žs.žs'žs žsžsžs žsžsýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssúœsóœsìœsåœsÞœsלsМsÉœsœs»œs´œs­œs¦œsŸœs˜œs‘œsŠœsƒœs|œsuœsnœsgœs`œsYœsRœsKœsDœs=œs6œs/œs(œs!œsœsœs œsœsþ›s÷›sð›sé›sâ›sÛ›sÔ›sÍ›sÆ›s¿›s¸›s±›sª›s£›sœ›s•›sŽ›s‡›s€›sy›sr›sk›sd›s]›sV›sO›sH›sA›s:›s3›s,›s%›s›s›s›s ›s›sûšsôšsíšsæšsßšsØšsÑšsÊšsÚs¼šsµšs®šs§šs šs™šs’šs‹šs„šs}šsvšsošshšsašsZšsSšsLšsEšs>šs7šs0šs)šs"šsšsšs šsšsÿ™sø™sñ™sê™sã™sÜ™sÕ™sΙsÇ™sÀ™s¹™s²™s«™s¤™s™s–™s™sˆ™s™sz™ss™sl™se™s^™sW™sP™sI™sB™s;™s4™s-™s&™s™s™s™s ™s™sü˜sõ˜sî˜sç˜sà˜sÙ˜sÒ˜s˘sĘs½˜s¶˜s¯˜s¨˜s¡˜sš˜s“˜sŒ˜s…˜s~˜sw˜sp˜si˜sb˜s[˜sT˜sM˜sF˜s?˜s8˜s1˜s*˜s#˜s˜s˜s˜s˜s˜sù—sò—së—sä—sÝ—sÖ—sÏ—sÈ—sÁ—sº—s³—s¬—s¥—sž—s——s—s‰—s‚—s{—st—sm—sf—s_—sX—sQ—sJ—sC—s<—s5—s.—s'—s —s—s—s —s—sý–sö–sï–sè–sá–sÚ–sÓ–sÌ–sÅ–s¾–s·–s°–s©–s¢–s›–s”–s–s†–s–sx–sq–sj–sc–s\–sU–sN–sG–s@–s9–s2–s+–s$–s–s–s–s–s–sú•só•sì•så•sÞ•sוsЕsÉ•s•s»•s´•s­•s¦•sŸ•s˜•s‘•sŠ•sƒ•s|•su•sn•sg•s`•sY•sR•sK•sD•s=•s6•s/•s(•s!•s•s•s •s•sþ”s÷”sð”sé”sâ”sÛ”sÔ”sÍ”sÆ”s¿”s¸”s±”sª”s£”sœ”s•”sŽ”s‡”s€”sy”sr”sk”sd”s]”sV”sO”sH”sA”s:”s3”s,”s%”s”s”s”s ”s”sû“sô“sí“sæ“sß“sØ“sÑ“sÊ“sÓs¼“sµ“s®“s§“s “s™“s’“s‹“s„“s}“sv“so“sh“sa“sZ“sS“sL“sE“s>“s7“s0“s)“s"“s“s“s “s“sÿ’sø’sñ’sê’sã’sÜ’sÕ’sÎ’sÇ’sÀ’s¹’s²’s«’s¤’s’s–’s’sˆ’s’sz’ss’sl’se’s^’sW’sP’sI’sB’s;’s4’s-’s&’s’s’s’s ’s’sü‘sõ‘sî‘sç‘sà‘sÙ‘sÒ‘sË‘sÄ‘s½‘s¶‘s¯‘s¨‘s¡‘sš‘s“‘sŒ‘s…‘s~‘sw‘sp‘si‘sb‘s[‘sT‘sM‘sF‘s?‘s8‘s1‘s*‘s#‘s‘s‘s‘s‘s‘sùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCsŒs7Œs0Œs)Œs"ŒsŒsŒs ŒsŒsÿ‹sø‹sñ‹sê‹sã‹sÜ‹sÕ‹s΋sÇ‹sÀ‹s¹‹s²‹s«‹s¤‹s‹s–‹s‹sˆ‹s‹sz‹ss‹sl‹se‹s^‹sW‹sP‹sI‹sB‹s;‹s4‹s-‹s&‹s‹s‹s‹s ‹s‹süŠsõŠsîŠsçŠsàŠsÙŠsÒŠsËŠsÄŠs½Šs¶Šs¯Šs¨Šs¡ŠsšŠs“ŠsŒŠs…Šs~ŠswŠspŠsiŠsbŠs[ŠsTŠsMŠsFŠs?Šs8Šs1Šs*Šs#ŠsŠsŠsŠsŠsŠsù‰sò‰së‰sä‰s݉sÖ‰sωsȉsÁ‰sº‰s³‰s¬‰s¥‰sž‰s—‰s‰s‰‰s‚‰s{‰st‰sm‰sf‰s_‰sX‰sQ‰sJ‰sC‰s<‰s5‰s.‰s'‰s ‰s‰s‰s ‰s‰sýˆsöˆsïˆsèˆsáˆsÚˆsÓˆs̈sňs¾ˆs·ˆs°ˆs©ˆs¢ˆs›ˆs”ˆsˆs†ˆsˆsxˆsqˆsjˆscˆs\ˆsUˆsNˆsGˆs@ˆs9ˆs2ˆs+ˆs$ˆsˆsˆsˆsˆsˆsú‡só‡sì‡så‡sÞ‡sׇsЇsɇs‡s»‡s´‡s­‡s¦‡sŸ‡s˜‡s‘‡sЇsƒ‡s|‡su‡sn‡sg‡s`‡sY‡sR‡sK‡sD‡s=‡s6‡s/‡s(‡s!‡s‡s‡s ‡s‡sþ†s÷†sð†sé†sâ†sÛ†sÔ†s͆sƆs¿†s¸†s±†sª†s£†sœ†s•†sކs‡†s€†sy†sr†sk†sd†s]†sV†sO†sH†sA†s:†s3†s,†s%†s†s†s†s †s†sû…sô…sí…sæ…sß…sØ…sÑ…sÊ…sÃ…s¼…sµ…s®…s§…s …s™…s’…s‹…s„…s}…sv…so…sh…sa…sZ…sS…sL…sE…s>…s7…s0…s)…s"…s…s…s …s…sÿ„sø„sñ„sê„sã„sÜ„sÕ„s΄sÇ„sÀ„s¹„s²„s«„s¤„s„s–„s„sˆ„s„sz„ss„sl„se„s^„sW„sP„sI„sB„s;„s4„s-„s&„s„s„s„s „s„süƒsõƒsîƒsçƒsàƒsÙƒsÒƒs˃săs½ƒs¶ƒs¯ƒs¨ƒs¡ƒsšƒs“ƒsŒƒs…ƒs~ƒswƒspƒsiƒsbƒs[ƒsTƒsMƒsFƒs?ƒs8ƒs1ƒs*ƒs#ƒsƒsƒsƒsƒsƒsù‚sò‚së‚sä‚sÝ‚sÖ‚sÏ‚sÈ‚sÁ‚sº‚s³‚s¬‚s¥‚sž‚s—‚s‚s‰‚s‚‚s{‚st‚sm‚sf‚s_‚sX‚sQ‚sJ‚sC‚s<‚s5‚s.‚s'‚s ‚s‚s‚s ‚s‚sýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssú€só€sì€så€sÞ€s×€sЀsÉ€s€s»€s´€s­€s¦€sŸ€s˜€s‘€sŠ€sƒ€s|€su€sn€sg€s`€sY€sR€sK€sD€s=€s6€s/€s(€s!€s€s€s €s€sþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssû~sô~sí~sæ~sß~sØ~sÑ~sÊ~sÃ~s¼~sµ~s®~s§~s ~s™~s’~s‹~s„~s}~sv~so~sh~sa~sZ~sS~sL~sE~s>~s7~s0~s)~s"~s~s~s ~s~sÿ}sø}sñ}sê}sã}sÜ}sÕ}sÎ}sÇ}sÀ}s¹}s²}s«}s¤}s}s–}s}sˆ}s}sz}ss}sl}se}s^}sW}sP}sI}sB}s;}s4}s-}s&}s}s}s}s }s}sü|sõ|sî|sç|sà|sÙ|sÒ|sË|sÄ|s½|s¶|s¯|s¨|s¡|sš|s“|sŒ|s…|s~|sw|sp|si|sb|s[|sT|sM|sF|s?|s8|s1|s*|s#|s|s|s|s|s|sù{sò{së{sä{sÝ{sÖ{sÏ{sÈ{sÁ{sº{s³{s¬{s¥{sž{s—{s{s‰{s‚{s{{st{sm{sf{s_{sX{sQ{sJ{sC{s<{s5{s.{s'{s {s{s{s {s{sýzsözsïzsèzsázsÚzsÓzsÌzsÅzs¾zs·zs°zs©zs¢zs›zs”zszs†zszsxzsqzsjzsczs\zsUzsNzsGzs@zs9zs2zs+zs$zszszszszszsúysóysìysåysÞys×ysÐysÉysÂys»ys´ys­ys¦ysŸys˜ys‘ysŠysƒys|ysuysnysgys`ysYysRysKysDys=ys6ys/ys(ys!ysysys ysysþxs÷xsðxséxsâxsÛxsÔxsÍxsÆxs¿xs¸xs±xsªxs£xsœxs•xsŽxs‡xs€xsyxsrxskxsdxs]xsVxsOxsHxsAxs:xs3xs,xs%xsxsxsxs xsxsûwsôwsíwsæwsßwsØwsÑwsÊwsÃws¼wsµws®ws§ws ws™ws’ws‹ws„ws}wsvwsowshwsawsZwsSwsLwsEws>ws7ws0ws)ws"wswsws wswsÿvsøvsñvsêvsãvsÜvsÕvsÎvsÇvsÀvs¹vs²vs«vs¤vsvs–vsvsˆvsvszvssvslvsevs^vsWvsPvsIvsBvs;vs4vs-vs&vsvsvsvs vsvsüusõusîusçusàusÙusÒusËusÄus½us¶us¯us¨us¡usšus“usŒus…us~uswuspusiusbus[usTusMusFus?us8us1us*us#ususususususùtsòtsëtsätsÝtsÖtsÏtsÈtsÁtsºts³ts¬ts¥tsžts—tsts‰ts‚ts{tsttsmtsfts_tsXtsQtsJtsCtsps7ps0ps)ps"pspsps pspsÿosøosñosêosãosÜosÕosÎosÇosÀos¹os²os«os¤osos–ososˆososzossosloseos^osWosPosIosBos;os4os-os&osososos ososünsõnsînsçnsànsÙnsÒnsËnsÄns½ns¶ns¯ns¨ns¡nsšns“nsŒns…ns~nswnspnsinsbns[nsTnsMnsFns?ns8ns1ns*ns#nsnsnsnsnsnsùmsòmsëmsämsÝmsÖmsÏmsÈmsÁmsºms³ms¬ms¥msžms—msms‰ms‚ms{mstmsmmsfms_msXmsQmsJmsCmsis7is0is)is"isisis isisÿhsøhsñhsêhsãhsÜhsÕhsÎhsÇhsÀhs¹hs²hs«hs¤hshs–hshsˆhshszhsshslhsehs^hsWhsPhsIhsBhs;hs4hs-hs&hshshshs hshsügsõgsîgsçgsàgsÙgsÒgsËgsÄgs½gs¶gs¯gs¨gs¡gsšgs“gsŒgs…gs~gswgspgsigsbgs[gsTgsMgsFgs?gs8gs1gs*gs#gsgsgsgsgsgsùfsòfsëfsäfsÝfsÖfsÏfsÈfsÁfsºfs³fs¬fs¥fsžfs—fsfs‰fs‚fs{fstfsmfsffs_fsXfsQfsJfsCfsbs7bs0bs)bs"bsbsbs bsbsÿasøasñasêasãasÜasÕasÎasÇasÀas¹as²as«as¤asas–asasˆasaszassaslaseas^asWasPasIasBas;as4as-as&asasasas asasü`sõ`sî`sç`sà`sÙ`sÒ`sË`sÄ`s½`s¶`s¯`s¨`s¡`sš`s“`sŒ`s…`s~`sw`sp`si`sb`s[`sT`sM`sF`s?`s8`s1`s*`s#`s`s`s`s`s`sù_sò_së_sä_sÝ_sÖ_sÏ_sÈ_sÁ_sº_s³_s¬_s¥_sž_s—_s_s‰_s‚_s{_st_sm_sf_s__sX_sQ_sJ_sC_s<_s5_s._s'_s _s_s_s _s_sý^sö^sï^sè^sá^sÚ^sÓ^sÌ^sÅ^s¾^s·^s°^s©^s¢^s›^s”^s^s†^s^sx^sq^sj^sc^s\^sU^sN^sG^s@^s9^s2^s+^s$^s^s^s^s^s^sú]só]sì]så]sÞ]s×]sÐ]sÉ]sÂ]s»]s´]s­]s¦]sŸ]s˜]s‘]sŠ]sƒ]s|]su]sn]sg]s`]sY]sR]sK]sD]s=]s6]s/]s(]s!]s]s]s ]s]sþ\s÷\sð\sé\sâ\sÛ\sÔ\sÍ\sÆ\s¿\s¸\s±\sª\s£\sœ\s•\sŽ\s‡\s€\sy\sr\sk\sd\s]\sV\sO\sH\sA\s:\s3\s,\s%\s\s\s\s \s\sû[sô[sí[sæ[sß[sØ[sÑ[sÊ[sÃ[s¼[sµ[s®[s§[s [s™[s’[s‹[s„[s}[sv[so[sh[sa[sZ[sS[sL[sE[s>[s7[s0[s)[s"[s[s [s[sÿZsøZsñZsêZsãZsÜZsÕZsÎZsÇZsÀZs¹Zs²Zs«Zs¤ZsZs–ZsZsˆZsZszZssZslZseZs^ZsWZsPZsIZsBZs;Zs4Zs-Zs&ZsZsZsZs ZsZsüYsõYsîYsçYsàYsÙYsÒYsËYsÄYs½Ys¶Ys¯Ys¨Ys¡YsšYs“YsŒYs…Ys~YswYspYsiYsbYs[YsTYsMYsFYs?Ys8Ys1Ys*Ys#YsYsYsYsYsYsùXsòXsëXsäXsÝXsÖXsÏXsÈXsÁXsºXs³Xs¬Xs¥XsžXs—XsXs‰Xs‚Xs{XstXsmXsfXs_XsXXsQXsJXsCXsTs7Ts0Ts)Ts"TsTsTs TsTsÿSsøSsñSsêSsãSsÜSsÕSsÎSsÇSsÀSs¹Ss²Ss«Ss¤SsSs–SsSsˆSsSszSssSslSseSs^SsWSsPSsISsBSs;Ss4Ss-Ss&SsSsSsSs SsSsüRsõRsîRsçRsàRsÙRsÒRsËRsÄRs½Rs¶Rs¯Rs¨Rs¡RsšRs“RsŒRs…Rs~RswRspRsiRsbRs[RsTRsMRsFRs?Rs8Rs1Rs*Rs#RsRsRsRsRsRsùQsòQsëQsäQsÝQsÖQsÏQsÈQsÁQsºQs³Qs¬Qs¥QsžQs—QsQs‰Qs‚Qs{QstQsmQsfQs_QsXQsQQsJQsCQsMs7Ms0Ms)Ms"MsMsMs MsMsÿLsøLsñLsêLsãLsÜLsÕLsÎLsÇLsÀLs¹Ls²Ls«Ls¤LsLs–LsLsˆLsLszLssLslLseLs^LsWLsPLsILsBLs;Ls4Ls-Ls&LsLsLsLs LsLsüKsõKsîKsçKsàKsÙKsÒKsËKsÄKs½Ks¶Ks¯Ks¨Ks¡KsšKs“KsŒKs…Ks~KswKspKsiKsbKs[KsTKsMKsFKs?Ks8Ks1Ks*Ks#KsKsKsKsKsKsùJsòJsëJsäJsÝJsÖJsÏJsÈJsÁJsºJs³Js¬Js¥JsžJs—JsJs‰Js‚Js{JstJsmJsfJs_JsXJsQJsJJsCJsFs7Fs0Fs)Fs"FsFsFs FsFsÿEsøEsñEsêEsãEsÜEsÕEsÎEsÇEsÀEs¹Es²Es«Es¤EsEs–EsEsˆEsEszEssEslEseEs^EsWEsPEsIEsBEs;Es4Es-Es&EsEsEsEs EsEsüDsõDsîDsçDsàDsÙDsÒDsËDsÄDs½Ds¶Ds¯Ds¨Ds¡DsšDs“DsŒDs…Ds~DswDspDsiDsbDs[DsTDsMDsFDs?Ds8Ds1Ds*Ds#DsDsDsDsDsDsùCsòCsëCsäCsÝCsÖCsÏCsÈCsÁCsºCs³Cs¬Cs¥CsžCs—CsCs‰Cs‚Cs{CstCsmCsfCs_CsXCsQCsJCsCCs?s7?s0?s)?s"?s?s?s ?s?sÿ>sø>sñ>sê>sã>sÜ>sÕ>sÎ>sÇ>sÀ>s¹>s²>s«>s¤>s>s–>s>sˆ>s>sz>ss>sl>se>s^>sW>sP>sI>sB>s;>s4>s->s&>s>s>s>s >s>sü=sõ=sî=sç=sà=sÙ=sÒ=sË=sÄ=s½=s¶=s¯=s¨=s¡=sš=s“=sŒ=s…=s~=sw=sp=si=sb=s[=sT=sM=sF=s?=s8=s1=s*=s#=s=s=s=s=s=sù8s78s08s)8s"8s8s8s 8s8sÿ7sø7sñ7sê7sã7sÜ7sÕ7sÎ7sÇ7sÀ7s¹7s²7s«7s¤7s7s–7s7sˆ7s7sz7ss7sl7se7s^7sW7sP7sI7sB7s;7s47s-7s&7s7s7s7s 7s7sü6sõ6sî6sç6sà6sÙ6sÒ6sË6sÄ6s½6s¶6s¯6s¨6s¡6sš6s“6sŒ6s…6s~6sw6sp6si6sb6s[6sT6sM6sF6s?6s86s16s*6s#6s6s6s6s6s6sù5sò5së5sä5sÝ5sÖ5sÏ5sÈ5sÁ5sº5s³5s¬5s¥5sž5s—5s5s‰5s‚5s{5st5sm5sf5s_5sX5sQ5sJ5sC5s<5s55s.5s'5s 5s5s5s 5s5sý4sö4sï4sè4sá4sÚ4sÓ4sÌ4sÅ4s¾4s·4s°4s©4s¢4s›4s”4s4s†4s4sx4sq4sj4sc4s\4sU4sN4sG4s@4s94s24s+4s$4s4s4s4s4s4sú3só3sì3så3sÞ3s×3sÐ3sÉ3sÂ3s»3s´3s­3s¦3sŸ3s˜3s‘3sŠ3sƒ3s|3su3sn3sg3s`3sY3sR3sK3sD3s=3s63s/3s(3s!3s3s3s 3s3sþ2s÷2sð2sé2sâ2sÛ2sÔ2sÍ2sÆ2s¿2s¸2s±2sª2s£2sœ2s•2sŽ2s‡2s€2sy2sr2sk2sd2s]2sV2sO2sH2sA2s:2s32s,2s%2s2s2s2s 2s2sû1sô1sí1sæ1sß1sØ1sÑ1sÊ1sÃ1s¼1sµ1s®1s§1s 1s™1s’1s‹1s„1s}1sv1so1sh1sa1sZ1sS1sL1sE1s>1s71s01s)1s"1s1s1s 1s1sÿ0sø0sñ0sê0sã0sÜ0sÕ0sÎ0sÇ0sÀ0s¹0s²0s«0s¤0s0s–0s0sˆ0s0sz0ss0sl0se0s^0sW0sP0sI0sB0s;0s40s-0s&0s0s0s0s 0s0sü/sõ/sî/sç/sà/sÙ/sÒ/sË/sÄ/s½/s¶/s¯/s¨/s¡/sš/s“/sŒ/s…/s~/sw/sp/si/sb/s[/sT/sM/sF/s?/s8/s1/s*/s#/s/s/s/s/s/sù.sò.së.sä.sÝ.sÖ.sÏ.sÈ.sÁ.sº.s³.s¬.s¥.sž.s—.s.s‰.s‚.s{.st.sm.sf.s_.sX.sQ.sJ.sC.s<.s5.s..s'.s .s.s.s .s.sý-sö-sï-sè-sá-sÚ-sÓ-sÌ-sÅ-s¾-s·-s°-s©-s¢-s›-s”-s-s†-s-sx-sq-sj-sc-s\-sU-sN-sG-s@-s9-s2-s+-s$-s-s-s-s-s-sú,só,sì,så,sÞ,s×,sÐ,sÉ,sÂ,s»,s´,s­,s¦,sŸ,s˜,s‘,sŠ,sƒ,s|,su,sn,sg,s`,sY,sR,sK,sD,s=,s6,s/,s(,s!,s,s,s ,s,sþ+s÷+sð+sé+sâ+sÛ+sÔ+sÍ+sÆ+s¿+s¸+s±+sª+s£+sœ+s•+sŽ+s‡+s€+sy+sr+sk+sd+s]+sV+sO+sH+sA+s:+s3+s,+s%+s+s+s+s +s+sû*sô*sí*sæ*sß*sØ*sÑ*sÊ*sÃ*s¼*sµ*s®*s§*s *s™*s’*s‹*s„*s}*sv*so*sh*sa*sZ*sS*sL*sE*s>*s7*s0*s)*s"*s*s*s *s*sÿ)sø)sñ)sê)sã)sÜ)sÕ)sÎ)sÇ)sÀ)s¹)s²)s«)s¤)s)s–)s)sˆ)s)sz)ss)sl)se)s^)sW)sP)sI)sB)s;)s4)s-)s&)s)s)s)s )s)sü(sõ(sî(sç(sà(sÙ(sÒ(sË(sÄ(s½(s¶(s¯(s¨(s¡(sš(s“(sŒ(s…(s~(sw(sp(si(sb(s[(sT(sM(sF(s?(s8(s1(s*(s#(s(s(s(s(s(sù'sò'së'sä'sÝ'sÖ'sÏ'sÈ'sÁ'sº's³'s¬'s¥'sž's—'s's‰'s‚'s{'st'sm'sf's_'sX'sQ'sJ'sC's<'s5's.'s''s 's's's 's'sý&sö&sï&sè&sá&sÚ&sÓ&sÌ&sÅ&s¾&s·&s°&s©&s¢&s›&s”&s&s†&s&sx&sq&sj&sc&s\&sU&sN&sG&s@&s9&s2&s+&s$&s&s&s&s&s&sú%só%sì%så%sÞ%s×%sÐ%sÉ%sÂ%s»%s´%s­%s¦%sŸ%s˜%s‘%sŠ%sƒ%s|%su%sn%sg%s`%sY%sR%sK%sD%s=%s6%s/%s(%s!%s%s%s %s%sþ$s÷$sð$sé$sâ$sÛ$sÔ$sÍ$sÆ$s¿$s¸$s±$sª$s£$sœ$s•$sŽ$s‡$s€$sy$sr$sk$sd$s]$sV$sO$sH$sA$s:$s3$s,$s%$s$s$s$s $s$sû#sô#sí#sæ#sß#sØ#sÑ#sÊ#sÃ#s¼#sµ#s®#s§#s #s™#s’#s‹#s„#s}#sv#so#sh#sa#sZ#sS#sL#sE#s>#s7#s0#s)#s"#s#s#s #s#sÿ"sø"sñ"sê"sã"sÜ"sÕ"sÎ"sÇ"sÀ"s¹"s²"s«"s¤"s"s–"s"sˆ"s"sz"ss"sl"se"s^"sW"sP"sI"sB"s;"s4"s-"s&"s"s"s"s "s"sü!sõ!sî!sç!sà!sÙ!sÒ!sË!sÄ!s½!s¶!s¯!s¨!s¡!sš!s“!sŒ!s…!s~!sw!sp!si!sb!s[!sT!sM!sF!s?!s8!s1!s*!s#!s!s!s!s!s!sù sò së sä sÝ sÖ sÏ sÈ sÁ sº s³ s¬ s¥ sž s— s s‰ s‚ s{ st sm sf s_ sX sQ sJ sC s< s5 s. s' s s s s s sýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssúsósìsåsÞs×sÐsÉsÂs»s´s­s¦sŸs˜s‘sŠsƒs|susnsgs`sYsRsKsDs=s6s/s(s!sss ssþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssûsôsísæsßsØsÑsÊsÃs¼sµs®s§s s™s’s‹s„s}svsoshsasZsSsLsEs>s7s0s)s"sss ssÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCs<s5s.s's sss ssýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssúsósìsåsÞs×sÐsÉsÂs»s´s­s¦sŸs˜s‘sŠsƒs|susnsgs`sYsRsKsDs=s6s/s(s!sss ssþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssûsôsísæsßsØsÑsÊsÃs¼sµs®s§s s™s’s‹s„s}svsoshsasZsSsLsEs>s7s0s)s"sss ssÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCs<s5s.s's sss ssýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssúsósìsåsÞs×sÐsÉsÂs»s´s­s¦sŸs˜s‘sŠsƒs|susnsgs`sYsRsKsDs=s6s/s(s!sss ssþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssûsôsísæsßsØsÑsÊsÃs¼sµs®s§s s™s’s‹s„s}svsoshsasZsSsLsEs>s7s0s)s"sss ssÿ sø sñ sê sã sÜ sÕ sÎ sÇ sÀ s¹ s² s« s¤ s s– s sˆ s sz ss sl se s^ sW sP sI sB s; s4 s- s& s s s s s sü sõ sî sç sà sÙ sÒ sË sÄ s½ s¶ s¯ s¨ s¡ sš s“ sŒ s… s~ sw sp si sb s[ sT sM sF s? s8 s1 s* s# s s s s s sù sò së sä sÝ sÖ sÏ sÈ sÁ sº s³ s¬ s¥ sž s— s s‰ s‚ s{ st sm sf s_ sX sQ sJ sC s< s5 s. s' s s s s s sý sö sï sè sá sÚ sÓ sÌ sÅ s¾ s· s° s© s¢ s› s” s s† s sx sq sj sc s\ sU sN sG s@ s9 s2 s+ s$ s s s s s sú só sì så sÞ s× sÐ sÉ s s» s´ s­ s¦ sŸ s˜ s‘ sŠ sƒ s| su sn sg s` sY sR sK sD s= s6 s/ s( s! s s s s sþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssûsôsísæsßsØsÑsÊsÃs¼sµs®s§s s™s’s‹s„s}svsoshsasZsSsLsEs>s7s0s)s"sss ssÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCs<s5s.s's sss ssýsösïsèsásÚsÓsÌsÅs¾s·s°s©s¢s›s”ss†ssxsqsjscs\sUsNsGs@s9s2s+s$ssssssúsósìsåsÞs×sÐsÉsÂs»s´s­s¦sŸs˜s‘sŠsƒs|susnsgs`sYsRsKsDs=s6s/s(s!sss ssþs÷sðsésâsÛsÔsÍsÆs¿s¸s±sªs£sœs•sŽs‡s€sysrsksds]sVsOsHsAs:s3s,s%ssss ssûsôsísæsßsØsÑsÊsÃs¼sµs®s§s s™s’s‹s„s}svsoshsasZsSsLsEs>s7s0s)s"sss ssÿÿrøÿrñÿrêÿrãÿrÜÿrÕÿrÎÿrÇÿrÀÿr¹ÿr²ÿr«ÿr¤ÿrÿr–ÿrÿrˆÿrÿrzÿrsÿrlÿreÿr^ÿrWÿrPÿrIÿrBÿr;ÿr4ÿr-ÿr&ÿrÿrÿrÿr ÿrÿrüþrõþrîþrçþràþrÙþrÒþrËþrÄþr½þr¶þr¯þr¨þr¡þršþr“þrŒþr…þr~þrwþrpþriþrbþr[þrTþrMþrFþr?þr8þr1þr*þr#þrþrþrþrþrþrùýròýrëýräýrÝýrÖýrÏýrÈýrÁýrºýr³ýr¬ýr¥ýržýr—ýrýr‰ýr‚ýr{ýrtýrmýrfýr_ýrXýrQýrJýrCýr<ýr5ýr.ýr'ýr ýrýrýr ýrýrýüröürïürèüráürÚürÓürÌürÅür¾ür·ür°ür©ür¢ür›ür”ürür†ürürxürqürjürcür\ürUürNürGür@ür9ür2ür+ür$ürürürürürürúûróûrìûråûrÞûr×ûrÐûrÉûrÂûr»ûr´ûr­ûr¦ûrŸûr˜ûr‘ûrŠûrƒûr|ûruûrnûrgûr`ûrYûrRûrKûrDûr=ûr6ûr/ûr(ûr!ûrûrûr ûrûrþúr÷úrðúréúrâúrÛúrÔúrÍúrÆúr¿úr¸úr±úrªúr£úrœúr•úrŽúr‡úr€úryúrrúrkúrdúr]úrVúrOúrHúrAúr:úr3úr,úr%úrúrúrúr úrúrûùrôùríùræùrßùrØùrÑùrÊùrÃùr¼ùrµùr®ùr§ùr ùr™ùr’ùr‹ùr„ùr}ùrvùroùrhùraùrZùrSùrLùrEùr>ùr7ùr0ùr)ùr"ùrùrùr ùrùrÿørøørñørêørãørÜørÕørÎørÇørÀør¹ør²ør«ør¤ørør–ørørˆørørzørsørløreør^ørWørPørIørBør;ør4ør-ør&ørørørør ørørü÷rõ÷rî÷rç÷rà÷rÙ÷rÒ÷rË÷rÄ÷r½÷r¶÷r¯÷r¨÷r¡÷rš÷r“÷rŒ÷r…÷r~÷rw÷rp÷ri÷rb÷r[÷rT÷rM÷rF÷r?÷r8÷r1÷r*÷r#÷r÷r÷r÷r÷r÷rùöròörëöräörÝörÖörÏörÈörÁörºör³ör¬ör¥öržör—örör‰ör‚ör{örtörmörför_örXörQörJörCör<ör5ör.ör'ör örörör örörýõröõrïõrèõráõrÚõrÓõrÌõrÅõr¾õr·õr°õr©õr¢õr›õr”õrõr†õrõrxõrqõrjõrcõr\õrUõrNõrGõr@õr9õr2õr+õr$õrõrõrõrõrõrúôróôrìôråôrÞôr×ôrÐôrÉôrÂôr»ôr´ôr­ôr¦ôrŸôr˜ôr‘ôrŠôrƒôr|ôruôrnôrgôr`ôrYôrRôrKôrDôr=ôr6ôr/ôr(ôr!ôrôrôr ôrôrþór÷órðóréórâórÛórÔórÍórÆór¿ór¸ór±órªór£órœór•órŽór‡ór€óryórrórkórdór]órVórOórHórAór:ór3ór,ór%órórórór órórûòrôòríòræòrßòrØòrÑòrÊòrÃòr¼òrµòr®òr§òr òr™òr’òr‹òr„òr}òrvòroòrhòraòrZòrSòrLòrEòr>òr7òr0òr)òr"òròròr òròrÿñrøñrññrêñrãñrÜñrÕñrÎñrÇñrÀñr¹ñr²ñr«ñr¤ñrñr–ñrñrˆñrñrzñrsñrlñreñr^ñrWñrPñrIñrBñr;ñr4ñr-ñr&ñrñrñrñr ñrñrüðrõðrîðrçðràðrÙðrÒðrËðrÄðr½ðr¶ðr¯ðr¨ðr¡ðršðr“ðrŒðr…ðr~ðrwðrpðriðrbðr[ðrTðrMðrFðr?ðr8ðr1ðr*ðr#ðrðrðrðrðrðrùïròïrëïräïrÝïrÖïrÏïrÈïrÁïrºïr³ïr¬ïr¥ïržïr—ïrïr‰ïr‚ïr{ïrtïrmïrfïr_ïrXïrQïrJïrCïr<ïr5ïr.ïr'ïr ïrïrïr ïrïrýîröîrïîrèîráîrÚîrÓîrÌîrÅîr¾îr·îr°îr©îr¢îr›îr”îrîr†îrîrxîrqîrjîrcîr\îrUîrNîrGîr@îr9îr2îr+îr$îrîrîrîrîrîrúíróírìíråírÞír×írÐírÉírÂír»ír´ír­ír¦írŸír˜ír‘írŠírƒír|íruírnírgír`írYírRírKírDír=ír6ír/ír(ír!írírír írírþìr÷ìrðìréìrâìrÛìrÔìrÍìrÆìr¿ìr¸ìr±ìrªìr£ìrœìr•ìrŽìr‡ìr€ìryìrrìrkìrdìr]ìrVìrOìrHìrAìr:ìr3ìr,ìr%ìrìrìrìr ìrìrûërôëríëræërßërØërÑërÊërÃër¼ërµër®ër§ër ër™ër’ër‹ër„ër}ërvëroërhëraërZërSërLërEër>ër7ër0ër)ër"ërërër ërërÿêrøêrñêrêêrãêrÜêrÕêrÎêrÇêrÀêr¹êr²êr«êr¤êrêr–êrêrˆêrêrzêrsêrlêreêr^êrWêrPêrIêrBêr;êr4êr-êr&êrêrêrêr êrêrüérõérîérçéràérÙérÒérËérÄér½ér¶ér¯ér¨ér¡éršér“érŒér…ér~érwérpériérbér[érTérMérFér?ér8ér1ér*ér#érérérérérérùèròèrëèräèrÝèrÖèrÏèrÈèrÁèrºèr³èr¬èr¥èržèr—èrèr‰èr‚èr{èrtèrmèrfèr_èrXèrQèrJèrCèr<èr5èr.èr'èr èrèrèr èrèrýçröçrïçrèçráçrÚçrÓçrÌçrÅçr¾çr·çr°çr©çr¢çr›çr”çrçr†çrçrxçrqçrjçrcçr\çrUçrNçrGçr@çr9çr2çr+çr$çrçrçrçrçrçrúæróærìæråærÞær׿rÐærÉærÂær»ær´ær­ær¦ærŸær˜ær‘ærŠærƒær|æruærnærgær`ærYærRærKærDær=ær6ær/ær(ær!ærærær ærærþår÷årðåréårâårÛårÔårÍårÆår¿år¸år±årªår£årœår•årŽår‡år€åryårrårkårdår]årVårOårHårAår:år3år,år%årårårår årårûärôäríäræärßärØärÑärÊärÃär¼ärµär®är§är är™är’är‹är„är}ärväroärhäraärZärSärLärEär>är7är0är)är"ärärär ärärÿãrøãrñãrêãrããrÜãrÕãrÎãrÇãrÀãr¹ãr²ãr«ãr¤ãrãr–ãrãrˆãrãrzãrsãrlãreãr^ãrWãrPãrIãrBãr;ãr4ãr-ãr&ãrãrãrãr ãrãrüârõârîârçâràârÙârÒârËârÄâr½âr¶âr¯âr¨âr¡âršâr“ârŒâr…âr~ârwârpâriârbâr[ârTârMârFâr?âr8âr1âr*âr#ârârârârârârùáròárëáräárÝárÖárÏárÈárÁárºár³ár¬ár¥áržár—árár‰ár‚ár{ártármárfár_árXárQárJárCár<ár5ár.ár'ár árárár árárýàröàrïàrèàráàrÚàrÓàrÌàrÅàr¾àr·àr°àr©àr¢àr›àr”àràr†àràrxàrqàrjàrcàr\àrUàrNàrGàr@àr9àr2àr+àr$àràràràràràrúßróßrìßråßrÞßr×ßrÐßrÉßrÂßr»ßr´ßr­ßr¦ßrŸßr˜ßr‘ßrŠßrƒßr|ßrußrnßrgßr`ßrYßrRßrKßrDßr=ßr6ßr/ßr(ßr!ßrßrßr ßrßrþÞr÷ÞrðÞréÞrâÞrÛÞrÔÞrÍÞrÆÞr¿Þr¸Þr±ÞrªÞr£ÞrœÞr•ÞrŽÞr‡Þr€ÞryÞrrÞrkÞrdÞr]ÞrVÞrOÞrHÞrAÞr:Þr3Þr,Þr%ÞrÞrÞrÞr ÞrÞrûÝrôÝríÝræÝrßÝrØÝrÑÝrÊÝrÃÝr¼ÝrµÝr®Ýr§Ýr Ýr™Ýr’Ýr‹Ýr„Ýr}ÝrvÝroÝrhÝraÝrZÝrSÝrLÝrEÝr>Ýr7Ýr0Ýr)Ýr"ÝrÝrÝr ÝrÝrÿÜrøÜrñÜrêÜrãÜrÜÜrÕÜrÎÜrÇÜrÀÜr¹Ür²Ür«Ür¤ÜrÜr–ÜrÜrˆÜrÜrzÜrsÜrlÜreÜr^ÜrWÜrPÜrIÜrBÜr;Ür4Ür-Ür&ÜrÜrÜrÜr ÜrÜrüÛrõÛrîÛrçÛràÛrÙÛrÒÛrËÛrÄÛr½Ûr¶Ûr¯Ûr¨Ûr¡ÛršÛr“ÛrŒÛr…Ûr~ÛrwÛrpÛriÛrbÛr[ÛrTÛrMÛrFÛr?Ûr8Ûr1Ûr*Ûr#ÛrÛrÛrÛrÛrÛrùÚròÚrëÚräÚrÝÚrÖÚrÏÚrÈÚrÁÚrºÚr³Úr¬Úr¥ÚržÚr—ÚrÚr‰Úr‚Úr{ÚrtÚrmÚrfÚr_ÚrXÚrQÚrJÚrCÚr<Úr5Úr.Úr'Úr ÚrÚrÚr ÚrÚrýÙröÙrïÙrèÙráÙrÚÙrÓÙrÌÙrÅÙr¾Ùr·Ùr°Ùr©Ùr¢Ùr›Ùr”ÙrÙr†ÙrÙrxÙrqÙrjÙrcÙr\ÙrUÙrNÙrGÙr@Ùr9Ùr2Ùr+Ùr$ÙrÙrÙrÙrÙrÙrúØróØrìØråØrÞØrרrÐØrÉØrÂØr»Ør´Ør­Ør¦ØrŸØr˜Ør‘ØrŠØrƒØr|ØruØrnØrgØr`ØrYØrRØrKØrDØr=Ør6Ør/Ør(Ør!ØrØrØr ØrØrþ×r÷×rð×ré×râ×rÛ×rÔ×rÍ×rÆ×r¿×r¸×r±×rª×r£×rœ×r•×rŽ×r‡×r€×ry×rr×rk×rd×r]×rV×rO×rH×rA×r:×r3×r,×r%×r×r×r×r ×r×rûÖrôÖríÖræÖrßÖrØÖrÑÖrÊÖrÃÖr¼ÖrµÖr®Ör§Ör Ör™Ör’Ör‹Ör„Ör}ÖrvÖroÖrhÖraÖrZÖrSÖrLÖrEÖr>Ör7Ör0Ör)Ör"ÖrÖrÖr ÖrÖrÿÕrøÕrñÕrêÕrãÕrÜÕrÕÕrÎÕrÇÕrÀÕr¹Õr²Õr«Õr¤ÕrÕr–ÕrÕrˆÕrÕrzÕrsÕrlÕreÕr^ÕrWÕrPÕrIÕrBÕr;Õr4Õr-Õr&ÕrÕrÕrÕr ÕrÕrüÔrõÔrîÔrçÔràÔrÙÔrÒÔrËÔrÄÔr½Ôr¶Ôr¯Ôr¨Ôr¡ÔršÔr“ÔrŒÔr…Ôr~ÔrwÔrpÔriÔrbÔr[ÔrTÔrMÔrFÔr?Ôr8Ôr1Ôr*Ôr#ÔrÔrÔrÔrÔrÔrùÓròÓrëÓräÓrÝÓrÖÓrÏÓrÈÓrÁÓrºÓr³Ór¬Ór¥ÓržÓr—ÓrÓr‰Ór‚Ór{ÓrtÓrmÓrfÓr_ÓrXÓrQÓrJÓrCÓr<Ór5Ór.Ór'Ór ÓrÓrÓr ÓrÓrýÒröÒrïÒrèÒráÒrÚÒrÓÒrÌÒrÅÒr¾Òr·Òr°Òr©Òr¢Òr›Òr”ÒrÒr†ÒrÒrxÒrqÒrjÒrcÒr\ÒrUÒrNÒrGÒr@Òr9Òr2Òr+Òr$ÒrÒrÒrÒrÒrÒrúÑróÑrìÑråÑrÞÑr×ÑrÐÑrÉÑrÂÑr»Ñr´Ñr­Ñr¦ÑrŸÑr˜Ñr‘ÑrŠÑrƒÑr|ÑruÑrnÑrgÑr`ÑrYÑrRÑrKÑrDÑr=Ñr6Ñr/Ñr(Ñr!ÑrÑrÑr ÑrÑrþÐr÷ÐrðÐréÐrâÐrÛÐrÔÐrÍÐrÆÐr¿Ðr¸Ðr±ÐrªÐr£ÐrœÐr•ÐrŽÐr‡Ðr€ÐryÐrrÐrkÐrdÐr]ÐrVÐrOÐrHÐrAÐr:Ðr3Ðr,Ðr%ÐrÐrÐrÐr ÐrÐrûÏrôÏríÏræÏrßÏrØÏrÑÏrÊÏrÃÏr¼ÏrµÏr®Ïr§Ïr Ïr™Ïr’Ïr‹Ïr„Ïr}ÏrvÏroÏrhÏraÏrZÏrSÏrLÏrEÏr>Ïr7Ïr0Ïr)Ïr"ÏrÏrÏr ÏrÏrÿÎrøÎrñÎrêÎrãÎrÜÎrÕÎrÎÎrÇÎrÀÎr¹Îr²Îr«Îr¤ÎrÎr–ÎrÎrˆÎrÎrzÎrsÎrlÎreÎr^ÎrWÎrPÎrIÎrBÎr;Îr4Îr-Îr&ÎrÎrÎrÎr ÎrÎrüÍrõÍrîÍrçÍràÍrÙÍrÒÍrËÍrÄÍr½Ír¶Ír¯Ír¨Ír¡ÍršÍr“ÍrŒÍr…Ír~ÍrwÍrpÍriÍrbÍr[ÍrTÍrMÍrFÍr?Ír8Ír1Ír*Ír#ÍrÍrÍrÍrÍrÍrùÌròÌrëÌräÌrÝÌrÖÌrÏÌrÈÌrÁÌrºÌr³Ìr¬Ìr¥ÌržÌr—ÌrÌr‰Ìr‚Ìr{ÌrtÌrmÌrfÌr_ÌrXÌrQÌrJÌrCÌr<Ìr5Ìr.Ìr'Ìr ÌrÌrÌr ÌrÌrýËröËrïËrèËráËrÚËrÓËrÌËrÅËr¾Ër·Ër°Ër©Ër¢Ër›Ër”ËrËr†ËrËrxËrqËrjËrcËr\ËrUËrNËrGËr@Ër9Ër2Ër+Ër$ËrËrËrËrËrËrúÊróÊrìÊråÊrÞÊr×ÊrÐÊrÉÊrÂÊr»Êr´Êr­Êr¦ÊrŸÊr˜Êr‘ÊrŠÊrƒÊr|ÊruÊrnÊrgÊr`ÊrYÊrRÊrKÊrDÊr=Êr6Êr/Êr(Êr!ÊrÊrÊr ÊrÊrþÉr÷ÉrðÉréÉrâÉrÛÉrÔÉrÍÉrÆÉr¿Ér¸Ér±ÉrªÉr£ÉrœÉr•ÉrŽÉr‡Ér€ÉryÉrrÉrkÉrdÉr]ÉrVÉrOÉrHÉrAÉr:Ér3Ér,Ér%ÉrÉrÉrÉr ÉrÉrûÈrôÈríÈræÈrßÈrØÈrÑÈrÊÈrÃÈr¼ÈrµÈr®Èr§Èr Èr™Èr’Èr‹Èr„Èr}ÈrvÈroÈrhÈraÈrZÈrSÈrLÈrEÈr>Èr7Èr0Èr)Èr"ÈrÈrÈr ÈrÈrÿÇrøÇrñÇrêÇrãÇrÜÇrÕÇrÎÇrÇÇrÀÇr¹Çr²Çr«Çr¤ÇrÇr–ÇrÇrˆÇrÇrzÇrsÇrlÇreÇr^ÇrWÇrPÇrIÇrBÇr;Çr4Çr-Çr&ÇrÇrÇrÇr ÇrÇrüÆrõÆrîÆrçÆràÆrÙÆrÒÆrËÆrÄÆr½Ær¶Ær¯Ær¨Ær¡ÆršÆr“ÆrŒÆr…Ær~ÆrwÆrpÆriÆrbÆr[ÆrTÆrMÆrFÆr?Ær8Ær1Ær*Ær#ÆrÆrÆrÆrÆrÆrùÅròÅrëÅräÅrÝÅrÖÅrÏÅrÈÅrÁÅrºÅr³År¬År¥ÅržÅr—ÅrÅr‰År‚År{ÅrtÅrmÅrfÅr_ÅrXÅrQÅrJÅrCÅr<År5År.År'År ÅrÅrÅr ÅrÅrýÄröÄrïÄrèÄráÄrÚÄrÓÄrÌÄrÅÄr¾Är·Är°Är©Är¢Är›Är”ÄrÄr†ÄrÄrxÄrqÄrjÄrcÄr\ÄrUÄrNÄrGÄr@Är9Är2Är+Är$ÄrÄrÄrÄrÄrÄrúÃróÃrìÃråÃrÞÃr×ÃrÐÃrÉÃrÂÃr»Ãr´Ãr­Ãr¦ÃrŸÃr˜Ãr‘ÃrŠÃrƒÃr|ÃruÃrnÃrgÃr`ÃrYÃrRÃrKÃrDÃr=Ãr6Ãr/Ãr(Ãr!ÃrÃrÃr ÃrÃrþÂr÷ÂrðÂréÂrâÂrÛÂrÔÂrÍÂrÆÂr¿Âr¸Âr±ÂrªÂr£ÂrœÂr•ÂrŽÂr‡Âr€ÂryÂrrÂrkÂrdÂr]ÂrVÂrOÂrHÂrAÂr:Âr3Âr,Âr%ÂrÂrÂrÂr ÂrÂrûÁrôÁríÁræÁrßÁrØÁrÑÁrÊÁrÃÁr¼ÁrµÁr®Ár§Ár Ár™Ár’Ár‹Ár„Ár}ÁrvÁroÁrhÁraÁrZÁrSÁrLÁrEÁr>Ár7Ár0Ár)Ár"ÁrÁrÁr ÁrÁrÿÀrøÀrñÀrêÀrãÀrÜÀrÕÀrÎÀrÇÀrÀÀr¹Àr²Àr«Àr¤ÀrÀr–ÀrÀrˆÀrÀrzÀrsÀrlÀreÀr^ÀrWÀrPÀrIÀrBÀr;Àr4Àr-Àr&ÀrÀrÀrÀr ÀrÀrü¿rõ¿rî¿rç¿rà¿rÙ¿rÒ¿rË¿rÄ¿r½¿r¶¿r¯¿r¨¿r¡¿rš¿r“¿rŒ¿r…¿r~¿rw¿rp¿ri¿rb¿r[¿rT¿rM¿rF¿r?¿r8¿r1¿r*¿r#¿r¿r¿r¿r¿r¿rù¾rò¾rë¾rä¾rݾrÖ¾rϾrȾrÁ¾rº¾r³¾r¬¾r¥¾rž¾r—¾r¾r‰¾r‚¾r{¾rt¾rm¾rf¾r_¾rX¾rQ¾rJ¾rC¾r<¾r5¾r.¾r'¾r ¾r¾r¾r ¾r¾rý½rö½rï½rè½rá½rÚ½rÓ½r̽rŽr¾½r·½r°½r©½r¢½r›½r”½r½r†½r½rx½rq½rj½rc½r\½rU½rN½rG½r@½r9½r2½r+½r$½r½r½r½r½r½rú¼ró¼rì¼rå¼rÞ¼r×¼rмrɼr¼r»¼r´¼r­¼r¦¼rŸ¼r˜¼r‘¼rмrƒ¼r|¼ru¼rn¼rg¼r`¼rY¼rR¼rK¼rD¼r=¼r6¼r/¼r(¼r!¼r¼r¼r ¼r¼rþ»r÷»rð»ré»râ»rÛ»rÔ»rÍ»rÆ»r¿»r¸»r±»rª»r£»rœ»r•»rŽ»r‡»r€»ry»rr»rk»rd»r]»rV»rO»rH»rA»r:»r3»r,»r%»r»r»r»r »r»rûºrôºríºræºrߺrغrѺrʺrúr¼ºrµºr®ºr§ºr ºr™ºr’ºr‹ºr„ºr}ºrvºroºrhºraºrZºrSºrLºrEºr>ºr7ºr0ºr)ºr"ºrºrºr ºrºrÿ¹rø¹rñ¹rê¹rã¹rܹrÕ¹rιrǹrÀ¹r¹¹r²¹r«¹r¤¹r¹r–¹r¹rˆ¹r¹rz¹rs¹rl¹re¹r^¹rW¹rP¹rI¹rB¹r;¹r4¹r-¹r&¹r¹r¹r¹r ¹r¹rü¸rõ¸rî¸rç¸rà¸rÙ¸rÒ¸r˸rĸr½¸r¶¸r¯¸r¨¸r¡¸rš¸r“¸rŒ¸r…¸r~¸rw¸rp¸ri¸rb¸r[¸rT¸rM¸rF¸r?¸r8¸r1¸r*¸r#¸r¸r¸r¸r¸r¸rù·rò·rë·rä·rÝ·rÖ·rÏ·rÈ·rÁ·rº·r³·r¬·r¥·rž·r—·r·r‰·r‚·r{·rt·rm·rf·r_·rX·rQ·rJ·rC·r<·r5·r.·r'·r ·r·r·r ·r·rý¶rö¶rï¶rè¶rá¶rÚ¶rÓ¶r̶rŶr¾¶r·¶r°¶r©¶r¢¶r›¶r”¶r¶r†¶r¶rx¶rq¶rj¶rc¶r\¶rU¶rN¶rG¶r@¶r9¶r2¶r+¶r$¶r¶r¶r¶r¶r¶rúµróµrìµråµrÞµr×µrеrɵrµr»µr´µr­µr¦µrŸµr˜µr‘µrеrƒµr|µruµrnµrgµr`µrYµrRµrKµrDµr=µr6µr/µr(µr!µrµrµr µrµrþ´r÷´rð´ré´râ´rÛ´rÔ´rÍ´rÆ´r¿´r¸´r±´rª´r£´rœ´r•´rŽ´r‡´r€´ry´rr´rk´rd´r]´rV´rO´rH´rA´r:´r3´r,´r%´r´r´r´r ´r´rû³rô³rí³ræ³rß³rسrѳrʳrór¼³rµ³r®³r§³r ³r™³r’³r‹³r„³r}³rv³ro³rh³ra³rZ³rS³rL³rE³r>³r7³r0³r)³r"³r³r³r ³r³rÿ²rø²rñ²rê²rã²rܲrÕ²rβrDzrÀ²r¹²r²²r«²r¤²r²r–²r²rˆ²r²rz²rs²rl²re²r^²rW²rP²rI²rB²r;²r4²r-²r&²r²r²r²r ²r²rü±rõ±rî±rç±rà±rÙ±rÒ±r˱rır½±r¶±r¯±r¨±r¡±rš±r“±rŒ±r…±r~±rw±rp±ri±rb±r[±rT±rM±rF±r?±r8±r1±r*±r#±r±r±r±r±r±rù°rò°rë°rä°rݰrÖ°rϰrȰrÁ°rº°r³°r¬°r¥°rž°r—°r°r‰°r‚°r{°rt°rm°rf°r_°rX°rQ°rJ°rC°r<°r5°r.°r'°r °r°r°r °r°rý¯rö¯rï¯rè¯rá¯rÚ¯rÓ¯r̯růr¾¯r·¯r°¯r©¯r¢¯r›¯r”¯r¯r†¯r¯rx¯rq¯rj¯rc¯r\¯rU¯rN¯rG¯r@¯r9¯r2¯r+¯r$¯r¯r¯r¯r¯r¯rú®ró®rì®rå®rÞ®r×®rЮrÉ®r®r»®r´®r­®r¦®rŸ®r˜®r‘®rŠ®rƒ®r|®ru®rn®rg®r`®rY®rR®rK®rD®r=®r6®r/®r(®r!®r®r®r ®r®rþ­r÷­rð­ré­râ­rÛ­rÔ­rÍ­rÆ­r¿­r¸­r±­rª­r£­rœ­r•­rŽ­r‡­r€­ry­rr­rk­rd­r]­rV­rO­rH­rA­r:­r3­r,­r%­r­r­r­r ­r­rû¬rô¬rí¬ræ¬r߬rجrѬrʬrìr¼¬rµ¬r®¬r§¬r ¬r™¬r’¬r‹¬r„¬r}¬rv¬ro¬rh¬ra¬rZ¬rS¬rL¬rE¬r>¬r7¬r0¬r)¬r"¬r¬r¬r ¬r¬rÿ«rø«rñ«rê«rã«rÜ«rÕ«rΫrÇ«rÀ«r¹«r²«r««r¤«r«r–«r«rˆ«r«rz«rs«rl«re«r^«rW«rP«rI«rB«r;«r4«r-«r&«r«r«r«r «r«rüªrõªrîªrçªràªrÙªrÒªr˪rĪr½ªr¶ªr¯ªr¨ªr¡ªršªr“ªrŒªr…ªr~ªrwªrpªriªrbªr[ªrTªrMªrFªr?ªr8ªr1ªr*ªr#ªrªrªrªrªrªrù©rò©rë©rä©rÝ©rÖ©rÏ©rÈ©rÁ©rº©r³©r¬©r¥©rž©r—©r©r‰©r‚©r{©rt©rm©rf©r_©rX©rQ©rJ©rC©r<©r5©r.©r'©r ©r©r©r ©r©rý¨rö¨rï¨rè¨rá¨rÚ¨rÓ¨r̨rŨr¾¨r·¨r°¨r©¨r¢¨r›¨r”¨r¨r†¨r¨rx¨rq¨rj¨rc¨r\¨rU¨rN¨rG¨r@¨r9¨r2¨r+¨r$¨r¨r¨r¨r¨r¨rú§ró§rì§rå§rÞ§r×§rЧrɧr§r»§r´§r­§r¦§rŸ§r˜§r‘§rЧrƒ§r|§ru§rn§rg§r`§rY§rR§rK§rD§r=§r6§r/§r(§r!§r§r§r §r§rþ¦r÷¦rð¦ré¦râ¦rÛ¦rÔ¦rͦrƦr¿¦r¸¦r±¦rª¦r£¦rœ¦r•¦rަr‡¦r€¦ry¦rr¦rk¦rd¦r]¦rV¦rO¦rH¦rA¦r:¦r3¦r,¦r%¦r¦r¦r¦r ¦r¦rû¥rô¥rí¥ræ¥rߥrØ¥rÑ¥rÊ¥rÃ¥r¼¥rµ¥r®¥r§¥r ¥r™¥r’¥r‹¥r„¥r}¥rv¥ro¥rh¥ra¥rZ¥rS¥rL¥rE¥r>¥r7¥r0¥r)¥r"¥r¥r¥r ¥r¥rÿ¤rø¤rñ¤rê¤rã¤rܤrÕ¤rΤrǤrÀ¤r¹¤r²¤r«¤r¤¤r¤r–¤r¤rˆ¤r¤rz¤rs¤rl¤re¤r^¤rW¤rP¤rI¤rB¤r;¤r4¤r-¤r&¤r¤r¤r¤r ¤r¤rü£rõ£rî£rç£rà£rÙ£rÒ£rË£rÄ£r½£r¶£r¯£r¨£r¡£rš£r“£rŒ£r…£r~£rw£rp£ri£rb£r[£rT£rM£rF£r?£r8£r1£r*£r#£r£r£r£r£r£rù¢rò¢rë¢rä¢rÝ¢rÖ¢rÏ¢rÈ¢rÁ¢rº¢r³¢r¬¢r¥¢rž¢r—¢r¢r‰¢r‚¢r{¢rt¢rm¢rf¢r_¢rX¢rQ¢rJ¢rC¢r<¢r5¢r.¢r'¢r ¢r¢r¢r ¢r¢rý¡rö¡rï¡rè¡rá¡rÚ¡rÓ¡rÌ¡rÅ¡r¾¡r·¡r°¡r©¡r¢¡r›¡r”¡r¡r†¡r¡rx¡rq¡rj¡rc¡r\¡rU¡rN¡rG¡r@¡r9¡r2¡r+¡r$¡r¡r¡r¡r¡r¡rú ró rì rå rÞ r× rРrÉ r r» r´ r­ r¦ rŸ r˜ r‘ rŠ rƒ r| ru rn rg r` rY rR rK rD r= r6 r/ r( r! r r r  r rþŸr÷ŸrðŸréŸrâŸrÛŸrÔŸrÍŸrÆŸr¿Ÿr¸Ÿr±ŸrªŸr£ŸrœŸr•ŸrŽŸr‡Ÿr€ŸryŸrrŸrkŸrdŸr]ŸrVŸrOŸrHŸrAŸr:Ÿr3Ÿr,Ÿr%ŸrŸrŸrŸr ŸrŸrûžrôžrížræžrßžrØžrÑžrÊžrÞr¼žrµžr®žr§žr žr™žr’žr‹žr„žr}žrvžrožrhžražrZžrSžrLžrEžr>žr7žr0žr)žr"žržržr žržrÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüœrõœrîœrçœràœrÙœrÒœrËœrÄœr½œr¶œr¯œr¨œr¡œršœr“œrŒœr…œr~œrwœrpœriœrbœr[œrTœrMœrFœr?œr8œr1œr*œr#œrœrœrœrœrœrù›rò›rë›rä›rÝ›rÖ›rÏ›rÈ›rÁ›rº›r³›r¬›r¥›rž›r—›r›r‰›r‚›r{›rt›rm›rf›r_›rX›rQ›rJ›rC›r<›r5›r.›r'›r ›r›r›r ›r›rýšröšrïšrèšrášrÚšrÓšrÌšrÅšr¾šr·šr°šr©šr¢šr›šr”šršr†šršrxšrqšrjšrcšr\šrUšrNšrGšr@šr9šr2šr+šr$šršršršršršrú™ró™rì™rå™rÞ™r×™rЙrÉ™r™r»™r´™r­™r¦™rŸ™r˜™r‘™rŠ™rƒ™r|™ru™rn™rg™r`™rY™rR™rK™rD™r=™r6™r/™r(™r!™r™r™r ™r™rþ˜r÷˜rð˜ré˜râ˜rÛ˜rÔ˜r͘rƘr¿˜r¸˜r±˜rª˜r£˜rœ˜r•˜rŽ˜r‡˜r€˜ry˜rr˜rk˜rd˜r]˜rV˜rO˜rH˜rA˜r:˜r3˜r,˜r%˜r˜r˜r˜r ˜r˜rû—rô—rí—ræ—rß—rØ—rÑ—rÊ—r×r¼—rµ—r®—r§—r —r™—r’—r‹—r„—r}—rv—ro—rh—ra—rZ—rS—rL—rE—r>—r7—r0—r)—r"—r—r—r —r—rÿ–rø–rñ–rê–rã–rÜ–rÕ–rΖrÇ–rÀ–r¹–r²–r«–r¤–r–r––r–rˆ–r–rz–rs–rl–re–r^–rW–rP–rI–rB–r;–r4–r-–r&–r–r–r–r –r–rü•rõ•rî•rç•rà•rÙ•rÒ•rË•rÄ•r½•r¶•r¯•r¨•r¡•rš•r“•rŒ•r…•r~•rw•rp•ri•rb•r[•rT•rM•rF•r?•r8•r1•r*•r#•r•r•r•r•r•rù”rò”rë”rä”rÝ”rÖ”rÏ”rÈ”rÁ”rº”r³”r¬”r¥”rž”r—”r”r‰”r‚”r{”rt”rm”rf”r_”rX”rQ”rJ”rC”r<”r5”r.”r'”r ”r”r”r ”r”rý“rö“rï“rè“rá“rÚ“rÓ“rÌ“rÅ“r¾“r·“r°“r©“r¢“r›“r”“r“r†“r“rx“rq“rj“rc“r\“rU“rN“rG“r@“r9“r2“r+“r$“r“r“r“r“r“rú’ró’rì’rå’rÞ’r×’rÐ’rÉ’rÂ’r»’r´’r­’r¦’rŸ’r˜’r‘’rŠ’rƒ’r|’ru’rn’rg’r`’rY’rR’rK’rD’r=’r6’r/’r(’r!’r’r’r ’r’rþ‘r÷‘rð‘ré‘râ‘rÛ‘rÔ‘rÍ‘rÆ‘r¿‘r¸‘r±‘rª‘r£‘rœ‘r•‘rŽ‘r‡‘r€‘ry‘rr‘rk‘rd‘r]‘rV‘rO‘rH‘rA‘r:‘r3‘r,‘r%‘r‘r‘r‘r ‘r‘rûrôrírærßrØrÑrÊrÃr¼rµr®r§r r™r’r‹r„r}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüŽrõŽrîŽrçŽràŽrÙŽrÒŽrËŽrÄŽr½Žr¶Žr¯Žr¨Žr¡ŽršŽr“ŽrŒŽr…Žr~ŽrwŽrpŽriŽrbŽr[ŽrTŽrMŽrFŽr?Žr8Žr1Žr*Žr#ŽrŽrŽrŽrŽrŽrùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr‰r7‰r0‰r)‰r"‰r‰r‰r ‰r‰rÿˆrøˆrñˆrêˆrãˆr܈rÕˆrΈrLjrÀˆr¹ˆr²ˆr«ˆr¤ˆrˆr–ˆrˆrˆˆrˆrzˆrsˆrlˆreˆr^ˆrWˆrPˆrIˆrBˆr;ˆr4ˆr-ˆr&ˆrˆrˆrˆr ˆrˆrü‡rõ‡rî‡rç‡rà‡rÙ‡rÒ‡rˇrćr½‡r¶‡r¯‡r¨‡r¡‡rš‡r“‡rŒ‡r…‡r~‡rw‡rp‡ri‡rb‡r[‡rT‡rM‡rF‡r?‡r8‡r1‡r*‡r#‡r‡r‡r‡r‡r‡rù†rò†rë†rä†r݆rÖ†rφrȆrÁ†rº†r³†r¬†r¥†rž†r—†r†r‰†r‚†r{†rt†rm†rf†r_†rX†rQ†rJ†rC†r<†r5†r.†r'†r †r†r†r †r†rý…rö…rï…rè…rá…rÚ…rÓ…rÌ…rÅ…r¾…r·…r°…r©…r¢…r›…r”…r…r†…r…rx…rq…rj…rc…r\…rU…rN…rG…r@…r9…r2…r+…r$…r…r…r…r…r…rú„ró„rì„rå„rÞ„rׄrЄrÉ„r„r»„r´„r­„r¦„rŸ„r˜„r‘„rŠ„rƒ„r|„ru„rn„rg„r`„rY„rR„rK„rD„r=„r6„r/„r(„r!„r„r„r „r„rþƒr÷ƒrðƒréƒrâƒrÛƒrÔƒr̓rƃr¿ƒr¸ƒr±ƒrªƒr£ƒrœƒr•ƒrŽƒr‡ƒr€ƒryƒrrƒrkƒrdƒr]ƒrVƒrOƒrHƒrAƒr:ƒr3ƒr,ƒr%ƒrƒrƒrƒr ƒrƒrû‚rô‚rí‚ræ‚rß‚rØ‚rÑ‚rÊ‚rÂr¼‚rµ‚r®‚r§‚r ‚r™‚r’‚r‹‚r„‚r}‚rv‚ro‚rh‚ra‚rZ‚rS‚rL‚rE‚r>‚r7‚r0‚r)‚r"‚r‚r‚r ‚r‚rÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrü€rõ€rî€rç€rà€rÙ€rÒ€rË€rÄ€r½€r¶€r¯€r¨€r¡€rš€r“€rŒ€r…€r~€rw€rp€ri€rb€r[€rT€rM€rF€r?€r8€r1€r*€r#€r€r€r€r€r€rùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrý~rö~rï~rè~rá~rÚ~rÓ~rÌ~rÅ~r¾~r·~r°~r©~r¢~r›~r”~r~r†~r~rx~rq~rj~rc~r\~rU~rN~rG~r@~r9~r2~r+~r$~r~r~r~r~r~rú}ró}rì}rå}rÞ}r×}rÐ}rÉ}rÂ}r»}r´}r­}r¦}rŸ}r˜}r‘}rŠ}rƒ}r|}ru}rn}rg}r`}rY}rR}rK}rD}r=}r6}r/}r(}r!}r}r}r }r}rþ|r÷|rð|ré|râ|rÛ|rÔ|rÍ|rÆ|r¿|r¸|r±|rª|r£|rœ|r•|rŽ|r‡|r€|ry|rr|rk|rd|r]|rV|rO|rH|rA|r:|r3|r,|r%|r|r|r|r |r|rû{rô{rí{ræ{rß{rØ{rÑ{rÊ{rÃ{r¼{rµ{r®{r§{r {r™{r’{r‹{r„{r}{rv{ro{rh{ra{rZ{rS{rL{rE{r>{r7{r0{r){r"{r{r{r {r{rÿzrøzrñzrêzrãzrÜzrÕzrÎzrÇzrÀzr¹zr²zr«zr¤zrzr–zrzrˆzrzrzzrszrlzrezr^zrWzrPzrIzrBzr;zr4zr-zr&zrzrzrzr zrzrüyrõyrîyrçyràyrÙyrÒyrËyrÄyr½yr¶yr¯yr¨yr¡yršyr“yrŒyr…yr~yrwyrpyriyrbyr[yrTyrMyrFyr?yr8yr1yr*yr#yryryryryryrùxròxrëxräxrÝxrÖxrÏxrÈxrÁxrºxr³xr¬xr¥xržxr—xrxr‰xr‚xr{xrtxrmxrfxr_xrXxrQxrJxrCxrtr7tr0tr)tr"trtrtr trtrÿsrøsrñsrêsrãsrÜsrÕsrÎsrÇsrÀsr¹sr²sr«sr¤srsr–srsrˆsrsrzsrssrlsresr^srWsrPsrIsrBsr;sr4sr-sr&srsrsrsr srsrürrõrrîrrçrràrrÙrrÒrrËrrÄrr½rr¶rr¯rr¨rr¡rršrr“rrŒrr…rr~rrwrrprrirrbrr[rrTrrMrrFrr?rr8rr1rr*rr#rrrrrrrrrrrrùqròqrëqräqrÝqrÖqrÏqrÈqrÁqrºqr³qr¬qr¥qržqr—qrqr‰qr‚qr{qrtqrmqrfqr_qrXqrQqrJqrCqrmr7mr0mr)mr"mrmrmr mrmrÿlrølrñlrêlrãlrÜlrÕlrÎlrÇlrÀlr¹lr²lr«lr¤lrlr–lrlrˆlrlrzlrslrllrelr^lrWlrPlrIlrBlr;lr4lr-lr&lrlrlrlr lrlrükrõkrîkrçkràkrÙkrÒkrËkrÄkr½kr¶kr¯kr¨kr¡krškr“krŒkr…kr~krwkrpkrikrbkr[krTkrMkrFkr?kr8kr1kr*kr#krkrkrkrkrkrùjròjrëjräjrÝjrÖjrÏjrÈjrÁjrºjr³jr¬jr¥jržjr—jrjr‰jr‚jr{jrtjrmjrfjr_jrXjrQjrJjrCjrfr7fr0fr)fr"frfrfr frfrÿerøerñerêerãerÜerÕerÎerÇerÀer¹er²er«er¤erer–ererˆererzerserlereer^erWerPerIerBer;er4er-er&erererer ererüdrõdrîdrçdràdrÙdrÒdrËdrÄdr½dr¶dr¯dr¨dr¡dršdr“drŒdr…dr~drwdrpdridrbdr[drTdrMdrFdr?dr8dr1dr*dr#drdrdrdrdrdrùcròcrëcräcrÝcrÖcrÏcrÈcrÁcrºcr³cr¬cr¥cržcr—crcr‰cr‚cr{crtcrmcrfcr_crXcrQcrJcrCcr_r7_r0_r)_r"_r_r_r _r_rÿ^rø^rñ^rê^rã^rÜ^rÕ^rÎ^rÇ^rÀ^r¹^r²^r«^r¤^r^r–^r^rˆ^r^rz^rs^rl^re^r^^rW^rP^rI^rB^r;^r4^r-^r&^r^r^r^r ^r^rü]rõ]rî]rç]rà]rÙ]rÒ]rË]rÄ]r½]r¶]r¯]r¨]r¡]rš]r“]rŒ]r…]r~]rw]rp]ri]rb]r[]rT]rM]rF]r?]r8]r1]r*]r#]r]r]r]r]r]rù\rò\rë\rä\rÝ\rÖ\rÏ\rÈ\rÁ\rº\r³\r¬\r¥\rž\r—\r\r‰\r‚\r{\rt\rm\rf\r_\rX\rQ\rJ\rC\r<\r5\r.\r'\r \r\r\r \r\rý[rö[rï[rè[rá[rÚ[rÓ[rÌ[rÅ[r¾[r·[r°[r©[r¢[r›[r”[r[r†[r[rx[rq[rj[rc[r\[rU[rN[rG[r@[r9[r2[r+[r$[r[r[r[r[r[rúZróZrìZråZrÞZr×ZrÐZrÉZrÂZr»Zr´Zr­Zr¦ZrŸZr˜Zr‘ZrŠZrƒZr|ZruZrnZrgZr`ZrYZrRZrKZrDZr=Zr6Zr/Zr(Zr!ZrZrZr ZrZrþYr÷YrðYréYrâYrÛYrÔYrÍYrÆYr¿Yr¸Yr±YrªYr£YrœYr•YrŽYr‡Yr€YryYrrYrkYrdYr]YrVYrOYrHYrAYr:Yr3Yr,Yr%YrYrYrYr YrYrûXrôXríXræXrßXrØXrÑXrÊXrÃXr¼XrµXr®Xr§Xr Xr™Xr’Xr‹Xr„Xr}XrvXroXrhXraXrZXrSXrLXrEXr>Xr7Xr0Xr)Xr"XrXrXr XrXrÿWrøWrñWrêWrãWrÜWrÕWrÎWrÇWrÀWr¹Wr²Wr«Wr¤WrWr–WrWrˆWrWrzWrsWrlWreWr^WrWWrPWrIWrBWr;Wr4Wr-Wr&WrWrWrWr WrWrüVrõVrîVrçVràVrÙVrÒVrËVrÄVr½Vr¶Vr¯Vr¨Vr¡VršVr“VrŒVr…Vr~VrwVrpVriVrbVr[VrTVrMVrFVr?Vr8Vr1Vr*Vr#VrVrVrVrVrVrùUròUrëUräUrÝUrÖUrÏUrÈUrÁUrºUr³Ur¬Ur¥UržUr—UrUr‰Ur‚Ur{UrtUrmUrfUr_UrXUrQUrJUrCUrQr7Qr0Qr)Qr"QrQrQr QrQrÿPrøPrñPrêPrãPrÜPrÕPrÎPrÇPrÀPr¹Pr²Pr«Pr¤PrPr–PrPrˆPrPrzPrsPrlPrePr^PrWPrPPrIPrBPr;Pr4Pr-Pr&PrPrPrPr PrPrüOrõOrîOrçOràOrÙOrÒOrËOrÄOr½Or¶Or¯Or¨Or¡OršOr“OrŒOr…Or~OrwOrpOriOrbOr[OrTOrMOrFOr?Or8Or1Or*Or#OrOrOrOrOrOrùNròNrëNräNrÝNrÖNrÏNrÈNrÁNrºNr³Nr¬Nr¥NržNr—NrNr‰Nr‚Nr{NrtNrmNrfNr_NrXNrQNrJNrCNrJr7Jr0Jr)Jr"JrJrJr JrJrÿIrøIrñIrêIrãIrÜIrÕIrÎIrÇIrÀIr¹Ir²Ir«Ir¤IrIr–IrIrˆIrIrzIrsIrlIreIr^IrWIrPIrIIrBIr;Ir4Ir-Ir&IrIrIrIr IrIrüHrõHrîHrçHràHrÙHrÒHrËHrÄHr½Hr¶Hr¯Hr¨Hr¡HršHr“HrŒHr…Hr~HrwHrpHriHrbHr[HrTHrMHrFHr?Hr8Hr1Hr*Hr#HrHrHrHrHrHrùGròGrëGräGrÝGrÖGrÏGrÈGrÁGrºGr³Gr¬Gr¥GržGr—GrGr‰Gr‚Gr{GrtGrmGrfGr_GrXGrQGrJGrCGrCr7Cr0Cr)Cr"CrCrCr CrCrÿBrøBrñBrêBrãBrÜBrÕBrÎBrÇBrÀBr¹Br²Br«Br¤BrBr–BrBrˆBrBrzBrsBrlBreBr^BrWBrPBrIBrBBr;Br4Br-Br&BrBrBrBr BrBrüArõArîArçAràArÙArÒArËArÄAr½Ar¶Ar¯Ar¨Ar¡AršAr“ArŒAr…Ar~ArwArpAriArbAr[ArTArMArFAr?Ar8Ar1Ar*Ar#ArArArArArArù@rò@rë@rä@rÝ@rÖ@rÏ@rÈ@rÁ@rº@r³@r¬@r¥@rž@r—@r@r‰@r‚@r{@rt@rm@rf@r_@rX@rQ@rJ@rC@r<@r5@r.@r'@r @r@r@r @r@rý?rö?rï?rè?rá?rÚ?rÓ?rÌ?rÅ?r¾?r·?r°?r©?r¢?r›?r”?r?r†?r?rx?rq?rj?rc?r\?rU?rN?rG?r@?r9?r2?r+?r$?r?r?r?r?r?rú>ró>rì>rå>rÞ>r×>rÐ>rÉ>rÂ>r»>r´>r­>r¦>rŸ>r˜>r‘>rŠ>rƒ>r|>ru>rn>rg>r`>rY>rR>rK>rD>r=>r6>r/>r(>r!>r>r>r >r>rþ=r÷=rð=ré=râ=rÛ=rÔ=rÍ=rÆ=r¿=r¸=r±=rª=r£=rœ=r•=rŽ=r‡=r€=ry=rr=rk=rd=r]=rV=rO=rH=rA=r:=r3=r,=r%=r=r=r=r =r=rû5r75r05r)5r"5r5r5r 5r5rÿ4rø4rñ4rê4rã4rÜ4rÕ4rÎ4rÇ4rÀ4r¹4r²4r«4r¤4r4r–4r4rˆ4r4rz4rs4rl4re4r^4rW4rP4rI4rB4r;4r44r-4r&4r4r4r4r 4r4rü3rõ3rî3rç3rà3rÙ3rÒ3rË3rÄ3r½3r¶3r¯3r¨3r¡3rš3r“3rŒ3r…3r~3rw3rp3ri3rb3r[3rT3rM3rF3r?3r83r13r*3r#3r3r3r3r3r3rù2rò2rë2rä2rÝ2rÖ2rÏ2rÈ2rÁ2rº2r³2r¬2r¥2rž2r—2r2r‰2r‚2r{2rt2rm2rf2r_2rX2rQ2rJ2rC2r<2r52r.2r'2r 2r2r2r 2r2rý1rö1rï1rè1rá1rÚ1rÓ1rÌ1rÅ1r¾1r·1r°1r©1r¢1r›1r”1r1r†1r1rx1rq1rj1rc1r\1rU1rN1rG1r@1r91r21r+1r$1r1r1r1r1r1rú0ró0rì0rå0rÞ0r×0rÐ0rÉ0rÂ0r»0r´0r­0r¦0rŸ0r˜0r‘0rŠ0rƒ0r|0ru0rn0rg0r`0rY0rR0rK0rD0r=0r60r/0r(0r!0r0r0r 0r0rþ/r÷/rð/ré/râ/rÛ/rÔ/rÍ/rÆ/r¿/r¸/r±/rª/r£/rœ/r•/rŽ/r‡/r€/ry/rr/rk/rd/r]/rV/rO/rH/rA/r:/r3/r,/r%/r/r/r/r /r/rû.rô.rí.ræ.rß.rØ.rÑ.rÊ.rÃ.r¼.rµ.r®.r§.r .r™.r’.r‹.r„.r}.rv.ro.rh.ra.rZ.rS.rL.rE.r>.r7.r0.r).r".r.r.r .r.rÿ-rø-rñ-rê-rã-rÜ-rÕ-rÎ-rÇ-rÀ-r¹-r²-r«-r¤-r-r–-r-rˆ-r-rz-rs-rl-re-r^-rW-rP-rI-rB-r;-r4-r--r&-r-r-r-r -r-rü,rõ,rî,rç,rà,rÙ,rÒ,rË,rÄ,r½,r¶,r¯,r¨,r¡,rš,r“,rŒ,r…,r~,rw,rp,ri,rb,r[,rT,rM,rF,r?,r8,r1,r*,r#,r,r,r,r,r,rù+rò+rë+rä+rÝ+rÖ+rÏ+rÈ+rÁ+rº+r³+r¬+r¥+rž+r—+r+r‰+r‚+r{+rt+rm+rf+r_+rX+rQ+rJ+rC+r<+r5+r.+r'+r +r+r+r +r+rý*rö*rï*rè*rá*rÚ*rÓ*rÌ*rÅ*r¾*r·*r°*r©*r¢*r›*r”*r*r†*r*rx*rq*rj*rc*r\*rU*rN*rG*r@*r9*r2*r+*r$*r*r*r*r*r*rú)ró)rì)rå)rÞ)r×)rÐ)rÉ)rÂ)r»)r´)r­)r¦)rŸ)r˜)r‘)rŠ)rƒ)r|)ru)rn)rg)r`)rY)rR)rK)rD)r=)r6)r/)r()r!)r)r)r )r)rþ(r÷(rð(ré(râ(rÛ(rÔ(rÍ(rÆ(r¿(r¸(r±(rª(r£(rœ(r•(rŽ(r‡(r€(ry(rr(rk(rd(r](rV(rO(rH(rA(r:(r3(r,(r%(r(r(r(r (r(rû'rô'rí'ræ'rß'rØ'rÑ'rÊ'rÃ'r¼'rµ'r®'r§'r 'r™'r’'r‹'r„'r}'rv'ro'rh'ra'rZ'rS'rL'rE'r>'r7'r0'r)'r"'r'r'r 'r'rÿ&rø&rñ&rê&rã&rÜ&rÕ&rÎ&rÇ&rÀ&r¹&r²&r«&r¤&r&r–&r&rˆ&r&rz&rs&rl&re&r^&rW&rP&rI&rB&r;&r4&r-&r&&r&r&r&r &r&rü%rõ%rî%rç%rà%rÙ%rÒ%rË%rÄ%r½%r¶%r¯%r¨%r¡%rš%r“%rŒ%r…%r~%rw%rp%ri%rb%r[%rT%rM%rF%r?%r8%r1%r*%r#%r%r%r%r%r%rù$rò$rë$rä$rÝ$rÖ$rÏ$rÈ$rÁ$rº$r³$r¬$r¥$rž$r—$r$r‰$r‚$r{$rt$rm$rf$r_$rX$rQ$rJ$rC$r<$r5$r.$r'$r $r$r$r $r$rý#rö#rï#rè#rá#rÚ#rÓ#rÌ#rÅ#r¾#r·#r°#r©#r¢#r›#r”#r#r†#r#rx#rq#rj#rc#r\#rU#rN#rG#r@#r9#r2#r+#r$#r#r#r#r#r#rú"ró"rì"rå"rÞ"r×"rÐ"rÉ"rÂ"r»"r´"r­"r¦"rŸ"r˜"r‘"rŠ"rƒ"r|"ru"rn"rg"r`"rY"rR"rK"rD"r="r6"r/"r("r!"r"r"r "r"rþ!r÷!rð!ré!râ!rÛ!rÔ!rÍ!rÆ!r¿!r¸!r±!rª!r£!rœ!r•!rŽ!r‡!r€!ry!rr!rk!rd!r]!rV!rO!rH!rA!r:!r3!r,!r%!r!r!r!r !r!rû rô rí ræ rß rØ rÑ rÊ rà r¼ rµ r® r§ r  r™ r’ r‹ r„ r} rv ro rh ra rZ rS rL rE r> r7 r0 r) r" r r r r rÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrýrörïrèrárÚrÓrÌrÅr¾r·r°r©r¢r›r”rr†rrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrúrórìrårÞr×rÐrÉrÂr»r´r­r¦rŸr˜r‘rŠrƒr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrþr÷rðrérârÛrÔrÍrÆr¿r¸r±rªr£rœr•rŽr‡r€ryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrûrôrírærßrØrÑrÊrÃr¼rµr®r§r r™r’r‹r„r}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrýrörïrèrárÚrÓrÌrÅr¾r·r°r©r¢r›r”rr†rrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrúrórìrårÞr×rÐrÉrÂr»r´r­r¦rŸr˜r‘rŠrƒr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrþr÷rðrérârÛrÔrÍrÆr¿r¸r±rªr£rœr•rŽr‡r€ryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrûrôrírærßrØrÑrÊrÃr¼rµr®r§r r™r’r‹r„r}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrýrörïrèrárÚrÓrÌrÅr¾r·r°r©r¢r›r”rr†rrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrú ró rì rå rÞ r× rÐ rÉ r r» r´ r­ r¦ rŸ r˜ r‘ rŠ rƒ r| ru rn rg r` rY rR rK rD r= r6 r/ r( r! r r r r rþ r÷ rð ré râ rÛ rÔ rÍ rÆ r¿ r¸ r± rª r£ rœ r• rŽ r‡ r€ ry rr rk rd r] rV rO rH rA r: r3 r, r% r r r r r rû rô rí ræ rß rØ rÑ rÊ rà r¼ rµ r® r§ r  r™ r’ r‹ r„ r} rv ro rh ra rZ rS rL rE r> r7 r0 r) r" r r r r rÿ rø rñ rê rã rÜ rÕ rÎ rÇ rÀ r¹ r² r« r¤ r r– r rˆ r rz rs rl re r^ rW rP rI rB r; r4 r- r& r r r r r rü rõ rî rç rà rÙ rÒ rË rÄ r½ r¶ r¯ r¨ r¡ rš r“ rŒ r… r~ rw rp ri rb r[ rT rM rF r? r8 r1 r* r# r r r r r rùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrýrörïrèrárÚrÓrÌrÅr¾r·r°r©r¢r›r”rr†rrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrúrórìrårÞr×rÐrÉrÂr»r´r­r¦rŸr˜r‘rŠrƒr|rurnrgr`rYrRrKrDr=r6r/r(r!rrr rrþr÷rðrérârÛrÔrÍrÆr¿r¸r±rªr£rœr•rŽr‡r€ryrrrkrdr]rVrOrHrAr:r3r,r%rrrr rrûrôrírærßrØrÑrÊrÃr¼rµr®r§r r™r’r‹r„r}rvrorhrarZrSrLrEr>r7r0r)r"rrr rrÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCr<r5r.r'r rrr rrýrörïrèrárÚrÓrÌrÅr¾r·r°r©r¢r›r”rr†rrxrqrjrcr\rUrNrGr@r9r2r+r$rrrrrrúÿqóÿqìÿqåÿqÞÿq×ÿqÐÿqÉÿqÂÿq»ÿq´ÿq­ÿq¦ÿqŸÿq˜ÿq‘ÿqŠÿqƒÿq|ÿquÿqnÿqgÿq`ÿqYÿqRÿqKÿqDÿq=ÿq6ÿq/ÿq(ÿq!ÿqÿqÿq ÿqÿqþþq÷þqðþqéþqâþqÛþqÔþqÍþqÆþq¿þq¸þq±þqªþq£þqœþq•þqŽþq‡þq€þqyþqrþqkþqdþq]þqVþqOþqHþqAþq:þq3þq,þq%þqþqþqþq þqþqûýqôýqíýqæýqßýqØýqÑýqÊýqÃýq¼ýqµýq®ýq§ýq ýq™ýq’ýq‹ýq„ýq}ýqvýqoýqhýqaýqZýqSýqLýqEýq>ýq7ýq0ýq)ýq"ýqýqýq ýqýqÿüqøüqñüqêüqãüqÜüqÕüqÎüqÇüqÀüq¹üq²üq«üq¤üqüq–üqüqˆüqüqzüqsüqlüqeüq^üqWüqPüqIüqBüq;üq4üq-üq&üqüqüqüq üqüqüûqõûqîûqçûqàûqÙûqÒûqËûqÄûq½ûq¶ûq¯ûq¨ûq¡ûqšûq“ûqŒûq…ûq~ûqwûqpûqiûqbûq[ûqTûqMûqFûq?ûq8ûq1ûq*ûq#ûqûqûqûqûqûqùúqòúqëúqäúqÝúqÖúqÏúqÈúqÁúqºúq³úq¬úq¥úqžúq—úqúq‰úq‚úq{úqtúqmúqfúq_úqXúqQúqJúqCúq<úq5úq.úq'úq úqúqúq úqúqýùqöùqïùqèùqáùqÚùqÓùqÌùqÅùq¾ùq·ùq°ùq©ùq¢ùq›ùq”ùqùq†ùqùqxùqqùqjùqcùq\ùqUùqNùqGùq@ùq9ùq2ùq+ùq$ùqùqùqùqùqùqúøqóøqìøqåøqÞøq×øqÐøqÉøqÂøq»øq´øq­øq¦øqŸøq˜øq‘øqŠøqƒøq|øquøqnøqgøq`øqYøqRøqKøqDøq=øq6øq/øq(øq!øqøqøq øqøqþ÷q÷÷qð÷qé÷qâ÷qÛ÷qÔ÷qÍ÷qÆ÷q¿÷q¸÷q±÷qª÷q£÷qœ÷q•÷qŽ÷q‡÷q€÷qy÷qr÷qk÷qd÷q]÷qV÷qO÷qH÷qA÷q:÷q3÷q,÷q%÷q÷q÷q÷q ÷q÷qûöqôöqíöqæöqßöqØöqÑöqÊöqÃöq¼öqµöq®öq§öq öq™öq’öq‹öq„öq}öqvöqoöqhöqaöqZöqSöqLöqEöq>öq7öq0öq)öq"öqöqöq öqöqÿõqøõqñõqêõqãõqÜõqÕõqÎõqÇõqÀõq¹õq²õq«õq¤õqõq–õqõqˆõqõqzõqsõqlõqeõq^õqWõqPõqIõqBõq;õq4õq-õq&õqõqõqõq õqõqüôqõôqîôqçôqàôqÙôqÒôqËôqÄôq½ôq¶ôq¯ôq¨ôq¡ôqšôq“ôqŒôq…ôq~ôqwôqpôqiôqbôq[ôqTôqMôqFôq?ôq8ôq1ôq*ôq#ôqôqôqôqôqôqùóqòóqëóqäóqÝóqÖóqÏóqÈóqÁóqºóq³óq¬óq¥óqžóq—óqóq‰óq‚óq{óqtóqmóqfóq_óqXóqQóqJóqCóq<óq5óq.óq'óq óqóqóq óqóqýòqöòqïòqèòqáòqÚòqÓòqÌòqÅòq¾òq·òq°òq©òq¢òq›òq”òqòq†òqòqxòqqòqjòqcòq\òqUòqNòqGòq@òq9òq2òq+òq$òqòqòqòqòqòqúñqóñqìñqåñqÞñq×ñqÐñqÉñqÂñq»ñq´ñq­ñq¦ñqŸñq˜ñq‘ñqŠñqƒñq|ñquñqnñqgñq`ñqYñqRñqKñqDñq=ñq6ñq/ñq(ñq!ñqñqñq ñqñqþðq÷ðqððqéðqâðqÛðqÔðqÍðqÆðq¿ðq¸ðq±ðqªðq£ðqœðq•ðqŽðq‡ðq€ðqyðqrðqkðqdðq]ðqVðqOðqHðqAðq:ðq3ðq,ðq%ðqðqðqðq ðqðqûïqôïqíïqæïqßïqØïqÑïqÊïqÃïq¼ïqµïq®ïq§ïq ïq™ïq’ïq‹ïq„ïq}ïqvïqoïqhïqaïqZïqSïqLïqEïq>ïq7ïq0ïq)ïq"ïqïqïq ïqïqÿîqøîqñîqêîqãîqÜîqÕîqÎîqÇîqÀîq¹îq²îq«îq¤îqîq–îqîqˆîqîqzîqsîqlîqeîq^îqWîqPîqIîqBîq;îq4îq-îq&îqîqîqîq îqîqüíqõíqîíqçíqàíqÙíqÒíqËíqÄíq½íq¶íq¯íq¨íq¡íqšíq“íqŒíq…íq~íqwíqpíqiíqbíq[íqTíqMíqFíq?íq8íq1íq*íq#íqíqíqíqíqíqùìqòìqëìqäìqÝìqÖìqÏìqÈìqÁìqºìq³ìq¬ìq¥ìqžìq—ìqìq‰ìq‚ìq{ìqtìqmìqfìq_ìqXìqQìqJìqCìq<ìq5ìq.ìq'ìq ìqìqìq ìqìqýëqöëqïëqèëqáëqÚëqÓëqÌëqÅëq¾ëq·ëq°ëq©ëq¢ëq›ëq”ëqëq†ëqëqxëqqëqjëqcëq\ëqUëqNëqGëq@ëq9ëq2ëq+ëq$ëqëqëqëqëqëqúêqóêqìêqåêqÞêq×êqÐêqÉêqÂêq»êq´êq­êq¦êqŸêq˜êq‘êqŠêqƒêq|êquêqnêqgêq`êqYêqRêqKêqDêq=êq6êq/êq(êq!êqêqêq êqêqþéq÷éqðéqééqâéqÛéqÔéqÍéqÆéq¿éq¸éq±éqªéq£éqœéq•éqŽéq‡éq€éqyéqréqkéqdéq]éqVéqOéqHéqAéq:éq3éq,éq%éqéqéqéq éqéqûèqôèqíèqæèqßèqØèqÑèqÊèqÃèq¼èqµèq®èq§èq èq™èq’èq‹èq„èq}èqvèqoèqhèqaèqZèqSèqLèqEèq>èq7èq0èq)èq"èqèqèq èqèqÿçqøçqñçqêçqãçqÜçqÕçqÎçqÇçqÀçq¹çq²çq«çq¤çqçq–çqçqˆçqçqzçqsçqlçqeçq^çqWçqPçqIçqBçq;çq4çq-çq&çqçqçqçq çqçqüæqõæqîæqçæqàæqÙæqÒæqËæqÄæq½æq¶æq¯æq¨æq¡æqšæq“æqŒæq…æq~æqwæqpæqiæqbæq[æqTæqMæqFæq?æq8æq1æq*æq#æqæqæqæqæqæqùåqòåqëåqäåqÝåqÖåqÏåqÈåqÁåqºåq³åq¬åq¥åqžåq—åqåq‰åq‚åq{åqtåqmåqfåq_åqXåqQåqJåqCåq<åq5åq.åq'åq åqåqåq åqåqýäqöäqïäqèäqáäqÚäqÓäqÌäqÅäq¾äq·äq°äq©äq¢äq›äq”äqäq†äqäqxäqqäqjäqcäq\äqUäqNäqGäq@äq9äq2äq+äq$äqäqäqäqäqäqúãqóãqìãqåãqÞãq×ãqÐãqÉãqÂãq»ãq´ãq­ãq¦ãqŸãq˜ãq‘ãqŠãqƒãq|ãquãqnãqgãq`ãqYãqRãqKãqDãq=ãq6ãq/ãq(ãq!ãqãqãq ãqãqþâq÷âqðâqéâqââqÛâqÔâqÍâqÆâq¿âq¸âq±âqªâq£âqœâq•âqŽâq‡âq€âqyâqrâqkâqdâq]âqVâqOâqHâqAâq:âq3âq,âq%âqâqâqâq âqâqûáqôáqíáqæáqßáqØáqÑáqÊáqÃáq¼áqµáq®áq§áq áq™áq’áq‹áq„áq}áqváqoáqháqaáqZáqSáqLáqEáq>áq7áq0áq)áq"áqáqáq áqáqÿàqøàqñàqêàqãàqÜàqÕàqÎàqÇàqÀàq¹àq²àq«àq¤àqàq–àqàqˆàqàqzàqsàqlàqeàq^àqWàqPàqIàqBàq;àq4àq-àq&àqàqàqàq àqàqüßqõßqîßqçßqàßqÙßqÒßqËßqÄßq½ßq¶ßq¯ßq¨ßq¡ßqšßq“ßqŒßq…ßq~ßqwßqpßqißqbßq[ßqTßqMßqFßq?ßq8ßq1ßq*ßq#ßqßqßqßqßqßqùÞqòÞqëÞqäÞqÝÞqÖÞqÏÞqÈÞqÁÞqºÞq³Þq¬Þq¥ÞqžÞq—ÞqÞq‰Þq‚Þq{ÞqtÞqmÞqfÞq_ÞqXÞqQÞqJÞqCÞq<Þq5Þq.Þq'Þq ÞqÞqÞq ÞqÞqýÝqöÝqïÝqèÝqáÝqÚÝqÓÝqÌÝqÅÝq¾Ýq·Ýq°Ýq©Ýq¢Ýq›Ýq”ÝqÝq†ÝqÝqxÝqqÝqjÝqcÝq\ÝqUÝqNÝqGÝq@Ýq9Ýq2Ýq+Ýq$ÝqÝqÝqÝqÝqÝqúÜqóÜqìÜqåÜqÞÜq×ÜqÐÜqÉÜqÂÜq»Üq´Üq­Üq¦ÜqŸÜq˜Üq‘ÜqŠÜqƒÜq|ÜquÜqnÜqgÜq`ÜqYÜqRÜqKÜqDÜq=Üq6Üq/Üq(Üq!ÜqÜqÜq ÜqÜqþÛq÷ÛqðÛqéÛqâÛqÛÛqÔÛqÍÛqÆÛq¿Ûq¸Ûq±ÛqªÛq£ÛqœÛq•ÛqŽÛq‡Ûq€ÛqyÛqrÛqkÛqdÛq]ÛqVÛqOÛqHÛqAÛq:Ûq3Ûq,Ûq%ÛqÛqÛqÛq ÛqÛqûÚqôÚqíÚqæÚqßÚqØÚqÑÚqÊÚqÃÚq¼ÚqµÚq®Úq§Úq Úq™Úq’Úq‹Úq„Úq}ÚqvÚqoÚqhÚqaÚqZÚqSÚqLÚqEÚq>Úq7Úq0Úq)Úq"ÚqÚqÚq ÚqÚqÿÙqøÙqñÙqêÙqãÙqÜÙqÕÙqÎÙqÇÙqÀÙq¹Ùq²Ùq«Ùq¤ÙqÙq–ÙqÙqˆÙqÙqzÙqsÙqlÙqeÙq^ÙqWÙqPÙqIÙqBÙq;Ùq4Ùq-Ùq&ÙqÙqÙqÙq ÙqÙqüØqõØqîØqçØqàØqÙØqÒØqËØqÄØq½Øq¶Øq¯Øq¨Øq¡ØqšØq“ØqŒØq…Øq~ØqwØqpØqiØqbØq[ØqTØqMØqFØq?Øq8Øq1Øq*Øq#ØqØqØqØqØqØqù×qò×që×qä×qÝ×qÖ×qÏ×qÈ×qÁ×qº×q³×q¬×q¥×qž×q—×q×q‰×q‚×q{×qt×qm×qf×q_×qX×qQ×qJ×qC×q<×q5×q.×q'×q ×q×q×q ×q×qýÖqöÖqïÖqèÖqáÖqÚÖqÓÖqÌÖqÅÖq¾Öq·Öq°Öq©Öq¢Öq›Öq”ÖqÖq†ÖqÖqxÖqqÖqjÖqcÖq\ÖqUÖqNÖqGÖq@Öq9Öq2Öq+Öq$ÖqÖqÖqÖqÖqÖqúÕqóÕqìÕqåÕqÞÕq×ÕqÐÕqÉÕqÂÕq»Õq´Õq­Õq¦ÕqŸÕq˜Õq‘ÕqŠÕqƒÕq|ÕquÕqnÕqgÕq`ÕqYÕqRÕqKÕqDÕq=Õq6Õq/Õq(Õq!ÕqÕqÕq ÕqÕqþÔq÷ÔqðÔqéÔqâÔqÛÔqÔÔqÍÔqÆÔq¿Ôq¸Ôq±ÔqªÔq£ÔqœÔq•ÔqŽÔq‡Ôq€ÔqyÔqrÔqkÔqdÔq]ÔqVÔqOÔqHÔqAÔq:Ôq3Ôq,Ôq%ÔqÔqÔqÔq ÔqÔqûÓqôÓqíÓqæÓqßÓqØÓqÑÓqÊÓqÃÓq¼ÓqµÓq®Óq§Óq Óq™Óq’Óq‹Óq„Óq}ÓqvÓqoÓqhÓqaÓqZÓqSÓqLÓqEÓq>Óq7Óq0Óq)Óq"ÓqÓqÓq ÓqÓqÿÒqøÒqñÒqêÒqãÒqÜÒqÕÒqÎÒqÇÒqÀÒq¹Òq²Òq«Òq¤ÒqÒq–ÒqÒqˆÒqÒqzÒqsÒqlÒqeÒq^ÒqWÒqPÒqIÒqBÒq;Òq4Òq-Òq&ÒqÒqÒqÒq ÒqÒqüÑqõÑqîÑqçÑqàÑqÙÑqÒÑqËÑqÄÑq½Ñq¶Ñq¯Ñq¨Ñq¡ÑqšÑq“ÑqŒÑq…Ñq~ÑqwÑqpÑqiÑqbÑq[ÑqTÑqMÑqFÑq?Ñq8Ñq1Ñq*Ñq#ÑqÑqÑqÑqÑqÑqùÐqòÐqëÐqäÐqÝÐqÖÐqÏÐqÈÐqÁÐqºÐq³Ðq¬Ðq¥ÐqžÐq—ÐqÐq‰Ðq‚Ðq{ÐqtÐqmÐqfÐq_ÐqXÐqQÐqJÐqCÐq<Ðq5Ðq.Ðq'Ðq ÐqÐqÐq ÐqÐqýÏqöÏqïÏqèÏqáÏqÚÏqÓÏqÌÏqÅÏq¾Ïq·Ïq°Ïq©Ïq¢Ïq›Ïq”ÏqÏq†ÏqÏqxÏqqÏqjÏqcÏq\ÏqUÏqNÏqGÏq@Ïq9Ïq2Ïq+Ïq$ÏqÏqÏqÏqÏqÏqúÎqóÎqìÎqåÎqÞÎq×ÎqÐÎqÉÎqÂÎq»Îq´Îq­Îq¦ÎqŸÎq˜Îq‘ÎqŠÎqƒÎq|ÎquÎqnÎqgÎq`ÎqYÎqRÎqKÎqDÎq=Îq6Îq/Îq(Îq!ÎqÎqÎq ÎqÎqþÍq÷ÍqðÍqéÍqâÍqÛÍqÔÍqÍÍqÆÍq¿Íq¸Íq±ÍqªÍq£ÍqœÍq•ÍqŽÍq‡Íq€ÍqyÍqrÍqkÍqdÍq]ÍqVÍqOÍqHÍqAÍq:Íq3Íq,Íq%ÍqÍqÍqÍq ÍqÍqûÌqôÌqíÌqæÌqßÌqØÌqÑÌqÊÌqÃÌq¼ÌqµÌq®Ìq§Ìq Ìq™Ìq’Ìq‹Ìq„Ìq}ÌqvÌqoÌqhÌqaÌqZÌqSÌqLÌqEÌq>Ìq7Ìq0Ìq)Ìq"ÌqÌqÌq ÌqÌqÿËqøËqñËqêËqãËqÜËqÕËqÎËqÇËqÀËq¹Ëq²Ëq«Ëq¤ËqËq–ËqËqˆËqËqzËqsËqlËqeËq^ËqWËqPËqIËqBËq;Ëq4Ëq-Ëq&ËqËqËqËq ËqËqüÊqõÊqîÊqçÊqàÊqÙÊqÒÊqËÊqÄÊq½Êq¶Êq¯Êq¨Êq¡ÊqšÊq“ÊqŒÊq…Êq~ÊqwÊqpÊqiÊqbÊq[ÊqTÊqMÊqFÊq?Êq8Êq1Êq*Êq#ÊqÊqÊqÊqÊqÊqùÉqòÉqëÉqäÉqÝÉqÖÉqÏÉqÈÉqÁÉqºÉq³Éq¬Éq¥ÉqžÉq—ÉqÉq‰Éq‚Éq{ÉqtÉqmÉqfÉq_ÉqXÉqQÉqJÉqCÉq<Éq5Éq.Éq'Éq ÉqÉqÉq ÉqÉqýÈqöÈqïÈqèÈqáÈqÚÈqÓÈqÌÈqÅÈq¾Èq·Èq°Èq©Èq¢Èq›Èq”ÈqÈq†ÈqÈqxÈqqÈqjÈqcÈq\ÈqUÈqNÈqGÈq@Èq9Èq2Èq+Èq$ÈqÈqÈqÈqÈqÈqúÇqóÇqìÇqåÇqÞÇq×ÇqÐÇqÉÇqÂÇq»Çq´Çq­Çq¦ÇqŸÇq˜Çq‘ÇqŠÇqƒÇq|ÇquÇqnÇqgÇq`ÇqYÇqRÇqKÇqDÇq=Çq6Çq/Çq(Çq!ÇqÇqÇq ÇqÇqþÆq÷ÆqðÆqéÆqâÆqÛÆqÔÆqÍÆqÆÆq¿Æq¸Æq±ÆqªÆq£ÆqœÆq•ÆqŽÆq‡Æq€ÆqyÆqrÆqkÆqdÆq]ÆqVÆqOÆqHÆqAÆq:Æq3Æq,Æq%ÆqÆqÆqÆq ÆqÆqûÅqôÅqíÅqæÅqßÅqØÅqÑÅqÊÅqÃÅq¼ÅqµÅq®Åq§Åq Åq™Åq’Åq‹Åq„Åq}ÅqvÅqoÅqhÅqaÅqZÅqSÅqLÅqEÅq>Åq7Åq0Åq)Åq"ÅqÅqÅq ÅqÅqÿÄqøÄqñÄqêÄqãÄqÜÄqÕÄqÎÄqÇÄqÀÄq¹Äq²Äq«Äq¤ÄqÄq–ÄqÄqˆÄqÄqzÄqsÄqlÄqeÄq^ÄqWÄqPÄqIÄqBÄq;Äq4Äq-Äq&ÄqÄqÄqÄq ÄqÄqüÃqõÃqîÃqçÃqàÃqÙÃqÒÃqËÃqÄÃq½Ãq¶Ãq¯Ãq¨Ãq¡ÃqšÃq“ÃqŒÃq…Ãq~ÃqwÃqpÃqiÃqbÃq[ÃqTÃqMÃqFÃq?Ãq8Ãq1Ãq*Ãq#ÃqÃqÃqÃqÃqÃqùÂqòÂqëÂqäÂqÝÂqÖÂqÏÂqÈÂqÁÂqºÂq³Âq¬Âq¥ÂqžÂq—ÂqÂq‰Âq‚Âq{ÂqtÂqmÂqfÂq_ÂqXÂqQÂqJÂqCÂq<Âq5Âq.Âq'Âq ÂqÂqÂq ÂqÂqýÁqöÁqïÁqèÁqáÁqÚÁqÓÁqÌÁqÅÁq¾Áq·Áq°Áq©Áq¢Áq›Áq”ÁqÁq†ÁqÁqxÁqqÁqjÁqcÁq\ÁqUÁqNÁqGÁq@Áq9Áq2Áq+Áq$ÁqÁqÁqÁqÁqÁqúÀqóÀqìÀqåÀqÞÀq×ÀqÐÀqÉÀqÂÀq»Àq´Àq­Àq¦ÀqŸÀq˜Àq‘ÀqŠÀqƒÀq|ÀquÀqnÀqgÀq`ÀqYÀqRÀqKÀqDÀq=Àq6Àq/Àq(Àq!ÀqÀqÀq ÀqÀqþ¿q÷¿qð¿qé¿qâ¿qÛ¿qÔ¿qÍ¿qÆ¿q¿¿q¸¿q±¿qª¿q£¿qœ¿q•¿qŽ¿q‡¿q€¿qy¿qr¿qk¿qd¿q]¿qV¿qO¿qH¿qA¿q:¿q3¿q,¿q%¿q¿q¿q¿q ¿q¿qû¾qô¾qí¾qæ¾qß¾qؾqѾqʾqþq¼¾qµ¾q®¾q§¾q ¾q™¾q’¾q‹¾q„¾q}¾qv¾qo¾qh¾qa¾qZ¾qS¾qL¾qE¾q>¾q7¾q0¾q)¾q"¾q¾q¾q ¾q¾qÿ½qø½qñ½qê½qã½qܽqÕ½qνqǽqÀ½q¹½q²½q«½q¤½q½q–½q½qˆ½q½qz½qs½ql½qe½q^½qW½qP½qI½qB½q;½q4½q-½q&½q½q½q½q ½q½qü¼qõ¼qî¼qç¼qà¼qÙ¼qÒ¼q˼qļq½¼q¶¼q¯¼q¨¼q¡¼qš¼q“¼qŒ¼q…¼q~¼qw¼qp¼qi¼qb¼q[¼qT¼qM¼qF¼q?¼q8¼q1¼q*¼q#¼q¼q¼q¼q¼q¼qù»qò»që»qä»qÝ»qÖ»qÏ»qÈ»qÁ»qº»q³»q¬»q¥»qž»q—»q»q‰»q‚»q{»qt»qm»qf»q_»qX»qQ»qJ»qC»q<»q5»q.»q'»q »q»q»q »q»qýºqöºqïºqèºqáºqÚºqÓºq̺qźq¾ºq·ºq°ºq©ºq¢ºq›ºq”ºqºq†ºqºqxºqqºqjºqcºq\ºqUºqNºqGºq@ºq9ºq2ºq+ºq$ºqºqºqºqºqºqú¹qó¹qì¹qå¹qÞ¹q×¹qйqɹq¹q»¹q´¹q­¹q¦¹qŸ¹q˜¹q‘¹qйqƒ¹q|¹qu¹qn¹qg¹q`¹qY¹qR¹qK¹qD¹q=¹q6¹q/¹q(¹q!¹q¹q¹q ¹q¹qþ¸q÷¸qð¸qé¸qâ¸qÛ¸qÔ¸q͸qƸq¿¸q¸¸q±¸qª¸q£¸qœ¸q•¸qޏq‡¸q€¸qy¸qr¸qk¸qd¸q]¸qV¸qO¸qH¸qA¸q:¸q3¸q,¸q%¸q¸q¸q¸q ¸q¸qû·qô·qí·qæ·qß·qØ·qÑ·qÊ·q÷q¼·qµ·q®·q§·q ·q™·q’·q‹·q„·q}·qv·qo·qh·qa·qZ·qS·qL·qE·q>·q7·q0·q)·q"·q·q·q ·q·qÿ¶qø¶qñ¶qê¶qã¶qܶqÕ¶qζqǶqÀ¶q¹¶q²¶q«¶q¤¶q¶q–¶q¶qˆ¶q¶qz¶qs¶ql¶qe¶q^¶qW¶qP¶qI¶qB¶q;¶q4¶q-¶q&¶q¶q¶q¶q ¶q¶qüµqõµqîµqçµqàµqÙµqÒµq˵qĵq½µq¶µq¯µq¨µq¡µqšµq“µqŒµq…µq~µqwµqpµqiµqbµq[µqTµqMµqFµq?µq8µq1µq*µq#µqµqµqµqµqµqù´qò´që´qä´qÝ´qÖ´qÏ´qÈ´qÁ´qº´q³´q¬´q¥´qž´q—´q´q‰´q‚´q{´qt´qm´qf´q_´qX´qQ´qJ´qC´q<´q5´q.´q'´q ´q´q´q ´q´qý³qö³qï³qè³qá³qÚ³qÓ³q̳qųq¾³q·³q°³q©³q¢³q›³q”³q³q†³q³qx³qq³qj³qc³q\³qU³qN³qG³q@³q9³q2³q+³q$³q³q³q³q³q³qú²qó²qì²qå²qÞ²qײqвqɲq²q»²q´²q­²q¦²qŸ²q˜²q‘²qвqƒ²q|²qu²qn²qg²q`²qY²qR²qK²qD²q=²q6²q/²q(²q!²q²q²q ²q²qþ±q÷±qð±qé±qâ±qÛ±qÔ±qͱqƱq¿±q¸±q±±qª±q£±qœ±q•±qޱq‡±q€±qy±qr±qk±qd±q]±qV±qO±qH±qA±q:±q3±q,±q%±q±q±q±q ±q±qû°qô°qí°qæ°qß°qذqѰqʰqðq¼°qµ°q®°q§°q °q™°q’°q‹°q„°q}°qv°qo°qh°qa°qZ°qS°qL°qE°q>°q7°q0°q)°q"°q°q°q °q°qÿ¯qø¯qñ¯qê¯qã¯qܯqÕ¯qίqǯqÀ¯q¹¯q²¯q«¯q¤¯q¯q–¯q¯qˆ¯q¯qz¯qs¯ql¯qe¯q^¯qW¯qP¯qI¯qB¯q;¯q4¯q-¯q&¯q¯q¯q¯q ¯q¯qü®qõ®qî®qç®qà®qÙ®qÒ®qË®qÄ®q½®q¶®q¯®q¨®q¡®qš®q“®qŒ®q…®q~®qw®qp®qi®qb®q[®qT®qM®qF®q?®q8®q1®q*®q#®q®q®q®q®q®qù­qò­që­qä­qÝ­qÖ­qÏ­qÈ­qÁ­qº­q³­q¬­q¥­qž­q—­q­q‰­q‚­q{­qt­qm­qf­q_­qX­qQ­qJ­qC­q<­q5­q.­q'­q ­q­q­q ­q­qý¬qö¬qï¬qè¬qá¬qÚ¬qÓ¬q̬qŬq¾¬q·¬q°¬q©¬q¢¬q›¬q”¬q¬q†¬q¬qx¬qq¬qj¬qc¬q\¬qU¬qN¬qG¬q@¬q9¬q2¬q+¬q$¬q¬q¬q¬q¬q¬qú«qó«qì«qå«qÞ«q׫qЫqÉ«q«q»«q´«q­«q¦«qŸ«q˜«q‘«qŠ«qƒ«q|«qu«qn«qg«q`«qY«qR«qK«qD«q=«q6«q/«q(«q!«q«q«q «q«qþªq÷ªqðªqéªqâªqÛªqÔªqͪqƪq¿ªq¸ªq±ªqªªq£ªqœªq•ªqŽªq‡ªq€ªqyªqrªqkªqdªq]ªqVªqOªqHªqAªq:ªq3ªq,ªq%ªqªqªqªq ªqªqû©qô©qí©qæ©qß©qØ©qÑ©qÊ©qéq¼©qµ©q®©q§©q ©q™©q’©q‹©q„©q}©qv©qo©qh©qa©qZ©qS©qL©qE©q>©q7©q0©q)©q"©q©q©q ©q©qÿ¨qø¨qñ¨qê¨qã¨qܨqÕ¨qΨqǨqÀ¨q¹¨q²¨q«¨q¤¨q¨q–¨q¨qˆ¨q¨qz¨qs¨ql¨qe¨q^¨qW¨qP¨qI¨qB¨q;¨q4¨q-¨q&¨q¨q¨q¨q ¨q¨qü§qõ§qî§qç§qà§qÙ§qÒ§q˧qħq½§q¶§q¯§q¨§q¡§qš§q“§qŒ§q…§q~§qw§qp§qi§qb§q[§qT§qM§qF§q?§q8§q1§q*§q#§q§q§q§q§q§qù¦qò¦që¦qä¦qݦqÖ¦qϦqȦqÁ¦qº¦q³¦q¬¦q¥¦qž¦q—¦q¦q‰¦q‚¦q{¦qt¦qm¦qf¦q_¦qX¦qQ¦qJ¦qC¦q<¦q5¦q.¦q'¦q ¦q¦q¦q ¦q¦qý¥qö¥qï¥qè¥qá¥qÚ¥qÓ¥qÌ¥qÅ¥q¾¥q·¥q°¥q©¥q¢¥q›¥q”¥q¥q†¥q¥qx¥qq¥qj¥qc¥q\¥qU¥qN¥qG¥q@¥q9¥q2¥q+¥q$¥q¥q¥q¥q¥q¥qú¤qó¤qì¤qå¤qÞ¤qפqФqɤq¤q»¤q´¤q­¤q¦¤qŸ¤q˜¤q‘¤qФqƒ¤q|¤qu¤qn¤qg¤q`¤qY¤qR¤qK¤qD¤q=¤q6¤q/¤q(¤q!¤q¤q¤q ¤q¤qþ£q÷£qð£qé£qâ£qÛ£qÔ£qÍ£qÆ£q¿£q¸£q±£qª£q££qœ£q•£qŽ£q‡£q€£qy£qr£qk£qd£q]£qV£qO£qH£qA£q:£q3£q,£q%£q£q£q£q £q£qû¢qô¢qí¢qæ¢qߢqØ¢qÑ¢qÊ¢qâq¼¢qµ¢q®¢q§¢q ¢q™¢q’¢q‹¢q„¢q}¢qv¢qo¢qh¢qa¢qZ¢qS¢qL¢qE¢q>¢q7¢q0¢q)¢q"¢q¢q¢q ¢q¢qÿ¡qø¡qñ¡qê¡qã¡qÜ¡qÕ¡qΡqÇ¡qÀ¡q¹¡q²¡q«¡q¤¡q¡q–¡q¡qˆ¡q¡qz¡qs¡ql¡qe¡q^¡qW¡qP¡qI¡qB¡q;¡q4¡q-¡q&¡q¡q¡q¡q ¡q¡qü qõ qî qç qà qÙ qÒ qË qÄ q½ q¶ q¯ q¨ q¡ qš q“ qŒ q… q~ qw qp qi qb q[ qT qM qF q? q8 q1 q* q# q q q q q qùŸqòŸqëŸqäŸqÝŸqÖŸqÏŸqÈŸqÁŸqºŸq³Ÿq¬Ÿq¥ŸqžŸq—ŸqŸq‰Ÿq‚Ÿq{ŸqtŸqmŸqfŸq_ŸqXŸqQŸqJŸqCŸq<Ÿq5Ÿq.Ÿq'Ÿq ŸqŸqŸq ŸqŸqýžqöžqïžqèžqážqÚžqÓžqÌžqÅžq¾žq·žq°žq©žq¢žq›žq”žqžq†žqžqxžqqžqjžqcžq\žqUžqNžqGžq@žq9žq2žq+žq$žqžqžqžqžqžqúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþœq÷œqðœqéœqâœqÛœqÔœqÍœqÆœq¿œq¸œq±œqªœq£œqœœq•œqŽœq‡œq€œqyœqrœqkœqdœq]œqVœqOœqHœqAœq:œq3œq,œq%œqœqœqœq œqœqû›qô›qí›qæ›qß›qØ›qÑ›qÊ›qÛq¼›qµ›q®›q§›q ›q™›q’›q‹›q„›q}›qv›qo›qh›qa›qZ›qS›qL›qE›q>›q7›q0›q)›q"›q›q›q ›q›qÿšqøšqñšqêšqãšqÜšqÕšqΚqÇšqÀšq¹šq²šq«šq¤šqšq–šqšqˆšqšqzšqsšqlšqešq^šqWšqPšqIšqBšq;šq4šq-šq&šqšqšqšq šqšqü™qõ™qî™qç™qà™qÙ™qÒ™qË™qÄ™q½™q¶™q¯™q¨™q¡™qš™q“™qŒ™q…™q~™qw™qp™qi™qb™q[™qT™qM™qF™q?™q8™q1™q*™q#™q™q™q™q™q™qù˜qò˜që˜qä˜qݘqÖ˜qϘqȘqÁ˜qº˜q³˜q¬˜q¥˜qž˜q—˜q˜q‰˜q‚˜q{˜qt˜qm˜qf˜q_˜qX˜qQ˜qJ˜qC˜q<˜q5˜q.˜q'˜q ˜q˜q˜q ˜q˜qý—qö—qï—qè—qá—qÚ—qÓ—qÌ—qÅ—q¾—q·—q°—q©—q¢—q›—q”—q—q†—q—qx—qq—qj—qc—q\—qU—qN—qG—q@—q9—q2—q+—q$—q—q—q—q—q—qú–qó–qì–qå–qÞ–q×–qЖqÉ–q–q»–q´–q­–q¦–qŸ–q˜–q‘–qŠ–qƒ–q|–qu–qn–qg–q`–qY–qR–qK–qD–q=–q6–q/–q(–q!–q–q–q –q–qþ•q÷•qð•qé•qâ•qÛ•qÔ•qÍ•qÆ•q¿•q¸•q±•qª•q£•qœ•q••qŽ•q‡•q€•qy•qr•qk•qd•q]•qV•qO•qH•qA•q:•q3•q,•q%•q•q•q•q •q•qû”qô”qí”qæ”qß”qØ”qÑ”qÊ”qÔq¼”qµ”q®”q§”q ”q™”q’”q‹”q„”q}”qv”qo”qh”qa”qZ”qS”qL”qE”q>”q7”q0”q)”q"”q”q”q ”q”qÿ“qø“qñ“qê“qã“qÜ“qÕ“qΓqÇ“qÀ“q¹“q²“q«“q¤“q“q–“q“qˆ“q“qz“qs“ql“qe“q^“qW“qP“qI“qB“q;“q4“q-“q&“q“q“q“q “q“qü’qõ’qî’qç’qà’qÙ’qÒ’qË’qÄ’q½’q¶’q¯’q¨’q¡’qš’q“’qŒ’q…’q~’qw’qp’qi’qb’q[’qT’qM’qF’q?’q8’q1’q*’q#’q’q’q’q’q’qù‘qò‘që‘qä‘qÝ‘qÖ‘qÏ‘qÈ‘qÁ‘qº‘q³‘q¬‘q¥‘qž‘q—‘q‘q‰‘q‚‘q{‘qt‘qm‘qf‘q_‘qX‘qQ‘qJ‘qC‘q<‘q5‘q.‘q'‘q ‘q‘q‘q ‘q‘qýqöqïqèqáqÚqÓqÌqÅq¾q·q°q©q¢q›q”qq†qqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþŽq÷ŽqðŽqéŽqâŽqÛŽqÔŽqÍŽqÆŽq¿Žq¸Žq±ŽqªŽq£ŽqœŽq•ŽqŽŽq‡Žq€ŽqyŽqrŽqkŽqdŽq]ŽqVŽqOŽqHŽqAŽq:Žq3Žq,Žq%ŽqŽqŽqŽq ŽqŽqûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿŒqøŒqñŒqêŒqãŒqÜŒqÕŒqÎŒqÇŒqÀŒq¹Œq²Œq«Œq¤ŒqŒq–ŒqŒqˆŒqŒqzŒqsŒqlŒqeŒq^ŒqWŒqPŒqIŒqBŒq;Œq4Œq-Œq&ŒqŒqŒqŒq ŒqŒqü‹qõ‹qî‹qç‹qà‹qÙ‹qÒ‹qË‹qÄ‹q½‹q¶‹q¯‹q¨‹q¡‹qš‹q“‹qŒ‹q…‹q~‹qw‹qp‹qi‹qb‹q[‹qT‹qM‹qF‹q?‹q8‹q1‹q*‹q#‹q‹q‹q‹q‹q‹qùŠqòŠqëŠqäŠqÝŠqÖŠqÏŠqÈŠqÁŠqºŠq³Šq¬Šq¥ŠqžŠq—ŠqŠq‰Šq‚Šq{ŠqtŠqmŠqfŠq_ŠqXŠqQŠqJŠqCŠq<Šq5Šq.Šq'Šq ŠqŠqŠq ŠqŠqý‰qö‰qï‰qè‰qá‰qÚ‰qÓ‰q̉qʼnq¾‰q·‰q°‰q©‰q¢‰q›‰q”‰q‰q†‰q‰qx‰qq‰qj‰qc‰q\‰qU‰qN‰qG‰q@‰q9‰q2‰q+‰q$‰q‰q‰q‰q‰q‰qúˆqóˆqìˆqåˆqÞˆq׈qЈqɈqˆq»ˆq´ˆq­ˆq¦ˆqŸˆq˜ˆq‘ˆqŠˆqƒˆq|ˆquˆqnˆqgˆq`ˆqYˆqRˆqKˆqDˆq=ˆq6ˆq/ˆq(ˆq!ˆqˆqˆq ˆqˆqþ‡q÷‡qð‡qé‡qâ‡qÛ‡qÔ‡q͇qƇq¿‡q¸‡q±‡qª‡q£‡qœ‡q•‡qއq‡‡q€‡qy‡qr‡qk‡qd‡q]‡qV‡qO‡qH‡qA‡q:‡q3‡q,‡q%‡q‡q‡q‡q ‡q‡qû†qô†qí†qæ†q߆q؆qцqʆqÆq¼†qµ†q®†q§†q †q™†q’†q‹†q„†q}†qv†qo†qh†qa†qZ†qS†qL†qE†q>†q7†q0†q)†q"†q†q†q †q†qÿ…qø…qñ…qê…qã…qÜ…qÕ…qÎ…qÇ…qÀ…q¹…q²…q«…q¤…q…q–…q…qˆ…q…qz…qs…ql…qe…q^…qW…qP…qI…qB…q;…q4…q-…q&…q…q…q…q …q…qü„qõ„qî„qç„qà„qÙ„qÒ„qË„qÄ„q½„q¶„q¯„q¨„q¡„qš„q“„qŒ„q…„q~„qw„qp„qi„qb„q[„qT„qM„qF„q?„q8„q1„q*„q#„q„q„q„q„q„qùƒqòƒqëƒqäƒq݃qÖƒqσqȃqÁƒqºƒq³ƒq¬ƒq¥ƒqžƒq—ƒqƒq‰ƒq‚ƒq{ƒqtƒqmƒqfƒq_ƒqXƒqQƒqJƒqCƒq<ƒq5ƒq.ƒq'ƒq ƒqƒqƒq ƒqƒqý‚qö‚qï‚qè‚qá‚qÚ‚qÓ‚qÌ‚qÅ‚q¾‚q·‚q°‚q©‚q¢‚q›‚q”‚q‚q†‚q‚qx‚qq‚qj‚qc‚q\‚qU‚qN‚qG‚q@‚q9‚q2‚q+‚q$‚q‚q‚q‚q‚q‚qúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþ€q÷€qð€qé€qâ€qÛ€qÔ€qÍ€qÆ€q¿€q¸€q±€qª€q£€qœ€q•€qŽ€q‡€q€€qy€qr€qk€qd€q]€qV€qO€qH€qA€q:€q3€q,€q%€q€q€q€q €q€qûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿ~qø~qñ~qê~qã~qÜ~qÕ~qÎ~qÇ~qÀ~q¹~q²~q«~q¤~q~q–~q~qˆ~q~qz~qs~ql~qe~q^~qW~qP~qI~qB~q;~q4~q-~q&~q~q~q~q ~q~qü}qõ}qî}qç}qà}qÙ}qÒ}qË}qÄ}q½}q¶}q¯}q¨}q¡}qš}q“}qŒ}q…}q~}qw}qp}qi}qb}q[}qT}qM}qF}q?}q8}q1}q*}q#}q}q}q}q}q}qù|qò|që|qä|qÝ|qÖ|qÏ|qÈ|qÁ|qº|q³|q¬|q¥|qž|q—|q|q‰|q‚|q{|qt|qm|qf|q_|qX|qQ|qJ|qC|q<|q5|q.|q'|q |q|q|q |q|qý{qö{qï{qè{qá{qÚ{qÓ{qÌ{qÅ{q¾{q·{q°{q©{q¢{q›{q”{q{q†{q{qx{qq{qj{qc{q\{qU{qN{qG{q@{q9{q2{q+{q${q{q{q{q{q{qúzqózqìzqåzqÞzq×zqÐzqÉzqÂzq»zq´zq­zq¦zqŸzq˜zq‘zqŠzqƒzq|zquzqnzqgzq`zqYzqRzqKzqDzq=zq6zq/zq(zq!zqzqzq zqzqþyq÷yqðyqéyqâyqÛyqÔyqÍyqÆyq¿yq¸yq±yqªyq£yqœyq•yqŽyq‡yq€yqyyqryqkyqdyq]yqVyqOyqHyqAyq:yq3yq,yq%yqyqyqyq yqyqûxqôxqíxqæxqßxqØxqÑxqÊxqÃxq¼xqµxq®xq§xq xq™xq’xq‹xq„xq}xqvxqoxqhxqaxqZxqSxqLxqExq>xq7xq0xq)xq"xqxqxq xqxqÿwqøwqñwqêwqãwqÜwqÕwqÎwqÇwqÀwq¹wq²wq«wq¤wqwq–wqwqˆwqwqzwqswqlwqewq^wqWwqPwqIwqBwq;wq4wq-wq&wqwqwqwq wqwqüvqõvqîvqçvqàvqÙvqÒvqËvqÄvq½vq¶vq¯vq¨vq¡vqšvq“vqŒvq…vq~vqwvqpvqivqbvq[vqTvqMvqFvq?vq8vq1vq*vq#vqvqvqvqvqvqùuqòuqëuqäuqÝuqÖuqÏuqÈuqÁuqºuq³uq¬uq¥uqžuq—uquq‰uq‚uq{uqtuqmuqfuq_uqXuqQuqJuqCuqqq7qq0qq)qq"qqqqqq qqqqÿpqøpqñpqêpqãpqÜpqÕpqÎpqÇpqÀpq¹pq²pq«pq¤pqpq–pqpqˆpqpqzpqspqlpqepq^pqWpqPpqIpqBpq;pq4pq-pq&pqpqpqpq pqpqüoqõoqîoqçoqàoqÙoqÒoqËoqÄoq½oq¶oq¯oq¨oq¡oqšoq“oqŒoq…oq~oqwoqpoqioqboq[oqToqMoqFoq?oq8oq1oq*oq#oqoqoqoqoqoqùnqònqënqänqÝnqÖnqÏnqÈnqÁnqºnq³nq¬nq¥nqžnq—nqnq‰nq‚nq{nqtnqmnqfnq_nqXnqQnqJnqCnqjq7jq0jq)jq"jqjqjq jqjqÿiqøiqñiqêiqãiqÜiqÕiqÎiqÇiqÀiq¹iq²iq«iq¤iqiq–iqiqˆiqiqziqsiqliqeiq^iqWiqPiqIiqBiq;iq4iq-iq&iqiqiqiq iqiqühqõhqîhqçhqàhqÙhqÒhqËhqÄhq½hq¶hq¯hq¨hq¡hqšhq“hqŒhq…hq~hqwhqphqihqbhq[hqThqMhqFhq?hq8hq1hq*hq#hqhqhqhqhqhqùgqògqëgqägqÝgqÖgqÏgqÈgqÁgqºgq³gq¬gq¥gqžgq—gqgq‰gq‚gq{gqtgqmgqfgq_gqXgqQgqJgqCgqcq7cq0cq)cq"cqcqcq cqcqÿbqøbqñbqêbqãbqÜbqÕbqÎbqÇbqÀbq¹bq²bq«bq¤bqbq–bqbqˆbqbqzbqsbqlbqebq^bqWbqPbqIbqBbq;bq4bq-bq&bqbqbqbq bqbqüaqõaqîaqçaqàaqÙaqÒaqËaqÄaq½aq¶aq¯aq¨aq¡aqšaq“aqŒaq…aq~aqwaqpaqiaqbaq[aqTaqMaqFaq?aq8aq1aq*aq#aqaqaqaqaqaqù`qò`që`qä`qÝ`qÖ`qÏ`qÈ`qÁ`qº`q³`q¬`q¥`qž`q—`q`q‰`q‚`q{`qt`qm`qf`q_`qX`qQ`qJ`qC`q<`q5`q.`q'`q `q`q`q `q`qý_qö_qï_qè_qá_qÚ_qÓ_qÌ_qÅ_q¾_q·_q°_q©_q¢_q›_q”_q_q†_q_qx_qq_qj_qc_q\_qU_qN_qG_q@_q9_q2_q+_q$_q_q_q_q_q_qú^qó^qì^qå^qÞ^q×^qÐ^qÉ^qÂ^q»^q´^q­^q¦^qŸ^q˜^q‘^qŠ^qƒ^q|^qu^qn^qg^q`^qY^qR^qK^qD^q=^q6^q/^q(^q!^q^q^q ^q^qþ]q÷]qð]qé]qâ]qÛ]qÔ]qÍ]qÆ]q¿]q¸]q±]qª]q£]qœ]q•]qŽ]q‡]q€]qy]qr]qk]qd]q]]qV]qO]qH]qA]q:]q3]q,]q%]q]q]q]q ]q]qû\qô\qí\qæ\qß\qØ\qÑ\qÊ\qÃ\q¼\qµ\q®\q§\q \q™\q’\q‹\q„\q}\qv\qo\qh\qa\qZ\qS\qL\qE\q>\q7\q0\q)\q"\q\q\q \q\qÿ[qø[qñ[qê[qã[qÜ[qÕ[qÎ[qÇ[qÀ[q¹[q²[q«[q¤[q[q–[q[qˆ[q[qz[qs[ql[qe[q^[qW[qP[qI[qB[q;[q4[q-[q&[q[q[q[q [q[qüZqõZqîZqçZqàZqÙZqÒZqËZqÄZq½Zq¶Zq¯Zq¨Zq¡ZqšZq“ZqŒZq…Zq~ZqwZqpZqiZqbZq[ZqTZqMZqFZq?Zq8Zq1Zq*Zq#ZqZqZqZqZqZqùYqòYqëYqäYqÝYqÖYqÏYqÈYqÁYqºYq³Yq¬Yq¥YqžYq—YqYq‰Yq‚Yq{YqtYqmYqfYq_YqXYqQYqJYqCYqUq7Uq0Uq)Uq"UqUqUq UqUqÿTqøTqñTqêTqãTqÜTqÕTqÎTqÇTqÀTq¹Tq²Tq«Tq¤TqTq–TqTqˆTqTqzTqsTqlTqeTq^TqWTqPTqITqBTq;Tq4Tq-Tq&TqTqTqTq TqTqüSqõSqîSqçSqàSqÙSqÒSqËSqÄSq½Sq¶Sq¯Sq¨Sq¡SqšSq“SqŒSq…Sq~SqwSqpSqiSqbSq[SqTSqMSqFSq?Sq8Sq1Sq*Sq#SqSqSqSqSqSqùRqòRqëRqäRqÝRqÖRqÏRqÈRqÁRqºRq³Rq¬Rq¥RqžRq—RqRq‰Rq‚Rq{RqtRqmRqfRq_RqXRqQRqJRqCRqNq7Nq0Nq)Nq"NqNqNq NqNqÿMqøMqñMqêMqãMqÜMqÕMqÎMqÇMqÀMq¹Mq²Mq«Mq¤MqMq–MqMqˆMqMqzMqsMqlMqeMq^MqWMqPMqIMqBMq;Mq4Mq-Mq&MqMqMqMq MqMqüLqõLqîLqçLqàLqÙLqÒLqËLqÄLq½Lq¶Lq¯Lq¨Lq¡LqšLq“LqŒLq…Lq~LqwLqpLqiLqbLq[LqTLqMLqFLq?Lq8Lq1Lq*Lq#LqLqLqLqLqLqùKqòKqëKqäKqÝKqÖKqÏKqÈKqÁKqºKq³Kq¬Kq¥KqžKq—KqKq‰Kq‚Kq{KqtKqmKqfKq_KqXKqQKqJKqCKqGq7Gq0Gq)Gq"GqGqGq GqGqÿFqøFqñFqêFqãFqÜFqÕFqÎFqÇFqÀFq¹Fq²Fq«Fq¤FqFq–FqFqˆFqFqzFqsFqlFqeFq^FqWFqPFqIFqBFq;Fq4Fq-Fq&FqFqFqFq FqFqüEqõEqîEqçEqàEqÙEqÒEqËEqÄEq½Eq¶Eq¯Eq¨Eq¡EqšEq“EqŒEq…Eq~EqwEqpEqiEqbEq[EqTEqMEqFEq?Eq8Eq1Eq*Eq#EqEqEqEqEqEqùDqòDqëDqäDqÝDqÖDqÏDqÈDqÁDqºDq³Dq¬Dq¥DqžDq—DqDq‰Dq‚Dq{DqtDqmDqfDq_DqXDqQDqJDqCDq@q7@q0@q)@q"@q@q@q @q@qÿ?qø?qñ?qê?qã?qÜ?qÕ?qÎ?qÇ?qÀ?q¹?q²?q«?q¤?q?q–?q?qˆ?q?qz?qs?ql?qe?q^?qW?qP?qI?qB?q;?q4?q-?q&?q?q?q?q ?q?qü>qõ>qî>qç>qà>qÙ>qÒ>qË>qÄ>q½>q¶>q¯>q¨>q¡>qš>q“>qŒ>q…>q~>qw>qp>qi>qb>q[>qT>qM>qF>q?>q8>q1>q*>q#>q>q>q>q>q>qù=qò=që=qä=qÝ=qÖ=qÏ=qÈ=qÁ=qº=q³=q¬=q¥=qž=q—=q=q‰=q‚=q{=qt=qm=qf=q_=qX=qQ=qJ=qC=q<=q5=q.=q'=q =q=q=q =q=qý9q79q09q)9q"9q9q9q 9q9qÿ8qø8qñ8qê8qã8qÜ8qÕ8qÎ8qÇ8qÀ8q¹8q²8q«8q¤8q8q–8q8qˆ8q8qz8qs8ql8qe8q^8qW8qP8qI8qB8q;8q48q-8q&8q8q8q8q 8q8qü7qõ7qî7qç7qà7qÙ7qÒ7qË7qÄ7q½7q¶7q¯7q¨7q¡7qš7q“7qŒ7q…7q~7qw7qp7qi7qb7q[7qT7qM7qF7q?7q87q17q*7q#7q7q7q7q7q7qù6qò6që6qä6qÝ6qÖ6qÏ6qÈ6qÁ6qº6q³6q¬6q¥6qž6q—6q6q‰6q‚6q{6qt6qm6qf6q_6qX6qQ6qJ6qC6q<6q56q.6q'6q 6q6q6q 6q6qý5qö5qï5qè5qá5qÚ5qÓ5qÌ5qÅ5q¾5q·5q°5q©5q¢5q›5q”5q5q†5q5qx5qq5qj5qc5q\5qU5qN5qG5q@5q95q25q+5q$5q5q5q5q5q5qú4qó4qì4qå4qÞ4q×4qÐ4qÉ4qÂ4q»4q´4q­4q¦4qŸ4q˜4q‘4qŠ4qƒ4q|4qu4qn4qg4q`4qY4qR4qK4qD4q=4q64q/4q(4q!4q4q4q 4q4qþ3q÷3qð3qé3qâ3qÛ3qÔ3qÍ3qÆ3q¿3q¸3q±3qª3q£3qœ3q•3qŽ3q‡3q€3qy3qr3qk3qd3q]3qV3qO3qH3qA3q:3q33q,3q%3q3q3q3q 3q3qû2qô2qí2qæ2qß2qØ2qÑ2qÊ2qÃ2q¼2qµ2q®2q§2q 2q™2q’2q‹2q„2q}2qv2qo2qh2qa2qZ2qS2qL2qE2q>2q72q02q)2q"2q2q2q 2q2qÿ1qø1qñ1qê1qã1qÜ1qÕ1qÎ1qÇ1qÀ1q¹1q²1q«1q¤1q1q–1q1qˆ1q1qz1qs1ql1qe1q^1qW1qP1qI1qB1q;1q41q-1q&1q1q1q1q 1q1qü0qõ0qî0qç0qà0qÙ0qÒ0qË0qÄ0q½0q¶0q¯0q¨0q¡0qš0q“0qŒ0q…0q~0qw0qp0qi0qb0q[0qT0qM0qF0q?0q80q10q*0q#0q0q0q0q0q0qù/qò/që/qä/qÝ/qÖ/qÏ/qÈ/qÁ/qº/q³/q¬/q¥/qž/q—/q/q‰/q‚/q{/qt/qm/qf/q_/qX/qQ/qJ/qC/q+q7+q0+q)+q"+q+q+q +q+qÿ*qø*qñ*qê*qã*qÜ*qÕ*qÎ*qÇ*qÀ*q¹*q²*q«*q¤*q*q–*q*qˆ*q*qz*qs*ql*qe*q^*qW*qP*qI*qB*q;*q4*q-*q&*q*q*q*q *q*qü)qõ)qî)qç)qà)qÙ)qÒ)qË)qÄ)q½)q¶)q¯)q¨)q¡)qš)q“)qŒ)q…)q~)qw)qp)qi)qb)q[)qT)qM)qF)q?)q8)q1)q*)q#)q)q)q)q)q)qù(qò(që(qä(qÝ(qÖ(qÏ(qÈ(qÁ(qº(q³(q¬(q¥(qž(q—(q(q‰(q‚(q{(qt(qm(qf(q_(qX(qQ(qJ(qC(q<(q5(q.(q'(q (q(q(q (q(qý'qö'qï'qè'qá'qÚ'qÓ'qÌ'qÅ'q¾'q·'q°'q©'q¢'q›'q”'q'q†'q'qx'qq'qj'qc'q\'qU'qN'qG'q@'q9'q2'q+'q$'q'q'q'q'q'qú&qó&qì&qå&qÞ&q×&qÐ&qÉ&qÂ&q»&q´&q­&q¦&qŸ&q˜&q‘&qŠ&qƒ&q|&qu&qn&qg&q`&qY&qR&qK&qD&q=&q6&q/&q(&q!&q&q&q &q&qþ%q÷%qð%qé%qâ%qÛ%qÔ%qÍ%qÆ%q¿%q¸%q±%qª%q£%qœ%q•%qŽ%q‡%q€%qy%qr%qk%qd%q]%qV%qO%qH%qA%q:%q3%q,%q%%q%q%q%q %q%qû$qô$qí$qæ$qß$qØ$qÑ$qÊ$qÃ$q¼$qµ$q®$q§$q $q™$q’$q‹$q„$q}$qv$qo$qh$qa$qZ$qS$qL$qE$q>$q7$q0$q)$q"$q$q$q $q$qÿ#qø#qñ#qê#qã#qÜ#qÕ#qÎ#qÇ#qÀ#q¹#q²#q«#q¤#q#q–#q#qˆ#q#qz#qs#ql#qe#q^#qW#qP#qI#qB#q;#q4#q-#q&#q#q#q#q #q#qü"qõ"qî"qç"qà"qÙ"qÒ"qË"qÄ"q½"q¶"q¯"q¨"q¡"qš"q“"qŒ"q…"q~"qw"qp"qi"qb"q["qT"qM"qF"q?"q8"q1"q*"q#"q"q"q"q"q"qù!qò!që!qä!qÝ!qÖ!qÏ!qÈ!qÁ!qº!q³!q¬!q¥!qž!q—!q!q‰!q‚!q{!qt!qm!qf!q_!qX!qQ!qJ!qC!qq7q0q)q"qqq qqÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqýqöqïqèqáqÚqÓqÌqÅq¾q·q°q©q¢q›q”qq†qqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþq÷qðqéqâqÛqÔqÍqÆq¿q¸q±qªq£qœq•qŽq‡q€qyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqýqöqïqèqáqÚqÓqÌqÅq¾q·q°q©q¢q›q”qq†qqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþq÷qðqéqâqÛqÔqÍqÆq¿q¸q±qªq£qœq•qŽq‡q€qyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqü qõ qî qç qà qÙ qÒ qË qÄ q½ q¶ q¯ q¨ q¡ qš q“ qŒ q… q~ qw qp qi qb q[ qT qM qF q? q8 q1 q* q# q q q q q qù qò që qä qÝ qÖ qÏ qÈ qÁ qº q³ q¬ q¥ qž q— q q‰ q‚ q{ qt qm qf q_ qX qQ qJ qC q< q5 q. q' q q q q q qý qö qï qè qá qÚ qÓ qÌ qÅ q¾ q· q° q© q¢ q› q” q q† q qx qq qj qc q\ qU qN qG q@ q9 q2 q+ q$ q q q q q qú qó qì qå qÞ q× qÐ qÉ q q» q´ q­ q¦ qŸ q˜ q‘ qŠ qƒ q| qu qn qg q` qY qR qK qD q= q6 q/ q( q! q q q q qþ q÷ qð qé qâ qÛ qÔ qÍ qÆ q¿ q¸ q± qª q£ qœ q• qŽ q‡ q€ qy qr qk qd q] qV qO qH qA q: q3 q, q% q q q q q qûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCq<q5q.q'q qqq qqýqöqïqèqáqÚqÓqÌqÅq¾q·q°q©q¢q›q”qq†qqxqqqjqcq\qUqNqGq@q9q2q+q$qqqqqqúqóqìqåqÞq×qÐqÉqÂq»q´q­q¦qŸq˜q‘qŠqƒq|quqnqgq`qYqRqKqDq=q6q/q(q!qqq qqþq÷qðqéqâqÛqÔqÍqÆq¿q¸q±qªq£qœq•qŽq‡q€qyqrqkqdq]qVqOqHqAq:q3q,q%qqqq qqûqôqíqæqßqØqÑqÊqÃq¼qµq®q§q q™q’q‹q„q}qvqoqhqaqZqSqLqEq>q7q0q)q"qqq qqÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüÿpõÿpîÿpçÿpàÿpÙÿpÒÿpËÿpÄÿp½ÿp¶ÿp¯ÿp¨ÿp¡ÿpšÿp“ÿpŒÿp…ÿp~ÿpwÿppÿpiÿpbÿp[ÿpTÿpMÿpFÿp?ÿp8ÿp1ÿp*ÿp#ÿpÿpÿpÿpÿpÿpùþpòþpëþpäþpÝþpÖþpÏþpÈþpÁþpºþp³þp¬þp¥þpžþp—þpþp‰þp‚þp{þptþpmþpfþp_þpXþpQþpJþpCþp<þp5þp.þp'þp þpþpþp þpþpýýpöýpïýpèýpáýpÚýpÓýpÌýpÅýp¾ýp·ýp°ýp©ýp¢ýp›ýp”ýpýp†ýpýpxýpqýpjýpcýp\ýpUýpNýpGýp@ýp9ýp2ýp+ýp$ýpýpýpýpýpýpúüpóüpìüpåüpÞüp×üpÐüpÉüpÂüp»üp´üp­üp¦üpŸüp˜üp‘üpŠüpƒüp|üpuüpnüpgüp`üpYüpRüpKüpDüp=üp6üp/üp(üp!üpüpüp üpüpþûp÷ûpðûpéûpâûpÛûpÔûpÍûpÆûp¿ûp¸ûp±ûpªûp£ûpœûp•ûpŽûp‡ûp€ûpyûprûpkûpdûp]ûpVûpOûpHûpAûp:ûp3ûp,ûp%ûpûpûpûp ûpûpûúpôúpíúpæúpßúpØúpÑúpÊúpÃúp¼úpµúp®úp§úp úp™úp’úp‹úp„úp}úpvúpoúphúpaúpZúpSúpLúpEúp>úp7úp0úp)úp"úpúpúp úpúpÿùpøùpñùpêùpãùpÜùpÕùpÎùpÇùpÀùp¹ùp²ùp«ùp¤ùpùp–ùpùpˆùpùpzùpsùplùpeùp^ùpWùpPùpIùpBùp;ùp4ùp-ùp&ùpùpùpùp ùpùpüøpõøpîøpçøpàøpÙøpÒøpËøpÄøp½øp¶øp¯øp¨øp¡øpšøp“øpŒøp…øp~øpwøppøpiøpbøp[øpTøpMøpFøp?øp8øp1øp*øp#øpøpøpøpøpøpù÷pò÷pë÷pä÷pÝ÷pÖ÷pÏ÷pÈ÷pÁ÷pº÷p³÷p¬÷p¥÷pž÷p—÷p÷p‰÷p‚÷p{÷pt÷pm÷pf÷p_÷pX÷pQ÷pJ÷pC÷p<÷p5÷p.÷p'÷p ÷p÷p÷p ÷p÷pýöpööpïöpèöpáöpÚöpÓöpÌöpÅöp¾öp·öp°öp©öp¢öp›öp”öpöp†öpöpxöpqöpjöpcöp\öpUöpNöpGöp@öp9öp2öp+öp$öpöpöpöpöpöpúõpóõpìõpåõpÞõp×õpÐõpÉõpÂõp»õp´õp­õp¦õpŸõp˜õp‘õpŠõpƒõp|õpuõpnõpgõp`õpYõpRõpKõpDõp=õp6õp/õp(õp!õpõpõp õpõpþôp÷ôpðôpéôpâôpÛôpÔôpÍôpÆôp¿ôp¸ôp±ôpªôp£ôpœôp•ôpŽôp‡ôp€ôpyôprôpkôpdôp]ôpVôpOôpHôpAôp:ôp3ôp,ôp%ôpôpôpôp ôpôpûópôópíópæópßópØópÑópÊópÃóp¼ópµóp®óp§óp óp™óp’óp‹óp„óp}ópvópoóphópaópZópSópLópEóp>óp7óp0óp)óp"ópópóp ópópÿòpøòpñòpêòpãòpÜòpÕòpÎòpÇòpÀòp¹òp²òp«òp¤òpòp–òpòpˆòpòpzòpsòplòpeòp^òpWòpPòpIòpBòp;òp4òp-òp&òpòpòpòp òpòpüñpõñpîñpçñpàñpÙñpÒñpËñpÄñp½ñp¶ñp¯ñp¨ñp¡ñpšñp“ñpŒñp…ñp~ñpwñppñpiñpbñp[ñpTñpMñpFñp?ñp8ñp1ñp*ñp#ñpñpñpñpñpñpùðpòðpëðpäðpÝðpÖðpÏðpÈðpÁðpºðp³ðp¬ðp¥ðpžðp—ðpðp‰ðp‚ðp{ðptðpmðpfðp_ðpXðpQðpJðpCðp<ðp5ðp.ðp'ðp ðpðpðp ðpðpýïpöïpïïpèïpáïpÚïpÓïpÌïpÅïp¾ïp·ïp°ïp©ïp¢ïp›ïp”ïpïp†ïpïpxïpqïpjïpcïp\ïpUïpNïpGïp@ïp9ïp2ïp+ïp$ïpïpïpïpïpïpúîpóîpìîpåîpÞîp×îpÐîpÉîpÂîp»îp´îp­îp¦îpŸîp˜îp‘îpŠîpƒîp|îpuîpnîpgîp`îpYîpRîpKîpDîp=îp6îp/îp(îp!îpîpîp îpîpþíp÷ípðípéípâípÛípÔípÍípÆíp¿íp¸íp±ípªíp£ípœíp•ípŽíp‡íp€ípyíprípkípdíp]ípVípOípHípAíp:íp3íp,íp%ípípípíp ípípûìpôìpíìpæìpßìpØìpÑìpÊìpÃìp¼ìpµìp®ìp§ìp ìp™ìp’ìp‹ìp„ìp}ìpvìpoìphìpaìpZìpSìpLìpEìp>ìp7ìp0ìp)ìp"ìpìpìp ìpìpÿëpøëpñëpêëpãëpÜëpÕëpÎëpÇëpÀëp¹ëp²ëp«ëp¤ëpëp–ëpëpˆëpëpzëpsëplëpeëp^ëpWëpPëpIëpBëp;ëp4ëp-ëp&ëpëpëpëp ëpëpüêpõêpîêpçêpàêpÙêpÒêpËêpÄêp½êp¶êp¯êp¨êp¡êpšêp“êpŒêp…êp~êpwêppêpiêpbêp[êpTêpMêpFêp?êp8êp1êp*êp#êpêpêpêpêpêpùépòépëépäépÝépÖépÏépÈépÁépºép³ép¬ép¥épžép—épép‰ép‚ép{éptépmépfép_épXépQépJépCép<ép5ép.ép'ép épépép épépýèpöèpïèpèèpáèpÚèpÓèpÌèpÅèp¾èp·èp°èp©èp¢èp›èp”èpèp†èpèpxèpqèpjèpcèp\èpUèpNèpGèp@èp9èp2èp+èp$èpèpèpèpèpèpúçpóçpìçpåçpÞçp×çpÐçpÉçpÂçp»çp´çp­çp¦çpŸçp˜çp‘çpŠçpƒçp|çpuçpnçpgçp`çpYçpRçpKçpDçp=çp6çp/çp(çp!çpçpçp çpçpþæp÷æpðæpéæpâæpÛæpÔæpÍæpÆæp¿æp¸æp±æpªæp£æpœæp•æpŽæp‡æp€æpyæpræpkæpdæp]æpVæpOæpHæpAæp:æp3æp,æp%æpæpæpæp æpæpûåpôåpíåpæåpßåpØåpÑåpÊåpÃåp¼åpµåp®åp§åp åp™åp’åp‹åp„åp}åpvåpoåphåpaåpZåpSåpLåpEåp>åp7åp0åp)åp"åpåpåp åpåpÿäpøäpñäpêäpãäpÜäpÕäpÎäpÇäpÀäp¹äp²äp«äp¤äpäp–äpäpˆäpäpzäpsäpläpeäp^äpWäpPäpIäpBäp;äp4äp-äp&äpäpäpäp äpäpüãpõãpîãpçãpàãpÙãpÒãpËãpÄãp½ãp¶ãp¯ãp¨ãp¡ãpšãp“ãpŒãp…ãp~ãpwãppãpiãpbãp[ãpTãpMãpFãp?ãp8ãp1ãp*ãp#ãpãpãpãpãpãpùâpòâpëâpäâpÝâpÖâpÏâpÈâpÁâpºâp³âp¬âp¥âpžâp—âpâp‰âp‚âp{âptâpmâpfâp_âpXâpQâpJâpCâp<âp5âp.âp'âp âpâpâp âpâpýápöápïápèápáápÚápÓápÌápÅáp¾áp·áp°áp©áp¢áp›áp”ápáp†ápápxápqápjápcáp\ápUápNápGáp@áp9áp2áp+áp$ápápápápápápúàpóàpìàpåàpÞàp×àpÐàpÉàpÂàp»àp´àp­àp¦àpŸàp˜àp‘àpŠàpƒàp|àpuàpnàpgàp`àpYàpRàpKàpDàp=àp6àp/àp(àp!àpàpàp àpàpþßp÷ßpðßpéßpâßpÛßpÔßpÍßpÆßp¿ßp¸ßp±ßpªßp£ßpœßp•ßpŽßp‡ßp€ßpyßprßpkßpdßp]ßpVßpOßpHßpAßp:ßp3ßp,ßp%ßpßpßpßp ßpßpûÞpôÞpíÞpæÞpßÞpØÞpÑÞpÊÞpÃÞp¼ÞpµÞp®Þp§Þp Þp™Þp’Þp‹Þp„Þp}ÞpvÞpoÞphÞpaÞpZÞpSÞpLÞpEÞp>Þp7Þp0Þp)Þp"ÞpÞpÞp ÞpÞpÿÝpøÝpñÝpêÝpãÝpÜÝpÕÝpÎÝpÇÝpÀÝp¹Ýp²Ýp«Ýp¤ÝpÝp–ÝpÝpˆÝpÝpzÝpsÝplÝpeÝp^ÝpWÝpPÝpIÝpBÝp;Ýp4Ýp-Ýp&ÝpÝpÝpÝp ÝpÝpüÜpõÜpîÜpçÜpàÜpÙÜpÒÜpËÜpÄÜp½Üp¶Üp¯Üp¨Üp¡ÜpšÜp“ÜpŒÜp…Üp~ÜpwÜppÜpiÜpbÜp[ÜpTÜpMÜpFÜp?Üp8Üp1Üp*Üp#ÜpÜpÜpÜpÜpÜpùÛpòÛpëÛpäÛpÝÛpÖÛpÏÛpÈÛpÁÛpºÛp³Ûp¬Ûp¥ÛpžÛp—ÛpÛp‰Ûp‚Ûp{ÛptÛpmÛpfÛp_ÛpXÛpQÛpJÛpCÛp<Ûp5Ûp.Ûp'Ûp ÛpÛpÛp ÛpÛpýÚpöÚpïÚpèÚpáÚpÚÚpÓÚpÌÚpÅÚp¾Úp·Úp°Úp©Úp¢Úp›Úp”ÚpÚp†ÚpÚpxÚpqÚpjÚpcÚp\ÚpUÚpNÚpGÚp@Úp9Úp2Úp+Úp$ÚpÚpÚpÚpÚpÚpúÙpóÙpìÙpåÙpÞÙp×ÙpÐÙpÉÙpÂÙp»Ùp´Ùp­Ùp¦ÙpŸÙp˜Ùp‘ÙpŠÙpƒÙp|ÙpuÙpnÙpgÙp`ÙpYÙpRÙpKÙpDÙp=Ùp6Ùp/Ùp(Ùp!ÙpÙpÙp ÙpÙpþØp÷ØpðØpéØpâØpÛØpÔØpÍØpÆØp¿Øp¸Øp±ØpªØp£ØpœØp•ØpŽØp‡Øp€ØpyØprØpkØpdØp]ØpVØpOØpHØpAØp:Øp3Øp,Øp%ØpØpØpØp ØpØpû×pô×pí×pæ×pß×pØ×pÑ×pÊ×pÃ×p¼×pµ×p®×p§×p ×p™×p’×p‹×p„×p}×pv×po×ph×pa×pZ×pS×pL×pE×p>×p7×p0×p)×p"×p×p×p ×p×pÿÖpøÖpñÖpêÖpãÖpÜÖpÕÖpÎÖpÇÖpÀÖp¹Öp²Öp«Öp¤ÖpÖp–ÖpÖpˆÖpÖpzÖpsÖplÖpeÖp^ÖpWÖpPÖpIÖpBÖp;Öp4Öp-Öp&ÖpÖpÖpÖp ÖpÖpüÕpõÕpîÕpçÕpàÕpÙÕpÒÕpËÕpÄÕp½Õp¶Õp¯Õp¨Õp¡ÕpšÕp“ÕpŒÕp…Õp~ÕpwÕppÕpiÕpbÕp[ÕpTÕpMÕpFÕp?Õp8Õp1Õp*Õp#ÕpÕpÕpÕpÕpÕpùÔpòÔpëÔpäÔpÝÔpÖÔpÏÔpÈÔpÁÔpºÔp³Ôp¬Ôp¥ÔpžÔp—ÔpÔp‰Ôp‚Ôp{ÔptÔpmÔpfÔp_ÔpXÔpQÔpJÔpCÔp<Ôp5Ôp.Ôp'Ôp ÔpÔpÔp ÔpÔpýÓpöÓpïÓpèÓpáÓpÚÓpÓÓpÌÓpÅÓp¾Óp·Óp°Óp©Óp¢Óp›Óp”ÓpÓp†ÓpÓpxÓpqÓpjÓpcÓp\ÓpUÓpNÓpGÓp@Óp9Óp2Óp+Óp$ÓpÓpÓpÓpÓpÓpúÒpóÒpìÒpåÒpÞÒp×ÒpÐÒpÉÒpÂÒp»Òp´Òp­Òp¦ÒpŸÒp˜Òp‘ÒpŠÒpƒÒp|ÒpuÒpnÒpgÒp`ÒpYÒpRÒpKÒpDÒp=Òp6Òp/Òp(Òp!ÒpÒpÒp ÒpÒpþÑp÷ÑpðÑpéÑpâÑpÛÑpÔÑpÍÑpÆÑp¿Ñp¸Ñp±ÑpªÑp£ÑpœÑp•ÑpŽÑp‡Ñp€ÑpyÑprÑpkÑpdÑp]ÑpVÑpOÑpHÑpAÑp:Ñp3Ñp,Ñp%ÑpÑpÑpÑp ÑpÑpûÐpôÐpíÐpæÐpßÐpØÐpÑÐpÊÐpÃÐp¼ÐpµÐp®Ðp§Ðp Ðp™Ðp’Ðp‹Ðp„Ðp}ÐpvÐpoÐphÐpaÐpZÐpSÐpLÐpEÐp>Ðp7Ðp0Ðp)Ðp"ÐpÐpÐp ÐpÐpÿÏpøÏpñÏpêÏpãÏpÜÏpÕÏpÎÏpÇÏpÀÏp¹Ïp²Ïp«Ïp¤ÏpÏp–ÏpÏpˆÏpÏpzÏpsÏplÏpeÏp^ÏpWÏpPÏpIÏpBÏp;Ïp4Ïp-Ïp&ÏpÏpÏpÏp ÏpÏpüÎpõÎpîÎpçÎpàÎpÙÎpÒÎpËÎpÄÎp½Îp¶Îp¯Îp¨Îp¡ÎpšÎp“ÎpŒÎp…Îp~ÎpwÎppÎpiÎpbÎp[ÎpTÎpMÎpFÎp?Îp8Îp1Îp*Îp#ÎpÎpÎpÎpÎpÎpùÍpòÍpëÍpäÍpÝÍpÖÍpÏÍpÈÍpÁÍpºÍp³Íp¬Íp¥ÍpžÍp—ÍpÍp‰Íp‚Íp{ÍptÍpmÍpfÍp_ÍpXÍpQÍpJÍpCÍp<Íp5Íp.Íp'Íp ÍpÍpÍp ÍpÍpýÌpöÌpïÌpèÌpáÌpÚÌpÓÌpÌÌpÅÌp¾Ìp·Ìp°Ìp©Ìp¢Ìp›Ìp”ÌpÌp†ÌpÌpxÌpqÌpjÌpcÌp\ÌpUÌpNÌpGÌp@Ìp9Ìp2Ìp+Ìp$ÌpÌpÌpÌpÌpÌpúËpóËpìËpåËpÞËp×ËpÐËpÉËpÂËp»Ëp´Ëp­Ëp¦ËpŸËp˜Ëp‘ËpŠËpƒËp|ËpuËpnËpgËp`ËpYËpRËpKËpDËp=Ëp6Ëp/Ëp(Ëp!ËpËpËp ËpËpþÊp÷ÊpðÊpéÊpâÊpÛÊpÔÊpÍÊpÆÊp¿Êp¸Êp±ÊpªÊp£ÊpœÊp•ÊpŽÊp‡Êp€ÊpyÊprÊpkÊpdÊp]ÊpVÊpOÊpHÊpAÊp:Êp3Êp,Êp%ÊpÊpÊpÊp ÊpÊpûÉpôÉpíÉpæÉpßÉpØÉpÑÉpÊÉpÃÉp¼ÉpµÉp®Ép§Ép Ép™Ép’Ép‹Ép„Ép}ÉpvÉpoÉphÉpaÉpZÉpSÉpLÉpEÉp>Ép7Ép0Ép)Ép"ÉpÉpÉp ÉpÉpÿÈpøÈpñÈpêÈpãÈpÜÈpÕÈpÎÈpÇÈpÀÈp¹Èp²Èp«Èp¤ÈpÈp–ÈpÈpˆÈpÈpzÈpsÈplÈpeÈp^ÈpWÈpPÈpIÈpBÈp;Èp4Èp-Èp&ÈpÈpÈpÈp ÈpÈpüÇpõÇpîÇpçÇpàÇpÙÇpÒÇpËÇpÄÇp½Çp¶Çp¯Çp¨Çp¡ÇpšÇp“ÇpŒÇp…Çp~ÇpwÇppÇpiÇpbÇp[ÇpTÇpMÇpFÇp?Çp8Çp1Çp*Çp#ÇpÇpÇpÇpÇpÇpùÆpòÆpëÆpäÆpÝÆpÖÆpÏÆpÈÆpÁÆpºÆp³Æp¬Æp¥ÆpžÆp—ÆpÆp‰Æp‚Æp{ÆptÆpmÆpfÆp_ÆpXÆpQÆpJÆpCÆp<Æp5Æp.Æp'Æp ÆpÆpÆp ÆpÆpýÅpöÅpïÅpèÅpáÅpÚÅpÓÅpÌÅpÅÅp¾Åp·Åp°Åp©Åp¢Åp›Åp”ÅpÅp†ÅpÅpxÅpqÅpjÅpcÅp\ÅpUÅpNÅpGÅp@Åp9Åp2Åp+Åp$ÅpÅpÅpÅpÅpÅpúÄpóÄpìÄpåÄpÞÄp×ÄpÐÄpÉÄpÂÄp»Äp´Äp­Äp¦ÄpŸÄp˜Äp‘ÄpŠÄpƒÄp|ÄpuÄpnÄpgÄp`ÄpYÄpRÄpKÄpDÄp=Äp6Äp/Äp(Äp!ÄpÄpÄp ÄpÄpþÃp÷ÃpðÃpéÃpâÃpÛÃpÔÃpÍÃpÆÃp¿Ãp¸Ãp±ÃpªÃp£ÃpœÃp•ÃpŽÃp‡Ãp€ÃpyÃprÃpkÃpdÃp]ÃpVÃpOÃpHÃpAÃp:Ãp3Ãp,Ãp%ÃpÃpÃpÃp ÃpÃpûÂpôÂpíÂpæÂpßÂpØÂpÑÂpÊÂpÃÂp¼ÂpµÂp®Âp§Âp Âp™Âp’Âp‹Âp„Âp}ÂpvÂpoÂphÂpaÂpZÂpSÂpLÂpEÂp>Âp7Âp0Âp)Âp"ÂpÂpÂp ÂpÂpÿÁpøÁpñÁpêÁpãÁpÜÁpÕÁpÎÁpÇÁpÀÁp¹Áp²Áp«Áp¤ÁpÁp–ÁpÁpˆÁpÁpzÁpsÁplÁpeÁp^ÁpWÁpPÁpIÁpBÁp;Áp4Áp-Áp&ÁpÁpÁpÁp ÁpÁpüÀpõÀpîÀpçÀpàÀpÙÀpÒÀpËÀpÄÀp½Àp¶Àp¯Àp¨Àp¡ÀpšÀp“ÀpŒÀp…Àp~ÀpwÀppÀpiÀpbÀp[ÀpTÀpMÀpFÀp?Àp8Àp1Àp*Àp#ÀpÀpÀpÀpÀpÀpù¿pò¿pë¿pä¿pÝ¿pÖ¿pÏ¿pÈ¿pÁ¿pº¿p³¿p¬¿p¥¿pž¿p—¿p¿p‰¿p‚¿p{¿pt¿pm¿pf¿p_¿pX¿pQ¿pJ¿pC¿p<¿p5¿p.¿p'¿p ¿p¿p¿p ¿p¿pý¾pö¾pï¾pè¾pá¾pÚ¾pÓ¾p̾pžp¾¾p·¾p°¾p©¾p¢¾p›¾p”¾p¾p†¾p¾px¾pq¾pj¾pc¾p\¾pU¾pN¾pG¾p@¾p9¾p2¾p+¾p$¾p¾p¾p¾p¾p¾pú½pó½pì½på½pÞ½p×½pнpɽp½p»½p´½p­½p¦½pŸ½p˜½p‘½pнpƒ½p|½pu½pn½pg½p`½pY½pR½pK½pD½p=½p6½p/½p(½p!½p½p½p ½p½pþ¼p÷¼pð¼pé¼pâ¼pÛ¼pÔ¼pͼpƼp¿¼p¸¼p±¼pª¼p£¼pœ¼p•¼p޼p‡¼p€¼py¼pr¼pk¼pd¼p]¼pV¼pO¼pH¼pA¼p:¼p3¼p,¼p%¼p¼p¼p¼p ¼p¼pû»pô»pí»pæ»pß»pØ»pÑ»pÊ»pûp¼»pµ»p®»p§»p »p™»p’»p‹»p„»p}»pv»po»ph»pa»pZ»pS»pL»pE»p>»p7»p0»p)»p"»p»p»p »p»pÿºpøºpñºpêºpãºpܺpÕºpκpǺpÀºp¹ºp²ºp«ºp¤ºpºp–ºpºpˆºpºpzºpsºplºpeºp^ºpWºpPºpIºpBºp;ºp4ºp-ºp&ºpºpºpºp ºpºpü¹põ¹pî¹pç¹pà¹pÙ¹pÒ¹p˹pĹp½¹p¶¹p¯¹p¨¹p¡¹pš¹p“¹pŒ¹p…¹p~¹pw¹pp¹pi¹pb¹p[¹pT¹pM¹pF¹p?¹p8¹p1¹p*¹p#¹p¹p¹p¹p¹p¹pù¸pò¸pë¸pä¸pݸpÖ¸pϸpȸpÁ¸pº¸p³¸p¬¸p¥¸pž¸p—¸p¸p‰¸p‚¸p{¸pt¸pm¸pf¸p_¸pX¸pQ¸pJ¸pC¸p<¸p5¸p.¸p'¸p ¸p¸p¸p ¸p¸pý·pö·pï·pè·pá·pÚ·pÓ·pÌ·pÅ·p¾·p··p°·p©·p¢·p›·p”·p·p†·p·px·pq·pj·pc·p\·pU·pN·pG·p@·p9·p2·p+·p$·p·p·p·p·p·pú¶pó¶pì¶på¶pÞ¶p×¶pжpɶp¶p»¶p´¶p­¶p¦¶pŸ¶p˜¶p‘¶pжpƒ¶p|¶pu¶pn¶pg¶p`¶pY¶pR¶pK¶pD¶p=¶p6¶p/¶p(¶p!¶p¶p¶p ¶p¶pþµp÷µpðµpéµpâµpÛµpÔµp͵pƵp¿µp¸µp±µpªµp£µpœµp•µp޵p‡µp€µpyµprµpkµpdµp]µpVµpOµpHµpAµp:µp3µp,µp%µpµpµpµp µpµpû´pô´pí´pæ´pß´pØ´pÑ´pÊ´pôp¼´pµ´p®´p§´p ´p™´p’´p‹´p„´p}´pv´po´ph´pa´pZ´pS´pL´pE´p>´p7´p0´p)´p"´p´p´p ´p´pÿ³pø³pñ³pê³pã³pܳpÕ³pγpdzpÀ³p¹³p²³p«³p¤³p³p–³p³pˆ³p³pz³ps³pl³pe³p^³pW³pP³pI³pB³p;³p4³p-³p&³p³p³p³p ³p³pü²põ²pî²pç²pà²pÙ²pÒ²p˲pIJp½²p¶²p¯²p¨²p¡²pš²p“²pŒ²p…²p~²pw²pp²pi²pb²p[²pT²pM²pF²p?²p8²p1²p*²p#²p²p²p²p²p²pù±pò±pë±pä±pݱpÖ±pϱpȱpÁ±pº±p³±p¬±p¥±pž±p—±p±p‰±p‚±p{±pt±pm±pf±p_±pX±pQ±pJ±pC±p<±p5±p.±p'±p ±p±p±p ±p±pý°pö°pï°pè°pá°pÚ°pÓ°p̰pŰp¾°p·°p°°p©°p¢°p›°p”°p°p†°p°px°pq°pj°pc°p\°pU°pN°pG°p@°p9°p2°p+°p$°p°p°p°p°p°pú¯pó¯pì¯på¯pÞ¯pׯpЯpɯp¯p»¯p´¯p­¯p¦¯pŸ¯p˜¯p‘¯pНpƒ¯p|¯pu¯pn¯pg¯p`¯pY¯pR¯pK¯pD¯p=¯p6¯p/¯p(¯p!¯p¯p¯p ¯p¯pþ®p÷®pð®pé®pâ®pÛ®pÔ®pÍ®pÆ®p¿®p¸®p±®pª®p£®pœ®p•®pŽ®p‡®p€®py®pr®pk®pd®p]®pV®pO®pH®pA®p:®p3®p,®p%®p®p®p®p ®p®pû­pô­pí­pæ­pß­pØ­pÑ­pÊ­píp¼­pµ­p®­p§­p ­p™­p’­p‹­p„­p}­pv­po­ph­pa­pZ­pS­pL­pE­p>­p7­p0­p)­p"­p­p­p ­p­pÿ¬pø¬pñ¬pê¬pã¬pܬpÕ¬pάpǬpÀ¬p¹¬p²¬p«¬p¤¬p¬p–¬p¬pˆ¬p¬pz¬ps¬pl¬pe¬p^¬pW¬pP¬pI¬pB¬p;¬p4¬p-¬p&¬p¬p¬p¬p ¬p¬pü«põ«pî«pç«pà«pÙ«pÒ«pË«pÄ«p½«p¶«p¯«p¨«p¡«pš«p“«pŒ«p…«p~«pw«pp«pi«pb«p[«pT«pM«pF«p?«p8«p1«p*«p#«p«p«p«p«p«pùªpòªpëªpäªpݪpÖªpϪpȪpÁªpºªp³ªp¬ªp¥ªpžªp—ªpªp‰ªp‚ªp{ªptªpmªpfªp_ªpXªpQªpJªpCªp<ªp5ªp.ªp'ªp ªpªpªp ªpªpý©pö©pï©pè©pá©pÚ©pÓ©pÌ©pÅ©p¾©p·©p°©p©©p¢©p›©p”©p©p†©p©px©pq©pj©pc©p\©pU©pN©pG©p@©p9©p2©p+©p$©p©p©p©p©p©pú¨pó¨pì¨på¨pÞ¨pרpШpɨp¨p»¨p´¨p­¨p¦¨pŸ¨p˜¨p‘¨pЍpƒ¨p|¨pu¨pn¨pg¨p`¨pY¨pR¨pK¨pD¨p=¨p6¨p/¨p(¨p!¨p¨p¨p ¨p¨pþ§p÷§pð§pé§pâ§pÛ§pÔ§pͧpƧp¿§p¸§p±§pª§p£§pœ§p•§pާp‡§p€§py§pr§pk§pd§p]§pV§pO§pH§pA§p:§p3§p,§p%§p§p§p§p §p§pû¦pô¦pí¦pæ¦pߦpئpѦpʦpæp¼¦pµ¦p®¦p§¦p ¦p™¦p’¦p‹¦p„¦p}¦pv¦po¦ph¦pa¦pZ¦pS¦pL¦pE¦p>¦p7¦p0¦p)¦p"¦p¦p¦p ¦p¦pÿ¥pø¥pñ¥pê¥pã¥pÜ¥pÕ¥pÎ¥pÇ¥pÀ¥p¹¥p²¥p«¥p¤¥p¥p–¥p¥pˆ¥p¥pz¥ps¥pl¥pe¥p^¥pW¥pP¥pI¥pB¥p;¥p4¥p-¥p&¥p¥p¥p¥p ¥p¥pü¤põ¤pî¤pç¤pà¤pÙ¤pÒ¤pˤpĤp½¤p¶¤p¯¤p¨¤p¡¤pš¤p“¤pŒ¤p…¤p~¤pw¤pp¤pi¤pb¤p[¤pT¤pM¤pF¤p?¤p8¤p1¤p*¤p#¤p¤p¤p¤p¤p¤pù£pò£pë£pä£pÝ£pÖ£pÏ£pÈ£pÁ£pº£p³£p¬£p¥£pž£p—£p£p‰£p‚£p{£pt£pm£pf£p_£pX£pQ£pJ£pC£p<£p5£p.£p'£p £p£p£p £p£pý¢pö¢pï¢pè¢pá¢pÚ¢pÓ¢pÌ¢pÅ¢p¾¢p·¢p°¢p©¢p¢¢p›¢p”¢p¢p†¢p¢px¢pq¢pj¢pc¢p\¢pU¢pN¢pG¢p@¢p9¢p2¢p+¢p$¢p¢p¢p¢p¢p¢pú¡pó¡pì¡på¡pÞ¡pסpСpÉ¡p¡p»¡p´¡p­¡p¦¡pŸ¡p˜¡p‘¡pŠ¡pƒ¡p|¡pu¡pn¡pg¡p`¡pY¡pR¡pK¡pD¡p=¡p6¡p/¡p(¡p!¡p¡p¡p ¡p¡pþ p÷ pð pé pâ pÛ pÔ pÍ pÆ p¿ p¸ p± pª p£ pœ p• pŽ p‡ p€ py pr pk pd p] pV pO pH pA p: p3 p, p% p p p p  p pûŸpôŸpíŸpæŸpߟpØŸpÑŸpÊŸpßp¼ŸpµŸp®Ÿp§Ÿp Ÿp™Ÿp’Ÿp‹Ÿp„Ÿp}ŸpvŸpoŸphŸpaŸpZŸpSŸpLŸpEŸp>Ÿp7Ÿp0Ÿp)Ÿp"ŸpŸpŸp ŸpŸpÿžpøžpñžpêžpãžpÜžpÕžpΞpÇžpÀžp¹žp²žp«žp¤žpžp–žpžpˆžpžpzžpsžplžpežp^žpWžpPžpIžpBžp;žp4žp-žp&žpžpžpžp žpžpüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùœpòœpëœpäœpÝœpÖœpÏœpÈœpÁœpºœp³œp¬œp¥œpžœp—œpœp‰œp‚œp{œptœpmœpfœp_œpXœpQœpJœpCœp<œp5œp.œp'œp œpœpœp œpœpý›pö›pï›pè›pá›pÚ›pÓ›pÌ›pÅ›p¾›p·›p°›p©›p¢›p››p”›p›p†›p›px›pq›pj›pc›p\›pU›pN›pG›p@›p9›p2›p+›p$›p›p›p›p›p›púšpóšpìšpåšpÞšpךpКpÉšpšp»šp´šp­šp¦špŸšp˜šp‘špŠšpƒšp|špušpnšpgšp`špYšpRšpKšpDšp=šp6šp/šp(šp!špšpšp špšpþ™p÷™pð™pé™pâ™pÛ™pÔ™pÍ™pÆ™p¿™p¸™p±™pª™p£™pœ™p•™pŽ™p‡™p€™py™pr™pk™pd™p]™pV™pO™pH™pA™p:™p3™p,™p%™p™p™p™p ™p™pû˜pô˜pí˜pæ˜pߘpؘpјpʘpØp¼˜pµ˜p®˜p§˜p ˜p™˜p’˜p‹˜p„˜p}˜pv˜po˜ph˜pa˜pZ˜pS˜pL˜pE˜p>˜p7˜p0˜p)˜p"˜p˜p˜p ˜p˜pÿ—pø—pñ—pê—pã—pÜ—pÕ—pΗpÇ—pÀ—p¹—p²—p«—p¤—p—p–—p—pˆ—p—pz—ps—pl—pe—p^—pW—pP—pI—pB—p;—p4—p-—p&—p—p—p—p —p—pü–põ–pî–pç–pà–pÙ–pÒ–pË–pÄ–p½–p¶–p¯–p¨–p¡–pš–p“–pŒ–p…–p~–pw–pp–pi–pb–p[–pT–pM–pF–p?–p8–p1–p*–p#–p–p–p–p–p–pù•pò•pë•pä•pÝ•pÖ•pÏ•pÈ•pÁ•pº•p³•p¬•p¥•pž•p—•p•p‰•p‚•p{•pt•pm•pf•p_•pX•pQ•pJ•pC•p<•p5•p.•p'•p •p•p•p •p•pý”pö”pï”pè”pá”pÚ”pÓ”pÌ”pÅ”p¾”p·”p°”p©”p¢”p›”p””p”p†”p”px”pq”pj”pc”p\”pU”pN”pG”p@”p9”p2”p+”p$”p”p”p”p”p”pú“pó“pì“på“pÞ“pדpГpÉ“p“p»“p´“p­“p¦“pŸ“p˜“p‘“pŠ“pƒ“p|“pu“pn“pg“p`“pY“pR“pK“pD“p=“p6“p/“p(“p!“p“p“p “p“pþ’p÷’pð’pé’pâ’pÛ’pÔ’pÍ’pÆ’p¿’p¸’p±’pª’p£’pœ’p•’pŽ’p‡’p€’py’pr’pk’pd’p]’pV’pO’pH’pA’p:’p3’p,’p%’p’p’p’p ’p’pû‘pô‘pí‘pæ‘pß‘pØ‘pÑ‘pÊ‘pÑp¼‘pµ‘p®‘p§‘p ‘p™‘p’‘p‹‘p„‘p}‘pv‘po‘ph‘pa‘pZ‘pS‘pL‘pE‘p>‘p7‘p0‘p)‘p"‘p‘p‘p ‘p‘pÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùŽpòŽpëŽpäŽpÝŽpÖŽpÏŽpÈŽpÁŽpºŽp³Žp¬Žp¥ŽpžŽp—ŽpŽp‰Žp‚Žp{ŽptŽpmŽpfŽp_ŽpXŽpQŽpJŽpCŽp<Žp5Žp.Žp'Žp ŽpŽpŽp ŽpŽpýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúŒpóŒpìŒpåŒpÞŒp׌pÐŒpÉŒpÂŒp»Œp´Œp­Œp¦ŒpŸŒp˜Œp‘ŒpŠŒpƒŒp|ŒpuŒpnŒpgŒp`ŒpYŒpRŒpKŒpDŒp=Œp6Œp/Œp(Œp!ŒpŒpŒp ŒpŒpþ‹p÷‹pð‹pé‹pâ‹pÛ‹pÔ‹pÍ‹pÆ‹p¿‹p¸‹p±‹pª‹p£‹pœ‹p•‹pŽ‹p‡‹p€‹py‹pr‹pk‹pd‹p]‹pV‹pO‹pH‹pA‹p:‹p3‹p,‹p%‹p‹p‹p‹p ‹p‹pûŠpôŠpíŠpæŠpߊpØŠpÑŠpÊŠpÊp¼ŠpµŠp®Šp§Šp Šp™Šp’Šp‹Šp„Šp}ŠpvŠpoŠphŠpaŠpZŠpSŠpLŠpEŠp>Šp7Šp0Šp)Šp"ŠpŠpŠp ŠpŠpÿ‰pø‰pñ‰pê‰pã‰p܉pÕ‰pΉpljpÀ‰p¹‰p²‰p«‰p¤‰p‰p–‰p‰pˆ‰p‰pz‰ps‰pl‰pe‰p^‰pW‰pP‰pI‰pB‰p;‰p4‰p-‰p&‰p‰p‰p‰p ‰p‰püˆpõˆpîˆpçˆpàˆpÙˆpÒˆpˈpĈp½ˆp¶ˆp¯ˆp¨ˆp¡ˆpšˆp“ˆpŒˆp…ˆp~ˆpwˆppˆpiˆpbˆp[ˆpTˆpMˆpFˆp?ˆp8ˆp1ˆp*ˆp#ˆpˆpˆpˆpˆpˆpù‡pò‡pë‡pä‡p݇pÖ‡pχpȇpÁ‡pº‡p³‡p¬‡p¥‡pž‡p—‡p‡p‰‡p‚‡p{‡pt‡pm‡pf‡p_‡pX‡pQ‡pJ‡pC‡p<‡p5‡p.‡p'‡p ‡p‡p‡p ‡p‡pý†pö†pï†pè†pá†pÚ†pÓ†p̆pņp¾†p·†p°†p©†p¢†p›†p”†p†p††p†px†pq†pj†pc†p\†pU†pN†pG†p@†p9†p2†p+†p$†p†p†p†p†p†pú…pó…pì…på…pÞ…p×…pÐ…pÉ…pÂ…p»…p´…p­…p¦…pŸ…p˜…p‘…pŠ…pƒ…p|…pu…pn…pg…p`…pY…pR…pK…pD…p=…p6…p/…p(…p!…p…p…p …p…pþ„p÷„pð„pé„pâ„pÛ„pÔ„pÍ„pÆ„p¿„p¸„p±„pª„p£„pœ„p•„pŽ„p‡„p€„py„pr„pk„pd„p]„pV„pO„pH„pA„p:„p3„p,„p%„p„p„p„p „p„pûƒpôƒpíƒpæƒp߃p؃pуpʃpÃp¼ƒpµƒp®ƒp§ƒp ƒp™ƒp’ƒp‹ƒp„ƒp}ƒpvƒpoƒphƒpaƒpZƒpSƒpLƒpEƒp>ƒp7ƒp0ƒp)ƒp"ƒpƒpƒp ƒpƒpÿ‚pø‚pñ‚pê‚pã‚pÜ‚pÕ‚p΂pÇ‚pÀ‚p¹‚p²‚p«‚p¤‚p‚p–‚p‚pˆ‚p‚pz‚ps‚pl‚pe‚p^‚pW‚pP‚pI‚pB‚p;‚p4‚p-‚p&‚p‚p‚p‚p ‚p‚püpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppù€pò€pë€pä€pÝ€pÖ€pÏ€pÈ€pÁ€pº€p³€p¬€p¥€pž€p—€p€p‰€p‚€p{€pt€pm€pf€p_€pX€pQ€pJ€pC€p<€p5€p.€p'€p €p€p€p €p€pýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppú~pó~pì~på~pÞ~p×~pÐ~pÉ~pÂ~p»~p´~p­~p¦~pŸ~p˜~p‘~pŠ~pƒ~p|~pu~pn~pg~p`~pY~pR~pK~pD~p=~p6~p/~p(~p!~p~p~p ~p~pþ}p÷}pð}pé}pâ}pÛ}pÔ}pÍ}pÆ}p¿}p¸}p±}pª}p£}pœ}p•}pŽ}p‡}p€}py}pr}pk}pd}p]}pV}pO}pH}pA}p:}p3}p,}p%}p}p}p}p }p}pû|pô|pí|pæ|pß|pØ|pÑ|pÊ|pÃ|p¼|pµ|p®|p§|p |p™|p’|p‹|p„|p}|pv|po|ph|pa|pZ|pS|pL|pE|p>|p7|p0|p)|p"|p|p|p |p|pÿ{pø{pñ{pê{pã{pÜ{pÕ{pÎ{pÇ{pÀ{p¹{p²{p«{p¤{p{p–{p{pˆ{p{pz{ps{pl{pe{p^{pW{pP{pI{pB{p;{p4{p-{p&{p{p{p{p {p{püzpõzpîzpçzpàzpÙzpÒzpËzpÄzp½zp¶zp¯zp¨zp¡zpšzp“zpŒzp…zp~zpwzppzpizpbzp[zpTzpMzpFzp?zp8zp1zp*zp#zpzpzpzpzpzpùypòypëypäypÝypÖypÏypÈypÁypºyp³yp¬yp¥ypžyp—ypyp‰yp‚yp{yptypmypfyp_ypXypQypJypCypup7up0up)up"upupup upupÿtpøtpñtpêtpãtpÜtpÕtpÎtpÇtpÀtp¹tp²tp«tp¤tptp–tptpˆtptpztpstpltpetp^tpWtpPtpItpBtp;tp4tp-tp&tptptptp tptpüspõspîspçspàspÙspÒspËspÄsp½sp¶sp¯sp¨sp¡spšsp“spŒsp…sp~spwsppspispbsp[spTspMspFsp?sp8sp1sp*sp#spspspspspspùrpòrpërpärpÝrpÖrpÏrpÈrpÁrpºrp³rp¬rp¥rpžrp—rprp‰rp‚rp{rptrpmrpfrp_rpXrpQrpJrpCrpnp7np0np)np"npnpnp npnpÿmpømpñmpêmpãmpÜmpÕmpÎmpÇmpÀmp¹mp²mp«mp¤mpmp–mpmpˆmpmpzmpsmplmpemp^mpWmpPmpImpBmp;mp4mp-mp&mpmpmpmp mpmpülpõlpîlpçlpàlpÙlpÒlpËlpÄlp½lp¶lp¯lp¨lp¡lpšlp“lpŒlp…lp~lpwlpplpilpblp[lpTlpMlpFlp?lp8lp1lp*lp#lplplplplplpùkpòkpëkpäkpÝkpÖkpÏkpÈkpÁkpºkp³kp¬kp¥kpžkp—kpkp‰kp‚kp{kptkpmkpfkp_kpXkpQkpJkpCkpgp7gp0gp)gp"gpgpgp gpgpÿfpøfpñfpêfpãfpÜfpÕfpÎfpÇfpÀfp¹fp²fp«fp¤fpfp–fpfpˆfpfpzfpsfplfpefp^fpWfpPfpIfpBfp;fp4fp-fp&fpfpfpfp fpfpüepõepîepçepàepÙepÒepËepÄep½ep¶ep¯ep¨ep¡epšep“epŒep…ep~epweppepiepbep[epTepMepFep?ep8ep1ep*ep#epepepepepepùdpòdpëdpädpÝdpÖdpÏdpÈdpÁdpºdp³dp¬dp¥dpždp—dpdp‰dp‚dp{dptdpmdpfdp_dpXdpQdpJdpCdp`p7`p0`p)`p"`p`p`p `p`pÿ_pø_pñ_pê_pã_pÜ_pÕ_pÎ_pÇ_pÀ_p¹_p²_p«_p¤_p_p–_p_pˆ_p_pz_ps_pl_pe_p^_pW_pP_pI_pB_p;_p4_p-_p&_p_p_p_p _p_pü^põ^pî^pç^pà^pÙ^pÒ^pË^pÄ^p½^p¶^p¯^p¨^p¡^pš^p“^pŒ^p…^p~^pw^pp^pi^pb^p[^pT^pM^pF^p?^p8^p1^p*^p#^p^p^p^p^p^pù]pò]pë]pä]pÝ]pÖ]pÏ]pÈ]pÁ]pº]p³]p¬]p¥]pž]p—]p]p‰]p‚]p{]pt]pm]pf]p_]pX]pQ]pJ]pC]p<]p5]p.]p']p ]p]p]p ]p]pý\pö\pï\pè\pá\pÚ\pÓ\pÌ\pÅ\p¾\p·\p°\p©\p¢\p›\p”\p\p†\p\px\pq\pj\pc\p\\pU\pN\pG\p@\p9\p2\p+\p$\p\p\p\p\p\pú[pó[pì[på[pÞ[p×[pÐ[pÉ[pÂ[p»[p´[p­[p¦[pŸ[p˜[p‘[pŠ[pƒ[p|[pu[pn[pg[p`[pY[pR[pK[pD[p=[p6[p/[p([p![p[p[p [p[pþZp÷ZpðZpéZpâZpÛZpÔZpÍZpÆZp¿Zp¸Zp±ZpªZp£ZpœZp•ZpŽZp‡Zp€ZpyZprZpkZpdZp]ZpVZpOZpHZpAZp:Zp3Zp,Zp%ZpZpZpZp ZpZpûYpôYpíYpæYpßYpØYpÑYpÊYpÃYp¼YpµYp®Yp§Yp Yp™Yp’Yp‹Yp„Yp}YpvYpoYphYpaYpZYpSYpLYpEYp>Yp7Yp0Yp)Yp"YpYpYp YpYpÿXpøXpñXpêXpãXpÜXpÕXpÎXpÇXpÀXp¹Xp²Xp«Xp¤XpXp–XpXpˆXpXpzXpsXplXpeXp^XpWXpPXpIXpBXp;Xp4Xp-Xp&XpXpXpXp XpXpüWpõWpîWpçWpàWpÙWpÒWpËWpÄWp½Wp¶Wp¯Wp¨Wp¡WpšWp“WpŒWp…Wp~WpwWppWpiWpbWp[WpTWpMWpFWp?Wp8Wp1Wp*Wp#WpWpWpWpWpWpùVpòVpëVpäVpÝVpÖVpÏVpÈVpÁVpºVp³Vp¬Vp¥VpžVp—VpVp‰Vp‚Vp{VptVpmVpfVp_VpXVpQVpJVpCVpRp7Rp0Rp)Rp"RpRpRp RpRpÿQpøQpñQpêQpãQpÜQpÕQpÎQpÇQpÀQp¹Qp²Qp«Qp¤QpQp–QpQpˆQpQpzQpsQplQpeQp^QpWQpPQpIQpBQp;Qp4Qp-Qp&QpQpQpQp QpQpüPpõPpîPpçPpàPpÙPpÒPpËPpÄPp½Pp¶Pp¯Pp¨Pp¡PpšPp“PpŒPp…Pp~PpwPppPpiPpbPp[PpTPpMPpFPp?Pp8Pp1Pp*Pp#PpPpPpPpPpPpùOpòOpëOpäOpÝOpÖOpÏOpÈOpÁOpºOp³Op¬Op¥OpžOp—OpOp‰Op‚Op{OptOpmOpfOp_OpXOpQOpJOpCOpKp7Kp0Kp)Kp"KpKpKp KpKpÿJpøJpñJpêJpãJpÜJpÕJpÎJpÇJpÀJp¹Jp²Jp«Jp¤JpJp–JpJpˆJpJpzJpsJplJpeJp^JpWJpPJpIJpBJp;Jp4Jp-Jp&JpJpJpJp JpJpüIpõIpîIpçIpàIpÙIpÒIpËIpÄIp½Ip¶Ip¯Ip¨Ip¡IpšIp“IpŒIp…Ip~IpwIppIpiIpbIp[IpTIpMIpFIp?Ip8Ip1Ip*Ip#IpIpIpIpIpIpùHpòHpëHpäHpÝHpÖHpÏHpÈHpÁHpºHp³Hp¬Hp¥HpžHp—HpHp‰Hp‚Hp{HptHpmHpfHp_HpXHpQHpJHpCHpDp7Dp0Dp)Dp"DpDpDp DpDpÿCpøCpñCpêCpãCpÜCpÕCpÎCpÇCpÀCp¹Cp²Cp«Cp¤CpCp–CpCpˆCpCpzCpsCplCpeCp^CpWCpPCpICpBCp;Cp4Cp-Cp&CpCpCpCp CpCpüBpõBpîBpçBpàBpÙBpÒBpËBpÄBp½Bp¶Bp¯Bp¨Bp¡BpšBp“BpŒBp…Bp~BpwBppBpiBpbBp[BpTBpMBpFBp?Bp8Bp1Bp*Bp#BpBpBpBpBpBpùApòApëApäApÝApÖApÏApÈApÁApºAp³Ap¬Ap¥ApžAp—ApAp‰Ap‚Ap{AptApmApfAp_ApXApQApJApCApp÷>pð>pé>pâ>pÛ>pÔ>pÍ>pÆ>p¿>p¸>p±>pª>p£>pœ>p•>pŽ>p‡>p€>py>pr>pk>pd>p]>pV>pO>pH>pA>p:>p3>p,>p%>p>p>p>p >p>pû=pô=pí=pæ=pß=pØ=pÑ=pÊ=pÃ=p¼=pµ=p®=p§=p =p™=p’=p‹=p„=p}=pv=po=ph=pa=pZ=pS=pL=pE=p>=p7=p0=p)=p"=p=p=p =p=pÿ6p76p06p)6p"6p6p6p 6p6pÿ5pø5pñ5pê5pã5pÜ5pÕ5pÎ5pÇ5pÀ5p¹5p²5p«5p¤5p5p–5p5pˆ5p5pz5ps5pl5pe5p^5pW5pP5pI5pB5p;5p45p-5p&5p5p5p5p 5p5pü4põ4pî4pç4pà4pÙ4pÒ4pË4pÄ4p½4p¶4p¯4p¨4p¡4pš4p“4pŒ4p…4p~4pw4pp4pi4pb4p[4pT4pM4pF4p?4p84p14p*4p#4p4p4p4p4p4pù3pò3pë3pä3pÝ3pÖ3pÏ3pÈ3pÁ3pº3p³3p¬3p¥3pž3p—3p3p‰3p‚3p{3pt3pm3pf3p_3pX3pQ3pJ3pC3p<3p53p.3p'3p 3p3p3p 3p3pý2pö2pï2pè2pá2pÚ2pÓ2pÌ2pÅ2p¾2p·2p°2p©2p¢2p›2p”2p2p†2p2px2pq2pj2pc2p\2pU2pN2pG2p@2p92p22p+2p$2p2p2p2p2p2pú1pó1pì1på1pÞ1p×1pÐ1pÉ1pÂ1p»1p´1p­1p¦1pŸ1p˜1p‘1pŠ1pƒ1p|1pu1pn1pg1p`1pY1pR1pK1pD1p=1p61p/1p(1p!1p1p1p 1p1pþ0p÷0pð0pé0pâ0pÛ0pÔ0pÍ0pÆ0p¿0p¸0p±0pª0p£0pœ0p•0pŽ0p‡0p€0py0pr0pk0pd0p]0pV0pO0pH0pA0p:0p30p,0p%0p0p0p0p 0p0pû/pô/pí/pæ/pß/pØ/pÑ/pÊ/pÃ/p¼/pµ/p®/p§/p /p™/p’/p‹/p„/p}/pv/po/ph/pa/pZ/pS/pL/pE/p>/p7/p0/p)/p"/p/p/p /p/pÿ.pø.pñ.pê.pã.pÜ.pÕ.pÎ.pÇ.pÀ.p¹.p².p«.p¤.p.p–.p.pˆ.p.pz.ps.pl.pe.p^.pW.pP.pI.pB.p;.p4.p-.p&.p.p.p.p .p.pü-põ-pî-pç-pà-pÙ-pÒ-pË-pÄ-p½-p¶-p¯-p¨-p¡-pš-p“-pŒ-p…-p~-pw-pp-pi-pb-p[-pT-pM-pF-p?-p8-p1-p*-p#-p-p-p-p-p-pù,pò,pë,pä,pÝ,pÖ,pÏ,pÈ,pÁ,pº,p³,p¬,p¥,pž,p—,p,p‰,p‚,p{,pt,pm,pf,p_,pX,pQ,pJ,pC,p<,p5,p.,p',p ,p,p,p ,p,pý+pö+pï+pè+pá+pÚ+pÓ+pÌ+pÅ+p¾+p·+p°+p©+p¢+p›+p”+p+p†+p+px+pq+pj+pc+p\+pU+pN+pG+p@+p9+p2+p++p$+p+p+p+p+p+pú*pó*pì*på*pÞ*p×*pÐ*pÉ*pÂ*p»*p´*p­*p¦*pŸ*p˜*p‘*pŠ*pƒ*p|*pu*pn*pg*p`*pY*pR*pK*pD*p=*p6*p/*p(*p!*p*p*p *p*pþ)p÷)pð)pé)pâ)pÛ)pÔ)pÍ)pÆ)p¿)p¸)p±)pª)p£)pœ)p•)pŽ)p‡)p€)py)pr)pk)pd)p])pV)pO)pH)pA)p:)p3)p,)p%)p)p)p)p )p)pû(pô(pí(pæ(pß(pØ(pÑ(pÊ(pÃ(p¼(pµ(p®(p§(p (p™(p’(p‹(p„(p}(pv(po(ph(pa(pZ(pS(pL(pE(p>(p7(p0(p)(p"(p(p(p (p(pÿ'pø'pñ'pê'pã'pÜ'pÕ'pÎ'pÇ'pÀ'p¹'p²'p«'p¤'p'p–'p'pˆ'p'pz'ps'pl'pe'p^'pW'pP'pI'pB'p;'p4'p-'p&'p'p'p'p 'p'pü&põ&pî&pç&pà&pÙ&pÒ&pË&pÄ&p½&p¶&p¯&p¨&p¡&pš&p“&pŒ&p…&p~&pw&pp&pi&pb&p[&pT&pM&pF&p?&p8&p1&p*&p#&p&p&p&p&p&pù%pò%pë%pä%pÝ%pÖ%pÏ%pÈ%pÁ%pº%p³%p¬%p¥%pž%p—%p%p‰%p‚%p{%pt%pm%pf%p_%pX%pQ%pJ%pC%p<%p5%p.%p'%p %p%p%p %p%pý$pö$pï$pè$pá$pÚ$pÓ$pÌ$pÅ$p¾$p·$p°$p©$p¢$p›$p”$p$p†$p$px$pq$pj$pc$p\$pU$pN$pG$p@$p9$p2$p+$p$$p$p$p$p$p$pú#pó#pì#på#pÞ#p×#pÐ#pÉ#pÂ#p»#p´#p­#p¦#pŸ#p˜#p‘#pŠ#pƒ#p|#pu#pn#pg#p`#pY#pR#pK#pD#p=#p6#p/#p(#p!#p#p#p #p#pþ"p÷"pð"pé"pâ"pÛ"pÔ"pÍ"pÆ"p¿"p¸"p±"pª"p£"pœ"p•"pŽ"p‡"p€"py"pr"pk"pd"p]"pV"pO"pH"pA"p:"p3"p,"p%"p"p"p"p "p"pû!pô!pí!pæ!pß!pØ!pÑ!pÊ!pÃ!p¼!pµ!p®!p§!p !p™!p’!p‹!p„!p}!pv!po!ph!pa!pZ!pS!pL!pE!p>!p7!p0!p)!p"!p!p!p !p!pÿ pø pñ pê pã pÜ pÕ pÎ pÇ pÀ p¹ p² p« p¤ p p– p pˆ p pz ps pl pe p^ pW pP pI pB p; p4 p- p& p p p p p püpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCp<p5p.p'p ppp ppýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúpópìpåpÞp×pÐpÉpÂp»p´p­p¦pŸp˜p‘pŠpƒp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppþp÷pðpépâpÛpÔpÍpÆp¿p¸p±pªp£pœp•pŽp‡p€pyprpkpdp]pVpOpHpAp:p3p,p%pppp ppûpôpípæpßpØpÑpÊpÃp¼pµp®p§p p™p’p‹p„p}pvpophpapZpSpLpEp>p7p0p)p"ppp ppÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCp<p5p.p'p ppp ppýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúpópìpåpÞp×pÐpÉpÂp»p´p­p¦pŸp˜p‘pŠpƒp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppþp÷pðpépâpÛpÔpÍpÆp¿p¸p±pªp£pœp•pŽp‡p€pyprpkpdp]pVpOpHpAp:p3p,p%pppp ppûpôpípæpßpØpÑpÊpÃp¼pµp®p§p p™p’p‹p„p}pvpophpapZpSpLpEp>p7p0p)p"ppp ppÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCp<p5p.p'p ppp ppýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúpópìpåpÞp×pÐpÉpÂp»p´p­p¦pŸp˜p‘pŠpƒp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppþ p÷ pð pé pâ pÛ pÔ pÍ pÆ p¿ p¸ p± pª p£ pœ p• pŽ p‡ p€ py pr pk pd p] pV pO pH pA p: p3 p, p% p p p p p pû pô pí pæ pß pØ pÑ pÊ pà p¼ pµ p® p§ p  p™ p’ p‹ p„ p} pv po ph pa pZ pS pL pE p> p7 p0 p) p" p p p p pÿ pø pñ pê pã pÜ pÕ pÎ pÇ pÀ p¹ p² p« p¤ p p– p pˆ p pz ps pl pe p^ pW pP pI pB p; p4 p- p& p p p p p pü põ pî pç pà pÙ pÒ pË pÄ p½ p¶ p¯ p¨ p¡ pš p“ pŒ p… p~ pw pp pi pb p[ pT pM pF p? p8 p1 p* p# p p p p p pù pò pë pä pÝ pÖ pÏ pÈ pÁ pº p³ p¬ p¥ pž p— p p‰ p‚ p{ pt pm pf p_ pX pQ pJ pC p< p5 p. p' p p p p p pýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúpópìpåpÞp×pÐpÉpÂp»p´p­p¦pŸp˜p‘pŠpƒp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppþp÷pðpépâpÛpÔpÍpÆp¿p¸p±pªp£pœp•pŽp‡p€pyprpkpdp]pVpOpHpAp:p3p,p%pppp ppûpôpípæpßpØpÑpÊpÃp¼pµp®p§p p™p’p‹p„p}pvpophpapZpSpLpEp>p7p0p)p"ppp ppÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCp<p5p.p'p ppp ppýpöpïpèpápÚpÓpÌpÅp¾p·p°p©p¢p›p”pp†ppxpqpjpcp\pUpNpGp@p9p2p+p$ppppppúpópìpåpÞp×pÐpÉpÂp»p´p­p¦pŸp˜p‘pŠpƒp|pupnpgp`pYpRpKpDp=p6p/p(p!ppp ppþÿo÷ÿoðÿoéÿoâÿoÛÿoÔÿoÍÿoÆÿo¿ÿo¸ÿo±ÿoªÿo£ÿoœÿo•ÿoŽÿo‡ÿo€ÿoyÿorÿokÿodÿo]ÿoVÿoOÿoHÿoAÿo:ÿo3ÿo,ÿo%ÿoÿoÿoÿo ÿoÿoûþoôþoíþoæþoßþoØþoÑþoÊþoÃþo¼þoµþo®þo§þo þo™þo’þo‹þo„þo}þovþooþohþoaþoZþoSþoLþoEþo>þo7þo0þo)þo"þoþoþo þoþoÿýoøýoñýoêýoãýoÜýoÕýoÎýoÇýoÀýo¹ýo²ýo«ýo¤ýoýo–ýoýoˆýoýozýosýolýoeýo^ýoWýoPýoIýoBýo;ýo4ýo-ýo&ýoýoýoýo ýoýoüüoõüoîüoçüoàüoÙüoÒüoËüoÄüo½üo¶üo¯üo¨üo¡üošüo“üoŒüo…üo~üowüopüoiüobüo[üoTüoMüoFüo?üo8üo1üo*üo#üoüoüoüoüoüoùûoòûoëûoäûoÝûoÖûoÏûoÈûoÁûoºûo³ûo¬ûo¥ûožûo—ûoûo‰ûo‚ûo{ûotûomûofûo_ûoXûoQûoJûoCûo<ûo5ûo.ûo'ûo ûoûoûo ûoûoýúoöúoïúoèúoáúoÚúoÓúoÌúoÅúo¾úo·úo°úo©úo¢úo›úo”úoúo†úoúoxúoqúojúocúo\úoUúoNúoGúo@úo9úo2úo+úo$úoúoúoúoúoúoúùoóùoìùoåùoÞùo×ùoÐùoÉùoÂùo»ùo´ùo­ùo¦ùoŸùo˜ùo‘ùoŠùoƒùo|ùouùonùogùo`ùoYùoRùoKùoDùo=ùo6ùo/ùo(ùo!ùoùoùo ùoùoþøo÷øoðøoéøoâøoÛøoÔøoÍøoÆøo¿øo¸øo±øoªøo£øoœøo•øoŽøo‡øo€øoyøorøokøodøo]øoVøoOøoHøoAøo:øo3øo,øo%øoøoøoøo øoøoû÷oô÷oí÷oæ÷oß÷oØ÷oÑ÷oÊ÷oÃ÷o¼÷oµ÷o®÷o§÷o ÷o™÷o’÷o‹÷o„÷o}÷ov÷oo÷oh÷oa÷oZ÷oS÷oL÷oE÷o>÷o7÷o0÷o)÷o"÷o÷o÷o ÷o÷oÿöoøöoñöoêöoãöoÜöoÕöoÎöoÇöoÀöo¹öo²öo«öo¤öoöo–öoöoˆöoöozöosöolöoeöo^öoWöoPöoIöoBöo;öo4öo-öo&öoöoöoöo öoöoüõoõõoîõoçõoàõoÙõoÒõoËõoÄõo½õo¶õo¯õo¨õo¡õošõo“õoŒõo…õo~õowõopõoiõobõo[õoTõoMõoFõo?õo8õo1õo*õo#õoõoõoõoõoõoùôoòôoëôoäôoÝôoÖôoÏôoÈôoÁôoºôo³ôo¬ôo¥ôožôo—ôoôo‰ôo‚ôo{ôotôomôofôo_ôoXôoQôoJôoCôo<ôo5ôo.ôo'ôo ôoôoôo ôoôoýóoöóoïóoèóoáóoÚóoÓóoÌóoÅóo¾óo·óo°óo©óo¢óo›óo”óoóo†óoóoxóoqóojóocóo\óoUóoNóoGóo@óo9óo2óo+óo$óoóoóoóoóoóoúòoóòoìòoåòoÞòo×òoÐòoÉòoÂòo»òo´òo­òo¦òoŸòo˜òo‘òoŠòoƒòo|òouòonòogòo`òoYòoRòoKòoDòo=òo6òo/òo(òo!òoòoòo òoòoþño÷ñoðñoéñoâñoÛñoÔñoÍñoÆño¿ño¸ño±ñoªño£ñoœño•ñoŽño‡ño€ñoyñorñokñodño]ñoVñoOñoHñoAño:ño3ño,ño%ñoñoñoño ñoñoûðoôðoíðoæðoßðoØðoÑðoÊðoÃðo¼ðoµðo®ðo§ðo ðo™ðo’ðo‹ðo„ðo}ðovðooðohðoaðoZðoSðoLðoEðo>ðo7ðo0ðo)ðo"ðoðoðo ðoðoÿïoøïoñïoêïoãïoÜïoÕïoÎïoÇïoÀïo¹ïo²ïo«ïo¤ïoïo–ïoïoˆïoïozïosïolïoeïo^ïoWïoPïoIïoBïo;ïo4ïo-ïo&ïoïoïoïo ïoïoüîoõîoîîoçîoàîoÙîoÒîoËîoÄîo½îo¶îo¯îo¨îo¡îošîo“îoŒîo…îo~îowîopîoiîobîo[îoTîoMîoFîo?îo8îo1îo*îo#îoîoîoîoîoîoùíoòíoëíoäíoÝíoÖíoÏíoÈíoÁíoºío³ío¬ío¥íožío—íoío‰ío‚ío{íotíomíofío_íoXíoQíoJíoCío<ío5ío.ío'ío íoíoío íoíoýìoöìoïìoèìoáìoÚìoÓìoÌìoÅìo¾ìo·ìo°ìo©ìo¢ìo›ìo”ìoìo†ìoìoxìoqìojìocìo\ìoUìoNìoGìo@ìo9ìo2ìo+ìo$ìoìoìoìoìoìoúëoóëoìëoåëoÞëo×ëoÐëoÉëoÂëo»ëo´ëo­ëo¦ëoŸëo˜ëo‘ëoŠëoƒëo|ëouëonëogëo`ëoYëoRëoKëoDëo=ëo6ëo/ëo(ëo!ëoëoëo ëoëoþêo÷êoðêoéêoâêoÛêoÔêoÍêoÆêo¿êo¸êo±êoªêo£êoœêo•êoŽêo‡êo€êoyêorêokêodêo]êoVêoOêoHêoAêo:êo3êo,êo%êoêoêoêo êoêoûéoôéoíéoæéoßéoØéoÑéoÊéoÃéo¼éoµéo®éo§éo éo™éo’éo‹éo„éo}éovéooéohéoaéoZéoSéoLéoEéo>éo7éo0éo)éo"éoéoéo éoéoÿèoøèoñèoêèoãèoÜèoÕèoÎèoÇèoÀèo¹èo²èo«èo¤èoèo–èoèoˆèoèozèosèolèoeèo^èoWèoPèoIèoBèo;èo4èo-èo&èoèoèoèo èoèoüçoõçoîçoççoàçoÙçoÒçoËçoÄço½ço¶ço¯ço¨ço¡çošço“çoŒço…ço~çowçopçoiçobço[çoTçoMçoFço?ço8ço1ço*ço#çoçoçoçoçoçoùæoòæoëæoäæoÝæoÖæoÏæoÈæoÁæoºæo³æo¬æo¥æožæo—æoæo‰æo‚æo{æotæomæofæo_æoXæoQæoJæoCæo<æo5æo.æo'æo æoæoæo æoæoýåoöåoïåoèåoáåoÚåoÓåoÌåoÅåo¾åo·åo°åo©åo¢åo›åo”åoåo†åoåoxåoqåojåocåo\åoUåoNåoGåo@åo9åo2åo+åo$åoåoåoåoåoåoúäoóäoìäoåäoÞäo×äoÐäoÉäoÂäo»äo´äo­äo¦äoŸäo˜äo‘äoŠäoƒäo|äouäonäogäo`äoYäoRäoKäoDäo=äo6äo/äo(äo!äoäoäo äoäoþão÷ãoðãoéãoâãoÛãoÔãoÍãoÆão¿ão¸ão±ãoªão£ãoœão•ãoŽão‡ão€ãoyãorãokãodão]ãoVãoOãoHãoAão:ão3ão,ão%ãoãoãoão ãoãoûâoôâoíâoæâoßâoØâoÑâoÊâoÃâo¼âoµâo®âo§âo âo™âo’âo‹âo„âo}âovâooâohâoaâoZâoSâoLâoEâo>âo7âo0âo)âo"âoâoâo âoâoÿáoøáoñáoêáoãáoÜáoÕáoÎáoÇáoÀáo¹áo²áo«áo¤áoáo–áoáoˆáoáozáosáoláoeáo^áoWáoPáoIáoBáo;áo4áo-áo&áoáoáoáo áoáoüàoõàoîàoçàoààoÙàoÒàoËàoÄào½ào¶ào¯ào¨ào¡àošào“àoŒào…ào~àowàopàoiàobào[àoTàoMàoFào?ào8ào1ào*ào#àoàoàoàoàoàoùßoòßoëßoäßoÝßoÖßoÏßoÈßoÁßoºßo³ßo¬ßo¥ßožßo—ßoßo‰ßo‚ßo{ßotßomßofßo_ßoXßoQßoJßoCßo<ßo5ßo.ßo'ßo ßoßoßo ßoßoýÞoöÞoïÞoèÞoáÞoÚÞoÓÞoÌÞoÅÞo¾Þo·Þo°Þo©Þo¢Þo›Þo”ÞoÞo†ÞoÞoxÞoqÞojÞocÞo\ÞoUÞoNÞoGÞo@Þo9Þo2Þo+Þo$ÞoÞoÞoÞoÞoÞoúÝoóÝoìÝoåÝoÞÝo×ÝoÐÝoÉÝoÂÝo»Ýo´Ýo­Ýo¦ÝoŸÝo˜Ýo‘ÝoŠÝoƒÝo|ÝouÝonÝogÝo`ÝoYÝoRÝoKÝoDÝo=Ýo6Ýo/Ýo(Ýo!ÝoÝoÝo ÝoÝoþÜo÷ÜoðÜoéÜoâÜoÛÜoÔÜoÍÜoÆÜo¿Üo¸Üo±ÜoªÜo£ÜoœÜo•ÜoŽÜo‡Üo€ÜoyÜorÜokÜodÜo]ÜoVÜoOÜoHÜoAÜo:Üo3Üo,Üo%ÜoÜoÜoÜo ÜoÜoûÛoôÛoíÛoæÛoßÛoØÛoÑÛoÊÛoÃÛo¼ÛoµÛo®Ûo§Ûo Ûo™Ûo’Ûo‹Ûo„Ûo}ÛovÛooÛohÛoaÛoZÛoSÛoLÛoEÛo>Ûo7Ûo0Ûo)Ûo"ÛoÛoÛo ÛoÛoÿÚoøÚoñÚoêÚoãÚoÜÚoÕÚoÎÚoÇÚoÀÚo¹Úo²Úo«Úo¤ÚoÚo–ÚoÚoˆÚoÚozÚosÚolÚoeÚo^ÚoWÚoPÚoIÚoBÚo;Úo4Úo-Úo&ÚoÚoÚoÚo ÚoÚoüÙoõÙoîÙoçÙoàÙoÙÙoÒÙoËÙoÄÙo½Ùo¶Ùo¯Ùo¨Ùo¡ÙošÙo“ÙoŒÙo…Ùo~ÙowÙopÙoiÙobÙo[ÙoTÙoMÙoFÙo?Ùo8Ùo1Ùo*Ùo#ÙoÙoÙoÙoÙoÙoùØoòØoëØoäØoÝØoÖØoÏØoÈØoÁØoºØo³Øo¬Øo¥ØožØo—ØoØo‰Øo‚Øo{ØotØomØofØo_ØoXØoQØoJØoCØo<Øo5Øo.Øo'Øo ØoØoØo ØoØoý×oö×oï×oè×oá×oÚ×oÓ×oÌ×oÅ×o¾×o·×o°×o©×o¢×o›×o”×o×o†×o×ox×oq×oj×oc×o\×oU×oN×oG×o@×o9×o2×o+×o$×o×o×o×o×o×oúÖoóÖoìÖoåÖoÞÖo×ÖoÐÖoÉÖoÂÖo»Öo´Öo­Öo¦ÖoŸÖo˜Öo‘ÖoŠÖoƒÖo|ÖouÖonÖogÖo`ÖoYÖoRÖoKÖoDÖo=Öo6Öo/Öo(Öo!ÖoÖoÖo ÖoÖoþÕo÷ÕoðÕoéÕoâÕoÛÕoÔÕoÍÕoÆÕo¿Õo¸Õo±ÕoªÕo£ÕoœÕo•ÕoŽÕo‡Õo€ÕoyÕorÕokÕodÕo]ÕoVÕoOÕoHÕoAÕo:Õo3Õo,Õo%ÕoÕoÕoÕo ÕoÕoûÔoôÔoíÔoæÔoßÔoØÔoÑÔoÊÔoÃÔo¼ÔoµÔo®Ôo§Ôo Ôo™Ôo’Ôo‹Ôo„Ôo}ÔovÔooÔohÔoaÔoZÔoSÔoLÔoEÔo>Ôo7Ôo0Ôo)Ôo"ÔoÔoÔo ÔoÔoÿÓoøÓoñÓoêÓoãÓoÜÓoÕÓoÎÓoÇÓoÀÓo¹Óo²Óo«Óo¤ÓoÓo–ÓoÓoˆÓoÓozÓosÓolÓoeÓo^ÓoWÓoPÓoIÓoBÓo;Óo4Óo-Óo&ÓoÓoÓoÓo ÓoÓoüÒoõÒoîÒoçÒoàÒoÙÒoÒÒoËÒoÄÒo½Òo¶Òo¯Òo¨Òo¡ÒošÒo“ÒoŒÒo…Òo~ÒowÒopÒoiÒobÒo[ÒoTÒoMÒoFÒo?Òo8Òo1Òo*Òo#ÒoÒoÒoÒoÒoÒoùÑoòÑoëÑoäÑoÝÑoÖÑoÏÑoÈÑoÁÑoºÑo³Ño¬Ño¥ÑožÑo—ÑoÑo‰Ño‚Ño{ÑotÑomÑofÑo_ÑoXÑoQÑoJÑoCÑo<Ño5Ño.Ño'Ño ÑoÑoÑo ÑoÑoýÐoöÐoïÐoèÐoáÐoÚÐoÓÐoÌÐoÅÐo¾Ðo·Ðo°Ðo©Ðo¢Ðo›Ðo”ÐoÐo†ÐoÐoxÐoqÐojÐocÐo\ÐoUÐoNÐoGÐo@Ðo9Ðo2Ðo+Ðo$ÐoÐoÐoÐoÐoÐoúÏoóÏoìÏoåÏoÞÏo×ÏoÐÏoÉÏoÂÏo»Ïo´Ïo­Ïo¦ÏoŸÏo˜Ïo‘ÏoŠÏoƒÏo|ÏouÏonÏogÏo`ÏoYÏoRÏoKÏoDÏo=Ïo6Ïo/Ïo(Ïo!ÏoÏoÏo ÏoÏoþÎo÷ÎoðÎoéÎoâÎoÛÎoÔÎoÍÎoÆÎo¿Îo¸Îo±ÎoªÎo£ÎoœÎo•ÎoŽÎo‡Îo€ÎoyÎorÎokÎodÎo]ÎoVÎoOÎoHÎoAÎo:Îo3Îo,Îo%ÎoÎoÎoÎo ÎoÎoûÍoôÍoíÍoæÍoßÍoØÍoÑÍoÊÍoÃÍo¼ÍoµÍo®Ío§Ío Ío™Ío’Ío‹Ío„Ío}ÍovÍooÍohÍoaÍoZÍoSÍoLÍoEÍo>Ío7Ío0Ío)Ío"ÍoÍoÍo ÍoÍoÿÌoøÌoñÌoêÌoãÌoÜÌoÕÌoÎÌoÇÌoÀÌo¹Ìo²Ìo«Ìo¤ÌoÌo–ÌoÌoˆÌoÌozÌosÌolÌoeÌo^ÌoWÌoPÌoIÌoBÌo;Ìo4Ìo-Ìo&ÌoÌoÌoÌo ÌoÌoüËoõËoîËoçËoàËoÙËoÒËoËËoÄËo½Ëo¶Ëo¯Ëo¨Ëo¡ËošËo“ËoŒËo…Ëo~ËowËopËoiËobËo[ËoTËoMËoFËo?Ëo8Ëo1Ëo*Ëo#ËoËoËoËoËoËoùÊoòÊoëÊoäÊoÝÊoÖÊoÏÊoÈÊoÁÊoºÊo³Êo¬Êo¥ÊožÊo—ÊoÊo‰Êo‚Êo{ÊotÊomÊofÊo_ÊoXÊoQÊoJÊoCÊo<Êo5Êo.Êo'Êo ÊoÊoÊo ÊoÊoýÉoöÉoïÉoèÉoáÉoÚÉoÓÉoÌÉoÅÉo¾Éo·Éo°Éo©Éo¢Éo›Éo”ÉoÉo†ÉoÉoxÉoqÉojÉocÉo\ÉoUÉoNÉoGÉo@Éo9Éo2Éo+Éo$ÉoÉoÉoÉoÉoÉoúÈoóÈoìÈoåÈoÞÈo×ÈoÐÈoÉÈoÂÈo»Èo´Èo­Èo¦ÈoŸÈo˜Èo‘ÈoŠÈoƒÈo|ÈouÈonÈogÈo`ÈoYÈoRÈoKÈoDÈo=Èo6Èo/Èo(Èo!ÈoÈoÈo ÈoÈoþÇo÷ÇoðÇoéÇoâÇoÛÇoÔÇoÍÇoÆÇo¿Ço¸Ço±ÇoªÇo£ÇoœÇo•ÇoŽÇo‡Ço€ÇoyÇorÇokÇodÇo]ÇoVÇoOÇoHÇoAÇo:Ço3Ço,Ço%ÇoÇoÇoÇo ÇoÇoûÆoôÆoíÆoæÆo߯oØÆoÑÆoÊÆoÃÆo¼ÆoµÆo®Æo§Æo Æo™Æo’Æo‹Æo„Æo}ÆovÆooÆohÆoaÆoZÆoSÆoLÆoEÆo>Æo7Æo0Æo)Æo"ÆoÆoÆo ÆoÆoÿÅoøÅoñÅoêÅoãÅoÜÅoÕÅoÎÅoÇÅoÀÅo¹Åo²Åo«Åo¤ÅoÅo–ÅoÅoˆÅoÅozÅosÅolÅoeÅo^ÅoWÅoPÅoIÅoBÅo;Åo4Åo-Åo&ÅoÅoÅoÅo ÅoÅoüÄoõÄoîÄoçÄoàÄoÙÄoÒÄoËÄoÄÄo½Äo¶Äo¯Äo¨Äo¡ÄošÄo“ÄoŒÄo…Äo~ÄowÄopÄoiÄobÄo[ÄoTÄoMÄoFÄo?Äo8Äo1Äo*Äo#ÄoÄoÄoÄoÄoÄoùÃoòÃoëÃoäÃoÝÃoÖÃoÏÃoÈÃoÁÃoºÃo³Ão¬Ão¥ÃožÃo—ÃoÃo‰Ão‚Ão{ÃotÃomÃofÃo_ÃoXÃoQÃoJÃoCÃo<Ão5Ão.Ão'Ão ÃoÃoÃo ÃoÃoýÂoöÂoïÂoèÂoáÂoÚÂoÓÂoÌÂoÅÂo¾Âo·Âo°Âo©Âo¢Âo›Âo”ÂoÂo†ÂoÂoxÂoqÂojÂocÂo\ÂoUÂoNÂoGÂo@Âo9Âo2Âo+Âo$ÂoÂoÂoÂoÂoÂoúÁoóÁoìÁoåÁoÞÁo×ÁoÐÁoÉÁoÂÁo»Áo´Áo­Áo¦ÁoŸÁo˜Áo‘ÁoŠÁoƒÁo|ÁouÁonÁogÁo`ÁoYÁoRÁoKÁoDÁo=Áo6Áo/Áo(Áo!ÁoÁoÁo ÁoÁoþÀo÷ÀoðÀoéÀoâÀoÛÀoÔÀoÍÀoÆÀo¿Ào¸Ào±ÀoªÀo£ÀoœÀo•ÀoŽÀo‡Ào€ÀoyÀorÀokÀodÀo]ÀoVÀoOÀoHÀoAÀo:Ào3Ào,Ào%ÀoÀoÀoÀo ÀoÀoû¿oô¿oí¿oæ¿oß¿oØ¿oÑ¿oÊ¿oÿo¼¿oµ¿o®¿o§¿o ¿o™¿o’¿o‹¿o„¿o}¿ov¿oo¿oh¿oa¿oZ¿oS¿oL¿oE¿o>¿o7¿o0¿o)¿o"¿o¿o¿o ¿o¿oÿ¾oø¾oñ¾oê¾oã¾oܾoÕ¾oξoǾoÀ¾o¹¾o²¾o«¾o¤¾o¾o–¾o¾oˆ¾o¾oz¾os¾ol¾oe¾o^¾oW¾oP¾oI¾oB¾o;¾o4¾o-¾o&¾o¾o¾o¾o ¾o¾oü½oõ½oî½oç½oà½oÙ½oÒ½o˽oĽo½½o¶½o¯½o¨½o¡½oš½o“½oŒ½o…½o~½ow½op½oi½ob½o[½oT½oM½oF½o?½o8½o1½o*½o#½o½o½o½o½o½où¼oò¼oë¼oä¼oݼoÖ¼oϼoȼoÁ¼oº¼o³¼o¬¼o¥¼ož¼o—¼o¼o‰¼o‚¼o{¼ot¼om¼of¼o_¼oX¼oQ¼oJ¼oC¼o<¼o5¼o.¼o'¼o ¼o¼o¼o ¼o¼oý»oö»oï»oè»oá»oÚ»oÓ»oÌ»oÅ»o¾»o·»o°»o©»o¢»o›»o”»o»o†»o»ox»oq»oj»oc»o\»oU»oN»oG»o@»o9»o2»o+»o$»o»o»o»o»o»oúºoóºoìºoåºoÞºo׺oкoɺoºo»ºo´ºo­ºo¦ºoŸºo˜ºo‘ºoŠºoƒºo|ºouºonºogºo`ºoYºoRºoKºoDºo=ºo6ºo/ºo(ºo!ºoºoºo ºoºoþ¹o÷¹oð¹oé¹oâ¹oÛ¹oÔ¹o͹oƹo¿¹o¸¹o±¹oª¹o£¹oœ¹o•¹o޹o‡¹o€¹oy¹or¹ok¹od¹o]¹oV¹oO¹oH¹oA¹o:¹o3¹o,¹o%¹o¹o¹o¹o ¹o¹oû¸oô¸oí¸oæ¸o߸oظoѸoʸoøo¼¸oµ¸o®¸o§¸o ¸o™¸o’¸o‹¸o„¸o}¸ov¸oo¸oh¸oa¸oZ¸oS¸oL¸oE¸o>¸o7¸o0¸o)¸o"¸o¸o¸o ¸o¸oÿ·oø·oñ·oê·oã·oÜ·oÕ·oηoÇ·oÀ·o¹·o²·o«·o¤·o·o–·o·oˆ·o·oz·os·ol·oe·o^·oW·oP·oI·oB·o;·o4·o-·o&·o·o·o·o ·o·oü¶oõ¶oî¶oç¶oà¶oÙ¶oÒ¶o˶oĶo½¶o¶¶o¯¶o¨¶o¡¶oš¶o“¶oŒ¶o…¶o~¶ow¶op¶oi¶ob¶o[¶oT¶oM¶oF¶o?¶o8¶o1¶o*¶o#¶o¶o¶o¶o¶o¶oùµoòµoëµoäµoݵoÖµoϵoȵoÁµoºµo³µo¬µo¥µožµo—µoµo‰µo‚µo{µotµomµofµo_µoXµoQµoJµoCµo<µo5µo.µo'µo µoµoµo µoµoý´oö´oï´oè´oá´oÚ´oÓ´oÌ´oÅ´o¾´o·´o°´o©´o¢´o›´o”´o´o†´o´ox´oq´oj´oc´o\´oU´oN´oG´o@´o9´o2´o+´o$´o´o´o´o´o´oú³oó³oì³oå³oÞ³o׳oгoɳo³o»³o´³o­³o¦³oŸ³o˜³o‘³oгoƒ³o|³ou³on³og³o`³oY³oR³oK³oD³o=³o6³o/³o(³o!³o³o³o ³o³oþ²o÷²oð²oé²oâ²oÛ²oÔ²oͲoƲo¿²o¸²o±²oª²o£²oœ²o•²o޲o‡²o€²oy²or²ok²od²o]²oV²oO²oH²oA²o:²o3²o,²o%²o²o²o²o ²o²oû±oô±oí±oæ±oß±oرoѱoʱoño¼±oµ±o®±o§±o ±o™±o’±o‹±o„±o}±ov±oo±oh±oa±oZ±oS±oL±oE±o>±o7±o0±o)±o"±o±o±o ±o±oÿ°oø°oñ°oê°oã°oܰoÕ°oΰoǰoÀ°o¹°o²°o«°o¤°o°o–°o°oˆ°o°oz°os°ol°oe°o^°oW°oP°oI°oB°o;°o4°o-°o&°o°o°o°o °o°oü¯oõ¯oî¯oç¯oà¯oÙ¯oÒ¯o˯oįo½¯o¶¯o¯¯o¨¯o¡¯oš¯o“¯oŒ¯o…¯o~¯ow¯op¯oi¯ob¯o[¯oT¯oM¯oF¯o?¯o8¯o1¯o*¯o#¯o¯o¯o¯o¯o¯où®oò®oë®oä®oÝ®oÖ®oÏ®oÈ®oÁ®oº®o³®o¬®o¥®ož®o—®o®o‰®o‚®o{®ot®om®of®o_®oX®oQ®oJ®oC®o<®o5®o.®o'®o ®o®o®o ®o®oý­oö­oï­oè­oá­oÚ­oÓ­oÌ­oÅ­o¾­o·­o°­o©­o¢­o›­o”­o­o†­o­ox­oq­oj­oc­o\­oU­oN­oG­o@­o9­o2­o+­o$­o­o­o­o­o­oú¬oó¬oì¬oå¬oÞ¬o׬oЬoɬo¬o»¬o´¬o­¬o¦¬oŸ¬o˜¬o‘¬oЬoƒ¬o|¬ou¬on¬og¬o`¬oY¬oR¬oK¬oD¬o=¬o6¬o/¬o(¬o!¬o¬o¬o ¬o¬oþ«o÷«oð«oé«oâ«oÛ«oÔ«oÍ«oÆ«o¿«o¸«o±«oª«o£«oœ«o•«oŽ«o‡«o€«oy«or«ok«od«o]«oV«oO«oH«oA«o:«o3«o,«o%«o«o«o«o «o«oûªoôªoíªoæªoߪoتoѪoʪoêo¼ªoµªo®ªo§ªo ªo™ªo’ªo‹ªo„ªo}ªovªooªohªoaªoZªoSªoLªoEªo>ªo7ªo0ªo)ªo"ªoªoªo ªoªoÿ©oø©oñ©oê©oã©oÜ©oÕ©oΩoÇ©oÀ©o¹©o²©o«©o¤©o©o–©o©oˆ©o©oz©os©ol©oe©o^©oW©oP©oI©oB©o;©o4©o-©o&©o©o©o©o ©o©oü¨oõ¨oî¨oç¨oà¨oÙ¨oÒ¨o˨oĨo½¨o¶¨o¯¨o¨¨o¡¨oš¨o“¨oŒ¨o…¨o~¨ow¨op¨oi¨ob¨o[¨oT¨oM¨oF¨o?¨o8¨o1¨o*¨o#¨o¨o¨o¨o¨o¨où§oò§oë§oä§oݧoÖ§oϧoȧoÁ§oº§o³§o¬§o¥§ož§o—§o§o‰§o‚§o{§ot§om§of§o_§oX§oQ§oJ§oC§o<§o5§o.§o'§o §o§o§o §o§oý¦oö¦oï¦oè¦oá¦oÚ¦oÓ¦o̦oŦo¾¦o·¦o°¦o©¦o¢¦o›¦o”¦o¦o†¦o¦ox¦oq¦oj¦oc¦o\¦oU¦oN¦oG¦o@¦o9¦o2¦o+¦o$¦o¦o¦o¦o¦o¦oú¥oó¥oì¥oå¥oÞ¥o×¥oÐ¥oÉ¥oÂ¥o»¥o´¥o­¥o¦¥oŸ¥o˜¥o‘¥oŠ¥oƒ¥o|¥ou¥on¥og¥o`¥oY¥oR¥oK¥oD¥o=¥o6¥o/¥o(¥o!¥o¥o¥o ¥o¥oþ¤o÷¤oð¤oé¤oâ¤oÛ¤oÔ¤oͤoƤo¿¤o¸¤o±¤oª¤o£¤oœ¤o•¤oޤo‡¤o€¤oy¤or¤ok¤od¤o]¤oV¤oO¤oH¤oA¤o:¤o3¤o,¤o%¤o¤o¤o¤o ¤o¤oû£oô£oí£oæ£oߣoØ£oÑ£oÊ£oão¼£oµ£o®£o§£o £o™£o’£o‹£o„£o}£ov£oo£oh£oa£oZ£oS£oL£oE£o>£o7£o0£o)£o"£o£o£o £o£oÿ¢oø¢oñ¢oê¢oã¢oÜ¢oÕ¢o΢oÇ¢oÀ¢o¹¢o²¢o«¢o¤¢o¢o–¢o¢oˆ¢o¢oz¢os¢ol¢oe¢o^¢oW¢oP¢oI¢oB¢o;¢o4¢o-¢o&¢o¢o¢o¢o ¢o¢oü¡oõ¡oî¡oç¡oà¡oÙ¡oÒ¡oË¡oÄ¡o½¡o¶¡o¯¡o¨¡o¡¡oš¡o“¡oŒ¡o…¡o~¡ow¡op¡oi¡ob¡o[¡oT¡oM¡oF¡o?¡o8¡o1¡o*¡o#¡o¡o¡o¡o¡o¡où oò oë oä oÝ oÖ oÏ oÈ oÁ oº o³ o¬ o¥ ož o— o o‰ o‚ o{ ot om of o_ oX oQ oJ oC o< o5 o. o' o  o o o  o oýŸoöŸoïŸoèŸoáŸoÚŸoÓŸoÌŸoÅŸo¾Ÿo·Ÿo°Ÿo©Ÿo¢Ÿo›Ÿo”ŸoŸo†ŸoŸoxŸoqŸojŸocŸo\ŸoUŸoNŸoGŸo@Ÿo9Ÿo2Ÿo+Ÿo$ŸoŸoŸoŸoŸoŸoúžoóžoìžoåžoÞžoמoОoÉžožo»žo´žo­žo¦žoŸžo˜žo‘žoŠžoƒžo|žoužonžogžo`žoYžoRžoKžoDžo=žo6žo/žo(žo!žožožo žožoþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûœoôœoíœoæœoßœoØœoÑœoÊœoÜo¼œoµœo®œo§œo œo™œo’œo‹œo„œo}œovœooœohœoaœoZœoSœoLœoEœo>œo7œo0œo)œo"œoœoœo œoœoÿ›oø›oñ›oê›oã›oÜ›oÕ›oΛoÇ›oÀ›o¹›o²›o«›o¤›o›o–›o›oˆ›o›oz›os›ol›oe›o^›oW›oP›oI›oB›o;›o4›o-›o&›o›o›o›o ›o›oüšoõšoîšoçšoàšoÙšoÒšoËšoÄšo½šo¶šo¯šo¨šo¡šoššo“šoŒšo…šo~šowšopšoišobšo[šoTšoMšoFšo?šo8šo1šo*šo#šošošošošošoù™oò™oë™oä™oÝ™oÖ™oÏ™oÈ™oÁ™oº™o³™o¬™o¥™ož™o—™o™o‰™o‚™o{™ot™om™of™o_™oX™oQ™oJ™oC™o<™o5™o.™o'™o ™o™o™o ™o™oý˜oö˜oï˜oè˜oá˜oÚ˜oÓ˜o̘oŘo¾˜o·˜o°˜o©˜o¢˜o›˜o”˜o˜o†˜o˜ox˜oq˜oj˜oc˜o\˜oU˜oN˜oG˜o@˜o9˜o2˜o+˜o$˜o˜o˜o˜o˜o˜oú—oó—oì—oå—oÞ—o×—oЗoÉ—o—o»—o´—o­—o¦—oŸ—o˜—o‘—oŠ—oƒ—o|—ou—on—og—o`—oY—oR—oK—oD—o=—o6—o/—o(—o!—o—o—o —o—oþ–o÷–oð–oé–oâ–oÛ–oÔ–oÍ–oÆ–o¿–o¸–o±–oª–o£–oœ–o•–oŽ–o‡–o€–oy–or–ok–od–o]–oV–oO–oH–oA–o:–o3–o,–o%–o–o–o–o –o–oû•oô•oí•oæ•oß•oØ•oÑ•oÊ•oÕo¼•oµ•o®•o§•o •o™•o’•o‹•o„•o}•ov•oo•oh•oa•oZ•oS•oL•oE•o>•o7•o0•o)•o"•o•o•o •o•oÿ”oø”oñ”oê”oã”oÜ”oÕ”oΔoÇ”oÀ”o¹”o²”o«”o¤”o”o–”o”oˆ”o”oz”os”ol”oe”o^”oW”oP”oI”oB”o;”o4”o-”o&”o”o”o”o ”o”oü“oõ“oî“oç“oà“oÙ“oÒ“oË“oÄ“o½“o¶“o¯“o¨“o¡“oš“o““oŒ“o…“o~“ow“op“oi“ob“o[“oT“oM“oF“o?“o8“o1“o*“o#“o“o“o“o“o“où’oò’oë’oä’oÝ’oÖ’oÏ’oÈ’oÁ’oº’o³’o¬’o¥’ož’o—’o’o‰’o‚’o{’ot’om’of’o_’oX’oQ’oJ’oC’o<’o5’o.’o'’o ’o’o’o ’o’oý‘oö‘oï‘oè‘oá‘oÚ‘oÓ‘oÌ‘oÅ‘o¾‘o·‘o°‘o©‘o¢‘o›‘o”‘o‘o†‘o‘ox‘oq‘oj‘oc‘o\‘oU‘oN‘oG‘o@‘o9‘o2‘o+‘o$‘o‘o‘o‘o‘o‘oúoóoìoåoÞo×oÐoÉoÂo»o´o­o¦oŸo˜o‘oŠoƒo|ouonogo`oYoRoKoDo=o6o/o(o!ooo ooþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûŽoôŽoíŽoæŽoߎoØŽoÑŽoÊŽoÃŽo¼ŽoµŽo®Žo§Žo Žo™Žo’Žo‹Žo„Žo}ŽovŽooŽohŽoaŽoZŽoSŽoLŽoEŽo>Žo7Žo0Žo)Žo"ŽoŽoŽo ŽoŽoÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüŒoõŒoîŒoçŒoàŒoÙŒoÒŒoËŒoÄŒo½Œo¶Œo¯Œo¨Œo¡ŒošŒo“ŒoŒŒo…Œo~ŒowŒopŒoiŒobŒo[ŒoTŒoMŒoFŒo?Œo8Œo1Œo*Œo#ŒoŒoŒoŒoŒoŒoù‹oò‹oë‹oä‹oÝ‹oÖ‹oÏ‹oÈ‹oÁ‹oº‹o³‹o¬‹o¥‹ož‹o—‹o‹o‰‹o‚‹o{‹ot‹om‹of‹o_‹oX‹oQ‹oJ‹oC‹o<‹o5‹o.‹o'‹o ‹o‹o‹o ‹o‹oýŠoöŠoïŠoèŠoáŠoÚŠoÓŠoÌŠoÅŠo¾Šo·Šo°Šo©Šo¢Šo›Šo”ŠoŠo†ŠoŠoxŠoqŠojŠocŠo\ŠoUŠoNŠoGŠo@Šo9Šo2Šo+Šo$ŠoŠoŠoŠoŠoŠoú‰oó‰oì‰oå‰oÞ‰o׉oЉoɉo‰o»‰o´‰o­‰o¦‰oŸ‰o˜‰o‘‰oЉoƒ‰o|‰ou‰on‰og‰o`‰oY‰oR‰oK‰oD‰o=‰o6‰o/‰o(‰o!‰o‰o‰o ‰o‰oþˆo÷ˆoðˆoéˆoâˆoÛˆoÔˆo͈oƈo¿ˆo¸ˆo±ˆoªˆo£ˆoœˆo•ˆoŽˆo‡ˆo€ˆoyˆorˆokˆodˆo]ˆoVˆoOˆoHˆoAˆo:ˆo3ˆo,ˆo%ˆoˆoˆoˆo ˆoˆoû‡oô‡oí‡oæ‡o߇o؇oчoʇoÇo¼‡oµ‡o®‡o§‡o ‡o™‡o’‡o‹‡o„‡o}‡ov‡oo‡oh‡oa‡oZ‡oS‡oL‡oE‡o>‡o7‡o0‡o)‡o"‡o‡o‡o ‡o‡oÿ†oø†oñ†oê†oã†o܆oÕ†oΆodžoÀ†o¹†o²†o«†o¤†o†o–†o†oˆ†o†oz†os†ol†oe†o^†oW†oP†oI†oB†o;†o4†o-†o&†o†o†o†o †o†oü…oõ…oî…oç…oà…oÙ…oÒ…oË…oÄ…o½…o¶…o¯…o¨…o¡…oš…o“…oŒ…o……o~…ow…op…oi…ob…o[…oT…oM…oF…o?…o8…o1…o*…o#…o…o…o…o…o…où„oò„oë„oä„oÝ„oÖ„oÏ„oÈ„oÁ„oº„o³„o¬„o¥„ož„o—„o„o‰„o‚„o{„ot„om„of„o_„oX„oQ„oJ„oC„o<„o5„o.„o'„o „o„o„o „o„oýƒoöƒoïƒoèƒoáƒoÚƒoÓƒõoŃo¾ƒo·ƒo°ƒo©ƒo¢ƒo›ƒo”ƒoƒo†ƒoƒoxƒoqƒojƒocƒo\ƒoUƒoNƒoGƒo@ƒo9ƒo2ƒo+ƒo$ƒoƒoƒoƒoƒoƒoú‚oó‚oì‚oå‚oÞ‚oׂoЂoÉ‚o‚o»‚o´‚o­‚o¦‚oŸ‚o˜‚o‘‚oŠ‚oƒ‚o|‚ou‚on‚og‚o`‚oY‚oR‚oK‚oD‚o=‚o6‚o/‚o(‚o!‚o‚o‚o ‚o‚oþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooû€oô€oí€oæ€o߀oØ€oÑ€oÊ€oÀo¼€oµ€o®€o§€o €o™€o’€o‹€o„€o}€ov€oo€oh€oa€oZ€oS€oL€oE€o>€o7€o0€o)€o"€o€o€o €o€oÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooü~oõ~oî~oç~oà~oÙ~oÒ~oË~oÄ~o½~o¶~o¯~o¨~o¡~oš~o“~oŒ~o…~o~~ow~op~oi~ob~o[~oT~oM~oF~o?~o8~o1~o*~o#~o~o~o~o~o~où}oò}oë}oä}oÝ}oÖ}oÏ}oÈ}oÁ}oº}o³}o¬}o¥}ož}o—}o}o‰}o‚}o{}ot}om}of}o_}oX}oQ}oJ}oC}o<}o5}o.}o'}o }o}o}o }o}oý|oö|oï|oè|oá|oÚ|oÓ|oÌ|oÅ|o¾|o·|o°|o©|o¢|o›|o”|o|o†|o|ox|oq|oj|oc|o\|oU|oN|oG|o@|o9|o2|o+|o$|o|o|o|o|o|oú{oó{oì{oå{oÞ{o×{oÐ{oÉ{oÂ{o»{o´{o­{o¦{oŸ{o˜{o‘{oŠ{oƒ{o|{ou{on{og{o`{oY{oR{oK{oD{o={o6{o/{o({o!{o{o{o {o{oþzo÷zoðzoézoâzoÛzoÔzoÍzoÆzo¿zo¸zo±zoªzo£zoœzo•zoŽzo‡zo€zoyzorzokzodzo]zoVzoOzoHzoAzo:zo3zo,zo%zozozozo zozoûyoôyoíyoæyoßyoØyoÑyoÊyoÃyo¼yoµyo®yo§yo yo™yo’yo‹yo„yo}yovyooyohyoayoZyoSyoLyoEyo>yo7yo0yo)yo"yoyoyo yoyoÿxoøxoñxoêxoãxoÜxoÕxoÎxoÇxoÀxo¹xo²xo«xo¤xoxo–xoxoˆxoxozxosxolxoexo^xoWxoPxoIxoBxo;xo4xo-xo&xoxoxoxo xoxoüwoõwoîwoçwoàwoÙwoÒwoËwoÄwo½wo¶wo¯wo¨wo¡wošwo“woŒwo…wo~wowwopwoiwobwo[woTwoMwoFwo?wo8wo1wo*wo#wowowowowowoùvoòvoëvoävoÝvoÖvoÏvoÈvoÁvoºvo³vo¬vo¥vožvo—vovo‰vo‚vo{votvomvofvo_voXvoQvoJvoCvoro7ro0ro)ro"rororo roroÿqoøqoñqoêqoãqoÜqoÕqoÎqoÇqoÀqo¹qo²qo«qo¤qoqo–qoqoˆqoqozqosqolqoeqo^qoWqoPqoIqoBqo;qo4qo-qo&qoqoqoqo qoqoüpoõpoîpoçpoàpoÙpoÒpoËpoÄpo½po¶po¯po¨po¡pošpo“poŒpo…po~powpoppoipobpo[poTpoMpoFpo?po8po1po*po#popopopopopoùooòooëooäooÝooÖooÏooÈooÁooºoo³oo¬oo¥oožoo—oooo‰oo‚oo{ootoomoofoo_ooXooQooJooCooko7ko0ko)ko"kokoko kokoÿjoøjoñjoêjoãjoÜjoÕjoÎjoÇjoÀjo¹jo²jo«jo¤jojo–jojoˆjojozjosjoljoejo^joWjoPjoIjoBjo;jo4jo-jo&jojojojo jojoüioõioîioçioàioÙioÒioËioÄio½io¶io¯io¨io¡iošio“ioŒio…io~iowiopioiiobio[ioTioMioFio?io8io1io*io#ioioioioioioùhoòhoëhoähoÝhoÖhoÏhoÈhoÁhoºho³ho¬ho¥hožho—hoho‰ho‚ho{hothomhofho_hoXhoQhoJhoChodo7do0do)do"dododo dodoÿcoøcoñcoêcoãcoÜcoÕcoÎcoÇcoÀco¹co²co«co¤coco–cocoˆcocozcoscolcoeco^coWcoPcoIcoBco;co4co-co&cocococo cocoüboõboîboçboàboÙboÒboËboÄbo½bo¶bo¯bo¨bo¡bošbo“boŒbo…bo~bowbopboibobbo[boTboMboFbo?bo8bo1bo*bo#boboboboboboùaoòaoëaoäaoÝaoÖaoÏaoÈaoÁaoºao³ao¬ao¥aožao—aoao‰ao‚ao{aotaomaofao_aoXaoQaoJaoCao]o7]o0]o)]o"]o]o]o ]o]oÿ\oø\oñ\oê\oã\oÜ\oÕ\oÎ\oÇ\oÀ\o¹\o²\o«\o¤\o\o–\o\oˆ\o\oz\os\ol\oe\o^\oW\oP\oI\oB\o;\o4\o-\o&\o\o\o\o \o\oü[oõ[oî[oç[oà[oÙ[oÒ[oË[oÄ[o½[o¶[o¯[o¨[o¡[oš[o“[oŒ[o…[o~[ow[op[oi[ob[o[[oT[oM[oF[o?[o8[o1[o*[o#[o[o[o[o[o[oùZoòZoëZoäZoÝZoÖZoÏZoÈZoÁZoºZo³Zo¬Zo¥ZožZo—ZoZo‰Zo‚Zo{ZotZomZofZo_ZoXZoQZoJZoCZoVo7Vo0Vo)Vo"VoVoVo VoVoÿUoøUoñUoêUoãUoÜUoÕUoÎUoÇUoÀUo¹Uo²Uo«Uo¤UoUo–UoUoˆUoUozUosUolUoeUo^UoWUoPUoIUoBUo;Uo4Uo-Uo&UoUoUoUo UoUoüToõToîToçToàToÙToÒToËToÄTo½To¶To¯To¨To¡TošTo“ToŒTo…To~TowTopToiTobTo[ToTToMToFTo?To8To1To*To#ToToToToToToùSoòSoëSoäSoÝSoÖSoÏSoÈSoÁSoºSo³So¬So¥SožSo—SoSo‰So‚So{SotSomSofSo_SoXSoQSoJSoCSoOo7Oo0Oo)Oo"OoOoOo OoOoÿNoøNoñNoêNoãNoÜNoÕNoÎNoÇNoÀNo¹No²No«No¤NoNo–NoNoˆNoNozNosNolNoeNo^NoWNoPNoINoBNo;No4No-No&NoNoNoNo NoNoüMoõMoîMoçMoàMoÙMoÒMoËMoÄMo½Mo¶Mo¯Mo¨Mo¡MošMo“MoŒMo…Mo~MowMopMoiMobMo[MoTMoMMoFMo?Mo8Mo1Mo*Mo#MoMoMoMoMoMoùLoòLoëLoäLoÝLoÖLoÏLoÈLoÁLoºLo³Lo¬Lo¥LožLo—LoLo‰Lo‚Lo{LotLomLofLo_LoXLoQLoJLoCLoHo7Ho0Ho)Ho"HoHoHo HoHoÿGoøGoñGoêGoãGoÜGoÕGoÎGoÇGoÀGo¹Go²Go«Go¤GoGo–GoGoˆGoGozGosGolGoeGo^GoWGoPGoIGoBGo;Go4Go-Go&GoGoGoGo GoGoüFoõFoîFoçFoàFoÙFoÒFoËFoÄFo½Fo¶Fo¯Fo¨Fo¡FošFo“FoŒFo…Fo~FowFopFoiFobFo[FoTFoMFoFFo?Fo8Fo1Fo*Fo#FoFoFoFoFoFoùEoòEoëEoäEoÝEoÖEoÏEoÈEoÁEoºEo³Eo¬Eo¥EožEo—EoEo‰Eo‚Eo{EotEomEofEo_EoXEoQEoJEoCEoAo7Ao0Ao)Ao"AoAoAo AoAoÿ@oø@oñ@oê@oã@oÜ@oÕ@oÎ@oÇ@oÀ@o¹@o²@o«@o¤@o@o–@o@oˆ@o@oz@os@ol@oe@o^@oW@oP@oI@oB@o;@o4@o-@o&@o@o@o@o @o@oü?oõ?oî?oç?oà?oÙ?oÒ?oË?oÄ?o½?o¶?o¯?o¨?o¡?oš?o“?oŒ?o…?o~?ow?op?oi?ob?o[?oT?oM?oF?o??o8?o1?o*?o#?o?o?o?o?o?où>oò>oë>oä>oÝ>oÖ>oÏ>oÈ>oÁ>oº>o³>o¬>o¥>ož>o—>o>o‰>o‚>o{>ot>om>of>o_>oX>oQ>oJ>oC>o<>o5>o.>o'>o >o>o>o >o>oý=oö=oï=oè=oá=oÚ=oÓ=oÌ=oÅ=o¾=o·=o°=o©=o¢=o›=o”=o=o†=o=ox=oq=oj=oc=o\=oU=oN=oG=o@=o9=o2=o+=o$=o=o=o=o=o=oú:o7:o0:o):o":o:o:o :o:oÿ9oø9oñ9oê9oã9oÜ9oÕ9oÎ9oÇ9oÀ9o¹9o²9o«9o¤9o9o–9o9oˆ9o9oz9os9ol9oe9o^9oW9oP9oI9oB9o;9o49o-9o&9o9o9o9o 9o9oü8oõ8oî8oç8oà8oÙ8oÒ8oË8oÄ8o½8o¶8o¯8o¨8o¡8oš8o“8oŒ8o…8o~8ow8op8oi8ob8o[8oT8oM8oF8o?8o88o18o*8o#8o8o8o8o8o8où7oò7oë7oä7oÝ7oÖ7oÏ7oÈ7oÁ7oº7o³7o¬7o¥7ož7o—7o7o‰7o‚7o{7ot7om7of7o_7oX7oQ7oJ7oC7o<7o57o.7o'7o 7o7o7o 7o7oý6oö6oï6oè6oá6oÚ6oÓ6oÌ6oÅ6o¾6o·6o°6o©6o¢6o›6o”6o6o†6o6ox6oq6oj6oc6o\6oU6oN6oG6o@6o96o26o+6o$6o6o6o6o6o6oú5oó5oì5oå5oÞ5o×5oÐ5oÉ5oÂ5o»5o´5o­5o¦5oŸ5o˜5o‘5oŠ5oƒ5o|5ou5on5og5o`5oY5oR5oK5oD5o=5o65o/5o(5o!5o5o5o 5o5oþ4o÷4oð4oé4oâ4oÛ4oÔ4oÍ4oÆ4o¿4o¸4o±4oª4o£4oœ4o•4oŽ4o‡4o€4oy4or4ok4od4o]4oV4oO4oH4oA4o:4o34o,4o%4o4o4o4o 4o4oû3oô3oí3oæ3oß3oØ3oÑ3oÊ3oÃ3o¼3oµ3o®3o§3o 3o™3o’3o‹3o„3o}3ov3oo3oh3oa3oZ3oS3oL3oE3o>3o73o03o)3o"3o3o3o 3o3oÿ2oø2oñ2oê2oã2oÜ2oÕ2oÎ2oÇ2oÀ2o¹2o²2o«2o¤2o2o–2o2oˆ2o2oz2os2ol2oe2o^2oW2oP2oI2oB2o;2o42o-2o&2o2o2o2o 2o2oü1oõ1oî1oç1oà1oÙ1oÒ1oË1oÄ1o½1o¶1o¯1o¨1o¡1oš1o“1oŒ1o…1o~1ow1op1oi1ob1o[1oT1oM1oF1o?1o81o11o*1o#1o1o1o1o1o1où0oò0oë0oä0oÝ0oÖ0oÏ0oÈ0oÁ0oº0o³0o¬0o¥0ož0o—0o0o‰0o‚0o{0ot0om0of0o_0oX0oQ0oJ0oC0o<0o50o.0o'0o 0o0o0o 0o0oý/oö/oï/oè/oá/oÚ/oÓ/oÌ/oÅ/o¾/o·/o°/o©/o¢/o›/o”/o/o†/o/ox/oq/oj/oc/o\/oU/oN/oG/o@/o9/o2/o+/o$/o/o/o/o/o/oú.oó.oì.oå.oÞ.o×.oÐ.oÉ.oÂ.o».o´.o­.o¦.oŸ.o˜.o‘.oŠ.oƒ.o|.ou.on.og.o`.oY.oR.oK.oD.o=.o6.o/.o(.o!.o.o.o .o.oþ-o÷-oð-oé-oâ-oÛ-oÔ-oÍ-oÆ-o¿-o¸-o±-oª-o£-oœ-o•-oŽ-o‡-o€-oy-or-ok-od-o]-oV-oO-oH-oA-o:-o3-o,-o%-o-o-o-o -o-oû,oô,oí,oæ,oß,oØ,oÑ,oÊ,oÃ,o¼,oµ,o®,o§,o ,o™,o’,o‹,o„,o},ov,oo,oh,oa,oZ,oS,oL,oE,o>,o7,o0,o),o",o,o,o ,o,oÿ+oø+oñ+oê+oã+oÜ+oÕ+oÎ+oÇ+oÀ+o¹+o²+o«+o¤+o+o–+o+oˆ+o+oz+os+ol+oe+o^+oW+oP+oI+oB+o;+o4+o-+o&+o+o+o+o +o+oü*oõ*oî*oç*oà*oÙ*oÒ*oË*oÄ*o½*o¶*o¯*o¨*o¡*oš*o“*oŒ*o…*o~*ow*op*oi*ob*o[*oT*oM*oF*o?*o8*o1*o**o#*o*o*o*o*o*où)oò)oë)oä)oÝ)oÖ)oÏ)oÈ)oÁ)oº)o³)o¬)o¥)ož)o—)o)o‰)o‚)o{)ot)om)of)o_)oX)oQ)oJ)oC)o<)o5)o.)o')o )o)o)o )o)oý(oö(oï(oè(oá(oÚ(oÓ(oÌ(oÅ(o¾(o·(o°(o©(o¢(o›(o”(o(o†(o(ox(oq(oj(oc(o\(oU(oN(oG(o@(o9(o2(o+(o$(o(o(o(o(o(oú'oó'oì'oå'oÞ'o×'oÐ'oÉ'oÂ'o»'o´'o­'o¦'oŸ'o˜'o‘'oŠ'oƒ'o|'ou'on'og'o`'oY'oR'oK'oD'o='o6'o/'o('o!'o'o'o 'o'oþ&o÷&oð&oé&oâ&oÛ&oÔ&oÍ&oÆ&o¿&o¸&o±&oª&o£&oœ&o•&oŽ&o‡&o€&oy&or&ok&od&o]&oV&oO&oH&oA&o:&o3&o,&o%&o&o&o&o &o&oû%oô%oí%oæ%oß%oØ%oÑ%oÊ%oÃ%o¼%oµ%o®%o§%o %o™%o’%o‹%o„%o}%ov%oo%oh%oa%oZ%oS%oL%oE%o>%o7%o0%o)%o"%o%o%o %o%oÿ$oø$oñ$oê$oã$oÜ$oÕ$oÎ$oÇ$oÀ$o¹$o²$o«$o¤$o$o–$o$oˆ$o$oz$os$ol$oe$o^$oW$oP$oI$oB$o;$o4$o-$o&$o$o$o$o $o$oü#oõ#oî#oç#oà#oÙ#oÒ#oË#oÄ#o½#o¶#o¯#o¨#o¡#oš#o“#oŒ#o…#o~#ow#op#oi#ob#o[#oT#oM#oF#o?#o8#o1#o*#o##o#o#o#o#o#où"oò"oë"oä"oÝ"oÖ"oÏ"oÈ"oÁ"oº"o³"o¬"o¥"ož"o—"o"o‰"o‚"o{"ot"om"of"o_"oX"oQ"oJ"oC"o<"o5"o."o'"o "o"o"o "o"oý!oö!oï!oè!oá!oÚ!oÓ!oÌ!oÅ!o¾!o·!o°!o©!o¢!o›!o”!o!o†!o!ox!oq!oj!oc!o\!oU!oN!oG!o@!o9!o2!o+!o$!o!o!o!o!o!oú oó oì oå oÞ o× oÐ oÉ o o» o´ o­ o¦ oŸ o˜ o‘ oŠ oƒ o| ou on og o` oY oR oK oD o= o6 o/ o( o! o o o o oþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûoôoíoæoßoØoÑoÊoÃo¼oµo®o§o o™o’o‹o„o}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCo<o5o.o'o ooo ooýoöoïoèoáoÚoÓoÌoÅo¾o·o°o©o¢o›o”oo†ooxoqojoco\oUoNoGo@o9o2o+o$ooooooúoóoìoåoÞo×oÐoÉoÂo»o´o­o¦oŸo˜o‘oŠoƒo|ouonogo`oYoRoKoDo=o6o/o(o!ooo ooþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûoôoíoæoßoØoÑoÊoÃo¼oµo®o§o o™o’o‹o„o}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCo<o5o.o'o ooo ooýoöoïoèoáoÚoÓoÌoÅo¾o·o°o©o¢o›o”oo†ooxoqojoco\oUoNoGo@o9o2o+o$ooooooúoóoìoåoÞo×oÐoÉoÂo»o´o­o¦oŸo˜o‘oŠoƒo|ouonogo`oYoRoKoDo=o6o/o(o!ooo ooþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûoôoíoæoßoØoÑoÊoÃo¼oµo®o§o o™o’o‹o„o}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooù oò oë oä oÝ oÖ oÏ oÈ oÁ oº o³ o¬ o¥ ož o— o o‰ o‚ o{ ot om of o_ oX oQ oJ oC o< o5 o. o' o o o o o oý oö oï oè oá oÚ oÓ oÌ oÅ o¾ o· o° o© o¢ o› o” o o† o ox oq oj oc o\ oU oN oG o@ o9 o2 o+ o$ o o o o o oú oó oì oå oÞ o× oÐ oÉ o o» o´ o­ o¦ oŸ o˜ o‘ oŠ oƒ o| ou on og o` oY oR oK oD o= o6 o/ o( o! o o o o oþ o÷ oð oé oâ oÛ oÔ oÍ oÆ o¿ o¸ o± oª o£ oœ o• oŽ o‡ o€ oy or ok od o] oV oO oH oA o: o3 o, o% o o o o o oû oô oí oæ oß oØ oÑ oÊ oà o¼ oµ o® o§ o  o™ o’ o‹ o„ o} ov oo oh oa oZ oS oL oE o> o7 o0 o) o" o o o o oÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCo<o5o.o'o ooo ooýoöoïoèoáoÚoÓoÌoÅo¾o·o°o©o¢o›o”oo†ooxoqojoco\oUoNoGo@o9o2o+o$ooooooúoóoìoåoÞo×oÐoÉoÂo»o´o­o¦oŸo˜o‘oŠoƒo|ouonogo`oYoRoKoDo=o6o/o(o!ooo ooþo÷oðoéoâoÛoÔoÍoÆo¿o¸o±oªo£oœo•oŽo‡o€oyorokodo]oVoOoHoAo:o3o,o%oooo ooûoôoíoæoßoØoÑoÊoÃo¼oµo®o§o o™o’o‹o„o}ovooohoaoZoSoLoEo>o7o0o)o"ooo ooÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùÿnòÿnëÿnäÿnÝÿnÖÿnÏÿnÈÿnÁÿnºÿn³ÿn¬ÿn¥ÿnžÿn—ÿnÿn‰ÿn‚ÿn{ÿntÿnmÿnfÿn_ÿnXÿnQÿnJÿnCÿn<ÿn5ÿn.ÿn'ÿn ÿnÿnÿn ÿnÿnýþnöþnïþnèþnáþnÚþnÓþnÌþnÅþn¾þn·þn°þn©þn¢þn›þn”þnþn†þnþnxþnqþnjþncþn\þnUþnNþnGþn@þn9þn2þn+þn$þnþnþnþnþnþnúýnóýnìýnåýnÞýn×ýnÐýnÉýnÂýn»ýn´ýn­ýn¦ýnŸýn˜ýn‘ýnŠýnƒýn|ýnuýnnýngýn`ýnYýnRýnKýnDýn=ýn6ýn/ýn(ýn!ýnýnýn ýnýnþün÷ünðünéünâünÛünÔünÍünÆün¿ün¸ün±ünªün£ünœün•ünŽün‡ün€ünyünrünkündün]ünVünOünHünAün:ün3ün,ün%ünününün ününûûnôûníûnæûnßûnØûnÑûnÊûnÃûn¼ûnµûn®ûn§ûn ûn™ûn’ûn‹ûn„ûn}ûnvûnoûnhûnaûnZûnSûnLûnEûn>ûn7ûn0ûn)ûn"ûnûnûn ûnûnÿúnøúnñúnêúnãúnÜúnÕúnÎúnÇúnÀún¹ún²ún«ún¤únún–únúnˆúnúnzúnsúnlúneún^únWúnPúnIúnBún;ún4ún-ún&únúnúnún únúnüùnõùnîùnçùnàùnÙùnÒùnËùnÄùn½ùn¶ùn¯ùn¨ùn¡ùnšùn“ùnŒùn…ùn~ùnwùnpùniùnbùn[ùnTùnMùnFùn?ùn8ùn1ùn*ùn#ùnùnùnùnùnùnùønòønëønäønÝønÖønÏønÈønÁønºøn³øn¬øn¥ønžøn—ønøn‰øn‚øn{øntønmønføn_ønXønQønJønCøn<øn5øn.øn'øn ønønøn ønøný÷nö÷nï÷nè÷ná÷nÚ÷nÓ÷nÌ÷nÅ÷n¾÷n·÷n°÷n©÷n¢÷n›÷n”÷n÷n†÷n÷nx÷nq÷nj÷nc÷n\÷nU÷nN÷nG÷n@÷n9÷n2÷n+÷n$÷n÷n÷n÷n÷n÷núönóönìönåönÞön×önÐönÉönÂön»ön´ön­ön¦önŸön˜ön‘önŠönƒön|önuönnöngön`önYönRönKönDön=ön6ön/ön(ön!önönön önönþõn÷õnðõnéõnâõnÛõnÔõnÍõnÆõn¿õn¸õn±õnªõn£õnœõn•õnŽõn‡õn€õnyõnrõnkõndõn]õnVõnOõnHõnAõn:õn3õn,õn%õnõnõnõn õnõnûônôôníônæônßônØônÑônÊônÃôn¼ônµôn®ôn§ôn ôn™ôn’ôn‹ôn„ôn}ônvônoônhônaônZônSônLônEôn>ôn7ôn0ôn)ôn"ônônôn ônônÿónøónñónêónãónÜónÕónÎónÇónÀón¹ón²ón«ón¤ónón–ónónˆónónzónsónlóneón^ónWónPónIónBón;ón4ón-ón&ónónónón ónónüònõònîònçònàònÙònÒònËònÄòn½òn¶òn¯òn¨òn¡ònšòn“ònŒòn…òn~ònwònpòniònbòn[ònTònMònFòn?òn8òn1òn*òn#ònònònònònònùñnòñnëñnäñnÝñnÖñnÏñnÈñnÁñnºñn³ñn¬ñn¥ñnžñn—ñnñn‰ñn‚ñn{ñntñnmñnfñn_ñnXñnQñnJñnCñn<ñn5ñn.ñn'ñn ñnñnñn ñnñnýðnöðnïðnèðnáðnÚðnÓðnÌðnÅðn¾ðn·ðn°ðn©ðn¢ðn›ðn”ðnðn†ðnðnxðnqðnjðncðn\ðnUðnNðnGðn@ðn9ðn2ðn+ðn$ðnðnðnðnðnðnúïnóïnìïnåïnÞïn×ïnÐïnÉïnÂïn»ïn´ïn­ïn¦ïnŸïn˜ïn‘ïnŠïnƒïn|ïnuïnnïngïn`ïnYïnRïnKïnDïn=ïn6ïn/ïn(ïn!ïnïnïn ïnïnþîn÷înðînéînâînÛînÔînÍînÆîn¿în¸în±înªîn£înœîn•înŽîn‡în€înyînrînkîndîn]înVînOînHînAîn:în3în,în%înînînîn înînûínôíníínæínßínØínÑínÊínÃín¼ínµín®ín§ín ín™ín’ín‹ín„ín}ínvínoínhínaínZínSínLínEín>ín7ín0ín)ín"ínínín ínínÿìnøìnñìnêìnãìnÜìnÕìnÎìnÇìnÀìn¹ìn²ìn«ìn¤ìnìn–ìnìnˆìnìnzìnsìnlìneìn^ìnWìnPìnIìnBìn;ìn4ìn-ìn&ìnìnìnìn ìnìnüënõënîënçënàënÙënÒënËënÄën½ën¶ën¯ën¨ën¡ënšën“ënŒën…ën~ënwënpëniënbën[ënTënMënFën?ën8ën1ën*ën#ënënënënënënùênòênëênäênÝênÖênÏênÈênÁênºên³ên¬ên¥ênžên—ênên‰ên‚ên{êntênmênfên_ênXênQênJênCên<ên5ên.ên'ên ênênên ênênýénöénïénèénáénÚénÓénÌénÅén¾én·én°én©én¢én›én”énén†énénxénqénjéncén\énUénNénGén@én9én2én+én$énénénénénénúènóènìènåènÞèn×ènÐènÉènÂèn»èn´èn­èn¦ènŸèn˜èn‘ènŠènƒèn|ènuènnèngèn`ènYènRènKènDèn=èn6èn/èn(èn!ènènèn ènènþçn÷çnðçnéçnâçnÛçnÔçnÍçnÆçn¿çn¸çn±çnªçn£çnœçn•çnŽçn‡çn€çnyçnrçnkçndçn]çnVçnOçnHçnAçn:çn3çn,çn%çnçnçnçn çnçnûænôæníænæænßænØænÑænÊænÃæn¼ænµæn®æn§æn æn™æn’æn‹æn„æn}ænvænoænhænaænZænSænLænEæn>æn7æn0æn)æn"ænænæn ænænÿånøånñånêånãånÜånÕånÎånÇånÀån¹ån²ån«ån¤ånån–ånånˆånånzånsånlåneån^ånWånPånIånBån;ån4ån-ån&ånånånån ånånüänõänîänçänàänÙänÒänËänÄän½än¶än¯än¨än¡änšän“änŒän…än~änwänpäniänbän[änTänMänFän?än8än1än*än#änänänänänänùãnòãnëãnäãnÝãnÖãnÏãnÈãnÁãnºãn³ãn¬ãn¥ãnžãn—ãnãn‰ãn‚ãn{ãntãnmãnfãn_ãnXãnQãnJãnCãn<ãn5ãn.ãn'ãn ãnãnãn ãnãnýânöânïânèânáânÚânÓânÌânÅân¾ân·ân°ân©ân¢ân›ân”ânân†ânânxânqânjâncân\ânUânNânGân@ân9ân2ân+ân$ânânânânânânúánóánìánåánÞán×ánÐánÉánÂán»án´án­án¦ánŸán˜án‘ánŠánƒán|ánuánnángán`ánYánRánKánDán=án6án/án(án!ánánán ánánþàn÷ànðànéànâànÛànÔànÍànÆàn¿àn¸àn±ànªàn£ànœàn•ànŽàn‡àn€ànyànrànkàndàn]ànVànOànHànAàn:àn3àn,àn%ànànànàn ànànûßnôßníßnæßnßßnØßnÑßnÊßnÃßn¼ßnµßn®ßn§ßn ßn™ßn’ßn‹ßn„ßn}ßnvßnoßnhßnaßnZßnSßnLßnEßn>ßn7ßn0ßn)ßn"ßnßnßn ßnßnÿÞnøÞnñÞnêÞnãÞnÜÞnÕÞnÎÞnÇÞnÀÞn¹Þn²Þn«Þn¤ÞnÞn–ÞnÞnˆÞnÞnzÞnsÞnlÞneÞn^ÞnWÞnPÞnIÞnBÞn;Þn4Þn-Þn&ÞnÞnÞnÞn ÞnÞnüÝnõÝnîÝnçÝnàÝnÙÝnÒÝnËÝnÄÝn½Ýn¶Ýn¯Ýn¨Ýn¡ÝnšÝn“ÝnŒÝn…Ýn~ÝnwÝnpÝniÝnbÝn[ÝnTÝnMÝnFÝn?Ýn8Ýn1Ýn*Ýn#ÝnÝnÝnÝnÝnÝnùÜnòÜnëÜnäÜnÝÜnÖÜnÏÜnÈÜnÁÜnºÜn³Ün¬Ün¥ÜnžÜn—ÜnÜn‰Ün‚Ün{ÜntÜnmÜnfÜn_ÜnXÜnQÜnJÜnCÜn<Ün5Ün.Ün'Ün ÜnÜnÜn ÜnÜnýÛnöÛnïÛnèÛnáÛnÚÛnÓÛnÌÛnÅÛn¾Ûn·Ûn°Ûn©Ûn¢Ûn›Ûn”ÛnÛn†ÛnÛnxÛnqÛnjÛncÛn\ÛnUÛnNÛnGÛn@Ûn9Ûn2Ûn+Ûn$ÛnÛnÛnÛnÛnÛnúÚnóÚnìÚnåÚnÞÚn×ÚnÐÚnÉÚnÂÚn»Ún´Ún­Ún¦ÚnŸÚn˜Ún‘ÚnŠÚnƒÚn|ÚnuÚnnÚngÚn`ÚnYÚnRÚnKÚnDÚn=Ún6Ún/Ún(Ún!ÚnÚnÚn ÚnÚnþÙn÷ÙnðÙnéÙnâÙnÛÙnÔÙnÍÙnÆÙn¿Ùn¸Ùn±ÙnªÙn£ÙnœÙn•ÙnŽÙn‡Ùn€ÙnyÙnrÙnkÙndÙn]ÙnVÙnOÙnHÙnAÙn:Ùn3Ùn,Ùn%ÙnÙnÙnÙn ÙnÙnûØnôØníØnæØnߨnØØnÑØnÊØnÃØn¼ØnµØn®Øn§Øn Øn™Øn’Øn‹Øn„Øn}ØnvØnoØnhØnaØnZØnSØnLØnEØn>Øn7Øn0Øn)Øn"ØnØnØn ØnØnÿ×nø×nñ×nê×nã×nÜ×nÕ×nÎ×nÇ×nÀ×n¹×n²×n«×n¤×n×n–×n×nˆ×n×nz×ns×nl×ne×n^×nW×nP×nI×nB×n;×n4×n-×n&×n×n×n×n ×n×nüÖnõÖnîÖnçÖnàÖnÙÖnÒÖnËÖnÄÖn½Ön¶Ön¯Ön¨Ön¡ÖnšÖn“ÖnŒÖn…Ön~ÖnwÖnpÖniÖnbÖn[ÖnTÖnMÖnFÖn?Ön8Ön1Ön*Ön#ÖnÖnÖnÖnÖnÖnùÕnòÕnëÕnäÕnÝÕnÖÕnÏÕnÈÕnÁÕnºÕn³Õn¬Õn¥ÕnžÕn—ÕnÕn‰Õn‚Õn{ÕntÕnmÕnfÕn_ÕnXÕnQÕnJÕnCÕn<Õn5Õn.Õn'Õn ÕnÕnÕn ÕnÕnýÔnöÔnïÔnèÔnáÔnÚÔnÓÔnÌÔnÅÔn¾Ôn·Ôn°Ôn©Ôn¢Ôn›Ôn”ÔnÔn†ÔnÔnxÔnqÔnjÔncÔn\ÔnUÔnNÔnGÔn@Ôn9Ôn2Ôn+Ôn$ÔnÔnÔnÔnÔnÔnúÓnóÓnìÓnåÓnÞÓn×ÓnÐÓnÉÓnÂÓn»Ón´Ón­Ón¦ÓnŸÓn˜Ón‘ÓnŠÓnƒÓn|ÓnuÓnnÓngÓn`ÓnYÓnRÓnKÓnDÓn=Ón6Ón/Ón(Ón!ÓnÓnÓn ÓnÓnþÒn÷ÒnðÒnéÒnâÒnÛÒnÔÒnÍÒnÆÒn¿Òn¸Òn±ÒnªÒn£ÒnœÒn•ÒnŽÒn‡Òn€ÒnyÒnrÒnkÒndÒn]ÒnVÒnOÒnHÒnAÒn:Òn3Òn,Òn%ÒnÒnÒnÒn ÒnÒnûÑnôÑníÑnæÑnßÑnØÑnÑÑnÊÑnÃÑn¼ÑnµÑn®Ñn§Ñn Ñn™Ñn’Ñn‹Ñn„Ñn}ÑnvÑnoÑnhÑnaÑnZÑnSÑnLÑnEÑn>Ñn7Ñn0Ñn)Ñn"ÑnÑnÑn ÑnÑnÿÐnøÐnñÐnêÐnãÐnÜÐnÕÐnÎÐnÇÐnÀÐn¹Ðn²Ðn«Ðn¤ÐnÐn–ÐnÐnˆÐnÐnzÐnsÐnlÐneÐn^ÐnWÐnPÐnIÐnBÐn;Ðn4Ðn-Ðn&ÐnÐnÐnÐn ÐnÐnüÏnõÏnîÏnçÏnàÏnÙÏnÒÏnËÏnÄÏn½Ïn¶Ïn¯Ïn¨Ïn¡ÏnšÏn“ÏnŒÏn…Ïn~ÏnwÏnpÏniÏnbÏn[ÏnTÏnMÏnFÏn?Ïn8Ïn1Ïn*Ïn#ÏnÏnÏnÏnÏnÏnùÎnòÎnëÎnäÎnÝÎnÖÎnÏÎnÈÎnÁÎnºÎn³În¬În¥ÎnžÎn—ÎnÎn‰În‚În{ÎntÎnmÎnfÎn_ÎnXÎnQÎnJÎnCÎn<În5În.În'În ÎnÎnÎn ÎnÎnýÍnöÍnïÍnèÍnáÍnÚÍnÓÍnÌÍnÅÍn¾Ín·Ín°Ín©Ín¢Ín›Ín”ÍnÍn†ÍnÍnxÍnqÍnjÍncÍn\ÍnUÍnNÍnGÍn@Ín9Ín2Ín+Ín$ÍnÍnÍnÍnÍnÍnúÌnóÌnìÌnåÌnÞÌn×ÌnÐÌnÉÌnÂÌn»Ìn´Ìn­Ìn¦ÌnŸÌn˜Ìn‘ÌnŠÌnƒÌn|ÌnuÌnnÌngÌn`ÌnYÌnRÌnKÌnDÌn=Ìn6Ìn/Ìn(Ìn!ÌnÌnÌn ÌnÌnþËn÷ËnðËnéËnâËnÛËnÔËnÍËnÆËn¿Ën¸Ën±ËnªËn£ËnœËn•ËnŽËn‡Ën€ËnyËnrËnkËndËn]ËnVËnOËnHËnAËn:Ën3Ën,Ën%ËnËnËnËn ËnËnûÊnôÊníÊnæÊnßÊnØÊnÑÊnÊÊnÃÊn¼ÊnµÊn®Ên§Ên Ên™Ên’Ên‹Ên„Ên}ÊnvÊnoÊnhÊnaÊnZÊnSÊnLÊnEÊn>Ên7Ên0Ên)Ên"ÊnÊnÊn ÊnÊnÿÉnøÉnñÉnêÉnãÉnÜÉnÕÉnÎÉnÇÉnÀÉn¹Én²Én«Én¤ÉnÉn–ÉnÉnˆÉnÉnzÉnsÉnlÉneÉn^ÉnWÉnPÉnIÉnBÉn;Én4Én-Én&ÉnÉnÉnÉn ÉnÉnüÈnõÈnîÈnçÈnàÈnÙÈnÒÈnËÈnÄÈn½Èn¶Èn¯Èn¨Èn¡ÈnšÈn“ÈnŒÈn…Èn~ÈnwÈnpÈniÈnbÈn[ÈnTÈnMÈnFÈn?Èn8Èn1Èn*Èn#ÈnÈnÈnÈnÈnÈnùÇnòÇnëÇnäÇnÝÇnÖÇnÏÇnÈÇnÁÇnºÇn³Çn¬Çn¥ÇnžÇn—ÇnÇn‰Çn‚Çn{ÇntÇnmÇnfÇn_ÇnXÇnQÇnJÇnCÇn<Çn5Çn.Çn'Çn ÇnÇnÇn ÇnÇnýÆnöÆnïÆnèÆnáÆnÚÆnÓÆnÌÆnÅÆn¾Æn·Æn°Æn©Æn¢Æn›Æn”ÆnÆn†ÆnÆnxÆnqÆnjÆncÆn\ÆnUÆnNÆnGÆn@Æn9Æn2Æn+Æn$ÆnÆnÆnÆnÆnÆnúÅnóÅnìÅnåÅnÞÅn×ÅnÐÅnÉÅnÂÅn»Ån´Ån­Ån¦ÅnŸÅn˜Ån‘ÅnŠÅnƒÅn|ÅnuÅnnÅngÅn`ÅnYÅnRÅnKÅnDÅn=Ån6Ån/Ån(Ån!ÅnÅnÅn ÅnÅnþÄn÷ÄnðÄnéÄnâÄnÛÄnÔÄnÍÄnÆÄn¿Än¸Än±ÄnªÄn£ÄnœÄn•ÄnŽÄn‡Än€ÄnyÄnrÄnkÄndÄn]ÄnVÄnOÄnHÄnAÄn:Än3Än,Än%ÄnÄnÄnÄn ÄnÄnûÃnôÃníÃnæÃnßÃnØÃnÑÃnÊÃnÃÃn¼ÃnµÃn®Ãn§Ãn Ãn™Ãn’Ãn‹Ãn„Ãn}ÃnvÃnoÃnhÃnaÃnZÃnSÃnLÃnEÃn>Ãn7Ãn0Ãn)Ãn"ÃnÃnÃn ÃnÃnÿÂnøÂnñÂnêÂnãÂnÜÂnÕÂnÎÂnÇÂnÀÂn¹Ân²Ân«Ân¤ÂnÂn–ÂnÂnˆÂnÂnzÂnsÂnlÂneÂn^ÂnWÂnPÂnIÂnBÂn;Ân4Ân-Ân&ÂnÂnÂnÂn ÂnÂnüÁnõÁnîÁnçÁnàÁnÙÁnÒÁnËÁnÄÁn½Án¶Án¯Án¨Án¡ÁnšÁn“ÁnŒÁn…Án~ÁnwÁnpÁniÁnbÁn[ÁnTÁnMÁnFÁn?Án8Án1Án*Án#ÁnÁnÁnÁnÁnÁnùÀnòÀnëÀnäÀnÝÀnÖÀnÏÀnÈÀnÁÀnºÀn³Àn¬Àn¥ÀnžÀn—ÀnÀn‰Àn‚Àn{ÀntÀnmÀnfÀn_ÀnXÀnQÀnJÀnCÀn<Àn5Àn.Àn'Àn ÀnÀnÀn ÀnÀný¿nö¿nï¿nè¿ná¿nÚ¿nÓ¿nÌ¿nÅ¿n¾¿n·¿n°¿n©¿n¢¿n›¿n”¿n¿n†¿n¿nx¿nq¿nj¿nc¿n\¿nU¿nN¿nG¿n@¿n9¿n2¿n+¿n$¿n¿n¿n¿n¿n¿nú¾nó¾nì¾nå¾nÞ¾n×¾nоnɾn¾n»¾n´¾n­¾n¦¾nŸ¾n˜¾n‘¾nоnƒ¾n|¾nu¾nn¾ng¾n`¾nY¾nR¾nK¾nD¾n=¾n6¾n/¾n(¾n!¾n¾n¾n ¾n¾nþ½n÷½nð½né½nâ½nÛ½nÔ½nͽnƽn¿½n¸½n±½nª½n£½nœ½n•½n޽n‡½n€½ny½nr½nk½nd½n]½nV½nO½nH½nA½n:½n3½n,½n%½n½n½n½n ½n½nû¼nô¼ní¼næ¼nß¼nؼnѼnʼnün¼¼nµ¼n®¼n§¼n ¼n™¼n’¼n‹¼n„¼n}¼nv¼no¼nh¼na¼nZ¼nS¼nL¼nE¼n>¼n7¼n0¼n)¼n"¼n¼n¼n ¼n¼nÿ»nø»nñ»nê»nã»nÜ»nÕ»nλnÇ»nÀ»n¹»n²»n«»n¤»n»n–»n»nˆ»n»nz»ns»nl»ne»n^»nW»nP»nI»nB»n;»n4»n-»n&»n»n»n»n »n»nüºnõºnîºnçºnàºnÙºnÒºn˺nĺn½ºn¶ºn¯ºn¨ºn¡ºnšºn“ºnŒºn…ºn~ºnwºnpºniºnbºn[ºnTºnMºnFºn?ºn8ºn1ºn*ºn#ºnºnºnºnºnºnù¹nò¹në¹nä¹nݹnÖ¹nϹnȹnÁ¹nº¹n³¹n¬¹n¥¹nž¹n—¹n¹n‰¹n‚¹n{¹nt¹nm¹nf¹n_¹nX¹nQ¹nJ¹nC¹n<¹n5¹n.¹n'¹n ¹n¹n¹n ¹n¹ný¸nö¸nï¸nè¸ná¸nÚ¸nÓ¸n̸nŸn¾¸n·¸n°¸n©¸n¢¸n›¸n”¸n¸n†¸n¸nx¸nq¸nj¸nc¸n\¸nU¸nN¸nG¸n@¸n9¸n2¸n+¸n$¸n¸n¸n¸n¸n¸nú·nó·nì·nå·nÞ·n×·nзnÉ·n·n»·n´·n­·n¦·nŸ·n˜·n‘·nŠ·nƒ·n|·nu·nn·ng·n`·nY·nR·nK·nD·n=·n6·n/·n(·n!·n·n·n ·n·nþ¶n÷¶nð¶né¶nâ¶nÛ¶nÔ¶nͶnƶn¿¶n¸¶n±¶nª¶n£¶nœ¶n•¶n޶n‡¶n€¶ny¶nr¶nk¶nd¶n]¶nV¶nO¶nH¶nA¶n:¶n3¶n,¶n%¶n¶n¶n¶n ¶n¶nûµnôµníµnæµnßµnصnѵnʵnõn¼µnµµn®µn§µn µn™µn’µn‹µn„µn}µnvµnoµnhµnaµnZµnSµnLµnEµn>µn7µn0µn)µn"µnµnµn µnµnÿ´nø´nñ´nê´nã´nÜ´nÕ´nδnÇ´nÀ´n¹´n²´n«´n¤´n´n–´n´nˆ´n´nz´ns´nl´ne´n^´nW´nP´nI´nB´n;´n4´n-´n&´n´n´n´n ´n´nü³nõ³nî³nç³nà³nÙ³nÒ³n˳nijn½³n¶³n¯³n¨³n¡³nš³n“³nŒ³n…³n~³nw³np³ni³nb³n[³nT³nM³nF³n?³n8³n1³n*³n#³n³n³n³n³n³nù²nò²në²nä²nݲnÖ²nϲnȲnÁ²nº²n³²n¬²n¥²nž²n—²n²n‰²n‚²n{²nt²nm²nf²n_²nX²nQ²nJ²nC²n<²n5²n.²n'²n ²n²n²n ²n²ný±nö±nï±nè±ná±nÚ±nÓ±ṉnűn¾±n·±n°±n©±n¢±n›±n”±n±n†±n±nx±nq±nj±nc±n\±nU±nN±nG±n@±n9±n2±n+±n$±n±n±n±n±n±nú°nó°nì°nå°nÞ°n×°nаnɰn°n»°n´°n­°n¦°nŸ°n˜°n‘°nаnƒ°n|°nu°nn°ng°n`°nY°nR°nK°nD°n=°n6°n/°n(°n!°n°n°n °n°nþ¯n÷¯nð¯né¯nâ¯nÛ¯nÔ¯nͯnƯn¿¯n¸¯n±¯nª¯n£¯nœ¯n•¯nޝn‡¯n€¯ny¯nr¯nk¯nd¯n]¯nV¯nO¯nH¯nA¯n:¯n3¯n,¯n%¯n¯n¯n¯n ¯n¯nû®nô®ní®næ®nß®nØ®nÑ®nÊ®nîn¼®nµ®n®®n§®n ®n™®n’®n‹®n„®n}®nv®no®nh®na®nZ®nS®nL®nE®n>®n7®n0®n)®n"®n®n®n ®n®nÿ­nø­nñ­nê­nã­nÜ­nÕ­nέnÇ­nÀ­n¹­n²­n«­n¤­n­n–­n­nˆ­n­nz­ns­nl­ne­n^­nW­nP­nI­nB­n;­n4­n-­n&­n­n­n­n ­n­nü¬nõ¬nî¬nç¬nà¬nÙ¬nÒ¬nˬnĬn½¬n¶¬n¯¬n¨¬n¡¬nš¬n“¬nŒ¬n…¬n~¬nw¬np¬ni¬nb¬n[¬nT¬nM¬nF¬n?¬n8¬n1¬n*¬n#¬n¬n¬n¬n¬n¬nù«nò«në«nä«nÝ«nÖ«nÏ«nÈ«nÁ«nº«n³«n¬«n¥«nž«n—«n«n‰«n‚«n{«nt«nm«nf«n_«nX«nQ«nJ«nC«n<«n5«n.«n'«n «n«n«n «n«nýªnöªnïªnèªnáªnÚªnÓªn̪nŪn¾ªn·ªn°ªn©ªn¢ªn›ªn”ªnªn†ªnªnxªnqªnjªncªn\ªnUªnNªnGªn@ªn9ªn2ªn+ªn$ªnªnªnªnªnªnú©nó©nì©nå©nÞ©nשnЩnÉ©n©n»©n´©n­©n¦©nŸ©n˜©n‘©nŠ©nƒ©n|©nu©nn©ng©n`©nY©nR©nK©nD©n=©n6©n/©n(©n!©n©n©n ©n©nþ¨n÷¨nð¨né¨nâ¨nÛ¨nÔ¨nͨnƨn¿¨n¸¨n±¨nª¨n£¨nœ¨n•¨nލn‡¨n€¨ny¨nr¨nk¨nd¨n]¨nV¨nO¨nH¨nA¨n:¨n3¨n,¨n%¨n¨n¨n¨n ¨n¨nû§nô§ní§næ§nß§nاnѧnʧnçn¼§nµ§n®§n§§n §n™§n’§n‹§n„§n}§nv§no§nh§na§nZ§nS§nL§nE§n>§n7§n0§n)§n"§n§n§n §n§nÿ¦nø¦nñ¦nê¦nã¦nܦnÕ¦nΦnǦnÀ¦n¹¦n²¦n«¦n¤¦n¦n–¦n¦nˆ¦n¦nz¦ns¦nl¦ne¦n^¦nW¦nP¦nI¦nB¦n;¦n4¦n-¦n&¦n¦n¦n¦n ¦n¦nü¥nõ¥nî¥nç¥nà¥nÙ¥nÒ¥nË¥nÄ¥n½¥n¶¥n¯¥n¨¥n¡¥nš¥n“¥nŒ¥n…¥n~¥nw¥np¥ni¥nb¥n[¥nT¥nM¥nF¥n?¥n8¥n1¥n*¥n#¥n¥n¥n¥n¥n¥nù¤nò¤në¤nä¤nݤnÖ¤nϤnȤnÁ¤nº¤n³¤n¬¤n¥¤nž¤n—¤n¤n‰¤n‚¤n{¤nt¤nm¤nf¤n_¤nX¤nQ¤nJ¤nC¤n<¤n5¤n.¤n'¤n ¤n¤n¤n ¤n¤ný£nö£nï£nè£ná£nÚ£nÓ£nÌ£nÅ£n¾£n·£n°£n©£n¢£n›£n”£n£n†£n£nx£nq£nj£nc£n\£nU£nN£nG£n@£n9£n2£n+£n$£n£n£n£n£n£nú¢nó¢nì¢nå¢nÞ¢n×¢nТnÉ¢n¢n»¢n´¢n­¢n¦¢nŸ¢n˜¢n‘¢nŠ¢nƒ¢n|¢nu¢nn¢ng¢n`¢nY¢nR¢nK¢nD¢n=¢n6¢n/¢n(¢n!¢n¢n¢n ¢n¢nþ¡n÷¡nð¡né¡nâ¡nÛ¡nÔ¡nÍ¡nÆ¡n¿¡n¸¡n±¡nª¡n£¡nœ¡n•¡nŽ¡n‡¡n€¡ny¡nr¡nk¡nd¡n]¡nV¡nO¡nH¡nA¡n:¡n3¡n,¡n%¡n¡n¡n¡n ¡n¡nû nô ní næ nß nØ nÑ nÊ nàn¼ nµ n® n§ n  n™ n’ n‹ n„ n} nv no nh na nZ nS nL nE n> n7 n0 n) n" n n n  n nÿŸnøŸnñŸnêŸnãŸnÜŸnÕŸnΟnÇŸnÀŸn¹Ÿn²Ÿn«Ÿn¤ŸnŸn–ŸnŸnˆŸnŸnzŸnsŸnlŸneŸn^ŸnWŸnPŸnIŸnBŸn;Ÿn4Ÿn-Ÿn&ŸnŸnŸnŸn ŸnŸnüžnõžnîžnçžnàžnÙžnÒžnËžnÄžn½žn¶žn¯žn¨žn¡žnšžn“žnŒžn…žn~žnwžnpžnižnbžn[žnTžnMžnFžn?žn8žn1žn*žn#žnžnžnžnžnžnùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn™n7™n0™n)™n"™n™n™n ™n™nÿ˜nø˜nñ˜nê˜nã˜nܘnÕ˜nΘnǘnÀ˜n¹˜n²˜n«˜n¤˜n˜n–˜n˜nˆ˜n˜nz˜ns˜nl˜ne˜n^˜nW˜nP˜nI˜nB˜n;˜n4˜n-˜n&˜n˜n˜n˜n ˜n˜nü—nõ—nî—nç—nà—nÙ—nÒ—nË—nÄ—n½—n¶—n¯—n¨—n¡—nš—n“—nŒ—n…—n~—nw—np—ni—nb—n[—nT—nM—nF—n?—n8—n1—n*—n#—n—n—n—n—n—nù–nò–në–nä–nÝ–nÖ–nÏ–nÈ–nÁ–nº–n³–n¬–n¥–nž–n—–n–n‰–n‚–n{–nt–nm–nf–n_–nX–nQ–nJ–nC–n<–n5–n.–n'–n –n–n–n –n–ný•nö•nï•nè•ná•nÚ•nÓ•nÌ•nÅ•n¾•n·•n°•n©•n¢•n›•n”•n•n†•n•nx•nq•nj•nc•n\•nU•nN•nG•n@•n9•n2•n+•n$•n•n•n•n•n•nú”nó”nì”nå”nÞ”n×”nДnÉ”n”n»”n´”n­”n¦”nŸ”n˜”n‘”nŠ”nƒ”n|”nu”nn”ng”n`”nY”nR”nK”nD”n=”n6”n/”n(”n!”n”n”n ”n”nþ“n÷“nð“né“nâ“nÛ“nÔ“nÍ“nÆ“n¿“n¸“n±“nª“n£“nœ“n•“nŽ“n‡“n€“ny“nr“nk“nd“n]“nV“nO“nH“nA“n:“n3“n,“n%“n“n“n“n “n“nû’nô’ní’næ’nß’nØ’nÑ’nÊ’nÃ’n¼’nµ’n®’n§’n ’n™’n’’n‹’n„’n}’nv’no’nh’na’nZ’nS’nL’nE’n>’n7’n0’n)’n"’n’n’n ’n’nÿ‘nø‘nñ‘nê‘nã‘nÜ‘nÕ‘nΑnÇ‘nÀ‘n¹‘n²‘n«‘n¤‘n‘n–‘n‘nˆ‘n‘nz‘ns‘nl‘ne‘n^‘nW‘nP‘nI‘nB‘n;‘n4‘n-‘n&‘n‘n‘n‘n ‘n‘nünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn‹n7‹n0‹n)‹n"‹n‹n‹n ‹n‹nÿŠnøŠnñŠnêŠnãŠnÜŠnÕŠnΊnÇŠnÀŠn¹Šn²Šn«Šn¤ŠnŠn–ŠnŠnˆŠnŠnzŠnsŠnlŠneŠn^ŠnWŠnPŠnIŠnBŠn;Šn4Šn-Šn&ŠnŠnŠnŠn ŠnŠnü‰nõ‰nî‰nç‰nà‰nÙ‰nÒ‰nˉnĉn½‰n¶‰n¯‰n¨‰n¡‰nš‰n“‰nŒ‰n…‰n~‰nw‰np‰ni‰nb‰n[‰nT‰nM‰nF‰n?‰n8‰n1‰n*‰n#‰n‰n‰n‰n‰n‰nùˆnòˆnëˆnäˆn݈nÖˆnψnȈnÁˆnºˆn³ˆn¬ˆn¥ˆnžˆn—ˆnˆn‰ˆn‚ˆn{ˆntˆnmˆnfˆn_ˆnXˆnQˆnJˆnCˆn<ˆn5ˆn.ˆn'ˆn ˆnˆnˆn ˆnˆný‡nö‡nï‡nè‡ná‡nÚ‡nÓ‡ṅnŇn¾‡n·‡n°‡n©‡n¢‡n›‡n”‡n‡n†‡n‡nx‡nq‡nj‡nc‡n\‡nU‡nN‡nG‡n@‡n9‡n2‡n+‡n$‡n‡n‡n‡n‡n‡nú†nó†nì†nå†nÞ†n׆nІnɆn†n»†n´†n­†n¦†nŸ†n˜†n‘†nІnƒ†n|†nu†nn†ng†n`†nY†nR†nK†nD†n=†n6†n/†n(†n!†n†n†n †n†nþ…n÷…nð…né…nâ…nÛ…nÔ…nÍ…nÆ…n¿…n¸…n±…nª…n£…nœ…n•…nŽ…n‡…n€…ny…nr…nk…nd…n]…nV…nO…nH…nA…n:…n3…n,…n%…n…n…n…n …n…nû„nô„ní„næ„nß„nØ„nÑ„nÊ„nÄn¼„nµ„n®„n§„n „n™„n’„n‹„n„„n}„nv„no„nh„na„nZ„nS„nL„nE„n>„n7„n0„n)„n"„n„n„n „n„nÿƒnøƒnñƒnêƒnãƒn܃nÕƒn΃nǃnÀƒn¹ƒn²ƒn«ƒn¤ƒnƒn–ƒnƒnˆƒnƒnzƒnsƒnlƒneƒn^ƒnWƒnPƒnIƒnBƒn;ƒn4ƒn-ƒn&ƒnƒnƒnƒn ƒnƒnü‚nõ‚nî‚nç‚nà‚nÙ‚nÒ‚nË‚nÄ‚n½‚n¶‚n¯‚n¨‚n¡‚nš‚n“‚nŒ‚n…‚n~‚nw‚np‚ni‚nb‚n[‚nT‚nM‚nF‚n?‚n8‚n1‚n*‚n#‚n‚n‚n‚n‚n‚nùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn}n7}n0}n)}n"}n}n}n }n}nÿ|nø|nñ|nê|nã|nÜ|nÕ|nÎ|nÇ|nÀ|n¹|n²|n«|n¤|n|n–|n|nˆ|n|nz|ns|nl|ne|n^|nW|nP|nI|nB|n;|n4|n-|n&|n|n|n|n |n|nü{nõ{nî{nç{nà{nÙ{nÒ{nË{nÄ{n½{n¶{n¯{n¨{n¡{nš{n“{nŒ{n…{n~{nw{np{ni{nb{n[{nT{nM{nF{n?{n8{n1{n*{n#{n{n{n{n{n{nùznòznëznäznÝznÖznÏznÈznÁznºzn³zn¬zn¥znžzn—znzn‰zn‚zn{zntznmznfzn_znXznQznJznCznvn7vn0vn)vn"vnvnvn vnvnÿunøunñunêunãunÜunÕunÎunÇunÀun¹un²un«un¤unun–ununˆununzunsunluneun^unWunPunIunBun;un4un-un&unununun ununütnõtnîtnçtnàtnÙtnÒtnËtnÄtn½tn¶tn¯tn¨tn¡tnštn“tnŒtn…tn~tnwtnptnitnbtn[tnTtnMtnFtn?tn8tn1tn*tn#tntntntntntnùsnòsnësnäsnÝsnÖsnÏsnÈsnÁsnºsn³sn¬sn¥snžsn—snsn‰sn‚sn{sntsnmsnfsn_snXsnQsnJsnCsnon7on0on)on"ononon ononÿnnønnñnnênnãnnÜnnÕnnÎnnÇnnÀnn¹nn²nn«nn¤nnnn–nnnnˆnnnnznnsnnlnnenn^nnWnnPnnInnBnn;nn4nn-nn&nnnnnnnn nnnnümnõmnîmnçmnàmnÙmnÒmnËmnÄmn½mn¶mn¯mn¨mn¡mnšmn“mnŒmn…mn~mnwmnpmnimnbmn[mnTmnMmnFmn?mn8mn1mn*mn#mnmnmnmnmnmnùlnòlnëlnälnÝlnÖlnÏlnÈlnÁlnºln³ln¬ln¥lnžln—lnln‰ln‚ln{lntlnmlnfln_lnXlnQlnJlnClnhn7hn0hn)hn"hnhnhn hnhnÿgnøgnñgnêgnãgnÜgnÕgnÎgnÇgnÀgn¹gn²gn«gn¤gngn–gngnˆgngnzgnsgnlgnegn^gnWgnPgnIgnBgn;gn4gn-gn&gngngngn gngnüfnõfnîfnçfnàfnÙfnÒfnËfnÄfn½fn¶fn¯fn¨fn¡fnšfn“fnŒfn…fn~fnwfnpfnifnbfn[fnTfnMfnFfn?fn8fn1fn*fn#fnfnfnfnfnfnùenòenëenäenÝenÖenÏenÈenÁenºen³en¬en¥enžen—enen‰en‚en{entenmenfen_enXenQenJenCenan7an0an)an"ananan ananÿ`nø`nñ`nê`nã`nÜ`nÕ`nÎ`nÇ`nÀ`n¹`n²`n«`n¤`n`n–`n`nˆ`n`nz`ns`nl`ne`n^`nW`nP`nI`nB`n;`n4`n-`n&`n`n`n`n `n`nü_nõ_nî_nç_nà_nÙ_nÒ_nË_nÄ_n½_n¶_n¯_n¨_n¡_nš_n“_nŒ_n…_n~_nw_np_ni_nb_n[_nT_nM_nF_n?_n8_n1_n*_n#_n_n_n_n_n_nù^nò^në^nä^nÝ^nÖ^nÏ^nÈ^nÁ^nº^n³^n¬^n¥^nž^n—^n^n‰^n‚^n{^nt^nm^nf^n_^nX^nQ^nJ^nC^n<^n5^n.^n'^n ^n^n^n ^n^ný]nö]nï]nè]ná]nÚ]nÓ]nÌ]nÅ]n¾]n·]n°]n©]n¢]n›]n”]n]n†]n]nx]nq]nj]nc]n\]nU]nN]nG]n@]n9]n2]n+]n$]n]n]n]n]n]nú\nó\nì\nå\nÞ\n×\nÐ\nÉ\nÂ\n»\n´\n­\n¦\nŸ\n˜\n‘\nŠ\nƒ\n|\nu\nn\ng\n`\nY\nR\nK\nD\n=\n6\n/\n(\n!\n\n\n \n\nþ[n÷[nð[né[nâ[nÛ[nÔ[nÍ[nÆ[n¿[n¸[n±[nª[n£[nœ[n•[nŽ[n‡[n€[ny[nr[nk[nd[n][nV[nO[nH[nA[n:[n3[n,[n%[n[n[n[n [n[nûZnôZníZnæZnßZnØZnÑZnÊZnÃZn¼ZnµZn®Zn§Zn Zn™Zn’Zn‹Zn„Zn}ZnvZnoZnhZnaZnZZnSZnLZnEZn>Zn7Zn0Zn)Zn"ZnZnZn ZnZnÿYnøYnñYnêYnãYnÜYnÕYnÎYnÇYnÀYn¹Yn²Yn«Yn¤YnYn–YnYnˆYnYnzYnsYnlYneYn^YnWYnPYnIYnBYn;Yn4Yn-Yn&YnYnYnYn YnYnüXnõXnîXnçXnàXnÙXnÒXnËXnÄXn½Xn¶Xn¯Xn¨Xn¡XnšXn“XnŒXn…Xn~XnwXnpXniXnbXn[XnTXnMXnFXn?Xn8Xn1Xn*Xn#XnXnXnXnXnXnùWnòWnëWnäWnÝWnÖWnÏWnÈWnÁWnºWn³Wn¬Wn¥WnžWn—WnWn‰Wn‚Wn{WntWnmWnfWn_WnXWnQWnJWnCWnSn7Sn0Sn)Sn"SnSnSn SnSnÿRnøRnñRnêRnãRnÜRnÕRnÎRnÇRnÀRn¹Rn²Rn«Rn¤RnRn–RnRnˆRnRnzRnsRnlRneRn^RnWRnPRnIRnBRn;Rn4Rn-Rn&RnRnRnRn RnRnüQnõQnîQnçQnàQnÙQnÒQnËQnÄQn½Qn¶Qn¯Qn¨Qn¡QnšQn“QnŒQn…Qn~QnwQnpQniQnbQn[QnTQnMQnFQn?Qn8Qn1Qn*Qn#QnQnQnQnQnQnùPnòPnëPnäPnÝPnÖPnÏPnÈPnÁPnºPn³Pn¬Pn¥PnžPn—PnPn‰Pn‚Pn{PntPnmPnfPn_PnXPnQPnJPnCPnLn7Ln0Ln)Ln"LnLnLn LnLnÿKnøKnñKnêKnãKnÜKnÕKnÎKnÇKnÀKn¹Kn²Kn«Kn¤KnKn–KnKnˆKnKnzKnsKnlKneKn^KnWKnPKnIKnBKn;Kn4Kn-Kn&KnKnKnKn KnKnüJnõJnîJnçJnàJnÙJnÒJnËJnÄJn½Jn¶Jn¯Jn¨Jn¡JnšJn“JnŒJn…Jn~JnwJnpJniJnbJn[JnTJnMJnFJn?Jn8Jn1Jn*Jn#JnJnJnJnJnJnùInòInëInäInÝInÖInÏInÈInÁInºIn³In¬In¥InžIn—InIn‰In‚In{IntInmInfIn_InXInQInJInCInEn7En0En)En"EnEnEn EnEnÿDnøDnñDnêDnãDnÜDnÕDnÎDnÇDnÀDn¹Dn²Dn«Dn¤DnDn–DnDnˆDnDnzDnsDnlDneDn^DnWDnPDnIDnBDn;Dn4Dn-Dn&DnDnDnDn DnDnüCnõCnîCnçCnàCnÙCnÒCnËCnÄCn½Cn¶Cn¯Cn¨Cn¡CnšCn“CnŒCn…Cn~CnwCnpCniCnbCn[CnTCnMCnFCn?Cn8Cn1Cn*Cn#CnCnCnCnCnCnùBnòBnëBnäBnÝBnÖBnÏBnÈBnÁBnºBn³Bn¬Bn¥BnžBn—BnBn‰Bn‚Bn{BntBnmBnfBn_BnXBnQBnJBnCBnnô>ní>næ>nß>nØ>nÑ>nÊ>nÃ>n¼>nµ>n®>n§>n >n™>n’>n‹>n„>n}>nv>no>nh>na>nZ>nS>nL>nE>n>>n7>n0>n)>n">n>n>n >n>nÿ=nø=nñ=nê=nã=nÜ=nÕ=nÎ=nÇ=nÀ=n¹=n²=n«=n¤=n=n–=n=nˆ=n=nz=ns=nl=ne=n^=nW=nP=nI=nB=n;=n4=n-=n&=n=n=n=n =n=nü7n77n07n)7n"7n7n7n 7n7nÿ6nø6nñ6nê6nã6nÜ6nÕ6nÎ6nÇ6nÀ6n¹6n²6n«6n¤6n6n–6n6nˆ6n6nz6ns6nl6ne6n^6nW6nP6nI6nB6n;6n46n-6n&6n6n6n6n 6n6nü5nõ5nî5nç5nà5nÙ5nÒ5nË5nÄ5n½5n¶5n¯5n¨5n¡5nš5n“5nŒ5n…5n~5nw5np5ni5nb5n[5nT5nM5nF5n?5n85n15n*5n#5n5n5n5n5n5nù4nò4në4nä4nÝ4nÖ4nÏ4nÈ4nÁ4nº4n³4n¬4n¥4nž4n—4n4n‰4n‚4n{4nt4nm4nf4n_4nX4nQ4nJ4nC4n<4n54n.4n'4n 4n4n4n 4n4ný3nö3nï3nè3ná3nÚ3nÓ3nÌ3nÅ3n¾3n·3n°3n©3n¢3n›3n”3n3n†3n3nx3nq3nj3nc3n\3nU3nN3nG3n@3n93n23n+3n$3n3n3n3n3n3nú2nó2nì2nå2nÞ2n×2nÐ2nÉ2nÂ2n»2n´2n­2n¦2nŸ2n˜2n‘2nŠ2nƒ2n|2nu2nn2ng2n`2nY2nR2nK2nD2n=2n62n/2n(2n!2n2n2n 2n2nþ1n÷1nð1né1nâ1nÛ1nÔ1nÍ1nÆ1n¿1n¸1n±1nª1n£1nœ1n•1nŽ1n‡1n€1ny1nr1nk1nd1n]1nV1nO1nH1nA1n:1n31n,1n%1n1n1n1n 1n1nû0nô0ní0næ0nß0nØ0nÑ0nÊ0nÃ0n¼0nµ0n®0n§0n 0n™0n’0n‹0n„0n}0nv0no0nh0na0nZ0nS0nL0nE0n>0n70n00n)0n"0n0n0n 0n0nÿ/nø/nñ/nê/nã/nÜ/nÕ/nÎ/nÇ/nÀ/n¹/n²/n«/n¤/n/n–/n/nˆ/n/nz/ns/nl/ne/n^/nW/nP/nI/nB/n;/n4/n-/n&/n/n/n/n /n/nü.nõ.nî.nç.nà.nÙ.nÒ.nË.nÄ.n½.n¶.n¯.n¨.n¡.nš.n“.nŒ.n….n~.nw.np.ni.nb.n[.nT.nM.nF.n?.n8.n1.n*.n#.n.n.n.n.n.nù-nò-në-nä-nÝ-nÖ-nÏ-nÈ-nÁ-nº-n³-n¬-n¥-nž-n—-n-n‰-n‚-n{-nt-nm-nf-n_-nX-nQ-nJ-nC-n<-n5-n.-n'-n -n-n-n -n-ný,nö,nï,nè,ná,nÚ,nÓ,nÌ,nÅ,n¾,n·,n°,n©,n¢,n›,n”,n,n†,n,nx,nq,nj,nc,n\,nU,nN,nG,n@,n9,n2,n+,n$,n,n,n,n,n,nú+nó+nì+nå+nÞ+n×+nÐ+nÉ+nÂ+n»+n´+n­+n¦+nŸ+n˜+n‘+nŠ+nƒ+n|+nu+nn+ng+n`+nY+nR+nK+nD+n=+n6+n/+n(+n!+n+n+n +n+nþ*n÷*nð*né*nâ*nÛ*nÔ*nÍ*nÆ*n¿*n¸*n±*nª*n£*nœ*n•*nŽ*n‡*n€*ny*nr*nk*nd*n]*nV*nO*nH*nA*n:*n3*n,*n%*n*n*n*n *n*nû)nô)ní)næ)nß)nØ)nÑ)nÊ)nÃ)n¼)nµ)n®)n§)n )n™)n’)n‹)n„)n})nv)no)nh)na)nZ)nS)nL)nE)n>)n7)n0)n))n")n)n)n )n)nÿ(nø(nñ(nê(nã(nÜ(nÕ(nÎ(nÇ(nÀ(n¹(n²(n«(n¤(n(n–(n(nˆ(n(nz(ns(nl(ne(n^(nW(nP(nI(nB(n;(n4(n-(n&(n(n(n(n (n(nü'nõ'nî'nç'nà'nÙ'nÒ'nË'nÄ'n½'n¶'n¯'n¨'n¡'nš'n“'nŒ'n…'n~'nw'np'ni'nb'n['nT'nM'nF'n?'n8'n1'n*'n#'n'n'n'n'n'nù&nò&në&nä&nÝ&nÖ&nÏ&nÈ&nÁ&nº&n³&n¬&n¥&nž&n—&n&n‰&n‚&n{&nt&nm&nf&n_&nX&nQ&nJ&nC&n<&n5&n.&n'&n &n&n&n &n&ný%nö%nï%nè%ná%nÚ%nÓ%nÌ%nÅ%n¾%n·%n°%n©%n¢%n›%n”%n%n†%n%nx%nq%nj%nc%n\%nU%nN%nG%n@%n9%n2%n+%n$%n%n%n%n%n%nú$nó$nì$nå$nÞ$n×$nÐ$nÉ$nÂ$n»$n´$n­$n¦$nŸ$n˜$n‘$nŠ$nƒ$n|$nu$nn$ng$n`$nY$nR$nK$nD$n=$n6$n/$n($n!$n$n$n $n$nþ#n÷#nð#né#nâ#nÛ#nÔ#nÍ#nÆ#n¿#n¸#n±#nª#n£#nœ#n•#nŽ#n‡#n€#ny#nr#nk#nd#n]#nV#nO#nH#nA#n:#n3#n,#n%#n#n#n#n #n#nû"nô"ní"næ"nß"nØ"nÑ"nÊ"nÃ"n¼"nµ"n®"n§"n "n™"n’"n‹"n„"n}"nv"no"nh"na"nZ"nS"nL"nE"n>"n7"n0"n)"n""n"n"n "n"nÿ!nø!nñ!nê!nã!nÜ!nÕ!nÎ!nÇ!nÀ!n¹!n²!n«!n¤!n!n–!n!nˆ!n!nz!ns!nl!ne!n^!nW!nP!nI!nB!n;!n4!n-!n&!n!n!n!n !n!nü nõ nî nç nà nÙ nÒ nË nÄ n½ n¶ n¯ n¨ n¡ nš n“ nŒ n… n~ nw np ni nb n[ nT nM nF n? n8 n1 n* n# n n n n n nùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnýnönïnènánÚnÓnÌnÅn¾n·n°n©n¢n›n”nn†nnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnúnónìnånÞn×nÐnÉnÂn»n´n­n¦nŸn˜n‘nŠnƒn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnþn÷nðnénânÛnÔnÍnÆn¿n¸n±nªn£nœn•nŽn‡n€nynrnkndn]nVnOnHnAn:n3n,n%nnnn nnûnônínænßnØnÑnÊnÃn¼nµn®n§n n™n’n‹n„n}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnýnönïnènánÚnÓnÌnÅn¾n·n°n©n¢n›n”nn†nnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnúnónìnånÞn×nÐnÉnÂn»n´n­n¦nŸn˜n‘nŠnƒn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnþn÷nðnénânÛnÔnÍnÆn¿n¸n±nªn£nœn•nŽn‡n€nynrnkndn]nVnOnHnAn:n3n,n%nnnn nnûnônínænßnØnÑnÊnÃn¼nµn®n§n n™n’n‹n„n}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnýnönïnènánÚnÓnÌnÅn¾n·n°n©n¢n›n”nn†nnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnúnónìnånÞn×nÐnÉnÂn»n´n­n¦nŸn˜n‘nŠnƒn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnþn÷nðnénânÛnÔnÍnÆn¿n¸n±nªn£nœn•nŽn‡n€nynrnkndn]nVnOnHnAn:n3n,n%nnnn nnû nô ní næ nß nØ nÑ nÊ nà n¼ nµ n® n§ n  n™ n’ n‹ n„ n} nv no nh na nZ nS nL nE n> n7 n0 n) n" n n n n nÿ nø nñ nê nã nÜ nÕ nÎ nÇ nÀ n¹ n² n« n¤ n n– n nˆ n nz ns nl ne n^ nW nP nI nB n; n4 n- n& n n n n n nü nõ nî nç nà nÙ nÒ nË nÄ n½ n¶ n¯ n¨ n¡ nš n“ nŒ n… n~ nw np ni nb n[ nT nM nF n? n8 n1 n* n# n n n n n nù nò në nä nÝ nÖ nÏ nÈ nÁ nº n³ n¬ n¥ nž n— n n‰ n‚ n{ nt nm nf n_ nX nQ nJ nC n< n5 n. n' n n n n n ný nö nï nè ná nÚ nÓ nÌ nÅ n¾ n· n° n© n¢ n› n” n n† n nx nq nj nc n\ nU nN nG n@ n9 n2 n+ n$ n n n n n núnónìnånÞn×nÐnÉnÂn»n´n­n¦nŸn˜n‘nŠnƒn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnþn÷nðnénânÛnÔnÍnÆn¿n¸n±nªn£nœn•nŽn‡n€nynrnkndn]nVnOnHnAn:n3n,n%nnnn nnûnônínænßnØnÑnÊnÃn¼nµn®n§n n™n’n‹n„n}nvnonhnanZnSnLnEn>n7n0n)n"nnn nnÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCn<n5n.n'n nnn nnýnönïnènánÚnÓnÌnÅn¾n·n°n©n¢n›n”nn†nnxnqnjncn\nUnNnGn@n9n2n+n$nnnnnnúnónìnånÞn×nÐnÉnÂn»n´n­n¦nŸn˜n‘nŠnƒn|nunnngn`nYnRnKnDn=n6n/n(n!nnn nnþn÷nðnénânÛnÔnÍnÆn¿n¸n±nªn£nœn•nŽn‡n€nynrnkndn]nVnOnHnAn:n3n,n%nnnn nnûÿmôÿmíÿmæÿmßÿmØÿmÑÿmÊÿmÃÿm¼ÿmµÿm®ÿm§ÿm ÿm™ÿm’ÿm‹ÿm„ÿm}ÿmvÿmoÿmhÿmaÿmZÿmSÿmLÿmEÿm>ÿm7ÿm0ÿm)ÿm"ÿmÿmÿm ÿmÿmÿþmøþmñþmêþmãþmÜþmÕþmÎþmÇþmÀþm¹þm²þm«þm¤þmþm–þmþmˆþmþmzþmsþmlþmeþm^þmWþmPþmIþmBþm;þm4þm-þm&þmþmþmþm þmþmüýmõýmîýmçýmàýmÙýmÒýmËýmÄým½ým¶ým¯ým¨ým¡ýmšým“ýmŒým…ým~ýmwýmpýmiýmbým[ýmTýmMýmFým?ým8ým1ým*ým#ýmýmýmýmýmýmùümòümëümäümÝümÖümÏümÈümÁümºüm³üm¬üm¥ümžüm—ümüm‰üm‚üm{ümtümmümfüm_ümXümQümJümCüm<üm5üm.üm'üm ümümüm ümümýûmöûmïûmèûmáûmÚûmÓûmÌûmÅûm¾ûm·ûm°ûm©ûm¢ûm›ûm”ûmûm†ûmûmxûmqûmjûmcûm\ûmUûmNûmGûm@ûm9ûm2ûm+ûm$ûmûmûmûmûmûmúúmóúmìúmåúmÞúm×úmÐúmÉúmÂúm»úm´úm­úm¦úmŸúm˜úm‘úmŠúmƒúm|úmuúmnúmgúm`úmYúmRúmKúmDúm=úm6úm/úm(úm!úmúmúm úmúmþùm÷ùmðùméùmâùmÛùmÔùmÍùmÆùm¿ùm¸ùm±ùmªùm£ùmœùm•ùmŽùm‡ùm€ùmyùmrùmkùmdùm]ùmVùmOùmHùmAùm:ùm3ùm,ùm%ùmùmùmùm ùmùmûømôømíømæømßømØømÑømÊømÃøm¼ømµøm®øm§øm øm™øm’øm‹øm„øm}ømvømoømhømaømZømSømLømEøm>øm7øm0øm)øm"ømømøm ømømÿ÷mø÷mñ÷mê÷mã÷mÜ÷mÕ÷mÎ÷mÇ÷mÀ÷m¹÷m²÷m«÷m¤÷m÷m–÷m÷mˆ÷m÷mz÷ms÷ml÷me÷m^÷mW÷mP÷mI÷mB÷m;÷m4÷m-÷m&÷m÷m÷m÷m ÷m÷müömõömîömçömàömÙömÒömËömÄöm½öm¶öm¯öm¨öm¡ömšöm“ömŒöm…öm~ömwömpömiömböm[ömTömMömFöm?öm8öm1öm*öm#ömömömömömömùõmòõmëõmäõmÝõmÖõmÏõmÈõmÁõmºõm³õm¬õm¥õmžõm—õmõm‰õm‚õm{õmtõmmõmfõm_õmXõmQõmJõmCõm<õm5õm.õm'õm õmõmõm õmõmýômöômïômèômáômÚômÓômÌômÅôm¾ôm·ôm°ôm©ôm¢ôm›ôm”ômôm†ômômxômqômjômcôm\ômUômNômGôm@ôm9ôm2ôm+ôm$ômômômômômômúómóómìómåómÞóm×ómÐómÉómÂóm»óm´óm­óm¦ómŸóm˜óm‘ómŠómƒóm|ómuómnómgóm`ómYómRómKómDóm=óm6óm/óm(óm!ómómóm ómómþòm÷òmðòméòmâòmÛòmÔòmÍòmÆòm¿òm¸òm±òmªòm£òmœòm•òmŽòm‡òm€òmyòmròmkòmdòm]òmVòmOòmHòmAòm:òm3òm,òm%òmòmòmòm òmòmûñmôñmíñmæñmßñmØñmÑñmÊñmÃñm¼ñmµñm®ñm§ñm ñm™ñm’ñm‹ñm„ñm}ñmvñmoñmhñmañmZñmSñmLñmEñm>ñm7ñm0ñm)ñm"ñmñmñm ñmñmÿðmøðmñðmêðmãðmÜðmÕðmÎðmÇðmÀðm¹ðm²ðm«ðm¤ðmðm–ðmðmˆðmðmzðmsðmlðmeðm^ðmWðmPðmIðmBðm;ðm4ðm-ðm&ðmðmðmðm ðmðmüïmõïmîïmçïmàïmÙïmÒïmËïmÄïm½ïm¶ïm¯ïm¨ïm¡ïmšïm“ïmŒïm…ïm~ïmwïmpïmiïmbïm[ïmTïmMïmFïm?ïm8ïm1ïm*ïm#ïmïmïmïmïmïmùîmòîmëîmäîmÝîmÖîmÏîmÈîmÁîmºîm³îm¬îm¥îmžîm—îmîm‰îm‚îm{îmtîmmîmfîm_îmXîmQîmJîmCîm<îm5îm.îm'îm îmîmîm îmîmýímöímïímèímáímÚímÓímÌímÅím¾ím·ím°ím©ím¢ím›ím”ímím†ímímxímqímjímcím\ímUímNímGím@ím9ím2ím+ím$ímímímímímímúìmóìmììmåìmÞìm×ìmÐìmÉìmÂìm»ìm´ìm­ìm¦ìmŸìm˜ìm‘ìmŠìmƒìm|ìmuìmnìmgìm`ìmYìmRìmKìmDìm=ìm6ìm/ìm(ìm!ìmìmìm ìmìmþëm÷ëmðëméëmâëmÛëmÔëmÍëmÆëm¿ëm¸ëm±ëmªëm£ëmœëm•ëmŽëm‡ëm€ëmyëmrëmkëmdëm]ëmVëmOëmHëmAëm:ëm3ëm,ëm%ëmëmëmëm ëmëmûêmôêmíêmæêmßêmØêmÑêmÊêmÃêm¼êmµêm®êm§êm êm™êm’êm‹êm„êm}êmvêmoêmhêmaêmZêmSêmLêmEêm>êm7êm0êm)êm"êmêmêm êmêmÿémøémñémêémãémÜémÕémÎémÇémÀém¹ém²ém«ém¤émém–émémˆémémzémsémlémeém^émWémPémIémBém;ém4ém-ém&émémémém émémüèmõèmîèmçèmàèmÙèmÒèmËèmÄèm½èm¶èm¯èm¨èm¡èmšèm“èmŒèm…èm~èmwèmpèmièmbèm[èmTèmMèmFèm?èm8èm1èm*èm#èmèmèmèmèmèmùçmòçmëçmäçmÝçmÖçmÏçmÈçmÁçmºçm³çm¬çm¥çmžçm—çmçm‰çm‚çm{çmtçmmçmfçm_çmXçmQçmJçmCçm<çm5çm.çm'çm çmçmçm çmçmýæmöæmïæmèæmáæmÚæmÓæmÌæmÅæm¾æm·æm°æm©æm¢æm›æm”æmæm†æmæmxæmqæmjæmcæm\æmUæmNæmGæm@æm9æm2æm+æm$æmæmæmæmæmæmúåmóåmìåmååmÞåm×åmÐåmÉåmÂåm»åm´åm­åm¦åmŸåm˜åm‘åmŠåmƒåm|åmuåmnåmgåm`åmYåmRåmKåmDåm=åm6åm/åm(åm!åmåmåm åmåmþäm÷ämðäméämâämÛämÔämÍämÆäm¿äm¸äm±ämªäm£ämœäm•ämŽäm‡äm€ämyämrämkämdäm]ämVämOämHämAäm:äm3äm,äm%ämämämäm ämämûãmôãmíãmæãmßãmØãmÑãmÊãmÃãm¼ãmµãm®ãm§ãm ãm™ãm’ãm‹ãm„ãm}ãmvãmoãmhãmaãmZãmSãmLãmEãm>ãm7ãm0ãm)ãm"ãmãmãm ãmãmÿâmøâmñâmêâmãâmÜâmÕâmÎâmÇâmÀâm¹âm²âm«âm¤âmâm–âmâmˆâmâmzâmsâmlâmeâm^âmWâmPâmIâmBâm;âm4âm-âm&âmâmâmâm âmâmüámõámîámçámàámÙámÒámËámÄám½ám¶ám¯ám¨ám¡ámšám“ámŒám…ám~ámwámpámiámbám[ámTámMámFám?ám8ám1ám*ám#ámámámámámámùàmòàmëàmäàmÝàmÖàmÏàmÈàmÁàmºàm³àm¬àm¥àmžàm—àmàm‰àm‚àm{àmtàmmàmfàm_àmXàmQàmJàmCàm<àm5àm.àm'àm àmàmàm àmàmýßmößmïßmèßmáßmÚßmÓßmÌßmÅßm¾ßm·ßm°ßm©ßm¢ßm›ßm”ßmßm†ßmßmxßmqßmjßmcßm\ßmUßmNßmGßm@ßm9ßm2ßm+ßm$ßmßmßmßmßmßmúÞmóÞmìÞmåÞmÞÞm×ÞmÐÞmÉÞmÂÞm»Þm´Þm­Þm¦ÞmŸÞm˜Þm‘ÞmŠÞmƒÞm|ÞmuÞmnÞmgÞm`ÞmYÞmRÞmKÞmDÞm=Þm6Þm/Þm(Þm!ÞmÞmÞm ÞmÞmþÝm÷ÝmðÝméÝmâÝmÛÝmÔÝmÍÝmÆÝm¿Ým¸Ým±ÝmªÝm£ÝmœÝm•ÝmŽÝm‡Ým€ÝmyÝmrÝmkÝmdÝm]ÝmVÝmOÝmHÝmAÝm:Ým3Ým,Ým%ÝmÝmÝmÝm ÝmÝmûÜmôÜmíÜmæÜmßÜmØÜmÑÜmÊÜmÃÜm¼ÜmµÜm®Üm§Üm Üm™Üm’Üm‹Üm„Üm}ÜmvÜmoÜmhÜmaÜmZÜmSÜmLÜmEÜm>Üm7Üm0Üm)Üm"ÜmÜmÜm ÜmÜmÿÛmøÛmñÛmêÛmãÛmÜÛmÕÛmÎÛmÇÛmÀÛm¹Ûm²Ûm«Ûm¤ÛmÛm–ÛmÛmˆÛmÛmzÛmsÛmlÛmeÛm^ÛmWÛmPÛmIÛmBÛm;Ûm4Ûm-Ûm&ÛmÛmÛmÛm ÛmÛmüÚmõÚmîÚmçÚmàÚmÙÚmÒÚmËÚmÄÚm½Úm¶Úm¯Úm¨Úm¡ÚmšÚm“ÚmŒÚm…Úm~ÚmwÚmpÚmiÚmbÚm[ÚmTÚmMÚmFÚm?Úm8Úm1Úm*Úm#ÚmÚmÚmÚmÚmÚmùÙmòÙmëÙmäÙmÝÙmÖÙmÏÙmÈÙmÁÙmºÙm³Ùm¬Ùm¥ÙmžÙm—ÙmÙm‰Ùm‚Ùm{ÙmtÙmmÙmfÙm_ÙmXÙmQÙmJÙmCÙm<Ùm5Ùm.Ùm'Ùm ÙmÙmÙm ÙmÙmýØmöØmïØmèØmáØmÚØmÓØmÌØmÅØm¾Øm·Øm°Øm©Øm¢Øm›Øm”ØmØm†ØmØmxØmqØmjØmcØm\ØmUØmNØmGØm@Øm9Øm2Øm+Øm$ØmØmØmØmØmØmú×mó×mì×må×mÞ×m××mÐ×mÉ×mÂ×m»×m´×m­×m¦×mŸ×m˜×m‘×mŠ×mƒ×m|×mu×mn×mg×m`×mY×mR×mK×mD×m=×m6×m/×m(×m!×m×m×m ×m×mþÖm÷ÖmðÖméÖmâÖmÛÖmÔÖmÍÖmÆÖm¿Öm¸Öm±ÖmªÖm£ÖmœÖm•ÖmŽÖm‡Öm€ÖmyÖmrÖmkÖmdÖm]ÖmVÖmOÖmHÖmAÖm:Öm3Öm,Öm%ÖmÖmÖmÖm ÖmÖmûÕmôÕmíÕmæÕmßÕmØÕmÑÕmÊÕmÃÕm¼ÕmµÕm®Õm§Õm Õm™Õm’Õm‹Õm„Õm}ÕmvÕmoÕmhÕmaÕmZÕmSÕmLÕmEÕm>Õm7Õm0Õm)Õm"ÕmÕmÕm ÕmÕmÿÔmøÔmñÔmêÔmãÔmÜÔmÕÔmÎÔmÇÔmÀÔm¹Ôm²Ôm«Ôm¤ÔmÔm–ÔmÔmˆÔmÔmzÔmsÔmlÔmeÔm^ÔmWÔmPÔmIÔmBÔm;Ôm4Ôm-Ôm&ÔmÔmÔmÔm ÔmÔmüÓmõÓmîÓmçÓmàÓmÙÓmÒÓmËÓmÄÓm½Óm¶Óm¯Óm¨Óm¡ÓmšÓm“ÓmŒÓm…Óm~ÓmwÓmpÓmiÓmbÓm[ÓmTÓmMÓmFÓm?Óm8Óm1Óm*Óm#ÓmÓmÓmÓmÓmÓmùÒmòÒmëÒmäÒmÝÒmÖÒmÏÒmÈÒmÁÒmºÒm³Òm¬Òm¥ÒmžÒm—ÒmÒm‰Òm‚Òm{ÒmtÒmmÒmfÒm_ÒmXÒmQÒmJÒmCÒm<Òm5Òm.Òm'Òm ÒmÒmÒm ÒmÒmýÑmöÑmïÑmèÑmáÑmÚÑmÓÑmÌÑmÅÑm¾Ñm·Ñm°Ñm©Ñm¢Ñm›Ñm”ÑmÑm†ÑmÑmxÑmqÑmjÑmcÑm\ÑmUÑmNÑmGÑm@Ñm9Ñm2Ñm+Ñm$ÑmÑmÑmÑmÑmÑmúÐmóÐmìÐmåÐmÞÐm×ÐmÐÐmÉÐmÂÐm»Ðm´Ðm­Ðm¦ÐmŸÐm˜Ðm‘ÐmŠÐmƒÐm|ÐmuÐmnÐmgÐm`ÐmYÐmRÐmKÐmDÐm=Ðm6Ðm/Ðm(Ðm!ÐmÐmÐm ÐmÐmþÏm÷ÏmðÏméÏmâÏmÛÏmÔÏmÍÏmÆÏm¿Ïm¸Ïm±ÏmªÏm£ÏmœÏm•ÏmŽÏm‡Ïm€ÏmyÏmrÏmkÏmdÏm]ÏmVÏmOÏmHÏmAÏm:Ïm3Ïm,Ïm%ÏmÏmÏmÏm ÏmÏmûÎmôÎmíÎmæÎmßÎmØÎmÑÎmÊÎmÃÎm¼ÎmµÎm®Îm§Îm Îm™Îm’Îm‹Îm„Îm}ÎmvÎmoÎmhÎmaÎmZÎmSÎmLÎmEÎm>Îm7Îm0Îm)Îm"ÎmÎmÎm ÎmÎmÿÍmøÍmñÍmêÍmãÍmÜÍmÕÍmÎÍmÇÍmÀÍm¹Ím²Ím«Ím¤ÍmÍm–ÍmÍmˆÍmÍmzÍmsÍmlÍmeÍm^ÍmWÍmPÍmIÍmBÍm;Ím4Ím-Ím&ÍmÍmÍmÍm ÍmÍmüÌmõÌmîÌmçÌmàÌmÙÌmÒÌmËÌmÄÌm½Ìm¶Ìm¯Ìm¨Ìm¡ÌmšÌm“ÌmŒÌm…Ìm~ÌmwÌmpÌmiÌmbÌm[ÌmTÌmMÌmFÌm?Ìm8Ìm1Ìm*Ìm#ÌmÌmÌmÌmÌmÌmùËmòËmëËmäËmÝËmÖËmÏËmÈËmÁËmºËm³Ëm¬Ëm¥ËmžËm—ËmËm‰Ëm‚Ëm{ËmtËmmËmfËm_ËmXËmQËmJËmCËm<Ëm5Ëm.Ëm'Ëm ËmËmËm ËmËmýÊmöÊmïÊmèÊmáÊmÚÊmÓÊmÌÊmÅÊm¾Êm·Êm°Êm©Êm¢Êm›Êm”ÊmÊm†ÊmÊmxÊmqÊmjÊmcÊm\ÊmUÊmNÊmGÊm@Êm9Êm2Êm+Êm$ÊmÊmÊmÊmÊmÊmúÉmóÉmìÉmåÉmÞÉm×ÉmÐÉmÉÉmÂÉm»Ém´Ém­Ém¦ÉmŸÉm˜Ém‘ÉmŠÉmƒÉm|ÉmuÉmnÉmgÉm`ÉmYÉmRÉmKÉmDÉm=Ém6Ém/Ém(Ém!ÉmÉmÉm ÉmÉmþÈm÷ÈmðÈméÈmâÈmÛÈmÔÈmÍÈmÆÈm¿Èm¸Èm±ÈmªÈm£ÈmœÈm•ÈmŽÈm‡Èm€ÈmyÈmrÈmkÈmdÈm]ÈmVÈmOÈmHÈmAÈm:Èm3Èm,Èm%ÈmÈmÈmÈm ÈmÈmûÇmôÇmíÇmæÇmßÇmØÇmÑÇmÊÇmÃÇm¼ÇmµÇm®Çm§Çm Çm™Çm’Çm‹Çm„Çm}ÇmvÇmoÇmhÇmaÇmZÇmSÇmLÇmEÇm>Çm7Çm0Çm)Çm"ÇmÇmÇm ÇmÇmÿÆmøÆmñÆmêÆmãÆmÜÆmÕÆmÎÆmÇÆmÀÆm¹Æm²Æm«Æm¤ÆmÆm–ÆmÆmˆÆmÆmzÆmsÆmlÆmeÆm^ÆmWÆmPÆmIÆmBÆm;Æm4Æm-Æm&ÆmÆmÆmÆm ÆmÆmüÅmõÅmîÅmçÅmàÅmÙÅmÒÅmËÅmÄÅm½Åm¶Åm¯Åm¨Åm¡ÅmšÅm“ÅmŒÅm…Åm~ÅmwÅmpÅmiÅmbÅm[ÅmTÅmMÅmFÅm?Åm8Åm1Åm*Åm#ÅmÅmÅmÅmÅmÅmùÄmòÄmëÄmäÄmÝÄmÖÄmÏÄmÈÄmÁÄmºÄm³Äm¬Äm¥ÄmžÄm—ÄmÄm‰Äm‚Äm{ÄmtÄmmÄmfÄm_ÄmXÄmQÄmJÄmCÄm<Äm5Äm.Äm'Äm ÄmÄmÄm ÄmÄmýÃmöÃmïÃmèÃmáÃmÚÃmÓÃmÌÃmÅÃm¾Ãm·Ãm°Ãm©Ãm¢Ãm›Ãm”ÃmÃm†ÃmÃmxÃmqÃmjÃmcÃm\ÃmUÃmNÃmGÃm@Ãm9Ãm2Ãm+Ãm$ÃmÃmÃmÃmÃmÃmúÂmóÂmìÂmåÂmÞÂm×ÂmÐÂmÉÂmÂÂm»Âm´Âm­Âm¦ÂmŸÂm˜Âm‘ÂmŠÂmƒÂm|ÂmuÂmnÂmgÂm`ÂmYÂmRÂmKÂmDÂm=Âm6Âm/Âm(Âm!ÂmÂmÂm ÂmÂmþÁm÷ÁmðÁméÁmâÁmÛÁmÔÁmÍÁmÆÁm¿Ám¸Ám±ÁmªÁm£ÁmœÁm•ÁmŽÁm‡Ám€ÁmyÁmrÁmkÁmdÁm]ÁmVÁmOÁmHÁmAÁm:Ám3Ám,Ám%ÁmÁmÁmÁm ÁmÁmûÀmôÀmíÀmæÀmßÀmØÀmÑÀmÊÀmÃÀm¼ÀmµÀm®Àm§Àm Àm™Àm’Àm‹Àm„Àm}ÀmvÀmoÀmhÀmaÀmZÀmSÀmLÀmEÀm>Àm7Àm0Àm)Àm"ÀmÀmÀm ÀmÀmÿ¿mø¿mñ¿mê¿mã¿mÜ¿mÕ¿mοmÇ¿mÀ¿m¹¿m²¿m«¿m¤¿m¿m–¿m¿mˆ¿m¿mz¿ms¿ml¿me¿m^¿mW¿mP¿mI¿mB¿m;¿m4¿m-¿m&¿m¿m¿m¿m ¿m¿mü¾mõ¾mî¾mç¾mà¾mÙ¾mÒ¾m˾mľm½¾m¶¾m¯¾m¨¾m¡¾mš¾m“¾mŒ¾m…¾m~¾mw¾mp¾mi¾mb¾m[¾mT¾mM¾mF¾m?¾m8¾m1¾m*¾m#¾m¾m¾m¾m¾m¾mù½mò½më½mä½mݽmÖ½mϽmȽmÁ½mº½m³½m¬½m¥½mž½m—½m½m‰½m‚½m{½mt½mm½mf½m_½mX½mQ½mJ½mC½m<½m5½m.½m'½m ½m½m½m ½m½mý¼mö¼mï¼mè¼má¼mÚ¼mÓ¼m̼mżm¾¼m·¼m°¼m©¼m¢¼m›¼m”¼m¼m†¼m¼mx¼mq¼mj¼mc¼m\¼mU¼mN¼mG¼m@¼m9¼m2¼m+¼m$¼m¼m¼m¼m¼m¼mú»mó»mì»må»mÞ»m×»mлmÉ»m»m»»m´»m­»m¦»mŸ»m˜»m‘»mŠ»mƒ»m|»mu»mn»mg»m`»mY»mR»mK»mD»m=»m6»m/»m(»m!»m»m»m »m»mþºm÷ºmðºméºmâºmÛºmÔºmͺmƺm¿ºm¸ºm±ºmªºm£ºmœºm•ºmŽºm‡ºm€ºmyºmrºmkºmdºm]ºmVºmOºmHºmAºm:ºm3ºm,ºm%ºmºmºmºm ºmºmû¹mô¹mí¹mæ¹mß¹mعmѹmʹmùm¼¹mµ¹m®¹m§¹m ¹m™¹m’¹m‹¹m„¹m}¹mv¹mo¹mh¹ma¹mZ¹mS¹mL¹mE¹m>¹m7¹m0¹m)¹m"¹m¹m¹m ¹m¹mÿ¸mø¸mñ¸mê¸mã¸mܸmÕ¸mθmǸmÀ¸m¹¸m²¸m«¸m¤¸m¸m–¸m¸mˆ¸m¸mz¸ms¸ml¸me¸m^¸mW¸mP¸mI¸mB¸m;¸m4¸m-¸m&¸m¸m¸m¸m ¸m¸mü·mõ·mî·mç·mà·mÙ·mÒ·mË·mÄ·m½·m¶·m¯·m¨·m¡·mš·m“·mŒ·m…·m~·mw·mp·mi·mb·m[·mT·mM·mF·m?·m8·m1·m*·m#·m·m·m·m·m·mù¶mò¶më¶mä¶mݶmÖ¶m϶mȶmÁ¶mº¶m³¶m¬¶m¥¶mž¶m—¶m¶m‰¶m‚¶m{¶mt¶mm¶mf¶m_¶mX¶mQ¶mJ¶mC¶m<¶m5¶m.¶m'¶m ¶m¶m¶m ¶m¶mýµmöµmïµmèµmáµmÚµmÓµm̵mŵm¾µm·µm°µm©µm¢µm›µm”µmµm†µmµmxµmqµmjµmcµm\µmUµmNµmGµm@µm9µm2µm+µm$µmµmµmµmµmµmú´mó´mì´må´mÞ´m×´mдmÉ´m´m»´m´´m­´m¦´mŸ´m˜´m‘´mŠ´mƒ´m|´mu´mn´mg´m`´mY´mR´mK´mD´m=´m6´m/´m(´m!´m´m´m ´m´mþ³m÷³mð³mé³mâ³mÛ³mÔ³mͳmƳm¿³m¸³m±³mª³m£³mœ³m•³m޳m‡³m€³my³mr³mk³md³m]³mV³mO³mH³mA³m:³m3³m,³m%³m³m³m³m ³m³mû²mô²mí²mæ²mß²mزmѲmʲmòm¼²mµ²m®²m§²m ²m™²m’²m‹²m„²m}²mv²mo²mh²ma²mZ²mS²mL²mE²m>²m7²m0²m)²m"²m²m²m ²m²mÿ±mø±mñ±mê±mã±mܱmÕ±mαmDZmÀ±m¹±m²±m«±m¤±m±m–±m±mˆ±m±mz±ms±ml±me±m^±mW±mP±mI±mB±m;±m4±m-±m&±m±m±m±m ±m±mü°mõ°mî°mç°mà°mÙ°mÒ°m˰mİm½°m¶°m¯°m¨°m¡°mš°m“°mŒ°m…°m~°mw°mp°mi°mb°m[°mT°mM°mF°m?°m8°m1°m*°m#°m°m°m°m°m°mù¯mò¯më¯mä¯mݯmÖ¯mϯmȯmÁ¯mº¯m³¯m¬¯m¥¯mž¯m—¯m¯m‰¯m‚¯m{¯mt¯mm¯mf¯m_¯mX¯mQ¯mJ¯mC¯m<¯m5¯m.¯m'¯m ¯m¯m¯m ¯m¯mý®mö®mï®mè®má®mÚ®mÓ®mÌ®mÅ®m¾®m·®m°®m©®m¢®m›®m”®m®m†®m®mx®mq®mj®mc®m\®mU®mN®mG®m@®m9®m2®m+®m$®m®m®m®m®m®mú­mó­mì­må­mÞ­m×­mЭmÉ­m­m»­m´­m­­m¦­mŸ­m˜­m‘­mŠ­mƒ­m|­mu­mn­mg­m`­mY­mR­mK­mD­m=­m6­m/­m(­m!­m­m­m ­m­mþ¬m÷¬mð¬mé¬mâ¬mÛ¬mÔ¬mͬmƬm¿¬m¸¬m±¬mª¬m£¬mœ¬m•¬mެm‡¬m€¬my¬mr¬mk¬md¬m]¬mV¬mO¬mH¬mA¬m:¬m3¬m,¬m%¬m¬m¬m¬m ¬m¬mû«mô«mí«mæ«mß«mØ«mÑ«mÊ«mëm¼«mµ«m®«m§«m «m™«m’«m‹«m„«m}«mv«mo«mh«ma«mZ«mS«mL«mE«m>«m7«m0«m)«m"«m«m«m «m«mÿªmøªmñªmêªmãªmܪmÕªmΪmǪmÀªm¹ªm²ªm«ªm¤ªmªm–ªmªmˆªmªmzªmsªmlªmeªm^ªmWªmPªmIªmBªm;ªm4ªm-ªm&ªmªmªmªm ªmªmü©mõ©mî©mç©mà©mÙ©mÒ©mË©mÄ©m½©m¶©m¯©m¨©m¡©mš©m“©mŒ©m…©m~©mw©mp©mi©mb©m[©mT©mM©mF©m?©m8©m1©m*©m#©m©m©m©m©m©mù¨mò¨më¨mä¨mݨmÖ¨mϨmȨmÁ¨mº¨m³¨m¬¨m¥¨mž¨m—¨m¨m‰¨m‚¨m{¨mt¨mm¨mf¨m_¨mX¨mQ¨mJ¨mC¨m<¨m5¨m.¨m'¨m ¨m¨m¨m ¨m¨mý§mö§mï§mè§má§mÚ§mÓ§m̧mŧm¾§m·§m°§m©§m¢§m›§m”§m§m†§m§mx§mq§mj§mc§m\§mU§mN§mG§m@§m9§m2§m+§m$§m§m§m§m§m§mú¦mó¦mì¦må¦mÞ¦mצmЦmɦm¦m»¦m´¦m­¦m¦¦mŸ¦m˜¦m‘¦mЦmƒ¦m|¦mu¦mn¦mg¦m`¦mY¦mR¦mK¦mD¦m=¦m6¦m/¦m(¦m!¦m¦m¦m ¦m¦mþ¥m÷¥mð¥mé¥mâ¥mÛ¥mÔ¥mÍ¥mÆ¥m¿¥m¸¥m±¥mª¥m£¥mœ¥m•¥mŽ¥m‡¥m€¥my¥mr¥mk¥md¥m]¥mV¥mO¥mH¥mA¥m:¥m3¥m,¥m%¥m¥m¥m¥m ¥m¥mû¤mô¤mí¤mæ¤mߤmؤmѤmʤmäm¼¤mµ¤m®¤m§¤m ¤m™¤m’¤m‹¤m„¤m}¤mv¤mo¤mh¤ma¤mZ¤mS¤mL¤mE¤m>¤m7¤m0¤m)¤m"¤m¤m¤m ¤m¤mÿ£mø£mñ£mê£mã£mÜ£mÕ£mΣmÇ£mÀ£m¹£m²£m«£m¤£m£m–£m£mˆ£m£mz£ms£ml£me£m^£mW£mP£mI£mB£m;£m4£m-£m&£m£m£m£m £m£mü¢mõ¢mî¢mç¢mà¢mÙ¢mÒ¢mË¢mÄ¢m½¢m¶¢m¯¢m¨¢m¡¢mš¢m“¢mŒ¢m…¢m~¢mw¢mp¢mi¢mb¢m[¢mT¢mM¢mF¢m?¢m8¢m1¢m*¢m#¢m¢m¢m¢m¢m¢mù¡mò¡më¡mä¡mÝ¡mÖ¡mÏ¡mÈ¡mÁ¡mº¡m³¡m¬¡m¥¡mž¡m—¡m¡m‰¡m‚¡m{¡mt¡mm¡mf¡m_¡mX¡mQ¡mJ¡mC¡m<¡m5¡m.¡m'¡m ¡m¡m¡m ¡m¡mý mö mï mè má mÚ mÓ mÌ mÅ m¾ m· m° m© m¢ m› m” m m† m mx mq mj mc m\ mU mN mG m@ m9 m2 m+ m$ m m m m m múŸmóŸmìŸmåŸmÞŸmןmПmÉŸmŸm»Ÿm´Ÿm­Ÿm¦ŸmŸŸm˜Ÿm‘ŸmŠŸmƒŸm|ŸmuŸmnŸmgŸm`ŸmYŸmRŸmKŸmDŸm=Ÿm6Ÿm/Ÿm(Ÿm!ŸmŸmŸm ŸmŸmþžm÷žmðžméžmâžmÛžmÔžmÍžmÆžm¿žm¸žm±žmªžm£žmœžm•žmŽžm‡žm€žmyžmržmkžmdžm]žmVžmOžmHžmAžm:žm3žm,žm%žmžmžmžm žmžmûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿœmøœmñœmêœmãœmÜœmÕœmΜmÇœmÀœm¹œm²œm«œm¤œmœm–œmœmˆœmœmzœmsœmlœmeœm^œmWœmPœmIœmBœm;œm4œm-œm&œmœmœmœm œmœmü›mõ›mî›mç›mà›mÙ›mÒ›mË›mÄ›m½›m¶›m¯›m¨›m¡›mš›m“›mŒ›m…›m~›mw›mp›mi›mb›m[›mT›mM›mF›m?›m8›m1›m*›m#›m›m›m›m›m›mùšmòšmëšmäšmÝšmÖšmÏšmÈšmÁšmºšm³šm¬šm¥šmžšm—šmšm‰šm‚šm{šmtšmmšmfšm_šmXšmQšmJšmCšm<šm5šm.šm'šm šmšmšm šmšmý™mö™mï™mè™má™mÚ™mÓ™mÌ™mÅ™m¾™m·™m°™m©™m¢™m›™m”™m™m†™m™mx™mq™mj™mc™m\™mU™mN™mG™m@™m9™m2™m+™m$™m™m™m™m™m™mú˜mó˜mì˜må˜mÞ˜mטmИmɘm˜m»˜m´˜m­˜m¦˜mŸ˜m˜˜m‘˜mŠ˜mƒ˜m|˜mu˜mn˜mg˜m`˜mY˜mR˜mK˜mD˜m=˜m6˜m/˜m(˜m!˜m˜m˜m ˜m˜mþ—m÷—mð—mé—mâ—mÛ—mÔ—mÍ—mÆ—m¿—m¸—m±—mª—m£—mœ—m•—mŽ—m‡—m€—my—mr—mk—md—m]—mV—mO—mH—mA—m:—m3—m,—m%—m—m—m—m —m—mû–mô–mí–mæ–mß–mØ–mÑ–mÊ–mÖm¼–mµ–m®–m§–m –m™–m’–m‹–m„–m}–mv–mo–mh–ma–mZ–mS–mL–mE–m>–m7–m0–m)–m"–m–m–m –m–mÿ•mø•mñ•mê•mã•mÜ•mÕ•mΕmÇ•mÀ•m¹•m²•m«•m¤•m•m–•m•mˆ•m•mz•ms•ml•me•m^•mW•mP•mI•mB•m;•m4•m-•m&•m•m•m•m •m•mü”mõ”mî”mç”mà”mÙ”mÒ”mË”mÄ”m½”m¶”m¯”m¨”m¡”mš”m“”mŒ”m…”m~”mw”mp”mi”mb”m[”mT”mM”mF”m?”m8”m1”m*”m#”m”m”m”m”m”mù“mò“më“mä“mÝ“mÖ“mÏ“mÈ“mÁ“mº“m³“m¬“m¥“mž“m—“m“m‰“m‚“m{“mt“mm“mf“m_“mX“mQ“mJ“mC“m<“m5“m.“m'“m “m“m“m “m“mý’mö’mï’mè’má’mÚ’mÓ’mÌ’mÅ’m¾’m·’m°’m©’m¢’m›’m”’m’m†’m’mx’mq’mj’mc’m\’mU’mN’mG’m@’m9’m2’m+’m$’m’m’m’m’m’mú‘mó‘mì‘må‘mÞ‘mבmБmÉ‘m‘m»‘m´‘m­‘m¦‘mŸ‘m˜‘m‘‘mŠ‘mƒ‘m|‘mu‘mn‘mg‘m`‘mY‘mR‘mK‘mD‘m=‘m6‘m/‘m(‘m!‘m‘m‘m ‘m‘mþm÷mðmémâmÛmÔmÍmÆm¿m¸m±mªm£mœm•mŽm‡m€mymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿŽmøŽmñŽmêŽmãŽmÜŽmÕŽmÎŽmÇŽmÀŽm¹Žm²Žm«Žm¤ŽmŽm–ŽmŽmˆŽmŽmzŽmsŽmlŽmeŽm^ŽmWŽmPŽmIŽmBŽm;Žm4Žm-Žm&ŽmŽmŽmŽm ŽmŽmümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùŒmòŒmëŒmäŒmÝŒmÖŒmÏŒmÈŒmÁŒmºŒm³Œm¬Œm¥ŒmžŒm—ŒmŒm‰Œm‚Œm{ŒmtŒmmŒmfŒm_ŒmXŒmQŒmJŒmCŒm<Œm5Œm.Œm'Œm ŒmŒmŒm ŒmŒmý‹mö‹mï‹mè‹má‹mÚ‹mÓ‹mÌ‹mÅ‹m¾‹m·‹m°‹m©‹m¢‹m›‹m”‹m‹m†‹m‹mx‹mq‹mj‹mc‹m\‹mU‹mN‹mG‹m@‹m9‹m2‹m+‹m$‹m‹m‹m‹m‹m‹múŠmóŠmìŠmåŠmÞŠm׊mЊmÉŠmŠm»Šm´Šm­Šm¦ŠmŸŠm˜Šm‘ŠmŠŠmƒŠm|ŠmuŠmnŠmgŠm`ŠmYŠmRŠmKŠmDŠm=Šm6Šm/Šm(Šm!ŠmŠmŠm ŠmŠmþ‰m÷‰mð‰mé‰mâ‰mÛ‰mÔ‰m͉mƉm¿‰m¸‰m±‰mª‰m£‰mœ‰m•‰mމm‡‰m€‰my‰mr‰mk‰md‰m]‰mV‰mO‰mH‰mA‰m:‰m3‰m,‰m%‰m‰m‰m‰m ‰m‰mûˆmôˆmíˆmæˆm߈m؈mшmʈmÈm¼ˆmµˆm®ˆm§ˆm ˆm™ˆm’ˆm‹ˆm„ˆm}ˆmvˆmoˆmhˆmaˆmZˆmSˆmLˆmEˆm>ˆm7ˆm0ˆm)ˆm"ˆmˆmˆm ˆmˆmÿ‡mø‡mñ‡mê‡mã‡m܇mÕ‡m·mLJmÀ‡m¹‡m²‡m«‡m¤‡m‡m–‡m‡mˆ‡m‡mz‡ms‡ml‡me‡m^‡mW‡mP‡mI‡mB‡m;‡m4‡m-‡m&‡m‡m‡m‡m ‡m‡mü†mõ†mî†mç†mà†mÙ†mÒ†mˆmĆm½†m¶†m¯†m¨†m¡†mš†m“†mŒ†m…†m~†mw†mp†mi†mb†m[†mT†mM†mF†m?†m8†m1†m*†m#†m†m†m†m†m†mù…mò…më…mä…mÝ…mÖ…mÏ…mÈ…mÁ…mº…m³…m¬…m¥…mž…m—…m…m‰…m‚…m{…mt…mm…mf…m_…mX…mQ…mJ…mC…m<…m5…m.…m'…m …m…m…m …m…mý„mö„mï„mè„má„mÚ„mÓ„mÌ„mÅ„m¾„m·„m°„m©„m¢„m›„m”„m„m†„m„mx„mq„mj„mc„m\„mU„mN„mG„m@„m9„m2„m+„m$„m„m„m„m„m„múƒmóƒmìƒmåƒmÞƒm׃mЃmɃmƒm»ƒm´ƒm­ƒm¦ƒmŸƒm˜ƒm‘ƒmŠƒmƒƒm|ƒmuƒmnƒmgƒm`ƒmYƒmRƒmKƒmDƒm=ƒm6ƒm/ƒm(ƒm!ƒmƒmƒm ƒmƒmþ‚m÷‚mð‚mé‚mâ‚mÛ‚mÔ‚mÍ‚mÆ‚m¿‚m¸‚m±‚mª‚m£‚mœ‚m•‚mŽ‚m‡‚m€‚my‚mr‚mk‚md‚m]‚mV‚mO‚mH‚mA‚m:‚m3‚m,‚m%‚m‚m‚m‚m ‚m‚mûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿ€mø€mñ€mê€mã€mÜ€mÕ€m΀mÇ€mÀ€m¹€m²€m«€m¤€m€m–€m€mˆ€m€mz€ms€ml€me€m^€mW€mP€mI€mB€m;€m4€m-€m&€m€m€m€m €m€mümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmù~mò~më~mä~mÝ~mÖ~mÏ~mÈ~mÁ~mº~m³~m¬~m¥~mž~m—~m~m‰~m‚~m{~mt~mm~mf~m_~mX~mQ~mJ~mC~m<~m5~m.~m'~m ~m~m~m ~m~mý}mö}mï}mè}má}mÚ}mÓ}mÌ}mÅ}m¾}m·}m°}m©}m¢}m›}m”}m}m†}m}mx}mq}mj}mc}m\}mU}mN}mG}m@}m9}m2}m+}m$}m}m}m}m}m}mú|mó|mì|må|mÞ|m×|mÐ|mÉ|mÂ|m»|m´|m­|m¦|mŸ|m˜|m‘|mŠ|mƒ|m||mu|mn|mg|m`|mY|mR|mK|mD|m=|m6|m/|m(|m!|m|m|m |m|mþ{m÷{mð{mé{mâ{mÛ{mÔ{mÍ{mÆ{m¿{m¸{m±{mª{m£{mœ{m•{mŽ{m‡{m€{my{mr{mk{md{m]{mV{mO{mH{mA{m:{m3{m,{m%{m{m{m{m {m{mûzmôzmízmæzmßzmØzmÑzmÊzmÃzm¼zmµzm®zm§zm zm™zm’zm‹zm„zm}zmvzmozmhzmazmZzmSzmLzmEzm>zm7zm0zm)zm"zmzmzm zmzmÿymøymñymêymãymÜymÕymÎymÇymÀym¹ym²ym«ym¤ymym–ymymˆymymzymsymlymeym^ymWymPymIymBym;ym4ym-ym&ymymymym ymymüxmõxmîxmçxmàxmÙxmÒxmËxmÄxm½xm¶xm¯xm¨xm¡xmšxm“xmŒxm…xm~xmwxmpxmixmbxm[xmTxmMxmFxm?xm8xm1xm*xm#xmxmxmxmxmxmùwmòwmëwmäwmÝwmÖwmÏwmÈwmÁwmºwm³wm¬wm¥wmžwm—wmwm‰wm‚wm{wmtwmmwmfwm_wmXwmQwmJwmCwmsm7sm0sm)sm"smsmsm smsmÿrmørmñrmêrmãrmÜrmÕrmÎrmÇrmÀrm¹rm²rm«rm¤rmrm–rmrmˆrmrmzrmsrmlrmerm^rmWrmPrmIrmBrm;rm4rm-rm&rmrmrmrm rmrmüqmõqmîqmçqmàqmÙqmÒqmËqmÄqm½qm¶qm¯qm¨qm¡qmšqm“qmŒqm…qm~qmwqmpqmiqmbqm[qmTqmMqmFqm?qm8qm1qm*qm#qmqmqmqmqmqmùpmòpmëpmäpmÝpmÖpmÏpmÈpmÁpmºpm³pm¬pm¥pmžpm—pmpm‰pm‚pm{pmtpmmpmfpm_pmXpmQpmJpmCpmlm7lm0lm)lm"lmlmlm lmlmÿkmøkmñkmêkmãkmÜkmÕkmÎkmÇkmÀkm¹km²km«km¤kmkm–kmkmˆkmkmzkmskmlkmekm^kmWkmPkmIkmBkm;km4km-km&kmkmkmkm kmkmüjmõjmîjmçjmàjmÙjmÒjmËjmÄjm½jm¶jm¯jm¨jm¡jmšjm“jmŒjm…jm~jmwjmpjmijmbjm[jmTjmMjmFjm?jm8jm1jm*jm#jmjmjmjmjmjmùimòimëimäimÝimÖimÏimÈimÁimºim³im¬im¥imžim—imim‰im‚im{imtimmimfim_imXimQimJimCimem7em0em)em"ememem ememÿdmødmñdmêdmãdmÜdmÕdmÎdmÇdmÀdm¹dm²dm«dm¤dmdm–dmdmˆdmdmzdmsdmldmedm^dmWdmPdmIdmBdm;dm4dm-dm&dmdmdmdm dmdmücmõcmîcmçcmàcmÙcmÒcmËcmÄcm½cm¶cm¯cm¨cm¡cmšcm“cmŒcm…cm~cmwcmpcmicmbcm[cmTcmMcmFcm?cm8cm1cm*cm#cmcmcmcmcmcmùbmòbmëbmäbmÝbmÖbmÏbmÈbmÁbmºbm³bm¬bm¥bmžbm—bmbm‰bm‚bm{bmtbmmbmfbm_bmXbmQbmJbmCbm^m7^m0^m)^m"^m^m^m ^m^mÿ]mø]mñ]mê]mã]mÜ]mÕ]mÎ]mÇ]mÀ]m¹]m²]m«]m¤]m]m–]m]mˆ]m]mz]ms]ml]me]m^]mW]mP]mI]mB]m;]m4]m-]m&]m]m]m]m ]m]mü\mõ\mî\mç\mà\mÙ\mÒ\mË\mÄ\m½\m¶\m¯\m¨\m¡\mš\m“\mŒ\m…\m~\mw\mp\mi\mb\m[\mT\mM\mF\m?\m8\m1\m*\m#\m\m\m\m\m\mù[mò[më[mä[mÝ[mÖ[mÏ[mÈ[mÁ[mº[m³[m¬[m¥[mž[m—[m[m‰[m‚[m{[mt[mm[mf[m_[mX[mQ[mJ[mC[m<[m5[m.[m'[m [m[m[m [m[mýZmöZmïZmèZmáZmÚZmÓZmÌZmÅZm¾Zm·Zm°Zm©Zm¢Zm›Zm”ZmZm†ZmZmxZmqZmjZmcZm\ZmUZmNZmGZm@Zm9Zm2Zm+Zm$ZmZmZmZmZmZmúYmóYmìYmåYmÞYm×YmÐYmÉYmÂYm»Ym´Ym­Ym¦YmŸYm˜Ym‘YmŠYmƒYm|YmuYmnYmgYm`YmYYmRYmKYmDYm=Ym6Ym/Ym(Ym!YmYmYm YmYmþXm÷XmðXméXmâXmÛXmÔXmÍXmÆXm¿Xm¸Xm±XmªXm£XmœXm•XmŽXm‡Xm€XmyXmrXmkXmdXm]XmVXmOXmHXmAXm:Xm3Xm,Xm%XmXmXmXm XmXmûWmôWmíWmæWmßWmØWmÑWmÊWmÃWm¼WmµWm®Wm§Wm Wm™Wm’Wm‹Wm„Wm}WmvWmoWmhWmaWmZWmSWmLWmEWm>Wm7Wm0Wm)Wm"WmWmWm WmWmÿVmøVmñVmêVmãVmÜVmÕVmÎVmÇVmÀVm¹Vm²Vm«Vm¤VmVm–VmVmˆVmVmzVmsVmlVmeVm^VmWVmPVmIVmBVm;Vm4Vm-Vm&VmVmVmVm VmVmüUmõUmîUmçUmàUmÙUmÒUmËUmÄUm½Um¶Um¯Um¨Um¡UmšUm“UmŒUm…Um~UmwUmpUmiUmbUm[UmTUmMUmFUm?Um8Um1Um*Um#UmUmUmUmUmUmùTmòTmëTmäTmÝTmÖTmÏTmÈTmÁTmºTm³Tm¬Tm¥TmžTm—TmTm‰Tm‚Tm{TmtTmmTmfTm_TmXTmQTmJTmCTmPm7Pm0Pm)Pm"PmPmPm PmPmÿOmøOmñOmêOmãOmÜOmÕOmÎOmÇOmÀOm¹Om²Om«Om¤OmOm–OmOmˆOmOmzOmsOmlOmeOm^OmWOmPOmIOmBOm;Om4Om-Om&OmOmOmOm OmOmüNmõNmîNmçNmàNmÙNmÒNmËNmÄNm½Nm¶Nm¯Nm¨Nm¡NmšNm“NmŒNm…Nm~NmwNmpNmiNmbNm[NmTNmMNmFNm?Nm8Nm1Nm*Nm#NmNmNmNmNmNmùMmòMmëMmäMmÝMmÖMmÏMmÈMmÁMmºMm³Mm¬Mm¥MmžMm—MmMm‰Mm‚Mm{MmtMmmMmfMm_MmXMmQMmJMmCMmIm7Im0Im)Im"ImImIm ImImÿHmøHmñHmêHmãHmÜHmÕHmÎHmÇHmÀHm¹Hm²Hm«Hm¤HmHm–HmHmˆHmHmzHmsHmlHmeHm^HmWHmPHmIHmBHm;Hm4Hm-Hm&HmHmHmHm HmHmüGmõGmîGmçGmàGmÙGmÒGmËGmÄGm½Gm¶Gm¯Gm¨Gm¡GmšGm“GmŒGm…Gm~GmwGmpGmiGmbGm[GmTGmMGmFGm?Gm8Gm1Gm*Gm#GmGmGmGmGmGmùFmòFmëFmäFmÝFmÖFmÏFmÈFmÁFmºFm³Fm¬Fm¥FmžFm—FmFm‰Fm‚Fm{FmtFmmFmfFm_FmXFmQFmJFmCFmBm7Bm0Bm)Bm"BmBmBm BmBmÿAmøAmñAmêAmãAmÜAmÕAmÎAmÇAmÀAm¹Am²Am«Am¤AmAm–AmAmˆAmAmzAmsAmlAmeAm^AmWAmPAmIAmBAm;Am4Am-Am&AmAmAmAm AmAmü@mõ@mî@mç@mà@mÙ@mÒ@mË@mÄ@m½@m¶@m¯@m¨@m¡@mš@m“@mŒ@m…@m~@mw@mp@mi@mb@m[@mT@mM@mF@m?@m8@m1@m*@m#@m@m@m@m@m@mù?mò?më?mä?mÝ?mÖ?mÏ?mÈ?mÁ?mº?m³?m¬?m¥?mž?m—?m?m‰?m‚?m{?mt?mm?mf?m_?mX?mQ?mJ?mC?mmö>mï>mè>má>mÚ>mÓ>mÌ>mÅ>m¾>m·>m°>m©>m¢>m›>m”>m>m†>m>mx>mq>mj>mc>m\>mU>mN>mG>m@>m9>m2>m+>m$>m>m>m>m>m>mú=mó=mì=må=mÞ=m×=mÐ=mÉ=mÂ=m»=m´=m­=m¦=mŸ=m˜=m‘=mŠ=mƒ=m|=mu=mn=mg=m`=mY=mR=mK=mD=m==m6=m/=m(=m!=m=m=m =m=mþ;m7;m0;m);m";m;m;m ;m;mÿ:mø:mñ:mê:mã:mÜ:mÕ:mÎ:mÇ:mÀ:m¹:m²:m«:m¤:m:m–:m:mˆ:m:mz:ms:ml:me:m^:mW:mP:mI:mB:m;:m4:m-:m&:m:m:m:m :m:mü9mõ9mî9mç9mà9mÙ9mÒ9mË9mÄ9m½9m¶9m¯9m¨9m¡9mš9m“9mŒ9m…9m~9mw9mp9mi9mb9m[9mT9mM9mF9m?9m89m19m*9m#9m9m9m9m9m9mù8mò8më8mä8mÝ8mÖ8mÏ8mÈ8mÁ8mº8m³8m¬8m¥8mž8m—8m8m‰8m‚8m{8mt8mm8mf8m_8mX8mQ8mJ8mC8m<8m58m.8m'8m 8m8m8m 8m8mý7mö7mï7mè7má7mÚ7mÓ7mÌ7mÅ7m¾7m·7m°7m©7m¢7m›7m”7m7m†7m7mx7mq7mj7mc7m\7mU7mN7mG7m@7m97m27m+7m$7m7m7m7m7m7mú6mó6mì6må6mÞ6m×6mÐ6mÉ6mÂ6m»6m´6m­6m¦6mŸ6m˜6m‘6mŠ6mƒ6m|6mu6mn6mg6m`6mY6mR6mK6mD6m=6m66m/6m(6m!6m6m6m 6m6mþ5m÷5mð5mé5mâ5mÛ5mÔ5mÍ5mÆ5m¿5m¸5m±5mª5m£5mœ5m•5mŽ5m‡5m€5my5mr5mk5md5m]5mV5mO5mH5mA5m:5m35m,5m%5m5m5m5m 5m5mû4mô4mí4mæ4mß4mØ4mÑ4mÊ4mÃ4m¼4mµ4m®4m§4m 4m™4m’4m‹4m„4m}4mv4mo4mh4ma4mZ4mS4mL4mE4m>4m74m04m)4m"4m4m4m 4m4mÿ3mø3mñ3mê3mã3mÜ3mÕ3mÎ3mÇ3mÀ3m¹3m²3m«3m¤3m3m–3m3mˆ3m3mz3ms3ml3me3m^3mW3mP3mI3mB3m;3m43m-3m&3m3m3m3m 3m3mü2mõ2mî2mç2mà2mÙ2mÒ2mË2mÄ2m½2m¶2m¯2m¨2m¡2mš2m“2mŒ2m…2m~2mw2mp2mi2mb2m[2mT2mM2mF2m?2m82m12m*2m#2m2m2m2m2m2mù1mò1më1mä1mÝ1mÖ1mÏ1mÈ1mÁ1mº1m³1m¬1m¥1mž1m—1m1m‰1m‚1m{1mt1mm1mf1m_1mX1mQ1mJ1mC1m<1m51m.1m'1m 1m1m1m 1m1mý0mö0mï0mè0má0mÚ0mÓ0mÌ0mÅ0m¾0m·0m°0m©0m¢0m›0m”0m0m†0m0mx0mq0mj0mc0m\0mU0mN0mG0m@0m90m20m+0m$0m0m0m0m0m0mú/mó/mì/må/mÞ/m×/mÐ/mÉ/mÂ/m»/m´/m­/m¦/mŸ/m˜/m‘/mŠ/mƒ/m|/mu/mn/mg/m`/mY/mR/mK/mD/m=/m6/m//m(/m!/m/m/m /m/mþ.m÷.mð.mé.mâ.mÛ.mÔ.mÍ.mÆ.m¿.m¸.m±.mª.m£.mœ.m•.mŽ.m‡.m€.my.mr.mk.md.m].mV.mO.mH.mA.m:.m3.m,.m%.m.m.m.m .m.mû-mô-mí-mæ-mß-mØ-mÑ-mÊ-mÃ-m¼-mµ-m®-m§-m -m™-m’-m‹-m„-m}-mv-mo-mh-ma-mZ-mS-mL-mE-m>-m7-m0-m)-m"-m-m-m -m-mÿ,mø,mñ,mê,mã,mÜ,mÕ,mÎ,mÇ,mÀ,m¹,m²,m«,m¤,m,m–,m,mˆ,m,mz,ms,ml,me,m^,mW,mP,mI,mB,m;,m4,m-,m&,m,m,m,m ,m,mü+mõ+mî+mç+mà+mÙ+mÒ+mË+mÄ+m½+m¶+m¯+m¨+m¡+mš+m“+mŒ+m…+m~+mw+mp+mi+mb+m[+mT+mM+mF+m?+m8+m1+m*+m#+m+m+m+m+m+mù*mò*më*mä*mÝ*mÖ*mÏ*mÈ*mÁ*mº*m³*m¬*m¥*mž*m—*m*m‰*m‚*m{*mt*mm*mf*m_*mX*mQ*mJ*mC*m<*m5*m.*m'*m *m*m*m *m*mý)mö)mï)mè)má)mÚ)mÓ)mÌ)mÅ)m¾)m·)m°)m©)m¢)m›)m”)m)m†)m)mx)mq)mj)mc)m\)mU)mN)mG)m@)m9)m2)m+)m$)m)m)m)m)m)mú(mó(mì(må(mÞ(m×(mÐ(mÉ(mÂ(m»(m´(m­(m¦(mŸ(m˜(m‘(mŠ(mƒ(m|(mu(mn(mg(m`(mY(mR(mK(mD(m=(m6(m/(m((m!(m(m(m (m(mþ'm÷'mð'mé'mâ'mÛ'mÔ'mÍ'mÆ'm¿'m¸'m±'mª'm£'mœ'm•'mŽ'm‡'m€'my'mr'mk'md'm]'mV'mO'mH'mA'm:'m3'm,'m%'m'm'm'm 'm'mû&mô&mí&mæ&mß&mØ&mÑ&mÊ&mÃ&m¼&mµ&m®&m§&m &m™&m’&m‹&m„&m}&mv&mo&mh&ma&mZ&mS&mL&mE&m>&m7&m0&m)&m"&m&m&m &m&mÿ%mø%mñ%mê%mã%mÜ%mÕ%mÎ%mÇ%mÀ%m¹%m²%m«%m¤%m%m–%m%mˆ%m%mz%ms%ml%me%m^%mW%mP%mI%mB%m;%m4%m-%m&%m%m%m%m %m%mü$mõ$mî$mç$mà$mÙ$mÒ$mË$mÄ$m½$m¶$m¯$m¨$m¡$mš$m“$mŒ$m…$m~$mw$mp$mi$mb$m[$mT$mM$mF$m?$m8$m1$m*$m#$m$m$m$m$m$mù#mò#më#mä#mÝ#mÖ#mÏ#mÈ#mÁ#mº#m³#m¬#m¥#mž#m—#m#m‰#m‚#m{#mt#mm#mf#m_#mX#mQ#mJ#mC#m<#m5#m.#m'#m #m#m#m #m#mý"mö"mï"mè"má"mÚ"mÓ"mÌ"mÅ"m¾"m·"m°"m©"m¢"m›"m”"m"m†"m"mx"mq"mj"mc"m\"mU"mN"mG"m@"m9"m2"m+"m$"m"m"m"m"m"mú!mó!mì!må!mÞ!m×!mÐ!mÉ!mÂ!m»!m´!m­!m¦!mŸ!m˜!m‘!mŠ!mƒ!m|!mu!mn!mg!m`!mY!mR!mK!mD!m=!m6!m/!m(!m!!m!m!m !m!mþ m÷ mð mé mâ mÛ mÔ mÍ mÆ m¿ m¸ m± mª m£ mœ m• mŽ m‡ m€ my mr mk md m] mV mO mH mA m: m3 m, m% m m m m m mûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmýmömïmèmámÚmÓmÌmÅm¾m·m°m©m¢m›m”mm†mmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmúmómìmåmÞm×mÐmÉmÂm»m´m­m¦mŸm˜m‘mŠmƒm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmþm÷mðmémâmÛmÔmÍmÆm¿m¸m±mªm£mœm•mŽm‡m€mymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmýmömïmèmámÚmÓmÌmÅm¾m·m°m©m¢m›m”mm†mmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmúmómìmåmÞm×mÐmÉmÂm»m´m­m¦mŸm˜m‘mŠmƒm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmþm÷mðmémâmÛmÔmÍmÆm¿m¸m±mªm£mœm•mŽm‡m€mymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmý mö mï mè má mÚ mÓ mÌ mÅ m¾ m· m° m© m¢ m› m” m m† m mx mq mj mc m\ mU mN mG m@ m9 m2 m+ m$ m m m m m mú mó mì må mÞ m× mÐ mÉ m m» m´ m­ m¦ mŸ m˜ m‘ mŠ mƒ m| mu mn mg m` mY mR mK mD m= m6 m/ m( m! m m m m mþ m÷ mð mé mâ mÛ mÔ mÍ mÆ m¿ m¸ m± mª m£ mœ m• mŽ m‡ m€ my mr mk md m] mV mO mH mA m: m3 m, m% m m m m m mû mô mí mæ mß mØ mÑ mÊ mà m¼ mµ m® m§ m  m™ m’ m‹ m„ m} mv mo mh ma mZ mS mL mE m> m7 m0 m) m" m m m m mÿ mø mñ mê mã mÜ mÕ mÎ mÇ mÀ m¹ m² m« m¤ m m– m mˆ m mz ms ml me m^ mW mP mI mB m; m4 m- m& m m m m m mümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmýmömïmèmámÚmÓmÌmÅm¾m·m°m©m¢m›m”mm†mmxmqmjmcm\mUmNmGm@m9m2m+m$mmmmmmúmómìmåmÞm×mÐmÉmÂm»m´m­m¦mŸm˜m‘mŠmƒm|mumnmgm`mYmRmKmDm=m6m/m(m!mmm mmþm÷mðmémâmÛmÔmÍmÆm¿m¸m±mªm£mœm•mŽm‡m€mymrmkmdm]mVmOmHmAm:m3m,m%mmmm mmûmômímæmßmØmÑmÊmÃm¼mµm®m§m m™m’m‹m„m}mvmomhmamZmSmLmEm>m7m0m)m"mmm mmÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCm<m5m.m'm mmm mmýÿlöÿlïÿlèÿláÿlÚÿlÓÿlÌÿlÅÿl¾ÿl·ÿl°ÿl©ÿl¢ÿl›ÿl”ÿlÿl†ÿlÿlxÿlqÿljÿlcÿl\ÿlUÿlNÿlGÿl@ÿl9ÿl2ÿl+ÿl$ÿlÿlÿlÿlÿlÿlúþlóþlìþlåþlÞþl×þlÐþlÉþlÂþl»þl´þl­þl¦þlŸþl˜þl‘þlŠþlƒþl|þluþlnþlgþl`þlYþlRþlKþlDþl=þl6þl/þl(þl!þlþlþl þlþlþýl÷ýlðýléýlâýlÛýlÔýlÍýlÆýl¿ýl¸ýl±ýlªýl£ýlœýl•ýlŽýl‡ýl€ýlyýlrýlkýldýl]ýlVýlOýlHýlAýl:ýl3ýl,ýl%ýlýlýlýl ýlýlûülôülíülæülßülØülÑülÊülÃül¼ülµül®ül§ül ül™ül’ül‹ül„ül}ülvüloülhülaülZülSülLülEül>ül7ül0ül)ül"ülülül ülülÿûløûlñûlêûlãûlÜûlÕûlÎûlÇûlÀûl¹ûl²ûl«ûl¤ûlûl–ûlûlˆûlûlzûlsûllûleûl^ûlWûlPûlIûlBûl;ûl4ûl-ûl&ûlûlûlûl ûlûlüúlõúlîúlçúlàúlÙúlÒúlËúlÄúl½úl¶úl¯úl¨úl¡úlšúl“úlŒúl…úl~úlwúlpúliúlbúl[úlTúlMúlFúl?úl8úl1úl*úl#úlúlúlúlúlúlùùlòùlëùläùlÝùlÖùlÏùlÈùlÁùlºùl³ùl¬ùl¥ùlžùl—ùlùl‰ùl‚ùl{ùltùlmùlfùl_ùlXùlQùlJùlCùl<ùl5ùl.ùl'ùl ùlùlùl ùlùlýølöølïølèøláølÚølÓølÌølÅøl¾øl·øl°øl©øl¢øl›øl”øløl†ølølxølqøljølcøl\ølUølNølGøl@øl9øl2øl+øl$ølølølølølølú÷ló÷lì÷lå÷lÞ÷l×÷lÐ÷lÉ÷lÂ÷l»÷l´÷l­÷l¦÷lŸ÷l˜÷l‘÷lŠ÷lƒ÷l|÷lu÷ln÷lg÷l`÷lY÷lR÷lK÷lD÷l=÷l6÷l/÷l(÷l!÷l÷l÷l ÷l÷lþöl÷ölðöléölâölÛölÔölÍölÆöl¿öl¸öl±ölªöl£ölœöl•ölŽöl‡öl€ölyölrölköldöl]ölVölOölHölAöl:öl3öl,öl%ölölölöl ölölûõlôõlíõlæõlßõlØõlÑõlÊõlÃõl¼õlµõl®õl§õl õl™õl’õl‹õl„õl}õlvõloõlhõlaõlZõlSõlLõlEõl>õl7õl0õl)õl"õlõlõl õlõlÿôløôlñôlêôlãôlÜôlÕôlÎôlÇôlÀôl¹ôl²ôl«ôl¤ôlôl–ôlôlˆôlôlzôlsôllôleôl^ôlWôlPôlIôlBôl;ôl4ôl-ôl&ôlôlôlôl ôlôlüólõólîólçólàólÙólÒólËólÄól½ól¶ól¯ól¨ól¡ólšól“ólŒól…ól~ólwólpóliólból[ólTólMólFól?ól8ól1ól*ól#ólólólólólólùòlòòlëòläòlÝòlÖòlÏòlÈòlÁòlºòl³òl¬òl¥òlžòl—òlòl‰òl‚òl{òltòlmòlfòl_òlXòlQòlJòlCòl<òl5òl.òl'òl òlòlòl òlòlýñlöñlïñlèñláñlÚñlÓñlÌñlÅñl¾ñl·ñl°ñl©ñl¢ñl›ñl”ñlñl†ñlñlxñlqñljñlcñl\ñlUñlNñlGñl@ñl9ñl2ñl+ñl$ñlñlñlñlñlñlúðlóðlìðlåðlÞðl×ðlÐðlÉðlÂðl»ðl´ðl­ðl¦ðlŸðl˜ðl‘ðlŠðlƒðl|ðluðlnðlgðl`ðlYðlRðlKðlDðl=ðl6ðl/ðl(ðl!ðlðlðl ðlðlþïl÷ïlðïléïlâïlÛïlÔïlÍïlÆïl¿ïl¸ïl±ïlªïl£ïlœïl•ïlŽïl‡ïl€ïlyïlrïlkïldïl]ïlVïlOïlHïlAïl:ïl3ïl,ïl%ïlïlïlïl ïlïlûîlôîlíîlæîlßîlØîlÑîlÊîlÃîl¼îlµîl®îl§îl îl™îl’îl‹îl„îl}îlvîloîlhîlaîlZîlSîlLîlEîl>îl7îl0îl)îl"îlîlîl îlîlÿíløílñílêílãílÜílÕílÎílÇílÀíl¹íl²íl«íl¤ílíl–ílílˆílílzílsíllíleíl^ílWílPílIílBíl;íl4íl-íl&ílílílíl ílílüìlõìlîìlçìlàìlÙìlÒìlËìlÄìl½ìl¶ìl¯ìl¨ìl¡ìlšìl“ìlŒìl…ìl~ìlwìlpìliìlbìl[ìlTìlMìlFìl?ìl8ìl1ìl*ìl#ìlìlìlìlìlìlùëlòëlëëläëlÝëlÖëlÏëlÈëlÁëlºël³ël¬ël¥ëlžël—ëlël‰ël‚ël{ëltëlmëlfël_ëlXëlQëlJëlCël<ël5ël.ël'ël ëlëlël ëlëlýêlöêlïêlèêláêlÚêlÓêlÌêlÅêl¾êl·êl°êl©êl¢êl›êl”êlêl†êlêlxêlqêljêlcêl\êlUêlNêlGêl@êl9êl2êl+êl$êlêlêlêlêlêlúélóélìélåélÞél×élÐélÉélÂél»él´él­él¦élŸél˜él‘élŠélƒél|éluélnélgél`élYélRélKélDél=él6él/él(él!élélél élélþèl÷èlðèléèlâèlÛèlÔèlÍèlÆèl¿èl¸èl±èlªèl£èlœèl•èlŽèl‡èl€èlyèlrèlkèldèl]èlVèlOèlHèlAèl:èl3èl,èl%èlèlèlèl èlèlûçlôçlíçlæçlßçlØçlÑçlÊçlÃçl¼çlµçl®çl§çl çl™çl’çl‹çl„çl}çlvçloçlhçlaçlZçlSçlLçlEçl>çl7çl0çl)çl"çlçlçl çlçlÿæløælñælêælãælÜælÕælÎælÇælÀæl¹æl²æl«æl¤ælæl–ælælˆælælzælsællæleæl^ælWælPælIælBæl;æl4æl-æl&ælælælæl ælælüålõålîålçålàålÙålÒålËålÄål½ål¶ål¯ål¨ål¡ålšål“ålŒål…ål~ålwålpåliålbål[ålTålMålFål?ål8ål1ål*ål#ålålålålålålùälòälëäläälÝälÖälÏälÈälÁälºäl³äl¬äl¥älžäl—äläl‰äl‚äl{ältälmälfäl_älXälQälJälCäl<äl5äl.äl'äl äläläl älälýãlöãlïãlèãláãlÚãlÓãlÌãlÅãl¾ãl·ãl°ãl©ãl¢ãl›ãl”ãlãl†ãlãlxãlqãljãlcãl\ãlUãlNãlGãl@ãl9ãl2ãl+ãl$ãlãlãlãlãlãlúâlóâlìâlåâlÞâl×âlÐâlÉâlÂâl»âl´âl­âl¦âlŸâl˜âl‘âlŠâlƒâl|âluâlnâlgâl`âlYâlRâlKâlDâl=âl6âl/âl(âl!âlâlâl âlâlþál÷álðáléálâálÛálÔálÍálÆál¿ál¸ál±álªál£álœál•álŽál‡ál€ályálrálkáldál]álVálOálHálAál:ál3ál,ál%álálálál álálûàlôàlíàlæàlßàlØàlÑàlÊàlÃàl¼àlµàl®àl§àl àl™àl’àl‹àl„àl}àlvàloàlhàlaàlZàlSàlLàlEàl>àl7àl0àl)àl"àlàlàl àlàlÿßløßlñßlêßlãßlÜßlÕßlÎßlÇßlÀßl¹ßl²ßl«ßl¤ßlßl–ßlßlˆßlßlzßlsßllßleßl^ßlWßlPßlIßlBßl;ßl4ßl-ßl&ßlßlßlßl ßlßlüÞlõÞlîÞlçÞlàÞlÙÞlÒÞlËÞlÄÞl½Þl¶Þl¯Þl¨Þl¡ÞlšÞl“ÞlŒÞl…Þl~ÞlwÞlpÞliÞlbÞl[ÞlTÞlMÞlFÞl?Þl8Þl1Þl*Þl#ÞlÞlÞlÞlÞlÞlùÝlòÝlëÝläÝlÝÝlÖÝlÏÝlÈÝlÁÝlºÝl³Ýl¬Ýl¥ÝlžÝl—ÝlÝl‰Ýl‚Ýl{ÝltÝlmÝlfÝl_ÝlXÝlQÝlJÝlCÝl<Ýl5Ýl.Ýl'Ýl ÝlÝlÝl ÝlÝlýÜlöÜlïÜlèÜláÜlÚÜlÓÜlÌÜlÅÜl¾Ül·Ül°Ül©Ül¢Ül›Ül”ÜlÜl†ÜlÜlxÜlqÜljÜlcÜl\ÜlUÜlNÜlGÜl@Ül9Ül2Ül+Ül$ÜlÜlÜlÜlÜlÜlúÛlóÛlìÛlåÛlÞÛl×ÛlÐÛlÉÛlÂÛl»Ûl´Ûl­Ûl¦ÛlŸÛl˜Ûl‘ÛlŠÛlƒÛl|ÛluÛlnÛlgÛl`ÛlYÛlRÛlKÛlDÛl=Ûl6Ûl/Ûl(Ûl!ÛlÛlÛl ÛlÛlþÚl÷ÚlðÚléÚlâÚlÛÚlÔÚlÍÚlÆÚl¿Úl¸Úl±ÚlªÚl£ÚlœÚl•ÚlŽÚl‡Úl€ÚlyÚlrÚlkÚldÚl]ÚlVÚlOÚlHÚlAÚl:Úl3Úl,Úl%ÚlÚlÚlÚl ÚlÚlûÙlôÙlíÙlæÙlßÙlØÙlÑÙlÊÙlÃÙl¼ÙlµÙl®Ùl§Ùl Ùl™Ùl’Ùl‹Ùl„Ùl}ÙlvÙloÙlhÙlaÙlZÙlSÙlLÙlEÙl>Ùl7Ùl0Ùl)Ùl"ÙlÙlÙl ÙlÙlÿØløØlñØlêØlãØlÜØlÕØlÎØlÇØlÀØl¹Øl²Øl«Øl¤ØlØl–ØlØlˆØlØlzØlsØllØleØl^ØlWØlPØlIØlBØl;Øl4Øl-Øl&ØlØlØlØl ØlØlü×lõ×lî×lç×là×lÙ×lÒ×lË×lÄ×l½×l¶×l¯×l¨×l¡×lš×l“×lŒ×l…×l~×lw×lp×li×lb×l[×lT×lM×lF×l?×l8×l1×l*×l#×l×l×l×l×l×lùÖlòÖlëÖläÖlÝÖlÖÖlÏÖlÈÖlÁÖlºÖl³Öl¬Öl¥ÖlžÖl—ÖlÖl‰Öl‚Öl{ÖltÖlmÖlfÖl_ÖlXÖlQÖlJÖlCÖl<Öl5Öl.Öl'Öl ÖlÖlÖl ÖlÖlýÕlöÕlïÕlèÕláÕlÚÕlÓÕlÌÕlÅÕl¾Õl·Õl°Õl©Õl¢Õl›Õl”ÕlÕl†ÕlÕlxÕlqÕljÕlcÕl\ÕlUÕlNÕlGÕl@Õl9Õl2Õl+Õl$ÕlÕlÕlÕlÕlÕlúÔlóÔlìÔlåÔlÞÔl×ÔlÐÔlÉÔlÂÔl»Ôl´Ôl­Ôl¦ÔlŸÔl˜Ôl‘ÔlŠÔlƒÔl|ÔluÔlnÔlgÔl`ÔlYÔlRÔlKÔlDÔl=Ôl6Ôl/Ôl(Ôl!ÔlÔlÔl ÔlÔlþÓl÷ÓlðÓléÓlâÓlÛÓlÔÓlÍÓlÆÓl¿Ól¸Ól±ÓlªÓl£ÓlœÓl•ÓlŽÓl‡Ól€ÓlyÓlrÓlkÓldÓl]ÓlVÓlOÓlHÓlAÓl:Ól3Ól,Ól%ÓlÓlÓlÓl ÓlÓlûÒlôÒlíÒlæÒlßÒlØÒlÑÒlÊÒlÃÒl¼ÒlµÒl®Òl§Òl Òl™Òl’Òl‹Òl„Òl}ÒlvÒloÒlhÒlaÒlZÒlSÒlLÒlEÒl>Òl7Òl0Òl)Òl"ÒlÒlÒl ÒlÒlÿÑløÑlñÑlêÑlãÑlÜÑlÕÑlÎÑlÇÑlÀÑl¹Ñl²Ñl«Ñl¤ÑlÑl–ÑlÑlˆÑlÑlzÑlsÑllÑleÑl^ÑlWÑlPÑlIÑlBÑl;Ñl4Ñl-Ñl&ÑlÑlÑlÑl ÑlÑlüÐlõÐlîÐlçÐlàÐlÙÐlÒÐlËÐlÄÐl½Ðl¶Ðl¯Ðl¨Ðl¡ÐlšÐl“ÐlŒÐl…Ðl~ÐlwÐlpÐliÐlbÐl[ÐlTÐlMÐlFÐl?Ðl8Ðl1Ðl*Ðl#ÐlÐlÐlÐlÐlÐlùÏlòÏlëÏläÏlÝÏlÖÏlÏÏlÈÏlÁÏlºÏl³Ïl¬Ïl¥ÏlžÏl—ÏlÏl‰Ïl‚Ïl{ÏltÏlmÏlfÏl_ÏlXÏlQÏlJÏlCÏl<Ïl5Ïl.Ïl'Ïl ÏlÏlÏl ÏlÏlýÎlöÎlïÎlèÎláÎlÚÎlÓÎlÌÎlÅÎl¾Îl·Îl°Îl©Îl¢Îl›Îl”ÎlÎl†ÎlÎlxÎlqÎljÎlcÎl\ÎlUÎlNÎlGÎl@Îl9Îl2Îl+Îl$ÎlÎlÎlÎlÎlÎlúÍlóÍlìÍlåÍlÞÍl×ÍlÐÍlÉÍlÂÍl»Íl´Íl­Íl¦ÍlŸÍl˜Íl‘ÍlŠÍlƒÍl|ÍluÍlnÍlgÍl`ÍlYÍlRÍlKÍlDÍl=Íl6Íl/Íl(Íl!ÍlÍlÍl ÍlÍlþÌl÷ÌlðÌléÌlâÌlÛÌlÔÌlÍÌlÆÌl¿Ìl¸Ìl±ÌlªÌl£ÌlœÌl•ÌlŽÌl‡Ìl€ÌlyÌlrÌlkÌldÌl]ÌlVÌlOÌlHÌlAÌl:Ìl3Ìl,Ìl%ÌlÌlÌlÌl ÌlÌlûËlôËlíËlæËlßËlØËlÑËlÊËlÃËl¼ËlµËl®Ël§Ël Ël™Ël’Ël‹Ël„Ël}ËlvËloËlhËlaËlZËlSËlLËlEËl>Ël7Ël0Ël)Ël"ËlËlËl ËlËlÿÊløÊlñÊlêÊlãÊlÜÊlÕÊlÎÊlÇÊlÀÊl¹Êl²Êl«Êl¤ÊlÊl–ÊlÊlˆÊlÊlzÊlsÊllÊleÊl^ÊlWÊlPÊlIÊlBÊl;Êl4Êl-Êl&ÊlÊlÊlÊl ÊlÊlüÉlõÉlîÉlçÉlàÉlÙÉlÒÉlËÉlÄÉl½Él¶Él¯Él¨Él¡ÉlšÉl“ÉlŒÉl…Él~ÉlwÉlpÉliÉlbÉl[ÉlTÉlMÉlFÉl?Él8Él1Él*Él#ÉlÉlÉlÉlÉlÉlùÈlòÈlëÈläÈlÝÈlÖÈlÏÈlÈÈlÁÈlºÈl³Èl¬Èl¥ÈlžÈl—ÈlÈl‰Èl‚Èl{ÈltÈlmÈlfÈl_ÈlXÈlQÈlJÈlCÈl<Èl5Èl.Èl'Èl ÈlÈlÈl ÈlÈlýÇlöÇlïÇlèÇláÇlÚÇlÓÇlÌÇlÅÇl¾Çl·Çl°Çl©Çl¢Çl›Çl”ÇlÇl†ÇlÇlxÇlqÇljÇlcÇl\ÇlUÇlNÇlGÇl@Çl9Çl2Çl+Çl$ÇlÇlÇlÇlÇlÇlúÆlóÆlìÆlåÆlÞÆlׯlÐÆlÉÆlÂÆl»Æl´Æl­Æl¦ÆlŸÆl˜Æl‘ÆlŠÆlƒÆl|ÆluÆlnÆlgÆl`ÆlYÆlRÆlKÆlDÆl=Æl6Æl/Æl(Æl!ÆlÆlÆl ÆlÆlþÅl÷ÅlðÅléÅlâÅlÛÅlÔÅlÍÅlÆÅl¿Ål¸Ål±ÅlªÅl£ÅlœÅl•ÅlŽÅl‡Ål€ÅlyÅlrÅlkÅldÅl]ÅlVÅlOÅlHÅlAÅl:Ål3Ål,Ål%ÅlÅlÅlÅl ÅlÅlûÄlôÄlíÄlæÄlßÄlØÄlÑÄlÊÄlÃÄl¼ÄlµÄl®Äl§Äl Äl™Äl’Äl‹Äl„Äl}ÄlvÄloÄlhÄlaÄlZÄlSÄlLÄlEÄl>Äl7Äl0Äl)Äl"ÄlÄlÄl ÄlÄlÿÃløÃlñÃlêÃlãÃlÜÃlÕÃlÎÃlÇÃlÀÃl¹Ãl²Ãl«Ãl¤ÃlÃl–ÃlÃlˆÃlÃlzÃlsÃllÃleÃl^ÃlWÃlPÃlIÃlBÃl;Ãl4Ãl-Ãl&ÃlÃlÃlÃl ÃlÃlüÂlõÂlîÂlçÂlàÂlÙÂlÒÂlËÂlÄÂl½Âl¶Âl¯Âl¨Âl¡ÂlšÂl“ÂlŒÂl…Âl~ÂlwÂlpÂliÂlbÂl[ÂlTÂlMÂlFÂl?Âl8Âl1Âl*Âl#ÂlÂlÂlÂlÂlÂlùÁlòÁlëÁläÁlÝÁlÖÁlÏÁlÈÁlÁÁlºÁl³Ál¬Ál¥ÁlžÁl—ÁlÁl‰Ál‚Ál{ÁltÁlmÁlfÁl_ÁlXÁlQÁlJÁlCÁl<Ál5Ál.Ál'Ál ÁlÁlÁl ÁlÁlýÀlöÀlïÀlèÀláÀlÚÀlÓÀlÌÀlÅÀl¾Àl·Àl°Àl©Àl¢Àl›Àl”ÀlÀl†ÀlÀlxÀlqÀljÀlcÀl\ÀlUÀlNÀlGÀl@Àl9Àl2Àl+Àl$ÀlÀlÀlÀlÀlÀlú¿ló¿lì¿lå¿lÞ¿l׿lпlÉ¿l¿l»¿l´¿l­¿l¦¿lŸ¿l˜¿l‘¿lŠ¿lƒ¿l|¿lu¿ln¿lg¿l`¿lY¿lR¿lK¿lD¿l=¿l6¿l/¿l(¿l!¿l¿l¿l ¿l¿lþ¾l÷¾lð¾lé¾lâ¾lÛ¾lÔ¾l;lƾl¿¾l¸¾l±¾lª¾l£¾lœ¾l•¾l޾l‡¾l€¾ly¾lr¾lk¾ld¾l]¾lV¾lO¾lH¾lA¾l:¾l3¾l,¾l%¾l¾l¾l¾l ¾l¾lû½lô½lí½læ½lß½lؽlѽlʽlýl¼½lµ½l®½l§½l ½l™½l’½l‹½l„½l}½lv½lo½lh½la½lZ½lS½lL½lE½l>½l7½l0½l)½l"½l½l½l ½l½lÿ¼lø¼lñ¼lê¼lã¼lܼlÕ¼lμlǼlÀ¼l¹¼l²¼l«¼l¤¼l¼l–¼l¼lˆ¼l¼lz¼ls¼ll¼le¼l^¼lW¼lP¼lI¼lB¼l;¼l4¼l-¼l&¼l¼l¼l¼l ¼l¼lü»lõ»lî»lç»là»lÙ»lÒ»lË»lÄ»l½»l¶»l¯»l¨»l¡»lš»l“»lŒ»l…»l~»lw»lp»li»lb»l[»lT»lM»lF»l?»l8»l1»l*»l#»l»l»l»l»l»lùºlòºlëºläºlݺlÖºlϺlȺlÁºlººl³ºl¬ºl¥ºlžºl—ºlºl‰ºl‚ºl{ºltºlmºlfºl_ºlXºlQºlJºlCºl<ºl5ºl.ºl'ºl ºlºlºl ºlºlý¹lö¹lï¹lè¹lá¹lÚ¹lÓ¹l̹lŹl¾¹l·¹l°¹l©¹l¢¹l›¹l”¹l¹l†¹l¹lx¹lq¹lj¹lc¹l\¹lU¹lN¹lG¹l@¹l9¹l2¹l+¹l$¹l¹l¹l¹l¹l¹lú¸ló¸lì¸lå¸lÞ¸l׸lиlɸl¸l»¸l´¸l­¸l¦¸lŸ¸l˜¸l‘¸lЏlƒ¸l|¸lu¸ln¸lg¸l`¸lY¸lR¸lK¸lD¸l=¸l6¸l/¸l(¸l!¸l¸l¸l ¸l¸lþ·l÷·lð·lé·lâ·lÛ·lÔ·lÍ·lÆ·l¿·l¸·l±·lª·l£·lœ·l•·lŽ·l‡·l€·ly·lr·lk·ld·l]·lV·lO·lH·lA·l:·l3·l,·l%·l·l·l·l ·l·lû¶lô¶lí¶læ¶lß¶lضlѶlʶlöl¼¶lµ¶l®¶l§¶l ¶l™¶l’¶l‹¶l„¶l}¶lv¶lo¶lh¶la¶lZ¶lS¶lL¶lE¶l>¶l7¶l0¶l)¶l"¶l¶l¶l ¶l¶lÿµløµlñµlêµlãµlܵlÕµlεlǵlÀµl¹µl²µl«µl¤µlµl–µlµlˆµlµlzµlsµllµleµl^µlWµlPµlIµlBµl;µl4µl-µl&µlµlµlµl µlµlü´lõ´lî´lç´là´lÙ´lÒ´lË´lÄ´l½´l¶´l¯´l¨´l¡´lš´l“´lŒ´l…´l~´lw´lp´li´lb´l[´lT´lM´lF´l?´l8´l1´l*´l#´l´l´l´l´l´lù³lò³lë³lä³lݳlÖ³lϳlȳlÁ³lº³l³³l¬³l¥³lž³l—³l³l‰³l‚³l{³lt³lm³lf³l_³lX³lQ³lJ³lC³l<³l5³l.³l'³l ³l³l³l ³l³lý²lö²lï²lè²lá²lÚ²lÓ²l̲lŲl¾²l·²l°²l©²l¢²l›²l”²l²l†²l²lx²lq²lj²lc²l\²lU²lN²lG²l@²l9²l2²l+²l$²l²l²l²l²l²lú±ló±lì±lå±lÞ±l×±lбlɱl±l»±l´±l­±l¦±lŸ±l˜±l‘±lбlƒ±l|±lu±ln±lg±l`±lY±lR±lK±lD±l=±l6±l/±l(±l!±l±l±l ±l±lþ°l÷°lð°lé°lâ°lÛ°lÔ°lͰlưl¿°l¸°l±°lª°l£°lœ°l•°lްl‡°l€°ly°lr°lk°ld°l]°lV°lO°lH°lA°l:°l3°l,°l%°l°l°l°l °l°lû¯lô¯lí¯læ¯l߯lدlѯlʯlïl¼¯lµ¯l®¯l§¯l ¯l™¯l’¯l‹¯l„¯l}¯lv¯lo¯lh¯la¯lZ¯lS¯lL¯lE¯l>¯l7¯l0¯l)¯l"¯l¯l¯l ¯l¯lÿ®lø®lñ®lê®lã®lÜ®lÕ®lήlÇ®lÀ®l¹®l²®l«®l¤®l®l–®l®lˆ®l®lz®ls®ll®le®l^®lW®lP®lI®lB®l;®l4®l-®l&®l®l®l®l ®l®lü­lõ­lî­lç­là­lÙ­lÒ­lË­lÄ­l½­l¶­l¯­l¨­l¡­lš­l“­lŒ­l…­l~­lw­lp­li­lb­l[­lT­lM­lF­l?­l8­l1­l*­l#­l­l­l­l­l­lù¬lò¬lë¬lä¬lݬlÖ¬lϬlȬlÁ¬lº¬l³¬l¬¬l¥¬lž¬l—¬l¬l‰¬l‚¬l{¬lt¬lm¬lf¬l_¬lX¬lQ¬lJ¬lC¬l<¬l5¬l.¬l'¬l ¬l¬l¬l ¬l¬lý«lö«lï«lè«lá«lÚ«lÓ«lÌ«lÅ«l¾«l·«l°«l©«l¢«l›«l”«l«l†«l«lx«lq«lj«lc«l\«lU«lN«lG«l@«l9«l2«l+«l$«l«l«l«l«l«lúªlóªlìªlåªlÞªlתlЪlɪlªl»ªl´ªl­ªl¦ªlŸªl˜ªl‘ªlŠªlƒªl|ªluªlnªlgªl`ªlYªlRªlKªlDªl=ªl6ªl/ªl(ªl!ªlªlªl ªlªlþ©l÷©lð©lé©lâ©lÛ©lÔ©lÍ©lÆ©l¿©l¸©l±©lª©l£©lœ©l•©lŽ©l‡©l€©ly©lr©lk©ld©l]©lV©lO©lH©lA©l:©l3©l,©l%©l©l©l©l ©l©lû¨lô¨lí¨læ¨lߨlبlѨlʨlèl¼¨lµ¨l®¨l§¨l ¨l™¨l’¨l‹¨l„¨l}¨lv¨lo¨lh¨la¨lZ¨lS¨lL¨lE¨l>¨l7¨l0¨l)¨l"¨l¨l¨l ¨l¨lÿ§lø§lñ§lê§lã§lܧlÕ§lΧlǧlÀ§l¹§l²§l«§l¤§l§l–§l§lˆ§l§lz§ls§ll§le§l^§lW§lP§lI§lB§l;§l4§l-§l&§l§l§l§l §l§lü¦lõ¦lî¦lç¦là¦lÙ¦lÒ¦l˦lĦl½¦l¶¦l¯¦l¨¦l¡¦lš¦l“¦lŒ¦l…¦l~¦lw¦lp¦li¦lb¦l[¦lT¦lM¦lF¦l?¦l8¦l1¦l*¦l#¦l¦l¦l¦l¦l¦lù¥lò¥lë¥lä¥lÝ¥lÖ¥lÏ¥lÈ¥lÁ¥lº¥l³¥l¬¥l¥¥lž¥l—¥l¥l‰¥l‚¥l{¥lt¥lm¥lf¥l_¥lX¥lQ¥lJ¥lC¥l<¥l5¥l.¥l'¥l ¥l¥l¥l ¥l¥lý¤lö¤lï¤lè¤lá¤lÚ¤lÓ¤l̤lŤl¾¤l·¤l°¤l©¤l¢¤l›¤l”¤l¤l†¤l¤lx¤lq¤lj¤lc¤l\¤lU¤lN¤lG¤l@¤l9¤l2¤l+¤l$¤l¤l¤l¤l¤l¤lú£ló£lì£lå£lÞ£l×£lУlÉ£l£l»£l´£l­£l¦£lŸ£l˜£l‘£lŠ£lƒ£l|£lu£ln£lg£l`£lY£lR£lK£lD£l=£l6£l/£l(£l!£l£l£l £l£lþ¢l÷¢lð¢lé¢lâ¢lÛ¢lÔ¢lÍ¢lÆ¢l¿¢l¸¢l±¢lª¢l£¢lœ¢l•¢lŽ¢l‡¢l€¢ly¢lr¢lk¢ld¢l]¢lV¢lO¢lH¢lA¢l:¢l3¢l,¢l%¢l¢l¢l¢l ¢l¢lû¡lô¡lí¡læ¡lß¡lØ¡lÑ¡lÊ¡lál¼¡lµ¡l®¡l§¡l ¡l™¡l’¡l‹¡l„¡l}¡lv¡lo¡lh¡la¡lZ¡lS¡lL¡lE¡l>¡l7¡l0¡l)¡l"¡l¡l¡l ¡l¡lÿ lø lñ lê lã lÜ lÕ lΠlÇ lÀ l¹ l² l« l¤ l l– l lˆ l lz ls ll le l^ lW lP lI lB l; l4 l- l& l l l l  l lüŸlõŸlîŸlçŸlàŸlÙŸlÒŸlËŸlÄŸl½Ÿl¶Ÿl¯Ÿl¨Ÿl¡ŸlšŸl“ŸlŒŸl…Ÿl~ŸlwŸlpŸliŸlbŸl[ŸlTŸlMŸlFŸl?Ÿl8Ÿl1Ÿl*Ÿl#ŸlŸlŸlŸlŸlŸlùžlòžlëžläžlÝžlÖžlÏžlÈžlÁžlºžl³žl¬žl¥žlžžl—žlžl‰žl‚žl{žltžlmžlfžl_žlXžlQžlJžlCžl<žl5žl.žl'žl žlžlžl žlžlýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllúœlóœlìœlåœlÞœlלlМlÉœlœl»œl´œl­œl¦œlŸœl˜œl‘œlŠœlƒœl|œluœlnœlgœl`œlYœlRœlKœlDœl=œl6œl/œl(œl!œlœlœl œlœlþ›l÷›lð›lé›lâ›lÛ›lÔ›lÍ›lÆ›l¿›l¸›l±›lª›l£›lœ›l•›lŽ›l‡›l€›ly›lr›lk›ld›l]›lV›lO›lH›lA›l:›l3›l,›l%›l›l›l›l ›l›lûšlôšlíšlæšlßšlØšlÑšlÊšlÚl¼šlµšl®šl§šl šl™šl’šl‹šl„šl}šlvšlošlhšlašlZšlSšlLšlEšl>šl7šl0šl)šl"šlšlšl šlšlÿ™lø™lñ™lê™lã™lÜ™lÕ™lΙlÇ™lÀ™l¹™l²™l«™l¤™l™l–™l™lˆ™l™lz™ls™ll™le™l^™lW™lP™lI™lB™l;™l4™l-™l&™l™l™l™l ™l™lü˜lõ˜lî˜lç˜là˜lÙ˜lÒ˜l˘lĘl½˜l¶˜l¯˜l¨˜l¡˜lš˜l“˜lŒ˜l…˜l~˜lw˜lp˜li˜lb˜l[˜lT˜lM˜lF˜l?˜l8˜l1˜l*˜l#˜l˜l˜l˜l˜l˜lù—lò—lë—lä—lÝ—lÖ—lÏ—lÈ—lÁ—lº—l³—l¬—l¥—lž—l——l—l‰—l‚—l{—lt—lm—lf—l_—lX—lQ—lJ—lC—l<—l5—l.—l'—l —l—l—l —l—lý–lö–lï–lè–lá–lÚ–lÓ–lÌ–lÅ–l¾–l·–l°–l©–l¢–l›–l”–l–l†–l–lx–lq–lj–lc–l\–lU–lN–lG–l@–l9–l2–l+–l$–l–l–l–l–l–lú•ló•lì•lå•lÞ•lוlЕlÉ•l•l»•l´•l­•l¦•lŸ•l˜•l‘•lŠ•lƒ•l|•lu•ln•lg•l`•lY•lR•lK•lD•l=•l6•l/•l(•l!•l•l•l •l•lþ”l÷”lð”lé”lâ”lÛ”lÔ”lÍ”lÆ”l¿”l¸”l±”lª”l£”lœ”l•”lŽ”l‡”l€”ly”lr”lk”ld”l]”lV”lO”lH”lA”l:”l3”l,”l%”l”l”l”l ”l”lû“lô“lí“læ“lß“lØ“lÑ“lÊ“lÓl¼“lµ“l®“l§“l “l™“l’“l‹“l„“l}“lv“lo“lh“la“lZ“lS“lL“lE“l>“l7“l0“l)“l"“l“l“l “l“lÿ’lø’lñ’lê’lã’lÜ’lÕ’lÎ’lÇ’lÀ’l¹’l²’l«’l¤’l’l–’l’lˆ’l’lz’ls’ll’le’l^’lW’lP’lI’lB’l;’l4’l-’l&’l’l’l’l ’l’lü‘lõ‘lî‘lç‘là‘lÙ‘lÒ‘lË‘lÄ‘l½‘l¶‘l¯‘l¨‘l¡‘lš‘l“‘lŒ‘l…‘l~‘lw‘lp‘li‘lb‘l[‘lT‘lM‘lF‘l?‘l8‘l1‘l*‘l#‘l‘l‘l‘l‘l‘lùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlClŒl7Œl0Œl)Œl"ŒlŒlŒl ŒlŒlÿ‹lø‹lñ‹lê‹lã‹lÜ‹lÕ‹l΋lÇ‹lÀ‹l¹‹l²‹l«‹l¤‹l‹l–‹l‹lˆ‹l‹lz‹ls‹ll‹le‹l^‹lW‹lP‹lI‹lB‹l;‹l4‹l-‹l&‹l‹l‹l‹l ‹l‹lüŠlõŠlîŠlçŠlàŠlÙŠlÒŠlËŠlÄŠl½Šl¶Šl¯Šl¨Šl¡ŠlšŠl“ŠlŒŠl…Šl~ŠlwŠlpŠliŠlbŠl[ŠlTŠlMŠlFŠl?Šl8Šl1Šl*Šl#ŠlŠlŠlŠlŠlŠlù‰lò‰lë‰lä‰l݉lÖ‰lωlȉlÁ‰lº‰l³‰l¬‰l¥‰lž‰l—‰l‰l‰‰l‚‰l{‰lt‰lm‰lf‰l_‰lX‰lQ‰lJ‰lC‰l<‰l5‰l.‰l'‰l ‰l‰l‰l ‰l‰lýˆlöˆlïˆlèˆláˆlÚˆlÓˆl̈lňl¾ˆl·ˆl°ˆl©ˆl¢ˆl›ˆl”ˆlˆl†ˆlˆlxˆlqˆljˆlcˆl\ˆlUˆlNˆlGˆl@ˆl9ˆl2ˆl+ˆl$ˆlˆlˆlˆlˆlˆlú‡ló‡lì‡lå‡lÞ‡lׇlЇlɇl‡l»‡l´‡l­‡l¦‡lŸ‡l˜‡l‘‡lЇlƒ‡l|‡lu‡ln‡lg‡l`‡lY‡lR‡lK‡lD‡l=‡l6‡l/‡l(‡l!‡l‡l‡l ‡l‡lþ†l÷†lð†lé†lâ†lÛ†lÔ†l͆lƆl¿†l¸†l±†lª†l£†lœ†l•†lކl‡†l€†ly†lr†lk†ld†l]†lV†lO†lH†lA†l:†l3†l,†l%†l†l†l†l †l†lû…lô…lí…læ…lß…lØ…lÑ…lÊ…lÃ…l¼…lµ…l®…l§…l …l™…l’…l‹…l„…l}…lv…lo…lh…la…lZ…lS…lL…lE…l>…l7…l0…l)…l"…l…l…l …l…lÿ„lø„lñ„lê„lã„lÜ„lÕ„l΄lÇ„lÀ„l¹„l²„l«„l¤„l„l–„l„lˆ„l„lz„ls„ll„le„l^„lW„lP„lI„lB„l;„l4„l-„l&„l„l„l„l „l„lüƒlõƒlîƒlçƒlàƒlÙƒlÒƒl˃lăl½ƒl¶ƒl¯ƒl¨ƒl¡ƒlšƒl“ƒlŒƒl…ƒl~ƒlwƒlpƒliƒlbƒl[ƒlTƒlMƒlFƒl?ƒl8ƒl1ƒl*ƒl#ƒlƒlƒlƒlƒlƒlù‚lò‚lë‚lä‚lÝ‚lÖ‚lÏ‚lÈ‚lÁ‚lº‚l³‚l¬‚l¥‚lž‚l—‚l‚l‰‚l‚‚l{‚lt‚lm‚lf‚l_‚lX‚lQ‚lJ‚lC‚l<‚l5‚l.‚l'‚l ‚l‚l‚l ‚l‚lýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllú€ló€lì€lå€lÞ€l×€lЀlÉ€l€l»€l´€l­€l¦€lŸ€l˜€l‘€lŠ€lƒ€l|€lu€ln€lg€l`€lY€lR€lK€lD€l=€l6€l/€l(€l!€l€l€l €l€lþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llû~lô~lí~læ~lß~lØ~lÑ~lÊ~lÃ~l¼~lµ~l®~l§~l ~l™~l’~l‹~l„~l}~lv~lo~lh~la~lZ~lS~lL~lE~l>~l7~l0~l)~l"~l~l~l ~l~lÿ}lø}lñ}lê}lã}lÜ}lÕ}lÎ}lÇ}lÀ}l¹}l²}l«}l¤}l}l–}l}lˆ}l}lz}ls}ll}le}l^}lW}lP}lI}lB}l;}l4}l-}l&}l}l}l}l }l}lü|lõ|lî|lç|là|lÙ|lÒ|lË|lÄ|l½|l¶|l¯|l¨|l¡|lš|l“|lŒ|l…|l~|lw|lp|li|lb|l[|lT|lM|lF|l?|l8|l1|l*|l#|l|l|l|l|l|lù{lò{lë{lä{lÝ{lÖ{lÏ{lÈ{lÁ{lº{l³{l¬{l¥{lž{l—{l{l‰{l‚{l{{lt{lm{lf{l_{lX{lQ{lJ{lC{l<{l5{l.{l'{l {l{l{l {l{lýzlözlïzlèzlázlÚzlÓzlÌzlÅzl¾zl·zl°zl©zl¢zl›zl”zlzl†zlzlxzlqzljzlczl\zlUzlNzlGzl@zl9zl2zl+zl$zlzlzlzlzlzlúylóylìylåylÞyl×ylÐylÉylÂyl»yl´yl­yl¦ylŸyl˜yl‘ylŠylƒyl|yluylnylgyl`ylYylRylKylDyl=yl6yl/yl(yl!ylylyl ylylþxl÷xlðxléxlâxlÛxlÔxlÍxlÆxl¿xl¸xl±xlªxl£xlœxl•xlŽxl‡xl€xlyxlrxlkxldxl]xlVxlOxlHxlAxl:xl3xl,xl%xlxlxlxl xlxlûwlôwlíwlæwlßwlØwlÑwlÊwlÃwl¼wlµwl®wl§wl wl™wl’wl‹wl„wl}wlvwlowlhwlawlZwlSwlLwlEwl>wl7wl0wl)wl"wlwlwl wlwlÿvløvlñvlêvlãvlÜvlÕvlÎvlÇvlÀvl¹vl²vl«vl¤vlvl–vlvlˆvlvlzvlsvllvlevl^vlWvlPvlIvlBvl;vl4vl-vl&vlvlvlvl vlvlüulõulîulçulàulÙulÒulËulÄul½ul¶ul¯ul¨ul¡ulšul“ulŒul…ul~ulwulpuliulbul[ulTulMulFul?ul8ul1ul*ul#ululululululùtlòtlëtlätlÝtlÖtlÏtlÈtlÁtlºtl³tl¬tl¥tlžtl—tltl‰tl‚tl{tlttlmtlftl_tlXtlQtlJtlCtlpl7pl0pl)pl"plplpl plplÿoløolñolêolãolÜolÕolÎolÇolÀol¹ol²ol«ol¤olol–ololˆololzolsolloleol^olWolPolIolBol;ol4ol-ol&olololol ololünlõnlînlçnlànlÙnlÒnlËnlÄnl½nl¶nl¯nl¨nl¡nlšnl“nlŒnl…nl~nlwnlpnlinlbnl[nlTnlMnlFnl?nl8nl1nl*nl#nlnlnlnlnlnlùmlòmlëmlämlÝmlÖmlÏmlÈmlÁmlºml³ml¬ml¥mlžml—mlml‰ml‚ml{mltmlmmlfml_mlXmlQmlJmlCmlil7il0il)il"ililil ililÿhløhlñhlêhlãhlÜhlÕhlÎhlÇhlÀhl¹hl²hl«hl¤hlhl–hlhlˆhlhlzhlshllhlehl^hlWhlPhlIhlBhl;hl4hl-hl&hlhlhlhl hlhlüglõglîglçglàglÙglÒglËglÄgl½gl¶gl¯gl¨gl¡glšgl“glŒgl…gl~glwglpgliglbgl[glTglMglFgl?gl8gl1gl*gl#glglglglglglùflòflëfläflÝflÖflÏflÈflÁflºfl³fl¬fl¥flžfl—flfl‰fl‚fl{fltflmflffl_flXflQflJflCflbl7bl0bl)bl"blblbl blblÿaløalñalêalãalÜalÕalÎalÇalÀal¹al²al«al¤alal–alalˆalalzalsallaleal^alWalPalIalBal;al4al-al&alalalal alalü`lõ`lî`lç`là`lÙ`lÒ`lË`lÄ`l½`l¶`l¯`l¨`l¡`lš`l“`lŒ`l…`l~`lw`lp`li`lb`l[`lT`lM`lF`l?`l8`l1`l*`l#`l`l`l`l`l`lù_lò_lë_lä_lÝ_lÖ_lÏ_lÈ_lÁ_lº_l³_l¬_l¥_lž_l—_l_l‰_l‚_l{_lt_lm_lf_l__lX_lQ_lJ_lC_l<_l5_l._l'_l _l_l_l _l_lý^lö^lï^lè^lá^lÚ^lÓ^lÌ^lÅ^l¾^l·^l°^l©^l¢^l›^l”^l^l†^l^lx^lq^lj^lc^l\^lU^lN^lG^l@^l9^l2^l+^l$^l^l^l^l^l^lú]ló]lì]lå]lÞ]l×]lÐ]lÉ]lÂ]l»]l´]l­]l¦]lŸ]l˜]l‘]lŠ]lƒ]l|]lu]ln]lg]l`]lY]lR]lK]lD]l=]l6]l/]l(]l!]l]l]l ]l]lþ\l÷\lð\lé\lâ\lÛ\lÔ\lÍ\lÆ\l¿\l¸\l±\lª\l£\lœ\l•\lŽ\l‡\l€\ly\lr\lk\ld\l]\lV\lO\lH\lA\l:\l3\l,\l%\l\l\l\l \l\lû[lô[lí[læ[lß[lØ[lÑ[lÊ[lÃ[l¼[lµ[l®[l§[l [l™[l’[l‹[l„[l}[lv[lo[lh[la[lZ[lS[lL[lE[l>[l7[l0[l)[l"[l[l [l[lÿZløZlñZlêZlãZlÜZlÕZlÎZlÇZlÀZl¹Zl²Zl«Zl¤ZlZl–ZlZlˆZlZlzZlsZllZleZl^ZlWZlPZlIZlBZl;Zl4Zl-Zl&ZlZlZlZl ZlZlüYlõYlîYlçYlàYlÙYlÒYlËYlÄYl½Yl¶Yl¯Yl¨Yl¡YlšYl“YlŒYl…Yl~YlwYlpYliYlbYl[YlTYlMYlFYl?Yl8Yl1Yl*Yl#YlYlYlYlYlYlùXlòXlëXläXlÝXlÖXlÏXlÈXlÁXlºXl³Xl¬Xl¥XlžXl—XlXl‰Xl‚Xl{XltXlmXlfXl_XlXXlQXlJXlCXlTl7Tl0Tl)Tl"TlTlTl TlTlÿSløSlñSlêSlãSlÜSlÕSlÎSlÇSlÀSl¹Sl²Sl«Sl¤SlSl–SlSlˆSlSlzSlsSllSleSl^SlWSlPSlISlBSl;Sl4Sl-Sl&SlSlSlSl SlSlüRlõRlîRlçRlàRlÙRlÒRlËRlÄRl½Rl¶Rl¯Rl¨Rl¡RlšRl“RlŒRl…Rl~RlwRlpRliRlbRl[RlTRlMRlFRl?Rl8Rl1Rl*Rl#RlRlRlRlRlRlùQlòQlëQläQlÝQlÖQlÏQlÈQlÁQlºQl³Ql¬Ql¥QlžQl—QlQl‰Ql‚Ql{QltQlmQlfQl_QlXQlQQlJQlCQlMl7Ml0Ml)Ml"MlMlMl MlMlÿLløLlñLlêLlãLlÜLlÕLlÎLlÇLlÀLl¹Ll²Ll«Ll¤LlLl–LlLlˆLlLlzLlsLllLleLl^LlWLlPLlILlBLl;Ll4Ll-Ll&LlLlLlLl LlLlüKlõKlîKlçKlàKlÙKlÒKlËKlÄKl½Kl¶Kl¯Kl¨Kl¡KlšKl“KlŒKl…Kl~KlwKlpKliKlbKl[KlTKlMKlFKl?Kl8Kl1Kl*Kl#KlKlKlKlKlKlùJlòJlëJläJlÝJlÖJlÏJlÈJlÁJlºJl³Jl¬Jl¥JlžJl—JlJl‰Jl‚Jl{JltJlmJlfJl_JlXJlQJlJJlCJlFl7Fl0Fl)Fl"FlFlFl FlFlÿEløElñElêElãElÜElÕElÎElÇElÀEl¹El²El«El¤ElEl–ElElˆElElzElsEllEleEl^ElWElPElIElBEl;El4El-El&ElElElEl ElElüDlõDlîDlçDlàDlÙDlÒDlËDlÄDl½Dl¶Dl¯Dl¨Dl¡DlšDl“DlŒDl…Dl~DlwDlpDliDlbDl[DlTDlMDlFDl?Dl8Dl1Dl*Dl#DlDlDlDlDlDlùClòClëCläClÝClÖClÏClÈClÁClºCl³Cl¬Cl¥ClžCl—ClCl‰Cl‚Cl{CltClmClfCl_ClXClQClJClCCl?l7?l0?l)?l"?l?l?l ?l?lÿ>lø>lñ>lê>lã>lÜ>lÕ>lÎ>lÇ>lÀ>l¹>l²>l«>l¤>l>l–>l>lˆ>l>lz>ls>ll>le>l^>lW>lP>lI>lB>l;>l4>l->l&>l>l>l>l >l>lü=lõ=lî=lç=là=lÙ=lÒ=lË=lÄ=l½=l¶=l¯=l¨=l¡=lš=l“=lŒ=l…=l~=lw=lp=li=lb=l[=lT=lM=lF=l?=l8=l1=l*=l#=l=l=l=l=l=lù8l78l08l)8l"8l8l8l 8l8lÿ7lø7lñ7lê7lã7lÜ7lÕ7lÎ7lÇ7lÀ7l¹7l²7l«7l¤7l7l–7l7lˆ7l7lz7ls7ll7le7l^7lW7lP7lI7lB7l;7l47l-7l&7l7l7l7l 7l7lü6lõ6lî6lç6là6lÙ6lÒ6lË6lÄ6l½6l¶6l¯6l¨6l¡6lš6l“6lŒ6l…6l~6lw6lp6li6lb6l[6lT6lM6lF6l?6l86l16l*6l#6l6l6l6l6l6lù5lò5lë5lä5lÝ5lÖ5lÏ5lÈ5lÁ5lº5l³5l¬5l¥5lž5l—5l5l‰5l‚5l{5lt5lm5lf5l_5lX5lQ5lJ5lC5l<5l55l.5l'5l 5l5l5l 5l5lý4lö4lï4lè4lá4lÚ4lÓ4lÌ4lÅ4l¾4l·4l°4l©4l¢4l›4l”4l4l†4l4lx4lq4lj4lc4l\4lU4lN4lG4l@4l94l24l+4l$4l4l4l4l4l4lú3ló3lì3lå3lÞ3l×3lÐ3lÉ3lÂ3l»3l´3l­3l¦3lŸ3l˜3l‘3lŠ3lƒ3l|3lu3ln3lg3l`3lY3lR3lK3lD3l=3l63l/3l(3l!3l3l3l 3l3lþ2l÷2lð2lé2lâ2lÛ2lÔ2lÍ2lÆ2l¿2l¸2l±2lª2l£2lœ2l•2lŽ2l‡2l€2ly2lr2lk2ld2l]2lV2lO2lH2lA2l:2l32l,2l%2l2l2l2l 2l2lû1lô1lí1læ1lß1lØ1lÑ1lÊ1lÃ1l¼1lµ1l®1l§1l 1l™1l’1l‹1l„1l}1lv1lo1lh1la1lZ1lS1lL1lE1l>1l71l01l)1l"1l1l1l 1l1lÿ0lø0lñ0lê0lã0lÜ0lÕ0lÎ0lÇ0lÀ0l¹0l²0l«0l¤0l0l–0l0lˆ0l0lz0ls0ll0le0l^0lW0lP0lI0lB0l;0l40l-0l&0l0l0l0l 0l0lü/lõ/lî/lç/là/lÙ/lÒ/lË/lÄ/l½/l¶/l¯/l¨/l¡/lš/l“/lŒ/l…/l~/lw/lp/li/lb/l[/lT/lM/lF/l?/l8/l1/l*/l#/l/l/l/l/l/lù.lò.lë.lä.lÝ.lÖ.lÏ.lÈ.lÁ.lº.l³.l¬.l¥.lž.l—.l.l‰.l‚.l{.lt.lm.lf.l_.lX.lQ.lJ.lC.l<.l5.l..l'.l .l.l.l .l.lý-lö-lï-lè-lá-lÚ-lÓ-lÌ-lÅ-l¾-l·-l°-l©-l¢-l›-l”-l-l†-l-lx-lq-lj-lc-l\-lU-lN-lG-l@-l9-l2-l+-l$-l-l-l-l-l-lú,ló,lì,lå,lÞ,l×,lÐ,lÉ,lÂ,l»,l´,l­,l¦,lŸ,l˜,l‘,lŠ,lƒ,l|,lu,ln,lg,l`,lY,lR,lK,lD,l=,l6,l/,l(,l!,l,l,l ,l,lþ+l÷+lð+lé+lâ+lÛ+lÔ+lÍ+lÆ+l¿+l¸+l±+lª+l£+lœ+l•+lŽ+l‡+l€+ly+lr+lk+ld+l]+lV+lO+lH+lA+l:+l3+l,+l%+l+l+l+l +l+lû*lô*lí*læ*lß*lØ*lÑ*lÊ*lÃ*l¼*lµ*l®*l§*l *l™*l’*l‹*l„*l}*lv*lo*lh*la*lZ*lS*lL*lE*l>*l7*l0*l)*l"*l*l*l *l*lÿ)lø)lñ)lê)lã)lÜ)lÕ)lÎ)lÇ)lÀ)l¹)l²)l«)l¤)l)l–)l)lˆ)l)lz)ls)ll)le)l^)lW)lP)lI)lB)l;)l4)l-)l&)l)l)l)l )l)lü(lõ(lî(lç(là(lÙ(lÒ(lË(lÄ(l½(l¶(l¯(l¨(l¡(lš(l“(lŒ(l…(l~(lw(lp(li(lb(l[(lT(lM(lF(l?(l8(l1(l*(l#(l(l(l(l(l(lù'lò'lë'lä'lÝ'lÖ'lÏ'lÈ'lÁ'lº'l³'l¬'l¥'lž'l—'l'l‰'l‚'l{'lt'lm'lf'l_'lX'lQ'lJ'lC'l<'l5'l.'l''l 'l'l'l 'l'lý&lö&lï&lè&lá&lÚ&lÓ&lÌ&lÅ&l¾&l·&l°&l©&l¢&l›&l”&l&l†&l&lx&lq&lj&lc&l\&lU&lN&lG&l@&l9&l2&l+&l$&l&l&l&l&l&lú%ló%lì%lå%lÞ%l×%lÐ%lÉ%lÂ%l»%l´%l­%l¦%lŸ%l˜%l‘%lŠ%lƒ%l|%lu%ln%lg%l`%lY%lR%lK%lD%l=%l6%l/%l(%l!%l%l%l %l%lþ$l÷$lð$lé$lâ$lÛ$lÔ$lÍ$lÆ$l¿$l¸$l±$lª$l£$lœ$l•$lŽ$l‡$l€$ly$lr$lk$ld$l]$lV$lO$lH$lA$l:$l3$l,$l%$l$l$l$l $l$lû#lô#lí#læ#lß#lØ#lÑ#lÊ#lÃ#l¼#lµ#l®#l§#l #l™#l’#l‹#l„#l}#lv#lo#lh#la#lZ#lS#lL#lE#l>#l7#l0#l)#l"#l#l#l #l#lÿ"lø"lñ"lê"lã"lÜ"lÕ"lÎ"lÇ"lÀ"l¹"l²"l«"l¤"l"l–"l"lˆ"l"lz"ls"ll"le"l^"lW"lP"lI"lB"l;"l4"l-"l&"l"l"l"l "l"lü!lõ!lî!lç!là!lÙ!lÒ!lË!lÄ!l½!l¶!l¯!l¨!l¡!lš!l“!lŒ!l…!l~!lw!lp!li!lb!l[!lT!lM!lF!l?!l8!l1!l*!l#!l!l!l!l!l!lù lò lë lä lÝ lÖ lÏ lÈ lÁ lº l³ l¬ l¥ lž l— l l‰ l‚ l{ lt lm lf l_ lX lQ lJ lC l< l5 l. l' l l l l l lýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllúlólìlålÞl×lÐlÉlÂl»l´l­l¦lŸl˜l‘lŠlƒl|lulnlgl`lYlRlKlDl=l6l/l(l!lll llþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llûlôlílælßlØlÑlÊlÃl¼lµl®l§l l™l’l‹l„l}lvlolhlalZlSlLlEl>l7l0l)l"lll llÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlCl<l5l.l'l lll llýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllúlólìlålÞl×lÐlÉlÂl»l´l­l¦lŸl˜l‘lŠlƒl|lulnlgl`lYlRlKlDl=l6l/l(l!lll llþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llûlôlílælßlØlÑlÊlÃl¼lµl®l§l l™l’l‹l„l}lvlolhlalZlSlLlEl>l7l0l)l"lll llÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlCl<l5l.l'l lll llýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllúlólìlålÞl×lÐlÉlÂl»l´l­l¦lŸl˜l‘lŠlƒl|lulnlgl`lYlRlKlDl=l6l/l(l!lll llþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llûlôlílælßlØlÑlÊlÃl¼lµl®l§l l™l’l‹l„l}lvlolhlalZlSlLlEl>l7l0l)l"lll llÿ lø lñ lê lã lÜ lÕ lÎ lÇ lÀ l¹ l² l« l¤ l l– l lˆ l lz ls ll le l^ lW lP lI lB l; l4 l- l& l l l l l lü lõ lî lç là lÙ lÒ lË lÄ l½ l¶ l¯ l¨ l¡ lš l“ lŒ l… l~ lw lp li lb l[ lT lM lF l? l8 l1 l* l# l l l l l lù lò lë lä lÝ lÖ lÏ lÈ lÁ lº l³ l¬ l¥ lž l— l l‰ l‚ l{ lt lm lf l_ lX lQ lJ lC l< l5 l. l' l l l l l lý lö lï lè lá lÚ lÓ lÌ lÅ l¾ l· l° l© l¢ l› l” l l† l lx lq lj lc l\ lU lN lG l@ l9 l2 l+ l$ l l l l l lú ló lì lå lÞ l× lÐ lÉ l l» l´ l­ l¦ lŸ l˜ l‘ lŠ lƒ l| lu ln lg l` lY lR lK lD l= l6 l/ l( l! l l l l lþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llûlôlílælßlØlÑlÊlÃl¼lµl®l§l l™l’l‹l„l}lvlolhlalZlSlLlEl>l7l0l)l"lll llÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlCl<l5l.l'l lll llýlölïlèlálÚlÓlÌlÅl¾l·l°l©l¢l›l”ll†llxlqljlcl\lUlNlGl@l9l2l+l$llllllúlólìlålÞl×lÐlÉlÂl»l´l­l¦lŸl˜l‘lŠlƒl|lulnlgl`lYlRlKlDl=l6l/l(l!lll llþl÷lðlélâlÛlÔlÍlÆl¿l¸l±lªl£lœl•lŽl‡l€lylrlkldl]lVlOlHlAl:l3l,l%llll llûlôlílælßlØlÑlÊlÃl¼lµl®l§l l™l’l‹l„l}lvlolhlalZlSlLlEl>l7l0l)l"lll llÿÿkøÿkñÿkêÿkãÿkÜÿkÕÿkÎÿkÇÿkÀÿk¹ÿk²ÿk«ÿk¤ÿkÿk–ÿkÿkˆÿkÿkzÿksÿklÿkeÿk^ÿkWÿkPÿkIÿkBÿk;ÿk4ÿk-ÿk&ÿkÿkÿkÿk ÿkÿküþkõþkîþkçþkàþkÙþkÒþkËþkÄþk½þk¶þk¯þk¨þk¡þkšþk“þkŒþk…þk~þkwþkpþkiþkbþk[þkTþkMþkFþk?þk8þk1þk*þk#þkþkþkþkþkþkùýkòýkëýkäýkÝýkÖýkÏýkÈýkÁýkºýk³ýk¬ýk¥ýkžýk—ýkýk‰ýk‚ýk{ýktýkmýkfýk_ýkXýkQýkJýkCýk<ýk5ýk.ýk'ýk ýkýkýk ýkýkýüköükïükèükáükÚükÓükÌükÅük¾ük·ük°ük©ük¢ük›ük”ükük†ükükxükqükjükcük\ükUükNükGük@ük9ük2ük+ük$ükükükükükükúûkóûkìûkåûkÞûk×ûkÐûkÉûkÂûk»ûk´ûk­ûk¦ûkŸûk˜ûk‘ûkŠûkƒûk|ûkuûknûkgûk`ûkYûkRûkKûkDûk=ûk6ûk/ûk(ûk!ûkûkûk ûkûkþúk÷úkðúkéúkâúkÛúkÔúkÍúkÆúk¿úk¸úk±úkªúk£úkœúk•úkŽúk‡úk€úkyúkrúkkúkdúk]úkVúkOúkHúkAúk:úk3úk,úk%úkúkúkúk úkúkûùkôùkíùkæùkßùkØùkÑùkÊùkÃùk¼ùkµùk®ùk§ùk ùk™ùk’ùk‹ùk„ùk}ùkvùkoùkhùkaùkZùkSùkLùkEùk>ùk7ùk0ùk)ùk"ùkùkùk ùkùkÿøkøøkñøkêøkãøkÜøkÕøkÎøkÇøkÀøk¹øk²øk«øk¤økøk–økøkˆøkøkzøksøkløkeøk^økWøkPøkIøkBøk;øk4øk-øk&økøkøkøk økøkü÷kõ÷kî÷kç÷kà÷kÙ÷kÒ÷kË÷kÄ÷k½÷k¶÷k¯÷k¨÷k¡÷kš÷k“÷kŒ÷k…÷k~÷kw÷kp÷ki÷kb÷k[÷kT÷kM÷kF÷k?÷k8÷k1÷k*÷k#÷k÷k÷k÷k÷k÷kùökòökëökäökÝökÖökÏökÈökÁökºök³ök¬ök¥ökžök—ökök‰ök‚ök{öktökmökfök_ökXökQökJökCök<ök5ök.ök'ök ökökök ökökýõköõkïõkèõkáõkÚõkÓõkÌõkÅõk¾õk·õk°õk©õk¢õk›õk”õkõk†õkõkxõkqõkjõkcõk\õkUõkNõkGõk@õk9õk2õk+õk$õkõkõkõkõkõkúôkóôkìôkåôkÞôk×ôkÐôkÉôkÂôk»ôk´ôk­ôk¦ôkŸôk˜ôk‘ôkŠôkƒôk|ôkuôknôkgôk`ôkYôkRôkKôkDôk=ôk6ôk/ôk(ôk!ôkôkôk ôkôkþók÷ókðókéókâókÛókÔókÍókÆók¿ók¸ók±ókªók£ókœók•ókŽók‡ók€ókyókrókkókdók]ókVókOókHókAók:ók3ók,ók%ókókókók ókókûòkôòkíòkæòkßòkØòkÑòkÊòkÃòk¼òkµòk®òk§òk òk™òk’òk‹òk„òk}òkvòkoòkhòkaòkZòkSòkLòkEòk>òk7òk0òk)òk"òkòkòk òkòkÿñkøñkññkêñkãñkÜñkÕñkÎñkÇñkÀñk¹ñk²ñk«ñk¤ñkñk–ñkñkˆñkñkzñksñklñkeñk^ñkWñkPñkIñkBñk;ñk4ñk-ñk&ñkñkñkñk ñkñküðkõðkîðkçðkàðkÙðkÒðkËðkÄðk½ðk¶ðk¯ðk¨ðk¡ðkšðk“ðkŒðk…ðk~ðkwðkpðkiðkbðk[ðkTðkMðkFðk?ðk8ðk1ðk*ðk#ðkðkðkðkðkðkùïkòïkëïkäïkÝïkÖïkÏïkÈïkÁïkºïk³ïk¬ïk¥ïkžïk—ïkïk‰ïk‚ïk{ïktïkmïkfïk_ïkXïkQïkJïkCïk<ïk5ïk.ïk'ïk ïkïkïk ïkïkýîköîkïîkèîkáîkÚîkÓîkÌîkÅîk¾îk·îk°îk©îk¢îk›îk”îkîk†îkîkxîkqîkjîkcîk\îkUîkNîkGîk@îk9îk2îk+îk$îkîkîkîkîkîkúíkóíkìíkåíkÞík×íkÐíkÉíkÂík»ík´ík­ík¦íkŸík˜ík‘íkŠíkƒík|íkuíkníkgík`íkYíkRíkKíkDík=ík6ík/ík(ík!íkíkík íkíkþìk÷ìkðìkéìkâìkÛìkÔìkÍìkÆìk¿ìk¸ìk±ìkªìk£ìkœìk•ìkŽìk‡ìk€ìkyìkrìkkìkdìk]ìkVìkOìkHìkAìk:ìk3ìk,ìk%ìkìkìkìk ìkìkûëkôëkíëkæëkßëkØëkÑëkÊëkÃëk¼ëkµëk®ëk§ëk ëk™ëk’ëk‹ëk„ëk}ëkvëkoëkhëkaëkZëkSëkLëkEëk>ëk7ëk0ëk)ëk"ëkëkëk ëkëkÿêkøêkñêkêêkãêkÜêkÕêkÎêkÇêkÀêk¹êk²êk«êk¤êkêk–êkêkˆêkêkzêksêklêkeêk^êkWêkPêkIêkBêk;êk4êk-êk&êkêkêkêk êkêküékõékîékçékàékÙékÒékËékÄék½ék¶ék¯ék¨ék¡ékšék“ékŒék…ék~ékwékpékiékbék[ékTékMékFék?ék8ék1ék*ék#ékékékékékékùèkòèkëèkäèkÝèkÖèkÏèkÈèkÁèkºèk³èk¬èk¥èkžèk—èkèk‰èk‚èk{èktèkmèkfèk_èkXèkQèkJèkCèk<èk5èk.èk'èk èkèkèk èkèkýçköçkïçkèçkáçkÚçkÓçkÌçkÅçk¾çk·çk°çk©çk¢çk›çk”çkçk†çkçkxçkqçkjçkcçk\çkUçkNçkGçk@çk9çk2çk+çk$çkçkçkçkçkçkúækóækìækåækÞæk׿kÐækÉækÂæk»æk´æk­æk¦ækŸæk˜æk‘ækŠækƒæk|ækuæknækgæk`ækYækRækKækDæk=æk6æk/æk(æk!ækækæk ækækþåk÷åkðåkéåkâåkÛåkÔåkÍåkÆåk¿åk¸åk±åkªåk£åkœåk•åkŽåk‡åk€åkyåkråkkåkdåk]åkVåkOåkHåkAåk:åk3åk,åk%åkåkåkåk åkåkûäkôäkíäkæäkßäkØäkÑäkÊäkÃäk¼äkµäk®äk§äk äk™äk’äk‹äk„äk}äkväkoäkhäkaäkZäkSäkLäkEäk>äk7äk0äk)äk"äkäkäk äkäkÿãkøãkñãkêãkããkÜãkÕãkÎãkÇãkÀãk¹ãk²ãk«ãk¤ãkãk–ãkãkˆãkãkzãksãklãkeãk^ãkWãkPãkIãkBãk;ãk4ãk-ãk&ãkãkãkãk ãkãküâkõâkîâkçâkàâkÙâkÒâkËâkÄâk½âk¶âk¯âk¨âk¡âkšâk“âkŒâk…âk~âkwâkpâkiâkbâk[âkTâkMâkFâk?âk8âk1âk*âk#âkâkâkâkâkâkùákòákëákäákÝákÖákÏákÈákÁákºák³ák¬ák¥ákžák—ákák‰ák‚ák{áktákmákfák_ákXákQákJákCák<ák5ák.ák'ák ákákák ákákýàköàkïàkèàkáàkÚàkÓàkÌàkÅàk¾àk·àk°àk©àk¢àk›àk”àkàk†àkàkxàkqàkjàkcàk\àkUàkNàkGàk@àk9àk2àk+àk$àkàkàkàkàkàkúßkóßkìßkåßkÞßk×ßkÐßkÉßkÂßk»ßk´ßk­ßk¦ßkŸßk˜ßk‘ßkŠßkƒßk|ßkußknßkgßk`ßkYßkRßkKßkDßk=ßk6ßk/ßk(ßk!ßkßkßk ßkßkþÞk÷ÞkðÞkéÞkâÞkÛÞkÔÞkÍÞkÆÞk¿Þk¸Þk±ÞkªÞk£ÞkœÞk•ÞkŽÞk‡Þk€ÞkyÞkrÞkkÞkdÞk]ÞkVÞkOÞkHÞkAÞk:Þk3Þk,Þk%ÞkÞkÞkÞk ÞkÞkûÝkôÝkíÝkæÝkßÝkØÝkÑÝkÊÝkÃÝk¼ÝkµÝk®Ýk§Ýk Ýk™Ýk’Ýk‹Ýk„Ýk}ÝkvÝkoÝkhÝkaÝkZÝkSÝkLÝkEÝk>Ýk7Ýk0Ýk)Ýk"ÝkÝkÝk ÝkÝkÿÜkøÜkñÜkêÜkãÜkÜÜkÕÜkÎÜkÇÜkÀÜk¹Ük²Ük«Ük¤ÜkÜk–ÜkÜkˆÜkÜkzÜksÜklÜkeÜk^ÜkWÜkPÜkIÜkBÜk;Ük4Ük-Ük&ÜkÜkÜkÜk ÜkÜküÛkõÛkîÛkçÛkàÛkÙÛkÒÛkËÛkÄÛk½Ûk¶Ûk¯Ûk¨Ûk¡ÛkšÛk“ÛkŒÛk…Ûk~ÛkwÛkpÛkiÛkbÛk[ÛkTÛkMÛkFÛk?Ûk8Ûk1Ûk*Ûk#ÛkÛkÛkÛkÛkÛkùÚkòÚkëÚkäÚkÝÚkÖÚkÏÚkÈÚkÁÚkºÚk³Úk¬Úk¥ÚkžÚk—ÚkÚk‰Úk‚Úk{ÚktÚkmÚkfÚk_ÚkXÚkQÚkJÚkCÚk<Úk5Úk.Úk'Úk ÚkÚkÚk ÚkÚkýÙköÙkïÙkèÙkáÙkÚÙkÓÙkÌÙkÅÙk¾Ùk·Ùk°Ùk©Ùk¢Ùk›Ùk”ÙkÙk†ÙkÙkxÙkqÙkjÙkcÙk\ÙkUÙkNÙkGÙk@Ùk9Ùk2Ùk+Ùk$ÙkÙkÙkÙkÙkÙkúØkóØkìØkåØkÞØkרkÐØkÉØkÂØk»Øk´Øk­Øk¦ØkŸØk˜Øk‘ØkŠØkƒØk|ØkuØknØkgØk`ØkYØkRØkKØkDØk=Øk6Øk/Øk(Øk!ØkØkØk ØkØkþ×k÷×kð×ké×kâ×kÛ×kÔ×kÍ×kÆ×k¿×k¸×k±×kª×k£×kœ×k•×kŽ×k‡×k€×ky×kr×kk×kd×k]×kV×kO×kH×kA×k:×k3×k,×k%×k×k×k×k ×k×kûÖkôÖkíÖkæÖkßÖkØÖkÑÖkÊÖkÃÖk¼ÖkµÖk®Ök§Ök Ök™Ök’Ök‹Ök„Ök}ÖkvÖkoÖkhÖkaÖkZÖkSÖkLÖkEÖk>Ök7Ök0Ök)Ök"ÖkÖkÖk ÖkÖkÿÕkøÕkñÕkêÕkãÕkÜÕkÕÕkÎÕkÇÕkÀÕk¹Õk²Õk«Õk¤ÕkÕk–ÕkÕkˆÕkÕkzÕksÕklÕkeÕk^ÕkWÕkPÕkIÕkBÕk;Õk4Õk-Õk&ÕkÕkÕkÕk ÕkÕküÔkõÔkîÔkçÔkàÔkÙÔkÒÔkËÔkÄÔk½Ôk¶Ôk¯Ôk¨Ôk¡ÔkšÔk“ÔkŒÔk…Ôk~ÔkwÔkpÔkiÔkbÔk[ÔkTÔkMÔkFÔk?Ôk8Ôk1Ôk*Ôk#ÔkÔkÔkÔkÔkÔkùÓkòÓkëÓkäÓkÝÓkÖÓkÏÓkÈÓkÁÓkºÓk³Ók¬Ók¥ÓkžÓk—ÓkÓk‰Ók‚Ók{ÓktÓkmÓkfÓk_ÓkXÓkQÓkJÓkCÓk<Ók5Ók.Ók'Ók ÓkÓkÓk ÓkÓkýÒköÒkïÒkèÒkáÒkÚÒkÓÒkÌÒkÅÒk¾Òk·Òk°Òk©Òk¢Òk›Òk”ÒkÒk†ÒkÒkxÒkqÒkjÒkcÒk\ÒkUÒkNÒkGÒk@Òk9Òk2Òk+Òk$ÒkÒkÒkÒkÒkÒkúÑkóÑkìÑkåÑkÞÑk×ÑkÐÑkÉÑkÂÑk»Ñk´Ñk­Ñk¦ÑkŸÑk˜Ñk‘ÑkŠÑkƒÑk|ÑkuÑknÑkgÑk`ÑkYÑkRÑkKÑkDÑk=Ñk6Ñk/Ñk(Ñk!ÑkÑkÑk ÑkÑkþÐk÷ÐkðÐkéÐkâÐkÛÐkÔÐkÍÐkÆÐk¿Ðk¸Ðk±ÐkªÐk£ÐkœÐk•ÐkŽÐk‡Ðk€ÐkyÐkrÐkkÐkdÐk]ÐkVÐkOÐkHÐkAÐk:Ðk3Ðk,Ðk%ÐkÐkÐkÐk ÐkÐkûÏkôÏkíÏkæÏkßÏkØÏkÑÏkÊÏkÃÏk¼ÏkµÏk®Ïk§Ïk Ïk™Ïk’Ïk‹Ïk„Ïk}ÏkvÏkoÏkhÏkaÏkZÏkSÏkLÏkEÏk>Ïk7Ïk0Ïk)Ïk"ÏkÏkÏk ÏkÏkÿÎkøÎkñÎkêÎkãÎkÜÎkÕÎkÎÎkÇÎkÀÎk¹Îk²Îk«Îk¤ÎkÎk–ÎkÎkˆÎkÎkzÎksÎklÎkeÎk^ÎkWÎkPÎkIÎkBÎk;Îk4Îk-Îk&ÎkÎkÎkÎk ÎkÎküÍkõÍkîÍkçÍkàÍkÙÍkÒÍkËÍkÄÍk½Ík¶Ík¯Ík¨Ík¡ÍkšÍk“ÍkŒÍk…Ík~ÍkwÍkpÍkiÍkbÍk[ÍkTÍkMÍkFÍk?Ík8Ík1Ík*Ík#ÍkÍkÍkÍkÍkÍkùÌkòÌkëÌkäÌkÝÌkÖÌkÏÌkÈÌkÁÌkºÌk³Ìk¬Ìk¥ÌkžÌk—ÌkÌk‰Ìk‚Ìk{ÌktÌkmÌkfÌk_ÌkXÌkQÌkJÌkCÌk<Ìk5Ìk.Ìk'Ìk ÌkÌkÌk ÌkÌkýËköËkïËkèËkáËkÚËkÓËkÌËkÅËk¾Ëk·Ëk°Ëk©Ëk¢Ëk›Ëk”ËkËk†ËkËkxËkqËkjËkcËk\ËkUËkNËkGËk@Ëk9Ëk2Ëk+Ëk$ËkËkËkËkËkËkúÊkóÊkìÊkåÊkÞÊk×ÊkÐÊkÉÊkÂÊk»Êk´Êk­Êk¦ÊkŸÊk˜Êk‘ÊkŠÊkƒÊk|ÊkuÊknÊkgÊk`ÊkYÊkRÊkKÊkDÊk=Êk6Êk/Êk(Êk!ÊkÊkÊk ÊkÊkþÉk÷ÉkðÉkéÉkâÉkÛÉkÔÉkÍÉkÆÉk¿Ék¸Ék±ÉkªÉk£ÉkœÉk•ÉkŽÉk‡Ék€ÉkyÉkrÉkkÉkdÉk]ÉkVÉkOÉkHÉkAÉk:Ék3Ék,Ék%ÉkÉkÉkÉk ÉkÉkûÈkôÈkíÈkæÈkßÈkØÈkÑÈkÊÈkÃÈk¼ÈkµÈk®Èk§Èk Èk™Èk’Èk‹Èk„Èk}ÈkvÈkoÈkhÈkaÈkZÈkSÈkLÈkEÈk>Èk7Èk0Èk)Èk"ÈkÈkÈk ÈkÈkÿÇkøÇkñÇkêÇkãÇkÜÇkÕÇkÎÇkÇÇkÀÇk¹Çk²Çk«Çk¤ÇkÇk–ÇkÇkˆÇkÇkzÇksÇklÇkeÇk^ÇkWÇkPÇkIÇkBÇk;Çk4Çk-Çk&ÇkÇkÇkÇk ÇkÇküÆkõÆkîÆkçÆkàÆkÙÆkÒÆkËÆkÄÆk½Æk¶Æk¯Æk¨Æk¡ÆkšÆk“ÆkŒÆk…Æk~ÆkwÆkpÆkiÆkbÆk[ÆkTÆkMÆkFÆk?Æk8Æk1Æk*Æk#ÆkÆkÆkÆkÆkÆkùÅkòÅkëÅkäÅkÝÅkÖÅkÏÅkÈÅkÁÅkºÅk³Åk¬Åk¥ÅkžÅk—ÅkÅk‰Åk‚Åk{ÅktÅkmÅkfÅk_ÅkXÅkQÅkJÅkCÅk<Åk5Åk.Åk'Åk ÅkÅkÅk ÅkÅkýÄköÄkïÄkèÄkáÄkÚÄkÓÄkÌÄkÅÄk¾Äk·Äk°Äk©Äk¢Äk›Äk”ÄkÄk†ÄkÄkxÄkqÄkjÄkcÄk\ÄkUÄkNÄkGÄk@Äk9Äk2Äk+Äk$ÄkÄkÄkÄkÄkÄkúÃkóÃkìÃkåÃkÞÃk×ÃkÐÃkÉÃkÂÃk»Ãk´Ãk­Ãk¦ÃkŸÃk˜Ãk‘ÃkŠÃkƒÃk|ÃkuÃknÃkgÃk`ÃkYÃkRÃkKÃkDÃk=Ãk6Ãk/Ãk(Ãk!ÃkÃkÃk ÃkÃkþÂk÷ÂkðÂkéÂkâÂkÛÂkÔÂkÍÂkÆÂk¿Âk¸Âk±ÂkªÂk£ÂkœÂk•ÂkŽÂk‡Âk€ÂkyÂkrÂkkÂkdÂk]ÂkVÂkOÂkHÂkAÂk:Âk3Âk,Âk%ÂkÂkÂkÂk ÂkÂkûÁkôÁkíÁkæÁkßÁkØÁkÑÁkÊÁkÃÁk¼ÁkµÁk®Ák§Ák Ák™Ák’Ák‹Ák„Ák}ÁkvÁkoÁkhÁkaÁkZÁkSÁkLÁkEÁk>Ák7Ák0Ák)Ák"ÁkÁkÁk ÁkÁkÿÀkøÀkñÀkêÀkãÀkÜÀkÕÀkÎÀkÇÀkÀÀk¹Àk²Àk«Àk¤ÀkÀk–ÀkÀkˆÀkÀkzÀksÀklÀkeÀk^ÀkWÀkPÀkIÀkBÀk;Àk4Àk-Àk&ÀkÀkÀkÀk ÀkÀkü¿kõ¿kî¿kç¿kà¿kÙ¿kÒ¿kË¿kÄ¿k½¿k¶¿k¯¿k¨¿k¡¿kš¿k“¿kŒ¿k…¿k~¿kw¿kp¿ki¿kb¿k[¿kT¿kM¿kF¿k?¿k8¿k1¿k*¿k#¿k¿k¿k¿k¿k¿kù¾kò¾kë¾kä¾kݾkÖ¾kϾkȾkÁ¾kº¾k³¾k¬¾k¥¾kž¾k—¾k¾k‰¾k‚¾k{¾kt¾km¾kf¾k_¾kX¾kQ¾kJ¾kC¾k<¾k5¾k.¾k'¾k ¾k¾k¾k ¾k¾ký½kö½kï½kè½ká½kÚ½kÓ½k̽kŽk¾½k·½k°½k©½k¢½k›½k”½k½k†½k½kx½kq½kj½kc½k\½kU½kN½kG½k@½k9½k2½k+½k$½k½k½k½k½k½kú¼kó¼kì¼kå¼kÞ¼k×¼kмkɼk¼k»¼k´¼k­¼k¦¼kŸ¼k˜¼k‘¼kмkƒ¼k|¼ku¼kn¼kg¼k`¼kY¼kR¼kK¼kD¼k=¼k6¼k/¼k(¼k!¼k¼k¼k ¼k¼kþ»k÷»kð»ké»kâ»kÛ»kÔ»kÍ»kÆ»k¿»k¸»k±»kª»k£»kœ»k•»kŽ»k‡»k€»ky»kr»kk»kd»k]»kV»kO»kH»kA»k:»k3»k,»k%»k»k»k»k »k»kûºkôºkíºkæºkߺkغkѺkʺkúk¼ºkµºk®ºk§ºk ºk™ºk’ºk‹ºk„ºk}ºkvºkoºkhºkaºkZºkSºkLºkEºk>ºk7ºk0ºk)ºk"ºkºkºk ºkºkÿ¹kø¹kñ¹kê¹kã¹kܹkÕ¹kιkǹkÀ¹k¹¹k²¹k«¹k¤¹k¹k–¹k¹kˆ¹k¹kz¹ks¹kl¹ke¹k^¹kW¹kP¹kI¹kB¹k;¹k4¹k-¹k&¹k¹k¹k¹k ¹k¹kü¸kõ¸kî¸kç¸kà¸kÙ¸kÒ¸k˸kĸk½¸k¶¸k¯¸k¨¸k¡¸kš¸k“¸kŒ¸k…¸k~¸kw¸kp¸ki¸kb¸k[¸kT¸kM¸kF¸k?¸k8¸k1¸k*¸k#¸k¸k¸k¸k¸k¸kù·kò·kë·kä·kÝ·kÖ·kÏ·kÈ·kÁ·kº·k³·k¬·k¥·kž·k—·k·k‰·k‚·k{·kt·km·kf·k_·kX·kQ·kJ·kC·k<·k5·k.·k'·k ·k·k·k ·k·ký¶kö¶kï¶kè¶ká¶kÚ¶kÓ¶k̶kŶk¾¶k·¶k°¶k©¶k¢¶k›¶k”¶k¶k†¶k¶kx¶kq¶kj¶kc¶k\¶kU¶kN¶kG¶k@¶k9¶k2¶k+¶k$¶k¶k¶k¶k¶k¶kúµkóµkìµkåµkÞµk×µkеkɵkµk»µk´µk­µk¦µkŸµk˜µk‘µkеkƒµk|µkuµknµkgµk`µkYµkRµkKµkDµk=µk6µk/µk(µk!µkµkµk µkµkþ´k÷´kð´ké´kâ´kÛ´kÔ´kÍ´kÆ´k¿´k¸´k±´kª´k£´kœ´k•´kŽ´k‡´k€´ky´kr´kk´kd´k]´kV´kO´kH´kA´k:´k3´k,´k%´k´k´k´k ´k´kû³kô³kí³kæ³kß³kسkѳkʳkók¼³kµ³k®³k§³k ³k™³k’³k‹³k„³k}³kv³ko³kh³ka³kZ³kS³kL³kE³k>³k7³k0³k)³k"³k³k³k ³k³kÿ²kø²kñ²kê²kã²kܲkÕ²kβkDzkÀ²k¹²k²²k«²k¤²k²k–²k²kˆ²k²kz²ks²kl²ke²k^²kW²kP²kI²kB²k;²k4²k-²k&²k²k²k²k ²k²kü±kõ±kî±kç±kà±kÙ±kÒ±k˱kık½±k¶±k¯±k¨±k¡±kš±k“±kŒ±k…±k~±kw±kp±ki±kb±k[±kT±kM±kF±k?±k8±k1±k*±k#±k±k±k±k±k±kù°kò°kë°kä°kݰkÖ°kϰkȰkÁ°kº°k³°k¬°k¥°kž°k—°k°k‰°k‚°k{°kt°km°kf°k_°kX°kQ°kJ°kC°k<°k5°k.°k'°k °k°k°k °k°ký¯kö¯kï¯kè¯ká¯kÚ¯kÓ¯k̯kůk¾¯k·¯k°¯k©¯k¢¯k›¯k”¯k¯k†¯k¯kx¯kq¯kj¯kc¯k\¯kU¯kN¯kG¯k@¯k9¯k2¯k+¯k$¯k¯k¯k¯k¯k¯kú®kó®kì®kå®kÞ®k×®kЮkÉ®k®k»®k´®k­®k¦®kŸ®k˜®k‘®kŠ®kƒ®k|®ku®kn®kg®k`®kY®kR®kK®kD®k=®k6®k/®k(®k!®k®k®k ®k®kþ­k÷­kð­ké­kâ­kÛ­kÔ­kÍ­kÆ­k¿­k¸­k±­kª­k£­kœ­k•­kŽ­k‡­k€­ky­kr­kk­kd­k]­kV­kO­kH­kA­k:­k3­k,­k%­k­k­k­k ­k­kû¬kô¬kí¬kæ¬k߬kجkѬkʬkìk¼¬kµ¬k®¬k§¬k ¬k™¬k’¬k‹¬k„¬k}¬kv¬ko¬kh¬ka¬kZ¬kS¬kL¬kE¬k>¬k7¬k0¬k)¬k"¬k¬k¬k ¬k¬kÿ«kø«kñ«kê«kã«kÜ«kÕ«kΫkÇ«kÀ«k¹«k²«k««k¤«k«k–«k«kˆ«k«kz«ks«kl«ke«k^«kW«kP«kI«kB«k;«k4«k-«k&«k«k«k«k «k«küªkõªkîªkçªkàªkÙªkÒªk˪kĪk½ªk¶ªk¯ªk¨ªk¡ªkšªk“ªkŒªk…ªk~ªkwªkpªkiªkbªk[ªkTªkMªkFªk?ªk8ªk1ªk*ªk#ªkªkªkªkªkªkù©kò©kë©kä©kÝ©kÖ©kÏ©kÈ©kÁ©kº©k³©k¬©k¥©kž©k—©k©k‰©k‚©k{©kt©km©kf©k_©kX©kQ©kJ©kC©k<©k5©k.©k'©k ©k©k©k ©k©ký¨kö¨kï¨kè¨ká¨kÚ¨kÓ¨k̨kŨk¾¨k·¨k°¨k©¨k¢¨k›¨k”¨k¨k†¨k¨kx¨kq¨kj¨kc¨k\¨kU¨kN¨kG¨k@¨k9¨k2¨k+¨k$¨k¨k¨k¨k¨k¨kú§kó§kì§kå§kÞ§k×§kЧkɧk§k»§k´§k­§k¦§kŸ§k˜§k‘§kЧkƒ§k|§ku§kn§kg§k`§kY§kR§kK§kD§k=§k6§k/§k(§k!§k§k§k §k§kþ¦k÷¦kð¦ké¦kâ¦kÛ¦kÔ¦kͦkƦk¿¦k¸¦k±¦kª¦k£¦kœ¦k•¦kަk‡¦k€¦ky¦kr¦kk¦kd¦k]¦kV¦kO¦kH¦kA¦k:¦k3¦k,¦k%¦k¦k¦k¦k ¦k¦kû¥kô¥kí¥kæ¥kߥkØ¥kÑ¥kÊ¥kÃ¥k¼¥kµ¥k®¥k§¥k ¥k™¥k’¥k‹¥k„¥k}¥kv¥ko¥kh¥ka¥kZ¥kS¥kL¥kE¥k>¥k7¥k0¥k)¥k"¥k¥k¥k ¥k¥kÿ¤kø¤kñ¤kê¤kã¤kܤkÕ¤kΤkǤkÀ¤k¹¤k²¤k«¤k¤¤k¤k–¤k¤kˆ¤k¤kz¤ks¤kl¤ke¤k^¤kW¤kP¤kI¤kB¤k;¤k4¤k-¤k&¤k¤k¤k¤k ¤k¤kü£kõ£kî£kç£kà£kÙ£kÒ£kË£kÄ£k½£k¶£k¯£k¨£k¡£kš£k“£kŒ£k…£k~£kw£kp£ki£kb£k[£kT£kM£kF£k?£k8£k1£k*£k#£k£k£k£k£k£kù¢kò¢kë¢kä¢kÝ¢kÖ¢kÏ¢kÈ¢kÁ¢kº¢k³¢k¬¢k¥¢kž¢k—¢k¢k‰¢k‚¢k{¢kt¢km¢kf¢k_¢kX¢kQ¢kJ¢kC¢k<¢k5¢k.¢k'¢k ¢k¢k¢k ¢k¢ký¡kö¡kï¡kè¡ká¡kÚ¡kÓ¡kÌ¡kÅ¡k¾¡k·¡k°¡k©¡k¢¡k›¡k”¡k¡k†¡k¡kx¡kq¡kj¡kc¡k\¡kU¡kN¡kG¡k@¡k9¡k2¡k+¡k$¡k¡k¡k¡k¡k¡kú kó kì kå kÞ k× kРkÉ k k» k´ k­ k¦ kŸ k˜ k‘ kŠ kƒ k| ku kn kg k` kY kR kK kD k= k6 k/ k( k! k k k  k kþŸk÷ŸkðŸkéŸkâŸkÛŸkÔŸkÍŸkÆŸk¿Ÿk¸Ÿk±ŸkªŸk£ŸkœŸk•ŸkŽŸk‡Ÿk€ŸkyŸkrŸkkŸkdŸk]ŸkVŸkOŸkHŸkAŸk:Ÿk3Ÿk,Ÿk%ŸkŸkŸkŸk ŸkŸkûžkôžkížkæžkßžkØžkÑžkÊžkÞk¼žkµžk®žk§žk žk™žk’žk‹žk„žk}žkvžkožkhžkažkZžkSžkLžkEžk>žk7žk0žk)žk"žkžkžk žkžkÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküœkõœkîœkçœkàœkÙœkÒœkËœkÄœk½œk¶œk¯œk¨œk¡œkšœk“œkŒœk…œk~œkwœkpœkiœkbœk[œkTœkMœkFœk?œk8œk1œk*œk#œkœkœkœkœkœkù›kò›kë›kä›kÝ›kÖ›kÏ›kÈ›kÁ›kº›k³›k¬›k¥›kž›k—›k›k‰›k‚›k{›kt›km›kf›k_›kX›kQ›kJ›kC›k<›k5›k.›k'›k ›k›k›k ›k›kýšköškïškèškáškÚškÓškÌškÅšk¾šk·šk°šk©šk¢šk›šk”škšk†škškxškqškjškcšk\škUškNškGšk@šk9šk2šk+šk$škškškškškškú™kó™kì™kå™kÞ™k×™kЙkÉ™k™k»™k´™k­™k¦™kŸ™k˜™k‘™kŠ™kƒ™k|™ku™kn™kg™k`™kY™kR™kK™kD™k=™k6™k/™k(™k!™k™k™k ™k™kþ˜k÷˜kð˜ké˜kâ˜kÛ˜kÔ˜k͘kƘk¿˜k¸˜k±˜kª˜k£˜kœ˜k•˜kŽ˜k‡˜k€˜ky˜kr˜kk˜kd˜k]˜kV˜kO˜kH˜kA˜k:˜k3˜k,˜k%˜k˜k˜k˜k ˜k˜kû—kô—kí—kæ—kß—kØ—kÑ—kÊ—k×k¼—kµ—k®—k§—k —k™—k’—k‹—k„—k}—kv—ko—kh—ka—kZ—kS—kL—kE—k>—k7—k0—k)—k"—k—k—k —k—kÿ–kø–kñ–kê–kã–kÜ–kÕ–kΖkÇ–kÀ–k¹–k²–k«–k¤–k–k––k–kˆ–k–kz–ks–kl–ke–k^–kW–kP–kI–kB–k;–k4–k-–k&–k–k–k–k –k–kü•kõ•kî•kç•kà•kÙ•kÒ•kË•kÄ•k½•k¶•k¯•k¨•k¡•kš•k“•kŒ•k…•k~•kw•kp•ki•kb•k[•kT•kM•kF•k?•k8•k1•k*•k#•k•k•k•k•k•kù”kò”kë”kä”kÝ”kÖ”kÏ”kÈ”kÁ”kº”k³”k¬”k¥”kž”k—”k”k‰”k‚”k{”kt”km”kf”k_”kX”kQ”kJ”kC”k<”k5”k.”k'”k ”k”k”k ”k”ký“kö“kï“kè“ká“kÚ“kÓ“kÌ“kÅ“k¾“k·“k°“k©“k¢“k›“k”“k“k†“k“kx“kq“kj“kc“k\“kU“kN“kG“k@“k9“k2“k+“k$“k“k“k“k“k“kú’kó’kì’kå’kÞ’k×’kÐ’kÉ’kÂ’k»’k´’k­’k¦’kŸ’k˜’k‘’kŠ’kƒ’k|’ku’kn’kg’k`’kY’kR’kK’kD’k=’k6’k/’k(’k!’k’k’k ’k’kþ‘k÷‘kð‘ké‘kâ‘kÛ‘kÔ‘kÍ‘kÆ‘k¿‘k¸‘k±‘kª‘k£‘kœ‘k•‘kŽ‘k‡‘k€‘ky‘kr‘kk‘kd‘k]‘kV‘kO‘kH‘kA‘k:‘k3‘k,‘k%‘k‘k‘k‘k ‘k‘kûkôkíkækßkØkÑkÊkÃk¼kµk®k§k k™k’k‹k„k}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküŽkõŽkîŽkçŽkàŽkÙŽkÒŽkËŽkÄŽk½Žk¶Žk¯Žk¨Žk¡ŽkšŽk“ŽkŒŽk…Žk~ŽkwŽkpŽkiŽkbŽk[ŽkTŽkMŽkFŽk?Žk8Žk1Žk*Žk#ŽkŽkŽkŽkŽkŽkùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk‰k7‰k0‰k)‰k"‰k‰k‰k ‰k‰kÿˆkøˆkñˆkêˆkãˆk܈kÕˆkΈkLjkÀˆk¹ˆk²ˆk«ˆk¤ˆkˆk–ˆkˆkˆˆkˆkzˆksˆklˆkeˆk^ˆkWˆkPˆkIˆkBˆk;ˆk4ˆk-ˆk&ˆkˆkˆkˆk ˆkˆkü‡kõ‡kî‡kç‡kà‡kÙ‡kÒ‡kˇkćk½‡k¶‡k¯‡k¨‡k¡‡kš‡k“‡kŒ‡k…‡k~‡kw‡kp‡ki‡kb‡k[‡kT‡kM‡kF‡k?‡k8‡k1‡k*‡k#‡k‡k‡k‡k‡k‡kù†kò†kë†kä†k݆kÖ†kφkȆkÁ†kº†k³†k¬†k¥†kž†k—†k†k‰†k‚†k{†kt†km†kf†k_†kX†kQ†kJ†kC†k<†k5†k.†k'†k †k†k†k †k†ký…kö…kï…kè…ká…kÚ…kÓ…kÌ…kÅ…k¾…k·…k°…k©…k¢…k›…k”…k…k†…k…kx…kq…kj…kc…k\…kU…kN…kG…k@…k9…k2…k+…k$…k…k…k…k…k…kú„kó„kì„kå„kÞ„kׄkЄkÉ„k„k»„k´„k­„k¦„kŸ„k˜„k‘„kŠ„kƒ„k|„ku„kn„kg„k`„kY„kR„kK„kD„k=„k6„k/„k(„k!„k„k„k „k„kþƒk÷ƒkðƒkéƒkâƒkÛƒkÔƒk̓kƃk¿ƒk¸ƒk±ƒkªƒk£ƒkœƒk•ƒkŽƒk‡ƒk€ƒkyƒkrƒkkƒkdƒk]ƒkVƒkOƒkHƒkAƒk:ƒk3ƒk,ƒk%ƒkƒkƒkƒk ƒkƒkû‚kô‚kí‚kæ‚kß‚kØ‚kÑ‚kÊ‚kÂk¼‚kµ‚k®‚k§‚k ‚k™‚k’‚k‹‚k„‚k}‚kv‚ko‚kh‚ka‚kZ‚kS‚kL‚kE‚k>‚k7‚k0‚k)‚k"‚k‚k‚k ‚k‚kÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkü€kõ€kî€kç€kà€kÙ€kÒ€kË€kÄ€k½€k¶€k¯€k¨€k¡€kš€k“€kŒ€k…€k~€kw€kp€ki€kb€k[€kT€kM€kF€k?€k8€k1€k*€k#€k€k€k€k€k€kùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kký~kö~kï~kè~ká~kÚ~kÓ~kÌ~kÅ~k¾~k·~k°~k©~k¢~k›~k”~k~k†~k~kx~kq~kj~kc~k\~kU~kN~kG~k@~k9~k2~k+~k$~k~k~k~k~k~kú}kó}kì}kå}kÞ}k×}kÐ}kÉ}kÂ}k»}k´}k­}k¦}kŸ}k˜}k‘}kŠ}kƒ}k|}ku}kn}kg}k`}kY}kR}kK}kD}k=}k6}k/}k(}k!}k}k}k }k}kþ|k÷|kð|ké|kâ|kÛ|kÔ|kÍ|kÆ|k¿|k¸|k±|kª|k£|kœ|k•|kŽ|k‡|k€|ky|kr|kk|kd|k]|kV|kO|kH|kA|k:|k3|k,|k%|k|k|k|k |k|kû{kô{kí{kæ{kß{kØ{kÑ{kÊ{kÃ{k¼{kµ{k®{k§{k {k™{k’{k‹{k„{k}{kv{ko{kh{ka{kZ{kS{kL{kE{k>{k7{k0{k){k"{k{k{k {k{kÿzkøzkñzkêzkãzkÜzkÕzkÎzkÇzkÀzk¹zk²zk«zk¤zkzk–zkzkˆzkzkzzkszklzkezk^zkWzkPzkIzkBzk;zk4zk-zk&zkzkzkzk zkzküykõykîykçykàykÙykÒykËykÄyk½yk¶yk¯yk¨yk¡ykšyk“ykŒyk…yk~ykwykpykiykbyk[ykTykMykFyk?yk8yk1yk*yk#ykykykykykykùxkòxkëxkäxkÝxkÖxkÏxkÈxkÁxkºxk³xk¬xk¥xkžxk—xkxk‰xk‚xk{xktxkmxkfxk_xkXxkQxkJxkCxktk7tk0tk)tk"tktktk tktkÿskøskñskêskãskÜskÕskÎskÇskÀsk¹sk²sk«sk¤sksk–skskˆskskzskssklskesk^skWskPskIskBsk;sk4sk-sk&sksksksk skskürkõrkîrkçrkàrkÙrkÒrkËrkÄrk½rk¶rk¯rk¨rk¡rkšrk“rkŒrk…rk~rkwrkprkirkbrk[rkTrkMrkFrk?rk8rk1rk*rk#rkrkrkrkrkrkùqkòqkëqkäqkÝqkÖqkÏqkÈqkÁqkºqk³qk¬qk¥qkžqk—qkqk‰qk‚qk{qktqkmqkfqk_qkXqkQqkJqkCqkmk7mk0mk)mk"mkmkmk mkmkÿlkølkñlkêlkãlkÜlkÕlkÎlkÇlkÀlk¹lk²lk«lk¤lklk–lklkˆlklkzlkslkllkelk^lkWlkPlkIlkBlk;lk4lk-lk&lklklklk lklkükkõkkîkkçkkàkkÙkkÒkkËkkÄkk½kk¶kk¯kk¨kk¡kkškk“kkŒkk…kk~kkwkkpkkikkbkk[kkTkkMkkFkk?kk8kk1kk*kk#kkkkkkkkkkkkùjkòjkëjkäjkÝjkÖjkÏjkÈjkÁjkºjk³jk¬jk¥jkžjk—jkjk‰jk‚jk{jktjkmjkfjk_jkXjkQjkJjkCjkfk7fk0fk)fk"fkfkfk fkfkÿekøekñekêekãekÜekÕekÎekÇekÀek¹ek²ek«ek¤ekek–ekekˆekekzekseklekeek^ekWekPekIekBek;ek4ek-ek&ekekekek ekeküdkõdkîdkçdkàdkÙdkÒdkËdkÄdk½dk¶dk¯dk¨dk¡dkšdk“dkŒdk…dk~dkwdkpdkidkbdk[dkTdkMdkFdk?dk8dk1dk*dk#dkdkdkdkdkdkùckòckëckäckÝckÖckÏckÈckÁckºck³ck¬ck¥ckžck—ckck‰ck‚ck{cktckmckfck_ckXckQckJckCck_k7_k0_k)_k"_k_k_k _k_kÿ^kø^kñ^kê^kã^kÜ^kÕ^kÎ^kÇ^kÀ^k¹^k²^k«^k¤^k^k–^k^kˆ^k^kz^ks^kl^ke^k^^kW^kP^kI^kB^k;^k4^k-^k&^k^k^k^k ^k^kü]kõ]kî]kç]kà]kÙ]kÒ]kË]kÄ]k½]k¶]k¯]k¨]k¡]kš]k“]kŒ]k…]k~]kw]kp]ki]kb]k[]kT]kM]kF]k?]k8]k1]k*]k#]k]k]k]k]k]kù\kò\kë\kä\kÝ\kÖ\kÏ\kÈ\kÁ\kº\k³\k¬\k¥\kž\k—\k\k‰\k‚\k{\kt\km\kf\k_\kX\kQ\kJ\kC\k<\k5\k.\k'\k \k\k\k \k\ký[kö[kï[kè[ká[kÚ[kÓ[kÌ[kÅ[k¾[k·[k°[k©[k¢[k›[k”[k[k†[k[kx[kq[kj[kc[k\[kU[kN[kG[k@[k9[k2[k+[k$[k[k[k[k[k[kúZkóZkìZkåZkÞZk×ZkÐZkÉZkÂZk»Zk´Zk­Zk¦ZkŸZk˜Zk‘ZkŠZkƒZk|ZkuZknZkgZk`ZkYZkRZkKZkDZk=Zk6Zk/Zk(Zk!ZkZkZk ZkZkþYk÷YkðYkéYkâYkÛYkÔYkÍYkÆYk¿Yk¸Yk±YkªYk£YkœYk•YkŽYk‡Yk€YkyYkrYkkYkdYk]YkVYkOYkHYkAYk:Yk3Yk,Yk%YkYkYkYk YkYkûXkôXkíXkæXkßXkØXkÑXkÊXkÃXk¼XkµXk®Xk§Xk Xk™Xk’Xk‹Xk„Xk}XkvXkoXkhXkaXkZXkSXkLXkEXk>Xk7Xk0Xk)Xk"XkXkXk XkXkÿWkøWkñWkêWkãWkÜWkÕWkÎWkÇWkÀWk¹Wk²Wk«Wk¤WkWk–WkWkˆWkWkzWksWklWkeWk^WkWWkPWkIWkBWk;Wk4Wk-Wk&WkWkWkWk WkWküVkõVkîVkçVkàVkÙVkÒVkËVkÄVk½Vk¶Vk¯Vk¨Vk¡VkšVk“VkŒVk…Vk~VkwVkpVkiVkbVk[VkTVkMVkFVk?Vk8Vk1Vk*Vk#VkVkVkVkVkVkùUkòUkëUkäUkÝUkÖUkÏUkÈUkÁUkºUk³Uk¬Uk¥UkžUk—UkUk‰Uk‚Uk{UktUkmUkfUk_UkXUkQUkJUkCUkQk7Qk0Qk)Qk"QkQkQk QkQkÿPkøPkñPkêPkãPkÜPkÕPkÎPkÇPkÀPk¹Pk²Pk«Pk¤PkPk–PkPkˆPkPkzPksPklPkePk^PkWPkPPkIPkBPk;Pk4Pk-Pk&PkPkPkPk PkPküOkõOkîOkçOkàOkÙOkÒOkËOkÄOk½Ok¶Ok¯Ok¨Ok¡OkšOk“OkŒOk…Ok~OkwOkpOkiOkbOk[OkTOkMOkFOk?Ok8Ok1Ok*Ok#OkOkOkOkOkOkùNkòNkëNkäNkÝNkÖNkÏNkÈNkÁNkºNk³Nk¬Nk¥NkžNk—NkNk‰Nk‚Nk{NktNkmNkfNk_NkXNkQNkJNkCNkJk7Jk0Jk)Jk"JkJkJk JkJkÿIkøIkñIkêIkãIkÜIkÕIkÎIkÇIkÀIk¹Ik²Ik«Ik¤IkIk–IkIkˆIkIkzIksIklIkeIk^IkWIkPIkIIkBIk;Ik4Ik-Ik&IkIkIkIk IkIküHkõHkîHkçHkàHkÙHkÒHkËHkÄHk½Hk¶Hk¯Hk¨Hk¡HkšHk“HkŒHk…Hk~HkwHkpHkiHkbHk[HkTHkMHkFHk?Hk8Hk1Hk*Hk#HkHkHkHkHkHkùGkòGkëGkäGkÝGkÖGkÏGkÈGkÁGkºGk³Gk¬Gk¥GkžGk—GkGk‰Gk‚Gk{GktGkmGkfGk_GkXGkQGkJGkCGkCk7Ck0Ck)Ck"CkCkCk CkCkÿBkøBkñBkêBkãBkÜBkÕBkÎBkÇBkÀBk¹Bk²Bk«Bk¤BkBk–BkBkˆBkBkzBksBklBkeBk^BkWBkPBkIBkBBk;Bk4Bk-Bk&BkBkBkBk BkBküAkõAkîAkçAkàAkÙAkÒAkËAkÄAk½Ak¶Ak¯Ak¨Ak¡AkšAk“AkŒAk…Ak~AkwAkpAkiAkbAk[AkTAkMAkFAk?Ak8Ak1Ak*Ak#AkAkAkAkAkAkù@kò@kë@kä@kÝ@kÖ@kÏ@kÈ@kÁ@kº@k³@k¬@k¥@kž@k—@k@k‰@k‚@k{@kt@km@kf@k_@kX@kQ@kJ@kC@k<@k5@k.@k'@k @k@k@k @k@ký?kö?kï?kè?ká?kÚ?kÓ?kÌ?kÅ?k¾?k·?k°?k©?k¢?k›?k”?k?k†?k?kx?kq?kj?kc?k\?kU?kN?kG?k@?k9?k2?k+?k$?k?k?k?k?k?kú>kó>kì>kå>kÞ>k×>kÐ>kÉ>kÂ>k»>k´>k­>k¦>kŸ>k˜>k‘>kŠ>kƒ>k|>ku>kn>kg>k`>kY>kR>kK>kD>k=>k6>k/>k(>k!>k>k>k >k>kþ=k÷=kð=ké=kâ=kÛ=kÔ=kÍ=kÆ=k¿=k¸=k±=kª=k£=kœ=k•=kŽ=k‡=k€=ky=kr=kk=kd=k]=kV=kO=kH=kA=k:=k3=k,=k%=k=k=k=k =k=kû5k75k05k)5k"5k5k5k 5k5kÿ4kø4kñ4kê4kã4kÜ4kÕ4kÎ4kÇ4kÀ4k¹4k²4k«4k¤4k4k–4k4kˆ4k4kz4ks4kl4ke4k^4kW4kP4kI4kB4k;4k44k-4k&4k4k4k4k 4k4kü3kõ3kî3kç3kà3kÙ3kÒ3kË3kÄ3k½3k¶3k¯3k¨3k¡3kš3k“3kŒ3k…3k~3kw3kp3ki3kb3k[3kT3kM3kF3k?3k83k13k*3k#3k3k3k3k3k3kù2kò2kë2kä2kÝ2kÖ2kÏ2kÈ2kÁ2kº2k³2k¬2k¥2kž2k—2k2k‰2k‚2k{2kt2km2kf2k_2kX2kQ2kJ2kC2k<2k52k.2k'2k 2k2k2k 2k2ký1kö1kï1kè1ká1kÚ1kÓ1kÌ1kÅ1k¾1k·1k°1k©1k¢1k›1k”1k1k†1k1kx1kq1kj1kc1k\1kU1kN1kG1k@1k91k21k+1k$1k1k1k1k1k1kú0kó0kì0kå0kÞ0k×0kÐ0kÉ0kÂ0k»0k´0k­0k¦0kŸ0k˜0k‘0kŠ0kƒ0k|0ku0kn0kg0k`0kY0kR0kK0kD0k=0k60k/0k(0k!0k0k0k 0k0kþ/k÷/kð/ké/kâ/kÛ/kÔ/kÍ/kÆ/k¿/k¸/k±/kª/k£/kœ/k•/kŽ/k‡/k€/ky/kr/kk/kd/k]/kV/kO/kH/kA/k:/k3/k,/k%/k/k/k/k /k/kû.kô.kí.kæ.kß.kØ.kÑ.kÊ.kÃ.k¼.kµ.k®.k§.k .k™.k’.k‹.k„.k}.kv.ko.kh.ka.kZ.kS.kL.kE.k>.k7.k0.k).k".k.k.k .k.kÿ-kø-kñ-kê-kã-kÜ-kÕ-kÎ-kÇ-kÀ-k¹-k²-k«-k¤-k-k–-k-kˆ-k-kz-ks-kl-ke-k^-kW-kP-kI-kB-k;-k4-k--k&-k-k-k-k -k-kü,kõ,kî,kç,kà,kÙ,kÒ,kË,kÄ,k½,k¶,k¯,k¨,k¡,kš,k“,kŒ,k…,k~,kw,kp,ki,kb,k[,kT,kM,kF,k?,k8,k1,k*,k#,k,k,k,k,k,kù+kò+kë+kä+kÝ+kÖ+kÏ+kÈ+kÁ+kº+k³+k¬+k¥+kž+k—+k+k‰+k‚+k{+kt+km+kf+k_+kX+kQ+kJ+kC+k<+k5+k.+k'+k +k+k+k +k+ký*kö*kï*kè*ká*kÚ*kÓ*kÌ*kÅ*k¾*k·*k°*k©*k¢*k›*k”*k*k†*k*kx*kq*kj*kc*k\*kU*kN*kG*k@*k9*k2*k+*k$*k*k*k*k*k*kú)kó)kì)kå)kÞ)k×)kÐ)kÉ)kÂ)k»)k´)k­)k¦)kŸ)k˜)k‘)kŠ)kƒ)k|)ku)kn)kg)k`)kY)kR)kK)kD)k=)k6)k/)k()k!)k)k)k )k)kþ(k÷(kð(ké(kâ(kÛ(kÔ(kÍ(kÆ(k¿(k¸(k±(kª(k£(kœ(k•(kŽ(k‡(k€(ky(kr(kk(kd(k](kV(kO(kH(kA(k:(k3(k,(k%(k(k(k(k (k(kû'kô'kí'kæ'kß'kØ'kÑ'kÊ'kÃ'k¼'kµ'k®'k§'k 'k™'k’'k‹'k„'k}'kv'ko'kh'ka'kZ'kS'kL'kE'k>'k7'k0'k)'k"'k'k'k 'k'kÿ&kø&kñ&kê&kã&kÜ&kÕ&kÎ&kÇ&kÀ&k¹&k²&k«&k¤&k&k–&k&kˆ&k&kz&ks&kl&ke&k^&kW&kP&kI&kB&k;&k4&k-&k&&k&k&k&k &k&kü%kõ%kî%kç%kà%kÙ%kÒ%kË%kÄ%k½%k¶%k¯%k¨%k¡%kš%k“%kŒ%k…%k~%kw%kp%ki%kb%k[%kT%kM%kF%k?%k8%k1%k*%k#%k%k%k%k%k%kù$kò$kë$kä$kÝ$kÖ$kÏ$kÈ$kÁ$kº$k³$k¬$k¥$kž$k—$k$k‰$k‚$k{$kt$km$kf$k_$kX$kQ$kJ$kC$k<$k5$k.$k'$k $k$k$k $k$ký#kö#kï#kè#ká#kÚ#kÓ#kÌ#kÅ#k¾#k·#k°#k©#k¢#k›#k”#k#k†#k#kx#kq#kj#kc#k\#kU#kN#kG#k@#k9#k2#k+#k$#k#k#k#k#k#kú"kó"kì"kå"kÞ"k×"kÐ"kÉ"kÂ"k»"k´"k­"k¦"kŸ"k˜"k‘"kŠ"kƒ"k|"ku"kn"kg"k`"kY"kR"kK"kD"k="k6"k/"k("k!"k"k"k "k"kþ!k÷!kð!ké!kâ!kÛ!kÔ!kÍ!kÆ!k¿!k¸!k±!kª!k£!kœ!k•!kŽ!k‡!k€!ky!kr!kk!kd!k]!kV!kO!kH!kA!k:!k3!k,!k%!k!k!k!k !k!kû kô kí kæ kß kØ kÑ kÊ kà k¼ kµ k® k§ k  k™ k’ k‹ k„ k} kv ko kh ka kZ kS kL kE k> k7 k0 k) k" k k k k kÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkýkökïkèkákÚkÓkÌkÅk¾k·k°k©k¢k›k”kk†kkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkúkókìkåkÞk×kÐkÉkÂk»k´k­k¦kŸk˜k‘kŠkƒk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkþk÷kðkékâkÛkÔkÍkÆk¿k¸k±kªk£kœk•kŽk‡k€kykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkûkôkíkækßkØkÑkÊkÃk¼kµk®k§k k™k’k‹k„k}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkýkökïkèkákÚkÓkÌkÅk¾k·k°k©k¢k›k”kk†kkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkúkókìkåkÞk×kÐkÉkÂk»k´k­k¦kŸk˜k‘kŠkƒk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkþk÷kðkékâkÛkÔkÍkÆk¿k¸k±kªk£kœk•kŽk‡k€kykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkûkôkíkækßkØkÑkÊkÃk¼kµk®k§k k™k’k‹k„k}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkýkökïkèkákÚkÓkÌkÅk¾k·k°k©k¢k›k”kk†kkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkú kó kì kå kÞ k× kÐ kÉ k k» k´ k­ k¦ kŸ k˜ k‘ kŠ kƒ k| ku kn kg k` kY kR kK kD k= k6 k/ k( k! k k k k kþ k÷ kð ké kâ kÛ kÔ kÍ kÆ k¿ k¸ k± kª k£ kœ k• kŽ k‡ k€ ky kr kk kd k] kV kO kH kA k: k3 k, k% k k k k k kû kô kí kæ kß kØ kÑ kÊ kà k¼ kµ k® k§ k  k™ k’ k‹ k„ k} kv ko kh ka kZ kS kL kE k> k7 k0 k) k" k k k k kÿ kø kñ kê kã kÜ kÕ kÎ kÇ kÀ k¹ k² k« k¤ k k– k kˆ k kz ks kl ke k^ kW kP kI kB k; k4 k- k& k k k k k kü kõ kî kç kà kÙ kÒ kË kÄ k½ k¶ k¯ k¨ k¡ kš k“ kŒ k… k~ kw kp ki kb k[ kT kM kF k? k8 k1 k* k# k k k k k kùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkýkökïkèkákÚkÓkÌkÅk¾k·k°k©k¢k›k”kk†kkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkúkókìkåkÞk×kÐkÉkÂk»k´k­k¦kŸk˜k‘kŠkƒk|kuknkgk`kYkRkKkDk=k6k/k(k!kkk kkþk÷kðkékâkÛkÔkÍkÆk¿k¸k±kªk£kœk•kŽk‡k€kykrkkkdk]kVkOkHkAk:k3k,k%kkkk kkûkôkíkækßkØkÑkÊkÃk¼kµk®k§k k™k’k‹k„k}kvkokhkakZkSkLkEk>k7k0k)k"kkk kkÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kkükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCk<k5k.k'k kkk kkýkökïkèkákÚkÓkÌkÅk¾k·k°k©k¢k›k”kk†kkxkqkjkck\kUkNkGk@k9k2k+k$kkkkkkúÿjóÿjìÿjåÿjÞÿj×ÿjÐÿjÉÿjÂÿj»ÿj´ÿj­ÿj¦ÿjŸÿj˜ÿj‘ÿjŠÿjƒÿj|ÿjuÿjnÿjgÿj`ÿjYÿjRÿjKÿjDÿj=ÿj6ÿj/ÿj(ÿj!ÿjÿjÿj ÿjÿjþþj÷þjðþjéþjâþjÛþjÔþjÍþjÆþj¿þj¸þj±þjªþj£þjœþj•þjŽþj‡þj€þjyþjrþjkþjdþj]þjVþjOþjHþjAþj:þj3þj,þj%þjþjþjþj þjþjûýjôýjíýjæýjßýjØýjÑýjÊýjÃýj¼ýjµýj®ýj§ýj ýj™ýj’ýj‹ýj„ýj}ýjvýjoýjhýjaýjZýjSýjLýjEýj>ýj7ýj0ýj)ýj"ýjýjýj ýjýjÿüjøüjñüjêüjãüjÜüjÕüjÎüjÇüjÀüj¹üj²üj«üj¤üjüj–üjüjˆüjüjzüjsüjlüjeüj^üjWüjPüjIüjBüj;üj4üj-üj&üjüjüjüj üjüjüûjõûjîûjçûjàûjÙûjÒûjËûjÄûj½ûj¶ûj¯ûj¨ûj¡ûjšûj“ûjŒûj…ûj~ûjwûjpûjiûjbûj[ûjTûjMûjFûj?ûj8ûj1ûj*ûj#ûjûjûjûjûjûjùújòújëújäújÝújÖújÏújÈújÁújºúj³új¬új¥újžúj—újúj‰új‚új{újtújmújfúj_újXújQújJújCúj<új5új.új'új újújúj újújýùjöùjïùjèùjáùjÚùjÓùjÌùjÅùj¾ùj·ùj°ùj©ùj¢ùj›ùj”ùjùj†ùjùjxùjqùjjùjcùj\ùjUùjNùjGùj@ùj9ùj2ùj+ùj$ùjùjùjùjùjùjúøjóøjìøjåøjÞøj×øjÐøjÉøjÂøj»øj´øj­øj¦øjŸøj˜øj‘øjŠøjƒøj|øjuøjnøjgøj`øjYøjRøjKøjDøj=øj6øj/øj(øj!øjøjøj øjøjþ÷j÷÷jð÷jé÷jâ÷jÛ÷jÔ÷jÍ÷jÆ÷j¿÷j¸÷j±÷jª÷j£÷jœ÷j•÷jŽ÷j‡÷j€÷jy÷jr÷jk÷jd÷j]÷jV÷jO÷jH÷jA÷j:÷j3÷j,÷j%÷j÷j÷j÷j ÷j÷jûöjôöjíöjæöjßöjØöjÑöjÊöjÃöj¼öjµöj®öj§öj öj™öj’öj‹öj„öj}öjvöjoöjhöjaöjZöjSöjLöjEöj>öj7öj0öj)öj"öjöjöj öjöjÿõjøõjñõjêõjãõjÜõjÕõjÎõjÇõjÀõj¹õj²õj«õj¤õjõj–õjõjˆõjõjzõjsõjlõjeõj^õjWõjPõjIõjBõj;õj4õj-õj&õjõjõjõj õjõjüôjõôjîôjçôjàôjÙôjÒôjËôjÄôj½ôj¶ôj¯ôj¨ôj¡ôjšôj“ôjŒôj…ôj~ôjwôjpôjiôjbôj[ôjTôjMôjFôj?ôj8ôj1ôj*ôj#ôjôjôjôjôjôjùójòójëójäójÝójÖójÏójÈójÁójºój³ój¬ój¥ójžój—ójój‰ój‚ój{ójtójmójfój_ójXójQójJójCój<ój5ój.ój'ój ójójój ójójýòjöòjïòjèòjáòjÚòjÓòjÌòjÅòj¾òj·òj°òj©òj¢òj›òj”òjòj†òjòjxòjqòjjòjcòj\òjUòjNòjGòj@òj9òj2òj+òj$òjòjòjòjòjòjúñjóñjìñjåñjÞñj×ñjÐñjÉñjÂñj»ñj´ñj­ñj¦ñjŸñj˜ñj‘ñjŠñjƒñj|ñjuñjnñjgñj`ñjYñjRñjKñjDñj=ñj6ñj/ñj(ñj!ñjñjñj ñjñjþðj÷ðjððjéðjâðjÛðjÔðjÍðjÆðj¿ðj¸ðj±ðjªðj£ðjœðj•ðjŽðj‡ðj€ðjyðjrðjkðjdðj]ðjVðjOðjHðjAðj:ðj3ðj,ðj%ðjðjðjðj ðjðjûïjôïjíïjæïjßïjØïjÑïjÊïjÃïj¼ïjµïj®ïj§ïj ïj™ïj’ïj‹ïj„ïj}ïjvïjoïjhïjaïjZïjSïjLïjEïj>ïj7ïj0ïj)ïj"ïjïjïj ïjïjÿîjøîjñîjêîjãîjÜîjÕîjÎîjÇîjÀîj¹îj²îj«îj¤îjîj–îjîjˆîjîjzîjsîjlîjeîj^îjWîjPîjIîjBîj;îj4îj-îj&îjîjîjîj îjîjüíjõíjîíjçíjàíjÙíjÒíjËíjÄíj½íj¶íj¯íj¨íj¡íjšíj“íjŒíj…íj~íjwíjpíjiíjbíj[íjTíjMíjFíj?íj8íj1íj*íj#íjíjíjíjíjíjùìjòìjëìjäìjÝìjÖìjÏìjÈìjÁìjºìj³ìj¬ìj¥ìjžìj—ìjìj‰ìj‚ìj{ìjtìjmìjfìj_ìjXìjQìjJìjCìj<ìj5ìj.ìj'ìj ìjìjìj ìjìjýëjöëjïëjèëjáëjÚëjÓëjÌëjÅëj¾ëj·ëj°ëj©ëj¢ëj›ëj”ëjëj†ëjëjxëjqëjjëjcëj\ëjUëjNëjGëj@ëj9ëj2ëj+ëj$ëjëjëjëjëjëjúêjóêjìêjåêjÞêj×êjÐêjÉêjÂêj»êj´êj­êj¦êjŸêj˜êj‘êjŠêjƒêj|êjuêjnêjgêj`êjYêjRêjKêjDêj=êj6êj/êj(êj!êjêjêj êjêjþéj÷éjðéjééjâéjÛéjÔéjÍéjÆéj¿éj¸éj±éjªéj£éjœéj•éjŽéj‡éj€éjyéjréjkéjdéj]éjVéjOéjHéjAéj:éj3éj,éj%éjéjéjéj éjéjûèjôèjíèjæèjßèjØèjÑèjÊèjÃèj¼èjµèj®èj§èj èj™èj’èj‹èj„èj}èjvèjoèjhèjaèjZèjSèjLèjEèj>èj7èj0èj)èj"èjèjèj èjèjÿçjøçjñçjêçjãçjÜçjÕçjÎçjÇçjÀçj¹çj²çj«çj¤çjçj–çjçjˆçjçjzçjsçjlçjeçj^çjWçjPçjIçjBçj;çj4çj-çj&çjçjçjçj çjçjüæjõæjîæjçæjàæjÙæjÒæjËæjÄæj½æj¶æj¯æj¨æj¡æjšæj“æjŒæj…æj~æjwæjpæjiæjbæj[æjTæjMæjFæj?æj8æj1æj*æj#æjæjæjæjæjæjùåjòåjëåjäåjÝåjÖåjÏåjÈåjÁåjºåj³åj¬åj¥åjžåj—åjåj‰åj‚åj{åjtåjmåjfåj_åjXåjQåjJåjCåj<åj5åj.åj'åj åjåjåj åjåjýäjöäjïäjèäjáäjÚäjÓäjÌäjÅäj¾äj·äj°äj©äj¢äj›äj”äjäj†äjäjxäjqäjjäjcäj\äjUäjNäjGäj@äj9äj2äj+äj$äjäjäjäjäjäjúãjóãjìãjåãjÞãj×ãjÐãjÉãjÂãj»ãj´ãj­ãj¦ãjŸãj˜ãj‘ãjŠãjƒãj|ãjuãjnãjgãj`ãjYãjRãjKãjDãj=ãj6ãj/ãj(ãj!ãjãjãj ãjãjþâj÷âjðâjéâjââjÛâjÔâjÍâjÆâj¿âj¸âj±âjªâj£âjœâj•âjŽâj‡âj€âjyâjrâjkâjdâj]âjVâjOâjHâjAâj:âj3âj,âj%âjâjâjâj âjâjûájôájíájæájßájØájÑájÊájÃáj¼ájµáj®áj§áj áj™áj’áj‹áj„áj}ájvájoájhájaájZájSájLájEáj>áj7áj0áj)áj"ájájáj ájájÿàjøàjñàjêàjãàjÜàjÕàjÎàjÇàjÀàj¹àj²àj«àj¤àjàj–àjàjˆàjàjzàjsàjlàjeàj^àjWàjPàjIàjBàj;àj4àj-àj&àjàjàjàj àjàjüßjõßjîßjçßjàßjÙßjÒßjËßjÄßj½ßj¶ßj¯ßj¨ßj¡ßjšßj“ßjŒßj…ßj~ßjwßjpßjißjbßj[ßjTßjMßjFßj?ßj8ßj1ßj*ßj#ßjßjßjßjßjßjùÞjòÞjëÞjäÞjÝÞjÖÞjÏÞjÈÞjÁÞjºÞj³Þj¬Þj¥ÞjžÞj—ÞjÞj‰Þj‚Þj{ÞjtÞjmÞjfÞj_ÞjXÞjQÞjJÞjCÞj<Þj5Þj.Þj'Þj ÞjÞjÞj ÞjÞjýÝjöÝjïÝjèÝjáÝjÚÝjÓÝjÌÝjÅÝj¾Ýj·Ýj°Ýj©Ýj¢Ýj›Ýj”ÝjÝj†ÝjÝjxÝjqÝjjÝjcÝj\ÝjUÝjNÝjGÝj@Ýj9Ýj2Ýj+Ýj$ÝjÝjÝjÝjÝjÝjúÜjóÜjìÜjåÜjÞÜj×ÜjÐÜjÉÜjÂÜj»Üj´Üj­Üj¦ÜjŸÜj˜Üj‘ÜjŠÜjƒÜj|ÜjuÜjnÜjgÜj`ÜjYÜjRÜjKÜjDÜj=Üj6Üj/Üj(Üj!ÜjÜjÜj ÜjÜjþÛj÷ÛjðÛjéÛjâÛjÛÛjÔÛjÍÛjÆÛj¿Ûj¸Ûj±ÛjªÛj£ÛjœÛj•ÛjŽÛj‡Ûj€ÛjyÛjrÛjkÛjdÛj]ÛjVÛjOÛjHÛjAÛj:Ûj3Ûj,Ûj%ÛjÛjÛjÛj ÛjÛjûÚjôÚjíÚjæÚjßÚjØÚjÑÚjÊÚjÃÚj¼ÚjµÚj®Új§Új Új™Új’Új‹Új„Új}ÚjvÚjoÚjhÚjaÚjZÚjSÚjLÚjEÚj>Új7Új0Új)Új"ÚjÚjÚj ÚjÚjÿÙjøÙjñÙjêÙjãÙjÜÙjÕÙjÎÙjÇÙjÀÙj¹Ùj²Ùj«Ùj¤ÙjÙj–ÙjÙjˆÙjÙjzÙjsÙjlÙjeÙj^ÙjWÙjPÙjIÙjBÙj;Ùj4Ùj-Ùj&ÙjÙjÙjÙj ÙjÙjüØjõØjîØjçØjàØjÙØjÒØjËØjÄØj½Øj¶Øj¯Øj¨Øj¡ØjšØj“ØjŒØj…Øj~ØjwØjpØjiØjbØj[ØjTØjMØjFØj?Øj8Øj1Øj*Øj#ØjØjØjØjØjØjù×jò×jë×jä×jÝ×jÖ×jÏ×jÈ×jÁ×jº×j³×j¬×j¥×jž×j—×j×j‰×j‚×j{×jt×jm×jf×j_×jX×jQ×jJ×jC×j<×j5×j.×j'×j ×j×j×j ×j×jýÖjöÖjïÖjèÖjáÖjÚÖjÓÖjÌÖjÅÖj¾Öj·Öj°Öj©Öj¢Öj›Öj”ÖjÖj†ÖjÖjxÖjqÖjjÖjcÖj\ÖjUÖjNÖjGÖj@Öj9Öj2Öj+Öj$ÖjÖjÖjÖjÖjÖjúÕjóÕjìÕjåÕjÞÕj×ÕjÐÕjÉÕjÂÕj»Õj´Õj­Õj¦ÕjŸÕj˜Õj‘ÕjŠÕjƒÕj|ÕjuÕjnÕjgÕj`ÕjYÕjRÕjKÕjDÕj=Õj6Õj/Õj(Õj!ÕjÕjÕj ÕjÕjþÔj÷ÔjðÔjéÔjâÔjÛÔjÔÔjÍÔjÆÔj¿Ôj¸Ôj±ÔjªÔj£ÔjœÔj•ÔjŽÔj‡Ôj€ÔjyÔjrÔjkÔjdÔj]ÔjVÔjOÔjHÔjAÔj:Ôj3Ôj,Ôj%ÔjÔjÔjÔj ÔjÔjûÓjôÓjíÓjæÓjßÓjØÓjÑÓjÊÓjÃÓj¼ÓjµÓj®Ój§Ój Ój™Ój’Ój‹Ój„Ój}ÓjvÓjoÓjhÓjaÓjZÓjSÓjLÓjEÓj>Ój7Ój0Ój)Ój"ÓjÓjÓj ÓjÓjÿÒjøÒjñÒjêÒjãÒjÜÒjÕÒjÎÒjÇÒjÀÒj¹Òj²Òj«Òj¤ÒjÒj–ÒjÒjˆÒjÒjzÒjsÒjlÒjeÒj^ÒjWÒjPÒjIÒjBÒj;Òj4Òj-Òj&ÒjÒjÒjÒj ÒjÒjüÑjõÑjîÑjçÑjàÑjÙÑjÒÑjËÑjÄÑj½Ñj¶Ñj¯Ñj¨Ñj¡ÑjšÑj“ÑjŒÑj…Ñj~ÑjwÑjpÑjiÑjbÑj[ÑjTÑjMÑjFÑj?Ñj8Ñj1Ñj*Ñj#ÑjÑjÑjÑjÑjÑjùÐjòÐjëÐjäÐjÝÐjÖÐjÏÐjÈÐjÁÐjºÐj³Ðj¬Ðj¥ÐjžÐj—ÐjÐj‰Ðj‚Ðj{ÐjtÐjmÐjfÐj_ÐjXÐjQÐjJÐjCÐj<Ðj5Ðj.Ðj'Ðj ÐjÐjÐj ÐjÐjýÏjöÏjïÏjèÏjáÏjÚÏjÓÏjÌÏjÅÏj¾Ïj·Ïj°Ïj©Ïj¢Ïj›Ïj”ÏjÏj†ÏjÏjxÏjqÏjjÏjcÏj\ÏjUÏjNÏjGÏj@Ïj9Ïj2Ïj+Ïj$ÏjÏjÏjÏjÏjÏjúÎjóÎjìÎjåÎjÞÎj×ÎjÐÎjÉÎjÂÎj»Îj´Îj­Îj¦ÎjŸÎj˜Îj‘ÎjŠÎjƒÎj|ÎjuÎjnÎjgÎj`ÎjYÎjRÎjKÎjDÎj=Îj6Îj/Îj(Îj!ÎjÎjÎj ÎjÎjþÍj÷ÍjðÍjéÍjâÍjÛÍjÔÍjÍÍjÆÍj¿Íj¸Íj±ÍjªÍj£ÍjœÍj•ÍjŽÍj‡Íj€ÍjyÍjrÍjkÍjdÍj]ÍjVÍjOÍjHÍjAÍj:Íj3Íj,Íj%ÍjÍjÍjÍj ÍjÍjûÌjôÌjíÌjæÌjßÌjØÌjÑÌjÊÌjÃÌj¼ÌjµÌj®Ìj§Ìj Ìj™Ìj’Ìj‹Ìj„Ìj}ÌjvÌjoÌjhÌjaÌjZÌjSÌjLÌjEÌj>Ìj7Ìj0Ìj)Ìj"ÌjÌjÌj ÌjÌjÿËjøËjñËjêËjãËjÜËjÕËjÎËjÇËjÀËj¹Ëj²Ëj«Ëj¤ËjËj–ËjËjˆËjËjzËjsËjlËjeËj^ËjWËjPËjIËjBËj;Ëj4Ëj-Ëj&ËjËjËjËj ËjËjüÊjõÊjîÊjçÊjàÊjÙÊjÒÊjËÊjÄÊj½Êj¶Êj¯Êj¨Êj¡ÊjšÊj“ÊjŒÊj…Êj~ÊjwÊjpÊjiÊjbÊj[ÊjTÊjMÊjFÊj?Êj8Êj1Êj*Êj#ÊjÊjÊjÊjÊjÊjùÉjòÉjëÉjäÉjÝÉjÖÉjÏÉjÈÉjÁÉjºÉj³Éj¬Éj¥ÉjžÉj—ÉjÉj‰Éj‚Éj{ÉjtÉjmÉjfÉj_ÉjXÉjQÉjJÉjCÉj<Éj5Éj.Éj'Éj ÉjÉjÉj ÉjÉjýÈjöÈjïÈjèÈjáÈjÚÈjÓÈjÌÈjÅÈj¾Èj·Èj°Èj©Èj¢Èj›Èj”ÈjÈj†ÈjÈjxÈjqÈjjÈjcÈj\ÈjUÈjNÈjGÈj@Èj9Èj2Èj+Èj$ÈjÈjÈjÈjÈjÈjúÇjóÇjìÇjåÇjÞÇj×ÇjÐÇjÉÇjÂÇj»Çj´Çj­Çj¦ÇjŸÇj˜Çj‘ÇjŠÇjƒÇj|ÇjuÇjnÇjgÇj`ÇjYÇjRÇjKÇjDÇj=Çj6Çj/Çj(Çj!ÇjÇjÇj ÇjÇjþÆj÷ÆjðÆjéÆjâÆjÛÆjÔÆjÍÆjÆÆj¿Æj¸Æj±ÆjªÆj£ÆjœÆj•ÆjŽÆj‡Æj€ÆjyÆjrÆjkÆjdÆj]ÆjVÆjOÆjHÆjAÆj:Æj3Æj,Æj%ÆjÆjÆjÆj ÆjÆjûÅjôÅjíÅjæÅjßÅjØÅjÑÅjÊÅjÃÅj¼ÅjµÅj®Åj§Åj Åj™Åj’Åj‹Åj„Åj}ÅjvÅjoÅjhÅjaÅjZÅjSÅjLÅjEÅj>Åj7Åj0Åj)Åj"ÅjÅjÅj ÅjÅjÿÄjøÄjñÄjêÄjãÄjÜÄjÕÄjÎÄjÇÄjÀÄj¹Äj²Äj«Äj¤ÄjÄj–ÄjÄjˆÄjÄjzÄjsÄjlÄjeÄj^ÄjWÄjPÄjIÄjBÄj;Äj4Äj-Äj&ÄjÄjÄjÄj ÄjÄjüÃjõÃjîÃjçÃjàÃjÙÃjÒÃjËÃjÄÃj½Ãj¶Ãj¯Ãj¨Ãj¡ÃjšÃj“ÃjŒÃj…Ãj~ÃjwÃjpÃjiÃjbÃj[ÃjTÃjMÃjFÃj?Ãj8Ãj1Ãj*Ãj#ÃjÃjÃjÃjÃjÃjùÂjòÂjëÂjäÂjÝÂjÖÂjÏÂjÈÂjÁÂjºÂj³Âj¬Âj¥ÂjžÂj—ÂjÂj‰Âj‚Âj{ÂjtÂjmÂjfÂj_ÂjXÂjQÂjJÂjCÂj<Âj5Âj.Âj'Âj ÂjÂjÂj ÂjÂjýÁjöÁjïÁjèÁjáÁjÚÁjÓÁjÌÁjÅÁj¾Áj·Áj°Áj©Áj¢Áj›Áj”ÁjÁj†ÁjÁjxÁjqÁjjÁjcÁj\ÁjUÁjNÁjGÁj@Áj9Áj2Áj+Áj$ÁjÁjÁjÁjÁjÁjúÀjóÀjìÀjåÀjÞÀj×ÀjÐÀjÉÀjÂÀj»Àj´Àj­Àj¦ÀjŸÀj˜Àj‘ÀjŠÀjƒÀj|ÀjuÀjnÀjgÀj`ÀjYÀjRÀjKÀjDÀj=Àj6Àj/Àj(Àj!ÀjÀjÀj ÀjÀjþ¿j÷¿jð¿jé¿jâ¿jÛ¿jÔ¿jÍ¿jÆ¿j¿¿j¸¿j±¿jª¿j£¿jœ¿j•¿jŽ¿j‡¿j€¿jy¿jr¿jk¿jd¿j]¿jV¿jO¿jH¿jA¿j:¿j3¿j,¿j%¿j¿j¿j¿j ¿j¿jû¾jô¾jí¾jæ¾jß¾jؾjѾjʾjþj¼¾jµ¾j®¾j§¾j ¾j™¾j’¾j‹¾j„¾j}¾jv¾jo¾jh¾ja¾jZ¾jS¾jL¾jE¾j>¾j7¾j0¾j)¾j"¾j¾j¾j ¾j¾jÿ½jø½jñ½jê½jã½jܽjÕ½jνjǽjÀ½j¹½j²½j«½j¤½j½j–½j½jˆ½j½jz½js½jl½je½j^½jW½jP½jI½jB½j;½j4½j-½j&½j½j½j½j ½j½jü¼jõ¼jî¼jç¼jà¼jÙ¼jÒ¼j˼jļj½¼j¶¼j¯¼j¨¼j¡¼jš¼j“¼jŒ¼j…¼j~¼jw¼jp¼ji¼jb¼j[¼jT¼jM¼jF¼j?¼j8¼j1¼j*¼j#¼j¼j¼j¼j¼j¼jù»jò»jë»jä»jÝ»jÖ»jÏ»jÈ»jÁ»jº»j³»j¬»j¥»jž»j—»j»j‰»j‚»j{»jt»jm»jf»j_»jX»jQ»jJ»jC»j<»j5»j.»j'»j »j»j»j »j»jýºjöºjïºjèºjáºjÚºjÓºj̺jźj¾ºj·ºj°ºj©ºj¢ºj›ºj”ºjºj†ºjºjxºjqºjjºjcºj\ºjUºjNºjGºj@ºj9ºj2ºj+ºj$ºjºjºjºjºjºjú¹jó¹jì¹jå¹jÞ¹j×¹jйjɹj¹j»¹j´¹j­¹j¦¹jŸ¹j˜¹j‘¹jйjƒ¹j|¹ju¹jn¹jg¹j`¹jY¹jR¹jK¹jD¹j=¹j6¹j/¹j(¹j!¹j¹j¹j ¹j¹jþ¸j÷¸jð¸jé¸jâ¸jÛ¸jÔ¸j͸jƸj¿¸j¸¸j±¸jª¸j£¸jœ¸j•¸jޏj‡¸j€¸jy¸jr¸jk¸jd¸j]¸jV¸jO¸jH¸jA¸j:¸j3¸j,¸j%¸j¸j¸j¸j ¸j¸jû·jô·jí·jæ·jß·jØ·jÑ·jÊ·j÷j¼·jµ·j®·j§·j ·j™·j’·j‹·j„·j}·jv·jo·jh·ja·jZ·jS·jL·jE·j>·j7·j0·j)·j"·j·j·j ·j·jÿ¶jø¶jñ¶jê¶jã¶jܶjÕ¶jζjǶjÀ¶j¹¶j²¶j«¶j¤¶j¶j–¶j¶jˆ¶j¶jz¶js¶jl¶je¶j^¶jW¶jP¶jI¶jB¶j;¶j4¶j-¶j&¶j¶j¶j¶j ¶j¶jüµjõµjîµjçµjàµjÙµjÒµj˵jĵj½µj¶µj¯µj¨µj¡µjšµj“µjŒµj…µj~µjwµjpµjiµjbµj[µjTµjMµjFµj?µj8µj1µj*µj#µjµjµjµjµjµjù´jò´jë´jä´jÝ´jÖ´jÏ´jÈ´jÁ´jº´j³´j¬´j¥´jž´j—´j´j‰´j‚´j{´jt´jm´jf´j_´jX´jQ´jJ´jC´j<´j5´j.´j'´j ´j´j´j ´j´jý³jö³jï³jè³já³jÚ³jÓ³j̳jųj¾³j·³j°³j©³j¢³j›³j”³j³j†³j³jx³jq³jj³jc³j\³jU³jN³jG³j@³j9³j2³j+³j$³j³j³j³j³j³jú²jó²jì²jå²jÞ²jײjвjɲj²j»²j´²j­²j¦²jŸ²j˜²j‘²jвjƒ²j|²ju²jn²jg²j`²jY²jR²jK²jD²j=²j6²j/²j(²j!²j²j²j ²j²jþ±j÷±jð±jé±jâ±jÛ±jÔ±jͱjƱj¿±j¸±j±±jª±j£±jœ±j•±jޱj‡±j€±jy±jr±jk±jd±j]±jV±jO±jH±jA±j:±j3±j,±j%±j±j±j±j ±j±jû°jô°jí°jæ°jß°jذjѰjʰjðj¼°jµ°j®°j§°j °j™°j’°j‹°j„°j}°jv°jo°jh°ja°jZ°jS°jL°jE°j>°j7°j0°j)°j"°j°j°j °j°jÿ¯jø¯jñ¯jê¯jã¯jܯjÕ¯jίjǯjÀ¯j¹¯j²¯j«¯j¤¯j¯j–¯j¯jˆ¯j¯jz¯js¯jl¯je¯j^¯jW¯jP¯jI¯jB¯j;¯j4¯j-¯j&¯j¯j¯j¯j ¯j¯jü®jõ®jî®jç®jà®jÙ®jÒ®jË®jÄ®j½®j¶®j¯®j¨®j¡®jš®j“®jŒ®j…®j~®jw®jp®ji®jb®j[®jT®jM®jF®j?®j8®j1®j*®j#®j®j®j®j®j®jù­jò­jë­jä­jÝ­jÖ­jÏ­jÈ­jÁ­jº­j³­j¬­j¥­jž­j—­j­j‰­j‚­j{­jt­jm­jf­j_­jX­jQ­jJ­jC­j<­j5­j.­j'­j ­j­j­j ­j­jý¬jö¬jï¬jè¬já¬jÚ¬jÓ¬j̬jŬj¾¬j·¬j°¬j©¬j¢¬j›¬j”¬j¬j†¬j¬jx¬jq¬jj¬jc¬j\¬jU¬jN¬jG¬j@¬j9¬j2¬j+¬j$¬j¬j¬j¬j¬j¬jú«jó«jì«jå«jÞ«j׫jЫjÉ«j«j»«j´«j­«j¦«jŸ«j˜«j‘«jŠ«jƒ«j|«ju«jn«jg«j`«jY«jR«jK«jD«j=«j6«j/«j(«j!«j«j«j «j«jþªj÷ªjðªjéªjâªjÛªjÔªjͪjƪj¿ªj¸ªj±ªjªªj£ªjœªj•ªjŽªj‡ªj€ªjyªjrªjkªjdªj]ªjVªjOªjHªjAªj:ªj3ªj,ªj%ªjªjªjªj ªjªjû©jô©jí©jæ©jß©jØ©jÑ©jÊ©jéj¼©jµ©j®©j§©j ©j™©j’©j‹©j„©j}©jv©jo©jh©ja©jZ©jS©jL©jE©j>©j7©j0©j)©j"©j©j©j ©j©jÿ¨jø¨jñ¨jê¨jã¨jܨjÕ¨jΨjǨjÀ¨j¹¨j²¨j«¨j¤¨j¨j–¨j¨jˆ¨j¨jz¨js¨jl¨je¨j^¨jW¨jP¨jI¨jB¨j;¨j4¨j-¨j&¨j¨j¨j¨j ¨j¨jü§jõ§jî§jç§jà§jÙ§jÒ§j˧jħj½§j¶§j¯§j¨§j¡§jš§j“§jŒ§j…§j~§jw§jp§ji§jb§j[§jT§jM§jF§j?§j8§j1§j*§j#§j§j§j§j§j§jù¦jò¦jë¦jä¦jݦjÖ¦jϦjȦjÁ¦jº¦j³¦j¬¦j¥¦jž¦j—¦j¦j‰¦j‚¦j{¦jt¦jm¦jf¦j_¦jX¦jQ¦jJ¦jC¦j<¦j5¦j.¦j'¦j ¦j¦j¦j ¦j¦jý¥jö¥jï¥jè¥já¥jÚ¥jÓ¥jÌ¥jÅ¥j¾¥j·¥j°¥j©¥j¢¥j›¥j”¥j¥j†¥j¥jx¥jq¥jj¥jc¥j\¥jU¥jN¥jG¥j@¥j9¥j2¥j+¥j$¥j¥j¥j¥j¥j¥jú¤jó¤jì¤jå¤jÞ¤jפjФjɤj¤j»¤j´¤j­¤j¦¤jŸ¤j˜¤j‘¤jФjƒ¤j|¤ju¤jn¤jg¤j`¤jY¤jR¤jK¤jD¤j=¤j6¤j/¤j(¤j!¤j¤j¤j ¤j¤jþ£j÷£jð£jé£jâ£jÛ£jÔ£jÍ£jÆ£j¿£j¸£j±£jª£j££jœ£j•£jŽ£j‡£j€£jy£jr£jk£jd£j]£jV£jO£jH£jA£j:£j3£j,£j%£j£j£j£j £j£jû¢jô¢jí¢jæ¢jߢjØ¢jÑ¢jÊ¢jâj¼¢jµ¢j®¢j§¢j ¢j™¢j’¢j‹¢j„¢j}¢jv¢jo¢jh¢ja¢jZ¢jS¢jL¢jE¢j>¢j7¢j0¢j)¢j"¢j¢j¢j ¢j¢jÿ¡jø¡jñ¡jê¡jã¡jÜ¡jÕ¡jΡjÇ¡jÀ¡j¹¡j²¡j«¡j¤¡j¡j–¡j¡jˆ¡j¡jz¡js¡jl¡je¡j^¡jW¡jP¡jI¡jB¡j;¡j4¡j-¡j&¡j¡j¡j¡j ¡j¡jü jõ jî jç jà jÙ jÒ jË jÄ j½ j¶ j¯ j¨ j¡ jš j“ jŒ j… j~ jw jp ji jb j[ jT jM jF j? j8 j1 j* j# j j j j j jùŸjòŸjëŸjäŸjÝŸjÖŸjÏŸjÈŸjÁŸjºŸj³Ÿj¬Ÿj¥ŸjžŸj—ŸjŸj‰Ÿj‚Ÿj{ŸjtŸjmŸjfŸj_ŸjXŸjQŸjJŸjCŸj<Ÿj5Ÿj.Ÿj'Ÿj ŸjŸjŸj ŸjŸjýžjöžjïžjèžjážjÚžjÓžjÌžjÅžj¾žj·žj°žj©žj¢žj›žj”žjžj†žjžjxžjqžjjžjcžj\žjUžjNžjGžj@žj9žj2žj+žj$žjžjžjžjžjžjújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþœj÷œjðœjéœjâœjÛœjÔœjÍœjÆœj¿œj¸œj±œjªœj£œjœœj•œjŽœj‡œj€œjyœjrœjkœjdœj]œjVœjOœjHœjAœj:œj3œj,œj%œjœjœjœj œjœjû›jô›jí›jæ›jß›jØ›jÑ›jÊ›jÛj¼›jµ›j®›j§›j ›j™›j’›j‹›j„›j}›jv›jo›jh›ja›jZ›jS›jL›jE›j>›j7›j0›j)›j"›j›j›j ›j›jÿšjøšjñšjêšjãšjÜšjÕšjΚjÇšjÀšj¹šj²šj«šj¤šjšj–šjšjˆšjšjzšjsšjlšješj^šjWšjPšjIšjBšj;šj4šj-šj&šjšjšjšj šjšjü™jõ™jî™jç™jà™jÙ™jÒ™jË™jÄ™j½™j¶™j¯™j¨™j¡™jš™j“™jŒ™j…™j~™jw™jp™ji™jb™j[™jT™jM™jF™j?™j8™j1™j*™j#™j™j™j™j™j™jù˜jò˜jë˜jä˜jݘjÖ˜jϘjȘjÁ˜jº˜j³˜j¬˜j¥˜jž˜j—˜j˜j‰˜j‚˜j{˜jt˜jm˜jf˜j_˜jX˜jQ˜jJ˜jC˜j<˜j5˜j.˜j'˜j ˜j˜j˜j ˜j˜jý—jö—jï—jè—já—jÚ—jÓ—jÌ—jÅ—j¾—j·—j°—j©—j¢—j›—j”—j—j†—j—jx—jq—jj—jc—j\—jU—jN—jG—j@—j9—j2—j+—j$—j—j—j—j—j—jú–jó–jì–jå–jÞ–j×–jЖjÉ–j–j»–j´–j­–j¦–jŸ–j˜–j‘–jŠ–jƒ–j|–ju–jn–jg–j`–jY–jR–jK–jD–j=–j6–j/–j(–j!–j–j–j –j–jþ•j÷•jð•jé•jâ•jÛ•jÔ•jÍ•jÆ•j¿•j¸•j±•jª•j£•jœ•j••jŽ•j‡•j€•jy•jr•jk•jd•j]•jV•jO•jH•jA•j:•j3•j,•j%•j•j•j•j •j•jû”jô”jí”jæ”jß”jØ”jÑ”jÊ”jÔj¼”jµ”j®”j§”j ”j™”j’”j‹”j„”j}”jv”jo”jh”ja”jZ”jS”jL”jE”j>”j7”j0”j)”j"”j”j”j ”j”jÿ“jø“jñ“jê“jã“jÜ“jÕ“jΓjÇ“jÀ“j¹“j²“j«“j¤“j“j–“j“jˆ“j“jz“js“jl“je“j^“jW“jP“jI“jB“j;“j4“j-“j&“j“j“j“j “j“jü’jõ’jî’jç’jà’jÙ’jÒ’jË’jÄ’j½’j¶’j¯’j¨’j¡’jš’j“’jŒ’j…’j~’jw’jp’ji’jb’j[’jT’jM’jF’j?’j8’j1’j*’j#’j’j’j’j’j’jù‘jò‘jë‘jä‘jÝ‘jÖ‘jÏ‘jÈ‘jÁ‘jº‘j³‘j¬‘j¥‘jž‘j—‘j‘j‰‘j‚‘j{‘jt‘jm‘jf‘j_‘jX‘jQ‘jJ‘jC‘j<‘j5‘j.‘j'‘j ‘j‘j‘j ‘j‘jýjöjïjèjájÚjÓjÌjÅj¾j·j°j©j¢j›j”jj†jjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþŽj÷ŽjðŽjéŽjâŽjÛŽjÔŽjÍŽjÆŽj¿Žj¸Žj±ŽjªŽj£ŽjœŽj•ŽjŽŽj‡Žj€ŽjyŽjrŽjkŽjdŽj]ŽjVŽjOŽjHŽjAŽj:Žj3Žj,Žj%ŽjŽjŽjŽj ŽjŽjûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿŒjøŒjñŒjêŒjãŒjÜŒjÕŒjÎŒjÇŒjÀŒj¹Œj²Œj«Œj¤ŒjŒj–ŒjŒjˆŒjŒjzŒjsŒjlŒjeŒj^ŒjWŒjPŒjIŒjBŒj;Œj4Œj-Œj&ŒjŒjŒjŒj ŒjŒjü‹jõ‹jî‹jç‹jà‹jÙ‹jÒ‹jË‹jÄ‹j½‹j¶‹j¯‹j¨‹j¡‹jš‹j“‹jŒ‹j…‹j~‹jw‹jp‹ji‹jb‹j[‹jT‹jM‹jF‹j?‹j8‹j1‹j*‹j#‹j‹j‹j‹j‹j‹jùŠjòŠjëŠjäŠjÝŠjÖŠjÏŠjÈŠjÁŠjºŠj³Šj¬Šj¥ŠjžŠj—ŠjŠj‰Šj‚Šj{ŠjtŠjmŠjfŠj_ŠjXŠjQŠjJŠjCŠj<Šj5Šj.Šj'Šj ŠjŠjŠj ŠjŠjý‰jö‰jï‰jè‰já‰jÚ‰jÓ‰j̉jʼnj¾‰j·‰j°‰j©‰j¢‰j›‰j”‰j‰j†‰j‰jx‰jq‰jj‰jc‰j\‰jU‰jN‰jG‰j@‰j9‰j2‰j+‰j$‰j‰j‰j‰j‰j‰júˆjóˆjìˆjåˆjÞˆj׈jЈjɈjˆj»ˆj´ˆj­ˆj¦ˆjŸˆj˜ˆj‘ˆjŠˆjƒˆj|ˆjuˆjnˆjgˆj`ˆjYˆjRˆjKˆjDˆj=ˆj6ˆj/ˆj(ˆj!ˆjˆjˆj ˆjˆjþ‡j÷‡jð‡jé‡jâ‡jÛ‡jÔ‡j͇jƇj¿‡j¸‡j±‡jª‡j£‡jœ‡j•‡jއj‡‡j€‡jy‡jr‡jk‡jd‡j]‡jV‡jO‡jH‡jA‡j:‡j3‡j,‡j%‡j‡j‡j‡j ‡j‡jû†jô†jí†jæ†j߆j؆jцjʆjÆj¼†jµ†j®†j§†j †j™†j’†j‹†j„†j}†jv†jo†jh†ja†jZ†jS†jL†jE†j>†j7†j0†j)†j"†j†j†j †j†jÿ…jø…jñ…jê…jã…jÜ…jÕ…jÎ…jÇ…jÀ…j¹…j²…j«…j¤…j…j–…j…jˆ…j…jz…js…jl…je…j^…jW…jP…jI…jB…j;…j4…j-…j&…j…j…j…j …j…jü„jõ„jî„jç„jà„jÙ„jÒ„jË„jÄ„j½„j¶„j¯„j¨„j¡„jš„j“„jŒ„j…„j~„jw„jp„ji„jb„j[„jT„jM„jF„j?„j8„j1„j*„j#„j„j„j„j„j„jùƒjòƒjëƒjäƒj݃jÖƒjσjȃjÁƒjºƒj³ƒj¬ƒj¥ƒjžƒj—ƒjƒj‰ƒj‚ƒj{ƒjtƒjmƒjfƒj_ƒjXƒjQƒjJƒjCƒj<ƒj5ƒj.ƒj'ƒj ƒjƒjƒj ƒjƒjý‚jö‚jï‚jè‚já‚jÚ‚jÓ‚jÌ‚jÅ‚j¾‚j·‚j°‚j©‚j¢‚j›‚j”‚j‚j†‚j‚jx‚jq‚jj‚jc‚j\‚jU‚jN‚jG‚j@‚j9‚j2‚j+‚j$‚j‚j‚j‚j‚j‚jújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþ€j÷€jð€jé€jâ€jÛ€jÔ€jÍ€jÆ€j¿€j¸€j±€jª€j£€jœ€j•€jŽ€j‡€j€€jy€jr€jk€jd€j]€jV€jO€jH€jA€j:€j3€j,€j%€j€j€j€j €j€jûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿ~jø~jñ~jê~jã~jÜ~jÕ~jÎ~jÇ~jÀ~j¹~j²~j«~j¤~j~j–~j~jˆ~j~jz~js~jl~je~j^~jW~jP~jI~jB~j;~j4~j-~j&~j~j~j~j ~j~jü}jõ}jî}jç}jà}jÙ}jÒ}jË}jÄ}j½}j¶}j¯}j¨}j¡}jš}j“}jŒ}j…}j~}jw}jp}ji}jb}j[}jT}jM}jF}j?}j8}j1}j*}j#}j}j}j}j}j}jù|jò|jë|jä|jÝ|jÖ|jÏ|jÈ|jÁ|jº|j³|j¬|j¥|jž|j—|j|j‰|j‚|j{|jt|jm|jf|j_|jX|jQ|jJ|jC|j<|j5|j.|j'|j |j|j|j |j|jý{jö{jï{jè{já{jÚ{jÓ{jÌ{jÅ{j¾{j·{j°{j©{j¢{j›{j”{j{j†{j{jx{jq{jj{jc{j\{jU{jN{jG{j@{j9{j2{j+{j${j{j{j{j{j{júzjózjìzjåzjÞzj×zjÐzjÉzjÂzj»zj´zj­zj¦zjŸzj˜zj‘zjŠzjƒzj|zjuzjnzjgzj`zjYzjRzjKzjDzj=zj6zj/zj(zj!zjzjzj zjzjþyj÷yjðyjéyjâyjÛyjÔyjÍyjÆyj¿yj¸yj±yjªyj£yjœyj•yjŽyj‡yj€yjyyjryjkyjdyj]yjVyjOyjHyjAyj:yj3yj,yj%yjyjyjyj yjyjûxjôxjíxjæxjßxjØxjÑxjÊxjÃxj¼xjµxj®xj§xj xj™xj’xj‹xj„xj}xjvxjoxjhxjaxjZxjSxjLxjExj>xj7xj0xj)xj"xjxjxj xjxjÿwjøwjñwjêwjãwjÜwjÕwjÎwjÇwjÀwj¹wj²wj«wj¤wjwj–wjwjˆwjwjzwjswjlwjewj^wjWwjPwjIwjBwj;wj4wj-wj&wjwjwjwj wjwjüvjõvjîvjçvjàvjÙvjÒvjËvjÄvj½vj¶vj¯vj¨vj¡vjšvj“vjŒvj…vj~vjwvjpvjivjbvj[vjTvjMvjFvj?vj8vj1vj*vj#vjvjvjvjvjvjùujòujëujäujÝujÖujÏujÈujÁujºuj³uj¬uj¥ujžuj—ujuj‰uj‚uj{ujtujmujfuj_ujXujQujJujCujqj7qj0qj)qj"qjqjqj qjqjÿpjøpjñpjêpjãpjÜpjÕpjÎpjÇpjÀpj¹pj²pj«pj¤pjpj–pjpjˆpjpjzpjspjlpjepj^pjWpjPpjIpjBpj;pj4pj-pj&pjpjpjpj pjpjüojõojîojçojàojÙojÒojËojÄoj½oj¶oj¯oj¨oj¡ojšoj“ojŒoj…oj~ojwojpojiojboj[ojTojMojFoj?oj8oj1oj*oj#ojojojojojojùnjònjënjänjÝnjÖnjÏnjÈnjÁnjºnj³nj¬nj¥njžnj—njnj‰nj‚nj{njtnjmnjfnj_njXnjQnjJnjCnjjj7jj0jj)jj"jjjjjj jjjjÿijøijñijêijãijÜijÕijÎijÇijÀij¹ij²ij«ij¤ijij–ijijˆijijzijsijlijeij^ijWijPijIijBij;ij4ij-ij&ijijijij ijijühjõhjîhjçhjàhjÙhjÒhjËhjÄhj½hj¶hj¯hj¨hj¡hjšhj“hjŒhj…hj~hjwhjphjihjbhj[hjThjMhjFhj?hj8hj1hj*hj#hjhjhjhjhjhjùgjògjëgjägjÝgjÖgjÏgjÈgjÁgjºgj³gj¬gj¥gjžgj—gjgj‰gj‚gj{gjtgjmgjfgj_gjXgjQgjJgjCgjcj7cj0cj)cj"cjcjcj cjcjÿbjøbjñbjêbjãbjÜbjÕbjÎbjÇbjÀbj¹bj²bj«bj¤bjbj–bjbjˆbjbjzbjsbjlbjebj^bjWbjPbjIbjBbj;bj4bj-bj&bjbjbjbj bjbjüajõajîajçajàajÙajÒajËajÄaj½aj¶aj¯aj¨aj¡ajšaj“ajŒaj…aj~ajwajpajiajbaj[ajTajMajFaj?aj8aj1aj*aj#ajajajajajajù`jò`jë`jä`jÝ`jÖ`jÏ`jÈ`jÁ`jº`j³`j¬`j¥`jž`j—`j`j‰`j‚`j{`jt`jm`jf`j_`jX`jQ`jJ`jC`j<`j5`j.`j'`j `j`j`j `j`jý_jö_jï_jè_já_jÚ_jÓ_jÌ_jÅ_j¾_j·_j°_j©_j¢_j›_j”_j_j†_j_jx_jq_jj_jc_j\_jU_jN_jG_j@_j9_j2_j+_j$_j_j_j_j_j_jú^jó^jì^jå^jÞ^j×^jÐ^jÉ^jÂ^j»^j´^j­^j¦^jŸ^j˜^j‘^jŠ^jƒ^j|^ju^jn^jg^j`^jY^jR^jK^jD^j=^j6^j/^j(^j!^j^j^j ^j^jþ]j÷]jð]jé]jâ]jÛ]jÔ]jÍ]jÆ]j¿]j¸]j±]jª]j£]jœ]j•]jŽ]j‡]j€]jy]jr]jk]jd]j]]jV]jO]jH]jA]j:]j3]j,]j%]j]j]j]j ]j]jû\jô\jí\jæ\jß\jØ\jÑ\jÊ\jÃ\j¼\jµ\j®\j§\j \j™\j’\j‹\j„\j}\jv\jo\jh\ja\jZ\jS\jL\jE\j>\j7\j0\j)\j"\j\j\j \j\jÿ[jø[jñ[jê[jã[jÜ[jÕ[jÎ[jÇ[jÀ[j¹[j²[j«[j¤[j[j–[j[jˆ[j[jz[js[jl[je[j^[jW[jP[jI[jB[j;[j4[j-[j&[j[j[j[j [j[jüZjõZjîZjçZjàZjÙZjÒZjËZjÄZj½Zj¶Zj¯Zj¨Zj¡ZjšZj“ZjŒZj…Zj~ZjwZjpZjiZjbZj[ZjTZjMZjFZj?Zj8Zj1Zj*Zj#ZjZjZjZjZjZjùYjòYjëYjäYjÝYjÖYjÏYjÈYjÁYjºYj³Yj¬Yj¥YjžYj—YjYj‰Yj‚Yj{YjtYjmYjfYj_YjXYjQYjJYjCYjUj7Uj0Uj)Uj"UjUjUj UjUjÿTjøTjñTjêTjãTjÜTjÕTjÎTjÇTjÀTj¹Tj²Tj«Tj¤TjTj–TjTjˆTjTjzTjsTjlTjeTj^TjWTjPTjITjBTj;Tj4Tj-Tj&TjTjTjTj TjTjüSjõSjîSjçSjàSjÙSjÒSjËSjÄSj½Sj¶Sj¯Sj¨Sj¡SjšSj“SjŒSj…Sj~SjwSjpSjiSjbSj[SjTSjMSjFSj?Sj8Sj1Sj*Sj#SjSjSjSjSjSjùRjòRjëRjäRjÝRjÖRjÏRjÈRjÁRjºRj³Rj¬Rj¥RjžRj—RjRj‰Rj‚Rj{RjtRjmRjfRj_RjXRjQRjJRjCRjNj7Nj0Nj)Nj"NjNjNj NjNjÿMjøMjñMjêMjãMjÜMjÕMjÎMjÇMjÀMj¹Mj²Mj«Mj¤MjMj–MjMjˆMjMjzMjsMjlMjeMj^MjWMjPMjIMjBMj;Mj4Mj-Mj&MjMjMjMj MjMjüLjõLjîLjçLjàLjÙLjÒLjËLjÄLj½Lj¶Lj¯Lj¨Lj¡LjšLj“LjŒLj…Lj~LjwLjpLjiLjbLj[LjTLjMLjFLj?Lj8Lj1Lj*Lj#LjLjLjLjLjLjùKjòKjëKjäKjÝKjÖKjÏKjÈKjÁKjºKj³Kj¬Kj¥KjžKj—KjKj‰Kj‚Kj{KjtKjmKjfKj_KjXKjQKjJKjCKjGj7Gj0Gj)Gj"GjGjGj GjGjÿFjøFjñFjêFjãFjÜFjÕFjÎFjÇFjÀFj¹Fj²Fj«Fj¤FjFj–FjFjˆFjFjzFjsFjlFjeFj^FjWFjPFjIFjBFj;Fj4Fj-Fj&FjFjFjFj FjFjüEjõEjîEjçEjàEjÙEjÒEjËEjÄEj½Ej¶Ej¯Ej¨Ej¡EjšEj“EjŒEj…Ej~EjwEjpEjiEjbEj[EjTEjMEjFEj?Ej8Ej1Ej*Ej#EjEjEjEjEjEjùDjòDjëDjäDjÝDjÖDjÏDjÈDjÁDjºDj³Dj¬Dj¥DjžDj—DjDj‰Dj‚Dj{DjtDjmDjfDj_DjXDjQDjJDjCDj@j7@j0@j)@j"@j@j@j @j@jÿ?jø?jñ?jê?jã?jÜ?jÕ?jÎ?jÇ?jÀ?j¹?j²?j«?j¤?j?j–?j?jˆ?j?jz?js?jl?je?j^?jW?jP?jI?jB?j;?j4?j-?j&?j?j?j?j ?j?jü>jõ>jî>jç>jà>jÙ>jÒ>jË>jÄ>j½>j¶>j¯>j¨>j¡>jš>j“>jŒ>j…>j~>jw>jp>ji>jb>j[>jT>jM>jF>j?>j8>j1>j*>j#>j>j>j>j>j>jù=jò=jë=jä=jÝ=jÖ=jÏ=jÈ=jÁ=jº=j³=j¬=j¥=jž=j—=j=j‰=j‚=j{=jt=jm=jf=j_=jX=jQ=jJ=jC=j<=j5=j.=j'=j =j=j=j =j=jý9j79j09j)9j"9j9j9j 9j9jÿ8jø8jñ8jê8jã8jÜ8jÕ8jÎ8jÇ8jÀ8j¹8j²8j«8j¤8j8j–8j8jˆ8j8jz8js8jl8je8j^8jW8jP8jI8jB8j;8j48j-8j&8j8j8j8j 8j8jü7jõ7jî7jç7jà7jÙ7jÒ7jË7jÄ7j½7j¶7j¯7j¨7j¡7jš7j“7jŒ7j…7j~7jw7jp7ji7jb7j[7jT7jM7jF7j?7j87j17j*7j#7j7j7j7j7j7jù6jò6jë6jä6jÝ6jÖ6jÏ6jÈ6jÁ6jº6j³6j¬6j¥6jž6j—6j6j‰6j‚6j{6jt6jm6jf6j_6jX6jQ6jJ6jC6j<6j56j.6j'6j 6j6j6j 6j6jý5jö5jï5jè5já5jÚ5jÓ5jÌ5jÅ5j¾5j·5j°5j©5j¢5j›5j”5j5j†5j5jx5jq5jj5jc5j\5jU5jN5jG5j@5j95j25j+5j$5j5j5j5j5j5jú4jó4jì4jå4jÞ4j×4jÐ4jÉ4jÂ4j»4j´4j­4j¦4jŸ4j˜4j‘4jŠ4jƒ4j|4ju4jn4jg4j`4jY4jR4jK4jD4j=4j64j/4j(4j!4j4j4j 4j4jþ3j÷3jð3jé3jâ3jÛ3jÔ3jÍ3jÆ3j¿3j¸3j±3jª3j£3jœ3j•3jŽ3j‡3j€3jy3jr3jk3jd3j]3jV3jO3jH3jA3j:3j33j,3j%3j3j3j3j 3j3jû2jô2jí2jæ2jß2jØ2jÑ2jÊ2jÃ2j¼2jµ2j®2j§2j 2j™2j’2j‹2j„2j}2jv2jo2jh2ja2jZ2jS2jL2jE2j>2j72j02j)2j"2j2j2j 2j2jÿ1jø1jñ1jê1jã1jÜ1jÕ1jÎ1jÇ1jÀ1j¹1j²1j«1j¤1j1j–1j1jˆ1j1jz1js1jl1je1j^1jW1jP1jI1jB1j;1j41j-1j&1j1j1j1j 1j1jü0jõ0jî0jç0jà0jÙ0jÒ0jË0jÄ0j½0j¶0j¯0j¨0j¡0jš0j“0jŒ0j…0j~0jw0jp0ji0jb0j[0jT0jM0jF0j?0j80j10j*0j#0j0j0j0j0j0jù/jò/jë/jä/jÝ/jÖ/jÏ/jÈ/jÁ/jº/j³/j¬/j¥/jž/j—/j/j‰/j‚/j{/jt/jm/jf/j_/jX/jQ/jJ/jC/j+j7+j0+j)+j"+j+j+j +j+jÿ*jø*jñ*jê*jã*jÜ*jÕ*jÎ*jÇ*jÀ*j¹*j²*j«*j¤*j*j–*j*jˆ*j*jz*js*jl*je*j^*jW*jP*jI*jB*j;*j4*j-*j&*j*j*j*j *j*jü)jõ)jî)jç)jà)jÙ)jÒ)jË)jÄ)j½)j¶)j¯)j¨)j¡)jš)j“)jŒ)j…)j~)jw)jp)ji)jb)j[)jT)jM)jF)j?)j8)j1)j*)j#)j)j)j)j)j)jù(jò(jë(jä(jÝ(jÖ(jÏ(jÈ(jÁ(jº(j³(j¬(j¥(jž(j—(j(j‰(j‚(j{(jt(jm(jf(j_(jX(jQ(jJ(jC(j<(j5(j.(j'(j (j(j(j (j(jý'jö'jï'jè'já'jÚ'jÓ'jÌ'jÅ'j¾'j·'j°'j©'j¢'j›'j”'j'j†'j'jx'jq'jj'jc'j\'jU'jN'jG'j@'j9'j2'j+'j$'j'j'j'j'j'jú&jó&jì&jå&jÞ&j×&jÐ&jÉ&jÂ&j»&j´&j­&j¦&jŸ&j˜&j‘&jŠ&jƒ&j|&ju&jn&jg&j`&jY&jR&jK&jD&j=&j6&j/&j(&j!&j&j&j &j&jþ%j÷%jð%jé%jâ%jÛ%jÔ%jÍ%jÆ%j¿%j¸%j±%jª%j£%jœ%j•%jŽ%j‡%j€%jy%jr%jk%jd%j]%jV%jO%jH%jA%j:%j3%j,%j%%j%j%j%j %j%jû$jô$jí$jæ$jß$jØ$jÑ$jÊ$jÃ$j¼$jµ$j®$j§$j $j™$j’$j‹$j„$j}$jv$jo$jh$ja$jZ$jS$jL$jE$j>$j7$j0$j)$j"$j$j$j $j$jÿ#jø#jñ#jê#jã#jÜ#jÕ#jÎ#jÇ#jÀ#j¹#j²#j«#j¤#j#j–#j#jˆ#j#jz#js#jl#je#j^#jW#jP#jI#jB#j;#j4#j-#j&#j#j#j#j #j#jü"jõ"jî"jç"jà"jÙ"jÒ"jË"jÄ"j½"j¶"j¯"j¨"j¡"jš"j“"jŒ"j…"j~"jw"jp"ji"jb"j["jT"jM"jF"j?"j8"j1"j*"j#"j"j"j"j"j"jù!jò!jë!jä!jÝ!jÖ!jÏ!jÈ!jÁ!jº!j³!j¬!j¥!jž!j—!j!j‰!j‚!j{!jt!jm!jf!j_!jX!jQ!jJ!jC!jj7j0j)j"jjj jjÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjýjöjïjèjájÚjÓjÌjÅj¾j·j°j©j¢j›j”jj†jjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþj÷jðjéjâjÛjÔjÍjÆj¿j¸j±jªj£jœj•jŽj‡j€jyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjýjöjïjèjájÚjÓjÌjÅj¾j·j°j©j¢j›j”jj†jjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþj÷jðjéjâjÛjÔjÍjÆj¿j¸j±jªj£jœj•jŽj‡j€jyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjü jõ jî jç jà jÙ jÒ jË jÄ j½ j¶ j¯ j¨ j¡ jš j“ jŒ j… j~ jw jp ji jb j[ jT jM jF j? j8 j1 j* j# j j j j j jù jò jë jä jÝ jÖ jÏ jÈ jÁ jº j³ j¬ j¥ jž j— j j‰ j‚ j{ jt jm jf j_ jX jQ jJ jC j< j5 j. j' j j j j j jý jö jï jè já jÚ jÓ jÌ jÅ j¾ j· j° j© j¢ j› j” j j† j jx jq jj jc j\ jU jN jG j@ j9 j2 j+ j$ j j j j j jú jó jì jå jÞ j× jÐ jÉ j j» j´ j­ j¦ jŸ j˜ j‘ jŠ jƒ j| ju jn jg j` jY jR jK jD j= j6 j/ j( j! j j j j jþ j÷ jð jé jâ jÛ jÔ jÍ jÆ j¿ j¸ j± jª j£ jœ j• jŽ j‡ j€ jy jr jk jd j] jV jO jH jA j: j3 j, j% j j j j j jûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCj<j5j.j'j jjj jjýjöjïjèjájÚjÓjÌjÅj¾j·j°j©j¢j›j”jj†jjxjqjjjcj\jUjNjGj@j9j2j+j$jjjjjjújójìjåjÞj×jÐjÉjÂj»j´j­j¦jŸj˜j‘jŠjƒj|jujnjgj`jYjRjKjDj=j6j/j(j!jjj jjþj÷jðjéjâjÛjÔjÍjÆj¿j¸j±jªj£jœj•jŽj‡j€jyjrjkjdj]jVjOjHjAj:j3j,j%jjjj jjûjôjíjæjßjØjÑjÊjÃj¼jµj®j§j j™j’j‹j„j}jvjojhjajZjSjLjEj>j7j0j)j"jjj jjÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüÿiõÿiîÿiçÿiàÿiÙÿiÒÿiËÿiÄÿi½ÿi¶ÿi¯ÿi¨ÿi¡ÿišÿi“ÿiŒÿi…ÿi~ÿiwÿipÿiiÿibÿi[ÿiTÿiMÿiFÿi?ÿi8ÿi1ÿi*ÿi#ÿiÿiÿiÿiÿiÿiùþiòþiëþiäþiÝþiÖþiÏþiÈþiÁþiºþi³þi¬þi¥þižþi—þiþi‰þi‚þi{þitþimþifþi_þiXþiQþiJþiCþi<þi5þi.þi'þi þiþiþi þiþiýýiöýiïýièýiáýiÚýiÓýiÌýiÅýi¾ýi·ýi°ýi©ýi¢ýi›ýi”ýiýi†ýiýixýiqýijýicýi\ýiUýiNýiGýi@ýi9ýi2ýi+ýi$ýiýiýiýiýiýiúüióüiìüiåüiÞüi×üiÐüiÉüiÂüi»üi´üi­üi¦üiŸüi˜üi‘üiŠüiƒüi|üiuüinüigüi`üiYüiRüiKüiDüi=üi6üi/üi(üi!üiüiüi üiüiþûi÷ûiðûiéûiâûiÛûiÔûiÍûiÆûi¿ûi¸ûi±ûiªûi£ûiœûi•ûiŽûi‡ûi€ûiyûirûikûidûi]ûiVûiOûiHûiAûi:ûi3ûi,ûi%ûiûiûiûi ûiûiûúiôúiíúiæúißúiØúiÑúiÊúiÃúi¼úiµúi®úi§úi úi™úi’úi‹úi„úi}úivúioúihúiaúiZúiSúiLúiEúi>úi7úi0úi)úi"úiúiúi úiúiÿùiøùiñùiêùiãùiÜùiÕùiÎùiÇùiÀùi¹ùi²ùi«ùi¤ùiùi–ùiùiˆùiùizùisùilùieùi^ùiWùiPùiIùiBùi;ùi4ùi-ùi&ùiùiùiùi ùiùiüøiõøiîøiçøiàøiÙøiÒøiËøiÄøi½øi¶øi¯øi¨øi¡øišøi“øiŒøi…øi~øiwøipøiiøibøi[øiTøiMøiFøi?øi8øi1øi*øi#øiøiøiøiøiøiù÷iò÷ië÷iä÷iÝ÷iÖ÷iÏ÷iÈ÷iÁ÷iº÷i³÷i¬÷i¥÷iž÷i—÷i÷i‰÷i‚÷i{÷it÷im÷if÷i_÷iX÷iQ÷iJ÷iC÷i<÷i5÷i.÷i'÷i ÷i÷i÷i ÷i÷iýöiööiïöièöiáöiÚöiÓöiÌöiÅöi¾öi·öi°öi©öi¢öi›öi”öiöi†öiöixöiqöijöicöi\öiUöiNöiGöi@öi9öi2öi+öi$öiöiöiöiöiöiúõióõiìõiåõiÞõi×õiÐõiÉõiÂõi»õi´õi­õi¦õiŸõi˜õi‘õiŠõiƒõi|õiuõinõigõi`õiYõiRõiKõiDõi=õi6õi/õi(õi!õiõiõi õiõiþôi÷ôiðôiéôiâôiÛôiÔôiÍôiÆôi¿ôi¸ôi±ôiªôi£ôiœôi•ôiŽôi‡ôi€ôiyôirôikôidôi]ôiVôiOôiHôiAôi:ôi3ôi,ôi%ôiôiôiôi ôiôiûóiôóiíóiæóißóiØóiÑóiÊóiÃói¼óiµói®ói§ói ói™ói’ói‹ói„ói}óivóioóihóiaóiZóiSóiLóiEói>ói7ói0ói)ói"óióiói óióiÿòiøòiñòiêòiãòiÜòiÕòiÎòiÇòiÀòi¹òi²òi«òi¤òiòi–òiòiˆòiòizòisòilòieòi^òiWòiPòiIòiBòi;òi4òi-òi&òiòiòiòi òiòiüñiõñiîñiçñiàñiÙñiÒñiËñiÄñi½ñi¶ñi¯ñi¨ñi¡ñišñi“ñiŒñi…ñi~ñiwñipñiiñibñi[ñiTñiMñiFñi?ñi8ñi1ñi*ñi#ñiñiñiñiñiñiùðiòðiëðiäðiÝðiÖðiÏðiÈðiÁðiºði³ði¬ði¥ðižði—ðiði‰ði‚ði{ðitðimðifði_ðiXðiQðiJðiCði<ði5ði.ði'ði ðiðiði ðiðiýïiöïiïïièïiáïiÚïiÓïiÌïiÅïi¾ïi·ïi°ïi©ïi¢ïi›ïi”ïiïi†ïiïixïiqïijïicïi\ïiUïiNïiGïi@ïi9ïi2ïi+ïi$ïiïiïiïiïiïiúîióîiìîiåîiÞîi×îiÐîiÉîiÂîi»îi´îi­îi¦îiŸîi˜îi‘îiŠîiƒîi|îiuîinîigîi`îiYîiRîiKîiDîi=îi6îi/îi(îi!îiîiîi îiîiþíi÷íiðíiéíiâíiÛíiÔíiÍíiÆíi¿íi¸íi±íiªíi£íiœíi•íiŽíi‡íi€íiyíiríikíidíi]íiVíiOíiHíiAíi:íi3íi,íi%íiíiíiíi íiíiûìiôìiíìiæìißìiØìiÑìiÊìiÃìi¼ìiµìi®ìi§ìi ìi™ìi’ìi‹ìi„ìi}ìivìioìihìiaìiZìiSìiLìiEìi>ìi7ìi0ìi)ìi"ìiìiìi ìiìiÿëiøëiñëiêëiãëiÜëiÕëiÎëiÇëiÀëi¹ëi²ëi«ëi¤ëiëi–ëiëiˆëiëizëisëilëieëi^ëiWëiPëiIëiBëi;ëi4ëi-ëi&ëiëiëiëi ëiëiüêiõêiîêiçêiàêiÙêiÒêiËêiÄêi½êi¶êi¯êi¨êi¡êišêi“êiŒêi…êi~êiwêipêiiêibêi[êiTêiMêiFêi?êi8êi1êi*êi#êiêiêiêiêiêiùéiòéiëéiäéiÝéiÖéiÏéiÈéiÁéiºéi³éi¬éi¥éižéi—éiéi‰éi‚éi{éitéiméiféi_éiXéiQéiJéiCéi<éi5éi.éi'éi éiéiéi éiéiýèiöèiïèièèiáèiÚèiÓèiÌèiÅèi¾èi·èi°èi©èi¢èi›èi”èièi†èièixèiqèijèicèi\èiUèiNèiGèi@èi9èi2èi+èi$èièièièièièiúçióçiìçiåçiÞçi×çiÐçiÉçiÂçi»çi´çi­çi¦çiŸçi˜çi‘çiŠçiƒçi|çiuçinçigçi`çiYçiRçiKçiDçi=çi6çi/çi(çi!çiçiçi çiçiþæi÷æiðæiéæiâæiÛæiÔæiÍæiÆæi¿æi¸æi±æiªæi£æiœæi•æiŽæi‡æi€æiyæiræikæidæi]æiVæiOæiHæiAæi:æi3æi,æi%æiæiæiæi æiæiûåiôåiíåiæåißåiØåiÑåiÊåiÃåi¼åiµåi®åi§åi åi™åi’åi‹åi„åi}åivåioåihåiaåiZåiSåiLåiEåi>åi7åi0åi)åi"åiåiåi åiåiÿäiøäiñäiêäiãäiÜäiÕäiÎäiÇäiÀäi¹äi²äi«äi¤äiäi–äiäiˆäiäizäisäiläieäi^äiWäiPäiIäiBäi;äi4äi-äi&äiäiäiäi äiäiüãiõãiîãiçãiàãiÙãiÒãiËãiÄãi½ãi¶ãi¯ãi¨ãi¡ãišãi“ãiŒãi…ãi~ãiwãipãiiãibãi[ãiTãiMãiFãi?ãi8ãi1ãi*ãi#ãiãiãiãiãiãiùâiòâiëâiäâiÝâiÖâiÏâiÈâiÁâiºâi³âi¬âi¥âižâi—âiâi‰âi‚âi{âitâimâifâi_âiXâiQâiJâiCâi<âi5âi.âi'âi âiâiâi âiâiýáiöáiïáièáiááiÚáiÓáiÌáiÅái¾ái·ái°ái©ái¢ái›ái”áiái†áiáixáiqáijáicái\áiUáiNáiGái@ái9ái2ái+ái$áiáiáiáiáiáiúàióàiìàiåàiÞài×àiÐàiÉàiÂài»ài´ài­ài¦àiŸài˜ài‘àiŠàiƒài|àiuàinàigài`àiYàiRàiKàiDài=ài6ài/ài(ài!àiàiài àiàiþßi÷ßiðßiéßiâßiÛßiÔßiÍßiÆßi¿ßi¸ßi±ßiªßi£ßiœßi•ßiŽßi‡ßi€ßiyßirßikßidßi]ßiVßiOßiHßiAßi:ßi3ßi,ßi%ßißißißi ßißiûÞiôÞiíÞiæÞißÞiØÞiÑÞiÊÞiÃÞi¼ÞiµÞi®Þi§Þi Þi™Þi’Þi‹Þi„Þi}ÞivÞioÞihÞiaÞiZÞiSÞiLÞiEÞi>Þi7Þi0Þi)Þi"ÞiÞiÞi ÞiÞiÿÝiøÝiñÝiêÝiãÝiÜÝiÕÝiÎÝiÇÝiÀÝi¹Ýi²Ýi«Ýi¤ÝiÝi–ÝiÝiˆÝiÝizÝisÝilÝieÝi^ÝiWÝiPÝiIÝiBÝi;Ýi4Ýi-Ýi&ÝiÝiÝiÝi ÝiÝiüÜiõÜiîÜiçÜiàÜiÙÜiÒÜiËÜiÄÜi½Üi¶Üi¯Üi¨Üi¡ÜišÜi“ÜiŒÜi…Üi~ÜiwÜipÜiiÜibÜi[ÜiTÜiMÜiFÜi?Üi8Üi1Üi*Üi#ÜiÜiÜiÜiÜiÜiùÛiòÛiëÛiäÛiÝÛiÖÛiÏÛiÈÛiÁÛiºÛi³Ûi¬Ûi¥ÛižÛi—ÛiÛi‰Ûi‚Ûi{ÛitÛimÛifÛi_ÛiXÛiQÛiJÛiCÛi<Ûi5Ûi.Ûi'Ûi ÛiÛiÛi ÛiÛiýÚiöÚiïÚièÚiáÚiÚÚiÓÚiÌÚiÅÚi¾Úi·Úi°Úi©Úi¢Úi›Úi”ÚiÚi†ÚiÚixÚiqÚijÚicÚi\ÚiUÚiNÚiGÚi@Úi9Úi2Úi+Úi$ÚiÚiÚiÚiÚiÚiúÙióÙiìÙiåÙiÞÙi×ÙiÐÙiÉÙiÂÙi»Ùi´Ùi­Ùi¦ÙiŸÙi˜Ùi‘ÙiŠÙiƒÙi|ÙiuÙinÙigÙi`ÙiYÙiRÙiKÙiDÙi=Ùi6Ùi/Ùi(Ùi!ÙiÙiÙi ÙiÙiþØi÷ØiðØiéØiâØiÛØiÔØiÍØiÆØi¿Øi¸Øi±ØiªØi£ØiœØi•ØiŽØi‡Øi€ØiyØirØikØidØi]ØiVØiOØiHØiAØi:Øi3Øi,Øi%ØiØiØiØi ØiØiû×iô×ií×iæ×iß×iØ×iÑ×iÊ×iÃ×i¼×iµ×i®×i§×i ×i™×i’×i‹×i„×i}×iv×io×ih×ia×iZ×iS×iL×iE×i>×i7×i0×i)×i"×i×i×i ×i×iÿÖiøÖiñÖiêÖiãÖiÜÖiÕÖiÎÖiÇÖiÀÖi¹Öi²Öi«Öi¤ÖiÖi–ÖiÖiˆÖiÖizÖisÖilÖieÖi^ÖiWÖiPÖiIÖiBÖi;Öi4Öi-Öi&ÖiÖiÖiÖi ÖiÖiüÕiõÕiîÕiçÕiàÕiÙÕiÒÕiËÕiÄÕi½Õi¶Õi¯Õi¨Õi¡ÕišÕi“ÕiŒÕi…Õi~ÕiwÕipÕiiÕibÕi[ÕiTÕiMÕiFÕi?Õi8Õi1Õi*Õi#ÕiÕiÕiÕiÕiÕiùÔiòÔiëÔiäÔiÝÔiÖÔiÏÔiÈÔiÁÔiºÔi³Ôi¬Ôi¥ÔižÔi—ÔiÔi‰Ôi‚Ôi{ÔitÔimÔifÔi_ÔiXÔiQÔiJÔiCÔi<Ôi5Ôi.Ôi'Ôi ÔiÔiÔi ÔiÔiýÓiöÓiïÓièÓiáÓiÚÓiÓÓiÌÓiÅÓi¾Ói·Ói°Ói©Ói¢Ói›Ói”ÓiÓi†ÓiÓixÓiqÓijÓicÓi\ÓiUÓiNÓiGÓi@Ói9Ói2Ói+Ói$ÓiÓiÓiÓiÓiÓiúÒióÒiìÒiåÒiÞÒi×ÒiÐÒiÉÒiÂÒi»Òi´Òi­Òi¦ÒiŸÒi˜Òi‘ÒiŠÒiƒÒi|ÒiuÒinÒigÒi`ÒiYÒiRÒiKÒiDÒi=Òi6Òi/Òi(Òi!ÒiÒiÒi ÒiÒiþÑi÷ÑiðÑiéÑiâÑiÛÑiÔÑiÍÑiÆÑi¿Ñi¸Ñi±ÑiªÑi£ÑiœÑi•ÑiŽÑi‡Ñi€ÑiyÑirÑikÑidÑi]ÑiVÑiOÑiHÑiAÑi:Ñi3Ñi,Ñi%ÑiÑiÑiÑi ÑiÑiûÐiôÐiíÐiæÐißÐiØÐiÑÐiÊÐiÃÐi¼ÐiµÐi®Ði§Ði Ði™Ði’Ði‹Ði„Ði}ÐivÐioÐihÐiaÐiZÐiSÐiLÐiEÐi>Ði7Ði0Ði)Ði"ÐiÐiÐi ÐiÐiÿÏiøÏiñÏiêÏiãÏiÜÏiÕÏiÎÏiÇÏiÀÏi¹Ïi²Ïi«Ïi¤ÏiÏi–ÏiÏiˆÏiÏizÏisÏilÏieÏi^ÏiWÏiPÏiIÏiBÏi;Ïi4Ïi-Ïi&ÏiÏiÏiÏi ÏiÏiüÎiõÎiîÎiçÎiàÎiÙÎiÒÎiËÎiÄÎi½Îi¶Îi¯Îi¨Îi¡ÎišÎi“ÎiŒÎi…Îi~ÎiwÎipÎiiÎibÎi[ÎiTÎiMÎiFÎi?Îi8Îi1Îi*Îi#ÎiÎiÎiÎiÎiÎiùÍiòÍiëÍiäÍiÝÍiÖÍiÏÍiÈÍiÁÍiºÍi³Íi¬Íi¥ÍižÍi—ÍiÍi‰Íi‚Íi{ÍitÍimÍifÍi_ÍiXÍiQÍiJÍiCÍi<Íi5Íi.Íi'Íi ÍiÍiÍi ÍiÍiýÌiöÌiïÌièÌiáÌiÚÌiÓÌiÌÌiÅÌi¾Ìi·Ìi°Ìi©Ìi¢Ìi›Ìi”ÌiÌi†ÌiÌixÌiqÌijÌicÌi\ÌiUÌiNÌiGÌi@Ìi9Ìi2Ìi+Ìi$ÌiÌiÌiÌiÌiÌiúËióËiìËiåËiÞËi×ËiÐËiÉËiÂËi»Ëi´Ëi­Ëi¦ËiŸËi˜Ëi‘ËiŠËiƒËi|ËiuËinËigËi`ËiYËiRËiKËiDËi=Ëi6Ëi/Ëi(Ëi!ËiËiËi ËiËiþÊi÷ÊiðÊiéÊiâÊiÛÊiÔÊiÍÊiÆÊi¿Êi¸Êi±ÊiªÊi£ÊiœÊi•ÊiŽÊi‡Êi€ÊiyÊirÊikÊidÊi]ÊiVÊiOÊiHÊiAÊi:Êi3Êi,Êi%ÊiÊiÊiÊi ÊiÊiûÉiôÉiíÉiæÉißÉiØÉiÑÉiÊÉiÃÉi¼ÉiµÉi®Éi§Éi Éi™Éi’Éi‹Éi„Éi}ÉivÉioÉihÉiaÉiZÉiSÉiLÉiEÉi>Éi7Éi0Éi)Éi"ÉiÉiÉi ÉiÉiÿÈiøÈiñÈiêÈiãÈiÜÈiÕÈiÎÈiÇÈiÀÈi¹Èi²Èi«Èi¤ÈiÈi–ÈiÈiˆÈiÈizÈisÈilÈieÈi^ÈiWÈiPÈiIÈiBÈi;Èi4Èi-Èi&ÈiÈiÈiÈi ÈiÈiüÇiõÇiîÇiçÇiàÇiÙÇiÒÇiËÇiÄÇi½Çi¶Çi¯Çi¨Çi¡ÇišÇi“ÇiŒÇi…Çi~ÇiwÇipÇiiÇibÇi[ÇiTÇiMÇiFÇi?Çi8Çi1Çi*Çi#ÇiÇiÇiÇiÇiÇiùÆiòÆiëÆiäÆiÝÆiÖÆiÏÆiÈÆiÁÆiºÆi³Æi¬Æi¥ÆižÆi—ÆiÆi‰Æi‚Æi{ÆitÆimÆifÆi_ÆiXÆiQÆiJÆiCÆi<Æi5Æi.Æi'Æi ÆiÆiÆi ÆiÆiýÅiöÅiïÅièÅiáÅiÚÅiÓÅiÌÅiÅÅi¾Åi·Åi°Åi©Åi¢Åi›Åi”ÅiÅi†ÅiÅixÅiqÅijÅicÅi\ÅiUÅiNÅiGÅi@Åi9Åi2Åi+Åi$ÅiÅiÅiÅiÅiÅiúÄióÄiìÄiåÄiÞÄi×ÄiÐÄiÉÄiÂÄi»Äi´Äi­Äi¦ÄiŸÄi˜Äi‘ÄiŠÄiƒÄi|ÄiuÄinÄigÄi`ÄiYÄiRÄiKÄiDÄi=Äi6Äi/Äi(Äi!ÄiÄiÄi ÄiÄiþÃi÷ÃiðÃiéÃiâÃiÛÃiÔÃiÍÃiÆÃi¿Ãi¸Ãi±ÃiªÃi£ÃiœÃi•ÃiŽÃi‡Ãi€ÃiyÃirÃikÃidÃi]ÃiVÃiOÃiHÃiAÃi:Ãi3Ãi,Ãi%ÃiÃiÃiÃi ÃiÃiûÂiôÂiíÂiæÂißÂiØÂiÑÂiÊÂiÃÂi¼ÂiµÂi®Âi§Âi Âi™Âi’Âi‹Âi„Âi}ÂivÂioÂihÂiaÂiZÂiSÂiLÂiEÂi>Âi7Âi0Âi)Âi"ÂiÂiÂi ÂiÂiÿÁiøÁiñÁiêÁiãÁiÜÁiÕÁiÎÁiÇÁiÀÁi¹Ái²Ái«Ái¤ÁiÁi–ÁiÁiˆÁiÁizÁisÁilÁieÁi^ÁiWÁiPÁiIÁiBÁi;Ái4Ái-Ái&ÁiÁiÁiÁi ÁiÁiüÀiõÀiîÀiçÀiàÀiÙÀiÒÀiËÀiÄÀi½Ài¶Ài¯Ài¨Ài¡ÀišÀi“ÀiŒÀi…Ài~ÀiwÀipÀiiÀibÀi[ÀiTÀiMÀiFÀi?Ài8Ài1Ài*Ài#ÀiÀiÀiÀiÀiÀiù¿iò¿ië¿iä¿iÝ¿iÖ¿iÏ¿iÈ¿iÁ¿iº¿i³¿i¬¿i¥¿iž¿i—¿i¿i‰¿i‚¿i{¿it¿im¿if¿i_¿iX¿iQ¿iJ¿iC¿i<¿i5¿i.¿i'¿i ¿i¿i¿i ¿i¿iý¾iö¾iï¾iè¾iá¾iÚ¾iÓ¾i̾iži¾¾i·¾i°¾i©¾i¢¾i›¾i”¾i¾i†¾i¾ix¾iq¾ij¾ic¾i\¾iU¾iN¾iG¾i@¾i9¾i2¾i+¾i$¾i¾i¾i¾i¾i¾iú½ió½iì½iå½iÞ½i×½iнiɽi½i»½i´½i­½i¦½iŸ½i˜½i‘½iнiƒ½i|½iu½in½ig½i`½iY½iR½iK½iD½i=½i6½i/½i(½i!½i½i½i ½i½iþ¼i÷¼ið¼ié¼iâ¼iÛ¼iÔ¼iͼiƼi¿¼i¸¼i±¼iª¼i£¼iœ¼i•¼i޼i‡¼i€¼iy¼ir¼ik¼id¼i]¼iV¼iO¼iH¼iA¼i:¼i3¼i,¼i%¼i¼i¼i¼i ¼i¼iû»iô»ií»iæ»iß»iØ»iÑ»iÊ»iûi¼»iµ»i®»i§»i »i™»i’»i‹»i„»i}»iv»io»ih»ia»iZ»iS»iL»iE»i>»i7»i0»i)»i"»i»i»i »i»iÿºiøºiñºiêºiãºiܺiÕºiκiǺiÀºi¹ºi²ºi«ºi¤ºiºi–ºiºiˆºiºizºisºilºieºi^ºiWºiPºiIºiBºi;ºi4ºi-ºi&ºiºiºiºi ºiºiü¹iõ¹iî¹iç¹ià¹iÙ¹iÒ¹i˹iĹi½¹i¶¹i¯¹i¨¹i¡¹iš¹i“¹iŒ¹i…¹i~¹iw¹ip¹ii¹ib¹i[¹iT¹iM¹iF¹i?¹i8¹i1¹i*¹i#¹i¹i¹i¹i¹i¹iù¸iò¸ië¸iä¸iݸiÖ¸iϸiȸiÁ¸iº¸i³¸i¬¸i¥¸iž¸i—¸i¸i‰¸i‚¸i{¸it¸im¸if¸i_¸iX¸iQ¸iJ¸iC¸i<¸i5¸i.¸i'¸i ¸i¸i¸i ¸i¸iý·iö·iï·iè·iá·iÚ·iÓ·iÌ·iÅ·i¾·i··i°·i©·i¢·i›·i”·i·i†·i·ix·iq·ij·ic·i\·iU·iN·iG·i@·i9·i2·i+·i$·i·i·i·i·i·iú¶ió¶iì¶iå¶iÞ¶i×¶iжiɶi¶i»¶i´¶i­¶i¦¶iŸ¶i˜¶i‘¶iжiƒ¶i|¶iu¶in¶ig¶i`¶iY¶iR¶iK¶iD¶i=¶i6¶i/¶i(¶i!¶i¶i¶i ¶i¶iþµi÷µiðµiéµiâµiÛµiÔµi͵iƵi¿µi¸µi±µiªµi£µiœµi•µi޵i‡µi€µiyµirµikµidµi]µiVµiOµiHµiAµi:µi3µi,µi%µiµiµiµi µiµiû´iô´ií´iæ´iß´iØ´iÑ´iÊ´iôi¼´iµ´i®´i§´i ´i™´i’´i‹´i„´i}´iv´io´ih´ia´iZ´iS´iL´iE´i>´i7´i0´i)´i"´i´i´i ´i´iÿ³iø³iñ³iê³iã³iܳiÕ³iγidziÀ³i¹³i²³i«³i¤³i³i–³i³iˆ³i³iz³is³il³ie³i^³iW³iP³iI³iB³i;³i4³i-³i&³i³i³i³i ³i³iü²iõ²iî²iç²ià²iÙ²iÒ²i˲iIJi½²i¶²i¯²i¨²i¡²iš²i“²iŒ²i…²i~²iw²ip²ii²ib²i[²iT²iM²iF²i?²i8²i1²i*²i#²i²i²i²i²i²iù±iò±ië±iä±iݱiÖ±iϱiȱiÁ±iº±i³±i¬±i¥±iž±i—±i±i‰±i‚±i{±it±im±if±i_±iX±iQ±iJ±iC±i<±i5±i.±i'±i ±i±i±i ±i±iý°iö°iï°iè°iá°iÚ°iÓ°ḭiŰi¾°i·°i°°i©°i¢°i›°i”°i°i†°i°ix°iq°ij°ic°i\°iU°iN°iG°i@°i9°i2°i+°i$°i°i°i°i°i°iú¯ió¯iì¯iå¯iÞ¯iׯiЯiɯi¯i»¯i´¯i­¯i¦¯iŸ¯i˜¯i‘¯iНiƒ¯i|¯iu¯in¯ig¯i`¯iY¯iR¯iK¯iD¯i=¯i6¯i/¯i(¯i!¯i¯i¯i ¯i¯iþ®i÷®ið®ié®iâ®iÛ®iÔ®iÍ®iÆ®i¿®i¸®i±®iª®i£®iœ®i•®iŽ®i‡®i€®iy®ir®ik®id®i]®iV®iO®iH®iA®i:®i3®i,®i%®i®i®i®i ®i®iû­iô­ií­iæ­iß­iØ­iÑ­iÊ­iíi¼­iµ­i®­i§­i ­i™­i’­i‹­i„­i}­iv­io­ih­ia­iZ­iS­iL­iE­i>­i7­i0­i)­i"­i­i­i ­i­iÿ¬iø¬iñ¬iê¬iã¬iܬiÕ¬iάiǬiÀ¬i¹¬i²¬i«¬i¤¬i¬i–¬i¬iˆ¬i¬iz¬is¬il¬ie¬i^¬iW¬iP¬iI¬iB¬i;¬i4¬i-¬i&¬i¬i¬i¬i ¬i¬iü«iõ«iî«iç«ià«iÙ«iÒ«iË«iÄ«i½«i¶«i¯«i¨«i¡«iš«i“«iŒ«i…«i~«iw«ip«ii«ib«i[«iT«iM«iF«i?«i8«i1«i*«i#«i«i«i«i«i«iùªiòªiëªiäªiݪiÖªiϪiȪiÁªiºªi³ªi¬ªi¥ªižªi—ªiªi‰ªi‚ªi{ªitªimªifªi_ªiXªiQªiJªiCªi<ªi5ªi.ªi'ªi ªiªiªi ªiªiý©iö©iï©iè©iá©iÚ©iÓ©iÌ©iÅ©i¾©i·©i°©i©©i¢©i›©i”©i©i†©i©ix©iq©ij©ic©i\©iU©iN©iG©i@©i9©i2©i+©i$©i©i©i©i©i©iú¨ió¨iì¨iå¨iÞ¨iרiШiɨi¨i»¨i´¨i­¨i¦¨iŸ¨i˜¨i‘¨iЍiƒ¨i|¨iu¨in¨ig¨i`¨iY¨iR¨iK¨iD¨i=¨i6¨i/¨i(¨i!¨i¨i¨i ¨i¨iþ§i÷§ið§ié§iâ§iÛ§iÔ§iͧiƧi¿§i¸§i±§iª§i£§iœ§i•§iާi‡§i€§iy§ir§ik§id§i]§iV§iO§iH§iA§i:§i3§i,§i%§i§i§i§i §i§iû¦iô¦ií¦iæ¦iߦiئiѦiʦiæi¼¦iµ¦i®¦i§¦i ¦i™¦i’¦i‹¦i„¦i}¦iv¦io¦ih¦ia¦iZ¦iS¦iL¦iE¦i>¦i7¦i0¦i)¦i"¦i¦i¦i ¦i¦iÿ¥iø¥iñ¥iê¥iã¥iÜ¥iÕ¥iÎ¥iÇ¥iÀ¥i¹¥i²¥i«¥i¤¥i¥i–¥i¥iˆ¥i¥iz¥is¥il¥ie¥i^¥iW¥iP¥iI¥iB¥i;¥i4¥i-¥i&¥i¥i¥i¥i ¥i¥iü¤iõ¤iî¤iç¤ià¤iÙ¤iÒ¤iˤiĤi½¤i¶¤i¯¤i¨¤i¡¤iš¤i“¤iŒ¤i…¤i~¤iw¤ip¤ii¤ib¤i[¤iT¤iM¤iF¤i?¤i8¤i1¤i*¤i#¤i¤i¤i¤i¤i¤iù£iò£ië£iä£iÝ£iÖ£iÏ£iÈ£iÁ£iº£i³£i¬£i¥£iž£i—£i£i‰£i‚£i{£it£im£if£i_£iX£iQ£iJ£iC£i<£i5£i.£i'£i £i£i£i £i£iý¢iö¢iï¢iè¢iá¢iÚ¢iÓ¢iÌ¢iÅ¢i¾¢i·¢i°¢i©¢i¢¢i›¢i”¢i¢i†¢i¢ix¢iq¢ij¢ic¢i\¢iU¢iN¢iG¢i@¢i9¢i2¢i+¢i$¢i¢i¢i¢i¢i¢iú¡ió¡iì¡iå¡iÞ¡iסiСiÉ¡i¡i»¡i´¡i­¡i¦¡iŸ¡i˜¡i‘¡iŠ¡iƒ¡i|¡iu¡in¡ig¡i`¡iY¡iR¡iK¡iD¡i=¡i6¡i/¡i(¡i!¡i¡i¡i ¡i¡iþ i÷ ið ié iâ iÛ iÔ iÍ iÆ i¿ i¸ i± iª i£ iœ i• iŽ i‡ i€ iy ir ik id i] iV iO iH iA i: i3 i, i% i i i i  i iûŸiôŸiíŸiæŸiߟiØŸiÑŸiÊŸißi¼ŸiµŸi®Ÿi§Ÿi Ÿi™Ÿi’Ÿi‹Ÿi„Ÿi}ŸivŸioŸihŸiaŸiZŸiSŸiLŸiEŸi>Ÿi7Ÿi0Ÿi)Ÿi"ŸiŸiŸi ŸiŸiÿžiøžiñžiêžiãžiÜžiÕžiΞiÇžiÀži¹ži²ži«ži¤žiži–žižiˆžižizžisžilžieži^žiWžiPžiIžiBži;ži4ži-ži&žižižiži žižiüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùœiòœiëœiäœiÝœiÖœiÏœiÈœiÁœiºœi³œi¬œi¥œižœi—œiœi‰œi‚œi{œitœimœifœi_œiXœiQœiJœiCœi<œi5œi.œi'œi œiœiœi œiœiý›iö›iï›iè›iá›iÚ›iÓ›iÌ›iÅ›i¾›i·›i°›i©›i¢›i››i”›i›i†›i›ix›iq›ij›ic›i\›iU›iN›iG›i@›i9›i2›i+›i$›i›i›i›i›i›iúšióšiìšiåšiÞšiךiКiÉšiši»ši´ši­ši¦šiŸši˜ši‘šiŠšiƒši|šiušinšigši`šiYšiRšiKšiDši=ši6ši/ši(ši!šišiši šišiþ™i÷™ið™ié™iâ™iÛ™iÔ™iÍ™iÆ™i¿™i¸™i±™iª™i£™iœ™i•™iŽ™i‡™i€™iy™ir™ik™id™i]™iV™iO™iH™iA™i:™i3™i,™i%™i™i™i™i ™i™iû˜iô˜ií˜iæ˜iߘiؘiјiʘiØi¼˜iµ˜i®˜i§˜i ˜i™˜i’˜i‹˜i„˜i}˜iv˜io˜ih˜ia˜iZ˜iS˜iL˜iE˜i>˜i7˜i0˜i)˜i"˜i˜i˜i ˜i˜iÿ—iø—iñ—iê—iã—iÜ—iÕ—iΗiÇ—iÀ—i¹—i²—i«—i¤—i—i–—i—iˆ—i—iz—is—il—ie—i^—iW—iP—iI—iB—i;—i4—i-—i&—i—i—i—i —i—iü–iõ–iî–iç–ià–iÙ–iÒ–iË–iÄ–i½–i¶–i¯–i¨–i¡–iš–i“–iŒ–i…–i~–iw–ip–ii–ib–i[–iT–iM–iF–i?–i8–i1–i*–i#–i–i–i–i–i–iù•iò•ië•iä•iÝ•iÖ•iÏ•iÈ•iÁ•iº•i³•i¬•i¥•iž•i—•i•i‰•i‚•i{•it•im•if•i_•iX•iQ•iJ•iC•i<•i5•i.•i'•i •i•i•i •i•iý”iö”iï”iè”iá”iÚ”iÓ”iÌ”iÅ”i¾”i·”i°”i©”i¢”i›”i””i”i†”i”ix”iq”ij”ic”i\”iU”iN”iG”i@”i9”i2”i+”i$”i”i”i”i”i”iú“ió“iì“iå“iÞ“iדiГiÉ“i“i»“i´“i­“i¦“iŸ“i˜“i‘“iŠ“iƒ“i|“iu“in“ig“i`“iY“iR“iK“iD“i=“i6“i/“i(“i!“i“i“i “i“iþ’i÷’ið’ié’iâ’iÛ’iÔ’iÍ’iÆ’i¿’i¸’i±’iª’i£’iœ’i•’iŽ’i‡’i€’iy’ir’ik’id’i]’iV’iO’iH’iA’i:’i3’i,’i%’i’i’i’i ’i’iû‘iô‘ií‘iæ‘iß‘iØ‘iÑ‘iÊ‘iÑi¼‘iµ‘i®‘i§‘i ‘i™‘i’‘i‹‘i„‘i}‘iv‘io‘ih‘ia‘iZ‘iS‘iL‘iE‘i>‘i7‘i0‘i)‘i"‘i‘i‘i ‘i‘iÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùŽiòŽiëŽiäŽiÝŽiÖŽiÏŽiÈŽiÁŽiºŽi³Ži¬Ži¥ŽižŽi—ŽiŽi‰Ži‚Ži{ŽitŽimŽifŽi_ŽiXŽiQŽiJŽiCŽi<Ži5Ži.Ži'Ži ŽiŽiŽi ŽiŽiýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúŒióŒiìŒiåŒiÞŒi׌iÐŒiÉŒiÂŒi»Œi´Œi­Œi¦ŒiŸŒi˜Œi‘ŒiŠŒiƒŒi|ŒiuŒinŒigŒi`ŒiYŒiRŒiKŒiDŒi=Œi6Œi/Œi(Œi!ŒiŒiŒi ŒiŒiþ‹i÷‹ið‹ié‹iâ‹iÛ‹iÔ‹iÍ‹iÆ‹i¿‹i¸‹i±‹iª‹i£‹iœ‹i•‹iŽ‹i‡‹i€‹iy‹ir‹ik‹id‹i]‹iV‹iO‹iH‹iA‹i:‹i3‹i,‹i%‹i‹i‹i‹i ‹i‹iûŠiôŠiíŠiæŠiߊiØŠiÑŠiÊŠiÊi¼ŠiµŠi®Ši§Ši Ši™Ši’Ši‹Ši„Ši}ŠivŠioŠihŠiaŠiZŠiSŠiLŠiEŠi>Ši7Ši0Ši)Ši"ŠiŠiŠi ŠiŠiÿ‰iø‰iñ‰iê‰iã‰i܉iÕ‰iΉiljiÀ‰i¹‰i²‰i«‰i¤‰i‰i–‰i‰iˆ‰i‰iz‰is‰il‰ie‰i^‰iW‰iP‰iI‰iB‰i;‰i4‰i-‰i&‰i‰i‰i‰i ‰i‰iüˆiõˆiîˆiçˆiàˆiÙˆiÒˆiˈiĈi½ˆi¶ˆi¯ˆi¨ˆi¡ˆišˆi“ˆiŒˆi…ˆi~ˆiwˆipˆiiˆibˆi[ˆiTˆiMˆiFˆi?ˆi8ˆi1ˆi*ˆi#ˆiˆiˆiˆiˆiˆiù‡iò‡ië‡iä‡i݇iÖ‡iχiȇiÁ‡iº‡i³‡i¬‡i¥‡iž‡i—‡i‡i‰‡i‚‡i{‡it‡im‡if‡i_‡iX‡iQ‡iJ‡iC‡i<‡i5‡i.‡i'‡i ‡i‡i‡i ‡i‡iý†iö†iï†iè†iá†iÚ†iÓ†ĭiņi¾†i·†i°†i©†i¢†i›†i”†i†i††i†ix†iq†ij†ic†i\†iU†iN†iG†i@†i9†i2†i+†i$†i†i†i†i†i†iú…ió…iì…iå…iÞ…i×…iÐ…iÉ…iÂ…i»…i´…i­…i¦…iŸ…i˜…i‘…iŠ…iƒ…i|…iu…in…ig…i`…iY…iR…iK…iD…i=…i6…i/…i(…i!…i…i…i …i…iþ„i÷„ið„ié„iâ„iÛ„iÔ„iÍ„iÆ„i¿„i¸„i±„iª„i£„iœ„i•„iŽ„i‡„i€„iy„ir„ik„id„i]„iV„iO„iH„iA„i:„i3„i,„i%„i„i„i„i „i„iûƒiôƒiíƒiæƒi߃i؃iуiʃiÃi¼ƒiµƒi®ƒi§ƒi ƒi™ƒi’ƒi‹ƒi„ƒi}ƒivƒioƒihƒiaƒiZƒiSƒiLƒiEƒi>ƒi7ƒi0ƒi)ƒi"ƒiƒiƒi ƒiƒiÿ‚iø‚iñ‚iê‚iã‚iÜ‚iÕ‚i΂iÇ‚iÀ‚i¹‚i²‚i«‚i¤‚i‚i–‚i‚iˆ‚i‚iz‚is‚il‚ie‚i^‚iW‚iP‚iI‚iB‚i;‚i4‚i-‚i&‚i‚i‚i‚i ‚i‚iüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiù€iò€ië€iä€iÝ€iÖ€iÏ€iÈ€iÁ€iº€i³€i¬€i¥€iž€i—€i€i‰€i‚€i{€it€im€if€i_€iX€iQ€iJ€iC€i<€i5€i.€i'€i €i€i€i €i€iýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiú~ió~iì~iå~iÞ~i×~iÐ~iÉ~iÂ~i»~i´~i­~i¦~iŸ~i˜~i‘~iŠ~iƒ~i|~iu~in~ig~i`~iY~iR~iK~iD~i=~i6~i/~i(~i!~i~i~i ~i~iþ}i÷}ið}ié}iâ}iÛ}iÔ}iÍ}iÆ}i¿}i¸}i±}iª}i£}iœ}i•}iŽ}i‡}i€}iy}ir}ik}id}i]}iV}iO}iH}iA}i:}i3}i,}i%}i}i}i}i }i}iû|iô|ií|iæ|iß|iØ|iÑ|iÊ|iÃ|i¼|iµ|i®|i§|i |i™|i’|i‹|i„|i}|iv|io|ih|ia|iZ|iS|iL|iE|i>|i7|i0|i)|i"|i|i|i |i|iÿ{iø{iñ{iê{iã{iÜ{iÕ{iÎ{iÇ{iÀ{i¹{i²{i«{i¤{i{i–{i{iˆ{i{iz{is{il{ie{i^{iW{iP{iI{iB{i;{i4{i-{i&{i{i{i{i {i{iüziõziîziçziàziÙziÒziËziÄzi½zi¶zi¯zi¨zi¡zišzi“ziŒzi…zi~ziwzipziizibzi[ziTziMziFzi?zi8zi1zi*zi#ziziziziziziùyiòyiëyiäyiÝyiÖyiÏyiÈyiÁyiºyi³yi¬yi¥yižyi—yiyi‰yi‚yi{yityimyifyi_yiXyiQyiJyiCyiui7ui0ui)ui"uiuiui uiuiÿtiøtiñtiêtiãtiÜtiÕtiÎtiÇtiÀti¹ti²ti«ti¤titi–titiˆtitiztistiltieti^tiWtiPtiItiBti;ti4ti-ti&titititi titiüsiõsiîsiçsiàsiÙsiÒsiËsiÄsi½si¶si¯si¨si¡sišsi“siŒsi…si~siwsipsiisibsi[siTsiMsiFsi?si8si1si*si#sisisisisisiùriòriëriäriÝriÖriÏriÈriÁriºri³ri¬ri¥rižri—riri‰ri‚ri{ritrimrifri_riXriQriJriCrini7ni0ni)ni"ninini niniÿmiømiñmiêmiãmiÜmiÕmiÎmiÇmiÀmi¹mi²mi«mi¤mimi–mimiˆmimizmismilmiemi^miWmiPmiImiBmi;mi4mi-mi&mimimimi mimiüliõliîliçliàliÙliÒliËliÄli½li¶li¯li¨li¡lišli“liŒli…li~liwlipliilibli[liTliMliFli?li8li1li*li#lilililililiùkiòkiëkiäkiÝkiÖkiÏkiÈkiÁkiºki³ki¬ki¥kižki—kiki‰ki‚ki{kitkimkifki_kiXkiQkiJkiCkigi7gi0gi)gi"gigigi gigiÿfiøfiñfiêfiãfiÜfiÕfiÎfiÇfiÀfi¹fi²fi«fi¤fifi–fifiˆfifizfisfilfiefi^fiWfiPfiIfiBfi;fi4fi-fi&fifififi fifiüeiõeiîeiçeiàeiÙeiÒeiËeiÄei½ei¶ei¯ei¨ei¡eišei“eiŒei…ei~eiweipeiieibei[eiTeiMeiFei?ei8ei1ei*ei#eieieieieieiùdiòdiëdiädiÝdiÖdiÏdiÈdiÁdiºdi³di¬di¥diždi—didi‰di‚di{ditdimdifdi_diXdiQdiJdiCdi`i7`i0`i)`i"`i`i`i `i`iÿ_iø_iñ_iê_iã_iÜ_iÕ_iÎ_iÇ_iÀ_i¹_i²_i«_i¤_i_i–_i_iˆ_i_iz_is_il_ie_i^_iW_iP_iI_iB_i;_i4_i-_i&_i_i_i_i _i_iü^iõ^iî^iç^ià^iÙ^iÒ^iË^iÄ^i½^i¶^i¯^i¨^i¡^iš^i“^iŒ^i…^i~^iw^ip^ii^ib^i[^iT^iM^iF^i?^i8^i1^i*^i#^i^i^i^i^i^iù]iò]ië]iä]iÝ]iÖ]iÏ]iÈ]iÁ]iº]i³]i¬]i¥]iž]i—]i]i‰]i‚]i{]it]im]if]i_]iX]iQ]iJ]iC]i<]i5]i.]i']i ]i]i]i ]i]iý\iö\iï\iè\iá\iÚ\iÓ\iÌ\iÅ\i¾\i·\i°\i©\i¢\i›\i”\i\i†\i\ix\iq\ij\ic\i\\iU\iN\iG\i@\i9\i2\i+\i$\i\i\i\i\i\iú[ió[iì[iå[iÞ[i×[iÐ[iÉ[iÂ[i»[i´[i­[i¦[iŸ[i˜[i‘[iŠ[iƒ[i|[iu[in[ig[i`[iY[iR[iK[iD[i=[i6[i/[i([i![i[i[i [i[iþZi÷ZiðZiéZiâZiÛZiÔZiÍZiÆZi¿Zi¸Zi±ZiªZi£ZiœZi•ZiŽZi‡Zi€ZiyZirZikZidZi]ZiVZiOZiHZiAZi:Zi3Zi,Zi%ZiZiZiZi ZiZiûYiôYiíYiæYißYiØYiÑYiÊYiÃYi¼YiµYi®Yi§Yi Yi™Yi’Yi‹Yi„Yi}YivYioYihYiaYiZYiSYiLYiEYi>Yi7Yi0Yi)Yi"YiYiYi YiYiÿXiøXiñXiêXiãXiÜXiÕXiÎXiÇXiÀXi¹Xi²Xi«Xi¤XiXi–XiXiˆXiXizXisXilXieXi^XiWXiPXiIXiBXi;Xi4Xi-Xi&XiXiXiXi XiXiüWiõWiîWiçWiàWiÙWiÒWiËWiÄWi½Wi¶Wi¯Wi¨Wi¡WišWi“WiŒWi…Wi~WiwWipWiiWibWi[WiTWiMWiFWi?Wi8Wi1Wi*Wi#WiWiWiWiWiWiùViòViëViäViÝViÖViÏViÈViÁViºVi³Vi¬Vi¥VižVi—ViVi‰Vi‚Vi{VitVimVifVi_ViXViQViJViCViRi7Ri0Ri)Ri"RiRiRi RiRiÿQiøQiñQiêQiãQiÜQiÕQiÎQiÇQiÀQi¹Qi²Qi«Qi¤QiQi–QiQiˆQiQizQisQilQieQi^QiWQiPQiIQiBQi;Qi4Qi-Qi&QiQiQiQi QiQiüPiõPiîPiçPiàPiÙPiÒPiËPiÄPi½Pi¶Pi¯Pi¨Pi¡PišPi“PiŒPi…Pi~PiwPipPiiPibPi[PiTPiMPiFPi?Pi8Pi1Pi*Pi#PiPiPiPiPiPiùOiòOiëOiäOiÝOiÖOiÏOiÈOiÁOiºOi³Oi¬Oi¥OižOi—OiOi‰Oi‚Oi{OitOimOifOi_OiXOiQOiJOiCOiKi7Ki0Ki)Ki"KiKiKi KiKiÿJiøJiñJiêJiãJiÜJiÕJiÎJiÇJiÀJi¹Ji²Ji«Ji¤JiJi–JiJiˆJiJizJisJilJieJi^JiWJiPJiIJiBJi;Ji4Ji-Ji&JiJiJiJi JiJiüIiõIiîIiçIiàIiÙIiÒIiËIiÄIi½Ii¶Ii¯Ii¨Ii¡IišIi“IiŒIi…Ii~IiwIipIiiIibIi[IiTIiMIiFIi?Ii8Ii1Ii*Ii#IiIiIiIiIiIiùHiòHiëHiäHiÝHiÖHiÏHiÈHiÁHiºHi³Hi¬Hi¥HižHi—HiHi‰Hi‚Hi{HitHimHifHi_HiXHiQHiJHiCHiDi7Di0Di)Di"DiDiDi DiDiÿCiøCiñCiêCiãCiÜCiÕCiÎCiÇCiÀCi¹Ci²Ci«Ci¤CiCi–CiCiˆCiCizCisCilCieCi^CiWCiPCiICiBCi;Ci4Ci-Ci&CiCiCiCi CiCiüBiõBiîBiçBiàBiÙBiÒBiËBiÄBi½Bi¶Bi¯Bi¨Bi¡BišBi“BiŒBi…Bi~BiwBipBiiBibBi[BiTBiMBiFBi?Bi8Bi1Bi*Bi#BiBiBiBiBiBiùAiòAiëAiäAiÝAiÖAiÏAiÈAiÁAiºAi³Ai¬Ai¥AižAi—AiAi‰Ai‚Ai{AitAimAifAi_AiXAiQAiJAiCAii÷>ið>ié>iâ>iÛ>iÔ>iÍ>iÆ>i¿>i¸>i±>iª>i£>iœ>i•>iŽ>i‡>i€>iy>ir>ik>id>i]>iV>iO>iH>iA>i:>i3>i,>i%>i>i>i>i >i>iû=iô=ií=iæ=iß=iØ=iÑ=iÊ=iÃ=i¼=iµ=i®=i§=i =i™=i’=i‹=i„=i}=iv=io=ih=ia=iZ=iS=iL=iE=i>=i7=i0=i)=i"=i=i=i =i=iÿ6i76i06i)6i"6i6i6i 6i6iÿ5iø5iñ5iê5iã5iÜ5iÕ5iÎ5iÇ5iÀ5i¹5i²5i«5i¤5i5i–5i5iˆ5i5iz5is5il5ie5i^5iW5iP5iI5iB5i;5i45i-5i&5i5i5i5i 5i5iü4iõ4iî4iç4ià4iÙ4iÒ4iË4iÄ4i½4i¶4i¯4i¨4i¡4iš4i“4iŒ4i…4i~4iw4ip4ii4ib4i[4iT4iM4iF4i?4i84i14i*4i#4i4i4i4i4i4iù3iò3ië3iä3iÝ3iÖ3iÏ3iÈ3iÁ3iº3i³3i¬3i¥3iž3i—3i3i‰3i‚3i{3it3im3if3i_3iX3iQ3iJ3iC3i<3i53i.3i'3i 3i3i3i 3i3iý2iö2iï2iè2iá2iÚ2iÓ2iÌ2iÅ2i¾2i·2i°2i©2i¢2i›2i”2i2i†2i2ix2iq2ij2ic2i\2iU2iN2iG2i@2i92i22i+2i$2i2i2i2i2i2iú1ió1iì1iå1iÞ1i×1iÐ1iÉ1iÂ1i»1i´1i­1i¦1iŸ1i˜1i‘1iŠ1iƒ1i|1iu1in1ig1i`1iY1iR1iK1iD1i=1i61i/1i(1i!1i1i1i 1i1iþ0i÷0ið0ié0iâ0iÛ0iÔ0iÍ0iÆ0i¿0i¸0i±0iª0i£0iœ0i•0iŽ0i‡0i€0iy0ir0ik0id0i]0iV0iO0iH0iA0i:0i30i,0i%0i0i0i0i 0i0iû/iô/ií/iæ/iß/iØ/iÑ/iÊ/iÃ/i¼/iµ/i®/i§/i /i™/i’/i‹/i„/i}/iv/io/ih/ia/iZ/iS/iL/iE/i>/i7/i0/i)/i"/i/i/i /i/iÿ.iø.iñ.iê.iã.iÜ.iÕ.iÎ.iÇ.iÀ.i¹.i².i«.i¤.i.i–.i.iˆ.i.iz.is.il.ie.i^.iW.iP.iI.iB.i;.i4.i-.i&.i.i.i.i .i.iü-iõ-iî-iç-ià-iÙ-iÒ-iË-iÄ-i½-i¶-i¯-i¨-i¡-iš-i“-iŒ-i…-i~-iw-ip-ii-ib-i[-iT-iM-iF-i?-i8-i1-i*-i#-i-i-i-i-i-iù,iò,ië,iä,iÝ,iÖ,iÏ,iÈ,iÁ,iº,i³,i¬,i¥,iž,i—,i,i‰,i‚,i{,it,im,if,i_,iX,iQ,iJ,iC,i<,i5,i.,i',i ,i,i,i ,i,iý+iö+iï+iè+iá+iÚ+iÓ+iÌ+iÅ+i¾+i·+i°+i©+i¢+i›+i”+i+i†+i+ix+iq+ij+ic+i\+iU+iN+iG+i@+i9+i2+i++i$+i+i+i+i+i+iú*ió*iì*iå*iÞ*i×*iÐ*iÉ*iÂ*i»*i´*i­*i¦*iŸ*i˜*i‘*iŠ*iƒ*i|*iu*in*ig*i`*iY*iR*iK*iD*i=*i6*i/*i(*i!*i*i*i *i*iþ)i÷)ið)ié)iâ)iÛ)iÔ)iÍ)iÆ)i¿)i¸)i±)iª)i£)iœ)i•)iŽ)i‡)i€)iy)ir)ik)id)i])iV)iO)iH)iA)i:)i3)i,)i%)i)i)i)i )i)iû(iô(ií(iæ(iß(iØ(iÑ(iÊ(iÃ(i¼(iµ(i®(i§(i (i™(i’(i‹(i„(i}(iv(io(ih(ia(iZ(iS(iL(iE(i>(i7(i0(i)(i"(i(i(i (i(iÿ'iø'iñ'iê'iã'iÜ'iÕ'iÎ'iÇ'iÀ'i¹'i²'i«'i¤'i'i–'i'iˆ'i'iz'is'il'ie'i^'iW'iP'iI'iB'i;'i4'i-'i&'i'i'i'i 'i'iü&iõ&iî&iç&ià&iÙ&iÒ&iË&iÄ&i½&i¶&i¯&i¨&i¡&iš&i“&iŒ&i…&i~&iw&ip&ii&ib&i[&iT&iM&iF&i?&i8&i1&i*&i#&i&i&i&i&i&iù%iò%ië%iä%iÝ%iÖ%iÏ%iÈ%iÁ%iº%i³%i¬%i¥%iž%i—%i%i‰%i‚%i{%it%im%if%i_%iX%iQ%iJ%iC%i<%i5%i.%i'%i %i%i%i %i%iý$iö$iï$iè$iá$iÚ$iÓ$iÌ$iÅ$i¾$i·$i°$i©$i¢$i›$i”$i$i†$i$ix$iq$ij$ic$i\$iU$iN$iG$i@$i9$i2$i+$i$$i$i$i$i$i$iú#ió#iì#iå#iÞ#i×#iÐ#iÉ#iÂ#i»#i´#i­#i¦#iŸ#i˜#i‘#iŠ#iƒ#i|#iu#in#ig#i`#iY#iR#iK#iD#i=#i6#i/#i(#i!#i#i#i #i#iþ"i÷"ið"ié"iâ"iÛ"iÔ"iÍ"iÆ"i¿"i¸"i±"iª"i£"iœ"i•"iŽ"i‡"i€"iy"ir"ik"id"i]"iV"iO"iH"iA"i:"i3"i,"i%"i"i"i"i "i"iû!iô!ií!iæ!iß!iØ!iÑ!iÊ!iÃ!i¼!iµ!i®!i§!i !i™!i’!i‹!i„!i}!iv!io!ih!ia!iZ!iS!iL!iE!i>!i7!i0!i)!i"!i!i!i !i!iÿ iø iñ iê iã iÜ iÕ iÎ iÇ iÀ i¹ i² i« i¤ i i– i iˆ i iz is il ie i^ iW iP iI iB i; i4 i- i& i i i i i iüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCi<i5i.i'i iii iiýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúióiìiåiÞi×iÐiÉiÂi»i´i­i¦iŸi˜i‘iŠiƒi|iuinigi`iYiRiKiDi=i6i/i(i!iii iiþi÷iðiéiâiÛiÔiÍiÆi¿i¸i±iªi£iœi•iŽi‡i€iyirikidi]iViOiHiAi:i3i,i%iiii iiûiôiíiæißiØiÑiÊiÃi¼iµi®i§i i™i’i‹i„i}ivioihiaiZiSiLiEi>i7i0i)i"iii iiÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCi<i5i.i'i iii iiýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúióiìiåiÞi×iÐiÉiÂi»i´i­i¦iŸi˜i‘iŠiƒi|iuinigi`iYiRiKiDi=i6i/i(i!iii iiþi÷iðiéiâiÛiÔiÍiÆi¿i¸i±iªi£iœi•iŽi‡i€iyirikidi]iViOiHiAi:i3i,i%iiii iiûiôiíiæißiØiÑiÊiÃi¼iµi®i§i i™i’i‹i„i}ivioihiaiZiSiLiEi>i7i0i)i"iii iiÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCi<i5i.i'i iii iiýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúióiìiåiÞi×iÐiÉiÂi»i´i­i¦iŸi˜i‘iŠiƒi|iuinigi`iYiRiKiDi=i6i/i(i!iii iiþ i÷ ið ié iâ iÛ iÔ iÍ iÆ i¿ i¸ i± iª i£ iœ i• iŽ i‡ i€ iy ir ik id i] iV iO iH iA i: i3 i, i% i i i i i iû iô ií iæ iß iØ iÑ iÊ ià i¼ iµ i® i§ i  i™ i’ i‹ i„ i} iv io ih ia iZ iS iL iE i> i7 i0 i) i" i i i i iÿ iø iñ iê iã iÜ iÕ iÎ iÇ iÀ i¹ i² i« i¤ i i– i iˆ i iz is il ie i^ iW iP iI iB i; i4 i- i& i i i i i iü iõ iî iç ià iÙ iÒ iË iÄ i½ i¶ i¯ i¨ i¡ iš i“ iŒ i… i~ iw ip ii ib i[ iT iM iF i? i8 i1 i* i# i i i i i iù iò ië iä iÝ iÖ iÏ iÈ iÁ iº i³ i¬ i¥ iž i— i i‰ i‚ i{ it im if i_ iX iQ iJ iC i< i5 i. i' i i i i i iýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúióiìiåiÞi×iÐiÉiÂi»i´i­i¦iŸi˜i‘iŠiƒi|iuinigi`iYiRiKiDi=i6i/i(i!iii iiþi÷iðiéiâiÛiÔiÍiÆi¿i¸i±iªi£iœi•iŽi‡i€iyirikidi]iViOiHiAi:i3i,i%iiii iiûiôiíiæißiØiÑiÊiÃi¼iµi®i§i i™i’i‹i„i}ivioihiaiZiSiLiEi>i7i0i)i"iii iiÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCi<i5i.i'i iii iiýiöiïièiáiÚiÓiÌiÅi¾i·i°i©i¢i›i”ii†iixiqijici\iUiNiGi@i9i2i+i$iiiiiiúióiìiåiÞi×iÐiÉiÂi»i´i­i¦iŸi˜i‘iŠiƒi|iuinigi`iYiRiKiDi=i6i/i(i!iii iiþÿh÷ÿhðÿhéÿhâÿhÛÿhÔÿhÍÿhÆÿh¿ÿh¸ÿh±ÿhªÿh£ÿhœÿh•ÿhŽÿh‡ÿh€ÿhyÿhrÿhkÿhdÿh]ÿhVÿhOÿhHÿhAÿh:ÿh3ÿh,ÿh%ÿhÿhÿhÿh ÿhÿhûþhôþhíþhæþhßþhØþhÑþhÊþhÃþh¼þhµþh®þh§þh þh™þh’þh‹þh„þh}þhvþhoþhhþhaþhZþhSþhLþhEþh>þh7þh0þh)þh"þhþhþh þhþhÿýhøýhñýhêýhãýhÜýhÕýhÎýhÇýhÀýh¹ýh²ýh«ýh¤ýhýh–ýhýhˆýhýhzýhsýhlýheýh^ýhWýhPýhIýhBýh;ýh4ýh-ýh&ýhýhýhýh ýhýhüühõühîühçühàühÙühÒühËühÄüh½üh¶üh¯üh¨üh¡ühšüh“ühŒüh…üh~ühwühpühiühbüh[ühTühMühFüh?üh8üh1üh*üh#ühühühühühühùûhòûhëûhäûhÝûhÖûhÏûhÈûhÁûhºûh³ûh¬ûh¥ûhžûh—ûhûh‰ûh‚ûh{ûhtûhmûhfûh_ûhXûhQûhJûhCûh<ûh5ûh.ûh'ûh ûhûhûh ûhûhýúhöúhïúhèúháúhÚúhÓúhÌúhÅúh¾úh·úh°úh©úh¢úh›úh”úhúh†úhúhxúhqúhjúhcúh\úhUúhNúhGúh@úh9úh2úh+úh$úhúhúhúhúhúhúùhóùhìùhåùhÞùh×ùhÐùhÉùhÂùh»ùh´ùh­ùh¦ùhŸùh˜ùh‘ùhŠùhƒùh|ùhuùhnùhgùh`ùhYùhRùhKùhDùh=ùh6ùh/ùh(ùh!ùhùhùh ùhùhþøh÷øhðøhéøhâøhÛøhÔøhÍøhÆøh¿øh¸øh±øhªøh£øhœøh•øhŽøh‡øh€øhyøhrøhkøhdøh]øhVøhOøhHøhAøh:øh3øh,øh%øhøhøhøh øhøhû÷hô÷hí÷hæ÷hß÷hØ÷hÑ÷hÊ÷hÃ÷h¼÷hµ÷h®÷h§÷h ÷h™÷h’÷h‹÷h„÷h}÷hv÷ho÷hh÷ha÷hZ÷hS÷hL÷hE÷h>÷h7÷h0÷h)÷h"÷h÷h÷h ÷h÷hÿöhøöhñöhêöhãöhÜöhÕöhÎöhÇöhÀöh¹öh²öh«öh¤öhöh–öhöhˆöhöhzöhsöhlöheöh^öhWöhPöhIöhBöh;öh4öh-öh&öhöhöhöh öhöhüõhõõhîõhçõhàõhÙõhÒõhËõhÄõh½õh¶õh¯õh¨õh¡õhšõh“õhŒõh…õh~õhwõhpõhiõhbõh[õhTõhMõhFõh?õh8õh1õh*õh#õhõhõhõhõhõhùôhòôhëôhäôhÝôhÖôhÏôhÈôhÁôhºôh³ôh¬ôh¥ôhžôh—ôhôh‰ôh‚ôh{ôhtôhmôhfôh_ôhXôhQôhJôhCôh<ôh5ôh.ôh'ôh ôhôhôh ôhôhýóhöóhïóhèóháóhÚóhÓóhÌóhÅóh¾óh·óh°óh©óh¢óh›óh”óhóh†óhóhxóhqóhjóhcóh\óhUóhNóhGóh@óh9óh2óh+óh$óhóhóhóhóhóhúòhóòhìòhåòhÞòh×òhÐòhÉòhÂòh»òh´òh­òh¦òhŸòh˜òh‘òhŠòhƒòh|òhuòhnòhgòh`òhYòhRòhKòhDòh=òh6òh/òh(òh!òhòhòh òhòhþñh÷ñhðñhéñhâñhÛñhÔñhÍñhÆñh¿ñh¸ñh±ñhªñh£ñhœñh•ñhŽñh‡ñh€ñhyñhrñhkñhdñh]ñhVñhOñhHñhAñh:ñh3ñh,ñh%ñhñhñhñh ñhñhûðhôðhíðhæðhßðhØðhÑðhÊðhÃðh¼ðhµðh®ðh§ðh ðh™ðh’ðh‹ðh„ðh}ðhvðhoðhhðhaðhZðhSðhLðhEðh>ðh7ðh0ðh)ðh"ðhðhðh ðhðhÿïhøïhñïhêïhãïhÜïhÕïhÎïhÇïhÀïh¹ïh²ïh«ïh¤ïhïh–ïhïhˆïhïhzïhsïhlïheïh^ïhWïhPïhIïhBïh;ïh4ïh-ïh&ïhïhïhïh ïhïhüîhõîhîîhçîhàîhÙîhÒîhËîhÄîh½îh¶îh¯îh¨îh¡îhšîh“îhŒîh…îh~îhwîhpîhiîhbîh[îhTîhMîhFîh?îh8îh1îh*îh#îhîhîhîhîhîhùíhòíhëíhäíhÝíhÖíhÏíhÈíhÁíhºíh³íh¬íh¥íhžíh—íhíh‰íh‚íh{íhtíhmíhfíh_íhXíhQíhJíhCíh<íh5íh.íh'íh íhíhíh íhíhýìhöìhïìhèìháìhÚìhÓìhÌìhÅìh¾ìh·ìh°ìh©ìh¢ìh›ìh”ìhìh†ìhìhxìhqìhjìhcìh\ìhUìhNìhGìh@ìh9ìh2ìh+ìh$ìhìhìhìhìhìhúëhóëhìëhåëhÞëh×ëhÐëhÉëhÂëh»ëh´ëh­ëh¦ëhŸëh˜ëh‘ëhŠëhƒëh|ëhuëhnëhgëh`ëhYëhRëhKëhDëh=ëh6ëh/ëh(ëh!ëhëhëh ëhëhþêh÷êhðêhéêhâêhÛêhÔêhÍêhÆêh¿êh¸êh±êhªêh£êhœêh•êhŽêh‡êh€êhyêhrêhkêhdêh]êhVêhOêhHêhAêh:êh3êh,êh%êhêhêhêh êhêhûéhôéhíéhæéhßéhØéhÑéhÊéhÃéh¼éhµéh®éh§éh éh™éh’éh‹éh„éh}éhvéhoéhhéhaéhZéhSéhLéhEéh>éh7éh0éh)éh"éhéhéh éhéhÿèhøèhñèhêèhãèhÜèhÕèhÎèhÇèhÀèh¹èh²èh«èh¤èhèh–èhèhˆèhèhzèhsèhlèheèh^èhWèhPèhIèhBèh;èh4èh-èh&èhèhèhèh èhèhüçhõçhîçhççhàçhÙçhÒçhËçhÄçh½çh¶çh¯çh¨çh¡çhšçh“çhŒçh…çh~çhwçhpçhiçhbçh[çhTçhMçhFçh?çh8çh1çh*çh#çhçhçhçhçhçhùæhòæhëæhäæhÝæhÖæhÏæhÈæhÁæhºæh³æh¬æh¥æhžæh—æhæh‰æh‚æh{æhtæhmæhfæh_æhXæhQæhJæhCæh<æh5æh.æh'æh æhæhæh æhæhýåhöåhïåhèåháåhÚåhÓåhÌåhÅåh¾åh·åh°åh©åh¢åh›åh”åhåh†åhåhxåhqåhjåhcåh\åhUåhNåhGåh@åh9åh2åh+åh$åhåhåhåhåhåhúähóähìähåähÞäh×ähÐähÉähÂäh»äh´äh­äh¦ähŸäh˜äh‘ähŠähƒäh|ähuähnähgäh`ähYähRähKähDäh=äh6äh/äh(äh!ähähäh ähähþãh÷ãhðãhéãhâãhÛãhÔãhÍãhÆãh¿ãh¸ãh±ãhªãh£ãhœãh•ãhŽãh‡ãh€ãhyãhrãhkãhdãh]ãhVãhOãhHãhAãh:ãh3ãh,ãh%ãhãhãhãh ãhãhûâhôâhíâhæâhßâhØâhÑâhÊâhÃâh¼âhµâh®âh§âh âh™âh’âh‹âh„âh}âhvâhoâhhâhaâhZâhSâhLâhEâh>âh7âh0âh)âh"âhâhâh âhâhÿáhøáhñáhêáhãáhÜáhÕáhÎáhÇáhÀáh¹áh²áh«áh¤áháh–áháhˆáháhzáhsáhláheáh^áhWáhPáhIáhBáh;áh4áh-áh&áháháháh áháhüàhõàhîàhçàhààhÙàhÒàhËàhÄàh½àh¶àh¯àh¨àh¡àhšàh“àhŒàh…àh~àhwàhpàhiàhbàh[àhTàhMàhFàh?àh8àh1àh*àh#àhàhàhàhàhàhùßhòßhëßhäßhÝßhÖßhÏßhÈßhÁßhºßh³ßh¬ßh¥ßhžßh—ßhßh‰ßh‚ßh{ßhtßhmßhfßh_ßhXßhQßhJßhCßh<ßh5ßh.ßh'ßh ßhßhßh ßhßhýÞhöÞhïÞhèÞháÞhÚÞhÓÞhÌÞhÅÞh¾Þh·Þh°Þh©Þh¢Þh›Þh”ÞhÞh†ÞhÞhxÞhqÞhjÞhcÞh\ÞhUÞhNÞhGÞh@Þh9Þh2Þh+Þh$ÞhÞhÞhÞhÞhÞhúÝhóÝhìÝhåÝhÞÝh×ÝhÐÝhÉÝhÂÝh»Ýh´Ýh­Ýh¦ÝhŸÝh˜Ýh‘ÝhŠÝhƒÝh|ÝhuÝhnÝhgÝh`ÝhYÝhRÝhKÝhDÝh=Ýh6Ýh/Ýh(Ýh!ÝhÝhÝh ÝhÝhþÜh÷ÜhðÜhéÜhâÜhÛÜhÔÜhÍÜhÆÜh¿Üh¸Üh±ÜhªÜh£ÜhœÜh•ÜhŽÜh‡Üh€ÜhyÜhrÜhkÜhdÜh]ÜhVÜhOÜhHÜhAÜh:Üh3Üh,Üh%ÜhÜhÜhÜh ÜhÜhûÛhôÛhíÛhæÛhßÛhØÛhÑÛhÊÛhÃÛh¼ÛhµÛh®Ûh§Ûh Ûh™Ûh’Ûh‹Ûh„Ûh}ÛhvÛhoÛhhÛhaÛhZÛhSÛhLÛhEÛh>Ûh7Ûh0Ûh)Ûh"ÛhÛhÛh ÛhÛhÿÚhøÚhñÚhêÚhãÚhÜÚhÕÚhÎÚhÇÚhÀÚh¹Úh²Úh«Úh¤ÚhÚh–ÚhÚhˆÚhÚhzÚhsÚhlÚheÚh^ÚhWÚhPÚhIÚhBÚh;Úh4Úh-Úh&ÚhÚhÚhÚh ÚhÚhüÙhõÙhîÙhçÙhàÙhÙÙhÒÙhËÙhÄÙh½Ùh¶Ùh¯Ùh¨Ùh¡ÙhšÙh“ÙhŒÙh…Ùh~ÙhwÙhpÙhiÙhbÙh[ÙhTÙhMÙhFÙh?Ùh8Ùh1Ùh*Ùh#ÙhÙhÙhÙhÙhÙhùØhòØhëØhäØhÝØhÖØhÏØhÈØhÁØhºØh³Øh¬Øh¥ØhžØh—ØhØh‰Øh‚Øh{ØhtØhmØhfØh_ØhXØhQØhJØhCØh<Øh5Øh.Øh'Øh ØhØhØh ØhØhý×hö×hï×hè×há×hÚ×hÓ×hÌ×hÅ×h¾×h·×h°×h©×h¢×h›×h”×h×h†×h×hx×hq×hj×hc×h\×hU×hN×hG×h@×h9×h2×h+×h$×h×h×h×h×h×húÖhóÖhìÖhåÖhÞÖh×ÖhÐÖhÉÖhÂÖh»Öh´Öh­Öh¦ÖhŸÖh˜Öh‘ÖhŠÖhƒÖh|ÖhuÖhnÖhgÖh`ÖhYÖhRÖhKÖhDÖh=Öh6Öh/Öh(Öh!ÖhÖhÖh ÖhÖhþÕh÷ÕhðÕhéÕhâÕhÛÕhÔÕhÍÕhÆÕh¿Õh¸Õh±ÕhªÕh£ÕhœÕh•ÕhŽÕh‡Õh€ÕhyÕhrÕhkÕhdÕh]ÕhVÕhOÕhHÕhAÕh:Õh3Õh,Õh%ÕhÕhÕhÕh ÕhÕhûÔhôÔhíÔhæÔhßÔhØÔhÑÔhÊÔhÃÔh¼ÔhµÔh®Ôh§Ôh Ôh™Ôh’Ôh‹Ôh„Ôh}ÔhvÔhoÔhhÔhaÔhZÔhSÔhLÔhEÔh>Ôh7Ôh0Ôh)Ôh"ÔhÔhÔh ÔhÔhÿÓhøÓhñÓhêÓhãÓhÜÓhÕÓhÎÓhÇÓhÀÓh¹Óh²Óh«Óh¤ÓhÓh–ÓhÓhˆÓhÓhzÓhsÓhlÓheÓh^ÓhWÓhPÓhIÓhBÓh;Óh4Óh-Óh&ÓhÓhÓhÓh ÓhÓhüÒhõÒhîÒhçÒhàÒhÙÒhÒÒhËÒhÄÒh½Òh¶Òh¯Òh¨Òh¡ÒhšÒh“ÒhŒÒh…Òh~ÒhwÒhpÒhiÒhbÒh[ÒhTÒhMÒhFÒh?Òh8Òh1Òh*Òh#ÒhÒhÒhÒhÒhÒhùÑhòÑhëÑhäÑhÝÑhÖÑhÏÑhÈÑhÁÑhºÑh³Ñh¬Ñh¥ÑhžÑh—ÑhÑh‰Ñh‚Ñh{ÑhtÑhmÑhfÑh_ÑhXÑhQÑhJÑhCÑh<Ñh5Ñh.Ñh'Ñh ÑhÑhÑh ÑhÑhýÐhöÐhïÐhèÐháÐhÚÐhÓÐhÌÐhÅÐh¾Ðh·Ðh°Ðh©Ðh¢Ðh›Ðh”ÐhÐh†ÐhÐhxÐhqÐhjÐhcÐh\ÐhUÐhNÐhGÐh@Ðh9Ðh2Ðh+Ðh$ÐhÐhÐhÐhÐhÐhúÏhóÏhìÏhåÏhÞÏh×ÏhÐÏhÉÏhÂÏh»Ïh´Ïh­Ïh¦ÏhŸÏh˜Ïh‘ÏhŠÏhƒÏh|ÏhuÏhnÏhgÏh`ÏhYÏhRÏhKÏhDÏh=Ïh6Ïh/Ïh(Ïh!ÏhÏhÏh ÏhÏhþÎh÷ÎhðÎhéÎhâÎhÛÎhÔÎhÍÎhÆÎh¿Îh¸Îh±ÎhªÎh£ÎhœÎh•ÎhŽÎh‡Îh€ÎhyÎhrÎhkÎhdÎh]ÎhVÎhOÎhHÎhAÎh:Îh3Îh,Îh%ÎhÎhÎhÎh ÎhÎhûÍhôÍhíÍhæÍhßÍhØÍhÑÍhÊÍhÃÍh¼ÍhµÍh®Íh§Íh Íh™Íh’Íh‹Íh„Íh}ÍhvÍhoÍhhÍhaÍhZÍhSÍhLÍhEÍh>Íh7Íh0Íh)Íh"ÍhÍhÍh ÍhÍhÿÌhøÌhñÌhêÌhãÌhÜÌhÕÌhÎÌhÇÌhÀÌh¹Ìh²Ìh«Ìh¤ÌhÌh–ÌhÌhˆÌhÌhzÌhsÌhlÌheÌh^ÌhWÌhPÌhIÌhBÌh;Ìh4Ìh-Ìh&ÌhÌhÌhÌh ÌhÌhüËhõËhîËhçËhàËhÙËhÒËhËËhÄËh½Ëh¶Ëh¯Ëh¨Ëh¡ËhšËh“ËhŒËh…Ëh~ËhwËhpËhiËhbËh[ËhTËhMËhFËh?Ëh8Ëh1Ëh*Ëh#ËhËhËhËhËhËhùÊhòÊhëÊhäÊhÝÊhÖÊhÏÊhÈÊhÁÊhºÊh³Êh¬Êh¥ÊhžÊh—ÊhÊh‰Êh‚Êh{ÊhtÊhmÊhfÊh_ÊhXÊhQÊhJÊhCÊh<Êh5Êh.Êh'Êh ÊhÊhÊh ÊhÊhýÉhöÉhïÉhèÉháÉhÚÉhÓÉhÌÉhÅÉh¾Éh·Éh°Éh©Éh¢Éh›Éh”ÉhÉh†ÉhÉhxÉhqÉhjÉhcÉh\ÉhUÉhNÉhGÉh@Éh9Éh2Éh+Éh$ÉhÉhÉhÉhÉhÉhúÈhóÈhìÈhåÈhÞÈh×ÈhÐÈhÉÈhÂÈh»Èh´Èh­Èh¦ÈhŸÈh˜Èh‘ÈhŠÈhƒÈh|ÈhuÈhnÈhgÈh`ÈhYÈhRÈhKÈhDÈh=Èh6Èh/Èh(Èh!ÈhÈhÈh ÈhÈhþÇh÷ÇhðÇhéÇhâÇhÛÇhÔÇhÍÇhÆÇh¿Çh¸Çh±ÇhªÇh£ÇhœÇh•ÇhŽÇh‡Çh€ÇhyÇhrÇhkÇhdÇh]ÇhVÇhOÇhHÇhAÇh:Çh3Çh,Çh%ÇhÇhÇhÇh ÇhÇhûÆhôÆhíÆhæÆh߯hØÆhÑÆhÊÆhÃÆh¼ÆhµÆh®Æh§Æh Æh™Æh’Æh‹Æh„Æh}ÆhvÆhoÆhhÆhaÆhZÆhSÆhLÆhEÆh>Æh7Æh0Æh)Æh"ÆhÆhÆh ÆhÆhÿÅhøÅhñÅhêÅhãÅhÜÅhÕÅhÎÅhÇÅhÀÅh¹Åh²Åh«Åh¤ÅhÅh–ÅhÅhˆÅhÅhzÅhsÅhlÅheÅh^ÅhWÅhPÅhIÅhBÅh;Åh4Åh-Åh&ÅhÅhÅhÅh ÅhÅhüÄhõÄhîÄhçÄhàÄhÙÄhÒÄhËÄhÄÄh½Äh¶Äh¯Äh¨Äh¡ÄhšÄh“ÄhŒÄh…Äh~ÄhwÄhpÄhiÄhbÄh[ÄhTÄhMÄhFÄh?Äh8Äh1Äh*Äh#ÄhÄhÄhÄhÄhÄhùÃhòÃhëÃhäÃhÝÃhÖÃhÏÃhÈÃhÁÃhºÃh³Ãh¬Ãh¥ÃhžÃh—ÃhÃh‰Ãh‚Ãh{ÃhtÃhmÃhfÃh_ÃhXÃhQÃhJÃhCÃh<Ãh5Ãh.Ãh'Ãh ÃhÃhÃh ÃhÃhýÂhöÂhïÂhèÂháÂhÚÂhÓÂhÌÂhÅÂh¾Âh·Âh°Âh©Âh¢Âh›Âh”ÂhÂh†ÂhÂhxÂhqÂhjÂhcÂh\ÂhUÂhNÂhGÂh@Âh9Âh2Âh+Âh$ÂhÂhÂhÂhÂhÂhúÁhóÁhìÁhåÁhÞÁh×ÁhÐÁhÉÁhÂÁh»Áh´Áh­Áh¦ÁhŸÁh˜Áh‘ÁhŠÁhƒÁh|ÁhuÁhnÁhgÁh`ÁhYÁhRÁhKÁhDÁh=Áh6Áh/Áh(Áh!ÁhÁhÁh ÁhÁhþÀh÷ÀhðÀhéÀhâÀhÛÀhÔÀhÍÀhÆÀh¿Àh¸Àh±ÀhªÀh£ÀhœÀh•ÀhŽÀh‡Àh€ÀhyÀhrÀhkÀhdÀh]ÀhVÀhOÀhHÀhAÀh:Àh3Àh,Àh%ÀhÀhÀhÀh ÀhÀhû¿hô¿hí¿hæ¿hß¿hØ¿hÑ¿hÊ¿hÿh¼¿hµ¿h®¿h§¿h ¿h™¿h’¿h‹¿h„¿h}¿hv¿ho¿hh¿ha¿hZ¿hS¿hL¿hE¿h>¿h7¿h0¿h)¿h"¿h¿h¿h ¿h¿hÿ¾hø¾hñ¾hê¾hã¾hܾhÕ¾hξhǾhÀ¾h¹¾h²¾h«¾h¤¾h¾h–¾h¾hˆ¾h¾hz¾hs¾hl¾he¾h^¾hW¾hP¾hI¾hB¾h;¾h4¾h-¾h&¾h¾h¾h¾h ¾h¾hü½hõ½hî½hç½hà½hÙ½hÒ½h˽hĽh½½h¶½h¯½h¨½h¡½hš½h“½hŒ½h…½h~½hw½hp½hi½hb½h[½hT½hM½hF½h?½h8½h1½h*½h#½h½h½h½h½h½hù¼hò¼hë¼hä¼hݼhÖ¼hϼhȼhÁ¼hº¼h³¼h¬¼h¥¼hž¼h—¼h¼h‰¼h‚¼h{¼ht¼hm¼hf¼h_¼hX¼hQ¼hJ¼hC¼h<¼h5¼h.¼h'¼h ¼h¼h¼h ¼h¼hý»hö»hï»hè»há»hÚ»hÓ»hÌ»hÅ»h¾»h·»h°»h©»h¢»h›»h”»h»h†»h»hx»hq»hj»hc»h\»hU»hN»hG»h@»h9»h2»h+»h$»h»h»h»h»h»húºhóºhìºhåºhÞºh׺hкhɺhºh»ºh´ºh­ºh¦ºhŸºh˜ºh‘ºhŠºhƒºh|ºhuºhnºhgºh`ºhYºhRºhKºhDºh=ºh6ºh/ºh(ºh!ºhºhºh ºhºhþ¹h÷¹hð¹hé¹hâ¹hÛ¹hÔ¹h͹hƹh¿¹h¸¹h±¹hª¹h£¹hœ¹h•¹h޹h‡¹h€¹hy¹hr¹hk¹hd¹h]¹hV¹hO¹hH¹hA¹h:¹h3¹h,¹h%¹h¹h¹h¹h ¹h¹hû¸hô¸hí¸hæ¸h߸hظhѸhʸhøh¼¸hµ¸h®¸h§¸h ¸h™¸h’¸h‹¸h„¸h}¸hv¸ho¸hh¸ha¸hZ¸hS¸hL¸hE¸h>¸h7¸h0¸h)¸h"¸h¸h¸h ¸h¸hÿ·hø·hñ·hê·hã·hÜ·hÕ·hηhÇ·hÀ·h¹·h²·h«·h¤·h·h–·h·hˆ·h·hz·hs·hl·he·h^·hW·hP·hI·hB·h;·h4·h-·h&·h·h·h·h ·h·hü¶hõ¶hî¶hç¶hà¶hÙ¶hÒ¶h˶hĶh½¶h¶¶h¯¶h¨¶h¡¶hš¶h“¶hŒ¶h…¶h~¶hw¶hp¶hi¶hb¶h[¶hT¶hM¶hF¶h?¶h8¶h1¶h*¶h#¶h¶h¶h¶h¶h¶hùµhòµhëµhäµhݵhÖµhϵhȵhÁµhºµh³µh¬µh¥µhžµh—µhµh‰µh‚µh{µhtµhmµhfµh_µhXµhQµhJµhCµh<µh5µh.µh'µh µhµhµh µhµhý´hö´hï´hè´há´hÚ´hÓ´hÌ´hÅ´h¾´h·´h°´h©´h¢´h›´h”´h´h†´h´hx´hq´hj´hc´h\´hU´hN´hG´h@´h9´h2´h+´h$´h´h´h´h´h´hú³hó³hì³hå³hÞ³h׳hгhɳh³h»³h´³h­³h¦³hŸ³h˜³h‘³hгhƒ³h|³hu³hn³hg³h`³hY³hR³hK³hD³h=³h6³h/³h(³h!³h³h³h ³h³hþ²h÷²hð²hé²hâ²hÛ²hÔ²hͲhƲh¿²h¸²h±²hª²h£²hœ²h•²h޲h‡²h€²hy²hr²hk²hd²h]²hV²hO²hH²hA²h:²h3²h,²h%²h²h²h²h ²h²hû±hô±hí±hæ±hß±hرhѱhʱhñh¼±hµ±h®±h§±h ±h™±h’±h‹±h„±h}±hv±ho±hh±ha±hZ±hS±hL±hE±h>±h7±h0±h)±h"±h±h±h ±h±hÿ°hø°hñ°hê°hã°hܰhÕ°hΰhǰhÀ°h¹°h²°h«°h¤°h°h–°h°hˆ°h°hz°hs°hl°he°h^°hW°hP°hI°hB°h;°h4°h-°h&°h°h°h°h °h°hü¯hõ¯hî¯hç¯hà¯hÙ¯hÒ¯h˯hįh½¯h¶¯h¯¯h¨¯h¡¯hš¯h“¯hŒ¯h…¯h~¯hw¯hp¯hi¯hb¯h[¯hT¯hM¯hF¯h?¯h8¯h1¯h*¯h#¯h¯h¯h¯h¯h¯hù®hò®hë®hä®hÝ®hÖ®hÏ®hÈ®hÁ®hº®h³®h¬®h¥®hž®h—®h®h‰®h‚®h{®ht®hm®hf®h_®hX®hQ®hJ®hC®h<®h5®h.®h'®h ®h®h®h ®h®hý­hö­hï­hè­há­hÚ­hÓ­hÌ­hÅ­h¾­h·­h°­h©­h¢­h›­h”­h­h†­h­hx­hq­hj­hc­h\­hU­hN­hG­h@­h9­h2­h+­h$­h­h­h­h­h­hú¬hó¬hì¬hå¬hÞ¬h׬hЬhɬh¬h»¬h´¬h­¬h¦¬hŸ¬h˜¬h‘¬hЬhƒ¬h|¬hu¬hn¬hg¬h`¬hY¬hR¬hK¬hD¬h=¬h6¬h/¬h(¬h!¬h¬h¬h ¬h¬hþ«h÷«hð«hé«hâ«hÛ«hÔ«hÍ«hÆ«h¿«h¸«h±«hª«h£«hœ«h•«hŽ«h‡«h€«hy«hr«hk«hd«h]«hV«hO«hH«hA«h:«h3«h,«h%«h«h«h«h «h«hûªhôªhíªhæªhߪhتhѪhʪhêh¼ªhµªh®ªh§ªh ªh™ªh’ªh‹ªh„ªh}ªhvªhoªhhªhaªhZªhSªhLªhEªh>ªh7ªh0ªh)ªh"ªhªhªh ªhªhÿ©hø©hñ©hê©hã©hÜ©hÕ©hΩhÇ©hÀ©h¹©h²©h«©h¤©h©h–©h©hˆ©h©hz©hs©hl©he©h^©hW©hP©hI©hB©h;©h4©h-©h&©h©h©h©h ©h©hü¨hõ¨hî¨hç¨hà¨hÙ¨hÒ¨h˨hĨh½¨h¶¨h¯¨h¨¨h¡¨hš¨h“¨hŒ¨h…¨h~¨hw¨hp¨hi¨hb¨h[¨hT¨hM¨hF¨h?¨h8¨h1¨h*¨h#¨h¨h¨h¨h¨h¨hù§hò§hë§hä§hݧhÖ§hϧhȧhÁ§hº§h³§h¬§h¥§hž§h—§h§h‰§h‚§h{§ht§hm§hf§h_§hX§hQ§hJ§hC§h<§h5§h.§h'§h §h§h§h §h§hý¦hö¦hï¦hè¦há¦hÚ¦hÓ¦h̦hŦh¾¦h·¦h°¦h©¦h¢¦h›¦h”¦h¦h†¦h¦hx¦hq¦hj¦hc¦h\¦hU¦hN¦hG¦h@¦h9¦h2¦h+¦h$¦h¦h¦h¦h¦h¦hú¥hó¥hì¥hå¥hÞ¥h×¥hÐ¥hÉ¥hÂ¥h»¥h´¥h­¥h¦¥hŸ¥h˜¥h‘¥hŠ¥hƒ¥h|¥hu¥hn¥hg¥h`¥hY¥hR¥hK¥hD¥h=¥h6¥h/¥h(¥h!¥h¥h¥h ¥h¥hþ¤h÷¤hð¤hé¤hâ¤hÛ¤hÔ¤hͤhƤh¿¤h¸¤h±¤hª¤h£¤hœ¤h•¤hޤh‡¤h€¤hy¤hr¤hk¤hd¤h]¤hV¤hO¤hH¤hA¤h:¤h3¤h,¤h%¤h¤h¤h¤h ¤h¤hû£hô£hí£hæ£hߣhØ£hÑ£hÊ£hãh¼£hµ£h®£h§£h £h™£h’£h‹£h„£h}£hv£ho£hh£ha£hZ£hS£hL£hE£h>£h7£h0£h)£h"£h£h£h £h£hÿ¢hø¢hñ¢hê¢hã¢hÜ¢hÕ¢h΢hÇ¢hÀ¢h¹¢h²¢h«¢h¤¢h¢h–¢h¢hˆ¢h¢hz¢hs¢hl¢he¢h^¢hW¢hP¢hI¢hB¢h;¢h4¢h-¢h&¢h¢h¢h¢h ¢h¢hü¡hõ¡hî¡hç¡hà¡hÙ¡hÒ¡hË¡hÄ¡h½¡h¶¡h¯¡h¨¡h¡¡hš¡h“¡hŒ¡h…¡h~¡hw¡hp¡hi¡hb¡h[¡hT¡hM¡hF¡h?¡h8¡h1¡h*¡h#¡h¡h¡h¡h¡h¡hù hò hë hä hÝ hÖ hÏ hÈ hÁ hº h³ h¬ h¥ hž h— h h‰ h‚ h{ ht hm hf h_ hX hQ hJ hC h< h5 h. h' h  h h h  h hýŸhöŸhïŸhèŸháŸhÚŸhÓŸhÌŸhÅŸh¾Ÿh·Ÿh°Ÿh©Ÿh¢Ÿh›Ÿh”ŸhŸh†ŸhŸhxŸhqŸhjŸhcŸh\ŸhUŸhNŸhGŸh@Ÿh9Ÿh2Ÿh+Ÿh$ŸhŸhŸhŸhŸhŸhúžhóžhìžhåžhÞžhמhОhÉžhžh»žh´žh­žh¦žhŸžh˜žh‘žhŠžhƒžh|žhužhnžhgžh`žhYžhRžhKžhDžh=žh6žh/žh(žh!žhžhžh žhžhþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûœhôœhíœhæœhßœhØœhÑœhÊœhÜh¼œhµœh®œh§œh œh™œh’œh‹œh„œh}œhvœhoœhhœhaœhZœhSœhLœhEœh>œh7œh0œh)œh"œhœhœh œhœhÿ›hø›hñ›hê›hã›hÜ›hÕ›hΛhÇ›hÀ›h¹›h²›h«›h¤›h›h–›h›hˆ›h›hz›hs›hl›he›h^›hW›hP›hI›hB›h;›h4›h-›h&›h›h›h›h ›h›hüšhõšhîšhçšhàšhÙšhÒšhËšhÄšh½šh¶šh¯šh¨šh¡šhššh“šhŒšh…šh~šhwšhpšhišhbšh[šhTšhMšhFšh?šh8šh1šh*šh#šhšhšhšhšhšhù™hò™hë™hä™hÝ™hÖ™hÏ™hÈ™hÁ™hº™h³™h¬™h¥™hž™h—™h™h‰™h‚™h{™ht™hm™hf™h_™hX™hQ™hJ™hC™h<™h5™h.™h'™h ™h™h™h ™h™hý˜hö˜hï˜hè˜há˜hÚ˜hÓ˜h̘hŘh¾˜h·˜h°˜h©˜h¢˜h›˜h”˜h˜h†˜h˜hx˜hq˜hj˜hc˜h\˜hU˜hN˜hG˜h@˜h9˜h2˜h+˜h$˜h˜h˜h˜h˜h˜hú—hó—hì—hå—hÞ—h×—hЗhÉ—h—h»—h´—h­—h¦—hŸ—h˜—h‘—hŠ—hƒ—h|—hu—hn—hg—h`—hY—hR—hK—hD—h=—h6—h/—h(—h!—h—h—h —h—hþ–h÷–hð–hé–hâ–hÛ–hÔ–hÍ–hÆ–h¿–h¸–h±–hª–h£–hœ–h•–hŽ–h‡–h€–hy–hr–hk–hd–h]–hV–hO–hH–hA–h:–h3–h,–h%–h–h–h–h –h–hû•hô•hí•hæ•hß•hØ•hÑ•hÊ•hÕh¼•hµ•h®•h§•h •h™•h’•h‹•h„•h}•hv•ho•hh•ha•hZ•hS•hL•hE•h>•h7•h0•h)•h"•h•h•h •h•hÿ”hø”hñ”hê”hã”hÜ”hÕ”hΔhÇ”hÀ”h¹”h²”h«”h¤”h”h–”h”hˆ”h”hz”hs”hl”he”h^”hW”hP”hI”hB”h;”h4”h-”h&”h”h”h”h ”h”hü“hõ“hî“hç“hà“hÙ“hÒ“hË“hÄ“h½“h¶“h¯“h¨“h¡“hš“h““hŒ“h…“h~“hw“hp“hi“hb“h[“hT“hM“hF“h?“h8“h1“h*“h#“h“h“h“h“h“hù’hò’hë’hä’hÝ’hÖ’hÏ’hÈ’hÁ’hº’h³’h¬’h¥’hž’h—’h’h‰’h‚’h{’ht’hm’hf’h_’hX’hQ’hJ’hC’h<’h5’h.’h'’h ’h’h’h ’h’hý‘hö‘hï‘hè‘há‘hÚ‘hÓ‘hÌ‘hÅ‘h¾‘h·‘h°‘h©‘h¢‘h›‘h”‘h‘h†‘h‘hx‘hq‘hj‘hc‘h\‘hU‘hN‘hG‘h@‘h9‘h2‘h+‘h$‘h‘h‘h‘h‘h‘húhóhìhåhÞh×hÐhÉhÂh»h´h­h¦hŸh˜h‘hŠhƒh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûŽhôŽhíŽhæŽhߎhØŽhÑŽhÊŽhÃŽh¼ŽhµŽh®Žh§Žh Žh™Žh’Žh‹Žh„Žh}ŽhvŽhoŽhhŽhaŽhZŽhSŽhLŽhEŽh>Žh7Žh0Žh)Žh"ŽhŽhŽh ŽhŽhÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhüŒhõŒhîŒhçŒhàŒhÙŒhÒŒhËŒhÄŒh½Œh¶Œh¯Œh¨Œh¡ŒhšŒh“ŒhŒŒh…Œh~ŒhwŒhpŒhiŒhbŒh[ŒhTŒhMŒhFŒh?Œh8Œh1Œh*Œh#ŒhŒhŒhŒhŒhŒhù‹hò‹hë‹hä‹hÝ‹hÖ‹hÏ‹hÈ‹hÁ‹hº‹h³‹h¬‹h¥‹hž‹h—‹h‹h‰‹h‚‹h{‹ht‹hm‹hf‹h_‹hX‹hQ‹hJ‹hC‹h<‹h5‹h.‹h'‹h ‹h‹h‹h ‹h‹hýŠhöŠhïŠhèŠháŠhÚŠhÓŠhÌŠhÅŠh¾Šh·Šh°Šh©Šh¢Šh›Šh”ŠhŠh†ŠhŠhxŠhqŠhjŠhcŠh\ŠhUŠhNŠhGŠh@Šh9Šh2Šh+Šh$ŠhŠhŠhŠhŠhŠhú‰hó‰hì‰hå‰hÞ‰h׉hЉhɉh‰h»‰h´‰h­‰h¦‰hŸ‰h˜‰h‘‰hЉhƒ‰h|‰hu‰hn‰hg‰h`‰hY‰hR‰hK‰hD‰h=‰h6‰h/‰h(‰h!‰h‰h‰h ‰h‰hþˆh÷ˆhðˆhéˆhâˆhÛˆhÔˆh͈hƈh¿ˆh¸ˆh±ˆhªˆh£ˆhœˆh•ˆhŽˆh‡ˆh€ˆhyˆhrˆhkˆhdˆh]ˆhVˆhOˆhHˆhAˆh:ˆh3ˆh,ˆh%ˆhˆhˆhˆh ˆhˆhû‡hô‡hí‡hæ‡h߇h؇hчhʇhÇh¼‡hµ‡h®‡h§‡h ‡h™‡h’‡h‹‡h„‡h}‡hv‡ho‡hh‡ha‡hZ‡hS‡hL‡hE‡h>‡h7‡h0‡h)‡h"‡h‡h‡h ‡h‡hÿ†hø†hñ†hê†hã†h܆hÕ†hΆhdžhÀ†h¹†h²†h«†h¤†h†h–†h†hˆ†h†hz†hs†hl†he†h^†hW†hP†hI†hB†h;†h4†h-†h&†h†h†h†h †h†hü…hõ…hî…hç…hà…hÙ…hÒ…hË…hÄ…h½…h¶…h¯…h¨…h¡…hš…h“…hŒ…h……h~…hw…hp…hi…hb…h[…hT…hM…hF…h?…h8…h1…h*…h#…h…h…h…h…h…hù„hò„hë„hä„hÝ„hÖ„hÏ„hÈ„hÁ„hº„h³„h¬„h¥„hž„h—„h„h‰„h‚„h{„ht„hm„hf„h_„hX„hQ„hJ„hC„h<„h5„h.„h'„h „h„h„h „h„hýƒhöƒhïƒhèƒháƒhÚƒhÓƒh̃hŃh¾ƒh·ƒh°ƒh©ƒh¢ƒh›ƒh”ƒhƒh†ƒhƒhxƒhqƒhjƒhcƒh\ƒhUƒhNƒhGƒh@ƒh9ƒh2ƒh+ƒh$ƒhƒhƒhƒhƒhƒhú‚hó‚hì‚hå‚hÞ‚hׂhЂhÉ‚h‚h»‚h´‚h­‚h¦‚hŸ‚h˜‚h‘‚hŠ‚hƒ‚h|‚hu‚hn‚hg‚h`‚hY‚hR‚hK‚hD‚h=‚h6‚h/‚h(‚h!‚h‚h‚h ‚h‚hþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhû€hô€hí€hæ€h߀hØ€hÑ€hÊ€hÀh¼€hµ€h®€h§€h €h™€h’€h‹€h„€h}€hv€ho€hh€ha€hZ€hS€hL€hE€h>€h7€h0€h)€h"€h€h€h €h€hÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhü~hõ~hî~hç~hà~hÙ~hÒ~hË~hÄ~h½~h¶~h¯~h¨~h¡~hš~h“~hŒ~h…~h~~hw~hp~hi~hb~h[~hT~hM~hF~h?~h8~h1~h*~h#~h~h~h~h~h~hù}hò}hë}hä}hÝ}hÖ}hÏ}hÈ}hÁ}hº}h³}h¬}h¥}hž}h—}h}h‰}h‚}h{}ht}hm}hf}h_}hX}hQ}hJ}hC}h<}h5}h.}h'}h }h}h}h }h}hý|hö|hï|hè|há|hÚ|hÓ|hÌ|hÅ|h¾|h·|h°|h©|h¢|h›|h”|h|h†|h|hx|hq|hj|hc|h\|hU|hN|hG|h@|h9|h2|h+|h$|h|h|h|h|h|hú{hó{hì{hå{hÞ{h×{hÐ{hÉ{hÂ{h»{h´{h­{h¦{hŸ{h˜{h‘{hŠ{hƒ{h|{hu{hn{hg{h`{hY{hR{hK{hD{h={h6{h/{h({h!{h{h{h {h{hþzh÷zhðzhézhâzhÛzhÔzhÍzhÆzh¿zh¸zh±zhªzh£zhœzh•zhŽzh‡zh€zhyzhrzhkzhdzh]zhVzhOzhHzhAzh:zh3zh,zh%zhzhzhzh zhzhûyhôyhíyhæyhßyhØyhÑyhÊyhÃyh¼yhµyh®yh§yh yh™yh’yh‹yh„yh}yhvyhoyhhyhayhZyhSyhLyhEyh>yh7yh0yh)yh"yhyhyh yhyhÿxhøxhñxhêxhãxhÜxhÕxhÎxhÇxhÀxh¹xh²xh«xh¤xhxh–xhxhˆxhxhzxhsxhlxhexh^xhWxhPxhIxhBxh;xh4xh-xh&xhxhxhxh xhxhüwhõwhîwhçwhàwhÙwhÒwhËwhÄwh½wh¶wh¯wh¨wh¡whšwh“whŒwh…wh~whwwhpwhiwhbwh[whTwhMwhFwh?wh8wh1wh*wh#whwhwhwhwhwhùvhòvhëvhävhÝvhÖvhÏvhÈvhÁvhºvh³vh¬vh¥vhžvh—vhvh‰vh‚vh{vhtvhmvhfvh_vhXvhQvhJvhCvhrh7rh0rh)rh"rhrhrh rhrhÿqhøqhñqhêqhãqhÜqhÕqhÎqhÇqhÀqh¹qh²qh«qh¤qhqh–qhqhˆqhqhzqhsqhlqheqh^qhWqhPqhIqhBqh;qh4qh-qh&qhqhqhqh qhqhüphõphîphçphàphÙphÒphËphÄph½ph¶ph¯ph¨ph¡phšph“phŒph…ph~phwphpphiphbph[phTphMphFph?ph8ph1ph*ph#phphphphphphùohòohëohäohÝohÖohÏohÈohÁohºoh³oh¬oh¥ohžoh—ohoh‰oh‚oh{ohtohmohfoh_ohXohQohJohCohkh7kh0kh)kh"khkhkh khkhÿjhøjhñjhêjhãjhÜjhÕjhÎjhÇjhÀjh¹jh²jh«jh¤jhjh–jhjhˆjhjhzjhsjhljhejh^jhWjhPjhIjhBjh;jh4jh-jh&jhjhjhjh jhjhüihõihîihçihàihÙihÒihËihÄih½ih¶ih¯ih¨ih¡ihših“ihŒih…ih~ihwihpihiihbih[ihTihMihFih?ih8ih1ih*ih#ihihihihihihùhhòhhëhhähhÝhhÖhhÏhhÈhhÁhhºhh³hh¬hh¥hhžhh—hhhh‰hh‚hh{hhthhmhhfhh_hhXhhQhhJhhChhdh7dh0dh)dh"dhdhdh dhdhÿchøchñchêchãchÜchÕchÎchÇchÀch¹ch²ch«ch¤chch–chchˆchchzchschlchech^chWchPchIchBch;ch4ch-ch&chchchch chchübhõbhîbhçbhàbhÙbhÒbhËbhÄbh½bh¶bh¯bh¨bh¡bhšbh“bhŒbh…bh~bhwbhpbhibhbbh[bhTbhMbhFbh?bh8bh1bh*bh#bhbhbhbhbhbhùahòahëahäahÝahÖahÏahÈahÁahºah³ah¬ah¥ahžah—ahah‰ah‚ah{ahtahmahfah_ahXahQahJahCah]h7]h0]h)]h"]h]h]h ]h]hÿ\hø\hñ\hê\hã\hÜ\hÕ\hÎ\hÇ\hÀ\h¹\h²\h«\h¤\h\h–\h\hˆ\h\hz\hs\hl\he\h^\hW\hP\hI\hB\h;\h4\h-\h&\h\h\h\h \h\hü[hõ[hî[hç[hà[hÙ[hÒ[hË[hÄ[h½[h¶[h¯[h¨[h¡[hš[h“[hŒ[h…[h~[hw[hp[hi[hb[h[[hT[hM[hF[h?[h8[h1[h*[h#[h[h[h[h[h[hùZhòZhëZhäZhÝZhÖZhÏZhÈZhÁZhºZh³Zh¬Zh¥ZhžZh—ZhZh‰Zh‚Zh{ZhtZhmZhfZh_ZhXZhQZhJZhCZhVh7Vh0Vh)Vh"VhVhVh VhVhÿUhøUhñUhêUhãUhÜUhÕUhÎUhÇUhÀUh¹Uh²Uh«Uh¤UhUh–UhUhˆUhUhzUhsUhlUheUh^UhWUhPUhIUhBUh;Uh4Uh-Uh&UhUhUhUh UhUhüThõThîThçThàThÙThÒThËThÄTh½Th¶Th¯Th¨Th¡ThšTh“ThŒTh…Th~ThwThpThiThbTh[ThTThMThFTh?Th8Th1Th*Th#ThThThThThThùShòShëShäShÝShÖShÏShÈShÁShºSh³Sh¬Sh¥ShžSh—ShSh‰Sh‚Sh{ShtShmShfSh_ShXShQShJShCShOh7Oh0Oh)Oh"OhOhOh OhOhÿNhøNhñNhêNhãNhÜNhÕNhÎNhÇNhÀNh¹Nh²Nh«Nh¤NhNh–NhNhˆNhNhzNhsNhlNheNh^NhWNhPNhINhBNh;Nh4Nh-Nh&NhNhNhNh NhNhüMhõMhîMhçMhàMhÙMhÒMhËMhÄMh½Mh¶Mh¯Mh¨Mh¡MhšMh“MhŒMh…Mh~MhwMhpMhiMhbMh[MhTMhMMhFMh?Mh8Mh1Mh*Mh#MhMhMhMhMhMhùLhòLhëLhäLhÝLhÖLhÏLhÈLhÁLhºLh³Lh¬Lh¥LhžLh—LhLh‰Lh‚Lh{LhtLhmLhfLh_LhXLhQLhJLhCLhHh7Hh0Hh)Hh"HhHhHh HhHhÿGhøGhñGhêGhãGhÜGhÕGhÎGhÇGhÀGh¹Gh²Gh«Gh¤GhGh–GhGhˆGhGhzGhsGhlGheGh^GhWGhPGhIGhBGh;Gh4Gh-Gh&GhGhGhGh GhGhüFhõFhîFhçFhàFhÙFhÒFhËFhÄFh½Fh¶Fh¯Fh¨Fh¡FhšFh“FhŒFh…Fh~FhwFhpFhiFhbFh[FhTFhMFhFFh?Fh8Fh1Fh*Fh#FhFhFhFhFhFhùEhòEhëEhäEhÝEhÖEhÏEhÈEhÁEhºEh³Eh¬Eh¥EhžEh—EhEh‰Eh‚Eh{EhtEhmEhfEh_EhXEhQEhJEhCEhAh7Ah0Ah)Ah"AhAhAh AhAhÿ@hø@hñ@hê@hã@hÜ@hÕ@hÎ@hÇ@hÀ@h¹@h²@h«@h¤@h@h–@h@hˆ@h@hz@hs@hl@he@h^@hW@hP@hI@hB@h;@h4@h-@h&@h@h@h@h @h@hü?hõ?hî?hç?hà?hÙ?hÒ?hË?hÄ?h½?h¶?h¯?h¨?h¡?hš?h“?hŒ?h…?h~?hw?hp?hi?hb?h[?hT?hM?hF?h??h8?h1?h*?h#?h?h?h?h?h?hù>hò>hë>hä>hÝ>hÖ>hÏ>hÈ>hÁ>hº>h³>h¬>h¥>hž>h—>h>h‰>h‚>h{>ht>hm>hf>h_>hX>hQ>hJ>hC>h<>h5>h.>h'>h >h>h>h >h>hý=hö=hï=hè=há=hÚ=hÓ=hÌ=hÅ=h¾=h·=h°=h©=h¢=h›=h”=h=h†=h=hx=hq=hj=hc=h\=hU=hN=hG=h@=h9=h2=h+=h$=h=h=h=h=h=hú:h7:h0:h):h":h:h:h :h:hÿ9hø9hñ9hê9hã9hÜ9hÕ9hÎ9hÇ9hÀ9h¹9h²9h«9h¤9h9h–9h9hˆ9h9hz9hs9hl9he9h^9hW9hP9hI9hB9h;9h49h-9h&9h9h9h9h 9h9hü8hõ8hî8hç8hà8hÙ8hÒ8hË8hÄ8h½8h¶8h¯8h¨8h¡8hš8h“8hŒ8h…8h~8hw8hp8hi8hb8h[8hT8hM8hF8h?8h88h18h*8h#8h8h8h8h8h8hù7hò7hë7hä7hÝ7hÖ7hÏ7hÈ7hÁ7hº7h³7h¬7h¥7hž7h—7h7h‰7h‚7h{7ht7hm7hf7h_7hX7hQ7hJ7hC7h<7h57h.7h'7h 7h7h7h 7h7hý6hö6hï6hè6há6hÚ6hÓ6hÌ6hÅ6h¾6h·6h°6h©6h¢6h›6h”6h6h†6h6hx6hq6hj6hc6h\6hU6hN6hG6h@6h96h26h+6h$6h6h6h6h6h6hú5hó5hì5hå5hÞ5h×5hÐ5hÉ5hÂ5h»5h´5h­5h¦5hŸ5h˜5h‘5hŠ5hƒ5h|5hu5hn5hg5h`5hY5hR5hK5hD5h=5h65h/5h(5h!5h5h5h 5h5hþ4h÷4hð4hé4hâ4hÛ4hÔ4hÍ4hÆ4h¿4h¸4h±4hª4h£4hœ4h•4hŽ4h‡4h€4hy4hr4hk4hd4h]4hV4hO4hH4hA4h:4h34h,4h%4h4h4h4h 4h4hû3hô3hí3hæ3hß3hØ3hÑ3hÊ3hÃ3h¼3hµ3h®3h§3h 3h™3h’3h‹3h„3h}3hv3ho3hh3ha3hZ3hS3hL3hE3h>3h73h03h)3h"3h3h3h 3h3hÿ2hø2hñ2hê2hã2hÜ2hÕ2hÎ2hÇ2hÀ2h¹2h²2h«2h¤2h2h–2h2hˆ2h2hz2hs2hl2he2h^2hW2hP2hI2hB2h;2h42h-2h&2h2h2h2h 2h2hü1hõ1hî1hç1hà1hÙ1hÒ1hË1hÄ1h½1h¶1h¯1h¨1h¡1hš1h“1hŒ1h…1h~1hw1hp1hi1hb1h[1hT1hM1hF1h?1h81h11h*1h#1h1h1h1h1h1hù0hò0hë0hä0hÝ0hÖ0hÏ0hÈ0hÁ0hº0h³0h¬0h¥0hž0h—0h0h‰0h‚0h{0ht0hm0hf0h_0hX0hQ0hJ0hC0h<0h50h.0h'0h 0h0h0h 0h0hý/hö/hï/hè/há/hÚ/hÓ/hÌ/hÅ/h¾/h·/h°/h©/h¢/h›/h”/h/h†/h/hx/hq/hj/hc/h\/hU/hN/hG/h@/h9/h2/h+/h$/h/h/h/h/h/hú.hó.hì.hå.hÞ.h×.hÐ.hÉ.hÂ.h».h´.h­.h¦.hŸ.h˜.h‘.hŠ.hƒ.h|.hu.hn.hg.h`.hY.hR.hK.hD.h=.h6.h/.h(.h!.h.h.h .h.hþ-h÷-hð-hé-hâ-hÛ-hÔ-hÍ-hÆ-h¿-h¸-h±-hª-h£-hœ-h•-hŽ-h‡-h€-hy-hr-hk-hd-h]-hV-hO-hH-hA-h:-h3-h,-h%-h-h-h-h -h-hû,hô,hí,hæ,hß,hØ,hÑ,hÊ,hÃ,h¼,hµ,h®,h§,h ,h™,h’,h‹,h„,h},hv,ho,hh,ha,hZ,hS,hL,hE,h>,h7,h0,h),h",h,h,h ,h,hÿ+hø+hñ+hê+hã+hÜ+hÕ+hÎ+hÇ+hÀ+h¹+h²+h«+h¤+h+h–+h+hˆ+h+hz+hs+hl+he+h^+hW+hP+hI+hB+h;+h4+h-+h&+h+h+h+h +h+hü*hõ*hî*hç*hà*hÙ*hÒ*hË*hÄ*h½*h¶*h¯*h¨*h¡*hš*h“*hŒ*h…*h~*hw*hp*hi*hb*h[*hT*hM*hF*h?*h8*h1*h**h#*h*h*h*h*h*hù)hò)hë)hä)hÝ)hÖ)hÏ)hÈ)hÁ)hº)h³)h¬)h¥)hž)h—)h)h‰)h‚)h{)ht)hm)hf)h_)hX)hQ)hJ)hC)h<)h5)h.)h')h )h)h)h )h)hý(hö(hï(hè(há(hÚ(hÓ(hÌ(hÅ(h¾(h·(h°(h©(h¢(h›(h”(h(h†(h(hx(hq(hj(hc(h\(hU(hN(hG(h@(h9(h2(h+(h$(h(h(h(h(h(hú'hó'hì'hå'hÞ'h×'hÐ'hÉ'hÂ'h»'h´'h­'h¦'hŸ'h˜'h‘'hŠ'hƒ'h|'hu'hn'hg'h`'hY'hR'hK'hD'h='h6'h/'h('h!'h'h'h 'h'hþ&h÷&hð&hé&hâ&hÛ&hÔ&hÍ&hÆ&h¿&h¸&h±&hª&h£&hœ&h•&hŽ&h‡&h€&hy&hr&hk&hd&h]&hV&hO&hH&hA&h:&h3&h,&h%&h&h&h&h &h&hû%hô%hí%hæ%hß%hØ%hÑ%hÊ%hÃ%h¼%hµ%h®%h§%h %h™%h’%h‹%h„%h}%hv%ho%hh%ha%hZ%hS%hL%hE%h>%h7%h0%h)%h"%h%h%h %h%hÿ$hø$hñ$hê$hã$hÜ$hÕ$hÎ$hÇ$hÀ$h¹$h²$h«$h¤$h$h–$h$hˆ$h$hz$hs$hl$he$h^$hW$hP$hI$hB$h;$h4$h-$h&$h$h$h$h $h$hü#hõ#hî#hç#hà#hÙ#hÒ#hË#hÄ#h½#h¶#h¯#h¨#h¡#hš#h“#hŒ#h…#h~#hw#hp#hi#hb#h[#hT#hM#hF#h?#h8#h1#h*#h##h#h#h#h#h#hù"hò"hë"hä"hÝ"hÖ"hÏ"hÈ"hÁ"hº"h³"h¬"h¥"hž"h—"h"h‰"h‚"h{"ht"hm"hf"h_"hX"hQ"hJ"hC"h<"h5"h."h'"h "h"h"h "h"hý!hö!hï!hè!há!hÚ!hÓ!hÌ!hÅ!h¾!h·!h°!h©!h¢!h›!h”!h!h†!h!hx!hq!hj!hc!h\!hU!hN!hG!h@!h9!h2!h+!h$!h!h!h!h!h!hú hó hì hå hÞ h× hÐ hÉ h h» h´ h­ h¦ hŸ h˜ h‘ hŠ hƒ h| hu hn hg h` hY hR hK hD h= h6 h/ h( h! h h h h hþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûhôhíhæhßhØhÑhÊhÃh¼hµh®h§h h™h’h‹h„h}hvhohhhahZhShLhEh>h7h0h)h"hhh hhÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhýhöhïhèháhÚhÓhÌhÅh¾h·h°h©h¢h›h”hh†hhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhúhóhìhåhÞh×hÐhÉhÂh»h´h­h¦hŸh˜h‘hŠhƒh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûhôhíhæhßhØhÑhÊhÃh¼hµh®h§h h™h’h‹h„h}hvhohhhahZhShLhEh>h7h0h)h"hhh hhÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhýhöhïhèháhÚhÓhÌhÅh¾h·h°h©h¢h›h”hh†hhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhúhóhìhåhÞh×hÐhÉhÂh»h´h­h¦hŸh˜h‘hŠhƒh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûhôhíhæhßhØhÑhÊhÃh¼hµh®h§h h™h’h‹h„h}hvhohhhahZhShLhEh>h7h0h)h"hhh hhÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhù hò hë hä hÝ hÖ hÏ hÈ hÁ hº h³ h¬ h¥ hž h— h h‰ h‚ h{ ht hm hf h_ hX hQ hJ hC h< h5 h. h' h h h h h hý hö hï hè há hÚ hÓ hÌ hÅ h¾ h· h° h© h¢ h› h” h h† h hx hq hj hc h\ hU hN hG h@ h9 h2 h+ h$ h h h h h hú hó hì hå hÞ h× hÐ hÉ h h» h´ h­ h¦ hŸ h˜ h‘ hŠ hƒ h| hu hn hg h` hY hR hK hD h= h6 h/ h( h! h h h h hþ h÷ hð hé hâ hÛ hÔ hÍ hÆ h¿ h¸ h± hª h£ hœ h• hŽ h‡ h€ hy hr hk hd h] hV hO hH hA h: h3 h, h% h h h h h hû hô hí hæ hß hØ hÑ hÊ hà h¼ hµ h® h§ h  h™ h’ h‹ h„ h} hv ho hh ha hZ hS hL hE h> h7 h0 h) h" h h h h hÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhCh<h5h.h'h hhh hhýhöhïhèháhÚhÓhÌhÅh¾h·h°h©h¢h›h”hh†hhxhqhjhch\hUhNhGh@h9h2h+h$hhhhhhúhóhìhåhÞh×hÐhÉhÂh»h´h­h¦hŸh˜h‘hŠhƒh|huhnhgh`hYhRhKhDh=h6h/h(h!hhh hhþh÷hðhéhâhÛhÔhÍhÆh¿h¸h±hªh£hœh•hŽh‡h€hyhrhkhdh]hVhOhHhAh:h3h,h%hhhh hhûhôhíhæhßhØhÑhÊhÃh¼hµh®h§h h™h’h‹h„h}hvhohhhahZhShLhEh>h7h0h)h"hhh hhÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùÿgòÿgëÿgäÿgÝÿgÖÿgÏÿgÈÿgÁÿgºÿg³ÿg¬ÿg¥ÿgžÿg—ÿgÿg‰ÿg‚ÿg{ÿgtÿgmÿgfÿg_ÿgXÿgQÿgJÿgCÿg<ÿg5ÿg.ÿg'ÿg ÿgÿgÿg ÿgÿgýþgöþgïþgèþgáþgÚþgÓþgÌþgÅþg¾þg·þg°þg©þg¢þg›þg”þgþg†þgþgxþgqþgjþgcþg\þgUþgNþgGþg@þg9þg2þg+þg$þgþgþgþgþgþgúýgóýgìýgåýgÞýg×ýgÐýgÉýgÂýg»ýg´ýg­ýg¦ýgŸýg˜ýg‘ýgŠýgƒýg|ýguýgnýggýg`ýgYýgRýgKýgDýg=ýg6ýg/ýg(ýg!ýgýgýg ýgýgþüg÷ügðügéügâügÛügÔügÍügÆüg¿üg¸üg±ügªüg£ügœüg•ügŽüg‡üg€ügyügrügkügdüg]ügVügOügHügAüg:üg3üg,üg%ügügügüg ügügûûgôûgíûgæûgßûgØûgÑûgÊûgÃûg¼ûgµûg®ûg§ûg ûg™ûg’ûg‹ûg„ûg}ûgvûgoûghûgaûgZûgSûgLûgEûg>ûg7ûg0ûg)ûg"ûgûgûg ûgûgÿúgøúgñúgêúgãúgÜúgÕúgÎúgÇúgÀúg¹úg²úg«úg¤úgúg–úgúgˆúgúgzúgsúglúgeúg^úgWúgPúgIúgBúg;úg4úg-úg&úgúgúgúg úgúgüùgõùgîùgçùgàùgÙùgÒùgËùgÄùg½ùg¶ùg¯ùg¨ùg¡ùgšùg“ùgŒùg…ùg~ùgwùgpùgiùgbùg[ùgTùgMùgFùg?ùg8ùg1ùg*ùg#ùgùgùgùgùgùgùøgòøgëøgäøgÝøgÖøgÏøgÈøgÁøgºøg³øg¬øg¥øgžøg—øgøg‰øg‚øg{øgtøgmøgføg_øgXøgQøgJøgCøg<øg5øg.øg'øg øgøgøg øgøgý÷gö÷gï÷gè÷gá÷gÚ÷gÓ÷gÌ÷gÅ÷g¾÷g·÷g°÷g©÷g¢÷g›÷g”÷g÷g†÷g÷gx÷gq÷gj÷gc÷g\÷gU÷gN÷gG÷g@÷g9÷g2÷g+÷g$÷g÷g÷g÷g÷g÷gúögóögìögåögÞög×ögÐögÉögÂög»ög´ög­ög¦ögŸög˜ög‘ögŠögƒög|öguögnöggög`ögYögRögKögDög=ög6ög/ög(ög!ögögög ögögþõg÷õgðõgéõgâõgÛõgÔõgÍõgÆõg¿õg¸õg±õgªõg£õgœõg•õgŽõg‡õg€õgyõgrõgkõgdõg]õgVõgOõgHõgAõg:õg3õg,õg%õgõgõgõg õgõgûôgôôgíôgæôgßôgØôgÑôgÊôgÃôg¼ôgµôg®ôg§ôg ôg™ôg’ôg‹ôg„ôg}ôgvôgoôghôgaôgZôgSôgLôgEôg>ôg7ôg0ôg)ôg"ôgôgôg ôgôgÿógøógñógêógãógÜógÕógÎógÇógÀóg¹óg²óg«óg¤ógóg–ógógˆógógzógsóglógeóg^ógWógPógIógBóg;óg4óg-óg&ógógógóg ógógüògõògîògçògàògÙògÒògËògÄòg½òg¶òg¯òg¨òg¡ògšòg“ògŒòg…òg~ògwògpògiògbòg[ògTògMògFòg?òg8òg1òg*òg#ògògògògògògùñgòñgëñgäñgÝñgÖñgÏñgÈñgÁñgºñg³ñg¬ñg¥ñgžñg—ñgñg‰ñg‚ñg{ñgtñgmñgfñg_ñgXñgQñgJñgCñg<ñg5ñg.ñg'ñg ñgñgñg ñgñgýðgöðgïðgèðgáðgÚðgÓðgÌðgÅðg¾ðg·ðg°ðg©ðg¢ðg›ðg”ðgðg†ðgðgxðgqðgjðgcðg\ðgUðgNðgGðg@ðg9ðg2ðg+ðg$ðgðgðgðgðgðgúïgóïgìïgåïgÞïg×ïgÐïgÉïgÂïg»ïg´ïg­ïg¦ïgŸïg˜ïg‘ïgŠïgƒïg|ïguïgnïggïg`ïgYïgRïgKïgDïg=ïg6ïg/ïg(ïg!ïgïgïg ïgïgþîg÷îgðîgéîgâîgÛîgÔîgÍîgÆîg¿îg¸îg±îgªîg£îgœîg•îgŽîg‡îg€îgyîgrîgkîgdîg]îgVîgOîgHîgAîg:îg3îg,îg%îgîgîgîg îgîgûígôígíígæígßígØígÑígÊígÃíg¼ígµíg®íg§íg íg™íg’íg‹íg„íg}ígvígoíghígaígZígSígLígEíg>íg7íg0íg)íg"ígígíg ígígÿìgøìgñìgêìgãìgÜìgÕìgÎìgÇìgÀìg¹ìg²ìg«ìg¤ìgìg–ìgìgˆìgìgzìgsìglìgeìg^ìgWìgPìgIìgBìg;ìg4ìg-ìg&ìgìgìgìg ìgìgüëgõëgîëgçëgàëgÙëgÒëgËëgÄëg½ëg¶ëg¯ëg¨ëg¡ëgšëg“ëgŒëg…ëg~ëgwëgpëgiëgbëg[ëgTëgMëgFëg?ëg8ëg1ëg*ëg#ëgëgëgëgëgëgùêgòêgëêgäêgÝêgÖêgÏêgÈêgÁêgºêg³êg¬êg¥êgžêg—êgêg‰êg‚êg{êgtêgmêgfêg_êgXêgQêgJêgCêg<êg5êg.êg'êg êgêgêg êgêgýégöégïégèégáégÚégÓégÌégÅég¾ég·ég°ég©ég¢ég›ég”égég†égégxégqégjégcég\égUégNégGég@ég9ég2ég+ég$égégégégégégúègóègìègåègÞèg×ègÐègÉègÂèg»èg´èg­èg¦ègŸèg˜èg‘ègŠègƒèg|èguègnèggèg`ègYègRègKègDèg=èg6èg/èg(èg!ègègèg ègègþçg÷çgðçgéçgâçgÛçgÔçgÍçgÆçg¿çg¸çg±çgªçg£çgœçg•çgŽçg‡çg€çgyçgrçgkçgdçg]çgVçgOçgHçgAçg:çg3çg,çg%çgçgçgçg çgçgûægôægíægæægßægØægÑægÊægÃæg¼ægµæg®æg§æg æg™æg’æg‹æg„æg}ægvægoæghægaægZægSægLægEæg>æg7æg0æg)æg"ægægæg ægægÿågøågñågêågãågÜågÕågÎågÇågÀåg¹åg²åg«åg¤ågåg–ågågˆågågzågsåglågeåg^ågWågPågIågBåg;åg4åg-åg&ågågågåg ågågüägõägîägçägàägÙägÒägËägÄäg½äg¶äg¯äg¨äg¡ägšäg“ägŒäg…äg~ägwägpägiägbäg[ägTägMägFäg?äg8äg1äg*äg#ägägägägägägùãgòãgëãgäãgÝãgÖãgÏãgÈãgÁãgºãg³ãg¬ãg¥ãgžãg—ãgãg‰ãg‚ãg{ãgtãgmãgfãg_ãgXãgQãgJãgCãg<ãg5ãg.ãg'ãg ãgãgãg ãgãgýâgöâgïâgèâgáâgÚâgÓâgÌâgÅâg¾âg·âg°âg©âg¢âg›âg”âgâg†âgâgxâgqâgjâgcâg\âgUâgNâgGâg@âg9âg2âg+âg$âgâgâgâgâgâgúágóágìágåágÞág×ágÐágÉágÂág»ág´ág­ág¦ágŸág˜ág‘ágŠágƒág|águágnággág`ágYágRágKágDág=ág6ág/ág(ág!ágágág ágágþàg÷àgðàgéàgâàgÛàgÔàgÍàgÆàg¿àg¸àg±àgªàg£àgœàg•àgŽàg‡àg€àgyàgràgkàgdàg]àgVàgOàgHàgAàg:àg3àg,àg%àgàgàgàg àgàgûßgôßgíßgæßgßßgØßgÑßgÊßgÃßg¼ßgµßg®ßg§ßg ßg™ßg’ßg‹ßg„ßg}ßgvßgoßghßgaßgZßgSßgLßgEßg>ßg7ßg0ßg)ßg"ßgßgßg ßgßgÿÞgøÞgñÞgêÞgãÞgÜÞgÕÞgÎÞgÇÞgÀÞg¹Þg²Þg«Þg¤ÞgÞg–ÞgÞgˆÞgÞgzÞgsÞglÞgeÞg^ÞgWÞgPÞgIÞgBÞg;Þg4Þg-Þg&ÞgÞgÞgÞg ÞgÞgüÝgõÝgîÝgçÝgàÝgÙÝgÒÝgËÝgÄÝg½Ýg¶Ýg¯Ýg¨Ýg¡ÝgšÝg“ÝgŒÝg…Ýg~ÝgwÝgpÝgiÝgbÝg[ÝgTÝgMÝgFÝg?Ýg8Ýg1Ýg*Ýg#ÝgÝgÝgÝgÝgÝgùÜgòÜgëÜgäÜgÝÜgÖÜgÏÜgÈÜgÁÜgºÜg³Üg¬Üg¥ÜgžÜg—ÜgÜg‰Üg‚Üg{ÜgtÜgmÜgfÜg_ÜgXÜgQÜgJÜgCÜg<Üg5Üg.Üg'Üg ÜgÜgÜg ÜgÜgýÛgöÛgïÛgèÛgáÛgÚÛgÓÛgÌÛgÅÛg¾Ûg·Ûg°Ûg©Ûg¢Ûg›Ûg”ÛgÛg†ÛgÛgxÛgqÛgjÛgcÛg\ÛgUÛgNÛgGÛg@Ûg9Ûg2Ûg+Ûg$ÛgÛgÛgÛgÛgÛgúÚgóÚgìÚgåÚgÞÚg×ÚgÐÚgÉÚgÂÚg»Úg´Úg­Úg¦ÚgŸÚg˜Úg‘ÚgŠÚgƒÚg|ÚguÚgnÚggÚg`ÚgYÚgRÚgKÚgDÚg=Úg6Úg/Úg(Úg!ÚgÚgÚg ÚgÚgþÙg÷ÙgðÙgéÙgâÙgÛÙgÔÙgÍÙgÆÙg¿Ùg¸Ùg±ÙgªÙg£ÙgœÙg•ÙgŽÙg‡Ùg€ÙgyÙgrÙgkÙgdÙg]ÙgVÙgOÙgHÙgAÙg:Ùg3Ùg,Ùg%ÙgÙgÙgÙg ÙgÙgûØgôØgíØgæØgߨgØØgÑØgÊØgÃØg¼ØgµØg®Øg§Øg Øg™Øg’Øg‹Øg„Øg}ØgvØgoØghØgaØgZØgSØgLØgEØg>Øg7Øg0Øg)Øg"ØgØgØg ØgØgÿ×gø×gñ×gê×gã×gÜ×gÕ×gÎ×gÇ×gÀ×g¹×g²×g«×g¤×g×g–×g×gˆ×g×gz×gs×gl×ge×g^×gW×gP×gI×gB×g;×g4×g-×g&×g×g×g×g ×g×güÖgõÖgîÖgçÖgàÖgÙÖgÒÖgËÖgÄÖg½Ög¶Ög¯Ög¨Ög¡ÖgšÖg“ÖgŒÖg…Ög~ÖgwÖgpÖgiÖgbÖg[ÖgTÖgMÖgFÖg?Ög8Ög1Ög*Ög#ÖgÖgÖgÖgÖgÖgùÕgòÕgëÕgäÕgÝÕgÖÕgÏÕgÈÕgÁÕgºÕg³Õg¬Õg¥ÕgžÕg—ÕgÕg‰Õg‚Õg{ÕgtÕgmÕgfÕg_ÕgXÕgQÕgJÕgCÕg<Õg5Õg.Õg'Õg ÕgÕgÕg ÕgÕgýÔgöÔgïÔgèÔgáÔgÚÔgÓÔgÌÔgÅÔg¾Ôg·Ôg°Ôg©Ôg¢Ôg›Ôg”ÔgÔg†ÔgÔgxÔgqÔgjÔgcÔg\ÔgUÔgNÔgGÔg@Ôg9Ôg2Ôg+Ôg$ÔgÔgÔgÔgÔgÔgúÓgóÓgìÓgåÓgÞÓg×ÓgÐÓgÉÓgÂÓg»Óg´Óg­Óg¦ÓgŸÓg˜Óg‘ÓgŠÓgƒÓg|ÓguÓgnÓggÓg`ÓgYÓgRÓgKÓgDÓg=Óg6Óg/Óg(Óg!ÓgÓgÓg ÓgÓgþÒg÷ÒgðÒgéÒgâÒgÛÒgÔÒgÍÒgÆÒg¿Òg¸Òg±ÒgªÒg£ÒgœÒg•ÒgŽÒg‡Òg€ÒgyÒgrÒgkÒgdÒg]ÒgVÒgOÒgHÒgAÒg:Òg3Òg,Òg%ÒgÒgÒgÒg ÒgÒgûÑgôÑgíÑgæÑgßÑgØÑgÑÑgÊÑgÃÑg¼ÑgµÑg®Ñg§Ñg Ñg™Ñg’Ñg‹Ñg„Ñg}ÑgvÑgoÑghÑgaÑgZÑgSÑgLÑgEÑg>Ñg7Ñg0Ñg)Ñg"ÑgÑgÑg ÑgÑgÿÐgøÐgñÐgêÐgãÐgÜÐgÕÐgÎÐgÇÐgÀÐg¹Ðg²Ðg«Ðg¤ÐgÐg–ÐgÐgˆÐgÐgzÐgsÐglÐgeÐg^ÐgWÐgPÐgIÐgBÐg;Ðg4Ðg-Ðg&ÐgÐgÐgÐg ÐgÐgüÏgõÏgîÏgçÏgàÏgÙÏgÒÏgËÏgÄÏg½Ïg¶Ïg¯Ïg¨Ïg¡ÏgšÏg“ÏgŒÏg…Ïg~ÏgwÏgpÏgiÏgbÏg[ÏgTÏgMÏgFÏg?Ïg8Ïg1Ïg*Ïg#ÏgÏgÏgÏgÏgÏgùÎgòÎgëÎgäÎgÝÎgÖÎgÏÎgÈÎgÁÎgºÎg³Îg¬Îg¥ÎgžÎg—ÎgÎg‰Îg‚Îg{ÎgtÎgmÎgfÎg_ÎgXÎgQÎgJÎgCÎg<Îg5Îg.Îg'Îg ÎgÎgÎg ÎgÎgýÍgöÍgïÍgèÍgáÍgÚÍgÓÍgÌÍgÅÍg¾Íg·Íg°Íg©Íg¢Íg›Íg”ÍgÍg†ÍgÍgxÍgqÍgjÍgcÍg\ÍgUÍgNÍgGÍg@Íg9Íg2Íg+Íg$ÍgÍgÍgÍgÍgÍgúÌgóÌgìÌgåÌgÞÌg×ÌgÐÌgÉÌgÂÌg»Ìg´Ìg­Ìg¦ÌgŸÌg˜Ìg‘ÌgŠÌgƒÌg|ÌguÌgnÌggÌg`ÌgYÌgRÌgKÌgDÌg=Ìg6Ìg/Ìg(Ìg!ÌgÌgÌg ÌgÌgþËg÷ËgðËgéËgâËgÛËgÔËgÍËgÆËg¿Ëg¸Ëg±ËgªËg£ËgœËg•ËgŽËg‡Ëg€ËgyËgrËgkËgdËg]ËgVËgOËgHËgAËg:Ëg3Ëg,Ëg%ËgËgËgËg ËgËgûÊgôÊgíÊgæÊgßÊgØÊgÑÊgÊÊgÃÊg¼ÊgµÊg®Êg§Êg Êg™Êg’Êg‹Êg„Êg}ÊgvÊgoÊghÊgaÊgZÊgSÊgLÊgEÊg>Êg7Êg0Êg)Êg"ÊgÊgÊg ÊgÊgÿÉgøÉgñÉgêÉgãÉgÜÉgÕÉgÎÉgÇÉgÀÉg¹Ég²Ég«Ég¤ÉgÉg–ÉgÉgˆÉgÉgzÉgsÉglÉgeÉg^ÉgWÉgPÉgIÉgBÉg;Ég4Ég-Ég&ÉgÉgÉgÉg ÉgÉgüÈgõÈgîÈgçÈgàÈgÙÈgÒÈgËÈgÄÈg½Èg¶Èg¯Èg¨Èg¡ÈgšÈg“ÈgŒÈg…Èg~ÈgwÈgpÈgiÈgbÈg[ÈgTÈgMÈgFÈg?Èg8Èg1Èg*Èg#ÈgÈgÈgÈgÈgÈgùÇgòÇgëÇgäÇgÝÇgÖÇgÏÇgÈÇgÁÇgºÇg³Çg¬Çg¥ÇgžÇg—ÇgÇg‰Çg‚Çg{ÇgtÇgmÇgfÇg_ÇgXÇgQÇgJÇgCÇg<Çg5Çg.Çg'Çg ÇgÇgÇg ÇgÇgýÆgöÆgïÆgèÆgáÆgÚÆgÓÆgÌÆgÅÆg¾Æg·Æg°Æg©Æg¢Æg›Æg”ÆgÆg†ÆgÆgxÆgqÆgjÆgcÆg\ÆgUÆgNÆgGÆg@Æg9Æg2Æg+Æg$ÆgÆgÆgÆgÆgÆgúÅgóÅgìÅgåÅgÞÅg×ÅgÐÅgÉÅgÂÅg»Åg´Åg­Åg¦ÅgŸÅg˜Åg‘ÅgŠÅgƒÅg|ÅguÅgnÅggÅg`ÅgYÅgRÅgKÅgDÅg=Åg6Åg/Åg(Åg!ÅgÅgÅg ÅgÅgþÄg÷ÄgðÄgéÄgâÄgÛÄgÔÄgÍÄgÆÄg¿Äg¸Äg±ÄgªÄg£ÄgœÄg•ÄgŽÄg‡Äg€ÄgyÄgrÄgkÄgdÄg]ÄgVÄgOÄgHÄgAÄg:Äg3Äg,Äg%ÄgÄgÄgÄg ÄgÄgûÃgôÃgíÃgæÃgßÃgØÃgÑÃgÊÃgÃÃg¼ÃgµÃg®Ãg§Ãg Ãg™Ãg’Ãg‹Ãg„Ãg}ÃgvÃgoÃghÃgaÃgZÃgSÃgLÃgEÃg>Ãg7Ãg0Ãg)Ãg"ÃgÃgÃg ÃgÃgÿÂgøÂgñÂgêÂgãÂgÜÂgÕÂgÎÂgÇÂgÀÂg¹Âg²Âg«Âg¤ÂgÂg–ÂgÂgˆÂgÂgzÂgsÂglÂgeÂg^ÂgWÂgPÂgIÂgBÂg;Âg4Âg-Âg&ÂgÂgÂgÂg ÂgÂgüÁgõÁgîÁgçÁgàÁgÙÁgÒÁgËÁgÄÁg½Ág¶Ág¯Ág¨Ág¡ÁgšÁg“ÁgŒÁg…Ág~ÁgwÁgpÁgiÁgbÁg[ÁgTÁgMÁgFÁg?Ág8Ág1Ág*Ág#ÁgÁgÁgÁgÁgÁgùÀgòÀgëÀgäÀgÝÀgÖÀgÏÀgÈÀgÁÀgºÀg³Àg¬Àg¥ÀgžÀg—ÀgÀg‰Àg‚Àg{ÀgtÀgmÀgfÀg_ÀgXÀgQÀgJÀgCÀg<Àg5Àg.Àg'Àg ÀgÀgÀg ÀgÀgý¿gö¿gï¿gè¿gá¿gÚ¿gÓ¿gÌ¿gÅ¿g¾¿g·¿g°¿g©¿g¢¿g›¿g”¿g¿g†¿g¿gx¿gq¿gj¿gc¿g\¿gU¿gN¿gG¿g@¿g9¿g2¿g+¿g$¿g¿g¿g¿g¿g¿gú¾gó¾gì¾gå¾gÞ¾g×¾gоgɾg¾g»¾g´¾g­¾g¦¾gŸ¾g˜¾g‘¾gоgƒ¾g|¾gu¾gn¾gg¾g`¾gY¾gR¾gK¾gD¾g=¾g6¾g/¾g(¾g!¾g¾g¾g ¾g¾gþ½g÷½gð½gé½gâ½gÛ½gÔ½gͽgƽg¿½g¸½g±½gª½g£½gœ½g•½g޽g‡½g€½gy½gr½gk½gd½g]½gV½gO½gH½gA½g:½g3½g,½g%½g½g½g½g ½g½gû¼gô¼gí¼gæ¼gß¼gؼgѼgʼgüg¼¼gµ¼g®¼g§¼g ¼g™¼g’¼g‹¼g„¼g}¼gv¼go¼gh¼ga¼gZ¼gS¼gL¼gE¼g>¼g7¼g0¼g)¼g"¼g¼g¼g ¼g¼gÿ»gø»gñ»gê»gã»gÜ»gÕ»gλgÇ»gÀ»g¹»g²»g«»g¤»g»g–»g»gˆ»g»gz»gs»gl»ge»g^»gW»gP»gI»gB»g;»g4»g-»g&»g»g»g»g »g»güºgõºgîºgçºgàºgÙºgÒºg˺gĺg½ºg¶ºg¯ºg¨ºg¡ºgšºg“ºgŒºg…ºg~ºgwºgpºgiºgbºg[ºgTºgMºgFºg?ºg8ºg1ºg*ºg#ºgºgºgºgºgºgù¹gò¹gë¹gä¹gݹgÖ¹gϹgȹgÁ¹gº¹g³¹g¬¹g¥¹gž¹g—¹g¹g‰¹g‚¹g{¹gt¹gm¹gf¹g_¹gX¹gQ¹gJ¹gC¹g<¹g5¹g.¹g'¹g ¹g¹g¹g ¹g¹gý¸gö¸gï¸gè¸gá¸gÚ¸gÓ¸g̸gŸg¾¸g·¸g°¸g©¸g¢¸g›¸g”¸g¸g†¸g¸gx¸gq¸gj¸gc¸g\¸gU¸gN¸gG¸g@¸g9¸g2¸g+¸g$¸g¸g¸g¸g¸g¸gú·gó·gì·gå·gÞ·g×·gзgÉ·g·g»·g´·g­·g¦·gŸ·g˜·g‘·gŠ·gƒ·g|·gu·gn·gg·g`·gY·gR·gK·gD·g=·g6·g/·g(·g!·g·g·g ·g·gþ¶g÷¶gð¶gé¶gâ¶gÛ¶gÔ¶gͶgƶg¿¶g¸¶g±¶gª¶g£¶gœ¶g•¶g޶g‡¶g€¶gy¶gr¶gk¶gd¶g]¶gV¶gO¶gH¶gA¶g:¶g3¶g,¶g%¶g¶g¶g¶g ¶g¶gûµgôµgíµgæµgßµgصgѵgʵgõg¼µgµµg®µg§µg µg™µg’µg‹µg„µg}µgvµgoµghµgaµgZµgSµgLµgEµg>µg7µg0µg)µg"µgµgµg µgµgÿ´gø´gñ´gê´gã´gÜ´gÕ´gδgÇ´gÀ´g¹´g²´g«´g¤´g´g–´g´gˆ´g´gz´gs´gl´ge´g^´gW´gP´gI´gB´g;´g4´g-´g&´g´g´g´g ´g´gü³gõ³gî³gç³gà³gÙ³gÒ³g˳gijg½³g¶³g¯³g¨³g¡³gš³g“³gŒ³g…³g~³gw³gp³gi³gb³g[³gT³gM³gF³g?³g8³g1³g*³g#³g³g³g³g³g³gù²gò²gë²gä²gݲgÖ²gϲgȲgÁ²gº²g³²g¬²g¥²gž²g—²g²g‰²g‚²g{²gt²gm²gf²g_²gX²gQ²gJ²gC²g<²g5²g.²g'²g ²g²g²g ²g²gý±gö±gï±gè±gá±gÚ±gÓ±g̱gűg¾±g·±g°±g©±g¢±g›±g”±g±g†±g±gx±gq±gj±gc±g\±gU±gN±gG±g@±g9±g2±g+±g$±g±g±g±g±g±gú°gó°gì°gå°gÞ°g×°gаgɰg°g»°g´°g­°g¦°gŸ°g˜°g‘°gаgƒ°g|°gu°gn°gg°g`°gY°gR°gK°gD°g=°g6°g/°g(°g!°g°g°g °g°gþ¯g÷¯gð¯gé¯gâ¯gÛ¯gÔ¯gͯgƯg¿¯g¸¯g±¯gª¯g£¯gœ¯g•¯gޝg‡¯g€¯gy¯gr¯gk¯gd¯g]¯gV¯gO¯gH¯gA¯g:¯g3¯g,¯g%¯g¯g¯g¯g ¯g¯gû®gô®gí®gæ®gß®gØ®gÑ®gÊ®gîg¼®gµ®g®®g§®g ®g™®g’®g‹®g„®g}®gv®go®gh®ga®gZ®gS®gL®gE®g>®g7®g0®g)®g"®g®g®g ®g®gÿ­gø­gñ­gê­gã­gÜ­gÕ­gέgÇ­gÀ­g¹­g²­g«­g¤­g­g–­g­gˆ­g­gz­gs­gl­ge­g^­gW­gP­gI­gB­g;­g4­g-­g&­g­g­g­g ­g­gü¬gõ¬gî¬gç¬gà¬gÙ¬gÒ¬gˬgĬg½¬g¶¬g¯¬g¨¬g¡¬gš¬g“¬gŒ¬g…¬g~¬gw¬gp¬gi¬gb¬g[¬gT¬gM¬gF¬g?¬g8¬g1¬g*¬g#¬g¬g¬g¬g¬g¬gù«gò«gë«gä«gÝ«gÖ«gÏ«gÈ«gÁ«gº«g³«g¬«g¥«gž«g—«g«g‰«g‚«g{«gt«gm«gf«g_«gX«gQ«gJ«gC«g<«g5«g.«g'«g «g«g«g «g«gýªgöªgïªgèªgáªgÚªgÓªg̪gŪg¾ªg·ªg°ªg©ªg¢ªg›ªg”ªgªg†ªgªgxªgqªgjªgcªg\ªgUªgNªgGªg@ªg9ªg2ªg+ªg$ªgªgªgªgªgªgú©gó©gì©gå©gÞ©gשgЩgÉ©g©g»©g´©g­©g¦©gŸ©g˜©g‘©gŠ©gƒ©g|©gu©gn©gg©g`©gY©gR©gK©gD©g=©g6©g/©g(©g!©g©g©g ©g©gþ¨g÷¨gð¨gé¨gâ¨gÛ¨gÔ¨gͨgƨg¿¨g¸¨g±¨gª¨g£¨gœ¨g•¨gލg‡¨g€¨gy¨gr¨gk¨gd¨g]¨gV¨gO¨gH¨gA¨g:¨g3¨g,¨g%¨g¨g¨g¨g ¨g¨gû§gô§gí§gæ§gß§gاgѧgʧgçg¼§gµ§g®§g§§g §g™§g’§g‹§g„§g}§gv§go§gh§ga§gZ§gS§gL§gE§g>§g7§g0§g)§g"§g§g§g §g§gÿ¦gø¦gñ¦gê¦gã¦gܦgÕ¦gΦgǦgÀ¦g¹¦g²¦g«¦g¤¦g¦g–¦g¦gˆ¦g¦gz¦gs¦gl¦ge¦g^¦gW¦gP¦gI¦gB¦g;¦g4¦g-¦g&¦g¦g¦g¦g ¦g¦gü¥gõ¥gî¥gç¥gà¥gÙ¥gÒ¥gË¥gÄ¥g½¥g¶¥g¯¥g¨¥g¡¥gš¥g“¥gŒ¥g…¥g~¥gw¥gp¥gi¥gb¥g[¥gT¥gM¥gF¥g?¥g8¥g1¥g*¥g#¥g¥g¥g¥g¥g¥gù¤gò¤gë¤gä¤gݤgÖ¤gϤgȤgÁ¤gº¤g³¤g¬¤g¥¤gž¤g—¤g¤g‰¤g‚¤g{¤gt¤gm¤gf¤g_¤gX¤gQ¤gJ¤gC¤g<¤g5¤g.¤g'¤g ¤g¤g¤g ¤g¤gý£gö£gï£gè£gá£gÚ£gÓ£gÌ£gÅ£g¾£g·£g°£g©£g¢£g›£g”£g£g†£g£gx£gq£gj£gc£g\£gU£gN£gG£g@£g9£g2£g+£g$£g£g£g£g£g£gú¢gó¢gì¢gå¢gÞ¢g×¢gТgÉ¢g¢g»¢g´¢g­¢g¦¢gŸ¢g˜¢g‘¢gŠ¢gƒ¢g|¢gu¢gn¢gg¢g`¢gY¢gR¢gK¢gD¢g=¢g6¢g/¢g(¢g!¢g¢g¢g ¢g¢gþ¡g÷¡gð¡gé¡gâ¡gÛ¡gÔ¡gÍ¡gÆ¡g¿¡g¸¡g±¡gª¡g£¡gœ¡g•¡gŽ¡g‡¡g€¡gy¡gr¡gk¡gd¡g]¡gV¡gO¡gH¡gA¡g:¡g3¡g,¡g%¡g¡g¡g¡g ¡g¡gû gô gí gæ gß gØ gÑ gÊ gàg¼ gµ g® g§ g  g™ g’ g‹ g„ g} gv go gh ga gZ gS gL gE g> g7 g0 g) g" g g g  g gÿŸgøŸgñŸgêŸgãŸgÜŸgÕŸgΟgÇŸgÀŸg¹Ÿg²Ÿg«Ÿg¤ŸgŸg–ŸgŸgˆŸgŸgzŸgsŸglŸgeŸg^ŸgWŸgPŸgIŸgBŸg;Ÿg4Ÿg-Ÿg&ŸgŸgŸgŸg ŸgŸgüžgõžgîžgçžgàžgÙžgÒžgËžgÄžg½žg¶žg¯žg¨žg¡žgšžg“žgŒžg…žg~žgwžgpžgižgbžg[žgTžgMžgFžg?žg8žg1žg*žg#žgžgžgžgžgžgùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg™g7™g0™g)™g"™g™g™g ™g™gÿ˜gø˜gñ˜gê˜gã˜gܘgÕ˜gΘgǘgÀ˜g¹˜g²˜g«˜g¤˜g˜g–˜g˜gˆ˜g˜gz˜gs˜gl˜ge˜g^˜gW˜gP˜gI˜gB˜g;˜g4˜g-˜g&˜g˜g˜g˜g ˜g˜gü—gõ—gî—gç—gà—gÙ—gÒ—gË—gÄ—g½—g¶—g¯—g¨—g¡—gš—g“—gŒ—g…—g~—gw—gp—gi—gb—g[—gT—gM—gF—g?—g8—g1—g*—g#—g—g—g—g—g—gù–gò–gë–gä–gÝ–gÖ–gÏ–gÈ–gÁ–gº–g³–g¬–g¥–gž–g—–g–g‰–g‚–g{–gt–gm–gf–g_–gX–gQ–gJ–gC–g<–g5–g.–g'–g –g–g–g –g–gý•gö•gï•gè•gá•gÚ•gÓ•gÌ•gÅ•g¾•g·•g°•g©•g¢•g›•g”•g•g†•g•gx•gq•gj•gc•g\•gU•gN•gG•g@•g9•g2•g+•g$•g•g•g•g•g•gú”gó”gì”gå”gÞ”g×”gДgÉ”g”g»”g´”g­”g¦”gŸ”g˜”g‘”gŠ”gƒ”g|”gu”gn”gg”g`”gY”gR”gK”gD”g=”g6”g/”g(”g!”g”g”g ”g”gþ“g÷“gð“gé“gâ“gÛ“gÔ“gÍ“gÆ“g¿“g¸“g±“gª“g£“gœ“g•“gŽ“g‡“g€“gy“gr“gk“gd“g]“gV“gO“gH“gA“g:“g3“g,“g%“g“g“g“g “g“gû’gô’gí’gæ’gß’gØ’gÑ’gÊ’gÃ’g¼’gµ’g®’g§’g ’g™’g’’g‹’g„’g}’gv’go’gh’ga’gZ’gS’gL’gE’g>’g7’g0’g)’g"’g’g’g ’g’gÿ‘gø‘gñ‘gê‘gã‘gÜ‘gÕ‘gΑgÇ‘gÀ‘g¹‘g²‘g«‘g¤‘g‘g–‘g‘gˆ‘g‘gz‘gs‘gl‘ge‘g^‘gW‘gP‘gI‘gB‘g;‘g4‘g-‘g&‘g‘g‘g‘g ‘g‘gügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg‹g7‹g0‹g)‹g"‹g‹g‹g ‹g‹gÿŠgøŠgñŠgêŠgãŠgÜŠgÕŠgΊgÇŠgÀŠg¹Šg²Šg«Šg¤ŠgŠg–ŠgŠgˆŠgŠgzŠgsŠglŠgeŠg^ŠgWŠgPŠgIŠgBŠg;Šg4Šg-Šg&ŠgŠgŠgŠg ŠgŠgü‰gõ‰gî‰gç‰gà‰gÙ‰gÒ‰gˉgĉg½‰g¶‰g¯‰g¨‰g¡‰gš‰g“‰gŒ‰g…‰g~‰gw‰gp‰gi‰gb‰g[‰gT‰gM‰gF‰g?‰g8‰g1‰g*‰g#‰g‰g‰g‰g‰g‰gùˆgòˆgëˆgäˆg݈gÖˆgψgȈgÁˆgºˆg³ˆg¬ˆg¥ˆgžˆg—ˆgˆg‰ˆg‚ˆg{ˆgtˆgmˆgfˆg_ˆgXˆgQˆgJˆgCˆg<ˆg5ˆg.ˆg'ˆg ˆgˆgˆg ˆgˆgý‡gö‡gï‡gè‡gá‡gÚ‡gÓ‡ġgŇg¾‡g·‡g°‡g©‡g¢‡g›‡g”‡g‡g†‡g‡gx‡gq‡gj‡gc‡g\‡gU‡gN‡gG‡g@‡g9‡g2‡g+‡g$‡g‡g‡g‡g‡g‡gú†gó†gì†gå†gÞ†g׆gІgɆg†g»†g´†g­†g¦†gŸ†g˜†g‘†gІgƒ†g|†gu†gn†gg†g`†gY†gR†gK†gD†g=†g6†g/†g(†g!†g†g†g †g†gþ…g÷…gð…gé…gâ…gÛ…gÔ…gÍ…gÆ…g¿…g¸…g±…gª…g£…gœ…g•…gŽ…g‡…g€…gy…gr…gk…gd…g]…gV…gO…gH…gA…g:…g3…g,…g%…g…g…g…g …g…gû„gô„gí„gæ„gß„gØ„gÑ„gÊ„gÄg¼„gµ„g®„g§„g „g™„g’„g‹„g„„g}„gv„go„gh„ga„gZ„gS„gL„gE„g>„g7„g0„g)„g"„g„g„g „g„gÿƒgøƒgñƒgêƒgãƒg܃gÕƒg΃gǃgÀƒg¹ƒg²ƒg«ƒg¤ƒgƒg–ƒgƒgˆƒgƒgzƒgsƒglƒgeƒg^ƒgWƒgPƒgIƒgBƒg;ƒg4ƒg-ƒg&ƒgƒgƒgƒg ƒgƒgü‚gõ‚gî‚gç‚gà‚gÙ‚gÒ‚gË‚gÄ‚g½‚g¶‚g¯‚g¨‚g¡‚gš‚g“‚gŒ‚g…‚g~‚gw‚gp‚gi‚gb‚g[‚gT‚gM‚gF‚g?‚g8‚g1‚g*‚g#‚g‚g‚g‚g‚g‚gùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg}g7}g0}g)}g"}g}g}g }g}gÿ|gø|gñ|gê|gã|gÜ|gÕ|gÎ|gÇ|gÀ|g¹|g²|g«|g¤|g|g–|g|gˆ|g|gz|gs|gl|ge|g^|gW|gP|gI|gB|g;|g4|g-|g&|g|g|g|g |g|gü{gõ{gî{gç{gà{gÙ{gÒ{gË{gÄ{g½{g¶{g¯{g¨{g¡{gš{g“{gŒ{g…{g~{gw{gp{gi{gb{g[{gT{gM{gF{g?{g8{g1{g*{g#{g{g{g{g{g{gùzgòzgëzgäzgÝzgÖzgÏzgÈzgÁzgºzg³zg¬zg¥zgžzg—zgzg‰zg‚zg{zgtzgmzgfzg_zgXzgQzgJzgCzgvg7vg0vg)vg"vgvgvg vgvgÿugøugñugêugãugÜugÕugÎugÇugÀug¹ug²ug«ug¤ugug–ugugˆugugzugsuglugeug^ugWugPugIugBug;ug4ug-ug&ugugugug ugugütgõtgîtgçtgàtgÙtgÒtgËtgÄtg½tg¶tg¯tg¨tg¡tgštg“tgŒtg…tg~tgwtgptgitgbtg[tgTtgMtgFtg?tg8tg1tg*tg#tgtgtgtgtgtgùsgòsgësgäsgÝsgÖsgÏsgÈsgÁsgºsg³sg¬sg¥sgžsg—sgsg‰sg‚sg{sgtsgmsgfsg_sgXsgQsgJsgCsgog7og0og)og"ogogog ogogÿngøngñngêngãngÜngÕngÎngÇngÀng¹ng²ng«ng¤ngng–ngngˆngngzngsnglngeng^ngWngPngIngBng;ng4ng-ng&ngngngng ngngümgõmgîmgçmgàmgÙmgÒmgËmgÄmg½mg¶mg¯mg¨mg¡mgšmg“mgŒmg…mg~mgwmgpmgimgbmg[mgTmgMmgFmg?mg8mg1mg*mg#mgmgmgmgmgmgùlgòlgëlgälgÝlgÖlgÏlgÈlgÁlgºlg³lg¬lg¥lgžlg—lglg‰lg‚lg{lgtlgmlgflg_lgXlgQlgJlgClghg7hg0hg)hg"hghghg hghgÿggøggñggêggãggÜggÕggÎggÇggÀgg¹gg²gg«gg¤gggg–ggggˆggggzggsgglggegg^ggWggPggIggBgg;gg4gg-gg&gggggggg ggggüfgõfgîfgçfgàfgÙfgÒfgËfgÄfg½fg¶fg¯fg¨fg¡fgšfg“fgŒfg…fg~fgwfgpfgifgbfg[fgTfgMfgFfg?fg8fg1fg*fg#fgfgfgfgfgfgùegòegëegäegÝegÖegÏegÈegÁegºeg³eg¬eg¥egžeg—egeg‰eg‚eg{egtegmegfeg_egXegQegJegCegag7ag0ag)ag"agagag agagÿ`gø`gñ`gê`gã`gÜ`gÕ`gÎ`gÇ`gÀ`g¹`g²`g«`g¤`g`g–`g`gˆ`g`gz`gs`gl`ge`g^`gW`gP`gI`gB`g;`g4`g-`g&`g`g`g`g `g`gü_gõ_gî_gç_gà_gÙ_gÒ_gË_gÄ_g½_g¶_g¯_g¨_g¡_gš_g“_gŒ_g…_g~_gw_gp_gi_gb_g[_gT_gM_gF_g?_g8_g1_g*_g#_g_g_g_g_g_gù^gò^gë^gä^gÝ^gÖ^gÏ^gÈ^gÁ^gº^g³^g¬^g¥^gž^g—^g^g‰^g‚^g{^gt^gm^gf^g_^gX^gQ^gJ^gC^g<^g5^g.^g'^g ^g^g^g ^g^gý]gö]gï]gè]gá]gÚ]gÓ]gÌ]gÅ]g¾]g·]g°]g©]g¢]g›]g”]g]g†]g]gx]gq]gj]gc]g\]gU]gN]gG]g@]g9]g2]g+]g$]g]g]g]g]g]gú\gó\gì\gå\gÞ\g×\gÐ\gÉ\gÂ\g»\g´\g­\g¦\gŸ\g˜\g‘\gŠ\gƒ\g|\gu\gn\gg\g`\gY\gR\gK\gD\g=\g6\g/\g(\g!\g\g\g \g\gþ[g÷[gð[gé[gâ[gÛ[gÔ[gÍ[gÆ[g¿[g¸[g±[gª[g£[gœ[g•[gŽ[g‡[g€[gy[gr[gk[gd[g][gV[gO[gH[gA[g:[g3[g,[g%[g[g[g[g [g[gûZgôZgíZgæZgßZgØZgÑZgÊZgÃZg¼ZgµZg®Zg§Zg Zg™Zg’Zg‹Zg„Zg}ZgvZgoZghZgaZgZZgSZgLZgEZg>Zg7Zg0Zg)Zg"ZgZgZg ZgZgÿYgøYgñYgêYgãYgÜYgÕYgÎYgÇYgÀYg¹Yg²Yg«Yg¤YgYg–YgYgˆYgYgzYgsYglYgeYg^YgWYgPYgIYgBYg;Yg4Yg-Yg&YgYgYgYg YgYgüXgõXgîXgçXgàXgÙXgÒXgËXgÄXg½Xg¶Xg¯Xg¨Xg¡XgšXg“XgŒXg…Xg~XgwXgpXgiXgbXg[XgTXgMXgFXg?Xg8Xg1Xg*Xg#XgXgXgXgXgXgùWgòWgëWgäWgÝWgÖWgÏWgÈWgÁWgºWg³Wg¬Wg¥WgžWg—WgWg‰Wg‚Wg{WgtWgmWgfWg_WgXWgQWgJWgCWgSg7Sg0Sg)Sg"SgSgSg SgSgÿRgøRgñRgêRgãRgÜRgÕRgÎRgÇRgÀRg¹Rg²Rg«Rg¤RgRg–RgRgˆRgRgzRgsRglRgeRg^RgWRgPRgIRgBRg;Rg4Rg-Rg&RgRgRgRg RgRgüQgõQgîQgçQgàQgÙQgÒQgËQgÄQg½Qg¶Qg¯Qg¨Qg¡QgšQg“QgŒQg…Qg~QgwQgpQgiQgbQg[QgTQgMQgFQg?Qg8Qg1Qg*Qg#QgQgQgQgQgQgùPgòPgëPgäPgÝPgÖPgÏPgÈPgÁPgºPg³Pg¬Pg¥PgžPg—PgPg‰Pg‚Pg{PgtPgmPgfPg_PgXPgQPgJPgCPgLg7Lg0Lg)Lg"LgLgLg LgLgÿKgøKgñKgêKgãKgÜKgÕKgÎKgÇKgÀKg¹Kg²Kg«Kg¤KgKg–KgKgˆKgKgzKgsKglKgeKg^KgWKgPKgIKgBKg;Kg4Kg-Kg&KgKgKgKg KgKgüJgõJgîJgçJgàJgÙJgÒJgËJgÄJg½Jg¶Jg¯Jg¨Jg¡JgšJg“JgŒJg…Jg~JgwJgpJgiJgbJg[JgTJgMJgFJg?Jg8Jg1Jg*Jg#JgJgJgJgJgJgùIgòIgëIgäIgÝIgÖIgÏIgÈIgÁIgºIg³Ig¬Ig¥IgžIg—IgIg‰Ig‚Ig{IgtIgmIgfIg_IgXIgQIgJIgCIgEg7Eg0Eg)Eg"EgEgEg EgEgÿDgøDgñDgêDgãDgÜDgÕDgÎDgÇDgÀDg¹Dg²Dg«Dg¤DgDg–DgDgˆDgDgzDgsDglDgeDg^DgWDgPDgIDgBDg;Dg4Dg-Dg&DgDgDgDg DgDgüCgõCgîCgçCgàCgÙCgÒCgËCgÄCg½Cg¶Cg¯Cg¨Cg¡CgšCg“CgŒCg…Cg~CgwCgpCgiCgbCg[CgTCgMCgFCg?Cg8Cg1Cg*Cg#CgCgCgCgCgCgùBgòBgëBgäBgÝBgÖBgÏBgÈBgÁBgºBg³Bg¬Bg¥BgžBg—BgBg‰Bg‚Bg{BgtBgmBgfBg_BgXBgQBgJBgCBggô>gí>gæ>gß>gØ>gÑ>gÊ>gÃ>g¼>gµ>g®>g§>g >g™>g’>g‹>g„>g}>gv>go>gh>ga>gZ>gS>gL>gE>g>>g7>g0>g)>g">g>g>g >g>gÿ=gø=gñ=gê=gã=gÜ=gÕ=gÎ=gÇ=gÀ=g¹=g²=g«=g¤=g=g–=g=gˆ=g=gz=gs=gl=ge=g^=gW=gP=gI=gB=g;=g4=g-=g&=g=g=g=g =g=gü7g77g07g)7g"7g7g7g 7g7gÿ6gø6gñ6gê6gã6gÜ6gÕ6gÎ6gÇ6gÀ6g¹6g²6g«6g¤6g6g–6g6gˆ6g6gz6gs6gl6ge6g^6gW6gP6gI6gB6g;6g46g-6g&6g6g6g6g 6g6gü5gõ5gî5gç5gà5gÙ5gÒ5gË5gÄ5g½5g¶5g¯5g¨5g¡5gš5g“5gŒ5g…5g~5gw5gp5gi5gb5g[5gT5gM5gF5g?5g85g15g*5g#5g5g5g5g5g5gù4gò4gë4gä4gÝ4gÖ4gÏ4gÈ4gÁ4gº4g³4g¬4g¥4gž4g—4g4g‰4g‚4g{4gt4gm4gf4g_4gX4gQ4gJ4gC4g<4g54g.4g'4g 4g4g4g 4g4gý3gö3gï3gè3gá3gÚ3gÓ3gÌ3gÅ3g¾3g·3g°3g©3g¢3g›3g”3g3g†3g3gx3gq3gj3gc3g\3gU3gN3gG3g@3g93g23g+3g$3g3g3g3g3g3gú2gó2gì2gå2gÞ2g×2gÐ2gÉ2gÂ2g»2g´2g­2g¦2gŸ2g˜2g‘2gŠ2gƒ2g|2gu2gn2gg2g`2gY2gR2gK2gD2g=2g62g/2g(2g!2g2g2g 2g2gþ1g÷1gð1gé1gâ1gÛ1gÔ1gÍ1gÆ1g¿1g¸1g±1gª1g£1gœ1g•1gŽ1g‡1g€1gy1gr1gk1gd1g]1gV1gO1gH1gA1g:1g31g,1g%1g1g1g1g 1g1gû0gô0gí0gæ0gß0gØ0gÑ0gÊ0gÃ0g¼0gµ0g®0g§0g 0g™0g’0g‹0g„0g}0gv0go0gh0ga0gZ0gS0gL0gE0g>0g70g00g)0g"0g0g0g 0g0gÿ/gø/gñ/gê/gã/gÜ/gÕ/gÎ/gÇ/gÀ/g¹/g²/g«/g¤/g/g–/g/gˆ/g/gz/gs/gl/ge/g^/gW/gP/gI/gB/g;/g4/g-/g&/g/g/g/g /g/gü.gõ.gî.gç.gà.gÙ.gÒ.gË.gÄ.g½.g¶.g¯.g¨.g¡.gš.g“.gŒ.g….g~.gw.gp.gi.gb.g[.gT.gM.gF.g?.g8.g1.g*.g#.g.g.g.g.g.gù-gò-gë-gä-gÝ-gÖ-gÏ-gÈ-gÁ-gº-g³-g¬-g¥-gž-g—-g-g‰-g‚-g{-gt-gm-gf-g_-gX-gQ-gJ-gC-g<-g5-g.-g'-g -g-g-g -g-gý,gö,gï,gè,gá,gÚ,gÓ,gÌ,gÅ,g¾,g·,g°,g©,g¢,g›,g”,g,g†,g,gx,gq,gj,gc,g\,gU,gN,gG,g@,g9,g2,g+,g$,g,g,g,g,g,gú+gó+gì+gå+gÞ+g×+gÐ+gÉ+gÂ+g»+g´+g­+g¦+gŸ+g˜+g‘+gŠ+gƒ+g|+gu+gn+gg+g`+gY+gR+gK+gD+g=+g6+g/+g(+g!+g+g+g +g+gþ*g÷*gð*gé*gâ*gÛ*gÔ*gÍ*gÆ*g¿*g¸*g±*gª*g£*gœ*g•*gŽ*g‡*g€*gy*gr*gk*gd*g]*gV*gO*gH*gA*g:*g3*g,*g%*g*g*g*g *g*gû)gô)gí)gæ)gß)gØ)gÑ)gÊ)gÃ)g¼)gµ)g®)g§)g )g™)g’)g‹)g„)g})gv)go)gh)ga)gZ)gS)gL)gE)g>)g7)g0)g))g")g)g)g )g)gÿ(gø(gñ(gê(gã(gÜ(gÕ(gÎ(gÇ(gÀ(g¹(g²(g«(g¤(g(g–(g(gˆ(g(gz(gs(gl(ge(g^(gW(gP(gI(gB(g;(g4(g-(g&(g(g(g(g (g(gü'gõ'gî'gç'gà'gÙ'gÒ'gË'gÄ'g½'g¶'g¯'g¨'g¡'gš'g“'gŒ'g…'g~'gw'gp'gi'gb'g['gT'gM'gF'g?'g8'g1'g*'g#'g'g'g'g'g'gù&gò&gë&gä&gÝ&gÖ&gÏ&gÈ&gÁ&gº&g³&g¬&g¥&gž&g—&g&g‰&g‚&g{&gt&gm&gf&g_&gX&gQ&gJ&gC&g<&g5&g.&g'&g &g&g&g &g&gý%gö%gï%gè%gá%gÚ%gÓ%gÌ%gÅ%g¾%g·%g°%g©%g¢%g›%g”%g%g†%g%gx%gq%gj%gc%g\%gU%gN%gG%g@%g9%g2%g+%g$%g%g%g%g%g%gú$gó$gì$gå$gÞ$g×$gÐ$gÉ$gÂ$g»$g´$g­$g¦$gŸ$g˜$g‘$gŠ$gƒ$g|$gu$gn$gg$g`$gY$gR$gK$gD$g=$g6$g/$g($g!$g$g$g $g$gþ#g÷#gð#gé#gâ#gÛ#gÔ#gÍ#gÆ#g¿#g¸#g±#gª#g£#gœ#g•#gŽ#g‡#g€#gy#gr#gk#gd#g]#gV#gO#gH#gA#g:#g3#g,#g%#g#g#g#g #g#gû"gô"gí"gæ"gß"gØ"gÑ"gÊ"gÃ"g¼"gµ"g®"g§"g "g™"g’"g‹"g„"g}"gv"go"gh"ga"gZ"gS"gL"gE"g>"g7"g0"g)"g""g"g"g "g"gÿ!gø!gñ!gê!gã!gÜ!gÕ!gÎ!gÇ!gÀ!g¹!g²!g«!g¤!g!g–!g!gˆ!g!gz!gs!gl!ge!g^!gW!gP!gI!gB!g;!g4!g-!g&!g!g!g!g !g!gü gõ gî gç gà gÙ gÒ gË gÄ g½ g¶ g¯ g¨ g¡ gš g“ gŒ g… g~ gw gp gi gb g[ gT gM gF g? g8 g1 g* g# g g g g g gùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg<g5g.g'g ggg ggýgögïgègágÚgÓgÌgÅg¾g·g°g©g¢g›g”gg†ggxgqgjgcg\gUgNgGg@g9g2g+g$ggggggúgógìgågÞg×gÐgÉgÂg»g´g­g¦gŸg˜g‘gŠgƒg|gugnggg`gYgRgKgDg=g6g/g(g!ggg ggþg÷gðgégâgÛgÔgÍgÆg¿g¸g±gªg£gœg•gŽg‡g€gygrgkgdg]gVgOgHgAg:g3g,g%gggg ggûgôgígægßgØgÑgÊgÃg¼gµg®g§g g™g’g‹g„g}gvgoghgagZgSgLgEg>g7g0g)g"ggg ggÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg<g5g.g'g ggg ggýgögïgègágÚgÓgÌgÅg¾g·g°g©g¢g›g”gg†ggxgqgjgcg\gUgNgGg@g9g2g+g$ggggggúgógìgågÞg×gÐgÉgÂg»g´g­g¦gŸg˜g‘gŠgƒg|gugnggg`gYgRgKgDg=g6g/g(g!ggg ggþg÷gðgégâgÛgÔgÍgÆg¿g¸g±gªg£gœg•gŽg‡g€gygrgkgdg]gVgOgHgAg:g3g,g%gggg ggûgôgígægßgØgÑgÊgÃg¼gµg®g§g g™g’g‹g„g}gvgoghgagZgSgLgEg>g7g0g)g"ggg ggÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg<g5g.g'g ggg ggýgögïgègágÚgÓgÌgÅg¾g·g°g©g¢g›g”gg†ggxgqgjgcg\gUgNgGg@g9g2g+g$ggggggúgógìgågÞg×gÐgÉgÂg»g´g­g¦gŸg˜g‘gŠgƒg|gugnggg`gYgRgKgDg=g6g/g(g!ggg ggþg÷gðgégâgÛgÔgÍgÆg¿g¸g±gªg£gœg•gŽg‡g€gygrgkgdg]gVgOgHgAg:g3g,g%gggg ggû gô gí gæ gß gØ gÑ gÊ gà g¼ gµ g® g§ g  g™ g’ g‹ g„ g} gv go gh ga gZ gS gL gE g> g7 g0 g) g" g g g g gÿ gø gñ gê gã gÜ gÕ gÎ gÇ gÀ g¹ g² g« g¤ g g– g gˆ g gz gs gl ge g^ gW gP gI gB g; g4 g- g& g g g g g gü gõ gî gç gà gÙ gÒ gË gÄ g½ g¶ g¯ g¨ g¡ gš g“ gŒ g… g~ gw gp gi gb g[ gT gM gF g? g8 g1 g* g# g g g g g gù gò gë gä gÝ gÖ gÏ gÈ gÁ gº g³ g¬ g¥ gž g— g g‰ g‚ g{ gt gm gf g_ gX gQ gJ gC g< g5 g. g' g g g g g gý gö gï gè gá gÚ gÓ gÌ gÅ g¾ g· g° g© g¢ g› g” g g† g gx gq gj gc g\ gU gN gG g@ g9 g2 g+ g$ g g g g g gúgógìgågÞg×gÐgÉgÂg»g´g­g¦gŸg˜g‘gŠgƒg|gugnggg`gYgRgKgDg=g6g/g(g!ggg ggþg÷gðgégâgÛgÔgÍgÆg¿g¸g±gªg£gœg•gŽg‡g€gygrgkgdg]gVgOgHgAg:g3g,g%gggg ggûgôgígægßgØgÑgÊgÃg¼gµg®g§g g™g’g‹g„g}gvgoghgagZgSgLgEg>g7g0g)g"ggg ggÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCg<g5g.g'g ggg ggýgögïgègágÚgÓgÌgÅg¾g·g°g©g¢g›g”gg†ggxgqgjgcg\gUgNgGg@g9g2g+g$ggggggúgógìgågÞg×gÐgÉgÂg»g´g­g¦gŸg˜g‘gŠgƒg|gugnggg`gYgRgKgDg=g6g/g(g!ggg ggþg÷gðgégâgÛgÔgÍgÆg¿g¸g±gªg£gœg•gŽg‡g€gygrgkgdg]gVgOgHgAg:g3g,g%gggg ggûÿfôÿfíÿfæÿfßÿfØÿfÑÿfÊÿfÃÿf¼ÿfµÿf®ÿf§ÿf ÿf™ÿf’ÿf‹ÿf„ÿf}ÿfvÿfoÿfhÿfaÿfZÿfSÿfLÿfEÿf>ÿf7ÿf0ÿf)ÿf"ÿfÿfÿf ÿfÿfÿþføþfñþfêþfãþfÜþfÕþfÎþfÇþfÀþf¹þf²þf«þf¤þfþf–þfþfˆþfþfzþfsþflþfeþf^þfWþfPþfIþfBþf;þf4þf-þf&þfþfþfþf þfþfüýfõýfîýfçýfàýfÙýfÒýfËýfÄýf½ýf¶ýf¯ýf¨ýf¡ýfšýf“ýfŒýf…ýf~ýfwýfpýfiýfbýf[ýfTýfMýfFýf?ýf8ýf1ýf*ýf#ýfýfýfýfýfýfùüfòüfëüfäüfÝüfÖüfÏüfÈüfÁüfºüf³üf¬üf¥üfžüf—üfüf‰üf‚üf{üftüfmüffüf_üfXüfQüfJüfCüf<üf5üf.üf'üf üfüfüf üfüfýûföûfïûfèûfáûfÚûfÓûfÌûfÅûf¾ûf·ûf°ûf©ûf¢ûf›ûf”ûfûf†ûfûfxûfqûfjûfcûf\ûfUûfNûfGûf@ûf9ûf2ûf+ûf$ûfûfûfûfûfûfúúfóúfìúfåúfÞúf×úfÐúfÉúfÂúf»úf´úf­úf¦úfŸúf˜úf‘úfŠúfƒúf|úfuúfnúfgúf`úfYúfRúfKúfDúf=úf6úf/úf(úf!úfúfúf úfúfþùf÷ùfðùféùfâùfÛùfÔùfÍùfÆùf¿ùf¸ùf±ùfªùf£ùfœùf•ùfŽùf‡ùf€ùfyùfrùfkùfdùf]ùfVùfOùfHùfAùf:ùf3ùf,ùf%ùfùfùfùf ùfùfûøfôøfíøfæøfßøfØøfÑøfÊøfÃøf¼øfµøf®øf§øf øf™øf’øf‹øf„øf}øfvøfoøfhøfaøfZøfSøfLøfEøf>øf7øf0øf)øf"øføføf øføfÿ÷fø÷fñ÷fê÷fã÷fÜ÷fÕ÷fÎ÷fÇ÷fÀ÷f¹÷f²÷f«÷f¤÷f÷f–÷f÷fˆ÷f÷fz÷fs÷fl÷fe÷f^÷fW÷fP÷fI÷fB÷f;÷f4÷f-÷f&÷f÷f÷f÷f ÷f÷füöfõöfîöfçöfàöfÙöfÒöfËöfÄöf½öf¶öf¯öf¨öf¡öfšöf“öfŒöf…öf~öfwöfpöfiöfböf[öfTöfMöfFöf?öf8öf1öf*öf#öföföföföföfùõfòõfëõfäõfÝõfÖõfÏõfÈõfÁõfºõf³õf¬õf¥õfžõf—õfõf‰õf‚õf{õftõfmõffõf_õfXõfQõfJõfCõf<õf5õf.õf'õf õfõfõf õfõfýôföôfïôfèôfáôfÚôfÓôfÌôfÅôf¾ôf·ôf°ôf©ôf¢ôf›ôf”ôfôf†ôfôfxôfqôfjôfcôf\ôfUôfNôfGôf@ôf9ôf2ôf+ôf$ôfôfôfôfôfôfúófóófìófåófÞóf×ófÐófÉófÂóf»óf´óf­óf¦ófŸóf˜óf‘ófŠófƒóf|ófuófnófgóf`ófYófRófKófDóf=óf6óf/óf(óf!ófófóf ófófþòf÷òfðòféòfâòfÛòfÔòfÍòfÆòf¿òf¸òf±òfªòf£òfœòf•òfŽòf‡òf€òfyòfròfkòfdòf]òfVòfOòfHòfAòf:òf3òf,òf%òfòfòfòf òfòfûñfôñfíñfæñfßñfØñfÑñfÊñfÃñf¼ñfµñf®ñf§ñf ñf™ñf’ñf‹ñf„ñf}ñfvñfoñfhñfañfZñfSñfLñfEñf>ñf7ñf0ñf)ñf"ñfñfñf ñfñfÿðføðfñðfêðfãðfÜðfÕðfÎðfÇðfÀðf¹ðf²ðf«ðf¤ðfðf–ðfðfˆðfðfzðfsðflðfeðf^ðfWðfPðfIðfBðf;ðf4ðf-ðf&ðfðfðfðf ðfðfüïfõïfîïfçïfàïfÙïfÒïfËïfÄïf½ïf¶ïf¯ïf¨ïf¡ïfšïf“ïfŒïf…ïf~ïfwïfpïfiïfbïf[ïfTïfMïfFïf?ïf8ïf1ïf*ïf#ïfïfïfïfïfïfùîfòîfëîfäîfÝîfÖîfÏîfÈîfÁîfºîf³îf¬îf¥îfžîf—îfîf‰îf‚îf{îftîfmîffîf_îfXîfQîfJîfCîf<îf5îf.îf'îf îfîfîf îfîfýíföífïífèífáífÚífÓífÌífÅíf¾íf·íf°íf©íf¢íf›íf”ífíf†ífífxífqífjífcíf\ífUífNífGíf@íf9íf2íf+íf$ífífífífífífúìfóìfììfåìfÞìf×ìfÐìfÉìfÂìf»ìf´ìf­ìf¦ìfŸìf˜ìf‘ìfŠìfƒìf|ìfuìfnìfgìf`ìfYìfRìfKìfDìf=ìf6ìf/ìf(ìf!ìfìfìf ìfìfþëf÷ëfðëféëfâëfÛëfÔëfÍëfÆëf¿ëf¸ëf±ëfªëf£ëfœëf•ëfŽëf‡ëf€ëfyëfrëfkëfdëf]ëfVëfOëfHëfAëf:ëf3ëf,ëf%ëfëfëfëf ëfëfûêfôêfíêfæêfßêfØêfÑêfÊêfÃêf¼êfµêf®êf§êf êf™êf’êf‹êf„êf}êfvêfoêfhêfaêfZêfSêfLêfEêf>êf7êf0êf)êf"êfêfêf êfêfÿéføéfñéfêéfãéfÜéfÕéfÎéfÇéfÀéf¹éf²éf«éf¤éféf–éféfˆéféfzéfséfléfeéf^éfWéfPéfIéfBéf;éf4éf-éf&éféféféf éféfüèfõèfîèfçèfàèfÙèfÒèfËèfÄèf½èf¶èf¯èf¨èf¡èfšèf“èfŒèf…èf~èfwèfpèfièfbèf[èfTèfMèfFèf?èf8èf1èf*èf#èfèfèfèfèfèfùçfòçfëçfäçfÝçfÖçfÏçfÈçfÁçfºçf³çf¬çf¥çfžçf—çfçf‰çf‚çf{çftçfmçffçf_çfXçfQçfJçfCçf<çf5çf.çf'çf çfçfçf çfçfýæföæfïæfèæfáæfÚæfÓæfÌæfÅæf¾æf·æf°æf©æf¢æf›æf”æfæf†æfæfxæfqæfjæfcæf\æfUæfNæfGæf@æf9æf2æf+æf$æfæfæfæfæfæfúåfóåfìåfååfÞåf×åfÐåfÉåfÂåf»åf´åf­åf¦åfŸåf˜åf‘åfŠåfƒåf|åfuåfnåfgåf`åfYåfRåfKåfDåf=åf6åf/åf(åf!åfåfåf åfåfþäf÷äfðäféäfâäfÛäfÔäfÍäfÆäf¿äf¸äf±äfªäf£äfœäf•äfŽäf‡äf€äfyäfräfkäfdäf]äfVäfOäfHäfAäf:äf3äf,äf%äfäfäfäf äfäfûãfôãfíãfæãfßãfØãfÑãfÊãfÃãf¼ãfµãf®ãf§ãf ãf™ãf’ãf‹ãf„ãf}ãfvãfoãfhãfaãfZãfSãfLãfEãf>ãf7ãf0ãf)ãf"ãfãfãf ãfãfÿâføâfñâfêâfãâfÜâfÕâfÎâfÇâfÀâf¹âf²âf«âf¤âfâf–âfâfˆâfâfzâfsâflâfeâf^âfWâfPâfIâfBâf;âf4âf-âf&âfâfâfâf âfâfüáfõáfîáfçáfàáfÙáfÒáfËáfÄáf½áf¶áf¯áf¨áf¡áfšáf“áfŒáf…áf~áfwáfpáfiáfbáf[áfTáfMáfFáf?áf8áf1áf*áf#áfáfáfáfáfáfùàfòàfëàfäàfÝàfÖàfÏàfÈàfÁàfºàf³àf¬àf¥àfžàf—àfàf‰àf‚àf{àftàfmàffàf_àfXàfQàfJàfCàf<àf5àf.àf'àf àfàfàf àfàfýßfößfïßfèßfáßfÚßfÓßfÌßfÅßf¾ßf·ßf°ßf©ßf¢ßf›ßf”ßfßf†ßfßfxßfqßfjßfcßf\ßfUßfNßfGßf@ßf9ßf2ßf+ßf$ßfßfßfßfßfßfúÞfóÞfìÞfåÞfÞÞf×ÞfÐÞfÉÞfÂÞf»Þf´Þf­Þf¦ÞfŸÞf˜Þf‘ÞfŠÞfƒÞf|ÞfuÞfnÞfgÞf`ÞfYÞfRÞfKÞfDÞf=Þf6Þf/Þf(Þf!ÞfÞfÞf ÞfÞfþÝf÷ÝfðÝféÝfâÝfÛÝfÔÝfÍÝfÆÝf¿Ýf¸Ýf±ÝfªÝf£ÝfœÝf•ÝfŽÝf‡Ýf€ÝfyÝfrÝfkÝfdÝf]ÝfVÝfOÝfHÝfAÝf:Ýf3Ýf,Ýf%ÝfÝfÝfÝf ÝfÝfûÜfôÜfíÜfæÜfßÜfØÜfÑÜfÊÜfÃÜf¼ÜfµÜf®Üf§Üf Üf™Üf’Üf‹Üf„Üf}ÜfvÜfoÜfhÜfaÜfZÜfSÜfLÜfEÜf>Üf7Üf0Üf)Üf"ÜfÜfÜf ÜfÜfÿÛføÛfñÛfêÛfãÛfÜÛfÕÛfÎÛfÇÛfÀÛf¹Ûf²Ûf«Ûf¤ÛfÛf–ÛfÛfˆÛfÛfzÛfsÛflÛfeÛf^ÛfWÛfPÛfIÛfBÛf;Ûf4Ûf-Ûf&ÛfÛfÛfÛf ÛfÛfüÚfõÚfîÚfçÚfàÚfÙÚfÒÚfËÚfÄÚf½Úf¶Úf¯Úf¨Úf¡ÚfšÚf“ÚfŒÚf…Úf~ÚfwÚfpÚfiÚfbÚf[ÚfTÚfMÚfFÚf?Úf8Úf1Úf*Úf#ÚfÚfÚfÚfÚfÚfùÙfòÙfëÙfäÙfÝÙfÖÙfÏÙfÈÙfÁÙfºÙf³Ùf¬Ùf¥ÙfžÙf—ÙfÙf‰Ùf‚Ùf{ÙftÙfmÙffÙf_ÙfXÙfQÙfJÙfCÙf<Ùf5Ùf.Ùf'Ùf ÙfÙfÙf ÙfÙfýØföØfïØfèØfáØfÚØfÓØfÌØfÅØf¾Øf·Øf°Øf©Øf¢Øf›Øf”ØfØf†ØfØfxØfqØfjØfcØf\ØfUØfNØfGØf@Øf9Øf2Øf+Øf$ØfØfØfØfØfØfú×fó×fì×få×fÞ×f××fÐ×fÉ×fÂ×f»×f´×f­×f¦×fŸ×f˜×f‘×fŠ×fƒ×f|×fu×fn×fg×f`×fY×fR×fK×fD×f=×f6×f/×f(×f!×f×f×f ×f×fþÖf÷ÖfðÖféÖfâÖfÛÖfÔÖfÍÖfÆÖf¿Öf¸Öf±ÖfªÖf£ÖfœÖf•ÖfŽÖf‡Öf€ÖfyÖfrÖfkÖfdÖf]ÖfVÖfOÖfHÖfAÖf:Öf3Öf,Öf%ÖfÖfÖfÖf ÖfÖfûÕfôÕfíÕfæÕfßÕfØÕfÑÕfÊÕfÃÕf¼ÕfµÕf®Õf§Õf Õf™Õf’Õf‹Õf„Õf}ÕfvÕfoÕfhÕfaÕfZÕfSÕfLÕfEÕf>Õf7Õf0Õf)Õf"ÕfÕfÕf ÕfÕfÿÔføÔfñÔfêÔfãÔfÜÔfÕÔfÎÔfÇÔfÀÔf¹Ôf²Ôf«Ôf¤ÔfÔf–ÔfÔfˆÔfÔfzÔfsÔflÔfeÔf^ÔfWÔfPÔfIÔfBÔf;Ôf4Ôf-Ôf&ÔfÔfÔfÔf ÔfÔfüÓfõÓfîÓfçÓfàÓfÙÓfÒÓfËÓfÄÓf½Óf¶Óf¯Óf¨Óf¡ÓfšÓf“ÓfŒÓf…Óf~ÓfwÓfpÓfiÓfbÓf[ÓfTÓfMÓfFÓf?Óf8Óf1Óf*Óf#ÓfÓfÓfÓfÓfÓfùÒfòÒfëÒfäÒfÝÒfÖÒfÏÒfÈÒfÁÒfºÒf³Òf¬Òf¥ÒfžÒf—ÒfÒf‰Òf‚Òf{ÒftÒfmÒffÒf_ÒfXÒfQÒfJÒfCÒf<Òf5Òf.Òf'Òf ÒfÒfÒf ÒfÒfýÑföÑfïÑfèÑfáÑfÚÑfÓÑfÌÑfÅÑf¾Ñf·Ñf°Ñf©Ñf¢Ñf›Ñf”ÑfÑf†ÑfÑfxÑfqÑfjÑfcÑf\ÑfUÑfNÑfGÑf@Ñf9Ñf2Ñf+Ñf$ÑfÑfÑfÑfÑfÑfúÐfóÐfìÐfåÐfÞÐf×ÐfÐÐfÉÐfÂÐf»Ðf´Ðf­Ðf¦ÐfŸÐf˜Ðf‘ÐfŠÐfƒÐf|ÐfuÐfnÐfgÐf`ÐfYÐfRÐfKÐfDÐf=Ðf6Ðf/Ðf(Ðf!ÐfÐfÐf ÐfÐfþÏf÷ÏfðÏféÏfâÏfÛÏfÔÏfÍÏfÆÏf¿Ïf¸Ïf±ÏfªÏf£ÏfœÏf•ÏfŽÏf‡Ïf€ÏfyÏfrÏfkÏfdÏf]ÏfVÏfOÏfHÏfAÏf:Ïf3Ïf,Ïf%ÏfÏfÏfÏf ÏfÏfûÎfôÎfíÎfæÎfßÎfØÎfÑÎfÊÎfÃÎf¼ÎfµÎf®Îf§Îf Îf™Îf’Îf‹Îf„Îf}ÎfvÎfoÎfhÎfaÎfZÎfSÎfLÎfEÎf>Îf7Îf0Îf)Îf"ÎfÎfÎf ÎfÎfÿÍføÍfñÍfêÍfãÍfÜÍfÕÍfÎÍfÇÍfÀÍf¹Íf²Íf«Íf¤ÍfÍf–ÍfÍfˆÍfÍfzÍfsÍflÍfeÍf^ÍfWÍfPÍfIÍfBÍf;Íf4Íf-Íf&ÍfÍfÍfÍf ÍfÍfüÌfõÌfîÌfçÌfàÌfÙÌfÒÌfËÌfÄÌf½Ìf¶Ìf¯Ìf¨Ìf¡ÌfšÌf“ÌfŒÌf…Ìf~ÌfwÌfpÌfiÌfbÌf[ÌfTÌfMÌfFÌf?Ìf8Ìf1Ìf*Ìf#ÌfÌfÌfÌfÌfÌfùËfòËfëËfäËfÝËfÖËfÏËfÈËfÁËfºËf³Ëf¬Ëf¥ËfžËf—ËfËf‰Ëf‚Ëf{ËftËfmËffËf_ËfXËfQËfJËfCËf<Ëf5Ëf.Ëf'Ëf ËfËfËf ËfËfýÊföÊfïÊfèÊfáÊfÚÊfÓÊfÌÊfÅÊf¾Êf·Êf°Êf©Êf¢Êf›Êf”ÊfÊf†ÊfÊfxÊfqÊfjÊfcÊf\ÊfUÊfNÊfGÊf@Êf9Êf2Êf+Êf$ÊfÊfÊfÊfÊfÊfúÉfóÉfìÉfåÉfÞÉf×ÉfÐÉfÉÉfÂÉf»Éf´Éf­Éf¦ÉfŸÉf˜Éf‘ÉfŠÉfƒÉf|ÉfuÉfnÉfgÉf`ÉfYÉfRÉfKÉfDÉf=Éf6Éf/Éf(Éf!ÉfÉfÉf ÉfÉfþÈf÷ÈfðÈféÈfâÈfÛÈfÔÈfÍÈfÆÈf¿Èf¸Èf±ÈfªÈf£ÈfœÈf•ÈfŽÈf‡Èf€ÈfyÈfrÈfkÈfdÈf]ÈfVÈfOÈfHÈfAÈf:Èf3Èf,Èf%ÈfÈfÈfÈf ÈfÈfûÇfôÇfíÇfæÇfßÇfØÇfÑÇfÊÇfÃÇf¼ÇfµÇf®Çf§Çf Çf™Çf’Çf‹Çf„Çf}ÇfvÇfoÇfhÇfaÇfZÇfSÇfLÇfEÇf>Çf7Çf0Çf)Çf"ÇfÇfÇf ÇfÇfÿÆføÆfñÆfêÆfãÆfÜÆfÕÆfÎÆfÇÆfÀÆf¹Æf²Æf«Æf¤ÆfÆf–ÆfÆfˆÆfÆfzÆfsÆflÆfeÆf^ÆfWÆfPÆfIÆfBÆf;Æf4Æf-Æf&ÆfÆfÆfÆf ÆfÆfüÅfõÅfîÅfçÅfàÅfÙÅfÒÅfËÅfÄÅf½Åf¶Åf¯Åf¨Åf¡ÅfšÅf“ÅfŒÅf…Åf~ÅfwÅfpÅfiÅfbÅf[ÅfTÅfMÅfFÅf?Åf8Åf1Åf*Åf#ÅfÅfÅfÅfÅfÅfùÄfòÄfëÄfäÄfÝÄfÖÄfÏÄfÈÄfÁÄfºÄf³Äf¬Äf¥ÄfžÄf—ÄfÄf‰Äf‚Äf{ÄftÄfmÄffÄf_ÄfXÄfQÄfJÄfCÄf<Äf5Äf.Äf'Äf ÄfÄfÄf ÄfÄfýÃföÃfïÃfèÃfáÃfÚÃfÓÃfÌÃfÅÃf¾Ãf·Ãf°Ãf©Ãf¢Ãf›Ãf”ÃfÃf†ÃfÃfxÃfqÃfjÃfcÃf\ÃfUÃfNÃfGÃf@Ãf9Ãf2Ãf+Ãf$ÃfÃfÃfÃfÃfÃfúÂfóÂfìÂfåÂfÞÂf×ÂfÐÂfÉÂfÂÂf»Âf´Âf­Âf¦ÂfŸÂf˜Âf‘ÂfŠÂfƒÂf|ÂfuÂfnÂfgÂf`ÂfYÂfRÂfKÂfDÂf=Âf6Âf/Âf(Âf!ÂfÂfÂf ÂfÂfþÁf÷ÁfðÁféÁfâÁfÛÁfÔÁfÍÁfÆÁf¿Áf¸Áf±ÁfªÁf£ÁfœÁf•ÁfŽÁf‡Áf€ÁfyÁfrÁfkÁfdÁf]ÁfVÁfOÁfHÁfAÁf:Áf3Áf,Áf%ÁfÁfÁfÁf ÁfÁfûÀfôÀfíÀfæÀfßÀfØÀfÑÀfÊÀfÃÀf¼ÀfµÀf®Àf§Àf Àf™Àf’Àf‹Àf„Àf}ÀfvÀfoÀfhÀfaÀfZÀfSÀfLÀfEÀf>Àf7Àf0Àf)Àf"ÀfÀfÀf ÀfÀfÿ¿fø¿fñ¿fê¿fã¿fÜ¿fÕ¿fοfÇ¿fÀ¿f¹¿f²¿f«¿f¤¿f¿f–¿f¿fˆ¿f¿fz¿fs¿fl¿fe¿f^¿fW¿fP¿fI¿fB¿f;¿f4¿f-¿f&¿f¿f¿f¿f ¿f¿fü¾fõ¾fî¾fç¾fà¾fÙ¾fÒ¾f˾fľf½¾f¶¾f¯¾f¨¾f¡¾fš¾f“¾fŒ¾f…¾f~¾fw¾fp¾fi¾fb¾f[¾fT¾fM¾fF¾f?¾f8¾f1¾f*¾f#¾f¾f¾f¾f¾f¾fù½fò½fë½fä½fݽfÖ½fϽfȽfÁ½fº½f³½f¬½f¥½fž½f—½f½f‰½f‚½f{½ft½fm½ff½f_½fX½fQ½fJ½fC½f<½f5½f.½f'½f ½f½f½f ½f½fý¼fö¼fï¼fè¼fá¼fÚ¼fÓ¼f̼fżf¾¼f·¼f°¼f©¼f¢¼f›¼f”¼f¼f†¼f¼fx¼fq¼fj¼fc¼f\¼fU¼fN¼fG¼f@¼f9¼f2¼f+¼f$¼f¼f¼f¼f¼f¼fú»fó»fì»få»fÞ»f×»fлfÉ»f»f»»f´»f­»f¦»fŸ»f˜»f‘»fŠ»fƒ»f|»fu»fn»fg»f`»fY»fR»fK»fD»f=»f6»f/»f(»f!»f»f»f »f»fþºf÷ºfðºféºfâºfÛºfÔºfͺfƺf¿ºf¸ºf±ºfªºf£ºfœºf•ºfŽºf‡ºf€ºfyºfrºfkºfdºf]ºfVºfOºfHºfAºf:ºf3ºf,ºf%ºfºfºfºf ºfºfû¹fô¹fí¹fæ¹fß¹fعfѹfʹfùf¼¹fµ¹f®¹f§¹f ¹f™¹f’¹f‹¹f„¹f}¹fv¹fo¹fh¹fa¹fZ¹fS¹fL¹fE¹f>¹f7¹f0¹f)¹f"¹f¹f¹f ¹f¹fÿ¸fø¸fñ¸fê¸fã¸fܸfÕ¸fθfǸfÀ¸f¹¸f²¸f«¸f¤¸f¸f–¸f¸fˆ¸f¸fz¸fs¸fl¸fe¸f^¸fW¸fP¸fI¸fB¸f;¸f4¸f-¸f&¸f¸f¸f¸f ¸f¸fü·fõ·fî·fç·fà·fÙ·fÒ·fË·fÄ·f½·f¶·f¯·f¨·f¡·fš·f“·fŒ·f…·f~·fw·fp·fi·fb·f[·fT·fM·fF·f?·f8·f1·f*·f#·f·f·f·f·f·fù¶fò¶fë¶fä¶fݶfÖ¶f϶fȶfÁ¶fº¶f³¶f¬¶f¥¶fž¶f—¶f¶f‰¶f‚¶f{¶ft¶fm¶ff¶f_¶fX¶fQ¶fJ¶fC¶f<¶f5¶f.¶f'¶f ¶f¶f¶f ¶f¶fýµföµfïµfèµfáµfÚµfÓµf̵fŵf¾µf·µf°µf©µf¢µf›µf”µfµf†µfµfxµfqµfjµfcµf\µfUµfNµfGµf@µf9µf2µf+µf$µfµfµfµfµfµfú´fó´fì´få´fÞ´f×´fдfÉ´f´f»´f´´f­´f¦´fŸ´f˜´f‘´fŠ´fƒ´f|´fu´fn´fg´f`´fY´fR´fK´fD´f=´f6´f/´f(´f!´f´f´f ´f´fþ³f÷³fð³fé³fâ³fÛ³fÔ³fͳfƳf¿³f¸³f±³fª³f£³fœ³f•³f޳f‡³f€³fy³fr³fk³fd³f]³fV³fO³fH³fA³f:³f3³f,³f%³f³f³f³f ³f³fû²fô²fí²fæ²fß²fزfѲfʲfòf¼²fµ²f®²f§²f ²f™²f’²f‹²f„²f}²fv²fo²fh²fa²fZ²fS²fL²fE²f>²f7²f0²f)²f"²f²f²f ²f²fÿ±fø±fñ±fê±fã±fܱfÕ±fαfDZfÀ±f¹±f²±f«±f¤±f±f–±f±fˆ±f±fz±fs±fl±fe±f^±fW±fP±fI±fB±f;±f4±f-±f&±f±f±f±f ±f±fü°fõ°fî°fç°fà°fÙ°fÒ°f˰fİf½°f¶°f¯°f¨°f¡°fš°f“°fŒ°f…°f~°fw°fp°fi°fb°f[°fT°fM°fF°f?°f8°f1°f*°f#°f°f°f°f°f°fù¯fò¯fë¯fä¯fݯfÖ¯fϯfȯfÁ¯fº¯f³¯f¬¯f¥¯fž¯f—¯f¯f‰¯f‚¯f{¯ft¯fm¯ff¯f_¯fX¯fQ¯fJ¯fC¯f<¯f5¯f.¯f'¯f ¯f¯f¯f ¯f¯fý®fö®fï®fè®fá®fÚ®fÓ®fÌ®fÅ®f¾®f·®f°®f©®f¢®f›®f”®f®f†®f®fx®fq®fj®fc®f\®fU®fN®fG®f@®f9®f2®f+®f$®f®f®f®f®f®fú­fó­fì­få­fÞ­f×­fЭfÉ­f­f»­f´­f­­f¦­fŸ­f˜­f‘­fŠ­fƒ­f|­fu­fn­fg­f`­fY­fR­fK­fD­f=­f6­f/­f(­f!­f­f­f ­f­fþ¬f÷¬fð¬fé¬fâ¬fÛ¬fÔ¬fͬfƬf¿¬f¸¬f±¬fª¬f£¬fœ¬f•¬fެf‡¬f€¬fy¬fr¬fk¬fd¬f]¬fV¬fO¬fH¬fA¬f:¬f3¬f,¬f%¬f¬f¬f¬f ¬f¬fû«fô«fí«fæ«fß«fØ«fÑ«fÊ«fëf¼«fµ«f®«f§«f «f™«f’«f‹«f„«f}«fv«fo«fh«fa«fZ«fS«fL«fE«f>«f7«f0«f)«f"«f«f«f «f«fÿªføªfñªfêªfãªfܪfÕªfΪfǪfÀªf¹ªf²ªf«ªf¤ªfªf–ªfªfˆªfªfzªfsªflªfeªf^ªfWªfPªfIªfBªf;ªf4ªf-ªf&ªfªfªfªf ªfªfü©fõ©fî©fç©fà©fÙ©fÒ©fË©fÄ©f½©f¶©f¯©f¨©f¡©fš©f“©fŒ©f…©f~©fw©fp©fi©fb©f[©fT©fM©fF©f?©f8©f1©f*©f#©f©f©f©f©f©fù¨fò¨fë¨fä¨fݨfÖ¨fϨfȨfÁ¨fº¨f³¨f¬¨f¥¨fž¨f—¨f¨f‰¨f‚¨f{¨ft¨fm¨ff¨f_¨fX¨fQ¨fJ¨fC¨f<¨f5¨f.¨f'¨f ¨f¨f¨f ¨f¨fý§fö§fï§fè§fá§fÚ§fÓ§f̧fŧf¾§f·§f°§f©§f¢§f›§f”§f§f†§f§fx§fq§fj§fc§f\§fU§fN§fG§f@§f9§f2§f+§f$§f§f§f§f§f§fú¦fó¦fì¦få¦fÞ¦fצfЦfɦf¦f»¦f´¦f­¦f¦¦fŸ¦f˜¦f‘¦fЦfƒ¦f|¦fu¦fn¦fg¦f`¦fY¦fR¦fK¦fD¦f=¦f6¦f/¦f(¦f!¦f¦f¦f ¦f¦fþ¥f÷¥fð¥fé¥fâ¥fÛ¥fÔ¥fÍ¥fÆ¥f¿¥f¸¥f±¥fª¥f£¥fœ¥f•¥fŽ¥f‡¥f€¥fy¥fr¥fk¥fd¥f]¥fV¥fO¥fH¥fA¥f:¥f3¥f,¥f%¥f¥f¥f¥f ¥f¥fû¤fô¤fí¤fæ¤fߤfؤfѤfʤfäf¼¤fµ¤f®¤f§¤f ¤f™¤f’¤f‹¤f„¤f}¤fv¤fo¤fh¤fa¤fZ¤fS¤fL¤fE¤f>¤f7¤f0¤f)¤f"¤f¤f¤f ¤f¤fÿ£fø£fñ£fê£fã£fÜ£fÕ£fΣfÇ£fÀ£f¹£f²£f«£f¤£f£f–£f£fˆ£f£fz£fs£fl£fe£f^£fW£fP£fI£fB£f;£f4£f-£f&£f£f£f£f £f£fü¢fõ¢fî¢fç¢fà¢fÙ¢fÒ¢fË¢fÄ¢f½¢f¶¢f¯¢f¨¢f¡¢fš¢f“¢fŒ¢f…¢f~¢fw¢fp¢fi¢fb¢f[¢fT¢fM¢fF¢f?¢f8¢f1¢f*¢f#¢f¢f¢f¢f¢f¢fù¡fò¡fë¡fä¡fÝ¡fÖ¡fÏ¡fÈ¡fÁ¡fº¡f³¡f¬¡f¥¡fž¡f—¡f¡f‰¡f‚¡f{¡ft¡fm¡ff¡f_¡fX¡fQ¡fJ¡fC¡f<¡f5¡f.¡f'¡f ¡f¡f¡f ¡f¡fý fö fï fè fá fÚ fÓ fÌ fÅ f¾ f· f° f© f¢ f› f” f f† f fx fq fj fc f\ fU fN fG f@ f9 f2 f+ f$ f f f f f fúŸfóŸfìŸfåŸfÞŸfןfПfÉŸfŸf»Ÿf´Ÿf­Ÿf¦ŸfŸŸf˜Ÿf‘ŸfŠŸfƒŸf|ŸfuŸfnŸfgŸf`ŸfYŸfRŸfKŸfDŸf=Ÿf6Ÿf/Ÿf(Ÿf!ŸfŸfŸf ŸfŸfþžf÷žfðžféžfâžfÛžfÔžfÍžfÆžf¿žf¸žf±žfªžf£žfœžf•žfŽžf‡žf€žfyžfržfkžfdžf]žfVžfOžfHžfAžf:žf3žf,žf%žfžfžfžf žfžfûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿœføœfñœfêœfãœfÜœfÕœfΜfÇœfÀœf¹œf²œf«œf¤œfœf–œfœfˆœfœfzœfsœflœfeœf^œfWœfPœfIœfBœf;œf4œf-œf&œfœfœfœf œfœfü›fõ›fî›fç›fà›fÙ›fÒ›fË›fÄ›f½›f¶›f¯›f¨›f¡›fš›f“›fŒ›f…›f~›fw›fp›fi›fb›f[›fT›fM›fF›f?›f8›f1›f*›f#›f›f›f›f›f›fùšfòšfëšfäšfÝšfÖšfÏšfÈšfÁšfºšf³šf¬šf¥šfžšf—šfšf‰šf‚šf{šftšfmšffšf_šfXšfQšfJšfCšf<šf5šf.šf'šf šfšfšf šfšfý™fö™fï™fè™fá™fÚ™fÓ™fÌ™fÅ™f¾™f·™f°™f©™f¢™f›™f”™f™f†™f™fx™fq™fj™fc™f\™fU™fN™fG™f@™f9™f2™f+™f$™f™f™f™f™f™fú˜fó˜fì˜få˜fÞ˜fטfИfɘf˜f»˜f´˜f­˜f¦˜fŸ˜f˜˜f‘˜fŠ˜fƒ˜f|˜fu˜fn˜fg˜f`˜fY˜fR˜fK˜fD˜f=˜f6˜f/˜f(˜f!˜f˜f˜f ˜f˜fþ—f÷—fð—fé—fâ—fÛ—fÔ—fÍ—fÆ—f¿—f¸—f±—fª—f£—fœ—f•—fŽ—f‡—f€—fy—fr—fk—fd—f]—fV—fO—fH—fA—f:—f3—f,—f%—f—f—f—f —f—fû–fô–fí–fæ–fß–fØ–fÑ–fÊ–fÖf¼–fµ–f®–f§–f –f™–f’–f‹–f„–f}–fv–fo–fh–fa–fZ–fS–fL–fE–f>–f7–f0–f)–f"–f–f–f –f–fÿ•fø•fñ•fê•fã•fÜ•fÕ•fΕfÇ•fÀ•f¹•f²•f«•f¤•f•f–•f•fˆ•f•fz•fs•fl•fe•f^•fW•fP•fI•fB•f;•f4•f-•f&•f•f•f•f •f•fü”fõ”fî”fç”fà”fÙ”fÒ”fË”fÄ”f½”f¶”f¯”f¨”f¡”fš”f“”fŒ”f…”f~”fw”fp”fi”fb”f[”fT”fM”fF”f?”f8”f1”f*”f#”f”f”f”f”f”fù“fò“fë“fä“fÝ“fÖ“fÏ“fÈ“fÁ“fº“f³“f¬“f¥“fž“f—“f“f‰“f‚“f{“ft“fm“ff“f_“fX“fQ“fJ“fC“f<“f5“f.“f'“f “f“f“f “f“fý’fö’fï’fè’fá’fÚ’fÓ’fÌ’fÅ’f¾’f·’f°’f©’f¢’f›’f”’f’f†’f’fx’fq’fj’fc’f\’fU’fN’fG’f@’f9’f2’f+’f$’f’f’f’f’f’fú‘fó‘fì‘få‘fÞ‘fבfБfÉ‘f‘f»‘f´‘f­‘f¦‘fŸ‘f˜‘f‘‘fŠ‘fƒ‘f|‘fu‘fn‘fg‘f`‘fY‘fR‘fK‘fD‘f=‘f6‘f/‘f(‘f!‘f‘f‘f ‘f‘fþf÷fðféfâfÛfÔfÍfÆf¿f¸f±fªf£fœf•fŽf‡f€fyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿŽføŽfñŽfêŽfãŽfÜŽfÕŽfÎŽfÇŽfÀŽf¹Žf²Žf«Žf¤ŽfŽf–ŽfŽfˆŽfŽfzŽfsŽflŽfeŽf^ŽfWŽfPŽfIŽfBŽf;Žf4Žf-Žf&ŽfŽfŽfŽf ŽfŽfüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùŒfòŒfëŒfäŒfÝŒfÖŒfÏŒfÈŒfÁŒfºŒf³Œf¬Œf¥ŒfžŒf—ŒfŒf‰Œf‚Œf{ŒftŒfmŒffŒf_ŒfXŒfQŒfJŒfCŒf<Œf5Œf.Œf'Œf ŒfŒfŒf ŒfŒfý‹fö‹fï‹fè‹fá‹fÚ‹fÓ‹fÌ‹fÅ‹f¾‹f·‹f°‹f©‹f¢‹f›‹f”‹f‹f†‹f‹fx‹fq‹fj‹fc‹f\‹fU‹fN‹fG‹f@‹f9‹f2‹f+‹f$‹f‹f‹f‹f‹f‹fúŠfóŠfìŠfåŠfÞŠf׊fЊfÉŠfŠf»Šf´Šf­Šf¦ŠfŸŠf˜Šf‘ŠfŠŠfƒŠf|ŠfuŠfnŠfgŠf`ŠfYŠfRŠfKŠfDŠf=Šf6Šf/Šf(Šf!ŠfŠfŠf ŠfŠfþ‰f÷‰fð‰fé‰fâ‰fÛ‰fÔ‰f͉fƉf¿‰f¸‰f±‰fª‰f£‰fœ‰f•‰fމf‡‰f€‰fy‰fr‰fk‰fd‰f]‰fV‰fO‰fH‰fA‰f:‰f3‰f,‰f%‰f‰f‰f‰f ‰f‰fûˆfôˆfíˆfæˆf߈f؈fшfʈfÈf¼ˆfµˆf®ˆf§ˆf ˆf™ˆf’ˆf‹ˆf„ˆf}ˆfvˆfoˆfhˆfaˆfZˆfSˆfLˆfEˆf>ˆf7ˆf0ˆf)ˆf"ˆfˆfˆf ˆfˆfÿ‡fø‡fñ‡fê‡fã‡f܇fÕ‡f·fLJfÀ‡f¹‡f²‡f«‡f¤‡f‡f–‡f‡fˆ‡f‡fz‡fs‡fl‡fe‡f^‡fW‡fP‡fI‡fB‡f;‡f4‡f-‡f&‡f‡f‡f‡f ‡f‡fü†fõ†fî†fç†fà†fÙ†fÒ†fˆfĆf½†f¶†f¯†f¨†f¡†fš†f“†fŒ†f…†f~†fw†fp†fi†fb†f[†fT†fM†fF†f?†f8†f1†f*†f#†f†f†f†f†f†fù…fò…fë…fä…fÝ…fÖ…fÏ…fÈ…fÁ…fº…f³…f¬…f¥…fž…f—…f…f‰…f‚…f{…ft…fm…ff…f_…fX…fQ…fJ…fC…f<…f5…f.…f'…f …f…f…f …f…fý„fö„fï„fè„fá„fÚ„fÓ„fÌ„fÅ„f¾„f·„f°„f©„f¢„f›„f”„f„f†„f„fx„fq„fj„fc„f\„fU„fN„fG„f@„f9„f2„f+„f$„f„f„f„f„f„fúƒfóƒfìƒfåƒfÞƒf׃fЃfɃfƒf»ƒf´ƒf­ƒf¦ƒfŸƒf˜ƒf‘ƒfŠƒfƒƒf|ƒfuƒfnƒfgƒf`ƒfYƒfRƒfKƒfDƒf=ƒf6ƒf/ƒf(ƒf!ƒfƒfƒf ƒfƒfþ‚f÷‚fð‚fé‚fâ‚fÛ‚fÔ‚fÍ‚fÆ‚f¿‚f¸‚f±‚fª‚f£‚fœ‚f•‚fŽ‚f‡‚f€‚fy‚fr‚fk‚fd‚f]‚fV‚fO‚fH‚fA‚f:‚f3‚f,‚f%‚f‚f‚f‚f ‚f‚fûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿ€fø€fñ€fê€fã€fÜ€fÕ€f΀fÇ€fÀ€f¹€f²€f«€f¤€f€f–€f€fˆ€f€fz€fs€fl€fe€f^€fW€fP€fI€fB€f;€f4€f-€f&€f€f€f€f €f€füfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffù~fò~fë~fä~fÝ~fÖ~fÏ~fÈ~fÁ~fº~f³~f¬~f¥~fž~f—~f~f‰~f‚~f{~ft~fm~ff~f_~fX~fQ~fJ~fC~f<~f5~f.~f'~f ~f~f~f ~f~fý}fö}fï}fè}fá}fÚ}fÓ}fÌ}fÅ}f¾}f·}f°}f©}f¢}f›}f”}f}f†}f}fx}fq}fj}fc}f\}fU}fN}fG}f@}f9}f2}f+}f$}f}f}f}f}f}fú|fó|fì|få|fÞ|f×|fÐ|fÉ|fÂ|f»|f´|f­|f¦|fŸ|f˜|f‘|fŠ|fƒ|f||fu|fn|fg|f`|fY|fR|fK|fD|f=|f6|f/|f(|f!|f|f|f |f|fþ{f÷{fð{fé{fâ{fÛ{fÔ{fÍ{fÆ{f¿{f¸{f±{fª{f£{fœ{f•{fŽ{f‡{f€{fy{fr{fk{fd{f]{fV{fO{fH{fA{f:{f3{f,{f%{f{f{f{f {f{fûzfôzfízfæzfßzfØzfÑzfÊzfÃzf¼zfµzf®zf§zf zf™zf’zf‹zf„zf}zfvzfozfhzfazfZzfSzfLzfEzf>zf7zf0zf)zf"zfzfzf zfzfÿyføyfñyfêyfãyfÜyfÕyfÎyfÇyfÀyf¹yf²yf«yf¤yfyf–yfyfˆyfyfzyfsyflyfeyf^yfWyfPyfIyfByf;yf4yf-yf&yfyfyfyf yfyfüxfõxfîxfçxfàxfÙxfÒxfËxfÄxf½xf¶xf¯xf¨xf¡xfšxf“xfŒxf…xf~xfwxfpxfixfbxf[xfTxfMxfFxf?xf8xf1xf*xf#xfxfxfxfxfxfùwfòwfëwfäwfÝwfÖwfÏwfÈwfÁwfºwf³wf¬wf¥wfžwf—wfwf‰wf‚wf{wftwfmwffwf_wfXwfQwfJwfCwfsf7sf0sf)sf"sfsfsf sfsfÿrførfñrfêrfãrfÜrfÕrfÎrfÇrfÀrf¹rf²rf«rf¤rfrf–rfrfˆrfrfzrfsrflrferf^rfWrfPrfIrfBrf;rf4rf-rf&rfrfrfrf rfrfüqfõqfîqfçqfàqfÙqfÒqfËqfÄqf½qf¶qf¯qf¨qf¡qfšqf“qfŒqf…qf~qfwqfpqfiqfbqf[qfTqfMqfFqf?qf8qf1qf*qf#qfqfqfqfqfqfùpfòpfëpfäpfÝpfÖpfÏpfÈpfÁpfºpf³pf¬pf¥pfžpf—pfpf‰pf‚pf{pftpfmpffpf_pfXpfQpfJpfCpflf7lf0lf)lf"lflflf lflfÿkføkfñkfêkfãkfÜkfÕkfÎkfÇkfÀkf¹kf²kf«kf¤kfkf–kfkfˆkfkfzkfskflkfekf^kfWkfPkfIkfBkf;kf4kf-kf&kfkfkfkf kfkfüjfõjfîjfçjfàjfÙjfÒjfËjfÄjf½jf¶jf¯jf¨jf¡jfšjf“jfŒjf…jf~jfwjfpjfijfbjf[jfTjfMjfFjf?jf8jf1jf*jf#jfjfjfjfjfjfùifòifëifäifÝifÖifÏifÈifÁifºif³if¬if¥ifžif—ifif‰if‚if{iftifmiffif_ifXifQifJifCifef7ef0ef)ef"efefef efefÿdfødfñdfêdfãdfÜdfÕdfÎdfÇdfÀdf¹df²df«df¤dfdf–dfdfˆdfdfzdfsdfldfedf^dfWdfPdfIdfBdf;df4df-df&dfdfdfdf dfdfücfõcfîcfçcfàcfÙcfÒcfËcfÄcf½cf¶cf¯cf¨cf¡cfšcf“cfŒcf…cf~cfwcfpcficfbcf[cfTcfMcfFcf?cf8cf1cf*cf#cfcfcfcfcfcfùbfòbfëbfäbfÝbfÖbfÏbfÈbfÁbfºbf³bf¬bf¥bfžbf—bfbf‰bf‚bf{bftbfmbffbf_bfXbfQbfJbfCbf^f7^f0^f)^f"^f^f^f ^f^fÿ]fø]fñ]fê]fã]fÜ]fÕ]fÎ]fÇ]fÀ]f¹]f²]f«]f¤]f]f–]f]fˆ]f]fz]fs]fl]fe]f^]fW]fP]fI]fB]f;]f4]f-]f&]f]f]f]f ]f]fü\fõ\fî\fç\fà\fÙ\fÒ\fË\fÄ\f½\f¶\f¯\f¨\f¡\fš\f“\fŒ\f…\f~\fw\fp\fi\fb\f[\fT\fM\fF\f?\f8\f1\f*\f#\f\f\f\f\f\fù[fò[fë[fä[fÝ[fÖ[fÏ[fÈ[fÁ[fº[f³[f¬[f¥[fž[f—[f[f‰[f‚[f{[ft[fm[ff[f_[fX[fQ[fJ[fC[f<[f5[f.[f'[f [f[f[f [f[fýZföZfïZfèZfáZfÚZfÓZfÌZfÅZf¾Zf·Zf°Zf©Zf¢Zf›Zf”ZfZf†ZfZfxZfqZfjZfcZf\ZfUZfNZfGZf@Zf9Zf2Zf+Zf$ZfZfZfZfZfZfúYfóYfìYfåYfÞYf×YfÐYfÉYfÂYf»Yf´Yf­Yf¦YfŸYf˜Yf‘YfŠYfƒYf|YfuYfnYfgYf`YfYYfRYfKYfDYf=Yf6Yf/Yf(Yf!YfYfYf YfYfþXf÷XfðXféXfâXfÛXfÔXfÍXfÆXf¿Xf¸Xf±XfªXf£XfœXf•XfŽXf‡Xf€XfyXfrXfkXfdXf]XfVXfOXfHXfAXf:Xf3Xf,Xf%XfXfXfXf XfXfûWfôWfíWfæWfßWfØWfÑWfÊWfÃWf¼WfµWf®Wf§Wf Wf™Wf’Wf‹Wf„Wf}WfvWfoWfhWfaWfZWfSWfLWfEWf>Wf7Wf0Wf)Wf"WfWfWf WfWfÿVføVfñVfêVfãVfÜVfÕVfÎVfÇVfÀVf¹Vf²Vf«Vf¤VfVf–VfVfˆVfVfzVfsVflVfeVf^VfWVfPVfIVfBVf;Vf4Vf-Vf&VfVfVfVf VfVfüUfõUfîUfçUfàUfÙUfÒUfËUfÄUf½Uf¶Uf¯Uf¨Uf¡UfšUf“UfŒUf…Uf~UfwUfpUfiUfbUf[UfTUfMUfFUf?Uf8Uf1Uf*Uf#UfUfUfUfUfUfùTfòTfëTfäTfÝTfÖTfÏTfÈTfÁTfºTf³Tf¬Tf¥TfžTf—TfTf‰Tf‚Tf{TftTfmTffTf_TfXTfQTfJTfCTfPf7Pf0Pf)Pf"PfPfPf PfPfÿOføOfñOfêOfãOfÜOfÕOfÎOfÇOfÀOf¹Of²Of«Of¤OfOf–OfOfˆOfOfzOfsOflOfeOf^OfWOfPOfIOfBOf;Of4Of-Of&OfOfOfOf OfOfüNfõNfîNfçNfàNfÙNfÒNfËNfÄNf½Nf¶Nf¯Nf¨Nf¡NfšNf“NfŒNf…Nf~NfwNfpNfiNfbNf[NfTNfMNfFNf?Nf8Nf1Nf*Nf#NfNfNfNfNfNfùMfòMfëMfäMfÝMfÖMfÏMfÈMfÁMfºMf³Mf¬Mf¥MfžMf—MfMf‰Mf‚Mf{MftMfmMffMf_MfXMfQMfJMfCMfIf7If0If)If"IfIfIf IfIfÿHføHfñHfêHfãHfÜHfÕHfÎHfÇHfÀHf¹Hf²Hf«Hf¤HfHf–HfHfˆHfHfzHfsHflHfeHf^HfWHfPHfIHfBHf;Hf4Hf-Hf&HfHfHfHf HfHfüGfõGfîGfçGfàGfÙGfÒGfËGfÄGf½Gf¶Gf¯Gf¨Gf¡GfšGf“GfŒGf…Gf~GfwGfpGfiGfbGf[GfTGfMGfFGf?Gf8Gf1Gf*Gf#GfGfGfGfGfGfùFfòFfëFfäFfÝFfÖFfÏFfÈFfÁFfºFf³Ff¬Ff¥FfžFf—FfFf‰Ff‚Ff{FftFfmFffFf_FfXFfQFfJFfCFfBf7Bf0Bf)Bf"BfBfBf BfBfÿAføAfñAfêAfãAfÜAfÕAfÎAfÇAfÀAf¹Af²Af«Af¤AfAf–AfAfˆAfAfzAfsAflAfeAf^AfWAfPAfIAfBAf;Af4Af-Af&AfAfAfAf AfAfü@fõ@fî@fç@fà@fÙ@fÒ@fË@fÄ@f½@f¶@f¯@f¨@f¡@fš@f“@fŒ@f…@f~@fw@fp@fi@fb@f[@fT@fM@fF@f?@f8@f1@f*@f#@f@f@f@f@f@fù?fò?fë?fä?fÝ?fÖ?fÏ?fÈ?fÁ?fº?f³?f¬?f¥?fž?f—?f?f‰?f‚?f{?ft?fm?ff?f_?fX?fQ?fJ?fC?ffö>fï>fè>fá>fÚ>fÓ>fÌ>fÅ>f¾>f·>f°>f©>f¢>f›>f”>f>f†>f>fx>fq>fj>fc>f\>fU>fN>fG>f@>f9>f2>f+>f$>f>f>f>f>f>fú=fó=fì=få=fÞ=f×=fÐ=fÉ=fÂ=f»=f´=f­=f¦=fŸ=f˜=f‘=fŠ=fƒ=f|=fu=fn=fg=f`=fY=fR=fK=fD=f==f6=f/=f(=f!=f=f=f =f=fþ;f7;f0;f);f";f;f;f ;f;fÿ:fø:fñ:fê:fã:fÜ:fÕ:fÎ:fÇ:fÀ:f¹:f²:f«:f¤:f:f–:f:fˆ:f:fz:fs:fl:fe:f^:fW:fP:fI:fB:f;:f4:f-:f&:f:f:f:f :f:fü9fõ9fî9fç9fà9fÙ9fÒ9fË9fÄ9f½9f¶9f¯9f¨9f¡9fš9f“9fŒ9f…9f~9fw9fp9fi9fb9f[9fT9fM9fF9f?9f89f19f*9f#9f9f9f9f9f9fù8fò8fë8fä8fÝ8fÖ8fÏ8fÈ8fÁ8fº8f³8f¬8f¥8fž8f—8f8f‰8f‚8f{8ft8fm8ff8f_8fX8fQ8fJ8fC8f<8f58f.8f'8f 8f8f8f 8f8fý7fö7fï7fè7fá7fÚ7fÓ7fÌ7fÅ7f¾7f·7f°7f©7f¢7f›7f”7f7f†7f7fx7fq7fj7fc7f\7fU7fN7fG7f@7f97f27f+7f$7f7f7f7f7f7fú6fó6fì6få6fÞ6f×6fÐ6fÉ6fÂ6f»6f´6f­6f¦6fŸ6f˜6f‘6fŠ6fƒ6f|6fu6fn6fg6f`6fY6fR6fK6fD6f=6f66f/6f(6f!6f6f6f 6f6fþ5f÷5fð5fé5fâ5fÛ5fÔ5fÍ5fÆ5f¿5f¸5f±5fª5f£5fœ5f•5fŽ5f‡5f€5fy5fr5fk5fd5f]5fV5fO5fH5fA5f:5f35f,5f%5f5f5f5f 5f5fû4fô4fí4fæ4fß4fØ4fÑ4fÊ4fÃ4f¼4fµ4f®4f§4f 4f™4f’4f‹4f„4f}4fv4fo4fh4fa4fZ4fS4fL4fE4f>4f74f04f)4f"4f4f4f 4f4fÿ3fø3fñ3fê3fã3fÜ3fÕ3fÎ3fÇ3fÀ3f¹3f²3f«3f¤3f3f–3f3fˆ3f3fz3fs3fl3fe3f^3fW3fP3fI3fB3f;3f43f-3f&3f3f3f3f 3f3fü2fõ2fî2fç2fà2fÙ2fÒ2fË2fÄ2f½2f¶2f¯2f¨2f¡2fš2f“2fŒ2f…2f~2fw2fp2fi2fb2f[2fT2fM2fF2f?2f82f12f*2f#2f2f2f2f2f2fù1fò1fë1fä1fÝ1fÖ1fÏ1fÈ1fÁ1fº1f³1f¬1f¥1fž1f—1f1f‰1f‚1f{1ft1fm1ff1f_1fX1fQ1fJ1fC1f<1f51f.1f'1f 1f1f1f 1f1fý0fö0fï0fè0fá0fÚ0fÓ0fÌ0fÅ0f¾0f·0f°0f©0f¢0f›0f”0f0f†0f0fx0fq0fj0fc0f\0fU0fN0fG0f@0f90f20f+0f$0f0f0f0f0f0fú/fó/fì/få/fÞ/f×/fÐ/fÉ/fÂ/f»/f´/f­/f¦/fŸ/f˜/f‘/fŠ/fƒ/f|/fu/fn/fg/f`/fY/fR/fK/fD/f=/f6/f//f(/f!/f/f/f /f/fþ.f÷.fð.fé.fâ.fÛ.fÔ.fÍ.fÆ.f¿.f¸.f±.fª.f£.fœ.f•.fŽ.f‡.f€.fy.fr.fk.fd.f].fV.fO.fH.fA.f:.f3.f,.f%.f.f.f.f .f.fû-fô-fí-fæ-fß-fØ-fÑ-fÊ-fÃ-f¼-fµ-f®-f§-f -f™-f’-f‹-f„-f}-fv-fo-fh-fa-fZ-fS-fL-fE-f>-f7-f0-f)-f"-f-f-f -f-fÿ,fø,fñ,fê,fã,fÜ,fÕ,fÎ,fÇ,fÀ,f¹,f²,f«,f¤,f,f–,f,fˆ,f,fz,fs,fl,fe,f^,fW,fP,fI,fB,f;,f4,f-,f&,f,f,f,f ,f,fü+fõ+fî+fç+fà+fÙ+fÒ+fË+fÄ+f½+f¶+f¯+f¨+f¡+fš+f“+fŒ+f…+f~+fw+fp+fi+fb+f[+fT+fM+fF+f?+f8+f1+f*+f#+f+f+f+f+f+fù*fò*fë*fä*fÝ*fÖ*fÏ*fÈ*fÁ*fº*f³*f¬*f¥*fž*f—*f*f‰*f‚*f{*ft*fm*ff*f_*fX*fQ*fJ*fC*f<*f5*f.*f'*f *f*f*f *f*fý)fö)fï)fè)fá)fÚ)fÓ)fÌ)fÅ)f¾)f·)f°)f©)f¢)f›)f”)f)f†)f)fx)fq)fj)fc)f\)fU)fN)fG)f@)f9)f2)f+)f$)f)f)f)f)f)fú(fó(fì(få(fÞ(f×(fÐ(fÉ(fÂ(f»(f´(f­(f¦(fŸ(f˜(f‘(fŠ(fƒ(f|(fu(fn(fg(f`(fY(fR(fK(fD(f=(f6(f/(f((f!(f(f(f (f(fþ'f÷'fð'fé'fâ'fÛ'fÔ'fÍ'fÆ'f¿'f¸'f±'fª'f£'fœ'f•'fŽ'f‡'f€'fy'fr'fk'fd'f]'fV'fO'fH'fA'f:'f3'f,'f%'f'f'f'f 'f'fû&fô&fí&fæ&fß&fØ&fÑ&fÊ&fÃ&f¼&fµ&f®&f§&f &f™&f’&f‹&f„&f}&fv&fo&fh&fa&fZ&fS&fL&fE&f>&f7&f0&f)&f"&f&f&f &f&fÿ%fø%fñ%fê%fã%fÜ%fÕ%fÎ%fÇ%fÀ%f¹%f²%f«%f¤%f%f–%f%fˆ%f%fz%fs%fl%fe%f^%fW%fP%fI%fB%f;%f4%f-%f&%f%f%f%f %f%fü$fõ$fî$fç$fà$fÙ$fÒ$fË$fÄ$f½$f¶$f¯$f¨$f¡$fš$f“$fŒ$f…$f~$fw$fp$fi$fb$f[$fT$fM$fF$f?$f8$f1$f*$f#$f$f$f$f$f$fù#fò#fë#fä#fÝ#fÖ#fÏ#fÈ#fÁ#fº#f³#f¬#f¥#fž#f—#f#f‰#f‚#f{#ft#fm#ff#f_#fX#fQ#fJ#fC#f<#f5#f.#f'#f #f#f#f #f#fý"fö"fï"fè"fá"fÚ"fÓ"fÌ"fÅ"f¾"f·"f°"f©"f¢"f›"f”"f"f†"f"fx"fq"fj"fc"f\"fU"fN"fG"f@"f9"f2"f+"f$"f"f"f"f"f"fú!fó!fì!få!fÞ!f×!fÐ!fÉ!fÂ!f»!f´!f­!f¦!fŸ!f˜!f‘!fŠ!fƒ!f|!fu!fn!fg!f`!fY!fR!fK!fD!f=!f6!f/!f(!f!!f!f!f !f!fþ f÷ fð fé fâ fÛ fÔ fÍ fÆ f¿ f¸ f± fª f£ fœ f• fŽ f‡ f€ fy fr fk fd f] fV fO fH fA f: f3 f, f% f f f f f fûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCf<f5f.f'f fff ffýföfïfèfáfÚfÓfÌfÅf¾f·f°f©f¢f›f”ff†ffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffúfófìfåfÞf×fÐfÉfÂf»f´f­f¦fŸf˜f‘fŠfƒf|fufnfgf`fYfRfKfDf=f6f/f(f!fff ffþf÷fðféfâfÛfÔfÍfÆf¿f¸f±fªf£fœf•fŽf‡f€fyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCf<f5f.f'f fff ffýföfïfèfáfÚfÓfÌfÅf¾f·f°f©f¢f›f”ff†ffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffúfófìfåfÞf×fÐfÉfÂf»f´f­f¦fŸf˜f‘fŠfƒf|fufnfgf`fYfRfKfDf=f6f/f(f!fff ffþf÷fðféfâfÛfÔfÍfÆf¿f¸f±fªf£fœf•fŽf‡f€fyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCf<f5f.f'f fff ffý fö fï fè fá fÚ fÓ fÌ fÅ f¾ f· f° f© f¢ f› f” f f† f fx fq fj fc f\ fU fN fG f@ f9 f2 f+ f$ f f f f f fú fó fì få fÞ f× fÐ fÉ f f» f´ f­ f¦ fŸ f˜ f‘ fŠ fƒ f| fu fn fg f` fY fR fK fD f= f6 f/ f( f! f f f f fþ f÷ fð fé fâ fÛ fÔ fÍ fÆ f¿ f¸ f± fª f£ fœ f• fŽ f‡ f€ fy fr fk fd f] fV fO fH fA f: f3 f, f% f f f f f fû fô fí fæ fß fØ fÑ fÊ fà f¼ fµ f® f§ f  f™ f’ f‹ f„ f} fv fo fh fa fZ fS fL fE f> f7 f0 f) f" f f f f fÿ fø fñ fê fã fÜ fÕ fÎ fÇ fÀ f¹ f² f« f¤ f f– f fˆ f fz fs fl fe f^ fW fP fI fB f; f4 f- f& f f f f f füfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCf<f5f.f'f fff ffýföfïfèfáfÚfÓfÌfÅf¾f·f°f©f¢f›f”ff†ffxfqfjfcf\fUfNfGf@f9f2f+f$ffffffúfófìfåfÞf×fÐfÉfÂf»f´f­f¦fŸf˜f‘fŠfƒf|fufnfgf`fYfRfKfDf=f6f/f(f!fff ffþf÷fðféfâfÛfÔfÍfÆf¿f¸f±fªf£fœf•fŽf‡f€fyfrfkfdf]fVfOfHfAf:f3f,f%ffff ffûfôfífæfßfØfÑfÊfÃf¼fµf®f§f f™f’f‹f„f}fvfofhfafZfSfLfEf>f7f0f)f"fff ffÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCf<f5f.f'f fff ffýÿeöÿeïÿeèÿeáÿeÚÿeÓÿeÌÿeÅÿe¾ÿe·ÿe°ÿe©ÿe¢ÿe›ÿe”ÿeÿe†ÿeÿexÿeqÿejÿecÿe\ÿeUÿeNÿeGÿe@ÿe9ÿe2ÿe+ÿe$ÿeÿeÿeÿeÿeÿeúþeóþeìþeåþeÞþe×þeÐþeÉþeÂþe»þe´þe­þe¦þeŸþe˜þe‘þeŠþeƒþe|þeuþenþegþe`þeYþeRþeKþeDþe=þe6þe/þe(þe!þeþeþe þeþeþýe÷ýeðýeéýeâýeÛýeÔýeÍýeÆýe¿ýe¸ýe±ýeªýe£ýeœýe•ýeŽýe‡ýe€ýeyýerýekýedýe]ýeVýeOýeHýeAýe:ýe3ýe,ýe%ýeýeýeýe ýeýeûüeôüeíüeæüeßüeØüeÑüeÊüeÃüe¼üeµüe®üe§üe üe™üe’üe‹üe„üe}üevüeoüehüeaüeZüeSüeLüeEüe>üe7üe0üe)üe"üeüeüe üeüeÿûeøûeñûeêûeãûeÜûeÕûeÎûeÇûeÀûe¹ûe²ûe«ûe¤ûeûe–ûeûeˆûeûezûesûelûeeûe^ûeWûePûeIûeBûe;ûe4ûe-ûe&ûeûeûeûe ûeûeüúeõúeîúeçúeàúeÙúeÒúeËúeÄúe½úe¶úe¯úe¨úe¡úešúe“úeŒúe…úe~úewúepúeiúebúe[úeTúeMúeFúe?úe8úe1úe*úe#úeúeúeúeúeúeùùeòùeëùeäùeÝùeÖùeÏùeÈùeÁùeºùe³ùe¬ùe¥ùežùe—ùeùe‰ùe‚ùe{ùetùemùefùe_ùeXùeQùeJùeCùe<ùe5ùe.ùe'ùe ùeùeùe ùeùeýøeöøeïøeèøeáøeÚøeÓøeÌøeÅøe¾øe·øe°øe©øe¢øe›øe”øeøe†øeøexøeqøejøecøe\øeUøeNøeGøe@øe9øe2øe+øe$øeøeøeøeøeøeú÷eó÷eì÷eå÷eÞ÷e×÷eÐ÷eÉ÷eÂ÷e»÷e´÷e­÷e¦÷eŸ÷e˜÷e‘÷eŠ÷eƒ÷e|÷eu÷en÷eg÷e`÷eY÷eR÷eK÷eD÷e=÷e6÷e/÷e(÷e!÷e÷e÷e ÷e÷eþöe÷öeðöeéöeâöeÛöeÔöeÍöeÆöe¿öe¸öe±öeªöe£öeœöe•öeŽöe‡öe€öeyöeröeköedöe]öeVöeOöeHöeAöe:öe3öe,öe%öeöeöeöe öeöeûõeôõeíõeæõeßõeØõeÑõeÊõeÃõe¼õeµõe®õe§õe õe™õe’õe‹õe„õe}õevõeoõehõeaõeZõeSõeLõeEõe>õe7õe0õe)õe"õeõeõe õeõeÿôeøôeñôeêôeãôeÜôeÕôeÎôeÇôeÀôe¹ôe²ôe«ôe¤ôeôe–ôeôeˆôeôezôesôelôeeôe^ôeWôePôeIôeBôe;ôe4ôe-ôe&ôeôeôeôe ôeôeüóeõóeîóeçóeàóeÙóeÒóeËóeÄóe½óe¶óe¯óe¨óe¡óešóe“óeŒóe…óe~óewóepóeióebóe[óeTóeMóeFóe?óe8óe1óe*óe#óeóeóeóeóeóeùòeòòeëòeäòeÝòeÖòeÏòeÈòeÁòeºòe³òe¬òe¥òežòe—òeòe‰òe‚òe{òetòemòefòe_òeXòeQòeJòeCòe<òe5òe.òe'òe òeòeòe òeòeýñeöñeïñeèñeáñeÚñeÓñeÌñeÅñe¾ñe·ñe°ñe©ñe¢ñe›ñe”ñeñe†ñeñexñeqñejñecñe\ñeUñeNñeGñe@ñe9ñe2ñe+ñe$ñeñeñeñeñeñeúðeóðeìðeåðeÞðe×ðeÐðeÉðeÂðe»ðe´ðe­ðe¦ðeŸðe˜ðe‘ðeŠðeƒðe|ðeuðenðegðe`ðeYðeRðeKðeDðe=ðe6ðe/ðe(ðe!ðeðeðe ðeðeþïe÷ïeðïeéïeâïeÛïeÔïeÍïeÆïe¿ïe¸ïe±ïeªïe£ïeœïe•ïeŽïe‡ïe€ïeyïerïekïedïe]ïeVïeOïeHïeAïe:ïe3ïe,ïe%ïeïeïeïe ïeïeûîeôîeíîeæîeßîeØîeÑîeÊîeÃîe¼îeµîe®îe§îe îe™îe’îe‹îe„îe}îevîeoîehîeaîeZîeSîeLîeEîe>îe7îe0îe)îe"îeîeîe îeîeÿíeøíeñíeêíeãíeÜíeÕíeÎíeÇíeÀíe¹íe²íe«íe¤íeíe–íeíeˆíeíezíesíelíeeíe^íeWíePíeIíeBíe;íe4íe-íe&íeíeíeíe íeíeüìeõìeîìeçìeàìeÙìeÒìeËìeÄìe½ìe¶ìe¯ìe¨ìe¡ìešìe“ìeŒìe…ìe~ìewìepìeiìebìe[ìeTìeMìeFìe?ìe8ìe1ìe*ìe#ìeìeìeìeìeìeùëeòëeëëeäëeÝëeÖëeÏëeÈëeÁëeºëe³ëe¬ëe¥ëežëe—ëeëe‰ëe‚ëe{ëetëemëefëe_ëeXëeQëeJëeCëe<ëe5ëe.ëe'ëe ëeëeëe ëeëeýêeöêeïêeèêeáêeÚêeÓêeÌêeÅêe¾êe·êe°êe©êe¢êe›êe”êeêe†êeêexêeqêejêecêe\êeUêeNêeGêe@êe9êe2êe+êe$êeêeêeêeêeêeúéeóéeìéeåéeÞée×éeÐéeÉéeÂée»ée´ée­ée¦éeŸée˜ée‘éeŠéeƒée|éeuéenéegée`éeYéeRéeKéeDée=ée6ée/ée(ée!éeéeée éeéeþèe÷èeðèeéèeâèeÛèeÔèeÍèeÆèe¿èe¸èe±èeªèe£èeœèe•èeŽèe‡èe€èeyèerèekèedèe]èeVèeOèeHèeAèe:èe3èe,èe%èeèeèeèe èeèeûçeôçeíçeæçeßçeØçeÑçeÊçeÃçe¼çeµçe®çe§çe çe™çe’çe‹çe„çe}çevçeoçehçeaçeZçeSçeLçeEçe>çe7çe0çe)çe"çeçeçe çeçeÿæeøæeñæeêæeãæeÜæeÕæeÎæeÇæeÀæe¹æe²æe«æe¤æeæe–æeæeˆæeæezæesæelæeeæe^æeWæePæeIæeBæe;æe4æe-æe&æeæeæeæe æeæeüåeõåeîåeçåeàåeÙåeÒåeËåeÄåe½åe¶åe¯åe¨åe¡åešåe“åeŒåe…åe~åewåepåeiåebåe[åeTåeMåeFåe?åe8åe1åe*åe#åeåeåeåeåeåeùäeòäeëäeääeÝäeÖäeÏäeÈäeÁäeºäe³äe¬äe¥äežäe—äeäe‰äe‚äe{äetäemäefäe_äeXäeQäeJäeCäe<äe5äe.äe'äe äeäeäe äeäeýãeöãeïãeèãeáãeÚãeÓãeÌãeÅãe¾ãe·ãe°ãe©ãe¢ãe›ãe”ãeãe†ãeãexãeqãejãecãe\ãeUãeNãeGãe@ãe9ãe2ãe+ãe$ãeãeãeãeãeãeúâeóâeìâeåâeÞâe×âeÐâeÉâeÂâe»âe´âe­âe¦âeŸâe˜âe‘âeŠâeƒâe|âeuâenâegâe`âeYâeRâeKâeDâe=âe6âe/âe(âe!âeâeâe âeâeþáe÷áeðáeéáeâáeÛáeÔáeÍáeÆáe¿áe¸áe±áeªáe£áeœáe•áeŽáe‡áe€áeyáeráekáedáe]áeVáeOáeHáeAáe:áe3áe,áe%áeáeáeáe áeáeûàeôàeíàeæàeßàeØàeÑàeÊàeÃàe¼àeµàe®àe§àe àe™àe’àe‹àe„àe}àevàeoàehàeaàeZàeSàeLàeEàe>àe7àe0àe)àe"àeàeàe àeàeÿßeøßeñßeêßeãßeÜßeÕßeÎßeÇßeÀße¹ße²ße«ße¤ßeße–ßeßeˆßeßezßesßelßeeße^ßeWßePßeIßeBße;ße4ße-ße&ßeßeßeße ßeßeüÞeõÞeîÞeçÞeàÞeÙÞeÒÞeËÞeÄÞe½Þe¶Þe¯Þe¨Þe¡ÞešÞe“ÞeŒÞe…Þe~ÞewÞepÞeiÞebÞe[ÞeTÞeMÞeFÞe?Þe8Þe1Þe*Þe#ÞeÞeÞeÞeÞeÞeùÝeòÝeëÝeäÝeÝÝeÖÝeÏÝeÈÝeÁÝeºÝe³Ýe¬Ýe¥ÝežÝe—ÝeÝe‰Ýe‚Ýe{ÝetÝemÝefÝe_ÝeXÝeQÝeJÝeCÝe<Ýe5Ýe.Ýe'Ýe ÝeÝeÝe ÝeÝeýÜeöÜeïÜeèÜeáÜeÚÜeÓÜeÌÜeÅÜe¾Üe·Üe°Üe©Üe¢Üe›Üe”ÜeÜe†ÜeÜexÜeqÜejÜecÜe\ÜeUÜeNÜeGÜe@Üe9Üe2Üe+Üe$ÜeÜeÜeÜeÜeÜeúÛeóÛeìÛeåÛeÞÛe×ÛeÐÛeÉÛeÂÛe»Ûe´Ûe­Ûe¦ÛeŸÛe˜Ûe‘ÛeŠÛeƒÛe|ÛeuÛenÛegÛe`ÛeYÛeRÛeKÛeDÛe=Ûe6Ûe/Ûe(Ûe!ÛeÛeÛe ÛeÛeþÚe÷ÚeðÚeéÚeâÚeÛÚeÔÚeÍÚeÆÚe¿Úe¸Úe±ÚeªÚe£ÚeœÚe•ÚeŽÚe‡Úe€ÚeyÚerÚekÚedÚe]ÚeVÚeOÚeHÚeAÚe:Úe3Úe,Úe%ÚeÚeÚeÚe ÚeÚeûÙeôÙeíÙeæÙeßÙeØÙeÑÙeÊÙeÃÙe¼ÙeµÙe®Ùe§Ùe Ùe™Ùe’Ùe‹Ùe„Ùe}ÙevÙeoÙehÙeaÙeZÙeSÙeLÙeEÙe>Ùe7Ùe0Ùe)Ùe"ÙeÙeÙe ÙeÙeÿØeøØeñØeêØeãØeÜØeÕØeÎØeÇØeÀØe¹Øe²Øe«Øe¤ØeØe–ØeØeˆØeØezØesØelØeeØe^ØeWØePØeIØeBØe;Øe4Øe-Øe&ØeØeØeØe ØeØeü×eõ×eî×eç×eà×eÙ×eÒ×eË×eÄ×e½×e¶×e¯×e¨×e¡×eš×e“×eŒ×e…×e~×ew×ep×ei×eb×e[×eT×eM×eF×e?×e8×e1×e*×e#×e×e×e×e×e×eùÖeòÖeëÖeäÖeÝÖeÖÖeÏÖeÈÖeÁÖeºÖe³Öe¬Öe¥ÖežÖe—ÖeÖe‰Öe‚Öe{ÖetÖemÖefÖe_ÖeXÖeQÖeJÖeCÖe<Öe5Öe.Öe'Öe ÖeÖeÖe ÖeÖeýÕeöÕeïÕeèÕeáÕeÚÕeÓÕeÌÕeÅÕe¾Õe·Õe°Õe©Õe¢Õe›Õe”ÕeÕe†ÕeÕexÕeqÕejÕecÕe\ÕeUÕeNÕeGÕe@Õe9Õe2Õe+Õe$ÕeÕeÕeÕeÕeÕeúÔeóÔeìÔeåÔeÞÔe×ÔeÐÔeÉÔeÂÔe»Ôe´Ôe­Ôe¦ÔeŸÔe˜Ôe‘ÔeŠÔeƒÔe|ÔeuÔenÔegÔe`ÔeYÔeRÔeKÔeDÔe=Ôe6Ôe/Ôe(Ôe!ÔeÔeÔe ÔeÔeþÓe÷ÓeðÓeéÓeâÓeÛÓeÔÓeÍÓeÆÓe¿Óe¸Óe±ÓeªÓe£ÓeœÓe•ÓeŽÓe‡Óe€ÓeyÓerÓekÓedÓe]ÓeVÓeOÓeHÓeAÓe:Óe3Óe,Óe%ÓeÓeÓeÓe ÓeÓeûÒeôÒeíÒeæÒeßÒeØÒeÑÒeÊÒeÃÒe¼ÒeµÒe®Òe§Òe Òe™Òe’Òe‹Òe„Òe}ÒevÒeoÒehÒeaÒeZÒeSÒeLÒeEÒe>Òe7Òe0Òe)Òe"ÒeÒeÒe ÒeÒeÿÑeøÑeñÑeêÑeãÑeÜÑeÕÑeÎÑeÇÑeÀÑe¹Ñe²Ñe«Ñe¤ÑeÑe–ÑeÑeˆÑeÑezÑesÑelÑeeÑe^ÑeWÑePÑeIÑeBÑe;Ñe4Ñe-Ñe&ÑeÑeÑeÑe ÑeÑeüÐeõÐeîÐeçÐeàÐeÙÐeÒÐeËÐeÄÐe½Ðe¶Ðe¯Ðe¨Ðe¡ÐešÐe“ÐeŒÐe…Ðe~ÐewÐepÐeiÐebÐe[ÐeTÐeMÐeFÐe?Ðe8Ðe1Ðe*Ðe#ÐeÐeÐeÐeÐeÐeùÏeòÏeëÏeäÏeÝÏeÖÏeÏÏeÈÏeÁÏeºÏe³Ïe¬Ïe¥ÏežÏe—ÏeÏe‰Ïe‚Ïe{ÏetÏemÏefÏe_ÏeXÏeQÏeJÏeCÏe<Ïe5Ïe.Ïe'Ïe ÏeÏeÏe ÏeÏeýÎeöÎeïÎeèÎeáÎeÚÎeÓÎeÌÎeÅÎe¾Îe·Îe°Îe©Îe¢Îe›Îe”ÎeÎe†ÎeÎexÎeqÎejÎecÎe\ÎeUÎeNÎeGÎe@Îe9Îe2Îe+Îe$ÎeÎeÎeÎeÎeÎeúÍeóÍeìÍeåÍeÞÍe×ÍeÐÍeÉÍeÂÍe»Íe´Íe­Íe¦ÍeŸÍe˜Íe‘ÍeŠÍeƒÍe|ÍeuÍenÍegÍe`ÍeYÍeRÍeKÍeDÍe=Íe6Íe/Íe(Íe!ÍeÍeÍe ÍeÍeþÌe÷ÌeðÌeéÌeâÌeÛÌeÔÌeÍÌeÆÌe¿Ìe¸Ìe±ÌeªÌe£ÌeœÌe•ÌeŽÌe‡Ìe€ÌeyÌerÌekÌedÌe]ÌeVÌeOÌeHÌeAÌe:Ìe3Ìe,Ìe%ÌeÌeÌeÌe ÌeÌeûËeôËeíËeæËeßËeØËeÑËeÊËeÃËe¼ËeµËe®Ëe§Ëe Ëe™Ëe’Ëe‹Ëe„Ëe}ËevËeoËehËeaËeZËeSËeLËeEËe>Ëe7Ëe0Ëe)Ëe"ËeËeËe ËeËeÿÊeøÊeñÊeêÊeãÊeÜÊeÕÊeÎÊeÇÊeÀÊe¹Êe²Êe«Êe¤ÊeÊe–ÊeÊeˆÊeÊezÊesÊelÊeeÊe^ÊeWÊePÊeIÊeBÊe;Êe4Êe-Êe&ÊeÊeÊeÊe ÊeÊeüÉeõÉeîÉeçÉeàÉeÙÉeÒÉeËÉeÄÉe½Ée¶Ée¯Ée¨Ée¡ÉešÉe“ÉeŒÉe…Ée~ÉewÉepÉeiÉebÉe[ÉeTÉeMÉeFÉe?Ée8Ée1Ée*Ée#ÉeÉeÉeÉeÉeÉeùÈeòÈeëÈeäÈeÝÈeÖÈeÏÈeÈÈeÁÈeºÈe³Èe¬Èe¥ÈežÈe—ÈeÈe‰Èe‚Èe{ÈetÈemÈefÈe_ÈeXÈeQÈeJÈeCÈe<Èe5Èe.Èe'Èe ÈeÈeÈe ÈeÈeýÇeöÇeïÇeèÇeáÇeÚÇeÓÇeÌÇeÅÇe¾Çe·Çe°Çe©Çe¢Çe›Çe”ÇeÇe†ÇeÇexÇeqÇejÇecÇe\ÇeUÇeNÇeGÇe@Çe9Çe2Çe+Çe$ÇeÇeÇeÇeÇeÇeúÆeóÆeìÆeåÆeÞÆeׯeÐÆeÉÆeÂÆe»Æe´Æe­Æe¦ÆeŸÆe˜Æe‘ÆeŠÆeƒÆe|ÆeuÆenÆegÆe`ÆeYÆeRÆeKÆeDÆe=Æe6Æe/Æe(Æe!ÆeÆeÆe ÆeÆeþÅe÷ÅeðÅeéÅeâÅeÛÅeÔÅeÍÅeÆÅe¿Åe¸Åe±ÅeªÅe£ÅeœÅe•ÅeŽÅe‡Åe€ÅeyÅerÅekÅedÅe]ÅeVÅeOÅeHÅeAÅe:Åe3Åe,Åe%ÅeÅeÅeÅe ÅeÅeûÄeôÄeíÄeæÄeßÄeØÄeÑÄeÊÄeÃÄe¼ÄeµÄe®Äe§Äe Äe™Äe’Äe‹Äe„Äe}ÄevÄeoÄehÄeaÄeZÄeSÄeLÄeEÄe>Äe7Äe0Äe)Äe"ÄeÄeÄe ÄeÄeÿÃeøÃeñÃeêÃeãÃeÜÃeÕÃeÎÃeÇÃeÀÃe¹Ãe²Ãe«Ãe¤ÃeÃe–ÃeÃeˆÃeÃezÃesÃelÃeeÃe^ÃeWÃePÃeIÃeBÃe;Ãe4Ãe-Ãe&ÃeÃeÃeÃe ÃeÃeüÂeõÂeîÂeçÂeàÂeÙÂeÒÂeËÂeÄÂe½Âe¶Âe¯Âe¨Âe¡ÂešÂe“ÂeŒÂe…Âe~ÂewÂepÂeiÂebÂe[ÂeTÂeMÂeFÂe?Âe8Âe1Âe*Âe#ÂeÂeÂeÂeÂeÂeùÁeòÁeëÁeäÁeÝÁeÖÁeÏÁeÈÁeÁÁeºÁe³Áe¬Áe¥ÁežÁe—ÁeÁe‰Áe‚Áe{ÁetÁemÁefÁe_ÁeXÁeQÁeJÁeCÁe<Áe5Áe.Áe'Áe ÁeÁeÁe ÁeÁeýÀeöÀeïÀeèÀeáÀeÚÀeÓÀeÌÀeÅÀe¾Àe·Àe°Àe©Àe¢Àe›Àe”ÀeÀe†ÀeÀexÀeqÀejÀecÀe\ÀeUÀeNÀeGÀe@Àe9Àe2Àe+Àe$ÀeÀeÀeÀeÀeÀeú¿eó¿eì¿eå¿eÞ¿e׿eпeÉ¿e¿e»¿e´¿e­¿e¦¿eŸ¿e˜¿e‘¿eŠ¿eƒ¿e|¿eu¿en¿eg¿e`¿eY¿eR¿eK¿eD¿e=¿e6¿e/¿e(¿e!¿e¿e¿e ¿e¿eþ¾e÷¾eð¾eé¾eâ¾eÛ¾eÔ¾e;eƾe¿¾e¸¾e±¾eª¾e£¾eœ¾e•¾e޾e‡¾e€¾ey¾er¾ek¾ed¾e]¾eV¾eO¾eH¾eA¾e:¾e3¾e,¾e%¾e¾e¾e¾e ¾e¾eû½eô½eí½eæ½eß½eؽeѽeʽeýe¼½eµ½e®½e§½e ½e™½e’½e‹½e„½e}½ev½eo½eh½ea½eZ½eS½eL½eE½e>½e7½e0½e)½e"½e½e½e ½e½eÿ¼eø¼eñ¼eê¼eã¼eܼeÕ¼eμeǼeÀ¼e¹¼e²¼e«¼e¤¼e¼e–¼e¼eˆ¼e¼ez¼es¼el¼ee¼e^¼eW¼eP¼eI¼eB¼e;¼e4¼e-¼e&¼e¼e¼e¼e ¼e¼eü»eõ»eî»eç»eà»eÙ»eÒ»eË»eÄ»e½»e¶»e¯»e¨»e¡»eš»e“»eŒ»e…»e~»ew»ep»ei»eb»e[»eT»eM»eF»e?»e8»e1»e*»e#»e»e»e»e»e»eùºeòºeëºeäºeݺeÖºeϺeȺeÁºeººe³ºe¬ºe¥ºežºe—ºeºe‰ºe‚ºe{ºetºemºefºe_ºeXºeQºeJºeCºe<ºe5ºe.ºe'ºe ºeºeºe ºeºeý¹eö¹eï¹eè¹eá¹eÚ¹eÓ¹e̹eŹe¾¹e·¹e°¹e©¹e¢¹e›¹e”¹e¹e†¹e¹ex¹eq¹ej¹ec¹e\¹eU¹eN¹eG¹e@¹e9¹e2¹e+¹e$¹e¹e¹e¹e¹e¹eú¸eó¸eì¸eå¸eÞ¸e׸eиeɸe¸e»¸e´¸e­¸e¦¸eŸ¸e˜¸e‘¸eЏeƒ¸e|¸eu¸en¸eg¸e`¸eY¸eR¸eK¸eD¸e=¸e6¸e/¸e(¸e!¸e¸e¸e ¸e¸eþ·e÷·eð·eé·eâ·eÛ·eÔ·eÍ·eÆ·e¿·e¸·e±·eª·e£·eœ·e•·eŽ·e‡·e€·ey·er·ek·ed·e]·eV·eO·eH·eA·e:·e3·e,·e%·e·e·e·e ·e·eû¶eô¶eí¶eæ¶eß¶eضeѶeʶeöe¼¶eµ¶e®¶e§¶e ¶e™¶e’¶e‹¶e„¶e}¶ev¶eo¶eh¶ea¶eZ¶eS¶eL¶eE¶e>¶e7¶e0¶e)¶e"¶e¶e¶e ¶e¶eÿµeøµeñµeêµeãµeܵeÕµeεeǵeÀµe¹µe²µe«µe¤µeµe–µeµeˆµeµezµesµelµeeµe^µeWµePµeIµeBµe;µe4µe-µe&µeµeµeµe µeµeü´eõ´eî´eç´eà´eÙ´eÒ´eË´eÄ´e½´e¶´e¯´e¨´e¡´eš´e“´eŒ´e…´e~´ew´ep´ei´eb´e[´eT´eM´eF´e?´e8´e1´e*´e#´e´e´e´e´e´eù³eò³eë³eä³eݳeÖ³eϳeȳeÁ³eº³e³³e¬³e¥³ež³e—³e³e‰³e‚³e{³et³em³ef³e_³eX³eQ³eJ³eC³e<³e5³e.³e'³e ³e³e³e ³e³eý²eö²eï²eè²eá²eÚ²eÓ²e̲eŲe¾²e·²e°²e©²e¢²e›²e”²e²e†²e²ex²eq²ej²ec²e\²eU²eN²eG²e@²e9²e2²e+²e$²e²e²e²e²e²eú±eó±eì±eå±eÞ±e×±eбeɱe±e»±e´±e­±e¦±eŸ±e˜±e‘±eбeƒ±e|±eu±en±eg±e`±eY±eR±eK±eD±e=±e6±e/±e(±e!±e±e±e ±e±eþ°e÷°eð°eé°eâ°eÛ°eÔ°eͰeưe¿°e¸°e±°eª°e£°eœ°e•°eްe‡°e€°ey°er°ek°ed°e]°eV°eO°eH°eA°e:°e3°e,°e%°e°e°e°e °e°eû¯eô¯eí¯eæ¯e߯eدeѯeʯeïe¼¯eµ¯e®¯e§¯e ¯e™¯e’¯e‹¯e„¯e}¯ev¯eo¯eh¯ea¯eZ¯eS¯eL¯eE¯e>¯e7¯e0¯e)¯e"¯e¯e¯e ¯e¯eÿ®eø®eñ®eê®eã®eÜ®eÕ®eήeÇ®eÀ®e¹®e²®e«®e¤®e®e–®e®eˆ®e®ez®es®el®ee®e^®eW®eP®eI®eB®e;®e4®e-®e&®e®e®e®e ®e®eü­eõ­eî­eç­eà­eÙ­eÒ­eË­eÄ­e½­e¶­e¯­e¨­e¡­eš­e“­eŒ­e…­e~­ew­ep­ei­eb­e[­eT­eM­eF­e?­e8­e1­e*­e#­e­e­e­e­e­eù¬eò¬eë¬eä¬eݬeÖ¬eϬeȬeÁ¬eº¬e³¬e¬¬e¥¬ež¬e—¬e¬e‰¬e‚¬e{¬et¬em¬ef¬e_¬eX¬eQ¬eJ¬eC¬e<¬e5¬e.¬e'¬e ¬e¬e¬e ¬e¬eý«eö«eï«eè«eá«eÚ«eÓ«eÌ«eÅ«e¾«e·«e°«e©«e¢«e›«e”«e«e†«e«ex«eq«ej«ec«e\«eU«eN«eG«e@«e9«e2«e+«e$«e«e«e«e«e«eúªeóªeìªeåªeÞªeתeЪeɪeªe»ªe´ªe­ªe¦ªeŸªe˜ªe‘ªeŠªeƒªe|ªeuªenªegªe`ªeYªeRªeKªeDªe=ªe6ªe/ªe(ªe!ªeªeªe ªeªeþ©e÷©eð©eé©eâ©eÛ©eÔ©eÍ©eÆ©e¿©e¸©e±©eª©e£©eœ©e•©eŽ©e‡©e€©ey©er©ek©ed©e]©eV©eO©eH©eA©e:©e3©e,©e%©e©e©e©e ©e©eû¨eô¨eí¨eæ¨eߨeبeѨeʨeèe¼¨eµ¨e®¨e§¨e ¨e™¨e’¨e‹¨e„¨e}¨ev¨eo¨eh¨ea¨eZ¨eS¨eL¨eE¨e>¨e7¨e0¨e)¨e"¨e¨e¨e ¨e¨eÿ§eø§eñ§eê§eã§eܧeÕ§eΧeǧeÀ§e¹§e²§e«§e¤§e§e–§e§eˆ§e§ez§es§el§ee§e^§eW§eP§eI§eB§e;§e4§e-§e&§e§e§e§e §e§eü¦eõ¦eî¦eç¦eà¦eÙ¦eÒ¦e˦eĦe½¦e¶¦e¯¦e¨¦e¡¦eš¦e“¦eŒ¦e…¦e~¦ew¦ep¦ei¦eb¦e[¦eT¦eM¦eF¦e?¦e8¦e1¦e*¦e#¦e¦e¦e¦e¦e¦eù¥eò¥eë¥eä¥eÝ¥eÖ¥eÏ¥eÈ¥eÁ¥eº¥e³¥e¬¥e¥¥ež¥e—¥e¥e‰¥e‚¥e{¥et¥em¥ef¥e_¥eX¥eQ¥eJ¥eC¥e<¥e5¥e.¥e'¥e ¥e¥e¥e ¥e¥eý¤eö¤eï¤eè¤eá¤eÚ¤eÓ¤e̤eŤe¾¤e·¤e°¤e©¤e¢¤e›¤e”¤e¤e†¤e¤ex¤eq¤ej¤ec¤e\¤eU¤eN¤eG¤e@¤e9¤e2¤e+¤e$¤e¤e¤e¤e¤e¤eú£eó£eì£eå£eÞ£e×£eУeÉ£e£e»£e´£e­£e¦£eŸ£e˜£e‘£eŠ£eƒ£e|£eu£en£eg£e`£eY£eR£eK£eD£e=£e6£e/£e(£e!£e£e£e £e£eþ¢e÷¢eð¢eé¢eâ¢eÛ¢eÔ¢eÍ¢eÆ¢e¿¢e¸¢e±¢eª¢e£¢eœ¢e•¢eŽ¢e‡¢e€¢ey¢er¢ek¢ed¢e]¢eV¢eO¢eH¢eA¢e:¢e3¢e,¢e%¢e¢e¢e¢e ¢e¢eû¡eô¡eí¡eæ¡eß¡eØ¡eÑ¡eÊ¡eáe¼¡eµ¡e®¡e§¡e ¡e™¡e’¡e‹¡e„¡e}¡ev¡eo¡eh¡ea¡eZ¡eS¡eL¡eE¡e>¡e7¡e0¡e)¡e"¡e¡e¡e ¡e¡eÿ eø eñ eê eã eÜ eÕ eΠeÇ eÀ e¹ e² e« e¤ e e– e eˆ e ez es el ee e^ eW eP eI eB e; e4 e- e& e e e e  e eüŸeõŸeîŸeçŸeàŸeÙŸeÒŸeËŸeÄŸe½Ÿe¶Ÿe¯Ÿe¨Ÿe¡ŸešŸe“ŸeŒŸe…Ÿe~ŸewŸepŸeiŸebŸe[ŸeTŸeMŸeFŸe?Ÿe8Ÿe1Ÿe*Ÿe#ŸeŸeŸeŸeŸeŸeùžeòžeëžeäžeÝžeÖžeÏžeÈžeÁžeºže³že¬že¥žežže—žeže‰že‚že{žetžemžefže_žeXžeQžeJžeCže<že5že.že'že žežeže žežeýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeúœeóœeìœeåœeÞœeלeМeÉœeœe»œe´œe­œe¦œeŸœe˜œe‘œeŠœeƒœe|œeuœenœegœe`œeYœeRœeKœeDœe=œe6œe/œe(œe!œeœeœe œeœeþ›e÷›eð›eé›eâ›eÛ›eÔ›eÍ›eÆ›e¿›e¸›e±›eª›e£›eœ›e•›eŽ›e‡›e€›ey›er›ek›ed›e]›eV›eO›eH›eA›e:›e3›e,›e%›e›e›e›e ›e›eûšeôšeíšeæšeßšeØšeÑšeÊšeÚe¼šeµše®še§še še™še’še‹še„še}ševšeošehšeašeZšeSšeLšeEše>še7še0še)še"šešeše šešeÿ™eø™eñ™eê™eã™eÜ™eÕ™eΙeÇ™eÀ™e¹™e²™e«™e¤™e™e–™e™eˆ™e™ez™es™el™ee™e^™eW™eP™eI™eB™e;™e4™e-™e&™e™e™e™e ™e™eü˜eõ˜eî˜eç˜eà˜eÙ˜eÒ˜e˘eĘe½˜e¶˜e¯˜e¨˜e¡˜eš˜e“˜eŒ˜e…˜e~˜ew˜ep˜ei˜eb˜e[˜eT˜eM˜eF˜e?˜e8˜e1˜e*˜e#˜e˜e˜e˜e˜e˜eù—eò—eë—eä—eÝ—eÖ—eÏ—eÈ—eÁ—eº—e³—e¬—e¥—ež—e——e—e‰—e‚—e{—et—em—ef—e_—eX—eQ—eJ—eC—e<—e5—e.—e'—e —e—e—e —e—eý–eö–eï–eè–eá–eÚ–eÓ–eÌ–eÅ–e¾–e·–e°–e©–e¢–e›–e”–e–e†–e–ex–eq–ej–ec–e\–eU–eN–eG–e@–e9–e2–e+–e$–e–e–e–e–e–eú•eó•eì•eå•eÞ•eוeЕeÉ•e•e»•e´•e­•e¦•eŸ•e˜•e‘•eŠ•eƒ•e|•eu•en•eg•e`•eY•eR•eK•eD•e=•e6•e/•e(•e!•e•e•e •e•eþ”e÷”eð”eé”eâ”eÛ”eÔ”eÍ”eÆ”e¿”e¸”e±”eª”e£”eœ”e•”eŽ”e‡”e€”ey”er”ek”ed”e]”eV”eO”eH”eA”e:”e3”e,”e%”e”e”e”e ”e”eû“eô“eí“eæ“eß“eØ“eÑ“eÊ“eÓe¼“eµ“e®“e§“e “e™“e’“e‹“e„“e}“ev“eo“eh“ea“eZ“eS“eL“eE“e>“e7“e0“e)“e"“e“e“e “e“eÿ’eø’eñ’eê’eã’eÜ’eÕ’eÎ’eÇ’eÀ’e¹’e²’e«’e¤’e’e–’e’eˆ’e’ez’es’el’ee’e^’eW’eP’eI’eB’e;’e4’e-’e&’e’e’e’e ’e’eü‘eõ‘eî‘eç‘eà‘eÙ‘eÒ‘eË‘eÄ‘e½‘e¶‘e¯‘e¨‘e¡‘eš‘e“‘eŒ‘e…‘e~‘ew‘ep‘ei‘eb‘e[‘eT‘eM‘eF‘e?‘e8‘e1‘e*‘e#‘e‘e‘e‘e‘e‘eùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCeŒe7Œe0Œe)Œe"ŒeŒeŒe ŒeŒeÿ‹eø‹eñ‹eê‹eã‹eÜ‹eÕ‹e΋eÇ‹eÀ‹e¹‹e²‹e«‹e¤‹e‹e–‹e‹eˆ‹e‹ez‹es‹el‹ee‹e^‹eW‹eP‹eI‹eB‹e;‹e4‹e-‹e&‹e‹e‹e‹e ‹e‹eüŠeõŠeîŠeçŠeàŠeÙŠeÒŠeËŠeÄŠe½Še¶Še¯Še¨Še¡ŠešŠe“ŠeŒŠe…Še~ŠewŠepŠeiŠebŠe[ŠeTŠeMŠeFŠe?Še8Še1Še*Še#ŠeŠeŠeŠeŠeŠeù‰eò‰eë‰eä‰e݉eÖ‰eωeȉeÁ‰eº‰e³‰e¬‰e¥‰ež‰e—‰e‰e‰‰e‚‰e{‰et‰em‰ef‰e_‰eX‰eQ‰eJ‰eC‰e<‰e5‰e.‰e'‰e ‰e‰e‰e ‰e‰eýˆeöˆeïˆeèˆeáˆeÚˆeÓˆëeňe¾ˆe·ˆe°ˆe©ˆe¢ˆe›ˆe”ˆeˆe†ˆeˆexˆeqˆejˆecˆe\ˆeUˆeNˆeGˆe@ˆe9ˆe2ˆe+ˆe$ˆeˆeˆeˆeˆeˆeú‡eó‡eì‡eå‡eÞ‡eׇeЇeɇe‡e»‡e´‡e­‡e¦‡eŸ‡e˜‡e‘‡eЇeƒ‡e|‡eu‡en‡eg‡e`‡eY‡eR‡eK‡eD‡e=‡e6‡e/‡e(‡e!‡e‡e‡e ‡e‡eþ†e÷†eð†eé†eâ†eÛ†eÔ†e͆eƆe¿†e¸†e±†eª†e£†eœ†e•†eކe‡†e€†ey†er†ek†ed†e]†eV†eO†eH†eA†e:†e3†e,†e%†e†e†e†e †e†eû…eô…eí…eæ…eß…eØ…eÑ…eÊ…eÃ…e¼…eµ…e®…e§…e …e™…e’…e‹…e„…e}…ev…eo…eh…ea…eZ…eS…eL…eE…e>…e7…e0…e)…e"…e…e…e …e…eÿ„eø„eñ„eê„eã„eÜ„eÕ„e΄eÇ„eÀ„e¹„e²„e«„e¤„e„e–„e„eˆ„e„ez„es„el„ee„e^„eW„eP„eI„eB„e;„e4„e-„e&„e„e„e„e „e„eüƒeõƒeîƒeçƒeàƒeÙƒeÒƒe˃eăe½ƒe¶ƒe¯ƒe¨ƒe¡ƒešƒe“ƒeŒƒe…ƒe~ƒewƒepƒeiƒebƒe[ƒeTƒeMƒeFƒe?ƒe8ƒe1ƒe*ƒe#ƒeƒeƒeƒeƒeƒeù‚eò‚eë‚eä‚eÝ‚eÖ‚eÏ‚eÈ‚eÁ‚eº‚e³‚e¬‚e¥‚ež‚e—‚e‚e‰‚e‚‚e{‚et‚em‚ef‚e_‚eX‚eQ‚eJ‚eC‚e<‚e5‚e.‚e'‚e ‚e‚e‚e ‚e‚eýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeú€eó€eì€eå€eÞ€e×€eЀeÉ€e€e»€e´€e­€e¦€eŸ€e˜€e‘€eŠ€eƒ€e|€eu€en€eg€e`€eY€eR€eK€eD€e=€e6€e/€e(€e!€e€e€e €e€eþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeû~eô~eí~eæ~eß~eØ~eÑ~eÊ~eÃ~e¼~eµ~e®~e§~e ~e™~e’~e‹~e„~e}~ev~eo~eh~ea~eZ~eS~eL~eE~e>~e7~e0~e)~e"~e~e~e ~e~eÿ}eø}eñ}eê}eã}eÜ}eÕ}eÎ}eÇ}eÀ}e¹}e²}e«}e¤}e}e–}e}eˆ}e}ez}es}el}ee}e^}eW}eP}eI}eB}e;}e4}e-}e&}e}e}e}e }e}eü|eõ|eî|eç|eà|eÙ|eÒ|eË|eÄ|e½|e¶|e¯|e¨|e¡|eš|e“|eŒ|e…|e~|ew|ep|ei|eb|e[|eT|eM|eF|e?|e8|e1|e*|e#|e|e|e|e|e|eù{eò{eë{eä{eÝ{eÖ{eÏ{eÈ{eÁ{eº{e³{e¬{e¥{ež{e—{e{e‰{e‚{e{{et{em{ef{e_{eX{eQ{eJ{eC{e<{e5{e.{e'{e {e{e{e {e{eýzeözeïzeèzeázeÚzeÓzeÌzeÅze¾ze·ze°ze©ze¢ze›ze”zeze†zezexzeqzejzecze\zeUzeNzeGze@ze9ze2ze+ze$zezezezezezeúyeóyeìyeåyeÞye×yeÐyeÉyeÂye»ye´ye­ye¦yeŸye˜ye‘yeŠyeƒye|yeuyenyegye`yeYyeRyeKyeDye=ye6ye/ye(ye!yeyeye yeyeþxe÷xeðxeéxeâxeÛxeÔxeÍxeÆxe¿xe¸xe±xeªxe£xeœxe•xeŽxe‡xe€xeyxerxekxedxe]xeVxeOxeHxeAxe:xe3xe,xe%xexexexe xexeûweôweíweæweßweØweÑweÊweÃwe¼weµwe®we§we we™we’we‹we„we}wevweowehweaweZweSweLweEwe>we7we0we)we"wewewe weweÿveøveñveêveãveÜveÕveÎveÇveÀve¹ve²ve«ve¤veve–veveˆvevezvesvelveeve^veWvePveIveBve;ve4ve-ve&veveveve veveüueõueîueçueàueÙueÒueËueÄue½ue¶ue¯ue¨ue¡uešue“ueŒue…ue~uewuepueiuebue[ueTueMueFue?ue8ue1ue*ue#ueueueueueueùteòteëteäteÝteÖteÏteÈteÁteºte³te¬te¥težte—tete‰te‚te{tettemtefte_teXteQteJteCtepe7pe0pe)pe"pepepe pepeÿoeøoeñoeêoeãoeÜoeÕoeÎoeÇoeÀoe¹oe²oe«oe¤oeoe–oeoeˆoeoezoesoeloeeoe^oeWoePoeIoeBoe;oe4oe-oe&oeoeoeoe oeoeüneõneîneçneàneÙneÒneËneÄne½ne¶ne¯ne¨ne¡nešne“neŒne…ne~newnepneinebne[neTneMneFne?ne8ne1ne*ne#neneneneneneùmeòmeëmeämeÝmeÖmeÏmeÈmeÁmeºme³me¬me¥mežme—meme‰me‚me{metmemmefme_meXmeQmeJmeCmeie7ie0ie)ie"ieieie ieieÿheøheñheêheãheÜheÕheÎheÇheÀhe¹he²he«he¤hehe–heheˆhehezheshelheehe^heWhePheIheBhe;he4he-he&hehehehe heheügeõgeîgeçgeàgeÙgeÒgeËgeÄge½ge¶ge¯ge¨ge¡gešge“geŒge…ge~gewgepgeigebge[geTgeMgeFge?ge8ge1ge*ge#gegegegegegeùfeòfeëfeäfeÝfeÖfeÏfeÈfeÁfeºfe³fe¬fe¥fežfe—fefe‰fe‚fe{fetfemfeffe_feXfeQfeJfeCfebe7be0be)be"bebebe bebeÿaeøaeñaeêaeãaeÜaeÕaeÎaeÇaeÀae¹ae²ae«ae¤aeae–aeaeˆaeaezaesaelaeeae^aeWaePaeIaeBae;ae4ae-ae&aeaeaeae aeaeü`eõ`eî`eç`eà`eÙ`eÒ`eË`eÄ`e½`e¶`e¯`e¨`e¡`eš`e“`eŒ`e…`e~`ew`ep`ei`eb`e[`eT`eM`eF`e?`e8`e1`e*`e#`e`e`e`e`e`eù_eò_eë_eä_eÝ_eÖ_eÏ_eÈ_eÁ_eº_e³_e¬_e¥_ež_e—_e_e‰_e‚_e{_et_em_ef_e__eX_eQ_eJ_eC_e<_e5_e._e'_e _e_e_e _e_eý^eö^eï^eè^eá^eÚ^eÓ^eÌ^eÅ^e¾^e·^e°^e©^e¢^e›^e”^e^e†^e^ex^eq^ej^ec^e\^eU^eN^eG^e@^e9^e2^e+^e$^e^e^e^e^e^eú]eó]eì]eå]eÞ]e×]eÐ]eÉ]eÂ]e»]e´]e­]e¦]eŸ]e˜]e‘]eŠ]eƒ]e|]eu]en]eg]e`]eY]eR]eK]eD]e=]e6]e/]e(]e!]e]e]e ]e]eþ\e÷\eð\eé\eâ\eÛ\eÔ\eÍ\eÆ\e¿\e¸\e±\eª\e£\eœ\e•\eŽ\e‡\e€\ey\er\ek\ed\e]\eV\eO\eH\eA\e:\e3\e,\e%\e\e\e\e \e\eû[eô[eí[eæ[eß[eØ[eÑ[eÊ[eÃ[e¼[eµ[e®[e§[e [e™[e’[e‹[e„[e}[ev[eo[eh[ea[eZ[eS[eL[eE[e>[e7[e0[e)[e"[e[e [e[eÿZeøZeñZeêZeãZeÜZeÕZeÎZeÇZeÀZe¹Ze²Ze«Ze¤ZeZe–ZeZeˆZeZezZesZelZeeZe^ZeWZePZeIZeBZe;Ze4Ze-Ze&ZeZeZeZe ZeZeüYeõYeîYeçYeàYeÙYeÒYeËYeÄYe½Ye¶Ye¯Ye¨Ye¡YešYe“YeŒYe…Ye~YewYepYeiYebYe[YeTYeMYeFYe?Ye8Ye1Ye*Ye#YeYeYeYeYeYeùXeòXeëXeäXeÝXeÖXeÏXeÈXeÁXeºXe³Xe¬Xe¥XežXe—XeXe‰Xe‚Xe{XetXemXefXe_XeXXeQXeJXeCXeTe7Te0Te)Te"TeTeTe TeTeÿSeøSeñSeêSeãSeÜSeÕSeÎSeÇSeÀSe¹Se²Se«Se¤SeSe–SeSeˆSeSezSesSelSeeSe^SeWSePSeISeBSe;Se4Se-Se&SeSeSeSe SeSeüReõReîReçReàReÙReÒReËReÄRe½Re¶Re¯Re¨Re¡RešRe“ReŒRe…Re~RewRepReiRebRe[ReTReMReFRe?Re8Re1Re*Re#ReReReReReReùQeòQeëQeäQeÝQeÖQeÏQeÈQeÁQeºQe³Qe¬Qe¥QežQe—QeQe‰Qe‚Qe{QetQemQefQe_QeXQeQQeJQeCQeMe7Me0Me)Me"MeMeMe MeMeÿLeøLeñLeêLeãLeÜLeÕLeÎLeÇLeÀLe¹Le²Le«Le¤LeLe–LeLeˆLeLezLesLelLeeLe^LeWLePLeILeBLe;Le4Le-Le&LeLeLeLe LeLeüKeõKeîKeçKeàKeÙKeÒKeËKeÄKe½Ke¶Ke¯Ke¨Ke¡KešKe“KeŒKe…Ke~KewKepKeiKebKe[KeTKeMKeFKe?Ke8Ke1Ke*Ke#KeKeKeKeKeKeùJeòJeëJeäJeÝJeÖJeÏJeÈJeÁJeºJe³Je¬Je¥JežJe—JeJe‰Je‚Je{JetJemJefJe_JeXJeQJeJJeCJeFe7Fe0Fe)Fe"FeFeFe FeFeÿEeøEeñEeêEeãEeÜEeÕEeÎEeÇEeÀEe¹Ee²Ee«Ee¤EeEe–EeEeˆEeEezEesEelEeeEe^EeWEePEeIEeBEe;Ee4Ee-Ee&EeEeEeEe EeEeüDeõDeîDeçDeàDeÙDeÒDeËDeÄDe½De¶De¯De¨De¡DešDe“DeŒDe…De~DewDepDeiDebDe[DeTDeMDeFDe?De8De1De*De#DeDeDeDeDeDeùCeòCeëCeäCeÝCeÖCeÏCeÈCeÁCeºCe³Ce¬Ce¥CežCe—CeCe‰Ce‚Ce{CetCemCefCe_CeXCeQCeJCeCCe?e7?e0?e)?e"?e?e?e ?e?eÿ>eø>eñ>eê>eã>eÜ>eÕ>eÎ>eÇ>eÀ>e¹>e²>e«>e¤>e>e–>e>eˆ>e>ez>es>el>ee>e^>eW>eP>eI>eB>e;>e4>e->e&>e>e>e>e >e>eü=eõ=eî=eç=eà=eÙ=eÒ=eË=eÄ=e½=e¶=e¯=e¨=e¡=eš=e“=eŒ=e…=e~=ew=ep=ei=eb=e[=eT=eM=eF=e?=e8=e1=e*=e#=e=e=e=e=e=eù8e78e08e)8e"8e8e8e 8e8eÿ7eø7eñ7eê7eã7eÜ7eÕ7eÎ7eÇ7eÀ7e¹7e²7e«7e¤7e7e–7e7eˆ7e7ez7es7el7ee7e^7eW7eP7eI7eB7e;7e47e-7e&7e7e7e7e 7e7eü6eõ6eî6eç6eà6eÙ6eÒ6eË6eÄ6e½6e¶6e¯6e¨6e¡6eš6e“6eŒ6e…6e~6ew6ep6ei6eb6e[6eT6eM6eF6e?6e86e16e*6e#6e6e6e6e6e6eù5eò5eë5eä5eÝ5eÖ5eÏ5eÈ5eÁ5eº5e³5e¬5e¥5ež5e—5e5e‰5e‚5e{5et5em5ef5e_5eX5eQ5eJ5eC5e<5e55e.5e'5e 5e5e5e 5e5eý4eö4eï4eè4eá4eÚ4eÓ4eÌ4eÅ4e¾4e·4e°4e©4e¢4e›4e”4e4e†4e4ex4eq4ej4ec4e\4eU4eN4eG4e@4e94e24e+4e$4e4e4e4e4e4eú3eó3eì3eå3eÞ3e×3eÐ3eÉ3eÂ3e»3e´3e­3e¦3eŸ3e˜3e‘3eŠ3eƒ3e|3eu3en3eg3e`3eY3eR3eK3eD3e=3e63e/3e(3e!3e3e3e 3e3eþ2e÷2eð2eé2eâ2eÛ2eÔ2eÍ2eÆ2e¿2e¸2e±2eª2e£2eœ2e•2eŽ2e‡2e€2ey2er2ek2ed2e]2eV2eO2eH2eA2e:2e32e,2e%2e2e2e2e 2e2eû1eô1eí1eæ1eß1eØ1eÑ1eÊ1eÃ1e¼1eµ1e®1e§1e 1e™1e’1e‹1e„1e}1ev1eo1eh1ea1eZ1eS1eL1eE1e>1e71e01e)1e"1e1e1e 1e1eÿ0eø0eñ0eê0eã0eÜ0eÕ0eÎ0eÇ0eÀ0e¹0e²0e«0e¤0e0e–0e0eˆ0e0ez0es0el0ee0e^0eW0eP0eI0eB0e;0e40e-0e&0e0e0e0e 0e0eü/eõ/eî/eç/eà/eÙ/eÒ/eË/eÄ/e½/e¶/e¯/e¨/e¡/eš/e“/eŒ/e…/e~/ew/ep/ei/eb/e[/eT/eM/eF/e?/e8/e1/e*/e#/e/e/e/e/e/eù.eò.eë.eä.eÝ.eÖ.eÏ.eÈ.eÁ.eº.e³.e¬.e¥.ež.e—.e.e‰.e‚.e{.et.em.ef.e_.eX.eQ.eJ.eC.e<.e5.e..e'.e .e.e.e .e.eý-eö-eï-eè-eá-eÚ-eÓ-eÌ-eÅ-e¾-e·-e°-e©-e¢-e›-e”-e-e†-e-ex-eq-ej-ec-e\-eU-eN-eG-e@-e9-e2-e+-e$-e-e-e-e-e-eú,eó,eì,eå,eÞ,e×,eÐ,eÉ,eÂ,e»,e´,e­,e¦,eŸ,e˜,e‘,eŠ,eƒ,e|,eu,en,eg,e`,eY,eR,eK,eD,e=,e6,e/,e(,e!,e,e,e ,e,eþ+e÷+eð+eé+eâ+eÛ+eÔ+eÍ+eÆ+e¿+e¸+e±+eª+e£+eœ+e•+eŽ+e‡+e€+ey+er+ek+ed+e]+eV+eO+eH+eA+e:+e3+e,+e%+e+e+e+e +e+eû*eô*eí*eæ*eß*eØ*eÑ*eÊ*eÃ*e¼*eµ*e®*e§*e *e™*e’*e‹*e„*e}*ev*eo*eh*ea*eZ*eS*eL*eE*e>*e7*e0*e)*e"*e*e*e *e*eÿ)eø)eñ)eê)eã)eÜ)eÕ)eÎ)eÇ)eÀ)e¹)e²)e«)e¤)e)e–)e)eˆ)e)ez)es)el)ee)e^)eW)eP)eI)eB)e;)e4)e-)e&)e)e)e)e )e)eü(eõ(eî(eç(eà(eÙ(eÒ(eË(eÄ(e½(e¶(e¯(e¨(e¡(eš(e“(eŒ(e…(e~(ew(ep(ei(eb(e[(eT(eM(eF(e?(e8(e1(e*(e#(e(e(e(e(e(eù'eò'eë'eä'eÝ'eÖ'eÏ'eÈ'eÁ'eº'e³'e¬'e¥'ež'e—'e'e‰'e‚'e{'et'em'ef'e_'eX'eQ'eJ'eC'e<'e5'e.'e''e 'e'e'e 'e'eý&eö&eï&eè&eá&eÚ&eÓ&eÌ&eÅ&e¾&e·&e°&e©&e¢&e›&e”&e&e†&e&ex&eq&ej&ec&e\&eU&eN&eG&e@&e9&e2&e+&e$&e&e&e&e&e&eú%eó%eì%eå%eÞ%e×%eÐ%eÉ%eÂ%e»%e´%e­%e¦%eŸ%e˜%e‘%eŠ%eƒ%e|%eu%en%eg%e`%eY%eR%eK%eD%e=%e6%e/%e(%e!%e%e%e %e%eþ$e÷$eð$eé$eâ$eÛ$eÔ$eÍ$eÆ$e¿$e¸$e±$eª$e£$eœ$e•$eŽ$e‡$e€$ey$er$ek$ed$e]$eV$eO$eH$eA$e:$e3$e,$e%$e$e$e$e $e$eû#eô#eí#eæ#eß#eØ#eÑ#eÊ#eÃ#e¼#eµ#e®#e§#e #e™#e’#e‹#e„#e}#ev#eo#eh#ea#eZ#eS#eL#eE#e>#e7#e0#e)#e"#e#e#e #e#eÿ"eø"eñ"eê"eã"eÜ"eÕ"eÎ"eÇ"eÀ"e¹"e²"e«"e¤"e"e–"e"eˆ"e"ez"es"el"ee"e^"eW"eP"eI"eB"e;"e4"e-"e&"e"e"e"e "e"eü!eõ!eî!eç!eà!eÙ!eÒ!eË!eÄ!e½!e¶!e¯!e¨!e¡!eš!e“!eŒ!e…!e~!ew!ep!ei!eb!e[!eT!eM!eF!e?!e8!e1!e*!e#!e!e!e!e!e!eù eò eë eä eÝ eÖ eÏ eÈ eÁ eº e³ e¬ e¥ ež e— e e‰ e‚ e{ et em ef e_ eX eQ eJ eC e< e5 e. e' e e e e e eýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeúeóeìeåeÞe×eÐeÉeÂe»e´e­e¦eŸe˜e‘eŠeƒe|euenege`eYeReKeDe=e6e/e(e!eee eeþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeûeôeíeæeßeØeÑeÊeÃe¼eµe®e§e e™e’e‹e„e}eveoeheaeZeSeLeEe>e7e0e)e"eee eeÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCe<e5e.e'e eee eeýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeúeóeìeåeÞe×eÐeÉeÂe»e´e­e¦eŸe˜e‘eŠeƒe|euenege`eYeReKeDe=e6e/e(e!eee eeþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeûeôeíeæeßeØeÑeÊeÃe¼eµe®e§e e™e’e‹e„e}eveoeheaeZeSeLeEe>e7e0e)e"eee eeÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCe<e5e.e'e eee eeýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeúeóeìeåeÞe×eÐeÉeÂe»e´e­e¦eŸe˜e‘eŠeƒe|euenege`eYeReKeDe=e6e/e(e!eee eeþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeûeôeíeæeßeØeÑeÊeÃe¼eµe®e§e e™e’e‹e„e}eveoeheaeZeSeLeEe>e7e0e)e"eee eeÿ eø eñ eê eã eÜ eÕ eÎ eÇ eÀ e¹ e² e« e¤ e e– e eˆ e ez es el ee e^ eW eP eI eB e; e4 e- e& e e e e e eü eõ eî eç eà eÙ eÒ eË eÄ e½ e¶ e¯ e¨ e¡ eš e“ eŒ e… e~ ew ep ei eb e[ eT eM eF e? e8 e1 e* e# e e e e e eù eò eë eä eÝ eÖ eÏ eÈ eÁ eº e³ e¬ e¥ ež e— e e‰ e‚ e{ et em ef e_ eX eQ eJ eC e< e5 e. e' e e e e e eý eö eï eè eá eÚ eÓ eÌ eÅ e¾ e· e° e© e¢ e› e” e e† e ex eq ej ec e\ eU eN eG e@ e9 e2 e+ e$ e e e e e eú eó eì eå eÞ e× eÐ eÉ e e» e´ e­ e¦ eŸ e˜ e‘ eŠ eƒ e| eu en eg e` eY eR eK eD e= e6 e/ e( e! e e e e eþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeûeôeíeæeßeØeÑeÊeÃe¼eµe®e§e e™e’e‹e„e}eveoeheaeZeSeLeEe>e7e0e)e"eee eeÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCe<e5e.e'e eee eeýeöeïeèeáeÚeÓeÌeÅe¾e·e°e©e¢e›e”ee†eexeqejece\eUeNeGe@e9e2e+e$eeeeeeúeóeìeåeÞe×eÐeÉeÂe»e´e­e¦eŸe˜e‘eŠeƒe|euenege`eYeReKeDe=e6e/e(e!eee eeþe÷eðeéeâeÛeÔeÍeÆe¿e¸e±eªe£eœe•eŽe‡e€eyerekede]eVeOeHeAe:e3e,e%eeee eeûeôeíeæeßeØeÑeÊeÃe¼eµe®e§e e™e’e‹e„e}eveoeheaeZeSeLeEe>e7e0e)e"eee eeÿÿdøÿdñÿdêÿdãÿdÜÿdÕÿdÎÿdÇÿdÀÿd¹ÿd²ÿd«ÿd¤ÿdÿd–ÿdÿdˆÿdÿdzÿdsÿdlÿdeÿd^ÿdWÿdPÿdIÿdBÿd;ÿd4ÿd-ÿd&ÿdÿdÿdÿd ÿdÿdüþdõþdîþdçþdàþdÙþdÒþdËþdÄþd½þd¶þd¯þd¨þd¡þdšþd“þdŒþd…þd~þdwþdpþdiþdbþd[þdTþdMþdFþd?þd8þd1þd*þd#þdþdþdþdþdþdùýdòýdëýdäýdÝýdÖýdÏýdÈýdÁýdºýd³ýd¬ýd¥ýdžýd—ýdýd‰ýd‚ýd{ýdtýdmýdfýd_ýdXýdQýdJýdCýd<ýd5ýd.ýd'ýd ýdýdýd ýdýdýüdöüdïüdèüdáüdÚüdÓüdÌüdÅüd¾üd·üd°üd©üd¢üd›üd”üdüd†üdüdxüdqüdjüdcüd\üdUüdNüdGüd@üd9üd2üd+üd$üdüdüdüdüdüdúûdóûdìûdåûdÞûd×ûdÐûdÉûdÂûd»ûd´ûd­ûd¦ûdŸûd˜ûd‘ûdŠûdƒûd|ûduûdnûdgûd`ûdYûdRûdKûdDûd=ûd6ûd/ûd(ûd!ûdûdûd ûdûdþúd÷údðúdéúdâúdÛúdÔúdÍúdÆúd¿úd¸úd±údªúd£údœúd•údŽúd‡úd€údyúdrúdkúddúd]údVúdOúdHúdAúd:úd3úd,úd%údúdúdúd údúdûùdôùdíùdæùdßùdØùdÑùdÊùdÃùd¼ùdµùd®ùd§ùd ùd™ùd’ùd‹ùd„ùd}ùdvùdoùdhùdaùdZùdSùdLùdEùd>ùd7ùd0ùd)ùd"ùdùdùd ùdùdÿødøødñødêødãødÜødÕødÎødÇødÀød¹ød²ød«ød¤ødød–ødødˆødødzødsødlødeød^ødWødPødIødBød;ød4ød-ød&ødødødød ødødü÷dõ÷dî÷dç÷dà÷dÙ÷dÒ÷dË÷dÄ÷d½÷d¶÷d¯÷d¨÷d¡÷dš÷d“÷dŒ÷d…÷d~÷dw÷dp÷di÷db÷d[÷dT÷dM÷dF÷d?÷d8÷d1÷d*÷d#÷d÷d÷d÷d÷d÷dùödòödëödäödÝödÖödÏödÈödÁödºöd³öd¬öd¥ödžöd—ödöd‰öd‚öd{ödtödmödföd_ödXödQödJödCöd<öd5öd.öd'öd ödödöd ödödýõdöõdïõdèõdáõdÚõdÓõdÌõdÅõd¾õd·õd°õd©õd¢õd›õd”õdõd†õdõdxõdqõdjõdcõd\õdUõdNõdGõd@õd9õd2õd+õd$õdõdõdõdõdõdúôdóôdìôdåôdÞôd×ôdÐôdÉôdÂôd»ôd´ôd­ôd¦ôdŸôd˜ôd‘ôdŠôdƒôd|ôduôdnôdgôd`ôdYôdRôdKôdDôd=ôd6ôd/ôd(ôd!ôdôdôd ôdôdþód÷ódðódéódâódÛódÔódÍódÆód¿ód¸ód±ódªód£ódœód•ódŽód‡ód€ódyódródkóddód]ódVódOódHódAód:ód3ód,ód%ódódódód ódódûòdôòdíòdæòdßòdØòdÑòdÊòdÃòd¼òdµòd®òd§òd òd™òd’òd‹òd„òd}òdvòdoòdhòdaòdZòdSòdLòdEòd>òd7òd0òd)òd"òdòdòd òdòdÿñdøñdññdêñdãñdÜñdÕñdÎñdÇñdÀñd¹ñd²ñd«ñd¤ñdñd–ñdñdˆñdñdzñdsñdlñdeñd^ñdWñdPñdIñdBñd;ñd4ñd-ñd&ñdñdñdñd ñdñdüðdõðdîðdçðdàðdÙðdÒðdËðdÄðd½ðd¶ðd¯ðd¨ðd¡ðdšðd“ðdŒðd…ðd~ðdwðdpðdiðdbðd[ðdTðdMðdFðd?ðd8ðd1ðd*ðd#ðdðdðdðdðdðdùïdòïdëïdäïdÝïdÖïdÏïdÈïdÁïdºïd³ïd¬ïd¥ïdžïd—ïdïd‰ïd‚ïd{ïdtïdmïdfïd_ïdXïdQïdJïdCïd<ïd5ïd.ïd'ïd ïdïdïd ïdïdýîdöîdïîdèîdáîdÚîdÓîdÌîdÅîd¾îd·îd°îd©îd¢îd›îd”îdîd†îdîdxîdqîdjîdcîd\îdUîdNîdGîd@îd9îd2îd+îd$îdîdîdîdîdîdúídóídìídåídÞíd×ídÐídÉídÂíd»íd´íd­íd¦ídŸíd˜íd‘ídŠídƒíd|íduídnídgíd`ídYídRídKídDíd=íd6íd/íd(íd!ídídíd ídídþìd÷ìdðìdéìdâìdÛìdÔìdÍìdÆìd¿ìd¸ìd±ìdªìd£ìdœìd•ìdŽìd‡ìd€ìdyìdrìdkìddìd]ìdVìdOìdHìdAìd:ìd3ìd,ìd%ìdìdìdìd ìdìdûëdôëdíëdæëdßëdØëdÑëdÊëdÃëd¼ëdµëd®ëd§ëd ëd™ëd’ëd‹ëd„ëd}ëdvëdoëdhëdaëdZëdSëdLëdEëd>ëd7ëd0ëd)ëd"ëdëdëd ëdëdÿêdøêdñêdêêdãêdÜêdÕêdÎêdÇêdÀêd¹êd²êd«êd¤êdêd–êdêdˆêdêdzêdsêdlêdeêd^êdWêdPêdIêdBêd;êd4êd-êd&êdêdêdêd êdêdüédõédîédçédàédÙédÒédËédÄéd½éd¶éd¯éd¨éd¡édšéd“édŒéd…éd~édwédpédiédbéd[édTédMédFéd?éd8éd1éd*éd#édédédédédédùèdòèdëèdäèdÝèdÖèdÏèdÈèdÁèdºèd³èd¬èd¥èdžèd—èdèd‰èd‚èd{èdtèdmèdfèd_èdXèdQèdJèdCèd<èd5èd.èd'èd èdèdèd èdèdýçdöçdïçdèçdáçdÚçdÓçdÌçdÅçd¾çd·çd°çd©çd¢çd›çd”çdçd†çdçdxçdqçdjçdcçd\çdUçdNçdGçd@çd9çd2çd+çd$çdçdçdçdçdçdúædóædìædåædÞæd׿dÐædÉædÂæd»æd´æd­æd¦ædŸæd˜æd‘ædŠædƒæd|æduædnædgæd`ædYædRædKædDæd=æd6æd/æd(æd!ædædæd ædædþåd÷ådðådéådâådÛådÔådÍådÆåd¿åd¸åd±ådªåd£ådœåd•ådŽåd‡åd€ådyådrådkåddåd]ådVådOådHådAåd:åd3åd,åd%ådådådåd ådådûädôädíädæädßädØädÑädÊädÃäd¼ädµäd®äd§äd äd™äd’äd‹äd„äd}ädvädoädhädaädZädSädLädEäd>äd7äd0äd)äd"ädädäd ädädÿãdøãdñãdêãdããdÜãdÕãdÎãdÇãdÀãd¹ãd²ãd«ãd¤ãdãd–ãdãdˆãdãdzãdsãdlãdeãd^ãdWãdPãdIãdBãd;ãd4ãd-ãd&ãdãdãdãd ãdãdüâdõâdîâdçâdàâdÙâdÒâdËâdÄâd½âd¶âd¯âd¨âd¡âdšâd“âdŒâd…âd~âdwâdpâdiâdbâd[âdTâdMâdFâd?âd8âd1âd*âd#âdâdâdâdâdâdùádòádëádäádÝádÖádÏádÈádÁádºád³ád¬ád¥ádžád—ádád‰ád‚ád{ádtádmádfád_ádXádQádJádCád<ád5ád.ád'ád ádádád ádádýàdöàdïàdèàdáàdÚàdÓàdÌàdÅàd¾àd·àd°àd©àd¢àd›àd”àdàd†àdàdxàdqàdjàdcàd\àdUàdNàdGàd@àd9àd2àd+àd$àdàdàdàdàdàdúßdóßdìßdåßdÞßd×ßdÐßdÉßdÂßd»ßd´ßd­ßd¦ßdŸßd˜ßd‘ßdŠßdƒßd|ßdußdnßdgßd`ßdYßdRßdKßdDßd=ßd6ßd/ßd(ßd!ßdßdßd ßdßdþÞd÷ÞdðÞdéÞdâÞdÛÞdÔÞdÍÞdÆÞd¿Þd¸Þd±ÞdªÞd£ÞdœÞd•ÞdŽÞd‡Þd€ÞdyÞdrÞdkÞddÞd]ÞdVÞdOÞdHÞdAÞd:Þd3Þd,Þd%ÞdÞdÞdÞd ÞdÞdûÝdôÝdíÝdæÝdßÝdØÝdÑÝdÊÝdÃÝd¼ÝdµÝd®Ýd§Ýd Ýd™Ýd’Ýd‹Ýd„Ýd}ÝdvÝdoÝdhÝdaÝdZÝdSÝdLÝdEÝd>Ýd7Ýd0Ýd)Ýd"ÝdÝdÝd ÝdÝdÿÜdøÜdñÜdêÜdãÜdÜÜdÕÜdÎÜdÇÜdÀÜd¹Üd²Üd«Üd¤ÜdÜd–ÜdÜdˆÜdÜdzÜdsÜdlÜdeÜd^ÜdWÜdPÜdIÜdBÜd;Üd4Üd-Üd&ÜdÜdÜdÜd ÜdÜdüÛdõÛdîÛdçÛdàÛdÙÛdÒÛdËÛdÄÛd½Ûd¶Ûd¯Ûd¨Ûd¡ÛdšÛd“ÛdŒÛd…Ûd~ÛdwÛdpÛdiÛdbÛd[ÛdTÛdMÛdFÛd?Ûd8Ûd1Ûd*Ûd#ÛdÛdÛdÛdÛdÛdùÚdòÚdëÚdäÚdÝÚdÖÚdÏÚdÈÚdÁÚdºÚd³Úd¬Úd¥ÚdžÚd—ÚdÚd‰Úd‚Úd{ÚdtÚdmÚdfÚd_ÚdXÚdQÚdJÚdCÚd<Úd5Úd.Úd'Úd ÚdÚdÚd ÚdÚdýÙdöÙdïÙdèÙdáÙdÚÙdÓÙdÌÙdÅÙd¾Ùd·Ùd°Ùd©Ùd¢Ùd›Ùd”ÙdÙd†ÙdÙdxÙdqÙdjÙdcÙd\ÙdUÙdNÙdGÙd@Ùd9Ùd2Ùd+Ùd$ÙdÙdÙdÙdÙdÙdúØdóØdìØdåØdÞØdרdÐØdÉØdÂØd»Ød´Ød­Ød¦ØdŸØd˜Ød‘ØdŠØdƒØd|ØduØdnØdgØd`ØdYØdRØdKØdDØd=Ød6Ød/Ød(Ød!ØdØdØd ØdØdþ×d÷×dð×dé×dâ×dÛ×dÔ×dÍ×dÆ×d¿×d¸×d±×dª×d£×dœ×d•×dŽ×d‡×d€×dy×dr×dk×dd×d]×dV×dO×dH×dA×d:×d3×d,×d%×d×d×d×d ×d×dûÖdôÖdíÖdæÖdßÖdØÖdÑÖdÊÖdÃÖd¼ÖdµÖd®Öd§Öd Öd™Öd’Öd‹Öd„Öd}ÖdvÖdoÖdhÖdaÖdZÖdSÖdLÖdEÖd>Öd7Öd0Öd)Öd"ÖdÖdÖd ÖdÖdÿÕdøÕdñÕdêÕdãÕdÜÕdÕÕdÎÕdÇÕdÀÕd¹Õd²Õd«Õd¤ÕdÕd–ÕdÕdˆÕdÕdzÕdsÕdlÕdeÕd^ÕdWÕdPÕdIÕdBÕd;Õd4Õd-Õd&ÕdÕdÕdÕd ÕdÕdüÔdõÔdîÔdçÔdàÔdÙÔdÒÔdËÔdÄÔd½Ôd¶Ôd¯Ôd¨Ôd¡ÔdšÔd“ÔdŒÔd…Ôd~ÔdwÔdpÔdiÔdbÔd[ÔdTÔdMÔdFÔd?Ôd8Ôd1Ôd*Ôd#ÔdÔdÔdÔdÔdÔdùÓdòÓdëÓdäÓdÝÓdÖÓdÏÓdÈÓdÁÓdºÓd³Ód¬Ód¥ÓdžÓd—ÓdÓd‰Ód‚Ód{ÓdtÓdmÓdfÓd_ÓdXÓdQÓdJÓdCÓd<Ód5Ód.Ód'Ód ÓdÓdÓd ÓdÓdýÒdöÒdïÒdèÒdáÒdÚÒdÓÒdÌÒdÅÒd¾Òd·Òd°Òd©Òd¢Òd›Òd”ÒdÒd†ÒdÒdxÒdqÒdjÒdcÒd\ÒdUÒdNÒdGÒd@Òd9Òd2Òd+Òd$ÒdÒdÒdÒdÒdÒdúÑdóÑdìÑdåÑdÞÑd×ÑdÐÑdÉÑdÂÑd»Ñd´Ñd­Ñd¦ÑdŸÑd˜Ñd‘ÑdŠÑdƒÑd|ÑduÑdnÑdgÑd`ÑdYÑdRÑdKÑdDÑd=Ñd6Ñd/Ñd(Ñd!ÑdÑdÑd ÑdÑdþÐd÷ÐdðÐdéÐdâÐdÛÐdÔÐdÍÐdÆÐd¿Ðd¸Ðd±ÐdªÐd£ÐdœÐd•ÐdŽÐd‡Ðd€ÐdyÐdrÐdkÐddÐd]ÐdVÐdOÐdHÐdAÐd:Ðd3Ðd,Ðd%ÐdÐdÐdÐd ÐdÐdûÏdôÏdíÏdæÏdßÏdØÏdÑÏdÊÏdÃÏd¼ÏdµÏd®Ïd§Ïd Ïd™Ïd’Ïd‹Ïd„Ïd}ÏdvÏdoÏdhÏdaÏdZÏdSÏdLÏdEÏd>Ïd7Ïd0Ïd)Ïd"ÏdÏdÏd ÏdÏdÿÎdøÎdñÎdêÎdãÎdÜÎdÕÎdÎÎdÇÎdÀÎd¹Îd²Îd«Îd¤ÎdÎd–ÎdÎdˆÎdÎdzÎdsÎdlÎdeÎd^ÎdWÎdPÎdIÎdBÎd;Îd4Îd-Îd&ÎdÎdÎdÎd ÎdÎdüÍdõÍdîÍdçÍdàÍdÙÍdÒÍdËÍdÄÍd½Íd¶Íd¯Íd¨Íd¡ÍdšÍd“ÍdŒÍd…Íd~ÍdwÍdpÍdiÍdbÍd[ÍdTÍdMÍdFÍd?Íd8Íd1Íd*Íd#ÍdÍdÍdÍdÍdÍdùÌdòÌdëÌdäÌdÝÌdÖÌdÏÌdÈÌdÁÌdºÌd³Ìd¬Ìd¥ÌdžÌd—ÌdÌd‰Ìd‚Ìd{ÌdtÌdmÌdfÌd_ÌdXÌdQÌdJÌdCÌd<Ìd5Ìd.Ìd'Ìd ÌdÌdÌd ÌdÌdýËdöËdïËdèËdáËdÚËdÓËdÌËdÅËd¾Ëd·Ëd°Ëd©Ëd¢Ëd›Ëd”ËdËd†ËdËdxËdqËdjËdcËd\ËdUËdNËdGËd@Ëd9Ëd2Ëd+Ëd$ËdËdËdËdËdËdúÊdóÊdìÊdåÊdÞÊd×ÊdÐÊdÉÊdÂÊd»Êd´Êd­Êd¦ÊdŸÊd˜Êd‘ÊdŠÊdƒÊd|ÊduÊdnÊdgÊd`ÊdYÊdRÊdKÊdDÊd=Êd6Êd/Êd(Êd!ÊdÊdÊd ÊdÊdþÉd÷ÉdðÉdéÉdâÉdÛÉdÔÉdÍÉdÆÉd¿Éd¸Éd±ÉdªÉd£ÉdœÉd•ÉdŽÉd‡Éd€ÉdyÉdrÉdkÉddÉd]ÉdVÉdOÉdHÉdAÉd:Éd3Éd,Éd%ÉdÉdÉdÉd ÉdÉdûÈdôÈdíÈdæÈdßÈdØÈdÑÈdÊÈdÃÈd¼ÈdµÈd®Èd§Èd Èd™Èd’Èd‹Èd„Èd}ÈdvÈdoÈdhÈdaÈdZÈdSÈdLÈdEÈd>Èd7Èd0Èd)Èd"ÈdÈdÈd ÈdÈdÿÇdøÇdñÇdêÇdãÇdÜÇdÕÇdÎÇdÇÇdÀÇd¹Çd²Çd«Çd¤ÇdÇd–ÇdÇdˆÇdÇdzÇdsÇdlÇdeÇd^ÇdWÇdPÇdIÇdBÇd;Çd4Çd-Çd&ÇdÇdÇdÇd ÇdÇdüÆdõÆdîÆdçÆdàÆdÙÆdÒÆdËÆdÄÆd½Æd¶Æd¯Æd¨Æd¡ÆdšÆd“ÆdŒÆd…Æd~ÆdwÆdpÆdiÆdbÆd[ÆdTÆdMÆdFÆd?Æd8Æd1Æd*Æd#ÆdÆdÆdÆdÆdÆdùÅdòÅdëÅdäÅdÝÅdÖÅdÏÅdÈÅdÁÅdºÅd³Åd¬Åd¥ÅdžÅd—ÅdÅd‰Åd‚Åd{ÅdtÅdmÅdfÅd_ÅdXÅdQÅdJÅdCÅd<Åd5Åd.Åd'Åd ÅdÅdÅd ÅdÅdýÄdöÄdïÄdèÄdáÄdÚÄdÓÄdÌÄdÅÄd¾Äd·Äd°Äd©Äd¢Äd›Äd”ÄdÄd†ÄdÄdxÄdqÄdjÄdcÄd\ÄdUÄdNÄdGÄd@Äd9Äd2Äd+Äd$ÄdÄdÄdÄdÄdÄdúÃdóÃdìÃdåÃdÞÃd×ÃdÐÃdÉÃdÂÃd»Ãd´Ãd­Ãd¦ÃdŸÃd˜Ãd‘ÃdŠÃdƒÃd|ÃduÃdnÃdgÃd`ÃdYÃdRÃdKÃdDÃd=Ãd6Ãd/Ãd(Ãd!ÃdÃdÃd ÃdÃdþÂd÷ÂdðÂdéÂdâÂdÛÂdÔÂdÍÂdÆÂd¿Âd¸Âd±ÂdªÂd£ÂdœÂd•ÂdŽÂd‡Âd€ÂdyÂdrÂdkÂddÂd]ÂdVÂdOÂdHÂdAÂd:Âd3Âd,Âd%ÂdÂdÂdÂd ÂdÂdûÁdôÁdíÁdæÁdßÁdØÁdÑÁdÊÁdÃÁd¼ÁdµÁd®Ád§Ád Ád™Ád’Ád‹Ád„Ád}ÁdvÁdoÁdhÁdaÁdZÁdSÁdLÁdEÁd>Ád7Ád0Ád)Ád"ÁdÁdÁd ÁdÁdÿÀdøÀdñÀdêÀdãÀdÜÀdÕÀdÎÀdÇÀdÀÀd¹Àd²Àd«Àd¤ÀdÀd–ÀdÀdˆÀdÀdzÀdsÀdlÀdeÀd^ÀdWÀdPÀdIÀdBÀd;Àd4Àd-Àd&ÀdÀdÀdÀd ÀdÀdü¿dõ¿dî¿dç¿dà¿dÙ¿dÒ¿dË¿dÄ¿d½¿d¶¿d¯¿d¨¿d¡¿dš¿d“¿dŒ¿d…¿d~¿dw¿dp¿di¿db¿d[¿dT¿dM¿dF¿d?¿d8¿d1¿d*¿d#¿d¿d¿d¿d¿d¿dù¾dò¾dë¾dä¾dݾdÖ¾dϾdȾdÁ¾dº¾d³¾d¬¾d¥¾dž¾d—¾d¾d‰¾d‚¾d{¾dt¾dm¾df¾d_¾dX¾dQ¾dJ¾dC¾d<¾d5¾d.¾d'¾d ¾d¾d¾d ¾d¾dý½dö½dï½dè½dá½dÚ½dÓ½d̽dŽd¾½d·½d°½d©½d¢½d›½d”½d½d†½d½dx½dq½dj½dc½d\½dU½dN½dG½d@½d9½d2½d+½d$½d½d½d½d½d½dú¼dó¼dì¼då¼dÞ¼d×¼dмdɼd¼d»¼d´¼d­¼d¦¼dŸ¼d˜¼d‘¼dмdƒ¼d|¼du¼dn¼dg¼d`¼dY¼dR¼dK¼dD¼d=¼d6¼d/¼d(¼d!¼d¼d¼d ¼d¼dþ»d÷»dð»dé»dâ»dÛ»dÔ»dÍ»dÆ»d¿»d¸»d±»dª»d£»dœ»d•»dŽ»d‡»d€»dy»dr»dk»dd»d]»dV»dO»dH»dA»d:»d3»d,»d%»d»d»d»d »d»dûºdôºdíºdæºdߺdغdѺdʺdúd¼ºdµºd®ºd§ºd ºd™ºd’ºd‹ºd„ºd}ºdvºdoºdhºdaºdZºdSºdLºdEºd>ºd7ºd0ºd)ºd"ºdºdºd ºdºdÿ¹dø¹dñ¹dê¹dã¹dܹdÕ¹dιdǹdÀ¹d¹¹d²¹d«¹d¤¹d¹d–¹d¹dˆ¹d¹dz¹ds¹dl¹de¹d^¹dW¹dP¹dI¹dB¹d;¹d4¹d-¹d&¹d¹d¹d¹d ¹d¹dü¸dõ¸dî¸dç¸dà¸dÙ¸dÒ¸d˸dĸd½¸d¶¸d¯¸d¨¸d¡¸dš¸d“¸dŒ¸d…¸d~¸dw¸dp¸di¸db¸d[¸dT¸dM¸dF¸d?¸d8¸d1¸d*¸d#¸d¸d¸d¸d¸d¸dù·dò·dë·dä·dÝ·dÖ·dÏ·dÈ·dÁ·dº·d³·d¬·d¥·dž·d—·d·d‰·d‚·d{·dt·dm·df·d_·dX·dQ·dJ·dC·d<·d5·d.·d'·d ·d·d·d ·d·dý¶dö¶dï¶dè¶dá¶dÚ¶dÓ¶d̶dŶd¾¶d·¶d°¶d©¶d¢¶d›¶d”¶d¶d†¶d¶dx¶dq¶dj¶dc¶d\¶dU¶dN¶dG¶d@¶d9¶d2¶d+¶d$¶d¶d¶d¶d¶d¶dúµdóµdìµdåµdÞµd×µdеdɵdµd»µd´µd­µd¦µdŸµd˜µd‘µdеdƒµd|µduµdnµdgµd`µdYµdRµdKµdDµd=µd6µd/µd(µd!µdµdµd µdµdþ´d÷´dð´dé´dâ´dÛ´dÔ´dÍ´dÆ´d¿´d¸´d±´dª´d£´dœ´d•´dŽ´d‡´d€´dy´dr´dk´dd´d]´dV´dO´dH´dA´d:´d3´d,´d%´d´d´d´d ´d´dû³dô³dí³dæ³dß³dسdѳdʳdód¼³dµ³d®³d§³d ³d™³d’³d‹³d„³d}³dv³do³dh³da³dZ³dS³dL³dE³d>³d7³d0³d)³d"³d³d³d ³d³dÿ²dø²dñ²dê²dã²dܲdÕ²dβdDzdÀ²d¹²d²²d«²d¤²d²d–²d²dˆ²d²dz²ds²dl²de²d^²dW²dP²dI²dB²d;²d4²d-²d&²d²d²d²d ²d²dü±dõ±dî±dç±dà±dÙ±dÒ±d˱dıd½±d¶±d¯±d¨±d¡±dš±d“±dŒ±d…±d~±dw±dp±di±db±d[±dT±dM±dF±d?±d8±d1±d*±d#±d±d±d±d±d±dù°dò°dë°dä°dݰdÖ°dϰdȰdÁ°dº°d³°d¬°d¥°dž°d—°d°d‰°d‚°d{°dt°dm°df°d_°dX°dQ°dJ°dC°d<°d5°d.°d'°d °d°d°d °d°dý¯dö¯dï¯dè¯dá¯dÚ¯dÓ¯d̯důd¾¯d·¯d°¯d©¯d¢¯d›¯d”¯d¯d†¯d¯dx¯dq¯dj¯dc¯d\¯dU¯dN¯dG¯d@¯d9¯d2¯d+¯d$¯d¯d¯d¯d¯d¯dú®dó®dì®då®dÞ®d×®dЮdÉ®d®d»®d´®d­®d¦®dŸ®d˜®d‘®dŠ®dƒ®d|®du®dn®dg®d`®dY®dR®dK®dD®d=®d6®d/®d(®d!®d®d®d ®d®dþ­d÷­dð­dé­dâ­dÛ­dÔ­dÍ­dÆ­d¿­d¸­d±­dª­d£­dœ­d•­dŽ­d‡­d€­dy­dr­dk­dd­d]­dV­dO­dH­dA­d:­d3­d,­d%­d­d­d­d ­d­dû¬dô¬dí¬dæ¬d߬dجdѬdʬdìd¼¬dµ¬d®¬d§¬d ¬d™¬d’¬d‹¬d„¬d}¬dv¬do¬dh¬da¬dZ¬dS¬dL¬dE¬d>¬d7¬d0¬d)¬d"¬d¬d¬d ¬d¬dÿ«dø«dñ«dê«dã«dÜ«dÕ«dΫdÇ«dÀ«d¹«d²«d««d¤«d«d–«d«dˆ«d«dz«ds«dl«de«d^«dW«dP«dI«dB«d;«d4«d-«d&«d«d«d«d «d«düªdõªdîªdçªdàªdÙªdÒªd˪dĪd½ªd¶ªd¯ªd¨ªd¡ªdšªd“ªdŒªd…ªd~ªdwªdpªdiªdbªd[ªdTªdMªdFªd?ªd8ªd1ªd*ªd#ªdªdªdªdªdªdù©dò©dë©dä©dÝ©dÖ©dÏ©dÈ©dÁ©dº©d³©d¬©d¥©dž©d—©d©d‰©d‚©d{©dt©dm©df©d_©dX©dQ©dJ©dC©d<©d5©d.©d'©d ©d©d©d ©d©dý¨dö¨dï¨dè¨dá¨dÚ¨dÓ¨d̨dŨd¾¨d·¨d°¨d©¨d¢¨d›¨d”¨d¨d†¨d¨dx¨dq¨dj¨dc¨d\¨dU¨dN¨dG¨d@¨d9¨d2¨d+¨d$¨d¨d¨d¨d¨d¨dú§dó§dì§då§dÞ§d×§dЧdɧd§d»§d´§d­§d¦§dŸ§d˜§d‘§dЧdƒ§d|§du§dn§dg§d`§dY§dR§dK§dD§d=§d6§d/§d(§d!§d§d§d §d§dþ¦d÷¦dð¦dé¦dâ¦dÛ¦dÔ¦dͦdƦd¿¦d¸¦d±¦dª¦d£¦dœ¦d•¦dަd‡¦d€¦dy¦dr¦dk¦dd¦d]¦dV¦dO¦dH¦dA¦d:¦d3¦d,¦d%¦d¦d¦d¦d ¦d¦dû¥dô¥dí¥dæ¥dߥdØ¥dÑ¥dÊ¥dÃ¥d¼¥dµ¥d®¥d§¥d ¥d™¥d’¥d‹¥d„¥d}¥dv¥do¥dh¥da¥dZ¥dS¥dL¥dE¥d>¥d7¥d0¥d)¥d"¥d¥d¥d ¥d¥dÿ¤dø¤dñ¤dê¤dã¤dܤdÕ¤dΤdǤdÀ¤d¹¤d²¤d«¤d¤¤d¤d–¤d¤dˆ¤d¤dz¤ds¤dl¤de¤d^¤dW¤dP¤dI¤dB¤d;¤d4¤d-¤d&¤d¤d¤d¤d ¤d¤dü£dõ£dî£dç£dà£dÙ£dÒ£dË£dÄ£d½£d¶£d¯£d¨£d¡£dš£d“£dŒ£d…£d~£dw£dp£di£db£d[£dT£dM£dF£d?£d8£d1£d*£d#£d£d£d£d£d£dù¢dò¢dë¢dä¢dÝ¢dÖ¢dÏ¢dÈ¢dÁ¢dº¢d³¢d¬¢d¥¢dž¢d—¢d¢d‰¢d‚¢d{¢dt¢dm¢df¢d_¢dX¢dQ¢dJ¢dC¢d<¢d5¢d.¢d'¢d ¢d¢d¢d ¢d¢dý¡dö¡dï¡dè¡dá¡dÚ¡dÓ¡dÌ¡dÅ¡d¾¡d·¡d°¡d©¡d¢¡d›¡d”¡d¡d†¡d¡dx¡dq¡dj¡dc¡d\¡dU¡dN¡dG¡d@¡d9¡d2¡d+¡d$¡d¡d¡d¡d¡d¡dú dó dì då dÞ d× dРdÉ d d» d´ d­ d¦ dŸ d˜ d‘ dŠ dƒ d| du dn dg d` dY dR dK dD d= d6 d/ d( d! d d d  d dþŸd÷ŸdðŸdéŸdâŸdÛŸdÔŸdÍŸdÆŸd¿Ÿd¸Ÿd±ŸdªŸd£ŸdœŸd•ŸdŽŸd‡Ÿd€ŸdyŸdrŸdkŸddŸd]ŸdVŸdOŸdHŸdAŸd:Ÿd3Ÿd,Ÿd%ŸdŸdŸdŸd ŸdŸdûždôždíždæždßždØždÑždÊždÞd¼ždµžd®žd§žd žd™žd’žd‹žd„žd}ždvždoždhždaždZždSždLždEžd>žd7žd0žd)žd"ždždžd ždždÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüœdõœdîœdçœdàœdÙœdÒœdËœdÄœd½œd¶œd¯œd¨œd¡œdšœd“œdŒœd…œd~œdwœdpœdiœdbœd[œdTœdMœdFœd?œd8œd1œd*œd#œdœdœdœdœdœdù›dò›dë›dä›dÝ›dÖ›dÏ›dÈ›dÁ›dº›d³›d¬›d¥›dž›d—›d›d‰›d‚›d{›dt›dm›df›d_›dX›dQ›dJ›dC›d<›d5›d.›d'›d ›d›d›d ›d›dýšdöšdïšdèšdášdÚšdÓšdÌšdÅšd¾šd·šd°šd©šd¢šd›šd”šdšd†šdšdxšdqšdjšdcšd\šdUšdNšdGšd@šd9šd2šd+šd$šdšdšdšdšdšdú™dó™dì™då™dÞ™d×™dЙdÉ™d™d»™d´™d­™d¦™dŸ™d˜™d‘™dŠ™dƒ™d|™du™dn™dg™d`™dY™dR™dK™dD™d=™d6™d/™d(™d!™d™d™d ™d™dþ˜d÷˜dð˜dé˜dâ˜dÛ˜dÔ˜d͘dƘd¿˜d¸˜d±˜dª˜d£˜dœ˜d•˜dŽ˜d‡˜d€˜dy˜dr˜dk˜dd˜d]˜dV˜dO˜dH˜dA˜d:˜d3˜d,˜d%˜d˜d˜d˜d ˜d˜dû—dô—dí—dæ—dß—dØ—dÑ—dÊ—d×d¼—dµ—d®—d§—d —d™—d’—d‹—d„—d}—dv—do—dh—da—dZ—dS—dL—dE—d>—d7—d0—d)—d"—d—d—d —d—dÿ–dø–dñ–dê–dã–dÜ–dÕ–dΖdÇ–dÀ–d¹–d²–d«–d¤–d–d––d–dˆ–d–dz–ds–dl–de–d^–dW–dP–dI–dB–d;–d4–d-–d&–d–d–d–d –d–dü•dõ•dî•dç•dà•dÙ•dÒ•dË•dÄ•d½•d¶•d¯•d¨•d¡•dš•d“•dŒ•d…•d~•dw•dp•di•db•d[•dT•dM•dF•d?•d8•d1•d*•d#•d•d•d•d•d•dù”dò”dë”dä”dÝ”dÖ”dÏ”dÈ”dÁ”dº”d³”d¬”d¥”dž”d—”d”d‰”d‚”d{”dt”dm”df”d_”dX”dQ”dJ”dC”d<”d5”d.”d'”d ”d”d”d ”d”dý“dö“dï“dè“dá“dÚ“dÓ“dÌ“dÅ“d¾“d·“d°“d©“d¢“d›“d”“d“d†“d“dx“dq“dj“dc“d\“dU“dN“dG“d@“d9“d2“d+“d$“d“d“d“d“d“dú’dó’dì’då’dÞ’d×’dÐ’dÉ’dÂ’d»’d´’d­’d¦’dŸ’d˜’d‘’dŠ’dƒ’d|’du’dn’dg’d`’dY’dR’dK’dD’d=’d6’d/’d(’d!’d’d’d ’d’dþ‘d÷‘dð‘dé‘dâ‘dÛ‘dÔ‘dÍ‘dÆ‘d¿‘d¸‘d±‘dª‘d£‘dœ‘d•‘dŽ‘d‡‘d€‘dy‘dr‘dk‘dd‘d]‘dV‘dO‘dH‘dA‘d:‘d3‘d,‘d%‘d‘d‘d‘d ‘d‘dûdôdídædßdØdÑdÊdÃd¼dµd®d§d d™d’d‹d„d}dvdodhdadZdSdLdEd>d7d0d)d"ddd ddÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüŽdõŽdîŽdçŽdàŽdÙŽdÒŽdËŽdÄŽd½Žd¶Žd¯Žd¨Žd¡ŽdšŽd“ŽdŒŽd…Žd~ŽdwŽdpŽdiŽdbŽd[ŽdTŽdMŽdFŽd?Žd8Žd1Žd*Žd#ŽdŽdŽdŽdŽdŽdùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd‰d7‰d0‰d)‰d"‰d‰d‰d ‰d‰dÿˆdøˆdñˆdêˆdãˆd܈dÕˆdΈdLjdÀˆd¹ˆd²ˆd«ˆd¤ˆdˆd–ˆdˆdˆˆdˆdzˆdsˆdlˆdeˆd^ˆdWˆdPˆdIˆdBˆd;ˆd4ˆd-ˆd&ˆdˆdˆdˆd ˆdˆdü‡dõ‡dî‡dç‡dà‡dÙ‡dÒ‡dˇdćd½‡d¶‡d¯‡d¨‡d¡‡dš‡d“‡dŒ‡d…‡d~‡dw‡dp‡di‡db‡d[‡dT‡dM‡dF‡d?‡d8‡d1‡d*‡d#‡d‡d‡d‡d‡d‡dù†dò†dë†dä†d݆dÖ†dφdȆdÁ†dº†d³†d¬†d¥†dž†d—†d†d‰†d‚†d{†dt†dm†df†d_†dX†dQ†dJ†dC†d<†d5†d.†d'†d †d†d†d †d†dý…dö…dï…dè…dá…dÚ…dÓ…dÌ…dÅ…d¾…d·…d°…d©…d¢…d›…d”…d…d†…d…dx…dq…dj…dc…d\…dU…dN…dG…d@…d9…d2…d+…d$…d…d…d…d…d…dú„dó„dì„då„dÞ„dׄdЄdÉ„d„d»„d´„d­„d¦„dŸ„d˜„d‘„dŠ„dƒ„d|„du„dn„dg„d`„dY„dR„dK„dD„d=„d6„d/„d(„d!„d„d„d „d„dþƒd÷ƒdðƒdéƒdâƒdÛƒdÔƒd̓dƃd¿ƒd¸ƒd±ƒdªƒd£ƒdœƒd•ƒdŽƒd‡ƒd€ƒdyƒdrƒdkƒddƒd]ƒdVƒdOƒdHƒdAƒd:ƒd3ƒd,ƒd%ƒdƒdƒdƒd ƒdƒdû‚dô‚dí‚dæ‚dß‚dØ‚dÑ‚dÊ‚dÂd¼‚dµ‚d®‚d§‚d ‚d™‚d’‚d‹‚d„‚d}‚dv‚do‚dh‚da‚dZ‚dS‚dL‚dE‚d>‚d7‚d0‚d)‚d"‚d‚d‚d ‚d‚dÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddü€dõ€dî€dç€dà€dÙ€dÒ€dË€dÄ€d½€d¶€d¯€d¨€d¡€dš€d“€dŒ€d…€d~€dw€dp€di€db€d[€dT€dM€dF€d?€d8€d1€d*€d#€d€d€d€d€d€dùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddý~dö~dï~dè~dá~dÚ~dÓ~dÌ~dÅ~d¾~d·~d°~d©~d¢~d›~d”~d~d†~d~dx~dq~dj~dc~d\~dU~dN~dG~d@~d9~d2~d+~d$~d~d~d~d~d~dú}dó}dì}då}dÞ}d×}dÐ}dÉ}dÂ}d»}d´}d­}d¦}dŸ}d˜}d‘}dŠ}dƒ}d|}du}dn}dg}d`}dY}dR}dK}dD}d=}d6}d/}d(}d!}d}d}d }d}dþ|d÷|dð|dé|dâ|dÛ|dÔ|dÍ|dÆ|d¿|d¸|d±|dª|d£|dœ|d•|dŽ|d‡|d€|dy|dr|dk|dd|d]|dV|dO|dH|dA|d:|d3|d,|d%|d|d|d|d |d|dû{dô{dí{dæ{dß{dØ{dÑ{dÊ{dÃ{d¼{dµ{d®{d§{d {d™{d’{d‹{d„{d}{dv{do{dh{da{dZ{dS{dL{dE{d>{d7{d0{d){d"{d{d{d {d{dÿzdøzdñzdêzdãzdÜzdÕzdÎzdÇzdÀzd¹zd²zd«zd¤zdzd–zdzdˆzdzdzzdszdlzdezd^zdWzdPzdIzdBzd;zd4zd-zd&zdzdzdzd zdzdüydõydîydçydàydÙydÒydËydÄyd½yd¶yd¯yd¨yd¡ydšyd“ydŒyd…yd~ydwydpydiydbyd[ydTydMydFyd?yd8yd1yd*yd#ydydydydydydùxdòxdëxdäxdÝxdÖxdÏxdÈxdÁxdºxd³xd¬xd¥xdžxd—xdxd‰xd‚xd{xdtxdmxdfxd_xdXxdQxdJxdCxdtd7td0td)td"tdtdtd tdtdÿsdøsdñsdêsdãsdÜsdÕsdÎsdÇsdÀsd¹sd²sd«sd¤sdsd–sdsdˆsdsdzsdssdlsdesd^sdWsdPsdIsdBsd;sd4sd-sd&sdsdsdsd sdsdürdõrdîrdçrdàrdÙrdÒrdËrdÄrd½rd¶rd¯rd¨rd¡rdšrd“rdŒrd…rd~rdwrdprdirdbrd[rdTrdMrdFrd?rd8rd1rd*rd#rdrdrdrdrdrdùqdòqdëqdäqdÝqdÖqdÏqdÈqdÁqdºqd³qd¬qd¥qdžqd—qdqd‰qd‚qd{qdtqdmqdfqd_qdXqdQqdJqdCqdmd7md0md)md"mdmdmd mdmdÿldøldñldêldãldÜldÕldÎldÇldÀld¹ld²ld«ld¤ldld–ldldˆldldzldsldlldeld^ldWldPldIldBld;ld4ld-ld&ldldldld ldldükdõkdîkdçkdàkdÙkdÒkdËkdÄkd½kd¶kd¯kd¨kd¡kdškd“kdŒkd…kd~kdwkdpkdikdbkd[kdTkdMkdFkd?kd8kd1kd*kd#kdkdkdkdkdkdùjdòjdëjdäjdÝjdÖjdÏjdÈjdÁjdºjd³jd¬jd¥jdžjd—jdjd‰jd‚jd{jdtjdmjdfjd_jdXjdQjdJjdCjdfd7fd0fd)fd"fdfdfd fdfdÿedøedñedêedãedÜedÕedÎedÇedÀed¹ed²ed«ed¤eded–ededˆededzedsedledeed^edWedPedIedBed;ed4ed-ed&edededed ededüddõddîddçddàddÙddÒddËddÄdd½dd¶dd¯dd¨dd¡ddšdd“ddŒdd…dd~ddwddpddiddbdd[ddTddMddFdd?dd8dd1dd*dd#ddddddddddddùcdòcdëcdäcdÝcdÖcdÏcdÈcdÁcdºcd³cd¬cd¥cdžcd—cdcd‰cd‚cd{cdtcdmcdfcd_cdXcdQcdJcdCcd_d7_d0_d)_d"_d_d_d _d_dÿ^dø^dñ^dê^dã^dÜ^dÕ^dÎ^dÇ^dÀ^d¹^d²^d«^d¤^d^d–^d^dˆ^d^dz^ds^dl^de^d^^dW^dP^dI^dB^d;^d4^d-^d&^d^d^d^d ^d^dü]dõ]dî]dç]dà]dÙ]dÒ]dË]dÄ]d½]d¶]d¯]d¨]d¡]dš]d“]dŒ]d…]d~]dw]dp]di]db]d[]dT]dM]dF]d?]d8]d1]d*]d#]d]d]d]d]d]dù\dò\dë\dä\dÝ\dÖ\dÏ\dÈ\dÁ\dº\d³\d¬\d¥\dž\d—\d\d‰\d‚\d{\dt\dm\df\d_\dX\dQ\dJ\dC\d<\d5\d.\d'\d \d\d\d \d\dý[dö[dï[dè[dá[dÚ[dÓ[dÌ[dÅ[d¾[d·[d°[d©[d¢[d›[d”[d[d†[d[dx[dq[dj[dc[d\[dU[dN[dG[d@[d9[d2[d+[d$[d[d[d[d[d[dúZdóZdìZdåZdÞZd×ZdÐZdÉZdÂZd»Zd´Zd­Zd¦ZdŸZd˜Zd‘ZdŠZdƒZd|ZduZdnZdgZd`ZdYZdRZdKZdDZd=Zd6Zd/Zd(Zd!ZdZdZd ZdZdþYd÷YdðYdéYdâYdÛYdÔYdÍYdÆYd¿Yd¸Yd±YdªYd£YdœYd•YdŽYd‡Yd€YdyYdrYdkYddYd]YdVYdOYdHYdAYd:Yd3Yd,Yd%YdYdYdYd YdYdûXdôXdíXdæXdßXdØXdÑXdÊXdÃXd¼XdµXd®Xd§Xd Xd™Xd’Xd‹Xd„Xd}XdvXdoXdhXdaXdZXdSXdLXdEXd>Xd7Xd0Xd)Xd"XdXdXd XdXdÿWdøWdñWdêWdãWdÜWdÕWdÎWdÇWdÀWd¹Wd²Wd«Wd¤WdWd–WdWdˆWdWdzWdsWdlWdeWd^WdWWdPWdIWdBWd;Wd4Wd-Wd&WdWdWdWd WdWdüVdõVdîVdçVdàVdÙVdÒVdËVdÄVd½Vd¶Vd¯Vd¨Vd¡VdšVd“VdŒVd…Vd~VdwVdpVdiVdbVd[VdTVdMVdFVd?Vd8Vd1Vd*Vd#VdVdVdVdVdVdùUdòUdëUdäUdÝUdÖUdÏUdÈUdÁUdºUd³Ud¬Ud¥UdžUd—UdUd‰Ud‚Ud{UdtUdmUdfUd_UdXUdQUdJUdCUdQd7Qd0Qd)Qd"QdQdQd QdQdÿPdøPdñPdêPdãPdÜPdÕPdÎPdÇPdÀPd¹Pd²Pd«Pd¤PdPd–PdPdˆPdPdzPdsPdlPdePd^PdWPdPPdIPdBPd;Pd4Pd-Pd&PdPdPdPd PdPdüOdõOdîOdçOdàOdÙOdÒOdËOdÄOd½Od¶Od¯Od¨Od¡OdšOd“OdŒOd…Od~OdwOdpOdiOdbOd[OdTOdMOdFOd?Od8Od1Od*Od#OdOdOdOdOdOdùNdòNdëNdäNdÝNdÖNdÏNdÈNdÁNdºNd³Nd¬Nd¥NdžNd—NdNd‰Nd‚Nd{NdtNdmNdfNd_NdXNdQNdJNdCNdJd7Jd0Jd)Jd"JdJdJd JdJdÿIdøIdñIdêIdãIdÜIdÕIdÎIdÇIdÀId¹Id²Id«Id¤IdId–IdIdˆIdIdzIdsIdlIdeId^IdWIdPIdIIdBId;Id4Id-Id&IdIdIdId IdIdüHdõHdîHdçHdàHdÙHdÒHdËHdÄHd½Hd¶Hd¯Hd¨Hd¡HdšHd“HdŒHd…Hd~HdwHdpHdiHdbHd[HdTHdMHdFHd?Hd8Hd1Hd*Hd#HdHdHdHdHdHdùGdòGdëGdäGdÝGdÖGdÏGdÈGdÁGdºGd³Gd¬Gd¥GdžGd—GdGd‰Gd‚Gd{GdtGdmGdfGd_GdXGdQGdJGdCGdCd7Cd0Cd)Cd"CdCdCd CdCdÿBdøBdñBdêBdãBdÜBdÕBdÎBdÇBdÀBd¹Bd²Bd«Bd¤BdBd–BdBdˆBdBdzBdsBdlBdeBd^BdWBdPBdIBdBBd;Bd4Bd-Bd&BdBdBdBd BdBdüAdõAdîAdçAdàAdÙAdÒAdËAdÄAd½Ad¶Ad¯Ad¨Ad¡AdšAd“AdŒAd…Ad~AdwAdpAdiAdbAd[AdTAdMAdFAd?Ad8Ad1Ad*Ad#AdAdAdAdAdAdù@dò@dë@dä@dÝ@dÖ@dÏ@dÈ@dÁ@dº@d³@d¬@d¥@dž@d—@d@d‰@d‚@d{@dt@dm@df@d_@dX@dQ@dJ@dC@d<@d5@d.@d'@d @d@d@d @d@dý?dö?dï?dè?dá?dÚ?dÓ?dÌ?dÅ?d¾?d·?d°?d©?d¢?d›?d”?d?d†?d?dx?dq?dj?dc?d\?dU?dN?dG?d@?d9?d2?d+?d$?d?d?d?d?d?dú>dó>dì>då>dÞ>d×>dÐ>dÉ>dÂ>d»>d´>d­>d¦>dŸ>d˜>d‘>dŠ>dƒ>d|>du>dn>dg>d`>dY>dR>dK>dD>d=>d6>d/>d(>d!>d>d>d >d>dþ=d÷=dð=dé=dâ=dÛ=dÔ=dÍ=dÆ=d¿=d¸=d±=dª=d£=dœ=d•=dŽ=d‡=d€=dy=dr=dk=dd=d]=dV=dO=dH=dA=d:=d3=d,=d%=d=d=d=d =d=dû5d75d05d)5d"5d5d5d 5d5dÿ4dø4dñ4dê4dã4dÜ4dÕ4dÎ4dÇ4dÀ4d¹4d²4d«4d¤4d4d–4d4dˆ4d4dz4ds4dl4de4d^4dW4dP4dI4dB4d;4d44d-4d&4d4d4d4d 4d4dü3dõ3dî3dç3dà3dÙ3dÒ3dË3dÄ3d½3d¶3d¯3d¨3d¡3dš3d“3dŒ3d…3d~3dw3dp3di3db3d[3dT3dM3dF3d?3d83d13d*3d#3d3d3d3d3d3dù2dò2dë2dä2dÝ2dÖ2dÏ2dÈ2dÁ2dº2d³2d¬2d¥2dž2d—2d2d‰2d‚2d{2dt2dm2df2d_2dX2dQ2dJ2dC2d<2d52d.2d'2d 2d2d2d 2d2dý1dö1dï1dè1dá1dÚ1dÓ1dÌ1dÅ1d¾1d·1d°1d©1d¢1d›1d”1d1d†1d1dx1dq1dj1dc1d\1dU1dN1dG1d@1d91d21d+1d$1d1d1d1d1d1dú0dó0dì0då0dÞ0d×0dÐ0dÉ0dÂ0d»0d´0d­0d¦0dŸ0d˜0d‘0dŠ0dƒ0d|0du0dn0dg0d`0dY0dR0dK0dD0d=0d60d/0d(0d!0d0d0d 0d0dþ/d÷/dð/dé/dâ/dÛ/dÔ/dÍ/dÆ/d¿/d¸/d±/dª/d£/dœ/d•/dŽ/d‡/d€/dy/dr/dk/dd/d]/dV/dO/dH/dA/d:/d3/d,/d%/d/d/d/d /d/dû.dô.dí.dæ.dß.dØ.dÑ.dÊ.dÃ.d¼.dµ.d®.d§.d .d™.d’.d‹.d„.d}.dv.do.dh.da.dZ.dS.dL.dE.d>.d7.d0.d).d".d.d.d .d.dÿ-dø-dñ-dê-dã-dÜ-dÕ-dÎ-dÇ-dÀ-d¹-d²-d«-d¤-d-d–-d-dˆ-d-dz-ds-dl-de-d^-dW-dP-dI-dB-d;-d4-d--d&-d-d-d-d -d-dü,dõ,dî,dç,dà,dÙ,dÒ,dË,dÄ,d½,d¶,d¯,d¨,d¡,dš,d“,dŒ,d…,d~,dw,dp,di,db,d[,dT,dM,dF,d?,d8,d1,d*,d#,d,d,d,d,d,dù+dò+dë+dä+dÝ+dÖ+dÏ+dÈ+dÁ+dº+d³+d¬+d¥+dž+d—+d+d‰+d‚+d{+dt+dm+df+d_+dX+dQ+dJ+dC+d<+d5+d.+d'+d +d+d+d +d+dý*dö*dï*dè*dá*dÚ*dÓ*dÌ*dÅ*d¾*d·*d°*d©*d¢*d›*d”*d*d†*d*dx*dq*dj*dc*d\*dU*dN*dG*d@*d9*d2*d+*d$*d*d*d*d*d*dú)dó)dì)då)dÞ)d×)dÐ)dÉ)dÂ)d»)d´)d­)d¦)dŸ)d˜)d‘)dŠ)dƒ)d|)du)dn)dg)d`)dY)dR)dK)dD)d=)d6)d/)d()d!)d)d)d )d)dþ(d÷(dð(dé(dâ(dÛ(dÔ(dÍ(dÆ(d¿(d¸(d±(dª(d£(dœ(d•(dŽ(d‡(d€(dy(dr(dk(dd(d](dV(dO(dH(dA(d:(d3(d,(d%(d(d(d(d (d(dû'dô'dí'dæ'dß'dØ'dÑ'dÊ'dÃ'd¼'dµ'd®'d§'d 'd™'d’'d‹'d„'d}'dv'do'dh'da'dZ'dS'dL'dE'd>'d7'd0'd)'d"'d'd'd 'd'dÿ&dø&dñ&dê&dã&dÜ&dÕ&dÎ&dÇ&dÀ&d¹&d²&d«&d¤&d&d–&d&dˆ&d&dz&ds&dl&de&d^&dW&dP&dI&dB&d;&d4&d-&d&&d&d&d&d &d&dü%dõ%dî%dç%dà%dÙ%dÒ%dË%dÄ%d½%d¶%d¯%d¨%d¡%dš%d“%dŒ%d…%d~%dw%dp%di%db%d[%dT%dM%dF%d?%d8%d1%d*%d#%d%d%d%d%d%dù$dò$dë$dä$dÝ$dÖ$dÏ$dÈ$dÁ$dº$d³$d¬$d¥$dž$d—$d$d‰$d‚$d{$dt$dm$df$d_$dX$dQ$dJ$dC$d<$d5$d.$d'$d $d$d$d $d$dý#dö#dï#dè#dá#dÚ#dÓ#dÌ#dÅ#d¾#d·#d°#d©#d¢#d›#d”#d#d†#d#dx#dq#dj#dc#d\#dU#dN#dG#d@#d9#d2#d+#d$#d#d#d#d#d#dú"dó"dì"då"dÞ"d×"dÐ"dÉ"dÂ"d»"d´"d­"d¦"dŸ"d˜"d‘"dŠ"dƒ"d|"du"dn"dg"d`"dY"dR"dK"dD"d="d6"d/"d("d!"d"d"d "d"dþ!d÷!dð!dé!dâ!dÛ!dÔ!dÍ!dÆ!d¿!d¸!d±!dª!d£!dœ!d•!dŽ!d‡!d€!dy!dr!dk!dd!d]!dV!dO!dH!dA!d:!d3!d,!d%!d!d!d!d !d!dû dô dí dæ dß dØ dÑ dÊ dà d¼ dµ d® d§ d  d™ d’ d‹ d„ d} dv do dh da dZ dS dL dE d> d7 d0 d) d" d d d d dÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddýdödïdèdádÚdÓdÌdÅd¾d·d°d©d¢d›d”dd†ddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddúdódìdådÞd×dÐdÉdÂd»d´d­d¦dŸd˜d‘dŠdƒd|dudndgd`dYdRdKdDd=d6d/d(d!ddd ddþd÷dðdédâdÛdÔdÍdÆd¿d¸d±dªd£dœd•dŽd‡d€dydrdkddd]dVdOdHdAd:d3d,d%dddd ddûdôdídædßdØdÑdÊdÃd¼dµd®d§d d™d’d‹d„d}dvdodhdadZdSdLdEd>d7d0d)d"ddd ddÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddýdödïdèdádÚdÓdÌdÅd¾d·d°d©d¢d›d”dd†ddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddúdódìdådÞd×dÐdÉdÂd»d´d­d¦dŸd˜d‘dŠdƒd|dudndgd`dYdRdKdDd=d6d/d(d!ddd ddþd÷dðdédâdÛdÔdÍdÆd¿d¸d±dªd£dœd•dŽd‡d€dydrdkddd]dVdOdHdAd:d3d,d%dddd ddûdôdídædßdØdÑdÊdÃd¼dµd®d§d d™d’d‹d„d}dvdodhdadZdSdLdEd>d7d0d)d"ddd ddÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddýdödïdèdádÚdÓdÌdÅd¾d·d°d©d¢d›d”dd†ddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddú dó dì då dÞ d× dÐ dÉ d d» d´ d­ d¦ dŸ d˜ d‘ dŠ dƒ d| du dn dg d` dY dR dK dD d= d6 d/ d( d! d d d d dþ d÷ dð dé dâ dÛ dÔ dÍ dÆ d¿ d¸ d± dª d£ dœ d• dŽ d‡ d€ dy dr dk dd d] dV dO dH dA d: d3 d, d% d d d d d dû dô dí dæ dß dØ dÑ dÊ dà d¼ dµ d® d§ d  d™ d’ d‹ d„ d} dv do dh da dZ dS dL dE d> d7 d0 d) d" d d d d dÿ dø dñ dê dã dÜ dÕ dÎ dÇ dÀ d¹ d² d« d¤ d d– d dˆ d dz ds dl de d^ dW dP dI dB d; d4 d- d& d d d d d dü dõ dî dç dà dÙ dÒ dË dÄ d½ d¶ d¯ d¨ d¡ dš d“ dŒ d… d~ dw dp di db d[ dT dM dF d? d8 d1 d* d# d d d d d dùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddýdödïdèdádÚdÓdÌdÅd¾d·d°d©d¢d›d”dd†ddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddúdódìdådÞd×dÐdÉdÂd»d´d­d¦dŸd˜d‘dŠdƒd|dudndgd`dYdRdKdDd=d6d/d(d!ddd ddþd÷dðdédâdÛdÔdÍdÆd¿d¸d±dªd£dœd•dŽd‡d€dydrdkddd]dVdOdHdAd:d3d,d%dddd ddûdôdídædßdØdÑdÊdÃd¼dµd®d§d d™d’d‹d„d}dvdodhdadZdSdLdEd>d7d0d)d"ddd ddÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd<d5d.d'd ddd ddýdödïdèdádÚdÓdÌdÅd¾d·d°d©d¢d›d”dd†ddxdqdjdcd\dUdNdGd@d9d2d+d$ddddddúÿcóÿcìÿcåÿcÞÿc×ÿcÐÿcÉÿcÂÿc»ÿc´ÿc­ÿc¦ÿcŸÿc˜ÿc‘ÿcŠÿcƒÿc|ÿcuÿcnÿcgÿc`ÿcYÿcRÿcKÿcDÿc=ÿc6ÿc/ÿc(ÿc!ÿcÿcÿc ÿcÿcþþc÷þcðþcéþcâþcÛþcÔþcÍþcÆþc¿þc¸þc±þcªþc£þcœþc•þcŽþc‡þc€þcyþcrþckþcdþc]þcVþcOþcHþcAþc:þc3þc,þc%þcþcþcþc þcþcûýcôýcíýcæýcßýcØýcÑýcÊýcÃýc¼ýcµýc®ýc§ýc ýc™ýc’ýc‹ýc„ýc}ýcvýcoýchýcaýcZýcSýcLýcEýc>ýc7ýc0ýc)ýc"ýcýcýc ýcýcÿücøücñücêücãücÜücÕücÎücÇücÀüc¹üc²üc«üc¤ücüc–ücücˆücüczücsüclüceüc^ücWücPücIücBüc;üc4üc-üc&ücücücüc ücücüûcõûcîûcçûcàûcÙûcÒûcËûcÄûc½ûc¶ûc¯ûc¨ûc¡ûcšûc“ûcŒûc…ûc~ûcwûcpûciûcbûc[ûcTûcMûcFûc?ûc8ûc1ûc*ûc#ûcûcûcûcûcûcùúcòúcëúcäúcÝúcÖúcÏúcÈúcÁúcºúc³úc¬úc¥úcžúc—úcúc‰úc‚úc{úctúcmúcfúc_úcXúcQúcJúcCúc<úc5úc.úc'úc úcúcúc úcúcýùcöùcïùcèùcáùcÚùcÓùcÌùcÅùc¾ùc·ùc°ùc©ùc¢ùc›ùc”ùcùc†ùcùcxùcqùcjùccùc\ùcUùcNùcGùc@ùc9ùc2ùc+ùc$ùcùcùcùcùcùcúøcóøcìøcåøcÞøc×øcÐøcÉøcÂøc»øc´øc­øc¦øcŸøc˜øc‘øcŠøcƒøc|øcuøcnøcgøc`øcYøcRøcKøcDøc=øc6øc/øc(øc!øcøcøc øcøcþ÷c÷÷cð÷cé÷câ÷cÛ÷cÔ÷cÍ÷cÆ÷c¿÷c¸÷c±÷cª÷c£÷cœ÷c•÷cŽ÷c‡÷c€÷cy÷cr÷ck÷cd÷c]÷cV÷cO÷cH÷cA÷c:÷c3÷c,÷c%÷c÷c÷c÷c ÷c÷cûöcôöcíöcæöcßöcØöcÑöcÊöcÃöc¼öcµöc®öc§öc öc™öc’öc‹öc„öc}öcvöcoöchöcaöcZöcSöcLöcEöc>öc7öc0öc)öc"öcöcöc öcöcÿõcøõcñõcêõcãõcÜõcÕõcÎõcÇõcÀõc¹õc²õc«õc¤õcõc–õcõcˆõcõczõcsõclõceõc^õcWõcPõcIõcBõc;õc4õc-õc&õcõcõcõc õcõcüôcõôcîôcçôcàôcÙôcÒôcËôcÄôc½ôc¶ôc¯ôc¨ôc¡ôcšôc“ôcŒôc…ôc~ôcwôcpôciôcbôc[ôcTôcMôcFôc?ôc8ôc1ôc*ôc#ôcôcôcôcôcôcùócòócëócäócÝócÖócÏócÈócÁócºóc³óc¬óc¥ócžóc—ócóc‰óc‚óc{óctócmócfóc_ócXócQócJócCóc<óc5óc.óc'óc ócócóc ócócýòcöòcïòcèòcáòcÚòcÓòcÌòcÅòc¾òc·òc°òc©òc¢òc›òc”òcòc†òcòcxòcqòcjòccòc\òcUòcNòcGòc@òc9òc2òc+òc$òcòcòcòcòcòcúñcóñcìñcåñcÞñc×ñcÐñcÉñcÂñc»ñc´ñc­ñc¦ñcŸñc˜ñc‘ñcŠñcƒñc|ñcuñcnñcgñc`ñcYñcRñcKñcDñc=ñc6ñc/ñc(ñc!ñcñcñc ñcñcþðc÷ðcððcéðcâðcÛðcÔðcÍðcÆðc¿ðc¸ðc±ðcªðc£ðcœðc•ðcŽðc‡ðc€ðcyðcrðckðcdðc]ðcVðcOðcHðcAðc:ðc3ðc,ðc%ðcðcðcðc ðcðcûïcôïcíïcæïcßïcØïcÑïcÊïcÃïc¼ïcµïc®ïc§ïc ïc™ïc’ïc‹ïc„ïc}ïcvïcoïchïcaïcZïcSïcLïcEïc>ïc7ïc0ïc)ïc"ïcïcïc ïcïcÿîcøîcñîcêîcãîcÜîcÕîcÎîcÇîcÀîc¹îc²îc«îc¤îcîc–îcîcˆîcîczîcsîclîceîc^îcWîcPîcIîcBîc;îc4îc-îc&îcîcîcîc îcîcüícõícîícçícàícÙícÒícËícÄíc½íc¶íc¯íc¨íc¡ícšíc“ícŒíc…íc~ícwícpíciícbíc[ícTícMícFíc?íc8íc1íc*íc#ícícícícícícùìcòìcëìcäìcÝìcÖìcÏìcÈìcÁìcºìc³ìc¬ìc¥ìcžìc—ìcìc‰ìc‚ìc{ìctìcmìcfìc_ìcXìcQìcJìcCìc<ìc5ìc.ìc'ìc ìcìcìc ìcìcýëcöëcïëcèëcáëcÚëcÓëcÌëcÅëc¾ëc·ëc°ëc©ëc¢ëc›ëc”ëcëc†ëcëcxëcqëcjëccëc\ëcUëcNëcGëc@ëc9ëc2ëc+ëc$ëcëcëcëcëcëcúêcóêcìêcåêcÞêc×êcÐêcÉêcÂêc»êc´êc­êc¦êcŸêc˜êc‘êcŠêcƒêc|êcuêcnêcgêc`êcYêcRêcKêcDêc=êc6êc/êc(êc!êcêcêc êcêcþéc÷écðécéécâécÛécÔécÍécÆéc¿éc¸éc±écªéc£écœéc•écŽéc‡éc€écyécréckécdéc]écVécOécHécAéc:éc3éc,éc%écécécéc écécûècôècíècæècßècØècÑècÊècÃèc¼ècµèc®èc§èc èc™èc’èc‹èc„èc}ècvècoèchècaècZècSècLècEèc>èc7èc0èc)èc"ècècèc ècècÿçcøçcñçcêçcãçcÜçcÕçcÎçcÇçcÀçc¹çc²çc«çc¤çcçc–çcçcˆçcçczçcsçclçceçc^çcWçcPçcIçcBçc;çc4çc-çc&çcçcçcçc çcçcüæcõæcîæcçæcàæcÙæcÒæcËæcÄæc½æc¶æc¯æc¨æc¡æcšæc“æcŒæc…æc~æcwæcpæciæcbæc[æcTæcMæcFæc?æc8æc1æc*æc#æcæcæcæcæcæcùåcòåcëåcäåcÝåcÖåcÏåcÈåcÁåcºåc³åc¬åc¥åcžåc—åcåc‰åc‚åc{åctåcmåcfåc_åcXåcQåcJåcCåc<åc5åc.åc'åc åcåcåc åcåcýäcöäcïäcèäcáäcÚäcÓäcÌäcÅäc¾äc·äc°äc©äc¢äc›äc”äcäc†äcäcxäcqäcjäccäc\äcUäcNäcGäc@äc9äc2äc+äc$äcäcäcäcäcäcúãcóãcìãcåãcÞãc×ãcÐãcÉãcÂãc»ãc´ãc­ãc¦ãcŸãc˜ãc‘ãcŠãcƒãc|ãcuãcnãcgãc`ãcYãcRãcKãcDãc=ãc6ãc/ãc(ãc!ãcãcãc ãcãcþâc÷âcðâcéâcââcÛâcÔâcÍâcÆâc¿âc¸âc±âcªâc£âcœâc•âcŽâc‡âc€âcyâcrâckâcdâc]âcVâcOâcHâcAâc:âc3âc,âc%âcâcâcâc âcâcûácôácíácæácßácØácÑácÊácÃác¼ácµác®ác§ác ác™ác’ác‹ác„ác}ácvácoáchácaácZácSácLácEác>ác7ác0ác)ác"ácácác ácácÿàcøàcñàcêàcãàcÜàcÕàcÎàcÇàcÀàc¹àc²àc«àc¤àcàc–àcàcˆàcàczàcsàclàceàc^àcWàcPàcIàcBàc;àc4àc-àc&àcàcàcàc àcàcüßcõßcîßcçßcàßcÙßcÒßcËßcÄßc½ßc¶ßc¯ßc¨ßc¡ßcšßc“ßcŒßc…ßc~ßcwßcpßcißcbßc[ßcTßcMßcFßc?ßc8ßc1ßc*ßc#ßcßcßcßcßcßcùÞcòÞcëÞcäÞcÝÞcÖÞcÏÞcÈÞcÁÞcºÞc³Þc¬Þc¥ÞcžÞc—ÞcÞc‰Þc‚Þc{ÞctÞcmÞcfÞc_ÞcXÞcQÞcJÞcCÞc<Þc5Þc.Þc'Þc ÞcÞcÞc ÞcÞcýÝcöÝcïÝcèÝcáÝcÚÝcÓÝcÌÝcÅÝc¾Ýc·Ýc°Ýc©Ýc¢Ýc›Ýc”ÝcÝc†ÝcÝcxÝcqÝcjÝccÝc\ÝcUÝcNÝcGÝc@Ýc9Ýc2Ýc+Ýc$ÝcÝcÝcÝcÝcÝcúÜcóÜcìÜcåÜcÞÜc×ÜcÐÜcÉÜcÂÜc»Üc´Üc­Üc¦ÜcŸÜc˜Üc‘ÜcŠÜcƒÜc|ÜcuÜcnÜcgÜc`ÜcYÜcRÜcKÜcDÜc=Üc6Üc/Üc(Üc!ÜcÜcÜc ÜcÜcþÛc÷ÛcðÛcéÛcâÛcÛÛcÔÛcÍÛcÆÛc¿Ûc¸Ûc±ÛcªÛc£ÛcœÛc•ÛcŽÛc‡Ûc€ÛcyÛcrÛckÛcdÛc]ÛcVÛcOÛcHÛcAÛc:Ûc3Ûc,Ûc%ÛcÛcÛcÛc ÛcÛcûÚcôÚcíÚcæÚcßÚcØÚcÑÚcÊÚcÃÚc¼ÚcµÚc®Úc§Úc Úc™Úc’Úc‹Úc„Úc}ÚcvÚcoÚchÚcaÚcZÚcSÚcLÚcEÚc>Úc7Úc0Úc)Úc"ÚcÚcÚc ÚcÚcÿÙcøÙcñÙcêÙcãÙcÜÙcÕÙcÎÙcÇÙcÀÙc¹Ùc²Ùc«Ùc¤ÙcÙc–ÙcÙcˆÙcÙczÙcsÙclÙceÙc^ÙcWÙcPÙcIÙcBÙc;Ùc4Ùc-Ùc&ÙcÙcÙcÙc ÙcÙcüØcõØcîØcçØcàØcÙØcÒØcËØcÄØc½Øc¶Øc¯Øc¨Øc¡ØcšØc“ØcŒØc…Øc~ØcwØcpØciØcbØc[ØcTØcMØcFØc?Øc8Øc1Øc*Øc#ØcØcØcØcØcØcù×cò×cë×cä×cÝ×cÖ×cÏ×cÈ×cÁ×cº×c³×c¬×c¥×cž×c—×c×c‰×c‚×c{×ct×cm×cf×c_×cX×cQ×cJ×cC×c<×c5×c.×c'×c ×c×c×c ×c×cýÖcöÖcïÖcèÖcáÖcÚÖcÓÖcÌÖcÅÖc¾Öc·Öc°Öc©Öc¢Öc›Öc”ÖcÖc†ÖcÖcxÖcqÖcjÖccÖc\ÖcUÖcNÖcGÖc@Öc9Öc2Öc+Öc$ÖcÖcÖcÖcÖcÖcúÕcóÕcìÕcåÕcÞÕc×ÕcÐÕcÉÕcÂÕc»Õc´Õc­Õc¦ÕcŸÕc˜Õc‘ÕcŠÕcƒÕc|ÕcuÕcnÕcgÕc`ÕcYÕcRÕcKÕcDÕc=Õc6Õc/Õc(Õc!ÕcÕcÕc ÕcÕcþÔc÷ÔcðÔcéÔcâÔcÛÔcÔÔcÍÔcÆÔc¿Ôc¸Ôc±ÔcªÔc£ÔcœÔc•ÔcŽÔc‡Ôc€ÔcyÔcrÔckÔcdÔc]ÔcVÔcOÔcHÔcAÔc:Ôc3Ôc,Ôc%ÔcÔcÔcÔc ÔcÔcûÓcôÓcíÓcæÓcßÓcØÓcÑÓcÊÓcÃÓc¼ÓcµÓc®Óc§Óc Óc™Óc’Óc‹Óc„Óc}ÓcvÓcoÓchÓcaÓcZÓcSÓcLÓcEÓc>Óc7Óc0Óc)Óc"ÓcÓcÓc ÓcÓcÿÒcøÒcñÒcêÒcãÒcÜÒcÕÒcÎÒcÇÒcÀÒc¹Òc²Òc«Òc¤ÒcÒc–ÒcÒcˆÒcÒczÒcsÒclÒceÒc^ÒcWÒcPÒcIÒcBÒc;Òc4Òc-Òc&ÒcÒcÒcÒc ÒcÒcüÑcõÑcîÑcçÑcàÑcÙÑcÒÑcËÑcÄÑc½Ñc¶Ñc¯Ñc¨Ñc¡ÑcšÑc“ÑcŒÑc…Ñc~ÑcwÑcpÑciÑcbÑc[ÑcTÑcMÑcFÑc?Ñc8Ñc1Ñc*Ñc#ÑcÑcÑcÑcÑcÑcùÐcòÐcëÐcäÐcÝÐcÖÐcÏÐcÈÐcÁÐcºÐc³Ðc¬Ðc¥ÐcžÐc—ÐcÐc‰Ðc‚Ðc{ÐctÐcmÐcfÐc_ÐcXÐcQÐcJÐcCÐc<Ðc5Ðc.Ðc'Ðc ÐcÐcÐc ÐcÐcýÏcöÏcïÏcèÏcáÏcÚÏcÓÏcÌÏcÅÏc¾Ïc·Ïc°Ïc©Ïc¢Ïc›Ïc”ÏcÏc†ÏcÏcxÏcqÏcjÏccÏc\ÏcUÏcNÏcGÏc@Ïc9Ïc2Ïc+Ïc$ÏcÏcÏcÏcÏcÏcúÎcóÎcìÎcåÎcÞÎc×ÎcÐÎcÉÎcÂÎc»Îc´Îc­Îc¦ÎcŸÎc˜Îc‘ÎcŠÎcƒÎc|ÎcuÎcnÎcgÎc`ÎcYÎcRÎcKÎcDÎc=Îc6Îc/Îc(Îc!ÎcÎcÎc ÎcÎcþÍc÷ÍcðÍcéÍcâÍcÛÍcÔÍcÍÍcÆÍc¿Íc¸Íc±ÍcªÍc£ÍcœÍc•ÍcŽÍc‡Íc€ÍcyÍcrÍckÍcdÍc]ÍcVÍcOÍcHÍcAÍc:Íc3Íc,Íc%ÍcÍcÍcÍc ÍcÍcûÌcôÌcíÌcæÌcßÌcØÌcÑÌcÊÌcÃÌc¼ÌcµÌc®Ìc§Ìc Ìc™Ìc’Ìc‹Ìc„Ìc}ÌcvÌcoÌchÌcaÌcZÌcSÌcLÌcEÌc>Ìc7Ìc0Ìc)Ìc"ÌcÌcÌc ÌcÌcÿËcøËcñËcêËcãËcÜËcÕËcÎËcÇËcÀËc¹Ëc²Ëc«Ëc¤ËcËc–ËcËcˆËcËczËcsËclËceËc^ËcWËcPËcIËcBËc;Ëc4Ëc-Ëc&ËcËcËcËc ËcËcüÊcõÊcîÊcçÊcàÊcÙÊcÒÊcËÊcÄÊc½Êc¶Êc¯Êc¨Êc¡ÊcšÊc“ÊcŒÊc…Êc~ÊcwÊcpÊciÊcbÊc[ÊcTÊcMÊcFÊc?Êc8Êc1Êc*Êc#ÊcÊcÊcÊcÊcÊcùÉcòÉcëÉcäÉcÝÉcÖÉcÏÉcÈÉcÁÉcºÉc³Éc¬Éc¥ÉcžÉc—ÉcÉc‰Éc‚Éc{ÉctÉcmÉcfÉc_ÉcXÉcQÉcJÉcCÉc<Éc5Éc.Éc'Éc ÉcÉcÉc ÉcÉcýÈcöÈcïÈcèÈcáÈcÚÈcÓÈcÌÈcÅÈc¾Èc·Èc°Èc©Èc¢Èc›Èc”ÈcÈc†ÈcÈcxÈcqÈcjÈccÈc\ÈcUÈcNÈcGÈc@Èc9Èc2Èc+Èc$ÈcÈcÈcÈcÈcÈcúÇcóÇcìÇcåÇcÞÇc×ÇcÐÇcÉÇcÂÇc»Çc´Çc­Çc¦ÇcŸÇc˜Çc‘ÇcŠÇcƒÇc|ÇcuÇcnÇcgÇc`ÇcYÇcRÇcKÇcDÇc=Çc6Çc/Çc(Çc!ÇcÇcÇc ÇcÇcþÆc÷ÆcðÆcéÆcâÆcÛÆcÔÆcÍÆcÆÆc¿Æc¸Æc±ÆcªÆc£ÆcœÆc•ÆcŽÆc‡Æc€ÆcyÆcrÆckÆcdÆc]ÆcVÆcOÆcHÆcAÆc:Æc3Æc,Æc%ÆcÆcÆcÆc ÆcÆcûÅcôÅcíÅcæÅcßÅcØÅcÑÅcÊÅcÃÅc¼ÅcµÅc®Åc§Åc Åc™Åc’Åc‹Åc„Åc}ÅcvÅcoÅchÅcaÅcZÅcSÅcLÅcEÅc>Åc7Åc0Åc)Åc"ÅcÅcÅc ÅcÅcÿÄcøÄcñÄcêÄcãÄcÜÄcÕÄcÎÄcÇÄcÀÄc¹Äc²Äc«Äc¤ÄcÄc–ÄcÄcˆÄcÄczÄcsÄclÄceÄc^ÄcWÄcPÄcIÄcBÄc;Äc4Äc-Äc&ÄcÄcÄcÄc ÄcÄcüÃcõÃcîÃcçÃcàÃcÙÃcÒÃcËÃcÄÃc½Ãc¶Ãc¯Ãc¨Ãc¡ÃcšÃc“ÃcŒÃc…Ãc~ÃcwÃcpÃciÃcbÃc[ÃcTÃcMÃcFÃc?Ãc8Ãc1Ãc*Ãc#ÃcÃcÃcÃcÃcÃcùÂcòÂcëÂcäÂcÝÂcÖÂcÏÂcÈÂcÁÂcºÂc³Âc¬Âc¥ÂcžÂc—ÂcÂc‰Âc‚Âc{ÂctÂcmÂcfÂc_ÂcXÂcQÂcJÂcCÂc<Âc5Âc.Âc'Âc ÂcÂcÂc ÂcÂcýÁcöÁcïÁcèÁcáÁcÚÁcÓÁcÌÁcÅÁc¾Ác·Ác°Ác©Ác¢Ác›Ác”ÁcÁc†ÁcÁcxÁcqÁcjÁccÁc\ÁcUÁcNÁcGÁc@Ác9Ác2Ác+Ác$ÁcÁcÁcÁcÁcÁcúÀcóÀcìÀcåÀcÞÀc×ÀcÐÀcÉÀcÂÀc»Àc´Àc­Àc¦ÀcŸÀc˜Àc‘ÀcŠÀcƒÀc|ÀcuÀcnÀcgÀc`ÀcYÀcRÀcKÀcDÀc=Àc6Àc/Àc(Àc!ÀcÀcÀc ÀcÀcþ¿c÷¿cð¿cé¿câ¿cÛ¿cÔ¿cÍ¿cÆ¿c¿¿c¸¿c±¿cª¿c£¿cœ¿c•¿cŽ¿c‡¿c€¿cy¿cr¿ck¿cd¿c]¿cV¿cO¿cH¿cA¿c:¿c3¿c,¿c%¿c¿c¿c¿c ¿c¿cû¾cô¾cí¾cæ¾cß¾cؾcѾcʾcþc¼¾cµ¾c®¾c§¾c ¾c™¾c’¾c‹¾c„¾c}¾cv¾co¾ch¾ca¾cZ¾cS¾cL¾cE¾c>¾c7¾c0¾c)¾c"¾c¾c¾c ¾c¾cÿ½cø½cñ½cê½cã½cܽcÕ½cνcǽcÀ½c¹½c²½c«½c¤½c½c–½c½cˆ½c½cz½cs½cl½ce½c^½cW½cP½cI½cB½c;½c4½c-½c&½c½c½c½c ½c½cü¼cõ¼cî¼cç¼cà¼cÙ¼cÒ¼c˼cļc½¼c¶¼c¯¼c¨¼c¡¼cš¼c“¼cŒ¼c…¼c~¼cw¼cp¼ci¼cb¼c[¼cT¼cM¼cF¼c?¼c8¼c1¼c*¼c#¼c¼c¼c¼c¼c¼cù»cò»cë»cä»cÝ»cÖ»cÏ»cÈ»cÁ»cº»c³»c¬»c¥»cž»c—»c»c‰»c‚»c{»ct»cm»cf»c_»cX»cQ»cJ»cC»c<»c5»c.»c'»c »c»c»c »c»cýºcöºcïºcèºcáºcÚºcÓºc̺cźc¾ºc·ºc°ºc©ºc¢ºc›ºc”ºcºc†ºcºcxºcqºcjºccºc\ºcUºcNºcGºc@ºc9ºc2ºc+ºc$ºcºcºcºcºcºcú¹có¹cì¹cå¹cÞ¹c×¹cйcɹc¹c»¹c´¹c­¹c¦¹cŸ¹c˜¹c‘¹cйcƒ¹c|¹cu¹cn¹cg¹c`¹cY¹cR¹cK¹cD¹c=¹c6¹c/¹c(¹c!¹c¹c¹c ¹c¹cþ¸c÷¸cð¸cé¸câ¸cÛ¸cÔ¸c͸cƸc¿¸c¸¸c±¸cª¸c£¸cœ¸c•¸cޏc‡¸c€¸cy¸cr¸ck¸cd¸c]¸cV¸cO¸cH¸cA¸c:¸c3¸c,¸c%¸c¸c¸c¸c ¸c¸cû·cô·cí·cæ·cß·cØ·cÑ·cÊ·c÷c¼·cµ·c®·c§·c ·c™·c’·c‹·c„·c}·cv·co·ch·ca·cZ·cS·cL·cE·c>·c7·c0·c)·c"·c·c·c ·c·cÿ¶cø¶cñ¶cê¶cã¶cܶcÕ¶cζcǶcÀ¶c¹¶c²¶c«¶c¤¶c¶c–¶c¶cˆ¶c¶cz¶cs¶cl¶ce¶c^¶cW¶cP¶cI¶cB¶c;¶c4¶c-¶c&¶c¶c¶c¶c ¶c¶cüµcõµcîµcçµcàµcÙµcÒµc˵cĵc½µc¶µc¯µc¨µc¡µcšµc“µcŒµc…µc~µcwµcpµciµcbµc[µcTµcMµcFµc?µc8µc1µc*µc#µcµcµcµcµcµcù´cò´cë´cä´cÝ´cÖ´cÏ´cÈ´cÁ´cº´c³´c¬´c¥´cž´c—´c´c‰´c‚´c{´ct´cm´cf´c_´cX´cQ´cJ´cC´c<´c5´c.´c'´c ´c´c´c ´c´cý³cö³cï³cè³cá³cÚ³cÓ³c̳cųc¾³c·³c°³c©³c¢³c›³c”³c³c†³c³cx³cq³cj³cc³c\³cU³cN³cG³c@³c9³c2³c+³c$³c³c³c³c³c³cú²có²cì²cå²cÞ²cײcвcɲc²c»²c´²c­²c¦²cŸ²c˜²c‘²cвcƒ²c|²cu²cn²cg²c`²cY²cR²cK²cD²c=²c6²c/²c(²c!²c²c²c ²c²cþ±c÷±cð±cé±câ±cÛ±cÔ±cͱcƱc¿±c¸±c±±cª±c£±cœ±c•±cޱc‡±c€±cy±cr±ck±cd±c]±cV±cO±cH±cA±c:±c3±c,±c%±c±c±c±c ±c±cû°cô°cí°cæ°cß°cذcѰcʰcðc¼°cµ°c®°c§°c °c™°c’°c‹°c„°c}°cv°co°ch°ca°cZ°cS°cL°cE°c>°c7°c0°c)°c"°c°c°c °c°cÿ¯cø¯cñ¯cê¯cã¯cܯcÕ¯cίcǯcÀ¯c¹¯c²¯c«¯c¤¯c¯c–¯c¯cˆ¯c¯cz¯cs¯cl¯ce¯c^¯cW¯cP¯cI¯cB¯c;¯c4¯c-¯c&¯c¯c¯c¯c ¯c¯cü®cõ®cî®cç®cà®cÙ®cÒ®cË®cÄ®c½®c¶®c¯®c¨®c¡®cš®c“®cŒ®c…®c~®cw®cp®ci®cb®c[®cT®cM®cF®c?®c8®c1®c*®c#®c®c®c®c®c®cù­cò­cë­cä­cÝ­cÖ­cÏ­cÈ­cÁ­cº­c³­c¬­c¥­cž­c—­c­c‰­c‚­c{­ct­cm­cf­c_­cX­cQ­cJ­cC­c<­c5­c.­c'­c ­c­c­c ­c­cý¬cö¬cï¬cè¬cá¬cÚ¬cÓ¬c̬cŬc¾¬c·¬c°¬c©¬c¢¬c›¬c”¬c¬c†¬c¬cx¬cq¬cj¬cc¬c\¬cU¬cN¬cG¬c@¬c9¬c2¬c+¬c$¬c¬c¬c¬c¬c¬cú«có«cì«cå«cÞ«c׫cЫcÉ«c«c»«c´«c­«c¦«cŸ«c˜«c‘«cŠ«cƒ«c|«cu«cn«cg«c`«cY«cR«cK«cD«c=«c6«c/«c(«c!«c«c«c «c«cþªc÷ªcðªcéªcâªcÛªcÔªcͪcƪc¿ªc¸ªc±ªcªªc£ªcœªc•ªcŽªc‡ªc€ªcyªcrªckªcdªc]ªcVªcOªcHªcAªc:ªc3ªc,ªc%ªcªcªcªc ªcªcû©cô©cí©cæ©cß©cØ©cÑ©cÊ©céc¼©cµ©c®©c§©c ©c™©c’©c‹©c„©c}©cv©co©ch©ca©cZ©cS©cL©cE©c>©c7©c0©c)©c"©c©c©c ©c©cÿ¨cø¨cñ¨cê¨cã¨cܨcÕ¨cΨcǨcÀ¨c¹¨c²¨c«¨c¤¨c¨c–¨c¨cˆ¨c¨cz¨cs¨cl¨ce¨c^¨cW¨cP¨cI¨cB¨c;¨c4¨c-¨c&¨c¨c¨c¨c ¨c¨cü§cõ§cî§cç§cà§cÙ§cÒ§c˧cħc½§c¶§c¯§c¨§c¡§cš§c“§cŒ§c…§c~§cw§cp§ci§cb§c[§cT§cM§cF§c?§c8§c1§c*§c#§c§c§c§c§c§cù¦cò¦cë¦cä¦cݦcÖ¦cϦcȦcÁ¦cº¦c³¦c¬¦c¥¦cž¦c—¦c¦c‰¦c‚¦c{¦ct¦cm¦cf¦c_¦cX¦cQ¦cJ¦cC¦c<¦c5¦c.¦c'¦c ¦c¦c¦c ¦c¦cý¥cö¥cï¥cè¥cá¥cÚ¥cÓ¥cÌ¥cÅ¥c¾¥c·¥c°¥c©¥c¢¥c›¥c”¥c¥c†¥c¥cx¥cq¥cj¥cc¥c\¥cU¥cN¥cG¥c@¥c9¥c2¥c+¥c$¥c¥c¥c¥c¥c¥cú¤có¤cì¤cå¤cÞ¤cפcФcɤc¤c»¤c´¤c­¤c¦¤cŸ¤c˜¤c‘¤cФcƒ¤c|¤cu¤cn¤cg¤c`¤cY¤cR¤cK¤cD¤c=¤c6¤c/¤c(¤c!¤c¤c¤c ¤c¤cþ£c÷£cð£cé£câ£cÛ£cÔ£cÍ£cÆ£c¿£c¸£c±£cª£c££cœ£c•£cŽ£c‡£c€£cy£cr£ck£cd£c]£cV£cO£cH£cA£c:£c3£c,£c%£c£c£c£c £c£cû¢cô¢cí¢cæ¢cߢcØ¢cÑ¢cÊ¢câc¼¢cµ¢c®¢c§¢c ¢c™¢c’¢c‹¢c„¢c}¢cv¢co¢ch¢ca¢cZ¢cS¢cL¢cE¢c>¢c7¢c0¢c)¢c"¢c¢c¢c ¢c¢cÿ¡cø¡cñ¡cê¡cã¡cÜ¡cÕ¡cΡcÇ¡cÀ¡c¹¡c²¡c«¡c¤¡c¡c–¡c¡cˆ¡c¡cz¡cs¡cl¡ce¡c^¡cW¡cP¡cI¡cB¡c;¡c4¡c-¡c&¡c¡c¡c¡c ¡c¡cü cõ cî cç cà cÙ cÒ cË cÄ c½ c¶ c¯ c¨ c¡ cš c“ cŒ c… c~ cw cp ci cb c[ cT cM cF c? c8 c1 c* c# c c c c c cùŸcòŸcëŸcäŸcÝŸcÖŸcÏŸcÈŸcÁŸcºŸc³Ÿc¬Ÿc¥ŸcžŸc—ŸcŸc‰Ÿc‚Ÿc{ŸctŸcmŸcfŸc_ŸcXŸcQŸcJŸcCŸc<Ÿc5Ÿc.Ÿc'Ÿc ŸcŸcŸc ŸcŸcýžcöžcïžcèžcážcÚžcÓžcÌžcÅžc¾žc·žc°žc©žc¢žc›žc”žcžc†žcžcxžcqžcjžccžc\žcUžcNžcGžc@žc9žc2žc+žc$žcžcžcžcžcžcúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþœc÷œcðœcéœcâœcÛœcÔœcÍœcÆœc¿œc¸œc±œcªœc£œcœœc•œcŽœc‡œc€œcyœcrœckœcdœc]œcVœcOœcHœcAœc:œc3œc,œc%œcœcœcœc œcœcû›cô›cí›cæ›cß›cØ›cÑ›cÊ›cÛc¼›cµ›c®›c§›c ›c™›c’›c‹›c„›c}›cv›co›ch›ca›cZ›cS›cL›cE›c>›c7›c0›c)›c"›c›c›c ›c›cÿšcøšcñšcêšcãšcÜšcÕšcΚcÇšcÀšc¹šc²šc«šc¤šcšc–šcšcˆšcšczšcsšclšcešc^šcWšcPšcIšcBšc;šc4šc-šc&šcšcšcšc šcšcü™cõ™cî™cç™cà™cÙ™cÒ™cË™cÄ™c½™c¶™c¯™c¨™c¡™cš™c“™cŒ™c…™c~™cw™cp™ci™cb™c[™cT™cM™cF™c?™c8™c1™c*™c#™c™c™c™c™c™cù˜cò˜cë˜cä˜cݘcÖ˜cϘcȘcÁ˜cº˜c³˜c¬˜c¥˜cž˜c—˜c˜c‰˜c‚˜c{˜ct˜cm˜cf˜c_˜cX˜cQ˜cJ˜cC˜c<˜c5˜c.˜c'˜c ˜c˜c˜c ˜c˜cý—cö—cï—cè—cá—cÚ—cÓ—cÌ—cÅ—c¾—c·—c°—c©—c¢—c›—c”—c—c†—c—cx—cq—cj—cc—c\—cU—cN—cG—c@—c9—c2—c+—c$—c—c—c—c—c—cú–có–cì–cå–cÞ–c×–cЖcÉ–c–c»–c´–c­–c¦–cŸ–c˜–c‘–cŠ–cƒ–c|–cu–cn–cg–c`–cY–cR–cK–cD–c=–c6–c/–c(–c!–c–c–c –c–cþ•c÷•cð•cé•câ•cÛ•cÔ•cÍ•cÆ•c¿•c¸•c±•cª•c£•cœ•c••cŽ•c‡•c€•cy•cr•ck•cd•c]•cV•cO•cH•cA•c:•c3•c,•c%•c•c•c•c •c•cû”cô”cí”cæ”cß”cØ”cÑ”cÊ”cÔc¼”cµ”c®”c§”c ”c™”c’”c‹”c„”c}”cv”co”ch”ca”cZ”cS”cL”cE”c>”c7”c0”c)”c"”c”c”c ”c”cÿ“cø“cñ“cê“cã“cÜ“cÕ“cΓcÇ“cÀ“c¹“c²“c«“c¤“c“c–“c“cˆ“c“cz“cs“cl“ce“c^“cW“cP“cI“cB“c;“c4“c-“c&“c“c“c“c “c“cü’cõ’cî’cç’cà’cÙ’cÒ’cË’cÄ’c½’c¶’c¯’c¨’c¡’cš’c“’cŒ’c…’c~’cw’cp’ci’cb’c[’cT’cM’cF’c?’c8’c1’c*’c#’c’c’c’c’c’cù‘cò‘cë‘cä‘cÝ‘cÖ‘cÏ‘cÈ‘cÁ‘cº‘c³‘c¬‘c¥‘cž‘c—‘c‘c‰‘c‚‘c{‘ct‘cm‘cf‘c_‘cX‘cQ‘cJ‘cC‘c<‘c5‘c.‘c'‘c ‘c‘c‘c ‘c‘cýcöcïcècácÚcÓcÌcÅc¾c·c°c©c¢c›c”cc†ccxcqcjccc\cUcNcGc@c9c2c+c$ccccccúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþŽc÷ŽcðŽcéŽcâŽcÛŽcÔŽcÍŽcÆŽc¿Žc¸Žc±ŽcªŽc£ŽcœŽc•ŽcŽŽc‡Žc€ŽcyŽcrŽckŽcdŽc]ŽcVŽcOŽcHŽcAŽc:Žc3Žc,Žc%ŽcŽcŽcŽc ŽcŽcûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿŒcøŒcñŒcêŒcãŒcÜŒcÕŒcÎŒcÇŒcÀŒc¹Œc²Œc«Œc¤ŒcŒc–ŒcŒcˆŒcŒczŒcsŒclŒceŒc^ŒcWŒcPŒcIŒcBŒc;Œc4Œc-Œc&ŒcŒcŒcŒc ŒcŒcü‹cõ‹cî‹cç‹cà‹cÙ‹cÒ‹cË‹cÄ‹c½‹c¶‹c¯‹c¨‹c¡‹cš‹c“‹cŒ‹c…‹c~‹cw‹cp‹ci‹cb‹c[‹cT‹cM‹cF‹c?‹c8‹c1‹c*‹c#‹c‹c‹c‹c‹c‹cùŠcòŠcëŠcäŠcÝŠcÖŠcÏŠcÈŠcÁŠcºŠc³Šc¬Šc¥ŠcžŠc—ŠcŠc‰Šc‚Šc{ŠctŠcmŠcfŠc_ŠcXŠcQŠcJŠcCŠc<Šc5Šc.Šc'Šc ŠcŠcŠc ŠcŠcý‰cö‰cï‰cè‰cá‰cÚ‰cÓ‰c̉cʼnc¾‰c·‰c°‰c©‰c¢‰c›‰c”‰c‰c†‰c‰cx‰cq‰cj‰cc‰c\‰cU‰cN‰cG‰c@‰c9‰c2‰c+‰c$‰c‰c‰c‰c‰c‰cúˆcóˆcìˆcåˆcÞˆc׈cЈcɈcˆc»ˆc´ˆc­ˆc¦ˆcŸˆc˜ˆc‘ˆcŠˆcƒˆc|ˆcuˆcnˆcgˆc`ˆcYˆcRˆcKˆcDˆc=ˆc6ˆc/ˆc(ˆc!ˆcˆcˆc ˆcˆcþ‡c÷‡cð‡cé‡câ‡cÛ‡cÔ‡c͇cƇc¿‡c¸‡c±‡cª‡c£‡cœ‡c•‡cއc‡‡c€‡cy‡cr‡ck‡cd‡c]‡cV‡cO‡cH‡cA‡c:‡c3‡c,‡c%‡c‡c‡c‡c ‡c‡cû†cô†cí†cæ†c߆c؆cцcʆcÆc¼†cµ†c®†c§†c †c™†c’†c‹†c„†c}†cv†co†ch†ca†cZ†cS†cL†cE†c>†c7†c0†c)†c"†c†c†c †c†cÿ…cø…cñ…cê…cã…cÜ…cÕ…cÎ…cÇ…cÀ…c¹…c²…c«…c¤…c…c–…c…cˆ…c…cz…cs…cl…ce…c^…cW…cP…cI…cB…c;…c4…c-…c&…c…c…c…c …c…cü„cõ„cî„cç„cà„cÙ„cÒ„cË„cÄ„c½„c¶„c¯„c¨„c¡„cš„c“„cŒ„c…„c~„cw„cp„ci„cb„c[„cT„cM„cF„c?„c8„c1„c*„c#„c„c„c„c„c„cùƒcòƒcëƒcäƒc݃cÖƒcσcȃcÁƒcºƒc³ƒc¬ƒc¥ƒcžƒc—ƒcƒc‰ƒc‚ƒc{ƒctƒcmƒcfƒc_ƒcXƒcQƒcJƒcCƒc<ƒc5ƒc.ƒc'ƒc ƒcƒcƒc ƒcƒcý‚cö‚cï‚cè‚cá‚cÚ‚cÓ‚cÌ‚cÅ‚c¾‚c·‚c°‚c©‚c¢‚c›‚c”‚c‚c†‚c‚cx‚cq‚cj‚cc‚c\‚cU‚cN‚cG‚c@‚c9‚c2‚c+‚c$‚c‚c‚c‚c‚c‚cúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþ€c÷€cð€cé€câ€cÛ€cÔ€cÍ€cÆ€c¿€c¸€c±€cª€c£€cœ€c•€cŽ€c‡€c€€cy€cr€ck€cd€c]€cV€cO€cH€cA€c:€c3€c,€c%€c€c€c€c €c€cûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿ~cø~cñ~cê~cã~cÜ~cÕ~cÎ~cÇ~cÀ~c¹~c²~c«~c¤~c~c–~c~cˆ~c~cz~cs~cl~ce~c^~cW~cP~cI~cB~c;~c4~c-~c&~c~c~c~c ~c~cü}cõ}cî}cç}cà}cÙ}cÒ}cË}cÄ}c½}c¶}c¯}c¨}c¡}cš}c“}cŒ}c…}c~}cw}cp}ci}cb}c[}cT}cM}cF}c?}c8}c1}c*}c#}c}c}c}c}c}cù|cò|cë|cä|cÝ|cÖ|cÏ|cÈ|cÁ|cº|c³|c¬|c¥|cž|c—|c|c‰|c‚|c{|ct|cm|cf|c_|cX|cQ|cJ|cC|c<|c5|c.|c'|c |c|c|c |c|cý{cö{cï{cè{cá{cÚ{cÓ{cÌ{cÅ{c¾{c·{c°{c©{c¢{c›{c”{c{c†{c{cx{cq{cj{cc{c\{cU{cN{cG{c@{c9{c2{c+{c${c{c{c{c{c{cúzcózcìzcåzcÞzc×zcÐzcÉzcÂzc»zc´zc­zc¦zcŸzc˜zc‘zcŠzcƒzc|zcuzcnzcgzc`zcYzcRzcKzcDzc=zc6zc/zc(zc!zczczc zczcþyc÷ycðycéycâycÛycÔycÍycÆyc¿yc¸yc±ycªyc£ycœyc•ycŽyc‡yc€ycyycryckycdyc]ycVycOycHycAyc:yc3yc,yc%ycycycyc ycycûxcôxcíxcæxcßxcØxcÑxcÊxcÃxc¼xcµxc®xc§xc xc™xc’xc‹xc„xc}xcvxcoxchxcaxcZxcSxcLxcExc>xc7xc0xc)xc"xcxcxc xcxcÿwcøwcñwcêwcãwcÜwcÕwcÎwcÇwcÀwc¹wc²wc«wc¤wcwc–wcwcˆwcwczwcswclwcewc^wcWwcPwcIwcBwc;wc4wc-wc&wcwcwcwc wcwcüvcõvcîvcçvcàvcÙvcÒvcËvcÄvc½vc¶vc¯vc¨vc¡vcšvc“vcŒvc…vc~vcwvcpvcivcbvc[vcTvcMvcFvc?vc8vc1vc*vc#vcvcvcvcvcvcùucòucëucäucÝucÖucÏucÈucÁucºuc³uc¬uc¥ucžuc—ucuc‰uc‚uc{uctucmucfuc_ucXucQucJucCucqc7qc0qc)qc"qcqcqc qcqcÿpcøpcñpcêpcãpcÜpcÕpcÎpcÇpcÀpc¹pc²pc«pc¤pcpc–pcpcˆpcpczpcspclpcepc^pcWpcPpcIpcBpc;pc4pc-pc&pcpcpcpc pcpcüocõocîocçocàocÙocÒocËocÄoc½oc¶oc¯oc¨oc¡ocšoc“ocŒoc…oc~ocwocpociocboc[ocTocMocFoc?oc8oc1oc*oc#ococococococùncòncëncäncÝncÖncÏncÈncÁncºnc³nc¬nc¥ncžnc—ncnc‰nc‚nc{nctncmncfnc_ncXncQncJncCncjc7jc0jc)jc"jcjcjc jcjcÿicøicñicêicãicÜicÕicÎicÇicÀic¹ic²ic«ic¤icic–icicˆiciczicsicliceic^icWicPicIicBic;ic4ic-ic&icicicic icicühcõhcîhcçhcàhcÙhcÒhcËhcÄhc½hc¶hc¯hc¨hc¡hcšhc“hcŒhc…hc~hcwhcphcihcbhc[hcThcMhcFhc?hc8hc1hc*hc#hchchchchchcùgcògcëgcägcÝgcÖgcÏgcÈgcÁgcºgc³gc¬gc¥gcžgc—gcgc‰gc‚gc{gctgcmgcfgc_gcXgcQgcJgcCgccc7cc0cc)cc"cccccc ccccÿbcøbcñbcêbcãbcÜbcÕbcÎbcÇbcÀbc¹bc²bc«bc¤bcbc–bcbcˆbcbczbcsbclbcebc^bcWbcPbcIbcBbc;bc4bc-bc&bcbcbcbc bcbcüacõacîacçacàacÙacÒacËacÄac½ac¶ac¯ac¨ac¡acšac“acŒac…ac~acwacpaciacbac[acTacMacFac?ac8ac1ac*ac#acacacacacacù`cò`cë`cä`cÝ`cÖ`cÏ`cÈ`cÁ`cº`c³`c¬`c¥`cž`c—`c`c‰`c‚`c{`ct`cm`cf`c_`cX`cQ`cJ`cC`c<`c5`c.`c'`c `c`c`c `c`cý_cö_cï_cè_cá_cÚ_cÓ_cÌ_cÅ_c¾_c·_c°_c©_c¢_c›_c”_c_c†_c_cx_cq_cj_cc_c\_cU_cN_cG_c@_c9_c2_c+_c$_c_c_c_c_c_cú^có^cì^cå^cÞ^c×^cÐ^cÉ^cÂ^c»^c´^c­^c¦^cŸ^c˜^c‘^cŠ^cƒ^c|^cu^cn^cg^c`^cY^cR^cK^cD^c=^c6^c/^c(^c!^c^c^c ^c^cþ]c÷]cð]cé]câ]cÛ]cÔ]cÍ]cÆ]c¿]c¸]c±]cª]c£]cœ]c•]cŽ]c‡]c€]cy]cr]ck]cd]c]]cV]cO]cH]cA]c:]c3]c,]c%]c]c]c]c ]c]cû\cô\cí\cæ\cß\cØ\cÑ\cÊ\cÃ\c¼\cµ\c®\c§\c \c™\c’\c‹\c„\c}\cv\co\ch\ca\cZ\cS\cL\cE\c>\c7\c0\c)\c"\c\c\c \c\cÿ[cø[cñ[cê[cã[cÜ[cÕ[cÎ[cÇ[cÀ[c¹[c²[c«[c¤[c[c–[c[cˆ[c[cz[cs[cl[ce[c^[cW[cP[cI[cB[c;[c4[c-[c&[c[c[c[c [c[cüZcõZcîZcçZcàZcÙZcÒZcËZcÄZc½Zc¶Zc¯Zc¨Zc¡ZcšZc“ZcŒZc…Zc~ZcwZcpZciZcbZc[ZcTZcMZcFZc?Zc8Zc1Zc*Zc#ZcZcZcZcZcZcùYcòYcëYcäYcÝYcÖYcÏYcÈYcÁYcºYc³Yc¬Yc¥YcžYc—YcYc‰Yc‚Yc{YctYcmYcfYc_YcXYcQYcJYcCYcUc7Uc0Uc)Uc"UcUcUc UcUcÿTcøTcñTcêTcãTcÜTcÕTcÎTcÇTcÀTc¹Tc²Tc«Tc¤TcTc–TcTcˆTcTczTcsTclTceTc^TcWTcPTcITcBTc;Tc4Tc-Tc&TcTcTcTc TcTcüScõScîScçScàScÙScÒScËScÄSc½Sc¶Sc¯Sc¨Sc¡ScšSc“ScŒSc…Sc~ScwScpSciScbSc[ScTScMScFSc?Sc8Sc1Sc*Sc#ScScScScScScùRcòRcëRcäRcÝRcÖRcÏRcÈRcÁRcºRc³Rc¬Rc¥RcžRc—RcRc‰Rc‚Rc{RctRcmRcfRc_RcXRcQRcJRcCRcNc7Nc0Nc)Nc"NcNcNc NcNcÿMcøMcñMcêMcãMcÜMcÕMcÎMcÇMcÀMc¹Mc²Mc«Mc¤McMc–McMcˆMcMczMcsMclMceMc^McWMcPMcIMcBMc;Mc4Mc-Mc&McMcMcMc McMcüLcõLcîLcçLcàLcÙLcÒLcËLcÄLc½Lc¶Lc¯Lc¨Lc¡LcšLc“LcŒLc…Lc~LcwLcpLciLcbLc[LcTLcMLcFLc?Lc8Lc1Lc*Lc#LcLcLcLcLcLcùKcòKcëKcäKcÝKcÖKcÏKcÈKcÁKcºKc³Kc¬Kc¥KcžKc—KcKc‰Kc‚Kc{KctKcmKcfKc_KcXKcQKcJKcCKcGc7Gc0Gc)Gc"GcGcGc GcGcÿFcøFcñFcêFcãFcÜFcÕFcÎFcÇFcÀFc¹Fc²Fc«Fc¤FcFc–FcFcˆFcFczFcsFclFceFc^FcWFcPFcIFcBFc;Fc4Fc-Fc&FcFcFcFc FcFcüEcõEcîEcçEcàEcÙEcÒEcËEcÄEc½Ec¶Ec¯Ec¨Ec¡EcšEc“EcŒEc…Ec~EcwEcpEciEcbEc[EcTEcMEcFEc?Ec8Ec1Ec*Ec#EcEcEcEcEcEcùDcòDcëDcäDcÝDcÖDcÏDcÈDcÁDcºDc³Dc¬Dc¥DcžDc—DcDc‰Dc‚Dc{DctDcmDcfDc_DcXDcQDcJDcCDc@c7@c0@c)@c"@c@c@c @c@cÿ?cø?cñ?cê?cã?cÜ?cÕ?cÎ?cÇ?cÀ?c¹?c²?c«?c¤?c?c–?c?cˆ?c?cz?cs?cl?ce?c^?cW?cP?cI?cB?c;?c4?c-?c&?c?c?c?c ?c?cü>cõ>cî>cç>cà>cÙ>cÒ>cË>cÄ>c½>c¶>c¯>c¨>c¡>cš>c“>cŒ>c…>c~>cw>cp>ci>cb>c[>cT>cM>cF>c?>c8>c1>c*>c#>c>c>c>c>c>cù=cò=cë=cä=cÝ=cÖ=cÏ=cÈ=cÁ=cº=c³=c¬=c¥=cž=c—=c=c‰=c‚=c{=ct=cm=cf=c_=cX=cQ=cJ=cC=c<=c5=c.=c'=c =c=c=c =c=cý9c79c09c)9c"9c9c9c 9c9cÿ8cø8cñ8cê8cã8cÜ8cÕ8cÎ8cÇ8cÀ8c¹8c²8c«8c¤8c8c–8c8cˆ8c8cz8cs8cl8ce8c^8cW8cP8cI8cB8c;8c48c-8c&8c8c8c8c 8c8cü7cõ7cî7cç7cà7cÙ7cÒ7cË7cÄ7c½7c¶7c¯7c¨7c¡7cš7c“7cŒ7c…7c~7cw7cp7ci7cb7c[7cT7cM7cF7c?7c87c17c*7c#7c7c7c7c7c7cù6cò6cë6cä6cÝ6cÖ6cÏ6cÈ6cÁ6cº6c³6c¬6c¥6cž6c—6c6c‰6c‚6c{6ct6cm6cf6c_6cX6cQ6cJ6cC6c<6c56c.6c'6c 6c6c6c 6c6cý5cö5cï5cè5cá5cÚ5cÓ5cÌ5cÅ5c¾5c·5c°5c©5c¢5c›5c”5c5c†5c5cx5cq5cj5cc5c\5cU5cN5cG5c@5c95c25c+5c$5c5c5c5c5c5cú4có4cì4cå4cÞ4c×4cÐ4cÉ4cÂ4c»4c´4c­4c¦4cŸ4c˜4c‘4cŠ4cƒ4c|4cu4cn4cg4c`4cY4cR4cK4cD4c=4c64c/4c(4c!4c4c4c 4c4cþ3c÷3cð3cé3câ3cÛ3cÔ3cÍ3cÆ3c¿3c¸3c±3cª3c£3cœ3c•3cŽ3c‡3c€3cy3cr3ck3cd3c]3cV3cO3cH3cA3c:3c33c,3c%3c3c3c3c 3c3cû2cô2cí2cæ2cß2cØ2cÑ2cÊ2cÃ2c¼2cµ2c®2c§2c 2c™2c’2c‹2c„2c}2cv2co2ch2ca2cZ2cS2cL2cE2c>2c72c02c)2c"2c2c2c 2c2cÿ1cø1cñ1cê1cã1cÜ1cÕ1cÎ1cÇ1cÀ1c¹1c²1c«1c¤1c1c–1c1cˆ1c1cz1cs1cl1ce1c^1cW1cP1cI1cB1c;1c41c-1c&1c1c1c1c 1c1cü0cõ0cî0cç0cà0cÙ0cÒ0cË0cÄ0c½0c¶0c¯0c¨0c¡0cš0c“0cŒ0c…0c~0cw0cp0ci0cb0c[0cT0cM0cF0c?0c80c10c*0c#0c0c0c0c0c0cù/cò/cë/cä/cÝ/cÖ/cÏ/cÈ/cÁ/cº/c³/c¬/c¥/cž/c—/c/c‰/c‚/c{/ct/cm/cf/c_/cX/cQ/cJ/cC/c+c7+c0+c)+c"+c+c+c +c+cÿ*cø*cñ*cê*cã*cÜ*cÕ*cÎ*cÇ*cÀ*c¹*c²*c«*c¤*c*c–*c*cˆ*c*cz*cs*cl*ce*c^*cW*cP*cI*cB*c;*c4*c-*c&*c*c*c*c *c*cü)cõ)cî)cç)cà)cÙ)cÒ)cË)cÄ)c½)c¶)c¯)c¨)c¡)cš)c“)cŒ)c…)c~)cw)cp)ci)cb)c[)cT)cM)cF)c?)c8)c1)c*)c#)c)c)c)c)c)cù(cò(cë(cä(cÝ(cÖ(cÏ(cÈ(cÁ(cº(c³(c¬(c¥(cž(c—(c(c‰(c‚(c{(ct(cm(cf(c_(cX(cQ(cJ(cC(c<(c5(c.(c'(c (c(c(c (c(cý'cö'cï'cè'cá'cÚ'cÓ'cÌ'cÅ'c¾'c·'c°'c©'c¢'c›'c”'c'c†'c'cx'cq'cj'cc'c\'cU'cN'cG'c@'c9'c2'c+'c$'c'c'c'c'c'cú&có&cì&cå&cÞ&c×&cÐ&cÉ&cÂ&c»&c´&c­&c¦&cŸ&c˜&c‘&cŠ&cƒ&c|&cu&cn&cg&c`&cY&cR&cK&cD&c=&c6&c/&c(&c!&c&c&c &c&cþ%c÷%cð%cé%câ%cÛ%cÔ%cÍ%cÆ%c¿%c¸%c±%cª%c£%cœ%c•%cŽ%c‡%c€%cy%cr%ck%cd%c]%cV%cO%cH%cA%c:%c3%c,%c%%c%c%c%c %c%cû$cô$cí$cæ$cß$cØ$cÑ$cÊ$cÃ$c¼$cµ$c®$c§$c $c™$c’$c‹$c„$c}$cv$co$ch$ca$cZ$cS$cL$cE$c>$c7$c0$c)$c"$c$c$c $c$cÿ#cø#cñ#cê#cã#cÜ#cÕ#cÎ#cÇ#cÀ#c¹#c²#c«#c¤#c#c–#c#cˆ#c#cz#cs#cl#ce#c^#cW#cP#cI#cB#c;#c4#c-#c&#c#c#c#c #c#cü"cõ"cî"cç"cà"cÙ"cÒ"cË"cÄ"c½"c¶"c¯"c¨"c¡"cš"c“"cŒ"c…"c~"cw"cp"ci"cb"c["cT"cM"cF"c?"c8"c1"c*"c#"c"c"c"c"c"cù!cò!cë!cä!cÝ!cÖ!cÏ!cÈ!cÁ!cº!c³!c¬!c¥!cž!c—!c!c‰!c‚!c{!ct!cm!cf!c_!cX!cQ!cJ!cC!cc7c0c)c"ccc ccÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc<c5c.c'c ccc ccýcöcïcècácÚcÓcÌcÅc¾c·c°c©c¢c›c”cc†ccxcqcjccc\cUcNcGc@c9c2c+c$ccccccúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþc÷cðcécâcÛcÔcÍcÆc¿c¸c±cªc£cœc•cŽc‡c€cycrckcdc]cVcOcHcAc:c3c,c%cccc ccûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc<c5c.c'c ccc ccýcöcïcècácÚcÓcÌcÅc¾c·c°c©c¢c›c”cc†ccxcqcjccc\cUcNcGc@c9c2c+c$ccccccúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþc÷cðcécâcÛcÔcÍcÆc¿c¸c±cªc£cœc•cŽc‡c€cycrckcdc]cVcOcHcAc:c3c,c%cccc ccûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccü cõ cî cç cà cÙ cÒ cË cÄ c½ c¶ c¯ c¨ c¡ cš c“ cŒ c… c~ cw cp ci cb c[ cT cM cF c? c8 c1 c* c# c c c c c cù cò cë cä cÝ cÖ cÏ cÈ cÁ cº c³ c¬ c¥ cž c— c c‰ c‚ c{ ct cm cf c_ cX cQ cJ cC c< c5 c. c' c c c c c cý cö cï cè cá cÚ cÓ cÌ cÅ c¾ c· c° c© c¢ c› c” c c† c cx cq cj cc c\ cU cN cG c@ c9 c2 c+ c$ c c c c c cú có cì cå cÞ c× cÐ cÉ c c» c´ c­ c¦ cŸ c˜ c‘ cŠ cƒ c| cu cn cg c` cY cR cK cD c= c6 c/ c( c! c c c c cþ c÷ cð cé câ cÛ cÔ cÍ cÆ c¿ c¸ c± cª c£ cœ c• cŽ c‡ c€ cy cr ck cd c] cV cO cH cA c: c3 c, c% c c c c c cûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc<c5c.c'c ccc ccýcöcïcècácÚcÓcÌcÅc¾c·c°c©c¢c›c”cc†ccxcqcjccc\cUcNcGc@c9c2c+c$ccccccúcócìcåcÞc×cÐcÉcÂc»c´c­c¦cŸc˜c‘cŠcƒc|cucncgc`cYcRcKcDc=c6c/c(c!ccc ccþc÷cðcécâcÛcÔcÍcÆc¿c¸c±cªc£cœc•cŽc‡c€cycrckcdc]cVcOcHcAc:c3c,c%cccc ccûcôcícæcßcØcÑcÊcÃc¼cµc®c§c c™c’c‹c„c}cvcochcacZcScLcEc>c7c0c)c"ccc ccÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccüÿbõÿbîÿbçÿbàÿbÙÿbÒÿbËÿbÄÿb½ÿb¶ÿb¯ÿb¨ÿb¡ÿbšÿb“ÿbŒÿb…ÿb~ÿbwÿbpÿbiÿbbÿb[ÿbTÿbMÿbFÿb?ÿb8ÿb1ÿb*ÿb#ÿbÿbÿbÿbÿbÿbùþbòþbëþbäþbÝþbÖþbÏþbÈþbÁþbºþb³þb¬þb¥þbžþb—þbþb‰þb‚þb{þbtþbmþbfþb_þbXþbQþbJþbCþb<þb5þb.þb'þb þbþbþb þbþbýýböýbïýbèýbáýbÚýbÓýbÌýbÅýb¾ýb·ýb°ýb©ýb¢ýb›ýb”ýbýb†ýbýbxýbqýbjýbcýb\ýbUýbNýbGýb@ýb9ýb2ýb+ýb$ýbýbýbýbýbýbúübóübìübåübÞüb×übÐübÉübÂüb»üb´üb­üb¦übŸüb˜üb‘übŠübƒüb|übuübnübgüb`übYübRübKübDüb=üb6üb/üb(üb!übübüb übübþûb÷ûbðûbéûbâûbÛûbÔûbÍûbÆûb¿ûb¸ûb±ûbªûb£ûbœûb•ûbŽûb‡ûb€ûbyûbrûbkûbdûb]ûbVûbOûbHûbAûb:ûb3ûb,ûb%ûbûbûbûb ûbûbûúbôúbíúbæúbßúbØúbÑúbÊúbÃúb¼úbµúb®úb§úb úb™úb’úb‹úb„úb}úbvúboúbhúbaúbZúbSúbLúbEúb>úb7úb0úb)úb"úbúbúb úbúbÿùbøùbñùbêùbãùbÜùbÕùbÎùbÇùbÀùb¹ùb²ùb«ùb¤ùbùb–ùbùbˆùbùbzùbsùblùbeùb^ùbWùbPùbIùbBùb;ùb4ùb-ùb&ùbùbùbùb ùbùbüøbõøbîøbçøbàøbÙøbÒøbËøbÄøb½øb¶øb¯øb¨øb¡øbšøb“øbŒøb…øb~øbwøbpøbiøbbøb[øbTøbMøbFøb?øb8øb1øb*øb#øbøbøbøbøbøbù÷bò÷bë÷bä÷bÝ÷bÖ÷bÏ÷bÈ÷bÁ÷bº÷b³÷b¬÷b¥÷bž÷b—÷b÷b‰÷b‚÷b{÷bt÷bm÷bf÷b_÷bX÷bQ÷bJ÷bC÷b<÷b5÷b.÷b'÷b ÷b÷b÷b ÷b÷býöbööbïöbèöbáöbÚöbÓöbÌöbÅöb¾öb·öb°öb©öb¢öb›öb”öböb†öböbxöbqöbjöbcöb\öbUöbNöbGöb@öb9öb2öb+öb$öböböböböböbúõbóõbìõbåõbÞõb×õbÐõbÉõbÂõb»õb´õb­õb¦õbŸõb˜õb‘õbŠõbƒõb|õbuõbnõbgõb`õbYõbRõbKõbDõb=õb6õb/õb(õb!õbõbõb õbõbþôb÷ôbðôbéôbâôbÛôbÔôbÍôbÆôb¿ôb¸ôb±ôbªôb£ôbœôb•ôbŽôb‡ôb€ôbyôbrôbkôbdôb]ôbVôbOôbHôbAôb:ôb3ôb,ôb%ôbôbôbôb ôbôbûóbôóbíóbæóbßóbØóbÑóbÊóbÃób¼óbµób®ób§ób ób™ób’ób‹ób„ób}óbvóboóbhóbaóbZóbSóbLóbEób>ób7ób0ób)ób"óbóbób óbóbÿòbøòbñòbêòbãòbÜòbÕòbÎòbÇòbÀòb¹òb²òb«òb¤òbòb–òbòbˆòbòbzòbsòblòbeòb^òbWòbPòbIòbBòb;òb4òb-òb&òbòbòbòb òbòbüñbõñbîñbçñbàñbÙñbÒñbËñbÄñb½ñb¶ñb¯ñb¨ñb¡ñbšñb“ñbŒñb…ñb~ñbwñbpñbiñbbñb[ñbTñbMñbFñb?ñb8ñb1ñb*ñb#ñbñbñbñbñbñbùðbòðbëðbäðbÝðbÖðbÏðbÈðbÁðbºðb³ðb¬ðb¥ðbžðb—ðbðb‰ðb‚ðb{ðbtðbmðbfðb_ðbXðbQðbJðbCðb<ðb5ðb.ðb'ðb ðbðbðb ðbðbýïböïbïïbèïbáïbÚïbÓïbÌïbÅïb¾ïb·ïb°ïb©ïb¢ïb›ïb”ïbïb†ïbïbxïbqïbjïbcïb\ïbUïbNïbGïb@ïb9ïb2ïb+ïb$ïbïbïbïbïbïbúîbóîbìîbåîbÞîb×îbÐîbÉîbÂîb»îb´îb­îb¦îbŸîb˜îb‘îbŠîbƒîb|îbuîbnîbgîb`îbYîbRîbKîbDîb=îb6îb/îb(îb!îbîbîb îbîbþíb÷íbðíbéíbâíbÛíbÔíbÍíbÆíb¿íb¸íb±íbªíb£íbœíb•íbŽíb‡íb€íbyíbríbkíbdíb]íbVíbOíbHíbAíb:íb3íb,íb%íbíbíbíb íbíbûìbôìbíìbæìbßìbØìbÑìbÊìbÃìb¼ìbµìb®ìb§ìb ìb™ìb’ìb‹ìb„ìb}ìbvìboìbhìbaìbZìbSìbLìbEìb>ìb7ìb0ìb)ìb"ìbìbìb ìbìbÿëbøëbñëbêëbãëbÜëbÕëbÎëbÇëbÀëb¹ëb²ëb«ëb¤ëbëb–ëbëbˆëbëbzëbsëblëbeëb^ëbWëbPëbIëbBëb;ëb4ëb-ëb&ëbëbëbëb ëbëbüêbõêbîêbçêbàêbÙêbÒêbËêbÄêb½êb¶êb¯êb¨êb¡êbšêb“êbŒêb…êb~êbwêbpêbiêbbêb[êbTêbMêbFêb?êb8êb1êb*êb#êbêbêbêbêbêbùébòébëébäébÝébÖébÏébÈébÁébºéb³éb¬éb¥ébžéb—ébéb‰éb‚éb{ébtébmébféb_ébXébQébJébCéb<éb5éb.éb'éb ébébéb ébébýèböèbïèbèèbáèbÚèbÓèbÌèbÅèb¾èb·èb°èb©èb¢èb›èb”èbèb†èbèbxèbqèbjèbcèb\èbUèbNèbGèb@èb9èb2èb+èb$èbèbèbèbèbèbúçbóçbìçbåçbÞçb×çbÐçbÉçbÂçb»çb´çb­çb¦çbŸçb˜çb‘çbŠçbƒçb|çbuçbnçbgçb`çbYçbRçbKçbDçb=çb6çb/çb(çb!çbçbçb çbçbþæb÷æbðæbéæbâæbÛæbÔæbÍæbÆæb¿æb¸æb±æbªæb£æbœæb•æbŽæb‡æb€æbyæbræbkæbdæb]æbVæbOæbHæbAæb:æb3æb,æb%æbæbæbæb æbæbûåbôåbíåbæåbßåbØåbÑåbÊåbÃåb¼åbµåb®åb§åb åb™åb’åb‹åb„åb}åbvåboåbhåbaåbZåbSåbLåbEåb>åb7åb0åb)åb"åbåbåb åbåbÿäbøäbñäbêäbãäbÜäbÕäbÎäbÇäbÀäb¹äb²äb«äb¤äbäb–äbäbˆäbäbzäbsäbläbeäb^äbWäbPäbIäbBäb;äb4äb-äb&äbäbäbäb äbäbüãbõãbîãbçãbàãbÙãbÒãbËãbÄãb½ãb¶ãb¯ãb¨ãb¡ãbšãb“ãbŒãb…ãb~ãbwãbpãbiãbbãb[ãbTãbMãbFãb?ãb8ãb1ãb*ãb#ãbãbãbãbãbãbùâbòâbëâbäâbÝâbÖâbÏâbÈâbÁâbºâb³âb¬âb¥âbžâb—âbâb‰âb‚âb{âbtâbmâbfâb_âbXâbQâbJâbCâb<âb5âb.âb'âb âbâbâb âbâbýáböábïábèábáábÚábÓábÌábÅáb¾áb·áb°áb©áb¢áb›áb”ábáb†ábábxábqábjábcáb\ábUábNábGáb@áb9áb2áb+áb$ábábábábábábúàbóàbìàbåàbÞàb×àbÐàbÉàbÂàb»àb´àb­àb¦àbŸàb˜àb‘àbŠàbƒàb|àbuàbnàbgàb`àbYàbRàbKàbDàb=àb6àb/àb(àb!àbàbàb àbàbþßb÷ßbðßbéßbâßbÛßbÔßbÍßbÆßb¿ßb¸ßb±ßbªßb£ßbœßb•ßbŽßb‡ßb€ßbyßbrßbkßbdßb]ßbVßbOßbHßbAßb:ßb3ßb,ßb%ßbßbßbßb ßbßbûÞbôÞbíÞbæÞbßÞbØÞbÑÞbÊÞbÃÞb¼ÞbµÞb®Þb§Þb Þb™Þb’Þb‹Þb„Þb}ÞbvÞboÞbhÞbaÞbZÞbSÞbLÞbEÞb>Þb7Þb0Þb)Þb"ÞbÞbÞb ÞbÞbÿÝbøÝbñÝbêÝbãÝbÜÝbÕÝbÎÝbÇÝbÀÝb¹Ýb²Ýb«Ýb¤ÝbÝb–ÝbÝbˆÝbÝbzÝbsÝblÝbeÝb^ÝbWÝbPÝbIÝbBÝb;Ýb4Ýb-Ýb&ÝbÝbÝbÝb ÝbÝbüÜbõÜbîÜbçÜbàÜbÙÜbÒÜbËÜbÄÜb½Üb¶Üb¯Üb¨Üb¡ÜbšÜb“ÜbŒÜb…Üb~ÜbwÜbpÜbiÜbbÜb[ÜbTÜbMÜbFÜb?Üb8Üb1Üb*Üb#ÜbÜbÜbÜbÜbÜbùÛbòÛbëÛbäÛbÝÛbÖÛbÏÛbÈÛbÁÛbºÛb³Ûb¬Ûb¥ÛbžÛb—ÛbÛb‰Ûb‚Ûb{ÛbtÛbmÛbfÛb_ÛbXÛbQÛbJÛbCÛb<Ûb5Ûb.Ûb'Ûb ÛbÛbÛb ÛbÛbýÚböÚbïÚbèÚbáÚbÚÚbÓÚbÌÚbÅÚb¾Úb·Úb°Úb©Úb¢Úb›Úb”ÚbÚb†ÚbÚbxÚbqÚbjÚbcÚb\ÚbUÚbNÚbGÚb@Úb9Úb2Úb+Úb$ÚbÚbÚbÚbÚbÚbúÙbóÙbìÙbåÙbÞÙb×ÙbÐÙbÉÙbÂÙb»Ùb´Ùb­Ùb¦ÙbŸÙb˜Ùb‘ÙbŠÙbƒÙb|ÙbuÙbnÙbgÙb`ÙbYÙbRÙbKÙbDÙb=Ùb6Ùb/Ùb(Ùb!ÙbÙbÙb ÙbÙbþØb÷ØbðØbéØbâØbÛØbÔØbÍØbÆØb¿Øb¸Øb±ØbªØb£ØbœØb•ØbŽØb‡Øb€ØbyØbrØbkØbdØb]ØbVØbOØbHØbAØb:Øb3Øb,Øb%ØbØbØbØb ØbØbû×bô×bí×bæ×bß×bØ×bÑ×bÊ×bÃ×b¼×bµ×b®×b§×b ×b™×b’×b‹×b„×b}×bv×bo×bh×ba×bZ×bS×bL×bE×b>×b7×b0×b)×b"×b×b×b ×b×bÿÖbøÖbñÖbêÖbãÖbÜÖbÕÖbÎÖbÇÖbÀÖb¹Öb²Öb«Öb¤ÖbÖb–ÖbÖbˆÖbÖbzÖbsÖblÖbeÖb^ÖbWÖbPÖbIÖbBÖb;Öb4Öb-Öb&ÖbÖbÖbÖb ÖbÖbüÕbõÕbîÕbçÕbàÕbÙÕbÒÕbËÕbÄÕb½Õb¶Õb¯Õb¨Õb¡ÕbšÕb“ÕbŒÕb…Õb~ÕbwÕbpÕbiÕbbÕb[ÕbTÕbMÕbFÕb?Õb8Õb1Õb*Õb#ÕbÕbÕbÕbÕbÕbùÔbòÔbëÔbäÔbÝÔbÖÔbÏÔbÈÔbÁÔbºÔb³Ôb¬Ôb¥ÔbžÔb—ÔbÔb‰Ôb‚Ôb{ÔbtÔbmÔbfÔb_ÔbXÔbQÔbJÔbCÔb<Ôb5Ôb.Ôb'Ôb ÔbÔbÔb ÔbÔbýÓböÓbïÓbèÓbáÓbÚÓbÓÓbÌÓbÅÓb¾Ób·Ób°Ób©Ób¢Ób›Ób”ÓbÓb†ÓbÓbxÓbqÓbjÓbcÓb\ÓbUÓbNÓbGÓb@Ób9Ób2Ób+Ób$ÓbÓbÓbÓbÓbÓbúÒbóÒbìÒbåÒbÞÒb×ÒbÐÒbÉÒbÂÒb»Òb´Òb­Òb¦ÒbŸÒb˜Òb‘ÒbŠÒbƒÒb|ÒbuÒbnÒbgÒb`ÒbYÒbRÒbKÒbDÒb=Òb6Òb/Òb(Òb!ÒbÒbÒb ÒbÒbþÑb÷ÑbðÑbéÑbâÑbÛÑbÔÑbÍÑbÆÑb¿Ñb¸Ñb±ÑbªÑb£ÑbœÑb•ÑbŽÑb‡Ñb€ÑbyÑbrÑbkÑbdÑb]ÑbVÑbOÑbHÑbAÑb:Ñb3Ñb,Ñb%ÑbÑbÑbÑb ÑbÑbûÐbôÐbíÐbæÐbßÐbØÐbÑÐbÊÐbÃÐb¼ÐbµÐb®Ðb§Ðb Ðb™Ðb’Ðb‹Ðb„Ðb}ÐbvÐboÐbhÐbaÐbZÐbSÐbLÐbEÐb>Ðb7Ðb0Ðb)Ðb"ÐbÐbÐb ÐbÐbÿÏbøÏbñÏbêÏbãÏbÜÏbÕÏbÎÏbÇÏbÀÏb¹Ïb²Ïb«Ïb¤ÏbÏb–ÏbÏbˆÏbÏbzÏbsÏblÏbeÏb^ÏbWÏbPÏbIÏbBÏb;Ïb4Ïb-Ïb&ÏbÏbÏbÏb ÏbÏbüÎbõÎbîÎbçÎbàÎbÙÎbÒÎbËÎbÄÎb½Îb¶Îb¯Îb¨Îb¡ÎbšÎb“ÎbŒÎb…Îb~ÎbwÎbpÎbiÎbbÎb[ÎbTÎbMÎbFÎb?Îb8Îb1Îb*Îb#ÎbÎbÎbÎbÎbÎbùÍbòÍbëÍbäÍbÝÍbÖÍbÏÍbÈÍbÁÍbºÍb³Íb¬Íb¥ÍbžÍb—ÍbÍb‰Íb‚Íb{ÍbtÍbmÍbfÍb_ÍbXÍbQÍbJÍbCÍb<Íb5Íb.Íb'Íb ÍbÍbÍb ÍbÍbýÌböÌbïÌbèÌbáÌbÚÌbÓÌbÌÌbÅÌb¾Ìb·Ìb°Ìb©Ìb¢Ìb›Ìb”ÌbÌb†ÌbÌbxÌbqÌbjÌbcÌb\ÌbUÌbNÌbGÌb@Ìb9Ìb2Ìb+Ìb$ÌbÌbÌbÌbÌbÌbúËbóËbìËbåËbÞËb×ËbÐËbÉËbÂËb»Ëb´Ëb­Ëb¦ËbŸËb˜Ëb‘ËbŠËbƒËb|ËbuËbnËbgËb`ËbYËbRËbKËbDËb=Ëb6Ëb/Ëb(Ëb!ËbËbËb ËbËbþÊb÷ÊbðÊbéÊbâÊbÛÊbÔÊbÍÊbÆÊb¿Êb¸Êb±ÊbªÊb£ÊbœÊb•ÊbŽÊb‡Êb€ÊbyÊbrÊbkÊbdÊb]ÊbVÊbOÊbHÊbAÊb:Êb3Êb,Êb%ÊbÊbÊbÊb ÊbÊbûÉbôÉbíÉbæÉbßÉbØÉbÑÉbÊÉbÃÉb¼ÉbµÉb®Éb§Éb Éb™Éb’Éb‹Éb„Éb}ÉbvÉboÉbhÉbaÉbZÉbSÉbLÉbEÉb>Éb7Éb0Éb)Éb"ÉbÉbÉb ÉbÉbÿÈbøÈbñÈbêÈbãÈbÜÈbÕÈbÎÈbÇÈbÀÈb¹Èb²Èb«Èb¤ÈbÈb–ÈbÈbˆÈbÈbzÈbsÈblÈbeÈb^ÈbWÈbPÈbIÈbBÈb;Èb4Èb-Èb&ÈbÈbÈbÈb ÈbÈbüÇbõÇbîÇbçÇbàÇbÙÇbÒÇbËÇbÄÇb½Çb¶Çb¯Çb¨Çb¡ÇbšÇb“ÇbŒÇb…Çb~ÇbwÇbpÇbiÇbbÇb[ÇbTÇbMÇbFÇb?Çb8Çb1Çb*Çb#ÇbÇbÇbÇbÇbÇbùÆbòÆbëÆbäÆbÝÆbÖÆbÏÆbÈÆbÁÆbºÆb³Æb¬Æb¥ÆbžÆb—ÆbÆb‰Æb‚Æb{ÆbtÆbmÆbfÆb_ÆbXÆbQÆbJÆbCÆb<Æb5Æb.Æb'Æb ÆbÆbÆb ÆbÆbýÅböÅbïÅbèÅbáÅbÚÅbÓÅbÌÅbÅÅb¾Åb·Åb°Åb©Åb¢Åb›Åb”ÅbÅb†ÅbÅbxÅbqÅbjÅbcÅb\ÅbUÅbNÅbGÅb@Åb9Åb2Åb+Åb$ÅbÅbÅbÅbÅbÅbúÄbóÄbìÄbåÄbÞÄb×ÄbÐÄbÉÄbÂÄb»Äb´Äb­Äb¦ÄbŸÄb˜Äb‘ÄbŠÄbƒÄb|ÄbuÄbnÄbgÄb`ÄbYÄbRÄbKÄbDÄb=Äb6Äb/Äb(Äb!ÄbÄbÄb ÄbÄbþÃb÷ÃbðÃbéÃbâÃbÛÃbÔÃbÍÃbÆÃb¿Ãb¸Ãb±ÃbªÃb£ÃbœÃb•ÃbŽÃb‡Ãb€ÃbyÃbrÃbkÃbdÃb]ÃbVÃbOÃbHÃbAÃb:Ãb3Ãb,Ãb%ÃbÃbÃbÃb ÃbÃbûÂbôÂbíÂbæÂbßÂbØÂbÑÂbÊÂbÃÂb¼ÂbµÂb®Âb§Âb Âb™Âb’Âb‹Âb„Âb}ÂbvÂboÂbhÂbaÂbZÂbSÂbLÂbEÂb>Âb7Âb0Âb)Âb"ÂbÂbÂb ÂbÂbÿÁbøÁbñÁbêÁbãÁbÜÁbÕÁbÎÁbÇÁbÀÁb¹Áb²Áb«Áb¤ÁbÁb–ÁbÁbˆÁbÁbzÁbsÁblÁbeÁb^ÁbWÁbPÁbIÁbBÁb;Áb4Áb-Áb&ÁbÁbÁbÁb ÁbÁbüÀbõÀbîÀbçÀbàÀbÙÀbÒÀbËÀbÄÀb½Àb¶Àb¯Àb¨Àb¡ÀbšÀb“ÀbŒÀb…Àb~ÀbwÀbpÀbiÀbbÀb[ÀbTÀbMÀbFÀb?Àb8Àb1Àb*Àb#ÀbÀbÀbÀbÀbÀbù¿bò¿bë¿bä¿bÝ¿bÖ¿bÏ¿bÈ¿bÁ¿bº¿b³¿b¬¿b¥¿bž¿b—¿b¿b‰¿b‚¿b{¿bt¿bm¿bf¿b_¿bX¿bQ¿bJ¿bC¿b<¿b5¿b.¿b'¿b ¿b¿b¿b ¿b¿bý¾bö¾bï¾bè¾bá¾bÚ¾bÓ¾b̾bžb¾¾b·¾b°¾b©¾b¢¾b›¾b”¾b¾b†¾b¾bx¾bq¾bj¾bc¾b\¾bU¾bN¾bG¾b@¾b9¾b2¾b+¾b$¾b¾b¾b¾b¾b¾bú½bó½bì½bå½bÞ½b×½bнbɽb½b»½b´½b­½b¦½bŸ½b˜½b‘½bнbƒ½b|½bu½bn½bg½b`½bY½bR½bK½bD½b=½b6½b/½b(½b!½b½b½b ½b½bþ¼b÷¼bð¼bé¼bâ¼bÛ¼bÔ¼bͼbƼb¿¼b¸¼b±¼bª¼b£¼bœ¼b•¼b޼b‡¼b€¼by¼br¼bk¼bd¼b]¼bV¼bO¼bH¼bA¼b:¼b3¼b,¼b%¼b¼b¼b¼b ¼b¼bû»bô»bí»bæ»bß»bØ»bÑ»bÊ»bûb¼»bµ»b®»b§»b »b™»b’»b‹»b„»b}»bv»bo»bh»ba»bZ»bS»bL»bE»b>»b7»b0»b)»b"»b»b»b »b»bÿºbøºbñºbêºbãºbܺbÕºbκbǺbÀºb¹ºb²ºb«ºb¤ºbºb–ºbºbˆºbºbzºbsºblºbeºb^ºbWºbPºbIºbBºb;ºb4ºb-ºb&ºbºbºbºb ºbºbü¹bõ¹bî¹bç¹bà¹bÙ¹bÒ¹b˹bĹb½¹b¶¹b¯¹b¨¹b¡¹bš¹b“¹bŒ¹b…¹b~¹bw¹bp¹bi¹bb¹b[¹bT¹bM¹bF¹b?¹b8¹b1¹b*¹b#¹b¹b¹b¹b¹b¹bù¸bò¸bë¸bä¸bݸbÖ¸bϸbȸbÁ¸bº¸b³¸b¬¸b¥¸bž¸b—¸b¸b‰¸b‚¸b{¸bt¸bm¸bf¸b_¸bX¸bQ¸bJ¸bC¸b<¸b5¸b.¸b'¸b ¸b¸b¸b ¸b¸bý·bö·bï·bè·bá·bÚ·bÓ·bÌ·bÅ·b¾·b··b°·b©·b¢·b›·b”·b·b†·b·bx·bq·bj·bc·b\·bU·bN·bG·b@·b9·b2·b+·b$·b·b·b·b·b·bú¶bó¶bì¶bå¶bÞ¶b×¶bжbɶb¶b»¶b´¶b­¶b¦¶bŸ¶b˜¶b‘¶bжbƒ¶b|¶bu¶bn¶bg¶b`¶bY¶bR¶bK¶bD¶b=¶b6¶b/¶b(¶b!¶b¶b¶b ¶b¶bþµb÷µbðµbéµbâµbÛµbÔµb͵bƵb¿µb¸µb±µbªµb£µbœµb•µb޵b‡µb€µbyµbrµbkµbdµb]µbVµbOµbHµbAµb:µb3µb,µb%µbµbµbµb µbµbû´bô´bí´bæ´bß´bØ´bÑ´bÊ´bôb¼´bµ´b®´b§´b ´b™´b’´b‹´b„´b}´bv´bo´bh´ba´bZ´bS´bL´bE´b>´b7´b0´b)´b"´b´b´b ´b´bÿ³bø³bñ³bê³bã³bܳbÕ³bγbdzbÀ³b¹³b²³b«³b¤³b³b–³b³bˆ³b³bz³bs³bl³be³b^³bW³bP³bI³bB³b;³b4³b-³b&³b³b³b³b ³b³bü²bõ²bî²bç²bà²bÙ²bÒ²b˲bIJb½²b¶²b¯²b¨²b¡²bš²b“²bŒ²b…²b~²bw²bp²bi²bb²b[²bT²bM²bF²b?²b8²b1²b*²b#²b²b²b²b²b²bù±bò±bë±bä±bݱbÖ±bϱbȱbÁ±bº±b³±b¬±b¥±bž±b—±b±b‰±b‚±b{±bt±bm±bf±b_±bX±bQ±bJ±bC±b<±b5±b.±b'±b ±b±b±b ±b±bý°bö°bï°bè°bá°bÚ°bÓ°b̰bŰb¾°b·°b°°b©°b¢°b›°b”°b°b†°b°bx°bq°bj°bc°b\°bU°bN°bG°b@°b9°b2°b+°b$°b°b°b°b°b°bú¯bó¯bì¯bå¯bÞ¯bׯbЯbɯb¯b»¯b´¯b­¯b¦¯bŸ¯b˜¯b‘¯bНbƒ¯b|¯bu¯bn¯bg¯b`¯bY¯bR¯bK¯bD¯b=¯b6¯b/¯b(¯b!¯b¯b¯b ¯b¯bþ®b÷®bð®bé®bâ®bÛ®bÔ®bÍ®bÆ®b¿®b¸®b±®bª®b£®bœ®b•®bŽ®b‡®b€®by®br®bk®bd®b]®bV®bO®bH®bA®b:®b3®b,®b%®b®b®b®b ®b®bû­bô­bí­bæ­bß­bØ­bÑ­bÊ­bíb¼­bµ­b®­b§­b ­b™­b’­b‹­b„­b}­bv­bo­bh­ba­bZ­bS­bL­bE­b>­b7­b0­b)­b"­b­b­b ­b­bÿ¬bø¬bñ¬bê¬bã¬bܬbÕ¬bάbǬbÀ¬b¹¬b²¬b«¬b¤¬b¬b–¬b¬bˆ¬b¬bz¬bs¬bl¬be¬b^¬bW¬bP¬bI¬bB¬b;¬b4¬b-¬b&¬b¬b¬b¬b ¬b¬bü«bõ«bî«bç«bà«bÙ«bÒ«bË«bÄ«b½«b¶«b¯«b¨«b¡«bš«b“«bŒ«b…«b~«bw«bp«bi«bb«b[«bT«bM«bF«b?«b8«b1«b*«b#«b«b«b«b«b«bùªbòªbëªbäªbݪbÖªbϪbȪbÁªbºªb³ªb¬ªb¥ªbžªb—ªbªb‰ªb‚ªb{ªbtªbmªbfªb_ªbXªbQªbJªbCªb<ªb5ªb.ªb'ªb ªbªbªb ªbªbý©bö©bï©bè©bá©bÚ©bÓ©bÌ©bÅ©b¾©b·©b°©b©©b¢©b›©b”©b©b†©b©bx©bq©bj©bc©b\©bU©bN©bG©b@©b9©b2©b+©b$©b©b©b©b©b©bú¨bó¨bì¨bå¨bÞ¨bרbШbɨb¨b»¨b´¨b­¨b¦¨bŸ¨b˜¨b‘¨bЍbƒ¨b|¨bu¨bn¨bg¨b`¨bY¨bR¨bK¨bD¨b=¨b6¨b/¨b(¨b!¨b¨b¨b ¨b¨bþ§b÷§bð§bé§bâ§bÛ§bÔ§bͧbƧb¿§b¸§b±§bª§b£§bœ§b•§bާb‡§b€§by§br§bk§bd§b]§bV§bO§bH§bA§b:§b3§b,§b%§b§b§b§b §b§bû¦bô¦bí¦bæ¦bߦbئbѦbʦbæb¼¦bµ¦b®¦b§¦b ¦b™¦b’¦b‹¦b„¦b}¦bv¦bo¦bh¦ba¦bZ¦bS¦bL¦bE¦b>¦b7¦b0¦b)¦b"¦b¦b¦b ¦b¦bÿ¥bø¥bñ¥bê¥bã¥bÜ¥bÕ¥bÎ¥bÇ¥bÀ¥b¹¥b²¥b«¥b¤¥b¥b–¥b¥bˆ¥b¥bz¥bs¥bl¥be¥b^¥bW¥bP¥bI¥bB¥b;¥b4¥b-¥b&¥b¥b¥b¥b ¥b¥bü¤bõ¤bî¤bç¤bà¤bÙ¤bÒ¤bˤbĤb½¤b¶¤b¯¤b¨¤b¡¤bš¤b“¤bŒ¤b…¤b~¤bw¤bp¤bi¤bb¤b[¤bT¤bM¤bF¤b?¤b8¤b1¤b*¤b#¤b¤b¤b¤b¤b¤bù£bò£bë£bä£bÝ£bÖ£bÏ£bÈ£bÁ£bº£b³£b¬£b¥£bž£b—£b£b‰£b‚£b{£bt£bm£bf£b_£bX£bQ£bJ£bC£b<£b5£b.£b'£b £b£b£b £b£bý¢bö¢bï¢bè¢bá¢bÚ¢bÓ¢bÌ¢bÅ¢b¾¢b·¢b°¢b©¢b¢¢b›¢b”¢b¢b†¢b¢bx¢bq¢bj¢bc¢b\¢bU¢bN¢bG¢b@¢b9¢b2¢b+¢b$¢b¢b¢b¢b¢b¢bú¡bó¡bì¡bå¡bÞ¡bסbСbÉ¡b¡b»¡b´¡b­¡b¦¡bŸ¡b˜¡b‘¡bŠ¡bƒ¡b|¡bu¡bn¡bg¡b`¡bY¡bR¡bK¡bD¡b=¡b6¡b/¡b(¡b!¡b¡b¡b ¡b¡bþ b÷ bð bé bâ bÛ bÔ bÍ bÆ b¿ b¸ b± bª b£ bœ b• bŽ b‡ b€ by br bk bd b] bV bO bH bA b: b3 b, b% b b b b  b bûŸbôŸbíŸbæŸbߟbØŸbÑŸbÊŸbßb¼ŸbµŸb®Ÿb§Ÿb Ÿb™Ÿb’Ÿb‹Ÿb„Ÿb}ŸbvŸboŸbhŸbaŸbZŸbSŸbLŸbEŸb>Ÿb7Ÿb0Ÿb)Ÿb"ŸbŸbŸb ŸbŸbÿžbøžbñžbêžbãžbÜžbÕžbΞbÇžbÀžb¹žb²žb«žb¤žbžb–žbžbˆžbžbzžbsžblžbežb^žbWžbPžbIžbBžb;žb4žb-žb&žbžbžbžb žbžbübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùœbòœbëœbäœbÝœbÖœbÏœbÈœbÁœbºœb³œb¬œb¥œbžœb—œbœb‰œb‚œb{œbtœbmœbfœb_œbXœbQœbJœbCœb<œb5œb.œb'œb œbœbœb œbœbý›bö›bï›bè›bá›bÚ›bÓ›bÌ›bÅ›b¾›b·›b°›b©›b¢›b››b”›b›b†›b›bx›bq›bj›bc›b\›bU›bN›bG›b@›b9›b2›b+›b$›b›b›b›b›b›búšbóšbìšbåšbÞšbךbКbÉšbšb»šb´šb­šb¦šbŸšb˜šb‘šbŠšbƒšb|šbušbnšbgšb`šbYšbRšbKšbDšb=šb6šb/šb(šb!šbšbšb šbšbþ™b÷™bð™bé™bâ™bÛ™bÔ™bÍ™bÆ™b¿™b¸™b±™bª™b£™bœ™b•™bŽ™b‡™b€™by™br™bk™bd™b]™bV™bO™bH™bA™b:™b3™b,™b%™b™b™b™b ™b™bû˜bô˜bí˜bæ˜bߘbؘbјbʘbØb¼˜bµ˜b®˜b§˜b ˜b™˜b’˜b‹˜b„˜b}˜bv˜bo˜bh˜ba˜bZ˜bS˜bL˜bE˜b>˜b7˜b0˜b)˜b"˜b˜b˜b ˜b˜bÿ—bø—bñ—bê—bã—bÜ—bÕ—bΗbÇ—bÀ—b¹—b²—b«—b¤—b—b–—b—bˆ—b—bz—bs—bl—be—b^—bW—bP—bI—bB—b;—b4—b-—b&—b—b—b—b —b—bü–bõ–bî–bç–bà–bÙ–bÒ–bË–bÄ–b½–b¶–b¯–b¨–b¡–bš–b“–bŒ–b…–b~–bw–bp–bi–bb–b[–bT–bM–bF–b?–b8–b1–b*–b#–b–b–b–b–b–bù•bò•bë•bä•bÝ•bÖ•bÏ•bÈ•bÁ•bº•b³•b¬•b¥•bž•b—•b•b‰•b‚•b{•bt•bm•bf•b_•bX•bQ•bJ•bC•b<•b5•b.•b'•b •b•b•b •b•bý”bö”bï”bè”bá”bÚ”bÓ”bÌ”bÅ”b¾”b·”b°”b©”b¢”b›”b””b”b†”b”bx”bq”bj”bc”b\”bU”bN”bG”b@”b9”b2”b+”b$”b”b”b”b”b”bú“bó“bì“bå“bÞ“bדbГbÉ“b“b»“b´“b­“b¦“bŸ“b˜“b‘“bŠ“bƒ“b|“bu“bn“bg“b`“bY“bR“bK“bD“b=“b6“b/“b(“b!“b“b“b “b“bþ’b÷’bð’bé’bâ’bÛ’bÔ’bÍ’bÆ’b¿’b¸’b±’bª’b£’bœ’b•’bŽ’b‡’b€’by’br’bk’bd’b]’bV’bO’bH’bA’b:’b3’b,’b%’b’b’b’b ’b’bû‘bô‘bí‘bæ‘bß‘bØ‘bÑ‘bÊ‘bÑb¼‘bµ‘b®‘b§‘b ‘b™‘b’‘b‹‘b„‘b}‘bv‘bo‘bh‘ba‘bZ‘bS‘bL‘bE‘b>‘b7‘b0‘b)‘b"‘b‘b‘b ‘b‘bÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùŽbòŽbëŽbäŽbÝŽbÖŽbÏŽbÈŽbÁŽbºŽb³Žb¬Žb¥ŽbžŽb—ŽbŽb‰Žb‚Žb{ŽbtŽbmŽbfŽb_ŽbXŽbQŽbJŽbCŽb<Žb5Žb.Žb'Žb ŽbŽbŽb ŽbŽbýböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúŒbóŒbìŒbåŒbÞŒb׌bÐŒbÉŒbÂŒb»Œb´Œb­Œb¦ŒbŸŒb˜Œb‘ŒbŠŒbƒŒb|ŒbuŒbnŒbgŒb`ŒbYŒbRŒbKŒbDŒb=Œb6Œb/Œb(Œb!ŒbŒbŒb ŒbŒbþ‹b÷‹bð‹bé‹bâ‹bÛ‹bÔ‹bÍ‹bÆ‹b¿‹b¸‹b±‹bª‹b£‹bœ‹b•‹bŽ‹b‡‹b€‹by‹br‹bk‹bd‹b]‹bV‹bO‹bH‹bA‹b:‹b3‹b,‹b%‹b‹b‹b‹b ‹b‹bûŠbôŠbíŠbæŠbߊbØŠbÑŠbÊŠbÊb¼ŠbµŠb®Šb§Šb Šb™Šb’Šb‹Šb„Šb}ŠbvŠboŠbhŠbaŠbZŠbSŠbLŠbEŠb>Šb7Šb0Šb)Šb"ŠbŠbŠb ŠbŠbÿ‰bø‰bñ‰bê‰bã‰b܉bÕ‰bΉbljbÀ‰b¹‰b²‰b«‰b¤‰b‰b–‰b‰bˆ‰b‰bz‰bs‰bl‰be‰b^‰bW‰bP‰bI‰bB‰b;‰b4‰b-‰b&‰b‰b‰b‰b ‰b‰büˆbõˆbîˆbçˆbàˆbÙˆbÒˆbˈbĈb½ˆb¶ˆb¯ˆb¨ˆb¡ˆbšˆb“ˆbŒˆb…ˆb~ˆbwˆbpˆbiˆbbˆb[ˆbTˆbMˆbFˆb?ˆb8ˆb1ˆb*ˆb#ˆbˆbˆbˆbˆbˆbù‡bò‡bë‡bä‡b݇bÖ‡bχbȇbÁ‡bº‡b³‡b¬‡b¥‡bž‡b—‡b‡b‰‡b‚‡b{‡bt‡bm‡bf‡b_‡bX‡bQ‡bJ‡bC‡b<‡b5‡b.‡b'‡b ‡b‡b‡b ‡b‡bý†bö†bï†bè†bá†bÚ†bÓ†b̆bņb¾†b·†b°†b©†b¢†b›†b”†b†b††b†bx†bq†bj†bc†b\†bU†bN†bG†b@†b9†b2†b+†b$†b†b†b†b†b†bú…bó…bì…bå…bÞ…b×…bÐ…bÉ…bÂ…b»…b´…b­…b¦…bŸ…b˜…b‘…bŠ…bƒ…b|…bu…bn…bg…b`…bY…bR…bK…bD…b=…b6…b/…b(…b!…b…b…b …b…bþ„b÷„bð„bé„bâ„bÛ„bÔ„bÍ„bÆ„b¿„b¸„b±„bª„b£„bœ„b•„bŽ„b‡„b€„by„br„bk„bd„b]„bV„bO„bH„bA„b:„b3„b,„b%„b„b„b„b „b„bûƒbôƒbíƒbæƒb߃b؃bуbʃbÃb¼ƒbµƒb®ƒb§ƒb ƒb™ƒb’ƒb‹ƒb„ƒb}ƒbvƒboƒbhƒbaƒbZƒbSƒbLƒbEƒb>ƒb7ƒb0ƒb)ƒb"ƒbƒbƒb ƒbƒbÿ‚bø‚bñ‚bê‚bã‚bÜ‚bÕ‚b΂bÇ‚bÀ‚b¹‚b²‚b«‚b¤‚b‚b–‚b‚bˆ‚b‚bz‚bs‚bl‚be‚b^‚bW‚bP‚bI‚bB‚b;‚b4‚b-‚b&‚b‚b‚b‚b ‚b‚bübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbù€bò€bë€bä€bÝ€bÖ€bÏ€bÈ€bÁ€bº€b³€b¬€b¥€bž€b—€b€b‰€b‚€b{€bt€bm€bf€b_€bX€bQ€bJ€bC€b<€b5€b.€b'€b €b€b€b €b€býböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbú~bó~bì~bå~bÞ~b×~bÐ~bÉ~bÂ~b»~b´~b­~b¦~bŸ~b˜~b‘~bŠ~bƒ~b|~bu~bn~bg~b`~bY~bR~bK~bD~b=~b6~b/~b(~b!~b~b~b ~b~bþ}b÷}bð}bé}bâ}bÛ}bÔ}bÍ}bÆ}b¿}b¸}b±}bª}b£}bœ}b•}bŽ}b‡}b€}by}br}bk}bd}b]}bV}bO}bH}bA}b:}b3}b,}b%}b}b}b}b }b}bû|bô|bí|bæ|bß|bØ|bÑ|bÊ|bÃ|b¼|bµ|b®|b§|b |b™|b’|b‹|b„|b}|bv|bo|bh|ba|bZ|bS|bL|bE|b>|b7|b0|b)|b"|b|b|b |b|bÿ{bø{bñ{bê{bã{bÜ{bÕ{bÎ{bÇ{bÀ{b¹{b²{b«{b¤{b{b–{b{bˆ{b{bz{bs{bl{be{b^{bW{bP{bI{bB{b;{b4{b-{b&{b{b{b{b {b{büzbõzbîzbçzbàzbÙzbÒzbËzbÄzb½zb¶zb¯zb¨zb¡zbšzb“zbŒzb…zb~zbwzbpzbizbbzb[zbTzbMzbFzb?zb8zb1zb*zb#zbzbzbzbzbzbùybòybëybäybÝybÖybÏybÈybÁybºyb³yb¬yb¥ybžyb—ybyb‰yb‚yb{ybtybmybfyb_ybXybQybJybCybub7ub0ub)ub"ububub ububÿtbøtbñtbêtbãtbÜtbÕtbÎtbÇtbÀtb¹tb²tb«tb¤tbtb–tbtbˆtbtbztbstbltbetb^tbWtbPtbItbBtb;tb4tb-tb&tbtbtbtb tbtbüsbõsbîsbçsbàsbÙsbÒsbËsbÄsb½sb¶sb¯sb¨sb¡sbšsb“sbŒsb…sb~sbwsbpsbisbbsb[sbTsbMsbFsb?sb8sb1sb*sb#sbsbsbsbsbsbùrbòrbërbärbÝrbÖrbÏrbÈrbÁrbºrb³rb¬rb¥rbžrb—rbrb‰rb‚rb{rbtrbmrbfrb_rbXrbQrbJrbCrbnb7nb0nb)nb"nbnbnb nbnbÿmbømbñmbêmbãmbÜmbÕmbÎmbÇmbÀmb¹mb²mb«mb¤mbmb–mbmbˆmbmbzmbsmblmbemb^mbWmbPmbImbBmb;mb4mb-mb&mbmbmbmb mbmbülbõlbîlbçlbàlbÙlbÒlbËlbÄlb½lb¶lb¯lb¨lb¡lbšlb“lbŒlb…lb~lbwlbplbilbblb[lbTlbMlbFlb?lb8lb1lb*lb#lblblblblblbùkbòkbëkbäkbÝkbÖkbÏkbÈkbÁkbºkb³kb¬kb¥kbžkb—kbkb‰kb‚kb{kbtkbmkbfkb_kbXkbQkbJkbCkbgb7gb0gb)gb"gbgbgb gbgbÿfbøfbñfbêfbãfbÜfbÕfbÎfbÇfbÀfb¹fb²fb«fb¤fbfb–fbfbˆfbfbzfbsfblfbefb^fbWfbPfbIfbBfb;fb4fb-fb&fbfbfbfb fbfbüebõebîebçebàebÙebÒebËebÄeb½eb¶eb¯eb¨eb¡ebšeb“ebŒeb…eb~ebwebpebiebbeb[ebTebMebFeb?eb8eb1eb*eb#ebebebebebebùdbòdbëdbädbÝdbÖdbÏdbÈdbÁdbºdb³db¬db¥dbždb—dbdb‰db‚db{dbtdbmdbfdb_dbXdbQdbJdbCdb`b7`b0`b)`b"`b`b`b `b`bÿ_bø_bñ_bê_bã_bÜ_bÕ_bÎ_bÇ_bÀ_b¹_b²_b«_b¤_b_b–_b_bˆ_b_bz_bs_bl_be_b^_bW_bP_bI_bB_b;_b4_b-_b&_b_b_b_b _b_bü^bõ^bî^bç^bà^bÙ^bÒ^bË^bÄ^b½^b¶^b¯^b¨^b¡^bš^b“^bŒ^b…^b~^bw^bp^bi^bb^b[^bT^bM^bF^b?^b8^b1^b*^b#^b^b^b^b^b^bù]bò]bë]bä]bÝ]bÖ]bÏ]bÈ]bÁ]bº]b³]b¬]b¥]bž]b—]b]b‰]b‚]b{]bt]bm]bf]b_]bX]bQ]bJ]bC]b<]b5]b.]b']b ]b]b]b ]b]bý\bö\bï\bè\bá\bÚ\bÓ\bÌ\bÅ\b¾\b·\b°\b©\b¢\b›\b”\b\b†\b\bx\bq\bj\bc\b\\bU\bN\bG\b@\b9\b2\b+\b$\b\b\b\b\b\bú[bó[bì[bå[bÞ[b×[bÐ[bÉ[bÂ[b»[b´[b­[b¦[bŸ[b˜[b‘[bŠ[bƒ[b|[bu[bn[bg[b`[bY[bR[bK[bD[b=[b6[b/[b([b![b[b[b [b[bþZb÷ZbðZbéZbâZbÛZbÔZbÍZbÆZb¿Zb¸Zb±ZbªZb£ZbœZb•ZbŽZb‡Zb€ZbyZbrZbkZbdZb]ZbVZbOZbHZbAZb:Zb3Zb,Zb%ZbZbZbZb ZbZbûYbôYbíYbæYbßYbØYbÑYbÊYbÃYb¼YbµYb®Yb§Yb Yb™Yb’Yb‹Yb„Yb}YbvYboYbhYbaYbZYbSYbLYbEYb>Yb7Yb0Yb)Yb"YbYbYb YbYbÿXbøXbñXbêXbãXbÜXbÕXbÎXbÇXbÀXb¹Xb²Xb«Xb¤XbXb–XbXbˆXbXbzXbsXblXbeXb^XbWXbPXbIXbBXb;Xb4Xb-Xb&XbXbXbXb XbXbüWbõWbîWbçWbàWbÙWbÒWbËWbÄWb½Wb¶Wb¯Wb¨Wb¡WbšWb“WbŒWb…Wb~WbwWbpWbiWbbWb[WbTWbMWbFWb?Wb8Wb1Wb*Wb#WbWbWbWbWbWbùVbòVbëVbäVbÝVbÖVbÏVbÈVbÁVbºVb³Vb¬Vb¥VbžVb—VbVb‰Vb‚Vb{VbtVbmVbfVb_VbXVbQVbJVbCVbRb7Rb0Rb)Rb"RbRbRb RbRbÿQbøQbñQbêQbãQbÜQbÕQbÎQbÇQbÀQb¹Qb²Qb«Qb¤QbQb–QbQbˆQbQbzQbsQblQbeQb^QbWQbPQbIQbBQb;Qb4Qb-Qb&QbQbQbQb QbQbüPbõPbîPbçPbàPbÙPbÒPbËPbÄPb½Pb¶Pb¯Pb¨Pb¡PbšPb“PbŒPb…Pb~PbwPbpPbiPbbPb[PbTPbMPbFPb?Pb8Pb1Pb*Pb#PbPbPbPbPbPbùObòObëObäObÝObÖObÏObÈObÁObºOb³Ob¬Ob¥ObžOb—ObOb‰Ob‚Ob{ObtObmObfOb_ObXObQObJObCObKb7Kb0Kb)Kb"KbKbKb KbKbÿJbøJbñJbêJbãJbÜJbÕJbÎJbÇJbÀJb¹Jb²Jb«Jb¤JbJb–JbJbˆJbJbzJbsJblJbeJb^JbWJbPJbIJbBJb;Jb4Jb-Jb&JbJbJbJb JbJbüIbõIbîIbçIbàIbÙIbÒIbËIbÄIb½Ib¶Ib¯Ib¨Ib¡IbšIb“IbŒIb…Ib~IbwIbpIbiIbbIb[IbTIbMIbFIb?Ib8Ib1Ib*Ib#IbIbIbIbIbIbùHbòHbëHbäHbÝHbÖHbÏHbÈHbÁHbºHb³Hb¬Hb¥HbžHb—HbHb‰Hb‚Hb{HbtHbmHbfHb_HbXHbQHbJHbCHbDb7Db0Db)Db"DbDbDb DbDbÿCbøCbñCbêCbãCbÜCbÕCbÎCbÇCbÀCb¹Cb²Cb«Cb¤CbCb–CbCbˆCbCbzCbsCblCbeCb^CbWCbPCbICbBCb;Cb4Cb-Cb&CbCbCbCb CbCbüBbõBbîBbçBbàBbÙBbÒBbËBbÄBb½Bb¶Bb¯Bb¨Bb¡BbšBb“BbŒBb…Bb~BbwBbpBbiBbbBb[BbTBbMBbFBb?Bb8Bb1Bb*Bb#BbBbBbBbBbBbùAbòAbëAbäAbÝAbÖAbÏAbÈAbÁAbºAb³Ab¬Ab¥AbžAb—AbAb‰Ab‚Ab{AbtAbmAbfAb_AbXAbQAbJAbCAbb÷>bð>bé>bâ>bÛ>bÔ>bÍ>bÆ>b¿>b¸>b±>bª>b£>bœ>b•>bŽ>b‡>b€>by>br>bk>bd>b]>bV>bO>bH>bA>b:>b3>b,>b%>b>b>b>b >b>bû=bô=bí=bæ=bß=bØ=bÑ=bÊ=bÃ=b¼=bµ=b®=b§=b =b™=b’=b‹=b„=b}=bv=bo=bh=ba=bZ=bS=bL=bE=b>=b7=b0=b)=b"=b=b=b =b=bÿ6b76b06b)6b"6b6b6b 6b6bÿ5bø5bñ5bê5bã5bÜ5bÕ5bÎ5bÇ5bÀ5b¹5b²5b«5b¤5b5b–5b5bˆ5b5bz5bs5bl5be5b^5bW5bP5bI5bB5b;5b45b-5b&5b5b5b5b 5b5bü4bõ4bî4bç4bà4bÙ4bÒ4bË4bÄ4b½4b¶4b¯4b¨4b¡4bš4b“4bŒ4b…4b~4bw4bp4bi4bb4b[4bT4bM4bF4b?4b84b14b*4b#4b4b4b4b4b4bù3bò3bë3bä3bÝ3bÖ3bÏ3bÈ3bÁ3bº3b³3b¬3b¥3bž3b—3b3b‰3b‚3b{3bt3bm3bf3b_3bX3bQ3bJ3bC3b<3b53b.3b'3b 3b3b3b 3b3bý2bö2bï2bè2bá2bÚ2bÓ2bÌ2bÅ2b¾2b·2b°2b©2b¢2b›2b”2b2b†2b2bx2bq2bj2bc2b\2bU2bN2bG2b@2b92b22b+2b$2b2b2b2b2b2bú1bó1bì1bå1bÞ1b×1bÐ1bÉ1bÂ1b»1b´1b­1b¦1bŸ1b˜1b‘1bŠ1bƒ1b|1bu1bn1bg1b`1bY1bR1bK1bD1b=1b61b/1b(1b!1b1b1b 1b1bþ0b÷0bð0bé0bâ0bÛ0bÔ0bÍ0bÆ0b¿0b¸0b±0bª0b£0bœ0b•0bŽ0b‡0b€0by0br0bk0bd0b]0bV0bO0bH0bA0b:0b30b,0b%0b0b0b0b 0b0bû/bô/bí/bæ/bß/bØ/bÑ/bÊ/bÃ/b¼/bµ/b®/b§/b /b™/b’/b‹/b„/b}/bv/bo/bh/ba/bZ/bS/bL/bE/b>/b7/b0/b)/b"/b/b/b /b/bÿ.bø.bñ.bê.bã.bÜ.bÕ.bÎ.bÇ.bÀ.b¹.b².b«.b¤.b.b–.b.bˆ.b.bz.bs.bl.be.b^.bW.bP.bI.bB.b;.b4.b-.b&.b.b.b.b .b.bü-bõ-bî-bç-bà-bÙ-bÒ-bË-bÄ-b½-b¶-b¯-b¨-b¡-bš-b“-bŒ-b…-b~-bw-bp-bi-bb-b[-bT-bM-bF-b?-b8-b1-b*-b#-b-b-b-b-b-bù,bò,bë,bä,bÝ,bÖ,bÏ,bÈ,bÁ,bº,b³,b¬,b¥,bž,b—,b,b‰,b‚,b{,bt,bm,bf,b_,bX,bQ,bJ,bC,b<,b5,b.,b',b ,b,b,b ,b,bý+bö+bï+bè+bá+bÚ+bÓ+bÌ+bÅ+b¾+b·+b°+b©+b¢+b›+b”+b+b†+b+bx+bq+bj+bc+b\+bU+bN+bG+b@+b9+b2+b++b$+b+b+b+b+b+bú*bó*bì*bå*bÞ*b×*bÐ*bÉ*bÂ*b»*b´*b­*b¦*bŸ*b˜*b‘*bŠ*bƒ*b|*bu*bn*bg*b`*bY*bR*bK*bD*b=*b6*b/*b(*b!*b*b*b *b*bþ)b÷)bð)bé)bâ)bÛ)bÔ)bÍ)bÆ)b¿)b¸)b±)bª)b£)bœ)b•)bŽ)b‡)b€)by)br)bk)bd)b])bV)bO)bH)bA)b:)b3)b,)b%)b)b)b)b )b)bû(bô(bí(bæ(bß(bØ(bÑ(bÊ(bÃ(b¼(bµ(b®(b§(b (b™(b’(b‹(b„(b}(bv(bo(bh(ba(bZ(bS(bL(bE(b>(b7(b0(b)(b"(b(b(b (b(bÿ'bø'bñ'bê'bã'bÜ'bÕ'bÎ'bÇ'bÀ'b¹'b²'b«'b¤'b'b–'b'bˆ'b'bz'bs'bl'be'b^'bW'bP'bI'bB'b;'b4'b-'b&'b'b'b'b 'b'bü&bõ&bî&bç&bà&bÙ&bÒ&bË&bÄ&b½&b¶&b¯&b¨&b¡&bš&b“&bŒ&b…&b~&bw&bp&bi&bb&b[&bT&bM&bF&b?&b8&b1&b*&b#&b&b&b&b&b&bù%bò%bë%bä%bÝ%bÖ%bÏ%bÈ%bÁ%bº%b³%b¬%b¥%bž%b—%b%b‰%b‚%b{%bt%bm%bf%b_%bX%bQ%bJ%bC%b<%b5%b.%b'%b %b%b%b %b%bý$bö$bï$bè$bá$bÚ$bÓ$bÌ$bÅ$b¾$b·$b°$b©$b¢$b›$b”$b$b†$b$bx$bq$bj$bc$b\$bU$bN$bG$b@$b9$b2$b+$b$$b$b$b$b$b$bú#bó#bì#bå#bÞ#b×#bÐ#bÉ#bÂ#b»#b´#b­#b¦#bŸ#b˜#b‘#bŠ#bƒ#b|#bu#bn#bg#b`#bY#bR#bK#bD#b=#b6#b/#b(#b!#b#b#b #b#bþ"b÷"bð"bé"bâ"bÛ"bÔ"bÍ"bÆ"b¿"b¸"b±"bª"b£"bœ"b•"bŽ"b‡"b€"by"br"bk"bd"b]"bV"bO"bH"bA"b:"b3"b,"b%"b"b"b"b "b"bû!bô!bí!bæ!bß!bØ!bÑ!bÊ!bÃ!b¼!bµ!b®!b§!b !b™!b’!b‹!b„!b}!bv!bo!bh!ba!bZ!bS!bL!bE!b>!b7!b0!b)!b"!b!b!b !b!bÿ bø bñ bê bã bÜ bÕ bÎ bÇ bÀ b¹ b² b« b¤ b b– b bˆ b bz bs bl be b^ bW bP bI bB b; b4 b- b& b b b b b bübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbýböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúbóbìbåbÞb×bÐbÉbÂb»b´b­b¦bŸb˜b‘bŠbƒb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbþb÷bðbébâbÛbÔbÍbÆb¿b¸b±bªb£bœb•bŽb‡b€bybrbkbdb]bVbObHbAb:b3b,b%bbbb bbûbôbíbæbßbØbÑbÊbÃb¼bµb®b§b b™b’b‹b„b}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbýböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúbóbìbåbÞb×bÐbÉbÂb»b´b­b¦bŸb˜b‘bŠbƒb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbþb÷bðbébâbÛbÔbÍbÆb¿b¸b±bªb£bœb•bŽb‡b€bybrbkbdb]bVbObHbAb:b3b,b%bbbb bbûbôbíbæbßbØbÑbÊbÃb¼bµb®b§b b™b’b‹b„b}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbýböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúbóbìbåbÞb×bÐbÉbÂb»b´b­b¦bŸb˜b‘bŠbƒb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbþ b÷ bð bé bâ bÛ bÔ bÍ bÆ b¿ b¸ b± bª b£ bœ b• bŽ b‡ b€ by br bk bd b] bV bO bH bA b: b3 b, b% b b b b b bû bô bí bæ bß bØ bÑ bÊ bà b¼ bµ b® b§ b  b™ b’ b‹ b„ b} bv bo bh ba bZ bS bL bE b> b7 b0 b) b" b b b b bÿ bø bñ bê bã bÜ bÕ bÎ bÇ bÀ b¹ b² b« b¤ b b– b bˆ b bz bs bl be b^ bW bP bI bB b; b4 b- b& b b b b b bü bõ bî bç bà bÙ bÒ bË bÄ b½ b¶ b¯ b¨ b¡ bš b“ bŒ b… b~ bw bp bi bb b[ bT bM bF b? b8 b1 b* b# b b b b b bù bò bë bä bÝ bÖ bÏ bÈ bÁ bº b³ b¬ b¥ bž b— b b‰ b‚ b{ bt bm bf b_ bX bQ bJ bC b< b5 b. b' b b b b b býböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúbóbìbåbÞb×bÐbÉbÂb»b´b­b¦bŸb˜b‘bŠbƒb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbþb÷bðbébâbÛbÔbÍbÆb¿b¸b±bªb£bœb•bŽb‡b€bybrbkbdb]bVbObHbAb:b3b,b%bbbb bbûbôbíbæbßbØbÑbÊbÃb¼bµb®b§b b™b’b‹b„b}bvbobhbabZbSbLbEb>b7b0b)b"bbb bbÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb<b5b.b'b bbb bbýböbïbèbábÚbÓbÌbÅb¾b·b°b©b¢b›b”bb†bbxbqbjbcb\bUbNbGb@b9b2b+b$bbbbbbúbóbìbåbÞb×bÐbÉbÂb»b´b­b¦bŸb˜b‘bŠbƒb|bubnbgb`bYbRbKbDb=b6b/b(b!bbb bbþÿa÷ÿaðÿaéÿaâÿaÛÿaÔÿaÍÿaÆÿa¿ÿa¸ÿa±ÿaªÿa£ÿaœÿa•ÿaŽÿa‡ÿa€ÿayÿarÿakÿadÿa]ÿaVÿaOÿaHÿaAÿa:ÿa3ÿa,ÿa%ÿaÿaÿaÿa ÿaÿaûþaôþaíþaæþaßþaØþaÑþaÊþaÃþa¼þaµþa®þa§þa þa™þa’þa‹þa„þa}þavþaoþahþaaþaZþaSþaLþaEþa>þa7þa0þa)þa"þaþaþa þaþaÿýaøýañýaêýaãýaÜýaÕýaÎýaÇýaÀýa¹ýa²ýa«ýa¤ýaýa–ýaýaˆýaýazýasýalýaeýa^ýaWýaPýaIýaBýa;ýa4ýa-ýa&ýaýaýaýa ýaýaüüaõüaîüaçüaàüaÙüaÒüaËüaÄüa½üa¶üa¯üa¨üa¡üašüa“üaŒüa…üa~üawüapüaiüabüa[üaTüaMüaFüa?üa8üa1üa*üa#üaüaüaüaüaüaùûaòûaëûaäûaÝûaÖûaÏûaÈûaÁûaºûa³ûa¬ûa¥ûažûa—ûaûa‰ûa‚ûa{ûatûamûafûa_ûaXûaQûaJûaCûa<ûa5ûa.ûa'ûa ûaûaûa ûaûaýúaöúaïúaèúaáúaÚúaÓúaÌúaÅúa¾úa·úa°úa©úa¢úa›úa”úaúa†úaúaxúaqúajúacúa\úaUúaNúaGúa@úa9úa2úa+úa$úaúaúaúaúaúaúùaóùaìùaåùaÞùa×ùaÐùaÉùaÂùa»ùa´ùa­ùa¦ùaŸùa˜ùa‘ùaŠùaƒùa|ùauùanùagùa`ùaYùaRùaKùaDùa=ùa6ùa/ùa(ùa!ùaùaùa ùaùaþøa÷øaðøaéøaâøaÛøaÔøaÍøaÆøa¿øa¸øa±øaªøa£øaœøa•øaŽøa‡øa€øayøarøakøadøa]øaVøaOøaHøaAøa:øa3øa,øa%øaøaøaøa øaøaû÷aô÷aí÷aæ÷aß÷aØ÷aÑ÷aÊ÷aÃ÷a¼÷aµ÷a®÷a§÷a ÷a™÷a’÷a‹÷a„÷a}÷av÷ao÷ah÷aa÷aZ÷aS÷aL÷aE÷a>÷a7÷a0÷a)÷a"÷a÷a÷a ÷a÷aÿöaøöañöaêöaãöaÜöaÕöaÎöaÇöaÀöa¹öa²öa«öa¤öaöa–öaöaˆöaöazöasöalöaeöa^öaWöaPöaIöaBöa;öa4öa-öa&öaöaöaöa öaöaüõaõõaîõaçõaàõaÙõaÒõaËõaÄõa½õa¶õa¯õa¨õa¡õašõa“õaŒõa…õa~õawõapõaiõabõa[õaTõaMõaFõa?õa8õa1õa*õa#õaõaõaõaõaõaùôaòôaëôaäôaÝôaÖôaÏôaÈôaÁôaºôa³ôa¬ôa¥ôažôa—ôaôa‰ôa‚ôa{ôatôamôafôa_ôaXôaQôaJôaCôa<ôa5ôa.ôa'ôa ôaôaôa ôaôaýóaöóaïóaèóaáóaÚóaÓóaÌóaÅóa¾óa·óa°óa©óa¢óa›óa”óaóa†óaóaxóaqóajóacóa\óaUóaNóaGóa@óa9óa2óa+óa$óaóaóaóaóaóaúòaóòaìòaåòaÞòa×òaÐòaÉòaÂòa»òa´òa­òa¦òaŸòa˜òa‘òaŠòaƒòa|òauòanòagòa`òaYòaRòaKòaDòa=òa6òa/òa(òa!òaòaòa òaòaþña÷ñaðñaéñaâñaÛñaÔñaÍñaÆña¿ña¸ña±ñaªña£ñaœña•ñaŽña‡ña€ñayñarñakñadña]ñaVñaOñaHñaAña:ña3ña,ña%ñañañaña ñañaûðaôðaíðaæðaßðaØðaÑðaÊðaÃða¼ðaµða®ða§ða ða™ða’ða‹ða„ða}ðavðaoðahðaaðaZðaSðaLðaEða>ða7ða0ða)ða"ðaðaða ðaðaÿïaøïañïaêïaãïaÜïaÕïaÎïaÇïaÀïa¹ïa²ïa«ïa¤ïaïa–ïaïaˆïaïazïasïalïaeïa^ïaWïaPïaIïaBïa;ïa4ïa-ïa&ïaïaïaïa ïaïaüîaõîaîîaçîaàîaÙîaÒîaËîaÄîa½îa¶îa¯îa¨îa¡îašîa“îaŒîa…îa~îawîapîaiîabîa[îaTîaMîaFîa?îa8îa1îa*îa#îaîaîaîaîaîaùíaòíaëíaäíaÝíaÖíaÏíaÈíaÁíaºía³ía¬ía¥íažía—íaía‰ía‚ía{íatíamíafía_íaXíaQíaJíaCía<ía5ía.ía'ía íaíaía íaíaýìaöìaïìaèìaáìaÚìaÓìaÌìaÅìa¾ìa·ìa°ìa©ìa¢ìa›ìa”ìaìa†ìaìaxìaqìajìacìa\ìaUìaNìaGìa@ìa9ìa2ìa+ìa$ìaìaìaìaìaìaúëaóëaìëaåëaÞëa×ëaÐëaÉëaÂëa»ëa´ëa­ëa¦ëaŸëa˜ëa‘ëaŠëaƒëa|ëauëanëagëa`ëaYëaRëaKëaDëa=ëa6ëa/ëa(ëa!ëaëaëa ëaëaþêa÷êaðêaéêaâêaÛêaÔêaÍêaÆêa¿êa¸êa±êaªêa£êaœêa•êaŽêa‡êa€êayêarêakêadêa]êaVêaOêaHêaAêa:êa3êa,êa%êaêaêaêa êaêaûéaôéaíéaæéaßéaØéaÑéaÊéaÃéa¼éaµéa®éa§éa éa™éa’éa‹éa„éa}éavéaoéahéaaéaZéaSéaLéaEéa>éa7éa0éa)éa"éaéaéa éaéaÿèaøèañèaêèaãèaÜèaÕèaÎèaÇèaÀèa¹èa²èa«èa¤èaèa–èaèaˆèaèazèasèalèaeèa^èaWèaPèaIèaBèa;èa4èa-èa&èaèaèaèa èaèaüçaõçaîçaççaàçaÙçaÒçaËçaÄça½ça¶ça¯ça¨ça¡çašça“çaŒça…ça~çawçapçaiçabça[çaTçaMçaFça?ça8ça1ça*ça#çaçaçaçaçaçaùæaòæaëæaäæaÝæaÖæaÏæaÈæaÁæaºæa³æa¬æa¥æažæa—æaæa‰æa‚æa{æatæamæafæa_æaXæaQæaJæaCæa<æa5æa.æa'æa æaæaæa æaæaýåaöåaïåaèåaáåaÚåaÓåaÌåaÅåa¾åa·åa°åa©åa¢åa›åa”åaåa†åaåaxåaqåajåacåa\åaUåaNåaGåa@åa9åa2åa+åa$åaåaåaåaåaåaúäaóäaìäaåäaÞäa×äaÐäaÉäaÂäa»äa´äa­äa¦äaŸäa˜äa‘äaŠäaƒäa|äauäanäagäa`äaYäaRäaKäaDäa=äa6äa/äa(äa!äaäaäa äaäaþãa÷ãaðãaéãaâãaÛãaÔãaÍãaÆãa¿ãa¸ãa±ãaªãa£ãaœãa•ãaŽãa‡ãa€ãayãarãakãadãa]ãaVãaOãaHãaAãa:ãa3ãa,ãa%ãaãaãaãa ãaãaûâaôâaíâaæâaßâaØâaÑâaÊâaÃâa¼âaµâa®âa§âa âa™âa’âa‹âa„âa}âavâaoâahâaaâaZâaSâaLâaEâa>âa7âa0âa)âa"âaâaâa âaâaÿáaøáañáaêáaãáaÜáaÕáaÎáaÇáaÀáa¹áa²áa«áa¤áaáa–áaáaˆáaáazáasáaláaeáa^áaWáaPáaIáaBáa;áa4áa-áa&áaáaáaáa áaáaüàaõàaîàaçàaààaÙàaÒàaËàaÄàa½àa¶àa¯àa¨àa¡àašàa“àaŒàa…àa~àawàapàaiàabàa[àaTàaMàaFàa?àa8àa1àa*àa#àaàaàaàaàaàaùßaòßaëßaäßaÝßaÖßaÏßaÈßaÁßaºßa³ßa¬ßa¥ßažßa—ßaßa‰ßa‚ßa{ßatßamßafßa_ßaXßaQßaJßaCßa<ßa5ßa.ßa'ßa ßaßaßa ßaßaýÞaöÞaïÞaèÞaáÞaÚÞaÓÞaÌÞaÅÞa¾Þa·Þa°Þa©Þa¢Þa›Þa”ÞaÞa†ÞaÞaxÞaqÞajÞacÞa\ÞaUÞaNÞaGÞa@Þa9Þa2Þa+Þa$ÞaÞaÞaÞaÞaÞaúÝaóÝaìÝaåÝaÞÝa×ÝaÐÝaÉÝaÂÝa»Ýa´Ýa­Ýa¦ÝaŸÝa˜Ýa‘ÝaŠÝaƒÝa|ÝauÝanÝagÝa`ÝaYÝaRÝaKÝaDÝa=Ýa6Ýa/Ýa(Ýa!ÝaÝaÝa ÝaÝaþÜa÷ÜaðÜaéÜaâÜaÛÜaÔÜaÍÜaÆÜa¿Üa¸Üa±ÜaªÜa£ÜaœÜa•ÜaŽÜa‡Üa€ÜayÜarÜakÜadÜa]ÜaVÜaOÜaHÜaAÜa:Üa3Üa,Üa%ÜaÜaÜaÜa ÜaÜaûÛaôÛaíÛaæÛaßÛaØÛaÑÛaÊÛaÃÛa¼ÛaµÛa®Ûa§Ûa Ûa™Ûa’Ûa‹Ûa„Ûa}ÛavÛaoÛahÛaaÛaZÛaSÛaLÛaEÛa>Ûa7Ûa0Ûa)Ûa"ÛaÛaÛa ÛaÛaÿÚaøÚañÚaêÚaãÚaÜÚaÕÚaÎÚaÇÚaÀÚa¹Úa²Úa«Úa¤ÚaÚa–ÚaÚaˆÚaÚazÚasÚalÚaeÚa^ÚaWÚaPÚaIÚaBÚa;Úa4Úa-Úa&ÚaÚaÚaÚa ÚaÚaüÙaõÙaîÙaçÙaàÙaÙÙaÒÙaËÙaÄÙa½Ùa¶Ùa¯Ùa¨Ùa¡ÙašÙa“ÙaŒÙa…Ùa~ÙawÙapÙaiÙabÙa[ÙaTÙaMÙaFÙa?Ùa8Ùa1Ùa*Ùa#ÙaÙaÙaÙaÙaÙaùØaòØaëØaäØaÝØaÖØaÏØaÈØaÁØaºØa³Øa¬Øa¥ØažØa—ØaØa‰Øa‚Øa{ØatØamØafØa_ØaXØaQØaJØaCØa<Øa5Øa.Øa'Øa ØaØaØa ØaØaý×aö×aï×aè×aá×aÚ×aÓ×aÌ×aÅ×a¾×a·×a°×a©×a¢×a›×a”×a×a†×a×ax×aq×aj×ac×a\×aU×aN×aG×a@×a9×a2×a+×a$×a×a×a×a×a×aúÖaóÖaìÖaåÖaÞÖa×ÖaÐÖaÉÖaÂÖa»Öa´Öa­Öa¦ÖaŸÖa˜Öa‘ÖaŠÖaƒÖa|ÖauÖanÖagÖa`ÖaYÖaRÖaKÖaDÖa=Öa6Öa/Öa(Öa!ÖaÖaÖa ÖaÖaþÕa÷ÕaðÕaéÕaâÕaÛÕaÔÕaÍÕaÆÕa¿Õa¸Õa±ÕaªÕa£ÕaœÕa•ÕaŽÕa‡Õa€ÕayÕarÕakÕadÕa]ÕaVÕaOÕaHÕaAÕa:Õa3Õa,Õa%ÕaÕaÕaÕa ÕaÕaûÔaôÔaíÔaæÔaßÔaØÔaÑÔaÊÔaÃÔa¼ÔaµÔa®Ôa§Ôa Ôa™Ôa’Ôa‹Ôa„Ôa}ÔavÔaoÔahÔaaÔaZÔaSÔaLÔaEÔa>Ôa7Ôa0Ôa)Ôa"ÔaÔaÔa ÔaÔaÿÓaøÓañÓaêÓaãÓaÜÓaÕÓaÎÓaÇÓaÀÓa¹Óa²Óa«Óa¤ÓaÓa–ÓaÓaˆÓaÓazÓasÓalÓaeÓa^ÓaWÓaPÓaIÓaBÓa;Óa4Óa-Óa&ÓaÓaÓaÓa ÓaÓaüÒaõÒaîÒaçÒaàÒaÙÒaÒÒaËÒaÄÒa½Òa¶Òa¯Òa¨Òa¡ÒašÒa“ÒaŒÒa…Òa~ÒawÒapÒaiÒabÒa[ÒaTÒaMÒaFÒa?Òa8Òa1Òa*Òa#ÒaÒaÒaÒaÒaÒaùÑaòÑaëÑaäÑaÝÑaÖÑaÏÑaÈÑaÁÑaºÑa³Ña¬Ña¥ÑažÑa—ÑaÑa‰Ña‚Ña{ÑatÑamÑafÑa_ÑaXÑaQÑaJÑaCÑa<Ña5Ña.Ña'Ña ÑaÑaÑa ÑaÑaýÐaöÐaïÐaèÐaáÐaÚÐaÓÐaÌÐaÅÐa¾Ða·Ða°Ða©Ða¢Ða›Ða”ÐaÐa†ÐaÐaxÐaqÐajÐacÐa\ÐaUÐaNÐaGÐa@Ða9Ða2Ða+Ða$ÐaÐaÐaÐaÐaÐaúÏaóÏaìÏaåÏaÞÏa×ÏaÐÏaÉÏaÂÏa»Ïa´Ïa­Ïa¦ÏaŸÏa˜Ïa‘ÏaŠÏaƒÏa|ÏauÏanÏagÏa`ÏaYÏaRÏaKÏaDÏa=Ïa6Ïa/Ïa(Ïa!ÏaÏaÏa ÏaÏaþÎa÷ÎaðÎaéÎaâÎaÛÎaÔÎaÍÎaÆÎa¿Îa¸Îa±ÎaªÎa£ÎaœÎa•ÎaŽÎa‡Îa€ÎayÎarÎakÎadÎa]ÎaVÎaOÎaHÎaAÎa:Îa3Îa,Îa%ÎaÎaÎaÎa ÎaÎaûÍaôÍaíÍaæÍaßÍaØÍaÑÍaÊÍaÃÍa¼ÍaµÍa®Ía§Ía Ía™Ía’Ía‹Ía„Ía}ÍavÍaoÍahÍaaÍaZÍaSÍaLÍaEÍa>Ía7Ía0Ía)Ía"ÍaÍaÍa ÍaÍaÿÌaøÌañÌaêÌaãÌaÜÌaÕÌaÎÌaÇÌaÀÌa¹Ìa²Ìa«Ìa¤ÌaÌa–ÌaÌaˆÌaÌazÌasÌalÌaeÌa^ÌaWÌaPÌaIÌaBÌa;Ìa4Ìa-Ìa&ÌaÌaÌaÌa ÌaÌaüËaõËaîËaçËaàËaÙËaÒËaËËaÄËa½Ëa¶Ëa¯Ëa¨Ëa¡ËašËa“ËaŒËa…Ëa~ËawËapËaiËabËa[ËaTËaMËaFËa?Ëa8Ëa1Ëa*Ëa#ËaËaËaËaËaËaùÊaòÊaëÊaäÊaÝÊaÖÊaÏÊaÈÊaÁÊaºÊa³Êa¬Êa¥ÊažÊa—ÊaÊa‰Êa‚Êa{ÊatÊamÊafÊa_ÊaXÊaQÊaJÊaCÊa<Êa5Êa.Êa'Êa ÊaÊaÊa ÊaÊaýÉaöÉaïÉaèÉaáÉaÚÉaÓÉaÌÉaÅÉa¾Éa·Éa°Éa©Éa¢Éa›Éa”ÉaÉa†ÉaÉaxÉaqÉajÉacÉa\ÉaUÉaNÉaGÉa@Éa9Éa2Éa+Éa$ÉaÉaÉaÉaÉaÉaúÈaóÈaìÈaåÈaÞÈa×ÈaÐÈaÉÈaÂÈa»Èa´Èa­Èa¦ÈaŸÈa˜Èa‘ÈaŠÈaƒÈa|ÈauÈanÈagÈa`ÈaYÈaRÈaKÈaDÈa=Èa6Èa/Èa(Èa!ÈaÈaÈa ÈaÈaþÇa÷ÇaðÇaéÇaâÇaÛÇaÔÇaÍÇaÆÇa¿Ça¸Ça±ÇaªÇa£ÇaœÇa•ÇaŽÇa‡Ça€ÇayÇarÇakÇadÇa]ÇaVÇaOÇaHÇaAÇa:Ça3Ça,Ça%ÇaÇaÇaÇa ÇaÇaûÆaôÆaíÆaæÆa߯aØÆaÑÆaÊÆaÃÆa¼ÆaµÆa®Æa§Æa Æa™Æa’Æa‹Æa„Æa}ÆavÆaoÆahÆaaÆaZÆaSÆaLÆaEÆa>Æa7Æa0Æa)Æa"ÆaÆaÆa ÆaÆaÿÅaøÅañÅaêÅaãÅaÜÅaÕÅaÎÅaÇÅaÀÅa¹Åa²Åa«Åa¤ÅaÅa–ÅaÅaˆÅaÅazÅasÅalÅaeÅa^ÅaWÅaPÅaIÅaBÅa;Åa4Åa-Åa&ÅaÅaÅaÅa ÅaÅaüÄaõÄaîÄaçÄaàÄaÙÄaÒÄaËÄaÄÄa½Äa¶Äa¯Äa¨Äa¡ÄašÄa“ÄaŒÄa…Äa~ÄawÄapÄaiÄabÄa[ÄaTÄaMÄaFÄa?Äa8Äa1Äa*Äa#ÄaÄaÄaÄaÄaÄaùÃaòÃaëÃaäÃaÝÃaÖÃaÏÃaÈÃaÁÃaºÃa³Ãa¬Ãa¥ÃažÃa—ÃaÃa‰Ãa‚Ãa{ÃatÃamÃafÃa_ÃaXÃaQÃaJÃaCÃa<Ãa5Ãa.Ãa'Ãa ÃaÃaÃa ÃaÃaýÂaöÂaïÂaèÂaáÂaÚÂaÓÂaÌÂaÅÂa¾Âa·Âa°Âa©Âa¢Âa›Âa”ÂaÂa†ÂaÂaxÂaqÂajÂacÂa\ÂaUÂaNÂaGÂa@Âa9Âa2Âa+Âa$ÂaÂaÂaÂaÂaÂaúÁaóÁaìÁaåÁaÞÁa×ÁaÐÁaÉÁaÂÁa»Áa´Áa­Áa¦ÁaŸÁa˜Áa‘ÁaŠÁaƒÁa|ÁauÁanÁagÁa`ÁaYÁaRÁaKÁaDÁa=Áa6Áa/Áa(Áa!ÁaÁaÁa ÁaÁaþÀa÷ÀaðÀaéÀaâÀaÛÀaÔÀaÍÀaÆÀa¿Àa¸Àa±ÀaªÀa£ÀaœÀa•ÀaŽÀa‡Àa€ÀayÀarÀakÀadÀa]ÀaVÀaOÀaHÀaAÀa:Àa3Àa,Àa%ÀaÀaÀaÀa ÀaÀaû¿aô¿aí¿aæ¿aß¿aØ¿aÑ¿aÊ¿aÿa¼¿aµ¿a®¿a§¿a ¿a™¿a’¿a‹¿a„¿a}¿av¿ao¿ah¿aa¿aZ¿aS¿aL¿aE¿a>¿a7¿a0¿a)¿a"¿a¿a¿a ¿a¿aÿ¾aø¾añ¾aê¾aã¾aܾaÕ¾aξaǾaÀ¾a¹¾a²¾a«¾a¤¾a¾a–¾a¾aˆ¾a¾az¾as¾al¾ae¾a^¾aW¾aP¾aI¾aB¾a;¾a4¾a-¾a&¾a¾a¾a¾a ¾a¾aü½aõ½aî½aç½aà½aÙ½aÒ½a˽aĽa½½a¶½a¯½a¨½a¡½aš½a“½aŒ½a…½a~½aw½ap½ai½ab½a[½aT½aM½aF½a?½a8½a1½a*½a#½a½a½a½a½a½aù¼aò¼aë¼aä¼aݼaÖ¼aϼaȼaÁ¼aº¼a³¼a¬¼a¥¼až¼a—¼a¼a‰¼a‚¼a{¼at¼am¼af¼a_¼aX¼aQ¼aJ¼aC¼a<¼a5¼a.¼a'¼a ¼a¼a¼a ¼a¼aý»aö»aï»aè»aá»aÚ»aÓ»aÌ»aÅ»a¾»a·»a°»a©»a¢»a›»a”»a»a†»a»ax»aq»aj»ac»a\»aU»aN»aG»a@»a9»a2»a+»a$»a»a»a»a»a»aúºaóºaìºaåºaÞºa׺aкaɺaºa»ºa´ºa­ºa¦ºaŸºa˜ºa‘ºaŠºaƒºa|ºauºanºagºa`ºaYºaRºaKºaDºa=ºa6ºa/ºa(ºa!ºaºaºa ºaºaþ¹a÷¹að¹aé¹aâ¹aÛ¹aÔ¹a͹aƹa¿¹a¸¹a±¹aª¹a£¹aœ¹a•¹a޹a‡¹a€¹ay¹ar¹ak¹ad¹a]¹aV¹aO¹aH¹aA¹a:¹a3¹a,¹a%¹a¹a¹a¹a ¹a¹aû¸aô¸aí¸aæ¸a߸aظaѸaʸaøa¼¸aµ¸a®¸a§¸a ¸a™¸a’¸a‹¸a„¸a}¸av¸ao¸ah¸aa¸aZ¸aS¸aL¸aE¸a>¸a7¸a0¸a)¸a"¸a¸a¸a ¸a¸aÿ·aø·añ·aê·aã·aÜ·aÕ·aηaÇ·aÀ·a¹·a²·a«·a¤·a·a–·a·aˆ·a·az·as·al·ae·a^·aW·aP·aI·aB·a;·a4·a-·a&·a·a·a·a ·a·aü¶aõ¶aî¶aç¶aà¶aÙ¶aÒ¶a˶aĶa½¶a¶¶a¯¶a¨¶a¡¶aš¶a“¶aŒ¶a…¶a~¶aw¶ap¶ai¶ab¶a[¶aT¶aM¶aF¶a?¶a8¶a1¶a*¶a#¶a¶a¶a¶a¶a¶aùµaòµaëµaäµaݵaÖµaϵaȵaÁµaºµa³µa¬µa¥µažµa—µaµa‰µa‚µa{µatµamµafµa_µaXµaQµaJµaCµa<µa5µa.µa'µa µaµaµa µaµaý´aö´aï´aè´aá´aÚ´aÓ´aÌ´aÅ´a¾´a·´a°´a©´a¢´a›´a”´a´a†´a´ax´aq´aj´ac´a\´aU´aN´aG´a@´a9´a2´a+´a$´a´a´a´a´a´aú³aó³aì³aå³aÞ³a׳aгaɳa³a»³a´³a­³a¦³aŸ³a˜³a‘³aгaƒ³a|³au³an³ag³a`³aY³aR³aK³aD³a=³a6³a/³a(³a!³a³a³a ³a³aþ²a÷²að²aé²aâ²aÛ²aÔ²aͲaƲa¿²a¸²a±²aª²a£²aœ²a•²a޲a‡²a€²ay²ar²ak²ad²a]²aV²aO²aH²aA²a:²a3²a,²a%²a²a²a²a ²a²aû±aô±aí±aæ±aß±aرaѱaʱaña¼±aµ±a®±a§±a ±a™±a’±a‹±a„±a}±av±ao±ah±aa±aZ±aS±aL±aE±a>±a7±a0±a)±a"±a±a±a ±a±aÿ°aø°añ°aê°aã°aܰaÕ°aΰaǰaÀ°a¹°a²°a«°a¤°a°a–°a°aˆ°a°az°as°al°ae°a^°aW°aP°aI°aB°a;°a4°a-°a&°a°a°a°a °a°aü¯aõ¯aî¯aç¯aà¯aÙ¯aÒ¯a˯aįa½¯a¶¯a¯¯a¨¯a¡¯aš¯a“¯aŒ¯a…¯a~¯aw¯ap¯ai¯ab¯a[¯aT¯aM¯aF¯a?¯a8¯a1¯a*¯a#¯a¯a¯a¯a¯a¯aù®aò®aë®aä®aÝ®aÖ®aÏ®aÈ®aÁ®aº®a³®a¬®a¥®až®a—®a®a‰®a‚®a{®at®am®af®a_®aX®aQ®aJ®aC®a<®a5®a.®a'®a ®a®a®a ®a®aý­aö­aï­aè­aá­aÚ­aÓ­aÌ­aÅ­a¾­a·­a°­a©­a¢­a›­a”­a­a†­a­ax­aq­aj­ac­a\­aU­aN­aG­a@­a9­a2­a+­a$­a­a­a­a­a­aú¬aó¬aì¬aå¬aÞ¬a׬aЬaɬa¬a»¬a´¬a­¬a¦¬aŸ¬a˜¬a‘¬aЬaƒ¬a|¬au¬an¬ag¬a`¬aY¬aR¬aK¬aD¬a=¬a6¬a/¬a(¬a!¬a¬a¬a ¬a¬aþ«a÷«að«aé«aâ«aÛ«aÔ«aÍ«aÆ«a¿«a¸«a±«aª«a£«aœ«a•«aŽ«a‡«a€«ay«ar«ak«ad«a]«aV«aO«aH«aA«a:«a3«a,«a%«a«a«a«a «a«aûªaôªaíªaæªaߪaتaѪaʪaêa¼ªaµªa®ªa§ªa ªa™ªa’ªa‹ªa„ªa}ªavªaoªahªaaªaZªaSªaLªaEªa>ªa7ªa0ªa)ªa"ªaªaªa ªaªaÿ©aø©añ©aê©aã©aÜ©aÕ©aΩaÇ©aÀ©a¹©a²©a«©a¤©a©a–©a©aˆ©a©az©as©al©ae©a^©aW©aP©aI©aB©a;©a4©a-©a&©a©a©a©a ©a©aü¨aõ¨aî¨aç¨aà¨aÙ¨aÒ¨a˨aĨa½¨a¶¨a¯¨a¨¨a¡¨aš¨a“¨aŒ¨a…¨a~¨aw¨ap¨ai¨ab¨a[¨aT¨aM¨aF¨a?¨a8¨a1¨a*¨a#¨a¨a¨a¨a¨a¨aù§aò§aë§aä§aݧaÖ§aϧaȧaÁ§aº§a³§a¬§a¥§až§a—§a§a‰§a‚§a{§at§am§af§a_§aX§aQ§aJ§aC§a<§a5§a.§a'§a §a§a§a §a§aý¦aö¦aï¦aè¦aá¦aÚ¦aÓ¦a̦aŦa¾¦a·¦a°¦a©¦a¢¦a›¦a”¦a¦a†¦a¦ax¦aq¦aj¦ac¦a\¦aU¦aN¦aG¦a@¦a9¦a2¦a+¦a$¦a¦a¦a¦a¦a¦aú¥aó¥aì¥aå¥aÞ¥a×¥aÐ¥aÉ¥aÂ¥a»¥a´¥a­¥a¦¥aŸ¥a˜¥a‘¥aŠ¥aƒ¥a|¥au¥an¥ag¥a`¥aY¥aR¥aK¥aD¥a=¥a6¥a/¥a(¥a!¥a¥a¥a ¥a¥aþ¤a÷¤að¤aé¤aâ¤aÛ¤aÔ¤aͤaƤa¿¤a¸¤a±¤aª¤a£¤aœ¤a•¤aޤa‡¤a€¤ay¤ar¤ak¤ad¤a]¤aV¤aO¤aH¤aA¤a:¤a3¤a,¤a%¤a¤a¤a¤a ¤a¤aû£aô£aí£aæ£aߣaØ£aÑ£aÊ£aãa¼£aµ£a®£a§£a £a™£a’£a‹£a„£a}£av£ao£ah£aa£aZ£aS£aL£aE£a>£a7£a0£a)£a"£a£a£a £a£aÿ¢aø¢añ¢aê¢aã¢aÜ¢aÕ¢a΢aÇ¢aÀ¢a¹¢a²¢a«¢a¤¢a¢a–¢a¢aˆ¢a¢az¢as¢al¢ae¢a^¢aW¢aP¢aI¢aB¢a;¢a4¢a-¢a&¢a¢a¢a¢a ¢a¢aü¡aõ¡aî¡aç¡aà¡aÙ¡aÒ¡aË¡aÄ¡a½¡a¶¡a¯¡a¨¡a¡¡aš¡a“¡aŒ¡a…¡a~¡aw¡ap¡ai¡ab¡a[¡aT¡aM¡aF¡a?¡a8¡a1¡a*¡a#¡a¡a¡a¡a¡a¡aù aò aë aä aÝ aÖ aÏ aÈ aÁ aº a³ a¬ a¥ až a— a a‰ a‚ a{ at am af a_ aX aQ aJ aC a< a5 a. a' a  a a a  a aýŸaöŸaïŸaèŸaáŸaÚŸaÓŸaÌŸaÅŸa¾Ÿa·Ÿa°Ÿa©Ÿa¢Ÿa›Ÿa”ŸaŸa†ŸaŸaxŸaqŸajŸacŸa\ŸaUŸaNŸaGŸa@Ÿa9Ÿa2Ÿa+Ÿa$ŸaŸaŸaŸaŸaŸaúžaóžaìžaåžaÞžaמaОaÉžaža»ža´ža­ža¦žaŸža˜ža‘žaŠžaƒža|žaužanžagža`žaYžaRžaKžaDža=ža6ža/ža(ža!žažaža žažaþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûœaôœaíœaæœaßœaØœaÑœaÊœaÜa¼œaµœa®œa§œa œa™œa’œa‹œa„œa}œavœaoœahœaaœaZœaSœaLœaEœa>œa7œa0œa)œa"œaœaœa œaœaÿ›aø›añ›aê›aã›aÜ›aÕ›aΛaÇ›aÀ›a¹›a²›a«›a¤›a›a–›a›aˆ›a›az›as›al›ae›a^›aW›aP›aI›aB›a;›a4›a-›a&›a›a›a›a ›a›aüšaõšaîšaçšaàšaÙšaÒšaËšaÄša½ša¶ša¯ša¨ša¡šašša“šaŒša…ša~šawšapšaišabša[šaTšaMšaFša?ša8ša1ša*ša#šašašašašašaù™aò™aë™aä™aÝ™aÖ™aÏ™aÈ™aÁ™aº™a³™a¬™a¥™až™a—™a™a‰™a‚™a{™at™am™af™a_™aX™aQ™aJ™aC™a<™a5™a.™a'™a ™a™a™a ™a™aý˜aö˜aï˜aè˜aá˜aÚ˜aÓ˜a̘aŘa¾˜a·˜a°˜a©˜a¢˜a›˜a”˜a˜a†˜a˜ax˜aq˜aj˜ac˜a\˜aU˜aN˜aG˜a@˜a9˜a2˜a+˜a$˜a˜a˜a˜a˜a˜aú—aó—aì—aå—aÞ—a×—aЗaÉ—a—a»—a´—a­—a¦—aŸ—a˜—a‘—aŠ—aƒ—a|—au—an—ag—a`—aY—aR—aK—aD—a=—a6—a/—a(—a!—a—a—a —a—aþ–a÷–að–aé–aâ–aÛ–aÔ–aÍ–aÆ–a¿–a¸–a±–aª–a£–aœ–a•–aŽ–a‡–a€–ay–ar–ak–ad–a]–aV–aO–aH–aA–a:–a3–a,–a%–a–a–a–a –a–aû•aô•aí•aæ•aß•aØ•aÑ•aÊ•aÕa¼•aµ•a®•a§•a •a™•a’•a‹•a„•a}•av•ao•ah•aa•aZ•aS•aL•aE•a>•a7•a0•a)•a"•a•a•a •a•aÿ”aø”añ”aê”aã”aÜ”aÕ”aΔaÇ”aÀ”a¹”a²”a«”a¤”a”a–”a”aˆ”a”az”as”al”ae”a^”aW”aP”aI”aB”a;”a4”a-”a&”a”a”a”a ”a”aü“aõ“aî“aç“aà“aÙ“aÒ“aË“aÄ“a½“a¶“a¯“a¨“a¡“aš“a““aŒ“a…“a~“aw“ap“ai“ab“a[“aT“aM“aF“a?“a8“a1“a*“a#“a“a“a“a“a“aù’aò’aë’aä’aÝ’aÖ’aÏ’aÈ’aÁ’aº’a³’a¬’a¥’až’a—’a’a‰’a‚’a{’at’am’af’a_’aX’aQ’aJ’aC’a<’a5’a.’a'’a ’a’a’a ’a’aý‘aö‘aï‘aè‘aá‘aÚ‘aÓ‘aÌ‘aÅ‘a¾‘a·‘a°‘a©‘a¢‘a›‘a”‘a‘a†‘a‘ax‘aq‘aj‘ac‘a\‘aU‘aN‘aG‘a@‘a9‘a2‘a+‘a$‘a‘a‘a‘a‘a‘aúaóaìaåaÞa×aÐaÉaÂa»a´a­a¦aŸa˜a‘aŠaƒa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûŽaôŽaíŽaæŽaߎaØŽaÑŽaÊŽaÃŽa¼ŽaµŽa®Ža§Ža Ža™Ža’Ža‹Ža„Ža}ŽavŽaoŽahŽaaŽaZŽaSŽaLŽaEŽa>Ža7Ža0Ža)Ža"ŽaŽaŽa ŽaŽaÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüŒaõŒaîŒaçŒaàŒaÙŒaÒŒaËŒaÄŒa½Œa¶Œa¯Œa¨Œa¡ŒašŒa“ŒaŒŒa…Œa~ŒawŒapŒaiŒabŒa[ŒaTŒaMŒaFŒa?Œa8Œa1Œa*Œa#ŒaŒaŒaŒaŒaŒaù‹aò‹aë‹aä‹aÝ‹aÖ‹aÏ‹aÈ‹aÁ‹aº‹a³‹a¬‹a¥‹až‹a—‹a‹a‰‹a‚‹a{‹at‹am‹af‹a_‹aX‹aQ‹aJ‹aC‹a<‹a5‹a.‹a'‹a ‹a‹a‹a ‹a‹aýŠaöŠaïŠaèŠaáŠaÚŠaÓŠaÌŠaÅŠa¾Ša·Ša°Ša©Ša¢Ša›Ša”ŠaŠa†ŠaŠaxŠaqŠajŠacŠa\ŠaUŠaNŠaGŠa@Ša9Ša2Ša+Ša$ŠaŠaŠaŠaŠaŠaú‰aó‰aì‰aå‰aÞ‰a׉aЉaɉa‰a»‰a´‰a­‰a¦‰aŸ‰a˜‰a‘‰aЉaƒ‰a|‰au‰an‰ag‰a`‰aY‰aR‰aK‰aD‰a=‰a6‰a/‰a(‰a!‰a‰a‰a ‰a‰aþˆa÷ˆaðˆaéˆaâˆaÛˆaÔˆa͈aƈa¿ˆa¸ˆa±ˆaªˆa£ˆaœˆa•ˆaŽˆa‡ˆa€ˆayˆarˆakˆadˆa]ˆaVˆaOˆaHˆaAˆa:ˆa3ˆa,ˆa%ˆaˆaˆaˆa ˆaˆaû‡aô‡aí‡aæ‡a߇a؇aчaʇaÇa¼‡aµ‡a®‡a§‡a ‡a™‡a’‡a‹‡a„‡a}‡av‡ao‡ah‡aa‡aZ‡aS‡aL‡aE‡a>‡a7‡a0‡a)‡a"‡a‡a‡a ‡a‡aÿ†aø†añ†aê†aã†a܆aÕ†aΆadžaÀ†a¹†a²†a«†a¤†a†a–†a†aˆ†a†az†as†al†ae†a^†aW†aP†aI†aB†a;†a4†a-†a&†a†a†a†a †a†aü…aõ…aî…aç…aà…aÙ…aÒ…aË…aÄ…a½…a¶…a¯…a¨…a¡…aš…a“…aŒ…a……a~…aw…ap…ai…ab…a[…aT…aM…aF…a?…a8…a1…a*…a#…a…a…a…a…a…aù„aò„aë„aä„aÝ„aÖ„aÏ„aÈ„aÁ„aº„a³„a¬„a¥„až„a—„a„a‰„a‚„a{„at„am„af„a_„aX„aQ„aJ„aC„a<„a5„a.„a'„a „a„a„a „a„aýƒaöƒaïƒaèƒaáƒaÚƒaÓƒãaŃa¾ƒa·ƒa°ƒa©ƒa¢ƒa›ƒa”ƒaƒa†ƒaƒaxƒaqƒajƒacƒa\ƒaUƒaNƒaGƒa@ƒa9ƒa2ƒa+ƒa$ƒaƒaƒaƒaƒaƒaú‚aó‚aì‚aå‚aÞ‚aׂaЂaÉ‚a‚a»‚a´‚a­‚a¦‚aŸ‚a˜‚a‘‚aŠ‚aƒ‚a|‚au‚an‚ag‚a`‚aY‚aR‚aK‚aD‚a=‚a6‚a/‚a(‚a!‚a‚a‚a ‚a‚aþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaû€aô€aí€aæ€a߀aØ€aÑ€aÊ€aÀa¼€aµ€a®€a§€a €a™€a’€a‹€a„€a}€av€ao€ah€aa€aZ€aS€aL€aE€a>€a7€a0€a)€a"€a€a€a €a€aÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü~aõ~aî~aç~aà~aÙ~aÒ~aË~aÄ~a½~a¶~a¯~a¨~a¡~aš~a“~aŒ~a…~a~~aw~ap~ai~ab~a[~aT~aM~aF~a?~a8~a1~a*~a#~a~a~a~a~a~aù}aò}aë}aä}aÝ}aÖ}aÏ}aÈ}aÁ}aº}a³}a¬}a¥}až}a—}a}a‰}a‚}a{}at}am}af}a_}aX}aQ}aJ}aC}a<}a5}a.}a'}a }a}a}a }a}aý|aö|aï|aè|aá|aÚ|aÓ|aÌ|aÅ|a¾|a·|a°|a©|a¢|a›|a”|a|a†|a|ax|aq|aj|ac|a\|aU|aN|aG|a@|a9|a2|a+|a$|a|a|a|a|a|aú{aó{aì{aå{aÞ{a×{aÐ{aÉ{aÂ{a»{a´{a­{a¦{aŸ{a˜{a‘{aŠ{aƒ{a|{au{an{ag{a`{aY{aR{aK{aD{a={a6{a/{a({a!{a{a{a {a{aþza÷zaðzaézaâzaÛzaÔzaÍzaÆza¿za¸za±zaªza£zaœza•zaŽza‡za€zayzarzakzadza]zaVzaOzaHzaAza:za3za,za%zazazaza zazaûyaôyaíyaæyaßyaØyaÑyaÊyaÃya¼yaµya®ya§ya ya™ya’ya‹ya„ya}yavyaoyahyaayaZyaSyaLyaEya>ya7ya0ya)ya"yayaya yayaÿxaøxañxaêxaãxaÜxaÕxaÎxaÇxaÀxa¹xa²xa«xa¤xaxa–xaxaˆxaxazxasxalxaexa^xaWxaPxaIxaBxa;xa4xa-xa&xaxaxaxa xaxaüwaõwaîwaçwaàwaÙwaÒwaËwaÄwa½wa¶wa¯wa¨wa¡wašwa“waŒwa…wa~wawwapwaiwabwa[waTwaMwaFwa?wa8wa1wa*wa#wawawawawawaùvaòvaëvaävaÝvaÖvaÏvaÈvaÁvaºva³va¬va¥važva—vava‰va‚va{vatvamvafva_vaXvaQvaJvaCvara7ra0ra)ra"rarara raraÿqaøqañqaêqaãqaÜqaÕqaÎqaÇqaÀqa¹qa²qa«qa¤qaqa–qaqaˆqaqazqasqalqaeqa^qaWqaPqaIqaBqa;qa4qa-qa&qaqaqaqa qaqaüpaõpaîpaçpaàpaÙpaÒpaËpaÄpa½pa¶pa¯pa¨pa¡pašpa“paŒpa…pa~pawpappaipabpa[paTpaMpaFpa?pa8pa1pa*pa#papapapapapaùoaòoaëoaäoaÝoaÖoaÏoaÈoaÁoaºoa³oa¬oa¥oažoa—oaoa‰oa‚oa{oatoamoafoa_oaXoaQoaJoaCoaka7ka0ka)ka"kakaka kakaÿjaøjañjaêjaãjaÜjaÕjaÎjaÇjaÀja¹ja²ja«ja¤jaja–jajaˆjajazjasjaljaeja^jaWjaPjaIjaBja;ja4ja-ja&jajajaja jajaüiaõiaîiaçiaàiaÙiaÒiaËiaÄia½ia¶ia¯ia¨ia¡iašia“iaŒia…ia~iawiapiaiiabia[iaTiaMiaFia?ia8ia1ia*ia#iaiaiaiaiaiaùhaòhaëhaähaÝhaÖhaÏhaÈhaÁhaºha³ha¬ha¥hažha—haha‰ha‚ha{hathamhafha_haXhaQhaJhaChada7da0da)da"dadada dadaÿcaøcañcaêcaãcaÜcaÕcaÎcaÇcaÀca¹ca²ca«ca¤caca–cacaˆcacazcascalcaeca^caWcaPcaIcaBca;ca4ca-ca&cacacaca cacaübaõbaîbaçbaàbaÙbaÒbaËbaÄba½ba¶ba¯ba¨ba¡bašba“baŒba…ba~bawbapbaibabba[baTbaMbaFba?ba8ba1ba*ba#babababababaùaaòaaëaaäaaÝaaÖaaÏaaÈaaÁaaºaa³aa¬aa¥aažaa—aaaa‰aa‚aa{aataamaafaa_aaXaaQaaJaaCaa]a7]a0]a)]a"]a]a]a ]a]aÿ\aø\añ\aê\aã\aÜ\aÕ\aÎ\aÇ\aÀ\a¹\a²\a«\a¤\a\a–\a\aˆ\a\az\as\al\ae\a^\aW\aP\aI\aB\a;\a4\a-\a&\a\a\a\a \a\aü[aõ[aî[aç[aà[aÙ[aÒ[aË[aÄ[a½[a¶[a¯[a¨[a¡[aš[a“[aŒ[a…[a~[aw[ap[ai[ab[a[[aT[aM[aF[a?[a8[a1[a*[a#[a[a[a[a[a[aùZaòZaëZaäZaÝZaÖZaÏZaÈZaÁZaºZa³Za¬Za¥ZažZa—ZaZa‰Za‚Za{ZatZamZafZa_ZaXZaQZaJZaCZaVa7Va0Va)Va"VaVaVa VaVaÿUaøUañUaêUaãUaÜUaÕUaÎUaÇUaÀUa¹Ua²Ua«Ua¤UaUa–UaUaˆUaUazUasUalUaeUa^UaWUaPUaIUaBUa;Ua4Ua-Ua&UaUaUaUa UaUaüTaõTaîTaçTaàTaÙTaÒTaËTaÄTa½Ta¶Ta¯Ta¨Ta¡TašTa“TaŒTa…Ta~TawTapTaiTabTa[TaTTaMTaFTa?Ta8Ta1Ta*Ta#TaTaTaTaTaTaùSaòSaëSaäSaÝSaÖSaÏSaÈSaÁSaºSa³Sa¬Sa¥SažSa—SaSa‰Sa‚Sa{SatSamSafSa_SaXSaQSaJSaCSaOa7Oa0Oa)Oa"OaOaOa OaOaÿNaøNañNaêNaãNaÜNaÕNaÎNaÇNaÀNa¹Na²Na«Na¤NaNa–NaNaˆNaNazNasNalNaeNa^NaWNaPNaINaBNa;Na4Na-Na&NaNaNaNa NaNaüMaõMaîMaçMaàMaÙMaÒMaËMaÄMa½Ma¶Ma¯Ma¨Ma¡MašMa“MaŒMa…Ma~MawMapMaiMabMa[MaTMaMMaFMa?Ma8Ma1Ma*Ma#MaMaMaMaMaMaùLaòLaëLaäLaÝLaÖLaÏLaÈLaÁLaºLa³La¬La¥LažLa—LaLa‰La‚La{LatLamLafLa_LaXLaQLaJLaCLaHa7Ha0Ha)Ha"HaHaHa HaHaÿGaøGañGaêGaãGaÜGaÕGaÎGaÇGaÀGa¹Ga²Ga«Ga¤GaGa–GaGaˆGaGazGasGalGaeGa^GaWGaPGaIGaBGa;Ga4Ga-Ga&GaGaGaGa GaGaüFaõFaîFaçFaàFaÙFaÒFaËFaÄFa½Fa¶Fa¯Fa¨Fa¡FašFa“FaŒFa…Fa~FawFapFaiFabFa[FaTFaMFaFFa?Fa8Fa1Fa*Fa#FaFaFaFaFaFaùEaòEaëEaäEaÝEaÖEaÏEaÈEaÁEaºEa³Ea¬Ea¥EažEa—EaEa‰Ea‚Ea{EatEamEafEa_EaXEaQEaJEaCEaAa7Aa0Aa)Aa"AaAaAa AaAaÿ@aø@añ@aê@aã@aÜ@aÕ@aÎ@aÇ@aÀ@a¹@a²@a«@a¤@a@a–@a@aˆ@a@az@as@al@ae@a^@aW@aP@aI@aB@a;@a4@a-@a&@a@a@a@a @a@aü?aõ?aî?aç?aà?aÙ?aÒ?aË?aÄ?a½?a¶?a¯?a¨?a¡?aš?a“?aŒ?a…?a~?aw?ap?ai?ab?a[?aT?aM?aF?a??a8?a1?a*?a#?a?a?a?a?a?aù>aò>aë>aä>aÝ>aÖ>aÏ>aÈ>aÁ>aº>a³>a¬>a¥>až>a—>a>a‰>a‚>a{>at>am>af>a_>aX>aQ>aJ>aC>a<>a5>a.>a'>a >a>a>a >a>aý=aö=aï=aè=aá=aÚ=aÓ=aÌ=aÅ=a¾=a·=a°=a©=a¢=a›=a”=a=a†=a=ax=aq=aj=ac=a\=aU=aN=aG=a@=a9=a2=a+=a$=a=a=a=a=a=aú:a7:a0:a):a":a:a:a :a:aÿ9aø9añ9aê9aã9aÜ9aÕ9aÎ9aÇ9aÀ9a¹9a²9a«9a¤9a9a–9a9aˆ9a9az9as9al9ae9a^9aW9aP9aI9aB9a;9a49a-9a&9a9a9a9a 9a9aü8aõ8aî8aç8aà8aÙ8aÒ8aË8aÄ8a½8a¶8a¯8a¨8a¡8aš8a“8aŒ8a…8a~8aw8ap8ai8ab8a[8aT8aM8aF8a?8a88a18a*8a#8a8a8a8a8a8aù7aò7aë7aä7aÝ7aÖ7aÏ7aÈ7aÁ7aº7a³7a¬7a¥7až7a—7a7a‰7a‚7a{7at7am7af7a_7aX7aQ7aJ7aC7a<7a57a.7a'7a 7a7a7a 7a7aý6aö6aï6aè6aá6aÚ6aÓ6aÌ6aÅ6a¾6a·6a°6a©6a¢6a›6a”6a6a†6a6ax6aq6aj6ac6a\6aU6aN6aG6a@6a96a26a+6a$6a6a6a6a6a6aú5aó5aì5aå5aÞ5a×5aÐ5aÉ5aÂ5a»5a´5a­5a¦5aŸ5a˜5a‘5aŠ5aƒ5a|5au5an5ag5a`5aY5aR5aK5aD5a=5a65a/5a(5a!5a5a5a 5a5aþ4a÷4að4aé4aâ4aÛ4aÔ4aÍ4aÆ4a¿4a¸4a±4aª4a£4aœ4a•4aŽ4a‡4a€4ay4ar4ak4ad4a]4aV4aO4aH4aA4a:4a34a,4a%4a4a4a4a 4a4aû3aô3aí3aæ3aß3aØ3aÑ3aÊ3aÃ3a¼3aµ3a®3a§3a 3a™3a’3a‹3a„3a}3av3ao3ah3aa3aZ3aS3aL3aE3a>3a73a03a)3a"3a3a3a 3a3aÿ2aø2añ2aê2aã2aÜ2aÕ2aÎ2aÇ2aÀ2a¹2a²2a«2a¤2a2a–2a2aˆ2a2az2as2al2ae2a^2aW2aP2aI2aB2a;2a42a-2a&2a2a2a2a 2a2aü1aõ1aî1aç1aà1aÙ1aÒ1aË1aÄ1a½1a¶1a¯1a¨1a¡1aš1a“1aŒ1a…1a~1aw1ap1ai1ab1a[1aT1aM1aF1a?1a81a11a*1a#1a1a1a1a1a1aù0aò0aë0aä0aÝ0aÖ0aÏ0aÈ0aÁ0aº0a³0a¬0a¥0až0a—0a0a‰0a‚0a{0at0am0af0a_0aX0aQ0aJ0aC0a<0a50a.0a'0a 0a0a0a 0a0aý/aö/aï/aè/aá/aÚ/aÓ/aÌ/aÅ/a¾/a·/a°/a©/a¢/a›/a”/a/a†/a/ax/aq/aj/ac/a\/aU/aN/aG/a@/a9/a2/a+/a$/a/a/a/a/a/aú.aó.aì.aå.aÞ.a×.aÐ.aÉ.aÂ.a».a´.a­.a¦.aŸ.a˜.a‘.aŠ.aƒ.a|.au.an.ag.a`.aY.aR.aK.aD.a=.a6.a/.a(.a!.a.a.a .a.aþ-a÷-að-aé-aâ-aÛ-aÔ-aÍ-aÆ-a¿-a¸-a±-aª-a£-aœ-a•-aŽ-a‡-a€-ay-ar-ak-ad-a]-aV-aO-aH-aA-a:-a3-a,-a%-a-a-a-a -a-aû,aô,aí,aæ,aß,aØ,aÑ,aÊ,aÃ,a¼,aµ,a®,a§,a ,a™,a’,a‹,a„,a},av,ao,ah,aa,aZ,aS,aL,aE,a>,a7,a0,a),a",a,a,a ,a,aÿ+aø+añ+aê+aã+aÜ+aÕ+aÎ+aÇ+aÀ+a¹+a²+a«+a¤+a+a–+a+aˆ+a+az+as+al+ae+a^+aW+aP+aI+aB+a;+a4+a-+a&+a+a+a+a +a+aü*aõ*aî*aç*aà*aÙ*aÒ*aË*aÄ*a½*a¶*a¯*a¨*a¡*aš*a“*aŒ*a…*a~*aw*ap*ai*ab*a[*aT*aM*aF*a?*a8*a1*a**a#*a*a*a*a*a*aù)aò)aë)aä)aÝ)aÖ)aÏ)aÈ)aÁ)aº)a³)a¬)a¥)až)a—)a)a‰)a‚)a{)at)am)af)a_)aX)aQ)aJ)aC)a<)a5)a.)a')a )a)a)a )a)aý(aö(aï(aè(aá(aÚ(aÓ(aÌ(aÅ(a¾(a·(a°(a©(a¢(a›(a”(a(a†(a(ax(aq(aj(ac(a\(aU(aN(aG(a@(a9(a2(a+(a$(a(a(a(a(a(aú'aó'aì'aå'aÞ'a×'aÐ'aÉ'aÂ'a»'a´'a­'a¦'aŸ'a˜'a‘'aŠ'aƒ'a|'au'an'ag'a`'aY'aR'aK'aD'a='a6'a/'a('a!'a'a'a 'a'aþ&a÷&að&aé&aâ&aÛ&aÔ&aÍ&aÆ&a¿&a¸&a±&aª&a£&aœ&a•&aŽ&a‡&a€&ay&ar&ak&ad&a]&aV&aO&aH&aA&a:&a3&a,&a%&a&a&a&a &a&aû%aô%aí%aæ%aß%aØ%aÑ%aÊ%aÃ%a¼%aµ%a®%a§%a %a™%a’%a‹%a„%a}%av%ao%ah%aa%aZ%aS%aL%aE%a>%a7%a0%a)%a"%a%a%a %a%aÿ$aø$añ$aê$aã$aÜ$aÕ$aÎ$aÇ$aÀ$a¹$a²$a«$a¤$a$a–$a$aˆ$a$az$as$al$ae$a^$aW$aP$aI$aB$a;$a4$a-$a&$a$a$a$a $a$aü#aõ#aî#aç#aà#aÙ#aÒ#aË#aÄ#a½#a¶#a¯#a¨#a¡#aš#a“#aŒ#a…#a~#aw#ap#ai#ab#a[#aT#aM#aF#a?#a8#a1#a*#a##a#a#a#a#a#aù"aò"aë"aä"aÝ"aÖ"aÏ"aÈ"aÁ"aº"a³"a¬"a¥"až"a—"a"a‰"a‚"a{"at"am"af"a_"aX"aQ"aJ"aC"a<"a5"a."a'"a "a"a"a "a"aý!aö!aï!aè!aá!aÚ!aÓ!aÌ!aÅ!a¾!a·!a°!a©!a¢!a›!a”!a!a†!a!ax!aq!aj!ac!a\!aU!aN!aG!a@!a9!a2!a+!a$!a!a!a!a!a!aú aó aì aå aÞ a× aÐ aÉ a a» a´ a­ a¦ aŸ a˜ a‘ aŠ aƒ a| au an ag a` aY aR aK aD a= a6 a/ a( a! a a a a aþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûaôaíaæaßaØaÑaÊaÃa¼aµa®a§a a™a’a‹a„a}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa<a5a.a'a aaa aaýaöaïaèaáaÚaÓaÌaÅa¾a·a°a©a¢a›a”aa†aaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaúaóaìaåaÞa×aÐaÉaÂa»a´a­a¦aŸa˜a‘aŠaƒa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûaôaíaæaßaØaÑaÊaÃa¼aµa®a§a a™a’a‹a„a}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa<a5a.a'a aaa aaýaöaïaèaáaÚaÓaÌaÅa¾a·a°a©a¢a›a”aa†aaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaúaóaìaåaÞa×aÐaÉaÂa»a´a­a¦aŸa˜a‘aŠaƒa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûaôaíaæaßaØaÑaÊaÃa¼aµa®a§a a™a’a‹a„a}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù aò aë aä aÝ aÖ aÏ aÈ aÁ aº a³ a¬ a¥ až a— a a‰ a‚ a{ at am af a_ aX aQ aJ aC a< a5 a. a' a a a a a aý aö aï aè aá aÚ aÓ aÌ aÅ a¾ a· a° a© a¢ a› a” a a† a ax aq aj ac a\ aU aN aG a@ a9 a2 a+ a$ a a a a a aú aó aì aå aÞ a× aÐ aÉ a a» a´ a­ a¦ aŸ a˜ a‘ aŠ aƒ a| au an ag a` aY aR aK aD a= a6 a/ a( a! a a a a aþ a÷ að aé aâ aÛ aÔ aÍ aÆ a¿ a¸ a± aª a£ aœ a• aŽ a‡ a€ ay ar ak ad a] aV aO aH aA a: a3 a, a% a a a a a aû aô aí aæ aß aØ aÑ aÊ aà a¼ aµ a® a§ a  a™ a’ a‹ a„ a} av ao ah aa aZ aS aL aE a> a7 a0 a) a" a a a a aÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa<a5a.a'a aaa aaýaöaïaèaáaÚaÓaÌaÅa¾a·a°a©a¢a›a”aa†aaxaqajaca\aUaNaGa@a9a2a+a$aaaaaaúaóaìaåaÞa×aÐaÉaÂa»a´a­a¦aŸa˜a‘aŠaƒa|auanaga`aYaRaKaDa=a6a/a(a!aaa aaþa÷aðaéaâaÛaÔaÍaÆa¿a¸a±aªa£aœa•aŽa‡a€ayarakada]aVaOaHaAa:a3a,a%aaaa aaûaôaíaæaßaØaÑaÊaÃa¼aµa®a§a a™a’a‹a„a}avaoahaaaZaSaLaEa>a7a0a)a"aaa aaÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaùÿ`òÿ`ëÿ`äÿ`Ýÿ`Öÿ`Ïÿ`Èÿ`Áÿ`ºÿ`³ÿ`¬ÿ`¥ÿ`žÿ`—ÿ`ÿ`‰ÿ`‚ÿ`{ÿ`tÿ`mÿ`fÿ`_ÿ`Xÿ`Qÿ`Jÿ`Cÿ`<ÿ`5ÿ`.ÿ`'ÿ` ÿ`ÿ`ÿ` ÿ`ÿ`ýþ`öþ`ïþ`èþ`áþ`Úþ`Óþ`Ìþ`Åþ`¾þ`·þ`°þ`©þ`¢þ`›þ`”þ`þ`†þ`þ`xþ`qþ`jþ`cþ`\þ`Uþ`Nþ`Gþ`@þ`9þ`2þ`+þ`$þ`þ`þ`þ`þ`þ`úý`óý`ìý`åý`Þý`×ý`Ðý`Éý`Âý`»ý`´ý`­ý`¦ý`Ÿý`˜ý`‘ý`Šý`ƒý`|ý`uý`ný`gý``ý`Yý`Rý`Ký`Dý`=ý`6ý`/ý`(ý`!ý`ý`ý` ý`ý`þü`÷ü`ðü`éü`âü`Ûü`Ôü`Íü`Æü`¿ü`¸ü`±ü`ªü`£ü`œü`•ü`Žü`‡ü`€ü`yü`rü`kü`dü`]ü`Vü`Oü`Hü`Aü`:ü`3ü`,ü`%ü`ü`ü`ü` ü`ü`ûû`ôû`íû`æû`ßû`Øû`Ñû`Êû`Ãû`¼û`µû`®û`§û` û`™û`’û`‹û`„û`}û`vû`oû`hû`aû`Zû`Sû`Lû`Eû`>û`7û`0û`)û`"û`û`û` û`û`ÿú`øú`ñú`êú`ãú`Üú`Õú`Îú`Çú`Àú`¹ú`²ú`«ú`¤ú`ú`–ú`ú`ˆú`ú`zú`sú`lú`eú`^ú`Wú`Pú`Iú`Bú`;ú`4ú`-ú`&ú`ú`ú`ú` ú`ú`üù`õù`îù`çù`àù`Ùù`Òù`Ëù`Äù`½ù`¶ù`¯ù`¨ù`¡ù`šù`“ù`Œù`…ù`~ù`wù`pù`iù`bù`[ù`Tù`Mù`Fù`?ù`8ù`1ù`*ù`#ù`ù`ù`ù`ù`ù`ùø`òø`ëø`äø`Ýø`Öø`Ïø`Èø`Áø`ºø`³ø`¬ø`¥ø`žø`—ø`ø`‰ø`‚ø`{ø`tø`mø`fø`_ø`Xø`Qø`Jø`Cø`<ø`5ø`.ø`'ø` ø`ø`ø` ø`ø`ý÷`ö÷`ï÷`è÷`á÷`Ú÷`Ó÷`Ì÷`Å÷`¾÷`·÷`°÷`©÷`¢÷`›÷`”÷`÷`†÷`÷`x÷`q÷`j÷`c÷`\÷`U÷`N÷`G÷`@÷`9÷`2÷`+÷`$÷`÷`÷`÷`÷`÷`úö`óö`ìö`åö`Þö`×ö`Ðö`Éö`Âö`»ö`´ö`­ö`¦ö`Ÿö`˜ö`‘ö`Šö`ƒö`|ö`uö`nö`gö``ö`Yö`Rö`Kö`Dö`=ö`6ö`/ö`(ö`!ö`ö`ö` ö`ö`þõ`÷õ`ðõ`éõ`âõ`Ûõ`Ôõ`Íõ`Æõ`¿õ`¸õ`±õ`ªõ`£õ`œõ`•õ`Žõ`‡õ`€õ`yõ`rõ`kõ`dõ`]õ`Võ`Oõ`Hõ`Aõ`:õ`3õ`,õ`%õ`õ`õ`õ` õ`õ`ûô`ôô`íô`æô`ßô`Øô`Ñô`Êô`Ãô`¼ô`µô`®ô`§ô` ô`™ô`’ô`‹ô`„ô`}ô`vô`oô`hô`aô`Zô`Sô`Lô`Eô`>ô`7ô`0ô`)ô`"ô`ô`ô` ô`ô`ÿó`øó`ñó`êó`ãó`Üó`Õó`Îó`Çó`Àó`¹ó`²ó`«ó`¤ó`ó`–ó`ó`ˆó`ó`zó`só`ló`eó`^ó`Wó`Pó`Ió`Bó`;ó`4ó`-ó`&ó`ó`ó`ó` ó`ó`üò`õò`îò`çò`àò`Ùò`Òò`Ëò`Äò`½ò`¶ò`¯ò`¨ò`¡ò`šò`“ò`Œò`…ò`~ò`wò`pò`iò`bò`[ò`Tò`Mò`Fò`?ò`8ò`1ò`*ò`#ò`ò`ò`ò`ò`ò`ùñ`òñ`ëñ`äñ`Ýñ`Öñ`Ïñ`Èñ`Áñ`ºñ`³ñ`¬ñ`¥ñ`žñ`—ñ`ñ`‰ñ`‚ñ`{ñ`tñ`mñ`fñ`_ñ`Xñ`Qñ`Jñ`Cñ`<ñ`5ñ`.ñ`'ñ` ñ`ñ`ñ` ñ`ñ`ýð`öð`ïð`èð`áð`Úð`Óð`Ìð`Åð`¾ð`·ð`°ð`©ð`¢ð`›ð`”ð`ð`†ð`ð`xð`qð`jð`cð`\ð`Uð`Nð`Gð`@ð`9ð`2ð`+ð`$ð`ð`ð`ð`ð`ð`úï`óï`ìï`åï`Þï`×ï`Ðï`Éï`Âï`»ï`´ï`­ï`¦ï`Ÿï`˜ï`‘ï`Šï`ƒï`|ï`uï`nï`gï``ï`Yï`Rï`Kï`Dï`=ï`6ï`/ï`(ï`!ï`ï`ï` ï`ï`þî`÷î`ðî`éî`âî`Ûî`Ôî`Íî`Æî`¿î`¸î`±î`ªî`£î`œî`•î`Žî`‡î`€î`yî`rî`kî`dî`]î`Vî`Oî`Hî`Aî`:î`3î`,î`%î`î`î`î` î`î`ûí`ôí`íí`æí`ßí`Øí`Ñí`Êí`Ãí`¼í`µí`®í`§í` í`™í`’í`‹í`„í`}í`ví`oí`hí`aí`Zí`Sí`Lí`Eí`>í`7í`0í`)í`"í`í`í` í`í`ÿì`øì`ñì`êì`ãì`Üì`Õì`Îì`Çì`Àì`¹ì`²ì`«ì`¤ì`ì`–ì`ì`ˆì`ì`zì`sì`lì`eì`^ì`Wì`Pì`Iì`Bì`;ì`4ì`-ì`&ì`ì`ì`ì` ì`ì`üë`õë`îë`çë`àë`Ùë`Òë`Ëë`Äë`½ë`¶ë`¯ë`¨ë`¡ë`šë`“ë`Œë`…ë`~ë`wë`pë`ië`bë`[ë`Të`Më`Fë`?ë`8ë`1ë`*ë`#ë`ë`ë`ë`ë`ë`ùê`òê`ëê`äê`Ýê`Öê`Ïê`Èê`Áê`ºê`³ê`¬ê`¥ê`žê`—ê`ê`‰ê`‚ê`{ê`tê`mê`fê`_ê`Xê`Qê`Jê`Cê`<ê`5ê`.ê`'ê` ê`ê`ê` ê`ê`ýé`öé`ïé`èé`áé`Úé`Óé`Ìé`Åé`¾é`·é`°é`©é`¢é`›é`”é`é`†é`é`xé`qé`jé`cé`\é`Ué`Né`Gé`@é`9é`2é`+é`$é`é`é`é`é`é`úè`óè`ìè`åè`Þè`×è`Ðè`Éè`Âè`»è`´è`­è`¦è`Ÿè`˜è`‘è`Šè`ƒè`|è`uè`nè`gè``è`Yè`Rè`Kè`Dè`=è`6è`/è`(è`!è`è`è` è`è`þç`÷ç`ðç`éç`âç`Ûç`Ôç`Íç`Æç`¿ç`¸ç`±ç`ªç`£ç`œç`•ç`Žç`‡ç`€ç`yç`rç`kç`dç`]ç`Vç`Oç`Hç`Aç`:ç`3ç`,ç`%ç`ç`ç`ç` ç`ç`ûæ`ôæ`íæ`ææ`ßæ`Øæ`Ñæ`Êæ`Ãæ`¼æ`µæ`®æ`§æ` æ`™æ`’æ`‹æ`„æ`}æ`væ`oæ`hæ`aæ`Zæ`Sæ`Læ`Eæ`>æ`7æ`0æ`)æ`"æ`æ`æ` æ`æ`ÿå`øå`ñå`êå`ãå`Üå`Õå`Îå`Çå`Àå`¹å`²å`«å`¤å`å`–å`å`ˆå`å`zå`så`lå`eå`^å`Wå`På`Iå`Bå`;å`4å`-å`&å`å`å`å` å`å`üä`õä`îä`çä`àä`Ùä`Òä`Ëä`Ää`½ä`¶ä`¯ä`¨ä`¡ä`šä`“ä`Œä`…ä`~ä`wä`pä`iä`bä`[ä`Tä`Mä`Fä`?ä`8ä`1ä`*ä`#ä`ä`ä`ä`ä`ä`ùã`òã`ëã`äã`Ýã`Öã`Ïã`Èã`Áã`ºã`³ã`¬ã`¥ã`žã`—ã`ã`‰ã`‚ã`{ã`tã`mã`fã`_ã`Xã`Qã`Jã`Cã`<ã`5ã`.ã`'ã` ã`ã`ã` ã`ã`ýâ`öâ`ïâ`èâ`áâ`Úâ`Óâ`Ìâ`Åâ`¾â`·â`°â`©â`¢â`›â`”â`â`†â`â`xâ`qâ`jâ`câ`\â`Uâ`Nâ`Gâ`@â`9â`2â`+â`$â`â`â`â`â`â`úá`óá`ìá`åá`Þá`×á`Ðá`Éá`Âá`»á`´á`­á`¦á`Ÿá`˜á`‘á`Šá`ƒá`|á`uá`ná`gá``á`Yá`Rá`Ká`Dá`=á`6á`/á`(á`!á`á`á` á`á`þà`÷à`ðà`éà`âà`Ûà`Ôà`Íà`Æà`¿à`¸à`±à`ªà`£à`œà`•à`Žà`‡à`€à`yà`rà`kà`dà`]à`Và`Oà`Hà`Aà`:à`3à`,à`%à`à`à`à` à`à`ûß`ôß`íß`æß`ßß`Øß`Ñß`Êß`Ãß`¼ß`µß`®ß`§ß` ß`™ß`’ß`‹ß`„ß`}ß`vß`oß`hß`aß`Zß`Sß`Lß`Eß`>ß`7ß`0ß`)ß`"ß`ß`ß` ß`ß`ÿÞ`øÞ`ñÞ`êÞ`ãÞ`ÜÞ`ÕÞ`ÎÞ`ÇÞ`ÀÞ`¹Þ`²Þ`«Þ`¤Þ`Þ`–Þ`Þ`ˆÞ`Þ`zÞ`sÞ`lÞ`eÞ`^Þ`WÞ`PÞ`IÞ`BÞ`;Þ`4Þ`-Þ`&Þ`Þ`Þ`Þ` Þ`Þ`üÝ`õÝ`îÝ`çÝ`àÝ`ÙÝ`ÒÝ`ËÝ`ÄÝ`½Ý`¶Ý`¯Ý`¨Ý`¡Ý`šÝ`“Ý`ŒÝ`…Ý`~Ý`wÝ`pÝ`iÝ`bÝ`[Ý`TÝ`MÝ`FÝ`?Ý`8Ý`1Ý`*Ý`#Ý`Ý`Ý`Ý`Ý`Ý`ùÜ`òÜ`ëÜ`äÜ`ÝÜ`ÖÜ`ÏÜ`ÈÜ`ÁÜ`ºÜ`³Ü`¬Ü`¥Ü`žÜ`—Ü`Ü`‰Ü`‚Ü`{Ü`tÜ`mÜ`fÜ`_Ü`XÜ`QÜ`JÜ`CÜ`<Ü`5Ü`.Ü`'Ü` Ü`Ü`Ü` Ü`Ü`ýÛ`öÛ`ïÛ`èÛ`áÛ`ÚÛ`ÓÛ`ÌÛ`ÅÛ`¾Û`·Û`°Û`©Û`¢Û`›Û`”Û`Û`†Û`Û`xÛ`qÛ`jÛ`cÛ`\Û`UÛ`NÛ`GÛ`@Û`9Û`2Û`+Û`$Û`Û`Û`Û`Û`Û`úÚ`óÚ`ìÚ`åÚ`ÞÚ`×Ú`ÐÚ`ÉÚ`ÂÚ`»Ú`´Ú`­Ú`¦Ú`ŸÚ`˜Ú`‘Ú`ŠÚ`ƒÚ`|Ú`uÚ`nÚ`gÚ``Ú`YÚ`RÚ`KÚ`DÚ`=Ú`6Ú`/Ú`(Ú`!Ú`Ú`Ú` Ú`Ú`þÙ`÷Ù`ðÙ`éÙ`âÙ`ÛÙ`ÔÙ`ÍÙ`ÆÙ`¿Ù`¸Ù`±Ù`ªÙ`£Ù`œÙ`•Ù`ŽÙ`‡Ù`€Ù`yÙ`rÙ`kÙ`dÙ`]Ù`VÙ`OÙ`HÙ`AÙ`:Ù`3Ù`,Ù`%Ù`Ù`Ù`Ù` Ù`Ù`ûØ`ôØ`íØ`æØ`ߨ`ØØ`ÑØ`ÊØ`ÃØ`¼Ø`µØ`®Ø`§Ø` Ø`™Ø`’Ø`‹Ø`„Ø`}Ø`vØ`oØ`hØ`aØ`ZØ`SØ`LØ`EØ`>Ø`7Ø`0Ø`)Ø`"Ø`Ø`Ø` Ø`Ø`ÿ×`ø×`ñ×`ê×`ã×`Ü×`Õ×`Î×`Ç×`À×`¹×`²×`«×`¤×`×`–×`×`ˆ×`×`z×`s×`l×`e×`^×`W×`P×`I×`B×`;×`4×`-×`&×`×`×`×` ×`×`üÖ`õÖ`îÖ`çÖ`àÖ`ÙÖ`ÒÖ`ËÖ`ÄÖ`½Ö`¶Ö`¯Ö`¨Ö`¡Ö`šÖ`“Ö`ŒÖ`…Ö`~Ö`wÖ`pÖ`iÖ`bÖ`[Ö`TÖ`MÖ`FÖ`?Ö`8Ö`1Ö`*Ö`#Ö`Ö`Ö`Ö`Ö`Ö`ùÕ`òÕ`ëÕ`äÕ`ÝÕ`ÖÕ`ÏÕ`ÈÕ`ÁÕ`ºÕ`³Õ`¬Õ`¥Õ`žÕ`—Õ`Õ`‰Õ`‚Õ`{Õ`tÕ`mÕ`fÕ`_Õ`XÕ`QÕ`JÕ`CÕ`<Õ`5Õ`.Õ`'Õ` Õ`Õ`Õ` Õ`Õ`ýÔ`öÔ`ïÔ`èÔ`áÔ`ÚÔ`ÓÔ`ÌÔ`ÅÔ`¾Ô`·Ô`°Ô`©Ô`¢Ô`›Ô`”Ô`Ô`†Ô`Ô`xÔ`qÔ`jÔ`cÔ`\Ô`UÔ`NÔ`GÔ`@Ô`9Ô`2Ô`+Ô`$Ô`Ô`Ô`Ô`Ô`Ô`úÓ`óÓ`ìÓ`åÓ`ÞÓ`×Ó`ÐÓ`ÉÓ`ÂÓ`»Ó`´Ó`­Ó`¦Ó`ŸÓ`˜Ó`‘Ó`ŠÓ`ƒÓ`|Ó`uÓ`nÓ`gÓ``Ó`YÓ`RÓ`KÓ`DÓ`=Ó`6Ó`/Ó`(Ó`!Ó`Ó`Ó` Ó`Ó`þÒ`÷Ò`ðÒ`éÒ`âÒ`ÛÒ`ÔÒ`ÍÒ`ÆÒ`¿Ò`¸Ò`±Ò`ªÒ`£Ò`œÒ`•Ò`ŽÒ`‡Ò`€Ò`yÒ`rÒ`kÒ`dÒ`]Ò`VÒ`OÒ`HÒ`AÒ`:Ò`3Ò`,Ò`%Ò`Ò`Ò`Ò` Ò`Ò`ûÑ`ôÑ`íÑ`æÑ`ßÑ`ØÑ`ÑÑ`ÊÑ`ÃÑ`¼Ñ`µÑ`®Ñ`§Ñ` Ñ`™Ñ`’Ñ`‹Ñ`„Ñ`}Ñ`vÑ`oÑ`hÑ`aÑ`ZÑ`SÑ`LÑ`EÑ`>Ñ`7Ñ`0Ñ`)Ñ`"Ñ`Ñ`Ñ` Ñ`Ñ`ÿÐ`øÐ`ñÐ`êÐ`ãÐ`ÜÐ`ÕÐ`ÎÐ`ÇÐ`ÀÐ`¹Ð`²Ð`«Ð`¤Ð`Ð`–Ð`Ð`ˆÐ`Ð`zÐ`sÐ`lÐ`eÐ`^Ð`WÐ`PÐ`IÐ`BÐ`;Ð`4Ð`-Ð`&Ð`Ð`Ð`Ð` Ð`Ð`üÏ`õÏ`îÏ`çÏ`àÏ`ÙÏ`ÒÏ`ËÏ`ÄÏ`½Ï`¶Ï`¯Ï`¨Ï`¡Ï`šÏ`“Ï`ŒÏ`…Ï`~Ï`wÏ`pÏ`iÏ`bÏ`[Ï`TÏ`MÏ`FÏ`?Ï`8Ï`1Ï`*Ï`#Ï`Ï`Ï`Ï`Ï`Ï`ùÎ`òÎ`ëÎ`äÎ`ÝÎ`ÖÎ`ÏÎ`ÈÎ`ÁÎ`ºÎ`³Î`¬Î`¥Î`žÎ`—Î`Î`‰Î`‚Î`{Î`tÎ`mÎ`fÎ`_Î`XÎ`QÎ`JÎ`CÎ`<Î`5Î`.Î`'Î` Î`Î`Î` Î`Î`ýÍ`öÍ`ïÍ`èÍ`áÍ`ÚÍ`ÓÍ`ÌÍ`ÅÍ`¾Í`·Í`°Í`©Í`¢Í`›Í`”Í`Í`†Í`Í`xÍ`qÍ`jÍ`cÍ`\Í`UÍ`NÍ`GÍ`@Í`9Í`2Í`+Í`$Í`Í`Í`Í`Í`Í`úÌ`óÌ`ìÌ`åÌ`ÞÌ`×Ì`ÐÌ`ÉÌ`ÂÌ`»Ì`´Ì`­Ì`¦Ì`ŸÌ`˜Ì`‘Ì`ŠÌ`ƒÌ`|Ì`uÌ`nÌ`gÌ``Ì`YÌ`RÌ`KÌ`DÌ`=Ì`6Ì`/Ì`(Ì`!Ì`Ì`Ì` Ì`Ì`þË`÷Ë`ðË`éË`âË`ÛË`ÔË`ÍË`ÆË`¿Ë`¸Ë`±Ë`ªË`£Ë`œË`•Ë`ŽË`‡Ë`€Ë`yË`rË`kË`dË`]Ë`VË`OË`HË`AË`:Ë`3Ë`,Ë`%Ë`Ë`Ë`Ë` Ë`Ë`ûÊ`ôÊ`íÊ`æÊ`ßÊ`ØÊ`ÑÊ`ÊÊ`ÃÊ`¼Ê`µÊ`®Ê`§Ê` Ê`™Ê`’Ê`‹Ê`„Ê`}Ê`vÊ`oÊ`hÊ`aÊ`ZÊ`SÊ`LÊ`EÊ`>Ê`7Ê`0Ê`)Ê`"Ê`Ê`Ê` Ê`Ê`ÿÉ`øÉ`ñÉ`êÉ`ãÉ`ÜÉ`ÕÉ`ÎÉ`ÇÉ`ÀÉ`¹É`²É`«É`¤É`É`–É`É`ˆÉ`É`zÉ`sÉ`lÉ`eÉ`^É`WÉ`PÉ`IÉ`BÉ`;É`4É`-É`&É`É`É`É` É`É`üÈ`õÈ`îÈ`çÈ`àÈ`ÙÈ`ÒÈ`ËÈ`ÄÈ`½È`¶È`¯È`¨È`¡È`šÈ`“È`ŒÈ`…È`~È`wÈ`pÈ`iÈ`bÈ`[È`TÈ`MÈ`FÈ`?È`8È`1È`*È`#È`È`È`È`È`È`ùÇ`òÇ`ëÇ`äÇ`ÝÇ`ÖÇ`ÏÇ`ÈÇ`ÁÇ`ºÇ`³Ç`¬Ç`¥Ç`žÇ`—Ç`Ç`‰Ç`‚Ç`{Ç`tÇ`mÇ`fÇ`_Ç`XÇ`QÇ`JÇ`CÇ`<Ç`5Ç`.Ç`'Ç` Ç`Ç`Ç` Ç`Ç`ýÆ`öÆ`ïÆ`èÆ`áÆ`ÚÆ`ÓÆ`ÌÆ`ÅÆ`¾Æ`·Æ`°Æ`©Æ`¢Æ`›Æ`”Æ`Æ`†Æ`Æ`xÆ`qÆ`jÆ`cÆ`\Æ`UÆ`NÆ`GÆ`@Æ`9Æ`2Æ`+Æ`$Æ`Æ`Æ`Æ`Æ`Æ`úÅ`óÅ`ìÅ`åÅ`ÞÅ`×Å`ÐÅ`ÉÅ`ÂÅ`»Å`´Å`­Å`¦Å`ŸÅ`˜Å`‘Å`ŠÅ`ƒÅ`|Å`uÅ`nÅ`gÅ``Å`YÅ`RÅ`KÅ`DÅ`=Å`6Å`/Å`(Å`!Å`Å`Å` Å`Å`þÄ`÷Ä`ðÄ`éÄ`âÄ`ÛÄ`ÔÄ`ÍÄ`ÆÄ`¿Ä`¸Ä`±Ä`ªÄ`£Ä`œÄ`•Ä`ŽÄ`‡Ä`€Ä`yÄ`rÄ`kÄ`dÄ`]Ä`VÄ`OÄ`HÄ`AÄ`:Ä`3Ä`,Ä`%Ä`Ä`Ä`Ä` Ä`Ä`ûÃ`ôÃ`íÃ`æÃ`ßÃ`ØÃ`ÑÃ`ÊÃ`ÃÃ`¼Ã`µÃ`®Ã`§Ã` Ã`™Ã`’Ã`‹Ã`„Ã`}Ã`vÃ`oÃ`hÃ`aÃ`ZÃ`SÃ`LÃ`EÃ`>Ã`7Ã`0Ã`)Ã`"Ã`Ã`Ã` Ã`Ã`ÿÂ`øÂ`ñÂ`êÂ`ãÂ`ÜÂ`ÕÂ`ÎÂ`ÇÂ`ÀÂ`¹Â`²Â`«Â`¤Â`Â`–Â`Â`ˆÂ`Â`zÂ`sÂ`lÂ`eÂ`^Â`WÂ`PÂ`IÂ`BÂ`;Â`4Â`-Â`&Â`Â`Â`Â` Â`Â`üÁ`õÁ`îÁ`çÁ`àÁ`ÙÁ`ÒÁ`ËÁ`ÄÁ`½Á`¶Á`¯Á`¨Á`¡Á`šÁ`“Á`ŒÁ`…Á`~Á`wÁ`pÁ`iÁ`bÁ`[Á`TÁ`MÁ`FÁ`?Á`8Á`1Á`*Á`#Á`Á`Á`Á`Á`Á`ùÀ`òÀ`ëÀ`äÀ`ÝÀ`ÖÀ`ÏÀ`ÈÀ`ÁÀ`ºÀ`³À`¬À`¥À`žÀ`—À`À`‰À`‚À`{À`tÀ`mÀ`fÀ`_À`XÀ`QÀ`JÀ`CÀ`<À`5À`.À`'À` À`À`À` À`À`ý¿`ö¿`ï¿`è¿`á¿`Ú¿`Ó¿`Ì¿`Å¿`¾¿`·¿`°¿`©¿`¢¿`›¿`”¿`¿`†¿`¿`x¿`q¿`j¿`c¿`\¿`U¿`N¿`G¿`@¿`9¿`2¿`+¿`$¿`¿`¿`¿`¿`¿`ú¾`ó¾`ì¾`å¾`Þ¾`×¾`о`ɾ`¾`»¾`´¾`­¾`¦¾`Ÿ¾`˜¾`‘¾`о`ƒ¾`|¾`u¾`n¾`g¾``¾`Y¾`R¾`K¾`D¾`=¾`6¾`/¾`(¾`!¾`¾`¾` ¾`¾`þ½`÷½`ð½`é½`â½`Û½`Ô½`ͽ`ƽ`¿½`¸½`±½`ª½`£½`œ½`•½`޽`‡½`€½`y½`r½`k½`d½`]½`V½`O½`H½`A½`:½`3½`,½`%½`½`½`½` ½`½`û¼`ô¼`í¼`æ¼`ß¼`ؼ`Ѽ`ʼ`ü`¼¼`µ¼`®¼`§¼` ¼`™¼`’¼`‹¼`„¼`}¼`v¼`o¼`h¼`a¼`Z¼`S¼`L¼`E¼`>¼`7¼`0¼`)¼`"¼`¼`¼` ¼`¼`ÿ»`ø»`ñ»`ê»`ã»`Ü»`Õ»`λ`Ç»`À»`¹»`²»`«»`¤»`»`–»`»`ˆ»`»`z»`s»`l»`e»`^»`W»`P»`I»`B»`;»`4»`-»`&»`»`»`»` »`»`üº`õº`îº`çº`àº`Ùº`Òº`˺`ĺ`½º`¶º`¯º`¨º`¡º`šº`“º`Œº`…º`~º`wº`pº`iº`bº`[º`Tº`Mº`Fº`?º`8º`1º`*º`#º`º`º`º`º`º`ù¹`ò¹`ë¹`ä¹`ݹ`Ö¹`Ϲ`ȹ`Á¹`º¹`³¹`¬¹`¥¹`ž¹`—¹`¹`‰¹`‚¹`{¹`t¹`m¹`f¹`_¹`X¹`Q¹`J¹`C¹`<¹`5¹`.¹`'¹` ¹`¹`¹` ¹`¹`ý¸`ö¸`ï¸`è¸`á¸`Ú¸`Ó¸`̸`Ÿ`¾¸`·¸`°¸`©¸`¢¸`›¸`”¸`¸`†¸`¸`x¸`q¸`j¸`c¸`\¸`U¸`N¸`G¸`@¸`9¸`2¸`+¸`$¸`¸`¸`¸`¸`¸`ú·`ó·`ì·`å·`Þ·`×·`з`É·`·`»·`´·`­·`¦·`Ÿ·`˜·`‘·`Š·`ƒ·`|·`u·`n·`g·``·`Y·`R·`K·`D·`=·`6·`/·`(·`!·`·`·` ·`·`þ¶`÷¶`ð¶`é¶`â¶`Û¶`Ô¶`Ͷ`ƶ`¿¶`¸¶`±¶`ª¶`£¶`œ¶`•¶`޶`‡¶`€¶`y¶`r¶`k¶`d¶`]¶`V¶`O¶`H¶`A¶`:¶`3¶`,¶`%¶`¶`¶`¶` ¶`¶`ûµ`ôµ`íµ`æµ`ßµ`ص`ѵ`ʵ`õ`¼µ`µµ`®µ`§µ` µ`™µ`’µ`‹µ`„µ`}µ`vµ`oµ`hµ`aµ`Zµ`Sµ`Lµ`Eµ`>µ`7µ`0µ`)µ`"µ`µ`µ` µ`µ`ÿ´`ø´`ñ´`ê´`ã´`Ü´`Õ´`δ`Ç´`À´`¹´`²´`«´`¤´`´`–´`´`ˆ´`´`z´`s´`l´`e´`^´`W´`P´`I´`B´`;´`4´`-´`&´`´`´`´` ´`´`ü³`õ³`î³`ç³`à³`Ù³`Ò³`˳`ij`½³`¶³`¯³`¨³`¡³`š³`“³`Œ³`…³`~³`w³`p³`i³`b³`[³`T³`M³`F³`?³`8³`1³`*³`#³`³`³`³`³`³`ù²`ò²`ë²`ä²`ݲ`Ö²`ϲ`Ȳ`Á²`º²`³²`¬²`¥²`ž²`—²`²`‰²`‚²`{²`t²`m²`f²`_²`X²`Q²`J²`C²`<²`5²`.²`'²` ²`²`²` ²`²`ý±`ö±`ï±`è±`á±`Ú±`Ó±`̱`ű`¾±`·±`°±`©±`¢±`›±`”±`±`†±`±`x±`q±`j±`c±`\±`U±`N±`G±`@±`9±`2±`+±`$±`±`±`±`±`±`ú°`ó°`ì°`å°`Þ°`×°`а`ɰ`°`»°`´°`­°`¦°`Ÿ°`˜°`‘°`а`ƒ°`|°`u°`n°`g°``°`Y°`R°`K°`D°`=°`6°`/°`(°`!°`°`°` °`°`þ¯`÷¯`ð¯`é¯`â¯`Û¯`Ô¯`ͯ`Ư`¿¯`¸¯`±¯`ª¯`£¯`œ¯`•¯`ޝ`‡¯`€¯`y¯`r¯`k¯`d¯`]¯`V¯`O¯`H¯`A¯`:¯`3¯`,¯`%¯`¯`¯`¯` ¯`¯`û®`ô®`í®`æ®`ß®`Ø®`Ñ®`Ê®`î`¼®`µ®`®®`§®` ®`™®`’®`‹®`„®`}®`v®`o®`h®`a®`Z®`S®`L®`E®`>®`7®`0®`)®`"®`®`®` ®`®`ÿ­`ø­`ñ­`ê­`ã­`Ü­`Õ­`έ`Ç­`À­`¹­`²­`«­`¤­`­`–­`­`ˆ­`­`z­`s­`l­`e­`^­`W­`P­`I­`B­`;­`4­`-­`&­`­`­`­` ­`­`ü¬`õ¬`î¬`ç¬`à¬`Ù¬`Ò¬`ˬ`Ĭ`½¬`¶¬`¯¬`¨¬`¡¬`š¬`“¬`Œ¬`…¬`~¬`w¬`p¬`i¬`b¬`[¬`T¬`M¬`F¬`?¬`8¬`1¬`*¬`#¬`¬`¬`¬`¬`¬`ù«`ò«`ë«`ä«`Ý«`Ö«`Ï«`È«`Á«`º«`³«`¬«`¥«`ž«`—«`«`‰«`‚«`{«`t«`m«`f«`_«`X«`Q«`J«`C«`<«`5«`.«`'«` «`«`«` «`«`ýª`öª`ïª`èª`áª`Úª`Óª`̪`Ū`¾ª`·ª`°ª`©ª`¢ª`›ª`”ª`ª`†ª`ª`xª`qª`jª`cª`\ª`Uª`Nª`Gª`@ª`9ª`2ª`+ª`$ª`ª`ª`ª`ª`ª`ú©`ó©`ì©`å©`Þ©`ש`Щ`É©`©`»©`´©`­©`¦©`Ÿ©`˜©`‘©`Š©`ƒ©`|©`u©`n©`g©``©`Y©`R©`K©`D©`=©`6©`/©`(©`!©`©`©` ©`©`þ¨`÷¨`ð¨`é¨`â¨`Û¨`Ô¨`ͨ`ƨ`¿¨`¸¨`±¨`ª¨`£¨`œ¨`•¨`ލ`‡¨`€¨`y¨`r¨`k¨`d¨`]¨`V¨`O¨`H¨`A¨`:¨`3¨`,¨`%¨`¨`¨`¨` ¨`¨`û§`ô§`í§`æ§`ß§`ا`ѧ`ʧ`ç`¼§`µ§`®§`§§` §`™§`’§`‹§`„§`}§`v§`o§`h§`a§`Z§`S§`L§`E§`>§`7§`0§`)§`"§`§`§` §`§`ÿ¦`ø¦`ñ¦`ê¦`ã¦`ܦ`Õ¦`Φ`Ǧ`À¦`¹¦`²¦`«¦`¤¦`¦`–¦`¦`ˆ¦`¦`z¦`s¦`l¦`e¦`^¦`W¦`P¦`I¦`B¦`;¦`4¦`-¦`&¦`¦`¦`¦` ¦`¦`ü¥`õ¥`î¥`ç¥`à¥`Ù¥`Ò¥`Ë¥`Ä¥`½¥`¶¥`¯¥`¨¥`¡¥`š¥`“¥`Œ¥`…¥`~¥`w¥`p¥`i¥`b¥`[¥`T¥`M¥`F¥`?¥`8¥`1¥`*¥`#¥`¥`¥`¥`¥`¥`ù¤`ò¤`ë¤`ä¤`ݤ`Ö¤`Ϥ`Ȥ`Á¤`º¤`³¤`¬¤`¥¤`ž¤`—¤`¤`‰¤`‚¤`{¤`t¤`m¤`f¤`_¤`X¤`Q¤`J¤`C¤`<¤`5¤`.¤`'¤` ¤`¤`¤` ¤`¤`ý£`ö£`ï£`è£`á£`Ú£`Ó£`Ì£`Å£`¾£`·£`°£`©£`¢£`›£`”£`£`†£`£`x£`q£`j£`c£`\£`U£`N£`G£`@£`9£`2£`+£`$£`£`£`£`£`£`ú¢`ó¢`ì¢`å¢`Þ¢`×¢`Т`É¢`¢`»¢`´¢`­¢`¦¢`Ÿ¢`˜¢`‘¢`Š¢`ƒ¢`|¢`u¢`n¢`g¢``¢`Y¢`R¢`K¢`D¢`=¢`6¢`/¢`(¢`!¢`¢`¢` ¢`¢`þ¡`÷¡`ð¡`é¡`â¡`Û¡`Ô¡`Í¡`Æ¡`¿¡`¸¡`±¡`ª¡`£¡`œ¡`•¡`Ž¡`‡¡`€¡`y¡`r¡`k¡`d¡`]¡`V¡`O¡`H¡`A¡`:¡`3¡`,¡`%¡`¡`¡`¡` ¡`¡`û `ô `í `æ `ß `Ø `Ñ `Ê `à`¼ `µ `® `§ `  `™ `’ `‹ `„ `} `v `o `h `a `Z `S `L `E `> `7 `0 `) `" ` ` `  ` `ÿŸ`øŸ`ñŸ`êŸ`ãŸ`ÜŸ`ÕŸ`Ο`ÇŸ`ÀŸ`¹Ÿ`²Ÿ`«Ÿ`¤Ÿ`Ÿ`–Ÿ`Ÿ`ˆŸ`Ÿ`zŸ`sŸ`lŸ`eŸ`^Ÿ`WŸ`PŸ`IŸ`BŸ`;Ÿ`4Ÿ`-Ÿ`&Ÿ`Ÿ`Ÿ`Ÿ` Ÿ`Ÿ`üž`õž`îž`çž`àž`Ùž`Òž`Ëž`Äž`½ž`¶ž`¯ž`¨ž`¡ž`šž`“ž`Œž`…ž`~ž`wž`pž`iž`bž`[ž`Tž`Mž`Fž`?ž`8ž`1ž`*ž`#ž`ž`ž`ž`ž`ž`ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ýœ`öœ`ïœ`èœ`áœ`Úœ`Óœ`Ìœ`Åœ`¾œ`·œ`°œ`©œ`¢œ`›œ`”œ`œ`†œ`œ`xœ`qœ`jœ`cœ`\œ`Uœ`Nœ`Gœ`@œ`9œ`2œ`+œ`$œ`œ`œ`œ`œ`œ`ú›`ó›`ì›`å›`Þ›`×›`Л`É›`›`»›`´›`­›`¦›`Ÿ›`˜›`‘›`Š›`ƒ›`|›`u›`n›`g›``›`Y›`R›`K›`D›`=›`6›`/›`(›`!›`›`›` ›`›`þš`÷š`ðš`éš`âš`Ûš`Ôš`Íš`Æš`¿š`¸š`±š`ªš`£š`œš`•š`Žš`‡š`€š`yš`rš`kš`dš`]š`Vš`Oš`Hš`Aš`:š`3š`,š`%š`š`š`š` š`š`û™`ô™`í™`æ™`ß™`Ø™`Ñ™`Ê™`Ù`¼™`µ™`®™`§™` ™`™™`’™`‹™`„™`}™`v™`o™`h™`a™`Z™`S™`L™`E™`>™`7™`0™`)™`"™`™`™` ™`™`ÿ˜`ø˜`ñ˜`ê˜`ã˜`ܘ`Õ˜`Θ`ǘ`À˜`¹˜`²˜`«˜`¤˜`˜`–˜`˜`ˆ˜`˜`z˜`s˜`l˜`e˜`^˜`W˜`P˜`I˜`B˜`;˜`4˜`-˜`&˜`˜`˜`˜` ˜`˜`ü—`õ—`î—`ç—`à—`Ù—`Ò—`Ë—`Ä—`½—`¶—`¯—`¨—`¡—`š—`“—`Œ—`…—`~—`w—`p—`i—`b—`[—`T—`M—`F—`?—`8—`1—`*—`#—`—`—`—`—`—`ù–`ò–`ë–`ä–`Ý–`Ö–`Ï–`È–`Á–`º–`³–`¬–`¥–`ž–`—–`–`‰–`‚–`{–`t–`m–`f–`_–`X–`Q–`J–`C–`<–`5–`.–`'–` –`–`–` –`–`ý•`ö•`ï•`è•`á•`Ú•`Ó•`Ì•`Å•`¾•`·•`°•`©•`¢•`›•`”•`•`†•`•`x•`q•`j•`c•`\•`U•`N•`G•`@•`9•`2•`+•`$•`•`•`•`•`•`ú”`ó”`ì”`å”`Þ”`×”`Д`É”`”`»”`´”`­”`¦”`Ÿ”`˜”`‘”`Š”`ƒ”`|”`u”`n”`g”``”`Y”`R”`K”`D”`=”`6”`/”`(”`!”`”`”` ”`”`þ“`÷“`ð“`é“`â“`Û“`Ô“`Í“`Æ“`¿“`¸“`±“`ª“`£“`œ“`•“`Ž“`‡“`€“`y“`r“`k“`d“`]“`V“`O“`H“`A“`:“`3“`,“`%“`“`“`“` “`“`û’`ô’`í’`æ’`ß’`Ø’`Ñ’`Ê’`Ã’`¼’`µ’`®’`§’` ’`™’`’’`‹’`„’`}’`v’`o’`h’`a’`Z’`S’`L’`E’`>’`7’`0’`)’`"’`’`’` ’`’`ÿ‘`ø‘`ñ‘`ê‘`ã‘`Ü‘`Õ‘`Α`Ç‘`À‘`¹‘`²‘`«‘`¤‘`‘`–‘`‘`ˆ‘`‘`z‘`s‘`l‘`e‘`^‘`W‘`P‘`I‘`B‘`;‘`4‘`-‘`&‘`‘`‘`‘` ‘`‘`ü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ýŽ`öŽ`ïŽ`èŽ`áŽ`ÚŽ`ÓŽ`ÌŽ`ÅŽ`¾Ž`·Ž`°Ž`©Ž`¢Ž`›Ž`”Ž`Ž`†Ž`Ž`xŽ`qŽ`jŽ`cŽ`\Ž`UŽ`NŽ`GŽ`@Ž`9Ž`2Ž`+Ž`$Ž`Ž`Ž`Ž`Ž`Ž`ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þŒ`÷Œ`ðŒ`éŒ`âŒ`ÛŒ`ÔŒ`ÍŒ`ÆŒ`¿Œ`¸Œ`±Œ`ªŒ`£Œ`œŒ`•Œ`ŽŒ`‡Œ`€Œ`yŒ`rŒ`kŒ`dŒ`]Œ`VŒ`OŒ`HŒ`AŒ`:Œ`3Œ`,Œ`%Œ`Œ`Œ`Œ` Œ`Œ`û‹`ô‹`í‹`æ‹`ß‹`Ø‹`Ñ‹`Ê‹`Ë`¼‹`µ‹`®‹`§‹` ‹`™‹`’‹`‹‹`„‹`}‹`v‹`o‹`h‹`a‹`Z‹`S‹`L‹`E‹`>‹`7‹`0‹`)‹`"‹`‹`‹` ‹`‹`ÿŠ`øŠ`ñŠ`êŠ`ãŠ`ÜŠ`ÕŠ`Ί`ÇŠ`ÀŠ`¹Š`²Š`«Š`¤Š`Š`–Š`Š`ˆŠ`Š`zŠ`sŠ`lŠ`eŠ`^Š`WŠ`PŠ`IŠ`BŠ`;Š`4Š`-Š`&Š`Š`Š`Š` Š`Š`ü‰`õ‰`î‰`ç‰`à‰`Ù‰`Ò‰`ˉ`ĉ`½‰`¶‰`¯‰`¨‰`¡‰`š‰`“‰`Œ‰`…‰`~‰`w‰`p‰`i‰`b‰`[‰`T‰`M‰`F‰`?‰`8‰`1‰`*‰`#‰`‰`‰`‰`‰`‰`ùˆ`òˆ`ëˆ`äˆ`݈`Öˆ`ψ`Ȉ`Áˆ`ºˆ`³ˆ`¬ˆ`¥ˆ`žˆ`—ˆ`ˆ`‰ˆ`‚ˆ`{ˆ`tˆ`mˆ`fˆ`_ˆ`Xˆ`Qˆ`Jˆ`Cˆ`<ˆ`5ˆ`.ˆ`'ˆ` ˆ`ˆ`ˆ` ˆ`ˆ`ý‡`ö‡`ï‡`è‡`á‡`Ú‡`Ó‡`̇`Ň`¾‡`·‡`°‡`©‡`¢‡`›‡`”‡`‡`†‡`‡`x‡`q‡`j‡`c‡`\‡`U‡`N‡`G‡`@‡`9‡`2‡`+‡`$‡`‡`‡`‡`‡`‡`ú†`ó†`ì†`å†`Þ†`׆`І`Ɇ`†`»†`´†`­†`¦†`Ÿ†`˜†`‘†`І`ƒ†`|†`u†`n†`g†``†`Y†`R†`K†`D†`=†`6†`/†`(†`!†`†`†` †`†`þ…`÷…`ð…`é…`â…`Û…`Ô…`Í…`Æ…`¿…`¸…`±…`ª…`£…`œ…`•…`Ž…`‡…`€…`y…`r…`k…`d…`]…`V…`O…`H…`A…`:…`3…`,…`%…`…`…`…` …`…`û„`ô„`í„`æ„`ß„`Ø„`Ñ„`Ê„`Ä`¼„`µ„`®„`§„` „`™„`’„`‹„`„„`}„`v„`o„`h„`a„`Z„`S„`L„`E„`>„`7„`0„`)„`"„`„`„` „`„`ÿƒ`øƒ`ñƒ`êƒ`ãƒ`܃`Õƒ`΃`ǃ`Àƒ`¹ƒ`²ƒ`«ƒ`¤ƒ`ƒ`–ƒ`ƒ`ˆƒ`ƒ`zƒ`sƒ`lƒ`eƒ`^ƒ`Wƒ`Pƒ`Iƒ`Bƒ`;ƒ`4ƒ`-ƒ`&ƒ`ƒ`ƒ`ƒ` ƒ`ƒ`ü‚`õ‚`î‚`ç‚`à‚`Ù‚`Ò‚`Ë‚`Ä‚`½‚`¶‚`¯‚`¨‚`¡‚`š‚`“‚`Œ‚`…‚`~‚`w‚`p‚`i‚`b‚`[‚`T‚`M‚`F‚`?‚`8‚`1‚`*‚`#‚`‚`‚`‚`‚`‚`ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý€`ö€`ï€`è€`á€`Ú€`Ó€`Ì€`Å€`¾€`·€`°€`©€`¢€`›€`”€`€`†€`€`x€`q€`j€`c€`\€`U€`N€`G€`@€`9€`2€`+€`$€`€`€`€`€`€`ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ~`÷~`ð~`é~`â~`Û~`Ô~`Í~`Æ~`¿~`¸~`±~`ª~`£~`œ~`•~`Ž~`‡~`€~`y~`r~`k~`d~`]~`V~`O~`H~`A~`:~`3~`,~`%~`~`~`~` ~`~`û}`ô}`í}`æ}`ß}`Ø}`Ñ}`Ê}`Ã}`¼}`µ}`®}`§}` }`™}`’}`‹}`„}`}}`v}`o}`h}`a}`Z}`S}`L}`E}`>}`7}`0}`)}`"}`}`}` }`}`ÿ|`ø|`ñ|`ê|`ã|`Ü|`Õ|`Î|`Ç|`À|`¹|`²|`«|`¤|`|`–|`|`ˆ|`|`z|`s|`l|`e|`^|`W|`P|`I|`B|`;|`4|`-|`&|`|`|`|` |`|`ü{`õ{`î{`ç{`à{`Ù{`Ò{`Ë{`Ä{`½{`¶{`¯{`¨{`¡{`š{`“{`Œ{`…{`~{`w{`p{`i{`b{`[{`T{`M{`F{`?{`8{`1{`*{`#{`{`{`{`{`{`ùz`òz`ëz`äz`Ýz`Öz`Ïz`Èz`Áz`ºz`³z`¬z`¥z`žz`—z`z`‰z`‚z`{z`tz`mz`fz`_z`Xz`Qz`Jz`Cz`v`7v`0v`)v`"v`v`v` v`v`ÿu`øu`ñu`êu`ãu`Üu`Õu`Îu`Çu`Àu`¹u`²u`«u`¤u`u`–u`u`ˆu`u`zu`su`lu`eu`^u`Wu`Pu`Iu`Bu`;u`4u`-u`&u`u`u`u` u`u`üt`õt`ît`çt`àt`Ùt`Òt`Ët`Ät`½t`¶t`¯t`¨t`¡t`št`“t`Œt`…t`~t`wt`pt`it`bt`[t`Tt`Mt`Ft`?t`8t`1t`*t`#t`t`t`t`t`t`ùs`òs`ës`äs`Ýs`Ös`Ïs`Ès`Ás`ºs`³s`¬s`¥s`žs`—s`s`‰s`‚s`{s`ts`ms`fs`_s`Xs`Qs`Js`Cs`o`7o`0o`)o`"o`o`o` o`o`ÿn`øn`ñn`ên`ãn`Ün`Õn`În`Çn`Àn`¹n`²n`«n`¤n`n`–n`n`ˆn`n`zn`sn`ln`en`^n`Wn`Pn`In`Bn`;n`4n`-n`&n`n`n`n` n`n`üm`õm`îm`çm`àm`Ùm`Òm`Ëm`Äm`½m`¶m`¯m`¨m`¡m`šm`“m`Œm`…m`~m`wm`pm`im`bm`[m`Tm`Mm`Fm`?m`8m`1m`*m`#m`m`m`m`m`m`ùl`òl`ël`äl`Ýl`Öl`Ïl`Èl`Ál`ºl`³l`¬l`¥l`žl`—l`l`‰l`‚l`{l`tl`ml`fl`_l`Xl`Ql`Jl`Cl`h`7h`0h`)h`"h`h`h` h`h`ÿg`øg`ñg`êg`ãg`Üg`Õg`Îg`Çg`Àg`¹g`²g`«g`¤g`g`–g`g`ˆg`g`zg`sg`lg`eg`^g`Wg`Pg`Ig`Bg`;g`4g`-g`&g`g`g`g` g`g`üf`õf`îf`çf`àf`Ùf`Òf`Ëf`Äf`½f`¶f`¯f`¨f`¡f`šf`“f`Œf`…f`~f`wf`pf`if`bf`[f`Tf`Mf`Ff`?f`8f`1f`*f`#f`f`f`f`f`f`ùe`òe`ëe`äe`Ýe`Öe`Ïe`Èe`Áe`ºe`³e`¬e`¥e`že`—e`e`‰e`‚e`{e`te`me`fe`_e`Xe`Qe`Je`Ce`a`7a`0a`)a`"a`a`a` a`a`ÿ``ø``ñ``ê``ã``Ü``Õ``Î``Ç``À``¹``²``«``¤````–````ˆ````z``s``l``e``^``W``P``I``B``;``4``-``&```````` ````ü_`õ_`î_`ç_`à_`Ù_`Ò_`Ë_`Ä_`½_`¶_`¯_`¨_`¡_`š_`“_`Œ_`…_`~_`w_`p_`i_`b_`[_`T_`M_`F_`?_`8_`1_`*_`#_`_`_`_`_`_`ù^`ò^`ë^`ä^`Ý^`Ö^`Ï^`È^`Á^`º^`³^`¬^`¥^`ž^`—^`^`‰^`‚^`{^`t^`m^`f^`_^`X^`Q^`J^`C^`<^`5^`.^`'^` ^`^`^` ^`^`ý]`ö]`ï]`è]`á]`Ú]`Ó]`Ì]`Å]`¾]`·]`°]`©]`¢]`›]`”]`]`†]`]`x]`q]`j]`c]`\]`U]`N]`G]`@]`9]`2]`+]`$]`]`]`]`]`]`ú\`ó\`ì\`å\`Þ\`×\`Ð\`É\`Â\`»\`´\`­\`¦\`Ÿ\`˜\`‘\`Š\`ƒ\`|\`u\`n\`g\``\`Y\`R\`K\`D\`=\`6\`/\`(\`!\`\`\` \`\`þ[`÷[`ð[`é[`â[`Û[`Ô[`Í[`Æ[`¿[`¸[`±[`ª[`£[`œ[`•[`Ž[`‡[`€[`y[`r[`k[`d[`][`V[`O[`H[`A[`:[`3[`,[`%[`[`[`[` [`[`ûZ`ôZ`íZ`æZ`ßZ`ØZ`ÑZ`ÊZ`ÃZ`¼Z`µZ`®Z`§Z` Z`™Z`’Z`‹Z`„Z`}Z`vZ`oZ`hZ`aZ`ZZ`SZ`LZ`EZ`>Z`7Z`0Z`)Z`"Z`Z`Z` Z`Z`ÿY`øY`ñY`êY`ãY`ÜY`ÕY`ÎY`ÇY`ÀY`¹Y`²Y`«Y`¤Y`Y`–Y`Y`ˆY`Y`zY`sY`lY`eY`^Y`WY`PY`IY`BY`;Y`4Y`-Y`&Y`Y`Y`Y` Y`Y`üX`õX`îX`çX`àX`ÙX`ÒX`ËX`ÄX`½X`¶X`¯X`¨X`¡X`šX`“X`ŒX`…X`~X`wX`pX`iX`bX`[X`TX`MX`FX`?X`8X`1X`*X`#X`X`X`X`X`X`ùW`òW`ëW`äW`ÝW`ÖW`ÏW`ÈW`ÁW`ºW`³W`¬W`¥W`žW`—W`W`‰W`‚W`{W`tW`mW`fW`_W`XW`QW`JW`CW`S`7S`0S`)S`"S`S`S` S`S`ÿR`øR`ñR`êR`ãR`ÜR`ÕR`ÎR`ÇR`ÀR`¹R`²R`«R`¤R`R`–R`R`ˆR`R`zR`sR`lR`eR`^R`WR`PR`IR`BR`;R`4R`-R`&R`R`R`R` R`R`üQ`õQ`îQ`çQ`àQ`ÙQ`ÒQ`ËQ`ÄQ`½Q`¶Q`¯Q`¨Q`¡Q`šQ`“Q`ŒQ`…Q`~Q`wQ`pQ`iQ`bQ`[Q`TQ`MQ`FQ`?Q`8Q`1Q`*Q`#Q`Q`Q`Q`Q`Q`ùP`òP`ëP`äP`ÝP`ÖP`ÏP`ÈP`ÁP`ºP`³P`¬P`¥P`žP`—P`P`‰P`‚P`{P`tP`mP`fP`_P`XP`QP`JP`CP`L`7L`0L`)L`"L`L`L` L`L`ÿK`øK`ñK`êK`ãK`ÜK`ÕK`ÎK`ÇK`ÀK`¹K`²K`«K`¤K`K`–K`K`ˆK`K`zK`sK`lK`eK`^K`WK`PK`IK`BK`;K`4K`-K`&K`K`K`K` K`K`üJ`õJ`îJ`çJ`àJ`ÙJ`ÒJ`ËJ`ÄJ`½J`¶J`¯J`¨J`¡J`šJ`“J`ŒJ`…J`~J`wJ`pJ`iJ`bJ`[J`TJ`MJ`FJ`?J`8J`1J`*J`#J`J`J`J`J`J`ùI`òI`ëI`äI`ÝI`ÖI`ÏI`ÈI`ÁI`ºI`³I`¬I`¥I`žI`—I`I`‰I`‚I`{I`tI`mI`fI`_I`XI`QI`JI`CI`E`7E`0E`)E`"E`E`E` E`E`ÿD`øD`ñD`êD`ãD`ÜD`ÕD`ÎD`ÇD`ÀD`¹D`²D`«D`¤D`D`–D`D`ˆD`D`zD`sD`lD`eD`^D`WD`PD`ID`BD`;D`4D`-D`&D`D`D`D` D`D`üC`õC`îC`çC`àC`ÙC`ÒC`ËC`ÄC`½C`¶C`¯C`¨C`¡C`šC`“C`ŒC`…C`~C`wC`pC`iC`bC`[C`TC`MC`FC`?C`8C`1C`*C`#C`C`C`C`C`C`ùB`òB`ëB`äB`ÝB`ÖB`ÏB`ÈB`ÁB`ºB`³B`¬B`¥B`žB`—B`B`‰B`‚B`{B`tB`mB`fB`_B`XB`QB`JB`CB``ô>`í>`æ>`ß>`Ø>`Ñ>`Ê>`Ã>`¼>`µ>`®>`§>` >`™>`’>`‹>`„>`}>`v>`o>`h>`a>`Z>`S>`L>`E>`>>`7>`0>`)>`">`>`>` >`>`ÿ=`ø=`ñ=`ê=`ã=`Ü=`Õ=`Î=`Ç=`À=`¹=`²=`«=`¤=`=`–=`=`ˆ=`=`z=`s=`l=`e=`^=`W=`P=`I=`B=`;=`4=`-=`&=`=`=`=` =`=`ü<`õ<`î<`ç<`à<`Ù<`Ò<`Ë<`Ä<`½<`¶<`¯<`¨<`¡<`š<`“<`Œ<`…<`~<`w<`p<`i<`b<`[<`T<`M<`F<`?<`8<`1<`*<`#<`<`<`<`<`<`ù;`ò;`ë;`ä;`Ý;`Ö;`Ï;`È;`Á;`º;`³;`¬;`¥;`ž;`—;`;`‰;`‚;`{;`t;`m;`f;`_;`X;`Q;`J;`C;`<;`5;`.;`';` ;`;`;` ;`;`ý:`ö:`ï:`è:`á:`Ú:`Ó:`Ì:`Å:`¾:`·:`°:`©:`¢:`›:`”:`:`†:`:`x:`q:`j:`c:`\:`U:`N:`G:`@:`9:`2:`+:`$:`:`:`:`:`:`ú9`ó9`ì9`å9`Þ9`×9`Ð9`É9`Â9`»9`´9`­9`¦9`Ÿ9`˜9`‘9`Š9`ƒ9`|9`u9`n9`g9``9`Y9`R9`K9`D9`=9`69`/9`(9`!9`9`9` 9`9`þ8`÷8`ð8`é8`â8`Û8`Ô8`Í8`Æ8`¿8`¸8`±8`ª8`£8`œ8`•8`Ž8`‡8`€8`y8`r8`k8`d8`]8`V8`O8`H8`A8`:8`38`,8`%8`8`8`8` 8`8`û7`ô7`í7`æ7`ß7`Ø7`Ñ7`Ê7`Ã7`¼7`µ7`®7`§7` 7`™7`’7`‹7`„7`}7`v7`o7`h7`a7`Z7`S7`L7`E7`>7`77`07`)7`"7`7`7` 7`7`ÿ6`ø6`ñ6`ê6`ã6`Ü6`Õ6`Î6`Ç6`À6`¹6`²6`«6`¤6`6`–6`6`ˆ6`6`z6`s6`l6`e6`^6`W6`P6`I6`B6`;6`46`-6`&6`6`6`6` 6`6`ü5`õ5`î5`ç5`à5`Ù5`Ò5`Ë5`Ä5`½5`¶5`¯5`¨5`¡5`š5`“5`Œ5`…5`~5`w5`p5`i5`b5`[5`T5`M5`F5`?5`85`15`*5`#5`5`5`5`5`5`ù4`ò4`ë4`ä4`Ý4`Ö4`Ï4`È4`Á4`º4`³4`¬4`¥4`ž4`—4`4`‰4`‚4`{4`t4`m4`f4`_4`X4`Q4`J4`C4`<4`54`.4`'4` 4`4`4` 4`4`ý3`ö3`ï3`è3`á3`Ú3`Ó3`Ì3`Å3`¾3`·3`°3`©3`¢3`›3`”3`3`†3`3`x3`q3`j3`c3`\3`U3`N3`G3`@3`93`23`+3`$3`3`3`3`3`3`ú2`ó2`ì2`å2`Þ2`×2`Ð2`É2`Â2`»2`´2`­2`¦2`Ÿ2`˜2`‘2`Š2`ƒ2`|2`u2`n2`g2``2`Y2`R2`K2`D2`=2`62`/2`(2`!2`2`2` 2`2`þ1`÷1`ð1`é1`â1`Û1`Ô1`Í1`Æ1`¿1`¸1`±1`ª1`£1`œ1`•1`Ž1`‡1`€1`y1`r1`k1`d1`]1`V1`O1`H1`A1`:1`31`,1`%1`1`1`1` 1`1`û0`ô0`í0`æ0`ß0`Ø0`Ñ0`Ê0`Ã0`¼0`µ0`®0`§0` 0`™0`’0`‹0`„0`}0`v0`o0`h0`a0`Z0`S0`L0`E0`>0`70`00`)0`"0`0`0` 0`0`ÿ/`ø/`ñ/`ê/`ã/`Ü/`Õ/`Î/`Ç/`À/`¹/`²/`«/`¤/`/`–/`/`ˆ/`/`z/`s/`l/`e/`^/`W/`P/`I/`B/`;/`4/`-/`&/`/`/`/` /`/`ü.`õ.`î.`ç.`à.`Ù.`Ò.`Ë.`Ä.`½.`¶.`¯.`¨.`¡.`š.`“.`Œ.`….`~.`w.`p.`i.`b.`[.`T.`M.`F.`?.`8.`1.`*.`#.`.`.`.`.`.`ù-`ò-`ë-`ä-`Ý-`Ö-`Ï-`È-`Á-`º-`³-`¬-`¥-`ž-`—-`-`‰-`‚-`{-`t-`m-`f-`_-`X-`Q-`J-`C-`<-`5-`.-`'-` -`-`-` -`-`ý,`ö,`ï,`è,`á,`Ú,`Ó,`Ì,`Å,`¾,`·,`°,`©,`¢,`›,`”,`,`†,`,`x,`q,`j,`c,`\,`U,`N,`G,`@,`9,`2,`+,`$,`,`,`,`,`,`ú+`ó+`ì+`å+`Þ+`×+`Ð+`É+`Â+`»+`´+`­+`¦+`Ÿ+`˜+`‘+`Š+`ƒ+`|+`u+`n+`g+``+`Y+`R+`K+`D+`=+`6+`/+`(+`!+`+`+` +`+`þ*`÷*`ð*`é*`â*`Û*`Ô*`Í*`Æ*`¿*`¸*`±*`ª*`£*`œ*`•*`Ž*`‡*`€*`y*`r*`k*`d*`]*`V*`O*`H*`A*`:*`3*`,*`%*`*`*`*` *`*`û)`ô)`í)`æ)`ß)`Ø)`Ñ)`Ê)`Ã)`¼)`µ)`®)`§)` )`™)`’)`‹)`„)`})`v)`o)`h)`a)`Z)`S)`L)`E)`>)`7)`0)`))`")`)`)` )`)`ÿ(`ø(`ñ(`ê(`ã(`Ü(`Õ(`Î(`Ç(`À(`¹(`²(`«(`¤(`(`–(`(`ˆ(`(`z(`s(`l(`e(`^(`W(`P(`I(`B(`;(`4(`-(`&(`(`(`(` (`(`ü'`õ'`î'`ç'`à'`Ù'`Ò'`Ë'`Ä'`½'`¶'`¯'`¨'`¡'`š'`“'`Œ'`…'`~'`w'`p'`i'`b'`['`T'`M'`F'`?'`8'`1'`*'`#'`'`'`'`'`'`ù&`ò&`ë&`ä&`Ý&`Ö&`Ï&`È&`Á&`º&`³&`¬&`¥&`ž&`—&`&`‰&`‚&`{&`t&`m&`f&`_&`X&`Q&`J&`C&`<&`5&`.&`'&` &`&`&` &`&`ý%`ö%`ï%`è%`á%`Ú%`Ó%`Ì%`Å%`¾%`·%`°%`©%`¢%`›%`”%`%`†%`%`x%`q%`j%`c%`\%`U%`N%`G%`@%`9%`2%`+%`$%`%`%`%`%`%`ú$`ó$`ì$`å$`Þ$`×$`Ð$`É$`Â$`»$`´$`­$`¦$`Ÿ$`˜$`‘$`Š$`ƒ$`|$`u$`n$`g$``$`Y$`R$`K$`D$`=$`6$`/$`($`!$`$`$` $`$`þ#`÷#`ð#`é#`â#`Û#`Ô#`Í#`Æ#`¿#`¸#`±#`ª#`£#`œ#`•#`Ž#`‡#`€#`y#`r#`k#`d#`]#`V#`O#`H#`A#`:#`3#`,#`%#`#`#`#` #`#`û"`ô"`í"`æ"`ß"`Ø"`Ñ"`Ê"`Ã"`¼"`µ"`®"`§"` "`™"`’"`‹"`„"`}"`v"`o"`h"`a"`Z"`S"`L"`E"`>"`7"`0"`)"`""`"`"` "`"`ÿ!`ø!`ñ!`ê!`ã!`Ü!`Õ!`Î!`Ç!`À!`¹!`²!`«!`¤!`!`–!`!`ˆ!`!`z!`s!`l!`e!`^!`W!`P!`I!`B!`;!`4!`-!`&!`!`!`!` !`!`ü `õ `î `ç `à `Ù `Ò `Ë `Ä `½ `¶ `¯ `¨ `¡ `š `“ `Œ `… `~ `w `p `i `b `[ `T `M `F `? `8 `1 `* `# ` ` ` ` ` `ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý`ö`ï`è`á`Ú`Ó`Ì`Å`¾`·`°`©`¢`›`”``†``x`q`j`c`\`U`N`G`@`9`2`+`$``````ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ`÷`ð`é`â`Û`Ô`Í`Æ`¿`¸`±`ª`£`œ`•`Ž`‡`€`y`r`k`d`]`V`O`H`A`:`3`,`%```` ``û`ô`í`æ`ß`Ø`Ñ`Ê`Ã`¼`µ`®`§` `™`’`‹`„`}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ``ÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý`ö`ï`è`á`Ú`Ó`Ì`Å`¾`·`°`©`¢`›`”``†``x`q`j`c`\`U`N`G`@`9`2`+`$``````ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ`÷`ð`é`â`Û`Ô`Í`Æ`¿`¸`±`ª`£`œ`•`Ž`‡`€`y`r`k`d`]`V`O`H`A`:`3`,`%```` ``û`ô`í`æ`ß`Ø`Ñ`Ê`Ã`¼`µ`®`§` `™`’`‹`„`}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ``ÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý`ö`ï`è`á`Ú`Ó`Ì`Å`¾`·`°`©`¢`›`”``†``x`q`j`c`\`U`N`G`@`9`2`+`$``````ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ`÷`ð`é`â`Û`Ô`Í`Æ`¿`¸`±`ª`£`œ`•`Ž`‡`€`y`r`k`d`]`V`O`H`A`:`3`,`%```` ``û `ô `í `æ `ß `Ø `Ñ `Ê `à `¼ `µ `® `§ `  `™ `’ `‹ `„ `} `v `o `h `a `Z `S `L `E `> `7 `0 `) `" ` ` ` ` `ÿ `ø `ñ `ê `ã `Ü `Õ `Î `Ç `À `¹ `² `« `¤ ` `– ` `ˆ ` `z `s `l `e `^ `W `P `I `B `; `4 `- `& ` ` ` ` ` `ü `õ `î `ç `à `Ù `Ò `Ë `Ä `½ `¶ `¯ `¨ `¡ `š `“ `Œ `… `~ `w `p `i `b `[ `T `M `F `? `8 `1 `* `# ` ` ` ` ` `ù `ò `ë `ä `Ý `Ö `Ï `È `Á `º `³ `¬ `¥ `ž `— ` `‰ `‚ `{ `t `m `f `_ `X `Q `J `C `< `5 `. `' ` ` ` ` ` `ý `ö `ï `è `á `Ú `Ó `Ì `Å `¾ `· `° `© `¢ `› `” ` `† ` `x `q `j `c `\ `U `N `G `@ `9 `2 `+ `$ ` ` ` ` ` `ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ`÷`ð`é`â`Û`Ô`Í`Æ`¿`¸`±`ª`£`œ`•`Ž`‡`€`y`r`k`d`]`V`O`H`A`:`3`,`%```` ``û`ô`í`æ`ß`Ø`Ñ`Ê`Ã`¼`µ`®`§` `™`’`‹`„`}`v`o`h`a`Z`S`L`E`>`7`0`)`"``` ``ÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý`ö`ï`è`á`Ú`Ó`Ì`Å`¾`·`°`©`¢`›`”``†``x`q`j`c`\`U`N`G`@`9`2`+`$``````ú`ó`ì`å`Þ`×`Ð`É`Â`»`´`­`¦`Ÿ`˜`‘`Š`ƒ`|`u`n`g```Y`R`K`D`=`6`/`(`!``` ``þ`÷`ð`é`â`Û`Ô`Í`Æ`¿`¸`±`ª`£`œ`•`Ž`‡`€`y`r`k`d`]`V`O`H`A`:`3`,`%```` ``ûÿ_ôÿ_íÿ_æÿ_ßÿ_Øÿ_Ñÿ_Êÿ_Ãÿ_¼ÿ_µÿ_®ÿ_§ÿ_ ÿ_™ÿ_’ÿ_‹ÿ_„ÿ_}ÿ_vÿ_oÿ_hÿ_aÿ_Zÿ_Sÿ_Lÿ_Eÿ_>ÿ_7ÿ_0ÿ_)ÿ_"ÿ_ÿ_ÿ_ ÿ_ÿ_ÿþ_øþ_ñþ_êþ_ãþ_Üþ_Õþ_Îþ_Çþ_Àþ_¹þ_²þ_«þ_¤þ_þ_–þ_þ_ˆþ_þ_zþ_sþ_lþ_eþ_^þ_Wþ_Pþ_Iþ_Bþ_;þ_4þ_-þ_&þ_þ_þ_þ_ þ_þ_üý_õý_îý_çý_àý_Ùý_Òý_Ëý_Äý_½ý_¶ý_¯ý_¨ý_¡ý_šý_“ý_Œý_…ý_~ý_wý_pý_iý_bý_[ý_Tý_Mý_Fý_?ý_8ý_1ý_*ý_#ý_ý_ý_ý_ý_ý_ùü_òü_ëü_äü_Ýü_Öü_Ïü_Èü_Áü_ºü_³ü_¬ü_¥ü_žü_—ü_ü_‰ü_‚ü_{ü_tü_mü_fü__ü_Xü_Qü_Jü_Cü_<ü_5ü_.ü_'ü_ ü_ü_ü_ ü_ü_ýû_öû_ïû_èû_áû_Úû_Óû_Ìû_Åû_¾û_·û_°û_©û_¢û_›û_”û_û_†û_û_xû_qû_jû_cû_\û_Uû_Nû_Gû_@û_9û_2û_+û_$û_û_û_û_û_û_úú_óú_ìú_åú_Þú_×ú_Ðú_Éú_Âú_»ú_´ú_­ú_¦ú_Ÿú_˜ú_‘ú_Šú_ƒú_|ú_uú_nú_gú_`ú_Yú_Rú_Kú_Dú_=ú_6ú_/ú_(ú_!ú_ú_ú_ ú_ú_þù_÷ù_ðù_éù_âù_Ûù_Ôù_Íù_Æù_¿ù_¸ù_±ù_ªù_£ù_œù_•ù_Žù_‡ù_€ù_yù_rù_kù_dù_]ù_Vù_Où_Hù_Aù_:ù_3ù_,ù_%ù_ù_ù_ù_ ù_ù_ûø_ôø_íø_æø_ßø_Øø_Ñø_Êø_Ãø_¼ø_µø_®ø_§ø_ ø_™ø_’ø_‹ø_„ø_}ø_vø_oø_hø_aø_Zø_Sø_Lø_Eø_>ø_7ø_0ø_)ø_"ø_ø_ø_ ø_ø_ÿ÷_ø÷_ñ÷_ê÷_ã÷_Ü÷_Õ÷_Î÷_Ç÷_À÷_¹÷_²÷_«÷_¤÷_÷_–÷_÷_ˆ÷_÷_z÷_s÷_l÷_e÷_^÷_W÷_P÷_I÷_B÷_;÷_4÷_-÷_&÷_÷_÷_÷_ ÷_÷_üö_õö_îö_çö_àö_Ùö_Òö_Ëö_Äö_½ö_¶ö_¯ö_¨ö_¡ö_šö_“ö_Œö_…ö_~ö_wö_pö_iö_bö_[ö_Tö_Mö_Fö_?ö_8ö_1ö_*ö_#ö_ö_ö_ö_ö_ö_ùõ_òõ_ëõ_äõ_Ýõ_Öõ_Ïõ_Èõ_Áõ_ºõ_³õ_¬õ_¥õ_žõ_—õ_õ_‰õ_‚õ_{õ_tõ_mõ_fõ__õ_Xõ_Qõ_Jõ_Cõ_<õ_5õ_.õ_'õ_ õ_õ_õ_ õ_õ_ýô_öô_ïô_èô_áô_Úô_Óô_Ìô_Åô_¾ô_·ô_°ô_©ô_¢ô_›ô_”ô_ô_†ô_ô_xô_qô_jô_cô_\ô_Uô_Nô_Gô_@ô_9ô_2ô_+ô_$ô_ô_ô_ô_ô_ô_úó_óó_ìó_åó_Þó_×ó_Ðó_Éó_Âó_»ó_´ó_­ó_¦ó_Ÿó_˜ó_‘ó_Šó_ƒó_|ó_uó_nó_gó_`ó_Yó_Ró_Kó_Dó_=ó_6ó_/ó_(ó_!ó_ó_ó_ ó_ó_þò_÷ò_ðò_éò_âò_Ûò_Ôò_Íò_Æò_¿ò_¸ò_±ò_ªò_£ò_œò_•ò_Žò_‡ò_€ò_yò_rò_kò_dò_]ò_Vò_Oò_Hò_Aò_:ò_3ò_,ò_%ò_ò_ò_ò_ ò_ò_ûñ_ôñ_íñ_æñ_ßñ_Øñ_Ññ_Êñ_Ãñ_¼ñ_µñ_®ñ_§ñ_ ñ_™ñ_’ñ_‹ñ_„ñ_}ñ_vñ_oñ_hñ_añ_Zñ_Sñ_Lñ_Eñ_>ñ_7ñ_0ñ_)ñ_"ñ_ñ_ñ_ ñ_ñ_ÿð_øð_ñð_êð_ãð_Üð_Õð_Îð_Çð_Àð_¹ð_²ð_«ð_¤ð_ð_–ð_ð_ˆð_ð_zð_sð_lð_eð_^ð_Wð_Pð_Ið_Bð_;ð_4ð_-ð_&ð_ð_ð_ð_ ð_ð_üï_õï_îï_çï_àï_Ùï_Òï_Ëï_Äï_½ï_¶ï_¯ï_¨ï_¡ï_šï_“ï_Œï_…ï_~ï_wï_pï_iï_bï_[ï_Tï_Mï_Fï_?ï_8ï_1ï_*ï_#ï_ï_ï_ï_ï_ï_ùî_òî_ëî_äî_Ýî_Öî_Ïî_Èî_Áî_ºî_³î_¬î_¥î_žî_—î_î_‰î_‚î_{î_tî_mî_fî__î_Xî_Qî_Jî_Cî_<î_5î_.î_'î_ î_î_î_ î_î_ýí_öí_ïí_èí_áí_Úí_Óí_Ìí_Åí_¾í_·í_°í_©í_¢í_›í_”í_í_†í_í_xí_qí_jí_cí_\í_Uí_Ní_Gí_@í_9í_2í_+í_$í_í_í_í_í_í_úì_óì_ìì_åì_Þì_×ì_Ðì_Éì_Âì_»ì_´ì_­ì_¦ì_Ÿì_˜ì_‘ì_Šì_ƒì_|ì_uì_nì_gì_`ì_Yì_Rì_Kì_Dì_=ì_6ì_/ì_(ì_!ì_ì_ì_ ì_ì_þë_÷ë_ðë_éë_âë_Ûë_Ôë_Íë_Æë_¿ë_¸ë_±ë_ªë_£ë_œë_•ë_Žë_‡ë_€ë_yë_rë_kë_dë_]ë_Vë_Oë_Hë_Aë_:ë_3ë_,ë_%ë_ë_ë_ë_ ë_ë_ûê_ôê_íê_æê_ßê_Øê_Ñê_Êê_Ãê_¼ê_µê_®ê_§ê_ ê_™ê_’ê_‹ê_„ê_}ê_vê_oê_hê_aê_Zê_Sê_Lê_Eê_>ê_7ê_0ê_)ê_"ê_ê_ê_ ê_ê_ÿé_øé_ñé_êé_ãé_Üé_Õé_Îé_Çé_Àé_¹é_²é_«é_¤é_é_–é_é_ˆé_é_zé_sé_lé_eé_^é_Wé_Pé_Ié_Bé_;é_4é_-é_&é_é_é_é_ é_é_üè_õè_îè_çè_àè_Ùè_Òè_Ëè_Äè_½è_¶è_¯è_¨è_¡è_šè_“è_Œè_…è_~è_wè_pè_iè_bè_[è_Tè_Mè_Fè_?è_8è_1è_*è_#è_è_è_è_è_è_ùç_òç_ëç_äç_Ýç_Öç_Ïç_Èç_Áç_ºç_³ç_¬ç_¥ç_žç_—ç_ç_‰ç_‚ç_{ç_tç_mç_fç__ç_Xç_Qç_Jç_Cç_<ç_5ç_.ç_'ç_ ç_ç_ç_ ç_ç_ýæ_öæ_ïæ_èæ_áæ_Úæ_Óæ_Ìæ_Åæ_¾æ_·æ_°æ_©æ_¢æ_›æ_”æ_æ_†æ_æ_xæ_qæ_jæ_cæ_\æ_Uæ_Næ_Gæ_@æ_9æ_2æ_+æ_$æ_æ_æ_æ_æ_æ_úå_óå_ìå_åå_Þå_×å_Ðå_Éå_Âå_»å_´å_­å_¦å_Ÿå_˜å_‘å_Šå_ƒå_|å_uå_nå_gå_`å_Yå_Rå_Kå_Då_=å_6å_/å_(å_!å_å_å_ å_å_þä_÷ä_ðä_éä_âä_Ûä_Ôä_Íä_Æä_¿ä_¸ä_±ä_ªä_£ä_œä_•ä_Žä_‡ä_€ä_yä_rä_kä_dä_]ä_Vä_Oä_Hä_Aä_:ä_3ä_,ä_%ä_ä_ä_ä_ ä_ä_ûã_ôã_íã_æã_ßã_Øã_Ñã_Êã_Ãã_¼ã_µã_®ã_§ã_ ã_™ã_’ã_‹ã_„ã_}ã_vã_oã_hã_aã_Zã_Sã_Lã_Eã_>ã_7ã_0ã_)ã_"ã_ã_ã_ ã_ã_ÿâ_øâ_ñâ_êâ_ãâ_Üâ_Õâ_Îâ_Çâ_Àâ_¹â_²â_«â_¤â_â_–â_â_ˆâ_â_zâ_sâ_lâ_eâ_^â_Wâ_Pâ_Iâ_Bâ_;â_4â_-â_&â_â_â_â_ â_â_üá_õá_îá_çá_àá_Ùá_Òá_Ëá_Äá_½á_¶á_¯á_¨á_¡á_šá_“á_Œá_…á_~á_wá_pá_iá_bá_[á_Tá_Má_Fá_?á_8á_1á_*á_#á_á_á_á_á_á_ùà_òà_ëà_äà_Ýà_Öà_Ïà_Èà_Áà_ºà_³à_¬à_¥à_žà_—à_à_‰à_‚à_{à_tà_mà_fà__à_Xà_Qà_Jà_Cà_<à_5à_.à_'à_ à_à_à_ à_à_ýß_öß_ïß_èß_áß_Úß_Óß_Ìß_Åß_¾ß_·ß_°ß_©ß_¢ß_›ß_”ß_ß_†ß_ß_xß_qß_jß_cß_\ß_Uß_Nß_Gß_@ß_9ß_2ß_+ß_$ß_ß_ß_ß_ß_ß_úÞ_óÞ_ìÞ_åÞ_ÞÞ_×Þ_ÐÞ_ÉÞ_ÂÞ_»Þ_´Þ_­Þ_¦Þ_ŸÞ_˜Þ_‘Þ_ŠÞ_ƒÞ_|Þ_uÞ_nÞ_gÞ_`Þ_YÞ_RÞ_KÞ_DÞ_=Þ_6Þ_/Þ_(Þ_!Þ_Þ_Þ_ Þ_Þ_þÝ_÷Ý_ðÝ_éÝ_âÝ_ÛÝ_ÔÝ_ÍÝ_ÆÝ_¿Ý_¸Ý_±Ý_ªÝ_£Ý_œÝ_•Ý_ŽÝ_‡Ý_€Ý_yÝ_rÝ_kÝ_dÝ_]Ý_VÝ_OÝ_HÝ_AÝ_:Ý_3Ý_,Ý_%Ý_Ý_Ý_Ý_ Ý_Ý_ûÜ_ôÜ_íÜ_æÜ_ßÜ_ØÜ_ÑÜ_ÊÜ_ÃÜ_¼Ü_µÜ_®Ü_§Ü_ Ü_™Ü_’Ü_‹Ü_„Ü_}Ü_vÜ_oÜ_hÜ_aÜ_ZÜ_SÜ_LÜ_EÜ_>Ü_7Ü_0Ü_)Ü_"Ü_Ü_Ü_ Ü_Ü_ÿÛ_øÛ_ñÛ_êÛ_ãÛ_ÜÛ_ÕÛ_ÎÛ_ÇÛ_ÀÛ_¹Û_²Û_«Û_¤Û_Û_–Û_Û_ˆÛ_Û_zÛ_sÛ_lÛ_eÛ_^Û_WÛ_PÛ_IÛ_BÛ_;Û_4Û_-Û_&Û_Û_Û_Û_ Û_Û_üÚ_õÚ_îÚ_çÚ_àÚ_ÙÚ_ÒÚ_ËÚ_ÄÚ_½Ú_¶Ú_¯Ú_¨Ú_¡Ú_šÚ_“Ú_ŒÚ_…Ú_~Ú_wÚ_pÚ_iÚ_bÚ_[Ú_TÚ_MÚ_FÚ_?Ú_8Ú_1Ú_*Ú_#Ú_Ú_Ú_Ú_Ú_Ú_ùÙ_òÙ_ëÙ_äÙ_ÝÙ_ÖÙ_ÏÙ_ÈÙ_ÁÙ_ºÙ_³Ù_¬Ù_¥Ù_žÙ_—Ù_Ù_‰Ù_‚Ù_{Ù_tÙ_mÙ_fÙ__Ù_XÙ_QÙ_JÙ_CÙ_<Ù_5Ù_.Ù_'Ù_ Ù_Ù_Ù_ Ù_Ù_ýØ_öØ_ïØ_èØ_áØ_ÚØ_ÓØ_ÌØ_ÅØ_¾Ø_·Ø_°Ø_©Ø_¢Ø_›Ø_”Ø_Ø_†Ø_Ø_xØ_qØ_jØ_cØ_\Ø_UØ_NØ_GØ_@Ø_9Ø_2Ø_+Ø_$Ø_Ø_Ø_Ø_Ø_Ø_ú×_ó×_ì×_å×_Þ×_××_Ð×_É×_Â×_»×_´×_­×_¦×_Ÿ×_˜×_‘×_Š×_ƒ×_|×_u×_n×_g×_`×_Y×_R×_K×_D×_=×_6×_/×_(×_!×_×_×_ ×_×_þÖ_÷Ö_ðÖ_éÖ_âÖ_ÛÖ_ÔÖ_ÍÖ_ÆÖ_¿Ö_¸Ö_±Ö_ªÖ_£Ö_œÖ_•Ö_ŽÖ_‡Ö_€Ö_yÖ_rÖ_kÖ_dÖ_]Ö_VÖ_OÖ_HÖ_AÖ_:Ö_3Ö_,Ö_%Ö_Ö_Ö_Ö_ Ö_Ö_ûÕ_ôÕ_íÕ_æÕ_ßÕ_ØÕ_ÑÕ_ÊÕ_ÃÕ_¼Õ_µÕ_®Õ_§Õ_ Õ_™Õ_’Õ_‹Õ_„Õ_}Õ_vÕ_oÕ_hÕ_aÕ_ZÕ_SÕ_LÕ_EÕ_>Õ_7Õ_0Õ_)Õ_"Õ_Õ_Õ_ Õ_Õ_ÿÔ_øÔ_ñÔ_êÔ_ãÔ_ÜÔ_ÕÔ_ÎÔ_ÇÔ_ÀÔ_¹Ô_²Ô_«Ô_¤Ô_Ô_–Ô_Ô_ˆÔ_Ô_zÔ_sÔ_lÔ_eÔ_^Ô_WÔ_PÔ_IÔ_BÔ_;Ô_4Ô_-Ô_&Ô_Ô_Ô_Ô_ Ô_Ô_üÓ_õÓ_îÓ_çÓ_àÓ_ÙÓ_ÒÓ_ËÓ_ÄÓ_½Ó_¶Ó_¯Ó_¨Ó_¡Ó_šÓ_“Ó_ŒÓ_…Ó_~Ó_wÓ_pÓ_iÓ_bÓ_[Ó_TÓ_MÓ_FÓ_?Ó_8Ó_1Ó_*Ó_#Ó_Ó_Ó_Ó_Ó_Ó_ùÒ_òÒ_ëÒ_äÒ_ÝÒ_ÖÒ_ÏÒ_ÈÒ_ÁÒ_ºÒ_³Ò_¬Ò_¥Ò_žÒ_—Ò_Ò_‰Ò_‚Ò_{Ò_tÒ_mÒ_fÒ__Ò_XÒ_QÒ_JÒ_CÒ_<Ò_5Ò_.Ò_'Ò_ Ò_Ò_Ò_ Ò_Ò_ýÑ_öÑ_ïÑ_èÑ_áÑ_ÚÑ_ÓÑ_ÌÑ_ÅÑ_¾Ñ_·Ñ_°Ñ_©Ñ_¢Ñ_›Ñ_”Ñ_Ñ_†Ñ_Ñ_xÑ_qÑ_jÑ_cÑ_\Ñ_UÑ_NÑ_GÑ_@Ñ_9Ñ_2Ñ_+Ñ_$Ñ_Ñ_Ñ_Ñ_Ñ_Ñ_úÐ_óÐ_ìÐ_åÐ_ÞÐ_×Ð_ÐÐ_ÉÐ_ÂÐ_»Ð_´Ð_­Ð_¦Ð_ŸÐ_˜Ð_‘Ð_ŠÐ_ƒÐ_|Ð_uÐ_nÐ_gÐ_`Ð_YÐ_RÐ_KÐ_DÐ_=Ð_6Ð_/Ð_(Ð_!Ð_Ð_Ð_ Ð_Ð_þÏ_÷Ï_ðÏ_éÏ_âÏ_ÛÏ_ÔÏ_ÍÏ_ÆÏ_¿Ï_¸Ï_±Ï_ªÏ_£Ï_œÏ_•Ï_ŽÏ_‡Ï_€Ï_yÏ_rÏ_kÏ_dÏ_]Ï_VÏ_OÏ_HÏ_AÏ_:Ï_3Ï_,Ï_%Ï_Ï_Ï_Ï_ Ï_Ï_ûÎ_ôÎ_íÎ_æÎ_ßÎ_ØÎ_ÑÎ_ÊÎ_ÃÎ_¼Î_µÎ_®Î_§Î_ Î_™Î_’Î_‹Î_„Î_}Î_vÎ_oÎ_hÎ_aÎ_ZÎ_SÎ_LÎ_EÎ_>Î_7Î_0Î_)Î_"Î_Î_Î_ Î_Î_ÿÍ_øÍ_ñÍ_êÍ_ãÍ_ÜÍ_ÕÍ_ÎÍ_ÇÍ_ÀÍ_¹Í_²Í_«Í_¤Í_Í_–Í_Í_ˆÍ_Í_zÍ_sÍ_lÍ_eÍ_^Í_WÍ_PÍ_IÍ_BÍ_;Í_4Í_-Í_&Í_Í_Í_Í_ Í_Í_üÌ_õÌ_îÌ_çÌ_àÌ_ÙÌ_ÒÌ_ËÌ_ÄÌ_½Ì_¶Ì_¯Ì_¨Ì_¡Ì_šÌ_“Ì_ŒÌ_…Ì_~Ì_wÌ_pÌ_iÌ_bÌ_[Ì_TÌ_MÌ_FÌ_?Ì_8Ì_1Ì_*Ì_#Ì_Ì_Ì_Ì_Ì_Ì_ùË_òË_ëË_äË_ÝË_ÖË_ÏË_ÈË_ÁË_ºË_³Ë_¬Ë_¥Ë_žË_—Ë_Ë_‰Ë_‚Ë_{Ë_tË_mË_fË__Ë_XË_QË_JË_CË_<Ë_5Ë_.Ë_'Ë_ Ë_Ë_Ë_ Ë_Ë_ýÊ_öÊ_ïÊ_èÊ_áÊ_ÚÊ_ÓÊ_ÌÊ_ÅÊ_¾Ê_·Ê_°Ê_©Ê_¢Ê_›Ê_”Ê_Ê_†Ê_Ê_xÊ_qÊ_jÊ_cÊ_\Ê_UÊ_NÊ_GÊ_@Ê_9Ê_2Ê_+Ê_$Ê_Ê_Ê_Ê_Ê_Ê_úÉ_óÉ_ìÉ_åÉ_ÞÉ_×É_ÐÉ_ÉÉ_ÂÉ_»É_´É_­É_¦É_ŸÉ_˜É_‘É_ŠÉ_ƒÉ_|É_uÉ_nÉ_gÉ_`É_YÉ_RÉ_KÉ_DÉ_=É_6É_/É_(É_!É_É_É_ É_É_þÈ_÷È_ðÈ_éÈ_âÈ_ÛÈ_ÔÈ_ÍÈ_ÆÈ_¿È_¸È_±È_ªÈ_£È_œÈ_•È_ŽÈ_‡È_€È_yÈ_rÈ_kÈ_dÈ_]È_VÈ_OÈ_HÈ_AÈ_:È_3È_,È_%È_È_È_È_ È_È_ûÇ_ôÇ_íÇ_æÇ_ßÇ_ØÇ_ÑÇ_ÊÇ_ÃÇ_¼Ç_µÇ_®Ç_§Ç_ Ç_™Ç_’Ç_‹Ç_„Ç_}Ç_vÇ_oÇ_hÇ_aÇ_ZÇ_SÇ_LÇ_EÇ_>Ç_7Ç_0Ç_)Ç_"Ç_Ç_Ç_ Ç_Ç_ÿÆ_øÆ_ñÆ_êÆ_ãÆ_ÜÆ_ÕÆ_ÎÆ_ÇÆ_ÀÆ_¹Æ_²Æ_«Æ_¤Æ_Æ_–Æ_Æ_ˆÆ_Æ_zÆ_sÆ_lÆ_eÆ_^Æ_WÆ_PÆ_IÆ_BÆ_;Æ_4Æ_-Æ_&Æ_Æ_Æ_Æ_ Æ_Æ_üÅ_õÅ_îÅ_çÅ_àÅ_ÙÅ_ÒÅ_ËÅ_ÄÅ_½Å_¶Å_¯Å_¨Å_¡Å_šÅ_“Å_ŒÅ_…Å_~Å_wÅ_pÅ_iÅ_bÅ_[Å_TÅ_MÅ_FÅ_?Å_8Å_1Å_*Å_#Å_Å_Å_Å_Å_Å_ùÄ_òÄ_ëÄ_äÄ_ÝÄ_ÖÄ_ÏÄ_ÈÄ_ÁÄ_ºÄ_³Ä_¬Ä_¥Ä_žÄ_—Ä_Ä_‰Ä_‚Ä_{Ä_tÄ_mÄ_fÄ__Ä_XÄ_QÄ_JÄ_CÄ_<Ä_5Ä_.Ä_'Ä_ Ä_Ä_Ä_ Ä_Ä_ýÃ_öÃ_ïÃ_èÃ_áÃ_ÚÃ_ÓÃ_ÌÃ_ÅÃ_¾Ã_·Ã_°Ã_©Ã_¢Ã_›Ã_”Ã_Ã_†Ã_Ã_xÃ_qÃ_jÃ_cÃ_\Ã_UÃ_NÃ_GÃ_@Ã_9Ã_2Ã_+Ã_$Ã_Ã_Ã_Ã_Ã_Ã_úÂ_óÂ_ìÂ_åÂ_ÞÂ_×Â_ÐÂ_ÉÂ_ÂÂ_»Â_´Â_­Â_¦Â_ŸÂ_˜Â_‘Â_ŠÂ_ƒÂ_|Â_uÂ_nÂ_gÂ_`Â_YÂ_RÂ_KÂ_DÂ_=Â_6Â_/Â_(Â_!Â_Â_Â_ Â_Â_þÁ_÷Á_ðÁ_éÁ_âÁ_ÛÁ_ÔÁ_ÍÁ_ÆÁ_¿Á_¸Á_±Á_ªÁ_£Á_œÁ_•Á_ŽÁ_‡Á_€Á_yÁ_rÁ_kÁ_dÁ_]Á_VÁ_OÁ_HÁ_AÁ_:Á_3Á_,Á_%Á_Á_Á_Á_ Á_Á_ûÀ_ôÀ_íÀ_æÀ_ßÀ_ØÀ_ÑÀ_ÊÀ_ÃÀ_¼À_µÀ_®À_§À_ À_™À_’À_‹À_„À_}À_vÀ_oÀ_hÀ_aÀ_ZÀ_SÀ_LÀ_EÀ_>À_7À_0À_)À_"À_À_À_ À_À_ÿ¿_ø¿_ñ¿_ê¿_ã¿_Ü¿_Õ¿_ο_Ç¿_À¿_¹¿_²¿_«¿_¤¿_¿_–¿_¿_ˆ¿_¿_z¿_s¿_l¿_e¿_^¿_W¿_P¿_I¿_B¿_;¿_4¿_-¿_&¿_¿_¿_¿_ ¿_¿_ü¾_õ¾_î¾_ç¾_à¾_Ù¾_Ò¾_˾_ľ_½¾_¶¾_¯¾_¨¾_¡¾_š¾_“¾_Œ¾_…¾_~¾_w¾_p¾_i¾_b¾_[¾_T¾_M¾_F¾_?¾_8¾_1¾_*¾_#¾_¾_¾_¾_¾_¾_ù½_ò½_ë½_ä½_ݽ_Ö½_Ͻ_Ƚ_Á½_º½_³½_¬½_¥½_ž½_—½_½_‰½_‚½_{½_t½_m½_f½__½_X½_Q½_J½_C½_<½_5½_.½_'½_ ½_½_½_ ½_½_ý¼_ö¼_ï¼_è¼_á¼_Ú¼_Ó¼_̼_ż_¾¼_·¼_°¼_©¼_¢¼_›¼_”¼_¼_†¼_¼_x¼_q¼_j¼_c¼_\¼_U¼_N¼_G¼_@¼_9¼_2¼_+¼_$¼_¼_¼_¼_¼_¼_ú»_ó»_ì»_å»_Þ»_×»_л_É»_»_»»_´»_­»_¦»_Ÿ»_˜»_‘»_Š»_ƒ»_|»_u»_n»_g»_`»_Y»_R»_K»_D»_=»_6»_/»_(»_!»_»_»_ »_»_þº_÷º_ðº_éº_âº_Ûº_Ôº_ͺ_ƺ_¿º_¸º_±º_ªº_£º_œº_•º_Žº_‡º_€º_yº_rº_kº_dº_]º_Vº_Oº_Hº_Aº_:º_3º_,º_%º_º_º_º_ º_º_û¹_ô¹_í¹_æ¹_ß¹_ع_ѹ_ʹ_ù_¼¹_µ¹_®¹_§¹_ ¹_™¹_’¹_‹¹_„¹_}¹_v¹_o¹_h¹_a¹_Z¹_S¹_L¹_E¹_>¹_7¹_0¹_)¹_"¹_¹_¹_ ¹_¹_ÿ¸_ø¸_ñ¸_ê¸_ã¸_ܸ_Õ¸_θ_Ǹ_À¸_¹¸_²¸_«¸_¤¸_¸_–¸_¸_ˆ¸_¸_z¸_s¸_l¸_e¸_^¸_W¸_P¸_I¸_B¸_;¸_4¸_-¸_&¸_¸_¸_¸_ ¸_¸_ü·_õ·_î·_ç·_à·_Ù·_Ò·_Ë·_Ä·_½·_¶·_¯·_¨·_¡·_š·_“·_Œ·_…·_~·_w·_p·_i·_b·_[·_T·_M·_F·_?·_8·_1·_*·_#·_·_·_·_·_·_ù¶_ò¶_ë¶_ä¶_ݶ_Ö¶_϶_ȶ_Á¶_º¶_³¶_¬¶_¥¶_ž¶_—¶_¶_‰¶_‚¶_{¶_t¶_m¶_f¶__¶_X¶_Q¶_J¶_C¶_<¶_5¶_.¶_'¶_ ¶_¶_¶_ ¶_¶_ýµ_öµ_ïµ_èµ_áµ_Úµ_Óµ_̵_ŵ_¾µ_·µ_°µ_©µ_¢µ_›µ_”µ_µ_†µ_µ_xµ_qµ_jµ_cµ_\µ_Uµ_Nµ_Gµ_@µ_9µ_2µ_+µ_$µ_µ_µ_µ_µ_µ_ú´_ó´_ì´_å´_Þ´_×´_д_É´_´_»´_´´_­´_¦´_Ÿ´_˜´_‘´_Š´_ƒ´_|´_u´_n´_g´_`´_Y´_R´_K´_D´_=´_6´_/´_(´_!´_´_´_ ´_´_þ³_÷³_ð³_é³_â³_Û³_Ô³_ͳ_Ƴ_¿³_¸³_±³_ª³_£³_œ³_•³_޳_‡³_€³_y³_r³_k³_d³_]³_V³_O³_H³_A³_:³_3³_,³_%³_³_³_³_ ³_³_û²_ô²_í²_æ²_ß²_ز_Ѳ_ʲ_ò_¼²_µ²_®²_§²_ ²_™²_’²_‹²_„²_}²_v²_o²_h²_a²_Z²_S²_L²_E²_>²_7²_0²_)²_"²_²_²_ ²_²_ÿ±_ø±_ñ±_ê±_ã±_ܱ_Õ±_α_DZ_À±_¹±_²±_«±_¤±_±_–±_±_ˆ±_±_z±_s±_l±_e±_^±_W±_P±_I±_B±_;±_4±_-±_&±_±_±_±_ ±_±_ü°_õ°_î°_ç°_à°_Ù°_Ò°_˰_İ_½°_¶°_¯°_¨°_¡°_š°_“°_Œ°_…°_~°_w°_p°_i°_b°_[°_T°_M°_F°_?°_8°_1°_*°_#°_°_°_°_°_°_ù¯_ò¯_ë¯_ä¯_ݯ_Ö¯_ϯ_ȯ_Á¯_º¯_³¯_¬¯_¥¯_ž¯_—¯_¯_‰¯_‚¯_{¯_t¯_m¯_f¯__¯_X¯_Q¯_J¯_C¯_<¯_5¯_.¯_'¯_ ¯_¯_¯_ ¯_¯_ý®_ö®_ï®_è®_á®_Ú®_Ó®_Ì®_Å®_¾®_·®_°®_©®_¢®_›®_”®_®_†®_®_x®_q®_j®_c®_\®_U®_N®_G®_@®_9®_2®_+®_$®_®_®_®_®_®_ú­_ó­_ì­_å­_Þ­_×­_Э_É­_­_»­_´­_­­_¦­_Ÿ­_˜­_‘­_Š­_ƒ­_|­_u­_n­_g­_`­_Y­_R­_K­_D­_=­_6­_/­_(­_!­_­_­_ ­_­_þ¬_÷¬_ð¬_é¬_â¬_Û¬_Ô¬_ͬ_Ƭ_¿¬_¸¬_±¬_ª¬_£¬_œ¬_•¬_ެ_‡¬_€¬_y¬_r¬_k¬_d¬_]¬_V¬_O¬_H¬_A¬_:¬_3¬_,¬_%¬_¬_¬_¬_ ¬_¬_û«_ô«_í«_æ«_ß«_Ø«_Ñ«_Ê«_ë_¼«_µ«_®«_§«_ «_™«_’«_‹«_„«_}«_v«_o«_h«_a«_Z«_S«_L«_E«_>«_7«_0«_)«_"«_«_«_ «_«_ÿª_øª_ñª_êª_ãª_ܪ_Õª_Ϊ_Ǫ_Àª_¹ª_²ª_«ª_¤ª_ª_–ª_ª_ˆª_ª_zª_sª_lª_eª_^ª_Wª_Pª_Iª_Bª_;ª_4ª_-ª_&ª_ª_ª_ª_ ª_ª_ü©_õ©_î©_ç©_à©_Ù©_Ò©_Ë©_Ä©_½©_¶©_¯©_¨©_¡©_š©_“©_Œ©_…©_~©_w©_p©_i©_b©_[©_T©_M©_F©_?©_8©_1©_*©_#©_©_©_©_©_©_ù¨_ò¨_ë¨_ä¨_ݨ_Ö¨_Ϩ_Ȩ_Á¨_º¨_³¨_¬¨_¥¨_ž¨_—¨_¨_‰¨_‚¨_{¨_t¨_m¨_f¨__¨_X¨_Q¨_J¨_C¨_<¨_5¨_.¨_'¨_ ¨_¨_¨_ ¨_¨_ý§_ö§_ï§_è§_á§_Ú§_Ó§_̧_ŧ_¾§_·§_°§_©§_¢§_›§_”§_§_†§_§_x§_q§_j§_c§_\§_U§_N§_G§_@§_9§_2§_+§_$§_§_§_§_§_§_ú¦_ó¦_ì¦_å¦_Þ¦_צ_Ц_ɦ_¦_»¦_´¦_­¦_¦¦_Ÿ¦_˜¦_‘¦_Ц_ƒ¦_|¦_u¦_n¦_g¦_`¦_Y¦_R¦_K¦_D¦_=¦_6¦_/¦_(¦_!¦_¦_¦_ ¦_¦_þ¥_÷¥_ð¥_é¥_â¥_Û¥_Ô¥_Í¥_Æ¥_¿¥_¸¥_±¥_ª¥_£¥_œ¥_•¥_Ž¥_‡¥_€¥_y¥_r¥_k¥_d¥_]¥_V¥_O¥_H¥_A¥_:¥_3¥_,¥_%¥_¥_¥_¥_ ¥_¥_û¤_ô¤_í¤_æ¤_ߤ_ؤ_Ѥ_ʤ_ä_¼¤_µ¤_®¤_§¤_ ¤_™¤_’¤_‹¤_„¤_}¤_v¤_o¤_h¤_a¤_Z¤_S¤_L¤_E¤_>¤_7¤_0¤_)¤_"¤_¤_¤_ ¤_¤_ÿ£_ø£_ñ£_ê£_ã£_Ü£_Õ£_Σ_Ç£_À£_¹£_²£_«£_¤£_£_–£_£_ˆ£_£_z£_s£_l£_e£_^£_W£_P£_I£_B£_;£_4£_-£_&£_£_£_£_ £_£_ü¢_õ¢_î¢_ç¢_à¢_Ù¢_Ò¢_Ë¢_Ä¢_½¢_¶¢_¯¢_¨¢_¡¢_š¢_“¢_Œ¢_…¢_~¢_w¢_p¢_i¢_b¢_[¢_T¢_M¢_F¢_?¢_8¢_1¢_*¢_#¢_¢_¢_¢_¢_¢_ù¡_ò¡_ë¡_ä¡_Ý¡_Ö¡_Ï¡_È¡_Á¡_º¡_³¡_¬¡_¥¡_ž¡_—¡_¡_‰¡_‚¡_{¡_t¡_m¡_f¡__¡_X¡_Q¡_J¡_C¡_<¡_5¡_.¡_'¡_ ¡_¡_¡_ ¡_¡_ý _ö _ï _è _á _Ú _Ó _Ì _Å _¾ _· _° _© _¢ _› _” _ _† _ _x _q _j _c _\ _U _N _G _@ _9 _2 _+ _$ _ _ _ _ _ _úŸ_óŸ_ìŸ_åŸ_ÞŸ_ן_П_ÉŸ_Ÿ_»Ÿ_´Ÿ_­Ÿ_¦Ÿ_ŸŸ_˜Ÿ_‘Ÿ_ŠŸ_ƒŸ_|Ÿ_uŸ_nŸ_gŸ_`Ÿ_YŸ_RŸ_KŸ_DŸ_=Ÿ_6Ÿ_/Ÿ_(Ÿ_!Ÿ_Ÿ_Ÿ_ Ÿ_Ÿ_þž_÷ž_ðž_éž_âž_Ûž_Ôž_Íž_Æž_¿ž_¸ž_±ž_ªž_£ž_œž_•ž_Žž_‡ž_€ž_yž_rž_kž_dž_]ž_Vž_Ož_Hž_Až_:ž_3ž_,ž_%ž_ž_ž_ž_ ž_ž_û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿœ_øœ_ñœ_êœ_ãœ_Üœ_Õœ_Μ_Çœ_Àœ_¹œ_²œ_«œ_¤œ_œ_–œ_œ_ˆœ_œ_zœ_sœ_lœ_eœ_^œ_Wœ_Pœ_Iœ_Bœ_;œ_4œ_-œ_&œ_œ_œ_œ_ œ_œ_ü›_õ›_î›_ç›_à›_Ù›_Ò›_Ë›_Ä›_½›_¶›_¯›_¨›_¡›_š›_“›_Œ›_…›_~›_w›_p›_i›_b›_[›_T›_M›_F›_?›_8›_1›_*›_#›_›_›_›_›_›_ùš_òš_ëš_äš_Ýš_Öš_Ïš_Èš_Áš_ºš_³š_¬š_¥š_žš_—š_š_‰š_‚š_{š_tš_mš_fš__š_Xš_Qš_Jš_Cš_<š_5š_.š_'š_ š_š_š_ š_š_ý™_ö™_ï™_è™_á™_Ú™_Ó™_Ì™_Å™_¾™_·™_°™_©™_¢™_›™_”™_™_†™_™_x™_q™_j™_c™_\™_U™_N™_G™_@™_9™_2™_+™_$™_™_™_™_™_™_ú˜_ó˜_ì˜_å˜_Þ˜_ט_И_ɘ_˜_»˜_´˜_­˜_¦˜_Ÿ˜_˜˜_‘˜_Š˜_ƒ˜_|˜_u˜_n˜_g˜_`˜_Y˜_R˜_K˜_D˜_=˜_6˜_/˜_(˜_!˜_˜_˜_ ˜_˜_þ—_÷—_ð—_é—_â—_Û—_Ô—_Í—_Æ—_¿—_¸—_±—_ª—_£—_œ—_•—_Ž—_‡—_€—_y—_r—_k—_d—_]—_V—_O—_H—_A—_:—_3—_,—_%—_—_—_—_ —_—_û–_ô–_í–_æ–_ß–_Ø–_Ñ–_Ê–_Ö_¼–_µ–_®–_§–_ –_™–_’–_‹–_„–_}–_v–_o–_h–_a–_Z–_S–_L–_E–_>–_7–_0–_)–_"–_–_–_ –_–_ÿ•_ø•_ñ•_ê•_ã•_Ü•_Õ•_Ε_Ç•_À•_¹•_²•_«•_¤•_•_–•_•_ˆ•_•_z•_s•_l•_e•_^•_W•_P•_I•_B•_;•_4•_-•_&•_•_•_•_ •_•_ü”_õ”_î”_ç”_à”_Ù”_Ò”_Ë”_Ä”_½”_¶”_¯”_¨”_¡”_š”_“”_Œ”_…”_~”_w”_p”_i”_b”_[”_T”_M”_F”_?”_8”_1”_*”_#”_”_”_”_”_”_ù“_ò“_ë“_ä“_Ý“_Ö“_Ï“_È“_Á“_º“_³“_¬“_¥“_ž“_—“_“_‰“_‚“_{“_t“_m“_f“__“_X“_Q“_J“_C“_<“_5“_.“_'“_ “_“_“_ “_“_ý’_ö’_ï’_è’_á’_Ú’_Ó’_Ì’_Å’_¾’_·’_°’_©’_¢’_›’_”’_’_†’_’_x’_q’_j’_c’_\’_U’_N’_G’_@’_9’_2’_+’_$’_’_’_’_’_’_ú‘_ó‘_ì‘_å‘_Þ‘_ב_Б_É‘_‘_»‘_´‘_­‘_¦‘_Ÿ‘_˜‘_‘‘_Š‘_ƒ‘_|‘_u‘_n‘_g‘_`‘_Y‘_R‘_K‘_D‘_=‘_6‘_/‘_(‘_!‘_‘_‘_ ‘_‘_þ_÷_ð_é_â_Û_Ô_Í_Æ_¿_¸_±_ª_£_œ_•_Ž_‡_€_y_r_k_d_]_V_O_H_A_:_3_,_%____ __û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿŽ_øŽ_ñŽ_êŽ_ãŽ_ÜŽ_ÕŽ_ÎŽ_ÇŽ_ÀŽ_¹Ž_²Ž_«Ž_¤Ž_Ž_–Ž_Ž_ˆŽ_Ž_zŽ_sŽ_lŽ_eŽ_^Ž_WŽ_PŽ_IŽ_BŽ_;Ž_4Ž_-Ž_&Ž_Ž_Ž_Ž_ Ž_Ž_ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ùŒ_òŒ_ëŒ_äŒ_ÝŒ_ÖŒ_ÏŒ_ÈŒ_ÁŒ_ºŒ_³Œ_¬Œ_¥Œ_žŒ_—Œ_Œ_‰Œ_‚Œ_{Œ_tŒ_mŒ_fŒ__Œ_XŒ_QŒ_JŒ_CŒ_<Œ_5Œ_.Œ_'Œ_ Œ_Œ_Œ_ Œ_Œ_ý‹_ö‹_ï‹_è‹_á‹_Ú‹_Ó‹_Ì‹_Å‹_¾‹_·‹_°‹_©‹_¢‹_›‹_”‹_‹_†‹_‹_x‹_q‹_j‹_c‹_\‹_U‹_N‹_G‹_@‹_9‹_2‹_+‹_$‹_‹_‹_‹_‹_‹_úŠ_óŠ_ìŠ_åŠ_ÞŠ_׊_Њ_ÉŠ_Š_»Š_´Š_­Š_¦Š_ŸŠ_˜Š_‘Š_ŠŠ_ƒŠ_|Š_uŠ_nŠ_gŠ_`Š_YŠ_RŠ_KŠ_DŠ_=Š_6Š_/Š_(Š_!Š_Š_Š_ Š_Š_þ‰_÷‰_ð‰_é‰_â‰_Û‰_Ô‰_͉_Ɖ_¿‰_¸‰_±‰_ª‰_£‰_œ‰_•‰_މ_‡‰_€‰_y‰_r‰_k‰_d‰_]‰_V‰_O‰_H‰_A‰_:‰_3‰_,‰_%‰_‰_‰_‰_ ‰_‰_ûˆ_ôˆ_íˆ_æˆ_߈_؈_ш_ʈ_È_¼ˆ_µˆ_®ˆ_§ˆ_ ˆ_™ˆ_’ˆ_‹ˆ_„ˆ_}ˆ_vˆ_oˆ_hˆ_aˆ_Zˆ_Sˆ_Lˆ_Eˆ_>ˆ_7ˆ_0ˆ_)ˆ_"ˆ_ˆ_ˆ_ ˆ_ˆ_ÿ‡_ø‡_ñ‡_ê‡_ã‡_܇_Õ‡_·_LJ_À‡_¹‡_²‡_«‡_¤‡_‡_–‡_‡_ˆ‡_‡_z‡_s‡_l‡_e‡_^‡_W‡_P‡_I‡_B‡_;‡_4‡_-‡_&‡_‡_‡_‡_ ‡_‡_ü†_õ†_î†_ç†_à†_Ù†_Ò†_ˆ_Ć_½†_¶†_¯†_¨†_¡†_š†_“†_Œ†_…†_~†_w†_p†_i†_b†_[†_T†_M†_F†_?†_8†_1†_*†_#†_†_†_†_†_†_ù…_ò…_ë…_ä…_Ý…_Ö…_Ï…_È…_Á…_º…_³…_¬…_¥…_ž…_—…_…_‰…_‚…_{…_t…_m…_f…__…_X…_Q…_J…_C…_<…_5…_.…_'…_ …_…_…_ …_…_ý„_ö„_ï„_è„_á„_Ú„_Ó„_Ì„_Å„_¾„_·„_°„_©„_¢„_›„_”„_„_†„_„_x„_q„_j„_c„_\„_U„_N„_G„_@„_9„_2„_+„_$„_„_„_„_„_„_úƒ_óƒ_ìƒ_åƒ_Þƒ_׃_Ѓ_Ƀ_ƒ_»ƒ_´ƒ_­ƒ_¦ƒ_Ÿƒ_˜ƒ_‘ƒ_Šƒ_ƒƒ_|ƒ_uƒ_nƒ_gƒ_`ƒ_Yƒ_Rƒ_Kƒ_Dƒ_=ƒ_6ƒ_/ƒ_(ƒ_!ƒ_ƒ_ƒ_ ƒ_ƒ_þ‚_÷‚_ð‚_é‚_â‚_Û‚_Ô‚_Í‚_Æ‚_¿‚_¸‚_±‚_ª‚_£‚_œ‚_•‚_Ž‚_‡‚_€‚_y‚_r‚_k‚_d‚_]‚_V‚_O‚_H‚_A‚_:‚_3‚_,‚_%‚_‚_‚_‚_ ‚_‚_û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿ€_ø€_ñ€_ê€_ã€_Ü€_Õ€_΀_Ç€_À€_¹€_²€_«€_¤€_€_–€_€_ˆ€_€_z€_s€_l€_e€_^€_W€_P€_I€_B€_;€_4€_-€_&€_€_€_€_ €_€_ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù~_ò~_ë~_ä~_Ý~_Ö~_Ï~_È~_Á~_º~_³~_¬~_¥~_ž~_—~_~_‰~_‚~_{~_t~_m~_f~__~_X~_Q~_J~_C~_<~_5~_.~_'~_ ~_~_~_ ~_~_ý}_ö}_ï}_è}_á}_Ú}_Ó}_Ì}_Å}_¾}_·}_°}_©}_¢}_›}_”}_}_†}_}_x}_q}_j}_c}_\}_U}_N}_G}_@}_9}_2}_+}_$}_}_}_}_}_}_ú|_ó|_ì|_å|_Þ|_×|_Ð|_É|_Â|_»|_´|_­|_¦|_Ÿ|_˜|_‘|_Š|_ƒ|_||_u|_n|_g|_`|_Y|_R|_K|_D|_=|_6|_/|_(|_!|_|_|_ |_|_þ{_÷{_ð{_é{_â{_Û{_Ô{_Í{_Æ{_¿{_¸{_±{_ª{_£{_œ{_•{_Ž{_‡{_€{_y{_r{_k{_d{_]{_V{_O{_H{_A{_:{_3{_,{_%{_{_{_{_ {_{_ûz_ôz_íz_æz_ßz_Øz_Ñz_Êz_Ãz_¼z_µz_®z_§z_ z_™z_’z_‹z_„z_}z_vz_oz_hz_az_Zz_Sz_Lz_Ez_>z_7z_0z_)z_"z_z_z_ z_z_ÿy_øy_ñy_êy_ãy_Üy_Õy_Îy_Çy_Ày_¹y_²y_«y_¤y_y_–y_y_ˆy_y_zy_sy_ly_ey_^y_Wy_Py_Iy_By_;y_4y_-y_&y_y_y_y_ y_y_üx_õx_îx_çx_àx_Ùx_Òx_Ëx_Äx_½x_¶x_¯x_¨x_¡x_šx_“x_Œx_…x_~x_wx_px_ix_bx_[x_Tx_Mx_Fx_?x_8x_1x_*x_#x_x_x_x_x_x_ùw_òw_ëw_äw_Ýw_Öw_Ïw_Èw_Áw_ºw_³w_¬w_¥w_žw_—w_w_‰w_‚w_{w_tw_mw_fw__w_Xw_Qw_Jw_Cw_s_7s_0s_)s_"s_s_s_ s_s_ÿr_ør_ñr_êr_ãr_Ür_Õr_Îr_Çr_Àr_¹r_²r_«r_¤r_r_–r_r_ˆr_r_zr_sr_lr_er_^r_Wr_Pr_Ir_Br_;r_4r_-r_&r_r_r_r_ r_r_üq_õq_îq_çq_àq_Ùq_Òq_Ëq_Äq_½q_¶q_¯q_¨q_¡q_šq_“q_Œq_…q_~q_wq_pq_iq_bq_[q_Tq_Mq_Fq_?q_8q_1q_*q_#q_q_q_q_q_q_ùp_òp_ëp_äp_Ýp_Öp_Ïp_Èp_Áp_ºp_³p_¬p_¥p_žp_—p_p_‰p_‚p_{p_tp_mp_fp__p_Xp_Qp_Jp_Cp_l_7l_0l_)l_"l_l_l_ l_l_ÿk_øk_ñk_êk_ãk_Ük_Õk_Îk_Çk_Àk_¹k_²k_«k_¤k_k_–k_k_ˆk_k_zk_sk_lk_ek_^k_Wk_Pk_Ik_Bk_;k_4k_-k_&k_k_k_k_ k_k_üj_õj_îj_çj_àj_Ùj_Òj_Ëj_Äj_½j_¶j_¯j_¨j_¡j_šj_“j_Œj_…j_~j_wj_pj_ij_bj_[j_Tj_Mj_Fj_?j_8j_1j_*j_#j_j_j_j_j_j_ùi_òi_ëi_äi_Ýi_Öi_Ïi_Èi_Ái_ºi_³i_¬i_¥i_ži_—i_i_‰i_‚i_{i_ti_mi_fi__i_Xi_Qi_Ji_Ci_e_7e_0e_)e_"e_e_e_ e_e_ÿd_ød_ñd_êd_ãd_Üd_Õd_Îd_Çd_Àd_¹d_²d_«d_¤d_d_–d_d_ˆd_d_zd_sd_ld_ed_^d_Wd_Pd_Id_Bd_;d_4d_-d_&d_d_d_d_ d_d_üc_õc_îc_çc_àc_Ùc_Òc_Ëc_Äc_½c_¶c_¯c_¨c_¡c_šc_“c_Œc_…c_~c_wc_pc_ic_bc_[c_Tc_Mc_Fc_?c_8c_1c_*c_#c_c_c_c_c_c_ùb_òb_ëb_äb_Ýb_Öb_Ïb_Èb_Áb_ºb_³b_¬b_¥b_žb_—b_b_‰b_‚b_{b_tb_mb_fb__b_Xb_Qb_Jb_Cb_^_7^_0^_)^_"^_^_^_ ^_^_ÿ]_ø]_ñ]_ê]_ã]_Ü]_Õ]_Î]_Ç]_À]_¹]_²]_«]_¤]_]_–]_]_ˆ]_]_z]_s]_l]_e]_^]_W]_P]_I]_B]_;]_4]_-]_&]_]_]_]_ ]_]_ü\_õ\_î\_ç\_à\_Ù\_Ò\_Ë\_Ä\_½\_¶\_¯\_¨\_¡\_š\_“\_Œ\_…\_~\_w\_p\_i\_b\_[\_T\_M\_F\_?\_8\_1\_*\_#\_\_\_\_\_\_ù[_ò[_ë[_ä[_Ý[_Ö[_Ï[_È[_Á[_º[_³[_¬[_¥[_ž[_—[_[_‰[_‚[_{[_t[_m[_f[__[_X[_Q[_J[_C[_<[_5[_.[_'[_ [_[_[_ [_[_ýZ_öZ_ïZ_èZ_áZ_ÚZ_ÓZ_ÌZ_ÅZ_¾Z_·Z_°Z_©Z_¢Z_›Z_”Z_Z_†Z_Z_xZ_qZ_jZ_cZ_\Z_UZ_NZ_GZ_@Z_9Z_2Z_+Z_$Z_Z_Z_Z_Z_Z_úY_óY_ìY_åY_ÞY_×Y_ÐY_ÉY_ÂY_»Y_´Y_­Y_¦Y_ŸY_˜Y_‘Y_ŠY_ƒY_|Y_uY_nY_gY_`Y_YY_RY_KY_DY_=Y_6Y_/Y_(Y_!Y_Y_Y_ Y_Y_þX_÷X_ðX_éX_âX_ÛX_ÔX_ÍX_ÆX_¿X_¸X_±X_ªX_£X_œX_•X_ŽX_‡X_€X_yX_rX_kX_dX_]X_VX_OX_HX_AX_:X_3X_,X_%X_X_X_X_ X_X_ûW_ôW_íW_æW_ßW_ØW_ÑW_ÊW_ÃW_¼W_µW_®W_§W_ W_™W_’W_‹W_„W_}W_vW_oW_hW_aW_ZW_SW_LW_EW_>W_7W_0W_)W_"W_W_W_ W_W_ÿV_øV_ñV_êV_ãV_ÜV_ÕV_ÎV_ÇV_ÀV_¹V_²V_«V_¤V_V_–V_V_ˆV_V_zV_sV_lV_eV_^V_WV_PV_IV_BV_;V_4V_-V_&V_V_V_V_ V_V_üU_õU_îU_çU_àU_ÙU_ÒU_ËU_ÄU_½U_¶U_¯U_¨U_¡U_šU_“U_ŒU_…U_~U_wU_pU_iU_bU_[U_TU_MU_FU_?U_8U_1U_*U_#U_U_U_U_U_U_ùT_òT_ëT_äT_ÝT_ÖT_ÏT_ÈT_ÁT_ºT_³T_¬T_¥T_žT_—T_T_‰T_‚T_{T_tT_mT_fT__T_XT_QT_JT_CT_P_7P_0P_)P_"P_P_P_ P_P_ÿO_øO_ñO_êO_ãO_ÜO_ÕO_ÎO_ÇO_ÀO_¹O_²O_«O_¤O_O_–O_O_ˆO_O_zO_sO_lO_eO_^O_WO_PO_IO_BO_;O_4O_-O_&O_O_O_O_ O_O_üN_õN_îN_çN_àN_ÙN_ÒN_ËN_ÄN_½N_¶N_¯N_¨N_¡N_šN_“N_ŒN_…N_~N_wN_pN_iN_bN_[N_TN_MN_FN_?N_8N_1N_*N_#N_N_N_N_N_N_ùM_òM_ëM_äM_ÝM_ÖM_ÏM_ÈM_ÁM_ºM_³M_¬M_¥M_žM_—M_M_‰M_‚M_{M_tM_mM_fM__M_XM_QM_JM_CM_I_7I_0I_)I_"I_I_I_ I_I_ÿH_øH_ñH_êH_ãH_ÜH_ÕH_ÎH_ÇH_ÀH_¹H_²H_«H_¤H_H_–H_H_ˆH_H_zH_sH_lH_eH_^H_WH_PH_IH_BH_;H_4H_-H_&H_H_H_H_ H_H_üG_õG_îG_çG_àG_ÙG_ÒG_ËG_ÄG_½G_¶G_¯G_¨G_¡G_šG_“G_ŒG_…G_~G_wG_pG_iG_bG_[G_TG_MG_FG_?G_8G_1G_*G_#G_G_G_G_G_G_ùF_òF_ëF_äF_ÝF_ÖF_ÏF_ÈF_ÁF_ºF_³F_¬F_¥F_žF_—F_F_‰F_‚F_{F_tF_mF_fF__F_XF_QF_JF_CF_B_7B_0B_)B_"B_B_B_ B_B_ÿA_øA_ñA_êA_ãA_ÜA_ÕA_ÎA_ÇA_ÀA_¹A_²A_«A_¤A_A_–A_A_ˆA_A_zA_sA_lA_eA_^A_WA_PA_IA_BA_;A_4A_-A_&A_A_A_A_ A_A_ü@_õ@_î@_ç@_à@_Ù@_Ò@_Ë@_Ä@_½@_¶@_¯@_¨@_¡@_š@_“@_Œ@_…@_~@_w@_p@_i@_b@_[@_T@_M@_F@_?@_8@_1@_*@_#@_@_@_@_@_@_ù?_ò?_ë?_ä?_Ý?_Ö?_Ï?_È?_Á?_º?_³?_¬?_¥?_ž?_—?_?_‰?_‚?_{?_t?_m?_f?__?_X?_Q?_J?_C?__ö>_ï>_è>_á>_Ú>_Ó>_Ì>_Å>_¾>_·>_°>_©>_¢>_›>_”>_>_†>_>_x>_q>_j>_c>_\>_U>_N>_G>_@>_9>_2>_+>_$>_>_>_>_>_>_ú=_ó=_ì=_å=_Þ=_×=_Ð=_É=_Â=_»=_´=_­=_¦=_Ÿ=_˜=_‘=_Š=_ƒ=_|=_u=_n=_g=_`=_Y=_R=_K=_D=_==_6=_/=_(=_!=_=_=_ =_=_þ<_÷<_ð<_é<_â<_Û<_Ô<_Í<_Æ<_¿<_¸<_±<_ª<_£<_œ<_•<_Ž<_‡<_€<_y<_r<_k<_d<_]<_V<_O<_H<_A<_:<_3<_,<_%<_<_<_<_ <_<_û;_ô;_í;_æ;_ß;_Ø;_Ñ;_Ê;_Ã;_¼;_µ;_®;_§;_ ;_™;_’;_‹;_„;_};_v;_o;_h;_a;_Z;_S;_L;_E;_>;_7;_0;_);_";_;_;_ ;_;_ÿ:_ø:_ñ:_ê:_ã:_Ü:_Õ:_Î:_Ç:_À:_¹:_²:_«:_¤:_:_–:_:_ˆ:_:_z:_s:_l:_e:_^:_W:_P:_I:_B:_;:_4:_-:_&:_:_:_:_ :_:_ü9_õ9_î9_ç9_à9_Ù9_Ò9_Ë9_Ä9_½9_¶9_¯9_¨9_¡9_š9_“9_Œ9_…9_~9_w9_p9_i9_b9_[9_T9_M9_F9_?9_89_19_*9_#9_9_9_9_9_9_ù8_ò8_ë8_ä8_Ý8_Ö8_Ï8_È8_Á8_º8_³8_¬8_¥8_ž8_—8_8_‰8_‚8_{8_t8_m8_f8__8_X8_Q8_J8_C8_<8_58_.8_'8_ 8_8_8_ 8_8_ý7_ö7_ï7_è7_á7_Ú7_Ó7_Ì7_Å7_¾7_·7_°7_©7_¢7_›7_”7_7_†7_7_x7_q7_j7_c7_\7_U7_N7_G7_@7_97_27_+7_$7_7_7_7_7_7_ú6_ó6_ì6_å6_Þ6_×6_Ð6_É6_Â6_»6_´6_­6_¦6_Ÿ6_˜6_‘6_Š6_ƒ6_|6_u6_n6_g6_`6_Y6_R6_K6_D6_=6_66_/6_(6_!6_6_6_ 6_6_þ5_÷5_ð5_é5_â5_Û5_Ô5_Í5_Æ5_¿5_¸5_±5_ª5_£5_œ5_•5_Ž5_‡5_€5_y5_r5_k5_d5_]5_V5_O5_H5_A5_:5_35_,5_%5_5_5_5_ 5_5_û4_ô4_í4_æ4_ß4_Ø4_Ñ4_Ê4_Ã4_¼4_µ4_®4_§4_ 4_™4_’4_‹4_„4_}4_v4_o4_h4_a4_Z4_S4_L4_E4_>4_74_04_)4_"4_4_4_ 4_4_ÿ3_ø3_ñ3_ê3_ã3_Ü3_Õ3_Î3_Ç3_À3_¹3_²3_«3_¤3_3_–3_3_ˆ3_3_z3_s3_l3_e3_^3_W3_P3_I3_B3_;3_43_-3_&3_3_3_3_ 3_3_ü2_õ2_î2_ç2_à2_Ù2_Ò2_Ë2_Ä2_½2_¶2_¯2_¨2_¡2_š2_“2_Œ2_…2_~2_w2_p2_i2_b2_[2_T2_M2_F2_?2_82_12_*2_#2_2_2_2_2_2_ù1_ò1_ë1_ä1_Ý1_Ö1_Ï1_È1_Á1_º1_³1_¬1_¥1_ž1_—1_1_‰1_‚1_{1_t1_m1_f1__1_X1_Q1_J1_C1_<1_51_.1_'1_ 1_1_1_ 1_1_ý0_ö0_ï0_è0_á0_Ú0_Ó0_Ì0_Å0_¾0_·0_°0_©0_¢0_›0_”0_0_†0_0_x0_q0_j0_c0_\0_U0_N0_G0_@0_90_20_+0_$0_0_0_0_0_0_ú/_ó/_ì/_å/_Þ/_×/_Ð/_É/_Â/_»/_´/_­/_¦/_Ÿ/_˜/_‘/_Š/_ƒ/_|/_u/_n/_g/_`/_Y/_R/_K/_D/_=/_6/_//_(/_!/_/_/_ /_/_þ._÷._ð._é._â._Û._Ô._Í._Æ._¿._¸._±._ª._£._œ._•._Ž._‡._€._y._r._k._d._]._V._O._H._A._:._3._,._%._._._._ ._._û-_ô-_í-_æ-_ß-_Ø-_Ñ-_Ê-_Ã-_¼-_µ-_®-_§-_ -_™-_’-_‹-_„-_}-_v-_o-_h-_a-_Z-_S-_L-_E-_>-_7-_0-_)-_"-_-_-_ -_-_ÿ,_ø,_ñ,_ê,_ã,_Ü,_Õ,_Î,_Ç,_À,_¹,_²,_«,_¤,_,_–,_,_ˆ,_,_z,_s,_l,_e,_^,_W,_P,_I,_B,_;,_4,_-,_&,_,_,_,_ ,_,_ü+_õ+_î+_ç+_à+_Ù+_Ò+_Ë+_Ä+_½+_¶+_¯+_¨+_¡+_š+_“+_Œ+_…+_~+_w+_p+_i+_b+_[+_T+_M+_F+_?+_8+_1+_*+_#+_+_+_+_+_+_ù*_ò*_ë*_ä*_Ý*_Ö*_Ï*_È*_Á*_º*_³*_¬*_¥*_ž*_—*_*_‰*_‚*_{*_t*_m*_f*__*_X*_Q*_J*_C*_<*_5*_.*_'*_ *_*_*_ *_*_ý)_ö)_ï)_è)_á)_Ú)_Ó)_Ì)_Å)_¾)_·)_°)_©)_¢)_›)_”)_)_†)_)_x)_q)_j)_c)_\)_U)_N)_G)_@)_9)_2)_+)_$)_)_)_)_)_)_ú(_ó(_ì(_å(_Þ(_×(_Ð(_É(_Â(_»(_´(_­(_¦(_Ÿ(_˜(_‘(_Š(_ƒ(_|(_u(_n(_g(_`(_Y(_R(_K(_D(_=(_6(_/(_((_!(_(_(_ (_(_þ'_÷'_ð'_é'_â'_Û'_Ô'_Í'_Æ'_¿'_¸'_±'_ª'_£'_œ'_•'_Ž'_‡'_€'_y'_r'_k'_d'_]'_V'_O'_H'_A'_:'_3'_,'_%'_'_'_'_ '_'_û&_ô&_í&_æ&_ß&_Ø&_Ñ&_Ê&_Ã&_¼&_µ&_®&_§&_ &_™&_’&_‹&_„&_}&_v&_o&_h&_a&_Z&_S&_L&_E&_>&_7&_0&_)&_"&_&_&_ &_&_ÿ%_ø%_ñ%_ê%_ã%_Ü%_Õ%_Î%_Ç%_À%_¹%_²%_«%_¤%_%_–%_%_ˆ%_%_z%_s%_l%_e%_^%_W%_P%_I%_B%_;%_4%_-%_&%_%_%_%_ %_%_ü$_õ$_î$_ç$_à$_Ù$_Ò$_Ë$_Ä$_½$_¶$_¯$_¨$_¡$_š$_“$_Œ$_…$_~$_w$_p$_i$_b$_[$_T$_M$_F$_?$_8$_1$_*$_#$_$_$_$_$_$_ù#_ò#_ë#_ä#_Ý#_Ö#_Ï#_È#_Á#_º#_³#_¬#_¥#_ž#_—#_#_‰#_‚#_{#_t#_m#_f#__#_X#_Q#_J#_C#_<#_5#_.#_'#_ #_#_#_ #_#_ý"_ö"_ï"_è"_á"_Ú"_Ó"_Ì"_Å"_¾"_·"_°"_©"_¢"_›"_”"_"_†"_"_x"_q"_j"_c"_\"_U"_N"_G"_@"_9"_2"_+"_$"_"_"_"_"_"_ú!_ó!_ì!_å!_Þ!_×!_Ð!_É!_Â!_»!_´!_­!_¦!_Ÿ!_˜!_‘!_Š!_ƒ!_|!_u!_n!_g!_`!_Y!_R!_K!_D!_=!_6!_/!_(!_!!_!_!_ !_!_þ _÷ _ð _é _â _Û _Ô _Í _Æ _¿ _¸ _± _ª _£ _œ _• _Ž _‡ _€ _y _r _k _d _] _V _O _H _A _: _3 _, _% _ _ _ _ _ _û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú_ó_ì_å_Þ_×_Ð_É_Â_»_´_­_¦_Ÿ_˜_‘_Š_ƒ_|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ __þ_÷_ð_é_â_Û_Ô_Í_Æ_¿_¸_±_ª_£_œ_•_Ž_‡_€_y_r_k_d_]_V_O_H_A_:_3_,_%____ __û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú_ó_ì_å_Þ_×_Ð_É_Â_»_´_­_¦_Ÿ_˜_‘_Š_ƒ_|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ __þ_÷_ð_é_â_Û_Ô_Í_Æ_¿_¸_±_ª_£_œ_•_Ž_‡_€_y_r_k_d_]_V_O_H_A_:_3_,_%____ __û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý _ö _ï _è _á _Ú _Ó _Ì _Å _¾ _· _° _© _¢ _› _” _ _† _ _x _q _j _c _\ _U _N _G _@ _9 _2 _+ _$ _ _ _ _ _ _ú _ó _ì _å _Þ _× _Ð _É _ _» _´ _­ _¦ _Ÿ _˜ _‘ _Š _ƒ _| _u _n _g _` _Y _R _K _D _= _6 _/ _( _! _ _ _ _ _þ _÷ _ð _é _â _Û _Ô _Í _Æ _¿ _¸ _± _ª _£ _œ _• _Ž _‡ _€ _y _r _k _d _] _V _O _H _A _: _3 _, _% _ _ _ _ _ _û _ô _í _æ _ß _Ø _Ñ _Ê _à _¼ _µ _® _§ _  _™ _’ _‹ _„ _} _v _o _h _a _Z _S _L _E _> _7 _0 _) _" _ _ _ _ _ÿ _ø _ñ _ê _ã _Ü _Õ _Î _Ç _À _¹ _² _« _¤ _ _– _ _ˆ _ _z _s _l _e _^ _W _P _I _B _; _4 _- _& _ _ _ _ _ _ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú_ó_ì_å_Þ_×_Ð_É_Â_»_´_­_¦_Ÿ_˜_‘_Š_ƒ_|_u_n_g_`_Y_R_K_D_=_6_/_(_!___ __þ_÷_ð_é_â_Û_Ô_Í_Æ_¿_¸_±_ª_£_œ_•_Ž_‡_€_y_r_k_d_]_V_O_H_A_:_3_,_%____ __û_ô_í_æ_ß_Ø_Ñ_Ê_Ã_¼_µ_®_§_ _™_’_‹_„_}_v_o_h_a_Z_S_L_E_>_7_0_)_"___ __ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ýÿ^öÿ^ïÿ^èÿ^áÿ^Úÿ^Óÿ^Ìÿ^Åÿ^¾ÿ^·ÿ^°ÿ^©ÿ^¢ÿ^›ÿ^”ÿ^ÿ^†ÿ^ÿ^xÿ^qÿ^jÿ^cÿ^\ÿ^Uÿ^Nÿ^Gÿ^@ÿ^9ÿ^2ÿ^+ÿ^$ÿ^ÿ^ÿ^ÿ^ÿ^ÿ^úþ^óþ^ìþ^åþ^Þþ^×þ^Ðþ^Éþ^Âþ^»þ^´þ^­þ^¦þ^Ÿþ^˜þ^‘þ^Šþ^ƒþ^|þ^uþ^nþ^gþ^`þ^Yþ^Rþ^Kþ^Dþ^=þ^6þ^/þ^(þ^!þ^þ^þ^ þ^þ^þý^÷ý^ðý^éý^âý^Ûý^Ôý^Íý^Æý^¿ý^¸ý^±ý^ªý^£ý^œý^•ý^Žý^‡ý^€ý^yý^rý^ký^dý^]ý^Vý^Oý^Hý^Aý^:ý^3ý^,ý^%ý^ý^ý^ý^ ý^ý^ûü^ôü^íü^æü^ßü^Øü^Ñü^Êü^Ãü^¼ü^µü^®ü^§ü^ ü^™ü^’ü^‹ü^„ü^}ü^vü^oü^hü^aü^Zü^Sü^Lü^Eü^>ü^7ü^0ü^)ü^"ü^ü^ü^ ü^ü^ÿû^øû^ñû^êû^ãû^Üû^Õû^Îû^Çû^Àû^¹û^²û^«û^¤û^û^–û^û^ˆû^û^zû^sû^lû^eû^^û^Wû^Pû^Iû^Bû^;û^4û^-û^&û^û^û^û^ û^û^üú^õú^îú^çú^àú^Ùú^Òú^Ëú^Äú^½ú^¶ú^¯ú^¨ú^¡ú^šú^“ú^Œú^…ú^~ú^wú^pú^iú^bú^[ú^Tú^Mú^Fú^?ú^8ú^1ú^*ú^#ú^ú^ú^ú^ú^ú^ùù^òù^ëù^äù^Ýù^Öù^Ïù^Èù^Áù^ºù^³ù^¬ù^¥ù^žù^—ù^ù^‰ù^‚ù^{ù^tù^mù^fù^_ù^Xù^Qù^Jù^Cù^<ù^5ù^.ù^'ù^ ù^ù^ù^ ù^ù^ýø^öø^ïø^èø^áø^Úø^Óø^Ìø^Åø^¾ø^·ø^°ø^©ø^¢ø^›ø^”ø^ø^†ø^ø^xø^qø^jø^cø^\ø^Uø^Nø^Gø^@ø^9ø^2ø^+ø^$ø^ø^ø^ø^ø^ø^ú÷^ó÷^ì÷^å÷^Þ÷^×÷^Ð÷^É÷^Â÷^»÷^´÷^­÷^¦÷^Ÿ÷^˜÷^‘÷^Š÷^ƒ÷^|÷^u÷^n÷^g÷^`÷^Y÷^R÷^K÷^D÷^=÷^6÷^/÷^(÷^!÷^÷^÷^ ÷^÷^þö^÷ö^ðö^éö^âö^Ûö^Ôö^Íö^Æö^¿ö^¸ö^±ö^ªö^£ö^œö^•ö^Žö^‡ö^€ö^yö^rö^kö^dö^]ö^Vö^Oö^Hö^Aö^:ö^3ö^,ö^%ö^ö^ö^ö^ ö^ö^ûõ^ôõ^íõ^æõ^ßõ^Øõ^Ñõ^Êõ^Ãõ^¼õ^µõ^®õ^§õ^ õ^™õ^’õ^‹õ^„õ^}õ^võ^oõ^hõ^aõ^Zõ^Sõ^Lõ^Eõ^>õ^7õ^0õ^)õ^"õ^õ^õ^ õ^õ^ÿô^øô^ñô^êô^ãô^Üô^Õô^Îô^Çô^Àô^¹ô^²ô^«ô^¤ô^ô^–ô^ô^ˆô^ô^zô^sô^lô^eô^^ô^Wô^Pô^Iô^Bô^;ô^4ô^-ô^&ô^ô^ô^ô^ ô^ô^üó^õó^îó^çó^àó^Ùó^Òó^Ëó^Äó^½ó^¶ó^¯ó^¨ó^¡ó^šó^“ó^Œó^…ó^~ó^wó^pó^ió^bó^[ó^Tó^Mó^Fó^?ó^8ó^1ó^*ó^#ó^ó^ó^ó^ó^ó^ùò^òò^ëò^äò^Ýò^Öò^Ïò^Èò^Áò^ºò^³ò^¬ò^¥ò^žò^—ò^ò^‰ò^‚ò^{ò^tò^mò^fò^_ò^Xò^Qò^Jò^Cò^<ò^5ò^.ò^'ò^ ò^ò^ò^ ò^ò^ýñ^öñ^ïñ^èñ^áñ^Úñ^Óñ^Ìñ^Åñ^¾ñ^·ñ^°ñ^©ñ^¢ñ^›ñ^”ñ^ñ^†ñ^ñ^xñ^qñ^jñ^cñ^\ñ^Uñ^Nñ^Gñ^@ñ^9ñ^2ñ^+ñ^$ñ^ñ^ñ^ñ^ñ^ñ^úð^óð^ìð^åð^Þð^×ð^Ðð^Éð^Âð^»ð^´ð^­ð^¦ð^Ÿð^˜ð^‘ð^Šð^ƒð^|ð^uð^nð^gð^`ð^Yð^Rð^Kð^Dð^=ð^6ð^/ð^(ð^!ð^ð^ð^ ð^ð^þï^÷ï^ðï^éï^âï^Ûï^Ôï^Íï^Æï^¿ï^¸ï^±ï^ªï^£ï^œï^•ï^Žï^‡ï^€ï^yï^rï^kï^dï^]ï^Vï^Oï^Hï^Aï^:ï^3ï^,ï^%ï^ï^ï^ï^ ï^ï^ûî^ôî^íî^æî^ßî^Øî^Ñî^Êî^Ãî^¼î^µî^®î^§î^ î^™î^’î^‹î^„î^}î^vî^oî^hî^aî^Zî^Sî^Lî^Eî^>î^7î^0î^)î^"î^î^î^ î^î^ÿí^øí^ñí^êí^ãí^Üí^Õí^Îí^Çí^Àí^¹í^²í^«í^¤í^í^–í^í^ˆí^í^zí^sí^lí^eí^^í^Wí^Pí^Ií^Bí^;í^4í^-í^&í^í^í^í^ í^í^üì^õì^îì^çì^àì^Ùì^Òì^Ëì^Äì^½ì^¶ì^¯ì^¨ì^¡ì^šì^“ì^Œì^…ì^~ì^wì^pì^iì^bì^[ì^Tì^Mì^Fì^?ì^8ì^1ì^*ì^#ì^ì^ì^ì^ì^ì^ùë^òë^ëë^äë^Ýë^Öë^Ïë^Èë^Áë^ºë^³ë^¬ë^¥ë^žë^—ë^ë^‰ë^‚ë^{ë^të^më^fë^_ë^Xë^Që^Jë^Cë^<ë^5ë^.ë^'ë^ ë^ë^ë^ ë^ë^ýê^öê^ïê^èê^áê^Úê^Óê^Ìê^Åê^¾ê^·ê^°ê^©ê^¢ê^›ê^”ê^ê^†ê^ê^xê^qê^jê^cê^\ê^Uê^Nê^Gê^@ê^9ê^2ê^+ê^$ê^ê^ê^ê^ê^ê^úé^óé^ìé^åé^Þé^×é^Ðé^Éé^Âé^»é^´é^­é^¦é^Ÿé^˜é^‘é^Šé^ƒé^|é^ué^né^gé^`é^Yé^Ré^Ké^Dé^=é^6é^/é^(é^!é^é^é^ é^é^þè^÷è^ðè^éè^âè^Ûè^Ôè^Íè^Æè^¿è^¸è^±è^ªè^£è^œè^•è^Žè^‡è^€è^yè^rè^kè^dè^]è^Vè^Oè^Hè^Aè^:è^3è^,è^%è^è^è^è^ è^è^ûç^ôç^íç^æç^ßç^Øç^Ñç^Êç^Ãç^¼ç^µç^®ç^§ç^ ç^™ç^’ç^‹ç^„ç^}ç^vç^oç^hç^aç^Zç^Sç^Lç^Eç^>ç^7ç^0ç^)ç^"ç^ç^ç^ ç^ç^ÿæ^øæ^ñæ^êæ^ãæ^Üæ^Õæ^Îæ^Çæ^Àæ^¹æ^²æ^«æ^¤æ^æ^–æ^æ^ˆæ^æ^zæ^sæ^læ^eæ^^æ^Wæ^Pæ^Iæ^Bæ^;æ^4æ^-æ^&æ^æ^æ^æ^ æ^æ^üå^õå^îå^çå^àå^Ùå^Òå^Ëå^Äå^½å^¶å^¯å^¨å^¡å^šå^“å^Œå^…å^~å^wå^på^iå^bå^[å^Tå^Må^Få^?å^8å^1å^*å^#å^å^å^å^å^å^ùä^òä^ëä^ää^Ýä^Öä^Ïä^Èä^Áä^ºä^³ä^¬ä^¥ä^žä^—ä^ä^‰ä^‚ä^{ä^tä^mä^fä^_ä^Xä^Qä^Jä^Cä^<ä^5ä^.ä^'ä^ ä^ä^ä^ ä^ä^ýã^öã^ïã^èã^áã^Úã^Óã^Ìã^Åã^¾ã^·ã^°ã^©ã^¢ã^›ã^”ã^ã^†ã^ã^xã^qã^jã^cã^\ã^Uã^Nã^Gã^@ã^9ã^2ã^+ã^$ã^ã^ã^ã^ã^ã^úâ^óâ^ìâ^åâ^Þâ^×â^Ðâ^Éâ^Ââ^»â^´â^­â^¦â^Ÿâ^˜â^‘â^Šâ^ƒâ^|â^uâ^nâ^gâ^`â^Yâ^Râ^Kâ^Dâ^=â^6â^/â^(â^!â^â^â^ â^â^þá^÷á^ðá^éá^âá^Ûá^Ôá^Íá^Æá^¿á^¸á^±á^ªá^£á^œá^•á^Žá^‡á^€á^yá^rá^ká^dá^]á^Vá^Oá^Há^Aá^:á^3á^,á^%á^á^á^á^ á^á^ûà^ôà^íà^æà^ßà^Øà^Ñà^Êà^Ãà^¼à^µà^®à^§à^ à^™à^’à^‹à^„à^}à^và^oà^hà^aà^Zà^Sà^Là^Eà^>à^7à^0à^)à^"à^à^à^ à^à^ÿß^øß^ñß^êß^ãß^Üß^Õß^Îß^Çß^Àß^¹ß^²ß^«ß^¤ß^ß^–ß^ß^ˆß^ß^zß^sß^lß^eß^^ß^Wß^Pß^Iß^Bß^;ß^4ß^-ß^&ß^ß^ß^ß^ ß^ß^üÞ^õÞ^îÞ^çÞ^àÞ^ÙÞ^ÒÞ^ËÞ^ÄÞ^½Þ^¶Þ^¯Þ^¨Þ^¡Þ^šÞ^“Þ^ŒÞ^…Þ^~Þ^wÞ^pÞ^iÞ^bÞ^[Þ^TÞ^MÞ^FÞ^?Þ^8Þ^1Þ^*Þ^#Þ^Þ^Þ^Þ^Þ^Þ^ùÝ^òÝ^ëÝ^äÝ^ÝÝ^ÖÝ^ÏÝ^ÈÝ^ÁÝ^ºÝ^³Ý^¬Ý^¥Ý^žÝ^—Ý^Ý^‰Ý^‚Ý^{Ý^tÝ^mÝ^fÝ^_Ý^XÝ^QÝ^JÝ^CÝ^<Ý^5Ý^.Ý^'Ý^ Ý^Ý^Ý^ Ý^Ý^ýÜ^öÜ^ïÜ^èÜ^áÜ^ÚÜ^ÓÜ^ÌÜ^ÅÜ^¾Ü^·Ü^°Ü^©Ü^¢Ü^›Ü^”Ü^Ü^†Ü^Ü^xÜ^qÜ^jÜ^cÜ^\Ü^UÜ^NÜ^GÜ^@Ü^9Ü^2Ü^+Ü^$Ü^Ü^Ü^Ü^Ü^Ü^úÛ^óÛ^ìÛ^åÛ^ÞÛ^×Û^ÐÛ^ÉÛ^ÂÛ^»Û^´Û^­Û^¦Û^ŸÛ^˜Û^‘Û^ŠÛ^ƒÛ^|Û^uÛ^nÛ^gÛ^`Û^YÛ^RÛ^KÛ^DÛ^=Û^6Û^/Û^(Û^!Û^Û^Û^ Û^Û^þÚ^÷Ú^ðÚ^éÚ^âÚ^ÛÚ^ÔÚ^ÍÚ^ÆÚ^¿Ú^¸Ú^±Ú^ªÚ^£Ú^œÚ^•Ú^ŽÚ^‡Ú^€Ú^yÚ^rÚ^kÚ^dÚ^]Ú^VÚ^OÚ^HÚ^AÚ^:Ú^3Ú^,Ú^%Ú^Ú^Ú^Ú^ Ú^Ú^ûÙ^ôÙ^íÙ^æÙ^ßÙ^ØÙ^ÑÙ^ÊÙ^ÃÙ^¼Ù^µÙ^®Ù^§Ù^ Ù^™Ù^’Ù^‹Ù^„Ù^}Ù^vÙ^oÙ^hÙ^aÙ^ZÙ^SÙ^LÙ^EÙ^>Ù^7Ù^0Ù^)Ù^"Ù^Ù^Ù^ Ù^Ù^ÿØ^øØ^ñØ^êØ^ãØ^ÜØ^ÕØ^ÎØ^ÇØ^ÀØ^¹Ø^²Ø^«Ø^¤Ø^Ø^–Ø^Ø^ˆØ^Ø^zØ^sØ^lØ^eØ^^Ø^WØ^PØ^IØ^BØ^;Ø^4Ø^-Ø^&Ø^Ø^Ø^Ø^ Ø^Ø^ü×^õ×^î×^ç×^à×^Ù×^Ò×^Ë×^Ä×^½×^¶×^¯×^¨×^¡×^š×^“×^Œ×^…×^~×^w×^p×^i×^b×^[×^T×^M×^F×^?×^8×^1×^*×^#×^×^×^×^×^×^ùÖ^òÖ^ëÖ^äÖ^ÝÖ^ÖÖ^ÏÖ^ÈÖ^ÁÖ^ºÖ^³Ö^¬Ö^¥Ö^žÖ^—Ö^Ö^‰Ö^‚Ö^{Ö^tÖ^mÖ^fÖ^_Ö^XÖ^QÖ^JÖ^CÖ^<Ö^5Ö^.Ö^'Ö^ Ö^Ö^Ö^ Ö^Ö^ýÕ^öÕ^ïÕ^èÕ^áÕ^ÚÕ^ÓÕ^ÌÕ^ÅÕ^¾Õ^·Õ^°Õ^©Õ^¢Õ^›Õ^”Õ^Õ^†Õ^Õ^xÕ^qÕ^jÕ^cÕ^\Õ^UÕ^NÕ^GÕ^@Õ^9Õ^2Õ^+Õ^$Õ^Õ^Õ^Õ^Õ^Õ^úÔ^óÔ^ìÔ^åÔ^ÞÔ^×Ô^ÐÔ^ÉÔ^ÂÔ^»Ô^´Ô^­Ô^¦Ô^ŸÔ^˜Ô^‘Ô^ŠÔ^ƒÔ^|Ô^uÔ^nÔ^gÔ^`Ô^YÔ^RÔ^KÔ^DÔ^=Ô^6Ô^/Ô^(Ô^!Ô^Ô^Ô^ Ô^Ô^þÓ^÷Ó^ðÓ^éÓ^âÓ^ÛÓ^ÔÓ^ÍÓ^ÆÓ^¿Ó^¸Ó^±Ó^ªÓ^£Ó^œÓ^•Ó^ŽÓ^‡Ó^€Ó^yÓ^rÓ^kÓ^dÓ^]Ó^VÓ^OÓ^HÓ^AÓ^:Ó^3Ó^,Ó^%Ó^Ó^Ó^Ó^ Ó^Ó^ûÒ^ôÒ^íÒ^æÒ^ßÒ^ØÒ^ÑÒ^ÊÒ^ÃÒ^¼Ò^µÒ^®Ò^§Ò^ Ò^™Ò^’Ò^‹Ò^„Ò^}Ò^vÒ^oÒ^hÒ^aÒ^ZÒ^SÒ^LÒ^EÒ^>Ò^7Ò^0Ò^)Ò^"Ò^Ò^Ò^ Ò^Ò^ÿÑ^øÑ^ñÑ^êÑ^ãÑ^ÜÑ^ÕÑ^ÎÑ^ÇÑ^ÀÑ^¹Ñ^²Ñ^«Ñ^¤Ñ^Ñ^–Ñ^Ñ^ˆÑ^Ñ^zÑ^sÑ^lÑ^eÑ^^Ñ^WÑ^PÑ^IÑ^BÑ^;Ñ^4Ñ^-Ñ^&Ñ^Ñ^Ñ^Ñ^ Ñ^Ñ^üÐ^õÐ^îÐ^çÐ^àÐ^ÙÐ^ÒÐ^ËÐ^ÄÐ^½Ð^¶Ð^¯Ð^¨Ð^¡Ð^šÐ^“Ð^ŒÐ^…Ð^~Ð^wÐ^pÐ^iÐ^bÐ^[Ð^TÐ^MÐ^FÐ^?Ð^8Ð^1Ð^*Ð^#Ð^Ð^Ð^Ð^Ð^Ð^ùÏ^òÏ^ëÏ^äÏ^ÝÏ^ÖÏ^ÏÏ^ÈÏ^ÁÏ^ºÏ^³Ï^¬Ï^¥Ï^žÏ^—Ï^Ï^‰Ï^‚Ï^{Ï^tÏ^mÏ^fÏ^_Ï^XÏ^QÏ^JÏ^CÏ^<Ï^5Ï^.Ï^'Ï^ Ï^Ï^Ï^ Ï^Ï^ýÎ^öÎ^ïÎ^èÎ^áÎ^ÚÎ^ÓÎ^ÌÎ^ÅÎ^¾Î^·Î^°Î^©Î^¢Î^›Î^”Î^Î^†Î^Î^xÎ^qÎ^jÎ^cÎ^\Î^UÎ^NÎ^GÎ^@Î^9Î^2Î^+Î^$Î^Î^Î^Î^Î^Î^úÍ^óÍ^ìÍ^åÍ^ÞÍ^×Í^ÐÍ^ÉÍ^ÂÍ^»Í^´Í^­Í^¦Í^ŸÍ^˜Í^‘Í^ŠÍ^ƒÍ^|Í^uÍ^nÍ^gÍ^`Í^YÍ^RÍ^KÍ^DÍ^=Í^6Í^/Í^(Í^!Í^Í^Í^ Í^Í^þÌ^÷Ì^ðÌ^éÌ^âÌ^ÛÌ^ÔÌ^ÍÌ^ÆÌ^¿Ì^¸Ì^±Ì^ªÌ^£Ì^œÌ^•Ì^ŽÌ^‡Ì^€Ì^yÌ^rÌ^kÌ^dÌ^]Ì^VÌ^OÌ^HÌ^AÌ^:Ì^3Ì^,Ì^%Ì^Ì^Ì^Ì^ Ì^Ì^ûË^ôË^íË^æË^ßË^ØË^ÑË^ÊË^ÃË^¼Ë^µË^®Ë^§Ë^ Ë^™Ë^’Ë^‹Ë^„Ë^}Ë^vË^oË^hË^aË^ZË^SË^LË^EË^>Ë^7Ë^0Ë^)Ë^"Ë^Ë^Ë^ Ë^Ë^ÿÊ^øÊ^ñÊ^êÊ^ãÊ^ÜÊ^ÕÊ^ÎÊ^ÇÊ^ÀÊ^¹Ê^²Ê^«Ê^¤Ê^Ê^–Ê^Ê^ˆÊ^Ê^zÊ^sÊ^lÊ^eÊ^^Ê^WÊ^PÊ^IÊ^BÊ^;Ê^4Ê^-Ê^&Ê^Ê^Ê^Ê^ Ê^Ê^üÉ^õÉ^îÉ^çÉ^àÉ^ÙÉ^ÒÉ^ËÉ^ÄÉ^½É^¶É^¯É^¨É^¡É^šÉ^“É^ŒÉ^…É^~É^wÉ^pÉ^iÉ^bÉ^[É^TÉ^MÉ^FÉ^?É^8É^1É^*É^#É^É^É^É^É^É^ùÈ^òÈ^ëÈ^äÈ^ÝÈ^ÖÈ^ÏÈ^ÈÈ^ÁÈ^ºÈ^³È^¬È^¥È^žÈ^—È^È^‰È^‚È^{È^tÈ^mÈ^fÈ^_È^XÈ^QÈ^JÈ^CÈ^<È^5È^.È^'È^ È^È^È^ È^È^ýÇ^öÇ^ïÇ^èÇ^áÇ^ÚÇ^ÓÇ^ÌÇ^ÅÇ^¾Ç^·Ç^°Ç^©Ç^¢Ç^›Ç^”Ç^Ç^†Ç^Ç^xÇ^qÇ^jÇ^cÇ^\Ç^UÇ^NÇ^GÇ^@Ç^9Ç^2Ç^+Ç^$Ç^Ç^Ç^Ç^Ç^Ç^úÆ^óÆ^ìÆ^åÆ^ÞÆ^ׯ^ÐÆ^ÉÆ^ÂÆ^»Æ^´Æ^­Æ^¦Æ^ŸÆ^˜Æ^‘Æ^ŠÆ^ƒÆ^|Æ^uÆ^nÆ^gÆ^`Æ^YÆ^RÆ^KÆ^DÆ^=Æ^6Æ^/Æ^(Æ^!Æ^Æ^Æ^ Æ^Æ^þÅ^÷Å^ðÅ^éÅ^âÅ^ÛÅ^ÔÅ^ÍÅ^ÆÅ^¿Å^¸Å^±Å^ªÅ^£Å^œÅ^•Å^ŽÅ^‡Å^€Å^yÅ^rÅ^kÅ^dÅ^]Å^VÅ^OÅ^HÅ^AÅ^:Å^3Å^,Å^%Å^Å^Å^Å^ Å^Å^ûÄ^ôÄ^íÄ^æÄ^ßÄ^ØÄ^ÑÄ^ÊÄ^ÃÄ^¼Ä^µÄ^®Ä^§Ä^ Ä^™Ä^’Ä^‹Ä^„Ä^}Ä^vÄ^oÄ^hÄ^aÄ^ZÄ^SÄ^LÄ^EÄ^>Ä^7Ä^0Ä^)Ä^"Ä^Ä^Ä^ Ä^Ä^ÿÃ^øÃ^ñÃ^êÃ^ãÃ^ÜÃ^ÕÃ^ÎÃ^ÇÃ^ÀÃ^¹Ã^²Ã^«Ã^¤Ã^Ã^–Ã^Ã^ˆÃ^Ã^zÃ^sÃ^lÃ^eÃ^^Ã^WÃ^PÃ^IÃ^BÃ^;Ã^4Ã^-Ã^&Ã^Ã^Ã^Ã^ Ã^Ã^üÂ^õÂ^îÂ^çÂ^àÂ^ÙÂ^ÒÂ^ËÂ^ÄÂ^½Â^¶Â^¯Â^¨Â^¡Â^šÂ^“Â^ŒÂ^…Â^~Â^wÂ^pÂ^iÂ^bÂ^[Â^TÂ^MÂ^FÂ^?Â^8Â^1Â^*Â^#Â^Â^Â^Â^Â^Â^ùÁ^òÁ^ëÁ^äÁ^ÝÁ^ÖÁ^ÏÁ^ÈÁ^ÁÁ^ºÁ^³Á^¬Á^¥Á^žÁ^—Á^Á^‰Á^‚Á^{Á^tÁ^mÁ^fÁ^_Á^XÁ^QÁ^JÁ^CÁ^<Á^5Á^.Á^'Á^ Á^Á^Á^ Á^Á^ýÀ^öÀ^ïÀ^èÀ^áÀ^ÚÀ^ÓÀ^ÌÀ^ÅÀ^¾À^·À^°À^©À^¢À^›À^”À^À^†À^À^xÀ^qÀ^jÀ^cÀ^\À^UÀ^NÀ^GÀ^@À^9À^2À^+À^$À^À^À^À^À^À^ú¿^ó¿^ì¿^å¿^Þ¿^׿^п^É¿^¿^»¿^´¿^­¿^¦¿^Ÿ¿^˜¿^‘¿^Š¿^ƒ¿^|¿^u¿^n¿^g¿^`¿^Y¿^R¿^K¿^D¿^=¿^6¿^/¿^(¿^!¿^¿^¿^ ¿^¿^þ¾^÷¾^ð¾^é¾^â¾^Û¾^Ô¾^;^ƾ^¿¾^¸¾^±¾^ª¾^£¾^œ¾^•¾^޾^‡¾^€¾^y¾^r¾^k¾^d¾^]¾^V¾^O¾^H¾^A¾^:¾^3¾^,¾^%¾^¾^¾^¾^ ¾^¾^û½^ô½^í½^æ½^ß½^ؽ^ѽ^ʽ^ý^¼½^µ½^®½^§½^ ½^™½^’½^‹½^„½^}½^v½^o½^h½^a½^Z½^S½^L½^E½^>½^7½^0½^)½^"½^½^½^ ½^½^ÿ¼^ø¼^ñ¼^ê¼^ã¼^ܼ^Õ¼^μ^Ǽ^À¼^¹¼^²¼^«¼^¤¼^¼^–¼^¼^ˆ¼^¼^z¼^s¼^l¼^e¼^^¼^W¼^P¼^I¼^B¼^;¼^4¼^-¼^&¼^¼^¼^¼^ ¼^¼^ü»^õ»^î»^ç»^à»^Ù»^Ò»^Ë»^Ä»^½»^¶»^¯»^¨»^¡»^š»^“»^Œ»^…»^~»^w»^p»^i»^b»^[»^T»^M»^F»^?»^8»^1»^*»^#»^»^»^»^»^»^ùº^òº^ëº^äº^ݺ^Öº^Ϻ^Ⱥ^Áº^ºº^³º^¬º^¥º^žº^—º^º^‰º^‚º^{º^tº^mº^fº^_º^Xº^Qº^Jº^Cº^<º^5º^.º^'º^ º^º^º^ º^º^ý¹^ö¹^ï¹^è¹^á¹^Ú¹^Ó¹^̹^Ź^¾¹^·¹^°¹^©¹^¢¹^›¹^”¹^¹^†¹^¹^x¹^q¹^j¹^c¹^\¹^U¹^N¹^G¹^@¹^9¹^2¹^+¹^$¹^¹^¹^¹^¹^¹^ú¸^ó¸^ì¸^å¸^Þ¸^׸^и^ɸ^¸^»¸^´¸^­¸^¦¸^Ÿ¸^˜¸^‘¸^Џ^ƒ¸^|¸^u¸^n¸^g¸^`¸^Y¸^R¸^K¸^D¸^=¸^6¸^/¸^(¸^!¸^¸^¸^ ¸^¸^þ·^÷·^ð·^é·^â·^Û·^Ô·^Í·^Æ·^¿·^¸·^±·^ª·^£·^œ·^•·^Ž·^‡·^€·^y·^r·^k·^d·^]·^V·^O·^H·^A·^:·^3·^,·^%·^·^·^·^ ·^·^û¶^ô¶^í¶^æ¶^ß¶^ض^Ѷ^ʶ^ö^¼¶^µ¶^®¶^§¶^ ¶^™¶^’¶^‹¶^„¶^}¶^v¶^o¶^h¶^a¶^Z¶^S¶^L¶^E¶^>¶^7¶^0¶^)¶^"¶^¶^¶^ ¶^¶^ÿµ^øµ^ñµ^êµ^ãµ^ܵ^Õµ^ε^ǵ^Àµ^¹µ^²µ^«µ^¤µ^µ^–µ^µ^ˆµ^µ^zµ^sµ^lµ^eµ^^µ^Wµ^Pµ^Iµ^Bµ^;µ^4µ^-µ^&µ^µ^µ^µ^ µ^µ^ü´^õ´^î´^ç´^à´^Ù´^Ò´^Ë´^Ä´^½´^¶´^¯´^¨´^¡´^š´^“´^Œ´^…´^~´^w´^p´^i´^b´^[´^T´^M´^F´^?´^8´^1´^*´^#´^´^´^´^´^´^ù³^ò³^ë³^ä³^ݳ^Ö³^ϳ^ȳ^Á³^º³^³³^¬³^¥³^ž³^—³^³^‰³^‚³^{³^t³^m³^f³^_³^X³^Q³^J³^C³^<³^5³^.³^'³^ ³^³^³^ ³^³^ý²^ö²^ï²^è²^á²^Ú²^Ó²^̲^Ų^¾²^·²^°²^©²^¢²^›²^”²^²^†²^²^x²^q²^j²^c²^\²^U²^N²^G²^@²^9²^2²^+²^$²^²^²^²^²^²^ú±^ó±^ì±^å±^Þ±^×±^б^ɱ^±^»±^´±^­±^¦±^Ÿ±^˜±^‘±^б^ƒ±^|±^u±^n±^g±^`±^Y±^R±^K±^D±^=±^6±^/±^(±^!±^±^±^ ±^±^þ°^÷°^ð°^é°^â°^Û°^Ô°^Ͱ^ư^¿°^¸°^±°^ª°^£°^œ°^•°^ް^‡°^€°^y°^r°^k°^d°^]°^V°^O°^H°^A°^:°^3°^,°^%°^°^°^°^ °^°^û¯^ô¯^í¯^æ¯^߯^د^ѯ^ʯ^ï^¼¯^µ¯^®¯^§¯^ ¯^™¯^’¯^‹¯^„¯^}¯^v¯^o¯^h¯^a¯^Z¯^S¯^L¯^E¯^>¯^7¯^0¯^)¯^"¯^¯^¯^ ¯^¯^ÿ®^ø®^ñ®^ê®^ã®^Ü®^Õ®^ή^Ç®^À®^¹®^²®^«®^¤®^®^–®^®^ˆ®^®^z®^s®^l®^e®^^®^W®^P®^I®^B®^;®^4®^-®^&®^®^®^®^ ®^®^ü­^õ­^î­^ç­^à­^Ù­^Ò­^Ë­^Ä­^½­^¶­^¯­^¨­^¡­^š­^“­^Œ­^…­^~­^w­^p­^i­^b­^[­^T­^M­^F­^?­^8­^1­^*­^#­^­^­^­^­^­^ù¬^ò¬^ë¬^ä¬^ݬ^Ö¬^Ϭ^Ȭ^Á¬^º¬^³¬^¬¬^¥¬^ž¬^—¬^¬^‰¬^‚¬^{¬^t¬^m¬^f¬^_¬^X¬^Q¬^J¬^C¬^<¬^5¬^.¬^'¬^ ¬^¬^¬^ ¬^¬^ý«^ö«^ï«^è«^á«^Ú«^Ó«^Ì«^Å«^¾«^·«^°«^©«^¢«^›«^”«^«^†«^«^x«^q«^j«^c«^\«^U«^N«^G«^@«^9«^2«^+«^$«^«^«^«^«^«^úª^óª^ìª^åª^Þª^ת^Ъ^ɪ^ª^»ª^´ª^­ª^¦ª^Ÿª^˜ª^‘ª^Šª^ƒª^|ª^uª^nª^gª^`ª^Yª^Rª^Kª^Dª^=ª^6ª^/ª^(ª^!ª^ª^ª^ ª^ª^þ©^÷©^ð©^é©^â©^Û©^Ô©^Í©^Æ©^¿©^¸©^±©^ª©^£©^œ©^•©^Ž©^‡©^€©^y©^r©^k©^d©^]©^V©^O©^H©^A©^:©^3©^,©^%©^©^©^©^ ©^©^û¨^ô¨^í¨^æ¨^ߨ^ب^Ѩ^ʨ^è^¼¨^µ¨^®¨^§¨^ ¨^™¨^’¨^‹¨^„¨^}¨^v¨^o¨^h¨^a¨^Z¨^S¨^L¨^E¨^>¨^7¨^0¨^)¨^"¨^¨^¨^ ¨^¨^ÿ§^ø§^ñ§^ê§^ã§^ܧ^Õ§^Χ^ǧ^À§^¹§^²§^«§^¤§^§^–§^§^ˆ§^§^z§^s§^l§^e§^^§^W§^P§^I§^B§^;§^4§^-§^&§^§^§^§^ §^§^ü¦^õ¦^î¦^ç¦^à¦^Ù¦^Ò¦^˦^Ħ^½¦^¶¦^¯¦^¨¦^¡¦^š¦^“¦^Œ¦^…¦^~¦^w¦^p¦^i¦^b¦^[¦^T¦^M¦^F¦^?¦^8¦^1¦^*¦^#¦^¦^¦^¦^¦^¦^ù¥^ò¥^ë¥^ä¥^Ý¥^Ö¥^Ï¥^È¥^Á¥^º¥^³¥^¬¥^¥¥^ž¥^—¥^¥^‰¥^‚¥^{¥^t¥^m¥^f¥^_¥^X¥^Q¥^J¥^C¥^<¥^5¥^.¥^'¥^ ¥^¥^¥^ ¥^¥^ý¤^ö¤^ï¤^è¤^á¤^Ú¤^Ó¤^̤^Ť^¾¤^·¤^°¤^©¤^¢¤^›¤^”¤^¤^†¤^¤^x¤^q¤^j¤^c¤^\¤^U¤^N¤^G¤^@¤^9¤^2¤^+¤^$¤^¤^¤^¤^¤^¤^ú£^ó£^ì£^å£^Þ£^×£^У^É£^£^»£^´£^­£^¦£^Ÿ£^˜£^‘£^Š£^ƒ£^|£^u£^n£^g£^`£^Y£^R£^K£^D£^=£^6£^/£^(£^!£^£^£^ £^£^þ¢^÷¢^ð¢^é¢^â¢^Û¢^Ô¢^Í¢^Æ¢^¿¢^¸¢^±¢^ª¢^£¢^œ¢^•¢^Ž¢^‡¢^€¢^y¢^r¢^k¢^d¢^]¢^V¢^O¢^H¢^A¢^:¢^3¢^,¢^%¢^¢^¢^¢^ ¢^¢^û¡^ô¡^í¡^æ¡^ß¡^Ø¡^Ñ¡^Ê¡^á^¼¡^µ¡^®¡^§¡^ ¡^™¡^’¡^‹¡^„¡^}¡^v¡^o¡^h¡^a¡^Z¡^S¡^L¡^E¡^>¡^7¡^0¡^)¡^"¡^¡^¡^ ¡^¡^ÿ ^ø ^ñ ^ê ^ã ^Ü ^Õ ^Π^Ç ^À ^¹ ^² ^« ^¤ ^ ^– ^ ^ˆ ^ ^z ^s ^l ^e ^^ ^W ^P ^I ^B ^; ^4 ^- ^& ^ ^ ^ ^  ^ ^üŸ^õŸ^îŸ^çŸ^àŸ^ÙŸ^ÒŸ^ËŸ^ÄŸ^½Ÿ^¶Ÿ^¯Ÿ^¨Ÿ^¡Ÿ^šŸ^“Ÿ^ŒŸ^…Ÿ^~Ÿ^wŸ^pŸ^iŸ^bŸ^[Ÿ^TŸ^MŸ^FŸ^?Ÿ^8Ÿ^1Ÿ^*Ÿ^#Ÿ^Ÿ^Ÿ^Ÿ^Ÿ^Ÿ^ùž^òž^ëž^äž^Ýž^Öž^Ïž^Èž^Áž^ºž^³ž^¬ž^¥ž^žž^—ž^ž^‰ž^‚ž^{ž^tž^mž^fž^_ž^Xž^Qž^Jž^Cž^<ž^5ž^.ž^'ž^ ž^ž^ž^ ž^ž^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^úœ^óœ^ìœ^åœ^Þœ^ל^М^Éœ^œ^»œ^´œ^­œ^¦œ^Ÿœ^˜œ^‘œ^Šœ^ƒœ^|œ^uœ^nœ^gœ^`œ^Yœ^Rœ^Kœ^Dœ^=œ^6œ^/œ^(œ^!œ^œ^œ^ œ^œ^þ›^÷›^ð›^é›^â›^Û›^Ô›^Í›^Æ›^¿›^¸›^±›^ª›^£›^œ›^•›^Ž›^‡›^€›^y›^r›^k›^d›^]›^V›^O›^H›^A›^:›^3›^,›^%›^›^›^›^ ›^›^ûš^ôš^íš^æš^ßš^Øš^Ñš^Êš^Ú^¼š^µš^®š^§š^ š^™š^’š^‹š^„š^}š^vš^oš^hš^aš^Zš^Sš^Lš^Eš^>š^7š^0š^)š^"š^š^š^ š^š^ÿ™^ø™^ñ™^ê™^ã™^Ü™^Õ™^Ι^Ç™^À™^¹™^²™^«™^¤™^™^–™^™^ˆ™^™^z™^s™^l™^e™^^™^W™^P™^I™^B™^;™^4™^-™^&™^™^™^™^ ™^™^ü˜^õ˜^î˜^ç˜^à˜^Ù˜^Ò˜^˘^Ę^½˜^¶˜^¯˜^¨˜^¡˜^š˜^“˜^Œ˜^…˜^~˜^w˜^p˜^i˜^b˜^[˜^T˜^M˜^F˜^?˜^8˜^1˜^*˜^#˜^˜^˜^˜^˜^˜^ù—^ò—^ë—^ä—^Ý—^Ö—^Ï—^È—^Á—^º—^³—^¬—^¥—^ž—^——^—^‰—^‚—^{—^t—^m—^f—^_—^X—^Q—^J—^C—^<—^5—^.—^'—^ —^—^—^ —^—^ý–^ö–^ï–^è–^á–^Ú–^Ó–^Ì–^Å–^¾–^·–^°–^©–^¢–^›–^”–^–^†–^–^x–^q–^j–^c–^\–^U–^N–^G–^@–^9–^2–^+–^$–^–^–^–^–^–^ú•^ó•^ì•^å•^Þ•^ו^Е^É•^•^»•^´•^­•^¦•^Ÿ•^˜•^‘•^Š•^ƒ•^|•^u•^n•^g•^`•^Y•^R•^K•^D•^=•^6•^/•^(•^!•^•^•^ •^•^þ”^÷”^ð”^é”^â”^Û”^Ô”^Í”^Æ”^¿”^¸”^±”^ª”^£”^œ”^•”^Ž”^‡”^€”^y”^r”^k”^d”^]”^V”^O”^H”^A”^:”^3”^,”^%”^”^”^”^ ”^”^û“^ô“^í“^æ“^ß“^Ø“^Ñ“^Ê“^Ó^¼“^µ“^®“^§“^ “^™“^’“^‹“^„“^}“^v“^o“^h“^a“^Z“^S“^L“^E“^>“^7“^0“^)“^"“^“^“^ “^“^ÿ’^ø’^ñ’^ê’^ã’^Ü’^Õ’^Î’^Ç’^À’^¹’^²’^«’^¤’^’^–’^’^ˆ’^’^z’^s’^l’^e’^^’^W’^P’^I’^B’^;’^4’^-’^&’^’^’^’^ ’^’^ü‘^õ‘^î‘^ç‘^à‘^Ù‘^Ò‘^Ë‘^Ä‘^½‘^¶‘^¯‘^¨‘^¡‘^š‘^“‘^Œ‘^…‘^~‘^w‘^p‘^i‘^b‘^[‘^T‘^M‘^F‘^?‘^8‘^1‘^*‘^#‘^‘^‘^‘^‘^‘^ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^úŽ^óŽ^ìŽ^åŽ^ÞŽ^׎^ÐŽ^ÉŽ^ÂŽ^»Ž^´Ž^­Ž^¦Ž^ŸŽ^˜Ž^‘Ž^ŠŽ^ƒŽ^|Ž^uŽ^nŽ^gŽ^`Ž^YŽ^RŽ^KŽ^DŽ^=Ž^6Ž^/Ž^(Ž^!Ž^Ž^Ž^ Ž^Ž^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^ûŒ^ôŒ^íŒ^æŒ^ߌ^ØŒ^ÑŒ^ÊŒ^ÃŒ^¼Œ^µŒ^®Œ^§Œ^ Œ^™Œ^’Œ^‹Œ^„Œ^}Œ^vŒ^oŒ^hŒ^aŒ^ZŒ^SŒ^LŒ^EŒ^>Œ^7Œ^0Œ^)Œ^"Œ^Œ^Œ^ Œ^Œ^ÿ‹^ø‹^ñ‹^ê‹^ã‹^Ü‹^Õ‹^΋^Ç‹^À‹^¹‹^²‹^«‹^¤‹^‹^–‹^‹^ˆ‹^‹^z‹^s‹^l‹^e‹^^‹^W‹^P‹^I‹^B‹^;‹^4‹^-‹^&‹^‹^‹^‹^ ‹^‹^üŠ^õŠ^îŠ^çŠ^àŠ^ÙŠ^ÒŠ^ËŠ^ÄŠ^½Š^¶Š^¯Š^¨Š^¡Š^šŠ^“Š^ŒŠ^…Š^~Š^wŠ^pŠ^iŠ^bŠ^[Š^TŠ^MŠ^FŠ^?Š^8Š^1Š^*Š^#Š^Š^Š^Š^Š^Š^ù‰^ò‰^ë‰^ä‰^݉^Ö‰^ω^ȉ^Á‰^º‰^³‰^¬‰^¥‰^ž‰^—‰^‰^‰‰^‚‰^{‰^t‰^m‰^f‰^_‰^X‰^Q‰^J‰^C‰^<‰^5‰^.‰^'‰^ ‰^‰^‰^ ‰^‰^ýˆ^öˆ^ïˆ^èˆ^áˆ^Úˆ^Óˆ^̈^ň^¾ˆ^·ˆ^°ˆ^©ˆ^¢ˆ^›ˆ^”ˆ^ˆ^†ˆ^ˆ^xˆ^qˆ^jˆ^cˆ^\ˆ^Uˆ^Nˆ^Gˆ^@ˆ^9ˆ^2ˆ^+ˆ^$ˆ^ˆ^ˆ^ˆ^ˆ^ˆ^ú‡^ó‡^ì‡^å‡^Þ‡^ׇ^Ї^ɇ^‡^»‡^´‡^­‡^¦‡^Ÿ‡^˜‡^‘‡^Ї^ƒ‡^|‡^u‡^n‡^g‡^`‡^Y‡^R‡^K‡^D‡^=‡^6‡^/‡^(‡^!‡^‡^‡^ ‡^‡^þ†^÷†^ð†^é†^â†^Û†^Ô†^͆^Ɔ^¿†^¸†^±†^ª†^£†^œ†^•†^ކ^‡†^€†^y†^r†^k†^d†^]†^V†^O†^H†^A†^:†^3†^,†^%†^†^†^†^ †^†^û…^ô…^í…^æ…^ß…^Ø…^Ñ…^Ê…^Ã…^¼…^µ…^®…^§…^ …^™…^’…^‹…^„…^}…^v…^o…^h…^a…^Z…^S…^L…^E…^>…^7…^0…^)…^"…^…^…^ …^…^ÿ„^ø„^ñ„^ê„^ã„^Ü„^Õ„^΄^Ç„^À„^¹„^²„^«„^¤„^„^–„^„^ˆ„^„^z„^s„^l„^e„^^„^W„^P„^I„^B„^;„^4„^-„^&„^„^„^„^ „^„^üƒ^õƒ^îƒ^çƒ^àƒ^Ùƒ^Òƒ^˃^ă^½ƒ^¶ƒ^¯ƒ^¨ƒ^¡ƒ^šƒ^“ƒ^Œƒ^…ƒ^~ƒ^wƒ^pƒ^iƒ^bƒ^[ƒ^Tƒ^Mƒ^Fƒ^?ƒ^8ƒ^1ƒ^*ƒ^#ƒ^ƒ^ƒ^ƒ^ƒ^ƒ^ù‚^ò‚^ë‚^ä‚^Ý‚^Ö‚^Ï‚^È‚^Á‚^º‚^³‚^¬‚^¥‚^ž‚^—‚^‚^‰‚^‚‚^{‚^t‚^m‚^f‚^_‚^X‚^Q‚^J‚^C‚^<‚^5‚^.‚^'‚^ ‚^‚^‚^ ‚^‚^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú€^ó€^ì€^å€^Þ€^×€^Ѐ^É€^€^»€^´€^­€^¦€^Ÿ€^˜€^‘€^Š€^ƒ€^|€^u€^n€^g€^`€^Y€^R€^K€^D€^=€^6€^/€^(€^!€^€^€^ €^€^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û~^ô~^í~^æ~^ß~^Ø~^Ñ~^Ê~^Ã~^¼~^µ~^®~^§~^ ~^™~^’~^‹~^„~^}~^v~^o~^h~^a~^Z~^S~^L~^E~^>~^7~^0~^)~^"~^~^~^ ~^~^ÿ}^ø}^ñ}^ê}^ã}^Ü}^Õ}^Î}^Ç}^À}^¹}^²}^«}^¤}^}^–}^}^ˆ}^}^z}^s}^l}^e}^^}^W}^P}^I}^B}^;}^4}^-}^&}^}^}^}^ }^}^ü|^õ|^î|^ç|^à|^Ù|^Ò|^Ë|^Ä|^½|^¶|^¯|^¨|^¡|^š|^“|^Œ|^…|^~|^w|^p|^i|^b|^[|^T|^M|^F|^?|^8|^1|^*|^#|^|^|^|^|^|^ù{^ò{^ë{^ä{^Ý{^Ö{^Ï{^È{^Á{^º{^³{^¬{^¥{^ž{^—{^{^‰{^‚{^{{^t{^m{^f{^_{^X{^Q{^J{^C{^<{^5{^.{^'{^ {^{^{^ {^{^ýz^öz^ïz^èz^áz^Úz^Óz^Ìz^Åz^¾z^·z^°z^©z^¢z^›z^”z^z^†z^z^xz^qz^jz^cz^\z^Uz^Nz^Gz^@z^9z^2z^+z^$z^z^z^z^z^z^úy^óy^ìy^åy^Þy^×y^Ðy^Éy^Ây^»y^´y^­y^¦y^Ÿy^˜y^‘y^Šy^ƒy^|y^uy^ny^gy^`y^Yy^Ry^Ky^Dy^=y^6y^/y^(y^!y^y^y^ y^y^þx^÷x^ðx^éx^âx^Ûx^Ôx^Íx^Æx^¿x^¸x^±x^ªx^£x^œx^•x^Žx^‡x^€x^yx^rx^kx^dx^]x^Vx^Ox^Hx^Ax^:x^3x^,x^%x^x^x^x^ x^x^ûw^ôw^íw^æw^ßw^Øw^Ñw^Êw^Ãw^¼w^µw^®w^§w^ w^™w^’w^‹w^„w^}w^vw^ow^hw^aw^Zw^Sw^Lw^Ew^>w^7w^0w^)w^"w^w^w^ w^w^ÿv^øv^ñv^êv^ãv^Üv^Õv^Îv^Çv^Àv^¹v^²v^«v^¤v^v^–v^v^ˆv^v^zv^sv^lv^ev^^v^Wv^Pv^Iv^Bv^;v^4v^-v^&v^v^v^v^ v^v^üu^õu^îu^çu^àu^Ùu^Òu^Ëu^Äu^½u^¶u^¯u^¨u^¡u^šu^“u^Œu^…u^~u^wu^pu^iu^bu^[u^Tu^Mu^Fu^?u^8u^1u^*u^#u^u^u^u^u^u^ùt^òt^ët^ät^Ýt^Öt^Ït^Èt^Át^ºt^³t^¬t^¥t^žt^—t^t^‰t^‚t^{t^tt^mt^ft^_t^Xt^Qt^Jt^Ct^p^7p^0p^)p^"p^p^p^ p^p^ÿo^øo^ño^êo^ão^Üo^Õo^Îo^Ço^Ào^¹o^²o^«o^¤o^o^–o^o^ˆo^o^zo^so^lo^eo^^o^Wo^Po^Io^Bo^;o^4o^-o^&o^o^o^o^ o^o^ün^õn^în^çn^àn^Ùn^Òn^Ën^Än^½n^¶n^¯n^¨n^¡n^šn^“n^Œn^…n^~n^wn^pn^in^bn^[n^Tn^Mn^Fn^?n^8n^1n^*n^#n^n^n^n^n^n^ùm^òm^ëm^äm^Ým^Öm^Ïm^Èm^Ám^ºm^³m^¬m^¥m^žm^—m^m^‰m^‚m^{m^tm^mm^fm^_m^Xm^Qm^Jm^Cm^i^7i^0i^)i^"i^i^i^ i^i^ÿh^øh^ñh^êh^ãh^Üh^Õh^Îh^Çh^Àh^¹h^²h^«h^¤h^h^–h^h^ˆh^h^zh^sh^lh^eh^^h^Wh^Ph^Ih^Bh^;h^4h^-h^&h^h^h^h^ h^h^üg^õg^îg^çg^àg^Ùg^Òg^Ëg^Äg^½g^¶g^¯g^¨g^¡g^šg^“g^Œg^…g^~g^wg^pg^ig^bg^[g^Tg^Mg^Fg^?g^8g^1g^*g^#g^g^g^g^g^g^ùf^òf^ëf^äf^Ýf^Öf^Ïf^Èf^Áf^ºf^³f^¬f^¥f^žf^—f^f^‰f^‚f^{f^tf^mf^ff^_f^Xf^Qf^Jf^Cf^b^7b^0b^)b^"b^b^b^ b^b^ÿa^øa^ña^êa^ãa^Üa^Õa^Îa^Ça^Àa^¹a^²a^«a^¤a^a^–a^a^ˆa^a^za^sa^la^ea^^a^Wa^Pa^Ia^Ba^;a^4a^-a^&a^a^a^a^ a^a^ü`^õ`^î`^ç`^à`^Ù`^Ò`^Ë`^Ä`^½`^¶`^¯`^¨`^¡`^š`^“`^Œ`^…`^~`^w`^p`^i`^b`^[`^T`^M`^F`^?`^8`^1`^*`^#`^`^`^`^`^`^ù_^ò_^ë_^ä_^Ý_^Ö_^Ï_^È_^Á_^º_^³_^¬_^¥_^ž_^—_^_^‰_^‚_^{_^t_^m_^f_^__^X_^Q_^J_^C_^<_^5_^._^'_^ _^_^_^ _^_^ý^^ö^^ï^^è^^á^^Ú^^Ó^^Ì^^Å^^¾^^·^^°^^©^^¢^^›^^”^^^^†^^^^x^^q^^j^^c^^\^^U^^N^^G^^@^^9^^2^^+^^$^^^^^^^^^^^^ú]^ó]^ì]^å]^Þ]^×]^Ð]^É]^Â]^»]^´]^­]^¦]^Ÿ]^˜]^‘]^Š]^ƒ]^|]^u]^n]^g]^`]^Y]^R]^K]^D]^=]^6]^/]^(]^!]^]^]^ ]^]^þ\^÷\^ð\^é\^â\^Û\^Ô\^Í\^Æ\^¿\^¸\^±\^ª\^£\^œ\^•\^Ž\^‡\^€\^y\^r\^k\^d\^]\^V\^O\^H\^A\^:\^3\^,\^%\^\^\^\^ \^\^û[^ô[^í[^æ[^ß[^Ø[^Ñ[^Ê[^Ã[^¼[^µ[^®[^§[^ [^™[^’[^‹[^„[^}[^v[^o[^h[^a[^Z[^S[^L[^E[^>[^7[^0[^)[^"[^[^[^ [^[^ÿZ^øZ^ñZ^êZ^ãZ^ÜZ^ÕZ^ÎZ^ÇZ^ÀZ^¹Z^²Z^«Z^¤Z^Z^–Z^Z^ˆZ^Z^zZ^sZ^lZ^eZ^^Z^WZ^PZ^IZ^BZ^;Z^4Z^-Z^&Z^Z^Z^Z^ Z^Z^üY^õY^îY^çY^àY^ÙY^ÒY^ËY^ÄY^½Y^¶Y^¯Y^¨Y^¡Y^šY^“Y^ŒY^…Y^~Y^wY^pY^iY^bY^[Y^TY^MY^FY^?Y^8Y^1Y^*Y^#Y^Y^Y^Y^Y^Y^ùX^òX^ëX^äX^ÝX^ÖX^ÏX^ÈX^ÁX^ºX^³X^¬X^¥X^žX^—X^X^‰X^‚X^{X^tX^mX^fX^_X^XX^QX^JX^CX^T^7T^0T^)T^"T^T^T^ T^T^ÿS^øS^ñS^êS^ãS^ÜS^ÕS^ÎS^ÇS^ÀS^¹S^²S^«S^¤S^S^–S^S^ˆS^S^zS^sS^lS^eS^^S^WS^PS^IS^BS^;S^4S^-S^&S^S^S^S^ S^S^üR^õR^îR^çR^àR^ÙR^ÒR^ËR^ÄR^½R^¶R^¯R^¨R^¡R^šR^“R^ŒR^…R^~R^wR^pR^iR^bR^[R^TR^MR^FR^?R^8R^1R^*R^#R^R^R^R^R^R^ùQ^òQ^ëQ^äQ^ÝQ^ÖQ^ÏQ^ÈQ^ÁQ^ºQ^³Q^¬Q^¥Q^žQ^—Q^Q^‰Q^‚Q^{Q^tQ^mQ^fQ^_Q^XQ^QQ^JQ^CQ^M^7M^0M^)M^"M^M^M^ M^M^ÿL^øL^ñL^êL^ãL^ÜL^ÕL^ÎL^ÇL^ÀL^¹L^²L^«L^¤L^L^–L^L^ˆL^L^zL^sL^lL^eL^^L^WL^PL^IL^BL^;L^4L^-L^&L^L^L^L^ L^L^üK^õK^îK^çK^àK^ÙK^ÒK^ËK^ÄK^½K^¶K^¯K^¨K^¡K^šK^“K^ŒK^…K^~K^wK^pK^iK^bK^[K^TK^MK^FK^?K^8K^1K^*K^#K^K^K^K^K^K^ùJ^òJ^ëJ^äJ^ÝJ^ÖJ^ÏJ^ÈJ^ÁJ^ºJ^³J^¬J^¥J^žJ^—J^J^‰J^‚J^{J^tJ^mJ^fJ^_J^XJ^QJ^JJ^CJ^F^7F^0F^)F^"F^F^F^ F^F^ÿE^øE^ñE^êE^ãE^ÜE^ÕE^ÎE^ÇE^ÀE^¹E^²E^«E^¤E^E^–E^E^ˆE^E^zE^sE^lE^eE^^E^WE^PE^IE^BE^;E^4E^-E^&E^E^E^E^ E^E^üD^õD^îD^çD^àD^ÙD^ÒD^ËD^ÄD^½D^¶D^¯D^¨D^¡D^šD^“D^ŒD^…D^~D^wD^pD^iD^bD^[D^TD^MD^FD^?D^8D^1D^*D^#D^D^D^D^D^D^ùC^òC^ëC^äC^ÝC^ÖC^ÏC^ÈC^ÁC^ºC^³C^¬C^¥C^žC^—C^C^‰C^‚C^{C^tC^mC^fC^_C^XC^QC^JC^CC^?^7?^0?^)?^"?^?^?^ ?^?^ÿ>^ø>^ñ>^ê>^ã>^Ü>^Õ>^Î>^Ç>^À>^¹>^²>^«>^¤>^>^–>^>^ˆ>^>^z>^s>^l>^e>^^>^W>^P>^I>^B>^;>^4>^->^&>^>^>^>^ >^>^ü=^õ=^î=^ç=^à=^Ù=^Ò=^Ë=^Ä=^½=^¶=^¯=^¨=^¡=^š=^“=^Œ=^…=^~=^w=^p=^i=^b=^[=^T=^M=^F=^?=^8=^1=^*=^#=^=^=^=^=^=^ù<^ò<^ë<^ä<^Ý<^Ö<^Ï<^È<^Á<^º<^³<^¬<^¥<^ž<^—<^<^‰<^‚<^{<^t<^m<^f<^_<^X<^Q<^J<^C<^<<^5<^.<^'<^ <^<^<^ <^<^ý;^ö;^ï;^è;^á;^Ú;^Ó;^Ì;^Å;^¾;^·;^°;^©;^¢;^›;^”;^;^†;^;^x;^q;^j;^c;^\;^U;^N;^G;^@;^9;^2;^+;^$;^;^;^;^;^;^ú:^ó:^ì:^å:^Þ:^×:^Ð:^É:^Â:^»:^´:^­:^¦:^Ÿ:^˜:^‘:^Š:^ƒ:^|:^u:^n:^g:^`:^Y:^R:^K:^D:^=:^6:^/:^(:^!:^:^:^ :^:^þ9^÷9^ð9^é9^â9^Û9^Ô9^Í9^Æ9^¿9^¸9^±9^ª9^£9^œ9^•9^Ž9^‡9^€9^y9^r9^k9^d9^]9^V9^O9^H9^A9^:9^39^,9^%9^9^9^9^ 9^9^û8^ô8^í8^æ8^ß8^Ø8^Ñ8^Ê8^Ã8^¼8^µ8^®8^§8^ 8^™8^’8^‹8^„8^}8^v8^o8^h8^a8^Z8^S8^L8^E8^>8^78^08^)8^"8^8^8^ 8^8^ÿ7^ø7^ñ7^ê7^ã7^Ü7^Õ7^Î7^Ç7^À7^¹7^²7^«7^¤7^7^–7^7^ˆ7^7^z7^s7^l7^e7^^7^W7^P7^I7^B7^;7^47^-7^&7^7^7^7^ 7^7^ü6^õ6^î6^ç6^à6^Ù6^Ò6^Ë6^Ä6^½6^¶6^¯6^¨6^¡6^š6^“6^Œ6^…6^~6^w6^p6^i6^b6^[6^T6^M6^F6^?6^86^16^*6^#6^6^6^6^6^6^ù5^ò5^ë5^ä5^Ý5^Ö5^Ï5^È5^Á5^º5^³5^¬5^¥5^ž5^—5^5^‰5^‚5^{5^t5^m5^f5^_5^X5^Q5^J5^C5^<5^55^.5^'5^ 5^5^5^ 5^5^ý4^ö4^ï4^è4^á4^Ú4^Ó4^Ì4^Å4^¾4^·4^°4^©4^¢4^›4^”4^4^†4^4^x4^q4^j4^c4^\4^U4^N4^G4^@4^94^24^+4^$4^4^4^4^4^4^ú3^ó3^ì3^å3^Þ3^×3^Ð3^É3^Â3^»3^´3^­3^¦3^Ÿ3^˜3^‘3^Š3^ƒ3^|3^u3^n3^g3^`3^Y3^R3^K3^D3^=3^63^/3^(3^!3^3^3^ 3^3^þ2^÷2^ð2^é2^â2^Û2^Ô2^Í2^Æ2^¿2^¸2^±2^ª2^£2^œ2^•2^Ž2^‡2^€2^y2^r2^k2^d2^]2^V2^O2^H2^A2^:2^32^,2^%2^2^2^2^ 2^2^û1^ô1^í1^æ1^ß1^Ø1^Ñ1^Ê1^Ã1^¼1^µ1^®1^§1^ 1^™1^’1^‹1^„1^}1^v1^o1^h1^a1^Z1^S1^L1^E1^>1^71^01^)1^"1^1^1^ 1^1^ÿ0^ø0^ñ0^ê0^ã0^Ü0^Õ0^Î0^Ç0^À0^¹0^²0^«0^¤0^0^–0^0^ˆ0^0^z0^s0^l0^e0^^0^W0^P0^I0^B0^;0^40^-0^&0^0^0^0^ 0^0^ü/^õ/^î/^ç/^à/^Ù/^Ò/^Ë/^Ä/^½/^¶/^¯/^¨/^¡/^š/^“/^Œ/^…/^~/^w/^p/^i/^b/^[/^T/^M/^F/^?/^8/^1/^*/^#/^/^/^/^/^/^ù.^ò.^ë.^ä.^Ý.^Ö.^Ï.^È.^Á.^º.^³.^¬.^¥.^ž.^—.^.^‰.^‚.^{.^t.^m.^f.^_.^X.^Q.^J.^C.^<.^5.^..^'.^ .^.^.^ .^.^ý-^ö-^ï-^è-^á-^Ú-^Ó-^Ì-^Å-^¾-^·-^°-^©-^¢-^›-^”-^-^†-^-^x-^q-^j-^c-^\-^U-^N-^G-^@-^9-^2-^+-^$-^-^-^-^-^-^ú,^ó,^ì,^å,^Þ,^×,^Ð,^É,^Â,^»,^´,^­,^¦,^Ÿ,^˜,^‘,^Š,^ƒ,^|,^u,^n,^g,^`,^Y,^R,^K,^D,^=,^6,^/,^(,^!,^,^,^ ,^,^þ+^÷+^ð+^é+^â+^Û+^Ô+^Í+^Æ+^¿+^¸+^±+^ª+^£+^œ+^•+^Ž+^‡+^€+^y+^r+^k+^d+^]+^V+^O+^H+^A+^:+^3+^,+^%+^+^+^+^ +^+^û*^ô*^í*^æ*^ß*^Ø*^Ñ*^Ê*^Ã*^¼*^µ*^®*^§*^ *^™*^’*^‹*^„*^}*^v*^o*^h*^a*^Z*^S*^L*^E*^>*^7*^0*^)*^"*^*^*^ *^*^ÿ)^ø)^ñ)^ê)^ã)^Ü)^Õ)^Î)^Ç)^À)^¹)^²)^«)^¤)^)^–)^)^ˆ)^)^z)^s)^l)^e)^^)^W)^P)^I)^B)^;)^4)^-)^&)^)^)^)^ )^)^ü(^õ(^î(^ç(^à(^Ù(^Ò(^Ë(^Ä(^½(^¶(^¯(^¨(^¡(^š(^“(^Œ(^…(^~(^w(^p(^i(^b(^[(^T(^M(^F(^?(^8(^1(^*(^#(^(^(^(^(^(^ù'^ò'^ë'^ä'^Ý'^Ö'^Ï'^È'^Á'^º'^³'^¬'^¥'^ž'^—'^'^‰'^‚'^{'^t'^m'^f'^_'^X'^Q'^J'^C'^<'^5'^.'^''^ '^'^'^ '^'^ý&^ö&^ï&^è&^á&^Ú&^Ó&^Ì&^Å&^¾&^·&^°&^©&^¢&^›&^”&^&^†&^&^x&^q&^j&^c&^\&^U&^N&^G&^@&^9&^2&^+&^$&^&^&^&^&^&^ú%^ó%^ì%^å%^Þ%^×%^Ð%^É%^Â%^»%^´%^­%^¦%^Ÿ%^˜%^‘%^Š%^ƒ%^|%^u%^n%^g%^`%^Y%^R%^K%^D%^=%^6%^/%^(%^!%^%^%^ %^%^þ$^÷$^ð$^é$^â$^Û$^Ô$^Í$^Æ$^¿$^¸$^±$^ª$^£$^œ$^•$^Ž$^‡$^€$^y$^r$^k$^d$^]$^V$^O$^H$^A$^:$^3$^,$^%$^$^$^$^ $^$^û#^ô#^í#^æ#^ß#^Ø#^Ñ#^Ê#^Ã#^¼#^µ#^®#^§#^ #^™#^’#^‹#^„#^}#^v#^o#^h#^a#^Z#^S#^L#^E#^>#^7#^0#^)#^"#^#^#^ #^#^ÿ"^ø"^ñ"^ê"^ã"^Ü"^Õ"^Î"^Ç"^À"^¹"^²"^«"^¤"^"^–"^"^ˆ"^"^z"^s"^l"^e"^^"^W"^P"^I"^B"^;"^4"^-"^&"^"^"^"^ "^"^ü!^õ!^î!^ç!^à!^Ù!^Ò!^Ë!^Ä!^½!^¶!^¯!^¨!^¡!^š!^“!^Œ!^…!^~!^w!^p!^i!^b!^[!^T!^M!^F!^?!^8!^1!^*!^#!^!^!^!^!^!^ù ^ò ^ë ^ä ^Ý ^Ö ^Ï ^È ^Á ^º ^³ ^¬ ^¥ ^ž ^— ^ ^‰ ^‚ ^{ ^t ^m ^f ^_ ^X ^Q ^J ^C ^< ^5 ^. ^' ^ ^ ^ ^ ^ ^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û^ô^í^æ^ß^Ø^Ñ^Ê^Ã^¼^µ^®^§^ ^™^’^‹^„^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û^ô^í^æ^ß^Ø^Ñ^Ê^Ã^¼^µ^®^§^ ^™^’^‹^„^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û^ô^í^æ^ß^Ø^Ñ^Ê^Ã^¼^µ^®^§^ ^™^’^‹^„^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ÿ ^ø ^ñ ^ê ^ã ^Ü ^Õ ^Î ^Ç ^À ^¹ ^² ^« ^¤ ^ ^– ^ ^ˆ ^ ^z ^s ^l ^e ^^ ^W ^P ^I ^B ^; ^4 ^- ^& ^ ^ ^ ^ ^ ^ü ^õ ^î ^ç ^à ^Ù ^Ò ^Ë ^Ä ^½ ^¶ ^¯ ^¨ ^¡ ^š ^“ ^Œ ^… ^~ ^w ^p ^i ^b ^[ ^T ^M ^F ^? ^8 ^1 ^* ^# ^ ^ ^ ^ ^ ^ù ^ò ^ë ^ä ^Ý ^Ö ^Ï ^È ^Á ^º ^³ ^¬ ^¥ ^ž ^— ^ ^‰ ^‚ ^{ ^t ^m ^f ^_ ^X ^Q ^J ^C ^< ^5 ^. ^' ^ ^ ^ ^ ^ ^ý ^ö ^ï ^è ^á ^Ú ^Ó ^Ì ^Å ^¾ ^· ^° ^© ^¢ ^› ^” ^ ^† ^ ^x ^q ^j ^c ^\ ^U ^N ^G ^@ ^9 ^2 ^+ ^$ ^ ^ ^ ^ ^ ^ú ^ó ^ì ^å ^Þ ^× ^Ð ^É ^ ^» ^´ ^­ ^¦ ^Ÿ ^˜ ^‘ ^Š ^ƒ ^| ^u ^n ^g ^` ^Y ^R ^K ^D ^= ^6 ^/ ^( ^! ^ ^ ^ ^ ^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û^ô^í^æ^ß^Ø^Ñ^Ê^Ã^¼^µ^®^§^ ^™^’^‹^„^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ^÷^ð^é^â^Û^Ô^Í^Æ^¿^¸^±^ª^£^œ^•^Ž^‡^€^y^r^k^d^]^V^O^H^A^:^3^,^%^^^^ ^^û^ô^í^æ^ß^Ø^Ñ^Ê^Ã^¼^µ^®^§^ ^™^’^‹^„^}^v^o^h^a^Z^S^L^E^>^7^0^)^"^^^ ^^ÿÿ]øÿ]ñÿ]êÿ]ãÿ]Üÿ]Õÿ]Îÿ]Çÿ]Àÿ]¹ÿ]²ÿ]«ÿ]¤ÿ]ÿ]–ÿ]ÿ]ˆÿ]ÿ]zÿ]sÿ]lÿ]eÿ]^ÿ]Wÿ]Pÿ]Iÿ]Bÿ];ÿ]4ÿ]-ÿ]&ÿ]ÿ]ÿ]ÿ] ÿ]ÿ]üþ]õþ]îþ]çþ]àþ]Ùþ]Òþ]Ëþ]Äþ]½þ]¶þ]¯þ]¨þ]¡þ]šþ]“þ]Œþ]…þ]~þ]wþ]pþ]iþ]bþ][þ]Tþ]Mþ]Fþ]?þ]8þ]1þ]*þ]#þ]þ]þ]þ]þ]þ]ùý]òý]ëý]äý]Ýý]Öý]Ïý]Èý]Áý]ºý]³ý]¬ý]¥ý]žý]—ý]ý]‰ý]‚ý]{ý]tý]mý]fý]_ý]Xý]Qý]Jý]Cý]<ý]5ý].ý]'ý] ý]ý]ý] ý]ý]ýü]öü]ïü]èü]áü]Úü]Óü]Ìü]Åü]¾ü]·ü]°ü]©ü]¢ü]›ü]”ü]ü]†ü]ü]xü]qü]jü]cü]\ü]Uü]Nü]Gü]@ü]9ü]2ü]+ü]$ü]ü]ü]ü]ü]ü]úû]óû]ìû]åû]Þû]×û]Ðû]Éû]Âû]»û]´û]­û]¦û]Ÿû]˜û]‘û]Šû]ƒû]|û]uû]nû]gû]`û]Yû]Rû]Kû]Dû]=û]6û]/û](û]!û]û]û] û]û]þú]÷ú]ðú]éú]âú]Ûú]Ôú]Íú]Æú]¿ú]¸ú]±ú]ªú]£ú]œú]•ú]Žú]‡ú]€ú]yú]rú]kú]dú]]ú]Vú]Oú]Hú]Aú]:ú]3ú],ú]%ú]ú]ú]ú] ú]ú]ûù]ôù]íù]æù]ßù]Øù]Ñù]Êù]Ãù]¼ù]µù]®ù]§ù] ù]™ù]’ù]‹ù]„ù]}ù]vù]où]hù]aù]Zù]Sù]Lù]Eù]>ù]7ù]0ù])ù]"ù]ù]ù] ù]ù]ÿø]øø]ñø]êø]ãø]Üø]Õø]Îø]Çø]Àø]¹ø]²ø]«ø]¤ø]ø]–ø]ø]ˆø]ø]zø]sø]lø]eø]^ø]Wø]Pø]Iø]Bø];ø]4ø]-ø]&ø]ø]ø]ø] ø]ø]ü÷]õ÷]î÷]ç÷]à÷]Ù÷]Ò÷]Ë÷]Ä÷]½÷]¶÷]¯÷]¨÷]¡÷]š÷]“÷]Œ÷]…÷]~÷]w÷]p÷]i÷]b÷][÷]T÷]M÷]F÷]?÷]8÷]1÷]*÷]#÷]÷]÷]÷]÷]÷]ùö]òö]ëö]äö]Ýö]Öö]Ïö]Èö]Áö]ºö]³ö]¬ö]¥ö]žö]—ö]ö]‰ö]‚ö]{ö]tö]mö]fö]_ö]Xö]Qö]Jö]Cö]<ö]5ö].ö]'ö] ö]ö]ö] ö]ö]ýõ]öõ]ïõ]èõ]áõ]Úõ]Óõ]Ìõ]Åõ]¾õ]·õ]°õ]©õ]¢õ]›õ]”õ]õ]†õ]õ]xõ]qõ]jõ]cõ]\õ]Uõ]Nõ]Gõ]@õ]9õ]2õ]+õ]$õ]õ]õ]õ]õ]õ]úô]óô]ìô]åô]Þô]×ô]Ðô]Éô]Âô]»ô]´ô]­ô]¦ô]Ÿô]˜ô]‘ô]Šô]ƒô]|ô]uô]nô]gô]`ô]Yô]Rô]Kô]Dô]=ô]6ô]/ô](ô]!ô]ô]ô] ô]ô]þó]÷ó]ðó]éó]âó]Ûó]Ôó]Íó]Æó]¿ó]¸ó]±ó]ªó]£ó]œó]•ó]Žó]‡ó]€ó]yó]ró]kó]dó]]ó]Vó]Oó]Hó]Aó]:ó]3ó],ó]%ó]ó]ó]ó] ó]ó]ûò]ôò]íò]æò]ßò]Øò]Ñò]Êò]Ãò]¼ò]µò]®ò]§ò] ò]™ò]’ò]‹ò]„ò]}ò]vò]oò]hò]aò]Zò]Sò]Lò]Eò]>ò]7ò]0ò])ò]"ò]ò]ò] ò]ò]ÿñ]øñ]ññ]êñ]ãñ]Üñ]Õñ]Îñ]Çñ]Àñ]¹ñ]²ñ]«ñ]¤ñ]ñ]–ñ]ñ]ˆñ]ñ]zñ]sñ]lñ]eñ]^ñ]Wñ]Pñ]Iñ]Bñ];ñ]4ñ]-ñ]&ñ]ñ]ñ]ñ] ñ]ñ]üð]õð]îð]çð]àð]Ùð]Òð]Ëð]Äð]½ð]¶ð]¯ð]¨ð]¡ð]šð]“ð]Œð]…ð]~ð]wð]pð]ið]bð][ð]Tð]Mð]Fð]?ð]8ð]1ð]*ð]#ð]ð]ð]ð]ð]ð]ùï]òï]ëï]äï]Ýï]Öï]Ïï]Èï]Áï]ºï]³ï]¬ï]¥ï]žï]—ï]ï]‰ï]‚ï]{ï]tï]mï]fï]_ï]Xï]Qï]Jï]Cï]<ï]5ï].ï]'ï] ï]ï]ï] ï]ï]ýî]öî]ïî]èî]áî]Úî]Óî]Ìî]Åî]¾î]·î]°î]©î]¢î]›î]”î]î]†î]î]xî]qî]jî]cî]\î]Uî]Nî]Gî]@î]9î]2î]+î]$î]î]î]î]î]î]úí]óí]ìí]åí]Þí]×í]Ðí]Éí]Âí]»í]´í]­í]¦í]Ÿí]˜í]‘í]Ší]ƒí]|í]uí]ní]gí]`í]Yí]Rí]Kí]Dí]=í]6í]/í](í]!í]í]í] í]í]þì]÷ì]ðì]éì]âì]Ûì]Ôì]Íì]Æì]¿ì]¸ì]±ì]ªì]£ì]œì]•ì]Žì]‡ì]€ì]yì]rì]kì]dì]]ì]Vì]Oì]Hì]Aì]:ì]3ì],ì]%ì]ì]ì]ì] ì]ì]ûë]ôë]íë]æë]ßë]Øë]Ñë]Êë]Ãë]¼ë]µë]®ë]§ë] ë]™ë]’ë]‹ë]„ë]}ë]vë]oë]hë]aë]Zë]Së]Lë]Eë]>ë]7ë]0ë])ë]"ë]ë]ë] ë]ë]ÿê]øê]ñê]êê]ãê]Üê]Õê]Îê]Çê]Àê]¹ê]²ê]«ê]¤ê]ê]–ê]ê]ˆê]ê]zê]sê]lê]eê]^ê]Wê]Pê]Iê]Bê];ê]4ê]-ê]&ê]ê]ê]ê] ê]ê]üé]õé]îé]çé]àé]Ùé]Òé]Ëé]Äé]½é]¶é]¯é]¨é]¡é]šé]“é]Œé]…é]~é]wé]pé]ié]bé][é]Té]Mé]Fé]?é]8é]1é]*é]#é]é]é]é]é]é]ùè]òè]ëè]äè]Ýè]Öè]Ïè]Èè]Áè]ºè]³è]¬è]¥è]žè]—è]è]‰è]‚è]{è]tè]mè]fè]_è]Xè]Qè]Jè]Cè]<è]5è].è]'è] è]è]è] è]è]ýç]öç]ïç]èç]áç]Úç]Óç]Ìç]Åç]¾ç]·ç]°ç]©ç]¢ç]›ç]”ç]ç]†ç]ç]xç]qç]jç]cç]\ç]Uç]Nç]Gç]@ç]9ç]2ç]+ç]$ç]ç]ç]ç]ç]ç]úæ]óæ]ìæ]åæ]Þæ]׿]Ðæ]Éæ]Âæ]»æ]´æ]­æ]¦æ]Ÿæ]˜æ]‘æ]Šæ]ƒæ]|æ]uæ]næ]gæ]`æ]Yæ]Ræ]Kæ]Dæ]=æ]6æ]/æ](æ]!æ]æ]æ] æ]æ]þå]÷å]ðå]éå]âå]Ûå]Ôå]Íå]Æå]¿å]¸å]±å]ªå]£å]œå]•å]Žå]‡å]€å]yå]rå]kå]då]]å]Vå]Oå]Hå]Aå]:å]3å],å]%å]å]å]å] å]å]ûä]ôä]íä]æä]ßä]Øä]Ñä]Êä]Ãä]¼ä]µä]®ä]§ä] ä]™ä]’ä]‹ä]„ä]}ä]vä]oä]hä]aä]Zä]Sä]Lä]Eä]>ä]7ä]0ä])ä]"ä]ä]ä] ä]ä]ÿã]øã]ñã]êã]ãã]Üã]Õã]Îã]Çã]Àã]¹ã]²ã]«ã]¤ã]ã]–ã]ã]ˆã]ã]zã]sã]lã]eã]^ã]Wã]Pã]Iã]Bã];ã]4ã]-ã]&ã]ã]ã]ã] ã]ã]üâ]õâ]îâ]çâ]àâ]Ùâ]Òâ]Ëâ]Äâ]½â]¶â]¯â]¨â]¡â]šâ]“â]Œâ]…â]~â]wâ]pâ]iâ]bâ][â]Tâ]Mâ]Fâ]?â]8â]1â]*â]#â]â]â]â]â]â]ùá]òá]ëá]äá]Ýá]Öá]Ïá]Èá]Áá]ºá]³á]¬á]¥á]žá]—á]á]‰á]‚á]{á]tá]má]fá]_á]Xá]Qá]Já]Cá]<á]5á].á]'á] á]á]á] á]á]ýà]öà]ïà]èà]áà]Úà]Óà]Ìà]Åà]¾à]·à]°à]©à]¢à]›à]”à]à]†à]à]xà]qà]jà]cà]\à]Uà]Nà]Gà]@à]9à]2à]+à]$à]à]à]à]à]à]úß]óß]ìß]åß]Þß]×ß]Ðß]Éß]Âß]»ß]´ß]­ß]¦ß]Ÿß]˜ß]‘ß]Šß]ƒß]|ß]uß]nß]gß]`ß]Yß]Rß]Kß]Dß]=ß]6ß]/ß](ß]!ß]ß]ß] ß]ß]þÞ]÷Þ]ðÞ]éÞ]âÞ]ÛÞ]ÔÞ]ÍÞ]ÆÞ]¿Þ]¸Þ]±Þ]ªÞ]£Þ]œÞ]•Þ]ŽÞ]‡Þ]€Þ]yÞ]rÞ]kÞ]dÞ]]Þ]VÞ]OÞ]HÞ]AÞ]:Þ]3Þ],Þ]%Þ]Þ]Þ]Þ] Þ]Þ]ûÝ]ôÝ]íÝ]æÝ]ßÝ]ØÝ]ÑÝ]ÊÝ]ÃÝ]¼Ý]µÝ]®Ý]§Ý] Ý]™Ý]’Ý]‹Ý]„Ý]}Ý]vÝ]oÝ]hÝ]aÝ]ZÝ]SÝ]LÝ]EÝ]>Ý]7Ý]0Ý])Ý]"Ý]Ý]Ý] Ý]Ý]ÿÜ]øÜ]ñÜ]êÜ]ãÜ]ÜÜ]ÕÜ]ÎÜ]ÇÜ]ÀÜ]¹Ü]²Ü]«Ü]¤Ü]Ü]–Ü]Ü]ˆÜ]Ü]zÜ]sÜ]lÜ]eÜ]^Ü]WÜ]PÜ]IÜ]BÜ];Ü]4Ü]-Ü]&Ü]Ü]Ü]Ü] Ü]Ü]üÛ]õÛ]îÛ]çÛ]àÛ]ÙÛ]ÒÛ]ËÛ]ÄÛ]½Û]¶Û]¯Û]¨Û]¡Û]šÛ]“Û]ŒÛ]…Û]~Û]wÛ]pÛ]iÛ]bÛ][Û]TÛ]MÛ]FÛ]?Û]8Û]1Û]*Û]#Û]Û]Û]Û]Û]Û]ùÚ]òÚ]ëÚ]äÚ]ÝÚ]ÖÚ]ÏÚ]ÈÚ]ÁÚ]ºÚ]³Ú]¬Ú]¥Ú]žÚ]—Ú]Ú]‰Ú]‚Ú]{Ú]tÚ]mÚ]fÚ]_Ú]XÚ]QÚ]JÚ]CÚ]<Ú]5Ú].Ú]'Ú] Ú]Ú]Ú] Ú]Ú]ýÙ]öÙ]ïÙ]èÙ]áÙ]ÚÙ]ÓÙ]ÌÙ]ÅÙ]¾Ù]·Ù]°Ù]©Ù]¢Ù]›Ù]”Ù]Ù]†Ù]Ù]xÙ]qÙ]jÙ]cÙ]\Ù]UÙ]NÙ]GÙ]@Ù]9Ù]2Ù]+Ù]$Ù]Ù]Ù]Ù]Ù]Ù]úØ]óØ]ìØ]åØ]ÞØ]ר]ÐØ]ÉØ]ÂØ]»Ø]´Ø]­Ø]¦Ø]ŸØ]˜Ø]‘Ø]ŠØ]ƒØ]|Ø]uØ]nØ]gØ]`Ø]YØ]RØ]KØ]DØ]=Ø]6Ø]/Ø](Ø]!Ø]Ø]Ø] Ø]Ø]þ×]÷×]ð×]é×]â×]Û×]Ô×]Í×]Æ×]¿×]¸×]±×]ª×]£×]œ×]•×]Ž×]‡×]€×]y×]r×]k×]d×]]×]V×]O×]H×]A×]:×]3×],×]%×]×]×]×] ×]×]ûÖ]ôÖ]íÖ]æÖ]ßÖ]ØÖ]ÑÖ]ÊÖ]ÃÖ]¼Ö]µÖ]®Ö]§Ö] Ö]™Ö]’Ö]‹Ö]„Ö]}Ö]vÖ]oÖ]hÖ]aÖ]ZÖ]SÖ]LÖ]EÖ]>Ö]7Ö]0Ö])Ö]"Ö]Ö]Ö] Ö]Ö]ÿÕ]øÕ]ñÕ]êÕ]ãÕ]ÜÕ]ÕÕ]ÎÕ]ÇÕ]ÀÕ]¹Õ]²Õ]«Õ]¤Õ]Õ]–Õ]Õ]ˆÕ]Õ]zÕ]sÕ]lÕ]eÕ]^Õ]WÕ]PÕ]IÕ]BÕ];Õ]4Õ]-Õ]&Õ]Õ]Õ]Õ] Õ]Õ]üÔ]õÔ]îÔ]çÔ]àÔ]ÙÔ]ÒÔ]ËÔ]ÄÔ]½Ô]¶Ô]¯Ô]¨Ô]¡Ô]šÔ]“Ô]ŒÔ]…Ô]~Ô]wÔ]pÔ]iÔ]bÔ][Ô]TÔ]MÔ]FÔ]?Ô]8Ô]1Ô]*Ô]#Ô]Ô]Ô]Ô]Ô]Ô]ùÓ]òÓ]ëÓ]äÓ]ÝÓ]ÖÓ]ÏÓ]ÈÓ]ÁÓ]ºÓ]³Ó]¬Ó]¥Ó]žÓ]—Ó]Ó]‰Ó]‚Ó]{Ó]tÓ]mÓ]fÓ]_Ó]XÓ]QÓ]JÓ]CÓ]<Ó]5Ó].Ó]'Ó] Ó]Ó]Ó] Ó]Ó]ýÒ]öÒ]ïÒ]èÒ]áÒ]ÚÒ]ÓÒ]ÌÒ]ÅÒ]¾Ò]·Ò]°Ò]©Ò]¢Ò]›Ò]”Ò]Ò]†Ò]Ò]xÒ]qÒ]jÒ]cÒ]\Ò]UÒ]NÒ]GÒ]@Ò]9Ò]2Ò]+Ò]$Ò]Ò]Ò]Ò]Ò]Ò]úÑ]óÑ]ìÑ]åÑ]ÞÑ]×Ñ]ÐÑ]ÉÑ]ÂÑ]»Ñ]´Ñ]­Ñ]¦Ñ]ŸÑ]˜Ñ]‘Ñ]ŠÑ]ƒÑ]|Ñ]uÑ]nÑ]gÑ]`Ñ]YÑ]RÑ]KÑ]DÑ]=Ñ]6Ñ]/Ñ](Ñ]!Ñ]Ñ]Ñ] Ñ]Ñ]þÐ]÷Ð]ðÐ]éÐ]âÐ]ÛÐ]ÔÐ]ÍÐ]ÆÐ]¿Ð]¸Ð]±Ð]ªÐ]£Ð]œÐ]•Ð]ŽÐ]‡Ð]€Ð]yÐ]rÐ]kÐ]dÐ]]Ð]VÐ]OÐ]HÐ]AÐ]:Ð]3Ð],Ð]%Ð]Ð]Ð]Ð] Ð]Ð]ûÏ]ôÏ]íÏ]æÏ]ßÏ]ØÏ]ÑÏ]ÊÏ]ÃÏ]¼Ï]µÏ]®Ï]§Ï] Ï]™Ï]’Ï]‹Ï]„Ï]}Ï]vÏ]oÏ]hÏ]aÏ]ZÏ]SÏ]LÏ]EÏ]>Ï]7Ï]0Ï])Ï]"Ï]Ï]Ï] Ï]Ï]ÿÎ]øÎ]ñÎ]êÎ]ãÎ]ÜÎ]ÕÎ]ÎÎ]ÇÎ]ÀÎ]¹Î]²Î]«Î]¤Î]Î]–Î]Î]ˆÎ]Î]zÎ]sÎ]lÎ]eÎ]^Î]WÎ]PÎ]IÎ]BÎ];Î]4Î]-Î]&Î]Î]Î]Î] Î]Î]üÍ]õÍ]îÍ]çÍ]àÍ]ÙÍ]ÒÍ]ËÍ]ÄÍ]½Í]¶Í]¯Í]¨Í]¡Í]šÍ]“Í]ŒÍ]…Í]~Í]wÍ]pÍ]iÍ]bÍ][Í]TÍ]MÍ]FÍ]?Í]8Í]1Í]*Í]#Í]Í]Í]Í]Í]Í]ùÌ]òÌ]ëÌ]äÌ]ÝÌ]ÖÌ]ÏÌ]ÈÌ]ÁÌ]ºÌ]³Ì]¬Ì]¥Ì]žÌ]—Ì]Ì]‰Ì]‚Ì]{Ì]tÌ]mÌ]fÌ]_Ì]XÌ]QÌ]JÌ]CÌ]<Ì]5Ì].Ì]'Ì] Ì]Ì]Ì] Ì]Ì]ýË]öË]ïË]èË]áË]ÚË]ÓË]ÌË]ÅË]¾Ë]·Ë]°Ë]©Ë]¢Ë]›Ë]”Ë]Ë]†Ë]Ë]xË]qË]jË]cË]\Ë]UË]NË]GË]@Ë]9Ë]2Ë]+Ë]$Ë]Ë]Ë]Ë]Ë]Ë]úÊ]óÊ]ìÊ]åÊ]ÞÊ]×Ê]ÐÊ]ÉÊ]ÂÊ]»Ê]´Ê]­Ê]¦Ê]ŸÊ]˜Ê]‘Ê]ŠÊ]ƒÊ]|Ê]uÊ]nÊ]gÊ]`Ê]YÊ]RÊ]KÊ]DÊ]=Ê]6Ê]/Ê](Ê]!Ê]Ê]Ê] Ê]Ê]þÉ]÷É]ðÉ]éÉ]âÉ]ÛÉ]ÔÉ]ÍÉ]ÆÉ]¿É]¸É]±É]ªÉ]£É]œÉ]•É]ŽÉ]‡É]€É]yÉ]rÉ]kÉ]dÉ]]É]VÉ]OÉ]HÉ]AÉ]:É]3É],É]%É]É]É]É] É]É]ûÈ]ôÈ]íÈ]æÈ]ßÈ]ØÈ]ÑÈ]ÊÈ]ÃÈ]¼È]µÈ]®È]§È] È]™È]’È]‹È]„È]}È]vÈ]oÈ]hÈ]aÈ]ZÈ]SÈ]LÈ]EÈ]>È]7È]0È])È]"È]È]È] È]È]ÿÇ]øÇ]ñÇ]êÇ]ãÇ]ÜÇ]ÕÇ]ÎÇ]ÇÇ]ÀÇ]¹Ç]²Ç]«Ç]¤Ç]Ç]–Ç]Ç]ˆÇ]Ç]zÇ]sÇ]lÇ]eÇ]^Ç]WÇ]PÇ]IÇ]BÇ];Ç]4Ç]-Ç]&Ç]Ç]Ç]Ç] Ç]Ç]üÆ]õÆ]îÆ]çÆ]àÆ]ÙÆ]ÒÆ]ËÆ]ÄÆ]½Æ]¶Æ]¯Æ]¨Æ]¡Æ]šÆ]“Æ]ŒÆ]…Æ]~Æ]wÆ]pÆ]iÆ]bÆ][Æ]TÆ]MÆ]FÆ]?Æ]8Æ]1Æ]*Æ]#Æ]Æ]Æ]Æ]Æ]Æ]ùÅ]òÅ]ëÅ]äÅ]ÝÅ]ÖÅ]ÏÅ]ÈÅ]ÁÅ]ºÅ]³Å]¬Å]¥Å]žÅ]—Å]Å]‰Å]‚Å]{Å]tÅ]mÅ]fÅ]_Å]XÅ]QÅ]JÅ]CÅ]<Å]5Å].Å]'Å] Å]Å]Å] Å]Å]ýÄ]öÄ]ïÄ]èÄ]áÄ]ÚÄ]ÓÄ]ÌÄ]ÅÄ]¾Ä]·Ä]°Ä]©Ä]¢Ä]›Ä]”Ä]Ä]†Ä]Ä]xÄ]qÄ]jÄ]cÄ]\Ä]UÄ]NÄ]GÄ]@Ä]9Ä]2Ä]+Ä]$Ä]Ä]Ä]Ä]Ä]Ä]úÃ]óÃ]ìÃ]åÃ]ÞÃ]×Ã]ÐÃ]ÉÃ]ÂÃ]»Ã]´Ã]­Ã]¦Ã]ŸÃ]˜Ã]‘Ã]ŠÃ]ƒÃ]|Ã]uÃ]nÃ]gÃ]`Ã]YÃ]RÃ]KÃ]DÃ]=Ã]6Ã]/Ã](Ã]!Ã]Ã]Ã] Ã]Ã]þÂ]÷Â]ðÂ]éÂ]âÂ]ÛÂ]ÔÂ]ÍÂ]ÆÂ]¿Â]¸Â]±Â]ªÂ]£Â]œÂ]•Â]ŽÂ]‡Â]€Â]yÂ]rÂ]kÂ]dÂ]]Â]VÂ]OÂ]HÂ]AÂ]:Â]3Â],Â]%Â]Â]Â]Â] Â]Â]ûÁ]ôÁ]íÁ]æÁ]ßÁ]ØÁ]ÑÁ]ÊÁ]ÃÁ]¼Á]µÁ]®Á]§Á] Á]™Á]’Á]‹Á]„Á]}Á]vÁ]oÁ]hÁ]aÁ]ZÁ]SÁ]LÁ]EÁ]>Á]7Á]0Á])Á]"Á]Á]Á] Á]Á]ÿÀ]øÀ]ñÀ]êÀ]ãÀ]ÜÀ]ÕÀ]ÎÀ]ÇÀ]ÀÀ]¹À]²À]«À]¤À]À]–À]À]ˆÀ]À]zÀ]sÀ]lÀ]eÀ]^À]WÀ]PÀ]IÀ]BÀ];À]4À]-À]&À]À]À]À] À]À]ü¿]õ¿]î¿]ç¿]à¿]Ù¿]Ò¿]Ë¿]Ä¿]½¿]¶¿]¯¿]¨¿]¡¿]š¿]“¿]Œ¿]…¿]~¿]w¿]p¿]i¿]b¿][¿]T¿]M¿]F¿]?¿]8¿]1¿]*¿]#¿]¿]¿]¿]¿]¿]ù¾]ò¾]ë¾]ä¾]ݾ]Ö¾]Ͼ]Ⱦ]Á¾]º¾]³¾]¬¾]¥¾]ž¾]—¾]¾]‰¾]‚¾]{¾]t¾]m¾]f¾]_¾]X¾]Q¾]J¾]C¾]<¾]5¾].¾]'¾] ¾]¾]¾] ¾]¾]ý½]ö½]ï½]è½]á½]Ú½]Ó½]̽]Ž]¾½]·½]°½]©½]¢½]›½]”½]½]†½]½]x½]q½]j½]c½]\½]U½]N½]G½]@½]9½]2½]+½]$½]½]½]½]½]½]ú¼]ó¼]ì¼]å¼]Þ¼]×¼]м]ɼ]¼]»¼]´¼]­¼]¦¼]Ÿ¼]˜¼]‘¼]м]ƒ¼]|¼]u¼]n¼]g¼]`¼]Y¼]R¼]K¼]D¼]=¼]6¼]/¼](¼]!¼]¼]¼] ¼]¼]þ»]÷»]ð»]é»]â»]Û»]Ô»]Í»]Æ»]¿»]¸»]±»]ª»]£»]œ»]•»]Ž»]‡»]€»]y»]r»]k»]d»]]»]V»]O»]H»]A»]:»]3»],»]%»]»]»]»] »]»]ûº]ôº]íº]æº]ߺ]غ]Ѻ]ʺ]ú]¼º]µº]®º]§º] º]™º]’º]‹º]„º]}º]vº]oº]hº]aº]Zº]Sº]Lº]Eº]>º]7º]0º])º]"º]º]º] º]º]ÿ¹]ø¹]ñ¹]ê¹]ã¹]ܹ]Õ¹]ι]ǹ]À¹]¹¹]²¹]«¹]¤¹]¹]–¹]¹]ˆ¹]¹]z¹]s¹]l¹]e¹]^¹]W¹]P¹]I¹]B¹];¹]4¹]-¹]&¹]¹]¹]¹] ¹]¹]ü¸]õ¸]î¸]ç¸]à¸]Ù¸]Ò¸]˸]ĸ]½¸]¶¸]¯¸]¨¸]¡¸]š¸]“¸]Œ¸]…¸]~¸]w¸]p¸]i¸]b¸][¸]T¸]M¸]F¸]?¸]8¸]1¸]*¸]#¸]¸]¸]¸]¸]¸]ù·]ò·]ë·]ä·]Ý·]Ö·]Ï·]È·]Á·]º·]³·]¬·]¥·]ž·]—·]·]‰·]‚·]{·]t·]m·]f·]_·]X·]Q·]J·]C·]<·]5·].·]'·] ·]·]·] ·]·]ý¶]ö¶]ï¶]è¶]á¶]Ú¶]Ó¶]̶]Ŷ]¾¶]·¶]°¶]©¶]¢¶]›¶]”¶]¶]†¶]¶]x¶]q¶]j¶]c¶]\¶]U¶]N¶]G¶]@¶]9¶]2¶]+¶]$¶]¶]¶]¶]¶]¶]úµ]óµ]ìµ]åµ]Þµ]×µ]е]ɵ]µ]»µ]´µ]­µ]¦µ]Ÿµ]˜µ]‘µ]е]ƒµ]|µ]uµ]nµ]gµ]`µ]Yµ]Rµ]Kµ]Dµ]=µ]6µ]/µ](µ]!µ]µ]µ] µ]µ]þ´]÷´]ð´]é´]â´]Û´]Ô´]Í´]Æ´]¿´]¸´]±´]ª´]£´]œ´]•´]Ž´]‡´]€´]y´]r´]k´]d´]]´]V´]O´]H´]A´]:´]3´],´]%´]´]´]´] ´]´]û³]ô³]í³]æ³]ß³]س]ѳ]ʳ]ó]¼³]µ³]®³]§³] ³]™³]’³]‹³]„³]}³]v³]o³]h³]a³]Z³]S³]L³]E³]>³]7³]0³])³]"³]³]³] ³]³]ÿ²]ø²]ñ²]ê²]ã²]ܲ]Õ²]β]Dz]À²]¹²]²²]«²]¤²]²]–²]²]ˆ²]²]z²]s²]l²]e²]^²]W²]P²]I²]B²];²]4²]-²]&²]²]²]²] ²]²]ü±]õ±]î±]ç±]à±]Ù±]Ò±]˱]ı]½±]¶±]¯±]¨±]¡±]š±]“±]Œ±]…±]~±]w±]p±]i±]b±][±]T±]M±]F±]?±]8±]1±]*±]#±]±]±]±]±]±]ù°]ò°]ë°]ä°]ݰ]Ö°]ϰ]Ȱ]Á°]º°]³°]¬°]¥°]ž°]—°]°]‰°]‚°]{°]t°]m°]f°]_°]X°]Q°]J°]C°]<°]5°].°]'°] °]°]°] °]°]ý¯]ö¯]ï¯]è¯]á¯]Ú¯]Ó¯]̯]ů]¾¯]·¯]°¯]©¯]¢¯]›¯]”¯]¯]†¯]¯]x¯]q¯]j¯]c¯]\¯]U¯]N¯]G¯]@¯]9¯]2¯]+¯]$¯]¯]¯]¯]¯]¯]ú®]ó®]ì®]å®]Þ®]×®]Ю]É®]®]»®]´®]­®]¦®]Ÿ®]˜®]‘®]Š®]ƒ®]|®]u®]n®]g®]`®]Y®]R®]K®]D®]=®]6®]/®](®]!®]®]®] ®]®]þ­]÷­]ð­]é­]â­]Û­]Ô­]Í­]Æ­]¿­]¸­]±­]ª­]£­]œ­]•­]Ž­]‡­]€­]y­]r­]k­]d­]]­]V­]O­]H­]A­]:­]3­],­]%­]­]­]­] ­]­]û¬]ô¬]í¬]æ¬]߬]ج]Ѭ]ʬ]ì]¼¬]µ¬]®¬]§¬] ¬]™¬]’¬]‹¬]„¬]}¬]v¬]o¬]h¬]a¬]Z¬]S¬]L¬]E¬]>¬]7¬]0¬])¬]"¬]¬]¬] ¬]¬]ÿ«]ø«]ñ«]ê«]ã«]Ü«]Õ«]Ϋ]Ç«]À«]¹«]²«]««]¤«]«]–«]«]ˆ«]«]z«]s«]l«]e«]^«]W«]P«]I«]B«];«]4«]-«]&«]«]«]«] «]«]üª]õª]îª]çª]àª]Ùª]Òª]˪]Ī]½ª]¶ª]¯ª]¨ª]¡ª]šª]“ª]Œª]…ª]~ª]wª]pª]iª]bª][ª]Tª]Mª]Fª]?ª]8ª]1ª]*ª]#ª]ª]ª]ª]ª]ª]ù©]ò©]ë©]ä©]Ý©]Ö©]Ï©]È©]Á©]º©]³©]¬©]¥©]ž©]—©]©]‰©]‚©]{©]t©]m©]f©]_©]X©]Q©]J©]C©]<©]5©].©]'©] ©]©]©] ©]©]ý¨]ö¨]ï¨]è¨]á¨]Ú¨]Ó¨]̨]Ũ]¾¨]·¨]°¨]©¨]¢¨]›¨]”¨]¨]†¨]¨]x¨]q¨]j¨]c¨]\¨]U¨]N¨]G¨]@¨]9¨]2¨]+¨]$¨]¨]¨]¨]¨]¨]ú§]ó§]ì§]å§]Þ§]×§]Ч]ɧ]§]»§]´§]­§]¦§]Ÿ§]˜§]‘§]Ч]ƒ§]|§]u§]n§]g§]`§]Y§]R§]K§]D§]=§]6§]/§](§]!§]§]§] §]§]þ¦]÷¦]ð¦]é¦]â¦]Û¦]Ô¦]ͦ]Ʀ]¿¦]¸¦]±¦]ª¦]£¦]œ¦]•¦]ަ]‡¦]€¦]y¦]r¦]k¦]d¦]]¦]V¦]O¦]H¦]A¦]:¦]3¦],¦]%¦]¦]¦]¦] ¦]¦]û¥]ô¥]í¥]æ¥]ߥ]Ø¥]Ñ¥]Ê¥]Ã¥]¼¥]µ¥]®¥]§¥] ¥]™¥]’¥]‹¥]„¥]}¥]v¥]o¥]h¥]a¥]Z¥]S¥]L¥]E¥]>¥]7¥]0¥])¥]"¥]¥]¥] ¥]¥]ÿ¤]ø¤]ñ¤]ê¤]ã¤]ܤ]Õ¤]Τ]Ǥ]À¤]¹¤]²¤]«¤]¤¤]¤]–¤]¤]ˆ¤]¤]z¤]s¤]l¤]e¤]^¤]W¤]P¤]I¤]B¤];¤]4¤]-¤]&¤]¤]¤]¤] ¤]¤]ü£]õ£]î£]ç£]à£]Ù£]Ò£]Ë£]Ä£]½£]¶£]¯£]¨£]¡£]š£]“£]Œ£]…£]~£]w£]p£]i£]b£][£]T£]M£]F£]?£]8£]1£]*£]#£]£]£]£]£]£]ù¢]ò¢]ë¢]ä¢]Ý¢]Ö¢]Ï¢]È¢]Á¢]º¢]³¢]¬¢]¥¢]ž¢]—¢]¢]‰¢]‚¢]{¢]t¢]m¢]f¢]_¢]X¢]Q¢]J¢]C¢]<¢]5¢].¢]'¢] ¢]¢]¢] ¢]¢]ý¡]ö¡]ï¡]è¡]á¡]Ú¡]Ó¡]Ì¡]Å¡]¾¡]·¡]°¡]©¡]¢¡]›¡]”¡]¡]†¡]¡]x¡]q¡]j¡]c¡]\¡]U¡]N¡]G¡]@¡]9¡]2¡]+¡]$¡]¡]¡]¡]¡]¡]ú ]ó ]ì ]å ]Þ ]× ]Р]É ] ]» ]´ ]­ ]¦ ]Ÿ ]˜ ]‘ ]Š ]ƒ ]| ]u ]n ]g ]` ]Y ]R ]K ]D ]= ]6 ]/ ]( ]! ] ] ]  ] ]þŸ]÷Ÿ]ðŸ]éŸ]âŸ]ÛŸ]ÔŸ]ÍŸ]ÆŸ]¿Ÿ]¸Ÿ]±Ÿ]ªŸ]£Ÿ]œŸ]•Ÿ]ŽŸ]‡Ÿ]€Ÿ]yŸ]rŸ]kŸ]dŸ]]Ÿ]VŸ]OŸ]HŸ]AŸ]:Ÿ]3Ÿ],Ÿ]%Ÿ]Ÿ]Ÿ]Ÿ] Ÿ]Ÿ]ûž]ôž]íž]æž]ßž]Øž]Ñž]Êž]Þ]¼ž]µž]®ž]§ž] ž]™ž]’ž]‹ž]„ž]}ž]vž]ož]hž]až]Zž]Sž]Lž]Ež]>ž]7ž]0ž])ž]"ž]ž]ž] ž]ž]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]üœ]õœ]îœ]çœ]àœ]Ùœ]Òœ]Ëœ]Äœ]½œ]¶œ]¯œ]¨œ]¡œ]šœ]“œ]Œœ]…œ]~œ]wœ]pœ]iœ]bœ][œ]Tœ]Mœ]Fœ]?œ]8œ]1œ]*œ]#œ]œ]œ]œ]œ]œ]ù›]ò›]ë›]ä›]Ý›]Ö›]Ï›]È›]Á›]º›]³›]¬›]¥›]ž›]—›]›]‰›]‚›]{›]t›]m›]f›]_›]X›]Q›]J›]C›]<›]5›].›]'›] ›]›]›] ›]›]ýš]öš]ïš]èš]áš]Úš]Óš]Ìš]Åš]¾š]·š]°š]©š]¢š]›š]”š]š]†š]š]xš]qš]jš]cš]\š]Uš]Nš]Gš]@š]9š]2š]+š]$š]š]š]š]š]š]ú™]ó™]ì™]å™]Þ™]×™]Й]É™]™]»™]´™]­™]¦™]Ÿ™]˜™]‘™]Š™]ƒ™]|™]u™]n™]g™]`™]Y™]R™]K™]D™]=™]6™]/™](™]!™]™]™] ™]™]þ˜]÷˜]ð˜]é˜]â˜]Û˜]Ô˜]͘]Ƙ]¿˜]¸˜]±˜]ª˜]£˜]œ˜]•˜]Ž˜]‡˜]€˜]y˜]r˜]k˜]d˜]]˜]V˜]O˜]H˜]A˜]:˜]3˜],˜]%˜]˜]˜]˜] ˜]˜]û—]ô—]í—]æ—]ß—]Ø—]Ñ—]Ê—]×]¼—]µ—]®—]§—] —]™—]’—]‹—]„—]}—]v—]o—]h—]a—]Z—]S—]L—]E—]>—]7—]0—])—]"—]—]—] —]—]ÿ–]ø–]ñ–]ê–]ã–]Ü–]Õ–]Ζ]Ç–]À–]¹–]²–]«–]¤–]–]––]–]ˆ–]–]z–]s–]l–]e–]^–]W–]P–]I–]B–];–]4–]-–]&–]–]–]–] –]–]ü•]õ•]î•]ç•]à•]Ù•]Ò•]Ë•]Ä•]½•]¶•]¯•]¨•]¡•]š•]“•]Œ•]…•]~•]w•]p•]i•]b•][•]T•]M•]F•]?•]8•]1•]*•]#•]•]•]•]•]•]ù”]ò”]ë”]ä”]Ý”]Ö”]Ï”]È”]Á”]º”]³”]¬”]¥”]ž”]—”]”]‰”]‚”]{”]t”]m”]f”]_”]X”]Q”]J”]C”]<”]5”].”]'”] ”]”]”] ”]”]ý“]ö“]ï“]è“]á“]Ú“]Ó“]Ì“]Å“]¾“]·“]°“]©“]¢“]›“]”“]“]†“]“]x“]q“]j“]c“]\“]U“]N“]G“]@“]9“]2“]+“]$“]“]“]“]“]“]ú’]ó’]ì’]å’]Þ’]×’]Ð’]É’]Â’]»’]´’]­’]¦’]Ÿ’]˜’]‘’]Š’]ƒ’]|’]u’]n’]g’]`’]Y’]R’]K’]D’]=’]6’]/’](’]!’]’]’] ’]’]þ‘]÷‘]ð‘]é‘]â‘]Û‘]Ô‘]Í‘]Æ‘]¿‘]¸‘]±‘]ª‘]£‘]œ‘]•‘]Ž‘]‡‘]€‘]y‘]r‘]k‘]d‘]]‘]V‘]O‘]H‘]A‘]:‘]3‘],‘]%‘]‘]‘]‘] ‘]‘]û]ô]í]æ]ß]Ø]Ñ]Ê]Ã]¼]µ]®]§] ]™]’]‹]„]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]üŽ]õŽ]îŽ]çŽ]àŽ]ÙŽ]ÒŽ]ËŽ]ÄŽ]½Ž]¶Ž]¯Ž]¨Ž]¡Ž]šŽ]“Ž]ŒŽ]…Ž]~Ž]wŽ]pŽ]iŽ]bŽ][Ž]TŽ]MŽ]FŽ]?Ž]8Ž]1Ž]*Ž]#Ž]Ž]Ž]Ž]Ž]Ž]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ýŒ]öŒ]ïŒ]èŒ]áŒ]ÚŒ]ÓŒ]ÌŒ]ÅŒ]¾Œ]·Œ]°Œ]©Œ]¢Œ]›Œ]”Œ]Œ]†Œ]Œ]xŒ]qŒ]jŒ]cŒ]\Œ]UŒ]NŒ]GŒ]@Œ]9Œ]2Œ]+Œ]$Œ]Œ]Œ]Œ]Œ]Œ]ú‹]ó‹]ì‹]å‹]Þ‹]׋]Ћ]É‹]‹]»‹]´‹]­‹]¦‹]Ÿ‹]˜‹]‘‹]Š‹]ƒ‹]|‹]u‹]n‹]g‹]`‹]Y‹]R‹]K‹]D‹]=‹]6‹]/‹](‹]!‹]‹]‹] ‹]‹]þŠ]÷Š]ðŠ]éŠ]âŠ]ÛŠ]ÔŠ]ÍŠ]ÆŠ]¿Š]¸Š]±Š]ªŠ]£Š]œŠ]•Š]ŽŠ]‡Š]€Š]yŠ]rŠ]kŠ]dŠ]]Š]VŠ]OŠ]HŠ]AŠ]:Š]3Š],Š]%Š]Š]Š]Š] Š]Š]û‰]ô‰]í‰]æ‰]߉]؉]щ]ʉ]É]¼‰]µ‰]®‰]§‰] ‰]™‰]’‰]‹‰]„‰]}‰]v‰]o‰]h‰]a‰]Z‰]S‰]L‰]E‰]>‰]7‰]0‰])‰]"‰]‰]‰] ‰]‰]ÿˆ]øˆ]ñˆ]êˆ]ãˆ]܈]Õˆ]Έ]Lj]Àˆ]¹ˆ]²ˆ]«ˆ]¤ˆ]ˆ]–ˆ]ˆ]ˆˆ]ˆ]zˆ]sˆ]lˆ]eˆ]^ˆ]Wˆ]Pˆ]Iˆ]Bˆ];ˆ]4ˆ]-ˆ]&ˆ]ˆ]ˆ]ˆ] ˆ]ˆ]ü‡]õ‡]î‡]ç‡]à‡]Ù‡]Ò‡]ˇ]ć]½‡]¶‡]¯‡]¨‡]¡‡]š‡]“‡]Œ‡]…‡]~‡]w‡]p‡]i‡]b‡][‡]T‡]M‡]F‡]?‡]8‡]1‡]*‡]#‡]‡]‡]‡]‡]‡]ù†]ò†]ë†]ä†]݆]Ö†]φ]Ȇ]Á†]º†]³†]¬†]¥†]ž†]—†]†]‰†]‚†]{†]t†]m†]f†]_†]X†]Q†]J†]C†]<†]5†].†]'†] †]†]†] †]†]ý…]ö…]ï…]è…]á…]Ú…]Ó…]Ì…]Å…]¾…]·…]°…]©…]¢…]›…]”…]…]†…]…]x…]q…]j…]c…]\…]U…]N…]G…]@…]9…]2…]+…]$…]…]…]…]…]…]ú„]ó„]ì„]å„]Þ„]ׄ]Є]É„]„]»„]´„]­„]¦„]Ÿ„]˜„]‘„]Š„]ƒ„]|„]u„]n„]g„]`„]Y„]R„]K„]D„]=„]6„]/„](„]!„]„]„] „]„]þƒ]÷ƒ]ðƒ]éƒ]âƒ]Ûƒ]Ôƒ]̓]ƃ]¿ƒ]¸ƒ]±ƒ]ªƒ]£ƒ]œƒ]•ƒ]Žƒ]‡ƒ]€ƒ]yƒ]rƒ]kƒ]dƒ]]ƒ]Vƒ]Oƒ]Hƒ]Aƒ]:ƒ]3ƒ],ƒ]%ƒ]ƒ]ƒ]ƒ] ƒ]ƒ]û‚]ô‚]í‚]æ‚]ß‚]Ø‚]Ñ‚]Ê‚]Â]¼‚]µ‚]®‚]§‚] ‚]™‚]’‚]‹‚]„‚]}‚]v‚]o‚]h‚]a‚]Z‚]S‚]L‚]E‚]>‚]7‚]0‚])‚]"‚]‚]‚] ‚]‚]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü€]õ€]î€]ç€]à€]Ù€]Ò€]Ë€]Ä€]½€]¶€]¯€]¨€]¡€]š€]“€]Œ€]…€]~€]w€]p€]i€]b€][€]T€]M€]F€]?€]8€]1€]*€]#€]€]€]€]€]€]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý~]ö~]ï~]è~]á~]Ú~]Ó~]Ì~]Å~]¾~]·~]°~]©~]¢~]›~]”~]~]†~]~]x~]q~]j~]c~]\~]U~]N~]G~]@~]9~]2~]+~]$~]~]~]~]~]~]ú}]ó}]ì}]å}]Þ}]×}]Ð}]É}]Â}]»}]´}]­}]¦}]Ÿ}]˜}]‘}]Š}]ƒ}]|}]u}]n}]g}]`}]Y}]R}]K}]D}]=}]6}]/}](}]!}]}]}] }]}]þ|]÷|]ð|]é|]â|]Û|]Ô|]Í|]Æ|]¿|]¸|]±|]ª|]£|]œ|]•|]Ž|]‡|]€|]y|]r|]k|]d|]]|]V|]O|]H|]A|]:|]3|],|]%|]|]|]|] |]|]û{]ô{]í{]æ{]ß{]Ø{]Ñ{]Ê{]Ã{]¼{]µ{]®{]§{] {]™{]’{]‹{]„{]}{]v{]o{]h{]a{]Z{]S{]L{]E{]>{]7{]0{]){]"{]{]{] {]{]ÿz]øz]ñz]êz]ãz]Üz]Õz]Îz]Çz]Àz]¹z]²z]«z]¤z]z]–z]z]ˆz]z]zz]sz]lz]ez]^z]Wz]Pz]Iz]Bz];z]4z]-z]&z]z]z]z] z]z]üy]õy]îy]çy]ày]Ùy]Òy]Ëy]Äy]½y]¶y]¯y]¨y]¡y]šy]“y]Œy]…y]~y]wy]py]iy]by][y]Ty]My]Fy]?y]8y]1y]*y]#y]y]y]y]y]y]ùx]òx]ëx]äx]Ýx]Öx]Ïx]Èx]Áx]ºx]³x]¬x]¥x]žx]—x]x]‰x]‚x]{x]tx]mx]fx]_x]Xx]Qx]Jx]Cx]t]7t]0t])t]"t]t]t] t]t]ÿs]øs]ñs]ês]ãs]Üs]Õs]Îs]Çs]Às]¹s]²s]«s]¤s]s]–s]s]ˆs]s]zs]ss]ls]es]^s]Ws]Ps]Is]Bs];s]4s]-s]&s]s]s]s] s]s]ür]õr]îr]çr]àr]Ùr]Òr]Ër]Är]½r]¶r]¯r]¨r]¡r]šr]“r]Œr]…r]~r]wr]pr]ir]br][r]Tr]Mr]Fr]?r]8r]1r]*r]#r]r]r]r]r]r]ùq]òq]ëq]äq]Ýq]Öq]Ïq]Èq]Áq]ºq]³q]¬q]¥q]žq]—q]q]‰q]‚q]{q]tq]mq]fq]_q]Xq]Qq]Jq]Cq]m]7m]0m])m]"m]m]m] m]m]ÿl]øl]ñl]êl]ãl]Ül]Õl]Îl]Çl]Àl]¹l]²l]«l]¤l]l]–l]l]ˆl]l]zl]sl]ll]el]^l]Wl]Pl]Il]Bl];l]4l]-l]&l]l]l]l] l]l]ük]õk]îk]çk]àk]Ùk]Òk]Ëk]Äk]½k]¶k]¯k]¨k]¡k]šk]“k]Œk]…k]~k]wk]pk]ik]bk][k]Tk]Mk]Fk]?k]8k]1k]*k]#k]k]k]k]k]k]ùj]òj]ëj]äj]Ýj]Öj]Ïj]Èj]Áj]ºj]³j]¬j]¥j]žj]—j]j]‰j]‚j]{j]tj]mj]fj]_j]Xj]Qj]Jj]Cj]f]7f]0f])f]"f]f]f] f]f]ÿe]øe]ñe]êe]ãe]Üe]Õe]Îe]Çe]Àe]¹e]²e]«e]¤e]e]–e]e]ˆe]e]ze]se]le]ee]^e]We]Pe]Ie]Be];e]4e]-e]&e]e]e]e] e]e]üd]õd]îd]çd]àd]Ùd]Òd]Ëd]Äd]½d]¶d]¯d]¨d]¡d]šd]“d]Œd]…d]~d]wd]pd]id]bd][d]Td]Md]Fd]?d]8d]1d]*d]#d]d]d]d]d]d]ùc]òc]ëc]äc]Ýc]Öc]Ïc]Èc]Ác]ºc]³c]¬c]¥c]žc]—c]c]‰c]‚c]{c]tc]mc]fc]_c]Xc]Qc]Jc]Cc]_]7_]0_])_]"_]_]_] _]_]ÿ^]ø^]ñ^]ê^]ã^]Ü^]Õ^]Î^]Ç^]À^]¹^]²^]«^]¤^]^]–^]^]ˆ^]^]z^]s^]l^]e^]^^]W^]P^]I^]B^];^]4^]-^]&^]^]^]^] ^]^]ü]]õ]]î]]ç]]à]]Ù]]Ò]]Ë]]Ä]]½]]¶]]¯]]¨]]¡]]š]]“]]Œ]]…]]~]]w]]p]]i]]b]][]]T]]M]]F]]?]]8]]1]]*]]#]]]]]]]]]]]]ù\]ò\]ë\]ä\]Ý\]Ö\]Ï\]È\]Á\]º\]³\]¬\]¥\]ž\]—\]\]‰\]‚\]{\]t\]m\]f\]_\]X\]Q\]J\]C\]<\]5\].\]'\] \]\]\] \]\]ý[]ö[]ï[]è[]á[]Ú[]Ó[]Ì[]Å[]¾[]·[]°[]©[]¢[]›[]”[][]†[][]x[]q[]j[]c[]\[]U[]N[]G[]@[]9[]2[]+[]$[][][][][][]úZ]óZ]ìZ]åZ]ÞZ]×Z]ÐZ]ÉZ]ÂZ]»Z]´Z]­Z]¦Z]ŸZ]˜Z]‘Z]ŠZ]ƒZ]|Z]uZ]nZ]gZ]`Z]YZ]RZ]KZ]DZ]=Z]6Z]/Z](Z]!Z]Z]Z] Z]Z]þY]÷Y]ðY]éY]âY]ÛY]ÔY]ÍY]ÆY]¿Y]¸Y]±Y]ªY]£Y]œY]•Y]ŽY]‡Y]€Y]yY]rY]kY]dY]]Y]VY]OY]HY]AY]:Y]3Y],Y]%Y]Y]Y]Y] Y]Y]ûX]ôX]íX]æX]ßX]ØX]ÑX]ÊX]ÃX]¼X]µX]®X]§X] X]™X]’X]‹X]„X]}X]vX]oX]hX]aX]ZX]SX]LX]EX]>X]7X]0X])X]"X]X]X] X]X]ÿW]øW]ñW]êW]ãW]ÜW]ÕW]ÎW]ÇW]ÀW]¹W]²W]«W]¤W]W]–W]W]ˆW]W]zW]sW]lW]eW]^W]WW]PW]IW]BW];W]4W]-W]&W]W]W]W] W]W]üV]õV]îV]çV]àV]ÙV]ÒV]ËV]ÄV]½V]¶V]¯V]¨V]¡V]šV]“V]ŒV]…V]~V]wV]pV]iV]bV][V]TV]MV]FV]?V]8V]1V]*V]#V]V]V]V]V]V]ùU]òU]ëU]äU]ÝU]ÖU]ÏU]ÈU]ÁU]ºU]³U]¬U]¥U]žU]—U]U]‰U]‚U]{U]tU]mU]fU]_U]XU]QU]JU]CU]Q]7Q]0Q])Q]"Q]Q]Q] Q]Q]ÿP]øP]ñP]êP]ãP]ÜP]ÕP]ÎP]ÇP]ÀP]¹P]²P]«P]¤P]P]–P]P]ˆP]P]zP]sP]lP]eP]^P]WP]PP]IP]BP];P]4P]-P]&P]P]P]P] P]P]üO]õO]îO]çO]àO]ÙO]ÒO]ËO]ÄO]½O]¶O]¯O]¨O]¡O]šO]“O]ŒO]…O]~O]wO]pO]iO]bO][O]TO]MO]FO]?O]8O]1O]*O]#O]O]O]O]O]O]ùN]òN]ëN]äN]ÝN]ÖN]ÏN]ÈN]ÁN]ºN]³N]¬N]¥N]žN]—N]N]‰N]‚N]{N]tN]mN]fN]_N]XN]QN]JN]CN]J]7J]0J])J]"J]J]J] J]J]ÿI]øI]ñI]êI]ãI]ÜI]ÕI]ÎI]ÇI]ÀI]¹I]²I]«I]¤I]I]–I]I]ˆI]I]zI]sI]lI]eI]^I]WI]PI]II]BI];I]4I]-I]&I]I]I]I] I]I]üH]õH]îH]çH]àH]ÙH]ÒH]ËH]ÄH]½H]¶H]¯H]¨H]¡H]šH]“H]ŒH]…H]~H]wH]pH]iH]bH][H]TH]MH]FH]?H]8H]1H]*H]#H]H]H]H]H]H]ùG]òG]ëG]äG]ÝG]ÖG]ÏG]ÈG]ÁG]ºG]³G]¬G]¥G]žG]—G]G]‰G]‚G]{G]tG]mG]fG]_G]XG]QG]JG]CG]C]7C]0C])C]"C]C]C] C]C]ÿB]øB]ñB]êB]ãB]ÜB]ÕB]ÎB]ÇB]ÀB]¹B]²B]«B]¤B]B]–B]B]ˆB]B]zB]sB]lB]eB]^B]WB]PB]IB]BB];B]4B]-B]&B]B]B]B] B]B]üA]õA]îA]çA]àA]ÙA]ÒA]ËA]ÄA]½A]¶A]¯A]¨A]¡A]šA]“A]ŒA]…A]~A]wA]pA]iA]bA][A]TA]MA]FA]?A]8A]1A]*A]#A]A]A]A]A]A]ù@]ò@]ë@]ä@]Ý@]Ö@]Ï@]È@]Á@]º@]³@]¬@]¥@]ž@]—@]@]‰@]‚@]{@]t@]m@]f@]_@]X@]Q@]J@]C@]<@]5@].@]'@] @]@]@] @]@]ý?]ö?]ï?]è?]á?]Ú?]Ó?]Ì?]Å?]¾?]·?]°?]©?]¢?]›?]”?]?]†?]?]x?]q?]j?]c?]\?]U?]N?]G?]@?]9?]2?]+?]$?]?]?]?]?]?]ú>]ó>]ì>]å>]Þ>]×>]Ð>]É>]Â>]»>]´>]­>]¦>]Ÿ>]˜>]‘>]Š>]ƒ>]|>]u>]n>]g>]`>]Y>]R>]K>]D>]=>]6>]/>](>]!>]>]>] >]>]þ=]÷=]ð=]é=]â=]Û=]Ô=]Í=]Æ=]¿=]¸=]±=]ª=]£=]œ=]•=]Ž=]‡=]€=]y=]r=]k=]d=]]=]V=]O=]H=]A=]:=]3=],=]%=]=]=]=] =]=]û<]ô<]í<]æ<]ß<]Ø<]Ñ<]Ê<]Ã<]¼<]µ<]®<]§<] <]™<]’<]‹<]„<]}<]v<]o<]h<]a<]Z<]S<]L<]E<]><]7<]0<])<]"<]<]<] <]<]ÿ;]ø;]ñ;]ê;]ã;]Ü;]Õ;]Î;]Ç;]À;]¹;]²;]«;]¤;];]–;];]ˆ;];]z;]s;]l;]e;]^;]W;]P;]I;]B;];;]4;]-;]&;];];];] ;];]ü:]õ:]î:]ç:]à:]Ù:]Ò:]Ë:]Ä:]½:]¶:]¯:]¨:]¡:]š:]“:]Œ:]…:]~:]w:]p:]i:]b:][:]T:]M:]F:]?:]8:]1:]*:]#:]:]:]:]:]:]ù9]ò9]ë9]ä9]Ý9]Ö9]Ï9]È9]Á9]º9]³9]¬9]¥9]ž9]—9]9]‰9]‚9]{9]t9]m9]f9]_9]X9]Q9]J9]C9]<9]59].9]'9] 9]9]9] 9]9]ý8]ö8]ï8]è8]á8]Ú8]Ó8]Ì8]Å8]¾8]·8]°8]©8]¢8]›8]”8]8]†8]8]x8]q8]j8]c8]\8]U8]N8]G8]@8]98]28]+8]$8]8]8]8]8]8]ú7]ó7]ì7]å7]Þ7]×7]Ð7]É7]Â7]»7]´7]­7]¦7]Ÿ7]˜7]‘7]Š7]ƒ7]|7]u7]n7]g7]`7]Y7]R7]K7]D7]=7]67]/7](7]!7]7]7] 7]7]þ6]÷6]ð6]é6]â6]Û6]Ô6]Í6]Æ6]¿6]¸6]±6]ª6]£6]œ6]•6]Ž6]‡6]€6]y6]r6]k6]d6]]6]V6]O6]H6]A6]:6]36],6]%6]6]6]6] 6]6]û5]ô5]í5]æ5]ß5]Ø5]Ñ5]Ê5]Ã5]¼5]µ5]®5]§5] 5]™5]’5]‹5]„5]}5]v5]o5]h5]a5]Z5]S5]L5]E5]>5]75]05])5]"5]5]5] 5]5]ÿ4]ø4]ñ4]ê4]ã4]Ü4]Õ4]Î4]Ç4]À4]¹4]²4]«4]¤4]4]–4]4]ˆ4]4]z4]s4]l4]e4]^4]W4]P4]I4]B4];4]44]-4]&4]4]4]4] 4]4]ü3]õ3]î3]ç3]à3]Ù3]Ò3]Ë3]Ä3]½3]¶3]¯3]¨3]¡3]š3]“3]Œ3]…3]~3]w3]p3]i3]b3][3]T3]M3]F3]?3]83]13]*3]#3]3]3]3]3]3]ù2]ò2]ë2]ä2]Ý2]Ö2]Ï2]È2]Á2]º2]³2]¬2]¥2]ž2]—2]2]‰2]‚2]{2]t2]m2]f2]_2]X2]Q2]J2]C2]<2]52].2]'2] 2]2]2] 2]2]ý1]ö1]ï1]è1]á1]Ú1]Ó1]Ì1]Å1]¾1]·1]°1]©1]¢1]›1]”1]1]†1]1]x1]q1]j1]c1]\1]U1]N1]G1]@1]91]21]+1]$1]1]1]1]1]1]ú0]ó0]ì0]å0]Þ0]×0]Ð0]É0]Â0]»0]´0]­0]¦0]Ÿ0]˜0]‘0]Š0]ƒ0]|0]u0]n0]g0]`0]Y0]R0]K0]D0]=0]60]/0](0]!0]0]0] 0]0]þ/]÷/]ð/]é/]â/]Û/]Ô/]Í/]Æ/]¿/]¸/]±/]ª/]£/]œ/]•/]Ž/]‡/]€/]y/]r/]k/]d/]]/]V/]O/]H/]A/]:/]3/],/]%/]/]/]/] /]/]û.]ô.]í.]æ.]ß.]Ø.]Ñ.]Ê.]Ã.]¼.]µ.]®.]§.] .]™.]’.]‹.]„.]}.]v.]o.]h.]a.]Z.]S.]L.]E.]>.]7.]0.]).]".].].] .].]ÿ-]ø-]ñ-]ê-]ã-]Ü-]Õ-]Î-]Ç-]À-]¹-]²-]«-]¤-]-]–-]-]ˆ-]-]z-]s-]l-]e-]^-]W-]P-]I-]B-];-]4-]--]&-]-]-]-] -]-]ü,]õ,]î,]ç,]à,]Ù,]Ò,]Ë,]Ä,]½,]¶,]¯,]¨,]¡,]š,]“,]Œ,]…,]~,]w,]p,]i,]b,][,]T,]M,]F,]?,]8,]1,]*,]#,],],],],],]ù+]ò+]ë+]ä+]Ý+]Ö+]Ï+]È+]Á+]º+]³+]¬+]¥+]ž+]—+]+]‰+]‚+]{+]t+]m+]f+]_+]X+]Q+]J+]C+]<+]5+].+]'+] +]+]+] +]+]ý*]ö*]ï*]è*]á*]Ú*]Ó*]Ì*]Å*]¾*]·*]°*]©*]¢*]›*]”*]*]†*]*]x*]q*]j*]c*]\*]U*]N*]G*]@*]9*]2*]+*]$*]*]*]*]*]*]ú)]ó)]ì)]å)]Þ)]×)]Ð)]É)]Â)]»)]´)]­)]¦)]Ÿ)]˜)]‘)]Š)]ƒ)]|)]u)]n)]g)]`)]Y)]R)]K)]D)]=)]6)]/)]()]!)])])] )])]þ(]÷(]ð(]é(]â(]Û(]Ô(]Í(]Æ(]¿(]¸(]±(]ª(]£(]œ(]•(]Ž(]‡(]€(]y(]r(]k(]d(]](]V(]O(]H(]A(]:(]3(],(]%(](](](] (](]û']ô']í']æ']ß']Ø']Ñ']Ê']Ã']¼']µ']®']§'] ']™']’']‹']„']}']v']o']h']a']Z']S']L']E']>']7']0'])']"']']'] ']']ÿ&]ø&]ñ&]ê&]ã&]Ü&]Õ&]Î&]Ç&]À&]¹&]²&]«&]¤&]&]–&]&]ˆ&]&]z&]s&]l&]e&]^&]W&]P&]I&]B&];&]4&]-&]&&]&]&]&] &]&]ü%]õ%]î%]ç%]à%]Ù%]Ò%]Ë%]Ä%]½%]¶%]¯%]¨%]¡%]š%]“%]Œ%]…%]~%]w%]p%]i%]b%][%]T%]M%]F%]?%]8%]1%]*%]#%]%]%]%]%]%]ù$]ò$]ë$]ä$]Ý$]Ö$]Ï$]È$]Á$]º$]³$]¬$]¥$]ž$]—$]$]‰$]‚$]{$]t$]m$]f$]_$]X$]Q$]J$]C$]<$]5$].$]'$] $]$]$] $]$]ý#]ö#]ï#]è#]á#]Ú#]Ó#]Ì#]Å#]¾#]·#]°#]©#]¢#]›#]”#]#]†#]#]x#]q#]j#]c#]\#]U#]N#]G#]@#]9#]2#]+#]$#]#]#]#]#]#]ú"]ó"]ì"]å"]Þ"]×"]Ð"]É"]Â"]»"]´"]­"]¦"]Ÿ"]˜"]‘"]Š"]ƒ"]|"]u"]n"]g"]`"]Y"]R"]K"]D"]="]6"]/"]("]!"]"]"] "]"]þ!]÷!]ð!]é!]â!]Û!]Ô!]Í!]Æ!]¿!]¸!]±!]ª!]£!]œ!]•!]Ž!]‡!]€!]y!]r!]k!]d!]]!]V!]O!]H!]A!]:!]3!],!]%!]!]!]!] !]!]û ]ô ]í ]æ ]ß ]Ø ]Ñ ]Ê ]à ]¼ ]µ ]® ]§ ]  ]™ ]’ ]‹ ]„ ]} ]v ]o ]h ]a ]Z ]S ]L ]E ]> ]7 ]0 ]) ]" ] ] ] ] ]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û]ô]í]æ]ß]Ø]Ñ]Ê]Ã]¼]µ]®]§] ]™]’]‹]„]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û]ô]í]æ]ß]Ø]Ñ]Ê]Ã]¼]µ]®]§] ]™]’]‹]„]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú ]ó ]ì ]å ]Þ ]× ]Ð ]É ] ]» ]´ ]­ ]¦ ]Ÿ ]˜ ]‘ ]Š ]ƒ ]| ]u ]n ]g ]` ]Y ]R ]K ]D ]= ]6 ]/ ]( ]! ] ] ] ] ]þ ]÷ ]ð ]é ]â ]Û ]Ô ]Í ]Æ ]¿ ]¸ ]± ]ª ]£ ]œ ]• ]Ž ]‡ ]€ ]y ]r ]k ]d ]] ]V ]O ]H ]A ]: ]3 ], ]% ] ] ] ] ] ]û ]ô ]í ]æ ]ß ]Ø ]Ñ ]Ê ]à ]¼ ]µ ]® ]§ ]  ]™ ]’ ]‹ ]„ ]} ]v ]o ]h ]a ]Z ]S ]L ]E ]> ]7 ]0 ]) ]" ] ] ] ] ]ÿ ]ø ]ñ ]ê ]ã ]Ü ]Õ ]Î ]Ç ]À ]¹ ]² ]« ]¤ ] ]– ] ]ˆ ] ]z ]s ]l ]e ]^ ]W ]P ]I ]B ]; ]4 ]- ]& ] ] ] ] ] ]ü ]õ ]î ]ç ]à ]Ù ]Ò ]Ë ]Ä ]½ ]¶ ]¯ ]¨ ]¡ ]š ]“ ]Œ ]… ]~ ]w ]p ]i ]b ][ ]T ]M ]F ]? ]8 ]1 ]* ]# ] ] ] ] ] ]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û]ô]í]æ]ß]Ø]Ñ]Ê]Ã]¼]µ]®]§] ]™]’]‹]„]}]v]o]h]a]Z]S]L]E]>]7]0])]"]]] ]]ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]úÿ\óÿ\ìÿ\åÿ\Þÿ\×ÿ\Ðÿ\Éÿ\Âÿ\»ÿ\´ÿ\­ÿ\¦ÿ\Ÿÿ\˜ÿ\‘ÿ\Šÿ\ƒÿ\|ÿ\uÿ\nÿ\gÿ\`ÿ\Yÿ\Rÿ\Kÿ\Dÿ\=ÿ\6ÿ\/ÿ\(ÿ\!ÿ\ÿ\ÿ\ ÿ\ÿ\þþ\÷þ\ðþ\éþ\âþ\Ûþ\Ôþ\Íþ\Æþ\¿þ\¸þ\±þ\ªþ\£þ\œþ\•þ\Žþ\‡þ\€þ\yþ\rþ\kþ\dþ\]þ\Vþ\Oþ\Hþ\Aþ\:þ\3þ\,þ\%þ\þ\þ\þ\ þ\þ\ûý\ôý\íý\æý\ßý\Øý\Ñý\Êý\Ãý\¼ý\µý\®ý\§ý\ ý\™ý\’ý\‹ý\„ý\}ý\vý\oý\hý\aý\Zý\Sý\Lý\Eý\>ý\7ý\0ý\)ý\"ý\ý\ý\ ý\ý\ÿü\øü\ñü\êü\ãü\Üü\Õü\Îü\Çü\Àü\¹ü\²ü\«ü\¤ü\ü\–ü\ü\ˆü\ü\zü\sü\lü\eü\^ü\Wü\Pü\Iü\Bü\;ü\4ü\-ü\&ü\ü\ü\ü\ ü\ü\üû\õû\îû\çû\àû\Ùû\Òû\Ëû\Äû\½û\¶û\¯û\¨û\¡û\šû\“û\Œû\…û\~û\wû\pû\iû\bû\[û\Tû\Mû\Fû\?û\8û\1û\*û\#û\û\û\û\û\û\ùú\òú\ëú\äú\Ýú\Öú\Ïú\Èú\Áú\ºú\³ú\¬ú\¥ú\žú\—ú\ú\‰ú\‚ú\{ú\tú\mú\fú\_ú\Xú\Qú\Jú\Cú\<ú\5ú\.ú\'ú\ ú\ú\ú\ ú\ú\ýù\öù\ïù\èù\áù\Úù\Óù\Ìù\Åù\¾ù\·ù\°ù\©ù\¢ù\›ù\”ù\ù\†ù\ù\xù\qù\jù\cù\\ù\Uù\Nù\Gù\@ù\9ù\2ù\+ù\$ù\ù\ù\ù\ù\ù\úø\óø\ìø\åø\Þø\×ø\Ðø\Éø\Âø\»ø\´ø\­ø\¦ø\Ÿø\˜ø\‘ø\Šø\ƒø\|ø\uø\nø\gø\`ø\Yø\Rø\Kø\Dø\=ø\6ø\/ø\(ø\!ø\ø\ø\ ø\ø\þ÷\÷÷\ð÷\é÷\â÷\Û÷\Ô÷\Í÷\Æ÷\¿÷\¸÷\±÷\ª÷\£÷\œ÷\•÷\Ž÷\‡÷\€÷\y÷\r÷\k÷\d÷\]÷\V÷\O÷\H÷\A÷\:÷\3÷\,÷\%÷\÷\÷\÷\ ÷\÷\ûö\ôö\íö\æö\ßö\Øö\Ñö\Êö\Ãö\¼ö\µö\®ö\§ö\ ö\™ö\’ö\‹ö\„ö\}ö\vö\oö\hö\aö\Zö\Sö\Lö\Eö\>ö\7ö\0ö\)ö\"ö\ö\ö\ ö\ö\ÿõ\øõ\ñõ\êõ\ãõ\Üõ\Õõ\Îõ\Çõ\Àõ\¹õ\²õ\«õ\¤õ\õ\–õ\õ\ˆõ\õ\zõ\sõ\lõ\eõ\^õ\Wõ\Põ\Iõ\Bõ\;õ\4õ\-õ\&õ\õ\õ\õ\ õ\õ\üô\õô\îô\çô\àô\Ùô\Òô\Ëô\Äô\½ô\¶ô\¯ô\¨ô\¡ô\šô\“ô\Œô\…ô\~ô\wô\pô\iô\bô\[ô\Tô\Mô\Fô\?ô\8ô\1ô\*ô\#ô\ô\ô\ô\ô\ô\ùó\òó\ëó\äó\Ýó\Öó\Ïó\Èó\Áó\ºó\³ó\¬ó\¥ó\žó\—ó\ó\‰ó\‚ó\{ó\tó\mó\fó\_ó\Xó\Qó\Jó\Có\<ó\5ó\.ó\'ó\ ó\ó\ó\ ó\ó\ýò\öò\ïò\èò\áò\Úò\Óò\Ìò\Åò\¾ò\·ò\°ò\©ò\¢ò\›ò\”ò\ò\†ò\ò\xò\qò\jò\cò\\ò\Uò\Nò\Gò\@ò\9ò\2ò\+ò\$ò\ò\ò\ò\ò\ò\úñ\óñ\ìñ\åñ\Þñ\×ñ\Ðñ\Éñ\Âñ\»ñ\´ñ\­ñ\¦ñ\Ÿñ\˜ñ\‘ñ\Šñ\ƒñ\|ñ\uñ\nñ\gñ\`ñ\Yñ\Rñ\Kñ\Dñ\=ñ\6ñ\/ñ\(ñ\!ñ\ñ\ñ\ ñ\ñ\þð\÷ð\ðð\éð\âð\Ûð\Ôð\Íð\Æð\¿ð\¸ð\±ð\ªð\£ð\œð\•ð\Žð\‡ð\€ð\yð\rð\kð\dð\]ð\Vð\Oð\Hð\Að\:ð\3ð\,ð\%ð\ð\ð\ð\ ð\ð\ûï\ôï\íï\æï\ßï\Øï\Ñï\Êï\Ãï\¼ï\µï\®ï\§ï\ ï\™ï\’ï\‹ï\„ï\}ï\vï\oï\hï\aï\Zï\Sï\Lï\Eï\>ï\7ï\0ï\)ï\"ï\ï\ï\ ï\ï\ÿî\øî\ñî\êî\ãî\Üî\Õî\Îî\Çî\Àî\¹î\²î\«î\¤î\î\–î\î\ˆî\î\zî\sî\lî\eî\^î\Wî\Pî\Iî\Bî\;î\4î\-î\&î\î\î\î\ î\î\üí\õí\îí\çí\àí\Ùí\Òí\Ëí\Äí\½í\¶í\¯í\¨í\¡í\ší\“í\Œí\…í\~í\wí\pí\ií\bí\[í\Tí\Mí\Fí\?í\8í\1í\*í\#í\í\í\í\í\í\ùì\òì\ëì\äì\Ýì\Öì\Ïì\Èì\Áì\ºì\³ì\¬ì\¥ì\žì\—ì\ì\‰ì\‚ì\{ì\tì\mì\fì\_ì\Xì\Qì\Jì\Cì\<ì\5ì\.ì\'ì\ ì\ì\ì\ ì\ì\ýë\öë\ïë\èë\áë\Úë\Óë\Ìë\Åë\¾ë\·ë\°ë\©ë\¢ë\›ë\”ë\ë\†ë\ë\xë\që\jë\cë\\ë\Uë\Në\Gë\@ë\9ë\2ë\+ë\$ë\ë\ë\ë\ë\ë\úê\óê\ìê\åê\Þê\×ê\Ðê\Éê\Âê\»ê\´ê\­ê\¦ê\Ÿê\˜ê\‘ê\Šê\ƒê\|ê\uê\nê\gê\`ê\Yê\Rê\Kê\Dê\=ê\6ê\/ê\(ê\!ê\ê\ê\ ê\ê\þé\÷é\ðé\éé\âé\Ûé\Ôé\Íé\Æé\¿é\¸é\±é\ªé\£é\œé\•é\Žé\‡é\€é\yé\ré\ké\dé\]é\Vé\Oé\Hé\Aé\:é\3é\,é\%é\é\é\é\ é\é\ûè\ôè\íè\æè\ßè\Øè\Ñè\Êè\Ãè\¼è\µè\®è\§è\ è\™è\’è\‹è\„è\}è\vè\oè\hè\aè\Zè\Sè\Lè\Eè\>è\7è\0è\)è\"è\è\è\ è\è\ÿç\øç\ñç\êç\ãç\Üç\Õç\Îç\Çç\Àç\¹ç\²ç\«ç\¤ç\ç\–ç\ç\ˆç\ç\zç\sç\lç\eç\^ç\Wç\Pç\Iç\Bç\;ç\4ç\-ç\&ç\ç\ç\ç\ ç\ç\üæ\õæ\îæ\çæ\àæ\Ùæ\Òæ\Ëæ\Äæ\½æ\¶æ\¯æ\¨æ\¡æ\šæ\“æ\Œæ\…æ\~æ\wæ\pæ\iæ\bæ\[æ\Tæ\Mæ\Fæ\?æ\8æ\1æ\*æ\#æ\æ\æ\æ\æ\æ\ùå\òå\ëå\äå\Ýå\Öå\Ïå\Èå\Áå\ºå\³å\¬å\¥å\žå\—å\å\‰å\‚å\{å\tå\må\få\_å\Xå\Qå\Jå\Cå\<å\5å\.å\'å\ å\å\å\ å\å\ýä\öä\ïä\èä\áä\Úä\Óä\Ìä\Åä\¾ä\·ä\°ä\©ä\¢ä\›ä\”ä\ä\†ä\ä\xä\qä\jä\cä\\ä\Uä\Nä\Gä\@ä\9ä\2ä\+ä\$ä\ä\ä\ä\ä\ä\úã\óã\ìã\åã\Þã\×ã\Ðã\Éã\Âã\»ã\´ã\­ã\¦ã\Ÿã\˜ã\‘ã\Šã\ƒã\|ã\uã\nã\gã\`ã\Yã\Rã\Kã\Dã\=ã\6ã\/ã\(ã\!ã\ã\ã\ ã\ã\þâ\÷â\ðâ\éâ\ââ\Ûâ\Ôâ\Íâ\Æâ\¿â\¸â\±â\ªâ\£â\œâ\•â\Žâ\‡â\€â\yâ\râ\kâ\dâ\]â\Vâ\Oâ\Hâ\Aâ\:â\3â\,â\%â\â\â\â\ â\â\ûá\ôá\íá\æá\ßá\Øá\Ñá\Êá\Ãá\¼á\µá\®á\§á\ á\™á\’á\‹á\„á\}á\vá\oá\há\aá\Zá\Sá\Lá\Eá\>á\7á\0á\)á\"á\á\á\ á\á\ÿà\øà\ñà\êà\ãà\Üà\Õà\Îà\Çà\Àà\¹à\²à\«à\¤à\à\–à\à\ˆà\à\zà\sà\là\eà\^à\Wà\Pà\Ià\Bà\;à\4à\-à\&à\à\à\à\ à\à\üß\õß\îß\çß\àß\Ùß\Òß\Ëß\Äß\½ß\¶ß\¯ß\¨ß\¡ß\šß\“ß\Œß\…ß\~ß\wß\pß\iß\bß\[ß\Tß\Mß\Fß\?ß\8ß\1ß\*ß\#ß\ß\ß\ß\ß\ß\ùÞ\òÞ\ëÞ\äÞ\ÝÞ\ÖÞ\ÏÞ\ÈÞ\ÁÞ\ºÞ\³Þ\¬Þ\¥Þ\žÞ\—Þ\Þ\‰Þ\‚Þ\{Þ\tÞ\mÞ\fÞ\_Þ\XÞ\QÞ\JÞ\CÞ\<Þ\5Þ\.Þ\'Þ\ Þ\Þ\Þ\ Þ\Þ\ýÝ\öÝ\ïÝ\èÝ\áÝ\ÚÝ\ÓÝ\ÌÝ\ÅÝ\¾Ý\·Ý\°Ý\©Ý\¢Ý\›Ý\”Ý\Ý\†Ý\Ý\xÝ\qÝ\jÝ\cÝ\\Ý\UÝ\NÝ\GÝ\@Ý\9Ý\2Ý\+Ý\$Ý\Ý\Ý\Ý\Ý\Ý\úÜ\óÜ\ìÜ\åÜ\ÞÜ\×Ü\ÐÜ\ÉÜ\ÂÜ\»Ü\´Ü\­Ü\¦Ü\ŸÜ\˜Ü\‘Ü\ŠÜ\ƒÜ\|Ü\uÜ\nÜ\gÜ\`Ü\YÜ\RÜ\KÜ\DÜ\=Ü\6Ü\/Ü\(Ü\!Ü\Ü\Ü\ Ü\Ü\þÛ\÷Û\ðÛ\éÛ\âÛ\ÛÛ\ÔÛ\ÍÛ\ÆÛ\¿Û\¸Û\±Û\ªÛ\£Û\œÛ\•Û\ŽÛ\‡Û\€Û\yÛ\rÛ\kÛ\dÛ\]Û\VÛ\OÛ\HÛ\AÛ\:Û\3Û\,Û\%Û\Û\Û\Û\ Û\Û\ûÚ\ôÚ\íÚ\æÚ\ßÚ\ØÚ\ÑÚ\ÊÚ\ÃÚ\¼Ú\µÚ\®Ú\§Ú\ Ú\™Ú\’Ú\‹Ú\„Ú\}Ú\vÚ\oÚ\hÚ\aÚ\ZÚ\SÚ\LÚ\EÚ\>Ú\7Ú\0Ú\)Ú\"Ú\Ú\Ú\ Ú\Ú\ÿÙ\øÙ\ñÙ\êÙ\ãÙ\ÜÙ\ÕÙ\ÎÙ\ÇÙ\ÀÙ\¹Ù\²Ù\«Ù\¤Ù\Ù\–Ù\Ù\ˆÙ\Ù\zÙ\sÙ\lÙ\eÙ\^Ù\WÙ\PÙ\IÙ\BÙ\;Ù\4Ù\-Ù\&Ù\Ù\Ù\Ù\ Ù\Ù\üØ\õØ\îØ\çØ\àØ\ÙØ\ÒØ\ËØ\ÄØ\½Ø\¶Ø\¯Ø\¨Ø\¡Ø\šØ\“Ø\ŒØ\…Ø\~Ø\wØ\pØ\iØ\bØ\[Ø\TØ\MØ\FØ\?Ø\8Ø\1Ø\*Ø\#Ø\Ø\Ø\Ø\Ø\Ø\ù×\ò×\ë×\ä×\Ý×\Ö×\Ï×\È×\Á×\º×\³×\¬×\¥×\ž×\—×\×\‰×\‚×\{×\t×\m×\f×\_×\X×\Q×\J×\C×\<×\5×\.×\'×\ ×\×\×\ ×\×\ýÖ\öÖ\ïÖ\èÖ\áÖ\ÚÖ\ÓÖ\ÌÖ\ÅÖ\¾Ö\·Ö\°Ö\©Ö\¢Ö\›Ö\”Ö\Ö\†Ö\Ö\xÖ\qÖ\jÖ\cÖ\\Ö\UÖ\NÖ\GÖ\@Ö\9Ö\2Ö\+Ö\$Ö\Ö\Ö\Ö\Ö\Ö\úÕ\óÕ\ìÕ\åÕ\ÞÕ\×Õ\ÐÕ\ÉÕ\ÂÕ\»Õ\´Õ\­Õ\¦Õ\ŸÕ\˜Õ\‘Õ\ŠÕ\ƒÕ\|Õ\uÕ\nÕ\gÕ\`Õ\YÕ\RÕ\KÕ\DÕ\=Õ\6Õ\/Õ\(Õ\!Õ\Õ\Õ\ Õ\Õ\þÔ\÷Ô\ðÔ\éÔ\âÔ\ÛÔ\ÔÔ\ÍÔ\ÆÔ\¿Ô\¸Ô\±Ô\ªÔ\£Ô\œÔ\•Ô\ŽÔ\‡Ô\€Ô\yÔ\rÔ\kÔ\dÔ\]Ô\VÔ\OÔ\HÔ\AÔ\:Ô\3Ô\,Ô\%Ô\Ô\Ô\Ô\ Ô\Ô\ûÓ\ôÓ\íÓ\æÓ\ßÓ\ØÓ\ÑÓ\ÊÓ\ÃÓ\¼Ó\µÓ\®Ó\§Ó\ Ó\™Ó\’Ó\‹Ó\„Ó\}Ó\vÓ\oÓ\hÓ\aÓ\ZÓ\SÓ\LÓ\EÓ\>Ó\7Ó\0Ó\)Ó\"Ó\Ó\Ó\ Ó\Ó\ÿÒ\øÒ\ñÒ\êÒ\ãÒ\ÜÒ\ÕÒ\ÎÒ\ÇÒ\ÀÒ\¹Ò\²Ò\«Ò\¤Ò\Ò\–Ò\Ò\ˆÒ\Ò\zÒ\sÒ\lÒ\eÒ\^Ò\WÒ\PÒ\IÒ\BÒ\;Ò\4Ò\-Ò\&Ò\Ò\Ò\Ò\ Ò\Ò\üÑ\õÑ\îÑ\çÑ\àÑ\ÙÑ\ÒÑ\ËÑ\ÄÑ\½Ñ\¶Ñ\¯Ñ\¨Ñ\¡Ñ\šÑ\“Ñ\ŒÑ\…Ñ\~Ñ\wÑ\pÑ\iÑ\bÑ\[Ñ\TÑ\MÑ\FÑ\?Ñ\8Ñ\1Ñ\*Ñ\#Ñ\Ñ\Ñ\Ñ\Ñ\Ñ\ùÐ\òÐ\ëÐ\äÐ\ÝÐ\ÖÐ\ÏÐ\ÈÐ\ÁÐ\ºÐ\³Ð\¬Ð\¥Ð\žÐ\—Ð\Ð\‰Ð\‚Ð\{Ð\tÐ\mÐ\fÐ\_Ð\XÐ\QÐ\JÐ\CÐ\<Ð\5Ð\.Ð\'Ð\ Ð\Ð\Ð\ Ð\Ð\ýÏ\öÏ\ïÏ\èÏ\áÏ\ÚÏ\ÓÏ\ÌÏ\ÅÏ\¾Ï\·Ï\°Ï\©Ï\¢Ï\›Ï\”Ï\Ï\†Ï\Ï\xÏ\qÏ\jÏ\cÏ\\Ï\UÏ\NÏ\GÏ\@Ï\9Ï\2Ï\+Ï\$Ï\Ï\Ï\Ï\Ï\Ï\úÎ\óÎ\ìÎ\åÎ\ÞÎ\×Î\ÐÎ\ÉÎ\ÂÎ\»Î\´Î\­Î\¦Î\ŸÎ\˜Î\‘Î\ŠÎ\ƒÎ\|Î\uÎ\nÎ\gÎ\`Î\YÎ\RÎ\KÎ\DÎ\=Î\6Î\/Î\(Î\!Î\Î\Î\ Î\Î\þÍ\÷Í\ðÍ\éÍ\âÍ\ÛÍ\ÔÍ\ÍÍ\ÆÍ\¿Í\¸Í\±Í\ªÍ\£Í\œÍ\•Í\ŽÍ\‡Í\€Í\yÍ\rÍ\kÍ\dÍ\]Í\VÍ\OÍ\HÍ\AÍ\:Í\3Í\,Í\%Í\Í\Í\Í\ Í\Í\ûÌ\ôÌ\íÌ\æÌ\ßÌ\ØÌ\ÑÌ\ÊÌ\ÃÌ\¼Ì\µÌ\®Ì\§Ì\ Ì\™Ì\’Ì\‹Ì\„Ì\}Ì\vÌ\oÌ\hÌ\aÌ\ZÌ\SÌ\LÌ\EÌ\>Ì\7Ì\0Ì\)Ì\"Ì\Ì\Ì\ Ì\Ì\ÿË\øË\ñË\êË\ãË\ÜË\ÕË\ÎË\ÇË\ÀË\¹Ë\²Ë\«Ë\¤Ë\Ë\–Ë\Ë\ˆË\Ë\zË\sË\lË\eË\^Ë\WË\PË\IË\BË\;Ë\4Ë\-Ë\&Ë\Ë\Ë\Ë\ Ë\Ë\üÊ\õÊ\îÊ\çÊ\àÊ\ÙÊ\ÒÊ\ËÊ\ÄÊ\½Ê\¶Ê\¯Ê\¨Ê\¡Ê\šÊ\“Ê\ŒÊ\…Ê\~Ê\wÊ\pÊ\iÊ\bÊ\[Ê\TÊ\MÊ\FÊ\?Ê\8Ê\1Ê\*Ê\#Ê\Ê\Ê\Ê\Ê\Ê\ùÉ\òÉ\ëÉ\äÉ\ÝÉ\ÖÉ\ÏÉ\ÈÉ\ÁÉ\ºÉ\³É\¬É\¥É\žÉ\—É\É\‰É\‚É\{É\tÉ\mÉ\fÉ\_É\XÉ\QÉ\JÉ\CÉ\<É\5É\.É\'É\ É\É\É\ É\É\ýÈ\öÈ\ïÈ\èÈ\áÈ\ÚÈ\ÓÈ\ÌÈ\ÅÈ\¾È\·È\°È\©È\¢È\›È\”È\È\†È\È\xÈ\qÈ\jÈ\cÈ\\È\UÈ\NÈ\GÈ\@È\9È\2È\+È\$È\È\È\È\È\È\úÇ\óÇ\ìÇ\åÇ\ÞÇ\×Ç\ÐÇ\ÉÇ\ÂÇ\»Ç\´Ç\­Ç\¦Ç\ŸÇ\˜Ç\‘Ç\ŠÇ\ƒÇ\|Ç\uÇ\nÇ\gÇ\`Ç\YÇ\RÇ\KÇ\DÇ\=Ç\6Ç\/Ç\(Ç\!Ç\Ç\Ç\ Ç\Ç\þÆ\÷Æ\ðÆ\éÆ\âÆ\ÛÆ\ÔÆ\ÍÆ\ÆÆ\¿Æ\¸Æ\±Æ\ªÆ\£Æ\œÆ\•Æ\ŽÆ\‡Æ\€Æ\yÆ\rÆ\kÆ\dÆ\]Æ\VÆ\OÆ\HÆ\AÆ\:Æ\3Æ\,Æ\%Æ\Æ\Æ\Æ\ Æ\Æ\ûÅ\ôÅ\íÅ\æÅ\ßÅ\ØÅ\ÑÅ\ÊÅ\ÃÅ\¼Å\µÅ\®Å\§Å\ Å\™Å\’Å\‹Å\„Å\}Å\vÅ\oÅ\hÅ\aÅ\ZÅ\SÅ\LÅ\EÅ\>Å\7Å\0Å\)Å\"Å\Å\Å\ Å\Å\ÿÄ\øÄ\ñÄ\êÄ\ãÄ\ÜÄ\ÕÄ\ÎÄ\ÇÄ\ÀÄ\¹Ä\²Ä\«Ä\¤Ä\Ä\–Ä\Ä\ˆÄ\Ä\zÄ\sÄ\lÄ\eÄ\^Ä\WÄ\PÄ\IÄ\BÄ\;Ä\4Ä\-Ä\&Ä\Ä\Ä\Ä\ Ä\Ä\üÃ\õÃ\îÃ\çÃ\àÃ\ÙÃ\ÒÃ\ËÃ\ÄÃ\½Ã\¶Ã\¯Ã\¨Ã\¡Ã\šÃ\“Ã\ŒÃ\…Ã\~Ã\wÃ\pÃ\iÃ\bÃ\[Ã\TÃ\MÃ\FÃ\?Ã\8Ã\1Ã\*Ã\#Ã\Ã\Ã\Ã\Ã\Ã\ùÂ\òÂ\ëÂ\äÂ\ÝÂ\ÖÂ\ÏÂ\ÈÂ\ÁÂ\ºÂ\³Â\¬Â\¥Â\žÂ\—Â\Â\‰Â\‚Â\{Â\tÂ\mÂ\fÂ\_Â\XÂ\QÂ\JÂ\CÂ\<Â\5Â\.Â\'Â\ Â\Â\Â\ Â\Â\ýÁ\öÁ\ïÁ\èÁ\áÁ\ÚÁ\ÓÁ\ÌÁ\ÅÁ\¾Á\·Á\°Á\©Á\¢Á\›Á\”Á\Á\†Á\Á\xÁ\qÁ\jÁ\cÁ\\Á\UÁ\NÁ\GÁ\@Á\9Á\2Á\+Á\$Á\Á\Á\Á\Á\Á\úÀ\óÀ\ìÀ\åÀ\ÞÀ\×À\ÐÀ\ÉÀ\ÂÀ\»À\´À\­À\¦À\ŸÀ\˜À\‘À\ŠÀ\ƒÀ\|À\uÀ\nÀ\gÀ\`À\YÀ\RÀ\KÀ\DÀ\=À\6À\/À\(À\!À\À\À\ À\À\þ¿\÷¿\ð¿\é¿\â¿\Û¿\Ô¿\Í¿\Æ¿\¿¿\¸¿\±¿\ª¿\£¿\œ¿\•¿\Ž¿\‡¿\€¿\y¿\r¿\k¿\d¿\]¿\V¿\O¿\H¿\A¿\:¿\3¿\,¿\%¿\¿\¿\¿\ ¿\¿\û¾\ô¾\í¾\æ¾\ß¾\ؾ\Ѿ\ʾ\þ\¼¾\µ¾\®¾\§¾\ ¾\™¾\’¾\‹¾\„¾\}¾\v¾\o¾\h¾\a¾\Z¾\S¾\L¾\E¾\>¾\7¾\0¾\)¾\"¾\¾\¾\ ¾\¾\ÿ½\ø½\ñ½\ê½\ã½\ܽ\Õ½\ν\ǽ\À½\¹½\²½\«½\¤½\½\–½\½\ˆ½\½\z½\s½\l½\e½\^½\W½\P½\I½\B½\;½\4½\-½\&½\½\½\½\ ½\½\ü¼\õ¼\î¼\ç¼\à¼\Ù¼\Ò¼\˼\ļ\½¼\¶¼\¯¼\¨¼\¡¼\š¼\“¼\Œ¼\…¼\~¼\w¼\p¼\i¼\b¼\[¼\T¼\M¼\F¼\?¼\8¼\1¼\*¼\#¼\¼\¼\¼\¼\¼\ù»\ò»\ë»\ä»\Ý»\Ö»\Ï»\È»\Á»\º»\³»\¬»\¥»\ž»\—»\»\‰»\‚»\{»\t»\m»\f»\_»\X»\Q»\J»\C»\<»\5»\.»\'»\ »\»\»\ »\»\ýº\öº\ïº\èº\áº\Úº\Óº\̺\ź\¾º\·º\°º\©º\¢º\›º\”º\º\†º\º\xº\qº\jº\cº\\º\Uº\Nº\Gº\@º\9º\2º\+º\$º\º\º\º\º\º\ú¹\ó¹\ì¹\å¹\Þ¹\×¹\й\ɹ\¹\»¹\´¹\­¹\¦¹\Ÿ¹\˜¹\‘¹\й\ƒ¹\|¹\u¹\n¹\g¹\`¹\Y¹\R¹\K¹\D¹\=¹\6¹\/¹\(¹\!¹\¹\¹\ ¹\¹\þ¸\÷¸\ð¸\é¸\â¸\Û¸\Ô¸\͸\Ƹ\¿¸\¸¸\±¸\ª¸\£¸\œ¸\•¸\ޏ\‡¸\€¸\y¸\r¸\k¸\d¸\]¸\V¸\O¸\H¸\A¸\:¸\3¸\,¸\%¸\¸\¸\¸\ ¸\¸\û·\ô·\í·\æ·\ß·\Ø·\Ñ·\Ê·\÷\¼·\µ·\®·\§·\ ·\™·\’·\‹·\„·\}·\v·\o·\h·\a·\Z·\S·\L·\E·\>·\7·\0·\)·\"·\·\·\ ·\·\ÿ¶\ø¶\ñ¶\ê¶\ã¶\ܶ\Õ¶\ζ\Ƕ\À¶\¹¶\²¶\«¶\¤¶\¶\–¶\¶\ˆ¶\¶\z¶\s¶\l¶\e¶\^¶\W¶\P¶\I¶\B¶\;¶\4¶\-¶\&¶\¶\¶\¶\ ¶\¶\üµ\õµ\îµ\çµ\àµ\Ùµ\Òµ\˵\ĵ\½µ\¶µ\¯µ\¨µ\¡µ\šµ\“µ\Œµ\…µ\~µ\wµ\pµ\iµ\bµ\[µ\Tµ\Mµ\Fµ\?µ\8µ\1µ\*µ\#µ\µ\µ\µ\µ\µ\ù´\ò´\ë´\ä´\Ý´\Ö´\Ï´\È´\Á´\º´\³´\¬´\¥´\ž´\—´\´\‰´\‚´\{´\t´\m´\f´\_´\X´\Q´\J´\C´\<´\5´\.´\'´\ ´\´\´\ ´\´\ý³\ö³\ï³\è³\á³\Ú³\Ó³\̳\ų\¾³\·³\°³\©³\¢³\›³\”³\³\†³\³\x³\q³\j³\c³\\³\U³\N³\G³\@³\9³\2³\+³\$³\³\³\³\³\³\ú²\ó²\ì²\å²\Þ²\ײ\в\ɲ\²\»²\´²\­²\¦²\Ÿ²\˜²\‘²\в\ƒ²\|²\u²\n²\g²\`²\Y²\R²\K²\D²\=²\6²\/²\(²\!²\²\²\ ²\²\þ±\÷±\ð±\é±\â±\Û±\Ô±\ͱ\Ʊ\¿±\¸±\±±\ª±\£±\œ±\•±\ޱ\‡±\€±\y±\r±\k±\d±\]±\V±\O±\H±\A±\:±\3±\,±\%±\±\±\±\ ±\±\û°\ô°\í°\æ°\ß°\ذ\Ѱ\ʰ\ð\¼°\µ°\®°\§°\ °\™°\’°\‹°\„°\}°\v°\o°\h°\a°\Z°\S°\L°\E°\>°\7°\0°\)°\"°\°\°\ °\°\ÿ¯\ø¯\ñ¯\ê¯\ã¯\ܯ\Õ¯\ί\ǯ\À¯\¹¯\²¯\«¯\¤¯\¯\–¯\¯\ˆ¯\¯\z¯\s¯\l¯\e¯\^¯\W¯\P¯\I¯\B¯\;¯\4¯\-¯\&¯\¯\¯\¯\ ¯\¯\ü®\õ®\î®\ç®\à®\Ù®\Ò®\Ë®\Ä®\½®\¶®\¯®\¨®\¡®\š®\“®\Œ®\…®\~®\w®\p®\i®\b®\[®\T®\M®\F®\?®\8®\1®\*®\#®\®\®\®\®\®\ù­\ò­\ë­\ä­\Ý­\Ö­\Ï­\È­\Á­\º­\³­\¬­\¥­\ž­\—­\­\‰­\‚­\{­\t­\m­\f­\_­\X­\Q­\J­\C­\<­\5­\.­\'­\ ­\­\­\ ­\­\ý¬\ö¬\ï¬\è¬\á¬\Ú¬\Ó¬\̬\Ŭ\¾¬\·¬\°¬\©¬\¢¬\›¬\”¬\¬\†¬\¬\x¬\q¬\j¬\c¬\\¬\U¬\N¬\G¬\@¬\9¬\2¬\+¬\$¬\¬\¬\¬\¬\¬\ú«\ó«\ì«\å«\Þ«\׫\Ы\É«\«\»«\´«\­«\¦«\Ÿ«\˜«\‘«\Š«\ƒ«\|«\u«\n«\g«\`«\Y«\R«\K«\D«\=«\6«\/«\(«\!«\«\«\ «\«\þª\÷ª\ðª\éª\âª\Ûª\Ôª\ͪ\ƪ\¿ª\¸ª\±ª\ªª\£ª\œª\•ª\Žª\‡ª\€ª\yª\rª\kª\dª\]ª\Vª\Oª\Hª\Aª\:ª\3ª\,ª\%ª\ª\ª\ª\ ª\ª\û©\ô©\í©\æ©\ß©\Ø©\Ñ©\Ê©\é\¼©\µ©\®©\§©\ ©\™©\’©\‹©\„©\}©\v©\o©\h©\a©\Z©\S©\L©\E©\>©\7©\0©\)©\"©\©\©\ ©\©\ÿ¨\ø¨\ñ¨\ê¨\ã¨\ܨ\Õ¨\Ψ\Ǩ\À¨\¹¨\²¨\«¨\¤¨\¨\–¨\¨\ˆ¨\¨\z¨\s¨\l¨\e¨\^¨\W¨\P¨\I¨\B¨\;¨\4¨\-¨\&¨\¨\¨\¨\ ¨\¨\ü§\õ§\î§\ç§\à§\Ù§\Ò§\˧\ħ\½§\¶§\¯§\¨§\¡§\š§\“§\Œ§\…§\~§\w§\p§\i§\b§\[§\T§\M§\F§\?§\8§\1§\*§\#§\§\§\§\§\§\ù¦\ò¦\ë¦\ä¦\ݦ\Ö¦\Ϧ\Ȧ\Á¦\º¦\³¦\¬¦\¥¦\ž¦\—¦\¦\‰¦\‚¦\{¦\t¦\m¦\f¦\_¦\X¦\Q¦\J¦\C¦\<¦\5¦\.¦\'¦\ ¦\¦\¦\ ¦\¦\ý¥\ö¥\ï¥\è¥\á¥\Ú¥\Ó¥\Ì¥\Å¥\¾¥\·¥\°¥\©¥\¢¥\›¥\”¥\¥\†¥\¥\x¥\q¥\j¥\c¥\\¥\U¥\N¥\G¥\@¥\9¥\2¥\+¥\$¥\¥\¥\¥\¥\¥\ú¤\ó¤\ì¤\å¤\Þ¤\פ\Ф\ɤ\¤\»¤\´¤\­¤\¦¤\Ÿ¤\˜¤\‘¤\Ф\ƒ¤\|¤\u¤\n¤\g¤\`¤\Y¤\R¤\K¤\D¤\=¤\6¤\/¤\(¤\!¤\¤\¤\ ¤\¤\þ£\÷£\ð£\é£\â£\Û£\Ô£\Í£\Æ£\¿£\¸£\±£\ª£\££\œ£\•£\Ž£\‡£\€£\y£\r£\k£\d£\]£\V£\O£\H£\A£\:£\3£\,£\%£\£\£\£\ £\£\û¢\ô¢\í¢\æ¢\ߢ\Ø¢\Ñ¢\Ê¢\â\¼¢\µ¢\®¢\§¢\ ¢\™¢\’¢\‹¢\„¢\}¢\v¢\o¢\h¢\a¢\Z¢\S¢\L¢\E¢\>¢\7¢\0¢\)¢\"¢\¢\¢\ ¢\¢\ÿ¡\ø¡\ñ¡\ê¡\ã¡\Ü¡\Õ¡\Ρ\Ç¡\À¡\¹¡\²¡\«¡\¤¡\¡\–¡\¡\ˆ¡\¡\z¡\s¡\l¡\e¡\^¡\W¡\P¡\I¡\B¡\;¡\4¡\-¡\&¡\¡\¡\¡\ ¡\¡\ü \õ \î \ç \à \Ù \Ò \Ë \Ä \½ \¶ \¯ \¨ \¡ \š \“ \Œ \… \~ \w \p \i \b \[ \T \M \F \? \8 \1 \* \# \ \ \ \ \ \ùŸ\òŸ\ëŸ\äŸ\ÝŸ\ÖŸ\ÏŸ\ÈŸ\ÁŸ\ºŸ\³Ÿ\¬Ÿ\¥Ÿ\žŸ\—Ÿ\Ÿ\‰Ÿ\‚Ÿ\{Ÿ\tŸ\mŸ\fŸ\_Ÿ\XŸ\QŸ\JŸ\CŸ\<Ÿ\5Ÿ\.Ÿ\'Ÿ\ Ÿ\Ÿ\Ÿ\ Ÿ\Ÿ\ýž\öž\ïž\èž\áž\Úž\Óž\Ìž\Åž\¾ž\·ž\°ž\©ž\¢ž\›ž\”ž\ž\†ž\ž\xž\qž\jž\cž\\ž\Už\Nž\Gž\@ž\9ž\2ž\+ž\$ž\ž\ž\ž\ž\ž\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þœ\÷œ\ðœ\éœ\âœ\Ûœ\Ôœ\Íœ\Æœ\¿œ\¸œ\±œ\ªœ\£œ\œœ\•œ\Žœ\‡œ\€œ\yœ\rœ\kœ\dœ\]œ\Vœ\Oœ\Hœ\Aœ\:œ\3œ\,œ\%œ\œ\œ\œ\ œ\œ\û›\ô›\í›\æ›\ß›\Ø›\Ñ›\Ê›\Û\¼›\µ›\®›\§›\ ›\™›\’›\‹›\„›\}›\v›\o›\h›\a›\Z›\S›\L›\E›\>›\7›\0›\)›\"›\›\›\ ›\›\ÿš\øš\ñš\êš\ãš\Üš\Õš\Κ\Çš\Àš\¹š\²š\«š\¤š\š\–š\š\ˆš\š\zš\sš\lš\eš\^š\Wš\Pš\Iš\Bš\;š\4š\-š\&š\š\š\š\ š\š\ü™\õ™\î™\ç™\à™\Ù™\Ò™\Ë™\Ä™\½™\¶™\¯™\¨™\¡™\š™\“™\Œ™\…™\~™\w™\p™\i™\b™\[™\T™\M™\F™\?™\8™\1™\*™\#™\™\™\™\™\™\ù˜\ò˜\ë˜\ä˜\ݘ\Ö˜\Ϙ\Ș\Á˜\º˜\³˜\¬˜\¥˜\ž˜\—˜\˜\‰˜\‚˜\{˜\t˜\m˜\f˜\_˜\X˜\Q˜\J˜\C˜\<˜\5˜\.˜\'˜\ ˜\˜\˜\ ˜\˜\ý—\ö—\ï—\è—\á—\Ú—\Ó—\Ì—\Å—\¾—\·—\°—\©—\¢—\›—\”—\—\†—\—\x—\q—\j—\c—\\—\U—\N—\G—\@—\9—\2—\+—\$—\—\—\—\—\—\ú–\ó–\ì–\å–\Þ–\×–\Ж\É–\–\»–\´–\­–\¦–\Ÿ–\˜–\‘–\Š–\ƒ–\|–\u–\n–\g–\`–\Y–\R–\K–\D–\=–\6–\/–\(–\!–\–\–\ –\–\þ•\÷•\ð•\é•\â•\Û•\Ô•\Í•\Æ•\¿•\¸•\±•\ª•\£•\œ•\••\Ž•\‡•\€•\y•\r•\k•\d•\]•\V•\O•\H•\A•\:•\3•\,•\%•\•\•\•\ •\•\û”\ô”\í”\æ”\ß”\Ø”\Ñ”\Ê”\Ô\¼”\µ”\®”\§”\ ”\™”\’”\‹”\„”\}”\v”\o”\h”\a”\Z”\S”\L”\E”\>”\7”\0”\)”\"”\”\”\ ”\”\ÿ“\ø“\ñ“\ê“\ã“\Ü“\Õ“\Γ\Ç“\À“\¹“\²“\«“\¤“\“\–“\“\ˆ“\“\z“\s“\l“\e“\^“\W“\P“\I“\B“\;“\4“\-“\&“\“\“\“\ “\“\ü’\õ’\î’\ç’\à’\Ù’\Ò’\Ë’\Ä’\½’\¶’\¯’\¨’\¡’\š’\“’\Œ’\…’\~’\w’\p’\i’\b’\[’\T’\M’\F’\?’\8’\1’\*’\#’\’\’\’\’\’\ù‘\ò‘\ë‘\ä‘\Ý‘\Ö‘\Ï‘\È‘\Á‘\º‘\³‘\¬‘\¥‘\ž‘\—‘\‘\‰‘\‚‘\{‘\t‘\m‘\f‘\_‘\X‘\Q‘\J‘\C‘\<‘\5‘\.‘\'‘\ ‘\‘\‘\ ‘\‘\ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þŽ\÷Ž\ðŽ\éŽ\âŽ\ÛŽ\ÔŽ\ÍŽ\ÆŽ\¿Ž\¸Ž\±Ž\ªŽ\£Ž\œŽ\•Ž\ŽŽ\‡Ž\€Ž\yŽ\rŽ\kŽ\dŽ\]Ž\VŽ\OŽ\HŽ\AŽ\:Ž\3Ž\,Ž\%Ž\Ž\Ž\Ž\ Ž\Ž\û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿŒ\øŒ\ñŒ\êŒ\ãŒ\ÜŒ\ÕŒ\ÎŒ\ÇŒ\ÀŒ\¹Œ\²Œ\«Œ\¤Œ\Œ\–Œ\Œ\ˆŒ\Œ\zŒ\sŒ\lŒ\eŒ\^Œ\WŒ\PŒ\IŒ\BŒ\;Œ\4Œ\-Œ\&Œ\Œ\Œ\Œ\ Œ\Œ\ü‹\õ‹\î‹\ç‹\à‹\Ù‹\Ò‹\Ë‹\Ä‹\½‹\¶‹\¯‹\¨‹\¡‹\š‹\“‹\Œ‹\…‹\~‹\w‹\p‹\i‹\b‹\[‹\T‹\M‹\F‹\?‹\8‹\1‹\*‹\#‹\‹\‹\‹\‹\‹\ùŠ\òŠ\ëŠ\äŠ\ÝŠ\ÖŠ\ÏŠ\ÈŠ\ÁŠ\ºŠ\³Š\¬Š\¥Š\žŠ\—Š\Š\‰Š\‚Š\{Š\tŠ\mŠ\fŠ\_Š\XŠ\QŠ\JŠ\CŠ\<Š\5Š\.Š\'Š\ Š\Š\Š\ Š\Š\ý‰\ö‰\ï‰\è‰\á‰\Ú‰\Ó‰\̉\ʼn\¾‰\·‰\°‰\©‰\¢‰\›‰\”‰\‰\†‰\‰\x‰\q‰\j‰\c‰\\‰\U‰\N‰\G‰\@‰\9‰\2‰\+‰\$‰\‰\‰\‰\‰\‰\úˆ\óˆ\ìˆ\åˆ\Þˆ\׈\Ј\Ɉ\ˆ\»ˆ\´ˆ\­ˆ\¦ˆ\Ÿˆ\˜ˆ\‘ˆ\Šˆ\ƒˆ\|ˆ\uˆ\nˆ\gˆ\`ˆ\Yˆ\Rˆ\Kˆ\Dˆ\=ˆ\6ˆ\/ˆ\(ˆ\!ˆ\ˆ\ˆ\ ˆ\ˆ\þ‡\÷‡\ð‡\é‡\â‡\Û‡\Ô‡\͇\Ƈ\¿‡\¸‡\±‡\ª‡\£‡\œ‡\•‡\އ\‡‡\€‡\y‡\r‡\k‡\d‡\]‡\V‡\O‡\H‡\A‡\:‡\3‡\,‡\%‡\‡\‡\‡\ ‡\‡\û†\ô†\í†\æ†\߆\؆\ц\ʆ\Æ\¼†\µ†\®†\§†\ †\™†\’†\‹†\„†\}†\v†\o†\h†\a†\Z†\S†\L†\E†\>†\7†\0†\)†\"†\†\†\ †\†\ÿ…\ø…\ñ…\ê…\ã…\Ü…\Õ…\Î…\Ç…\À…\¹…\²…\«…\¤…\…\–…\…\ˆ…\…\z…\s…\l…\e…\^…\W…\P…\I…\B…\;…\4…\-…\&…\…\…\…\ …\…\ü„\õ„\î„\ç„\à„\Ù„\Ò„\Ë„\Ä„\½„\¶„\¯„\¨„\¡„\š„\“„\Œ„\…„\~„\w„\p„\i„\b„\[„\T„\M„\F„\?„\8„\1„\*„\#„\„\„\„\„\„\ùƒ\òƒ\ëƒ\äƒ\݃\Öƒ\σ\ȃ\Áƒ\ºƒ\³ƒ\¬ƒ\¥ƒ\žƒ\—ƒ\ƒ\‰ƒ\‚ƒ\{ƒ\tƒ\mƒ\fƒ\_ƒ\Xƒ\Qƒ\Jƒ\Cƒ\<ƒ\5ƒ\.ƒ\'ƒ\ ƒ\ƒ\ƒ\ ƒ\ƒ\ý‚\ö‚\ï‚\è‚\á‚\Ú‚\Ó‚\Ì‚\Å‚\¾‚\·‚\°‚\©‚\¢‚\›‚\”‚\‚\†‚\‚\x‚\q‚\j‚\c‚\\‚\U‚\N‚\G‚\@‚\9‚\2‚\+‚\$‚\‚\‚\‚\‚\‚\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ€\÷€\ð€\é€\â€\Û€\Ô€\Í€\Æ€\¿€\¸€\±€\ª€\£€\œ€\•€\Ž€\‡€\€€\y€\r€\k€\d€\]€\V€\O€\H€\A€\:€\3€\,€\%€\€\€\€\ €\€\û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ~\ø~\ñ~\ê~\ã~\Ü~\Õ~\Î~\Ç~\À~\¹~\²~\«~\¤~\~\–~\~\ˆ~\~\z~\s~\l~\e~\^~\W~\P~\I~\B~\;~\4~\-~\&~\~\~\~\ ~\~\ü}\õ}\î}\ç}\à}\Ù}\Ò}\Ë}\Ä}\½}\¶}\¯}\¨}\¡}\š}\“}\Œ}\…}\~}\w}\p}\i}\b}\[}\T}\M}\F}\?}\8}\1}\*}\#}\}\}\}\}\}\ù|\ò|\ë|\ä|\Ý|\Ö|\Ï|\È|\Á|\º|\³|\¬|\¥|\ž|\—|\|\‰|\‚|\{|\t|\m|\f|\_|\X|\Q|\J|\C|\<|\5|\.|\'|\ |\|\|\ |\|\ý{\ö{\ï{\è{\á{\Ú{\Ó{\Ì{\Å{\¾{\·{\°{\©{\¢{\›{\”{\{\†{\{\x{\q{\j{\c{\\{\U{\N{\G{\@{\9{\2{\+{\${\{\{\{\{\{\úz\óz\ìz\åz\Þz\×z\Ðz\Éz\Âz\»z\´z\­z\¦z\Ÿz\˜z\‘z\Šz\ƒz\|z\uz\nz\gz\`z\Yz\Rz\Kz\Dz\=z\6z\/z\(z\!z\z\z\ z\z\þy\÷y\ðy\éy\ây\Ûy\Ôy\Íy\Æy\¿y\¸y\±y\ªy\£y\œy\•y\Žy\‡y\€y\yy\ry\ky\dy\]y\Vy\Oy\Hy\Ay\:y\3y\,y\%y\y\y\y\ y\y\ûx\ôx\íx\æx\ßx\Øx\Ñx\Êx\Ãx\¼x\µx\®x\§x\ x\™x\’x\‹x\„x\}x\vx\ox\hx\ax\Zx\Sx\Lx\Ex\>x\7x\0x\)x\"x\x\x\ x\x\ÿw\øw\ñw\êw\ãw\Üw\Õw\Îw\Çw\Àw\¹w\²w\«w\¤w\w\–w\w\ˆw\w\zw\sw\lw\ew\^w\Ww\Pw\Iw\Bw\;w\4w\-w\&w\w\w\w\ w\w\üv\õv\îv\çv\àv\Ùv\Òv\Ëv\Äv\½v\¶v\¯v\¨v\¡v\šv\“v\Œv\…v\~v\wv\pv\iv\bv\[v\Tv\Mv\Fv\?v\8v\1v\*v\#v\v\v\v\v\v\ùu\òu\ëu\äu\Ýu\Öu\Ïu\Èu\Áu\ºu\³u\¬u\¥u\žu\—u\u\‰u\‚u\{u\tu\mu\fu\_u\Xu\Qu\Ju\Cu\q\7q\0q\)q\"q\q\q\ q\q\ÿp\øp\ñp\êp\ãp\Üp\Õp\Îp\Çp\Àp\¹p\²p\«p\¤p\p\–p\p\ˆp\p\zp\sp\lp\ep\^p\Wp\Pp\Ip\Bp\;p\4p\-p\&p\p\p\p\ p\p\üo\õo\îo\ço\ào\Ùo\Òo\Ëo\Äo\½o\¶o\¯o\¨o\¡o\šo\“o\Œo\…o\~o\wo\po\io\bo\[o\To\Mo\Fo\?o\8o\1o\*o\#o\o\o\o\o\o\ùn\òn\ën\än\Ýn\Ön\Ïn\Èn\Án\ºn\³n\¬n\¥n\žn\—n\n\‰n\‚n\{n\tn\mn\fn\_n\Xn\Qn\Jn\Cn\j\7j\0j\)j\"j\j\j\ j\j\ÿi\øi\ñi\êi\ãi\Üi\Õi\Îi\Çi\Ài\¹i\²i\«i\¤i\i\–i\i\ˆi\i\zi\si\li\ei\^i\Wi\Pi\Ii\Bi\;i\4i\-i\&i\i\i\i\ i\i\üh\õh\îh\çh\àh\Ùh\Òh\Ëh\Äh\½h\¶h\¯h\¨h\¡h\šh\“h\Œh\…h\~h\wh\ph\ih\bh\[h\Th\Mh\Fh\?h\8h\1h\*h\#h\h\h\h\h\h\ùg\òg\ëg\äg\Ýg\Ög\Ïg\Èg\Ág\ºg\³g\¬g\¥g\žg\—g\g\‰g\‚g\{g\tg\mg\fg\_g\Xg\Qg\Jg\Cg\c\7c\0c\)c\"c\c\c\ c\c\ÿb\øb\ñb\êb\ãb\Üb\Õb\Îb\Çb\Àb\¹b\²b\«b\¤b\b\–b\b\ˆb\b\zb\sb\lb\eb\^b\Wb\Pb\Ib\Bb\;b\4b\-b\&b\b\b\b\ b\b\üa\õa\îa\ça\àa\Ùa\Òa\Ëa\Äa\½a\¶a\¯a\¨a\¡a\ša\“a\Œa\…a\~a\wa\pa\ia\ba\[a\Ta\Ma\Fa\?a\8a\1a\*a\#a\a\a\a\a\a\ù`\ò`\ë`\ä`\Ý`\Ö`\Ï`\È`\Á`\º`\³`\¬`\¥`\ž`\—`\`\‰`\‚`\{`\t`\m`\f`\_`\X`\Q`\J`\C`\<`\5`\.`\'`\ `\`\`\ `\`\ý_\ö_\ï_\è_\á_\Ú_\Ó_\Ì_\Å_\¾_\·_\°_\©_\¢_\›_\”_\_\†_\_\x_\q_\j_\c_\\_\U_\N_\G_\@_\9_\2_\+_\$_\_\_\_\_\_\ú^\ó^\ì^\å^\Þ^\×^\Ð^\É^\Â^\»^\´^\­^\¦^\Ÿ^\˜^\‘^\Š^\ƒ^\|^\u^\n^\g^\`^\Y^\R^\K^\D^\=^\6^\/^\(^\!^\^\^\ ^\^\þ]\÷]\ð]\é]\â]\Û]\Ô]\Í]\Æ]\¿]\¸]\±]\ª]\£]\œ]\•]\Ž]\‡]\€]\y]\r]\k]\d]\]]\V]\O]\H]\A]\:]\3]\,]\%]\]\]\]\ ]\]\û\\ô\\í\\æ\\ß\\Ø\\Ñ\\Ê\\Ã\\¼\\µ\\®\\§\\ \\™\\’\\‹\\„\\}\\v\\o\\h\\a\\Z\\S\\L\\E\\>\\7\\0\\)\\"\\\\\\ \\\\ÿ[\ø[\ñ[\ê[\ã[\Ü[\Õ[\Î[\Ç[\À[\¹[\²[\«[\¤[\[\–[\[\ˆ[\[\z[\s[\l[\e[\^[\W[\P[\I[\B[\;[\4[\-[\&[\[\[\[\ [\[\üZ\õZ\îZ\çZ\àZ\ÙZ\ÒZ\ËZ\ÄZ\½Z\¶Z\¯Z\¨Z\¡Z\šZ\“Z\ŒZ\…Z\~Z\wZ\pZ\iZ\bZ\[Z\TZ\MZ\FZ\?Z\8Z\1Z\*Z\#Z\Z\Z\Z\Z\Z\ùY\òY\ëY\äY\ÝY\ÖY\ÏY\ÈY\ÁY\ºY\³Y\¬Y\¥Y\žY\—Y\Y\‰Y\‚Y\{Y\tY\mY\fY\_Y\XY\QY\JY\CY\U\7U\0U\)U\"U\U\U\ U\U\ÿT\øT\ñT\êT\ãT\ÜT\ÕT\ÎT\ÇT\ÀT\¹T\²T\«T\¤T\T\–T\T\ˆT\T\zT\sT\lT\eT\^T\WT\PT\IT\BT\;T\4T\-T\&T\T\T\T\ T\T\üS\õS\îS\çS\àS\ÙS\ÒS\ËS\ÄS\½S\¶S\¯S\¨S\¡S\šS\“S\ŒS\…S\~S\wS\pS\iS\bS\[S\TS\MS\FS\?S\8S\1S\*S\#S\S\S\S\S\S\ùR\òR\ëR\äR\ÝR\ÖR\ÏR\ÈR\ÁR\ºR\³R\¬R\¥R\žR\—R\R\‰R\‚R\{R\tR\mR\fR\_R\XR\QR\JR\CR\N\7N\0N\)N\"N\N\N\ N\N\ÿM\øM\ñM\êM\ãM\ÜM\ÕM\ÎM\ÇM\ÀM\¹M\²M\«M\¤M\M\–M\M\ˆM\M\zM\sM\lM\eM\^M\WM\PM\IM\BM\;M\4M\-M\&M\M\M\M\ M\M\üL\õL\îL\çL\àL\ÙL\ÒL\ËL\ÄL\½L\¶L\¯L\¨L\¡L\šL\“L\ŒL\…L\~L\wL\pL\iL\bL\[L\TL\ML\FL\?L\8L\1L\*L\#L\L\L\L\L\L\ùK\òK\ëK\äK\ÝK\ÖK\ÏK\ÈK\ÁK\ºK\³K\¬K\¥K\žK\—K\K\‰K\‚K\{K\tK\mK\fK\_K\XK\QK\JK\CK\G\7G\0G\)G\"G\G\G\ G\G\ÿF\øF\ñF\êF\ãF\ÜF\ÕF\ÎF\ÇF\ÀF\¹F\²F\«F\¤F\F\–F\F\ˆF\F\zF\sF\lF\eF\^F\WF\PF\IF\BF\;F\4F\-F\&F\F\F\F\ F\F\üE\õE\îE\çE\àE\ÙE\ÒE\ËE\ÄE\½E\¶E\¯E\¨E\¡E\šE\“E\ŒE\…E\~E\wE\pE\iE\bE\[E\TE\ME\FE\?E\8E\1E\*E\#E\E\E\E\E\E\ùD\òD\ëD\äD\ÝD\ÖD\ÏD\ÈD\ÁD\ºD\³D\¬D\¥D\žD\—D\D\‰D\‚D\{D\tD\mD\fD\_D\XD\QD\JD\CD\@\7@\0@\)@\"@\@\@\ @\@\ÿ?\ø?\ñ?\ê?\ã?\Ü?\Õ?\Î?\Ç?\À?\¹?\²?\«?\¤?\?\–?\?\ˆ?\?\z?\s?\l?\e?\^?\W?\P?\I?\B?\;?\4?\-?\&?\?\?\?\ ?\?\ü>\õ>\î>\ç>\à>\Ù>\Ò>\Ë>\Ä>\½>\¶>\¯>\¨>\¡>\š>\“>\Œ>\…>\~>\w>\p>\i>\b>\[>\T>\M>\F>\?>\8>\1>\*>\#>\>\>\>\>\>\ù=\ò=\ë=\ä=\Ý=\Ö=\Ï=\È=\Á=\º=\³=\¬=\¥=\ž=\—=\=\‰=\‚=\{=\t=\m=\f=\_=\X=\Q=\J=\C=\<=\5=\.=\'=\ =\=\=\ =\=\ý<\ö<\ï<\è<\á<\Ú<\Ó<\Ì<\Å<\¾<\·<\°<\©<\¢<\›<\”<\<\†<\<\x<\q<\j<\c<\\<\U<\N<\G<\@<\9<\2<\+<\$<\<\<\<\<\<\ú;\ó;\ì;\å;\Þ;\×;\Ð;\É;\Â;\»;\´;\­;\¦;\Ÿ;\˜;\‘;\Š;\ƒ;\|;\u;\n;\g;\`;\Y;\R;\K;\D;\=;\6;\/;\(;\!;\;\;\ ;\;\þ:\÷:\ð:\é:\â:\Û:\Ô:\Í:\Æ:\¿:\¸:\±:\ª:\£:\œ:\•:\Ž:\‡:\€:\y:\r:\k:\d:\]:\V:\O:\H:\A:\::\3:\,:\%:\:\:\:\ :\:\û9\ô9\í9\æ9\ß9\Ø9\Ñ9\Ê9\Ã9\¼9\µ9\®9\§9\ 9\™9\’9\‹9\„9\}9\v9\o9\h9\a9\Z9\S9\L9\E9\>9\79\09\)9\"9\9\9\ 9\9\ÿ8\ø8\ñ8\ê8\ã8\Ü8\Õ8\Î8\Ç8\À8\¹8\²8\«8\¤8\8\–8\8\ˆ8\8\z8\s8\l8\e8\^8\W8\P8\I8\B8\;8\48\-8\&8\8\8\8\ 8\8\ü7\õ7\î7\ç7\à7\Ù7\Ò7\Ë7\Ä7\½7\¶7\¯7\¨7\¡7\š7\“7\Œ7\…7\~7\w7\p7\i7\b7\[7\T7\M7\F7\?7\87\17\*7\#7\7\7\7\7\7\ù6\ò6\ë6\ä6\Ý6\Ö6\Ï6\È6\Á6\º6\³6\¬6\¥6\ž6\—6\6\‰6\‚6\{6\t6\m6\f6\_6\X6\Q6\J6\C6\<6\56\.6\'6\ 6\6\6\ 6\6\ý5\ö5\ï5\è5\á5\Ú5\Ó5\Ì5\Å5\¾5\·5\°5\©5\¢5\›5\”5\5\†5\5\x5\q5\j5\c5\\5\U5\N5\G5\@5\95\25\+5\$5\5\5\5\5\5\ú4\ó4\ì4\å4\Þ4\×4\Ð4\É4\Â4\»4\´4\­4\¦4\Ÿ4\˜4\‘4\Š4\ƒ4\|4\u4\n4\g4\`4\Y4\R4\K4\D4\=4\64\/4\(4\!4\4\4\ 4\4\þ3\÷3\ð3\é3\â3\Û3\Ô3\Í3\Æ3\¿3\¸3\±3\ª3\£3\œ3\•3\Ž3\‡3\€3\y3\r3\k3\d3\]3\V3\O3\H3\A3\:3\33\,3\%3\3\3\3\ 3\3\û2\ô2\í2\æ2\ß2\Ø2\Ñ2\Ê2\Ã2\¼2\µ2\®2\§2\ 2\™2\’2\‹2\„2\}2\v2\o2\h2\a2\Z2\S2\L2\E2\>2\72\02\)2\"2\2\2\ 2\2\ÿ1\ø1\ñ1\ê1\ã1\Ü1\Õ1\Î1\Ç1\À1\¹1\²1\«1\¤1\1\–1\1\ˆ1\1\z1\s1\l1\e1\^1\W1\P1\I1\B1\;1\41\-1\&1\1\1\1\ 1\1\ü0\õ0\î0\ç0\à0\Ù0\Ò0\Ë0\Ä0\½0\¶0\¯0\¨0\¡0\š0\“0\Œ0\…0\~0\w0\p0\i0\b0\[0\T0\M0\F0\?0\80\10\*0\#0\0\0\0\0\0\ù/\ò/\ë/\ä/\Ý/\Ö/\Ï/\È/\Á/\º/\³/\¬/\¥/\ž/\—/\/\‰/\‚/\{/\t/\m/\f/\_/\X/\Q/\J/\C/\+\7+\0+\)+\"+\+\+\ +\+\ÿ*\ø*\ñ*\ê*\ã*\Ü*\Õ*\Î*\Ç*\À*\¹*\²*\«*\¤*\*\–*\*\ˆ*\*\z*\s*\l*\e*\^*\W*\P*\I*\B*\;*\4*\-*\&*\*\*\*\ *\*\ü)\õ)\î)\ç)\à)\Ù)\Ò)\Ë)\Ä)\½)\¶)\¯)\¨)\¡)\š)\“)\Œ)\…)\~)\w)\p)\i)\b)\[)\T)\M)\F)\?)\8)\1)\*)\#)\)\)\)\)\)\ù(\ò(\ë(\ä(\Ý(\Ö(\Ï(\È(\Á(\º(\³(\¬(\¥(\ž(\—(\(\‰(\‚(\{(\t(\m(\f(\_(\X(\Q(\J(\C(\<(\5(\.(\'(\ (\(\(\ (\(\ý'\ö'\ï'\è'\á'\Ú'\Ó'\Ì'\Å'\¾'\·'\°'\©'\¢'\›'\”'\'\†'\'\x'\q'\j'\c'\\'\U'\N'\G'\@'\9'\2'\+'\$'\'\'\'\'\'\ú&\ó&\ì&\å&\Þ&\×&\Ð&\É&\Â&\»&\´&\­&\¦&\Ÿ&\˜&\‘&\Š&\ƒ&\|&\u&\n&\g&\`&\Y&\R&\K&\D&\=&\6&\/&\(&\!&\&\&\ &\&\þ%\÷%\ð%\é%\â%\Û%\Ô%\Í%\Æ%\¿%\¸%\±%\ª%\£%\œ%\•%\Ž%\‡%\€%\y%\r%\k%\d%\]%\V%\O%\H%\A%\:%\3%\,%\%%\%\%\%\ %\%\û$\ô$\í$\æ$\ß$\Ø$\Ñ$\Ê$\Ã$\¼$\µ$\®$\§$\ $\™$\’$\‹$\„$\}$\v$\o$\h$\a$\Z$\S$\L$\E$\>$\7$\0$\)$\"$\$\$\ $\$\ÿ#\ø#\ñ#\ê#\ã#\Ü#\Õ#\Î#\Ç#\À#\¹#\²#\«#\¤#\#\–#\#\ˆ#\#\z#\s#\l#\e#\^#\W#\P#\I#\B#\;#\4#\-#\&#\#\#\#\ #\#\ü"\õ"\î"\ç"\à"\Ù"\Ò"\Ë"\Ä"\½"\¶"\¯"\¨"\¡"\š"\“"\Œ"\…"\~"\w"\p"\i"\b"\["\T"\M"\F"\?"\8"\1"\*"\#"\"\"\"\"\"\ù!\ò!\ë!\ä!\Ý!\Ö!\Ï!\È!\Á!\º!\³!\¬!\¥!\ž!\—!\!\‰!\‚!\{!\t!\m!\f!\_!\X!\Q!\J!\C!\\7\0\)\"\\\ \\ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü \õ \î \ç \à \Ù \Ò \Ë \Ä \½ \¶ \¯ \¨ \¡ \š \“ \Œ \… \~ \w \p \i \b \[ \T \M \F \? \8 \1 \* \# \ \ \ \ \ \ù \ò \ë \ä \Ý \Ö \Ï \È \Á \º \³ \¬ \¥ \ž \— \ \‰ \‚ \{ \t \m \f \_ \X \Q \J \C \< \5 \. \' \ \ \ \ \ \ý \ö \ï \è \á \Ú \Ó \Ì \Å \¾ \· \° \© \¢ \› \” \ \† \ \x \q \j \c \\ \U \N \G \@ \9 \2 \+ \$ \ \ \ \ \ \ú \ó \ì \å \Þ \× \Ð \É \ \» \´ \­ \¦ \Ÿ \˜ \‘ \Š \ƒ \| \u \n \g \` \Y \R \K \D \= \6 \/ \( \! \ \ \ \ \þ \÷ \ð \é \â \Û \Ô \Í \Æ \¿ \¸ \± \ª \£ \œ \• \Ž \‡ \€ \y \r \k \d \] \V \O \H \A \: \3 \, \% \ \ \ \ \ \û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\üÿ[õÿ[îÿ[çÿ[àÿ[Ùÿ[Òÿ[Ëÿ[Äÿ[½ÿ[¶ÿ[¯ÿ[¨ÿ[¡ÿ[šÿ[“ÿ[Œÿ[…ÿ[~ÿ[wÿ[pÿ[iÿ[bÿ[[ÿ[Tÿ[Mÿ[Fÿ[?ÿ[8ÿ[1ÿ[*ÿ[#ÿ[ÿ[ÿ[ÿ[ÿ[ÿ[ùþ[òþ[ëþ[äþ[Ýþ[Öþ[Ïþ[Èþ[Áþ[ºþ[³þ[¬þ[¥þ[žþ[—þ[þ[‰þ[‚þ[{þ[tþ[mþ[fþ[_þ[Xþ[Qþ[Jþ[Cþ[<þ[5þ[.þ['þ[ þ[þ[þ[ þ[þ[ýý[öý[ïý[èý[áý[Úý[Óý[Ìý[Åý[¾ý[·ý[°ý[©ý[¢ý[›ý[”ý[ý[†ý[ý[xý[qý[jý[cý[\ý[Uý[Ný[Gý[@ý[9ý[2ý[+ý[$ý[ý[ý[ý[ý[ý[úü[óü[ìü[åü[Þü[×ü[Ðü[Éü[Âü[»ü[´ü[­ü[¦ü[Ÿü[˜ü[‘ü[Šü[ƒü[|ü[uü[nü[gü[`ü[Yü[Rü[Kü[Dü[=ü[6ü[/ü[(ü[!ü[ü[ü[ ü[ü[þû[÷û[ðû[éû[âû[Ûû[Ôû[Íû[Æû[¿û[¸û[±û[ªû[£û[œû[•û[Žû[‡û[€û[yû[rû[kû[dû[]û[Vû[Oû[Hû[Aû[:û[3û[,û[%û[û[û[û[ û[û[ûú[ôú[íú[æú[ßú[Øú[Ñú[Êú[Ãú[¼ú[µú[®ú[§ú[ ú[™ú[’ú[‹ú[„ú[}ú[vú[oú[hú[aú[Zú[Sú[Lú[Eú[>ú[7ú[0ú[)ú["ú[ú[ú[ ú[ú[ÿù[øù[ñù[êù[ãù[Üù[Õù[Îù[Çù[Àù[¹ù[²ù[«ù[¤ù[ù[–ù[ù[ˆù[ù[zù[sù[lù[eù[^ù[Wù[Pù[Iù[Bù[;ù[4ù[-ù[&ù[ù[ù[ù[ ù[ù[üø[õø[îø[çø[àø[Ùø[Òø[Ëø[Äø[½ø[¶ø[¯ø[¨ø[¡ø[šø[“ø[Œø[…ø[~ø[wø[pø[iø[bø[[ø[Tø[Mø[Fø[?ø[8ø[1ø[*ø[#ø[ø[ø[ø[ø[ø[ù÷[ò÷[ë÷[ä÷[Ý÷[Ö÷[Ï÷[È÷[Á÷[º÷[³÷[¬÷[¥÷[ž÷[—÷[÷[‰÷[‚÷[{÷[t÷[m÷[f÷[_÷[X÷[Q÷[J÷[C÷[<÷[5÷[.÷['÷[ ÷[÷[÷[ ÷[÷[ýö[öö[ïö[èö[áö[Úö[Óö[Ìö[Åö[¾ö[·ö[°ö[©ö[¢ö[›ö[”ö[ö[†ö[ö[xö[qö[jö[cö[\ö[Uö[Nö[Gö[@ö[9ö[2ö[+ö[$ö[ö[ö[ö[ö[ö[úõ[óõ[ìõ[åõ[Þõ[×õ[Ðõ[Éõ[Âõ[»õ[´õ[­õ[¦õ[Ÿõ[˜õ[‘õ[Šõ[ƒõ[|õ[uõ[nõ[gõ[`õ[Yõ[Rõ[Kõ[Dõ[=õ[6õ[/õ[(õ[!õ[õ[õ[ õ[õ[þô[÷ô[ðô[éô[âô[Ûô[Ôô[Íô[Æô[¿ô[¸ô[±ô[ªô[£ô[œô[•ô[Žô[‡ô[€ô[yô[rô[kô[dô[]ô[Vô[Oô[Hô[Aô[:ô[3ô[,ô[%ô[ô[ô[ô[ ô[ô[ûó[ôó[íó[æó[ßó[Øó[Ñó[Êó[Ãó[¼ó[µó[®ó[§ó[ ó[™ó[’ó[‹ó[„ó[}ó[vó[oó[hó[aó[Zó[Só[Ló[Eó[>ó[7ó[0ó[)ó["ó[ó[ó[ ó[ó[ÿò[øò[ñò[êò[ãò[Üò[Õò[Îò[Çò[Àò[¹ò[²ò[«ò[¤ò[ò[–ò[ò[ˆò[ò[zò[sò[lò[eò[^ò[Wò[Pò[Iò[Bò[;ò[4ò[-ò[&ò[ò[ò[ò[ ò[ò[üñ[õñ[îñ[çñ[àñ[Ùñ[Òñ[Ëñ[Äñ[½ñ[¶ñ[¯ñ[¨ñ[¡ñ[šñ[“ñ[Œñ[…ñ[~ñ[wñ[pñ[iñ[bñ[[ñ[Tñ[Mñ[Fñ[?ñ[8ñ[1ñ[*ñ[#ñ[ñ[ñ[ñ[ñ[ñ[ùð[òð[ëð[äð[Ýð[Öð[Ïð[Èð[Áð[ºð[³ð[¬ð[¥ð[žð[—ð[ð[‰ð[‚ð[{ð[tð[mð[fð[_ð[Xð[Qð[Jð[Cð[<ð[5ð[.ð['ð[ ð[ð[ð[ ð[ð[ýï[öï[ïï[èï[áï[Úï[Óï[Ìï[Åï[¾ï[·ï[°ï[©ï[¢ï[›ï[”ï[ï[†ï[ï[xï[qï[jï[cï[\ï[Uï[Nï[Gï[@ï[9ï[2ï[+ï[$ï[ï[ï[ï[ï[ï[úî[óî[ìî[åî[Þî[×î[Ðî[Éî[Âî[»î[´î[­î[¦î[Ÿî[˜î[‘î[Šî[ƒî[|î[uî[nî[gî[`î[Yî[Rî[Kî[Dî[=î[6î[/î[(î[!î[î[î[ î[î[þí[÷í[ðí[éí[âí[Ûí[Ôí[Íí[Æí[¿í[¸í[±í[ªí[£í[œí[•í[Ží[‡í[€í[yí[rí[kí[dí[]í[Ví[Oí[Hí[Aí[:í[3í[,í[%í[í[í[í[ í[í[ûì[ôì[íì[æì[ßì[Øì[Ñì[Êì[Ãì[¼ì[µì[®ì[§ì[ ì[™ì[’ì[‹ì[„ì[}ì[vì[oì[hì[aì[Zì[Sì[Lì[Eì[>ì[7ì[0ì[)ì["ì[ì[ì[ ì[ì[ÿë[øë[ñë[êë[ãë[Üë[Õë[Îë[Çë[Àë[¹ë[²ë[«ë[¤ë[ë[–ë[ë[ˆë[ë[zë[së[lë[eë[^ë[Wë[Pë[Ië[Bë[;ë[4ë[-ë[&ë[ë[ë[ë[ ë[ë[üê[õê[îê[çê[àê[Ùê[Òê[Ëê[Äê[½ê[¶ê[¯ê[¨ê[¡ê[šê[“ê[Œê[…ê[~ê[wê[pê[iê[bê[[ê[Tê[Mê[Fê[?ê[8ê[1ê[*ê[#ê[ê[ê[ê[ê[ê[ùé[òé[ëé[äé[Ýé[Öé[Ïé[Èé[Áé[ºé[³é[¬é[¥é[žé[—é[é[‰é[‚é[{é[té[mé[fé[_é[Xé[Qé[Jé[Cé[<é[5é[.é['é[ é[é[é[ é[é[ýè[öè[ïè[èè[áè[Úè[Óè[Ìè[Åè[¾è[·è[°è[©è[¢è[›è[”è[è[†è[è[xè[qè[jè[cè[\è[Uè[Nè[Gè[@è[9è[2è[+è[$è[è[è[è[è[è[úç[óç[ìç[åç[Þç[×ç[Ðç[Éç[Âç[»ç[´ç[­ç[¦ç[Ÿç[˜ç[‘ç[Šç[ƒç[|ç[uç[nç[gç[`ç[Yç[Rç[Kç[Dç[=ç[6ç[/ç[(ç[!ç[ç[ç[ ç[ç[þæ[÷æ[ðæ[éæ[âæ[Ûæ[Ôæ[Íæ[Ææ[¿æ[¸æ[±æ[ªæ[£æ[œæ[•æ[Žæ[‡æ[€æ[yæ[ræ[kæ[dæ[]æ[Væ[Oæ[Hæ[Aæ[:æ[3æ[,æ[%æ[æ[æ[æ[ æ[æ[ûå[ôå[íå[æå[ßå[Øå[Ñå[Êå[Ãå[¼å[µå[®å[§å[ å[™å[’å[‹å[„å[}å[vå[oå[hå[aå[Zå[Så[Lå[Eå[>å[7å[0å[)å["å[å[å[ å[å[ÿä[øä[ñä[êä[ãä[Üä[Õä[Îä[Çä[Àä[¹ä[²ä[«ä[¤ä[ä[–ä[ä[ˆä[ä[zä[sä[lä[eä[^ä[Wä[Pä[Iä[Bä[;ä[4ä[-ä[&ä[ä[ä[ä[ ä[ä[üã[õã[îã[çã[àã[Ùã[Òã[Ëã[Äã[½ã[¶ã[¯ã[¨ã[¡ã[šã[“ã[Œã[…ã[~ã[wã[pã[iã[bã[[ã[Tã[Mã[Fã[?ã[8ã[1ã[*ã[#ã[ã[ã[ã[ã[ã[ùâ[òâ[ëâ[äâ[Ýâ[Öâ[Ïâ[Èâ[Áâ[ºâ[³â[¬â[¥â[žâ[—â[â[‰â[‚â[{â[tâ[mâ[fâ[_â[Xâ[Qâ[Jâ[Câ[<â[5â[.â['â[ â[â[â[ â[â[ýá[öá[ïá[èá[áá[Úá[Óá[Ìá[Åá[¾á[·á[°á[©á[¢á[›á[”á[á[†á[á[xá[qá[já[cá[\á[Uá[Ná[Gá[@á[9á[2á[+á[$á[á[á[á[á[á[úà[óà[ìà[åà[Þà[×à[Ðà[Éà[Âà[»à[´à[­à[¦à[Ÿà[˜à[‘à[Šà[ƒà[|à[uà[nà[gà[`à[Yà[Rà[Kà[Dà[=à[6à[/à[(à[!à[à[à[ à[à[þß[÷ß[ðß[éß[âß[Ûß[Ôß[Íß[Æß[¿ß[¸ß[±ß[ªß[£ß[œß[•ß[Žß[‡ß[€ß[yß[rß[kß[dß[]ß[Vß[Oß[Hß[Aß[:ß[3ß[,ß[%ß[ß[ß[ß[ ß[ß[ûÞ[ôÞ[íÞ[æÞ[ßÞ[ØÞ[ÑÞ[ÊÞ[ÃÞ[¼Þ[µÞ[®Þ[§Þ[ Þ[™Þ[’Þ[‹Þ[„Þ[}Þ[vÞ[oÞ[hÞ[aÞ[ZÞ[SÞ[LÞ[EÞ[>Þ[7Þ[0Þ[)Þ["Þ[Þ[Þ[ Þ[Þ[ÿÝ[øÝ[ñÝ[êÝ[ãÝ[ÜÝ[ÕÝ[ÎÝ[ÇÝ[ÀÝ[¹Ý[²Ý[«Ý[¤Ý[Ý[–Ý[Ý[ˆÝ[Ý[zÝ[sÝ[lÝ[eÝ[^Ý[WÝ[PÝ[IÝ[BÝ[;Ý[4Ý[-Ý[&Ý[Ý[Ý[Ý[ Ý[Ý[üÜ[õÜ[îÜ[çÜ[àÜ[ÙÜ[ÒÜ[ËÜ[ÄÜ[½Ü[¶Ü[¯Ü[¨Ü[¡Ü[šÜ[“Ü[ŒÜ[…Ü[~Ü[wÜ[pÜ[iÜ[bÜ[[Ü[TÜ[MÜ[FÜ[?Ü[8Ü[1Ü[*Ü[#Ü[Ü[Ü[Ü[Ü[Ü[ùÛ[òÛ[ëÛ[äÛ[ÝÛ[ÖÛ[ÏÛ[ÈÛ[ÁÛ[ºÛ[³Û[¬Û[¥Û[žÛ[—Û[Û[‰Û[‚Û[{Û[tÛ[mÛ[fÛ[_Û[XÛ[QÛ[JÛ[CÛ[<Û[5Û[.Û['Û[ Û[Û[Û[ Û[Û[ýÚ[öÚ[ïÚ[èÚ[áÚ[ÚÚ[ÓÚ[ÌÚ[ÅÚ[¾Ú[·Ú[°Ú[©Ú[¢Ú[›Ú[”Ú[Ú[†Ú[Ú[xÚ[qÚ[jÚ[cÚ[\Ú[UÚ[NÚ[GÚ[@Ú[9Ú[2Ú[+Ú[$Ú[Ú[Ú[Ú[Ú[Ú[úÙ[óÙ[ìÙ[åÙ[ÞÙ[×Ù[ÐÙ[ÉÙ[ÂÙ[»Ù[´Ù[­Ù[¦Ù[ŸÙ[˜Ù[‘Ù[ŠÙ[ƒÙ[|Ù[uÙ[nÙ[gÙ[`Ù[YÙ[RÙ[KÙ[DÙ[=Ù[6Ù[/Ù[(Ù[!Ù[Ù[Ù[ Ù[Ù[þØ[÷Ø[ðØ[éØ[âØ[ÛØ[ÔØ[ÍØ[ÆØ[¿Ø[¸Ø[±Ø[ªØ[£Ø[œØ[•Ø[ŽØ[‡Ø[€Ø[yØ[rØ[kØ[dØ[]Ø[VØ[OØ[HØ[AØ[:Ø[3Ø[,Ø[%Ø[Ø[Ø[Ø[ Ø[Ø[û×[ô×[í×[æ×[ß×[Ø×[Ñ×[Ê×[Ã×[¼×[µ×[®×[§×[ ×[™×[’×[‹×[„×[}×[v×[o×[h×[a×[Z×[S×[L×[E×[>×[7×[0×[)×["×[×[×[ ×[×[ÿÖ[øÖ[ñÖ[êÖ[ãÖ[ÜÖ[ÕÖ[ÎÖ[ÇÖ[ÀÖ[¹Ö[²Ö[«Ö[¤Ö[Ö[–Ö[Ö[ˆÖ[Ö[zÖ[sÖ[lÖ[eÖ[^Ö[WÖ[PÖ[IÖ[BÖ[;Ö[4Ö[-Ö[&Ö[Ö[Ö[Ö[ Ö[Ö[üÕ[õÕ[îÕ[çÕ[àÕ[ÙÕ[ÒÕ[ËÕ[ÄÕ[½Õ[¶Õ[¯Õ[¨Õ[¡Õ[šÕ[“Õ[ŒÕ[…Õ[~Õ[wÕ[pÕ[iÕ[bÕ[[Õ[TÕ[MÕ[FÕ[?Õ[8Õ[1Õ[*Õ[#Õ[Õ[Õ[Õ[Õ[Õ[ùÔ[òÔ[ëÔ[äÔ[ÝÔ[ÖÔ[ÏÔ[ÈÔ[ÁÔ[ºÔ[³Ô[¬Ô[¥Ô[žÔ[—Ô[Ô[‰Ô[‚Ô[{Ô[tÔ[mÔ[fÔ[_Ô[XÔ[QÔ[JÔ[CÔ[<Ô[5Ô[.Ô['Ô[ Ô[Ô[Ô[ Ô[Ô[ýÓ[öÓ[ïÓ[èÓ[áÓ[ÚÓ[ÓÓ[ÌÓ[ÅÓ[¾Ó[·Ó[°Ó[©Ó[¢Ó[›Ó[”Ó[Ó[†Ó[Ó[xÓ[qÓ[jÓ[cÓ[\Ó[UÓ[NÓ[GÓ[@Ó[9Ó[2Ó[+Ó[$Ó[Ó[Ó[Ó[Ó[Ó[úÒ[óÒ[ìÒ[åÒ[ÞÒ[×Ò[ÐÒ[ÉÒ[ÂÒ[»Ò[´Ò[­Ò[¦Ò[ŸÒ[˜Ò[‘Ò[ŠÒ[ƒÒ[|Ò[uÒ[nÒ[gÒ[`Ò[YÒ[RÒ[KÒ[DÒ[=Ò[6Ò[/Ò[(Ò[!Ò[Ò[Ò[ Ò[Ò[þÑ[÷Ñ[ðÑ[éÑ[âÑ[ÛÑ[ÔÑ[ÍÑ[ÆÑ[¿Ñ[¸Ñ[±Ñ[ªÑ[£Ñ[œÑ[•Ñ[ŽÑ[‡Ñ[€Ñ[yÑ[rÑ[kÑ[dÑ[]Ñ[VÑ[OÑ[HÑ[AÑ[:Ñ[3Ñ[,Ñ[%Ñ[Ñ[Ñ[Ñ[ Ñ[Ñ[ûÐ[ôÐ[íÐ[æÐ[ßÐ[ØÐ[ÑÐ[ÊÐ[ÃÐ[¼Ð[µÐ[®Ð[§Ð[ Ð[™Ð[’Ð[‹Ð[„Ð[}Ð[vÐ[oÐ[hÐ[aÐ[ZÐ[SÐ[LÐ[EÐ[>Ð[7Ð[0Ð[)Ð["Ð[Ð[Ð[ Ð[Ð[ÿÏ[øÏ[ñÏ[êÏ[ãÏ[ÜÏ[ÕÏ[ÎÏ[ÇÏ[ÀÏ[¹Ï[²Ï[«Ï[¤Ï[Ï[–Ï[Ï[ˆÏ[Ï[zÏ[sÏ[lÏ[eÏ[^Ï[WÏ[PÏ[IÏ[BÏ[;Ï[4Ï[-Ï[&Ï[Ï[Ï[Ï[ Ï[Ï[üÎ[õÎ[îÎ[çÎ[àÎ[ÙÎ[ÒÎ[ËÎ[ÄÎ[½Î[¶Î[¯Î[¨Î[¡Î[šÎ[“Î[ŒÎ[…Î[~Î[wÎ[pÎ[iÎ[bÎ[[Î[TÎ[MÎ[FÎ[?Î[8Î[1Î[*Î[#Î[Î[Î[Î[Î[Î[ùÍ[òÍ[ëÍ[äÍ[ÝÍ[ÖÍ[ÏÍ[ÈÍ[ÁÍ[ºÍ[³Í[¬Í[¥Í[žÍ[—Í[Í[‰Í[‚Í[{Í[tÍ[mÍ[fÍ[_Í[XÍ[QÍ[JÍ[CÍ[<Í[5Í[.Í['Í[ Í[Í[Í[ Í[Í[ýÌ[öÌ[ïÌ[èÌ[áÌ[ÚÌ[ÓÌ[ÌÌ[ÅÌ[¾Ì[·Ì[°Ì[©Ì[¢Ì[›Ì[”Ì[Ì[†Ì[Ì[xÌ[qÌ[jÌ[cÌ[\Ì[UÌ[NÌ[GÌ[@Ì[9Ì[2Ì[+Ì[$Ì[Ì[Ì[Ì[Ì[Ì[úË[óË[ìË[åË[ÞË[×Ë[ÐË[ÉË[ÂË[»Ë[´Ë[­Ë[¦Ë[ŸË[˜Ë[‘Ë[ŠË[ƒË[|Ë[uË[nË[gË[`Ë[YË[RË[KË[DË[=Ë[6Ë[/Ë[(Ë[!Ë[Ë[Ë[ Ë[Ë[þÊ[÷Ê[ðÊ[éÊ[âÊ[ÛÊ[ÔÊ[ÍÊ[ÆÊ[¿Ê[¸Ê[±Ê[ªÊ[£Ê[œÊ[•Ê[ŽÊ[‡Ê[€Ê[yÊ[rÊ[kÊ[dÊ[]Ê[VÊ[OÊ[HÊ[AÊ[:Ê[3Ê[,Ê[%Ê[Ê[Ê[Ê[ Ê[Ê[ûÉ[ôÉ[íÉ[æÉ[ßÉ[ØÉ[ÑÉ[ÊÉ[ÃÉ[¼É[µÉ[®É[§É[ É[™É[’É[‹É[„É[}É[vÉ[oÉ[hÉ[aÉ[ZÉ[SÉ[LÉ[EÉ[>É[7É[0É[)É["É[É[É[ É[É[ÿÈ[øÈ[ñÈ[êÈ[ãÈ[ÜÈ[ÕÈ[ÎÈ[ÇÈ[ÀÈ[¹È[²È[«È[¤È[È[–È[È[ˆÈ[È[zÈ[sÈ[lÈ[eÈ[^È[WÈ[PÈ[IÈ[BÈ[;È[4È[-È[&È[È[È[È[ È[È[üÇ[õÇ[îÇ[çÇ[àÇ[ÙÇ[ÒÇ[ËÇ[ÄÇ[½Ç[¶Ç[¯Ç[¨Ç[¡Ç[šÇ[“Ç[ŒÇ[…Ç[~Ç[wÇ[pÇ[iÇ[bÇ[[Ç[TÇ[MÇ[FÇ[?Ç[8Ç[1Ç[*Ç[#Ç[Ç[Ç[Ç[Ç[Ç[ùÆ[òÆ[ëÆ[äÆ[ÝÆ[ÖÆ[ÏÆ[ÈÆ[ÁÆ[ºÆ[³Æ[¬Æ[¥Æ[žÆ[—Æ[Æ[‰Æ[‚Æ[{Æ[tÆ[mÆ[fÆ[_Æ[XÆ[QÆ[JÆ[CÆ[<Æ[5Æ[.Æ['Æ[ Æ[Æ[Æ[ Æ[Æ[ýÅ[öÅ[ïÅ[èÅ[áÅ[ÚÅ[ÓÅ[ÌÅ[ÅÅ[¾Å[·Å[°Å[©Å[¢Å[›Å[”Å[Å[†Å[Å[xÅ[qÅ[jÅ[cÅ[\Å[UÅ[NÅ[GÅ[@Å[9Å[2Å[+Å[$Å[Å[Å[Å[Å[Å[úÄ[óÄ[ìÄ[åÄ[ÞÄ[×Ä[ÐÄ[ÉÄ[ÂÄ[»Ä[´Ä[­Ä[¦Ä[ŸÄ[˜Ä[‘Ä[ŠÄ[ƒÄ[|Ä[uÄ[nÄ[gÄ[`Ä[YÄ[RÄ[KÄ[DÄ[=Ä[6Ä[/Ä[(Ä[!Ä[Ä[Ä[ Ä[Ä[þÃ[÷Ã[ðÃ[éÃ[âÃ[ÛÃ[ÔÃ[ÍÃ[ÆÃ[¿Ã[¸Ã[±Ã[ªÃ[£Ã[œÃ[•Ã[ŽÃ[‡Ã[€Ã[yÃ[rÃ[kÃ[dÃ[]Ã[VÃ[OÃ[HÃ[AÃ[:Ã[3Ã[,Ã[%Ã[Ã[Ã[Ã[ Ã[Ã[ûÂ[ôÂ[íÂ[æÂ[ßÂ[ØÂ[ÑÂ[ÊÂ[ÃÂ[¼Â[µÂ[®Â[§Â[ Â[™Â[’Â[‹Â[„Â[}Â[vÂ[oÂ[hÂ[aÂ[ZÂ[SÂ[LÂ[EÂ[>Â[7Â[0Â[)Â["Â[Â[Â[ Â[Â[ÿÁ[øÁ[ñÁ[êÁ[ãÁ[ÜÁ[ÕÁ[ÎÁ[ÇÁ[ÀÁ[¹Á[²Á[«Á[¤Á[Á[–Á[Á[ˆÁ[Á[zÁ[sÁ[lÁ[eÁ[^Á[WÁ[PÁ[IÁ[BÁ[;Á[4Á[-Á[&Á[Á[Á[Á[ Á[Á[üÀ[õÀ[îÀ[çÀ[àÀ[ÙÀ[ÒÀ[ËÀ[ÄÀ[½À[¶À[¯À[¨À[¡À[šÀ[“À[ŒÀ[…À[~À[wÀ[pÀ[iÀ[bÀ[[À[TÀ[MÀ[FÀ[?À[8À[1À[*À[#À[À[À[À[À[À[ù¿[ò¿[ë¿[ä¿[Ý¿[Ö¿[Ï¿[È¿[Á¿[º¿[³¿[¬¿[¥¿[ž¿[—¿[¿[‰¿[‚¿[{¿[t¿[m¿[f¿[_¿[X¿[Q¿[J¿[C¿[<¿[5¿[.¿['¿[ ¿[¿[¿[ ¿[¿[ý¾[ö¾[ï¾[è¾[á¾[Ú¾[Ó¾[̾[ž[¾¾[·¾[°¾[©¾[¢¾[›¾[”¾[¾[†¾[¾[x¾[q¾[j¾[c¾[\¾[U¾[N¾[G¾[@¾[9¾[2¾[+¾[$¾[¾[¾[¾[¾[¾[ú½[ó½[ì½[å½[Þ½[×½[н[ɽ[½[»½[´½[­½[¦½[Ÿ½[˜½[‘½[н[ƒ½[|½[u½[n½[g½[`½[Y½[R½[K½[D½[=½[6½[/½[(½[!½[½[½[ ½[½[þ¼[÷¼[ð¼[é¼[â¼[Û¼[Ô¼[ͼ[Ƽ[¿¼[¸¼[±¼[ª¼[£¼[œ¼[•¼[޼[‡¼[€¼[y¼[r¼[k¼[d¼[]¼[V¼[O¼[H¼[A¼[:¼[3¼[,¼[%¼[¼[¼[¼[ ¼[¼[û»[ô»[í»[æ»[ß»[Ø»[Ñ»[Ê»[û[¼»[µ»[®»[§»[ »[™»[’»[‹»[„»[}»[v»[o»[h»[a»[Z»[S»[L»[E»[>»[7»[0»[)»["»[»[»[ »[»[ÿº[øº[ñº[êº[ãº[ܺ[Õº[κ[Ǻ[Àº[¹º[²º[«º[¤º[º[–º[º[ˆº[º[zº[sº[lº[eº[^º[Wº[Pº[Iº[Bº[;º[4º[-º[&º[º[º[º[ º[º[ü¹[õ¹[î¹[ç¹[à¹[Ù¹[Ò¹[˹[Ĺ[½¹[¶¹[¯¹[¨¹[¡¹[š¹[“¹[Œ¹[…¹[~¹[w¹[p¹[i¹[b¹[[¹[T¹[M¹[F¹[?¹[8¹[1¹[*¹[#¹[¹[¹[¹[¹[¹[ù¸[ò¸[ë¸[ä¸[ݸ[Ö¸[ϸ[ȸ[Á¸[º¸[³¸[¬¸[¥¸[ž¸[—¸[¸[‰¸[‚¸[{¸[t¸[m¸[f¸[_¸[X¸[Q¸[J¸[C¸[<¸[5¸[.¸['¸[ ¸[¸[¸[ ¸[¸[ý·[ö·[ï·[è·[á·[Ú·[Ó·[Ì·[Å·[¾·[··[°·[©·[¢·[›·[”·[·[†·[·[x·[q·[j·[c·[\·[U·[N·[G·[@·[9·[2·[+·[$·[·[·[·[·[·[ú¶[ó¶[ì¶[å¶[Þ¶[×¶[ж[ɶ[¶[»¶[´¶[­¶[¦¶[Ÿ¶[˜¶[‘¶[ж[ƒ¶[|¶[u¶[n¶[g¶[`¶[Y¶[R¶[K¶[D¶[=¶[6¶[/¶[(¶[!¶[¶[¶[ ¶[¶[þµ[÷µ[ðµ[éµ[âµ[Ûµ[Ôµ[͵[Ƶ[¿µ[¸µ[±µ[ªµ[£µ[œµ[•µ[޵[‡µ[€µ[yµ[rµ[kµ[dµ[]µ[Vµ[Oµ[Hµ[Aµ[:µ[3µ[,µ[%µ[µ[µ[µ[ µ[µ[û´[ô´[í´[æ´[ß´[Ø´[Ñ´[Ê´[ô[¼´[µ´[®´[§´[ ´[™´[’´[‹´[„´[}´[v´[o´[h´[a´[Z´[S´[L´[E´[>´[7´[0´[)´["´[´[´[ ´[´[ÿ³[ø³[ñ³[ê³[ã³[ܳ[Õ³[γ[dz[À³[¹³[²³[«³[¤³[³[–³[³[ˆ³[³[z³[s³[l³[e³[^³[W³[P³[I³[B³[;³[4³[-³[&³[³[³[³[ ³[³[ü²[õ²[î²[ç²[à²[Ù²[Ò²[˲[IJ[½²[¶²[¯²[¨²[¡²[š²[“²[Œ²[…²[~²[w²[p²[i²[b²[[²[T²[M²[F²[?²[8²[1²[*²[#²[²[²[²[²[²[ù±[ò±[ë±[ä±[ݱ[Ö±[ϱ[ȱ[Á±[º±[³±[¬±[¥±[ž±[—±[±[‰±[‚±[{±[t±[m±[f±[_±[X±[Q±[J±[C±[<±[5±[.±['±[ ±[±[±[ ±[±[ý°[ö°[ï°[è°[á°[Ú°[Ó°[̰[Ű[¾°[·°[°°[©°[¢°[›°[”°[°[†°[°[x°[q°[j°[c°[\°[U°[N°[G°[@°[9°[2°[+°[$°[°[°[°[°[°[ú¯[ó¯[ì¯[å¯[Þ¯[ׯ[Я[ɯ[¯[»¯[´¯[­¯[¦¯[Ÿ¯[˜¯[‘¯[Н[ƒ¯[|¯[u¯[n¯[g¯[`¯[Y¯[R¯[K¯[D¯[=¯[6¯[/¯[(¯[!¯[¯[¯[ ¯[¯[þ®[÷®[ð®[é®[â®[Û®[Ô®[Í®[Æ®[¿®[¸®[±®[ª®[£®[œ®[•®[Ž®[‡®[€®[y®[r®[k®[d®[]®[V®[O®[H®[A®[:®[3®[,®[%®[®[®[®[ ®[®[û­[ô­[í­[æ­[ß­[Ø­[Ñ­[Ê­[í[¼­[µ­[®­[§­[ ­[™­[’­[‹­[„­[}­[v­[o­[h­[a­[Z­[S­[L­[E­[>­[7­[0­[)­["­[­[­[ ­[­[ÿ¬[ø¬[ñ¬[ê¬[ã¬[ܬ[Õ¬[ά[Ǭ[À¬[¹¬[²¬[«¬[¤¬[¬[–¬[¬[ˆ¬[¬[z¬[s¬[l¬[e¬[^¬[W¬[P¬[I¬[B¬[;¬[4¬[-¬[&¬[¬[¬[¬[ ¬[¬[ü«[õ«[î«[ç«[à«[Ù«[Ò«[Ë«[Ä«[½«[¶«[¯«[¨«[¡«[š«[“«[Œ«[…«[~«[w«[p«[i«[b«[[«[T«[M«[F«[?«[8«[1«[*«[#«[«[«[«[«[«[ùª[òª[ëª[äª[ݪ[Öª[Ϫ[Ȫ[Áª[ºª[³ª[¬ª[¥ª[žª[—ª[ª[‰ª[‚ª[{ª[tª[mª[fª[_ª[Xª[Qª[Jª[Cª[<ª[5ª[.ª['ª[ ª[ª[ª[ ª[ª[ý©[ö©[ï©[è©[á©[Ú©[Ó©[Ì©[Å©[¾©[·©[°©[©©[¢©[›©[”©[©[†©[©[x©[q©[j©[c©[\©[U©[N©[G©[@©[9©[2©[+©[$©[©[©[©[©[©[ú¨[ó¨[ì¨[å¨[Þ¨[ר[Ш[ɨ[¨[»¨[´¨[­¨[¦¨[Ÿ¨[˜¨[‘¨[Ѝ[ƒ¨[|¨[u¨[n¨[g¨[`¨[Y¨[R¨[K¨[D¨[=¨[6¨[/¨[(¨[!¨[¨[¨[ ¨[¨[þ§[÷§[ð§[é§[â§[Û§[Ô§[ͧ[Ƨ[¿§[¸§[±§[ª§[£§[œ§[•§[ާ[‡§[€§[y§[r§[k§[d§[]§[V§[O§[H§[A§[:§[3§[,§[%§[§[§[§[ §[§[û¦[ô¦[í¦[æ¦[ߦ[ئ[Ѧ[ʦ[æ[¼¦[µ¦[®¦[§¦[ ¦[™¦[’¦[‹¦[„¦[}¦[v¦[o¦[h¦[a¦[Z¦[S¦[L¦[E¦[>¦[7¦[0¦[)¦["¦[¦[¦[ ¦[¦[ÿ¥[ø¥[ñ¥[ê¥[ã¥[Ü¥[Õ¥[Î¥[Ç¥[À¥[¹¥[²¥[«¥[¤¥[¥[–¥[¥[ˆ¥[¥[z¥[s¥[l¥[e¥[^¥[W¥[P¥[I¥[B¥[;¥[4¥[-¥[&¥[¥[¥[¥[ ¥[¥[ü¤[õ¤[î¤[ç¤[à¤[Ù¤[Ò¤[ˤ[Ĥ[½¤[¶¤[¯¤[¨¤[¡¤[š¤[“¤[Œ¤[…¤[~¤[w¤[p¤[i¤[b¤[[¤[T¤[M¤[F¤[?¤[8¤[1¤[*¤[#¤[¤[¤[¤[¤[¤[ù£[ò£[ë£[ä£[Ý£[Ö£[Ï£[È£[Á£[º£[³£[¬£[¥£[ž£[—£[£[‰£[‚£[{£[t£[m£[f£[_£[X£[Q£[J£[C£[<£[5£[.£['£[ £[£[£[ £[£[ý¢[ö¢[ï¢[è¢[á¢[Ú¢[Ó¢[Ì¢[Å¢[¾¢[·¢[°¢[©¢[¢¢[›¢[”¢[¢[†¢[¢[x¢[q¢[j¢[c¢[\¢[U¢[N¢[G¢[@¢[9¢[2¢[+¢[$¢[¢[¢[¢[¢[¢[ú¡[ó¡[ì¡[å¡[Þ¡[ס[С[É¡[¡[»¡[´¡[­¡[¦¡[Ÿ¡[˜¡[‘¡[Š¡[ƒ¡[|¡[u¡[n¡[g¡[`¡[Y¡[R¡[K¡[D¡[=¡[6¡[/¡[(¡[!¡[¡[¡[ ¡[¡[þ [÷ [ð [é [â [Û [Ô [Í [Æ [¿ [¸ [± [ª [£ [œ [• [Ž [‡ [€ [y [r [k [d [] [V [O [H [A [: [3 [, [% [ [ [ [  [ [ûŸ[ôŸ[íŸ[æŸ[ߟ[ØŸ[ÑŸ[ÊŸ[ß[¼Ÿ[µŸ[®Ÿ[§Ÿ[ Ÿ[™Ÿ[’Ÿ[‹Ÿ[„Ÿ[}Ÿ[vŸ[oŸ[hŸ[aŸ[ZŸ[SŸ[LŸ[EŸ[>Ÿ[7Ÿ[0Ÿ[)Ÿ["Ÿ[Ÿ[Ÿ[ Ÿ[Ÿ[ÿž[øž[ñž[êž[ãž[Üž[Õž[Ξ[Çž[Àž[¹ž[²ž[«ž[¤ž[ž[–ž[ž[ˆž[ž[zž[sž[lž[ež[^ž[Wž[Pž[Iž[Bž[;ž[4ž[-ž[&ž[ž[ž[ž[ ž[ž[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ùœ[òœ[ëœ[äœ[Ýœ[Öœ[Ïœ[Èœ[Áœ[ºœ[³œ[¬œ[¥œ[žœ[—œ[œ[‰œ[‚œ[{œ[tœ[mœ[fœ[_œ[Xœ[Qœ[Jœ[Cœ[<œ[5œ[.œ['œ[ œ[œ[œ[ œ[œ[ý›[ö›[ï›[è›[á›[Ú›[Ó›[Ì›[Å›[¾›[·›[°›[©›[¢›[››[”›[›[†›[›[x›[q›[j›[c›[\›[U›[N›[G›[@›[9›[2›[+›[$›[›[›[›[›[›[úš[óš[ìš[åš[Þš[ך[К[Éš[š[»š[´š[­š[¦š[Ÿš[˜š[‘š[Šš[ƒš[|š[uš[nš[gš[`š[Yš[Rš[Kš[Dš[=š[6š[/š[(š[!š[š[š[ š[š[þ™[÷™[ð™[é™[â™[Û™[Ô™[Í™[Æ™[¿™[¸™[±™[ª™[£™[œ™[•™[Ž™[‡™[€™[y™[r™[k™[d™[]™[V™[O™[H™[A™[:™[3™[,™[%™[™[™[™[ ™[™[û˜[ô˜[í˜[æ˜[ߘ[ؘ[ј[ʘ[Ø[¼˜[µ˜[®˜[§˜[ ˜[™˜[’˜[‹˜[„˜[}˜[v˜[o˜[h˜[a˜[Z˜[S˜[L˜[E˜[>˜[7˜[0˜[)˜["˜[˜[˜[ ˜[˜[ÿ—[ø—[ñ—[ê—[ã—[Ü—[Õ—[Η[Ç—[À—[¹—[²—[«—[¤—[—[–—[—[ˆ—[—[z—[s—[l—[e—[^—[W—[P—[I—[B—[;—[4—[-—[&—[—[—[—[ —[—[ü–[õ–[î–[ç–[à–[Ù–[Ò–[Ë–[Ä–[½–[¶–[¯–[¨–[¡–[š–[“–[Œ–[…–[~–[w–[p–[i–[b–[[–[T–[M–[F–[?–[8–[1–[*–[#–[–[–[–[–[–[ù•[ò•[ë•[ä•[Ý•[Ö•[Ï•[È•[Á•[º•[³•[¬•[¥•[ž•[—•[•[‰•[‚•[{•[t•[m•[f•[_•[X•[Q•[J•[C•[<•[5•[.•['•[ •[•[•[ •[•[ý”[ö”[ï”[è”[á”[Ú”[Ó”[Ì”[Å”[¾”[·”[°”[©”[¢”[›”[””[”[†”[”[x”[q”[j”[c”[\”[U”[N”[G”[@”[9”[2”[+”[$”[”[”[”[”[”[ú“[ó“[ì“[å“[Þ“[ד[Г[É“[“[»“[´“[­“[¦“[Ÿ“[˜“[‘“[Š“[ƒ“[|“[u“[n“[g“[`“[Y“[R“[K“[D“[=“[6“[/“[(“[!“[“[“[ “[“[þ’[÷’[ð’[é’[â’[Û’[Ô’[Í’[Æ’[¿’[¸’[±’[ª’[£’[œ’[•’[Ž’[‡’[€’[y’[r’[k’[d’[]’[V’[O’[H’[A’[:’[3’[,’[%’[’[’[’[ ’[’[û‘[ô‘[í‘[æ‘[ß‘[Ø‘[Ñ‘[Ê‘[Ñ[¼‘[µ‘[®‘[§‘[ ‘[™‘[’‘[‹‘[„‘[}‘[v‘[o‘[h‘[a‘[Z‘[S‘[L‘[E‘[>‘[7‘[0‘[)‘["‘[‘[‘[ ‘[‘[ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ùŽ[òŽ[ëŽ[äŽ[ÝŽ[ÖŽ[ÏŽ[ÈŽ[ÁŽ[ºŽ[³Ž[¬Ž[¥Ž[žŽ[—Ž[Ž[‰Ž[‚Ž[{Ž[tŽ[mŽ[fŽ[_Ž[XŽ[QŽ[JŽ[CŽ[<Ž[5Ž[.Ž['Ž[ Ž[Ž[Ž[ Ž[Ž[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[úŒ[óŒ[ìŒ[åŒ[ÞŒ[׌[ÐŒ[ÉŒ[ÂŒ[»Œ[´Œ[­Œ[¦Œ[ŸŒ[˜Œ[‘Œ[ŠŒ[ƒŒ[|Œ[uŒ[nŒ[gŒ[`Œ[YŒ[RŒ[KŒ[DŒ[=Œ[6Œ[/Œ[(Œ[!Œ[Œ[Œ[ Œ[Œ[þ‹[÷‹[ð‹[é‹[â‹[Û‹[Ô‹[Í‹[Æ‹[¿‹[¸‹[±‹[ª‹[£‹[œ‹[•‹[Ž‹[‡‹[€‹[y‹[r‹[k‹[d‹[]‹[V‹[O‹[H‹[A‹[:‹[3‹[,‹[%‹[‹[‹[‹[ ‹[‹[ûŠ[ôŠ[íŠ[æŠ[ߊ[ØŠ[ÑŠ[ÊŠ[Ê[¼Š[µŠ[®Š[§Š[ Š[™Š[’Š[‹Š[„Š[}Š[vŠ[oŠ[hŠ[aŠ[ZŠ[SŠ[LŠ[EŠ[>Š[7Š[0Š[)Š["Š[Š[Š[ Š[Š[ÿ‰[ø‰[ñ‰[ê‰[ã‰[܉[Õ‰[Ή[lj[À‰[¹‰[²‰[«‰[¤‰[‰[–‰[‰[ˆ‰[‰[z‰[s‰[l‰[e‰[^‰[W‰[P‰[I‰[B‰[;‰[4‰[-‰[&‰[‰[‰[‰[ ‰[‰[üˆ[õˆ[îˆ[çˆ[àˆ[Ùˆ[Òˆ[ˈ[Ĉ[½ˆ[¶ˆ[¯ˆ[¨ˆ[¡ˆ[šˆ[“ˆ[Œˆ[…ˆ[~ˆ[wˆ[pˆ[iˆ[bˆ[[ˆ[Tˆ[Mˆ[Fˆ[?ˆ[8ˆ[1ˆ[*ˆ[#ˆ[ˆ[ˆ[ˆ[ˆ[ˆ[ù‡[ò‡[ë‡[ä‡[݇[Ö‡[χ[ȇ[Á‡[º‡[³‡[¬‡[¥‡[ž‡[—‡[‡[‰‡[‚‡[{‡[t‡[m‡[f‡[_‡[X‡[Q‡[J‡[C‡[<‡[5‡[.‡['‡[ ‡[‡[‡[ ‡[‡[ý†[ö†[ï†[è†[á†[Ú†[Ó†[̆[ņ[¾†[·†[°†[©†[¢†[›†[”†[†[††[†[x†[q†[j†[c†[\†[U†[N†[G†[@†[9†[2†[+†[$†[†[†[†[†[†[ú…[ó…[ì…[å…[Þ…[×…[Ð…[É…[Â…[»…[´…[­…[¦…[Ÿ…[˜…[‘…[Š…[ƒ…[|…[u…[n…[g…[`…[Y…[R…[K…[D…[=…[6…[/…[(…[!…[…[…[ …[…[þ„[÷„[ð„[é„[â„[Û„[Ô„[Í„[Æ„[¿„[¸„[±„[ª„[£„[œ„[•„[Ž„[‡„[€„[y„[r„[k„[d„[]„[V„[O„[H„[A„[:„[3„[,„[%„[„[„[„[ „[„[ûƒ[ôƒ[íƒ[æƒ[߃[؃[у[ʃ[Ã[¼ƒ[µƒ[®ƒ[§ƒ[ ƒ[™ƒ[’ƒ[‹ƒ[„ƒ[}ƒ[vƒ[oƒ[hƒ[aƒ[Zƒ[Sƒ[Lƒ[Eƒ[>ƒ[7ƒ[0ƒ[)ƒ["ƒ[ƒ[ƒ[ ƒ[ƒ[ÿ‚[ø‚[ñ‚[ê‚[ã‚[Ü‚[Õ‚[΂[Ç‚[À‚[¹‚[²‚[«‚[¤‚[‚[–‚[‚[ˆ‚[‚[z‚[s‚[l‚[e‚[^‚[W‚[P‚[I‚[B‚[;‚[4‚[-‚[&‚[‚[‚[‚[ ‚[‚[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ù€[ò€[ë€[ä€[Ý€[Ö€[Ï€[È€[Á€[º€[³€[¬€[¥€[ž€[—€[€[‰€[‚€[{€[t€[m€[f€[_€[X€[Q€[J€[C€[<€[5€[.€['€[ €[€[€[ €[€[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú~[ó~[ì~[å~[Þ~[×~[Ð~[É~[Â~[»~[´~[­~[¦~[Ÿ~[˜~[‘~[Š~[ƒ~[|~[u~[n~[g~[`~[Y~[R~[K~[D~[=~[6~[/~[(~[!~[~[~[ ~[~[þ}[÷}[ð}[é}[â}[Û}[Ô}[Í}[Æ}[¿}[¸}[±}[ª}[£}[œ}[•}[Ž}[‡}[€}[y}[r}[k}[d}[]}[V}[O}[H}[A}[:}[3}[,}[%}[}[}[}[ }[}[û|[ô|[í|[æ|[ß|[Ø|[Ñ|[Ê|[Ã|[¼|[µ|[®|[§|[ |[™|[’|[‹|[„|[}|[v|[o|[h|[a|[Z|[S|[L|[E|[>|[7|[0|[)|["|[|[|[ |[|[ÿ{[ø{[ñ{[ê{[ã{[Ü{[Õ{[Î{[Ç{[À{[¹{[²{[«{[¤{[{[–{[{[ˆ{[{[z{[s{[l{[e{[^{[W{[P{[I{[B{[;{[4{[-{[&{[{[{[{[ {[{[üz[õz[îz[çz[àz[Ùz[Òz[Ëz[Äz[½z[¶z[¯z[¨z[¡z[šz[“z[Œz[…z[~z[wz[pz[iz[bz[[z[Tz[Mz[Fz[?z[8z[1z[*z[#z[z[z[z[z[z[ùy[òy[ëy[äy[Ýy[Öy[Ïy[Èy[Áy[ºy[³y[¬y[¥y[žy[—y[y[‰y[‚y[{y[ty[my[fy[_y[Xy[Qy[Jy[Cy[u[7u[0u[)u["u[u[u[ u[u[ÿt[øt[ñt[êt[ãt[Üt[Õt[Ît[Çt[Àt[¹t[²t[«t[¤t[t[–t[t[ˆt[t[zt[st[lt[et[^t[Wt[Pt[It[Bt[;t[4t[-t[&t[t[t[t[ t[t[üs[õs[îs[çs[às[Ùs[Òs[Ës[Äs[½s[¶s[¯s[¨s[¡s[šs[“s[Œs[…s[~s[ws[ps[is[bs[[s[Ts[Ms[Fs[?s[8s[1s[*s[#s[s[s[s[s[s[ùr[òr[ër[är[Ýr[Ör[Ïr[Èr[Ár[ºr[³r[¬r[¥r[žr[—r[r[‰r[‚r[{r[tr[mr[fr[_r[Xr[Qr[Jr[Cr[n[7n[0n[)n["n[n[n[ n[n[ÿm[øm[ñm[êm[ãm[Üm[Õm[Îm[Çm[Àm[¹m[²m[«m[¤m[m[–m[m[ˆm[m[zm[sm[lm[em[^m[Wm[Pm[Im[Bm[;m[4m[-m[&m[m[m[m[ m[m[ül[õl[îl[çl[àl[Ùl[Òl[Ël[Äl[½l[¶l[¯l[¨l[¡l[šl[“l[Œl[…l[~l[wl[pl[il[bl[[l[Tl[Ml[Fl[?l[8l[1l[*l[#l[l[l[l[l[l[ùk[òk[ëk[äk[Ýk[Ök[Ïk[Èk[Ák[ºk[³k[¬k[¥k[žk[—k[k[‰k[‚k[{k[tk[mk[fk[_k[Xk[Qk[Jk[Ck[g[7g[0g[)g["g[g[g[ g[g[ÿf[øf[ñf[êf[ãf[Üf[Õf[Îf[Çf[Àf[¹f[²f[«f[¤f[f[–f[f[ˆf[f[zf[sf[lf[ef[^f[Wf[Pf[If[Bf[;f[4f[-f[&f[f[f[f[ f[f[üe[õe[îe[çe[àe[Ùe[Òe[Ëe[Äe[½e[¶e[¯e[¨e[¡e[še[“e[Œe[…e[~e[we[pe[ie[be[[e[Te[Me[Fe[?e[8e[1e[*e[#e[e[e[e[e[e[ùd[òd[ëd[äd[Ýd[Öd[Ïd[Èd[Ád[ºd[³d[¬d[¥d[žd[—d[d[‰d[‚d[{d[td[md[fd[_d[Xd[Qd[Jd[Cd[`[7`[0`[)`["`[`[`[ `[`[ÿ_[ø_[ñ_[ê_[ã_[Ü_[Õ_[Î_[Ç_[À_[¹_[²_[«_[¤_[_[–_[_[ˆ_[_[z_[s_[l_[e_[^_[W_[P_[I_[B_[;_[4_[-_[&_[_[_[_[ _[_[ü^[õ^[î^[ç^[à^[Ù^[Ò^[Ë^[Ä^[½^[¶^[¯^[¨^[¡^[š^[“^[Œ^[…^[~^[w^[p^[i^[b^[[^[T^[M^[F^[?^[8^[1^[*^[#^[^[^[^[^[^[ù][ò][ë][ä][Ý][Ö][Ï][È][Á][º][³][¬][¥][ž][—][][‰][‚][{][t][m][f][_][X][Q][J][C][<][5][.]['][ ][][][ ][][ý\[ö\[ï\[è\[á\[Ú\[Ó\[Ì\[Å\[¾\[·\[°\[©\[¢\[›\[”\[\[†\[\[x\[q\[j\[c\[\\[U\[N\[G\[@\[9\[2\[+\[$\[\[\[\[\[\[ú[[ó[[ì[[å[[Þ[[×[[Ð[[É[[Â[[»[[´[[­[[¦[[Ÿ[[˜[[‘[[Š[[ƒ[[|[[u[[n[[g[[`[[Y[[R[[K[[D[[=[[6[[/[[([[![[[[[[ [[[[þZ[÷Z[ðZ[éZ[âZ[ÛZ[ÔZ[ÍZ[ÆZ[¿Z[¸Z[±Z[ªZ[£Z[œZ[•Z[ŽZ[‡Z[€Z[yZ[rZ[kZ[dZ[]Z[VZ[OZ[HZ[AZ[:Z[3Z[,Z[%Z[Z[Z[Z[ Z[Z[ûY[ôY[íY[æY[ßY[ØY[ÑY[ÊY[ÃY[¼Y[µY[®Y[§Y[ Y[™Y[’Y[‹Y[„Y[}Y[vY[oY[hY[aY[ZY[SY[LY[EY[>Y[7Y[0Y[)Y["Y[Y[Y[ Y[Y[ÿX[øX[ñX[êX[ãX[ÜX[ÕX[ÎX[ÇX[ÀX[¹X[²X[«X[¤X[X[–X[X[ˆX[X[zX[sX[lX[eX[^X[WX[PX[IX[BX[;X[4X[-X[&X[X[X[X[ X[X[üW[õW[îW[çW[àW[ÙW[ÒW[ËW[ÄW[½W[¶W[¯W[¨W[¡W[šW[“W[ŒW[…W[~W[wW[pW[iW[bW[[W[TW[MW[FW[?W[8W[1W[*W[#W[W[W[W[W[W[ùV[òV[ëV[äV[ÝV[ÖV[ÏV[ÈV[ÁV[ºV[³V[¬V[¥V[žV[—V[V[‰V[‚V[{V[tV[mV[fV[_V[XV[QV[JV[CV[R[7R[0R[)R["R[R[R[ R[R[ÿQ[øQ[ñQ[êQ[ãQ[ÜQ[ÕQ[ÎQ[ÇQ[ÀQ[¹Q[²Q[«Q[¤Q[Q[–Q[Q[ˆQ[Q[zQ[sQ[lQ[eQ[^Q[WQ[PQ[IQ[BQ[;Q[4Q[-Q[&Q[Q[Q[Q[ Q[Q[üP[õP[îP[çP[àP[ÙP[ÒP[ËP[ÄP[½P[¶P[¯P[¨P[¡P[šP[“P[ŒP[…P[~P[wP[pP[iP[bP[[P[TP[MP[FP[?P[8P[1P[*P[#P[P[P[P[P[P[ùO[òO[ëO[äO[ÝO[ÖO[ÏO[ÈO[ÁO[ºO[³O[¬O[¥O[žO[—O[O[‰O[‚O[{O[tO[mO[fO[_O[XO[QO[JO[CO[K[7K[0K[)K["K[K[K[ K[K[ÿJ[øJ[ñJ[êJ[ãJ[ÜJ[ÕJ[ÎJ[ÇJ[ÀJ[¹J[²J[«J[¤J[J[–J[J[ˆJ[J[zJ[sJ[lJ[eJ[^J[WJ[PJ[IJ[BJ[;J[4J[-J[&J[J[J[J[ J[J[üI[õI[îI[çI[àI[ÙI[ÒI[ËI[ÄI[½I[¶I[¯I[¨I[¡I[šI[“I[ŒI[…I[~I[wI[pI[iI[bI[[I[TI[MI[FI[?I[8I[1I[*I[#I[I[I[I[I[I[ùH[òH[ëH[äH[ÝH[ÖH[ÏH[ÈH[ÁH[ºH[³H[¬H[¥H[žH[—H[H[‰H[‚H[{H[tH[mH[fH[_H[XH[QH[JH[CH[D[7D[0D[)D["D[D[D[ D[D[ÿC[øC[ñC[êC[ãC[ÜC[ÕC[ÎC[ÇC[ÀC[¹C[²C[«C[¤C[C[–C[C[ˆC[C[zC[sC[lC[eC[^C[WC[PC[IC[BC[;C[4C[-C[&C[C[C[C[ C[C[üB[õB[îB[çB[àB[ÙB[ÒB[ËB[ÄB[½B[¶B[¯B[¨B[¡B[šB[“B[ŒB[…B[~B[wB[pB[iB[bB[[B[TB[MB[FB[?B[8B[1B[*B[#B[B[B[B[B[B[ùA[òA[ëA[äA[ÝA[ÖA[ÏA[ÈA[ÁA[ºA[³A[¬A[¥A[žA[—A[A[‰A[‚A[{A[tA[mA[fA[_A[XA[QA[JA[CA[[÷>[ð>[é>[â>[Û>[Ô>[Í>[Æ>[¿>[¸>[±>[ª>[£>[œ>[•>[Ž>[‡>[€>[y>[r>[k>[d>[]>[V>[O>[H>[A>[:>[3>[,>[%>[>[>[>[ >[>[û=[ô=[í=[æ=[ß=[Ø=[Ñ=[Ê=[Ã=[¼=[µ=[®=[§=[ =[™=[’=[‹=[„=[}=[v=[o=[h=[a=[Z=[S=[L=[E=[>=[7=[0=[)=["=[=[=[ =[=[ÿ<[ø<[ñ<[ê<[ã<[Ü<[Õ<[Î<[Ç<[À<[¹<[²<[«<[¤<[<[–<[<[ˆ<[<[z<[s<[l<[e<[^<[W<[P<[I<[B<[;<[4<[-<[&<[<[<[<[ <[<[ü;[õ;[î;[ç;[à;[Ù;[Ò;[Ë;[Ä;[½;[¶;[¯;[¨;[¡;[š;[“;[Œ;[…;[~;[w;[p;[i;[b;[[;[T;[M;[F;[?;[8;[1;[*;[#;[;[;[;[;[;[ù:[ò:[ë:[ä:[Ý:[Ö:[Ï:[È:[Á:[º:[³:[¬:[¥:[ž:[—:[:[‰:[‚:[{:[t:[m:[f:[_:[X:[Q:[J:[C:[<:[5:[.:[':[ :[:[:[ :[:[ý9[ö9[ï9[è9[á9[Ú9[Ó9[Ì9[Å9[¾9[·9[°9[©9[¢9[›9[”9[9[†9[9[x9[q9[j9[c9[\9[U9[N9[G9[@9[99[29[+9[$9[9[9[9[9[9[ú8[ó8[ì8[å8[Þ8[×8[Ð8[É8[Â8[»8[´8[­8[¦8[Ÿ8[˜8[‘8[Š8[ƒ8[|8[u8[n8[g8[`8[Y8[R8[K8[D8[=8[68[/8[(8[!8[8[8[ 8[8[þ7[÷7[ð7[é7[â7[Û7[Ô7[Í7[Æ7[¿7[¸7[±7[ª7[£7[œ7[•7[Ž7[‡7[€7[y7[r7[k7[d7[]7[V7[O7[H7[A7[:7[37[,7[%7[7[7[7[ 7[7[û6[ô6[í6[æ6[ß6[Ø6[Ñ6[Ê6[Ã6[¼6[µ6[®6[§6[ 6[™6[’6[‹6[„6[}6[v6[o6[h6[a6[Z6[S6[L6[E6[>6[76[06[)6["6[6[6[ 6[6[ÿ5[ø5[ñ5[ê5[ã5[Ü5[Õ5[Î5[Ç5[À5[¹5[²5[«5[¤5[5[–5[5[ˆ5[5[z5[s5[l5[e5[^5[W5[P5[I5[B5[;5[45[-5[&5[5[5[5[ 5[5[ü4[õ4[î4[ç4[à4[Ù4[Ò4[Ë4[Ä4[½4[¶4[¯4[¨4[¡4[š4[“4[Œ4[…4[~4[w4[p4[i4[b4[[4[T4[M4[F4[?4[84[14[*4[#4[4[4[4[4[4[ù3[ò3[ë3[ä3[Ý3[Ö3[Ï3[È3[Á3[º3[³3[¬3[¥3[ž3[—3[3[‰3[‚3[{3[t3[m3[f3[_3[X3[Q3[J3[C3[<3[53[.3['3[ 3[3[3[ 3[3[ý2[ö2[ï2[è2[á2[Ú2[Ó2[Ì2[Å2[¾2[·2[°2[©2[¢2[›2[”2[2[†2[2[x2[q2[j2[c2[\2[U2[N2[G2[@2[92[22[+2[$2[2[2[2[2[2[ú1[ó1[ì1[å1[Þ1[×1[Ð1[É1[Â1[»1[´1[­1[¦1[Ÿ1[˜1[‘1[Š1[ƒ1[|1[u1[n1[g1[`1[Y1[R1[K1[D1[=1[61[/1[(1[!1[1[1[ 1[1[þ0[÷0[ð0[é0[â0[Û0[Ô0[Í0[Æ0[¿0[¸0[±0[ª0[£0[œ0[•0[Ž0[‡0[€0[y0[r0[k0[d0[]0[V0[O0[H0[A0[:0[30[,0[%0[0[0[0[ 0[0[û/[ô/[í/[æ/[ß/[Ø/[Ñ/[Ê/[Ã/[¼/[µ/[®/[§/[ /[™/[’/[‹/[„/[}/[v/[o/[h/[a/[Z/[S/[L/[E/[>/[7/[0/[)/["/[/[/[ /[/[ÿ.[ø.[ñ.[ê.[ã.[Ü.[Õ.[Î.[Ç.[À.[¹.[².[«.[¤.[.[–.[.[ˆ.[.[z.[s.[l.[e.[^.[W.[P.[I.[B.[;.[4.[-.[&.[.[.[.[ .[.[ü-[õ-[î-[ç-[à-[Ù-[Ò-[Ë-[Ä-[½-[¶-[¯-[¨-[¡-[š-[“-[Œ-[…-[~-[w-[p-[i-[b-[[-[T-[M-[F-[?-[8-[1-[*-[#-[-[-[-[-[-[ù,[ò,[ë,[ä,[Ý,[Ö,[Ï,[È,[Á,[º,[³,[¬,[¥,[ž,[—,[,[‰,[‚,[{,[t,[m,[f,[_,[X,[Q,[J,[C,[<,[5,[.,[',[ ,[,[,[ ,[,[ý+[ö+[ï+[è+[á+[Ú+[Ó+[Ì+[Å+[¾+[·+[°+[©+[¢+[›+[”+[+[†+[+[x+[q+[j+[c+[\+[U+[N+[G+[@+[9+[2+[++[$+[+[+[+[+[+[ú*[ó*[ì*[å*[Þ*[×*[Ð*[É*[Â*[»*[´*[­*[¦*[Ÿ*[˜*[‘*[Š*[ƒ*[|*[u*[n*[g*[`*[Y*[R*[K*[D*[=*[6*[/*[(*[!*[*[*[ *[*[þ)[÷)[ð)[é)[â)[Û)[Ô)[Í)[Æ)[¿)[¸)[±)[ª)[£)[œ)[•)[Ž)[‡)[€)[y)[r)[k)[d)[])[V)[O)[H)[A)[:)[3)[,)[%)[)[)[)[ )[)[û([ô([í([æ([ß([Ø([Ñ([Ê([Ã([¼([µ([®([§([ ([™([’([‹([„([}([v([o([h([a([Z([S([L([E([>([7([0([)(["([([([ ([([ÿ'[ø'[ñ'[ê'[ã'[Ü'[Õ'[Î'[Ç'[À'[¹'[²'[«'[¤'['[–'['[ˆ'['[z'[s'[l'[e'[^'[W'[P'[I'[B'[;'[4'[-'[&'['['['[ '['[ü&[õ&[î&[ç&[à&[Ù&[Ò&[Ë&[Ä&[½&[¶&[¯&[¨&[¡&[š&[“&[Œ&[…&[~&[w&[p&[i&[b&[[&[T&[M&[F&[?&[8&[1&[*&[#&[&[&[&[&[&[ù%[ò%[ë%[ä%[Ý%[Ö%[Ï%[È%[Á%[º%[³%[¬%[¥%[ž%[—%[%[‰%[‚%[{%[t%[m%[f%[_%[X%[Q%[J%[C%[<%[5%[.%['%[ %[%[%[ %[%[ý$[ö$[ï$[è$[á$[Ú$[Ó$[Ì$[Å$[¾$[·$[°$[©$[¢$[›$[”$[$[†$[$[x$[q$[j$[c$[\$[U$[N$[G$[@$[9$[2$[+$[$$[$[$[$[$[$[ú#[ó#[ì#[å#[Þ#[×#[Ð#[É#[Â#[»#[´#[­#[¦#[Ÿ#[˜#[‘#[Š#[ƒ#[|#[u#[n#[g#[`#[Y#[R#[K#[D#[=#[6#[/#[(#[!#[#[#[ #[#[þ"[÷"[ð"[é"[â"[Û"[Ô"[Í"[Æ"[¿"[¸"[±"[ª"[£"[œ"[•"[Ž"[‡"[€"[y"[r"[k"[d"[]"[V"[O"[H"[A"[:"[3"[,"[%"["["["[ "["[û![ô![í![æ![ß![Ø![Ñ![Ê![Ã![¼![µ![®![§![ ![™![’![‹![„![}![v![o![h![a![Z![S![L![E![>![7![0![)!["![![![ ![![ÿ [ø [ñ [ê [ã [Ü [Õ [Î [Ç [À [¹ [² [« [¤ [ [– [ [ˆ [ [z [s [l [e [^ [W [P [I [B [; [4 [- [& [ [ [ [ [ [ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þ [÷ [ð [é [â [Û [Ô [Í [Æ [¿ [¸ [± [ª [£ [œ [• [Ž [‡ [€ [y [r [k [d [] [V [O [H [A [: [3 [, [% [ [ [ [ [ [û [ô [í [æ [ß [Ø [Ñ [Ê [à [¼ [µ [® [§ [  [™ [’ [‹ [„ [} [v [o [h [a [Z [S [L [E [> [7 [0 [) [" [ [ [ [ [ÿ [ø [ñ [ê [ã [Ü [Õ [Î [Ç [À [¹ [² [« [¤ [ [– [ [ˆ [ [z [s [l [e [^ [W [P [I [B [; [4 [- [& [ [ [ [ [ [ü [õ [î [ç [à [Ù [Ò [Ë [Ä [½ [¶ [¯ [¨ [¡ [š [“ [Œ [… [~ [w [p [i [b [[ [T [M [F [? [8 [1 [* [# [ [ [ [ [ [ù [ò [ë [ä [Ý [Ö [Ï [È [Á [º [³ [¬ [¥ [ž [— [ [‰ [‚ [{ [t [m [f [_ [X [Q [J [C [< [5 [. [' [ [ [ [ [ [ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þÿZ÷ÿZðÿZéÿZâÿZÛÿZÔÿZÍÿZÆÿZ¿ÿZ¸ÿZ±ÿZªÿZ£ÿZœÿZ•ÿZŽÿZ‡ÿZ€ÿZyÿZrÿZkÿZdÿZ]ÿZVÿZOÿZHÿZAÿZ:ÿZ3ÿZ,ÿZ%ÿZÿZÿZÿZ ÿZÿZûþZôþZíþZæþZßþZØþZÑþZÊþZÃþZ¼þZµþZ®þZ§þZ þZ™þZ’þZ‹þZ„þZ}þZvþZoþZhþZaþZZþZSþZLþZEþZ>þZ7þZ0þZ)þZ"þZþZþZ þZþZÿýZøýZñýZêýZãýZÜýZÕýZÎýZÇýZÀýZ¹ýZ²ýZ«ýZ¤ýZýZ–ýZýZˆýZýZzýZsýZlýZeýZ^ýZWýZPýZIýZBýZ;ýZ4ýZ-ýZ&ýZýZýZýZ ýZýZüüZõüZîüZçüZàüZÙüZÒüZËüZÄüZ½üZ¶üZ¯üZ¨üZ¡üZšüZ“üZŒüZ…üZ~üZwüZpüZiüZbüZ[üZTüZMüZFüZ?üZ8üZ1üZ*üZ#üZüZüZüZüZüZùûZòûZëûZäûZÝûZÖûZÏûZÈûZÁûZºûZ³ûZ¬ûZ¥ûZžûZ—ûZûZ‰ûZ‚ûZ{ûZtûZmûZfûZ_ûZXûZQûZJûZCûZ<ûZ5ûZ.ûZ'ûZ ûZûZûZ ûZûZýúZöúZïúZèúZáúZÚúZÓúZÌúZÅúZ¾úZ·úZ°úZ©úZ¢úZ›úZ”úZúZ†úZúZxúZqúZjúZcúZ\úZUúZNúZGúZ@úZ9úZ2úZ+úZ$úZúZúZúZúZúZúùZóùZìùZåùZÞùZ×ùZÐùZÉùZÂùZ»ùZ´ùZ­ùZ¦ùZŸùZ˜ùZ‘ùZŠùZƒùZ|ùZuùZnùZgùZ`ùZYùZRùZKùZDùZ=ùZ6ùZ/ùZ(ùZ!ùZùZùZ ùZùZþøZ÷øZðøZéøZâøZÛøZÔøZÍøZÆøZ¿øZ¸øZ±øZªøZ£øZœøZ•øZŽøZ‡øZ€øZyøZrøZkøZdøZ]øZVøZOøZHøZAøZ:øZ3øZ,øZ%øZøZøZøZ øZøZû÷Zô÷Zí÷Zæ÷Zß÷ZØ÷ZÑ÷ZÊ÷ZÃ÷Z¼÷Zµ÷Z®÷Z§÷Z ÷Z™÷Z’÷Z‹÷Z„÷Z}÷Zv÷Zo÷Zh÷Za÷ZZ÷ZS÷ZL÷ZE÷Z>÷Z7÷Z0÷Z)÷Z"÷Z÷Z÷Z ÷Z÷ZÿöZøöZñöZêöZãöZÜöZÕöZÎöZÇöZÀöZ¹öZ²öZ«öZ¤öZöZ–öZöZˆöZöZzöZsöZlöZeöZ^öZWöZPöZIöZBöZ;öZ4öZ-öZ&öZöZöZöZ öZöZüõZõõZîõZçõZàõZÙõZÒõZËõZÄõZ½õZ¶õZ¯õZ¨õZ¡õZšõZ“õZŒõZ…õZ~õZwõZpõZiõZbõZ[õZTõZMõZFõZ?õZ8õZ1õZ*õZ#õZõZõZõZõZõZùôZòôZëôZäôZÝôZÖôZÏôZÈôZÁôZºôZ³ôZ¬ôZ¥ôZžôZ—ôZôZ‰ôZ‚ôZ{ôZtôZmôZfôZ_ôZXôZQôZJôZCôZ<ôZ5ôZ.ôZ'ôZ ôZôZôZ ôZôZýóZöóZïóZèóZáóZÚóZÓóZÌóZÅóZ¾óZ·óZ°óZ©óZ¢óZ›óZ”óZóZ†óZóZxóZqóZjóZcóZ\óZUóZNóZGóZ@óZ9óZ2óZ+óZ$óZóZóZóZóZóZúòZóòZìòZåòZÞòZ×òZÐòZÉòZÂòZ»òZ´òZ­òZ¦òZŸòZ˜òZ‘òZŠòZƒòZ|òZuòZnòZgòZ`òZYòZRòZKòZDòZ=òZ6òZ/òZ(òZ!òZòZòZ òZòZþñZ÷ñZðñZéñZâñZÛñZÔñZÍñZÆñZ¿ñZ¸ñZ±ñZªñZ£ñZœñZ•ñZŽñZ‡ñZ€ñZyñZrñZkñZdñZ]ñZVñZOñZHñZAñZ:ñZ3ñZ,ñZ%ñZñZñZñZ ñZñZûðZôðZíðZæðZßðZØðZÑðZÊðZÃðZ¼ðZµðZ®ðZ§ðZ ðZ™ðZ’ðZ‹ðZ„ðZ}ðZvðZoðZhðZaðZZðZSðZLðZEðZ>ðZ7ðZ0ðZ)ðZ"ðZðZðZ ðZðZÿïZøïZñïZêïZãïZÜïZÕïZÎïZÇïZÀïZ¹ïZ²ïZ«ïZ¤ïZïZ–ïZïZˆïZïZzïZsïZlïZeïZ^ïZWïZPïZIïZBïZ;ïZ4ïZ-ïZ&ïZïZïZïZ ïZïZüîZõîZîîZçîZàîZÙîZÒîZËîZÄîZ½îZ¶îZ¯îZ¨îZ¡îZšîZ“îZŒîZ…îZ~îZwîZpîZiîZbîZ[îZTîZMîZFîZ?îZ8îZ1îZ*îZ#îZîZîZîZîZîZùíZòíZëíZäíZÝíZÖíZÏíZÈíZÁíZºíZ³íZ¬íZ¥íZžíZ—íZíZ‰íZ‚íZ{íZtíZmíZfíZ_íZXíZQíZJíZCíZ<íZ5íZ.íZ'íZ íZíZíZ íZíZýìZöìZïìZèìZáìZÚìZÓìZÌìZÅìZ¾ìZ·ìZ°ìZ©ìZ¢ìZ›ìZ”ìZìZ†ìZìZxìZqìZjìZcìZ\ìZUìZNìZGìZ@ìZ9ìZ2ìZ+ìZ$ìZìZìZìZìZìZúëZóëZìëZåëZÞëZ×ëZÐëZÉëZÂëZ»ëZ´ëZ­ëZ¦ëZŸëZ˜ëZ‘ëZŠëZƒëZ|ëZuëZnëZgëZ`ëZYëZRëZKëZDëZ=ëZ6ëZ/ëZ(ëZ!ëZëZëZ ëZëZþêZ÷êZðêZéêZâêZÛêZÔêZÍêZÆêZ¿êZ¸êZ±êZªêZ£êZœêZ•êZŽêZ‡êZ€êZyêZrêZkêZdêZ]êZVêZOêZHêZAêZ:êZ3êZ,êZ%êZêZêZêZ êZêZûéZôéZíéZæéZßéZØéZÑéZÊéZÃéZ¼éZµéZ®éZ§éZ éZ™éZ’éZ‹éZ„éZ}éZvéZoéZhéZaéZZéZSéZLéZEéZ>éZ7éZ0éZ)éZ"éZéZéZ éZéZÿèZøèZñèZêèZãèZÜèZÕèZÎèZÇèZÀèZ¹èZ²èZ«èZ¤èZèZ–èZèZˆèZèZzèZsèZlèZeèZ^èZWèZPèZIèZBèZ;èZ4èZ-èZ&èZèZèZèZ èZèZüçZõçZîçZççZàçZÙçZÒçZËçZÄçZ½çZ¶çZ¯çZ¨çZ¡çZšçZ“çZŒçZ…çZ~çZwçZpçZiçZbçZ[çZTçZMçZFçZ?çZ8çZ1çZ*çZ#çZçZçZçZçZçZùæZòæZëæZäæZÝæZÖæZÏæZÈæZÁæZºæZ³æZ¬æZ¥æZžæZ—æZæZ‰æZ‚æZ{æZtæZmæZfæZ_æZXæZQæZJæZCæZ<æZ5æZ.æZ'æZ æZæZæZ æZæZýåZöåZïåZèåZáåZÚåZÓåZÌåZÅåZ¾åZ·åZ°åZ©åZ¢åZ›åZ”åZåZ†åZåZxåZqåZjåZcåZ\åZUåZNåZGåZ@åZ9åZ2åZ+åZ$åZåZåZåZåZåZúäZóäZìäZåäZÞäZ×äZÐäZÉäZÂäZ»äZ´äZ­äZ¦äZŸäZ˜äZ‘äZŠäZƒäZ|äZuäZnäZgäZ`äZYäZRäZKäZDäZ=äZ6äZ/äZ(äZ!äZäZäZ äZäZþãZ÷ãZðãZéãZâãZÛãZÔãZÍãZÆãZ¿ãZ¸ãZ±ãZªãZ£ãZœãZ•ãZŽãZ‡ãZ€ãZyãZrãZkãZdãZ]ãZVãZOãZHãZAãZ:ãZ3ãZ,ãZ%ãZãZãZãZ ãZãZûâZôâZíâZæâZßâZØâZÑâZÊâZÃâZ¼âZµâZ®âZ§âZ âZ™âZ’âZ‹âZ„âZ}âZvâZoâZhâZaâZZâZSâZLâZEâZ>âZ7âZ0âZ)âZ"âZâZâZ âZâZÿáZøáZñáZêáZãáZÜáZÕáZÎáZÇáZÀáZ¹áZ²áZ«áZ¤áZáZ–áZáZˆáZáZzáZsáZláZeáZ^áZWáZPáZIáZBáZ;áZ4áZ-áZ&áZáZáZáZ áZáZüàZõàZîàZçàZààZÙàZÒàZËàZÄàZ½àZ¶àZ¯àZ¨àZ¡àZšàZ“àZŒàZ…àZ~àZwàZpàZiàZbàZ[àZTàZMàZFàZ?àZ8àZ1àZ*àZ#àZàZàZàZàZàZùßZòßZëßZäßZÝßZÖßZÏßZÈßZÁßZºßZ³ßZ¬ßZ¥ßZžßZ—ßZßZ‰ßZ‚ßZ{ßZtßZmßZfßZ_ßZXßZQßZJßZCßZ<ßZ5ßZ.ßZ'ßZ ßZßZßZ ßZßZýÞZöÞZïÞZèÞZáÞZÚÞZÓÞZÌÞZÅÞZ¾ÞZ·ÞZ°ÞZ©ÞZ¢ÞZ›ÞZ”ÞZÞZ†ÞZÞZxÞZqÞZjÞZcÞZ\ÞZUÞZNÞZGÞZ@ÞZ9ÞZ2ÞZ+ÞZ$ÞZÞZÞZÞZÞZÞZúÝZóÝZìÝZåÝZÞÝZ×ÝZÐÝZÉÝZÂÝZ»ÝZ´ÝZ­ÝZ¦ÝZŸÝZ˜ÝZ‘ÝZŠÝZƒÝZ|ÝZuÝZnÝZgÝZ`ÝZYÝZRÝZKÝZDÝZ=ÝZ6ÝZ/ÝZ(ÝZ!ÝZÝZÝZ ÝZÝZþÜZ÷ÜZðÜZéÜZâÜZÛÜZÔÜZÍÜZÆÜZ¿ÜZ¸ÜZ±ÜZªÜZ£ÜZœÜZ•ÜZŽÜZ‡ÜZ€ÜZyÜZrÜZkÜZdÜZ]ÜZVÜZOÜZHÜZAÜZ:ÜZ3ÜZ,ÜZ%ÜZÜZÜZÜZ ÜZÜZûÛZôÛZíÛZæÛZßÛZØÛZÑÛZÊÛZÃÛZ¼ÛZµÛZ®ÛZ§ÛZ ÛZ™ÛZ’ÛZ‹ÛZ„ÛZ}ÛZvÛZoÛZhÛZaÛZZÛZSÛZLÛZEÛZ>ÛZ7ÛZ0ÛZ)ÛZ"ÛZÛZÛZ ÛZÛZÿÚZøÚZñÚZêÚZãÚZÜÚZÕÚZÎÚZÇÚZÀÚZ¹ÚZ²ÚZ«ÚZ¤ÚZÚZ–ÚZÚZˆÚZÚZzÚZsÚZlÚZeÚZ^ÚZWÚZPÚZIÚZBÚZ;ÚZ4ÚZ-ÚZ&ÚZÚZÚZÚZ ÚZÚZüÙZõÙZîÙZçÙZàÙZÙÙZÒÙZËÙZÄÙZ½ÙZ¶ÙZ¯ÙZ¨ÙZ¡ÙZšÙZ“ÙZŒÙZ…ÙZ~ÙZwÙZpÙZiÙZbÙZ[ÙZTÙZMÙZFÙZ?ÙZ8ÙZ1ÙZ*ÙZ#ÙZÙZÙZÙZÙZÙZùØZòØZëØZäØZÝØZÖØZÏØZÈØZÁØZºØZ³ØZ¬ØZ¥ØZžØZ—ØZØZ‰ØZ‚ØZ{ØZtØZmØZfØZ_ØZXØZQØZJØZCØZ<ØZ5ØZ.ØZ'ØZ ØZØZØZ ØZØZý×Zö×Zï×Zè×Zá×ZÚ×ZÓ×ZÌ×ZÅ×Z¾×Z·×Z°×Z©×Z¢×Z›×Z”×Z×Z†×Z×Zx×Zq×Zj×Zc×Z\×ZU×ZN×ZG×Z@×Z9×Z2×Z+×Z$×Z×Z×Z×Z×Z×ZúÖZóÖZìÖZåÖZÞÖZ×ÖZÐÖZÉÖZÂÖZ»ÖZ´ÖZ­ÖZ¦ÖZŸÖZ˜ÖZ‘ÖZŠÖZƒÖZ|ÖZuÖZnÖZgÖZ`ÖZYÖZRÖZKÖZDÖZ=ÖZ6ÖZ/ÖZ(ÖZ!ÖZÖZÖZ ÖZÖZþÕZ÷ÕZðÕZéÕZâÕZÛÕZÔÕZÍÕZÆÕZ¿ÕZ¸ÕZ±ÕZªÕZ£ÕZœÕZ•ÕZŽÕZ‡ÕZ€ÕZyÕZrÕZkÕZdÕZ]ÕZVÕZOÕZHÕZAÕZ:ÕZ3ÕZ,ÕZ%ÕZÕZÕZÕZ ÕZÕZûÔZôÔZíÔZæÔZßÔZØÔZÑÔZÊÔZÃÔZ¼ÔZµÔZ®ÔZ§ÔZ ÔZ™ÔZ’ÔZ‹ÔZ„ÔZ}ÔZvÔZoÔZhÔZaÔZZÔZSÔZLÔZEÔZ>ÔZ7ÔZ0ÔZ)ÔZ"ÔZÔZÔZ ÔZÔZÿÓZøÓZñÓZêÓZãÓZÜÓZÕÓZÎÓZÇÓZÀÓZ¹ÓZ²ÓZ«ÓZ¤ÓZÓZ–ÓZÓZˆÓZÓZzÓZsÓZlÓZeÓZ^ÓZWÓZPÓZIÓZBÓZ;ÓZ4ÓZ-ÓZ&ÓZÓZÓZÓZ ÓZÓZüÒZõÒZîÒZçÒZàÒZÙÒZÒÒZËÒZÄÒZ½ÒZ¶ÒZ¯ÒZ¨ÒZ¡ÒZšÒZ“ÒZŒÒZ…ÒZ~ÒZwÒZpÒZiÒZbÒZ[ÒZTÒZMÒZFÒZ?ÒZ8ÒZ1ÒZ*ÒZ#ÒZÒZÒZÒZÒZÒZùÑZòÑZëÑZäÑZÝÑZÖÑZÏÑZÈÑZÁÑZºÑZ³ÑZ¬ÑZ¥ÑZžÑZ—ÑZÑZ‰ÑZ‚ÑZ{ÑZtÑZmÑZfÑZ_ÑZXÑZQÑZJÑZCÑZ<ÑZ5ÑZ.ÑZ'ÑZ ÑZÑZÑZ ÑZÑZýÐZöÐZïÐZèÐZáÐZÚÐZÓÐZÌÐZÅÐZ¾ÐZ·ÐZ°ÐZ©ÐZ¢ÐZ›ÐZ”ÐZÐZ†ÐZÐZxÐZqÐZjÐZcÐZ\ÐZUÐZNÐZGÐZ@ÐZ9ÐZ2ÐZ+ÐZ$ÐZÐZÐZÐZÐZÐZúÏZóÏZìÏZåÏZÞÏZ×ÏZÐÏZÉÏZÂÏZ»ÏZ´ÏZ­ÏZ¦ÏZŸÏZ˜ÏZ‘ÏZŠÏZƒÏZ|ÏZuÏZnÏZgÏZ`ÏZYÏZRÏZKÏZDÏZ=ÏZ6ÏZ/ÏZ(ÏZ!ÏZÏZÏZ ÏZÏZþÎZ÷ÎZðÎZéÎZâÎZÛÎZÔÎZÍÎZÆÎZ¿ÎZ¸ÎZ±ÎZªÎZ£ÎZœÎZ•ÎZŽÎZ‡ÎZ€ÎZyÎZrÎZkÎZdÎZ]ÎZVÎZOÎZHÎZAÎZ:ÎZ3ÎZ,ÎZ%ÎZÎZÎZÎZ ÎZÎZûÍZôÍZíÍZæÍZßÍZØÍZÑÍZÊÍZÃÍZ¼ÍZµÍZ®ÍZ§ÍZ ÍZ™ÍZ’ÍZ‹ÍZ„ÍZ}ÍZvÍZoÍZhÍZaÍZZÍZSÍZLÍZEÍZ>ÍZ7ÍZ0ÍZ)ÍZ"ÍZÍZÍZ ÍZÍZÿÌZøÌZñÌZêÌZãÌZÜÌZÕÌZÎÌZÇÌZÀÌZ¹ÌZ²ÌZ«ÌZ¤ÌZÌZ–ÌZÌZˆÌZÌZzÌZsÌZlÌZeÌZ^ÌZWÌZPÌZIÌZBÌZ;ÌZ4ÌZ-ÌZ&ÌZÌZÌZÌZ ÌZÌZüËZõËZîËZçËZàËZÙËZÒËZËËZÄËZ½ËZ¶ËZ¯ËZ¨ËZ¡ËZšËZ“ËZŒËZ…ËZ~ËZwËZpËZiËZbËZ[ËZTËZMËZFËZ?ËZ8ËZ1ËZ*ËZ#ËZËZËZËZËZËZùÊZòÊZëÊZäÊZÝÊZÖÊZÏÊZÈÊZÁÊZºÊZ³ÊZ¬ÊZ¥ÊZžÊZ—ÊZÊZ‰ÊZ‚ÊZ{ÊZtÊZmÊZfÊZ_ÊZXÊZQÊZJÊZCÊZ<ÊZ5ÊZ.ÊZ'ÊZ ÊZÊZÊZ ÊZÊZýÉZöÉZïÉZèÉZáÉZÚÉZÓÉZÌÉZÅÉZ¾ÉZ·ÉZ°ÉZ©ÉZ¢ÉZ›ÉZ”ÉZÉZ†ÉZÉZxÉZqÉZjÉZcÉZ\ÉZUÉZNÉZGÉZ@ÉZ9ÉZ2ÉZ+ÉZ$ÉZÉZÉZÉZÉZÉZúÈZóÈZìÈZåÈZÞÈZ×ÈZÐÈZÉÈZÂÈZ»ÈZ´ÈZ­ÈZ¦ÈZŸÈZ˜ÈZ‘ÈZŠÈZƒÈZ|ÈZuÈZnÈZgÈZ`ÈZYÈZRÈZKÈZDÈZ=ÈZ6ÈZ/ÈZ(ÈZ!ÈZÈZÈZ ÈZÈZþÇZ÷ÇZðÇZéÇZâÇZÛÇZÔÇZÍÇZÆÇZ¿ÇZ¸ÇZ±ÇZªÇZ£ÇZœÇZ•ÇZŽÇZ‡ÇZ€ÇZyÇZrÇZkÇZdÇZ]ÇZVÇZOÇZHÇZAÇZ:ÇZ3ÇZ,ÇZ%ÇZÇZÇZÇZ ÇZÇZûÆZôÆZíÆZæÆZ߯ZØÆZÑÆZÊÆZÃÆZ¼ÆZµÆZ®ÆZ§ÆZ ÆZ™ÆZ’ÆZ‹ÆZ„ÆZ}ÆZvÆZoÆZhÆZaÆZZÆZSÆZLÆZEÆZ>ÆZ7ÆZ0ÆZ)ÆZ"ÆZÆZÆZ ÆZÆZÿÅZøÅZñÅZêÅZãÅZÜÅZÕÅZÎÅZÇÅZÀÅZ¹ÅZ²ÅZ«ÅZ¤ÅZÅZ–ÅZÅZˆÅZÅZzÅZsÅZlÅZeÅZ^ÅZWÅZPÅZIÅZBÅZ;ÅZ4ÅZ-ÅZ&ÅZÅZÅZÅZ ÅZÅZüÄZõÄZîÄZçÄZàÄZÙÄZÒÄZËÄZÄÄZ½ÄZ¶ÄZ¯ÄZ¨ÄZ¡ÄZšÄZ“ÄZŒÄZ…ÄZ~ÄZwÄZpÄZiÄZbÄZ[ÄZTÄZMÄZFÄZ?ÄZ8ÄZ1ÄZ*ÄZ#ÄZÄZÄZÄZÄZÄZùÃZòÃZëÃZäÃZÝÃZÖÃZÏÃZÈÃZÁÃZºÃZ³ÃZ¬ÃZ¥ÃZžÃZ—ÃZÃZ‰ÃZ‚ÃZ{ÃZtÃZmÃZfÃZ_ÃZXÃZQÃZJÃZCÃZ<ÃZ5ÃZ.ÃZ'ÃZ ÃZÃZÃZ ÃZÃZýÂZöÂZïÂZèÂZáÂZÚÂZÓÂZÌÂZÅÂZ¾ÂZ·ÂZ°ÂZ©ÂZ¢ÂZ›ÂZ”ÂZÂZ†ÂZÂZxÂZqÂZjÂZcÂZ\ÂZUÂZNÂZGÂZ@ÂZ9ÂZ2ÂZ+ÂZ$ÂZÂZÂZÂZÂZÂZúÁZóÁZìÁZåÁZÞÁZ×ÁZÐÁZÉÁZÂÁZ»ÁZ´ÁZ­ÁZ¦ÁZŸÁZ˜ÁZ‘ÁZŠÁZƒÁZ|ÁZuÁZnÁZgÁZ`ÁZYÁZRÁZKÁZDÁZ=ÁZ6ÁZ/ÁZ(ÁZ!ÁZÁZÁZ ÁZÁZþÀZ÷ÀZðÀZéÀZâÀZÛÀZÔÀZÍÀZÆÀZ¿ÀZ¸ÀZ±ÀZªÀZ£ÀZœÀZ•ÀZŽÀZ‡ÀZ€ÀZyÀZrÀZkÀZdÀZ]ÀZVÀZOÀZHÀZAÀZ:ÀZ3ÀZ,ÀZ%ÀZÀZÀZÀZ ÀZÀZû¿Zô¿Zí¿Zæ¿Zß¿ZØ¿ZÑ¿ZÊ¿ZÿZ¼¿Zµ¿Z®¿Z§¿Z ¿Z™¿Z’¿Z‹¿Z„¿Z}¿Zv¿Zo¿Zh¿Za¿ZZ¿ZS¿ZL¿ZE¿Z>¿Z7¿Z0¿Z)¿Z"¿Z¿Z¿Z ¿Z¿Zÿ¾Zø¾Zñ¾Zê¾Zã¾ZܾZÕ¾ZξZǾZÀ¾Z¹¾Z²¾Z«¾Z¤¾Z¾Z–¾Z¾Zˆ¾Z¾Zz¾Zs¾Zl¾Ze¾Z^¾ZW¾ZP¾ZI¾ZB¾Z;¾Z4¾Z-¾Z&¾Z¾Z¾Z¾Z ¾Z¾Zü½Zõ½Zî½Zç½Zà½ZÙ½ZÒ½Z˽ZĽZ½½Z¶½Z¯½Z¨½Z¡½Zš½Z“½ZŒ½Z…½Z~½Zw½Zp½Zi½Zb½Z[½ZT½ZM½ZF½Z?½Z8½Z1½Z*½Z#½Z½Z½Z½Z½Z½Zù¼Zò¼Zë¼Zä¼ZݼZÖ¼ZϼZȼZÁ¼Zº¼Z³¼Z¬¼Z¥¼Zž¼Z—¼Z¼Z‰¼Z‚¼Z{¼Zt¼Zm¼Zf¼Z_¼ZX¼ZQ¼ZJ¼ZC¼Z<¼Z5¼Z.¼Z'¼Z ¼Z¼Z¼Z ¼Z¼Zý»Zö»Zï»Zè»Zá»ZÚ»ZÓ»ZÌ»ZÅ»Z¾»Z·»Z°»Z©»Z¢»Z›»Z”»Z»Z†»Z»Zx»Zq»Zj»Zc»Z\»ZU»ZN»ZG»Z@»Z9»Z2»Z+»Z$»Z»Z»Z»Z»Z»ZúºZóºZìºZåºZÞºZ׺ZкZɺZºZ»ºZ´ºZ­ºZ¦ºZŸºZ˜ºZ‘ºZŠºZƒºZ|ºZuºZnºZgºZ`ºZYºZRºZKºZDºZ=ºZ6ºZ/ºZ(ºZ!ºZºZºZ ºZºZþ¹Z÷¹Zð¹Zé¹Zâ¹ZÛ¹ZÔ¹Z͹ZƹZ¿¹Z¸¹Z±¹Zª¹Z£¹Zœ¹Z•¹Z޹Z‡¹Z€¹Zy¹Zr¹Zk¹Zd¹Z]¹ZV¹ZO¹ZH¹ZA¹Z:¹Z3¹Z,¹Z%¹Z¹Z¹Z¹Z ¹Z¹Zû¸Zô¸Zí¸Zæ¸Z߸ZظZѸZʸZøZ¼¸Zµ¸Z®¸Z§¸Z ¸Z™¸Z’¸Z‹¸Z„¸Z}¸Zv¸Zo¸Zh¸Za¸ZZ¸ZS¸ZL¸ZE¸Z>¸Z7¸Z0¸Z)¸Z"¸Z¸Z¸Z ¸Z¸Zÿ·Zø·Zñ·Zê·Zã·ZÜ·ZÕ·ZηZÇ·ZÀ·Z¹·Z²·Z«·Z¤·Z·Z–·Z·Zˆ·Z·Zz·Zs·Zl·Ze·Z^·ZW·ZP·ZI·ZB·Z;·Z4·Z-·Z&·Z·Z·Z·Z ·Z·Zü¶Zõ¶Zî¶Zç¶Zà¶ZÙ¶ZÒ¶Z˶ZĶZ½¶Z¶¶Z¯¶Z¨¶Z¡¶Zš¶Z“¶ZŒ¶Z…¶Z~¶Zw¶Zp¶Zi¶Zb¶Z[¶ZT¶ZM¶ZF¶Z?¶Z8¶Z1¶Z*¶Z#¶Z¶Z¶Z¶Z¶Z¶ZùµZòµZëµZäµZݵZÖµZϵZȵZÁµZºµZ³µZ¬µZ¥µZžµZ—µZµZ‰µZ‚µZ{µZtµZmµZfµZ_µZXµZQµZJµZCµZ<µZ5µZ.µZ'µZ µZµZµZ µZµZý´Zö´Zï´Zè´Zá´ZÚ´ZÓ´ZÌ´ZÅ´Z¾´Z·´Z°´Z©´Z¢´Z›´Z”´Z´Z†´Z´Zx´Zq´Zj´Zc´Z\´ZU´ZN´ZG´Z@´Z9´Z2´Z+´Z$´Z´Z´Z´Z´Z´Zú³Zó³Zì³Zå³ZÞ³Z׳ZгZɳZ³Z»³Z´³Z­³Z¦³ZŸ³Z˜³Z‘³ZгZƒ³Z|³Zu³Zn³Zg³Z`³ZY³ZR³ZK³ZD³Z=³Z6³Z/³Z(³Z!³Z³Z³Z ³Z³Zþ²Z÷²Zð²Zé²Zâ²ZÛ²ZÔ²ZͲZƲZ¿²Z¸²Z±²Zª²Z£²Zœ²Z•²Z޲Z‡²Z€²Zy²Zr²Zk²Zd²Z]²ZV²ZO²ZH²ZA²Z:²Z3²Z,²Z%²Z²Z²Z²Z ²Z²Zû±Zô±Zí±Zæ±Zß±ZرZѱZʱZñZ¼±Zµ±Z®±Z§±Z ±Z™±Z’±Z‹±Z„±Z}±Zv±Zo±Zh±Za±ZZ±ZS±ZL±ZE±Z>±Z7±Z0±Z)±Z"±Z±Z±Z ±Z±Zÿ°Zø°Zñ°Zê°Zã°ZܰZÕ°ZΰZǰZÀ°Z¹°Z²°Z«°Z¤°Z°Z–°Z°Zˆ°Z°Zz°Zs°Zl°Ze°Z^°ZW°ZP°ZI°ZB°Z;°Z4°Z-°Z&°Z°Z°Z°Z °Z°Zü¯Zõ¯Zî¯Zç¯Zà¯ZÙ¯ZÒ¯Z˯ZįZ½¯Z¶¯Z¯¯Z¨¯Z¡¯Zš¯Z“¯ZŒ¯Z…¯Z~¯Zw¯Zp¯Zi¯Zb¯Z[¯ZT¯ZM¯ZF¯Z?¯Z8¯Z1¯Z*¯Z#¯Z¯Z¯Z¯Z¯Z¯Zù®Zò®Zë®Zä®ZÝ®ZÖ®ZÏ®ZÈ®ZÁ®Zº®Z³®Z¬®Z¥®Zž®Z—®Z®Z‰®Z‚®Z{®Zt®Zm®Zf®Z_®ZX®ZQ®ZJ®ZC®Z<®Z5®Z.®Z'®Z ®Z®Z®Z ®Z®Zý­Zö­Zï­Zè­Zá­ZÚ­ZÓ­ZÌ­ZÅ­Z¾­Z·­Z°­Z©­Z¢­Z›­Z”­Z­Z†­Z­Zx­Zq­Zj­Zc­Z\­ZU­ZN­ZG­Z@­Z9­Z2­Z+­Z$­Z­Z­Z­Z­Z­Zú¬Zó¬Zì¬Zå¬ZÞ¬Z׬ZЬZɬZ¬Z»¬Z´¬Z­¬Z¦¬ZŸ¬Z˜¬Z‘¬ZЬZƒ¬Z|¬Zu¬Zn¬Zg¬Z`¬ZY¬ZR¬ZK¬ZD¬Z=¬Z6¬Z/¬Z(¬Z!¬Z¬Z¬Z ¬Z¬Zþ«Z÷«Zð«Zé«Zâ«ZÛ«ZÔ«ZÍ«ZÆ«Z¿«Z¸«Z±«Zª«Z£«Zœ«Z•«ZŽ«Z‡«Z€«Zy«Zr«Zk«Zd«Z]«ZV«ZO«ZH«ZA«Z:«Z3«Z,«Z%«Z«Z«Z«Z «Z«ZûªZôªZíªZæªZߪZتZѪZʪZêZ¼ªZµªZ®ªZ§ªZ ªZ™ªZ’ªZ‹ªZ„ªZ}ªZvªZoªZhªZaªZZªZSªZLªZEªZ>ªZ7ªZ0ªZ)ªZ"ªZªZªZ ªZªZÿ©Zø©Zñ©Zê©Zã©ZÜ©ZÕ©ZΩZÇ©ZÀ©Z¹©Z²©Z«©Z¤©Z©Z–©Z©Zˆ©Z©Zz©Zs©Zl©Ze©Z^©ZW©ZP©ZI©ZB©Z;©Z4©Z-©Z&©Z©Z©Z©Z ©Z©Zü¨Zõ¨Zî¨Zç¨Zà¨ZÙ¨ZÒ¨Z˨ZĨZ½¨Z¶¨Z¯¨Z¨¨Z¡¨Zš¨Z“¨ZŒ¨Z…¨Z~¨Zw¨Zp¨Zi¨Zb¨Z[¨ZT¨ZM¨ZF¨Z?¨Z8¨Z1¨Z*¨Z#¨Z¨Z¨Z¨Z¨Z¨Zù§Zò§Zë§Zä§ZݧZÖ§ZϧZȧZÁ§Zº§Z³§Z¬§Z¥§Zž§Z—§Z§Z‰§Z‚§Z{§Zt§Zm§Zf§Z_§ZX§ZQ§ZJ§ZC§Z<§Z5§Z.§Z'§Z §Z§Z§Z §Z§Zý¦Zö¦Zï¦Zè¦Zá¦ZÚ¦ZÓ¦Z̦ZŦZ¾¦Z·¦Z°¦Z©¦Z¢¦Z›¦Z”¦Z¦Z†¦Z¦Zx¦Zq¦Zj¦Zc¦Z\¦ZU¦ZN¦ZG¦Z@¦Z9¦Z2¦Z+¦Z$¦Z¦Z¦Z¦Z¦Z¦Zú¥Zó¥Zì¥Zå¥ZÞ¥Z×¥ZÐ¥ZÉ¥ZÂ¥Z»¥Z´¥Z­¥Z¦¥ZŸ¥Z˜¥Z‘¥ZŠ¥Zƒ¥Z|¥Zu¥Zn¥Zg¥Z`¥ZY¥ZR¥ZK¥ZD¥Z=¥Z6¥Z/¥Z(¥Z!¥Z¥Z¥Z ¥Z¥Zþ¤Z÷¤Zð¤Zé¤Zâ¤ZÛ¤ZÔ¤ZͤZƤZ¿¤Z¸¤Z±¤Zª¤Z£¤Zœ¤Z•¤ZޤZ‡¤Z€¤Zy¤Zr¤Zk¤Zd¤Z]¤ZV¤ZO¤ZH¤ZA¤Z:¤Z3¤Z,¤Z%¤Z¤Z¤Z¤Z ¤Z¤Zû£Zô£Zí£Zæ£ZߣZØ£ZÑ£ZÊ£ZãZ¼£Zµ£Z®£Z§£Z £Z™£Z’£Z‹£Z„£Z}£Zv£Zo£Zh£Za£ZZ£ZS£ZL£ZE£Z>£Z7£Z0£Z)£Z"£Z£Z£Z £Z£Zÿ¢Zø¢Zñ¢Zê¢Zã¢ZÜ¢ZÕ¢Z΢ZÇ¢ZÀ¢Z¹¢Z²¢Z«¢Z¤¢Z¢Z–¢Z¢Zˆ¢Z¢Zz¢Zs¢Zl¢Ze¢Z^¢ZW¢ZP¢ZI¢ZB¢Z;¢Z4¢Z-¢Z&¢Z¢Z¢Z¢Z ¢Z¢Zü¡Zõ¡Zî¡Zç¡Zà¡ZÙ¡ZÒ¡ZË¡ZÄ¡Z½¡Z¶¡Z¯¡Z¨¡Z¡¡Zš¡Z“¡ZŒ¡Z…¡Z~¡Zw¡Zp¡Zi¡Zb¡Z[¡ZT¡ZM¡ZF¡Z?¡Z8¡Z1¡Z*¡Z#¡Z¡Z¡Z¡Z¡Z¡Zù Zò Zë Zä ZÝ ZÖ ZÏ ZÈ ZÁ Zº Z³ Z¬ Z¥ Zž Z— Z Z‰ Z‚ Z{ Zt Zm Zf Z_ ZX ZQ ZJ ZC Z< Z5 Z. Z' Z  Z Z Z  Z ZýŸZöŸZïŸZèŸZáŸZÚŸZÓŸZÌŸZÅŸZ¾ŸZ·ŸZ°ŸZ©ŸZ¢ŸZ›ŸZ”ŸZŸZ†ŸZŸZxŸZqŸZjŸZcŸZ\ŸZUŸZNŸZGŸZ@ŸZ9ŸZ2ŸZ+ŸZ$ŸZŸZŸZŸZŸZŸZúžZóžZìžZåžZÞžZמZОZÉžZžZ»žZ´žZ­žZ¦žZŸžZ˜žZ‘žZŠžZƒžZ|žZužZnžZgžZ`žZYžZRžZKžZDžZ=žZ6žZ/žZ(žZ!žZžZžZ žZžZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûœZôœZíœZæœZßœZØœZÑœZÊœZÜZ¼œZµœZ®œZ§œZ œZ™œZ’œZ‹œZ„œZ}œZvœZoœZhœZaœZZœZSœZLœZEœZ>œZ7œZ0œZ)œZ"œZœZœZ œZœZÿ›Zø›Zñ›Zê›Zã›ZÜ›ZÕ›ZΛZÇ›ZÀ›Z¹›Z²›Z«›Z¤›Z›Z–›Z›Zˆ›Z›Zz›Zs›Zl›Ze›Z^›ZW›ZP›ZI›ZB›Z;›Z4›Z-›Z&›Z›Z›Z›Z ›Z›ZüšZõšZîšZçšZàšZÙšZÒšZËšZÄšZ½šZ¶šZ¯šZ¨šZ¡šZššZ“šZŒšZ…šZ~šZwšZpšZišZbšZ[šZTšZMšZFšZ?šZ8šZ1šZ*šZ#šZšZšZšZšZšZù™Zò™Zë™Zä™ZÝ™ZÖ™ZÏ™ZÈ™ZÁ™Zº™Z³™Z¬™Z¥™Zž™Z—™Z™Z‰™Z‚™Z{™Zt™Zm™Zf™Z_™ZX™ZQ™ZJ™ZC™Z<™Z5™Z.™Z'™Z ™Z™Z™Z ™Z™Zý˜Zö˜Zï˜Zè˜Zá˜ZÚ˜ZÓ˜Z̘ZŘZ¾˜Z·˜Z°˜Z©˜Z¢˜Z›˜Z”˜Z˜Z†˜Z˜Zx˜Zq˜Zj˜Zc˜Z\˜ZU˜ZN˜ZG˜Z@˜Z9˜Z2˜Z+˜Z$˜Z˜Z˜Z˜Z˜Z˜Zú—Zó—Zì—Zå—ZÞ—Z×—ZЗZÉ—Z—Z»—Z´—Z­—Z¦—ZŸ—Z˜—Z‘—ZŠ—Zƒ—Z|—Zu—Zn—Zg—Z`—ZY—ZR—ZK—ZD—Z=—Z6—Z/—Z(—Z!—Z—Z—Z —Z—Zþ–Z÷–Zð–Zé–Zâ–ZÛ–ZÔ–ZÍ–ZÆ–Z¿–Z¸–Z±–Zª–Z£–Zœ–Z•–ZŽ–Z‡–Z€–Zy–Zr–Zk–Zd–Z]–ZV–ZO–ZH–ZA–Z:–Z3–Z,–Z%–Z–Z–Z–Z –Z–Zû•Zô•Zí•Zæ•Zß•ZØ•ZÑ•ZÊ•ZÕZ¼•Zµ•Z®•Z§•Z •Z™•Z’•Z‹•Z„•Z}•Zv•Zo•Zh•Za•ZZ•ZS•ZL•ZE•Z>•Z7•Z0•Z)•Z"•Z•Z•Z •Z•Zÿ”Zø”Zñ”Zê”Zã”ZÜ”ZÕ”ZΔZÇ”ZÀ”Z¹”Z²”Z«”Z¤”Z”Z–”Z”Zˆ”Z”Zz”Zs”Zl”Ze”Z^”ZW”ZP”ZI”ZB”Z;”Z4”Z-”Z&”Z”Z”Z”Z ”Z”Zü“Zõ“Zî“Zç“Zà“ZÙ“ZÒ“ZË“ZÄ“Z½“Z¶“Z¯“Z¨“Z¡“Zš“Z““ZŒ“Z…“Z~“Zw“Zp“Zi“Zb“Z[“ZT“ZM“ZF“Z?“Z8“Z1“Z*“Z#“Z“Z“Z“Z“Z“Zù’Zò’Zë’Zä’ZÝ’ZÖ’ZÏ’ZÈ’ZÁ’Zº’Z³’Z¬’Z¥’Zž’Z—’Z’Z‰’Z‚’Z{’Zt’Zm’Zf’Z_’ZX’ZQ’ZJ’ZC’Z<’Z5’Z.’Z'’Z ’Z’Z’Z ’Z’Zý‘Zö‘Zï‘Zè‘Zá‘ZÚ‘ZÓ‘ZÌ‘ZÅ‘Z¾‘Z·‘Z°‘Z©‘Z¢‘Z›‘Z”‘Z‘Z†‘Z‘Zx‘Zq‘Zj‘Zc‘Z\‘ZU‘ZN‘ZG‘Z@‘Z9‘Z2‘Z+‘Z$‘Z‘Z‘Z‘Z‘Z‘ZúZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûŽZôŽZíŽZæŽZߎZØŽZÑŽZÊŽZÃŽZ¼ŽZµŽZ®ŽZ§ŽZ ŽZ™ŽZ’ŽZ‹ŽZ„ŽZ}ŽZvŽZoŽZhŽZaŽZZŽZSŽZLŽZEŽZ>ŽZ7ŽZ0ŽZ)ŽZ"ŽZŽZŽZ ŽZŽZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüŒZõŒZîŒZçŒZàŒZÙŒZÒŒZËŒZÄŒZ½ŒZ¶ŒZ¯ŒZ¨ŒZ¡ŒZšŒZ“ŒZŒŒZ…ŒZ~ŒZwŒZpŒZiŒZbŒZ[ŒZTŒZMŒZFŒZ?ŒZ8ŒZ1ŒZ*ŒZ#ŒZŒZŒZŒZŒZŒZù‹Zò‹Zë‹Zä‹ZÝ‹ZÖ‹ZÏ‹ZÈ‹ZÁ‹Zº‹Z³‹Z¬‹Z¥‹Zž‹Z—‹Z‹Z‰‹Z‚‹Z{‹Zt‹Zm‹Zf‹Z_‹ZX‹ZQ‹ZJ‹ZC‹Z<‹Z5‹Z.‹Z'‹Z ‹Z‹Z‹Z ‹Z‹ZýŠZöŠZïŠZèŠZáŠZÚŠZÓŠZÌŠZÅŠZ¾ŠZ·ŠZ°ŠZ©ŠZ¢ŠZ›ŠZ”ŠZŠZ†ŠZŠZxŠZqŠZjŠZcŠZ\ŠZUŠZNŠZGŠZ@ŠZ9ŠZ2ŠZ+ŠZ$ŠZŠZŠZŠZŠZŠZú‰Zó‰Zì‰Zå‰ZÞ‰Z׉ZЉZɉZ‰Z»‰Z´‰Z­‰Z¦‰ZŸ‰Z˜‰Z‘‰ZЉZƒ‰Z|‰Zu‰Zn‰Zg‰Z`‰ZY‰ZR‰ZK‰ZD‰Z=‰Z6‰Z/‰Z(‰Z!‰Z‰Z‰Z ‰Z‰ZþˆZ÷ˆZðˆZéˆZâˆZÛˆZÔˆZ͈ZƈZ¿ˆZ¸ˆZ±ˆZªˆZ£ˆZœˆZ•ˆZŽˆZ‡ˆZ€ˆZyˆZrˆZkˆZdˆZ]ˆZVˆZOˆZHˆZAˆZ:ˆZ3ˆZ,ˆZ%ˆZˆZˆZˆZ ˆZˆZû‡Zô‡Zí‡Zæ‡Z߇Z؇ZчZʇZÇZ¼‡Zµ‡Z®‡Z§‡Z ‡Z™‡Z’‡Z‹‡Z„‡Z}‡Zv‡Zo‡Zh‡Za‡ZZ‡ZS‡ZL‡ZE‡Z>‡Z7‡Z0‡Z)‡Z"‡Z‡Z‡Z ‡Z‡Zÿ†Zø†Zñ†Zê†Zã†Z܆ZÕ†ZΆZdžZÀ†Z¹†Z²†Z«†Z¤†Z†Z–†Z†Zˆ†Z†Zz†Zs†Zl†Ze†Z^†ZW†ZP†ZI†ZB†Z;†Z4†Z-†Z&†Z†Z†Z†Z †Z†Zü…Zõ…Zî…Zç…Zà…ZÙ…ZÒ…ZË…ZÄ…Z½…Z¶…Z¯…Z¨…Z¡…Zš…Z“…ZŒ…Z……Z~…Zw…Zp…Zi…Zb…Z[…ZT…ZM…ZF…Z?…Z8…Z1…Z*…Z#…Z…Z…Z…Z…Z…Zù„Zò„Zë„Zä„ZÝ„ZÖ„ZÏ„ZÈ„ZÁ„Zº„Z³„Z¬„Z¥„Zž„Z—„Z„Z‰„Z‚„Z{„Zt„Zm„Zf„Z_„ZX„ZQ„ZJ„ZC„Z<„Z5„Z.„Z'„Z „Z„Z„Z „Z„ZýƒZöƒZïƒZèƒZáƒZÚƒZÓƒZ̃ZŃZ¾ƒZ·ƒZ°ƒZ©ƒZ¢ƒZ›ƒZ”ƒZƒZ†ƒZƒZxƒZqƒZjƒZcƒZ\ƒZUƒZNƒZGƒZ@ƒZ9ƒZ2ƒZ+ƒZ$ƒZƒZƒZƒZƒZƒZú‚Zó‚Zì‚Zå‚ZÞ‚ZׂZЂZÉ‚Z‚Z»‚Z´‚Z­‚Z¦‚ZŸ‚Z˜‚Z‘‚ZŠ‚Zƒ‚Z|‚Zu‚Zn‚Zg‚Z`‚ZY‚ZR‚ZK‚ZD‚Z=‚Z6‚Z/‚Z(‚Z!‚Z‚Z‚Z ‚Z‚ZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZû€Zô€Zí€Zæ€Z߀ZØ€ZÑ€ZÊ€ZÀZ¼€Zµ€Z®€Z§€Z €Z™€Z’€Z‹€Z„€Z}€Zv€Zo€Zh€Za€ZZ€ZS€ZL€ZE€Z>€Z7€Z0€Z)€Z"€Z€Z€Z €Z€ZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZü~Zõ~Zî~Zç~Zà~ZÙ~ZÒ~ZË~ZÄ~Z½~Z¶~Z¯~Z¨~Z¡~Zš~Z“~ZŒ~Z…~Z~~Zw~Zp~Zi~Zb~Z[~ZT~ZM~ZF~Z?~Z8~Z1~Z*~Z#~Z~Z~Z~Z~Z~Zù}Zò}Zë}Zä}ZÝ}ZÖ}ZÏ}ZÈ}ZÁ}Zº}Z³}Z¬}Z¥}Zž}Z—}Z}Z‰}Z‚}Z{}Zt}Zm}Zf}Z_}ZX}ZQ}ZJ}ZC}Z<}Z5}Z.}Z'}Z }Z}Z}Z }Z}Zý|Zö|Zï|Zè|Zá|ZÚ|ZÓ|ZÌ|ZÅ|Z¾|Z·|Z°|Z©|Z¢|Z›|Z”|Z|Z†|Z|Zx|Zq|Zj|Zc|Z\|ZU|ZN|ZG|Z@|Z9|Z2|Z+|Z$|Z|Z|Z|Z|Z|Zú{Zó{Zì{Zå{ZÞ{Z×{ZÐ{ZÉ{ZÂ{Z»{Z´{Z­{Z¦{ZŸ{Z˜{Z‘{ZŠ{Zƒ{Z|{Zu{Zn{Zg{Z`{ZY{ZR{ZK{ZD{Z={Z6{Z/{Z({Z!{Z{Z{Z {Z{ZþzZ÷zZðzZézZâzZÛzZÔzZÍzZÆzZ¿zZ¸zZ±zZªzZ£zZœzZ•zZŽzZ‡zZ€zZyzZrzZkzZdzZ]zZVzZOzZHzZAzZ:zZ3zZ,zZ%zZzZzZzZ zZzZûyZôyZíyZæyZßyZØyZÑyZÊyZÃyZ¼yZµyZ®yZ§yZ yZ™yZ’yZ‹yZ„yZ}yZvyZoyZhyZayZZyZSyZLyZEyZ>yZ7yZ0yZ)yZ"yZyZyZ yZyZÿxZøxZñxZêxZãxZÜxZÕxZÎxZÇxZÀxZ¹xZ²xZ«xZ¤xZxZ–xZxZˆxZxZzxZsxZlxZexZ^xZWxZPxZIxZBxZ;xZ4xZ-xZ&xZxZxZxZ xZxZüwZõwZîwZçwZàwZÙwZÒwZËwZÄwZ½wZ¶wZ¯wZ¨wZ¡wZšwZ“wZŒwZ…wZ~wZwwZpwZiwZbwZ[wZTwZMwZFwZ?wZ8wZ1wZ*wZ#wZwZwZwZwZwZùvZòvZëvZävZÝvZÖvZÏvZÈvZÁvZºvZ³vZ¬vZ¥vZžvZ—vZvZ‰vZ‚vZ{vZtvZmvZfvZ_vZXvZQvZJvZCvZrZ7rZ0rZ)rZ"rZrZrZ rZrZÿqZøqZñqZêqZãqZÜqZÕqZÎqZÇqZÀqZ¹qZ²qZ«qZ¤qZqZ–qZqZˆqZqZzqZsqZlqZeqZ^qZWqZPqZIqZBqZ;qZ4qZ-qZ&qZqZqZqZ qZqZüpZõpZîpZçpZàpZÙpZÒpZËpZÄpZ½pZ¶pZ¯pZ¨pZ¡pZšpZ“pZŒpZ…pZ~pZwpZppZipZbpZ[pZTpZMpZFpZ?pZ8pZ1pZ*pZ#pZpZpZpZpZpZùoZòoZëoZäoZÝoZÖoZÏoZÈoZÁoZºoZ³oZ¬oZ¥oZžoZ—oZoZ‰oZ‚oZ{oZtoZmoZfoZ_oZXoZQoZJoZCoZkZ7kZ0kZ)kZ"kZkZkZ kZkZÿjZøjZñjZêjZãjZÜjZÕjZÎjZÇjZÀjZ¹jZ²jZ«jZ¤jZjZ–jZjZˆjZjZzjZsjZljZejZ^jZWjZPjZIjZBjZ;jZ4jZ-jZ&jZjZjZjZ jZjZüiZõiZîiZçiZàiZÙiZÒiZËiZÄiZ½iZ¶iZ¯iZ¨iZ¡iZšiZ“iZŒiZ…iZ~iZwiZpiZiiZbiZ[iZTiZMiZFiZ?iZ8iZ1iZ*iZ#iZiZiZiZiZiZùhZòhZëhZähZÝhZÖhZÏhZÈhZÁhZºhZ³hZ¬hZ¥hZžhZ—hZhZ‰hZ‚hZ{hZthZmhZfhZ_hZXhZQhZJhZChZdZ7dZ0dZ)dZ"dZdZdZ dZdZÿcZøcZñcZêcZãcZÜcZÕcZÎcZÇcZÀcZ¹cZ²cZ«cZ¤cZcZ–cZcZˆcZcZzcZscZlcZecZ^cZWcZPcZIcZBcZ;cZ4cZ-cZ&cZcZcZcZ cZcZübZõbZîbZçbZàbZÙbZÒbZËbZÄbZ½bZ¶bZ¯bZ¨bZ¡bZšbZ“bZŒbZ…bZ~bZwbZpbZibZbbZ[bZTbZMbZFbZ?bZ8bZ1bZ*bZ#bZbZbZbZbZbZùaZòaZëaZäaZÝaZÖaZÏaZÈaZÁaZºaZ³aZ¬aZ¥aZžaZ—aZaZ‰aZ‚aZ{aZtaZmaZfaZ_aZXaZQaZJaZCaZ]Z7]Z0]Z)]Z"]Z]Z]Z ]Z]Zÿ\Zø\Zñ\Zê\Zã\ZÜ\ZÕ\ZÎ\ZÇ\ZÀ\Z¹\Z²\Z«\Z¤\Z\Z–\Z\Zˆ\Z\Zz\Zs\Zl\Ze\Z^\ZW\ZP\ZI\ZB\Z;\Z4\Z-\Z&\Z\Z\Z\Z \Z\Zü[Zõ[Zî[Zç[Zà[ZÙ[ZÒ[ZË[ZÄ[Z½[Z¶[Z¯[Z¨[Z¡[Zš[Z“[ZŒ[Z…[Z~[Zw[Zp[Zi[Zb[Z[[ZT[ZM[ZF[Z?[Z8[Z1[Z*[Z#[Z[Z[Z[Z[Z[ZùZZòZZëZZäZZÝZZÖZZÏZZÈZZÁZZºZZ³ZZ¬ZZ¥ZZžZZ—ZZZZ‰ZZ‚ZZ{ZZtZZmZZfZZ_ZZXZZQZZJZZCZZVZ7VZ0VZ)VZ"VZVZVZ VZVZÿUZøUZñUZêUZãUZÜUZÕUZÎUZÇUZÀUZ¹UZ²UZ«UZ¤UZUZ–UZUZˆUZUZzUZsUZlUZeUZ^UZWUZPUZIUZBUZ;UZ4UZ-UZ&UZUZUZUZ UZUZüTZõTZîTZçTZàTZÙTZÒTZËTZÄTZ½TZ¶TZ¯TZ¨TZ¡TZšTZ“TZŒTZ…TZ~TZwTZpTZiTZbTZ[TZTTZMTZFTZ?TZ8TZ1TZ*TZ#TZTZTZTZTZTZùSZòSZëSZäSZÝSZÖSZÏSZÈSZÁSZºSZ³SZ¬SZ¥SZžSZ—SZSZ‰SZ‚SZ{SZtSZmSZfSZ_SZXSZQSZJSZCSZOZ7OZ0OZ)OZ"OZOZOZ OZOZÿNZøNZñNZêNZãNZÜNZÕNZÎNZÇNZÀNZ¹NZ²NZ«NZ¤NZNZ–NZNZˆNZNZzNZsNZlNZeNZ^NZWNZPNZINZBNZ;NZ4NZ-NZ&NZNZNZNZ NZNZüMZõMZîMZçMZàMZÙMZÒMZËMZÄMZ½MZ¶MZ¯MZ¨MZ¡MZšMZ“MZŒMZ…MZ~MZwMZpMZiMZbMZ[MZTMZMMZFMZ?MZ8MZ1MZ*MZ#MZMZMZMZMZMZùLZòLZëLZäLZÝLZÖLZÏLZÈLZÁLZºLZ³LZ¬LZ¥LZžLZ—LZLZ‰LZ‚LZ{LZtLZmLZfLZ_LZXLZQLZJLZCLZHZ7HZ0HZ)HZ"HZHZHZ HZHZÿGZøGZñGZêGZãGZÜGZÕGZÎGZÇGZÀGZ¹GZ²GZ«GZ¤GZGZ–GZGZˆGZGZzGZsGZlGZeGZ^GZWGZPGZIGZBGZ;GZ4GZ-GZ&GZGZGZGZ GZGZüFZõFZîFZçFZàFZÙFZÒFZËFZÄFZ½FZ¶FZ¯FZ¨FZ¡FZšFZ“FZŒFZ…FZ~FZwFZpFZiFZbFZ[FZTFZMFZFFZ?FZ8FZ1FZ*FZ#FZFZFZFZFZFZùEZòEZëEZäEZÝEZÖEZÏEZÈEZÁEZºEZ³EZ¬EZ¥EZžEZ—EZEZ‰EZ‚EZ{EZtEZmEZfEZ_EZXEZQEZJEZCEZAZ7AZ0AZ)AZ"AZAZAZ AZAZÿ@Zø@Zñ@Zê@Zã@ZÜ@ZÕ@ZÎ@ZÇ@ZÀ@Z¹@Z²@Z«@Z¤@Z@Z–@Z@Zˆ@Z@Zz@Zs@Zl@Ze@Z^@ZW@ZP@ZI@ZB@Z;@Z4@Z-@Z&@Z@Z@Z@Z @Z@Zü?Zõ?Zî?Zç?Zà?ZÙ?ZÒ?ZË?ZÄ?Z½?Z¶?Z¯?Z¨?Z¡?Zš?Z“?ZŒ?Z…?Z~?Zw?Zp?Zi?Zb?Z[?ZT?ZM?ZF?Z??Z8?Z1?Z*?Z#?Z?Z?Z?Z?Z?Zù>Zò>Zë>Zä>ZÝ>ZÖ>ZÏ>ZÈ>ZÁ>Zº>Z³>Z¬>Z¥>Zž>Z—>Z>Z‰>Z‚>Z{>Zt>Zm>Zf>Z_>ZX>ZQ>ZJ>ZC>Z<>Z5>Z.>Z'>Z >Z>Z>Z >Z>Zý=Zö=Zï=Zè=Zá=ZÚ=ZÓ=ZÌ=ZÅ=Z¾=Z·=Z°=Z©=Z¢=Z›=Z”=Z=Z†=Z=Zx=Zq=Zj=Zc=Z\=ZU=ZN=ZG=Z@=Z9=Z2=Z+=Z$=Z=Z=Z=Z=Z=Zú:Z7:Z0:Z):Z":Z:Z:Z :Z:Zÿ9Zø9Zñ9Zê9Zã9ZÜ9ZÕ9ZÎ9ZÇ9ZÀ9Z¹9Z²9Z«9Z¤9Z9Z–9Z9Zˆ9Z9Zz9Zs9Zl9Ze9Z^9ZW9ZP9ZI9ZB9Z;9Z49Z-9Z&9Z9Z9Z9Z 9Z9Zü8Zõ8Zî8Zç8Zà8ZÙ8ZÒ8ZË8ZÄ8Z½8Z¶8Z¯8Z¨8Z¡8Zš8Z“8ZŒ8Z…8Z~8Zw8Zp8Zi8Zb8Z[8ZT8ZM8ZF8Z?8Z88Z18Z*8Z#8Z8Z8Z8Z8Z8Zù7Zò7Zë7Zä7ZÝ7ZÖ7ZÏ7ZÈ7ZÁ7Zº7Z³7Z¬7Z¥7Zž7Z—7Z7Z‰7Z‚7Z{7Zt7Zm7Zf7Z_7ZX7ZQ7ZJ7ZC7Z<7Z57Z.7Z'7Z 7Z7Z7Z 7Z7Zý6Zö6Zï6Zè6Zá6ZÚ6ZÓ6ZÌ6ZÅ6Z¾6Z·6Z°6Z©6Z¢6Z›6Z”6Z6Z†6Z6Zx6Zq6Zj6Zc6Z\6ZU6ZN6ZG6Z@6Z96Z26Z+6Z$6Z6Z6Z6Z6Z6Zú5Zó5Zì5Zå5ZÞ5Z×5ZÐ5ZÉ5ZÂ5Z»5Z´5Z­5Z¦5ZŸ5Z˜5Z‘5ZŠ5Zƒ5Z|5Zu5Zn5Zg5Z`5ZY5ZR5ZK5ZD5Z=5Z65Z/5Z(5Z!5Z5Z5Z 5Z5Zþ4Z÷4Zð4Zé4Zâ4ZÛ4ZÔ4ZÍ4ZÆ4Z¿4Z¸4Z±4Zª4Z£4Zœ4Z•4ZŽ4Z‡4Z€4Zy4Zr4Zk4Zd4Z]4ZV4ZO4ZH4ZA4Z:4Z34Z,4Z%4Z4Z4Z4Z 4Z4Zû3Zô3Zí3Zæ3Zß3ZØ3ZÑ3ZÊ3ZÃ3Z¼3Zµ3Z®3Z§3Z 3Z™3Z’3Z‹3Z„3Z}3Zv3Zo3Zh3Za3ZZ3ZS3ZL3ZE3Z>3Z73Z03Z)3Z"3Z3Z3Z 3Z3Zÿ2Zø2Zñ2Zê2Zã2ZÜ2ZÕ2ZÎ2ZÇ2ZÀ2Z¹2Z²2Z«2Z¤2Z2Z–2Z2Zˆ2Z2Zz2Zs2Zl2Ze2Z^2ZW2ZP2ZI2ZB2Z;2Z42Z-2Z&2Z2Z2Z2Z 2Z2Zü1Zõ1Zî1Zç1Zà1ZÙ1ZÒ1ZË1ZÄ1Z½1Z¶1Z¯1Z¨1Z¡1Zš1Z“1ZŒ1Z…1Z~1Zw1Zp1Zi1Zb1Z[1ZT1ZM1ZF1Z?1Z81Z11Z*1Z#1Z1Z1Z1Z1Z1Zù0Zò0Zë0Zä0ZÝ0ZÖ0ZÏ0ZÈ0ZÁ0Zº0Z³0Z¬0Z¥0Zž0Z—0Z0Z‰0Z‚0Z{0Zt0Zm0Zf0Z_0ZX0ZQ0ZJ0ZC0Z<0Z50Z.0Z'0Z 0Z0Z0Z 0Z0Zý/Zö/Zï/Zè/Zá/ZÚ/ZÓ/ZÌ/ZÅ/Z¾/Z·/Z°/Z©/Z¢/Z›/Z”/Z/Z†/Z/Zx/Zq/Zj/Zc/Z\/ZU/ZN/ZG/Z@/Z9/Z2/Z+/Z$/Z/Z/Z/Z/Z/Zú.Zó.Zì.Zå.ZÞ.Z×.ZÐ.ZÉ.ZÂ.Z».Z´.Z­.Z¦.ZŸ.Z˜.Z‘.ZŠ.Zƒ.Z|.Zu.Zn.Zg.Z`.ZY.ZR.ZK.ZD.Z=.Z6.Z/.Z(.Z!.Z.Z.Z .Z.Zþ-Z÷-Zð-Zé-Zâ-ZÛ-ZÔ-ZÍ-ZÆ-Z¿-Z¸-Z±-Zª-Z£-Zœ-Z•-ZŽ-Z‡-Z€-Zy-Zr-Zk-Zd-Z]-ZV-ZO-ZH-ZA-Z:-Z3-Z,-Z%-Z-Z-Z-Z -Z-Zû,Zô,Zí,Zæ,Zß,ZØ,ZÑ,ZÊ,ZÃ,Z¼,Zµ,Z®,Z§,Z ,Z™,Z’,Z‹,Z„,Z},Zv,Zo,Zh,Za,ZZ,ZS,ZL,ZE,Z>,Z7,Z0,Z),Z",Z,Z,Z ,Z,Zÿ+Zø+Zñ+Zê+Zã+ZÜ+ZÕ+ZÎ+ZÇ+ZÀ+Z¹+Z²+Z«+Z¤+Z+Z–+Z+Zˆ+Z+Zz+Zs+Zl+Ze+Z^+ZW+ZP+ZI+ZB+Z;+Z4+Z-+Z&+Z+Z+Z+Z +Z+Zü*Zõ*Zî*Zç*Zà*ZÙ*ZÒ*ZË*ZÄ*Z½*Z¶*Z¯*Z¨*Z¡*Zš*Z“*ZŒ*Z…*Z~*Zw*Zp*Zi*Zb*Z[*ZT*ZM*ZF*Z?*Z8*Z1*Z**Z#*Z*Z*Z*Z*Z*Zù)Zò)Zë)Zä)ZÝ)ZÖ)ZÏ)ZÈ)ZÁ)Zº)Z³)Z¬)Z¥)Zž)Z—)Z)Z‰)Z‚)Z{)Zt)Zm)Zf)Z_)ZX)ZQ)ZJ)ZC)Z<)Z5)Z.)Z')Z )Z)Z)Z )Z)Zý(Zö(Zï(Zè(Zá(ZÚ(ZÓ(ZÌ(ZÅ(Z¾(Z·(Z°(Z©(Z¢(Z›(Z”(Z(Z†(Z(Zx(Zq(Zj(Zc(Z\(ZU(ZN(ZG(Z@(Z9(Z2(Z+(Z$(Z(Z(Z(Z(Z(Zú'Zó'Zì'Zå'ZÞ'Z×'ZÐ'ZÉ'ZÂ'Z»'Z´'Z­'Z¦'ZŸ'Z˜'Z‘'ZŠ'Zƒ'Z|'Zu'Zn'Zg'Z`'ZY'ZR'ZK'ZD'Z='Z6'Z/'Z('Z!'Z'Z'Z 'Z'Zþ&Z÷&Zð&Zé&Zâ&ZÛ&ZÔ&ZÍ&ZÆ&Z¿&Z¸&Z±&Zª&Z£&Zœ&Z•&ZŽ&Z‡&Z€&Zy&Zr&Zk&Zd&Z]&ZV&ZO&ZH&ZA&Z:&Z3&Z,&Z%&Z&Z&Z&Z &Z&Zû%Zô%Zí%Zæ%Zß%ZØ%ZÑ%ZÊ%ZÃ%Z¼%Zµ%Z®%Z§%Z %Z™%Z’%Z‹%Z„%Z}%Zv%Zo%Zh%Za%ZZ%ZS%ZL%ZE%Z>%Z7%Z0%Z)%Z"%Z%Z%Z %Z%Zÿ$Zø$Zñ$Zê$Zã$ZÜ$ZÕ$ZÎ$ZÇ$ZÀ$Z¹$Z²$Z«$Z¤$Z$Z–$Z$Zˆ$Z$Zz$Zs$Zl$Ze$Z^$ZW$ZP$ZI$ZB$Z;$Z4$Z-$Z&$Z$Z$Z$Z $Z$Zü#Zõ#Zî#Zç#Zà#ZÙ#ZÒ#ZË#ZÄ#Z½#Z¶#Z¯#Z¨#Z¡#Zš#Z“#ZŒ#Z…#Z~#Zw#Zp#Zi#Zb#Z[#ZT#ZM#ZF#Z?#Z8#Z1#Z*#Z##Z#Z#Z#Z#Z#Zù"Zò"Zë"Zä"ZÝ"ZÖ"ZÏ"ZÈ"ZÁ"Zº"Z³"Z¬"Z¥"Zž"Z—"Z"Z‰"Z‚"Z{"Zt"Zm"Zf"Z_"ZX"ZQ"ZJ"ZC"Z<"Z5"Z."Z'"Z "Z"Z"Z "Z"Zý!Zö!Zï!Zè!Zá!ZÚ!ZÓ!ZÌ!ZÅ!Z¾!Z·!Z°!Z©!Z¢!Z›!Z”!Z!Z†!Z!Zx!Zq!Zj!Zc!Z\!ZU!ZN!ZG!Z@!Z9!Z2!Z+!Z$!Z!Z!Z!Z!Z!Zú Zó Zì Zå ZÞ Z× ZÐ ZÉ Z Z» Z´ Z­ Z¦ ZŸ Z˜ Z‘ ZŠ Zƒ Z| Zu Zn Zg Z` ZY ZR ZK ZD Z= Z6 Z/ Z( Z! Z Z Z Z ZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZù Zò Zë Zä ZÝ ZÖ ZÏ ZÈ ZÁ Zº Z³ Z¬ Z¥ Zž Z— Z Z‰ Z‚ Z{ Zt Zm Zf Z_ ZX ZQ ZJ ZC Z< Z5 Z. Z' Z Z Z Z Z Zý Zö Zï Zè Zá ZÚ ZÓ ZÌ ZÅ Z¾ Z· Z° Z© Z¢ Z› Z” Z Z† Z Zx Zq Zj Zc Z\ ZU ZN ZG Z@ Z9 Z2 Z+ Z$ Z Z Z Z Z Zú Zó Zì Zå ZÞ Z× ZÐ ZÉ Z Z» Z´ Z­ Z¦ ZŸ Z˜ Z‘ ZŠ Zƒ Z| Zu Zn Zg Z` ZY ZR ZK ZD Z= Z6 Z/ Z( Z! Z Z Z Z Zþ Z÷ Zð Zé Zâ ZÛ ZÔ ZÍ ZÆ Z¿ Z¸ Z± Zª Z£ Zœ Z• ZŽ Z‡ Z€ Zy Zr Zk Zd Z] ZV ZO ZH ZA Z: Z3 Z, Z% Z Z Z Z Z Zû Zô Zí Zæ Zß ZØ ZÑ ZÊ Zà Z¼ Zµ Z® Z§ Z  Z™ Z’ Z‹ Z„ Z} Zv Zo Zh Za ZZ ZS ZL ZE Z> Z7 Z0 Z) Z" Z Z Z Z ZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZ<Z5Z.Z'Z ZZZ ZZýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùÿYòÿYëÿYäÿYÝÿYÖÿYÏÿYÈÿYÁÿYºÿY³ÿY¬ÿY¥ÿYžÿY—ÿYÿY‰ÿY‚ÿY{ÿYtÿYmÿYfÿY_ÿYXÿYQÿYJÿYCÿY<ÿY5ÿY.ÿY'ÿY ÿYÿYÿY ÿYÿYýþYöþYïþYèþYáþYÚþYÓþYÌþYÅþY¾þY·þY°þY©þY¢þY›þY”þYþY†þYþYxþYqþYjþYcþY\þYUþYNþYGþY@þY9þY2þY+þY$þYþYþYþYþYþYúýYóýYìýYåýYÞýY×ýYÐýYÉýYÂýY»ýY´ýY­ýY¦ýYŸýY˜ýY‘ýYŠýYƒýY|ýYuýYnýYgýY`ýYYýYRýYKýYDýY=ýY6ýY/ýY(ýY!ýYýYýY ýYýYþüY÷üYðüYéüYâüYÛüYÔüYÍüYÆüY¿üY¸üY±üYªüY£üYœüY•üYŽüY‡üY€üYyüYrüYküYdüY]üYVüYOüYHüYAüY:üY3üY,üY%üYüYüYüY üYüYûûYôûYíûYæûYßûYØûYÑûYÊûYÃûY¼ûYµûY®ûY§ûY ûY™ûY’ûY‹ûY„ûY}ûYvûYoûYhûYaûYZûYSûYLûYEûY>ûY7ûY0ûY)ûY"ûYûYûY ûYûYÿúYøúYñúYêúYãúYÜúYÕúYÎúYÇúYÀúY¹úY²úY«úY¤úYúY–úYúYˆúYúYzúYsúYlúYeúY^úYWúYPúYIúYBúY;úY4úY-úY&úYúYúYúY úYúYüùYõùYîùYçùYàùYÙùYÒùYËùYÄùY½ùY¶ùY¯ùY¨ùY¡ùYšùY“ùYŒùY…ùY~ùYwùYpùYiùYbùY[ùYTùYMùYFùY?ùY8ùY1ùY*ùY#ùYùYùYùYùYùYùøYòøYëøYäøYÝøYÖøYÏøYÈøYÁøYºøY³øY¬øY¥øYžøY—øYøY‰øY‚øY{øYtøYmøYføY_øYXøYQøYJøYCøY<øY5øY.øY'øY øYøYøY øYøYý÷Yö÷Yï÷Yè÷Yá÷YÚ÷YÓ÷YÌ÷YÅ÷Y¾÷Y·÷Y°÷Y©÷Y¢÷Y›÷Y”÷Y÷Y†÷Y÷Yx÷Yq÷Yj÷Yc÷Y\÷YU÷YN÷YG÷Y@÷Y9÷Y2÷Y+÷Y$÷Y÷Y÷Y÷Y÷Y÷YúöYóöYìöYåöYÞöY×öYÐöYÉöYÂöY»öY´öY­öY¦öYŸöY˜öY‘öYŠöYƒöY|öYuöYnöYgöY`öYYöYRöYKöYDöY=öY6öY/öY(öY!öYöYöY öYöYþõY÷õYðõYéõYâõYÛõYÔõYÍõYÆõY¿õY¸õY±õYªõY£õYœõY•õYŽõY‡õY€õYyõYrõYkõYdõY]õYVõYOõYHõYAõY:õY3õY,õY%õYõYõYõY õYõYûôYôôYíôYæôYßôYØôYÑôYÊôYÃôY¼ôYµôY®ôY§ôY ôY™ôY’ôY‹ôY„ôY}ôYvôYoôYhôYaôYZôYSôYLôYEôY>ôY7ôY0ôY)ôY"ôYôYôY ôYôYÿóYøóYñóYêóYãóYÜóYÕóYÎóYÇóYÀóY¹óY²óY«óY¤óYóY–óYóYˆóYóYzóYsóYlóYeóY^óYWóYPóYIóYBóY;óY4óY-óY&óYóYóYóY óYóYüòYõòYîòYçòYàòYÙòYÒòYËòYÄòY½òY¶òY¯òY¨òY¡òYšòY“òYŒòY…òY~òYwòYpòYiòYbòY[òYTòYMòYFòY?òY8òY1òY*òY#òYòYòYòYòYòYùñYòñYëñYäñYÝñYÖñYÏñYÈñYÁñYºñY³ñY¬ñY¥ñYžñY—ñYñY‰ñY‚ñY{ñYtñYmñYfñY_ñYXñYQñYJñYCñY<ñY5ñY.ñY'ñY ñYñYñY ñYñYýðYöðYïðYèðYáðYÚðYÓðYÌðYÅðY¾ðY·ðY°ðY©ðY¢ðY›ðY”ðYðY†ðYðYxðYqðYjðYcðY\ðYUðYNðYGðY@ðY9ðY2ðY+ðY$ðYðYðYðYðYðYúïYóïYìïYåïYÞïY×ïYÐïYÉïYÂïY»ïY´ïY­ïY¦ïYŸïY˜ïY‘ïYŠïYƒïY|ïYuïYnïYgïY`ïYYïYRïYKïYDïY=ïY6ïY/ïY(ïY!ïYïYïY ïYïYþîY÷îYðîYéîYâîYÛîYÔîYÍîYÆîY¿îY¸îY±îYªîY£îYœîY•îYŽîY‡îY€îYyîYrîYkîYdîY]îYVîYOîYHîYAîY:îY3îY,îY%îYîYîYîY îYîYûíYôíYííYæíYßíYØíYÑíYÊíYÃíY¼íYµíY®íY§íY íY™íY’íY‹íY„íY}íYvíYoíYhíYaíYZíYSíYLíYEíY>íY7íY0íY)íY"íYíYíY íYíYÿìYøìYñìYêìYãìYÜìYÕìYÎìYÇìYÀìY¹ìY²ìY«ìY¤ìYìY–ìYìYˆìYìYzìYsìYlìYeìY^ìYWìYPìYIìYBìY;ìY4ìY-ìY&ìYìYìYìY ìYìYüëYõëYîëYçëYàëYÙëYÒëYËëYÄëY½ëY¶ëY¯ëY¨ëY¡ëYšëY“ëYŒëY…ëY~ëYwëYpëYiëYbëY[ëYTëYMëYFëY?ëY8ëY1ëY*ëY#ëYëYëYëYëYëYùêYòêYëêYäêYÝêYÖêYÏêYÈêYÁêYºêY³êY¬êY¥êYžêY—êYêY‰êY‚êY{êYtêYmêYfêY_êYXêYQêYJêYCêY<êY5êY.êY'êY êYêYêY êYêYýéYöéYïéYèéYáéYÚéYÓéYÌéYÅéY¾éY·éY°éY©éY¢éY›éY”éYéY†éYéYxéYqéYjéYcéY\éYUéYNéYGéY@éY9éY2éY+éY$éYéYéYéYéYéYúèYóèYìèYåèYÞèY×èYÐèYÉèYÂèY»èY´èY­èY¦èYŸèY˜èY‘èYŠèYƒèY|èYuèYnèYgèY`èYYèYRèYKèYDèY=èY6èY/èY(èY!èYèYèY èYèYþçY÷çYðçYéçYâçYÛçYÔçYÍçYÆçY¿çY¸çY±çYªçY£çYœçY•çYŽçY‡çY€çYyçYrçYkçYdçY]çYVçYOçYHçYAçY:çY3çY,çY%çYçYçYçY çYçYûæYôæYíæYææYßæYØæYÑæYÊæYÃæY¼æYµæY®æY§æY æY™æY’æY‹æY„æY}æYvæYoæYhæYaæYZæYSæYLæYEæY>æY7æY0æY)æY"æYæYæY æYæYÿåYøåYñåYêåYãåYÜåYÕåYÎåYÇåYÀåY¹åY²åY«åY¤åYåY–åYåYˆåYåYzåYsåYlåYeåY^åYWåYPåYIåYBåY;åY4åY-åY&åYåYåYåY åYåYüäYõäYîäYçäYàäYÙäYÒäYËäYÄäY½äY¶äY¯äY¨äY¡äYšäY“äYŒäY…äY~äYwäYpäYiäYbäY[äYTäYMäYFäY?äY8äY1äY*äY#äYäYäYäYäYäYùãYòãYëãYäãYÝãYÖãYÏãYÈãYÁãYºãY³ãY¬ãY¥ãYžãY—ãYãY‰ãY‚ãY{ãYtãYmãYfãY_ãYXãYQãYJãYCãY<ãY5ãY.ãY'ãY ãYãYãY ãYãYýâYöâYïâYèâYáâYÚâYÓâYÌâYÅâY¾âY·âY°âY©âY¢âY›âY”âYâY†âYâYxâYqâYjâYcâY\âYUâYNâYGâY@âY9âY2âY+âY$âYâYâYâYâYâYúáYóáYìáYåáYÞáY×áYÐáYÉáYÂáY»áY´áY­áY¦áYŸáY˜áY‘áYŠáYƒáY|áYuáYnáYgáY`áYYáYRáYKáYDáY=áY6áY/áY(áY!áYáYáY áYáYþàY÷àYðàYéàYâàYÛàYÔàYÍàYÆàY¿àY¸àY±àYªàY£àYœàY•àYŽàY‡àY€àYyàYràYkàYdàY]àYVàYOàYHàYAàY:àY3àY,àY%àYàYàYàY àYàYûßYôßYíßYæßYßßYØßYÑßYÊßYÃßY¼ßYµßY®ßY§ßY ßY™ßY’ßY‹ßY„ßY}ßYvßYoßYhßYaßYZßYSßYLßYEßY>ßY7ßY0ßY)ßY"ßYßYßY ßYßYÿÞYøÞYñÞYêÞYãÞYÜÞYÕÞYÎÞYÇÞYÀÞY¹ÞY²ÞY«ÞY¤ÞYÞY–ÞYÞYˆÞYÞYzÞYsÞYlÞYeÞY^ÞYWÞYPÞYIÞYBÞY;ÞY4ÞY-ÞY&ÞYÞYÞYÞY ÞYÞYüÝYõÝYîÝYçÝYàÝYÙÝYÒÝYËÝYÄÝY½ÝY¶ÝY¯ÝY¨ÝY¡ÝYšÝY“ÝYŒÝY…ÝY~ÝYwÝYpÝYiÝYbÝY[ÝYTÝYMÝYFÝY?ÝY8ÝY1ÝY*ÝY#ÝYÝYÝYÝYÝYÝYùÜYòÜYëÜYäÜYÝÜYÖÜYÏÜYÈÜYÁÜYºÜY³ÜY¬ÜY¥ÜYžÜY—ÜYÜY‰ÜY‚ÜY{ÜYtÜYmÜYfÜY_ÜYXÜYQÜYJÜYCÜY<ÜY5ÜY.ÜY'ÜY ÜYÜYÜY ÜYÜYýÛYöÛYïÛYèÛYáÛYÚÛYÓÛYÌÛYÅÛY¾ÛY·ÛY°ÛY©ÛY¢ÛY›ÛY”ÛYÛY†ÛYÛYxÛYqÛYjÛYcÛY\ÛYUÛYNÛYGÛY@ÛY9ÛY2ÛY+ÛY$ÛYÛYÛYÛYÛYÛYúÚYóÚYìÚYåÚYÞÚY×ÚYÐÚYÉÚYÂÚY»ÚY´ÚY­ÚY¦ÚYŸÚY˜ÚY‘ÚYŠÚYƒÚY|ÚYuÚYnÚYgÚY`ÚYYÚYRÚYKÚYDÚY=ÚY6ÚY/ÚY(ÚY!ÚYÚYÚY ÚYÚYþÙY÷ÙYðÙYéÙYâÙYÛÙYÔÙYÍÙYÆÙY¿ÙY¸ÙY±ÙYªÙY£ÙYœÙY•ÙYŽÙY‡ÙY€ÙYyÙYrÙYkÙYdÙY]ÙYVÙYOÙYHÙYAÙY:ÙY3ÙY,ÙY%ÙYÙYÙYÙY ÙYÙYûØYôØYíØYæØYߨYØØYÑØYÊØYÃØY¼ØYµØY®ØY§ØY ØY™ØY’ØY‹ØY„ØY}ØYvØYoØYhØYaØYZØYSØYLØYEØY>ØY7ØY0ØY)ØY"ØYØYØY ØYØYÿ×Yø×Yñ×Yê×Yã×YÜ×YÕ×YÎ×YÇ×YÀ×Y¹×Y²×Y«×Y¤×Y×Y–×Y×Yˆ×Y×Yz×Ys×Yl×Ye×Y^×YW×YP×YI×YB×Y;×Y4×Y-×Y&×Y×Y×Y×Y ×Y×YüÖYõÖYîÖYçÖYàÖYÙÖYÒÖYËÖYÄÖY½ÖY¶ÖY¯ÖY¨ÖY¡ÖYšÖY“ÖYŒÖY…ÖY~ÖYwÖYpÖYiÖYbÖY[ÖYTÖYMÖYFÖY?ÖY8ÖY1ÖY*ÖY#ÖYÖYÖYÖYÖYÖYùÕYòÕYëÕYäÕYÝÕYÖÕYÏÕYÈÕYÁÕYºÕY³ÕY¬ÕY¥ÕYžÕY—ÕYÕY‰ÕY‚ÕY{ÕYtÕYmÕYfÕY_ÕYXÕYQÕYJÕYCÕY<ÕY5ÕY.ÕY'ÕY ÕYÕYÕY ÕYÕYýÔYöÔYïÔYèÔYáÔYÚÔYÓÔYÌÔYÅÔY¾ÔY·ÔY°ÔY©ÔY¢ÔY›ÔY”ÔYÔY†ÔYÔYxÔYqÔYjÔYcÔY\ÔYUÔYNÔYGÔY@ÔY9ÔY2ÔY+ÔY$ÔYÔYÔYÔYÔYÔYúÓYóÓYìÓYåÓYÞÓY×ÓYÐÓYÉÓYÂÓY»ÓY´ÓY­ÓY¦ÓYŸÓY˜ÓY‘ÓYŠÓYƒÓY|ÓYuÓYnÓYgÓY`ÓYYÓYRÓYKÓYDÓY=ÓY6ÓY/ÓY(ÓY!ÓYÓYÓY ÓYÓYþÒY÷ÒYðÒYéÒYâÒYÛÒYÔÒYÍÒYÆÒY¿ÒY¸ÒY±ÒYªÒY£ÒYœÒY•ÒYŽÒY‡ÒY€ÒYyÒYrÒYkÒYdÒY]ÒYVÒYOÒYHÒYAÒY:ÒY3ÒY,ÒY%ÒYÒYÒYÒY ÒYÒYûÑYôÑYíÑYæÑYßÑYØÑYÑÑYÊÑYÃÑY¼ÑYµÑY®ÑY§ÑY ÑY™ÑY’ÑY‹ÑY„ÑY}ÑYvÑYoÑYhÑYaÑYZÑYSÑYLÑYEÑY>ÑY7ÑY0ÑY)ÑY"ÑYÑYÑY ÑYÑYÿÐYøÐYñÐYêÐYãÐYÜÐYÕÐYÎÐYÇÐYÀÐY¹ÐY²ÐY«ÐY¤ÐYÐY–ÐYÐYˆÐYÐYzÐYsÐYlÐYeÐY^ÐYWÐYPÐYIÐYBÐY;ÐY4ÐY-ÐY&ÐYÐYÐYÐY ÐYÐYüÏYõÏYîÏYçÏYàÏYÙÏYÒÏYËÏYÄÏY½ÏY¶ÏY¯ÏY¨ÏY¡ÏYšÏY“ÏYŒÏY…ÏY~ÏYwÏYpÏYiÏYbÏY[ÏYTÏYMÏYFÏY?ÏY8ÏY1ÏY*ÏY#ÏYÏYÏYÏYÏYÏYùÎYòÎYëÎYäÎYÝÎYÖÎYÏÎYÈÎYÁÎYºÎY³ÎY¬ÎY¥ÎYžÎY—ÎYÎY‰ÎY‚ÎY{ÎYtÎYmÎYfÎY_ÎYXÎYQÎYJÎYCÎY<ÎY5ÎY.ÎY'ÎY ÎYÎYÎY ÎYÎYýÍYöÍYïÍYèÍYáÍYÚÍYÓÍYÌÍYÅÍY¾ÍY·ÍY°ÍY©ÍY¢ÍY›ÍY”ÍYÍY†ÍYÍYxÍYqÍYjÍYcÍY\ÍYUÍYNÍYGÍY@ÍY9ÍY2ÍY+ÍY$ÍYÍYÍYÍYÍYÍYúÌYóÌYìÌYåÌYÞÌY×ÌYÐÌYÉÌYÂÌY»ÌY´ÌY­ÌY¦ÌYŸÌY˜ÌY‘ÌYŠÌYƒÌY|ÌYuÌYnÌYgÌY`ÌYYÌYRÌYKÌYDÌY=ÌY6ÌY/ÌY(ÌY!ÌYÌYÌY ÌYÌYþËY÷ËYðËYéËYâËYÛËYÔËYÍËYÆËY¿ËY¸ËY±ËYªËY£ËYœËY•ËYŽËY‡ËY€ËYyËYrËYkËYdËY]ËYVËYOËYHËYAËY:ËY3ËY,ËY%ËYËYËYËY ËYËYûÊYôÊYíÊYæÊYßÊYØÊYÑÊYÊÊYÃÊY¼ÊYµÊY®ÊY§ÊY ÊY™ÊY’ÊY‹ÊY„ÊY}ÊYvÊYoÊYhÊYaÊYZÊYSÊYLÊYEÊY>ÊY7ÊY0ÊY)ÊY"ÊYÊYÊY ÊYÊYÿÉYøÉYñÉYêÉYãÉYÜÉYÕÉYÎÉYÇÉYÀÉY¹ÉY²ÉY«ÉY¤ÉYÉY–ÉYÉYˆÉYÉYzÉYsÉYlÉYeÉY^ÉYWÉYPÉYIÉYBÉY;ÉY4ÉY-ÉY&ÉYÉYÉYÉY ÉYÉYüÈYõÈYîÈYçÈYàÈYÙÈYÒÈYËÈYÄÈY½ÈY¶ÈY¯ÈY¨ÈY¡ÈYšÈY“ÈYŒÈY…ÈY~ÈYwÈYpÈYiÈYbÈY[ÈYTÈYMÈYFÈY?ÈY8ÈY1ÈY*ÈY#ÈYÈYÈYÈYÈYÈYùÇYòÇYëÇYäÇYÝÇYÖÇYÏÇYÈÇYÁÇYºÇY³ÇY¬ÇY¥ÇYžÇY—ÇYÇY‰ÇY‚ÇY{ÇYtÇYmÇYfÇY_ÇYXÇYQÇYJÇYCÇY<ÇY5ÇY.ÇY'ÇY ÇYÇYÇY ÇYÇYýÆYöÆYïÆYèÆYáÆYÚÆYÓÆYÌÆYÅÆY¾ÆY·ÆY°ÆY©ÆY¢ÆY›ÆY”ÆYÆY†ÆYÆYxÆYqÆYjÆYcÆY\ÆYUÆYNÆYGÆY@ÆY9ÆY2ÆY+ÆY$ÆYÆYÆYÆYÆYÆYúÅYóÅYìÅYåÅYÞÅY×ÅYÐÅYÉÅYÂÅY»ÅY´ÅY­ÅY¦ÅYŸÅY˜ÅY‘ÅYŠÅYƒÅY|ÅYuÅYnÅYgÅY`ÅYYÅYRÅYKÅYDÅY=ÅY6ÅY/ÅY(ÅY!ÅYÅYÅY ÅYÅYþÄY÷ÄYðÄYéÄYâÄYÛÄYÔÄYÍÄYÆÄY¿ÄY¸ÄY±ÄYªÄY£ÄYœÄY•ÄYŽÄY‡ÄY€ÄYyÄYrÄYkÄYdÄY]ÄYVÄYOÄYHÄYAÄY:ÄY3ÄY,ÄY%ÄYÄYÄYÄY ÄYÄYûÃYôÃYíÃYæÃYßÃYØÃYÑÃYÊÃYÃÃY¼ÃYµÃY®ÃY§ÃY ÃY™ÃY’ÃY‹ÃY„ÃY}ÃYvÃYoÃYhÃYaÃYZÃYSÃYLÃYEÃY>ÃY7ÃY0ÃY)ÃY"ÃYÃYÃY ÃYÃYÿÂYøÂYñÂYêÂYãÂYÜÂYÕÂYÎÂYÇÂYÀÂY¹ÂY²ÂY«ÂY¤ÂYÂY–ÂYÂYˆÂYÂYzÂYsÂYlÂYeÂY^ÂYWÂYPÂYIÂYBÂY;ÂY4ÂY-ÂY&ÂYÂYÂYÂY ÂYÂYüÁYõÁYîÁYçÁYàÁYÙÁYÒÁYËÁYÄÁY½ÁY¶ÁY¯ÁY¨ÁY¡ÁYšÁY“ÁYŒÁY…ÁY~ÁYwÁYpÁYiÁYbÁY[ÁYTÁYMÁYFÁY?ÁY8ÁY1ÁY*ÁY#ÁYÁYÁYÁYÁYÁYùÀYòÀYëÀYäÀYÝÀYÖÀYÏÀYÈÀYÁÀYºÀY³ÀY¬ÀY¥ÀYžÀY—ÀYÀY‰ÀY‚ÀY{ÀYtÀYmÀYfÀY_ÀYXÀYQÀYJÀYCÀY<ÀY5ÀY.ÀY'ÀY ÀYÀYÀY ÀYÀYý¿Yö¿Yï¿Yè¿Yá¿YÚ¿YÓ¿YÌ¿YÅ¿Y¾¿Y·¿Y°¿Y©¿Y¢¿Y›¿Y”¿Y¿Y†¿Y¿Yx¿Yq¿Yj¿Yc¿Y\¿YU¿YN¿YG¿Y@¿Y9¿Y2¿Y+¿Y$¿Y¿Y¿Y¿Y¿Y¿Yú¾Yó¾Yì¾Yå¾YÞ¾Y×¾YоYɾY¾Y»¾Y´¾Y­¾Y¦¾YŸ¾Y˜¾Y‘¾YоYƒ¾Y|¾Yu¾Yn¾Yg¾Y`¾YY¾YR¾YK¾YD¾Y=¾Y6¾Y/¾Y(¾Y!¾Y¾Y¾Y ¾Y¾Yþ½Y÷½Yð½Yé½Yâ½YÛ½YÔ½YͽYƽY¿½Y¸½Y±½Yª½Y£½Yœ½Y•½Y޽Y‡½Y€½Yy½Yr½Yk½Yd½Y]½YV½YO½YH½YA½Y:½Y3½Y,½Y%½Y½Y½Y½Y ½Y½Yû¼Yô¼Yí¼Yæ¼Yß¼YؼYѼYʼYüY¼¼Yµ¼Y®¼Y§¼Y ¼Y™¼Y’¼Y‹¼Y„¼Y}¼Yv¼Yo¼Yh¼Ya¼YZ¼YS¼YL¼YE¼Y>¼Y7¼Y0¼Y)¼Y"¼Y¼Y¼Y ¼Y¼Yÿ»Yø»Yñ»Yê»Yã»YÜ»YÕ»YλYÇ»YÀ»Y¹»Y²»Y«»Y¤»Y»Y–»Y»Yˆ»Y»Yz»Ys»Yl»Ye»Y^»YW»YP»YI»YB»Y;»Y4»Y-»Y&»Y»Y»Y»Y »Y»YüºYõºYîºYçºYàºYÙºYÒºY˺YĺY½ºY¶ºY¯ºY¨ºY¡ºYšºY“ºYŒºY…ºY~ºYwºYpºYiºYbºY[ºYTºYMºYFºY?ºY8ºY1ºY*ºY#ºYºYºYºYºYºYù¹Yò¹Yë¹Yä¹YݹYÖ¹YϹYȹYÁ¹Yº¹Y³¹Y¬¹Y¥¹Yž¹Y—¹Y¹Y‰¹Y‚¹Y{¹Yt¹Ym¹Yf¹Y_¹YX¹YQ¹YJ¹YC¹Y<¹Y5¹Y.¹Y'¹Y ¹Y¹Y¹Y ¹Y¹Yý¸Yö¸Yï¸Yè¸Yá¸YÚ¸YÓ¸Y̸YŸY¾¸Y·¸Y°¸Y©¸Y¢¸Y›¸Y”¸Y¸Y†¸Y¸Yx¸Yq¸Yj¸Yc¸Y\¸YU¸YN¸YG¸Y@¸Y9¸Y2¸Y+¸Y$¸Y¸Y¸Y¸Y¸Y¸Yú·Yó·Yì·Yå·YÞ·Y×·YзYÉ·Y·Y»·Y´·Y­·Y¦·YŸ·Y˜·Y‘·YŠ·Yƒ·Y|·Yu·Yn·Yg·Y`·YY·YR·YK·YD·Y=·Y6·Y/·Y(·Y!·Y·Y·Y ·Y·Yþ¶Y÷¶Yð¶Yé¶Yâ¶YÛ¶YÔ¶YͶYƶY¿¶Y¸¶Y±¶Yª¶Y£¶Yœ¶Y•¶Y޶Y‡¶Y€¶Yy¶Yr¶Yk¶Yd¶Y]¶YV¶YO¶YH¶YA¶Y:¶Y3¶Y,¶Y%¶Y¶Y¶Y¶Y ¶Y¶YûµYôµYíµYæµYßµYصYѵYʵYõY¼µYµµY®µY§µY µY™µY’µY‹µY„µY}µYvµYoµYhµYaµYZµYSµYLµYEµY>µY7µY0µY)µY"µYµYµY µYµYÿ´Yø´Yñ´Yê´Yã´YÜ´YÕ´YδYÇ´YÀ´Y¹´Y²´Y«´Y¤´Y´Y–´Y´Yˆ´Y´Yz´Ys´Yl´Ye´Y^´YW´YP´YI´YB´Y;´Y4´Y-´Y&´Y´Y´Y´Y ´Y´Yü³Yõ³Yî³Yç³Yà³YÙ³YÒ³Y˳YijY½³Y¶³Y¯³Y¨³Y¡³Yš³Y“³YŒ³Y…³Y~³Yw³Yp³Yi³Yb³Y[³YT³YM³YF³Y?³Y8³Y1³Y*³Y#³Y³Y³Y³Y³Y³Yù²Yò²Yë²Yä²YݲYÖ²YϲYȲYÁ²Yº²Y³²Y¬²Y¥²Yž²Y—²Y²Y‰²Y‚²Y{²Yt²Ym²Yf²Y_²YX²YQ²YJ²YC²Y<²Y5²Y.²Y'²Y ²Y²Y²Y ²Y²Yý±Yö±Yï±Yè±Yá±YÚ±YÓ±Y̱YűY¾±Y·±Y°±Y©±Y¢±Y›±Y”±Y±Y†±Y±Yx±Yq±Yj±Yc±Y\±YU±YN±YG±Y@±Y9±Y2±Y+±Y$±Y±Y±Y±Y±Y±Yú°Yó°Yì°Yå°YÞ°Y×°YаYɰY°Y»°Y´°Y­°Y¦°YŸ°Y˜°Y‘°YаYƒ°Y|°Yu°Yn°Yg°Y`°YY°YR°YK°YD°Y=°Y6°Y/°Y(°Y!°Y°Y°Y °Y°Yþ¯Y÷¯Yð¯Yé¯Yâ¯YÛ¯YÔ¯YͯYƯY¿¯Y¸¯Y±¯Yª¯Y£¯Yœ¯Y•¯YޝY‡¯Y€¯Yy¯Yr¯Yk¯Yd¯Y]¯YV¯YO¯YH¯YA¯Y:¯Y3¯Y,¯Y%¯Y¯Y¯Y¯Y ¯Y¯Yû®Yô®Yí®Yæ®Yß®YØ®YÑ®YÊ®YîY¼®Yµ®Y®®Y§®Y ®Y™®Y’®Y‹®Y„®Y}®Yv®Yo®Yh®Ya®YZ®YS®YL®YE®Y>®Y7®Y0®Y)®Y"®Y®Y®Y ®Y®Yÿ­Yø­Yñ­Yê­Yã­YÜ­YÕ­YέYÇ­YÀ­Y¹­Y²­Y«­Y¤­Y­Y–­Y­Yˆ­Y­Yz­Ys­Yl­Ye­Y^­YW­YP­YI­YB­Y;­Y4­Y-­Y&­Y­Y­Y­Y ­Y­Yü¬Yõ¬Yî¬Yç¬Yà¬YÙ¬YÒ¬YˬYĬY½¬Y¶¬Y¯¬Y¨¬Y¡¬Yš¬Y“¬YŒ¬Y…¬Y~¬Yw¬Yp¬Yi¬Yb¬Y[¬YT¬YM¬YF¬Y?¬Y8¬Y1¬Y*¬Y#¬Y¬Y¬Y¬Y¬Y¬Yù«Yò«Yë«Yä«YÝ«YÖ«YÏ«YÈ«YÁ«Yº«Y³«Y¬«Y¥«Yž«Y—«Y«Y‰«Y‚«Y{«Yt«Ym«Yf«Y_«YX«YQ«YJ«YC«Y<«Y5«Y.«Y'«Y «Y«Y«Y «Y«YýªYöªYïªYèªYáªYÚªYÓªY̪YŪY¾ªY·ªY°ªY©ªY¢ªY›ªY”ªYªY†ªYªYxªYqªYjªYcªY\ªYUªYNªYGªY@ªY9ªY2ªY+ªY$ªYªYªYªYªYªYú©Yó©Yì©Yå©YÞ©YשYЩYÉ©Y©Y»©Y´©Y­©Y¦©YŸ©Y˜©Y‘©YŠ©Yƒ©Y|©Yu©Yn©Yg©Y`©YY©YR©YK©YD©Y=©Y6©Y/©Y(©Y!©Y©Y©Y ©Y©Yþ¨Y÷¨Yð¨Yé¨Yâ¨YÛ¨YÔ¨YͨYƨY¿¨Y¸¨Y±¨Yª¨Y£¨Yœ¨Y•¨YލY‡¨Y€¨Yy¨Yr¨Yk¨Yd¨Y]¨YV¨YO¨YH¨YA¨Y:¨Y3¨Y,¨Y%¨Y¨Y¨Y¨Y ¨Y¨Yû§Yô§Yí§Yæ§Yß§YاYѧYʧYçY¼§Yµ§Y®§Y§§Y §Y™§Y’§Y‹§Y„§Y}§Yv§Yo§Yh§Ya§YZ§YS§YL§YE§Y>§Y7§Y0§Y)§Y"§Y§Y§Y §Y§Yÿ¦Yø¦Yñ¦Yê¦Yã¦YܦYÕ¦YΦYǦYÀ¦Y¹¦Y²¦Y«¦Y¤¦Y¦Y–¦Y¦Yˆ¦Y¦Yz¦Ys¦Yl¦Ye¦Y^¦YW¦YP¦YI¦YB¦Y;¦Y4¦Y-¦Y&¦Y¦Y¦Y¦Y ¦Y¦Yü¥Yõ¥Yî¥Yç¥Yà¥YÙ¥YÒ¥YË¥YÄ¥Y½¥Y¶¥Y¯¥Y¨¥Y¡¥Yš¥Y“¥YŒ¥Y…¥Y~¥Yw¥Yp¥Yi¥Yb¥Y[¥YT¥YM¥YF¥Y?¥Y8¥Y1¥Y*¥Y#¥Y¥Y¥Y¥Y¥Y¥Yù¤Yò¤Yë¤Yä¤YݤYÖ¤YϤYȤYÁ¤Yº¤Y³¤Y¬¤Y¥¤Yž¤Y—¤Y¤Y‰¤Y‚¤Y{¤Yt¤Ym¤Yf¤Y_¤YX¤YQ¤YJ¤YC¤Y<¤Y5¤Y.¤Y'¤Y ¤Y¤Y¤Y ¤Y¤Yý£Yö£Yï£Yè£Yá£YÚ£YÓ£YÌ£YÅ£Y¾£Y·£Y°£Y©£Y¢£Y›£Y”£Y£Y†£Y£Yx£Yq£Yj£Yc£Y\£YU£YN£YG£Y@£Y9£Y2£Y+£Y$£Y£Y£Y£Y£Y£Yú¢Yó¢Yì¢Yå¢YÞ¢Y×¢YТYÉ¢Y¢Y»¢Y´¢Y­¢Y¦¢YŸ¢Y˜¢Y‘¢YŠ¢Yƒ¢Y|¢Yu¢Yn¢Yg¢Y`¢YY¢YR¢YK¢YD¢Y=¢Y6¢Y/¢Y(¢Y!¢Y¢Y¢Y ¢Y¢Yþ¡Y÷¡Yð¡Yé¡Yâ¡YÛ¡YÔ¡YÍ¡YÆ¡Y¿¡Y¸¡Y±¡Yª¡Y£¡Yœ¡Y•¡YŽ¡Y‡¡Y€¡Yy¡Yr¡Yk¡Yd¡Y]¡YV¡YO¡YH¡YA¡Y:¡Y3¡Y,¡Y%¡Y¡Y¡Y¡Y ¡Y¡Yû Yô Yí Yæ Yß YØ YÑ YÊ YàY¼ Yµ Y® Y§ Y  Y™ Y’ Y‹ Y„ Y} Yv Yo Yh Ya YZ YS YL YE Y> Y7 Y0 Y) Y" Y Y Y  Y YÿŸYøŸYñŸYêŸYãŸYÜŸYÕŸYΟYÇŸYÀŸY¹ŸY²ŸY«ŸY¤ŸYŸY–ŸYŸYˆŸYŸYzŸYsŸYlŸYeŸY^ŸYWŸYPŸYIŸYBŸY;ŸY4ŸY-ŸY&ŸYŸYŸYŸY ŸYŸYüžYõžYîžYçžYàžYÙžYÒžYËžYÄžY½žY¶žY¯žY¨žY¡žYšžY“žYŒžY…žY~žYwžYpžYižYbžY[žYTžYMžYFžY?žY8žY1žY*žY#žYžYžYžYžYžYùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY™Y7™Y0™Y)™Y"™Y™Y™Y ™Y™Yÿ˜Yø˜Yñ˜Yê˜Yã˜YܘYÕ˜YΘYǘYÀ˜Y¹˜Y²˜Y«˜Y¤˜Y˜Y–˜Y˜Yˆ˜Y˜Yz˜Ys˜Yl˜Ye˜Y^˜YW˜YP˜YI˜YB˜Y;˜Y4˜Y-˜Y&˜Y˜Y˜Y˜Y ˜Y˜Yü—Yõ—Yî—Yç—Yà—YÙ—YÒ—YË—YÄ—Y½—Y¶—Y¯—Y¨—Y¡—Yš—Y“—YŒ—Y…—Y~—Yw—Yp—Yi—Yb—Y[—YT—YM—YF—Y?—Y8—Y1—Y*—Y#—Y—Y—Y—Y—Y—Yù–Yò–Yë–Yä–YÝ–YÖ–YÏ–YÈ–YÁ–Yº–Y³–Y¬–Y¥–Yž–Y—–Y–Y‰–Y‚–Y{–Yt–Ym–Yf–Y_–YX–YQ–YJ–YC–Y<–Y5–Y.–Y'–Y –Y–Y–Y –Y–Yý•Yö•Yï•Yè•Yá•YÚ•YÓ•YÌ•YÅ•Y¾•Y·•Y°•Y©•Y¢•Y›•Y”•Y•Y†•Y•Yx•Yq•Yj•Yc•Y\•YU•YN•YG•Y@•Y9•Y2•Y+•Y$•Y•Y•Y•Y•Y•Yú”Yó”Yì”Yå”YÞ”Y×”YДYÉ”Y”Y»”Y´”Y­”Y¦”YŸ”Y˜”Y‘”YŠ”Yƒ”Y|”Yu”Yn”Yg”Y`”YY”YR”YK”YD”Y=”Y6”Y/”Y(”Y!”Y”Y”Y ”Y”Yþ“Y÷“Yð“Yé“Yâ“YÛ“YÔ“YÍ“YÆ“Y¿“Y¸“Y±“Yª“Y£“Yœ“Y•“YŽ“Y‡“Y€“Yy“Yr“Yk“Yd“Y]“YV“YO“YH“YA“Y:“Y3“Y,“Y%“Y“Y“Y“Y “Y“Yû’Yô’Yí’Yæ’Yß’YØ’YÑ’YÊ’YÃ’Y¼’Yµ’Y®’Y§’Y ’Y™’Y’’Y‹’Y„’Y}’Yv’Yo’Yh’Ya’YZ’YS’YL’YE’Y>’Y7’Y0’Y)’Y"’Y’Y’Y ’Y’Yÿ‘Yø‘Yñ‘Yê‘Yã‘YÜ‘YÕ‘YΑYÇ‘YÀ‘Y¹‘Y²‘Y«‘Y¤‘Y‘Y–‘Y‘Yˆ‘Y‘Yz‘Ys‘Yl‘Ye‘Y^‘YW‘YP‘YI‘YB‘Y;‘Y4‘Y-‘Y&‘Y‘Y‘Y‘Y ‘Y‘YüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY‹Y7‹Y0‹Y)‹Y"‹Y‹Y‹Y ‹Y‹YÿŠYøŠYñŠYêŠYãŠYÜŠYÕŠYΊYÇŠYÀŠY¹ŠY²ŠY«ŠY¤ŠYŠY–ŠYŠYˆŠYŠYzŠYsŠYlŠYeŠY^ŠYWŠYPŠYIŠYBŠY;ŠY4ŠY-ŠY&ŠYŠYŠYŠY ŠYŠYü‰Yõ‰Yî‰Yç‰Yà‰YÙ‰YÒ‰YˉYĉY½‰Y¶‰Y¯‰Y¨‰Y¡‰Yš‰Y“‰YŒ‰Y…‰Y~‰Yw‰Yp‰Yi‰Yb‰Y[‰YT‰YM‰YF‰Y?‰Y8‰Y1‰Y*‰Y#‰Y‰Y‰Y‰Y‰Y‰YùˆYòˆYëˆYäˆY݈YÖˆYψYȈYÁˆYºˆY³ˆY¬ˆY¥ˆYžˆY—ˆYˆY‰ˆY‚ˆY{ˆYtˆYmˆYfˆY_ˆYXˆYQˆYJˆYCˆY<ˆY5ˆY.ˆY'ˆY ˆYˆYˆY ˆYˆYý‡Yö‡Yï‡Yè‡Yá‡YÚ‡YÓ‡ẎYŇY¾‡Y·‡Y°‡Y©‡Y¢‡Y›‡Y”‡Y‡Y†‡Y‡Yx‡Yq‡Yj‡Yc‡Y\‡YU‡YN‡YG‡Y@‡Y9‡Y2‡Y+‡Y$‡Y‡Y‡Y‡Y‡Y‡Yú†Yó†Yì†Yå†YÞ†Y׆YІYɆY†Y»†Y´†Y­†Y¦†YŸ†Y˜†Y‘†YІYƒ†Y|†Yu†Yn†Yg†Y`†YY†YR†YK†YD†Y=†Y6†Y/†Y(†Y!†Y†Y†Y †Y†Yþ…Y÷…Yð…Yé…Yâ…YÛ…YÔ…YÍ…YÆ…Y¿…Y¸…Y±…Yª…Y£…Yœ…Y•…YŽ…Y‡…Y€…Yy…Yr…Yk…Yd…Y]…YV…YO…YH…YA…Y:…Y3…Y,…Y%…Y…Y…Y…Y …Y…Yû„Yô„Yí„Yæ„Yß„YØ„YÑ„YÊ„YÄY¼„Yµ„Y®„Y§„Y „Y™„Y’„Y‹„Y„„Y}„Yv„Yo„Yh„Ya„YZ„YS„YL„YE„Y>„Y7„Y0„Y)„Y"„Y„Y„Y „Y„YÿƒYøƒYñƒYêƒYãƒY܃YÕƒY΃YǃYÀƒY¹ƒY²ƒY«ƒY¤ƒYƒY–ƒYƒYˆƒYƒYzƒYsƒYlƒYeƒY^ƒYWƒYPƒYIƒYBƒY;ƒY4ƒY-ƒY&ƒYƒYƒYƒY ƒYƒYü‚Yõ‚Yî‚Yç‚Yà‚YÙ‚YÒ‚YË‚YÄ‚Y½‚Y¶‚Y¯‚Y¨‚Y¡‚Yš‚Y“‚YŒ‚Y…‚Y~‚Yw‚Yp‚Yi‚Yb‚Y[‚YT‚YM‚YF‚Y?‚Y8‚Y1‚Y*‚Y#‚Y‚Y‚Y‚Y‚Y‚YùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY}Y7}Y0}Y)}Y"}Y}Y}Y }Y}Yÿ|Yø|Yñ|Yê|Yã|YÜ|YÕ|YÎ|YÇ|YÀ|Y¹|Y²|Y«|Y¤|Y|Y–|Y|Yˆ|Y|Yz|Ys|Yl|Ye|Y^|YW|YP|YI|YB|Y;|Y4|Y-|Y&|Y|Y|Y|Y |Y|Yü{Yõ{Yî{Yç{Yà{YÙ{YÒ{YË{YÄ{Y½{Y¶{Y¯{Y¨{Y¡{Yš{Y“{YŒ{Y…{Y~{Yw{Yp{Yi{Yb{Y[{YT{YM{YF{Y?{Y8{Y1{Y*{Y#{Y{Y{Y{Y{Y{YùzYòzYëzYäzYÝzYÖzYÏzYÈzYÁzYºzY³zY¬zY¥zYžzY—zYzY‰zY‚zY{zYtzYmzYfzY_zYXzYQzYJzYCzYvY7vY0vY)vY"vYvYvY vYvYÿuYøuYñuYêuYãuYÜuYÕuYÎuYÇuYÀuY¹uY²uY«uY¤uYuY–uYuYˆuYuYzuYsuYluYeuY^uYWuYPuYIuYBuY;uY4uY-uY&uYuYuYuY uYuYütYõtYîtYçtYàtYÙtYÒtYËtYÄtY½tY¶tY¯tY¨tY¡tYštY“tYŒtY…tY~tYwtYptYitYbtY[tYTtYMtYFtY?tY8tY1tY*tY#tYtYtYtYtYtYùsYòsYësYäsYÝsYÖsYÏsYÈsYÁsYºsY³sY¬sY¥sYžsY—sYsY‰sY‚sY{sYtsYmsYfsY_sYXsYQsYJsYCsYoY7oY0oY)oY"oYoYoY oYoYÿnYønYñnYênYãnYÜnYÕnYÎnYÇnYÀnY¹nY²nY«nY¤nYnY–nYnYˆnYnYznYsnYlnYenY^nYWnYPnYInYBnY;nY4nY-nY&nYnYnYnY nYnYümYõmYîmYçmYàmYÙmYÒmYËmYÄmY½mY¶mY¯mY¨mY¡mYšmY“mYŒmY…mY~mYwmYpmYimYbmY[mYTmYMmYFmY?mY8mY1mY*mY#mYmYmYmYmYmYùlYòlYëlYälYÝlYÖlYÏlYÈlYÁlYºlY³lY¬lY¥lYžlY—lYlY‰lY‚lY{lYtlYmlYflY_lYXlYQlYJlYClYhY7hY0hY)hY"hYhYhY hYhYÿgYøgYñgYêgYãgYÜgYÕgYÎgYÇgYÀgY¹gY²gY«gY¤gYgY–gYgYˆgYgYzgYsgYlgYegY^gYWgYPgYIgYBgY;gY4gY-gY&gYgYgYgY gYgYüfYõfYîfYçfYàfYÙfYÒfYËfYÄfY½fY¶fY¯fY¨fY¡fYšfY“fYŒfY…fY~fYwfYpfYifYbfY[fYTfYMfYFfY?fY8fY1fY*fY#fYfYfYfYfYfYùeYòeYëeYäeYÝeYÖeYÏeYÈeYÁeYºeY³eY¬eY¥eYžeY—eYeY‰eY‚eY{eYteYmeYfeY_eYXeYQeYJeYCeYaY7aY0aY)aY"aYaYaY aYaYÿ`Yø`Yñ`Yê`Yã`YÜ`YÕ`YÎ`YÇ`YÀ`Y¹`Y²`Y«`Y¤`Y`Y–`Y`Yˆ`Y`Yz`Ys`Yl`Ye`Y^`YW`YP`YI`YB`Y;`Y4`Y-`Y&`Y`Y`Y`Y `Y`Yü_Yõ_Yî_Yç_Yà_YÙ_YÒ_YË_YÄ_Y½_Y¶_Y¯_Y¨_Y¡_Yš_Y“_YŒ_Y…_Y~_Yw_Yp_Yi_Yb_Y[_YT_YM_YF_Y?_Y8_Y1_Y*_Y#_Y_Y_Y_Y_Y_Yù^Yò^Yë^Yä^YÝ^YÖ^YÏ^YÈ^YÁ^Yº^Y³^Y¬^Y¥^Yž^Y—^Y^Y‰^Y‚^Y{^Yt^Ym^Yf^Y_^YX^YQ^YJ^YC^Y<^Y5^Y.^Y'^Y ^Y^Y^Y ^Y^Yý]Yö]Yï]Yè]Yá]YÚ]YÓ]YÌ]YÅ]Y¾]Y·]Y°]Y©]Y¢]Y›]Y”]Y]Y†]Y]Yx]Yq]Yj]Yc]Y\]YU]YN]YG]Y@]Y9]Y2]Y+]Y$]Y]Y]Y]Y]Y]Yú\Yó\Yì\Yå\YÞ\Y×\YÐ\YÉ\YÂ\Y»\Y´\Y­\Y¦\YŸ\Y˜\Y‘\YŠ\Yƒ\Y|\Yu\Yn\Yg\Y`\YY\YR\YK\YD\Y=\Y6\Y/\Y(\Y!\Y\Y\Y \Y\Yþ[Y÷[Yð[Yé[Yâ[YÛ[YÔ[YÍ[YÆ[Y¿[Y¸[Y±[Yª[Y£[Yœ[Y•[YŽ[Y‡[Y€[Yy[Yr[Yk[Yd[Y][YV[YO[YH[YA[Y:[Y3[Y,[Y%[Y[Y[Y[Y [Y[YûZYôZYíZYæZYßZYØZYÑZYÊZYÃZY¼ZYµZY®ZY§ZY ZY™ZY’ZY‹ZY„ZY}ZYvZYoZYhZYaZYZZYSZYLZYEZY>ZY7ZY0ZY)ZY"ZYZYZY ZYZYÿYYøYYñYYêYYãYYÜYYÕYYÎYYÇYYÀYY¹YY²YY«YY¤YYYY–YYYYˆYYYYzYYsYYlYYeYY^YYWYYPYYIYYBYY;YY4YY-YY&YYYYYYYY YYYYüXYõXYîXYçXYàXYÙXYÒXYËXYÄXY½XY¶XY¯XY¨XY¡XYšXY“XYŒXY…XY~XYwXYpXYiXYbXY[XYTXYMXYFXY?XY8XY1XY*XY#XYXYXYXYXYXYùWYòWYëWYäWYÝWYÖWYÏWYÈWYÁWYºWY³WY¬WY¥WYžWY—WYWY‰WY‚WY{WYtWYmWYfWY_WYXWYQWYJWYCWYSY7SY0SY)SY"SYSYSY SYSYÿRYøRYñRYêRYãRYÜRYÕRYÎRYÇRYÀRY¹RY²RY«RY¤RYRY–RYRYˆRYRYzRYsRYlRYeRY^RYWRYPRYIRYBRY;RY4RY-RY&RYRYRYRY RYRYüQYõQYîQYçQYàQYÙQYÒQYËQYÄQY½QY¶QY¯QY¨QY¡QYšQY“QYŒQY…QY~QYwQYpQYiQYbQY[QYTQYMQYFQY?QY8QY1QY*QY#QYQYQYQYQYQYùPYòPYëPYäPYÝPYÖPYÏPYÈPYÁPYºPY³PY¬PY¥PYžPY—PYPY‰PY‚PY{PYtPYmPYfPY_PYXPYQPYJPYCPYLY7LY0LY)LY"LYLYLY LYLYÿKYøKYñKYêKYãKYÜKYÕKYÎKYÇKYÀKY¹KY²KY«KY¤KYKY–KYKYˆKYKYzKYsKYlKYeKY^KYWKYPKYIKYBKY;KY4KY-KY&KYKYKYKY KYKYüJYõJYîJYçJYàJYÙJYÒJYËJYÄJY½JY¶JY¯JY¨JY¡JYšJY“JYŒJY…JY~JYwJYpJYiJYbJY[JYTJYMJYFJY?JY8JY1JY*JY#JYJYJYJYJYJYùIYòIYëIYäIYÝIYÖIYÏIYÈIYÁIYºIY³IY¬IY¥IYžIY—IYIY‰IY‚IY{IYtIYmIYfIY_IYXIYQIYJIYCIYEY7EY0EY)EY"EYEYEY EYEYÿDYøDYñDYêDYãDYÜDYÕDYÎDYÇDYÀDY¹DY²DY«DY¤DYDY–DYDYˆDYDYzDYsDYlDYeDY^DYWDYPDYIDYBDY;DY4DY-DY&DYDYDYDY DYDYüCYõCYîCYçCYàCYÙCYÒCYËCYÄCY½CY¶CY¯CY¨CY¡CYšCY“CYŒCY…CY~CYwCYpCYiCYbCY[CYTCYMCYFCY?CY8CY1CY*CY#CYCYCYCYCYCYùBYòBYëBYäBYÝBYÖBYÏBYÈBYÁBYºBY³BY¬BY¥BYžBY—BYBY‰BY‚BY{BYtBYmBYfBY_BYXBYQBYJBYCBYYô>Yí>Yæ>Yß>YØ>YÑ>YÊ>YÃ>Y¼>Yµ>Y®>Y§>Y >Y™>Y’>Y‹>Y„>Y}>Yv>Yo>Yh>Ya>YZ>YS>YL>YE>Y>>Y7>Y0>Y)>Y">Y>Y>Y >Y>Yÿ=Yø=Yñ=Yê=Yã=YÜ=YÕ=YÎ=YÇ=YÀ=Y¹=Y²=Y«=Y¤=Y=Y–=Y=Yˆ=Y=Yz=Ys=Yl=Ye=Y^=YW=YP=YI=YB=Y;=Y4=Y-=Y&=Y=Y=Y=Y =Y=Yü7Y77Y07Y)7Y"7Y7Y7Y 7Y7Yÿ6Yø6Yñ6Yê6Yã6YÜ6YÕ6YÎ6YÇ6YÀ6Y¹6Y²6Y«6Y¤6Y6Y–6Y6Yˆ6Y6Yz6Ys6Yl6Ye6Y^6YW6YP6YI6YB6Y;6Y46Y-6Y&6Y6Y6Y6Y 6Y6Yü5Yõ5Yî5Yç5Yà5YÙ5YÒ5YË5YÄ5Y½5Y¶5Y¯5Y¨5Y¡5Yš5Y“5YŒ5Y…5Y~5Yw5Yp5Yi5Yb5Y[5YT5YM5YF5Y?5Y85Y15Y*5Y#5Y5Y5Y5Y5Y5Yù4Yò4Yë4Yä4YÝ4YÖ4YÏ4YÈ4YÁ4Yº4Y³4Y¬4Y¥4Yž4Y—4Y4Y‰4Y‚4Y{4Yt4Ym4Yf4Y_4YX4YQ4YJ4YC4Y<4Y54Y.4Y'4Y 4Y4Y4Y 4Y4Yý3Yö3Yï3Yè3Yá3YÚ3YÓ3YÌ3YÅ3Y¾3Y·3Y°3Y©3Y¢3Y›3Y”3Y3Y†3Y3Yx3Yq3Yj3Yc3Y\3YU3YN3YG3Y@3Y93Y23Y+3Y$3Y3Y3Y3Y3Y3Yú2Yó2Yì2Yå2YÞ2Y×2YÐ2YÉ2YÂ2Y»2Y´2Y­2Y¦2YŸ2Y˜2Y‘2YŠ2Yƒ2Y|2Yu2Yn2Yg2Y`2YY2YR2YK2YD2Y=2Y62Y/2Y(2Y!2Y2Y2Y 2Y2Yþ1Y÷1Yð1Yé1Yâ1YÛ1YÔ1YÍ1YÆ1Y¿1Y¸1Y±1Yª1Y£1Yœ1Y•1YŽ1Y‡1Y€1Yy1Yr1Yk1Yd1Y]1YV1YO1YH1YA1Y:1Y31Y,1Y%1Y1Y1Y1Y 1Y1Yû0Yô0Yí0Yæ0Yß0YØ0YÑ0YÊ0YÃ0Y¼0Yµ0Y®0Y§0Y 0Y™0Y’0Y‹0Y„0Y}0Yv0Yo0Yh0Ya0YZ0YS0YL0YE0Y>0Y70Y00Y)0Y"0Y0Y0Y 0Y0Yÿ/Yø/Yñ/Yê/Yã/YÜ/YÕ/YÎ/YÇ/YÀ/Y¹/Y²/Y«/Y¤/Y/Y–/Y/Yˆ/Y/Yz/Ys/Yl/Ye/Y^/YW/YP/YI/YB/Y;/Y4/Y-/Y&/Y/Y/Y/Y /Y/Yü.Yõ.Yî.Yç.Yà.YÙ.YÒ.YË.YÄ.Y½.Y¶.Y¯.Y¨.Y¡.Yš.Y“.YŒ.Y….Y~.Yw.Yp.Yi.Yb.Y[.YT.YM.YF.Y?.Y8.Y1.Y*.Y#.Y.Y.Y.Y.Y.Yù-Yò-Yë-Yä-YÝ-YÖ-YÏ-YÈ-YÁ-Yº-Y³-Y¬-Y¥-Yž-Y—-Y-Y‰-Y‚-Y{-Yt-Ym-Yf-Y_-YX-YQ-YJ-YC-Y<-Y5-Y.-Y'-Y -Y-Y-Y -Y-Yý,Yö,Yï,Yè,Yá,YÚ,YÓ,YÌ,YÅ,Y¾,Y·,Y°,Y©,Y¢,Y›,Y”,Y,Y†,Y,Yx,Yq,Yj,Yc,Y\,YU,YN,YG,Y@,Y9,Y2,Y+,Y$,Y,Y,Y,Y,Y,Yú+Yó+Yì+Yå+YÞ+Y×+YÐ+YÉ+YÂ+Y»+Y´+Y­+Y¦+YŸ+Y˜+Y‘+YŠ+Yƒ+Y|+Yu+Yn+Yg+Y`+YY+YR+YK+YD+Y=+Y6+Y/+Y(+Y!+Y+Y+Y +Y+Yþ*Y÷*Yð*Yé*Yâ*YÛ*YÔ*YÍ*YÆ*Y¿*Y¸*Y±*Yª*Y£*Yœ*Y•*YŽ*Y‡*Y€*Yy*Yr*Yk*Yd*Y]*YV*YO*YH*YA*Y:*Y3*Y,*Y%*Y*Y*Y*Y *Y*Yû)Yô)Yí)Yæ)Yß)YØ)YÑ)YÊ)YÃ)Y¼)Yµ)Y®)Y§)Y )Y™)Y’)Y‹)Y„)Y})Yv)Yo)Yh)Ya)YZ)YS)YL)YE)Y>)Y7)Y0)Y))Y")Y)Y)Y )Y)Yÿ(Yø(Yñ(Yê(Yã(YÜ(YÕ(YÎ(YÇ(YÀ(Y¹(Y²(Y«(Y¤(Y(Y–(Y(Yˆ(Y(Yz(Ys(Yl(Ye(Y^(YW(YP(YI(YB(Y;(Y4(Y-(Y&(Y(Y(Y(Y (Y(Yü'Yõ'Yî'Yç'Yà'YÙ'YÒ'YË'YÄ'Y½'Y¶'Y¯'Y¨'Y¡'Yš'Y“'YŒ'Y…'Y~'Yw'Yp'Yi'Yb'Y['YT'YM'YF'Y?'Y8'Y1'Y*'Y#'Y'Y'Y'Y'Y'Yù&Yò&Yë&Yä&YÝ&YÖ&YÏ&YÈ&YÁ&Yº&Y³&Y¬&Y¥&Yž&Y—&Y&Y‰&Y‚&Y{&Yt&Ym&Yf&Y_&YX&YQ&YJ&YC&Y<&Y5&Y.&Y'&Y &Y&Y&Y &Y&Yý%Yö%Yï%Yè%Yá%YÚ%YÓ%YÌ%YÅ%Y¾%Y·%Y°%Y©%Y¢%Y›%Y”%Y%Y†%Y%Yx%Yq%Yj%Yc%Y\%YU%YN%YG%Y@%Y9%Y2%Y+%Y$%Y%Y%Y%Y%Y%Yú$Yó$Yì$Yå$YÞ$Y×$YÐ$YÉ$YÂ$Y»$Y´$Y­$Y¦$YŸ$Y˜$Y‘$YŠ$Yƒ$Y|$Yu$Yn$Yg$Y`$YY$YR$YK$YD$Y=$Y6$Y/$Y($Y!$Y$Y$Y $Y$Yþ#Y÷#Yð#Yé#Yâ#YÛ#YÔ#YÍ#YÆ#Y¿#Y¸#Y±#Yª#Y£#Yœ#Y•#YŽ#Y‡#Y€#Yy#Yr#Yk#Yd#Y]#YV#YO#YH#YA#Y:#Y3#Y,#Y%#Y#Y#Y#Y #Y#Yû"Yô"Yí"Yæ"Yß"YØ"YÑ"YÊ"YÃ"Y¼"Yµ"Y®"Y§"Y "Y™"Y’"Y‹"Y„"Y}"Yv"Yo"Yh"Ya"YZ"YS"YL"YE"Y>"Y7"Y0"Y)"Y""Y"Y"Y "Y"Yÿ!Yø!Yñ!Yê!Yã!YÜ!YÕ!YÎ!YÇ!YÀ!Y¹!Y²!Y«!Y¤!Y!Y–!Y!Yˆ!Y!Yz!Ys!Yl!Ye!Y^!YW!YP!YI!YB!Y;!Y4!Y-!Y&!Y!Y!Y!Y !Y!Yü Yõ Yî Yç Yà YÙ YÒ YË YÄ Y½ Y¶ Y¯ Y¨ Y¡ Yš Y“ YŒ Y… Y~ Yw Yp Yi Yb Y[ YT YM YF Y? Y8 Y1 Y* Y# Y Y Y Y Y YùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYýYöYïYèYáYÚYÓYÌYÅY¾Y·Y°Y©Y¢Y›Y”YY†YYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYýYöYïYèYáYÚYÓYÌYÅY¾Y·Y°Y©Y¢Y›Y”YY†YYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYýYöYïYèYáYÚYÓYÌYÅY¾Y·Y°Y©Y¢Y›Y”YY†YYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYû Yô Yí Yæ Yß YØ YÑ YÊ Yà Y¼ Yµ Y® Y§ Y  Y™ Y’ Y‹ Y„ Y} Yv Yo Yh Ya YZ YS YL YE Y> Y7 Y0 Y) Y" Y Y Y Y Yÿ Yø Yñ Yê Yã YÜ YÕ YÎ YÇ YÀ Y¹ Y² Y« Y¤ Y Y– Y Yˆ Y Yz Ys Yl Ye Y^ YW YP YI YB Y; Y4 Y- Y& Y Y Y Y Y Yü Yõ Yî Yç Yà YÙ YÒ YË YÄ Y½ Y¶ Y¯ Y¨ Y¡ Yš Y“ YŒ Y… Y~ Yw Yp Yi Yb Y[ YT YM YF Y? Y8 Y1 Y* Y# Y Y Y Y Y Yù Yò Yë Yä YÝ YÖ YÏ YÈ YÁ Yº Y³ Y¬ Y¥ Yž Y— Y Y‰ Y‚ Y{ Yt Ym Yf Y_ YX YQ YJ YC Y< Y5 Y. Y' Y Y Y Y Y Yý Yö Yï Yè Yá YÚ YÓ YÌ YÅ Y¾ Y· Y° Y© Y¢ Y› Y” Y Y† Y Yx Yq Yj Yc Y\ YU YN YG Y@ Y9 Y2 Y+ Y$ Y Y Y Y Y YúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCY<Y5Y.Y'Y YYY YYýYöYïYèYáYÚYÓYÌYÅY¾Y·Y°Y©Y¢Y›Y”YY†YYxYqYjYcY\YUYNYGY@Y9Y2Y+Y$YYYYYYúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûÿXôÿXíÿXæÿXßÿXØÿXÑÿXÊÿXÃÿX¼ÿXµÿX®ÿX§ÿX ÿX™ÿX’ÿX‹ÿX„ÿX}ÿXvÿXoÿXhÿXaÿXZÿXSÿXLÿXEÿX>ÿX7ÿX0ÿX)ÿX"ÿXÿXÿX ÿXÿXÿþXøþXñþXêþXãþXÜþXÕþXÎþXÇþXÀþX¹þX²þX«þX¤þXþX–þXþXˆþXþXzþXsþXlþXeþX^þXWþXPþXIþXBþX;þX4þX-þX&þXþXþXþX þXþXüýXõýXîýXçýXàýXÙýXÒýXËýXÄýX½ýX¶ýX¯ýX¨ýX¡ýXšýX“ýXŒýX…ýX~ýXwýXpýXiýXbýX[ýXTýXMýXFýX?ýX8ýX1ýX*ýX#ýXýXýXýXýXýXùüXòüXëüXäüXÝüXÖüXÏüXÈüXÁüXºüX³üX¬üX¥üXžüX—üXüX‰üX‚üX{üXtüXmüXfüX_üXXüXQüXJüXCüX<üX5üX.üX'üX üXüXüX üXüXýûXöûXïûXèûXáûXÚûXÓûXÌûXÅûX¾ûX·ûX°ûX©ûX¢ûX›ûX”ûXûX†ûXûXxûXqûXjûXcûX\ûXUûXNûXGûX@ûX9ûX2ûX+ûX$ûXûXûXûXûXûXúúXóúXìúXåúXÞúX×úXÐúXÉúXÂúX»úX´úX­úX¦úXŸúX˜úX‘úXŠúXƒúX|úXuúXnúXgúX`úXYúXRúXKúXDúX=úX6úX/úX(úX!úXúXúX úXúXþùX÷ùXðùXéùXâùXÛùXÔùXÍùXÆùX¿ùX¸ùX±ùXªùX£ùXœùX•ùXŽùX‡ùX€ùXyùXrùXkùXdùX]ùXVùXOùXHùXAùX:ùX3ùX,ùX%ùXùXùXùX ùXùXûøXôøXíøXæøXßøXØøXÑøXÊøXÃøX¼øXµøX®øX§øX øX™øX’øX‹øX„øX}øXvøXoøXhøXaøXZøXSøXLøXEøX>øX7øX0øX)øX"øXøXøX øXøXÿ÷Xø÷Xñ÷Xê÷Xã÷XÜ÷XÕ÷XÎ÷XÇ÷XÀ÷X¹÷X²÷X«÷X¤÷X÷X–÷X÷Xˆ÷X÷Xz÷Xs÷Xl÷Xe÷X^÷XW÷XP÷XI÷XB÷X;÷X4÷X-÷X&÷X÷X÷X÷X ÷X÷XüöXõöXîöXçöXàöXÙöXÒöXËöXÄöX½öX¶öX¯öX¨öX¡öXšöX“öXŒöX…öX~öXwöXpöXiöXböX[öXTöXMöXFöX?öX8öX1öX*öX#öXöXöXöXöXöXùõXòõXëõXäõXÝõXÖõXÏõXÈõXÁõXºõX³õX¬õX¥õXžõX—õXõX‰õX‚õX{õXtõXmõXfõX_õXXõXQõXJõXCõX<õX5õX.õX'õX õXõXõX õXõXýôXöôXïôXèôXáôXÚôXÓôXÌôXÅôX¾ôX·ôX°ôX©ôX¢ôX›ôX”ôXôX†ôXôXxôXqôXjôXcôX\ôXUôXNôXGôX@ôX9ôX2ôX+ôX$ôXôXôXôXôXôXúóXóóXìóXåóXÞóX×óXÐóXÉóXÂóX»óX´óX­óX¦óXŸóX˜óX‘óXŠóXƒóX|óXuóXnóXgóX`óXYóXRóXKóXDóX=óX6óX/óX(óX!óXóXóX óXóXþòX÷òXðòXéòXâòXÛòXÔòXÍòXÆòX¿òX¸òX±òXªòX£òXœòX•òXŽòX‡òX€òXyòXròXkòXdòX]òXVòXOòXHòXAòX:òX3òX,òX%òXòXòXòX òXòXûñXôñXíñXæñXßñXØñXÑñXÊñXÃñX¼ñXµñX®ñX§ñX ñX™ñX’ñX‹ñX„ñX}ñXvñXoñXhñXañXZñXSñXLñXEñX>ñX7ñX0ñX)ñX"ñXñXñX ñXñXÿðXøðXñðXêðXãðXÜðXÕðXÎðXÇðXÀðX¹ðX²ðX«ðX¤ðXðX–ðXðXˆðXðXzðXsðXlðXeðX^ðXWðXPðXIðXBðX;ðX4ðX-ðX&ðXðXðXðX ðXðXüïXõïXîïXçïXàïXÙïXÒïXËïXÄïX½ïX¶ïX¯ïX¨ïX¡ïXšïX“ïXŒïX…ïX~ïXwïXpïXiïXbïX[ïXTïXMïXFïX?ïX8ïX1ïX*ïX#ïXïXïXïXïXïXùîXòîXëîXäîXÝîXÖîXÏîXÈîXÁîXºîX³îX¬îX¥îXžîX—îXîX‰îX‚îX{îXtîXmîXfîX_îXXîXQîXJîXCîX<îX5îX.îX'îX îXîXîX îXîXýíXöíXïíXèíXáíXÚíXÓíXÌíXÅíX¾íX·íX°íX©íX¢íX›íX”íXíX†íXíXxíXqíXjíXcíX\íXUíXNíXGíX@íX9íX2íX+íX$íXíXíXíXíXíXúìXóìXììXåìXÞìX×ìXÐìXÉìXÂìX»ìX´ìX­ìX¦ìXŸìX˜ìX‘ìXŠìXƒìX|ìXuìXnìXgìX`ìXYìXRìXKìXDìX=ìX6ìX/ìX(ìX!ìXìXìX ìXìXþëX÷ëXðëXéëXâëXÛëXÔëXÍëXÆëX¿ëX¸ëX±ëXªëX£ëXœëX•ëXŽëX‡ëX€ëXyëXrëXkëXdëX]ëXVëXOëXHëXAëX:ëX3ëX,ëX%ëXëXëXëX ëXëXûêXôêXíêXæêXßêXØêXÑêXÊêXÃêX¼êXµêX®êX§êX êX™êX’êX‹êX„êX}êXvêXoêXhêXaêXZêXSêXLêXEêX>êX7êX0êX)êX"êXêXêX êXêXÿéXøéXñéXêéXãéXÜéXÕéXÎéXÇéXÀéX¹éX²éX«éX¤éXéX–éXéXˆéXéXzéXséXléXeéX^éXWéXPéXIéXBéX;éX4éX-éX&éXéXéXéX éXéXüèXõèXîèXçèXàèXÙèXÒèXËèXÄèX½èX¶èX¯èX¨èX¡èXšèX“èXŒèX…èX~èXwèXpèXièXbèX[èXTèXMèXFèX?èX8èX1èX*èX#èXèXèXèXèXèXùçXòçXëçXäçXÝçXÖçXÏçXÈçXÁçXºçX³çX¬çX¥çXžçX—çXçX‰çX‚çX{çXtçXmçXfçX_çXXçXQçXJçXCçX<çX5çX.çX'çX çXçXçX çXçXýæXöæXïæXèæXáæXÚæXÓæXÌæXÅæX¾æX·æX°æX©æX¢æX›æX”æXæX†æXæXxæXqæXjæXcæX\æXUæXNæXGæX@æX9æX2æX+æX$æXæXæXæXæXæXúåXóåXìåXååXÞåX×åXÐåXÉåXÂåX»åX´åX­åX¦åXŸåX˜åX‘åXŠåXƒåX|åXuåXnåXgåX`åXYåXRåXKåXDåX=åX6åX/åX(åX!åXåXåX åXåXþäX÷äXðäXéäXâäXÛäXÔäXÍäXÆäX¿äX¸äX±äXªäX£äXœäX•äXŽäX‡äX€äXyäXräXkäXdäX]äXVäXOäXHäXAäX:äX3äX,äX%äXäXäXäX äXäXûãXôãXíãXæãXßãXØãXÑãXÊãXÃãX¼ãXµãX®ãX§ãX ãX™ãX’ãX‹ãX„ãX}ãXvãXoãXhãXaãXZãXSãXLãXEãX>ãX7ãX0ãX)ãX"ãXãXãX ãXãXÿâXøâXñâXêâXãâXÜâXÕâXÎâXÇâXÀâX¹âX²âX«âX¤âXâX–âXâXˆâXâXzâXsâXlâXeâX^âXWâXPâXIâXBâX;âX4âX-âX&âXâXâXâX âXâXüáXõáXîáXçáXàáXÙáXÒáXËáXÄáX½áX¶áX¯áX¨áX¡áXšáX“áXŒáX…áX~áXwáXpáXiáXbáX[áXTáXMáXFáX?áX8áX1áX*áX#áXáXáXáXáXáXùàXòàXëàXäàXÝàXÖàXÏàXÈàXÁàXºàX³àX¬àX¥àXžàX—àXàX‰àX‚àX{àXtàXmàXfàX_àXXàXQàXJàXCàX<àX5àX.àX'àX àXàXàX àXàXýßXößXïßXèßXáßXÚßXÓßXÌßXÅßX¾ßX·ßX°ßX©ßX¢ßX›ßX”ßXßX†ßXßXxßXqßXjßXcßX\ßXUßXNßXGßX@ßX9ßX2ßX+ßX$ßXßXßXßXßXßXúÞXóÞXìÞXåÞXÞÞX×ÞXÐÞXÉÞXÂÞX»ÞX´ÞX­ÞX¦ÞXŸÞX˜ÞX‘ÞXŠÞXƒÞX|ÞXuÞXnÞXgÞX`ÞXYÞXRÞXKÞXDÞX=ÞX6ÞX/ÞX(ÞX!ÞXÞXÞX ÞXÞXþÝX÷ÝXðÝXéÝXâÝXÛÝXÔÝXÍÝXÆÝX¿ÝX¸ÝX±ÝXªÝX£ÝXœÝX•ÝXŽÝX‡ÝX€ÝXyÝXrÝXkÝXdÝX]ÝXVÝXOÝXHÝXAÝX:ÝX3ÝX,ÝX%ÝXÝXÝXÝX ÝXÝXûÜXôÜXíÜXæÜXßÜXØÜXÑÜXÊÜXÃÜX¼ÜXµÜX®ÜX§ÜX ÜX™ÜX’ÜX‹ÜX„ÜX}ÜXvÜXoÜXhÜXaÜXZÜXSÜXLÜXEÜX>ÜX7ÜX0ÜX)ÜX"ÜXÜXÜX ÜXÜXÿÛXøÛXñÛXêÛXãÛXÜÛXÕÛXÎÛXÇÛXÀÛX¹ÛX²ÛX«ÛX¤ÛXÛX–ÛXÛXˆÛXÛXzÛXsÛXlÛXeÛX^ÛXWÛXPÛXIÛXBÛX;ÛX4ÛX-ÛX&ÛXÛXÛXÛX ÛXÛXüÚXõÚXîÚXçÚXàÚXÙÚXÒÚXËÚXÄÚX½ÚX¶ÚX¯ÚX¨ÚX¡ÚXšÚX“ÚXŒÚX…ÚX~ÚXwÚXpÚXiÚXbÚX[ÚXTÚXMÚXFÚX?ÚX8ÚX1ÚX*ÚX#ÚXÚXÚXÚXÚXÚXùÙXòÙXëÙXäÙXÝÙXÖÙXÏÙXÈÙXÁÙXºÙX³ÙX¬ÙX¥ÙXžÙX—ÙXÙX‰ÙX‚ÙX{ÙXtÙXmÙXfÙX_ÙXXÙXQÙXJÙXCÙX<ÙX5ÙX.ÙX'ÙX ÙXÙXÙX ÙXÙXýØXöØXïØXèØXáØXÚØXÓØXÌØXÅØX¾ØX·ØX°ØX©ØX¢ØX›ØX”ØXØX†ØXØXxØXqØXjØXcØX\ØXUØXNØXGØX@ØX9ØX2ØX+ØX$ØXØXØXØXØXØXú×Xó×Xì×Xå×XÞ×X××XÐ×XÉ×XÂ×X»×X´×X­×X¦×XŸ×X˜×X‘×XŠ×Xƒ×X|×Xu×Xn×Xg×X`×XY×XR×XK×XD×X=×X6×X/×X(×X!×X×X×X ×X×XþÖX÷ÖXðÖXéÖXâÖXÛÖXÔÖXÍÖXÆÖX¿ÖX¸ÖX±ÖXªÖX£ÖXœÖX•ÖXŽÖX‡ÖX€ÖXyÖXrÖXkÖXdÖX]ÖXVÖXOÖXHÖXAÖX:ÖX3ÖX,ÖX%ÖXÖXÖXÖX ÖXÖXûÕXôÕXíÕXæÕXßÕXØÕXÑÕXÊÕXÃÕX¼ÕXµÕX®ÕX§ÕX ÕX™ÕX’ÕX‹ÕX„ÕX}ÕXvÕXoÕXhÕXaÕXZÕXSÕXLÕXEÕX>ÕX7ÕX0ÕX)ÕX"ÕXÕXÕX ÕXÕXÿÔXøÔXñÔXêÔXãÔXÜÔXÕÔXÎÔXÇÔXÀÔX¹ÔX²ÔX«ÔX¤ÔXÔX–ÔXÔXˆÔXÔXzÔXsÔXlÔXeÔX^ÔXWÔXPÔXIÔXBÔX;ÔX4ÔX-ÔX&ÔXÔXÔXÔX ÔXÔXüÓXõÓXîÓXçÓXàÓXÙÓXÒÓXËÓXÄÓX½ÓX¶ÓX¯ÓX¨ÓX¡ÓXšÓX“ÓXŒÓX…ÓX~ÓXwÓXpÓXiÓXbÓX[ÓXTÓXMÓXFÓX?ÓX8ÓX1ÓX*ÓX#ÓXÓXÓXÓXÓXÓXùÒXòÒXëÒXäÒXÝÒXÖÒXÏÒXÈÒXÁÒXºÒX³ÒX¬ÒX¥ÒXžÒX—ÒXÒX‰ÒX‚ÒX{ÒXtÒXmÒXfÒX_ÒXXÒXQÒXJÒXCÒX<ÒX5ÒX.ÒX'ÒX ÒXÒXÒX ÒXÒXýÑXöÑXïÑXèÑXáÑXÚÑXÓÑXÌÑXÅÑX¾ÑX·ÑX°ÑX©ÑX¢ÑX›ÑX”ÑXÑX†ÑXÑXxÑXqÑXjÑXcÑX\ÑXUÑXNÑXGÑX@ÑX9ÑX2ÑX+ÑX$ÑXÑXÑXÑXÑXÑXúÐXóÐXìÐXåÐXÞÐX×ÐXÐÐXÉÐXÂÐX»ÐX´ÐX­ÐX¦ÐXŸÐX˜ÐX‘ÐXŠÐXƒÐX|ÐXuÐXnÐXgÐX`ÐXYÐXRÐXKÐXDÐX=ÐX6ÐX/ÐX(ÐX!ÐXÐXÐX ÐXÐXþÏX÷ÏXðÏXéÏXâÏXÛÏXÔÏXÍÏXÆÏX¿ÏX¸ÏX±ÏXªÏX£ÏXœÏX•ÏXŽÏX‡ÏX€ÏXyÏXrÏXkÏXdÏX]ÏXVÏXOÏXHÏXAÏX:ÏX3ÏX,ÏX%ÏXÏXÏXÏX ÏXÏXûÎXôÎXíÎXæÎXßÎXØÎXÑÎXÊÎXÃÎX¼ÎXµÎX®ÎX§ÎX ÎX™ÎX’ÎX‹ÎX„ÎX}ÎXvÎXoÎXhÎXaÎXZÎXSÎXLÎXEÎX>ÎX7ÎX0ÎX)ÎX"ÎXÎXÎX ÎXÎXÿÍXøÍXñÍXêÍXãÍXÜÍXÕÍXÎÍXÇÍXÀÍX¹ÍX²ÍX«ÍX¤ÍXÍX–ÍXÍXˆÍXÍXzÍXsÍXlÍXeÍX^ÍXWÍXPÍXIÍXBÍX;ÍX4ÍX-ÍX&ÍXÍXÍXÍX ÍXÍXüÌXõÌXîÌXçÌXàÌXÙÌXÒÌXËÌXÄÌX½ÌX¶ÌX¯ÌX¨ÌX¡ÌXšÌX“ÌXŒÌX…ÌX~ÌXwÌXpÌXiÌXbÌX[ÌXTÌXMÌXFÌX?ÌX8ÌX1ÌX*ÌX#ÌXÌXÌXÌXÌXÌXùËXòËXëËXäËXÝËXÖËXÏËXÈËXÁËXºËX³ËX¬ËX¥ËXžËX—ËXËX‰ËX‚ËX{ËXtËXmËXfËX_ËXXËXQËXJËXCËX<ËX5ËX.ËX'ËX ËXËXËX ËXËXýÊXöÊXïÊXèÊXáÊXÚÊXÓÊXÌÊXÅÊX¾ÊX·ÊX°ÊX©ÊX¢ÊX›ÊX”ÊXÊX†ÊXÊXxÊXqÊXjÊXcÊX\ÊXUÊXNÊXGÊX@ÊX9ÊX2ÊX+ÊX$ÊXÊXÊXÊXÊXÊXúÉXóÉXìÉXåÉXÞÉX×ÉXÐÉXÉÉXÂÉX»ÉX´ÉX­ÉX¦ÉXŸÉX˜ÉX‘ÉXŠÉXƒÉX|ÉXuÉXnÉXgÉX`ÉXYÉXRÉXKÉXDÉX=ÉX6ÉX/ÉX(ÉX!ÉXÉXÉX ÉXÉXþÈX÷ÈXðÈXéÈXâÈXÛÈXÔÈXÍÈXÆÈX¿ÈX¸ÈX±ÈXªÈX£ÈXœÈX•ÈXŽÈX‡ÈX€ÈXyÈXrÈXkÈXdÈX]ÈXVÈXOÈXHÈXAÈX:ÈX3ÈX,ÈX%ÈXÈXÈXÈX ÈXÈXûÇXôÇXíÇXæÇXßÇXØÇXÑÇXÊÇXÃÇX¼ÇXµÇX®ÇX§ÇX ÇX™ÇX’ÇX‹ÇX„ÇX}ÇXvÇXoÇXhÇXaÇXZÇXSÇXLÇXEÇX>ÇX7ÇX0ÇX)ÇX"ÇXÇXÇX ÇXÇXÿÆXøÆXñÆXêÆXãÆXÜÆXÕÆXÎÆXÇÆXÀÆX¹ÆX²ÆX«ÆX¤ÆXÆX–ÆXÆXˆÆXÆXzÆXsÆXlÆXeÆX^ÆXWÆXPÆXIÆXBÆX;ÆX4ÆX-ÆX&ÆXÆXÆXÆX ÆXÆXüÅXõÅXîÅXçÅXàÅXÙÅXÒÅXËÅXÄÅX½ÅX¶ÅX¯ÅX¨ÅX¡ÅXšÅX“ÅXŒÅX…ÅX~ÅXwÅXpÅXiÅXbÅX[ÅXTÅXMÅXFÅX?ÅX8ÅX1ÅX*ÅX#ÅXÅXÅXÅXÅXÅXùÄXòÄXëÄXäÄXÝÄXÖÄXÏÄXÈÄXÁÄXºÄX³ÄX¬ÄX¥ÄXžÄX—ÄXÄX‰ÄX‚ÄX{ÄXtÄXmÄXfÄX_ÄXXÄXQÄXJÄXCÄX<ÄX5ÄX.ÄX'ÄX ÄXÄXÄX ÄXÄXýÃXöÃXïÃXèÃXáÃXÚÃXÓÃXÌÃXÅÃX¾ÃX·ÃX°ÃX©ÃX¢ÃX›ÃX”ÃXÃX†ÃXÃXxÃXqÃXjÃXcÃX\ÃXUÃXNÃXGÃX@ÃX9ÃX2ÃX+ÃX$ÃXÃXÃXÃXÃXÃXúÂXóÂXìÂXåÂXÞÂX×ÂXÐÂXÉÂXÂÂX»ÂX´ÂX­ÂX¦ÂXŸÂX˜ÂX‘ÂXŠÂXƒÂX|ÂXuÂXnÂXgÂX`ÂXYÂXRÂXKÂXDÂX=ÂX6ÂX/ÂX(ÂX!ÂXÂXÂX ÂXÂXþÁX÷ÁXðÁXéÁXâÁXÛÁXÔÁXÍÁXÆÁX¿ÁX¸ÁX±ÁXªÁX£ÁXœÁX•ÁXŽÁX‡ÁX€ÁXyÁXrÁXkÁXdÁX]ÁXVÁXOÁXHÁXAÁX:ÁX3ÁX,ÁX%ÁXÁXÁXÁX ÁXÁXûÀXôÀXíÀXæÀXßÀXØÀXÑÀXÊÀXÃÀX¼ÀXµÀX®ÀX§ÀX ÀX™ÀX’ÀX‹ÀX„ÀX}ÀXvÀXoÀXhÀXaÀXZÀXSÀXLÀXEÀX>ÀX7ÀX0ÀX)ÀX"ÀXÀXÀX ÀXÀXÿ¿Xø¿Xñ¿Xê¿Xã¿XÜ¿XÕ¿XοXÇ¿XÀ¿X¹¿X²¿X«¿X¤¿X¿X–¿X¿Xˆ¿X¿Xz¿Xs¿Xl¿Xe¿X^¿XW¿XP¿XI¿XB¿X;¿X4¿X-¿X&¿X¿X¿X¿X ¿X¿Xü¾Xõ¾Xî¾Xç¾Xà¾XÙ¾XÒ¾X˾XľX½¾X¶¾X¯¾X¨¾X¡¾Xš¾X“¾XŒ¾X…¾X~¾Xw¾Xp¾Xi¾Xb¾X[¾XT¾XM¾XF¾X?¾X8¾X1¾X*¾X#¾X¾X¾X¾X¾X¾Xù½Xò½Xë½Xä½XݽXÖ½XϽXȽXÁ½Xº½X³½X¬½X¥½Xž½X—½X½X‰½X‚½X{½Xt½Xm½Xf½X_½XX½XQ½XJ½XC½X<½X5½X.½X'½X ½X½X½X ½X½Xý¼Xö¼Xï¼Xè¼Xá¼XÚ¼XÓ¼X̼XżX¾¼X·¼X°¼X©¼X¢¼X›¼X”¼X¼X†¼X¼Xx¼Xq¼Xj¼Xc¼X\¼XU¼XN¼XG¼X@¼X9¼X2¼X+¼X$¼X¼X¼X¼X¼X¼Xú»Xó»Xì»Xå»XÞ»X×»XлXÉ»X»X»»X´»X­»X¦»XŸ»X˜»X‘»XŠ»Xƒ»X|»Xu»Xn»Xg»X`»XY»XR»XK»XD»X=»X6»X/»X(»X!»X»X»X »X»XþºX÷ºXðºXéºXâºXÛºXÔºXͺXƺX¿ºX¸ºX±ºXªºX£ºXœºX•ºXŽºX‡ºX€ºXyºXrºXkºXdºX]ºXVºXOºXHºXAºX:ºX3ºX,ºX%ºXºXºXºX ºXºXû¹Xô¹Xí¹Xæ¹Xß¹XعXѹXʹXùX¼¹Xµ¹X®¹X§¹X ¹X™¹X’¹X‹¹X„¹X}¹Xv¹Xo¹Xh¹Xa¹XZ¹XS¹XL¹XE¹X>¹X7¹X0¹X)¹X"¹X¹X¹X ¹X¹Xÿ¸Xø¸Xñ¸Xê¸Xã¸XܸXÕ¸XθXǸXÀ¸X¹¸X²¸X«¸X¤¸X¸X–¸X¸Xˆ¸X¸Xz¸Xs¸Xl¸Xe¸X^¸XW¸XP¸XI¸XB¸X;¸X4¸X-¸X&¸X¸X¸X¸X ¸X¸Xü·Xõ·Xî·Xç·Xà·XÙ·XÒ·XË·XÄ·X½·X¶·X¯·X¨·X¡·Xš·X“·XŒ·X…·X~·Xw·Xp·Xi·Xb·X[·XT·XM·XF·X?·X8·X1·X*·X#·X·X·X·X·X·Xù¶Xò¶Xë¶Xä¶XݶXÖ¶X϶XȶXÁ¶Xº¶X³¶X¬¶X¥¶Xž¶X—¶X¶X‰¶X‚¶X{¶Xt¶Xm¶Xf¶X_¶XX¶XQ¶XJ¶XC¶X<¶X5¶X.¶X'¶X ¶X¶X¶X ¶X¶XýµXöµXïµXèµXáµXÚµXÓµX̵XŵX¾µX·µX°µX©µX¢µX›µX”µXµX†µXµXxµXqµXjµXcµX\µXUµXNµXGµX@µX9µX2µX+µX$µXµXµXµXµXµXú´Xó´Xì´Xå´XÞ´X×´XдXÉ´X´X»´X´´X­´X¦´XŸ´X˜´X‘´XŠ´Xƒ´X|´Xu´Xn´Xg´X`´XY´XR´XK´XD´X=´X6´X/´X(´X!´X´X´X ´X´Xþ³X÷³Xð³Xé³Xâ³XÛ³XÔ³XͳXƳX¿³X¸³X±³Xª³X£³Xœ³X•³X޳X‡³X€³Xy³Xr³Xk³Xd³X]³XV³XO³XH³XA³X:³X3³X,³X%³X³X³X³X ³X³Xû²Xô²Xí²Xæ²Xß²XزXѲXʲXòX¼²Xµ²X®²X§²X ²X™²X’²X‹²X„²X}²Xv²Xo²Xh²Xa²XZ²XS²XL²XE²X>²X7²X0²X)²X"²X²X²X ²X²Xÿ±Xø±Xñ±Xê±Xã±XܱXÕ±XαXDZXÀ±X¹±X²±X«±X¤±X±X–±X±Xˆ±X±Xz±Xs±Xl±Xe±X^±XW±XP±XI±XB±X;±X4±X-±X&±X±X±X±X ±X±Xü°Xõ°Xî°Xç°Xà°XÙ°XÒ°X˰XİX½°X¶°X¯°X¨°X¡°Xš°X“°XŒ°X…°X~°Xw°Xp°Xi°Xb°X[°XT°XM°XF°X?°X8°X1°X*°X#°X°X°X°X°X°Xù¯Xò¯Xë¯Xä¯XݯXÖ¯XϯXȯXÁ¯Xº¯X³¯X¬¯X¥¯Xž¯X—¯X¯X‰¯X‚¯X{¯Xt¯Xm¯Xf¯X_¯XX¯XQ¯XJ¯XC¯X<¯X5¯X.¯X'¯X ¯X¯X¯X ¯X¯Xý®Xö®Xï®Xè®Xá®XÚ®XÓ®XÌ®XÅ®X¾®X·®X°®X©®X¢®X›®X”®X®X†®X®Xx®Xq®Xj®Xc®X\®XU®XN®XG®X@®X9®X2®X+®X$®X®X®X®X®X®Xú­Xó­Xì­Xå­XÞ­X×­XЭXÉ­X­X»­X´­X­­X¦­XŸ­X˜­X‘­XŠ­Xƒ­X|­Xu­Xn­Xg­X`­XY­XR­XK­XD­X=­X6­X/­X(­X!­X­X­X ­X­Xþ¬X÷¬Xð¬Xé¬Xâ¬XÛ¬XÔ¬XͬXƬX¿¬X¸¬X±¬Xª¬X£¬Xœ¬X•¬XެX‡¬X€¬Xy¬Xr¬Xk¬Xd¬X]¬XV¬XO¬XH¬XA¬X:¬X3¬X,¬X%¬X¬X¬X¬X ¬X¬Xû«Xô«Xí«Xæ«Xß«XØ«XÑ«XÊ«XëX¼«Xµ«X®«X§«X «X™«X’«X‹«X„«X}«Xv«Xo«Xh«Xa«XZ«XS«XL«XE«X>«X7«X0«X)«X"«X«X«X «X«XÿªXøªXñªXêªXãªXܪXÕªXΪXǪXÀªX¹ªX²ªX«ªX¤ªXªX–ªXªXˆªXªXzªXsªXlªXeªX^ªXWªXPªXIªXBªX;ªX4ªX-ªX&ªXªXªXªX ªXªXü©Xõ©Xî©Xç©Xà©XÙ©XÒ©XË©XÄ©X½©X¶©X¯©X¨©X¡©Xš©X“©XŒ©X…©X~©Xw©Xp©Xi©Xb©X[©XT©XM©XF©X?©X8©X1©X*©X#©X©X©X©X©X©Xù¨Xò¨Xë¨Xä¨XݨXÖ¨XϨXȨXÁ¨Xº¨X³¨X¬¨X¥¨Xž¨X—¨X¨X‰¨X‚¨X{¨Xt¨Xm¨Xf¨X_¨XX¨XQ¨XJ¨XC¨X<¨X5¨X.¨X'¨X ¨X¨X¨X ¨X¨Xý§Xö§Xï§Xè§Xá§XÚ§XÓ§X̧XŧX¾§X·§X°§X©§X¢§X›§X”§X§X†§X§Xx§Xq§Xj§Xc§X\§XU§XN§XG§X@§X9§X2§X+§X$§X§X§X§X§X§Xú¦Xó¦Xì¦Xå¦XÞ¦XצXЦXɦX¦X»¦X´¦X­¦X¦¦XŸ¦X˜¦X‘¦XЦXƒ¦X|¦Xu¦Xn¦Xg¦X`¦XY¦XR¦XK¦XD¦X=¦X6¦X/¦X(¦X!¦X¦X¦X ¦X¦Xþ¥X÷¥Xð¥Xé¥Xâ¥XÛ¥XÔ¥XÍ¥XÆ¥X¿¥X¸¥X±¥Xª¥X£¥Xœ¥X•¥XŽ¥X‡¥X€¥Xy¥Xr¥Xk¥Xd¥X]¥XV¥XO¥XH¥XA¥X:¥X3¥X,¥X%¥X¥X¥X¥X ¥X¥Xû¤Xô¤Xí¤Xæ¤XߤXؤXѤXʤXäX¼¤Xµ¤X®¤X§¤X ¤X™¤X’¤X‹¤X„¤X}¤Xv¤Xo¤Xh¤Xa¤XZ¤XS¤XL¤XE¤X>¤X7¤X0¤X)¤X"¤X¤X¤X ¤X¤Xÿ£Xø£Xñ£Xê£Xã£XÜ£XÕ£XΣXÇ£XÀ£X¹£X²£X«£X¤£X£X–£X£Xˆ£X£Xz£Xs£Xl£Xe£X^£XW£XP£XI£XB£X;£X4£X-£X&£X£X£X£X £X£Xü¢Xõ¢Xî¢Xç¢Xà¢XÙ¢XÒ¢XË¢XÄ¢X½¢X¶¢X¯¢X¨¢X¡¢Xš¢X“¢XŒ¢X…¢X~¢Xw¢Xp¢Xi¢Xb¢X[¢XT¢XM¢XF¢X?¢X8¢X1¢X*¢X#¢X¢X¢X¢X¢X¢Xù¡Xò¡Xë¡Xä¡XÝ¡XÖ¡XÏ¡XÈ¡XÁ¡Xº¡X³¡X¬¡X¥¡Xž¡X—¡X¡X‰¡X‚¡X{¡Xt¡Xm¡Xf¡X_¡XX¡XQ¡XJ¡XC¡X<¡X5¡X.¡X'¡X ¡X¡X¡X ¡X¡Xý Xö Xï Xè Xá XÚ XÓ XÌ XÅ X¾ X· X° X© X¢ X› X” X X† X Xx Xq Xj Xc X\ XU XN XG X@ X9 X2 X+ X$ X X X X X XúŸXóŸXìŸXåŸXÞŸXןXПXÉŸXŸX»ŸX´ŸX­ŸX¦ŸXŸŸX˜ŸX‘ŸXŠŸXƒŸX|ŸXuŸXnŸXgŸX`ŸXYŸXRŸXKŸXDŸX=ŸX6ŸX/ŸX(ŸX!ŸXŸXŸX ŸXŸXþžX÷žXðžXéžXâžXÛžXÔžXÍžXÆžX¿žX¸žX±žXªžX£žXœžX•žXŽžX‡žX€žXyžXržXkžXdžX]žXVžXOžXHžXAžX:žX3žX,žX%žXžXžXžX žXžXûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿœXøœXñœXêœXãœXÜœXÕœXΜXÇœXÀœX¹œX²œX«œX¤œXœX–œXœXˆœXœXzœXsœXlœXeœX^œXWœXPœXIœXBœX;œX4œX-œX&œXœXœXœX œXœXü›Xõ›Xî›Xç›Xà›XÙ›XÒ›XË›XÄ›X½›X¶›X¯›X¨›X¡›Xš›X“›XŒ›X…›X~›Xw›Xp›Xi›Xb›X[›XT›XM›XF›X?›X8›X1›X*›X#›X›X›X›X›X›XùšXòšXëšXäšXÝšXÖšXÏšXÈšXÁšXºšX³šX¬šX¥šXžšX—šXšX‰šX‚šX{šXtšXmšXfšX_šXXšXQšXJšXCšX<šX5šX.šX'šX šXšXšX šXšXý™Xö™Xï™Xè™Xá™XÚ™XÓ™XÌ™XÅ™X¾™X·™X°™X©™X¢™X›™X”™X™X†™X™Xx™Xq™Xj™Xc™X\™XU™XN™XG™X@™X9™X2™X+™X$™X™X™X™X™X™Xú˜Xó˜Xì˜Xå˜XÞ˜XטXИXɘX˜X»˜X´˜X­˜X¦˜XŸ˜X˜˜X‘˜XŠ˜Xƒ˜X|˜Xu˜Xn˜Xg˜X`˜XY˜XR˜XK˜XD˜X=˜X6˜X/˜X(˜X!˜X˜X˜X ˜X˜Xþ—X÷—Xð—Xé—Xâ—XÛ—XÔ—XÍ—XÆ—X¿—X¸—X±—Xª—X£—Xœ—X•—XŽ—X‡—X€—Xy—Xr—Xk—Xd—X]—XV—XO—XH—XA—X:—X3—X,—X%—X—X—X—X —X—Xû–Xô–Xí–Xæ–Xß–XØ–XÑ–XÊ–XÖX¼–Xµ–X®–X§–X –X™–X’–X‹–X„–X}–Xv–Xo–Xh–Xa–XZ–XS–XL–XE–X>–X7–X0–X)–X"–X–X–X –X–Xÿ•Xø•Xñ•Xê•Xã•XÜ•XÕ•XΕXÇ•XÀ•X¹•X²•X«•X¤•X•X–•X•Xˆ•X•Xz•Xs•Xl•Xe•X^•XW•XP•XI•XB•X;•X4•X-•X&•X•X•X•X •X•Xü”Xõ”Xî”Xç”Xà”XÙ”XÒ”XË”XÄ”X½”X¶”X¯”X¨”X¡”Xš”X“”XŒ”X…”X~”Xw”Xp”Xi”Xb”X[”XT”XM”XF”X?”X8”X1”X*”X#”X”X”X”X”X”Xù“Xò“Xë“Xä“XÝ“XÖ“XÏ“XÈ“XÁ“Xº“X³“X¬“X¥“Xž“X—“X“X‰“X‚“X{“Xt“Xm“Xf“X_“XX“XQ“XJ“XC“X<“X5“X.“X'“X “X“X“X “X“Xý’Xö’Xï’Xè’Xá’XÚ’XÓ’XÌ’XÅ’X¾’X·’X°’X©’X¢’X›’X”’X’X†’X’Xx’Xq’Xj’Xc’X\’XU’XN’XG’X@’X9’X2’X+’X$’X’X’X’X’X’Xú‘Xó‘Xì‘Xå‘XÞ‘XבXБXÉ‘X‘X»‘X´‘X­‘X¦‘XŸ‘X˜‘X‘‘XŠ‘Xƒ‘X|‘Xu‘Xn‘Xg‘X`‘XY‘XR‘XK‘XD‘X=‘X6‘X/‘X(‘X!‘X‘X‘X ‘X‘XþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿŽXøŽXñŽXêŽXãŽXÜŽXÕŽXÎŽXÇŽXÀŽX¹ŽX²ŽX«ŽX¤ŽXŽX–ŽXŽXˆŽXŽXzŽXsŽXlŽXeŽX^ŽXWŽXPŽXIŽXBŽX;ŽX4ŽX-ŽX&ŽXŽXŽXŽX ŽXŽXüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùŒXòŒXëŒXäŒXÝŒXÖŒXÏŒXÈŒXÁŒXºŒX³ŒX¬ŒX¥ŒXžŒX—ŒXŒX‰ŒX‚ŒX{ŒXtŒXmŒXfŒX_ŒXXŒXQŒXJŒXCŒX<ŒX5ŒX.ŒX'ŒX ŒXŒXŒX ŒXŒXý‹Xö‹Xï‹Xè‹Xá‹XÚ‹XÓ‹XÌ‹XÅ‹X¾‹X·‹X°‹X©‹X¢‹X›‹X”‹X‹X†‹X‹Xx‹Xq‹Xj‹Xc‹X\‹XU‹XN‹XG‹X@‹X9‹X2‹X+‹X$‹X‹X‹X‹X‹X‹XúŠXóŠXìŠXåŠXÞŠX׊XЊXÉŠXŠX»ŠX´ŠX­ŠX¦ŠXŸŠX˜ŠX‘ŠXŠŠXƒŠX|ŠXuŠXnŠXgŠX`ŠXYŠXRŠXKŠXDŠX=ŠX6ŠX/ŠX(ŠX!ŠXŠXŠX ŠXŠXþ‰X÷‰Xð‰Xé‰Xâ‰XÛ‰XÔ‰X͉XƉX¿‰X¸‰X±‰Xª‰X£‰Xœ‰X•‰XމX‡‰X€‰Xy‰Xr‰Xk‰Xd‰X]‰XV‰XO‰XH‰XA‰X:‰X3‰X,‰X%‰X‰X‰X‰X ‰X‰XûˆXôˆXíˆXæˆX߈X؈XшXʈXÈX¼ˆXµˆX®ˆX§ˆX ˆX™ˆX’ˆX‹ˆX„ˆX}ˆXvˆXoˆXhˆXaˆXZˆXSˆXLˆXEˆX>ˆX7ˆX0ˆX)ˆX"ˆXˆXˆX ˆXˆXÿ‡Xø‡Xñ‡Xê‡Xã‡X܇XÕ‡X·XLJXÀ‡X¹‡X²‡X«‡X¤‡X‡X–‡X‡Xˆ‡X‡Xz‡Xs‡Xl‡Xe‡X^‡XW‡XP‡XI‡XB‡X;‡X4‡X-‡X&‡X‡X‡X‡X ‡X‡Xü†Xõ†Xî†Xç†Xà†XÙ†XÒ†XˆXĆX½†X¶†X¯†X¨†X¡†Xš†X“†XŒ†X…†X~†Xw†Xp†Xi†Xb†X[†XT†XM†XF†X?†X8†X1†X*†X#†X†X†X†X†X†Xù…Xò…Xë…Xä…XÝ…XÖ…XÏ…XÈ…XÁ…Xº…X³…X¬…X¥…Xž…X—…X…X‰…X‚…X{…Xt…Xm…Xf…X_…XX…XQ…XJ…XC…X<…X5…X.…X'…X …X…X…X …X…Xý„Xö„Xï„Xè„Xá„XÚ„XÓ„XÌ„XÅ„X¾„X·„X°„X©„X¢„X›„X”„X„X†„X„Xx„Xq„Xj„Xc„X\„XU„XN„XG„X@„X9„X2„X+„X$„X„X„X„X„X„XúƒXóƒXìƒXåƒXÞƒX׃XЃXɃXƒX»ƒX´ƒX­ƒX¦ƒXŸƒX˜ƒX‘ƒXŠƒXƒƒX|ƒXuƒXnƒXgƒX`ƒXYƒXRƒXKƒXDƒX=ƒX6ƒX/ƒX(ƒX!ƒXƒXƒX ƒXƒXþ‚X÷‚Xð‚Xé‚Xâ‚XÛ‚XÔ‚XÍ‚XÆ‚X¿‚X¸‚X±‚Xª‚X£‚Xœ‚X•‚XŽ‚X‡‚X€‚Xy‚Xr‚Xk‚Xd‚X]‚XV‚XO‚XH‚XA‚X:‚X3‚X,‚X%‚X‚X‚X‚X ‚X‚XûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿ€Xø€Xñ€Xê€Xã€XÜ€XÕ€X΀XÇ€XÀ€X¹€X²€X«€X¤€X€X–€X€Xˆ€X€Xz€Xs€Xl€Xe€X^€XW€XP€XI€XB€X;€X4€X-€X&€X€X€X€X €X€XüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXù~Xò~Xë~Xä~XÝ~XÖ~XÏ~XÈ~XÁ~Xº~X³~X¬~X¥~Xž~X—~X~X‰~X‚~X{~Xt~Xm~Xf~X_~XX~XQ~XJ~XC~X<~X5~X.~X'~X ~X~X~X ~X~Xý}Xö}Xï}Xè}Xá}XÚ}XÓ}XÌ}XÅ}X¾}X·}X°}X©}X¢}X›}X”}X}X†}X}Xx}Xq}Xj}Xc}X\}XU}XN}XG}X@}X9}X2}X+}X$}X}X}X}X}X}Xú|Xó|Xì|Xå|XÞ|X×|XÐ|XÉ|XÂ|X»|X´|X­|X¦|XŸ|X˜|X‘|XŠ|Xƒ|X||Xu|Xn|Xg|X`|XY|XR|XK|XD|X=|X6|X/|X(|X!|X|X|X |X|Xþ{X÷{Xð{Xé{Xâ{XÛ{XÔ{XÍ{XÆ{X¿{X¸{X±{Xª{X£{Xœ{X•{XŽ{X‡{X€{Xy{Xr{Xk{Xd{X]{XV{XO{XH{XA{X:{X3{X,{X%{X{X{X{X {X{XûzXôzXízXæzXßzXØzXÑzXÊzXÃzX¼zXµzX®zX§zX zX™zX’zX‹zX„zX}zXvzXozXhzXazXZzXSzXLzXEzX>zX7zX0zX)zX"zXzXzX zXzXÿyXøyXñyXêyXãyXÜyXÕyXÎyXÇyXÀyX¹yX²yX«yX¤yXyX–yXyXˆyXyXzyXsyXlyXeyX^yXWyXPyXIyXByX;yX4yX-yX&yXyXyXyX yXyXüxXõxXîxXçxXàxXÙxXÒxXËxXÄxX½xX¶xX¯xX¨xX¡xXšxX“xXŒxX…xX~xXwxXpxXixXbxX[xXTxXMxXFxX?xX8xX1xX*xX#xXxXxXxXxXxXùwXòwXëwXäwXÝwXÖwXÏwXÈwXÁwXºwX³wX¬wX¥wXžwX—wXwX‰wX‚wX{wXtwXmwXfwX_wXXwXQwXJwXCwXsX7sX0sX)sX"sXsXsX sXsXÿrXørXñrXêrXãrXÜrXÕrXÎrXÇrXÀrX¹rX²rX«rX¤rXrX–rXrXˆrXrXzrXsrXlrXerX^rXWrXPrXIrXBrX;rX4rX-rX&rXrXrXrX rXrXüqXõqXîqXçqXàqXÙqXÒqXËqXÄqX½qX¶qX¯qX¨qX¡qXšqX“qXŒqX…qX~qXwqXpqXiqXbqX[qXTqXMqXFqX?qX8qX1qX*qX#qXqXqXqXqXqXùpXòpXëpXäpXÝpXÖpXÏpXÈpXÁpXºpX³pX¬pX¥pXžpX—pXpX‰pX‚pX{pXtpXmpXfpX_pXXpXQpXJpXCpXlX7lX0lX)lX"lXlXlX lXlXÿkXøkXñkXêkXãkXÜkXÕkXÎkXÇkXÀkX¹kX²kX«kX¤kXkX–kXkXˆkXkXzkXskXlkXekX^kXWkXPkXIkXBkX;kX4kX-kX&kXkXkXkX kXkXüjXõjXîjXçjXàjXÙjXÒjXËjXÄjX½jX¶jX¯jX¨jX¡jXšjX“jXŒjX…jX~jXwjXpjXijXbjX[jXTjXMjXFjX?jX8jX1jX*jX#jXjXjXjXjXjXùiXòiXëiXäiXÝiXÖiXÏiXÈiXÁiXºiX³iX¬iX¥iXžiX—iXiX‰iX‚iX{iXtiXmiXfiX_iXXiXQiXJiXCiXeX7eX0eX)eX"eXeXeX eXeXÿdXødXñdXêdXãdXÜdXÕdXÎdXÇdXÀdX¹dX²dX«dX¤dXdX–dXdXˆdXdXzdXsdXldXedX^dXWdXPdXIdXBdX;dX4dX-dX&dXdXdXdX dXdXücXõcXîcXçcXàcXÙcXÒcXËcXÄcX½cX¶cX¯cX¨cX¡cXšcX“cXŒcX…cX~cXwcXpcXicXbcX[cXTcXMcXFcX?cX8cX1cX*cX#cXcXcXcXcXcXùbXòbXëbXäbXÝbXÖbXÏbXÈbXÁbXºbX³bX¬bX¥bXžbX—bXbX‰bX‚bX{bXtbXmbXfbX_bXXbXQbXJbXCbX^X7^X0^X)^X"^X^X^X ^X^Xÿ]Xø]Xñ]Xê]Xã]XÜ]XÕ]XÎ]XÇ]XÀ]X¹]X²]X«]X¤]X]X–]X]Xˆ]X]Xz]Xs]Xl]Xe]X^]XW]XP]XI]XB]X;]X4]X-]X&]X]X]X]X ]X]Xü\Xõ\Xî\Xç\Xà\XÙ\XÒ\XË\XÄ\X½\X¶\X¯\X¨\X¡\Xš\X“\XŒ\X…\X~\Xw\Xp\Xi\Xb\X[\XT\XM\XF\X?\X8\X1\X*\X#\X\X\X\X\X\Xù[Xò[Xë[Xä[XÝ[XÖ[XÏ[XÈ[XÁ[Xº[X³[X¬[X¥[Xž[X—[X[X‰[X‚[X{[Xt[Xm[Xf[X_[XX[XQ[XJ[XC[X<[X5[X.[X'[X [X[X[X [X[XýZXöZXïZXèZXáZXÚZXÓZXÌZXÅZX¾ZX·ZX°ZX©ZX¢ZX›ZX”ZXZX†ZXZXxZXqZXjZXcZX\ZXUZXNZXGZX@ZX9ZX2ZX+ZX$ZXZXZXZXZXZXúYXóYXìYXåYXÞYX×YXÐYXÉYXÂYX»YX´YX­YX¦YXŸYX˜YX‘YXŠYXƒYX|YXuYXnYXgYX`YXYYXRYXKYXDYX=YX6YX/YX(YX!YXYXYX YXYXþXX÷XXðXXéXXâXXÛXXÔXXÍXXÆXX¿XX¸XX±XXªXX£XXœXX•XXŽXX‡XX€XXyXXrXXkXXdXX]XXVXXOXXHXXAXX:XX3XX,XX%XXXXXXXX XXXXûWXôWXíWXæWXßWXØWXÑWXÊWXÃWX¼WXµWX®WX§WX WX™WX’WX‹WX„WX}WXvWXoWXhWXaWXZWXSWXLWXEWX>WX7WX0WX)WX"WXWXWX WXWXÿVXøVXñVXêVXãVXÜVXÕVXÎVXÇVXÀVX¹VX²VX«VX¤VXVX–VXVXˆVXVXzVXsVXlVXeVX^VXWVXPVXIVXBVX;VX4VX-VX&VXVXVXVX VXVXüUXõUXîUXçUXàUXÙUXÒUXËUXÄUX½UX¶UX¯UX¨UX¡UXšUX“UXŒUX…UX~UXwUXpUXiUXbUX[UXTUXMUXFUX?UX8UX1UX*UX#UXUXUXUXUXUXùTXòTXëTXäTXÝTXÖTXÏTXÈTXÁTXºTX³TX¬TX¥TXžTX—TXTX‰TX‚TX{TXtTXmTXfTX_TXXTXQTXJTXCTXPX7PX0PX)PX"PXPXPX PXPXÿOXøOXñOXêOXãOXÜOXÕOXÎOXÇOXÀOX¹OX²OX«OX¤OXOX–OXOXˆOXOXzOXsOXlOXeOX^OXWOXPOXIOXBOX;OX4OX-OX&OXOXOXOX OXOXüNXõNXîNXçNXàNXÙNXÒNXËNXÄNX½NX¶NX¯NX¨NX¡NXšNX“NXŒNX…NX~NXwNXpNXiNXbNX[NXTNXMNXFNX?NX8NX1NX*NX#NXNXNXNXNXNXùMXòMXëMXäMXÝMXÖMXÏMXÈMXÁMXºMX³MX¬MX¥MXžMX—MXMX‰MX‚MX{MXtMXmMXfMX_MXXMXQMXJMXCMXIX7IX0IX)IX"IXIXIX IXIXÿHXøHXñHXêHXãHXÜHXÕHXÎHXÇHXÀHX¹HX²HX«HX¤HXHX–HXHXˆHXHXzHXsHXlHXeHX^HXWHXPHXIHXBHX;HX4HX-HX&HXHXHXHX HXHXüGXõGXîGXçGXàGXÙGXÒGXËGXÄGX½GX¶GX¯GX¨GX¡GXšGX“GXŒGX…GX~GXwGXpGXiGXbGX[GXTGXMGXFGX?GX8GX1GX*GX#GXGXGXGXGXGXùFXòFXëFXäFXÝFXÖFXÏFXÈFXÁFXºFX³FX¬FX¥FXžFX—FXFX‰FX‚FX{FXtFXmFXfFX_FXXFXQFXJFXCFXBX7BX0BX)BX"BXBXBX BXBXÿAXøAXñAXêAXãAXÜAXÕAXÎAXÇAXÀAX¹AX²AX«AX¤AXAX–AXAXˆAXAXzAXsAXlAXeAX^AXWAXPAXIAXBAX;AX4AX-AX&AXAXAXAX AXAXü@Xõ@Xî@Xç@Xà@XÙ@XÒ@XË@XÄ@X½@X¶@X¯@X¨@X¡@Xš@X“@XŒ@X…@X~@Xw@Xp@Xi@Xb@X[@XT@XM@XF@X?@X8@X1@X*@X#@X@X@X@X@X@Xù?Xò?Xë?Xä?XÝ?XÖ?XÏ?XÈ?XÁ?Xº?X³?X¬?X¥?Xž?X—?X?X‰?X‚?X{?Xt?Xm?Xf?X_?XX?XQ?XJ?XC?XXö>Xï>Xè>Xá>XÚ>XÓ>XÌ>XÅ>X¾>X·>X°>X©>X¢>X›>X”>X>X†>X>Xx>Xq>Xj>Xc>X\>XU>XN>XG>X@>X9>X2>X+>X$>X>X>X>X>X>Xú=Xó=Xì=Xå=XÞ=X×=XÐ=XÉ=XÂ=X»=X´=X­=X¦=XŸ=X˜=X‘=XŠ=Xƒ=X|=Xu=Xn=Xg=X`=XY=XR=XK=XD=X==X6=X/=X(=X!=X=X=X =X=Xþ;X7;X0;X);X";X;X;X ;X;Xÿ:Xø:Xñ:Xê:Xã:XÜ:XÕ:XÎ:XÇ:XÀ:X¹:X²:X«:X¤:X:X–:X:Xˆ:X:Xz:Xs:Xl:Xe:X^:XW:XP:XI:XB:X;:X4:X-:X&:X:X:X:X :X:Xü9Xõ9Xî9Xç9Xà9XÙ9XÒ9XË9XÄ9X½9X¶9X¯9X¨9X¡9Xš9X“9XŒ9X…9X~9Xw9Xp9Xi9Xb9X[9XT9XM9XF9X?9X89X19X*9X#9X9X9X9X9X9Xù8Xò8Xë8Xä8XÝ8XÖ8XÏ8XÈ8XÁ8Xº8X³8X¬8X¥8Xž8X—8X8X‰8X‚8X{8Xt8Xm8Xf8X_8XX8XQ8XJ8XC8X<8X58X.8X'8X 8X8X8X 8X8Xý7Xö7Xï7Xè7Xá7XÚ7XÓ7XÌ7XÅ7X¾7X·7X°7X©7X¢7X›7X”7X7X†7X7Xx7Xq7Xj7Xc7X\7XU7XN7XG7X@7X97X27X+7X$7X7X7X7X7X7Xú6Xó6Xì6Xå6XÞ6X×6XÐ6XÉ6XÂ6X»6X´6X­6X¦6XŸ6X˜6X‘6XŠ6Xƒ6X|6Xu6Xn6Xg6X`6XY6XR6XK6XD6X=6X66X/6X(6X!6X6X6X 6X6Xþ5X÷5Xð5Xé5Xâ5XÛ5XÔ5XÍ5XÆ5X¿5X¸5X±5Xª5X£5Xœ5X•5XŽ5X‡5X€5Xy5Xr5Xk5Xd5X]5XV5XO5XH5XA5X:5X35X,5X%5X5X5X5X 5X5Xû4Xô4Xí4Xæ4Xß4XØ4XÑ4XÊ4XÃ4X¼4Xµ4X®4X§4X 4X™4X’4X‹4X„4X}4Xv4Xo4Xh4Xa4XZ4XS4XL4XE4X>4X74X04X)4X"4X4X4X 4X4Xÿ3Xø3Xñ3Xê3Xã3XÜ3XÕ3XÎ3XÇ3XÀ3X¹3X²3X«3X¤3X3X–3X3Xˆ3X3Xz3Xs3Xl3Xe3X^3XW3XP3XI3XB3X;3X43X-3X&3X3X3X3X 3X3Xü2Xõ2Xî2Xç2Xà2XÙ2XÒ2XË2XÄ2X½2X¶2X¯2X¨2X¡2Xš2X“2XŒ2X…2X~2Xw2Xp2Xi2Xb2X[2XT2XM2XF2X?2X82X12X*2X#2X2X2X2X2X2Xù1Xò1Xë1Xä1XÝ1XÖ1XÏ1XÈ1XÁ1Xº1X³1X¬1X¥1Xž1X—1X1X‰1X‚1X{1Xt1Xm1Xf1X_1XX1XQ1XJ1XC1X<1X51X.1X'1X 1X1X1X 1X1Xý0Xö0Xï0Xè0Xá0XÚ0XÓ0XÌ0XÅ0X¾0X·0X°0X©0X¢0X›0X”0X0X†0X0Xx0Xq0Xj0Xc0X\0XU0XN0XG0X@0X90X20X+0X$0X0X0X0X0X0Xú/Xó/Xì/Xå/XÞ/X×/XÐ/XÉ/XÂ/X»/X´/X­/X¦/XŸ/X˜/X‘/XŠ/Xƒ/X|/Xu/Xn/Xg/X`/XY/XR/XK/XD/X=/X6/X//X(/X!/X/X/X /X/Xþ.X÷.Xð.Xé.Xâ.XÛ.XÔ.XÍ.XÆ.X¿.X¸.X±.Xª.X£.Xœ.X•.XŽ.X‡.X€.Xy.Xr.Xk.Xd.X].XV.XO.XH.XA.X:.X3.X,.X%.X.X.X.X .X.Xû-Xô-Xí-Xæ-Xß-XØ-XÑ-XÊ-XÃ-X¼-Xµ-X®-X§-X -X™-X’-X‹-X„-X}-Xv-Xo-Xh-Xa-XZ-XS-XL-XE-X>-X7-X0-X)-X"-X-X-X -X-Xÿ,Xø,Xñ,Xê,Xã,XÜ,XÕ,XÎ,XÇ,XÀ,X¹,X²,X«,X¤,X,X–,X,Xˆ,X,Xz,Xs,Xl,Xe,X^,XW,XP,XI,XB,X;,X4,X-,X&,X,X,X,X ,X,Xü+Xõ+Xî+Xç+Xà+XÙ+XÒ+XË+XÄ+X½+X¶+X¯+X¨+X¡+Xš+X“+XŒ+X…+X~+Xw+Xp+Xi+Xb+X[+XT+XM+XF+X?+X8+X1+X*+X#+X+X+X+X+X+Xù*Xò*Xë*Xä*XÝ*XÖ*XÏ*XÈ*XÁ*Xº*X³*X¬*X¥*Xž*X—*X*X‰*X‚*X{*Xt*Xm*Xf*X_*XX*XQ*XJ*XC*X<*X5*X.*X'*X *X*X*X *X*Xý)Xö)Xï)Xè)Xá)XÚ)XÓ)XÌ)XÅ)X¾)X·)X°)X©)X¢)X›)X”)X)X†)X)Xx)Xq)Xj)Xc)X\)XU)XN)XG)X@)X9)X2)X+)X$)X)X)X)X)X)Xú(Xó(Xì(Xå(XÞ(X×(XÐ(XÉ(XÂ(X»(X´(X­(X¦(XŸ(X˜(X‘(XŠ(Xƒ(X|(Xu(Xn(Xg(X`(XY(XR(XK(XD(X=(X6(X/(X((X!(X(X(X (X(Xþ'X÷'Xð'Xé'Xâ'XÛ'XÔ'XÍ'XÆ'X¿'X¸'X±'Xª'X£'Xœ'X•'XŽ'X‡'X€'Xy'Xr'Xk'Xd'X]'XV'XO'XH'XA'X:'X3'X,'X%'X'X'X'X 'X'Xû&Xô&Xí&Xæ&Xß&XØ&XÑ&XÊ&XÃ&X¼&Xµ&X®&X§&X &X™&X’&X‹&X„&X}&Xv&Xo&Xh&Xa&XZ&XS&XL&XE&X>&X7&X0&X)&X"&X&X&X &X&Xÿ%Xø%Xñ%Xê%Xã%XÜ%XÕ%XÎ%XÇ%XÀ%X¹%X²%X«%X¤%X%X–%X%Xˆ%X%Xz%Xs%Xl%Xe%X^%XW%XP%XI%XB%X;%X4%X-%X&%X%X%X%X %X%Xü$Xõ$Xî$Xç$Xà$XÙ$XÒ$XË$XÄ$X½$X¶$X¯$X¨$X¡$Xš$X“$XŒ$X…$X~$Xw$Xp$Xi$Xb$X[$XT$XM$XF$X?$X8$X1$X*$X#$X$X$X$X$X$Xù#Xò#Xë#Xä#XÝ#XÖ#XÏ#XÈ#XÁ#Xº#X³#X¬#X¥#Xž#X—#X#X‰#X‚#X{#Xt#Xm#Xf#X_#XX#XQ#XJ#XC#X<#X5#X.#X'#X #X#X#X #X#Xý"Xö"Xï"Xè"Xá"XÚ"XÓ"XÌ"XÅ"X¾"X·"X°"X©"X¢"X›"X”"X"X†"X"Xx"Xq"Xj"Xc"X\"XU"XN"XG"X@"X9"X2"X+"X$"X"X"X"X"X"Xú!Xó!Xì!Xå!XÞ!X×!XÐ!XÉ!XÂ!X»!X´!X­!X¦!XŸ!X˜!X‘!XŠ!Xƒ!X|!Xu!Xn!Xg!X`!XY!XR!XK!XD!X=!X6!X/!X(!X!!X!X!X !X!Xþ X÷ Xð Xé Xâ XÛ XÔ XÍ XÆ X¿ X¸ X± Xª X£ Xœ X• XŽ X‡ X€ Xy Xr Xk Xd X] XV XO XH XA X: X3 X, X% X X X X X XûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXýXöXïXèXáXÚXÓXÌXÅX¾X·X°X©X¢X›X”XX†XXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXúXóXìXåXÞX×XÐXÉXÂX»X´X­X¦XŸX˜X‘XŠXƒX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXýXöXïXèXáXÚXÓXÌXÅX¾X·X°X©X¢X›X”XX†XXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXúXóXìXåXÞX×XÐXÉXÂX»X´X­X¦XŸX˜X‘XŠXƒX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXý Xö Xï Xè Xá XÚ XÓ XÌ XÅ X¾ X· X° X© X¢ X› X” X X† X Xx Xq Xj Xc X\ XU XN XG X@ X9 X2 X+ X$ X X X X X Xú Xó Xì Xå XÞ X× XÐ XÉ X X» X´ X­ X¦ XŸ X˜ X‘ XŠ Xƒ X| Xu Xn Xg X` XY XR XK XD X= X6 X/ X( X! X X X X Xþ X÷ Xð Xé Xâ XÛ XÔ XÍ XÆ X¿ X¸ X± Xª X£ Xœ X• XŽ X‡ X€ Xy Xr Xk Xd X] XV XO XH XA X: X3 X, X% X X X X X Xû Xô Xí Xæ Xß XØ XÑ XÊ Xà X¼ Xµ X® X§ X  X™ X’ X‹ X„ X} Xv Xo Xh Xa XZ XS XL XE X> X7 X0 X) X" X X X X Xÿ Xø Xñ Xê Xã XÜ XÕ XÎ XÇ XÀ X¹ X² X« X¤ X X– X Xˆ X Xz Xs Xl Xe X^ XW XP XI XB X; X4 X- X& X X X X X XüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXýXöXïXèXáXÚXÓXÌXÅX¾X·X°X©X¢X›X”XX†XXxXqXjXcX\XUXNXGX@X9X2X+X$XXXXXXúXóXìXåXÞX×XÐXÉXÂX»X´X­X¦XŸX˜X‘XŠXƒX|XuXnXgX`XYXRXKXDX=X6X/X(X!XXX XXþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCX<X5X.X'X XXX XXýÿWöÿWïÿWèÿWáÿWÚÿWÓÿWÌÿWÅÿW¾ÿW·ÿW°ÿW©ÿW¢ÿW›ÿW”ÿWÿW†ÿWÿWxÿWqÿWjÿWcÿW\ÿWUÿWNÿWGÿW@ÿW9ÿW2ÿW+ÿW$ÿWÿWÿWÿWÿWÿWúþWóþWìþWåþWÞþW×þWÐþWÉþWÂþW»þW´þW­þW¦þWŸþW˜þW‘þWŠþWƒþW|þWuþWnþWgþW`þWYþWRþWKþWDþW=þW6þW/þW(þW!þWþWþW þWþWþýW÷ýWðýWéýWâýWÛýWÔýWÍýWÆýW¿ýW¸ýW±ýWªýW£ýWœýW•ýWŽýW‡ýW€ýWyýWrýWkýWdýW]ýWVýWOýWHýWAýW:ýW3ýW,ýW%ýWýWýWýW ýWýWûüWôüWíüWæüWßüWØüWÑüWÊüWÃüW¼üWµüW®üW§üW üW™üW’üW‹üW„üW}üWvüWoüWhüWaüWZüWSüWLüWEüW>üW7üW0üW)üW"üWüWüW üWüWÿûWøûWñûWêûWãûWÜûWÕûWÎûWÇûWÀûW¹ûW²ûW«ûW¤ûWûW–ûWûWˆûWûWzûWsûWlûWeûW^ûWWûWPûWIûWBûW;ûW4ûW-ûW&ûWûWûWûW ûWûWüúWõúWîúWçúWàúWÙúWÒúWËúWÄúW½úW¶úW¯úW¨úW¡úWšúW“úWŒúW…úW~úWwúWpúWiúWbúW[úWTúWMúWFúW?úW8úW1úW*úW#úWúWúWúWúWúWùùWòùWëùWäùWÝùWÖùWÏùWÈùWÁùWºùW³ùW¬ùW¥ùWžùW—ùWùW‰ùW‚ùW{ùWtùWmùWfùW_ùWXùWQùWJùWCùW<ùW5ùW.ùW'ùW ùWùWùW ùWùWýøWöøWïøWèøWáøWÚøWÓøWÌøWÅøW¾øW·øW°øW©øW¢øW›øW”øWøW†øWøWxøWqøWjøWcøW\øWUøWNøWGøW@øW9øW2øW+øW$øWøWøWøWøWøWú÷Wó÷Wì÷Wå÷WÞ÷W×÷WÐ÷WÉ÷WÂ÷W»÷W´÷W­÷W¦÷WŸ÷W˜÷W‘÷WŠ÷Wƒ÷W|÷Wu÷Wn÷Wg÷W`÷WY÷WR÷WK÷WD÷W=÷W6÷W/÷W(÷W!÷W÷W÷W ÷W÷WþöW÷öWðöWéöWâöWÛöWÔöWÍöWÆöW¿öW¸öW±öWªöW£öWœöW•öWŽöW‡öW€öWyöWröWköWdöW]öWVöWOöWHöWAöW:öW3öW,öW%öWöWöWöW öWöWûõWôõWíõWæõWßõWØõWÑõWÊõWÃõW¼õWµõW®õW§õW õW™õW’õW‹õW„õW}õWvõWoõWhõWaõWZõWSõWLõWEõW>õW7õW0õW)õW"õWõWõW õWõWÿôWøôWñôWêôWãôWÜôWÕôWÎôWÇôWÀôW¹ôW²ôW«ôW¤ôWôW–ôWôWˆôWôWzôWsôWlôWeôW^ôWWôWPôWIôWBôW;ôW4ôW-ôW&ôWôWôWôW ôWôWüóWõóWîóWçóWàóWÙóWÒóWËóWÄóW½óW¶óW¯óW¨óW¡óWšóW“óWŒóW…óW~óWwóWpóWióWbóW[óWTóWMóWFóW?óW8óW1óW*óW#óWóWóWóWóWóWùòWòòWëòWäòWÝòWÖòWÏòWÈòWÁòWºòW³òW¬òW¥òWžòW—òWòW‰òW‚òW{òWtòWmòWfòW_òWXòWQòWJòWCòW<òW5òW.òW'òW òWòWòW òWòWýñWöñWïñWèñWáñWÚñWÓñWÌñWÅñW¾ñW·ñW°ñW©ñW¢ñW›ñW”ñWñW†ñWñWxñWqñWjñWcñW\ñWUñWNñWGñW@ñW9ñW2ñW+ñW$ñWñWñWñWñWñWúðWóðWìðWåðWÞðW×ðWÐðWÉðWÂðW»ðW´ðW­ðW¦ðWŸðW˜ðW‘ðWŠðWƒðW|ðWuðWnðWgðW`ðWYðWRðWKðWDðW=ðW6ðW/ðW(ðW!ðWðWðW ðWðWþïW÷ïWðïWéïWâïWÛïWÔïWÍïWÆïW¿ïW¸ïW±ïWªïW£ïWœïW•ïWŽïW‡ïW€ïWyïWrïWkïWdïW]ïWVïWOïWHïWAïW:ïW3ïW,ïW%ïWïWïWïW ïWïWûîWôîWíîWæîWßîWØîWÑîWÊîWÃîW¼îWµîW®îW§îW îW™îW’îW‹îW„îW}îWvîWoîWhîWaîWZîWSîWLîWEîW>îW7îW0îW)îW"îWîWîW îWîWÿíWøíWñíWêíWãíWÜíWÕíWÎíWÇíWÀíW¹íW²íW«íW¤íWíW–íWíWˆíWíWzíWsíWlíWeíW^íWWíWPíWIíWBíW;íW4íW-íW&íWíWíWíW íWíWüìWõìWîìWçìWàìWÙìWÒìWËìWÄìW½ìW¶ìW¯ìW¨ìW¡ìWšìW“ìWŒìW…ìW~ìWwìWpìWiìWbìW[ìWTìWMìWFìW?ìW8ìW1ìW*ìW#ìWìWìWìWìWìWùëWòëWëëWäëWÝëWÖëWÏëWÈëWÁëWºëW³ëW¬ëW¥ëWžëW—ëWëW‰ëW‚ëW{ëWtëWmëWfëW_ëWXëWQëWJëWCëW<ëW5ëW.ëW'ëW ëWëWëW ëWëWýêWöêWïêWèêWáêWÚêWÓêWÌêWÅêW¾êW·êW°êW©êW¢êW›êW”êWêW†êWêWxêWqêWjêWcêW\êWUêWNêWGêW@êW9êW2êW+êW$êWêWêWêWêWêWúéWóéWìéWåéWÞéW×éWÐéWÉéWÂéW»éW´éW­éW¦éWŸéW˜éW‘éWŠéWƒéW|éWuéWnéWgéW`éWYéWRéWKéWDéW=éW6éW/éW(éW!éWéWéW éWéWþèW÷èWðèWéèWâèWÛèWÔèWÍèWÆèW¿èW¸èW±èWªèW£èWœèW•èWŽèW‡èW€èWyèWrèWkèWdèW]èWVèWOèWHèWAèW:èW3èW,èW%èWèWèWèW èWèWûçWôçWíçWæçWßçWØçWÑçWÊçWÃçW¼çWµçW®çW§çW çW™çW’çW‹çW„çW}çWvçWoçWhçWaçWZçWSçWLçWEçW>çW7çW0çW)çW"çWçWçW çWçWÿæWøæWñæWêæWãæWÜæWÕæWÎæWÇæWÀæW¹æW²æW«æW¤æWæW–æWæWˆæWæWzæWsæWlæWeæW^æWWæWPæWIæWBæW;æW4æW-æW&æWæWæWæW æWæWüåWõåWîåWçåWàåWÙåWÒåWËåWÄåW½åW¶åW¯åW¨åW¡åWšåW“åWŒåW…åW~åWwåWpåWiåWbåW[åWTåWMåWFåW?åW8åW1åW*åW#åWåWåWåWåWåWùäWòäWëäWääWÝäWÖäWÏäWÈäWÁäWºäW³äW¬äW¥äWžäW—äWäW‰äW‚äW{äWtäWmäWfäW_äWXäWQäWJäWCäW<äW5äW.äW'äW äWäWäW äWäWýãWöãWïãWèãWáãWÚãWÓãWÌãWÅãW¾ãW·ãW°ãW©ãW¢ãW›ãW”ãWãW†ãWãWxãWqãWjãWcãW\ãWUãWNãWGãW@ãW9ãW2ãW+ãW$ãWãWãWãWãWãWúâWóâWìâWåâWÞâW×âWÐâWÉâWÂâW»âW´âW­âW¦âWŸâW˜âW‘âWŠâWƒâW|âWuâWnâWgâW`âWYâWRâWKâWDâW=âW6âW/âW(âW!âWâWâW âWâWþáW÷áWðáWéáWâáWÛáWÔáWÍáWÆáW¿áW¸áW±áWªáW£áWœáW•áWŽáW‡áW€áWyáWráWkáWdáW]áWVáWOáWHáWAáW:áW3áW,áW%áWáWáWáW áWáWûàWôàWíàWæàWßàWØàWÑàWÊàWÃàW¼àWµàW®àW§àW àW™àW’àW‹àW„àW}àWvàWoàWhàWaàWZàWSàWLàWEàW>àW7àW0àW)àW"àWàWàW àWàWÿßWøßWñßWêßWãßWÜßWÕßWÎßWÇßWÀßW¹ßW²ßW«ßW¤ßWßW–ßWßWˆßWßWzßWsßWlßWeßW^ßWWßWPßWIßWBßW;ßW4ßW-ßW&ßWßWßWßW ßWßWüÞWõÞWîÞWçÞWàÞWÙÞWÒÞWËÞWÄÞW½ÞW¶ÞW¯ÞW¨ÞW¡ÞWšÞW“ÞWŒÞW…ÞW~ÞWwÞWpÞWiÞWbÞW[ÞWTÞWMÞWFÞW?ÞW8ÞW1ÞW*ÞW#ÞWÞWÞWÞWÞWÞWùÝWòÝWëÝWäÝWÝÝWÖÝWÏÝWÈÝWÁÝWºÝW³ÝW¬ÝW¥ÝWžÝW—ÝWÝW‰ÝW‚ÝW{ÝWtÝWmÝWfÝW_ÝWXÝWQÝWJÝWCÝW<ÝW5ÝW.ÝW'ÝW ÝWÝWÝW ÝWÝWýÜWöÜWïÜWèÜWáÜWÚÜWÓÜWÌÜWÅÜW¾ÜW·ÜW°ÜW©ÜW¢ÜW›ÜW”ÜWÜW†ÜWÜWxÜWqÜWjÜWcÜW\ÜWUÜWNÜWGÜW@ÜW9ÜW2ÜW+ÜW$ÜWÜWÜWÜWÜWÜWúÛWóÛWìÛWåÛWÞÛW×ÛWÐÛWÉÛWÂÛW»ÛW´ÛW­ÛW¦ÛWŸÛW˜ÛW‘ÛWŠÛWƒÛW|ÛWuÛWnÛWgÛW`ÛWYÛWRÛWKÛWDÛW=ÛW6ÛW/ÛW(ÛW!ÛWÛWÛW ÛWÛWþÚW÷ÚWðÚWéÚWâÚWÛÚWÔÚWÍÚWÆÚW¿ÚW¸ÚW±ÚWªÚW£ÚWœÚW•ÚWŽÚW‡ÚW€ÚWyÚWrÚWkÚWdÚW]ÚWVÚWOÚWHÚWAÚW:ÚW3ÚW,ÚW%ÚWÚWÚWÚW ÚWÚWûÙWôÙWíÙWæÙWßÙWØÙWÑÙWÊÙWÃÙW¼ÙWµÙW®ÙW§ÙW ÙW™ÙW’ÙW‹ÙW„ÙW}ÙWvÙWoÙWhÙWaÙWZÙWSÙWLÙWEÙW>ÙW7ÙW0ÙW)ÙW"ÙWÙWÙW ÙWÙWÿØWøØWñØWêØWãØWÜØWÕØWÎØWÇØWÀØW¹ØW²ØW«ØW¤ØWØW–ØWØWˆØWØWzØWsØWlØWeØW^ØWWØWPØWIØWBØW;ØW4ØW-ØW&ØWØWØWØW ØWØWü×Wõ×Wî×Wç×Wà×WÙ×WÒ×WË×WÄ×W½×W¶×W¯×W¨×W¡×Wš×W“×WŒ×W…×W~×Ww×Wp×Wi×Wb×W[×WT×WM×WF×W?×W8×W1×W*×W#×W×W×W×W×W×WùÖWòÖWëÖWäÖWÝÖWÖÖWÏÖWÈÖWÁÖWºÖW³ÖW¬ÖW¥ÖWžÖW—ÖWÖW‰ÖW‚ÖW{ÖWtÖWmÖWfÖW_ÖWXÖWQÖWJÖWCÖW<ÖW5ÖW.ÖW'ÖW ÖWÖWÖW ÖWÖWýÕWöÕWïÕWèÕWáÕWÚÕWÓÕWÌÕWÅÕW¾ÕW·ÕW°ÕW©ÕW¢ÕW›ÕW”ÕWÕW†ÕWÕWxÕWqÕWjÕWcÕW\ÕWUÕWNÕWGÕW@ÕW9ÕW2ÕW+ÕW$ÕWÕWÕWÕWÕWÕWúÔWóÔWìÔWåÔWÞÔW×ÔWÐÔWÉÔWÂÔW»ÔW´ÔW­ÔW¦ÔWŸÔW˜ÔW‘ÔWŠÔWƒÔW|ÔWuÔWnÔWgÔW`ÔWYÔWRÔWKÔWDÔW=ÔW6ÔW/ÔW(ÔW!ÔWÔWÔW ÔWÔWþÓW÷ÓWðÓWéÓWâÓWÛÓWÔÓWÍÓWÆÓW¿ÓW¸ÓW±ÓWªÓW£ÓWœÓW•ÓWŽÓW‡ÓW€ÓWyÓWrÓWkÓWdÓW]ÓWVÓWOÓWHÓWAÓW:ÓW3ÓW,ÓW%ÓWÓWÓWÓW ÓWÓWûÒWôÒWíÒWæÒWßÒWØÒWÑÒWÊÒWÃÒW¼ÒWµÒW®ÒW§ÒW ÒW™ÒW’ÒW‹ÒW„ÒW}ÒWvÒWoÒWhÒWaÒWZÒWSÒWLÒWEÒW>ÒW7ÒW0ÒW)ÒW"ÒWÒWÒW ÒWÒWÿÑWøÑWñÑWêÑWãÑWÜÑWÕÑWÎÑWÇÑWÀÑW¹ÑW²ÑW«ÑW¤ÑWÑW–ÑWÑWˆÑWÑWzÑWsÑWlÑWeÑW^ÑWWÑWPÑWIÑWBÑW;ÑW4ÑW-ÑW&ÑWÑWÑWÑW ÑWÑWüÐWõÐWîÐWçÐWàÐWÙÐWÒÐWËÐWÄÐW½ÐW¶ÐW¯ÐW¨ÐW¡ÐWšÐW“ÐWŒÐW…ÐW~ÐWwÐWpÐWiÐWbÐW[ÐWTÐWMÐWFÐW?ÐW8ÐW1ÐW*ÐW#ÐWÐWÐWÐWÐWÐWùÏWòÏWëÏWäÏWÝÏWÖÏWÏÏWÈÏWÁÏWºÏW³ÏW¬ÏW¥ÏWžÏW—ÏWÏW‰ÏW‚ÏW{ÏWtÏWmÏWfÏW_ÏWXÏWQÏWJÏWCÏW<ÏW5ÏW.ÏW'ÏW ÏWÏWÏW ÏWÏWýÎWöÎWïÎWèÎWáÎWÚÎWÓÎWÌÎWÅÎW¾ÎW·ÎW°ÎW©ÎW¢ÎW›ÎW”ÎWÎW†ÎWÎWxÎWqÎWjÎWcÎW\ÎWUÎWNÎWGÎW@ÎW9ÎW2ÎW+ÎW$ÎWÎWÎWÎWÎWÎWúÍWóÍWìÍWåÍWÞÍW×ÍWÐÍWÉÍWÂÍW»ÍW´ÍW­ÍW¦ÍWŸÍW˜ÍW‘ÍWŠÍWƒÍW|ÍWuÍWnÍWgÍW`ÍWYÍWRÍWKÍWDÍW=ÍW6ÍW/ÍW(ÍW!ÍWÍWÍW ÍWÍWþÌW÷ÌWðÌWéÌWâÌWÛÌWÔÌWÍÌWÆÌW¿ÌW¸ÌW±ÌWªÌW£ÌWœÌW•ÌWŽÌW‡ÌW€ÌWyÌWrÌWkÌWdÌW]ÌWVÌWOÌWHÌWAÌW:ÌW3ÌW,ÌW%ÌWÌWÌWÌW ÌWÌWûËWôËWíËWæËWßËWØËWÑËWÊËWÃËW¼ËWµËW®ËW§ËW ËW™ËW’ËW‹ËW„ËW}ËWvËWoËWhËWaËWZËWSËWLËWEËW>ËW7ËW0ËW)ËW"ËWËWËW ËWËWÿÊWøÊWñÊWêÊWãÊWÜÊWÕÊWÎÊWÇÊWÀÊW¹ÊW²ÊW«ÊW¤ÊWÊW–ÊWÊWˆÊWÊWzÊWsÊWlÊWeÊW^ÊWWÊWPÊWIÊWBÊW;ÊW4ÊW-ÊW&ÊWÊWÊWÊW ÊWÊWüÉWõÉWîÉWçÉWàÉWÙÉWÒÉWËÉWÄÉW½ÉW¶ÉW¯ÉW¨ÉW¡ÉWšÉW“ÉWŒÉW…ÉW~ÉWwÉWpÉWiÉWbÉW[ÉWTÉWMÉWFÉW?ÉW8ÉW1ÉW*ÉW#ÉWÉWÉWÉWÉWÉWùÈWòÈWëÈWäÈWÝÈWÖÈWÏÈWÈÈWÁÈWºÈW³ÈW¬ÈW¥ÈWžÈW—ÈWÈW‰ÈW‚ÈW{ÈWtÈWmÈWfÈW_ÈWXÈWQÈWJÈWCÈW<ÈW5ÈW.ÈW'ÈW ÈWÈWÈW ÈWÈWýÇWöÇWïÇWèÇWáÇWÚÇWÓÇWÌÇWÅÇW¾ÇW·ÇW°ÇW©ÇW¢ÇW›ÇW”ÇWÇW†ÇWÇWxÇWqÇWjÇWcÇW\ÇWUÇWNÇWGÇW@ÇW9ÇW2ÇW+ÇW$ÇWÇWÇWÇWÇWÇWúÆWóÆWìÆWåÆWÞÆWׯWÐÆWÉÆWÂÆW»ÆW´ÆW­ÆW¦ÆWŸÆW˜ÆW‘ÆWŠÆWƒÆW|ÆWuÆWnÆWgÆW`ÆWYÆWRÆWKÆWDÆW=ÆW6ÆW/ÆW(ÆW!ÆWÆWÆW ÆWÆWþÅW÷ÅWðÅWéÅWâÅWÛÅWÔÅWÍÅWÆÅW¿ÅW¸ÅW±ÅWªÅW£ÅWœÅW•ÅWŽÅW‡ÅW€ÅWyÅWrÅWkÅWdÅW]ÅWVÅWOÅWHÅWAÅW:ÅW3ÅW,ÅW%ÅWÅWÅWÅW ÅWÅWûÄWôÄWíÄWæÄWßÄWØÄWÑÄWÊÄWÃÄW¼ÄWµÄW®ÄW§ÄW ÄW™ÄW’ÄW‹ÄW„ÄW}ÄWvÄWoÄWhÄWaÄWZÄWSÄWLÄWEÄW>ÄW7ÄW0ÄW)ÄW"ÄWÄWÄW ÄWÄWÿÃWøÃWñÃWêÃWãÃWÜÃWÕÃWÎÃWÇÃWÀÃW¹ÃW²ÃW«ÃW¤ÃWÃW–ÃWÃWˆÃWÃWzÃWsÃWlÃWeÃW^ÃWWÃWPÃWIÃWBÃW;ÃW4ÃW-ÃW&ÃWÃWÃWÃW ÃWÃWüÂWõÂWîÂWçÂWàÂWÙÂWÒÂWËÂWÄÂW½ÂW¶ÂW¯ÂW¨ÂW¡ÂWšÂW“ÂWŒÂW…ÂW~ÂWwÂWpÂWiÂWbÂW[ÂWTÂWMÂWFÂW?ÂW8ÂW1ÂW*ÂW#ÂWÂWÂWÂWÂWÂWùÁWòÁWëÁWäÁWÝÁWÖÁWÏÁWÈÁWÁÁWºÁW³ÁW¬ÁW¥ÁWžÁW—ÁWÁW‰ÁW‚ÁW{ÁWtÁWmÁWfÁW_ÁWXÁWQÁWJÁWCÁW<ÁW5ÁW.ÁW'ÁW ÁWÁWÁW ÁWÁWýÀWöÀWïÀWèÀWáÀWÚÀWÓÀWÌÀWÅÀW¾ÀW·ÀW°ÀW©ÀW¢ÀW›ÀW”ÀWÀW†ÀWÀWxÀWqÀWjÀWcÀW\ÀWUÀWNÀWGÀW@ÀW9ÀW2ÀW+ÀW$ÀWÀWÀWÀWÀWÀWú¿Wó¿Wì¿Wå¿WÞ¿W׿WпWÉ¿W¿W»¿W´¿W­¿W¦¿WŸ¿W˜¿W‘¿WŠ¿Wƒ¿W|¿Wu¿Wn¿Wg¿W`¿WY¿WR¿WK¿WD¿W=¿W6¿W/¿W(¿W!¿W¿W¿W ¿W¿Wþ¾W÷¾Wð¾Wé¾Wâ¾WÛ¾WÔ¾W;WƾW¿¾W¸¾W±¾Wª¾W£¾Wœ¾W•¾W޾W‡¾W€¾Wy¾Wr¾Wk¾Wd¾W]¾WV¾WO¾WH¾WA¾W:¾W3¾W,¾W%¾W¾W¾W¾W ¾W¾Wû½Wô½Wí½Wæ½Wß½WؽWѽWʽWýW¼½Wµ½W®½W§½W ½W™½W’½W‹½W„½W}½Wv½Wo½Wh½Wa½WZ½WS½WL½WE½W>½W7½W0½W)½W"½W½W½W ½W½Wÿ¼Wø¼Wñ¼Wê¼Wã¼WܼWÕ¼WμWǼWÀ¼W¹¼W²¼W«¼W¤¼W¼W–¼W¼Wˆ¼W¼Wz¼Ws¼Wl¼We¼W^¼WW¼WP¼WI¼WB¼W;¼W4¼W-¼W&¼W¼W¼W¼W ¼W¼Wü»Wõ»Wî»Wç»Wà»WÙ»WÒ»WË»WÄ»W½»W¶»W¯»W¨»W¡»Wš»W“»WŒ»W…»W~»Ww»Wp»Wi»Wb»W[»WT»WM»WF»W?»W8»W1»W*»W#»W»W»W»W»W»WùºWòºWëºWäºWݺWÖºWϺWȺWÁºWººW³ºW¬ºW¥ºWžºW—ºWºW‰ºW‚ºW{ºWtºWmºWfºW_ºWXºWQºWJºWCºW<ºW5ºW.ºW'ºW ºWºWºW ºWºWý¹Wö¹Wï¹Wè¹Wá¹WÚ¹WÓ¹W̹WŹW¾¹W·¹W°¹W©¹W¢¹W›¹W”¹W¹W†¹W¹Wx¹Wq¹Wj¹Wc¹W\¹WU¹WN¹WG¹W@¹W9¹W2¹W+¹W$¹W¹W¹W¹W¹W¹Wú¸Wó¸Wì¸Wå¸WÞ¸W׸WиWɸW¸W»¸W´¸W­¸W¦¸WŸ¸W˜¸W‘¸WЏWƒ¸W|¸Wu¸Wn¸Wg¸W`¸WY¸WR¸WK¸WD¸W=¸W6¸W/¸W(¸W!¸W¸W¸W ¸W¸Wþ·W÷·Wð·Wé·Wâ·WÛ·WÔ·WÍ·WÆ·W¿·W¸·W±·Wª·W£·Wœ·W•·WŽ·W‡·W€·Wy·Wr·Wk·Wd·W]·WV·WO·WH·WA·W:·W3·W,·W%·W·W·W·W ·W·Wû¶Wô¶Wí¶Wæ¶Wß¶WضWѶWʶWöW¼¶Wµ¶W®¶W§¶W ¶W™¶W’¶W‹¶W„¶W}¶Wv¶Wo¶Wh¶Wa¶WZ¶WS¶WL¶WE¶W>¶W7¶W0¶W)¶W"¶W¶W¶W ¶W¶WÿµWøµWñµWêµWãµWܵWÕµWεWǵWÀµW¹µW²µW«µW¤µWµW–µWµWˆµWµWzµWsµWlµWeµW^µWWµWPµWIµWBµW;µW4µW-µW&µWµWµWµW µWµWü´Wõ´Wî´Wç´Wà´WÙ´WÒ´WË´WÄ´W½´W¶´W¯´W¨´W¡´Wš´W“´WŒ´W…´W~´Ww´Wp´Wi´Wb´W[´WT´WM´WF´W?´W8´W1´W*´W#´W´W´W´W´W´Wù³Wò³Wë³Wä³WݳWÖ³WϳWȳWÁ³Wº³W³³W¬³W¥³Wž³W—³W³W‰³W‚³W{³Wt³Wm³Wf³W_³WX³WQ³WJ³WC³W<³W5³W.³W'³W ³W³W³W ³W³Wý²Wö²Wï²Wè²Wá²WÚ²WÓ²W̲WŲW¾²W·²W°²W©²W¢²W›²W”²W²W†²W²Wx²Wq²Wj²Wc²W\²WU²WN²WG²W@²W9²W2²W+²W$²W²W²W²W²W²Wú±Wó±Wì±Wå±WÞ±W×±WбWɱW±W»±W´±W­±W¦±WŸ±W˜±W‘±WбWƒ±W|±Wu±Wn±Wg±W`±WY±WR±WK±WD±W=±W6±W/±W(±W!±W±W±W ±W±Wþ°W÷°Wð°Wé°Wâ°WÛ°WÔ°WͰWưW¿°W¸°W±°Wª°W£°Wœ°W•°WްW‡°W€°Wy°Wr°Wk°Wd°W]°WV°WO°WH°WA°W:°W3°W,°W%°W°W°W°W °W°Wû¯Wô¯Wí¯Wæ¯W߯WدWѯWʯWïW¼¯Wµ¯W®¯W§¯W ¯W™¯W’¯W‹¯W„¯W}¯Wv¯Wo¯Wh¯Wa¯WZ¯WS¯WL¯WE¯W>¯W7¯W0¯W)¯W"¯W¯W¯W ¯W¯Wÿ®Wø®Wñ®Wê®Wã®WÜ®WÕ®WήWÇ®WÀ®W¹®W²®W«®W¤®W®W–®W®Wˆ®W®Wz®Ws®Wl®We®W^®WW®WP®WI®WB®W;®W4®W-®W&®W®W®W®W ®W®Wü­Wõ­Wî­Wç­Wà­WÙ­WÒ­WË­WÄ­W½­W¶­W¯­W¨­W¡­Wš­W“­WŒ­W…­W~­Ww­Wp­Wi­Wb­W[­WT­WM­WF­W?­W8­W1­W*­W#­W­W­W­W­W­Wù¬Wò¬Wë¬Wä¬WݬWÖ¬WϬWȬWÁ¬Wº¬W³¬W¬¬W¥¬Wž¬W—¬W¬W‰¬W‚¬W{¬Wt¬Wm¬Wf¬W_¬WX¬WQ¬WJ¬WC¬W<¬W5¬W.¬W'¬W ¬W¬W¬W ¬W¬Wý«Wö«Wï«Wè«Wá«WÚ«WÓ«WÌ«WÅ«W¾«W·«W°«W©«W¢«W›«W”«W«W†«W«Wx«Wq«Wj«Wc«W\«WU«WN«WG«W@«W9«W2«W+«W$«W«W«W«W«W«WúªWóªWìªWåªWÞªWתWЪWɪWªW»ªW´ªW­ªW¦ªWŸªW˜ªW‘ªWŠªWƒªW|ªWuªWnªWgªW`ªWYªWRªWKªWDªW=ªW6ªW/ªW(ªW!ªWªWªW ªWªWþ©W÷©Wð©Wé©Wâ©WÛ©WÔ©WÍ©WÆ©W¿©W¸©W±©Wª©W£©Wœ©W•©WŽ©W‡©W€©Wy©Wr©Wk©Wd©W]©WV©WO©WH©WA©W:©W3©W,©W%©W©W©W©W ©W©Wû¨Wô¨Wí¨Wæ¨WߨWبWѨWʨWèW¼¨Wµ¨W®¨W§¨W ¨W™¨W’¨W‹¨W„¨W}¨Wv¨Wo¨Wh¨Wa¨WZ¨WS¨WL¨WE¨W>¨W7¨W0¨W)¨W"¨W¨W¨W ¨W¨Wÿ§Wø§Wñ§Wê§Wã§WܧWÕ§WΧWǧWÀ§W¹§W²§W«§W¤§W§W–§W§Wˆ§W§Wz§Ws§Wl§We§W^§WW§WP§WI§WB§W;§W4§W-§W&§W§W§W§W §W§Wü¦Wõ¦Wî¦Wç¦Wà¦WÙ¦WÒ¦W˦WĦW½¦W¶¦W¯¦W¨¦W¡¦Wš¦W“¦WŒ¦W…¦W~¦Ww¦Wp¦Wi¦Wb¦W[¦WT¦WM¦WF¦W?¦W8¦W1¦W*¦W#¦W¦W¦W¦W¦W¦Wù¥Wò¥Wë¥Wä¥WÝ¥WÖ¥WÏ¥WÈ¥WÁ¥Wº¥W³¥W¬¥W¥¥Wž¥W—¥W¥W‰¥W‚¥W{¥Wt¥Wm¥Wf¥W_¥WX¥WQ¥WJ¥WC¥W<¥W5¥W.¥W'¥W ¥W¥W¥W ¥W¥Wý¤Wö¤Wï¤Wè¤Wá¤WÚ¤WÓ¤W̤WŤW¾¤W·¤W°¤W©¤W¢¤W›¤W”¤W¤W†¤W¤Wx¤Wq¤Wj¤Wc¤W\¤WU¤WN¤WG¤W@¤W9¤W2¤W+¤W$¤W¤W¤W¤W¤W¤Wú£Wó£Wì£Wå£WÞ£W×£WУWÉ£W£W»£W´£W­£W¦£WŸ£W˜£W‘£WŠ£Wƒ£W|£Wu£Wn£Wg£W`£WY£WR£WK£WD£W=£W6£W/£W(£W!£W£W£W £W£Wþ¢W÷¢Wð¢Wé¢Wâ¢WÛ¢WÔ¢WÍ¢WÆ¢W¿¢W¸¢W±¢Wª¢W£¢Wœ¢W•¢WŽ¢W‡¢W€¢Wy¢Wr¢Wk¢Wd¢W]¢WV¢WO¢WH¢WA¢W:¢W3¢W,¢W%¢W¢W¢W¢W ¢W¢Wû¡Wô¡Wí¡Wæ¡Wß¡WØ¡WÑ¡WÊ¡WáW¼¡Wµ¡W®¡W§¡W ¡W™¡W’¡W‹¡W„¡W}¡Wv¡Wo¡Wh¡Wa¡WZ¡WS¡WL¡WE¡W>¡W7¡W0¡W)¡W"¡W¡W¡W ¡W¡Wÿ Wø Wñ Wê Wã WÜ WÕ WΠWÇ WÀ W¹ W² W« W¤ W W– W Wˆ W Wz Ws Wl We W^ WW WP WI WB W; W4 W- W& W W W W  W WüŸWõŸWîŸWçŸWàŸWÙŸWÒŸWËŸWÄŸW½ŸW¶ŸW¯ŸW¨ŸW¡ŸWšŸW“ŸWŒŸW…ŸW~ŸWwŸWpŸWiŸWbŸW[ŸWTŸWMŸWFŸW?ŸW8ŸW1ŸW*ŸW#ŸWŸWŸWŸWŸWŸWùžWòžWëžWäžWÝžWÖžWÏžWÈžWÁžWºžW³žW¬žW¥žWžžW—žWžW‰žW‚žW{žWtžWmžWfžW_žWXžWQžWJžWCžW<žW5žW.žW'žW žWžWžW žWžWýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWúœWóœWìœWåœWÞœWלWМWÉœWœW»œW´œW­œW¦œWŸœW˜œW‘œWŠœWƒœW|œWuœWnœWgœW`œWYœWRœWKœWDœW=œW6œW/œW(œW!œWœWœW œWœWþ›W÷›Wð›Wé›Wâ›WÛ›WÔ›WÍ›WÆ›W¿›W¸›W±›Wª›W£›Wœ›W•›WŽ›W‡›W€›Wy›Wr›Wk›Wd›W]›WV›WO›WH›WA›W:›W3›W,›W%›W›W›W›W ›W›WûšWôšWíšWæšWßšWØšWÑšWÊšWÚW¼šWµšW®šW§šW šW™šW’šW‹šW„šW}šWvšWošWhšWašWZšWSšWLšWEšW>šW7šW0šW)šW"šWšWšW šWšWÿ™Wø™Wñ™Wê™Wã™WÜ™WÕ™WΙWÇ™WÀ™W¹™W²™W«™W¤™W™W–™W™Wˆ™W™Wz™Ws™Wl™We™W^™WW™WP™WI™WB™W;™W4™W-™W&™W™W™W™W ™W™Wü˜Wõ˜Wî˜Wç˜Wà˜WÙ˜WÒ˜W˘WĘW½˜W¶˜W¯˜W¨˜W¡˜Wš˜W“˜WŒ˜W…˜W~˜Ww˜Wp˜Wi˜Wb˜W[˜WT˜WM˜WF˜W?˜W8˜W1˜W*˜W#˜W˜W˜W˜W˜W˜Wù—Wò—Wë—Wä—WÝ—WÖ—WÏ—WÈ—WÁ—Wº—W³—W¬—W¥—Wž—W——W—W‰—W‚—W{—Wt—Wm—Wf—W_—WX—WQ—WJ—WC—W<—W5—W.—W'—W —W—W—W —W—Wý–Wö–Wï–Wè–Wá–WÚ–WÓ–WÌ–WÅ–W¾–W·–W°–W©–W¢–W›–W”–W–W†–W–Wx–Wq–Wj–Wc–W\–WU–WN–WG–W@–W9–W2–W+–W$–W–W–W–W–W–Wú•Wó•Wì•Wå•WÞ•WוWЕWÉ•W•W»•W´•W­•W¦•WŸ•W˜•W‘•WŠ•Wƒ•W|•Wu•Wn•Wg•W`•WY•WR•WK•WD•W=•W6•W/•W(•W!•W•W•W •W•Wþ”W÷”Wð”Wé”Wâ”WÛ”WÔ”WÍ”WÆ”W¿”W¸”W±”Wª”W£”Wœ”W•”WŽ”W‡”W€”Wy”Wr”Wk”Wd”W]”WV”WO”WH”WA”W:”W3”W,”W%”W”W”W”W ”W”Wû“Wô“Wí“Wæ“Wß“WØ“WÑ“WÊ“WÓW¼“Wµ“W®“W§“W “W™“W’“W‹“W„“W}“Wv“Wo“Wh“Wa“WZ“WS“WL“WE“W>“W7“W0“W)“W"“W“W“W “W“Wÿ’Wø’Wñ’Wê’Wã’WÜ’WÕ’WÎ’WÇ’WÀ’W¹’W²’W«’W¤’W’W–’W’Wˆ’W’Wz’Ws’Wl’We’W^’WW’WP’WI’WB’W;’W4’W-’W&’W’W’W’W ’W’Wü‘Wõ‘Wî‘Wç‘Wà‘WÙ‘WÒ‘WË‘WÄ‘W½‘W¶‘W¯‘W¨‘W¡‘Wš‘W“‘WŒ‘W…‘W~‘Ww‘Wp‘Wi‘Wb‘W[‘WT‘WM‘WF‘W?‘W8‘W1‘W*‘W#‘W‘W‘W‘W‘W‘WùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCWŒW7ŒW0ŒW)ŒW"ŒWŒWŒW ŒWŒWÿ‹Wø‹Wñ‹Wê‹Wã‹WÜ‹WÕ‹W΋WÇ‹WÀ‹W¹‹W²‹W«‹W¤‹W‹W–‹W‹Wˆ‹W‹Wz‹Ws‹Wl‹We‹W^‹WW‹WP‹WI‹WB‹W;‹W4‹W-‹W&‹W‹W‹W‹W ‹W‹WüŠWõŠWîŠWçŠWàŠWÙŠWÒŠWËŠWÄŠW½ŠW¶ŠW¯ŠW¨ŠW¡ŠWšŠW“ŠWŒŠW…ŠW~ŠWwŠWpŠWiŠWbŠW[ŠWTŠWMŠWFŠW?ŠW8ŠW1ŠW*ŠW#ŠWŠWŠWŠWŠWŠWù‰Wò‰Wë‰Wä‰W݉WÖ‰WωWȉWÁ‰Wº‰W³‰W¬‰W¥‰Wž‰W—‰W‰W‰‰W‚‰W{‰Wt‰Wm‰Wf‰W_‰WX‰WQ‰WJ‰WC‰W<‰W5‰W.‰W'‰W ‰W‰W‰W ‰W‰WýˆWöˆWïˆWèˆWáˆWÚˆWÓˆẄWňW¾ˆW·ˆW°ˆW©ˆW¢ˆW›ˆW”ˆWˆW†ˆWˆWxˆWqˆWjˆWcˆW\ˆWUˆWNˆWGˆW@ˆW9ˆW2ˆW+ˆW$ˆWˆWˆWˆWˆWˆWú‡Wó‡Wì‡Wå‡WÞ‡WׇWЇWɇW‡W»‡W´‡W­‡W¦‡WŸ‡W˜‡W‘‡WЇWƒ‡W|‡Wu‡Wn‡Wg‡W`‡WY‡WR‡WK‡WD‡W=‡W6‡W/‡W(‡W!‡W‡W‡W ‡W‡Wþ†W÷†Wð†Wé†Wâ†WÛ†WÔ†W͆WƆW¿†W¸†W±†Wª†W£†Wœ†W•†WކW‡†W€†Wy†Wr†Wk†Wd†W]†WV†WO†WH†WA†W:†W3†W,†W%†W†W†W†W †W†Wû…Wô…Wí…Wæ…Wß…WØ…WÑ…WÊ…WÃ…W¼…Wµ…W®…W§…W …W™…W’…W‹…W„…W}…Wv…Wo…Wh…Wa…WZ…WS…WL…WE…W>…W7…W0…W)…W"…W…W…W …W…Wÿ„Wø„Wñ„Wê„Wã„WÜ„WÕ„W΄WÇ„WÀ„W¹„W²„W«„W¤„W„W–„W„Wˆ„W„Wz„Ws„Wl„We„W^„WW„WP„WI„WB„W;„W4„W-„W&„W„W„W„W „W„WüƒWõƒWîƒWçƒWàƒWÙƒWÒƒW˃WăW½ƒW¶ƒW¯ƒW¨ƒW¡ƒWšƒW“ƒWŒƒW…ƒW~ƒWwƒWpƒWiƒWbƒW[ƒWTƒWMƒWFƒW?ƒW8ƒW1ƒW*ƒW#ƒWƒWƒWƒWƒWƒWù‚Wò‚Wë‚Wä‚WÝ‚WÖ‚WÏ‚WÈ‚WÁ‚Wº‚W³‚W¬‚W¥‚Wž‚W—‚W‚W‰‚W‚‚W{‚Wt‚Wm‚Wf‚W_‚WX‚WQ‚WJ‚WC‚W<‚W5‚W.‚W'‚W ‚W‚W‚W ‚W‚WýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWú€Wó€Wì€Wå€WÞ€W×€WЀWÉ€W€W»€W´€W­€W¦€WŸ€W˜€W‘€WŠ€Wƒ€W|€Wu€Wn€Wg€W`€WY€WR€WK€WD€W=€W6€W/€W(€W!€W€W€W €W€WþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWû~Wô~Wí~Wæ~Wß~WØ~WÑ~WÊ~WÃ~W¼~Wµ~W®~W§~W ~W™~W’~W‹~W„~W}~Wv~Wo~Wh~Wa~WZ~WS~WL~WE~W>~W7~W0~W)~W"~W~W~W ~W~Wÿ}Wø}Wñ}Wê}Wã}WÜ}WÕ}WÎ}WÇ}WÀ}W¹}W²}W«}W¤}W}W–}W}Wˆ}W}Wz}Ws}Wl}We}W^}WW}WP}WI}WB}W;}W4}W-}W&}W}W}W}W }W}Wü|Wõ|Wî|Wç|Wà|WÙ|WÒ|WË|WÄ|W½|W¶|W¯|W¨|W¡|Wš|W“|WŒ|W…|W~|Ww|Wp|Wi|Wb|W[|WT|WM|WF|W?|W8|W1|W*|W#|W|W|W|W|W|Wù{Wò{Wë{Wä{WÝ{WÖ{WÏ{WÈ{WÁ{Wº{W³{W¬{W¥{Wž{W—{W{W‰{W‚{W{{Wt{Wm{Wf{W_{WX{WQ{WJ{WC{W<{W5{W.{W'{W {W{W{W {W{WýzWözWïzWèzWázWÚzWÓzWÌzWÅzW¾zW·zW°zW©zW¢zW›zW”zWzW†zWzWxzWqzWjzWczW\zWUzWNzWGzW@zW9zW2zW+zW$zWzWzWzWzWzWúyWóyWìyWåyWÞyW×yWÐyWÉyWÂyW»yW´yW­yW¦yWŸyW˜yW‘yWŠyWƒyW|yWuyWnyWgyW`yWYyWRyWKyWDyW=yW6yW/yW(yW!yWyWyW yWyWþxW÷xWðxWéxWâxWÛxWÔxWÍxWÆxW¿xW¸xW±xWªxW£xWœxW•xWŽxW‡xW€xWyxWrxWkxWdxW]xWVxWOxWHxWAxW:xW3xW,xW%xWxWxWxW xWxWûwWôwWíwWæwWßwWØwWÑwWÊwWÃwW¼wWµwW®wW§wW wW™wW’wW‹wW„wW}wWvwWowWhwWawWZwWSwWLwWEwW>wW7wW0wW)wW"wWwWwW wWwWÿvWøvWñvWêvWãvWÜvWÕvWÎvWÇvWÀvW¹vW²vW«vW¤vWvW–vWvWˆvWvWzvWsvWlvWevW^vWWvWPvWIvWBvW;vW4vW-vW&vWvWvWvW vWvWüuWõuWîuWçuWàuWÙuWÒuWËuWÄuW½uW¶uW¯uW¨uW¡uWšuW“uWŒuW…uW~uWwuWpuWiuWbuW[uWTuWMuWFuW?uW8uW1uW*uW#uWuWuWuWuWuWùtWòtWëtWätWÝtWÖtWÏtWÈtWÁtWºtW³tW¬tW¥tWžtW—tWtW‰tW‚tW{tWttWmtWftW_tWXtWQtWJtWCtWpW7pW0pW)pW"pWpWpW pWpWÿoWøoWñoWêoWãoWÜoWÕoWÎoWÇoWÀoW¹oW²oW«oW¤oWoW–oWoWˆoWoWzoWsoWloWeoW^oWWoWPoWIoWBoW;oW4oW-oW&oWoWoWoW oWoWünWõnWînWçnWànWÙnWÒnWËnWÄnW½nW¶nW¯nW¨nW¡nWšnW“nWŒnW…nW~nWwnWpnWinWbnW[nWTnWMnWFnW?nW8nW1nW*nW#nWnWnWnWnWnWùmWòmWëmWämWÝmWÖmWÏmWÈmWÁmWºmW³mW¬mW¥mWžmW—mWmW‰mW‚mW{mWtmWmmWfmW_mWXmWQmWJmWCmWiW7iW0iW)iW"iWiWiW iWiWÿhWøhWñhWêhWãhWÜhWÕhWÎhWÇhWÀhW¹hW²hW«hW¤hWhW–hWhWˆhWhWzhWshWlhWehW^hWWhWPhWIhWBhW;hW4hW-hW&hWhWhWhW hWhWügWõgWîgWçgWàgWÙgWÒgWËgWÄgW½gW¶gW¯gW¨gW¡gWšgW“gWŒgW…gW~gWwgWpgWigWbgW[gWTgWMgWFgW?gW8gW1gW*gW#gWgWgWgWgWgWùfWòfWëfWäfWÝfWÖfWÏfWÈfWÁfWºfW³fW¬fW¥fWžfW—fWfW‰fW‚fW{fWtfWmfWffW_fWXfWQfWJfWCfWbW7bW0bW)bW"bWbWbW bWbWÿaWøaWñaWêaWãaWÜaWÕaWÎaWÇaWÀaW¹aW²aW«aW¤aWaW–aWaWˆaWaWzaWsaWlaWeaW^aWWaWPaWIaWBaW;aW4aW-aW&aWaWaWaW aWaWü`Wõ`Wî`Wç`Wà`WÙ`WÒ`WË`WÄ`W½`W¶`W¯`W¨`W¡`Wš`W“`WŒ`W…`W~`Ww`Wp`Wi`Wb`W[`WT`WM`WF`W?`W8`W1`W*`W#`W`W`W`W`W`Wù_Wò_Wë_Wä_WÝ_WÖ_WÏ_WÈ_WÁ_Wº_W³_W¬_W¥_Wž_W—_W_W‰_W‚_W{_Wt_Wm_Wf_W__WX_WQ_WJ_WC_W<_W5_W._W'_W _W_W_W _W_Wý^Wö^Wï^Wè^Wá^WÚ^WÓ^WÌ^WÅ^W¾^W·^W°^W©^W¢^W›^W”^W^W†^W^Wx^Wq^Wj^Wc^W\^WU^WN^WG^W@^W9^W2^W+^W$^W^W^W^W^W^Wú]Wó]Wì]Wå]WÞ]W×]WÐ]WÉ]WÂ]W»]W´]W­]W¦]WŸ]W˜]W‘]WŠ]Wƒ]W|]Wu]Wn]Wg]W`]WY]WR]WK]WD]W=]W6]W/]W(]W!]W]W]W ]W]Wþ\W÷\Wð\Wé\Wâ\WÛ\WÔ\WÍ\WÆ\W¿\W¸\W±\Wª\W£\Wœ\W•\WŽ\W‡\W€\Wy\Wr\Wk\Wd\W]\WV\WO\WH\WA\W:\W3\W,\W%\W\W\W\W \W\Wû[Wô[Wí[Wæ[Wß[WØ[WÑ[WÊ[WÃ[W¼[Wµ[W®[W§[W [W™[W’[W‹[W„[W}[Wv[Wo[Wh[Wa[WZ[WS[WL[WE[W>[W7[W0[W)[W"[W[W [W[WÿZWøZWñZWêZWãZWÜZWÕZWÎZWÇZWÀZW¹ZW²ZW«ZW¤ZWZW–ZWZWˆZWZWzZWsZWlZWeZW^ZWWZWPZWIZWBZW;ZW4ZW-ZW&ZWZWZWZW ZWZWüYWõYWîYWçYWàYWÙYWÒYWËYWÄYW½YW¶YW¯YW¨YW¡YWšYW“YWŒYW…YW~YWwYWpYWiYWbYW[YWTYWMYWFYW?YW8YW1YW*YW#YWYWYWYWYWYWùXWòXWëXWäXWÝXWÖXWÏXWÈXWÁXWºXW³XW¬XW¥XWžXW—XWXW‰XW‚XW{XWtXWmXWfXW_XWXXWQXWJXWCXWTW7TW0TW)TW"TWTWTW TWTWÿSWøSWñSWêSWãSWÜSWÕSWÎSWÇSWÀSW¹SW²SW«SW¤SWSW–SWSWˆSWSWzSWsSWlSWeSW^SWWSWPSWISWBSW;SW4SW-SW&SWSWSWSW SWSWüRWõRWîRWçRWàRWÙRWÒRWËRWÄRW½RW¶RW¯RW¨RW¡RWšRW“RWŒRW…RW~RWwRWpRWiRWbRW[RWTRWMRWFRW?RW8RW1RW*RW#RWRWRWRWRWRWùQWòQWëQWäQWÝQWÖQWÏQWÈQWÁQWºQW³QW¬QW¥QWžQW—QWQW‰QW‚QW{QWtQWmQWfQW_QWXQWQQWJQWCQWMW7MW0MW)MW"MWMWMW MWMWÿLWøLWñLWêLWãLWÜLWÕLWÎLWÇLWÀLW¹LW²LW«LW¤LWLW–LWLWˆLWLWzLWsLWlLWeLW^LWWLWPLWILWBLW;LW4LW-LW&LWLWLWLW LWLWüKWõKWîKWçKWàKWÙKWÒKWËKWÄKW½KW¶KW¯KW¨KW¡KWšKW“KWŒKW…KW~KWwKWpKWiKWbKW[KWTKWMKWFKW?KW8KW1KW*KW#KWKWKWKWKWKWùJWòJWëJWäJWÝJWÖJWÏJWÈJWÁJWºJW³JW¬JW¥JWžJW—JWJW‰JW‚JW{JWtJWmJWfJW_JWXJWQJWJJWCJWFW7FW0FW)FW"FWFWFW FWFWÿEWøEWñEWêEWãEWÜEWÕEWÎEWÇEWÀEW¹EW²EW«EW¤EWEW–EWEWˆEWEWzEWsEWlEWeEW^EWWEWPEWIEWBEW;EW4EW-EW&EWEWEWEW EWEWüDWõDWîDWçDWàDWÙDWÒDWËDWÄDW½DW¶DW¯DW¨DW¡DWšDW“DWŒDW…DW~DWwDWpDWiDWbDW[DWTDWMDWFDW?DW8DW1DW*DW#DWDWDWDWDWDWùCWòCWëCWäCWÝCWÖCWÏCWÈCWÁCWºCW³CW¬CW¥CWžCW—CWCW‰CW‚CW{CWtCWmCWfCW_CWXCWQCWJCWCCW?W7?W0?W)?W"?W?W?W ?W?Wÿ>Wø>Wñ>Wê>Wã>WÜ>WÕ>WÎ>WÇ>WÀ>W¹>W²>W«>W¤>W>W–>W>Wˆ>W>Wz>Ws>Wl>We>W^>WW>WP>WI>WB>W;>W4>W->W&>W>W>W>W >W>Wü=Wõ=Wî=Wç=Wà=WÙ=WÒ=WË=WÄ=W½=W¶=W¯=W¨=W¡=Wš=W“=WŒ=W…=W~=Ww=Wp=Wi=Wb=W[=WT=WM=WF=W?=W8=W1=W*=W#=W=W=W=W=W=Wù8W78W08W)8W"8W8W8W 8W8Wÿ7Wø7Wñ7Wê7Wã7WÜ7WÕ7WÎ7WÇ7WÀ7W¹7W²7W«7W¤7W7W–7W7Wˆ7W7Wz7Ws7Wl7We7W^7WW7WP7WI7WB7W;7W47W-7W&7W7W7W7W 7W7Wü6Wõ6Wî6Wç6Wà6WÙ6WÒ6WË6WÄ6W½6W¶6W¯6W¨6W¡6Wš6W“6WŒ6W…6W~6Ww6Wp6Wi6Wb6W[6WT6WM6WF6W?6W86W16W*6W#6W6W6W6W6W6Wù5Wò5Wë5Wä5WÝ5WÖ5WÏ5WÈ5WÁ5Wº5W³5W¬5W¥5Wž5W—5W5W‰5W‚5W{5Wt5Wm5Wf5W_5WX5WQ5WJ5WC5W<5W55W.5W'5W 5W5W5W 5W5Wý4Wö4Wï4Wè4Wá4WÚ4WÓ4WÌ4WÅ4W¾4W·4W°4W©4W¢4W›4W”4W4W†4W4Wx4Wq4Wj4Wc4W\4WU4WN4WG4W@4W94W24W+4W$4W4W4W4W4W4Wú3Wó3Wì3Wå3WÞ3W×3WÐ3WÉ3WÂ3W»3W´3W­3W¦3WŸ3W˜3W‘3WŠ3Wƒ3W|3Wu3Wn3Wg3W`3WY3WR3WK3WD3W=3W63W/3W(3W!3W3W3W 3W3Wþ2W÷2Wð2Wé2Wâ2WÛ2WÔ2WÍ2WÆ2W¿2W¸2W±2Wª2W£2Wœ2W•2WŽ2W‡2W€2Wy2Wr2Wk2Wd2W]2WV2WO2WH2WA2W:2W32W,2W%2W2W2W2W 2W2Wû1Wô1Wí1Wæ1Wß1WØ1WÑ1WÊ1WÃ1W¼1Wµ1W®1W§1W 1W™1W’1W‹1W„1W}1Wv1Wo1Wh1Wa1WZ1WS1WL1WE1W>1W71W01W)1W"1W1W1W 1W1Wÿ0Wø0Wñ0Wê0Wã0WÜ0WÕ0WÎ0WÇ0WÀ0W¹0W²0W«0W¤0W0W–0W0Wˆ0W0Wz0Ws0Wl0We0W^0WW0WP0WI0WB0W;0W40W-0W&0W0W0W0W 0W0Wü/Wõ/Wî/Wç/Wà/WÙ/WÒ/WË/WÄ/W½/W¶/W¯/W¨/W¡/Wš/W“/WŒ/W…/W~/Ww/Wp/Wi/Wb/W[/WT/WM/WF/W?/W8/W1/W*/W#/W/W/W/W/W/Wù.Wò.Wë.Wä.WÝ.WÖ.WÏ.WÈ.WÁ.Wº.W³.W¬.W¥.Wž.W—.W.W‰.W‚.W{.Wt.Wm.Wf.W_.WX.WQ.WJ.WC.W<.W5.W..W'.W .W.W.W .W.Wý-Wö-Wï-Wè-Wá-WÚ-WÓ-WÌ-WÅ-W¾-W·-W°-W©-W¢-W›-W”-W-W†-W-Wx-Wq-Wj-Wc-W\-WU-WN-WG-W@-W9-W2-W+-W$-W-W-W-W-W-Wú,Wó,Wì,Wå,WÞ,W×,WÐ,WÉ,WÂ,W»,W´,W­,W¦,WŸ,W˜,W‘,WŠ,Wƒ,W|,Wu,Wn,Wg,W`,WY,WR,WK,WD,W=,W6,W/,W(,W!,W,W,W ,W,Wþ+W÷+Wð+Wé+Wâ+WÛ+WÔ+WÍ+WÆ+W¿+W¸+W±+Wª+W£+Wœ+W•+WŽ+W‡+W€+Wy+Wr+Wk+Wd+W]+WV+WO+WH+WA+W:+W3+W,+W%+W+W+W+W +W+Wû*Wô*Wí*Wæ*Wß*WØ*WÑ*WÊ*WÃ*W¼*Wµ*W®*W§*W *W™*W’*W‹*W„*W}*Wv*Wo*Wh*Wa*WZ*WS*WL*WE*W>*W7*W0*W)*W"*W*W*W *W*Wÿ)Wø)Wñ)Wê)Wã)WÜ)WÕ)WÎ)WÇ)WÀ)W¹)W²)W«)W¤)W)W–)W)Wˆ)W)Wz)Ws)Wl)We)W^)WW)WP)WI)WB)W;)W4)W-)W&)W)W)W)W )W)Wü(Wõ(Wî(Wç(Wà(WÙ(WÒ(WË(WÄ(W½(W¶(W¯(W¨(W¡(Wš(W“(WŒ(W…(W~(Ww(Wp(Wi(Wb(W[(WT(WM(WF(W?(W8(W1(W*(W#(W(W(W(W(W(Wù'Wò'Wë'Wä'WÝ'WÖ'WÏ'WÈ'WÁ'Wº'W³'W¬'W¥'Wž'W—'W'W‰'W‚'W{'Wt'Wm'Wf'W_'WX'WQ'WJ'WC'W<'W5'W.'W''W 'W'W'W 'W'Wý&Wö&Wï&Wè&Wá&WÚ&WÓ&WÌ&WÅ&W¾&W·&W°&W©&W¢&W›&W”&W&W†&W&Wx&Wq&Wj&Wc&W\&WU&WN&WG&W@&W9&W2&W+&W$&W&W&W&W&W&Wú%Wó%Wì%Wå%WÞ%W×%WÐ%WÉ%WÂ%W»%W´%W­%W¦%WŸ%W˜%W‘%WŠ%Wƒ%W|%Wu%Wn%Wg%W`%WY%WR%WK%WD%W=%W6%W/%W(%W!%W%W%W %W%Wþ$W÷$Wð$Wé$Wâ$WÛ$WÔ$WÍ$WÆ$W¿$W¸$W±$Wª$W£$Wœ$W•$WŽ$W‡$W€$Wy$Wr$Wk$Wd$W]$WV$WO$WH$WA$W:$W3$W,$W%$W$W$W$W $W$Wû#Wô#Wí#Wæ#Wß#WØ#WÑ#WÊ#WÃ#W¼#Wµ#W®#W§#W #W™#W’#W‹#W„#W}#Wv#Wo#Wh#Wa#WZ#WS#WL#WE#W>#W7#W0#W)#W"#W#W#W #W#Wÿ"Wø"Wñ"Wê"Wã"WÜ"WÕ"WÎ"WÇ"WÀ"W¹"W²"W«"W¤"W"W–"W"Wˆ"W"Wz"Ws"Wl"We"W^"WW"WP"WI"WB"W;"W4"W-"W&"W"W"W"W "W"Wü!Wõ!Wî!Wç!Wà!WÙ!WÒ!WË!WÄ!W½!W¶!W¯!W¨!W¡!Wš!W“!WŒ!W…!W~!Ww!Wp!Wi!Wb!W[!WT!WM!WF!W?!W8!W1!W*!W#!W!W!W!W!W!Wù Wò Wë Wä WÝ WÖ WÏ WÈ WÁ Wº W³ W¬ W¥ Wž W— W W‰ W‚ W{ Wt Wm Wf W_ WX WQ WJ WC W< W5 W. W' W W W W W WýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWúWóWìWåWÞW×WÐWÉWÂW»W´W­W¦WŸW˜W‘WŠWƒW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWúWóWìWåWÞW×WÐWÉWÂW»W´W­W¦WŸW˜W‘WŠWƒW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWúWóWìWåWÞW×WÐWÉWÂW»W´W­W¦WŸW˜W‘WŠWƒW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿ Wø Wñ Wê Wã WÜ WÕ WÎ WÇ WÀ W¹ W² W« W¤ W W– W Wˆ W Wz Ws Wl We W^ WW WP WI WB W; W4 W- W& W W W W W Wü Wõ Wî Wç Wà WÙ WÒ WË WÄ W½ W¶ W¯ W¨ W¡ Wš W“ WŒ W… W~ Ww Wp Wi Wb W[ WT WM WF W? W8 W1 W* W# W W W W W Wù Wò Wë Wä WÝ WÖ WÏ WÈ WÁ Wº W³ W¬ W¥ Wž W— W W‰ W‚ W{ Wt Wm Wf W_ WX WQ WJ WC W< W5 W. W' W W W W W Wý Wö Wï Wè Wá WÚ WÓ WÌ WÅ W¾ W· W° W© W¢ W› W” W W† W Wx Wq Wj Wc W\ WU WN WG W@ W9 W2 W+ W$ W W W W W Wú Wó Wì Wå WÞ W× WÐ WÉ W W» W´ W­ W¦ WŸ W˜ W‘ WŠ Wƒ W| Wu Wn Wg W` WY WR WK WD W= W6 W/ W( W! W W W W WþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCW<W5W.W'W WWW WWýWöWïWèWáWÚWÓWÌWÅW¾W·W°W©W¢W›W”WW†WWxWqWjWcW\WUWNWGW@W9W2W+W$WWWWWWúWóWìWåWÞW×WÐWÉWÂW»W´W­W¦WŸW˜W‘WŠWƒW|WuWnWgW`WYWRWKWDW=W6W/W(W!WWW WWþW÷WðWéWâWÛWÔWÍWÆW¿W¸W±WªW£WœW•WŽW‡W€WyWrWkWdW]WVWOWHWAW:W3W,W%WWWW WWûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿÿVøÿVñÿVêÿVãÿVÜÿVÕÿVÎÿVÇÿVÀÿV¹ÿV²ÿV«ÿV¤ÿVÿV–ÿVÿVˆÿVÿVzÿVsÿVlÿVeÿV^ÿVWÿVPÿVIÿVBÿV;ÿV4ÿV-ÿV&ÿVÿVÿVÿV ÿVÿVüþVõþVîþVçþVàþVÙþVÒþVËþVÄþV½þV¶þV¯þV¨þV¡þVšþV“þVŒþV…þV~þVwþVpþViþVbþV[þVTþVMþVFþV?þV8þV1þV*þV#þVþVþVþVþVþVùýVòýVëýVäýVÝýVÖýVÏýVÈýVÁýVºýV³ýV¬ýV¥ýVžýV—ýVýV‰ýV‚ýV{ýVtýVmýVfýV_ýVXýVQýVJýVCýV<ýV5ýV.ýV'ýV ýVýVýV ýVýVýüVöüVïüVèüVáüVÚüVÓüVÌüVÅüV¾üV·üV°üV©üV¢üV›üV”üVüV†üVüVxüVqüVjüVcüV\üVUüVNüVGüV@üV9üV2üV+üV$üVüVüVüVüVüVúûVóûVìûVåûVÞûV×ûVÐûVÉûVÂûV»ûV´ûV­ûV¦ûVŸûV˜ûV‘ûVŠûVƒûV|ûVuûVnûVgûV`ûVYûVRûVKûVDûV=ûV6ûV/ûV(ûV!ûVûVûV ûVûVþúV÷úVðúVéúVâúVÛúVÔúVÍúVÆúV¿úV¸úV±úVªúV£úVœúV•úVŽúV‡úV€úVyúVrúVkúVdúV]úVVúVOúVHúVAúV:úV3úV,úV%úVúVúVúV úVúVûùVôùVíùVæùVßùVØùVÑùVÊùVÃùV¼ùVµùV®ùV§ùV ùV™ùV’ùV‹ùV„ùV}ùVvùVoùVhùVaùVZùVSùVLùVEùV>ùV7ùV0ùV)ùV"ùVùVùV ùVùVÿøVøøVñøVêøVãøVÜøVÕøVÎøVÇøVÀøV¹øV²øV«øV¤øVøV–øVøVˆøVøVzøVsøVløVeøV^øVWøVPøVIøVBøV;øV4øV-øV&øVøVøVøV øVøVü÷Võ÷Vî÷Vç÷Và÷VÙ÷VÒ÷VË÷VÄ÷V½÷V¶÷V¯÷V¨÷V¡÷Vš÷V“÷VŒ÷V…÷V~÷Vw÷Vp÷Vi÷Vb÷V[÷VT÷VM÷VF÷V?÷V8÷V1÷V*÷V#÷V÷V÷V÷V÷V÷VùöVòöVëöVäöVÝöVÖöVÏöVÈöVÁöVºöV³öV¬öV¥öVžöV—öVöV‰öV‚öV{öVtöVmöVföV_öVXöVQöVJöVCöV<öV5öV.öV'öV öVöVöV öVöVýõVöõVïõVèõVáõVÚõVÓõVÌõVÅõV¾õV·õV°õV©õV¢õV›õV”õVõV†õVõVxõVqõVjõVcõV\õVUõVNõVGõV@õV9õV2õV+õV$õVõVõVõVõVõVúôVóôVìôVåôVÞôV×ôVÐôVÉôVÂôV»ôV´ôV­ôV¦ôVŸôV˜ôV‘ôVŠôVƒôV|ôVuôVnôVgôV`ôVYôVRôVKôVDôV=ôV6ôV/ôV(ôV!ôVôVôV ôVôVþóV÷óVðóVéóVâóVÛóVÔóVÍóVÆóV¿óV¸óV±óVªóV£óVœóV•óVŽóV‡óV€óVyóVróVkóVdóV]óVVóVOóVHóVAóV:óV3óV,óV%óVóVóVóV óVóVûòVôòVíòVæòVßòVØòVÑòVÊòVÃòV¼òVµòV®òV§òV òV™òV’òV‹òV„òV}òVvòVoòVhòVaòVZòVSòVLòVEòV>òV7òV0òV)òV"òVòVòV òVòVÿñVøñVññVêñVãñVÜñVÕñVÎñVÇñVÀñV¹ñV²ñV«ñV¤ñVñV–ñVñVˆñVñVzñVsñVlñVeñV^ñVWñVPñVIñVBñV;ñV4ñV-ñV&ñVñVñVñV ñVñVüðVõðVîðVçðVàðVÙðVÒðVËðVÄðV½ðV¶ðV¯ðV¨ðV¡ðVšðV“ðVŒðV…ðV~ðVwðVpðViðVbðV[ðVTðVMðVFðV?ðV8ðV1ðV*ðV#ðVðVðVðVðVðVùïVòïVëïVäïVÝïVÖïVÏïVÈïVÁïVºïV³ïV¬ïV¥ïVžïV—ïVïV‰ïV‚ïV{ïVtïVmïVfïV_ïVXïVQïVJïVCïV<ïV5ïV.ïV'ïV ïVïVïV ïVïVýîVöîVïîVèîVáîVÚîVÓîVÌîVÅîV¾îV·îV°îV©îV¢îV›îV”îVîV†îVîVxîVqîVjîVcîV\îVUîVNîVGîV@îV9îV2îV+îV$îVîVîVîVîVîVúíVóíVìíVåíVÞíV×íVÐíVÉíVÂíV»íV´íV­íV¦íVŸíV˜íV‘íVŠíVƒíV|íVuíVníVgíV`íVYíVRíVKíVDíV=íV6íV/íV(íV!íVíVíV íVíVþìV÷ìVðìVéìVâìVÛìVÔìVÍìVÆìV¿ìV¸ìV±ìVªìV£ìVœìV•ìVŽìV‡ìV€ìVyìVrìVkìVdìV]ìVVìVOìVHìVAìV:ìV3ìV,ìV%ìVìVìVìV ìVìVûëVôëVíëVæëVßëVØëVÑëVÊëVÃëV¼ëVµëV®ëV§ëV ëV™ëV’ëV‹ëV„ëV}ëVvëVoëVhëVaëVZëVSëVLëVEëV>ëV7ëV0ëV)ëV"ëVëVëV ëVëVÿêVøêVñêVêêVãêVÜêVÕêVÎêVÇêVÀêV¹êV²êV«êV¤êVêV–êVêVˆêVêVzêVsêVlêVeêV^êVWêVPêVIêVBêV;êV4êV-êV&êVêVêVêV êVêVüéVõéVîéVçéVàéVÙéVÒéVËéVÄéV½éV¶éV¯éV¨éV¡éVšéV“éVŒéV…éV~éVwéVpéViéVbéV[éVTéVMéVFéV?éV8éV1éV*éV#éVéVéVéVéVéVùèVòèVëèVäèVÝèVÖèVÏèVÈèVÁèVºèV³èV¬èV¥èVžèV—èVèV‰èV‚èV{èVtèVmèVfèV_èVXèVQèVJèVCèV<èV5èV.èV'èV èVèVèV èVèVýçVöçVïçVèçVáçVÚçVÓçVÌçVÅçV¾çV·çV°çV©çV¢çV›çV”çVçV†çVçVxçVqçVjçVcçV\çVUçVNçVGçV@çV9çV2çV+çV$çVçVçVçVçVçVúæVóæVìæVåæVÞæV׿VÐæVÉæVÂæV»æV´æV­æV¦æVŸæV˜æV‘æVŠæVƒæV|æVuæVnæVgæV`æVYæVRæVKæVDæV=æV6æV/æV(æV!æVæVæV æVæVþåV÷åVðåVéåVâåVÛåVÔåVÍåVÆåV¿åV¸åV±åVªåV£åVœåV•åVŽåV‡åV€åVyåVråVkåVdåV]åVVåVOåVHåVAåV:åV3åV,åV%åVåVåVåV åVåVûäVôäVíäVæäVßäVØäVÑäVÊäVÃäV¼äVµäV®äV§äV äV™äV’äV‹äV„äV}äVväVoäVhäVaäVZäVSäVLäVEäV>äV7äV0äV)äV"äVäVäV äVäVÿãVøãVñãVêãVããVÜãVÕãVÎãVÇãVÀãV¹ãV²ãV«ãV¤ãVãV–ãVãVˆãVãVzãVsãVlãVeãV^ãVWãVPãVIãVBãV;ãV4ãV-ãV&ãVãVãVãV ãVãVüâVõâVîâVçâVàâVÙâVÒâVËâVÄâV½âV¶âV¯âV¨âV¡âVšâV“âVŒâV…âV~âVwâVpâViâVbâV[âVTâVMâVFâV?âV8âV1âV*âV#âVâVâVâVâVâVùáVòáVëáVäáVÝáVÖáVÏáVÈáVÁáVºáV³áV¬áV¥áVžáV—áVáV‰áV‚áV{áVtáVmáVfáV_áVXáVQáVJáVCáV<áV5áV.áV'áV áVáVáV áVáVýàVöàVïàVèàVáàVÚàVÓàVÌàVÅàV¾àV·àV°àV©àV¢àV›àV”àVàV†àVàVxàVqàVjàVcàV\àVUàVNàVGàV@àV9àV2àV+àV$àVàVàVàVàVàVúßVóßVìßVåßVÞßV×ßVÐßVÉßVÂßV»ßV´ßV­ßV¦ßVŸßV˜ßV‘ßVŠßVƒßV|ßVußVnßVgßV`ßVYßVRßVKßVDßV=ßV6ßV/ßV(ßV!ßVßVßV ßVßVþÞV÷ÞVðÞVéÞVâÞVÛÞVÔÞVÍÞVÆÞV¿ÞV¸ÞV±ÞVªÞV£ÞVœÞV•ÞVŽÞV‡ÞV€ÞVyÞVrÞVkÞVdÞV]ÞVVÞVOÞVHÞVAÞV:ÞV3ÞV,ÞV%ÞVÞVÞVÞV ÞVÞVûÝVôÝVíÝVæÝVßÝVØÝVÑÝVÊÝVÃÝV¼ÝVµÝV®ÝV§ÝV ÝV™ÝV’ÝV‹ÝV„ÝV}ÝVvÝVoÝVhÝVaÝVZÝVSÝVLÝVEÝV>ÝV7ÝV0ÝV)ÝV"ÝVÝVÝV ÝVÝVÿÜVøÜVñÜVêÜVãÜVÜÜVÕÜVÎÜVÇÜVÀÜV¹ÜV²ÜV«ÜV¤ÜVÜV–ÜVÜVˆÜVÜVzÜVsÜVlÜVeÜV^ÜVWÜVPÜVIÜVBÜV;ÜV4ÜV-ÜV&ÜVÜVÜVÜV ÜVÜVüÛVõÛVîÛVçÛVàÛVÙÛVÒÛVËÛVÄÛV½ÛV¶ÛV¯ÛV¨ÛV¡ÛVšÛV“ÛVŒÛV…ÛV~ÛVwÛVpÛViÛVbÛV[ÛVTÛVMÛVFÛV?ÛV8ÛV1ÛV*ÛV#ÛVÛVÛVÛVÛVÛVùÚVòÚVëÚVäÚVÝÚVÖÚVÏÚVÈÚVÁÚVºÚV³ÚV¬ÚV¥ÚVžÚV—ÚVÚV‰ÚV‚ÚV{ÚVtÚVmÚVfÚV_ÚVXÚVQÚVJÚVCÚV<ÚV5ÚV.ÚV'ÚV ÚVÚVÚV ÚVÚVýÙVöÙVïÙVèÙVáÙVÚÙVÓÙVÌÙVÅÙV¾ÙV·ÙV°ÙV©ÙV¢ÙV›ÙV”ÙVÙV†ÙVÙVxÙVqÙVjÙVcÙV\ÙVUÙVNÙVGÙV@ÙV9ÙV2ÙV+ÙV$ÙVÙVÙVÙVÙVÙVúØVóØVìØVåØVÞØVרVÐØVÉØVÂØV»ØV´ØV­ØV¦ØVŸØV˜ØV‘ØVŠØVƒØV|ØVuØVnØVgØV`ØVYØVRØVKØVDØV=ØV6ØV/ØV(ØV!ØVØVØV ØVØVþ×V÷×Vð×Vé×Vâ×VÛ×VÔ×VÍ×VÆ×V¿×V¸×V±×Vª×V£×Vœ×V•×VŽ×V‡×V€×Vy×Vr×Vk×Vd×V]×VV×VO×VH×VA×V:×V3×V,×V%×V×V×V×V ×V×VûÖVôÖVíÖVæÖVßÖVØÖVÑÖVÊÖVÃÖV¼ÖVµÖV®ÖV§ÖV ÖV™ÖV’ÖV‹ÖV„ÖV}ÖVvÖVoÖVhÖVaÖVZÖVSÖVLÖVEÖV>ÖV7ÖV0ÖV)ÖV"ÖVÖVÖV ÖVÖVÿÕVøÕVñÕVêÕVãÕVÜÕVÕÕVÎÕVÇÕVÀÕV¹ÕV²ÕV«ÕV¤ÕVÕV–ÕVÕVˆÕVÕVzÕVsÕVlÕVeÕV^ÕVWÕVPÕVIÕVBÕV;ÕV4ÕV-ÕV&ÕVÕVÕVÕV ÕVÕVüÔVõÔVîÔVçÔVàÔVÙÔVÒÔVËÔVÄÔV½ÔV¶ÔV¯ÔV¨ÔV¡ÔVšÔV“ÔVŒÔV…ÔV~ÔVwÔVpÔViÔVbÔV[ÔVTÔVMÔVFÔV?ÔV8ÔV1ÔV*ÔV#ÔVÔVÔVÔVÔVÔVùÓVòÓVëÓVäÓVÝÓVÖÓVÏÓVÈÓVÁÓVºÓV³ÓV¬ÓV¥ÓVžÓV—ÓVÓV‰ÓV‚ÓV{ÓVtÓVmÓVfÓV_ÓVXÓVQÓVJÓVCÓV<ÓV5ÓV.ÓV'ÓV ÓVÓVÓV ÓVÓVýÒVöÒVïÒVèÒVáÒVÚÒVÓÒVÌÒVÅÒV¾ÒV·ÒV°ÒV©ÒV¢ÒV›ÒV”ÒVÒV†ÒVÒVxÒVqÒVjÒVcÒV\ÒVUÒVNÒVGÒV@ÒV9ÒV2ÒV+ÒV$ÒVÒVÒVÒVÒVÒVúÑVóÑVìÑVåÑVÞÑV×ÑVÐÑVÉÑVÂÑV»ÑV´ÑV­ÑV¦ÑVŸÑV˜ÑV‘ÑVŠÑVƒÑV|ÑVuÑVnÑVgÑV`ÑVYÑVRÑVKÑVDÑV=ÑV6ÑV/ÑV(ÑV!ÑVÑVÑV ÑVÑVþÐV÷ÐVðÐVéÐVâÐVÛÐVÔÐVÍÐVÆÐV¿ÐV¸ÐV±ÐVªÐV£ÐVœÐV•ÐVŽÐV‡ÐV€ÐVyÐVrÐVkÐVdÐV]ÐVVÐVOÐVHÐVAÐV:ÐV3ÐV,ÐV%ÐVÐVÐVÐV ÐVÐVûÏVôÏVíÏVæÏVßÏVØÏVÑÏVÊÏVÃÏV¼ÏVµÏV®ÏV§ÏV ÏV™ÏV’ÏV‹ÏV„ÏV}ÏVvÏVoÏVhÏVaÏVZÏVSÏVLÏVEÏV>ÏV7ÏV0ÏV)ÏV"ÏVÏVÏV ÏVÏVÿÎVøÎVñÎVêÎVãÎVÜÎVÕÎVÎÎVÇÎVÀÎV¹ÎV²ÎV«ÎV¤ÎVÎV–ÎVÎVˆÎVÎVzÎVsÎVlÎVeÎV^ÎVWÎVPÎVIÎVBÎV;ÎV4ÎV-ÎV&ÎVÎVÎVÎV ÎVÎVüÍVõÍVîÍVçÍVàÍVÙÍVÒÍVËÍVÄÍV½ÍV¶ÍV¯ÍV¨ÍV¡ÍVšÍV“ÍVŒÍV…ÍV~ÍVwÍVpÍViÍVbÍV[ÍVTÍVMÍVFÍV?ÍV8ÍV1ÍV*ÍV#ÍVÍVÍVÍVÍVÍVùÌVòÌVëÌVäÌVÝÌVÖÌVÏÌVÈÌVÁÌVºÌV³ÌV¬ÌV¥ÌVžÌV—ÌVÌV‰ÌV‚ÌV{ÌVtÌVmÌVfÌV_ÌVXÌVQÌVJÌVCÌV<ÌV5ÌV.ÌV'ÌV ÌVÌVÌV ÌVÌVýËVöËVïËVèËVáËVÚËVÓËVÌËVÅËV¾ËV·ËV°ËV©ËV¢ËV›ËV”ËVËV†ËVËVxËVqËVjËVcËV\ËVUËVNËVGËV@ËV9ËV2ËV+ËV$ËVËVËVËVËVËVúÊVóÊVìÊVåÊVÞÊV×ÊVÐÊVÉÊVÂÊV»ÊV´ÊV­ÊV¦ÊVŸÊV˜ÊV‘ÊVŠÊVƒÊV|ÊVuÊVnÊVgÊV`ÊVYÊVRÊVKÊVDÊV=ÊV6ÊV/ÊV(ÊV!ÊVÊVÊV ÊVÊVþÉV÷ÉVðÉVéÉVâÉVÛÉVÔÉVÍÉVÆÉV¿ÉV¸ÉV±ÉVªÉV£ÉVœÉV•ÉVŽÉV‡ÉV€ÉVyÉVrÉVkÉVdÉV]ÉVVÉVOÉVHÉVAÉV:ÉV3ÉV,ÉV%ÉVÉVÉVÉV ÉVÉVûÈVôÈVíÈVæÈVßÈVØÈVÑÈVÊÈVÃÈV¼ÈVµÈV®ÈV§ÈV ÈV™ÈV’ÈV‹ÈV„ÈV}ÈVvÈVoÈVhÈVaÈVZÈVSÈVLÈVEÈV>ÈV7ÈV0ÈV)ÈV"ÈVÈVÈV ÈVÈVÿÇVøÇVñÇVêÇVãÇVÜÇVÕÇVÎÇVÇÇVÀÇV¹ÇV²ÇV«ÇV¤ÇVÇV–ÇVÇVˆÇVÇVzÇVsÇVlÇVeÇV^ÇVWÇVPÇVIÇVBÇV;ÇV4ÇV-ÇV&ÇVÇVÇVÇV ÇVÇVüÆVõÆVîÆVçÆVàÆVÙÆVÒÆVËÆVÄÆV½ÆV¶ÆV¯ÆV¨ÆV¡ÆVšÆV“ÆVŒÆV…ÆV~ÆVwÆVpÆViÆVbÆV[ÆVTÆVMÆVFÆV?ÆV8ÆV1ÆV*ÆV#ÆVÆVÆVÆVÆVÆVùÅVòÅVëÅVäÅVÝÅVÖÅVÏÅVÈÅVÁÅVºÅV³ÅV¬ÅV¥ÅVžÅV—ÅVÅV‰ÅV‚ÅV{ÅVtÅVmÅVfÅV_ÅVXÅVQÅVJÅVCÅV<ÅV5ÅV.ÅV'ÅV ÅVÅVÅV ÅVÅVýÄVöÄVïÄVèÄVáÄVÚÄVÓÄVÌÄVÅÄV¾ÄV·ÄV°ÄV©ÄV¢ÄV›ÄV”ÄVÄV†ÄVÄVxÄVqÄVjÄVcÄV\ÄVUÄVNÄVGÄV@ÄV9ÄV2ÄV+ÄV$ÄVÄVÄVÄVÄVÄVúÃVóÃVìÃVåÃVÞÃV×ÃVÐÃVÉÃVÂÃV»ÃV´ÃV­ÃV¦ÃVŸÃV˜ÃV‘ÃVŠÃVƒÃV|ÃVuÃVnÃVgÃV`ÃVYÃVRÃVKÃVDÃV=ÃV6ÃV/ÃV(ÃV!ÃVÃVÃV ÃVÃVþÂV÷ÂVðÂVéÂVâÂVÛÂVÔÂVÍÂVÆÂV¿ÂV¸ÂV±ÂVªÂV£ÂVœÂV•ÂVŽÂV‡ÂV€ÂVyÂVrÂVkÂVdÂV]ÂVVÂVOÂVHÂVAÂV:ÂV3ÂV,ÂV%ÂVÂVÂVÂV ÂVÂVûÁVôÁVíÁVæÁVßÁVØÁVÑÁVÊÁVÃÁV¼ÁVµÁV®ÁV§ÁV ÁV™ÁV’ÁV‹ÁV„ÁV}ÁVvÁVoÁVhÁVaÁVZÁVSÁVLÁVEÁV>ÁV7ÁV0ÁV)ÁV"ÁVÁVÁV ÁVÁVÿÀVøÀVñÀVêÀVãÀVÜÀVÕÀVÎÀVÇÀVÀÀV¹ÀV²ÀV«ÀV¤ÀVÀV–ÀVÀVˆÀVÀVzÀVsÀVlÀVeÀV^ÀVWÀVPÀVIÀVBÀV;ÀV4ÀV-ÀV&ÀVÀVÀVÀV ÀVÀVü¿Võ¿Vî¿Vç¿Và¿VÙ¿VÒ¿VË¿VÄ¿V½¿V¶¿V¯¿V¨¿V¡¿Vš¿V“¿VŒ¿V…¿V~¿Vw¿Vp¿Vi¿Vb¿V[¿VT¿VM¿VF¿V?¿V8¿V1¿V*¿V#¿V¿V¿V¿V¿V¿Vù¾Vò¾Vë¾Vä¾VݾVÖ¾VϾVȾVÁ¾Vº¾V³¾V¬¾V¥¾Vž¾V—¾V¾V‰¾V‚¾V{¾Vt¾Vm¾Vf¾V_¾VX¾VQ¾VJ¾VC¾V<¾V5¾V.¾V'¾V ¾V¾V¾V ¾V¾Vý½Vö½Vï½Vè½Vá½VÚ½VÓ½V̽VŽV¾½V·½V°½V©½V¢½V›½V”½V½V†½V½Vx½Vq½Vj½Vc½V\½VU½VN½VG½V@½V9½V2½V+½V$½V½V½V½V½V½Vú¼Vó¼Vì¼Vå¼VÞ¼V×¼VмVɼV¼V»¼V´¼V­¼V¦¼VŸ¼V˜¼V‘¼VмVƒ¼V|¼Vu¼Vn¼Vg¼V`¼VY¼VR¼VK¼VD¼V=¼V6¼V/¼V(¼V!¼V¼V¼V ¼V¼Vþ»V÷»Vð»Vé»Vâ»VÛ»VÔ»VÍ»VÆ»V¿»V¸»V±»Vª»V£»Vœ»V•»VŽ»V‡»V€»Vy»Vr»Vk»Vd»V]»VV»VO»VH»VA»V:»V3»V,»V%»V»V»V»V »V»VûºVôºVíºVæºVߺVغVѺVʺVúV¼ºVµºV®ºV§ºV ºV™ºV’ºV‹ºV„ºV}ºVvºVoºVhºVaºVZºVSºVLºVEºV>ºV7ºV0ºV)ºV"ºVºVºV ºVºVÿ¹Vø¹Vñ¹Vê¹Vã¹VܹVÕ¹VιVǹVÀ¹V¹¹V²¹V«¹V¤¹V¹V–¹V¹Vˆ¹V¹Vz¹Vs¹Vl¹Ve¹V^¹VW¹VP¹VI¹VB¹V;¹V4¹V-¹V&¹V¹V¹V¹V ¹V¹Vü¸Võ¸Vî¸Vç¸Và¸VÙ¸VÒ¸V˸VĸV½¸V¶¸V¯¸V¨¸V¡¸Vš¸V“¸VŒ¸V…¸V~¸Vw¸Vp¸Vi¸Vb¸V[¸VT¸VM¸VF¸V?¸V8¸V1¸V*¸V#¸V¸V¸V¸V¸V¸Vù·Vò·Vë·Vä·VÝ·VÖ·VÏ·VÈ·VÁ·Vº·V³·V¬·V¥·Vž·V—·V·V‰·V‚·V{·Vt·Vm·Vf·V_·VX·VQ·VJ·VC·V<·V5·V.·V'·V ·V·V·V ·V·Vý¶Vö¶Vï¶Vè¶Vá¶VÚ¶VÓ¶V̶VŶV¾¶V·¶V°¶V©¶V¢¶V›¶V”¶V¶V†¶V¶Vx¶Vq¶Vj¶Vc¶V\¶VU¶VN¶VG¶V@¶V9¶V2¶V+¶V$¶V¶V¶V¶V¶V¶VúµVóµVìµVåµVÞµV×µVеVɵVµV»µV´µV­µV¦µVŸµV˜µV‘µVеVƒµV|µVuµVnµVgµV`µVYµVRµVKµVDµV=µV6µV/µV(µV!µVµVµV µVµVþ´V÷´Vð´Vé´Vâ´VÛ´VÔ´VÍ´VÆ´V¿´V¸´V±´Vª´V£´Vœ´V•´VŽ´V‡´V€´Vy´Vr´Vk´Vd´V]´VV´VO´VH´VA´V:´V3´V,´V%´V´V´V´V ´V´Vû³Vô³Ví³Væ³Vß³VسVѳVʳVóV¼³Vµ³V®³V§³V ³V™³V’³V‹³V„³V}³Vv³Vo³Vh³Va³VZ³VS³VL³VE³V>³V7³V0³V)³V"³V³V³V ³V³Vÿ²Vø²Vñ²Vê²Vã²VܲVÕ²VβVDzVÀ²V¹²V²²V«²V¤²V²V–²V²Vˆ²V²Vz²Vs²Vl²Ve²V^²VW²VP²VI²VB²V;²V4²V-²V&²V²V²V²V ²V²Vü±Võ±Vî±Vç±Và±VÙ±VÒ±V˱VıV½±V¶±V¯±V¨±V¡±Vš±V“±VŒ±V…±V~±Vw±Vp±Vi±Vb±V[±VT±VM±VF±V?±V8±V1±V*±V#±V±V±V±V±V±Vù°Vò°Vë°Vä°VݰVÖ°VϰVȰVÁ°Vº°V³°V¬°V¥°Vž°V—°V°V‰°V‚°V{°Vt°Vm°Vf°V_°VX°VQ°VJ°VC°V<°V5°V.°V'°V °V°V°V °V°Vý¯Vö¯Vï¯Vè¯Vá¯VÚ¯VÓ¯V̯VůV¾¯V·¯V°¯V©¯V¢¯V›¯V”¯V¯V†¯V¯Vx¯Vq¯Vj¯Vc¯V\¯VU¯VN¯VG¯V@¯V9¯V2¯V+¯V$¯V¯V¯V¯V¯V¯Vú®Vó®Vì®Vå®VÞ®V×®VЮVÉ®V®V»®V´®V­®V¦®VŸ®V˜®V‘®VŠ®Vƒ®V|®Vu®Vn®Vg®V`®VY®VR®VK®VD®V=®V6®V/®V(®V!®V®V®V ®V®Vþ­V÷­Vð­Vé­Vâ­VÛ­VÔ­VÍ­VÆ­V¿­V¸­V±­Vª­V£­Vœ­V•­VŽ­V‡­V€­Vy­Vr­Vk­Vd­V]­VV­VO­VH­VA­V:­V3­V,­V%­V­V­V­V ­V­Vû¬Vô¬Ví¬Væ¬V߬VجVѬVʬVìV¼¬Vµ¬V®¬V§¬V ¬V™¬V’¬V‹¬V„¬V}¬Vv¬Vo¬Vh¬Va¬VZ¬VS¬VL¬VE¬V>¬V7¬V0¬V)¬V"¬V¬V¬V ¬V¬Vÿ«Vø«Vñ«Vê«Vã«VÜ«VÕ«VΫVÇ«VÀ«V¹«V²«V««V¤«V«V–«V«Vˆ«V«Vz«Vs«Vl«Ve«V^«VW«VP«VI«VB«V;«V4«V-«V&«V«V«V«V «V«VüªVõªVîªVçªVàªVÙªVÒªV˪VĪV½ªV¶ªV¯ªV¨ªV¡ªVšªV“ªVŒªV…ªV~ªVwªVpªViªVbªV[ªVTªVMªVFªV?ªV8ªV1ªV*ªV#ªVªVªVªVªVªVù©Vò©Vë©Vä©VÝ©VÖ©VÏ©VÈ©VÁ©Vº©V³©V¬©V¥©Vž©V—©V©V‰©V‚©V{©Vt©Vm©Vf©V_©VX©VQ©VJ©VC©V<©V5©V.©V'©V ©V©V©V ©V©Vý¨Vö¨Vï¨Vè¨Vá¨VÚ¨VÓ¨V̨VŨV¾¨V·¨V°¨V©¨V¢¨V›¨V”¨V¨V†¨V¨Vx¨Vq¨Vj¨Vc¨V\¨VU¨VN¨VG¨V@¨V9¨V2¨V+¨V$¨V¨V¨V¨V¨V¨Vú§Vó§Vì§Vå§VÞ§V×§VЧVɧV§V»§V´§V­§V¦§VŸ§V˜§V‘§VЧVƒ§V|§Vu§Vn§Vg§V`§VY§VR§VK§VD§V=§V6§V/§V(§V!§V§V§V §V§Vþ¦V÷¦Vð¦Vé¦Vâ¦VÛ¦VÔ¦VͦVƦV¿¦V¸¦V±¦Vª¦V£¦Vœ¦V•¦VަV‡¦V€¦Vy¦Vr¦Vk¦Vd¦V]¦VV¦VO¦VH¦VA¦V:¦V3¦V,¦V%¦V¦V¦V¦V ¦V¦Vû¥Vô¥Ví¥Væ¥VߥVØ¥VÑ¥VÊ¥VÃ¥V¼¥Vµ¥V®¥V§¥V ¥V™¥V’¥V‹¥V„¥V}¥Vv¥Vo¥Vh¥Va¥VZ¥VS¥VL¥VE¥V>¥V7¥V0¥V)¥V"¥V¥V¥V ¥V¥Vÿ¤Vø¤Vñ¤Vê¤Vã¤VܤVÕ¤VΤVǤVÀ¤V¹¤V²¤V«¤V¤¤V¤V–¤V¤Vˆ¤V¤Vz¤Vs¤Vl¤Ve¤V^¤VW¤VP¤VI¤VB¤V;¤V4¤V-¤V&¤V¤V¤V¤V ¤V¤Vü£Võ£Vî£Vç£Và£VÙ£VÒ£VË£VÄ£V½£V¶£V¯£V¨£V¡£Vš£V“£VŒ£V…£V~£Vw£Vp£Vi£Vb£V[£VT£VM£VF£V?£V8£V1£V*£V#£V£V£V£V£V£Vù¢Vò¢Vë¢Vä¢VÝ¢VÖ¢VÏ¢VÈ¢VÁ¢Vº¢V³¢V¬¢V¥¢Vž¢V—¢V¢V‰¢V‚¢V{¢Vt¢Vm¢Vf¢V_¢VX¢VQ¢VJ¢VC¢V<¢V5¢V.¢V'¢V ¢V¢V¢V ¢V¢Vý¡Vö¡Vï¡Vè¡Vá¡VÚ¡VÓ¡VÌ¡VÅ¡V¾¡V·¡V°¡V©¡V¢¡V›¡V”¡V¡V†¡V¡Vx¡Vq¡Vj¡Vc¡V\¡VU¡VN¡VG¡V@¡V9¡V2¡V+¡V$¡V¡V¡V¡V¡V¡Vú Vó Vì Vå VÞ V× VРVÉ V V» V´ V­ V¦ VŸ V˜ V‘ VŠ Vƒ V| Vu Vn Vg V` VY VR VK VD V= V6 V/ V( V! V V V  V VþŸV÷ŸVðŸVéŸVâŸVÛŸVÔŸVÍŸVÆŸV¿ŸV¸ŸV±ŸVªŸV£ŸVœŸV•ŸVŽŸV‡ŸV€ŸVyŸVrŸVkŸVdŸV]ŸVVŸVOŸVHŸVAŸV:ŸV3ŸV,ŸV%ŸVŸVŸVŸV ŸVŸVûžVôžVížVæžVßžVØžVÑžVÊžVÞV¼žVµžV®žV§žV žV™žV’žV‹žV„žV}žVvžVožVhžVažVZžVSžVLžVEžV>žV7žV0žV)žV"žVžVžV žVžVÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüœVõœVîœVçœVàœVÙœVÒœVËœVÄœV½œV¶œV¯œV¨œV¡œVšœV“œVŒœV…œV~œVwœVpœViœVbœV[œVTœVMœVFœV?œV8œV1œV*œV#œVœVœVœVœVœVù›Vò›Vë›Vä›VÝ›VÖ›VÏ›VÈ›VÁ›Vº›V³›V¬›V¥›Vž›V—›V›V‰›V‚›V{›Vt›Vm›Vf›V_›VX›VQ›VJ›VC›V<›V5›V.›V'›V ›V›V›V ›V›VýšVöšVïšVèšVášVÚšVÓšVÌšVÅšV¾šV·šV°šV©šV¢šV›šV”šVšV†šVšVxšVqšVjšVcšV\šVUšVNšVGšV@šV9šV2šV+šV$šVšVšVšVšVšVú™Vó™Vì™Vå™VÞ™V×™VЙVÉ™V™V»™V´™V­™V¦™VŸ™V˜™V‘™VŠ™Vƒ™V|™Vu™Vn™Vg™V`™VY™VR™VK™VD™V=™V6™V/™V(™V!™V™V™V ™V™Vþ˜V÷˜Vð˜Vé˜Vâ˜VÛ˜VÔ˜V͘VƘV¿˜V¸˜V±˜Vª˜V£˜Vœ˜V•˜VŽ˜V‡˜V€˜Vy˜Vr˜Vk˜Vd˜V]˜VV˜VO˜VH˜VA˜V:˜V3˜V,˜V%˜V˜V˜V˜V ˜V˜Vû—Vô—Ví—Væ—Vß—VØ—VÑ—VÊ—V×V¼—Vµ—V®—V§—V —V™—V’—V‹—V„—V}—Vv—Vo—Vh—Va—VZ—VS—VL—VE—V>—V7—V0—V)—V"—V—V—V —V—Vÿ–Vø–Vñ–Vê–Vã–VÜ–VÕ–VΖVÇ–VÀ–V¹–V²–V«–V¤–V–V––V–Vˆ–V–Vz–Vs–Vl–Ve–V^–VW–VP–VI–VB–V;–V4–V-–V&–V–V–V–V –V–Vü•Võ•Vî•Vç•Và•VÙ•VÒ•VË•VÄ•V½•V¶•V¯•V¨•V¡•Vš•V“•VŒ•V…•V~•Vw•Vp•Vi•Vb•V[•VT•VM•VF•V?•V8•V1•V*•V#•V•V•V•V•V•Vù”Vò”Vë”Vä”VÝ”VÖ”VÏ”VÈ”VÁ”Vº”V³”V¬”V¥”Vž”V—”V”V‰”V‚”V{”Vt”Vm”Vf”V_”VX”VQ”VJ”VC”V<”V5”V.”V'”V ”V”V”V ”V”Vý“Vö“Vï“Vè“Vá“VÚ“VÓ“VÌ“VÅ“V¾“V·“V°“V©“V¢“V›“V”“V“V†“V“Vx“Vq“Vj“Vc“V\“VU“VN“VG“V@“V9“V2“V+“V$“V“V“V“V“V“Vú’Vó’Vì’Vå’VÞ’V×’VÐ’VÉ’VÂ’V»’V´’V­’V¦’VŸ’V˜’V‘’VŠ’Vƒ’V|’Vu’Vn’Vg’V`’VY’VR’VK’VD’V=’V6’V/’V(’V!’V’V’V ’V’Vþ‘V÷‘Vð‘Vé‘Vâ‘VÛ‘VÔ‘VÍ‘VÆ‘V¿‘V¸‘V±‘Vª‘V£‘Vœ‘V•‘VŽ‘V‡‘V€‘Vy‘Vr‘Vk‘Vd‘V]‘VV‘VO‘VH‘VA‘V:‘V3‘V,‘V%‘V‘V‘V‘V ‘V‘VûVôVíVæVßVØVÑVÊVÃV¼VµV®V§V V™V’V‹V„V}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüŽVõŽVîŽVçŽVàŽVÙŽVÒŽVËŽVÄŽV½ŽV¶ŽV¯ŽV¨ŽV¡ŽVšŽV“ŽVŒŽV…ŽV~ŽVwŽVpŽViŽVbŽV[ŽVTŽVMŽVFŽV?ŽV8ŽV1ŽV*ŽV#ŽVŽVŽVŽVŽVŽVùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV‰V7‰V0‰V)‰V"‰V‰V‰V ‰V‰VÿˆVøˆVñˆVêˆVãˆV܈VÕˆVΈVLjVÀˆV¹ˆV²ˆV«ˆV¤ˆVˆV–ˆVˆVˆˆVˆVzˆVsˆVlˆVeˆV^ˆVWˆVPˆVIˆVBˆV;ˆV4ˆV-ˆV&ˆVˆVˆVˆV ˆVˆVü‡Võ‡Vî‡Vç‡Và‡VÙ‡VÒ‡VˇVćV½‡V¶‡V¯‡V¨‡V¡‡Vš‡V“‡VŒ‡V…‡V~‡Vw‡Vp‡Vi‡Vb‡V[‡VT‡VM‡VF‡V?‡V8‡V1‡V*‡V#‡V‡V‡V‡V‡V‡Vù†Vò†Vë†Vä†V݆VÖ†VφVȆVÁ†Vº†V³†V¬†V¥†Vž†V—†V†V‰†V‚†V{†Vt†Vm†Vf†V_†VX†VQ†VJ†VC†V<†V5†V.†V'†V †V†V†V †V†Vý…Vö…Vï…Vè…Vá…VÚ…VÓ…VÌ…VÅ…V¾…V·…V°…V©…V¢…V›…V”…V…V†…V…Vx…Vq…Vj…Vc…V\…VU…VN…VG…V@…V9…V2…V+…V$…V…V…V…V…V…Vú„Vó„Vì„Vå„VÞ„VׄVЄVÉ„V„V»„V´„V­„V¦„VŸ„V˜„V‘„VŠ„Vƒ„V|„Vu„Vn„Vg„V`„VY„VR„VK„VD„V=„V6„V/„V(„V!„V„V„V „V„VþƒV÷ƒVðƒVéƒVâƒVÛƒVÔƒV̓VƃV¿ƒV¸ƒV±ƒVªƒV£ƒVœƒV•ƒVŽƒV‡ƒV€ƒVyƒVrƒVkƒVdƒV]ƒVVƒVOƒVHƒVAƒV:ƒV3ƒV,ƒV%ƒVƒVƒVƒV ƒVƒVû‚Vô‚Ví‚Væ‚Vß‚VØ‚VÑ‚VÊ‚VÂV¼‚Vµ‚V®‚V§‚V ‚V™‚V’‚V‹‚V„‚V}‚Vv‚Vo‚Vh‚Va‚VZ‚VS‚VL‚VE‚V>‚V7‚V0‚V)‚V"‚V‚V‚V ‚V‚VÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVü€Võ€Vî€Vç€Và€VÙ€VÒ€VË€VÄ€V½€V¶€V¯€V¨€V¡€Vš€V“€VŒ€V…€V~€Vw€Vp€Vi€Vb€V[€VT€VM€VF€V?€V8€V1€V*€V#€V€V€V€V€V€VùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVý~Vö~Vï~Vè~Vá~VÚ~VÓ~VÌ~VÅ~V¾~V·~V°~V©~V¢~V›~V”~V~V†~V~Vx~Vq~Vj~Vc~V\~VU~VN~VG~V@~V9~V2~V+~V$~V~V~V~V~V~Vú}Vó}Vì}Vå}VÞ}V×}VÐ}VÉ}VÂ}V»}V´}V­}V¦}VŸ}V˜}V‘}VŠ}Vƒ}V|}Vu}Vn}Vg}V`}VY}VR}VK}VD}V=}V6}V/}V(}V!}V}V}V }V}Vþ|V÷|Vð|Vé|Vâ|VÛ|VÔ|VÍ|VÆ|V¿|V¸|V±|Vª|V£|Vœ|V•|VŽ|V‡|V€|Vy|Vr|Vk|Vd|V]|VV|VO|VH|VA|V:|V3|V,|V%|V|V|V|V |V|Vû{Vô{Ví{Væ{Vß{VØ{VÑ{VÊ{VÃ{V¼{Vµ{V®{V§{V {V™{V’{V‹{V„{V}{Vv{Vo{Vh{Va{VZ{VS{VL{VE{V>{V7{V0{V){V"{V{V{V {V{VÿzVøzVñzVêzVãzVÜzVÕzVÎzVÇzVÀzV¹zV²zV«zV¤zVzV–zVzVˆzVzVzzVszVlzVezV^zVWzVPzVIzVBzV;zV4zV-zV&zVzVzVzV zVzVüyVõyVîyVçyVàyVÙyVÒyVËyVÄyV½yV¶yV¯yV¨yV¡yVšyV“yVŒyV…yV~yVwyVpyViyVbyV[yVTyVMyVFyV?yV8yV1yV*yV#yVyVyVyVyVyVùxVòxVëxVäxVÝxVÖxVÏxVÈxVÁxVºxV³xV¬xV¥xVžxV—xVxV‰xV‚xV{xVtxVmxVfxV_xVXxVQxVJxVCxVtV7tV0tV)tV"tVtVtV tVtVÿsVøsVñsVêsVãsVÜsVÕsVÎsVÇsVÀsV¹sV²sV«sV¤sVsV–sVsVˆsVsVzsVssVlsVesV^sVWsVPsVIsVBsV;sV4sV-sV&sVsVsVsV sVsVürVõrVîrVçrVàrVÙrVÒrVËrVÄrV½rV¶rV¯rV¨rV¡rVšrV“rVŒrV…rV~rVwrVprVirVbrV[rVTrVMrVFrV?rV8rV1rV*rV#rVrVrVrVrVrVùqVòqVëqVäqVÝqVÖqVÏqVÈqVÁqVºqV³qV¬qV¥qVžqV—qVqV‰qV‚qV{qVtqVmqVfqV_qVXqVQqVJqVCqVmV7mV0mV)mV"mVmVmV mVmVÿlVølVñlVêlVãlVÜlVÕlVÎlVÇlVÀlV¹lV²lV«lV¤lVlV–lVlVˆlVlVzlVslVllVelV^lVWlVPlVIlVBlV;lV4lV-lV&lVlVlVlV lVlVükVõkVîkVçkVàkVÙkVÒkVËkVÄkV½kV¶kV¯kV¨kV¡kVškV“kVŒkV…kV~kVwkVpkVikVbkV[kVTkVMkVFkV?kV8kV1kV*kV#kVkVkVkVkVkVùjVòjVëjVäjVÝjVÖjVÏjVÈjVÁjVºjV³jV¬jV¥jVžjV—jVjV‰jV‚jV{jVtjVmjVfjV_jVXjVQjVJjVCjVfV7fV0fV)fV"fVfVfV fVfVÿeVøeVñeVêeVãeVÜeVÕeVÎeVÇeVÀeV¹eV²eV«eV¤eVeV–eVeVˆeVeVzeVseVleVeeV^eVWeVPeVIeVBeV;eV4eV-eV&eVeVeVeV eVeVüdVõdVîdVçdVàdVÙdVÒdVËdVÄdV½dV¶dV¯dV¨dV¡dVšdV“dVŒdV…dV~dVwdVpdVidVbdV[dVTdVMdVFdV?dV8dV1dV*dV#dVdVdVdVdVdVùcVòcVëcVäcVÝcVÖcVÏcVÈcVÁcVºcV³cV¬cV¥cVžcV—cVcV‰cV‚cV{cVtcVmcVfcV_cVXcVQcVJcVCcV_V7_V0_V)_V"_V_V_V _V_Vÿ^Vø^Vñ^Vê^Vã^VÜ^VÕ^VÎ^VÇ^VÀ^V¹^V²^V«^V¤^V^V–^V^Vˆ^V^Vz^Vs^Vl^Ve^V^^VW^VP^VI^VB^V;^V4^V-^V&^V^V^V^V ^V^Vü]Võ]Vî]Vç]Và]VÙ]VÒ]VË]VÄ]V½]V¶]V¯]V¨]V¡]Vš]V“]VŒ]V…]V~]Vw]Vp]Vi]Vb]V[]VT]VM]VF]V?]V8]V1]V*]V#]V]V]V]V]V]Vù\Vò\Vë\Vä\VÝ\VÖ\VÏ\VÈ\VÁ\Vº\V³\V¬\V¥\Vž\V—\V\V‰\V‚\V{\Vt\Vm\Vf\V_\VX\VQ\VJ\VC\V<\V5\V.\V'\V \V\V\V \V\Vý[Vö[Vï[Vè[Vá[VÚ[VÓ[VÌ[VÅ[V¾[V·[V°[V©[V¢[V›[V”[V[V†[V[Vx[Vq[Vj[Vc[V\[VU[VN[VG[V@[V9[V2[V+[V$[V[V[V[V[V[VúZVóZVìZVåZVÞZV×ZVÐZVÉZVÂZV»ZV´ZV­ZV¦ZVŸZV˜ZV‘ZVŠZVƒZV|ZVuZVnZVgZV`ZVYZVRZVKZVDZV=ZV6ZV/ZV(ZV!ZVZVZV ZVZVþYV÷YVðYVéYVâYVÛYVÔYVÍYVÆYV¿YV¸YV±YVªYV£YVœYV•YVŽYV‡YV€YVyYVrYVkYVdYV]YVVYVOYVHYVAYV:YV3YV,YV%YVYVYVYV YVYVûXVôXVíXVæXVßXVØXVÑXVÊXVÃXV¼XVµXV®XV§XV XV™XV’XV‹XV„XV}XVvXVoXVhXVaXVZXVSXVLXVEXV>XV7XV0XV)XV"XVXVXV XVXVÿWVøWVñWVêWVãWVÜWVÕWVÎWVÇWVÀWV¹WV²WV«WV¤WVWV–WVWVˆWVWVzWVsWVlWVeWV^WVWWVPWVIWVBWV;WV4WV-WV&WVWVWVWV WVWVüVVõVVîVVçVVàVVÙVVÒVVËVVÄVV½VV¶VV¯VV¨VV¡VVšVV“VVŒVV…VV~VVwVVpVViVVbVV[VVTVVMVVFVV?VV8VV1VV*VV#VVVVVVVVVVVVùUVòUVëUVäUVÝUVÖUVÏUVÈUVÁUVºUV³UV¬UV¥UVžUV—UVUV‰UV‚UV{UVtUVmUVfUV_UVXUVQUVJUVCUVQV7QV0QV)QV"QVQVQV QVQVÿPVøPVñPVêPVãPVÜPVÕPVÎPVÇPVÀPV¹PV²PV«PV¤PVPV–PVPVˆPVPVzPVsPVlPVePV^PVWPVPPVIPVBPV;PV4PV-PV&PVPVPVPV PVPVüOVõOVîOVçOVàOVÙOVÒOVËOVÄOV½OV¶OV¯OV¨OV¡OVšOV“OVŒOV…OV~OVwOVpOViOVbOV[OVTOVMOVFOV?OV8OV1OV*OV#OVOVOVOVOVOVùNVòNVëNVäNVÝNVÖNVÏNVÈNVÁNVºNV³NV¬NV¥NVžNV—NVNV‰NV‚NV{NVtNVmNVfNV_NVXNVQNVJNVCNVJV7JV0JV)JV"JVJVJV JVJVÿIVøIVñIVêIVãIVÜIVÕIVÎIVÇIVÀIV¹IV²IV«IV¤IVIV–IVIVˆIVIVzIVsIVlIVeIV^IVWIVPIVIIVBIV;IV4IV-IV&IVIVIVIV IVIVüHVõHVîHVçHVàHVÙHVÒHVËHVÄHV½HV¶HV¯HV¨HV¡HVšHV“HVŒHV…HV~HVwHVpHViHVbHV[HVTHVMHVFHV?HV8HV1HV*HV#HVHVHVHVHVHVùGVòGVëGVäGVÝGVÖGVÏGVÈGVÁGVºGV³GV¬GV¥GVžGV—GVGV‰GV‚GV{GVtGVmGVfGV_GVXGVQGVJGVCGVCV7CV0CV)CV"CVCVCV CVCVÿBVøBVñBVêBVãBVÜBVÕBVÎBVÇBVÀBV¹BV²BV«BV¤BVBV–BVBVˆBVBVzBVsBVlBVeBV^BVWBVPBVIBVBBV;BV4BV-BV&BVBVBVBV BVBVüAVõAVîAVçAVàAVÙAVÒAVËAVÄAV½AV¶AV¯AV¨AV¡AVšAV“AVŒAV…AV~AVwAVpAViAVbAV[AVTAVMAVFAV?AV8AV1AV*AV#AVAVAVAVAVAVù@Vò@Vë@Vä@VÝ@VÖ@VÏ@VÈ@VÁ@Vº@V³@V¬@V¥@Vž@V—@V@V‰@V‚@V{@Vt@Vm@Vf@V_@VX@VQ@VJ@VC@V<@V5@V.@V'@V @V@V@V @V@Vý?Vö?Vï?Vè?Vá?VÚ?VÓ?VÌ?VÅ?V¾?V·?V°?V©?V¢?V›?V”?V?V†?V?Vx?Vq?Vj?Vc?V\?VU?VN?VG?V@?V9?V2?V+?V$?V?V?V?V?V?Vú>Vó>Vì>Vå>VÞ>V×>VÐ>VÉ>VÂ>V»>V´>V­>V¦>VŸ>V˜>V‘>VŠ>Vƒ>V|>Vu>Vn>Vg>V`>VY>VR>VK>VD>V=>V6>V/>V(>V!>V>V>V >V>Vþ=V÷=Vð=Vé=Vâ=VÛ=VÔ=VÍ=VÆ=V¿=V¸=V±=Vª=V£=Vœ=V•=VŽ=V‡=V€=Vy=Vr=Vk=Vd=V]=VV=VO=VH=VA=V:=V3=V,=V%=V=V=V=V =V=Vû5V75V05V)5V"5V5V5V 5V5Vÿ4Vø4Vñ4Vê4Vã4VÜ4VÕ4VÎ4VÇ4VÀ4V¹4V²4V«4V¤4V4V–4V4Vˆ4V4Vz4Vs4Vl4Ve4V^4VW4VP4VI4VB4V;4V44V-4V&4V4V4V4V 4V4Vü3Võ3Vî3Vç3Và3VÙ3VÒ3VË3VÄ3V½3V¶3V¯3V¨3V¡3Vš3V“3VŒ3V…3V~3Vw3Vp3Vi3Vb3V[3VT3VM3VF3V?3V83V13V*3V#3V3V3V3V3V3Vù2Vò2Vë2Vä2VÝ2VÖ2VÏ2VÈ2VÁ2Vº2V³2V¬2V¥2Vž2V—2V2V‰2V‚2V{2Vt2Vm2Vf2V_2VX2VQ2VJ2VC2V<2V52V.2V'2V 2V2V2V 2V2Vý1Vö1Vï1Vè1Vá1VÚ1VÓ1VÌ1VÅ1V¾1V·1V°1V©1V¢1V›1V”1V1V†1V1Vx1Vq1Vj1Vc1V\1VU1VN1VG1V@1V91V21V+1V$1V1V1V1V1V1Vú0Vó0Vì0Vå0VÞ0V×0VÐ0VÉ0VÂ0V»0V´0V­0V¦0VŸ0V˜0V‘0VŠ0Vƒ0V|0Vu0Vn0Vg0V`0VY0VR0VK0VD0V=0V60V/0V(0V!0V0V0V 0V0Vþ/V÷/Vð/Vé/Vâ/VÛ/VÔ/VÍ/VÆ/V¿/V¸/V±/Vª/V£/Vœ/V•/VŽ/V‡/V€/Vy/Vr/Vk/Vd/V]/VV/VO/VH/VA/V:/V3/V,/V%/V/V/V/V /V/Vû.Vô.Ví.Væ.Vß.VØ.VÑ.VÊ.VÃ.V¼.Vµ.V®.V§.V .V™.V’.V‹.V„.V}.Vv.Vo.Vh.Va.VZ.VS.VL.VE.V>.V7.V0.V).V".V.V.V .V.Vÿ-Vø-Vñ-Vê-Vã-VÜ-VÕ-VÎ-VÇ-VÀ-V¹-V²-V«-V¤-V-V–-V-Vˆ-V-Vz-Vs-Vl-Ve-V^-VW-VP-VI-VB-V;-V4-V--V&-V-V-V-V -V-Vü,Võ,Vî,Vç,Và,VÙ,VÒ,VË,VÄ,V½,V¶,V¯,V¨,V¡,Vš,V“,VŒ,V…,V~,Vw,Vp,Vi,Vb,V[,VT,VM,VF,V?,V8,V1,V*,V#,V,V,V,V,V,Vù+Vò+Vë+Vä+VÝ+VÖ+VÏ+VÈ+VÁ+Vº+V³+V¬+V¥+Vž+V—+V+V‰+V‚+V{+Vt+Vm+Vf+V_+VX+VQ+VJ+VC+V<+V5+V.+V'+V +V+V+V +V+Vý*Vö*Vï*Vè*Vá*VÚ*VÓ*VÌ*VÅ*V¾*V·*V°*V©*V¢*V›*V”*V*V†*V*Vx*Vq*Vj*Vc*V\*VU*VN*VG*V@*V9*V2*V+*V$*V*V*V*V*V*Vú)Vó)Vì)Vå)VÞ)V×)VÐ)VÉ)VÂ)V»)V´)V­)V¦)VŸ)V˜)V‘)VŠ)Vƒ)V|)Vu)Vn)Vg)V`)VY)VR)VK)VD)V=)V6)V/)V()V!)V)V)V )V)Vþ(V÷(Vð(Vé(Vâ(VÛ(VÔ(VÍ(VÆ(V¿(V¸(V±(Vª(V£(Vœ(V•(VŽ(V‡(V€(Vy(Vr(Vk(Vd(V](VV(VO(VH(VA(V:(V3(V,(V%(V(V(V(V (V(Vû'Vô'Ví'Væ'Vß'VØ'VÑ'VÊ'VÃ'V¼'Vµ'V®'V§'V 'V™'V’'V‹'V„'V}'Vv'Vo'Vh'Va'VZ'VS'VL'VE'V>'V7'V0'V)'V"'V'V'V 'V'Vÿ&Vø&Vñ&Vê&Vã&VÜ&VÕ&VÎ&VÇ&VÀ&V¹&V²&V«&V¤&V&V–&V&Vˆ&V&Vz&Vs&Vl&Ve&V^&VW&VP&VI&VB&V;&V4&V-&V&&V&V&V&V &V&Vü%Võ%Vî%Vç%Và%VÙ%VÒ%VË%VÄ%V½%V¶%V¯%V¨%V¡%Vš%V“%VŒ%V…%V~%Vw%Vp%Vi%Vb%V[%VT%VM%VF%V?%V8%V1%V*%V#%V%V%V%V%V%Vù$Vò$Vë$Vä$VÝ$VÖ$VÏ$VÈ$VÁ$Vº$V³$V¬$V¥$Vž$V—$V$V‰$V‚$V{$Vt$Vm$Vf$V_$VX$VQ$VJ$VC$V<$V5$V.$V'$V $V$V$V $V$Vý#Vö#Vï#Vè#Vá#VÚ#VÓ#VÌ#VÅ#V¾#V·#V°#V©#V¢#V›#V”#V#V†#V#Vx#Vq#Vj#Vc#V\#VU#VN#VG#V@#V9#V2#V+#V$#V#V#V#V#V#Vú"Vó"Vì"Vå"VÞ"V×"VÐ"VÉ"VÂ"V»"V´"V­"V¦"VŸ"V˜"V‘"VŠ"Vƒ"V|"Vu"Vn"Vg"V`"VY"VR"VK"VD"V="V6"V/"V("V!"V"V"V "V"Vþ!V÷!Vð!Vé!Vâ!VÛ!VÔ!VÍ!VÆ!V¿!V¸!V±!Vª!V£!Vœ!V•!VŽ!V‡!V€!Vy!Vr!Vk!Vd!V]!VV!VO!VH!VA!V:!V3!V,!V%!V!V!V!V !V!Vû Vô Ví Væ Vß VØ VÑ VÊ Và V¼ Vµ V® V§ V  V™ V’ V‹ V„ V} Vv Vo Vh Va VZ VS VL VE V> V7 V0 V) V" V V V V VÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVýVöVïVèVáVÚVÓVÌVÅV¾V·V°V©V¢V›V”VV†VVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVúVóVìVåVÞV×VÐVÉVÂV»V´V­V¦VŸV˜V‘VŠVƒV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVþV÷VðVéVâVÛVÔVÍVÆV¿V¸V±VªV£VœV•VŽV‡V€VyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVûVôVíVæVßVØVÑVÊVÃV¼VµV®V§V V™V’V‹V„V}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVýVöVïVèVáVÚVÓVÌVÅV¾V·V°V©V¢V›V”VV†VVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVúVóVìVåVÞV×VÐVÉVÂV»V´V­V¦VŸV˜V‘VŠVƒV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVþV÷VðVéVâVÛVÔVÍVÆV¿V¸V±VªV£VœV•VŽV‡V€VyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVûVôVíVæVßVØVÑVÊVÃV¼VµV®V§V V™V’V‹V„V}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVýVöVïVèVáVÚVÓVÌVÅV¾V·V°V©V¢V›V”VV†VVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVú Vó Vì Vå VÞ V× VÐ VÉ V V» V´ V­ V¦ VŸ V˜ V‘ VŠ Vƒ V| Vu Vn Vg V` VY VR VK VD V= V6 V/ V( V! V V V V Vþ V÷ Vð Vé Vâ VÛ VÔ VÍ VÆ V¿ V¸ V± Vª V£ Vœ V• VŽ V‡ V€ Vy Vr Vk Vd V] VV VO VH VA V: V3 V, V% V V V V V Vû Vô Ví Væ Vß VØ VÑ VÊ Và V¼ Vµ V® V§ V  V™ V’ V‹ V„ V} Vv Vo Vh Va VZ VS VL VE V> V7 V0 V) V" V V V V Vÿ Vø Vñ Vê Vã VÜ VÕ VÎ VÇ VÀ V¹ V² V« V¤ V V– V Vˆ V Vz Vs Vl Ve V^ VW VP VI VB V; V4 V- V& V V V V V Vü Võ Vî Vç Và VÙ VÒ VË VÄ V½ V¶ V¯ V¨ V¡ Vš V“ VŒ V… V~ Vw Vp Vi Vb V[ VT VM VF V? V8 V1 V* V# V V V V V VùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVýVöVïVèVáVÚVÓVÌVÅV¾V·V°V©V¢V›V”VV†VVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVúVóVìVåVÞV×VÐVÉVÂV»V´V­V¦VŸV˜V‘VŠVƒV|VuVnVgV`VYVRVKVDV=V6V/V(V!VVV VVþV÷VðVéVâVÛVÔVÍVÆV¿V¸V±VªV£VœV•VŽV‡V€VyVrVkVdV]VVVOVHVAV:V3V,V%VVVV VVûVôVíVæVßVØVÑVÊVÃV¼VµV®V§V V™V’V‹V„V}VvVoVhVaVZVSVLVEV>V7V0V)V"VVV VVÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCV<V5V.V'V VVV VVýVöVïVèVáVÚVÓVÌVÅV¾V·V°V©V¢V›V”VV†VVxVqVjVcV\VUVNVGV@V9V2V+V$VVVVVVúÿUóÿUìÿUåÿUÞÿU×ÿUÐÿUÉÿUÂÿU»ÿU´ÿU­ÿU¦ÿUŸÿU˜ÿU‘ÿUŠÿUƒÿU|ÿUuÿUnÿUgÿU`ÿUYÿURÿUKÿUDÿU=ÿU6ÿU/ÿU(ÿU!ÿUÿUÿU ÿUÿUþþU÷þUðþUéþUâþUÛþUÔþUÍþUÆþU¿þU¸þU±þUªþU£þUœþU•þUŽþU‡þU€þUyþUrþUkþUdþU]þUVþUOþUHþUAþU:þU3þU,þU%þUþUþUþU þUþUûýUôýUíýUæýUßýUØýUÑýUÊýUÃýU¼ýUµýU®ýU§ýU ýU™ýU’ýU‹ýU„ýU}ýUvýUoýUhýUaýUZýUSýULýUEýU>ýU7ýU0ýU)ýU"ýUýUýU ýUýUÿüUøüUñüUêüUãüUÜüUÕüUÎüUÇüUÀüU¹üU²üU«üU¤üUüU–üUüUˆüUüUzüUsüUlüUeüU^üUWüUPüUIüUBüU;üU4üU-üU&üUüUüUüU üUüUüûUõûUîûUçûUàûUÙûUÒûUËûUÄûU½ûU¶ûU¯ûU¨ûU¡ûUšûU“ûUŒûU…ûU~ûUwûUpûUiûUbûU[ûUTûUMûUFûU?ûU8ûU1ûU*ûU#ûUûUûUûUûUûUùúUòúUëúUäúUÝúUÖúUÏúUÈúUÁúUºúU³úU¬úU¥úUžúU—úUúU‰úU‚úU{úUtúUmúUfúU_úUXúUQúUJúUCúU<úU5úU.úU'úU úUúUúU úUúUýùUöùUïùUèùUáùUÚùUÓùUÌùUÅùU¾ùU·ùU°ùU©ùU¢ùU›ùU”ùUùU†ùUùUxùUqùUjùUcùU\ùUUùUNùUGùU@ùU9ùU2ùU+ùU$ùUùUùUùUùUùUúøUóøUìøUåøUÞøU×øUÐøUÉøUÂøU»øU´øU­øU¦øUŸøU˜øU‘øUŠøUƒøU|øUuøUnøUgøU`øUYøURøUKøUDøU=øU6øU/øU(øU!øUøUøU øUøUþ÷U÷÷Uð÷Ué÷Uâ÷UÛ÷UÔ÷UÍ÷UÆ÷U¿÷U¸÷U±÷Uª÷U£÷Uœ÷U•÷UŽ÷U‡÷U€÷Uy÷Ur÷Uk÷Ud÷U]÷UV÷UO÷UH÷UA÷U:÷U3÷U,÷U%÷U÷U÷U÷U ÷U÷UûöUôöUíöUæöUßöUØöUÑöUÊöUÃöU¼öUµöU®öU§öU öU™öU’öU‹öU„öU}öUvöUoöUhöUaöUZöUSöULöUEöU>öU7öU0öU)öU"öUöUöU öUöUÿõUøõUñõUêõUãõUÜõUÕõUÎõUÇõUÀõU¹õU²õU«õU¤õUõU–õUõUˆõUõUzõUsõUlõUeõU^õUWõUPõUIõUBõU;õU4õU-õU&õUõUõUõU õUõUüôUõôUîôUçôUàôUÙôUÒôUËôUÄôU½ôU¶ôU¯ôU¨ôU¡ôUšôU“ôUŒôU…ôU~ôUwôUpôUiôUbôU[ôUTôUMôUFôU?ôU8ôU1ôU*ôU#ôUôUôUôUôUôUùóUòóUëóUäóUÝóUÖóUÏóUÈóUÁóUºóU³óU¬óU¥óUžóU—óUóU‰óU‚óU{óUtóUmóUfóU_óUXóUQóUJóUCóU<óU5óU.óU'óU óUóUóU óUóUýòUöòUïòUèòUáòUÚòUÓòUÌòUÅòU¾òU·òU°òU©òU¢òU›òU”òUòU†òUòUxòUqòUjòUcòU\òUUòUNòUGòU@òU9òU2òU+òU$òUòUòUòUòUòUúñUóñUìñUåñUÞñU×ñUÐñUÉñUÂñU»ñU´ñU­ñU¦ñUŸñU˜ñU‘ñUŠñUƒñU|ñUuñUnñUgñU`ñUYñURñUKñUDñU=ñU6ñU/ñU(ñU!ñUñUñU ñUñUþðU÷ðUððUéðUâðUÛðUÔðUÍðUÆðU¿ðU¸ðU±ðUªðU£ðUœðU•ðUŽðU‡ðU€ðUyðUrðUkðUdðU]ðUVðUOðUHðUAðU:ðU3ðU,ðU%ðUðUðUðU ðUðUûïUôïUíïUæïUßïUØïUÑïUÊïUÃïU¼ïUµïU®ïU§ïU ïU™ïU’ïU‹ïU„ïU}ïUvïUoïUhïUaïUZïUSïULïUEïU>ïU7ïU0ïU)ïU"ïUïUïU ïUïUÿîUøîUñîUêîUãîUÜîUÕîUÎîUÇîUÀîU¹îU²îU«îU¤îUîU–îUîUˆîUîUzîUsîUlîUeîU^îUWîUPîUIîUBîU;îU4îU-îU&îUîUîUîU îUîUüíUõíUîíUçíUàíUÙíUÒíUËíUÄíU½íU¶íU¯íU¨íU¡íUšíU“íUŒíU…íU~íUwíUpíUiíUbíU[íUTíUMíUFíU?íU8íU1íU*íU#íUíUíUíUíUíUùìUòìUëìUäìUÝìUÖìUÏìUÈìUÁìUºìU³ìU¬ìU¥ìUžìU—ìUìU‰ìU‚ìU{ìUtìUmìUfìU_ìUXìUQìUJìUCìU<ìU5ìU.ìU'ìU ìUìUìU ìUìUýëUöëUïëUèëUáëUÚëUÓëUÌëUÅëU¾ëU·ëU°ëU©ëU¢ëU›ëU”ëUëU†ëUëUxëUqëUjëUcëU\ëUUëUNëUGëU@ëU9ëU2ëU+ëU$ëUëUëUëUëUëUúêUóêUìêUåêUÞêU×êUÐêUÉêUÂêU»êU´êU­êU¦êUŸêU˜êU‘êUŠêUƒêU|êUuêUnêUgêU`êUYêURêUKêUDêU=êU6êU/êU(êU!êUêUêU êUêUþéU÷éUðéUééUâéUÛéUÔéUÍéUÆéU¿éU¸éU±éUªéU£éUœéU•éUŽéU‡éU€éUyéUréUkéUdéU]éUVéUOéUHéUAéU:éU3éU,éU%éUéUéUéU éUéUûèUôèUíèUæèUßèUØèUÑèUÊèUÃèU¼èUµèU®èU§èU èU™èU’èU‹èU„èU}èUvèUoèUhèUaèUZèUSèULèUEèU>èU7èU0èU)èU"èUèUèU èUèUÿçUøçUñçUêçUãçUÜçUÕçUÎçUÇçUÀçU¹çU²çU«çU¤çUçU–çUçUˆçUçUzçUsçUlçUeçU^çUWçUPçUIçUBçU;çU4çU-çU&çUçUçUçU çUçUüæUõæUîæUçæUàæUÙæUÒæUËæUÄæU½æU¶æU¯æU¨æU¡æUšæU“æUŒæU…æU~æUwæUpæUiæUbæU[æUTæUMæUFæU?æU8æU1æU*æU#æUæUæUæUæUæUùåUòåUëåUäåUÝåUÖåUÏåUÈåUÁåUºåU³åU¬åU¥åUžåU—åUåU‰åU‚åU{åUtåUmåUfåU_åUXåUQåUJåUCåU<åU5åU.åU'åU åUåUåU åUåUýäUöäUïäUèäUáäUÚäUÓäUÌäUÅäU¾äU·äU°äU©äU¢äU›äU”äUäU†äUäUxäUqäUjäUcäU\äUUäUNäUGäU@äU9äU2äU+äU$äUäUäUäUäUäUúãUóãUìãUåãUÞãU×ãUÐãUÉãUÂãU»ãU´ãU­ãU¦ãUŸãU˜ãU‘ãUŠãUƒãU|ãUuãUnãUgãU`ãUYãURãUKãUDãU=ãU6ãU/ãU(ãU!ãUãUãU ãUãUþâU÷âUðâUéâUââUÛâUÔâUÍâUÆâU¿âU¸âU±âUªâU£âUœâU•âUŽâU‡âU€âUyâUrâUkâUdâU]âUVâUOâUHâUAâU:âU3âU,âU%âUâUâUâU âUâUûáUôáUíáUæáUßáUØáUÑáUÊáUÃáU¼áUµáU®áU§áU áU™áU’áU‹áU„áU}áUváUoáUháUaáUZáUSáULáUEáU>áU7áU0áU)áU"áUáUáU áUáUÿàUøàUñàUêàUãàUÜàUÕàUÎàUÇàUÀàU¹àU²àU«àU¤àUàU–àUàUˆàUàUzàUsàUlàUeàU^àUWàUPàUIàUBàU;àU4àU-àU&àUàUàUàU àUàUüßUõßUîßUçßUàßUÙßUÒßUËßUÄßU½ßU¶ßU¯ßU¨ßU¡ßUšßU“ßUŒßU…ßU~ßUwßUpßUißUbßU[ßUTßUMßUFßU?ßU8ßU1ßU*ßU#ßUßUßUßUßUßUùÞUòÞUëÞUäÞUÝÞUÖÞUÏÞUÈÞUÁÞUºÞU³ÞU¬ÞU¥ÞUžÞU—ÞUÞU‰ÞU‚ÞU{ÞUtÞUmÞUfÞU_ÞUXÞUQÞUJÞUCÞU<ÞU5ÞU.ÞU'ÞU ÞUÞUÞU ÞUÞUýÝUöÝUïÝUèÝUáÝUÚÝUÓÝUÌÝUÅÝU¾ÝU·ÝU°ÝU©ÝU¢ÝU›ÝU”ÝUÝU†ÝUÝUxÝUqÝUjÝUcÝU\ÝUUÝUNÝUGÝU@ÝU9ÝU2ÝU+ÝU$ÝUÝUÝUÝUÝUÝUúÜUóÜUìÜUåÜUÞÜU×ÜUÐÜUÉÜUÂÜU»ÜU´ÜU­ÜU¦ÜUŸÜU˜ÜU‘ÜUŠÜUƒÜU|ÜUuÜUnÜUgÜU`ÜUYÜURÜUKÜUDÜU=ÜU6ÜU/ÜU(ÜU!ÜUÜUÜU ÜUÜUþÛU÷ÛUðÛUéÛUâÛUÛÛUÔÛUÍÛUÆÛU¿ÛU¸ÛU±ÛUªÛU£ÛUœÛU•ÛUŽÛU‡ÛU€ÛUyÛUrÛUkÛUdÛU]ÛUVÛUOÛUHÛUAÛU:ÛU3ÛU,ÛU%ÛUÛUÛUÛU ÛUÛUûÚUôÚUíÚUæÚUßÚUØÚUÑÚUÊÚUÃÚU¼ÚUµÚU®ÚU§ÚU ÚU™ÚU’ÚU‹ÚU„ÚU}ÚUvÚUoÚUhÚUaÚUZÚUSÚULÚUEÚU>ÚU7ÚU0ÚU)ÚU"ÚUÚUÚU ÚUÚUÿÙUøÙUñÙUêÙUãÙUÜÙUÕÙUÎÙUÇÙUÀÙU¹ÙU²ÙU«ÙU¤ÙUÙU–ÙUÙUˆÙUÙUzÙUsÙUlÙUeÙU^ÙUWÙUPÙUIÙUBÙU;ÙU4ÙU-ÙU&ÙUÙUÙUÙU ÙUÙUüØUõØUîØUçØUàØUÙØUÒØUËØUÄØU½ØU¶ØU¯ØU¨ØU¡ØUšØU“ØUŒØU…ØU~ØUwØUpØUiØUbØU[ØUTØUMØUFØU?ØU8ØU1ØU*ØU#ØUØUØUØUØUØUù×Uò×Uë×Uä×UÝ×UÖ×UÏ×UÈ×UÁ×Uº×U³×U¬×U¥×Už×U—×U×U‰×U‚×U{×Ut×Um×Uf×U_×UX×UQ×UJ×UC×U<×U5×U.×U'×U ×U×U×U ×U×UýÖUöÖUïÖUèÖUáÖUÚÖUÓÖUÌÖUÅÖU¾ÖU·ÖU°ÖU©ÖU¢ÖU›ÖU”ÖUÖU†ÖUÖUxÖUqÖUjÖUcÖU\ÖUUÖUNÖUGÖU@ÖU9ÖU2ÖU+ÖU$ÖUÖUÖUÖUÖUÖUúÕUóÕUìÕUåÕUÞÕU×ÕUÐÕUÉÕUÂÕU»ÕU´ÕU­ÕU¦ÕUŸÕU˜ÕU‘ÕUŠÕUƒÕU|ÕUuÕUnÕUgÕU`ÕUYÕURÕUKÕUDÕU=ÕU6ÕU/ÕU(ÕU!ÕUÕUÕU ÕUÕUþÔU÷ÔUðÔUéÔUâÔUÛÔUÔÔUÍÔUÆÔU¿ÔU¸ÔU±ÔUªÔU£ÔUœÔU•ÔUŽÔU‡ÔU€ÔUyÔUrÔUkÔUdÔU]ÔUVÔUOÔUHÔUAÔU:ÔU3ÔU,ÔU%ÔUÔUÔUÔU ÔUÔUûÓUôÓUíÓUæÓUßÓUØÓUÑÓUÊÓUÃÓU¼ÓUµÓU®ÓU§ÓU ÓU™ÓU’ÓU‹ÓU„ÓU}ÓUvÓUoÓUhÓUaÓUZÓUSÓULÓUEÓU>ÓU7ÓU0ÓU)ÓU"ÓUÓUÓU ÓUÓUÿÒUøÒUñÒUêÒUãÒUÜÒUÕÒUÎÒUÇÒUÀÒU¹ÒU²ÒU«ÒU¤ÒUÒU–ÒUÒUˆÒUÒUzÒUsÒUlÒUeÒU^ÒUWÒUPÒUIÒUBÒU;ÒU4ÒU-ÒU&ÒUÒUÒUÒU ÒUÒUüÑUõÑUîÑUçÑUàÑUÙÑUÒÑUËÑUÄÑU½ÑU¶ÑU¯ÑU¨ÑU¡ÑUšÑU“ÑUŒÑU…ÑU~ÑUwÑUpÑUiÑUbÑU[ÑUTÑUMÑUFÑU?ÑU8ÑU1ÑU*ÑU#ÑUÑUÑUÑUÑUÑUùÐUòÐUëÐUäÐUÝÐUÖÐUÏÐUÈÐUÁÐUºÐU³ÐU¬ÐU¥ÐUžÐU—ÐUÐU‰ÐU‚ÐU{ÐUtÐUmÐUfÐU_ÐUXÐUQÐUJÐUCÐU<ÐU5ÐU.ÐU'ÐU ÐUÐUÐU ÐUÐUýÏUöÏUïÏUèÏUáÏUÚÏUÓÏUÌÏUÅÏU¾ÏU·ÏU°ÏU©ÏU¢ÏU›ÏU”ÏUÏU†ÏUÏUxÏUqÏUjÏUcÏU\ÏUUÏUNÏUGÏU@ÏU9ÏU2ÏU+ÏU$ÏUÏUÏUÏUÏUÏUúÎUóÎUìÎUåÎUÞÎU×ÎUÐÎUÉÎUÂÎU»ÎU´ÎU­ÎU¦ÎUŸÎU˜ÎU‘ÎUŠÎUƒÎU|ÎUuÎUnÎUgÎU`ÎUYÎURÎUKÎUDÎU=ÎU6ÎU/ÎU(ÎU!ÎUÎUÎU ÎUÎUþÍU÷ÍUðÍUéÍUâÍUÛÍUÔÍUÍÍUÆÍU¿ÍU¸ÍU±ÍUªÍU£ÍUœÍU•ÍUŽÍU‡ÍU€ÍUyÍUrÍUkÍUdÍU]ÍUVÍUOÍUHÍUAÍU:ÍU3ÍU,ÍU%ÍUÍUÍUÍU ÍUÍUûÌUôÌUíÌUæÌUßÌUØÌUÑÌUÊÌUÃÌU¼ÌUµÌU®ÌU§ÌU ÌU™ÌU’ÌU‹ÌU„ÌU}ÌUvÌUoÌUhÌUaÌUZÌUSÌULÌUEÌU>ÌU7ÌU0ÌU)ÌU"ÌUÌUÌU ÌUÌUÿËUøËUñËUêËUãËUÜËUÕËUÎËUÇËUÀËU¹ËU²ËU«ËU¤ËUËU–ËUËUˆËUËUzËUsËUlËUeËU^ËUWËUPËUIËUBËU;ËU4ËU-ËU&ËUËUËUËU ËUËUüÊUõÊUîÊUçÊUàÊUÙÊUÒÊUËÊUÄÊU½ÊU¶ÊU¯ÊU¨ÊU¡ÊUšÊU“ÊUŒÊU…ÊU~ÊUwÊUpÊUiÊUbÊU[ÊUTÊUMÊUFÊU?ÊU8ÊU1ÊU*ÊU#ÊUÊUÊUÊUÊUÊUùÉUòÉUëÉUäÉUÝÉUÖÉUÏÉUÈÉUÁÉUºÉU³ÉU¬ÉU¥ÉUžÉU—ÉUÉU‰ÉU‚ÉU{ÉUtÉUmÉUfÉU_ÉUXÉUQÉUJÉUCÉU<ÉU5ÉU.ÉU'ÉU ÉUÉUÉU ÉUÉUýÈUöÈUïÈUèÈUáÈUÚÈUÓÈUÌÈUÅÈU¾ÈU·ÈU°ÈU©ÈU¢ÈU›ÈU”ÈUÈU†ÈUÈUxÈUqÈUjÈUcÈU\ÈUUÈUNÈUGÈU@ÈU9ÈU2ÈU+ÈU$ÈUÈUÈUÈUÈUÈUúÇUóÇUìÇUåÇUÞÇU×ÇUÐÇUÉÇUÂÇU»ÇU´ÇU­ÇU¦ÇUŸÇU˜ÇU‘ÇUŠÇUƒÇU|ÇUuÇUnÇUgÇU`ÇUYÇURÇUKÇUDÇU=ÇU6ÇU/ÇU(ÇU!ÇUÇUÇU ÇUÇUþÆU÷ÆUðÆUéÆUâÆUÛÆUÔÆUÍÆUÆÆU¿ÆU¸ÆU±ÆUªÆU£ÆUœÆU•ÆUŽÆU‡ÆU€ÆUyÆUrÆUkÆUdÆU]ÆUVÆUOÆUHÆUAÆU:ÆU3ÆU,ÆU%ÆUÆUÆUÆU ÆUÆUûÅUôÅUíÅUæÅUßÅUØÅUÑÅUÊÅUÃÅU¼ÅUµÅU®ÅU§ÅU ÅU™ÅU’ÅU‹ÅU„ÅU}ÅUvÅUoÅUhÅUaÅUZÅUSÅULÅUEÅU>ÅU7ÅU0ÅU)ÅU"ÅUÅUÅU ÅUÅUÿÄUøÄUñÄUêÄUãÄUÜÄUÕÄUÎÄUÇÄUÀÄU¹ÄU²ÄU«ÄU¤ÄUÄU–ÄUÄUˆÄUÄUzÄUsÄUlÄUeÄU^ÄUWÄUPÄUIÄUBÄU;ÄU4ÄU-ÄU&ÄUÄUÄUÄU ÄUÄUüÃUõÃUîÃUçÃUàÃUÙÃUÒÃUËÃUÄÃU½ÃU¶ÃU¯ÃU¨ÃU¡ÃUšÃU“ÃUŒÃU…ÃU~ÃUwÃUpÃUiÃUbÃU[ÃUTÃUMÃUFÃU?ÃU8ÃU1ÃU*ÃU#ÃUÃUÃUÃUÃUÃUùÂUòÂUëÂUäÂUÝÂUÖÂUÏÂUÈÂUÁÂUºÂU³ÂU¬ÂU¥ÂUžÂU—ÂUÂU‰ÂU‚ÂU{ÂUtÂUmÂUfÂU_ÂUXÂUQÂUJÂUCÂU<ÂU5ÂU.ÂU'ÂU ÂUÂUÂU ÂUÂUýÁUöÁUïÁUèÁUáÁUÚÁUÓÁUÌÁUÅÁU¾ÁU·ÁU°ÁU©ÁU¢ÁU›ÁU”ÁUÁU†ÁUÁUxÁUqÁUjÁUcÁU\ÁUUÁUNÁUGÁU@ÁU9ÁU2ÁU+ÁU$ÁUÁUÁUÁUÁUÁUúÀUóÀUìÀUåÀUÞÀU×ÀUÐÀUÉÀUÂÀU»ÀU´ÀU­ÀU¦ÀUŸÀU˜ÀU‘ÀUŠÀUƒÀU|ÀUuÀUnÀUgÀU`ÀUYÀURÀUKÀUDÀU=ÀU6ÀU/ÀU(ÀU!ÀUÀUÀU ÀUÀUþ¿U÷¿Uð¿Ué¿Uâ¿UÛ¿UÔ¿UÍ¿UÆ¿U¿¿U¸¿U±¿Uª¿U£¿Uœ¿U•¿UŽ¿U‡¿U€¿Uy¿Ur¿Uk¿Ud¿U]¿UV¿UO¿UH¿UA¿U:¿U3¿U,¿U%¿U¿U¿U¿U ¿U¿Uû¾Uô¾Uí¾Uæ¾Uß¾UؾUѾUʾUþU¼¾Uµ¾U®¾U§¾U ¾U™¾U’¾U‹¾U„¾U}¾Uv¾Uo¾Uh¾Ua¾UZ¾US¾UL¾UE¾U>¾U7¾U0¾U)¾U"¾U¾U¾U ¾U¾Uÿ½Uø½Uñ½Uê½Uã½UܽUÕ½UνUǽUÀ½U¹½U²½U«½U¤½U½U–½U½Uˆ½U½Uz½Us½Ul½Ue½U^½UW½UP½UI½UB½U;½U4½U-½U&½U½U½U½U ½U½Uü¼Uõ¼Uî¼Uç¼Uà¼UÙ¼UÒ¼U˼UļU½¼U¶¼U¯¼U¨¼U¡¼Uš¼U“¼UŒ¼U…¼U~¼Uw¼Up¼Ui¼Ub¼U[¼UT¼UM¼UF¼U?¼U8¼U1¼U*¼U#¼U¼U¼U¼U¼U¼Uù»Uò»Uë»Uä»UÝ»UÖ»UÏ»UÈ»UÁ»Uº»U³»U¬»U¥»Už»U—»U»U‰»U‚»U{»Ut»Um»Uf»U_»UX»UQ»UJ»UC»U<»U5»U.»U'»U »U»U»U »U»UýºUöºUïºUèºUáºUÚºUÓºU̺UźU¾ºU·ºU°ºU©ºU¢ºU›ºU”ºUºU†ºUºUxºUqºUjºUcºU\ºUUºUNºUGºU@ºU9ºU2ºU+ºU$ºUºUºUºUºUºUú¹Uó¹Uì¹Uå¹UÞ¹U×¹UйUɹU¹U»¹U´¹U­¹U¦¹UŸ¹U˜¹U‘¹UйUƒ¹U|¹Uu¹Un¹Ug¹U`¹UY¹UR¹UK¹UD¹U=¹U6¹U/¹U(¹U!¹U¹U¹U ¹U¹Uþ¸U÷¸Uð¸Ué¸Uâ¸UÛ¸UÔ¸U͸UƸU¿¸U¸¸U±¸Uª¸U£¸Uœ¸U•¸UޏU‡¸U€¸Uy¸Ur¸Uk¸Ud¸U]¸UV¸UO¸UH¸UA¸U:¸U3¸U,¸U%¸U¸U¸U¸U ¸U¸Uû·Uô·Uí·Uæ·Uß·UØ·UÑ·UÊ·U÷U¼·Uµ·U®·U§·U ·U™·U’·U‹·U„·U}·Uv·Uo·Uh·Ua·UZ·US·UL·UE·U>·U7·U0·U)·U"·U·U·U ·U·Uÿ¶Uø¶Uñ¶Uê¶Uã¶UܶUÕ¶UζUǶUÀ¶U¹¶U²¶U«¶U¤¶U¶U–¶U¶Uˆ¶U¶Uz¶Us¶Ul¶Ue¶U^¶UW¶UP¶UI¶UB¶U;¶U4¶U-¶U&¶U¶U¶U¶U ¶U¶UüµUõµUîµUçµUàµUÙµUÒµU˵UĵU½µU¶µU¯µU¨µU¡µUšµU“µUŒµU…µU~µUwµUpµUiµUbµU[µUTµUMµUFµU?µU8µU1µU*µU#µUµUµUµUµUµUù´Uò´Uë´Uä´UÝ´UÖ´UÏ´UÈ´UÁ´Uº´U³´U¬´U¥´Už´U—´U´U‰´U‚´U{´Ut´Um´Uf´U_´UX´UQ´UJ´UC´U<´U5´U.´U'´U ´U´U´U ´U´Uý³Uö³Uï³Uè³Uá³UÚ³UÓ³U̳UųU¾³U·³U°³U©³U¢³U›³U”³U³U†³U³Ux³Uq³Uj³Uc³U\³UU³UN³UG³U@³U9³U2³U+³U$³U³U³U³U³U³Uú²Uó²Uì²Uå²UÞ²UײUвUɲU²U»²U´²U­²U¦²UŸ²U˜²U‘²UвUƒ²U|²Uu²Un²Ug²U`²UY²UR²UK²UD²U=²U6²U/²U(²U!²U²U²U ²U²Uþ±U÷±Uð±Ué±Uâ±UÛ±UÔ±UͱUƱU¿±U¸±U±±Uª±U£±Uœ±U•±UޱU‡±U€±Uy±Ur±Uk±Ud±U]±UV±UO±UH±UA±U:±U3±U,±U%±U±U±U±U ±U±Uû°Uô°Uí°Uæ°Uß°UذUѰUʰUðU¼°Uµ°U®°U§°U °U™°U’°U‹°U„°U}°Uv°Uo°Uh°Ua°UZ°US°UL°UE°U>°U7°U0°U)°U"°U°U°U °U°Uÿ¯Uø¯Uñ¯Uê¯Uã¯UܯUÕ¯UίUǯUÀ¯U¹¯U²¯U«¯U¤¯U¯U–¯U¯Uˆ¯U¯Uz¯Us¯Ul¯Ue¯U^¯UW¯UP¯UI¯UB¯U;¯U4¯U-¯U&¯U¯U¯U¯U ¯U¯Uü®Uõ®Uî®Uç®Uà®UÙ®UÒ®UË®UÄ®U½®U¶®U¯®U¨®U¡®Uš®U“®UŒ®U…®U~®Uw®Up®Ui®Ub®U[®UT®UM®UF®U?®U8®U1®U*®U#®U®U®U®U®U®Uù­Uò­Uë­Uä­UÝ­UÖ­UÏ­UÈ­UÁ­Uº­U³­U¬­U¥­Už­U—­U­U‰­U‚­U{­Ut­Um­Uf­U_­UX­UQ­UJ­UC­U<­U5­U.­U'­U ­U­U­U ­U­Uý¬Uö¬Uï¬Uè¬Uá¬UÚ¬UÓ¬U̬UŬU¾¬U·¬U°¬U©¬U¢¬U›¬U”¬U¬U†¬U¬Ux¬Uq¬Uj¬Uc¬U\¬UU¬UN¬UG¬U@¬U9¬U2¬U+¬U$¬U¬U¬U¬U¬U¬Uú«Uó«Uì«Uå«UÞ«U׫UЫUÉ«U«U»«U´«U­«U¦«UŸ«U˜«U‘«UŠ«Uƒ«U|«Uu«Un«Ug«U`«UY«UR«UK«UD«U=«U6«U/«U(«U!«U«U«U «U«UþªU÷ªUðªUéªUâªUÛªUÔªUͪUƪU¿ªU¸ªU±ªUªªU£ªUœªU•ªUŽªU‡ªU€ªUyªUrªUkªUdªU]ªUVªUOªUHªUAªU:ªU3ªU,ªU%ªUªUªUªU ªUªUû©Uô©Uí©Uæ©Uß©UØ©UÑ©UÊ©UéU¼©Uµ©U®©U§©U ©U™©U’©U‹©U„©U}©Uv©Uo©Uh©Ua©UZ©US©UL©UE©U>©U7©U0©U)©U"©U©U©U ©U©Uÿ¨Uø¨Uñ¨Uê¨Uã¨UܨUÕ¨UΨUǨUÀ¨U¹¨U²¨U«¨U¤¨U¨U–¨U¨Uˆ¨U¨Uz¨Us¨Ul¨Ue¨U^¨UW¨UP¨UI¨UB¨U;¨U4¨U-¨U&¨U¨U¨U¨U ¨U¨Uü§Uõ§Uî§Uç§Uà§UÙ§UÒ§U˧UħU½§U¶§U¯§U¨§U¡§Uš§U“§UŒ§U…§U~§Uw§Up§Ui§Ub§U[§UT§UM§UF§U?§U8§U1§U*§U#§U§U§U§U§U§Uù¦Uò¦Uë¦Uä¦UݦUÖ¦UϦUȦUÁ¦Uº¦U³¦U¬¦U¥¦Už¦U—¦U¦U‰¦U‚¦U{¦Ut¦Um¦Uf¦U_¦UX¦UQ¦UJ¦UC¦U<¦U5¦U.¦U'¦U ¦U¦U¦U ¦U¦Uý¥Uö¥Uï¥Uè¥Uá¥UÚ¥UÓ¥UÌ¥UÅ¥U¾¥U·¥U°¥U©¥U¢¥U›¥U”¥U¥U†¥U¥Ux¥Uq¥Uj¥Uc¥U\¥UU¥UN¥UG¥U@¥U9¥U2¥U+¥U$¥U¥U¥U¥U¥U¥Uú¤Uó¤Uì¤Uå¤UÞ¤UפUФUɤU¤U»¤U´¤U­¤U¦¤UŸ¤U˜¤U‘¤UФUƒ¤U|¤Uu¤Un¤Ug¤U`¤UY¤UR¤UK¤UD¤U=¤U6¤U/¤U(¤U!¤U¤U¤U ¤U¤Uþ£U÷£Uð£Ué£Uâ£UÛ£UÔ£UÍ£UÆ£U¿£U¸£U±£Uª£U££Uœ£U•£UŽ£U‡£U€£Uy£Ur£Uk£Ud£U]£UV£UO£UH£UA£U:£U3£U,£U%£U£U£U£U £U£Uû¢Uô¢Uí¢Uæ¢UߢUØ¢UÑ¢UÊ¢UâU¼¢Uµ¢U®¢U§¢U ¢U™¢U’¢U‹¢U„¢U}¢Uv¢Uo¢Uh¢Ua¢UZ¢US¢UL¢UE¢U>¢U7¢U0¢U)¢U"¢U¢U¢U ¢U¢Uÿ¡Uø¡Uñ¡Uê¡Uã¡UÜ¡UÕ¡UΡUÇ¡UÀ¡U¹¡U²¡U«¡U¤¡U¡U–¡U¡Uˆ¡U¡Uz¡Us¡Ul¡Ue¡U^¡UW¡UP¡UI¡UB¡U;¡U4¡U-¡U&¡U¡U¡U¡U ¡U¡Uü Uõ Uî Uç Uà UÙ UÒ UË UÄ U½ U¶ U¯ U¨ U¡ Uš U“ UŒ U… U~ Uw Up Ui Ub U[ UT UM UF U? U8 U1 U* U# U U U U U UùŸUòŸUëŸUäŸUÝŸUÖŸUÏŸUÈŸUÁŸUºŸU³ŸU¬ŸU¥ŸUžŸU—ŸUŸU‰ŸU‚ŸU{ŸUtŸUmŸUfŸU_ŸUXŸUQŸUJŸUCŸU<ŸU5ŸU.ŸU'ŸU ŸUŸUŸU ŸUŸUýžUöžUïžUèžUážUÚžUÓžUÌžUÅžU¾žU·žU°žU©žU¢žU›žU”žUžU†žUžUxžUqžUjžUcžU\žUUžUNžUGžU@žU9žU2žU+žU$žUžUžUžUžUžUúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþœU÷œUðœUéœUâœUÛœUÔœUÍœUÆœU¿œU¸œU±œUªœU£œUœœU•œUŽœU‡œU€œUyœUrœUkœUdœU]œUVœUOœUHœUAœU:œU3œU,œU%œUœUœUœU œUœUû›Uô›Uí›Uæ›Uß›UØ›UÑ›UÊ›UÛU¼›Uµ›U®›U§›U ›U™›U’›U‹›U„›U}›Uv›Uo›Uh›Ua›UZ›US›UL›UE›U>›U7›U0›U)›U"›U›U›U ›U›UÿšUøšUñšUêšUãšUÜšUÕšUΚUÇšUÀšU¹šU²šU«šU¤šUšU–šUšUˆšUšUzšUsšUlšUešU^šUWšUPšUIšUBšU;šU4šU-šU&šUšUšUšU šUšUü™Uõ™Uî™Uç™Uà™UÙ™UÒ™UË™UÄ™U½™U¶™U¯™U¨™U¡™Uš™U“™UŒ™U…™U~™Uw™Up™Ui™Ub™U[™UT™UM™UF™U?™U8™U1™U*™U#™U™U™U™U™U™Uù˜Uò˜Uë˜Uä˜UݘUÖ˜UϘUȘUÁ˜Uº˜U³˜U¬˜U¥˜Už˜U—˜U˜U‰˜U‚˜U{˜Ut˜Um˜Uf˜U_˜UX˜UQ˜UJ˜UC˜U<˜U5˜U.˜U'˜U ˜U˜U˜U ˜U˜Uý—Uö—Uï—Uè—Uá—UÚ—UÓ—UÌ—UÅ—U¾—U·—U°—U©—U¢—U›—U”—U—U†—U—Ux—Uq—Uj—Uc—U\—UU—UN—UG—U@—U9—U2—U+—U$—U—U—U—U—U—Uú–Uó–Uì–Uå–UÞ–U×–UЖUÉ–U–U»–U´–U­–U¦–UŸ–U˜–U‘–UŠ–Uƒ–U|–Uu–Un–Ug–U`–UY–UR–UK–UD–U=–U6–U/–U(–U!–U–U–U –U–Uþ•U÷•Uð•Ué•Uâ•UÛ•UÔ•UÍ•UÆ•U¿•U¸•U±•Uª•U£•Uœ•U••UŽ•U‡•U€•Uy•Ur•Uk•Ud•U]•UV•UO•UH•UA•U:•U3•U,•U%•U•U•U•U •U•Uû”Uô”Uí”Uæ”Uß”UØ”UÑ”UÊ”UÔU¼”Uµ”U®”U§”U ”U™”U’”U‹”U„”U}”Uv”Uo”Uh”Ua”UZ”US”UL”UE”U>”U7”U0”U)”U"”U”U”U ”U”Uÿ“Uø“Uñ“Uê“Uã“UÜ“UÕ“UΓUÇ“UÀ“U¹“U²“U«“U¤“U“U–“U“Uˆ“U“Uz“Us“Ul“Ue“U^“UW“UP“UI“UB“U;“U4“U-“U&“U“U“U“U “U“Uü’Uõ’Uî’Uç’Uà’UÙ’UÒ’UË’UÄ’U½’U¶’U¯’U¨’U¡’Uš’U“’UŒ’U…’U~’Uw’Up’Ui’Ub’U[’UT’UM’UF’U?’U8’U1’U*’U#’U’U’U’U’U’Uù‘Uò‘Uë‘Uä‘UÝ‘UÖ‘UÏ‘UÈ‘UÁ‘Uº‘U³‘U¬‘U¥‘Už‘U—‘U‘U‰‘U‚‘U{‘Ut‘Um‘Uf‘U_‘UX‘UQ‘UJ‘UC‘U<‘U5‘U.‘U'‘U ‘U‘U‘U ‘U‘UýUöUïUèUáUÚUÓUÌUÅU¾U·U°U©U¢U›U”UU†UUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþŽU÷ŽUðŽUéŽUâŽUÛŽUÔŽUÍŽUÆŽU¿ŽU¸ŽU±ŽUªŽU£ŽUœŽU•ŽUŽŽU‡ŽU€ŽUyŽUrŽUkŽUdŽU]ŽUVŽUOŽUHŽUAŽU:ŽU3ŽU,ŽU%ŽUŽUŽUŽU ŽUŽUûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿŒUøŒUñŒUêŒUãŒUÜŒUÕŒUÎŒUÇŒUÀŒU¹ŒU²ŒU«ŒU¤ŒUŒU–ŒUŒUˆŒUŒUzŒUsŒUlŒUeŒU^ŒUWŒUPŒUIŒUBŒU;ŒU4ŒU-ŒU&ŒUŒUŒUŒU ŒUŒUü‹Uõ‹Uî‹Uç‹Uà‹UÙ‹UÒ‹UË‹UÄ‹U½‹U¶‹U¯‹U¨‹U¡‹Uš‹U“‹UŒ‹U…‹U~‹Uw‹Up‹Ui‹Ub‹U[‹UT‹UM‹UF‹U?‹U8‹U1‹U*‹U#‹U‹U‹U‹U‹U‹UùŠUòŠUëŠUäŠUÝŠUÖŠUÏŠUÈŠUÁŠUºŠU³ŠU¬ŠU¥ŠUžŠU—ŠUŠU‰ŠU‚ŠU{ŠUtŠUmŠUfŠU_ŠUXŠUQŠUJŠUCŠU<ŠU5ŠU.ŠU'ŠU ŠUŠUŠU ŠUŠUý‰Uö‰Uï‰Uè‰Uá‰UÚ‰UÓ‰ỦUʼnU¾‰U·‰U°‰U©‰U¢‰U›‰U”‰U‰U†‰U‰Ux‰Uq‰Uj‰Uc‰U\‰UU‰UN‰UG‰U@‰U9‰U2‰U+‰U$‰U‰U‰U‰U‰U‰UúˆUóˆUìˆUåˆUÞˆU׈UЈUɈUˆU»ˆU´ˆU­ˆU¦ˆUŸˆU˜ˆU‘ˆUŠˆUƒˆU|ˆUuˆUnˆUgˆU`ˆUYˆURˆUKˆUDˆU=ˆU6ˆU/ˆU(ˆU!ˆUˆUˆU ˆUˆUþ‡U÷‡Uð‡Ué‡Uâ‡UÛ‡UÔ‡U͇UƇU¿‡U¸‡U±‡Uª‡U£‡Uœ‡U•‡UއU‡‡U€‡Uy‡Ur‡Uk‡Ud‡U]‡UV‡UO‡UH‡UA‡U:‡U3‡U,‡U%‡U‡U‡U‡U ‡U‡Uû†Uô†Uí†Uæ†U߆U؆UцUʆUÆU¼†Uµ†U®†U§†U †U™†U’†U‹†U„†U}†Uv†Uo†Uh†Ua†UZ†US†UL†UE†U>†U7†U0†U)†U"†U†U†U †U†Uÿ…Uø…Uñ…Uê…Uã…UÜ…UÕ…UÎ…UÇ…UÀ…U¹…U²…U«…U¤…U…U–…U…Uˆ…U…Uz…Us…Ul…Ue…U^…UW…UP…UI…UB…U;…U4…U-…U&…U…U…U…U …U…Uü„Uõ„Uî„Uç„Uà„UÙ„UÒ„UË„UÄ„U½„U¶„U¯„U¨„U¡„Uš„U“„UŒ„U…„U~„Uw„Up„Ui„Ub„U[„UT„UM„UF„U?„U8„U1„U*„U#„U„U„U„U„U„UùƒUòƒUëƒUäƒU݃UÖƒUσUȃUÁƒUºƒU³ƒU¬ƒU¥ƒUžƒU—ƒUƒU‰ƒU‚ƒU{ƒUtƒUmƒUfƒU_ƒUXƒUQƒUJƒUCƒU<ƒU5ƒU.ƒU'ƒU ƒUƒUƒU ƒUƒUý‚Uö‚Uï‚Uè‚Uá‚UÚ‚UÓ‚UÌ‚UÅ‚U¾‚U·‚U°‚U©‚U¢‚U›‚U”‚U‚U†‚U‚Ux‚Uq‚Uj‚Uc‚U\‚UU‚UN‚UG‚U@‚U9‚U2‚U+‚U$‚U‚U‚U‚U‚U‚UúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþ€U÷€Uð€Ué€Uâ€UÛ€UÔ€UÍ€UÆ€U¿€U¸€U±€Uª€U£€Uœ€U•€UŽ€U‡€U€€Uy€Ur€Uk€Ud€U]€UV€UO€UH€UA€U:€U3€U,€U%€U€U€U€U €U€UûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿ~Uø~Uñ~Uê~Uã~UÜ~UÕ~UÎ~UÇ~UÀ~U¹~U²~U«~U¤~U~U–~U~Uˆ~U~Uz~Us~Ul~Ue~U^~UW~UP~UI~UB~U;~U4~U-~U&~U~U~U~U ~U~Uü}Uõ}Uî}Uç}Uà}UÙ}UÒ}UË}UÄ}U½}U¶}U¯}U¨}U¡}Uš}U“}UŒ}U…}U~}Uw}Up}Ui}Ub}U[}UT}UM}UF}U?}U8}U1}U*}U#}U}U}U}U}U}Uù|Uò|Uë|Uä|UÝ|UÖ|UÏ|UÈ|UÁ|Uº|U³|U¬|U¥|Už|U—|U|U‰|U‚|U{|Ut|Um|Uf|U_|UX|UQ|UJ|UC|U<|U5|U.|U'|U |U|U|U |U|Uý{Uö{Uï{Uè{Uá{UÚ{UÓ{UÌ{UÅ{U¾{U·{U°{U©{U¢{U›{U”{U{U†{U{Ux{Uq{Uj{Uc{U\{UU{UN{UG{U@{U9{U2{U+{U${U{U{U{U{U{UúzUózUìzUåzUÞzU×zUÐzUÉzUÂzU»zU´zU­zU¦zUŸzU˜zU‘zUŠzUƒzU|zUuzUnzUgzU`zUYzURzUKzUDzU=zU6zU/zU(zU!zUzUzU zUzUþyU÷yUðyUéyUâyUÛyUÔyUÍyUÆyU¿yU¸yU±yUªyU£yUœyU•yUŽyU‡yU€yUyyUryUkyUdyU]yUVyUOyUHyUAyU:yU3yU,yU%yUyUyUyU yUyUûxUôxUíxUæxUßxUØxUÑxUÊxUÃxU¼xUµxU®xU§xU xU™xU’xU‹xU„xU}xUvxUoxUhxUaxUZxUSxULxUExU>xU7xU0xU)xU"xUxUxU xUxUÿwUøwUñwUêwUãwUÜwUÕwUÎwUÇwUÀwU¹wU²wU«wU¤wUwU–wUwUˆwUwUzwUswUlwUewU^wUWwUPwUIwUBwU;wU4wU-wU&wUwUwUwU wUwUüvUõvUîvUçvUàvUÙvUÒvUËvUÄvU½vU¶vU¯vU¨vU¡vUšvU“vUŒvU…vU~vUwvUpvUivUbvU[vUTvUMvUFvU?vU8vU1vU*vU#vUvUvUvUvUvUùuUòuUëuUäuUÝuUÖuUÏuUÈuUÁuUºuU³uU¬uU¥uUžuU—uUuU‰uU‚uU{uUtuUmuUfuU_uUXuUQuUJuUCuUqU7qU0qU)qU"qUqUqU qUqUÿpUøpUñpUêpUãpUÜpUÕpUÎpUÇpUÀpU¹pU²pU«pU¤pUpU–pUpUˆpUpUzpUspUlpUepU^pUWpUPpUIpUBpU;pU4pU-pU&pUpUpUpU pUpUüoUõoUîoUçoUàoUÙoUÒoUËoUÄoU½oU¶oU¯oU¨oU¡oUšoU“oUŒoU…oU~oUwoUpoUioUboU[oUToUMoUFoU?oU8oU1oU*oU#oUoUoUoUoUoUùnUònUënUänUÝnUÖnUÏnUÈnUÁnUºnU³nU¬nU¥nUžnU—nUnU‰nU‚nU{nUtnUmnUfnU_nUXnUQnUJnUCnUjU7jU0jU)jU"jUjUjU jUjUÿiUøiUñiUêiUãiUÜiUÕiUÎiUÇiUÀiU¹iU²iU«iU¤iUiU–iUiUˆiUiUziUsiUliUeiU^iUWiUPiUIiUBiU;iU4iU-iU&iUiUiUiU iUiUühUõhUîhUçhUàhUÙhUÒhUËhUÄhU½hU¶hU¯hU¨hU¡hUšhU“hUŒhU…hU~hUwhUphUihUbhU[hUThUMhUFhU?hU8hU1hU*hU#hUhUhUhUhUhUùgUògUëgUägUÝgUÖgUÏgUÈgUÁgUºgU³gU¬gU¥gUžgU—gUgU‰gU‚gU{gUtgUmgUfgU_gUXgUQgUJgUCgUcU7cU0cU)cU"cUcUcU cUcUÿbUøbUñbUêbUãbUÜbUÕbUÎbUÇbUÀbU¹bU²bU«bU¤bUbU–bUbUˆbUbUzbUsbUlbUebU^bUWbUPbUIbUBbU;bU4bU-bU&bUbUbUbU bUbUüaUõaUîaUçaUàaUÙaUÒaUËaUÄaU½aU¶aU¯aU¨aU¡aUšaU“aUŒaU…aU~aUwaUpaUiaUbaU[aUTaUMaUFaU?aU8aU1aU*aU#aUaUaUaUaUaUù`Uò`Uë`Uä`UÝ`UÖ`UÏ`UÈ`UÁ`Uº`U³`U¬`U¥`Už`U—`U`U‰`U‚`U{`Ut`Um`Uf`U_`UX`UQ`UJ`UC`U<`U5`U.`U'`U `U`U`U `U`Uý_Uö_Uï_Uè_Uá_UÚ_UÓ_UÌ_UÅ_U¾_U·_U°_U©_U¢_U›_U”_U_U†_U_Ux_Uq_Uj_Uc_U\_UU_UN_UG_U@_U9_U2_U+_U$_U_U_U_U_U_Uú^Uó^Uì^Uå^UÞ^U×^UÐ^UÉ^UÂ^U»^U´^U­^U¦^UŸ^U˜^U‘^UŠ^Uƒ^U|^Uu^Un^Ug^U`^UY^UR^UK^UD^U=^U6^U/^U(^U!^U^U^U ^U^Uþ]U÷]Uð]Ué]Uâ]UÛ]UÔ]UÍ]UÆ]U¿]U¸]U±]Uª]U£]Uœ]U•]UŽ]U‡]U€]Uy]Ur]Uk]Ud]U]]UV]UO]UH]UA]U:]U3]U,]U%]U]U]U]U ]U]Uû\Uô\Uí\Uæ\Uß\UØ\UÑ\UÊ\UÃ\U¼\Uµ\U®\U§\U \U™\U’\U‹\U„\U}\Uv\Uo\Uh\Ua\UZ\US\UL\UE\U>\U7\U0\U)\U"\U\U\U \U\Uÿ[Uø[Uñ[Uê[Uã[UÜ[UÕ[UÎ[UÇ[UÀ[U¹[U²[U«[U¤[U[U–[U[Uˆ[U[Uz[Us[Ul[Ue[U^[UW[UP[UI[UB[U;[U4[U-[U&[U[U[U[U [U[UüZUõZUîZUçZUàZUÙZUÒZUËZUÄZU½ZU¶ZU¯ZU¨ZU¡ZUšZU“ZUŒZU…ZU~ZUwZUpZUiZUbZU[ZUTZUMZUFZU?ZU8ZU1ZU*ZU#ZUZUZUZUZUZUùYUòYUëYUäYUÝYUÖYUÏYUÈYUÁYUºYU³YU¬YU¥YUžYU—YUYU‰YU‚YU{YUtYUmYUfYU_YUXYUQYUJYUCYUUU7UU0UU)UU"UUUUUU UUUUÿTUøTUñTUêTUãTUÜTUÕTUÎTUÇTUÀTU¹TU²TU«TU¤TUTU–TUTUˆTUTUzTUsTUlTUeTU^TUWTUPTUITUBTU;TU4TU-TU&TUTUTUTU TUTUüSUõSUîSUçSUàSUÙSUÒSUËSUÄSU½SU¶SU¯SU¨SU¡SUšSU“SUŒSU…SU~SUwSUpSUiSUbSU[SUTSUMSUFSU?SU8SU1SU*SU#SUSUSUSUSUSUùRUòRUëRUäRUÝRUÖRUÏRUÈRUÁRUºRU³RU¬RU¥RUžRU—RURU‰RU‚RU{RUtRUmRUfRU_RUXRUQRUJRUCRUNU7NU0NU)NU"NUNUNU NUNUÿMUøMUñMUêMUãMUÜMUÕMUÎMUÇMUÀMU¹MU²MU«MU¤MUMU–MUMUˆMUMUzMUsMUlMUeMU^MUWMUPMUIMUBMU;MU4MU-MU&MUMUMUMU MUMUüLUõLUîLUçLUàLUÙLUÒLUËLUÄLU½LU¶LU¯LU¨LU¡LUšLU“LUŒLU…LU~LUwLUpLUiLUbLU[LUTLUMLUFLU?LU8LU1LU*LU#LULULULULULUùKUòKUëKUäKUÝKUÖKUÏKUÈKUÁKUºKU³KU¬KU¥KUžKU—KUKU‰KU‚KU{KUtKUmKUfKU_KUXKUQKUJKUCKUGU7GU0GU)GU"GUGUGU GUGUÿFUøFUñFUêFUãFUÜFUÕFUÎFUÇFUÀFU¹FU²FU«FU¤FUFU–FUFUˆFUFUzFUsFUlFUeFU^FUWFUPFUIFUBFU;FU4FU-FU&FUFUFUFU FUFUüEUõEUîEUçEUàEUÙEUÒEUËEUÄEU½EU¶EU¯EU¨EU¡EUšEU“EUŒEU…EU~EUwEUpEUiEUbEU[EUTEUMEUFEU?EU8EU1EU*EU#EUEUEUEUEUEUùDUòDUëDUäDUÝDUÖDUÏDUÈDUÁDUºDU³DU¬DU¥DUžDU—DUDU‰DU‚DU{DUtDUmDUfDU_DUXDUQDUJDUCDU@U7@U0@U)@U"@U@U@U @U@Uÿ?Uø?Uñ?Uê?Uã?UÜ?UÕ?UÎ?UÇ?UÀ?U¹?U²?U«?U¤?U?U–?U?Uˆ?U?Uz?Us?Ul?Ue?U^?UW?UP?UI?UB?U;?U4?U-?U&?U?U?U?U ?U?Uü>Uõ>Uî>Uç>Uà>UÙ>UÒ>UË>UÄ>U½>U¶>U¯>U¨>U¡>Uš>U“>UŒ>U…>U~>Uw>Up>Ui>Ub>U[>UT>UM>UF>U?>U8>U1>U*>U#>U>U>U>U>U>Uù=Uò=Uë=Uä=UÝ=UÖ=UÏ=UÈ=UÁ=Uº=U³=U¬=U¥=Už=U—=U=U‰=U‚=U{=Ut=Um=Uf=U_=UX=UQ=UJ=UC=U<=U5=U.=U'=U =U=U=U =U=Uý9U79U09U)9U"9U9U9U 9U9Uÿ8Uø8Uñ8Uê8Uã8UÜ8UÕ8UÎ8UÇ8UÀ8U¹8U²8U«8U¤8U8U–8U8Uˆ8U8Uz8Us8Ul8Ue8U^8UW8UP8UI8UB8U;8U48U-8U&8U8U8U8U 8U8Uü7Uõ7Uî7Uç7Uà7UÙ7UÒ7UË7UÄ7U½7U¶7U¯7U¨7U¡7Uš7U“7UŒ7U…7U~7Uw7Up7Ui7Ub7U[7UT7UM7UF7U?7U87U17U*7U#7U7U7U7U7U7Uù6Uò6Uë6Uä6UÝ6UÖ6UÏ6UÈ6UÁ6Uº6U³6U¬6U¥6Už6U—6U6U‰6U‚6U{6Ut6Um6Uf6U_6UX6UQ6UJ6UC6U<6U56U.6U'6U 6U6U6U 6U6Uý5Uö5Uï5Uè5Uá5UÚ5UÓ5UÌ5UÅ5U¾5U·5U°5U©5U¢5U›5U”5U5U†5U5Ux5Uq5Uj5Uc5U\5UU5UN5UG5U@5U95U25U+5U$5U5U5U5U5U5Uú4Uó4Uì4Uå4UÞ4U×4UÐ4UÉ4UÂ4U»4U´4U­4U¦4UŸ4U˜4U‘4UŠ4Uƒ4U|4Uu4Un4Ug4U`4UY4UR4UK4UD4U=4U64U/4U(4U!4U4U4U 4U4Uþ3U÷3Uð3Ué3Uâ3UÛ3UÔ3UÍ3UÆ3U¿3U¸3U±3Uª3U£3Uœ3U•3UŽ3U‡3U€3Uy3Ur3Uk3Ud3U]3UV3UO3UH3UA3U:3U33U,3U%3U3U3U3U 3U3Uû2Uô2Uí2Uæ2Uß2UØ2UÑ2UÊ2UÃ2U¼2Uµ2U®2U§2U 2U™2U’2U‹2U„2U}2Uv2Uo2Uh2Ua2UZ2US2UL2UE2U>2U72U02U)2U"2U2U2U 2U2Uÿ1Uø1Uñ1Uê1Uã1UÜ1UÕ1UÎ1UÇ1UÀ1U¹1U²1U«1U¤1U1U–1U1Uˆ1U1Uz1Us1Ul1Ue1U^1UW1UP1UI1UB1U;1U41U-1U&1U1U1U1U 1U1Uü0Uõ0Uî0Uç0Uà0UÙ0UÒ0UË0UÄ0U½0U¶0U¯0U¨0U¡0Uš0U“0UŒ0U…0U~0Uw0Up0Ui0Ub0U[0UT0UM0UF0U?0U80U10U*0U#0U0U0U0U0U0Uù/Uò/Uë/Uä/UÝ/UÖ/UÏ/UÈ/UÁ/Uº/U³/U¬/U¥/Už/U—/U/U‰/U‚/U{/Ut/Um/Uf/U_/UX/UQ/UJ/UC/U+U7+U0+U)+U"+U+U+U +U+Uÿ*Uø*Uñ*Uê*Uã*UÜ*UÕ*UÎ*UÇ*UÀ*U¹*U²*U«*U¤*U*U–*U*Uˆ*U*Uz*Us*Ul*Ue*U^*UW*UP*UI*UB*U;*U4*U-*U&*U*U*U*U *U*Uü)Uõ)Uî)Uç)Uà)UÙ)UÒ)UË)UÄ)U½)U¶)U¯)U¨)U¡)Uš)U“)UŒ)U…)U~)Uw)Up)Ui)Ub)U[)UT)UM)UF)U?)U8)U1)U*)U#)U)U)U)U)U)Uù(Uò(Uë(Uä(UÝ(UÖ(UÏ(UÈ(UÁ(Uº(U³(U¬(U¥(Už(U—(U(U‰(U‚(U{(Ut(Um(Uf(U_(UX(UQ(UJ(UC(U<(U5(U.(U'(U (U(U(U (U(Uý'Uö'Uï'Uè'Uá'UÚ'UÓ'UÌ'UÅ'U¾'U·'U°'U©'U¢'U›'U”'U'U†'U'Ux'Uq'Uj'Uc'U\'UU'UN'UG'U@'U9'U2'U+'U$'U'U'U'U'U'Uú&Uó&Uì&Uå&UÞ&U×&UÐ&UÉ&UÂ&U»&U´&U­&U¦&UŸ&U˜&U‘&UŠ&Uƒ&U|&Uu&Un&Ug&U`&UY&UR&UK&UD&U=&U6&U/&U(&U!&U&U&U &U&Uþ%U÷%Uð%Ué%Uâ%UÛ%UÔ%UÍ%UÆ%U¿%U¸%U±%Uª%U£%Uœ%U•%UŽ%U‡%U€%Uy%Ur%Uk%Ud%U]%UV%UO%UH%UA%U:%U3%U,%U%%U%U%U%U %U%Uû$Uô$Uí$Uæ$Uß$UØ$UÑ$UÊ$UÃ$U¼$Uµ$U®$U§$U $U™$U’$U‹$U„$U}$Uv$Uo$Uh$Ua$UZ$US$UL$UE$U>$U7$U0$U)$U"$U$U$U $U$Uÿ#Uø#Uñ#Uê#Uã#UÜ#UÕ#UÎ#UÇ#UÀ#U¹#U²#U«#U¤#U#U–#U#Uˆ#U#Uz#Us#Ul#Ue#U^#UW#UP#UI#UB#U;#U4#U-#U&#U#U#U#U #U#Uü"Uõ"Uî"Uç"Uà"UÙ"UÒ"UË"UÄ"U½"U¶"U¯"U¨"U¡"Uš"U“"UŒ"U…"U~"Uw"Up"Ui"Ub"U["UT"UM"UF"U?"U8"U1"U*"U#"U"U"U"U"U"Uù!Uò!Uë!Uä!UÝ!UÖ!UÏ!UÈ!UÁ!Uº!U³!U¬!U¥!Už!U—!U!U‰!U‚!U{!Ut!Um!Uf!U_!UX!UQ!UJ!UC!UU7U0U)U"UUU UUÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUýUöUïUèUáUÚUÓUÌUÅU¾U·U°U©U¢U›U”UU†UUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþU÷UðUéUâUÛUÔUÍUÆU¿U¸U±UªU£UœU•UŽU‡U€UyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUýUöUïUèUáUÚUÓUÌUÅU¾U·U°U©U¢U›U”UU†UUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþU÷UðUéUâUÛUÔUÍUÆU¿U¸U±UªU£UœU•UŽU‡U€UyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUü Uõ Uî Uç Uà UÙ UÒ UË UÄ U½ U¶ U¯ U¨ U¡ Uš U“ UŒ U… U~ Uw Up Ui Ub U[ UT UM UF U? U8 U1 U* U# U U U U U Uù Uò Uë Uä UÝ UÖ UÏ UÈ UÁ Uº U³ U¬ U¥ Už U— U U‰ U‚ U{ Ut Um Uf U_ UX UQ UJ UC U< U5 U. U' U U U U U Uý Uö Uï Uè Uá UÚ UÓ UÌ UÅ U¾ U· U° U© U¢ U› U” U U† U Ux Uq Uj Uc U\ UU UN UG U@ U9 U2 U+ U$ U U U U U Uú Uó Uì Uå UÞ U× UÐ UÉ U U» U´ U­ U¦ UŸ U˜ U‘ UŠ Uƒ U| Uu Un Ug U` UY UR UK UD U= U6 U/ U( U! U U U U Uþ U÷ Uð Ué Uâ UÛ UÔ UÍ UÆ U¿ U¸ U± Uª U£ Uœ U• UŽ U‡ U€ Uy Ur Uk Ud U] UV UO UH UA U: U3 U, U% U U U U U UûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCU<U5U.U'U UUU UUýUöUïUèUáUÚUÓUÌUÅU¾U·U°U©U¢U›U”UU†UUxUqUjUcU\UUUNUGU@U9U2U+U$UUUUUUúUóUìUåUÞU×UÐUÉUÂU»U´U­U¦UŸU˜U‘UŠUƒU|UuUnUgU`UYURUKUDU=U6U/U(U!UUU UUþU÷UðUéUâUÛUÔUÍUÆU¿U¸U±UªU£UœU•UŽU‡U€UyUrUkUdU]UVUOUHUAU:U3U,U%UUUU UUûUôUíUæUßUØUÑUÊUÃU¼UµU®U§U U™U’U‹U„U}UvUoUhUaUZUSULUEU>U7U0U)U"UUU UUÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüÿTõÿTîÿTçÿTàÿTÙÿTÒÿTËÿTÄÿT½ÿT¶ÿT¯ÿT¨ÿT¡ÿTšÿT“ÿTŒÿT…ÿT~ÿTwÿTpÿTiÿTbÿT[ÿTTÿTMÿTFÿT?ÿT8ÿT1ÿT*ÿT#ÿTÿTÿTÿTÿTÿTùþTòþTëþTäþTÝþTÖþTÏþTÈþTÁþTºþT³þT¬þT¥þTžþT—þTþT‰þT‚þT{þTtþTmþTfþT_þTXþTQþTJþTCþT<þT5þT.þT'þT þTþTþT þTþTýýTöýTïýTèýTáýTÚýTÓýTÌýTÅýT¾ýT·ýT°ýT©ýT¢ýT›ýT”ýTýT†ýTýTxýTqýTjýTcýT\ýTUýTNýTGýT@ýT9ýT2ýT+ýT$ýTýTýTýTýTýTúüTóüTìüTåüTÞüT×üTÐüTÉüTÂüT»üT´üT­üT¦üTŸüT˜üT‘üTŠüTƒüT|üTuüTnüTgüT`üTYüTRüTKüTDüT=üT6üT/üT(üT!üTüTüT üTüTþûT÷ûTðûTéûTâûTÛûTÔûTÍûTÆûT¿ûT¸ûT±ûTªûT£ûTœûT•ûTŽûT‡ûT€ûTyûTrûTkûTdûT]ûTVûTOûTHûTAûT:ûT3ûT,ûT%ûTûTûTûT ûTûTûúTôúTíúTæúTßúTØúTÑúTÊúTÃúT¼úTµúT®úT§úT úT™úT’úT‹úT„úT}úTvúToúThúTaúTZúTSúTLúTEúT>úT7úT0úT)úT"úTúTúT úTúTÿùTøùTñùTêùTãùTÜùTÕùTÎùTÇùTÀùT¹ùT²ùT«ùT¤ùTùT–ùTùTˆùTùTzùTsùTlùTeùT^ùTWùTPùTIùTBùT;ùT4ùT-ùT&ùTùTùTùT ùTùTüøTõøTîøTçøTàøTÙøTÒøTËøTÄøT½øT¶øT¯øT¨øT¡øTšøT“øTŒøT…øT~øTwøTpøTiøTbøT[øTTøTMøTFøT?øT8øT1øT*øT#øTøTøTøTøTøTù÷Tò÷Të÷Tä÷TÝ÷TÖ÷TÏ÷TÈ÷TÁ÷Tº÷T³÷T¬÷T¥÷Tž÷T—÷T÷T‰÷T‚÷T{÷Tt÷Tm÷Tf÷T_÷TX÷TQ÷TJ÷TC÷T<÷T5÷T.÷T'÷T ÷T÷T÷T ÷T÷TýöTööTïöTèöTáöTÚöTÓöTÌöTÅöT¾öT·öT°öT©öT¢öT›öT”öTöT†öTöTxöTqöTjöTcöT\öTUöTNöTGöT@öT9öT2öT+öT$öTöTöTöTöTöTúõTóõTìõTåõTÞõT×õTÐõTÉõTÂõT»õT´õT­õT¦õTŸõT˜õT‘õTŠõTƒõT|õTuõTnõTgõT`õTYõTRõTKõTDõT=õT6õT/õT(õT!õTõTõT õTõTþôT÷ôTðôTéôTâôTÛôTÔôTÍôTÆôT¿ôT¸ôT±ôTªôT£ôTœôT•ôTŽôT‡ôT€ôTyôTrôTkôTdôT]ôTVôTOôTHôTAôT:ôT3ôT,ôT%ôTôTôTôT ôTôTûóTôóTíóTæóTßóTØóTÑóTÊóTÃóT¼óTµóT®óT§óT óT™óT’óT‹óT„óT}óTvóToóThóTaóTZóTSóTLóTEóT>óT7óT0óT)óT"óTóTóT óTóTÿòTøòTñòTêòTãòTÜòTÕòTÎòTÇòTÀòT¹òT²òT«òT¤òTòT–òTòTˆòTòTzòTsòTlòTeòT^òTWòTPòTIòTBòT;òT4òT-òT&òTòTòTòT òTòTüñTõñTîñTçñTàñTÙñTÒñTËñTÄñT½ñT¶ñT¯ñT¨ñT¡ñTšñT“ñTŒñT…ñT~ñTwñTpñTiñTbñT[ñTTñTMñTFñT?ñT8ñT1ñT*ñT#ñTñTñTñTñTñTùðTòðTëðTäðTÝðTÖðTÏðTÈðTÁðTºðT³ðT¬ðT¥ðTžðT—ðTðT‰ðT‚ðT{ðTtðTmðTfðT_ðTXðTQðTJðTCðT<ðT5ðT.ðT'ðT ðTðTðT ðTðTýïTöïTïïTèïTáïTÚïTÓïTÌïTÅïT¾ïT·ïT°ïT©ïT¢ïT›ïT”ïTïT†ïTïTxïTqïTjïTcïT\ïTUïTNïTGïT@ïT9ïT2ïT+ïT$ïTïTïTïTïTïTúîTóîTìîTåîTÞîT×îTÐîTÉîTÂîT»îT´îT­îT¦îTŸîT˜îT‘îTŠîTƒîT|îTuîTnîTgîT`îTYîTRîTKîTDîT=îT6îT/îT(îT!îTîTîT îTîTþíT÷íTðíTéíTâíTÛíTÔíTÍíTÆíT¿íT¸íT±íTªíT£íTœíT•íTŽíT‡íT€íTyíTríTkíTdíT]íTVíTOíTHíTAíT:íT3íT,íT%íTíTíTíT íTíTûìTôìTíìTæìTßìTØìTÑìTÊìTÃìT¼ìTµìT®ìT§ìT ìT™ìT’ìT‹ìT„ìT}ìTvìToìThìTaìTZìTSìTLìTEìT>ìT7ìT0ìT)ìT"ìTìTìT ìTìTÿëTøëTñëTêëTãëTÜëTÕëTÎëTÇëTÀëT¹ëT²ëT«ëT¤ëTëT–ëTëTˆëTëTzëTsëTlëTeëT^ëTWëTPëTIëTBëT;ëT4ëT-ëT&ëTëTëTëT ëTëTüêTõêTîêTçêTàêTÙêTÒêTËêTÄêT½êT¶êT¯êT¨êT¡êTšêT“êTŒêT…êT~êTwêTpêTiêTbêT[êTTêTMêTFêT?êT8êT1êT*êT#êTêTêTêTêTêTùéTòéTëéTäéTÝéTÖéTÏéTÈéTÁéTºéT³éT¬éT¥éTžéT—éTéT‰éT‚éT{éTtéTméTféT_éTXéTQéTJéTCéT<éT5éT.éT'éT éTéTéT éTéTýèTöèTïèTèèTáèTÚèTÓèTÌèTÅèT¾èT·èT°èT©èT¢èT›èT”èTèT†èTèTxèTqèTjèTcèT\èTUèTNèTGèT@èT9èT2èT+èT$èTèTèTèTèTèTúçTóçTìçTåçTÞçT×çTÐçTÉçTÂçT»çT´çT­çT¦çTŸçT˜çT‘çTŠçTƒçT|çTuçTnçTgçT`çTYçTRçTKçTDçT=çT6çT/çT(çT!çTçTçT çTçTþæT÷æTðæTéæTâæTÛæTÔæTÍæTÆæT¿æT¸æT±æTªæT£æTœæT•æTŽæT‡æT€æTyæTræTkæTdæT]æTVæTOæTHæTAæT:æT3æT,æT%æTæTæTæT æTæTûåTôåTíåTæåTßåTØåTÑåTÊåTÃåT¼åTµåT®åT§åT åT™åT’åT‹åT„åT}åTvåToåThåTaåTZåTSåTLåTEåT>åT7åT0åT)åT"åTåTåT åTåTÿäTøäTñäTêäTãäTÜäTÕäTÎäTÇäTÀäT¹äT²äT«äT¤äTäT–äTäTˆäTäTzäTsäTläTeäT^äTWäTPäTIäTBäT;äT4äT-äT&äTäTäTäT äTäTüãTõãTîãTçãTàãTÙãTÒãTËãTÄãT½ãT¶ãT¯ãT¨ãT¡ãTšãT“ãTŒãT…ãT~ãTwãTpãTiãTbãT[ãTTãTMãTFãT?ãT8ãT1ãT*ãT#ãTãTãTãTãTãTùâTòâTëâTäâTÝâTÖâTÏâTÈâTÁâTºâT³âT¬âT¥âTžâT—âTâT‰âT‚âT{âTtâTmâTfâT_âTXâTQâTJâTCâT<âT5âT.âT'âT âTâTâT âTâTýáTöáTïáTèáTááTÚáTÓáTÌáTÅáT¾áT·áT°áT©áT¢áT›áT”áTáT†áTáTxáTqáTjáTcáT\áTUáTNáTGáT@áT9áT2áT+áT$áTáTáTáTáTáTúàTóàTìàTåàTÞàT×àTÐàTÉàTÂàT»àT´àT­àT¦àTŸàT˜àT‘àTŠàTƒàT|àTuàTnàTgàT`àTYàTRàTKàTDàT=àT6àT/àT(àT!àTàTàT àTàTþßT÷ßTðßTéßTâßTÛßTÔßTÍßTÆßT¿ßT¸ßT±ßTªßT£ßTœßT•ßTŽßT‡ßT€ßTyßTrßTkßTdßT]ßTVßTOßTHßTAßT:ßT3ßT,ßT%ßTßTßTßT ßTßTûÞTôÞTíÞTæÞTßÞTØÞTÑÞTÊÞTÃÞT¼ÞTµÞT®ÞT§ÞT ÞT™ÞT’ÞT‹ÞT„ÞT}ÞTvÞToÞThÞTaÞTZÞTSÞTLÞTEÞT>ÞT7ÞT0ÞT)ÞT"ÞTÞTÞT ÞTÞTÿÝTøÝTñÝTêÝTãÝTÜÝTÕÝTÎÝTÇÝTÀÝT¹ÝT²ÝT«ÝT¤ÝTÝT–ÝTÝTˆÝTÝTzÝTsÝTlÝTeÝT^ÝTWÝTPÝTIÝTBÝT;ÝT4ÝT-ÝT&ÝTÝTÝTÝT ÝTÝTüÜTõÜTîÜTçÜTàÜTÙÜTÒÜTËÜTÄÜT½ÜT¶ÜT¯ÜT¨ÜT¡ÜTšÜT“ÜTŒÜT…ÜT~ÜTwÜTpÜTiÜTbÜT[ÜTTÜTMÜTFÜT?ÜT8ÜT1ÜT*ÜT#ÜTÜTÜTÜTÜTÜTùÛTòÛTëÛTäÛTÝÛTÖÛTÏÛTÈÛTÁÛTºÛT³ÛT¬ÛT¥ÛTžÛT—ÛTÛT‰ÛT‚ÛT{ÛTtÛTmÛTfÛT_ÛTXÛTQÛTJÛTCÛT<ÛT5ÛT.ÛT'ÛT ÛTÛTÛT ÛTÛTýÚTöÚTïÚTèÚTáÚTÚÚTÓÚTÌÚTÅÚT¾ÚT·ÚT°ÚT©ÚT¢ÚT›ÚT”ÚTÚT†ÚTÚTxÚTqÚTjÚTcÚT\ÚTUÚTNÚTGÚT@ÚT9ÚT2ÚT+ÚT$ÚTÚTÚTÚTÚTÚTúÙTóÙTìÙTåÙTÞÙT×ÙTÐÙTÉÙTÂÙT»ÙT´ÙT­ÙT¦ÙTŸÙT˜ÙT‘ÙTŠÙTƒÙT|ÙTuÙTnÙTgÙT`ÙTYÙTRÙTKÙTDÙT=ÙT6ÙT/ÙT(ÙT!ÙTÙTÙT ÙTÙTþØT÷ØTðØTéØTâØTÛØTÔØTÍØTÆØT¿ØT¸ØT±ØTªØT£ØTœØT•ØTŽØT‡ØT€ØTyØTrØTkØTdØT]ØTVØTOØTHØTAØT:ØT3ØT,ØT%ØTØTØTØT ØTØTû×Tô×Tí×Tæ×Tß×TØ×TÑ×TÊ×TÃ×T¼×Tµ×T®×T§×T ×T™×T’×T‹×T„×T}×Tv×To×Th×Ta×TZ×TS×TL×TE×T>×T7×T0×T)×T"×T×T×T ×T×TÿÖTøÖTñÖTêÖTãÖTÜÖTÕÖTÎÖTÇÖTÀÖT¹ÖT²ÖT«ÖT¤ÖTÖT–ÖTÖTˆÖTÖTzÖTsÖTlÖTeÖT^ÖTWÖTPÖTIÖTBÖT;ÖT4ÖT-ÖT&ÖTÖTÖTÖT ÖTÖTüÕTõÕTîÕTçÕTàÕTÙÕTÒÕTËÕTÄÕT½ÕT¶ÕT¯ÕT¨ÕT¡ÕTšÕT“ÕTŒÕT…ÕT~ÕTwÕTpÕTiÕTbÕT[ÕTTÕTMÕTFÕT?ÕT8ÕT1ÕT*ÕT#ÕTÕTÕTÕTÕTÕTùÔTòÔTëÔTäÔTÝÔTÖÔTÏÔTÈÔTÁÔTºÔT³ÔT¬ÔT¥ÔTžÔT—ÔTÔT‰ÔT‚ÔT{ÔTtÔTmÔTfÔT_ÔTXÔTQÔTJÔTCÔT<ÔT5ÔT.ÔT'ÔT ÔTÔTÔT ÔTÔTýÓTöÓTïÓTèÓTáÓTÚÓTÓÓTÌÓTÅÓT¾ÓT·ÓT°ÓT©ÓT¢ÓT›ÓT”ÓTÓT†ÓTÓTxÓTqÓTjÓTcÓT\ÓTUÓTNÓTGÓT@ÓT9ÓT2ÓT+ÓT$ÓTÓTÓTÓTÓTÓTúÒTóÒTìÒTåÒTÞÒT×ÒTÐÒTÉÒTÂÒT»ÒT´ÒT­ÒT¦ÒTŸÒT˜ÒT‘ÒTŠÒTƒÒT|ÒTuÒTnÒTgÒT`ÒTYÒTRÒTKÒTDÒT=ÒT6ÒT/ÒT(ÒT!ÒTÒTÒT ÒTÒTþÑT÷ÑTðÑTéÑTâÑTÛÑTÔÑTÍÑTÆÑT¿ÑT¸ÑT±ÑTªÑT£ÑTœÑT•ÑTŽÑT‡ÑT€ÑTyÑTrÑTkÑTdÑT]ÑTVÑTOÑTHÑTAÑT:ÑT3ÑT,ÑT%ÑTÑTÑTÑT ÑTÑTûÐTôÐTíÐTæÐTßÐTØÐTÑÐTÊÐTÃÐT¼ÐTµÐT®ÐT§ÐT ÐT™ÐT’ÐT‹ÐT„ÐT}ÐTvÐToÐThÐTaÐTZÐTSÐTLÐTEÐT>ÐT7ÐT0ÐT)ÐT"ÐTÐTÐT ÐTÐTÿÏTøÏTñÏTêÏTãÏTÜÏTÕÏTÎÏTÇÏTÀÏT¹ÏT²ÏT«ÏT¤ÏTÏT–ÏTÏTˆÏTÏTzÏTsÏTlÏTeÏT^ÏTWÏTPÏTIÏTBÏT;ÏT4ÏT-ÏT&ÏTÏTÏTÏT ÏTÏTüÎTõÎTîÎTçÎTàÎTÙÎTÒÎTËÎTÄÎT½ÎT¶ÎT¯ÎT¨ÎT¡ÎTšÎT“ÎTŒÎT…ÎT~ÎTwÎTpÎTiÎTbÎT[ÎTTÎTMÎTFÎT?ÎT8ÎT1ÎT*ÎT#ÎTÎTÎTÎTÎTÎTùÍTòÍTëÍTäÍTÝÍTÖÍTÏÍTÈÍTÁÍTºÍT³ÍT¬ÍT¥ÍTžÍT—ÍTÍT‰ÍT‚ÍT{ÍTtÍTmÍTfÍT_ÍTXÍTQÍTJÍTCÍT<ÍT5ÍT.ÍT'ÍT ÍTÍTÍT ÍTÍTýÌTöÌTïÌTèÌTáÌTÚÌTÓÌTÌÌTÅÌT¾ÌT·ÌT°ÌT©ÌT¢ÌT›ÌT”ÌTÌT†ÌTÌTxÌTqÌTjÌTcÌT\ÌTUÌTNÌTGÌT@ÌT9ÌT2ÌT+ÌT$ÌTÌTÌTÌTÌTÌTúËTóËTìËTåËTÞËT×ËTÐËTÉËTÂËT»ËT´ËT­ËT¦ËTŸËT˜ËT‘ËTŠËTƒËT|ËTuËTnËTgËT`ËTYËTRËTKËTDËT=ËT6ËT/ËT(ËT!ËTËTËT ËTËTþÊT÷ÊTðÊTéÊTâÊTÛÊTÔÊTÍÊTÆÊT¿ÊT¸ÊT±ÊTªÊT£ÊTœÊT•ÊTŽÊT‡ÊT€ÊTyÊTrÊTkÊTdÊT]ÊTVÊTOÊTHÊTAÊT:ÊT3ÊT,ÊT%ÊTÊTÊTÊT ÊTÊTûÉTôÉTíÉTæÉTßÉTØÉTÑÉTÊÉTÃÉT¼ÉTµÉT®ÉT§ÉT ÉT™ÉT’ÉT‹ÉT„ÉT}ÉTvÉToÉThÉTaÉTZÉTSÉTLÉTEÉT>ÉT7ÉT0ÉT)ÉT"ÉTÉTÉT ÉTÉTÿÈTøÈTñÈTêÈTãÈTÜÈTÕÈTÎÈTÇÈTÀÈT¹ÈT²ÈT«ÈT¤ÈTÈT–ÈTÈTˆÈTÈTzÈTsÈTlÈTeÈT^ÈTWÈTPÈTIÈTBÈT;ÈT4ÈT-ÈT&ÈTÈTÈTÈT ÈTÈTüÇTõÇTîÇTçÇTàÇTÙÇTÒÇTËÇTÄÇT½ÇT¶ÇT¯ÇT¨ÇT¡ÇTšÇT“ÇTŒÇT…ÇT~ÇTwÇTpÇTiÇTbÇT[ÇTTÇTMÇTFÇT?ÇT8ÇT1ÇT*ÇT#ÇTÇTÇTÇTÇTÇTùÆTòÆTëÆTäÆTÝÆTÖÆTÏÆTÈÆTÁÆTºÆT³ÆT¬ÆT¥ÆTžÆT—ÆTÆT‰ÆT‚ÆT{ÆTtÆTmÆTfÆT_ÆTXÆTQÆTJÆTCÆT<ÆT5ÆT.ÆT'ÆT ÆTÆTÆT ÆTÆTýÅTöÅTïÅTèÅTáÅTÚÅTÓÅTÌÅTÅÅT¾ÅT·ÅT°ÅT©ÅT¢ÅT›ÅT”ÅTÅT†ÅTÅTxÅTqÅTjÅTcÅT\ÅTUÅTNÅTGÅT@ÅT9ÅT2ÅT+ÅT$ÅTÅTÅTÅTÅTÅTúÄTóÄTìÄTåÄTÞÄT×ÄTÐÄTÉÄTÂÄT»ÄT´ÄT­ÄT¦ÄTŸÄT˜ÄT‘ÄTŠÄTƒÄT|ÄTuÄTnÄTgÄT`ÄTYÄTRÄTKÄTDÄT=ÄT6ÄT/ÄT(ÄT!ÄTÄTÄT ÄTÄTþÃT÷ÃTðÃTéÃTâÃTÛÃTÔÃTÍÃTÆÃT¿ÃT¸ÃT±ÃTªÃT£ÃTœÃT•ÃTŽÃT‡ÃT€ÃTyÃTrÃTkÃTdÃT]ÃTVÃTOÃTHÃTAÃT:ÃT3ÃT,ÃT%ÃTÃTÃTÃT ÃTÃTûÂTôÂTíÂTæÂTßÂTØÂTÑÂTÊÂTÃÂT¼ÂTµÂT®ÂT§ÂT ÂT™ÂT’ÂT‹ÂT„ÂT}ÂTvÂToÂThÂTaÂTZÂTSÂTLÂTEÂT>ÂT7ÂT0ÂT)ÂT"ÂTÂTÂT ÂTÂTÿÁTøÁTñÁTêÁTãÁTÜÁTÕÁTÎÁTÇÁTÀÁT¹ÁT²ÁT«ÁT¤ÁTÁT–ÁTÁTˆÁTÁTzÁTsÁTlÁTeÁT^ÁTWÁTPÁTIÁTBÁT;ÁT4ÁT-ÁT&ÁTÁTÁTÁT ÁTÁTüÀTõÀTîÀTçÀTàÀTÙÀTÒÀTËÀTÄÀT½ÀT¶ÀT¯ÀT¨ÀT¡ÀTšÀT“ÀTŒÀT…ÀT~ÀTwÀTpÀTiÀTbÀT[ÀTTÀTMÀTFÀT?ÀT8ÀT1ÀT*ÀT#ÀTÀTÀTÀTÀTÀTù¿Tò¿Të¿Tä¿TÝ¿TÖ¿TÏ¿TÈ¿TÁ¿Tº¿T³¿T¬¿T¥¿Tž¿T—¿T¿T‰¿T‚¿T{¿Tt¿Tm¿Tf¿T_¿TX¿TQ¿TJ¿TC¿T<¿T5¿T.¿T'¿T ¿T¿T¿T ¿T¿Tý¾Tö¾Tï¾Tè¾Tá¾TÚ¾TÓ¾T̾TžT¾¾T·¾T°¾T©¾T¢¾T›¾T”¾T¾T†¾T¾Tx¾Tq¾Tj¾Tc¾T\¾TU¾TN¾TG¾T@¾T9¾T2¾T+¾T$¾T¾T¾T¾T¾T¾Tú½Tó½Tì½Tå½TÞ½T×½TнTɽT½T»½T´½T­½T¦½TŸ½T˜½T‘½TнTƒ½T|½Tu½Tn½Tg½T`½TY½TR½TK½TD½T=½T6½T/½T(½T!½T½T½T ½T½Tþ¼T÷¼Tð¼Té¼Tâ¼TÛ¼TÔ¼TͼTƼT¿¼T¸¼T±¼Tª¼T£¼Tœ¼T•¼T޼T‡¼T€¼Ty¼Tr¼Tk¼Td¼T]¼TV¼TO¼TH¼TA¼T:¼T3¼T,¼T%¼T¼T¼T¼T ¼T¼Tû»Tô»Tí»Tæ»Tß»TØ»TÑ»TÊ»TûT¼»Tµ»T®»T§»T »T™»T’»T‹»T„»T}»Tv»To»Th»Ta»TZ»TS»TL»TE»T>»T7»T0»T)»T"»T»T»T »T»TÿºTøºTñºTêºTãºTܺTÕºTκTǺTÀºT¹ºT²ºT«ºT¤ºTºT–ºTºTˆºTºTzºTsºTlºTeºT^ºTWºTPºTIºTBºT;ºT4ºT-ºT&ºTºTºTºT ºTºTü¹Tõ¹Tî¹Tç¹Tà¹TÙ¹TÒ¹T˹TĹT½¹T¶¹T¯¹T¨¹T¡¹Tš¹T“¹TŒ¹T…¹T~¹Tw¹Tp¹Ti¹Tb¹T[¹TT¹TM¹TF¹T?¹T8¹T1¹T*¹T#¹T¹T¹T¹T¹T¹Tù¸Tò¸Të¸Tä¸TݸTÖ¸TϸTȸTÁ¸Tº¸T³¸T¬¸T¥¸Tž¸T—¸T¸T‰¸T‚¸T{¸Tt¸Tm¸Tf¸T_¸TX¸TQ¸TJ¸TC¸T<¸T5¸T.¸T'¸T ¸T¸T¸T ¸T¸Tý·Tö·Tï·Tè·Tá·TÚ·TÓ·TÌ·TÅ·T¾·T··T°·T©·T¢·T›·T”·T·T†·T·Tx·Tq·Tj·Tc·T\·TU·TN·TG·T@·T9·T2·T+·T$·T·T·T·T·T·Tú¶Tó¶Tì¶Tå¶TÞ¶T×¶TжTɶT¶T»¶T´¶T­¶T¦¶TŸ¶T˜¶T‘¶TжTƒ¶T|¶Tu¶Tn¶Tg¶T`¶TY¶TR¶TK¶TD¶T=¶T6¶T/¶T(¶T!¶T¶T¶T ¶T¶TþµT÷µTðµTéµTâµTÛµTÔµT͵TƵT¿µT¸µT±µTªµT£µTœµT•µT޵T‡µT€µTyµTrµTkµTdµT]µTVµTOµTHµTAµT:µT3µT,µT%µTµTµTµT µTµTû´Tô´Tí´Tæ´Tß´TØ´TÑ´TÊ´TôT¼´Tµ´T®´T§´T ´T™´T’´T‹´T„´T}´Tv´To´Th´Ta´TZ´TS´TL´TE´T>´T7´T0´T)´T"´T´T´T ´T´Tÿ³Tø³Tñ³Tê³Tã³TܳTÕ³TγTdzTÀ³T¹³T²³T«³T¤³T³T–³T³Tˆ³T³Tz³Ts³Tl³Te³T^³TW³TP³TI³TB³T;³T4³T-³T&³T³T³T³T ³T³Tü²Tõ²Tî²Tç²Tà²TÙ²TÒ²T˲TIJT½²T¶²T¯²T¨²T¡²Tš²T“²TŒ²T…²T~²Tw²Tp²Ti²Tb²T[²TT²TM²TF²T?²T8²T1²T*²T#²T²T²T²T²T²Tù±Tò±Të±Tä±TݱTÖ±TϱTȱTÁ±Tº±T³±T¬±T¥±Tž±T—±T±T‰±T‚±T{±Tt±Tm±Tf±T_±TX±TQ±TJ±TC±T<±T5±T.±T'±T ±T±T±T ±T±Tý°Tö°Tï°Tè°Tá°TÚ°TÓ°T̰TŰT¾°T·°T°°T©°T¢°T›°T”°T°T†°T°Tx°Tq°Tj°Tc°T\°TU°TN°TG°T@°T9°T2°T+°T$°T°T°T°T°T°Tú¯Tó¯Tì¯Tå¯TÞ¯TׯTЯTɯT¯T»¯T´¯T­¯T¦¯TŸ¯T˜¯T‘¯TНTƒ¯T|¯Tu¯Tn¯Tg¯T`¯TY¯TR¯TK¯TD¯T=¯T6¯T/¯T(¯T!¯T¯T¯T ¯T¯Tþ®T÷®Tð®Té®Tâ®TÛ®TÔ®TÍ®TÆ®T¿®T¸®T±®Tª®T£®Tœ®T•®TŽ®T‡®T€®Ty®Tr®Tk®Td®T]®TV®TO®TH®TA®T:®T3®T,®T%®T®T®T®T ®T®Tû­Tô­Tí­Tæ­Tß­TØ­TÑ­TÊ­TíT¼­Tµ­T®­T§­T ­T™­T’­T‹­T„­T}­Tv­To­Th­Ta­TZ­TS­TL­TE­T>­T7­T0­T)­T"­T­T­T ­T­Tÿ¬Tø¬Tñ¬Tê¬Tã¬TܬTÕ¬TάTǬTÀ¬T¹¬T²¬T«¬T¤¬T¬T–¬T¬Tˆ¬T¬Tz¬Ts¬Tl¬Te¬T^¬TW¬TP¬TI¬TB¬T;¬T4¬T-¬T&¬T¬T¬T¬T ¬T¬Tü«Tõ«Tî«Tç«Tà«TÙ«TÒ«TË«TÄ«T½«T¶«T¯«T¨«T¡«Tš«T“«TŒ«T…«T~«Tw«Tp«Ti«Tb«T[«TT«TM«TF«T?«T8«T1«T*«T#«T«T«T«T«T«TùªTòªTëªTäªTݪTÖªTϪTȪTÁªTºªT³ªT¬ªT¥ªTžªT—ªTªT‰ªT‚ªT{ªTtªTmªTfªT_ªTXªTQªTJªTCªT<ªT5ªT.ªT'ªT ªTªTªT ªTªTý©Tö©Tï©Tè©Tá©TÚ©TÓ©TÌ©TÅ©T¾©T·©T°©T©©T¢©T›©T”©T©T†©T©Tx©Tq©Tj©Tc©T\©TU©TN©TG©T@©T9©T2©T+©T$©T©T©T©T©T©Tú¨Tó¨Tì¨Tå¨TÞ¨TרTШTɨT¨T»¨T´¨T­¨T¦¨TŸ¨T˜¨T‘¨TЍTƒ¨T|¨Tu¨Tn¨Tg¨T`¨TY¨TR¨TK¨TD¨T=¨T6¨T/¨T(¨T!¨T¨T¨T ¨T¨Tþ§T÷§Tð§Té§Tâ§TÛ§TÔ§TͧTƧT¿§T¸§T±§Tª§T£§Tœ§T•§TާT‡§T€§Ty§Tr§Tk§Td§T]§TV§TO§TH§TA§T:§T3§T,§T%§T§T§T§T §T§Tû¦Tô¦Tí¦Tæ¦TߦTئTѦTʦTæT¼¦Tµ¦T®¦T§¦T ¦T™¦T’¦T‹¦T„¦T}¦Tv¦To¦Th¦Ta¦TZ¦TS¦TL¦TE¦T>¦T7¦T0¦T)¦T"¦T¦T¦T ¦T¦Tÿ¥Tø¥Tñ¥Tê¥Tã¥TÜ¥TÕ¥TÎ¥TÇ¥TÀ¥T¹¥T²¥T«¥T¤¥T¥T–¥T¥Tˆ¥T¥Tz¥Ts¥Tl¥Te¥T^¥TW¥TP¥TI¥TB¥T;¥T4¥T-¥T&¥T¥T¥T¥T ¥T¥Tü¤Tõ¤Tî¤Tç¤Tà¤TÙ¤TÒ¤TˤTĤT½¤T¶¤T¯¤T¨¤T¡¤Tš¤T“¤TŒ¤T…¤T~¤Tw¤Tp¤Ti¤Tb¤T[¤TT¤TM¤TF¤T?¤T8¤T1¤T*¤T#¤T¤T¤T¤T¤T¤Tù£Tò£Të£Tä£TÝ£TÖ£TÏ£TÈ£TÁ£Tº£T³£T¬£T¥£Tž£T—£T£T‰£T‚£T{£Tt£Tm£Tf£T_£TX£TQ£TJ£TC£T<£T5£T.£T'£T £T£T£T £T£Tý¢Tö¢Tï¢Tè¢Tá¢TÚ¢TÓ¢TÌ¢TÅ¢T¾¢T·¢T°¢T©¢T¢¢T›¢T”¢T¢T†¢T¢Tx¢Tq¢Tj¢Tc¢T\¢TU¢TN¢TG¢T@¢T9¢T2¢T+¢T$¢T¢T¢T¢T¢T¢Tú¡Tó¡Tì¡Tå¡TÞ¡TסTСTÉ¡T¡T»¡T´¡T­¡T¦¡TŸ¡T˜¡T‘¡TŠ¡Tƒ¡T|¡Tu¡Tn¡Tg¡T`¡TY¡TR¡TK¡TD¡T=¡T6¡T/¡T(¡T!¡T¡T¡T ¡T¡Tþ T÷ Tð Té Tâ TÛ TÔ TÍ TÆ T¿ T¸ T± Tª T£ Tœ T• TŽ T‡ T€ Ty Tr Tk Td T] TV TO TH TA T: T3 T, T% T T T T  T TûŸTôŸTíŸTæŸTߟTØŸTÑŸTÊŸTßT¼ŸTµŸT®ŸT§ŸT ŸT™ŸT’ŸT‹ŸT„ŸT}ŸTvŸToŸThŸTaŸTZŸTSŸTLŸTEŸT>ŸT7ŸT0ŸT)ŸT"ŸTŸTŸT ŸTŸTÿžTøžTñžTêžTãžTÜžTÕžTΞTÇžTÀžT¹žT²žT«žT¤žTžT–žTžTˆžTžTzžTsžTlžTežT^žTWžTPžTIžTBžT;žT4žT-žT&žTžTžTžT žTžTüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùœTòœTëœTäœTÝœTÖœTÏœTÈœTÁœTºœT³œT¬œT¥œTžœT—œTœT‰œT‚œT{œTtœTmœTfœT_œTXœTQœTJœTCœT<œT5œT.œT'œT œTœTœT œTœTý›Tö›Tï›Tè›Tá›TÚ›TÓ›TÌ›TÅ›T¾›T·›T°›T©›T¢›T››T”›T›T†›T›Tx›Tq›Tj›Tc›T\›TU›TN›TG›T@›T9›T2›T+›T$›T›T›T›T›T›TúšTóšTìšTåšTÞšTךTКTÉšTšT»šT´šT­šT¦šTŸšT˜šT‘šTŠšTƒšT|šTušTnšTgšT`šTYšTRšTKšTDšT=šT6šT/šT(šT!šTšTšT šTšTþ™T÷™Tð™Té™Tâ™TÛ™TÔ™TÍ™TÆ™T¿™T¸™T±™Tª™T£™Tœ™T•™TŽ™T‡™T€™Ty™Tr™Tk™Td™T]™TV™TO™TH™TA™T:™T3™T,™T%™T™T™T™T ™T™Tû˜Tô˜Tí˜Tæ˜TߘTؘTјTʘTØT¼˜Tµ˜T®˜T§˜T ˜T™˜T’˜T‹˜T„˜T}˜Tv˜To˜Th˜Ta˜TZ˜TS˜TL˜TE˜T>˜T7˜T0˜T)˜T"˜T˜T˜T ˜T˜Tÿ—Tø—Tñ—Tê—Tã—TÜ—TÕ—TΗTÇ—TÀ—T¹—T²—T«—T¤—T—T–—T—Tˆ—T—Tz—Ts—Tl—Te—T^—TW—TP—TI—TB—T;—T4—T-—T&—T—T—T—T —T—Tü–Tõ–Tî–Tç–Tà–TÙ–TÒ–TË–TÄ–T½–T¶–T¯–T¨–T¡–Tš–T“–TŒ–T…–T~–Tw–Tp–Ti–Tb–T[–TT–TM–TF–T?–T8–T1–T*–T#–T–T–T–T–T–Tù•Tò•Të•Tä•TÝ•TÖ•TÏ•TÈ•TÁ•Tº•T³•T¬•T¥•Tž•T—•T•T‰•T‚•T{•Tt•Tm•Tf•T_•TX•TQ•TJ•TC•T<•T5•T.•T'•T •T•T•T •T•Tý”Tö”Tï”Tè”Tá”TÚ”TÓ”TÌ”TÅ”T¾”T·”T°”T©”T¢”T›”T””T”T†”T”Tx”Tq”Tj”Tc”T\”TU”TN”TG”T@”T9”T2”T+”T$”T”T”T”T”T”Tú“Tó“Tì“Tå“TÞ“TדTГTÉ“T“T»“T´“T­“T¦“TŸ“T˜“T‘“TŠ“Tƒ“T|“Tu“Tn“Tg“T`“TY“TR“TK“TD“T=“T6“T/“T(“T!“T“T“T “T“Tþ’T÷’Tð’Té’Tâ’TÛ’TÔ’TÍ’TÆ’T¿’T¸’T±’Tª’T£’Tœ’T•’TŽ’T‡’T€’Ty’Tr’Tk’Td’T]’TV’TO’TH’TA’T:’T3’T,’T%’T’T’T’T ’T’Tû‘Tô‘Tí‘Tæ‘Tß‘TØ‘TÑ‘TÊ‘TÑT¼‘Tµ‘T®‘T§‘T ‘T™‘T’‘T‹‘T„‘T}‘Tv‘To‘Th‘Ta‘TZ‘TS‘TL‘TE‘T>‘T7‘T0‘T)‘T"‘T‘T‘T ‘T‘TÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùŽTòŽTëŽTäŽTÝŽTÖŽTÏŽTÈŽTÁŽTºŽT³ŽT¬ŽT¥ŽTžŽT—ŽTŽT‰ŽT‚ŽT{ŽTtŽTmŽTfŽT_ŽTXŽTQŽTJŽTCŽT<ŽT5ŽT.ŽT'ŽT ŽTŽTŽT ŽTŽTýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúŒTóŒTìŒTåŒTÞŒT׌TÐŒTÉŒTÂŒT»ŒT´ŒT­ŒT¦ŒTŸŒT˜ŒT‘ŒTŠŒTƒŒT|ŒTuŒTnŒTgŒT`ŒTYŒTRŒTKŒTDŒT=ŒT6ŒT/ŒT(ŒT!ŒTŒTŒT ŒTŒTþ‹T÷‹Tð‹Té‹Tâ‹TÛ‹TÔ‹TÍ‹TÆ‹T¿‹T¸‹T±‹Tª‹T£‹Tœ‹T•‹TŽ‹T‡‹T€‹Ty‹Tr‹Tk‹Td‹T]‹TV‹TO‹TH‹TA‹T:‹T3‹T,‹T%‹T‹T‹T‹T ‹T‹TûŠTôŠTíŠTæŠTߊTØŠTÑŠTÊŠTÊT¼ŠTµŠT®ŠT§ŠT ŠT™ŠT’ŠT‹ŠT„ŠT}ŠTvŠToŠThŠTaŠTZŠTSŠTLŠTEŠT>ŠT7ŠT0ŠT)ŠT"ŠTŠTŠT ŠTŠTÿ‰Tø‰Tñ‰Tê‰Tã‰T܉TÕ‰TΉTljTÀ‰T¹‰T²‰T«‰T¤‰T‰T–‰T‰Tˆ‰T‰Tz‰Ts‰Tl‰Te‰T^‰TW‰TP‰TI‰TB‰T;‰T4‰T-‰T&‰T‰T‰T‰T ‰T‰TüˆTõˆTîˆTçˆTàˆTÙˆTÒˆTˈTĈT½ˆT¶ˆT¯ˆT¨ˆT¡ˆTšˆT“ˆTŒˆT…ˆT~ˆTwˆTpˆTiˆTbˆT[ˆTTˆTMˆTFˆT?ˆT8ˆT1ˆT*ˆT#ˆTˆTˆTˆTˆTˆTù‡Tò‡Të‡Tä‡T݇TÖ‡TχTȇTÁ‡Tº‡T³‡T¬‡T¥‡Tž‡T—‡T‡T‰‡T‚‡T{‡Tt‡Tm‡Tf‡T_‡TX‡TQ‡TJ‡TC‡T<‡T5‡T.‡T'‡T ‡T‡T‡T ‡T‡Tý†Tö†Tï†Tè†Tá†TÚ†TÓ†T̆TņT¾†T·†T°†T©†T¢†T›†T”†T†T††T†Tx†Tq†Tj†Tc†T\†TU†TN†TG†T@†T9†T2†T+†T$†T†T†T†T†T†Tú…Tó…Tì…Tå…TÞ…T×…TÐ…TÉ…TÂ…T»…T´…T­…T¦…TŸ…T˜…T‘…TŠ…Tƒ…T|…Tu…Tn…Tg…T`…TY…TR…TK…TD…T=…T6…T/…T(…T!…T…T…T …T…Tþ„T÷„Tð„Té„Tâ„TÛ„TÔ„TÍ„TÆ„T¿„T¸„T±„Tª„T£„Tœ„T•„TŽ„T‡„T€„Ty„Tr„Tk„Td„T]„TV„TO„TH„TA„T:„T3„T,„T%„T„T„T„T „T„TûƒTôƒTíƒTæƒT߃T؃TуTʃTÃT¼ƒTµƒT®ƒT§ƒT ƒT™ƒT’ƒT‹ƒT„ƒT}ƒTvƒToƒThƒTaƒTZƒTSƒTLƒTEƒT>ƒT7ƒT0ƒT)ƒT"ƒTƒTƒT ƒTƒTÿ‚Tø‚Tñ‚Tê‚Tã‚TÜ‚TÕ‚T΂TÇ‚TÀ‚T¹‚T²‚T«‚T¤‚T‚T–‚T‚Tˆ‚T‚Tz‚Ts‚Tl‚Te‚T^‚TW‚TP‚TI‚TB‚T;‚T4‚T-‚T&‚T‚T‚T‚T ‚T‚TüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTù€Tò€Të€Tä€TÝ€TÖ€TÏ€TÈ€TÁ€Tº€T³€T¬€T¥€Tž€T—€T€T‰€T‚€T{€Tt€Tm€Tf€T_€TX€TQ€TJ€TC€T<€T5€T.€T'€T €T€T€T €T€TýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTú~Tó~Tì~Tå~TÞ~T×~TÐ~TÉ~TÂ~T»~T´~T­~T¦~TŸ~T˜~T‘~TŠ~Tƒ~T|~Tu~Tn~Tg~T`~TY~TR~TK~TD~T=~T6~T/~T(~T!~T~T~T ~T~Tþ}T÷}Tð}Té}Tâ}TÛ}TÔ}TÍ}TÆ}T¿}T¸}T±}Tª}T£}Tœ}T•}TŽ}T‡}T€}Ty}Tr}Tk}Td}T]}TV}TO}TH}TA}T:}T3}T,}T%}T}T}T}T }T}Tû|Tô|Tí|Tæ|Tß|TØ|TÑ|TÊ|TÃ|T¼|Tµ|T®|T§|T |T™|T’|T‹|T„|T}|Tv|To|Th|Ta|TZ|TS|TL|TE|T>|T7|T0|T)|T"|T|T|T |T|Tÿ{Tø{Tñ{Tê{Tã{TÜ{TÕ{TÎ{TÇ{TÀ{T¹{T²{T«{T¤{T{T–{T{Tˆ{T{Tz{Ts{Tl{Te{T^{TW{TP{TI{TB{T;{T4{T-{T&{T{T{T{T {T{TüzTõzTîzTçzTàzTÙzTÒzTËzTÄzT½zT¶zT¯zT¨zT¡zTšzT“zTŒzT…zT~zTwzTpzTizTbzT[zTTzTMzTFzT?zT8zT1zT*zT#zTzTzTzTzTzTùyTòyTëyTäyTÝyTÖyTÏyTÈyTÁyTºyT³yT¬yT¥yTžyT—yTyT‰yT‚yT{yTtyTmyTfyT_yTXyTQyTJyTCyTuT7uT0uT)uT"uTuTuT uTuTÿtTøtTñtTêtTãtTÜtTÕtTÎtTÇtTÀtT¹tT²tT«tT¤tTtT–tTtTˆtTtTztTstTltTetT^tTWtTPtTItTBtT;tT4tT-tT&tTtTtTtT tTtTüsTõsTîsTçsTàsTÙsTÒsTËsTÄsT½sT¶sT¯sT¨sT¡sTšsT“sTŒsT…sT~sTwsTpsTisTbsT[sTTsTMsTFsT?sT8sT1sT*sT#sTsTsTsTsTsTùrTòrTërTärTÝrTÖrTÏrTÈrTÁrTºrT³rT¬rT¥rTžrT—rTrT‰rT‚rT{rTtrTmrTfrT_rTXrTQrTJrTCrTnT7nT0nT)nT"nTnTnT nTnTÿmTømTñmTêmTãmTÜmTÕmTÎmTÇmTÀmT¹mT²mT«mT¤mTmT–mTmTˆmTmTzmTsmTlmTemT^mTWmTPmTImTBmT;mT4mT-mT&mTmTmTmT mTmTülTõlTîlTçlTàlTÙlTÒlTËlTÄlT½lT¶lT¯lT¨lT¡lTšlT“lTŒlT…lT~lTwlTplTilTblT[lTTlTMlTFlT?lT8lT1lT*lT#lTlTlTlTlTlTùkTòkTëkTäkTÝkTÖkTÏkTÈkTÁkTºkT³kT¬kT¥kTžkT—kTkT‰kT‚kT{kTtkTmkTfkT_kTXkTQkTJkTCkTgT7gT0gT)gT"gTgTgT gTgTÿfTøfTñfTêfTãfTÜfTÕfTÎfTÇfTÀfT¹fT²fT«fT¤fTfT–fTfTˆfTfTzfTsfTlfTefT^fTWfTPfTIfTBfT;fT4fT-fT&fTfTfTfT fTfTüeTõeTîeTçeTàeTÙeTÒeTËeTÄeT½eT¶eT¯eT¨eT¡eTšeT“eTŒeT…eT~eTweTpeTieTbeT[eTTeTMeTFeT?eT8eT1eT*eT#eTeTeTeTeTeTùdTòdTëdTädTÝdTÖdTÏdTÈdTÁdTºdT³dT¬dT¥dTždT—dTdT‰dT‚dT{dTtdTmdTfdT_dTXdTQdTJdTCdT`T7`T0`T)`T"`T`T`T `T`Tÿ_Tø_Tñ_Tê_Tã_TÜ_TÕ_TÎ_TÇ_TÀ_T¹_T²_T«_T¤_T_T–_T_Tˆ_T_Tz_Ts_Tl_Te_T^_TW_TP_TI_TB_T;_T4_T-_T&_T_T_T_T _T_Tü^Tõ^Tî^Tç^Tà^TÙ^TÒ^TË^TÄ^T½^T¶^T¯^T¨^T¡^Tš^T“^TŒ^T…^T~^Tw^Tp^Ti^Tb^T[^TT^TM^TF^T?^T8^T1^T*^T#^T^T^T^T^T^Tù]Tò]Të]Tä]TÝ]TÖ]TÏ]TÈ]TÁ]Tº]T³]T¬]T¥]Tž]T—]T]T‰]T‚]T{]Tt]Tm]Tf]T_]TX]TQ]TJ]TC]T<]T5]T.]T']T ]T]T]T ]T]Tý\Tö\Tï\Tè\Tá\TÚ\TÓ\TÌ\TÅ\T¾\T·\T°\T©\T¢\T›\T”\T\T†\T\Tx\Tq\Tj\Tc\T\\TU\TN\TG\T@\T9\T2\T+\T$\T\T\T\T\T\Tú[Tó[Tì[Tå[TÞ[T×[TÐ[TÉ[TÂ[T»[T´[T­[T¦[TŸ[T˜[T‘[TŠ[Tƒ[T|[Tu[Tn[Tg[T`[TY[TR[TK[TD[T=[T6[T/[T([T![T[T[T [T[TþZT÷ZTðZTéZTâZTÛZTÔZTÍZTÆZT¿ZT¸ZT±ZTªZT£ZTœZT•ZTŽZT‡ZT€ZTyZTrZTkZTdZT]ZTVZTOZTHZTAZT:ZT3ZT,ZT%ZTZTZTZT ZTZTûYTôYTíYTæYTßYTØYTÑYTÊYTÃYT¼YTµYT®YT§YT YT™YT’YT‹YT„YT}YTvYToYThYTaYTZYTSYTLYTEYT>YT7YT0YT)YT"YTYTYT YTYTÿXTøXTñXTêXTãXTÜXTÕXTÎXTÇXTÀXT¹XT²XT«XT¤XTXT–XTXTˆXTXTzXTsXTlXTeXT^XTWXTPXTIXTBXT;XT4XT-XT&XTXTXTXT XTXTüWTõWTîWTçWTàWTÙWTÒWTËWTÄWT½WT¶WT¯WT¨WT¡WTšWT“WTŒWT…WT~WTwWTpWTiWTbWT[WTTWTMWTFWT?WT8WT1WT*WT#WTWTWTWTWTWTùVTòVTëVTäVTÝVTÖVTÏVTÈVTÁVTºVT³VT¬VT¥VTžVT—VTVT‰VT‚VT{VTtVTmVTfVT_VTXVTQVTJVTCVTRT7RT0RT)RT"RTRTRT RTRTÿQTøQTñQTêQTãQTÜQTÕQTÎQTÇQTÀQT¹QT²QT«QT¤QTQT–QTQTˆQTQTzQTsQTlQTeQT^QTWQTPQTIQTBQT;QT4QT-QT&QTQTQTQT QTQTüPTõPTîPTçPTàPTÙPTÒPTËPTÄPT½PT¶PT¯PT¨PT¡PTšPT“PTŒPT…PT~PTwPTpPTiPTbPT[PTTPTMPTFPT?PT8PT1PT*PT#PTPTPTPTPTPTùOTòOTëOTäOTÝOTÖOTÏOTÈOTÁOTºOT³OT¬OT¥OTžOT—OTOT‰OT‚OT{OTtOTmOTfOT_OTXOTQOTJOTCOTKT7KT0KT)KT"KTKTKT KTKTÿJTøJTñJTêJTãJTÜJTÕJTÎJTÇJTÀJT¹JT²JT«JT¤JTJT–JTJTˆJTJTzJTsJTlJTeJT^JTWJTPJTIJTBJT;JT4JT-JT&JTJTJTJT JTJTüITõITîITçITàITÙITÒITËITÄIT½IT¶IT¯IT¨IT¡ITšIT“ITŒIT…IT~ITwITpITiITbIT[ITTITMITFIT?IT8IT1IT*IT#ITITITITITITùHTòHTëHTäHTÝHTÖHTÏHTÈHTÁHTºHT³HT¬HT¥HTžHT—HTHT‰HT‚HT{HTtHTmHTfHT_HTXHTQHTJHTCHTDT7DT0DT)DT"DTDTDT DTDTÿCTøCTñCTêCTãCTÜCTÕCTÎCTÇCTÀCT¹CT²CT«CT¤CTCT–CTCTˆCTCTzCTsCTlCTeCT^CTWCTPCTICTBCT;CT4CT-CT&CTCTCTCT CTCTüBTõBTîBTçBTàBTÙBTÒBTËBTÄBT½BT¶BT¯BT¨BT¡BTšBT“BTŒBT…BT~BTwBTpBTiBTbBT[BTTBTMBTFBT?BT8BT1BT*BT#BTBTBTBTBTBTùATòATëATäATÝATÖATÏATÈATÁATºAT³AT¬AT¥ATžAT—ATAT‰AT‚AT{ATtATmATfAT_ATXATQATJATCATT÷>Tð>Té>Tâ>TÛ>TÔ>TÍ>TÆ>T¿>T¸>T±>Tª>T£>Tœ>T•>TŽ>T‡>T€>Ty>Tr>Tk>Td>T]>TV>TO>TH>TA>T:>T3>T,>T%>T>T>T>T >T>Tû=Tô=Tí=Tæ=Tß=TØ=TÑ=TÊ=TÃ=T¼=Tµ=T®=T§=T =T™=T’=T‹=T„=T}=Tv=To=Th=Ta=TZ=TS=TL=TE=T>=T7=T0=T)=T"=T=T=T =T=Tÿ6T76T06T)6T"6T6T6T 6T6Tÿ5Tø5Tñ5Tê5Tã5TÜ5TÕ5TÎ5TÇ5TÀ5T¹5T²5T«5T¤5T5T–5T5Tˆ5T5Tz5Ts5Tl5Te5T^5TW5TP5TI5TB5T;5T45T-5T&5T5T5T5T 5T5Tü4Tõ4Tî4Tç4Tà4TÙ4TÒ4TË4TÄ4T½4T¶4T¯4T¨4T¡4Tš4T“4TŒ4T…4T~4Tw4Tp4Ti4Tb4T[4TT4TM4TF4T?4T84T14T*4T#4T4T4T4T4T4Tù3Tò3Të3Tä3TÝ3TÖ3TÏ3TÈ3TÁ3Tº3T³3T¬3T¥3Tž3T—3T3T‰3T‚3T{3Tt3Tm3Tf3T_3TX3TQ3TJ3TC3T<3T53T.3T'3T 3T3T3T 3T3Tý2Tö2Tï2Tè2Tá2TÚ2TÓ2TÌ2TÅ2T¾2T·2T°2T©2T¢2T›2T”2T2T†2T2Tx2Tq2Tj2Tc2T\2TU2TN2TG2T@2T92T22T+2T$2T2T2T2T2T2Tú1Tó1Tì1Tå1TÞ1T×1TÐ1TÉ1TÂ1T»1T´1T­1T¦1TŸ1T˜1T‘1TŠ1Tƒ1T|1Tu1Tn1Tg1T`1TY1TR1TK1TD1T=1T61T/1T(1T!1T1T1T 1T1Tþ0T÷0Tð0Té0Tâ0TÛ0TÔ0TÍ0TÆ0T¿0T¸0T±0Tª0T£0Tœ0T•0TŽ0T‡0T€0Ty0Tr0Tk0Td0T]0TV0TO0TH0TA0T:0T30T,0T%0T0T0T0T 0T0Tû/Tô/Tí/Tæ/Tß/TØ/TÑ/TÊ/TÃ/T¼/Tµ/T®/T§/T /T™/T’/T‹/T„/T}/Tv/To/Th/Ta/TZ/TS/TL/TE/T>/T7/T0/T)/T"/T/T/T /T/Tÿ.Tø.Tñ.Tê.Tã.TÜ.TÕ.TÎ.TÇ.TÀ.T¹.T².T«.T¤.T.T–.T.Tˆ.T.Tz.Ts.Tl.Te.T^.TW.TP.TI.TB.T;.T4.T-.T&.T.T.T.T .T.Tü-Tõ-Tî-Tç-Tà-TÙ-TÒ-TË-TÄ-T½-T¶-T¯-T¨-T¡-Tš-T“-TŒ-T…-T~-Tw-Tp-Ti-Tb-T[-TT-TM-TF-T?-T8-T1-T*-T#-T-T-T-T-T-Tù,Tò,Të,Tä,TÝ,TÖ,TÏ,TÈ,TÁ,Tº,T³,T¬,T¥,Tž,T—,T,T‰,T‚,T{,Tt,Tm,Tf,T_,TX,TQ,TJ,TC,T<,T5,T.,T',T ,T,T,T ,T,Tý+Tö+Tï+Tè+Tá+TÚ+TÓ+TÌ+TÅ+T¾+T·+T°+T©+T¢+T›+T”+T+T†+T+Tx+Tq+Tj+Tc+T\+TU+TN+TG+T@+T9+T2+T++T$+T+T+T+T+T+Tú*Tó*Tì*Tå*TÞ*T×*TÐ*TÉ*TÂ*T»*T´*T­*T¦*TŸ*T˜*T‘*TŠ*Tƒ*T|*Tu*Tn*Tg*T`*TY*TR*TK*TD*T=*T6*T/*T(*T!*T*T*T *T*Tþ)T÷)Tð)Té)Tâ)TÛ)TÔ)TÍ)TÆ)T¿)T¸)T±)Tª)T£)Tœ)T•)TŽ)T‡)T€)Ty)Tr)Tk)Td)T])TV)TO)TH)TA)T:)T3)T,)T%)T)T)T)T )T)Tû(Tô(Tí(Tæ(Tß(TØ(TÑ(TÊ(TÃ(T¼(Tµ(T®(T§(T (T™(T’(T‹(T„(T}(Tv(To(Th(Ta(TZ(TS(TL(TE(T>(T7(T0(T)(T"(T(T(T (T(Tÿ'Tø'Tñ'Tê'Tã'TÜ'TÕ'TÎ'TÇ'TÀ'T¹'T²'T«'T¤'T'T–'T'Tˆ'T'Tz'Ts'Tl'Te'T^'TW'TP'TI'TB'T;'T4'T-'T&'T'T'T'T 'T'Tü&Tõ&Tî&Tç&Tà&TÙ&TÒ&TË&TÄ&T½&T¶&T¯&T¨&T¡&Tš&T“&TŒ&T…&T~&Tw&Tp&Ti&Tb&T[&TT&TM&TF&T?&T8&T1&T*&T#&T&T&T&T&T&Tù%Tò%Të%Tä%TÝ%TÖ%TÏ%TÈ%TÁ%Tº%T³%T¬%T¥%Tž%T—%T%T‰%T‚%T{%Tt%Tm%Tf%T_%TX%TQ%TJ%TC%T<%T5%T.%T'%T %T%T%T %T%Tý$Tö$Tï$Tè$Tá$TÚ$TÓ$TÌ$TÅ$T¾$T·$T°$T©$T¢$T›$T”$T$T†$T$Tx$Tq$Tj$Tc$T\$TU$TN$TG$T@$T9$T2$T+$T$$T$T$T$T$T$Tú#Tó#Tì#Tå#TÞ#T×#TÐ#TÉ#TÂ#T»#T´#T­#T¦#TŸ#T˜#T‘#TŠ#Tƒ#T|#Tu#Tn#Tg#T`#TY#TR#TK#TD#T=#T6#T/#T(#T!#T#T#T #T#Tþ"T÷"Tð"Té"Tâ"TÛ"TÔ"TÍ"TÆ"T¿"T¸"T±"Tª"T£"Tœ"T•"TŽ"T‡"T€"Ty"Tr"Tk"Td"T]"TV"TO"TH"TA"T:"T3"T,"T%"T"T"T"T "T"Tû!Tô!Tí!Tæ!Tß!TØ!TÑ!TÊ!TÃ!T¼!Tµ!T®!T§!T !T™!T’!T‹!T„!T}!Tv!To!Th!Ta!TZ!TS!TL!TE!T>!T7!T0!T)!T"!T!T!T !T!Tÿ Tø Tñ Tê Tã TÜ TÕ TÎ TÇ TÀ T¹ T² T« T¤ T T– T Tˆ T Tz Ts Tl Te T^ TW TP TI TB T; T4 T- T& T T T T T TüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúTóTìTåTÞT×TÐTÉTÂT»T´T­T¦TŸT˜T‘TŠTƒT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTþT÷TðTéTâTÛTÔTÍTÆT¿T¸T±TªT£TœT•TŽT‡T€TyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTûTôTíTæTßTØTÑTÊTÃT¼TµT®T§T T™T’T‹T„T}TvToThTaTZTSTLTET>T7T0T)T"TTT TTÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúTóTìTåTÞT×TÐTÉTÂT»T´T­T¦TŸT˜T‘TŠTƒT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTþT÷TðTéTâTÛTÔTÍTÆT¿T¸T±TªT£TœT•TŽT‡T€TyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTûTôTíTæTßTØTÑTÊTÃT¼TµT®T§T T™T’T‹T„T}TvToThTaTZTSTLTET>T7T0T)T"TTT TTÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúTóTìTåTÞT×TÐTÉTÂT»T´T­T¦TŸT˜T‘TŠTƒT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTþ T÷ Tð Té Tâ TÛ TÔ TÍ TÆ T¿ T¸ T± Tª T£ Tœ T• TŽ T‡ T€ Ty Tr Tk Td T] TV TO TH TA T: T3 T, T% T T T T T Tû Tô Tí Tæ Tß TØ TÑ TÊ Tà T¼ Tµ T® T§ T  T™ T’ T‹ T„ T} Tv To Th Ta TZ TS TL TE T> T7 T0 T) T" T T T T Tÿ Tø Tñ Tê Tã TÜ TÕ TÎ TÇ TÀ T¹ T² T« T¤ T T– T Tˆ T Tz Ts Tl Te T^ TW TP TI TB T; T4 T- T& T T T T T Tü Tõ Tî Tç Tà TÙ TÒ TË TÄ T½ T¶ T¯ T¨ T¡ Tš T“ TŒ T… T~ Tw Tp Ti Tb T[ TT TM TF T? T8 T1 T* T# T T T T T Tù Tò Të Tä TÝ TÖ TÏ TÈ TÁ Tº T³ T¬ T¥ Tž T— T T‰ T‚ T{ Tt Tm Tf T_ TX TQ TJ TC T< T5 T. T' T T T T T TýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúTóTìTåTÞT×TÐTÉTÂT»T´T­T¦TŸT˜T‘TŠTƒT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTþT÷TðTéTâTÛTÔTÍTÆT¿T¸T±TªT£TœT•TŽT‡T€TyTrTkTdT]TVTOTHTAT:T3T,T%TTTT TTûTôTíTæTßTØTÑTÊTÃT¼TµT®T§T T™T’T‹T„T}TvToThTaTZTSTLTET>T7T0T)T"TTT TTÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCT<T5T.T'T TTT TTýTöTïTèTáTÚTÓTÌTÅT¾T·T°T©T¢T›T”TT†TTxTqTjTcT\TUTNTGT@T9T2T+T$TTTTTTúTóTìTåTÞT×TÐTÉTÂT»T´T­T¦TŸT˜T‘TŠTƒT|TuTnTgT`TYTRTKTDT=T6T/T(T!TTT TTþÿS÷ÿSðÿSéÿSâÿSÛÿSÔÿSÍÿSÆÿS¿ÿS¸ÿS±ÿSªÿS£ÿSœÿS•ÿSŽÿS‡ÿS€ÿSyÿSrÿSkÿSdÿS]ÿSVÿSOÿSHÿSAÿS:ÿS3ÿS,ÿS%ÿSÿSÿSÿS ÿSÿSûþSôþSíþSæþSßþSØþSÑþSÊþSÃþS¼þSµþS®þS§þS þS™þS’þS‹þS„þS}þSvþSoþShþSaþSZþSSþSLþSEþS>þS7þS0þS)þS"þSþSþS þSþSÿýSøýSñýSêýSãýSÜýSÕýSÎýSÇýSÀýS¹ýS²ýS«ýS¤ýSýS–ýSýSˆýSýSzýSsýSlýSeýS^ýSWýSPýSIýSBýS;ýS4ýS-ýS&ýSýSýSýS ýSýSüüSõüSîüSçüSàüSÙüSÒüSËüSÄüS½üS¶üS¯üS¨üS¡üSšüS“üSŒüS…üS~üSwüSpüSiüSbüS[üSTüSMüSFüS?üS8üS1üS*üS#üSüSüSüSüSüSùûSòûSëûSäûSÝûSÖûSÏûSÈûSÁûSºûS³ûS¬ûS¥ûSžûS—ûSûS‰ûS‚ûS{ûStûSmûSfûS_ûSXûSQûSJûSCûS<ûS5ûS.ûS'ûS ûSûSûS ûSûSýúSöúSïúSèúSáúSÚúSÓúSÌúSÅúS¾úS·úS°úS©úS¢úS›úS”úSúS†úSúSxúSqúSjúScúS\úSUúSNúSGúS@úS9úS2úS+úS$úSúSúSúSúSúSúùSóùSìùSåùSÞùS×ùSÐùSÉùSÂùS»ùS´ùS­ùS¦ùSŸùS˜ùS‘ùSŠùSƒùS|ùSuùSnùSgùS`ùSYùSRùSKùSDùS=ùS6ùS/ùS(ùS!ùSùSùS ùSùSþøS÷øSðøSéøSâøSÛøSÔøSÍøSÆøS¿øS¸øS±øSªøS£øSœøS•øSŽøS‡øS€øSyøSrøSkøSdøS]øSVøSOøSHøSAøS:øS3øS,øS%øSøSøSøS øSøSû÷Sô÷Sí÷Sæ÷Sß÷SØ÷SÑ÷SÊ÷SÃ÷S¼÷Sµ÷S®÷S§÷S ÷S™÷S’÷S‹÷S„÷S}÷Sv÷So÷Sh÷Sa÷SZ÷SS÷SL÷SE÷S>÷S7÷S0÷S)÷S"÷S÷S÷S ÷S÷SÿöSøöSñöSêöSãöSÜöSÕöSÎöSÇöSÀöS¹öS²öS«öS¤öSöS–öSöSˆöSöSzöSsöSlöSeöS^öSWöSPöSIöSBöS;öS4öS-öS&öSöSöSöS öSöSüõSõõSîõSçõSàõSÙõSÒõSËõSÄõS½õS¶õS¯õS¨õS¡õSšõS“õSŒõS…õS~õSwõSpõSiõSbõS[õSTõSMõSFõS?õS8õS1õS*õS#õSõSõSõSõSõSùôSòôSëôSäôSÝôSÖôSÏôSÈôSÁôSºôS³ôS¬ôS¥ôSžôS—ôSôS‰ôS‚ôS{ôStôSmôSfôS_ôSXôSQôSJôSCôS<ôS5ôS.ôS'ôS ôSôSôS ôSôSýóSöóSïóSèóSáóSÚóSÓóSÌóSÅóS¾óS·óS°óS©óS¢óS›óS”óSóS†óSóSxóSqóSjóScóS\óSUóSNóSGóS@óS9óS2óS+óS$óSóSóSóSóSóSúòSóòSìòSåòSÞòS×òSÐòSÉòSÂòS»òS´òS­òS¦òSŸòS˜òS‘òSŠòSƒòS|òSuòSnòSgòS`òSYòSRòSKòSDòS=òS6òS/òS(òS!òSòSòS òSòSþñS÷ñSðñSéñSâñSÛñSÔñSÍñSÆñS¿ñS¸ñS±ñSªñS£ñSœñS•ñSŽñS‡ñS€ñSyñSrñSkñSdñS]ñSVñSOñSHñSAñS:ñS3ñS,ñS%ñSñSñSñS ñSñSûðSôðSíðSæðSßðSØðSÑðSÊðSÃðS¼ðSµðS®ðS§ðS ðS™ðS’ðS‹ðS„ðS}ðSvðSoðShðSaðSZðSSðSLðSEðS>ðS7ðS0ðS)ðS"ðSðSðS ðSðSÿïSøïSñïSêïSãïSÜïSÕïSÎïSÇïSÀïS¹ïS²ïS«ïS¤ïSïS–ïSïSˆïSïSzïSsïSlïSeïS^ïSWïSPïSIïSBïS;ïS4ïS-ïS&ïSïSïSïS ïSïSüîSõîSîîSçîSàîSÙîSÒîSËîSÄîS½îS¶îS¯îS¨îS¡îSšîS“îSŒîS…îS~îSwîSpîSiîSbîS[îSTîSMîSFîS?îS8îS1îS*îS#îSîSîSîSîSîSùíSòíSëíSäíSÝíSÖíSÏíSÈíSÁíSºíS³íS¬íS¥íSžíS—íSíS‰íS‚íS{íStíSmíSfíS_íSXíSQíSJíSCíS<íS5íS.íS'íS íSíSíS íSíSýìSöìSïìSèìSáìSÚìSÓìSÌìSÅìS¾ìS·ìS°ìS©ìS¢ìS›ìS”ìSìS†ìSìSxìSqìSjìScìS\ìSUìSNìSGìS@ìS9ìS2ìS+ìS$ìSìSìSìSìSìSúëSóëSìëSåëSÞëS×ëSÐëSÉëSÂëS»ëS´ëS­ëS¦ëSŸëS˜ëS‘ëSŠëSƒëS|ëSuëSnëSgëS`ëSYëSRëSKëSDëS=ëS6ëS/ëS(ëS!ëSëSëS ëSëSþêS÷êSðêSéêSâêSÛêSÔêSÍêSÆêS¿êS¸êS±êSªêS£êSœêS•êSŽêS‡êS€êSyêSrêSkêSdêS]êSVêSOêSHêSAêS:êS3êS,êS%êSêSêSêS êSêSûéSôéSíéSæéSßéSØéSÑéSÊéSÃéS¼éSµéS®éS§éS éS™éS’éS‹éS„éS}éSvéSoéShéSaéSZéSSéSLéSEéS>éS7éS0éS)éS"éSéSéS éSéSÿèSøèSñèSêèSãèSÜèSÕèSÎèSÇèSÀèS¹èS²èS«èS¤èSèS–èSèSˆèSèSzèSsèSlèSeèS^èSWèSPèSIèSBèS;èS4èS-èS&èSèSèSèS èSèSüçSõçSîçSççSàçSÙçSÒçSËçSÄçS½çS¶çS¯çS¨çS¡çSšçS“çSŒçS…çS~çSwçSpçSiçSbçS[çSTçSMçSFçS?çS8çS1çS*çS#çSçSçSçSçSçSùæSòæSëæSäæSÝæSÖæSÏæSÈæSÁæSºæS³æS¬æS¥æSžæS—æSæS‰æS‚æS{æStæSmæSfæS_æSXæSQæSJæSCæS<æS5æS.æS'æS æSæSæS æSæSýåSöåSïåSèåSáåSÚåSÓåSÌåSÅåS¾åS·åS°åS©åS¢åS›åS”åSåS†åSåSxåSqåSjåScåS\åSUåSNåSGåS@åS9åS2åS+åS$åSåSåSåSåSåSúäSóäSìäSåäSÞäS×äSÐäSÉäSÂäS»äS´äS­äS¦äSŸäS˜äS‘äSŠäSƒäS|äSuäSnäSgäS`äSYäSRäSKäSDäS=äS6äS/äS(äS!äSäSäS äSäSþãS÷ãSðãSéãSâãSÛãSÔãSÍãSÆãS¿ãS¸ãS±ãSªãS£ãSœãS•ãSŽãS‡ãS€ãSyãSrãSkãSdãS]ãSVãSOãSHãSAãS:ãS3ãS,ãS%ãSãSãSãS ãSãSûâSôâSíâSæâSßâSØâSÑâSÊâSÃâS¼âSµâS®âS§âS âS™âS’âS‹âS„âS}âSvâSoâShâSaâSZâSSâSLâSEâS>âS7âS0âS)âS"âSâSâS âSâSÿáSøáSñáSêáSãáSÜáSÕáSÎáSÇáSÀáS¹áS²áS«áS¤áSáS–áSáSˆáSáSzáSsáSláSeáS^áSWáSPáSIáSBáS;áS4áS-áS&áSáSáSáS áSáSüàSõàSîàSçàSààSÙàSÒàSËàSÄàS½àS¶àS¯àS¨àS¡àSšàS“àSŒàS…àS~àSwàSpàSiàSbàS[àSTàSMàSFàS?àS8àS1àS*àS#àSàSàSàSàSàSùßSòßSëßSäßSÝßSÖßSÏßSÈßSÁßSºßS³ßS¬ßS¥ßSžßS—ßSßS‰ßS‚ßS{ßStßSmßSfßS_ßSXßSQßSJßSCßS<ßS5ßS.ßS'ßS ßSßSßS ßSßSýÞSöÞSïÞSèÞSáÞSÚÞSÓÞSÌÞSÅÞS¾ÞS·ÞS°ÞS©ÞS¢ÞS›ÞS”ÞSÞS†ÞSÞSxÞSqÞSjÞScÞS\ÞSUÞSNÞSGÞS@ÞS9ÞS2ÞS+ÞS$ÞSÞSÞSÞSÞSÞSúÝSóÝSìÝSåÝSÞÝS×ÝSÐÝSÉÝSÂÝS»ÝS´ÝS­ÝS¦ÝSŸÝS˜ÝS‘ÝSŠÝSƒÝS|ÝSuÝSnÝSgÝS`ÝSYÝSRÝSKÝSDÝS=ÝS6ÝS/ÝS(ÝS!ÝSÝSÝS ÝSÝSþÜS÷ÜSðÜSéÜSâÜSÛÜSÔÜSÍÜSÆÜS¿ÜS¸ÜS±ÜSªÜS£ÜSœÜS•ÜSŽÜS‡ÜS€ÜSyÜSrÜSkÜSdÜS]ÜSVÜSOÜSHÜSAÜS:ÜS3ÜS,ÜS%ÜSÜSÜSÜS ÜSÜSûÛSôÛSíÛSæÛSßÛSØÛSÑÛSÊÛSÃÛS¼ÛSµÛS®ÛS§ÛS ÛS™ÛS’ÛS‹ÛS„ÛS}ÛSvÛSoÛShÛSaÛSZÛSSÛSLÛSEÛS>ÛS7ÛS0ÛS)ÛS"ÛSÛSÛS ÛSÛSÿÚSøÚSñÚSêÚSãÚSÜÚSÕÚSÎÚSÇÚSÀÚS¹ÚS²ÚS«ÚS¤ÚSÚS–ÚSÚSˆÚSÚSzÚSsÚSlÚSeÚS^ÚSWÚSPÚSIÚSBÚS;ÚS4ÚS-ÚS&ÚSÚSÚSÚS ÚSÚSüÙSõÙSîÙSçÙSàÙSÙÙSÒÙSËÙSÄÙS½ÙS¶ÙS¯ÙS¨ÙS¡ÙSšÙS“ÙSŒÙS…ÙS~ÙSwÙSpÙSiÙSbÙS[ÙSTÙSMÙSFÙS?ÙS8ÙS1ÙS*ÙS#ÙSÙSÙSÙSÙSÙSùØSòØSëØSäØSÝØSÖØSÏØSÈØSÁØSºØS³ØS¬ØS¥ØSžØS—ØSØS‰ØS‚ØS{ØStØSmØSfØS_ØSXØSQØSJØSCØS<ØS5ØS.ØS'ØS ØSØSØS ØSØSý×Sö×Sï×Sè×Sá×SÚ×SÓ×SÌ×SÅ×S¾×S·×S°×S©×S¢×S›×S”×S×S†×S×Sx×Sq×Sj×Sc×S\×SU×SN×SG×S@×S9×S2×S+×S$×S×S×S×S×S×SúÖSóÖSìÖSåÖSÞÖS×ÖSÐÖSÉÖSÂÖS»ÖS´ÖS­ÖS¦ÖSŸÖS˜ÖS‘ÖSŠÖSƒÖS|ÖSuÖSnÖSgÖS`ÖSYÖSRÖSKÖSDÖS=ÖS6ÖS/ÖS(ÖS!ÖSÖSÖS ÖSÖSþÕS÷ÕSðÕSéÕSâÕSÛÕSÔÕSÍÕSÆÕS¿ÕS¸ÕS±ÕSªÕS£ÕSœÕS•ÕSŽÕS‡ÕS€ÕSyÕSrÕSkÕSdÕS]ÕSVÕSOÕSHÕSAÕS:ÕS3ÕS,ÕS%ÕSÕSÕSÕS ÕSÕSûÔSôÔSíÔSæÔSßÔSØÔSÑÔSÊÔSÃÔS¼ÔSµÔS®ÔS§ÔS ÔS™ÔS’ÔS‹ÔS„ÔS}ÔSvÔSoÔShÔSaÔSZÔSSÔSLÔSEÔS>ÔS7ÔS0ÔS)ÔS"ÔSÔSÔS ÔSÔSÿÓSøÓSñÓSêÓSãÓSÜÓSÕÓSÎÓSÇÓSÀÓS¹ÓS²ÓS«ÓS¤ÓSÓS–ÓSÓSˆÓSÓSzÓSsÓSlÓSeÓS^ÓSWÓSPÓSIÓSBÓS;ÓS4ÓS-ÓS&ÓSÓSÓSÓS ÓSÓSüÒSõÒSîÒSçÒSàÒSÙÒSÒÒSËÒSÄÒS½ÒS¶ÒS¯ÒS¨ÒS¡ÒSšÒS“ÒSŒÒS…ÒS~ÒSwÒSpÒSiÒSbÒS[ÒSTÒSMÒSFÒS?ÒS8ÒS1ÒS*ÒS#ÒSÒSÒSÒSÒSÒSùÑSòÑSëÑSäÑSÝÑSÖÑSÏÑSÈÑSÁÑSºÑS³ÑS¬ÑS¥ÑSžÑS—ÑSÑS‰ÑS‚ÑS{ÑStÑSmÑSfÑS_ÑSXÑSQÑSJÑSCÑS<ÑS5ÑS.ÑS'ÑS ÑSÑSÑS ÑSÑSýÐSöÐSïÐSèÐSáÐSÚÐSÓÐSÌÐSÅÐS¾ÐS·ÐS°ÐS©ÐS¢ÐS›ÐS”ÐSÐS†ÐSÐSxÐSqÐSjÐScÐS\ÐSUÐSNÐSGÐS@ÐS9ÐS2ÐS+ÐS$ÐSÐSÐSÐSÐSÐSúÏSóÏSìÏSåÏSÞÏS×ÏSÐÏSÉÏSÂÏS»ÏS´ÏS­ÏS¦ÏSŸÏS˜ÏS‘ÏSŠÏSƒÏS|ÏSuÏSnÏSgÏS`ÏSYÏSRÏSKÏSDÏS=ÏS6ÏS/ÏS(ÏS!ÏSÏSÏS ÏSÏSþÎS÷ÎSðÎSéÎSâÎSÛÎSÔÎSÍÎSÆÎS¿ÎS¸ÎS±ÎSªÎS£ÎSœÎS•ÎSŽÎS‡ÎS€ÎSyÎSrÎSkÎSdÎS]ÎSVÎSOÎSHÎSAÎS:ÎS3ÎS,ÎS%ÎSÎSÎSÎS ÎSÎSûÍSôÍSíÍSæÍSßÍSØÍSÑÍSÊÍSÃÍS¼ÍSµÍS®ÍS§ÍS ÍS™ÍS’ÍS‹ÍS„ÍS}ÍSvÍSoÍShÍSaÍSZÍSSÍSLÍSEÍS>ÍS7ÍS0ÍS)ÍS"ÍSÍSÍS ÍSÍSÿÌSøÌSñÌSêÌSãÌSÜÌSÕÌSÎÌSÇÌSÀÌS¹ÌS²ÌS«ÌS¤ÌSÌS–ÌSÌSˆÌSÌSzÌSsÌSlÌSeÌS^ÌSWÌSPÌSIÌSBÌS;ÌS4ÌS-ÌS&ÌSÌSÌSÌS ÌSÌSüËSõËSîËSçËSàËSÙËSÒËSËËSÄËS½ËS¶ËS¯ËS¨ËS¡ËSšËS“ËSŒËS…ËS~ËSwËSpËSiËSbËS[ËSTËSMËSFËS?ËS8ËS1ËS*ËS#ËSËSËSËSËSËSùÊSòÊSëÊSäÊSÝÊSÖÊSÏÊSÈÊSÁÊSºÊS³ÊS¬ÊS¥ÊSžÊS—ÊSÊS‰ÊS‚ÊS{ÊStÊSmÊSfÊS_ÊSXÊSQÊSJÊSCÊS<ÊS5ÊS.ÊS'ÊS ÊSÊSÊS ÊSÊSýÉSöÉSïÉSèÉSáÉSÚÉSÓÉSÌÉSÅÉS¾ÉS·ÉS°ÉS©ÉS¢ÉS›ÉS”ÉSÉS†ÉSÉSxÉSqÉSjÉScÉS\ÉSUÉSNÉSGÉS@ÉS9ÉS2ÉS+ÉS$ÉSÉSÉSÉSÉSÉSúÈSóÈSìÈSåÈSÞÈS×ÈSÐÈSÉÈSÂÈS»ÈS´ÈS­ÈS¦ÈSŸÈS˜ÈS‘ÈSŠÈSƒÈS|ÈSuÈSnÈSgÈS`ÈSYÈSRÈSKÈSDÈS=ÈS6ÈS/ÈS(ÈS!ÈSÈSÈS ÈSÈSþÇS÷ÇSðÇSéÇSâÇSÛÇSÔÇSÍÇSÆÇS¿ÇS¸ÇS±ÇSªÇS£ÇSœÇS•ÇSŽÇS‡ÇS€ÇSyÇSrÇSkÇSdÇS]ÇSVÇSOÇSHÇSAÇS:ÇS3ÇS,ÇS%ÇSÇSÇSÇS ÇSÇSûÆSôÆSíÆSæÆS߯SØÆSÑÆSÊÆSÃÆS¼ÆSµÆS®ÆS§ÆS ÆS™ÆS’ÆS‹ÆS„ÆS}ÆSvÆSoÆShÆSaÆSZÆSSÆSLÆSEÆS>ÆS7ÆS0ÆS)ÆS"ÆSÆSÆS ÆSÆSÿÅSøÅSñÅSêÅSãÅSÜÅSÕÅSÎÅSÇÅSÀÅS¹ÅS²ÅS«ÅS¤ÅSÅS–ÅSÅSˆÅSÅSzÅSsÅSlÅSeÅS^ÅSWÅSPÅSIÅSBÅS;ÅS4ÅS-ÅS&ÅSÅSÅSÅS ÅSÅSüÄSõÄSîÄSçÄSàÄSÙÄSÒÄSËÄSÄÄS½ÄS¶ÄS¯ÄS¨ÄS¡ÄSšÄS“ÄSŒÄS…ÄS~ÄSwÄSpÄSiÄSbÄS[ÄSTÄSMÄSFÄS?ÄS8ÄS1ÄS*ÄS#ÄSÄSÄSÄSÄSÄSùÃSòÃSëÃSäÃSÝÃSÖÃSÏÃSÈÃSÁÃSºÃS³ÃS¬ÃS¥ÃSžÃS—ÃSÃS‰ÃS‚ÃS{ÃStÃSmÃSfÃS_ÃSXÃSQÃSJÃSCÃS<ÃS5ÃS.ÃS'ÃS ÃSÃSÃS ÃSÃSýÂSöÂSïÂSèÂSáÂSÚÂSÓÂSÌÂSÅÂS¾ÂS·ÂS°ÂS©ÂS¢ÂS›ÂS”ÂSÂS†ÂSÂSxÂSqÂSjÂScÂS\ÂSUÂSNÂSGÂS@ÂS9ÂS2ÂS+ÂS$ÂSÂSÂSÂSÂSÂSúÁSóÁSìÁSåÁSÞÁS×ÁSÐÁSÉÁSÂÁS»ÁS´ÁS­ÁS¦ÁSŸÁS˜ÁS‘ÁSŠÁSƒÁS|ÁSuÁSnÁSgÁS`ÁSYÁSRÁSKÁSDÁS=ÁS6ÁS/ÁS(ÁS!ÁSÁSÁS ÁSÁSþÀS÷ÀSðÀSéÀSâÀSÛÀSÔÀSÍÀSÆÀS¿ÀS¸ÀS±ÀSªÀS£ÀSœÀS•ÀSŽÀS‡ÀS€ÀSyÀSrÀSkÀSdÀS]ÀSVÀSOÀSHÀSAÀS:ÀS3ÀS,ÀS%ÀSÀSÀSÀS ÀSÀSû¿Sô¿Sí¿Sæ¿Sß¿SØ¿SÑ¿SÊ¿SÿS¼¿Sµ¿S®¿S§¿S ¿S™¿S’¿S‹¿S„¿S}¿Sv¿So¿Sh¿Sa¿SZ¿SS¿SL¿SE¿S>¿S7¿S0¿S)¿S"¿S¿S¿S ¿S¿Sÿ¾Sø¾Sñ¾Sê¾Sã¾SܾSÕ¾SξSǾSÀ¾S¹¾S²¾S«¾S¤¾S¾S–¾S¾Sˆ¾S¾Sz¾Ss¾Sl¾Se¾S^¾SW¾SP¾SI¾SB¾S;¾S4¾S-¾S&¾S¾S¾S¾S ¾S¾Sü½Sõ½Sî½Sç½Sà½SÙ½SÒ½S˽SĽS½½S¶½S¯½S¨½S¡½Sš½S“½SŒ½S…½S~½Sw½Sp½Si½Sb½S[½ST½SM½SF½S?½S8½S1½S*½S#½S½S½S½S½S½Sù¼Sò¼Së¼Sä¼SݼSÖ¼SϼSȼSÁ¼Sº¼S³¼S¬¼S¥¼Sž¼S—¼S¼S‰¼S‚¼S{¼St¼Sm¼Sf¼S_¼SX¼SQ¼SJ¼SC¼S<¼S5¼S.¼S'¼S ¼S¼S¼S ¼S¼Sý»Sö»Sï»Sè»Sá»SÚ»SÓ»SÌ»SÅ»S¾»S·»S°»S©»S¢»S›»S”»S»S†»S»Sx»Sq»Sj»Sc»S\»SU»SN»SG»S@»S9»S2»S+»S$»S»S»S»S»S»SúºSóºSìºSåºSÞºS׺SкSɺSºS»ºS´ºS­ºS¦ºSŸºS˜ºS‘ºSŠºSƒºS|ºSuºSnºSgºS`ºSYºSRºSKºSDºS=ºS6ºS/ºS(ºS!ºSºSºS ºSºSþ¹S÷¹Sð¹Sé¹Sâ¹SÛ¹SÔ¹S͹SƹS¿¹S¸¹S±¹Sª¹S£¹Sœ¹S•¹S޹S‡¹S€¹Sy¹Sr¹Sk¹Sd¹S]¹SV¹SO¹SH¹SA¹S:¹S3¹S,¹S%¹S¹S¹S¹S ¹S¹Sû¸Sô¸Sí¸Sæ¸S߸SظSѸSʸSøS¼¸Sµ¸S®¸S§¸S ¸S™¸S’¸S‹¸S„¸S}¸Sv¸So¸Sh¸Sa¸SZ¸SS¸SL¸SE¸S>¸S7¸S0¸S)¸S"¸S¸S¸S ¸S¸Sÿ·Sø·Sñ·Sê·Sã·SÜ·SÕ·SηSÇ·SÀ·S¹·S²·S«·S¤·S·S–·S·Sˆ·S·Sz·Ss·Sl·Se·S^·SW·SP·SI·SB·S;·S4·S-·S&·S·S·S·S ·S·Sü¶Sõ¶Sî¶Sç¶Sà¶SÙ¶SÒ¶S˶SĶS½¶S¶¶S¯¶S¨¶S¡¶Sš¶S“¶SŒ¶S…¶S~¶Sw¶Sp¶Si¶Sb¶S[¶ST¶SM¶SF¶S?¶S8¶S1¶S*¶S#¶S¶S¶S¶S¶S¶SùµSòµSëµSäµSݵSÖµSϵSȵSÁµSºµS³µS¬µS¥µSžµS—µSµS‰µS‚µS{µStµSmµSfµS_µSXµSQµSJµSCµS<µS5µS.µS'µS µSµSµS µSµSý´Sö´Sï´Sè´Sá´SÚ´SÓ´SÌ´SÅ´S¾´S·´S°´S©´S¢´S›´S”´S´S†´S´Sx´Sq´Sj´Sc´S\´SU´SN´SG´S@´S9´S2´S+´S$´S´S´S´S´S´Sú³Só³Sì³Så³SÞ³S׳SгSɳS³S»³S´³S­³S¦³SŸ³S˜³S‘³SгSƒ³S|³Su³Sn³Sg³S`³SY³SR³SK³SD³S=³S6³S/³S(³S!³S³S³S ³S³Sþ²S÷²Sð²Sé²Sâ²SÛ²SÔ²SͲSƲS¿²S¸²S±²Sª²S£²Sœ²S•²S޲S‡²S€²Sy²Sr²Sk²Sd²S]²SV²SO²SH²SA²S:²S3²S,²S%²S²S²S²S ²S²Sû±Sô±Sí±Sæ±Sß±SرSѱSʱSñS¼±Sµ±S®±S§±S ±S™±S’±S‹±S„±S}±Sv±So±Sh±Sa±SZ±SS±SL±SE±S>±S7±S0±S)±S"±S±S±S ±S±Sÿ°Sø°Sñ°Sê°Sã°SܰSÕ°SΰSǰSÀ°S¹°S²°S«°S¤°S°S–°S°Sˆ°S°Sz°Ss°Sl°Se°S^°SW°SP°SI°SB°S;°S4°S-°S&°S°S°S°S °S°Sü¯Sõ¯Sî¯Sç¯Sà¯SÙ¯SÒ¯S˯SįS½¯S¶¯S¯¯S¨¯S¡¯Sš¯S“¯SŒ¯S…¯S~¯Sw¯Sp¯Si¯Sb¯S[¯ST¯SM¯SF¯S?¯S8¯S1¯S*¯S#¯S¯S¯S¯S¯S¯Sù®Sò®Së®Sä®SÝ®SÖ®SÏ®SÈ®SÁ®Sº®S³®S¬®S¥®Sž®S—®S®S‰®S‚®S{®St®Sm®Sf®S_®SX®SQ®SJ®SC®S<®S5®S.®S'®S ®S®S®S ®S®Sý­Sö­Sï­Sè­Sá­SÚ­SÓ­SÌ­SÅ­S¾­S·­S°­S©­S¢­S›­S”­S­S†­S­Sx­Sq­Sj­Sc­S\­SU­SN­SG­S@­S9­S2­S+­S$­S­S­S­S­S­Sú¬Só¬Sì¬Så¬SÞ¬S׬SЬSɬS¬S»¬S´¬S­¬S¦¬SŸ¬S˜¬S‘¬SЬSƒ¬S|¬Su¬Sn¬Sg¬S`¬SY¬SR¬SK¬SD¬S=¬S6¬S/¬S(¬S!¬S¬S¬S ¬S¬Sþ«S÷«Sð«Sé«Sâ«SÛ«SÔ«SÍ«SÆ«S¿«S¸«S±«Sª«S£«Sœ«S•«SŽ«S‡«S€«Sy«Sr«Sk«Sd«S]«SV«SO«SH«SA«S:«S3«S,«S%«S«S«S«S «S«SûªSôªSíªSæªSߪSتSѪSʪSêS¼ªSµªS®ªS§ªS ªS™ªS’ªS‹ªS„ªS}ªSvªSoªShªSaªSZªSSªSLªSEªS>ªS7ªS0ªS)ªS"ªSªSªS ªSªSÿ©Sø©Sñ©Sê©Sã©SÜ©SÕ©SΩSÇ©SÀ©S¹©S²©S«©S¤©S©S–©S©Sˆ©S©Sz©Ss©Sl©Se©S^©SW©SP©SI©SB©S;©S4©S-©S&©S©S©S©S ©S©Sü¨Sõ¨Sî¨Sç¨Sà¨SÙ¨SÒ¨S˨SĨS½¨S¶¨S¯¨S¨¨S¡¨Sš¨S“¨SŒ¨S…¨S~¨Sw¨Sp¨Si¨Sb¨S[¨ST¨SM¨SF¨S?¨S8¨S1¨S*¨S#¨S¨S¨S¨S¨S¨Sù§Sò§Së§Sä§SݧSÖ§SϧSȧSÁ§Sº§S³§S¬§S¥§Sž§S—§S§S‰§S‚§S{§St§Sm§Sf§S_§SX§SQ§SJ§SC§S<§S5§S.§S'§S §S§S§S §S§Sý¦Sö¦Sï¦Sè¦Sá¦SÚ¦SÓ¦ȘSŦS¾¦S·¦S°¦S©¦S¢¦S›¦S”¦S¦S†¦S¦Sx¦Sq¦Sj¦Sc¦S\¦SU¦SN¦SG¦S@¦S9¦S2¦S+¦S$¦S¦S¦S¦S¦S¦Sú¥Só¥Sì¥Så¥SÞ¥S×¥SÐ¥SÉ¥SÂ¥S»¥S´¥S­¥S¦¥SŸ¥S˜¥S‘¥SŠ¥Sƒ¥S|¥Su¥Sn¥Sg¥S`¥SY¥SR¥SK¥SD¥S=¥S6¥S/¥S(¥S!¥S¥S¥S ¥S¥Sþ¤S÷¤Sð¤Sé¤Sâ¤SÛ¤SÔ¤SͤSƤS¿¤S¸¤S±¤Sª¤S£¤Sœ¤S•¤SޤS‡¤S€¤Sy¤Sr¤Sk¤Sd¤S]¤SV¤SO¤SH¤SA¤S:¤S3¤S,¤S%¤S¤S¤S¤S ¤S¤Sû£Sô£Sí£Sæ£SߣSØ£SÑ£SÊ£SãS¼£Sµ£S®£S§£S £S™£S’£S‹£S„£S}£Sv£So£Sh£Sa£SZ£SS£SL£SE£S>£S7£S0£S)£S"£S£S£S £S£Sÿ¢Sø¢Sñ¢Sê¢Sã¢SÜ¢SÕ¢S΢SÇ¢SÀ¢S¹¢S²¢S«¢S¤¢S¢S–¢S¢Sˆ¢S¢Sz¢Ss¢Sl¢Se¢S^¢SW¢SP¢SI¢SB¢S;¢S4¢S-¢S&¢S¢S¢S¢S ¢S¢Sü¡Sõ¡Sî¡Sç¡Sà¡SÙ¡SÒ¡SË¡SÄ¡S½¡S¶¡S¯¡S¨¡S¡¡Sš¡S“¡SŒ¡S…¡S~¡Sw¡Sp¡Si¡Sb¡S[¡ST¡SM¡SF¡S?¡S8¡S1¡S*¡S#¡S¡S¡S¡S¡S¡Sù Sò Së Sä SÝ SÖ SÏ SÈ SÁ Sº S³ S¬ S¥ Sž S— S S‰ S‚ S{ St Sm Sf S_ SX SQ SJ SC S< S5 S. S' S  S S S  S SýŸSöŸSïŸSèŸSáŸSÚŸSÓŸSÌŸSÅŸS¾ŸS·ŸS°ŸS©ŸS¢ŸS›ŸS”ŸSŸS†ŸSŸSxŸSqŸSjŸScŸS\ŸSUŸSNŸSGŸS@ŸS9ŸS2ŸS+ŸS$ŸSŸSŸSŸSŸSŸSúžSóžSìžSåžSÞžSמSОSÉžSžS»žS´žS­žS¦žSŸžS˜žS‘žSŠžSƒžS|žSužSnžSgžS`žSYžSRžSKžSDžS=žS6žS/žS(žS!žSžSžS žSžSþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûœSôœSíœSæœSßœSØœSÑœSÊœSÜS¼œSµœS®œS§œS œS™œS’œS‹œS„œS}œSvœSoœShœSaœSZœSSœSLœSEœS>œS7œS0œS)œS"œSœSœS œSœSÿ›Sø›Sñ›Sê›Sã›SÜ›SÕ›SΛSÇ›SÀ›S¹›S²›S«›S¤›S›S–›S›Sˆ›S›Sz›Ss›Sl›Se›S^›SW›SP›SI›SB›S;›S4›S-›S&›S›S›S›S ›S›SüšSõšSîšSçšSàšSÙšSÒšSËšSÄšS½šS¶šS¯šS¨šS¡šSššS“šSŒšS…šS~šSwšSpšSišSbšS[šSTšSMšSFšS?šS8šS1šS*šS#šSšSšSšSšSšSù™Sò™Së™Sä™SÝ™SÖ™SÏ™SÈ™SÁ™Sº™S³™S¬™S¥™Sž™S—™S™S‰™S‚™S{™St™Sm™Sf™S_™SX™SQ™SJ™SC™S<™S5™S.™S'™S ™S™S™S ™S™Sý˜Sö˜Sï˜Sè˜Sá˜SÚ˜SÓ˜S̘SŘS¾˜S·˜S°˜S©˜S¢˜S›˜S”˜S˜S†˜S˜Sx˜Sq˜Sj˜Sc˜S\˜SU˜SN˜SG˜S@˜S9˜S2˜S+˜S$˜S˜S˜S˜S˜S˜Sú—Só—Sì—Så—SÞ—S×—SЗSÉ—S—S»—S´—S­—S¦—SŸ—S˜—S‘—SŠ—Sƒ—S|—Su—Sn—Sg—S`—SY—SR—SK—SD—S=—S6—S/—S(—S!—S—S—S —S—Sþ–S÷–Sð–Sé–Sâ–SÛ–SÔ–SÍ–SÆ–S¿–S¸–S±–Sª–S£–Sœ–S•–SŽ–S‡–S€–Sy–Sr–Sk–Sd–S]–SV–SO–SH–SA–S:–S3–S,–S%–S–S–S–S –S–Sû•Sô•Sí•Sæ•Sß•SØ•SÑ•SÊ•SÕS¼•Sµ•S®•S§•S •S™•S’•S‹•S„•S}•Sv•So•Sh•Sa•SZ•SS•SL•SE•S>•S7•S0•S)•S"•S•S•S •S•Sÿ”Sø”Sñ”Sê”Sã”SÜ”SÕ”SΔSÇ”SÀ”S¹”S²”S«”S¤”S”S–”S”Sˆ”S”Sz”Ss”Sl”Se”S^”SW”SP”SI”SB”S;”S4”S-”S&”S”S”S”S ”S”Sü“Sõ“Sî“Sç“Sà“SÙ“SÒ“SË“SÄ“S½“S¶“S¯“S¨“S¡“Sš“S““SŒ“S…“S~“Sw“Sp“Si“Sb“S[“ST“SM“SF“S?“S8“S1“S*“S#“S“S“S“S“S“Sù’Sò’Së’Sä’SÝ’SÖ’SÏ’SÈ’SÁ’Sº’S³’S¬’S¥’Sž’S—’S’S‰’S‚’S{’St’Sm’Sf’S_’SX’SQ’SJ’SC’S<’S5’S.’S'’S ’S’S’S ’S’Sý‘Sö‘Sï‘Sè‘Sá‘SÚ‘SÓ‘SÌ‘SÅ‘S¾‘S·‘S°‘S©‘S¢‘S›‘S”‘S‘S†‘S‘Sx‘Sq‘Sj‘Sc‘S\‘SU‘SN‘SG‘S@‘S9‘S2‘S+‘S$‘S‘S‘S‘S‘S‘SúSóSìSåSÞS×SÐSÉSÂS»S´S­S¦SŸS˜S‘SŠSƒS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûŽSôŽSíŽSæŽSߎSØŽSÑŽSÊŽSÃŽS¼ŽSµŽS®ŽS§ŽS ŽS™ŽS’ŽS‹ŽS„ŽS}ŽSvŽSoŽShŽSaŽSZŽSSŽSLŽSEŽS>ŽS7ŽS0ŽS)ŽS"ŽSŽSŽS ŽSŽSÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüŒSõŒSîŒSçŒSàŒSÙŒSÒŒSËŒSÄŒS½ŒS¶ŒS¯ŒS¨ŒS¡ŒSšŒS“ŒSŒŒS…ŒS~ŒSwŒSpŒSiŒSbŒS[ŒSTŒSMŒSFŒS?ŒS8ŒS1ŒS*ŒS#ŒSŒSŒSŒSŒSŒSù‹Sò‹Së‹Sä‹SÝ‹SÖ‹SÏ‹SÈ‹SÁ‹Sº‹S³‹S¬‹S¥‹Sž‹S—‹S‹S‰‹S‚‹S{‹St‹Sm‹Sf‹S_‹SX‹SQ‹SJ‹SC‹S<‹S5‹S.‹S'‹S ‹S‹S‹S ‹S‹SýŠSöŠSïŠSèŠSáŠSÚŠSÓŠSÌŠSÅŠS¾ŠS·ŠS°ŠS©ŠS¢ŠS›ŠS”ŠSŠS†ŠSŠSxŠSqŠSjŠScŠS\ŠSUŠSNŠSGŠS@ŠS9ŠS2ŠS+ŠS$ŠSŠSŠSŠSŠSŠSú‰Só‰Sì‰Så‰SÞ‰S׉SЉSɉS‰S»‰S´‰S­‰S¦‰SŸ‰S˜‰S‘‰SЉSƒ‰S|‰Su‰Sn‰Sg‰S`‰SY‰SR‰SK‰SD‰S=‰S6‰S/‰S(‰S!‰S‰S‰S ‰S‰SþˆS÷ˆSðˆSéˆSâˆSÛˆSÔˆS͈SƈS¿ˆS¸ˆS±ˆSªˆS£ˆSœˆS•ˆSŽˆS‡ˆS€ˆSyˆSrˆSkˆSdˆS]ˆSVˆSOˆSHˆSAˆS:ˆS3ˆS,ˆS%ˆSˆSˆSˆS ˆSˆSû‡Sô‡Sí‡Sæ‡S߇S؇SчSʇSÇS¼‡Sµ‡S®‡S§‡S ‡S™‡S’‡S‹‡S„‡S}‡Sv‡So‡Sh‡Sa‡SZ‡SS‡SL‡SE‡S>‡S7‡S0‡S)‡S"‡S‡S‡S ‡S‡Sÿ†Sø†Sñ†Sê†Sã†S܆SÕ†SΆSdžSÀ†S¹†S²†S«†S¤†S†S–†S†Sˆ†S†Sz†Ss†Sl†Se†S^†SW†SP†SI†SB†S;†S4†S-†S&†S†S†S†S †S†Sü…Sõ…Sî…Sç…Sà…SÙ…SÒ…SË…SÄ…S½…S¶…S¯…S¨…S¡…Sš…S“…SŒ…S……S~…Sw…Sp…Si…Sb…S[…ST…SM…SF…S?…S8…S1…S*…S#…S…S…S…S…S…Sù„Sò„Së„Sä„SÝ„SÖ„SÏ„SÈ„SÁ„Sº„S³„S¬„S¥„Sž„S—„S„S‰„S‚„S{„St„Sm„Sf„S_„SX„SQ„SJ„SC„S<„S5„S.„S'„S „S„S„S „S„SýƒSöƒSïƒSèƒSáƒSÚƒSÓƒS̃SŃS¾ƒS·ƒS°ƒS©ƒS¢ƒS›ƒS”ƒSƒS†ƒSƒSxƒSqƒSjƒScƒS\ƒSUƒSNƒSGƒS@ƒS9ƒS2ƒS+ƒS$ƒSƒSƒSƒSƒSƒSú‚Só‚Sì‚Så‚SÞ‚SׂSЂSÉ‚S‚S»‚S´‚S­‚S¦‚SŸ‚S˜‚S‘‚SŠ‚Sƒ‚S|‚Su‚Sn‚Sg‚S`‚SY‚SR‚SK‚SD‚S=‚S6‚S/‚S(‚S!‚S‚S‚S ‚S‚SþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSû€Sô€Sí€Sæ€S߀SØ€SÑ€SÊ€SÀS¼€Sµ€S®€S§€S €S™€S’€S‹€S„€S}€Sv€So€Sh€Sa€SZ€SS€SL€SE€S>€S7€S0€S)€S"€S€S€S €S€SÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSü~Sõ~Sî~Sç~Sà~SÙ~SÒ~SË~SÄ~S½~S¶~S¯~S¨~S¡~Sš~S“~SŒ~S…~S~~Sw~Sp~Si~Sb~S[~ST~SM~SF~S?~S8~S1~S*~S#~S~S~S~S~S~Sù}Sò}Së}Sä}SÝ}SÖ}SÏ}SÈ}SÁ}Sº}S³}S¬}S¥}Sž}S—}S}S‰}S‚}S{}St}Sm}Sf}S_}SX}SQ}SJ}SC}S<}S5}S.}S'}S }S}S}S }S}Sý|Sö|Sï|Sè|Sá|SÚ|SÓ|SÌ|SÅ|S¾|S·|S°|S©|S¢|S›|S”|S|S†|S|Sx|Sq|Sj|Sc|S\|SU|SN|SG|S@|S9|S2|S+|S$|S|S|S|S|S|Sú{Só{Sì{Så{SÞ{S×{SÐ{SÉ{SÂ{S»{S´{S­{S¦{SŸ{S˜{S‘{SŠ{Sƒ{S|{Su{Sn{Sg{S`{SY{SR{SK{SD{S={S6{S/{S({S!{S{S{S {S{SþzS÷zSðzSézSâzSÛzSÔzSÍzSÆzS¿zS¸zS±zSªzS£zSœzS•zSŽzS‡zS€zSyzSrzSkzSdzS]zSVzSOzSHzSAzS:zS3zS,zS%zSzSzSzS zSzSûySôySíySæySßySØySÑySÊySÃyS¼ySµyS®yS§yS yS™yS’yS‹yS„yS}ySvySoyShySaySZySSySLySEyS>yS7yS0yS)yS"ySySyS ySySÿxSøxSñxSêxSãxSÜxSÕxSÎxSÇxSÀxS¹xS²xS«xS¤xSxS–xSxSˆxSxSzxSsxSlxSexS^xSWxSPxSIxSBxS;xS4xS-xS&xSxSxSxS xSxSüwSõwSîwSçwSàwSÙwSÒwSËwSÄwS½wS¶wS¯wS¨wS¡wSšwS“wSŒwS…wS~wSwwSpwSiwSbwS[wSTwSMwSFwS?wS8wS1wS*wS#wSwSwSwSwSwSùvSòvSëvSävSÝvSÖvSÏvSÈvSÁvSºvS³vS¬vS¥vSžvS—vSvS‰vS‚vS{vStvSmvSfvS_vSXvSQvSJvSCvSrS7rS0rS)rS"rSrSrS rSrSÿqSøqSñqSêqSãqSÜqSÕqSÎqSÇqSÀqS¹qS²qS«qS¤qSqS–qSqSˆqSqSzqSsqSlqSeqS^qSWqSPqSIqSBqS;qS4qS-qS&qSqSqSqS qSqSüpSõpSîpSçpSàpSÙpSÒpSËpSÄpS½pS¶pS¯pS¨pS¡pSšpS“pSŒpS…pS~pSwpSppSipSbpS[pSTpSMpSFpS?pS8pS1pS*pS#pSpSpSpSpSpSùoSòoSëoSäoSÝoSÖoSÏoSÈoSÁoSºoS³oS¬oS¥oSžoS—oSoS‰oS‚oS{oStoSmoSfoS_oSXoSQoSJoSCoSkS7kS0kS)kS"kSkSkS kSkSÿjSøjSñjSêjSãjSÜjSÕjSÎjSÇjSÀjS¹jS²jS«jS¤jSjS–jSjSˆjSjSzjSsjSljSejS^jSWjSPjSIjSBjS;jS4jS-jS&jSjSjSjS jSjSüiSõiSîiSçiSàiSÙiSÒiSËiSÄiS½iS¶iS¯iS¨iS¡iSšiS“iSŒiS…iS~iSwiSpiSiiSbiS[iSTiSMiSFiS?iS8iS1iS*iS#iSiSiSiSiSiSùhSòhSëhSähSÝhSÖhSÏhSÈhSÁhSºhS³hS¬hS¥hSžhS—hShS‰hS‚hS{hSthSmhSfhS_hSXhSQhSJhSChSdS7dS0dS)dS"dSdSdS dSdSÿcSøcSñcSêcSãcSÜcSÕcSÎcSÇcSÀcS¹cS²cS«cS¤cScS–cScSˆcScSzcSscSlcSecS^cSWcSPcSIcSBcS;cS4cS-cS&cScScScS cScSübSõbSîbSçbSàbSÙbSÒbSËbSÄbS½bS¶bS¯bS¨bS¡bSšbS“bSŒbS…bS~bSwbSpbSibSbbS[bSTbSMbSFbS?bS8bS1bS*bS#bSbSbSbSbSbSùaSòaSëaSäaSÝaSÖaSÏaSÈaSÁaSºaS³aS¬aS¥aSžaS—aSaS‰aS‚aS{aStaSmaSfaS_aSXaSQaSJaSCaS]S7]S0]S)]S"]S]S]S ]S]Sÿ\Sø\Sñ\Sê\Sã\SÜ\SÕ\SÎ\SÇ\SÀ\S¹\S²\S«\S¤\S\S–\S\Sˆ\S\Sz\Ss\Sl\Se\S^\SW\SP\SI\SB\S;\S4\S-\S&\S\S\S\S \S\Sü[Sõ[Sî[Sç[Sà[SÙ[SÒ[SË[SÄ[S½[S¶[S¯[S¨[S¡[Sš[S“[SŒ[S…[S~[Sw[Sp[Si[Sb[S[[ST[SM[SF[S?[S8[S1[S*[S#[S[S[S[S[S[SùZSòZSëZSäZSÝZSÖZSÏZSÈZSÁZSºZS³ZS¬ZS¥ZSžZS—ZSZS‰ZS‚ZS{ZStZSmZSfZS_ZSXZSQZSJZSCZSVS7VS0VS)VS"VSVSVS VSVSÿUSøUSñUSêUSãUSÜUSÕUSÎUSÇUSÀUS¹US²US«US¤USUS–USUSˆUSUSzUSsUSlUSeUS^USWUSPUSIUSBUS;US4US-US&USUSUSUS USUSüTSõTSîTSçTSàTSÙTSÒTSËTSÄTS½TS¶TS¯TS¨TS¡TSšTS“TSŒTS…TS~TSwTSpTSiTSbTS[TSTTSMTSFTS?TS8TS1TS*TS#TSTSTSTSTSTSùSSòSSëSSäSSÝSSÖSSÏSSÈSSÁSSºSS³SS¬SS¥SSžSS—SSSS‰SS‚SS{SStSSmSSfSS_SSXSSQSSJSSCSSOS7OS0OS)OS"OSOSOS OSOSÿNSøNSñNSêNSãNSÜNSÕNSÎNSÇNSÀNS¹NS²NS«NS¤NSNS–NSNSˆNSNSzNSsNSlNSeNS^NSWNSPNSINSBNS;NS4NS-NS&NSNSNSNS NSNSüMSõMSîMSçMSàMSÙMSÒMSËMSÄMS½MS¶MS¯MS¨MS¡MSšMS“MSŒMS…MS~MSwMSpMSiMSbMS[MSTMSMMSFMS?MS8MS1MS*MS#MSMSMSMSMSMSùLSòLSëLSäLSÝLSÖLSÏLSÈLSÁLSºLS³LS¬LS¥LSžLS—LSLS‰LS‚LS{LStLSmLSfLS_LSXLSQLSJLSCLSHS7HS0HS)HS"HSHSHS HSHSÿGSøGSñGSêGSãGSÜGSÕGSÎGSÇGSÀGS¹GS²GS«GS¤GSGS–GSGSˆGSGSzGSsGSlGSeGS^GSWGSPGSIGSBGS;GS4GS-GS&GSGSGSGS GSGSüFSõFSîFSçFSàFSÙFSÒFSËFSÄFS½FS¶FS¯FS¨FS¡FSšFS“FSŒFS…FS~FSwFSpFSiFSbFS[FSTFSMFSFFS?FS8FS1FS*FS#FSFSFSFSFSFSùESòESëESäESÝESÖESÏESÈESÁESºES³ES¬ES¥ESžES—ESES‰ES‚ES{EStESmESfES_ESXESQESJESCESAS7AS0AS)AS"ASASAS ASASÿ@Sø@Sñ@Sê@Sã@SÜ@SÕ@SÎ@SÇ@SÀ@S¹@S²@S«@S¤@S@S–@S@Sˆ@S@Sz@Ss@Sl@Se@S^@SW@SP@SI@SB@S;@S4@S-@S&@S@S@S@S @S@Sü?Sõ?Sî?Sç?Sà?SÙ?SÒ?SË?SÄ?S½?S¶?S¯?S¨?S¡?Sš?S“?SŒ?S…?S~?Sw?Sp?Si?Sb?S[?ST?SM?SF?S??S8?S1?S*?S#?S?S?S?S?S?Sù>Sò>Së>Sä>SÝ>SÖ>SÏ>SÈ>SÁ>Sº>S³>S¬>S¥>Sž>S—>S>S‰>S‚>S{>St>Sm>Sf>S_>SX>SQ>SJ>SC>S<>S5>S.>S'>S >S>S>S >S>Sý=Sö=Sï=Sè=Sá=SÚ=SÓ=SÌ=SÅ=S¾=S·=S°=S©=S¢=S›=S”=S=S†=S=Sx=Sq=Sj=Sc=S\=SU=SN=SG=S@=S9=S2=S+=S$=S=S=S=S=S=Sú:S7:S0:S):S":S:S:S :S:Sÿ9Sø9Sñ9Sê9Sã9SÜ9SÕ9SÎ9SÇ9SÀ9S¹9S²9S«9S¤9S9S–9S9Sˆ9S9Sz9Ss9Sl9Se9S^9SW9SP9SI9SB9S;9S49S-9S&9S9S9S9S 9S9Sü8Sõ8Sî8Sç8Sà8SÙ8SÒ8SË8SÄ8S½8S¶8S¯8S¨8S¡8Sš8S“8SŒ8S…8S~8Sw8Sp8Si8Sb8S[8ST8SM8SF8S?8S88S18S*8S#8S8S8S8S8S8Sù7Sò7Së7Sä7SÝ7SÖ7SÏ7SÈ7SÁ7Sº7S³7S¬7S¥7Sž7S—7S7S‰7S‚7S{7St7Sm7Sf7S_7SX7SQ7SJ7SC7S<7S57S.7S'7S 7S7S7S 7S7Sý6Sö6Sï6Sè6Sá6SÚ6SÓ6SÌ6SÅ6S¾6S·6S°6S©6S¢6S›6S”6S6S†6S6Sx6Sq6Sj6Sc6S\6SU6SN6SG6S@6S96S26S+6S$6S6S6S6S6S6Sú5Só5Sì5Så5SÞ5S×5SÐ5SÉ5SÂ5S»5S´5S­5S¦5SŸ5S˜5S‘5SŠ5Sƒ5S|5Su5Sn5Sg5S`5SY5SR5SK5SD5S=5S65S/5S(5S!5S5S5S 5S5Sþ4S÷4Sð4Sé4Sâ4SÛ4SÔ4SÍ4SÆ4S¿4S¸4S±4Sª4S£4Sœ4S•4SŽ4S‡4S€4Sy4Sr4Sk4Sd4S]4SV4SO4SH4SA4S:4S34S,4S%4S4S4S4S 4S4Sû3Sô3Sí3Sæ3Sß3SØ3SÑ3SÊ3SÃ3S¼3Sµ3S®3S§3S 3S™3S’3S‹3S„3S}3Sv3So3Sh3Sa3SZ3SS3SL3SE3S>3S73S03S)3S"3S3S3S 3S3Sÿ2Sø2Sñ2Sê2Sã2SÜ2SÕ2SÎ2SÇ2SÀ2S¹2S²2S«2S¤2S2S–2S2Sˆ2S2Sz2Ss2Sl2Se2S^2SW2SP2SI2SB2S;2S42S-2S&2S2S2S2S 2S2Sü1Sõ1Sî1Sç1Sà1SÙ1SÒ1SË1SÄ1S½1S¶1S¯1S¨1S¡1Sš1S“1SŒ1S…1S~1Sw1Sp1Si1Sb1S[1ST1SM1SF1S?1S81S11S*1S#1S1S1S1S1S1Sù0Sò0Së0Sä0SÝ0SÖ0SÏ0SÈ0SÁ0Sº0S³0S¬0S¥0Sž0S—0S0S‰0S‚0S{0St0Sm0Sf0S_0SX0SQ0SJ0SC0S<0S50S.0S'0S 0S0S0S 0S0Sý/Sö/Sï/Sè/Sá/SÚ/SÓ/SÌ/SÅ/S¾/S·/S°/S©/S¢/S›/S”/S/S†/S/Sx/Sq/Sj/Sc/S\/SU/SN/SG/S@/S9/S2/S+/S$/S/S/S/S/S/Sú.Só.Sì.Så.SÞ.S×.SÐ.SÉ.SÂ.S».S´.S­.S¦.SŸ.S˜.S‘.SŠ.Sƒ.S|.Su.Sn.Sg.S`.SY.SR.SK.SD.S=.S6.S/.S(.S!.S.S.S .S.Sþ-S÷-Sð-Sé-Sâ-SÛ-SÔ-SÍ-SÆ-S¿-S¸-S±-Sª-S£-Sœ-S•-SŽ-S‡-S€-Sy-Sr-Sk-Sd-S]-SV-SO-SH-SA-S:-S3-S,-S%-S-S-S-S -S-Sû,Sô,Sí,Sæ,Sß,SØ,SÑ,SÊ,SÃ,S¼,Sµ,S®,S§,S ,S™,S’,S‹,S„,S},Sv,So,Sh,Sa,SZ,SS,SL,SE,S>,S7,S0,S),S",S,S,S ,S,Sÿ+Sø+Sñ+Sê+Sã+SÜ+SÕ+SÎ+SÇ+SÀ+S¹+S²+S«+S¤+S+S–+S+Sˆ+S+Sz+Ss+Sl+Se+S^+SW+SP+SI+SB+S;+S4+S-+S&+S+S+S+S +S+Sü*Sõ*Sî*Sç*Sà*SÙ*SÒ*SË*SÄ*S½*S¶*S¯*S¨*S¡*Sš*S“*SŒ*S…*S~*Sw*Sp*Si*Sb*S[*ST*SM*SF*S?*S8*S1*S**S#*S*S*S*S*S*Sù)Sò)Së)Sä)SÝ)SÖ)SÏ)SÈ)SÁ)Sº)S³)S¬)S¥)Sž)S—)S)S‰)S‚)S{)St)Sm)Sf)S_)SX)SQ)SJ)SC)S<)S5)S.)S')S )S)S)S )S)Sý(Sö(Sï(Sè(Sá(SÚ(SÓ(SÌ(SÅ(S¾(S·(S°(S©(S¢(S›(S”(S(S†(S(Sx(Sq(Sj(Sc(S\(SU(SN(SG(S@(S9(S2(S+(S$(S(S(S(S(S(Sú'Só'Sì'Så'SÞ'S×'SÐ'SÉ'SÂ'S»'S´'S­'S¦'SŸ'S˜'S‘'SŠ'Sƒ'S|'Su'Sn'Sg'S`'SY'SR'SK'SD'S='S6'S/'S('S!'S'S'S 'S'Sþ&S÷&Sð&Sé&Sâ&SÛ&SÔ&SÍ&SÆ&S¿&S¸&S±&Sª&S£&Sœ&S•&SŽ&S‡&S€&Sy&Sr&Sk&Sd&S]&SV&SO&SH&SA&S:&S3&S,&S%&S&S&S&S &S&Sû%Sô%Sí%Sæ%Sß%SØ%SÑ%SÊ%SÃ%S¼%Sµ%S®%S§%S %S™%S’%S‹%S„%S}%Sv%So%Sh%Sa%SZ%SS%SL%SE%S>%S7%S0%S)%S"%S%S%S %S%Sÿ$Sø$Sñ$Sê$Sã$SÜ$SÕ$SÎ$SÇ$SÀ$S¹$S²$S«$S¤$S$S–$S$Sˆ$S$Sz$Ss$Sl$Se$S^$SW$SP$SI$SB$S;$S4$S-$S&$S$S$S$S $S$Sü#Sõ#Sî#Sç#Sà#SÙ#SÒ#SË#SÄ#S½#S¶#S¯#S¨#S¡#Sš#S“#SŒ#S…#S~#Sw#Sp#Si#Sb#S[#ST#SM#SF#S?#S8#S1#S*#S##S#S#S#S#S#Sù"Sò"Së"Sä"SÝ"SÖ"SÏ"SÈ"SÁ"Sº"S³"S¬"S¥"Sž"S—"S"S‰"S‚"S{"St"Sm"Sf"S_"SX"SQ"SJ"SC"S<"S5"S."S'"S "S"S"S "S"Sý!Sö!Sï!Sè!Sá!SÚ!SÓ!SÌ!SÅ!S¾!S·!S°!S©!S¢!S›!S”!S!S†!S!Sx!Sq!Sj!Sc!S\!SU!SN!SG!S@!S9!S2!S+!S$!S!S!S!S!S!Sú Só Sì Så SÞ S× SÐ SÉ S S» S´ S­ S¦ SŸ S˜ S‘ SŠ Sƒ S| Su Sn Sg S` SY SR SK SD S= S6 S/ S( S! S S S S SþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûSôSíSæSßSØSÑSÊSÃS¼SµS®S§S S™S’S‹S„S}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSýSöSïSèSáSÚSÓSÌSÅS¾S·S°S©S¢S›S”SS†SSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSúSóSìSåSÞS×SÐSÉSÂS»S´S­S¦SŸS˜S‘SŠSƒS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûSôSíSæSßSØSÑSÊSÃS¼SµS®S§S S™S’S‹S„S}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSýSöSïSèSáSÚSÓSÌSÅS¾S·S°S©S¢S›S”SS†SSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSúSóSìSåSÞS×SÐSÉSÂS»S´S­S¦SŸS˜S‘SŠSƒS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûSôSíSæSßSØSÑSÊSÃS¼SµS®S§S S™S’S‹S„S}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSù Sò Së Sä SÝ SÖ SÏ SÈ SÁ Sº S³ S¬ S¥ Sž S— S S‰ S‚ S{ St Sm Sf S_ SX SQ SJ SC S< S5 S. S' S S S S S Sý Sö Sï Sè Sá SÚ SÓ SÌ SÅ S¾ S· S° S© S¢ S› S” S S† S Sx Sq Sj Sc S\ SU SN SG S@ S9 S2 S+ S$ S S S S S Sú Só Sì Så SÞ S× SÐ SÉ S S» S´ S­ S¦ SŸ S˜ S‘ SŠ Sƒ S| Su Sn Sg S` SY SR SK SD S= S6 S/ S( S! S S S S Sþ S÷ Sð Sé Sâ SÛ SÔ SÍ SÆ S¿ S¸ S± Sª S£ Sœ S• SŽ S‡ S€ Sy Sr Sk Sd S] SV SO SH SA S: S3 S, S% S S S S S Sû Sô Sí Sæ Sß SØ SÑ SÊ Sà S¼ Sµ S® S§ S  S™ S’ S‹ S„ S} Sv So Sh Sa SZ SS SL SE S> S7 S0 S) S" S S S S SÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCS<S5S.S'S SSS SSýSöSïSèSáSÚSÓSÌSÅS¾S·S°S©S¢S›S”SS†SSxSqSjScS\SUSNSGS@S9S2S+S$SSSSSSúSóSìSåSÞS×SÐSÉSÂS»S´S­S¦SŸS˜S‘SŠSƒS|SuSnSgS`SYSRSKSDS=S6S/S(S!SSS SSþS÷SðSéSâSÛSÔSÍSÆS¿S¸S±SªS£SœS•SŽS‡S€SySrSkSdS]SVSOSHSAS:S3S,S%SSSS SSûSôSíSæSßSØSÑSÊSÃS¼SµS®S§S S™S’S‹S„S}SvSoShSaSZSSSLSES>S7S0S)S"SSS SSÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùÿRòÿRëÿRäÿRÝÿRÖÿRÏÿRÈÿRÁÿRºÿR³ÿR¬ÿR¥ÿRžÿR—ÿRÿR‰ÿR‚ÿR{ÿRtÿRmÿRfÿR_ÿRXÿRQÿRJÿRCÿR<ÿR5ÿR.ÿR'ÿR ÿRÿRÿR ÿRÿRýþRöþRïþRèþRáþRÚþRÓþRÌþRÅþR¾þR·þR°þR©þR¢þR›þR”þRþR†þRþRxþRqþRjþRcþR\þRUþRNþRGþR@þR9þR2þR+þR$þRþRþRþRþRþRúýRóýRìýRåýRÞýR×ýRÐýRÉýRÂýR»ýR´ýR­ýR¦ýRŸýR˜ýR‘ýRŠýRƒýR|ýRuýRnýRgýR`ýRYýRRýRKýRDýR=ýR6ýR/ýR(ýR!ýRýRýR ýRýRþüR÷üRðüRéüRâüRÛüRÔüRÍüRÆüR¿üR¸üR±üRªüR£üRœüR•üRŽüR‡üR€üRyüRrüRküRdüR]üRVüROüRHüRAüR:üR3üR,üR%üRüRüRüR üRüRûûRôûRíûRæûRßûRØûRÑûRÊûRÃûR¼ûRµûR®ûR§ûR ûR™ûR’ûR‹ûR„ûR}ûRvûRoûRhûRaûRZûRSûRLûREûR>ûR7ûR0ûR)ûR"ûRûRûR ûRûRÿúRøúRñúRêúRãúRÜúRÕúRÎúRÇúRÀúR¹úR²úR«úR¤úRúR–úRúRˆúRúRzúRsúRlúReúR^úRWúRPúRIúRBúR;úR4úR-úR&úRúRúRúR úRúRüùRõùRîùRçùRàùRÙùRÒùRËùRÄùR½ùR¶ùR¯ùR¨ùR¡ùRšùR“ùRŒùR…ùR~ùRwùRpùRiùRbùR[ùRTùRMùRFùR?ùR8ùR1ùR*ùR#ùRùRùRùRùRùRùøRòøRëøRäøRÝøRÖøRÏøRÈøRÁøRºøR³øR¬øR¥øRžøR—øRøR‰øR‚øR{øRtøRmøRføR_øRXøRQøRJøRCøR<øR5øR.øR'øR øRøRøR øRøRý÷Rö÷Rï÷Rè÷Rá÷RÚ÷RÓ÷RÌ÷RÅ÷R¾÷R·÷R°÷R©÷R¢÷R›÷R”÷R÷R†÷R÷Rx÷Rq÷Rj÷Rc÷R\÷RU÷RN÷RG÷R@÷R9÷R2÷R+÷R$÷R÷R÷R÷R÷R÷RúöRóöRìöRåöRÞöR×öRÐöRÉöRÂöR»öR´öR­öR¦öRŸöR˜öR‘öRŠöRƒöR|öRuöRnöRgöR`öRYöRRöRKöRDöR=öR6öR/öR(öR!öRöRöR öRöRþõR÷õRðõRéõRâõRÛõRÔõRÍõRÆõR¿õR¸õR±õRªõR£õRœõR•õRŽõR‡õR€õRyõRrõRkõRdõR]õRVõROõRHõRAõR:õR3õR,õR%õRõRõRõR õRõRûôRôôRíôRæôRßôRØôRÑôRÊôRÃôR¼ôRµôR®ôR§ôR ôR™ôR’ôR‹ôR„ôR}ôRvôRoôRhôRaôRZôRSôRLôREôR>ôR7ôR0ôR)ôR"ôRôRôR ôRôRÿóRøóRñóRêóRãóRÜóRÕóRÎóRÇóRÀóR¹óR²óR«óR¤óRóR–óRóRˆóRóRzóRsóRlóReóR^óRWóRPóRIóRBóR;óR4óR-óR&óRóRóRóR óRóRüòRõòRîòRçòRàòRÙòRÒòRËòRÄòR½òR¶òR¯òR¨òR¡òRšòR“òRŒòR…òR~òRwòRpòRiòRbòR[òRTòRMòRFòR?òR8òR1òR*òR#òRòRòRòRòRòRùñRòñRëñRäñRÝñRÖñRÏñRÈñRÁñRºñR³ñR¬ñR¥ñRžñR—ñRñR‰ñR‚ñR{ñRtñRmñRfñR_ñRXñRQñRJñRCñR<ñR5ñR.ñR'ñR ñRñRñR ñRñRýðRöðRïðRèðRáðRÚðRÓðRÌðRÅðR¾ðR·ðR°ðR©ðR¢ðR›ðR”ðRðR†ðRðRxðRqðRjðRcðR\ðRUðRNðRGðR@ðR9ðR2ðR+ðR$ðRðRðRðRðRðRúïRóïRìïRåïRÞïR×ïRÐïRÉïRÂïR»ïR´ïR­ïR¦ïRŸïR˜ïR‘ïRŠïRƒïR|ïRuïRnïRgïR`ïRYïRRïRKïRDïR=ïR6ïR/ïR(ïR!ïRïRïR ïRïRþîR÷îRðîRéîRâîRÛîRÔîRÍîRÆîR¿îR¸îR±îRªîR£îRœîR•îRŽîR‡îR€îRyîRrîRkîRdîR]îRVîROîRHîRAîR:îR3îR,îR%îRîRîRîR îRîRûíRôíRííRæíRßíRØíRÑíRÊíRÃíR¼íRµíR®íR§íR íR™íR’íR‹íR„íR}íRvíRoíRhíRaíRZíRSíRLíREíR>íR7íR0íR)íR"íRíRíR íRíRÿìRøìRñìRêìRãìRÜìRÕìRÎìRÇìRÀìR¹ìR²ìR«ìR¤ìRìR–ìRìRˆìRìRzìRsìRlìReìR^ìRWìRPìRIìRBìR;ìR4ìR-ìR&ìRìRìRìR ìRìRüëRõëRîëRçëRàëRÙëRÒëRËëRÄëR½ëR¶ëR¯ëR¨ëR¡ëRšëR“ëRŒëR…ëR~ëRwëRpëRiëRbëR[ëRTëRMëRFëR?ëR8ëR1ëR*ëR#ëRëRëRëRëRëRùêRòêRëêRäêRÝêRÖêRÏêRÈêRÁêRºêR³êR¬êR¥êRžêR—êRêR‰êR‚êR{êRtêRmêRfêR_êRXêRQêRJêRCêR<êR5êR.êR'êR êRêRêR êRêRýéRöéRïéRèéRáéRÚéRÓéRÌéRÅéR¾éR·éR°éR©éR¢éR›éR”éRéR†éRéRxéRqéRjéRcéR\éRUéRNéRGéR@éR9éR2éR+éR$éRéRéRéRéRéRúèRóèRìèRåèRÞèR×èRÐèRÉèRÂèR»èR´èR­èR¦èRŸèR˜èR‘èRŠèRƒèR|èRuèRnèRgèR`èRYèRRèRKèRDèR=èR6èR/èR(èR!èRèRèR èRèRþçR÷çRðçRéçRâçRÛçRÔçRÍçRÆçR¿çR¸çR±çRªçR£çRœçR•çRŽçR‡çR€çRyçRrçRkçRdçR]çRVçROçRHçRAçR:çR3çR,çR%çRçRçRçR çRçRûæRôæRíæRææRßæRØæRÑæRÊæRÃæR¼æRµæR®æR§æR æR™æR’æR‹æR„æR}æRvæRoæRhæRaæRZæRSæRLæREæR>æR7æR0æR)æR"æRæRæR æRæRÿåRøåRñåRêåRãåRÜåRÕåRÎåRÇåRÀåR¹åR²åR«åR¤åRåR–åRåRˆåRåRzåRsåRlåReåR^åRWåRPåRIåRBåR;åR4åR-åR&åRåRåRåR åRåRüäRõäRîäRçäRàäRÙäRÒäRËäRÄäR½äR¶äR¯äR¨äR¡äRšäR“äRŒäR…äR~äRwäRpäRiäRbäR[äRTäRMäRFäR?äR8äR1äR*äR#äRäRäRäRäRäRùãRòãRëãRäãRÝãRÖãRÏãRÈãRÁãRºãR³ãR¬ãR¥ãRžãR—ãRãR‰ãR‚ãR{ãRtãRmãRfãR_ãRXãRQãRJãRCãR<ãR5ãR.ãR'ãR ãRãRãR ãRãRýâRöâRïâRèâRáâRÚâRÓâRÌâRÅâR¾âR·âR°âR©âR¢âR›âR”âRâR†âRâRxâRqâRjâRcâR\âRUâRNâRGâR@âR9âR2âR+âR$âRâRâRâRâRâRúáRóáRìáRåáRÞáR×áRÐáRÉáRÂáR»áR´áR­áR¦áRŸáR˜áR‘áRŠáRƒáR|áRuáRnáRgáR`áRYáRRáRKáRDáR=áR6áR/áR(áR!áRáRáR áRáRþàR÷àRðàRéàRâàRÛàRÔàRÍàRÆàR¿àR¸àR±àRªàR£àRœàR•àRŽàR‡àR€àRyàRràRkàRdàR]àRVàROàRHàRAàR:àR3àR,àR%àRàRàRàR àRàRûßRôßRíßRæßRßßRØßRÑßRÊßRÃßR¼ßRµßR®ßR§ßR ßR™ßR’ßR‹ßR„ßR}ßRvßRoßRhßRaßRZßRSßRLßREßR>ßR7ßR0ßR)ßR"ßRßRßR ßRßRÿÞRøÞRñÞRêÞRãÞRÜÞRÕÞRÎÞRÇÞRÀÞR¹ÞR²ÞR«ÞR¤ÞRÞR–ÞRÞRˆÞRÞRzÞRsÞRlÞReÞR^ÞRWÞRPÞRIÞRBÞR;ÞR4ÞR-ÞR&ÞRÞRÞRÞR ÞRÞRüÝRõÝRîÝRçÝRàÝRÙÝRÒÝRËÝRÄÝR½ÝR¶ÝR¯ÝR¨ÝR¡ÝRšÝR“ÝRŒÝR…ÝR~ÝRwÝRpÝRiÝRbÝR[ÝRTÝRMÝRFÝR?ÝR8ÝR1ÝR*ÝR#ÝRÝRÝRÝRÝRÝRùÜRòÜRëÜRäÜRÝÜRÖÜRÏÜRÈÜRÁÜRºÜR³ÜR¬ÜR¥ÜRžÜR—ÜRÜR‰ÜR‚ÜR{ÜRtÜRmÜRfÜR_ÜRXÜRQÜRJÜRCÜR<ÜR5ÜR.ÜR'ÜR ÜRÜRÜR ÜRÜRýÛRöÛRïÛRèÛRáÛRÚÛRÓÛRÌÛRÅÛR¾ÛR·ÛR°ÛR©ÛR¢ÛR›ÛR”ÛRÛR†ÛRÛRxÛRqÛRjÛRcÛR\ÛRUÛRNÛRGÛR@ÛR9ÛR2ÛR+ÛR$ÛRÛRÛRÛRÛRÛRúÚRóÚRìÚRåÚRÞÚR×ÚRÐÚRÉÚRÂÚR»ÚR´ÚR­ÚR¦ÚRŸÚR˜ÚR‘ÚRŠÚRƒÚR|ÚRuÚRnÚRgÚR`ÚRYÚRRÚRKÚRDÚR=ÚR6ÚR/ÚR(ÚR!ÚRÚRÚR ÚRÚRþÙR÷ÙRðÙRéÙRâÙRÛÙRÔÙRÍÙRÆÙR¿ÙR¸ÙR±ÙRªÙR£ÙRœÙR•ÙRŽÙR‡ÙR€ÙRyÙRrÙRkÙRdÙR]ÙRVÙROÙRHÙRAÙR:ÙR3ÙR,ÙR%ÙRÙRÙRÙR ÙRÙRûØRôØRíØRæØRߨRØØRÑØRÊØRÃØR¼ØRµØR®ØR§ØR ØR™ØR’ØR‹ØR„ØR}ØRvØRoØRhØRaØRZØRSØRLØREØR>ØR7ØR0ØR)ØR"ØRØRØR ØRØRÿ×Rø×Rñ×Rê×Rã×RÜ×RÕ×RÎ×RÇ×RÀ×R¹×R²×R«×R¤×R×R–×R×Rˆ×R×Rz×Rs×Rl×Re×R^×RW×RP×RI×RB×R;×R4×R-×R&×R×R×R×R ×R×RüÖRõÖRîÖRçÖRàÖRÙÖRÒÖRËÖRÄÖR½ÖR¶ÖR¯ÖR¨ÖR¡ÖRšÖR“ÖRŒÖR…ÖR~ÖRwÖRpÖRiÖRbÖR[ÖRTÖRMÖRFÖR?ÖR8ÖR1ÖR*ÖR#ÖRÖRÖRÖRÖRÖRùÕRòÕRëÕRäÕRÝÕRÖÕRÏÕRÈÕRÁÕRºÕR³ÕR¬ÕR¥ÕRžÕR—ÕRÕR‰ÕR‚ÕR{ÕRtÕRmÕRfÕR_ÕRXÕRQÕRJÕRCÕR<ÕR5ÕR.ÕR'ÕR ÕRÕRÕR ÕRÕRýÔRöÔRïÔRèÔRáÔRÚÔRÓÔRÌÔRÅÔR¾ÔR·ÔR°ÔR©ÔR¢ÔR›ÔR”ÔRÔR†ÔRÔRxÔRqÔRjÔRcÔR\ÔRUÔRNÔRGÔR@ÔR9ÔR2ÔR+ÔR$ÔRÔRÔRÔRÔRÔRúÓRóÓRìÓRåÓRÞÓR×ÓRÐÓRÉÓRÂÓR»ÓR´ÓR­ÓR¦ÓRŸÓR˜ÓR‘ÓRŠÓRƒÓR|ÓRuÓRnÓRgÓR`ÓRYÓRRÓRKÓRDÓR=ÓR6ÓR/ÓR(ÓR!ÓRÓRÓR ÓRÓRþÒR÷ÒRðÒRéÒRâÒRÛÒRÔÒRÍÒRÆÒR¿ÒR¸ÒR±ÒRªÒR£ÒRœÒR•ÒRŽÒR‡ÒR€ÒRyÒRrÒRkÒRdÒR]ÒRVÒROÒRHÒRAÒR:ÒR3ÒR,ÒR%ÒRÒRÒRÒR ÒRÒRûÑRôÑRíÑRæÑRßÑRØÑRÑÑRÊÑRÃÑR¼ÑRµÑR®ÑR§ÑR ÑR™ÑR’ÑR‹ÑR„ÑR}ÑRvÑRoÑRhÑRaÑRZÑRSÑRLÑREÑR>ÑR7ÑR0ÑR)ÑR"ÑRÑRÑR ÑRÑRÿÐRøÐRñÐRêÐRãÐRÜÐRÕÐRÎÐRÇÐRÀÐR¹ÐR²ÐR«ÐR¤ÐRÐR–ÐRÐRˆÐRÐRzÐRsÐRlÐReÐR^ÐRWÐRPÐRIÐRBÐR;ÐR4ÐR-ÐR&ÐRÐRÐRÐR ÐRÐRüÏRõÏRîÏRçÏRàÏRÙÏRÒÏRËÏRÄÏR½ÏR¶ÏR¯ÏR¨ÏR¡ÏRšÏR“ÏRŒÏR…ÏR~ÏRwÏRpÏRiÏRbÏR[ÏRTÏRMÏRFÏR?ÏR8ÏR1ÏR*ÏR#ÏRÏRÏRÏRÏRÏRùÎRòÎRëÎRäÎRÝÎRÖÎRÏÎRÈÎRÁÎRºÎR³ÎR¬ÎR¥ÎRžÎR—ÎRÎR‰ÎR‚ÎR{ÎRtÎRmÎRfÎR_ÎRXÎRQÎRJÎRCÎR<ÎR5ÎR.ÎR'ÎR ÎRÎRÎR ÎRÎRýÍRöÍRïÍRèÍRáÍRÚÍRÓÍRÌÍRÅÍR¾ÍR·ÍR°ÍR©ÍR¢ÍR›ÍR”ÍRÍR†ÍRÍRxÍRqÍRjÍRcÍR\ÍRUÍRNÍRGÍR@ÍR9ÍR2ÍR+ÍR$ÍRÍRÍRÍRÍRÍRúÌRóÌRìÌRåÌRÞÌR×ÌRÐÌRÉÌRÂÌR»ÌR´ÌR­ÌR¦ÌRŸÌR˜ÌR‘ÌRŠÌRƒÌR|ÌRuÌRnÌRgÌR`ÌRYÌRRÌRKÌRDÌR=ÌR6ÌR/ÌR(ÌR!ÌRÌRÌR ÌRÌRþËR÷ËRðËRéËRâËRÛËRÔËRÍËRÆËR¿ËR¸ËR±ËRªËR£ËRœËR•ËRŽËR‡ËR€ËRyËRrËRkËRdËR]ËRVËROËRHËRAËR:ËR3ËR,ËR%ËRËRËRËR ËRËRûÊRôÊRíÊRæÊRßÊRØÊRÑÊRÊÊRÃÊR¼ÊRµÊR®ÊR§ÊR ÊR™ÊR’ÊR‹ÊR„ÊR}ÊRvÊRoÊRhÊRaÊRZÊRSÊRLÊREÊR>ÊR7ÊR0ÊR)ÊR"ÊRÊRÊR ÊRÊRÿÉRøÉRñÉRêÉRãÉRÜÉRÕÉRÎÉRÇÉRÀÉR¹ÉR²ÉR«ÉR¤ÉRÉR–ÉRÉRˆÉRÉRzÉRsÉRlÉReÉR^ÉRWÉRPÉRIÉRBÉR;ÉR4ÉR-ÉR&ÉRÉRÉRÉR ÉRÉRüÈRõÈRîÈRçÈRàÈRÙÈRÒÈRËÈRÄÈR½ÈR¶ÈR¯ÈR¨ÈR¡ÈRšÈR“ÈRŒÈR…ÈR~ÈRwÈRpÈRiÈRbÈR[ÈRTÈRMÈRFÈR?ÈR8ÈR1ÈR*ÈR#ÈRÈRÈRÈRÈRÈRùÇRòÇRëÇRäÇRÝÇRÖÇRÏÇRÈÇRÁÇRºÇR³ÇR¬ÇR¥ÇRžÇR—ÇRÇR‰ÇR‚ÇR{ÇRtÇRmÇRfÇR_ÇRXÇRQÇRJÇRCÇR<ÇR5ÇR.ÇR'ÇR ÇRÇRÇR ÇRÇRýÆRöÆRïÆRèÆRáÆRÚÆRÓÆRÌÆRÅÆR¾ÆR·ÆR°ÆR©ÆR¢ÆR›ÆR”ÆRÆR†ÆRÆRxÆRqÆRjÆRcÆR\ÆRUÆRNÆRGÆR@ÆR9ÆR2ÆR+ÆR$ÆRÆRÆRÆRÆRÆRúÅRóÅRìÅRåÅRÞÅR×ÅRÐÅRÉÅRÂÅR»ÅR´ÅR­ÅR¦ÅRŸÅR˜ÅR‘ÅRŠÅRƒÅR|ÅRuÅRnÅRgÅR`ÅRYÅRRÅRKÅRDÅR=ÅR6ÅR/ÅR(ÅR!ÅRÅRÅR ÅRÅRþÄR÷ÄRðÄRéÄRâÄRÛÄRÔÄRÍÄRÆÄR¿ÄR¸ÄR±ÄRªÄR£ÄRœÄR•ÄRŽÄR‡ÄR€ÄRyÄRrÄRkÄRdÄR]ÄRVÄROÄRHÄRAÄR:ÄR3ÄR,ÄR%ÄRÄRÄRÄR ÄRÄRûÃRôÃRíÃRæÃRßÃRØÃRÑÃRÊÃRÃÃR¼ÃRµÃR®ÃR§ÃR ÃR™ÃR’ÃR‹ÃR„ÃR}ÃRvÃRoÃRhÃRaÃRZÃRSÃRLÃREÃR>ÃR7ÃR0ÃR)ÃR"ÃRÃRÃR ÃRÃRÿÂRøÂRñÂRêÂRãÂRÜÂRÕÂRÎÂRÇÂRÀÂR¹ÂR²ÂR«ÂR¤ÂRÂR–ÂRÂRˆÂRÂRzÂRsÂRlÂReÂR^ÂRWÂRPÂRIÂRBÂR;ÂR4ÂR-ÂR&ÂRÂRÂRÂR ÂRÂRüÁRõÁRîÁRçÁRàÁRÙÁRÒÁRËÁRÄÁR½ÁR¶ÁR¯ÁR¨ÁR¡ÁRšÁR“ÁRŒÁR…ÁR~ÁRwÁRpÁRiÁRbÁR[ÁRTÁRMÁRFÁR?ÁR8ÁR1ÁR*ÁR#ÁRÁRÁRÁRÁRÁRùÀRòÀRëÀRäÀRÝÀRÖÀRÏÀRÈÀRÁÀRºÀR³ÀR¬ÀR¥ÀRžÀR—ÀRÀR‰ÀR‚ÀR{ÀRtÀRmÀRfÀR_ÀRXÀRQÀRJÀRCÀR<ÀR5ÀR.ÀR'ÀR ÀRÀRÀR ÀRÀRý¿Rö¿Rï¿Rè¿Rá¿RÚ¿RÓ¿RÌ¿RÅ¿R¾¿R·¿R°¿R©¿R¢¿R›¿R”¿R¿R†¿R¿Rx¿Rq¿Rj¿Rc¿R\¿RU¿RN¿RG¿R@¿R9¿R2¿R+¿R$¿R¿R¿R¿R¿R¿Rú¾Ró¾Rì¾Rå¾RÞ¾R×¾RоRɾR¾R»¾R´¾R­¾R¦¾RŸ¾R˜¾R‘¾RоRƒ¾R|¾Ru¾Rn¾Rg¾R`¾RY¾RR¾RK¾RD¾R=¾R6¾R/¾R(¾R!¾R¾R¾R ¾R¾Rþ½R÷½Rð½Ré½Râ½RÛ½RÔ½RͽRƽR¿½R¸½R±½Rª½R£½Rœ½R•½R޽R‡½R€½Ry½Rr½Rk½Rd½R]½RV½RO½RH½RA½R:½R3½R,½R%½R½R½R½R ½R½Rû¼Rô¼Rí¼Ræ¼Rß¼RؼRѼRʼRüR¼¼Rµ¼R®¼R§¼R ¼R™¼R’¼R‹¼R„¼R}¼Rv¼Ro¼Rh¼Ra¼RZ¼RS¼RL¼RE¼R>¼R7¼R0¼R)¼R"¼R¼R¼R ¼R¼Rÿ»Rø»Rñ»Rê»Rã»RÜ»RÕ»RλRÇ»RÀ»R¹»R²»R«»R¤»R»R–»R»Rˆ»R»Rz»Rs»Rl»Re»R^»RW»RP»RI»RB»R;»R4»R-»R&»R»R»R»R »R»RüºRõºRîºRçºRàºRÙºRÒºR˺RĺR½ºR¶ºR¯ºR¨ºR¡ºRšºR“ºRŒºR…ºR~ºRwºRpºRiºRbºR[ºRTºRMºRFºR?ºR8ºR1ºR*ºR#ºRºRºRºRºRºRù¹Rò¹Rë¹Rä¹RݹRÖ¹RϹRȹRÁ¹Rº¹R³¹R¬¹R¥¹Rž¹R—¹R¹R‰¹R‚¹R{¹Rt¹Rm¹Rf¹R_¹RX¹RQ¹RJ¹RC¹R<¹R5¹R.¹R'¹R ¹R¹R¹R ¹R¹Rý¸Rö¸Rï¸Rè¸Rá¸RÚ¸RÓ¸R̸RŸR¾¸R·¸R°¸R©¸R¢¸R›¸R”¸R¸R†¸R¸Rx¸Rq¸Rj¸Rc¸R\¸RU¸RN¸RG¸R@¸R9¸R2¸R+¸R$¸R¸R¸R¸R¸R¸Rú·Ró·Rì·Rå·RÞ·R×·RзRÉ·R·R»·R´·R­·R¦·RŸ·R˜·R‘·RŠ·Rƒ·R|·Ru·Rn·Rg·R`·RY·RR·RK·RD·R=·R6·R/·R(·R!·R·R·R ·R·Rþ¶R÷¶Rð¶Ré¶Râ¶RÛ¶RÔ¶RͶRƶR¿¶R¸¶R±¶Rª¶R£¶Rœ¶R•¶R޶R‡¶R€¶Ry¶Rr¶Rk¶Rd¶R]¶RV¶RO¶RH¶RA¶R:¶R3¶R,¶R%¶R¶R¶R¶R ¶R¶RûµRôµRíµRæµRßµRصRѵRʵRõR¼µRµµR®µR§µR µR™µR’µR‹µR„µR}µRvµRoµRhµRaµRZµRSµRLµREµR>µR7µR0µR)µR"µRµRµR µRµRÿ´Rø´Rñ´Rê´Rã´RÜ´RÕ´RδRÇ´RÀ´R¹´R²´R«´R¤´R´R–´R´Rˆ´R´Rz´Rs´Rl´Re´R^´RW´RP´RI´RB´R;´R4´R-´R&´R´R´R´R ´R´Rü³Rõ³Rî³Rç³Rà³RÙ³RÒ³R˳RijR½³R¶³R¯³R¨³R¡³Rš³R“³RŒ³R…³R~³Rw³Rp³Ri³Rb³R[³RT³RM³RF³R?³R8³R1³R*³R#³R³R³R³R³R³Rù²Rò²Rë²Rä²RݲRÖ²RϲRȲRÁ²Rº²R³²R¬²R¥²Rž²R—²R²R‰²R‚²R{²Rt²Rm²Rf²R_²RX²RQ²RJ²RC²R<²R5²R.²R'²R ²R²R²R ²R²Rý±Rö±Rï±Rè±Rá±RÚ±RÓ±ṞRűR¾±R·±R°±R©±R¢±R›±R”±R±R†±R±Rx±Rq±Rj±Rc±R\±RU±RN±RG±R@±R9±R2±R+±R$±R±R±R±R±R±Rú°Ró°Rì°Rå°RÞ°R×°RаRɰR°R»°R´°R­°R¦°RŸ°R˜°R‘°RаRƒ°R|°Ru°Rn°Rg°R`°RY°RR°RK°RD°R=°R6°R/°R(°R!°R°R°R °R°Rþ¯R÷¯Rð¯Ré¯Râ¯RÛ¯RÔ¯RͯRƯR¿¯R¸¯R±¯Rª¯R£¯Rœ¯R•¯RޝR‡¯R€¯Ry¯Rr¯Rk¯Rd¯R]¯RV¯RO¯RH¯RA¯R:¯R3¯R,¯R%¯R¯R¯R¯R ¯R¯Rû®Rô®Rí®Ræ®Rß®RØ®RÑ®RÊ®RîR¼®Rµ®R®®R§®R ®R™®R’®R‹®R„®R}®Rv®Ro®Rh®Ra®RZ®RS®RL®RE®R>®R7®R0®R)®R"®R®R®R ®R®Rÿ­Rø­Rñ­Rê­Rã­RÜ­RÕ­RέRÇ­RÀ­R¹­R²­R«­R¤­R­R–­R­Rˆ­R­Rz­Rs­Rl­Re­R^­RW­RP­RI­RB­R;­R4­R-­R&­R­R­R­R ­R­Rü¬Rõ¬Rî¬Rç¬Rà¬RÙ¬RÒ¬RˬRĬR½¬R¶¬R¯¬R¨¬R¡¬Rš¬R“¬RŒ¬R…¬R~¬Rw¬Rp¬Ri¬Rb¬R[¬RT¬RM¬RF¬R?¬R8¬R1¬R*¬R#¬R¬R¬R¬R¬R¬Rù«Rò«Rë«Rä«RÝ«RÖ«RÏ«RÈ«RÁ«Rº«R³«R¬«R¥«Rž«R—«R«R‰«R‚«R{«Rt«Rm«Rf«R_«RX«RQ«RJ«RC«R<«R5«R.«R'«R «R«R«R «R«RýªRöªRïªRèªRáªRÚªRÓªR̪RŪR¾ªR·ªR°ªR©ªR¢ªR›ªR”ªRªR†ªRªRxªRqªRjªRcªR\ªRUªRNªRGªR@ªR9ªR2ªR+ªR$ªRªRªRªRªRªRú©Ró©Rì©Rå©RÞ©RשRЩRÉ©R©R»©R´©R­©R¦©RŸ©R˜©R‘©RŠ©Rƒ©R|©Ru©Rn©Rg©R`©RY©RR©RK©RD©R=©R6©R/©R(©R!©R©R©R ©R©Rþ¨R÷¨Rð¨Ré¨Râ¨RÛ¨RÔ¨RͨRƨR¿¨R¸¨R±¨Rª¨R£¨Rœ¨R•¨RލR‡¨R€¨Ry¨Rr¨Rk¨Rd¨R]¨RV¨RO¨RH¨RA¨R:¨R3¨R,¨R%¨R¨R¨R¨R ¨R¨Rû§Rô§Rí§Ræ§Rß§RاRѧRʧRçR¼§Rµ§R®§R§§R §R™§R’§R‹§R„§R}§Rv§Ro§Rh§Ra§RZ§RS§RL§RE§R>§R7§R0§R)§R"§R§R§R §R§Rÿ¦Rø¦Rñ¦Rê¦Rã¦RܦRÕ¦RΦRǦRÀ¦R¹¦R²¦R«¦R¤¦R¦R–¦R¦Rˆ¦R¦Rz¦Rs¦Rl¦Re¦R^¦RW¦RP¦RI¦RB¦R;¦R4¦R-¦R&¦R¦R¦R¦R ¦R¦Rü¥Rõ¥Rî¥Rç¥Rà¥RÙ¥RÒ¥RË¥RÄ¥R½¥R¶¥R¯¥R¨¥R¡¥Rš¥R“¥RŒ¥R…¥R~¥Rw¥Rp¥Ri¥Rb¥R[¥RT¥RM¥RF¥R?¥R8¥R1¥R*¥R#¥R¥R¥R¥R¥R¥Rù¤Rò¤Rë¤Rä¤RݤRÖ¤RϤRȤRÁ¤Rº¤R³¤R¬¤R¥¤Rž¤R—¤R¤R‰¤R‚¤R{¤Rt¤Rm¤Rf¤R_¤RX¤RQ¤RJ¤RC¤R<¤R5¤R.¤R'¤R ¤R¤R¤R ¤R¤Rý£Rö£Rï£Rè£Rá£RÚ£RÓ£RÌ£RÅ£R¾£R·£R°£R©£R¢£R›£R”£R£R†£R£Rx£Rq£Rj£Rc£R\£RU£RN£RG£R@£R9£R2£R+£R$£R£R£R£R£R£Rú¢Ró¢Rì¢Rå¢RÞ¢R×¢RТRÉ¢R¢R»¢R´¢R­¢R¦¢RŸ¢R˜¢R‘¢RŠ¢Rƒ¢R|¢Ru¢Rn¢Rg¢R`¢RY¢RR¢RK¢RD¢R=¢R6¢R/¢R(¢R!¢R¢R¢R ¢R¢Rþ¡R÷¡Rð¡Ré¡Râ¡RÛ¡RÔ¡RÍ¡RÆ¡R¿¡R¸¡R±¡Rª¡R£¡Rœ¡R•¡RŽ¡R‡¡R€¡Ry¡Rr¡Rk¡Rd¡R]¡RV¡RO¡RH¡RA¡R:¡R3¡R,¡R%¡R¡R¡R¡R ¡R¡Rû Rô Rí Ræ Rß RØ RÑ RÊ RàR¼ Rµ R® R§ R  R™ R’ R‹ R„ R} Rv Ro Rh Ra RZ RS RL RE R> R7 R0 R) R" R R R  R RÿŸRøŸRñŸRêŸRãŸRÜŸRÕŸRΟRÇŸRÀŸR¹ŸR²ŸR«ŸR¤ŸRŸR–ŸRŸRˆŸRŸRzŸRsŸRlŸReŸR^ŸRWŸRPŸRIŸRBŸR;ŸR4ŸR-ŸR&ŸRŸRŸRŸR ŸRŸRüžRõžRîžRçžRàžRÙžRÒžRËžRÄžR½žR¶žR¯žR¨žR¡žRšžR“žRŒžR…žR~žRwžRpžRižRbžR[žRTžRMžRFžR?žR8žR1žR*žR#žRžRžRžRžRžRùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR™R7™R0™R)™R"™R™R™R ™R™Rÿ˜Rø˜Rñ˜Rê˜Rã˜RܘRÕ˜RΘRǘRÀ˜R¹˜R²˜R«˜R¤˜R˜R–˜R˜Rˆ˜R˜Rz˜Rs˜Rl˜Re˜R^˜RW˜RP˜RI˜RB˜R;˜R4˜R-˜R&˜R˜R˜R˜R ˜R˜Rü—Rõ—Rî—Rç—Rà—RÙ—RÒ—RË—RÄ—R½—R¶—R¯—R¨—R¡—Rš—R“—RŒ—R…—R~—Rw—Rp—Ri—Rb—R[—RT—RM—RF—R?—R8—R1—R*—R#—R—R—R—R—R—Rù–Rò–Rë–Rä–RÝ–RÖ–RÏ–RÈ–RÁ–Rº–R³–R¬–R¥–Rž–R—–R–R‰–R‚–R{–Rt–Rm–Rf–R_–RX–RQ–RJ–RC–R<–R5–R.–R'–R –R–R–R –R–Rý•Rö•Rï•Rè•Rá•RÚ•RÓ•RÌ•RÅ•R¾•R·•R°•R©•R¢•R›•R”•R•R†•R•Rx•Rq•Rj•Rc•R\•RU•RN•RG•R@•R9•R2•R+•R$•R•R•R•R•R•Rú”Ró”Rì”Rå”RÞ”R×”RДRÉ”R”R»”R´”R­”R¦”RŸ”R˜”R‘”RŠ”Rƒ”R|”Ru”Rn”Rg”R`”RY”RR”RK”RD”R=”R6”R/”R(”R!”R”R”R ”R”Rþ“R÷“Rð“Ré“Râ“RÛ“RÔ“RÍ“RÆ“R¿“R¸“R±“Rª“R£“Rœ“R•“RŽ“R‡“R€“Ry“Rr“Rk“Rd“R]“RV“RO“RH“RA“R:“R3“R,“R%“R“R“R“R “R“Rû’Rô’Rí’Ræ’Rß’RØ’RÑ’RÊ’RÃ’R¼’Rµ’R®’R§’R ’R™’R’’R‹’R„’R}’Rv’Ro’Rh’Ra’RZ’RS’RL’RE’R>’R7’R0’R)’R"’R’R’R ’R’Rÿ‘Rø‘Rñ‘Rê‘Rã‘RÜ‘RÕ‘RΑRÇ‘RÀ‘R¹‘R²‘R«‘R¤‘R‘R–‘R‘Rˆ‘R‘Rz‘Rs‘Rl‘Re‘R^‘RW‘RP‘RI‘RB‘R;‘R4‘R-‘R&‘R‘R‘R‘R ‘R‘RüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR‹R7‹R0‹R)‹R"‹R‹R‹R ‹R‹RÿŠRøŠRñŠRêŠRãŠRÜŠRÕŠRΊRÇŠRÀŠR¹ŠR²ŠR«ŠR¤ŠRŠR–ŠRŠRˆŠRŠRzŠRsŠRlŠReŠR^ŠRWŠRPŠRIŠRBŠR;ŠR4ŠR-ŠR&ŠRŠRŠRŠR ŠRŠRü‰Rõ‰Rî‰Rç‰Rà‰RÙ‰RÒ‰RˉRĉR½‰R¶‰R¯‰R¨‰R¡‰Rš‰R“‰RŒ‰R…‰R~‰Rw‰Rp‰Ri‰Rb‰R[‰RT‰RM‰RF‰R?‰R8‰R1‰R*‰R#‰R‰R‰R‰R‰R‰RùˆRòˆRëˆRäˆR݈RÖˆRψRȈRÁˆRºˆR³ˆR¬ˆR¥ˆRžˆR—ˆRˆR‰ˆR‚ˆR{ˆRtˆRmˆRfˆR_ˆRXˆRQˆRJˆRCˆR<ˆR5ˆR.ˆR'ˆR ˆRˆRˆR ˆRˆRý‡Rö‡Rï‡Rè‡Rá‡RÚ‡RÓ‡ṘRŇR¾‡R·‡R°‡R©‡R¢‡R›‡R”‡R‡R†‡R‡Rx‡Rq‡Rj‡Rc‡R\‡RU‡RN‡RG‡R@‡R9‡R2‡R+‡R$‡R‡R‡R‡R‡R‡Rú†Ró†Rì†Rå†RÞ†R׆RІRɆR†R»†R´†R­†R¦†RŸ†R˜†R‘†RІRƒ†R|†Ru†Rn†Rg†R`†RY†RR†RK†RD†R=†R6†R/†R(†R!†R†R†R †R†Rþ…R÷…Rð…Ré…Râ…RÛ…RÔ…RÍ…RÆ…R¿…R¸…R±…Rª…R£…Rœ…R•…RŽ…R‡…R€…Ry…Rr…Rk…Rd…R]…RV…RO…RH…RA…R:…R3…R,…R%…R…R…R…R …R…Rû„Rô„Rí„Ræ„Rß„RØ„RÑ„RÊ„RÄR¼„Rµ„R®„R§„R „R™„R’„R‹„R„„R}„Rv„Ro„Rh„Ra„RZ„RS„RL„RE„R>„R7„R0„R)„R"„R„R„R „R„RÿƒRøƒRñƒRêƒRãƒR܃RÕƒR΃RǃRÀƒR¹ƒR²ƒR«ƒR¤ƒRƒR–ƒRƒRˆƒRƒRzƒRsƒRlƒReƒR^ƒRWƒRPƒRIƒRBƒR;ƒR4ƒR-ƒR&ƒRƒRƒRƒR ƒRƒRü‚Rõ‚Rî‚Rç‚Rà‚RÙ‚RÒ‚RË‚RÄ‚R½‚R¶‚R¯‚R¨‚R¡‚Rš‚R“‚RŒ‚R…‚R~‚Rw‚Rp‚Ri‚Rb‚R[‚RT‚RM‚RF‚R?‚R8‚R1‚R*‚R#‚R‚R‚R‚R‚R‚RùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR}R7}R0}R)}R"}R}R}R }R}Rÿ|Rø|Rñ|Rê|Rã|RÜ|RÕ|RÎ|RÇ|RÀ|R¹|R²|R«|R¤|R|R–|R|Rˆ|R|Rz|Rs|Rl|Re|R^|RW|RP|RI|RB|R;|R4|R-|R&|R|R|R|R |R|Rü{Rõ{Rî{Rç{Rà{RÙ{RÒ{RË{RÄ{R½{R¶{R¯{R¨{R¡{Rš{R“{RŒ{R…{R~{Rw{Rp{Ri{Rb{R[{RT{RM{RF{R?{R8{R1{R*{R#{R{R{R{R{R{RùzRòzRëzRäzRÝzRÖzRÏzRÈzRÁzRºzR³zR¬zR¥zRžzR—zRzR‰zR‚zR{zRtzRmzRfzR_zRXzRQzRJzRCzRvR7vR0vR)vR"vRvRvR vRvRÿuRøuRñuRêuRãuRÜuRÕuRÎuRÇuRÀuR¹uR²uR«uR¤uRuR–uRuRˆuRuRzuRsuRluReuR^uRWuRPuRIuRBuR;uR4uR-uR&uRuRuRuR uRuRütRõtRîtRçtRàtRÙtRÒtRËtRÄtR½tR¶tR¯tR¨tR¡tRštR“tRŒtR…tR~tRwtRptRitRbtR[tRTtRMtRFtR?tR8tR1tR*tR#tRtRtRtRtRtRùsRòsRësRäsRÝsRÖsRÏsRÈsRÁsRºsR³sR¬sR¥sRžsR—sRsR‰sR‚sR{sRtsRmsRfsR_sRXsRQsRJsRCsRoR7oR0oR)oR"oRoRoR oRoRÿnRønRñnRênRãnRÜnRÕnRÎnRÇnRÀnR¹nR²nR«nR¤nRnR–nRnRˆnRnRznRsnRlnRenR^nRWnRPnRInRBnR;nR4nR-nR&nRnRnRnR nRnRümRõmRîmRçmRàmRÙmRÒmRËmRÄmR½mR¶mR¯mR¨mR¡mRšmR“mRŒmR…mR~mRwmRpmRimRbmR[mRTmRMmRFmR?mR8mR1mR*mR#mRmRmRmRmRmRùlRòlRëlRälRÝlRÖlRÏlRÈlRÁlRºlR³lR¬lR¥lRžlR—lRlR‰lR‚lR{lRtlRmlRflR_lRXlRQlRJlRClRhR7hR0hR)hR"hRhRhR hRhRÿgRøgRñgRêgRãgRÜgRÕgRÎgRÇgRÀgR¹gR²gR«gR¤gRgR–gRgRˆgRgRzgRsgRlgRegR^gRWgRPgRIgRBgR;gR4gR-gR&gRgRgRgR gRgRüfRõfRîfRçfRàfRÙfRÒfRËfRÄfR½fR¶fR¯fR¨fR¡fRšfR“fRŒfR…fR~fRwfRpfRifRbfR[fRTfRMfRFfR?fR8fR1fR*fR#fRfRfRfRfRfRùeRòeRëeRäeRÝeRÖeRÏeRÈeRÁeRºeR³eR¬eR¥eRžeR—eReR‰eR‚eR{eRteRmeRfeR_eRXeRQeRJeRCeRaR7aR0aR)aR"aRaRaR aRaRÿ`Rø`Rñ`Rê`Rã`RÜ`RÕ`RÎ`RÇ`RÀ`R¹`R²`R«`R¤`R`R–`R`Rˆ`R`Rz`Rs`Rl`Re`R^`RW`RP`RI`RB`R;`R4`R-`R&`R`R`R`R `R`Rü_Rõ_Rî_Rç_Rà_RÙ_RÒ_RË_RÄ_R½_R¶_R¯_R¨_R¡_Rš_R“_RŒ_R…_R~_Rw_Rp_Ri_Rb_R[_RT_RM_RF_R?_R8_R1_R*_R#_R_R_R_R_R_Rù^Rò^Rë^Rä^RÝ^RÖ^RÏ^RÈ^RÁ^Rº^R³^R¬^R¥^Rž^R—^R^R‰^R‚^R{^Rt^Rm^Rf^R_^RX^RQ^RJ^RC^R<^R5^R.^R'^R ^R^R^R ^R^Rý]Rö]Rï]Rè]Rá]RÚ]RÓ]RÌ]RÅ]R¾]R·]R°]R©]R¢]R›]R”]R]R†]R]Rx]Rq]Rj]Rc]R\]RU]RN]RG]R@]R9]R2]R+]R$]R]R]R]R]R]Rú\Ró\Rì\Rå\RÞ\R×\RÐ\RÉ\RÂ\R»\R´\R­\R¦\RŸ\R˜\R‘\RŠ\Rƒ\R|\Ru\Rn\Rg\R`\RY\RR\RK\RD\R=\R6\R/\R(\R!\R\R\R \R\Rþ[R÷[Rð[Ré[Râ[RÛ[RÔ[RÍ[RÆ[R¿[R¸[R±[Rª[R£[Rœ[R•[RŽ[R‡[R€[Ry[Rr[Rk[Rd[R][RV[RO[RH[RA[R:[R3[R,[R%[R[R[R[R [R[RûZRôZRíZRæZRßZRØZRÑZRÊZRÃZR¼ZRµZR®ZR§ZR ZR™ZR’ZR‹ZR„ZR}ZRvZRoZRhZRaZRZZRSZRLZREZR>ZR7ZR0ZR)ZR"ZRZRZR ZRZRÿYRøYRñYRêYRãYRÜYRÕYRÎYRÇYRÀYR¹YR²YR«YR¤YRYR–YRYRˆYRYRzYRsYRlYReYR^YRWYRPYRIYRBYR;YR4YR-YR&YRYRYRYR YRYRüXRõXRîXRçXRàXRÙXRÒXRËXRÄXR½XR¶XR¯XR¨XR¡XRšXR“XRŒXR…XR~XRwXRpXRiXRbXR[XRTXRMXRFXR?XR8XR1XR*XR#XRXRXRXRXRXRùWRòWRëWRäWRÝWRÖWRÏWRÈWRÁWRºWR³WR¬WR¥WRžWR—WRWR‰WR‚WR{WRtWRmWRfWR_WRXWRQWRJWRCWRSR7SR0SR)SR"SRSRSR SRSRÿRRøRRñRRêRRãRRÜRRÕRRÎRRÇRRÀRR¹RR²RR«RR¤RRRR–RRRRˆRRRRzRRsRRlRReRR^RRWRRPRRIRRBRR;RR4RR-RR&RRRRRRRR RRRRüQRõQRîQRçQRàQRÙQRÒQRËQRÄQR½QR¶QR¯QR¨QR¡QRšQR“QRŒQR…QR~QRwQRpQRiQRbQR[QRTQRMQRFQR?QR8QR1QR*QR#QRQRQRQRQRQRùPRòPRëPRäPRÝPRÖPRÏPRÈPRÁPRºPR³PR¬PR¥PRžPR—PRPR‰PR‚PR{PRtPRmPRfPR_PRXPRQPRJPRCPRLR7LR0LR)LR"LRLRLR LRLRÿKRøKRñKRêKRãKRÜKRÕKRÎKRÇKRÀKR¹KR²KR«KR¤KRKR–KRKRˆKRKRzKRsKRlKReKR^KRWKRPKRIKRBKR;KR4KR-KR&KRKRKRKR KRKRüJRõJRîJRçJRàJRÙJRÒJRËJRÄJR½JR¶JR¯JR¨JR¡JRšJR“JRŒJR…JR~JRwJRpJRiJRbJR[JRTJRMJRFJR?JR8JR1JR*JR#JRJRJRJRJRJRùIRòIRëIRäIRÝIRÖIRÏIRÈIRÁIRºIR³IR¬IR¥IRžIR—IRIR‰IR‚IR{IRtIRmIRfIR_IRXIRQIRJIRCIRER7ER0ER)ER"ERERER ERERÿDRøDRñDRêDRãDRÜDRÕDRÎDRÇDRÀDR¹DR²DR«DR¤DRDR–DRDRˆDRDRzDRsDRlDReDR^DRWDRPDRIDRBDR;DR4DR-DR&DRDRDRDR DRDRüCRõCRîCRçCRàCRÙCRÒCRËCRÄCR½CR¶CR¯CR¨CR¡CRšCR“CRŒCR…CR~CRwCRpCRiCRbCR[CRTCRMCRFCR?CR8CR1CR*CR#CRCRCRCRCRCRùBRòBRëBRäBRÝBRÖBRÏBRÈBRÁBRºBR³BR¬BR¥BRžBR—BRBR‰BR‚BR{BRtBRmBRfBR_BRXBRQBRJBRCBRRô>Rí>Ræ>Rß>RØ>RÑ>RÊ>RÃ>R¼>Rµ>R®>R§>R >R™>R’>R‹>R„>R}>Rv>Ro>Rh>Ra>RZ>RS>RL>RE>R>>R7>R0>R)>R">R>R>R >R>Rÿ=Rø=Rñ=Rê=Rã=RÜ=RÕ=RÎ=RÇ=RÀ=R¹=R²=R«=R¤=R=R–=R=Rˆ=R=Rz=Rs=Rl=Re=R^=RW=RP=RI=RB=R;=R4=R-=R&=R=R=R=R =R=Rü7R77R07R)7R"7R7R7R 7R7Rÿ6Rø6Rñ6Rê6Rã6RÜ6RÕ6RÎ6RÇ6RÀ6R¹6R²6R«6R¤6R6R–6R6Rˆ6R6Rz6Rs6Rl6Re6R^6RW6RP6RI6RB6R;6R46R-6R&6R6R6R6R 6R6Rü5Rõ5Rî5Rç5Rà5RÙ5RÒ5RË5RÄ5R½5R¶5R¯5R¨5R¡5Rš5R“5RŒ5R…5R~5Rw5Rp5Ri5Rb5R[5RT5RM5RF5R?5R85R15R*5R#5R5R5R5R5R5Rù4Rò4Rë4Rä4RÝ4RÖ4RÏ4RÈ4RÁ4Rº4R³4R¬4R¥4Rž4R—4R4R‰4R‚4R{4Rt4Rm4Rf4R_4RX4RQ4RJ4RC4R<4R54R.4R'4R 4R4R4R 4R4Rý3Rö3Rï3Rè3Rá3RÚ3RÓ3RÌ3RÅ3R¾3R·3R°3R©3R¢3R›3R”3R3R†3R3Rx3Rq3Rj3Rc3R\3RU3RN3RG3R@3R93R23R+3R$3R3R3R3R3R3Rú2Ró2Rì2Rå2RÞ2R×2RÐ2RÉ2RÂ2R»2R´2R­2R¦2RŸ2R˜2R‘2RŠ2Rƒ2R|2Ru2Rn2Rg2R`2RY2RR2RK2RD2R=2R62R/2R(2R!2R2R2R 2R2Rþ1R÷1Rð1Ré1Râ1RÛ1RÔ1RÍ1RÆ1R¿1R¸1R±1Rª1R£1Rœ1R•1RŽ1R‡1R€1Ry1Rr1Rk1Rd1R]1RV1RO1RH1RA1R:1R31R,1R%1R1R1R1R 1R1Rû0Rô0Rí0Ræ0Rß0RØ0RÑ0RÊ0RÃ0R¼0Rµ0R®0R§0R 0R™0R’0R‹0R„0R}0Rv0Ro0Rh0Ra0RZ0RS0RL0RE0R>0R70R00R)0R"0R0R0R 0R0Rÿ/Rø/Rñ/Rê/Rã/RÜ/RÕ/RÎ/RÇ/RÀ/R¹/R²/R«/R¤/R/R–/R/Rˆ/R/Rz/Rs/Rl/Re/R^/RW/RP/RI/RB/R;/R4/R-/R&/R/R/R/R /R/Rü.Rõ.Rî.Rç.Rà.RÙ.RÒ.RË.RÄ.R½.R¶.R¯.R¨.R¡.Rš.R“.RŒ.R….R~.Rw.Rp.Ri.Rb.R[.RT.RM.RF.R?.R8.R1.R*.R#.R.R.R.R.R.Rù-Rò-Rë-Rä-RÝ-RÖ-RÏ-RÈ-RÁ-Rº-R³-R¬-R¥-Rž-R—-R-R‰-R‚-R{-Rt-Rm-Rf-R_-RX-RQ-RJ-RC-R<-R5-R.-R'-R -R-R-R -R-Rý,Rö,Rï,Rè,Rá,RÚ,RÓ,RÌ,RÅ,R¾,R·,R°,R©,R¢,R›,R”,R,R†,R,Rx,Rq,Rj,Rc,R\,RU,RN,RG,R@,R9,R2,R+,R$,R,R,R,R,R,Rú+Ró+Rì+Rå+RÞ+R×+RÐ+RÉ+RÂ+R»+R´+R­+R¦+RŸ+R˜+R‘+RŠ+Rƒ+R|+Ru+Rn+Rg+R`+RY+RR+RK+RD+R=+R6+R/+R(+R!+R+R+R +R+Rþ*R÷*Rð*Ré*Râ*RÛ*RÔ*RÍ*RÆ*R¿*R¸*R±*Rª*R£*Rœ*R•*RŽ*R‡*R€*Ry*Rr*Rk*Rd*R]*RV*RO*RH*RA*R:*R3*R,*R%*R*R*R*R *R*Rû)Rô)Rí)Ræ)Rß)RØ)RÑ)RÊ)RÃ)R¼)Rµ)R®)R§)R )R™)R’)R‹)R„)R})Rv)Ro)Rh)Ra)RZ)RS)RL)RE)R>)R7)R0)R))R")R)R)R )R)Rÿ(Rø(Rñ(Rê(Rã(RÜ(RÕ(RÎ(RÇ(RÀ(R¹(R²(R«(R¤(R(R–(R(Rˆ(R(Rz(Rs(Rl(Re(R^(RW(RP(RI(RB(R;(R4(R-(R&(R(R(R(R (R(Rü'Rõ'Rî'Rç'Rà'RÙ'RÒ'RË'RÄ'R½'R¶'R¯'R¨'R¡'Rš'R“'RŒ'R…'R~'Rw'Rp'Ri'Rb'R['RT'RM'RF'R?'R8'R1'R*'R#'R'R'R'R'R'Rù&Rò&Rë&Rä&RÝ&RÖ&RÏ&RÈ&RÁ&Rº&R³&R¬&R¥&Rž&R—&R&R‰&R‚&R{&Rt&Rm&Rf&R_&RX&RQ&RJ&RC&R<&R5&R.&R'&R &R&R&R &R&Rý%Rö%Rï%Rè%Rá%RÚ%RÓ%RÌ%RÅ%R¾%R·%R°%R©%R¢%R›%R”%R%R†%R%Rx%Rq%Rj%Rc%R\%RU%RN%RG%R@%R9%R2%R+%R$%R%R%R%R%R%Rú$Ró$Rì$Rå$RÞ$R×$RÐ$RÉ$RÂ$R»$R´$R­$R¦$RŸ$R˜$R‘$RŠ$Rƒ$R|$Ru$Rn$Rg$R`$RY$RR$RK$RD$R=$R6$R/$R($R!$R$R$R $R$Rþ#R÷#Rð#Ré#Râ#RÛ#RÔ#RÍ#RÆ#R¿#R¸#R±#Rª#R£#Rœ#R•#RŽ#R‡#R€#Ry#Rr#Rk#Rd#R]#RV#RO#RH#RA#R:#R3#R,#R%#R#R#R#R #R#Rû"Rô"Rí"Ræ"Rß"RØ"RÑ"RÊ"RÃ"R¼"Rµ"R®"R§"R "R™"R’"R‹"R„"R}"Rv"Ro"Rh"Ra"RZ"RS"RL"RE"R>"R7"R0"R)"R""R"R"R "R"Rÿ!Rø!Rñ!Rê!Rã!RÜ!RÕ!RÎ!RÇ!RÀ!R¹!R²!R«!R¤!R!R–!R!Rˆ!R!Rz!Rs!Rl!Re!R^!RW!RP!RI!RB!R;!R4!R-!R&!R!R!R!R !R!Rü Rõ Rî Rç Rà RÙ RÒ RË RÄ R½ R¶ R¯ R¨ R¡ Rš R“ RŒ R… R~ Rw Rp Ri Rb R[ RT RM RF R? R8 R1 R* R# R R R R R RùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRýRöRïRèRáRÚRÓRÌRÅR¾R·R°R©R¢R›R”RR†RRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRúRóRìRåRÞR×RÐRÉRÂR»R´R­R¦RŸR˜R‘RŠRƒR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRþR÷RðRéRâRÛRÔRÍRÆR¿R¸R±RªR£RœR•RŽR‡R€RyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRûRôRíRæRßRØRÑRÊRÃR¼RµR®R§R R™R’R‹R„R}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRýRöRïRèRáRÚRÓRÌRÅR¾R·R°R©R¢R›R”RR†RRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRúRóRìRåRÞR×RÐRÉRÂR»R´R­R¦RŸR˜R‘RŠRƒR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRþR÷RðRéRâRÛRÔRÍRÆR¿R¸R±RªR£RœR•RŽR‡R€RyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRûRôRíRæRßRØRÑRÊRÃR¼RµR®R§R R™R’R‹R„R}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRýRöRïRèRáRÚRÓRÌRÅR¾R·R°R©R¢R›R”RR†RRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRúRóRìRåRÞR×RÐRÉRÂR»R´R­R¦RŸR˜R‘RŠRƒR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRþR÷RðRéRâRÛRÔRÍRÆR¿R¸R±RªR£RœR•RŽR‡R€RyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRû Rô Rí Ræ Rß RØ RÑ RÊ Rà R¼ Rµ R® R§ R  R™ R’ R‹ R„ R} Rv Ro Rh Ra RZ RS RL RE R> R7 R0 R) R" R R R R Rÿ Rø Rñ Rê Rã RÜ RÕ RÎ RÇ RÀ R¹ R² R« R¤ R R– R Rˆ R Rz Rs Rl Re R^ RW RP RI RB R; R4 R- R& R R R R R Rü Rõ Rî Rç Rà RÙ RÒ RË RÄ R½ R¶ R¯ R¨ R¡ Rš R“ RŒ R… R~ Rw Rp Ri Rb R[ RT RM RF R? R8 R1 R* R# R R R R R Rù Rò Rë Rä RÝ RÖ RÏ RÈ RÁ Rº R³ R¬ R¥ Rž R— R R‰ R‚ R{ Rt Rm Rf R_ RX RQ RJ RC R< R5 R. R' R R R R R Rý Rö Rï Rè Rá RÚ RÓ RÌ RÅ R¾ R· R° R© R¢ R› R” R R† R Rx Rq Rj Rc R\ RU RN RG R@ R9 R2 R+ R$ R R R R R RúRóRìRåRÞR×RÐRÉRÂR»R´R­R¦RŸR˜R‘RŠRƒR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRþR÷RðRéRâRÛRÔRÍRÆR¿R¸R±RªR£RœR•RŽR‡R€RyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRûRôRíRæRßRØRÑRÊRÃR¼RµR®R§R R™R’R‹R„R}RvRoRhRaRZRSRLRER>R7R0R)R"RRR RRÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCR<R5R.R'R RRR RRýRöRïRèRáRÚRÓRÌRÅR¾R·R°R©R¢R›R”RR†RRxRqRjRcR\RURNRGR@R9R2R+R$RRRRRRúRóRìRåRÞR×RÐRÉRÂR»R´R­R¦RŸR˜R‘RŠRƒR|RuRnRgR`RYRRRKRDR=R6R/R(R!RRR RRþR÷RðRéRâRÛRÔRÍRÆR¿R¸R±RªR£RœR•RŽR‡R€RyRrRkRdR]RVRORHRAR:R3R,R%RRRR RRûÿQôÿQíÿQæÿQßÿQØÿQÑÿQÊÿQÃÿQ¼ÿQµÿQ®ÿQ§ÿQ ÿQ™ÿQ’ÿQ‹ÿQ„ÿQ}ÿQvÿQoÿQhÿQaÿQZÿQSÿQLÿQEÿQ>ÿQ7ÿQ0ÿQ)ÿQ"ÿQÿQÿQ ÿQÿQÿþQøþQñþQêþQãþQÜþQÕþQÎþQÇþQÀþQ¹þQ²þQ«þQ¤þQþQ–þQþQˆþQþQzþQsþQlþQeþQ^þQWþQPþQIþQBþQ;þQ4þQ-þQ&þQþQþQþQ þQþQüýQõýQîýQçýQàýQÙýQÒýQËýQÄýQ½ýQ¶ýQ¯ýQ¨ýQ¡ýQšýQ“ýQŒýQ…ýQ~ýQwýQpýQiýQbýQ[ýQTýQMýQFýQ?ýQ8ýQ1ýQ*ýQ#ýQýQýQýQýQýQùüQòüQëüQäüQÝüQÖüQÏüQÈüQÁüQºüQ³üQ¬üQ¥üQžüQ—üQüQ‰üQ‚üQ{üQtüQmüQfüQ_üQXüQQüQJüQCüQ<üQ5üQ.üQ'üQ üQüQüQ üQüQýûQöûQïûQèûQáûQÚûQÓûQÌûQÅûQ¾ûQ·ûQ°ûQ©ûQ¢ûQ›ûQ”ûQûQ†ûQûQxûQqûQjûQcûQ\ûQUûQNûQGûQ@ûQ9ûQ2ûQ+ûQ$ûQûQûQûQûQûQúúQóúQìúQåúQÞúQ×úQÐúQÉúQÂúQ»úQ´úQ­úQ¦úQŸúQ˜úQ‘úQŠúQƒúQ|úQuúQnúQgúQ`úQYúQRúQKúQDúQ=úQ6úQ/úQ(úQ!úQúQúQ úQúQþùQ÷ùQðùQéùQâùQÛùQÔùQÍùQÆùQ¿ùQ¸ùQ±ùQªùQ£ùQœùQ•ùQŽùQ‡ùQ€ùQyùQrùQkùQdùQ]ùQVùQOùQHùQAùQ:ùQ3ùQ,ùQ%ùQùQùQùQ ùQùQûøQôøQíøQæøQßøQØøQÑøQÊøQÃøQ¼øQµøQ®øQ§øQ øQ™øQ’øQ‹øQ„øQ}øQvøQoøQhøQaøQZøQSøQLøQEøQ>øQ7øQ0øQ)øQ"øQøQøQ øQøQÿ÷Qø÷Qñ÷Qê÷Qã÷QÜ÷QÕ÷QÎ÷QÇ÷QÀ÷Q¹÷Q²÷Q«÷Q¤÷Q÷Q–÷Q÷Qˆ÷Q÷Qz÷Qs÷Ql÷Qe÷Q^÷QW÷QP÷QI÷QB÷Q;÷Q4÷Q-÷Q&÷Q÷Q÷Q÷Q ÷Q÷QüöQõöQîöQçöQàöQÙöQÒöQËöQÄöQ½öQ¶öQ¯öQ¨öQ¡öQšöQ“öQŒöQ…öQ~öQwöQpöQiöQböQ[öQTöQMöQFöQ?öQ8öQ1öQ*öQ#öQöQöQöQöQöQùõQòõQëõQäõQÝõQÖõQÏõQÈõQÁõQºõQ³õQ¬õQ¥õQžõQ—õQõQ‰õQ‚õQ{õQtõQmõQfõQ_õQXõQQõQJõQCõQ<õQ5õQ.õQ'õQ õQõQõQ õQõQýôQöôQïôQèôQáôQÚôQÓôQÌôQÅôQ¾ôQ·ôQ°ôQ©ôQ¢ôQ›ôQ”ôQôQ†ôQôQxôQqôQjôQcôQ\ôQUôQNôQGôQ@ôQ9ôQ2ôQ+ôQ$ôQôQôQôQôQôQúóQóóQìóQåóQÞóQ×óQÐóQÉóQÂóQ»óQ´óQ­óQ¦óQŸóQ˜óQ‘óQŠóQƒóQ|óQuóQnóQgóQ`óQYóQRóQKóQDóQ=óQ6óQ/óQ(óQ!óQóQóQ óQóQþòQ÷òQðòQéòQâòQÛòQÔòQÍòQÆòQ¿òQ¸òQ±òQªòQ£òQœòQ•òQŽòQ‡òQ€òQyòQròQkòQdòQ]òQVòQOòQHòQAòQ:òQ3òQ,òQ%òQòQòQòQ òQòQûñQôñQíñQæñQßñQØñQÑñQÊñQÃñQ¼ñQµñQ®ñQ§ñQ ñQ™ñQ’ñQ‹ñQ„ñQ}ñQvñQoñQhñQañQZñQSñQLñQEñQ>ñQ7ñQ0ñQ)ñQ"ñQñQñQ ñQñQÿðQøðQñðQêðQãðQÜðQÕðQÎðQÇðQÀðQ¹ðQ²ðQ«ðQ¤ðQðQ–ðQðQˆðQðQzðQsðQlðQeðQ^ðQWðQPðQIðQBðQ;ðQ4ðQ-ðQ&ðQðQðQðQ ðQðQüïQõïQîïQçïQàïQÙïQÒïQËïQÄïQ½ïQ¶ïQ¯ïQ¨ïQ¡ïQšïQ“ïQŒïQ…ïQ~ïQwïQpïQiïQbïQ[ïQTïQMïQFïQ?ïQ8ïQ1ïQ*ïQ#ïQïQïQïQïQïQùîQòîQëîQäîQÝîQÖîQÏîQÈîQÁîQºîQ³îQ¬îQ¥îQžîQ—îQîQ‰îQ‚îQ{îQtîQmîQfîQ_îQXîQQîQJîQCîQ<îQ5îQ.îQ'îQ îQîQîQ îQîQýíQöíQïíQèíQáíQÚíQÓíQÌíQÅíQ¾íQ·íQ°íQ©íQ¢íQ›íQ”íQíQ†íQíQxíQqíQjíQcíQ\íQUíQNíQGíQ@íQ9íQ2íQ+íQ$íQíQíQíQíQíQúìQóìQììQåìQÞìQ×ìQÐìQÉìQÂìQ»ìQ´ìQ­ìQ¦ìQŸìQ˜ìQ‘ìQŠìQƒìQ|ìQuìQnìQgìQ`ìQYìQRìQKìQDìQ=ìQ6ìQ/ìQ(ìQ!ìQìQìQ ìQìQþëQ÷ëQðëQéëQâëQÛëQÔëQÍëQÆëQ¿ëQ¸ëQ±ëQªëQ£ëQœëQ•ëQŽëQ‡ëQ€ëQyëQrëQkëQdëQ]ëQVëQOëQHëQAëQ:ëQ3ëQ,ëQ%ëQëQëQëQ ëQëQûêQôêQíêQæêQßêQØêQÑêQÊêQÃêQ¼êQµêQ®êQ§êQ êQ™êQ’êQ‹êQ„êQ}êQvêQoêQhêQaêQZêQSêQLêQEêQ>êQ7êQ0êQ)êQ"êQêQêQ êQêQÿéQøéQñéQêéQãéQÜéQÕéQÎéQÇéQÀéQ¹éQ²éQ«éQ¤éQéQ–éQéQˆéQéQzéQséQléQeéQ^éQWéQPéQIéQBéQ;éQ4éQ-éQ&éQéQéQéQ éQéQüèQõèQîèQçèQàèQÙèQÒèQËèQÄèQ½èQ¶èQ¯èQ¨èQ¡èQšèQ“èQŒèQ…èQ~èQwèQpèQièQbèQ[èQTèQMèQFèQ?èQ8èQ1èQ*èQ#èQèQèQèQèQèQùçQòçQëçQäçQÝçQÖçQÏçQÈçQÁçQºçQ³çQ¬çQ¥çQžçQ—çQçQ‰çQ‚çQ{çQtçQmçQfçQ_çQXçQQçQJçQCçQ<çQ5çQ.çQ'çQ çQçQçQ çQçQýæQöæQïæQèæQáæQÚæQÓæQÌæQÅæQ¾æQ·æQ°æQ©æQ¢æQ›æQ”æQæQ†æQæQxæQqæQjæQcæQ\æQUæQNæQGæQ@æQ9æQ2æQ+æQ$æQæQæQæQæQæQúåQóåQìåQååQÞåQ×åQÐåQÉåQÂåQ»åQ´åQ­åQ¦åQŸåQ˜åQ‘åQŠåQƒåQ|åQuåQnåQgåQ`åQYåQRåQKåQDåQ=åQ6åQ/åQ(åQ!åQåQåQ åQåQþäQ÷äQðäQéäQâäQÛäQÔäQÍäQÆäQ¿äQ¸äQ±äQªäQ£äQœäQ•äQŽäQ‡äQ€äQyäQräQkäQdäQ]äQVäQOäQHäQAäQ:äQ3äQ,äQ%äQäQäQäQ äQäQûãQôãQíãQæãQßãQØãQÑãQÊãQÃãQ¼ãQµãQ®ãQ§ãQ ãQ™ãQ’ãQ‹ãQ„ãQ}ãQvãQoãQhãQaãQZãQSãQLãQEãQ>ãQ7ãQ0ãQ)ãQ"ãQãQãQ ãQãQÿâQøâQñâQêâQãâQÜâQÕâQÎâQÇâQÀâQ¹âQ²âQ«âQ¤âQâQ–âQâQˆâQâQzâQsâQlâQeâQ^âQWâQPâQIâQBâQ;âQ4âQ-âQ&âQâQâQâQ âQâQüáQõáQîáQçáQàáQÙáQÒáQËáQÄáQ½áQ¶áQ¯áQ¨áQ¡áQšáQ“áQŒáQ…áQ~áQwáQpáQiáQbáQ[áQTáQMáQFáQ?áQ8áQ1áQ*áQ#áQáQáQáQáQáQùàQòàQëàQäàQÝàQÖàQÏàQÈàQÁàQºàQ³àQ¬àQ¥àQžàQ—àQàQ‰àQ‚àQ{àQtàQmàQfàQ_àQXàQQàQJàQCàQ<àQ5àQ.àQ'àQ àQàQàQ àQàQýßQößQïßQèßQáßQÚßQÓßQÌßQÅßQ¾ßQ·ßQ°ßQ©ßQ¢ßQ›ßQ”ßQßQ†ßQßQxßQqßQjßQcßQ\ßQUßQNßQGßQ@ßQ9ßQ2ßQ+ßQ$ßQßQßQßQßQßQúÞQóÞQìÞQåÞQÞÞQ×ÞQÐÞQÉÞQÂÞQ»ÞQ´ÞQ­ÞQ¦ÞQŸÞQ˜ÞQ‘ÞQŠÞQƒÞQ|ÞQuÞQnÞQgÞQ`ÞQYÞQRÞQKÞQDÞQ=ÞQ6ÞQ/ÞQ(ÞQ!ÞQÞQÞQ ÞQÞQþÝQ÷ÝQðÝQéÝQâÝQÛÝQÔÝQÍÝQÆÝQ¿ÝQ¸ÝQ±ÝQªÝQ£ÝQœÝQ•ÝQŽÝQ‡ÝQ€ÝQyÝQrÝQkÝQdÝQ]ÝQVÝQOÝQHÝQAÝQ:ÝQ3ÝQ,ÝQ%ÝQÝQÝQÝQ ÝQÝQûÜQôÜQíÜQæÜQßÜQØÜQÑÜQÊÜQÃÜQ¼ÜQµÜQ®ÜQ§ÜQ ÜQ™ÜQ’ÜQ‹ÜQ„ÜQ}ÜQvÜQoÜQhÜQaÜQZÜQSÜQLÜQEÜQ>ÜQ7ÜQ0ÜQ)ÜQ"ÜQÜQÜQ ÜQÜQÿÛQøÛQñÛQêÛQãÛQÜÛQÕÛQÎÛQÇÛQÀÛQ¹ÛQ²ÛQ«ÛQ¤ÛQÛQ–ÛQÛQˆÛQÛQzÛQsÛQlÛQeÛQ^ÛQWÛQPÛQIÛQBÛQ;ÛQ4ÛQ-ÛQ&ÛQÛQÛQÛQ ÛQÛQüÚQõÚQîÚQçÚQàÚQÙÚQÒÚQËÚQÄÚQ½ÚQ¶ÚQ¯ÚQ¨ÚQ¡ÚQšÚQ“ÚQŒÚQ…ÚQ~ÚQwÚQpÚQiÚQbÚQ[ÚQTÚQMÚQFÚQ?ÚQ8ÚQ1ÚQ*ÚQ#ÚQÚQÚQÚQÚQÚQùÙQòÙQëÙQäÙQÝÙQÖÙQÏÙQÈÙQÁÙQºÙQ³ÙQ¬ÙQ¥ÙQžÙQ—ÙQÙQ‰ÙQ‚ÙQ{ÙQtÙQmÙQfÙQ_ÙQXÙQQÙQJÙQCÙQ<ÙQ5ÙQ.ÙQ'ÙQ ÙQÙQÙQ ÙQÙQýØQöØQïØQèØQáØQÚØQÓØQÌØQÅØQ¾ØQ·ØQ°ØQ©ØQ¢ØQ›ØQ”ØQØQ†ØQØQxØQqØQjØQcØQ\ØQUØQNØQGØQ@ØQ9ØQ2ØQ+ØQ$ØQØQØQØQØQØQú×Qó×Qì×Qå×QÞ×Q××QÐ×QÉ×QÂ×Q»×Q´×Q­×Q¦×QŸ×Q˜×Q‘×QŠ×Qƒ×Q|×Qu×Qn×Qg×Q`×QY×QR×QK×QD×Q=×Q6×Q/×Q(×Q!×Q×Q×Q ×Q×QþÖQ÷ÖQðÖQéÖQâÖQÛÖQÔÖQÍÖQÆÖQ¿ÖQ¸ÖQ±ÖQªÖQ£ÖQœÖQ•ÖQŽÖQ‡ÖQ€ÖQyÖQrÖQkÖQdÖQ]ÖQVÖQOÖQHÖQAÖQ:ÖQ3ÖQ,ÖQ%ÖQÖQÖQÖQ ÖQÖQûÕQôÕQíÕQæÕQßÕQØÕQÑÕQÊÕQÃÕQ¼ÕQµÕQ®ÕQ§ÕQ ÕQ™ÕQ’ÕQ‹ÕQ„ÕQ}ÕQvÕQoÕQhÕQaÕQZÕQSÕQLÕQEÕQ>ÕQ7ÕQ0ÕQ)ÕQ"ÕQÕQÕQ ÕQÕQÿÔQøÔQñÔQêÔQãÔQÜÔQÕÔQÎÔQÇÔQÀÔQ¹ÔQ²ÔQ«ÔQ¤ÔQÔQ–ÔQÔQˆÔQÔQzÔQsÔQlÔQeÔQ^ÔQWÔQPÔQIÔQBÔQ;ÔQ4ÔQ-ÔQ&ÔQÔQÔQÔQ ÔQÔQüÓQõÓQîÓQçÓQàÓQÙÓQÒÓQËÓQÄÓQ½ÓQ¶ÓQ¯ÓQ¨ÓQ¡ÓQšÓQ“ÓQŒÓQ…ÓQ~ÓQwÓQpÓQiÓQbÓQ[ÓQTÓQMÓQFÓQ?ÓQ8ÓQ1ÓQ*ÓQ#ÓQÓQÓQÓQÓQÓQùÒQòÒQëÒQäÒQÝÒQÖÒQÏÒQÈÒQÁÒQºÒQ³ÒQ¬ÒQ¥ÒQžÒQ—ÒQÒQ‰ÒQ‚ÒQ{ÒQtÒQmÒQfÒQ_ÒQXÒQQÒQJÒQCÒQ<ÒQ5ÒQ.ÒQ'ÒQ ÒQÒQÒQ ÒQÒQýÑQöÑQïÑQèÑQáÑQÚÑQÓÑQÌÑQÅÑQ¾ÑQ·ÑQ°ÑQ©ÑQ¢ÑQ›ÑQ”ÑQÑQ†ÑQÑQxÑQqÑQjÑQcÑQ\ÑQUÑQNÑQGÑQ@ÑQ9ÑQ2ÑQ+ÑQ$ÑQÑQÑQÑQÑQÑQúÐQóÐQìÐQåÐQÞÐQ×ÐQÐÐQÉÐQÂÐQ»ÐQ´ÐQ­ÐQ¦ÐQŸÐQ˜ÐQ‘ÐQŠÐQƒÐQ|ÐQuÐQnÐQgÐQ`ÐQYÐQRÐQKÐQDÐQ=ÐQ6ÐQ/ÐQ(ÐQ!ÐQÐQÐQ ÐQÐQþÏQ÷ÏQðÏQéÏQâÏQÛÏQÔÏQÍÏQÆÏQ¿ÏQ¸ÏQ±ÏQªÏQ£ÏQœÏQ•ÏQŽÏQ‡ÏQ€ÏQyÏQrÏQkÏQdÏQ]ÏQVÏQOÏQHÏQAÏQ:ÏQ3ÏQ,ÏQ%ÏQÏQÏQÏQ ÏQÏQûÎQôÎQíÎQæÎQßÎQØÎQÑÎQÊÎQÃÎQ¼ÎQµÎQ®ÎQ§ÎQ ÎQ™ÎQ’ÎQ‹ÎQ„ÎQ}ÎQvÎQoÎQhÎQaÎQZÎQSÎQLÎQEÎQ>ÎQ7ÎQ0ÎQ)ÎQ"ÎQÎQÎQ ÎQÎQÿÍQøÍQñÍQêÍQãÍQÜÍQÕÍQÎÍQÇÍQÀÍQ¹ÍQ²ÍQ«ÍQ¤ÍQÍQ–ÍQÍQˆÍQÍQzÍQsÍQlÍQeÍQ^ÍQWÍQPÍQIÍQBÍQ;ÍQ4ÍQ-ÍQ&ÍQÍQÍQÍQ ÍQÍQüÌQõÌQîÌQçÌQàÌQÙÌQÒÌQËÌQÄÌQ½ÌQ¶ÌQ¯ÌQ¨ÌQ¡ÌQšÌQ“ÌQŒÌQ…ÌQ~ÌQwÌQpÌQiÌQbÌQ[ÌQTÌQMÌQFÌQ?ÌQ8ÌQ1ÌQ*ÌQ#ÌQÌQÌQÌQÌQÌQùËQòËQëËQäËQÝËQÖËQÏËQÈËQÁËQºËQ³ËQ¬ËQ¥ËQžËQ—ËQËQ‰ËQ‚ËQ{ËQtËQmËQfËQ_ËQXËQQËQJËQCËQ<ËQ5ËQ.ËQ'ËQ ËQËQËQ ËQËQýÊQöÊQïÊQèÊQáÊQÚÊQÓÊQÌÊQÅÊQ¾ÊQ·ÊQ°ÊQ©ÊQ¢ÊQ›ÊQ”ÊQÊQ†ÊQÊQxÊQqÊQjÊQcÊQ\ÊQUÊQNÊQGÊQ@ÊQ9ÊQ2ÊQ+ÊQ$ÊQÊQÊQÊQÊQÊQúÉQóÉQìÉQåÉQÞÉQ×ÉQÐÉQÉÉQÂÉQ»ÉQ´ÉQ­ÉQ¦ÉQŸÉQ˜ÉQ‘ÉQŠÉQƒÉQ|ÉQuÉQnÉQgÉQ`ÉQYÉQRÉQKÉQDÉQ=ÉQ6ÉQ/ÉQ(ÉQ!ÉQÉQÉQ ÉQÉQþÈQ÷ÈQðÈQéÈQâÈQÛÈQÔÈQÍÈQÆÈQ¿ÈQ¸ÈQ±ÈQªÈQ£ÈQœÈQ•ÈQŽÈQ‡ÈQ€ÈQyÈQrÈQkÈQdÈQ]ÈQVÈQOÈQHÈQAÈQ:ÈQ3ÈQ,ÈQ%ÈQÈQÈQÈQ ÈQÈQûÇQôÇQíÇQæÇQßÇQØÇQÑÇQÊÇQÃÇQ¼ÇQµÇQ®ÇQ§ÇQ ÇQ™ÇQ’ÇQ‹ÇQ„ÇQ}ÇQvÇQoÇQhÇQaÇQZÇQSÇQLÇQEÇQ>ÇQ7ÇQ0ÇQ)ÇQ"ÇQÇQÇQ ÇQÇQÿÆQøÆQñÆQêÆQãÆQÜÆQÕÆQÎÆQÇÆQÀÆQ¹ÆQ²ÆQ«ÆQ¤ÆQÆQ–ÆQÆQˆÆQÆQzÆQsÆQlÆQeÆQ^ÆQWÆQPÆQIÆQBÆQ;ÆQ4ÆQ-ÆQ&ÆQÆQÆQÆQ ÆQÆQüÅQõÅQîÅQçÅQàÅQÙÅQÒÅQËÅQÄÅQ½ÅQ¶ÅQ¯ÅQ¨ÅQ¡ÅQšÅQ“ÅQŒÅQ…ÅQ~ÅQwÅQpÅQiÅQbÅQ[ÅQTÅQMÅQFÅQ?ÅQ8ÅQ1ÅQ*ÅQ#ÅQÅQÅQÅQÅQÅQùÄQòÄQëÄQäÄQÝÄQÖÄQÏÄQÈÄQÁÄQºÄQ³ÄQ¬ÄQ¥ÄQžÄQ—ÄQÄQ‰ÄQ‚ÄQ{ÄQtÄQmÄQfÄQ_ÄQXÄQQÄQJÄQCÄQ<ÄQ5ÄQ.ÄQ'ÄQ ÄQÄQÄQ ÄQÄQýÃQöÃQïÃQèÃQáÃQÚÃQÓÃQÌÃQÅÃQ¾ÃQ·ÃQ°ÃQ©ÃQ¢ÃQ›ÃQ”ÃQÃQ†ÃQÃQxÃQqÃQjÃQcÃQ\ÃQUÃQNÃQGÃQ@ÃQ9ÃQ2ÃQ+ÃQ$ÃQÃQÃQÃQÃQÃQúÂQóÂQìÂQåÂQÞÂQ×ÂQÐÂQÉÂQÂÂQ»ÂQ´ÂQ­ÂQ¦ÂQŸÂQ˜ÂQ‘ÂQŠÂQƒÂQ|ÂQuÂQnÂQgÂQ`ÂQYÂQRÂQKÂQDÂQ=ÂQ6ÂQ/ÂQ(ÂQ!ÂQÂQÂQ ÂQÂQþÁQ÷ÁQðÁQéÁQâÁQÛÁQÔÁQÍÁQÆÁQ¿ÁQ¸ÁQ±ÁQªÁQ£ÁQœÁQ•ÁQŽÁQ‡ÁQ€ÁQyÁQrÁQkÁQdÁQ]ÁQVÁQOÁQHÁQAÁQ:ÁQ3ÁQ,ÁQ%ÁQÁQÁQÁQ ÁQÁQûÀQôÀQíÀQæÀQßÀQØÀQÑÀQÊÀQÃÀQ¼ÀQµÀQ®ÀQ§ÀQ ÀQ™ÀQ’ÀQ‹ÀQ„ÀQ}ÀQvÀQoÀQhÀQaÀQZÀQSÀQLÀQEÀQ>ÀQ7ÀQ0ÀQ)ÀQ"ÀQÀQÀQ ÀQÀQÿ¿Qø¿Qñ¿Qê¿Qã¿QÜ¿QÕ¿QοQÇ¿QÀ¿Q¹¿Q²¿Q«¿Q¤¿Q¿Q–¿Q¿Qˆ¿Q¿Qz¿Qs¿Ql¿Qe¿Q^¿QW¿QP¿QI¿QB¿Q;¿Q4¿Q-¿Q&¿Q¿Q¿Q¿Q ¿Q¿Qü¾Qõ¾Qî¾Qç¾Qà¾QÙ¾QÒ¾Q˾QľQ½¾Q¶¾Q¯¾Q¨¾Q¡¾Qš¾Q“¾QŒ¾Q…¾Q~¾Qw¾Qp¾Qi¾Qb¾Q[¾QT¾QM¾QF¾Q?¾Q8¾Q1¾Q*¾Q#¾Q¾Q¾Q¾Q¾Q¾Qù½Qò½Që½Qä½QݽQÖ½QϽQȽQÁ½Qº½Q³½Q¬½Q¥½Qž½Q—½Q½Q‰½Q‚½Q{½Qt½Qm½Qf½Q_½QX½QQ½QJ½QC½Q<½Q5½Q.½Q'½Q ½Q½Q½Q ½Q½Qý¼Qö¼Qï¼Qè¼Qá¼QÚ¼QÓ¼Q̼QżQ¾¼Q·¼Q°¼Q©¼Q¢¼Q›¼Q”¼Q¼Q†¼Q¼Qx¼Qq¼Qj¼Qc¼Q\¼QU¼QN¼QG¼Q@¼Q9¼Q2¼Q+¼Q$¼Q¼Q¼Q¼Q¼Q¼Qú»Qó»Qì»Qå»QÞ»Q×»QлQÉ»Q»Q»»Q´»Q­»Q¦»QŸ»Q˜»Q‘»QŠ»Qƒ»Q|»Qu»Qn»Qg»Q`»QY»QR»QK»QD»Q=»Q6»Q/»Q(»Q!»Q»Q»Q »Q»QþºQ÷ºQðºQéºQâºQÛºQÔºQͺQƺQ¿ºQ¸ºQ±ºQªºQ£ºQœºQ•ºQŽºQ‡ºQ€ºQyºQrºQkºQdºQ]ºQVºQOºQHºQAºQ:ºQ3ºQ,ºQ%ºQºQºQºQ ºQºQû¹Qô¹Qí¹Qæ¹Qß¹QعQѹQʹQùQ¼¹Qµ¹Q®¹Q§¹Q ¹Q™¹Q’¹Q‹¹Q„¹Q}¹Qv¹Qo¹Qh¹Qa¹QZ¹QS¹QL¹QE¹Q>¹Q7¹Q0¹Q)¹Q"¹Q¹Q¹Q ¹Q¹Qÿ¸Qø¸Qñ¸Qê¸Qã¸QܸQÕ¸QθQǸQÀ¸Q¹¸Q²¸Q«¸Q¤¸Q¸Q–¸Q¸Qˆ¸Q¸Qz¸Qs¸Ql¸Qe¸Q^¸QW¸QP¸QI¸QB¸Q;¸Q4¸Q-¸Q&¸Q¸Q¸Q¸Q ¸Q¸Qü·Qõ·Qî·Qç·Qà·QÙ·QÒ·QË·QÄ·Q½·Q¶·Q¯·Q¨·Q¡·Qš·Q“·QŒ·Q…·Q~·Qw·Qp·Qi·Qb·Q[·QT·QM·QF·Q?·Q8·Q1·Q*·Q#·Q·Q·Q·Q·Q·Qù¶Qò¶Që¶Qä¶QݶQÖ¶Q϶QȶQÁ¶Qº¶Q³¶Q¬¶Q¥¶Qž¶Q—¶Q¶Q‰¶Q‚¶Q{¶Qt¶Qm¶Qf¶Q_¶QX¶QQ¶QJ¶QC¶Q<¶Q5¶Q.¶Q'¶Q ¶Q¶Q¶Q ¶Q¶QýµQöµQïµQèµQáµQÚµQÓµQ̵QŵQ¾µQ·µQ°µQ©µQ¢µQ›µQ”µQµQ†µQµQxµQqµQjµQcµQ\µQUµQNµQGµQ@µQ9µQ2µQ+µQ$µQµQµQµQµQµQú´Qó´Qì´Qå´QÞ´Q×´QдQÉ´Q´Q»´Q´´Q­´Q¦´QŸ´Q˜´Q‘´QŠ´Qƒ´Q|´Qu´Qn´Qg´Q`´QY´QR´QK´QD´Q=´Q6´Q/´Q(´Q!´Q´Q´Q ´Q´Qþ³Q÷³Qð³Qé³Qâ³QÛ³QÔ³QͳQƳQ¿³Q¸³Q±³Qª³Q£³Qœ³Q•³Q޳Q‡³Q€³Qy³Qr³Qk³Qd³Q]³QV³QO³QH³QA³Q:³Q3³Q,³Q%³Q³Q³Q³Q ³Q³Qû²Qô²Qí²Qæ²Qß²QزQѲQʲQòQ¼²Qµ²Q®²Q§²Q ²Q™²Q’²Q‹²Q„²Q}²Qv²Qo²Qh²Qa²QZ²QS²QL²QE²Q>²Q7²Q0²Q)²Q"²Q²Q²Q ²Q²Qÿ±Qø±Qñ±Qê±Qã±QܱQÕ±QαQDZQÀ±Q¹±Q²±Q«±Q¤±Q±Q–±Q±Qˆ±Q±Qz±Qs±Ql±Qe±Q^±QW±QP±QI±QB±Q;±Q4±Q-±Q&±Q±Q±Q±Q ±Q±Qü°Qõ°Qî°Qç°Qà°QÙ°QÒ°Q˰QİQ½°Q¶°Q¯°Q¨°Q¡°Qš°Q“°QŒ°Q…°Q~°Qw°Qp°Qi°Qb°Q[°QT°QM°QF°Q?°Q8°Q1°Q*°Q#°Q°Q°Q°Q°Q°Qù¯Qò¯Që¯Qä¯QݯQÖ¯QϯQȯQÁ¯Qº¯Q³¯Q¬¯Q¥¯Qž¯Q—¯Q¯Q‰¯Q‚¯Q{¯Qt¯Qm¯Qf¯Q_¯QX¯QQ¯QJ¯QC¯Q<¯Q5¯Q.¯Q'¯Q ¯Q¯Q¯Q ¯Q¯Qý®Qö®Qï®Qè®Qá®QÚ®QÓ®QÌ®QÅ®Q¾®Q·®Q°®Q©®Q¢®Q›®Q”®Q®Q†®Q®Qx®Qq®Qj®Qc®Q\®QU®QN®QG®Q@®Q9®Q2®Q+®Q$®Q®Q®Q®Q®Q®Qú­Qó­Qì­Qå­QÞ­Q×­QЭQÉ­Q­Q»­Q´­Q­­Q¦­QŸ­Q˜­Q‘­QŠ­Qƒ­Q|­Qu­Qn­Qg­Q`­QY­QR­QK­QD­Q=­Q6­Q/­Q(­Q!­Q­Q­Q ­Q­Qþ¬Q÷¬Qð¬Qé¬Qâ¬QÛ¬QÔ¬QͬQƬQ¿¬Q¸¬Q±¬Qª¬Q£¬Qœ¬Q•¬QެQ‡¬Q€¬Qy¬Qr¬Qk¬Qd¬Q]¬QV¬QO¬QH¬QA¬Q:¬Q3¬Q,¬Q%¬Q¬Q¬Q¬Q ¬Q¬Qû«Qô«Qí«Qæ«Qß«QØ«QÑ«QÊ«QëQ¼«Qµ«Q®«Q§«Q «Q™«Q’«Q‹«Q„«Q}«Qv«Qo«Qh«Qa«QZ«QS«QL«QE«Q>«Q7«Q0«Q)«Q"«Q«Q«Q «Q«QÿªQøªQñªQêªQãªQܪQÕªQΪQǪQÀªQ¹ªQ²ªQ«ªQ¤ªQªQ–ªQªQˆªQªQzªQsªQlªQeªQ^ªQWªQPªQIªQBªQ;ªQ4ªQ-ªQ&ªQªQªQªQ ªQªQü©Qõ©Qî©Qç©Qà©QÙ©QÒ©QË©QÄ©Q½©Q¶©Q¯©Q¨©Q¡©Qš©Q“©QŒ©Q…©Q~©Qw©Qp©Qi©Qb©Q[©QT©QM©QF©Q?©Q8©Q1©Q*©Q#©Q©Q©Q©Q©Q©Qù¨Qò¨Që¨Qä¨QݨQÖ¨QϨQȨQÁ¨Qº¨Q³¨Q¬¨Q¥¨Qž¨Q—¨Q¨Q‰¨Q‚¨Q{¨Qt¨Qm¨Qf¨Q_¨QX¨QQ¨QJ¨QC¨Q<¨Q5¨Q.¨Q'¨Q ¨Q¨Q¨Q ¨Q¨Qý§Qö§Qï§Qè§Qá§QÚ§QÓ§Q̧QŧQ¾§Q·§Q°§Q©§Q¢§Q›§Q”§Q§Q†§Q§Qx§Qq§Qj§Qc§Q\§QU§QN§QG§Q@§Q9§Q2§Q+§Q$§Q§Q§Q§Q§Q§Qú¦Qó¦Qì¦Qå¦QÞ¦QצQЦQɦQ¦Q»¦Q´¦Q­¦Q¦¦QŸ¦Q˜¦Q‘¦QЦQƒ¦Q|¦Qu¦Qn¦Qg¦Q`¦QY¦QR¦QK¦QD¦Q=¦Q6¦Q/¦Q(¦Q!¦Q¦Q¦Q ¦Q¦Qþ¥Q÷¥Qð¥Qé¥Qâ¥QÛ¥QÔ¥QÍ¥QÆ¥Q¿¥Q¸¥Q±¥Qª¥Q£¥Qœ¥Q•¥QŽ¥Q‡¥Q€¥Qy¥Qr¥Qk¥Qd¥Q]¥QV¥QO¥QH¥QA¥Q:¥Q3¥Q,¥Q%¥Q¥Q¥Q¥Q ¥Q¥Qû¤Qô¤Qí¤Qæ¤QߤQؤQѤQʤQäQ¼¤Qµ¤Q®¤Q§¤Q ¤Q™¤Q’¤Q‹¤Q„¤Q}¤Qv¤Qo¤Qh¤Qa¤QZ¤QS¤QL¤QE¤Q>¤Q7¤Q0¤Q)¤Q"¤Q¤Q¤Q ¤Q¤Qÿ£Qø£Qñ£Qê£Qã£QÜ£QÕ£QΣQÇ£QÀ£Q¹£Q²£Q«£Q¤£Q£Q–£Q£Qˆ£Q£Qz£Qs£Ql£Qe£Q^£QW£QP£QI£QB£Q;£Q4£Q-£Q&£Q£Q£Q£Q £Q£Qü¢Qõ¢Qî¢Qç¢Qà¢QÙ¢QÒ¢QË¢QÄ¢Q½¢Q¶¢Q¯¢Q¨¢Q¡¢Qš¢Q“¢QŒ¢Q…¢Q~¢Qw¢Qp¢Qi¢Qb¢Q[¢QT¢QM¢QF¢Q?¢Q8¢Q1¢Q*¢Q#¢Q¢Q¢Q¢Q¢Q¢Qù¡Qò¡Që¡Qä¡QÝ¡QÖ¡QÏ¡QÈ¡QÁ¡Qº¡Q³¡Q¬¡Q¥¡Qž¡Q—¡Q¡Q‰¡Q‚¡Q{¡Qt¡Qm¡Qf¡Q_¡QX¡QQ¡QJ¡QC¡Q<¡Q5¡Q.¡Q'¡Q ¡Q¡Q¡Q ¡Q¡Qý Qö Qï Qè Qá QÚ QÓ QÌ QÅ Q¾ Q· Q° Q© Q¢ Q› Q” Q Q† Q Qx Qq Qj Qc Q\ QU QN QG Q@ Q9 Q2 Q+ Q$ Q Q Q Q Q QúŸQóŸQìŸQåŸQÞŸQןQПQÉŸQŸQ»ŸQ´ŸQ­ŸQ¦ŸQŸŸQ˜ŸQ‘ŸQŠŸQƒŸQ|ŸQuŸQnŸQgŸQ`ŸQYŸQRŸQKŸQDŸQ=ŸQ6ŸQ/ŸQ(ŸQ!ŸQŸQŸQ ŸQŸQþžQ÷žQðžQéžQâžQÛžQÔžQÍžQÆžQ¿žQ¸žQ±žQªžQ£žQœžQ•žQŽžQ‡žQ€žQyžQržQkžQdžQ]žQVžQOžQHžQAžQ:žQ3žQ,žQ%žQžQžQžQ žQžQûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿœQøœQñœQêœQãœQÜœQÕœQΜQÇœQÀœQ¹œQ²œQ«œQ¤œQœQ–œQœQˆœQœQzœQsœQlœQeœQ^œQWœQPœQIœQBœQ;œQ4œQ-œQ&œQœQœQœQ œQœQü›Qõ›Qî›Qç›Qà›QÙ›QÒ›QË›QÄ›Q½›Q¶›Q¯›Q¨›Q¡›Qš›Q“›QŒ›Q…›Q~›Qw›Qp›Qi›Qb›Q[›QT›QM›QF›Q?›Q8›Q1›Q*›Q#›Q›Q›Q›Q›Q›QùšQòšQëšQäšQÝšQÖšQÏšQÈšQÁšQºšQ³šQ¬šQ¥šQžšQ—šQšQ‰šQ‚šQ{šQtšQmšQfšQ_šQXšQQšQJšQCšQ<šQ5šQ.šQ'šQ šQšQšQ šQšQý™Qö™Qï™Qè™Qá™QÚ™QÓ™QÌ™QÅ™Q¾™Q·™Q°™Q©™Q¢™Q›™Q”™Q™Q†™Q™Qx™Qq™Qj™Qc™Q\™QU™QN™QG™Q@™Q9™Q2™Q+™Q$™Q™Q™Q™Q™Q™Qú˜Qó˜Qì˜Qå˜QÞ˜QטQИQɘQ˜Q»˜Q´˜Q­˜Q¦˜QŸ˜Q˜˜Q‘˜QŠ˜Qƒ˜Q|˜Qu˜Qn˜Qg˜Q`˜QY˜QR˜QK˜QD˜Q=˜Q6˜Q/˜Q(˜Q!˜Q˜Q˜Q ˜Q˜Qþ—Q÷—Qð—Qé—Qâ—QÛ—QÔ—QÍ—QÆ—Q¿—Q¸—Q±—Qª—Q£—Qœ—Q•—QŽ—Q‡—Q€—Qy—Qr—Qk—Qd—Q]—QV—QO—QH—QA—Q:—Q3—Q,—Q%—Q—Q—Q—Q —Q—Qû–Qô–Qí–Qæ–Qß–QØ–QÑ–QÊ–QÖQ¼–Qµ–Q®–Q§–Q –Q™–Q’–Q‹–Q„–Q}–Qv–Qo–Qh–Qa–QZ–QS–QL–QE–Q>–Q7–Q0–Q)–Q"–Q–Q–Q –Q–Qÿ•Qø•Qñ•Qê•Qã•QÜ•QÕ•QΕQÇ•QÀ•Q¹•Q²•Q«•Q¤•Q•Q–•Q•Qˆ•Q•Qz•Qs•Ql•Qe•Q^•QW•QP•QI•QB•Q;•Q4•Q-•Q&•Q•Q•Q•Q •Q•Qü”Qõ”Qî”Qç”Qà”QÙ”QÒ”QË”QÄ”Q½”Q¶”Q¯”Q¨”Q¡”Qš”Q“”QŒ”Q…”Q~”Qw”Qp”Qi”Qb”Q[”QT”QM”QF”Q?”Q8”Q1”Q*”Q#”Q”Q”Q”Q”Q”Qù“Qò“Që“Qä“QÝ“QÖ“QÏ“QÈ“QÁ“Qº“Q³“Q¬“Q¥“Qž“Q—“Q“Q‰“Q‚“Q{“Qt“Qm“Qf“Q_“QX“QQ“QJ“QC“Q<“Q5“Q.“Q'“Q “Q“Q“Q “Q“Qý’Qö’Qï’Qè’Qá’QÚ’QÓ’QÌ’QÅ’Q¾’Q·’Q°’Q©’Q¢’Q›’Q”’Q’Q†’Q’Qx’Qq’Qj’Qc’Q\’QU’QN’QG’Q@’Q9’Q2’Q+’Q$’Q’Q’Q’Q’Q’Qú‘Qó‘Qì‘Qå‘QÞ‘QבQБQÉ‘Q‘Q»‘Q´‘Q­‘Q¦‘QŸ‘Q˜‘Q‘‘QŠ‘Qƒ‘Q|‘Qu‘Qn‘Qg‘Q`‘QY‘QR‘QK‘QD‘Q=‘Q6‘Q/‘Q(‘Q!‘Q‘Q‘Q ‘Q‘QþQ÷QðQéQâQÛQÔQÍQÆQ¿Q¸Q±QªQ£QœQ•QŽQ‡Q€QyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿŽQøŽQñŽQêŽQãŽQÜŽQÕŽQÎŽQÇŽQÀŽQ¹ŽQ²ŽQ«ŽQ¤ŽQŽQ–ŽQŽQˆŽQŽQzŽQsŽQlŽQeŽQ^ŽQWŽQPŽQIŽQBŽQ;ŽQ4ŽQ-ŽQ&ŽQŽQŽQŽQ ŽQŽQüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùŒQòŒQëŒQäŒQÝŒQÖŒQÏŒQÈŒQÁŒQºŒQ³ŒQ¬ŒQ¥ŒQžŒQ—ŒQŒQ‰ŒQ‚ŒQ{ŒQtŒQmŒQfŒQ_ŒQXŒQQŒQJŒQCŒQ<ŒQ5ŒQ.ŒQ'ŒQ ŒQŒQŒQ ŒQŒQý‹Qö‹Qï‹Qè‹Qá‹QÚ‹QÓ‹QÌ‹QÅ‹Q¾‹Q·‹Q°‹Q©‹Q¢‹Q›‹Q”‹Q‹Q†‹Q‹Qx‹Qq‹Qj‹Qc‹Q\‹QU‹QN‹QG‹Q@‹Q9‹Q2‹Q+‹Q$‹Q‹Q‹Q‹Q‹Q‹QúŠQóŠQìŠQåŠQÞŠQ׊QЊQÉŠQŠQ»ŠQ´ŠQ­ŠQ¦ŠQŸŠQ˜ŠQ‘ŠQŠŠQƒŠQ|ŠQuŠQnŠQgŠQ`ŠQYŠQRŠQKŠQDŠQ=ŠQ6ŠQ/ŠQ(ŠQ!ŠQŠQŠQ ŠQŠQþ‰Q÷‰Qð‰Qé‰Qâ‰QÛ‰QÔ‰Q͉QƉQ¿‰Q¸‰Q±‰Qª‰Q£‰Qœ‰Q•‰QމQ‡‰Q€‰Qy‰Qr‰Qk‰Qd‰Q]‰QV‰QO‰QH‰QA‰Q:‰Q3‰Q,‰Q%‰Q‰Q‰Q‰Q ‰Q‰QûˆQôˆQíˆQæˆQ߈Q؈QшQʈQÈQ¼ˆQµˆQ®ˆQ§ˆQ ˆQ™ˆQ’ˆQ‹ˆQ„ˆQ}ˆQvˆQoˆQhˆQaˆQZˆQSˆQLˆQEˆQ>ˆQ7ˆQ0ˆQ)ˆQ"ˆQˆQˆQ ˆQˆQÿ‡Qø‡Qñ‡Qê‡Qã‡Q܇QÕ‡Q·QLJQÀ‡Q¹‡Q²‡Q«‡Q¤‡Q‡Q–‡Q‡Qˆ‡Q‡Qz‡Qs‡Ql‡Qe‡Q^‡QW‡QP‡QI‡QB‡Q;‡Q4‡Q-‡Q&‡Q‡Q‡Q‡Q ‡Q‡Qü†Qõ†Qî†Qç†Qà†QÙ†QÒ†QˆQĆQ½†Q¶†Q¯†Q¨†Q¡†Qš†Q“†QŒ†Q…†Q~†Qw†Qp†Qi†Qb†Q[†QT†QM†QF†Q?†Q8†Q1†Q*†Q#†Q†Q†Q†Q†Q†Qù…Qò…Që…Qä…QÝ…QÖ…QÏ…QÈ…QÁ…Qº…Q³…Q¬…Q¥…Qž…Q—…Q…Q‰…Q‚…Q{…Qt…Qm…Qf…Q_…QX…QQ…QJ…QC…Q<…Q5…Q.…Q'…Q …Q…Q…Q …Q…Qý„Qö„Qï„Qè„Qá„QÚ„QÓ„QÌ„QÅ„Q¾„Q·„Q°„Q©„Q¢„Q›„Q”„Q„Q†„Q„Qx„Qq„Qj„Qc„Q\„QU„QN„QG„Q@„Q9„Q2„Q+„Q$„Q„Q„Q„Q„Q„QúƒQóƒQìƒQåƒQÞƒQ׃QЃQɃQƒQ»ƒQ´ƒQ­ƒQ¦ƒQŸƒQ˜ƒQ‘ƒQŠƒQƒƒQ|ƒQuƒQnƒQgƒQ`ƒQYƒQRƒQKƒQDƒQ=ƒQ6ƒQ/ƒQ(ƒQ!ƒQƒQƒQ ƒQƒQþ‚Q÷‚Qð‚Qé‚Qâ‚QÛ‚QÔ‚QÍ‚QÆ‚Q¿‚Q¸‚Q±‚Qª‚Q£‚Qœ‚Q•‚QŽ‚Q‡‚Q€‚Qy‚Qr‚Qk‚Qd‚Q]‚QV‚QO‚QH‚QA‚Q:‚Q3‚Q,‚Q%‚Q‚Q‚Q‚Q ‚Q‚QûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿ€Qø€Qñ€Qê€Qã€QÜ€QÕ€Q΀QÇ€QÀ€Q¹€Q²€Q«€Q¤€Q€Q–€Q€Qˆ€Q€Qz€Qs€Ql€Qe€Q^€QW€QP€QI€QB€Q;€Q4€Q-€Q&€Q€Q€Q€Q €Q€QüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQù~Qò~Që~Qä~QÝ~QÖ~QÏ~QÈ~QÁ~Qº~Q³~Q¬~Q¥~Qž~Q—~Q~Q‰~Q‚~Q{~Qt~Qm~Qf~Q_~QX~QQ~QJ~QC~Q<~Q5~Q.~Q'~Q ~Q~Q~Q ~Q~Qý}Qö}Qï}Qè}Qá}QÚ}QÓ}QÌ}QÅ}Q¾}Q·}Q°}Q©}Q¢}Q›}Q”}Q}Q†}Q}Qx}Qq}Qj}Qc}Q\}QU}QN}QG}Q@}Q9}Q2}Q+}Q$}Q}Q}Q}Q}Q}Qú|Qó|Qì|Qå|QÞ|Q×|QÐ|QÉ|QÂ|Q»|Q´|Q­|Q¦|QŸ|Q˜|Q‘|QŠ|Qƒ|Q||Qu|Qn|Qg|Q`|QY|QR|QK|QD|Q=|Q6|Q/|Q(|Q!|Q|Q|Q |Q|Qþ{Q÷{Qð{Qé{Qâ{QÛ{QÔ{QÍ{QÆ{Q¿{Q¸{Q±{Qª{Q£{Qœ{Q•{QŽ{Q‡{Q€{Qy{Qr{Qk{Qd{Q]{QV{QO{QH{QA{Q:{Q3{Q,{Q%{Q{Q{Q{Q {Q{QûzQôzQízQæzQßzQØzQÑzQÊzQÃzQ¼zQµzQ®zQ§zQ zQ™zQ’zQ‹zQ„zQ}zQvzQozQhzQazQZzQSzQLzQEzQ>zQ7zQ0zQ)zQ"zQzQzQ zQzQÿyQøyQñyQêyQãyQÜyQÕyQÎyQÇyQÀyQ¹yQ²yQ«yQ¤yQyQ–yQyQˆyQyQzyQsyQlyQeyQ^yQWyQPyQIyQByQ;yQ4yQ-yQ&yQyQyQyQ yQyQüxQõxQîxQçxQàxQÙxQÒxQËxQÄxQ½xQ¶xQ¯xQ¨xQ¡xQšxQ“xQŒxQ…xQ~xQwxQpxQixQbxQ[xQTxQMxQFxQ?xQ8xQ1xQ*xQ#xQxQxQxQxQxQùwQòwQëwQäwQÝwQÖwQÏwQÈwQÁwQºwQ³wQ¬wQ¥wQžwQ—wQwQ‰wQ‚wQ{wQtwQmwQfwQ_wQXwQQwQJwQCwQsQ7sQ0sQ)sQ"sQsQsQ sQsQÿrQørQñrQêrQãrQÜrQÕrQÎrQÇrQÀrQ¹rQ²rQ«rQ¤rQrQ–rQrQˆrQrQzrQsrQlrQerQ^rQWrQPrQIrQBrQ;rQ4rQ-rQ&rQrQrQrQ rQrQüqQõqQîqQçqQàqQÙqQÒqQËqQÄqQ½qQ¶qQ¯qQ¨qQ¡qQšqQ“qQŒqQ…qQ~qQwqQpqQiqQbqQ[qQTqQMqQFqQ?qQ8qQ1qQ*qQ#qQqQqQqQqQqQùpQòpQëpQäpQÝpQÖpQÏpQÈpQÁpQºpQ³pQ¬pQ¥pQžpQ—pQpQ‰pQ‚pQ{pQtpQmpQfpQ_pQXpQQpQJpQCpQlQ7lQ0lQ)lQ"lQlQlQ lQlQÿkQøkQñkQêkQãkQÜkQÕkQÎkQÇkQÀkQ¹kQ²kQ«kQ¤kQkQ–kQkQˆkQkQzkQskQlkQekQ^kQWkQPkQIkQBkQ;kQ4kQ-kQ&kQkQkQkQ kQkQüjQõjQîjQçjQàjQÙjQÒjQËjQÄjQ½jQ¶jQ¯jQ¨jQ¡jQšjQ“jQŒjQ…jQ~jQwjQpjQijQbjQ[jQTjQMjQFjQ?jQ8jQ1jQ*jQ#jQjQjQjQjQjQùiQòiQëiQäiQÝiQÖiQÏiQÈiQÁiQºiQ³iQ¬iQ¥iQžiQ—iQiQ‰iQ‚iQ{iQtiQmiQfiQ_iQXiQQiQJiQCiQeQ7eQ0eQ)eQ"eQeQeQ eQeQÿdQødQñdQêdQãdQÜdQÕdQÎdQÇdQÀdQ¹dQ²dQ«dQ¤dQdQ–dQdQˆdQdQzdQsdQldQedQ^dQWdQPdQIdQBdQ;dQ4dQ-dQ&dQdQdQdQ dQdQücQõcQîcQçcQàcQÙcQÒcQËcQÄcQ½cQ¶cQ¯cQ¨cQ¡cQšcQ“cQŒcQ…cQ~cQwcQpcQicQbcQ[cQTcQMcQFcQ?cQ8cQ1cQ*cQ#cQcQcQcQcQcQùbQòbQëbQäbQÝbQÖbQÏbQÈbQÁbQºbQ³bQ¬bQ¥bQžbQ—bQbQ‰bQ‚bQ{bQtbQmbQfbQ_bQXbQQbQJbQCbQ^Q7^Q0^Q)^Q"^Q^Q^Q ^Q^Qÿ]Qø]Qñ]Qê]Qã]QÜ]QÕ]QÎ]QÇ]QÀ]Q¹]Q²]Q«]Q¤]Q]Q–]Q]Qˆ]Q]Qz]Qs]Ql]Qe]Q^]QW]QP]QI]QB]Q;]Q4]Q-]Q&]Q]Q]Q]Q ]Q]Qü\Qõ\Qî\Qç\Qà\QÙ\QÒ\QË\QÄ\Q½\Q¶\Q¯\Q¨\Q¡\Qš\Q“\QŒ\Q…\Q~\Qw\Qp\Qi\Qb\Q[\QT\QM\QF\Q?\Q8\Q1\Q*\Q#\Q\Q\Q\Q\Q\Qù[Qò[Që[Qä[QÝ[QÖ[QÏ[QÈ[QÁ[Qº[Q³[Q¬[Q¥[Qž[Q—[Q[Q‰[Q‚[Q{[Qt[Qm[Qf[Q_[QX[QQ[QJ[QC[Q<[Q5[Q.[Q'[Q [Q[Q[Q [Q[QýZQöZQïZQèZQáZQÚZQÓZQÌZQÅZQ¾ZQ·ZQ°ZQ©ZQ¢ZQ›ZQ”ZQZQ†ZQZQxZQqZQjZQcZQ\ZQUZQNZQGZQ@ZQ9ZQ2ZQ+ZQ$ZQZQZQZQZQZQúYQóYQìYQåYQÞYQ×YQÐYQÉYQÂYQ»YQ´YQ­YQ¦YQŸYQ˜YQ‘YQŠYQƒYQ|YQuYQnYQgYQ`YQYYQRYQKYQDYQ=YQ6YQ/YQ(YQ!YQYQYQ YQYQþXQ÷XQðXQéXQâXQÛXQÔXQÍXQÆXQ¿XQ¸XQ±XQªXQ£XQœXQ•XQŽXQ‡XQ€XQyXQrXQkXQdXQ]XQVXQOXQHXQAXQ:XQ3XQ,XQ%XQXQXQXQ XQXQûWQôWQíWQæWQßWQØWQÑWQÊWQÃWQ¼WQµWQ®WQ§WQ WQ™WQ’WQ‹WQ„WQ}WQvWQoWQhWQaWQZWQSWQLWQEWQ>WQ7WQ0WQ)WQ"WQWQWQ WQWQÿVQøVQñVQêVQãVQÜVQÕVQÎVQÇVQÀVQ¹VQ²VQ«VQ¤VQVQ–VQVQˆVQVQzVQsVQlVQeVQ^VQWVQPVQIVQBVQ;VQ4VQ-VQ&VQVQVQVQ VQVQüUQõUQîUQçUQàUQÙUQÒUQËUQÄUQ½UQ¶UQ¯UQ¨UQ¡UQšUQ“UQŒUQ…UQ~UQwUQpUQiUQbUQ[UQTUQMUQFUQ?UQ8UQ1UQ*UQ#UQUQUQUQUQUQùTQòTQëTQäTQÝTQÖTQÏTQÈTQÁTQºTQ³TQ¬TQ¥TQžTQ—TQTQ‰TQ‚TQ{TQtTQmTQfTQ_TQXTQQTQJTQCTQPQ7PQ0PQ)PQ"PQPQPQ PQPQÿOQøOQñOQêOQãOQÜOQÕOQÎOQÇOQÀOQ¹OQ²OQ«OQ¤OQOQ–OQOQˆOQOQzOQsOQlOQeOQ^OQWOQPOQIOQBOQ;OQ4OQ-OQ&OQOQOQOQ OQOQüNQõNQîNQçNQàNQÙNQÒNQËNQÄNQ½NQ¶NQ¯NQ¨NQ¡NQšNQ“NQŒNQ…NQ~NQwNQpNQiNQbNQ[NQTNQMNQFNQ?NQ8NQ1NQ*NQ#NQNQNQNQNQNQùMQòMQëMQäMQÝMQÖMQÏMQÈMQÁMQºMQ³MQ¬MQ¥MQžMQ—MQMQ‰MQ‚MQ{MQtMQmMQfMQ_MQXMQQMQJMQCMQIQ7IQ0IQ)IQ"IQIQIQ IQIQÿHQøHQñHQêHQãHQÜHQÕHQÎHQÇHQÀHQ¹HQ²HQ«HQ¤HQHQ–HQHQˆHQHQzHQsHQlHQeHQ^HQWHQPHQIHQBHQ;HQ4HQ-HQ&HQHQHQHQ HQHQüGQõGQîGQçGQàGQÙGQÒGQËGQÄGQ½GQ¶GQ¯GQ¨GQ¡GQšGQ“GQŒGQ…GQ~GQwGQpGQiGQbGQ[GQTGQMGQFGQ?GQ8GQ1GQ*GQ#GQGQGQGQGQGQùFQòFQëFQäFQÝFQÖFQÏFQÈFQÁFQºFQ³FQ¬FQ¥FQžFQ—FQFQ‰FQ‚FQ{FQtFQmFQfFQ_FQXFQQFQJFQCFQBQ7BQ0BQ)BQ"BQBQBQ BQBQÿAQøAQñAQêAQãAQÜAQÕAQÎAQÇAQÀAQ¹AQ²AQ«AQ¤AQAQ–AQAQˆAQAQzAQsAQlAQeAQ^AQWAQPAQIAQBAQ;AQ4AQ-AQ&AQAQAQAQ AQAQü@Qõ@Qî@Qç@Qà@QÙ@QÒ@QË@QÄ@Q½@Q¶@Q¯@Q¨@Q¡@Qš@Q“@QŒ@Q…@Q~@Qw@Qp@Qi@Qb@Q[@QT@QM@QF@Q?@Q8@Q1@Q*@Q#@Q@Q@Q@Q@Q@Qù?Qò?Që?Qä?QÝ?QÖ?QÏ?QÈ?QÁ?Qº?Q³?Q¬?Q¥?Qž?Q—?Q?Q‰?Q‚?Q{?Qt?Qm?Qf?Q_?QX?QQ?QJ?QC?QQö>Qï>Qè>Qá>QÚ>QÓ>QÌ>QÅ>Q¾>Q·>Q°>Q©>Q¢>Q›>Q”>Q>Q†>Q>Qx>Qq>Qj>Qc>Q\>QU>QN>QG>Q@>Q9>Q2>Q+>Q$>Q>Q>Q>Q>Q>Qú=Qó=Qì=Qå=QÞ=Q×=QÐ=QÉ=QÂ=Q»=Q´=Q­=Q¦=QŸ=Q˜=Q‘=QŠ=Qƒ=Q|=Qu=Qn=Qg=Q`=QY=QR=QK=QD=Q==Q6=Q/=Q(=Q!=Q=Q=Q =Q=Qþ;Q7;Q0;Q);Q";Q;Q;Q ;Q;Qÿ:Qø:Qñ:Qê:Qã:QÜ:QÕ:QÎ:QÇ:QÀ:Q¹:Q²:Q«:Q¤:Q:Q–:Q:Qˆ:Q:Qz:Qs:Ql:Qe:Q^:QW:QP:QI:QB:Q;:Q4:Q-:Q&:Q:Q:Q:Q :Q:Qü9Qõ9Qî9Qç9Qà9QÙ9QÒ9QË9QÄ9Q½9Q¶9Q¯9Q¨9Q¡9Qš9Q“9QŒ9Q…9Q~9Qw9Qp9Qi9Qb9Q[9QT9QM9QF9Q?9Q89Q19Q*9Q#9Q9Q9Q9Q9Q9Qù8Qò8Që8Qä8QÝ8QÖ8QÏ8QÈ8QÁ8Qº8Q³8Q¬8Q¥8Qž8Q—8Q8Q‰8Q‚8Q{8Qt8Qm8Qf8Q_8QX8QQ8QJ8QC8Q<8Q58Q.8Q'8Q 8Q8Q8Q 8Q8Qý7Qö7Qï7Qè7Qá7QÚ7QÓ7QÌ7QÅ7Q¾7Q·7Q°7Q©7Q¢7Q›7Q”7Q7Q†7Q7Qx7Qq7Qj7Qc7Q\7QU7QN7QG7Q@7Q97Q27Q+7Q$7Q7Q7Q7Q7Q7Qú6Qó6Qì6Qå6QÞ6Q×6QÐ6QÉ6QÂ6Q»6Q´6Q­6Q¦6QŸ6Q˜6Q‘6QŠ6Qƒ6Q|6Qu6Qn6Qg6Q`6QY6QR6QK6QD6Q=6Q66Q/6Q(6Q!6Q6Q6Q 6Q6Qþ5Q÷5Qð5Qé5Qâ5QÛ5QÔ5QÍ5QÆ5Q¿5Q¸5Q±5Qª5Q£5Qœ5Q•5QŽ5Q‡5Q€5Qy5Qr5Qk5Qd5Q]5QV5QO5QH5QA5Q:5Q35Q,5Q%5Q5Q5Q5Q 5Q5Qû4Qô4Qí4Qæ4Qß4QØ4QÑ4QÊ4QÃ4Q¼4Qµ4Q®4Q§4Q 4Q™4Q’4Q‹4Q„4Q}4Qv4Qo4Qh4Qa4QZ4QS4QL4QE4Q>4Q74Q04Q)4Q"4Q4Q4Q 4Q4Qÿ3Qø3Qñ3Qê3Qã3QÜ3QÕ3QÎ3QÇ3QÀ3Q¹3Q²3Q«3Q¤3Q3Q–3Q3Qˆ3Q3Qz3Qs3Ql3Qe3Q^3QW3QP3QI3QB3Q;3Q43Q-3Q&3Q3Q3Q3Q 3Q3Qü2Qõ2Qî2Qç2Qà2QÙ2QÒ2QË2QÄ2Q½2Q¶2Q¯2Q¨2Q¡2Qš2Q“2QŒ2Q…2Q~2Qw2Qp2Qi2Qb2Q[2QT2QM2QF2Q?2Q82Q12Q*2Q#2Q2Q2Q2Q2Q2Qù1Qò1Që1Qä1QÝ1QÖ1QÏ1QÈ1QÁ1Qº1Q³1Q¬1Q¥1Qž1Q—1Q1Q‰1Q‚1Q{1Qt1Qm1Qf1Q_1QX1QQ1QJ1QC1Q<1Q51Q.1Q'1Q 1Q1Q1Q 1Q1Qý0Qö0Qï0Qè0Qá0QÚ0QÓ0QÌ0QÅ0Q¾0Q·0Q°0Q©0Q¢0Q›0Q”0Q0Q†0Q0Qx0Qq0Qj0Qc0Q\0QU0QN0QG0Q@0Q90Q20Q+0Q$0Q0Q0Q0Q0Q0Qú/Qó/Qì/Qå/QÞ/Q×/QÐ/QÉ/QÂ/Q»/Q´/Q­/Q¦/QŸ/Q˜/Q‘/QŠ/Qƒ/Q|/Qu/Qn/Qg/Q`/QY/QR/QK/QD/Q=/Q6/Q//Q(/Q!/Q/Q/Q /Q/Qþ.Q÷.Qð.Qé.Qâ.QÛ.QÔ.QÍ.QÆ.Q¿.Q¸.Q±.Qª.Q£.Qœ.Q•.QŽ.Q‡.Q€.Qy.Qr.Qk.Qd.Q].QV.QO.QH.QA.Q:.Q3.Q,.Q%.Q.Q.Q.Q .Q.Qû-Qô-Qí-Qæ-Qß-QØ-QÑ-QÊ-QÃ-Q¼-Qµ-Q®-Q§-Q -Q™-Q’-Q‹-Q„-Q}-Qv-Qo-Qh-Qa-QZ-QS-QL-QE-Q>-Q7-Q0-Q)-Q"-Q-Q-Q -Q-Qÿ,Qø,Qñ,Qê,Qã,QÜ,QÕ,QÎ,QÇ,QÀ,Q¹,Q²,Q«,Q¤,Q,Q–,Q,Qˆ,Q,Qz,Qs,Ql,Qe,Q^,QW,QP,QI,QB,Q;,Q4,Q-,Q&,Q,Q,Q,Q ,Q,Qü+Qõ+Qî+Qç+Qà+QÙ+QÒ+QË+QÄ+Q½+Q¶+Q¯+Q¨+Q¡+Qš+Q“+QŒ+Q…+Q~+Qw+Qp+Qi+Qb+Q[+QT+QM+QF+Q?+Q8+Q1+Q*+Q#+Q+Q+Q+Q+Q+Qù*Qò*Që*Qä*QÝ*QÖ*QÏ*QÈ*QÁ*Qº*Q³*Q¬*Q¥*Qž*Q—*Q*Q‰*Q‚*Q{*Qt*Qm*Qf*Q_*QX*QQ*QJ*QC*Q<*Q5*Q.*Q'*Q *Q*Q*Q *Q*Qý)Qö)Qï)Qè)Qá)QÚ)QÓ)QÌ)QÅ)Q¾)Q·)Q°)Q©)Q¢)Q›)Q”)Q)Q†)Q)Qx)Qq)Qj)Qc)Q\)QU)QN)QG)Q@)Q9)Q2)Q+)Q$)Q)Q)Q)Q)Q)Qú(Qó(Qì(Qå(QÞ(Q×(QÐ(QÉ(QÂ(Q»(Q´(Q­(Q¦(QŸ(Q˜(Q‘(QŠ(Qƒ(Q|(Qu(Qn(Qg(Q`(QY(QR(QK(QD(Q=(Q6(Q/(Q((Q!(Q(Q(Q (Q(Qþ'Q÷'Qð'Qé'Qâ'QÛ'QÔ'QÍ'QÆ'Q¿'Q¸'Q±'Qª'Q£'Qœ'Q•'QŽ'Q‡'Q€'Qy'Qr'Qk'Qd'Q]'QV'QO'QH'QA'Q:'Q3'Q,'Q%'Q'Q'Q'Q 'Q'Qû&Qô&Qí&Qæ&Qß&QØ&QÑ&QÊ&QÃ&Q¼&Qµ&Q®&Q§&Q &Q™&Q’&Q‹&Q„&Q}&Qv&Qo&Qh&Qa&QZ&QS&QL&QE&Q>&Q7&Q0&Q)&Q"&Q&Q&Q &Q&Qÿ%Qø%Qñ%Qê%Qã%QÜ%QÕ%QÎ%QÇ%QÀ%Q¹%Q²%Q«%Q¤%Q%Q–%Q%Qˆ%Q%Qz%Qs%Ql%Qe%Q^%QW%QP%QI%QB%Q;%Q4%Q-%Q&%Q%Q%Q%Q %Q%Qü$Qõ$Qî$Qç$Qà$QÙ$QÒ$QË$QÄ$Q½$Q¶$Q¯$Q¨$Q¡$Qš$Q“$QŒ$Q…$Q~$Qw$Qp$Qi$Qb$Q[$QT$QM$QF$Q?$Q8$Q1$Q*$Q#$Q$Q$Q$Q$Q$Qù#Qò#Që#Qä#QÝ#QÖ#QÏ#QÈ#QÁ#Qº#Q³#Q¬#Q¥#Qž#Q—#Q#Q‰#Q‚#Q{#Qt#Qm#Qf#Q_#QX#QQ#QJ#QC#Q<#Q5#Q.#Q'#Q #Q#Q#Q #Q#Qý"Qö"Qï"Qè"Qá"QÚ"QÓ"QÌ"QÅ"Q¾"Q·"Q°"Q©"Q¢"Q›"Q”"Q"Q†"Q"Qx"Qq"Qj"Qc"Q\"QU"QN"QG"Q@"Q9"Q2"Q+"Q$"Q"Q"Q"Q"Q"Qú!Qó!Qì!Qå!QÞ!Q×!QÐ!QÉ!QÂ!Q»!Q´!Q­!Q¦!QŸ!Q˜!Q‘!QŠ!Qƒ!Q|!Qu!Qn!Qg!Q`!QY!QR!QK!QD!Q=!Q6!Q/!Q(!Q!!Q!Q!Q !Q!Qþ Q÷ Qð Qé Qâ QÛ QÔ QÍ QÆ Q¿ Q¸ Q± Qª Q£ Qœ Q• QŽ Q‡ Q€ Qy Qr Qk Qd Q] QV QO QH QA Q: Q3 Q, Q% Q Q Q Q Q QûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQýQöQïQèQáQÚQÓQÌQÅQ¾Q·Q°Q©Q¢Q›Q”QQ†QQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQúQóQìQåQÞQ×QÐQÉQÂQ»Q´Q­Q¦QŸQ˜Q‘QŠQƒQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQþQ÷QðQéQâQÛQÔQÍQÆQ¿Q¸Q±QªQ£QœQ•QŽQ‡Q€QyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQýQöQïQèQáQÚQÓQÌQÅQ¾Q·Q°Q©Q¢Q›Q”QQ†QQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQúQóQìQåQÞQ×QÐQÉQÂQ»Q´Q­Q¦QŸQ˜Q‘QŠQƒQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQþQ÷QðQéQâQÛQÔQÍQÆQ¿Q¸Q±QªQ£QœQ•QŽQ‡Q€QyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQý Qö Qï Qè Qá QÚ QÓ QÌ QÅ Q¾ Q· Q° Q© Q¢ Q› Q” Q Q† Q Qx Qq Qj Qc Q\ QU QN QG Q@ Q9 Q2 Q+ Q$ Q Q Q Q Q Qú Qó Qì Qå QÞ Q× QÐ QÉ Q Q» Q´ Q­ Q¦ QŸ Q˜ Q‘ QŠ Qƒ Q| Qu Qn Qg Q` QY QR QK QD Q= Q6 Q/ Q( Q! Q Q Q Q Qþ Q÷ Qð Qé Qâ QÛ QÔ QÍ QÆ Q¿ Q¸ Q± Qª Q£ Qœ Q• QŽ Q‡ Q€ Qy Qr Qk Qd Q] QV QO QH QA Q: Q3 Q, Q% Q Q Q Q Q Qû Qô Qí Qæ Qß QØ QÑ QÊ Qà Q¼ Qµ Q® Q§ Q  Q™ Q’ Q‹ Q„ Q} Qv Qo Qh Qa QZ QS QL QE Q> Q7 Q0 Q) Q" Q Q Q Q Qÿ Qø Qñ Qê Qã QÜ QÕ QÎ QÇ QÀ Q¹ Q² Q« Q¤ Q Q– Q Qˆ Q Qz Qs Ql Qe Q^ QW QP QI QB Q; Q4 Q- Q& Q Q Q Q Q QüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQýQöQïQèQáQÚQÓQÌQÅQ¾Q·Q°Q©Q¢Q›Q”QQ†QQxQqQjQcQ\QUQNQGQ@Q9Q2Q+Q$QQQQQQúQóQìQåQÞQ×QÐQÉQÂQ»Q´Q­Q¦QŸQ˜Q‘QŠQƒQ|QuQnQgQ`QYQRQKQDQ=Q6Q/Q(Q!QQQ QQþQ÷QðQéQâQÛQÔQÍQÆQ¿Q¸Q±QªQ£QœQ•QŽQ‡Q€QyQrQkQdQ]QVQOQHQAQ:Q3Q,Q%QQQQ QQûQôQíQæQßQØQÑQÊQÃQ¼QµQ®Q§Q Q™Q’Q‹Q„Q}QvQoQhQaQZQSQLQEQ>Q7Q0Q)Q"QQQ QQÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQ<Q5Q.Q'Q QQQ QQýÿPöÿPïÿPèÿPáÿPÚÿPÓÿPÌÿPÅÿP¾ÿP·ÿP°ÿP©ÿP¢ÿP›ÿP”ÿPÿP†ÿPÿPxÿPqÿPjÿPcÿP\ÿPUÿPNÿPGÿP@ÿP9ÿP2ÿP+ÿP$ÿPÿPÿPÿPÿPÿPúþPóþPìþPåþPÞþP×þPÐþPÉþPÂþP»þP´þP­þP¦þPŸþP˜þP‘þPŠþPƒþP|þPuþPnþPgþP`þPYþPRþPKþPDþP=þP6þP/þP(þP!þPþPþP þPþPþýP÷ýPðýPéýPâýPÛýPÔýPÍýPÆýP¿ýP¸ýP±ýPªýP£ýPœýP•ýPŽýP‡ýP€ýPyýPrýPkýPdýP]ýPVýPOýPHýPAýP:ýP3ýP,ýP%ýPýPýPýP ýPýPûüPôüPíüPæüPßüPØüPÑüPÊüPÃüP¼üPµüP®üP§üP üP™üP’üP‹üP„üP}üPvüPoüPhüPaüPZüPSüPLüPEüP>üP7üP0üP)üP"üPüPüP üPüPÿûPøûPñûPêûPãûPÜûPÕûPÎûPÇûPÀûP¹ûP²ûP«ûP¤ûPûP–ûPûPˆûPûPzûPsûPlûPeûP^ûPWûPPûPIûPBûP;ûP4ûP-ûP&ûPûPûPûP ûPûPüúPõúPîúPçúPàúPÙúPÒúPËúPÄúP½úP¶úP¯úP¨úP¡úPšúP“úPŒúP…úP~úPwúPpúPiúPbúP[úPTúPMúPFúP?úP8úP1úP*úP#úPúPúPúPúPúPùùPòùPëùPäùPÝùPÖùPÏùPÈùPÁùPºùP³ùP¬ùP¥ùPžùP—ùPùP‰ùP‚ùP{ùPtùPmùPfùP_ùPXùPQùPJùPCùP<ùP5ùP.ùP'ùP ùPùPùP ùPùPýøPöøPïøPèøPáøPÚøPÓøPÌøPÅøP¾øP·øP°øP©øP¢øP›øP”øPøP†øPøPxøPqøPjøPcøP\øPUøPNøPGøP@øP9øP2øP+øP$øPøPøPøPøPøPú÷Pó÷Pì÷På÷PÞ÷P×÷PÐ÷PÉ÷PÂ÷P»÷P´÷P­÷P¦÷PŸ÷P˜÷P‘÷PŠ÷Pƒ÷P|÷Pu÷Pn÷Pg÷P`÷PY÷PR÷PK÷PD÷P=÷P6÷P/÷P(÷P!÷P÷P÷P ÷P÷PþöP÷öPðöPéöPâöPÛöPÔöPÍöPÆöP¿öP¸öP±öPªöP£öPœöP•öPŽöP‡öP€öPyöPröPköPdöP]öPVöPOöPHöPAöP:öP3öP,öP%öPöPöPöP öPöPûõPôõPíõPæõPßõPØõPÑõPÊõPÃõP¼õPµõP®õP§õP õP™õP’õP‹õP„õP}õPvõPoõPhõPaõPZõPSõPLõPEõP>õP7õP0õP)õP"õPõPõP õPõPÿôPøôPñôPêôPãôPÜôPÕôPÎôPÇôPÀôP¹ôP²ôP«ôP¤ôPôP–ôPôPˆôPôPzôPsôPlôPeôP^ôPWôPPôPIôPBôP;ôP4ôP-ôP&ôPôPôPôP ôPôPüóPõóPîóPçóPàóPÙóPÒóPËóPÄóP½óP¶óP¯óP¨óP¡óPšóP“óPŒóP…óP~óPwóPpóPióPbóP[óPTóPMóPFóP?óP8óP1óP*óP#óPóPóPóPóPóPùòPòòPëòPäòPÝòPÖòPÏòPÈòPÁòPºòP³òP¬òP¥òPžòP—òPòP‰òP‚òP{òPtòPmòPfòP_òPXòPQòPJòPCòP<òP5òP.òP'òP òPòPòP òPòPýñPöñPïñPèñPáñPÚñPÓñPÌñPÅñP¾ñP·ñP°ñP©ñP¢ñP›ñP”ñPñP†ñPñPxñPqñPjñPcñP\ñPUñPNñPGñP@ñP9ñP2ñP+ñP$ñPñPñPñPñPñPúðPóðPìðPåðPÞðP×ðPÐðPÉðPÂðP»ðP´ðP­ðP¦ðPŸðP˜ðP‘ðPŠðPƒðP|ðPuðPnðPgðP`ðPYðPRðPKðPDðP=ðP6ðP/ðP(ðP!ðPðPðP ðPðPþïP÷ïPðïPéïPâïPÛïPÔïPÍïPÆïP¿ïP¸ïP±ïPªïP£ïPœïP•ïPŽïP‡ïP€ïPyïPrïPkïPdïP]ïPVïPOïPHïPAïP:ïP3ïP,ïP%ïPïPïPïP ïPïPûîPôîPíîPæîPßîPØîPÑîPÊîPÃîP¼îPµîP®îP§îP îP™îP’îP‹îP„îP}îPvîPoîPhîPaîPZîPSîPLîPEîP>îP7îP0îP)îP"îPîPîP îPîPÿíPøíPñíPêíPãíPÜíPÕíPÎíPÇíPÀíP¹íP²íP«íP¤íPíP–íPíPˆíPíPzíPsíPlíPeíP^íPWíPPíPIíPBíP;íP4íP-íP&íPíPíPíP íPíPüìPõìPîìPçìPàìPÙìPÒìPËìPÄìP½ìP¶ìP¯ìP¨ìP¡ìPšìP“ìPŒìP…ìP~ìPwìPpìPiìPbìP[ìPTìPMìPFìP?ìP8ìP1ìP*ìP#ìPìPìPìPìPìPùëPòëPëëPäëPÝëPÖëPÏëPÈëPÁëPºëP³ëP¬ëP¥ëPžëP—ëPëP‰ëP‚ëP{ëPtëPmëPfëP_ëPXëPQëPJëPCëP<ëP5ëP.ëP'ëP ëPëPëP ëPëPýêPöêPïêPèêPáêPÚêPÓêPÌêPÅêP¾êP·êP°êP©êP¢êP›êP”êPêP†êPêPxêPqêPjêPcêP\êPUêPNêPGêP@êP9êP2êP+êP$êPêPêPêPêPêPúéPóéPìéPåéPÞéP×éPÐéPÉéPÂéP»éP´éP­éP¦éPŸéP˜éP‘éPŠéPƒéP|éPuéPnéPgéP`éPYéPRéPKéPDéP=éP6éP/éP(éP!éPéPéP éPéPþèP÷èPðèPéèPâèPÛèPÔèPÍèPÆèP¿èP¸èP±èPªèP£èPœèP•èPŽèP‡èP€èPyèPrèPkèPdèP]èPVèPOèPHèPAèP:èP3èP,èP%èPèPèPèP èPèPûçPôçPíçPæçPßçPØçPÑçPÊçPÃçP¼çPµçP®çP§çP çP™çP’çP‹çP„çP}çPvçPoçPhçPaçPZçPSçPLçPEçP>çP7çP0çP)çP"çPçPçP çPçPÿæPøæPñæPêæPãæPÜæPÕæPÎæPÇæPÀæP¹æP²æP«æP¤æPæP–æPæPˆæPæPzæPsæPlæPeæP^æPWæPPæPIæPBæP;æP4æP-æP&æPæPæPæP æPæPüåPõåPîåPçåPàåPÙåPÒåPËåPÄåP½åP¶åP¯åP¨åP¡åPšåP“åPŒåP…åP~åPwåPpåPiåPbåP[åPTåPMåPFåP?åP8åP1åP*åP#åPåPåPåPåPåPùäPòäPëäPääPÝäPÖäPÏäPÈäPÁäPºäP³äP¬äP¥äPžäP—äPäP‰äP‚äP{äPtäPmäPfäP_äPXäPQäPJäPCäP<äP5äP.äP'äP äPäPäP äPäPýãPöãPïãPèãPáãPÚãPÓãPÌãPÅãP¾ãP·ãP°ãP©ãP¢ãP›ãP”ãPãP†ãPãPxãPqãPjãPcãP\ãPUãPNãPGãP@ãP9ãP2ãP+ãP$ãPãPãPãPãPãPúâPóâPìâPåâPÞâP×âPÐâPÉâPÂâP»âP´âP­âP¦âPŸâP˜âP‘âPŠâPƒâP|âPuâPnâPgâP`âPYâPRâPKâPDâP=âP6âP/âP(âP!âPâPâP âPâPþáP÷áPðáPéáPâáPÛáPÔáPÍáPÆáP¿áP¸áP±áPªáP£áPœáP•áPŽáP‡áP€áPyáPráPkáPdáP]áPVáPOáPHáPAáP:áP3áP,áP%áPáPáPáP áPáPûàPôàPíàPæàPßàPØàPÑàPÊàPÃàP¼àPµàP®àP§àP àP™àP’àP‹àP„àP}àPvàPoàPhàPaàPZàPSàPLàPEàP>àP7àP0àP)àP"àPàPàP àPàPÿßPøßPñßPêßPãßPÜßPÕßPÎßPÇßPÀßP¹ßP²ßP«ßP¤ßPßP–ßPßPˆßPßPzßPsßPlßPeßP^ßPWßPPßPIßPBßP;ßP4ßP-ßP&ßPßPßPßP ßPßPüÞPõÞPîÞPçÞPàÞPÙÞPÒÞPËÞPÄÞP½ÞP¶ÞP¯ÞP¨ÞP¡ÞPšÞP“ÞPŒÞP…ÞP~ÞPwÞPpÞPiÞPbÞP[ÞPTÞPMÞPFÞP?ÞP8ÞP1ÞP*ÞP#ÞPÞPÞPÞPÞPÞPùÝPòÝPëÝPäÝPÝÝPÖÝPÏÝPÈÝPÁÝPºÝP³ÝP¬ÝP¥ÝPžÝP—ÝPÝP‰ÝP‚ÝP{ÝPtÝPmÝPfÝP_ÝPXÝPQÝPJÝPCÝP<ÝP5ÝP.ÝP'ÝP ÝPÝPÝP ÝPÝPýÜPöÜPïÜPèÜPáÜPÚÜPÓÜPÌÜPÅÜP¾ÜP·ÜP°ÜP©ÜP¢ÜP›ÜP”ÜPÜP†ÜPÜPxÜPqÜPjÜPcÜP\ÜPUÜPNÜPGÜP@ÜP9ÜP2ÜP+ÜP$ÜPÜPÜPÜPÜPÜPúÛPóÛPìÛPåÛPÞÛP×ÛPÐÛPÉÛPÂÛP»ÛP´ÛP­ÛP¦ÛPŸÛP˜ÛP‘ÛPŠÛPƒÛP|ÛPuÛPnÛPgÛP`ÛPYÛPRÛPKÛPDÛP=ÛP6ÛP/ÛP(ÛP!ÛPÛPÛP ÛPÛPþÚP÷ÚPðÚPéÚPâÚPÛÚPÔÚPÍÚPÆÚP¿ÚP¸ÚP±ÚPªÚP£ÚPœÚP•ÚPŽÚP‡ÚP€ÚPyÚPrÚPkÚPdÚP]ÚPVÚPOÚPHÚPAÚP:ÚP3ÚP,ÚP%ÚPÚPÚPÚP ÚPÚPûÙPôÙPíÙPæÙPßÙPØÙPÑÙPÊÙPÃÙP¼ÙPµÙP®ÙP§ÙP ÙP™ÙP’ÙP‹ÙP„ÙP}ÙPvÙPoÙPhÙPaÙPZÙPSÙPLÙPEÙP>ÙP7ÙP0ÙP)ÙP"ÙPÙPÙP ÙPÙPÿØPøØPñØPêØPãØPÜØPÕØPÎØPÇØPÀØP¹ØP²ØP«ØP¤ØPØP–ØPØPˆØPØPzØPsØPlØPeØP^ØPWØPPØPIØPBØP;ØP4ØP-ØP&ØPØPØPØP ØPØPü×Põ×Pî×Pç×Pà×PÙ×PÒ×PË×PÄ×P½×P¶×P¯×P¨×P¡×Pš×P“×PŒ×P…×P~×Pw×Pp×Pi×Pb×P[×PT×PM×PF×P?×P8×P1×P*×P#×P×P×P×P×P×PùÖPòÖPëÖPäÖPÝÖPÖÖPÏÖPÈÖPÁÖPºÖP³ÖP¬ÖP¥ÖPžÖP—ÖPÖP‰ÖP‚ÖP{ÖPtÖPmÖPfÖP_ÖPXÖPQÖPJÖPCÖP<ÖP5ÖP.ÖP'ÖP ÖPÖPÖP ÖPÖPýÕPöÕPïÕPèÕPáÕPÚÕPÓÕPÌÕPÅÕP¾ÕP·ÕP°ÕP©ÕP¢ÕP›ÕP”ÕPÕP†ÕPÕPxÕPqÕPjÕPcÕP\ÕPUÕPNÕPGÕP@ÕP9ÕP2ÕP+ÕP$ÕPÕPÕPÕPÕPÕPúÔPóÔPìÔPåÔPÞÔP×ÔPÐÔPÉÔPÂÔP»ÔP´ÔP­ÔP¦ÔPŸÔP˜ÔP‘ÔPŠÔPƒÔP|ÔPuÔPnÔPgÔP`ÔPYÔPRÔPKÔPDÔP=ÔP6ÔP/ÔP(ÔP!ÔPÔPÔP ÔPÔPþÓP÷ÓPðÓPéÓPâÓPÛÓPÔÓPÍÓPÆÓP¿ÓP¸ÓP±ÓPªÓP£ÓPœÓP•ÓPŽÓP‡ÓP€ÓPyÓPrÓPkÓPdÓP]ÓPVÓPOÓPHÓPAÓP:ÓP3ÓP,ÓP%ÓPÓPÓPÓP ÓPÓPûÒPôÒPíÒPæÒPßÒPØÒPÑÒPÊÒPÃÒP¼ÒPµÒP®ÒP§ÒP ÒP™ÒP’ÒP‹ÒP„ÒP}ÒPvÒPoÒPhÒPaÒPZÒPSÒPLÒPEÒP>ÒP7ÒP0ÒP)ÒP"ÒPÒPÒP ÒPÒPÿÑPøÑPñÑPêÑPãÑPÜÑPÕÑPÎÑPÇÑPÀÑP¹ÑP²ÑP«ÑP¤ÑPÑP–ÑPÑPˆÑPÑPzÑPsÑPlÑPeÑP^ÑPWÑPPÑPIÑPBÑP;ÑP4ÑP-ÑP&ÑPÑPÑPÑP ÑPÑPüÐPõÐPîÐPçÐPàÐPÙÐPÒÐPËÐPÄÐP½ÐP¶ÐP¯ÐP¨ÐP¡ÐPšÐP“ÐPŒÐP…ÐP~ÐPwÐPpÐPiÐPbÐP[ÐPTÐPMÐPFÐP?ÐP8ÐP1ÐP*ÐP#ÐPÐPÐPÐPÐPÐPùÏPòÏPëÏPäÏPÝÏPÖÏPÏÏPÈÏPÁÏPºÏP³ÏP¬ÏP¥ÏPžÏP—ÏPÏP‰ÏP‚ÏP{ÏPtÏPmÏPfÏP_ÏPXÏPQÏPJÏPCÏP<ÏP5ÏP.ÏP'ÏP ÏPÏPÏP ÏPÏPýÎPöÎPïÎPèÎPáÎPÚÎPÓÎPÌÎPÅÎP¾ÎP·ÎP°ÎP©ÎP¢ÎP›ÎP”ÎPÎP†ÎPÎPxÎPqÎPjÎPcÎP\ÎPUÎPNÎPGÎP@ÎP9ÎP2ÎP+ÎP$ÎPÎPÎPÎPÎPÎPúÍPóÍPìÍPåÍPÞÍP×ÍPÐÍPÉÍPÂÍP»ÍP´ÍP­ÍP¦ÍPŸÍP˜ÍP‘ÍPŠÍPƒÍP|ÍPuÍPnÍPgÍP`ÍPYÍPRÍPKÍPDÍP=ÍP6ÍP/ÍP(ÍP!ÍPÍPÍP ÍPÍPþÌP÷ÌPðÌPéÌPâÌPÛÌPÔÌPÍÌPÆÌP¿ÌP¸ÌP±ÌPªÌP£ÌPœÌP•ÌPŽÌP‡ÌP€ÌPyÌPrÌPkÌPdÌP]ÌPVÌPOÌPHÌPAÌP:ÌP3ÌP,ÌP%ÌPÌPÌPÌP ÌPÌPûËPôËPíËPæËPßËPØËPÑËPÊËPÃËP¼ËPµËP®ËP§ËP ËP™ËP’ËP‹ËP„ËP}ËPvËPoËPhËPaËPZËPSËPLËPEËP>ËP7ËP0ËP)ËP"ËPËPËP ËPËPÿÊPøÊPñÊPêÊPãÊPÜÊPÕÊPÎÊPÇÊPÀÊP¹ÊP²ÊP«ÊP¤ÊPÊP–ÊPÊPˆÊPÊPzÊPsÊPlÊPeÊP^ÊPWÊPPÊPIÊPBÊP;ÊP4ÊP-ÊP&ÊPÊPÊPÊP ÊPÊPüÉPõÉPîÉPçÉPàÉPÙÉPÒÉPËÉPÄÉP½ÉP¶ÉP¯ÉP¨ÉP¡ÉPšÉP“ÉPŒÉP…ÉP~ÉPwÉPpÉPiÉPbÉP[ÉPTÉPMÉPFÉP?ÉP8ÉP1ÉP*ÉP#ÉPÉPÉPÉPÉPÉPùÈPòÈPëÈPäÈPÝÈPÖÈPÏÈPÈÈPÁÈPºÈP³ÈP¬ÈP¥ÈPžÈP—ÈPÈP‰ÈP‚ÈP{ÈPtÈPmÈPfÈP_ÈPXÈPQÈPJÈPCÈP<ÈP5ÈP.ÈP'ÈP ÈPÈPÈP ÈPÈPýÇPöÇPïÇPèÇPáÇPÚÇPÓÇPÌÇPÅÇP¾ÇP·ÇP°ÇP©ÇP¢ÇP›ÇP”ÇPÇP†ÇPÇPxÇPqÇPjÇPcÇP\ÇPUÇPNÇPGÇP@ÇP9ÇP2ÇP+ÇP$ÇPÇPÇPÇPÇPÇPúÆPóÆPìÆPåÆPÞÆPׯPÐÆPÉÆPÂÆP»ÆP´ÆP­ÆP¦ÆPŸÆP˜ÆP‘ÆPŠÆPƒÆP|ÆPuÆPnÆPgÆP`ÆPYÆPRÆPKÆPDÆP=ÆP6ÆP/ÆP(ÆP!ÆPÆPÆP ÆPÆPþÅP÷ÅPðÅPéÅPâÅPÛÅPÔÅPÍÅPÆÅP¿ÅP¸ÅP±ÅPªÅP£ÅPœÅP•ÅPŽÅP‡ÅP€ÅPyÅPrÅPkÅPdÅP]ÅPVÅPOÅPHÅPAÅP:ÅP3ÅP,ÅP%ÅPÅPÅPÅP ÅPÅPûÄPôÄPíÄPæÄPßÄPØÄPÑÄPÊÄPÃÄP¼ÄPµÄP®ÄP§ÄP ÄP™ÄP’ÄP‹ÄP„ÄP}ÄPvÄPoÄPhÄPaÄPZÄPSÄPLÄPEÄP>ÄP7ÄP0ÄP)ÄP"ÄPÄPÄP ÄPÄPÿÃPøÃPñÃPêÃPãÃPÜÃPÕÃPÎÃPÇÃPÀÃP¹ÃP²ÃP«ÃP¤ÃPÃP–ÃPÃPˆÃPÃPzÃPsÃPlÃPeÃP^ÃPWÃPPÃPIÃPBÃP;ÃP4ÃP-ÃP&ÃPÃPÃPÃP ÃPÃPüÂPõÂPîÂPçÂPàÂPÙÂPÒÂPËÂPÄÂP½ÂP¶ÂP¯ÂP¨ÂP¡ÂPšÂP“ÂPŒÂP…ÂP~ÂPwÂPpÂPiÂPbÂP[ÂPTÂPMÂPFÂP?ÂP8ÂP1ÂP*ÂP#ÂPÂPÂPÂPÂPÂPùÁPòÁPëÁPäÁPÝÁPÖÁPÏÁPÈÁPÁÁPºÁP³ÁP¬ÁP¥ÁPžÁP—ÁPÁP‰ÁP‚ÁP{ÁPtÁPmÁPfÁP_ÁPXÁPQÁPJÁPCÁP<ÁP5ÁP.ÁP'ÁP ÁPÁPÁP ÁPÁPýÀPöÀPïÀPèÀPáÀPÚÀPÓÀPÌÀPÅÀP¾ÀP·ÀP°ÀP©ÀP¢ÀP›ÀP”ÀPÀP†ÀPÀPxÀPqÀPjÀPcÀP\ÀPUÀPNÀPGÀP@ÀP9ÀP2ÀP+ÀP$ÀPÀPÀPÀPÀPÀPú¿Pó¿Pì¿På¿PÞ¿P׿PпPÉ¿P¿P»¿P´¿P­¿P¦¿PŸ¿P˜¿P‘¿PŠ¿Pƒ¿P|¿Pu¿Pn¿Pg¿P`¿PY¿PR¿PK¿PD¿P=¿P6¿P/¿P(¿P!¿P¿P¿P ¿P¿Pþ¾P÷¾Pð¾Pé¾Pâ¾PÛ¾PÔ¾P;PƾP¿¾P¸¾P±¾Pª¾P£¾Pœ¾P•¾P޾P‡¾P€¾Py¾Pr¾Pk¾Pd¾P]¾PV¾PO¾PH¾PA¾P:¾P3¾P,¾P%¾P¾P¾P¾P ¾P¾Pû½Pô½Pí½Pæ½Pß½PؽPѽPʽPýP¼½Pµ½P®½P§½P ½P™½P’½P‹½P„½P}½Pv½Po½Ph½Pa½PZ½PS½PL½PE½P>½P7½P0½P)½P"½P½P½P ½P½Pÿ¼Pø¼Pñ¼Pê¼Pã¼PܼPÕ¼PμPǼPÀ¼P¹¼P²¼P«¼P¤¼P¼P–¼P¼Pˆ¼P¼Pz¼Ps¼Pl¼Pe¼P^¼PW¼PP¼PI¼PB¼P;¼P4¼P-¼P&¼P¼P¼P¼P ¼P¼Pü»Põ»Pî»Pç»Pà»PÙ»PÒ»PË»PÄ»P½»P¶»P¯»P¨»P¡»Pš»P“»PŒ»P…»P~»Pw»Pp»Pi»Pb»P[»PT»PM»PF»P?»P8»P1»P*»P#»P»P»P»P»P»PùºPòºPëºPäºPݺPÖºPϺPȺPÁºPººP³ºP¬ºP¥ºPžºP—ºPºP‰ºP‚ºP{ºPtºPmºPfºP_ºPXºPQºPJºPCºP<ºP5ºP.ºP'ºP ºPºPºP ºPºPý¹Pö¹Pï¹Pè¹Pá¹PÚ¹PÓ¹P̹PŹP¾¹P·¹P°¹P©¹P¢¹P›¹P”¹P¹P†¹P¹Px¹Pq¹Pj¹Pc¹P\¹PU¹PN¹PG¹P@¹P9¹P2¹P+¹P$¹P¹P¹P¹P¹P¹Pú¸Pó¸Pì¸På¸PÞ¸P׸PиPɸP¸P»¸P´¸P­¸P¦¸PŸ¸P˜¸P‘¸PЏPƒ¸P|¸Pu¸Pn¸Pg¸P`¸PY¸PR¸PK¸PD¸P=¸P6¸P/¸P(¸P!¸P¸P¸P ¸P¸Pþ·P÷·Pð·Pé·Pâ·PÛ·PÔ·PÍ·PÆ·P¿·P¸·P±·Pª·P£·Pœ·P•·PŽ·P‡·P€·Py·Pr·Pk·Pd·P]·PV·PO·PH·PA·P:·P3·P,·P%·P·P·P·P ·P·Pû¶Pô¶Pí¶Pæ¶Pß¶PضPѶPʶPöP¼¶Pµ¶P®¶P§¶P ¶P™¶P’¶P‹¶P„¶P}¶Pv¶Po¶Ph¶Pa¶PZ¶PS¶PL¶PE¶P>¶P7¶P0¶P)¶P"¶P¶P¶P ¶P¶PÿµPøµPñµPêµPãµPܵPÕµPεPǵPÀµP¹µP²µP«µP¤µPµP–µPµPˆµPµPzµPsµPlµPeµP^µPWµPPµPIµPBµP;µP4µP-µP&µPµPµPµP µPµPü´Põ´Pî´Pç´Pà´PÙ´PÒ´PË´PÄ´P½´P¶´P¯´P¨´P¡´Pš´P“´PŒ´P…´P~´Pw´Pp´Pi´Pb´P[´PT´PM´PF´P?´P8´P1´P*´P#´P´P´P´P´P´Pù³Pò³Pë³Pä³PݳPÖ³PϳPȳPÁ³Pº³P³³P¬³P¥³Pž³P—³P³P‰³P‚³P{³Pt³Pm³Pf³P_³PX³PQ³PJ³PC³P<³P5³P.³P'³P ³P³P³P ³P³Pý²Pö²Pï²Pè²Pá²PÚ²PÓ²P̲PŲP¾²P·²P°²P©²P¢²P›²P”²P²P†²P²Px²Pq²Pj²Pc²P\²PU²PN²PG²P@²P9²P2²P+²P$²P²P²P²P²P²Pú±Pó±Pì±På±PÞ±P×±PбPɱP±P»±P´±P­±P¦±PŸ±P˜±P‘±PбPƒ±P|±Pu±Pn±Pg±P`±PY±PR±PK±PD±P=±P6±P/±P(±P!±P±P±P ±P±Pþ°P÷°Pð°Pé°Pâ°PÛ°PÔ°PͰPưP¿°P¸°P±°Pª°P£°Pœ°P•°PްP‡°P€°Py°Pr°Pk°Pd°P]°PV°PO°PH°PA°P:°P3°P,°P%°P°P°P°P °P°Pû¯Pô¯Pí¯Pæ¯P߯PدPѯPʯPïP¼¯Pµ¯P®¯P§¯P ¯P™¯P’¯P‹¯P„¯P}¯Pv¯Po¯Ph¯Pa¯PZ¯PS¯PL¯PE¯P>¯P7¯P0¯P)¯P"¯P¯P¯P ¯P¯Pÿ®Pø®Pñ®Pê®Pã®PÜ®PÕ®PήPÇ®PÀ®P¹®P²®P«®P¤®P®P–®P®Pˆ®P®Pz®Ps®Pl®Pe®P^®PW®PP®PI®PB®P;®P4®P-®P&®P®P®P®P ®P®Pü­Põ­Pî­Pç­Pà­PÙ­PÒ­PË­PÄ­P½­P¶­P¯­P¨­P¡­Pš­P“­PŒ­P…­P~­Pw­Pp­Pi­Pb­P[­PT­PM­PF­P?­P8­P1­P*­P#­P­P­P­P­P­Pù¬Pò¬Pë¬Pä¬PݬPÖ¬PϬPȬPÁ¬Pº¬P³¬P¬¬P¥¬Pž¬P—¬P¬P‰¬P‚¬P{¬Pt¬Pm¬Pf¬P_¬PX¬PQ¬PJ¬PC¬P<¬P5¬P.¬P'¬P ¬P¬P¬P ¬P¬Pý«Pö«Pï«Pè«Pá«PÚ«PÓ«PÌ«PÅ«P¾«P·«P°«P©«P¢«P›«P”«P«P†«P«Px«Pq«Pj«Pc«P\«PU«PN«PG«P@«P9«P2«P+«P$«P«P«P«P«P«PúªPóªPìªPåªPÞªPתPЪPɪPªP»ªP´ªP­ªP¦ªPŸªP˜ªP‘ªPŠªPƒªP|ªPuªPnªPgªP`ªPYªPRªPKªPDªP=ªP6ªP/ªP(ªP!ªPªPªP ªPªPþ©P÷©Pð©Pé©Pâ©PÛ©PÔ©PÍ©PÆ©P¿©P¸©P±©Pª©P£©Pœ©P•©PŽ©P‡©P€©Py©Pr©Pk©Pd©P]©PV©PO©PH©PA©P:©P3©P,©P%©P©P©P©P ©P©Pû¨Pô¨Pí¨Pæ¨PߨPبPѨPʨPèP¼¨Pµ¨P®¨P§¨P ¨P™¨P’¨P‹¨P„¨P}¨Pv¨Po¨Ph¨Pa¨PZ¨PS¨PL¨PE¨P>¨P7¨P0¨P)¨P"¨P¨P¨P ¨P¨Pÿ§Pø§Pñ§Pê§Pã§PܧPÕ§PΧPǧPÀ§P¹§P²§P«§P¤§P§P–§P§Pˆ§P§Pz§Ps§Pl§Pe§P^§PW§PP§PI§PB§P;§P4§P-§P&§P§P§P§P §P§Pü¦Põ¦Pî¦Pç¦Pà¦PÙ¦PÒ¦P˦PĦP½¦P¶¦P¯¦P¨¦P¡¦Pš¦P“¦PŒ¦P…¦P~¦Pw¦Pp¦Pi¦Pb¦P[¦PT¦PM¦PF¦P?¦P8¦P1¦P*¦P#¦P¦P¦P¦P¦P¦Pù¥Pò¥Pë¥Pä¥PÝ¥PÖ¥PÏ¥PÈ¥PÁ¥Pº¥P³¥P¬¥P¥¥Pž¥P—¥P¥P‰¥P‚¥P{¥Pt¥Pm¥Pf¥P_¥PX¥PQ¥PJ¥PC¥P<¥P5¥P.¥P'¥P ¥P¥P¥P ¥P¥Pý¤Pö¤Pï¤Pè¤Pá¤PÚ¤PÓ¤P̤PŤP¾¤P·¤P°¤P©¤P¢¤P›¤P”¤P¤P†¤P¤Px¤Pq¤Pj¤Pc¤P\¤PU¤PN¤PG¤P@¤P9¤P2¤P+¤P$¤P¤P¤P¤P¤P¤Pú£Pó£Pì£På£PÞ£P×£PУPÉ£P£P»£P´£P­£P¦£PŸ£P˜£P‘£PŠ£Pƒ£P|£Pu£Pn£Pg£P`£PY£PR£PK£PD£P=£P6£P/£P(£P!£P£P£P £P£Pþ¢P÷¢Pð¢Pé¢Pâ¢PÛ¢PÔ¢PÍ¢PÆ¢P¿¢P¸¢P±¢Pª¢P£¢Pœ¢P•¢PŽ¢P‡¢P€¢Py¢Pr¢Pk¢Pd¢P]¢PV¢PO¢PH¢PA¢P:¢P3¢P,¢P%¢P¢P¢P¢P ¢P¢Pû¡Pô¡Pí¡Pæ¡Pß¡PØ¡PÑ¡PÊ¡PáP¼¡Pµ¡P®¡P§¡P ¡P™¡P’¡P‹¡P„¡P}¡Pv¡Po¡Ph¡Pa¡PZ¡PS¡PL¡PE¡P>¡P7¡P0¡P)¡P"¡P¡P¡P ¡P¡Pÿ Pø Pñ Pê Pã PÜ PÕ PΠPÇ PÀ P¹ P² P« P¤ P P– P Pˆ P Pz Ps Pl Pe P^ PW PP PI PB P; P4 P- P& P P P P  P PüŸPõŸPîŸPçŸPàŸPÙŸPÒŸPËŸPÄŸP½ŸP¶ŸP¯ŸP¨ŸP¡ŸPšŸP“ŸPŒŸP…ŸP~ŸPwŸPpŸPiŸPbŸP[ŸPTŸPMŸPFŸP?ŸP8ŸP1ŸP*ŸP#ŸPŸPŸPŸPŸPŸPùžPòžPëžPäžPÝžPÖžPÏžPÈžPÁžPºžP³žP¬žP¥žPžžP—žPžP‰žP‚žP{žPtžPmžPfžP_žPXžPQžPJžPCžP<žP5žP.žP'žP žPžPžP žPžPýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPúœPóœPìœPåœPÞœPלPМPÉœPœP»œP´œP­œP¦œPŸœP˜œP‘œPŠœPƒœP|œPuœPnœPgœP`œPYœPRœPKœPDœP=œP6œP/œP(œP!œPœPœP œPœPþ›P÷›Pð›Pé›Pâ›PÛ›PÔ›PÍ›PÆ›P¿›P¸›P±›Pª›P£›Pœ›P•›PŽ›P‡›P€›Py›Pr›Pk›Pd›P]›PV›PO›PH›PA›P:›P3›P,›P%›P›P›P›P ›P›PûšPôšPíšPæšPßšPØšPÑšPÊšPÚP¼šPµšP®šP§šP šP™šP’šP‹šP„šP}šPvšPošPhšPašPZšPSšPLšPEšP>šP7šP0šP)šP"šPšPšP šPšPÿ™Pø™Pñ™Pê™Pã™PÜ™PÕ™PΙPÇ™PÀ™P¹™P²™P«™P¤™P™P–™P™Pˆ™P™Pz™Ps™Pl™Pe™P^™PW™PP™PI™PB™P;™P4™P-™P&™P™P™P™P ™P™Pü˜Põ˜Pî˜Pç˜Pà˜PÙ˜PÒ˜P˘PĘP½˜P¶˜P¯˜P¨˜P¡˜Pš˜P“˜PŒ˜P…˜P~˜Pw˜Pp˜Pi˜Pb˜P[˜PT˜PM˜PF˜P?˜P8˜P1˜P*˜P#˜P˜P˜P˜P˜P˜Pù—Pò—Pë—Pä—PÝ—PÖ—PÏ—PÈ—PÁ—Pº—P³—P¬—P¥—Pž—P——P—P‰—P‚—P{—Pt—Pm—Pf—P_—PX—PQ—PJ—PC—P<—P5—P.—P'—P —P—P—P —P—Pý–Pö–Pï–Pè–Pá–PÚ–PÓ–PÌ–PÅ–P¾–P·–P°–P©–P¢–P›–P”–P–P†–P–Px–Pq–Pj–Pc–P\–PU–PN–PG–P@–P9–P2–P+–P$–P–P–P–P–P–Pú•Pó•Pì•På•PÞ•PוPЕPÉ•P•P»•P´•P­•P¦•PŸ•P˜•P‘•PŠ•Pƒ•P|•Pu•Pn•Pg•P`•PY•PR•PK•PD•P=•P6•P/•P(•P!•P•P•P •P•Pþ”P÷”Pð”Pé”Pâ”PÛ”PÔ”PÍ”PÆ”P¿”P¸”P±”Pª”P£”Pœ”P•”PŽ”P‡”P€”Py”Pr”Pk”Pd”P]”PV”PO”PH”PA”P:”P3”P,”P%”P”P”P”P ”P”Pû“Pô“Pí“Pæ“Pß“PØ“PÑ“PÊ“PÓP¼“Pµ“P®“P§“P “P™“P’“P‹“P„“P}“Pv“Po“Ph“Pa“PZ“PS“PL“PE“P>“P7“P0“P)“P"“P“P“P “P“Pÿ’Pø’Pñ’Pê’Pã’PÜ’PÕ’PÎ’PÇ’PÀ’P¹’P²’P«’P¤’P’P–’P’Pˆ’P’Pz’Ps’Pl’Pe’P^’PW’PP’PI’PB’P;’P4’P-’P&’P’P’P’P ’P’Pü‘Põ‘Pî‘Pç‘Pà‘PÙ‘PÒ‘PË‘PÄ‘P½‘P¶‘P¯‘P¨‘P¡‘Pš‘P“‘PŒ‘P…‘P~‘Pw‘Pp‘Pi‘Pb‘P[‘PT‘PM‘PF‘P?‘P8‘P1‘P*‘P#‘P‘P‘P‘P‘P‘PùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCPŒP7ŒP0ŒP)ŒP"ŒPŒPŒP ŒPŒPÿ‹Pø‹Pñ‹Pê‹Pã‹PÜ‹PÕ‹P΋PÇ‹PÀ‹P¹‹P²‹P«‹P¤‹P‹P–‹P‹Pˆ‹P‹Pz‹Ps‹Pl‹Pe‹P^‹PW‹PP‹PI‹PB‹P;‹P4‹P-‹P&‹P‹P‹P‹P ‹P‹PüŠPõŠPîŠPçŠPàŠPÙŠPÒŠPËŠPÄŠP½ŠP¶ŠP¯ŠP¨ŠP¡ŠPšŠP“ŠPŒŠP…ŠP~ŠPwŠPpŠPiŠPbŠP[ŠPTŠPMŠPFŠP?ŠP8ŠP1ŠP*ŠP#ŠPŠPŠPŠPŠPŠPù‰Pò‰Pë‰Pä‰P݉PÖ‰PωPȉPÁ‰Pº‰P³‰P¬‰P¥‰Pž‰P—‰P‰P‰‰P‚‰P{‰Pt‰Pm‰Pf‰P_‰PX‰PQ‰PJ‰PC‰P<‰P5‰P.‰P'‰P ‰P‰P‰P ‰P‰PýˆPöˆPïˆPèˆPáˆPÚˆPÓˆP̈PňP¾ˆP·ˆP°ˆP©ˆP¢ˆP›ˆP”ˆPˆP†ˆPˆPxˆPqˆPjˆPcˆP\ˆPUˆPNˆPGˆP@ˆP9ˆP2ˆP+ˆP$ˆPˆPˆPˆPˆPˆPú‡Pó‡Pì‡På‡PÞ‡PׇPЇPɇP‡P»‡P´‡P­‡P¦‡PŸ‡P˜‡P‘‡PЇPƒ‡P|‡Pu‡Pn‡Pg‡P`‡PY‡PR‡PK‡PD‡P=‡P6‡P/‡P(‡P!‡P‡P‡P ‡P‡Pþ†P÷†Pð†Pé†Pâ†PÛ†PÔ†P͆PƆP¿†P¸†P±†Pª†P£†Pœ†P•†PކP‡†P€†Py†Pr†Pk†Pd†P]†PV†PO†PH†PA†P:†P3†P,†P%†P†P†P†P †P†Pû…Pô…Pí…Pæ…Pß…PØ…PÑ…PÊ…PÃ…P¼…Pµ…P®…P§…P …P™…P’…P‹…P„…P}…Pv…Po…Ph…Pa…PZ…PS…PL…PE…P>…P7…P0…P)…P"…P…P…P …P…Pÿ„Pø„Pñ„Pê„Pã„PÜ„PÕ„P΄PÇ„PÀ„P¹„P²„P«„P¤„P„P–„P„Pˆ„P„Pz„Ps„Pl„Pe„P^„PW„PP„PI„PB„P;„P4„P-„P&„P„P„P„P „P„PüƒPõƒPîƒPçƒPàƒPÙƒPÒƒP˃PăP½ƒP¶ƒP¯ƒP¨ƒP¡ƒPšƒP“ƒPŒƒP…ƒP~ƒPwƒPpƒPiƒPbƒP[ƒPTƒPMƒPFƒP?ƒP8ƒP1ƒP*ƒP#ƒPƒPƒPƒPƒPƒPù‚Pò‚Pë‚Pä‚PÝ‚PÖ‚PÏ‚PÈ‚PÁ‚Pº‚P³‚P¬‚P¥‚Pž‚P—‚P‚P‰‚P‚‚P{‚Pt‚Pm‚Pf‚P_‚PX‚PQ‚PJ‚PC‚P<‚P5‚P.‚P'‚P ‚P‚P‚P ‚P‚PýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPú€Pó€Pì€På€PÞ€P×€PЀPÉ€P€P»€P´€P­€P¦€PŸ€P˜€P‘€PŠ€Pƒ€P|€Pu€Pn€Pg€P`€PY€PR€PK€PD€P=€P6€P/€P(€P!€P€P€P €P€PþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPû~Pô~Pí~Pæ~Pß~PØ~PÑ~PÊ~PÃ~P¼~Pµ~P®~P§~P ~P™~P’~P‹~P„~P}~Pv~Po~Ph~Pa~PZ~PS~PL~PE~P>~P7~P0~P)~P"~P~P~P ~P~Pÿ}Pø}Pñ}Pê}Pã}PÜ}PÕ}PÎ}PÇ}PÀ}P¹}P²}P«}P¤}P}P–}P}Pˆ}P}Pz}Ps}Pl}Pe}P^}PW}PP}PI}PB}P;}P4}P-}P&}P}P}P}P }P}Pü|Põ|Pî|Pç|Pà|PÙ|PÒ|PË|PÄ|P½|P¶|P¯|P¨|P¡|Pš|P“|PŒ|P…|P~|Pw|Pp|Pi|Pb|P[|PT|PM|PF|P?|P8|P1|P*|P#|P|P|P|P|P|Pù{Pò{Pë{Pä{PÝ{PÖ{PÏ{PÈ{PÁ{Pº{P³{P¬{P¥{Pž{P—{P{P‰{P‚{P{{Pt{Pm{Pf{P_{PX{PQ{PJ{PC{P<{P5{P.{P'{P {P{P{P {P{PýzPözPïzPèzPázPÚzPÓzPÌzPÅzP¾zP·zP°zP©zP¢zP›zP”zPzP†zPzPxzPqzPjzPczP\zPUzPNzPGzP@zP9zP2zP+zP$zPzPzPzPzPzPúyPóyPìyPåyPÞyP×yPÐyPÉyPÂyP»yP´yP­yP¦yPŸyP˜yP‘yPŠyPƒyP|yPuyPnyPgyP`yPYyPRyPKyPDyP=yP6yP/yP(yP!yPyPyP yPyPþxP÷xPðxPéxPâxPÛxPÔxPÍxPÆxP¿xP¸xP±xPªxP£xPœxP•xPŽxP‡xP€xPyxPrxPkxPdxP]xPVxPOxPHxPAxP:xP3xP,xP%xPxPxPxP xPxPûwPôwPíwPæwPßwPØwPÑwPÊwPÃwP¼wPµwP®wP§wP wP™wP’wP‹wP„wP}wPvwPowPhwPawPZwPSwPLwPEwP>wP7wP0wP)wP"wPwPwP wPwPÿvPøvPñvPêvPãvPÜvPÕvPÎvPÇvPÀvP¹vP²vP«vP¤vPvP–vPvPˆvPvPzvPsvPlvPevP^vPWvPPvPIvPBvP;vP4vP-vP&vPvPvPvP vPvPüuPõuPîuPçuPàuPÙuPÒuPËuPÄuP½uP¶uP¯uP¨uP¡uPšuP“uPŒuP…uP~uPwuPpuPiuPbuP[uPTuPMuPFuP?uP8uP1uP*uP#uPuPuPuPuPuPùtPòtPëtPätPÝtPÖtPÏtPÈtPÁtPºtP³tP¬tP¥tPžtP—tPtP‰tP‚tP{tPttPmtPftP_tPXtPQtPJtPCtPpP7pP0pP)pP"pPpPpP pPpPÿoPøoPñoPêoPãoPÜoPÕoPÎoPÇoPÀoP¹oP²oP«oP¤oPoP–oPoPˆoPoPzoPsoPloPeoP^oPWoPPoPIoPBoP;oP4oP-oP&oPoPoPoP oPoPünPõnPînPçnPànPÙnPÒnPËnPÄnP½nP¶nP¯nP¨nP¡nPšnP“nPŒnP…nP~nPwnPpnPinPbnP[nPTnPMnPFnP?nP8nP1nP*nP#nPnPnPnPnPnPùmPòmPëmPämPÝmPÖmPÏmPÈmPÁmPºmP³mP¬mP¥mPžmP—mPmP‰mP‚mP{mPtmPmmPfmP_mPXmPQmPJmPCmPiP7iP0iP)iP"iPiPiP iPiPÿhPøhPñhPêhPãhPÜhPÕhPÎhPÇhPÀhP¹hP²hP«hP¤hPhP–hPhPˆhPhPzhPshPlhPehP^hPWhPPhPIhPBhP;hP4hP-hP&hPhPhPhP hPhPügPõgPîgPçgPàgPÙgPÒgPËgPÄgP½gP¶gP¯gP¨gP¡gPšgP“gPŒgP…gP~gPwgPpgPigPbgP[gPTgPMgPFgP?gP8gP1gP*gP#gPgPgPgPgPgPùfPòfPëfPäfPÝfPÖfPÏfPÈfPÁfPºfP³fP¬fP¥fPžfP—fPfP‰fP‚fP{fPtfPmfPffP_fPXfPQfPJfPCfPbP7bP0bP)bP"bPbPbP bPbPÿaPøaPñaPêaPãaPÜaPÕaPÎaPÇaPÀaP¹aP²aP«aP¤aPaP–aPaPˆaPaPzaPsaPlaPeaP^aPWaPPaPIaPBaP;aP4aP-aP&aPaPaPaP aPaPü`Põ`Pî`Pç`Pà`PÙ`PÒ`PË`PÄ`P½`P¶`P¯`P¨`P¡`Pš`P“`PŒ`P…`P~`Pw`Pp`Pi`Pb`P[`PT`PM`PF`P?`P8`P1`P*`P#`P`P`P`P`P`Pù_Pò_Pë_Pä_PÝ_PÖ_PÏ_PÈ_PÁ_Pº_P³_P¬_P¥_Pž_P—_P_P‰_P‚_P{_Pt_Pm_Pf_P__PX_PQ_PJ_PC_P<_P5_P._P'_P _P_P_P _P_Pý^Pö^Pï^Pè^Pá^PÚ^PÓ^PÌ^PÅ^P¾^P·^P°^P©^P¢^P›^P”^P^P†^P^Px^Pq^Pj^Pc^P\^PU^PN^PG^P@^P9^P2^P+^P$^P^P^P^P^P^Pú]Pó]Pì]På]PÞ]P×]PÐ]PÉ]PÂ]P»]P´]P­]P¦]PŸ]P˜]P‘]PŠ]Pƒ]P|]Pu]Pn]Pg]P`]PY]PR]PK]PD]P=]P6]P/]P(]P!]P]P]P ]P]Pþ\P÷\Pð\Pé\Pâ\PÛ\PÔ\PÍ\PÆ\P¿\P¸\P±\Pª\P£\Pœ\P•\PŽ\P‡\P€\Py\Pr\Pk\Pd\P]\PV\PO\PH\PA\P:\P3\P,\P%\P\P\P\P \P\Pû[Pô[Pí[Pæ[Pß[PØ[PÑ[PÊ[PÃ[P¼[Pµ[P®[P§[P [P™[P’[P‹[P„[P}[Pv[Po[Ph[Pa[PZ[PS[PL[PE[P>[P7[P0[P)[P"[P[P [P[PÿZPøZPñZPêZPãZPÜZPÕZPÎZPÇZPÀZP¹ZP²ZP«ZP¤ZPZP–ZPZPˆZPZPzZPsZPlZPeZP^ZPWZPPZPIZPBZP;ZP4ZP-ZP&ZPZPZPZP ZPZPüYPõYPîYPçYPàYPÙYPÒYPËYPÄYP½YP¶YP¯YP¨YP¡YPšYP“YPŒYP…YP~YPwYPpYPiYPbYP[YPTYPMYPFYP?YP8YP1YP*YP#YPYPYPYPYPYPùXPòXPëXPäXPÝXPÖXPÏXPÈXPÁXPºXP³XP¬XP¥XPžXP—XPXP‰XP‚XP{XPtXPmXPfXP_XPXXPQXPJXPCXPTP7TP0TP)TP"TPTPTP TPTPÿSPøSPñSPêSPãSPÜSPÕSPÎSPÇSPÀSP¹SP²SP«SP¤SPSP–SPSPˆSPSPzSPsSPlSPeSP^SPWSPPSPISPBSP;SP4SP-SP&SPSPSPSP SPSPüRPõRPîRPçRPàRPÙRPÒRPËRPÄRP½RP¶RP¯RP¨RP¡RPšRP“RPŒRP…RP~RPwRPpRPiRPbRP[RPTRPMRPFRP?RP8RP1RP*RP#RPRPRPRPRPRPùQPòQPëQPäQPÝQPÖQPÏQPÈQPÁQPºQP³QP¬QP¥QPžQP—QPQP‰QP‚QP{QPtQPmQPfQP_QPXQPQQPJQPCQPMP7MP0MP)MP"MPMPMP MPMPÿLPøLPñLPêLPãLPÜLPÕLPÎLPÇLPÀLP¹LP²LP«LP¤LPLP–LPLPˆLPLPzLPsLPlLPeLP^LPWLPPLPILPBLP;LP4LP-LP&LPLPLPLP LPLPüKPõKPîKPçKPàKPÙKPÒKPËKPÄKP½KP¶KP¯KP¨KP¡KPšKP“KPŒKP…KP~KPwKPpKPiKPbKP[KPTKPMKPFKP?KP8KP1KP*KP#KPKPKPKPKPKPùJPòJPëJPäJPÝJPÖJPÏJPÈJPÁJPºJP³JP¬JP¥JPžJP—JPJP‰JP‚JP{JPtJPmJPfJP_JPXJPQJPJJPCJPFP7FP0FP)FP"FPFPFP FPFPÿEPøEPñEPêEPãEPÜEPÕEPÎEPÇEPÀEP¹EP²EP«EP¤EPEP–EPEPˆEPEPzEPsEPlEPeEP^EPWEPPEPIEPBEP;EP4EP-EP&EPEPEPEP EPEPüDPõDPîDPçDPàDPÙDPÒDPËDPÄDP½DP¶DP¯DP¨DP¡DPšDP“DPŒDP…DP~DPwDPpDPiDPbDP[DPTDPMDPFDP?DP8DP1DP*DP#DPDPDPDPDPDPùCPòCPëCPäCPÝCPÖCPÏCPÈCPÁCPºCP³CP¬CP¥CPžCP—CPCP‰CP‚CP{CPtCPmCPfCP_CPXCPQCPJCPCCP?P7?P0?P)?P"?P?P?P ?P?Pÿ>Pø>Pñ>Pê>Pã>PÜ>PÕ>PÎ>PÇ>PÀ>P¹>P²>P«>P¤>P>P–>P>Pˆ>P>Pz>Ps>Pl>Pe>P^>PW>PP>PI>PB>P;>P4>P->P&>P>P>P>P >P>Pü=Põ=Pî=Pç=Pà=PÙ=PÒ=PË=PÄ=P½=P¶=P¯=P¨=P¡=Pš=P“=PŒ=P…=P~=Pw=Pp=Pi=Pb=P[=PT=PM=PF=P?=P8=P1=P*=P#=P=P=P=P=P=Pù8P78P08P)8P"8P8P8P 8P8Pÿ7Pø7Pñ7Pê7Pã7PÜ7PÕ7PÎ7PÇ7PÀ7P¹7P²7P«7P¤7P7P–7P7Pˆ7P7Pz7Ps7Pl7Pe7P^7PW7PP7PI7PB7P;7P47P-7P&7P7P7P7P 7P7Pü6Põ6Pî6Pç6Pà6PÙ6PÒ6PË6PÄ6P½6P¶6P¯6P¨6P¡6Pš6P“6PŒ6P…6P~6Pw6Pp6Pi6Pb6P[6PT6PM6PF6P?6P86P16P*6P#6P6P6P6P6P6Pù5Pò5Pë5Pä5PÝ5PÖ5PÏ5PÈ5PÁ5Pº5P³5P¬5P¥5Pž5P—5P5P‰5P‚5P{5Pt5Pm5Pf5P_5PX5PQ5PJ5PC5P<5P55P.5P'5P 5P5P5P 5P5Pý4Pö4Pï4Pè4Pá4PÚ4PÓ4PÌ4PÅ4P¾4P·4P°4P©4P¢4P›4P”4P4P†4P4Px4Pq4Pj4Pc4P\4PU4PN4PG4P@4P94P24P+4P$4P4P4P4P4P4Pú3Pó3Pì3På3PÞ3P×3PÐ3PÉ3PÂ3P»3P´3P­3P¦3PŸ3P˜3P‘3PŠ3Pƒ3P|3Pu3Pn3Pg3P`3PY3PR3PK3PD3P=3P63P/3P(3P!3P3P3P 3P3Pþ2P÷2Pð2Pé2Pâ2PÛ2PÔ2PÍ2PÆ2P¿2P¸2P±2Pª2P£2Pœ2P•2PŽ2P‡2P€2Py2Pr2Pk2Pd2P]2PV2PO2PH2PA2P:2P32P,2P%2P2P2P2P 2P2Pû1Pô1Pí1Pæ1Pß1PØ1PÑ1PÊ1PÃ1P¼1Pµ1P®1P§1P 1P™1P’1P‹1P„1P}1Pv1Po1Ph1Pa1PZ1PS1PL1PE1P>1P71P01P)1P"1P1P1P 1P1Pÿ0Pø0Pñ0Pê0Pã0PÜ0PÕ0PÎ0PÇ0PÀ0P¹0P²0P«0P¤0P0P–0P0Pˆ0P0Pz0Ps0Pl0Pe0P^0PW0PP0PI0PB0P;0P40P-0P&0P0P0P0P 0P0Pü/Põ/Pî/Pç/Pà/PÙ/PÒ/PË/PÄ/P½/P¶/P¯/P¨/P¡/Pš/P“/PŒ/P…/P~/Pw/Pp/Pi/Pb/P[/PT/PM/PF/P?/P8/P1/P*/P#/P/P/P/P/P/Pù.Pò.Pë.Pä.PÝ.PÖ.PÏ.PÈ.PÁ.Pº.P³.P¬.P¥.Pž.P—.P.P‰.P‚.P{.Pt.Pm.Pf.P_.PX.PQ.PJ.PC.P<.P5.P..P'.P .P.P.P .P.Pý-Pö-Pï-Pè-Pá-PÚ-PÓ-PÌ-PÅ-P¾-P·-P°-P©-P¢-P›-P”-P-P†-P-Px-Pq-Pj-Pc-P\-PU-PN-PG-P@-P9-P2-P+-P$-P-P-P-P-P-Pú,Pó,Pì,På,PÞ,P×,PÐ,PÉ,PÂ,P»,P´,P­,P¦,PŸ,P˜,P‘,PŠ,Pƒ,P|,Pu,Pn,Pg,P`,PY,PR,PK,PD,P=,P6,P/,P(,P!,P,P,P ,P,Pþ+P÷+Pð+Pé+Pâ+PÛ+PÔ+PÍ+PÆ+P¿+P¸+P±+Pª+P£+Pœ+P•+PŽ+P‡+P€+Py+Pr+Pk+Pd+P]+PV+PO+PH+PA+P:+P3+P,+P%+P+P+P+P +P+Pû*Pô*Pí*Pæ*Pß*PØ*PÑ*PÊ*PÃ*P¼*Pµ*P®*P§*P *P™*P’*P‹*P„*P}*Pv*Po*Ph*Pa*PZ*PS*PL*PE*P>*P7*P0*P)*P"*P*P*P *P*Pÿ)Pø)Pñ)Pê)Pã)PÜ)PÕ)PÎ)PÇ)PÀ)P¹)P²)P«)P¤)P)P–)P)Pˆ)P)Pz)Ps)Pl)Pe)P^)PW)PP)PI)PB)P;)P4)P-)P&)P)P)P)P )P)Pü(Põ(Pî(Pç(Pà(PÙ(PÒ(PË(PÄ(P½(P¶(P¯(P¨(P¡(Pš(P“(PŒ(P…(P~(Pw(Pp(Pi(Pb(P[(PT(PM(PF(P?(P8(P1(P*(P#(P(P(P(P(P(Pù'Pò'Pë'Pä'PÝ'PÖ'PÏ'PÈ'PÁ'Pº'P³'P¬'P¥'Pž'P—'P'P‰'P‚'P{'Pt'Pm'Pf'P_'PX'PQ'PJ'PC'P<'P5'P.'P''P 'P'P'P 'P'Pý&Pö&Pï&Pè&Pá&PÚ&PÓ&PÌ&PÅ&P¾&P·&P°&P©&P¢&P›&P”&P&P†&P&Px&Pq&Pj&Pc&P\&PU&PN&PG&P@&P9&P2&P+&P$&P&P&P&P&P&Pú%Pó%Pì%På%PÞ%P×%PÐ%PÉ%PÂ%P»%P´%P­%P¦%PŸ%P˜%P‘%PŠ%Pƒ%P|%Pu%Pn%Pg%P`%PY%PR%PK%PD%P=%P6%P/%P(%P!%P%P%P %P%Pþ$P÷$Pð$Pé$Pâ$PÛ$PÔ$PÍ$PÆ$P¿$P¸$P±$Pª$P£$Pœ$P•$PŽ$P‡$P€$Py$Pr$Pk$Pd$P]$PV$PO$PH$PA$P:$P3$P,$P%$P$P$P$P $P$Pû#Pô#Pí#Pæ#Pß#PØ#PÑ#PÊ#PÃ#P¼#Pµ#P®#P§#P #P™#P’#P‹#P„#P}#Pv#Po#Ph#Pa#PZ#PS#PL#PE#P>#P7#P0#P)#P"#P#P#P #P#Pÿ"Pø"Pñ"Pê"Pã"PÜ"PÕ"PÎ"PÇ"PÀ"P¹"P²"P«"P¤"P"P–"P"Pˆ"P"Pz"Ps"Pl"Pe"P^"PW"PP"PI"PB"P;"P4"P-"P&"P"P"P"P "P"Pü!Põ!Pî!Pç!Pà!PÙ!PÒ!PË!PÄ!P½!P¶!P¯!P¨!P¡!Pš!P“!PŒ!P…!P~!Pw!Pp!Pi!Pb!P[!PT!PM!PF!P?!P8!P1!P*!P#!P!P!P!P!P!Pù Pò Pë Pä PÝ PÖ PÏ PÈ PÁ Pº P³ P¬ P¥ Pž P— P P‰ P‚ P{ Pt Pm Pf P_ PX PQ PJ PC P< P5 P. P' P P P P P PýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPúPóPìPåPÞP×PÐPÉPÂP»P´P­P¦PŸP˜P‘PŠPƒP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPûPôPíPæPßPØPÑPÊPÃP¼PµP®P§P P™P’P‹P„P}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPúPóPìPåPÞP×PÐPÉPÂP»P´P­P¦PŸP˜P‘PŠPƒP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPûPôPíPæPßPØPÑPÊPÃP¼PµP®P§P P™P’P‹P„P}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPúPóPìPåPÞP×PÐPÉPÂP»P´P­P¦PŸP˜P‘PŠPƒP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPûPôPíPæPßPØPÑPÊPÃP¼PµP®P§P P™P’P‹P„P}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPÿ Pø Pñ Pê Pã PÜ PÕ PÎ PÇ PÀ P¹ P² P« P¤ P P– P Pˆ P Pz Ps Pl Pe P^ PW PP PI PB P; P4 P- P& P P P P P Pü Põ Pî Pç Pà PÙ PÒ PË PÄ P½ P¶ P¯ P¨ P¡ Pš P“ PŒ P… P~ Pw Pp Pi Pb P[ PT PM PF P? P8 P1 P* P# P P P P P Pù Pò Pë Pä PÝ PÖ PÏ PÈ PÁ Pº P³ P¬ P¥ Pž P— P P‰ P‚ P{ Pt Pm Pf P_ PX PQ PJ PC P< P5 P. P' P P P P P Pý Pö Pï Pè Pá PÚ PÓ PÌ PÅ P¾ P· P° P© P¢ P› P” P P† P Px Pq Pj Pc P\ PU PN PG P@ P9 P2 P+ P$ P P P P P Pú Pó Pì På PÞ P× PÐ PÉ P P» P´ P­ P¦ PŸ P˜ P‘ PŠ Pƒ P| Pu Pn Pg P` PY PR PK PD P= P6 P/ P( P! P P P P PþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPûPôPíPæPßPØPÑPÊPÃP¼PµP®P§P P™P’P‹P„P}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCP<P5P.P'P PPP PPýPöPïPèPáPÚPÓPÌPÅP¾P·P°P©P¢P›P”PP†PPxPqPjPcP\PUPNPGP@P9P2P+P$PPPPPPúPóPìPåPÞP×PÐPÉPÂP»P´P­P¦PŸP˜P‘PŠPƒP|PuPnPgP`PYPRPKPDP=P6P/P(P!PPP PPþP÷PðPéPâPÛPÔPÍPÆP¿P¸P±PªP£PœP•PŽP‡P€PyPrPkPdP]PVPOPHPAP:P3P,P%PPPP PPûPôPíPæPßPØPÑPÊPÃP¼PµP®P§P P™P’P‹P„P}PvPoPhPaPZPSPLPEP>P7P0P)P"PPP PPÿÿOøÿOñÿOêÿOãÿOÜÿOÕÿOÎÿOÇÿOÀÿO¹ÿO²ÿO«ÿO¤ÿOÿO–ÿOÿOˆÿOÿOzÿOsÿOlÿOeÿO^ÿOWÿOPÿOIÿOBÿO;ÿO4ÿO-ÿO&ÿOÿOÿOÿO ÿOÿOüþOõþOîþOçþOàþOÙþOÒþOËþOÄþO½þO¶þO¯þO¨þO¡þOšþO“þOŒþO…þO~þOwþOpþOiþObþO[þOTþOMþOFþO?þO8þO1þO*þO#þOþOþOþOþOþOùýOòýOëýOäýOÝýOÖýOÏýOÈýOÁýOºýO³ýO¬ýO¥ýOžýO—ýOýO‰ýO‚ýO{ýOtýOmýOfýO_ýOXýOQýOJýOCýO<ýO5ýO.ýO'ýO ýOýOýO ýOýOýüOöüOïüOèüOáüOÚüOÓüOÌüOÅüO¾üO·üO°üO©üO¢üO›üO”üOüO†üOüOxüOqüOjüOcüO\üOUüONüOGüO@üO9üO2üO+üO$üOüOüOüOüOüOúûOóûOìûOåûOÞûO×ûOÐûOÉûOÂûO»ûO´ûO­ûO¦ûOŸûO˜ûO‘ûOŠûOƒûO|ûOuûOnûOgûO`ûOYûORûOKûODûO=ûO6ûO/ûO(ûO!ûOûOûO ûOûOþúO÷úOðúOéúOâúOÛúOÔúOÍúOÆúO¿úO¸úO±úOªúO£úOœúO•úOŽúO‡úO€úOyúOrúOkúOdúO]úOVúOOúOHúOAúO:úO3úO,úO%úOúOúOúO úOúOûùOôùOíùOæùOßùOØùOÑùOÊùOÃùO¼ùOµùO®ùO§ùO ùO™ùO’ùO‹ùO„ùO}ùOvùOoùOhùOaùOZùOSùOLùOEùO>ùO7ùO0ùO)ùO"ùOùOùO ùOùOÿøOøøOñøOêøOãøOÜøOÕøOÎøOÇøOÀøO¹øO²øO«øO¤øOøO–øOøOˆøOøOzøOsøOløOeøO^øOWøOPøOIøOBøO;øO4øO-øO&øOøOøOøO øOøOü÷Oõ÷Oî÷Oç÷Oà÷OÙ÷OÒ÷OË÷OÄ÷O½÷O¶÷O¯÷O¨÷O¡÷Oš÷O“÷OŒ÷O…÷O~÷Ow÷Op÷Oi÷Ob÷O[÷OT÷OM÷OF÷O?÷O8÷O1÷O*÷O#÷O÷O÷O÷O÷O÷OùöOòöOëöOäöOÝöOÖöOÏöOÈöOÁöOºöO³öO¬öO¥öOžöO—öOöO‰öO‚öO{öOtöOmöOföO_öOXöOQöOJöOCöO<öO5öO.öO'öO öOöOöO öOöOýõOöõOïõOèõOáõOÚõOÓõOÌõOÅõO¾õO·õO°õO©õO¢õO›õO”õOõO†õOõOxõOqõOjõOcõO\õOUõONõOGõO@õO9õO2õO+õO$õOõOõOõOõOõOúôOóôOìôOåôOÞôO×ôOÐôOÉôOÂôO»ôO´ôO­ôO¦ôOŸôO˜ôO‘ôOŠôOƒôO|ôOuôOnôOgôO`ôOYôORôOKôODôO=ôO6ôO/ôO(ôO!ôOôOôO ôOôOþóO÷óOðóOéóOâóOÛóOÔóOÍóOÆóO¿óO¸óO±óOªóO£óOœóO•óOŽóO‡óO€óOyóOróOkóOdóO]óOVóOOóOHóOAóO:óO3óO,óO%óOóOóOóO óOóOûòOôòOíòOæòOßòOØòOÑòOÊòOÃòO¼òOµòO®òO§òO òO™òO’òO‹òO„òO}òOvòOoòOhòOaòOZòOSòOLòOEòO>òO7òO0òO)òO"òOòOòO òOòOÿñOøñOññOêñOãñOÜñOÕñOÎñOÇñOÀñO¹ñO²ñO«ñO¤ñOñO–ñOñOˆñOñOzñOsñOlñOeñO^ñOWñOPñOIñOBñO;ñO4ñO-ñO&ñOñOñOñO ñOñOüðOõðOîðOçðOàðOÙðOÒðOËðOÄðO½ðO¶ðO¯ðO¨ðO¡ðOšðO“ðOŒðO…ðO~ðOwðOpðOiðObðO[ðOTðOMðOFðO?ðO8ðO1ðO*ðO#ðOðOðOðOðOðOùïOòïOëïOäïOÝïOÖïOÏïOÈïOÁïOºïO³ïO¬ïO¥ïOžïO—ïOïO‰ïO‚ïO{ïOtïOmïOfïO_ïOXïOQïOJïOCïO<ïO5ïO.ïO'ïO ïOïOïO ïOïOýîOöîOïîOèîOáîOÚîOÓîOÌîOÅîO¾îO·îO°îO©îO¢îO›îO”îOîO†îOîOxîOqîOjîOcîO\îOUîONîOGîO@îO9îO2îO+îO$îOîOîOîOîOîOúíOóíOìíOåíOÞíO×íOÐíOÉíOÂíO»íO´íO­íO¦íOŸíO˜íO‘íOŠíOƒíO|íOuíOníOgíO`íOYíORíOKíODíO=íO6íO/íO(íO!íOíOíO íOíOþìO÷ìOðìOéìOâìOÛìOÔìOÍìOÆìO¿ìO¸ìO±ìOªìO£ìOœìO•ìOŽìO‡ìO€ìOyìOrìOkìOdìO]ìOVìOOìOHìOAìO:ìO3ìO,ìO%ìOìOìOìO ìOìOûëOôëOíëOæëOßëOØëOÑëOÊëOÃëO¼ëOµëO®ëO§ëO ëO™ëO’ëO‹ëO„ëO}ëOvëOoëOhëOaëOZëOSëOLëOEëO>ëO7ëO0ëO)ëO"ëOëOëO ëOëOÿêOøêOñêOêêOãêOÜêOÕêOÎêOÇêOÀêO¹êO²êO«êO¤êOêO–êOêOˆêOêOzêOsêOlêOeêO^êOWêOPêOIêOBêO;êO4êO-êO&êOêOêOêO êOêOüéOõéOîéOçéOàéOÙéOÒéOËéOÄéO½éO¶éO¯éO¨éO¡éOšéO“éOŒéO…éO~éOwéOpéOiéObéO[éOTéOMéOFéO?éO8éO1éO*éO#éOéOéOéOéOéOùèOòèOëèOäèOÝèOÖèOÏèOÈèOÁèOºèO³èO¬èO¥èOžèO—èOèO‰èO‚èO{èOtèOmèOfèO_èOXèOQèOJèOCèO<èO5èO.èO'èO èOèOèO èOèOýçOöçOïçOèçOáçOÚçOÓçOÌçOÅçO¾çO·çO°çO©çO¢çO›çO”çOçO†çOçOxçOqçOjçOcçO\çOUçONçOGçO@çO9çO2çO+çO$çOçOçOçOçOçOúæOóæOìæOåæOÞæO׿OÐæOÉæOÂæO»æO´æO­æO¦æOŸæO˜æO‘æOŠæOƒæO|æOuæOnæOgæO`æOYæORæOKæODæO=æO6æO/æO(æO!æOæOæO æOæOþåO÷åOðåOéåOâåOÛåOÔåOÍåOÆåO¿åO¸åO±åOªåO£åOœåO•åOŽåO‡åO€åOyåOråOkåOdåO]åOVåOOåOHåOAåO:åO3åO,åO%åOåOåOåO åOåOûäOôäOíäOæäOßäOØäOÑäOÊäOÃäO¼äOµäO®äO§äO äO™äO’äO‹äO„äO}äOväOoäOhäOaäOZäOSäOLäOEäO>äO7äO0äO)äO"äOäOäO äOäOÿãOøãOñãOêãOããOÜãOÕãOÎãOÇãOÀãO¹ãO²ãO«ãO¤ãOãO–ãOãOˆãOãOzãOsãOlãOeãO^ãOWãOPãOIãOBãO;ãO4ãO-ãO&ãOãOãOãO ãOãOüâOõâOîâOçâOàâOÙâOÒâOËâOÄâO½âO¶âO¯âO¨âO¡âOšâO“âOŒâO…âO~âOwâOpâOiâObâO[âOTâOMâOFâO?âO8âO1âO*âO#âOâOâOâOâOâOùáOòáOëáOäáOÝáOÖáOÏáOÈáOÁáOºáO³áO¬áO¥áOžáO—áOáO‰áO‚áO{áOtáOmáOfáO_áOXáOQáOJáOCáO<áO5áO.áO'áO áOáOáO áOáOýàOöàOïàOèàOáàOÚàOÓàOÌàOÅàO¾àO·àO°àO©àO¢àO›àO”àOàO†àOàOxàOqàOjàOcàO\àOUàONàOGàO@àO9àO2àO+àO$àOàOàOàOàOàOúßOóßOìßOåßOÞßO×ßOÐßOÉßOÂßO»ßO´ßO­ßO¦ßOŸßO˜ßO‘ßOŠßOƒßO|ßOußOnßOgßO`ßOYßORßOKßODßO=ßO6ßO/ßO(ßO!ßOßOßO ßOßOþÞO÷ÞOðÞOéÞOâÞOÛÞOÔÞOÍÞOÆÞO¿ÞO¸ÞO±ÞOªÞO£ÞOœÞO•ÞOŽÞO‡ÞO€ÞOyÞOrÞOkÞOdÞO]ÞOVÞOOÞOHÞOAÞO:ÞO3ÞO,ÞO%ÞOÞOÞOÞO ÞOÞOûÝOôÝOíÝOæÝOßÝOØÝOÑÝOÊÝOÃÝO¼ÝOµÝO®ÝO§ÝO ÝO™ÝO’ÝO‹ÝO„ÝO}ÝOvÝOoÝOhÝOaÝOZÝOSÝOLÝOEÝO>ÝO7ÝO0ÝO)ÝO"ÝOÝOÝO ÝOÝOÿÜOøÜOñÜOêÜOãÜOÜÜOÕÜOÎÜOÇÜOÀÜO¹ÜO²ÜO«ÜO¤ÜOÜO–ÜOÜOˆÜOÜOzÜOsÜOlÜOeÜO^ÜOWÜOPÜOIÜOBÜO;ÜO4ÜO-ÜO&ÜOÜOÜOÜO ÜOÜOüÛOõÛOîÛOçÛOàÛOÙÛOÒÛOËÛOÄÛO½ÛO¶ÛO¯ÛO¨ÛO¡ÛOšÛO“ÛOŒÛO…ÛO~ÛOwÛOpÛOiÛObÛO[ÛOTÛOMÛOFÛO?ÛO8ÛO1ÛO*ÛO#ÛOÛOÛOÛOÛOÛOùÚOòÚOëÚOäÚOÝÚOÖÚOÏÚOÈÚOÁÚOºÚO³ÚO¬ÚO¥ÚOžÚO—ÚOÚO‰ÚO‚ÚO{ÚOtÚOmÚOfÚO_ÚOXÚOQÚOJÚOCÚO<ÚO5ÚO.ÚO'ÚO ÚOÚOÚO ÚOÚOýÙOöÙOïÙOèÙOáÙOÚÙOÓÙOÌÙOÅÙO¾ÙO·ÙO°ÙO©ÙO¢ÙO›ÙO”ÙOÙO†ÙOÙOxÙOqÙOjÙOcÙO\ÙOUÙONÙOGÙO@ÙO9ÙO2ÙO+ÙO$ÙOÙOÙOÙOÙOÙOúØOóØOìØOåØOÞØOרOÐØOÉØOÂØO»ØO´ØO­ØO¦ØOŸØO˜ØO‘ØOŠØOƒØO|ØOuØOnØOgØO`ØOYØORØOKØODØO=ØO6ØO/ØO(ØO!ØOØOØO ØOØOþ×O÷×Oð×Oé×Oâ×OÛ×OÔ×OÍ×OÆ×O¿×O¸×O±×Oª×O£×Oœ×O•×OŽ×O‡×O€×Oy×Or×Ok×Od×O]×OV×OO×OH×OA×O:×O3×O,×O%×O×O×O×O ×O×OûÖOôÖOíÖOæÖOßÖOØÖOÑÖOÊÖOÃÖO¼ÖOµÖO®ÖO§ÖO ÖO™ÖO’ÖO‹ÖO„ÖO}ÖOvÖOoÖOhÖOaÖOZÖOSÖOLÖOEÖO>ÖO7ÖO0ÖO)ÖO"ÖOÖOÖO ÖOÖOÿÕOøÕOñÕOêÕOãÕOÜÕOÕÕOÎÕOÇÕOÀÕO¹ÕO²ÕO«ÕO¤ÕOÕO–ÕOÕOˆÕOÕOzÕOsÕOlÕOeÕO^ÕOWÕOPÕOIÕOBÕO;ÕO4ÕO-ÕO&ÕOÕOÕOÕO ÕOÕOüÔOõÔOîÔOçÔOàÔOÙÔOÒÔOËÔOÄÔO½ÔO¶ÔO¯ÔO¨ÔO¡ÔOšÔO“ÔOŒÔO…ÔO~ÔOwÔOpÔOiÔObÔO[ÔOTÔOMÔOFÔO?ÔO8ÔO1ÔO*ÔO#ÔOÔOÔOÔOÔOÔOùÓOòÓOëÓOäÓOÝÓOÖÓOÏÓOÈÓOÁÓOºÓO³ÓO¬ÓO¥ÓOžÓO—ÓOÓO‰ÓO‚ÓO{ÓOtÓOmÓOfÓO_ÓOXÓOQÓOJÓOCÓO<ÓO5ÓO.ÓO'ÓO ÓOÓOÓO ÓOÓOýÒOöÒOïÒOèÒOáÒOÚÒOÓÒOÌÒOÅÒO¾ÒO·ÒO°ÒO©ÒO¢ÒO›ÒO”ÒOÒO†ÒOÒOxÒOqÒOjÒOcÒO\ÒOUÒONÒOGÒO@ÒO9ÒO2ÒO+ÒO$ÒOÒOÒOÒOÒOÒOúÑOóÑOìÑOåÑOÞÑO×ÑOÐÑOÉÑOÂÑO»ÑO´ÑO­ÑO¦ÑOŸÑO˜ÑO‘ÑOŠÑOƒÑO|ÑOuÑOnÑOgÑO`ÑOYÑORÑOKÑODÑO=ÑO6ÑO/ÑO(ÑO!ÑOÑOÑO ÑOÑOþÐO÷ÐOðÐOéÐOâÐOÛÐOÔÐOÍÐOÆÐO¿ÐO¸ÐO±ÐOªÐO£ÐOœÐO•ÐOŽÐO‡ÐO€ÐOyÐOrÐOkÐOdÐO]ÐOVÐOOÐOHÐOAÐO:ÐO3ÐO,ÐO%ÐOÐOÐOÐO ÐOÐOûÏOôÏOíÏOæÏOßÏOØÏOÑÏOÊÏOÃÏO¼ÏOµÏO®ÏO§ÏO ÏO™ÏO’ÏO‹ÏO„ÏO}ÏOvÏOoÏOhÏOaÏOZÏOSÏOLÏOEÏO>ÏO7ÏO0ÏO)ÏO"ÏOÏOÏO ÏOÏOÿÎOøÎOñÎOêÎOãÎOÜÎOÕÎOÎÎOÇÎOÀÎO¹ÎO²ÎO«ÎO¤ÎOÎO–ÎOÎOˆÎOÎOzÎOsÎOlÎOeÎO^ÎOWÎOPÎOIÎOBÎO;ÎO4ÎO-ÎO&ÎOÎOÎOÎO ÎOÎOüÍOõÍOîÍOçÍOàÍOÙÍOÒÍOËÍOÄÍO½ÍO¶ÍO¯ÍO¨ÍO¡ÍOšÍO“ÍOŒÍO…ÍO~ÍOwÍOpÍOiÍObÍO[ÍOTÍOMÍOFÍO?ÍO8ÍO1ÍO*ÍO#ÍOÍOÍOÍOÍOÍOùÌOòÌOëÌOäÌOÝÌOÖÌOÏÌOÈÌOÁÌOºÌO³ÌO¬ÌO¥ÌOžÌO—ÌOÌO‰ÌO‚ÌO{ÌOtÌOmÌOfÌO_ÌOXÌOQÌOJÌOCÌO<ÌO5ÌO.ÌO'ÌO ÌOÌOÌO ÌOÌOýËOöËOïËOèËOáËOÚËOÓËOÌËOÅËO¾ËO·ËO°ËO©ËO¢ËO›ËO”ËOËO†ËOËOxËOqËOjËOcËO\ËOUËONËOGËO@ËO9ËO2ËO+ËO$ËOËOËOËOËOËOúÊOóÊOìÊOåÊOÞÊO×ÊOÐÊOÉÊOÂÊO»ÊO´ÊO­ÊO¦ÊOŸÊO˜ÊO‘ÊOŠÊOƒÊO|ÊOuÊOnÊOgÊO`ÊOYÊORÊOKÊODÊO=ÊO6ÊO/ÊO(ÊO!ÊOÊOÊO ÊOÊOþÉO÷ÉOðÉOéÉOâÉOÛÉOÔÉOÍÉOÆÉO¿ÉO¸ÉO±ÉOªÉO£ÉOœÉO•ÉOŽÉO‡ÉO€ÉOyÉOrÉOkÉOdÉO]ÉOVÉOOÉOHÉOAÉO:ÉO3ÉO,ÉO%ÉOÉOÉOÉO ÉOÉOûÈOôÈOíÈOæÈOßÈOØÈOÑÈOÊÈOÃÈO¼ÈOµÈO®ÈO§ÈO ÈO™ÈO’ÈO‹ÈO„ÈO}ÈOvÈOoÈOhÈOaÈOZÈOSÈOLÈOEÈO>ÈO7ÈO0ÈO)ÈO"ÈOÈOÈO ÈOÈOÿÇOøÇOñÇOêÇOãÇOÜÇOÕÇOÎÇOÇÇOÀÇO¹ÇO²ÇO«ÇO¤ÇOÇO–ÇOÇOˆÇOÇOzÇOsÇOlÇOeÇO^ÇOWÇOPÇOIÇOBÇO;ÇO4ÇO-ÇO&ÇOÇOÇOÇO ÇOÇOüÆOõÆOîÆOçÆOàÆOÙÆOÒÆOËÆOÄÆO½ÆO¶ÆO¯ÆO¨ÆO¡ÆOšÆO“ÆOŒÆO…ÆO~ÆOwÆOpÆOiÆObÆO[ÆOTÆOMÆOFÆO?ÆO8ÆO1ÆO*ÆO#ÆOÆOÆOÆOÆOÆOùÅOòÅOëÅOäÅOÝÅOÖÅOÏÅOÈÅOÁÅOºÅO³ÅO¬ÅO¥ÅOžÅO—ÅOÅO‰ÅO‚ÅO{ÅOtÅOmÅOfÅO_ÅOXÅOQÅOJÅOCÅO<ÅO5ÅO.ÅO'ÅO ÅOÅOÅO ÅOÅOýÄOöÄOïÄOèÄOáÄOÚÄOÓÄOÌÄOÅÄO¾ÄO·ÄO°ÄO©ÄO¢ÄO›ÄO”ÄOÄO†ÄOÄOxÄOqÄOjÄOcÄO\ÄOUÄONÄOGÄO@ÄO9ÄO2ÄO+ÄO$ÄOÄOÄOÄOÄOÄOúÃOóÃOìÃOåÃOÞÃO×ÃOÐÃOÉÃOÂÃO»ÃO´ÃO­ÃO¦ÃOŸÃO˜ÃO‘ÃOŠÃOƒÃO|ÃOuÃOnÃOgÃO`ÃOYÃORÃOKÃODÃO=ÃO6ÃO/ÃO(ÃO!ÃOÃOÃO ÃOÃOþÂO÷ÂOðÂOéÂOâÂOÛÂOÔÂOÍÂOÆÂO¿ÂO¸ÂO±ÂOªÂO£ÂOœÂO•ÂOŽÂO‡ÂO€ÂOyÂOrÂOkÂOdÂO]ÂOVÂOOÂOHÂOAÂO:ÂO3ÂO,ÂO%ÂOÂOÂOÂO ÂOÂOûÁOôÁOíÁOæÁOßÁOØÁOÑÁOÊÁOÃÁO¼ÁOµÁO®ÁO§ÁO ÁO™ÁO’ÁO‹ÁO„ÁO}ÁOvÁOoÁOhÁOaÁOZÁOSÁOLÁOEÁO>ÁO7ÁO0ÁO)ÁO"ÁOÁOÁO ÁOÁOÿÀOøÀOñÀOêÀOãÀOÜÀOÕÀOÎÀOÇÀOÀÀO¹ÀO²ÀO«ÀO¤ÀOÀO–ÀOÀOˆÀOÀOzÀOsÀOlÀOeÀO^ÀOWÀOPÀOIÀOBÀO;ÀO4ÀO-ÀO&ÀOÀOÀOÀO ÀOÀOü¿Oõ¿Oî¿Oç¿Oà¿OÙ¿OÒ¿OË¿OÄ¿O½¿O¶¿O¯¿O¨¿O¡¿Oš¿O“¿OŒ¿O…¿O~¿Ow¿Op¿Oi¿Ob¿O[¿OT¿OM¿OF¿O?¿O8¿O1¿O*¿O#¿O¿O¿O¿O¿O¿Où¾Oò¾Oë¾Oä¾OݾOÖ¾OϾOȾOÁ¾Oº¾O³¾O¬¾O¥¾Ož¾O—¾O¾O‰¾O‚¾O{¾Ot¾Om¾Of¾O_¾OX¾OQ¾OJ¾OC¾O<¾O5¾O.¾O'¾O ¾O¾O¾O ¾O¾Oý½Oö½Oï½Oè½Oá½OÚ½OÓ½O̽OŽO¾½O·½O°½O©½O¢½O›½O”½O½O†½O½Ox½Oq½Oj½Oc½O\½OU½ON½OG½O@½O9½O2½O+½O$½O½O½O½O½O½Oú¼Oó¼Oì¼Oå¼OÞ¼O×¼OмOɼO¼O»¼O´¼O­¼O¦¼OŸ¼O˜¼O‘¼OмOƒ¼O|¼Ou¼On¼Og¼O`¼OY¼OR¼OK¼OD¼O=¼O6¼O/¼O(¼O!¼O¼O¼O ¼O¼Oþ»O÷»Oð»Oé»Oâ»OÛ»OÔ»OÍ»OÆ»O¿»O¸»O±»Oª»O£»Oœ»O•»OŽ»O‡»O€»Oy»Or»Ok»Od»O]»OV»OO»OH»OA»O:»O3»O,»O%»O»O»O»O »O»OûºOôºOíºOæºOߺOغOѺOʺOúO¼ºOµºO®ºO§ºO ºO™ºO’ºO‹ºO„ºO}ºOvºOoºOhºOaºOZºOSºOLºOEºO>ºO7ºO0ºO)ºO"ºOºOºO ºOºOÿ¹Oø¹Oñ¹Oê¹Oã¹OܹOÕ¹OιOǹOÀ¹O¹¹O²¹O«¹O¤¹O¹O–¹O¹Oˆ¹O¹Oz¹Os¹Ol¹Oe¹O^¹OW¹OP¹OI¹OB¹O;¹O4¹O-¹O&¹O¹O¹O¹O ¹O¹Oü¸Oõ¸Oî¸Oç¸Oà¸OÙ¸OÒ¸O˸OĸO½¸O¶¸O¯¸O¨¸O¡¸Oš¸O“¸OŒ¸O…¸O~¸Ow¸Op¸Oi¸Ob¸O[¸OT¸OM¸OF¸O?¸O8¸O1¸O*¸O#¸O¸O¸O¸O¸O¸Où·Oò·Oë·Oä·OÝ·OÖ·OÏ·OÈ·OÁ·Oº·O³·O¬·O¥·Ož·O—·O·O‰·O‚·O{·Ot·Om·Of·O_·OX·OQ·OJ·OC·O<·O5·O.·O'·O ·O·O·O ·O·Oý¶Oö¶Oï¶Oè¶Oá¶OÚ¶OÓ¶O̶OŶO¾¶O·¶O°¶O©¶O¢¶O›¶O”¶O¶O†¶O¶Ox¶Oq¶Oj¶Oc¶O\¶OU¶ON¶OG¶O@¶O9¶O2¶O+¶O$¶O¶O¶O¶O¶O¶OúµOóµOìµOåµOÞµO×µOеOɵOµO»µO´µO­µO¦µOŸµO˜µO‘µOеOƒµO|µOuµOnµOgµO`µOYµORµOKµODµO=µO6µO/µO(µO!µOµOµO µOµOþ´O÷´Oð´Oé´Oâ´OÛ´OÔ´OÍ´OÆ´O¿´O¸´O±´Oª´O£´Oœ´O•´OŽ´O‡´O€´Oy´Or´Ok´Od´O]´OV´OO´OH´OA´O:´O3´O,´O%´O´O´O´O ´O´Oû³Oô³Oí³Oæ³Oß³OسOѳOʳOóO¼³Oµ³O®³O§³O ³O™³O’³O‹³O„³O}³Ov³Oo³Oh³Oa³OZ³OS³OL³OE³O>³O7³O0³O)³O"³O³O³O ³O³Oÿ²Oø²Oñ²Oê²Oã²OܲOÕ²OβODzOÀ²O¹²O²²O«²O¤²O²O–²O²Oˆ²O²Oz²Os²Ol²Oe²O^²OW²OP²OI²OB²O;²O4²O-²O&²O²O²O²O ²O²Oü±Oõ±Oî±Oç±Oà±OÙ±OÒ±O˱OıO½±O¶±O¯±O¨±O¡±Oš±O“±OŒ±O…±O~±Ow±Op±Oi±Ob±O[±OT±OM±OF±O?±O8±O1±O*±O#±O±O±O±O±O±Où°Oò°Oë°Oä°OݰOÖ°OϰOȰOÁ°Oº°O³°O¬°O¥°Ož°O—°O°O‰°O‚°O{°Ot°Om°Of°O_°OX°OQ°OJ°OC°O<°O5°O.°O'°O °O°O°O °O°Oý¯Oö¯Oï¯Oè¯Oá¯OÚ¯OÓ¯O̯OůO¾¯O·¯O°¯O©¯O¢¯O›¯O”¯O¯O†¯O¯Ox¯Oq¯Oj¯Oc¯O\¯OU¯ON¯OG¯O@¯O9¯O2¯O+¯O$¯O¯O¯O¯O¯O¯Oú®Oó®Oì®Oå®OÞ®O×®OЮOÉ®O®O»®O´®O­®O¦®OŸ®O˜®O‘®OŠ®Oƒ®O|®Ou®On®Og®O`®OY®OR®OK®OD®O=®O6®O/®O(®O!®O®O®O ®O®Oþ­O÷­Oð­Oé­Oâ­OÛ­OÔ­OÍ­OÆ­O¿­O¸­O±­Oª­O£­Oœ­O•­OŽ­O‡­O€­Oy­Or­Ok­Od­O]­OV­OO­OH­OA­O:­O3­O,­O%­O­O­O­O ­O­Oû¬Oô¬Oí¬Oæ¬O߬OجOѬOʬOìO¼¬Oµ¬O®¬O§¬O ¬O™¬O’¬O‹¬O„¬O}¬Ov¬Oo¬Oh¬Oa¬OZ¬OS¬OL¬OE¬O>¬O7¬O0¬O)¬O"¬O¬O¬O ¬O¬Oÿ«Oø«Oñ«Oê«Oã«OÜ«OÕ«OΫOÇ«OÀ«O¹«O²«O««O¤«O«O–«O«Oˆ«O«Oz«Os«Ol«Oe«O^«OW«OP«OI«OB«O;«O4«O-«O&«O«O«O«O «O«OüªOõªOîªOçªOàªOÙªOÒªO˪OĪO½ªO¶ªO¯ªO¨ªO¡ªOšªO“ªOŒªO…ªO~ªOwªOpªOiªObªO[ªOTªOMªOFªO?ªO8ªO1ªO*ªO#ªOªOªOªOªOªOù©Oò©Oë©Oä©OÝ©OÖ©OÏ©OÈ©OÁ©Oº©O³©O¬©O¥©Ož©O—©O©O‰©O‚©O{©Ot©Om©Of©O_©OX©OQ©OJ©OC©O<©O5©O.©O'©O ©O©O©O ©O©Oý¨Oö¨Oï¨Oè¨Oá¨OÚ¨OÓ¨ǪOŨO¾¨O·¨O°¨O©¨O¢¨O›¨O”¨O¨O†¨O¨Ox¨Oq¨Oj¨Oc¨O\¨OU¨ON¨OG¨O@¨O9¨O2¨O+¨O$¨O¨O¨O¨O¨O¨Oú§Oó§Oì§Oå§OÞ§O×§OЧOɧO§O»§O´§O­§O¦§OŸ§O˜§O‘§OЧOƒ§O|§Ou§On§Og§O`§OY§OR§OK§OD§O=§O6§O/§O(§O!§O§O§O §O§Oþ¦O÷¦Oð¦Oé¦Oâ¦OÛ¦OÔ¦OͦOƦO¿¦O¸¦O±¦Oª¦O£¦Oœ¦O•¦OަO‡¦O€¦Oy¦Or¦Ok¦Od¦O]¦OV¦OO¦OH¦OA¦O:¦O3¦O,¦O%¦O¦O¦O¦O ¦O¦Oû¥Oô¥Oí¥Oæ¥OߥOØ¥OÑ¥OÊ¥OÃ¥O¼¥Oµ¥O®¥O§¥O ¥O™¥O’¥O‹¥O„¥O}¥Ov¥Oo¥Oh¥Oa¥OZ¥OS¥OL¥OE¥O>¥O7¥O0¥O)¥O"¥O¥O¥O ¥O¥Oÿ¤Oø¤Oñ¤Oê¤Oã¤OܤOÕ¤OΤOǤOÀ¤O¹¤O²¤O«¤O¤¤O¤O–¤O¤Oˆ¤O¤Oz¤Os¤Ol¤Oe¤O^¤OW¤OP¤OI¤OB¤O;¤O4¤O-¤O&¤O¤O¤O¤O ¤O¤Oü£Oõ£Oî£Oç£Oà£OÙ£OÒ£OË£OÄ£O½£O¶£O¯£O¨£O¡£Oš£O“£OŒ£O…£O~£Ow£Op£Oi£Ob£O[£OT£OM£OF£O?£O8£O1£O*£O#£O£O£O£O£O£Où¢Oò¢Oë¢Oä¢OÝ¢OÖ¢OÏ¢OÈ¢OÁ¢Oº¢O³¢O¬¢O¥¢Ož¢O—¢O¢O‰¢O‚¢O{¢Ot¢Om¢Of¢O_¢OX¢OQ¢OJ¢OC¢O<¢O5¢O.¢O'¢O ¢O¢O¢O ¢O¢Oý¡Oö¡Oï¡Oè¡Oá¡OÚ¡OÓ¡OÌ¡OÅ¡O¾¡O·¡O°¡O©¡O¢¡O›¡O”¡O¡O†¡O¡Ox¡Oq¡Oj¡Oc¡O\¡OU¡ON¡OG¡O@¡O9¡O2¡O+¡O$¡O¡O¡O¡O¡O¡Oú Oó Oì Oå OÞ O× OРOÉ O O» O´ O­ O¦ OŸ O˜ O‘ OŠ Oƒ O| Ou On Og O` OY OR OK OD O= O6 O/ O( O! O O O  O OþŸO÷ŸOðŸOéŸOâŸOÛŸOÔŸOÍŸOÆŸO¿ŸO¸ŸO±ŸOªŸO£ŸOœŸO•ŸOŽŸO‡ŸO€ŸOyŸOrŸOkŸOdŸO]ŸOVŸOOŸOHŸOAŸO:ŸO3ŸO,ŸO%ŸOŸOŸOŸO ŸOŸOûžOôžOížOæžOßžOØžOÑžOÊžOÞO¼žOµžO®žO§žO žO™žO’žO‹žO„žO}žOvžOožOhžOažOZžOSžOLžOEžO>žO7žO0žO)žO"žOžOžO žOžOÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüœOõœOîœOçœOàœOÙœOÒœOËœOÄœO½œO¶œO¯œO¨œO¡œOšœO“œOŒœO…œO~œOwœOpœOiœObœO[œOTœOMœOFœO?œO8œO1œO*œO#œOœOœOœOœOœOù›Oò›Oë›Oä›OÝ›OÖ›OÏ›OÈ›OÁ›Oº›O³›O¬›O¥›Ož›O—›O›O‰›O‚›O{›Ot›Om›Of›O_›OX›OQ›OJ›OC›O<›O5›O.›O'›O ›O›O›O ›O›OýšOöšOïšOèšOášOÚšOÓšOÌšOÅšO¾šO·šO°šO©šO¢šO›šO”šOšO†šOšOxšOqšOjšOcšO\šOUšONšOGšO@šO9šO2šO+šO$šOšOšOšOšOšOú™Oó™Oì™Oå™OÞ™O×™OЙOÉ™O™O»™O´™O­™O¦™OŸ™O˜™O‘™OŠ™Oƒ™O|™Ou™On™Og™O`™OY™OR™OK™OD™O=™O6™O/™O(™O!™O™O™O ™O™Oþ˜O÷˜Oð˜Oé˜Oâ˜OÛ˜OÔ˜O͘OƘO¿˜O¸˜O±˜Oª˜O£˜Oœ˜O•˜OŽ˜O‡˜O€˜Oy˜Or˜Ok˜Od˜O]˜OV˜OO˜OH˜OA˜O:˜O3˜O,˜O%˜O˜O˜O˜O ˜O˜Oû—Oô—Oí—Oæ—Oß—OØ—OÑ—OÊ—O×O¼—Oµ—O®—O§—O —O™—O’—O‹—O„—O}—Ov—Oo—Oh—Oa—OZ—OS—OL—OE—O>—O7—O0—O)—O"—O—O—O —O—Oÿ–Oø–Oñ–Oê–Oã–OÜ–OÕ–OΖOÇ–OÀ–O¹–O²–O«–O¤–O–O––O–Oˆ–O–Oz–Os–Ol–Oe–O^–OW–OP–OI–OB–O;–O4–O-–O&–O–O–O–O –O–Oü•Oõ•Oî•Oç•Oà•OÙ•OÒ•OË•OÄ•O½•O¶•O¯•O¨•O¡•Oš•O“•OŒ•O…•O~•Ow•Op•Oi•Ob•O[•OT•OM•OF•O?•O8•O1•O*•O#•O•O•O•O•O•Où”Oò”Oë”Oä”OÝ”OÖ”OÏ”OÈ”OÁ”Oº”O³”O¬”O¥”Ož”O—”O”O‰”O‚”O{”Ot”Om”Of”O_”OX”OQ”OJ”OC”O<”O5”O.”O'”O ”O”O”O ”O”Oý“Oö“Oï“Oè“Oá“OÚ“OÓ“OÌ“OÅ“O¾“O·“O°“O©“O¢“O›“O”“O“O†“O“Ox“Oq“Oj“Oc“O\“OU“ON“OG“O@“O9“O2“O+“O$“O“O“O“O“O“Oú’Oó’Oì’Oå’OÞ’O×’OÐ’OÉ’OÂ’O»’O´’O­’O¦’OŸ’O˜’O‘’OŠ’Oƒ’O|’Ou’On’Og’O`’OY’OR’OK’OD’O=’O6’O/’O(’O!’O’O’O ’O’Oþ‘O÷‘Oð‘Oé‘Oâ‘OÛ‘OÔ‘OÍ‘OÆ‘O¿‘O¸‘O±‘Oª‘O£‘Oœ‘O•‘OŽ‘O‡‘O€‘Oy‘Or‘Ok‘Od‘O]‘OV‘OO‘OH‘OA‘O:‘O3‘O,‘O%‘O‘O‘O‘O ‘O‘OûOôOíOæOßOØOÑOÊOÃO¼OµO®O§O O™O’O‹O„O}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüŽOõŽOîŽOçŽOàŽOÙŽOÒŽOËŽOÄŽO½ŽO¶ŽO¯ŽO¨ŽO¡ŽOšŽO“ŽOŒŽO…ŽO~ŽOwŽOpŽOiŽObŽO[ŽOTŽOMŽOFŽO?ŽO8ŽO1ŽO*ŽO#ŽOŽOŽOŽOŽOŽOùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO‰O7‰O0‰O)‰O"‰O‰O‰O ‰O‰OÿˆOøˆOñˆOêˆOãˆO܈OÕˆOΈOLjOÀˆO¹ˆO²ˆO«ˆO¤ˆOˆO–ˆOˆOˆˆOˆOzˆOsˆOlˆOeˆO^ˆOWˆOPˆOIˆOBˆO;ˆO4ˆO-ˆO&ˆOˆOˆOˆO ˆOˆOü‡Oõ‡Oî‡Oç‡Oà‡OÙ‡OÒ‡OˇOćO½‡O¶‡O¯‡O¨‡O¡‡Oš‡O“‡OŒ‡O…‡O~‡Ow‡Op‡Oi‡Ob‡O[‡OT‡OM‡OF‡O?‡O8‡O1‡O*‡O#‡O‡O‡O‡O‡O‡Où†Oò†Oë†Oä†O݆OÖ†OφOȆOÁ†Oº†O³†O¬†O¥†Ož†O—†O†O‰†O‚†O{†Ot†Om†Of†O_†OX†OQ†OJ†OC†O<†O5†O.†O'†O †O†O†O †O†Oý…Oö…Oï…Oè…Oá…OÚ…OÓ…OÌ…OÅ…O¾…O·…O°…O©…O¢…O›…O”…O…O†…O…Ox…Oq…Oj…Oc…O\…OU…ON…OG…O@…O9…O2…O+…O$…O…O…O…O…O…Oú„Oó„Oì„Oå„OÞ„OׄOЄOÉ„O„O»„O´„O­„O¦„OŸ„O˜„O‘„OŠ„Oƒ„O|„Ou„On„Og„O`„OY„OR„OK„OD„O=„O6„O/„O(„O!„O„O„O „O„OþƒO÷ƒOðƒOéƒOâƒOÛƒOÔƒO̓OƃO¿ƒO¸ƒO±ƒOªƒO£ƒOœƒO•ƒOŽƒO‡ƒO€ƒOyƒOrƒOkƒOdƒO]ƒOVƒOOƒOHƒOAƒO:ƒO3ƒO,ƒO%ƒOƒOƒOƒO ƒOƒOû‚Oô‚Oí‚Oæ‚Oß‚OØ‚OÑ‚OÊ‚OÂO¼‚Oµ‚O®‚O§‚O ‚O™‚O’‚O‹‚O„‚O}‚Ov‚Oo‚Oh‚Oa‚OZ‚OS‚OL‚OE‚O>‚O7‚O0‚O)‚O"‚O‚O‚O ‚O‚OÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOü€Oõ€Oî€Oç€Oà€OÙ€OÒ€OË€OÄ€O½€O¶€O¯€O¨€O¡€Oš€O“€OŒ€O…€O~€Ow€Op€Oi€Ob€O[€OT€OM€OF€O?€O8€O1€O*€O#€O€O€O€O€O€OùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOý~Oö~Oï~Oè~Oá~OÚ~OÓ~OÌ~OÅ~O¾~O·~O°~O©~O¢~O›~O”~O~O†~O~Ox~Oq~Oj~Oc~O\~OU~ON~OG~O@~O9~O2~O+~O$~O~O~O~O~O~Oú}Oó}Oì}Oå}OÞ}O×}OÐ}OÉ}OÂ}O»}O´}O­}O¦}OŸ}O˜}O‘}OŠ}Oƒ}O|}Ou}On}Og}O`}OY}OR}OK}OD}O=}O6}O/}O(}O!}O}O}O }O}Oþ|O÷|Oð|Oé|Oâ|OÛ|OÔ|OÍ|OÆ|O¿|O¸|O±|Oª|O£|Oœ|O•|OŽ|O‡|O€|Oy|Or|Ok|Od|O]|OV|OO|OH|OA|O:|O3|O,|O%|O|O|O|O |O|Oû{Oô{Oí{Oæ{Oß{OØ{OÑ{OÊ{OÃ{O¼{Oµ{O®{O§{O {O™{O’{O‹{O„{O}{Ov{Oo{Oh{Oa{OZ{OS{OL{OE{O>{O7{O0{O){O"{O{O{O {O{OÿzOøzOñzOêzOãzOÜzOÕzOÎzOÇzOÀzO¹zO²zO«zO¤zOzO–zOzOˆzOzOzzOszOlzOezO^zOWzOPzOIzOBzO;zO4zO-zO&zOzOzOzO zOzOüyOõyOîyOçyOàyOÙyOÒyOËyOÄyO½yO¶yO¯yO¨yO¡yOšyO“yOŒyO…yO~yOwyOpyOiyObyO[yOTyOMyOFyO?yO8yO1yO*yO#yOyOyOyOyOyOùxOòxOëxOäxOÝxOÖxOÏxOÈxOÁxOºxO³xO¬xO¥xOžxO—xOxO‰xO‚xO{xOtxOmxOfxO_xOXxOQxOJxOCxOtO7tO0tO)tO"tOtOtO tOtOÿsOøsOñsOêsOãsOÜsOÕsOÎsOÇsOÀsO¹sO²sO«sO¤sOsO–sOsOˆsOsOzsOssOlsOesO^sOWsOPsOIsOBsO;sO4sO-sO&sOsOsOsO sOsOürOõrOîrOçrOàrOÙrOÒrOËrOÄrO½rO¶rO¯rO¨rO¡rOšrO“rOŒrO…rO~rOwrOprOirObrO[rOTrOMrOFrO?rO8rO1rO*rO#rOrOrOrOrOrOùqOòqOëqOäqOÝqOÖqOÏqOÈqOÁqOºqO³qO¬qO¥qOžqO—qOqO‰qO‚qO{qOtqOmqOfqO_qOXqOQqOJqOCqOmO7mO0mO)mO"mOmOmO mOmOÿlOølOñlOêlOãlOÜlOÕlOÎlOÇlOÀlO¹lO²lO«lO¤lOlO–lOlOˆlOlOzlOslOllOelO^lOWlOPlOIlOBlO;lO4lO-lO&lOlOlOlO lOlOükOõkOîkOçkOàkOÙkOÒkOËkOÄkO½kO¶kO¯kO¨kO¡kOškO“kOŒkO…kO~kOwkOpkOikObkO[kOTkOMkOFkO?kO8kO1kO*kO#kOkOkOkOkOkOùjOòjOëjOäjOÝjOÖjOÏjOÈjOÁjOºjO³jO¬jO¥jOžjO—jOjO‰jO‚jO{jOtjOmjOfjO_jOXjOQjOJjOCjOfO7fO0fO)fO"fOfOfO fOfOÿeOøeOñeOêeOãeOÜeOÕeOÎeOÇeOÀeO¹eO²eO«eO¤eOeO–eOeOˆeOeOzeOseOleOeeO^eOWeOPeOIeOBeO;eO4eO-eO&eOeOeOeO eOeOüdOõdOîdOçdOàdOÙdOÒdOËdOÄdO½dO¶dO¯dO¨dO¡dOšdO“dOŒdO…dO~dOwdOpdOidObdO[dOTdOMdOFdO?dO8dO1dO*dO#dOdOdOdOdOdOùcOòcOëcOäcOÝcOÖcOÏcOÈcOÁcOºcO³cO¬cO¥cOžcO—cOcO‰cO‚cO{cOtcOmcOfcO_cOXcOQcOJcOCcO_O7_O0_O)_O"_O_O_O _O_Oÿ^Oø^Oñ^Oê^Oã^OÜ^OÕ^OÎ^OÇ^OÀ^O¹^O²^O«^O¤^O^O–^O^Oˆ^O^Oz^Os^Ol^Oe^O^^OW^OP^OI^OB^O;^O4^O-^O&^O^O^O^O ^O^Oü]Oõ]Oî]Oç]Oà]OÙ]OÒ]OË]OÄ]O½]O¶]O¯]O¨]O¡]Oš]O“]OŒ]O…]O~]Ow]Op]Oi]Ob]O[]OT]OM]OF]O?]O8]O1]O*]O#]O]O]O]O]O]Où\Oò\Oë\Oä\OÝ\OÖ\OÏ\OÈ\OÁ\Oº\O³\O¬\O¥\Ož\O—\O\O‰\O‚\O{\Ot\Om\Of\O_\OX\OQ\OJ\OC\O<\O5\O.\O'\O \O\O\O \O\Oý[Oö[Oï[Oè[Oá[OÚ[OÓ[OÌ[OÅ[O¾[O·[O°[O©[O¢[O›[O”[O[O†[O[Ox[Oq[Oj[Oc[O\[OU[ON[OG[O@[O9[O2[O+[O$[O[O[O[O[O[OúZOóZOìZOåZOÞZO×ZOÐZOÉZOÂZO»ZO´ZO­ZO¦ZOŸZO˜ZO‘ZOŠZOƒZO|ZOuZOnZOgZO`ZOYZORZOKZODZO=ZO6ZO/ZO(ZO!ZOZOZO ZOZOþYO÷YOðYOéYOâYOÛYOÔYOÍYOÆYO¿YO¸YO±YOªYO£YOœYO•YOŽYO‡YO€YOyYOrYOkYOdYO]YOVYOOYOHYOAYO:YO3YO,YO%YOYOYOYO YOYOûXOôXOíXOæXOßXOØXOÑXOÊXOÃXO¼XOµXO®XO§XO XO™XO’XO‹XO„XO}XOvXOoXOhXOaXOZXOSXOLXOEXO>XO7XO0XO)XO"XOXOXO XOXOÿWOøWOñWOêWOãWOÜWOÕWOÎWOÇWOÀWO¹WO²WO«WO¤WOWO–WOWOˆWOWOzWOsWOlWOeWO^WOWWOPWOIWOBWO;WO4WO-WO&WOWOWOWO WOWOüVOõVOîVOçVOàVOÙVOÒVOËVOÄVO½VO¶VO¯VO¨VO¡VOšVO“VOŒVO…VO~VOwVOpVOiVObVO[VOTVOMVOFVO?VO8VO1VO*VO#VOVOVOVOVOVOùUOòUOëUOäUOÝUOÖUOÏUOÈUOÁUOºUO³UO¬UO¥UOžUO—UOUO‰UO‚UO{UOtUOmUOfUO_UOXUOQUOJUOCUOQO7QO0QO)QO"QOQOQO QOQOÿPOøPOñPOêPOãPOÜPOÕPOÎPOÇPOÀPO¹PO²PO«PO¤POPO–POPOˆPOPOzPOsPOlPOePO^POWPOPPOIPOBPO;PO4PO-PO&POPOPOPO POPOüOOõOOîOOçOOàOOÙOOÒOOËOOÄOO½OO¶OO¯OO¨OO¡OOšOO“OOŒOO…OO~OOwOOpOOiOObOO[OOTOOMOOFOO?OO8OO1OO*OO#OOOOOOOOOOOOùNOòNOëNOäNOÝNOÖNOÏNOÈNOÁNOºNO³NO¬NO¥NOžNO—NONO‰NO‚NO{NOtNOmNOfNO_NOXNOQNOJNOCNOJO7JO0JO)JO"JOJOJO JOJOÿIOøIOñIOêIOãIOÜIOÕIOÎIOÇIOÀIO¹IO²IO«IO¤IOIO–IOIOˆIOIOzIOsIOlIOeIO^IOWIOPIOIIOBIO;IO4IO-IO&IOIOIOIO IOIOüHOõHOîHOçHOàHOÙHOÒHOËHOÄHO½HO¶HO¯HO¨HO¡HOšHO“HOŒHO…HO~HOwHOpHOiHObHO[HOTHOMHOFHO?HO8HO1HO*HO#HOHOHOHOHOHOùGOòGOëGOäGOÝGOÖGOÏGOÈGOÁGOºGO³GO¬GO¥GOžGO—GOGO‰GO‚GO{GOtGOmGOfGO_GOXGOQGOJGOCGOCO7CO0CO)CO"COCOCO COCOÿBOøBOñBOêBOãBOÜBOÕBOÎBOÇBOÀBO¹BO²BO«BO¤BOBO–BOBOˆBOBOzBOsBOlBOeBO^BOWBOPBOIBOBBO;BO4BO-BO&BOBOBOBO BOBOüAOõAOîAOçAOàAOÙAOÒAOËAOÄAO½AO¶AO¯AO¨AO¡AOšAO“AOŒAO…AO~AOwAOpAOiAObAO[AOTAOMAOFAO?AO8AO1AO*AO#AOAOAOAOAOAOù@Oò@Oë@Oä@OÝ@OÖ@OÏ@OÈ@OÁ@Oº@O³@O¬@O¥@Ož@O—@O@O‰@O‚@O{@Ot@Om@Of@O_@OX@OQ@OJ@OC@O<@O5@O.@O'@O @O@O@O @O@Oý?Oö?Oï?Oè?Oá?OÚ?OÓ?OÌ?OÅ?O¾?O·?O°?O©?O¢?O›?O”?O?O†?O?Ox?Oq?Oj?Oc?O\?OU?ON?OG?O@?O9?O2?O+?O$?O?O?O?O?O?Oú>Oó>Oì>Oå>OÞ>O×>OÐ>OÉ>OÂ>O»>O´>O­>O¦>OŸ>O˜>O‘>OŠ>Oƒ>O|>Ou>On>Og>O`>OY>OR>OK>OD>O=>O6>O/>O(>O!>O>O>O >O>Oþ=O÷=Oð=Oé=Oâ=OÛ=OÔ=OÍ=OÆ=O¿=O¸=O±=Oª=O£=Oœ=O•=OŽ=O‡=O€=Oy=Or=Ok=Od=O]=OV=OO=OH=OA=O:=O3=O,=O%=O=O=O=O =O=Oû5O75O05O)5O"5O5O5O 5O5Oÿ4Oø4Oñ4Oê4Oã4OÜ4OÕ4OÎ4OÇ4OÀ4O¹4O²4O«4O¤4O4O–4O4Oˆ4O4Oz4Os4Ol4Oe4O^4OW4OP4OI4OB4O;4O44O-4O&4O4O4O4O 4O4Oü3Oõ3Oî3Oç3Oà3OÙ3OÒ3OË3OÄ3O½3O¶3O¯3O¨3O¡3Oš3O“3OŒ3O…3O~3Ow3Op3Oi3Ob3O[3OT3OM3OF3O?3O83O13O*3O#3O3O3O3O3O3Où2Oò2Oë2Oä2OÝ2OÖ2OÏ2OÈ2OÁ2Oº2O³2O¬2O¥2Ož2O—2O2O‰2O‚2O{2Ot2Om2Of2O_2OX2OQ2OJ2OC2O<2O52O.2O'2O 2O2O2O 2O2Oý1Oö1Oï1Oè1Oá1OÚ1OÓ1OÌ1OÅ1O¾1O·1O°1O©1O¢1O›1O”1O1O†1O1Ox1Oq1Oj1Oc1O\1OU1ON1OG1O@1O91O21O+1O$1O1O1O1O1O1Oú0Oó0Oì0Oå0OÞ0O×0OÐ0OÉ0OÂ0O»0O´0O­0O¦0OŸ0O˜0O‘0OŠ0Oƒ0O|0Ou0On0Og0O`0OY0OR0OK0OD0O=0O60O/0O(0O!0O0O0O 0O0Oþ/O÷/Oð/Oé/Oâ/OÛ/OÔ/OÍ/OÆ/O¿/O¸/O±/Oª/O£/Oœ/O•/OŽ/O‡/O€/Oy/Or/Ok/Od/O]/OV/OO/OH/OA/O:/O3/O,/O%/O/O/O/O /O/Oû.Oô.Oí.Oæ.Oß.OØ.OÑ.OÊ.OÃ.O¼.Oµ.O®.O§.O .O™.O’.O‹.O„.O}.Ov.Oo.Oh.Oa.OZ.OS.OL.OE.O>.O7.O0.O).O".O.O.O .O.Oÿ-Oø-Oñ-Oê-Oã-OÜ-OÕ-OÎ-OÇ-OÀ-O¹-O²-O«-O¤-O-O–-O-Oˆ-O-Oz-Os-Ol-Oe-O^-OW-OP-OI-OB-O;-O4-O--O&-O-O-O-O -O-Oü,Oõ,Oî,Oç,Oà,OÙ,OÒ,OË,OÄ,O½,O¶,O¯,O¨,O¡,Oš,O“,OŒ,O…,O~,Ow,Op,Oi,Ob,O[,OT,OM,OF,O?,O8,O1,O*,O#,O,O,O,O,O,Où+Oò+Oë+Oä+OÝ+OÖ+OÏ+OÈ+OÁ+Oº+O³+O¬+O¥+Ož+O—+O+O‰+O‚+O{+Ot+Om+Of+O_+OX+OQ+OJ+OC+O<+O5+O.+O'+O +O+O+O +O+Oý*Oö*Oï*Oè*Oá*OÚ*OÓ*OÌ*OÅ*O¾*O·*O°*O©*O¢*O›*O”*O*O†*O*Ox*Oq*Oj*Oc*O\*OU*ON*OG*O@*O9*O2*O+*O$*O*O*O*O*O*Oú)Oó)Oì)Oå)OÞ)O×)OÐ)OÉ)OÂ)O»)O´)O­)O¦)OŸ)O˜)O‘)OŠ)Oƒ)O|)Ou)On)Og)O`)OY)OR)OK)OD)O=)O6)O/)O()O!)O)O)O )O)Oþ(O÷(Oð(Oé(Oâ(OÛ(OÔ(OÍ(OÆ(O¿(O¸(O±(Oª(O£(Oœ(O•(OŽ(O‡(O€(Oy(Or(Ok(Od(O](OV(OO(OH(OA(O:(O3(O,(O%(O(O(O(O (O(Oû'Oô'Oí'Oæ'Oß'OØ'OÑ'OÊ'OÃ'O¼'Oµ'O®'O§'O 'O™'O’'O‹'O„'O}'Ov'Oo'Oh'Oa'OZ'OS'OL'OE'O>'O7'O0'O)'O"'O'O'O 'O'Oÿ&Oø&Oñ&Oê&Oã&OÜ&OÕ&OÎ&OÇ&OÀ&O¹&O²&O«&O¤&O&O–&O&Oˆ&O&Oz&Os&Ol&Oe&O^&OW&OP&OI&OB&O;&O4&O-&O&&O&O&O&O &O&Oü%Oõ%Oî%Oç%Oà%OÙ%OÒ%OË%OÄ%O½%O¶%O¯%O¨%O¡%Oš%O“%OŒ%O…%O~%Ow%Op%Oi%Ob%O[%OT%OM%OF%O?%O8%O1%O*%O#%O%O%O%O%O%Où$Oò$Oë$Oä$OÝ$OÖ$OÏ$OÈ$OÁ$Oº$O³$O¬$O¥$Ož$O—$O$O‰$O‚$O{$Ot$Om$Of$O_$OX$OQ$OJ$OC$O<$O5$O.$O'$O $O$O$O $O$Oý#Oö#Oï#Oè#Oá#OÚ#OÓ#OÌ#OÅ#O¾#O·#O°#O©#O¢#O›#O”#O#O†#O#Ox#Oq#Oj#Oc#O\#OU#ON#OG#O@#O9#O2#O+#O$#O#O#O#O#O#Oú"Oó"Oì"Oå"OÞ"O×"OÐ"OÉ"OÂ"O»"O´"O­"O¦"OŸ"O˜"O‘"OŠ"Oƒ"O|"Ou"On"Og"O`"OY"OR"OK"OD"O="O6"O/"O("O!"O"O"O "O"Oþ!O÷!Oð!Oé!Oâ!OÛ!OÔ!OÍ!OÆ!O¿!O¸!O±!Oª!O£!Oœ!O•!OŽ!O‡!O€!Oy!Or!Ok!Od!O]!OV!OO!OH!OA!O:!O3!O,!O%!O!O!O!O !O!Oû Oô Oí Oæ Oß OØ OÑ OÊ Oà O¼ Oµ O® O§ O  O™ O’ O‹ O„ O} Ov Oo Oh Oa OZ OS OL OE O> O7 O0 O) O" O O O O OÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOýOöOïOèOáOÚOÓOÌOÅO¾O·O°O©O¢O›O”OO†OOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOúOóOìOåOÞO×OÐOÉOÂO»O´O­O¦OŸO˜O‘OŠOƒO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOþO÷OðOéOâOÛOÔOÍOÆO¿O¸O±OªO£OœO•OŽO‡O€OyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOûOôOíOæOßOØOÑOÊOÃO¼OµO®O§O O™O’O‹O„O}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOýOöOïOèOáOÚOÓOÌOÅO¾O·O°O©O¢O›O”OO†OOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOúOóOìOåOÞO×OÐOÉOÂO»O´O­O¦OŸO˜O‘OŠOƒO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOþO÷OðOéOâOÛOÔOÍOÆO¿O¸O±OªO£OœO•OŽO‡O€OyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOûOôOíOæOßOØOÑOÊOÃO¼OµO®O§O O™O’O‹O„O}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOýOöOïOèOáOÚOÓOÌOÅO¾O·O°O©O¢O›O”OO†OOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOú Oó Oì Oå OÞ O× OÐ OÉ O O» O´ O­ O¦ OŸ O˜ O‘ OŠ Oƒ O| Ou On Og O` OY OR OK OD O= O6 O/ O( O! O O O O Oþ O÷ Oð Oé Oâ OÛ OÔ OÍ OÆ O¿ O¸ O± Oª O£ Oœ O• OŽ O‡ O€ Oy Or Ok Od O] OV OO OH OA O: O3 O, O% O O O O O Oû Oô Oí Oæ Oß OØ OÑ OÊ Oà O¼ Oµ O® O§ O  O™ O’ O‹ O„ O} Ov Oo Oh Oa OZ OS OL OE O> O7 O0 O) O" O O O O Oÿ Oø Oñ Oê Oã OÜ OÕ OÎ OÇ OÀ O¹ O² O« O¤ O O– O Oˆ O Oz Os Ol Oe O^ OW OP OI OB O; O4 O- O& O O O O O Oü Oõ Oî Oç Oà OÙ OÒ OË OÄ O½ O¶ O¯ O¨ O¡ Oš O“ OŒ O… O~ Ow Op Oi Ob O[ OT OM OF O? O8 O1 O* O# O O O O O OùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOýOöOïOèOáOÚOÓOÌOÅO¾O·O°O©O¢O›O”OO†OOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOúOóOìOåOÞO×OÐOÉOÂO»O´O­O¦OŸO˜O‘OŠOƒO|OuOnOgO`OYOROKODO=O6O/O(O!OOO OOþO÷OðOéOâOÛOÔOÍOÆO¿O¸O±OªO£OœO•OŽO‡O€OyOrOkOdO]OVOOOHOAO:O3O,O%OOOO OOûOôOíOæOßOØOÑOÊOÃO¼OµO®O§O O™O’O‹O„O}OvOoOhOaOZOSOLOEO>O7O0O)O"OOO OOÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCO<O5O.O'O OOO OOýOöOïOèOáOÚOÓOÌOÅO¾O·O°O©O¢O›O”OO†OOxOqOjOcO\OUONOGO@O9O2O+O$OOOOOOúÿNóÿNìÿNåÿNÞÿN×ÿNÐÿNÉÿNÂÿN»ÿN´ÿN­ÿN¦ÿNŸÿN˜ÿN‘ÿNŠÿNƒÿN|ÿNuÿNnÿNgÿN`ÿNYÿNRÿNKÿNDÿN=ÿN6ÿN/ÿN(ÿN!ÿNÿNÿN ÿNÿNþþN÷þNðþNéþNâþNÛþNÔþNÍþNÆþN¿þN¸þN±þNªþN£þNœþN•þNŽþN‡þN€þNyþNrþNkþNdþN]þNVþNOþNHþNAþN:þN3þN,þN%þNþNþNþN þNþNûýNôýNíýNæýNßýNØýNÑýNÊýNÃýN¼ýNµýN®ýN§ýN ýN™ýN’ýN‹ýN„ýN}ýNvýNoýNhýNaýNZýNSýNLýNEýN>ýN7ýN0ýN)ýN"ýNýNýN ýNýNÿüNøüNñüNêüNãüNÜüNÕüNÎüNÇüNÀüN¹üN²üN«üN¤üNüN–üNüNˆüNüNzüNsüNlüNeüN^üNWüNPüNIüNBüN;üN4üN-üN&üNüNüNüN üNüNüûNõûNîûNçûNàûNÙûNÒûNËûNÄûN½ûN¶ûN¯ûN¨ûN¡ûNšûN“ûNŒûN…ûN~ûNwûNpûNiûNbûN[ûNTûNMûNFûN?ûN8ûN1ûN*ûN#ûNûNûNûNûNûNùúNòúNëúNäúNÝúNÖúNÏúNÈúNÁúNºúN³úN¬úN¥úNžúN—úNúN‰úN‚úN{úNtúNmúNfúN_úNXúNQúNJúNCúN<úN5úN.úN'úN úNúNúN úNúNýùNöùNïùNèùNáùNÚùNÓùNÌùNÅùN¾ùN·ùN°ùN©ùN¢ùN›ùN”ùNùN†ùNùNxùNqùNjùNcùN\ùNUùNNùNGùN@ùN9ùN2ùN+ùN$ùNùNùNùNùNùNúøNóøNìøNåøNÞøN×øNÐøNÉøNÂøN»øN´øN­øN¦øNŸøN˜øN‘øNŠøNƒøN|øNuøNnøNgøN`øNYøNRøNKøNDøN=øN6øN/øN(øN!øNøNøN øNøNþ÷N÷÷Nð÷Né÷Nâ÷NÛ÷NÔ÷NÍ÷NÆ÷N¿÷N¸÷N±÷Nª÷N£÷Nœ÷N•÷NŽ÷N‡÷N€÷Ny÷Nr÷Nk÷Nd÷N]÷NV÷NO÷NH÷NA÷N:÷N3÷N,÷N%÷N÷N÷N÷N ÷N÷NûöNôöNíöNæöNßöNØöNÑöNÊöNÃöN¼öNµöN®öN§öN öN™öN’öN‹öN„öN}öNvöNoöNhöNaöNZöNSöNLöNEöN>öN7öN0öN)öN"öNöNöN öNöNÿõNøõNñõNêõNãõNÜõNÕõNÎõNÇõNÀõN¹õN²õN«õN¤õNõN–õNõNˆõNõNzõNsõNlõNeõN^õNWõNPõNIõNBõN;õN4õN-õN&õNõNõNõN õNõNüôNõôNîôNçôNàôNÙôNÒôNËôNÄôN½ôN¶ôN¯ôN¨ôN¡ôNšôN“ôNŒôN…ôN~ôNwôNpôNiôNbôN[ôNTôNMôNFôN?ôN8ôN1ôN*ôN#ôNôNôNôNôNôNùóNòóNëóNäóNÝóNÖóNÏóNÈóNÁóNºóN³óN¬óN¥óNžóN—óNóN‰óN‚óN{óNtóNmóNfóN_óNXóNQóNJóNCóN<óN5óN.óN'óN óNóNóN óNóNýòNöòNïòNèòNáòNÚòNÓòNÌòNÅòN¾òN·òN°òN©òN¢òN›òN”òNòN†òNòNxòNqòNjòNcòN\òNUòNNòNGòN@òN9òN2òN+òN$òNòNòNòNòNòNúñNóñNìñNåñNÞñN×ñNÐñNÉñNÂñN»ñN´ñN­ñN¦ñNŸñN˜ñN‘ñNŠñNƒñN|ñNuñNnñNgñN`ñNYñNRñNKñNDñN=ñN6ñN/ñN(ñN!ñNñNñN ñNñNþðN÷ðNððNéðNâðNÛðNÔðNÍðNÆðN¿ðN¸ðN±ðNªðN£ðNœðN•ðNŽðN‡ðN€ðNyðNrðNkðNdðN]ðNVðNOðNHðNAðN:ðN3ðN,ðN%ðNðNðNðN ðNðNûïNôïNíïNæïNßïNØïNÑïNÊïNÃïN¼ïNµïN®ïN§ïN ïN™ïN’ïN‹ïN„ïN}ïNvïNoïNhïNaïNZïNSïNLïNEïN>ïN7ïN0ïN)ïN"ïNïNïN ïNïNÿîNøîNñîNêîNãîNÜîNÕîNÎîNÇîNÀîN¹îN²îN«îN¤îNîN–îNîNˆîNîNzîNsîNlîNeîN^îNWîNPîNIîNBîN;îN4îN-îN&îNîNîNîN îNîNüíNõíNîíNçíNàíNÙíNÒíNËíNÄíN½íN¶íN¯íN¨íN¡íNšíN“íNŒíN…íN~íNwíNpíNiíNbíN[íNTíNMíNFíN?íN8íN1íN*íN#íNíNíNíNíNíNùìNòìNëìNäìNÝìNÖìNÏìNÈìNÁìNºìN³ìN¬ìN¥ìNžìN—ìNìN‰ìN‚ìN{ìNtìNmìNfìN_ìNXìNQìNJìNCìN<ìN5ìN.ìN'ìN ìNìNìN ìNìNýëNöëNïëNèëNáëNÚëNÓëNÌëNÅëN¾ëN·ëN°ëN©ëN¢ëN›ëN”ëNëN†ëNëNxëNqëNjëNcëN\ëNUëNNëNGëN@ëN9ëN2ëN+ëN$ëNëNëNëNëNëNúêNóêNìêNåêNÞêN×êNÐêNÉêNÂêN»êN´êN­êN¦êNŸêN˜êN‘êNŠêNƒêN|êNuêNnêNgêN`êNYêNRêNKêNDêN=êN6êN/êN(êN!êNêNêN êNêNþéN÷éNðéNééNâéNÛéNÔéNÍéNÆéN¿éN¸éN±éNªéN£éNœéN•éNŽéN‡éN€éNyéNréNkéNdéN]éNVéNOéNHéNAéN:éN3éN,éN%éNéNéNéN éNéNûèNôèNíèNæèNßèNØèNÑèNÊèNÃèN¼èNµèN®èN§èN èN™èN’èN‹èN„èN}èNvèNoèNhèNaèNZèNSèNLèNEèN>èN7èN0èN)èN"èNèNèN èNèNÿçNøçNñçNêçNãçNÜçNÕçNÎçNÇçNÀçN¹çN²çN«çN¤çNçN–çNçNˆçNçNzçNsçNlçNeçN^çNWçNPçNIçNBçN;çN4çN-çN&çNçNçNçN çNçNüæNõæNîæNçæNàæNÙæNÒæNËæNÄæN½æN¶æN¯æN¨æN¡æNšæN“æNŒæN…æN~æNwæNpæNiæNbæN[æNTæNMæNFæN?æN8æN1æN*æN#æNæNæNæNæNæNùåNòåNëåNäåNÝåNÖåNÏåNÈåNÁåNºåN³åN¬åN¥åNžåN—åNåN‰åN‚åN{åNtåNmåNfåN_åNXåNQåNJåNCåN<åN5åN.åN'åN åNåNåN åNåNýäNöäNïäNèäNáäNÚäNÓäNÌäNÅäN¾äN·äN°äN©äN¢äN›äN”äNäN†äNäNxäNqäNjäNcäN\äNUäNNäNGäN@äN9äN2äN+äN$äNäNäNäNäNäNúãNóãNìãNåãNÞãN×ãNÐãNÉãNÂãN»ãN´ãN­ãN¦ãNŸãN˜ãN‘ãNŠãNƒãN|ãNuãNnãNgãN`ãNYãNRãNKãNDãN=ãN6ãN/ãN(ãN!ãNãNãN ãNãNþâN÷âNðâNéâNââNÛâNÔâNÍâNÆâN¿âN¸âN±âNªâN£âNœâN•âNŽâN‡âN€âNyâNrâNkâNdâN]âNVâNOâNHâNAâN:âN3âN,âN%âNâNâNâN âNâNûáNôáNíáNæáNßáNØáNÑáNÊáNÃáN¼áNµáN®áN§áN áN™áN’áN‹áN„áN}áNváNoáNháNaáNZáNSáNLáNEáN>áN7áN0áN)áN"áNáNáN áNáNÿàNøàNñàNêàNãàNÜàNÕàNÎàNÇàNÀàN¹àN²àN«àN¤àNàN–àNàNˆàNàNzàNsàNlàNeàN^àNWàNPàNIàNBàN;àN4àN-àN&àNàNàNàN àNàNüßNõßNîßNçßNàßNÙßNÒßNËßNÄßN½ßN¶ßN¯ßN¨ßN¡ßNšßN“ßNŒßN…ßN~ßNwßNpßNißNbßN[ßNTßNMßNFßN?ßN8ßN1ßN*ßN#ßNßNßNßNßNßNùÞNòÞNëÞNäÞNÝÞNÖÞNÏÞNÈÞNÁÞNºÞN³ÞN¬ÞN¥ÞNžÞN—ÞNÞN‰ÞN‚ÞN{ÞNtÞNmÞNfÞN_ÞNXÞNQÞNJÞNCÞN<ÞN5ÞN.ÞN'ÞN ÞNÞNÞN ÞNÞNýÝNöÝNïÝNèÝNáÝNÚÝNÓÝNÌÝNÅÝN¾ÝN·ÝN°ÝN©ÝN¢ÝN›ÝN”ÝNÝN†ÝNÝNxÝNqÝNjÝNcÝN\ÝNUÝNNÝNGÝN@ÝN9ÝN2ÝN+ÝN$ÝNÝNÝNÝNÝNÝNúÜNóÜNìÜNåÜNÞÜN×ÜNÐÜNÉÜNÂÜN»ÜN´ÜN­ÜN¦ÜNŸÜN˜ÜN‘ÜNŠÜNƒÜN|ÜNuÜNnÜNgÜN`ÜNYÜNRÜNKÜNDÜN=ÜN6ÜN/ÜN(ÜN!ÜNÜNÜN ÜNÜNþÛN÷ÛNðÛNéÛNâÛNÛÛNÔÛNÍÛNÆÛN¿ÛN¸ÛN±ÛNªÛN£ÛNœÛN•ÛNŽÛN‡ÛN€ÛNyÛNrÛNkÛNdÛN]ÛNVÛNOÛNHÛNAÛN:ÛN3ÛN,ÛN%ÛNÛNÛNÛN ÛNÛNûÚNôÚNíÚNæÚNßÚNØÚNÑÚNÊÚNÃÚN¼ÚNµÚN®ÚN§ÚN ÚN™ÚN’ÚN‹ÚN„ÚN}ÚNvÚNoÚNhÚNaÚNZÚNSÚNLÚNEÚN>ÚN7ÚN0ÚN)ÚN"ÚNÚNÚN ÚNÚNÿÙNøÙNñÙNêÙNãÙNÜÙNÕÙNÎÙNÇÙNÀÙN¹ÙN²ÙN«ÙN¤ÙNÙN–ÙNÙNˆÙNÙNzÙNsÙNlÙNeÙN^ÙNWÙNPÙNIÙNBÙN;ÙN4ÙN-ÙN&ÙNÙNÙNÙN ÙNÙNüØNõØNîØNçØNàØNÙØNÒØNËØNÄØN½ØN¶ØN¯ØN¨ØN¡ØNšØN“ØNŒØN…ØN~ØNwØNpØNiØNbØN[ØNTØNMØNFØN?ØN8ØN1ØN*ØN#ØNØNØNØNØNØNù×Nò×Në×Nä×NÝ×NÖ×NÏ×NÈ×NÁ×Nº×N³×N¬×N¥×Nž×N—×N×N‰×N‚×N{×Nt×Nm×Nf×N_×NX×NQ×NJ×NC×N<×N5×N.×N'×N ×N×N×N ×N×NýÖNöÖNïÖNèÖNáÖNÚÖNÓÖNÌÖNÅÖN¾ÖN·ÖN°ÖN©ÖN¢ÖN›ÖN”ÖNÖN†ÖNÖNxÖNqÖNjÖNcÖN\ÖNUÖNNÖNGÖN@ÖN9ÖN2ÖN+ÖN$ÖNÖNÖNÖNÖNÖNúÕNóÕNìÕNåÕNÞÕN×ÕNÐÕNÉÕNÂÕN»ÕN´ÕN­ÕN¦ÕNŸÕN˜ÕN‘ÕNŠÕNƒÕN|ÕNuÕNnÕNgÕN`ÕNYÕNRÕNKÕNDÕN=ÕN6ÕN/ÕN(ÕN!ÕNÕNÕN ÕNÕNþÔN÷ÔNðÔNéÔNâÔNÛÔNÔÔNÍÔNÆÔN¿ÔN¸ÔN±ÔNªÔN£ÔNœÔN•ÔNŽÔN‡ÔN€ÔNyÔNrÔNkÔNdÔN]ÔNVÔNOÔNHÔNAÔN:ÔN3ÔN,ÔN%ÔNÔNÔNÔN ÔNÔNûÓNôÓNíÓNæÓNßÓNØÓNÑÓNÊÓNÃÓN¼ÓNµÓN®ÓN§ÓN ÓN™ÓN’ÓN‹ÓN„ÓN}ÓNvÓNoÓNhÓNaÓNZÓNSÓNLÓNEÓN>ÓN7ÓN0ÓN)ÓN"ÓNÓNÓN ÓNÓNÿÒNøÒNñÒNêÒNãÒNÜÒNÕÒNÎÒNÇÒNÀÒN¹ÒN²ÒN«ÒN¤ÒNÒN–ÒNÒNˆÒNÒNzÒNsÒNlÒNeÒN^ÒNWÒNPÒNIÒNBÒN;ÒN4ÒN-ÒN&ÒNÒNÒNÒN ÒNÒNüÑNõÑNîÑNçÑNàÑNÙÑNÒÑNËÑNÄÑN½ÑN¶ÑN¯ÑN¨ÑN¡ÑNšÑN“ÑNŒÑN…ÑN~ÑNwÑNpÑNiÑNbÑN[ÑNTÑNMÑNFÑN?ÑN8ÑN1ÑN*ÑN#ÑNÑNÑNÑNÑNÑNùÐNòÐNëÐNäÐNÝÐNÖÐNÏÐNÈÐNÁÐNºÐN³ÐN¬ÐN¥ÐNžÐN—ÐNÐN‰ÐN‚ÐN{ÐNtÐNmÐNfÐN_ÐNXÐNQÐNJÐNCÐN<ÐN5ÐN.ÐN'ÐN ÐNÐNÐN ÐNÐNýÏNöÏNïÏNèÏNáÏNÚÏNÓÏNÌÏNÅÏN¾ÏN·ÏN°ÏN©ÏN¢ÏN›ÏN”ÏNÏN†ÏNÏNxÏNqÏNjÏNcÏN\ÏNUÏNNÏNGÏN@ÏN9ÏN2ÏN+ÏN$ÏNÏNÏNÏNÏNÏNúÎNóÎNìÎNåÎNÞÎN×ÎNÐÎNÉÎNÂÎN»ÎN´ÎN­ÎN¦ÎNŸÎN˜ÎN‘ÎNŠÎNƒÎN|ÎNuÎNnÎNgÎN`ÎNYÎNRÎNKÎNDÎN=ÎN6ÎN/ÎN(ÎN!ÎNÎNÎN ÎNÎNþÍN÷ÍNðÍNéÍNâÍNÛÍNÔÍNÍÍNÆÍN¿ÍN¸ÍN±ÍNªÍN£ÍNœÍN•ÍNŽÍN‡ÍN€ÍNyÍNrÍNkÍNdÍN]ÍNVÍNOÍNHÍNAÍN:ÍN3ÍN,ÍN%ÍNÍNÍNÍN ÍNÍNûÌNôÌNíÌNæÌNßÌNØÌNÑÌNÊÌNÃÌN¼ÌNµÌN®ÌN§ÌN ÌN™ÌN’ÌN‹ÌN„ÌN}ÌNvÌNoÌNhÌNaÌNZÌNSÌNLÌNEÌN>ÌN7ÌN0ÌN)ÌN"ÌNÌNÌN ÌNÌNÿËNøËNñËNêËNãËNÜËNÕËNÎËNÇËNÀËN¹ËN²ËN«ËN¤ËNËN–ËNËNˆËNËNzËNsËNlËNeËN^ËNWËNPËNIËNBËN;ËN4ËN-ËN&ËNËNËNËN ËNËNüÊNõÊNîÊNçÊNàÊNÙÊNÒÊNËÊNÄÊN½ÊN¶ÊN¯ÊN¨ÊN¡ÊNšÊN“ÊNŒÊN…ÊN~ÊNwÊNpÊNiÊNbÊN[ÊNTÊNMÊNFÊN?ÊN8ÊN1ÊN*ÊN#ÊNÊNÊNÊNÊNÊNùÉNòÉNëÉNäÉNÝÉNÖÉNÏÉNÈÉNÁÉNºÉN³ÉN¬ÉN¥ÉNžÉN—ÉNÉN‰ÉN‚ÉN{ÉNtÉNmÉNfÉN_ÉNXÉNQÉNJÉNCÉN<ÉN5ÉN.ÉN'ÉN ÉNÉNÉN ÉNÉNýÈNöÈNïÈNèÈNáÈNÚÈNÓÈNÌÈNÅÈN¾ÈN·ÈN°ÈN©ÈN¢ÈN›ÈN”ÈNÈN†ÈNÈNxÈNqÈNjÈNcÈN\ÈNUÈNNÈNGÈN@ÈN9ÈN2ÈN+ÈN$ÈNÈNÈNÈNÈNÈNúÇNóÇNìÇNåÇNÞÇN×ÇNÐÇNÉÇNÂÇN»ÇN´ÇN­ÇN¦ÇNŸÇN˜ÇN‘ÇNŠÇNƒÇN|ÇNuÇNnÇNgÇN`ÇNYÇNRÇNKÇNDÇN=ÇN6ÇN/ÇN(ÇN!ÇNÇNÇN ÇNÇNþÆN÷ÆNðÆNéÆNâÆNÛÆNÔÆNÍÆNÆÆN¿ÆN¸ÆN±ÆNªÆN£ÆNœÆN•ÆNŽÆN‡ÆN€ÆNyÆNrÆNkÆNdÆN]ÆNVÆNOÆNHÆNAÆN:ÆN3ÆN,ÆN%ÆNÆNÆNÆN ÆNÆNûÅNôÅNíÅNæÅNßÅNØÅNÑÅNÊÅNÃÅN¼ÅNµÅN®ÅN§ÅN ÅN™ÅN’ÅN‹ÅN„ÅN}ÅNvÅNoÅNhÅNaÅNZÅNSÅNLÅNEÅN>ÅN7ÅN0ÅN)ÅN"ÅNÅNÅN ÅNÅNÿÄNøÄNñÄNêÄNãÄNÜÄNÕÄNÎÄNÇÄNÀÄN¹ÄN²ÄN«ÄN¤ÄNÄN–ÄNÄNˆÄNÄNzÄNsÄNlÄNeÄN^ÄNWÄNPÄNIÄNBÄN;ÄN4ÄN-ÄN&ÄNÄNÄNÄN ÄNÄNüÃNõÃNîÃNçÃNàÃNÙÃNÒÃNËÃNÄÃN½ÃN¶ÃN¯ÃN¨ÃN¡ÃNšÃN“ÃNŒÃN…ÃN~ÃNwÃNpÃNiÃNbÃN[ÃNTÃNMÃNFÃN?ÃN8ÃN1ÃN*ÃN#ÃNÃNÃNÃNÃNÃNùÂNòÂNëÂNäÂNÝÂNÖÂNÏÂNÈÂNÁÂNºÂN³ÂN¬ÂN¥ÂNžÂN—ÂNÂN‰ÂN‚ÂN{ÂNtÂNmÂNfÂN_ÂNXÂNQÂNJÂNCÂN<ÂN5ÂN.ÂN'ÂN ÂNÂNÂN ÂNÂNýÁNöÁNïÁNèÁNáÁNÚÁNÓÁNÌÁNÅÁN¾ÁN·ÁN°ÁN©ÁN¢ÁN›ÁN”ÁNÁN†ÁNÁNxÁNqÁNjÁNcÁN\ÁNUÁNNÁNGÁN@ÁN9ÁN2ÁN+ÁN$ÁNÁNÁNÁNÁNÁNúÀNóÀNìÀNåÀNÞÀN×ÀNÐÀNÉÀNÂÀN»ÀN´ÀN­ÀN¦ÀNŸÀN˜ÀN‘ÀNŠÀNƒÀN|ÀNuÀNnÀNgÀN`ÀNYÀNRÀNKÀNDÀN=ÀN6ÀN/ÀN(ÀN!ÀNÀNÀN ÀNÀNþ¿N÷¿Nð¿Né¿Nâ¿NÛ¿NÔ¿NÍ¿NÆ¿N¿¿N¸¿N±¿Nª¿N£¿Nœ¿N•¿NŽ¿N‡¿N€¿Ny¿Nr¿Nk¿Nd¿N]¿NV¿NO¿NH¿NA¿N:¿N3¿N,¿N%¿N¿N¿N¿N ¿N¿Nû¾Nô¾Ní¾Næ¾Nß¾NؾNѾNʾNþN¼¾Nµ¾N®¾N§¾N ¾N™¾N’¾N‹¾N„¾N}¾Nv¾No¾Nh¾Na¾NZ¾NS¾NL¾NE¾N>¾N7¾N0¾N)¾N"¾N¾N¾N ¾N¾Nÿ½Nø½Nñ½Nê½Nã½NܽNÕ½NνNǽNÀ½N¹½N²½N«½N¤½N½N–½N½Nˆ½N½Nz½Ns½Nl½Ne½N^½NW½NP½NI½NB½N;½N4½N-½N&½N½N½N½N ½N½Nü¼Nõ¼Nî¼Nç¼Nà¼NÙ¼NÒ¼N˼NļN½¼N¶¼N¯¼N¨¼N¡¼Nš¼N“¼NŒ¼N…¼N~¼Nw¼Np¼Ni¼Nb¼N[¼NT¼NM¼NF¼N?¼N8¼N1¼N*¼N#¼N¼N¼N¼N¼N¼Nù»Nò»Në»Nä»NÝ»NÖ»NÏ»NÈ»NÁ»Nº»N³»N¬»N¥»Nž»N—»N»N‰»N‚»N{»Nt»Nm»Nf»N_»NX»NQ»NJ»NC»N<»N5»N.»N'»N »N»N»N »N»NýºNöºNïºNèºNáºNÚºNÓºN̺NźN¾ºN·ºN°ºN©ºN¢ºN›ºN”ºNºN†ºNºNxºNqºNjºNcºN\ºNUºNNºNGºN@ºN9ºN2ºN+ºN$ºNºNºNºNºNºNú¹Nó¹Nì¹Nå¹NÞ¹N×¹NйNɹN¹N»¹N´¹N­¹N¦¹NŸ¹N˜¹N‘¹NйNƒ¹N|¹Nu¹Nn¹Ng¹N`¹NY¹NR¹NK¹ND¹N=¹N6¹N/¹N(¹N!¹N¹N¹N ¹N¹Nþ¸N÷¸Nð¸Né¸Nâ¸NÛ¸NÔ¸N͸NƸN¿¸N¸¸N±¸Nª¸N£¸Nœ¸N•¸NޏN‡¸N€¸Ny¸Nr¸Nk¸Nd¸N]¸NV¸NO¸NH¸NA¸N:¸N3¸N,¸N%¸N¸N¸N¸N ¸N¸Nû·Nô·Ní·Næ·Nß·NØ·NÑ·NÊ·N÷N¼·Nµ·N®·N§·N ·N™·N’·N‹·N„·N}·Nv·No·Nh·Na·NZ·NS·NL·NE·N>·N7·N0·N)·N"·N·N·N ·N·Nÿ¶Nø¶Nñ¶Nê¶Nã¶NܶNÕ¶NζNǶNÀ¶N¹¶N²¶N«¶N¤¶N¶N–¶N¶Nˆ¶N¶Nz¶Ns¶Nl¶Ne¶N^¶NW¶NP¶NI¶NB¶N;¶N4¶N-¶N&¶N¶N¶N¶N ¶N¶NüµNõµNîµNçµNàµNÙµNÒµN˵NĵN½µN¶µN¯µN¨µN¡µNšµN“µNŒµN…µN~µNwµNpµNiµNbµN[µNTµNMµNFµN?µN8µN1µN*µN#µNµNµNµNµNµNù´Nò´Në´Nä´NÝ´NÖ´NÏ´NÈ´NÁ´Nº´N³´N¬´N¥´Nž´N—´N´N‰´N‚´N{´Nt´Nm´Nf´N_´NX´NQ´NJ´NC´N<´N5´N.´N'´N ´N´N´N ´N´Ný³Nö³Nï³Nè³Ná³NÚ³NÓ³N̳NųN¾³N·³N°³N©³N¢³N›³N”³N³N†³N³Nx³Nq³Nj³Nc³N\³NU³NN³NG³N@³N9³N2³N+³N$³N³N³N³N³N³Nú²Nó²Nì²Nå²NÞ²NײNвNɲN²N»²N´²N­²N¦²NŸ²N˜²N‘²NвNƒ²N|²Nu²Nn²Ng²N`²NY²NR²NK²ND²N=²N6²N/²N(²N!²N²N²N ²N²Nþ±N÷±Nð±Né±Nâ±NÛ±NÔ±NͱNƱN¿±N¸±N±±Nª±N£±Nœ±N•±NޱN‡±N€±Ny±Nr±Nk±Nd±N]±NV±NO±NH±NA±N:±N3±N,±N%±N±N±N±N ±N±Nû°Nô°Ní°Næ°Nß°NذNѰNʰNðN¼°Nµ°N®°N§°N °N™°N’°N‹°N„°N}°Nv°No°Nh°Na°NZ°NS°NL°NE°N>°N7°N0°N)°N"°N°N°N °N°Nÿ¯Nø¯Nñ¯Nê¯Nã¯NܯNÕ¯NίNǯNÀ¯N¹¯N²¯N«¯N¤¯N¯N–¯N¯Nˆ¯N¯Nz¯Ns¯Nl¯Ne¯N^¯NW¯NP¯NI¯NB¯N;¯N4¯N-¯N&¯N¯N¯N¯N ¯N¯Nü®Nõ®Nî®Nç®Nà®NÙ®NÒ®NË®NÄ®N½®N¶®N¯®N¨®N¡®Nš®N“®NŒ®N…®N~®Nw®Np®Ni®Nb®N[®NT®NM®NF®N?®N8®N1®N*®N#®N®N®N®N®N®Nù­Nò­Në­Nä­NÝ­NÖ­NÏ­NÈ­NÁ­Nº­N³­N¬­N¥­Nž­N—­N­N‰­N‚­N{­Nt­Nm­Nf­N_­NX­NQ­NJ­NC­N<­N5­N.­N'­N ­N­N­N ­N­Ný¬Nö¬Nï¬Nè¬Ná¬NÚ¬NÓ¬N̬NŬN¾¬N·¬N°¬N©¬N¢¬N›¬N”¬N¬N†¬N¬Nx¬Nq¬Nj¬Nc¬N\¬NU¬NN¬NG¬N@¬N9¬N2¬N+¬N$¬N¬N¬N¬N¬N¬Nú«Nó«Nì«Nå«NÞ«N׫NЫNÉ«N«N»«N´«N­«N¦«NŸ«N˜«N‘«NŠ«Nƒ«N|«Nu«Nn«Ng«N`«NY«NR«NK«ND«N=«N6«N/«N(«N!«N«N«N «N«NþªN÷ªNðªNéªNâªNÛªNÔªNͪNƪN¿ªN¸ªN±ªNªªN£ªNœªN•ªNŽªN‡ªN€ªNyªNrªNkªNdªN]ªNVªNOªNHªNAªN:ªN3ªN,ªN%ªNªNªNªN ªNªNû©Nô©Ní©Næ©Nß©NØ©NÑ©NÊ©NéN¼©Nµ©N®©N§©N ©N™©N’©N‹©N„©N}©Nv©No©Nh©Na©NZ©NS©NL©NE©N>©N7©N0©N)©N"©N©N©N ©N©Nÿ¨Nø¨Nñ¨Nê¨Nã¨NܨNÕ¨NΨNǨNÀ¨N¹¨N²¨N«¨N¤¨N¨N–¨N¨Nˆ¨N¨Nz¨Ns¨Nl¨Ne¨N^¨NW¨NP¨NI¨NB¨N;¨N4¨N-¨N&¨N¨N¨N¨N ¨N¨Nü§Nõ§Nî§Nç§Nà§NÙ§NÒ§N˧NħN½§N¶§N¯§N¨§N¡§Nš§N“§NŒ§N…§N~§Nw§Np§Ni§Nb§N[§NT§NM§NF§N?§N8§N1§N*§N#§N§N§N§N§N§Nù¦Nò¦Në¦Nä¦NݦNÖ¦NϦNȦNÁ¦Nº¦N³¦N¬¦N¥¦Nž¦N—¦N¦N‰¦N‚¦N{¦Nt¦Nm¦Nf¦N_¦NX¦NQ¦NJ¦NC¦N<¦N5¦N.¦N'¦N ¦N¦N¦N ¦N¦Ný¥Nö¥Nï¥Nè¥Ná¥NÚ¥NÓ¥NÌ¥NÅ¥N¾¥N·¥N°¥N©¥N¢¥N›¥N”¥N¥N†¥N¥Nx¥Nq¥Nj¥Nc¥N\¥NU¥NN¥NG¥N@¥N9¥N2¥N+¥N$¥N¥N¥N¥N¥N¥Nú¤Nó¤Nì¤Nå¤NÞ¤NפNФNɤN¤N»¤N´¤N­¤N¦¤NŸ¤N˜¤N‘¤NФNƒ¤N|¤Nu¤Nn¤Ng¤N`¤NY¤NR¤NK¤ND¤N=¤N6¤N/¤N(¤N!¤N¤N¤N ¤N¤Nþ£N÷£Nð£Né£Nâ£NÛ£NÔ£NÍ£NÆ£N¿£N¸£N±£Nª£N££Nœ£N•£NŽ£N‡£N€£Ny£Nr£Nk£Nd£N]£NV£NO£NH£NA£N:£N3£N,£N%£N£N£N£N £N£Nû¢Nô¢Ní¢Næ¢NߢNØ¢NÑ¢NÊ¢NâN¼¢Nµ¢N®¢N§¢N ¢N™¢N’¢N‹¢N„¢N}¢Nv¢No¢Nh¢Na¢NZ¢NS¢NL¢NE¢N>¢N7¢N0¢N)¢N"¢N¢N¢N ¢N¢Nÿ¡Nø¡Nñ¡Nê¡Nã¡NÜ¡NÕ¡NΡNÇ¡NÀ¡N¹¡N²¡N«¡N¤¡N¡N–¡N¡Nˆ¡N¡Nz¡Ns¡Nl¡Ne¡N^¡NW¡NP¡NI¡NB¡N;¡N4¡N-¡N&¡N¡N¡N¡N ¡N¡Nü Nõ Nî Nç Nà NÙ NÒ NË NÄ N½ N¶ N¯ N¨ N¡ Nš N“ NŒ N… N~ Nw Np Ni Nb N[ NT NM NF N? N8 N1 N* N# N N N N N NùŸNòŸNëŸNäŸNÝŸNÖŸNÏŸNÈŸNÁŸNºŸN³ŸN¬ŸN¥ŸNžŸN—ŸNŸN‰ŸN‚ŸN{ŸNtŸNmŸNfŸN_ŸNXŸNQŸNJŸNCŸN<ŸN5ŸN.ŸN'ŸN ŸNŸNŸN ŸNŸNýžNöžNïžNèžNážNÚžNÓžNÌžNÅžN¾žN·žN°žN©žN¢žN›žN”žNžN†žNžNxžNqžNjžNcžN\žNUžNNžNGžN@žN9žN2žN+žN$žNžNžNžNžNžNúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþœN÷œNðœNéœNâœNÛœNÔœNÍœNÆœN¿œN¸œN±œNªœN£œNœœN•œNŽœN‡œN€œNyœNrœNkœNdœN]œNVœNOœNHœNAœN:œN3œN,œN%œNœNœNœN œNœNû›Nô›Ní›Næ›Nß›NØ›NÑ›NÊ›NÛN¼›Nµ›N®›N§›N ›N™›N’›N‹›N„›N}›Nv›No›Nh›Na›NZ›NS›NL›NE›N>›N7›N0›N)›N"›N›N›N ›N›NÿšNøšNñšNêšNãšNÜšNÕšNΚNÇšNÀšN¹šN²šN«šN¤šNšN–šNšNˆšNšNzšNsšNlšNešN^šNWšNPšNIšNBšN;šN4šN-šN&šNšNšNšN šNšNü™Nõ™Nî™Nç™Nà™NÙ™NÒ™NË™NÄ™N½™N¶™N¯™N¨™N¡™Nš™N“™NŒ™N…™N~™Nw™Np™Ni™Nb™N[™NT™NM™NF™N?™N8™N1™N*™N#™N™N™N™N™N™Nù˜Nò˜Në˜Nä˜NݘNÖ˜NϘNȘNÁ˜Nº˜N³˜N¬˜N¥˜Nž˜N—˜N˜N‰˜N‚˜N{˜Nt˜Nm˜Nf˜N_˜NX˜NQ˜NJ˜NC˜N<˜N5˜N.˜N'˜N ˜N˜N˜N ˜N˜Ný—Nö—Nï—Nè—Ná—NÚ—NÓ—NÌ—NÅ—N¾—N·—N°—N©—N¢—N›—N”—N—N†—N—Nx—Nq—Nj—Nc—N\—NU—NN—NG—N@—N9—N2—N+—N$—N—N—N—N—N—Nú–Nó–Nì–Nå–NÞ–N×–NЖNÉ–N–N»–N´–N­–N¦–NŸ–N˜–N‘–NŠ–Nƒ–N|–Nu–Nn–Ng–N`–NY–NR–NK–ND–N=–N6–N/–N(–N!–N–N–N –N–Nþ•N÷•Nð•Né•Nâ•NÛ•NÔ•NÍ•NÆ•N¿•N¸•N±•Nª•N£•Nœ•N••NŽ•N‡•N€•Ny•Nr•Nk•Nd•N]•NV•NO•NH•NA•N:•N3•N,•N%•N•N•N•N •N•Nû”Nô”Ní”Næ”Nß”NØ”NÑ”NÊ”NÔN¼”Nµ”N®”N§”N ”N™”N’”N‹”N„”N}”Nv”No”Nh”Na”NZ”NS”NL”NE”N>”N7”N0”N)”N"”N”N”N ”N”Nÿ“Nø“Nñ“Nê“Nã“NÜ“NÕ“NΓNÇ“NÀ“N¹“N²“N«“N¤“N“N–“N“Nˆ“N“Nz“Ns“Nl“Ne“N^“NW“NP“NI“NB“N;“N4“N-“N&“N“N“N“N “N“Nü’Nõ’Nî’Nç’Nà’NÙ’NÒ’NË’NÄ’N½’N¶’N¯’N¨’N¡’Nš’N“’NŒ’N…’N~’Nw’Np’Ni’Nb’N[’NT’NM’NF’N?’N8’N1’N*’N#’N’N’N’N’N’Nù‘Nò‘Në‘Nä‘NÝ‘NÖ‘NÏ‘NÈ‘NÁ‘Nº‘N³‘N¬‘N¥‘Nž‘N—‘N‘N‰‘N‚‘N{‘Nt‘Nm‘Nf‘N_‘NX‘NQ‘NJ‘NC‘N<‘N5‘N.‘N'‘N ‘N‘N‘N ‘N‘NýNöNïNèNáNÚNÓNÌNÅN¾N·N°N©N¢N›N”NN†NNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþŽN÷ŽNðŽNéŽNâŽNÛŽNÔŽNÍŽNÆŽN¿ŽN¸ŽN±ŽNªŽN£ŽNœŽN•ŽNŽŽN‡ŽN€ŽNyŽNrŽNkŽNdŽN]ŽNVŽNOŽNHŽNAŽN:ŽN3ŽN,ŽN%ŽNŽNŽNŽN ŽNŽNûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿŒNøŒNñŒNêŒNãŒNÜŒNÕŒNÎŒNÇŒNÀŒN¹ŒN²ŒN«ŒN¤ŒNŒN–ŒNŒNˆŒNŒNzŒNsŒNlŒNeŒN^ŒNWŒNPŒNIŒNBŒN;ŒN4ŒN-ŒN&ŒNŒNŒNŒN ŒNŒNü‹Nõ‹Nî‹Nç‹Nà‹NÙ‹NÒ‹NË‹NÄ‹N½‹N¶‹N¯‹N¨‹N¡‹Nš‹N“‹NŒ‹N…‹N~‹Nw‹Np‹Ni‹Nb‹N[‹NT‹NM‹NF‹N?‹N8‹N1‹N*‹N#‹N‹N‹N‹N‹N‹NùŠNòŠNëŠNäŠNÝŠNÖŠNÏŠNÈŠNÁŠNºŠN³ŠN¬ŠN¥ŠNžŠN—ŠNŠN‰ŠN‚ŠN{ŠNtŠNmŠNfŠN_ŠNXŠNQŠNJŠNCŠN<ŠN5ŠN.ŠN'ŠN ŠNŠNŠN ŠNŠNý‰Nö‰Nï‰Nè‰Ná‰NÚ‰NÓ‰N̉NʼnN¾‰N·‰N°‰N©‰N¢‰N›‰N”‰N‰N†‰N‰Nx‰Nq‰Nj‰Nc‰N\‰NU‰NN‰NG‰N@‰N9‰N2‰N+‰N$‰N‰N‰N‰N‰N‰NúˆNóˆNìˆNåˆNÞˆN׈NЈNɈNˆN»ˆN´ˆN­ˆN¦ˆNŸˆN˜ˆN‘ˆNŠˆNƒˆN|ˆNuˆNnˆNgˆN`ˆNYˆNRˆNKˆNDˆN=ˆN6ˆN/ˆN(ˆN!ˆNˆNˆN ˆNˆNþ‡N÷‡Nð‡Né‡Nâ‡NÛ‡NÔ‡N͇NƇN¿‡N¸‡N±‡Nª‡N£‡Nœ‡N•‡NއN‡‡N€‡Ny‡Nr‡Nk‡Nd‡N]‡NV‡NO‡NH‡NA‡N:‡N3‡N,‡N%‡N‡N‡N‡N ‡N‡Nû†Nô†Ní†Næ†N߆N؆NцNʆNÆN¼†Nµ†N®†N§†N †N™†N’†N‹†N„†N}†Nv†No†Nh†Na†NZ†NS†NL†NE†N>†N7†N0†N)†N"†N†N†N †N†Nÿ…Nø…Nñ…Nê…Nã…NÜ…NÕ…NÎ…NÇ…NÀ…N¹…N²…N«…N¤…N…N–…N…Nˆ…N…Nz…Ns…Nl…Ne…N^…NW…NP…NI…NB…N;…N4…N-…N&…N…N…N…N …N…Nü„Nõ„Nî„Nç„Nà„NÙ„NÒ„NË„NÄ„N½„N¶„N¯„N¨„N¡„Nš„N“„NŒ„N…„N~„Nw„Np„Ni„Nb„N[„NT„NM„NF„N?„N8„N1„N*„N#„N„N„N„N„N„NùƒNòƒNëƒNäƒN݃NÖƒNσNȃNÁƒNºƒN³ƒN¬ƒN¥ƒNžƒN—ƒNƒN‰ƒN‚ƒN{ƒNtƒNmƒNfƒN_ƒNXƒNQƒNJƒNCƒN<ƒN5ƒN.ƒN'ƒN ƒNƒNƒN ƒNƒNý‚Nö‚Nï‚Nè‚Ná‚NÚ‚NÓ‚NÌ‚NÅ‚N¾‚N·‚N°‚N©‚N¢‚N›‚N”‚N‚N†‚N‚Nx‚Nq‚Nj‚Nc‚N\‚NU‚NN‚NG‚N@‚N9‚N2‚N+‚N$‚N‚N‚N‚N‚N‚NúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþ€N÷€Nð€Né€Nâ€NÛ€NÔ€NÍ€NÆ€N¿€N¸€N±€Nª€N£€Nœ€N•€NŽ€N‡€N€€Ny€Nr€Nk€Nd€N]€NV€NO€NH€NA€N:€N3€N,€N%€N€N€N€N €N€NûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿ~Nø~Nñ~Nê~Nã~NÜ~NÕ~NÎ~NÇ~NÀ~N¹~N²~N«~N¤~N~N–~N~Nˆ~N~Nz~Ns~Nl~Ne~N^~NW~NP~NI~NB~N;~N4~N-~N&~N~N~N~N ~N~Nü}Nõ}Nî}Nç}Nà}NÙ}NÒ}NË}NÄ}N½}N¶}N¯}N¨}N¡}Nš}N“}NŒ}N…}N~}Nw}Np}Ni}Nb}N[}NT}NM}NF}N?}N8}N1}N*}N#}N}N}N}N}N}Nù|Nò|Në|Nä|NÝ|NÖ|NÏ|NÈ|NÁ|Nº|N³|N¬|N¥|Nž|N—|N|N‰|N‚|N{|Nt|Nm|Nf|N_|NX|NQ|NJ|NC|N<|N5|N.|N'|N |N|N|N |N|Ný{Nö{Nï{Nè{Ná{NÚ{NÓ{NÌ{NÅ{N¾{N·{N°{N©{N¢{N›{N”{N{N†{N{Nx{Nq{Nj{Nc{N\{NU{NN{NG{N@{N9{N2{N+{N${N{N{N{N{N{NúzNózNìzNåzNÞzN×zNÐzNÉzNÂzN»zN´zN­zN¦zNŸzN˜zN‘zNŠzNƒzN|zNuzNnzNgzN`zNYzNRzNKzNDzN=zN6zN/zN(zN!zNzNzN zNzNþyN÷yNðyNéyNâyNÛyNÔyNÍyNÆyN¿yN¸yN±yNªyN£yNœyN•yNŽyN‡yN€yNyyNryNkyNdyN]yNVyNOyNHyNAyN:yN3yN,yN%yNyNyNyN yNyNûxNôxNíxNæxNßxNØxNÑxNÊxNÃxN¼xNµxN®xN§xN xN™xN’xN‹xN„xN}xNvxNoxNhxNaxNZxNSxNLxNExN>xN7xN0xN)xN"xNxNxN xNxNÿwNøwNñwNêwNãwNÜwNÕwNÎwNÇwNÀwN¹wN²wN«wN¤wNwN–wNwNˆwNwNzwNswNlwNewN^wNWwNPwNIwNBwN;wN4wN-wN&wNwNwNwN wNwNüvNõvNîvNçvNàvNÙvNÒvNËvNÄvN½vN¶vN¯vN¨vN¡vNšvN“vNŒvN…vN~vNwvNpvNivNbvN[vNTvNMvNFvN?vN8vN1vN*vN#vNvNvNvNvNvNùuNòuNëuNäuNÝuNÖuNÏuNÈuNÁuNºuN³uN¬uN¥uNžuN—uNuN‰uN‚uN{uNtuNmuNfuN_uNXuNQuNJuNCuNqN7qN0qN)qN"qNqNqN qNqNÿpNøpNñpNêpNãpNÜpNÕpNÎpNÇpNÀpN¹pN²pN«pN¤pNpN–pNpNˆpNpNzpNspNlpNepN^pNWpNPpNIpNBpN;pN4pN-pN&pNpNpNpN pNpNüoNõoNîoNçoNàoNÙoNÒoNËoNÄoN½oN¶oN¯oN¨oN¡oNšoN“oNŒoN…oN~oNwoNpoNioNboN[oNToNMoNFoN?oN8oN1oN*oN#oNoNoNoNoNoNùnNònNënNänNÝnNÖnNÏnNÈnNÁnNºnN³nN¬nN¥nNžnN—nNnN‰nN‚nN{nNtnNmnNfnN_nNXnNQnNJnNCnNjN7jN0jN)jN"jNjNjN jNjNÿiNøiNñiNêiNãiNÜiNÕiNÎiNÇiNÀiN¹iN²iN«iN¤iNiN–iNiNˆiNiNziNsiNliNeiN^iNWiNPiNIiNBiN;iN4iN-iN&iNiNiNiN iNiNühNõhNîhNçhNàhNÙhNÒhNËhNÄhN½hN¶hN¯hN¨hN¡hNšhN“hNŒhN…hN~hNwhNphNihNbhN[hNThNMhNFhN?hN8hN1hN*hN#hNhNhNhNhNhNùgNògNëgNägNÝgNÖgNÏgNÈgNÁgNºgN³gN¬gN¥gNžgN—gNgN‰gN‚gN{gNtgNmgNfgN_gNXgNQgNJgNCgNcN7cN0cN)cN"cNcNcN cNcNÿbNøbNñbNêbNãbNÜbNÕbNÎbNÇbNÀbN¹bN²bN«bN¤bNbN–bNbNˆbNbNzbNsbNlbNebN^bNWbNPbNIbNBbN;bN4bN-bN&bNbNbNbN bNbNüaNõaNîaNçaNàaNÙaNÒaNËaNÄaN½aN¶aN¯aN¨aN¡aNšaN“aNŒaN…aN~aNwaNpaNiaNbaN[aNTaNMaNFaN?aN8aN1aN*aN#aNaNaNaNaNaNù`Nò`Në`Nä`NÝ`NÖ`NÏ`NÈ`NÁ`Nº`N³`N¬`N¥`Nž`N—`N`N‰`N‚`N{`Nt`Nm`Nf`N_`NX`NQ`NJ`NC`N<`N5`N.`N'`N `N`N`N `N`Ný_Nö_Nï_Nè_Ná_NÚ_NÓ_NÌ_NÅ_N¾_N·_N°_N©_N¢_N›_N”_N_N†_N_Nx_Nq_Nj_Nc_N\_NU_NN_NG_N@_N9_N2_N+_N$_N_N_N_N_N_Nú^Nó^Nì^Nå^NÞ^N×^NÐ^NÉ^NÂ^N»^N´^N­^N¦^NŸ^N˜^N‘^NŠ^Nƒ^N|^Nu^Nn^Ng^N`^NY^NR^NK^ND^N=^N6^N/^N(^N!^N^N^N ^N^Nþ]N÷]Nð]Né]Nâ]NÛ]NÔ]NÍ]NÆ]N¿]N¸]N±]Nª]N£]Nœ]N•]NŽ]N‡]N€]Ny]Nr]Nk]Nd]N]]NV]NO]NH]NA]N:]N3]N,]N%]N]N]N]N ]N]Nû\Nô\Ní\Næ\Nß\NØ\NÑ\NÊ\NÃ\N¼\Nµ\N®\N§\N \N™\N’\N‹\N„\N}\Nv\No\Nh\Na\NZ\NS\NL\NE\N>\N7\N0\N)\N"\N\N\N \N\Nÿ[Nø[Nñ[Nê[Nã[NÜ[NÕ[NÎ[NÇ[NÀ[N¹[N²[N«[N¤[N[N–[N[Nˆ[N[Nz[Ns[Nl[Ne[N^[NW[NP[NI[NB[N;[N4[N-[N&[N[N[N[N [N[NüZNõZNîZNçZNàZNÙZNÒZNËZNÄZN½ZN¶ZN¯ZN¨ZN¡ZNšZN“ZNŒZN…ZN~ZNwZNpZNiZNbZN[ZNTZNMZNFZN?ZN8ZN1ZN*ZN#ZNZNZNZNZNZNùYNòYNëYNäYNÝYNÖYNÏYNÈYNÁYNºYN³YN¬YN¥YNžYN—YNYN‰YN‚YN{YNtYNmYNfYN_YNXYNQYNJYNCYNUN7UN0UN)UN"UNUNUN UNUNÿTNøTNñTNêTNãTNÜTNÕTNÎTNÇTNÀTN¹TN²TN«TN¤TNTN–TNTNˆTNTNzTNsTNlTNeTN^TNWTNPTNITNBTN;TN4TN-TN&TNTNTNTN TNTNüSNõSNîSNçSNàSNÙSNÒSNËSNÄSN½SN¶SN¯SN¨SN¡SNšSN“SNŒSN…SN~SNwSNpSNiSNbSN[SNTSNMSNFSN?SN8SN1SN*SN#SNSNSNSNSNSNùRNòRNëRNäRNÝRNÖRNÏRNÈRNÁRNºRN³RN¬RN¥RNžRN—RNRN‰RN‚RN{RNtRNmRNfRN_RNXRNQRNJRNCRNNN7NN0NN)NN"NNNNNN NNNNÿMNøMNñMNêMNãMNÜMNÕMNÎMNÇMNÀMN¹MN²MN«MN¤MNMN–MNMNˆMNMNzMNsMNlMNeMN^MNWMNPMNIMNBMN;MN4MN-MN&MNMNMNMN MNMNüLNõLNîLNçLNàLNÙLNÒLNËLNÄLN½LN¶LN¯LN¨LN¡LNšLN“LNŒLN…LN~LNwLNpLNiLNbLN[LNTLNMLNFLN?LN8LN1LN*LN#LNLNLNLNLNLNùKNòKNëKNäKNÝKNÖKNÏKNÈKNÁKNºKN³KN¬KN¥KNžKN—KNKN‰KN‚KN{KNtKNmKNfKN_KNXKNQKNJKNCKNGN7GN0GN)GN"GNGNGN GNGNÿFNøFNñFNêFNãFNÜFNÕFNÎFNÇFNÀFN¹FN²FN«FN¤FNFN–FNFNˆFNFNzFNsFNlFNeFN^FNWFNPFNIFNBFN;FN4FN-FN&FNFNFNFN FNFNüENõENîENçENàENÙENÒENËENÄEN½EN¶EN¯EN¨EN¡ENšEN“ENŒEN…EN~ENwENpENiENbEN[ENTENMENFEN?EN8EN1EN*EN#ENENENENENENùDNòDNëDNäDNÝDNÖDNÏDNÈDNÁDNºDN³DN¬DN¥DNžDN—DNDN‰DN‚DN{DNtDNmDNfDN_DNXDNQDNJDNCDN@N7@N0@N)@N"@N@N@N @N@Nÿ?Nø?Nñ?Nê?Nã?NÜ?NÕ?NÎ?NÇ?NÀ?N¹?N²?N«?N¤?N?N–?N?Nˆ?N?Nz?Ns?Nl?Ne?N^?NW?NP?NI?NB?N;?N4?N-?N&?N?N?N?N ?N?Nü>Nõ>Nî>Nç>Nà>NÙ>NÒ>NË>NÄ>N½>N¶>N¯>N¨>N¡>Nš>N“>NŒ>N…>N~>Nw>Np>Ni>Nb>N[>NT>NM>NF>N?>N8>N1>N*>N#>N>N>N>N>N>Nù=Nò=Në=Nä=NÝ=NÖ=NÏ=NÈ=NÁ=Nº=N³=N¬=N¥=Nž=N—=N=N‰=N‚=N{=Nt=Nm=Nf=N_=NX=NQ=NJ=NC=N<=N5=N.=N'=N =N=N=N =N=Ný9N79N09N)9N"9N9N9N 9N9Nÿ8Nø8Nñ8Nê8Nã8NÜ8NÕ8NÎ8NÇ8NÀ8N¹8N²8N«8N¤8N8N–8N8Nˆ8N8Nz8Ns8Nl8Ne8N^8NW8NP8NI8NB8N;8N48N-8N&8N8N8N8N 8N8Nü7Nõ7Nî7Nç7Nà7NÙ7NÒ7NË7NÄ7N½7N¶7N¯7N¨7N¡7Nš7N“7NŒ7N…7N~7Nw7Np7Ni7Nb7N[7NT7NM7NF7N?7N87N17N*7N#7N7N7N7N7N7Nù6Nò6Në6Nä6NÝ6NÖ6NÏ6NÈ6NÁ6Nº6N³6N¬6N¥6Nž6N—6N6N‰6N‚6N{6Nt6Nm6Nf6N_6NX6NQ6NJ6NC6N<6N56N.6N'6N 6N6N6N 6N6Ný5Nö5Nï5Nè5Ná5NÚ5NÓ5NÌ5NÅ5N¾5N·5N°5N©5N¢5N›5N”5N5N†5N5Nx5Nq5Nj5Nc5N\5NU5NN5NG5N@5N95N25N+5N$5N5N5N5N5N5Nú4Nó4Nì4Nå4NÞ4N×4NÐ4NÉ4NÂ4N»4N´4N­4N¦4NŸ4N˜4N‘4NŠ4Nƒ4N|4Nu4Nn4Ng4N`4NY4NR4NK4ND4N=4N64N/4N(4N!4N4N4N 4N4Nþ3N÷3Nð3Né3Nâ3NÛ3NÔ3NÍ3NÆ3N¿3N¸3N±3Nª3N£3Nœ3N•3NŽ3N‡3N€3Ny3Nr3Nk3Nd3N]3NV3NO3NH3NA3N:3N33N,3N%3N3N3N3N 3N3Nû2Nô2Ní2Næ2Nß2NØ2NÑ2NÊ2NÃ2N¼2Nµ2N®2N§2N 2N™2N’2N‹2N„2N}2Nv2No2Nh2Na2NZ2NS2NL2NE2N>2N72N02N)2N"2N2N2N 2N2Nÿ1Nø1Nñ1Nê1Nã1NÜ1NÕ1NÎ1NÇ1NÀ1N¹1N²1N«1N¤1N1N–1N1Nˆ1N1Nz1Ns1Nl1Ne1N^1NW1NP1NI1NB1N;1N41N-1N&1N1N1N1N 1N1Nü0Nõ0Nî0Nç0Nà0NÙ0NÒ0NË0NÄ0N½0N¶0N¯0N¨0N¡0Nš0N“0NŒ0N…0N~0Nw0Np0Ni0Nb0N[0NT0NM0NF0N?0N80N10N*0N#0N0N0N0N0N0Nù/Nò/Në/Nä/NÝ/NÖ/NÏ/NÈ/NÁ/Nº/N³/N¬/N¥/Nž/N—/N/N‰/N‚/N{/Nt/Nm/Nf/N_/NX/NQ/NJ/NC/N+N7+N0+N)+N"+N+N+N +N+Nÿ*Nø*Nñ*Nê*Nã*NÜ*NÕ*NÎ*NÇ*NÀ*N¹*N²*N«*N¤*N*N–*N*Nˆ*N*Nz*Ns*Nl*Ne*N^*NW*NP*NI*NB*N;*N4*N-*N&*N*N*N*N *N*Nü)Nõ)Nî)Nç)Nà)NÙ)NÒ)NË)NÄ)N½)N¶)N¯)N¨)N¡)Nš)N“)NŒ)N…)N~)Nw)Np)Ni)Nb)N[)NT)NM)NF)N?)N8)N1)N*)N#)N)N)N)N)N)Nù(Nò(Në(Nä(NÝ(NÖ(NÏ(NÈ(NÁ(Nº(N³(N¬(N¥(Nž(N—(N(N‰(N‚(N{(Nt(Nm(Nf(N_(NX(NQ(NJ(NC(N<(N5(N.(N'(N (N(N(N (N(Ný'Nö'Nï'Nè'Ná'NÚ'NÓ'NÌ'NÅ'N¾'N·'N°'N©'N¢'N›'N”'N'N†'N'Nx'Nq'Nj'Nc'N\'NU'NN'NG'N@'N9'N2'N+'N$'N'N'N'N'N'Nú&Nó&Nì&Nå&NÞ&N×&NÐ&NÉ&NÂ&N»&N´&N­&N¦&NŸ&N˜&N‘&NŠ&Nƒ&N|&Nu&Nn&Ng&N`&NY&NR&NK&ND&N=&N6&N/&N(&N!&N&N&N &N&Nþ%N÷%Nð%Né%Nâ%NÛ%NÔ%NÍ%NÆ%N¿%N¸%N±%Nª%N£%Nœ%N•%NŽ%N‡%N€%Ny%Nr%Nk%Nd%N]%NV%NO%NH%NA%N:%N3%N,%N%%N%N%N%N %N%Nû$Nô$Ní$Næ$Nß$NØ$NÑ$NÊ$NÃ$N¼$Nµ$N®$N§$N $N™$N’$N‹$N„$N}$Nv$No$Nh$Na$NZ$NS$NL$NE$N>$N7$N0$N)$N"$N$N$N $N$Nÿ#Nø#Nñ#Nê#Nã#NÜ#NÕ#NÎ#NÇ#NÀ#N¹#N²#N«#N¤#N#N–#N#Nˆ#N#Nz#Ns#Nl#Ne#N^#NW#NP#NI#NB#N;#N4#N-#N&#N#N#N#N #N#Nü"Nõ"Nî"Nç"Nà"NÙ"NÒ"NË"NÄ"N½"N¶"N¯"N¨"N¡"Nš"N“"NŒ"N…"N~"Nw"Np"Ni"Nb"N["NT"NM"NF"N?"N8"N1"N*"N#"N"N"N"N"N"Nù!Nò!Në!Nä!NÝ!NÖ!NÏ!NÈ!NÁ!Nº!N³!N¬!N¥!Nž!N—!N!N‰!N‚!N{!Nt!Nm!Nf!N_!NX!NQ!NJ!NC!NN7N0N)N"NNN NNÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNýNöNïNèNáNÚNÓNÌNÅN¾N·N°N©N¢N›N”NN†NNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþN÷NðNéNâNÛNÔNÍNÆN¿N¸N±NªN£NœN•NŽN‡N€NyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNýNöNïNèNáNÚNÓNÌNÅN¾N·N°N©N¢N›N”NN†NNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþN÷NðNéNâNÛNÔNÍNÆN¿N¸N±NªN£NœN•NŽN‡N€NyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNü Nõ Nî Nç Nà NÙ NÒ NË NÄ N½ N¶ N¯ N¨ N¡ Nš N“ NŒ N… N~ Nw Np Ni Nb N[ NT NM NF N? N8 N1 N* N# N N N N N Nù Nò Në Nä NÝ NÖ NÏ NÈ NÁ Nº N³ N¬ N¥ Nž N— N N‰ N‚ N{ Nt Nm Nf N_ NX NQ NJ NC N< N5 N. N' N N N N N Ný Nö Nï Nè Ná NÚ NÓ NÌ NÅ N¾ N· N° N© N¢ N› N” N N† N Nx Nq Nj Nc N\ NU NN NG N@ N9 N2 N+ N$ N N N N N Nú Nó Nì Nå NÞ N× NÐ NÉ N N» N´ N­ N¦ NŸ N˜ N‘ NŠ Nƒ N| Nu Nn Ng N` NY NR NK ND N= N6 N/ N( N! N N N N Nþ N÷ Nð Né Nâ NÛ NÔ NÍ NÆ N¿ N¸ N± Nª N£ Nœ N• NŽ N‡ N€ Ny Nr Nk Nd N] NV NO NH NA N: N3 N, N% N N N N N NûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCN<N5N.N'N NNN NNýNöNïNèNáNÚNÓNÌNÅN¾N·N°N©N¢N›N”NN†NNxNqNjNcN\NUNNNGN@N9N2N+N$NNNNNNúNóNìNåNÞN×NÐNÉNÂN»N´N­N¦NŸN˜N‘NŠNƒN|NuNnNgN`NYNRNKNDN=N6N/N(N!NNN NNþN÷NðNéNâNÛNÔNÍNÆN¿N¸N±NªN£NœN•NŽN‡N€NyNrNkNdN]NVNONHNAN:N3N,N%NNNN NNûNôNíNæNßNØNÑNÊNÃN¼NµN®N§N N™N’N‹N„N}NvNoNhNaNZNSNLNEN>N7N0N)N"NNN NNÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüÿMõÿMîÿMçÿMàÿMÙÿMÒÿMËÿMÄÿM½ÿM¶ÿM¯ÿM¨ÿM¡ÿMšÿM“ÿMŒÿM…ÿM~ÿMwÿMpÿMiÿMbÿM[ÿMTÿMMÿMFÿM?ÿM8ÿM1ÿM*ÿM#ÿMÿMÿMÿMÿMÿMùþMòþMëþMäþMÝþMÖþMÏþMÈþMÁþMºþM³þM¬þM¥þMžþM—þMþM‰þM‚þM{þMtþMmþMfþM_þMXþMQþMJþMCþM<þM5þM.þM'þM þMþMþM þMþMýýMöýMïýMèýMáýMÚýMÓýMÌýMÅýM¾ýM·ýM°ýM©ýM¢ýM›ýM”ýMýM†ýMýMxýMqýMjýMcýM\ýMUýMNýMGýM@ýM9ýM2ýM+ýM$ýMýMýMýMýMýMúüMóüMìüMåüMÞüM×üMÐüMÉüMÂüM»üM´üM­üM¦üMŸüM˜üM‘üMŠüMƒüM|üMuüMnüMgüM`üMYüMRüMKüMDüM=üM6üM/üM(üM!üMüMüM üMüMþûM÷ûMðûMéûMâûMÛûMÔûMÍûMÆûM¿ûM¸ûM±ûMªûM£ûMœûM•ûMŽûM‡ûM€ûMyûMrûMkûMdûM]ûMVûMOûMHûMAûM:ûM3ûM,ûM%ûMûMûMûM ûMûMûúMôúMíúMæúMßúMØúMÑúMÊúMÃúM¼úMµúM®úM§úM úM™úM’úM‹úM„úM}úMvúMoúMhúMaúMZúMSúMLúMEúM>úM7úM0úM)úM"úMúMúM úMúMÿùMøùMñùMêùMãùMÜùMÕùMÎùMÇùMÀùM¹ùM²ùM«ùM¤ùMùM–ùMùMˆùMùMzùMsùMlùMeùM^ùMWùMPùMIùMBùM;ùM4ùM-ùM&ùMùMùMùM ùMùMüøMõøMîøMçøMàøMÙøMÒøMËøMÄøM½øM¶øM¯øM¨øM¡øMšøM“øMŒøM…øM~øMwøMpøMiøMbøM[øMTøMMøMFøM?øM8øM1øM*øM#øMøMøMøMøMøMù÷Mò÷Më÷Mä÷MÝ÷MÖ÷MÏ÷MÈ÷MÁ÷Mº÷M³÷M¬÷M¥÷Mž÷M—÷M÷M‰÷M‚÷M{÷Mt÷Mm÷Mf÷M_÷MX÷MQ÷MJ÷MC÷M<÷M5÷M.÷M'÷M ÷M÷M÷M ÷M÷MýöMööMïöMèöMáöMÚöMÓöMÌöMÅöM¾öM·öM°öM©öM¢öM›öM”öMöM†öMöMxöMqöMjöMcöM\öMUöMNöMGöM@öM9öM2öM+öM$öMöMöMöMöMöMúõMóõMìõMåõMÞõM×õMÐõMÉõMÂõM»õM´õM­õM¦õMŸõM˜õM‘õMŠõMƒõM|õMuõMnõMgõM`õMYõMRõMKõMDõM=õM6õM/õM(õM!õMõMõM õMõMþôM÷ôMðôMéôMâôMÛôMÔôMÍôMÆôM¿ôM¸ôM±ôMªôM£ôMœôM•ôMŽôM‡ôM€ôMyôMrôMkôMdôM]ôMVôMOôMHôMAôM:ôM3ôM,ôM%ôMôMôMôM ôMôMûóMôóMíóMæóMßóMØóMÑóMÊóMÃóM¼óMµóM®óM§óM óM™óM’óM‹óM„óM}óMvóMoóMhóMaóMZóMSóMLóMEóM>óM7óM0óM)óM"óMóMóM óMóMÿòMøòMñòMêòMãòMÜòMÕòMÎòMÇòMÀòM¹òM²òM«òM¤òMòM–òMòMˆòMòMzòMsòMlòMeòM^òMWòMPòMIòMBòM;òM4òM-òM&òMòMòMòM òMòMüñMõñMîñMçñMàñMÙñMÒñMËñMÄñM½ñM¶ñM¯ñM¨ñM¡ñMšñM“ñMŒñM…ñM~ñMwñMpñMiñMbñM[ñMTñMMñMFñM?ñM8ñM1ñM*ñM#ñMñMñMñMñMñMùðMòðMëðMäðMÝðMÖðMÏðMÈðMÁðMºðM³ðM¬ðM¥ðMžðM—ðMðM‰ðM‚ðM{ðMtðMmðMfðM_ðMXðMQðMJðMCðM<ðM5ðM.ðM'ðM ðMðMðM ðMðMýïMöïMïïMèïMáïMÚïMÓïMÌïMÅïM¾ïM·ïM°ïM©ïM¢ïM›ïM”ïMïM†ïMïMxïMqïMjïMcïM\ïMUïMNïMGïM@ïM9ïM2ïM+ïM$ïMïMïMïMïMïMúîMóîMìîMåîMÞîM×îMÐîMÉîMÂîM»îM´îM­îM¦îMŸîM˜îM‘îMŠîMƒîM|îMuîMnîMgîM`îMYîMRîMKîMDîM=îM6îM/îM(îM!îMîMîM îMîMþíM÷íMðíMéíMâíMÛíMÔíMÍíMÆíM¿íM¸íM±íMªíM£íMœíM•íMŽíM‡íM€íMyíMríMkíMdíM]íMVíMOíMHíMAíM:íM3íM,íM%íMíMíMíM íMíMûìMôìMíìMæìMßìMØìMÑìMÊìMÃìM¼ìMµìM®ìM§ìM ìM™ìM’ìM‹ìM„ìM}ìMvìMoìMhìMaìMZìMSìMLìMEìM>ìM7ìM0ìM)ìM"ìMìMìM ìMìMÿëMøëMñëMêëMãëMÜëMÕëMÎëMÇëMÀëM¹ëM²ëM«ëM¤ëMëM–ëMëMˆëMëMzëMsëMlëMeëM^ëMWëMPëMIëMBëM;ëM4ëM-ëM&ëMëMëMëM ëMëMüêMõêMîêMçêMàêMÙêMÒêMËêMÄêM½êM¶êM¯êM¨êM¡êMšêM“êMŒêM…êM~êMwêMpêMiêMbêM[êMTêMMêMFêM?êM8êM1êM*êM#êMêMêMêMêMêMùéMòéMëéMäéMÝéMÖéMÏéMÈéMÁéMºéM³éM¬éM¥éMžéM—éMéM‰éM‚éM{éMtéMméMféM_éMXéMQéMJéMCéM<éM5éM.éM'éM éMéMéM éMéMýèMöèMïèMèèMáèMÚèMÓèMÌèMÅèM¾èM·èM°èM©èM¢èM›èM”èMèM†èMèMxèMqèMjèMcèM\èMUèMNèMGèM@èM9èM2èM+èM$èMèMèMèMèMèMúçMóçMìçMåçMÞçM×çMÐçMÉçMÂçM»çM´çM­çM¦çMŸçM˜çM‘çMŠçMƒçM|çMuçMnçMgçM`çMYçMRçMKçMDçM=çM6çM/çM(çM!çMçMçM çMçMþæM÷æMðæMéæMâæMÛæMÔæMÍæMÆæM¿æM¸æM±æMªæM£æMœæM•æMŽæM‡æM€æMyæMræMkæMdæM]æMVæMOæMHæMAæM:æM3æM,æM%æMæMæMæM æMæMûåMôåMíåMæåMßåMØåMÑåMÊåMÃåM¼åMµåM®åM§åM åM™åM’åM‹åM„åM}åMvåMoåMhåMaåMZåMSåMLåMEåM>åM7åM0åM)åM"åMåMåM åMåMÿäMøäMñäMêäMãäMÜäMÕäMÎäMÇäMÀäM¹äM²äM«äM¤äMäM–äMäMˆäMäMzäMsäMläMeäM^äMWäMPäMIäMBäM;äM4äM-äM&äMäMäMäM äMäMüãMõãMîãMçãMàãMÙãMÒãMËãMÄãM½ãM¶ãM¯ãM¨ãM¡ãMšãM“ãMŒãM…ãM~ãMwãMpãMiãMbãM[ãMTãMMãMFãM?ãM8ãM1ãM*ãM#ãMãMãMãMãMãMùâMòâMëâMäâMÝâMÖâMÏâMÈâMÁâMºâM³âM¬âM¥âMžâM—âMâM‰âM‚âM{âMtâMmâMfâM_âMXâMQâMJâMCâM<âM5âM.âM'âM âMâMâM âMâMýáMöáMïáMèáMááMÚáMÓáMÌáMÅáM¾áM·áM°áM©áM¢áM›áM”áMáM†áMáMxáMqáMjáMcáM\áMUáMNáMGáM@áM9áM2áM+áM$áMáMáMáMáMáMúàMóàMìàMåàMÞàM×àMÐàMÉàMÂàM»àM´àM­àM¦àMŸàM˜àM‘àMŠàMƒàM|àMuàMnàMgàM`àMYàMRàMKàMDàM=àM6àM/àM(àM!àMàMàM àMàMþßM÷ßMðßMéßMâßMÛßMÔßMÍßMÆßM¿ßM¸ßM±ßMªßM£ßMœßM•ßMŽßM‡ßM€ßMyßMrßMkßMdßM]ßMVßMOßMHßMAßM:ßM3ßM,ßM%ßMßMßMßM ßMßMûÞMôÞMíÞMæÞMßÞMØÞMÑÞMÊÞMÃÞM¼ÞMµÞM®ÞM§ÞM ÞM™ÞM’ÞM‹ÞM„ÞM}ÞMvÞMoÞMhÞMaÞMZÞMSÞMLÞMEÞM>ÞM7ÞM0ÞM)ÞM"ÞMÞMÞM ÞMÞMÿÝMøÝMñÝMêÝMãÝMÜÝMÕÝMÎÝMÇÝMÀÝM¹ÝM²ÝM«ÝM¤ÝMÝM–ÝMÝMˆÝMÝMzÝMsÝMlÝMeÝM^ÝMWÝMPÝMIÝMBÝM;ÝM4ÝM-ÝM&ÝMÝMÝMÝM ÝMÝMüÜMõÜMîÜMçÜMàÜMÙÜMÒÜMËÜMÄÜM½ÜM¶ÜM¯ÜM¨ÜM¡ÜMšÜM“ÜMŒÜM…ÜM~ÜMwÜMpÜMiÜMbÜM[ÜMTÜMMÜMFÜM?ÜM8ÜM1ÜM*ÜM#ÜMÜMÜMÜMÜMÜMùÛMòÛMëÛMäÛMÝÛMÖÛMÏÛMÈÛMÁÛMºÛM³ÛM¬ÛM¥ÛMžÛM—ÛMÛM‰ÛM‚ÛM{ÛMtÛMmÛMfÛM_ÛMXÛMQÛMJÛMCÛM<ÛM5ÛM.ÛM'ÛM ÛMÛMÛM ÛMÛMýÚMöÚMïÚMèÚMáÚMÚÚMÓÚMÌÚMÅÚM¾ÚM·ÚM°ÚM©ÚM¢ÚM›ÚM”ÚMÚM†ÚMÚMxÚMqÚMjÚMcÚM\ÚMUÚMNÚMGÚM@ÚM9ÚM2ÚM+ÚM$ÚMÚMÚMÚMÚMÚMúÙMóÙMìÙMåÙMÞÙM×ÙMÐÙMÉÙMÂÙM»ÙM´ÙM­ÙM¦ÙMŸÙM˜ÙM‘ÙMŠÙMƒÙM|ÙMuÙMnÙMgÙM`ÙMYÙMRÙMKÙMDÙM=ÙM6ÙM/ÙM(ÙM!ÙMÙMÙM ÙMÙMþØM÷ØMðØMéØMâØMÛØMÔØMÍØMÆØM¿ØM¸ØM±ØMªØM£ØMœØM•ØMŽØM‡ØM€ØMyØMrØMkØMdØM]ØMVØMOØMHØMAØM:ØM3ØM,ØM%ØMØMØMØM ØMØMû×Mô×Mí×Mæ×Mß×MØ×MÑ×MÊ×MÃ×M¼×Mµ×M®×M§×M ×M™×M’×M‹×M„×M}×Mv×Mo×Mh×Ma×MZ×MS×ML×ME×M>×M7×M0×M)×M"×M×M×M ×M×MÿÖMøÖMñÖMêÖMãÖMÜÖMÕÖMÎÖMÇÖMÀÖM¹ÖM²ÖM«ÖM¤ÖMÖM–ÖMÖMˆÖMÖMzÖMsÖMlÖMeÖM^ÖMWÖMPÖMIÖMBÖM;ÖM4ÖM-ÖM&ÖMÖMÖMÖM ÖMÖMüÕMõÕMîÕMçÕMàÕMÙÕMÒÕMËÕMÄÕM½ÕM¶ÕM¯ÕM¨ÕM¡ÕMšÕM“ÕMŒÕM…ÕM~ÕMwÕMpÕMiÕMbÕM[ÕMTÕMMÕMFÕM?ÕM8ÕM1ÕM*ÕM#ÕMÕMÕMÕMÕMÕMùÔMòÔMëÔMäÔMÝÔMÖÔMÏÔMÈÔMÁÔMºÔM³ÔM¬ÔM¥ÔMžÔM—ÔMÔM‰ÔM‚ÔM{ÔMtÔMmÔMfÔM_ÔMXÔMQÔMJÔMCÔM<ÔM5ÔM.ÔM'ÔM ÔMÔMÔM ÔMÔMýÓMöÓMïÓMèÓMáÓMÚÓMÓÓMÌÓMÅÓM¾ÓM·ÓM°ÓM©ÓM¢ÓM›ÓM”ÓMÓM†ÓMÓMxÓMqÓMjÓMcÓM\ÓMUÓMNÓMGÓM@ÓM9ÓM2ÓM+ÓM$ÓMÓMÓMÓMÓMÓMúÒMóÒMìÒMåÒMÞÒM×ÒMÐÒMÉÒMÂÒM»ÒM´ÒM­ÒM¦ÒMŸÒM˜ÒM‘ÒMŠÒMƒÒM|ÒMuÒMnÒMgÒM`ÒMYÒMRÒMKÒMDÒM=ÒM6ÒM/ÒM(ÒM!ÒMÒMÒM ÒMÒMþÑM÷ÑMðÑMéÑMâÑMÛÑMÔÑMÍÑMÆÑM¿ÑM¸ÑM±ÑMªÑM£ÑMœÑM•ÑMŽÑM‡ÑM€ÑMyÑMrÑMkÑMdÑM]ÑMVÑMOÑMHÑMAÑM:ÑM3ÑM,ÑM%ÑMÑMÑMÑM ÑMÑMûÐMôÐMíÐMæÐMßÐMØÐMÑÐMÊÐMÃÐM¼ÐMµÐM®ÐM§ÐM ÐM™ÐM’ÐM‹ÐM„ÐM}ÐMvÐMoÐMhÐMaÐMZÐMSÐMLÐMEÐM>ÐM7ÐM0ÐM)ÐM"ÐMÐMÐM ÐMÐMÿÏMøÏMñÏMêÏMãÏMÜÏMÕÏMÎÏMÇÏMÀÏM¹ÏM²ÏM«ÏM¤ÏMÏM–ÏMÏMˆÏMÏMzÏMsÏMlÏMeÏM^ÏMWÏMPÏMIÏMBÏM;ÏM4ÏM-ÏM&ÏMÏMÏMÏM ÏMÏMüÎMõÎMîÎMçÎMàÎMÙÎMÒÎMËÎMÄÎM½ÎM¶ÎM¯ÎM¨ÎM¡ÎMšÎM“ÎMŒÎM…ÎM~ÎMwÎMpÎMiÎMbÎM[ÎMTÎMMÎMFÎM?ÎM8ÎM1ÎM*ÎM#ÎMÎMÎMÎMÎMÎMùÍMòÍMëÍMäÍMÝÍMÖÍMÏÍMÈÍMÁÍMºÍM³ÍM¬ÍM¥ÍMžÍM—ÍMÍM‰ÍM‚ÍM{ÍMtÍMmÍMfÍM_ÍMXÍMQÍMJÍMCÍM<ÍM5ÍM.ÍM'ÍM ÍMÍMÍM ÍMÍMýÌMöÌMïÌMèÌMáÌMÚÌMÓÌMÌÌMÅÌM¾ÌM·ÌM°ÌM©ÌM¢ÌM›ÌM”ÌMÌM†ÌMÌMxÌMqÌMjÌMcÌM\ÌMUÌMNÌMGÌM@ÌM9ÌM2ÌM+ÌM$ÌMÌMÌMÌMÌMÌMúËMóËMìËMåËMÞËM×ËMÐËMÉËMÂËM»ËM´ËM­ËM¦ËMŸËM˜ËM‘ËMŠËMƒËM|ËMuËMnËMgËM`ËMYËMRËMKËMDËM=ËM6ËM/ËM(ËM!ËMËMËM ËMËMþÊM÷ÊMðÊMéÊMâÊMÛÊMÔÊMÍÊMÆÊM¿ÊM¸ÊM±ÊMªÊM£ÊMœÊM•ÊMŽÊM‡ÊM€ÊMyÊMrÊMkÊMdÊM]ÊMVÊMOÊMHÊMAÊM:ÊM3ÊM,ÊM%ÊMÊMÊMÊM ÊMÊMûÉMôÉMíÉMæÉMßÉMØÉMÑÉMÊÉMÃÉM¼ÉMµÉM®ÉM§ÉM ÉM™ÉM’ÉM‹ÉM„ÉM}ÉMvÉMoÉMhÉMaÉMZÉMSÉMLÉMEÉM>ÉM7ÉM0ÉM)ÉM"ÉMÉMÉM ÉMÉMÿÈMøÈMñÈMêÈMãÈMÜÈMÕÈMÎÈMÇÈMÀÈM¹ÈM²ÈM«ÈM¤ÈMÈM–ÈMÈMˆÈMÈMzÈMsÈMlÈMeÈM^ÈMWÈMPÈMIÈMBÈM;ÈM4ÈM-ÈM&ÈMÈMÈMÈM ÈMÈMüÇMõÇMîÇMçÇMàÇMÙÇMÒÇMËÇMÄÇM½ÇM¶ÇM¯ÇM¨ÇM¡ÇMšÇM“ÇMŒÇM…ÇM~ÇMwÇMpÇMiÇMbÇM[ÇMTÇMMÇMFÇM?ÇM8ÇM1ÇM*ÇM#ÇMÇMÇMÇMÇMÇMùÆMòÆMëÆMäÆMÝÆMÖÆMÏÆMÈÆMÁÆMºÆM³ÆM¬ÆM¥ÆMžÆM—ÆMÆM‰ÆM‚ÆM{ÆMtÆMmÆMfÆM_ÆMXÆMQÆMJÆMCÆM<ÆM5ÆM.ÆM'ÆM ÆMÆMÆM ÆMÆMýÅMöÅMïÅMèÅMáÅMÚÅMÓÅMÌÅMÅÅM¾ÅM·ÅM°ÅM©ÅM¢ÅM›ÅM”ÅMÅM†ÅMÅMxÅMqÅMjÅMcÅM\ÅMUÅMNÅMGÅM@ÅM9ÅM2ÅM+ÅM$ÅMÅMÅMÅMÅMÅMúÄMóÄMìÄMåÄMÞÄM×ÄMÐÄMÉÄMÂÄM»ÄM´ÄM­ÄM¦ÄMŸÄM˜ÄM‘ÄMŠÄMƒÄM|ÄMuÄMnÄMgÄM`ÄMYÄMRÄMKÄMDÄM=ÄM6ÄM/ÄM(ÄM!ÄMÄMÄM ÄMÄMþÃM÷ÃMðÃMéÃMâÃMÛÃMÔÃMÍÃMÆÃM¿ÃM¸ÃM±ÃMªÃM£ÃMœÃM•ÃMŽÃM‡ÃM€ÃMyÃMrÃMkÃMdÃM]ÃMVÃMOÃMHÃMAÃM:ÃM3ÃM,ÃM%ÃMÃMÃMÃM ÃMÃMûÂMôÂMíÂMæÂMßÂMØÂMÑÂMÊÂMÃÂM¼ÂMµÂM®ÂM§ÂM ÂM™ÂM’ÂM‹ÂM„ÂM}ÂMvÂMoÂMhÂMaÂMZÂMSÂMLÂMEÂM>ÂM7ÂM0ÂM)ÂM"ÂMÂMÂM ÂMÂMÿÁMøÁMñÁMêÁMãÁMÜÁMÕÁMÎÁMÇÁMÀÁM¹ÁM²ÁM«ÁM¤ÁMÁM–ÁMÁMˆÁMÁMzÁMsÁMlÁMeÁM^ÁMWÁMPÁMIÁMBÁM;ÁM4ÁM-ÁM&ÁMÁMÁMÁM ÁMÁMüÀMõÀMîÀMçÀMàÀMÙÀMÒÀMËÀMÄÀM½ÀM¶ÀM¯ÀM¨ÀM¡ÀMšÀM“ÀMŒÀM…ÀM~ÀMwÀMpÀMiÀMbÀM[ÀMTÀMMÀMFÀM?ÀM8ÀM1ÀM*ÀM#ÀMÀMÀMÀMÀMÀMù¿Mò¿Më¿Mä¿MÝ¿MÖ¿MÏ¿MÈ¿MÁ¿Mº¿M³¿M¬¿M¥¿Mž¿M—¿M¿M‰¿M‚¿M{¿Mt¿Mm¿Mf¿M_¿MX¿MQ¿MJ¿MC¿M<¿M5¿M.¿M'¿M ¿M¿M¿M ¿M¿Mý¾Mö¾Mï¾Mè¾Má¾MÚ¾MÓ¾M̾MžM¾¾M·¾M°¾M©¾M¢¾M›¾M”¾M¾M†¾M¾Mx¾Mq¾Mj¾Mc¾M\¾MU¾MN¾MG¾M@¾M9¾M2¾M+¾M$¾M¾M¾M¾M¾M¾Mú½Mó½Mì½Må½MÞ½M×½MнMɽM½M»½M´½M­½M¦½MŸ½M˜½M‘½MнMƒ½M|½Mu½Mn½Mg½M`½MY½MR½MK½MD½M=½M6½M/½M(½M!½M½M½M ½M½Mþ¼M÷¼Mð¼Mé¼Mâ¼MÛ¼MÔ¼MͼMƼM¿¼M¸¼M±¼Mª¼M£¼Mœ¼M•¼M޼M‡¼M€¼My¼Mr¼Mk¼Md¼M]¼MV¼MO¼MH¼MA¼M:¼M3¼M,¼M%¼M¼M¼M¼M ¼M¼Mû»Mô»Mí»Mæ»Mß»MØ»MÑ»MÊ»MûM¼»Mµ»M®»M§»M »M™»M’»M‹»M„»M}»Mv»Mo»Mh»Ma»MZ»MS»ML»ME»M>»M7»M0»M)»M"»M»M»M »M»MÿºMøºMñºMêºMãºMܺMÕºMκMǺMÀºM¹ºM²ºM«ºM¤ºMºM–ºMºMˆºMºMzºMsºMlºMeºM^ºMWºMPºMIºMBºM;ºM4ºM-ºM&ºMºMºMºM ºMºMü¹Mõ¹Mî¹Mç¹Mà¹MÙ¹MÒ¹M˹MĹM½¹M¶¹M¯¹M¨¹M¡¹Mš¹M“¹MŒ¹M…¹M~¹Mw¹Mp¹Mi¹Mb¹M[¹MT¹MM¹MF¹M?¹M8¹M1¹M*¹M#¹M¹M¹M¹M¹M¹Mù¸Mò¸Më¸Mä¸MݸMÖ¸MϸMȸMÁ¸Mº¸M³¸M¬¸M¥¸Mž¸M—¸M¸M‰¸M‚¸M{¸Mt¸Mm¸Mf¸M_¸MX¸MQ¸MJ¸MC¸M<¸M5¸M.¸M'¸M ¸M¸M¸M ¸M¸Mý·Mö·Mï·Mè·Má·MÚ·MÓ·MÌ·MÅ·M¾·M··M°·M©·M¢·M›·M”·M·M†·M·Mx·Mq·Mj·Mc·M\·MU·MN·MG·M@·M9·M2·M+·M$·M·M·M·M·M·Mú¶Mó¶Mì¶Må¶MÞ¶M×¶MжMɶM¶M»¶M´¶M­¶M¦¶MŸ¶M˜¶M‘¶MжMƒ¶M|¶Mu¶Mn¶Mg¶M`¶MY¶MR¶MK¶MD¶M=¶M6¶M/¶M(¶M!¶M¶M¶M ¶M¶MþµM÷µMðµMéµMâµMÛµMÔµM͵MƵM¿µM¸µM±µMªµM£µMœµM•µM޵M‡µM€µMyµMrµMkµMdµM]µMVµMOµMHµMAµM:µM3µM,µM%µMµMµMµM µMµMû´Mô´Mí´Mæ´Mß´MØ´MÑ´MÊ´MôM¼´Mµ´M®´M§´M ´M™´M’´M‹´M„´M}´Mv´Mo´Mh´Ma´MZ´MS´ML´ME´M>´M7´M0´M)´M"´M´M´M ´M´Mÿ³Mø³Mñ³Mê³Mã³MܳMÕ³MγMdzMÀ³M¹³M²³M«³M¤³M³M–³M³Mˆ³M³Mz³Ms³Ml³Me³M^³MW³MP³MI³MB³M;³M4³M-³M&³M³M³M³M ³M³Mü²Mõ²Mî²Mç²Mà²MÙ²MÒ²M˲MIJM½²M¶²M¯²M¨²M¡²Mš²M“²MŒ²M…²M~²Mw²Mp²Mi²Mb²M[²MT²MM²MF²M?²M8²M1²M*²M#²M²M²M²M²M²Mù±Mò±Më±Mä±MݱMÖ±MϱMȱMÁ±Mº±M³±M¬±M¥±Mž±M—±M±M‰±M‚±M{±Mt±Mm±Mf±M_±MX±MQ±MJ±MC±M<±M5±M.±M'±M ±M±M±M ±M±Mý°Mö°Mï°Mè°Má°MÚ°MÓ°M̰MŰM¾°M·°M°°M©°M¢°M›°M”°M°M†°M°Mx°Mq°Mj°Mc°M\°MU°MN°MG°M@°M9°M2°M+°M$°M°M°M°M°M°Mú¯Mó¯Mì¯Må¯MÞ¯MׯMЯMɯM¯M»¯M´¯M­¯M¦¯MŸ¯M˜¯M‘¯MНMƒ¯M|¯Mu¯Mn¯Mg¯M`¯MY¯MR¯MK¯MD¯M=¯M6¯M/¯M(¯M!¯M¯M¯M ¯M¯Mþ®M÷®Mð®Mé®Mâ®MÛ®MÔ®MÍ®MÆ®M¿®M¸®M±®Mª®M£®Mœ®M•®MŽ®M‡®M€®My®Mr®Mk®Md®M]®MV®MO®MH®MA®M:®M3®M,®M%®M®M®M®M ®M®Mû­Mô­Mí­Mæ­Mß­MØ­MÑ­MÊ­MíM¼­Mµ­M®­M§­M ­M™­M’­M‹­M„­M}­Mv­Mo­Mh­Ma­MZ­MS­ML­ME­M>­M7­M0­M)­M"­M­M­M ­M­Mÿ¬Mø¬Mñ¬Mê¬Mã¬MܬMÕ¬MάMǬMÀ¬M¹¬M²¬M«¬M¤¬M¬M–¬M¬Mˆ¬M¬Mz¬Ms¬Ml¬Me¬M^¬MW¬MP¬MI¬MB¬M;¬M4¬M-¬M&¬M¬M¬M¬M ¬M¬Mü«Mõ«Mî«Mç«Mà«MÙ«MÒ«MË«MÄ«M½«M¶«M¯«M¨«M¡«Mš«M“«MŒ«M…«M~«Mw«Mp«Mi«Mb«M[«MT«MM«MF«M?«M8«M1«M*«M#«M«M«M«M«M«MùªMòªMëªMäªMݪMÖªMϪMȪMÁªMºªM³ªM¬ªM¥ªMžªM—ªMªM‰ªM‚ªM{ªMtªMmªMfªM_ªMXªMQªMJªMCªM<ªM5ªM.ªM'ªM ªMªMªM ªMªMý©Mö©Mï©Mè©Má©MÚ©MÓ©MÌ©MÅ©M¾©M·©M°©M©©M¢©M›©M”©M©M†©M©Mx©Mq©Mj©Mc©M\©MU©MN©MG©M@©M9©M2©M+©M$©M©M©M©M©M©Mú¨Mó¨Mì¨Må¨MÞ¨MרMШMɨM¨M»¨M´¨M­¨M¦¨MŸ¨M˜¨M‘¨MЍMƒ¨M|¨Mu¨Mn¨Mg¨M`¨MY¨MR¨MK¨MD¨M=¨M6¨M/¨M(¨M!¨M¨M¨M ¨M¨Mþ§M÷§Mð§Mé§Mâ§MÛ§MÔ§MͧMƧM¿§M¸§M±§Mª§M£§Mœ§M•§MާM‡§M€§My§Mr§Mk§Md§M]§MV§MO§MH§MA§M:§M3§M,§M%§M§M§M§M §M§Mû¦Mô¦Mí¦Mæ¦MߦMئMѦMʦMæM¼¦Mµ¦M®¦M§¦M ¦M™¦M’¦M‹¦M„¦M}¦Mv¦Mo¦Mh¦Ma¦MZ¦MS¦ML¦ME¦M>¦M7¦M0¦M)¦M"¦M¦M¦M ¦M¦Mÿ¥Mø¥Mñ¥Mê¥Mã¥MÜ¥MÕ¥MÎ¥MÇ¥MÀ¥M¹¥M²¥M«¥M¤¥M¥M–¥M¥Mˆ¥M¥Mz¥Ms¥Ml¥Me¥M^¥MW¥MP¥MI¥MB¥M;¥M4¥M-¥M&¥M¥M¥M¥M ¥M¥Mü¤Mõ¤Mî¤Mç¤Mà¤MÙ¤MÒ¤MˤMĤM½¤M¶¤M¯¤M¨¤M¡¤Mš¤M“¤MŒ¤M…¤M~¤Mw¤Mp¤Mi¤Mb¤M[¤MT¤MM¤MF¤M?¤M8¤M1¤M*¤M#¤M¤M¤M¤M¤M¤Mù£Mò£Më£Mä£MÝ£MÖ£MÏ£MÈ£MÁ£Mº£M³£M¬£M¥£Mž£M—£M£M‰£M‚£M{£Mt£Mm£Mf£M_£MX£MQ£MJ£MC£M<£M5£M.£M'£M £M£M£M £M£Mý¢Mö¢Mï¢Mè¢Má¢MÚ¢MÓ¢MÌ¢MÅ¢M¾¢M·¢M°¢M©¢M¢¢M›¢M”¢M¢M†¢M¢Mx¢Mq¢Mj¢Mc¢M\¢MU¢MN¢MG¢M@¢M9¢M2¢M+¢M$¢M¢M¢M¢M¢M¢Mú¡Mó¡Mì¡Må¡MÞ¡MסMСMÉ¡M¡M»¡M´¡M­¡M¦¡MŸ¡M˜¡M‘¡MŠ¡Mƒ¡M|¡Mu¡Mn¡Mg¡M`¡MY¡MR¡MK¡MD¡M=¡M6¡M/¡M(¡M!¡M¡M¡M ¡M¡Mþ M÷ Mð Mé Mâ MÛ MÔ MÍ MÆ M¿ M¸ M± Mª M£ Mœ M• MŽ M‡ M€ My Mr Mk Md M] MV MO MH MA M: M3 M, M% M M M M  M MûŸMôŸMíŸMæŸMߟMØŸMÑŸMÊŸMßM¼ŸMµŸM®ŸM§ŸM ŸM™ŸM’ŸM‹ŸM„ŸM}ŸMvŸMoŸMhŸMaŸMZŸMSŸMLŸMEŸM>ŸM7ŸM0ŸM)ŸM"ŸMŸMŸM ŸMŸMÿžMøžMñžMêžMãžMÜžMÕžMΞMÇžMÀžM¹žM²žM«žM¤žMžM–žMžMˆžMžMzžMsžMlžMežM^žMWžMPžMIžMBžM;žM4žM-žM&žMžMžMžM žMžMüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùœMòœMëœMäœMÝœMÖœMÏœMÈœMÁœMºœM³œM¬œM¥œMžœM—œMœM‰œM‚œM{œMtœMmœMfœM_œMXœMQœMJœMCœM<œM5œM.œM'œM œMœMœM œMœMý›Mö›Mï›Mè›Má›MÚ›MÓ›MÌ›MÅ›M¾›M·›M°›M©›M¢›M››M”›M›M†›M›Mx›Mq›Mj›Mc›M\›MU›MN›MG›M@›M9›M2›M+›M$›M›M›M›M›M›MúšMóšMìšMåšMÞšMךMКMÉšMšM»šM´šM­šM¦šMŸšM˜šM‘šMŠšMƒšM|šMušMnšMgšM`šMYšMRšMKšMDšM=šM6šM/šM(šM!šMšMšM šMšMþ™M÷™Mð™Mé™Mâ™MÛ™MÔ™MÍ™MÆ™M¿™M¸™M±™Mª™M£™Mœ™M•™MŽ™M‡™M€™My™Mr™Mk™Md™M]™MV™MO™MH™MA™M:™M3™M,™M%™M™M™M™M ™M™Mû˜Mô˜Mí˜Mæ˜MߘMؘMјMʘMØM¼˜Mµ˜M®˜M§˜M ˜M™˜M’˜M‹˜M„˜M}˜Mv˜Mo˜Mh˜Ma˜MZ˜MS˜ML˜ME˜M>˜M7˜M0˜M)˜M"˜M˜M˜M ˜M˜Mÿ—Mø—Mñ—Mê—Mã—MÜ—MÕ—MΗMÇ—MÀ—M¹—M²—M«—M¤—M—M–—M—Mˆ—M—Mz—Ms—Ml—Me—M^—MW—MP—MI—MB—M;—M4—M-—M&—M—M—M—M —M—Mü–Mõ–Mî–Mç–Mà–MÙ–MÒ–MË–MÄ–M½–M¶–M¯–M¨–M¡–Mš–M“–MŒ–M…–M~–Mw–Mp–Mi–Mb–M[–MT–MM–MF–M?–M8–M1–M*–M#–M–M–M–M–M–Mù•Mò•Më•Mä•MÝ•MÖ•MÏ•MÈ•MÁ•Mº•M³•M¬•M¥•Mž•M—•M•M‰•M‚•M{•Mt•Mm•Mf•M_•MX•MQ•MJ•MC•M<•M5•M.•M'•M •M•M•M •M•Mý”Mö”Mï”Mè”Má”MÚ”MÓ”MÌ”MÅ”M¾”M·”M°”M©”M¢”M›”M””M”M†”M”Mx”Mq”Mj”Mc”M\”MU”MN”MG”M@”M9”M2”M+”M$”M”M”M”M”M”Mú“Mó“Mì“Må“MÞ“MדMГMÉ“M“M»“M´“M­“M¦“MŸ“M˜“M‘“MŠ“Mƒ“M|“Mu“Mn“Mg“M`“MY“MR“MK“MD“M=“M6“M/“M(“M!“M“M“M “M“Mþ’M÷’Mð’Mé’Mâ’MÛ’MÔ’MÍ’MÆ’M¿’M¸’M±’Mª’M£’Mœ’M•’MŽ’M‡’M€’My’Mr’Mk’Md’M]’MV’MO’MH’MA’M:’M3’M,’M%’M’M’M’M ’M’Mû‘Mô‘Mí‘Mæ‘Mß‘MØ‘MÑ‘MÊ‘MÑM¼‘Mµ‘M®‘M§‘M ‘M™‘M’‘M‹‘M„‘M}‘Mv‘Mo‘Mh‘Ma‘MZ‘MS‘ML‘ME‘M>‘M7‘M0‘M)‘M"‘M‘M‘M ‘M‘MÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùŽMòŽMëŽMäŽMÝŽMÖŽMÏŽMÈŽMÁŽMºŽM³ŽM¬ŽM¥ŽMžŽM—ŽMŽM‰ŽM‚ŽM{ŽMtŽMmŽMfŽM_ŽMXŽMQŽMJŽMCŽM<ŽM5ŽM.ŽM'ŽM ŽMŽMŽM ŽMŽMýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúŒMóŒMìŒMåŒMÞŒM׌MÐŒMÉŒMÂŒM»ŒM´ŒM­ŒM¦ŒMŸŒM˜ŒM‘ŒMŠŒMƒŒM|ŒMuŒMnŒMgŒM`ŒMYŒMRŒMKŒMDŒM=ŒM6ŒM/ŒM(ŒM!ŒMŒMŒM ŒMŒMþ‹M÷‹Mð‹Mé‹Mâ‹MÛ‹MÔ‹MÍ‹MÆ‹M¿‹M¸‹M±‹Mª‹M£‹Mœ‹M•‹MŽ‹M‡‹M€‹My‹Mr‹Mk‹Md‹M]‹MV‹MO‹MH‹MA‹M:‹M3‹M,‹M%‹M‹M‹M‹M ‹M‹MûŠMôŠMíŠMæŠMߊMØŠMÑŠMÊŠMÊM¼ŠMµŠM®ŠM§ŠM ŠM™ŠM’ŠM‹ŠM„ŠM}ŠMvŠMoŠMhŠMaŠMZŠMSŠMLŠMEŠM>ŠM7ŠM0ŠM)ŠM"ŠMŠMŠM ŠMŠMÿ‰Mø‰Mñ‰Mê‰Mã‰M܉MÕ‰MΉMljMÀ‰M¹‰M²‰M«‰M¤‰M‰M–‰M‰Mˆ‰M‰Mz‰Ms‰Ml‰Me‰M^‰MW‰MP‰MI‰MB‰M;‰M4‰M-‰M&‰M‰M‰M‰M ‰M‰MüˆMõˆMîˆMçˆMàˆMÙˆMÒˆMˈMĈM½ˆM¶ˆM¯ˆM¨ˆM¡ˆMšˆM“ˆMŒˆM…ˆM~ˆMwˆMpˆMiˆMbˆM[ˆMTˆMMˆMFˆM?ˆM8ˆM1ˆM*ˆM#ˆMˆMˆMˆMˆMˆMù‡Mò‡Më‡Mä‡M݇MÖ‡MχMȇMÁ‡Mº‡M³‡M¬‡M¥‡Mž‡M—‡M‡M‰‡M‚‡M{‡Mt‡Mm‡Mf‡M_‡MX‡MQ‡MJ‡MC‡M<‡M5‡M.‡M'‡M ‡M‡M‡M ‡M‡Mý†Mö†Mï†Mè†Má†MÚ†MÓ†M̆MņM¾†M·†M°†M©†M¢†M›†M”†M†M††M†Mx†Mq†Mj†Mc†M\†MU†MN†MG†M@†M9†M2†M+†M$†M†M†M†M†M†Mú…Mó…Mì…Må…MÞ…M×…MÐ…MÉ…MÂ…M»…M´…M­…M¦…MŸ…M˜…M‘…MŠ…Mƒ…M|…Mu…Mn…Mg…M`…MY…MR…MK…MD…M=…M6…M/…M(…M!…M…M…M …M…Mþ„M÷„Mð„Mé„Mâ„MÛ„MÔ„MÍ„MÆ„M¿„M¸„M±„Mª„M£„Mœ„M•„MŽ„M‡„M€„My„Mr„Mk„Md„M]„MV„MO„MH„MA„M:„M3„M,„M%„M„M„M„M „M„MûƒMôƒMíƒMæƒM߃M؃MуMʃMÃM¼ƒMµƒM®ƒM§ƒM ƒM™ƒM’ƒM‹ƒM„ƒM}ƒMvƒMoƒMhƒMaƒMZƒMSƒMLƒMEƒM>ƒM7ƒM0ƒM)ƒM"ƒMƒMƒM ƒMƒMÿ‚Mø‚Mñ‚Mê‚Mã‚MÜ‚MÕ‚M΂MÇ‚MÀ‚M¹‚M²‚M«‚M¤‚M‚M–‚M‚Mˆ‚M‚Mz‚Ms‚Ml‚Me‚M^‚MW‚MP‚MI‚MB‚M;‚M4‚M-‚M&‚M‚M‚M‚M ‚M‚MüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMù€Mò€Më€Mä€MÝ€MÖ€MÏ€MÈ€MÁ€Mº€M³€M¬€M¥€Mž€M—€M€M‰€M‚€M{€Mt€Mm€Mf€M_€MX€MQ€MJ€MC€M<€M5€M.€M'€M €M€M€M €M€MýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMú~Mó~Mì~Må~MÞ~M×~MÐ~MÉ~MÂ~M»~M´~M­~M¦~MŸ~M˜~M‘~MŠ~Mƒ~M|~Mu~Mn~Mg~M`~MY~MR~MK~MD~M=~M6~M/~M(~M!~M~M~M ~M~Mþ}M÷}Mð}Mé}Mâ}MÛ}MÔ}MÍ}MÆ}M¿}M¸}M±}Mª}M£}Mœ}M•}MŽ}M‡}M€}My}Mr}Mk}Md}M]}MV}MO}MH}MA}M:}M3}M,}M%}M}M}M}M }M}Mû|Mô|Mí|Mæ|Mß|MØ|MÑ|MÊ|MÃ|M¼|Mµ|M®|M§|M |M™|M’|M‹|M„|M}|Mv|Mo|Mh|Ma|MZ|MS|ML|ME|M>|M7|M0|M)|M"|M|M|M |M|Mÿ{Mø{Mñ{Mê{Mã{MÜ{MÕ{MÎ{MÇ{MÀ{M¹{M²{M«{M¤{M{M–{M{Mˆ{M{Mz{Ms{Ml{Me{M^{MW{MP{MI{MB{M;{M4{M-{M&{M{M{M{M {M{MüzMõzMîzMçzMàzMÙzMÒzMËzMÄzM½zM¶zM¯zM¨zM¡zMšzM“zMŒzM…zM~zMwzMpzMizMbzM[zMTzMMzMFzM?zM8zM1zM*zM#zMzMzMzMzMzMùyMòyMëyMäyMÝyMÖyMÏyMÈyMÁyMºyM³yM¬yM¥yMžyM—yMyM‰yM‚yM{yMtyMmyMfyM_yMXyMQyMJyMCyMuM7uM0uM)uM"uMuMuM uMuMÿtMøtMñtMêtMãtMÜtMÕtMÎtMÇtMÀtM¹tM²tM«tM¤tMtM–tMtMˆtMtMztMstMltMetM^tMWtMPtMItMBtM;tM4tM-tM&tMtMtMtM tMtMüsMõsMîsMçsMàsMÙsMÒsMËsMÄsM½sM¶sM¯sM¨sM¡sMšsM“sMŒsM…sM~sMwsMpsMisMbsM[sMTsMMsMFsM?sM8sM1sM*sM#sMsMsMsMsMsMùrMòrMërMärMÝrMÖrMÏrMÈrMÁrMºrM³rM¬rM¥rMžrM—rMrM‰rM‚rM{rMtrMmrMfrM_rMXrMQrMJrMCrMnM7nM0nM)nM"nMnMnM nMnMÿmMømMñmMêmMãmMÜmMÕmMÎmMÇmMÀmM¹mM²mM«mM¤mMmM–mMmMˆmMmMzmMsmMlmMemM^mMWmMPmMImMBmM;mM4mM-mM&mMmMmMmM mMmMülMõlMîlMçlMàlMÙlMÒlMËlMÄlM½lM¶lM¯lM¨lM¡lMšlM“lMŒlM…lM~lMwlMplMilMblM[lMTlMMlMFlM?lM8lM1lM*lM#lMlMlMlMlMlMùkMòkMëkMäkMÝkMÖkMÏkMÈkMÁkMºkM³kM¬kM¥kMžkM—kMkM‰kM‚kM{kMtkMmkMfkM_kMXkMQkMJkMCkMgM7gM0gM)gM"gMgMgM gMgMÿfMøfMñfMêfMãfMÜfMÕfMÎfMÇfMÀfM¹fM²fM«fM¤fMfM–fMfMˆfMfMzfMsfMlfMefM^fMWfMPfMIfMBfM;fM4fM-fM&fMfMfMfM fMfMüeMõeMîeMçeMàeMÙeMÒeMËeMÄeM½eM¶eM¯eM¨eM¡eMšeM“eMŒeM…eM~eMweMpeMieMbeM[eMTeMMeMFeM?eM8eM1eM*eM#eMeMeMeMeMeMùdMòdMëdMädMÝdMÖdMÏdMÈdMÁdMºdM³dM¬dM¥dMždM—dMdM‰dM‚dM{dMtdMmdMfdM_dMXdMQdMJdMCdM`M7`M0`M)`M"`M`M`M `M`Mÿ_Mø_Mñ_Mê_Mã_MÜ_MÕ_MÎ_MÇ_MÀ_M¹_M²_M«_M¤_M_M–_M_Mˆ_M_Mz_Ms_Ml_Me_M^_MW_MP_MI_MB_M;_M4_M-_M&_M_M_M_M _M_Mü^Mõ^Mî^Mç^Mà^MÙ^MÒ^MË^MÄ^M½^M¶^M¯^M¨^M¡^Mš^M“^MŒ^M…^M~^Mw^Mp^Mi^Mb^M[^MT^MM^MF^M?^M8^M1^M*^M#^M^M^M^M^M^Mù]Mò]Më]Mä]MÝ]MÖ]MÏ]MÈ]MÁ]Mº]M³]M¬]M¥]Mž]M—]M]M‰]M‚]M{]Mt]Mm]Mf]M_]MX]MQ]MJ]MC]M<]M5]M.]M']M ]M]M]M ]M]Mý\Mö\Mï\Mè\Má\MÚ\MÓ\MÌ\MÅ\M¾\M·\M°\M©\M¢\M›\M”\M\M†\M\Mx\Mq\Mj\Mc\M\\MU\MN\MG\M@\M9\M2\M+\M$\M\M\M\M\M\Mú[Mó[Mì[Må[MÞ[M×[MÐ[MÉ[MÂ[M»[M´[M­[M¦[MŸ[M˜[M‘[MŠ[Mƒ[M|[Mu[Mn[Mg[M`[MY[MR[MK[MD[M=[M6[M/[M([M![M[M[M [M[MþZM÷ZMðZMéZMâZMÛZMÔZMÍZMÆZM¿ZM¸ZM±ZMªZM£ZMœZM•ZMŽZM‡ZM€ZMyZMrZMkZMdZM]ZMVZMOZMHZMAZM:ZM3ZM,ZM%ZMZMZMZM ZMZMûYMôYMíYMæYMßYMØYMÑYMÊYMÃYM¼YMµYM®YM§YM YM™YM’YM‹YM„YM}YMvYMoYMhYMaYMZYMSYMLYMEYM>YM7YM0YM)YM"YMYMYM YMYMÿXMøXMñXMêXMãXMÜXMÕXMÎXMÇXMÀXM¹XM²XM«XM¤XMXM–XMXMˆXMXMzXMsXMlXMeXM^XMWXMPXMIXMBXM;XM4XM-XM&XMXMXMXM XMXMüWMõWMîWMçWMàWMÙWMÒWMËWMÄWM½WM¶WM¯WM¨WM¡WMšWM“WMŒWM…WM~WMwWMpWMiWMbWM[WMTWMMWMFWM?WM8WM1WM*WM#WMWMWMWMWMWMùVMòVMëVMäVMÝVMÖVMÏVMÈVMÁVMºVM³VM¬VM¥VMžVM—VMVM‰VM‚VM{VMtVMmVMfVM_VMXVMQVMJVMCVMRM7RM0RM)RM"RMRMRM RMRMÿQMøQMñQMêQMãQMÜQMÕQMÎQMÇQMÀQM¹QM²QM«QM¤QMQM–QMQMˆQMQMzQMsQMlQMeQM^QMWQMPQMIQMBQM;QM4QM-QM&QMQMQMQM QMQMüPMõPMîPMçPMàPMÙPMÒPMËPMÄPM½PM¶PM¯PM¨PM¡PMšPM“PMŒPM…PM~PMwPMpPMiPMbPM[PMTPMMPMFPM?PM8PM1PM*PM#PMPMPMPMPMPMùOMòOMëOMäOMÝOMÖOMÏOMÈOMÁOMºOM³OM¬OM¥OMžOM—OMOM‰OM‚OM{OMtOMmOMfOM_OMXOMQOMJOMCOMKM7KM0KM)KM"KMKMKM KMKMÿJMøJMñJMêJMãJMÜJMÕJMÎJMÇJMÀJM¹JM²JM«JM¤JMJM–JMJMˆJMJMzJMsJMlJMeJM^JMWJMPJMIJMBJM;JM4JM-JM&JMJMJMJM JMJMüIMõIMîIMçIMàIMÙIMÒIMËIMÄIM½IM¶IM¯IM¨IM¡IMšIM“IMŒIM…IM~IMwIMpIMiIMbIM[IMTIMMIMFIM?IM8IM1IM*IM#IMIMIMIMIMIMùHMòHMëHMäHMÝHMÖHMÏHMÈHMÁHMºHM³HM¬HM¥HMžHM—HMHM‰HM‚HM{HMtHMmHMfHM_HMXHMQHMJHMCHMDM7DM0DM)DM"DMDMDM DMDMÿCMøCMñCMêCMãCMÜCMÕCMÎCMÇCMÀCM¹CM²CM«CM¤CMCM–CMCMˆCMCMzCMsCMlCMeCM^CMWCMPCMICMBCM;CM4CM-CM&CMCMCMCM CMCMüBMõBMîBMçBMàBMÙBMÒBMËBMÄBM½BM¶BM¯BM¨BM¡BMšBM“BMŒBM…BM~BMwBMpBMiBMbBM[BMTBMMBMFBM?BM8BM1BM*BM#BMBMBMBMBMBMùAMòAMëAMäAMÝAMÖAMÏAMÈAMÁAMºAM³AM¬AM¥AMžAM—AMAM‰AM‚AM{AMtAMmAMfAM_AMXAMQAMJAMCAMM÷>Mð>Mé>Mâ>MÛ>MÔ>MÍ>MÆ>M¿>M¸>M±>Mª>M£>Mœ>M•>MŽ>M‡>M€>My>Mr>Mk>Md>M]>MV>MO>MH>MA>M:>M3>M,>M%>M>M>M>M >M>Mû=Mô=Mí=Mæ=Mß=MØ=MÑ=MÊ=MÃ=M¼=Mµ=M®=M§=M =M™=M’=M‹=M„=M}=Mv=Mo=Mh=Ma=MZ=MS=ML=ME=M>=M7=M0=M)=M"=M=M=M =M=Mÿ6M76M06M)6M"6M6M6M 6M6Mÿ5Mø5Mñ5Mê5Mã5MÜ5MÕ5MÎ5MÇ5MÀ5M¹5M²5M«5M¤5M5M–5M5Mˆ5M5Mz5Ms5Ml5Me5M^5MW5MP5MI5MB5M;5M45M-5M&5M5M5M5M 5M5Mü4Mõ4Mî4Mç4Mà4MÙ4MÒ4MË4MÄ4M½4M¶4M¯4M¨4M¡4Mš4M“4MŒ4M…4M~4Mw4Mp4Mi4Mb4M[4MT4MM4MF4M?4M84M14M*4M#4M4M4M4M4M4Mù3Mò3Më3Mä3MÝ3MÖ3MÏ3MÈ3MÁ3Mº3M³3M¬3M¥3Mž3M—3M3M‰3M‚3M{3Mt3Mm3Mf3M_3MX3MQ3MJ3MC3M<3M53M.3M'3M 3M3M3M 3M3Mý2Mö2Mï2Mè2Má2MÚ2MÓ2MÌ2MÅ2M¾2M·2M°2M©2M¢2M›2M”2M2M†2M2Mx2Mq2Mj2Mc2M\2MU2MN2MG2M@2M92M22M+2M$2M2M2M2M2M2Mú1Mó1Mì1Må1MÞ1M×1MÐ1MÉ1MÂ1M»1M´1M­1M¦1MŸ1M˜1M‘1MŠ1Mƒ1M|1Mu1Mn1Mg1M`1MY1MR1MK1MD1M=1M61M/1M(1M!1M1M1M 1M1Mþ0M÷0Mð0Mé0Mâ0MÛ0MÔ0MÍ0MÆ0M¿0M¸0M±0Mª0M£0Mœ0M•0MŽ0M‡0M€0My0Mr0Mk0Md0M]0MV0MO0MH0MA0M:0M30M,0M%0M0M0M0M 0M0Mû/Mô/Mí/Mæ/Mß/MØ/MÑ/MÊ/MÃ/M¼/Mµ/M®/M§/M /M™/M’/M‹/M„/M}/Mv/Mo/Mh/Ma/MZ/MS/ML/ME/M>/M7/M0/M)/M"/M/M/M /M/Mÿ.Mø.Mñ.Mê.Mã.MÜ.MÕ.MÎ.MÇ.MÀ.M¹.M².M«.M¤.M.M–.M.Mˆ.M.Mz.Ms.Ml.Me.M^.MW.MP.MI.MB.M;.M4.M-.M&.M.M.M.M .M.Mü-Mõ-Mî-Mç-Mà-MÙ-MÒ-MË-MÄ-M½-M¶-M¯-M¨-M¡-Mš-M“-MŒ-M…-M~-Mw-Mp-Mi-Mb-M[-MT-MM-MF-M?-M8-M1-M*-M#-M-M-M-M-M-Mù,Mò,Më,Mä,MÝ,MÖ,MÏ,MÈ,MÁ,Mº,M³,M¬,M¥,Mž,M—,M,M‰,M‚,M{,Mt,Mm,Mf,M_,MX,MQ,MJ,MC,M<,M5,M.,M',M ,M,M,M ,M,Mý+Mö+Mï+Mè+Má+MÚ+MÓ+MÌ+MÅ+M¾+M·+M°+M©+M¢+M›+M”+M+M†+M+Mx+Mq+Mj+Mc+M\+MU+MN+MG+M@+M9+M2+M++M$+M+M+M+M+M+Mú*Mó*Mì*Må*MÞ*M×*MÐ*MÉ*MÂ*M»*M´*M­*M¦*MŸ*M˜*M‘*MŠ*Mƒ*M|*Mu*Mn*Mg*M`*MY*MR*MK*MD*M=*M6*M/*M(*M!*M*M*M *M*Mþ)M÷)Mð)Mé)Mâ)MÛ)MÔ)MÍ)MÆ)M¿)M¸)M±)Mª)M£)Mœ)M•)MŽ)M‡)M€)My)Mr)Mk)Md)M])MV)MO)MH)MA)M:)M3)M,)M%)M)M)M)M )M)Mû(Mô(Mí(Mæ(Mß(MØ(MÑ(MÊ(MÃ(M¼(Mµ(M®(M§(M (M™(M’(M‹(M„(M}(Mv(Mo(Mh(Ma(MZ(MS(ML(ME(M>(M7(M0(M)(M"(M(M(M (M(Mÿ'Mø'Mñ'Mê'Mã'MÜ'MÕ'MÎ'MÇ'MÀ'M¹'M²'M«'M¤'M'M–'M'Mˆ'M'Mz'Ms'Ml'Me'M^'MW'MP'MI'MB'M;'M4'M-'M&'M'M'M'M 'M'Mü&Mõ&Mî&Mç&Mà&MÙ&MÒ&MË&MÄ&M½&M¶&M¯&M¨&M¡&Mš&M“&MŒ&M…&M~&Mw&Mp&Mi&Mb&M[&MT&MM&MF&M?&M8&M1&M*&M#&M&M&M&M&M&Mù%Mò%Më%Mä%MÝ%MÖ%MÏ%MÈ%MÁ%Mº%M³%M¬%M¥%Mž%M—%M%M‰%M‚%M{%Mt%Mm%Mf%M_%MX%MQ%MJ%MC%M<%M5%M.%M'%M %M%M%M %M%Mý$Mö$Mï$Mè$Má$MÚ$MÓ$MÌ$MÅ$M¾$M·$M°$M©$M¢$M›$M”$M$M†$M$Mx$Mq$Mj$Mc$M\$MU$MN$MG$M@$M9$M2$M+$M$$M$M$M$M$M$Mú#Mó#Mì#Må#MÞ#M×#MÐ#MÉ#MÂ#M»#M´#M­#M¦#MŸ#M˜#M‘#MŠ#Mƒ#M|#Mu#Mn#Mg#M`#MY#MR#MK#MD#M=#M6#M/#M(#M!#M#M#M #M#Mþ"M÷"Mð"Mé"Mâ"MÛ"MÔ"MÍ"MÆ"M¿"M¸"M±"Mª"M£"Mœ"M•"MŽ"M‡"M€"My"Mr"Mk"Md"M]"MV"MO"MH"MA"M:"M3"M,"M%"M"M"M"M "M"Mû!Mô!Mí!Mæ!Mß!MØ!MÑ!MÊ!MÃ!M¼!Mµ!M®!M§!M !M™!M’!M‹!M„!M}!Mv!Mo!Mh!Ma!MZ!MS!ML!ME!M>!M7!M0!M)!M"!M!M!M !M!Mÿ Mø Mñ Mê Mã MÜ MÕ MÎ MÇ MÀ M¹ M² M« M¤ M M– M Mˆ M Mz Ms Ml Me M^ MW MP MI MB M; M4 M- M& M M M M M MüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúMóMìMåMÞM×MÐMÉMÂM»M´M­M¦MŸM˜M‘MŠMƒM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMþM÷MðMéMâMÛMÔMÍMÆM¿M¸M±MªM£MœM•MŽM‡M€MyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMûMôMíMæMßMØMÑMÊMÃM¼MµM®M§M M™M’M‹M„M}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúMóMìMåMÞM×MÐMÉMÂM»M´M­M¦MŸM˜M‘MŠMƒM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMþM÷MðMéMâMÛMÔMÍMÆM¿M¸M±MªM£MœM•MŽM‡M€MyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMûMôMíMæMßMØMÑMÊMÃM¼MµM®M§M M™M’M‹M„M}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúMóMìMåMÞM×MÐMÉMÂM»M´M­M¦MŸM˜M‘MŠMƒM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMþ M÷ Mð Mé Mâ MÛ MÔ MÍ MÆ M¿ M¸ M± Mª M£ Mœ M• MŽ M‡ M€ My Mr Mk Md M] MV MO MH MA M: M3 M, M% M M M M M Mû Mô Mí Mæ Mß MØ MÑ MÊ Mà M¼ Mµ M® M§ M  M™ M’ M‹ M„ M} Mv Mo Mh Ma MZ MS ML ME M> M7 M0 M) M" M M M M Mÿ Mø Mñ Mê Mã MÜ MÕ MÎ MÇ MÀ M¹ M² M« M¤ M M– M Mˆ M Mz Ms Ml Me M^ MW MP MI MB M; M4 M- M& M M M M M Mü Mõ Mî Mç Mà MÙ MÒ MË MÄ M½ M¶ M¯ M¨ M¡ Mš M“ MŒ M… M~ Mw Mp Mi Mb M[ MT MM MF M? M8 M1 M* M# M M M M M Mù Mò Më Mä MÝ MÖ MÏ MÈ MÁ Mº M³ M¬ M¥ Mž M— M M‰ M‚ M{ Mt Mm Mf M_ MX MQ MJ MC M< M5 M. M' M M M M M MýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúMóMìMåMÞM×MÐMÉMÂM»M´M­M¦MŸM˜M‘MŠMƒM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMþM÷MðMéMâMÛMÔMÍMÆM¿M¸M±MªM£MœM•MŽM‡M€MyMrMkMdM]MVMOMHMAM:M3M,M%MMMM MMûMôMíMæMßMØMÑMÊMÃM¼MµM®M§M M™M’M‹M„M}MvMoMhMaMZMSMLMEM>M7M0M)M"MMM MMÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCM<M5M.M'M MMM MMýMöMïMèMáMÚMÓMÌMÅM¾M·M°M©M¢M›M”MM†MMxMqMjMcM\MUMNMGM@M9M2M+M$MMMMMMúMóMìMåMÞM×MÐMÉMÂM»M´M­M¦MŸM˜M‘MŠMƒM|MuMnMgM`MYMRMKMDM=M6M/M(M!MMM MMþÿL÷ÿLðÿLéÿLâÿLÛÿLÔÿLÍÿLÆÿL¿ÿL¸ÿL±ÿLªÿL£ÿLœÿL•ÿLŽÿL‡ÿL€ÿLyÿLrÿLkÿLdÿL]ÿLVÿLOÿLHÿLAÿL:ÿL3ÿL,ÿL%ÿLÿLÿLÿL ÿLÿLûþLôþLíþLæþLßþLØþLÑþLÊþLÃþL¼þLµþL®þL§þL þL™þL’þL‹þL„þL}þLvþLoþLhþLaþLZþLSþLLþLEþL>þL7þL0þL)þL"þLþLþL þLþLÿýLøýLñýLêýLãýLÜýLÕýLÎýLÇýLÀýL¹ýL²ýL«ýL¤ýLýL–ýLýLˆýLýLzýLsýLlýLeýL^ýLWýLPýLIýLBýL;ýL4ýL-ýL&ýLýLýLýL ýLýLüüLõüLîüLçüLàüLÙüLÒüLËüLÄüL½üL¶üL¯üL¨üL¡üLšüL“üLŒüL…üL~üLwüLpüLiüLbüL[üLTüLMüLFüL?üL8üL1üL*üL#üLüLüLüLüLüLùûLòûLëûLäûLÝûLÖûLÏûLÈûLÁûLºûL³ûL¬ûL¥ûLžûL—ûLûL‰ûL‚ûL{ûLtûLmûLfûL_ûLXûLQûLJûLCûL<ûL5ûL.ûL'ûL ûLûLûL ûLûLýúLöúLïúLèúLáúLÚúLÓúLÌúLÅúL¾úL·úL°úL©úL¢úL›úL”úLúL†úLúLxúLqúLjúLcúL\úLUúLNúLGúL@úL9úL2úL+úL$úLúLúLúLúLúLúùLóùLìùLåùLÞùL×ùLÐùLÉùLÂùL»ùL´ùL­ùL¦ùLŸùL˜ùL‘ùLŠùLƒùL|ùLuùLnùLgùL`ùLYùLRùLKùLDùL=ùL6ùL/ùL(ùL!ùLùLùL ùLùLþøL÷øLðøLéøLâøLÛøLÔøLÍøLÆøL¿øL¸øL±øLªøL£øLœøL•øLŽøL‡øL€øLyøLrøLkøLdøL]øLVøLOøLHøLAøL:øL3øL,øL%øLøLøLøL øLøLû÷Lô÷Lí÷Læ÷Lß÷LØ÷LÑ÷LÊ÷LÃ÷L¼÷Lµ÷L®÷L§÷L ÷L™÷L’÷L‹÷L„÷L}÷Lv÷Lo÷Lh÷La÷LZ÷LS÷LL÷LE÷L>÷L7÷L0÷L)÷L"÷L÷L÷L ÷L÷LÿöLøöLñöLêöLãöLÜöLÕöLÎöLÇöLÀöL¹öL²öL«öL¤öLöL–öLöLˆöLöLzöLsöLlöLeöL^öLWöLPöLIöLBöL;öL4öL-öL&öLöLöLöL öLöLüõLõõLîõLçõLàõLÙõLÒõLËõLÄõL½õL¶õL¯õL¨õL¡õLšõL“õLŒõL…õL~õLwõLpõLiõLbõL[õLTõLMõLFõL?õL8õL1õL*õL#õLõLõLõLõLõLùôLòôLëôLäôLÝôLÖôLÏôLÈôLÁôLºôL³ôL¬ôL¥ôLžôL—ôLôL‰ôL‚ôL{ôLtôLmôLfôL_ôLXôLQôLJôLCôL<ôL5ôL.ôL'ôL ôLôLôL ôLôLýóLöóLïóLèóLáóLÚóLÓóLÌóLÅóL¾óL·óL°óL©óL¢óL›óL”óLóL†óLóLxóLqóLjóLcóL\óLUóLNóLGóL@óL9óL2óL+óL$óLóLóLóLóLóLúòLóòLìòLåòLÞòL×òLÐòLÉòLÂòL»òL´òL­òL¦òLŸòL˜òL‘òLŠòLƒòL|òLuòLnòLgòL`òLYòLRòLKòLDòL=òL6òL/òL(òL!òLòLòL òLòLþñL÷ñLðñLéñLâñLÛñLÔñLÍñLÆñL¿ñL¸ñL±ñLªñL£ñLœñL•ñLŽñL‡ñL€ñLyñLrñLkñLdñL]ñLVñLOñLHñLAñL:ñL3ñL,ñL%ñLñLñLñL ñLñLûðLôðLíðLæðLßðLØðLÑðLÊðLÃðL¼ðLµðL®ðL§ðL ðL™ðL’ðL‹ðL„ðL}ðLvðLoðLhðLaðLZðLSðLLðLEðL>ðL7ðL0ðL)ðL"ðLðLðL ðLðLÿïLøïLñïLêïLãïLÜïLÕïLÎïLÇïLÀïL¹ïL²ïL«ïL¤ïLïL–ïLïLˆïLïLzïLsïLlïLeïL^ïLWïLPïLIïLBïL;ïL4ïL-ïL&ïLïLïLïL ïLïLüîLõîLîîLçîLàîLÙîLÒîLËîLÄîL½îL¶îL¯îL¨îL¡îLšîL“îLŒîL…îL~îLwîLpîLiîLbîL[îLTîLMîLFîL?îL8îL1îL*îL#îLîLîLîLîLîLùíLòíLëíLäíLÝíLÖíLÏíLÈíLÁíLºíL³íL¬íL¥íLžíL—íLíL‰íL‚íL{íLtíLmíLfíL_íLXíLQíLJíLCíL<íL5íL.íL'íL íLíLíL íLíLýìLöìLïìLèìLáìLÚìLÓìLÌìLÅìL¾ìL·ìL°ìL©ìL¢ìL›ìL”ìLìL†ìLìLxìLqìLjìLcìL\ìLUìLNìLGìL@ìL9ìL2ìL+ìL$ìLìLìLìLìLìLúëLóëLìëLåëLÞëL×ëLÐëLÉëLÂëL»ëL´ëL­ëL¦ëLŸëL˜ëL‘ëLŠëLƒëL|ëLuëLnëLgëL`ëLYëLRëLKëLDëL=ëL6ëL/ëL(ëL!ëLëLëL ëLëLþêL÷êLðêLéêLâêLÛêLÔêLÍêLÆêL¿êL¸êL±êLªêL£êLœêL•êLŽêL‡êL€êLyêLrêLkêLdêL]êLVêLOêLHêLAêL:êL3êL,êL%êLêLêLêL êLêLûéLôéLíéLæéLßéLØéLÑéLÊéLÃéL¼éLµéL®éL§éL éL™éL’éL‹éL„éL}éLvéLoéLhéLaéLZéLSéLLéLEéL>éL7éL0éL)éL"éLéLéL éLéLÿèLøèLñèLêèLãèLÜèLÕèLÎèLÇèLÀèL¹èL²èL«èL¤èLèL–èLèLˆèLèLzèLsèLlèLeèL^èLWèLPèLIèLBèL;èL4èL-èL&èLèLèLèL èLèLüçLõçLîçLççLàçLÙçLÒçLËçLÄçL½çL¶çL¯çL¨çL¡çLšçL“çLŒçL…çL~çLwçLpçLiçLbçL[çLTçLMçLFçL?çL8çL1çL*çL#çLçLçLçLçLçLùæLòæLëæLäæLÝæLÖæLÏæLÈæLÁæLºæL³æL¬æL¥æLžæL—æLæL‰æL‚æL{æLtæLmæLfæL_æLXæLQæLJæLCæL<æL5æL.æL'æL æLæLæL æLæLýåLöåLïåLèåLáåLÚåLÓåLÌåLÅåL¾åL·åL°åL©åL¢åL›åL”åLåL†åLåLxåLqåLjåLcåL\åLUåLNåLGåL@åL9åL2åL+åL$åLåLåLåLåLåLúäLóäLìäLåäLÞäL×äLÐäLÉäLÂäL»äL´äL­äL¦äLŸäL˜äL‘äLŠäLƒäL|äLuäLnäLgäL`äLYäLRäLKäLDäL=äL6äL/äL(äL!äLäLäL äLäLþãL÷ãLðãLéãLâãLÛãLÔãLÍãLÆãL¿ãL¸ãL±ãLªãL£ãLœãL•ãLŽãL‡ãL€ãLyãLrãLkãLdãL]ãLVãLOãLHãLAãL:ãL3ãL,ãL%ãLãLãLãL ãLãLûâLôâLíâLæâLßâLØâLÑâLÊâLÃâL¼âLµâL®âL§âL âL™âL’âL‹âL„âL}âLvâLoâLhâLaâLZâLSâLLâLEâL>âL7âL0âL)âL"âLâLâL âLâLÿáLøáLñáLêáLãáLÜáLÕáLÎáLÇáLÀáL¹áL²áL«áL¤áLáL–áLáLˆáLáLzáLsáLláLeáL^áLWáLPáLIáLBáL;áL4áL-áL&áLáLáLáL áLáLüàLõàLîàLçàLààLÙàLÒàLËàLÄàL½àL¶àL¯àL¨àL¡àLšàL“àLŒàL…àL~àLwàLpàLiàLbàL[àLTàLMàLFàL?àL8àL1àL*àL#àLàLàLàLàLàLùßLòßLëßLäßLÝßLÖßLÏßLÈßLÁßLºßL³ßL¬ßL¥ßLžßL—ßLßL‰ßL‚ßL{ßLtßLmßLfßL_ßLXßLQßLJßLCßL<ßL5ßL.ßL'ßL ßLßLßL ßLßLýÞLöÞLïÞLèÞLáÞLÚÞLÓÞLÌÞLÅÞL¾ÞL·ÞL°ÞL©ÞL¢ÞL›ÞL”ÞLÞL†ÞLÞLxÞLqÞLjÞLcÞL\ÞLUÞLNÞLGÞL@ÞL9ÞL2ÞL+ÞL$ÞLÞLÞLÞLÞLÞLúÝLóÝLìÝLåÝLÞÝL×ÝLÐÝLÉÝLÂÝL»ÝL´ÝL­ÝL¦ÝLŸÝL˜ÝL‘ÝLŠÝLƒÝL|ÝLuÝLnÝLgÝL`ÝLYÝLRÝLKÝLDÝL=ÝL6ÝL/ÝL(ÝL!ÝLÝLÝL ÝLÝLþÜL÷ÜLðÜLéÜLâÜLÛÜLÔÜLÍÜLÆÜL¿ÜL¸ÜL±ÜLªÜL£ÜLœÜL•ÜLŽÜL‡ÜL€ÜLyÜLrÜLkÜLdÜL]ÜLVÜLOÜLHÜLAÜL:ÜL3ÜL,ÜL%ÜLÜLÜLÜL ÜLÜLûÛLôÛLíÛLæÛLßÛLØÛLÑÛLÊÛLÃÛL¼ÛLµÛL®ÛL§ÛL ÛL™ÛL’ÛL‹ÛL„ÛL}ÛLvÛLoÛLhÛLaÛLZÛLSÛLLÛLEÛL>ÛL7ÛL0ÛL)ÛL"ÛLÛLÛL ÛLÛLÿÚLøÚLñÚLêÚLãÚLÜÚLÕÚLÎÚLÇÚLÀÚL¹ÚL²ÚL«ÚL¤ÚLÚL–ÚLÚLˆÚLÚLzÚLsÚLlÚLeÚL^ÚLWÚLPÚLIÚLBÚL;ÚL4ÚL-ÚL&ÚLÚLÚLÚL ÚLÚLüÙLõÙLîÙLçÙLàÙLÙÙLÒÙLËÙLÄÙL½ÙL¶ÙL¯ÙL¨ÙL¡ÙLšÙL“ÙLŒÙL…ÙL~ÙLwÙLpÙLiÙLbÙL[ÙLTÙLMÙLFÙL?ÙL8ÙL1ÙL*ÙL#ÙLÙLÙLÙLÙLÙLùØLòØLëØLäØLÝØLÖØLÏØLÈØLÁØLºØL³ØL¬ØL¥ØLžØL—ØLØL‰ØL‚ØL{ØLtØLmØLfØL_ØLXØLQØLJØLCØL<ØL5ØL.ØL'ØL ØLØLØL ØLØLý×Lö×Lï×Lè×Lá×LÚ×LÓ×LÌ×LÅ×L¾×L·×L°×L©×L¢×L›×L”×L×L†×L×Lx×Lq×Lj×Lc×L\×LU×LN×LG×L@×L9×L2×L+×L$×L×L×L×L×L×LúÖLóÖLìÖLåÖLÞÖL×ÖLÐÖLÉÖLÂÖL»ÖL´ÖL­ÖL¦ÖLŸÖL˜ÖL‘ÖLŠÖLƒÖL|ÖLuÖLnÖLgÖL`ÖLYÖLRÖLKÖLDÖL=ÖL6ÖL/ÖL(ÖL!ÖLÖLÖL ÖLÖLþÕL÷ÕLðÕLéÕLâÕLÛÕLÔÕLÍÕLÆÕL¿ÕL¸ÕL±ÕLªÕL£ÕLœÕL•ÕLŽÕL‡ÕL€ÕLyÕLrÕLkÕLdÕL]ÕLVÕLOÕLHÕLAÕL:ÕL3ÕL,ÕL%ÕLÕLÕLÕL ÕLÕLûÔLôÔLíÔLæÔLßÔLØÔLÑÔLÊÔLÃÔL¼ÔLµÔL®ÔL§ÔL ÔL™ÔL’ÔL‹ÔL„ÔL}ÔLvÔLoÔLhÔLaÔLZÔLSÔLLÔLEÔL>ÔL7ÔL0ÔL)ÔL"ÔLÔLÔL ÔLÔLÿÓLøÓLñÓLêÓLãÓLÜÓLÕÓLÎÓLÇÓLÀÓL¹ÓL²ÓL«ÓL¤ÓLÓL–ÓLÓLˆÓLÓLzÓLsÓLlÓLeÓL^ÓLWÓLPÓLIÓLBÓL;ÓL4ÓL-ÓL&ÓLÓLÓLÓL ÓLÓLüÒLõÒLîÒLçÒLàÒLÙÒLÒÒLËÒLÄÒL½ÒL¶ÒL¯ÒL¨ÒL¡ÒLšÒL“ÒLŒÒL…ÒL~ÒLwÒLpÒLiÒLbÒL[ÒLTÒLMÒLFÒL?ÒL8ÒL1ÒL*ÒL#ÒLÒLÒLÒLÒLÒLùÑLòÑLëÑLäÑLÝÑLÖÑLÏÑLÈÑLÁÑLºÑL³ÑL¬ÑL¥ÑLžÑL—ÑLÑL‰ÑL‚ÑL{ÑLtÑLmÑLfÑL_ÑLXÑLQÑLJÑLCÑL<ÑL5ÑL.ÑL'ÑL ÑLÑLÑL ÑLÑLýÐLöÐLïÐLèÐLáÐLÚÐLÓÐLÌÐLÅÐL¾ÐL·ÐL°ÐL©ÐL¢ÐL›ÐL”ÐLÐL†ÐLÐLxÐLqÐLjÐLcÐL\ÐLUÐLNÐLGÐL@ÐL9ÐL2ÐL+ÐL$ÐLÐLÐLÐLÐLÐLúÏLóÏLìÏLåÏLÞÏL×ÏLÐÏLÉÏLÂÏL»ÏL´ÏL­ÏL¦ÏLŸÏL˜ÏL‘ÏLŠÏLƒÏL|ÏLuÏLnÏLgÏL`ÏLYÏLRÏLKÏLDÏL=ÏL6ÏL/ÏL(ÏL!ÏLÏLÏL ÏLÏLþÎL÷ÎLðÎLéÎLâÎLÛÎLÔÎLÍÎLÆÎL¿ÎL¸ÎL±ÎLªÎL£ÎLœÎL•ÎLŽÎL‡ÎL€ÎLyÎLrÎLkÎLdÎL]ÎLVÎLOÎLHÎLAÎL:ÎL3ÎL,ÎL%ÎLÎLÎLÎL ÎLÎLûÍLôÍLíÍLæÍLßÍLØÍLÑÍLÊÍLÃÍL¼ÍLµÍL®ÍL§ÍL ÍL™ÍL’ÍL‹ÍL„ÍL}ÍLvÍLoÍLhÍLaÍLZÍLSÍLLÍLEÍL>ÍL7ÍL0ÍL)ÍL"ÍLÍLÍL ÍLÍLÿÌLøÌLñÌLêÌLãÌLÜÌLÕÌLÎÌLÇÌLÀÌL¹ÌL²ÌL«ÌL¤ÌLÌL–ÌLÌLˆÌLÌLzÌLsÌLlÌLeÌL^ÌLWÌLPÌLIÌLBÌL;ÌL4ÌL-ÌL&ÌLÌLÌLÌL ÌLÌLüËLõËLîËLçËLàËLÙËLÒËLËËLÄËL½ËL¶ËL¯ËL¨ËL¡ËLšËL“ËLŒËL…ËL~ËLwËLpËLiËLbËL[ËLTËLMËLFËL?ËL8ËL1ËL*ËL#ËLËLËLËLËLËLùÊLòÊLëÊLäÊLÝÊLÖÊLÏÊLÈÊLÁÊLºÊL³ÊL¬ÊL¥ÊLžÊL—ÊLÊL‰ÊL‚ÊL{ÊLtÊLmÊLfÊL_ÊLXÊLQÊLJÊLCÊL<ÊL5ÊL.ÊL'ÊL ÊLÊLÊL ÊLÊLýÉLöÉLïÉLèÉLáÉLÚÉLÓÉLÌÉLÅÉL¾ÉL·ÉL°ÉL©ÉL¢ÉL›ÉL”ÉLÉL†ÉLÉLxÉLqÉLjÉLcÉL\ÉLUÉLNÉLGÉL@ÉL9ÉL2ÉL+ÉL$ÉLÉLÉLÉLÉLÉLúÈLóÈLìÈLåÈLÞÈL×ÈLÐÈLÉÈLÂÈL»ÈL´ÈL­ÈL¦ÈLŸÈL˜ÈL‘ÈLŠÈLƒÈL|ÈLuÈLnÈLgÈL`ÈLYÈLRÈLKÈLDÈL=ÈL6ÈL/ÈL(ÈL!ÈLÈLÈL ÈLÈLþÇL÷ÇLðÇLéÇLâÇLÛÇLÔÇLÍÇLÆÇL¿ÇL¸ÇL±ÇLªÇL£ÇLœÇL•ÇLŽÇL‡ÇL€ÇLyÇLrÇLkÇLdÇL]ÇLVÇLOÇLHÇLAÇL:ÇL3ÇL,ÇL%ÇLÇLÇLÇL ÇLÇLûÆLôÆLíÆLæÆL߯LØÆLÑÆLÊÆLÃÆL¼ÆLµÆL®ÆL§ÆL ÆL™ÆL’ÆL‹ÆL„ÆL}ÆLvÆLoÆLhÆLaÆLZÆLSÆLLÆLEÆL>ÆL7ÆL0ÆL)ÆL"ÆLÆLÆL ÆLÆLÿÅLøÅLñÅLêÅLãÅLÜÅLÕÅLÎÅLÇÅLÀÅL¹ÅL²ÅL«ÅL¤ÅLÅL–ÅLÅLˆÅLÅLzÅLsÅLlÅLeÅL^ÅLWÅLPÅLIÅLBÅL;ÅL4ÅL-ÅL&ÅLÅLÅLÅL ÅLÅLüÄLõÄLîÄLçÄLàÄLÙÄLÒÄLËÄLÄÄL½ÄL¶ÄL¯ÄL¨ÄL¡ÄLšÄL“ÄLŒÄL…ÄL~ÄLwÄLpÄLiÄLbÄL[ÄLTÄLMÄLFÄL?ÄL8ÄL1ÄL*ÄL#ÄLÄLÄLÄLÄLÄLùÃLòÃLëÃLäÃLÝÃLÖÃLÏÃLÈÃLÁÃLºÃL³ÃL¬ÃL¥ÃLžÃL—ÃLÃL‰ÃL‚ÃL{ÃLtÃLmÃLfÃL_ÃLXÃLQÃLJÃLCÃL<ÃL5ÃL.ÃL'ÃL ÃLÃLÃL ÃLÃLýÂLöÂLïÂLèÂLáÂLÚÂLÓÂLÌÂLÅÂL¾ÂL·ÂL°ÂL©ÂL¢ÂL›ÂL”ÂLÂL†ÂLÂLxÂLqÂLjÂLcÂL\ÂLUÂLNÂLGÂL@ÂL9ÂL2ÂL+ÂL$ÂLÂLÂLÂLÂLÂLúÁLóÁLìÁLåÁLÞÁL×ÁLÐÁLÉÁLÂÁL»ÁL´ÁL­ÁL¦ÁLŸÁL˜ÁL‘ÁLŠÁLƒÁL|ÁLuÁLnÁLgÁL`ÁLYÁLRÁLKÁLDÁL=ÁL6ÁL/ÁL(ÁL!ÁLÁLÁL ÁLÁLþÀL÷ÀLðÀLéÀLâÀLÛÀLÔÀLÍÀLÆÀL¿ÀL¸ÀL±ÀLªÀL£ÀLœÀL•ÀLŽÀL‡ÀL€ÀLyÀLrÀLkÀLdÀL]ÀLVÀLOÀLHÀLAÀL:ÀL3ÀL,ÀL%ÀLÀLÀLÀL ÀLÀLû¿Lô¿Lí¿Læ¿Lß¿LØ¿LÑ¿LÊ¿LÿL¼¿Lµ¿L®¿L§¿L ¿L™¿L’¿L‹¿L„¿L}¿Lv¿Lo¿Lh¿La¿LZ¿LS¿LL¿LE¿L>¿L7¿L0¿L)¿L"¿L¿L¿L ¿L¿Lÿ¾Lø¾Lñ¾Lê¾Lã¾LܾLÕ¾LξLǾLÀ¾L¹¾L²¾L«¾L¤¾L¾L–¾L¾Lˆ¾L¾Lz¾Ls¾Ll¾Le¾L^¾LW¾LP¾LI¾LB¾L;¾L4¾L-¾L&¾L¾L¾L¾L ¾L¾Lü½Lõ½Lî½Lç½Là½LÙ½LÒ½L˽LĽL½½L¶½L¯½L¨½L¡½Lš½L“½LŒ½L…½L~½Lw½Lp½Li½Lb½L[½LT½LM½LF½L?½L8½L1½L*½L#½L½L½L½L½L½Lù¼Lò¼Lë¼Lä¼LݼLÖ¼LϼLȼLÁ¼Lº¼L³¼L¬¼L¥¼Lž¼L—¼L¼L‰¼L‚¼L{¼Lt¼Lm¼Lf¼L_¼LX¼LQ¼LJ¼LC¼L<¼L5¼L.¼L'¼L ¼L¼L¼L ¼L¼Lý»Lö»Lï»Lè»Lá»LÚ»LÓ»LÌ»LÅ»L¾»L·»L°»L©»L¢»L›»L”»L»L†»L»Lx»Lq»Lj»Lc»L\»LU»LN»LG»L@»L9»L2»L+»L$»L»L»L»L»L»LúºLóºLìºLåºLÞºL׺LкLɺLºL»ºL´ºL­ºL¦ºLŸºL˜ºL‘ºLŠºLƒºL|ºLuºLnºLgºL`ºLYºLRºLKºLDºL=ºL6ºL/ºL(ºL!ºLºLºL ºLºLþ¹L÷¹Lð¹Lé¹Lâ¹LÛ¹LÔ¹L͹LƹL¿¹L¸¹L±¹Lª¹L£¹Lœ¹L•¹L޹L‡¹L€¹Ly¹Lr¹Lk¹Ld¹L]¹LV¹LO¹LH¹LA¹L:¹L3¹L,¹L%¹L¹L¹L¹L ¹L¹Lû¸Lô¸Lí¸Læ¸L߸LظLѸLʸLøL¼¸Lµ¸L®¸L§¸L ¸L™¸L’¸L‹¸L„¸L}¸Lv¸Lo¸Lh¸La¸LZ¸LS¸LL¸LE¸L>¸L7¸L0¸L)¸L"¸L¸L¸L ¸L¸Lÿ·Lø·Lñ·Lê·Lã·LÜ·LÕ·LηLÇ·LÀ·L¹·L²·L«·L¤·L·L–·L·Lˆ·L·Lz·Ls·Ll·Le·L^·LW·LP·LI·LB·L;·L4·L-·L&·L·L·L·L ·L·Lü¶Lõ¶Lî¶Lç¶Là¶LÙ¶LÒ¶L˶LĶL½¶L¶¶L¯¶L¨¶L¡¶Lš¶L“¶LŒ¶L…¶L~¶Lw¶Lp¶Li¶Lb¶L[¶LT¶LM¶LF¶L?¶L8¶L1¶L*¶L#¶L¶L¶L¶L¶L¶LùµLòµLëµLäµLݵLÖµLϵLȵLÁµLºµL³µL¬µL¥µLžµL—µLµL‰µL‚µL{µLtµLmµLfµL_µLXµLQµLJµLCµL<µL5µL.µL'µL µLµLµL µLµLý´Lö´Lï´Lè´Lá´LÚ´LÓ´LÌ´LÅ´L¾´L·´L°´L©´L¢´L›´L”´L´L†´L´Lx´Lq´Lj´Lc´L\´LU´LN´LG´L@´L9´L2´L+´L$´L´L´L´L´L´Lú³Ló³Lì³Lå³LÞ³L׳LгLɳL³L»³L´³L­³L¦³LŸ³L˜³L‘³LгLƒ³L|³Lu³Ln³Lg³L`³LY³LR³LK³LD³L=³L6³L/³L(³L!³L³L³L ³L³Lþ²L÷²Lð²Lé²Lâ²LÛ²LÔ²LͲLƲL¿²L¸²L±²Lª²L£²Lœ²L•²L޲L‡²L€²Ly²Lr²Lk²Ld²L]²LV²LO²LH²LA²L:²L3²L,²L%²L²L²L²L ²L²Lû±Lô±Lí±Læ±Lß±LرLѱLʱLñL¼±Lµ±L®±L§±L ±L™±L’±L‹±L„±L}±Lv±Lo±Lh±La±LZ±LS±LL±LE±L>±L7±L0±L)±L"±L±L±L ±L±Lÿ°Lø°Lñ°Lê°Lã°LܰLÕ°LΰLǰLÀ°L¹°L²°L«°L¤°L°L–°L°Lˆ°L°Lz°Ls°Ll°Le°L^°LW°LP°LI°LB°L;°L4°L-°L&°L°L°L°L °L°Lü¯Lõ¯Lî¯Lç¯Là¯LÙ¯LÒ¯L˯LįL½¯L¶¯L¯¯L¨¯L¡¯Lš¯L“¯LŒ¯L…¯L~¯Lw¯Lp¯Li¯Lb¯L[¯LT¯LM¯LF¯L?¯L8¯L1¯L*¯L#¯L¯L¯L¯L¯L¯Lù®Lò®Lë®Lä®LÝ®LÖ®LÏ®LÈ®LÁ®Lº®L³®L¬®L¥®Lž®L—®L®L‰®L‚®L{®Lt®Lm®Lf®L_®LX®LQ®LJ®LC®L<®L5®L.®L'®L ®L®L®L ®L®Lý­Lö­Lï­Lè­Lá­LÚ­LÓ­LÌ­LÅ­L¾­L·­L°­L©­L¢­L›­L”­L­L†­L­Lx­Lq­Lj­Lc­L\­LU­LN­LG­L@­L9­L2­L+­L$­L­L­L­L­L­Lú¬Ló¬Lì¬Lå¬LÞ¬L׬LЬLɬL¬L»¬L´¬L­¬L¦¬LŸ¬L˜¬L‘¬LЬLƒ¬L|¬Lu¬Ln¬Lg¬L`¬LY¬LR¬LK¬LD¬L=¬L6¬L/¬L(¬L!¬L¬L¬L ¬L¬Lþ«L÷«Lð«Lé«Lâ«LÛ«LÔ«LÍ«LÆ«L¿«L¸«L±«Lª«L£«Lœ«L•«LŽ«L‡«L€«Ly«Lr«Lk«Ld«L]«LV«LO«LH«LA«L:«L3«L,«L%«L«L«L«L «L«LûªLôªLíªLæªLߪLتLѪLʪLêL¼ªLµªL®ªL§ªL ªL™ªL’ªL‹ªL„ªL}ªLvªLoªLhªLaªLZªLSªLLªLEªL>ªL7ªL0ªL)ªL"ªLªLªL ªLªLÿ©Lø©Lñ©Lê©Lã©LÜ©LÕ©LΩLÇ©LÀ©L¹©L²©L«©L¤©L©L–©L©Lˆ©L©Lz©Ls©Ll©Le©L^©LW©LP©LI©LB©L;©L4©L-©L&©L©L©L©L ©L©Lü¨Lõ¨Lî¨Lç¨Là¨LÙ¨LÒ¨L˨LĨL½¨L¶¨L¯¨L¨¨L¡¨Lš¨L“¨LŒ¨L…¨L~¨Lw¨Lp¨Li¨Lb¨L[¨LT¨LM¨LF¨L?¨L8¨L1¨L*¨L#¨L¨L¨L¨L¨L¨Lù§Lò§Lë§Lä§LݧLÖ§LϧLȧLÁ§Lº§L³§L¬§L¥§Lž§L—§L§L‰§L‚§L{§Lt§Lm§Lf§L_§LX§LQ§LJ§LC§L<§L5§L.§L'§L §L§L§L §L§Lý¦Lö¦Lï¦Lè¦Lá¦LÚ¦LÓ¦L̦LŦL¾¦L·¦L°¦L©¦L¢¦L›¦L”¦L¦L†¦L¦Lx¦Lq¦Lj¦Lc¦L\¦LU¦LN¦LG¦L@¦L9¦L2¦L+¦L$¦L¦L¦L¦L¦L¦Lú¥Ló¥Lì¥Lå¥LÞ¥L×¥LÐ¥LÉ¥LÂ¥L»¥L´¥L­¥L¦¥LŸ¥L˜¥L‘¥LŠ¥Lƒ¥L|¥Lu¥Ln¥Lg¥L`¥LY¥LR¥LK¥LD¥L=¥L6¥L/¥L(¥L!¥L¥L¥L ¥L¥Lþ¤L÷¤Lð¤Lé¤Lâ¤LÛ¤LÔ¤LͤLƤL¿¤L¸¤L±¤Lª¤L£¤Lœ¤L•¤LޤL‡¤L€¤Ly¤Lr¤Lk¤Ld¤L]¤LV¤LO¤LH¤LA¤L:¤L3¤L,¤L%¤L¤L¤L¤L ¤L¤Lû£Lô£Lí£Læ£LߣLØ£LÑ£LÊ£LãL¼£Lµ£L®£L§£L £L™£L’£L‹£L„£L}£Lv£Lo£Lh£La£LZ£LS£LL£LE£L>£L7£L0£L)£L"£L£L£L £L£Lÿ¢Lø¢Lñ¢Lê¢Lã¢LÜ¢LÕ¢L΢LÇ¢LÀ¢L¹¢L²¢L«¢L¤¢L¢L–¢L¢Lˆ¢L¢Lz¢Ls¢Ll¢Le¢L^¢LW¢LP¢LI¢LB¢L;¢L4¢L-¢L&¢L¢L¢L¢L ¢L¢Lü¡Lõ¡Lî¡Lç¡Là¡LÙ¡LÒ¡LË¡LÄ¡L½¡L¶¡L¯¡L¨¡L¡¡Lš¡L“¡LŒ¡L…¡L~¡Lw¡Lp¡Li¡Lb¡L[¡LT¡LM¡LF¡L?¡L8¡L1¡L*¡L#¡L¡L¡L¡L¡L¡Lù Lò Lë Lä LÝ LÖ LÏ LÈ LÁ Lº L³ L¬ L¥ Lž L— L L‰ L‚ L{ Lt Lm Lf L_ LX LQ LJ LC L< L5 L. L' L  L L L  L LýŸLöŸLïŸLèŸLáŸLÚŸLÓŸLÌŸLÅŸL¾ŸL·ŸL°ŸL©ŸL¢ŸL›ŸL”ŸLŸL†ŸLŸLxŸLqŸLjŸLcŸL\ŸLUŸLNŸLGŸL@ŸL9ŸL2ŸL+ŸL$ŸLŸLŸLŸLŸLŸLúžLóžLìžLåžLÞžLמLОLÉžLžL»žL´žL­žL¦žLŸžL˜žL‘žLŠžLƒžL|žLužLnžLgžL`žLYžLRžLKžLDžL=žL6žL/žL(žL!žLžLžL žLžLþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûœLôœLíœLæœLßœLØœLÑœLÊœLÜL¼œLµœL®œL§œL œL™œL’œL‹œL„œL}œLvœLoœLhœLaœLZœLSœLLœLEœL>œL7œL0œL)œL"œLœLœL œLœLÿ›Lø›Lñ›Lê›Lã›LÜ›LÕ›LΛLÇ›LÀ›L¹›L²›L«›L¤›L›L–›L›Lˆ›L›Lz›Ls›Ll›Le›L^›LW›LP›LI›LB›L;›L4›L-›L&›L›L›L›L ›L›LüšLõšLîšLçšLàšLÙšLÒšLËšLÄšL½šL¶šL¯šL¨šL¡šLššL“šLŒšL…šL~šLwšLpšLišLbšL[šLTšLMšLFšL?šL8šL1šL*šL#šLšLšLšLšLšLù™Lò™Lë™Lä™LÝ™LÖ™LÏ™LÈ™LÁ™Lº™L³™L¬™L¥™Lž™L—™L™L‰™L‚™L{™Lt™Lm™Lf™L_™LX™LQ™LJ™LC™L<™L5™L.™L'™L ™L™L™L ™L™Lý˜Lö˜Lï˜Lè˜Lá˜LÚ˜LÓ˜L̘LŘL¾˜L·˜L°˜L©˜L¢˜L›˜L”˜L˜L†˜L˜Lx˜Lq˜Lj˜Lc˜L\˜LU˜LN˜LG˜L@˜L9˜L2˜L+˜L$˜L˜L˜L˜L˜L˜Lú—Ló—Lì—Lå—LÞ—L×—LЗLÉ—L—L»—L´—L­—L¦—LŸ—L˜—L‘—LŠ—Lƒ—L|—Lu—Ln—Lg—L`—LY—LR—LK—LD—L=—L6—L/—L(—L!—L—L—L —L—Lþ–L÷–Lð–Lé–Lâ–LÛ–LÔ–LÍ–LÆ–L¿–L¸–L±–Lª–L£–Lœ–L•–LŽ–L‡–L€–Ly–Lr–Lk–Ld–L]–LV–LO–LH–LA–L:–L3–L,–L%–L–L–L–L –L–Lû•Lô•Lí•Læ•Lß•LØ•LÑ•LÊ•LÕL¼•Lµ•L®•L§•L •L™•L’•L‹•L„•L}•Lv•Lo•Lh•La•LZ•LS•LL•LE•L>•L7•L0•L)•L"•L•L•L •L•Lÿ”Lø”Lñ”Lê”Lã”LÜ”LÕ”LΔLÇ”LÀ”L¹”L²”L«”L¤”L”L–”L”Lˆ”L”Lz”Ls”Ll”Le”L^”LW”LP”LI”LB”L;”L4”L-”L&”L”L”L”L ”L”Lü“Lõ“Lî“Lç“Là“LÙ“LÒ“LË“LÄ“L½“L¶“L¯“L¨“L¡“Lš“L““LŒ“L…“L~“Lw“Lp“Li“Lb“L[“LT“LM“LF“L?“L8“L1“L*“L#“L“L“L“L“L“Lù’Lò’Lë’Lä’LÝ’LÖ’LÏ’LÈ’LÁ’Lº’L³’L¬’L¥’Lž’L—’L’L‰’L‚’L{’Lt’Lm’Lf’L_’LX’LQ’LJ’LC’L<’L5’L.’L'’L ’L’L’L ’L’Lý‘Lö‘Lï‘Lè‘Lá‘LÚ‘LÓ‘LÌ‘LÅ‘L¾‘L·‘L°‘L©‘L¢‘L›‘L”‘L‘L†‘L‘Lx‘Lq‘Lj‘Lc‘L\‘LU‘LN‘LG‘L@‘L9‘L2‘L+‘L$‘L‘L‘L‘L‘L‘LúLóLìLåLÞL×LÐLÉLÂL»L´L­L¦LŸL˜L‘LŠLƒL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûŽLôŽLíŽLæŽLߎLØŽLÑŽLÊŽLÃŽL¼ŽLµŽL®ŽL§ŽL ŽL™ŽL’ŽL‹ŽL„ŽL}ŽLvŽLoŽLhŽLaŽLZŽLSŽLLŽLEŽL>ŽL7ŽL0ŽL)ŽL"ŽLŽLŽL ŽLŽLÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüŒLõŒLîŒLçŒLàŒLÙŒLÒŒLËŒLÄŒL½ŒL¶ŒL¯ŒL¨ŒL¡ŒLšŒL“ŒLŒŒL…ŒL~ŒLwŒLpŒLiŒLbŒL[ŒLTŒLMŒLFŒL?ŒL8ŒL1ŒL*ŒL#ŒLŒLŒLŒLŒLŒLù‹Lò‹Lë‹Lä‹LÝ‹LÖ‹LÏ‹LÈ‹LÁ‹Lº‹L³‹L¬‹L¥‹Lž‹L—‹L‹L‰‹L‚‹L{‹Lt‹Lm‹Lf‹L_‹LX‹LQ‹LJ‹LC‹L<‹L5‹L.‹L'‹L ‹L‹L‹L ‹L‹LýŠLöŠLïŠLèŠLáŠLÚŠLÓŠLÌŠLÅŠL¾ŠL·ŠL°ŠL©ŠL¢ŠL›ŠL”ŠLŠL†ŠLŠLxŠLqŠLjŠLcŠL\ŠLUŠLNŠLGŠL@ŠL9ŠL2ŠL+ŠL$ŠLŠLŠLŠLŠLŠLú‰Ló‰Lì‰Lå‰LÞ‰L׉LЉLɉL‰L»‰L´‰L­‰L¦‰LŸ‰L˜‰L‘‰LЉLƒ‰L|‰Lu‰Ln‰Lg‰L`‰LY‰LR‰LK‰LD‰L=‰L6‰L/‰L(‰L!‰L‰L‰L ‰L‰LþˆL÷ˆLðˆLéˆLâˆLÛˆLÔˆL͈LƈL¿ˆL¸ˆL±ˆLªˆL£ˆLœˆL•ˆLŽˆL‡ˆL€ˆLyˆLrˆLkˆLdˆL]ˆLVˆLOˆLHˆLAˆL:ˆL3ˆL,ˆL%ˆLˆLˆLˆL ˆLˆLû‡Lô‡Lí‡Læ‡L߇L؇LчLʇLÇL¼‡Lµ‡L®‡L§‡L ‡L™‡L’‡L‹‡L„‡L}‡Lv‡Lo‡Lh‡La‡LZ‡LS‡LL‡LE‡L>‡L7‡L0‡L)‡L"‡L‡L‡L ‡L‡Lÿ†Lø†Lñ†Lê†Lã†L܆LÕ†LΆLdžLÀ†L¹†L²†L«†L¤†L†L–†L†Lˆ†L†Lz†Ls†Ll†Le†L^†LW†LP†LI†LB†L;†L4†L-†L&†L†L†L†L †L†Lü…Lõ…Lî…Lç…Là…LÙ…LÒ…LË…LÄ…L½…L¶…L¯…L¨…L¡…Lš…L“…LŒ…L……L~…Lw…Lp…Li…Lb…L[…LT…LM…LF…L?…L8…L1…L*…L#…L…L…L…L…L…Lù„Lò„Lë„Lä„LÝ„LÖ„LÏ„LÈ„LÁ„Lº„L³„L¬„L¥„Lž„L—„L„L‰„L‚„L{„Lt„Lm„Lf„L_„LX„LQ„LJ„LC„L<„L5„L.„L'„L „L„L„L „L„LýƒLöƒLïƒLèƒLáƒLÚƒLÓƒL̃LŃL¾ƒL·ƒL°ƒL©ƒL¢ƒL›ƒL”ƒLƒL†ƒLƒLxƒLqƒLjƒLcƒL\ƒLUƒLNƒLGƒL@ƒL9ƒL2ƒL+ƒL$ƒLƒLƒLƒLƒLƒLú‚Ló‚Lì‚Lå‚LÞ‚LׂLЂLÉ‚L‚L»‚L´‚L­‚L¦‚LŸ‚L˜‚L‘‚LŠ‚Lƒ‚L|‚Lu‚Ln‚Lg‚L`‚LY‚LR‚LK‚LD‚L=‚L6‚L/‚L(‚L!‚L‚L‚L ‚L‚LþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLû€Lô€Lí€Læ€L߀LØ€LÑ€LÊ€LÀL¼€Lµ€L®€L§€L €L™€L’€L‹€L„€L}€Lv€Lo€Lh€La€LZ€LS€LL€LE€L>€L7€L0€L)€L"€L€L€L €L€LÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLü~Lõ~Lî~Lç~Là~LÙ~LÒ~LË~LÄ~L½~L¶~L¯~L¨~L¡~Lš~L“~LŒ~L…~L~~Lw~Lp~Li~Lb~L[~LT~LM~LF~L?~L8~L1~L*~L#~L~L~L~L~L~Lù}Lò}Lë}Lä}LÝ}LÖ}LÏ}LÈ}LÁ}Lº}L³}L¬}L¥}Lž}L—}L}L‰}L‚}L{}Lt}Lm}Lf}L_}LX}LQ}LJ}LC}L<}L5}L.}L'}L }L}L}L }L}Lý|Lö|Lï|Lè|Lá|LÚ|LÓ|LÌ|LÅ|L¾|L·|L°|L©|L¢|L›|L”|L|L†|L|Lx|Lq|Lj|Lc|L\|LU|LN|LG|L@|L9|L2|L+|L$|L|L|L|L|L|Lú{Ló{Lì{Lå{LÞ{L×{LÐ{LÉ{LÂ{L»{L´{L­{L¦{LŸ{L˜{L‘{LŠ{Lƒ{L|{Lu{Ln{Lg{L`{LY{LR{LK{LD{L={L6{L/{L({L!{L{L{L {L{LþzL÷zLðzLézLâzLÛzLÔzLÍzLÆzL¿zL¸zL±zLªzL£zLœzL•zLŽzL‡zL€zLyzLrzLkzLdzL]zLVzLOzLHzLAzL:zL3zL,zL%zLzLzLzL zLzLûyLôyLíyLæyLßyLØyLÑyLÊyLÃyL¼yLµyL®yL§yL yL™yL’yL‹yL„yL}yLvyLoyLhyLayLZyLSyLLyLEyL>yL7yL0yL)yL"yLyLyL yLyLÿxLøxLñxLêxLãxLÜxLÕxLÎxLÇxLÀxL¹xL²xL«xL¤xLxL–xLxLˆxLxLzxLsxLlxLexL^xLWxLPxLIxLBxL;xL4xL-xL&xLxLxLxL xLxLüwLõwLîwLçwLàwLÙwLÒwLËwLÄwL½wL¶wL¯wL¨wL¡wLšwL“wLŒwL…wL~wLwwLpwLiwLbwL[wLTwLMwLFwL?wL8wL1wL*wL#wLwLwLwLwLwLùvLòvLëvLävLÝvLÖvLÏvLÈvLÁvLºvL³vL¬vL¥vLžvL—vLvL‰vL‚vL{vLtvLmvLfvL_vLXvLQvLJvLCvLrL7rL0rL)rL"rLrLrL rLrLÿqLøqLñqLêqLãqLÜqLÕqLÎqLÇqLÀqL¹qL²qL«qL¤qLqL–qLqLˆqLqLzqLsqLlqLeqL^qLWqLPqLIqLBqL;qL4qL-qL&qLqLqLqL qLqLüpLõpLîpLçpLàpLÙpLÒpLËpLÄpL½pL¶pL¯pL¨pL¡pLšpL“pLŒpL…pL~pLwpLppLipLbpL[pLTpLMpLFpL?pL8pL1pL*pL#pLpLpLpLpLpLùoLòoLëoLäoLÝoLÖoLÏoLÈoLÁoLºoL³oL¬oL¥oLžoL—oLoL‰oL‚oL{oLtoLmoLfoL_oLXoLQoLJoLCoLkL7kL0kL)kL"kLkLkL kLkLÿjLøjLñjLêjLãjLÜjLÕjLÎjLÇjLÀjL¹jL²jL«jL¤jLjL–jLjLˆjLjLzjLsjLljLejL^jLWjLPjLIjLBjL;jL4jL-jL&jLjLjLjL jLjLüiLõiLîiLçiLàiLÙiLÒiLËiLÄiL½iL¶iL¯iL¨iL¡iLšiL“iLŒiL…iL~iLwiLpiLiiLbiL[iLTiLMiLFiL?iL8iL1iL*iL#iLiLiLiLiLiLùhLòhLëhLähLÝhLÖhLÏhLÈhLÁhLºhL³hL¬hL¥hLžhL—hLhL‰hL‚hL{hLthLmhLfhL_hLXhLQhLJhLChLdL7dL0dL)dL"dLdLdL dLdLÿcLøcLñcLêcLãcLÜcLÕcLÎcLÇcLÀcL¹cL²cL«cL¤cLcL–cLcLˆcLcLzcLscLlcLecL^cLWcLPcLIcLBcL;cL4cL-cL&cLcLcLcL cLcLübLõbLîbLçbLàbLÙbLÒbLËbLÄbL½bL¶bL¯bL¨bL¡bLšbL“bLŒbL…bL~bLwbLpbLibLbbL[bLTbLMbLFbL?bL8bL1bL*bL#bLbLbLbLbLbLùaLòaLëaLäaLÝaLÖaLÏaLÈaLÁaLºaL³aL¬aL¥aLžaL—aLaL‰aL‚aL{aLtaLmaLfaL_aLXaLQaLJaLCaL]L7]L0]L)]L"]L]L]L ]L]Lÿ\Lø\Lñ\Lê\Lã\LÜ\LÕ\LÎ\LÇ\LÀ\L¹\L²\L«\L¤\L\L–\L\Lˆ\L\Lz\Ls\Ll\Le\L^\LW\LP\LI\LB\L;\L4\L-\L&\L\L\L\L \L\Lü[Lõ[Lî[Lç[Là[LÙ[LÒ[LË[LÄ[L½[L¶[L¯[L¨[L¡[Lš[L“[LŒ[L…[L~[Lw[Lp[Li[Lb[L[[LT[LM[LF[L?[L8[L1[L*[L#[L[L[L[L[L[LùZLòZLëZLäZLÝZLÖZLÏZLÈZLÁZLºZL³ZL¬ZL¥ZLžZL—ZLZL‰ZL‚ZL{ZLtZLmZLfZL_ZLXZLQZLJZLCZLVL7VL0VL)VL"VLVLVL VLVLÿULøULñULêULãULÜULÕULÎULÇULÀUL¹UL²UL«UL¤ULUL–ULULˆULULzULsULlULeUL^ULWULPULIULBUL;UL4UL-UL&ULULULUL ULULüTLõTLîTLçTLàTLÙTLÒTLËTLÄTL½TL¶TL¯TL¨TL¡TLšTL“TLŒTL…TL~TLwTLpTLiTLbTL[TLTTLMTLFTL?TL8TL1TL*TL#TLTLTLTLTLTLùSLòSLëSLäSLÝSLÖSLÏSLÈSLÁSLºSL³SL¬SL¥SLžSL—SLSL‰SL‚SL{SLtSLmSLfSL_SLXSLQSLJSLCSLOL7OL0OL)OL"OLOLOL OLOLÿNLøNLñNLêNLãNLÜNLÕNLÎNLÇNLÀNL¹NL²NL«NL¤NLNL–NLNLˆNLNLzNLsNLlNLeNL^NLWNLPNLINLBNL;NL4NL-NL&NLNLNLNL NLNLüMLõMLîMLçMLàMLÙMLÒMLËMLÄML½ML¶ML¯ML¨ML¡MLšML“MLŒML…ML~MLwMLpMLiMLbML[MLTMLMMLFML?ML8ML1ML*ML#MLMLMLMLMLMLùLLòLLëLLäLLÝLLÖLLÏLLÈLLÁLLºLL³LL¬LL¥LLžLL—LLLL‰LL‚LL{LLtLLmLLfLL_LLXLLQLLJLLCLLHL7HL0HL)HL"HLHLHL HLHLÿGLøGLñGLêGLãGLÜGLÕGLÎGLÇGLÀGL¹GL²GL«GL¤GLGL–GLGLˆGLGLzGLsGLlGLeGL^GLWGLPGLIGLBGL;GL4GL-GL&GLGLGLGL GLGLüFLõFLîFLçFLàFLÙFLÒFLËFLÄFL½FL¶FL¯FL¨FL¡FLšFL“FLŒFL…FL~FLwFLpFLiFLbFL[FLTFLMFLFFL?FL8FL1FL*FL#FLFLFLFLFLFLùELòELëELäELÝELÖELÏELÈELÁELºEL³EL¬EL¥ELžEL—ELEL‰EL‚EL{ELtELmELfEL_ELXELQELJELCELAL7AL0AL)AL"ALALAL ALALÿ@Lø@Lñ@Lê@Lã@LÜ@LÕ@LÎ@LÇ@LÀ@L¹@L²@L«@L¤@L@L–@L@Lˆ@L@Lz@Ls@Ll@Le@L^@LW@LP@LI@LB@L;@L4@L-@L&@L@L@L@L @L@Lü?Lõ?Lî?Lç?Là?LÙ?LÒ?LË?LÄ?L½?L¶?L¯?L¨?L¡?Lš?L“?LŒ?L…?L~?Lw?Lp?Li?Lb?L[?LT?LM?LF?L??L8?L1?L*?L#?L?L?L?L?L?Lù>Lò>Lë>Lä>LÝ>LÖ>LÏ>LÈ>LÁ>Lº>L³>L¬>L¥>Lž>L—>L>L‰>L‚>L{>Lt>Lm>Lf>L_>LX>LQ>LJ>LC>L<>L5>L.>L'>L >L>L>L >L>Lý=Lö=Lï=Lè=Lá=LÚ=LÓ=LÌ=LÅ=L¾=L·=L°=L©=L¢=L›=L”=L=L†=L=Lx=Lq=Lj=Lc=L\=LU=LN=LG=L@=L9=L2=L+=L$=L=L=L=L=L=Lú:L7:L0:L):L":L:L:L :L:Lÿ9Lø9Lñ9Lê9Lã9LÜ9LÕ9LÎ9LÇ9LÀ9L¹9L²9L«9L¤9L9L–9L9Lˆ9L9Lz9Ls9Ll9Le9L^9LW9LP9LI9LB9L;9L49L-9L&9L9L9L9L 9L9Lü8Lõ8Lî8Lç8Là8LÙ8LÒ8LË8LÄ8L½8L¶8L¯8L¨8L¡8Lš8L“8LŒ8L…8L~8Lw8Lp8Li8Lb8L[8LT8LM8LF8L?8L88L18L*8L#8L8L8L8L8L8Lù7Lò7Lë7Lä7LÝ7LÖ7LÏ7LÈ7LÁ7Lº7L³7L¬7L¥7Lž7L—7L7L‰7L‚7L{7Lt7Lm7Lf7L_7LX7LQ7LJ7LC7L<7L57L.7L'7L 7L7L7L 7L7Lý6Lö6Lï6Lè6Lá6LÚ6LÓ6LÌ6LÅ6L¾6L·6L°6L©6L¢6L›6L”6L6L†6L6Lx6Lq6Lj6Lc6L\6LU6LN6LG6L@6L96L26L+6L$6L6L6L6L6L6Lú5Ló5Lì5Lå5LÞ5L×5LÐ5LÉ5LÂ5L»5L´5L­5L¦5LŸ5L˜5L‘5LŠ5Lƒ5L|5Lu5Ln5Lg5L`5LY5LR5LK5LD5L=5L65L/5L(5L!5L5L5L 5L5Lþ4L÷4Lð4Lé4Lâ4LÛ4LÔ4LÍ4LÆ4L¿4L¸4L±4Lª4L£4Lœ4L•4LŽ4L‡4L€4Ly4Lr4Lk4Ld4L]4LV4LO4LH4LA4L:4L34L,4L%4L4L4L4L 4L4Lû3Lô3Lí3Læ3Lß3LØ3LÑ3LÊ3LÃ3L¼3Lµ3L®3L§3L 3L™3L’3L‹3L„3L}3Lv3Lo3Lh3La3LZ3LS3LL3LE3L>3L73L03L)3L"3L3L3L 3L3Lÿ2Lø2Lñ2Lê2Lã2LÜ2LÕ2LÎ2LÇ2LÀ2L¹2L²2L«2L¤2L2L–2L2Lˆ2L2Lz2Ls2Ll2Le2L^2LW2LP2LI2LB2L;2L42L-2L&2L2L2L2L 2L2Lü1Lõ1Lî1Lç1Là1LÙ1LÒ1LË1LÄ1L½1L¶1L¯1L¨1L¡1Lš1L“1LŒ1L…1L~1Lw1Lp1Li1Lb1L[1LT1LM1LF1L?1L81L11L*1L#1L1L1L1L1L1Lù0Lò0Lë0Lä0LÝ0LÖ0LÏ0LÈ0LÁ0Lº0L³0L¬0L¥0Lž0L—0L0L‰0L‚0L{0Lt0Lm0Lf0L_0LX0LQ0LJ0LC0L<0L50L.0L'0L 0L0L0L 0L0Lý/Lö/Lï/Lè/Lá/LÚ/LÓ/LÌ/LÅ/L¾/L·/L°/L©/L¢/L›/L”/L/L†/L/Lx/Lq/Lj/Lc/L\/LU/LN/LG/L@/L9/L2/L+/L$/L/L/L/L/L/Lú.Ló.Lì.Lå.LÞ.L×.LÐ.LÉ.LÂ.L».L´.L­.L¦.LŸ.L˜.L‘.LŠ.Lƒ.L|.Lu.Ln.Lg.L`.LY.LR.LK.LD.L=.L6.L/.L(.L!.L.L.L .L.Lþ-L÷-Lð-Lé-Lâ-LÛ-LÔ-LÍ-LÆ-L¿-L¸-L±-Lª-L£-Lœ-L•-LŽ-L‡-L€-Ly-Lr-Lk-Ld-L]-LV-LO-LH-LA-L:-L3-L,-L%-L-L-L-L -L-Lû,Lô,Lí,Læ,Lß,LØ,LÑ,LÊ,LÃ,L¼,Lµ,L®,L§,L ,L™,L’,L‹,L„,L},Lv,Lo,Lh,La,LZ,LS,LL,LE,L>,L7,L0,L),L",L,L,L ,L,Lÿ+Lø+Lñ+Lê+Lã+LÜ+LÕ+LÎ+LÇ+LÀ+L¹+L²+L«+L¤+L+L–+L+Lˆ+L+Lz+Ls+Ll+Le+L^+LW+LP+LI+LB+L;+L4+L-+L&+L+L+L+L +L+Lü*Lõ*Lî*Lç*Là*LÙ*LÒ*LË*LÄ*L½*L¶*L¯*L¨*L¡*Lš*L“*LŒ*L…*L~*Lw*Lp*Li*Lb*L[*LT*LM*LF*L?*L8*L1*L**L#*L*L*L*L*L*Lù)Lò)Lë)Lä)LÝ)LÖ)LÏ)LÈ)LÁ)Lº)L³)L¬)L¥)Lž)L—)L)L‰)L‚)L{)Lt)Lm)Lf)L_)LX)LQ)LJ)LC)L<)L5)L.)L')L )L)L)L )L)Lý(Lö(Lï(Lè(Lá(LÚ(LÓ(LÌ(LÅ(L¾(L·(L°(L©(L¢(L›(L”(L(L†(L(Lx(Lq(Lj(Lc(L\(LU(LN(LG(L@(L9(L2(L+(L$(L(L(L(L(L(Lú'Ló'Lì'Lå'LÞ'L×'LÐ'LÉ'LÂ'L»'L´'L­'L¦'LŸ'L˜'L‘'LŠ'Lƒ'L|'Lu'Ln'Lg'L`'LY'LR'LK'LD'L='L6'L/'L('L!'L'L'L 'L'Lþ&L÷&Lð&Lé&Lâ&LÛ&LÔ&LÍ&LÆ&L¿&L¸&L±&Lª&L£&Lœ&L•&LŽ&L‡&L€&Ly&Lr&Lk&Ld&L]&LV&LO&LH&LA&L:&L3&L,&L%&L&L&L&L &L&Lû%Lô%Lí%Læ%Lß%LØ%LÑ%LÊ%LÃ%L¼%Lµ%L®%L§%L %L™%L’%L‹%L„%L}%Lv%Lo%Lh%La%LZ%LS%LL%LE%L>%L7%L0%L)%L"%L%L%L %L%Lÿ$Lø$Lñ$Lê$Lã$LÜ$LÕ$LÎ$LÇ$LÀ$L¹$L²$L«$L¤$L$L–$L$Lˆ$L$Lz$Ls$Ll$Le$L^$LW$LP$LI$LB$L;$L4$L-$L&$L$L$L$L $L$Lü#Lõ#Lî#Lç#Là#LÙ#LÒ#LË#LÄ#L½#L¶#L¯#L¨#L¡#Lš#L“#LŒ#L…#L~#Lw#Lp#Li#Lb#L[#LT#LM#LF#L?#L8#L1#L*#L##L#L#L#L#L#Lù"Lò"Lë"Lä"LÝ"LÖ"LÏ"LÈ"LÁ"Lº"L³"L¬"L¥"Lž"L—"L"L‰"L‚"L{"Lt"Lm"Lf"L_"LX"LQ"LJ"LC"L<"L5"L."L'"L "L"L"L "L"Lý!Lö!Lï!Lè!Lá!LÚ!LÓ!LÌ!LÅ!L¾!L·!L°!L©!L¢!L›!L”!L!L†!L!Lx!Lq!Lj!Lc!L\!LU!LN!LG!L@!L9!L2!L+!L$!L!L!L!L!L!Lú Ló Lì Lå LÞ L× LÐ LÉ L L» L´ L­ L¦ LŸ L˜ L‘ LŠ Lƒ L| Lu Ln Lg L` LY LR LK LD L= L6 L/ L( L! L L L L LþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûLôLíLæLßLØLÑLÊLÃL¼LµL®L§L L™L’L‹L„L}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLýLöLïLèLáLÚLÓLÌLÅL¾L·L°L©L¢L›L”LL†LLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLúLóLìLåLÞL×LÐLÉLÂL»L´L­L¦LŸL˜L‘LŠLƒL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûLôLíLæLßLØLÑLÊLÃL¼LµL®L§L L™L’L‹L„L}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLýLöLïLèLáLÚLÓLÌLÅL¾L·L°L©L¢L›L”LL†LLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLúLóLìLåLÞL×LÐLÉLÂL»L´L­L¦LŸL˜L‘LŠLƒL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûLôLíLæLßLØLÑLÊLÃL¼LµL®L§L L™L’L‹L„L}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLù Lò Lë Lä LÝ LÖ LÏ LÈ LÁ Lº L³ L¬ L¥ Lž L— L L‰ L‚ L{ Lt Lm Lf L_ LX LQ LJ LC L< L5 L. L' L L L L L Lý Lö Lï Lè Lá LÚ LÓ LÌ LÅ L¾ L· L° L© L¢ L› L” L L† L Lx Lq Lj Lc L\ LU LN LG L@ L9 L2 L+ L$ L L L L L Lú Ló Lì Lå LÞ L× LÐ LÉ L L» L´ L­ L¦ LŸ L˜ L‘ LŠ Lƒ L| Lu Ln Lg L` LY LR LK LD L= L6 L/ L( L! L L L L Lþ L÷ Lð Lé Lâ LÛ LÔ LÍ LÆ L¿ L¸ L± Lª L£ Lœ L• LŽ L‡ L€ Ly Lr Lk Ld L] LV LO LH LA L: L3 L, L% L L L L L Lû Lô Lí Læ Lß LØ LÑ LÊ Là L¼ Lµ L® L§ L  L™ L’ L‹ L„ L} Lv Lo Lh La LZ LS LL LE L> L7 L0 L) L" L L L L LÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCL<L5L.L'L LLL LLýLöLïLèLáLÚLÓLÌLÅL¾L·L°L©L¢L›L”LL†LLxLqLjLcL\LULNLGL@L9L2L+L$LLLLLLúLóLìLåLÞL×LÐLÉLÂL»L´L­L¦LŸL˜L‘LŠLƒL|LuLnLgL`LYLRLKLDL=L6L/L(L!LLL LLþL÷LðLéLâLÛLÔLÍLÆL¿L¸L±LªL£LœL•LŽL‡L€LyLrLkLdL]LVLOLHLAL:L3L,L%LLLL LLûLôLíLæLßLØLÑLÊLÃL¼LµL®L§L L™L’L‹L„L}LvLoLhLaLZLSLLLEL>L7L0L)L"LLL LLÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùÿKòÿKëÿKäÿKÝÿKÖÿKÏÿKÈÿKÁÿKºÿK³ÿK¬ÿK¥ÿKžÿK—ÿKÿK‰ÿK‚ÿK{ÿKtÿKmÿKfÿK_ÿKXÿKQÿKJÿKCÿK<ÿK5ÿK.ÿK'ÿK ÿKÿKÿK ÿKÿKýþKöþKïþKèþKáþKÚþKÓþKÌþKÅþK¾þK·þK°þK©þK¢þK›þK”þKþK†þKþKxþKqþKjþKcþK\þKUþKNþKGþK@þK9þK2þK+þK$þKþKþKþKþKþKúýKóýKìýKåýKÞýK×ýKÐýKÉýKÂýK»ýK´ýK­ýK¦ýKŸýK˜ýK‘ýKŠýKƒýK|ýKuýKnýKgýK`ýKYýKRýKKýKDýK=ýK6ýK/ýK(ýK!ýKýKýK ýKýKþüK÷üKðüKéüKâüKÛüKÔüKÍüKÆüK¿üK¸üK±üKªüK£üKœüK•üKŽüK‡üK€üKyüKrüKküKdüK]üKVüKOüKHüKAüK:üK3üK,üK%üKüKüKüK üKüKûûKôûKíûKæûKßûKØûKÑûKÊûKÃûK¼ûKµûK®ûK§ûK ûK™ûK’ûK‹ûK„ûK}ûKvûKoûKhûKaûKZûKSûKLûKEûK>ûK7ûK0ûK)ûK"ûKûKûK ûKûKÿúKøúKñúKêúKãúKÜúKÕúKÎúKÇúKÀúK¹úK²úK«úK¤úKúK–úKúKˆúKúKzúKsúKlúKeúK^úKWúKPúKIúKBúK;úK4úK-úK&úKúKúKúK úKúKüùKõùKîùKçùKàùKÙùKÒùKËùKÄùK½ùK¶ùK¯ùK¨ùK¡ùKšùK“ùKŒùK…ùK~ùKwùKpùKiùKbùK[ùKTùKMùKFùK?ùK8ùK1ùK*ùK#ùKùKùKùKùKùKùøKòøKëøKäøKÝøKÖøKÏøKÈøKÁøKºøK³øK¬øK¥øKžøK—øKøK‰øK‚øK{øKtøKmøKføK_øKXøKQøKJøKCøK<øK5øK.øK'øK øKøKøK øKøKý÷Kö÷Kï÷Kè÷Ká÷KÚ÷KÓ÷KÌ÷KÅ÷K¾÷K·÷K°÷K©÷K¢÷K›÷K”÷K÷K†÷K÷Kx÷Kq÷Kj÷Kc÷K\÷KU÷KN÷KG÷K@÷K9÷K2÷K+÷K$÷K÷K÷K÷K÷K÷KúöKóöKìöKåöKÞöK×öKÐöKÉöKÂöK»öK´öK­öK¦öKŸöK˜öK‘öKŠöKƒöK|öKuöKnöKgöK`öKYöKRöKKöKDöK=öK6öK/öK(öK!öKöKöK öKöKþõK÷õKðõKéõKâõKÛõKÔõKÍõKÆõK¿õK¸õK±õKªõK£õKœõK•õKŽõK‡õK€õKyõKrõKkõKdõK]õKVõKOõKHõKAõK:õK3õK,õK%õKõKõKõK õKõKûôKôôKíôKæôKßôKØôKÑôKÊôKÃôK¼ôKµôK®ôK§ôK ôK™ôK’ôK‹ôK„ôK}ôKvôKoôKhôKaôKZôKSôKLôKEôK>ôK7ôK0ôK)ôK"ôKôKôK ôKôKÿóKøóKñóKêóKãóKÜóKÕóKÎóKÇóKÀóK¹óK²óK«óK¤óKóK–óKóKˆóKóKzóKsóKlóKeóK^óKWóKPóKIóKBóK;óK4óK-óK&óKóKóKóK óKóKüòKõòKîòKçòKàòKÙòKÒòKËòKÄòK½òK¶òK¯òK¨òK¡òKšòK“òKŒòK…òK~òKwòKpòKiòKbòK[òKTòKMòKFòK?òK8òK1òK*òK#òKòKòKòKòKòKùñKòñKëñKäñKÝñKÖñKÏñKÈñKÁñKºñK³ñK¬ñK¥ñKžñK—ñKñK‰ñK‚ñK{ñKtñKmñKfñK_ñKXñKQñKJñKCñK<ñK5ñK.ñK'ñK ñKñKñK ñKñKýðKöðKïðKèðKáðKÚðKÓðKÌðKÅðK¾ðK·ðK°ðK©ðK¢ðK›ðK”ðKðK†ðKðKxðKqðKjðKcðK\ðKUðKNðKGðK@ðK9ðK2ðK+ðK$ðKðKðKðKðKðKúïKóïKìïKåïKÞïK×ïKÐïKÉïKÂïK»ïK´ïK­ïK¦ïKŸïK˜ïK‘ïKŠïKƒïK|ïKuïKnïKgïK`ïKYïKRïKKïKDïK=ïK6ïK/ïK(ïK!ïKïKïK ïKïKþîK÷îKðîKéîKâîKÛîKÔîKÍîKÆîK¿îK¸îK±îKªîK£îKœîK•îKŽîK‡îK€îKyîKrîKkîKdîK]îKVîKOîKHîKAîK:îK3îK,îK%îKîKîKîK îKîKûíKôíKííKæíKßíKØíKÑíKÊíKÃíK¼íKµíK®íK§íK íK™íK’íK‹íK„íK}íKvíKoíKhíKaíKZíKSíKLíKEíK>íK7íK0íK)íK"íKíKíK íKíKÿìKøìKñìKêìKãìKÜìKÕìKÎìKÇìKÀìK¹ìK²ìK«ìK¤ìKìK–ìKìKˆìKìKzìKsìKlìKeìK^ìKWìKPìKIìKBìK;ìK4ìK-ìK&ìKìKìKìK ìKìKüëKõëKîëKçëKàëKÙëKÒëKËëKÄëK½ëK¶ëK¯ëK¨ëK¡ëKšëK“ëKŒëK…ëK~ëKwëKpëKiëKbëK[ëKTëKMëKFëK?ëK8ëK1ëK*ëK#ëKëKëKëKëKëKùêKòêKëêKäêKÝêKÖêKÏêKÈêKÁêKºêK³êK¬êK¥êKžêK—êKêK‰êK‚êK{êKtêKmêKfêK_êKXêKQêKJêKCêK<êK5êK.êK'êK êKêKêK êKêKýéKöéKïéKèéKáéKÚéKÓéKÌéKÅéK¾éK·éK°éK©éK¢éK›éK”éKéK†éKéKxéKqéKjéKcéK\éKUéKNéKGéK@éK9éK2éK+éK$éKéKéKéKéKéKúèKóèKìèKåèKÞèK×èKÐèKÉèKÂèK»èK´èK­èK¦èKŸèK˜èK‘èKŠèKƒèK|èKuèKnèKgèK`èKYèKRèKKèKDèK=èK6èK/èK(èK!èKèKèK èKèKþçK÷çKðçKéçKâçKÛçKÔçKÍçKÆçK¿çK¸çK±çKªçK£çKœçK•çKŽçK‡çK€çKyçKrçKkçKdçK]çKVçKOçKHçKAçK:çK3çK,çK%çKçKçKçK çKçKûæKôæKíæKææKßæKØæKÑæKÊæKÃæK¼æKµæK®æK§æK æK™æK’æK‹æK„æK}æKvæKoæKhæKaæKZæKSæKLæKEæK>æK7æK0æK)æK"æKæKæK æKæKÿåKøåKñåKêåKãåKÜåKÕåKÎåKÇåKÀåK¹åK²åK«åK¤åKåK–åKåKˆåKåKzåKsåKlåKeåK^åKWåKPåKIåKBåK;åK4åK-åK&åKåKåKåK åKåKüäKõäKîäKçäKàäKÙäKÒäKËäKÄäK½äK¶äK¯äK¨äK¡äKšäK“äKŒäK…äK~äKwäKpäKiäKbäK[äKTäKMäKFäK?äK8äK1äK*äK#äKäKäKäKäKäKùãKòãKëãKäãKÝãKÖãKÏãKÈãKÁãKºãK³ãK¬ãK¥ãKžãK—ãKãK‰ãK‚ãK{ãKtãKmãKfãK_ãKXãKQãKJãKCãK<ãK5ãK.ãK'ãK ãKãKãK ãKãKýâKöâKïâKèâKáâKÚâKÓâKÌâKÅâK¾âK·âK°âK©âK¢âK›âK”âKâK†âKâKxâKqâKjâKcâK\âKUâKNâKGâK@âK9âK2âK+âK$âKâKâKâKâKâKúáKóáKìáKåáKÞáK×áKÐáKÉáKÂáK»áK´áK­áK¦áKŸáK˜áK‘áKŠáKƒáK|áKuáKnáKgáK`áKYáKRáKKáKDáK=áK6áK/áK(áK!áKáKáK áKáKþàK÷àKðàKéàKâàKÛàKÔàKÍàKÆàK¿àK¸àK±àKªàK£àKœàK•àKŽàK‡àK€àKyàKràKkàKdàK]àKVàKOàKHàKAàK:àK3àK,àK%àKàKàKàK àKàKûßKôßKíßKæßKßßKØßKÑßKÊßKÃßK¼ßKµßK®ßK§ßK ßK™ßK’ßK‹ßK„ßK}ßKvßKoßKhßKaßKZßKSßKLßKEßK>ßK7ßK0ßK)ßK"ßKßKßK ßKßKÿÞKøÞKñÞKêÞKãÞKÜÞKÕÞKÎÞKÇÞKÀÞK¹ÞK²ÞK«ÞK¤ÞKÞK–ÞKÞKˆÞKÞKzÞKsÞKlÞKeÞK^ÞKWÞKPÞKIÞKBÞK;ÞK4ÞK-ÞK&ÞKÞKÞKÞK ÞKÞKüÝKõÝKîÝKçÝKàÝKÙÝKÒÝKËÝKÄÝK½ÝK¶ÝK¯ÝK¨ÝK¡ÝKšÝK“ÝKŒÝK…ÝK~ÝKwÝKpÝKiÝKbÝK[ÝKTÝKMÝKFÝK?ÝK8ÝK1ÝK*ÝK#ÝKÝKÝKÝKÝKÝKùÜKòÜKëÜKäÜKÝÜKÖÜKÏÜKÈÜKÁÜKºÜK³ÜK¬ÜK¥ÜKžÜK—ÜKÜK‰ÜK‚ÜK{ÜKtÜKmÜKfÜK_ÜKXÜKQÜKJÜKCÜK<ÜK5ÜK.ÜK'ÜK ÜKÜKÜK ÜKÜKýÛKöÛKïÛKèÛKáÛKÚÛKÓÛKÌÛKÅÛK¾ÛK·ÛK°ÛK©ÛK¢ÛK›ÛK”ÛKÛK†ÛKÛKxÛKqÛKjÛKcÛK\ÛKUÛKNÛKGÛK@ÛK9ÛK2ÛK+ÛK$ÛKÛKÛKÛKÛKÛKúÚKóÚKìÚKåÚKÞÚK×ÚKÐÚKÉÚKÂÚK»ÚK´ÚK­ÚK¦ÚKŸÚK˜ÚK‘ÚKŠÚKƒÚK|ÚKuÚKnÚKgÚK`ÚKYÚKRÚKKÚKDÚK=ÚK6ÚK/ÚK(ÚK!ÚKÚKÚK ÚKÚKþÙK÷ÙKðÙKéÙKâÙKÛÙKÔÙKÍÙKÆÙK¿ÙK¸ÙK±ÙKªÙK£ÙKœÙK•ÙKŽÙK‡ÙK€ÙKyÙKrÙKkÙKdÙK]ÙKVÙKOÙKHÙKAÙK:ÙK3ÙK,ÙK%ÙKÙKÙKÙK ÙKÙKûØKôØKíØKæØKߨKØØKÑØKÊØKÃØK¼ØKµØK®ØK§ØK ØK™ØK’ØK‹ØK„ØK}ØKvØKoØKhØKaØKZØKSØKLØKEØK>ØK7ØK0ØK)ØK"ØKØKØK ØKØKÿ×Kø×Kñ×Kê×Kã×KÜ×KÕ×KÎ×KÇ×KÀ×K¹×K²×K«×K¤×K×K–×K×Kˆ×K×Kz×Ks×Kl×Ke×K^×KW×KP×KI×KB×K;×K4×K-×K&×K×K×K×K ×K×KüÖKõÖKîÖKçÖKàÖKÙÖKÒÖKËÖKÄÖK½ÖK¶ÖK¯ÖK¨ÖK¡ÖKšÖK“ÖKŒÖK…ÖK~ÖKwÖKpÖKiÖKbÖK[ÖKTÖKMÖKFÖK?ÖK8ÖK1ÖK*ÖK#ÖKÖKÖKÖKÖKÖKùÕKòÕKëÕKäÕKÝÕKÖÕKÏÕKÈÕKÁÕKºÕK³ÕK¬ÕK¥ÕKžÕK—ÕKÕK‰ÕK‚ÕK{ÕKtÕKmÕKfÕK_ÕKXÕKQÕKJÕKCÕK<ÕK5ÕK.ÕK'ÕK ÕKÕKÕK ÕKÕKýÔKöÔKïÔKèÔKáÔKÚÔKÓÔKÌÔKÅÔK¾ÔK·ÔK°ÔK©ÔK¢ÔK›ÔK”ÔKÔK†ÔKÔKxÔKqÔKjÔKcÔK\ÔKUÔKNÔKGÔK@ÔK9ÔK2ÔK+ÔK$ÔKÔKÔKÔKÔKÔKúÓKóÓKìÓKåÓKÞÓK×ÓKÐÓKÉÓKÂÓK»ÓK´ÓK­ÓK¦ÓKŸÓK˜ÓK‘ÓKŠÓKƒÓK|ÓKuÓKnÓKgÓK`ÓKYÓKRÓKKÓKDÓK=ÓK6ÓK/ÓK(ÓK!ÓKÓKÓK ÓKÓKþÒK÷ÒKðÒKéÒKâÒKÛÒKÔÒKÍÒKÆÒK¿ÒK¸ÒK±ÒKªÒK£ÒKœÒK•ÒKŽÒK‡ÒK€ÒKyÒKrÒKkÒKdÒK]ÒKVÒKOÒKHÒKAÒK:ÒK3ÒK,ÒK%ÒKÒKÒKÒK ÒKÒKûÑKôÑKíÑKæÑKßÑKØÑKÑÑKÊÑKÃÑK¼ÑKµÑK®ÑK§ÑK ÑK™ÑK’ÑK‹ÑK„ÑK}ÑKvÑKoÑKhÑKaÑKZÑKSÑKLÑKEÑK>ÑK7ÑK0ÑK)ÑK"ÑKÑKÑK ÑKÑKÿÐKøÐKñÐKêÐKãÐKÜÐKÕÐKÎÐKÇÐKÀÐK¹ÐK²ÐK«ÐK¤ÐKÐK–ÐKÐKˆÐKÐKzÐKsÐKlÐKeÐK^ÐKWÐKPÐKIÐKBÐK;ÐK4ÐK-ÐK&ÐKÐKÐKÐK ÐKÐKüÏKõÏKîÏKçÏKàÏKÙÏKÒÏKËÏKÄÏK½ÏK¶ÏK¯ÏK¨ÏK¡ÏKšÏK“ÏKŒÏK…ÏK~ÏKwÏKpÏKiÏKbÏK[ÏKTÏKMÏKFÏK?ÏK8ÏK1ÏK*ÏK#ÏKÏKÏKÏKÏKÏKùÎKòÎKëÎKäÎKÝÎKÖÎKÏÎKÈÎKÁÎKºÎK³ÎK¬ÎK¥ÎKžÎK—ÎKÎK‰ÎK‚ÎK{ÎKtÎKmÎKfÎK_ÎKXÎKQÎKJÎKCÎK<ÎK5ÎK.ÎK'ÎK ÎKÎKÎK ÎKÎKýÍKöÍKïÍKèÍKáÍKÚÍKÓÍKÌÍKÅÍK¾ÍK·ÍK°ÍK©ÍK¢ÍK›ÍK”ÍKÍK†ÍKÍKxÍKqÍKjÍKcÍK\ÍKUÍKNÍKGÍK@ÍK9ÍK2ÍK+ÍK$ÍKÍKÍKÍKÍKÍKúÌKóÌKìÌKåÌKÞÌK×ÌKÐÌKÉÌKÂÌK»ÌK´ÌK­ÌK¦ÌKŸÌK˜ÌK‘ÌKŠÌKƒÌK|ÌKuÌKnÌKgÌK`ÌKYÌKRÌKKÌKDÌK=ÌK6ÌK/ÌK(ÌK!ÌKÌKÌK ÌKÌKþËK÷ËKðËKéËKâËKÛËKÔËKÍËKÆËK¿ËK¸ËK±ËKªËK£ËKœËK•ËKŽËK‡ËK€ËKyËKrËKkËKdËK]ËKVËKOËKHËKAËK:ËK3ËK,ËK%ËKËKËKËK ËKËKûÊKôÊKíÊKæÊKßÊKØÊKÑÊKÊÊKÃÊK¼ÊKµÊK®ÊK§ÊK ÊK™ÊK’ÊK‹ÊK„ÊK}ÊKvÊKoÊKhÊKaÊKZÊKSÊKLÊKEÊK>ÊK7ÊK0ÊK)ÊK"ÊKÊKÊK ÊKÊKÿÉKøÉKñÉKêÉKãÉKÜÉKÕÉKÎÉKÇÉKÀÉK¹ÉK²ÉK«ÉK¤ÉKÉK–ÉKÉKˆÉKÉKzÉKsÉKlÉKeÉK^ÉKWÉKPÉKIÉKBÉK;ÉK4ÉK-ÉK&ÉKÉKÉKÉK ÉKÉKüÈKõÈKîÈKçÈKàÈKÙÈKÒÈKËÈKÄÈK½ÈK¶ÈK¯ÈK¨ÈK¡ÈKšÈK“ÈKŒÈK…ÈK~ÈKwÈKpÈKiÈKbÈK[ÈKTÈKMÈKFÈK?ÈK8ÈK1ÈK*ÈK#ÈKÈKÈKÈKÈKÈKùÇKòÇKëÇKäÇKÝÇKÖÇKÏÇKÈÇKÁÇKºÇK³ÇK¬ÇK¥ÇKžÇK—ÇKÇK‰ÇK‚ÇK{ÇKtÇKmÇKfÇK_ÇKXÇKQÇKJÇKCÇK<ÇK5ÇK.ÇK'ÇK ÇKÇKÇK ÇKÇKýÆKöÆKïÆKèÆKáÆKÚÆKÓÆKÌÆKÅÆK¾ÆK·ÆK°ÆK©ÆK¢ÆK›ÆK”ÆKÆK†ÆKÆKxÆKqÆKjÆKcÆK\ÆKUÆKNÆKGÆK@ÆK9ÆK2ÆK+ÆK$ÆKÆKÆKÆKÆKÆKúÅKóÅKìÅKåÅKÞÅK×ÅKÐÅKÉÅKÂÅK»ÅK´ÅK­ÅK¦ÅKŸÅK˜ÅK‘ÅKŠÅKƒÅK|ÅKuÅKnÅKgÅK`ÅKYÅKRÅKKÅKDÅK=ÅK6ÅK/ÅK(ÅK!ÅKÅKÅK ÅKÅKþÄK÷ÄKðÄKéÄKâÄKÛÄKÔÄKÍÄKÆÄK¿ÄK¸ÄK±ÄKªÄK£ÄKœÄK•ÄKŽÄK‡ÄK€ÄKyÄKrÄKkÄKdÄK]ÄKVÄKOÄKHÄKAÄK:ÄK3ÄK,ÄK%ÄKÄKÄKÄK ÄKÄKûÃKôÃKíÃKæÃKßÃKØÃKÑÃKÊÃKÃÃK¼ÃKµÃK®ÃK§ÃK ÃK™ÃK’ÃK‹ÃK„ÃK}ÃKvÃKoÃKhÃKaÃKZÃKSÃKLÃKEÃK>ÃK7ÃK0ÃK)ÃK"ÃKÃKÃK ÃKÃKÿÂKøÂKñÂKêÂKãÂKÜÂKÕÂKÎÂKÇÂKÀÂK¹ÂK²ÂK«ÂK¤ÂKÂK–ÂKÂKˆÂKÂKzÂKsÂKlÂKeÂK^ÂKWÂKPÂKIÂKBÂK;ÂK4ÂK-ÂK&ÂKÂKÂKÂK ÂKÂKüÁKõÁKîÁKçÁKàÁKÙÁKÒÁKËÁKÄÁK½ÁK¶ÁK¯ÁK¨ÁK¡ÁKšÁK“ÁKŒÁK…ÁK~ÁKwÁKpÁKiÁKbÁK[ÁKTÁKMÁKFÁK?ÁK8ÁK1ÁK*ÁK#ÁKÁKÁKÁKÁKÁKùÀKòÀKëÀKäÀKÝÀKÖÀKÏÀKÈÀKÁÀKºÀK³ÀK¬ÀK¥ÀKžÀK—ÀKÀK‰ÀK‚ÀK{ÀKtÀKmÀKfÀK_ÀKXÀKQÀKJÀKCÀK<ÀK5ÀK.ÀK'ÀK ÀKÀKÀK ÀKÀKý¿Kö¿Kï¿Kè¿Ká¿KÚ¿KÓ¿KÌ¿KÅ¿K¾¿K·¿K°¿K©¿K¢¿K›¿K”¿K¿K†¿K¿Kx¿Kq¿Kj¿Kc¿K\¿KU¿KN¿KG¿K@¿K9¿K2¿K+¿K$¿K¿K¿K¿K¿K¿Kú¾Kó¾Kì¾Kå¾KÞ¾K×¾KоKɾK¾K»¾K´¾K­¾K¦¾KŸ¾K˜¾K‘¾KоKƒ¾K|¾Ku¾Kn¾Kg¾K`¾KY¾KR¾KK¾KD¾K=¾K6¾K/¾K(¾K!¾K¾K¾K ¾K¾Kþ½K÷½Kð½Ké½Kâ½KÛ½KÔ½KͽKƽK¿½K¸½K±½Kª½K£½Kœ½K•½K޽K‡½K€½Ky½Kr½Kk½Kd½K]½KV½KO½KH½KA½K:½K3½K,½K%½K½K½K½K ½K½Kû¼Kô¼Kí¼Kæ¼Kß¼KؼKѼKʼKüK¼¼Kµ¼K®¼K§¼K ¼K™¼K’¼K‹¼K„¼K}¼Kv¼Ko¼Kh¼Ka¼KZ¼KS¼KL¼KE¼K>¼K7¼K0¼K)¼K"¼K¼K¼K ¼K¼Kÿ»Kø»Kñ»Kê»Kã»KÜ»KÕ»KλKÇ»KÀ»K¹»K²»K«»K¤»K»K–»K»Kˆ»K»Kz»Ks»Kl»Ke»K^»KW»KP»KI»KB»K;»K4»K-»K&»K»K»K»K »K»KüºKõºKîºKçºKàºKÙºKÒºK˺KĺK½ºK¶ºK¯ºK¨ºK¡ºKšºK“ºKŒºK…ºK~ºKwºKpºKiºKbºK[ºKTºKMºKFºK?ºK8ºK1ºK*ºK#ºKºKºKºKºKºKù¹Kò¹Kë¹Kä¹KݹKÖ¹KϹKȹKÁ¹Kº¹K³¹K¬¹K¥¹Kž¹K—¹K¹K‰¹K‚¹K{¹Kt¹Km¹Kf¹K_¹KX¹KQ¹KJ¹KC¹K<¹K5¹K.¹K'¹K ¹K¹K¹K ¹K¹Ký¸Kö¸Kï¸Kè¸Ká¸KÚ¸KÓ¸K̸KŸK¾¸K·¸K°¸K©¸K¢¸K›¸K”¸K¸K†¸K¸Kx¸Kq¸Kj¸Kc¸K\¸KU¸KN¸KG¸K@¸K9¸K2¸K+¸K$¸K¸K¸K¸K¸K¸Kú·Kó·Kì·Kå·KÞ·K×·KзKÉ·K·K»·K´·K­·K¦·KŸ·K˜·K‘·KŠ·Kƒ·K|·Ku·Kn·Kg·K`·KY·KR·KK·KD·K=·K6·K/·K(·K!·K·K·K ·K·Kþ¶K÷¶Kð¶Ké¶Kâ¶KÛ¶KÔ¶KͶKƶK¿¶K¸¶K±¶Kª¶K£¶Kœ¶K•¶K޶K‡¶K€¶Ky¶Kr¶Kk¶Kd¶K]¶KV¶KO¶KH¶KA¶K:¶K3¶K,¶K%¶K¶K¶K¶K ¶K¶KûµKôµKíµKæµKßµKصKѵKʵKõK¼µKµµK®µK§µK µK™µK’µK‹µK„µK}µKvµKoµKhµKaµKZµKSµKLµKEµK>µK7µK0µK)µK"µKµKµK µKµKÿ´Kø´Kñ´Kê´Kã´KÜ´KÕ´KδKÇ´KÀ´K¹´K²´K«´K¤´K´K–´K´Kˆ´K´Kz´Ks´Kl´Ke´K^´KW´KP´KI´KB´K;´K4´K-´K&´K´K´K´K ´K´Kü³Kõ³Kî³Kç³Kà³KÙ³KÒ³K˳KijK½³K¶³K¯³K¨³K¡³Kš³K“³KŒ³K…³K~³Kw³Kp³Ki³Kb³K[³KT³KM³KF³K?³K8³K1³K*³K#³K³K³K³K³K³Kù²Kò²Kë²Kä²KݲKÖ²KϲKȲKÁ²Kº²K³²K¬²K¥²Kž²K—²K²K‰²K‚²K{²Kt²Km²Kf²K_²KX²KQ²KJ²KC²K<²K5²K.²K'²K ²K²K²K ²K²Ký±Kö±Kï±Kè±Ká±KÚ±KÓ±ḴKűK¾±K·±K°±K©±K¢±K›±K”±K±K†±K±Kx±Kq±Kj±Kc±K\±KU±KN±KG±K@±K9±K2±K+±K$±K±K±K±K±K±Kú°Kó°Kì°Kå°KÞ°K×°KаKɰK°K»°K´°K­°K¦°KŸ°K˜°K‘°KаKƒ°K|°Ku°Kn°Kg°K`°KY°KR°KK°KD°K=°K6°K/°K(°K!°K°K°K °K°Kþ¯K÷¯Kð¯Ké¯Kâ¯KÛ¯KÔ¯KͯKƯK¿¯K¸¯K±¯Kª¯K£¯Kœ¯K•¯KޝK‡¯K€¯Ky¯Kr¯Kk¯Kd¯K]¯KV¯KO¯KH¯KA¯K:¯K3¯K,¯K%¯K¯K¯K¯K ¯K¯Kû®Kô®Kí®Kæ®Kß®KØ®KÑ®KÊ®KîK¼®Kµ®K®®K§®K ®K™®K’®K‹®K„®K}®Kv®Ko®Kh®Ka®KZ®KS®KL®KE®K>®K7®K0®K)®K"®K®K®K ®K®Kÿ­Kø­Kñ­Kê­Kã­KÜ­KÕ­KέKÇ­KÀ­K¹­K²­K«­K¤­K­K–­K­Kˆ­K­Kz­Ks­Kl­Ke­K^­KW­KP­KI­KB­K;­K4­K-­K&­K­K­K­K ­K­Kü¬Kõ¬Kî¬Kç¬Kà¬KÙ¬KÒ¬KˬKĬK½¬K¶¬K¯¬K¨¬K¡¬Kš¬K“¬KŒ¬K…¬K~¬Kw¬Kp¬Ki¬Kb¬K[¬KT¬KM¬KF¬K?¬K8¬K1¬K*¬K#¬K¬K¬K¬K¬K¬Kù«Kò«Kë«Kä«KÝ«KÖ«KÏ«KÈ«KÁ«Kº«K³«K¬«K¥«Kž«K—«K«K‰«K‚«K{«Kt«Km«Kf«K_«KX«KQ«KJ«KC«K<«K5«K.«K'«K «K«K«K «K«KýªKöªKïªKèªKáªKÚªKÓªK̪KŪK¾ªK·ªK°ªK©ªK¢ªK›ªK”ªKªK†ªKªKxªKqªKjªKcªK\ªKUªKNªKGªK@ªK9ªK2ªK+ªK$ªKªKªKªKªKªKú©Kó©Kì©Kå©KÞ©KשKЩKÉ©K©K»©K´©K­©K¦©KŸ©K˜©K‘©KŠ©Kƒ©K|©Ku©Kn©Kg©K`©KY©KR©KK©KD©K=©K6©K/©K(©K!©K©K©K ©K©Kþ¨K÷¨Kð¨Ké¨Kâ¨KÛ¨KÔ¨KͨKƨK¿¨K¸¨K±¨Kª¨K£¨Kœ¨K•¨KލK‡¨K€¨Ky¨Kr¨Kk¨Kd¨K]¨KV¨KO¨KH¨KA¨K:¨K3¨K,¨K%¨K¨K¨K¨K ¨K¨Kû§Kô§Kí§Kæ§Kß§KاKѧKʧKçK¼§Kµ§K®§K§§K §K™§K’§K‹§K„§K}§Kv§Ko§Kh§Ka§KZ§KS§KL§KE§K>§K7§K0§K)§K"§K§K§K §K§Kÿ¦Kø¦Kñ¦Kê¦Kã¦KܦKÕ¦KΦKǦKÀ¦K¹¦K²¦K«¦K¤¦K¦K–¦K¦Kˆ¦K¦Kz¦Ks¦Kl¦Ke¦K^¦KW¦KP¦KI¦KB¦K;¦K4¦K-¦K&¦K¦K¦K¦K ¦K¦Kü¥Kõ¥Kî¥Kç¥Kà¥KÙ¥KÒ¥KË¥KÄ¥K½¥K¶¥K¯¥K¨¥K¡¥Kš¥K“¥KŒ¥K…¥K~¥Kw¥Kp¥Ki¥Kb¥K[¥KT¥KM¥KF¥K?¥K8¥K1¥K*¥K#¥K¥K¥K¥K¥K¥Kù¤Kò¤Kë¤Kä¤KݤKÖ¤KϤKȤKÁ¤Kº¤K³¤K¬¤K¥¤Kž¤K—¤K¤K‰¤K‚¤K{¤Kt¤Km¤Kf¤K_¤KX¤KQ¤KJ¤KC¤K<¤K5¤K.¤K'¤K ¤K¤K¤K ¤K¤Ký£Kö£Kï£Kè£Ká£KÚ£KÓ£KÌ£KÅ£K¾£K·£K°£K©£K¢£K›£K”£K£K†£K£Kx£Kq£Kj£Kc£K\£KU£KN£KG£K@£K9£K2£K+£K$£K£K£K£K£K£Kú¢Kó¢Kì¢Kå¢KÞ¢K×¢KТKÉ¢K¢K»¢K´¢K­¢K¦¢KŸ¢K˜¢K‘¢KŠ¢Kƒ¢K|¢Ku¢Kn¢Kg¢K`¢KY¢KR¢KK¢KD¢K=¢K6¢K/¢K(¢K!¢K¢K¢K ¢K¢Kþ¡K÷¡Kð¡Ké¡Kâ¡KÛ¡KÔ¡KÍ¡KÆ¡K¿¡K¸¡K±¡Kª¡K£¡Kœ¡K•¡KŽ¡K‡¡K€¡Ky¡Kr¡Kk¡Kd¡K]¡KV¡KO¡KH¡KA¡K:¡K3¡K,¡K%¡K¡K¡K¡K ¡K¡Kû Kô Kí Kæ Kß KØ KÑ KÊ KàK¼ Kµ K® K§ K  K™ K’ K‹ K„ K} Kv Ko Kh Ka KZ KS KL KE K> K7 K0 K) K" K K K  K KÿŸKøŸKñŸKêŸKãŸKÜŸKÕŸKΟKÇŸKÀŸK¹ŸK²ŸK«ŸK¤ŸKŸK–ŸKŸKˆŸKŸKzŸKsŸKlŸKeŸK^ŸKWŸKPŸKIŸKBŸK;ŸK4ŸK-ŸK&ŸKŸKŸKŸK ŸKŸKüžKõžKîžKçžKàžKÙžKÒžKËžKÄžK½žK¶žK¯žK¨žK¡žKšžK“žKŒžK…žK~žKwžKpžKižKbžK[žKTžKMžKFžK?žK8žK1žK*žK#žKžKžKžKžKžKùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK™K7™K0™K)™K"™K™K™K ™K™Kÿ˜Kø˜Kñ˜Kê˜Kã˜KܘKÕ˜KΘKǘKÀ˜K¹˜K²˜K«˜K¤˜K˜K–˜K˜Kˆ˜K˜Kz˜Ks˜Kl˜Ke˜K^˜KW˜KP˜KI˜KB˜K;˜K4˜K-˜K&˜K˜K˜K˜K ˜K˜Kü—Kõ—Kî—Kç—Kà—KÙ—KÒ—KË—KÄ—K½—K¶—K¯—K¨—K¡—Kš—K“—KŒ—K…—K~—Kw—Kp—Ki—Kb—K[—KT—KM—KF—K?—K8—K1—K*—K#—K—K—K—K—K—Kù–Kò–Kë–Kä–KÝ–KÖ–KÏ–KÈ–KÁ–Kº–K³–K¬–K¥–Kž–K—–K–K‰–K‚–K{–Kt–Km–Kf–K_–KX–KQ–KJ–KC–K<–K5–K.–K'–K –K–K–K –K–Ký•Kö•Kï•Kè•Ká•KÚ•KÓ•KÌ•KÅ•K¾•K·•K°•K©•K¢•K›•K”•K•K†•K•Kx•Kq•Kj•Kc•K\•KU•KN•KG•K@•K9•K2•K+•K$•K•K•K•K•K•Kú”Kó”Kì”Kå”KÞ”K×”KДKÉ”K”K»”K´”K­”K¦”KŸ”K˜”K‘”KŠ”Kƒ”K|”Ku”Kn”Kg”K`”KY”KR”KK”KD”K=”K6”K/”K(”K!”K”K”K ”K”Kþ“K÷“Kð“Ké“Kâ“KÛ“KÔ“KÍ“KÆ“K¿“K¸“K±“Kª“K£“Kœ“K•“KŽ“K‡“K€“Ky“Kr“Kk“Kd“K]“KV“KO“KH“KA“K:“K3“K,“K%“K“K“K“K “K“Kû’Kô’Kí’Kæ’Kß’KØ’KÑ’KÊ’KÃ’K¼’Kµ’K®’K§’K ’K™’K’’K‹’K„’K}’Kv’Ko’Kh’Ka’KZ’KS’KL’KE’K>’K7’K0’K)’K"’K’K’K ’K’Kÿ‘Kø‘Kñ‘Kê‘Kã‘KÜ‘KÕ‘KΑKÇ‘KÀ‘K¹‘K²‘K«‘K¤‘K‘K–‘K‘Kˆ‘K‘Kz‘Ks‘Kl‘Ke‘K^‘KW‘KP‘KI‘KB‘K;‘K4‘K-‘K&‘K‘K‘K‘K ‘K‘KüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK‹K7‹K0‹K)‹K"‹K‹K‹K ‹K‹KÿŠKøŠKñŠKêŠKãŠKÜŠKÕŠKΊKÇŠKÀŠK¹ŠK²ŠK«ŠK¤ŠKŠK–ŠKŠKˆŠKŠKzŠKsŠKlŠKeŠK^ŠKWŠKPŠKIŠKBŠK;ŠK4ŠK-ŠK&ŠKŠKŠKŠK ŠKŠKü‰Kõ‰Kî‰Kç‰Kà‰KÙ‰KÒ‰KˉKĉK½‰K¶‰K¯‰K¨‰K¡‰Kš‰K“‰KŒ‰K…‰K~‰Kw‰Kp‰Ki‰Kb‰K[‰KT‰KM‰KF‰K?‰K8‰K1‰K*‰K#‰K‰K‰K‰K‰K‰KùˆKòˆKëˆKäˆK݈KÖˆKψKȈKÁˆKºˆK³ˆK¬ˆK¥ˆKžˆK—ˆKˆK‰ˆK‚ˆK{ˆKtˆKmˆKfˆK_ˆKXˆKQˆKJˆKCˆK<ˆK5ˆK.ˆK'ˆK ˆKˆKˆK ˆKˆKý‡Kö‡Kï‡Kè‡Ká‡KÚ‡KÓ‡K̇KŇK¾‡K·‡K°‡K©‡K¢‡K›‡K”‡K‡K†‡K‡Kx‡Kq‡Kj‡Kc‡K\‡KU‡KN‡KG‡K@‡K9‡K2‡K+‡K$‡K‡K‡K‡K‡K‡Kú†Kó†Kì†Kå†KÞ†K׆KІKɆK†K»†K´†K­†K¦†KŸ†K˜†K‘†KІKƒ†K|†Ku†Kn†Kg†K`†KY†KR†KK†KD†K=†K6†K/†K(†K!†K†K†K †K†Kþ…K÷…Kð…Ké…Kâ…KÛ…KÔ…KÍ…KÆ…K¿…K¸…K±…Kª…K£…Kœ…K•…KŽ…K‡…K€…Ky…Kr…Kk…Kd…K]…KV…KO…KH…KA…K:…K3…K,…K%…K…K…K…K …K…Kû„Kô„Kí„Kæ„Kß„KØ„KÑ„KÊ„KÄK¼„Kµ„K®„K§„K „K™„K’„K‹„K„„K}„Kv„Ko„Kh„Ka„KZ„KS„KL„KE„K>„K7„K0„K)„K"„K„K„K „K„KÿƒKøƒKñƒKêƒKãƒK܃KÕƒK΃KǃKÀƒK¹ƒK²ƒK«ƒK¤ƒKƒK–ƒKƒKˆƒKƒKzƒKsƒKlƒKeƒK^ƒKWƒKPƒKIƒKBƒK;ƒK4ƒK-ƒK&ƒKƒKƒKƒK ƒKƒKü‚Kõ‚Kî‚Kç‚Kà‚KÙ‚KÒ‚KË‚KÄ‚K½‚K¶‚K¯‚K¨‚K¡‚Kš‚K“‚KŒ‚K…‚K~‚Kw‚Kp‚Ki‚Kb‚K[‚KT‚KM‚KF‚K?‚K8‚K1‚K*‚K#‚K‚K‚K‚K‚K‚KùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK}K7}K0}K)}K"}K}K}K }K}Kÿ|Kø|Kñ|Kê|Kã|KÜ|KÕ|KÎ|KÇ|KÀ|K¹|K²|K«|K¤|K|K–|K|Kˆ|K|Kz|Ks|Kl|Ke|K^|KW|KP|KI|KB|K;|K4|K-|K&|K|K|K|K |K|Kü{Kõ{Kî{Kç{Kà{KÙ{KÒ{KË{KÄ{K½{K¶{K¯{K¨{K¡{Kš{K“{KŒ{K…{K~{Kw{Kp{Ki{Kb{K[{KT{KM{KF{K?{K8{K1{K*{K#{K{K{K{K{K{KùzKòzKëzKäzKÝzKÖzKÏzKÈzKÁzKºzK³zK¬zK¥zKžzK—zKzK‰zK‚zK{zKtzKmzKfzK_zKXzKQzKJzKCzKvK7vK0vK)vK"vKvKvK vKvKÿuKøuKñuKêuKãuKÜuKÕuKÎuKÇuKÀuK¹uK²uK«uK¤uKuK–uKuKˆuKuKzuKsuKluKeuK^uKWuKPuKIuKBuK;uK4uK-uK&uKuKuKuK uKuKütKõtKîtKçtKàtKÙtKÒtKËtKÄtK½tK¶tK¯tK¨tK¡tKštK“tKŒtK…tK~tKwtKptKitKbtK[tKTtKMtKFtK?tK8tK1tK*tK#tKtKtKtKtKtKùsKòsKësKäsKÝsKÖsKÏsKÈsKÁsKºsK³sK¬sK¥sKžsK—sKsK‰sK‚sK{sKtsKmsKfsK_sKXsKQsKJsKCsKoK7oK0oK)oK"oKoKoK oKoKÿnKønKñnKênKãnKÜnKÕnKÎnKÇnKÀnK¹nK²nK«nK¤nKnK–nKnKˆnKnKznKsnKlnKenK^nKWnKPnKInKBnK;nK4nK-nK&nKnKnKnK nKnKümKõmKîmKçmKàmKÙmKÒmKËmKÄmK½mK¶mK¯mK¨mK¡mKšmK“mKŒmK…mK~mKwmKpmKimKbmK[mKTmKMmKFmK?mK8mK1mK*mK#mKmKmKmKmKmKùlKòlKëlKälKÝlKÖlKÏlKÈlKÁlKºlK³lK¬lK¥lKžlK—lKlK‰lK‚lK{lKtlKmlKflK_lKXlKQlKJlKClKhK7hK0hK)hK"hKhKhK hKhKÿgKøgKñgKêgKãgKÜgKÕgKÎgKÇgKÀgK¹gK²gK«gK¤gKgK–gKgKˆgKgKzgKsgKlgKegK^gKWgKPgKIgKBgK;gK4gK-gK&gKgKgKgK gKgKüfKõfKîfKçfKàfKÙfKÒfKËfKÄfK½fK¶fK¯fK¨fK¡fKšfK“fKŒfK…fK~fKwfKpfKifKbfK[fKTfKMfKFfK?fK8fK1fK*fK#fKfKfKfKfKfKùeKòeKëeKäeKÝeKÖeKÏeKÈeKÁeKºeK³eK¬eK¥eKžeK—eKeK‰eK‚eK{eKteKmeKfeK_eKXeKQeKJeKCeKaK7aK0aK)aK"aKaKaK aKaKÿ`Kø`Kñ`Kê`Kã`KÜ`KÕ`KÎ`KÇ`KÀ`K¹`K²`K«`K¤`K`K–`K`Kˆ`K`Kz`Ks`Kl`Ke`K^`KW`KP`KI`KB`K;`K4`K-`K&`K`K`K`K `K`Kü_Kõ_Kî_Kç_Kà_KÙ_KÒ_KË_KÄ_K½_K¶_K¯_K¨_K¡_Kš_K“_KŒ_K…_K~_Kw_Kp_Ki_Kb_K[_KT_KM_KF_K?_K8_K1_K*_K#_K_K_K_K_K_Kù^Kò^Kë^Kä^KÝ^KÖ^KÏ^KÈ^KÁ^Kº^K³^K¬^K¥^Kž^K—^K^K‰^K‚^K{^Kt^Km^Kf^K_^KX^KQ^KJ^KC^K<^K5^K.^K'^K ^K^K^K ^K^Ký]Kö]Kï]Kè]Ká]KÚ]KÓ]KÌ]KÅ]K¾]K·]K°]K©]K¢]K›]K”]K]K†]K]Kx]Kq]Kj]Kc]K\]KU]KN]KG]K@]K9]K2]K+]K$]K]K]K]K]K]Kú\Kó\Kì\Kå\KÞ\K×\KÐ\KÉ\KÂ\K»\K´\K­\K¦\KŸ\K˜\K‘\KŠ\Kƒ\K|\Ku\Kn\Kg\K`\KY\KR\KK\KD\K=\K6\K/\K(\K!\K\K\K \K\Kþ[K÷[Kð[Ké[Kâ[KÛ[KÔ[KÍ[KÆ[K¿[K¸[K±[Kª[K£[Kœ[K•[KŽ[K‡[K€[Ky[Kr[Kk[Kd[K][KV[KO[KH[KA[K:[K3[K,[K%[K[K[K[K [K[KûZKôZKíZKæZKßZKØZKÑZKÊZKÃZK¼ZKµZK®ZK§ZK ZK™ZK’ZK‹ZK„ZK}ZKvZKoZKhZKaZKZZKSZKLZKEZK>ZK7ZK0ZK)ZK"ZKZKZK ZKZKÿYKøYKñYKêYKãYKÜYKÕYKÎYKÇYKÀYK¹YK²YK«YK¤YKYK–YKYKˆYKYKzYKsYKlYKeYK^YKWYKPYKIYKBYK;YK4YK-YK&YKYKYKYK YKYKüXKõXKîXKçXKàXKÙXKÒXKËXKÄXK½XK¶XK¯XK¨XK¡XKšXK“XKŒXK…XK~XKwXKpXKiXKbXK[XKTXKMXKFXK?XK8XK1XK*XK#XKXKXKXKXKXKùWKòWKëWKäWKÝWKÖWKÏWKÈWKÁWKºWK³WK¬WK¥WKžWK—WKWK‰WK‚WK{WKtWKmWKfWK_WKXWKQWKJWKCWKSK7SK0SK)SK"SKSKSK SKSKÿRKøRKñRKêRKãRKÜRKÕRKÎRKÇRKÀRK¹RK²RK«RK¤RKRK–RKRKˆRKRKzRKsRKlRKeRK^RKWRKPRKIRKBRK;RK4RK-RK&RKRKRKRK RKRKüQKõQKîQKçQKàQKÙQKÒQKËQKÄQK½QK¶QK¯QK¨QK¡QKšQK“QKŒQK…QK~QKwQKpQKiQKbQK[QKTQKMQKFQK?QK8QK1QK*QK#QKQKQKQKQKQKùPKòPKëPKäPKÝPKÖPKÏPKÈPKÁPKºPK³PK¬PK¥PKžPK—PKPK‰PK‚PK{PKtPKmPKfPK_PKXPKQPKJPKCPKLK7LK0LK)LK"LKLKLK LKLKÿKKøKKñKKêKKãKKÜKKÕKKÎKKÇKKÀKK¹KK²KK«KK¤KKKK–KKKKˆKKKKzKKsKKlKKeKK^KKWKKPKKIKKBKK;KK4KK-KK&KKKKKKKK KKKKüJKõJKîJKçJKàJKÙJKÒJKËJKÄJK½JK¶JK¯JK¨JK¡JKšJK“JKŒJK…JK~JKwJKpJKiJKbJK[JKTJKMJKFJK?JK8JK1JK*JK#JKJKJKJKJKJKùIKòIKëIKäIKÝIKÖIKÏIKÈIKÁIKºIK³IK¬IK¥IKžIK—IKIK‰IK‚IK{IKtIKmIKfIK_IKXIKQIKJIKCIKEK7EK0EK)EK"EKEKEK EKEKÿDKøDKñDKêDKãDKÜDKÕDKÎDKÇDKÀDK¹DK²DK«DK¤DKDK–DKDKˆDKDKzDKsDKlDKeDK^DKWDKPDKIDKBDK;DK4DK-DK&DKDKDKDK DKDKüCKõCKîCKçCKàCKÙCKÒCKËCKÄCK½CK¶CK¯CK¨CK¡CKšCK“CKŒCK…CK~CKwCKpCKiCKbCK[CKTCKMCKFCK?CK8CK1CK*CK#CKCKCKCKCKCKùBKòBKëBKäBKÝBKÖBKÏBKÈBKÁBKºBK³BK¬BK¥BKžBK—BKBK‰BK‚BK{BKtBKmBKfBK_BKXBKQBKJBKCBKKô>Kí>Kæ>Kß>KØ>KÑ>KÊ>KÃ>K¼>Kµ>K®>K§>K >K™>K’>K‹>K„>K}>Kv>Ko>Kh>Ka>KZ>KS>KL>KE>K>>K7>K0>K)>K">K>K>K >K>Kÿ=Kø=Kñ=Kê=Kã=KÜ=KÕ=KÎ=KÇ=KÀ=K¹=K²=K«=K¤=K=K–=K=Kˆ=K=Kz=Ks=Kl=Ke=K^=KW=KP=KI=KB=K;=K4=K-=K&=K=K=K=K =K=Kü7K77K07K)7K"7K7K7K 7K7Kÿ6Kø6Kñ6Kê6Kã6KÜ6KÕ6KÎ6KÇ6KÀ6K¹6K²6K«6K¤6K6K–6K6Kˆ6K6Kz6Ks6Kl6Ke6K^6KW6KP6KI6KB6K;6K46K-6K&6K6K6K6K 6K6Kü5Kõ5Kî5Kç5Kà5KÙ5KÒ5KË5KÄ5K½5K¶5K¯5K¨5K¡5Kš5K“5KŒ5K…5K~5Kw5Kp5Ki5Kb5K[5KT5KM5KF5K?5K85K15K*5K#5K5K5K5K5K5Kù4Kò4Kë4Kä4KÝ4KÖ4KÏ4KÈ4KÁ4Kº4K³4K¬4K¥4Kž4K—4K4K‰4K‚4K{4Kt4Km4Kf4K_4KX4KQ4KJ4KC4K<4K54K.4K'4K 4K4K4K 4K4Ký3Kö3Kï3Kè3Ká3KÚ3KÓ3KÌ3KÅ3K¾3K·3K°3K©3K¢3K›3K”3K3K†3K3Kx3Kq3Kj3Kc3K\3KU3KN3KG3K@3K93K23K+3K$3K3K3K3K3K3Kú2Kó2Kì2Kå2KÞ2K×2KÐ2KÉ2KÂ2K»2K´2K­2K¦2KŸ2K˜2K‘2KŠ2Kƒ2K|2Ku2Kn2Kg2K`2KY2KR2KK2KD2K=2K62K/2K(2K!2K2K2K 2K2Kþ1K÷1Kð1Ké1Kâ1KÛ1KÔ1KÍ1KÆ1K¿1K¸1K±1Kª1K£1Kœ1K•1KŽ1K‡1K€1Ky1Kr1Kk1Kd1K]1KV1KO1KH1KA1K:1K31K,1K%1K1K1K1K 1K1Kû0Kô0Kí0Kæ0Kß0KØ0KÑ0KÊ0KÃ0K¼0Kµ0K®0K§0K 0K™0K’0K‹0K„0K}0Kv0Ko0Kh0Ka0KZ0KS0KL0KE0K>0K70K00K)0K"0K0K0K 0K0Kÿ/Kø/Kñ/Kê/Kã/KÜ/KÕ/KÎ/KÇ/KÀ/K¹/K²/K«/K¤/K/K–/K/Kˆ/K/Kz/Ks/Kl/Ke/K^/KW/KP/KI/KB/K;/K4/K-/K&/K/K/K/K /K/Kü.Kõ.Kî.Kç.Kà.KÙ.KÒ.KË.KÄ.K½.K¶.K¯.K¨.K¡.Kš.K“.KŒ.K….K~.Kw.Kp.Ki.Kb.K[.KT.KM.KF.K?.K8.K1.K*.K#.K.K.K.K.K.Kù-Kò-Kë-Kä-KÝ-KÖ-KÏ-KÈ-KÁ-Kº-K³-K¬-K¥-Kž-K—-K-K‰-K‚-K{-Kt-Km-Kf-K_-KX-KQ-KJ-KC-K<-K5-K.-K'-K -K-K-K -K-Ký,Kö,Kï,Kè,Ká,KÚ,KÓ,KÌ,KÅ,K¾,K·,K°,K©,K¢,K›,K”,K,K†,K,Kx,Kq,Kj,Kc,K\,KU,KN,KG,K@,K9,K2,K+,K$,K,K,K,K,K,Kú+Kó+Kì+Kå+KÞ+K×+KÐ+KÉ+KÂ+K»+K´+K­+K¦+KŸ+K˜+K‘+KŠ+Kƒ+K|+Ku+Kn+Kg+K`+KY+KR+KK+KD+K=+K6+K/+K(+K!+K+K+K +K+Kþ*K÷*Kð*Ké*Kâ*KÛ*KÔ*KÍ*KÆ*K¿*K¸*K±*Kª*K£*Kœ*K•*KŽ*K‡*K€*Ky*Kr*Kk*Kd*K]*KV*KO*KH*KA*K:*K3*K,*K%*K*K*K*K *K*Kû)Kô)Kí)Kæ)Kß)KØ)KÑ)KÊ)KÃ)K¼)Kµ)K®)K§)K )K™)K’)K‹)K„)K})Kv)Ko)Kh)Ka)KZ)KS)KL)KE)K>)K7)K0)K))K")K)K)K )K)Kÿ(Kø(Kñ(Kê(Kã(KÜ(KÕ(KÎ(KÇ(KÀ(K¹(K²(K«(K¤(K(K–(K(Kˆ(K(Kz(Ks(Kl(Ke(K^(KW(KP(KI(KB(K;(K4(K-(K&(K(K(K(K (K(Kü'Kõ'Kî'Kç'Kà'KÙ'KÒ'KË'KÄ'K½'K¶'K¯'K¨'K¡'Kš'K“'KŒ'K…'K~'Kw'Kp'Ki'Kb'K['KT'KM'KF'K?'K8'K1'K*'K#'K'K'K'K'K'Kù&Kò&Kë&Kä&KÝ&KÖ&KÏ&KÈ&KÁ&Kº&K³&K¬&K¥&Kž&K—&K&K‰&K‚&K{&Kt&Km&Kf&K_&KX&KQ&KJ&KC&K<&K5&K.&K'&K &K&K&K &K&Ký%Kö%Kï%Kè%Ká%KÚ%KÓ%KÌ%KÅ%K¾%K·%K°%K©%K¢%K›%K”%K%K†%K%Kx%Kq%Kj%Kc%K\%KU%KN%KG%K@%K9%K2%K+%K$%K%K%K%K%K%Kú$Kó$Kì$Kå$KÞ$K×$KÐ$KÉ$KÂ$K»$K´$K­$K¦$KŸ$K˜$K‘$KŠ$Kƒ$K|$Ku$Kn$Kg$K`$KY$KR$KK$KD$K=$K6$K/$K($K!$K$K$K $K$Kþ#K÷#Kð#Ké#Kâ#KÛ#KÔ#KÍ#KÆ#K¿#K¸#K±#Kª#K£#Kœ#K•#KŽ#K‡#K€#Ky#Kr#Kk#Kd#K]#KV#KO#KH#KA#K:#K3#K,#K%#K#K#K#K #K#Kû"Kô"Kí"Kæ"Kß"KØ"KÑ"KÊ"KÃ"K¼"Kµ"K®"K§"K "K™"K’"K‹"K„"K}"Kv"Ko"Kh"Ka"KZ"KS"KL"KE"K>"K7"K0"K)"K""K"K"K "K"Kÿ!Kø!Kñ!Kê!Kã!KÜ!KÕ!KÎ!KÇ!KÀ!K¹!K²!K«!K¤!K!K–!K!Kˆ!K!Kz!Ks!Kl!Ke!K^!KW!KP!KI!KB!K;!K4!K-!K&!K!K!K!K !K!Kü Kõ Kî Kç Kà KÙ KÒ KË KÄ K½ K¶ K¯ K¨ K¡ Kš K“ KŒ K… K~ Kw Kp Ki Kb K[ KT KM KF K? K8 K1 K* K# K K K K K KùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKýKöKïKèKáKÚKÓKÌKÅK¾K·K°K©K¢K›K”KK†KKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKúKóKìKåKÞK×KÐKÉKÂK»K´K­K¦KŸK˜K‘KŠKƒK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKþK÷KðKéKâKÛKÔKÍKÆK¿K¸K±KªK£KœK•KŽK‡K€KyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKûKôKíKæKßKØKÑKÊKÃK¼KµK®K§K K™K’K‹K„K}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKýKöKïKèKáKÚKÓKÌKÅK¾K·K°K©K¢K›K”KK†KKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKúKóKìKåKÞK×KÐKÉKÂK»K´K­K¦KŸK˜K‘KŠKƒK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKþK÷KðKéKâKÛKÔKÍKÆK¿K¸K±KªK£KœK•KŽK‡K€KyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKûKôKíKæKßKØKÑKÊKÃK¼KµK®K§K K™K’K‹K„K}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKýKöKïKèKáKÚKÓKÌKÅK¾K·K°K©K¢K›K”KK†KKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKúKóKìKåKÞK×KÐKÉKÂK»K´K­K¦KŸK˜K‘KŠKƒK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKþK÷KðKéKâKÛKÔKÍKÆK¿K¸K±KªK£KœK•KŽK‡K€KyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKû Kô Kí Kæ Kß KØ KÑ KÊ Kà K¼ Kµ K® K§ K  K™ K’ K‹ K„ K} Kv Ko Kh Ka KZ KS KL KE K> K7 K0 K) K" K K K K Kÿ Kø Kñ Kê Kã KÜ KÕ KÎ KÇ KÀ K¹ K² K« K¤ K K– K Kˆ K Kz Ks Kl Ke K^ KW KP KI KB K; K4 K- K& K K K K K Kü Kõ Kî Kç Kà KÙ KÒ KË KÄ K½ K¶ K¯ K¨ K¡ Kš K“ KŒ K… K~ Kw Kp Ki Kb K[ KT KM KF K? K8 K1 K* K# K K K K K Kù Kò Kë Kä KÝ KÖ KÏ KÈ KÁ Kº K³ K¬ K¥ Kž K— K K‰ K‚ K{ Kt Km Kf K_ KX KQ KJ KC K< K5 K. K' K K K K K Ký Kö Kï Kè Ká KÚ KÓ KÌ KÅ K¾ K· K° K© K¢ K› K” K K† K Kx Kq Kj Kc K\ KU KN KG K@ K9 K2 K+ K$ K K K K K KúKóKìKåKÞK×KÐKÉKÂK»K´K­K¦KŸK˜K‘KŠKƒK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKþK÷KðKéKâKÛKÔKÍKÆK¿K¸K±KªK£KœK•KŽK‡K€KyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKûKôKíKæKßKØKÑKÊKÃK¼KµK®K§K K™K’K‹K„K}KvKoKhKaKZKSKLKEK>K7K0K)K"KKK KKÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCK<K5K.K'K KKK KKýKöKïKèKáKÚKÓKÌKÅK¾K·K°K©K¢K›K”KK†KKxKqKjKcK\KUKNKGK@K9K2K+K$KKKKKKúKóKìKåKÞK×KÐKÉKÂK»K´K­K¦KŸK˜K‘KŠKƒK|KuKnKgK`KYKRKKKDK=K6K/K(K!KKK KKþK÷KðKéKâKÛKÔKÍKÆK¿K¸K±KªK£KœK•KŽK‡K€KyKrKkKdK]KVKOKHKAK:K3K,K%KKKK KKûÿJôÿJíÿJæÿJßÿJØÿJÑÿJÊÿJÃÿJ¼ÿJµÿJ®ÿJ§ÿJ ÿJ™ÿJ’ÿJ‹ÿJ„ÿJ}ÿJvÿJoÿJhÿJaÿJZÿJSÿJLÿJEÿJ>ÿJ7ÿJ0ÿJ)ÿJ"ÿJÿJÿJ ÿJÿJÿþJøþJñþJêþJãþJÜþJÕþJÎþJÇþJÀþJ¹þJ²þJ«þJ¤þJþJ–þJþJˆþJþJzþJsþJlþJeþJ^þJWþJPþJIþJBþJ;þJ4þJ-þJ&þJþJþJþJ þJþJüýJõýJîýJçýJàýJÙýJÒýJËýJÄýJ½ýJ¶ýJ¯ýJ¨ýJ¡ýJšýJ“ýJŒýJ…ýJ~ýJwýJpýJiýJbýJ[ýJTýJMýJFýJ?ýJ8ýJ1ýJ*ýJ#ýJýJýJýJýJýJùüJòüJëüJäüJÝüJÖüJÏüJÈüJÁüJºüJ³üJ¬üJ¥üJžüJ—üJüJ‰üJ‚üJ{üJtüJmüJfüJ_üJXüJQüJJüJCüJ<üJ5üJ.üJ'üJ üJüJüJ üJüJýûJöûJïûJèûJáûJÚûJÓûJÌûJÅûJ¾ûJ·ûJ°ûJ©ûJ¢ûJ›ûJ”ûJûJ†ûJûJxûJqûJjûJcûJ\ûJUûJNûJGûJ@ûJ9ûJ2ûJ+ûJ$ûJûJûJûJûJûJúúJóúJìúJåúJÞúJ×úJÐúJÉúJÂúJ»úJ´úJ­úJ¦úJŸúJ˜úJ‘úJŠúJƒúJ|úJuúJnúJgúJ`úJYúJRúJKúJDúJ=úJ6úJ/úJ(úJ!úJúJúJ úJúJþùJ÷ùJðùJéùJâùJÛùJÔùJÍùJÆùJ¿ùJ¸ùJ±ùJªùJ£ùJœùJ•ùJŽùJ‡ùJ€ùJyùJrùJkùJdùJ]ùJVùJOùJHùJAùJ:ùJ3ùJ,ùJ%ùJùJùJùJ ùJùJûøJôøJíøJæøJßøJØøJÑøJÊøJÃøJ¼øJµøJ®øJ§øJ øJ™øJ’øJ‹øJ„øJ}øJvøJoøJhøJaøJZøJSøJLøJEøJ>øJ7øJ0øJ)øJ"øJøJøJ øJøJÿ÷Jø÷Jñ÷Jê÷Jã÷JÜ÷JÕ÷JÎ÷JÇ÷JÀ÷J¹÷J²÷J«÷J¤÷J÷J–÷J÷Jˆ÷J÷Jz÷Js÷Jl÷Je÷J^÷JW÷JP÷JI÷JB÷J;÷J4÷J-÷J&÷J÷J÷J÷J ÷J÷JüöJõöJîöJçöJàöJÙöJÒöJËöJÄöJ½öJ¶öJ¯öJ¨öJ¡öJšöJ“öJŒöJ…öJ~öJwöJpöJiöJböJ[öJTöJMöJFöJ?öJ8öJ1öJ*öJ#öJöJöJöJöJöJùõJòõJëõJäõJÝõJÖõJÏõJÈõJÁõJºõJ³õJ¬õJ¥õJžõJ—õJõJ‰õJ‚õJ{õJtõJmõJfõJ_õJXõJQõJJõJCõJ<õJ5õJ.õJ'õJ õJõJõJ õJõJýôJöôJïôJèôJáôJÚôJÓôJÌôJÅôJ¾ôJ·ôJ°ôJ©ôJ¢ôJ›ôJ”ôJôJ†ôJôJxôJqôJjôJcôJ\ôJUôJNôJGôJ@ôJ9ôJ2ôJ+ôJ$ôJôJôJôJôJôJúóJóóJìóJåóJÞóJ×óJÐóJÉóJÂóJ»óJ´óJ­óJ¦óJŸóJ˜óJ‘óJŠóJƒóJ|óJuóJnóJgóJ`óJYóJRóJKóJDóJ=óJ6óJ/óJ(óJ!óJóJóJ óJóJþòJ÷òJðòJéòJâòJÛòJÔòJÍòJÆòJ¿òJ¸òJ±òJªòJ£òJœòJ•òJŽòJ‡òJ€òJyòJròJkòJdòJ]òJVòJOòJHòJAòJ:òJ3òJ,òJ%òJòJòJòJ òJòJûñJôñJíñJæñJßñJØñJÑñJÊñJÃñJ¼ñJµñJ®ñJ§ñJ ñJ™ñJ’ñJ‹ñJ„ñJ}ñJvñJoñJhñJañJZñJSñJLñJEñJ>ñJ7ñJ0ñJ)ñJ"ñJñJñJ ñJñJÿðJøðJñðJêðJãðJÜðJÕðJÎðJÇðJÀðJ¹ðJ²ðJ«ðJ¤ðJðJ–ðJðJˆðJðJzðJsðJlðJeðJ^ðJWðJPðJIðJBðJ;ðJ4ðJ-ðJ&ðJðJðJðJ ðJðJüïJõïJîïJçïJàïJÙïJÒïJËïJÄïJ½ïJ¶ïJ¯ïJ¨ïJ¡ïJšïJ“ïJŒïJ…ïJ~ïJwïJpïJiïJbïJ[ïJTïJMïJFïJ?ïJ8ïJ1ïJ*ïJ#ïJïJïJïJïJïJùîJòîJëîJäîJÝîJÖîJÏîJÈîJÁîJºîJ³îJ¬îJ¥îJžîJ—îJîJ‰îJ‚îJ{îJtîJmîJfîJ_îJXîJQîJJîJCîJ<îJ5îJ.îJ'îJ îJîJîJ îJîJýíJöíJïíJèíJáíJÚíJÓíJÌíJÅíJ¾íJ·íJ°íJ©íJ¢íJ›íJ”íJíJ†íJíJxíJqíJjíJcíJ\íJUíJNíJGíJ@íJ9íJ2íJ+íJ$íJíJíJíJíJíJúìJóìJììJåìJÞìJ×ìJÐìJÉìJÂìJ»ìJ´ìJ­ìJ¦ìJŸìJ˜ìJ‘ìJŠìJƒìJ|ìJuìJnìJgìJ`ìJYìJRìJKìJDìJ=ìJ6ìJ/ìJ(ìJ!ìJìJìJ ìJìJþëJ÷ëJðëJéëJâëJÛëJÔëJÍëJÆëJ¿ëJ¸ëJ±ëJªëJ£ëJœëJ•ëJŽëJ‡ëJ€ëJyëJrëJkëJdëJ]ëJVëJOëJHëJAëJ:ëJ3ëJ,ëJ%ëJëJëJëJ ëJëJûêJôêJíêJæêJßêJØêJÑêJÊêJÃêJ¼êJµêJ®êJ§êJ êJ™êJ’êJ‹êJ„êJ}êJvêJoêJhêJaêJZêJSêJLêJEêJ>êJ7êJ0êJ)êJ"êJêJêJ êJêJÿéJøéJñéJêéJãéJÜéJÕéJÎéJÇéJÀéJ¹éJ²éJ«éJ¤éJéJ–éJéJˆéJéJzéJséJléJeéJ^éJWéJPéJIéJBéJ;éJ4éJ-éJ&éJéJéJéJ éJéJüèJõèJîèJçèJàèJÙèJÒèJËèJÄèJ½èJ¶èJ¯èJ¨èJ¡èJšèJ“èJŒèJ…èJ~èJwèJpèJièJbèJ[èJTèJMèJFèJ?èJ8èJ1èJ*èJ#èJèJèJèJèJèJùçJòçJëçJäçJÝçJÖçJÏçJÈçJÁçJºçJ³çJ¬çJ¥çJžçJ—çJçJ‰çJ‚çJ{çJtçJmçJfçJ_çJXçJQçJJçJCçJ<çJ5çJ.çJ'çJ çJçJçJ çJçJýæJöæJïæJèæJáæJÚæJÓæJÌæJÅæJ¾æJ·æJ°æJ©æJ¢æJ›æJ”æJæJ†æJæJxæJqæJjæJcæJ\æJUæJNæJGæJ@æJ9æJ2æJ+æJ$æJæJæJæJæJæJúåJóåJìåJååJÞåJ×åJÐåJÉåJÂåJ»åJ´åJ­åJ¦åJŸåJ˜åJ‘åJŠåJƒåJ|åJuåJnåJgåJ`åJYåJRåJKåJDåJ=åJ6åJ/åJ(åJ!åJåJåJ åJåJþäJ÷äJðäJéäJâäJÛäJÔäJÍäJÆäJ¿äJ¸äJ±äJªäJ£äJœäJ•äJŽäJ‡äJ€äJyäJräJkäJdäJ]äJVäJOäJHäJAäJ:äJ3äJ,äJ%äJäJäJäJ äJäJûãJôãJíãJæãJßãJØãJÑãJÊãJÃãJ¼ãJµãJ®ãJ§ãJ ãJ™ãJ’ãJ‹ãJ„ãJ}ãJvãJoãJhãJaãJZãJSãJLãJEãJ>ãJ7ãJ0ãJ)ãJ"ãJãJãJ ãJãJÿâJøâJñâJêâJãâJÜâJÕâJÎâJÇâJÀâJ¹âJ²âJ«âJ¤âJâJ–âJâJˆâJâJzâJsâJlâJeâJ^âJWâJPâJIâJBâJ;âJ4âJ-âJ&âJâJâJâJ âJâJüáJõáJîáJçáJàáJÙáJÒáJËáJÄáJ½áJ¶áJ¯áJ¨áJ¡áJšáJ“áJŒáJ…áJ~áJwáJpáJiáJbáJ[áJTáJMáJFáJ?áJ8áJ1áJ*áJ#áJáJáJáJáJáJùàJòàJëàJäàJÝàJÖàJÏàJÈàJÁàJºàJ³àJ¬àJ¥àJžàJ—àJàJ‰àJ‚àJ{àJtàJmàJfàJ_àJXàJQàJJàJCàJ<àJ5àJ.àJ'àJ àJàJàJ àJàJýßJößJïßJèßJáßJÚßJÓßJÌßJÅßJ¾ßJ·ßJ°ßJ©ßJ¢ßJ›ßJ”ßJßJ†ßJßJxßJqßJjßJcßJ\ßJUßJNßJGßJ@ßJ9ßJ2ßJ+ßJ$ßJßJßJßJßJßJúÞJóÞJìÞJåÞJÞÞJ×ÞJÐÞJÉÞJÂÞJ»ÞJ´ÞJ­ÞJ¦ÞJŸÞJ˜ÞJ‘ÞJŠÞJƒÞJ|ÞJuÞJnÞJgÞJ`ÞJYÞJRÞJKÞJDÞJ=ÞJ6ÞJ/ÞJ(ÞJ!ÞJÞJÞJ ÞJÞJþÝJ÷ÝJðÝJéÝJâÝJÛÝJÔÝJÍÝJÆÝJ¿ÝJ¸ÝJ±ÝJªÝJ£ÝJœÝJ•ÝJŽÝJ‡ÝJ€ÝJyÝJrÝJkÝJdÝJ]ÝJVÝJOÝJHÝJAÝJ:ÝJ3ÝJ,ÝJ%ÝJÝJÝJÝJ ÝJÝJûÜJôÜJíÜJæÜJßÜJØÜJÑÜJÊÜJÃÜJ¼ÜJµÜJ®ÜJ§ÜJ ÜJ™ÜJ’ÜJ‹ÜJ„ÜJ}ÜJvÜJoÜJhÜJaÜJZÜJSÜJLÜJEÜJ>ÜJ7ÜJ0ÜJ)ÜJ"ÜJÜJÜJ ÜJÜJÿÛJøÛJñÛJêÛJãÛJÜÛJÕÛJÎÛJÇÛJÀÛJ¹ÛJ²ÛJ«ÛJ¤ÛJÛJ–ÛJÛJˆÛJÛJzÛJsÛJlÛJeÛJ^ÛJWÛJPÛJIÛJBÛJ;ÛJ4ÛJ-ÛJ&ÛJÛJÛJÛJ ÛJÛJüÚJõÚJîÚJçÚJàÚJÙÚJÒÚJËÚJÄÚJ½ÚJ¶ÚJ¯ÚJ¨ÚJ¡ÚJšÚJ“ÚJŒÚJ…ÚJ~ÚJwÚJpÚJiÚJbÚJ[ÚJTÚJMÚJFÚJ?ÚJ8ÚJ1ÚJ*ÚJ#ÚJÚJÚJÚJÚJÚJùÙJòÙJëÙJäÙJÝÙJÖÙJÏÙJÈÙJÁÙJºÙJ³ÙJ¬ÙJ¥ÙJžÙJ—ÙJÙJ‰ÙJ‚ÙJ{ÙJtÙJmÙJfÙJ_ÙJXÙJQÙJJÙJCÙJ<ÙJ5ÙJ.ÙJ'ÙJ ÙJÙJÙJ ÙJÙJýØJöØJïØJèØJáØJÚØJÓØJÌØJÅØJ¾ØJ·ØJ°ØJ©ØJ¢ØJ›ØJ”ØJØJ†ØJØJxØJqØJjØJcØJ\ØJUØJNØJGØJ@ØJ9ØJ2ØJ+ØJ$ØJØJØJØJØJØJú×Jó×Jì×Jå×JÞ×J××JÐ×JÉ×JÂ×J»×J´×J­×J¦×JŸ×J˜×J‘×JŠ×Jƒ×J|×Ju×Jn×Jg×J`×JY×JR×JK×JD×J=×J6×J/×J(×J!×J×J×J ×J×JþÖJ÷ÖJðÖJéÖJâÖJÛÖJÔÖJÍÖJÆÖJ¿ÖJ¸ÖJ±ÖJªÖJ£ÖJœÖJ•ÖJŽÖJ‡ÖJ€ÖJyÖJrÖJkÖJdÖJ]ÖJVÖJOÖJHÖJAÖJ:ÖJ3ÖJ,ÖJ%ÖJÖJÖJÖJ ÖJÖJûÕJôÕJíÕJæÕJßÕJØÕJÑÕJÊÕJÃÕJ¼ÕJµÕJ®ÕJ§ÕJ ÕJ™ÕJ’ÕJ‹ÕJ„ÕJ}ÕJvÕJoÕJhÕJaÕJZÕJSÕJLÕJEÕJ>ÕJ7ÕJ0ÕJ)ÕJ"ÕJÕJÕJ ÕJÕJÿÔJøÔJñÔJêÔJãÔJÜÔJÕÔJÎÔJÇÔJÀÔJ¹ÔJ²ÔJ«ÔJ¤ÔJÔJ–ÔJÔJˆÔJÔJzÔJsÔJlÔJeÔJ^ÔJWÔJPÔJIÔJBÔJ;ÔJ4ÔJ-ÔJ&ÔJÔJÔJÔJ ÔJÔJüÓJõÓJîÓJçÓJàÓJÙÓJÒÓJËÓJÄÓJ½ÓJ¶ÓJ¯ÓJ¨ÓJ¡ÓJšÓJ“ÓJŒÓJ…ÓJ~ÓJwÓJpÓJiÓJbÓJ[ÓJTÓJMÓJFÓJ?ÓJ8ÓJ1ÓJ*ÓJ#ÓJÓJÓJÓJÓJÓJùÒJòÒJëÒJäÒJÝÒJÖÒJÏÒJÈÒJÁÒJºÒJ³ÒJ¬ÒJ¥ÒJžÒJ—ÒJÒJ‰ÒJ‚ÒJ{ÒJtÒJmÒJfÒJ_ÒJXÒJQÒJJÒJCÒJ<ÒJ5ÒJ.ÒJ'ÒJ ÒJÒJÒJ ÒJÒJýÑJöÑJïÑJèÑJáÑJÚÑJÓÑJÌÑJÅÑJ¾ÑJ·ÑJ°ÑJ©ÑJ¢ÑJ›ÑJ”ÑJÑJ†ÑJÑJxÑJqÑJjÑJcÑJ\ÑJUÑJNÑJGÑJ@ÑJ9ÑJ2ÑJ+ÑJ$ÑJÑJÑJÑJÑJÑJúÐJóÐJìÐJåÐJÞÐJ×ÐJÐÐJÉÐJÂÐJ»ÐJ´ÐJ­ÐJ¦ÐJŸÐJ˜ÐJ‘ÐJŠÐJƒÐJ|ÐJuÐJnÐJgÐJ`ÐJYÐJRÐJKÐJDÐJ=ÐJ6ÐJ/ÐJ(ÐJ!ÐJÐJÐJ ÐJÐJþÏJ÷ÏJðÏJéÏJâÏJÛÏJÔÏJÍÏJÆÏJ¿ÏJ¸ÏJ±ÏJªÏJ£ÏJœÏJ•ÏJŽÏJ‡ÏJ€ÏJyÏJrÏJkÏJdÏJ]ÏJVÏJOÏJHÏJAÏJ:ÏJ3ÏJ,ÏJ%ÏJÏJÏJÏJ ÏJÏJûÎJôÎJíÎJæÎJßÎJØÎJÑÎJÊÎJÃÎJ¼ÎJµÎJ®ÎJ§ÎJ ÎJ™ÎJ’ÎJ‹ÎJ„ÎJ}ÎJvÎJoÎJhÎJaÎJZÎJSÎJLÎJEÎJ>ÎJ7ÎJ0ÎJ)ÎJ"ÎJÎJÎJ ÎJÎJÿÍJøÍJñÍJêÍJãÍJÜÍJÕÍJÎÍJÇÍJÀÍJ¹ÍJ²ÍJ«ÍJ¤ÍJÍJ–ÍJÍJˆÍJÍJzÍJsÍJlÍJeÍJ^ÍJWÍJPÍJIÍJBÍJ;ÍJ4ÍJ-ÍJ&ÍJÍJÍJÍJ ÍJÍJüÌJõÌJîÌJçÌJàÌJÙÌJÒÌJËÌJÄÌJ½ÌJ¶ÌJ¯ÌJ¨ÌJ¡ÌJšÌJ“ÌJŒÌJ…ÌJ~ÌJwÌJpÌJiÌJbÌJ[ÌJTÌJMÌJFÌJ?ÌJ8ÌJ1ÌJ*ÌJ#ÌJÌJÌJÌJÌJÌJùËJòËJëËJäËJÝËJÖËJÏËJÈËJÁËJºËJ³ËJ¬ËJ¥ËJžËJ—ËJËJ‰ËJ‚ËJ{ËJtËJmËJfËJ_ËJXËJQËJJËJCËJ<ËJ5ËJ.ËJ'ËJ ËJËJËJ ËJËJýÊJöÊJïÊJèÊJáÊJÚÊJÓÊJÌÊJÅÊJ¾ÊJ·ÊJ°ÊJ©ÊJ¢ÊJ›ÊJ”ÊJÊJ†ÊJÊJxÊJqÊJjÊJcÊJ\ÊJUÊJNÊJGÊJ@ÊJ9ÊJ2ÊJ+ÊJ$ÊJÊJÊJÊJÊJÊJúÉJóÉJìÉJåÉJÞÉJ×ÉJÐÉJÉÉJÂÉJ»ÉJ´ÉJ­ÉJ¦ÉJŸÉJ˜ÉJ‘ÉJŠÉJƒÉJ|ÉJuÉJnÉJgÉJ`ÉJYÉJRÉJKÉJDÉJ=ÉJ6ÉJ/ÉJ(ÉJ!ÉJÉJÉJ ÉJÉJþÈJ÷ÈJðÈJéÈJâÈJÛÈJÔÈJÍÈJÆÈJ¿ÈJ¸ÈJ±ÈJªÈJ£ÈJœÈJ•ÈJŽÈJ‡ÈJ€ÈJyÈJrÈJkÈJdÈJ]ÈJVÈJOÈJHÈJAÈJ:ÈJ3ÈJ,ÈJ%ÈJÈJÈJÈJ ÈJÈJûÇJôÇJíÇJæÇJßÇJØÇJÑÇJÊÇJÃÇJ¼ÇJµÇJ®ÇJ§ÇJ ÇJ™ÇJ’ÇJ‹ÇJ„ÇJ}ÇJvÇJoÇJhÇJaÇJZÇJSÇJLÇJEÇJ>ÇJ7ÇJ0ÇJ)ÇJ"ÇJÇJÇJ ÇJÇJÿÆJøÆJñÆJêÆJãÆJÜÆJÕÆJÎÆJÇÆJÀÆJ¹ÆJ²ÆJ«ÆJ¤ÆJÆJ–ÆJÆJˆÆJÆJzÆJsÆJlÆJeÆJ^ÆJWÆJPÆJIÆJBÆJ;ÆJ4ÆJ-ÆJ&ÆJÆJÆJÆJ ÆJÆJüÅJõÅJîÅJçÅJàÅJÙÅJÒÅJËÅJÄÅJ½ÅJ¶ÅJ¯ÅJ¨ÅJ¡ÅJšÅJ“ÅJŒÅJ…ÅJ~ÅJwÅJpÅJiÅJbÅJ[ÅJTÅJMÅJFÅJ?ÅJ8ÅJ1ÅJ*ÅJ#ÅJÅJÅJÅJÅJÅJùÄJòÄJëÄJäÄJÝÄJÖÄJÏÄJÈÄJÁÄJºÄJ³ÄJ¬ÄJ¥ÄJžÄJ—ÄJÄJ‰ÄJ‚ÄJ{ÄJtÄJmÄJfÄJ_ÄJXÄJQÄJJÄJCÄJ<ÄJ5ÄJ.ÄJ'ÄJ ÄJÄJÄJ ÄJÄJýÃJöÃJïÃJèÃJáÃJÚÃJÓÃJÌÃJÅÃJ¾ÃJ·ÃJ°ÃJ©ÃJ¢ÃJ›ÃJ”ÃJÃJ†ÃJÃJxÃJqÃJjÃJcÃJ\ÃJUÃJNÃJGÃJ@ÃJ9ÃJ2ÃJ+ÃJ$ÃJÃJÃJÃJÃJÃJúÂJóÂJìÂJåÂJÞÂJ×ÂJÐÂJÉÂJÂÂJ»ÂJ´ÂJ­ÂJ¦ÂJŸÂJ˜ÂJ‘ÂJŠÂJƒÂJ|ÂJuÂJnÂJgÂJ`ÂJYÂJRÂJKÂJDÂJ=ÂJ6ÂJ/ÂJ(ÂJ!ÂJÂJÂJ ÂJÂJþÁJ÷ÁJðÁJéÁJâÁJÛÁJÔÁJÍÁJÆÁJ¿ÁJ¸ÁJ±ÁJªÁJ£ÁJœÁJ•ÁJŽÁJ‡ÁJ€ÁJyÁJrÁJkÁJdÁJ]ÁJVÁJOÁJHÁJAÁJ:ÁJ3ÁJ,ÁJ%ÁJÁJÁJÁJ ÁJÁJûÀJôÀJíÀJæÀJßÀJØÀJÑÀJÊÀJÃÀJ¼ÀJµÀJ®ÀJ§ÀJ ÀJ™ÀJ’ÀJ‹ÀJ„ÀJ}ÀJvÀJoÀJhÀJaÀJZÀJSÀJLÀJEÀJ>ÀJ7ÀJ0ÀJ)ÀJ"ÀJÀJÀJ ÀJÀJÿ¿Jø¿Jñ¿Jê¿Jã¿JÜ¿JÕ¿JοJÇ¿JÀ¿J¹¿J²¿J«¿J¤¿J¿J–¿J¿Jˆ¿J¿Jz¿Js¿Jl¿Je¿J^¿JW¿JP¿JI¿JB¿J;¿J4¿J-¿J&¿J¿J¿J¿J ¿J¿Jü¾Jõ¾Jî¾Jç¾Jà¾JÙ¾JÒ¾J˾JľJ½¾J¶¾J¯¾J¨¾J¡¾Jš¾J“¾JŒ¾J…¾J~¾Jw¾Jp¾Ji¾Jb¾J[¾JT¾JM¾JF¾J?¾J8¾J1¾J*¾J#¾J¾J¾J¾J¾J¾Jù½Jò½Jë½Jä½JݽJÖ½JϽJȽJÁ½Jº½J³½J¬½J¥½Jž½J—½J½J‰½J‚½J{½Jt½Jm½Jf½J_½JX½JQ½JJ½JC½J<½J5½J.½J'½J ½J½J½J ½J½Jý¼Jö¼Jï¼Jè¼Já¼JÚ¼JÓ¼J̼JżJ¾¼J·¼J°¼J©¼J¢¼J›¼J”¼J¼J†¼J¼Jx¼Jq¼Jj¼Jc¼J\¼JU¼JN¼JG¼J@¼J9¼J2¼J+¼J$¼J¼J¼J¼J¼J¼Jú»Jó»Jì»Jå»JÞ»J×»JлJÉ»J»J»»J´»J­»J¦»JŸ»J˜»J‘»JŠ»Jƒ»J|»Ju»Jn»Jg»J`»JY»JR»JK»JD»J=»J6»J/»J(»J!»J»J»J »J»JþºJ÷ºJðºJéºJâºJÛºJÔºJͺJƺJ¿ºJ¸ºJ±ºJªºJ£ºJœºJ•ºJŽºJ‡ºJ€ºJyºJrºJkºJdºJ]ºJVºJOºJHºJAºJ:ºJ3ºJ,ºJ%ºJºJºJºJ ºJºJû¹Jô¹Jí¹Jæ¹Jß¹JعJѹJʹJùJ¼¹Jµ¹J®¹J§¹J ¹J™¹J’¹J‹¹J„¹J}¹Jv¹Jo¹Jh¹Ja¹JZ¹JS¹JL¹JE¹J>¹J7¹J0¹J)¹J"¹J¹J¹J ¹J¹Jÿ¸Jø¸Jñ¸Jê¸Jã¸JܸJÕ¸JθJǸJÀ¸J¹¸J²¸J«¸J¤¸J¸J–¸J¸Jˆ¸J¸Jz¸Js¸Jl¸Je¸J^¸JW¸JP¸JI¸JB¸J;¸J4¸J-¸J&¸J¸J¸J¸J ¸J¸Jü·Jõ·Jî·Jç·Jà·JÙ·JÒ·JË·JÄ·J½·J¶·J¯·J¨·J¡·Jš·J“·JŒ·J…·J~·Jw·Jp·Ji·Jb·J[·JT·JM·JF·J?·J8·J1·J*·J#·J·J·J·J·J·Jù¶Jò¶Jë¶Jä¶JݶJÖ¶J϶JȶJÁ¶Jº¶J³¶J¬¶J¥¶Jž¶J—¶J¶J‰¶J‚¶J{¶Jt¶Jm¶Jf¶J_¶JX¶JQ¶JJ¶JC¶J<¶J5¶J.¶J'¶J ¶J¶J¶J ¶J¶JýµJöµJïµJèµJáµJÚµJÓµJ̵JŵJ¾µJ·µJ°µJ©µJ¢µJ›µJ”µJµJ†µJµJxµJqµJjµJcµJ\µJUµJNµJGµJ@µJ9µJ2µJ+µJ$µJµJµJµJµJµJú´Jó´Jì´Jå´JÞ´J×´JдJÉ´J´J»´J´´J­´J¦´JŸ´J˜´J‘´JŠ´Jƒ´J|´Ju´Jn´Jg´J`´JY´JR´JK´JD´J=´J6´J/´J(´J!´J´J´J ´J´Jþ³J÷³Jð³Jé³Jâ³JÛ³JÔ³JͳJƳJ¿³J¸³J±³Jª³J£³Jœ³J•³J޳J‡³J€³Jy³Jr³Jk³Jd³J]³JV³JO³JH³JA³J:³J3³J,³J%³J³J³J³J ³J³Jû²Jô²Jí²Jæ²Jß²JزJѲJʲJòJ¼²Jµ²J®²J§²J ²J™²J’²J‹²J„²J}²Jv²Jo²Jh²Ja²JZ²JS²JL²JE²J>²J7²J0²J)²J"²J²J²J ²J²Jÿ±Jø±Jñ±Jê±Jã±JܱJÕ±JαJDZJÀ±J¹±J²±J«±J¤±J±J–±J±Jˆ±J±Jz±Js±Jl±Je±J^±JW±JP±JI±JB±J;±J4±J-±J&±J±J±J±J ±J±Jü°Jõ°Jî°Jç°Jà°JÙ°JÒ°J˰JİJ½°J¶°J¯°J¨°J¡°Jš°J“°JŒ°J…°J~°Jw°Jp°Ji°Jb°J[°JT°JM°JF°J?°J8°J1°J*°J#°J°J°J°J°J°Jù¯Jò¯Jë¯Jä¯JݯJÖ¯JϯJȯJÁ¯Jº¯J³¯J¬¯J¥¯Jž¯J—¯J¯J‰¯J‚¯J{¯Jt¯Jm¯Jf¯J_¯JX¯JQ¯JJ¯JC¯J<¯J5¯J.¯J'¯J ¯J¯J¯J ¯J¯Jý®Jö®Jï®Jè®Já®JÚ®JÓ®JÌ®JÅ®J¾®J·®J°®J©®J¢®J›®J”®J®J†®J®Jx®Jq®Jj®Jc®J\®JU®JN®JG®J@®J9®J2®J+®J$®J®J®J®J®J®Jú­Jó­Jì­Jå­JÞ­J×­JЭJÉ­J­J»­J´­J­­J¦­JŸ­J˜­J‘­JŠ­Jƒ­J|­Ju­Jn­Jg­J`­JY­JR­JK­JD­J=­J6­J/­J(­J!­J­J­J ­J­Jþ¬J÷¬Jð¬Jé¬Jâ¬JÛ¬JÔ¬JͬJƬJ¿¬J¸¬J±¬Jª¬J£¬Jœ¬J•¬JެJ‡¬J€¬Jy¬Jr¬Jk¬Jd¬J]¬JV¬JO¬JH¬JA¬J:¬J3¬J,¬J%¬J¬J¬J¬J ¬J¬Jû«Jô«Jí«Jæ«Jß«JØ«JÑ«JÊ«JëJ¼«Jµ«J®«J§«J «J™«J’«J‹«J„«J}«Jv«Jo«Jh«Ja«JZ«JS«JL«JE«J>«J7«J0«J)«J"«J«J«J «J«JÿªJøªJñªJêªJãªJܪJÕªJΪJǪJÀªJ¹ªJ²ªJ«ªJ¤ªJªJ–ªJªJˆªJªJzªJsªJlªJeªJ^ªJWªJPªJIªJBªJ;ªJ4ªJ-ªJ&ªJªJªJªJ ªJªJü©Jõ©Jî©Jç©Jà©JÙ©JÒ©JË©JÄ©J½©J¶©J¯©J¨©J¡©Jš©J“©JŒ©J…©J~©Jw©Jp©Ji©Jb©J[©JT©JM©JF©J?©J8©J1©J*©J#©J©J©J©J©J©Jù¨Jò¨Jë¨Jä¨JݨJÖ¨JϨJȨJÁ¨Jº¨J³¨J¬¨J¥¨Jž¨J—¨J¨J‰¨J‚¨J{¨Jt¨Jm¨Jf¨J_¨JX¨JQ¨JJ¨JC¨J<¨J5¨J.¨J'¨J ¨J¨J¨J ¨J¨Jý§Jö§Jï§Jè§Já§JÚ§JÓ§J̧JŧJ¾§J·§J°§J©§J¢§J›§J”§J§J†§J§Jx§Jq§Jj§Jc§J\§JU§JN§JG§J@§J9§J2§J+§J$§J§J§J§J§J§Jú¦Jó¦Jì¦Jå¦JÞ¦JצJЦJɦJ¦J»¦J´¦J­¦J¦¦JŸ¦J˜¦J‘¦JЦJƒ¦J|¦Ju¦Jn¦Jg¦J`¦JY¦JR¦JK¦JD¦J=¦J6¦J/¦J(¦J!¦J¦J¦J ¦J¦Jþ¥J÷¥Jð¥Jé¥Jâ¥JÛ¥JÔ¥JÍ¥JÆ¥J¿¥J¸¥J±¥Jª¥J£¥Jœ¥J•¥JŽ¥J‡¥J€¥Jy¥Jr¥Jk¥Jd¥J]¥JV¥JO¥JH¥JA¥J:¥J3¥J,¥J%¥J¥J¥J¥J ¥J¥Jû¤Jô¤Jí¤Jæ¤JߤJؤJѤJʤJäJ¼¤Jµ¤J®¤J§¤J ¤J™¤J’¤J‹¤J„¤J}¤Jv¤Jo¤Jh¤Ja¤JZ¤JS¤JL¤JE¤J>¤J7¤J0¤J)¤J"¤J¤J¤J ¤J¤Jÿ£Jø£Jñ£Jê£Jã£JÜ£JÕ£JΣJÇ£JÀ£J¹£J²£J«£J¤£J£J–£J£Jˆ£J£Jz£Js£Jl£Je£J^£JW£JP£JI£JB£J;£J4£J-£J&£J£J£J£J £J£Jü¢Jõ¢Jî¢Jç¢Jà¢JÙ¢JÒ¢JË¢JÄ¢J½¢J¶¢J¯¢J¨¢J¡¢Jš¢J“¢JŒ¢J…¢J~¢Jw¢Jp¢Ji¢Jb¢J[¢JT¢JM¢JF¢J?¢J8¢J1¢J*¢J#¢J¢J¢J¢J¢J¢Jù¡Jò¡Jë¡Jä¡JÝ¡JÖ¡JÏ¡JÈ¡JÁ¡Jº¡J³¡J¬¡J¥¡Jž¡J—¡J¡J‰¡J‚¡J{¡Jt¡Jm¡Jf¡J_¡JX¡JQ¡JJ¡JC¡J<¡J5¡J.¡J'¡J ¡J¡J¡J ¡J¡Jý Jö Jï Jè Já JÚ JÓ JÌ JÅ J¾ J· J° J© J¢ J› J” J J† J Jx Jq Jj Jc J\ JU JN JG J@ J9 J2 J+ J$ J J J J J JúŸJóŸJìŸJåŸJÞŸJןJПJÉŸJŸJ»ŸJ´ŸJ­ŸJ¦ŸJŸŸJ˜ŸJ‘ŸJŠŸJƒŸJ|ŸJuŸJnŸJgŸJ`ŸJYŸJRŸJKŸJDŸJ=ŸJ6ŸJ/ŸJ(ŸJ!ŸJŸJŸJ ŸJŸJþžJ÷žJðžJéžJâžJÛžJÔžJÍžJÆžJ¿žJ¸žJ±žJªžJ£žJœžJ•žJŽžJ‡žJ€žJyžJržJkžJdžJ]žJVžJOžJHžJAžJ:žJ3žJ,žJ%žJžJžJžJ žJžJûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿœJøœJñœJêœJãœJÜœJÕœJΜJÇœJÀœJ¹œJ²œJ«œJ¤œJœJ–œJœJˆœJœJzœJsœJlœJeœJ^œJWœJPœJIœJBœJ;œJ4œJ-œJ&œJœJœJœJ œJœJü›Jõ›Jî›Jç›Jà›JÙ›JÒ›JË›JÄ›J½›J¶›J¯›J¨›J¡›Jš›J“›JŒ›J…›J~›Jw›Jp›Ji›Jb›J[›JT›JM›JF›J?›J8›J1›J*›J#›J›J›J›J›J›JùšJòšJëšJäšJÝšJÖšJÏšJÈšJÁšJºšJ³šJ¬šJ¥šJžšJ—šJšJ‰šJ‚šJ{šJtšJmšJfšJ_šJXšJQšJJšJCšJ<šJ5šJ.šJ'šJ šJšJšJ šJšJý™Jö™Jï™Jè™Já™JÚ™JÓ™JÌ™JÅ™J¾™J·™J°™J©™J¢™J›™J”™J™J†™J™Jx™Jq™Jj™Jc™J\™JU™JN™JG™J@™J9™J2™J+™J$™J™J™J™J™J™Jú˜Jó˜Jì˜Jå˜JÞ˜JטJИJɘJ˜J»˜J´˜J­˜J¦˜JŸ˜J˜˜J‘˜JŠ˜Jƒ˜J|˜Ju˜Jn˜Jg˜J`˜JY˜JR˜JK˜JD˜J=˜J6˜J/˜J(˜J!˜J˜J˜J ˜J˜Jþ—J÷—Jð—Jé—Jâ—JÛ—JÔ—JÍ—JÆ—J¿—J¸—J±—Jª—J£—Jœ—J•—JŽ—J‡—J€—Jy—Jr—Jk—Jd—J]—JV—JO—JH—JA—J:—J3—J,—J%—J—J—J—J —J—Jû–Jô–Jí–Jæ–Jß–JØ–JÑ–JÊ–JÖJ¼–Jµ–J®–J§–J –J™–J’–J‹–J„–J}–Jv–Jo–Jh–Ja–JZ–JS–JL–JE–J>–J7–J0–J)–J"–J–J–J –J–Jÿ•Jø•Jñ•Jê•Jã•JÜ•JÕ•JΕJÇ•JÀ•J¹•J²•J«•J¤•J•J–•J•Jˆ•J•Jz•Js•Jl•Je•J^•JW•JP•JI•JB•J;•J4•J-•J&•J•J•J•J •J•Jü”Jõ”Jî”Jç”Jà”JÙ”JÒ”JË”JÄ”J½”J¶”J¯”J¨”J¡”Jš”J“”JŒ”J…”J~”Jw”Jp”Ji”Jb”J[”JT”JM”JF”J?”J8”J1”J*”J#”J”J”J”J”J”Jù“Jò“Jë“Jä“JÝ“JÖ“JÏ“JÈ“JÁ“Jº“J³“J¬“J¥“Jž“J—“J“J‰“J‚“J{“Jt“Jm“Jf“J_“JX“JQ“JJ“JC“J<“J5“J.“J'“J “J“J“J “J“Jý’Jö’Jï’Jè’Já’JÚ’JÓ’JÌ’JÅ’J¾’J·’J°’J©’J¢’J›’J”’J’J†’J’Jx’Jq’Jj’Jc’J\’JU’JN’JG’J@’J9’J2’J+’J$’J’J’J’J’J’Jú‘Jó‘Jì‘Jå‘JÞ‘JבJБJÉ‘J‘J»‘J´‘J­‘J¦‘JŸ‘J˜‘J‘‘JŠ‘Jƒ‘J|‘Ju‘Jn‘Jg‘J`‘JY‘JR‘JK‘JD‘J=‘J6‘J/‘J(‘J!‘J‘J‘J ‘J‘JþJ÷JðJéJâJÛJÔJÍJÆJ¿J¸J±JªJ£JœJ•JŽJ‡J€JyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿŽJøŽJñŽJêŽJãŽJÜŽJÕŽJÎŽJÇŽJÀŽJ¹ŽJ²ŽJ«ŽJ¤ŽJŽJ–ŽJŽJˆŽJŽJzŽJsŽJlŽJeŽJ^ŽJWŽJPŽJIŽJBŽJ;ŽJ4ŽJ-ŽJ&ŽJŽJŽJŽJ ŽJŽJüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùŒJòŒJëŒJäŒJÝŒJÖŒJÏŒJÈŒJÁŒJºŒJ³ŒJ¬ŒJ¥ŒJžŒJ—ŒJŒJ‰ŒJ‚ŒJ{ŒJtŒJmŒJfŒJ_ŒJXŒJQŒJJŒJCŒJ<ŒJ5ŒJ.ŒJ'ŒJ ŒJŒJŒJ ŒJŒJý‹Jö‹Jï‹Jè‹Já‹JÚ‹JÓ‹JÌ‹JÅ‹J¾‹J·‹J°‹J©‹J¢‹J›‹J”‹J‹J†‹J‹Jx‹Jq‹Jj‹Jc‹J\‹JU‹JN‹JG‹J@‹J9‹J2‹J+‹J$‹J‹J‹J‹J‹J‹JúŠJóŠJìŠJåŠJÞŠJ׊JЊJÉŠJŠJ»ŠJ´ŠJ­ŠJ¦ŠJŸŠJ˜ŠJ‘ŠJŠŠJƒŠJ|ŠJuŠJnŠJgŠJ`ŠJYŠJRŠJKŠJDŠJ=ŠJ6ŠJ/ŠJ(ŠJ!ŠJŠJŠJ ŠJŠJþ‰J÷‰Jð‰Jé‰Jâ‰JÛ‰JÔ‰J͉JƉJ¿‰J¸‰J±‰Jª‰J£‰Jœ‰J•‰JމJ‡‰J€‰Jy‰Jr‰Jk‰Jd‰J]‰JV‰JO‰JH‰JA‰J:‰J3‰J,‰J%‰J‰J‰J‰J ‰J‰JûˆJôˆJíˆJæˆJ߈J؈JшJʈJÈJ¼ˆJµˆJ®ˆJ§ˆJ ˆJ™ˆJ’ˆJ‹ˆJ„ˆJ}ˆJvˆJoˆJhˆJaˆJZˆJSˆJLˆJEˆJ>ˆJ7ˆJ0ˆJ)ˆJ"ˆJˆJˆJ ˆJˆJÿ‡Jø‡Jñ‡Jê‡Jã‡J܇JÕ‡J·JLJJÀ‡J¹‡J²‡J«‡J¤‡J‡J–‡J‡Jˆ‡J‡Jz‡Js‡Jl‡Je‡J^‡JW‡JP‡JI‡JB‡J;‡J4‡J-‡J&‡J‡J‡J‡J ‡J‡Jü†Jõ†Jî†Jç†Jà†JÙ†JÒ†JˆJĆJ½†J¶†J¯†J¨†J¡†Jš†J“†JŒ†J…†J~†Jw†Jp†Ji†Jb†J[†JT†JM†JF†J?†J8†J1†J*†J#†J†J†J†J†J†Jù…Jò…Jë…Jä…JÝ…JÖ…JÏ…JÈ…JÁ…Jº…J³…J¬…J¥…Jž…J—…J…J‰…J‚…J{…Jt…Jm…Jf…J_…JX…JQ…JJ…JC…J<…J5…J.…J'…J …J…J…J …J…Jý„Jö„Jï„Jè„Já„JÚ„JÓ„JÌ„JÅ„J¾„J·„J°„J©„J¢„J›„J”„J„J†„J„Jx„Jq„Jj„Jc„J\„JU„JN„JG„J@„J9„J2„J+„J$„J„J„J„J„J„JúƒJóƒJìƒJåƒJÞƒJ׃JЃJɃJƒJ»ƒJ´ƒJ­ƒJ¦ƒJŸƒJ˜ƒJ‘ƒJŠƒJƒƒJ|ƒJuƒJnƒJgƒJ`ƒJYƒJRƒJKƒJDƒJ=ƒJ6ƒJ/ƒJ(ƒJ!ƒJƒJƒJ ƒJƒJþ‚J÷‚Jð‚Jé‚Jâ‚JÛ‚JÔ‚JÍ‚JÆ‚J¿‚J¸‚J±‚Jª‚J£‚Jœ‚J•‚JŽ‚J‡‚J€‚Jy‚Jr‚Jk‚Jd‚J]‚JV‚JO‚JH‚JA‚J:‚J3‚J,‚J%‚J‚J‚J‚J ‚J‚JûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿ€Jø€Jñ€Jê€Jã€JÜ€JÕ€J΀JÇ€JÀ€J¹€J²€J«€J¤€J€J–€J€Jˆ€J€Jz€Js€Jl€Je€J^€JW€JP€JI€JB€J;€J4€J-€J&€J€J€J€J €J€JüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJù~Jò~Jë~Jä~JÝ~JÖ~JÏ~JÈ~JÁ~Jº~J³~J¬~J¥~Jž~J—~J~J‰~J‚~J{~Jt~Jm~Jf~J_~JX~JQ~JJ~JC~J<~J5~J.~J'~J ~J~J~J ~J~Jý}Jö}Jï}Jè}Já}JÚ}JÓ}JÌ}JÅ}J¾}J·}J°}J©}J¢}J›}J”}J}J†}J}Jx}Jq}Jj}Jc}J\}JU}JN}JG}J@}J9}J2}J+}J$}J}J}J}J}J}Jú|Jó|Jì|Jå|JÞ|J×|JÐ|JÉ|JÂ|J»|J´|J­|J¦|JŸ|J˜|J‘|JŠ|Jƒ|J||Ju|Jn|Jg|J`|JY|JR|JK|JD|J=|J6|J/|J(|J!|J|J|J |J|Jþ{J÷{Jð{Jé{Jâ{JÛ{JÔ{JÍ{JÆ{J¿{J¸{J±{Jª{J£{Jœ{J•{JŽ{J‡{J€{Jy{Jr{Jk{Jd{J]{JV{JO{JH{JA{J:{J3{J,{J%{J{J{J{J {J{JûzJôzJízJæzJßzJØzJÑzJÊzJÃzJ¼zJµzJ®zJ§zJ zJ™zJ’zJ‹zJ„zJ}zJvzJozJhzJazJZzJSzJLzJEzJ>zJ7zJ0zJ)zJ"zJzJzJ zJzJÿyJøyJñyJêyJãyJÜyJÕyJÎyJÇyJÀyJ¹yJ²yJ«yJ¤yJyJ–yJyJˆyJyJzyJsyJlyJeyJ^yJWyJPyJIyJByJ;yJ4yJ-yJ&yJyJyJyJ yJyJüxJõxJîxJçxJàxJÙxJÒxJËxJÄxJ½xJ¶xJ¯xJ¨xJ¡xJšxJ“xJŒxJ…xJ~xJwxJpxJixJbxJ[xJTxJMxJFxJ?xJ8xJ1xJ*xJ#xJxJxJxJxJxJùwJòwJëwJäwJÝwJÖwJÏwJÈwJÁwJºwJ³wJ¬wJ¥wJžwJ—wJwJ‰wJ‚wJ{wJtwJmwJfwJ_wJXwJQwJJwJCwJsJ7sJ0sJ)sJ"sJsJsJ sJsJÿrJørJñrJêrJãrJÜrJÕrJÎrJÇrJÀrJ¹rJ²rJ«rJ¤rJrJ–rJrJˆrJrJzrJsrJlrJerJ^rJWrJPrJIrJBrJ;rJ4rJ-rJ&rJrJrJrJ rJrJüqJõqJîqJçqJàqJÙqJÒqJËqJÄqJ½qJ¶qJ¯qJ¨qJ¡qJšqJ“qJŒqJ…qJ~qJwqJpqJiqJbqJ[qJTqJMqJFqJ?qJ8qJ1qJ*qJ#qJqJqJqJqJqJùpJòpJëpJäpJÝpJÖpJÏpJÈpJÁpJºpJ³pJ¬pJ¥pJžpJ—pJpJ‰pJ‚pJ{pJtpJmpJfpJ_pJXpJQpJJpJCpJlJ7lJ0lJ)lJ"lJlJlJ lJlJÿkJøkJñkJêkJãkJÜkJÕkJÎkJÇkJÀkJ¹kJ²kJ«kJ¤kJkJ–kJkJˆkJkJzkJskJlkJekJ^kJWkJPkJIkJBkJ;kJ4kJ-kJ&kJkJkJkJ kJkJüjJõjJîjJçjJàjJÙjJÒjJËjJÄjJ½jJ¶jJ¯jJ¨jJ¡jJšjJ“jJŒjJ…jJ~jJwjJpjJijJbjJ[jJTjJMjJFjJ?jJ8jJ1jJ*jJ#jJjJjJjJjJjJùiJòiJëiJäiJÝiJÖiJÏiJÈiJÁiJºiJ³iJ¬iJ¥iJžiJ—iJiJ‰iJ‚iJ{iJtiJmiJfiJ_iJXiJQiJJiJCiJeJ7eJ0eJ)eJ"eJeJeJ eJeJÿdJødJñdJêdJãdJÜdJÕdJÎdJÇdJÀdJ¹dJ²dJ«dJ¤dJdJ–dJdJˆdJdJzdJsdJldJedJ^dJWdJPdJIdJBdJ;dJ4dJ-dJ&dJdJdJdJ dJdJücJõcJîcJçcJàcJÙcJÒcJËcJÄcJ½cJ¶cJ¯cJ¨cJ¡cJšcJ“cJŒcJ…cJ~cJwcJpcJicJbcJ[cJTcJMcJFcJ?cJ8cJ1cJ*cJ#cJcJcJcJcJcJùbJòbJëbJäbJÝbJÖbJÏbJÈbJÁbJºbJ³bJ¬bJ¥bJžbJ—bJbJ‰bJ‚bJ{bJtbJmbJfbJ_bJXbJQbJJbJCbJ^J7^J0^J)^J"^J^J^J ^J^Jÿ]Jø]Jñ]Jê]Jã]JÜ]JÕ]JÎ]JÇ]JÀ]J¹]J²]J«]J¤]J]J–]J]Jˆ]J]Jz]Js]Jl]Je]J^]JW]JP]JI]JB]J;]J4]J-]J&]J]J]J]J ]J]Jü\Jõ\Jî\Jç\Jà\JÙ\JÒ\JË\JÄ\J½\J¶\J¯\J¨\J¡\Jš\J“\JŒ\J…\J~\Jw\Jp\Ji\Jb\J[\JT\JM\JF\J?\J8\J1\J*\J#\J\J\J\J\J\Jù[Jò[Jë[Jä[JÝ[JÖ[JÏ[JÈ[JÁ[Jº[J³[J¬[J¥[Jž[J—[J[J‰[J‚[J{[Jt[Jm[Jf[J_[JX[JQ[JJ[JC[J<[J5[J.[J'[J [J[J[J [J[JýZJöZJïZJèZJáZJÚZJÓZJÌZJÅZJ¾ZJ·ZJ°ZJ©ZJ¢ZJ›ZJ”ZJZJ†ZJZJxZJqZJjZJcZJ\ZJUZJNZJGZJ@ZJ9ZJ2ZJ+ZJ$ZJZJZJZJZJZJúYJóYJìYJåYJÞYJ×YJÐYJÉYJÂYJ»YJ´YJ­YJ¦YJŸYJ˜YJ‘YJŠYJƒYJ|YJuYJnYJgYJ`YJYYJRYJKYJDYJ=YJ6YJ/YJ(YJ!YJYJYJ YJYJþXJ÷XJðXJéXJâXJÛXJÔXJÍXJÆXJ¿XJ¸XJ±XJªXJ£XJœXJ•XJŽXJ‡XJ€XJyXJrXJkXJdXJ]XJVXJOXJHXJAXJ:XJ3XJ,XJ%XJXJXJXJ XJXJûWJôWJíWJæWJßWJØWJÑWJÊWJÃWJ¼WJµWJ®WJ§WJ WJ™WJ’WJ‹WJ„WJ}WJvWJoWJhWJaWJZWJSWJLWJEWJ>WJ7WJ0WJ)WJ"WJWJWJ WJWJÿVJøVJñVJêVJãVJÜVJÕVJÎVJÇVJÀVJ¹VJ²VJ«VJ¤VJVJ–VJVJˆVJVJzVJsVJlVJeVJ^VJWVJPVJIVJBVJ;VJ4VJ-VJ&VJVJVJVJ VJVJüUJõUJîUJçUJàUJÙUJÒUJËUJÄUJ½UJ¶UJ¯UJ¨UJ¡UJšUJ“UJŒUJ…UJ~UJwUJpUJiUJbUJ[UJTUJMUJFUJ?UJ8UJ1UJ*UJ#UJUJUJUJUJUJùTJòTJëTJäTJÝTJÖTJÏTJÈTJÁTJºTJ³TJ¬TJ¥TJžTJ—TJTJ‰TJ‚TJ{TJtTJmTJfTJ_TJXTJQTJJTJCTJPJ7PJ0PJ)PJ"PJPJPJ PJPJÿOJøOJñOJêOJãOJÜOJÕOJÎOJÇOJÀOJ¹OJ²OJ«OJ¤OJOJ–OJOJˆOJOJzOJsOJlOJeOJ^OJWOJPOJIOJBOJ;OJ4OJ-OJ&OJOJOJOJ OJOJüNJõNJîNJçNJàNJÙNJÒNJËNJÄNJ½NJ¶NJ¯NJ¨NJ¡NJšNJ“NJŒNJ…NJ~NJwNJpNJiNJbNJ[NJTNJMNJFNJ?NJ8NJ1NJ*NJ#NJNJNJNJNJNJùMJòMJëMJäMJÝMJÖMJÏMJÈMJÁMJºMJ³MJ¬MJ¥MJžMJ—MJMJ‰MJ‚MJ{MJtMJmMJfMJ_MJXMJQMJJMJCMJIJ7IJ0IJ)IJ"IJIJIJ IJIJÿHJøHJñHJêHJãHJÜHJÕHJÎHJÇHJÀHJ¹HJ²HJ«HJ¤HJHJ–HJHJˆHJHJzHJsHJlHJeHJ^HJWHJPHJIHJBHJ;HJ4HJ-HJ&HJHJHJHJ HJHJüGJõGJîGJçGJàGJÙGJÒGJËGJÄGJ½GJ¶GJ¯GJ¨GJ¡GJšGJ“GJŒGJ…GJ~GJwGJpGJiGJbGJ[GJTGJMGJFGJ?GJ8GJ1GJ*GJ#GJGJGJGJGJGJùFJòFJëFJäFJÝFJÖFJÏFJÈFJÁFJºFJ³FJ¬FJ¥FJžFJ—FJFJ‰FJ‚FJ{FJtFJmFJfFJ_FJXFJQFJJFJCFJBJ7BJ0BJ)BJ"BJBJBJ BJBJÿAJøAJñAJêAJãAJÜAJÕAJÎAJÇAJÀAJ¹AJ²AJ«AJ¤AJAJ–AJAJˆAJAJzAJsAJlAJeAJ^AJWAJPAJIAJBAJ;AJ4AJ-AJ&AJAJAJAJ AJAJü@Jõ@Jî@Jç@Jà@JÙ@JÒ@JË@JÄ@J½@J¶@J¯@J¨@J¡@Jš@J“@JŒ@J…@J~@Jw@Jp@Ji@Jb@J[@JT@JM@JF@J?@J8@J1@J*@J#@J@J@J@J@J@Jù?Jò?Jë?Jä?JÝ?JÖ?JÏ?JÈ?JÁ?Jº?J³?J¬?J¥?Jž?J—?J?J‰?J‚?J{?Jt?Jm?Jf?J_?JX?JQ?JJ?JC?JJö>Jï>Jè>Já>JÚ>JÓ>JÌ>JÅ>J¾>J·>J°>J©>J¢>J›>J”>J>J†>J>Jx>Jq>Jj>Jc>J\>JU>JN>JG>J@>J9>J2>J+>J$>J>J>J>J>J>Jú=Jó=Jì=Jå=JÞ=J×=JÐ=JÉ=JÂ=J»=J´=J­=J¦=JŸ=J˜=J‘=JŠ=Jƒ=J|=Ju=Jn=Jg=J`=JY=JR=JK=JD=J==J6=J/=J(=J!=J=J=J =J=Jþ;J7;J0;J);J";J;J;J ;J;Jÿ:Jø:Jñ:Jê:Jã:JÜ:JÕ:JÎ:JÇ:JÀ:J¹:J²:J«:J¤:J:J–:J:Jˆ:J:Jz:Js:Jl:Je:J^:JW:JP:JI:JB:J;:J4:J-:J&:J:J:J:J :J:Jü9Jõ9Jî9Jç9Jà9JÙ9JÒ9JË9JÄ9J½9J¶9J¯9J¨9J¡9Jš9J“9JŒ9J…9J~9Jw9Jp9Ji9Jb9J[9JT9JM9JF9J?9J89J19J*9J#9J9J9J9J9J9Jù8Jò8Jë8Jä8JÝ8JÖ8JÏ8JÈ8JÁ8Jº8J³8J¬8J¥8Jž8J—8J8J‰8J‚8J{8Jt8Jm8Jf8J_8JX8JQ8JJ8JC8J<8J58J.8J'8J 8J8J8J 8J8Jý7Jö7Jï7Jè7Já7JÚ7JÓ7JÌ7JÅ7J¾7J·7J°7J©7J¢7J›7J”7J7J†7J7Jx7Jq7Jj7Jc7J\7JU7JN7JG7J@7J97J27J+7J$7J7J7J7J7J7Jú6Jó6Jì6Jå6JÞ6J×6JÐ6JÉ6JÂ6J»6J´6J­6J¦6JŸ6J˜6J‘6JŠ6Jƒ6J|6Ju6Jn6Jg6J`6JY6JR6JK6JD6J=6J66J/6J(6J!6J6J6J 6J6Jþ5J÷5Jð5Jé5Jâ5JÛ5JÔ5JÍ5JÆ5J¿5J¸5J±5Jª5J£5Jœ5J•5JŽ5J‡5J€5Jy5Jr5Jk5Jd5J]5JV5JO5JH5JA5J:5J35J,5J%5J5J5J5J 5J5Jû4Jô4Jí4Jæ4Jß4JØ4JÑ4JÊ4JÃ4J¼4Jµ4J®4J§4J 4J™4J’4J‹4J„4J}4Jv4Jo4Jh4Ja4JZ4JS4JL4JE4J>4J74J04J)4J"4J4J4J 4J4Jÿ3Jø3Jñ3Jê3Jã3JÜ3JÕ3JÎ3JÇ3JÀ3J¹3J²3J«3J¤3J3J–3J3Jˆ3J3Jz3Js3Jl3Je3J^3JW3JP3JI3JB3J;3J43J-3J&3J3J3J3J 3J3Jü2Jõ2Jî2Jç2Jà2JÙ2JÒ2JË2JÄ2J½2J¶2J¯2J¨2J¡2Jš2J“2JŒ2J…2J~2Jw2Jp2Ji2Jb2J[2JT2JM2JF2J?2J82J12J*2J#2J2J2J2J2J2Jù1Jò1Jë1Jä1JÝ1JÖ1JÏ1JÈ1JÁ1Jº1J³1J¬1J¥1Jž1J—1J1J‰1J‚1J{1Jt1Jm1Jf1J_1JX1JQ1JJ1JC1J<1J51J.1J'1J 1J1J1J 1J1Jý0Jö0Jï0Jè0Já0JÚ0JÓ0JÌ0JÅ0J¾0J·0J°0J©0J¢0J›0J”0J0J†0J0Jx0Jq0Jj0Jc0J\0JU0JN0JG0J@0J90J20J+0J$0J0J0J0J0J0Jú/Jó/Jì/Jå/JÞ/J×/JÐ/JÉ/JÂ/J»/J´/J­/J¦/JŸ/J˜/J‘/JŠ/Jƒ/J|/Ju/Jn/Jg/J`/JY/JR/JK/JD/J=/J6/J//J(/J!/J/J/J /J/Jþ.J÷.Jð.Jé.Jâ.JÛ.JÔ.JÍ.JÆ.J¿.J¸.J±.Jª.J£.Jœ.J•.JŽ.J‡.J€.Jy.Jr.Jk.Jd.J].JV.JO.JH.JA.J:.J3.J,.J%.J.J.J.J .J.Jû-Jô-Jí-Jæ-Jß-JØ-JÑ-JÊ-JÃ-J¼-Jµ-J®-J§-J -J™-J’-J‹-J„-J}-Jv-Jo-Jh-Ja-JZ-JS-JL-JE-J>-J7-J0-J)-J"-J-J-J -J-Jÿ,Jø,Jñ,Jê,Jã,JÜ,JÕ,JÎ,JÇ,JÀ,J¹,J²,J«,J¤,J,J–,J,Jˆ,J,Jz,Js,Jl,Je,J^,JW,JP,JI,JB,J;,J4,J-,J&,J,J,J,J ,J,Jü+Jõ+Jî+Jç+Jà+JÙ+JÒ+JË+JÄ+J½+J¶+J¯+J¨+J¡+Jš+J“+JŒ+J…+J~+Jw+Jp+Ji+Jb+J[+JT+JM+JF+J?+J8+J1+J*+J#+J+J+J+J+J+Jù*Jò*Jë*Jä*JÝ*JÖ*JÏ*JÈ*JÁ*Jº*J³*J¬*J¥*Jž*J—*J*J‰*J‚*J{*Jt*Jm*Jf*J_*JX*JQ*JJ*JC*J<*J5*J.*J'*J *J*J*J *J*Jý)Jö)Jï)Jè)Já)JÚ)JÓ)JÌ)JÅ)J¾)J·)J°)J©)J¢)J›)J”)J)J†)J)Jx)Jq)Jj)Jc)J\)JU)JN)JG)J@)J9)J2)J+)J$)J)J)J)J)J)Jú(Jó(Jì(Jå(JÞ(J×(JÐ(JÉ(JÂ(J»(J´(J­(J¦(JŸ(J˜(J‘(JŠ(Jƒ(J|(Ju(Jn(Jg(J`(JY(JR(JK(JD(J=(J6(J/(J((J!(J(J(J (J(Jþ'J÷'Jð'Jé'Jâ'JÛ'JÔ'JÍ'JÆ'J¿'J¸'J±'Jª'J£'Jœ'J•'JŽ'J‡'J€'Jy'Jr'Jk'Jd'J]'JV'JO'JH'JA'J:'J3'J,'J%'J'J'J'J 'J'Jû&Jô&Jí&Jæ&Jß&JØ&JÑ&JÊ&JÃ&J¼&Jµ&J®&J§&J &J™&J’&J‹&J„&J}&Jv&Jo&Jh&Ja&JZ&JS&JL&JE&J>&J7&J0&J)&J"&J&J&J &J&Jÿ%Jø%Jñ%Jê%Jã%JÜ%JÕ%JÎ%JÇ%JÀ%J¹%J²%J«%J¤%J%J–%J%Jˆ%J%Jz%Js%Jl%Je%J^%JW%JP%JI%JB%J;%J4%J-%J&%J%J%J%J %J%Jü$Jõ$Jî$Jç$Jà$JÙ$JÒ$JË$JÄ$J½$J¶$J¯$J¨$J¡$Jš$J“$JŒ$J…$J~$Jw$Jp$Ji$Jb$J[$JT$JM$JF$J?$J8$J1$J*$J#$J$J$J$J$J$Jù#Jò#Jë#Jä#JÝ#JÖ#JÏ#JÈ#JÁ#Jº#J³#J¬#J¥#Jž#J—#J#J‰#J‚#J{#Jt#Jm#Jf#J_#JX#JQ#JJ#JC#J<#J5#J.#J'#J #J#J#J #J#Jý"Jö"Jï"Jè"Já"JÚ"JÓ"JÌ"JÅ"J¾"J·"J°"J©"J¢"J›"J”"J"J†"J"Jx"Jq"Jj"Jc"J\"JU"JN"JG"J@"J9"J2"J+"J$"J"J"J"J"J"Jú!Jó!Jì!Jå!JÞ!J×!JÐ!JÉ!JÂ!J»!J´!J­!J¦!JŸ!J˜!J‘!JŠ!Jƒ!J|!Ju!Jn!Jg!J`!JY!JR!JK!JD!J=!J6!J/!J(!J!!J!J!J !J!Jþ J÷ Jð Jé Jâ JÛ JÔ JÍ JÆ J¿ J¸ J± Jª J£ Jœ J• JŽ J‡ J€ Jy Jr Jk Jd J] JV JO JH JA J: J3 J, J% J J J J J JûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJýJöJïJèJáJÚJÓJÌJÅJ¾J·J°J©J¢J›J”JJ†JJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJúJóJìJåJÞJ×JÐJÉJÂJ»J´J­J¦JŸJ˜J‘JŠJƒJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJþJ÷JðJéJâJÛJÔJÍJÆJ¿J¸J±JªJ£JœJ•JŽJ‡J€JyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJýJöJïJèJáJÚJÓJÌJÅJ¾J·J°J©J¢J›J”JJ†JJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJúJóJìJåJÞJ×JÐJÉJÂJ»J´J­J¦JŸJ˜J‘JŠJƒJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJþJ÷JðJéJâJÛJÔJÍJÆJ¿J¸J±JªJ£JœJ•JŽJ‡J€JyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJý Jö Jï Jè Já JÚ JÓ JÌ JÅ J¾ J· J° J© J¢ J› J” J J† J Jx Jq Jj Jc J\ JU JN JG J@ J9 J2 J+ J$ J J J J J Jú Jó Jì Jå JÞ J× JÐ JÉ J J» J´ J­ J¦ JŸ J˜ J‘ JŠ Jƒ J| Ju Jn Jg J` JY JR JK JD J= J6 J/ J( J! J J J J Jþ J÷ Jð Jé Jâ JÛ JÔ JÍ JÆ J¿ J¸ J± Jª J£ Jœ J• JŽ J‡ J€ Jy Jr Jk Jd J] JV JO JH JA J: J3 J, J% J J J J J Jû Jô Jí Jæ Jß JØ JÑ JÊ Jà J¼ Jµ J® J§ J  J™ J’ J‹ J„ J} Jv Jo Jh Ja JZ JS JL JE J> J7 J0 J) J" J J J J Jÿ Jø Jñ Jê Jã JÜ JÕ JÎ JÇ JÀ J¹ J² J« J¤ J J– J Jˆ J Jz Js Jl Je J^ JW JP JI JB J; J4 J- J& J J J J J JüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJýJöJïJèJáJÚJÓJÌJÅJ¾J·J°J©J¢J›J”JJ†JJxJqJjJcJ\JUJNJGJ@J9J2J+J$JJJJJJúJóJìJåJÞJ×JÐJÉJÂJ»J´J­J¦JŸJ˜J‘JŠJƒJ|JuJnJgJ`JYJRJKJDJ=J6J/J(J!JJJ JJþJ÷JðJéJâJÛJÔJÍJÆJ¿J¸J±JªJ£JœJ•JŽJ‡J€JyJrJkJdJ]JVJOJHJAJ:J3J,J%JJJJ JJûJôJíJæJßJØJÑJÊJÃJ¼JµJ®J§J J™J’J‹J„J}JvJoJhJaJZJSJLJEJ>J7J0J)J"JJJ JJÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJ<J5J.J'J JJJ JJýÿIöÿIïÿIèÿIáÿIÚÿIÓÿIÌÿIÅÿI¾ÿI·ÿI°ÿI©ÿI¢ÿI›ÿI”ÿIÿI†ÿIÿIxÿIqÿIjÿIcÿI\ÿIUÿINÿIGÿI@ÿI9ÿI2ÿI+ÿI$ÿIÿIÿIÿIÿIÿIúþIóþIìþIåþIÞþI×þIÐþIÉþIÂþI»þI´þI­þI¦þIŸþI˜þI‘þIŠþIƒþI|þIuþInþIgþI`þIYþIRþIKþIDþI=þI6þI/þI(þI!þIþIþI þIþIþýI÷ýIðýIéýIâýIÛýIÔýIÍýIÆýI¿ýI¸ýI±ýIªýI£ýIœýI•ýIŽýI‡ýI€ýIyýIrýIkýIdýI]ýIVýIOýIHýIAýI:ýI3ýI,ýI%ýIýIýIýI ýIýIûüIôüIíüIæüIßüIØüIÑüIÊüIÃüI¼üIµüI®üI§üI üI™üI’üI‹üI„üI}üIvüIoüIhüIaüIZüISüILüIEüI>üI7üI0üI)üI"üIüIüI üIüIÿûIøûIñûIêûIãûIÜûIÕûIÎûIÇûIÀûI¹ûI²ûI«ûI¤ûIûI–ûIûIˆûIûIzûIsûIlûIeûI^ûIWûIPûIIûIBûI;ûI4ûI-ûI&ûIûIûIûI ûIûIüúIõúIîúIçúIàúIÙúIÒúIËúIÄúI½úI¶úI¯úI¨úI¡úIšúI“úIŒúI…úI~úIwúIpúIiúIbúI[úITúIMúIFúI?úI8úI1úI*úI#úIúIúIúIúIúIùùIòùIëùIäùIÝùIÖùIÏùIÈùIÁùIºùI³ùI¬ùI¥ùIžùI—ùIùI‰ùI‚ùI{ùItùImùIfùI_ùIXùIQùIJùICùI<ùI5ùI.ùI'ùI ùIùIùI ùIùIýøIöøIïøIèøIáøIÚøIÓøIÌøIÅøI¾øI·øI°øI©øI¢øI›øI”øIøI†øIøIxøIqøIjøIcøI\øIUøINøIGøI@øI9øI2øI+øI$øIøIøIøIøIøIú÷Ió÷Iì÷Iå÷IÞ÷I×÷IÐ÷IÉ÷IÂ÷I»÷I´÷I­÷I¦÷IŸ÷I˜÷I‘÷IŠ÷Iƒ÷I|÷Iu÷In÷Ig÷I`÷IY÷IR÷IK÷ID÷I=÷I6÷I/÷I(÷I!÷I÷I÷I ÷I÷IþöI÷öIðöIéöIâöIÛöIÔöIÍöIÆöI¿öI¸öI±öIªöI£öIœöI•öIŽöI‡öI€öIyöIröIköIdöI]öIVöIOöIHöIAöI:öI3öI,öI%öIöIöIöI öIöIûõIôõIíõIæõIßõIØõIÑõIÊõIÃõI¼õIµõI®õI§õI õI™õI’õI‹õI„õI}õIvõIoõIhõIaõIZõISõILõIEõI>õI7õI0õI)õI"õIõIõI õIõIÿôIøôIñôIêôIãôIÜôIÕôIÎôIÇôIÀôI¹ôI²ôI«ôI¤ôIôI–ôIôIˆôIôIzôIsôIlôIeôI^ôIWôIPôIIôIBôI;ôI4ôI-ôI&ôIôIôIôI ôIôIüóIõóIîóIçóIàóIÙóIÒóIËóIÄóI½óI¶óI¯óI¨óI¡óIšóI“óIŒóI…óI~óIwóIpóIióIbóI[óITóIMóIFóI?óI8óI1óI*óI#óIóIóIóIóIóIùòIòòIëòIäòIÝòIÖòIÏòIÈòIÁòIºòI³òI¬òI¥òIžòI—òIòI‰òI‚òI{òItòImòIfòI_òIXòIQòIJòICòI<òI5òI.òI'òI òIòIòI òIòIýñIöñIïñIèñIáñIÚñIÓñIÌñIÅñI¾ñI·ñI°ñI©ñI¢ñI›ñI”ñIñI†ñIñIxñIqñIjñIcñI\ñIUñINñIGñI@ñI9ñI2ñI+ñI$ñIñIñIñIñIñIúðIóðIìðIåðIÞðI×ðIÐðIÉðIÂðI»ðI´ðI­ðI¦ðIŸðI˜ðI‘ðIŠðIƒðI|ðIuðInðIgðI`ðIYðIRðIKðIDðI=ðI6ðI/ðI(ðI!ðIðIðI ðIðIþïI÷ïIðïIéïIâïIÛïIÔïIÍïIÆïI¿ïI¸ïI±ïIªïI£ïIœïI•ïIŽïI‡ïI€ïIyïIrïIkïIdïI]ïIVïIOïIHïIAïI:ïI3ïI,ïI%ïIïIïIïI ïIïIûîIôîIíîIæîIßîIØîIÑîIÊîIÃîI¼îIµîI®îI§îI îI™îI’îI‹îI„îI}îIvîIoîIhîIaîIZîISîILîIEîI>îI7îI0îI)îI"îIîIîI îIîIÿíIøíIñíIêíIãíIÜíIÕíIÎíIÇíIÀíI¹íI²íI«íI¤íIíI–íIíIˆíIíIzíIsíIlíIeíI^íIWíIPíIIíIBíI;íI4íI-íI&íIíIíIíI íIíIüìIõìIîìIçìIàìIÙìIÒìIËìIÄìI½ìI¶ìI¯ìI¨ìI¡ìIšìI“ìIŒìI…ìI~ìIwìIpìIiìIbìI[ìITìIMìIFìI?ìI8ìI1ìI*ìI#ìIìIìIìIìIìIùëIòëIëëIäëIÝëIÖëIÏëIÈëIÁëIºëI³ëI¬ëI¥ëIžëI—ëIëI‰ëI‚ëI{ëItëImëIfëI_ëIXëIQëIJëICëI<ëI5ëI.ëI'ëI ëIëIëI ëIëIýêIöêIïêIèêIáêIÚêIÓêIÌêIÅêI¾êI·êI°êI©êI¢êI›êI”êIêI†êIêIxêIqêIjêIcêI\êIUêINêIGêI@êI9êI2êI+êI$êIêIêIêIêIêIúéIóéIìéIåéIÞéI×éIÐéIÉéIÂéI»éI´éI­éI¦éIŸéI˜éI‘éIŠéIƒéI|éIuéInéIgéI`éIYéIRéIKéIDéI=éI6éI/éI(éI!éIéIéI éIéIþèI÷èIðèIéèIâèIÛèIÔèIÍèIÆèI¿èI¸èI±èIªèI£èIœèI•èIŽèI‡èI€èIyèIrèIkèIdèI]èIVèIOèIHèIAèI:èI3èI,èI%èIèIèIèI èIèIûçIôçIíçIæçIßçIØçIÑçIÊçIÃçI¼çIµçI®çI§çI çI™çI’çI‹çI„çI}çIvçIoçIhçIaçIZçISçILçIEçI>çI7çI0çI)çI"çIçIçI çIçIÿæIøæIñæIêæIãæIÜæIÕæIÎæIÇæIÀæI¹æI²æI«æI¤æIæI–æIæIˆæIæIzæIsæIlæIeæI^æIWæIPæIIæIBæI;æI4æI-æI&æIæIæIæI æIæIüåIõåIîåIçåIàåIÙåIÒåIËåIÄåI½åI¶åI¯åI¨åI¡åIšåI“åIŒåI…åI~åIwåIpåIiåIbåI[åITåIMåIFåI?åI8åI1åI*åI#åIåIåIåIåIåIùäIòäIëäIääIÝäIÖäIÏäIÈäIÁäIºäI³äI¬äI¥äIžäI—äIäI‰äI‚äI{äItäImäIfäI_äIXäIQäIJäICäI<äI5äI.äI'äI äIäIäI äIäIýãIöãIïãIèãIáãIÚãIÓãIÌãIÅãI¾ãI·ãI°ãI©ãI¢ãI›ãI”ãIãI†ãIãIxãIqãIjãIcãI\ãIUãINãIGãI@ãI9ãI2ãI+ãI$ãIãIãIãIãIãIúâIóâIìâIåâIÞâI×âIÐâIÉâIÂâI»âI´âI­âI¦âIŸâI˜âI‘âIŠâIƒâI|âIuâInâIgâI`âIYâIRâIKâIDâI=âI6âI/âI(âI!âIâIâI âIâIþáI÷áIðáIéáIâáIÛáIÔáIÍáIÆáI¿áI¸áI±áIªáI£áIœáI•áIŽáI‡áI€áIyáIráIkáIdáI]áIVáIOáIHáIAáI:áI3áI,áI%áIáIáIáI áIáIûàIôàIíàIæàIßàIØàIÑàIÊàIÃàI¼àIµàI®àI§àI àI™àI’àI‹àI„àI}àIvàIoàIhàIaàIZàISàILàIEàI>àI7àI0àI)àI"àIàIàI àIàIÿßIøßIñßIêßIãßIÜßIÕßIÎßIÇßIÀßI¹ßI²ßI«ßI¤ßIßI–ßIßIˆßIßIzßIsßIlßIeßI^ßIWßIPßIIßIBßI;ßI4ßI-ßI&ßIßIßIßI ßIßIüÞIõÞIîÞIçÞIàÞIÙÞIÒÞIËÞIÄÞI½ÞI¶ÞI¯ÞI¨ÞI¡ÞIšÞI“ÞIŒÞI…ÞI~ÞIwÞIpÞIiÞIbÞI[ÞITÞIMÞIFÞI?ÞI8ÞI1ÞI*ÞI#ÞIÞIÞIÞIÞIÞIùÝIòÝIëÝIäÝIÝÝIÖÝIÏÝIÈÝIÁÝIºÝI³ÝI¬ÝI¥ÝIžÝI—ÝIÝI‰ÝI‚ÝI{ÝItÝImÝIfÝI_ÝIXÝIQÝIJÝICÝI<ÝI5ÝI.ÝI'ÝI ÝIÝIÝI ÝIÝIýÜIöÜIïÜIèÜIáÜIÚÜIÓÜIÌÜIÅÜI¾ÜI·ÜI°ÜI©ÜI¢ÜI›ÜI”ÜIÜI†ÜIÜIxÜIqÜIjÜIcÜI\ÜIUÜINÜIGÜI@ÜI9ÜI2ÜI+ÜI$ÜIÜIÜIÜIÜIÜIúÛIóÛIìÛIåÛIÞÛI×ÛIÐÛIÉÛIÂÛI»ÛI´ÛI­ÛI¦ÛIŸÛI˜ÛI‘ÛIŠÛIƒÛI|ÛIuÛInÛIgÛI`ÛIYÛIRÛIKÛIDÛI=ÛI6ÛI/ÛI(ÛI!ÛIÛIÛI ÛIÛIþÚI÷ÚIðÚIéÚIâÚIÛÚIÔÚIÍÚIÆÚI¿ÚI¸ÚI±ÚIªÚI£ÚIœÚI•ÚIŽÚI‡ÚI€ÚIyÚIrÚIkÚIdÚI]ÚIVÚIOÚIHÚIAÚI:ÚI3ÚI,ÚI%ÚIÚIÚIÚI ÚIÚIûÙIôÙIíÙIæÙIßÙIØÙIÑÙIÊÙIÃÙI¼ÙIµÙI®ÙI§ÙI ÙI™ÙI’ÙI‹ÙI„ÙI}ÙIvÙIoÙIhÙIaÙIZÙISÙILÙIEÙI>ÙI7ÙI0ÙI)ÙI"ÙIÙIÙI ÙIÙIÿØIøØIñØIêØIãØIÜØIÕØIÎØIÇØIÀØI¹ØI²ØI«ØI¤ØIØI–ØIØIˆØIØIzØIsØIlØIeØI^ØIWØIPØIIØIBØI;ØI4ØI-ØI&ØIØIØIØI ØIØIü×Iõ×Iî×Iç×Ià×IÙ×IÒ×IË×IÄ×I½×I¶×I¯×I¨×I¡×Iš×I“×IŒ×I…×I~×Iw×Ip×Ii×Ib×I[×IT×IM×IF×I?×I8×I1×I*×I#×I×I×I×I×I×IùÖIòÖIëÖIäÖIÝÖIÖÖIÏÖIÈÖIÁÖIºÖI³ÖI¬ÖI¥ÖIžÖI—ÖIÖI‰ÖI‚ÖI{ÖItÖImÖIfÖI_ÖIXÖIQÖIJÖICÖI<ÖI5ÖI.ÖI'ÖI ÖIÖIÖI ÖIÖIýÕIöÕIïÕIèÕIáÕIÚÕIÓÕIÌÕIÅÕI¾ÕI·ÕI°ÕI©ÕI¢ÕI›ÕI”ÕIÕI†ÕIÕIxÕIqÕIjÕIcÕI\ÕIUÕINÕIGÕI@ÕI9ÕI2ÕI+ÕI$ÕIÕIÕIÕIÕIÕIúÔIóÔIìÔIåÔIÞÔI×ÔIÐÔIÉÔIÂÔI»ÔI´ÔI­ÔI¦ÔIŸÔI˜ÔI‘ÔIŠÔIƒÔI|ÔIuÔInÔIgÔI`ÔIYÔIRÔIKÔIDÔI=ÔI6ÔI/ÔI(ÔI!ÔIÔIÔI ÔIÔIþÓI÷ÓIðÓIéÓIâÓIÛÓIÔÓIÍÓIÆÓI¿ÓI¸ÓI±ÓIªÓI£ÓIœÓI•ÓIŽÓI‡ÓI€ÓIyÓIrÓIkÓIdÓI]ÓIVÓIOÓIHÓIAÓI:ÓI3ÓI,ÓI%ÓIÓIÓIÓI ÓIÓIûÒIôÒIíÒIæÒIßÒIØÒIÑÒIÊÒIÃÒI¼ÒIµÒI®ÒI§ÒI ÒI™ÒI’ÒI‹ÒI„ÒI}ÒIvÒIoÒIhÒIaÒIZÒISÒILÒIEÒI>ÒI7ÒI0ÒI)ÒI"ÒIÒIÒI ÒIÒIÿÑIøÑIñÑIêÑIãÑIÜÑIÕÑIÎÑIÇÑIÀÑI¹ÑI²ÑI«ÑI¤ÑIÑI–ÑIÑIˆÑIÑIzÑIsÑIlÑIeÑI^ÑIWÑIPÑIIÑIBÑI;ÑI4ÑI-ÑI&ÑIÑIÑIÑI ÑIÑIüÐIõÐIîÐIçÐIàÐIÙÐIÒÐIËÐIÄÐI½ÐI¶ÐI¯ÐI¨ÐI¡ÐIšÐI“ÐIŒÐI…ÐI~ÐIwÐIpÐIiÐIbÐI[ÐITÐIMÐIFÐI?ÐI8ÐI1ÐI*ÐI#ÐIÐIÐIÐIÐIÐIùÏIòÏIëÏIäÏIÝÏIÖÏIÏÏIÈÏIÁÏIºÏI³ÏI¬ÏI¥ÏIžÏI—ÏIÏI‰ÏI‚ÏI{ÏItÏImÏIfÏI_ÏIXÏIQÏIJÏICÏI<ÏI5ÏI.ÏI'ÏI ÏIÏIÏI ÏIÏIýÎIöÎIïÎIèÎIáÎIÚÎIÓÎIÌÎIÅÎI¾ÎI·ÎI°ÎI©ÎI¢ÎI›ÎI”ÎIÎI†ÎIÎIxÎIqÎIjÎIcÎI\ÎIUÎINÎIGÎI@ÎI9ÎI2ÎI+ÎI$ÎIÎIÎIÎIÎIÎIúÍIóÍIìÍIåÍIÞÍI×ÍIÐÍIÉÍIÂÍI»ÍI´ÍI­ÍI¦ÍIŸÍI˜ÍI‘ÍIŠÍIƒÍI|ÍIuÍInÍIgÍI`ÍIYÍIRÍIKÍIDÍI=ÍI6ÍI/ÍI(ÍI!ÍIÍIÍI ÍIÍIþÌI÷ÌIðÌIéÌIâÌIÛÌIÔÌIÍÌIÆÌI¿ÌI¸ÌI±ÌIªÌI£ÌIœÌI•ÌIŽÌI‡ÌI€ÌIyÌIrÌIkÌIdÌI]ÌIVÌIOÌIHÌIAÌI:ÌI3ÌI,ÌI%ÌIÌIÌIÌI ÌIÌIûËIôËIíËIæËIßËIØËIÑËIÊËIÃËI¼ËIµËI®ËI§ËI ËI™ËI’ËI‹ËI„ËI}ËIvËIoËIhËIaËIZËISËILËIEËI>ËI7ËI0ËI)ËI"ËIËIËI ËIËIÿÊIøÊIñÊIêÊIãÊIÜÊIÕÊIÎÊIÇÊIÀÊI¹ÊI²ÊI«ÊI¤ÊIÊI–ÊIÊIˆÊIÊIzÊIsÊIlÊIeÊI^ÊIWÊIPÊIIÊIBÊI;ÊI4ÊI-ÊI&ÊIÊIÊIÊI ÊIÊIüÉIõÉIîÉIçÉIàÉIÙÉIÒÉIËÉIÄÉI½ÉI¶ÉI¯ÉI¨ÉI¡ÉIšÉI“ÉIŒÉI…ÉI~ÉIwÉIpÉIiÉIbÉI[ÉITÉIMÉIFÉI?ÉI8ÉI1ÉI*ÉI#ÉIÉIÉIÉIÉIÉIùÈIòÈIëÈIäÈIÝÈIÖÈIÏÈIÈÈIÁÈIºÈI³ÈI¬ÈI¥ÈIžÈI—ÈIÈI‰ÈI‚ÈI{ÈItÈImÈIfÈI_ÈIXÈIQÈIJÈICÈI<ÈI5ÈI.ÈI'ÈI ÈIÈIÈI ÈIÈIýÇIöÇIïÇIèÇIáÇIÚÇIÓÇIÌÇIÅÇI¾ÇI·ÇI°ÇI©ÇI¢ÇI›ÇI”ÇIÇI†ÇIÇIxÇIqÇIjÇIcÇI\ÇIUÇINÇIGÇI@ÇI9ÇI2ÇI+ÇI$ÇIÇIÇIÇIÇIÇIúÆIóÆIìÆIåÆIÞÆIׯIÐÆIÉÆIÂÆI»ÆI´ÆI­ÆI¦ÆIŸÆI˜ÆI‘ÆIŠÆIƒÆI|ÆIuÆInÆIgÆI`ÆIYÆIRÆIKÆIDÆI=ÆI6ÆI/ÆI(ÆI!ÆIÆIÆI ÆIÆIþÅI÷ÅIðÅIéÅIâÅIÛÅIÔÅIÍÅIÆÅI¿ÅI¸ÅI±ÅIªÅI£ÅIœÅI•ÅIŽÅI‡ÅI€ÅIyÅIrÅIkÅIdÅI]ÅIVÅIOÅIHÅIAÅI:ÅI3ÅI,ÅI%ÅIÅIÅIÅI ÅIÅIûÄIôÄIíÄIæÄIßÄIØÄIÑÄIÊÄIÃÄI¼ÄIµÄI®ÄI§ÄI ÄI™ÄI’ÄI‹ÄI„ÄI}ÄIvÄIoÄIhÄIaÄIZÄISÄILÄIEÄI>ÄI7ÄI0ÄI)ÄI"ÄIÄIÄI ÄIÄIÿÃIøÃIñÃIêÃIãÃIÜÃIÕÃIÎÃIÇÃIÀÃI¹ÃI²ÃI«ÃI¤ÃIÃI–ÃIÃIˆÃIÃIzÃIsÃIlÃIeÃI^ÃIWÃIPÃIIÃIBÃI;ÃI4ÃI-ÃI&ÃIÃIÃIÃI ÃIÃIüÂIõÂIîÂIçÂIàÂIÙÂIÒÂIËÂIÄÂI½ÂI¶ÂI¯ÂI¨ÂI¡ÂIšÂI“ÂIŒÂI…ÂI~ÂIwÂIpÂIiÂIbÂI[ÂITÂIMÂIFÂI?ÂI8ÂI1ÂI*ÂI#ÂIÂIÂIÂIÂIÂIùÁIòÁIëÁIäÁIÝÁIÖÁIÏÁIÈÁIÁÁIºÁI³ÁI¬ÁI¥ÁIžÁI—ÁIÁI‰ÁI‚ÁI{ÁItÁImÁIfÁI_ÁIXÁIQÁIJÁICÁI<ÁI5ÁI.ÁI'ÁI ÁIÁIÁI ÁIÁIýÀIöÀIïÀIèÀIáÀIÚÀIÓÀIÌÀIÅÀI¾ÀI·ÀI°ÀI©ÀI¢ÀI›ÀI”ÀIÀI†ÀIÀIxÀIqÀIjÀIcÀI\ÀIUÀINÀIGÀI@ÀI9ÀI2ÀI+ÀI$ÀIÀIÀIÀIÀIÀIú¿Ió¿Iì¿Iå¿IÞ¿I׿IпIÉ¿I¿I»¿I´¿I­¿I¦¿IŸ¿I˜¿I‘¿IŠ¿Iƒ¿I|¿Iu¿In¿Ig¿I`¿IY¿IR¿IK¿ID¿I=¿I6¿I/¿I(¿I!¿I¿I¿I ¿I¿Iþ¾I÷¾Ið¾Ié¾Iâ¾IÛ¾IÔ¾I;IƾI¿¾I¸¾I±¾Iª¾I£¾Iœ¾I•¾I޾I‡¾I€¾Iy¾Ir¾Ik¾Id¾I]¾IV¾IO¾IH¾IA¾I:¾I3¾I,¾I%¾I¾I¾I¾I ¾I¾Iû½Iô½Ií½Iæ½Iß½IؽIѽIʽIýI¼½Iµ½I®½I§½I ½I™½I’½I‹½I„½I}½Iv½Io½Ih½Ia½IZ½IS½IL½IE½I>½I7½I0½I)½I"½I½I½I ½I½Iÿ¼Iø¼Iñ¼Iê¼Iã¼IܼIÕ¼IμIǼIÀ¼I¹¼I²¼I«¼I¤¼I¼I–¼I¼Iˆ¼I¼Iz¼Is¼Il¼Ie¼I^¼IW¼IP¼II¼IB¼I;¼I4¼I-¼I&¼I¼I¼I¼I ¼I¼Iü»Iõ»Iî»Iç»Ià»IÙ»IÒ»IË»IÄ»I½»I¶»I¯»I¨»I¡»Iš»I“»IŒ»I…»I~»Iw»Ip»Ii»Ib»I[»IT»IM»IF»I?»I8»I1»I*»I#»I»I»I»I»I»IùºIòºIëºIäºIݺIÖºIϺIȺIÁºIººI³ºI¬ºI¥ºIžºI—ºIºI‰ºI‚ºI{ºItºImºIfºI_ºIXºIQºIJºICºI<ºI5ºI.ºI'ºI ºIºIºI ºIºIý¹Iö¹Iï¹Iè¹Iá¹IÚ¹IÓ¹I̹IŹI¾¹I·¹I°¹I©¹I¢¹I›¹I”¹I¹I†¹I¹Ix¹Iq¹Ij¹Ic¹I\¹IU¹IN¹IG¹I@¹I9¹I2¹I+¹I$¹I¹I¹I¹I¹I¹Iú¸Ió¸Iì¸Iå¸IÞ¸I׸IиIɸI¸I»¸I´¸I­¸I¦¸IŸ¸I˜¸I‘¸IЏIƒ¸I|¸Iu¸In¸Ig¸I`¸IY¸IR¸IK¸ID¸I=¸I6¸I/¸I(¸I!¸I¸I¸I ¸I¸Iþ·I÷·Ið·Ié·Iâ·IÛ·IÔ·IÍ·IÆ·I¿·I¸·I±·Iª·I£·Iœ·I•·IŽ·I‡·I€·Iy·Ir·Ik·Id·I]·IV·IO·IH·IA·I:·I3·I,·I%·I·I·I·I ·I·Iû¶Iô¶Ií¶Iæ¶Iß¶IضIѶIʶIöI¼¶Iµ¶I®¶I§¶I ¶I™¶I’¶I‹¶I„¶I}¶Iv¶Io¶Ih¶Ia¶IZ¶IS¶IL¶IE¶I>¶I7¶I0¶I)¶I"¶I¶I¶I ¶I¶IÿµIøµIñµIêµIãµIܵIÕµIεIǵIÀµI¹µI²µI«µI¤µIµI–µIµIˆµIµIzµIsµIlµIeµI^µIWµIPµIIµIBµI;µI4µI-µI&µIµIµIµI µIµIü´Iõ´Iî´Iç´Ià´IÙ´IÒ´IË´IÄ´I½´I¶´I¯´I¨´I¡´Iš´I“´IŒ´I…´I~´Iw´Ip´Ii´Ib´I[´IT´IM´IF´I?´I8´I1´I*´I#´I´I´I´I´I´Iù³Iò³Ië³Iä³IݳIÖ³IϳIȳIÁ³Iº³I³³I¬³I¥³Iž³I—³I³I‰³I‚³I{³It³Im³If³I_³IX³IQ³IJ³IC³I<³I5³I.³I'³I ³I³I³I ³I³Iý²Iö²Iï²Iè²Iá²IÚ²IÓ²I̲IŲI¾²I·²I°²I©²I¢²I›²I”²I²I†²I²Ix²Iq²Ij²Ic²I\²IU²IN²IG²I@²I9²I2²I+²I$²I²I²I²I²I²Iú±Ió±Iì±Iå±IÞ±I×±IбIɱI±I»±I´±I­±I¦±IŸ±I˜±I‘±IбIƒ±I|±Iu±In±Ig±I`±IY±IR±IK±ID±I=±I6±I/±I(±I!±I±I±I ±I±Iþ°I÷°Ið°Ié°Iâ°IÛ°IÔ°IͰIưI¿°I¸°I±°Iª°I£°Iœ°I•°IްI‡°I€°Iy°Ir°Ik°Id°I]°IV°IO°IH°IA°I:°I3°I,°I%°I°I°I°I °I°Iû¯Iô¯Ií¯Iæ¯I߯IدIѯIʯIïI¼¯Iµ¯I®¯I§¯I ¯I™¯I’¯I‹¯I„¯I}¯Iv¯Io¯Ih¯Ia¯IZ¯IS¯IL¯IE¯I>¯I7¯I0¯I)¯I"¯I¯I¯I ¯I¯Iÿ®Iø®Iñ®Iê®Iã®IÜ®IÕ®IήIÇ®IÀ®I¹®I²®I«®I¤®I®I–®I®Iˆ®I®Iz®Is®Il®Ie®I^®IW®IP®II®IB®I;®I4®I-®I&®I®I®I®I ®I®Iü­Iõ­Iî­Iç­Ià­IÙ­IÒ­IË­IÄ­I½­I¶­I¯­I¨­I¡­Iš­I“­IŒ­I…­I~­Iw­Ip­Ii­Ib­I[­IT­IM­IF­I?­I8­I1­I*­I#­I­I­I­I­I­Iù¬Iò¬Ië¬Iä¬IݬIÖ¬IϬIȬIÁ¬Iº¬I³¬I¬¬I¥¬Iž¬I—¬I¬I‰¬I‚¬I{¬It¬Im¬If¬I_¬IX¬IQ¬IJ¬IC¬I<¬I5¬I.¬I'¬I ¬I¬I¬I ¬I¬Iý«Iö«Iï«Iè«Iá«IÚ«IÓ«IÌ«IÅ«I¾«I·«I°«I©«I¢«I›«I”«I«I†«I«Ix«Iq«Ij«Ic«I\«IU«IN«IG«I@«I9«I2«I+«I$«I«I«I«I«I«IúªIóªIìªIåªIÞªIתIЪIɪIªI»ªI´ªI­ªI¦ªIŸªI˜ªI‘ªIŠªIƒªI|ªIuªInªIgªI`ªIYªIRªIKªIDªI=ªI6ªI/ªI(ªI!ªIªIªI ªIªIþ©I÷©Ið©Ié©Iâ©IÛ©IÔ©IÍ©IÆ©I¿©I¸©I±©Iª©I£©Iœ©I•©IŽ©I‡©I€©Iy©Ir©Ik©Id©I]©IV©IO©IH©IA©I:©I3©I,©I%©I©I©I©I ©I©Iû¨Iô¨Ií¨Iæ¨IߨIبIѨIʨIèI¼¨Iµ¨I®¨I§¨I ¨I™¨I’¨I‹¨I„¨I}¨Iv¨Io¨Ih¨Ia¨IZ¨IS¨IL¨IE¨I>¨I7¨I0¨I)¨I"¨I¨I¨I ¨I¨Iÿ§Iø§Iñ§Iê§Iã§IܧIÕ§IΧIǧIÀ§I¹§I²§I«§I¤§I§I–§I§Iˆ§I§Iz§Is§Il§Ie§I^§IW§IP§II§IB§I;§I4§I-§I&§I§I§I§I §I§Iü¦Iõ¦Iî¦Iç¦Ià¦IÙ¦IÒ¦I˦IĦI½¦I¶¦I¯¦I¨¦I¡¦Iš¦I“¦IŒ¦I…¦I~¦Iw¦Ip¦Ii¦Ib¦I[¦IT¦IM¦IF¦I?¦I8¦I1¦I*¦I#¦I¦I¦I¦I¦I¦Iù¥Iò¥Ië¥Iä¥IÝ¥IÖ¥IÏ¥IÈ¥IÁ¥Iº¥I³¥I¬¥I¥¥Iž¥I—¥I¥I‰¥I‚¥I{¥It¥Im¥If¥I_¥IX¥IQ¥IJ¥IC¥I<¥I5¥I.¥I'¥I ¥I¥I¥I ¥I¥Iý¤Iö¤Iï¤Iè¤Iá¤IÚ¤IÓ¤I̤IŤI¾¤I·¤I°¤I©¤I¢¤I›¤I”¤I¤I†¤I¤Ix¤Iq¤Ij¤Ic¤I\¤IU¤IN¤IG¤I@¤I9¤I2¤I+¤I$¤I¤I¤I¤I¤I¤Iú£Ió£Iì£Iå£IÞ£I×£IУIÉ£I£I»£I´£I­£I¦£IŸ£I˜£I‘£IŠ£Iƒ£I|£Iu£In£Ig£I`£IY£IR£IK£ID£I=£I6£I/£I(£I!£I£I£I £I£Iþ¢I÷¢Ið¢Ié¢Iâ¢IÛ¢IÔ¢IÍ¢IÆ¢I¿¢I¸¢I±¢Iª¢I£¢Iœ¢I•¢IŽ¢I‡¢I€¢Iy¢Ir¢Ik¢Id¢I]¢IV¢IO¢IH¢IA¢I:¢I3¢I,¢I%¢I¢I¢I¢I ¢I¢Iû¡Iô¡Ií¡Iæ¡Iß¡IØ¡IÑ¡IÊ¡IáI¼¡Iµ¡I®¡I§¡I ¡I™¡I’¡I‹¡I„¡I}¡Iv¡Io¡Ih¡Ia¡IZ¡IS¡IL¡IE¡I>¡I7¡I0¡I)¡I"¡I¡I¡I ¡I¡Iÿ Iø Iñ Iê Iã IÜ IÕ IΠIÇ IÀ I¹ I² I« I¤ I I– I Iˆ I Iz Is Il Ie I^ IW IP II IB I; I4 I- I& I I I I  I IüŸIõŸIîŸIçŸIàŸIÙŸIÒŸIËŸIÄŸI½ŸI¶ŸI¯ŸI¨ŸI¡ŸIšŸI“ŸIŒŸI…ŸI~ŸIwŸIpŸIiŸIbŸI[ŸITŸIMŸIFŸI?ŸI8ŸI1ŸI*ŸI#ŸIŸIŸIŸIŸIŸIùžIòžIëžIäžIÝžIÖžIÏžIÈžIÁžIºžI³žI¬žI¥žIžžI—žIžI‰žI‚žI{žItžImžIfžI_žIXžIQžIJžICžI<žI5žI.žI'žI žIžIžI žIžIýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIúœIóœIìœIåœIÞœIלIМIÉœIœI»œI´œI­œI¦œIŸœI˜œI‘œIŠœIƒœI|œIuœInœIgœI`œIYœIRœIKœIDœI=œI6œI/œI(œI!œIœIœI œIœIþ›I÷›Ið›Ié›Iâ›IÛ›IÔ›IÍ›IÆ›I¿›I¸›I±›Iª›I£›Iœ›I•›IŽ›I‡›I€›Iy›Ir›Ik›Id›I]›IV›IO›IH›IA›I:›I3›I,›I%›I›I›I›I ›I›IûšIôšIíšIæšIßšIØšIÑšIÊšIÚI¼šIµšI®šI§šI šI™šI’šI‹šI„šI}šIvšIošIhšIašIZšISšILšIEšI>šI7šI0šI)šI"šIšIšI šIšIÿ™Iø™Iñ™Iê™Iã™IÜ™IÕ™IΙIÇ™IÀ™I¹™I²™I«™I¤™I™I–™I™Iˆ™I™Iz™Is™Il™Ie™I^™IW™IP™II™IB™I;™I4™I-™I&™I™I™I™I ™I™Iü˜Iõ˜Iî˜Iç˜Ià˜IÙ˜IÒ˜I˘IĘI½˜I¶˜I¯˜I¨˜I¡˜Iš˜I“˜IŒ˜I…˜I~˜Iw˜Ip˜Ii˜Ib˜I[˜IT˜IM˜IF˜I?˜I8˜I1˜I*˜I#˜I˜I˜I˜I˜I˜Iù—Iò—Ië—Iä—IÝ—IÖ—IÏ—IÈ—IÁ—Iº—I³—I¬—I¥—Iž—I——I—I‰—I‚—I{—It—Im—If—I_—IX—IQ—IJ—IC—I<—I5—I.—I'—I —I—I—I —I—Iý–Iö–Iï–Iè–Iá–IÚ–IÓ–IÌ–IÅ–I¾–I·–I°–I©–I¢–I›–I”–I–I†–I–Ix–Iq–Ij–Ic–I\–IU–IN–IG–I@–I9–I2–I+–I$–I–I–I–I–I–Iú•Ió•Iì•Iå•IÞ•IוIЕIÉ•I•I»•I´•I­•I¦•IŸ•I˜•I‘•IŠ•Iƒ•I|•Iu•In•Ig•I`•IY•IR•IK•ID•I=•I6•I/•I(•I!•I•I•I •I•Iþ”I÷”Ið”Ié”Iâ”IÛ”IÔ”IÍ”IÆ”I¿”I¸”I±”Iª”I£”Iœ”I•”IŽ”I‡”I€”Iy”Ir”Ik”Id”I]”IV”IO”IH”IA”I:”I3”I,”I%”I”I”I”I ”I”Iû“Iô“Ií“Iæ“Iß“IØ“IÑ“IÊ“IÓI¼“Iµ“I®“I§“I “I™“I’“I‹“I„“I}“Iv“Io“Ih“Ia“IZ“IS“IL“IE“I>“I7“I0“I)“I"“I“I“I “I“Iÿ’Iø’Iñ’Iê’Iã’IÜ’IÕ’IÎ’IÇ’IÀ’I¹’I²’I«’I¤’I’I–’I’Iˆ’I’Iz’Is’Il’Ie’I^’IW’IP’II’IB’I;’I4’I-’I&’I’I’I’I ’I’Iü‘Iõ‘Iî‘Iç‘Ià‘IÙ‘IÒ‘IË‘IÄ‘I½‘I¶‘I¯‘I¨‘I¡‘Iš‘I“‘IŒ‘I…‘I~‘Iw‘Ip‘Ii‘Ib‘I[‘IT‘IM‘IF‘I?‘I8‘I1‘I*‘I#‘I‘I‘I‘I‘I‘IùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICIŒI7ŒI0ŒI)ŒI"ŒIŒIŒI ŒIŒIÿ‹Iø‹Iñ‹Iê‹Iã‹IÜ‹IÕ‹I΋IÇ‹IÀ‹I¹‹I²‹I«‹I¤‹I‹I–‹I‹Iˆ‹I‹Iz‹Is‹Il‹Ie‹I^‹IW‹IP‹II‹IB‹I;‹I4‹I-‹I&‹I‹I‹I‹I ‹I‹IüŠIõŠIîŠIçŠIàŠIÙŠIÒŠIËŠIÄŠI½ŠI¶ŠI¯ŠI¨ŠI¡ŠIšŠI“ŠIŒŠI…ŠI~ŠIwŠIpŠIiŠIbŠI[ŠITŠIMŠIFŠI?ŠI8ŠI1ŠI*ŠI#ŠIŠIŠIŠIŠIŠIù‰Iò‰Ië‰Iä‰I݉IÖ‰IωIȉIÁ‰Iº‰I³‰I¬‰I¥‰Iž‰I—‰I‰I‰‰I‚‰I{‰It‰Im‰If‰I_‰IX‰IQ‰IJ‰IC‰I<‰I5‰I.‰I'‰I ‰I‰I‰I ‰I‰IýˆIöˆIïˆIèˆIáˆIÚˆIÓˆÏIňI¾ˆI·ˆI°ˆI©ˆI¢ˆI›ˆI”ˆIˆI†ˆIˆIxˆIqˆIjˆIcˆI\ˆIUˆINˆIGˆI@ˆI9ˆI2ˆI+ˆI$ˆIˆIˆIˆIˆIˆIú‡Ió‡Iì‡Iå‡IÞ‡IׇIЇIɇI‡I»‡I´‡I­‡I¦‡IŸ‡I˜‡I‘‡IЇIƒ‡I|‡Iu‡In‡Ig‡I`‡IY‡IR‡IK‡ID‡I=‡I6‡I/‡I(‡I!‡I‡I‡I ‡I‡Iþ†I÷†Ið†Ié†Iâ†IÛ†IÔ†I͆IƆI¿†I¸†I±†Iª†I£†Iœ†I•†IކI‡†I€†Iy†Ir†Ik†Id†I]†IV†IO†IH†IA†I:†I3†I,†I%†I†I†I†I †I†Iû…Iô…Ií…Iæ…Iß…IØ…IÑ…IÊ…IÃ…I¼…Iµ…I®…I§…I …I™…I’…I‹…I„…I}…Iv…Io…Ih…Ia…IZ…IS…IL…IE…I>…I7…I0…I)…I"…I…I…I …I…Iÿ„Iø„Iñ„Iê„Iã„IÜ„IÕ„I΄IÇ„IÀ„I¹„I²„I«„I¤„I„I–„I„Iˆ„I„Iz„Is„Il„Ie„I^„IW„IP„II„IB„I;„I4„I-„I&„I„I„I„I „I„IüƒIõƒIîƒIçƒIàƒIÙƒIÒƒI˃IăI½ƒI¶ƒI¯ƒI¨ƒI¡ƒIšƒI“ƒIŒƒI…ƒI~ƒIwƒIpƒIiƒIbƒI[ƒITƒIMƒIFƒI?ƒI8ƒI1ƒI*ƒI#ƒIƒIƒIƒIƒIƒIù‚Iò‚Ië‚Iä‚IÝ‚IÖ‚IÏ‚IÈ‚IÁ‚Iº‚I³‚I¬‚I¥‚Iž‚I—‚I‚I‰‚I‚‚I{‚It‚Im‚If‚I_‚IX‚IQ‚IJ‚IC‚I<‚I5‚I.‚I'‚I ‚I‚I‚I ‚I‚IýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIú€Ió€Iì€Iå€IÞ€I×€IЀIÉ€I€I»€I´€I­€I¦€IŸ€I˜€I‘€IŠ€Iƒ€I|€Iu€In€Ig€I`€IY€IR€IK€ID€I=€I6€I/€I(€I!€I€I€I €I€IþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIû~Iô~Ií~Iæ~Iß~IØ~IÑ~IÊ~IÃ~I¼~Iµ~I®~I§~I ~I™~I’~I‹~I„~I}~Iv~Io~Ih~Ia~IZ~IS~IL~IE~I>~I7~I0~I)~I"~I~I~I ~I~Iÿ}Iø}Iñ}Iê}Iã}IÜ}IÕ}IÎ}IÇ}IÀ}I¹}I²}I«}I¤}I}I–}I}Iˆ}I}Iz}Is}Il}Ie}I^}IW}IP}II}IB}I;}I4}I-}I&}I}I}I}I }I}Iü|Iõ|Iî|Iç|Ià|IÙ|IÒ|IË|IÄ|I½|I¶|I¯|I¨|I¡|Iš|I“|IŒ|I…|I~|Iw|Ip|Ii|Ib|I[|IT|IM|IF|I?|I8|I1|I*|I#|I|I|I|I|I|Iù{Iò{Ië{Iä{IÝ{IÖ{IÏ{IÈ{IÁ{Iº{I³{I¬{I¥{Iž{I—{I{I‰{I‚{I{{It{Im{If{I_{IX{IQ{IJ{IC{I<{I5{I.{I'{I {I{I{I {I{IýzIözIïzIèzIázIÚzIÓzIÌzIÅzI¾zI·zI°zI©zI¢zI›zI”zIzI†zIzIxzIqzIjzIczI\zIUzINzIGzI@zI9zI2zI+zI$zIzIzIzIzIzIúyIóyIìyIåyIÞyI×yIÐyIÉyIÂyI»yI´yI­yI¦yIŸyI˜yI‘yIŠyIƒyI|yIuyInyIgyI`yIYyIRyIKyIDyI=yI6yI/yI(yI!yIyIyI yIyIþxI÷xIðxIéxIâxIÛxIÔxIÍxIÆxI¿xI¸xI±xIªxI£xIœxI•xIŽxI‡xI€xIyxIrxIkxIdxI]xIVxIOxIHxIAxI:xI3xI,xI%xIxIxIxI xIxIûwIôwIíwIæwIßwIØwIÑwIÊwIÃwI¼wIµwI®wI§wI wI™wI’wI‹wI„wI}wIvwIowIhwIawIZwISwILwIEwI>wI7wI0wI)wI"wIwIwI wIwIÿvIøvIñvIêvIãvIÜvIÕvIÎvIÇvIÀvI¹vI²vI«vI¤vIvI–vIvIˆvIvIzvIsvIlvIevI^vIWvIPvIIvIBvI;vI4vI-vI&vIvIvIvI vIvIüuIõuIîuIçuIàuIÙuIÒuIËuIÄuI½uI¶uI¯uI¨uI¡uIšuI“uIŒuI…uI~uIwuIpuIiuIbuI[uITuIMuIFuI?uI8uI1uI*uI#uIuIuIuIuIuIùtIòtIëtIätIÝtIÖtIÏtIÈtIÁtIºtI³tI¬tI¥tIžtI—tItI‰tI‚tI{tIttImtIftI_tIXtIQtIJtICtIpI7pI0pI)pI"pIpIpI pIpIÿoIøoIñoIêoIãoIÜoIÕoIÎoIÇoIÀoI¹oI²oI«oI¤oIoI–oIoIˆoIoIzoIsoIloIeoI^oIWoIPoIIoIBoI;oI4oI-oI&oIoIoIoI oIoIünIõnIînIçnIànIÙnIÒnIËnIÄnI½nI¶nI¯nI¨nI¡nIšnI“nIŒnI…nI~nIwnIpnIinIbnI[nITnIMnIFnI?nI8nI1nI*nI#nInInInInInIùmIòmIëmIämIÝmIÖmIÏmIÈmIÁmIºmI³mI¬mI¥mIžmI—mImI‰mI‚mI{mItmImmIfmI_mIXmIQmIJmICmIiI7iI0iI)iI"iIiIiI iIiIÿhIøhIñhIêhIãhIÜhIÕhIÎhIÇhIÀhI¹hI²hI«hI¤hIhI–hIhIˆhIhIzhIshIlhIehI^hIWhIPhIIhIBhI;hI4hI-hI&hIhIhIhI hIhIügIõgIîgIçgIàgIÙgIÒgIËgIÄgI½gI¶gI¯gI¨gI¡gIšgI“gIŒgI…gI~gIwgIpgIigIbgI[gITgIMgIFgI?gI8gI1gI*gI#gIgIgIgIgIgIùfIòfIëfIäfIÝfIÖfIÏfIÈfIÁfIºfI³fI¬fI¥fIžfI—fIfI‰fI‚fI{fItfImfIffI_fIXfIQfIJfICfIbI7bI0bI)bI"bIbIbI bIbIÿaIøaIñaIêaIãaIÜaIÕaIÎaIÇaIÀaI¹aI²aI«aI¤aIaI–aIaIˆaIaIzaIsaIlaIeaI^aIWaIPaIIaIBaI;aI4aI-aI&aIaIaIaI aIaIü`Iõ`Iî`Iç`Ià`IÙ`IÒ`IË`IÄ`I½`I¶`I¯`I¨`I¡`Iš`I“`IŒ`I…`I~`Iw`Ip`Ii`Ib`I[`IT`IM`IF`I?`I8`I1`I*`I#`I`I`I`I`I`Iù_Iò_Ië_Iä_IÝ_IÖ_IÏ_IÈ_IÁ_Iº_I³_I¬_I¥_Iž_I—_I_I‰_I‚_I{_It_Im_If_I__IX_IQ_IJ_IC_I<_I5_I._I'_I _I_I_I _I_Iý^Iö^Iï^Iè^Iá^IÚ^IÓ^IÌ^IÅ^I¾^I·^I°^I©^I¢^I›^I”^I^I†^I^Ix^Iq^Ij^Ic^I\^IU^IN^IG^I@^I9^I2^I+^I$^I^I^I^I^I^Iú]Ió]Iì]Iå]IÞ]I×]IÐ]IÉ]IÂ]I»]I´]I­]I¦]IŸ]I˜]I‘]IŠ]Iƒ]I|]Iu]In]Ig]I`]IY]IR]IK]ID]I=]I6]I/]I(]I!]I]I]I ]I]Iþ\I÷\Ið\Ié\Iâ\IÛ\IÔ\IÍ\IÆ\I¿\I¸\I±\Iª\I£\Iœ\I•\IŽ\I‡\I€\Iy\Ir\Ik\Id\I]\IV\IO\IH\IA\I:\I3\I,\I%\I\I\I\I \I\Iû[Iô[Ií[Iæ[Iß[IØ[IÑ[IÊ[IÃ[I¼[Iµ[I®[I§[I [I™[I’[I‹[I„[I}[Iv[Io[Ih[Ia[IZ[IS[IL[IE[I>[I7[I0[I)[I"[I[I [I[IÿZIøZIñZIêZIãZIÜZIÕZIÎZIÇZIÀZI¹ZI²ZI«ZI¤ZIZI–ZIZIˆZIZIzZIsZIlZIeZI^ZIWZIPZIIZIBZI;ZI4ZI-ZI&ZIZIZIZI ZIZIüYIõYIîYIçYIàYIÙYIÒYIËYIÄYI½YI¶YI¯YI¨YI¡YIšYI“YIŒYI…YI~YIwYIpYIiYIbYI[YITYIMYIFYI?YI8YI1YI*YI#YIYIYIYIYIYIùXIòXIëXIäXIÝXIÖXIÏXIÈXIÁXIºXI³XI¬XI¥XIžXI—XIXI‰XI‚XI{XItXImXIfXI_XIXXIQXIJXICXITI7TI0TI)TI"TITITI TITIÿSIøSIñSIêSIãSIÜSIÕSIÎSIÇSIÀSI¹SI²SI«SI¤SISI–SISIˆSISIzSIsSIlSIeSI^SIWSIPSIISIBSI;SI4SI-SI&SISISISI SISIüRIõRIîRIçRIàRIÙRIÒRIËRIÄRI½RI¶RI¯RI¨RI¡RIšRI“RIŒRI…RI~RIwRIpRIiRIbRI[RITRIMRIFRI?RI8RI1RI*RI#RIRIRIRIRIRIùQIòQIëQIäQIÝQIÖQIÏQIÈQIÁQIºQI³QI¬QI¥QIžQI—QIQI‰QI‚QI{QItQImQIfQI_QIXQIQQIJQICQIMI7MI0MI)MI"MIMIMI MIMIÿLIøLIñLIêLIãLIÜLIÕLIÎLIÇLIÀLI¹LI²LI«LI¤LILI–LILIˆLILIzLIsLIlLIeLI^LIWLIPLIILIBLI;LI4LI-LI&LILILILI LILIüKIõKIîKIçKIàKIÙKIÒKIËKIÄKI½KI¶KI¯KI¨KI¡KIšKI“KIŒKI…KI~KIwKIpKIiKIbKI[KITKIMKIFKI?KI8KI1KI*KI#KIKIKIKIKIKIùJIòJIëJIäJIÝJIÖJIÏJIÈJIÁJIºJI³JI¬JI¥JIžJI—JIJI‰JI‚JI{JItJImJIfJI_JIXJIQJIJJICJIFI7FI0FI)FI"FIFIFI FIFIÿEIøEIñEIêEIãEIÜEIÕEIÎEIÇEIÀEI¹EI²EI«EI¤EIEI–EIEIˆEIEIzEIsEIlEIeEI^EIWEIPEIIEIBEI;EI4EI-EI&EIEIEIEI EIEIüDIõDIîDIçDIàDIÙDIÒDIËDIÄDI½DI¶DI¯DI¨DI¡DIšDI“DIŒDI…DI~DIwDIpDIiDIbDI[DITDIMDIFDI?DI8DI1DI*DI#DIDIDIDIDIDIùCIòCIëCIäCIÝCIÖCIÏCIÈCIÁCIºCI³CI¬CI¥CIžCI—CICI‰CI‚CI{CItCImCIfCI_CIXCIQCIJCICCI?I7?I0?I)?I"?I?I?I ?I?Iÿ>Iø>Iñ>Iê>Iã>IÜ>IÕ>IÎ>IÇ>IÀ>I¹>I²>I«>I¤>I>I–>I>Iˆ>I>Iz>Is>Il>Ie>I^>IW>IP>II>IB>I;>I4>I->I&>I>I>I>I >I>Iü=Iõ=Iî=Iç=Ià=IÙ=IÒ=IË=IÄ=I½=I¶=I¯=I¨=I¡=Iš=I“=IŒ=I…=I~=Iw=Ip=Ii=Ib=I[=IT=IM=IF=I?=I8=I1=I*=I#=I=I=I=I=I=Iù8I78I08I)8I"8I8I8I 8I8Iÿ7Iø7Iñ7Iê7Iã7IÜ7IÕ7IÎ7IÇ7IÀ7I¹7I²7I«7I¤7I7I–7I7Iˆ7I7Iz7Is7Il7Ie7I^7IW7IP7II7IB7I;7I47I-7I&7I7I7I7I 7I7Iü6Iõ6Iî6Iç6Ià6IÙ6IÒ6IË6IÄ6I½6I¶6I¯6I¨6I¡6Iš6I“6IŒ6I…6I~6Iw6Ip6Ii6Ib6I[6IT6IM6IF6I?6I86I16I*6I#6I6I6I6I6I6Iù5Iò5Ië5Iä5IÝ5IÖ5IÏ5IÈ5IÁ5Iº5I³5I¬5I¥5Iž5I—5I5I‰5I‚5I{5It5Im5If5I_5IX5IQ5IJ5IC5I<5I55I.5I'5I 5I5I5I 5I5Iý4Iö4Iï4Iè4Iá4IÚ4IÓ4IÌ4IÅ4I¾4I·4I°4I©4I¢4I›4I”4I4I†4I4Ix4Iq4Ij4Ic4I\4IU4IN4IG4I@4I94I24I+4I$4I4I4I4I4I4Iú3Ió3Iì3Iå3IÞ3I×3IÐ3IÉ3IÂ3I»3I´3I­3I¦3IŸ3I˜3I‘3IŠ3Iƒ3I|3Iu3In3Ig3I`3IY3IR3IK3ID3I=3I63I/3I(3I!3I3I3I 3I3Iþ2I÷2Ið2Ié2Iâ2IÛ2IÔ2IÍ2IÆ2I¿2I¸2I±2Iª2I£2Iœ2I•2IŽ2I‡2I€2Iy2Ir2Ik2Id2I]2IV2IO2IH2IA2I:2I32I,2I%2I2I2I2I 2I2Iû1Iô1Ií1Iæ1Iß1IØ1IÑ1IÊ1IÃ1I¼1Iµ1I®1I§1I 1I™1I’1I‹1I„1I}1Iv1Io1Ih1Ia1IZ1IS1IL1IE1I>1I71I01I)1I"1I1I1I 1I1Iÿ0Iø0Iñ0Iê0Iã0IÜ0IÕ0IÎ0IÇ0IÀ0I¹0I²0I«0I¤0I0I–0I0Iˆ0I0Iz0Is0Il0Ie0I^0IW0IP0II0IB0I;0I40I-0I&0I0I0I0I 0I0Iü/Iõ/Iî/Iç/Ià/IÙ/IÒ/IË/IÄ/I½/I¶/I¯/I¨/I¡/Iš/I“/IŒ/I…/I~/Iw/Ip/Ii/Ib/I[/IT/IM/IF/I?/I8/I1/I*/I#/I/I/I/I/I/Iù.Iò.Ië.Iä.IÝ.IÖ.IÏ.IÈ.IÁ.Iº.I³.I¬.I¥.Iž.I—.I.I‰.I‚.I{.It.Im.If.I_.IX.IQ.IJ.IC.I<.I5.I..I'.I .I.I.I .I.Iý-Iö-Iï-Iè-Iá-IÚ-IÓ-IÌ-IÅ-I¾-I·-I°-I©-I¢-I›-I”-I-I†-I-Ix-Iq-Ij-Ic-I\-IU-IN-IG-I@-I9-I2-I+-I$-I-I-I-I-I-Iú,Ió,Iì,Iå,IÞ,I×,IÐ,IÉ,IÂ,I»,I´,I­,I¦,IŸ,I˜,I‘,IŠ,Iƒ,I|,Iu,In,Ig,I`,IY,IR,IK,ID,I=,I6,I/,I(,I!,I,I,I ,I,Iþ+I÷+Ið+Ié+Iâ+IÛ+IÔ+IÍ+IÆ+I¿+I¸+I±+Iª+I£+Iœ+I•+IŽ+I‡+I€+Iy+Ir+Ik+Id+I]+IV+IO+IH+IA+I:+I3+I,+I%+I+I+I+I +I+Iû*Iô*Ií*Iæ*Iß*IØ*IÑ*IÊ*IÃ*I¼*Iµ*I®*I§*I *I™*I’*I‹*I„*I}*Iv*Io*Ih*Ia*IZ*IS*IL*IE*I>*I7*I0*I)*I"*I*I*I *I*Iÿ)Iø)Iñ)Iê)Iã)IÜ)IÕ)IÎ)IÇ)IÀ)I¹)I²)I«)I¤)I)I–)I)Iˆ)I)Iz)Is)Il)Ie)I^)IW)IP)II)IB)I;)I4)I-)I&)I)I)I)I )I)Iü(Iõ(Iî(Iç(Ià(IÙ(IÒ(IË(IÄ(I½(I¶(I¯(I¨(I¡(Iš(I“(IŒ(I…(I~(Iw(Ip(Ii(Ib(I[(IT(IM(IF(I?(I8(I1(I*(I#(I(I(I(I(I(Iù'Iò'Ië'Iä'IÝ'IÖ'IÏ'IÈ'IÁ'Iº'I³'I¬'I¥'Iž'I—'I'I‰'I‚'I{'It'Im'If'I_'IX'IQ'IJ'IC'I<'I5'I.'I''I 'I'I'I 'I'Iý&Iö&Iï&Iè&Iá&IÚ&IÓ&IÌ&IÅ&I¾&I·&I°&I©&I¢&I›&I”&I&I†&I&Ix&Iq&Ij&Ic&I\&IU&IN&IG&I@&I9&I2&I+&I$&I&I&I&I&I&Iú%Ió%Iì%Iå%IÞ%I×%IÐ%IÉ%IÂ%I»%I´%I­%I¦%IŸ%I˜%I‘%IŠ%Iƒ%I|%Iu%In%Ig%I`%IY%IR%IK%ID%I=%I6%I/%I(%I!%I%I%I %I%Iþ$I÷$Ið$Ié$Iâ$IÛ$IÔ$IÍ$IÆ$I¿$I¸$I±$Iª$I£$Iœ$I•$IŽ$I‡$I€$Iy$Ir$Ik$Id$I]$IV$IO$IH$IA$I:$I3$I,$I%$I$I$I$I $I$Iû#Iô#Ií#Iæ#Iß#IØ#IÑ#IÊ#IÃ#I¼#Iµ#I®#I§#I #I™#I’#I‹#I„#I}#Iv#Io#Ih#Ia#IZ#IS#IL#IE#I>#I7#I0#I)#I"#I#I#I #I#Iÿ"Iø"Iñ"Iê"Iã"IÜ"IÕ"IÎ"IÇ"IÀ"I¹"I²"I«"I¤"I"I–"I"Iˆ"I"Iz"Is"Il"Ie"I^"IW"IP"II"IB"I;"I4"I-"I&"I"I"I"I "I"Iü!Iõ!Iî!Iç!Ià!IÙ!IÒ!IË!IÄ!I½!I¶!I¯!I¨!I¡!Iš!I“!IŒ!I…!I~!Iw!Ip!Ii!Ib!I[!IT!IM!IF!I?!I8!I1!I*!I#!I!I!I!I!I!Iù Iò Ië Iä IÝ IÖ IÏ IÈ IÁ Iº I³ I¬ I¥ Iž I— I I‰ I‚ I{ It Im If I_ IX IQ IJ IC I< I5 I. I' I I I I I IýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIúIóIìIåIÞI×IÐIÉIÂI»I´I­I¦IŸI˜I‘IŠIƒI|IuInIgI`IYIRIKIDI=I6I/I(I!III IIþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIûIôIíIæIßIØIÑIÊIÃI¼IµI®I§I I™I’I‹I„I}IvIoIhIaIZISILIEI>I7I0I)I"III IIÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICI<I5I.I'I III IIýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIúIóIìIåIÞI×IÐIÉIÂI»I´I­I¦IŸI˜I‘IŠIƒI|IuInIgI`IYIRIKIDI=I6I/I(I!III IIþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIûIôIíIæIßIØIÑIÊIÃI¼IµI®I§I I™I’I‹I„I}IvIoIhIaIZISILIEI>I7I0I)I"III IIÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICI<I5I.I'I III IIýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIúIóIìIåIÞI×IÐIÉIÂI»I´I­I¦IŸI˜I‘IŠIƒI|IuInIgI`IYIRIKIDI=I6I/I(I!III IIþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIûIôIíIæIßIØIÑIÊIÃI¼IµI®I§I I™I’I‹I„I}IvIoIhIaIZISILIEI>I7I0I)I"III IIÿ Iø Iñ Iê Iã IÜ IÕ IÎ IÇ IÀ I¹ I² I« I¤ I I– I Iˆ I Iz Is Il Ie I^ IW IP II IB I; I4 I- I& I I I I I Iü Iõ Iî Iç Ià IÙ IÒ IË IÄ I½ I¶ I¯ I¨ I¡ Iš I“ IŒ I… I~ Iw Ip Ii Ib I[ IT IM IF I? I8 I1 I* I# I I I I I Iù Iò Ië Iä IÝ IÖ IÏ IÈ IÁ Iº I³ I¬ I¥ Iž I— I I‰ I‚ I{ It Im If I_ IX IQ IJ IC I< I5 I. I' I I I I I Iý Iö Iï Iè Iá IÚ IÓ IÌ IÅ I¾ I· I° I© I¢ I› I” I I† I Ix Iq Ij Ic I\ IU IN IG I@ I9 I2 I+ I$ I I I I I Iú Ió Iì Iå IÞ I× IÐ IÉ I I» I´ I­ I¦ IŸ I˜ I‘ IŠ Iƒ I| Iu In Ig I` IY IR IK ID I= I6 I/ I( I! I I I I IþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIûIôIíIæIßIØIÑIÊIÃI¼IµI®I§I I™I’I‹I„I}IvIoIhIaIZISILIEI>I7I0I)I"III IIÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICI<I5I.I'I III IIýIöIïIèIáIÚIÓIÌIÅI¾I·I°I©I¢I›I”II†IIxIqIjIcI\IUINIGI@I9I2I+I$IIIIIIúIóIìIåIÞI×IÐIÉIÂI»I´I­I¦IŸI˜I‘IŠIƒI|IuInIgI`IYIRIKIDI=I6I/I(I!III IIþI÷IðIéIâIÛIÔIÍIÆI¿I¸I±IªI£IœI•IŽI‡I€IyIrIkIdI]IVIOIHIAI:I3I,I%IIII IIûIôIíIæIßIØIÑIÊIÃI¼IµI®I§I I™I’I‹I„I}IvIoIhIaIZISILIEI>I7I0I)I"III IIÿÿHøÿHñÿHêÿHãÿHÜÿHÕÿHÎÿHÇÿHÀÿH¹ÿH²ÿH«ÿH¤ÿHÿH–ÿHÿHˆÿHÿHzÿHsÿHlÿHeÿH^ÿHWÿHPÿHIÿHBÿH;ÿH4ÿH-ÿH&ÿHÿHÿHÿH ÿHÿHüþHõþHîþHçþHàþHÙþHÒþHËþHÄþH½þH¶þH¯þH¨þH¡þHšþH“þHŒþH…þH~þHwþHpþHiþHbþH[þHTþHMþHFþH?þH8þH1þH*þH#þHþHþHþHþHþHùýHòýHëýHäýHÝýHÖýHÏýHÈýHÁýHºýH³ýH¬ýH¥ýHžýH—ýHýH‰ýH‚ýH{ýHtýHmýHfýH_ýHXýHQýHJýHCýH<ýH5ýH.ýH'ýH ýHýHýH ýHýHýüHöüHïüHèüHáüHÚüHÓüHÌüHÅüH¾üH·üH°üH©üH¢üH›üH”üHüH†üHüHxüHqüHjüHcüH\üHUüHNüHGüH@üH9üH2üH+üH$üHüHüHüHüHüHúûHóûHìûHåûHÞûH×ûHÐûHÉûHÂûH»ûH´ûH­ûH¦ûHŸûH˜ûH‘ûHŠûHƒûH|ûHuûHnûHgûH`ûHYûHRûHKûHDûH=ûH6ûH/ûH(ûH!ûHûHûH ûHûHþúH÷úHðúHéúHâúHÛúHÔúHÍúHÆúH¿úH¸úH±úHªúH£úHœúH•úHŽúH‡úH€úHyúHrúHkúHdúH]úHVúHOúHHúHAúH:úH3úH,úH%úHúHúHúH úHúHûùHôùHíùHæùHßùHØùHÑùHÊùHÃùH¼ùHµùH®ùH§ùH ùH™ùH’ùH‹ùH„ùH}ùHvùHoùHhùHaùHZùHSùHLùHEùH>ùH7ùH0ùH)ùH"ùHùHùH ùHùHÿøHøøHñøHêøHãøHÜøHÕøHÎøHÇøHÀøH¹øH²øH«øH¤øHøH–øHøHˆøHøHzøHsøHløHeøH^øHWøHPøHIøHBøH;øH4øH-øH&øHøHøHøH øHøHü÷Hõ÷Hî÷Hç÷Hà÷HÙ÷HÒ÷HË÷HÄ÷H½÷H¶÷H¯÷H¨÷H¡÷Hš÷H“÷HŒ÷H…÷H~÷Hw÷Hp÷Hi÷Hb÷H[÷HT÷HM÷HF÷H?÷H8÷H1÷H*÷H#÷H÷H÷H÷H÷H÷HùöHòöHëöHäöHÝöHÖöHÏöHÈöHÁöHºöH³öH¬öH¥öHžöH—öHöH‰öH‚öH{öHtöHmöHföH_öHXöHQöHJöHCöH<öH5öH.öH'öH öHöHöH öHöHýõHöõHïõHèõHáõHÚõHÓõHÌõHÅõH¾õH·õH°õH©õH¢õH›õH”õHõH†õHõHxõHqõHjõHcõH\õHUõHNõHGõH@õH9õH2õH+õH$õHõHõHõHõHõHúôHóôHìôHåôHÞôH×ôHÐôHÉôHÂôH»ôH´ôH­ôH¦ôHŸôH˜ôH‘ôHŠôHƒôH|ôHuôHnôHgôH`ôHYôHRôHKôHDôH=ôH6ôH/ôH(ôH!ôHôHôH ôHôHþóH÷óHðóHéóHâóHÛóHÔóHÍóHÆóH¿óH¸óH±óHªóH£óHœóH•óHŽóH‡óH€óHyóHróHkóHdóH]óHVóHOóHHóHAóH:óH3óH,óH%óHóHóHóH óHóHûòHôòHíòHæòHßòHØòHÑòHÊòHÃòH¼òHµòH®òH§òH òH™òH’òH‹òH„òH}òHvòHoòHhòHaòHZòHSòHLòHEòH>òH7òH0òH)òH"òHòHòH òHòHÿñHøñHññHêñHãñHÜñHÕñHÎñHÇñHÀñH¹ñH²ñH«ñH¤ñHñH–ñHñHˆñHñHzñHsñHlñHeñH^ñHWñHPñHIñHBñH;ñH4ñH-ñH&ñHñHñHñH ñHñHüðHõðHîðHçðHàðHÙðHÒðHËðHÄðH½ðH¶ðH¯ðH¨ðH¡ðHšðH“ðHŒðH…ðH~ðHwðHpðHiðHbðH[ðHTðHMðHFðH?ðH8ðH1ðH*ðH#ðHðHðHðHðHðHùïHòïHëïHäïHÝïHÖïHÏïHÈïHÁïHºïH³ïH¬ïH¥ïHžïH—ïHïH‰ïH‚ïH{ïHtïHmïHfïH_ïHXïHQïHJïHCïH<ïH5ïH.ïH'ïH ïHïHïH ïHïHýîHöîHïîHèîHáîHÚîHÓîHÌîHÅîH¾îH·îH°îH©îH¢îH›îH”îHîH†îHîHxîHqîHjîHcîH\îHUîHNîHGîH@îH9îH2îH+îH$îHîHîHîHîHîHúíHóíHìíHåíHÞíH×íHÐíHÉíHÂíH»íH´íH­íH¦íHŸíH˜íH‘íHŠíHƒíH|íHuíHníHgíH`íHYíHRíHKíHDíH=íH6íH/íH(íH!íHíHíH íHíHþìH÷ìHðìHéìHâìHÛìHÔìHÍìHÆìH¿ìH¸ìH±ìHªìH£ìHœìH•ìHŽìH‡ìH€ìHyìHrìHkìHdìH]ìHVìHOìHHìHAìH:ìH3ìH,ìH%ìHìHìHìH ìHìHûëHôëHíëHæëHßëHØëHÑëHÊëHÃëH¼ëHµëH®ëH§ëH ëH™ëH’ëH‹ëH„ëH}ëHvëHoëHhëHaëHZëHSëHLëHEëH>ëH7ëH0ëH)ëH"ëHëHëH ëHëHÿêHøêHñêHêêHãêHÜêHÕêHÎêHÇêHÀêH¹êH²êH«êH¤êHêH–êHêHˆêHêHzêHsêHlêHeêH^êHWêHPêHIêHBêH;êH4êH-êH&êHêHêHêH êHêHüéHõéHîéHçéHàéHÙéHÒéHËéHÄéH½éH¶éH¯éH¨éH¡éHšéH“éHŒéH…éH~éHwéHpéHiéHbéH[éHTéHMéHFéH?éH8éH1éH*éH#éHéHéHéHéHéHùèHòèHëèHäèHÝèHÖèHÏèHÈèHÁèHºèH³èH¬èH¥èHžèH—èHèH‰èH‚èH{èHtèHmèHfèH_èHXèHQèHJèHCèH<èH5èH.èH'èH èHèHèH èHèHýçHöçHïçHèçHáçHÚçHÓçHÌçHÅçH¾çH·çH°çH©çH¢çH›çH”çHçH†çHçHxçHqçHjçHcçH\çHUçHNçHGçH@çH9çH2çH+çH$çHçHçHçHçHçHúæHóæHìæHåæHÞæH׿HÐæHÉæHÂæH»æH´æH­æH¦æHŸæH˜æH‘æHŠæHƒæH|æHuæHnæHgæH`æHYæHRæHKæHDæH=æH6æH/æH(æH!æHæHæH æHæHþåH÷åHðåHéåHâåHÛåHÔåHÍåHÆåH¿åH¸åH±åHªåH£åHœåH•åHŽåH‡åH€åHyåHråHkåHdåH]åHVåHOåHHåHAåH:åH3åH,åH%åHåHåHåH åHåHûäHôäHíäHæäHßäHØäHÑäHÊäHÃäH¼äHµäH®äH§äH äH™äH’äH‹äH„äH}äHväHoäHhäHaäHZäHSäHLäHEäH>äH7äH0äH)äH"äHäHäH äHäHÿãHøãHñãHêãHããHÜãHÕãHÎãHÇãHÀãH¹ãH²ãH«ãH¤ãHãH–ãHãHˆãHãHzãHsãHlãHeãH^ãHWãHPãHIãHBãH;ãH4ãH-ãH&ãHãHãHãH ãHãHüâHõâHîâHçâHàâHÙâHÒâHËâHÄâH½âH¶âH¯âH¨âH¡âHšâH“âHŒâH…âH~âHwâHpâHiâHbâH[âHTâHMâHFâH?âH8âH1âH*âH#âHâHâHâHâHâHùáHòáHëáHäáHÝáHÖáHÏáHÈáHÁáHºáH³áH¬áH¥áHžáH—áHáH‰áH‚áH{áHtáHmáHfáH_áHXáHQáHJáHCáH<áH5áH.áH'áH áHáHáH áHáHýàHöàHïàHèàHáàHÚàHÓàHÌàHÅàH¾àH·àH°àH©àH¢àH›àH”àHàH†àHàHxàHqàHjàHcàH\àHUàHNàHGàH@àH9àH2àH+àH$àHàHàHàHàHàHúßHóßHìßHåßHÞßH×ßHÐßHÉßHÂßH»ßH´ßH­ßH¦ßHŸßH˜ßH‘ßHŠßHƒßH|ßHußHnßHgßH`ßHYßHRßHKßHDßH=ßH6ßH/ßH(ßH!ßHßHßH ßHßHþÞH÷ÞHðÞHéÞHâÞHÛÞHÔÞHÍÞHÆÞH¿ÞH¸ÞH±ÞHªÞH£ÞHœÞH•ÞHŽÞH‡ÞH€ÞHyÞHrÞHkÞHdÞH]ÞHVÞHOÞHHÞHAÞH:ÞH3ÞH,ÞH%ÞHÞHÞHÞH ÞHÞHûÝHôÝHíÝHæÝHßÝHØÝHÑÝHÊÝHÃÝH¼ÝHµÝH®ÝH§ÝH ÝH™ÝH’ÝH‹ÝH„ÝH}ÝHvÝHoÝHhÝHaÝHZÝHSÝHLÝHEÝH>ÝH7ÝH0ÝH)ÝH"ÝHÝHÝH ÝHÝHÿÜHøÜHñÜHêÜHãÜHÜÜHÕÜHÎÜHÇÜHÀÜH¹ÜH²ÜH«ÜH¤ÜHÜH–ÜHÜHˆÜHÜHzÜHsÜHlÜHeÜH^ÜHWÜHPÜHIÜHBÜH;ÜH4ÜH-ÜH&ÜHÜHÜHÜH ÜHÜHüÛHõÛHîÛHçÛHàÛHÙÛHÒÛHËÛHÄÛH½ÛH¶ÛH¯ÛH¨ÛH¡ÛHšÛH“ÛHŒÛH…ÛH~ÛHwÛHpÛHiÛHbÛH[ÛHTÛHMÛHFÛH?ÛH8ÛH1ÛH*ÛH#ÛHÛHÛHÛHÛHÛHùÚHòÚHëÚHäÚHÝÚHÖÚHÏÚHÈÚHÁÚHºÚH³ÚH¬ÚH¥ÚHžÚH—ÚHÚH‰ÚH‚ÚH{ÚHtÚHmÚHfÚH_ÚHXÚHQÚHJÚHCÚH<ÚH5ÚH.ÚH'ÚH ÚHÚHÚH ÚHÚHýÙHöÙHïÙHèÙHáÙHÚÙHÓÙHÌÙHÅÙH¾ÙH·ÙH°ÙH©ÙH¢ÙH›ÙH”ÙHÙH†ÙHÙHxÙHqÙHjÙHcÙH\ÙHUÙHNÙHGÙH@ÙH9ÙH2ÙH+ÙH$ÙHÙHÙHÙHÙHÙHúØHóØHìØHåØHÞØHרHÐØHÉØHÂØH»ØH´ØH­ØH¦ØHŸØH˜ØH‘ØHŠØHƒØH|ØHuØHnØHgØH`ØHYØHRØHKØHDØH=ØH6ØH/ØH(ØH!ØHØHØH ØHØHþ×H÷×Hð×Hé×Hâ×HÛ×HÔ×HÍ×HÆ×H¿×H¸×H±×Hª×H£×Hœ×H•×HŽ×H‡×H€×Hy×Hr×Hk×Hd×H]×HV×HO×HH×HA×H:×H3×H,×H%×H×H×H×H ×H×HûÖHôÖHíÖHæÖHßÖHØÖHÑÖHÊÖHÃÖH¼ÖHµÖH®ÖH§ÖH ÖH™ÖH’ÖH‹ÖH„ÖH}ÖHvÖHoÖHhÖHaÖHZÖHSÖHLÖHEÖH>ÖH7ÖH0ÖH)ÖH"ÖHÖHÖH ÖHÖHÿÕHøÕHñÕHêÕHãÕHÜÕHÕÕHÎÕHÇÕHÀÕH¹ÕH²ÕH«ÕH¤ÕHÕH–ÕHÕHˆÕHÕHzÕHsÕHlÕHeÕH^ÕHWÕHPÕHIÕHBÕH;ÕH4ÕH-ÕH&ÕHÕHÕHÕH ÕHÕHüÔHõÔHîÔHçÔHàÔHÙÔHÒÔHËÔHÄÔH½ÔH¶ÔH¯ÔH¨ÔH¡ÔHšÔH“ÔHŒÔH…ÔH~ÔHwÔHpÔHiÔHbÔH[ÔHTÔHMÔHFÔH?ÔH8ÔH1ÔH*ÔH#ÔHÔHÔHÔHÔHÔHùÓHòÓHëÓHäÓHÝÓHÖÓHÏÓHÈÓHÁÓHºÓH³ÓH¬ÓH¥ÓHžÓH—ÓHÓH‰ÓH‚ÓH{ÓHtÓHmÓHfÓH_ÓHXÓHQÓHJÓHCÓH<ÓH5ÓH.ÓH'ÓH ÓHÓHÓH ÓHÓHýÒHöÒHïÒHèÒHáÒHÚÒHÓÒHÌÒHÅÒH¾ÒH·ÒH°ÒH©ÒH¢ÒH›ÒH”ÒHÒH†ÒHÒHxÒHqÒHjÒHcÒH\ÒHUÒHNÒHGÒH@ÒH9ÒH2ÒH+ÒH$ÒHÒHÒHÒHÒHÒHúÑHóÑHìÑHåÑHÞÑH×ÑHÐÑHÉÑHÂÑH»ÑH´ÑH­ÑH¦ÑHŸÑH˜ÑH‘ÑHŠÑHƒÑH|ÑHuÑHnÑHgÑH`ÑHYÑHRÑHKÑHDÑH=ÑH6ÑH/ÑH(ÑH!ÑHÑHÑH ÑHÑHþÐH÷ÐHðÐHéÐHâÐHÛÐHÔÐHÍÐHÆÐH¿ÐH¸ÐH±ÐHªÐH£ÐHœÐH•ÐHŽÐH‡ÐH€ÐHyÐHrÐHkÐHdÐH]ÐHVÐHOÐHHÐHAÐH:ÐH3ÐH,ÐH%ÐHÐHÐHÐH ÐHÐHûÏHôÏHíÏHæÏHßÏHØÏHÑÏHÊÏHÃÏH¼ÏHµÏH®ÏH§ÏH ÏH™ÏH’ÏH‹ÏH„ÏH}ÏHvÏHoÏHhÏHaÏHZÏHSÏHLÏHEÏH>ÏH7ÏH0ÏH)ÏH"ÏHÏHÏH ÏHÏHÿÎHøÎHñÎHêÎHãÎHÜÎHÕÎHÎÎHÇÎHÀÎH¹ÎH²ÎH«ÎH¤ÎHÎH–ÎHÎHˆÎHÎHzÎHsÎHlÎHeÎH^ÎHWÎHPÎHIÎHBÎH;ÎH4ÎH-ÎH&ÎHÎHÎHÎH ÎHÎHüÍHõÍHîÍHçÍHàÍHÙÍHÒÍHËÍHÄÍH½ÍH¶ÍH¯ÍH¨ÍH¡ÍHšÍH“ÍHŒÍH…ÍH~ÍHwÍHpÍHiÍHbÍH[ÍHTÍHMÍHFÍH?ÍH8ÍH1ÍH*ÍH#ÍHÍHÍHÍHÍHÍHùÌHòÌHëÌHäÌHÝÌHÖÌHÏÌHÈÌHÁÌHºÌH³ÌH¬ÌH¥ÌHžÌH—ÌHÌH‰ÌH‚ÌH{ÌHtÌHmÌHfÌH_ÌHXÌHQÌHJÌHCÌH<ÌH5ÌH.ÌH'ÌH ÌHÌHÌH ÌHÌHýËHöËHïËHèËHáËHÚËHÓËHÌËHÅËH¾ËH·ËH°ËH©ËH¢ËH›ËH”ËHËH†ËHËHxËHqËHjËHcËH\ËHUËHNËHGËH@ËH9ËH2ËH+ËH$ËHËHËHËHËHËHúÊHóÊHìÊHåÊHÞÊH×ÊHÐÊHÉÊHÂÊH»ÊH´ÊH­ÊH¦ÊHŸÊH˜ÊH‘ÊHŠÊHƒÊH|ÊHuÊHnÊHgÊH`ÊHYÊHRÊHKÊHDÊH=ÊH6ÊH/ÊH(ÊH!ÊHÊHÊH ÊHÊHþÉH÷ÉHðÉHéÉHâÉHÛÉHÔÉHÍÉHÆÉH¿ÉH¸ÉH±ÉHªÉH£ÉHœÉH•ÉHŽÉH‡ÉH€ÉHyÉHrÉHkÉHdÉH]ÉHVÉHOÉHHÉHAÉH:ÉH3ÉH,ÉH%ÉHÉHÉHÉH ÉHÉHûÈHôÈHíÈHæÈHßÈHØÈHÑÈHÊÈHÃÈH¼ÈHµÈH®ÈH§ÈH ÈH™ÈH’ÈH‹ÈH„ÈH}ÈHvÈHoÈHhÈHaÈHZÈHSÈHLÈHEÈH>ÈH7ÈH0ÈH)ÈH"ÈHÈHÈH ÈHÈHÿÇHøÇHñÇHêÇHãÇHÜÇHÕÇHÎÇHÇÇHÀÇH¹ÇH²ÇH«ÇH¤ÇHÇH–ÇHÇHˆÇHÇHzÇHsÇHlÇHeÇH^ÇHWÇHPÇHIÇHBÇH;ÇH4ÇH-ÇH&ÇHÇHÇHÇH ÇHÇHüÆHõÆHîÆHçÆHàÆHÙÆHÒÆHËÆHÄÆH½ÆH¶ÆH¯ÆH¨ÆH¡ÆHšÆH“ÆHŒÆH…ÆH~ÆHwÆHpÆHiÆHbÆH[ÆHTÆHMÆHFÆH?ÆH8ÆH1ÆH*ÆH#ÆHÆHÆHÆHÆHÆHùÅHòÅHëÅHäÅHÝÅHÖÅHÏÅHÈÅHÁÅHºÅH³ÅH¬ÅH¥ÅHžÅH—ÅHÅH‰ÅH‚ÅH{ÅHtÅHmÅHfÅH_ÅHXÅHQÅHJÅHCÅH<ÅH5ÅH.ÅH'ÅH ÅHÅHÅH ÅHÅHýÄHöÄHïÄHèÄHáÄHÚÄHÓÄHÌÄHÅÄH¾ÄH·ÄH°ÄH©ÄH¢ÄH›ÄH”ÄHÄH†ÄHÄHxÄHqÄHjÄHcÄH\ÄHUÄHNÄHGÄH@ÄH9ÄH2ÄH+ÄH$ÄHÄHÄHÄHÄHÄHúÃHóÃHìÃHåÃHÞÃH×ÃHÐÃHÉÃHÂÃH»ÃH´ÃH­ÃH¦ÃHŸÃH˜ÃH‘ÃHŠÃHƒÃH|ÃHuÃHnÃHgÃH`ÃHYÃHRÃHKÃHDÃH=ÃH6ÃH/ÃH(ÃH!ÃHÃHÃH ÃHÃHþÂH÷ÂHðÂHéÂHâÂHÛÂHÔÂHÍÂHÆÂH¿ÂH¸ÂH±ÂHªÂH£ÂHœÂH•ÂHŽÂH‡ÂH€ÂHyÂHrÂHkÂHdÂH]ÂHVÂHOÂHHÂHAÂH:ÂH3ÂH,ÂH%ÂHÂHÂHÂH ÂHÂHûÁHôÁHíÁHæÁHßÁHØÁHÑÁHÊÁHÃÁH¼ÁHµÁH®ÁH§ÁH ÁH™ÁH’ÁH‹ÁH„ÁH}ÁHvÁHoÁHhÁHaÁHZÁHSÁHLÁHEÁH>ÁH7ÁH0ÁH)ÁH"ÁHÁHÁH ÁHÁHÿÀHøÀHñÀHêÀHãÀHÜÀHÕÀHÎÀHÇÀHÀÀH¹ÀH²ÀH«ÀH¤ÀHÀH–ÀHÀHˆÀHÀHzÀHsÀHlÀHeÀH^ÀHWÀHPÀHIÀHBÀH;ÀH4ÀH-ÀH&ÀHÀHÀHÀH ÀHÀHü¿Hõ¿Hî¿Hç¿Hà¿HÙ¿HÒ¿HË¿HÄ¿H½¿H¶¿H¯¿H¨¿H¡¿Hš¿H“¿HŒ¿H…¿H~¿Hw¿Hp¿Hi¿Hb¿H[¿HT¿HM¿HF¿H?¿H8¿H1¿H*¿H#¿H¿H¿H¿H¿H¿Hù¾Hò¾Hë¾Hä¾HݾHÖ¾HϾHȾHÁ¾Hº¾H³¾H¬¾H¥¾Hž¾H—¾H¾H‰¾H‚¾H{¾Ht¾Hm¾Hf¾H_¾HX¾HQ¾HJ¾HC¾H<¾H5¾H.¾H'¾H ¾H¾H¾H ¾H¾Hý½Hö½Hï½Hè½Há½HÚ½HÓ½H̽HŽH¾½H·½H°½H©½H¢½H›½H”½H½H†½H½Hx½Hq½Hj½Hc½H\½HU½HN½HG½H@½H9½H2½H+½H$½H½H½H½H½H½Hú¼Hó¼Hì¼Hå¼HÞ¼H×¼HмHɼH¼H»¼H´¼H­¼H¦¼HŸ¼H˜¼H‘¼HмHƒ¼H|¼Hu¼Hn¼Hg¼H`¼HY¼HR¼HK¼HD¼H=¼H6¼H/¼H(¼H!¼H¼H¼H ¼H¼Hþ»H÷»Hð»Hé»Hâ»HÛ»HÔ»HÍ»HÆ»H¿»H¸»H±»Hª»H£»Hœ»H•»HŽ»H‡»H€»Hy»Hr»Hk»Hd»H]»HV»HO»HH»HA»H:»H3»H,»H%»H»H»H»H »H»HûºHôºHíºHæºHߺHغHѺHʺHúH¼ºHµºH®ºH§ºH ºH™ºH’ºH‹ºH„ºH}ºHvºHoºHhºHaºHZºHSºHLºHEºH>ºH7ºH0ºH)ºH"ºHºHºH ºHºHÿ¹Hø¹Hñ¹Hê¹Hã¹HܹHÕ¹HιHǹHÀ¹H¹¹H²¹H«¹H¤¹H¹H–¹H¹Hˆ¹H¹Hz¹Hs¹Hl¹He¹H^¹HW¹HP¹HI¹HB¹H;¹H4¹H-¹H&¹H¹H¹H¹H ¹H¹Hü¸Hõ¸Hî¸Hç¸Hà¸HÙ¸HÒ¸H˸HĸH½¸H¶¸H¯¸H¨¸H¡¸Hš¸H“¸HŒ¸H…¸H~¸Hw¸Hp¸Hi¸Hb¸H[¸HT¸HM¸HF¸H?¸H8¸H1¸H*¸H#¸H¸H¸H¸H¸H¸Hù·Hò·Hë·Hä·HÝ·HÖ·HÏ·HÈ·HÁ·Hº·H³·H¬·H¥·Hž·H—·H·H‰·H‚·H{·Ht·Hm·Hf·H_·HX·HQ·HJ·HC·H<·H5·H.·H'·H ·H·H·H ·H·Hý¶Hö¶Hï¶Hè¶Há¶HÚ¶HÓ¶H̶HŶH¾¶H·¶H°¶H©¶H¢¶H›¶H”¶H¶H†¶H¶Hx¶Hq¶Hj¶Hc¶H\¶HU¶HN¶HG¶H@¶H9¶H2¶H+¶H$¶H¶H¶H¶H¶H¶HúµHóµHìµHåµHÞµH×µHеHɵHµH»µH´µH­µH¦µHŸµH˜µH‘µHеHƒµH|µHuµHnµHgµH`µHYµHRµHKµHDµH=µH6µH/µH(µH!µHµHµH µHµHþ´H÷´Hð´Hé´Hâ´HÛ´HÔ´HÍ´HÆ´H¿´H¸´H±´Hª´H£´Hœ´H•´HŽ´H‡´H€´Hy´Hr´Hk´Hd´H]´HV´HO´HH´HA´H:´H3´H,´H%´H´H´H´H ´H´Hû³Hô³Hí³Hæ³Hß³HسHѳHʳHóH¼³Hµ³H®³H§³H ³H™³H’³H‹³H„³H}³Hv³Ho³Hh³Ha³HZ³HS³HL³HE³H>³H7³H0³H)³H"³H³H³H ³H³Hÿ²Hø²Hñ²Hê²Hã²HܲHÕ²HβHDzHÀ²H¹²H²²H«²H¤²H²H–²H²Hˆ²H²Hz²Hs²Hl²He²H^²HW²HP²HI²HB²H;²H4²H-²H&²H²H²H²H ²H²Hü±Hõ±Hî±Hç±Hà±HÙ±HÒ±H˱HıH½±H¶±H¯±H¨±H¡±Hš±H“±HŒ±H…±H~±Hw±Hp±Hi±Hb±H[±HT±HM±HF±H?±H8±H1±H*±H#±H±H±H±H±H±Hù°Hò°Hë°Hä°HݰHÖ°HϰHȰHÁ°Hº°H³°H¬°H¥°Hž°H—°H°H‰°H‚°H{°Ht°Hm°Hf°H_°HX°HQ°HJ°HC°H<°H5°H.°H'°H °H°H°H °H°Hý¯Hö¯Hï¯Hè¯Há¯HÚ¯HÓ¯H̯HůH¾¯H·¯H°¯H©¯H¢¯H›¯H”¯H¯H†¯H¯Hx¯Hq¯Hj¯Hc¯H\¯HU¯HN¯HG¯H@¯H9¯H2¯H+¯H$¯H¯H¯H¯H¯H¯Hú®Hó®Hì®Hå®HÞ®H×®HЮHÉ®H®H»®H´®H­®H¦®HŸ®H˜®H‘®HŠ®Hƒ®H|®Hu®Hn®Hg®H`®HY®HR®HK®HD®H=®H6®H/®H(®H!®H®H®H ®H®Hþ­H÷­Hð­Hé­Hâ­HÛ­HÔ­HÍ­HÆ­H¿­H¸­H±­Hª­H£­Hœ­H•­HŽ­H‡­H€­Hy­Hr­Hk­Hd­H]­HV­HO­HH­HA­H:­H3­H,­H%­H­H­H­H ­H­Hû¬Hô¬Hí¬Hæ¬H߬HجHѬHʬHìH¼¬Hµ¬H®¬H§¬H ¬H™¬H’¬H‹¬H„¬H}¬Hv¬Ho¬Hh¬Ha¬HZ¬HS¬HL¬HE¬H>¬H7¬H0¬H)¬H"¬H¬H¬H ¬H¬Hÿ«Hø«Hñ«Hê«Hã«HÜ«HÕ«HΫHÇ«HÀ«H¹«H²«H««H¤«H«H–«H«Hˆ«H«Hz«Hs«Hl«He«H^«HW«HP«HI«HB«H;«H4«H-«H&«H«H«H«H «H«HüªHõªHîªHçªHàªHÙªHÒªH˪HĪH½ªH¶ªH¯ªH¨ªH¡ªHšªH“ªHŒªH…ªH~ªHwªHpªHiªHbªH[ªHTªHMªHFªH?ªH8ªH1ªH*ªH#ªHªHªHªHªHªHù©Hò©Hë©Hä©HÝ©HÖ©HÏ©HÈ©HÁ©Hº©H³©H¬©H¥©Hž©H—©H©H‰©H‚©H{©Ht©Hm©Hf©H_©HX©HQ©HJ©HC©H<©H5©H.©H'©H ©H©H©H ©H©Hý¨Hö¨Hï¨Hè¨Há¨HÚ¨HÓ¨H̨HŨH¾¨H·¨H°¨H©¨H¢¨H›¨H”¨H¨H†¨H¨Hx¨Hq¨Hj¨Hc¨H\¨HU¨HN¨HG¨H@¨H9¨H2¨H+¨H$¨H¨H¨H¨H¨H¨Hú§Hó§Hì§Hå§HÞ§H×§HЧHɧH§H»§H´§H­§H¦§HŸ§H˜§H‘§HЧHƒ§H|§Hu§Hn§Hg§H`§HY§HR§HK§HD§H=§H6§H/§H(§H!§H§H§H §H§Hþ¦H÷¦Hð¦Hé¦Hâ¦HÛ¦HÔ¦HͦHƦH¿¦H¸¦H±¦Hª¦H£¦Hœ¦H•¦HަH‡¦H€¦Hy¦Hr¦Hk¦Hd¦H]¦HV¦HO¦HH¦HA¦H:¦H3¦H,¦H%¦H¦H¦H¦H ¦H¦Hû¥Hô¥Hí¥Hæ¥HߥHØ¥HÑ¥HÊ¥HÃ¥H¼¥Hµ¥H®¥H§¥H ¥H™¥H’¥H‹¥H„¥H}¥Hv¥Ho¥Hh¥Ha¥HZ¥HS¥HL¥HE¥H>¥H7¥H0¥H)¥H"¥H¥H¥H ¥H¥Hÿ¤Hø¤Hñ¤Hê¤Hã¤HܤHÕ¤HΤHǤHÀ¤H¹¤H²¤H«¤H¤¤H¤H–¤H¤Hˆ¤H¤Hz¤Hs¤Hl¤He¤H^¤HW¤HP¤HI¤HB¤H;¤H4¤H-¤H&¤H¤H¤H¤H ¤H¤Hü£Hõ£Hî£Hç£Hà£HÙ£HÒ£HË£HÄ£H½£H¶£H¯£H¨£H¡£Hš£H“£HŒ£H…£H~£Hw£Hp£Hi£Hb£H[£HT£HM£HF£H?£H8£H1£H*£H#£H£H£H£H£H£Hù¢Hò¢Hë¢Hä¢HÝ¢HÖ¢HÏ¢HÈ¢HÁ¢Hº¢H³¢H¬¢H¥¢Hž¢H—¢H¢H‰¢H‚¢H{¢Ht¢Hm¢Hf¢H_¢HX¢HQ¢HJ¢HC¢H<¢H5¢H.¢H'¢H ¢H¢H¢H ¢H¢Hý¡Hö¡Hï¡Hè¡Há¡HÚ¡HÓ¡HÌ¡HÅ¡H¾¡H·¡H°¡H©¡H¢¡H›¡H”¡H¡H†¡H¡Hx¡Hq¡Hj¡Hc¡H\¡HU¡HN¡HG¡H@¡H9¡H2¡H+¡H$¡H¡H¡H¡H¡H¡Hú Hó Hì Hå HÞ H× HРHÉ H H» H´ H­ H¦ HŸ H˜ H‘ HŠ Hƒ H| Hu Hn Hg H` HY HR HK HD H= H6 H/ H( H! H H H  H HþŸH÷ŸHðŸHéŸHâŸHÛŸHÔŸHÍŸHÆŸH¿ŸH¸ŸH±ŸHªŸH£ŸHœŸH•ŸHŽŸH‡ŸH€ŸHyŸHrŸHkŸHdŸH]ŸHVŸHOŸHHŸHAŸH:ŸH3ŸH,ŸH%ŸHŸHŸHŸH ŸHŸHûžHôžHížHæžHßžHØžHÑžHÊžHÞH¼žHµžH®žH§žH žH™žH’žH‹žH„žH}žHvžHožHhžHažHZžHSžHLžHEžH>žH7žH0žH)žH"žHžHžH žHžHÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüœHõœHîœHçœHàœHÙœHÒœHËœHÄœH½œH¶œH¯œH¨œH¡œHšœH“œHŒœH…œH~œHwœHpœHiœHbœH[œHTœHMœHFœH?œH8œH1œH*œH#œHœHœHœHœHœHù›Hò›Hë›Hä›HÝ›HÖ›HÏ›HÈ›HÁ›Hº›H³›H¬›H¥›Hž›H—›H›H‰›H‚›H{›Ht›Hm›Hf›H_›HX›HQ›HJ›HC›H<›H5›H.›H'›H ›H›H›H ›H›HýšHöšHïšHèšHášHÚšHÓšHÌšHÅšH¾šH·šH°šH©šH¢šH›šH”šHšH†šHšHxšHqšHjšHcšH\šHUšHNšHGšH@šH9šH2šH+šH$šHšHšHšHšHšHú™Hó™Hì™Hå™HÞ™H×™HЙHÉ™H™H»™H´™H­™H¦™HŸ™H˜™H‘™HŠ™Hƒ™H|™Hu™Hn™Hg™H`™HY™HR™HK™HD™H=™H6™H/™H(™H!™H™H™H ™H™Hþ˜H÷˜Hð˜Hé˜Hâ˜HÛ˜HÔ˜H͘HƘH¿˜H¸˜H±˜Hª˜H£˜Hœ˜H•˜HŽ˜H‡˜H€˜Hy˜Hr˜Hk˜Hd˜H]˜HV˜HO˜HH˜HA˜H:˜H3˜H,˜H%˜H˜H˜H˜H ˜H˜Hû—Hô—Hí—Hæ—Hß—HØ—HÑ—HÊ—H×H¼—Hµ—H®—H§—H —H™—H’—H‹—H„—H}—Hv—Ho—Hh—Ha—HZ—HS—HL—HE—H>—H7—H0—H)—H"—H—H—H —H—Hÿ–Hø–Hñ–Hê–Hã–HÜ–HÕ–HΖHÇ–HÀ–H¹–H²–H«–H¤–H–H––H–Hˆ–H–Hz–Hs–Hl–He–H^–HW–HP–HI–HB–H;–H4–H-–H&–H–H–H–H –H–Hü•Hõ•Hî•Hç•Hà•HÙ•HÒ•HË•HÄ•H½•H¶•H¯•H¨•H¡•Hš•H“•HŒ•H…•H~•Hw•Hp•Hi•Hb•H[•HT•HM•HF•H?•H8•H1•H*•H#•H•H•H•H•H•Hù”Hò”Hë”Hä”HÝ”HÖ”HÏ”HÈ”HÁ”Hº”H³”H¬”H¥”Hž”H—”H”H‰”H‚”H{”Ht”Hm”Hf”H_”HX”HQ”HJ”HC”H<”H5”H.”H'”H ”H”H”H ”H”Hý“Hö“Hï“Hè“Há“HÚ“HÓ“HÌ“HÅ“H¾“H·“H°“H©“H¢“H›“H”“H“H†“H“Hx“Hq“Hj“Hc“H\“HU“HN“HG“H@“H9“H2“H+“H$“H“H“H“H“H“Hú’Hó’Hì’Hå’HÞ’H×’HÐ’HÉ’HÂ’H»’H´’H­’H¦’HŸ’H˜’H‘’HŠ’Hƒ’H|’Hu’Hn’Hg’H`’HY’HR’HK’HD’H=’H6’H/’H(’H!’H’H’H ’H’Hþ‘H÷‘Hð‘Hé‘Hâ‘HÛ‘HÔ‘HÍ‘HÆ‘H¿‘H¸‘H±‘Hª‘H£‘Hœ‘H•‘HŽ‘H‡‘H€‘Hy‘Hr‘Hk‘Hd‘H]‘HV‘HO‘HH‘HA‘H:‘H3‘H,‘H%‘H‘H‘H‘H ‘H‘HûHôHíHæHßHØHÑHÊHÃH¼HµH®H§H H™H’H‹H„H}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüŽHõŽHîŽHçŽHàŽHÙŽHÒŽHËŽHÄŽH½ŽH¶ŽH¯ŽH¨ŽH¡ŽHšŽH“ŽHŒŽH…ŽH~ŽHwŽHpŽHiŽHbŽH[ŽHTŽHMŽHFŽH?ŽH8ŽH1ŽH*ŽH#ŽHŽHŽHŽHŽHŽHùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH‰H7‰H0‰H)‰H"‰H‰H‰H ‰H‰HÿˆHøˆHñˆHêˆHãˆH܈HÕˆHΈHLjHÀˆH¹ˆH²ˆH«ˆH¤ˆHˆH–ˆHˆHˆˆHˆHzˆHsˆHlˆHeˆH^ˆHWˆHPˆHIˆHBˆH;ˆH4ˆH-ˆH&ˆHˆHˆHˆH ˆHˆHü‡Hõ‡Hî‡Hç‡Hà‡HÙ‡HÒ‡HˇHćH½‡H¶‡H¯‡H¨‡H¡‡Hš‡H“‡HŒ‡H…‡H~‡Hw‡Hp‡Hi‡Hb‡H[‡HT‡HM‡HF‡H?‡H8‡H1‡H*‡H#‡H‡H‡H‡H‡H‡Hù†Hò†Hë†Hä†H݆HÖ†HφHȆHÁ†Hº†H³†H¬†H¥†Hž†H—†H†H‰†H‚†H{†Ht†Hm†Hf†H_†HX†HQ†HJ†HC†H<†H5†H.†H'†H †H†H†H †H†Hý…Hö…Hï…Hè…Há…HÚ…HÓ…HÌ…HÅ…H¾…H·…H°…H©…H¢…H›…H”…H…H†…H…Hx…Hq…Hj…Hc…H\…HU…HN…HG…H@…H9…H2…H+…H$…H…H…H…H…H…Hú„Hó„Hì„Hå„HÞ„HׄHЄHÉ„H„H»„H´„H­„H¦„HŸ„H˜„H‘„HŠ„Hƒ„H|„Hu„Hn„Hg„H`„HY„HR„HK„HD„H=„H6„H/„H(„H!„H„H„H „H„HþƒH÷ƒHðƒHéƒHâƒHÛƒHÔƒH̓HƃH¿ƒH¸ƒH±ƒHªƒH£ƒHœƒH•ƒHŽƒH‡ƒH€ƒHyƒHrƒHkƒHdƒH]ƒHVƒHOƒHHƒHAƒH:ƒH3ƒH,ƒH%ƒHƒHƒHƒH ƒHƒHû‚Hô‚Hí‚Hæ‚Hß‚HØ‚HÑ‚HÊ‚HÂH¼‚Hµ‚H®‚H§‚H ‚H™‚H’‚H‹‚H„‚H}‚Hv‚Ho‚Hh‚Ha‚HZ‚HS‚HL‚HE‚H>‚H7‚H0‚H)‚H"‚H‚H‚H ‚H‚HÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHü€Hõ€Hî€Hç€Hà€HÙ€HÒ€HË€HÄ€H½€H¶€H¯€H¨€H¡€Hš€H“€HŒ€H…€H~€Hw€Hp€Hi€Hb€H[€HT€HM€HF€H?€H8€H1€H*€H#€H€H€H€H€H€HùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHý~Hö~Hï~Hè~Há~HÚ~HÓ~HÌ~HÅ~H¾~H·~H°~H©~H¢~H›~H”~H~H†~H~Hx~Hq~Hj~Hc~H\~HU~HN~HG~H@~H9~H2~H+~H$~H~H~H~H~H~Hú}Hó}Hì}Hå}HÞ}H×}HÐ}HÉ}HÂ}H»}H´}H­}H¦}HŸ}H˜}H‘}HŠ}Hƒ}H|}Hu}Hn}Hg}H`}HY}HR}HK}HD}H=}H6}H/}H(}H!}H}H}H }H}Hþ|H÷|Hð|Hé|Hâ|HÛ|HÔ|HÍ|HÆ|H¿|H¸|H±|Hª|H£|Hœ|H•|HŽ|H‡|H€|Hy|Hr|Hk|Hd|H]|HV|HO|HH|HA|H:|H3|H,|H%|H|H|H|H |H|Hû{Hô{Hí{Hæ{Hß{HØ{HÑ{HÊ{HÃ{H¼{Hµ{H®{H§{H {H™{H’{H‹{H„{H}{Hv{Ho{Hh{Ha{HZ{HS{HL{HE{H>{H7{H0{H){H"{H{H{H {H{HÿzHøzHñzHêzHãzHÜzHÕzHÎzHÇzHÀzH¹zH²zH«zH¤zHzH–zHzHˆzHzHzzHszHlzHezH^zHWzHPzHIzHBzH;zH4zH-zH&zHzHzHzH zHzHüyHõyHîyHçyHàyHÙyHÒyHËyHÄyH½yH¶yH¯yH¨yH¡yHšyH“yHŒyH…yH~yHwyHpyHiyHbyH[yHTyHMyHFyH?yH8yH1yH*yH#yHyHyHyHyHyHùxHòxHëxHäxHÝxHÖxHÏxHÈxHÁxHºxH³xH¬xH¥xHžxH—xHxH‰xH‚xH{xHtxHmxHfxH_xHXxHQxHJxHCxHtH7tH0tH)tH"tHtHtH tHtHÿsHøsHñsHêsHãsHÜsHÕsHÎsHÇsHÀsH¹sH²sH«sH¤sHsH–sHsHˆsHsHzsHssHlsHesH^sHWsHPsHIsHBsH;sH4sH-sH&sHsHsHsH sHsHürHõrHîrHçrHàrHÙrHÒrHËrHÄrH½rH¶rH¯rH¨rH¡rHšrH“rHŒrH…rH~rHwrHprHirHbrH[rHTrHMrHFrH?rH8rH1rH*rH#rHrHrHrHrHrHùqHòqHëqHäqHÝqHÖqHÏqHÈqHÁqHºqH³qH¬qH¥qHžqH—qHqH‰qH‚qH{qHtqHmqHfqH_qHXqHQqHJqHCqHmH7mH0mH)mH"mHmHmH mHmHÿlHølHñlHêlHãlHÜlHÕlHÎlHÇlHÀlH¹lH²lH«lH¤lHlH–lHlHˆlHlHzlHslHllHelH^lHWlHPlHIlHBlH;lH4lH-lH&lHlHlHlH lHlHükHõkHîkHçkHàkHÙkHÒkHËkHÄkH½kH¶kH¯kH¨kH¡kHškH“kHŒkH…kH~kHwkHpkHikHbkH[kHTkHMkHFkH?kH8kH1kH*kH#kHkHkHkHkHkHùjHòjHëjHäjHÝjHÖjHÏjHÈjHÁjHºjH³jH¬jH¥jHžjH—jHjH‰jH‚jH{jHtjHmjHfjH_jHXjHQjHJjHCjHfH7fH0fH)fH"fHfHfH fHfHÿeHøeHñeHêeHãeHÜeHÕeHÎeHÇeHÀeH¹eH²eH«eH¤eHeH–eHeHˆeHeHzeHseHleHeeH^eHWeHPeHIeHBeH;eH4eH-eH&eHeHeHeH eHeHüdHõdHîdHçdHàdHÙdHÒdHËdHÄdH½dH¶dH¯dH¨dH¡dHšdH“dHŒdH…dH~dHwdHpdHidHbdH[dHTdHMdHFdH?dH8dH1dH*dH#dHdHdHdHdHdHùcHòcHëcHäcHÝcHÖcHÏcHÈcHÁcHºcH³cH¬cH¥cHžcH—cHcH‰cH‚cH{cHtcHmcHfcH_cHXcHQcHJcHCcH_H7_H0_H)_H"_H_H_H _H_Hÿ^Hø^Hñ^Hê^Hã^HÜ^HÕ^HÎ^HÇ^HÀ^H¹^H²^H«^H¤^H^H–^H^Hˆ^H^Hz^Hs^Hl^He^H^^HW^HP^HI^HB^H;^H4^H-^H&^H^H^H^H ^H^Hü]Hõ]Hî]Hç]Hà]HÙ]HÒ]HË]HÄ]H½]H¶]H¯]H¨]H¡]Hš]H“]HŒ]H…]H~]Hw]Hp]Hi]Hb]H[]HT]HM]HF]H?]H8]H1]H*]H#]H]H]H]H]H]Hù\Hò\Hë\Hä\HÝ\HÖ\HÏ\HÈ\HÁ\Hº\H³\H¬\H¥\Hž\H—\H\H‰\H‚\H{\Ht\Hm\Hf\H_\HX\HQ\HJ\HC\H<\H5\H.\H'\H \H\H\H \H\Hý[Hö[Hï[Hè[Há[HÚ[HÓ[HÌ[HÅ[H¾[H·[H°[H©[H¢[H›[H”[H[H†[H[Hx[Hq[Hj[Hc[H\[HU[HN[HG[H@[H9[H2[H+[H$[H[H[H[H[H[HúZHóZHìZHåZHÞZH×ZHÐZHÉZHÂZH»ZH´ZH­ZH¦ZHŸZH˜ZH‘ZHŠZHƒZH|ZHuZHnZHgZH`ZHYZHRZHKZHDZH=ZH6ZH/ZH(ZH!ZHZHZH ZHZHþYH÷YHðYHéYHâYHÛYHÔYHÍYHÆYH¿YH¸YH±YHªYH£YHœYH•YHŽYH‡YH€YHyYHrYHkYHdYH]YHVYHOYHHYHAYH:YH3YH,YH%YHYHYHYH YHYHûXHôXHíXHæXHßXHØXHÑXHÊXHÃXH¼XHµXH®XH§XH XH™XH’XH‹XH„XH}XHvXHoXHhXHaXHZXHSXHLXHEXH>XH7XH0XH)XH"XHXHXH XHXHÿWHøWHñWHêWHãWHÜWHÕWHÎWHÇWHÀWH¹WH²WH«WH¤WHWH–WHWHˆWHWHzWHsWHlWHeWH^WHWWHPWHIWHBWH;WH4WH-WH&WHWHWHWH WHWHüVHõVHîVHçVHàVHÙVHÒVHËVHÄVH½VH¶VH¯VH¨VH¡VHšVH“VHŒVH…VH~VHwVHpVHiVHbVH[VHTVHMVHFVH?VH8VH1VH*VH#VHVHVHVHVHVHùUHòUHëUHäUHÝUHÖUHÏUHÈUHÁUHºUH³UH¬UH¥UHžUH—UHUH‰UH‚UH{UHtUHmUHfUH_UHXUHQUHJUHCUHQH7QH0QH)QH"QHQHQH QHQHÿPHøPHñPHêPHãPHÜPHÕPHÎPHÇPHÀPH¹PH²PH«PH¤PHPH–PHPHˆPHPHzPHsPHlPHePH^PHWPHPPHIPHBPH;PH4PH-PH&PHPHPHPH PHPHüOHõOHîOHçOHàOHÙOHÒOHËOHÄOH½OH¶OH¯OH¨OH¡OHšOH“OHŒOH…OH~OHwOHpOHiOHbOH[OHTOHMOHFOH?OH8OH1OH*OH#OHOHOHOHOHOHùNHòNHëNHäNHÝNHÖNHÏNHÈNHÁNHºNH³NH¬NH¥NHžNH—NHNH‰NH‚NH{NHtNHmNHfNH_NHXNHQNHJNHCNHJH7JH0JH)JH"JHJHJH JHJHÿIHøIHñIHêIHãIHÜIHÕIHÎIHÇIHÀIH¹IH²IH«IH¤IHIH–IHIHˆIHIHzIHsIHlIHeIH^IHWIHPIHIIHBIH;IH4IH-IH&IHIHIHIH IHIHüHHõHHîHHçHHàHHÙHHÒHHËHHÄHH½HH¶HH¯HH¨HH¡HHšHH“HHŒHH…HH~HHwHHpHHiHHbHH[HHTHHMHHFHH?HH8HH1HH*HH#HHHHHHHHHHHHùGHòGHëGHäGHÝGHÖGHÏGHÈGHÁGHºGH³GH¬GH¥GHžGH—GHGH‰GH‚GH{GHtGHmGHfGH_GHXGHQGHJGHCGHCH7CH0CH)CH"CHCHCH CHCHÿBHøBHñBHêBHãBHÜBHÕBHÎBHÇBHÀBH¹BH²BH«BH¤BHBH–BHBHˆBHBHzBHsBHlBHeBH^BHWBHPBHIBHBBH;BH4BH-BH&BHBHBHBH BHBHüAHõAHîAHçAHàAHÙAHÒAHËAHÄAH½AH¶AH¯AH¨AH¡AHšAH“AHŒAH…AH~AHwAHpAHiAHbAH[AHTAHMAHFAH?AH8AH1AH*AH#AHAHAHAHAHAHù@Hò@Hë@Hä@HÝ@HÖ@HÏ@HÈ@HÁ@Hº@H³@H¬@H¥@Hž@H—@H@H‰@H‚@H{@Ht@Hm@Hf@H_@HX@HQ@HJ@HC@H<@H5@H.@H'@H @H@H@H @H@Hý?Hö?Hï?Hè?Há?HÚ?HÓ?HÌ?HÅ?H¾?H·?H°?H©?H¢?H›?H”?H?H†?H?Hx?Hq?Hj?Hc?H\?HU?HN?HG?H@?H9?H2?H+?H$?H?H?H?H?H?Hú>Hó>Hì>Hå>HÞ>H×>HÐ>HÉ>HÂ>H»>H´>H­>H¦>HŸ>H˜>H‘>HŠ>Hƒ>H|>Hu>Hn>Hg>H`>HY>HR>HK>HD>H=>H6>H/>H(>H!>H>H>H >H>Hþ=H÷=Hð=Hé=Hâ=HÛ=HÔ=HÍ=HÆ=H¿=H¸=H±=Hª=H£=Hœ=H•=HŽ=H‡=H€=Hy=Hr=Hk=Hd=H]=HV=HO=HH=HA=H:=H3=H,=H%=H=H=H=H =H=Hû5H75H05H)5H"5H5H5H 5H5Hÿ4Hø4Hñ4Hê4Hã4HÜ4HÕ4HÎ4HÇ4HÀ4H¹4H²4H«4H¤4H4H–4H4Hˆ4H4Hz4Hs4Hl4He4H^4HW4HP4HI4HB4H;4H44H-4H&4H4H4H4H 4H4Hü3Hõ3Hî3Hç3Hà3HÙ3HÒ3HË3HÄ3H½3H¶3H¯3H¨3H¡3Hš3H“3HŒ3H…3H~3Hw3Hp3Hi3Hb3H[3HT3HM3HF3H?3H83H13H*3H#3H3H3H3H3H3Hù2Hò2Hë2Hä2HÝ2HÖ2HÏ2HÈ2HÁ2Hº2H³2H¬2H¥2Hž2H—2H2H‰2H‚2H{2Ht2Hm2Hf2H_2HX2HQ2HJ2HC2H<2H52H.2H'2H 2H2H2H 2H2Hý1Hö1Hï1Hè1Há1HÚ1HÓ1HÌ1HÅ1H¾1H·1H°1H©1H¢1H›1H”1H1H†1H1Hx1Hq1Hj1Hc1H\1HU1HN1HG1H@1H91H21H+1H$1H1H1H1H1H1Hú0Hó0Hì0Hå0HÞ0H×0HÐ0HÉ0HÂ0H»0H´0H­0H¦0HŸ0H˜0H‘0HŠ0Hƒ0H|0Hu0Hn0Hg0H`0HY0HR0HK0HD0H=0H60H/0H(0H!0H0H0H 0H0Hþ/H÷/Hð/Hé/Hâ/HÛ/HÔ/HÍ/HÆ/H¿/H¸/H±/Hª/H£/Hœ/H•/HŽ/H‡/H€/Hy/Hr/Hk/Hd/H]/HV/HO/HH/HA/H:/H3/H,/H%/H/H/H/H /H/Hû.Hô.Hí.Hæ.Hß.HØ.HÑ.HÊ.HÃ.H¼.Hµ.H®.H§.H .H™.H’.H‹.H„.H}.Hv.Ho.Hh.Ha.HZ.HS.HL.HE.H>.H7.H0.H).H".H.H.H .H.Hÿ-Hø-Hñ-Hê-Hã-HÜ-HÕ-HÎ-HÇ-HÀ-H¹-H²-H«-H¤-H-H–-H-Hˆ-H-Hz-Hs-Hl-He-H^-HW-HP-HI-HB-H;-H4-H--H&-H-H-H-H -H-Hü,Hõ,Hî,Hç,Hà,HÙ,HÒ,HË,HÄ,H½,H¶,H¯,H¨,H¡,Hš,H“,HŒ,H…,H~,Hw,Hp,Hi,Hb,H[,HT,HM,HF,H?,H8,H1,H*,H#,H,H,H,H,H,Hù+Hò+Hë+Hä+HÝ+HÖ+HÏ+HÈ+HÁ+Hº+H³+H¬+H¥+Hž+H—+H+H‰+H‚+H{+Ht+Hm+Hf+H_+HX+HQ+HJ+HC+H<+H5+H.+H'+H +H+H+H +H+Hý*Hö*Hï*Hè*Há*HÚ*HÓ*HÌ*HÅ*H¾*H·*H°*H©*H¢*H›*H”*H*H†*H*Hx*Hq*Hj*Hc*H\*HU*HN*HG*H@*H9*H2*H+*H$*H*H*H*H*H*Hú)Hó)Hì)Hå)HÞ)H×)HÐ)HÉ)HÂ)H»)H´)H­)H¦)HŸ)H˜)H‘)HŠ)Hƒ)H|)Hu)Hn)Hg)H`)HY)HR)HK)HD)H=)H6)H/)H()H!)H)H)H )H)Hþ(H÷(Hð(Hé(Hâ(HÛ(HÔ(HÍ(HÆ(H¿(H¸(H±(Hª(H£(Hœ(H•(HŽ(H‡(H€(Hy(Hr(Hk(Hd(H](HV(HO(HH(HA(H:(H3(H,(H%(H(H(H(H (H(Hû'Hô'Hí'Hæ'Hß'HØ'HÑ'HÊ'HÃ'H¼'Hµ'H®'H§'H 'H™'H’'H‹'H„'H}'Hv'Ho'Hh'Ha'HZ'HS'HL'HE'H>'H7'H0'H)'H"'H'H'H 'H'Hÿ&Hø&Hñ&Hê&Hã&HÜ&HÕ&HÎ&HÇ&HÀ&H¹&H²&H«&H¤&H&H–&H&Hˆ&H&Hz&Hs&Hl&He&H^&HW&HP&HI&HB&H;&H4&H-&H&&H&H&H&H &H&Hü%Hõ%Hî%Hç%Hà%HÙ%HÒ%HË%HÄ%H½%H¶%H¯%H¨%H¡%Hš%H“%HŒ%H…%H~%Hw%Hp%Hi%Hb%H[%HT%HM%HF%H?%H8%H1%H*%H#%H%H%H%H%H%Hù$Hò$Hë$Hä$HÝ$HÖ$HÏ$HÈ$HÁ$Hº$H³$H¬$H¥$Hž$H—$H$H‰$H‚$H{$Ht$Hm$Hf$H_$HX$HQ$HJ$HC$H<$H5$H.$H'$H $H$H$H $H$Hý#Hö#Hï#Hè#Há#HÚ#HÓ#HÌ#HÅ#H¾#H·#H°#H©#H¢#H›#H”#H#H†#H#Hx#Hq#Hj#Hc#H\#HU#HN#HG#H@#H9#H2#H+#H$#H#H#H#H#H#Hú"Hó"Hì"Hå"HÞ"H×"HÐ"HÉ"HÂ"H»"H´"H­"H¦"HŸ"H˜"H‘"HŠ"Hƒ"H|"Hu"Hn"Hg"H`"HY"HR"HK"HD"H="H6"H/"H("H!"H"H"H "H"Hþ!H÷!Hð!Hé!Hâ!HÛ!HÔ!HÍ!HÆ!H¿!H¸!H±!Hª!H£!Hœ!H•!HŽ!H‡!H€!Hy!Hr!Hk!Hd!H]!HV!HO!HH!HA!H:!H3!H,!H%!H!H!H!H !H!Hû Hô Hí Hæ Hß HØ HÑ HÊ Hà H¼ Hµ H® H§ H  H™ H’ H‹ H„ H} Hv Ho Hh Ha HZ HS HL HE H> H7 H0 H) H" H H H H HÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHýHöHïHèHáHÚHÓHÌHÅH¾H·H°H©H¢H›H”HH†HHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHúHóHìHåHÞH×HÐHÉHÂH»H´H­H¦HŸH˜H‘HŠHƒH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHþH÷HðHéHâHÛHÔHÍHÆH¿H¸H±HªH£HœH•HŽH‡H€HyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHûHôHíHæHßHØHÑHÊHÃH¼HµH®H§H H™H’H‹H„H}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHýHöHïHèHáHÚHÓHÌHÅH¾H·H°H©H¢H›H”HH†HHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHúHóHìHåHÞH×HÐHÉHÂH»H´H­H¦HŸH˜H‘HŠHƒH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHþH÷HðHéHâHÛHÔHÍHÆH¿H¸H±HªH£HœH•HŽH‡H€HyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHûHôHíHæHßHØHÑHÊHÃH¼HµH®H§H H™H’H‹H„H}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHýHöHïHèHáHÚHÓHÌHÅH¾H·H°H©H¢H›H”HH†HHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHú Hó Hì Hå HÞ H× HÐ HÉ H H» H´ H­ H¦ HŸ H˜ H‘ HŠ Hƒ H| Hu Hn Hg H` HY HR HK HD H= H6 H/ H( H! H H H H Hþ H÷ Hð Hé Hâ HÛ HÔ HÍ HÆ H¿ H¸ H± Hª H£ Hœ H• HŽ H‡ H€ Hy Hr Hk Hd H] HV HO HH HA H: H3 H, H% H H H H H Hû Hô Hí Hæ Hß HØ HÑ HÊ Hà H¼ Hµ H® H§ H  H™ H’ H‹ H„ H} Hv Ho Hh Ha HZ HS HL HE H> H7 H0 H) H" H H H H Hÿ Hø Hñ Hê Hã HÜ HÕ HÎ HÇ HÀ H¹ H² H« H¤ H H– H Hˆ H Hz Hs Hl He H^ HW HP HI HB H; H4 H- H& H H H H H Hü Hõ Hî Hç Hà HÙ HÒ HË HÄ H½ H¶ H¯ H¨ H¡ Hš H“ HŒ H… H~ Hw Hp Hi Hb H[ HT HM HF H? H8 H1 H* H# H H H H H HùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHýHöHïHèHáHÚHÓHÌHÅH¾H·H°H©H¢H›H”HH†HHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHúHóHìHåHÞH×HÐHÉHÂH»H´H­H¦HŸH˜H‘HŠHƒH|HuHnHgH`HYHRHKHDH=H6H/H(H!HHH HHþH÷HðHéHâHÛHÔHÍHÆH¿H¸H±HªH£HœH•HŽH‡H€HyHrHkHdH]HVHOHHHAH:H3H,H%HHHH HHûHôHíHæHßHØHÑHÊHÃH¼HµH®H§H H™H’H‹H„H}HvHoHhHaHZHSHLHEH>H7H0H)H"HHH HHÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCH<H5H.H'H HHH HHýHöHïHèHáHÚHÓHÌHÅH¾H·H°H©H¢H›H”HH†HHxHqHjHcH\HUHNHGH@H9H2H+H$HHHHHHúÿGóÿGìÿGåÿGÞÿG×ÿGÐÿGÉÿGÂÿG»ÿG´ÿG­ÿG¦ÿGŸÿG˜ÿG‘ÿGŠÿGƒÿG|ÿGuÿGnÿGgÿG`ÿGYÿGRÿGKÿGDÿG=ÿG6ÿG/ÿG(ÿG!ÿGÿGÿG ÿGÿGþþG÷þGðþGéþGâþGÛþGÔþGÍþGÆþG¿þG¸þG±þGªþG£þGœþG•þGŽþG‡þG€þGyþGrþGkþGdþG]þGVþGOþGHþGAþG:þG3þG,þG%þGþGþGþG þGþGûýGôýGíýGæýGßýGØýGÑýGÊýGÃýG¼ýGµýG®ýG§ýG ýG™ýG’ýG‹ýG„ýG}ýGvýGoýGhýGaýGZýGSýGLýGEýG>ýG7ýG0ýG)ýG"ýGýGýG ýGýGÿüGøüGñüGêüGãüGÜüGÕüGÎüGÇüGÀüG¹üG²üG«üG¤üGüG–üGüGˆüGüGzüGsüGlüGeüG^üGWüGPüGIüGBüG;üG4üG-üG&üGüGüGüG üGüGüûGõûGîûGçûGàûGÙûGÒûGËûGÄûG½ûG¶ûG¯ûG¨ûG¡ûGšûG“ûGŒûG…ûG~ûGwûGpûGiûGbûG[ûGTûGMûGFûG?ûG8ûG1ûG*ûG#ûGûGûGûGûGûGùúGòúGëúGäúGÝúGÖúGÏúGÈúGÁúGºúG³úG¬úG¥úGžúG—úGúG‰úG‚úG{úGtúGmúGfúG_úGXúGQúGJúGCúG<úG5úG.úG'úG úGúGúG úGúGýùGöùGïùGèùGáùGÚùGÓùGÌùGÅùG¾ùG·ùG°ùG©ùG¢ùG›ùG”ùGùG†ùGùGxùGqùGjùGcùG\ùGUùGNùGGùG@ùG9ùG2ùG+ùG$ùGùGùGùGùGùGúøGóøGìøGåøGÞøG×øGÐøGÉøGÂøG»øG´øG­øG¦øGŸøG˜øG‘øGŠøGƒøG|øGuøGnøGgøG`øGYøGRøGKøGDøG=øG6øG/øG(øG!øGøGøG øGøGþ÷G÷÷Gð÷Gé÷Gâ÷GÛ÷GÔ÷GÍ÷GÆ÷G¿÷G¸÷G±÷Gª÷G£÷Gœ÷G•÷GŽ÷G‡÷G€÷Gy÷Gr÷Gk÷Gd÷G]÷GV÷GO÷GH÷GA÷G:÷G3÷G,÷G%÷G÷G÷G÷G ÷G÷GûöGôöGíöGæöGßöGØöGÑöGÊöGÃöG¼öGµöG®öG§öG öG™öG’öG‹öG„öG}öGvöGoöGhöGaöGZöGSöGLöGEöG>öG7öG0öG)öG"öGöGöG öGöGÿõGøõGñõGêõGãõGÜõGÕõGÎõGÇõGÀõG¹õG²õG«õG¤õGõG–õGõGˆõGõGzõGsõGlõGeõG^õGWõGPõGIõGBõG;õG4õG-õG&õGõGõGõG õGõGüôGõôGîôGçôGàôGÙôGÒôGËôGÄôG½ôG¶ôG¯ôG¨ôG¡ôGšôG“ôGŒôG…ôG~ôGwôGpôGiôGbôG[ôGTôGMôGFôG?ôG8ôG1ôG*ôG#ôGôGôGôGôGôGùóGòóGëóGäóGÝóGÖóGÏóGÈóGÁóGºóG³óG¬óG¥óGžóG—óGóG‰óG‚óG{óGtóGmóGfóG_óGXóGQóGJóGCóG<óG5óG.óG'óG óGóGóG óGóGýòGöòGïòGèòGáòGÚòGÓòGÌòGÅòG¾òG·òG°òG©òG¢òG›òG”òGòG†òGòGxòGqòGjòGcòG\òGUòGNòGGòG@òG9òG2òG+òG$òGòGòGòGòGòGúñGóñGìñGåñGÞñG×ñGÐñGÉñGÂñG»ñG´ñG­ñG¦ñGŸñG˜ñG‘ñGŠñGƒñG|ñGuñGnñGgñG`ñGYñGRñGKñGDñG=ñG6ñG/ñG(ñG!ñGñGñG ñGñGþðG÷ðGððGéðGâðGÛðGÔðGÍðGÆðG¿ðG¸ðG±ðGªðG£ðGœðG•ðGŽðG‡ðG€ðGyðGrðGkðGdðG]ðGVðGOðGHðGAðG:ðG3ðG,ðG%ðGðGðGðG ðGðGûïGôïGíïGæïGßïGØïGÑïGÊïGÃïG¼ïGµïG®ïG§ïG ïG™ïG’ïG‹ïG„ïG}ïGvïGoïGhïGaïGZïGSïGLïGEïG>ïG7ïG0ïG)ïG"ïGïGïG ïGïGÿîGøîGñîGêîGãîGÜîGÕîGÎîGÇîGÀîG¹îG²îG«îG¤îGîG–îGîGˆîGîGzîGsîGlîGeîG^îGWîGPîGIîGBîG;îG4îG-îG&îGîGîGîG îGîGüíGõíGîíGçíGàíGÙíGÒíGËíGÄíG½íG¶íG¯íG¨íG¡íGšíG“íGŒíG…íG~íGwíGpíGiíGbíG[íGTíGMíGFíG?íG8íG1íG*íG#íGíGíGíGíGíGùìGòìGëìGäìGÝìGÖìGÏìGÈìGÁìGºìG³ìG¬ìG¥ìGžìG—ìGìG‰ìG‚ìG{ìGtìGmìGfìG_ìGXìGQìGJìGCìG<ìG5ìG.ìG'ìG ìGìGìG ìGìGýëGöëGïëGèëGáëGÚëGÓëGÌëGÅëG¾ëG·ëG°ëG©ëG¢ëG›ëG”ëGëG†ëGëGxëGqëGjëGcëG\ëGUëGNëGGëG@ëG9ëG2ëG+ëG$ëGëGëGëGëGëGúêGóêGìêGåêGÞêG×êGÐêGÉêGÂêG»êG´êG­êG¦êGŸêG˜êG‘êGŠêGƒêG|êGuêGnêGgêG`êGYêGRêGKêGDêG=êG6êG/êG(êG!êGêGêG êGêGþéG÷éGðéGééGâéGÛéGÔéGÍéGÆéG¿éG¸éG±éGªéG£éGœéG•éGŽéG‡éG€éGyéGréGkéGdéG]éGVéGOéGHéGAéG:éG3éG,éG%éGéGéGéG éGéGûèGôèGíèGæèGßèGØèGÑèGÊèGÃèG¼èGµèG®èG§èG èG™èG’èG‹èG„èG}èGvèGoèGhèGaèGZèGSèGLèGEèG>èG7èG0èG)èG"èGèGèG èGèGÿçGøçGñçGêçGãçGÜçGÕçGÎçGÇçGÀçG¹çG²çG«çG¤çGçG–çGçGˆçGçGzçGsçGlçGeçG^çGWçGPçGIçGBçG;çG4çG-çG&çGçGçGçG çGçGüæGõæGîæGçæGàæGÙæGÒæGËæGÄæG½æG¶æG¯æG¨æG¡æGšæG“æGŒæG…æG~æGwæGpæGiæGbæG[æGTæGMæGFæG?æG8æG1æG*æG#æGæGæGæGæGæGùåGòåGëåGäåGÝåGÖåGÏåGÈåGÁåGºåG³åG¬åG¥åGžåG—åGåG‰åG‚åG{åGtåGmåGfåG_åGXåGQåGJåGCåG<åG5åG.åG'åG åGåGåG åGåGýäGöäGïäGèäGáäGÚäGÓäGÌäGÅäG¾äG·äG°äG©äG¢äG›äG”äGäG†äGäGxäGqäGjäGcäG\äGUäGNäGGäG@äG9äG2äG+äG$äGäGäGäGäGäGúãGóãGìãGåãGÞãG×ãGÐãGÉãGÂãG»ãG´ãG­ãG¦ãGŸãG˜ãG‘ãGŠãGƒãG|ãGuãGnãGgãG`ãGYãGRãGKãGDãG=ãG6ãG/ãG(ãG!ãGãGãG ãGãGþâG÷âGðâGéâGââGÛâGÔâGÍâGÆâG¿âG¸âG±âGªâG£âGœâG•âGŽâG‡âG€âGyâGrâGkâGdâG]âGVâGOâGHâGAâG:âG3âG,âG%âGâGâGâG âGâGûáGôáGíáGæáGßáGØáGÑáGÊáGÃáG¼áGµáG®áG§áG áG™áG’áG‹áG„áG}áGváGoáGháGaáGZáGSáGLáGEáG>áG7áG0áG)áG"áGáGáG áGáGÿàGøàGñàGêàGãàGÜàGÕàGÎàGÇàGÀàG¹àG²àG«àG¤àGàG–àGàGˆàGàGzàGsàGlàGeàG^àGWàGPàGIàGBàG;àG4àG-àG&àGàGàGàG àGàGüßGõßGîßGçßGàßGÙßGÒßGËßGÄßG½ßG¶ßG¯ßG¨ßG¡ßGšßG“ßGŒßG…ßG~ßGwßGpßGißGbßG[ßGTßGMßGFßG?ßG8ßG1ßG*ßG#ßGßGßGßGßGßGùÞGòÞGëÞGäÞGÝÞGÖÞGÏÞGÈÞGÁÞGºÞG³ÞG¬ÞG¥ÞGžÞG—ÞGÞG‰ÞG‚ÞG{ÞGtÞGmÞGfÞG_ÞGXÞGQÞGJÞGCÞG<ÞG5ÞG.ÞG'ÞG ÞGÞGÞG ÞGÞGýÝGöÝGïÝGèÝGáÝGÚÝGÓÝGÌÝGÅÝG¾ÝG·ÝG°ÝG©ÝG¢ÝG›ÝG”ÝGÝG†ÝGÝGxÝGqÝGjÝGcÝG\ÝGUÝGNÝGGÝG@ÝG9ÝG2ÝG+ÝG$ÝGÝGÝGÝGÝGÝGúÜGóÜGìÜGåÜGÞÜG×ÜGÐÜGÉÜGÂÜG»ÜG´ÜG­ÜG¦ÜGŸÜG˜ÜG‘ÜGŠÜGƒÜG|ÜGuÜGnÜGgÜG`ÜGYÜGRÜGKÜGDÜG=ÜG6ÜG/ÜG(ÜG!ÜGÜGÜG ÜGÜGþÛG÷ÛGðÛGéÛGâÛGÛÛGÔÛGÍÛGÆÛG¿ÛG¸ÛG±ÛGªÛG£ÛGœÛG•ÛGŽÛG‡ÛG€ÛGyÛGrÛGkÛGdÛG]ÛGVÛGOÛGHÛGAÛG:ÛG3ÛG,ÛG%ÛGÛGÛGÛG ÛGÛGûÚGôÚGíÚGæÚGßÚGØÚGÑÚGÊÚGÃÚG¼ÚGµÚG®ÚG§ÚG ÚG™ÚG’ÚG‹ÚG„ÚG}ÚGvÚGoÚGhÚGaÚGZÚGSÚGLÚGEÚG>ÚG7ÚG0ÚG)ÚG"ÚGÚGÚG ÚGÚGÿÙGøÙGñÙGêÙGãÙGÜÙGÕÙGÎÙGÇÙGÀÙG¹ÙG²ÙG«ÙG¤ÙGÙG–ÙGÙGˆÙGÙGzÙGsÙGlÙGeÙG^ÙGWÙGPÙGIÙGBÙG;ÙG4ÙG-ÙG&ÙGÙGÙGÙG ÙGÙGüØGõØGîØGçØGàØGÙØGÒØGËØGÄØG½ØG¶ØG¯ØG¨ØG¡ØGšØG“ØGŒØG…ØG~ØGwØGpØGiØGbØG[ØGTØGMØGFØG?ØG8ØG1ØG*ØG#ØGØGØGØGØGØGù×Gò×Gë×Gä×GÝ×GÖ×GÏ×GÈ×GÁ×Gº×G³×G¬×G¥×Gž×G—×G×G‰×G‚×G{×Gt×Gm×Gf×G_×GX×GQ×GJ×GC×G<×G5×G.×G'×G ×G×G×G ×G×GýÖGöÖGïÖGèÖGáÖGÚÖGÓÖGÌÖGÅÖG¾ÖG·ÖG°ÖG©ÖG¢ÖG›ÖG”ÖGÖG†ÖGÖGxÖGqÖGjÖGcÖG\ÖGUÖGNÖGGÖG@ÖG9ÖG2ÖG+ÖG$ÖGÖGÖGÖGÖGÖGúÕGóÕGìÕGåÕGÞÕG×ÕGÐÕGÉÕGÂÕG»ÕG´ÕG­ÕG¦ÕGŸÕG˜ÕG‘ÕGŠÕGƒÕG|ÕGuÕGnÕGgÕG`ÕGYÕGRÕGKÕGDÕG=ÕG6ÕG/ÕG(ÕG!ÕGÕGÕG ÕGÕGþÔG÷ÔGðÔGéÔGâÔGÛÔGÔÔGÍÔGÆÔG¿ÔG¸ÔG±ÔGªÔG£ÔGœÔG•ÔGŽÔG‡ÔG€ÔGyÔGrÔGkÔGdÔG]ÔGVÔGOÔGHÔGAÔG:ÔG3ÔG,ÔG%ÔGÔGÔGÔG ÔGÔGûÓGôÓGíÓGæÓGßÓGØÓGÑÓGÊÓGÃÓG¼ÓGµÓG®ÓG§ÓG ÓG™ÓG’ÓG‹ÓG„ÓG}ÓGvÓGoÓGhÓGaÓGZÓGSÓGLÓGEÓG>ÓG7ÓG0ÓG)ÓG"ÓGÓGÓG ÓGÓGÿÒGøÒGñÒGêÒGãÒGÜÒGÕÒGÎÒGÇÒGÀÒG¹ÒG²ÒG«ÒG¤ÒGÒG–ÒGÒGˆÒGÒGzÒGsÒGlÒGeÒG^ÒGWÒGPÒGIÒGBÒG;ÒG4ÒG-ÒG&ÒGÒGÒGÒG ÒGÒGüÑGõÑGîÑGçÑGàÑGÙÑGÒÑGËÑGÄÑG½ÑG¶ÑG¯ÑG¨ÑG¡ÑGšÑG“ÑGŒÑG…ÑG~ÑGwÑGpÑGiÑGbÑG[ÑGTÑGMÑGFÑG?ÑG8ÑG1ÑG*ÑG#ÑGÑGÑGÑGÑGÑGùÐGòÐGëÐGäÐGÝÐGÖÐGÏÐGÈÐGÁÐGºÐG³ÐG¬ÐG¥ÐGžÐG—ÐGÐG‰ÐG‚ÐG{ÐGtÐGmÐGfÐG_ÐGXÐGQÐGJÐGCÐG<ÐG5ÐG.ÐG'ÐG ÐGÐGÐG ÐGÐGýÏGöÏGïÏGèÏGáÏGÚÏGÓÏGÌÏGÅÏG¾ÏG·ÏG°ÏG©ÏG¢ÏG›ÏG”ÏGÏG†ÏGÏGxÏGqÏGjÏGcÏG\ÏGUÏGNÏGGÏG@ÏG9ÏG2ÏG+ÏG$ÏGÏGÏGÏGÏGÏGúÎGóÎGìÎGåÎGÞÎG×ÎGÐÎGÉÎGÂÎG»ÎG´ÎG­ÎG¦ÎGŸÎG˜ÎG‘ÎGŠÎGƒÎG|ÎGuÎGnÎGgÎG`ÎGYÎGRÎGKÎGDÎG=ÎG6ÎG/ÎG(ÎG!ÎGÎGÎG ÎGÎGþÍG÷ÍGðÍGéÍGâÍGÛÍGÔÍGÍÍGÆÍG¿ÍG¸ÍG±ÍGªÍG£ÍGœÍG•ÍGŽÍG‡ÍG€ÍGyÍGrÍGkÍGdÍG]ÍGVÍGOÍGHÍGAÍG:ÍG3ÍG,ÍG%ÍGÍGÍGÍG ÍGÍGûÌGôÌGíÌGæÌGßÌGØÌGÑÌGÊÌGÃÌG¼ÌGµÌG®ÌG§ÌG ÌG™ÌG’ÌG‹ÌG„ÌG}ÌGvÌGoÌGhÌGaÌGZÌGSÌGLÌGEÌG>ÌG7ÌG0ÌG)ÌG"ÌGÌGÌG ÌGÌGÿËGøËGñËGêËGãËGÜËGÕËGÎËGÇËGÀËG¹ËG²ËG«ËG¤ËGËG–ËGËGˆËGËGzËGsËGlËGeËG^ËGWËGPËGIËGBËG;ËG4ËG-ËG&ËGËGËGËG ËGËGüÊGõÊGîÊGçÊGàÊGÙÊGÒÊGËÊGÄÊG½ÊG¶ÊG¯ÊG¨ÊG¡ÊGšÊG“ÊGŒÊG…ÊG~ÊGwÊGpÊGiÊGbÊG[ÊGTÊGMÊGFÊG?ÊG8ÊG1ÊG*ÊG#ÊGÊGÊGÊGÊGÊGùÉGòÉGëÉGäÉGÝÉGÖÉGÏÉGÈÉGÁÉGºÉG³ÉG¬ÉG¥ÉGžÉG—ÉGÉG‰ÉG‚ÉG{ÉGtÉGmÉGfÉG_ÉGXÉGQÉGJÉGCÉG<ÉG5ÉG.ÉG'ÉG ÉGÉGÉG ÉGÉGýÈGöÈGïÈGèÈGáÈGÚÈGÓÈGÌÈGÅÈG¾ÈG·ÈG°ÈG©ÈG¢ÈG›ÈG”ÈGÈG†ÈGÈGxÈGqÈGjÈGcÈG\ÈGUÈGNÈGGÈG@ÈG9ÈG2ÈG+ÈG$ÈGÈGÈGÈGÈGÈGúÇGóÇGìÇGåÇGÞÇG×ÇGÐÇGÉÇGÂÇG»ÇG´ÇG­ÇG¦ÇGŸÇG˜ÇG‘ÇGŠÇGƒÇG|ÇGuÇGnÇGgÇG`ÇGYÇGRÇGKÇGDÇG=ÇG6ÇG/ÇG(ÇG!ÇGÇGÇG ÇGÇGþÆG÷ÆGðÆGéÆGâÆGÛÆGÔÆGÍÆGÆÆG¿ÆG¸ÆG±ÆGªÆG£ÆGœÆG•ÆGŽÆG‡ÆG€ÆGyÆGrÆGkÆGdÆG]ÆGVÆGOÆGHÆGAÆG:ÆG3ÆG,ÆG%ÆGÆGÆGÆG ÆGÆGûÅGôÅGíÅGæÅGßÅGØÅGÑÅGÊÅGÃÅG¼ÅGµÅG®ÅG§ÅG ÅG™ÅG’ÅG‹ÅG„ÅG}ÅGvÅGoÅGhÅGaÅGZÅGSÅGLÅGEÅG>ÅG7ÅG0ÅG)ÅG"ÅGÅGÅG ÅGÅGÿÄGøÄGñÄGêÄGãÄGÜÄGÕÄGÎÄGÇÄGÀÄG¹ÄG²ÄG«ÄG¤ÄGÄG–ÄGÄGˆÄGÄGzÄGsÄGlÄGeÄG^ÄGWÄGPÄGIÄGBÄG;ÄG4ÄG-ÄG&ÄGÄGÄGÄG ÄGÄGüÃGõÃGîÃGçÃGàÃGÙÃGÒÃGËÃGÄÃG½ÃG¶ÃG¯ÃG¨ÃG¡ÃGšÃG“ÃGŒÃG…ÃG~ÃGwÃGpÃGiÃGbÃG[ÃGTÃGMÃGFÃG?ÃG8ÃG1ÃG*ÃG#ÃGÃGÃGÃGÃGÃGùÂGòÂGëÂGäÂGÝÂGÖÂGÏÂGÈÂGÁÂGºÂG³ÂG¬ÂG¥ÂGžÂG—ÂGÂG‰ÂG‚ÂG{ÂGtÂGmÂGfÂG_ÂGXÂGQÂGJÂGCÂG<ÂG5ÂG.ÂG'ÂG ÂGÂGÂG ÂGÂGýÁGöÁGïÁGèÁGáÁGÚÁGÓÁGÌÁGÅÁG¾ÁG·ÁG°ÁG©ÁG¢ÁG›ÁG”ÁGÁG†ÁGÁGxÁGqÁGjÁGcÁG\ÁGUÁGNÁGGÁG@ÁG9ÁG2ÁG+ÁG$ÁGÁGÁGÁGÁGÁGúÀGóÀGìÀGåÀGÞÀG×ÀGÐÀGÉÀGÂÀG»ÀG´ÀG­ÀG¦ÀGŸÀG˜ÀG‘ÀGŠÀGƒÀG|ÀGuÀGnÀGgÀG`ÀGYÀGRÀGKÀGDÀG=ÀG6ÀG/ÀG(ÀG!ÀGÀGÀG ÀGÀGþ¿G÷¿Gð¿Gé¿Gâ¿GÛ¿GÔ¿GÍ¿GÆ¿G¿¿G¸¿G±¿Gª¿G£¿Gœ¿G•¿GŽ¿G‡¿G€¿Gy¿Gr¿Gk¿Gd¿G]¿GV¿GO¿GH¿GA¿G:¿G3¿G,¿G%¿G¿G¿G¿G ¿G¿Gû¾Gô¾Gí¾Gæ¾Gß¾GؾGѾGʾGþG¼¾Gµ¾G®¾G§¾G ¾G™¾G’¾G‹¾G„¾G}¾Gv¾Go¾Gh¾Ga¾GZ¾GS¾GL¾GE¾G>¾G7¾G0¾G)¾G"¾G¾G¾G ¾G¾Gÿ½Gø½Gñ½Gê½Gã½GܽGÕ½GνGǽGÀ½G¹½G²½G«½G¤½G½G–½G½Gˆ½G½Gz½Gs½Gl½Ge½G^½GW½GP½GI½GB½G;½G4½G-½G&½G½G½G½G ½G½Gü¼Gõ¼Gî¼Gç¼Gà¼GÙ¼GÒ¼G˼GļG½¼G¶¼G¯¼G¨¼G¡¼Gš¼G“¼GŒ¼G…¼G~¼Gw¼Gp¼Gi¼Gb¼G[¼GT¼GM¼GF¼G?¼G8¼G1¼G*¼G#¼G¼G¼G¼G¼G¼Gù»Gò»Gë»Gä»GÝ»GÖ»GÏ»GÈ»GÁ»Gº»G³»G¬»G¥»Gž»G—»G»G‰»G‚»G{»Gt»Gm»Gf»G_»GX»GQ»GJ»GC»G<»G5»G.»G'»G »G»G»G »G»GýºGöºGïºGèºGáºGÚºGÓºG̺GźG¾ºG·ºG°ºG©ºG¢ºG›ºG”ºGºG†ºGºGxºGqºGjºGcºG\ºGUºGNºGGºG@ºG9ºG2ºG+ºG$ºGºGºGºGºGºGú¹Gó¹Gì¹Gå¹GÞ¹G×¹GйGɹG¹G»¹G´¹G­¹G¦¹GŸ¹G˜¹G‘¹GйGƒ¹G|¹Gu¹Gn¹Gg¹G`¹GY¹GR¹GK¹GD¹G=¹G6¹G/¹G(¹G!¹G¹G¹G ¹G¹Gþ¸G÷¸Gð¸Gé¸Gâ¸GÛ¸GÔ¸G͸GƸG¿¸G¸¸G±¸Gª¸G£¸Gœ¸G•¸GޏG‡¸G€¸Gy¸Gr¸Gk¸Gd¸G]¸GV¸GO¸GH¸GA¸G:¸G3¸G,¸G%¸G¸G¸G¸G ¸G¸Gû·Gô·Gí·Gæ·Gß·GØ·GÑ·GÊ·G÷G¼·Gµ·G®·G§·G ·G™·G’·G‹·G„·G}·Gv·Go·Gh·Ga·GZ·GS·GL·GE·G>·G7·G0·G)·G"·G·G·G ·G·Gÿ¶Gø¶Gñ¶Gê¶Gã¶GܶGÕ¶GζGǶGÀ¶G¹¶G²¶G«¶G¤¶G¶G–¶G¶Gˆ¶G¶Gz¶Gs¶Gl¶Ge¶G^¶GW¶GP¶GI¶GB¶G;¶G4¶G-¶G&¶G¶G¶G¶G ¶G¶GüµGõµGîµGçµGàµGÙµGÒµG˵GĵG½µG¶µG¯µG¨µG¡µGšµG“µGŒµG…µG~µGwµGpµGiµGbµG[µGTµGMµGFµG?µG8µG1µG*µG#µGµGµGµGµGµGù´Gò´Gë´Gä´GÝ´GÖ´GÏ´GÈ´GÁ´Gº´G³´G¬´G¥´Gž´G—´G´G‰´G‚´G{´Gt´Gm´Gf´G_´GX´GQ´GJ´GC´G<´G5´G.´G'´G ´G´G´G ´G´Gý³Gö³Gï³Gè³Gá³GÚ³GÓ³G̳GųG¾³G·³G°³G©³G¢³G›³G”³G³G†³G³Gx³Gq³Gj³Gc³G\³GU³GN³GG³G@³G9³G2³G+³G$³G³G³G³G³G³Gú²Gó²Gì²Gå²GÞ²GײGвGɲG²G»²G´²G­²G¦²GŸ²G˜²G‘²GвGƒ²G|²Gu²Gn²Gg²G`²GY²GR²GK²GD²G=²G6²G/²G(²G!²G²G²G ²G²Gþ±G÷±Gð±Gé±Gâ±GÛ±GÔ±GͱGƱG¿±G¸±G±±Gª±G£±Gœ±G•±GޱG‡±G€±Gy±Gr±Gk±Gd±G]±GV±GO±GH±GA±G:±G3±G,±G%±G±G±G±G ±G±Gû°Gô°Gí°Gæ°Gß°GذGѰGʰGðG¼°Gµ°G®°G§°G °G™°G’°G‹°G„°G}°Gv°Go°Gh°Ga°GZ°GS°GL°GE°G>°G7°G0°G)°G"°G°G°G °G°Gÿ¯Gø¯Gñ¯Gê¯Gã¯GܯGÕ¯GίGǯGÀ¯G¹¯G²¯G«¯G¤¯G¯G–¯G¯Gˆ¯G¯Gz¯Gs¯Gl¯Ge¯G^¯GW¯GP¯GI¯GB¯G;¯G4¯G-¯G&¯G¯G¯G¯G ¯G¯Gü®Gõ®Gî®Gç®Gà®GÙ®GÒ®GË®GÄ®G½®G¶®G¯®G¨®G¡®Gš®G“®GŒ®G…®G~®Gw®Gp®Gi®Gb®G[®GT®GM®GF®G?®G8®G1®G*®G#®G®G®G®G®G®Gù­Gò­Gë­Gä­GÝ­GÖ­GÏ­GÈ­GÁ­Gº­G³­G¬­G¥­Gž­G—­G­G‰­G‚­G{­Gt­Gm­Gf­G_­GX­GQ­GJ­GC­G<­G5­G.­G'­G ­G­G­G ­G­Gý¬Gö¬Gï¬Gè¬Gá¬GÚ¬GÓ¬G̬GŬG¾¬G·¬G°¬G©¬G¢¬G›¬G”¬G¬G†¬G¬Gx¬Gq¬Gj¬Gc¬G\¬GU¬GN¬GG¬G@¬G9¬G2¬G+¬G$¬G¬G¬G¬G¬G¬Gú«Gó«Gì«Gå«GÞ«G׫GЫGÉ«G«G»«G´«G­«G¦«GŸ«G˜«G‘«GŠ«Gƒ«G|«Gu«Gn«Gg«G`«GY«GR«GK«GD«G=«G6«G/«G(«G!«G«G«G «G«GþªG÷ªGðªGéªGâªGÛªGÔªGͪGƪG¿ªG¸ªG±ªGªªG£ªGœªG•ªGŽªG‡ªG€ªGyªGrªGkªGdªG]ªGVªGOªGHªGAªG:ªG3ªG,ªG%ªGªGªGªG ªGªGû©Gô©Gí©Gæ©Gß©GØ©GÑ©GÊ©GéG¼©Gµ©G®©G§©G ©G™©G’©G‹©G„©G}©Gv©Go©Gh©Ga©GZ©GS©GL©GE©G>©G7©G0©G)©G"©G©G©G ©G©Gÿ¨Gø¨Gñ¨Gê¨Gã¨GܨGÕ¨GΨGǨGÀ¨G¹¨G²¨G«¨G¤¨G¨G–¨G¨Gˆ¨G¨Gz¨Gs¨Gl¨Ge¨G^¨GW¨GP¨GI¨GB¨G;¨G4¨G-¨G&¨G¨G¨G¨G ¨G¨Gü§Gõ§Gî§Gç§Gà§GÙ§GÒ§G˧GħG½§G¶§G¯§G¨§G¡§Gš§G“§GŒ§G…§G~§Gw§Gp§Gi§Gb§G[§GT§GM§GF§G?§G8§G1§G*§G#§G§G§G§G§G§Gù¦Gò¦Gë¦Gä¦GݦGÖ¦GϦGȦGÁ¦Gº¦G³¦G¬¦G¥¦Gž¦G—¦G¦G‰¦G‚¦G{¦Gt¦Gm¦Gf¦G_¦GX¦GQ¦GJ¦GC¦G<¦G5¦G.¦G'¦G ¦G¦G¦G ¦G¦Gý¥Gö¥Gï¥Gè¥Gá¥GÚ¥GÓ¥GÌ¥GÅ¥G¾¥G·¥G°¥G©¥G¢¥G›¥G”¥G¥G†¥G¥Gx¥Gq¥Gj¥Gc¥G\¥GU¥GN¥GG¥G@¥G9¥G2¥G+¥G$¥G¥G¥G¥G¥G¥Gú¤Gó¤Gì¤Gå¤GÞ¤GפGФGɤG¤G»¤G´¤G­¤G¦¤GŸ¤G˜¤G‘¤GФGƒ¤G|¤Gu¤Gn¤Gg¤G`¤GY¤GR¤GK¤GD¤G=¤G6¤G/¤G(¤G!¤G¤G¤G ¤G¤Gþ£G÷£Gð£Gé£Gâ£GÛ£GÔ£GÍ£GÆ£G¿£G¸£G±£Gª£G££Gœ£G•£GŽ£G‡£G€£Gy£Gr£Gk£Gd£G]£GV£GO£GH£GA£G:£G3£G,£G%£G£G£G£G £G£Gû¢Gô¢Gí¢Gæ¢GߢGØ¢GÑ¢GÊ¢GâG¼¢Gµ¢G®¢G§¢G ¢G™¢G’¢G‹¢G„¢G}¢Gv¢Go¢Gh¢Ga¢GZ¢GS¢GL¢GE¢G>¢G7¢G0¢G)¢G"¢G¢G¢G ¢G¢Gÿ¡Gø¡Gñ¡Gê¡Gã¡GÜ¡GÕ¡GΡGÇ¡GÀ¡G¹¡G²¡G«¡G¤¡G¡G–¡G¡Gˆ¡G¡Gz¡Gs¡Gl¡Ge¡G^¡GW¡GP¡GI¡GB¡G;¡G4¡G-¡G&¡G¡G¡G¡G ¡G¡Gü Gõ Gî Gç Gà GÙ GÒ GË GÄ G½ G¶ G¯ G¨ G¡ Gš G“ GŒ G… G~ Gw Gp Gi Gb G[ GT GM GF G? G8 G1 G* G# G G G G G GùŸGòŸGëŸGäŸGÝŸGÖŸGÏŸGÈŸGÁŸGºŸG³ŸG¬ŸG¥ŸGžŸG—ŸGŸG‰ŸG‚ŸG{ŸGtŸGmŸGfŸG_ŸGXŸGQŸGJŸGCŸG<ŸG5ŸG.ŸG'ŸG ŸGŸGŸG ŸGŸGýžGöžGïžGèžGážGÚžGÓžGÌžGÅžG¾žG·žG°žG©žG¢žG›žG”žGžG†žGžGxžGqžGjžGcžG\žGUžGNžGGžG@žG9žG2žG+žG$žGžGžGžGžGžGúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþœG÷œGðœGéœGâœGÛœGÔœGÍœGÆœG¿œG¸œG±œGªœG£œGœœG•œGŽœG‡œG€œGyœGrœGkœGdœG]œGVœGOœGHœGAœG:œG3œG,œG%œGœGœGœG œGœGû›Gô›Gí›Gæ›Gß›GØ›GÑ›GÊ›GÛG¼›Gµ›G®›G§›G ›G™›G’›G‹›G„›G}›Gv›Go›Gh›Ga›GZ›GS›GL›GE›G>›G7›G0›G)›G"›G›G›G ›G›GÿšGøšGñšGêšGãšGÜšGÕšGΚGÇšGÀšG¹šG²šG«šG¤šGšG–šGšGˆšGšGzšGsšGlšGešG^šGWšGPšGIšGBšG;šG4šG-šG&šGšGšGšG šGšGü™Gõ™Gî™Gç™Gà™GÙ™GÒ™GË™GÄ™G½™G¶™G¯™G¨™G¡™Gš™G“™GŒ™G…™G~™Gw™Gp™Gi™Gb™G[™GT™GM™GF™G?™G8™G1™G*™G#™G™G™G™G™G™Gù˜Gò˜Gë˜Gä˜GݘGÖ˜GϘGȘGÁ˜Gº˜G³˜G¬˜G¥˜Gž˜G—˜G˜G‰˜G‚˜G{˜Gt˜Gm˜Gf˜G_˜GX˜GQ˜GJ˜GC˜G<˜G5˜G.˜G'˜G ˜G˜G˜G ˜G˜Gý—Gö—Gï—Gè—Gá—GÚ—GÓ—GÌ—GÅ—G¾—G·—G°—G©—G¢—G›—G”—G—G†—G—Gx—Gq—Gj—Gc—G\—GU—GN—GG—G@—G9—G2—G+—G$—G—G—G—G—G—Gú–Gó–Gì–Gå–GÞ–G×–GЖGÉ–G–G»–G´–G­–G¦–GŸ–G˜–G‘–GŠ–Gƒ–G|–Gu–Gn–Gg–G`–GY–GR–GK–GD–G=–G6–G/–G(–G!–G–G–G –G–Gþ•G÷•Gð•Gé•Gâ•GÛ•GÔ•GÍ•GÆ•G¿•G¸•G±•Gª•G£•Gœ•G••GŽ•G‡•G€•Gy•Gr•Gk•Gd•G]•GV•GO•GH•GA•G:•G3•G,•G%•G•G•G•G •G•Gû”Gô”Gí”Gæ”Gß”GØ”GÑ”GÊ”GÔG¼”Gµ”G®”G§”G ”G™”G’”G‹”G„”G}”Gv”Go”Gh”Ga”GZ”GS”GL”GE”G>”G7”G0”G)”G"”G”G”G ”G”Gÿ“Gø“Gñ“Gê“Gã“GÜ“GÕ“GΓGÇ“GÀ“G¹“G²“G«“G¤“G“G–“G“Gˆ“G“Gz“Gs“Gl“Ge“G^“GW“GP“GI“GB“G;“G4“G-“G&“G“G“G“G “G“Gü’Gõ’Gî’Gç’Gà’GÙ’GÒ’GË’GÄ’G½’G¶’G¯’G¨’G¡’Gš’G“’GŒ’G…’G~’Gw’Gp’Gi’Gb’G[’GT’GM’GF’G?’G8’G1’G*’G#’G’G’G’G’G’Gù‘Gò‘Gë‘Gä‘GÝ‘GÖ‘GÏ‘GÈ‘GÁ‘Gº‘G³‘G¬‘G¥‘Gž‘G—‘G‘G‰‘G‚‘G{‘Gt‘Gm‘Gf‘G_‘GX‘GQ‘GJ‘GC‘G<‘G5‘G.‘G'‘G ‘G‘G‘G ‘G‘GýGöGïGèGáGÚGÓGÌGÅG¾G·G°G©G¢G›G”GG†GGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþŽG÷ŽGðŽGéŽGâŽGÛŽGÔŽGÍŽGÆŽG¿ŽG¸ŽG±ŽGªŽG£ŽGœŽG•ŽGŽŽG‡ŽG€ŽGyŽGrŽGkŽGdŽG]ŽGVŽGOŽGHŽGAŽG:ŽG3ŽG,ŽG%ŽGŽGŽGŽG ŽGŽGûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿŒGøŒGñŒGêŒGãŒGÜŒGÕŒGÎŒGÇŒGÀŒG¹ŒG²ŒG«ŒG¤ŒGŒG–ŒGŒGˆŒGŒGzŒGsŒGlŒGeŒG^ŒGWŒGPŒGIŒGBŒG;ŒG4ŒG-ŒG&ŒGŒGŒGŒG ŒGŒGü‹Gõ‹Gî‹Gç‹Gà‹GÙ‹GÒ‹GË‹GÄ‹G½‹G¶‹G¯‹G¨‹G¡‹Gš‹G“‹GŒ‹G…‹G~‹Gw‹Gp‹Gi‹Gb‹G[‹GT‹GM‹GF‹G?‹G8‹G1‹G*‹G#‹G‹G‹G‹G‹G‹GùŠGòŠGëŠGäŠGÝŠGÖŠGÏŠGÈŠGÁŠGºŠG³ŠG¬ŠG¥ŠGžŠG—ŠGŠG‰ŠG‚ŠG{ŠGtŠGmŠGfŠG_ŠGXŠGQŠGJŠGCŠG<ŠG5ŠG.ŠG'ŠG ŠGŠGŠG ŠGŠGý‰Gö‰Gï‰Gè‰Gá‰GÚ‰GÓ‰G̉GʼnG¾‰G·‰G°‰G©‰G¢‰G›‰G”‰G‰G†‰G‰Gx‰Gq‰Gj‰Gc‰G\‰GU‰GN‰GG‰G@‰G9‰G2‰G+‰G$‰G‰G‰G‰G‰G‰GúˆGóˆGìˆGåˆGÞˆG׈GЈGɈGˆG»ˆG´ˆG­ˆG¦ˆGŸˆG˜ˆG‘ˆGŠˆGƒˆG|ˆGuˆGnˆGgˆG`ˆGYˆGRˆGKˆGDˆG=ˆG6ˆG/ˆG(ˆG!ˆGˆGˆG ˆGˆGþ‡G÷‡Gð‡Gé‡Gâ‡GÛ‡GÔ‡G͇GƇG¿‡G¸‡G±‡Gª‡G£‡Gœ‡G•‡GއG‡‡G€‡Gy‡Gr‡Gk‡Gd‡G]‡GV‡GO‡GH‡GA‡G:‡G3‡G,‡G%‡G‡G‡G‡G ‡G‡Gû†Gô†Gí†Gæ†G߆G؆GцGʆGÆG¼†Gµ†G®†G§†G †G™†G’†G‹†G„†G}†Gv†Go†Gh†Ga†GZ†GS†GL†GE†G>†G7†G0†G)†G"†G†G†G †G†Gÿ…Gø…Gñ…Gê…Gã…GÜ…GÕ…GÎ…GÇ…GÀ…G¹…G²…G«…G¤…G…G–…G…Gˆ…G…Gz…Gs…Gl…Ge…G^…GW…GP…GI…GB…G;…G4…G-…G&…G…G…G…G …G…Gü„Gõ„Gî„Gç„Gà„GÙ„GÒ„GË„GÄ„G½„G¶„G¯„G¨„G¡„Gš„G“„GŒ„G…„G~„Gw„Gp„Gi„Gb„G[„GT„GM„GF„G?„G8„G1„G*„G#„G„G„G„G„G„GùƒGòƒGëƒGäƒG݃GÖƒGσGȃGÁƒGºƒG³ƒG¬ƒG¥ƒGžƒG—ƒGƒG‰ƒG‚ƒG{ƒGtƒGmƒGfƒG_ƒGXƒGQƒGJƒGCƒG<ƒG5ƒG.ƒG'ƒG ƒGƒGƒG ƒGƒGý‚Gö‚Gï‚Gè‚Gá‚GÚ‚GÓ‚GÌ‚GÅ‚G¾‚G·‚G°‚G©‚G¢‚G›‚G”‚G‚G†‚G‚Gx‚Gq‚Gj‚Gc‚G\‚GU‚GN‚GG‚G@‚G9‚G2‚G+‚G$‚G‚G‚G‚G‚G‚GúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþ€G÷€Gð€Gé€Gâ€GÛ€GÔ€GÍ€GÆ€G¿€G¸€G±€Gª€G£€Gœ€G•€GŽ€G‡€G€€Gy€Gr€Gk€Gd€G]€GV€GO€GH€GA€G:€G3€G,€G%€G€G€G€G €G€GûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿ~Gø~Gñ~Gê~Gã~GÜ~GÕ~GÎ~GÇ~GÀ~G¹~G²~G«~G¤~G~G–~G~Gˆ~G~Gz~Gs~Gl~Ge~G^~GW~GP~GI~GB~G;~G4~G-~G&~G~G~G~G ~G~Gü}Gõ}Gî}Gç}Gà}GÙ}GÒ}GË}GÄ}G½}G¶}G¯}G¨}G¡}Gš}G“}GŒ}G…}G~}Gw}Gp}Gi}Gb}G[}GT}GM}GF}G?}G8}G1}G*}G#}G}G}G}G}G}Gù|Gò|Gë|Gä|GÝ|GÖ|GÏ|GÈ|GÁ|Gº|G³|G¬|G¥|Gž|G—|G|G‰|G‚|G{|Gt|Gm|Gf|G_|GX|GQ|GJ|GC|G<|G5|G.|G'|G |G|G|G |G|Gý{Gö{Gï{Gè{Gá{GÚ{GÓ{GÌ{GÅ{G¾{G·{G°{G©{G¢{G›{G”{G{G†{G{Gx{Gq{Gj{Gc{G\{GU{GN{GG{G@{G9{G2{G+{G${G{G{G{G{G{GúzGózGìzGåzGÞzG×zGÐzGÉzGÂzG»zG´zG­zG¦zGŸzG˜zG‘zGŠzGƒzG|zGuzGnzGgzG`zGYzGRzGKzGDzG=zG6zG/zG(zG!zGzGzG zGzGþyG÷yGðyGéyGâyGÛyGÔyGÍyGÆyG¿yG¸yG±yGªyG£yGœyG•yGŽyG‡yG€yGyyGryGkyGdyG]yGVyGOyGHyGAyG:yG3yG,yG%yGyGyGyG yGyGûxGôxGíxGæxGßxGØxGÑxGÊxGÃxG¼xGµxG®xG§xG xG™xG’xG‹xG„xG}xGvxGoxGhxGaxGZxGSxGLxGExG>xG7xG0xG)xG"xGxGxG xGxGÿwGøwGñwGêwGãwGÜwGÕwGÎwGÇwGÀwG¹wG²wG«wG¤wGwG–wGwGˆwGwGzwGswGlwGewG^wGWwGPwGIwGBwG;wG4wG-wG&wGwGwGwG wGwGüvGõvGîvGçvGàvGÙvGÒvGËvGÄvG½vG¶vG¯vG¨vG¡vGšvG“vGŒvG…vG~vGwvGpvGivGbvG[vGTvGMvGFvG?vG8vG1vG*vG#vGvGvGvGvGvGùuGòuGëuGäuGÝuGÖuGÏuGÈuGÁuGºuG³uG¬uG¥uGžuG—uGuG‰uG‚uG{uGtuGmuGfuG_uGXuGQuGJuGCuGqG7qG0qG)qG"qGqGqG qGqGÿpGøpGñpGêpGãpGÜpGÕpGÎpGÇpGÀpG¹pG²pG«pG¤pGpG–pGpGˆpGpGzpGspGlpGepG^pGWpGPpGIpGBpG;pG4pG-pG&pGpGpGpG pGpGüoGõoGîoGçoGàoGÙoGÒoGËoGÄoG½oG¶oG¯oG¨oG¡oGšoG“oGŒoG…oG~oGwoGpoGioGboG[oGToGMoGFoG?oG8oG1oG*oG#oGoGoGoGoGoGùnGònGënGänGÝnGÖnGÏnGÈnGÁnGºnG³nG¬nG¥nGžnG—nGnG‰nG‚nG{nGtnGmnGfnG_nGXnGQnGJnGCnGjG7jG0jG)jG"jGjGjG jGjGÿiGøiGñiGêiGãiGÜiGÕiGÎiGÇiGÀiG¹iG²iG«iG¤iGiG–iGiGˆiGiGziGsiGliGeiG^iGWiGPiGIiGBiG;iG4iG-iG&iGiGiGiG iGiGühGõhGîhGçhGàhGÙhGÒhGËhGÄhG½hG¶hG¯hG¨hG¡hGšhG“hGŒhG…hG~hGwhGphGihGbhG[hGThGMhGFhG?hG8hG1hG*hG#hGhGhGhGhGhGùgGògGëgGägGÝgGÖgGÏgGÈgGÁgGºgG³gG¬gG¥gGžgG—gGgG‰gG‚gG{gGtgGmgGfgG_gGXgGQgGJgGCgGcG7cG0cG)cG"cGcGcG cGcGÿbGøbGñbGêbGãbGÜbGÕbGÎbGÇbGÀbG¹bG²bG«bG¤bGbG–bGbGˆbGbGzbGsbGlbGebG^bGWbGPbGIbGBbG;bG4bG-bG&bGbGbGbG bGbGüaGõaGîaGçaGàaGÙaGÒaGËaGÄaG½aG¶aG¯aG¨aG¡aGšaG“aGŒaG…aG~aGwaGpaGiaGbaG[aGTaGMaGFaG?aG8aG1aG*aG#aGaGaGaGaGaGù`Gò`Gë`Gä`GÝ`GÖ`GÏ`GÈ`GÁ`Gº`G³`G¬`G¥`Gž`G—`G`G‰`G‚`G{`Gt`Gm`Gf`G_`GX`GQ`GJ`GC`G<`G5`G.`G'`G `G`G`G `G`Gý_Gö_Gï_Gè_Gá_GÚ_GÓ_GÌ_GÅ_G¾_G·_G°_G©_G¢_G›_G”_G_G†_G_Gx_Gq_Gj_Gc_G\_GU_GN_GG_G@_G9_G2_G+_G$_G_G_G_G_G_Gú^Gó^Gì^Gå^GÞ^G×^GÐ^GÉ^GÂ^G»^G´^G­^G¦^GŸ^G˜^G‘^GŠ^Gƒ^G|^Gu^Gn^Gg^G`^GY^GR^GK^GD^G=^G6^G/^G(^G!^G^G^G ^G^Gþ]G÷]Gð]Gé]Gâ]GÛ]GÔ]GÍ]GÆ]G¿]G¸]G±]Gª]G£]Gœ]G•]GŽ]G‡]G€]Gy]Gr]Gk]Gd]G]]GV]GO]GH]GA]G:]G3]G,]G%]G]G]G]G ]G]Gû\Gô\Gí\Gæ\Gß\GØ\GÑ\GÊ\GÃ\G¼\Gµ\G®\G§\G \G™\G’\G‹\G„\G}\Gv\Go\Gh\Ga\GZ\GS\GL\GE\G>\G7\G0\G)\G"\G\G\G \G\Gÿ[Gø[Gñ[Gê[Gã[GÜ[GÕ[GÎ[GÇ[GÀ[G¹[G²[G«[G¤[G[G–[G[Gˆ[G[Gz[Gs[Gl[Ge[G^[GW[GP[GI[GB[G;[G4[G-[G&[G[G[G[G [G[GüZGõZGîZGçZGàZGÙZGÒZGËZGÄZG½ZG¶ZG¯ZG¨ZG¡ZGšZG“ZGŒZG…ZG~ZGwZGpZGiZGbZG[ZGTZGMZGFZG?ZG8ZG1ZG*ZG#ZGZGZGZGZGZGùYGòYGëYGäYGÝYGÖYGÏYGÈYGÁYGºYG³YG¬YG¥YGžYG—YGYG‰YG‚YG{YGtYGmYGfYG_YGXYGQYGJYGCYGUG7UG0UG)UG"UGUGUG UGUGÿTGøTGñTGêTGãTGÜTGÕTGÎTGÇTGÀTG¹TG²TG«TG¤TGTG–TGTGˆTGTGzTGsTGlTGeTG^TGWTGPTGITGBTG;TG4TG-TG&TGTGTGTG TGTGüSGõSGîSGçSGàSGÙSGÒSGËSGÄSG½SG¶SG¯SG¨SG¡SGšSG“SGŒSG…SG~SGwSGpSGiSGbSG[SGTSGMSGFSG?SG8SG1SG*SG#SGSGSGSGSGSGùRGòRGëRGäRGÝRGÖRGÏRGÈRGÁRGºRG³RG¬RG¥RGžRG—RGRG‰RG‚RG{RGtRGmRGfRG_RGXRGQRGJRGCRGNG7NG0NG)NG"NGNGNG NGNGÿMGøMGñMGêMGãMGÜMGÕMGÎMGÇMGÀMG¹MG²MG«MG¤MGMG–MGMGˆMGMGzMGsMGlMGeMG^MGWMGPMGIMGBMG;MG4MG-MG&MGMGMGMG MGMGüLGõLGîLGçLGàLGÙLGÒLGËLGÄLG½LG¶LG¯LG¨LG¡LGšLG“LGŒLG…LG~LGwLGpLGiLGbLG[LGTLGMLGFLG?LG8LG1LG*LG#LGLGLGLGLGLGùKGòKGëKGäKGÝKGÖKGÏKGÈKGÁKGºKG³KG¬KG¥KGžKG—KGKG‰KG‚KG{KGtKGmKGfKG_KGXKGQKGJKGCKGGG7GG0GG)GG"GGGGGG GGGGÿFGøFGñFGêFGãFGÜFGÕFGÎFGÇFGÀFG¹FG²FG«FG¤FGFG–FGFGˆFGFGzFGsFGlFGeFG^FGWFGPFGIFGBFG;FG4FG-FG&FGFGFGFG FGFGüEGõEGîEGçEGàEGÙEGÒEGËEGÄEG½EG¶EG¯EG¨EG¡EGšEG“EGŒEG…EG~EGwEGpEGiEGbEG[EGTEGMEGFEG?EG8EG1EG*EG#EGEGEGEGEGEGùDGòDGëDGäDGÝDGÖDGÏDGÈDGÁDGºDG³DG¬DG¥DGžDG—DGDG‰DG‚DG{DGtDGmDGfDG_DGXDGQDGJDGCDG@G7@G0@G)@G"@G@G@G @G@Gÿ?Gø?Gñ?Gê?Gã?GÜ?GÕ?GÎ?GÇ?GÀ?G¹?G²?G«?G¤?G?G–?G?Gˆ?G?Gz?Gs?Gl?Ge?G^?GW?GP?GI?GB?G;?G4?G-?G&?G?G?G?G ?G?Gü>Gõ>Gî>Gç>Gà>GÙ>GÒ>GË>GÄ>G½>G¶>G¯>G¨>G¡>Gš>G“>GŒ>G…>G~>Gw>Gp>Gi>Gb>G[>GT>GM>GF>G?>G8>G1>G*>G#>G>G>G>G>G>Gù=Gò=Gë=Gä=GÝ=GÖ=GÏ=GÈ=GÁ=Gº=G³=G¬=G¥=Gž=G—=G=G‰=G‚=G{=Gt=Gm=Gf=G_=GX=GQ=GJ=GC=G<=G5=G.=G'=G =G=G=G =G=Gý9G79G09G)9G"9G9G9G 9G9Gÿ8Gø8Gñ8Gê8Gã8GÜ8GÕ8GÎ8GÇ8GÀ8G¹8G²8G«8G¤8G8G–8G8Gˆ8G8Gz8Gs8Gl8Ge8G^8GW8GP8GI8GB8G;8G48G-8G&8G8G8G8G 8G8Gü7Gõ7Gî7Gç7Gà7GÙ7GÒ7GË7GÄ7G½7G¶7G¯7G¨7G¡7Gš7G“7GŒ7G…7G~7Gw7Gp7Gi7Gb7G[7GT7GM7GF7G?7G87G17G*7G#7G7G7G7G7G7Gù6Gò6Gë6Gä6GÝ6GÖ6GÏ6GÈ6GÁ6Gº6G³6G¬6G¥6Gž6G—6G6G‰6G‚6G{6Gt6Gm6Gf6G_6GX6GQ6GJ6GC6G<6G56G.6G'6G 6G6G6G 6G6Gý5Gö5Gï5Gè5Gá5GÚ5GÓ5GÌ5GÅ5G¾5G·5G°5G©5G¢5G›5G”5G5G†5G5Gx5Gq5Gj5Gc5G\5GU5GN5GG5G@5G95G25G+5G$5G5G5G5G5G5Gú4Gó4Gì4Gå4GÞ4G×4GÐ4GÉ4GÂ4G»4G´4G­4G¦4GŸ4G˜4G‘4GŠ4Gƒ4G|4Gu4Gn4Gg4G`4GY4GR4GK4GD4G=4G64G/4G(4G!4G4G4G 4G4Gþ3G÷3Gð3Gé3Gâ3GÛ3GÔ3GÍ3GÆ3G¿3G¸3G±3Gª3G£3Gœ3G•3GŽ3G‡3G€3Gy3Gr3Gk3Gd3G]3GV3GO3GH3GA3G:3G33G,3G%3G3G3G3G 3G3Gû2Gô2Gí2Gæ2Gß2GØ2GÑ2GÊ2GÃ2G¼2Gµ2G®2G§2G 2G™2G’2G‹2G„2G}2Gv2Go2Gh2Ga2GZ2GS2GL2GE2G>2G72G02G)2G"2G2G2G 2G2Gÿ1Gø1Gñ1Gê1Gã1GÜ1GÕ1GÎ1GÇ1GÀ1G¹1G²1G«1G¤1G1G–1G1Gˆ1G1Gz1Gs1Gl1Ge1G^1GW1GP1GI1GB1G;1G41G-1G&1G1G1G1G 1G1Gü0Gõ0Gî0Gç0Gà0GÙ0GÒ0GË0GÄ0G½0G¶0G¯0G¨0G¡0Gš0G“0GŒ0G…0G~0Gw0Gp0Gi0Gb0G[0GT0GM0GF0G?0G80G10G*0G#0G0G0G0G0G0Gù/Gò/Gë/Gä/GÝ/GÖ/GÏ/GÈ/GÁ/Gº/G³/G¬/G¥/Gž/G—/G/G‰/G‚/G{/Gt/Gm/Gf/G_/GX/GQ/GJ/GC/G+G7+G0+G)+G"+G+G+G +G+Gÿ*Gø*Gñ*Gê*Gã*GÜ*GÕ*GÎ*GÇ*GÀ*G¹*G²*G«*G¤*G*G–*G*Gˆ*G*Gz*Gs*Gl*Ge*G^*GW*GP*GI*GB*G;*G4*G-*G&*G*G*G*G *G*Gü)Gõ)Gî)Gç)Gà)GÙ)GÒ)GË)GÄ)G½)G¶)G¯)G¨)G¡)Gš)G“)GŒ)G…)G~)Gw)Gp)Gi)Gb)G[)GT)GM)GF)G?)G8)G1)G*)G#)G)G)G)G)G)Gù(Gò(Gë(Gä(GÝ(GÖ(GÏ(GÈ(GÁ(Gº(G³(G¬(G¥(Gž(G—(G(G‰(G‚(G{(Gt(Gm(Gf(G_(GX(GQ(GJ(GC(G<(G5(G.(G'(G (G(G(G (G(Gý'Gö'Gï'Gè'Gá'GÚ'GÓ'GÌ'GÅ'G¾'G·'G°'G©'G¢'G›'G”'G'G†'G'Gx'Gq'Gj'Gc'G\'GU'GN'GG'G@'G9'G2'G+'G$'G'G'G'G'G'Gú&Gó&Gì&Gå&GÞ&G×&GÐ&GÉ&GÂ&G»&G´&G­&G¦&GŸ&G˜&G‘&GŠ&Gƒ&G|&Gu&Gn&Gg&G`&GY&GR&GK&GD&G=&G6&G/&G(&G!&G&G&G &G&Gþ%G÷%Gð%Gé%Gâ%GÛ%GÔ%GÍ%GÆ%G¿%G¸%G±%Gª%G£%Gœ%G•%GŽ%G‡%G€%Gy%Gr%Gk%Gd%G]%GV%GO%GH%GA%G:%G3%G,%G%%G%G%G%G %G%Gû$Gô$Gí$Gæ$Gß$GØ$GÑ$GÊ$GÃ$G¼$Gµ$G®$G§$G $G™$G’$G‹$G„$G}$Gv$Go$Gh$Ga$GZ$GS$GL$GE$G>$G7$G0$G)$G"$G$G$G $G$Gÿ#Gø#Gñ#Gê#Gã#GÜ#GÕ#GÎ#GÇ#GÀ#G¹#G²#G«#G¤#G#G–#G#Gˆ#G#Gz#Gs#Gl#Ge#G^#GW#GP#GI#GB#G;#G4#G-#G&#G#G#G#G #G#Gü"Gõ"Gî"Gç"Gà"GÙ"GÒ"GË"GÄ"G½"G¶"G¯"G¨"G¡"Gš"G“"GŒ"G…"G~"Gw"Gp"Gi"Gb"G["GT"GM"GF"G?"G8"G1"G*"G#"G"G"G"G"G"Gù!Gò!Gë!Gä!GÝ!GÖ!GÏ!GÈ!GÁ!Gº!G³!G¬!G¥!Gž!G—!G!G‰!G‚!G{!Gt!Gm!Gf!G_!GX!GQ!GJ!GC!GG7G0G)G"GGG GGÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGýGöGïGèGáGÚGÓGÌGÅG¾G·G°G©G¢G›G”GG†GGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþG÷GðGéGâGÛGÔGÍGÆG¿G¸G±GªG£GœG•GŽG‡G€GyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGýGöGïGèGáGÚGÓGÌGÅG¾G·G°G©G¢G›G”GG†GGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþG÷GðGéGâGÛGÔGÍGÆG¿G¸G±GªG£GœG•GŽG‡G€GyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGü Gõ Gî Gç Gà GÙ GÒ GË GÄ G½ G¶ G¯ G¨ G¡ Gš G“ GŒ G… G~ Gw Gp Gi Gb G[ GT GM GF G? G8 G1 G* G# G G G G G Gù Gò Gë Gä GÝ GÖ GÏ GÈ GÁ Gº G³ G¬ G¥ Gž G— G G‰ G‚ G{ Gt Gm Gf G_ GX GQ GJ GC G< G5 G. G' G G G G G Gý Gö Gï Gè Gá GÚ GÓ GÌ GÅ G¾ G· G° G© G¢ G› G” G G† G Gx Gq Gj Gc G\ GU GN GG G@ G9 G2 G+ G$ G G G G G Gú Gó Gì Gå GÞ G× GÐ GÉ G G» G´ G­ G¦ GŸ G˜ G‘ GŠ Gƒ G| Gu Gn Gg G` GY GR GK GD G= G6 G/ G( G! G G G G Gþ G÷ Gð Gé Gâ GÛ GÔ GÍ GÆ G¿ G¸ G± Gª G£ Gœ G• GŽ G‡ G€ Gy Gr Gk Gd G] GV GO GH GA G: G3 G, G% G G G G G GûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCG<G5G.G'G GGG GGýGöGïGèGáGÚGÓGÌGÅG¾G·G°G©G¢G›G”GG†GGxGqGjGcG\GUGNGGG@G9G2G+G$GGGGGGúGóGìGåGÞG×GÐGÉGÂG»G´G­G¦GŸG˜G‘GŠGƒG|GuGnGgG`GYGRGKGDG=G6G/G(G!GGG GGþG÷GðGéGâGÛGÔGÍGÆG¿G¸G±GªG£GœG•GŽG‡G€GyGrGkGdG]GVGOGHGAG:G3G,G%GGGG GGûGôGíGæGßGØGÑGÊGÃG¼GµG®G§G G™G’G‹G„G}GvGoGhGaGZGSGLGEG>G7G0G)G"GGG GGÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüÿFõÿFîÿFçÿFàÿFÙÿFÒÿFËÿFÄÿF½ÿF¶ÿF¯ÿF¨ÿF¡ÿFšÿF“ÿFŒÿF…ÿF~ÿFwÿFpÿFiÿFbÿF[ÿFTÿFMÿFFÿF?ÿF8ÿF1ÿF*ÿF#ÿFÿFÿFÿFÿFÿFùþFòþFëþFäþFÝþFÖþFÏþFÈþFÁþFºþF³þF¬þF¥þFžþF—þFþF‰þF‚þF{þFtþFmþFfþF_þFXþFQþFJþFCþF<þF5þF.þF'þF þFþFþF þFþFýýFöýFïýFèýFáýFÚýFÓýFÌýFÅýF¾ýF·ýF°ýF©ýF¢ýF›ýF”ýFýF†ýFýFxýFqýFjýFcýF\ýFUýFNýFGýF@ýF9ýF2ýF+ýF$ýFýFýFýFýFýFúüFóüFìüFåüFÞüF×üFÐüFÉüFÂüF»üF´üF­üF¦üFŸüF˜üF‘üFŠüFƒüF|üFuüFnüFgüF`üFYüFRüFKüFDüF=üF6üF/üF(üF!üFüFüF üFüFþûF÷ûFðûFéûFâûFÛûFÔûFÍûFÆûF¿ûF¸ûF±ûFªûF£ûFœûF•ûFŽûF‡ûF€ûFyûFrûFkûFdûF]ûFVûFOûFHûFAûF:ûF3ûF,ûF%ûFûFûFûF ûFûFûúFôúFíúFæúFßúFØúFÑúFÊúFÃúF¼úFµúF®úF§úF úF™úF’úF‹úF„úF}úFvúFoúFhúFaúFZúFSúFLúFEúF>úF7úF0úF)úF"úFúFúF úFúFÿùFøùFñùFêùFãùFÜùFÕùFÎùFÇùFÀùF¹ùF²ùF«ùF¤ùFùF–ùFùFˆùFùFzùFsùFlùFeùF^ùFWùFPùFIùFBùF;ùF4ùF-ùF&ùFùFùFùF ùFùFüøFõøFîøFçøFàøFÙøFÒøFËøFÄøF½øF¶øF¯øF¨øF¡øFšøF“øFŒøF…øF~øFwøFpøFiøFbøF[øFTøFMøFFøF?øF8øF1øF*øF#øFøFøFøFøFøFù÷Fò÷Fë÷Fä÷FÝ÷FÖ÷FÏ÷FÈ÷FÁ÷Fº÷F³÷F¬÷F¥÷Fž÷F—÷F÷F‰÷F‚÷F{÷Ft÷Fm÷Ff÷F_÷FX÷FQ÷FJ÷FC÷F<÷F5÷F.÷F'÷F ÷F÷F÷F ÷F÷FýöFööFïöFèöFáöFÚöFÓöFÌöFÅöF¾öF·öF°öF©öF¢öF›öF”öFöF†öFöFxöFqöFjöFcöF\öFUöFNöFGöF@öF9öF2öF+öF$öFöFöFöFöFöFúõFóõFìõFåõFÞõF×õFÐõFÉõFÂõF»õF´õF­õF¦õFŸõF˜õF‘õFŠõFƒõF|õFuõFnõFgõF`õFYõFRõFKõFDõF=õF6õF/õF(õF!õFõFõF õFõFþôF÷ôFðôFéôFâôFÛôFÔôFÍôFÆôF¿ôF¸ôF±ôFªôF£ôFœôF•ôFŽôF‡ôF€ôFyôFrôFkôFdôF]ôFVôFOôFHôFAôF:ôF3ôF,ôF%ôFôFôFôF ôFôFûóFôóFíóFæóFßóFØóFÑóFÊóFÃóF¼óFµóF®óF§óF óF™óF’óF‹óF„óF}óFvóFoóFhóFaóFZóFSóFLóFEóF>óF7óF0óF)óF"óFóFóF óFóFÿòFøòFñòFêòFãòFÜòFÕòFÎòFÇòFÀòF¹òF²òF«òF¤òFòF–òFòFˆòFòFzòFsòFlòFeòF^òFWòFPòFIòFBòF;òF4òF-òF&òFòFòFòF òFòFüñFõñFîñFçñFàñFÙñFÒñFËñFÄñF½ñF¶ñF¯ñF¨ñF¡ñFšñF“ñFŒñF…ñF~ñFwñFpñFiñFbñF[ñFTñFMñFFñF?ñF8ñF1ñF*ñF#ñFñFñFñFñFñFùðFòðFëðFäðFÝðFÖðFÏðFÈðFÁðFºðF³ðF¬ðF¥ðFžðF—ðFðF‰ðF‚ðF{ðFtðFmðFfðF_ðFXðFQðFJðFCðF<ðF5ðF.ðF'ðF ðFðFðF ðFðFýïFöïFïïFèïFáïFÚïFÓïFÌïFÅïF¾ïF·ïF°ïF©ïF¢ïF›ïF”ïFïF†ïFïFxïFqïFjïFcïF\ïFUïFNïFGïF@ïF9ïF2ïF+ïF$ïFïFïFïFïFïFúîFóîFìîFåîFÞîF×îFÐîFÉîFÂîF»îF´îF­îF¦îFŸîF˜îF‘îFŠîFƒîF|îFuîFnîFgîF`îFYîFRîFKîFDîF=îF6îF/îF(îF!îFîFîF îFîFþíF÷íFðíFéíFâíFÛíFÔíFÍíFÆíF¿íF¸íF±íFªíF£íFœíF•íFŽíF‡íF€íFyíFríFkíFdíF]íFVíFOíFHíFAíF:íF3íF,íF%íFíFíFíF íFíFûìFôìFíìFæìFßìFØìFÑìFÊìFÃìF¼ìFµìF®ìF§ìF ìF™ìF’ìF‹ìF„ìF}ìFvìFoìFhìFaìFZìFSìFLìFEìF>ìF7ìF0ìF)ìF"ìFìFìF ìFìFÿëFøëFñëFêëFãëFÜëFÕëFÎëFÇëFÀëF¹ëF²ëF«ëF¤ëFëF–ëFëFˆëFëFzëFsëFlëFeëF^ëFWëFPëFIëFBëF;ëF4ëF-ëF&ëFëFëFëF ëFëFüêFõêFîêFçêFàêFÙêFÒêFËêFÄêF½êF¶êF¯êF¨êF¡êFšêF“êFŒêF…êF~êFwêFpêFiêFbêF[êFTêFMêFFêF?êF8êF1êF*êF#êFêFêFêFêFêFùéFòéFëéFäéFÝéFÖéFÏéFÈéFÁéFºéF³éF¬éF¥éFžéF—éFéF‰éF‚éF{éFtéFméFféF_éFXéFQéFJéFCéF<éF5éF.éF'éF éFéFéF éFéFýèFöèFïèFèèFáèFÚèFÓèFÌèFÅèF¾èF·èF°èF©èF¢èF›èF”èFèF†èFèFxèFqèFjèFcèF\èFUèFNèFGèF@èF9èF2èF+èF$èFèFèFèFèFèFúçFóçFìçFåçFÞçF×çFÐçFÉçFÂçF»çF´çF­çF¦çFŸçF˜çF‘çFŠçFƒçF|çFuçFnçFgçF`çFYçFRçFKçFDçF=çF6çF/çF(çF!çFçFçF çFçFþæF÷æFðæFéæFâæFÛæFÔæFÍæFÆæF¿æF¸æF±æFªæF£æFœæF•æFŽæF‡æF€æFyæFræFkæFdæF]æFVæFOæFHæFAæF:æF3æF,æF%æFæFæFæF æFæFûåFôåFíåFæåFßåFØåFÑåFÊåFÃåF¼åFµåF®åF§åF åF™åF’åF‹åF„åF}åFvåFoåFhåFaåFZåFSåFLåFEåF>åF7åF0åF)åF"åFåFåF åFåFÿäFøäFñäFêäFãäFÜäFÕäFÎäFÇäFÀäF¹äF²äF«äF¤äFäF–äFäFˆäFäFzäFsäFläFeäF^äFWäFPäFIäFBäF;äF4äF-äF&äFäFäFäF äFäFüãFõãFîãFçãFàãFÙãFÒãFËãFÄãF½ãF¶ãF¯ãF¨ãF¡ãFšãF“ãFŒãF…ãF~ãFwãFpãFiãFbãF[ãFTãFMãFFãF?ãF8ãF1ãF*ãF#ãFãFãFãFãFãFùâFòâFëâFäâFÝâFÖâFÏâFÈâFÁâFºâF³âF¬âF¥âFžâF—âFâF‰âF‚âF{âFtâFmâFfâF_âFXâFQâFJâFCâF<âF5âF.âF'âF âFâFâF âFâFýáFöáFïáFèáFááFÚáFÓáFÌáFÅáF¾áF·áF°áF©áF¢áF›áF”áFáF†áFáFxáFqáFjáFcáF\áFUáFNáFGáF@áF9áF2áF+áF$áFáFáFáFáFáFúàFóàFìàFåàFÞàF×àFÐàFÉàFÂàF»àF´àF­àF¦àFŸàF˜àF‘àFŠàFƒàF|àFuàFnàFgàF`àFYàFRàFKàFDàF=àF6àF/àF(àF!àFàFàF àFàFþßF÷ßFðßFéßFâßFÛßFÔßFÍßFÆßF¿ßF¸ßF±ßFªßF£ßFœßF•ßFŽßF‡ßF€ßFyßFrßFkßFdßF]ßFVßFOßFHßFAßF:ßF3ßF,ßF%ßFßFßFßF ßFßFûÞFôÞFíÞFæÞFßÞFØÞFÑÞFÊÞFÃÞF¼ÞFµÞF®ÞF§ÞF ÞF™ÞF’ÞF‹ÞF„ÞF}ÞFvÞFoÞFhÞFaÞFZÞFSÞFLÞFEÞF>ÞF7ÞF0ÞF)ÞF"ÞFÞFÞF ÞFÞFÿÝFøÝFñÝFêÝFãÝFÜÝFÕÝFÎÝFÇÝFÀÝF¹ÝF²ÝF«ÝF¤ÝFÝF–ÝFÝFˆÝFÝFzÝFsÝFlÝFeÝF^ÝFWÝFPÝFIÝFBÝF;ÝF4ÝF-ÝF&ÝFÝFÝFÝF ÝFÝFüÜFõÜFîÜFçÜFàÜFÙÜFÒÜFËÜFÄÜF½ÜF¶ÜF¯ÜF¨ÜF¡ÜFšÜF“ÜFŒÜF…ÜF~ÜFwÜFpÜFiÜFbÜF[ÜFTÜFMÜFFÜF?ÜF8ÜF1ÜF*ÜF#ÜFÜFÜFÜFÜFÜFùÛFòÛFëÛFäÛFÝÛFÖÛFÏÛFÈÛFÁÛFºÛF³ÛF¬ÛF¥ÛFžÛF—ÛFÛF‰ÛF‚ÛF{ÛFtÛFmÛFfÛF_ÛFXÛFQÛFJÛFCÛF<ÛF5ÛF.ÛF'ÛF ÛFÛFÛF ÛFÛFýÚFöÚFïÚFèÚFáÚFÚÚFÓÚFÌÚFÅÚF¾ÚF·ÚF°ÚF©ÚF¢ÚF›ÚF”ÚFÚF†ÚFÚFxÚFqÚFjÚFcÚF\ÚFUÚFNÚFGÚF@ÚF9ÚF2ÚF+ÚF$ÚFÚFÚFÚFÚFÚFúÙFóÙFìÙFåÙFÞÙF×ÙFÐÙFÉÙFÂÙF»ÙF´ÙF­ÙF¦ÙFŸÙF˜ÙF‘ÙFŠÙFƒÙF|ÙFuÙFnÙFgÙF`ÙFYÙFRÙFKÙFDÙF=ÙF6ÙF/ÙF(ÙF!ÙFÙFÙF ÙFÙFþØF÷ØFðØFéØFâØFÛØFÔØFÍØFÆØF¿ØF¸ØF±ØFªØF£ØFœØF•ØFŽØF‡ØF€ØFyØFrØFkØFdØF]ØFVØFOØFHØFAØF:ØF3ØF,ØF%ØFØFØFØF ØFØFû×Fô×Fí×Fæ×Fß×FØ×FÑ×FÊ×FÃ×F¼×Fµ×F®×F§×F ×F™×F’×F‹×F„×F}×Fv×Fo×Fh×Fa×FZ×FS×FL×FE×F>×F7×F0×F)×F"×F×F×F ×F×FÿÖFøÖFñÖFêÖFãÖFÜÖFÕÖFÎÖFÇÖFÀÖF¹ÖF²ÖF«ÖF¤ÖFÖF–ÖFÖFˆÖFÖFzÖFsÖFlÖFeÖF^ÖFWÖFPÖFIÖFBÖF;ÖF4ÖF-ÖF&ÖFÖFÖFÖF ÖFÖFüÕFõÕFîÕFçÕFàÕFÙÕFÒÕFËÕFÄÕF½ÕF¶ÕF¯ÕF¨ÕF¡ÕFšÕF“ÕFŒÕF…ÕF~ÕFwÕFpÕFiÕFbÕF[ÕFTÕFMÕFFÕF?ÕF8ÕF1ÕF*ÕF#ÕFÕFÕFÕFÕFÕFùÔFòÔFëÔFäÔFÝÔFÖÔFÏÔFÈÔFÁÔFºÔF³ÔF¬ÔF¥ÔFžÔF—ÔFÔF‰ÔF‚ÔF{ÔFtÔFmÔFfÔF_ÔFXÔFQÔFJÔFCÔF<ÔF5ÔF.ÔF'ÔF ÔFÔFÔF ÔFÔFýÓFöÓFïÓFèÓFáÓFÚÓFÓÓFÌÓFÅÓF¾ÓF·ÓF°ÓF©ÓF¢ÓF›ÓF”ÓFÓF†ÓFÓFxÓFqÓFjÓFcÓF\ÓFUÓFNÓFGÓF@ÓF9ÓF2ÓF+ÓF$ÓFÓFÓFÓFÓFÓFúÒFóÒFìÒFåÒFÞÒF×ÒFÐÒFÉÒFÂÒF»ÒF´ÒF­ÒF¦ÒFŸÒF˜ÒF‘ÒFŠÒFƒÒF|ÒFuÒFnÒFgÒF`ÒFYÒFRÒFKÒFDÒF=ÒF6ÒF/ÒF(ÒF!ÒFÒFÒF ÒFÒFþÑF÷ÑFðÑFéÑFâÑFÛÑFÔÑFÍÑFÆÑF¿ÑF¸ÑF±ÑFªÑF£ÑFœÑF•ÑFŽÑF‡ÑF€ÑFyÑFrÑFkÑFdÑF]ÑFVÑFOÑFHÑFAÑF:ÑF3ÑF,ÑF%ÑFÑFÑFÑF ÑFÑFûÐFôÐFíÐFæÐFßÐFØÐFÑÐFÊÐFÃÐF¼ÐFµÐF®ÐF§ÐF ÐF™ÐF’ÐF‹ÐF„ÐF}ÐFvÐFoÐFhÐFaÐFZÐFSÐFLÐFEÐF>ÐF7ÐF0ÐF)ÐF"ÐFÐFÐF ÐFÐFÿÏFøÏFñÏFêÏFãÏFÜÏFÕÏFÎÏFÇÏFÀÏF¹ÏF²ÏF«ÏF¤ÏFÏF–ÏFÏFˆÏFÏFzÏFsÏFlÏFeÏF^ÏFWÏFPÏFIÏFBÏF;ÏF4ÏF-ÏF&ÏFÏFÏFÏF ÏFÏFüÎFõÎFîÎFçÎFàÎFÙÎFÒÎFËÎFÄÎF½ÎF¶ÎF¯ÎF¨ÎF¡ÎFšÎF“ÎFŒÎF…ÎF~ÎFwÎFpÎFiÎFbÎF[ÎFTÎFMÎFFÎF?ÎF8ÎF1ÎF*ÎF#ÎFÎFÎFÎFÎFÎFùÍFòÍFëÍFäÍFÝÍFÖÍFÏÍFÈÍFÁÍFºÍF³ÍF¬ÍF¥ÍFžÍF—ÍFÍF‰ÍF‚ÍF{ÍFtÍFmÍFfÍF_ÍFXÍFQÍFJÍFCÍF<ÍF5ÍF.ÍF'ÍF ÍFÍFÍF ÍFÍFýÌFöÌFïÌFèÌFáÌFÚÌFÓÌFÌÌFÅÌF¾ÌF·ÌF°ÌF©ÌF¢ÌF›ÌF”ÌFÌF†ÌFÌFxÌFqÌFjÌFcÌF\ÌFUÌFNÌFGÌF@ÌF9ÌF2ÌF+ÌF$ÌFÌFÌFÌFÌFÌFúËFóËFìËFåËFÞËF×ËFÐËFÉËFÂËF»ËF´ËF­ËF¦ËFŸËF˜ËF‘ËFŠËFƒËF|ËFuËFnËFgËF`ËFYËFRËFKËFDËF=ËF6ËF/ËF(ËF!ËFËFËF ËFËFþÊF÷ÊFðÊFéÊFâÊFÛÊFÔÊFÍÊFÆÊF¿ÊF¸ÊF±ÊFªÊF£ÊFœÊF•ÊFŽÊF‡ÊF€ÊFyÊFrÊFkÊFdÊF]ÊFVÊFOÊFHÊFAÊF:ÊF3ÊF,ÊF%ÊFÊFÊFÊF ÊFÊFûÉFôÉFíÉFæÉFßÉFØÉFÑÉFÊÉFÃÉF¼ÉFµÉF®ÉF§ÉF ÉF™ÉF’ÉF‹ÉF„ÉF}ÉFvÉFoÉFhÉFaÉFZÉFSÉFLÉFEÉF>ÉF7ÉF0ÉF)ÉF"ÉFÉFÉF ÉFÉFÿÈFøÈFñÈFêÈFãÈFÜÈFÕÈFÎÈFÇÈFÀÈF¹ÈF²ÈF«ÈF¤ÈFÈF–ÈFÈFˆÈFÈFzÈFsÈFlÈFeÈF^ÈFWÈFPÈFIÈFBÈF;ÈF4ÈF-ÈF&ÈFÈFÈFÈF ÈFÈFüÇFõÇFîÇFçÇFàÇFÙÇFÒÇFËÇFÄÇF½ÇF¶ÇF¯ÇF¨ÇF¡ÇFšÇF“ÇFŒÇF…ÇF~ÇFwÇFpÇFiÇFbÇF[ÇFTÇFMÇFFÇF?ÇF8ÇF1ÇF*ÇF#ÇFÇFÇFÇFÇFÇFùÆFòÆFëÆFäÆFÝÆFÖÆFÏÆFÈÆFÁÆFºÆF³ÆF¬ÆF¥ÆFžÆF—ÆFÆF‰ÆF‚ÆF{ÆFtÆFmÆFfÆF_ÆFXÆFQÆFJÆFCÆF<ÆF5ÆF.ÆF'ÆF ÆFÆFÆF ÆFÆFýÅFöÅFïÅFèÅFáÅFÚÅFÓÅFÌÅFÅÅF¾ÅF·ÅF°ÅF©ÅF¢ÅF›ÅF”ÅFÅF†ÅFÅFxÅFqÅFjÅFcÅF\ÅFUÅFNÅFGÅF@ÅF9ÅF2ÅF+ÅF$ÅFÅFÅFÅFÅFÅFúÄFóÄFìÄFåÄFÞÄF×ÄFÐÄFÉÄFÂÄF»ÄF´ÄF­ÄF¦ÄFŸÄF˜ÄF‘ÄFŠÄFƒÄF|ÄFuÄFnÄFgÄF`ÄFYÄFRÄFKÄFDÄF=ÄF6ÄF/ÄF(ÄF!ÄFÄFÄF ÄFÄFþÃF÷ÃFðÃFéÃFâÃFÛÃFÔÃFÍÃFÆÃF¿ÃF¸ÃF±ÃFªÃF£ÃFœÃF•ÃFŽÃF‡ÃF€ÃFyÃFrÃFkÃFdÃF]ÃFVÃFOÃFHÃFAÃF:ÃF3ÃF,ÃF%ÃFÃFÃFÃF ÃFÃFûÂFôÂFíÂFæÂFßÂFØÂFÑÂFÊÂFÃÂF¼ÂFµÂF®ÂF§ÂF ÂF™ÂF’ÂF‹ÂF„ÂF}ÂFvÂFoÂFhÂFaÂFZÂFSÂFLÂFEÂF>ÂF7ÂF0ÂF)ÂF"ÂFÂFÂF ÂFÂFÿÁFøÁFñÁFêÁFãÁFÜÁFÕÁFÎÁFÇÁFÀÁF¹ÁF²ÁF«ÁF¤ÁFÁF–ÁFÁFˆÁFÁFzÁFsÁFlÁFeÁF^ÁFWÁFPÁFIÁFBÁF;ÁF4ÁF-ÁF&ÁFÁFÁFÁF ÁFÁFüÀFõÀFîÀFçÀFàÀFÙÀFÒÀFËÀFÄÀF½ÀF¶ÀF¯ÀF¨ÀF¡ÀFšÀF“ÀFŒÀF…ÀF~ÀFwÀFpÀFiÀFbÀF[ÀFTÀFMÀFFÀF?ÀF8ÀF1ÀF*ÀF#ÀFÀFÀFÀFÀFÀFù¿Fò¿Fë¿Fä¿FÝ¿FÖ¿FÏ¿FÈ¿FÁ¿Fº¿F³¿F¬¿F¥¿Fž¿F—¿F¿F‰¿F‚¿F{¿Ft¿Fm¿Ff¿F_¿FX¿FQ¿FJ¿FC¿F<¿F5¿F.¿F'¿F ¿F¿F¿F ¿F¿Fý¾Fö¾Fï¾Fè¾Fá¾FÚ¾FÓ¾F̾FžF¾¾F·¾F°¾F©¾F¢¾F›¾F”¾F¾F†¾F¾Fx¾Fq¾Fj¾Fc¾F\¾FU¾FN¾FG¾F@¾F9¾F2¾F+¾F$¾F¾F¾F¾F¾F¾Fú½Fó½Fì½Få½FÞ½F×½FнFɽF½F»½F´½F­½F¦½FŸ½F˜½F‘½FнFƒ½F|½Fu½Fn½Fg½F`½FY½FR½FK½FD½F=½F6½F/½F(½F!½F½F½F ½F½Fþ¼F÷¼Fð¼Fé¼Fâ¼FÛ¼FÔ¼FͼFƼF¿¼F¸¼F±¼Fª¼F£¼Fœ¼F•¼F޼F‡¼F€¼Fy¼Fr¼Fk¼Fd¼F]¼FV¼FO¼FH¼FA¼F:¼F3¼F,¼F%¼F¼F¼F¼F ¼F¼Fû»Fô»Fí»Fæ»Fß»FØ»FÑ»FÊ»FûF¼»Fµ»F®»F§»F »F™»F’»F‹»F„»F}»Fv»Fo»Fh»Fa»FZ»FS»FL»FE»F>»F7»F0»F)»F"»F»F»F »F»FÿºFøºFñºFêºFãºFܺFÕºFκFǺFÀºF¹ºF²ºF«ºF¤ºFºF–ºFºFˆºFºFzºFsºFlºFeºF^ºFWºFPºFIºFBºF;ºF4ºF-ºF&ºFºFºFºF ºFºFü¹Fõ¹Fî¹Fç¹Fà¹FÙ¹FÒ¹F˹FĹF½¹F¶¹F¯¹F¨¹F¡¹Fš¹F“¹FŒ¹F…¹F~¹Fw¹Fp¹Fi¹Fb¹F[¹FT¹FM¹FF¹F?¹F8¹F1¹F*¹F#¹F¹F¹F¹F¹F¹Fù¸Fò¸Fë¸Fä¸FݸFÖ¸FϸFȸFÁ¸Fº¸F³¸F¬¸F¥¸Fž¸F—¸F¸F‰¸F‚¸F{¸Ft¸Fm¸Ff¸F_¸FX¸FQ¸FJ¸FC¸F<¸F5¸F.¸F'¸F ¸F¸F¸F ¸F¸Fý·Fö·Fï·Fè·Fá·FÚ·FÓ·FÌ·FÅ·F¾·F··F°·F©·F¢·F›·F”·F·F†·F·Fx·Fq·Fj·Fc·F\·FU·FN·FG·F@·F9·F2·F+·F$·F·F·F·F·F·Fú¶Fó¶Fì¶Få¶FÞ¶F×¶FжFɶF¶F»¶F´¶F­¶F¦¶FŸ¶F˜¶F‘¶FжFƒ¶F|¶Fu¶Fn¶Fg¶F`¶FY¶FR¶FK¶FD¶F=¶F6¶F/¶F(¶F!¶F¶F¶F ¶F¶FþµF÷µFðµFéµFâµFÛµFÔµF͵FƵF¿µF¸µF±µFªµF£µFœµF•µF޵F‡µF€µFyµFrµFkµFdµF]µFVµFOµFHµFAµF:µF3µF,µF%µFµFµFµF µFµFû´Fô´Fí´Fæ´Fß´FØ´FÑ´FÊ´FôF¼´Fµ´F®´F§´F ´F™´F’´F‹´F„´F}´Fv´Fo´Fh´Fa´FZ´FS´FL´FE´F>´F7´F0´F)´F"´F´F´F ´F´Fÿ³Fø³Fñ³Fê³Fã³FܳFÕ³FγFdzFÀ³F¹³F²³F«³F¤³F³F–³F³Fˆ³F³Fz³Fs³Fl³Fe³F^³FW³FP³FI³FB³F;³F4³F-³F&³F³F³F³F ³F³Fü²Fõ²Fî²Fç²Fà²FÙ²FÒ²F˲FIJF½²F¶²F¯²F¨²F¡²Fš²F“²FŒ²F…²F~²Fw²Fp²Fi²Fb²F[²FT²FM²FF²F?²F8²F1²F*²F#²F²F²F²F²F²Fù±Fò±Fë±Fä±FݱFÖ±FϱFȱFÁ±Fº±F³±F¬±F¥±Fž±F—±F±F‰±F‚±F{±Ft±Fm±Ff±F_±FX±FQ±FJ±FC±F<±F5±F.±F'±F ±F±F±F ±F±Fý°Fö°Fï°Fè°Fá°FÚ°FÓ°F̰FŰF¾°F·°F°°F©°F¢°F›°F”°F°F†°F°Fx°Fq°Fj°Fc°F\°FU°FN°FG°F@°F9°F2°F+°F$°F°F°F°F°F°Fú¯Fó¯Fì¯Få¯FÞ¯FׯFЯFɯF¯F»¯F´¯F­¯F¦¯FŸ¯F˜¯F‘¯FНFƒ¯F|¯Fu¯Fn¯Fg¯F`¯FY¯FR¯FK¯FD¯F=¯F6¯F/¯F(¯F!¯F¯F¯F ¯F¯Fþ®F÷®Fð®Fé®Fâ®FÛ®FÔ®FÍ®FÆ®F¿®F¸®F±®Fª®F£®Fœ®F•®FŽ®F‡®F€®Fy®Fr®Fk®Fd®F]®FV®FO®FH®FA®F:®F3®F,®F%®F®F®F®F ®F®Fû­Fô­Fí­Fæ­Fß­FØ­FÑ­FÊ­FíF¼­Fµ­F®­F§­F ­F™­F’­F‹­F„­F}­Fv­Fo­Fh­Fa­FZ­FS­FL­FE­F>­F7­F0­F)­F"­F­F­F ­F­Fÿ¬Fø¬Fñ¬Fê¬Fã¬FܬFÕ¬FάFǬFÀ¬F¹¬F²¬F«¬F¤¬F¬F–¬F¬Fˆ¬F¬Fz¬Fs¬Fl¬Fe¬F^¬FW¬FP¬FI¬FB¬F;¬F4¬F-¬F&¬F¬F¬F¬F ¬F¬Fü«Fõ«Fî«Fç«Fà«FÙ«FÒ«FË«FÄ«F½«F¶«F¯«F¨«F¡«Fš«F“«FŒ«F…«F~«Fw«Fp«Fi«Fb«F[«FT«FM«FF«F?«F8«F1«F*«F#«F«F«F«F«F«FùªFòªFëªFäªFݪFÖªFϪFȪFÁªFºªF³ªF¬ªF¥ªFžªF—ªFªF‰ªF‚ªF{ªFtªFmªFfªF_ªFXªFQªFJªFCªF<ªF5ªF.ªF'ªF ªFªFªF ªFªFý©Fö©Fï©Fè©Fá©FÚ©FÓ©FÌ©FÅ©F¾©F·©F°©F©©F¢©F›©F”©F©F†©F©Fx©Fq©Fj©Fc©F\©FU©FN©FG©F@©F9©F2©F+©F$©F©F©F©F©F©Fú¨Fó¨Fì¨Få¨FÞ¨FרFШFɨF¨F»¨F´¨F­¨F¦¨FŸ¨F˜¨F‘¨FЍFƒ¨F|¨Fu¨Fn¨Fg¨F`¨FY¨FR¨FK¨FD¨F=¨F6¨F/¨F(¨F!¨F¨F¨F ¨F¨Fþ§F÷§Fð§Fé§Fâ§FÛ§FÔ§FͧFƧF¿§F¸§F±§Fª§F£§Fœ§F•§FާF‡§F€§Fy§Fr§Fk§Fd§F]§FV§FO§FH§FA§F:§F3§F,§F%§F§F§F§F §F§Fû¦Fô¦Fí¦Fæ¦FߦFئFѦFʦFæF¼¦Fµ¦F®¦F§¦F ¦F™¦F’¦F‹¦F„¦F}¦Fv¦Fo¦Fh¦Fa¦FZ¦FS¦FL¦FE¦F>¦F7¦F0¦F)¦F"¦F¦F¦F ¦F¦Fÿ¥Fø¥Fñ¥Fê¥Fã¥FÜ¥FÕ¥FÎ¥FÇ¥FÀ¥F¹¥F²¥F«¥F¤¥F¥F–¥F¥Fˆ¥F¥Fz¥Fs¥Fl¥Fe¥F^¥FW¥FP¥FI¥FB¥F;¥F4¥F-¥F&¥F¥F¥F¥F ¥F¥Fü¤Fõ¤Fî¤Fç¤Fà¤FÙ¤FÒ¤FˤFĤF½¤F¶¤F¯¤F¨¤F¡¤Fš¤F“¤FŒ¤F…¤F~¤Fw¤Fp¤Fi¤Fb¤F[¤FT¤FM¤FF¤F?¤F8¤F1¤F*¤F#¤F¤F¤F¤F¤F¤Fù£Fò£Fë£Fä£FÝ£FÖ£FÏ£FÈ£FÁ£Fº£F³£F¬£F¥£Fž£F—£F£F‰£F‚£F{£Ft£Fm£Ff£F_£FX£FQ£FJ£FC£F<£F5£F.£F'£F £F£F£F £F£Fý¢Fö¢Fï¢Fè¢Fá¢FÚ¢FÓ¢FÌ¢FÅ¢F¾¢F·¢F°¢F©¢F¢¢F›¢F”¢F¢F†¢F¢Fx¢Fq¢Fj¢Fc¢F\¢FU¢FN¢FG¢F@¢F9¢F2¢F+¢F$¢F¢F¢F¢F¢F¢Fú¡Fó¡Fì¡Få¡FÞ¡FסFСFÉ¡F¡F»¡F´¡F­¡F¦¡FŸ¡F˜¡F‘¡FŠ¡Fƒ¡F|¡Fu¡Fn¡Fg¡F`¡FY¡FR¡FK¡FD¡F=¡F6¡F/¡F(¡F!¡F¡F¡F ¡F¡Fþ F÷ Fð Fé Fâ FÛ FÔ FÍ FÆ F¿ F¸ F± Fª F£ Fœ F• FŽ F‡ F€ Fy Fr Fk Fd F] FV FO FH FA F: F3 F, F% F F F F  F FûŸFôŸFíŸFæŸFߟFØŸFÑŸFÊŸFßF¼ŸFµŸF®ŸF§ŸF ŸF™ŸF’ŸF‹ŸF„ŸF}ŸFvŸFoŸFhŸFaŸFZŸFSŸFLŸFEŸF>ŸF7ŸF0ŸF)ŸF"ŸFŸFŸF ŸFŸFÿžFøžFñžFêžFãžFÜžFÕžFΞFÇžFÀžF¹žF²žF«žF¤žFžF–žFžFˆžFžFzžFsžFlžFežF^žFWžFPžFIžFBžF;žF4žF-žF&žFžFžFžF žFžFüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùœFòœFëœFäœFÝœFÖœFÏœFÈœFÁœFºœF³œF¬œF¥œFžœF—œFœF‰œF‚œF{œFtœFmœFfœF_œFXœFQœFJœFCœF<œF5œF.œF'œF œFœFœF œFœFý›Fö›Fï›Fè›Fá›FÚ›FÓ›FÌ›FÅ›F¾›F·›F°›F©›F¢›F››F”›F›F†›F›Fx›Fq›Fj›Fc›F\›FU›FN›FG›F@›F9›F2›F+›F$›F›F›F›F›F›FúšFóšFìšFåšFÞšFךFКFÉšFšF»šF´šF­šF¦šFŸšF˜šF‘šFŠšFƒšF|šFušFnšFgšF`šFYšFRšFKšFDšF=šF6šF/šF(šF!šFšFšF šFšFþ™F÷™Fð™Fé™Fâ™FÛ™FÔ™FÍ™FÆ™F¿™F¸™F±™Fª™F£™Fœ™F•™FŽ™F‡™F€™Fy™Fr™Fk™Fd™F]™FV™FO™FH™FA™F:™F3™F,™F%™F™F™F™F ™F™Fû˜Fô˜Fí˜Fæ˜FߘFؘFјFʘFØF¼˜Fµ˜F®˜F§˜F ˜F™˜F’˜F‹˜F„˜F}˜Fv˜Fo˜Fh˜Fa˜FZ˜FS˜FL˜FE˜F>˜F7˜F0˜F)˜F"˜F˜F˜F ˜F˜Fÿ—Fø—Fñ—Fê—Fã—FÜ—FÕ—FΗFÇ—FÀ—F¹—F²—F«—F¤—F—F–—F—Fˆ—F—Fz—Fs—Fl—Fe—F^—FW—FP—FI—FB—F;—F4—F-—F&—F—F—F—F —F—Fü–Fõ–Fî–Fç–Fà–FÙ–FÒ–FË–FÄ–F½–F¶–F¯–F¨–F¡–Fš–F“–FŒ–F…–F~–Fw–Fp–Fi–Fb–F[–FT–FM–FF–F?–F8–F1–F*–F#–F–F–F–F–F–Fù•Fò•Fë•Fä•FÝ•FÖ•FÏ•FÈ•FÁ•Fº•F³•F¬•F¥•Fž•F—•F•F‰•F‚•F{•Ft•Fm•Ff•F_•FX•FQ•FJ•FC•F<•F5•F.•F'•F •F•F•F •F•Fý”Fö”Fï”Fè”Fá”FÚ”FÓ”FÌ”FÅ”F¾”F·”F°”F©”F¢”F›”F””F”F†”F”Fx”Fq”Fj”Fc”F\”FU”FN”FG”F@”F9”F2”F+”F$”F”F”F”F”F”Fú“Fó“Fì“Få“FÞ“FדFГFÉ“F“F»“F´“F­“F¦“FŸ“F˜“F‘“FŠ“Fƒ“F|“Fu“Fn“Fg“F`“FY“FR“FK“FD“F=“F6“F/“F(“F!“F“F“F “F“Fþ’F÷’Fð’Fé’Fâ’FÛ’FÔ’FÍ’FÆ’F¿’F¸’F±’Fª’F£’Fœ’F•’FŽ’F‡’F€’Fy’Fr’Fk’Fd’F]’FV’FO’FH’FA’F:’F3’F,’F%’F’F’F’F ’F’Fû‘Fô‘Fí‘Fæ‘Fß‘FØ‘FÑ‘FÊ‘FÑF¼‘Fµ‘F®‘F§‘F ‘F™‘F’‘F‹‘F„‘F}‘Fv‘Fo‘Fh‘Fa‘FZ‘FS‘FL‘FE‘F>‘F7‘F0‘F)‘F"‘F‘F‘F ‘F‘FÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùŽFòŽFëŽFäŽFÝŽFÖŽFÏŽFÈŽFÁŽFºŽF³ŽF¬ŽF¥ŽFžŽF—ŽFŽF‰ŽF‚ŽF{ŽFtŽFmŽFfŽF_ŽFXŽFQŽFJŽFCŽF<ŽF5ŽF.ŽF'ŽF ŽFŽFŽF ŽFŽFýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúŒFóŒFìŒFåŒFÞŒF׌FÐŒFÉŒFÂŒF»ŒF´ŒF­ŒF¦ŒFŸŒF˜ŒF‘ŒFŠŒFƒŒF|ŒFuŒFnŒFgŒF`ŒFYŒFRŒFKŒFDŒF=ŒF6ŒF/ŒF(ŒF!ŒFŒFŒF ŒFŒFþ‹F÷‹Fð‹Fé‹Fâ‹FÛ‹FÔ‹FÍ‹FÆ‹F¿‹F¸‹F±‹Fª‹F£‹Fœ‹F•‹FŽ‹F‡‹F€‹Fy‹Fr‹Fk‹Fd‹F]‹FV‹FO‹FH‹FA‹F:‹F3‹F,‹F%‹F‹F‹F‹F ‹F‹FûŠFôŠFíŠFæŠFߊFØŠFÑŠFÊŠFÊF¼ŠFµŠF®ŠF§ŠF ŠF™ŠF’ŠF‹ŠF„ŠF}ŠFvŠFoŠFhŠFaŠFZŠFSŠFLŠFEŠF>ŠF7ŠF0ŠF)ŠF"ŠFŠFŠF ŠFŠFÿ‰Fø‰Fñ‰Fê‰Fã‰F܉FÕ‰FΉFljFÀ‰F¹‰F²‰F«‰F¤‰F‰F–‰F‰Fˆ‰F‰Fz‰Fs‰Fl‰Fe‰F^‰FW‰FP‰FI‰FB‰F;‰F4‰F-‰F&‰F‰F‰F‰F ‰F‰FüˆFõˆFîˆFçˆFàˆFÙˆFÒˆFˈFĈF½ˆF¶ˆF¯ˆF¨ˆF¡ˆFšˆF“ˆFŒˆF…ˆF~ˆFwˆFpˆFiˆFbˆF[ˆFTˆFMˆFFˆF?ˆF8ˆF1ˆF*ˆF#ˆFˆFˆFˆFˆFˆFù‡Fò‡Fë‡Fä‡F݇FÖ‡FχFȇFÁ‡Fº‡F³‡F¬‡F¥‡Fž‡F—‡F‡F‰‡F‚‡F{‡Ft‡Fm‡Ff‡F_‡FX‡FQ‡FJ‡FC‡F<‡F5‡F.‡F'‡F ‡F‡F‡F ‡F‡Fý†Fö†Fï†Fè†Fá†FÚ†FÓ†F̆FņF¾†F·†F°†F©†F¢†F›†F”†F†F††F†Fx†Fq†Fj†Fc†F\†FU†FN†FG†F@†F9†F2†F+†F$†F†F†F†F†F†Fú…Fó…Fì…Få…FÞ…F×…FÐ…FÉ…FÂ…F»…F´…F­…F¦…FŸ…F˜…F‘…FŠ…Fƒ…F|…Fu…Fn…Fg…F`…FY…FR…FK…FD…F=…F6…F/…F(…F!…F…F…F …F…Fþ„F÷„Fð„Fé„Fâ„FÛ„FÔ„FÍ„FÆ„F¿„F¸„F±„Fª„F£„Fœ„F•„FŽ„F‡„F€„Fy„Fr„Fk„Fd„F]„FV„FO„FH„FA„F:„F3„F,„F%„F„F„F„F „F„FûƒFôƒFíƒFæƒF߃F؃FуFʃFÃF¼ƒFµƒF®ƒF§ƒF ƒF™ƒF’ƒF‹ƒF„ƒF}ƒFvƒFoƒFhƒFaƒFZƒFSƒFLƒFEƒF>ƒF7ƒF0ƒF)ƒF"ƒFƒFƒF ƒFƒFÿ‚Fø‚Fñ‚Fê‚Fã‚FÜ‚FÕ‚F΂FÇ‚FÀ‚F¹‚F²‚F«‚F¤‚F‚F–‚F‚Fˆ‚F‚Fz‚Fs‚Fl‚Fe‚F^‚FW‚FP‚FI‚FB‚F;‚F4‚F-‚F&‚F‚F‚F‚F ‚F‚FüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFù€Fò€Fë€Fä€FÝ€FÖ€FÏ€FÈ€FÁ€Fº€F³€F¬€F¥€Fž€F—€F€F‰€F‚€F{€Ft€Fm€Ff€F_€FX€FQ€FJ€FC€F<€F5€F.€F'€F €F€F€F €F€FýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFú~Fó~Fì~Få~FÞ~F×~FÐ~FÉ~FÂ~F»~F´~F­~F¦~FŸ~F˜~F‘~FŠ~Fƒ~F|~Fu~Fn~Fg~F`~FY~FR~FK~FD~F=~F6~F/~F(~F!~F~F~F ~F~Fþ}F÷}Fð}Fé}Fâ}FÛ}FÔ}FÍ}FÆ}F¿}F¸}F±}Fª}F£}Fœ}F•}FŽ}F‡}F€}Fy}Fr}Fk}Fd}F]}FV}FO}FH}FA}F:}F3}F,}F%}F}F}F}F }F}Fû|Fô|Fí|Fæ|Fß|FØ|FÑ|FÊ|FÃ|F¼|Fµ|F®|F§|F |F™|F’|F‹|F„|F}|Fv|Fo|Fh|Fa|FZ|FS|FL|FE|F>|F7|F0|F)|F"|F|F|F |F|Fÿ{Fø{Fñ{Fê{Fã{FÜ{FÕ{FÎ{FÇ{FÀ{F¹{F²{F«{F¤{F{F–{F{Fˆ{F{Fz{Fs{Fl{Fe{F^{FW{FP{FI{FB{F;{F4{F-{F&{F{F{F{F {F{FüzFõzFîzFçzFàzFÙzFÒzFËzFÄzF½zF¶zF¯zF¨zF¡zFšzF“zFŒzF…zF~zFwzFpzFizFbzF[zFTzFMzFFzF?zF8zF1zF*zF#zFzFzFzFzFzFùyFòyFëyFäyFÝyFÖyFÏyFÈyFÁyFºyF³yF¬yF¥yFžyF—yFyF‰yF‚yF{yFtyFmyFfyF_yFXyFQyFJyFCyFuF7uF0uF)uF"uFuFuF uFuFÿtFøtFñtFêtFãtFÜtFÕtFÎtFÇtFÀtF¹tF²tF«tF¤tFtF–tFtFˆtFtFztFstFltFetF^tFWtFPtFItFBtF;tF4tF-tF&tFtFtFtF tFtFüsFõsFîsFçsFàsFÙsFÒsFËsFÄsF½sF¶sF¯sF¨sF¡sFšsF“sFŒsF…sF~sFwsFpsFisFbsF[sFTsFMsFFsF?sF8sF1sF*sF#sFsFsFsFsFsFùrFòrFërFärFÝrFÖrFÏrFÈrFÁrFºrF³rF¬rF¥rFžrF—rFrF‰rF‚rF{rFtrFmrFfrF_rFXrFQrFJrFCrFnF7nF0nF)nF"nFnFnF nFnFÿmFømFñmFêmFãmFÜmFÕmFÎmFÇmFÀmF¹mF²mF«mF¤mFmF–mFmFˆmFmFzmFsmFlmFemF^mFWmFPmFImFBmF;mF4mF-mF&mFmFmFmF mFmFülFõlFîlFçlFàlFÙlFÒlFËlFÄlF½lF¶lF¯lF¨lF¡lFšlF“lFŒlF…lF~lFwlFplFilFblF[lFTlFMlFFlF?lF8lF1lF*lF#lFlFlFlFlFlFùkFòkFëkFäkFÝkFÖkFÏkFÈkFÁkFºkF³kF¬kF¥kFžkF—kFkF‰kF‚kF{kFtkFmkFfkF_kFXkFQkFJkFCkFgF7gF0gF)gF"gFgFgF gFgFÿfFøfFñfFêfFãfFÜfFÕfFÎfFÇfFÀfF¹fF²fF«fF¤fFfF–fFfFˆfFfFzfFsfFlfFefF^fFWfFPfFIfFBfF;fF4fF-fF&fFfFfFfF fFfFüeFõeFîeFçeFàeFÙeFÒeFËeFÄeF½eF¶eF¯eF¨eF¡eFšeF“eFŒeF…eF~eFweFpeFieFbeF[eFTeFMeFFeF?eF8eF1eF*eF#eFeFeFeFeFeFùdFòdFëdFädFÝdFÖdFÏdFÈdFÁdFºdF³dF¬dF¥dFždF—dFdF‰dF‚dF{dFtdFmdFfdF_dFXdFQdFJdFCdF`F7`F0`F)`F"`F`F`F `F`Fÿ_Fø_Fñ_Fê_Fã_FÜ_FÕ_FÎ_FÇ_FÀ_F¹_F²_F«_F¤_F_F–_F_Fˆ_F_Fz_Fs_Fl_Fe_F^_FW_FP_FI_FB_F;_F4_F-_F&_F_F_F_F _F_Fü^Fõ^Fî^Fç^Fà^FÙ^FÒ^FË^FÄ^F½^F¶^F¯^F¨^F¡^Fš^F“^FŒ^F…^F~^Fw^Fp^Fi^Fb^F[^FT^FM^FF^F?^F8^F1^F*^F#^F^F^F^F^F^Fù]Fò]Fë]Fä]FÝ]FÖ]FÏ]FÈ]FÁ]Fº]F³]F¬]F¥]Fž]F—]F]F‰]F‚]F{]Ft]Fm]Ff]F_]FX]FQ]FJ]FC]F<]F5]F.]F']F ]F]F]F ]F]Fý\Fö\Fï\Fè\Fá\FÚ\FÓ\FÌ\FÅ\F¾\F·\F°\F©\F¢\F›\F”\F\F†\F\Fx\Fq\Fj\Fc\F\\FU\FN\FG\F@\F9\F2\F+\F$\F\F\F\F\F\Fú[Fó[Fì[Få[FÞ[F×[FÐ[FÉ[FÂ[F»[F´[F­[F¦[FŸ[F˜[F‘[FŠ[Fƒ[F|[Fu[Fn[Fg[F`[FY[FR[FK[FD[F=[F6[F/[F([F![F[F[F [F[FþZF÷ZFðZFéZFâZFÛZFÔZFÍZFÆZF¿ZF¸ZF±ZFªZF£ZFœZF•ZFŽZF‡ZF€ZFyZFrZFkZFdZF]ZFVZFOZFHZFAZF:ZF3ZF,ZF%ZFZFZFZF ZFZFûYFôYFíYFæYFßYFØYFÑYFÊYFÃYF¼YFµYF®YF§YF YF™YF’YF‹YF„YF}YFvYFoYFhYFaYFZYFSYFLYFEYF>YF7YF0YF)YF"YFYFYF YFYFÿXFøXFñXFêXFãXFÜXFÕXFÎXFÇXFÀXF¹XF²XF«XF¤XFXF–XFXFˆXFXFzXFsXFlXFeXF^XFWXFPXFIXFBXF;XF4XF-XF&XFXFXFXF XFXFüWFõWFîWFçWFàWFÙWFÒWFËWFÄWF½WF¶WF¯WF¨WF¡WFšWF“WFŒWF…WF~WFwWFpWFiWFbWF[WFTWFMWFFWF?WF8WF1WF*WF#WFWFWFWFWFWFùVFòVFëVFäVFÝVFÖVFÏVFÈVFÁVFºVF³VF¬VF¥VFžVF—VFVF‰VF‚VF{VFtVFmVFfVF_VFXVFQVFJVFCVFRF7RF0RF)RF"RFRFRF RFRFÿQFøQFñQFêQFãQFÜQFÕQFÎQFÇQFÀQF¹QF²QF«QF¤QFQF–QFQFˆQFQFzQFsQFlQFeQF^QFWQFPQFIQFBQF;QF4QF-QF&QFQFQFQF QFQFüPFõPFîPFçPFàPFÙPFÒPFËPFÄPF½PF¶PF¯PF¨PF¡PFšPF“PFŒPF…PF~PFwPFpPFiPFbPF[PFTPFMPFFPF?PF8PF1PF*PF#PFPFPFPFPFPFùOFòOFëOFäOFÝOFÖOFÏOFÈOFÁOFºOF³OF¬OF¥OFžOF—OFOF‰OF‚OF{OFtOFmOFfOF_OFXOFQOFJOFCOFKF7KF0KF)KF"KFKFKF KFKFÿJFøJFñJFêJFãJFÜJFÕJFÎJFÇJFÀJF¹JF²JF«JF¤JFJF–JFJFˆJFJFzJFsJFlJFeJF^JFWJFPJFIJFBJF;JF4JF-JF&JFJFJFJF JFJFüIFõIFîIFçIFàIFÙIFÒIFËIFÄIF½IF¶IF¯IF¨IF¡IFšIF“IFŒIF…IF~IFwIFpIFiIFbIF[IFTIFMIFFIF?IF8IF1IF*IF#IFIFIFIFIFIFùHFòHFëHFäHFÝHFÖHFÏHFÈHFÁHFºHF³HF¬HF¥HFžHF—HFHF‰HF‚HF{HFtHFmHFfHF_HFXHFQHFJHFCHFDF7DF0DF)DF"DFDFDF DFDFÿCFøCFñCFêCFãCFÜCFÕCFÎCFÇCFÀCF¹CF²CF«CF¤CFCF–CFCFˆCFCFzCFsCFlCFeCF^CFWCFPCFICFBCF;CF4CF-CF&CFCFCFCF CFCFüBFõBFîBFçBFàBFÙBFÒBFËBFÄBF½BF¶BF¯BF¨BF¡BFšBF“BFŒBF…BF~BFwBFpBFiBFbBF[BFTBFMBFFBF?BF8BF1BF*BF#BFBFBFBFBFBFùAFòAFëAFäAFÝAFÖAFÏAFÈAFÁAFºAF³AF¬AF¥AFžAF—AFAF‰AF‚AF{AFtAFmAFfAF_AFXAFQAFJAFCAFF÷>Fð>Fé>Fâ>FÛ>FÔ>FÍ>FÆ>F¿>F¸>F±>Fª>F£>Fœ>F•>FŽ>F‡>F€>Fy>Fr>Fk>Fd>F]>FV>FO>FH>FA>F:>F3>F,>F%>F>F>F>F >F>Fû=Fô=Fí=Fæ=Fß=FØ=FÑ=FÊ=FÃ=F¼=Fµ=F®=F§=F =F™=F’=F‹=F„=F}=Fv=Fo=Fh=Fa=FZ=FS=FL=FE=F>=F7=F0=F)=F"=F=F=F =F=Fÿ6F76F06F)6F"6F6F6F 6F6Fÿ5Fø5Fñ5Fê5Fã5FÜ5FÕ5FÎ5FÇ5FÀ5F¹5F²5F«5F¤5F5F–5F5Fˆ5F5Fz5Fs5Fl5Fe5F^5FW5FP5FI5FB5F;5F45F-5F&5F5F5F5F 5F5Fü4Fõ4Fî4Fç4Fà4FÙ4FÒ4FË4FÄ4F½4F¶4F¯4F¨4F¡4Fš4F“4FŒ4F…4F~4Fw4Fp4Fi4Fb4F[4FT4FM4FF4F?4F84F14F*4F#4F4F4F4F4F4Fù3Fò3Fë3Fä3FÝ3FÖ3FÏ3FÈ3FÁ3Fº3F³3F¬3F¥3Fž3F—3F3F‰3F‚3F{3Ft3Fm3Ff3F_3FX3FQ3FJ3FC3F<3F53F.3F'3F 3F3F3F 3F3Fý2Fö2Fï2Fè2Fá2FÚ2FÓ2FÌ2FÅ2F¾2F·2F°2F©2F¢2F›2F”2F2F†2F2Fx2Fq2Fj2Fc2F\2FU2FN2FG2F@2F92F22F+2F$2F2F2F2F2F2Fú1Fó1Fì1Få1FÞ1F×1FÐ1FÉ1FÂ1F»1F´1F­1F¦1FŸ1F˜1F‘1FŠ1Fƒ1F|1Fu1Fn1Fg1F`1FY1FR1FK1FD1F=1F61F/1F(1F!1F1F1F 1F1Fþ0F÷0Fð0Fé0Fâ0FÛ0FÔ0FÍ0FÆ0F¿0F¸0F±0Fª0F£0Fœ0F•0FŽ0F‡0F€0Fy0Fr0Fk0Fd0F]0FV0FO0FH0FA0F:0F30F,0F%0F0F0F0F 0F0Fû/Fô/Fí/Fæ/Fß/FØ/FÑ/FÊ/FÃ/F¼/Fµ/F®/F§/F /F™/F’/F‹/F„/F}/Fv/Fo/Fh/Fa/FZ/FS/FL/FE/F>/F7/F0/F)/F"/F/F/F /F/Fÿ.Fø.Fñ.Fê.Fã.FÜ.FÕ.FÎ.FÇ.FÀ.F¹.F².F«.F¤.F.F–.F.Fˆ.F.Fz.Fs.Fl.Fe.F^.FW.FP.FI.FB.F;.F4.F-.F&.F.F.F.F .F.Fü-Fõ-Fî-Fç-Fà-FÙ-FÒ-FË-FÄ-F½-F¶-F¯-F¨-F¡-Fš-F“-FŒ-F…-F~-Fw-Fp-Fi-Fb-F[-FT-FM-FF-F?-F8-F1-F*-F#-F-F-F-F-F-Fù,Fò,Fë,Fä,FÝ,FÖ,FÏ,FÈ,FÁ,Fº,F³,F¬,F¥,Fž,F—,F,F‰,F‚,F{,Ft,Fm,Ff,F_,FX,FQ,FJ,FC,F<,F5,F.,F',F ,F,F,F ,F,Fý+Fö+Fï+Fè+Fá+FÚ+FÓ+FÌ+FÅ+F¾+F·+F°+F©+F¢+F›+F”+F+F†+F+Fx+Fq+Fj+Fc+F\+FU+FN+FG+F@+F9+F2+F++F$+F+F+F+F+F+Fú*Fó*Fì*Få*FÞ*F×*FÐ*FÉ*FÂ*F»*F´*F­*F¦*FŸ*F˜*F‘*FŠ*Fƒ*F|*Fu*Fn*Fg*F`*FY*FR*FK*FD*F=*F6*F/*F(*F!*F*F*F *F*Fþ)F÷)Fð)Fé)Fâ)FÛ)FÔ)FÍ)FÆ)F¿)F¸)F±)Fª)F£)Fœ)F•)FŽ)F‡)F€)Fy)Fr)Fk)Fd)F])FV)FO)FH)FA)F:)F3)F,)F%)F)F)F)F )F)Fû(Fô(Fí(Fæ(Fß(FØ(FÑ(FÊ(FÃ(F¼(Fµ(F®(F§(F (F™(F’(F‹(F„(F}(Fv(Fo(Fh(Fa(FZ(FS(FL(FE(F>(F7(F0(F)(F"(F(F(F (F(Fÿ'Fø'Fñ'Fê'Fã'FÜ'FÕ'FÎ'FÇ'FÀ'F¹'F²'F«'F¤'F'F–'F'Fˆ'F'Fz'Fs'Fl'Fe'F^'FW'FP'FI'FB'F;'F4'F-'F&'F'F'F'F 'F'Fü&Fõ&Fî&Fç&Fà&FÙ&FÒ&FË&FÄ&F½&F¶&F¯&F¨&F¡&Fš&F“&FŒ&F…&F~&Fw&Fp&Fi&Fb&F[&FT&FM&FF&F?&F8&F1&F*&F#&F&F&F&F&F&Fù%Fò%Fë%Fä%FÝ%FÖ%FÏ%FÈ%FÁ%Fº%F³%F¬%F¥%Fž%F—%F%F‰%F‚%F{%Ft%Fm%Ff%F_%FX%FQ%FJ%FC%F<%F5%F.%F'%F %F%F%F %F%Fý$Fö$Fï$Fè$Fá$FÚ$FÓ$FÌ$FÅ$F¾$F·$F°$F©$F¢$F›$F”$F$F†$F$Fx$Fq$Fj$Fc$F\$FU$FN$FG$F@$F9$F2$F+$F$$F$F$F$F$F$Fú#Fó#Fì#Få#FÞ#F×#FÐ#FÉ#FÂ#F»#F´#F­#F¦#FŸ#F˜#F‘#FŠ#Fƒ#F|#Fu#Fn#Fg#F`#FY#FR#FK#FD#F=#F6#F/#F(#F!#F#F#F #F#Fþ"F÷"Fð"Fé"Fâ"FÛ"FÔ"FÍ"FÆ"F¿"F¸"F±"Fª"F£"Fœ"F•"FŽ"F‡"F€"Fy"Fr"Fk"Fd"F]"FV"FO"FH"FA"F:"F3"F,"F%"F"F"F"F "F"Fû!Fô!Fí!Fæ!Fß!FØ!FÑ!FÊ!FÃ!F¼!Fµ!F®!F§!F !F™!F’!F‹!F„!F}!Fv!Fo!Fh!Fa!FZ!FS!FL!FE!F>!F7!F0!F)!F"!F!F!F !F!Fÿ Fø Fñ Fê Fã FÜ FÕ FÎ FÇ FÀ F¹ F² F« F¤ F F– F Fˆ F Fz Fs Fl Fe F^ FW FP FI FB F; F4 F- F& F F F F F FüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúFóFìFåFÞF×FÐFÉFÂF»F´F­F¦FŸF˜F‘FŠFƒF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFþF÷FðFéFâFÛFÔFÍFÆF¿F¸F±FªF£FœF•FŽF‡F€FyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFûFôFíFæFßFØFÑFÊFÃF¼FµF®F§F F™F’F‹F„F}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúFóFìFåFÞF×FÐFÉFÂF»F´F­F¦FŸF˜F‘FŠFƒF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFþF÷FðFéFâFÛFÔFÍFÆF¿F¸F±FªF£FœF•FŽF‡F€FyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFûFôFíFæFßFØFÑFÊFÃF¼FµF®F§F F™F’F‹F„F}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúFóFìFåFÞF×FÐFÉFÂF»F´F­F¦FŸF˜F‘FŠFƒF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFþ F÷ Fð Fé Fâ FÛ FÔ FÍ FÆ F¿ F¸ F± Fª F£ Fœ F• FŽ F‡ F€ Fy Fr Fk Fd F] FV FO FH FA F: F3 F, F% F F F F F Fû Fô Fí Fæ Fß FØ FÑ FÊ Fà F¼ Fµ F® F§ F  F™ F’ F‹ F„ F} Fv Fo Fh Fa FZ FS FL FE F> F7 F0 F) F" F F F F Fÿ Fø Fñ Fê Fã FÜ FÕ FÎ FÇ FÀ F¹ F² F« F¤ F F– F Fˆ F Fz Fs Fl Fe F^ FW FP FI FB F; F4 F- F& F F F F F Fü Fõ Fî Fç Fà FÙ FÒ FË FÄ F½ F¶ F¯ F¨ F¡ Fš F“ FŒ F… F~ Fw Fp Fi Fb F[ FT FM FF F? F8 F1 F* F# F F F F F Fù Fò Fë Fä FÝ FÖ FÏ FÈ FÁ Fº F³ F¬ F¥ Fž F— F F‰ F‚ F{ Ft Fm Ff F_ FX FQ FJ FC F< F5 F. F' F F F F F FýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúFóFìFåFÞF×FÐFÉFÂF»F´F­F¦FŸF˜F‘FŠFƒF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFþF÷FðFéFâFÛFÔFÍFÆF¿F¸F±FªF£FœF•FŽF‡F€FyFrFkFdF]FVFOFHFAF:F3F,F%FFFF FFûFôFíFæFßFØFÑFÊFÃF¼FµF®F§F F™F’F‹F„F}FvFoFhFaFZFSFLFEF>F7F0F)F"FFF FFÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCF<F5F.F'F FFF FFýFöFïFèFáFÚFÓFÌFÅF¾F·F°F©F¢F›F”FF†FFxFqFjFcF\FUFNFGF@F9F2F+F$FFFFFFúFóFìFåFÞF×FÐFÉFÂF»F´F­F¦FŸF˜F‘FŠFƒF|FuFnFgF`FYFRFKFDF=F6F/F(F!FFF FFþÿE÷ÿEðÿEéÿEâÿEÛÿEÔÿEÍÿEÆÿE¿ÿE¸ÿE±ÿEªÿE£ÿEœÿE•ÿEŽÿE‡ÿE€ÿEyÿErÿEkÿEdÿE]ÿEVÿEOÿEHÿEAÿE:ÿE3ÿE,ÿE%ÿEÿEÿEÿE ÿEÿEûþEôþEíþEæþEßþEØþEÑþEÊþEÃþE¼þEµþE®þE§þE þE™þE’þE‹þE„þE}þEvþEoþEhþEaþEZþESþELþEEþE>þE7þE0þE)þE"þEþEþE þEþEÿýEøýEñýEêýEãýEÜýEÕýEÎýEÇýEÀýE¹ýE²ýE«ýE¤ýEýE–ýEýEˆýEýEzýEsýElýEeýE^ýEWýEPýEIýEBýE;ýE4ýE-ýE&ýEýEýEýE ýEýEüüEõüEîüEçüEàüEÙüEÒüEËüEÄüE½üE¶üE¯üE¨üE¡üEšüE“üEŒüE…üE~üEwüEpüEiüEbüE[üETüEMüEFüE?üE8üE1üE*üE#üEüEüEüEüEüEùûEòûEëûEäûEÝûEÖûEÏûEÈûEÁûEºûE³ûE¬ûE¥ûEžûE—ûEûE‰ûE‚ûE{ûEtûEmûEfûE_ûEXûEQûEJûECûE<ûE5ûE.ûE'ûE ûEûEûE ûEûEýúEöúEïúEèúEáúEÚúEÓúEÌúEÅúE¾úE·úE°úE©úE¢úE›úE”úEúE†úEúExúEqúEjúEcúE\úEUúENúEGúE@úE9úE2úE+úE$úEúEúEúEúEúEúùEóùEìùEåùEÞùE×ùEÐùEÉùEÂùE»ùE´ùE­ùE¦ùEŸùE˜ùE‘ùEŠùEƒùE|ùEuùEnùEgùE`ùEYùERùEKùEDùE=ùE6ùE/ùE(ùE!ùEùEùE ùEùEþøE÷øEðøEéøEâøEÛøEÔøEÍøEÆøE¿øE¸øE±øEªøE£øEœøE•øEŽøE‡øE€øEyøErøEkøEdøE]øEVøEOøEHøEAøE:øE3øE,øE%øEøEøEøE øEøEû÷Eô÷Eí÷Eæ÷Eß÷EØ÷EÑ÷EÊ÷EÃ÷E¼÷Eµ÷E®÷E§÷E ÷E™÷E’÷E‹÷E„÷E}÷Ev÷Eo÷Eh÷Ea÷EZ÷ES÷EL÷EE÷E>÷E7÷E0÷E)÷E"÷E÷E÷E ÷E÷EÿöEøöEñöEêöEãöEÜöEÕöEÎöEÇöEÀöE¹öE²öE«öE¤öEöE–öEöEˆöEöEzöEsöElöEeöE^öEWöEPöEIöEBöE;öE4öE-öE&öEöEöEöE öEöEüõEõõEîõEçõEàõEÙõEÒõEËõEÄõE½õE¶õE¯õE¨õE¡õEšõE“õEŒõE…õE~õEwõEpõEiõEbõE[õETõEMõEFõE?õE8õE1õE*õE#õEõEõEõEõEõEùôEòôEëôEäôEÝôEÖôEÏôEÈôEÁôEºôE³ôE¬ôE¥ôEžôE—ôEôE‰ôE‚ôE{ôEtôEmôEfôE_ôEXôEQôEJôECôE<ôE5ôE.ôE'ôE ôEôEôE ôEôEýóEöóEïóEèóEáóEÚóEÓóEÌóEÅóE¾óE·óE°óE©óE¢óE›óE”óEóE†óEóExóEqóEjóEcóE\óEUóENóEGóE@óE9óE2óE+óE$óEóEóEóEóEóEúòEóòEìòEåòEÞòE×òEÐòEÉòEÂòE»òE´òE­òE¦òEŸòE˜òE‘òEŠòEƒòE|òEuòEnòEgòE`òEYòERòEKòEDòE=òE6òE/òE(òE!òEòEòE òEòEþñE÷ñEðñEéñEâñEÛñEÔñEÍñEÆñE¿ñE¸ñE±ñEªñE£ñEœñE•ñEŽñE‡ñE€ñEyñErñEkñEdñE]ñEVñEOñEHñEAñE:ñE3ñE,ñE%ñEñEñEñE ñEñEûðEôðEíðEæðEßðEØðEÑðEÊðEÃðE¼ðEµðE®ðE§ðE ðE™ðE’ðE‹ðE„ðE}ðEvðEoðEhðEaðEZðESðELðEEðE>ðE7ðE0ðE)ðE"ðEðEðE ðEðEÿïEøïEñïEêïEãïEÜïEÕïEÎïEÇïEÀïE¹ïE²ïE«ïE¤ïEïE–ïEïEˆïEïEzïEsïElïEeïE^ïEWïEPïEIïEBïE;ïE4ïE-ïE&ïEïEïEïE ïEïEüîEõîEîîEçîEàîEÙîEÒîEËîEÄîE½îE¶îE¯îE¨îE¡îEšîE“îEŒîE…îE~îEwîEpîEiîEbîE[îETîEMîEFîE?îE8îE1îE*îE#îEîEîEîEîEîEùíEòíEëíEäíEÝíEÖíEÏíEÈíEÁíEºíE³íE¬íE¥íEžíE—íEíE‰íE‚íE{íEtíEmíEfíE_íEXíEQíEJíECíE<íE5íE.íE'íE íEíEíE íEíEýìEöìEïìEèìEáìEÚìEÓìEÌìEÅìE¾ìE·ìE°ìE©ìE¢ìE›ìE”ìEìE†ìEìExìEqìEjìEcìE\ìEUìENìEGìE@ìE9ìE2ìE+ìE$ìEìEìEìEìEìEúëEóëEìëEåëEÞëE×ëEÐëEÉëEÂëE»ëE´ëE­ëE¦ëEŸëE˜ëE‘ëEŠëEƒëE|ëEuëEnëEgëE`ëEYëERëEKëEDëE=ëE6ëE/ëE(ëE!ëEëEëE ëEëEþêE÷êEðêEéêEâêEÛêEÔêEÍêEÆêE¿êE¸êE±êEªêE£êEœêE•êEŽêE‡êE€êEyêErêEkêEdêE]êEVêEOêEHêEAêE:êE3êE,êE%êEêEêEêE êEêEûéEôéEíéEæéEßéEØéEÑéEÊéEÃéE¼éEµéE®éE§éE éE™éE’éE‹éE„éE}éEvéEoéEhéEaéEZéESéELéEEéE>éE7éE0éE)éE"éEéEéE éEéEÿèEøèEñèEêèEãèEÜèEÕèEÎèEÇèEÀèE¹èE²èE«èE¤èEèE–èEèEˆèEèEzèEsèElèEeèE^èEWèEPèEIèEBèE;èE4èE-èE&èEèEèEèE èEèEüçEõçEîçEççEàçEÙçEÒçEËçEÄçE½çE¶çE¯çE¨çE¡çEšçE“çEŒçE…çE~çEwçEpçEiçEbçE[çETçEMçEFçE?çE8çE1çE*çE#çEçEçEçEçEçEùæEòæEëæEäæEÝæEÖæEÏæEÈæEÁæEºæE³æE¬æE¥æEžæE—æEæE‰æE‚æE{æEtæEmæEfæE_æEXæEQæEJæECæE<æE5æE.æE'æE æEæEæE æEæEýåEöåEïåEèåEáåEÚåEÓåEÌåEÅåE¾åE·åE°åE©åE¢åE›åE”åEåE†åEåExåEqåEjåEcåE\åEUåENåEGåE@åE9åE2åE+åE$åEåEåEåEåEåEúäEóäEìäEåäEÞäE×äEÐäEÉäEÂäE»äE´äE­äE¦äEŸäE˜äE‘äEŠäEƒäE|äEuäEnäEgäE`äEYäERäEKäEDäE=äE6äE/äE(äE!äEäEäE äEäEþãE÷ãEðãEéãEâãEÛãEÔãEÍãEÆãE¿ãE¸ãE±ãEªãE£ãEœãE•ãEŽãE‡ãE€ãEyãErãEkãEdãE]ãEVãEOãEHãEAãE:ãE3ãE,ãE%ãEãEãEãE ãEãEûâEôâEíâEæâEßâEØâEÑâEÊâEÃâE¼âEµâE®âE§âE âE™âE’âE‹âE„âE}âEvâEoâEhâEaâEZâESâELâEEâE>âE7âE0âE)âE"âEâEâE âEâEÿáEøáEñáEêáEãáEÜáEÕáEÎáEÇáEÀáE¹áE²áE«áE¤áEáE–áEáEˆáEáEzáEsáEláEeáE^áEWáEPáEIáEBáE;áE4áE-áE&áEáEáEáE áEáEüàEõàEîàEçàEààEÙàEÒàEËàEÄàE½àE¶àE¯àE¨àE¡àEšàE“àEŒàE…àE~àEwàEpàEiàEbàE[àETàEMàEFàE?àE8àE1àE*àE#àEàEàEàEàEàEùßEòßEëßEäßEÝßEÖßEÏßEÈßEÁßEºßE³ßE¬ßE¥ßEžßE—ßEßE‰ßE‚ßE{ßEtßEmßEfßE_ßEXßEQßEJßECßE<ßE5ßE.ßE'ßE ßEßEßE ßEßEýÞEöÞEïÞEèÞEáÞEÚÞEÓÞEÌÞEÅÞE¾ÞE·ÞE°ÞE©ÞE¢ÞE›ÞE”ÞEÞE†ÞEÞExÞEqÞEjÞEcÞE\ÞEUÞENÞEGÞE@ÞE9ÞE2ÞE+ÞE$ÞEÞEÞEÞEÞEÞEúÝEóÝEìÝEåÝEÞÝE×ÝEÐÝEÉÝEÂÝE»ÝE´ÝE­ÝE¦ÝEŸÝE˜ÝE‘ÝEŠÝEƒÝE|ÝEuÝEnÝEgÝE`ÝEYÝERÝEKÝEDÝE=ÝE6ÝE/ÝE(ÝE!ÝEÝEÝE ÝEÝEþÜE÷ÜEðÜEéÜEâÜEÛÜEÔÜEÍÜEÆÜE¿ÜE¸ÜE±ÜEªÜE£ÜEœÜE•ÜEŽÜE‡ÜE€ÜEyÜErÜEkÜEdÜE]ÜEVÜEOÜEHÜEAÜE:ÜE3ÜE,ÜE%ÜEÜEÜEÜE ÜEÜEûÛEôÛEíÛEæÛEßÛEØÛEÑÛEÊÛEÃÛE¼ÛEµÛE®ÛE§ÛE ÛE™ÛE’ÛE‹ÛE„ÛE}ÛEvÛEoÛEhÛEaÛEZÛESÛELÛEEÛE>ÛE7ÛE0ÛE)ÛE"ÛEÛEÛE ÛEÛEÿÚEøÚEñÚEêÚEãÚEÜÚEÕÚEÎÚEÇÚEÀÚE¹ÚE²ÚE«ÚE¤ÚEÚE–ÚEÚEˆÚEÚEzÚEsÚElÚEeÚE^ÚEWÚEPÚEIÚEBÚE;ÚE4ÚE-ÚE&ÚEÚEÚEÚE ÚEÚEüÙEõÙEîÙEçÙEàÙEÙÙEÒÙEËÙEÄÙE½ÙE¶ÙE¯ÙE¨ÙE¡ÙEšÙE“ÙEŒÙE…ÙE~ÙEwÙEpÙEiÙEbÙE[ÙETÙEMÙEFÙE?ÙE8ÙE1ÙE*ÙE#ÙEÙEÙEÙEÙEÙEùØEòØEëØEäØEÝØEÖØEÏØEÈØEÁØEºØE³ØE¬ØE¥ØEžØE—ØEØE‰ØE‚ØE{ØEtØEmØEfØE_ØEXØEQØEJØECØE<ØE5ØE.ØE'ØE ØEØEØE ØEØEý×Eö×Eï×Eè×Eá×EÚ×EÓ×EÌ×EÅ×E¾×E·×E°×E©×E¢×E›×E”×E×E†×E×Ex×Eq×Ej×Ec×E\×EU×EN×EG×E@×E9×E2×E+×E$×E×E×E×E×E×EúÖEóÖEìÖEåÖEÞÖE×ÖEÐÖEÉÖEÂÖE»ÖE´ÖE­ÖE¦ÖEŸÖE˜ÖE‘ÖEŠÖEƒÖE|ÖEuÖEnÖEgÖE`ÖEYÖERÖEKÖEDÖE=ÖE6ÖE/ÖE(ÖE!ÖEÖEÖE ÖEÖEþÕE÷ÕEðÕEéÕEâÕEÛÕEÔÕEÍÕEÆÕE¿ÕE¸ÕE±ÕEªÕE£ÕEœÕE•ÕEŽÕE‡ÕE€ÕEyÕErÕEkÕEdÕE]ÕEVÕEOÕEHÕEAÕE:ÕE3ÕE,ÕE%ÕEÕEÕEÕE ÕEÕEûÔEôÔEíÔEæÔEßÔEØÔEÑÔEÊÔEÃÔE¼ÔEµÔE®ÔE§ÔE ÔE™ÔE’ÔE‹ÔE„ÔE}ÔEvÔEoÔEhÔEaÔEZÔESÔELÔEEÔE>ÔE7ÔE0ÔE)ÔE"ÔEÔEÔE ÔEÔEÿÓEøÓEñÓEêÓEãÓEÜÓEÕÓEÎÓEÇÓEÀÓE¹ÓE²ÓE«ÓE¤ÓEÓE–ÓEÓEˆÓEÓEzÓEsÓElÓEeÓE^ÓEWÓEPÓEIÓEBÓE;ÓE4ÓE-ÓE&ÓEÓEÓEÓE ÓEÓEüÒEõÒEîÒEçÒEàÒEÙÒEÒÒEËÒEÄÒE½ÒE¶ÒE¯ÒE¨ÒE¡ÒEšÒE“ÒEŒÒE…ÒE~ÒEwÒEpÒEiÒEbÒE[ÒETÒEMÒEFÒE?ÒE8ÒE1ÒE*ÒE#ÒEÒEÒEÒEÒEÒEùÑEòÑEëÑEäÑEÝÑEÖÑEÏÑEÈÑEÁÑEºÑE³ÑE¬ÑE¥ÑEžÑE—ÑEÑE‰ÑE‚ÑE{ÑEtÑEmÑEfÑE_ÑEXÑEQÑEJÑECÑE<ÑE5ÑE.ÑE'ÑE ÑEÑEÑE ÑEÑEýÐEöÐEïÐEèÐEáÐEÚÐEÓÐEÌÐEÅÐE¾ÐE·ÐE°ÐE©ÐE¢ÐE›ÐE”ÐEÐE†ÐEÐExÐEqÐEjÐEcÐE\ÐEUÐENÐEGÐE@ÐE9ÐE2ÐE+ÐE$ÐEÐEÐEÐEÐEÐEúÏEóÏEìÏEåÏEÞÏE×ÏEÐÏEÉÏEÂÏE»ÏE´ÏE­ÏE¦ÏEŸÏE˜ÏE‘ÏEŠÏEƒÏE|ÏEuÏEnÏEgÏE`ÏEYÏERÏEKÏEDÏE=ÏE6ÏE/ÏE(ÏE!ÏEÏEÏE ÏEÏEþÎE÷ÎEðÎEéÎEâÎEÛÎEÔÎEÍÎEÆÎE¿ÎE¸ÎE±ÎEªÎE£ÎEœÎE•ÎEŽÎE‡ÎE€ÎEyÎErÎEkÎEdÎE]ÎEVÎEOÎEHÎEAÎE:ÎE3ÎE,ÎE%ÎEÎEÎEÎE ÎEÎEûÍEôÍEíÍEæÍEßÍEØÍEÑÍEÊÍEÃÍE¼ÍEµÍE®ÍE§ÍE ÍE™ÍE’ÍE‹ÍE„ÍE}ÍEvÍEoÍEhÍEaÍEZÍESÍELÍEEÍE>ÍE7ÍE0ÍE)ÍE"ÍEÍEÍE ÍEÍEÿÌEøÌEñÌEêÌEãÌEÜÌEÕÌEÎÌEÇÌEÀÌE¹ÌE²ÌE«ÌE¤ÌEÌE–ÌEÌEˆÌEÌEzÌEsÌElÌEeÌE^ÌEWÌEPÌEIÌEBÌE;ÌE4ÌE-ÌE&ÌEÌEÌEÌE ÌEÌEüËEõËEîËEçËEàËEÙËEÒËEËËEÄËE½ËE¶ËE¯ËE¨ËE¡ËEšËE“ËEŒËE…ËE~ËEwËEpËEiËEbËE[ËETËEMËEFËE?ËE8ËE1ËE*ËE#ËEËEËEËEËEËEùÊEòÊEëÊEäÊEÝÊEÖÊEÏÊEÈÊEÁÊEºÊE³ÊE¬ÊE¥ÊEžÊE—ÊEÊE‰ÊE‚ÊE{ÊEtÊEmÊEfÊE_ÊEXÊEQÊEJÊECÊE<ÊE5ÊE.ÊE'ÊE ÊEÊEÊE ÊEÊEýÉEöÉEïÉEèÉEáÉEÚÉEÓÉEÌÉEÅÉE¾ÉE·ÉE°ÉE©ÉE¢ÉE›ÉE”ÉEÉE†ÉEÉExÉEqÉEjÉEcÉE\ÉEUÉENÉEGÉE@ÉE9ÉE2ÉE+ÉE$ÉEÉEÉEÉEÉEÉEúÈEóÈEìÈEåÈEÞÈE×ÈEÐÈEÉÈEÂÈE»ÈE´ÈE­ÈE¦ÈEŸÈE˜ÈE‘ÈEŠÈEƒÈE|ÈEuÈEnÈEgÈE`ÈEYÈERÈEKÈEDÈE=ÈE6ÈE/ÈE(ÈE!ÈEÈEÈE ÈEÈEþÇE÷ÇEðÇEéÇEâÇEÛÇEÔÇEÍÇEÆÇE¿ÇE¸ÇE±ÇEªÇE£ÇEœÇE•ÇEŽÇE‡ÇE€ÇEyÇErÇEkÇEdÇE]ÇEVÇEOÇEHÇEAÇE:ÇE3ÇE,ÇE%ÇEÇEÇEÇE ÇEÇEûÆEôÆEíÆEæÆE߯EØÆEÑÆEÊÆEÃÆE¼ÆEµÆE®ÆE§ÆE ÆE™ÆE’ÆE‹ÆE„ÆE}ÆEvÆEoÆEhÆEaÆEZÆESÆELÆEEÆE>ÆE7ÆE0ÆE)ÆE"ÆEÆEÆE ÆEÆEÿÅEøÅEñÅEêÅEãÅEÜÅEÕÅEÎÅEÇÅEÀÅE¹ÅE²ÅE«ÅE¤ÅEÅE–ÅEÅEˆÅEÅEzÅEsÅElÅEeÅE^ÅEWÅEPÅEIÅEBÅE;ÅE4ÅE-ÅE&ÅEÅEÅEÅE ÅEÅEüÄEõÄEîÄEçÄEàÄEÙÄEÒÄEËÄEÄÄE½ÄE¶ÄE¯ÄE¨ÄE¡ÄEšÄE“ÄEŒÄE…ÄE~ÄEwÄEpÄEiÄEbÄE[ÄETÄEMÄEFÄE?ÄE8ÄE1ÄE*ÄE#ÄEÄEÄEÄEÄEÄEùÃEòÃEëÃEäÃEÝÃEÖÃEÏÃEÈÃEÁÃEºÃE³ÃE¬ÃE¥ÃEžÃE—ÃEÃE‰ÃE‚ÃE{ÃEtÃEmÃEfÃE_ÃEXÃEQÃEJÃECÃE<ÃE5ÃE.ÃE'ÃE ÃEÃEÃE ÃEÃEýÂEöÂEïÂEèÂEáÂEÚÂEÓÂEÌÂEÅÂE¾ÂE·ÂE°ÂE©ÂE¢ÂE›ÂE”ÂEÂE†ÂEÂExÂEqÂEjÂEcÂE\ÂEUÂENÂEGÂE@ÂE9ÂE2ÂE+ÂE$ÂEÂEÂEÂEÂEÂEúÁEóÁEìÁEåÁEÞÁE×ÁEÐÁEÉÁEÂÁE»ÁE´ÁE­ÁE¦ÁEŸÁE˜ÁE‘ÁEŠÁEƒÁE|ÁEuÁEnÁEgÁE`ÁEYÁERÁEKÁEDÁE=ÁE6ÁE/ÁE(ÁE!ÁEÁEÁE ÁEÁEþÀE÷ÀEðÀEéÀEâÀEÛÀEÔÀEÍÀEÆÀE¿ÀE¸ÀE±ÀEªÀE£ÀEœÀE•ÀEŽÀE‡ÀE€ÀEyÀErÀEkÀEdÀE]ÀEVÀEOÀEHÀEAÀE:ÀE3ÀE,ÀE%ÀEÀEÀEÀE ÀEÀEû¿Eô¿Eí¿Eæ¿Eß¿EØ¿EÑ¿EÊ¿EÿE¼¿Eµ¿E®¿E§¿E ¿E™¿E’¿E‹¿E„¿E}¿Ev¿Eo¿Eh¿Ea¿EZ¿ES¿EL¿EE¿E>¿E7¿E0¿E)¿E"¿E¿E¿E ¿E¿Eÿ¾Eø¾Eñ¾Eê¾Eã¾EܾEÕ¾EξEǾEÀ¾E¹¾E²¾E«¾E¤¾E¾E–¾E¾Eˆ¾E¾Ez¾Es¾El¾Ee¾E^¾EW¾EP¾EI¾EB¾E;¾E4¾E-¾E&¾E¾E¾E¾E ¾E¾Eü½Eõ½Eî½Eç½Eà½EÙ½EÒ½E˽EĽE½½E¶½E¯½E¨½E¡½Eš½E“½EŒ½E…½E~½Ew½Ep½Ei½Eb½E[½ET½EM½EF½E?½E8½E1½E*½E#½E½E½E½E½E½Eù¼Eò¼Eë¼Eä¼EݼEÖ¼EϼEȼEÁ¼Eº¼E³¼E¬¼E¥¼Ež¼E—¼E¼E‰¼E‚¼E{¼Et¼Em¼Ef¼E_¼EX¼EQ¼EJ¼EC¼E<¼E5¼E.¼E'¼E ¼E¼E¼E ¼E¼Eý»Eö»Eï»Eè»Eá»EÚ»EÓ»EÌ»EÅ»E¾»E·»E°»E©»E¢»E›»E”»E»E†»E»Ex»Eq»Ej»Ec»E\»EU»EN»EG»E@»E9»E2»E+»E$»E»E»E»E»E»EúºEóºEìºEåºEÞºE׺EкEɺEºE»ºE´ºE­ºE¦ºEŸºE˜ºE‘ºEŠºEƒºE|ºEuºEnºEgºE`ºEYºERºEKºEDºE=ºE6ºE/ºE(ºE!ºEºEºE ºEºEþ¹E÷¹Eð¹Eé¹Eâ¹EÛ¹EÔ¹E͹EƹE¿¹E¸¹E±¹Eª¹E£¹Eœ¹E•¹E޹E‡¹E€¹Ey¹Er¹Ek¹Ed¹E]¹EV¹EO¹EH¹EA¹E:¹E3¹E,¹E%¹E¹E¹E¹E ¹E¹Eû¸Eô¸Eí¸Eæ¸E߸EظEѸEʸEøE¼¸Eµ¸E®¸E§¸E ¸E™¸E’¸E‹¸E„¸E}¸Ev¸Eo¸Eh¸Ea¸EZ¸ES¸EL¸EE¸E>¸E7¸E0¸E)¸E"¸E¸E¸E ¸E¸Eÿ·Eø·Eñ·Eê·Eã·EÜ·EÕ·EηEÇ·EÀ·E¹·E²·E«·E¤·E·E–·E·Eˆ·E·Ez·Es·El·Ee·E^·EW·EP·EI·EB·E;·E4·E-·E&·E·E·E·E ·E·Eü¶Eõ¶Eî¶Eç¶Eà¶EÙ¶EÒ¶E˶EĶE½¶E¶¶E¯¶E¨¶E¡¶Eš¶E“¶EŒ¶E…¶E~¶Ew¶Ep¶Ei¶Eb¶E[¶ET¶EM¶EF¶E?¶E8¶E1¶E*¶E#¶E¶E¶E¶E¶E¶EùµEòµEëµEäµEݵEÖµEϵEȵEÁµEºµE³µE¬µE¥µEžµE—µEµE‰µE‚µE{µEtµEmµEfµE_µEXµEQµEJµECµE<µE5µE.µE'µE µEµEµE µEµEý´Eö´Eï´Eè´Eá´EÚ´EÓ´EÌ´EÅ´E¾´E·´E°´E©´E¢´E›´E”´E´E†´E´Ex´Eq´Ej´Ec´E\´EU´EN´EG´E@´E9´E2´E+´E$´E´E´E´E´E´Eú³Eó³Eì³Eå³EÞ³E׳EгEɳE³E»³E´³E­³E¦³EŸ³E˜³E‘³EгEƒ³E|³Eu³En³Eg³E`³EY³ER³EK³ED³E=³E6³E/³E(³E!³E³E³E ³E³Eþ²E÷²Eð²Eé²Eâ²EÛ²EÔ²EͲEƲE¿²E¸²E±²Eª²E£²Eœ²E•²E޲E‡²E€²Ey²Er²Ek²Ed²E]²EV²EO²EH²EA²E:²E3²E,²E%²E²E²E²E ²E²Eû±Eô±Eí±Eæ±Eß±EرEѱEʱEñE¼±Eµ±E®±E§±E ±E™±E’±E‹±E„±E}±Ev±Eo±Eh±Ea±EZ±ES±EL±EE±E>±E7±E0±E)±E"±E±E±E ±E±Eÿ°Eø°Eñ°Eê°Eã°EܰEÕ°EΰEǰEÀ°E¹°E²°E«°E¤°E°E–°E°Eˆ°E°Ez°Es°El°Ee°E^°EW°EP°EI°EB°E;°E4°E-°E&°E°E°E°E °E°Eü¯Eõ¯Eî¯Eç¯Eà¯EÙ¯EÒ¯E˯EįE½¯E¶¯E¯¯E¨¯E¡¯Eš¯E“¯EŒ¯E…¯E~¯Ew¯Ep¯Ei¯Eb¯E[¯ET¯EM¯EF¯E?¯E8¯E1¯E*¯E#¯E¯E¯E¯E¯E¯Eù®Eò®Eë®Eä®EÝ®EÖ®EÏ®EÈ®EÁ®Eº®E³®E¬®E¥®Ež®E—®E®E‰®E‚®E{®Et®Em®Ef®E_®EX®EQ®EJ®EC®E<®E5®E.®E'®E ®E®E®E ®E®Eý­Eö­Eï­Eè­Eá­EÚ­EÓ­EÌ­EÅ­E¾­E·­E°­E©­E¢­E›­E”­E­E†­E­Ex­Eq­Ej­Ec­E\­EU­EN­EG­E@­E9­E2­E+­E$­E­E­E­E­E­Eú¬Eó¬Eì¬Eå¬EÞ¬E׬EЬEɬE¬E»¬E´¬E­¬E¦¬EŸ¬E˜¬E‘¬EЬEƒ¬E|¬Eu¬En¬Eg¬E`¬EY¬ER¬EK¬ED¬E=¬E6¬E/¬E(¬E!¬E¬E¬E ¬E¬Eþ«E÷«Eð«Eé«Eâ«EÛ«EÔ«EÍ«EÆ«E¿«E¸«E±«Eª«E£«Eœ«E•«EŽ«E‡«E€«Ey«Er«Ek«Ed«E]«EV«EO«EH«EA«E:«E3«E,«E%«E«E«E«E «E«EûªEôªEíªEæªEߪEتEѪEʪEêE¼ªEµªE®ªE§ªE ªE™ªE’ªE‹ªE„ªE}ªEvªEoªEhªEaªEZªESªELªEEªE>ªE7ªE0ªE)ªE"ªEªEªE ªEªEÿ©Eø©Eñ©Eê©Eã©EÜ©EÕ©EΩEÇ©EÀ©E¹©E²©E«©E¤©E©E–©E©Eˆ©E©Ez©Es©El©Ee©E^©EW©EP©EI©EB©E;©E4©E-©E&©E©E©E©E ©E©Eü¨Eõ¨Eî¨Eç¨Eà¨EÙ¨EÒ¨E˨EĨE½¨E¶¨E¯¨E¨¨E¡¨Eš¨E“¨EŒ¨E…¨E~¨Ew¨Ep¨Ei¨Eb¨E[¨ET¨EM¨EF¨E?¨E8¨E1¨E*¨E#¨E¨E¨E¨E¨E¨Eù§Eò§Eë§Eä§EݧEÖ§EϧEȧEÁ§Eº§E³§E¬§E¥§Ež§E—§E§E‰§E‚§E{§Et§Em§Ef§E_§EX§EQ§EJ§EC§E<§E5§E.§E'§E §E§E§E §E§Eý¦Eö¦Eï¦Eè¦Eá¦EÚ¦EÓ¦E̦EŦE¾¦E·¦E°¦E©¦E¢¦E›¦E”¦E¦E†¦E¦Ex¦Eq¦Ej¦Ec¦E\¦EU¦EN¦EG¦E@¦E9¦E2¦E+¦E$¦E¦E¦E¦E¦E¦Eú¥Eó¥Eì¥Eå¥EÞ¥E×¥EÐ¥EÉ¥EÂ¥E»¥E´¥E­¥E¦¥EŸ¥E˜¥E‘¥EŠ¥Eƒ¥E|¥Eu¥En¥Eg¥E`¥EY¥ER¥EK¥ED¥E=¥E6¥E/¥E(¥E!¥E¥E¥E ¥E¥Eþ¤E÷¤Eð¤Eé¤Eâ¤EÛ¤EÔ¤EͤEƤE¿¤E¸¤E±¤Eª¤E£¤Eœ¤E•¤EޤE‡¤E€¤Ey¤Er¤Ek¤Ed¤E]¤EV¤EO¤EH¤EA¤E:¤E3¤E,¤E%¤E¤E¤E¤E ¤E¤Eû£Eô£Eí£Eæ£EߣEØ£EÑ£EÊ£EãE¼£Eµ£E®£E§£E £E™£E’£E‹£E„£E}£Ev£Eo£Eh£Ea£EZ£ES£EL£EE£E>£E7£E0£E)£E"£E£E£E £E£Eÿ¢Eø¢Eñ¢Eê¢Eã¢EÜ¢EÕ¢E΢EÇ¢EÀ¢E¹¢E²¢E«¢E¤¢E¢E–¢E¢Eˆ¢E¢Ez¢Es¢El¢Ee¢E^¢EW¢EP¢EI¢EB¢E;¢E4¢E-¢E&¢E¢E¢E¢E ¢E¢Eü¡Eõ¡Eî¡Eç¡Eà¡EÙ¡EÒ¡EË¡EÄ¡E½¡E¶¡E¯¡E¨¡E¡¡Eš¡E“¡EŒ¡E…¡E~¡Ew¡Ep¡Ei¡Eb¡E[¡ET¡EM¡EF¡E?¡E8¡E1¡E*¡E#¡E¡E¡E¡E¡E¡Eù Eò Eë Eä EÝ EÖ EÏ EÈ EÁ Eº E³ E¬ E¥ Ež E— E E‰ E‚ E{ Et Em Ef E_ EX EQ EJ EC E< E5 E. E' E  E E E  E EýŸEöŸEïŸEèŸEáŸEÚŸEÓŸEÌŸEÅŸE¾ŸE·ŸE°ŸE©ŸE¢ŸE›ŸE”ŸEŸE†ŸEŸExŸEqŸEjŸEcŸE\ŸEUŸENŸEGŸE@ŸE9ŸE2ŸE+ŸE$ŸEŸEŸEŸEŸEŸEúžEóžEìžEåžEÞžEמEОEÉžEžE»žE´žE­žE¦žEŸžE˜žE‘žEŠžEƒžE|žEužEnžEgžE`žEYžERžEKžEDžE=žE6žE/žE(žE!žEžEžE žEžEþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûœEôœEíœEæœEßœEØœEÑœEÊœEÜE¼œEµœE®œE§œE œE™œE’œE‹œE„œE}œEvœEoœEhœEaœEZœESœELœEEœE>œE7œE0œE)œE"œEœEœE œEœEÿ›Eø›Eñ›Eê›Eã›EÜ›EÕ›EΛEÇ›EÀ›E¹›E²›E«›E¤›E›E–›E›Eˆ›E›Ez›Es›El›Ee›E^›EW›EP›EI›EB›E;›E4›E-›E&›E›E›E›E ›E›EüšEõšEîšEçšEàšEÙšEÒšEËšEÄšE½šE¶šE¯šE¨šE¡šEššE“šEŒšE…šE~šEwšEpšEišEbšE[šETšEMšEFšE?šE8šE1šE*šE#šEšEšEšEšEšEù™Eò™Eë™Eä™EÝ™EÖ™EÏ™EÈ™EÁ™Eº™E³™E¬™E¥™Ež™E—™E™E‰™E‚™E{™Et™Em™Ef™E_™EX™EQ™EJ™EC™E<™E5™E.™E'™E ™E™E™E ™E™Eý˜Eö˜Eï˜Eè˜Eá˜EÚ˜EÓ˜E̘EŘE¾˜E·˜E°˜E©˜E¢˜E›˜E”˜E˜E†˜E˜Ex˜Eq˜Ej˜Ec˜E\˜EU˜EN˜EG˜E@˜E9˜E2˜E+˜E$˜E˜E˜E˜E˜E˜Eú—Eó—Eì—Eå—EÞ—E×—EЗEÉ—E—E»—E´—E­—E¦—EŸ—E˜—E‘—EŠ—Eƒ—E|—Eu—En—Eg—E`—EY—ER—EK—ED—E=—E6—E/—E(—E!—E—E—E —E—Eþ–E÷–Eð–Eé–Eâ–EÛ–EÔ–EÍ–EÆ–E¿–E¸–E±–Eª–E£–Eœ–E•–EŽ–E‡–E€–Ey–Er–Ek–Ed–E]–EV–EO–EH–EA–E:–E3–E,–E%–E–E–E–E –E–Eû•Eô•Eí•Eæ•Eß•EØ•EÑ•EÊ•EÕE¼•Eµ•E®•E§•E •E™•E’•E‹•E„•E}•Ev•Eo•Eh•Ea•EZ•ES•EL•EE•E>•E7•E0•E)•E"•E•E•E •E•Eÿ”Eø”Eñ”Eê”Eã”EÜ”EÕ”EΔEÇ”EÀ”E¹”E²”E«”E¤”E”E–”E”Eˆ”E”Ez”Es”El”Ee”E^”EW”EP”EI”EB”E;”E4”E-”E&”E”E”E”E ”E”Eü“Eõ“Eî“Eç“Eà“EÙ“EÒ“EË“EÄ“E½“E¶“E¯“E¨“E¡“Eš“E““EŒ“E…“E~“Ew“Ep“Ei“Eb“E[“ET“EM“EF“E?“E8“E1“E*“E#“E“E“E“E“E“Eù’Eò’Eë’Eä’EÝ’EÖ’EÏ’EÈ’EÁ’Eº’E³’E¬’E¥’Ež’E—’E’E‰’E‚’E{’Et’Em’Ef’E_’EX’EQ’EJ’EC’E<’E5’E.’E'’E ’E’E’E ’E’Eý‘Eö‘Eï‘Eè‘Eá‘EÚ‘EÓ‘EÌ‘EÅ‘E¾‘E·‘E°‘E©‘E¢‘E›‘E”‘E‘E†‘E‘Ex‘Eq‘Ej‘Ec‘E\‘EU‘EN‘EG‘E@‘E9‘E2‘E+‘E$‘E‘E‘E‘E‘E‘EúEóEìEåEÞE×EÐEÉEÂE»E´E­E¦EŸE˜E‘EŠEƒE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûŽEôŽEíŽEæŽEߎEØŽEÑŽEÊŽEÃŽE¼ŽEµŽE®ŽE§ŽE ŽE™ŽE’ŽE‹ŽE„ŽE}ŽEvŽEoŽEhŽEaŽEZŽESŽELŽEEŽE>ŽE7ŽE0ŽE)ŽE"ŽEŽEŽE ŽEŽEÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüŒEõŒEîŒEçŒEàŒEÙŒEÒŒEËŒEÄŒE½ŒE¶ŒE¯ŒE¨ŒE¡ŒEšŒE“ŒEŒŒE…ŒE~ŒEwŒEpŒEiŒEbŒE[ŒETŒEMŒEFŒE?ŒE8ŒE1ŒE*ŒE#ŒEŒEŒEŒEŒEŒEù‹Eò‹Eë‹Eä‹EÝ‹EÖ‹EÏ‹EÈ‹EÁ‹Eº‹E³‹E¬‹E¥‹Ež‹E—‹E‹E‰‹E‚‹E{‹Et‹Em‹Ef‹E_‹EX‹EQ‹EJ‹EC‹E<‹E5‹E.‹E'‹E ‹E‹E‹E ‹E‹EýŠEöŠEïŠEèŠEáŠEÚŠEÓŠEÌŠEÅŠE¾ŠE·ŠE°ŠE©ŠE¢ŠE›ŠE”ŠEŠE†ŠEŠExŠEqŠEjŠEcŠE\ŠEUŠENŠEGŠE@ŠE9ŠE2ŠE+ŠE$ŠEŠEŠEŠEŠEŠEú‰Eó‰Eì‰Eå‰EÞ‰E׉EЉEɉE‰E»‰E´‰E­‰E¦‰EŸ‰E˜‰E‘‰EЉEƒ‰E|‰Eu‰En‰Eg‰E`‰EY‰ER‰EK‰ED‰E=‰E6‰E/‰E(‰E!‰E‰E‰E ‰E‰EþˆE÷ˆEðˆEéˆEâˆEÛˆEÔˆE͈EƈE¿ˆE¸ˆE±ˆEªˆE£ˆEœˆE•ˆEŽˆE‡ˆE€ˆEyˆErˆEkˆEdˆE]ˆEVˆEOˆEHˆEAˆE:ˆE3ˆE,ˆE%ˆEˆEˆEˆE ˆEˆEû‡Eô‡Eí‡Eæ‡E߇E؇EчEʇEÇE¼‡Eµ‡E®‡E§‡E ‡E™‡E’‡E‹‡E„‡E}‡Ev‡Eo‡Eh‡Ea‡EZ‡ES‡EL‡EE‡E>‡E7‡E0‡E)‡E"‡E‡E‡E ‡E‡Eÿ†Eø†Eñ†Eê†Eã†E܆EÕ†EΆEdžEÀ†E¹†E²†E«†E¤†E†E–†E†Eˆ†E†Ez†Es†El†Ee†E^†EW†EP†EI†EB†E;†E4†E-†E&†E†E†E†E †E†Eü…Eõ…Eî…Eç…Eà…EÙ…EÒ…EË…EÄ…E½…E¶…E¯…E¨…E¡…Eš…E“…EŒ…E……E~…Ew…Ep…Ei…Eb…E[…ET…EM…EF…E?…E8…E1…E*…E#…E…E…E…E…E…Eù„Eò„Eë„Eä„EÝ„EÖ„EÏ„EÈ„EÁ„Eº„E³„E¬„E¥„Ež„E—„E„E‰„E‚„E{„Et„Em„Ef„E_„EX„EQ„EJ„EC„E<„E5„E.„E'„E „E„E„E „E„EýƒEöƒEïƒEèƒEáƒEÚƒEÓƒẼEŃE¾ƒE·ƒE°ƒE©ƒE¢ƒE›ƒE”ƒEƒE†ƒEƒExƒEqƒEjƒEcƒE\ƒEUƒENƒEGƒE@ƒE9ƒE2ƒE+ƒE$ƒEƒEƒEƒEƒEƒEú‚Eó‚Eì‚Eå‚EÞ‚EׂEЂEÉ‚E‚E»‚E´‚E­‚E¦‚EŸ‚E˜‚E‘‚EŠ‚Eƒ‚E|‚Eu‚En‚Eg‚E`‚EY‚ER‚EK‚ED‚E=‚E6‚E/‚E(‚E!‚E‚E‚E ‚E‚EþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEû€Eô€Eí€Eæ€E߀EØ€EÑ€EÊ€EÀE¼€Eµ€E®€E§€E €E™€E’€E‹€E„€E}€Ev€Eo€Eh€Ea€EZ€ES€EL€EE€E>€E7€E0€E)€E"€E€E€E €E€EÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEü~Eõ~Eî~Eç~Eà~EÙ~EÒ~EË~EÄ~E½~E¶~E¯~E¨~E¡~Eš~E“~EŒ~E…~E~~Ew~Ep~Ei~Eb~E[~ET~EM~EF~E?~E8~E1~E*~E#~E~E~E~E~E~Eù}Eò}Eë}Eä}EÝ}EÖ}EÏ}EÈ}EÁ}Eº}E³}E¬}E¥}Ež}E—}E}E‰}E‚}E{}Et}Em}Ef}E_}EX}EQ}EJ}EC}E<}E5}E.}E'}E }E}E}E }E}Eý|Eö|Eï|Eè|Eá|EÚ|EÓ|EÌ|EÅ|E¾|E·|E°|E©|E¢|E›|E”|E|E†|E|Ex|Eq|Ej|Ec|E\|EU|EN|EG|E@|E9|E2|E+|E$|E|E|E|E|E|Eú{Eó{Eì{Eå{EÞ{E×{EÐ{EÉ{EÂ{E»{E´{E­{E¦{EŸ{E˜{E‘{EŠ{Eƒ{E|{Eu{En{Eg{E`{EY{ER{EK{ED{E={E6{E/{E({E!{E{E{E {E{EþzE÷zEðzEézEâzEÛzEÔzEÍzEÆzE¿zE¸zE±zEªzE£zEœzE•zEŽzE‡zE€zEyzErzEkzEdzE]zEVzEOzEHzEAzE:zE3zE,zE%zEzEzEzE zEzEûyEôyEíyEæyEßyEØyEÑyEÊyEÃyE¼yEµyE®yE§yE yE™yE’yE‹yE„yE}yEvyEoyEhyEayEZyESyELyEEyE>yE7yE0yE)yE"yEyEyE yEyEÿxEøxEñxEêxEãxEÜxEÕxEÎxEÇxEÀxE¹xE²xE«xE¤xExE–xExEˆxExEzxEsxElxEexE^xEWxEPxEIxEBxE;xE4xE-xE&xExExExE xExEüwEõwEîwEçwEàwEÙwEÒwEËwEÄwE½wE¶wE¯wE¨wE¡wEšwE“wEŒwE…wE~wEwwEpwEiwEbwE[wETwEMwEFwE?wE8wE1wE*wE#wEwEwEwEwEwEùvEòvEëvEävEÝvEÖvEÏvEÈvEÁvEºvE³vE¬vE¥vEžvE—vEvE‰vE‚vE{vEtvEmvEfvE_vEXvEQvEJvECvErE7rE0rE)rE"rErErE rErEÿqEøqEñqEêqEãqEÜqEÕqEÎqEÇqEÀqE¹qE²qE«qE¤qEqE–qEqEˆqEqEzqEsqElqEeqE^qEWqEPqEIqEBqE;qE4qE-qE&qEqEqEqE qEqEüpEõpEîpEçpEàpEÙpEÒpEËpEÄpE½pE¶pE¯pE¨pE¡pEšpE“pEŒpE…pE~pEwpEppEipEbpE[pETpEMpEFpE?pE8pE1pE*pE#pEpEpEpEpEpEùoEòoEëoEäoEÝoEÖoEÏoEÈoEÁoEºoE³oE¬oE¥oEžoE—oEoE‰oE‚oE{oEtoEmoEfoE_oEXoEQoEJoECoEkE7kE0kE)kE"kEkEkE kEkEÿjEøjEñjEêjEãjEÜjEÕjEÎjEÇjEÀjE¹jE²jE«jE¤jEjE–jEjEˆjEjEzjEsjEljEejE^jEWjEPjEIjEBjE;jE4jE-jE&jEjEjEjE jEjEüiEõiEîiEçiEàiEÙiEÒiEËiEÄiE½iE¶iE¯iE¨iE¡iEšiE“iEŒiE…iE~iEwiEpiEiiEbiE[iETiEMiEFiE?iE8iE1iE*iE#iEiEiEiEiEiEùhEòhEëhEähEÝhEÖhEÏhEÈhEÁhEºhE³hE¬hE¥hEžhE—hEhE‰hE‚hE{hEthEmhEfhE_hEXhEQhEJhEChEdE7dE0dE)dE"dEdEdE dEdEÿcEøcEñcEêcEãcEÜcEÕcEÎcEÇcEÀcE¹cE²cE«cE¤cEcE–cEcEˆcEcEzcEscElcEecE^cEWcEPcEIcEBcE;cE4cE-cE&cEcEcEcE cEcEübEõbEîbEçbEàbEÙbEÒbEËbEÄbE½bE¶bE¯bE¨bE¡bEšbE“bEŒbE…bE~bEwbEpbEibEbbE[bETbEMbEFbE?bE8bE1bE*bE#bEbEbEbEbEbEùaEòaEëaEäaEÝaEÖaEÏaEÈaEÁaEºaE³aE¬aE¥aEžaE—aEaE‰aE‚aE{aEtaEmaEfaE_aEXaEQaEJaECaE]E7]E0]E)]E"]E]E]E ]E]Eÿ\Eø\Eñ\Eê\Eã\EÜ\EÕ\EÎ\EÇ\EÀ\E¹\E²\E«\E¤\E\E–\E\Eˆ\E\Ez\Es\El\Ee\E^\EW\EP\EI\EB\E;\E4\E-\E&\E\E\E\E \E\Eü[Eõ[Eî[Eç[Eà[EÙ[EÒ[EË[EÄ[E½[E¶[E¯[E¨[E¡[Eš[E“[EŒ[E…[E~[Ew[Ep[Ei[Eb[E[[ET[EM[EF[E?[E8[E1[E*[E#[E[E[E[E[E[EùZEòZEëZEäZEÝZEÖZEÏZEÈZEÁZEºZE³ZE¬ZE¥ZEžZE—ZEZE‰ZE‚ZE{ZEtZEmZEfZE_ZEXZEQZEJZECZEVE7VE0VE)VE"VEVEVE VEVEÿUEøUEñUEêUEãUEÜUEÕUEÎUEÇUEÀUE¹UE²UE«UE¤UEUE–UEUEˆUEUEzUEsUElUEeUE^UEWUEPUEIUEBUE;UE4UE-UE&UEUEUEUE UEUEüTEõTEîTEçTEàTEÙTEÒTEËTEÄTE½TE¶TE¯TE¨TE¡TEšTE“TEŒTE…TE~TEwTEpTEiTEbTE[TETTEMTEFTE?TE8TE1TE*TE#TETETETETETEùSEòSEëSEäSEÝSEÖSEÏSEÈSEÁSEºSE³SE¬SE¥SEžSE—SESE‰SE‚SE{SEtSEmSEfSE_SEXSEQSEJSECSEOE7OE0OE)OE"OEOEOE OEOEÿNEøNEñNEêNEãNEÜNEÕNEÎNEÇNEÀNE¹NE²NE«NE¤NENE–NENEˆNENEzNEsNElNEeNE^NEWNEPNEINEBNE;NE4NE-NE&NENENENE NENEüMEõMEîMEçMEàMEÙMEÒMEËMEÄME½ME¶ME¯ME¨ME¡MEšME“MEŒME…ME~MEwMEpMEiMEbME[METMEMMEFME?ME8ME1ME*ME#MEMEMEMEMEMEùLEòLEëLEäLEÝLEÖLEÏLEÈLEÁLEºLE³LE¬LE¥LEžLE—LELE‰LE‚LE{LEtLEmLEfLE_LEXLEQLEJLECLEHE7HE0HE)HE"HEHEHE HEHEÿGEøGEñGEêGEãGEÜGEÕGEÎGEÇGEÀGE¹GE²GE«GE¤GEGE–GEGEˆGEGEzGEsGElGEeGE^GEWGEPGEIGEBGE;GE4GE-GE&GEGEGEGE GEGEüFEõFEîFEçFEàFEÙFEÒFEËFEÄFE½FE¶FE¯FE¨FE¡FEšFE“FEŒFE…FE~FEwFEpFEiFEbFE[FETFEMFEFFE?FE8FE1FE*FE#FEFEFEFEFEFEùEEòEEëEEäEEÝEEÖEEÏEEÈEEÁEEºEE³EE¬EE¥EEžEE—EEEE‰EE‚EE{EEtEEmEEfEE_EEXEEQEEJEECEEAE7AE0AE)AE"AEAEAE AEAEÿ@Eø@Eñ@Eê@Eã@EÜ@EÕ@EÎ@EÇ@EÀ@E¹@E²@E«@E¤@E@E–@E@Eˆ@E@Ez@Es@El@Ee@E^@EW@EP@EI@EB@E;@E4@E-@E&@E@E@E@E @E@Eü?Eõ?Eî?Eç?Eà?EÙ?EÒ?EË?EÄ?E½?E¶?E¯?E¨?E¡?Eš?E“?EŒ?E…?E~?Ew?Ep?Ei?Eb?E[?ET?EM?EF?E??E8?E1?E*?E#?E?E?E?E?E?Eù>Eò>Eë>Eä>EÝ>EÖ>EÏ>EÈ>EÁ>Eº>E³>E¬>E¥>Ež>E—>E>E‰>E‚>E{>Et>Em>Ef>E_>EX>EQ>EJ>EC>E<>E5>E.>E'>E >E>E>E >E>Eý=Eö=Eï=Eè=Eá=EÚ=EÓ=EÌ=EÅ=E¾=E·=E°=E©=E¢=E›=E”=E=E†=E=Ex=Eq=Ej=Ec=E\=EU=EN=EG=E@=E9=E2=E+=E$=E=E=E=E=E=Eú:E7:E0:E):E":E:E:E :E:Eÿ9Eø9Eñ9Eê9Eã9EÜ9EÕ9EÎ9EÇ9EÀ9E¹9E²9E«9E¤9E9E–9E9Eˆ9E9Ez9Es9El9Ee9E^9EW9EP9EI9EB9E;9E49E-9E&9E9E9E9E 9E9Eü8Eõ8Eî8Eç8Eà8EÙ8EÒ8EË8EÄ8E½8E¶8E¯8E¨8E¡8Eš8E“8EŒ8E…8E~8Ew8Ep8Ei8Eb8E[8ET8EM8EF8E?8E88E18E*8E#8E8E8E8E8E8Eù7Eò7Eë7Eä7EÝ7EÖ7EÏ7EÈ7EÁ7Eº7E³7E¬7E¥7Ež7E—7E7E‰7E‚7E{7Et7Em7Ef7E_7EX7EQ7EJ7EC7E<7E57E.7E'7E 7E7E7E 7E7Eý6Eö6Eï6Eè6Eá6EÚ6EÓ6EÌ6EÅ6E¾6E·6E°6E©6E¢6E›6E”6E6E†6E6Ex6Eq6Ej6Ec6E\6EU6EN6EG6E@6E96E26E+6E$6E6E6E6E6E6Eú5Eó5Eì5Eå5EÞ5E×5EÐ5EÉ5EÂ5E»5E´5E­5E¦5EŸ5E˜5E‘5EŠ5Eƒ5E|5Eu5En5Eg5E`5EY5ER5EK5ED5E=5E65E/5E(5E!5E5E5E 5E5Eþ4E÷4Eð4Eé4Eâ4EÛ4EÔ4EÍ4EÆ4E¿4E¸4E±4Eª4E£4Eœ4E•4EŽ4E‡4E€4Ey4Er4Ek4Ed4E]4EV4EO4EH4EA4E:4E34E,4E%4E4E4E4E 4E4Eû3Eô3Eí3Eæ3Eß3EØ3EÑ3EÊ3EÃ3E¼3Eµ3E®3E§3E 3E™3E’3E‹3E„3E}3Ev3Eo3Eh3Ea3EZ3ES3EL3EE3E>3E73E03E)3E"3E3E3E 3E3Eÿ2Eø2Eñ2Eê2Eã2EÜ2EÕ2EÎ2EÇ2EÀ2E¹2E²2E«2E¤2E2E–2E2Eˆ2E2Ez2Es2El2Ee2E^2EW2EP2EI2EB2E;2E42E-2E&2E2E2E2E 2E2Eü1Eõ1Eî1Eç1Eà1EÙ1EÒ1EË1EÄ1E½1E¶1E¯1E¨1E¡1Eš1E“1EŒ1E…1E~1Ew1Ep1Ei1Eb1E[1ET1EM1EF1E?1E81E11E*1E#1E1E1E1E1E1Eù0Eò0Eë0Eä0EÝ0EÖ0EÏ0EÈ0EÁ0Eº0E³0E¬0E¥0Ež0E—0E0E‰0E‚0E{0Et0Em0Ef0E_0EX0EQ0EJ0EC0E<0E50E.0E'0E 0E0E0E 0E0Eý/Eö/Eï/Eè/Eá/EÚ/EÓ/EÌ/EÅ/E¾/E·/E°/E©/E¢/E›/E”/E/E†/E/Ex/Eq/Ej/Ec/E\/EU/EN/EG/E@/E9/E2/E+/E$/E/E/E/E/E/Eú.Eó.Eì.Eå.EÞ.E×.EÐ.EÉ.EÂ.E».E´.E­.E¦.EŸ.E˜.E‘.EŠ.Eƒ.E|.Eu.En.Eg.E`.EY.ER.EK.ED.E=.E6.E/.E(.E!.E.E.E .E.Eþ-E÷-Eð-Eé-Eâ-EÛ-EÔ-EÍ-EÆ-E¿-E¸-E±-Eª-E£-Eœ-E•-EŽ-E‡-E€-Ey-Er-Ek-Ed-E]-EV-EO-EH-EA-E:-E3-E,-E%-E-E-E-E -E-Eû,Eô,Eí,Eæ,Eß,EØ,EÑ,EÊ,EÃ,E¼,Eµ,E®,E§,E ,E™,E’,E‹,E„,E},Ev,Eo,Eh,Ea,EZ,ES,EL,EE,E>,E7,E0,E),E",E,E,E ,E,Eÿ+Eø+Eñ+Eê+Eã+EÜ+EÕ+EÎ+EÇ+EÀ+E¹+E²+E«+E¤+E+E–+E+Eˆ+E+Ez+Es+El+Ee+E^+EW+EP+EI+EB+E;+E4+E-+E&+E+E+E+E +E+Eü*Eõ*Eî*Eç*Eà*EÙ*EÒ*EË*EÄ*E½*E¶*E¯*E¨*E¡*Eš*E“*EŒ*E…*E~*Ew*Ep*Ei*Eb*E[*ET*EM*EF*E?*E8*E1*E**E#*E*E*E*E*E*Eù)Eò)Eë)Eä)EÝ)EÖ)EÏ)EÈ)EÁ)Eº)E³)E¬)E¥)Ež)E—)E)E‰)E‚)E{)Et)Em)Ef)E_)EX)EQ)EJ)EC)E<)E5)E.)E')E )E)E)E )E)Eý(Eö(Eï(Eè(Eá(EÚ(EÓ(EÌ(EÅ(E¾(E·(E°(E©(E¢(E›(E”(E(E†(E(Ex(Eq(Ej(Ec(E\(EU(EN(EG(E@(E9(E2(E+(E$(E(E(E(E(E(Eú'Eó'Eì'Eå'EÞ'E×'EÐ'EÉ'EÂ'E»'E´'E­'E¦'EŸ'E˜'E‘'EŠ'Eƒ'E|'Eu'En'Eg'E`'EY'ER'EK'ED'E='E6'E/'E('E!'E'E'E 'E'Eþ&E÷&Eð&Eé&Eâ&EÛ&EÔ&EÍ&EÆ&E¿&E¸&E±&Eª&E£&Eœ&E•&EŽ&E‡&E€&Ey&Er&Ek&Ed&E]&EV&EO&EH&EA&E:&E3&E,&E%&E&E&E&E &E&Eû%Eô%Eí%Eæ%Eß%EØ%EÑ%EÊ%EÃ%E¼%Eµ%E®%E§%E %E™%E’%E‹%E„%E}%Ev%Eo%Eh%Ea%EZ%ES%EL%EE%E>%E7%E0%E)%E"%E%E%E %E%Eÿ$Eø$Eñ$Eê$Eã$EÜ$EÕ$EÎ$EÇ$EÀ$E¹$E²$E«$E¤$E$E–$E$Eˆ$E$Ez$Es$El$Ee$E^$EW$EP$EI$EB$E;$E4$E-$E&$E$E$E$E $E$Eü#Eõ#Eî#Eç#Eà#EÙ#EÒ#EË#EÄ#E½#E¶#E¯#E¨#E¡#Eš#E“#EŒ#E…#E~#Ew#Ep#Ei#Eb#E[#ET#EM#EF#E?#E8#E1#E*#E##E#E#E#E#E#Eù"Eò"Eë"Eä"EÝ"EÖ"EÏ"EÈ"EÁ"Eº"E³"E¬"E¥"Ež"E—"E"E‰"E‚"E{"Et"Em"Ef"E_"EX"EQ"EJ"EC"E<"E5"E."E'"E "E"E"E "E"Eý!Eö!Eï!Eè!Eá!EÚ!EÓ!EÌ!EÅ!E¾!E·!E°!E©!E¢!E›!E”!E!E†!E!Ex!Eq!Ej!Ec!E\!EU!EN!EG!E@!E9!E2!E+!E$!E!E!E!E!E!Eú Eó Eì Eå EÞ E× EÐ EÉ E E» E´ E­ E¦ EŸ E˜ E‘ EŠ Eƒ E| Eu En Eg E` EY ER EK ED E= E6 E/ E( E! E E E E EþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûEôEíEæEßEØEÑEÊEÃE¼EµE®E§E E™E’E‹E„E}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEýEöEïEèEáEÚEÓEÌEÅE¾E·E°E©E¢E›E”EE†EExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEúEóEìEåEÞE×EÐEÉEÂE»E´E­E¦EŸE˜E‘EŠEƒE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûEôEíEæEßEØEÑEÊEÃE¼EµE®E§E E™E’E‹E„E}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEýEöEïEèEáEÚEÓEÌEÅE¾E·E°E©E¢E›E”EE†EExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEúEóEìEåEÞE×EÐEÉEÂE»E´E­E¦EŸE˜E‘EŠEƒE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûEôEíEæEßEØEÑEÊEÃE¼EµE®E§E E™E’E‹E„E}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEù Eò Eë Eä EÝ EÖ EÏ EÈ EÁ Eº E³ E¬ E¥ Ež E— E E‰ E‚ E{ Et Em Ef E_ EX EQ EJ EC E< E5 E. E' E E E E E Eý Eö Eï Eè Eá EÚ EÓ EÌ EÅ E¾ E· E° E© E¢ E› E” E E† E Ex Eq Ej Ec E\ EU EN EG E@ E9 E2 E+ E$ E E E E E Eú Eó Eì Eå EÞ E× EÐ EÉ E E» E´ E­ E¦ EŸ E˜ E‘ EŠ Eƒ E| Eu En Eg E` EY ER EK ED E= E6 E/ E( E! E E E E Eþ E÷ Eð Eé Eâ EÛ EÔ EÍ EÆ E¿ E¸ E± Eª E£ Eœ E• EŽ E‡ E€ Ey Er Ek Ed E] EV EO EH EA E: E3 E, E% E E E E E Eû Eô Eí Eæ Eß EØ EÑ EÊ Eà E¼ Eµ E® E§ E  E™ E’ E‹ E„ E} Ev Eo Eh Ea EZ ES EL EE E> E7 E0 E) E" E E E E EÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECE<E5E.E'E EEE EEýEöEïEèEáEÚEÓEÌEÅE¾E·E°E©E¢E›E”EE†EExEqEjEcE\EUENEGE@E9E2E+E$EEEEEEúEóEìEåEÞE×EÐEÉEÂE»E´E­E¦EŸE˜E‘EŠEƒE|EuEnEgE`EYEREKEDE=E6E/E(E!EEE EEþE÷EðEéEâEÛEÔEÍEÆE¿E¸E±EªE£EœE•EŽE‡E€EyErEkEdE]EVEOEHEAE:E3E,E%EEEE EEûEôEíEæEßEØEÑEÊEÃE¼EµE®E§E E™E’E‹E„E}EvEoEhEaEZESELEEE>E7E0E)E"EEE EEÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùÿDòÿDëÿDäÿDÝÿDÖÿDÏÿDÈÿDÁÿDºÿD³ÿD¬ÿD¥ÿDžÿD—ÿDÿD‰ÿD‚ÿD{ÿDtÿDmÿDfÿD_ÿDXÿDQÿDJÿDCÿD<ÿD5ÿD.ÿD'ÿD ÿDÿDÿD ÿDÿDýþDöþDïþDèþDáþDÚþDÓþDÌþDÅþD¾þD·þD°þD©þD¢þD›þD”þDþD†þDþDxþDqþDjþDcþD\þDUþDNþDGþD@þD9þD2þD+þD$þDþDþDþDþDþDúýDóýDìýDåýDÞýD×ýDÐýDÉýDÂýD»ýD´ýD­ýD¦ýDŸýD˜ýD‘ýDŠýDƒýD|ýDuýDnýDgýD`ýDYýDRýDKýDDýD=ýD6ýD/ýD(ýD!ýDýDýD ýDýDþüD÷üDðüDéüDâüDÛüDÔüDÍüDÆüD¿üD¸üD±üDªüD£üDœüD•üDŽüD‡üD€üDyüDrüDküDdüD]üDVüDOüDHüDAüD:üD3üD,üD%üDüDüDüD üDüDûûDôûDíûDæûDßûDØûDÑûDÊûDÃûD¼ûDµûD®ûD§ûD ûD™ûD’ûD‹ûD„ûD}ûDvûDoûDhûDaûDZûDSûDLûDEûD>ûD7ûD0ûD)ûD"ûDûDûD ûDûDÿúDøúDñúDêúDãúDÜúDÕúDÎúDÇúDÀúD¹úD²úD«úD¤úDúD–úDúDˆúDúDzúDsúDlúDeúD^úDWúDPúDIúDBúD;úD4úD-úD&úDúDúDúD úDúDüùDõùDîùDçùDàùDÙùDÒùDËùDÄùD½ùD¶ùD¯ùD¨ùD¡ùDšùD“ùDŒùD…ùD~ùDwùDpùDiùDbùD[ùDTùDMùDFùD?ùD8ùD1ùD*ùD#ùDùDùDùDùDùDùøDòøDëøDäøDÝøDÖøDÏøDÈøDÁøDºøD³øD¬øD¥øDžøD—øDøD‰øD‚øD{øDtøDmøDføD_øDXøDQøDJøDCøD<øD5øD.øD'øD øDøDøD øDøDý÷Dö÷Dï÷Dè÷Dá÷DÚ÷DÓ÷DÌ÷DÅ÷D¾÷D·÷D°÷D©÷D¢÷D›÷D”÷D÷D†÷D÷Dx÷Dq÷Dj÷Dc÷D\÷DU÷DN÷DG÷D@÷D9÷D2÷D+÷D$÷D÷D÷D÷D÷D÷DúöDóöDìöDåöDÞöD×öDÐöDÉöDÂöD»öD´öD­öD¦öDŸöD˜öD‘öDŠöDƒöD|öDuöDnöDgöD`öDYöDRöDKöDDöD=öD6öD/öD(öD!öDöDöD öDöDþõD÷õDðõDéõDâõDÛõDÔõDÍõDÆõD¿õD¸õD±õDªõD£õDœõD•õDŽõD‡õD€õDyõDrõDkõDdõD]õDVõDOõDHõDAõD:õD3õD,õD%õDõDõDõD õDõDûôDôôDíôDæôDßôDØôDÑôDÊôDÃôD¼ôDµôD®ôD§ôD ôD™ôD’ôD‹ôD„ôD}ôDvôDoôDhôDaôDZôDSôDLôDEôD>ôD7ôD0ôD)ôD"ôDôDôD ôDôDÿóDøóDñóDêóDãóDÜóDÕóDÎóDÇóDÀóD¹óD²óD«óD¤óDóD–óDóDˆóDóDzóDsóDlóDeóD^óDWóDPóDIóDBóD;óD4óD-óD&óDóDóDóD óDóDüòDõòDîòDçòDàòDÙòDÒòDËòDÄòD½òD¶òD¯òD¨òD¡òDšòD“òDŒòD…òD~òDwòDpòDiòDbòD[òDTòDMòDFòD?òD8òD1òD*òD#òDòDòDòDòDòDùñDòñDëñDäñDÝñDÖñDÏñDÈñDÁñDºñD³ñD¬ñD¥ñDžñD—ñDñD‰ñD‚ñD{ñDtñDmñDfñD_ñDXñDQñDJñDCñD<ñD5ñD.ñD'ñD ñDñDñD ñDñDýðDöðDïðDèðDáðDÚðDÓðDÌðDÅðD¾ðD·ðD°ðD©ðD¢ðD›ðD”ðDðD†ðDðDxðDqðDjðDcðD\ðDUðDNðDGðD@ðD9ðD2ðD+ðD$ðDðDðDðDðDðDúïDóïDìïDåïDÞïD×ïDÐïDÉïDÂïD»ïD´ïD­ïD¦ïDŸïD˜ïD‘ïDŠïDƒïD|ïDuïDnïDgïD`ïDYïDRïDKïDDïD=ïD6ïD/ïD(ïD!ïDïDïD ïDïDþîD÷îDðîDéîDâîDÛîDÔîDÍîDÆîD¿îD¸îD±îDªîD£îDœîD•îDŽîD‡îD€îDyîDrîDkîDdîD]îDVîDOîDHîDAîD:îD3îD,îD%îDîDîDîD îDîDûíDôíDííDæíDßíDØíDÑíDÊíDÃíD¼íDµíD®íD§íD íD™íD’íD‹íD„íD}íDvíDoíDhíDaíDZíDSíDLíDEíD>íD7íD0íD)íD"íDíDíD íDíDÿìDøìDñìDêìDãìDÜìDÕìDÎìDÇìDÀìD¹ìD²ìD«ìD¤ìDìD–ìDìDˆìDìDzìDsìDlìDeìD^ìDWìDPìDIìDBìD;ìD4ìD-ìD&ìDìDìDìD ìDìDüëDõëDîëDçëDàëDÙëDÒëDËëDÄëD½ëD¶ëD¯ëD¨ëD¡ëDšëD“ëDŒëD…ëD~ëDwëDpëDiëDbëD[ëDTëDMëDFëD?ëD8ëD1ëD*ëD#ëDëDëDëDëDëDùêDòêDëêDäêDÝêDÖêDÏêDÈêDÁêDºêD³êD¬êD¥êDžêD—êDêD‰êD‚êD{êDtêDmêDfêD_êDXêDQêDJêDCêD<êD5êD.êD'êD êDêDêD êDêDýéDöéDïéDèéDáéDÚéDÓéDÌéDÅéD¾éD·éD°éD©éD¢éD›éD”éDéD†éDéDxéDqéDjéDcéD\éDUéDNéDGéD@éD9éD2éD+éD$éDéDéDéDéDéDúèDóèDìèDåèDÞèD×èDÐèDÉèDÂèD»èD´èD­èD¦èDŸèD˜èD‘èDŠèDƒèD|èDuèDnèDgèD`èDYèDRèDKèDDèD=èD6èD/èD(èD!èDèDèD èDèDþçD÷çDðçDéçDâçDÛçDÔçDÍçDÆçD¿çD¸çD±çDªçD£çDœçD•çDŽçD‡çD€çDyçDrçDkçDdçD]çDVçDOçDHçDAçD:çD3çD,çD%çDçDçDçD çDçDûæDôæDíæDææDßæDØæDÑæDÊæDÃæD¼æDµæD®æD§æD æD™æD’æD‹æD„æD}æDvæDoæDhæDaæDZæDSæDLæDEæD>æD7æD0æD)æD"æDæDæD æDæDÿåDøåDñåDêåDãåDÜåDÕåDÎåDÇåDÀåD¹åD²åD«åD¤åDåD–åDåDˆåDåDzåDsåDlåDeåD^åDWåDPåDIåDBåD;åD4åD-åD&åDåDåDåD åDåDüäDõäDîäDçäDàäDÙäDÒäDËäDÄäD½äD¶äD¯äD¨äD¡äDšäD“äDŒäD…äD~äDwäDpäDiäDbäD[äDTäDMäDFäD?äD8äD1äD*äD#äDäDäDäDäDäDùãDòãDëãDäãDÝãDÖãDÏãDÈãDÁãDºãD³ãD¬ãD¥ãDžãD—ãDãD‰ãD‚ãD{ãDtãDmãDfãD_ãDXãDQãDJãDCãD<ãD5ãD.ãD'ãD ãDãDãD ãDãDýâDöâDïâDèâDáâDÚâDÓâDÌâDÅâD¾âD·âD°âD©âD¢âD›âD”âDâD†âDâDxâDqâDjâDcâD\âDUâDNâDGâD@âD9âD2âD+âD$âDâDâDâDâDâDúáDóáDìáDåáDÞáD×áDÐáDÉáDÂáD»áD´áD­áD¦áDŸáD˜áD‘áDŠáDƒáD|áDuáDnáDgáD`áDYáDRáDKáDDáD=áD6áD/áD(áD!áDáDáD áDáDþàD÷àDðàDéàDâàDÛàDÔàDÍàDÆàD¿àD¸àD±àDªàD£àDœàD•àDŽàD‡àD€àDyàDràDkàDdàD]àDVàDOàDHàDAàD:àD3àD,àD%àDàDàDàD àDàDûßDôßDíßDæßDßßDØßDÑßDÊßDÃßD¼ßDµßD®ßD§ßD ßD™ßD’ßD‹ßD„ßD}ßDvßDoßDhßDaßDZßDSßDLßDEßD>ßD7ßD0ßD)ßD"ßDßDßD ßDßDÿÞDøÞDñÞDêÞDãÞDÜÞDÕÞDÎÞDÇÞDÀÞD¹ÞD²ÞD«ÞD¤ÞDÞD–ÞDÞDˆÞDÞDzÞDsÞDlÞDeÞD^ÞDWÞDPÞDIÞDBÞD;ÞD4ÞD-ÞD&ÞDÞDÞDÞD ÞDÞDüÝDõÝDîÝDçÝDàÝDÙÝDÒÝDËÝDÄÝD½ÝD¶ÝD¯ÝD¨ÝD¡ÝDšÝD“ÝDŒÝD…ÝD~ÝDwÝDpÝDiÝDbÝD[ÝDTÝDMÝDFÝD?ÝD8ÝD1ÝD*ÝD#ÝDÝDÝDÝDÝDÝDùÜDòÜDëÜDäÜDÝÜDÖÜDÏÜDÈÜDÁÜDºÜD³ÜD¬ÜD¥ÜDžÜD—ÜDÜD‰ÜD‚ÜD{ÜDtÜDmÜDfÜD_ÜDXÜDQÜDJÜDCÜD<ÜD5ÜD.ÜD'ÜD ÜDÜDÜD ÜDÜDýÛDöÛDïÛDèÛDáÛDÚÛDÓÛDÌÛDÅÛD¾ÛD·ÛD°ÛD©ÛD¢ÛD›ÛD”ÛDÛD†ÛDÛDxÛDqÛDjÛDcÛD\ÛDUÛDNÛDGÛD@ÛD9ÛD2ÛD+ÛD$ÛDÛDÛDÛDÛDÛDúÚDóÚDìÚDåÚDÞÚD×ÚDÐÚDÉÚDÂÚD»ÚD´ÚD­ÚD¦ÚDŸÚD˜ÚD‘ÚDŠÚDƒÚD|ÚDuÚDnÚDgÚD`ÚDYÚDRÚDKÚDDÚD=ÚD6ÚD/ÚD(ÚD!ÚDÚDÚD ÚDÚDþÙD÷ÙDðÙDéÙDâÙDÛÙDÔÙDÍÙDÆÙD¿ÙD¸ÙD±ÙDªÙD£ÙDœÙD•ÙDŽÙD‡ÙD€ÙDyÙDrÙDkÙDdÙD]ÙDVÙDOÙDHÙDAÙD:ÙD3ÙD,ÙD%ÙDÙDÙDÙD ÙDÙDûØDôØDíØDæØDߨDØØDÑØDÊØDÃØD¼ØDµØD®ØD§ØD ØD™ØD’ØD‹ØD„ØD}ØDvØDoØDhØDaØDZØDSØDLØDEØD>ØD7ØD0ØD)ØD"ØDØDØD ØDØDÿ×Dø×Dñ×Dê×Dã×DÜ×DÕ×DÎ×DÇ×DÀ×D¹×D²×D«×D¤×D×D–×D×Dˆ×D×Dz×Ds×Dl×De×D^×DW×DP×DI×DB×D;×D4×D-×D&×D×D×D×D ×D×DüÖDõÖDîÖDçÖDàÖDÙÖDÒÖDËÖDÄÖD½ÖD¶ÖD¯ÖD¨ÖD¡ÖDšÖD“ÖDŒÖD…ÖD~ÖDwÖDpÖDiÖDbÖD[ÖDTÖDMÖDFÖD?ÖD8ÖD1ÖD*ÖD#ÖDÖDÖDÖDÖDÖDùÕDòÕDëÕDäÕDÝÕDÖÕDÏÕDÈÕDÁÕDºÕD³ÕD¬ÕD¥ÕDžÕD—ÕDÕD‰ÕD‚ÕD{ÕDtÕDmÕDfÕD_ÕDXÕDQÕDJÕDCÕD<ÕD5ÕD.ÕD'ÕD ÕDÕDÕD ÕDÕDýÔDöÔDïÔDèÔDáÔDÚÔDÓÔDÌÔDÅÔD¾ÔD·ÔD°ÔD©ÔD¢ÔD›ÔD”ÔDÔD†ÔDÔDxÔDqÔDjÔDcÔD\ÔDUÔDNÔDGÔD@ÔD9ÔD2ÔD+ÔD$ÔDÔDÔDÔDÔDÔDúÓDóÓDìÓDåÓDÞÓD×ÓDÐÓDÉÓDÂÓD»ÓD´ÓD­ÓD¦ÓDŸÓD˜ÓD‘ÓDŠÓDƒÓD|ÓDuÓDnÓDgÓD`ÓDYÓDRÓDKÓDDÓD=ÓD6ÓD/ÓD(ÓD!ÓDÓDÓD ÓDÓDþÒD÷ÒDðÒDéÒDâÒDÛÒDÔÒDÍÒDÆÒD¿ÒD¸ÒD±ÒDªÒD£ÒDœÒD•ÒDŽÒD‡ÒD€ÒDyÒDrÒDkÒDdÒD]ÒDVÒDOÒDHÒDAÒD:ÒD3ÒD,ÒD%ÒDÒDÒDÒD ÒDÒDûÑDôÑDíÑDæÑDßÑDØÑDÑÑDÊÑDÃÑD¼ÑDµÑD®ÑD§ÑD ÑD™ÑD’ÑD‹ÑD„ÑD}ÑDvÑDoÑDhÑDaÑDZÑDSÑDLÑDEÑD>ÑD7ÑD0ÑD)ÑD"ÑDÑDÑD ÑDÑDÿÐDøÐDñÐDêÐDãÐDÜÐDÕÐDÎÐDÇÐDÀÐD¹ÐD²ÐD«ÐD¤ÐDÐD–ÐDÐDˆÐDÐDzÐDsÐDlÐDeÐD^ÐDWÐDPÐDIÐDBÐD;ÐD4ÐD-ÐD&ÐDÐDÐDÐD ÐDÐDüÏDõÏDîÏDçÏDàÏDÙÏDÒÏDËÏDÄÏD½ÏD¶ÏD¯ÏD¨ÏD¡ÏDšÏD“ÏDŒÏD…ÏD~ÏDwÏDpÏDiÏDbÏD[ÏDTÏDMÏDFÏD?ÏD8ÏD1ÏD*ÏD#ÏDÏDÏDÏDÏDÏDùÎDòÎDëÎDäÎDÝÎDÖÎDÏÎDÈÎDÁÎDºÎD³ÎD¬ÎD¥ÎDžÎD—ÎDÎD‰ÎD‚ÎD{ÎDtÎDmÎDfÎD_ÎDXÎDQÎDJÎDCÎD<ÎD5ÎD.ÎD'ÎD ÎDÎDÎD ÎDÎDýÍDöÍDïÍDèÍDáÍDÚÍDÓÍDÌÍDÅÍD¾ÍD·ÍD°ÍD©ÍD¢ÍD›ÍD”ÍDÍD†ÍDÍDxÍDqÍDjÍDcÍD\ÍDUÍDNÍDGÍD@ÍD9ÍD2ÍD+ÍD$ÍDÍDÍDÍDÍDÍDúÌDóÌDìÌDåÌDÞÌD×ÌDÐÌDÉÌDÂÌD»ÌD´ÌD­ÌD¦ÌDŸÌD˜ÌD‘ÌDŠÌDƒÌD|ÌDuÌDnÌDgÌD`ÌDYÌDRÌDKÌDDÌD=ÌD6ÌD/ÌD(ÌD!ÌDÌDÌD ÌDÌDþËD÷ËDðËDéËDâËDÛËDÔËDÍËDÆËD¿ËD¸ËD±ËDªËD£ËDœËD•ËDŽËD‡ËD€ËDyËDrËDkËDdËD]ËDVËDOËDHËDAËD:ËD3ËD,ËD%ËDËDËDËD ËDËDûÊDôÊDíÊDæÊDßÊDØÊDÑÊDÊÊDÃÊD¼ÊDµÊD®ÊD§ÊD ÊD™ÊD’ÊD‹ÊD„ÊD}ÊDvÊDoÊDhÊDaÊDZÊDSÊDLÊDEÊD>ÊD7ÊD0ÊD)ÊD"ÊDÊDÊD ÊDÊDÿÉDøÉDñÉDêÉDãÉDÜÉDÕÉDÎÉDÇÉDÀÉD¹ÉD²ÉD«ÉD¤ÉDÉD–ÉDÉDˆÉDÉDzÉDsÉDlÉDeÉD^ÉDWÉDPÉDIÉDBÉD;ÉD4ÉD-ÉD&ÉDÉDÉDÉD ÉDÉDüÈDõÈDîÈDçÈDàÈDÙÈDÒÈDËÈDÄÈD½ÈD¶ÈD¯ÈD¨ÈD¡ÈDšÈD“ÈDŒÈD…ÈD~ÈDwÈDpÈDiÈDbÈD[ÈDTÈDMÈDFÈD?ÈD8ÈD1ÈD*ÈD#ÈDÈDÈDÈDÈDÈDùÇDòÇDëÇDäÇDÝÇDÖÇDÏÇDÈÇDÁÇDºÇD³ÇD¬ÇD¥ÇDžÇD—ÇDÇD‰ÇD‚ÇD{ÇDtÇDmÇDfÇD_ÇDXÇDQÇDJÇDCÇD<ÇD5ÇD.ÇD'ÇD ÇDÇDÇD ÇDÇDýÆDöÆDïÆDèÆDáÆDÚÆDÓÆDÌÆDÅÆD¾ÆD·ÆD°ÆD©ÆD¢ÆD›ÆD”ÆDÆD†ÆDÆDxÆDqÆDjÆDcÆD\ÆDUÆDNÆDGÆD@ÆD9ÆD2ÆD+ÆD$ÆDÆDÆDÆDÆDÆDúÅDóÅDìÅDåÅDÞÅD×ÅDÐÅDÉÅDÂÅD»ÅD´ÅD­ÅD¦ÅDŸÅD˜ÅD‘ÅDŠÅDƒÅD|ÅDuÅDnÅDgÅD`ÅDYÅDRÅDKÅDDÅD=ÅD6ÅD/ÅD(ÅD!ÅDÅDÅD ÅDÅDþÄD÷ÄDðÄDéÄDâÄDÛÄDÔÄDÍÄDÆÄD¿ÄD¸ÄD±ÄDªÄD£ÄDœÄD•ÄDŽÄD‡ÄD€ÄDyÄDrÄDkÄDdÄD]ÄDVÄDOÄDHÄDAÄD:ÄD3ÄD,ÄD%ÄDÄDÄDÄD ÄDÄDûÃDôÃDíÃDæÃDßÃDØÃDÑÃDÊÃDÃÃD¼ÃDµÃD®ÃD§ÃD ÃD™ÃD’ÃD‹ÃD„ÃD}ÃDvÃDoÃDhÃDaÃDZÃDSÃDLÃDEÃD>ÃD7ÃD0ÃD)ÃD"ÃDÃDÃD ÃDÃDÿÂDøÂDñÂDêÂDãÂDÜÂDÕÂDÎÂDÇÂDÀÂD¹ÂD²ÂD«ÂD¤ÂDÂD–ÂDÂDˆÂDÂDzÂDsÂDlÂDeÂD^ÂDWÂDPÂDIÂDBÂD;ÂD4ÂD-ÂD&ÂDÂDÂDÂD ÂDÂDüÁDõÁDîÁDçÁDàÁDÙÁDÒÁDËÁDÄÁD½ÁD¶ÁD¯ÁD¨ÁD¡ÁDšÁD“ÁDŒÁD…ÁD~ÁDwÁDpÁDiÁDbÁD[ÁDTÁDMÁDFÁD?ÁD8ÁD1ÁD*ÁD#ÁDÁDÁDÁDÁDÁDùÀDòÀDëÀDäÀDÝÀDÖÀDÏÀDÈÀDÁÀDºÀD³ÀD¬ÀD¥ÀDžÀD—ÀDÀD‰ÀD‚ÀD{ÀDtÀDmÀDfÀD_ÀDXÀDQÀDJÀDCÀD<ÀD5ÀD.ÀD'ÀD ÀDÀDÀD ÀDÀDý¿Dö¿Dï¿Dè¿Dá¿DÚ¿DÓ¿DÌ¿DÅ¿D¾¿D·¿D°¿D©¿D¢¿D›¿D”¿D¿D†¿D¿Dx¿Dq¿Dj¿Dc¿D\¿DU¿DN¿DG¿D@¿D9¿D2¿D+¿D$¿D¿D¿D¿D¿D¿Dú¾Dó¾Dì¾Då¾DÞ¾D×¾DоDɾD¾D»¾D´¾D­¾D¦¾DŸ¾D˜¾D‘¾DоDƒ¾D|¾Du¾Dn¾Dg¾D`¾DY¾DR¾DK¾DD¾D=¾D6¾D/¾D(¾D!¾D¾D¾D ¾D¾Dþ½D÷½Dð½Dé½Dâ½DÛ½DÔ½DͽDƽD¿½D¸½D±½Dª½D£½Dœ½D•½D޽D‡½D€½Dy½Dr½Dk½Dd½D]½DV½DO½DH½DA½D:½D3½D,½D%½D½D½D½D ½D½Dû¼Dô¼Dí¼Dæ¼Dß¼DؼDѼDʼDüD¼¼Dµ¼D®¼D§¼D ¼D™¼D’¼D‹¼D„¼D}¼Dv¼Do¼Dh¼Da¼DZ¼DS¼DL¼DE¼D>¼D7¼D0¼D)¼D"¼D¼D¼D ¼D¼Dÿ»Dø»Dñ»Dê»Dã»DÜ»DÕ»DλDÇ»DÀ»D¹»D²»D«»D¤»D»D–»D»Dˆ»D»Dz»Ds»Dl»De»D^»DW»DP»DI»DB»D;»D4»D-»D&»D»D»D»D »D»DüºDõºDîºDçºDàºDÙºDÒºD˺DĺD½ºD¶ºD¯ºD¨ºD¡ºDšºD“ºDŒºD…ºD~ºDwºDpºDiºDbºD[ºDTºDMºDFºD?ºD8ºD1ºD*ºD#ºDºDºDºDºDºDù¹Dò¹Dë¹Dä¹DݹDÖ¹DϹDȹDÁ¹Dº¹D³¹D¬¹D¥¹Dž¹D—¹D¹D‰¹D‚¹D{¹Dt¹Dm¹Df¹D_¹DX¹DQ¹DJ¹DC¹D<¹D5¹D.¹D'¹D ¹D¹D¹D ¹D¹Dý¸Dö¸Dï¸Dè¸Dá¸DÚ¸DÓ¸D̸DŸD¾¸D·¸D°¸D©¸D¢¸D›¸D”¸D¸D†¸D¸Dx¸Dq¸Dj¸Dc¸D\¸DU¸DN¸DG¸D@¸D9¸D2¸D+¸D$¸D¸D¸D¸D¸D¸Dú·Dó·Dì·Då·DÞ·D×·DзDÉ·D·D»·D´·D­·D¦·DŸ·D˜·D‘·DŠ·Dƒ·D|·Du·Dn·Dg·D`·DY·DR·DK·DD·D=·D6·D/·D(·D!·D·D·D ·D·Dþ¶D÷¶Dð¶Dé¶Dâ¶DÛ¶DÔ¶DͶDƶD¿¶D¸¶D±¶Dª¶D£¶Dœ¶D•¶D޶D‡¶D€¶Dy¶Dr¶Dk¶Dd¶D]¶DV¶DO¶DH¶DA¶D:¶D3¶D,¶D%¶D¶D¶D¶D ¶D¶DûµDôµDíµDæµDßµDصDѵDʵDõD¼µDµµD®µD§µD µD™µD’µD‹µD„µD}µDvµDoµDhµDaµDZµDSµDLµDEµD>µD7µD0µD)µD"µDµDµD µDµDÿ´Dø´Dñ´Dê´Dã´DÜ´DÕ´DδDÇ´DÀ´D¹´D²´D«´D¤´D´D–´D´Dˆ´D´Dz´Ds´Dl´De´D^´DW´DP´DI´DB´D;´D4´D-´D&´D´D´D´D ´D´Dü³Dõ³Dî³Dç³Dà³DÙ³DÒ³D˳DijD½³D¶³D¯³D¨³D¡³Dš³D“³DŒ³D…³D~³Dw³Dp³Di³Db³D[³DT³DM³DF³D?³D8³D1³D*³D#³D³D³D³D³D³Dù²Dò²Dë²Dä²DݲDÖ²DϲDȲDÁ²Dº²D³²D¬²D¥²Dž²D—²D²D‰²D‚²D{²Dt²Dm²Df²D_²DX²DQ²DJ²DC²D<²D5²D.²D'²D ²D²D²D ²D²Dý±Dö±Dï±Dè±Dá±DÚ±DÓ±ḎDűD¾±D·±D°±D©±D¢±D›±D”±D±D†±D±Dx±Dq±Dj±Dc±D\±DU±DN±DG±D@±D9±D2±D+±D$±D±D±D±D±D±Dú°Dó°Dì°Då°DÞ°D×°DаDɰD°D»°D´°D­°D¦°DŸ°D˜°D‘°DаDƒ°D|°Du°Dn°Dg°D`°DY°DR°DK°DD°D=°D6°D/°D(°D!°D°D°D °D°Dþ¯D÷¯Dð¯Dé¯Dâ¯DÛ¯DÔ¯DͯDƯD¿¯D¸¯D±¯Dª¯D£¯Dœ¯D•¯DޝD‡¯D€¯Dy¯Dr¯Dk¯Dd¯D]¯DV¯DO¯DH¯DA¯D:¯D3¯D,¯D%¯D¯D¯D¯D ¯D¯Dû®Dô®Dí®Dæ®Dß®DØ®DÑ®DÊ®DîD¼®Dµ®D®®D§®D ®D™®D’®D‹®D„®D}®Dv®Do®Dh®Da®DZ®DS®DL®DE®D>®D7®D0®D)®D"®D®D®D ®D®Dÿ­Dø­Dñ­Dê­Dã­DÜ­DÕ­DέDÇ­DÀ­D¹­D²­D«­D¤­D­D–­D­Dˆ­D­Dz­Ds­Dl­De­D^­DW­DP­DI­DB­D;­D4­D-­D&­D­D­D­D ­D­Dü¬Dõ¬Dî¬Dç¬Dà¬DÙ¬DÒ¬DˬDĬD½¬D¶¬D¯¬D¨¬D¡¬Dš¬D“¬DŒ¬D…¬D~¬Dw¬Dp¬Di¬Db¬D[¬DT¬DM¬DF¬D?¬D8¬D1¬D*¬D#¬D¬D¬D¬D¬D¬Dù«Dò«Dë«Dä«DÝ«DÖ«DÏ«DÈ«DÁ«Dº«D³«D¬«D¥«Dž«D—«D«D‰«D‚«D{«Dt«Dm«Df«D_«DX«DQ«DJ«DC«D<«D5«D.«D'«D «D«D«D «D«DýªDöªDïªDèªDáªDÚªDÓªD̪DŪD¾ªD·ªD°ªD©ªD¢ªD›ªD”ªDªD†ªDªDxªDqªDjªDcªD\ªDUªDNªDGªD@ªD9ªD2ªD+ªD$ªDªDªDªDªDªDú©Dó©Dì©Då©DÞ©DשDЩDÉ©D©D»©D´©D­©D¦©DŸ©D˜©D‘©DŠ©Dƒ©D|©Du©Dn©Dg©D`©DY©DR©DK©DD©D=©D6©D/©D(©D!©D©D©D ©D©Dþ¨D÷¨Dð¨Dé¨Dâ¨DÛ¨DÔ¨DͨDƨD¿¨D¸¨D±¨Dª¨D£¨Dœ¨D•¨DލD‡¨D€¨Dy¨Dr¨Dk¨Dd¨D]¨DV¨DO¨DH¨DA¨D:¨D3¨D,¨D%¨D¨D¨D¨D ¨D¨Dû§Dô§Dí§Dæ§Dß§DاDѧDʧDçD¼§Dµ§D®§D§§D §D™§D’§D‹§D„§D}§Dv§Do§Dh§Da§DZ§DS§DL§DE§D>§D7§D0§D)§D"§D§D§D §D§Dÿ¦Dø¦Dñ¦Dê¦Dã¦DܦDÕ¦DΦDǦDÀ¦D¹¦D²¦D«¦D¤¦D¦D–¦D¦Dˆ¦D¦Dz¦Ds¦Dl¦De¦D^¦DW¦DP¦DI¦DB¦D;¦D4¦D-¦D&¦D¦D¦D¦D ¦D¦Dü¥Dõ¥Dî¥Dç¥Dà¥DÙ¥DÒ¥DË¥DÄ¥D½¥D¶¥D¯¥D¨¥D¡¥Dš¥D“¥DŒ¥D…¥D~¥Dw¥Dp¥Di¥Db¥D[¥DT¥DM¥DF¥D?¥D8¥D1¥D*¥D#¥D¥D¥D¥D¥D¥Dù¤Dò¤Dë¤Dä¤DݤDÖ¤DϤDȤDÁ¤Dº¤D³¤D¬¤D¥¤Dž¤D—¤D¤D‰¤D‚¤D{¤Dt¤Dm¤Df¤D_¤DX¤DQ¤DJ¤DC¤D<¤D5¤D.¤D'¤D ¤D¤D¤D ¤D¤Dý£Dö£Dï£Dè£Dá£DÚ£DÓ£DÌ£DÅ£D¾£D·£D°£D©£D¢£D›£D”£D£D†£D£Dx£Dq£Dj£Dc£D\£DU£DN£DG£D@£D9£D2£D+£D$£D£D£D£D£D£Dú¢Dó¢Dì¢Då¢DÞ¢D×¢DТDÉ¢D¢D»¢D´¢D­¢D¦¢DŸ¢D˜¢D‘¢DŠ¢Dƒ¢D|¢Du¢Dn¢Dg¢D`¢DY¢DR¢DK¢DD¢D=¢D6¢D/¢D(¢D!¢D¢D¢D ¢D¢Dþ¡D÷¡Dð¡Dé¡Dâ¡DÛ¡DÔ¡DÍ¡DÆ¡D¿¡D¸¡D±¡Dª¡D£¡Dœ¡D•¡DŽ¡D‡¡D€¡Dy¡Dr¡Dk¡Dd¡D]¡DV¡DO¡DH¡DA¡D:¡D3¡D,¡D%¡D¡D¡D¡D ¡D¡Dû Dô Dí Dæ Dß DØ DÑ DÊ DàD¼ Dµ D® D§ D  D™ D’ D‹ D„ D} Dv Do Dh Da DZ DS DL DE D> D7 D0 D) D" D D D  D DÿŸDøŸDñŸDêŸDãŸDÜŸDÕŸDΟDÇŸDÀŸD¹ŸD²ŸD«ŸD¤ŸDŸD–ŸDŸDˆŸDŸDzŸDsŸDlŸDeŸD^ŸDWŸDPŸDIŸDBŸD;ŸD4ŸD-ŸD&ŸDŸDŸDŸD ŸDŸDüžDõžDîžDçžDàžDÙžDÒžDËžDÄžD½žD¶žD¯žD¨žD¡žDšžD“žDŒžD…žD~žDwžDpžDižDbžD[žDTžDMžDFžD?žD8žD1žD*žD#žDžDžDžDžDžDùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD™D7™D0™D)™D"™D™D™D ™D™Dÿ˜Dø˜Dñ˜Dê˜Dã˜DܘDÕ˜DΘDǘDÀ˜D¹˜D²˜D«˜D¤˜D˜D–˜D˜Dˆ˜D˜Dz˜Ds˜Dl˜De˜D^˜DW˜DP˜DI˜DB˜D;˜D4˜D-˜D&˜D˜D˜D˜D ˜D˜Dü—Dõ—Dî—Dç—Dà—DÙ—DÒ—DË—DÄ—D½—D¶—D¯—D¨—D¡—Dš—D“—DŒ—D…—D~—Dw—Dp—Di—Db—D[—DT—DM—DF—D?—D8—D1—D*—D#—D—D—D—D—D—Dù–Dò–Dë–Dä–DÝ–DÖ–DÏ–DÈ–DÁ–Dº–D³–D¬–D¥–Dž–D—–D–D‰–D‚–D{–Dt–Dm–Df–D_–DX–DQ–DJ–DC–D<–D5–D.–D'–D –D–D–D –D–Dý•Dö•Dï•Dè•Dá•DÚ•DÓ•DÌ•DÅ•D¾•D·•D°•D©•D¢•D›•D”•D•D†•D•Dx•Dq•Dj•Dc•D\•DU•DN•DG•D@•D9•D2•D+•D$•D•D•D•D•D•Dú”Dó”Dì”Då”DÞ”D×”DДDÉ”D”D»”D´”D­”D¦”DŸ”D˜”D‘”DŠ”Dƒ”D|”Du”Dn”Dg”D`”DY”DR”DK”DD”D=”D6”D/”D(”D!”D”D”D ”D”Dþ“D÷“Dð“Dé“Dâ“DÛ“DÔ“DÍ“DÆ“D¿“D¸“D±“Dª“D£“Dœ“D•“DŽ“D‡“D€“Dy“Dr“Dk“Dd“D]“DV“DO“DH“DA“D:“D3“D,“D%“D“D“D“D “D“Dû’Dô’Dí’Dæ’Dß’DØ’DÑ’DÊ’DÃ’D¼’Dµ’D®’D§’D ’D™’D’’D‹’D„’D}’Dv’Do’Dh’Da’DZ’DS’DL’DE’D>’D7’D0’D)’D"’D’D’D ’D’Dÿ‘Dø‘Dñ‘Dê‘Dã‘DÜ‘DÕ‘DΑDÇ‘DÀ‘D¹‘D²‘D«‘D¤‘D‘D–‘D‘Dˆ‘D‘Dz‘Ds‘Dl‘De‘D^‘DW‘DP‘DI‘DB‘D;‘D4‘D-‘D&‘D‘D‘D‘D ‘D‘DüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD‹D7‹D0‹D)‹D"‹D‹D‹D ‹D‹DÿŠDøŠDñŠDêŠDãŠDÜŠDÕŠDΊDÇŠDÀŠD¹ŠD²ŠD«ŠD¤ŠDŠD–ŠDŠDˆŠDŠDzŠDsŠDlŠDeŠD^ŠDWŠDPŠDIŠDBŠD;ŠD4ŠD-ŠD&ŠDŠDŠDŠD ŠDŠDü‰Dõ‰Dî‰Dç‰Dà‰DÙ‰DÒ‰DˉDĉD½‰D¶‰D¯‰D¨‰D¡‰Dš‰D“‰DŒ‰D…‰D~‰Dw‰Dp‰Di‰Db‰D[‰DT‰DM‰DF‰D?‰D8‰D1‰D*‰D#‰D‰D‰D‰D‰D‰DùˆDòˆDëˆDäˆD݈DÖˆDψDȈDÁˆDºˆD³ˆD¬ˆD¥ˆDžˆD—ˆDˆD‰ˆD‚ˆD{ˆDtˆDmˆDfˆD_ˆDXˆDQˆDJˆDCˆD<ˆD5ˆD.ˆD'ˆD ˆDˆDˆD ˆDˆDý‡Dö‡Dï‡Dè‡Dá‡DÚ‡DÓ‡ḊDŇD¾‡D·‡D°‡D©‡D¢‡D›‡D”‡D‡D†‡D‡Dx‡Dq‡Dj‡Dc‡D\‡DU‡DN‡DG‡D@‡D9‡D2‡D+‡D$‡D‡D‡D‡D‡D‡Dú†Dó†Dì†Då†DÞ†D׆DІDɆD†D»†D´†D­†D¦†DŸ†D˜†D‘†DІDƒ†D|†Du†Dn†Dg†D`†DY†DR†DK†DD†D=†D6†D/†D(†D!†D†D†D †D†Dþ…D÷…Dð…Dé…Dâ…DÛ…DÔ…DÍ…DÆ…D¿…D¸…D±…Dª…D£…Dœ…D•…DŽ…D‡…D€…Dy…Dr…Dk…Dd…D]…DV…DO…DH…DA…D:…D3…D,…D%…D…D…D…D …D…Dû„Dô„Dí„Dæ„Dß„DØ„DÑ„DÊ„DÄD¼„Dµ„D®„D§„D „D™„D’„D‹„D„„D}„Dv„Do„Dh„Da„DZ„DS„DL„DE„D>„D7„D0„D)„D"„D„D„D „D„DÿƒDøƒDñƒDêƒDãƒD܃DÕƒD΃DǃDÀƒD¹ƒD²ƒD«ƒD¤ƒDƒD–ƒDƒDˆƒDƒDzƒDsƒDlƒDeƒD^ƒDWƒDPƒDIƒDBƒD;ƒD4ƒD-ƒD&ƒDƒDƒDƒD ƒDƒDü‚Dõ‚Dî‚Dç‚Dà‚DÙ‚DÒ‚DË‚DÄ‚D½‚D¶‚D¯‚D¨‚D¡‚Dš‚D“‚DŒ‚D…‚D~‚Dw‚Dp‚Di‚Db‚D[‚DT‚DM‚DF‚D?‚D8‚D1‚D*‚D#‚D‚D‚D‚D‚D‚DùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD}D7}D0}D)}D"}D}D}D }D}Dÿ|Dø|Dñ|Dê|Dã|DÜ|DÕ|DÎ|DÇ|DÀ|D¹|D²|D«|D¤|D|D–|D|Dˆ|D|Dz|Ds|Dl|De|D^|DW|DP|DI|DB|D;|D4|D-|D&|D|D|D|D |D|Dü{Dõ{Dî{Dç{Dà{DÙ{DÒ{DË{DÄ{D½{D¶{D¯{D¨{D¡{Dš{D“{DŒ{D…{D~{Dw{Dp{Di{Db{D[{DT{DM{DF{D?{D8{D1{D*{D#{D{D{D{D{D{DùzDòzDëzDäzDÝzDÖzDÏzDÈzDÁzDºzD³zD¬zD¥zDžzD—zDzD‰zD‚zD{zDtzDmzDfzD_zDXzDQzDJzDCzDvD7vD0vD)vD"vDvDvD vDvDÿuDøuDñuDêuDãuDÜuDÕuDÎuDÇuDÀuD¹uD²uD«uD¤uDuD–uDuDˆuDuDzuDsuDluDeuD^uDWuDPuDIuDBuD;uD4uD-uD&uDuDuDuD uDuDütDõtDîtDçtDàtDÙtDÒtDËtDÄtD½tD¶tD¯tD¨tD¡tDštD“tDŒtD…tD~tDwtDptDitDbtD[tDTtDMtDFtD?tD8tD1tD*tD#tDtDtDtDtDtDùsDòsDësDäsDÝsDÖsDÏsDÈsDÁsDºsD³sD¬sD¥sDžsD—sDsD‰sD‚sD{sDtsDmsDfsD_sDXsDQsDJsDCsDoD7oD0oD)oD"oDoDoD oDoDÿnDønDñnDênDãnDÜnDÕnDÎnDÇnDÀnD¹nD²nD«nD¤nDnD–nDnDˆnDnDznDsnDlnDenD^nDWnDPnDInDBnD;nD4nD-nD&nDnDnDnD nDnDümDõmDîmDçmDàmDÙmDÒmDËmDÄmD½mD¶mD¯mD¨mD¡mDšmD“mDŒmD…mD~mDwmDpmDimDbmD[mDTmDMmDFmD?mD8mD1mD*mD#mDmDmDmDmDmDùlDòlDëlDälDÝlDÖlDÏlDÈlDÁlDºlD³lD¬lD¥lDžlD—lDlD‰lD‚lD{lDtlDmlDflD_lDXlDQlDJlDClDhD7hD0hD)hD"hDhDhD hDhDÿgDøgDñgDêgDãgDÜgDÕgDÎgDÇgDÀgD¹gD²gD«gD¤gDgD–gDgDˆgDgDzgDsgDlgDegD^gDWgDPgDIgDBgD;gD4gD-gD&gDgDgDgD gDgDüfDõfDîfDçfDàfDÙfDÒfDËfDÄfD½fD¶fD¯fD¨fD¡fDšfD“fDŒfD…fD~fDwfDpfDifDbfD[fDTfDMfDFfD?fD8fD1fD*fD#fDfDfDfDfDfDùeDòeDëeDäeDÝeDÖeDÏeDÈeDÁeDºeD³eD¬eD¥eDžeD—eDeD‰eD‚eD{eDteDmeDfeD_eDXeDQeDJeDCeDaD7aD0aD)aD"aDaDaD aDaDÿ`Dø`Dñ`Dê`Dã`DÜ`DÕ`DÎ`DÇ`DÀ`D¹`D²`D«`D¤`D`D–`D`Dˆ`D`Dz`Ds`Dl`De`D^`DW`DP`DI`DB`D;`D4`D-`D&`D`D`D`D `D`Dü_Dõ_Dî_Dç_Dà_DÙ_DÒ_DË_DÄ_D½_D¶_D¯_D¨_D¡_Dš_D“_DŒ_D…_D~_Dw_Dp_Di_Db_D[_DT_DM_DF_D?_D8_D1_D*_D#_D_D_D_D_D_Dù^Dò^Dë^Dä^DÝ^DÖ^DÏ^DÈ^DÁ^Dº^D³^D¬^D¥^Dž^D—^D^D‰^D‚^D{^Dt^Dm^Df^D_^DX^DQ^DJ^DC^D<^D5^D.^D'^D ^D^D^D ^D^Dý]Dö]Dï]Dè]Dá]DÚ]DÓ]DÌ]DÅ]D¾]D·]D°]D©]D¢]D›]D”]D]D†]D]Dx]Dq]Dj]Dc]D\]DU]DN]DG]D@]D9]D2]D+]D$]D]D]D]D]D]Dú\Dó\Dì\Då\DÞ\D×\DÐ\DÉ\DÂ\D»\D´\D­\D¦\DŸ\D˜\D‘\DŠ\Dƒ\D|\Du\Dn\Dg\D`\DY\DR\DK\DD\D=\D6\D/\D(\D!\D\D\D \D\Dþ[D÷[Dð[Dé[Dâ[DÛ[DÔ[DÍ[DÆ[D¿[D¸[D±[Dª[D£[Dœ[D•[DŽ[D‡[D€[Dy[Dr[Dk[Dd[D][DV[DO[DH[DA[D:[D3[D,[D%[D[D[D[D [D[DûZDôZDíZDæZDßZDØZDÑZDÊZDÃZD¼ZDµZD®ZD§ZD ZD™ZD’ZD‹ZD„ZD}ZDvZDoZDhZDaZDZZDSZDLZDEZD>ZD7ZD0ZD)ZD"ZDZDZD ZDZDÿYDøYDñYDêYDãYDÜYDÕYDÎYDÇYDÀYD¹YD²YD«YD¤YDYD–YDYDˆYDYDzYDsYDlYDeYD^YDWYDPYDIYDBYD;YD4YD-YD&YDYDYDYD YDYDüXDõXDîXDçXDàXDÙXDÒXDËXDÄXD½XD¶XD¯XD¨XD¡XDšXD“XDŒXD…XD~XDwXDpXDiXDbXD[XDTXDMXDFXD?XD8XD1XD*XD#XDXDXDXDXDXDùWDòWDëWDäWDÝWDÖWDÏWDÈWDÁWDºWD³WD¬WD¥WDžWD—WDWD‰WD‚WD{WDtWDmWDfWD_WDXWDQWDJWDCWDSD7SD0SD)SD"SDSDSD SDSDÿRDøRDñRDêRDãRDÜRDÕRDÎRDÇRDÀRD¹RD²RD«RD¤RDRD–RDRDˆRDRDzRDsRDlRDeRD^RDWRDPRDIRDBRD;RD4RD-RD&RDRDRDRD RDRDüQDõQDîQDçQDàQDÙQDÒQDËQDÄQD½QD¶QD¯QD¨QD¡QDšQD“QDŒQD…QD~QDwQDpQDiQDbQD[QDTQDMQDFQD?QD8QD1QD*QD#QDQDQDQDQDQDùPDòPDëPDäPDÝPDÖPDÏPDÈPDÁPDºPD³PD¬PD¥PDžPD—PDPD‰PD‚PD{PDtPDmPDfPD_PDXPDQPDJPDCPDLD7LD0LD)LD"LDLDLD LDLDÿKDøKDñKDêKDãKDÜKDÕKDÎKDÇKDÀKD¹KD²KD«KD¤KDKD–KDKDˆKDKDzKDsKDlKDeKD^KDWKDPKDIKDBKD;KD4KD-KD&KDKDKDKD KDKDüJDõJDîJDçJDàJDÙJDÒJDËJDÄJD½JD¶JD¯JD¨JD¡JDšJD“JDŒJD…JD~JDwJDpJDiJDbJD[JDTJDMJDFJD?JD8JD1JD*JD#JDJDJDJDJDJDùIDòIDëIDäIDÝIDÖIDÏIDÈIDÁIDºID³ID¬ID¥IDžID—IDID‰ID‚ID{IDtIDmIDfID_IDXIDQIDJIDCIDED7ED0ED)ED"EDEDED EDEDÿDDøDDñDDêDDãDDÜDDÕDDÎDDÇDDÀDD¹DD²DD«DD¤DDDD–DDDDˆDDDDzDDsDDlDDeDD^DDWDDPDDIDDBDD;DD4DD-DD&DDDDDDDD DDDDüCDõCDîCDçCDàCDÙCDÒCDËCDÄCD½CD¶CD¯CD¨CD¡CDšCD“CDŒCD…CD~CDwCDpCDiCDbCD[CDTCDMCDFCD?CD8CD1CD*CD#CDCDCDCDCDCDùBDòBDëBDäBDÝBDÖBDÏBDÈBDÁBDºBD³BD¬BD¥BDžBD—BDBD‰BD‚BD{BDtBDmBDfBD_BDXBDQBDJBDCBDDô>Dí>Dæ>Dß>DØ>DÑ>DÊ>DÃ>D¼>Dµ>D®>D§>D >D™>D’>D‹>D„>D}>Dv>Do>Dh>Da>DZ>DS>DL>DE>D>>D7>D0>D)>D">D>D>D >D>Dÿ=Dø=Dñ=Dê=Dã=DÜ=DÕ=DÎ=DÇ=DÀ=D¹=D²=D«=D¤=D=D–=D=Dˆ=D=Dz=Ds=Dl=De=D^=DW=DP=DI=DB=D;=D4=D-=D&=D=D=D=D =D=Dü7D77D07D)7D"7D7D7D 7D7Dÿ6Dø6Dñ6Dê6Dã6DÜ6DÕ6DÎ6DÇ6DÀ6D¹6D²6D«6D¤6D6D–6D6Dˆ6D6Dz6Ds6Dl6De6D^6DW6DP6DI6DB6D;6D46D-6D&6D6D6D6D 6D6Dü5Dõ5Dî5Dç5Dà5DÙ5DÒ5DË5DÄ5D½5D¶5D¯5D¨5D¡5Dš5D“5DŒ5D…5D~5Dw5Dp5Di5Db5D[5DT5DM5DF5D?5D85D15D*5D#5D5D5D5D5D5Dù4Dò4Dë4Dä4DÝ4DÖ4DÏ4DÈ4DÁ4Dº4D³4D¬4D¥4Dž4D—4D4D‰4D‚4D{4Dt4Dm4Df4D_4DX4DQ4DJ4DC4D<4D54D.4D'4D 4D4D4D 4D4Dý3Dö3Dï3Dè3Dá3DÚ3DÓ3DÌ3DÅ3D¾3D·3D°3D©3D¢3D›3D”3D3D†3D3Dx3Dq3Dj3Dc3D\3DU3DN3DG3D@3D93D23D+3D$3D3D3D3D3D3Dú2Dó2Dì2Då2DÞ2D×2DÐ2DÉ2DÂ2D»2D´2D­2D¦2DŸ2D˜2D‘2DŠ2Dƒ2D|2Du2Dn2Dg2D`2DY2DR2DK2DD2D=2D62D/2D(2D!2D2D2D 2D2Dþ1D÷1Dð1Dé1Dâ1DÛ1DÔ1DÍ1DÆ1D¿1D¸1D±1Dª1D£1Dœ1D•1DŽ1D‡1D€1Dy1Dr1Dk1Dd1D]1DV1DO1DH1DA1D:1D31D,1D%1D1D1D1D 1D1Dû0Dô0Dí0Dæ0Dß0DØ0DÑ0DÊ0DÃ0D¼0Dµ0D®0D§0D 0D™0D’0D‹0D„0D}0Dv0Do0Dh0Da0DZ0DS0DL0DE0D>0D70D00D)0D"0D0D0D 0D0Dÿ/Dø/Dñ/Dê/Dã/DÜ/DÕ/DÎ/DÇ/DÀ/D¹/D²/D«/D¤/D/D–/D/Dˆ/D/Dz/Ds/Dl/De/D^/DW/DP/DI/DB/D;/D4/D-/D&/D/D/D/D /D/Dü.Dõ.Dî.Dç.Dà.DÙ.DÒ.DË.DÄ.D½.D¶.D¯.D¨.D¡.Dš.D“.DŒ.D….D~.Dw.Dp.Di.Db.D[.DT.DM.DF.D?.D8.D1.D*.D#.D.D.D.D.D.Dù-Dò-Dë-Dä-DÝ-DÖ-DÏ-DÈ-DÁ-Dº-D³-D¬-D¥-Dž-D—-D-D‰-D‚-D{-Dt-Dm-Df-D_-DX-DQ-DJ-DC-D<-D5-D.-D'-D -D-D-D -D-Dý,Dö,Dï,Dè,Dá,DÚ,DÓ,DÌ,DÅ,D¾,D·,D°,D©,D¢,D›,D”,D,D†,D,Dx,Dq,Dj,Dc,D\,DU,DN,DG,D@,D9,D2,D+,D$,D,D,D,D,D,Dú+Dó+Dì+Då+DÞ+D×+DÐ+DÉ+DÂ+D»+D´+D­+D¦+DŸ+D˜+D‘+DŠ+Dƒ+D|+Du+Dn+Dg+D`+DY+DR+DK+DD+D=+D6+D/+D(+D!+D+D+D +D+Dþ*D÷*Dð*Dé*Dâ*DÛ*DÔ*DÍ*DÆ*D¿*D¸*D±*Dª*D£*Dœ*D•*DŽ*D‡*D€*Dy*Dr*Dk*Dd*D]*DV*DO*DH*DA*D:*D3*D,*D%*D*D*D*D *D*Dû)Dô)Dí)Dæ)Dß)DØ)DÑ)DÊ)DÃ)D¼)Dµ)D®)D§)D )D™)D’)D‹)D„)D})Dv)Do)Dh)Da)DZ)DS)DL)DE)D>)D7)D0)D))D")D)D)D )D)Dÿ(Dø(Dñ(Dê(Dã(DÜ(DÕ(DÎ(DÇ(DÀ(D¹(D²(D«(D¤(D(D–(D(Dˆ(D(Dz(Ds(Dl(De(D^(DW(DP(DI(DB(D;(D4(D-(D&(D(D(D(D (D(Dü'Dõ'Dî'Dç'Dà'DÙ'DÒ'DË'DÄ'D½'D¶'D¯'D¨'D¡'Dš'D“'DŒ'D…'D~'Dw'Dp'Di'Db'D['DT'DM'DF'D?'D8'D1'D*'D#'D'D'D'D'D'Dù&Dò&Dë&Dä&DÝ&DÖ&DÏ&DÈ&DÁ&Dº&D³&D¬&D¥&Dž&D—&D&D‰&D‚&D{&Dt&Dm&Df&D_&DX&DQ&DJ&DC&D<&D5&D.&D'&D &D&D&D &D&Dý%Dö%Dï%Dè%Dá%DÚ%DÓ%DÌ%DÅ%D¾%D·%D°%D©%D¢%D›%D”%D%D†%D%Dx%Dq%Dj%Dc%D\%DU%DN%DG%D@%D9%D2%D+%D$%D%D%D%D%D%Dú$Dó$Dì$Då$DÞ$D×$DÐ$DÉ$DÂ$D»$D´$D­$D¦$DŸ$D˜$D‘$DŠ$Dƒ$D|$Du$Dn$Dg$D`$DY$DR$DK$DD$D=$D6$D/$D($D!$D$D$D $D$Dþ#D÷#Dð#Dé#Dâ#DÛ#DÔ#DÍ#DÆ#D¿#D¸#D±#Dª#D£#Dœ#D•#DŽ#D‡#D€#Dy#Dr#Dk#Dd#D]#DV#DO#DH#DA#D:#D3#D,#D%#D#D#D#D #D#Dû"Dô"Dí"Dæ"Dß"DØ"DÑ"DÊ"DÃ"D¼"Dµ"D®"D§"D "D™"D’"D‹"D„"D}"Dv"Do"Dh"Da"DZ"DS"DL"DE"D>"D7"D0"D)"D""D"D"D "D"Dÿ!Dø!Dñ!Dê!Dã!DÜ!DÕ!DÎ!DÇ!DÀ!D¹!D²!D«!D¤!D!D–!D!Dˆ!D!Dz!Ds!Dl!De!D^!DW!DP!DI!DB!D;!D4!D-!D&!D!D!D!D !D!Dü Dõ Dî Dç Dà DÙ DÒ DË DÄ D½ D¶ D¯ D¨ D¡ Dš D“ DŒ D… D~ Dw Dp Di Db D[ DT DM DF D? D8 D1 D* D# D D D D D DùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDýDöDïDèDáDÚDÓDÌDÅD¾D·D°D©D¢D›D”DD†DDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDúDóDìDåDÞD×DÐDÉDÂD»D´D­D¦DŸD˜D‘DŠDƒD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDþD÷DðDéDâDÛDÔDÍDÆD¿D¸D±DªD£DœD•DŽD‡D€DyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDûDôDíDæDßDØDÑDÊDÃD¼DµD®D§D D™D’D‹D„D}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDýDöDïDèDáDÚDÓDÌDÅD¾D·D°D©D¢D›D”DD†DDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDúDóDìDåDÞD×DÐDÉDÂD»D´D­D¦DŸD˜D‘DŠDƒD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDþD÷DðDéDâDÛDÔDÍDÆD¿D¸D±DªD£DœD•DŽD‡D€DyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDûDôDíDæDßDØDÑDÊDÃD¼DµD®D§D D™D’D‹D„D}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDýDöDïDèDáDÚDÓDÌDÅD¾D·D°D©D¢D›D”DD†DDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDúDóDìDåDÞD×DÐDÉDÂD»D´D­D¦DŸD˜D‘DŠDƒD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDþD÷DðDéDâDÛDÔDÍDÆD¿D¸D±DªD£DœD•DŽD‡D€DyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDû Dô Dí Dæ Dß DØ DÑ DÊ Dà D¼ Dµ D® D§ D  D™ D’ D‹ D„ D} Dv Do Dh Da DZ DS DL DE D> D7 D0 D) D" D D D D Dÿ Dø Dñ Dê Dã DÜ DÕ DÎ DÇ DÀ D¹ D² D« D¤ D D– D Dˆ D Dz Ds Dl De D^ DW DP DI DB D; D4 D- D& D D D D D Dü Dõ Dî Dç Dà DÙ DÒ DË DÄ D½ D¶ D¯ D¨ D¡ Dš D“ DŒ D… D~ Dw Dp Di Db D[ DT DM DF D? D8 D1 D* D# D D D D D Dù Dò Dë Dä DÝ DÖ DÏ DÈ DÁ Dº D³ D¬ D¥ Dž D— D D‰ D‚ D{ Dt Dm Df D_ DX DQ DJ DC D< D5 D. D' D D D D D Dý Dö Dï Dè Dá DÚ DÓ DÌ DÅ D¾ D· D° D© D¢ D› D” D D† D Dx Dq Dj Dc D\ DU DN DG D@ D9 D2 D+ D$ D D D D D DúDóDìDåDÞD×DÐDÉDÂD»D´D­D¦DŸD˜D‘DŠDƒD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDþD÷DðDéDâDÛDÔDÍDÆD¿D¸D±DªD£DœD•DŽD‡D€DyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDûDôDíDæDßDØDÑDÊDÃD¼DµD®D§D D™D’D‹D„D}DvDoDhDaDZDSDLDED>D7D0D)D"DDD DDÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD<D5D.D'D DDD DDýDöDïDèDáDÚDÓDÌDÅD¾D·D°D©D¢D›D”DD†DDxDqDjDcD\DUDNDGD@D9D2D+D$DDDDDDúDóDìDåDÞD×DÐDÉDÂD»D´D­D¦DŸD˜D‘DŠDƒD|DuDnDgD`DYDRDKDDD=D6D/D(D!DDD DDþD÷DðDéDâDÛDÔDÍDÆD¿D¸D±DªD£DœD•DŽD‡D€DyDrDkDdD]DVDODHDAD:D3D,D%DDDD DDûÿCôÿCíÿCæÿCßÿCØÿCÑÿCÊÿCÃÿC¼ÿCµÿC®ÿC§ÿC ÿC™ÿC’ÿC‹ÿC„ÿC}ÿCvÿCoÿChÿCaÿCZÿCSÿCLÿCEÿC>ÿC7ÿC0ÿC)ÿC"ÿCÿCÿC ÿCÿCÿþCøþCñþCêþCãþCÜþCÕþCÎþCÇþCÀþC¹þC²þC«þC¤þCþC–þCþCˆþCþCzþCsþClþCeþC^þCWþCPþCIþCBþC;þC4þC-þC&þCþCþCþC þCþCüýCõýCîýCçýCàýCÙýCÒýCËýCÄýC½ýC¶ýC¯ýC¨ýC¡ýCšýC“ýCŒýC…ýC~ýCwýCpýCiýCbýC[ýCTýCMýCFýC?ýC8ýC1ýC*ýC#ýCýCýCýCýCýCùüCòüCëüCäüCÝüCÖüCÏüCÈüCÁüCºüC³üC¬üC¥üCžüC—üCüC‰üC‚üC{üCtüCmüCfüC_üCXüCQüCJüCCüC<üC5üC.üC'üC üCüCüC üCüCýûCöûCïûCèûCáûCÚûCÓûCÌûCÅûC¾ûC·ûC°ûC©ûC¢ûC›ûC”ûCûC†ûCûCxûCqûCjûCcûC\ûCUûCNûCGûC@ûC9ûC2ûC+ûC$ûCûCûCûCûCûCúúCóúCìúCåúCÞúC×úCÐúCÉúCÂúC»úC´úC­úC¦úCŸúC˜úC‘úCŠúCƒúC|úCuúCnúCgúC`úCYúCRúCKúCDúC=úC6úC/úC(úC!úCúCúC úCúCþùC÷ùCðùCéùCâùCÛùCÔùCÍùCÆùC¿ùC¸ùC±ùCªùC£ùCœùC•ùCŽùC‡ùC€ùCyùCrùCkùCdùC]ùCVùCOùCHùCAùC:ùC3ùC,ùC%ùCùCùCùC ùCùCûøCôøCíøCæøCßøCØøCÑøCÊøCÃøC¼øCµøC®øC§øC øC™øC’øC‹øC„øC}øCvøCoøChøCaøCZøCSøCLøCEøC>øC7øC0øC)øC"øCøCøC øCøCÿ÷Cø÷Cñ÷Cê÷Cã÷CÜ÷CÕ÷CÎ÷CÇ÷CÀ÷C¹÷C²÷C«÷C¤÷C÷C–÷C÷Cˆ÷C÷Cz÷Cs÷Cl÷Ce÷C^÷CW÷CP÷CI÷CB÷C;÷C4÷C-÷C&÷C÷C÷C÷C ÷C÷CüöCõöCîöCçöCàöCÙöCÒöCËöCÄöC½öC¶öC¯öC¨öC¡öCšöC“öCŒöC…öC~öCwöCpöCiöCböC[öCTöCMöCFöC?öC8öC1öC*öC#öCöCöCöCöCöCùõCòõCëõCäõCÝõCÖõCÏõCÈõCÁõCºõC³õC¬õC¥õCžõC—õCõC‰õC‚õC{õCtõCmõCfõC_õCXõCQõCJõCCõC<õC5õC.õC'õC õCõCõC õCõCýôCöôCïôCèôCáôCÚôCÓôCÌôCÅôC¾ôC·ôC°ôC©ôC¢ôC›ôC”ôCôC†ôCôCxôCqôCjôCcôC\ôCUôCNôCGôC@ôC9ôC2ôC+ôC$ôCôCôCôCôCôCúóCóóCìóCåóCÞóC×óCÐóCÉóCÂóC»óC´óC­óC¦óCŸóC˜óC‘óCŠóCƒóC|óCuóCnóCgóC`óCYóCRóCKóCDóC=óC6óC/óC(óC!óCóCóC óCóCþòC÷òCðòCéòCâòCÛòCÔòCÍòCÆòC¿òC¸òC±òCªòC£òCœòC•òCŽòC‡òC€òCyòCròCkòCdòC]òCVòCOòCHòCAòC:òC3òC,òC%òCòCòCòC òCòCûñCôñCíñCæñCßñCØñCÑñCÊñCÃñC¼ñCµñC®ñC§ñC ñC™ñC’ñC‹ñC„ñC}ñCvñCoñChñCañCZñCSñCLñCEñC>ñC7ñC0ñC)ñC"ñCñCñC ñCñCÿðCøðCñðCêðCãðCÜðCÕðCÎðCÇðCÀðC¹ðC²ðC«ðC¤ðCðC–ðCðCˆðCðCzðCsðClðCeðC^ðCWðCPðCIðCBðC;ðC4ðC-ðC&ðCðCðCðC ðCðCüïCõïCîïCçïCàïCÙïCÒïCËïCÄïC½ïC¶ïC¯ïC¨ïC¡ïCšïC“ïCŒïC…ïC~ïCwïCpïCiïCbïC[ïCTïCMïCFïC?ïC8ïC1ïC*ïC#ïCïCïCïCïCïCùîCòîCëîCäîCÝîCÖîCÏîCÈîCÁîCºîC³îC¬îC¥îCžîC—îCîC‰îC‚îC{îCtîCmîCfîC_îCXîCQîCJîCCîC<îC5îC.îC'îC îCîCîC îCîCýíCöíCïíCèíCáíCÚíCÓíCÌíCÅíC¾íC·íC°íC©íC¢íC›íC”íCíC†íCíCxíCqíCjíCcíC\íCUíCNíCGíC@íC9íC2íC+íC$íCíCíCíCíCíCúìCóìCììCåìCÞìC×ìCÐìCÉìCÂìC»ìC´ìC­ìC¦ìCŸìC˜ìC‘ìCŠìCƒìC|ìCuìCnìCgìC`ìCYìCRìCKìCDìC=ìC6ìC/ìC(ìC!ìCìCìC ìCìCþëC÷ëCðëCéëCâëCÛëCÔëCÍëCÆëC¿ëC¸ëC±ëCªëC£ëCœëC•ëCŽëC‡ëC€ëCyëCrëCkëCdëC]ëCVëCOëCHëCAëC:ëC3ëC,ëC%ëCëCëCëC ëCëCûêCôêCíêCæêCßêCØêCÑêCÊêCÃêC¼êCµêC®êC§êC êC™êC’êC‹êC„êC}êCvêCoêChêCaêCZêCSêCLêCEêC>êC7êC0êC)êC"êCêCêC êCêCÿéCøéCñéCêéCãéCÜéCÕéCÎéCÇéCÀéC¹éC²éC«éC¤éCéC–éCéCˆéCéCzéCséCléCeéC^éCWéCPéCIéCBéC;éC4éC-éC&éCéCéCéC éCéCüèCõèCîèCçèCàèCÙèCÒèCËèCÄèC½èC¶èC¯èC¨èC¡èCšèC“èCŒèC…èC~èCwèCpèCièCbèC[èCTèCMèCFèC?èC8èC1èC*èC#èCèCèCèCèCèCùçCòçCëçCäçCÝçCÖçCÏçCÈçCÁçCºçC³çC¬çC¥çCžçC—çCçC‰çC‚çC{çCtçCmçCfçC_çCXçCQçCJçCCçC<çC5çC.çC'çC çCçCçC çCçCýæCöæCïæCèæCáæCÚæCÓæCÌæCÅæC¾æC·æC°æC©æC¢æC›æC”æCæC†æCæCxæCqæCjæCcæC\æCUæCNæCGæC@æC9æC2æC+æC$æCæCæCæCæCæCúåCóåCìåCååCÞåC×åCÐåCÉåCÂåC»åC´åC­åC¦åCŸåC˜åC‘åCŠåCƒåC|åCuåCnåCgåC`åCYåCRåCKåCDåC=åC6åC/åC(åC!åCåCåC åCåCþäC÷äCðäCéäCâäCÛäCÔäCÍäCÆäC¿äC¸äC±äCªäC£äCœäC•äCŽäC‡äC€äCyäCräCkäCdäC]äCVäCOäCHäCAäC:äC3äC,äC%äCäCäCäC äCäCûãCôãCíãCæãCßãCØãCÑãCÊãCÃãC¼ãCµãC®ãC§ãC ãC™ãC’ãC‹ãC„ãC}ãCvãCoãChãCaãCZãCSãCLãCEãC>ãC7ãC0ãC)ãC"ãCãCãC ãCãCÿâCøâCñâCêâCãâCÜâCÕâCÎâCÇâCÀâC¹âC²âC«âC¤âCâC–âCâCˆâCâCzâCsâClâCeâC^âCWâCPâCIâCBâC;âC4âC-âC&âCâCâCâC âCâCüáCõáCîáCçáCàáCÙáCÒáCËáCÄáC½áC¶áC¯áC¨áC¡áCšáC“áCŒáC…áC~áCwáCpáCiáCbáC[áCTáCMáCFáC?áC8áC1áC*áC#áCáCáCáCáCáCùàCòàCëàCäàCÝàCÖàCÏàCÈàCÁàCºàC³àC¬àC¥àCžàC—àCàC‰àC‚àC{àCtàCmàCfàC_àCXàCQàCJàCCàC<àC5àC.àC'àC àCàCàC àCàCýßCößCïßCèßCáßCÚßCÓßCÌßCÅßC¾ßC·ßC°ßC©ßC¢ßC›ßC”ßCßC†ßCßCxßCqßCjßCcßC\ßCUßCNßCGßC@ßC9ßC2ßC+ßC$ßCßCßCßCßCßCúÞCóÞCìÞCåÞCÞÞC×ÞCÐÞCÉÞCÂÞC»ÞC´ÞC­ÞC¦ÞCŸÞC˜ÞC‘ÞCŠÞCƒÞC|ÞCuÞCnÞCgÞC`ÞCYÞCRÞCKÞCDÞC=ÞC6ÞC/ÞC(ÞC!ÞCÞCÞC ÞCÞCþÝC÷ÝCðÝCéÝCâÝCÛÝCÔÝCÍÝCÆÝC¿ÝC¸ÝC±ÝCªÝC£ÝCœÝC•ÝCŽÝC‡ÝC€ÝCyÝCrÝCkÝCdÝC]ÝCVÝCOÝCHÝCAÝC:ÝC3ÝC,ÝC%ÝCÝCÝCÝC ÝCÝCûÜCôÜCíÜCæÜCßÜCØÜCÑÜCÊÜCÃÜC¼ÜCµÜC®ÜC§ÜC ÜC™ÜC’ÜC‹ÜC„ÜC}ÜCvÜCoÜChÜCaÜCZÜCSÜCLÜCEÜC>ÜC7ÜC0ÜC)ÜC"ÜCÜCÜC ÜCÜCÿÛCøÛCñÛCêÛCãÛCÜÛCÕÛCÎÛCÇÛCÀÛC¹ÛC²ÛC«ÛC¤ÛCÛC–ÛCÛCˆÛCÛCzÛCsÛClÛCeÛC^ÛCWÛCPÛCIÛCBÛC;ÛC4ÛC-ÛC&ÛCÛCÛCÛC ÛCÛCüÚCõÚCîÚCçÚCàÚCÙÚCÒÚCËÚCÄÚC½ÚC¶ÚC¯ÚC¨ÚC¡ÚCšÚC“ÚCŒÚC…ÚC~ÚCwÚCpÚCiÚCbÚC[ÚCTÚCMÚCFÚC?ÚC8ÚC1ÚC*ÚC#ÚCÚCÚCÚCÚCÚCùÙCòÙCëÙCäÙCÝÙCÖÙCÏÙCÈÙCÁÙCºÙC³ÙC¬ÙC¥ÙCžÙC—ÙCÙC‰ÙC‚ÙC{ÙCtÙCmÙCfÙC_ÙCXÙCQÙCJÙCCÙC<ÙC5ÙC.ÙC'ÙC ÙCÙCÙC ÙCÙCýØCöØCïØCèØCáØCÚØCÓØCÌØCÅØC¾ØC·ØC°ØC©ØC¢ØC›ØC”ØCØC†ØCØCxØCqØCjØCcØC\ØCUØCNØCGØC@ØC9ØC2ØC+ØC$ØCØCØCØCØCØCú×Có×Cì×Cå×CÞ×C××CÐ×CÉ×CÂ×C»×C´×C­×C¦×CŸ×C˜×C‘×CŠ×Cƒ×C|×Cu×Cn×Cg×C`×CY×CR×CK×CD×C=×C6×C/×C(×C!×C×C×C ×C×CþÖC÷ÖCðÖCéÖCâÖCÛÖCÔÖCÍÖCÆÖC¿ÖC¸ÖC±ÖCªÖC£ÖCœÖC•ÖCŽÖC‡ÖC€ÖCyÖCrÖCkÖCdÖC]ÖCVÖCOÖCHÖCAÖC:ÖC3ÖC,ÖC%ÖCÖCÖCÖC ÖCÖCûÕCôÕCíÕCæÕCßÕCØÕCÑÕCÊÕCÃÕC¼ÕCµÕC®ÕC§ÕC ÕC™ÕC’ÕC‹ÕC„ÕC}ÕCvÕCoÕChÕCaÕCZÕCSÕCLÕCEÕC>ÕC7ÕC0ÕC)ÕC"ÕCÕCÕC ÕCÕCÿÔCøÔCñÔCêÔCãÔCÜÔCÕÔCÎÔCÇÔCÀÔC¹ÔC²ÔC«ÔC¤ÔCÔC–ÔCÔCˆÔCÔCzÔCsÔClÔCeÔC^ÔCWÔCPÔCIÔCBÔC;ÔC4ÔC-ÔC&ÔCÔCÔCÔC ÔCÔCüÓCõÓCîÓCçÓCàÓCÙÓCÒÓCËÓCÄÓC½ÓC¶ÓC¯ÓC¨ÓC¡ÓCšÓC“ÓCŒÓC…ÓC~ÓCwÓCpÓCiÓCbÓC[ÓCTÓCMÓCFÓC?ÓC8ÓC1ÓC*ÓC#ÓCÓCÓCÓCÓCÓCùÒCòÒCëÒCäÒCÝÒCÖÒCÏÒCÈÒCÁÒCºÒC³ÒC¬ÒC¥ÒCžÒC—ÒCÒC‰ÒC‚ÒC{ÒCtÒCmÒCfÒC_ÒCXÒCQÒCJÒCCÒC<ÒC5ÒC.ÒC'ÒC ÒCÒCÒC ÒCÒCýÑCöÑCïÑCèÑCáÑCÚÑCÓÑCÌÑCÅÑC¾ÑC·ÑC°ÑC©ÑC¢ÑC›ÑC”ÑCÑC†ÑCÑCxÑCqÑCjÑCcÑC\ÑCUÑCNÑCGÑC@ÑC9ÑC2ÑC+ÑC$ÑCÑCÑCÑCÑCÑCúÐCóÐCìÐCåÐCÞÐC×ÐCÐÐCÉÐCÂÐC»ÐC´ÐC­ÐC¦ÐCŸÐC˜ÐC‘ÐCŠÐCƒÐC|ÐCuÐCnÐCgÐC`ÐCYÐCRÐCKÐCDÐC=ÐC6ÐC/ÐC(ÐC!ÐCÐCÐC ÐCÐCþÏC÷ÏCðÏCéÏCâÏCÛÏCÔÏCÍÏCÆÏC¿ÏC¸ÏC±ÏCªÏC£ÏCœÏC•ÏCŽÏC‡ÏC€ÏCyÏCrÏCkÏCdÏC]ÏCVÏCOÏCHÏCAÏC:ÏC3ÏC,ÏC%ÏCÏCÏCÏC ÏCÏCûÎCôÎCíÎCæÎCßÎCØÎCÑÎCÊÎCÃÎC¼ÎCµÎC®ÎC§ÎC ÎC™ÎC’ÎC‹ÎC„ÎC}ÎCvÎCoÎChÎCaÎCZÎCSÎCLÎCEÎC>ÎC7ÎC0ÎC)ÎC"ÎCÎCÎC ÎCÎCÿÍCøÍCñÍCêÍCãÍCÜÍCÕÍCÎÍCÇÍCÀÍC¹ÍC²ÍC«ÍC¤ÍCÍC–ÍCÍCˆÍCÍCzÍCsÍClÍCeÍC^ÍCWÍCPÍCIÍCBÍC;ÍC4ÍC-ÍC&ÍCÍCÍCÍC ÍCÍCüÌCõÌCîÌCçÌCàÌCÙÌCÒÌCËÌCÄÌC½ÌC¶ÌC¯ÌC¨ÌC¡ÌCšÌC“ÌCŒÌC…ÌC~ÌCwÌCpÌCiÌCbÌC[ÌCTÌCMÌCFÌC?ÌC8ÌC1ÌC*ÌC#ÌCÌCÌCÌCÌCÌCùËCòËCëËCäËCÝËCÖËCÏËCÈËCÁËCºËC³ËC¬ËC¥ËCžËC—ËCËC‰ËC‚ËC{ËCtËCmËCfËC_ËCXËCQËCJËCCËC<ËC5ËC.ËC'ËC ËCËCËC ËCËCýÊCöÊCïÊCèÊCáÊCÚÊCÓÊCÌÊCÅÊC¾ÊC·ÊC°ÊC©ÊC¢ÊC›ÊC”ÊCÊC†ÊCÊCxÊCqÊCjÊCcÊC\ÊCUÊCNÊCGÊC@ÊC9ÊC2ÊC+ÊC$ÊCÊCÊCÊCÊCÊCúÉCóÉCìÉCåÉCÞÉC×ÉCÐÉCÉÉCÂÉC»ÉC´ÉC­ÉC¦ÉCŸÉC˜ÉC‘ÉCŠÉCƒÉC|ÉCuÉCnÉCgÉC`ÉCYÉCRÉCKÉCDÉC=ÉC6ÉC/ÉC(ÉC!ÉCÉCÉC ÉCÉCþÈC÷ÈCðÈCéÈCâÈCÛÈCÔÈCÍÈCÆÈC¿ÈC¸ÈC±ÈCªÈC£ÈCœÈC•ÈCŽÈC‡ÈC€ÈCyÈCrÈCkÈCdÈC]ÈCVÈCOÈCHÈCAÈC:ÈC3ÈC,ÈC%ÈCÈCÈCÈC ÈCÈCûÇCôÇCíÇCæÇCßÇCØÇCÑÇCÊÇCÃÇC¼ÇCµÇC®ÇC§ÇC ÇC™ÇC’ÇC‹ÇC„ÇC}ÇCvÇCoÇChÇCaÇCZÇCSÇCLÇCEÇC>ÇC7ÇC0ÇC)ÇC"ÇCÇCÇC ÇCÇCÿÆCøÆCñÆCêÆCãÆCÜÆCÕÆCÎÆCÇÆCÀÆC¹ÆC²ÆC«ÆC¤ÆCÆC–ÆCÆCˆÆCÆCzÆCsÆClÆCeÆC^ÆCWÆCPÆCIÆCBÆC;ÆC4ÆC-ÆC&ÆCÆCÆCÆC ÆCÆCüÅCõÅCîÅCçÅCàÅCÙÅCÒÅCËÅCÄÅC½ÅC¶ÅC¯ÅC¨ÅC¡ÅCšÅC“ÅCŒÅC…ÅC~ÅCwÅCpÅCiÅCbÅC[ÅCTÅCMÅCFÅC?ÅC8ÅC1ÅC*ÅC#ÅCÅCÅCÅCÅCÅCùÄCòÄCëÄCäÄCÝÄCÖÄCÏÄCÈÄCÁÄCºÄC³ÄC¬ÄC¥ÄCžÄC—ÄCÄC‰ÄC‚ÄC{ÄCtÄCmÄCfÄC_ÄCXÄCQÄCJÄCCÄC<ÄC5ÄC.ÄC'ÄC ÄCÄCÄC ÄCÄCýÃCöÃCïÃCèÃCáÃCÚÃCÓÃCÌÃCÅÃC¾ÃC·ÃC°ÃC©ÃC¢ÃC›ÃC”ÃCÃC†ÃCÃCxÃCqÃCjÃCcÃC\ÃCUÃCNÃCGÃC@ÃC9ÃC2ÃC+ÃC$ÃCÃCÃCÃCÃCÃCúÂCóÂCìÂCåÂCÞÂC×ÂCÐÂCÉÂCÂÂC»ÂC´ÂC­ÂC¦ÂCŸÂC˜ÂC‘ÂCŠÂCƒÂC|ÂCuÂCnÂCgÂC`ÂCYÂCRÂCKÂCDÂC=ÂC6ÂC/ÂC(ÂC!ÂCÂCÂC ÂCÂCþÁC÷ÁCðÁCéÁCâÁCÛÁCÔÁCÍÁCÆÁC¿ÁC¸ÁC±ÁCªÁC£ÁCœÁC•ÁCŽÁC‡ÁC€ÁCyÁCrÁCkÁCdÁC]ÁCVÁCOÁCHÁCAÁC:ÁC3ÁC,ÁC%ÁCÁCÁCÁC ÁCÁCûÀCôÀCíÀCæÀCßÀCØÀCÑÀCÊÀCÃÀC¼ÀCµÀC®ÀC§ÀC ÀC™ÀC’ÀC‹ÀC„ÀC}ÀCvÀCoÀChÀCaÀCZÀCSÀCLÀCEÀC>ÀC7ÀC0ÀC)ÀC"ÀCÀCÀC ÀCÀCÿ¿Cø¿Cñ¿Cê¿Cã¿CÜ¿CÕ¿CοCÇ¿CÀ¿C¹¿C²¿C«¿C¤¿C¿C–¿C¿Cˆ¿C¿Cz¿Cs¿Cl¿Ce¿C^¿CW¿CP¿CI¿CB¿C;¿C4¿C-¿C&¿C¿C¿C¿C ¿C¿Cü¾Cõ¾Cî¾Cç¾Cà¾CÙ¾CÒ¾C˾CľC½¾C¶¾C¯¾C¨¾C¡¾Cš¾C“¾CŒ¾C…¾C~¾Cw¾Cp¾Ci¾Cb¾C[¾CT¾CM¾CF¾C?¾C8¾C1¾C*¾C#¾C¾C¾C¾C¾C¾Cù½Cò½Cë½Cä½CݽCÖ½CϽCȽCÁ½Cº½C³½C¬½C¥½Cž½C—½C½C‰½C‚½C{½Ct½Cm½Cf½C_½CX½CQ½CJ½CC½C<½C5½C.½C'½C ½C½C½C ½C½Cý¼Cö¼Cï¼Cè¼Cá¼CÚ¼CÓ¼C̼CżC¾¼C·¼C°¼C©¼C¢¼C›¼C”¼C¼C†¼C¼Cx¼Cq¼Cj¼Cc¼C\¼CU¼CN¼CG¼C@¼C9¼C2¼C+¼C$¼C¼C¼C¼C¼C¼Cú»Có»Cì»Cå»CÞ»C×»CлCÉ»C»C»»C´»C­»C¦»CŸ»C˜»C‘»CŠ»Cƒ»C|»Cu»Cn»Cg»C`»CY»CR»CK»CD»C=»C6»C/»C(»C!»C»C»C »C»CþºC÷ºCðºCéºCâºCÛºCÔºCͺCƺC¿ºC¸ºC±ºCªºC£ºCœºC•ºCŽºC‡ºC€ºCyºCrºCkºCdºC]ºCVºCOºCHºCAºC:ºC3ºC,ºC%ºCºCºCºC ºCºCû¹Cô¹Cí¹Cæ¹Cß¹CعCѹCʹCùC¼¹Cµ¹C®¹C§¹C ¹C™¹C’¹C‹¹C„¹C}¹Cv¹Co¹Ch¹Ca¹CZ¹CS¹CL¹CE¹C>¹C7¹C0¹C)¹C"¹C¹C¹C ¹C¹Cÿ¸Cø¸Cñ¸Cê¸Cã¸CܸCÕ¸CθCǸCÀ¸C¹¸C²¸C«¸C¤¸C¸C–¸C¸Cˆ¸C¸Cz¸Cs¸Cl¸Ce¸C^¸CW¸CP¸CI¸CB¸C;¸C4¸C-¸C&¸C¸C¸C¸C ¸C¸Cü·Cõ·Cî·Cç·Cà·CÙ·CÒ·CË·CÄ·C½·C¶·C¯·C¨·C¡·Cš·C“·CŒ·C…·C~·Cw·Cp·Ci·Cb·C[·CT·CM·CF·C?·C8·C1·C*·C#·C·C·C·C·C·Cù¶Cò¶Cë¶Cä¶CݶCÖ¶C϶CȶCÁ¶Cº¶C³¶C¬¶C¥¶Cž¶C—¶C¶C‰¶C‚¶C{¶Ct¶Cm¶Cf¶C_¶CX¶CQ¶CJ¶CC¶C<¶C5¶C.¶C'¶C ¶C¶C¶C ¶C¶CýµCöµCïµCèµCáµCÚµCÓµC̵CŵC¾µC·µC°µC©µC¢µC›µC”µCµC†µCµCxµCqµCjµCcµC\µCUµCNµCGµC@µC9µC2µC+µC$µCµCµCµCµCµCú´Có´Cì´Cå´CÞ´C×´CдCÉ´C´C»´C´´C­´C¦´CŸ´C˜´C‘´CŠ´Cƒ´C|´Cu´Cn´Cg´C`´CY´CR´CK´CD´C=´C6´C/´C(´C!´C´C´C ´C´Cþ³C÷³Cð³Cé³Câ³CÛ³CÔ³CͳCƳC¿³C¸³C±³Cª³C£³Cœ³C•³C޳C‡³C€³Cy³Cr³Ck³Cd³C]³CV³CO³CH³CA³C:³C3³C,³C%³C³C³C³C ³C³Cû²Cô²Cí²Cæ²Cß²CزCѲCʲCòC¼²Cµ²C®²C§²C ²C™²C’²C‹²C„²C}²Cv²Co²Ch²Ca²CZ²CS²CL²CE²C>²C7²C0²C)²C"²C²C²C ²C²Cÿ±Cø±Cñ±Cê±Cã±CܱCÕ±CαCDZCÀ±C¹±C²±C«±C¤±C±C–±C±Cˆ±C±Cz±Cs±Cl±Ce±C^±CW±CP±CI±CB±C;±C4±C-±C&±C±C±C±C ±C±Cü°Cõ°Cî°Cç°Cà°CÙ°CÒ°C˰CİC½°C¶°C¯°C¨°C¡°Cš°C“°CŒ°C…°C~°Cw°Cp°Ci°Cb°C[°CT°CM°CF°C?°C8°C1°C*°C#°C°C°C°C°C°Cù¯Cò¯Cë¯Cä¯CݯCÖ¯CϯCȯCÁ¯Cº¯C³¯C¬¯C¥¯Cž¯C—¯C¯C‰¯C‚¯C{¯Ct¯Cm¯Cf¯C_¯CX¯CQ¯CJ¯CC¯C<¯C5¯C.¯C'¯C ¯C¯C¯C ¯C¯Cý®Cö®Cï®Cè®Cá®CÚ®CÓ®CÌ®CÅ®C¾®C·®C°®C©®C¢®C›®C”®C®C†®C®Cx®Cq®Cj®Cc®C\®CU®CN®CG®C@®C9®C2®C+®C$®C®C®C®C®C®Cú­Có­Cì­Cå­CÞ­C×­CЭCÉ­C­C»­C´­C­­C¦­CŸ­C˜­C‘­CŠ­Cƒ­C|­Cu­Cn­Cg­C`­CY­CR­CK­CD­C=­C6­C/­C(­C!­C­C­C ­C­Cþ¬C÷¬Cð¬Cé¬Câ¬CÛ¬CÔ¬CͬCƬC¿¬C¸¬C±¬Cª¬C£¬Cœ¬C•¬CެC‡¬C€¬Cy¬Cr¬Ck¬Cd¬C]¬CV¬CO¬CH¬CA¬C:¬C3¬C,¬C%¬C¬C¬C¬C ¬C¬Cû«Cô«Cí«Cæ«Cß«CØ«CÑ«CÊ«CëC¼«Cµ«C®«C§«C «C™«C’«C‹«C„«C}«Cv«Co«Ch«Ca«CZ«CS«CL«CE«C>«C7«C0«C)«C"«C«C«C «C«CÿªCøªCñªCêªCãªCܪCÕªCΪCǪCÀªC¹ªC²ªC«ªC¤ªCªC–ªCªCˆªCªCzªCsªClªCeªC^ªCWªCPªCIªCBªC;ªC4ªC-ªC&ªCªCªCªC ªCªCü©Cõ©Cî©Cç©Cà©CÙ©CÒ©CË©CÄ©C½©C¶©C¯©C¨©C¡©Cš©C“©CŒ©C…©C~©Cw©Cp©Ci©Cb©C[©CT©CM©CF©C?©C8©C1©C*©C#©C©C©C©C©C©Cù¨Cò¨Cë¨Cä¨CݨCÖ¨CϨCȨCÁ¨Cº¨C³¨C¬¨C¥¨Cž¨C—¨C¨C‰¨C‚¨C{¨Ct¨Cm¨Cf¨C_¨CX¨CQ¨CJ¨CC¨C<¨C5¨C.¨C'¨C ¨C¨C¨C ¨C¨Cý§Cö§Cï§Cè§Cá§CÚ§CÓ§ÇCŧC¾§C·§C°§C©§C¢§C›§C”§C§C†§C§Cx§Cq§Cj§Cc§C\§CU§CN§CG§C@§C9§C2§C+§C$§C§C§C§C§C§Cú¦Có¦Cì¦Cå¦CÞ¦CצCЦCɦC¦C»¦C´¦C­¦C¦¦CŸ¦C˜¦C‘¦CЦCƒ¦C|¦Cu¦Cn¦Cg¦C`¦CY¦CR¦CK¦CD¦C=¦C6¦C/¦C(¦C!¦C¦C¦C ¦C¦Cþ¥C÷¥Cð¥Cé¥Câ¥CÛ¥CÔ¥CÍ¥CÆ¥C¿¥C¸¥C±¥Cª¥C£¥Cœ¥C•¥CŽ¥C‡¥C€¥Cy¥Cr¥Ck¥Cd¥C]¥CV¥CO¥CH¥CA¥C:¥C3¥C,¥C%¥C¥C¥C¥C ¥C¥Cû¤Cô¤Cí¤Cæ¤CߤCؤCѤCʤCäC¼¤Cµ¤C®¤C§¤C ¤C™¤C’¤C‹¤C„¤C}¤Cv¤Co¤Ch¤Ca¤CZ¤CS¤CL¤CE¤C>¤C7¤C0¤C)¤C"¤C¤C¤C ¤C¤Cÿ£Cø£Cñ£Cê£Cã£CÜ£CÕ£CΣCÇ£CÀ£C¹£C²£C«£C¤£C£C–£C£Cˆ£C£Cz£Cs£Cl£Ce£C^£CW£CP£CI£CB£C;£C4£C-£C&£C£C£C£C £C£Cü¢Cõ¢Cî¢Cç¢Cà¢CÙ¢CÒ¢CË¢CÄ¢C½¢C¶¢C¯¢C¨¢C¡¢Cš¢C“¢CŒ¢C…¢C~¢Cw¢Cp¢Ci¢Cb¢C[¢CT¢CM¢CF¢C?¢C8¢C1¢C*¢C#¢C¢C¢C¢C¢C¢Cù¡Cò¡Cë¡Cä¡CÝ¡CÖ¡CÏ¡CÈ¡CÁ¡Cº¡C³¡C¬¡C¥¡Cž¡C—¡C¡C‰¡C‚¡C{¡Ct¡Cm¡Cf¡C_¡CX¡CQ¡CJ¡CC¡C<¡C5¡C.¡C'¡C ¡C¡C¡C ¡C¡Cý Cö Cï Cè Cá CÚ CÓ CÌ CÅ C¾ C· C° C© C¢ C› C” C C† C Cx Cq Cj Cc C\ CU CN CG C@ C9 C2 C+ C$ C C C C C CúŸCóŸCìŸCåŸCÞŸCןCПCÉŸCŸC»ŸC´ŸC­ŸC¦ŸCŸŸC˜ŸC‘ŸCŠŸCƒŸC|ŸCuŸCnŸCgŸC`ŸCYŸCRŸCKŸCDŸC=ŸC6ŸC/ŸC(ŸC!ŸCŸCŸC ŸCŸCþžC÷žCðžCéžCâžCÛžCÔžCÍžCÆžC¿žC¸žC±žCªžC£žCœžC•žCŽžC‡žC€žCyžCržCkžCdžC]žCVžCOžCHžCAžC:žC3žC,žC%žCžCžCžC žCžCûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿœCøœCñœCêœCãœCÜœCÕœCΜCÇœCÀœC¹œC²œC«œC¤œCœC–œCœCˆœCœCzœCsœClœCeœC^œCWœCPœCIœCBœC;œC4œC-œC&œCœCœCœC œCœCü›Cõ›Cî›Cç›Cà›CÙ›CÒ›CË›CÄ›C½›C¶›C¯›C¨›C¡›Cš›C“›CŒ›C…›C~›Cw›Cp›Ci›Cb›C[›CT›CM›CF›C?›C8›C1›C*›C#›C›C›C›C›C›CùšCòšCëšCäšCÝšCÖšCÏšCÈšCÁšCºšC³šC¬šC¥šCžšC—šCšC‰šC‚šC{šCtšCmšCfšC_šCXšCQšCJšCCšC<šC5šC.šC'šC šCšCšC šCšCý™Cö™Cï™Cè™Cá™CÚ™CÓ™CÌ™CÅ™C¾™C·™C°™C©™C¢™C›™C”™C™C†™C™Cx™Cq™Cj™Cc™C\™CU™CN™CG™C@™C9™C2™C+™C$™C™C™C™C™C™Cú˜Có˜Cì˜Cå˜CÞ˜CטCИCɘC˜C»˜C´˜C­˜C¦˜CŸ˜C˜˜C‘˜CŠ˜Cƒ˜C|˜Cu˜Cn˜Cg˜C`˜CY˜CR˜CK˜CD˜C=˜C6˜C/˜C(˜C!˜C˜C˜C ˜C˜Cþ—C÷—Cð—Cé—Câ—CÛ—CÔ—CÍ—CÆ—C¿—C¸—C±—Cª—C£—Cœ—C•—CŽ—C‡—C€—Cy—Cr—Ck—Cd—C]—CV—CO—CH—CA—C:—C3—C,—C%—C—C—C—C —C—Cû–Cô–Cí–Cæ–Cß–CØ–CÑ–CÊ–CÖC¼–Cµ–C®–C§–C –C™–C’–C‹–C„–C}–Cv–Co–Ch–Ca–CZ–CS–CL–CE–C>–C7–C0–C)–C"–C–C–C –C–Cÿ•Cø•Cñ•Cê•Cã•CÜ•CÕ•CΕCÇ•CÀ•C¹•C²•C«•C¤•C•C–•C•Cˆ•C•Cz•Cs•Cl•Ce•C^•CW•CP•CI•CB•C;•C4•C-•C&•C•C•C•C •C•Cü”Cõ”Cî”Cç”Cà”CÙ”CÒ”CË”CÄ”C½”C¶”C¯”C¨”C¡”Cš”C“”CŒ”C…”C~”Cw”Cp”Ci”Cb”C[”CT”CM”CF”C?”C8”C1”C*”C#”C”C”C”C”C”Cù“Cò“Cë“Cä“CÝ“CÖ“CÏ“CÈ“CÁ“Cº“C³“C¬“C¥“Cž“C—“C“C‰“C‚“C{“Ct“Cm“Cf“C_“CX“CQ“CJ“CC“C<“C5“C.“C'“C “C“C“C “C“Cý’Cö’Cï’Cè’Cá’CÚ’CÓ’CÌ’CÅ’C¾’C·’C°’C©’C¢’C›’C”’C’C†’C’Cx’Cq’Cj’Cc’C\’CU’CN’CG’C@’C9’C2’C+’C$’C’C’C’C’C’Cú‘Có‘Cì‘Cå‘CÞ‘CבCБCÉ‘C‘C»‘C´‘C­‘C¦‘CŸ‘C˜‘C‘‘CŠ‘Cƒ‘C|‘Cu‘Cn‘Cg‘C`‘CY‘CR‘CK‘CD‘C=‘C6‘C/‘C(‘C!‘C‘C‘C ‘C‘CþC÷CðCéCâCÛCÔCÍCÆC¿C¸C±CªC£CœC•CŽC‡C€CyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿŽCøŽCñŽCêŽCãŽCÜŽCÕŽCÎŽCÇŽCÀŽC¹ŽC²ŽC«ŽC¤ŽCŽC–ŽCŽCˆŽCŽCzŽCsŽClŽCeŽC^ŽCWŽCPŽCIŽCBŽC;ŽC4ŽC-ŽC&ŽCŽCŽCŽC ŽCŽCüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùŒCòŒCëŒCäŒCÝŒCÖŒCÏŒCÈŒCÁŒCºŒC³ŒC¬ŒC¥ŒCžŒC—ŒCŒC‰ŒC‚ŒC{ŒCtŒCmŒCfŒC_ŒCXŒCQŒCJŒCCŒC<ŒC5ŒC.ŒC'ŒC ŒCŒCŒC ŒCŒCý‹Cö‹Cï‹Cè‹Cá‹CÚ‹CÓ‹CÌ‹CÅ‹C¾‹C·‹C°‹C©‹C¢‹C›‹C”‹C‹C†‹C‹Cx‹Cq‹Cj‹Cc‹C\‹CU‹CN‹CG‹C@‹C9‹C2‹C+‹C$‹C‹C‹C‹C‹C‹CúŠCóŠCìŠCåŠCÞŠC׊CЊCÉŠCŠC»ŠC´ŠC­ŠC¦ŠCŸŠC˜ŠC‘ŠCŠŠCƒŠC|ŠCuŠCnŠCgŠC`ŠCYŠCRŠCKŠCDŠC=ŠC6ŠC/ŠC(ŠC!ŠCŠCŠC ŠCŠCþ‰C÷‰Cð‰Cé‰Câ‰CÛ‰CÔ‰C͉CƉC¿‰C¸‰C±‰Cª‰C£‰Cœ‰C•‰CމC‡‰C€‰Cy‰Cr‰Ck‰Cd‰C]‰CV‰CO‰CH‰CA‰C:‰C3‰C,‰C%‰C‰C‰C‰C ‰C‰CûˆCôˆCíˆCæˆC߈C؈CшCʈCÈC¼ˆCµˆC®ˆC§ˆC ˆC™ˆC’ˆC‹ˆC„ˆC}ˆCvˆCoˆChˆCaˆCZˆCSˆCLˆCEˆC>ˆC7ˆC0ˆC)ˆC"ˆCˆCˆC ˆCˆCÿ‡Cø‡Cñ‡Cê‡Cã‡C܇CÕ‡C·CLJCÀ‡C¹‡C²‡C«‡C¤‡C‡C–‡C‡Cˆ‡C‡Cz‡Cs‡Cl‡Ce‡C^‡CW‡CP‡CI‡CB‡C;‡C4‡C-‡C&‡C‡C‡C‡C ‡C‡Cü†Cõ†Cî†Cç†Cà†CÙ†CÒ†CˆCĆC½†C¶†C¯†C¨†C¡†Cš†C“†CŒ†C…†C~†Cw†Cp†Ci†Cb†C[†CT†CM†CF†C?†C8†C1†C*†C#†C†C†C†C†C†Cù…Cò…Cë…Cä…CÝ…CÖ…CÏ…CÈ…CÁ…Cº…C³…C¬…C¥…Cž…C—…C…C‰…C‚…C{…Ct…Cm…Cf…C_…CX…CQ…CJ…CC…C<…C5…C.…C'…C …C…C…C …C…Cý„Cö„Cï„Cè„Cá„CÚ„CÓ„CÌ„CÅ„C¾„C·„C°„C©„C¢„C›„C”„C„C†„C„Cx„Cq„Cj„Cc„C\„CU„CN„CG„C@„C9„C2„C+„C$„C„C„C„C„C„CúƒCóƒCìƒCåƒCÞƒC׃CЃCɃCƒC»ƒC´ƒC­ƒC¦ƒCŸƒC˜ƒC‘ƒCŠƒCƒƒC|ƒCuƒCnƒCgƒC`ƒCYƒCRƒCKƒCDƒC=ƒC6ƒC/ƒC(ƒC!ƒCƒCƒC ƒCƒCþ‚C÷‚Cð‚Cé‚Câ‚CÛ‚CÔ‚CÍ‚CÆ‚C¿‚C¸‚C±‚Cª‚C£‚Cœ‚C•‚CŽ‚C‡‚C€‚Cy‚Cr‚Ck‚Cd‚C]‚CV‚CO‚CH‚CA‚C:‚C3‚C,‚C%‚C‚C‚C‚C ‚C‚CûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿ€Cø€Cñ€Cê€Cã€CÜ€CÕ€C΀CÇ€CÀ€C¹€C²€C«€C¤€C€C–€C€Cˆ€C€Cz€Cs€Cl€Ce€C^€CW€CP€CI€CB€C;€C4€C-€C&€C€C€C€C €C€CüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCù~Cò~Cë~Cä~CÝ~CÖ~CÏ~CÈ~CÁ~Cº~C³~C¬~C¥~Cž~C—~C~C‰~C‚~C{~Ct~Cm~Cf~C_~CX~CQ~CJ~CC~C<~C5~C.~C'~C ~C~C~C ~C~Cý}Cö}Cï}Cè}Cá}CÚ}CÓ}CÌ}CÅ}C¾}C·}C°}C©}C¢}C›}C”}C}C†}C}Cx}Cq}Cj}Cc}C\}CU}CN}CG}C@}C9}C2}C+}C$}C}C}C}C}C}Cú|Có|Cì|Cå|CÞ|C×|CÐ|CÉ|CÂ|C»|C´|C­|C¦|CŸ|C˜|C‘|CŠ|Cƒ|C||Cu|Cn|Cg|C`|CY|CR|CK|CD|C=|C6|C/|C(|C!|C|C|C |C|Cþ{C÷{Cð{Cé{Câ{CÛ{CÔ{CÍ{CÆ{C¿{C¸{C±{Cª{C£{Cœ{C•{CŽ{C‡{C€{Cy{Cr{Ck{Cd{C]{CV{CO{CH{CA{C:{C3{C,{C%{C{C{C{C {C{CûzCôzCízCæzCßzCØzCÑzCÊzCÃzC¼zCµzC®zC§zC zC™zC’zC‹zC„zC}zCvzCozChzCazCZzCSzCLzCEzC>zC7zC0zC)zC"zCzCzC zCzCÿyCøyCñyCêyCãyCÜyCÕyCÎyCÇyCÀyC¹yC²yC«yC¤yCyC–yCyCˆyCyCzyCsyClyCeyC^yCWyCPyCIyCByC;yC4yC-yC&yCyCyCyC yCyCüxCõxCîxCçxCàxCÙxCÒxCËxCÄxC½xC¶xC¯xC¨xC¡xCšxC“xCŒxC…xC~xCwxCpxCixCbxC[xCTxCMxCFxC?xC8xC1xC*xC#xCxCxCxCxCxCùwCòwCëwCäwCÝwCÖwCÏwCÈwCÁwCºwC³wC¬wC¥wCžwC—wCwC‰wC‚wC{wCtwCmwCfwC_wCXwCQwCJwCCwCsC7sC0sC)sC"sCsCsC sCsCÿrCørCñrCêrCãrCÜrCÕrCÎrCÇrCÀrC¹rC²rC«rC¤rCrC–rCrCˆrCrCzrCsrClrCerC^rCWrCPrCIrCBrC;rC4rC-rC&rCrCrCrC rCrCüqCõqCîqCçqCàqCÙqCÒqCËqCÄqC½qC¶qC¯qC¨qC¡qCšqC“qCŒqC…qC~qCwqCpqCiqCbqC[qCTqCMqCFqC?qC8qC1qC*qC#qCqCqCqCqCqCùpCòpCëpCäpCÝpCÖpCÏpCÈpCÁpCºpC³pC¬pC¥pCžpC—pCpC‰pC‚pC{pCtpCmpCfpC_pCXpCQpCJpCCpClC7lC0lC)lC"lClClC lClCÿkCøkCñkCêkCãkCÜkCÕkCÎkCÇkCÀkC¹kC²kC«kC¤kCkC–kCkCˆkCkCzkCskClkCekC^kCWkCPkCIkCBkC;kC4kC-kC&kCkCkCkC kCkCüjCõjCîjCçjCàjCÙjCÒjCËjCÄjC½jC¶jC¯jC¨jC¡jCšjC“jCŒjC…jC~jCwjCpjCijCbjC[jCTjCMjCFjC?jC8jC1jC*jC#jCjCjCjCjCjCùiCòiCëiCäiCÝiCÖiCÏiCÈiCÁiCºiC³iC¬iC¥iCžiC—iCiC‰iC‚iC{iCtiCmiCfiC_iCXiCQiCJiCCiCeC7eC0eC)eC"eCeCeC eCeCÿdCødCñdCêdCãdCÜdCÕdCÎdCÇdCÀdC¹dC²dC«dC¤dCdC–dCdCˆdCdCzdCsdCldCedC^dCWdCPdCIdCBdC;dC4dC-dC&dCdCdCdC dCdCücCõcCîcCçcCàcCÙcCÒcCËcCÄcC½cC¶cC¯cC¨cC¡cCšcC“cCŒcC…cC~cCwcCpcCicCbcC[cCTcCMcCFcC?cC8cC1cC*cC#cCcCcCcCcCcCùbCòbCëbCäbCÝbCÖbCÏbCÈbCÁbCºbC³bC¬bC¥bCžbC—bCbC‰bC‚bC{bCtbCmbCfbC_bCXbCQbCJbCCbC^C7^C0^C)^C"^C^C^C ^C^Cÿ]Cø]Cñ]Cê]Cã]CÜ]CÕ]CÎ]CÇ]CÀ]C¹]C²]C«]C¤]C]C–]C]Cˆ]C]Cz]Cs]Cl]Ce]C^]CW]CP]CI]CB]C;]C4]C-]C&]C]C]C]C ]C]Cü\Cõ\Cî\Cç\Cà\CÙ\CÒ\CË\CÄ\C½\C¶\C¯\C¨\C¡\Cš\C“\CŒ\C…\C~\Cw\Cp\Ci\Cb\C[\CT\CM\CF\C?\C8\C1\C*\C#\C\C\C\C\C\Cù[Cò[Cë[Cä[CÝ[CÖ[CÏ[CÈ[CÁ[Cº[C³[C¬[C¥[Cž[C—[C[C‰[C‚[C{[Ct[Cm[Cf[C_[CX[CQ[CJ[CC[C<[C5[C.[C'[C [C[C[C [C[CýZCöZCïZCèZCáZCÚZCÓZCÌZCÅZC¾ZC·ZC°ZC©ZC¢ZC›ZC”ZCZC†ZCZCxZCqZCjZCcZC\ZCUZCNZCGZC@ZC9ZC2ZC+ZC$ZCZCZCZCZCZCúYCóYCìYCåYCÞYC×YCÐYCÉYCÂYC»YC´YC­YC¦YCŸYC˜YC‘YCŠYCƒYC|YCuYCnYCgYC`YCYYCRYCKYCDYC=YC6YC/YC(YC!YCYCYC YCYCþXC÷XCðXCéXCâXCÛXCÔXCÍXCÆXC¿XC¸XC±XCªXC£XCœXC•XCŽXC‡XC€XCyXCrXCkXCdXC]XCVXCOXCHXCAXC:XC3XC,XC%XCXCXCXC XCXCûWCôWCíWCæWCßWCØWCÑWCÊWCÃWC¼WCµWC®WC§WC WC™WC’WC‹WC„WC}WCvWCoWChWCaWCZWCSWCLWCEWC>WC7WC0WC)WC"WCWCWC WCWCÿVCøVCñVCêVCãVCÜVCÕVCÎVCÇVCÀVC¹VC²VC«VC¤VCVC–VCVCˆVCVCzVCsVClVCeVC^VCWVCPVCIVCBVC;VC4VC-VC&VCVCVCVC VCVCüUCõUCîUCçUCàUCÙUCÒUCËUCÄUC½UC¶UC¯UC¨UC¡UCšUC“UCŒUC…UC~UCwUCpUCiUCbUC[UCTUCMUCFUC?UC8UC1UC*UC#UCUCUCUCUCUCùTCòTCëTCäTCÝTCÖTCÏTCÈTCÁTCºTC³TC¬TC¥TCžTC—TCTC‰TC‚TC{TCtTCmTCfTC_TCXTCQTCJTCCTCPC7PC0PC)PC"PCPCPC PCPCÿOCøOCñOCêOCãOCÜOCÕOCÎOCÇOCÀOC¹OC²OC«OC¤OCOC–OCOCˆOCOCzOCsOClOCeOC^OCWOCPOCIOCBOC;OC4OC-OC&OCOCOCOC OCOCüNCõNCîNCçNCàNCÙNCÒNCËNCÄNC½NC¶NC¯NC¨NC¡NCšNC“NCŒNC…NC~NCwNCpNCiNCbNC[NCTNCMNCFNC?NC8NC1NC*NC#NCNCNCNCNCNCùMCòMCëMCäMCÝMCÖMCÏMCÈMCÁMCºMC³MC¬MC¥MCžMC—MCMC‰MC‚MC{MCtMCmMCfMC_MCXMCQMCJMCCMCIC7IC0IC)IC"ICICIC ICICÿHCøHCñHCêHCãHCÜHCÕHCÎHCÇHCÀHC¹HC²HC«HC¤HCHC–HCHCˆHCHCzHCsHClHCeHC^HCWHCPHCIHCBHC;HC4HC-HC&HCHCHCHC HCHCüGCõGCîGCçGCàGCÙGCÒGCËGCÄGC½GC¶GC¯GC¨GC¡GCšGC“GCŒGC…GC~GCwGCpGCiGCbGC[GCTGCMGCFGC?GC8GC1GC*GC#GCGCGCGCGCGCùFCòFCëFCäFCÝFCÖFCÏFCÈFCÁFCºFC³FC¬FC¥FCžFC—FCFC‰FC‚FC{FCtFCmFCfFC_FCXFCQFCJFCCFCBC7BC0BC)BC"BCBCBC BCBCÿACøACñACêACãACÜACÕACÎACÇACÀAC¹AC²AC«AC¤ACAC–ACACˆACACzACsAClACeAC^ACWACPACIACBAC;AC4AC-AC&ACACACAC ACACü@Cõ@Cî@Cç@Cà@CÙ@CÒ@CË@CÄ@C½@C¶@C¯@C¨@C¡@Cš@C“@CŒ@C…@C~@Cw@Cp@Ci@Cb@C[@CT@CM@CF@C?@C8@C1@C*@C#@C@C@C@C@C@Cù?Cò?Cë?Cä?CÝ?CÖ?CÏ?CÈ?CÁ?Cº?C³?C¬?C¥?Cž?C—?C?C‰?C‚?C{?Ct?Cm?Cf?C_?CX?CQ?CJ?CC?CCö>Cï>Cè>Cá>CÚ>CÓ>CÌ>CÅ>C¾>C·>C°>C©>C¢>C›>C”>C>C†>C>Cx>Cq>Cj>Cc>C\>CU>CN>CG>C@>C9>C2>C+>C$>C>C>C>C>C>Cú=Có=Cì=Cå=CÞ=C×=CÐ=CÉ=CÂ=C»=C´=C­=C¦=CŸ=C˜=C‘=CŠ=Cƒ=C|=Cu=Cn=Cg=C`=CY=CR=CK=CD=C==C6=C/=C(=C!=C=C=C =C=Cþ;C7;C0;C);C";C;C;C ;C;Cÿ:Cø:Cñ:Cê:Cã:CÜ:CÕ:CÎ:CÇ:CÀ:C¹:C²:C«:C¤:C:C–:C:Cˆ:C:Cz:Cs:Cl:Ce:C^:CW:CP:CI:CB:C;:C4:C-:C&:C:C:C:C :C:Cü9Cõ9Cî9Cç9Cà9CÙ9CÒ9CË9CÄ9C½9C¶9C¯9C¨9C¡9Cš9C“9CŒ9C…9C~9Cw9Cp9Ci9Cb9C[9CT9CM9CF9C?9C89C19C*9C#9C9C9C9C9C9Cù8Cò8Cë8Cä8CÝ8CÖ8CÏ8CÈ8CÁ8Cº8C³8C¬8C¥8Cž8C—8C8C‰8C‚8C{8Ct8Cm8Cf8C_8CX8CQ8CJ8CC8C<8C58C.8C'8C 8C8C8C 8C8Cý7Cö7Cï7Cè7Cá7CÚ7CÓ7CÌ7CÅ7C¾7C·7C°7C©7C¢7C›7C”7C7C†7C7Cx7Cq7Cj7Cc7C\7CU7CN7CG7C@7C97C27C+7C$7C7C7C7C7C7Cú6Có6Cì6Cå6CÞ6C×6CÐ6CÉ6CÂ6C»6C´6C­6C¦6CŸ6C˜6C‘6CŠ6Cƒ6C|6Cu6Cn6Cg6C`6CY6CR6CK6CD6C=6C66C/6C(6C!6C6C6C 6C6Cþ5C÷5Cð5Cé5Câ5CÛ5CÔ5CÍ5CÆ5C¿5C¸5C±5Cª5C£5Cœ5C•5CŽ5C‡5C€5Cy5Cr5Ck5Cd5C]5CV5CO5CH5CA5C:5C35C,5C%5C5C5C5C 5C5Cû4Cô4Cí4Cæ4Cß4CØ4CÑ4CÊ4CÃ4C¼4Cµ4C®4C§4C 4C™4C’4C‹4C„4C}4Cv4Co4Ch4Ca4CZ4CS4CL4CE4C>4C74C04C)4C"4C4C4C 4C4Cÿ3Cø3Cñ3Cê3Cã3CÜ3CÕ3CÎ3CÇ3CÀ3C¹3C²3C«3C¤3C3C–3C3Cˆ3C3Cz3Cs3Cl3Ce3C^3CW3CP3CI3CB3C;3C43C-3C&3C3C3C3C 3C3Cü2Cõ2Cî2Cç2Cà2CÙ2CÒ2CË2CÄ2C½2C¶2C¯2C¨2C¡2Cš2C“2CŒ2C…2C~2Cw2Cp2Ci2Cb2C[2CT2CM2CF2C?2C82C12C*2C#2C2C2C2C2C2Cù1Cò1Cë1Cä1CÝ1CÖ1CÏ1CÈ1CÁ1Cº1C³1C¬1C¥1Cž1C—1C1C‰1C‚1C{1Ct1Cm1Cf1C_1CX1CQ1CJ1CC1C<1C51C.1C'1C 1C1C1C 1C1Cý0Cö0Cï0Cè0Cá0CÚ0CÓ0CÌ0CÅ0C¾0C·0C°0C©0C¢0C›0C”0C0C†0C0Cx0Cq0Cj0Cc0C\0CU0CN0CG0C@0C90C20C+0C$0C0C0C0C0C0Cú/Có/Cì/Cå/CÞ/C×/CÐ/CÉ/CÂ/C»/C´/C­/C¦/CŸ/C˜/C‘/CŠ/Cƒ/C|/Cu/Cn/Cg/C`/CY/CR/CK/CD/C=/C6/C//C(/C!/C/C/C /C/Cþ.C÷.Cð.Cé.Câ.CÛ.CÔ.CÍ.CÆ.C¿.C¸.C±.Cª.C£.Cœ.C•.CŽ.C‡.C€.Cy.Cr.Ck.Cd.C].CV.CO.CH.CA.C:.C3.C,.C%.C.C.C.C .C.Cû-Cô-Cí-Cæ-Cß-CØ-CÑ-CÊ-CÃ-C¼-Cµ-C®-C§-C -C™-C’-C‹-C„-C}-Cv-Co-Ch-Ca-CZ-CS-CL-CE-C>-C7-C0-C)-C"-C-C-C -C-Cÿ,Cø,Cñ,Cê,Cã,CÜ,CÕ,CÎ,CÇ,CÀ,C¹,C²,C«,C¤,C,C–,C,Cˆ,C,Cz,Cs,Cl,Ce,C^,CW,CP,CI,CB,C;,C4,C-,C&,C,C,C,C ,C,Cü+Cõ+Cî+Cç+Cà+CÙ+CÒ+CË+CÄ+C½+C¶+C¯+C¨+C¡+Cš+C“+CŒ+C…+C~+Cw+Cp+Ci+Cb+C[+CT+CM+CF+C?+C8+C1+C*+C#+C+C+C+C+C+Cù*Cò*Cë*Cä*CÝ*CÖ*CÏ*CÈ*CÁ*Cº*C³*C¬*C¥*Cž*C—*C*C‰*C‚*C{*Ct*Cm*Cf*C_*CX*CQ*CJ*CC*C<*C5*C.*C'*C *C*C*C *C*Cý)Cö)Cï)Cè)Cá)CÚ)CÓ)CÌ)CÅ)C¾)C·)C°)C©)C¢)C›)C”)C)C†)C)Cx)Cq)Cj)Cc)C\)CU)CN)CG)C@)C9)C2)C+)C$)C)C)C)C)C)Cú(Có(Cì(Cå(CÞ(C×(CÐ(CÉ(CÂ(C»(C´(C­(C¦(CŸ(C˜(C‘(CŠ(Cƒ(C|(Cu(Cn(Cg(C`(CY(CR(CK(CD(C=(C6(C/(C((C!(C(C(C (C(Cþ'C÷'Cð'Cé'Câ'CÛ'CÔ'CÍ'CÆ'C¿'C¸'C±'Cª'C£'Cœ'C•'CŽ'C‡'C€'Cy'Cr'Ck'Cd'C]'CV'CO'CH'CA'C:'C3'C,'C%'C'C'C'C 'C'Cû&Cô&Cí&Cæ&Cß&CØ&CÑ&CÊ&CÃ&C¼&Cµ&C®&C§&C &C™&C’&C‹&C„&C}&Cv&Co&Ch&Ca&CZ&CS&CL&CE&C>&C7&C0&C)&C"&C&C&C &C&Cÿ%Cø%Cñ%Cê%Cã%CÜ%CÕ%CÎ%CÇ%CÀ%C¹%C²%C«%C¤%C%C–%C%Cˆ%C%Cz%Cs%Cl%Ce%C^%CW%CP%CI%CB%C;%C4%C-%C&%C%C%C%C %C%Cü$Cõ$Cî$Cç$Cà$CÙ$CÒ$CË$CÄ$C½$C¶$C¯$C¨$C¡$Cš$C“$CŒ$C…$C~$Cw$Cp$Ci$Cb$C[$CT$CM$CF$C?$C8$C1$C*$C#$C$C$C$C$C$Cù#Cò#Cë#Cä#CÝ#CÖ#CÏ#CÈ#CÁ#Cº#C³#C¬#C¥#Cž#C—#C#C‰#C‚#C{#Ct#Cm#Cf#C_#CX#CQ#CJ#CC#C<#C5#C.#C'#C #C#C#C #C#Cý"Cö"Cï"Cè"Cá"CÚ"CÓ"CÌ"CÅ"C¾"C·"C°"C©"C¢"C›"C”"C"C†"C"Cx"Cq"Cj"Cc"C\"CU"CN"CG"C@"C9"C2"C+"C$"C"C"C"C"C"Cú!Có!Cì!Cå!CÞ!C×!CÐ!CÉ!CÂ!C»!C´!C­!C¦!CŸ!C˜!C‘!CŠ!Cƒ!C|!Cu!Cn!Cg!C`!CY!CR!CK!CD!C=!C6!C/!C(!C!!C!C!C !C!Cþ C÷ Cð Cé Câ CÛ CÔ CÍ CÆ C¿ C¸ C± Cª C£ Cœ C• CŽ C‡ C€ Cy Cr Ck Cd C] CV CO CH CA C: C3 C, C% C C C C C CûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCýCöCïCèCáCÚCÓCÌCÅC¾C·C°C©C¢C›C”CC†CCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCúCóCìCåCÞC×CÐCÉCÂC»C´C­C¦CŸC˜C‘CŠCƒC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCþC÷CðCéCâCÛCÔCÍCÆC¿C¸C±CªC£CœC•CŽC‡C€CyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCýCöCïCèCáCÚCÓCÌCÅC¾C·C°C©C¢C›C”CC†CCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCúCóCìCåCÞC×CÐCÉCÂC»C´C­C¦CŸC˜C‘CŠCƒC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCþC÷CðCéCâCÛCÔCÍCÆC¿C¸C±CªC£CœC•CŽC‡C€CyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCý Cö Cï Cè Cá CÚ CÓ CÌ CÅ C¾ C· C° C© C¢ C› C” C C† C Cx Cq Cj Cc C\ CU CN CG C@ C9 C2 C+ C$ C C C C C Cú Có Cì Cå CÞ C× CÐ CÉ C C» C´ C­ C¦ CŸ C˜ C‘ CŠ Cƒ C| Cu Cn Cg C` CY CR CK CD C= C6 C/ C( C! C C C C Cþ C÷ Cð Cé Câ CÛ CÔ CÍ CÆ C¿ C¸ C± Cª C£ Cœ C• CŽ C‡ C€ Cy Cr Ck Cd C] CV CO CH CA C: C3 C, C% C C C C C Cû Cô Cí Cæ Cß CØ CÑ CÊ Cà C¼ Cµ C® C§ C  C™ C’ C‹ C„ C} Cv Co Ch Ca CZ CS CL CE C> C7 C0 C) C" C C C C Cÿ Cø Cñ Cê Cã CÜ CÕ CÎ CÇ CÀ C¹ C² C« C¤ C C– C Cˆ C Cz Cs Cl Ce C^ CW CP CI CB C; C4 C- C& C C C C C CüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCýCöCïCèCáCÚCÓCÌCÅC¾C·C°C©C¢C›C”CC†CCxCqCjCcC\CUCNCGC@C9C2C+C$CCCCCCúCóCìCåCÞC×CÐCÉCÂC»C´C­C¦CŸC˜C‘CŠCƒC|CuCnCgC`CYCRCKCDC=C6C/C(C!CCC CCþC÷CðCéCâCÛCÔCÍCÆC¿C¸C±CªC£CœC•CŽC‡C€CyCrCkCdC]CVCOCHCAC:C3C,C%CCCC CCûCôCíCæCßCØCÑCÊCÃC¼CµC®C§C C™C’C‹C„C}CvCoChCaCZCSCLCEC>C7C0C)C"CCC CCÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC<C5C.C'C CCC CCýÿBöÿBïÿBèÿBáÿBÚÿBÓÿBÌÿBÅÿB¾ÿB·ÿB°ÿB©ÿB¢ÿB›ÿB”ÿBÿB†ÿBÿBxÿBqÿBjÿBcÿB\ÿBUÿBNÿBGÿB@ÿB9ÿB2ÿB+ÿB$ÿBÿBÿBÿBÿBÿBúþBóþBìþBåþBÞþB×þBÐþBÉþBÂþB»þB´þB­þB¦þBŸþB˜þB‘þBŠþBƒþB|þBuþBnþBgþB`þBYþBRþBKþBDþB=þB6þB/þB(þB!þBþBþB þBþBþýB÷ýBðýBéýBâýBÛýBÔýBÍýBÆýB¿ýB¸ýB±ýBªýB£ýBœýB•ýBŽýB‡ýB€ýByýBrýBkýBdýB]ýBVýBOýBHýBAýB:ýB3ýB,ýB%ýBýBýBýB ýBýBûüBôüBíüBæüBßüBØüBÑüBÊüBÃüB¼üBµüB®üB§üB üB™üB’üB‹üB„üB}üBvüBoüBhüBaüBZüBSüBLüBEüB>üB7üB0üB)üB"üBüBüB üBüBÿûBøûBñûBêûBãûBÜûBÕûBÎûBÇûBÀûB¹ûB²ûB«ûB¤ûBûB–ûBûBˆûBûBzûBsûBlûBeûB^ûBWûBPûBIûBBûB;ûB4ûB-ûB&ûBûBûBûB ûBûBüúBõúBîúBçúBàúBÙúBÒúBËúBÄúB½úB¶úB¯úB¨úB¡úBšúB“úBŒúB…úB~úBwúBpúBiúBbúB[úBTúBMúBFúB?úB8úB1úB*úB#úBúBúBúBúBúBùùBòùBëùBäùBÝùBÖùBÏùBÈùBÁùBºùB³ùB¬ùB¥ùBžùB—ùBùB‰ùB‚ùB{ùBtùBmùBfùB_ùBXùBQùBJùBCùB<ùB5ùB.ùB'ùB ùBùBùB ùBùBýøBöøBïøBèøBáøBÚøBÓøBÌøBÅøB¾øB·øB°øB©øB¢øB›øB”øBøB†øBøBxøBqøBjøBcøB\øBUøBNøBGøB@øB9øB2øB+øB$øBøBøBøBøBøBú÷Bó÷Bì÷Bå÷BÞ÷B×÷BÐ÷BÉ÷BÂ÷B»÷B´÷B­÷B¦÷BŸ÷B˜÷B‘÷BŠ÷Bƒ÷B|÷Bu÷Bn÷Bg÷B`÷BY÷BR÷BK÷BD÷B=÷B6÷B/÷B(÷B!÷B÷B÷B ÷B÷BþöB÷öBðöBéöBâöBÛöBÔöBÍöBÆöB¿öB¸öB±öBªöB£öBœöB•öBŽöB‡öB€öByöBröBköBdöB]öBVöBOöBHöBAöB:öB3öB,öB%öBöBöBöB öBöBûõBôõBíõBæõBßõBØõBÑõBÊõBÃõB¼õBµõB®õB§õB õB™õB’õB‹õB„õB}õBvõBoõBhõBaõBZõBSõBLõBEõB>õB7õB0õB)õB"õBõBõB õBõBÿôBøôBñôBêôBãôBÜôBÕôBÎôBÇôBÀôB¹ôB²ôB«ôB¤ôBôB–ôBôBˆôBôBzôBsôBlôBeôB^ôBWôBPôBIôBBôB;ôB4ôB-ôB&ôBôBôBôB ôBôBüóBõóBîóBçóBàóBÙóBÒóBËóBÄóB½óB¶óB¯óB¨óB¡óBšóB“óBŒóB…óB~óBwóBpóBióBbóB[óBTóBMóBFóB?óB8óB1óB*óB#óBóBóBóBóBóBùòBòòBëòBäòBÝòBÖòBÏòBÈòBÁòBºòB³òB¬òB¥òBžòB—òBòB‰òB‚òB{òBtòBmòBfòB_òBXòBQòBJòBCòB<òB5òB.òB'òB òBòBòB òBòBýñBöñBïñBèñBáñBÚñBÓñBÌñBÅñB¾ñB·ñB°ñB©ñB¢ñB›ñB”ñBñB†ñBñBxñBqñBjñBcñB\ñBUñBNñBGñB@ñB9ñB2ñB+ñB$ñBñBñBñBñBñBúðBóðBìðBåðBÞðB×ðBÐðBÉðBÂðB»ðB´ðB­ðB¦ðBŸðB˜ðB‘ðBŠðBƒðB|ðBuðBnðBgðB`ðBYðBRðBKðBDðB=ðB6ðB/ðB(ðB!ðBðBðB ðBðBþïB÷ïBðïBéïBâïBÛïBÔïBÍïBÆïB¿ïB¸ïB±ïBªïB£ïBœïB•ïBŽïB‡ïB€ïByïBrïBkïBdïB]ïBVïBOïBHïBAïB:ïB3ïB,ïB%ïBïBïBïB ïBïBûîBôîBíîBæîBßîBØîBÑîBÊîBÃîB¼îBµîB®îB§îB îB™îB’îB‹îB„îB}îBvîBoîBhîBaîBZîBSîBLîBEîB>îB7îB0îB)îB"îBîBîB îBîBÿíBøíBñíBêíBãíBÜíBÕíBÎíBÇíBÀíB¹íB²íB«íB¤íBíB–íBíBˆíBíBzíBsíBlíBeíB^íBWíBPíBIíBBíB;íB4íB-íB&íBíBíBíB íBíBüìBõìBîìBçìBàìBÙìBÒìBËìBÄìB½ìB¶ìB¯ìB¨ìB¡ìBšìB“ìBŒìB…ìB~ìBwìBpìBiìBbìB[ìBTìBMìBFìB?ìB8ìB1ìB*ìB#ìBìBìBìBìBìBùëBòëBëëBäëBÝëBÖëBÏëBÈëBÁëBºëB³ëB¬ëB¥ëBžëB—ëBëB‰ëB‚ëB{ëBtëBmëBfëB_ëBXëBQëBJëBCëB<ëB5ëB.ëB'ëB ëBëBëB ëBëBýêBöêBïêBèêBáêBÚêBÓêBÌêBÅêB¾êB·êB°êB©êB¢êB›êB”êBêB†êBêBxêBqêBjêBcêB\êBUêBNêBGêB@êB9êB2êB+êB$êBêBêBêBêBêBúéBóéBìéBåéBÞéB×éBÐéBÉéBÂéB»éB´éB­éB¦éBŸéB˜éB‘éBŠéBƒéB|éBuéBnéBgéB`éBYéBRéBKéBDéB=éB6éB/éB(éB!éBéBéB éBéBþèB÷èBðèBéèBâèBÛèBÔèBÍèBÆèB¿èB¸èB±èBªèB£èBœèB•èBŽèB‡èB€èByèBrèBkèBdèB]èBVèBOèBHèBAèB:èB3èB,èB%èBèBèBèB èBèBûçBôçBíçBæçBßçBØçBÑçBÊçBÃçB¼çBµçB®çB§çB çB™çB’çB‹çB„çB}çBvçBoçBhçBaçBZçBSçBLçBEçB>çB7çB0çB)çB"çBçBçB çBçBÿæBøæBñæBêæBãæBÜæBÕæBÎæBÇæBÀæB¹æB²æB«æB¤æBæB–æBæBˆæBæBzæBsæBlæBeæB^æBWæBPæBIæBBæB;æB4æB-æB&æBæBæBæB æBæBüåBõåBîåBçåBàåBÙåBÒåBËåBÄåB½åB¶åB¯åB¨åB¡åBšåB“åBŒåB…åB~åBwåBpåBiåBbåB[åBTåBMåBFåB?åB8åB1åB*åB#åBåBåBåBåBåBùäBòäBëäBääBÝäBÖäBÏäBÈäBÁäBºäB³äB¬äB¥äBžäB—äBäB‰äB‚äB{äBtäBmäBfäB_äBXäBQäBJäBCäB<äB5äB.äB'äB äBäBäB äBäBýãBöãBïãBèãBáãBÚãBÓãBÌãBÅãB¾ãB·ãB°ãB©ãB¢ãB›ãB”ãBãB†ãBãBxãBqãBjãBcãB\ãBUãBNãBGãB@ãB9ãB2ãB+ãB$ãBãBãBãBãBãBúâBóâBìâBåâBÞâB×âBÐâBÉâBÂâB»âB´âB­âB¦âBŸâB˜âB‘âBŠâBƒâB|âBuâBnâBgâB`âBYâBRâBKâBDâB=âB6âB/âB(âB!âBâBâB âBâBþáB÷áBðáBéáBâáBÛáBÔáBÍáBÆáB¿áB¸áB±áBªáB£áBœáB•áBŽáB‡áB€áByáBráBkáBdáB]áBVáBOáBHáBAáB:áB3áB,áB%áBáBáBáB áBáBûàBôàBíàBæàBßàBØàBÑàBÊàBÃàB¼àBµàB®àB§àB àB™àB’àB‹àB„àB}àBvàBoàBhàBaàBZàBSàBLàBEàB>àB7àB0àB)àB"àBàBàB àBàBÿßBøßBñßBêßBãßBÜßBÕßBÎßBÇßBÀßB¹ßB²ßB«ßB¤ßBßB–ßBßBˆßBßBzßBsßBlßBeßB^ßBWßBPßBIßBBßB;ßB4ßB-ßB&ßBßBßBßB ßBßBüÞBõÞBîÞBçÞBàÞBÙÞBÒÞBËÞBÄÞB½ÞB¶ÞB¯ÞB¨ÞB¡ÞBšÞB“ÞBŒÞB…ÞB~ÞBwÞBpÞBiÞBbÞB[ÞBTÞBMÞBFÞB?ÞB8ÞB1ÞB*ÞB#ÞBÞBÞBÞBÞBÞBùÝBòÝBëÝBäÝBÝÝBÖÝBÏÝBÈÝBÁÝBºÝB³ÝB¬ÝB¥ÝBžÝB—ÝBÝB‰ÝB‚ÝB{ÝBtÝBmÝBfÝB_ÝBXÝBQÝBJÝBCÝB<ÝB5ÝB.ÝB'ÝB ÝBÝBÝB ÝBÝBýÜBöÜBïÜBèÜBáÜBÚÜBÓÜBÌÜBÅÜB¾ÜB·ÜB°ÜB©ÜB¢ÜB›ÜB”ÜBÜB†ÜBÜBxÜBqÜBjÜBcÜB\ÜBUÜBNÜBGÜB@ÜB9ÜB2ÜB+ÜB$ÜBÜBÜBÜBÜBÜBúÛBóÛBìÛBåÛBÞÛB×ÛBÐÛBÉÛBÂÛB»ÛB´ÛB­ÛB¦ÛBŸÛB˜ÛB‘ÛBŠÛBƒÛB|ÛBuÛBnÛBgÛB`ÛBYÛBRÛBKÛBDÛB=ÛB6ÛB/ÛB(ÛB!ÛBÛBÛB ÛBÛBþÚB÷ÚBðÚBéÚBâÚBÛÚBÔÚBÍÚBÆÚB¿ÚB¸ÚB±ÚBªÚB£ÚBœÚB•ÚBŽÚB‡ÚB€ÚByÚBrÚBkÚBdÚB]ÚBVÚBOÚBHÚBAÚB:ÚB3ÚB,ÚB%ÚBÚBÚBÚB ÚBÚBûÙBôÙBíÙBæÙBßÙBØÙBÑÙBÊÙBÃÙB¼ÙBµÙB®ÙB§ÙB ÙB™ÙB’ÙB‹ÙB„ÙB}ÙBvÙBoÙBhÙBaÙBZÙBSÙBLÙBEÙB>ÙB7ÙB0ÙB)ÙB"ÙBÙBÙB ÙBÙBÿØBøØBñØBêØBãØBÜØBÕØBÎØBÇØBÀØB¹ØB²ØB«ØB¤ØBØB–ØBØBˆØBØBzØBsØBlØBeØB^ØBWØBPØBIØBBØB;ØB4ØB-ØB&ØBØBØBØB ØBØBü×Bõ×Bî×Bç×Bà×BÙ×BÒ×BË×BÄ×B½×B¶×B¯×B¨×B¡×Bš×B“×BŒ×B…×B~×Bw×Bp×Bi×Bb×B[×BT×BM×BF×B?×B8×B1×B*×B#×B×B×B×B×B×BùÖBòÖBëÖBäÖBÝÖBÖÖBÏÖBÈÖBÁÖBºÖB³ÖB¬ÖB¥ÖBžÖB—ÖBÖB‰ÖB‚ÖB{ÖBtÖBmÖBfÖB_ÖBXÖBQÖBJÖBCÖB<ÖB5ÖB.ÖB'ÖB ÖBÖBÖB ÖBÖBýÕBöÕBïÕBèÕBáÕBÚÕBÓÕBÌÕBÅÕB¾ÕB·ÕB°ÕB©ÕB¢ÕB›ÕB”ÕBÕB†ÕBÕBxÕBqÕBjÕBcÕB\ÕBUÕBNÕBGÕB@ÕB9ÕB2ÕB+ÕB$ÕBÕBÕBÕBÕBÕBúÔBóÔBìÔBåÔBÞÔB×ÔBÐÔBÉÔBÂÔB»ÔB´ÔB­ÔB¦ÔBŸÔB˜ÔB‘ÔBŠÔBƒÔB|ÔBuÔBnÔBgÔB`ÔBYÔBRÔBKÔBDÔB=ÔB6ÔB/ÔB(ÔB!ÔBÔBÔB ÔBÔBþÓB÷ÓBðÓBéÓBâÓBÛÓBÔÓBÍÓBÆÓB¿ÓB¸ÓB±ÓBªÓB£ÓBœÓB•ÓBŽÓB‡ÓB€ÓByÓBrÓBkÓBdÓB]ÓBVÓBOÓBHÓBAÓB:ÓB3ÓB,ÓB%ÓBÓBÓBÓB ÓBÓBûÒBôÒBíÒBæÒBßÒBØÒBÑÒBÊÒBÃÒB¼ÒBµÒB®ÒB§ÒB ÒB™ÒB’ÒB‹ÒB„ÒB}ÒBvÒBoÒBhÒBaÒBZÒBSÒBLÒBEÒB>ÒB7ÒB0ÒB)ÒB"ÒBÒBÒB ÒBÒBÿÑBøÑBñÑBêÑBãÑBÜÑBÕÑBÎÑBÇÑBÀÑB¹ÑB²ÑB«ÑB¤ÑBÑB–ÑBÑBˆÑBÑBzÑBsÑBlÑBeÑB^ÑBWÑBPÑBIÑBBÑB;ÑB4ÑB-ÑB&ÑBÑBÑBÑB ÑBÑBüÐBõÐBîÐBçÐBàÐBÙÐBÒÐBËÐBÄÐB½ÐB¶ÐB¯ÐB¨ÐB¡ÐBšÐB“ÐBŒÐB…ÐB~ÐBwÐBpÐBiÐBbÐB[ÐBTÐBMÐBFÐB?ÐB8ÐB1ÐB*ÐB#ÐBÐBÐBÐBÐBÐBùÏBòÏBëÏBäÏBÝÏBÖÏBÏÏBÈÏBÁÏBºÏB³ÏB¬ÏB¥ÏBžÏB—ÏBÏB‰ÏB‚ÏB{ÏBtÏBmÏBfÏB_ÏBXÏBQÏBJÏBCÏB<ÏB5ÏB.ÏB'ÏB ÏBÏBÏB ÏBÏBýÎBöÎBïÎBèÎBáÎBÚÎBÓÎBÌÎBÅÎB¾ÎB·ÎB°ÎB©ÎB¢ÎB›ÎB”ÎBÎB†ÎBÎBxÎBqÎBjÎBcÎB\ÎBUÎBNÎBGÎB@ÎB9ÎB2ÎB+ÎB$ÎBÎBÎBÎBÎBÎBúÍBóÍBìÍBåÍBÞÍB×ÍBÐÍBÉÍBÂÍB»ÍB´ÍB­ÍB¦ÍBŸÍB˜ÍB‘ÍBŠÍBƒÍB|ÍBuÍBnÍBgÍB`ÍBYÍBRÍBKÍBDÍB=ÍB6ÍB/ÍB(ÍB!ÍBÍBÍB ÍBÍBþÌB÷ÌBðÌBéÌBâÌBÛÌBÔÌBÍÌBÆÌB¿ÌB¸ÌB±ÌBªÌB£ÌBœÌB•ÌBŽÌB‡ÌB€ÌByÌBrÌBkÌBdÌB]ÌBVÌBOÌBHÌBAÌB:ÌB3ÌB,ÌB%ÌBÌBÌBÌB ÌBÌBûËBôËBíËBæËBßËBØËBÑËBÊËBÃËB¼ËBµËB®ËB§ËB ËB™ËB’ËB‹ËB„ËB}ËBvËBoËBhËBaËBZËBSËBLËBEËB>ËB7ËB0ËB)ËB"ËBËBËB ËBËBÿÊBøÊBñÊBêÊBãÊBÜÊBÕÊBÎÊBÇÊBÀÊB¹ÊB²ÊB«ÊB¤ÊBÊB–ÊBÊBˆÊBÊBzÊBsÊBlÊBeÊB^ÊBWÊBPÊBIÊBBÊB;ÊB4ÊB-ÊB&ÊBÊBÊBÊB ÊBÊBüÉBõÉBîÉBçÉBàÉBÙÉBÒÉBËÉBÄÉB½ÉB¶ÉB¯ÉB¨ÉB¡ÉBšÉB“ÉBŒÉB…ÉB~ÉBwÉBpÉBiÉBbÉB[ÉBTÉBMÉBFÉB?ÉB8ÉB1ÉB*ÉB#ÉBÉBÉBÉBÉBÉBùÈBòÈBëÈBäÈBÝÈBÖÈBÏÈBÈÈBÁÈBºÈB³ÈB¬ÈB¥ÈBžÈB—ÈBÈB‰ÈB‚ÈB{ÈBtÈBmÈBfÈB_ÈBXÈBQÈBJÈBCÈB<ÈB5ÈB.ÈB'ÈB ÈBÈBÈB ÈBÈBýÇBöÇBïÇBèÇBáÇBÚÇBÓÇBÌÇBÅÇB¾ÇB·ÇB°ÇB©ÇB¢ÇB›ÇB”ÇBÇB†ÇBÇBxÇBqÇBjÇBcÇB\ÇBUÇBNÇBGÇB@ÇB9ÇB2ÇB+ÇB$ÇBÇBÇBÇBÇBÇBúÆBóÆBìÆBåÆBÞÆBׯBÐÆBÉÆBÂÆB»ÆB´ÆB­ÆB¦ÆBŸÆB˜ÆB‘ÆBŠÆBƒÆB|ÆBuÆBnÆBgÆB`ÆBYÆBRÆBKÆBDÆB=ÆB6ÆB/ÆB(ÆB!ÆBÆBÆB ÆBÆBþÅB÷ÅBðÅBéÅBâÅBÛÅBÔÅBÍÅBÆÅB¿ÅB¸ÅB±ÅBªÅB£ÅBœÅB•ÅBŽÅB‡ÅB€ÅByÅBrÅBkÅBdÅB]ÅBVÅBOÅBHÅBAÅB:ÅB3ÅB,ÅB%ÅBÅBÅBÅB ÅBÅBûÄBôÄBíÄBæÄBßÄBØÄBÑÄBÊÄBÃÄB¼ÄBµÄB®ÄB§ÄB ÄB™ÄB’ÄB‹ÄB„ÄB}ÄBvÄBoÄBhÄBaÄBZÄBSÄBLÄBEÄB>ÄB7ÄB0ÄB)ÄB"ÄBÄBÄB ÄBÄBÿÃBøÃBñÃBêÃBãÃBÜÃBÕÃBÎÃBÇÃBÀÃB¹ÃB²ÃB«ÃB¤ÃBÃB–ÃBÃBˆÃBÃBzÃBsÃBlÃBeÃB^ÃBWÃBPÃBIÃBBÃB;ÃB4ÃB-ÃB&ÃBÃBÃBÃB ÃBÃBüÂBõÂBîÂBçÂBàÂBÙÂBÒÂBËÂBÄÂB½ÂB¶ÂB¯ÂB¨ÂB¡ÂBšÂB“ÂBŒÂB…ÂB~ÂBwÂBpÂBiÂBbÂB[ÂBTÂBMÂBFÂB?ÂB8ÂB1ÂB*ÂB#ÂBÂBÂBÂBÂBÂBùÁBòÁBëÁBäÁBÝÁBÖÁBÏÁBÈÁBÁÁBºÁB³ÁB¬ÁB¥ÁBžÁB—ÁBÁB‰ÁB‚ÁB{ÁBtÁBmÁBfÁB_ÁBXÁBQÁBJÁBCÁB<ÁB5ÁB.ÁB'ÁB ÁBÁBÁB ÁBÁBýÀBöÀBïÀBèÀBáÀBÚÀBÓÀBÌÀBÅÀB¾ÀB·ÀB°ÀB©ÀB¢ÀB›ÀB”ÀBÀB†ÀBÀBxÀBqÀBjÀBcÀB\ÀBUÀBNÀBGÀB@ÀB9ÀB2ÀB+ÀB$ÀBÀBÀBÀBÀBÀBú¿Bó¿Bì¿Bå¿BÞ¿B׿BпBÉ¿B¿B»¿B´¿B­¿B¦¿BŸ¿B˜¿B‘¿BŠ¿Bƒ¿B|¿Bu¿Bn¿Bg¿B`¿BY¿BR¿BK¿BD¿B=¿B6¿B/¿B(¿B!¿B¿B¿B ¿B¿Bþ¾B÷¾Bð¾Bé¾Bâ¾BÛ¾BÔ¾B;BƾB¿¾B¸¾B±¾Bª¾B£¾Bœ¾B•¾B޾B‡¾B€¾By¾Br¾Bk¾Bd¾B]¾BV¾BO¾BH¾BA¾B:¾B3¾B,¾B%¾B¾B¾B¾B ¾B¾Bû½Bô½Bí½Bæ½Bß½BؽBѽBʽBýB¼½Bµ½B®½B§½B ½B™½B’½B‹½B„½B}½Bv½Bo½Bh½Ba½BZ½BS½BL½BE½B>½B7½B0½B)½B"½B½B½B ½B½Bÿ¼Bø¼Bñ¼Bê¼Bã¼BܼBÕ¼BμBǼBÀ¼B¹¼B²¼B«¼B¤¼B¼B–¼B¼Bˆ¼B¼Bz¼Bs¼Bl¼Be¼B^¼BW¼BP¼BI¼BB¼B;¼B4¼B-¼B&¼B¼B¼B¼B ¼B¼Bü»Bõ»Bî»Bç»Bà»BÙ»BÒ»BË»BÄ»B½»B¶»B¯»B¨»B¡»Bš»B“»BŒ»B…»B~»Bw»Bp»Bi»Bb»B[»BT»BM»BF»B?»B8»B1»B*»B#»B»B»B»B»B»BùºBòºBëºBäºBݺBÖºBϺBȺBÁºBººB³ºB¬ºB¥ºBžºB—ºBºB‰ºB‚ºB{ºBtºBmºBfºB_ºBXºBQºBJºBCºB<ºB5ºB.ºB'ºB ºBºBºB ºBºBý¹Bö¹Bï¹Bè¹Bá¹BÚ¹BÓ¹B̹BŹB¾¹B·¹B°¹B©¹B¢¹B›¹B”¹B¹B†¹B¹Bx¹Bq¹Bj¹Bc¹B\¹BU¹BN¹BG¹B@¹B9¹B2¹B+¹B$¹B¹B¹B¹B¹B¹Bú¸Bó¸Bì¸Bå¸BÞ¸B׸BиBɸB¸B»¸B´¸B­¸B¦¸BŸ¸B˜¸B‘¸BЏBƒ¸B|¸Bu¸Bn¸Bg¸B`¸BY¸BR¸BK¸BD¸B=¸B6¸B/¸B(¸B!¸B¸B¸B ¸B¸Bþ·B÷·Bð·Bé·Bâ·BÛ·BÔ·BÍ·BÆ·B¿·B¸·B±·Bª·B£·Bœ·B•·BŽ·B‡·B€·By·Br·Bk·Bd·B]·BV·BO·BH·BA·B:·B3·B,·B%·B·B·B·B ·B·Bû¶Bô¶Bí¶Bæ¶Bß¶BضBѶBʶBöB¼¶Bµ¶B®¶B§¶B ¶B™¶B’¶B‹¶B„¶B}¶Bv¶Bo¶Bh¶Ba¶BZ¶BS¶BL¶BE¶B>¶B7¶B0¶B)¶B"¶B¶B¶B ¶B¶BÿµBøµBñµBêµBãµBܵBÕµBεBǵBÀµB¹µB²µB«µB¤µBµB–µBµBˆµBµBzµBsµBlµBeµB^µBWµBPµBIµBBµB;µB4µB-µB&µBµBµBµB µBµBü´Bõ´Bî´Bç´Bà´BÙ´BÒ´BË´BÄ´B½´B¶´B¯´B¨´B¡´Bš´B“´BŒ´B…´B~´Bw´Bp´Bi´Bb´B[´BT´BM´BF´B?´B8´B1´B*´B#´B´B´B´B´B´Bù³Bò³Bë³Bä³BݳBÖ³BϳBȳBÁ³Bº³B³³B¬³B¥³Bž³B—³B³B‰³B‚³B{³Bt³Bm³Bf³B_³BX³BQ³BJ³BC³B<³B5³B.³B'³B ³B³B³B ³B³Bý²Bö²Bï²Bè²Bá²BÚ²BÓ²B̲BŲB¾²B·²B°²B©²B¢²B›²B”²B²B†²B²Bx²Bq²Bj²Bc²B\²BU²BN²BG²B@²B9²B2²B+²B$²B²B²B²B²B²Bú±Bó±Bì±Bå±BÞ±B×±BбBɱB±B»±B´±B­±B¦±BŸ±B˜±B‘±BбBƒ±B|±Bu±Bn±Bg±B`±BY±BR±BK±BD±B=±B6±B/±B(±B!±B±B±B ±B±Bþ°B÷°Bð°Bé°Bâ°BÛ°BÔ°BͰBưB¿°B¸°B±°Bª°B£°Bœ°B•°BްB‡°B€°By°Br°Bk°Bd°B]°BV°BO°BH°BA°B:°B3°B,°B%°B°B°B°B °B°Bû¯Bô¯Bí¯Bæ¯B߯BدBѯBʯBïB¼¯Bµ¯B®¯B§¯B ¯B™¯B’¯B‹¯B„¯B}¯Bv¯Bo¯Bh¯Ba¯BZ¯BS¯BL¯BE¯B>¯B7¯B0¯B)¯B"¯B¯B¯B ¯B¯Bÿ®Bø®Bñ®Bê®Bã®BÜ®BÕ®BήBÇ®BÀ®B¹®B²®B«®B¤®B®B–®B®Bˆ®B®Bz®Bs®Bl®Be®B^®BW®BP®BI®BB®B;®B4®B-®B&®B®B®B®B ®B®Bü­Bõ­Bî­Bç­Bà­BÙ­BÒ­BË­BÄ­B½­B¶­B¯­B¨­B¡­Bš­B“­BŒ­B…­B~­Bw­Bp­Bi­Bb­B[­BT­BM­BF­B?­B8­B1­B*­B#­B­B­B­B­B­Bù¬Bò¬Bë¬Bä¬BݬBÖ¬BϬBȬBÁ¬Bº¬B³¬B¬¬B¥¬Bž¬B—¬B¬B‰¬B‚¬B{¬Bt¬Bm¬Bf¬B_¬BX¬BQ¬BJ¬BC¬B<¬B5¬B.¬B'¬B ¬B¬B¬B ¬B¬Bý«Bö«Bï«Bè«Bá«BÚ«BÓ«BÌ«BÅ«B¾«B·«B°«B©«B¢«B›«B”«B«B†«B«Bx«Bq«Bj«Bc«B\«BU«BN«BG«B@«B9«B2«B+«B$«B«B«B«B«B«BúªBóªBìªBåªBÞªBתBЪBɪBªB»ªB´ªB­ªB¦ªBŸªB˜ªB‘ªBŠªBƒªB|ªBuªBnªBgªB`ªBYªBRªBKªBDªB=ªB6ªB/ªB(ªB!ªBªBªB ªBªBþ©B÷©Bð©Bé©Bâ©BÛ©BÔ©BÍ©BÆ©B¿©B¸©B±©Bª©B£©Bœ©B•©BŽ©B‡©B€©By©Br©Bk©Bd©B]©BV©BO©BH©BA©B:©B3©B,©B%©B©B©B©B ©B©Bû¨Bô¨Bí¨Bæ¨BߨBبBѨBʨBèB¼¨Bµ¨B®¨B§¨B ¨B™¨B’¨B‹¨B„¨B}¨Bv¨Bo¨Bh¨Ba¨BZ¨BS¨BL¨BE¨B>¨B7¨B0¨B)¨B"¨B¨B¨B ¨B¨Bÿ§Bø§Bñ§Bê§Bã§BܧBÕ§BΧBǧBÀ§B¹§B²§B«§B¤§B§B–§B§Bˆ§B§Bz§Bs§Bl§Be§B^§BW§BP§BI§BB§B;§B4§B-§B&§B§B§B§B §B§Bü¦Bõ¦Bî¦Bç¦Bà¦BÙ¦BÒ¦B˦BĦB½¦B¶¦B¯¦B¨¦B¡¦Bš¦B“¦BŒ¦B…¦B~¦Bw¦Bp¦Bi¦Bb¦B[¦BT¦BM¦BF¦B?¦B8¦B1¦B*¦B#¦B¦B¦B¦B¦B¦Bù¥Bò¥Bë¥Bä¥BÝ¥BÖ¥BÏ¥BÈ¥BÁ¥Bº¥B³¥B¬¥B¥¥Bž¥B—¥B¥B‰¥B‚¥B{¥Bt¥Bm¥Bf¥B_¥BX¥BQ¥BJ¥BC¥B<¥B5¥B.¥B'¥B ¥B¥B¥B ¥B¥Bý¤Bö¤Bï¤Bè¤Bá¤BÚ¤BÓ¤B̤BŤB¾¤B·¤B°¤B©¤B¢¤B›¤B”¤B¤B†¤B¤Bx¤Bq¤Bj¤Bc¤B\¤BU¤BN¤BG¤B@¤B9¤B2¤B+¤B$¤B¤B¤B¤B¤B¤Bú£Bó£Bì£Bå£BÞ£B×£BУBÉ£B£B»£B´£B­£B¦£BŸ£B˜£B‘£BŠ£Bƒ£B|£Bu£Bn£Bg£B`£BY£BR£BK£BD£B=£B6£B/£B(£B!£B£B£B £B£Bþ¢B÷¢Bð¢Bé¢Bâ¢BÛ¢BÔ¢BÍ¢BÆ¢B¿¢B¸¢B±¢Bª¢B£¢Bœ¢B•¢BŽ¢B‡¢B€¢By¢Br¢Bk¢Bd¢B]¢BV¢BO¢BH¢BA¢B:¢B3¢B,¢B%¢B¢B¢B¢B ¢B¢Bû¡Bô¡Bí¡Bæ¡Bß¡BØ¡BÑ¡BÊ¡BáB¼¡Bµ¡B®¡B§¡B ¡B™¡B’¡B‹¡B„¡B}¡Bv¡Bo¡Bh¡Ba¡BZ¡BS¡BL¡BE¡B>¡B7¡B0¡B)¡B"¡B¡B¡B ¡B¡Bÿ Bø Bñ Bê Bã BÜ BÕ BΠBÇ BÀ B¹ B² B« B¤ B B– B Bˆ B Bz Bs Bl Be B^ BW BP BI BB B; B4 B- B& B B B B  B BüŸBõŸBîŸBçŸBàŸBÙŸBÒŸBËŸBÄŸB½ŸB¶ŸB¯ŸB¨ŸB¡ŸBšŸB“ŸBŒŸB…ŸB~ŸBwŸBpŸBiŸBbŸB[ŸBTŸBMŸBFŸB?ŸB8ŸB1ŸB*ŸB#ŸBŸBŸBŸBŸBŸBùžBòžBëžBäžBÝžBÖžBÏžBÈžBÁžBºžB³žB¬žB¥žBžžB—žBžB‰žB‚žB{žBtžBmžBfžB_žBXžBQžBJžBCžB<žB5žB.žB'žB žBžBžB žBžBýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBúœBóœBìœBåœBÞœBלBМBÉœBœB»œB´œB­œB¦œBŸœB˜œB‘œBŠœBƒœB|œBuœBnœBgœB`œBYœBRœBKœBDœB=œB6œB/œB(œB!œBœBœB œBœBþ›B÷›Bð›Bé›Bâ›BÛ›BÔ›BÍ›BÆ›B¿›B¸›B±›Bª›B£›Bœ›B•›BŽ›B‡›B€›By›Br›Bk›Bd›B]›BV›BO›BH›BA›B:›B3›B,›B%›B›B›B›B ›B›BûšBôšBíšBæšBßšBØšBÑšBÊšBÚB¼šBµšB®šB§šB šB™šB’šB‹šB„šB}šBvšBošBhšBašBZšBSšBLšBEšB>šB7šB0šB)šB"šBšBšB šBšBÿ™Bø™Bñ™Bê™Bã™BÜ™BÕ™BΙBÇ™BÀ™B¹™B²™B«™B¤™B™B–™B™Bˆ™B™Bz™Bs™Bl™Be™B^™BW™BP™BI™BB™B;™B4™B-™B&™B™B™B™B ™B™Bü˜Bõ˜Bî˜Bç˜Bà˜BÙ˜BÒ˜B˘BĘB½˜B¶˜B¯˜B¨˜B¡˜Bš˜B“˜BŒ˜B…˜B~˜Bw˜Bp˜Bi˜Bb˜B[˜BT˜BM˜BF˜B?˜B8˜B1˜B*˜B#˜B˜B˜B˜B˜B˜Bù—Bò—Bë—Bä—BÝ—BÖ—BÏ—BÈ—BÁ—Bº—B³—B¬—B¥—Bž—B——B—B‰—B‚—B{—Bt—Bm—Bf—B_—BX—BQ—BJ—BC—B<—B5—B.—B'—B —B—B—B —B—Bý–Bö–Bï–Bè–Bá–BÚ–BÓ–BÌ–BÅ–B¾–B·–B°–B©–B¢–B›–B”–B–B†–B–Bx–Bq–Bj–Bc–B\–BU–BN–BG–B@–B9–B2–B+–B$–B–B–B–B–B–Bú•Bó•Bì•Bå•BÞ•BוBЕBÉ•B•B»•B´•B­•B¦•BŸ•B˜•B‘•BŠ•Bƒ•B|•Bu•Bn•Bg•B`•BY•BR•BK•BD•B=•B6•B/•B(•B!•B•B•B •B•Bþ”B÷”Bð”Bé”Bâ”BÛ”BÔ”BÍ”BÆ”B¿”B¸”B±”Bª”B£”Bœ”B•”BŽ”B‡”B€”By”Br”Bk”Bd”B]”BV”BO”BH”BA”B:”B3”B,”B%”B”B”B”B ”B”Bû“Bô“Bí“Bæ“Bß“BØ“BÑ“BÊ“BÓB¼“Bµ“B®“B§“B “B™“B’“B‹“B„“B}“Bv“Bo“Bh“Ba“BZ“BS“BL“BE“B>“B7“B0“B)“B"“B“B“B “B“Bÿ’Bø’Bñ’Bê’Bã’BÜ’BÕ’BÎ’BÇ’BÀ’B¹’B²’B«’B¤’B’B–’B’Bˆ’B’Bz’Bs’Bl’Be’B^’BW’BP’BI’BB’B;’B4’B-’B&’B’B’B’B ’B’Bü‘Bõ‘Bî‘Bç‘Bà‘BÙ‘BÒ‘BË‘BÄ‘B½‘B¶‘B¯‘B¨‘B¡‘Bš‘B“‘BŒ‘B…‘B~‘Bw‘Bp‘Bi‘Bb‘B[‘BT‘BM‘BF‘B?‘B8‘B1‘B*‘B#‘B‘B‘B‘B‘B‘BùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCBŒB7ŒB0ŒB)ŒB"ŒBŒBŒB ŒBŒBÿ‹Bø‹Bñ‹Bê‹Bã‹BÜ‹BÕ‹B΋BÇ‹BÀ‹B¹‹B²‹B«‹B¤‹B‹B–‹B‹Bˆ‹B‹Bz‹Bs‹Bl‹Be‹B^‹BW‹BP‹BI‹BB‹B;‹B4‹B-‹B&‹B‹B‹B‹B ‹B‹BüŠBõŠBîŠBçŠBàŠBÙŠBÒŠBËŠBÄŠB½ŠB¶ŠB¯ŠB¨ŠB¡ŠBšŠB“ŠBŒŠB…ŠB~ŠBwŠBpŠBiŠBbŠB[ŠBTŠBMŠBFŠB?ŠB8ŠB1ŠB*ŠB#ŠBŠBŠBŠBŠBŠBù‰Bò‰Bë‰Bä‰B݉BÖ‰BωBȉBÁ‰Bº‰B³‰B¬‰B¥‰Bž‰B—‰B‰B‰‰B‚‰B{‰Bt‰Bm‰Bf‰B_‰BX‰BQ‰BJ‰BC‰B<‰B5‰B.‰B'‰B ‰B‰B‰B ‰B‰BýˆBöˆBïˆBèˆBáˆBÚˆBÓˆB̈BňB¾ˆB·ˆB°ˆB©ˆB¢ˆB›ˆB”ˆBˆB†ˆBˆBxˆBqˆBjˆBcˆB\ˆBUˆBNˆBGˆB@ˆB9ˆB2ˆB+ˆB$ˆBˆBˆBˆBˆBˆBú‡Bó‡Bì‡Bå‡BÞ‡BׇBЇBɇB‡B»‡B´‡B­‡B¦‡BŸ‡B˜‡B‘‡BЇBƒ‡B|‡Bu‡Bn‡Bg‡B`‡BY‡BR‡BK‡BD‡B=‡B6‡B/‡B(‡B!‡B‡B‡B ‡B‡Bþ†B÷†Bð†Bé†Bâ†BÛ†BÔ†B͆BƆB¿†B¸†B±†Bª†B£†Bœ†B•†BކB‡†B€†By†Br†Bk†Bd†B]†BV†BO†BH†BA†B:†B3†B,†B%†B†B†B†B †B†Bû…Bô…Bí…Bæ…Bß…BØ…BÑ…BÊ…BÃ…B¼…Bµ…B®…B§…B …B™…B’…B‹…B„…B}…Bv…Bo…Bh…Ba…BZ…BS…BL…BE…B>…B7…B0…B)…B"…B…B…B …B…Bÿ„Bø„Bñ„Bê„Bã„BÜ„BÕ„B΄BÇ„BÀ„B¹„B²„B«„B¤„B„B–„B„Bˆ„B„Bz„Bs„Bl„Be„B^„BW„BP„BI„BB„B;„B4„B-„B&„B„B„B„B „B„BüƒBõƒBîƒBçƒBàƒBÙƒBÒƒB˃BăB½ƒB¶ƒB¯ƒB¨ƒB¡ƒBšƒB“ƒBŒƒB…ƒB~ƒBwƒBpƒBiƒBbƒB[ƒBTƒBMƒBFƒB?ƒB8ƒB1ƒB*ƒB#ƒBƒBƒBƒBƒBƒBù‚Bò‚Bë‚Bä‚BÝ‚BÖ‚BÏ‚BÈ‚BÁ‚Bº‚B³‚B¬‚B¥‚Bž‚B—‚B‚B‰‚B‚‚B{‚Bt‚Bm‚Bf‚B_‚BX‚BQ‚BJ‚BC‚B<‚B5‚B.‚B'‚B ‚B‚B‚B ‚B‚BýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBú€Bó€Bì€Bå€BÞ€B×€BЀBÉ€B€B»€B´€B­€B¦€BŸ€B˜€B‘€BŠ€Bƒ€B|€Bu€Bn€Bg€B`€BY€BR€BK€BD€B=€B6€B/€B(€B!€B€B€B €B€BþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBû~Bô~Bí~Bæ~Bß~BØ~BÑ~BÊ~BÃ~B¼~Bµ~B®~B§~B ~B™~B’~B‹~B„~B}~Bv~Bo~Bh~Ba~BZ~BS~BL~BE~B>~B7~B0~B)~B"~B~B~B ~B~Bÿ}Bø}Bñ}Bê}Bã}BÜ}BÕ}BÎ}BÇ}BÀ}B¹}B²}B«}B¤}B}B–}B}Bˆ}B}Bz}Bs}Bl}Be}B^}BW}BP}BI}BB}B;}B4}B-}B&}B}B}B}B }B}Bü|Bõ|Bî|Bç|Bà|BÙ|BÒ|BË|BÄ|B½|B¶|B¯|B¨|B¡|Bš|B“|BŒ|B…|B~|Bw|Bp|Bi|Bb|B[|BT|BM|BF|B?|B8|B1|B*|B#|B|B|B|B|B|Bù{Bò{Bë{Bä{BÝ{BÖ{BÏ{BÈ{BÁ{Bº{B³{B¬{B¥{Bž{B—{B{B‰{B‚{B{{Bt{Bm{Bf{B_{BX{BQ{BJ{BC{B<{B5{B.{B'{B {B{B{B {B{BýzBözBïzBèzBázBÚzBÓzBÌzBÅzB¾zB·zB°zB©zB¢zB›zB”zBzB†zBzBxzBqzBjzBczB\zBUzBNzBGzB@zB9zB2zB+zB$zBzBzBzBzBzBúyBóyBìyBåyBÞyB×yBÐyBÉyBÂyB»yB´yB­yB¦yBŸyB˜yB‘yBŠyBƒyB|yBuyBnyBgyB`yBYyBRyBKyBDyB=yB6yB/yB(yB!yByByB yByBþxB÷xBðxBéxBâxBÛxBÔxBÍxBÆxB¿xB¸xB±xBªxB£xBœxB•xBŽxB‡xB€xByxBrxBkxBdxB]xBVxBOxBHxBAxB:xB3xB,xB%xBxBxBxB xBxBûwBôwBíwBæwBßwBØwBÑwBÊwBÃwB¼wBµwB®wB§wB wB™wB’wB‹wB„wB}wBvwBowBhwBawBZwBSwBLwBEwB>wB7wB0wB)wB"wBwBwB wBwBÿvBøvBñvBêvBãvBÜvBÕvBÎvBÇvBÀvB¹vB²vB«vB¤vBvB–vBvBˆvBvBzvBsvBlvBevB^vBWvBPvBIvBBvB;vB4vB-vB&vBvBvBvB vBvBüuBõuBîuBçuBàuBÙuBÒuBËuBÄuB½uB¶uB¯uB¨uB¡uBšuB“uBŒuB…uB~uBwuBpuBiuBbuB[uBTuBMuBFuB?uB8uB1uB*uB#uBuBuBuBuBuBùtBòtBëtBätBÝtBÖtBÏtBÈtBÁtBºtB³tB¬tB¥tBžtB—tBtB‰tB‚tB{tBttBmtBftB_tBXtBQtBJtBCtBpB7pB0pB)pB"pBpBpB pBpBÿoBøoBñoBêoBãoBÜoBÕoBÎoBÇoBÀoB¹oB²oB«oB¤oBoB–oBoBˆoBoBzoBsoBloBeoB^oBWoBPoBIoBBoB;oB4oB-oB&oBoBoBoB oBoBünBõnBînBçnBànBÙnBÒnBËnBÄnB½nB¶nB¯nB¨nB¡nBšnB“nBŒnB…nB~nBwnBpnBinBbnB[nBTnBMnBFnB?nB8nB1nB*nB#nBnBnBnBnBnBùmBòmBëmBämBÝmBÖmBÏmBÈmBÁmBºmB³mB¬mB¥mBžmB—mBmB‰mB‚mB{mBtmBmmBfmB_mBXmBQmBJmBCmBiB7iB0iB)iB"iBiBiB iBiBÿhBøhBñhBêhBãhBÜhBÕhBÎhBÇhBÀhB¹hB²hB«hB¤hBhB–hBhBˆhBhBzhBshBlhBehB^hBWhBPhBIhBBhB;hB4hB-hB&hBhBhBhB hBhBügBõgBîgBçgBàgBÙgBÒgBËgBÄgB½gB¶gB¯gB¨gB¡gBšgB“gBŒgB…gB~gBwgBpgBigBbgB[gBTgBMgBFgB?gB8gB1gB*gB#gBgBgBgBgBgBùfBòfBëfBäfBÝfBÖfBÏfBÈfBÁfBºfB³fB¬fB¥fBžfB—fBfB‰fB‚fB{fBtfBmfBffB_fBXfBQfBJfBCfBbB7bB0bB)bB"bBbBbB bBbBÿaBøaBñaBêaBãaBÜaBÕaBÎaBÇaBÀaB¹aB²aB«aB¤aBaB–aBaBˆaBaBzaBsaBlaBeaB^aBWaBPaBIaBBaB;aB4aB-aB&aBaBaBaB aBaBü`Bõ`Bî`Bç`Bà`BÙ`BÒ`BË`BÄ`B½`B¶`B¯`B¨`B¡`Bš`B“`BŒ`B…`B~`Bw`Bp`Bi`Bb`B[`BT`BM`BF`B?`B8`B1`B*`B#`B`B`B`B`B`Bù_Bò_Bë_Bä_BÝ_BÖ_BÏ_BÈ_BÁ_Bº_B³_B¬_B¥_Bž_B—_B_B‰_B‚_B{_Bt_Bm_Bf_B__BX_BQ_BJ_BC_B<_B5_B._B'_B _B_B_B _B_Bý^Bö^Bï^Bè^Bá^BÚ^BÓ^BÌ^BÅ^B¾^B·^B°^B©^B¢^B›^B”^B^B†^B^Bx^Bq^Bj^Bc^B\^BU^BN^BG^B@^B9^B2^B+^B$^B^B^B^B^B^Bú]Bó]Bì]Bå]BÞ]B×]BÐ]BÉ]BÂ]B»]B´]B­]B¦]BŸ]B˜]B‘]BŠ]Bƒ]B|]Bu]Bn]Bg]B`]BY]BR]BK]BD]B=]B6]B/]B(]B!]B]B]B ]B]Bþ\B÷\Bð\Bé\Bâ\BÛ\BÔ\BÍ\BÆ\B¿\B¸\B±\Bª\B£\Bœ\B•\BŽ\B‡\B€\By\Br\Bk\Bd\B]\BV\BO\BH\BA\B:\B3\B,\B%\B\B\B\B \B\Bû[Bô[Bí[Bæ[Bß[BØ[BÑ[BÊ[BÃ[B¼[Bµ[B®[B§[B [B™[B’[B‹[B„[B}[Bv[Bo[Bh[Ba[BZ[BS[BL[BE[B>[B7[B0[B)[B"[B[B [B[BÿZBøZBñZBêZBãZBÜZBÕZBÎZBÇZBÀZB¹ZB²ZB«ZB¤ZBZB–ZBZBˆZBZBzZBsZBlZBeZB^ZBWZBPZBIZBBZB;ZB4ZB-ZB&ZBZBZBZB ZBZBüYBõYBîYBçYBàYBÙYBÒYBËYBÄYB½YB¶YB¯YB¨YB¡YBšYB“YBŒYB…YB~YBwYBpYBiYBbYB[YBTYBMYBFYB?YB8YB1YB*YB#YBYBYBYBYBYBùXBòXBëXBäXBÝXBÖXBÏXBÈXBÁXBºXB³XB¬XB¥XBžXB—XBXB‰XB‚XB{XBtXBmXBfXB_XBXXBQXBJXBCXBTB7TB0TB)TB"TBTBTB TBTBÿSBøSBñSBêSBãSBÜSBÕSBÎSBÇSBÀSB¹SB²SB«SB¤SBSB–SBSBˆSBSBzSBsSBlSBeSB^SBWSBPSBISBBSB;SB4SB-SB&SBSBSBSB SBSBüRBõRBîRBçRBàRBÙRBÒRBËRBÄRB½RB¶RB¯RB¨RB¡RBšRB“RBŒRB…RB~RBwRBpRBiRBbRB[RBTRBMRBFRB?RB8RB1RB*RB#RBRBRBRBRBRBùQBòQBëQBäQBÝQBÖQBÏQBÈQBÁQBºQB³QB¬QB¥QBžQB—QBQB‰QB‚QB{QBtQBmQBfQB_QBXQBQQBJQBCQBMB7MB0MB)MB"MBMBMB MBMBÿLBøLBñLBêLBãLBÜLBÕLBÎLBÇLBÀLB¹LB²LB«LB¤LBLB–LBLBˆLBLBzLBsLBlLBeLB^LBWLBPLBILBBLB;LB4LB-LB&LBLBLBLB LBLBüKBõKBîKBçKBàKBÙKBÒKBËKBÄKB½KB¶KB¯KB¨KB¡KBšKB“KBŒKB…KB~KBwKBpKBiKBbKB[KBTKBMKBFKB?KB8KB1KB*KB#KBKBKBKBKBKBùJBòJBëJBäJBÝJBÖJBÏJBÈJBÁJBºJB³JB¬JB¥JBžJB—JBJB‰JB‚JB{JBtJBmJBfJB_JBXJBQJBJJBCJBFB7FB0FB)FB"FBFBFB FBFBÿEBøEBñEBêEBãEBÜEBÕEBÎEBÇEBÀEB¹EB²EB«EB¤EBEB–EBEBˆEBEBzEBsEBlEBeEB^EBWEBPEBIEBBEB;EB4EB-EB&EBEBEBEB EBEBüDBõDBîDBçDBàDBÙDBÒDBËDBÄDB½DB¶DB¯DB¨DB¡DBšDB“DBŒDB…DB~DBwDBpDBiDBbDB[DBTDBMDBFDB?DB8DB1DB*DB#DBDBDBDBDBDBùCBòCBëCBäCBÝCBÖCBÏCBÈCBÁCBºCB³CB¬CB¥CBžCB—CBCB‰CB‚CB{CBtCBmCBfCB_CBXCBQCBJCBCCB?B7?B0?B)?B"?B?B?B ?B?Bÿ>Bø>Bñ>Bê>Bã>BÜ>BÕ>BÎ>BÇ>BÀ>B¹>B²>B«>B¤>B>B–>B>Bˆ>B>Bz>Bs>Bl>Be>B^>BW>BP>BI>BB>B;>B4>B->B&>B>B>B>B >B>Bü=Bõ=Bî=Bç=Bà=BÙ=BÒ=BË=BÄ=B½=B¶=B¯=B¨=B¡=Bš=B“=BŒ=B…=B~=Bw=Bp=Bi=Bb=B[=BT=BM=BF=B?=B8=B1=B*=B#=B=B=B=B=B=Bù8B78B08B)8B"8B8B8B 8B8Bÿ7Bø7Bñ7Bê7Bã7BÜ7BÕ7BÎ7BÇ7BÀ7B¹7B²7B«7B¤7B7B–7B7Bˆ7B7Bz7Bs7Bl7Be7B^7BW7BP7BI7BB7B;7B47B-7B&7B7B7B7B 7B7Bü6Bõ6Bî6Bç6Bà6BÙ6BÒ6BË6BÄ6B½6B¶6B¯6B¨6B¡6Bš6B“6BŒ6B…6B~6Bw6Bp6Bi6Bb6B[6BT6BM6BF6B?6B86B16B*6B#6B6B6B6B6B6Bù5Bò5Bë5Bä5BÝ5BÖ5BÏ5BÈ5BÁ5Bº5B³5B¬5B¥5Bž5B—5B5B‰5B‚5B{5Bt5Bm5Bf5B_5BX5BQ5BJ5BC5B<5B55B.5B'5B 5B5B5B 5B5Bý4Bö4Bï4Bè4Bá4BÚ4BÓ4BÌ4BÅ4B¾4B·4B°4B©4B¢4B›4B”4B4B†4B4Bx4Bq4Bj4Bc4B\4BU4BN4BG4B@4B94B24B+4B$4B4B4B4B4B4Bú3Bó3Bì3Bå3BÞ3B×3BÐ3BÉ3BÂ3B»3B´3B­3B¦3BŸ3B˜3B‘3BŠ3Bƒ3B|3Bu3Bn3Bg3B`3BY3BR3BK3BD3B=3B63B/3B(3B!3B3B3B 3B3Bþ2B÷2Bð2Bé2Bâ2BÛ2BÔ2BÍ2BÆ2B¿2B¸2B±2Bª2B£2Bœ2B•2BŽ2B‡2B€2By2Br2Bk2Bd2B]2BV2BO2BH2BA2B:2B32B,2B%2B2B2B2B 2B2Bû1Bô1Bí1Bæ1Bß1BØ1BÑ1BÊ1BÃ1B¼1Bµ1B®1B§1B 1B™1B’1B‹1B„1B}1Bv1Bo1Bh1Ba1BZ1BS1BL1BE1B>1B71B01B)1B"1B1B1B 1B1Bÿ0Bø0Bñ0Bê0Bã0BÜ0BÕ0BÎ0BÇ0BÀ0B¹0B²0B«0B¤0B0B–0B0Bˆ0B0Bz0Bs0Bl0Be0B^0BW0BP0BI0BB0B;0B40B-0B&0B0B0B0B 0B0Bü/Bõ/Bî/Bç/Bà/BÙ/BÒ/BË/BÄ/B½/B¶/B¯/B¨/B¡/Bš/B“/BŒ/B…/B~/Bw/Bp/Bi/Bb/B[/BT/BM/BF/B?/B8/B1/B*/B#/B/B/B/B/B/Bù.Bò.Bë.Bä.BÝ.BÖ.BÏ.BÈ.BÁ.Bº.B³.B¬.B¥.Bž.B—.B.B‰.B‚.B{.Bt.Bm.Bf.B_.BX.BQ.BJ.BC.B<.B5.B..B'.B .B.B.B .B.Bý-Bö-Bï-Bè-Bá-BÚ-BÓ-BÌ-BÅ-B¾-B·-B°-B©-B¢-B›-B”-B-B†-B-Bx-Bq-Bj-Bc-B\-BU-BN-BG-B@-B9-B2-B+-B$-B-B-B-B-B-Bú,Bó,Bì,Bå,BÞ,B×,BÐ,BÉ,BÂ,B»,B´,B­,B¦,BŸ,B˜,B‘,BŠ,Bƒ,B|,Bu,Bn,Bg,B`,BY,BR,BK,BD,B=,B6,B/,B(,B!,B,B,B ,B,Bþ+B÷+Bð+Bé+Bâ+BÛ+BÔ+BÍ+BÆ+B¿+B¸+B±+Bª+B£+Bœ+B•+BŽ+B‡+B€+By+Br+Bk+Bd+B]+BV+BO+BH+BA+B:+B3+B,+B%+B+B+B+B +B+Bû*Bô*Bí*Bæ*Bß*BØ*BÑ*BÊ*BÃ*B¼*Bµ*B®*B§*B *B™*B’*B‹*B„*B}*Bv*Bo*Bh*Ba*BZ*BS*BL*BE*B>*B7*B0*B)*B"*B*B*B *B*Bÿ)Bø)Bñ)Bê)Bã)BÜ)BÕ)BÎ)BÇ)BÀ)B¹)B²)B«)B¤)B)B–)B)Bˆ)B)Bz)Bs)Bl)Be)B^)BW)BP)BI)BB)B;)B4)B-)B&)B)B)B)B )B)Bü(Bõ(Bî(Bç(Bà(BÙ(BÒ(BË(BÄ(B½(B¶(B¯(B¨(B¡(Bš(B“(BŒ(B…(B~(Bw(Bp(Bi(Bb(B[(BT(BM(BF(B?(B8(B1(B*(B#(B(B(B(B(B(Bù'Bò'Bë'Bä'BÝ'BÖ'BÏ'BÈ'BÁ'Bº'B³'B¬'B¥'Bž'B—'B'B‰'B‚'B{'Bt'Bm'Bf'B_'BX'BQ'BJ'BC'B<'B5'B.'B''B 'B'B'B 'B'Bý&Bö&Bï&Bè&Bá&BÚ&BÓ&BÌ&BÅ&B¾&B·&B°&B©&B¢&B›&B”&B&B†&B&Bx&Bq&Bj&Bc&B\&BU&BN&BG&B@&B9&B2&B+&B$&B&B&B&B&B&Bú%Bó%Bì%Bå%BÞ%B×%BÐ%BÉ%BÂ%B»%B´%B­%B¦%BŸ%B˜%B‘%BŠ%Bƒ%B|%Bu%Bn%Bg%B`%BY%BR%BK%BD%B=%B6%B/%B(%B!%B%B%B %B%Bþ$B÷$Bð$Bé$Bâ$BÛ$BÔ$BÍ$BÆ$B¿$B¸$B±$Bª$B£$Bœ$B•$BŽ$B‡$B€$By$Br$Bk$Bd$B]$BV$BO$BH$BA$B:$B3$B,$B%$B$B$B$B $B$Bû#Bô#Bí#Bæ#Bß#BØ#BÑ#BÊ#BÃ#B¼#Bµ#B®#B§#B #B™#B’#B‹#B„#B}#Bv#Bo#Bh#Ba#BZ#BS#BL#BE#B>#B7#B0#B)#B"#B#B#B #B#Bÿ"Bø"Bñ"Bê"Bã"BÜ"BÕ"BÎ"BÇ"BÀ"B¹"B²"B«"B¤"B"B–"B"Bˆ"B"Bz"Bs"Bl"Be"B^"BW"BP"BI"BB"B;"B4"B-"B&"B"B"B"B "B"Bü!Bõ!Bî!Bç!Bà!BÙ!BÒ!BË!BÄ!B½!B¶!B¯!B¨!B¡!Bš!B“!BŒ!B…!B~!Bw!Bp!Bi!Bb!B[!BT!BM!BF!B?!B8!B1!B*!B#!B!B!B!B!B!Bù Bò Bë Bä BÝ BÖ BÏ BÈ BÁ Bº B³ B¬ B¥ Bž B— B B‰ B‚ B{ Bt Bm Bf B_ BX BQ BJ BC B< B5 B. B' B B B B B BýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBúBóBìBåBÞB×BÐBÉBÂB»B´B­B¦BŸB˜B‘BŠBƒB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBûBôBíBæBßBØBÑBÊBÃB¼BµB®B§B B™B’B‹B„B}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBúBóBìBåBÞB×BÐBÉBÂB»B´B­B¦BŸB˜B‘BŠBƒB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBûBôBíBæBßBØBÑBÊBÃB¼BµB®B§B B™B’B‹B„B}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBúBóBìBåBÞB×BÐBÉBÂB»B´B­B¦BŸB˜B‘BŠBƒB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBûBôBíBæBßBØBÑBÊBÃB¼BµB®B§B B™B’B‹B„B}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBÿ Bø Bñ Bê Bã BÜ BÕ BÎ BÇ BÀ B¹ B² B« B¤ B B– B Bˆ B Bz Bs Bl Be B^ BW BP BI BB B; B4 B- B& B B B B B Bü Bõ Bî Bç Bà BÙ BÒ BË BÄ B½ B¶ B¯ B¨ B¡ Bš B“ BŒ B… B~ Bw Bp Bi Bb B[ BT BM BF B? B8 B1 B* B# B B B B B Bù Bò Bë Bä BÝ BÖ BÏ BÈ BÁ Bº B³ B¬ B¥ Bž B— B B‰ B‚ B{ Bt Bm Bf B_ BX BQ BJ BC B< B5 B. B' B B B B B Bý Bö Bï Bè Bá BÚ BÓ BÌ BÅ B¾ B· B° B© B¢ B› B” B B† B Bx Bq Bj Bc B\ BU BN BG B@ B9 B2 B+ B$ B B B B B Bú Bó Bì Bå BÞ B× BÐ BÉ B B» B´ B­ B¦ BŸ B˜ B‘ BŠ Bƒ B| Bu Bn Bg B` BY BR BK BD B= B6 B/ B( B! B B B B BþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBûBôBíBæBßBØBÑBÊBÃB¼BµB®B§B B™B’B‹B„B}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCB<B5B.B'B BBB BBýBöBïBèBáBÚBÓBÌBÅB¾B·B°B©B¢B›B”BB†BBxBqBjBcB\BUBNBGB@B9B2B+B$BBBBBBúBóBìBåBÞB×BÐBÉBÂB»B´B­B¦BŸB˜B‘BŠBƒB|BuBnBgB`BYBRBKBDB=B6B/B(B!BBB BBþB÷BðBéBâBÛBÔBÍBÆB¿B¸B±BªB£BœB•BŽB‡B€ByBrBkBdB]BVBOBHBAB:B3B,B%BBBB BBûBôBíBæBßBØBÑBÊBÃB¼BµB®B§B B™B’B‹B„B}BvBoBhBaBZBSBLBEB>B7B0B)B"BBB BBÿÿAøÿAñÿAêÿAãÿAÜÿAÕÿAÎÿAÇÿAÀÿA¹ÿA²ÿA«ÿA¤ÿAÿA–ÿAÿAˆÿAÿAzÿAsÿAlÿAeÿA^ÿAWÿAPÿAIÿABÿA;ÿA4ÿA-ÿA&ÿAÿAÿAÿA ÿAÿAüþAõþAîþAçþAàþAÙþAÒþAËþAÄþA½þA¶þA¯þA¨þA¡þAšþA“þAŒþA…þA~þAwþApþAiþAbþA[þATþAMþAFþA?þA8þA1þA*þA#þAþAþAþAþAþAùýAòýAëýAäýAÝýAÖýAÏýAÈýAÁýAºýA³ýA¬ýA¥ýAžýA—ýAýA‰ýA‚ýA{ýAtýAmýAfýA_ýAXýAQýAJýACýA<ýA5ýA.ýA'ýA ýAýAýA ýAýAýüAöüAïüAèüAáüAÚüAÓüAÌüAÅüA¾üA·üA°üA©üA¢üA›üA”üAüA†üAüAxüAqüAjüAcüA\üAUüANüAGüA@üA9üA2üA+üA$üAüAüAüAüAüAúûAóûAìûAåûAÞûA×ûAÐûAÉûAÂûA»ûA´ûA­ûA¦ûAŸûA˜ûA‘ûAŠûAƒûA|ûAuûAnûAgûA`ûAYûARûAKûADûA=ûA6ûA/ûA(ûA!ûAûAûA ûAûAþúA÷úAðúAéúAâúAÛúAÔúAÍúAÆúA¿úA¸úA±úAªúA£úAœúA•úAŽúA‡úA€úAyúArúAkúAdúA]úAVúAOúAHúAAúA:úA3úA,úA%úAúAúAúA úAúAûùAôùAíùAæùAßùAØùAÑùAÊùAÃùA¼ùAµùA®ùA§ùA ùA™ùA’ùA‹ùA„ùA}ùAvùAoùAhùAaùAZùASùALùAEùA>ùA7ùA0ùA)ùA"ùAùAùA ùAùAÿøAøøAñøAêøAãøAÜøAÕøAÎøAÇøAÀøA¹øA²øA«øA¤øAøA–øAøAˆøAøAzøAsøAløAeøA^øAWøAPøAIøABøA;øA4øA-øA&øAøAøAøA øAøAü÷Aõ÷Aî÷Aç÷Aà÷AÙ÷AÒ÷AË÷AÄ÷A½÷A¶÷A¯÷A¨÷A¡÷Aš÷A“÷AŒ÷A…÷A~÷Aw÷Ap÷Ai÷Ab÷A[÷AT÷AM÷AF÷A?÷A8÷A1÷A*÷A#÷A÷A÷A÷A÷A÷AùöAòöAëöAäöAÝöAÖöAÏöAÈöAÁöAºöA³öA¬öA¥öAžöA—öAöA‰öA‚öA{öAtöAmöAföA_öAXöAQöAJöACöA<öA5öA.öA'öA öAöAöA öAöAýõAöõAïõAèõAáõAÚõAÓõAÌõAÅõA¾õA·õA°õA©õA¢õA›õA”õAõA†õAõAxõAqõAjõAcõA\õAUõANõAGõA@õA9õA2õA+õA$õAõAõAõAõAõAúôAóôAìôAåôAÞôA×ôAÐôAÉôAÂôA»ôA´ôA­ôA¦ôAŸôA˜ôA‘ôAŠôAƒôA|ôAuôAnôAgôA`ôAYôARôAKôADôA=ôA6ôA/ôA(ôA!ôAôAôA ôAôAþóA÷óAðóAéóAâóAÛóAÔóAÍóAÆóA¿óA¸óA±óAªóA£óAœóA•óAŽóA‡óA€óAyóAróAkóAdóA]óAVóAOóAHóAAóA:óA3óA,óA%óAóAóAóA óAóAûòAôòAíòAæòAßòAØòAÑòAÊòAÃòA¼òAµòA®òA§òA òA™òA’òA‹òA„òA}òAvòAoòAhòAaòAZòASòALòAEòA>òA7òA0òA)òA"òAòAòA òAòAÿñAøñAññAêñAãñAÜñAÕñAÎñAÇñAÀñA¹ñA²ñA«ñA¤ñAñA–ñAñAˆñAñAzñAsñAlñAeñA^ñAWñAPñAIñABñA;ñA4ñA-ñA&ñAñAñAñA ñAñAüðAõðAîðAçðAàðAÙðAÒðAËðAÄðA½ðA¶ðA¯ðA¨ðA¡ðAšðA“ðAŒðA…ðA~ðAwðApðAiðAbðA[ðATðAMðAFðA?ðA8ðA1ðA*ðA#ðAðAðAðAðAðAùïAòïAëïAäïAÝïAÖïAÏïAÈïAÁïAºïA³ïA¬ïA¥ïAžïA—ïAïA‰ïA‚ïA{ïAtïAmïAfïA_ïAXïAQïAJïACïA<ïA5ïA.ïA'ïA ïAïAïA ïAïAýîAöîAïîAèîAáîAÚîAÓîAÌîAÅîA¾îA·îA°îA©îA¢îA›îA”îAîA†îAîAxîAqîAjîAcîA\îAUîANîAGîA@îA9îA2îA+îA$îAîAîAîAîAîAúíAóíAìíAåíAÞíA×íAÐíAÉíAÂíA»íA´íA­íA¦íAŸíA˜íA‘íAŠíAƒíA|íAuíAníAgíA`íAYíARíAKíADíA=íA6íA/íA(íA!íAíAíA íAíAþìA÷ìAðìAéìAâìAÛìAÔìAÍìAÆìA¿ìA¸ìA±ìAªìA£ìAœìA•ìAŽìA‡ìA€ìAyìArìAkìAdìA]ìAVìAOìAHìAAìA:ìA3ìA,ìA%ìAìAìAìA ìAìAûëAôëAíëAæëAßëAØëAÑëAÊëAÃëA¼ëAµëA®ëA§ëA ëA™ëA’ëA‹ëA„ëA}ëAvëAoëAhëAaëAZëASëALëAEëA>ëA7ëA0ëA)ëA"ëAëAëA ëAëAÿêAøêAñêAêêAãêAÜêAÕêAÎêAÇêAÀêA¹êA²êA«êA¤êAêA–êAêAˆêAêAzêAsêAlêAeêA^êAWêAPêAIêABêA;êA4êA-êA&êAêAêAêA êAêAüéAõéAîéAçéAàéAÙéAÒéAËéAÄéA½éA¶éA¯éA¨éA¡éAšéA“éAŒéA…éA~éAwéApéAiéAbéA[éATéAMéAFéA?éA8éA1éA*éA#éAéAéAéAéAéAùèAòèAëèAäèAÝèAÖèAÏèAÈèAÁèAºèA³èA¬èA¥èAžèA—èAèA‰èA‚èA{èAtèAmèAfèA_èAXèAQèAJèACèA<èA5èA.èA'èA èAèAèA èAèAýçAöçAïçAèçAáçAÚçAÓçAÌçAÅçA¾çA·çA°çA©çA¢çA›çA”çAçA†çAçAxçAqçAjçAcçA\çAUçANçAGçA@çA9çA2çA+çA$çAçAçAçAçAçAúæAóæAìæAåæAÞæA׿AÐæAÉæAÂæA»æA´æA­æA¦æAŸæA˜æA‘æAŠæAƒæA|æAuæAnæAgæA`æAYæARæAKæADæA=æA6æA/æA(æA!æAæAæA æAæAþåA÷åAðåAéåAâåAÛåAÔåAÍåAÆåA¿åA¸åA±åAªåA£åAœåA•åAŽåA‡åA€åAyåAråAkåAdåA]åAVåAOåAHåAAåA:åA3åA,åA%åAåAåAåA åAåAûäAôäAíäAæäAßäAØäAÑäAÊäAÃäA¼äAµäA®äA§äA äA™äA’äA‹äA„äA}äAväAoäAhäAaäAZäASäALäAEäA>äA7äA0äA)äA"äAäAäA äAäAÿãAøãAñãAêãAããAÜãAÕãAÎãAÇãAÀãA¹ãA²ãA«ãA¤ãAãA–ãAãAˆãAãAzãAsãAlãAeãA^ãAWãAPãAIãABãA;ãA4ãA-ãA&ãAãAãAãA ãAãAüâAõâAîâAçâAàâAÙâAÒâAËâAÄâA½âA¶âA¯âA¨âA¡âAšâA“âAŒâA…âA~âAwâApâAiâAbâA[âATâAMâAFâA?âA8âA1âA*âA#âAâAâAâAâAâAùáAòáAëáAäáAÝáAÖáAÏáAÈáAÁáAºáA³áA¬áA¥áAžáA—áAáA‰áA‚áA{áAtáAmáAfáA_áAXáAQáAJáACáA<áA5áA.áA'áA áAáAáA áAáAýàAöàAïàAèàAáàAÚàAÓàAÌàAÅàA¾àA·àA°àA©àA¢àA›àA”àAàA†àAàAxàAqàAjàAcàA\àAUàANàAGàA@àA9àA2àA+àA$àAàAàAàAàAàAúßAóßAìßAåßAÞßA×ßAÐßAÉßAÂßA»ßA´ßA­ßA¦ßAŸßA˜ßA‘ßAŠßAƒßA|ßAußAnßAgßA`ßAYßARßAKßADßA=ßA6ßA/ßA(ßA!ßAßAßA ßAßAþÞA÷ÞAðÞAéÞAâÞAÛÞAÔÞAÍÞAÆÞA¿ÞA¸ÞA±ÞAªÞA£ÞAœÞA•ÞAŽÞA‡ÞA€ÞAyÞArÞAkÞAdÞA]ÞAVÞAOÞAHÞAAÞA:ÞA3ÞA,ÞA%ÞAÞAÞAÞA ÞAÞAûÝAôÝAíÝAæÝAßÝAØÝAÑÝAÊÝAÃÝA¼ÝAµÝA®ÝA§ÝA ÝA™ÝA’ÝA‹ÝA„ÝA}ÝAvÝAoÝAhÝAaÝAZÝASÝALÝAEÝA>ÝA7ÝA0ÝA)ÝA"ÝAÝAÝA ÝAÝAÿÜAøÜAñÜAêÜAãÜAÜÜAÕÜAÎÜAÇÜAÀÜA¹ÜA²ÜA«ÜA¤ÜAÜA–ÜAÜAˆÜAÜAzÜAsÜAlÜAeÜA^ÜAWÜAPÜAIÜABÜA;ÜA4ÜA-ÜA&ÜAÜAÜAÜA ÜAÜAüÛAõÛAîÛAçÛAàÛAÙÛAÒÛAËÛAÄÛA½ÛA¶ÛA¯ÛA¨ÛA¡ÛAšÛA“ÛAŒÛA…ÛA~ÛAwÛApÛAiÛAbÛA[ÛATÛAMÛAFÛA?ÛA8ÛA1ÛA*ÛA#ÛAÛAÛAÛAÛAÛAùÚAòÚAëÚAäÚAÝÚAÖÚAÏÚAÈÚAÁÚAºÚA³ÚA¬ÚA¥ÚAžÚA—ÚAÚA‰ÚA‚ÚA{ÚAtÚAmÚAfÚA_ÚAXÚAQÚAJÚACÚA<ÚA5ÚA.ÚA'ÚA ÚAÚAÚA ÚAÚAýÙAöÙAïÙAèÙAáÙAÚÙAÓÙAÌÙAÅÙA¾ÙA·ÙA°ÙA©ÙA¢ÙA›ÙA”ÙAÙA†ÙAÙAxÙAqÙAjÙAcÙA\ÙAUÙANÙAGÙA@ÙA9ÙA2ÙA+ÙA$ÙAÙAÙAÙAÙAÙAúØAóØAìØAåØAÞØAרAÐØAÉØAÂØA»ØA´ØA­ØA¦ØAŸØA˜ØA‘ØAŠØAƒØA|ØAuØAnØAgØA`ØAYØARØAKØADØA=ØA6ØA/ØA(ØA!ØAØAØA ØAØAþ×A÷×Að×Aé×Aâ×AÛ×AÔ×AÍ×AÆ×A¿×A¸×A±×Aª×A£×Aœ×A•×AŽ×A‡×A€×Ay×Ar×Ak×Ad×A]×AV×AO×AH×AA×A:×A3×A,×A%×A×A×A×A ×A×AûÖAôÖAíÖAæÖAßÖAØÖAÑÖAÊÖAÃÖA¼ÖAµÖA®ÖA§ÖA ÖA™ÖA’ÖA‹ÖA„ÖA}ÖAvÖAoÖAhÖAaÖAZÖASÖALÖAEÖA>ÖA7ÖA0ÖA)ÖA"ÖAÖAÖA ÖAÖAÿÕAøÕAñÕAêÕAãÕAÜÕAÕÕAÎÕAÇÕAÀÕA¹ÕA²ÕA«ÕA¤ÕAÕA–ÕAÕAˆÕAÕAzÕAsÕAlÕAeÕA^ÕAWÕAPÕAIÕABÕA;ÕA4ÕA-ÕA&ÕAÕAÕAÕA ÕAÕAüÔAõÔAîÔAçÔAàÔAÙÔAÒÔAËÔAÄÔA½ÔA¶ÔA¯ÔA¨ÔA¡ÔAšÔA“ÔAŒÔA…ÔA~ÔAwÔApÔAiÔAbÔA[ÔATÔAMÔAFÔA?ÔA8ÔA1ÔA*ÔA#ÔAÔAÔAÔAÔAÔAùÓAòÓAëÓAäÓAÝÓAÖÓAÏÓAÈÓAÁÓAºÓA³ÓA¬ÓA¥ÓAžÓA—ÓAÓA‰ÓA‚ÓA{ÓAtÓAmÓAfÓA_ÓAXÓAQÓAJÓACÓA<ÓA5ÓA.ÓA'ÓA ÓAÓAÓA ÓAÓAýÒAöÒAïÒAèÒAáÒAÚÒAÓÒAÌÒAÅÒA¾ÒA·ÒA°ÒA©ÒA¢ÒA›ÒA”ÒAÒA†ÒAÒAxÒAqÒAjÒAcÒA\ÒAUÒANÒAGÒA@ÒA9ÒA2ÒA+ÒA$ÒAÒAÒAÒAÒAÒAúÑAóÑAìÑAåÑAÞÑA×ÑAÐÑAÉÑAÂÑA»ÑA´ÑA­ÑA¦ÑAŸÑA˜ÑA‘ÑAŠÑAƒÑA|ÑAuÑAnÑAgÑA`ÑAYÑARÑAKÑADÑA=ÑA6ÑA/ÑA(ÑA!ÑAÑAÑA ÑAÑAþÐA÷ÐAðÐAéÐAâÐAÛÐAÔÐAÍÐAÆÐA¿ÐA¸ÐA±ÐAªÐA£ÐAœÐA•ÐAŽÐA‡ÐA€ÐAyÐArÐAkÐAdÐA]ÐAVÐAOÐAHÐAAÐA:ÐA3ÐA,ÐA%ÐAÐAÐAÐA ÐAÐAûÏAôÏAíÏAæÏAßÏAØÏAÑÏAÊÏAÃÏA¼ÏAµÏA®ÏA§ÏA ÏA™ÏA’ÏA‹ÏA„ÏA}ÏAvÏAoÏAhÏAaÏAZÏASÏALÏAEÏA>ÏA7ÏA0ÏA)ÏA"ÏAÏAÏA ÏAÏAÿÎAøÎAñÎAêÎAãÎAÜÎAÕÎAÎÎAÇÎAÀÎA¹ÎA²ÎA«ÎA¤ÎAÎA–ÎAÎAˆÎAÎAzÎAsÎAlÎAeÎA^ÎAWÎAPÎAIÎABÎA;ÎA4ÎA-ÎA&ÎAÎAÎAÎA ÎAÎAüÍAõÍAîÍAçÍAàÍAÙÍAÒÍAËÍAÄÍA½ÍA¶ÍA¯ÍA¨ÍA¡ÍAšÍA“ÍAŒÍA…ÍA~ÍAwÍApÍAiÍAbÍA[ÍATÍAMÍAFÍA?ÍA8ÍA1ÍA*ÍA#ÍAÍAÍAÍAÍAÍAùÌAòÌAëÌAäÌAÝÌAÖÌAÏÌAÈÌAÁÌAºÌA³ÌA¬ÌA¥ÌAžÌA—ÌAÌA‰ÌA‚ÌA{ÌAtÌAmÌAfÌA_ÌAXÌAQÌAJÌACÌA<ÌA5ÌA.ÌA'ÌA ÌAÌAÌA ÌAÌAýËAöËAïËAèËAáËAÚËAÓËAÌËAÅËA¾ËA·ËA°ËA©ËA¢ËA›ËA”ËAËA†ËAËAxËAqËAjËAcËA\ËAUËANËAGËA@ËA9ËA2ËA+ËA$ËAËAËAËAËAËAúÊAóÊAìÊAåÊAÞÊA×ÊAÐÊAÉÊAÂÊA»ÊA´ÊA­ÊA¦ÊAŸÊA˜ÊA‘ÊAŠÊAƒÊA|ÊAuÊAnÊAgÊA`ÊAYÊARÊAKÊADÊA=ÊA6ÊA/ÊA(ÊA!ÊAÊAÊA ÊAÊAþÉA÷ÉAðÉAéÉAâÉAÛÉAÔÉAÍÉAÆÉA¿ÉA¸ÉA±ÉAªÉA£ÉAœÉA•ÉAŽÉA‡ÉA€ÉAyÉArÉAkÉAdÉA]ÉAVÉAOÉAHÉAAÉA:ÉA3ÉA,ÉA%ÉAÉAÉAÉA ÉAÉAûÈAôÈAíÈAæÈAßÈAØÈAÑÈAÊÈAÃÈA¼ÈAµÈA®ÈA§ÈA ÈA™ÈA’ÈA‹ÈA„ÈA}ÈAvÈAoÈAhÈAaÈAZÈASÈALÈAEÈA>ÈA7ÈA0ÈA)ÈA"ÈAÈAÈA ÈAÈAÿÇAøÇAñÇAêÇAãÇAÜÇAÕÇAÎÇAÇÇAÀÇA¹ÇA²ÇA«ÇA¤ÇAÇA–ÇAÇAˆÇAÇAzÇAsÇAlÇAeÇA^ÇAWÇAPÇAIÇABÇA;ÇA4ÇA-ÇA&ÇAÇAÇAÇA ÇAÇAüÆAõÆAîÆAçÆAàÆAÙÆAÒÆAËÆAÄÆA½ÆA¶ÆA¯ÆA¨ÆA¡ÆAšÆA“ÆAŒÆA…ÆA~ÆAwÆApÆAiÆAbÆA[ÆATÆAMÆAFÆA?ÆA8ÆA1ÆA*ÆA#ÆAÆAÆAÆAÆAÆAùÅAòÅAëÅAäÅAÝÅAÖÅAÏÅAÈÅAÁÅAºÅA³ÅA¬ÅA¥ÅAžÅA—ÅAÅA‰ÅA‚ÅA{ÅAtÅAmÅAfÅA_ÅAXÅAQÅAJÅACÅA<ÅA5ÅA.ÅA'ÅA ÅAÅAÅA ÅAÅAýÄAöÄAïÄAèÄAáÄAÚÄAÓÄAÌÄAÅÄA¾ÄA·ÄA°ÄA©ÄA¢ÄA›ÄA”ÄAÄA†ÄAÄAxÄAqÄAjÄAcÄA\ÄAUÄANÄAGÄA@ÄA9ÄA2ÄA+ÄA$ÄAÄAÄAÄAÄAÄAúÃAóÃAìÃAåÃAÞÃA×ÃAÐÃAÉÃAÂÃA»ÃA´ÃA­ÃA¦ÃAŸÃA˜ÃA‘ÃAŠÃAƒÃA|ÃAuÃAnÃAgÃA`ÃAYÃARÃAKÃADÃA=ÃA6ÃA/ÃA(ÃA!ÃAÃAÃA ÃAÃAþÂA÷ÂAðÂAéÂAâÂAÛÂAÔÂAÍÂAÆÂA¿ÂA¸ÂA±ÂAªÂA£ÂAœÂA•ÂAŽÂA‡ÂA€ÂAyÂArÂAkÂAdÂA]ÂAVÂAOÂAHÂAAÂA:ÂA3ÂA,ÂA%ÂAÂAÂAÂA ÂAÂAûÁAôÁAíÁAæÁAßÁAØÁAÑÁAÊÁAÃÁA¼ÁAµÁA®ÁA§ÁA ÁA™ÁA’ÁA‹ÁA„ÁA}ÁAvÁAoÁAhÁAaÁAZÁASÁALÁAEÁA>ÁA7ÁA0ÁA)ÁA"ÁAÁAÁA ÁAÁAÿÀAøÀAñÀAêÀAãÀAÜÀAÕÀAÎÀAÇÀAÀÀA¹ÀA²ÀA«ÀA¤ÀAÀA–ÀAÀAˆÀAÀAzÀAsÀAlÀAeÀA^ÀAWÀAPÀAIÀABÀA;ÀA4ÀA-ÀA&ÀAÀAÀAÀA ÀAÀAü¿Aõ¿Aî¿Aç¿Aà¿AÙ¿AÒ¿AË¿AÄ¿A½¿A¶¿A¯¿A¨¿A¡¿Aš¿A“¿AŒ¿A…¿A~¿Aw¿Ap¿Ai¿Ab¿A[¿AT¿AM¿AF¿A?¿A8¿A1¿A*¿A#¿A¿A¿A¿A¿A¿Aù¾Aò¾Aë¾Aä¾AݾAÖ¾AϾAȾAÁ¾Aº¾A³¾A¬¾A¥¾Až¾A—¾A¾A‰¾A‚¾A{¾At¾Am¾Af¾A_¾AX¾AQ¾AJ¾AC¾A<¾A5¾A.¾A'¾A ¾A¾A¾A ¾A¾Aý½Aö½Aï½Aè½Aá½AÚ½AÓ½A̽AŽA¾½A·½A°½A©½A¢½A›½A”½A½A†½A½Ax½Aq½Aj½Ac½A\½AU½AN½AG½A@½A9½A2½A+½A$½A½A½A½A½A½Aú¼Aó¼Aì¼Aå¼AÞ¼A×¼AмAɼA¼A»¼A´¼A­¼A¦¼AŸ¼A˜¼A‘¼AмAƒ¼A|¼Au¼An¼Ag¼A`¼AY¼AR¼AK¼AD¼A=¼A6¼A/¼A(¼A!¼A¼A¼A ¼A¼Aþ»A÷»Að»Aé»Aâ»AÛ»AÔ»AÍ»AÆ»A¿»A¸»A±»Aª»A£»Aœ»A•»AŽ»A‡»A€»Ay»Ar»Ak»Ad»A]»AV»AO»AH»AA»A:»A3»A,»A%»A»A»A»A »A»AûºAôºAíºAæºAߺAغAѺAʺAúA¼ºAµºA®ºA§ºA ºA™ºA’ºA‹ºA„ºA}ºAvºAoºAhºAaºAZºASºALºAEºA>ºA7ºA0ºA)ºA"ºAºAºA ºAºAÿ¹Aø¹Añ¹Aê¹Aã¹AܹAÕ¹AιAǹAÀ¹A¹¹A²¹A«¹A¤¹A¹A–¹A¹Aˆ¹A¹Az¹As¹Al¹Ae¹A^¹AW¹AP¹AI¹AB¹A;¹A4¹A-¹A&¹A¹A¹A¹A ¹A¹Aü¸Aõ¸Aî¸Aç¸Aà¸AÙ¸AÒ¸A˸AĸA½¸A¶¸A¯¸A¨¸A¡¸Aš¸A“¸AŒ¸A…¸A~¸Aw¸Ap¸Ai¸Ab¸A[¸AT¸AM¸AF¸A?¸A8¸A1¸A*¸A#¸A¸A¸A¸A¸A¸Aù·Aò·Aë·Aä·AÝ·AÖ·AÏ·AÈ·AÁ·Aº·A³·A¬·A¥·Až·A—·A·A‰·A‚·A{·At·Am·Af·A_·AX·AQ·AJ·AC·A<·A5·A.·A'·A ·A·A·A ·A·Aý¶Aö¶Aï¶Aè¶Aá¶AÚ¶AÓ¶A̶AŶA¾¶A·¶A°¶A©¶A¢¶A›¶A”¶A¶A†¶A¶Ax¶Aq¶Aj¶Ac¶A\¶AU¶AN¶AG¶A@¶A9¶A2¶A+¶A$¶A¶A¶A¶A¶A¶AúµAóµAìµAåµAÞµA×µAеAɵAµA»µA´µA­µA¦µAŸµA˜µA‘µAеAƒµA|µAuµAnµAgµA`µAYµARµAKµADµA=µA6µA/µA(µA!µAµAµA µAµAþ´A÷´Að´Aé´Aâ´AÛ´AÔ´AÍ´AÆ´A¿´A¸´A±´Aª´A£´Aœ´A•´AŽ´A‡´A€´Ay´Ar´Ak´Ad´A]´AV´AO´AH´AA´A:´A3´A,´A%´A´A´A´A ´A´Aû³Aô³Aí³Aæ³Aß³AسAѳAʳAóA¼³Aµ³A®³A§³A ³A™³A’³A‹³A„³A}³Av³Ao³Ah³Aa³AZ³AS³AL³AE³A>³A7³A0³A)³A"³A³A³A ³A³Aÿ²Aø²Añ²Aê²Aã²AܲAÕ²AβADzAÀ²A¹²A²²A«²A¤²A²A–²A²Aˆ²A²Az²As²Al²Ae²A^²AW²AP²AI²AB²A;²A4²A-²A&²A²A²A²A ²A²Aü±Aõ±Aî±Aç±Aà±AÙ±AÒ±A˱AıA½±A¶±A¯±A¨±A¡±Aš±A“±AŒ±A…±A~±Aw±Ap±Ai±Ab±A[±AT±AM±AF±A?±A8±A1±A*±A#±A±A±A±A±A±Aù°Aò°Aë°Aä°AݰAÖ°AϰAȰAÁ°Aº°A³°A¬°A¥°Až°A—°A°A‰°A‚°A{°At°Am°Af°A_°AX°AQ°AJ°AC°A<°A5°A.°A'°A °A°A°A °A°Aý¯Aö¯Aï¯Aè¯Aá¯AÚ¯AÓ¯A̯AůA¾¯A·¯A°¯A©¯A¢¯A›¯A”¯A¯A†¯A¯Ax¯Aq¯Aj¯Ac¯A\¯AU¯AN¯AG¯A@¯A9¯A2¯A+¯A$¯A¯A¯A¯A¯A¯Aú®Aó®Aì®Aå®AÞ®A×®AЮAÉ®A®A»®A´®A­®A¦®AŸ®A˜®A‘®AŠ®Aƒ®A|®Au®An®Ag®A`®AY®AR®AK®AD®A=®A6®A/®A(®A!®A®A®A ®A®Aþ­A÷­Að­Aé­Aâ­AÛ­AÔ­AÍ­AÆ­A¿­A¸­A±­Aª­A£­Aœ­A•­AŽ­A‡­A€­Ay­Ar­Ak­Ad­A]­AV­AO­AH­AA­A:­A3­A,­A%­A­A­A­A ­A­Aû¬Aô¬Aí¬Aæ¬A߬AجAѬAʬAìA¼¬Aµ¬A®¬A§¬A ¬A™¬A’¬A‹¬A„¬A}¬Av¬Ao¬Ah¬Aa¬AZ¬AS¬AL¬AE¬A>¬A7¬A0¬A)¬A"¬A¬A¬A ¬A¬Aÿ«Aø«Añ«Aê«Aã«AÜ«AÕ«AΫAÇ«AÀ«A¹«A²«A««A¤«A«A–«A«Aˆ«A«Az«As«Al«Ae«A^«AW«AP«AI«AB«A;«A4«A-«A&«A«A«A«A «A«AüªAõªAîªAçªAàªAÙªAÒªA˪AĪA½ªA¶ªA¯ªA¨ªA¡ªAšªA“ªAŒªA…ªA~ªAwªApªAiªAbªA[ªATªAMªAFªA?ªA8ªA1ªA*ªA#ªAªAªAªAªAªAù©Aò©Aë©Aä©AÝ©AÖ©AÏ©AÈ©AÁ©Aº©A³©A¬©A¥©Až©A—©A©A‰©A‚©A{©At©Am©Af©A_©AX©AQ©AJ©AC©A<©A5©A.©A'©A ©A©A©A ©A©Aý¨Aö¨Aï¨Aè¨Aá¨AÚ¨AÓ¨ĄAŨA¾¨A·¨A°¨A©¨A¢¨A›¨A”¨A¨A†¨A¨Ax¨Aq¨Aj¨Ac¨A\¨AU¨AN¨AG¨A@¨A9¨A2¨A+¨A$¨A¨A¨A¨A¨A¨Aú§Aó§Aì§Aå§AÞ§A×§AЧAɧA§A»§A´§A­§A¦§AŸ§A˜§A‘§AЧAƒ§A|§Au§An§Ag§A`§AY§AR§AK§AD§A=§A6§A/§A(§A!§A§A§A §A§Aþ¦A÷¦Að¦Aé¦Aâ¦AÛ¦AÔ¦AͦAƦA¿¦A¸¦A±¦Aª¦A£¦Aœ¦A•¦AަA‡¦A€¦Ay¦Ar¦Ak¦Ad¦A]¦AV¦AO¦AH¦AA¦A:¦A3¦A,¦A%¦A¦A¦A¦A ¦A¦Aû¥Aô¥Aí¥Aæ¥AߥAØ¥AÑ¥AÊ¥AÃ¥A¼¥Aµ¥A®¥A§¥A ¥A™¥A’¥A‹¥A„¥A}¥Av¥Ao¥Ah¥Aa¥AZ¥AS¥AL¥AE¥A>¥A7¥A0¥A)¥A"¥A¥A¥A ¥A¥Aÿ¤Aø¤Añ¤Aê¤Aã¤AܤAÕ¤AΤAǤAÀ¤A¹¤A²¤A«¤A¤¤A¤A–¤A¤Aˆ¤A¤Az¤As¤Al¤Ae¤A^¤AW¤AP¤AI¤AB¤A;¤A4¤A-¤A&¤A¤A¤A¤A ¤A¤Aü£Aõ£Aî£Aç£Aà£AÙ£AÒ£AË£AÄ£A½£A¶£A¯£A¨£A¡£Aš£A“£AŒ£A…£A~£Aw£Ap£Ai£Ab£A[£AT£AM£AF£A?£A8£A1£A*£A#£A£A£A£A£A£Aù¢Aò¢Aë¢Aä¢AÝ¢AÖ¢AÏ¢AÈ¢AÁ¢Aº¢A³¢A¬¢A¥¢Až¢A—¢A¢A‰¢A‚¢A{¢At¢Am¢Af¢A_¢AX¢AQ¢AJ¢AC¢A<¢A5¢A.¢A'¢A ¢A¢A¢A ¢A¢Aý¡Aö¡Aï¡Aè¡Aá¡AÚ¡AÓ¡AÌ¡AÅ¡A¾¡A·¡A°¡A©¡A¢¡A›¡A”¡A¡A†¡A¡Ax¡Aq¡Aj¡Ac¡A\¡AU¡AN¡AG¡A@¡A9¡A2¡A+¡A$¡A¡A¡A¡A¡A¡Aú Aó Aì Aå AÞ A× AРAÉ A A» A´ A­ A¦ AŸ A˜ A‘ AŠ Aƒ A| Au An Ag A` AY AR AK AD A= A6 A/ A( A! A A A  A AþŸA÷ŸAðŸAéŸAâŸAÛŸAÔŸAÍŸAÆŸA¿ŸA¸ŸA±ŸAªŸA£ŸAœŸA•ŸAŽŸA‡ŸA€ŸAyŸArŸAkŸAdŸA]ŸAVŸAOŸAHŸAAŸA:ŸA3ŸA,ŸA%ŸAŸAŸAŸA ŸAŸAûžAôžAížAæžAßžAØžAÑžAÊžAÞA¼žAµžA®žA§žA žA™žA’žA‹žA„žA}žAvžAožAhžAažAZžASžALžAEžA>žA7žA0žA)žA"žAžAžA žAžAÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüœAõœAîœAçœAàœAÙœAÒœAËœAÄœA½œA¶œA¯œA¨œA¡œAšœA“œAŒœA…œA~œAwœApœAiœAbœA[œATœAMœAFœA?œA8œA1œA*œA#œAœAœAœAœAœAù›Aò›Aë›Aä›AÝ›AÖ›AÏ›AÈ›AÁ›Aº›A³›A¬›A¥›Až›A—›A›A‰›A‚›A{›At›Am›Af›A_›AX›AQ›AJ›AC›A<›A5›A.›A'›A ›A›A›A ›A›AýšAöšAïšAèšAášAÚšAÓšAÌšAÅšA¾šA·šA°šA©šA¢šA›šA”šAšA†šAšAxšAqšAjšAcšA\šAUšANšAGšA@šA9šA2šA+šA$šAšAšAšAšAšAú™Aó™Aì™Aå™AÞ™A×™AЙAÉ™A™A»™A´™A­™A¦™AŸ™A˜™A‘™AŠ™Aƒ™A|™Au™An™Ag™A`™AY™AR™AK™AD™A=™A6™A/™A(™A!™A™A™A ™A™Aþ˜A÷˜Að˜Aé˜Aâ˜AÛ˜AÔ˜A͘AƘA¿˜A¸˜A±˜Aª˜A£˜Aœ˜A•˜AŽ˜A‡˜A€˜Ay˜Ar˜Ak˜Ad˜A]˜AV˜AO˜AH˜AA˜A:˜A3˜A,˜A%˜A˜A˜A˜A ˜A˜Aû—Aô—Aí—Aæ—Aß—AØ—AÑ—AÊ—A×A¼—Aµ—A®—A§—A —A™—A’—A‹—A„—A}—Av—Ao—Ah—Aa—AZ—AS—AL—AE—A>—A7—A0—A)—A"—A—A—A —A—Aÿ–Aø–Añ–Aê–Aã–AÜ–AÕ–AΖAÇ–AÀ–A¹–A²–A«–A¤–A–A––A–Aˆ–A–Az–As–Al–Ae–A^–AW–AP–AI–AB–A;–A4–A-–A&–A–A–A–A –A–Aü•Aõ•Aî•Aç•Aà•AÙ•AÒ•AË•AÄ•A½•A¶•A¯•A¨•A¡•Aš•A“•AŒ•A…•A~•Aw•Ap•Ai•Ab•A[•AT•AM•AF•A?•A8•A1•A*•A#•A•A•A•A•A•Aù”Aò”Aë”Aä”AÝ”AÖ”AÏ”AÈ”AÁ”Aº”A³”A¬”A¥”Až”A—”A”A‰”A‚”A{”At”Am”Af”A_”AX”AQ”AJ”AC”A<”A5”A.”A'”A ”A”A”A ”A”Aý“Aö“Aï“Aè“Aá“AÚ“AÓ“AÌ“AÅ“A¾“A·“A°“A©“A¢“A›“A”“A“A†“A“Ax“Aq“Aj“Ac“A\“AU“AN“AG“A@“A9“A2“A+“A$“A“A“A“A“A“Aú’Aó’Aì’Aå’AÞ’A×’AÐ’AÉ’AÂ’A»’A´’A­’A¦’AŸ’A˜’A‘’AŠ’Aƒ’A|’Au’An’Ag’A`’AY’AR’AK’AD’A=’A6’A/’A(’A!’A’A’A ’A’Aþ‘A÷‘Að‘Aé‘Aâ‘AÛ‘AÔ‘AÍ‘AÆ‘A¿‘A¸‘A±‘Aª‘A£‘Aœ‘A•‘AŽ‘A‡‘A€‘Ay‘Ar‘Ak‘Ad‘A]‘AV‘AO‘AH‘AA‘A:‘A3‘A,‘A%‘A‘A‘A‘A ‘A‘AûAôAíAæAßAØAÑAÊAÃA¼AµA®A§A A™A’A‹A„A}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüŽAõŽAîŽAçŽAàŽAÙŽAÒŽAËŽAÄŽA½ŽA¶ŽA¯ŽA¨ŽA¡ŽAšŽA“ŽAŒŽA…ŽA~ŽAwŽApŽAiŽAbŽA[ŽATŽAMŽAFŽA?ŽA8ŽA1ŽA*ŽA#ŽAŽAŽAŽAŽAŽAùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA‰A7‰A0‰A)‰A"‰A‰A‰A ‰A‰AÿˆAøˆAñˆAêˆAãˆA܈AÕˆAΈALjAÀˆA¹ˆA²ˆA«ˆA¤ˆAˆA–ˆAˆAˆˆAˆAzˆAsˆAlˆAeˆA^ˆAWˆAPˆAIˆABˆA;ˆA4ˆA-ˆA&ˆAˆAˆAˆA ˆAˆAü‡Aõ‡Aî‡Aç‡Aà‡AÙ‡AÒ‡AˇAćA½‡A¶‡A¯‡A¨‡A¡‡Aš‡A“‡AŒ‡A…‡A~‡Aw‡Ap‡Ai‡Ab‡A[‡AT‡AM‡AF‡A?‡A8‡A1‡A*‡A#‡A‡A‡A‡A‡A‡Aù†Aò†Aë†Aä†A݆AÖ†AφAȆAÁ†Aº†A³†A¬†A¥†Až†A—†A†A‰†A‚†A{†At†Am†Af†A_†AX†AQ†AJ†AC†A<†A5†A.†A'†A †A†A†A †A†Aý…Aö…Aï…Aè…Aá…AÚ…AÓ…AÌ…AÅ…A¾…A·…A°…A©…A¢…A›…A”…A…A†…A…Ax…Aq…Aj…Ac…A\…AU…AN…AG…A@…A9…A2…A+…A$…A…A…A…A…A…Aú„Aó„Aì„Aå„AÞ„AׄAЄAÉ„A„A»„A´„A­„A¦„AŸ„A˜„A‘„AŠ„Aƒ„A|„Au„An„Ag„A`„AY„AR„AK„AD„A=„A6„A/„A(„A!„A„A„A „A„AþƒA÷ƒAðƒAéƒAâƒAÛƒAÔƒA̓AƃA¿ƒA¸ƒA±ƒAªƒA£ƒAœƒA•ƒAŽƒA‡ƒA€ƒAyƒArƒAkƒAdƒA]ƒAVƒAOƒAHƒAAƒA:ƒA3ƒA,ƒA%ƒAƒAƒAƒA ƒAƒAû‚Aô‚Aí‚Aæ‚Aß‚AØ‚AÑ‚AÊ‚AÂA¼‚Aµ‚A®‚A§‚A ‚A™‚A’‚A‹‚A„‚A}‚Av‚Ao‚Ah‚Aa‚AZ‚AS‚AL‚AE‚A>‚A7‚A0‚A)‚A"‚A‚A‚A ‚A‚AÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAü€Aõ€Aî€Aç€Aà€AÙ€AÒ€AË€AÄ€A½€A¶€A¯€A¨€A¡€Aš€A“€AŒ€A…€A~€Aw€Ap€Ai€Ab€A[€AT€AM€AF€A?€A8€A1€A*€A#€A€A€A€A€A€AùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAý~Aö~Aï~Aè~Aá~AÚ~AÓ~AÌ~AÅ~A¾~A·~A°~A©~A¢~A›~A”~A~A†~A~Ax~Aq~Aj~Ac~A\~AU~AN~AG~A@~A9~A2~A+~A$~A~A~A~A~A~Aú}Aó}Aì}Aå}AÞ}A×}AÐ}AÉ}AÂ}A»}A´}A­}A¦}AŸ}A˜}A‘}AŠ}Aƒ}A|}Au}An}Ag}A`}AY}AR}AK}AD}A=}A6}A/}A(}A!}A}A}A }A}Aþ|A÷|Að|Aé|Aâ|AÛ|AÔ|AÍ|AÆ|A¿|A¸|A±|Aª|A£|Aœ|A•|AŽ|A‡|A€|Ay|Ar|Ak|Ad|A]|AV|AO|AH|AA|A:|A3|A,|A%|A|A|A|A |A|Aû{Aô{Aí{Aæ{Aß{AØ{AÑ{AÊ{AÃ{A¼{Aµ{A®{A§{A {A™{A’{A‹{A„{A}{Av{Ao{Ah{Aa{AZ{AS{AL{AE{A>{A7{A0{A){A"{A{A{A {A{AÿzAøzAñzAêzAãzAÜzAÕzAÎzAÇzAÀzA¹zA²zA«zA¤zAzA–zAzAˆzAzAzzAszAlzAezA^zAWzAPzAIzABzA;zA4zA-zA&zAzAzAzA zAzAüyAõyAîyAçyAàyAÙyAÒyAËyAÄyA½yA¶yA¯yA¨yA¡yAšyA“yAŒyA…yA~yAwyApyAiyAbyA[yATyAMyAFyA?yA8yA1yA*yA#yAyAyAyAyAyAùxAòxAëxAäxAÝxAÖxAÏxAÈxAÁxAºxA³xA¬xA¥xAžxA—xAxA‰xA‚xA{xAtxAmxAfxA_xAXxAQxAJxACxAtA7tA0tA)tA"tAtAtA tAtAÿsAøsAñsAêsAãsAÜsAÕsAÎsAÇsAÀsA¹sA²sA«sA¤sAsA–sAsAˆsAsAzsAssAlsAesA^sAWsAPsAIsABsA;sA4sA-sA&sAsAsAsA sAsAürAõrAîrAçrAàrAÙrAÒrAËrAÄrA½rA¶rA¯rA¨rA¡rAšrA“rAŒrA…rA~rAwrAprAirAbrA[rATrAMrAFrA?rA8rA1rA*rA#rArArArArArAùqAòqAëqAäqAÝqAÖqAÏqAÈqAÁqAºqA³qA¬qA¥qAžqA—qAqA‰qA‚qA{qAtqAmqAfqA_qAXqAQqAJqACqAmA7mA0mA)mA"mAmAmA mAmAÿlAølAñlAêlAãlAÜlAÕlAÎlAÇlAÀlA¹lA²lA«lA¤lAlA–lAlAˆlAlAzlAslAllAelA^lAWlAPlAIlABlA;lA4lA-lA&lAlAlAlA lAlAükAõkAîkAçkAàkAÙkAÒkAËkAÄkA½kA¶kA¯kA¨kA¡kAškA“kAŒkA…kA~kAwkApkAikAbkA[kATkAMkAFkA?kA8kA1kA*kA#kAkAkAkAkAkAùjAòjAëjAäjAÝjAÖjAÏjAÈjAÁjAºjA³jA¬jA¥jAžjA—jAjA‰jA‚jA{jAtjAmjAfjA_jAXjAQjAJjACjAfA7fA0fA)fA"fAfAfA fAfAÿeAøeAñeAêeAãeAÜeAÕeAÎeAÇeAÀeA¹eA²eA«eA¤eAeA–eAeAˆeAeAzeAseAleAeeA^eAWeAPeAIeABeA;eA4eA-eA&eAeAeAeA eAeAüdAõdAîdAçdAàdAÙdAÒdAËdAÄdA½dA¶dA¯dA¨dA¡dAšdA“dAŒdA…dA~dAwdApdAidAbdA[dATdAMdAFdA?dA8dA1dA*dA#dAdAdAdAdAdAùcAòcAëcAäcAÝcAÖcAÏcAÈcAÁcAºcA³cA¬cA¥cAžcA—cAcA‰cA‚cA{cAtcAmcAfcA_cAXcAQcAJcACcA_A7_A0_A)_A"_A_A_A _A_Aÿ^Aø^Añ^Aê^Aã^AÜ^AÕ^AÎ^AÇ^AÀ^A¹^A²^A«^A¤^A^A–^A^Aˆ^A^Az^As^Al^Ae^A^^AW^AP^AI^AB^A;^A4^A-^A&^A^A^A^A ^A^Aü]Aõ]Aî]Aç]Aà]AÙ]AÒ]AË]AÄ]A½]A¶]A¯]A¨]A¡]Aš]A“]AŒ]A…]A~]Aw]Ap]Ai]Ab]A[]AT]AM]AF]A?]A8]A1]A*]A#]A]A]A]A]A]Aù\Aò\Aë\Aä\AÝ\AÖ\AÏ\AÈ\AÁ\Aº\A³\A¬\A¥\Až\A—\A\A‰\A‚\A{\At\Am\Af\A_\AX\AQ\AJ\AC\A<\A5\A.\A'\A \A\A\A \A\Aý[Aö[Aï[Aè[Aá[AÚ[AÓ[AÌ[AÅ[A¾[A·[A°[A©[A¢[A›[A”[A[A†[A[Ax[Aq[Aj[Ac[A\[AU[AN[AG[A@[A9[A2[A+[A$[A[A[A[A[A[AúZAóZAìZAåZAÞZA×ZAÐZAÉZAÂZA»ZA´ZA­ZA¦ZAŸZA˜ZA‘ZAŠZAƒZA|ZAuZAnZAgZA`ZAYZARZAKZADZA=ZA6ZA/ZA(ZA!ZAZAZA ZAZAþYA÷YAðYAéYAâYAÛYAÔYAÍYAÆYA¿YA¸YA±YAªYA£YAœYA•YAŽYA‡YA€YAyYArYAkYAdYA]YAVYAOYAHYAAYA:YA3YA,YA%YAYAYAYA YAYAûXAôXAíXAæXAßXAØXAÑXAÊXAÃXA¼XAµXA®XA§XA XA™XA’XA‹XA„XA}XAvXAoXAhXAaXAZXASXALXAEXA>XA7XA0XA)XA"XAXAXA XAXAÿWAøWAñWAêWAãWAÜWAÕWAÎWAÇWAÀWA¹WA²WA«WA¤WAWA–WAWAˆWAWAzWAsWAlWAeWA^WAWWAPWAIWABWA;WA4WA-WA&WAWAWAWA WAWAüVAõVAîVAçVAàVAÙVAÒVAËVAÄVA½VA¶VA¯VA¨VA¡VAšVA“VAŒVA…VA~VAwVApVAiVAbVA[VATVAMVAFVA?VA8VA1VA*VA#VAVAVAVAVAVAùUAòUAëUAäUAÝUAÖUAÏUAÈUAÁUAºUA³UA¬UA¥UAžUA—UAUA‰UA‚UA{UAtUAmUAfUA_UAXUAQUAJUACUAQA7QA0QA)QA"QAQAQA QAQAÿPAøPAñPAêPAãPAÜPAÕPAÎPAÇPAÀPA¹PA²PA«PA¤PAPA–PAPAˆPAPAzPAsPAlPAePA^PAWPAPPAIPABPA;PA4PA-PA&PAPAPAPA PAPAüOAõOAîOAçOAàOAÙOAÒOAËOAÄOA½OA¶OA¯OA¨OA¡OAšOA“OAŒOA…OA~OAwOApOAiOAbOA[OATOAMOAFOA?OA8OA1OA*OA#OAOAOAOAOAOAùNAòNAëNAäNAÝNAÖNAÏNAÈNAÁNAºNA³NA¬NA¥NAžNA—NANA‰NA‚NA{NAtNAmNAfNA_NAXNAQNAJNACNAJA7JA0JA)JA"JAJAJA JAJAÿIAøIAñIAêIAãIAÜIAÕIAÎIAÇIAÀIA¹IA²IA«IA¤IAIA–IAIAˆIAIAzIAsIAlIAeIA^IAWIAPIAIIABIA;IA4IA-IA&IAIAIAIA IAIAüHAõHAîHAçHAàHAÙHAÒHAËHAÄHA½HA¶HA¯HA¨HA¡HAšHA“HAŒHA…HA~HAwHApHAiHAbHA[HATHAMHAFHA?HA8HA1HA*HA#HAHAHAHAHAHAùGAòGAëGAäGAÝGAÖGAÏGAÈGAÁGAºGA³GA¬GA¥GAžGA—GAGA‰GA‚GA{GAtGAmGAfGA_GAXGAQGAJGACGACA7CA0CA)CA"CACACA CACAÿBAøBAñBAêBAãBAÜBAÕBAÎBAÇBAÀBA¹BA²BA«BA¤BABA–BABAˆBABAzBAsBAlBAeBA^BAWBAPBAIBABBA;BA4BA-BA&BABABABA BABAüAAõAAîAAçAAàAAÙAAÒAAËAAÄAA½AA¶AA¯AA¨AA¡AAšAA“AAŒAA…AA~AAwAApAAiAAbAA[AATAAMAAFAA?AA8AA1AA*AA#AAAAAAAAAAAAù@Aò@Aë@Aä@AÝ@AÖ@AÏ@AÈ@AÁ@Aº@A³@A¬@A¥@Až@A—@A@A‰@A‚@A{@At@Am@Af@A_@AX@AQ@AJ@AC@A<@A5@A.@A'@A @A@A@A @A@Aý?Aö?Aï?Aè?Aá?AÚ?AÓ?AÌ?AÅ?A¾?A·?A°?A©?A¢?A›?A”?A?A†?A?Ax?Aq?Aj?Ac?A\?AU?AN?AG?A@?A9?A2?A+?A$?A?A?A?A?A?Aú>Aó>Aì>Aå>AÞ>A×>AÐ>AÉ>AÂ>A»>A´>A­>A¦>AŸ>A˜>A‘>AŠ>Aƒ>A|>Au>An>Ag>A`>AY>AR>AK>AD>A=>A6>A/>A(>A!>A>A>A >A>Aþ=A÷=Að=Aé=Aâ=AÛ=AÔ=AÍ=AÆ=A¿=A¸=A±=Aª=A£=Aœ=A•=AŽ=A‡=A€=Ay=Ar=Ak=Ad=A]=AV=AO=AH=AA=A:=A3=A,=A%=A=A=A=A =A=Aû5A75A05A)5A"5A5A5A 5A5Aÿ4Aø4Añ4Aê4Aã4AÜ4AÕ4AÎ4AÇ4AÀ4A¹4A²4A«4A¤4A4A–4A4Aˆ4A4Az4As4Al4Ae4A^4AW4AP4AI4AB4A;4A44A-4A&4A4A4A4A 4A4Aü3Aõ3Aî3Aç3Aà3AÙ3AÒ3AË3AÄ3A½3A¶3A¯3A¨3A¡3Aš3A“3AŒ3A…3A~3Aw3Ap3Ai3Ab3A[3AT3AM3AF3A?3A83A13A*3A#3A3A3A3A3A3Aù2Aò2Aë2Aä2AÝ2AÖ2AÏ2AÈ2AÁ2Aº2A³2A¬2A¥2Až2A—2A2A‰2A‚2A{2At2Am2Af2A_2AX2AQ2AJ2AC2A<2A52A.2A'2A 2A2A2A 2A2Aý1Aö1Aï1Aè1Aá1AÚ1AÓ1AÌ1AÅ1A¾1A·1A°1A©1A¢1A›1A”1A1A†1A1Ax1Aq1Aj1Ac1A\1AU1AN1AG1A@1A91A21A+1A$1A1A1A1A1A1Aú0Aó0Aì0Aå0AÞ0A×0AÐ0AÉ0AÂ0A»0A´0A­0A¦0AŸ0A˜0A‘0AŠ0Aƒ0A|0Au0An0Ag0A`0AY0AR0AK0AD0A=0A60A/0A(0A!0A0A0A 0A0Aþ/A÷/Að/Aé/Aâ/AÛ/AÔ/AÍ/AÆ/A¿/A¸/A±/Aª/A£/Aœ/A•/AŽ/A‡/A€/Ay/Ar/Ak/Ad/A]/AV/AO/AH/AA/A:/A3/A,/A%/A/A/A/A /A/Aû.Aô.Aí.Aæ.Aß.AØ.AÑ.AÊ.AÃ.A¼.Aµ.A®.A§.A .A™.A’.A‹.A„.A}.Av.Ao.Ah.Aa.AZ.AS.AL.AE.A>.A7.A0.A).A".A.A.A .A.Aÿ-Aø-Añ-Aê-Aã-AÜ-AÕ-AÎ-AÇ-AÀ-A¹-A²-A«-A¤-A-A–-A-Aˆ-A-Az-As-Al-Ae-A^-AW-AP-AI-AB-A;-A4-A--A&-A-A-A-A -A-Aü,Aõ,Aî,Aç,Aà,AÙ,AÒ,AË,AÄ,A½,A¶,A¯,A¨,A¡,Aš,A“,AŒ,A…,A~,Aw,Ap,Ai,Ab,A[,AT,AM,AF,A?,A8,A1,A*,A#,A,A,A,A,A,Aù+Aò+Aë+Aä+AÝ+AÖ+AÏ+AÈ+AÁ+Aº+A³+A¬+A¥+Až+A—+A+A‰+A‚+A{+At+Am+Af+A_+AX+AQ+AJ+AC+A<+A5+A.+A'+A +A+A+A +A+Aý*Aö*Aï*Aè*Aá*AÚ*AÓ*AÌ*AÅ*A¾*A·*A°*A©*A¢*A›*A”*A*A†*A*Ax*Aq*Aj*Ac*A\*AU*AN*AG*A@*A9*A2*A+*A$*A*A*A*A*A*Aú)Aó)Aì)Aå)AÞ)A×)AÐ)AÉ)AÂ)A»)A´)A­)A¦)AŸ)A˜)A‘)AŠ)Aƒ)A|)Au)An)Ag)A`)AY)AR)AK)AD)A=)A6)A/)A()A!)A)A)A )A)Aþ(A÷(Að(Aé(Aâ(AÛ(AÔ(AÍ(AÆ(A¿(A¸(A±(Aª(A£(Aœ(A•(AŽ(A‡(A€(Ay(Ar(Ak(Ad(A](AV(AO(AH(AA(A:(A3(A,(A%(A(A(A(A (A(Aû'Aô'Aí'Aæ'Aß'AØ'AÑ'AÊ'AÃ'A¼'Aµ'A®'A§'A 'A™'A’'A‹'A„'A}'Av'Ao'Ah'Aa'AZ'AS'AL'AE'A>'A7'A0'A)'A"'A'A'A 'A'Aÿ&Aø&Añ&Aê&Aã&AÜ&AÕ&AÎ&AÇ&AÀ&A¹&A²&A«&A¤&A&A–&A&Aˆ&A&Az&As&Al&Ae&A^&AW&AP&AI&AB&A;&A4&A-&A&&A&A&A&A &A&Aü%Aõ%Aî%Aç%Aà%AÙ%AÒ%AË%AÄ%A½%A¶%A¯%A¨%A¡%Aš%A“%AŒ%A…%A~%Aw%Ap%Ai%Ab%A[%AT%AM%AF%A?%A8%A1%A*%A#%A%A%A%A%A%Aù$Aò$Aë$Aä$AÝ$AÖ$AÏ$AÈ$AÁ$Aº$A³$A¬$A¥$Až$A—$A$A‰$A‚$A{$At$Am$Af$A_$AX$AQ$AJ$AC$A<$A5$A.$A'$A $A$A$A $A$Aý#Aö#Aï#Aè#Aá#AÚ#AÓ#AÌ#AÅ#A¾#A·#A°#A©#A¢#A›#A”#A#A†#A#Ax#Aq#Aj#Ac#A\#AU#AN#AG#A@#A9#A2#A+#A$#A#A#A#A#A#Aú"Aó"Aì"Aå"AÞ"A×"AÐ"AÉ"AÂ"A»"A´"A­"A¦"AŸ"A˜"A‘"AŠ"Aƒ"A|"Au"An"Ag"A`"AY"AR"AK"AD"A="A6"A/"A("A!"A"A"A "A"Aþ!A÷!Að!Aé!Aâ!AÛ!AÔ!AÍ!AÆ!A¿!A¸!A±!Aª!A£!Aœ!A•!AŽ!A‡!A€!Ay!Ar!Ak!Ad!A]!AV!AO!AH!AA!A:!A3!A,!A%!A!A!A!A !A!Aû Aô Aí Aæ Aß AØ AÑ AÊ Aà A¼ Aµ A® A§ A  A™ A’ A‹ A„ A} Av Ao Ah Aa AZ AS AL AE A> A7 A0 A) A" A A A A AÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAýAöAïAèAáAÚAÓAÌAÅA¾A·A°A©A¢A›A”AA†AAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAúAóAìAåAÞA×AÐAÉAÂA»A´A­A¦AŸA˜A‘AŠAƒA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAþA÷AðAéAâAÛAÔAÍAÆA¿A¸A±AªA£AœA•AŽA‡A€AyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAûAôAíAæAßAØAÑAÊAÃA¼AµA®A§A A™A’A‹A„A}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAýAöAïAèAáAÚAÓAÌAÅA¾A·A°A©A¢A›A”AA†AAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAúAóAìAåAÞA×AÐAÉAÂA»A´A­A¦AŸA˜A‘AŠAƒA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAþA÷AðAéAâAÛAÔAÍAÆA¿A¸A±AªA£AœA•AŽA‡A€AyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAûAôAíAæAßAØAÑAÊAÃA¼AµA®A§A A™A’A‹A„A}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAýAöAïAèAáAÚAÓAÌAÅA¾A·A°A©A¢A›A”AA†AAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAú Aó Aì Aå AÞ A× AÐ AÉ A A» A´ A­ A¦ AŸ A˜ A‘ AŠ Aƒ A| Au An Ag A` AY AR AK AD A= A6 A/ A( A! A A A A Aþ A÷ Að Aé Aâ AÛ AÔ AÍ AÆ A¿ A¸ A± Aª A£ Aœ A• AŽ A‡ A€ Ay Ar Ak Ad A] AV AO AH AA A: A3 A, A% A A A A A Aû Aô Aí Aæ Aß AØ AÑ AÊ Aà A¼ Aµ A® A§ A  A™ A’ A‹ A„ A} Av Ao Ah Aa AZ AS AL AE A> A7 A0 A) A" A A A A Aÿ Aø Añ Aê Aã AÜ AÕ AÎ AÇ AÀ A¹ A² A« A¤ A A– A Aˆ A Az As Al Ae A^ AW AP AI AB A; A4 A- A& A A A A A Aü Aõ Aî Aç Aà AÙ AÒ AË AÄ A½ A¶ A¯ A¨ A¡ Aš A“ AŒ A… A~ Aw Ap Ai Ab A[ AT AM AF A? A8 A1 A* A# A A A A A AùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAýAöAïAèAáAÚAÓAÌAÅA¾A·A°A©A¢A›A”AA†AAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAúAóAìAåAÞA×AÐAÉAÂA»A´A­A¦AŸA˜A‘AŠAƒA|AuAnAgA`AYARAKADA=A6A/A(A!AAA AAþA÷AðAéAâAÛAÔAÍAÆA¿A¸A±AªA£AœA•AŽA‡A€AyArAkAdA]AVAOAHAAA:A3A,A%AAAA AAûAôAíAæAßAØAÑAÊAÃA¼AµA®A§A A™A’A‹A„A}AvAoAhAaAZASALAEA>A7A0A)A"AAA AAÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA<A5A.A'A AAA AAýAöAïAèAáAÚAÓAÌAÅA¾A·A°A©A¢A›A”AA†AAxAqAjAcA\AUANAGA@A9A2A+A$AAAAAAúÿ@óÿ@ìÿ@åÿ@Þÿ@×ÿ@Ðÿ@Éÿ@Âÿ@»ÿ@´ÿ@­ÿ@¦ÿ@Ÿÿ@˜ÿ@‘ÿ@Šÿ@ƒÿ@|ÿ@uÿ@nÿ@gÿ@`ÿ@Yÿ@Rÿ@Kÿ@Dÿ@=ÿ@6ÿ@/ÿ@(ÿ@!ÿ@ÿ@ÿ@ ÿ@ÿ@þþ@÷þ@ðþ@éþ@âþ@Ûþ@Ôþ@Íþ@Æþ@¿þ@¸þ@±þ@ªþ@£þ@œþ@•þ@Žþ@‡þ@€þ@yþ@rþ@kþ@dþ@]þ@Vþ@Oþ@Hþ@Aþ@:þ@3þ@,þ@%þ@þ@þ@þ@ þ@þ@ûý@ôý@íý@æý@ßý@Øý@Ñý@Êý@Ãý@¼ý@µý@®ý@§ý@ ý@™ý@’ý@‹ý@„ý@}ý@vý@oý@hý@aý@Zý@Sý@Lý@Eý@>ý@7ý@0ý@)ý@"ý@ý@ý@ ý@ý@ÿü@øü@ñü@êü@ãü@Üü@Õü@Îü@Çü@Àü@¹ü@²ü@«ü@¤ü@ü@–ü@ü@ˆü@ü@zü@sü@lü@eü@^ü@Wü@Pü@Iü@Bü@;ü@4ü@-ü@&ü@ü@ü@ü@ ü@ü@üû@õû@îû@çû@àû@Ùû@Òû@Ëû@Äû@½û@¶û@¯û@¨û@¡û@šû@“û@Œû@…û@~û@wû@pû@iû@bû@[û@Tû@Mû@Fû@?û@8û@1û@*û@#û@û@û@û@û@û@ùú@òú@ëú@äú@Ýú@Öú@Ïú@Èú@Áú@ºú@³ú@¬ú@¥ú@žú@—ú@ú@‰ú@‚ú@{ú@tú@mú@fú@_ú@Xú@Qú@Jú@Cú@<ú@5ú@.ú@'ú@ ú@ú@ú@ ú@ú@ýù@öù@ïù@èù@áù@Úù@Óù@Ìù@Åù@¾ù@·ù@°ù@©ù@¢ù@›ù@”ù@ù@†ù@ù@xù@qù@jù@cù@\ù@Uù@Nù@Gù@@ù@9ù@2ù@+ù@$ù@ù@ù@ù@ù@ù@úø@óø@ìø@åø@Þø@×ø@Ðø@Éø@Âø@»ø@´ø@­ø@¦ø@Ÿø@˜ø@‘ø@Šø@ƒø@|ø@uø@nø@gø@`ø@Yø@Rø@Kø@Dø@=ø@6ø@/ø@(ø@!ø@ø@ø@ ø@ø@þ÷@÷÷@ð÷@é÷@â÷@Û÷@Ô÷@Í÷@Æ÷@¿÷@¸÷@±÷@ª÷@£÷@œ÷@•÷@Ž÷@‡÷@€÷@y÷@r÷@k÷@d÷@]÷@V÷@O÷@H÷@A÷@:÷@3÷@,÷@%÷@÷@÷@÷@ ÷@÷@ûö@ôö@íö@æö@ßö@Øö@Ñö@Êö@Ãö@¼ö@µö@®ö@§ö@ ö@™ö@’ö@‹ö@„ö@}ö@vö@oö@hö@aö@Zö@Sö@Lö@Eö@>ö@7ö@0ö@)ö@"ö@ö@ö@ ö@ö@ÿõ@øõ@ñõ@êõ@ãõ@Üõ@Õõ@Îõ@Çõ@Àõ@¹õ@²õ@«õ@¤õ@õ@–õ@õ@ˆõ@õ@zõ@sõ@lõ@eõ@^õ@Wõ@Põ@Iõ@Bõ@;õ@4õ@-õ@&õ@õ@õ@õ@ õ@õ@üô@õô@îô@çô@àô@Ùô@Òô@Ëô@Äô@½ô@¶ô@¯ô@¨ô@¡ô@šô@“ô@Œô@…ô@~ô@wô@pô@iô@bô@[ô@Tô@Mô@Fô@?ô@8ô@1ô@*ô@#ô@ô@ô@ô@ô@ô@ùó@òó@ëó@äó@Ýó@Öó@Ïó@Èó@Áó@ºó@³ó@¬ó@¥ó@žó@—ó@ó@‰ó@‚ó@{ó@tó@mó@fó@_ó@Xó@Qó@Jó@Có@<ó@5ó@.ó@'ó@ ó@ó@ó@ ó@ó@ýò@öò@ïò@èò@áò@Úò@Óò@Ìò@Åò@¾ò@·ò@°ò@©ò@¢ò@›ò@”ò@ò@†ò@ò@xò@qò@jò@cò@\ò@Uò@Nò@Gò@@ò@9ò@2ò@+ò@$ò@ò@ò@ò@ò@ò@úñ@óñ@ìñ@åñ@Þñ@×ñ@Ðñ@Éñ@Âñ@»ñ@´ñ@­ñ@¦ñ@Ÿñ@˜ñ@‘ñ@Šñ@ƒñ@|ñ@uñ@nñ@gñ@`ñ@Yñ@Rñ@Kñ@Dñ@=ñ@6ñ@/ñ@(ñ@!ñ@ñ@ñ@ ñ@ñ@þð@÷ð@ðð@éð@âð@Ûð@Ôð@Íð@Æð@¿ð@¸ð@±ð@ªð@£ð@œð@•ð@Žð@‡ð@€ð@yð@rð@kð@dð@]ð@Vð@Oð@Hð@Að@:ð@3ð@,ð@%ð@ð@ð@ð@ ð@ð@ûï@ôï@íï@æï@ßï@Øï@Ñï@Êï@Ãï@¼ï@µï@®ï@§ï@ ï@™ï@’ï@‹ï@„ï@}ï@vï@oï@hï@aï@Zï@Sï@Lï@Eï@>ï@7ï@0ï@)ï@"ï@ï@ï@ ï@ï@ÿî@øî@ñî@êî@ãî@Üî@Õî@Îî@Çî@Àî@¹î@²î@«î@¤î@î@–î@î@ˆî@î@zî@sî@lî@eî@^î@Wî@Pî@Iî@Bî@;î@4î@-î@&î@î@î@î@ î@î@üí@õí@îí@çí@àí@Ùí@Òí@Ëí@Äí@½í@¶í@¯í@¨í@¡í@ší@“í@Œí@…í@~í@wí@pí@ií@bí@[í@Tí@Mí@Fí@?í@8í@1í@*í@#í@í@í@í@í@í@ùì@òì@ëì@äì@Ýì@Öì@Ïì@Èì@Áì@ºì@³ì@¬ì@¥ì@žì@—ì@ì@‰ì@‚ì@{ì@tì@mì@fì@_ì@Xì@Qì@Jì@Cì@<ì@5ì@.ì@'ì@ ì@ì@ì@ ì@ì@ýë@öë@ïë@èë@áë@Úë@Óë@Ìë@Åë@¾ë@·ë@°ë@©ë@¢ë@›ë@”ë@ë@†ë@ë@xë@që@jë@cë@\ë@Uë@Në@Gë@@ë@9ë@2ë@+ë@$ë@ë@ë@ë@ë@ë@úê@óê@ìê@åê@Þê@×ê@Ðê@Éê@Âê@»ê@´ê@­ê@¦ê@Ÿê@˜ê@‘ê@Šê@ƒê@|ê@uê@nê@gê@`ê@Yê@Rê@Kê@Dê@=ê@6ê@/ê@(ê@!ê@ê@ê@ ê@ê@þé@÷é@ðé@éé@âé@Ûé@Ôé@Íé@Æé@¿é@¸é@±é@ªé@£é@œé@•é@Žé@‡é@€é@yé@ré@ké@dé@]é@Vé@Oé@Hé@Aé@:é@3é@,é@%é@é@é@é@ é@é@ûè@ôè@íè@æè@ßè@Øè@Ñè@Êè@Ãè@¼è@µè@®è@§è@ è@™è@’è@‹è@„è@}è@vè@oè@hè@aè@Zè@Sè@Lè@Eè@>è@7è@0è@)è@"è@è@è@ è@è@ÿç@øç@ñç@êç@ãç@Üç@Õç@Îç@Çç@Àç@¹ç@²ç@«ç@¤ç@ç@–ç@ç@ˆç@ç@zç@sç@lç@eç@^ç@Wç@Pç@Iç@Bç@;ç@4ç@-ç@&ç@ç@ç@ç@ ç@ç@üæ@õæ@îæ@çæ@àæ@Ùæ@Òæ@Ëæ@Äæ@½æ@¶æ@¯æ@¨æ@¡æ@šæ@“æ@Œæ@…æ@~æ@wæ@pæ@iæ@bæ@[æ@Tæ@Mæ@Fæ@?æ@8æ@1æ@*æ@#æ@æ@æ@æ@æ@æ@ùå@òå@ëå@äå@Ýå@Öå@Ïå@Èå@Áå@ºå@³å@¬å@¥å@žå@—å@å@‰å@‚å@{å@tå@må@få@_å@Xå@Qå@Jå@Cå@<å@5å@.å@'å@ å@å@å@ å@å@ýä@öä@ïä@èä@áä@Úä@Óä@Ìä@Åä@¾ä@·ä@°ä@©ä@¢ä@›ä@”ä@ä@†ä@ä@xä@qä@jä@cä@\ä@Uä@Nä@Gä@@ä@9ä@2ä@+ä@$ä@ä@ä@ä@ä@ä@úã@óã@ìã@åã@Þã@×ã@Ðã@Éã@Âã@»ã@´ã@­ã@¦ã@Ÿã@˜ã@‘ã@Šã@ƒã@|ã@uã@nã@gã@`ã@Yã@Rã@Kã@Dã@=ã@6ã@/ã@(ã@!ã@ã@ã@ ã@ã@þâ@÷â@ðâ@éâ@ââ@Ûâ@Ôâ@Íâ@Æâ@¿â@¸â@±â@ªâ@£â@œâ@•â@Žâ@‡â@€â@yâ@râ@kâ@dâ@]â@Vâ@Oâ@Hâ@Aâ@:â@3â@,â@%â@â@â@â@ â@â@ûá@ôá@íá@æá@ßá@Øá@Ñá@Êá@Ãá@¼á@µá@®á@§á@ á@™á@’á@‹á@„á@}á@vá@oá@há@aá@Zá@Sá@Lá@Eá@>á@7á@0á@)á@"á@á@á@ á@á@ÿà@øà@ñà@êà@ãà@Üà@Õà@Îà@Çà@Àà@¹à@²à@«à@¤à@à@–à@à@ˆà@à@zà@sà@là@eà@^à@Wà@Pà@Ià@Bà@;à@4à@-à@&à@à@à@à@ à@à@üß@õß@îß@çß@àß@Ùß@Òß@Ëß@Äß@½ß@¶ß@¯ß@¨ß@¡ß@šß@“ß@Œß@…ß@~ß@wß@pß@iß@bß@[ß@Tß@Mß@Fß@?ß@8ß@1ß@*ß@#ß@ß@ß@ß@ß@ß@ùÞ@òÞ@ëÞ@äÞ@ÝÞ@ÖÞ@ÏÞ@ÈÞ@ÁÞ@ºÞ@³Þ@¬Þ@¥Þ@žÞ@—Þ@Þ@‰Þ@‚Þ@{Þ@tÞ@mÞ@fÞ@_Þ@XÞ@QÞ@JÞ@CÞ@<Þ@5Þ@.Þ@'Þ@ Þ@Þ@Þ@ Þ@Þ@ýÝ@öÝ@ïÝ@èÝ@áÝ@ÚÝ@ÓÝ@ÌÝ@ÅÝ@¾Ý@·Ý@°Ý@©Ý@¢Ý@›Ý@”Ý@Ý@†Ý@Ý@xÝ@qÝ@jÝ@cÝ@\Ý@UÝ@NÝ@GÝ@@Ý@9Ý@2Ý@+Ý@$Ý@Ý@Ý@Ý@Ý@Ý@úÜ@óÜ@ìÜ@åÜ@ÞÜ@×Ü@ÐÜ@ÉÜ@ÂÜ@»Ü@´Ü@­Ü@¦Ü@ŸÜ@˜Ü@‘Ü@ŠÜ@ƒÜ@|Ü@uÜ@nÜ@gÜ@`Ü@YÜ@RÜ@KÜ@DÜ@=Ü@6Ü@/Ü@(Ü@!Ü@Ü@Ü@ Ü@Ü@þÛ@÷Û@ðÛ@éÛ@âÛ@ÛÛ@ÔÛ@ÍÛ@ÆÛ@¿Û@¸Û@±Û@ªÛ@£Û@œÛ@•Û@ŽÛ@‡Û@€Û@yÛ@rÛ@kÛ@dÛ@]Û@VÛ@OÛ@HÛ@AÛ@:Û@3Û@,Û@%Û@Û@Û@Û@ Û@Û@ûÚ@ôÚ@íÚ@æÚ@ßÚ@ØÚ@ÑÚ@ÊÚ@ÃÚ@¼Ú@µÚ@®Ú@§Ú@ Ú@™Ú@’Ú@‹Ú@„Ú@}Ú@vÚ@oÚ@hÚ@aÚ@ZÚ@SÚ@LÚ@EÚ@>Ú@7Ú@0Ú@)Ú@"Ú@Ú@Ú@ Ú@Ú@ÿÙ@øÙ@ñÙ@êÙ@ãÙ@ÜÙ@ÕÙ@ÎÙ@ÇÙ@ÀÙ@¹Ù@²Ù@«Ù@¤Ù@Ù@–Ù@Ù@ˆÙ@Ù@zÙ@sÙ@lÙ@eÙ@^Ù@WÙ@PÙ@IÙ@BÙ@;Ù@4Ù@-Ù@&Ù@Ù@Ù@Ù@ Ù@Ù@üØ@õØ@îØ@çØ@àØ@ÙØ@ÒØ@ËØ@ÄØ@½Ø@¶Ø@¯Ø@¨Ø@¡Ø@šØ@“Ø@ŒØ@…Ø@~Ø@wØ@pØ@iØ@bØ@[Ø@TØ@MØ@FØ@?Ø@8Ø@1Ø@*Ø@#Ø@Ø@Ø@Ø@Ø@Ø@ù×@ò×@ë×@ä×@Ý×@Ö×@Ï×@È×@Á×@º×@³×@¬×@¥×@ž×@—×@×@‰×@‚×@{×@t×@m×@f×@_×@X×@Q×@J×@C×@<×@5×@.×@'×@ ×@×@×@ ×@×@ýÖ@öÖ@ïÖ@èÖ@áÖ@ÚÖ@ÓÖ@ÌÖ@ÅÖ@¾Ö@·Ö@°Ö@©Ö@¢Ö@›Ö@”Ö@Ö@†Ö@Ö@xÖ@qÖ@jÖ@cÖ@\Ö@UÖ@NÖ@GÖ@@Ö@9Ö@2Ö@+Ö@$Ö@Ö@Ö@Ö@Ö@Ö@úÕ@óÕ@ìÕ@åÕ@ÞÕ@×Õ@ÐÕ@ÉÕ@ÂÕ@»Õ@´Õ@­Õ@¦Õ@ŸÕ@˜Õ@‘Õ@ŠÕ@ƒÕ@|Õ@uÕ@nÕ@gÕ@`Õ@YÕ@RÕ@KÕ@DÕ@=Õ@6Õ@/Õ@(Õ@!Õ@Õ@Õ@ Õ@Õ@þÔ@÷Ô@ðÔ@éÔ@âÔ@ÛÔ@ÔÔ@ÍÔ@ÆÔ@¿Ô@¸Ô@±Ô@ªÔ@£Ô@œÔ@•Ô@ŽÔ@‡Ô@€Ô@yÔ@rÔ@kÔ@dÔ@]Ô@VÔ@OÔ@HÔ@AÔ@:Ô@3Ô@,Ô@%Ô@Ô@Ô@Ô@ Ô@Ô@ûÓ@ôÓ@íÓ@æÓ@ßÓ@ØÓ@ÑÓ@ÊÓ@ÃÓ@¼Ó@µÓ@®Ó@§Ó@ Ó@™Ó@’Ó@‹Ó@„Ó@}Ó@vÓ@oÓ@hÓ@aÓ@ZÓ@SÓ@LÓ@EÓ@>Ó@7Ó@0Ó@)Ó@"Ó@Ó@Ó@ Ó@Ó@ÿÒ@øÒ@ñÒ@êÒ@ãÒ@ÜÒ@ÕÒ@ÎÒ@ÇÒ@ÀÒ@¹Ò@²Ò@«Ò@¤Ò@Ò@–Ò@Ò@ˆÒ@Ò@zÒ@sÒ@lÒ@eÒ@^Ò@WÒ@PÒ@IÒ@BÒ@;Ò@4Ò@-Ò@&Ò@Ò@Ò@Ò@ Ò@Ò@üÑ@õÑ@îÑ@çÑ@àÑ@ÙÑ@ÒÑ@ËÑ@ÄÑ@½Ñ@¶Ñ@¯Ñ@¨Ñ@¡Ñ@šÑ@“Ñ@ŒÑ@…Ñ@~Ñ@wÑ@pÑ@iÑ@bÑ@[Ñ@TÑ@MÑ@FÑ@?Ñ@8Ñ@1Ñ@*Ñ@#Ñ@Ñ@Ñ@Ñ@Ñ@Ñ@ùÐ@òÐ@ëÐ@äÐ@ÝÐ@ÖÐ@ÏÐ@ÈÐ@ÁÐ@ºÐ@³Ð@¬Ð@¥Ð@žÐ@—Ð@Ð@‰Ð@‚Ð@{Ð@tÐ@mÐ@fÐ@_Ð@XÐ@QÐ@JÐ@CÐ@<Ð@5Ð@.Ð@'Ð@ Ð@Ð@Ð@ Ð@Ð@ýÏ@öÏ@ïÏ@èÏ@áÏ@ÚÏ@ÓÏ@ÌÏ@ÅÏ@¾Ï@·Ï@°Ï@©Ï@¢Ï@›Ï@”Ï@Ï@†Ï@Ï@xÏ@qÏ@jÏ@cÏ@\Ï@UÏ@NÏ@GÏ@@Ï@9Ï@2Ï@+Ï@$Ï@Ï@Ï@Ï@Ï@Ï@úÎ@óÎ@ìÎ@åÎ@ÞÎ@×Î@ÐÎ@ÉÎ@ÂÎ@»Î@´Î@­Î@¦Î@ŸÎ@˜Î@‘Î@ŠÎ@ƒÎ@|Î@uÎ@nÎ@gÎ@`Î@YÎ@RÎ@KÎ@DÎ@=Î@6Î@/Î@(Î@!Î@Î@Î@ Î@Î@þÍ@÷Í@ðÍ@éÍ@âÍ@ÛÍ@ÔÍ@ÍÍ@ÆÍ@¿Í@¸Í@±Í@ªÍ@£Í@œÍ@•Í@ŽÍ@‡Í@€Í@yÍ@rÍ@kÍ@dÍ@]Í@VÍ@OÍ@HÍ@AÍ@:Í@3Í@,Í@%Í@Í@Í@Í@ Í@Í@ûÌ@ôÌ@íÌ@æÌ@ßÌ@ØÌ@ÑÌ@ÊÌ@ÃÌ@¼Ì@µÌ@®Ì@§Ì@ Ì@™Ì@’Ì@‹Ì@„Ì@}Ì@vÌ@oÌ@hÌ@aÌ@ZÌ@SÌ@LÌ@EÌ@>Ì@7Ì@0Ì@)Ì@"Ì@Ì@Ì@ Ì@Ì@ÿË@øË@ñË@êË@ãË@ÜË@ÕË@ÎË@ÇË@ÀË@¹Ë@²Ë@«Ë@¤Ë@Ë@–Ë@Ë@ˆË@Ë@zË@sË@lË@eË@^Ë@WË@PË@IË@BË@;Ë@4Ë@-Ë@&Ë@Ë@Ë@Ë@ Ë@Ë@üÊ@õÊ@îÊ@çÊ@àÊ@ÙÊ@ÒÊ@ËÊ@ÄÊ@½Ê@¶Ê@¯Ê@¨Ê@¡Ê@šÊ@“Ê@ŒÊ@…Ê@~Ê@wÊ@pÊ@iÊ@bÊ@[Ê@TÊ@MÊ@FÊ@?Ê@8Ê@1Ê@*Ê@#Ê@Ê@Ê@Ê@Ê@Ê@ùÉ@òÉ@ëÉ@äÉ@ÝÉ@ÖÉ@ÏÉ@ÈÉ@ÁÉ@ºÉ@³É@¬É@¥É@žÉ@—É@É@‰É@‚É@{É@tÉ@mÉ@fÉ@_É@XÉ@QÉ@JÉ@CÉ@<É@5É@.É@'É@ É@É@É@ É@É@ýÈ@öÈ@ïÈ@èÈ@áÈ@ÚÈ@ÓÈ@ÌÈ@ÅÈ@¾È@·È@°È@©È@¢È@›È@”È@È@†È@È@xÈ@qÈ@jÈ@cÈ@\È@UÈ@NÈ@GÈ@@È@9È@2È@+È@$È@È@È@È@È@È@úÇ@óÇ@ìÇ@åÇ@ÞÇ@×Ç@ÐÇ@ÉÇ@ÂÇ@»Ç@´Ç@­Ç@¦Ç@ŸÇ@˜Ç@‘Ç@ŠÇ@ƒÇ@|Ç@uÇ@nÇ@gÇ@`Ç@YÇ@RÇ@KÇ@DÇ@=Ç@6Ç@/Ç@(Ç@!Ç@Ç@Ç@ Ç@Ç@þÆ@÷Æ@ðÆ@éÆ@âÆ@ÛÆ@ÔÆ@ÍÆ@ÆÆ@¿Æ@¸Æ@±Æ@ªÆ@£Æ@œÆ@•Æ@ŽÆ@‡Æ@€Æ@yÆ@rÆ@kÆ@dÆ@]Æ@VÆ@OÆ@HÆ@AÆ@:Æ@3Æ@,Æ@%Æ@Æ@Æ@Æ@ Æ@Æ@ûÅ@ôÅ@íÅ@æÅ@ßÅ@ØÅ@ÑÅ@ÊÅ@ÃÅ@¼Å@µÅ@®Å@§Å@ Å@™Å@’Å@‹Å@„Å@}Å@vÅ@oÅ@hÅ@aÅ@ZÅ@SÅ@LÅ@EÅ@>Å@7Å@0Å@)Å@"Å@Å@Å@ Å@Å@ÿÄ@øÄ@ñÄ@êÄ@ãÄ@ÜÄ@ÕÄ@ÎÄ@ÇÄ@ÀÄ@¹Ä@²Ä@«Ä@¤Ä@Ä@–Ä@Ä@ˆÄ@Ä@zÄ@sÄ@lÄ@eÄ@^Ä@WÄ@PÄ@IÄ@BÄ@;Ä@4Ä@-Ä@&Ä@Ä@Ä@Ä@ Ä@Ä@üÃ@õÃ@îÃ@çÃ@àÃ@ÙÃ@ÒÃ@ËÃ@ÄÃ@½Ã@¶Ã@¯Ã@¨Ã@¡Ã@šÃ@“Ã@ŒÃ@…Ã@~Ã@wÃ@pÃ@iÃ@bÃ@[Ã@TÃ@MÃ@FÃ@?Ã@8Ã@1Ã@*Ã@#Ã@Ã@Ã@Ã@Ã@Ã@ùÂ@òÂ@ëÂ@äÂ@ÝÂ@ÖÂ@ÏÂ@ÈÂ@ÁÂ@ºÂ@³Â@¬Â@¥Â@žÂ@—Â@Â@‰Â@‚Â@{Â@tÂ@mÂ@fÂ@_Â@XÂ@QÂ@JÂ@CÂ@<Â@5Â@.Â@'Â@ Â@Â@Â@ Â@Â@ýÁ@öÁ@ïÁ@èÁ@áÁ@ÚÁ@ÓÁ@ÌÁ@ÅÁ@¾Á@·Á@°Á@©Á@¢Á@›Á@”Á@Á@†Á@Á@xÁ@qÁ@jÁ@cÁ@\Á@UÁ@NÁ@GÁ@@Á@9Á@2Á@+Á@$Á@Á@Á@Á@Á@Á@úÀ@óÀ@ìÀ@åÀ@ÞÀ@×À@ÐÀ@ÉÀ@ÂÀ@»À@´À@­À@¦À@ŸÀ@˜À@‘À@ŠÀ@ƒÀ@|À@uÀ@nÀ@gÀ@`À@YÀ@RÀ@KÀ@DÀ@=À@6À@/À@(À@!À@À@À@ À@À@þ¿@÷¿@ð¿@é¿@â¿@Û¿@Ô¿@Í¿@Æ¿@¿¿@¸¿@±¿@ª¿@£¿@œ¿@•¿@Ž¿@‡¿@€¿@y¿@r¿@k¿@d¿@]¿@V¿@O¿@H¿@A¿@:¿@3¿@,¿@%¿@¿@¿@¿@ ¿@¿@û¾@ô¾@í¾@æ¾@ß¾@ؾ@Ѿ@ʾ@þ@¼¾@µ¾@®¾@§¾@ ¾@™¾@’¾@‹¾@„¾@}¾@v¾@o¾@h¾@a¾@Z¾@S¾@L¾@E¾@>¾@7¾@0¾@)¾@"¾@¾@¾@ ¾@¾@ÿ½@ø½@ñ½@ê½@ã½@ܽ@Õ½@ν@ǽ@À½@¹½@²½@«½@¤½@½@–½@½@ˆ½@½@z½@s½@l½@e½@^½@W½@P½@I½@B½@;½@4½@-½@&½@½@½@½@ ½@½@ü¼@õ¼@î¼@ç¼@à¼@Ù¼@Ò¼@˼@ļ@½¼@¶¼@¯¼@¨¼@¡¼@š¼@“¼@Œ¼@…¼@~¼@w¼@p¼@i¼@b¼@[¼@T¼@M¼@F¼@?¼@8¼@1¼@*¼@#¼@¼@¼@¼@¼@¼@ù»@ò»@ë»@ä»@Ý»@Ö»@Ï»@È»@Á»@º»@³»@¬»@¥»@ž»@—»@»@‰»@‚»@{»@t»@m»@f»@_»@X»@Q»@J»@C»@<»@5»@.»@'»@ »@»@»@ »@»@ýº@öº@ïº@èº@áº@Úº@Óº@̺@ź@¾º@·º@°º@©º@¢º@›º@”º@º@†º@º@xº@qº@jº@cº@\º@Uº@Nº@Gº@@º@9º@2º@+º@$º@º@º@º@º@º@ú¹@ó¹@ì¹@å¹@Þ¹@×¹@й@ɹ@¹@»¹@´¹@­¹@¦¹@Ÿ¹@˜¹@‘¹@й@ƒ¹@|¹@u¹@n¹@g¹@`¹@Y¹@R¹@K¹@D¹@=¹@6¹@/¹@(¹@!¹@¹@¹@ ¹@¹@þ¸@÷¸@ð¸@é¸@â¸@Û¸@Ô¸@͸@Ƹ@¿¸@¸¸@±¸@ª¸@£¸@œ¸@•¸@ޏ@‡¸@€¸@y¸@r¸@k¸@d¸@]¸@V¸@O¸@H¸@A¸@:¸@3¸@,¸@%¸@¸@¸@¸@ ¸@¸@û·@ô·@í·@æ·@ß·@Ø·@Ñ·@Ê·@÷@¼·@µ·@®·@§·@ ·@™·@’·@‹·@„·@}·@v·@o·@h·@a·@Z·@S·@L·@E·@>·@7·@0·@)·@"·@·@·@ ·@·@ÿ¶@ø¶@ñ¶@ê¶@ã¶@ܶ@Õ¶@ζ@Ƕ@À¶@¹¶@²¶@«¶@¤¶@¶@–¶@¶@ˆ¶@¶@z¶@s¶@l¶@e¶@^¶@W¶@P¶@I¶@B¶@;¶@4¶@-¶@&¶@¶@¶@¶@ ¶@¶@üµ@õµ@îµ@çµ@àµ@Ùµ@Òµ@˵@ĵ@½µ@¶µ@¯µ@¨µ@¡µ@šµ@“µ@Œµ@…µ@~µ@wµ@pµ@iµ@bµ@[µ@Tµ@Mµ@Fµ@?µ@8µ@1µ@*µ@#µ@µ@µ@µ@µ@µ@ù´@ò´@ë´@ä´@Ý´@Ö´@Ï´@È´@Á´@º´@³´@¬´@¥´@ž´@—´@´@‰´@‚´@{´@t´@m´@f´@_´@X´@Q´@J´@C´@<´@5´@.´@'´@ ´@´@´@ ´@´@ý³@ö³@ï³@è³@á³@Ú³@Ó³@̳@ų@¾³@·³@°³@©³@¢³@›³@”³@³@†³@³@x³@q³@j³@c³@\³@U³@N³@G³@@³@9³@2³@+³@$³@³@³@³@³@³@ú²@ó²@ì²@å²@Þ²@ײ@в@ɲ@²@»²@´²@­²@¦²@Ÿ²@˜²@‘²@в@ƒ²@|²@u²@n²@g²@`²@Y²@R²@K²@D²@=²@6²@/²@(²@!²@²@²@ ²@²@þ±@÷±@ð±@é±@â±@Û±@Ô±@ͱ@Ʊ@¿±@¸±@±±@ª±@£±@œ±@•±@ޱ@‡±@€±@y±@r±@k±@d±@]±@V±@O±@H±@A±@:±@3±@,±@%±@±@±@±@ ±@±@û°@ô°@í°@æ°@ß°@ذ@Ѱ@ʰ@ð@¼°@µ°@®°@§°@ °@™°@’°@‹°@„°@}°@v°@o°@h°@a°@Z°@S°@L°@E°@>°@7°@0°@)°@"°@°@°@ °@°@ÿ¯@ø¯@ñ¯@ê¯@ã¯@ܯ@Õ¯@ί@ǯ@À¯@¹¯@²¯@«¯@¤¯@¯@–¯@¯@ˆ¯@¯@z¯@s¯@l¯@e¯@^¯@W¯@P¯@I¯@B¯@;¯@4¯@-¯@&¯@¯@¯@¯@ ¯@¯@ü®@õ®@î®@ç®@à®@Ù®@Ò®@Ë®@Ä®@½®@¶®@¯®@¨®@¡®@š®@“®@Œ®@…®@~®@w®@p®@i®@b®@[®@T®@M®@F®@?®@8®@1®@*®@#®@®@®@®@®@®@ù­@ò­@ë­@ä­@Ý­@Ö­@Ï­@È­@Á­@º­@³­@¬­@¥­@ž­@—­@­@‰­@‚­@{­@t­@m­@f­@_­@X­@Q­@J­@C­@<­@5­@.­@'­@ ­@­@­@ ­@­@ý¬@ö¬@ï¬@è¬@á¬@Ú¬@Ó¬@̬@Ŭ@¾¬@·¬@°¬@©¬@¢¬@›¬@”¬@¬@†¬@¬@x¬@q¬@j¬@c¬@\¬@U¬@N¬@G¬@@¬@9¬@2¬@+¬@$¬@¬@¬@¬@¬@¬@ú«@ó«@ì«@å«@Þ«@׫@Ы@É«@«@»«@´«@­«@¦«@Ÿ«@˜«@‘«@Š«@ƒ«@|«@u«@n«@g«@`«@Y«@R«@K«@D«@=«@6«@/«@(«@!«@«@«@ «@«@þª@÷ª@ðª@éª@âª@Ûª@Ôª@ͪ@ƪ@¿ª@¸ª@±ª@ªª@£ª@œª@•ª@Žª@‡ª@€ª@yª@rª@kª@dª@]ª@Vª@Oª@Hª@Aª@:ª@3ª@,ª@%ª@ª@ª@ª@ ª@ª@û©@ô©@í©@æ©@ß©@Ø©@Ñ©@Ê©@é@¼©@µ©@®©@§©@ ©@™©@’©@‹©@„©@}©@v©@o©@h©@a©@Z©@S©@L©@E©@>©@7©@0©@)©@"©@©@©@ ©@©@ÿ¨@ø¨@ñ¨@ê¨@ã¨@ܨ@Õ¨@Ψ@Ǩ@À¨@¹¨@²¨@«¨@¤¨@¨@–¨@¨@ˆ¨@¨@z¨@s¨@l¨@e¨@^¨@W¨@P¨@I¨@B¨@;¨@4¨@-¨@&¨@¨@¨@¨@ ¨@¨@ü§@õ§@î§@ç§@à§@Ù§@Ò§@˧@ħ@½§@¶§@¯§@¨§@¡§@š§@“§@Œ§@…§@~§@w§@p§@i§@b§@[§@T§@M§@F§@?§@8§@1§@*§@#§@§@§@§@§@§@ù¦@ò¦@ë¦@ä¦@ݦ@Ö¦@Ϧ@Ȧ@Á¦@º¦@³¦@¬¦@¥¦@ž¦@—¦@¦@‰¦@‚¦@{¦@t¦@m¦@f¦@_¦@X¦@Q¦@J¦@C¦@<¦@5¦@.¦@'¦@ ¦@¦@¦@ ¦@¦@ý¥@ö¥@ï¥@è¥@á¥@Ú¥@Ó¥@Ì¥@Å¥@¾¥@·¥@°¥@©¥@¢¥@›¥@”¥@¥@†¥@¥@x¥@q¥@j¥@c¥@\¥@U¥@N¥@G¥@@¥@9¥@2¥@+¥@$¥@¥@¥@¥@¥@¥@ú¤@ó¤@ì¤@å¤@Þ¤@פ@Ф@ɤ@¤@»¤@´¤@­¤@¦¤@Ÿ¤@˜¤@‘¤@Ф@ƒ¤@|¤@u¤@n¤@g¤@`¤@Y¤@R¤@K¤@D¤@=¤@6¤@/¤@(¤@!¤@¤@¤@ ¤@¤@þ£@÷£@ð£@é£@â£@Û£@Ô£@Í£@Æ£@¿£@¸£@±£@ª£@££@œ£@•£@Ž£@‡£@€£@y£@r£@k£@d£@]£@V£@O£@H£@A£@:£@3£@,£@%£@£@£@£@ £@£@û¢@ô¢@í¢@æ¢@ߢ@Ø¢@Ñ¢@Ê¢@â@¼¢@µ¢@®¢@§¢@ ¢@™¢@’¢@‹¢@„¢@}¢@v¢@o¢@h¢@a¢@Z¢@S¢@L¢@E¢@>¢@7¢@0¢@)¢@"¢@¢@¢@ ¢@¢@ÿ¡@ø¡@ñ¡@ê¡@ã¡@Ü¡@Õ¡@Ρ@Ç¡@À¡@¹¡@²¡@«¡@¤¡@¡@–¡@¡@ˆ¡@¡@z¡@s¡@l¡@e¡@^¡@W¡@P¡@I¡@B¡@;¡@4¡@-¡@&¡@¡@¡@¡@ ¡@¡@ü @õ @î @ç @à @Ù @Ò @Ë @Ä @½ @¶ @¯ @¨ @¡ @š @“ @Œ @… @~ @w @p @i @b @[ @T @M @F @? @8 @1 @* @# @ @ @ @ @ @ùŸ@òŸ@ëŸ@äŸ@ÝŸ@ÖŸ@ÏŸ@ÈŸ@ÁŸ@ºŸ@³Ÿ@¬Ÿ@¥Ÿ@žŸ@—Ÿ@Ÿ@‰Ÿ@‚Ÿ@{Ÿ@tŸ@mŸ@fŸ@_Ÿ@XŸ@QŸ@JŸ@CŸ@<Ÿ@5Ÿ@.Ÿ@'Ÿ@ Ÿ@Ÿ@Ÿ@ Ÿ@Ÿ@ýž@öž@ïž@èž@áž@Úž@Óž@Ìž@Åž@¾ž@·ž@°ž@©ž@¢ž@›ž@”ž@ž@†ž@ž@xž@qž@jž@cž@\ž@Už@Nž@Gž@@ž@9ž@2ž@+ž@$ž@ž@ž@ž@ž@ž@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þœ@÷œ@ðœ@éœ@âœ@Ûœ@Ôœ@Íœ@Æœ@¿œ@¸œ@±œ@ªœ@£œ@œœ@•œ@Žœ@‡œ@€œ@yœ@rœ@kœ@dœ@]œ@Vœ@Oœ@Hœ@Aœ@:œ@3œ@,œ@%œ@œ@œ@œ@ œ@œ@û›@ô›@í›@æ›@ß›@Ø›@Ñ›@Ê›@Û@¼›@µ›@®›@§›@ ›@™›@’›@‹›@„›@}›@v›@o›@h›@a›@Z›@S›@L›@E›@>›@7›@0›@)›@"›@›@›@ ›@›@ÿš@øš@ñš@êš@ãš@Üš@Õš@Κ@Çš@Àš@¹š@²š@«š@¤š@š@–š@š@ˆš@š@zš@sš@lš@eš@^š@Wš@Pš@Iš@Bš@;š@4š@-š@&š@š@š@š@ š@š@ü™@õ™@î™@ç™@à™@Ù™@Ò™@Ë™@Ä™@½™@¶™@¯™@¨™@¡™@š™@“™@Œ™@…™@~™@w™@p™@i™@b™@[™@T™@M™@F™@?™@8™@1™@*™@#™@™@™@™@™@™@ù˜@ò˜@ë˜@ä˜@ݘ@Ö˜@Ϙ@Ș@Á˜@º˜@³˜@¬˜@¥˜@ž˜@—˜@˜@‰˜@‚˜@{˜@t˜@m˜@f˜@_˜@X˜@Q˜@J˜@C˜@<˜@5˜@.˜@'˜@ ˜@˜@˜@ ˜@˜@ý—@ö—@ï—@è—@á—@Ú—@Ó—@Ì—@Å—@¾—@·—@°—@©—@¢—@›—@”—@—@†—@—@x—@q—@j—@c—@\—@U—@N—@G—@@—@9—@2—@+—@$—@—@—@—@—@—@ú–@ó–@ì–@å–@Þ–@×–@Ж@É–@–@»–@´–@­–@¦–@Ÿ–@˜–@‘–@Š–@ƒ–@|–@u–@n–@g–@`–@Y–@R–@K–@D–@=–@6–@/–@(–@!–@–@–@ –@–@þ•@÷•@ð•@é•@â•@Û•@Ô•@Í•@Æ•@¿•@¸•@±•@ª•@£•@œ•@••@Ž•@‡•@€•@y•@r•@k•@d•@]•@V•@O•@H•@A•@:•@3•@,•@%•@•@•@•@ •@•@û”@ô”@í”@æ”@ß”@Ø”@Ñ”@Ê”@Ô@¼”@µ”@®”@§”@ ”@™”@’”@‹”@„”@}”@v”@o”@h”@a”@Z”@S”@L”@E”@>”@7”@0”@)”@"”@”@”@ ”@”@ÿ“@ø“@ñ“@ê“@ã“@Ü“@Õ“@Γ@Ç“@À“@¹“@²“@«“@¤“@“@–“@“@ˆ“@“@z“@s“@l“@e“@^“@W“@P“@I“@B“@;“@4“@-“@&“@“@“@“@ “@“@ü’@õ’@î’@ç’@à’@Ù’@Ò’@Ë’@Ä’@½’@¶’@¯’@¨’@¡’@š’@“’@Œ’@…’@~’@w’@p’@i’@b’@[’@T’@M’@F’@?’@8’@1’@*’@#’@’@’@’@’@’@ù‘@ò‘@ë‘@ä‘@Ý‘@Ö‘@Ï‘@È‘@Á‘@º‘@³‘@¬‘@¥‘@ž‘@—‘@‘@‰‘@‚‘@{‘@t‘@m‘@f‘@_‘@X‘@Q‘@J‘@C‘@<‘@5‘@.‘@'‘@ ‘@‘@‘@ ‘@‘@ý@ö@ï@è@á@Ú@Ó@Ì@Å@¾@·@°@©@¢@›@”@@†@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þŽ@÷Ž@ðŽ@éŽ@âŽ@ÛŽ@ÔŽ@ÍŽ@ÆŽ@¿Ž@¸Ž@±Ž@ªŽ@£Ž@œŽ@•Ž@ŽŽ@‡Ž@€Ž@yŽ@rŽ@kŽ@dŽ@]Ž@VŽ@OŽ@HŽ@AŽ@:Ž@3Ž@,Ž@%Ž@Ž@Ž@Ž@ Ž@Ž@û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿŒ@øŒ@ñŒ@êŒ@ãŒ@ÜŒ@ÕŒ@ÎŒ@ÇŒ@ÀŒ@¹Œ@²Œ@«Œ@¤Œ@Œ@–Œ@Œ@ˆŒ@Œ@zŒ@sŒ@lŒ@eŒ@^Œ@WŒ@PŒ@IŒ@BŒ@;Œ@4Œ@-Œ@&Œ@Œ@Œ@Œ@ Œ@Œ@ü‹@õ‹@î‹@ç‹@à‹@Ù‹@Ò‹@Ë‹@Ä‹@½‹@¶‹@¯‹@¨‹@¡‹@š‹@“‹@Œ‹@…‹@~‹@w‹@p‹@i‹@b‹@[‹@T‹@M‹@F‹@?‹@8‹@1‹@*‹@#‹@‹@‹@‹@‹@‹@ùŠ@òŠ@ëŠ@äŠ@ÝŠ@ÖŠ@ÏŠ@ÈŠ@ÁŠ@ºŠ@³Š@¬Š@¥Š@žŠ@—Š@Š@‰Š@‚Š@{Š@tŠ@mŠ@fŠ@_Š@XŠ@QŠ@JŠ@CŠ@<Š@5Š@.Š@'Š@ Š@Š@Š@ Š@Š@ý‰@ö‰@ï‰@è‰@á‰@Ú‰@Ó‰@̉@ʼn@¾‰@·‰@°‰@©‰@¢‰@›‰@”‰@‰@†‰@‰@x‰@q‰@j‰@c‰@\‰@U‰@N‰@G‰@@‰@9‰@2‰@+‰@$‰@‰@‰@‰@‰@‰@úˆ@óˆ@ìˆ@åˆ@Þˆ@׈@Ј@Ɉ@ˆ@»ˆ@´ˆ@­ˆ@¦ˆ@Ÿˆ@˜ˆ@‘ˆ@Šˆ@ƒˆ@|ˆ@uˆ@nˆ@gˆ@`ˆ@Yˆ@Rˆ@Kˆ@Dˆ@=ˆ@6ˆ@/ˆ@(ˆ@!ˆ@ˆ@ˆ@ ˆ@ˆ@þ‡@÷‡@ð‡@é‡@â‡@Û‡@Ô‡@͇@Ƈ@¿‡@¸‡@±‡@ª‡@£‡@œ‡@•‡@އ@‡‡@€‡@y‡@r‡@k‡@d‡@]‡@V‡@O‡@H‡@A‡@:‡@3‡@,‡@%‡@‡@‡@‡@ ‡@‡@û†@ô†@í†@æ†@߆@؆@ц@ʆ@Æ@¼†@µ†@®†@§†@ †@™†@’†@‹†@„†@}†@v†@o†@h†@a†@Z†@S†@L†@E†@>†@7†@0†@)†@"†@†@†@ †@†@ÿ…@ø…@ñ…@ê…@ã…@Ü…@Õ…@Î…@Ç…@À…@¹…@²…@«…@¤…@…@–…@…@ˆ…@…@z…@s…@l…@e…@^…@W…@P…@I…@B…@;…@4…@-…@&…@…@…@…@ …@…@ü„@õ„@î„@ç„@à„@Ù„@Ò„@Ë„@Ä„@½„@¶„@¯„@¨„@¡„@š„@“„@Œ„@…„@~„@w„@p„@i„@b„@[„@T„@M„@F„@?„@8„@1„@*„@#„@„@„@„@„@„@ùƒ@òƒ@ëƒ@äƒ@݃@Öƒ@σ@ȃ@Áƒ@ºƒ@³ƒ@¬ƒ@¥ƒ@žƒ@—ƒ@ƒ@‰ƒ@‚ƒ@{ƒ@tƒ@mƒ@fƒ@_ƒ@Xƒ@Qƒ@Jƒ@Cƒ@<ƒ@5ƒ@.ƒ@'ƒ@ ƒ@ƒ@ƒ@ ƒ@ƒ@ý‚@ö‚@ï‚@è‚@á‚@Ú‚@Ó‚@Ì‚@Å‚@¾‚@·‚@°‚@©‚@¢‚@›‚@”‚@‚@†‚@‚@x‚@q‚@j‚@c‚@\‚@U‚@N‚@G‚@@‚@9‚@2‚@+‚@$‚@‚@‚@‚@‚@‚@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þ€@÷€@ð€@é€@â€@Û€@Ô€@Í€@Æ€@¿€@¸€@±€@ª€@£€@œ€@•€@Ž€@‡€@€€@y€@r€@k€@d€@]€@V€@O€@H€@A€@:€@3€@,€@%€@€@€@€@ €@€@û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿ~@ø~@ñ~@ê~@ã~@Ü~@Õ~@Î~@Ç~@À~@¹~@²~@«~@¤~@~@–~@~@ˆ~@~@z~@s~@l~@e~@^~@W~@P~@I~@B~@;~@4~@-~@&~@~@~@~@ ~@~@ü}@õ}@î}@ç}@à}@Ù}@Ò}@Ë}@Ä}@½}@¶}@¯}@¨}@¡}@š}@“}@Œ}@…}@~}@w}@p}@i}@b}@[}@T}@M}@F}@?}@8}@1}@*}@#}@}@}@}@}@}@ù|@ò|@ë|@ä|@Ý|@Ö|@Ï|@È|@Á|@º|@³|@¬|@¥|@ž|@—|@|@‰|@‚|@{|@t|@m|@f|@_|@X|@Q|@J|@C|@<|@5|@.|@'|@ |@|@|@ |@|@ý{@ö{@ï{@è{@á{@Ú{@Ó{@Ì{@Å{@¾{@·{@°{@©{@¢{@›{@”{@{@†{@{@x{@q{@j{@c{@\{@U{@N{@G{@@{@9{@2{@+{@${@{@{@{@{@{@úz@óz@ìz@åz@Þz@×z@Ðz@Éz@Âz@»z@´z@­z@¦z@Ÿz@˜z@‘z@Šz@ƒz@|z@uz@nz@gz@`z@Yz@Rz@Kz@Dz@=z@6z@/z@(z@!z@z@z@ z@z@þy@÷y@ðy@éy@ây@Ûy@Ôy@Íy@Æy@¿y@¸y@±y@ªy@£y@œy@•y@Žy@‡y@€y@yy@ry@ky@dy@]y@Vy@Oy@Hy@Ay@:y@3y@,y@%y@y@y@y@ y@y@ûx@ôx@íx@æx@ßx@Øx@Ñx@Êx@Ãx@¼x@µx@®x@§x@ x@™x@’x@‹x@„x@}x@vx@ox@hx@ax@Zx@Sx@Lx@Ex@>x@7x@0x@)x@"x@x@x@ x@x@ÿw@øw@ñw@êw@ãw@Üw@Õw@Îw@Çw@Àw@¹w@²w@«w@¤w@w@–w@w@ˆw@w@zw@sw@lw@ew@^w@Ww@Pw@Iw@Bw@;w@4w@-w@&w@w@w@w@ w@w@üv@õv@îv@çv@àv@Ùv@Òv@Ëv@Äv@½v@¶v@¯v@¨v@¡v@šv@“v@Œv@…v@~v@wv@pv@iv@bv@[v@Tv@Mv@Fv@?v@8v@1v@*v@#v@v@v@v@v@v@ùu@òu@ëu@äu@Ýu@Öu@Ïu@Èu@Áu@ºu@³u@¬u@¥u@žu@—u@u@‰u@‚u@{u@tu@mu@fu@_u@Xu@Qu@Ju@Cu@q@7q@0q@)q@"q@q@q@ q@q@ÿp@øp@ñp@êp@ãp@Üp@Õp@Îp@Çp@Àp@¹p@²p@«p@¤p@p@–p@p@ˆp@p@zp@sp@lp@ep@^p@Wp@Pp@Ip@Bp@;p@4p@-p@&p@p@p@p@ p@p@üo@õo@îo@ço@ào@Ùo@Òo@Ëo@Äo@½o@¶o@¯o@¨o@¡o@šo@“o@Œo@…o@~o@wo@po@io@bo@[o@To@Mo@Fo@?o@8o@1o@*o@#o@o@o@o@o@o@ùn@òn@ën@än@Ýn@Ön@Ïn@Èn@Án@ºn@³n@¬n@¥n@žn@—n@n@‰n@‚n@{n@tn@mn@fn@_n@Xn@Qn@Jn@Cn@j@7j@0j@)j@"j@j@j@ j@j@ÿi@øi@ñi@êi@ãi@Üi@Õi@Îi@Çi@Ài@¹i@²i@«i@¤i@i@–i@i@ˆi@i@zi@si@li@ei@^i@Wi@Pi@Ii@Bi@;i@4i@-i@&i@i@i@i@ i@i@üh@õh@îh@çh@àh@Ùh@Òh@Ëh@Äh@½h@¶h@¯h@¨h@¡h@šh@“h@Œh@…h@~h@wh@ph@ih@bh@[h@Th@Mh@Fh@?h@8h@1h@*h@#h@h@h@h@h@h@ùg@òg@ëg@äg@Ýg@Ög@Ïg@Èg@Ág@ºg@³g@¬g@¥g@žg@—g@g@‰g@‚g@{g@tg@mg@fg@_g@Xg@Qg@Jg@Cg@c@7c@0c@)c@"c@c@c@ c@c@ÿb@øb@ñb@êb@ãb@Üb@Õb@Îb@Çb@Àb@¹b@²b@«b@¤b@b@–b@b@ˆb@b@zb@sb@lb@eb@^b@Wb@Pb@Ib@Bb@;b@4b@-b@&b@b@b@b@ b@b@üa@õa@îa@ça@àa@Ùa@Òa@Ëa@Äa@½a@¶a@¯a@¨a@¡a@ša@“a@Œa@…a@~a@wa@pa@ia@ba@[a@Ta@Ma@Fa@?a@8a@1a@*a@#a@a@a@a@a@a@ù`@ò`@ë`@ä`@Ý`@Ö`@Ï`@È`@Á`@º`@³`@¬`@¥`@ž`@—`@`@‰`@‚`@{`@t`@m`@f`@_`@X`@Q`@J`@C`@<`@5`@.`@'`@ `@`@`@ `@`@ý_@ö_@ï_@è_@á_@Ú_@Ó_@Ì_@Å_@¾_@·_@°_@©_@¢_@›_@”_@_@†_@_@x_@q_@j_@c_@\_@U_@N_@G_@@_@9_@2_@+_@$_@_@_@_@_@_@ú^@ó^@ì^@å^@Þ^@×^@Ð^@É^@Â^@»^@´^@­^@¦^@Ÿ^@˜^@‘^@Š^@ƒ^@|^@u^@n^@g^@`^@Y^@R^@K^@D^@=^@6^@/^@(^@!^@^@^@ ^@^@þ]@÷]@ð]@é]@â]@Û]@Ô]@Í]@Æ]@¿]@¸]@±]@ª]@£]@œ]@•]@Ž]@‡]@€]@y]@r]@k]@d]@]]@V]@O]@H]@A]@:]@3]@,]@%]@]@]@]@ ]@]@û\@ô\@í\@æ\@ß\@Ø\@Ñ\@Ê\@Ã\@¼\@µ\@®\@§\@ \@™\@’\@‹\@„\@}\@v\@o\@h\@a\@Z\@S\@L\@E\@>\@7\@0\@)\@"\@\@\@ \@\@ÿ[@ø[@ñ[@ê[@ã[@Ü[@Õ[@Î[@Ç[@À[@¹[@²[@«[@¤[@[@–[@[@ˆ[@[@z[@s[@l[@e[@^[@W[@P[@I[@B[@;[@4[@-[@&[@[@[@[@ [@[@üZ@õZ@îZ@çZ@àZ@ÙZ@ÒZ@ËZ@ÄZ@½Z@¶Z@¯Z@¨Z@¡Z@šZ@“Z@ŒZ@…Z@~Z@wZ@pZ@iZ@bZ@[Z@TZ@MZ@FZ@?Z@8Z@1Z@*Z@#Z@Z@Z@Z@Z@Z@ùY@òY@ëY@äY@ÝY@ÖY@ÏY@ÈY@ÁY@ºY@³Y@¬Y@¥Y@žY@—Y@Y@‰Y@‚Y@{Y@tY@mY@fY@_Y@XY@QY@JY@CY@U@7U@0U@)U@"U@U@U@ U@U@ÿT@øT@ñT@êT@ãT@ÜT@ÕT@ÎT@ÇT@ÀT@¹T@²T@«T@¤T@T@–T@T@ˆT@T@zT@sT@lT@eT@^T@WT@PT@IT@BT@;T@4T@-T@&T@T@T@T@ T@T@üS@õS@îS@çS@àS@ÙS@ÒS@ËS@ÄS@½S@¶S@¯S@¨S@¡S@šS@“S@ŒS@…S@~S@wS@pS@iS@bS@[S@TS@MS@FS@?S@8S@1S@*S@#S@S@S@S@S@S@ùR@òR@ëR@äR@ÝR@ÖR@ÏR@ÈR@ÁR@ºR@³R@¬R@¥R@žR@—R@R@‰R@‚R@{R@tR@mR@fR@_R@XR@QR@JR@CR@N@7N@0N@)N@"N@N@N@ N@N@ÿM@øM@ñM@êM@ãM@ÜM@ÕM@ÎM@ÇM@ÀM@¹M@²M@«M@¤M@M@–M@M@ˆM@M@zM@sM@lM@eM@^M@WM@PM@IM@BM@;M@4M@-M@&M@M@M@M@ M@M@üL@õL@îL@çL@àL@ÙL@ÒL@ËL@ÄL@½L@¶L@¯L@¨L@¡L@šL@“L@ŒL@…L@~L@wL@pL@iL@bL@[L@TL@ML@FL@?L@8L@1L@*L@#L@L@L@L@L@L@ùK@òK@ëK@äK@ÝK@ÖK@ÏK@ÈK@ÁK@ºK@³K@¬K@¥K@žK@—K@K@‰K@‚K@{K@tK@mK@fK@_K@XK@QK@JK@CK@G@7G@0G@)G@"G@G@G@ G@G@ÿF@øF@ñF@êF@ãF@ÜF@ÕF@ÎF@ÇF@ÀF@¹F@²F@«F@¤F@F@–F@F@ˆF@F@zF@sF@lF@eF@^F@WF@PF@IF@BF@;F@4F@-F@&F@F@F@F@ F@F@üE@õE@îE@çE@àE@ÙE@ÒE@ËE@ÄE@½E@¶E@¯E@¨E@¡E@šE@“E@ŒE@…E@~E@wE@pE@iE@bE@[E@TE@ME@FE@?E@8E@1E@*E@#E@E@E@E@E@E@ùD@òD@ëD@äD@ÝD@ÖD@ÏD@ÈD@ÁD@ºD@³D@¬D@¥D@žD@—D@D@‰D@‚D@{D@tD@mD@fD@_D@XD@QD@JD@CD@@@7@@0@@)@@"@@@@@@ @@@@ÿ?@ø?@ñ?@ê?@ã?@Ü?@Õ?@Î?@Ç?@À?@¹?@²?@«?@¤?@?@–?@?@ˆ?@?@z?@s?@l?@e?@^?@W?@P?@I?@B?@;?@4?@-?@&?@?@?@?@ ?@?@ü>@õ>@î>@ç>@à>@Ù>@Ò>@Ë>@Ä>@½>@¶>@¯>@¨>@¡>@š>@“>@Œ>@…>@~>@w>@p>@i>@b>@[>@T>@M>@F>@?>@8>@1>@*>@#>@>@>@>@>@>@ù=@ò=@ë=@ä=@Ý=@Ö=@Ï=@È=@Á=@º=@³=@¬=@¥=@ž=@—=@=@‰=@‚=@{=@t=@m=@f=@_=@X=@Q=@J=@C=@<=@5=@.=@'=@ =@=@=@ =@=@ý<@ö<@ï<@è<@á<@Ú<@Ó<@Ì<@Å<@¾<@·<@°<@©<@¢<@›<@”<@<@†<@<@x<@q<@j<@c<@\<@U<@N<@G<@@<@9<@2<@+<@$<@<@<@<@<@<@ú;@ó;@ì;@å;@Þ;@×;@Ð;@É;@Â;@»;@´;@­;@¦;@Ÿ;@˜;@‘;@Š;@ƒ;@|;@u;@n;@g;@`;@Y;@R;@K;@D;@=;@6;@/;@(;@!;@;@;@ ;@;@þ:@÷:@ð:@é:@â:@Û:@Ô:@Í:@Æ:@¿:@¸:@±:@ª:@£:@œ:@•:@Ž:@‡:@€:@y:@r:@k:@d:@]:@V:@O:@H:@A:@::@3:@,:@%:@:@:@:@ :@:@û9@ô9@í9@æ9@ß9@Ø9@Ñ9@Ê9@Ã9@¼9@µ9@®9@§9@ 9@™9@’9@‹9@„9@}9@v9@o9@h9@a9@Z9@S9@L9@E9@>9@79@09@)9@"9@9@9@ 9@9@ÿ8@ø8@ñ8@ê8@ã8@Ü8@Õ8@Î8@Ç8@À8@¹8@²8@«8@¤8@8@–8@8@ˆ8@8@z8@s8@l8@e8@^8@W8@P8@I8@B8@;8@48@-8@&8@8@8@8@ 8@8@ü7@õ7@î7@ç7@à7@Ù7@Ò7@Ë7@Ä7@½7@¶7@¯7@¨7@¡7@š7@“7@Œ7@…7@~7@w7@p7@i7@b7@[7@T7@M7@F7@?7@87@17@*7@#7@7@7@7@7@7@ù6@ò6@ë6@ä6@Ý6@Ö6@Ï6@È6@Á6@º6@³6@¬6@¥6@ž6@—6@6@‰6@‚6@{6@t6@m6@f6@_6@X6@Q6@J6@C6@<6@56@.6@'6@ 6@6@6@ 6@6@ý5@ö5@ï5@è5@á5@Ú5@Ó5@Ì5@Å5@¾5@·5@°5@©5@¢5@›5@”5@5@†5@5@x5@q5@j5@c5@\5@U5@N5@G5@@5@95@25@+5@$5@5@5@5@5@5@ú4@ó4@ì4@å4@Þ4@×4@Ð4@É4@Â4@»4@´4@­4@¦4@Ÿ4@˜4@‘4@Š4@ƒ4@|4@u4@n4@g4@`4@Y4@R4@K4@D4@=4@64@/4@(4@!4@4@4@ 4@4@þ3@÷3@ð3@é3@â3@Û3@Ô3@Í3@Æ3@¿3@¸3@±3@ª3@£3@œ3@•3@Ž3@‡3@€3@y3@r3@k3@d3@]3@V3@O3@H3@A3@:3@33@,3@%3@3@3@3@ 3@3@û2@ô2@í2@æ2@ß2@Ø2@Ñ2@Ê2@Ã2@¼2@µ2@®2@§2@ 2@™2@’2@‹2@„2@}2@v2@o2@h2@a2@Z2@S2@L2@E2@>2@72@02@)2@"2@2@2@ 2@2@ÿ1@ø1@ñ1@ê1@ã1@Ü1@Õ1@Î1@Ç1@À1@¹1@²1@«1@¤1@1@–1@1@ˆ1@1@z1@s1@l1@e1@^1@W1@P1@I1@B1@;1@41@-1@&1@1@1@1@ 1@1@ü0@õ0@î0@ç0@à0@Ù0@Ò0@Ë0@Ä0@½0@¶0@¯0@¨0@¡0@š0@“0@Œ0@…0@~0@w0@p0@i0@b0@[0@T0@M0@F0@?0@80@10@*0@#0@0@0@0@0@0@ù/@ò/@ë/@ä/@Ý/@Ö/@Ï/@È/@Á/@º/@³/@¬/@¥/@ž/@—/@/@‰/@‚/@{/@t/@m/@f/@_/@X/@Q/@J/@C/@+@7+@0+@)+@"+@+@+@ +@+@ÿ*@ø*@ñ*@ê*@ã*@Ü*@Õ*@Î*@Ç*@À*@¹*@²*@«*@¤*@*@–*@*@ˆ*@*@z*@s*@l*@e*@^*@W*@P*@I*@B*@;*@4*@-*@&*@*@*@*@ *@*@ü)@õ)@î)@ç)@à)@Ù)@Ò)@Ë)@Ä)@½)@¶)@¯)@¨)@¡)@š)@“)@Œ)@…)@~)@w)@p)@i)@b)@[)@T)@M)@F)@?)@8)@1)@*)@#)@)@)@)@)@)@ù(@ò(@ë(@ä(@Ý(@Ö(@Ï(@È(@Á(@º(@³(@¬(@¥(@ž(@—(@(@‰(@‚(@{(@t(@m(@f(@_(@X(@Q(@J(@C(@<(@5(@.(@'(@ (@(@(@ (@(@ý'@ö'@ï'@è'@á'@Ú'@Ó'@Ì'@Å'@¾'@·'@°'@©'@¢'@›'@”'@'@†'@'@x'@q'@j'@c'@\'@U'@N'@G'@@'@9'@2'@+'@$'@'@'@'@'@'@ú&@ó&@ì&@å&@Þ&@×&@Ð&@É&@Â&@»&@´&@­&@¦&@Ÿ&@˜&@‘&@Š&@ƒ&@|&@u&@n&@g&@`&@Y&@R&@K&@D&@=&@6&@/&@(&@!&@&@&@ &@&@þ%@÷%@ð%@é%@â%@Û%@Ô%@Í%@Æ%@¿%@¸%@±%@ª%@£%@œ%@•%@Ž%@‡%@€%@y%@r%@k%@d%@]%@V%@O%@H%@A%@:%@3%@,%@%%@%@%@%@ %@%@û$@ô$@í$@æ$@ß$@Ø$@Ñ$@Ê$@Ã$@¼$@µ$@®$@§$@ $@™$@’$@‹$@„$@}$@v$@o$@h$@a$@Z$@S$@L$@E$@>$@7$@0$@)$@"$@$@$@ $@$@ÿ#@ø#@ñ#@ê#@ã#@Ü#@Õ#@Î#@Ç#@À#@¹#@²#@«#@¤#@#@–#@#@ˆ#@#@z#@s#@l#@e#@^#@W#@P#@I#@B#@;#@4#@-#@&#@#@#@#@ #@#@ü"@õ"@î"@ç"@à"@Ù"@Ò"@Ë"@Ä"@½"@¶"@¯"@¨"@¡"@š"@“"@Œ"@…"@~"@w"@p"@i"@b"@["@T"@M"@F"@?"@8"@1"@*"@#"@"@"@"@"@"@ù!@ò!@ë!@ä!@Ý!@Ö!@Ï!@È!@Á!@º!@³!@¬!@¥!@ž!@—!@!@‰!@‚!@{!@t!@m!@f!@_!@X!@Q!@J!@C!@@7@0@)@"@@@ @@ÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý@ö@ï@è@á@Ú@Ó@Ì@Å@¾@·@°@©@¢@›@”@@†@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þ@÷@ð@é@â@Û@Ô@Í@Æ@¿@¸@±@ª@£@œ@•@Ž@‡@€@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý@ö@ï@è@á@Ú@Ó@Ì@Å@¾@·@°@©@¢@›@”@@†@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þ@÷@ð@é@â@Û@Ô@Í@Æ@¿@¸@±@ª@£@œ@•@Ž@‡@€@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü @õ @î @ç @à @Ù @Ò @Ë @Ä @½ @¶ @¯ @¨ @¡ @š @“ @Œ @… @~ @w @p @i @b @[ @T @M @F @? @8 @1 @* @# @ @ @ @ @ @ù @ò @ë @ä @Ý @Ö @Ï @È @Á @º @³ @¬ @¥ @ž @— @ @‰ @‚ @{ @t @m @f @_ @X @Q @J @C @< @5 @. @' @ @ @ @ @ @ý @ö @ï @è @á @Ú @Ó @Ì @Å @¾ @· @° @© @¢ @› @” @ @† @ @x @q @j @c @\ @U @N @G @@ @9 @2 @+ @$ @ @ @ @ @ @ú @ó @ì @å @Þ @× @Ð @É @ @» @´ @­ @¦ @Ÿ @˜ @‘ @Š @ƒ @| @u @n @g @` @Y @R @K @D @= @6 @/ @( @! @ @ @ @ @þ @÷ @ð @é @â @Û @Ô @Í @Æ @¿ @¸ @± @ª @£ @œ @• @Ž @‡ @€ @y @r @k @d @] @V @O @H @A @: @3 @, @% @ @ @ @ @ @û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý@ö@ï@è@á@Ú@Ó@Ì@Å@¾@·@°@©@¢@›@”@@†@@x@q@j@c@\@U@N@G@@@9@2@+@$@@@@@@ú@ó@ì@å@Þ@×@Ð@É@Â@»@´@­@¦@Ÿ@˜@‘@Š@ƒ@|@u@n@g@`@Y@R@K@D@=@6@/@(@!@@@ @@þ@÷@ð@é@â@Û@Ô@Í@Æ@¿@¸@±@ª@£@œ@•@Ž@‡@€@y@r@k@d@]@V@O@H@A@:@3@,@%@@@@ @@û@ô@í@æ@ß@Ø@Ñ@Ê@Ã@¼@µ@®@§@ @™@’@‹@„@}@v@o@h@a@Z@S@L@E@>@7@0@)@"@@@ @@ÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@üÿ?õÿ?îÿ?çÿ?àÿ?Ùÿ?Òÿ?Ëÿ?Äÿ?½ÿ?¶ÿ?¯ÿ?¨ÿ?¡ÿ?šÿ?“ÿ?Œÿ?…ÿ?~ÿ?wÿ?pÿ?iÿ?bÿ?[ÿ?Tÿ?Mÿ?Fÿ??ÿ?8ÿ?1ÿ?*ÿ?#ÿ?ÿ?ÿ?ÿ?ÿ?ÿ?ùþ?òþ?ëþ?äþ?Ýþ?Öþ?Ïþ?Èþ?Áþ?ºþ?³þ?¬þ?¥þ?žþ?—þ?þ?‰þ?‚þ?{þ?tþ?mþ?fþ?_þ?Xþ?Qþ?Jþ?Cþ?<þ?5þ?.þ?'þ? þ?þ?þ? þ?þ?ýý?öý?ïý?èý?áý?Úý?Óý?Ìý?Åý?¾ý?·ý?°ý?©ý?¢ý?›ý?”ý?ý?†ý?ý?xý?qý?jý?cý?\ý?Uý?Ný?Gý?@ý?9ý?2ý?+ý?$ý?ý?ý?ý?ý?ý?úü?óü?ìü?åü?Þü?×ü?Ðü?Éü?Âü?»ü?´ü?­ü?¦ü?Ÿü?˜ü?‘ü?Šü?ƒü?|ü?uü?nü?gü?`ü?Yü?Rü?Kü?Dü?=ü?6ü?/ü?(ü?!ü?ü?ü? ü?ü?þû?÷û?ðû?éû?âû?Ûû?Ôû?Íû?Æû?¿û?¸û?±û?ªû?£û?œû?•û?Žû?‡û?€û?yû?rû?kû?dû?]û?Vû?Oû?Hû?Aû?:û?3û?,û?%û?û?û?û? û?û?ûú?ôú?íú?æú?ßú?Øú?Ñú?Êú?Ãú?¼ú?µú?®ú?§ú? ú?™ú?’ú?‹ú?„ú?}ú?vú?oú?hú?aú?Zú?Sú?Lú?Eú?>ú?7ú?0ú?)ú?"ú?ú?ú? ú?ú?ÿù?øù?ñù?êù?ãù?Üù?Õù?Îù?Çù?Àù?¹ù?²ù?«ù?¤ù?ù?–ù?ù?ˆù?ù?zù?sù?lù?eù?^ù?Wù?Pù?Iù?Bù?;ù?4ù?-ù?&ù?ù?ù?ù? ù?ù?üø?õø?îø?çø?àø?Ùø?Òø?Ëø?Äø?½ø?¶ø?¯ø?¨ø?¡ø?šø?“ø?Œø?…ø?~ø?wø?pø?iø?bø?[ø?Tø?Mø?Fø??ø?8ø?1ø?*ø?#ø?ø?ø?ø?ø?ø?ù÷?ò÷?ë÷?ä÷?Ý÷?Ö÷?Ï÷?È÷?Á÷?º÷?³÷?¬÷?¥÷?ž÷?—÷?÷?‰÷?‚÷?{÷?t÷?m÷?f÷?_÷?X÷?Q÷?J÷?C÷?<÷?5÷?.÷?'÷? ÷?÷?÷? ÷?÷?ýö?öö?ïö?èö?áö?Úö?Óö?Ìö?Åö?¾ö?·ö?°ö?©ö?¢ö?›ö?”ö?ö?†ö?ö?xö?qö?jö?cö?\ö?Uö?Nö?Gö?@ö?9ö?2ö?+ö?$ö?ö?ö?ö?ö?ö?úõ?óõ?ìõ?åõ?Þõ?×õ?Ðõ?Éõ?Âõ?»õ?´õ?­õ?¦õ?Ÿõ?˜õ?‘õ?Šõ?ƒõ?|õ?uõ?nõ?gõ?`õ?Yõ?Rõ?Kõ?Dõ?=õ?6õ?/õ?(õ?!õ?õ?õ? õ?õ?þô?÷ô?ðô?éô?âô?Ûô?Ôô?Íô?Æô?¿ô?¸ô?±ô?ªô?£ô?œô?•ô?Žô?‡ô?€ô?yô?rô?kô?dô?]ô?Vô?Oô?Hô?Aô?:ô?3ô?,ô?%ô?ô?ô?ô? ô?ô?ûó?ôó?íó?æó?ßó?Øó?Ñó?Êó?Ãó?¼ó?µó?®ó?§ó? ó?™ó?’ó?‹ó?„ó?}ó?vó?oó?hó?aó?Zó?Só?Ló?Eó?>ó?7ó?0ó?)ó?"ó?ó?ó? ó?ó?ÿò?øò?ñò?êò?ãò?Üò?Õò?Îò?Çò?Àò?¹ò?²ò?«ò?¤ò?ò?–ò?ò?ˆò?ò?zò?sò?lò?eò?^ò?Wò?Pò?Iò?Bò?;ò?4ò?-ò?&ò?ò?ò?ò? ò?ò?üñ?õñ?îñ?çñ?àñ?Ùñ?Òñ?Ëñ?Äñ?½ñ?¶ñ?¯ñ?¨ñ?¡ñ?šñ?“ñ?Œñ?…ñ?~ñ?wñ?pñ?iñ?bñ?[ñ?Tñ?Mñ?Fñ??ñ?8ñ?1ñ?*ñ?#ñ?ñ?ñ?ñ?ñ?ñ?ùð?òð?ëð?äð?Ýð?Öð?Ïð?Èð?Áð?ºð?³ð?¬ð?¥ð?žð?—ð?ð?‰ð?‚ð?{ð?tð?mð?fð?_ð?Xð?Qð?Jð?Cð?<ð?5ð?.ð?'ð? ð?ð?ð? ð?ð?ýï?öï?ïï?èï?áï?Úï?Óï?Ìï?Åï?¾ï?·ï?°ï?©ï?¢ï?›ï?”ï?ï?†ï?ï?xï?qï?jï?cï?\ï?Uï?Nï?Gï?@ï?9ï?2ï?+ï?$ï?ï?ï?ï?ï?ï?úî?óî?ìî?åî?Þî?×î?Ðî?Éî?Âî?»î?´î?­î?¦î?Ÿî?˜î?‘î?Šî?ƒî?|î?uî?nî?gî?`î?Yî?Rî?Kî?Dî?=î?6î?/î?(î?!î?î?î? î?î?þí?÷í?ðí?éí?âí?Ûí?Ôí?Íí?Æí?¿í?¸í?±í?ªí?£í?œí?•í?Ží?‡í?€í?yí?rí?kí?dí?]í?Ví?Oí?Hí?Aí?:í?3í?,í?%í?í?í?í? í?í?ûì?ôì?íì?æì?ßì?Øì?Ñì?Êì?Ãì?¼ì?µì?®ì?§ì? ì?™ì?’ì?‹ì?„ì?}ì?vì?oì?hì?aì?Zì?Sì?Lì?Eì?>ì?7ì?0ì?)ì?"ì?ì?ì? ì?ì?ÿë?øë?ñë?êë?ãë?Üë?Õë?Îë?Çë?Àë?¹ë?²ë?«ë?¤ë?ë?–ë?ë?ˆë?ë?zë?së?lë?eë?^ë?Wë?Pë?Ië?Bë?;ë?4ë?-ë?&ë?ë?ë?ë? ë?ë?üê?õê?îê?çê?àê?Ùê?Òê?Ëê?Äê?½ê?¶ê?¯ê?¨ê?¡ê?šê?“ê?Œê?…ê?~ê?wê?pê?iê?bê?[ê?Tê?Mê?Fê??ê?8ê?1ê?*ê?#ê?ê?ê?ê?ê?ê?ùé?òé?ëé?äé?Ýé?Öé?Ïé?Èé?Áé?ºé?³é?¬é?¥é?žé?—é?é?‰é?‚é?{é?té?mé?fé?_é?Xé?Qé?Jé?Cé?<é?5é?.é?'é? é?é?é? é?é?ýè?öè?ïè?èè?áè?Úè?Óè?Ìè?Åè?¾è?·è?°è?©è?¢è?›è?”è?è?†è?è?xè?qè?jè?cè?\è?Uè?Nè?Gè?@è?9è?2è?+è?$è?è?è?è?è?è?úç?óç?ìç?åç?Þç?×ç?Ðç?Éç?Âç?»ç?´ç?­ç?¦ç?Ÿç?˜ç?‘ç?Šç?ƒç?|ç?uç?nç?gç?`ç?Yç?Rç?Kç?Dç?=ç?6ç?/ç?(ç?!ç?ç?ç? ç?ç?þæ?÷æ?ðæ?éæ?âæ?Ûæ?Ôæ?Íæ?Ææ?¿æ?¸æ?±æ?ªæ?£æ?œæ?•æ?Žæ?‡æ?€æ?yæ?ræ?kæ?dæ?]æ?Væ?Oæ?Hæ?Aæ?:æ?3æ?,æ?%æ?æ?æ?æ? æ?æ?ûå?ôå?íå?æå?ßå?Øå?Ñå?Êå?Ãå?¼å?µå?®å?§å? å?™å?’å?‹å?„å?}å?vå?oå?hå?aå?Zå?Så?Lå?Eå?>å?7å?0å?)å?"å?å?å? å?å?ÿä?øä?ñä?êä?ãä?Üä?Õä?Îä?Çä?Àä?¹ä?²ä?«ä?¤ä?ä?–ä?ä?ˆä?ä?zä?sä?lä?eä?^ä?Wä?Pä?Iä?Bä?;ä?4ä?-ä?&ä?ä?ä?ä? ä?ä?üã?õã?îã?çã?àã?Ùã?Òã?Ëã?Äã?½ã?¶ã?¯ã?¨ã?¡ã?šã?“ã?Œã?…ã?~ã?wã?pã?iã?bã?[ã?Tã?Mã?Fã??ã?8ã?1ã?*ã?#ã?ã?ã?ã?ã?ã?ùâ?òâ?ëâ?äâ?Ýâ?Öâ?Ïâ?Èâ?Áâ?ºâ?³â?¬â?¥â?žâ?—â?â?‰â?‚â?{â?tâ?mâ?fâ?_â?Xâ?Qâ?Jâ?Câ?<â?5â?.â?'â? â?â?â? â?â?ýá?öá?ïá?èá?áá?Úá?Óá?Ìá?Åá?¾á?·á?°á?©á?¢á?›á?”á?á?†á?á?xá?qá?já?cá?\á?Uá?Ná?Gá?@á?9á?2á?+á?$á?á?á?á?á?á?úà?óà?ìà?åà?Þà?×à?Ðà?Éà?Âà?»à?´à?­à?¦à?Ÿà?˜à?‘à?Šà?ƒà?|à?uà?nà?gà?`à?Yà?Rà?Kà?Dà?=à?6à?/à?(à?!à?à?à? à?à?þß?÷ß?ðß?éß?âß?Ûß?Ôß?Íß?Æß?¿ß?¸ß?±ß?ªß?£ß?œß?•ß?Žß?‡ß?€ß?yß?rß?kß?dß?]ß?Vß?Oß?Hß?Aß?:ß?3ß?,ß?%ß?ß?ß?ß? ß?ß?ûÞ?ôÞ?íÞ?æÞ?ßÞ?ØÞ?ÑÞ?ÊÞ?ÃÞ?¼Þ?µÞ?®Þ?§Þ? Þ?™Þ?’Þ?‹Þ?„Þ?}Þ?vÞ?oÞ?hÞ?aÞ?ZÞ?SÞ?LÞ?EÞ?>Þ?7Þ?0Þ?)Þ?"Þ?Þ?Þ? Þ?Þ?ÿÝ?øÝ?ñÝ?êÝ?ãÝ?ÜÝ?ÕÝ?ÎÝ?ÇÝ?ÀÝ?¹Ý?²Ý?«Ý?¤Ý?Ý?–Ý?Ý?ˆÝ?Ý?zÝ?sÝ?lÝ?eÝ?^Ý?WÝ?PÝ?IÝ?BÝ?;Ý?4Ý?-Ý?&Ý?Ý?Ý?Ý? Ý?Ý?üÜ?õÜ?îÜ?çÜ?àÜ?ÙÜ?ÒÜ?ËÜ?ÄÜ?½Ü?¶Ü?¯Ü?¨Ü?¡Ü?šÜ?“Ü?ŒÜ?…Ü?~Ü?wÜ?pÜ?iÜ?bÜ?[Ü?TÜ?MÜ?FÜ??Ü?8Ü?1Ü?*Ü?#Ü?Ü?Ü?Ü?Ü?Ü?ùÛ?òÛ?ëÛ?äÛ?ÝÛ?ÖÛ?ÏÛ?ÈÛ?ÁÛ?ºÛ?³Û?¬Û?¥Û?žÛ?—Û?Û?‰Û?‚Û?{Û?tÛ?mÛ?fÛ?_Û?XÛ?QÛ?JÛ?CÛ?<Û?5Û?.Û?'Û? Û?Û?Û? Û?Û?ýÚ?öÚ?ïÚ?èÚ?áÚ?ÚÚ?ÓÚ?ÌÚ?ÅÚ?¾Ú?·Ú?°Ú?©Ú?¢Ú?›Ú?”Ú?Ú?†Ú?Ú?xÚ?qÚ?jÚ?cÚ?\Ú?UÚ?NÚ?GÚ?@Ú?9Ú?2Ú?+Ú?$Ú?Ú?Ú?Ú?Ú?Ú?úÙ?óÙ?ìÙ?åÙ?ÞÙ?×Ù?ÐÙ?ÉÙ?ÂÙ?»Ù?´Ù?­Ù?¦Ù?ŸÙ?˜Ù?‘Ù?ŠÙ?ƒÙ?|Ù?uÙ?nÙ?gÙ?`Ù?YÙ?RÙ?KÙ?DÙ?=Ù?6Ù?/Ù?(Ù?!Ù?Ù?Ù? Ù?Ù?þØ?÷Ø?ðØ?éØ?âØ?ÛØ?ÔØ?ÍØ?ÆØ?¿Ø?¸Ø?±Ø?ªØ?£Ø?œØ?•Ø?ŽØ?‡Ø?€Ø?yØ?rØ?kØ?dØ?]Ø?VØ?OØ?HØ?AØ?:Ø?3Ø?,Ø?%Ø?Ø?Ø?Ø? Ø?Ø?û×?ô×?í×?æ×?ß×?Ø×?Ñ×?Ê×?Ã×?¼×?µ×?®×?§×? ×?™×?’×?‹×?„×?}×?v×?o×?h×?a×?Z×?S×?L×?E×?>×?7×?0×?)×?"×?×?×? ×?×?ÿÖ?øÖ?ñÖ?êÖ?ãÖ?ÜÖ?ÕÖ?ÎÖ?ÇÖ?ÀÖ?¹Ö?²Ö?«Ö?¤Ö?Ö?–Ö?Ö?ˆÖ?Ö?zÖ?sÖ?lÖ?eÖ?^Ö?WÖ?PÖ?IÖ?BÖ?;Ö?4Ö?-Ö?&Ö?Ö?Ö?Ö? Ö?Ö?üÕ?õÕ?îÕ?çÕ?àÕ?ÙÕ?ÒÕ?ËÕ?ÄÕ?½Õ?¶Õ?¯Õ?¨Õ?¡Õ?šÕ?“Õ?ŒÕ?…Õ?~Õ?wÕ?pÕ?iÕ?bÕ?[Õ?TÕ?MÕ?FÕ??Õ?8Õ?1Õ?*Õ?#Õ?Õ?Õ?Õ?Õ?Õ?ùÔ?òÔ?ëÔ?äÔ?ÝÔ?ÖÔ?ÏÔ?ÈÔ?ÁÔ?ºÔ?³Ô?¬Ô?¥Ô?žÔ?—Ô?Ô?‰Ô?‚Ô?{Ô?tÔ?mÔ?fÔ?_Ô?XÔ?QÔ?JÔ?CÔ?<Ô?5Ô?.Ô?'Ô? Ô?Ô?Ô? Ô?Ô?ýÓ?öÓ?ïÓ?èÓ?áÓ?ÚÓ?ÓÓ?ÌÓ?ÅÓ?¾Ó?·Ó?°Ó?©Ó?¢Ó?›Ó?”Ó?Ó?†Ó?Ó?xÓ?qÓ?jÓ?cÓ?\Ó?UÓ?NÓ?GÓ?@Ó?9Ó?2Ó?+Ó?$Ó?Ó?Ó?Ó?Ó?Ó?úÒ?óÒ?ìÒ?åÒ?ÞÒ?×Ò?ÐÒ?ÉÒ?ÂÒ?»Ò?´Ò?­Ò?¦Ò?ŸÒ?˜Ò?‘Ò?ŠÒ?ƒÒ?|Ò?uÒ?nÒ?gÒ?`Ò?YÒ?RÒ?KÒ?DÒ?=Ò?6Ò?/Ò?(Ò?!Ò?Ò?Ò? Ò?Ò?þÑ?÷Ñ?ðÑ?éÑ?âÑ?ÛÑ?ÔÑ?ÍÑ?ÆÑ?¿Ñ?¸Ñ?±Ñ?ªÑ?£Ñ?œÑ?•Ñ?ŽÑ?‡Ñ?€Ñ?yÑ?rÑ?kÑ?dÑ?]Ñ?VÑ?OÑ?HÑ?AÑ?:Ñ?3Ñ?,Ñ?%Ñ?Ñ?Ñ?Ñ? Ñ?Ñ?ûÐ?ôÐ?íÐ?æÐ?ßÐ?ØÐ?ÑÐ?ÊÐ?ÃÐ?¼Ð?µÐ?®Ð?§Ð? Ð?™Ð?’Ð?‹Ð?„Ð?}Ð?vÐ?oÐ?hÐ?aÐ?ZÐ?SÐ?LÐ?EÐ?>Ð?7Ð?0Ð?)Ð?"Ð?Ð?Ð? Ð?Ð?ÿÏ?øÏ?ñÏ?êÏ?ãÏ?ÜÏ?ÕÏ?ÎÏ?ÇÏ?ÀÏ?¹Ï?²Ï?«Ï?¤Ï?Ï?–Ï?Ï?ˆÏ?Ï?zÏ?sÏ?lÏ?eÏ?^Ï?WÏ?PÏ?IÏ?BÏ?;Ï?4Ï?-Ï?&Ï?Ï?Ï?Ï? Ï?Ï?üÎ?õÎ?îÎ?çÎ?àÎ?ÙÎ?ÒÎ?ËÎ?ÄÎ?½Î?¶Î?¯Î?¨Î?¡Î?šÎ?“Î?ŒÎ?…Î?~Î?wÎ?pÎ?iÎ?bÎ?[Î?TÎ?MÎ?FÎ??Î?8Î?1Î?*Î?#Î?Î?Î?Î?Î?Î?ùÍ?òÍ?ëÍ?äÍ?ÝÍ?ÖÍ?ÏÍ?ÈÍ?ÁÍ?ºÍ?³Í?¬Í?¥Í?žÍ?—Í?Í?‰Í?‚Í?{Í?tÍ?mÍ?fÍ?_Í?XÍ?QÍ?JÍ?CÍ?<Í?5Í?.Í?'Í? Í?Í?Í? Í?Í?ýÌ?öÌ?ïÌ?èÌ?áÌ?ÚÌ?ÓÌ?ÌÌ?ÅÌ?¾Ì?·Ì?°Ì?©Ì?¢Ì?›Ì?”Ì?Ì?†Ì?Ì?xÌ?qÌ?jÌ?cÌ?\Ì?UÌ?NÌ?GÌ?@Ì?9Ì?2Ì?+Ì?$Ì?Ì?Ì?Ì?Ì?Ì?úË?óË?ìË?åË?ÞË?×Ë?ÐË?ÉË?ÂË?»Ë?´Ë?­Ë?¦Ë?ŸË?˜Ë?‘Ë?ŠË?ƒË?|Ë?uË?nË?gË?`Ë?YË?RË?KË?DË?=Ë?6Ë?/Ë?(Ë?!Ë?Ë?Ë? Ë?Ë?þÊ?÷Ê?ðÊ?éÊ?âÊ?ÛÊ?ÔÊ?ÍÊ?ÆÊ?¿Ê?¸Ê?±Ê?ªÊ?£Ê?œÊ?•Ê?ŽÊ?‡Ê?€Ê?yÊ?rÊ?kÊ?dÊ?]Ê?VÊ?OÊ?HÊ?AÊ?:Ê?3Ê?,Ê?%Ê?Ê?Ê?Ê? Ê?Ê?ûÉ?ôÉ?íÉ?æÉ?ßÉ?ØÉ?ÑÉ?ÊÉ?ÃÉ?¼É?µÉ?®É?§É? É?™É?’É?‹É?„É?}É?vÉ?oÉ?hÉ?aÉ?ZÉ?SÉ?LÉ?EÉ?>É?7É?0É?)É?"É?É?É? É?É?ÿÈ?øÈ?ñÈ?êÈ?ãÈ?ÜÈ?ÕÈ?ÎÈ?ÇÈ?ÀÈ?¹È?²È?«È?¤È?È?–È?È?ˆÈ?È?zÈ?sÈ?lÈ?eÈ?^È?WÈ?PÈ?IÈ?BÈ?;È?4È?-È?&È?È?È?È? È?È?üÇ?õÇ?îÇ?çÇ?àÇ?ÙÇ?ÒÇ?ËÇ?ÄÇ?½Ç?¶Ç?¯Ç?¨Ç?¡Ç?šÇ?“Ç?ŒÇ?…Ç?~Ç?wÇ?pÇ?iÇ?bÇ?[Ç?TÇ?MÇ?FÇ??Ç?8Ç?1Ç?*Ç?#Ç?Ç?Ç?Ç?Ç?Ç?ùÆ?òÆ?ëÆ?äÆ?ÝÆ?ÖÆ?ÏÆ?ÈÆ?ÁÆ?ºÆ?³Æ?¬Æ?¥Æ?žÆ?—Æ?Æ?‰Æ?‚Æ?{Æ?tÆ?mÆ?fÆ?_Æ?XÆ?QÆ?JÆ?CÆ?<Æ?5Æ?.Æ?'Æ? Æ?Æ?Æ? Æ?Æ?ýÅ?öÅ?ïÅ?èÅ?áÅ?ÚÅ?ÓÅ?ÌÅ?ÅÅ?¾Å?·Å?°Å?©Å?¢Å?›Å?”Å?Å?†Å?Å?xÅ?qÅ?jÅ?cÅ?\Å?UÅ?NÅ?GÅ?@Å?9Å?2Å?+Å?$Å?Å?Å?Å?Å?Å?úÄ?óÄ?ìÄ?åÄ?ÞÄ?×Ä?ÐÄ?ÉÄ?ÂÄ?»Ä?´Ä?­Ä?¦Ä?ŸÄ?˜Ä?‘Ä?ŠÄ?ƒÄ?|Ä?uÄ?nÄ?gÄ?`Ä?YÄ?RÄ?KÄ?DÄ?=Ä?6Ä?/Ä?(Ä?!Ä?Ä?Ä? Ä?Ä?þÃ?÷Ã?ðÃ?éÃ?âÃ?ÛÃ?ÔÃ?ÍÃ?ÆÃ?¿Ã?¸Ã?±Ã?ªÃ?£Ã?œÃ?•Ã?ŽÃ?‡Ã?€Ã?yÃ?rÃ?kÃ?dÃ?]Ã?VÃ?OÃ?HÃ?AÃ?:Ã?3Ã?,Ã?%Ã?Ã?Ã?Ã? Ã?Ã?ûÂ?ôÂ?íÂ?æÂ?ßÂ?ØÂ?ÑÂ?ÊÂ?ÃÂ?¼Â?µÂ?®Â?§Â? Â?™Â?’Â?‹Â?„Â?}Â?vÂ?oÂ?hÂ?aÂ?ZÂ?SÂ?LÂ?EÂ?>Â?7Â?0Â?)Â?"Â?Â?Â? Â?Â?ÿÁ?øÁ?ñÁ?êÁ?ãÁ?ÜÁ?ÕÁ?ÎÁ?ÇÁ?ÀÁ?¹Á?²Á?«Á?¤Á?Á?–Á?Á?ˆÁ?Á?zÁ?sÁ?lÁ?eÁ?^Á?WÁ?PÁ?IÁ?BÁ?;Á?4Á?-Á?&Á?Á?Á?Á? Á?Á?üÀ?õÀ?îÀ?çÀ?àÀ?ÙÀ?ÒÀ?ËÀ?ÄÀ?½À?¶À?¯À?¨À?¡À?šÀ?“À?ŒÀ?…À?~À?wÀ?pÀ?iÀ?bÀ?[À?TÀ?MÀ?FÀ??À?8À?1À?*À?#À?À?À?À?À?À?ù¿?ò¿?ë¿?ä¿?Ý¿?Ö¿?Ï¿?È¿?Á¿?º¿?³¿?¬¿?¥¿?ž¿?—¿?¿?‰¿?‚¿?{¿?t¿?m¿?f¿?_¿?X¿?Q¿?J¿?C¿?<¿?5¿?.¿?'¿? ¿?¿?¿? ¿?¿?ý¾?ö¾?ï¾?è¾?á¾?Ú¾?Ó¾?̾?ž?¾¾?·¾?°¾?©¾?¢¾?›¾?”¾?¾?†¾?¾?x¾?q¾?j¾?c¾?\¾?U¾?N¾?G¾?@¾?9¾?2¾?+¾?$¾?¾?¾?¾?¾?¾?ú½?ó½?ì½?å½?Þ½?×½?н?ɽ?½?»½?´½?­½?¦½?Ÿ½?˜½?‘½?н?ƒ½?|½?u½?n½?g½?`½?Y½?R½?K½?D½?=½?6½?/½?(½?!½?½?½? ½?½?þ¼?÷¼?ð¼?é¼?â¼?Û¼?Ô¼?ͼ?Ƽ?¿¼?¸¼?±¼?ª¼?£¼?œ¼?•¼?޼?‡¼?€¼?y¼?r¼?k¼?d¼?]¼?V¼?O¼?H¼?A¼?:¼?3¼?,¼?%¼?¼?¼?¼? ¼?¼?û»?ô»?í»?æ»?ß»?Ø»?Ñ»?Ê»?û?¼»?µ»?®»?§»? »?™»?’»?‹»?„»?}»?v»?o»?h»?a»?Z»?S»?L»?E»?>»?7»?0»?)»?"»?»?»? »?»?ÿº?øº?ñº?êº?ãº?ܺ?Õº?κ?Ǻ?Àº?¹º?²º?«º?¤º?º?–º?º?ˆº?º?zº?sº?lº?eº?^º?Wº?Pº?Iº?Bº?;º?4º?-º?&º?º?º?º? º?º?ü¹?õ¹?î¹?ç¹?à¹?Ù¹?Ò¹?˹?Ĺ?½¹?¶¹?¯¹?¨¹?¡¹?š¹?“¹?Œ¹?…¹?~¹?w¹?p¹?i¹?b¹?[¹?T¹?M¹?F¹??¹?8¹?1¹?*¹?#¹?¹?¹?¹?¹?¹?ù¸?ò¸?ë¸?ä¸?ݸ?Ö¸?ϸ?ȸ?Á¸?º¸?³¸?¬¸?¥¸?ž¸?—¸?¸?‰¸?‚¸?{¸?t¸?m¸?f¸?_¸?X¸?Q¸?J¸?C¸?<¸?5¸?.¸?'¸? ¸?¸?¸? ¸?¸?ý·?ö·?ï·?è·?á·?Ú·?Ó·?Ì·?Å·?¾·?··?°·?©·?¢·?›·?”·?·?†·?·?x·?q·?j·?c·?\·?U·?N·?G·?@·?9·?2·?+·?$·?·?·?·?·?·?ú¶?ó¶?ì¶?å¶?Þ¶?×¶?ж?ɶ?¶?»¶?´¶?­¶?¦¶?Ÿ¶?˜¶?‘¶?ж?ƒ¶?|¶?u¶?n¶?g¶?`¶?Y¶?R¶?K¶?D¶?=¶?6¶?/¶?(¶?!¶?¶?¶? ¶?¶?þµ?÷µ?ðµ?éµ?âµ?Ûµ?Ôµ?͵?Ƶ?¿µ?¸µ?±µ?ªµ?£µ?œµ?•µ?޵?‡µ?€µ?yµ?rµ?kµ?dµ?]µ?Vµ?Oµ?Hµ?Aµ?:µ?3µ?,µ?%µ?µ?µ?µ? µ?µ?û´?ô´?í´?æ´?ß´?Ø´?Ñ´?Ê´?ô?¼´?µ´?®´?§´? ´?™´?’´?‹´?„´?}´?v´?o´?h´?a´?Z´?S´?L´?E´?>´?7´?0´?)´?"´?´?´? ´?´?ÿ³?ø³?ñ³?ê³?ã³?ܳ?Õ³?γ?dz?À³?¹³?²³?«³?¤³?³?–³?³?ˆ³?³?z³?s³?l³?e³?^³?W³?P³?I³?B³?;³?4³?-³?&³?³?³?³? ³?³?ü²?õ²?î²?ç²?à²?Ù²?Ò²?˲?IJ?½²?¶²?¯²?¨²?¡²?š²?“²?Œ²?…²?~²?w²?p²?i²?b²?[²?T²?M²?F²??²?8²?1²?*²?#²?²?²?²?²?²?ù±?ò±?ë±?ä±?ݱ?Ö±?ϱ?ȱ?Á±?º±?³±?¬±?¥±?ž±?—±?±?‰±?‚±?{±?t±?m±?f±?_±?X±?Q±?J±?C±?<±?5±?.±?'±? ±?±?±? ±?±?ý°?ö°?ï°?è°?á°?Ú°?Ó°?̰?Ű?¾°?·°?°°?©°?¢°?›°?”°?°?†°?°?x°?q°?j°?c°?\°?U°?N°?G°?@°?9°?2°?+°?$°?°?°?°?°?°?ú¯?ó¯?ì¯?å¯?Þ¯?ׯ?Я?ɯ?¯?»¯?´¯?­¯?¦¯?Ÿ¯?˜¯?‘¯?Н?ƒ¯?|¯?u¯?n¯?g¯?`¯?Y¯?R¯?K¯?D¯?=¯?6¯?/¯?(¯?!¯?¯?¯? ¯?¯?þ®?÷®?ð®?é®?â®?Û®?Ô®?Í®?Æ®?¿®?¸®?±®?ª®?£®?œ®?•®?Ž®?‡®?€®?y®?r®?k®?d®?]®?V®?O®?H®?A®?:®?3®?,®?%®?®?®?®? ®?®?û­?ô­?í­?æ­?ß­?Ø­?Ñ­?Ê­?í?¼­?µ­?®­?§­? ­?™­?’­?‹­?„­?}­?v­?o­?h­?a­?Z­?S­?L­?E­?>­?7­?0­?)­?"­?­?­? ­?­?ÿ¬?ø¬?ñ¬?ê¬?ã¬?ܬ?Õ¬?ά?Ǭ?À¬?¹¬?²¬?«¬?¤¬?¬?–¬?¬?ˆ¬?¬?z¬?s¬?l¬?e¬?^¬?W¬?P¬?I¬?B¬?;¬?4¬?-¬?&¬?¬?¬?¬? ¬?¬?ü«?õ«?î«?ç«?à«?Ù«?Ò«?Ë«?Ä«?½«?¶«?¯«?¨«?¡«?š«?“«?Œ«?…«?~«?w«?p«?i«?b«?[«?T«?M«?F«??«?8«?1«?*«?#«?«?«?«?«?«?ùª?òª?ëª?äª?ݪ?Öª?Ϫ?Ȫ?Áª?ºª?³ª?¬ª?¥ª?žª?—ª?ª?‰ª?‚ª?{ª?tª?mª?fª?_ª?Xª?Qª?Jª?Cª?<ª?5ª?.ª?'ª? ª?ª?ª? ª?ª?ý©?ö©?ï©?è©?á©?Ú©?Ó©?Ì©?Å©?¾©?·©?°©?©©?¢©?›©?”©?©?†©?©?x©?q©?j©?c©?\©?U©?N©?G©?@©?9©?2©?+©?$©?©?©?©?©?©?ú¨?ó¨?ì¨?å¨?Þ¨?ר?Ш?ɨ?¨?»¨?´¨?­¨?¦¨?Ÿ¨?˜¨?‘¨?Ѝ?ƒ¨?|¨?u¨?n¨?g¨?`¨?Y¨?R¨?K¨?D¨?=¨?6¨?/¨?(¨?!¨?¨?¨? ¨?¨?þ§?÷§?ð§?é§?â§?Û§?Ô§?ͧ?Ƨ?¿§?¸§?±§?ª§?£§?œ§?•§?ާ?‡§?€§?y§?r§?k§?d§?]§?V§?O§?H§?A§?:§?3§?,§?%§?§?§?§? §?§?û¦?ô¦?í¦?æ¦?ߦ?ئ?Ѧ?ʦ?æ?¼¦?µ¦?®¦?§¦? ¦?™¦?’¦?‹¦?„¦?}¦?v¦?o¦?h¦?a¦?Z¦?S¦?L¦?E¦?>¦?7¦?0¦?)¦?"¦?¦?¦? ¦?¦?ÿ¥?ø¥?ñ¥?ê¥?ã¥?Ü¥?Õ¥?Î¥?Ç¥?À¥?¹¥?²¥?«¥?¤¥?¥?–¥?¥?ˆ¥?¥?z¥?s¥?l¥?e¥?^¥?W¥?P¥?I¥?B¥?;¥?4¥?-¥?&¥?¥?¥?¥? ¥?¥?ü¤?õ¤?î¤?ç¤?à¤?Ù¤?Ò¤?ˤ?Ĥ?½¤?¶¤?¯¤?¨¤?¡¤?š¤?“¤?Œ¤?…¤?~¤?w¤?p¤?i¤?b¤?[¤?T¤?M¤?F¤??¤?8¤?1¤?*¤?#¤?¤?¤?¤?¤?¤?ù£?ò£?ë£?ä£?Ý£?Ö£?Ï£?È£?Á£?º£?³£?¬£?¥£?ž£?—£?£?‰£?‚£?{£?t£?m£?f£?_£?X£?Q£?J£?C£?<£?5£?.£?'£? £?£?£? £?£?ý¢?ö¢?ï¢?è¢?á¢?Ú¢?Ó¢?Ì¢?Å¢?¾¢?·¢?°¢?©¢?¢¢?›¢?”¢?¢?†¢?¢?x¢?q¢?j¢?c¢?\¢?U¢?N¢?G¢?@¢?9¢?2¢?+¢?$¢?¢?¢?¢?¢?¢?ú¡?ó¡?ì¡?å¡?Þ¡?ס?С?É¡?¡?»¡?´¡?­¡?¦¡?Ÿ¡?˜¡?‘¡?Š¡?ƒ¡?|¡?u¡?n¡?g¡?`¡?Y¡?R¡?K¡?D¡?=¡?6¡?/¡?(¡?!¡?¡?¡? ¡?¡?þ ?÷ ?ð ?é ?â ?Û ?Ô ?Í ?Æ ?¿ ?¸ ?± ?ª ?£ ?œ ?• ?Ž ?‡ ?€ ?y ?r ?k ?d ?] ?V ?O ?H ?A ?: ?3 ?, ?% ? ? ? ?  ? ?ûŸ?ôŸ?íŸ?æŸ?ߟ?ØŸ?ÑŸ?ÊŸ?ß?¼Ÿ?µŸ?®Ÿ?§Ÿ? Ÿ?™Ÿ?’Ÿ?‹Ÿ?„Ÿ?}Ÿ?vŸ?oŸ?hŸ?aŸ?ZŸ?SŸ?LŸ?EŸ?>Ÿ?7Ÿ?0Ÿ?)Ÿ?"Ÿ?Ÿ?Ÿ? Ÿ?Ÿ?ÿž?øž?ñž?êž?ãž?Üž?Õž?Ξ?Çž?Àž?¹ž?²ž?«ž?¤ž?ž?–ž?ž?ˆž?ž?zž?sž?lž?ež?^ž?Wž?Pž?Iž?Bž?;ž?4ž?-ž?&ž?ž?ž?ž? ž?ž?ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ùœ?òœ?ëœ?äœ?Ýœ?Öœ?Ïœ?Èœ?Áœ?ºœ?³œ?¬œ?¥œ?žœ?—œ?œ?‰œ?‚œ?{œ?tœ?mœ?fœ?_œ?Xœ?Qœ?Jœ?Cœ?<œ?5œ?.œ?'œ? œ?œ?œ? œ?œ?ý›?ö›?ï›?è›?á›?Ú›?Ó›?Ì›?Å›?¾›?·›?°›?©›?¢›?››?”›?›?†›?›?x›?q›?j›?c›?\›?U›?N›?G›?@›?9›?2›?+›?$›?›?›?›?›?›?úš?óš?ìš?åš?Þš?ך?К?Éš?š?»š?´š?­š?¦š?Ÿš?˜š?‘š?Šš?ƒš?|š?uš?nš?gš?`š?Yš?Rš?Kš?Dš?=š?6š?/š?(š?!š?š?š? š?š?þ™?÷™?ð™?é™?â™?Û™?Ô™?Í™?Æ™?¿™?¸™?±™?ª™?£™?œ™?•™?Ž™?‡™?€™?y™?r™?k™?d™?]™?V™?O™?H™?A™?:™?3™?,™?%™?™?™?™? ™?™?û˜?ô˜?í˜?æ˜?ߘ?ؘ?ј?ʘ?Ø?¼˜?µ˜?®˜?§˜? ˜?™˜?’˜?‹˜?„˜?}˜?v˜?o˜?h˜?a˜?Z˜?S˜?L˜?E˜?>˜?7˜?0˜?)˜?"˜?˜?˜? ˜?˜?ÿ—?ø—?ñ—?ê—?ã—?Ü—?Õ—?Η?Ç—?À—?¹—?²—?«—?¤—?—?–—?—?ˆ—?—?z—?s—?l—?e—?^—?W—?P—?I—?B—?;—?4—?-—?&—?—?—?—? —?—?ü–?õ–?î–?ç–?à–?Ù–?Ò–?Ë–?Ä–?½–?¶–?¯–?¨–?¡–?š–?“–?Œ–?…–?~–?w–?p–?i–?b–?[–?T–?M–?F–??–?8–?1–?*–?#–?–?–?–?–?–?ù•?ò•?ë•?ä•?Ý•?Ö•?Ï•?È•?Á•?º•?³•?¬•?¥•?ž•?—•?•?‰•?‚•?{•?t•?m•?f•?_•?X•?Q•?J•?C•?<•?5•?.•?'•? •?•?•? •?•?ý”?ö”?ï”?è”?á”?Ú”?Ó”?Ì”?Å”?¾”?·”?°”?©”?¢”?›”?””?”?†”?”?x”?q”?j”?c”?\”?U”?N”?G”?@”?9”?2”?+”?$”?”?”?”?”?”?ú“?ó“?ì“?å“?Þ“?ד?Г?É“?“?»“?´“?­“?¦“?Ÿ“?˜“?‘“?Š“?ƒ“?|“?u“?n“?g“?`“?Y“?R“?K“?D“?=“?6“?/“?(“?!“?“?“? “?“?þ’?÷’?ð’?é’?â’?Û’?Ô’?Í’?Æ’?¿’?¸’?±’?ª’?£’?œ’?•’?Ž’?‡’?€’?y’?r’?k’?d’?]’?V’?O’?H’?A’?:’?3’?,’?%’?’?’?’? ’?’?û‘?ô‘?í‘?æ‘?ß‘?Ø‘?Ñ‘?Ê‘?Ñ?¼‘?µ‘?®‘?§‘? ‘?™‘?’‘?‹‘?„‘?}‘?v‘?o‘?h‘?a‘?Z‘?S‘?L‘?E‘?>‘?7‘?0‘?)‘?"‘?‘?‘? ‘?‘?ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ùŽ?òŽ?ëŽ?äŽ?ÝŽ?ÖŽ?ÏŽ?ÈŽ?ÁŽ?ºŽ?³Ž?¬Ž?¥Ž?žŽ?—Ž?Ž?‰Ž?‚Ž?{Ž?tŽ?mŽ?fŽ?_Ž?XŽ?QŽ?JŽ?CŽ?<Ž?5Ž?.Ž?'Ž? Ž?Ž?Ž? Ž?Ž?ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????úŒ?óŒ?ìŒ?åŒ?ÞŒ?׌?ÐŒ?ÉŒ?ÂŒ?»Œ?´Œ?­Œ?¦Œ?ŸŒ?˜Œ?‘Œ?ŠŒ?ƒŒ?|Œ?uŒ?nŒ?gŒ?`Œ?YŒ?RŒ?KŒ?DŒ?=Œ?6Œ?/Œ?(Œ?!Œ?Œ?Œ? Œ?Œ?þ‹?÷‹?ð‹?é‹?â‹?Û‹?Ô‹?Í‹?Æ‹?¿‹?¸‹?±‹?ª‹?£‹?œ‹?•‹?Ž‹?‡‹?€‹?y‹?r‹?k‹?d‹?]‹?V‹?O‹?H‹?A‹?:‹?3‹?,‹?%‹?‹?‹?‹? ‹?‹?ûŠ?ôŠ?íŠ?æŠ?ߊ?ØŠ?ÑŠ?ÊŠ?Ê?¼Š?µŠ?®Š?§Š? Š?™Š?’Š?‹Š?„Š?}Š?vŠ?oŠ?hŠ?aŠ?ZŠ?SŠ?LŠ?EŠ?>Š?7Š?0Š?)Š?"Š?Š?Š? Š?Š?ÿ‰?ø‰?ñ‰?ê‰?ã‰?܉?Õ‰?Ή?lj?À‰?¹‰?²‰?«‰?¤‰?‰?–‰?‰?ˆ‰?‰?z‰?s‰?l‰?e‰?^‰?W‰?P‰?I‰?B‰?;‰?4‰?-‰?&‰?‰?‰?‰? ‰?‰?üˆ?õˆ?îˆ?çˆ?àˆ?Ùˆ?Òˆ?ˈ?Ĉ?½ˆ?¶ˆ?¯ˆ?¨ˆ?¡ˆ?šˆ?“ˆ?Œˆ?…ˆ?~ˆ?wˆ?pˆ?iˆ?bˆ?[ˆ?Tˆ?Mˆ?Fˆ??ˆ?8ˆ?1ˆ?*ˆ?#ˆ?ˆ?ˆ?ˆ?ˆ?ˆ?ù‡?ò‡?ë‡?ä‡?݇?Ö‡?χ?ȇ?Á‡?º‡?³‡?¬‡?¥‡?ž‡?—‡?‡?‰‡?‚‡?{‡?t‡?m‡?f‡?_‡?X‡?Q‡?J‡?C‡?<‡?5‡?.‡?'‡? ‡?‡?‡? ‡?‡?ý†?ö†?ï†?è†?á†?Ú†?Ó†?̆?ņ?¾†?·†?°†?©†?¢†?›†?”†?†?††?†?x†?q†?j†?c†?\†?U†?N†?G†?@†?9†?2†?+†?$†?†?†?†?†?†?ú…?ó…?ì…?å…?Þ…?×…?Ð…?É…?Â…?»…?´…?­…?¦…?Ÿ…?˜…?‘…?Š…?ƒ…?|…?u…?n…?g…?`…?Y…?R…?K…?D…?=…?6…?/…?(…?!…?…?…? …?…?þ„?÷„?ð„?é„?â„?Û„?Ô„?Í„?Æ„?¿„?¸„?±„?ª„?£„?œ„?•„?Ž„?‡„?€„?y„?r„?k„?d„?]„?V„?O„?H„?A„?:„?3„?,„?%„?„?„?„? „?„?ûƒ?ôƒ?íƒ?æƒ?߃?؃?у?ʃ?Ã?¼ƒ?µƒ?®ƒ?§ƒ? ƒ?™ƒ?’ƒ?‹ƒ?„ƒ?}ƒ?vƒ?oƒ?hƒ?aƒ?Zƒ?Sƒ?Lƒ?Eƒ?>ƒ?7ƒ?0ƒ?)ƒ?"ƒ?ƒ?ƒ? ƒ?ƒ?ÿ‚?ø‚?ñ‚?ê‚?ã‚?Ü‚?Õ‚?΂?Ç‚?À‚?¹‚?²‚?«‚?¤‚?‚?–‚?‚?ˆ‚?‚?z‚?s‚?l‚?e‚?^‚?W‚?P‚?I‚?B‚?;‚?4‚?-‚?&‚?‚?‚?‚? ‚?‚?ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù€?ò€?ë€?ä€?Ý€?Ö€?Ï€?È€?Á€?º€?³€?¬€?¥€?ž€?—€?€?‰€?‚€?{€?t€?m€?f€?_€?X€?Q€?J€?C€?<€?5€?.€?'€? €?€?€? €?€?ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú~?ó~?ì~?å~?Þ~?×~?Ð~?É~?Â~?»~?´~?­~?¦~?Ÿ~?˜~?‘~?Š~?ƒ~?|~?u~?n~?g~?`~?Y~?R~?K~?D~?=~?6~?/~?(~?!~?~?~? ~?~?þ}?÷}?ð}?é}?â}?Û}?Ô}?Í}?Æ}?¿}?¸}?±}?ª}?£}?œ}?•}?Ž}?‡}?€}?y}?r}?k}?d}?]}?V}?O}?H}?A}?:}?3}?,}?%}?}?}?}? }?}?û|?ô|?í|?æ|?ß|?Ø|?Ñ|?Ê|?Ã|?¼|?µ|?®|?§|? |?™|?’|?‹|?„|?}|?v|?o|?h|?a|?Z|?S|?L|?E|?>|?7|?0|?)|?"|?|?|? |?|?ÿ{?ø{?ñ{?ê{?ã{?Ü{?Õ{?Î{?Ç{?À{?¹{?²{?«{?¤{?{?–{?{?ˆ{?{?z{?s{?l{?e{?^{?W{?P{?I{?B{?;{?4{?-{?&{?{?{?{? {?{?üz?õz?îz?çz?àz?Ùz?Òz?Ëz?Äz?½z?¶z?¯z?¨z?¡z?šz?“z?Œz?…z?~z?wz?pz?iz?bz?[z?Tz?Mz?Fz??z?8z?1z?*z?#z?z?z?z?z?z?ùy?òy?ëy?äy?Ýy?Öy?Ïy?Èy?Áy?ºy?³y?¬y?¥y?žy?—y?y?‰y?‚y?{y?ty?my?fy?_y?Xy?Qy?Jy?Cy?u?7u?0u?)u?"u?u?u? u?u?ÿt?øt?ñt?êt?ãt?Üt?Õt?Ît?Çt?Àt?¹t?²t?«t?¤t?t?–t?t?ˆt?t?zt?st?lt?et?^t?Wt?Pt?It?Bt?;t?4t?-t?&t?t?t?t? t?t?üs?õs?îs?çs?às?Ùs?Òs?Ës?Äs?½s?¶s?¯s?¨s?¡s?šs?“s?Œs?…s?~s?ws?ps?is?bs?[s?Ts?Ms?Fs??s?8s?1s?*s?#s?s?s?s?s?s?ùr?òr?ër?är?Ýr?Ör?Ïr?Èr?Ár?ºr?³r?¬r?¥r?žr?—r?r?‰r?‚r?{r?tr?mr?fr?_r?Xr?Qr?Jr?Cr?n?7n?0n?)n?"n?n?n? n?n?ÿm?øm?ñm?êm?ãm?Üm?Õm?Îm?Çm?Àm?¹m?²m?«m?¤m?m?–m?m?ˆm?m?zm?sm?lm?em?^m?Wm?Pm?Im?Bm?;m?4m?-m?&m?m?m?m? m?m?ül?õl?îl?çl?àl?Ùl?Òl?Ël?Äl?½l?¶l?¯l?¨l?¡l?šl?“l?Œl?…l?~l?wl?pl?il?bl?[l?Tl?Ml?Fl??l?8l?1l?*l?#l?l?l?l?l?l?ùk?òk?ëk?äk?Ýk?Ök?Ïk?Èk?Ák?ºk?³k?¬k?¥k?žk?—k?k?‰k?‚k?{k?tk?mk?fk?_k?Xk?Qk?Jk?Ck?g?7g?0g?)g?"g?g?g? g?g?ÿf?øf?ñf?êf?ãf?Üf?Õf?Îf?Çf?Àf?¹f?²f?«f?¤f?f?–f?f?ˆf?f?zf?sf?lf?ef?^f?Wf?Pf?If?Bf?;f?4f?-f?&f?f?f?f? f?f?üe?õe?îe?çe?àe?Ùe?Òe?Ëe?Äe?½e?¶e?¯e?¨e?¡e?še?“e?Œe?…e?~e?we?pe?ie?be?[e?Te?Me?Fe??e?8e?1e?*e?#e?e?e?e?e?e?ùd?òd?ëd?äd?Ýd?Öd?Ïd?Èd?Ád?ºd?³d?¬d?¥d?žd?—d?d?‰d?‚d?{d?td?md?fd?_d?Xd?Qd?Jd?Cd?`?7`?0`?)`?"`?`?`? `?`?ÿ_?ø_?ñ_?ê_?ã_?Ü_?Õ_?Î_?Ç_?À_?¹_?²_?«_?¤_?_?–_?_?ˆ_?_?z_?s_?l_?e_?^_?W_?P_?I_?B_?;_?4_?-_?&_?_?_?_? _?_?ü^?õ^?î^?ç^?à^?Ù^?Ò^?Ë^?Ä^?½^?¶^?¯^?¨^?¡^?š^?“^?Œ^?…^?~^?w^?p^?i^?b^?[^?T^?M^?F^??^?8^?1^?*^?#^?^?^?^?^?^?ù]?ò]?ë]?ä]?Ý]?Ö]?Ï]?È]?Á]?º]?³]?¬]?¥]?ž]?—]?]?‰]?‚]?{]?t]?m]?f]?_]?X]?Q]?J]?C]?<]?5]?.]?']? ]?]?]? ]?]?ý\?ö\?ï\?è\?á\?Ú\?Ó\?Ì\?Å\?¾\?·\?°\?©\?¢\?›\?”\?\?†\?\?x\?q\?j\?c\?\\?U\?N\?G\?@\?9\?2\?+\?$\?\?\?\?\?\?ú[?ó[?ì[?å[?Þ[?×[?Ð[?É[?Â[?»[?´[?­[?¦[?Ÿ[?˜[?‘[?Š[?ƒ[?|[?u[?n[?g[?`[?Y[?R[?K[?D[?=[?6[?/[?([?![?[?[? [?[?þZ?÷Z?ðZ?éZ?âZ?ÛZ?ÔZ?ÍZ?ÆZ?¿Z?¸Z?±Z?ªZ?£Z?œZ?•Z?ŽZ?‡Z?€Z?yZ?rZ?kZ?dZ?]Z?VZ?OZ?HZ?AZ?:Z?3Z?,Z?%Z?Z?Z?Z? Z?Z?ûY?ôY?íY?æY?ßY?ØY?ÑY?ÊY?ÃY?¼Y?µY?®Y?§Y? Y?™Y?’Y?‹Y?„Y?}Y?vY?oY?hY?aY?ZY?SY?LY?EY?>Y?7Y?0Y?)Y?"Y?Y?Y? Y?Y?ÿX?øX?ñX?êX?ãX?ÜX?ÕX?ÎX?ÇX?ÀX?¹X?²X?«X?¤X?X?–X?X?ˆX?X?zX?sX?lX?eX?^X?WX?PX?IX?BX?;X?4X?-X?&X?X?X?X? X?X?üW?õW?îW?çW?àW?ÙW?ÒW?ËW?ÄW?½W?¶W?¯W?¨W?¡W?šW?“W?ŒW?…W?~W?wW?pW?iW?bW?[W?TW?MW?FW??W?8W?1W?*W?#W?W?W?W?W?W?ùV?òV?ëV?äV?ÝV?ÖV?ÏV?ÈV?ÁV?ºV?³V?¬V?¥V?žV?—V?V?‰V?‚V?{V?tV?mV?fV?_V?XV?QV?JV?CV?R?7R?0R?)R?"R?R?R? R?R?ÿQ?øQ?ñQ?êQ?ãQ?ÜQ?ÕQ?ÎQ?ÇQ?ÀQ?¹Q?²Q?«Q?¤Q?Q?–Q?Q?ˆQ?Q?zQ?sQ?lQ?eQ?^Q?WQ?PQ?IQ?BQ?;Q?4Q?-Q?&Q?Q?Q?Q? Q?Q?üP?õP?îP?çP?àP?ÙP?ÒP?ËP?ÄP?½P?¶P?¯P?¨P?¡P?šP?“P?ŒP?…P?~P?wP?pP?iP?bP?[P?TP?MP?FP??P?8P?1P?*P?#P?P?P?P?P?P?ùO?òO?ëO?äO?ÝO?ÖO?ÏO?ÈO?ÁO?ºO?³O?¬O?¥O?žO?—O?O?‰O?‚O?{O?tO?mO?fO?_O?XO?QO?JO?CO?K?7K?0K?)K?"K?K?K? K?K?ÿJ?øJ?ñJ?êJ?ãJ?ÜJ?ÕJ?ÎJ?ÇJ?ÀJ?¹J?²J?«J?¤J?J?–J?J?ˆJ?J?zJ?sJ?lJ?eJ?^J?WJ?PJ?IJ?BJ?;J?4J?-J?&J?J?J?J? J?J?üI?õI?îI?çI?àI?ÙI?ÒI?ËI?ÄI?½I?¶I?¯I?¨I?¡I?šI?“I?ŒI?…I?~I?wI?pI?iI?bI?[I?TI?MI?FI??I?8I?1I?*I?#I?I?I?I?I?I?ùH?òH?ëH?äH?ÝH?ÖH?ÏH?ÈH?ÁH?ºH?³H?¬H?¥H?žH?—H?H?‰H?‚H?{H?tH?mH?fH?_H?XH?QH?JH?CH?D?7D?0D?)D?"D?D?D? D?D?ÿC?øC?ñC?êC?ãC?ÜC?ÕC?ÎC?ÇC?ÀC?¹C?²C?«C?¤C?C?–C?C?ˆC?C?zC?sC?lC?eC?^C?WC?PC?IC?BC?;C?4C?-C?&C?C?C?C? C?C?üB?õB?îB?çB?àB?ÙB?ÒB?ËB?ÄB?½B?¶B?¯B?¨B?¡B?šB?“B?ŒB?…B?~B?wB?pB?iB?bB?[B?TB?MB?FB??B?8B?1B?*B?#B?B?B?B?B?B?ùA?òA?ëA?äA?ÝA?ÖA?ÏA?ÈA?ÁA?ºA?³A?¬A?¥A?žA?—A?A?‰A?‚A?{A?tA?mA?fA?_A?XA?QA?JA?CA??÷>?ð>?é>?â>?Û>?Ô>?Í>?Æ>?¿>?¸>?±>?ª>?£>?œ>?•>?Ž>?‡>?€>?y>?r>?k>?d>?]>?V>?O>?H>?A>?:>?3>?,>?%>?>?>?>? >?>?û=?ô=?í=?æ=?ß=?Ø=?Ñ=?Ê=?Ã=?¼=?µ=?®=?§=? =?™=?’=?‹=?„=?}=?v=?o=?h=?a=?Z=?S=?L=?E=?>=?7=?0=?)=?"=?=?=? =?=?ÿ6?76?06?)6?"6?6?6? 6?6?ÿ5?ø5?ñ5?ê5?ã5?Ü5?Õ5?Î5?Ç5?À5?¹5?²5?«5?¤5?5?–5?5?ˆ5?5?z5?s5?l5?e5?^5?W5?P5?I5?B5?;5?45?-5?&5?5?5?5? 5?5?ü4?õ4?î4?ç4?à4?Ù4?Ò4?Ë4?Ä4?½4?¶4?¯4?¨4?¡4?š4?“4?Œ4?…4?~4?w4?p4?i4?b4?[4?T4?M4?F4??4?84?14?*4?#4?4?4?4?4?4?ù3?ò3?ë3?ä3?Ý3?Ö3?Ï3?È3?Á3?º3?³3?¬3?¥3?ž3?—3?3?‰3?‚3?{3?t3?m3?f3?_3?X3?Q3?J3?C3?<3?53?.3?'3? 3?3?3? 3?3?ý2?ö2?ï2?è2?á2?Ú2?Ó2?Ì2?Å2?¾2?·2?°2?©2?¢2?›2?”2?2?†2?2?x2?q2?j2?c2?\2?U2?N2?G2?@2?92?22?+2?$2?2?2?2?2?2?ú1?ó1?ì1?å1?Þ1?×1?Ð1?É1?Â1?»1?´1?­1?¦1?Ÿ1?˜1?‘1?Š1?ƒ1?|1?u1?n1?g1?`1?Y1?R1?K1?D1?=1?61?/1?(1?!1?1?1? 1?1?þ0?÷0?ð0?é0?â0?Û0?Ô0?Í0?Æ0?¿0?¸0?±0?ª0?£0?œ0?•0?Ž0?‡0?€0?y0?r0?k0?d0?]0?V0?O0?H0?A0?:0?30?,0?%0?0?0?0? 0?0?û/?ô/?í/?æ/?ß/?Ø/?Ñ/?Ê/?Ã/?¼/?µ/?®/?§/? /?™/?’/?‹/?„/?}/?v/?o/?h/?a/?Z/?S/?L/?E/?>/?7/?0/?)/?"/?/?/? /?/?ÿ.?ø.?ñ.?ê.?ã.?Ü.?Õ.?Î.?Ç.?À.?¹.?².?«.?¤.?.?–.?.?ˆ.?.?z.?s.?l.?e.?^.?W.?P.?I.?B.?;.?4.?-.?&.?.?.?.? .?.?ü-?õ-?î-?ç-?à-?Ù-?Ò-?Ë-?Ä-?½-?¶-?¯-?¨-?¡-?š-?“-?Œ-?…-?~-?w-?p-?i-?b-?[-?T-?M-?F-??-?8-?1-?*-?#-?-?-?-?-?-?ù,?ò,?ë,?ä,?Ý,?Ö,?Ï,?È,?Á,?º,?³,?¬,?¥,?ž,?—,?,?‰,?‚,?{,?t,?m,?f,?_,?X,?Q,?J,?C,?<,?5,?.,?',? ,?,?,? ,?,?ý+?ö+?ï+?è+?á+?Ú+?Ó+?Ì+?Å+?¾+?·+?°+?©+?¢+?›+?”+?+?†+?+?x+?q+?j+?c+?\+?U+?N+?G+?@+?9+?2+?++?$+?+?+?+?+?+?ú*?ó*?ì*?å*?Þ*?×*?Ð*?É*?Â*?»*?´*?­*?¦*?Ÿ*?˜*?‘*?Š*?ƒ*?|*?u*?n*?g*?`*?Y*?R*?K*?D*?=*?6*?/*?(*?!*?*?*? *?*?þ)?÷)?ð)?é)?â)?Û)?Ô)?Í)?Æ)?¿)?¸)?±)?ª)?£)?œ)?•)?Ž)?‡)?€)?y)?r)?k)?d)?])?V)?O)?H)?A)?:)?3)?,)?%)?)?)?)? )?)?û(?ô(?í(?æ(?ß(?Ø(?Ñ(?Ê(?Ã(?¼(?µ(?®(?§(? (?™(?’(?‹(?„(?}(?v(?o(?h(?a(?Z(?S(?L(?E(?>(?7(?0(?)(?"(?(?(? (?(?ÿ'?ø'?ñ'?ê'?ã'?Ü'?Õ'?Î'?Ç'?À'?¹'?²'?«'?¤'?'?–'?'?ˆ'?'?z'?s'?l'?e'?^'?W'?P'?I'?B'?;'?4'?-'?&'?'?'?'? '?'?ü&?õ&?î&?ç&?à&?Ù&?Ò&?Ë&?Ä&?½&?¶&?¯&?¨&?¡&?š&?“&?Œ&?…&?~&?w&?p&?i&?b&?[&?T&?M&?F&??&?8&?1&?*&?#&?&?&?&?&?&?ù%?ò%?ë%?ä%?Ý%?Ö%?Ï%?È%?Á%?º%?³%?¬%?¥%?ž%?—%?%?‰%?‚%?{%?t%?m%?f%?_%?X%?Q%?J%?C%?<%?5%?.%?'%? %?%?%? %?%?ý$?ö$?ï$?è$?á$?Ú$?Ó$?Ì$?Å$?¾$?·$?°$?©$?¢$?›$?”$?$?†$?$?x$?q$?j$?c$?\$?U$?N$?G$?@$?9$?2$?+$?$$?$?$?$?$?$?ú#?ó#?ì#?å#?Þ#?×#?Ð#?É#?Â#?»#?´#?­#?¦#?Ÿ#?˜#?‘#?Š#?ƒ#?|#?u#?n#?g#?`#?Y#?R#?K#?D#?=#?6#?/#?(#?!#?#?#? #?#?þ"?÷"?ð"?é"?â"?Û"?Ô"?Í"?Æ"?¿"?¸"?±"?ª"?£"?œ"?•"?Ž"?‡"?€"?y"?r"?k"?d"?]"?V"?O"?H"?A"?:"?3"?,"?%"?"?"?"? "?"?û!?ô!?í!?æ!?ß!?Ø!?Ñ!?Ê!?Ã!?¼!?µ!?®!?§!? !?™!?’!?‹!?„!?}!?v!?o!?h!?a!?Z!?S!?L!?E!?>!?7!?0!?)!?"!?!?!? !?!?ÿ ?ø ?ñ ?ê ?ã ?Ü ?Õ ?Î ?Ç ?À ?¹ ?² ?« ?¤ ? ?– ? ?ˆ ? ?z ?s ?l ?e ?^ ?W ?P ?I ?B ?; ?4 ?- ?& ? ? ? ? ? ?ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ??ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú?ó?ì?å?Þ?×?Ð?É?Â?»?´?­?¦?Ÿ?˜?‘?Š?ƒ?|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??þ?÷?ð?é?â?Û?Ô?Í?Æ?¿?¸?±?ª?£?œ?•?Ž?‡?€?y?r?k?d?]?V?O?H?A?:?3?,?%???? ??û?ô?í?æ?ß?Ø?Ñ?Ê?Ã?¼?µ?®?§? ?™?’?‹?„?}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ??ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ??ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú?ó?ì?å?Þ?×?Ð?É?Â?»?´?­?¦?Ÿ?˜?‘?Š?ƒ?|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??þ?÷?ð?é?â?Û?Ô?Í?Æ?¿?¸?±?ª?£?œ?•?Ž?‡?€?y?r?k?d?]?V?O?H?A?:?3?,?%???? ??û?ô?í?æ?ß?Ø?Ñ?Ê?Ã?¼?µ?®?§? ?™?’?‹?„?}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ??ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ??ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú?ó?ì?å?Þ?×?Ð?É?Â?»?´?­?¦?Ÿ?˜?‘?Š?ƒ?|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??þ ?÷ ?ð ?é ?â ?Û ?Ô ?Í ?Æ ?¿ ?¸ ?± ?ª ?£ ?œ ?• ?Ž ?‡ ?€ ?y ?r ?k ?d ?] ?V ?O ?H ?A ?: ?3 ?, ?% ? ? ? ? ? ?û ?ô ?í ?æ ?ß ?Ø ?Ñ ?Ê ?à ?¼ ?µ ?® ?§ ?  ?™ ?’ ?‹ ?„ ?} ?v ?o ?h ?a ?Z ?S ?L ?E ?> ?7 ?0 ?) ?" ? ? ? ? ?ÿ ?ø ?ñ ?ê ?ã ?Ü ?Õ ?Î ?Ç ?À ?¹ ?² ?« ?¤ ? ?– ? ?ˆ ? ?z ?s ?l ?e ?^ ?W ?P ?I ?B ?; ?4 ?- ?& ? ? ? ? ? ?ü ?õ ?î ?ç ?à ?Ù ?Ò ?Ë ?Ä ?½ ?¶ ?¯ ?¨ ?¡ ?š ?“ ?Œ ?… ?~ ?w ?p ?i ?b ?[ ?T ?M ?F ?? ?8 ?1 ?* ?# ? ? ? ? ? ?ù ?ò ?ë ?ä ?Ý ?Ö ?Ï ?È ?Á ?º ?³ ?¬ ?¥ ?ž ?— ? ?‰ ?‚ ?{ ?t ?m ?f ?_ ?X ?Q ?J ?C ?< ?5 ?. ?' ? ? ? ? ? ?ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú?ó?ì?å?Þ?×?Ð?É?Â?»?´?­?¦?Ÿ?˜?‘?Š?ƒ?|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??þ?÷?ð?é?â?Û?Ô?Í?Æ?¿?¸?±?ª?£?œ?•?Ž?‡?€?y?r?k?d?]?V?O?H?A?:?3?,?%???? ??û?ô?í?æ?ß?Ø?Ñ?Ê?Ã?¼?µ?®?§? ?™?’?‹?„?}?v?o?h?a?Z?S?L?E?>?7?0?)?"??? ??ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?<?5?.?'? ??? ??ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú?ó?ì?å?Þ?×?Ð?É?Â?»?´?­?¦?Ÿ?˜?‘?Š?ƒ?|?u?n?g?`?Y?R?K?D?=?6?/?(?!??? ??þÿ>÷ÿ>ðÿ>éÿ>âÿ>Ûÿ>Ôÿ>Íÿ>Æÿ>¿ÿ>¸ÿ>±ÿ>ªÿ>£ÿ>œÿ>•ÿ>Žÿ>‡ÿ>€ÿ>yÿ>rÿ>kÿ>dÿ>]ÿ>Vÿ>Oÿ>Hÿ>Aÿ>:ÿ>3ÿ>,ÿ>%ÿ>ÿ>ÿ>ÿ> ÿ>ÿ>ûþ>ôþ>íþ>æþ>ßþ>Øþ>Ñþ>Êþ>Ãþ>¼þ>µþ>®þ>§þ> þ>™þ>’þ>‹þ>„þ>}þ>vþ>oþ>hþ>aþ>Zþ>Sþ>Lþ>Eþ>>þ>7þ>0þ>)þ>"þ>þ>þ> þ>þ>ÿý>øý>ñý>êý>ãý>Üý>Õý>Îý>Çý>Àý>¹ý>²ý>«ý>¤ý>ý>–ý>ý>ˆý>ý>zý>sý>lý>eý>^ý>Wý>Pý>Iý>Bý>;ý>4ý>-ý>&ý>ý>ý>ý> ý>ý>üü>õü>îü>çü>àü>Ùü>Òü>Ëü>Äü>½ü>¶ü>¯ü>¨ü>¡ü>šü>“ü>Œü>…ü>~ü>wü>pü>iü>bü>[ü>Tü>Mü>Fü>?ü>8ü>1ü>*ü>#ü>ü>ü>ü>ü>ü>ùû>òû>ëû>äû>Ýû>Öû>Ïû>Èû>Áû>ºû>³û>¬û>¥û>žû>—û>û>‰û>‚û>{û>tû>mû>fû>_û>Xû>Qû>Jû>Cû><û>5û>.û>'û> û>û>û> û>û>ýú>öú>ïú>èú>áú>Úú>Óú>Ìú>Åú>¾ú>·ú>°ú>©ú>¢ú>›ú>”ú>ú>†ú>ú>xú>qú>jú>cú>\ú>Uú>Nú>Gú>@ú>9ú>2ú>+ú>$ú>ú>ú>ú>ú>ú>úù>óù>ìù>åù>Þù>×ù>Ðù>Éù>Âù>»ù>´ù>­ù>¦ù>Ÿù>˜ù>‘ù>Šù>ƒù>|ù>uù>nù>gù>`ù>Yù>Rù>Kù>Dù>=ù>6ù>/ù>(ù>!ù>ù>ù> ù>ù>þø>÷ø>ðø>éø>âø>Ûø>Ôø>Íø>Æø>¿ø>¸ø>±ø>ªø>£ø>œø>•ø>Žø>‡ø>€ø>yø>rø>kø>dø>]ø>Vø>Oø>Hø>Aø>:ø>3ø>,ø>%ø>ø>ø>ø> ø>ø>û÷>ô÷>í÷>æ÷>ß÷>Ø÷>Ñ÷>Ê÷>Ã÷>¼÷>µ÷>®÷>§÷> ÷>™÷>’÷>‹÷>„÷>}÷>v÷>o÷>h÷>a÷>Z÷>S÷>L÷>E÷>>÷>7÷>0÷>)÷>"÷>÷>÷> ÷>÷>ÿö>øö>ñö>êö>ãö>Üö>Õö>Îö>Çö>Àö>¹ö>²ö>«ö>¤ö>ö>–ö>ö>ˆö>ö>zö>sö>lö>eö>^ö>Wö>Pö>Iö>Bö>;ö>4ö>-ö>&ö>ö>ö>ö> ö>ö>üõ>õõ>îõ>çõ>àõ>Ùõ>Òõ>Ëõ>Äõ>½õ>¶õ>¯õ>¨õ>¡õ>šõ>“õ>Œõ>…õ>~õ>wõ>põ>iõ>bõ>[õ>Tõ>Mõ>Fõ>?õ>8õ>1õ>*õ>#õ>õ>õ>õ>õ>õ>ùô>òô>ëô>äô>Ýô>Öô>Ïô>Èô>Áô>ºô>³ô>¬ô>¥ô>žô>—ô>ô>‰ô>‚ô>{ô>tô>mô>fô>_ô>Xô>Qô>Jô>Cô><ô>5ô>.ô>'ô> ô>ô>ô> ô>ô>ýó>öó>ïó>èó>áó>Úó>Óó>Ìó>Åó>¾ó>·ó>°ó>©ó>¢ó>›ó>”ó>ó>†ó>ó>xó>qó>jó>có>\ó>Uó>Nó>Gó>@ó>9ó>2ó>+ó>$ó>ó>ó>ó>ó>ó>úò>óò>ìò>åò>Þò>×ò>Ðò>Éò>Âò>»ò>´ò>­ò>¦ò>Ÿò>˜ò>‘ò>Šò>ƒò>|ò>uò>nò>gò>`ò>Yò>Rò>Kò>Dò>=ò>6ò>/ò>(ò>!ò>ò>ò> ò>ò>þñ>÷ñ>ðñ>éñ>âñ>Ûñ>Ôñ>Íñ>Æñ>¿ñ>¸ñ>±ñ>ªñ>£ñ>œñ>•ñ>Žñ>‡ñ>€ñ>yñ>rñ>kñ>dñ>]ñ>Vñ>Oñ>Hñ>Añ>:ñ>3ñ>,ñ>%ñ>ñ>ñ>ñ> ñ>ñ>ûð>ôð>íð>æð>ßð>Øð>Ñð>Êð>Ãð>¼ð>µð>®ð>§ð> ð>™ð>’ð>‹ð>„ð>}ð>vð>oð>hð>að>Zð>Sð>Lð>Eð>>ð>7ð>0ð>)ð>"ð>ð>ð> ð>ð>ÿï>øï>ñï>êï>ãï>Üï>Õï>Îï>Çï>Àï>¹ï>²ï>«ï>¤ï>ï>–ï>ï>ˆï>ï>zï>sï>lï>eï>^ï>Wï>Pï>Iï>Bï>;ï>4ï>-ï>&ï>ï>ï>ï> ï>ï>üî>õî>îî>çî>àî>Ùî>Òî>Ëî>Äî>½î>¶î>¯î>¨î>¡î>šî>“î>Œî>…î>~î>wî>pî>iî>bî>[î>Tî>Mî>Fî>?î>8î>1î>*î>#î>î>î>î>î>î>ùí>òí>ëí>äí>Ýí>Öí>Ïí>Èí>Áí>ºí>³í>¬í>¥í>ží>—í>í>‰í>‚í>{í>tí>mí>fí>_í>Xí>Qí>Jí>Cí><í>5í>.í>'í> í>í>í> í>í>ýì>öì>ïì>èì>áì>Úì>Óì>Ìì>Åì>¾ì>·ì>°ì>©ì>¢ì>›ì>”ì>ì>†ì>ì>xì>qì>jì>cì>\ì>Uì>Nì>Gì>@ì>9ì>2ì>+ì>$ì>ì>ì>ì>ì>ì>úë>óë>ìë>åë>Þë>×ë>Ðë>Éë>Âë>»ë>´ë>­ë>¦ë>Ÿë>˜ë>‘ë>Šë>ƒë>|ë>uë>në>gë>`ë>Yë>Rë>Kë>Dë>=ë>6ë>/ë>(ë>!ë>ë>ë> ë>ë>þê>÷ê>ðê>éê>âê>Ûê>Ôê>Íê>Æê>¿ê>¸ê>±ê>ªê>£ê>œê>•ê>Žê>‡ê>€ê>yê>rê>kê>dê>]ê>Vê>Oê>Hê>Aê>:ê>3ê>,ê>%ê>ê>ê>ê> ê>ê>ûé>ôé>íé>æé>ßé>Øé>Ñé>Êé>Ãé>¼é>µé>®é>§é> é>™é>’é>‹é>„é>}é>vé>oé>hé>aé>Zé>Sé>Lé>Eé>>é>7é>0é>)é>"é>é>é> é>é>ÿè>øè>ñè>êè>ãè>Üè>Õè>Îè>Çè>Àè>¹è>²è>«è>¤è>è>–è>è>ˆè>è>zè>sè>lè>eè>^è>Wè>Pè>Iè>Bè>;è>4è>-è>&è>è>è>è> è>è>üç>õç>îç>çç>àç>Ùç>Òç>Ëç>Äç>½ç>¶ç>¯ç>¨ç>¡ç>šç>“ç>Œç>…ç>~ç>wç>pç>iç>bç>[ç>Tç>Mç>Fç>?ç>8ç>1ç>*ç>#ç>ç>ç>ç>ç>ç>ùæ>òæ>ëæ>äæ>Ýæ>Öæ>Ïæ>Èæ>Áæ>ºæ>³æ>¬æ>¥æ>žæ>—æ>æ>‰æ>‚æ>{æ>tæ>mæ>fæ>_æ>Xæ>Qæ>Jæ>Cæ><æ>5æ>.æ>'æ> æ>æ>æ> æ>æ>ýå>öå>ïå>èå>áå>Úå>Óå>Ìå>Åå>¾å>·å>°å>©å>¢å>›å>”å>å>†å>å>xå>qå>jå>cå>\å>Uå>Nå>Gå>@å>9å>2å>+å>$å>å>å>å>å>å>úä>óä>ìä>åä>Þä>×ä>Ðä>Éä>Âä>»ä>´ä>­ä>¦ä>Ÿä>˜ä>‘ä>Šä>ƒä>|ä>uä>nä>gä>`ä>Yä>Rä>Kä>Dä>=ä>6ä>/ä>(ä>!ä>ä>ä> ä>ä>þã>÷ã>ðã>éã>âã>Ûã>Ôã>Íã>Æã>¿ã>¸ã>±ã>ªã>£ã>œã>•ã>Žã>‡ã>€ã>yã>rã>kã>dã>]ã>Vã>Oã>Hã>Aã>:ã>3ã>,ã>%ã>ã>ã>ã> ã>ã>ûâ>ôâ>íâ>æâ>ßâ>Øâ>Ñâ>Êâ>Ãâ>¼â>µâ>®â>§â> â>™â>’â>‹â>„â>}â>vâ>oâ>hâ>aâ>Zâ>Sâ>Lâ>Eâ>>â>7â>0â>)â>"â>â>â> â>â>ÿá>øá>ñá>êá>ãá>Üá>Õá>Îá>Çá>Àá>¹á>²á>«á>¤á>á>–á>á>ˆá>á>zá>sá>lá>eá>^á>Wá>Pá>Iá>Bá>;á>4á>-á>&á>á>á>á> á>á>üà>õà>îà>çà>àà>Ùà>Òà>Ëà>Äà>½à>¶à>¯à>¨à>¡à>šà>“à>Œà>…à>~à>wà>pà>ià>bà>[à>Tà>Mà>Fà>?à>8à>1à>*à>#à>à>à>à>à>à>ùß>òß>ëß>äß>Ýß>Öß>Ïß>Èß>Áß>ºß>³ß>¬ß>¥ß>žß>—ß>ß>‰ß>‚ß>{ß>tß>mß>fß>_ß>Xß>Qß>Jß>Cß><ß>5ß>.ß>'ß> ß>ß>ß> ß>ß>ýÞ>öÞ>ïÞ>èÞ>áÞ>ÚÞ>ÓÞ>ÌÞ>ÅÞ>¾Þ>·Þ>°Þ>©Þ>¢Þ>›Þ>”Þ>Þ>†Þ>Þ>xÞ>qÞ>jÞ>cÞ>\Þ>UÞ>NÞ>GÞ>@Þ>9Þ>2Þ>+Þ>$Þ>Þ>Þ>Þ>Þ>Þ>úÝ>óÝ>ìÝ>åÝ>ÞÝ>×Ý>ÐÝ>ÉÝ>ÂÝ>»Ý>´Ý>­Ý>¦Ý>ŸÝ>˜Ý>‘Ý>ŠÝ>ƒÝ>|Ý>uÝ>nÝ>gÝ>`Ý>YÝ>RÝ>KÝ>DÝ>=Ý>6Ý>/Ý>(Ý>!Ý>Ý>Ý> Ý>Ý>þÜ>÷Ü>ðÜ>éÜ>âÜ>ÛÜ>ÔÜ>ÍÜ>ÆÜ>¿Ü>¸Ü>±Ü>ªÜ>£Ü>œÜ>•Ü>ŽÜ>‡Ü>€Ü>yÜ>rÜ>kÜ>dÜ>]Ü>VÜ>OÜ>HÜ>AÜ>:Ü>3Ü>,Ü>%Ü>Ü>Ü>Ü> Ü>Ü>ûÛ>ôÛ>íÛ>æÛ>ßÛ>ØÛ>ÑÛ>ÊÛ>ÃÛ>¼Û>µÛ>®Û>§Û> Û>™Û>’Û>‹Û>„Û>}Û>vÛ>oÛ>hÛ>aÛ>ZÛ>SÛ>LÛ>EÛ>>Û>7Û>0Û>)Û>"Û>Û>Û> Û>Û>ÿÚ>øÚ>ñÚ>êÚ>ãÚ>ÜÚ>ÕÚ>ÎÚ>ÇÚ>ÀÚ>¹Ú>²Ú>«Ú>¤Ú>Ú>–Ú>Ú>ˆÚ>Ú>zÚ>sÚ>lÚ>eÚ>^Ú>WÚ>PÚ>IÚ>BÚ>;Ú>4Ú>-Ú>&Ú>Ú>Ú>Ú> Ú>Ú>üÙ>õÙ>îÙ>çÙ>àÙ>ÙÙ>ÒÙ>ËÙ>ÄÙ>½Ù>¶Ù>¯Ù>¨Ù>¡Ù>šÙ>“Ù>ŒÙ>…Ù>~Ù>wÙ>pÙ>iÙ>bÙ>[Ù>TÙ>MÙ>FÙ>?Ù>8Ù>1Ù>*Ù>#Ù>Ù>Ù>Ù>Ù>Ù>ùØ>òØ>ëØ>äØ>ÝØ>ÖØ>ÏØ>ÈØ>ÁØ>ºØ>³Ø>¬Ø>¥Ø>žØ>—Ø>Ø>‰Ø>‚Ø>{Ø>tØ>mØ>fØ>_Ø>XØ>QØ>JØ>CØ><Ø>5Ø>.Ø>'Ø> Ø>Ø>Ø> Ø>Ø>ý×>ö×>ï×>è×>á×>Ú×>Ó×>Ì×>Å×>¾×>·×>°×>©×>¢×>›×>”×>×>†×>×>x×>q×>j×>c×>\×>U×>N×>G×>@×>9×>2×>+×>$×>×>×>×>×>×>úÖ>óÖ>ìÖ>åÖ>ÞÖ>×Ö>ÐÖ>ÉÖ>ÂÖ>»Ö>´Ö>­Ö>¦Ö>ŸÖ>˜Ö>‘Ö>ŠÖ>ƒÖ>|Ö>uÖ>nÖ>gÖ>`Ö>YÖ>RÖ>KÖ>DÖ>=Ö>6Ö>/Ö>(Ö>!Ö>Ö>Ö> Ö>Ö>þÕ>÷Õ>ðÕ>éÕ>âÕ>ÛÕ>ÔÕ>ÍÕ>ÆÕ>¿Õ>¸Õ>±Õ>ªÕ>£Õ>œÕ>•Õ>ŽÕ>‡Õ>€Õ>yÕ>rÕ>kÕ>dÕ>]Õ>VÕ>OÕ>HÕ>AÕ>:Õ>3Õ>,Õ>%Õ>Õ>Õ>Õ> Õ>Õ>ûÔ>ôÔ>íÔ>æÔ>ßÔ>ØÔ>ÑÔ>ÊÔ>ÃÔ>¼Ô>µÔ>®Ô>§Ô> Ô>™Ô>’Ô>‹Ô>„Ô>}Ô>vÔ>oÔ>hÔ>aÔ>ZÔ>SÔ>LÔ>EÔ>>Ô>7Ô>0Ô>)Ô>"Ô>Ô>Ô> Ô>Ô>ÿÓ>øÓ>ñÓ>êÓ>ãÓ>ÜÓ>ÕÓ>ÎÓ>ÇÓ>ÀÓ>¹Ó>²Ó>«Ó>¤Ó>Ó>–Ó>Ó>ˆÓ>Ó>zÓ>sÓ>lÓ>eÓ>^Ó>WÓ>PÓ>IÓ>BÓ>;Ó>4Ó>-Ó>&Ó>Ó>Ó>Ó> Ó>Ó>üÒ>õÒ>îÒ>çÒ>àÒ>ÙÒ>ÒÒ>ËÒ>ÄÒ>½Ò>¶Ò>¯Ò>¨Ò>¡Ò>šÒ>“Ò>ŒÒ>…Ò>~Ò>wÒ>pÒ>iÒ>bÒ>[Ò>TÒ>MÒ>FÒ>?Ò>8Ò>1Ò>*Ò>#Ò>Ò>Ò>Ò>Ò>Ò>ùÑ>òÑ>ëÑ>äÑ>ÝÑ>ÖÑ>ÏÑ>ÈÑ>ÁÑ>ºÑ>³Ñ>¬Ñ>¥Ñ>žÑ>—Ñ>Ñ>‰Ñ>‚Ñ>{Ñ>tÑ>mÑ>fÑ>_Ñ>XÑ>QÑ>JÑ>CÑ><Ñ>5Ñ>.Ñ>'Ñ> Ñ>Ñ>Ñ> Ñ>Ñ>ýÐ>öÐ>ïÐ>èÐ>áÐ>ÚÐ>ÓÐ>ÌÐ>ÅÐ>¾Ð>·Ð>°Ð>©Ð>¢Ð>›Ð>”Ð>Ð>†Ð>Ð>xÐ>qÐ>jÐ>cÐ>\Ð>UÐ>NÐ>GÐ>@Ð>9Ð>2Ð>+Ð>$Ð>Ð>Ð>Ð>Ð>Ð>úÏ>óÏ>ìÏ>åÏ>ÞÏ>×Ï>ÐÏ>ÉÏ>ÂÏ>»Ï>´Ï>­Ï>¦Ï>ŸÏ>˜Ï>‘Ï>ŠÏ>ƒÏ>|Ï>uÏ>nÏ>gÏ>`Ï>YÏ>RÏ>KÏ>DÏ>=Ï>6Ï>/Ï>(Ï>!Ï>Ï>Ï> Ï>Ï>þÎ>÷Î>ðÎ>éÎ>âÎ>ÛÎ>ÔÎ>ÍÎ>ÆÎ>¿Î>¸Î>±Î>ªÎ>£Î>œÎ>•Î>ŽÎ>‡Î>€Î>yÎ>rÎ>kÎ>dÎ>]Î>VÎ>OÎ>HÎ>AÎ>:Î>3Î>,Î>%Î>Î>Î>Î> Î>Î>ûÍ>ôÍ>íÍ>æÍ>ßÍ>ØÍ>ÑÍ>ÊÍ>ÃÍ>¼Í>µÍ>®Í>§Í> Í>™Í>’Í>‹Í>„Í>}Í>vÍ>oÍ>hÍ>aÍ>ZÍ>SÍ>LÍ>EÍ>>Í>7Í>0Í>)Í>"Í>Í>Í> Í>Í>ÿÌ>øÌ>ñÌ>êÌ>ãÌ>ÜÌ>ÕÌ>ÎÌ>ÇÌ>ÀÌ>¹Ì>²Ì>«Ì>¤Ì>Ì>–Ì>Ì>ˆÌ>Ì>zÌ>sÌ>lÌ>eÌ>^Ì>WÌ>PÌ>IÌ>BÌ>;Ì>4Ì>-Ì>&Ì>Ì>Ì>Ì> Ì>Ì>üË>õË>îË>çË>àË>ÙË>ÒË>ËË>ÄË>½Ë>¶Ë>¯Ë>¨Ë>¡Ë>šË>“Ë>ŒË>…Ë>~Ë>wË>pË>iË>bË>[Ë>TË>MË>FË>?Ë>8Ë>1Ë>*Ë>#Ë>Ë>Ë>Ë>Ë>Ë>ùÊ>òÊ>ëÊ>äÊ>ÝÊ>ÖÊ>ÏÊ>ÈÊ>ÁÊ>ºÊ>³Ê>¬Ê>¥Ê>žÊ>—Ê>Ê>‰Ê>‚Ê>{Ê>tÊ>mÊ>fÊ>_Ê>XÊ>QÊ>JÊ>CÊ><Ê>5Ê>.Ê>'Ê> Ê>Ê>Ê> Ê>Ê>ýÉ>öÉ>ïÉ>èÉ>áÉ>ÚÉ>ÓÉ>ÌÉ>ÅÉ>¾É>·É>°É>©É>¢É>›É>”É>É>†É>É>xÉ>qÉ>jÉ>cÉ>\É>UÉ>NÉ>GÉ>@É>9É>2É>+É>$É>É>É>É>É>É>úÈ>óÈ>ìÈ>åÈ>ÞÈ>×È>ÐÈ>ÉÈ>ÂÈ>»È>´È>­È>¦È>ŸÈ>˜È>‘È>ŠÈ>ƒÈ>|È>uÈ>nÈ>gÈ>`È>YÈ>RÈ>KÈ>DÈ>=È>6È>/È>(È>!È>È>È> È>È>þÇ>÷Ç>ðÇ>éÇ>âÇ>ÛÇ>ÔÇ>ÍÇ>ÆÇ>¿Ç>¸Ç>±Ç>ªÇ>£Ç>œÇ>•Ç>ŽÇ>‡Ç>€Ç>yÇ>rÇ>kÇ>dÇ>]Ç>VÇ>OÇ>HÇ>AÇ>:Ç>3Ç>,Ç>%Ç>Ç>Ç>Ç> Ç>Ç>ûÆ>ôÆ>íÆ>æÆ>߯>ØÆ>ÑÆ>ÊÆ>ÃÆ>¼Æ>µÆ>®Æ>§Æ> Æ>™Æ>’Æ>‹Æ>„Æ>}Æ>vÆ>oÆ>hÆ>aÆ>ZÆ>SÆ>LÆ>EÆ>>Æ>7Æ>0Æ>)Æ>"Æ>Æ>Æ> Æ>Æ>ÿÅ>øÅ>ñÅ>êÅ>ãÅ>ÜÅ>ÕÅ>ÎÅ>ÇÅ>ÀÅ>¹Å>²Å>«Å>¤Å>Å>–Å>Å>ˆÅ>Å>zÅ>sÅ>lÅ>eÅ>^Å>WÅ>PÅ>IÅ>BÅ>;Å>4Å>-Å>&Å>Å>Å>Å> Å>Å>üÄ>õÄ>îÄ>çÄ>àÄ>ÙÄ>ÒÄ>ËÄ>ÄÄ>½Ä>¶Ä>¯Ä>¨Ä>¡Ä>šÄ>“Ä>ŒÄ>…Ä>~Ä>wÄ>pÄ>iÄ>bÄ>[Ä>TÄ>MÄ>FÄ>?Ä>8Ä>1Ä>*Ä>#Ä>Ä>Ä>Ä>Ä>Ä>ùÃ>òÃ>ëÃ>äÃ>ÝÃ>ÖÃ>ÏÃ>ÈÃ>ÁÃ>ºÃ>³Ã>¬Ã>¥Ã>žÃ>—Ã>Ã>‰Ã>‚Ã>{Ã>tÃ>mÃ>fÃ>_Ã>XÃ>QÃ>JÃ>CÃ><Ã>5Ã>.Ã>'Ã> Ã>Ã>Ã> Ã>Ã>ýÂ>öÂ>ïÂ>èÂ>áÂ>ÚÂ>ÓÂ>ÌÂ>ÅÂ>¾Â>·Â>°Â>©Â>¢Â>›Â>”Â>Â>†Â>Â>xÂ>qÂ>jÂ>cÂ>\Â>UÂ>NÂ>GÂ>@Â>9Â>2Â>+Â>$Â>Â>Â>Â>Â>Â>úÁ>óÁ>ìÁ>åÁ>ÞÁ>×Á>ÐÁ>ÉÁ>ÂÁ>»Á>´Á>­Á>¦Á>ŸÁ>˜Á>‘Á>ŠÁ>ƒÁ>|Á>uÁ>nÁ>gÁ>`Á>YÁ>RÁ>KÁ>DÁ>=Á>6Á>/Á>(Á>!Á>Á>Á> Á>Á>þÀ>÷À>ðÀ>éÀ>âÀ>ÛÀ>ÔÀ>ÍÀ>ÆÀ>¿À>¸À>±À>ªÀ>£À>œÀ>•À>ŽÀ>‡À>€À>yÀ>rÀ>kÀ>dÀ>]À>VÀ>OÀ>HÀ>AÀ>:À>3À>,À>%À>À>À>À> À>À>û¿>ô¿>í¿>æ¿>ß¿>Ø¿>Ñ¿>Ê¿>ÿ>¼¿>µ¿>®¿>§¿> ¿>™¿>’¿>‹¿>„¿>}¿>v¿>o¿>h¿>a¿>Z¿>S¿>L¿>E¿>>¿>7¿>0¿>)¿>"¿>¿>¿> ¿>¿>ÿ¾>ø¾>ñ¾>ê¾>ã¾>ܾ>Õ¾>ξ>Ǿ>À¾>¹¾>²¾>«¾>¤¾>¾>–¾>¾>ˆ¾>¾>z¾>s¾>l¾>e¾>^¾>W¾>P¾>I¾>B¾>;¾>4¾>-¾>&¾>¾>¾>¾> ¾>¾>ü½>õ½>î½>ç½>à½>Ù½>Ò½>˽>Ľ>½½>¶½>¯½>¨½>¡½>š½>“½>Œ½>…½>~½>w½>p½>i½>b½>[½>T½>M½>F½>?½>8½>1½>*½>#½>½>½>½>½>½>ù¼>ò¼>ë¼>ä¼>ݼ>Ö¼>ϼ>ȼ>Á¼>º¼>³¼>¬¼>¥¼>ž¼>—¼>¼>‰¼>‚¼>{¼>t¼>m¼>f¼>_¼>X¼>Q¼>J¼>C¼><¼>5¼>.¼>'¼> ¼>¼>¼> ¼>¼>ý»>ö»>ï»>è»>á»>Ú»>Ó»>Ì»>Å»>¾»>·»>°»>©»>¢»>›»>”»>»>†»>»>x»>q»>j»>c»>\»>U»>N»>G»>@»>9»>2»>+»>$»>»>»>»>»>»>úº>óº>ìº>åº>Þº>׺>к>ɺ>º>»º>´º>­º>¦º>Ÿº>˜º>‘º>Šº>ƒº>|º>uº>nº>gº>`º>Yº>Rº>Kº>Dº>=º>6º>/º>(º>!º>º>º> º>º>þ¹>÷¹>ð¹>é¹>â¹>Û¹>Ô¹>͹>ƹ>¿¹>¸¹>±¹>ª¹>£¹>œ¹>•¹>޹>‡¹>€¹>y¹>r¹>k¹>d¹>]¹>V¹>O¹>H¹>A¹>:¹>3¹>,¹>%¹>¹>¹>¹> ¹>¹>û¸>ô¸>í¸>æ¸>߸>ظ>Ѹ>ʸ>ø>¼¸>µ¸>®¸>§¸> ¸>™¸>’¸>‹¸>„¸>}¸>v¸>o¸>h¸>a¸>Z¸>S¸>L¸>E¸>>¸>7¸>0¸>)¸>"¸>¸>¸> ¸>¸>ÿ·>ø·>ñ·>ê·>ã·>Ü·>Õ·>η>Ç·>À·>¹·>²·>«·>¤·>·>–·>·>ˆ·>·>z·>s·>l·>e·>^·>W·>P·>I·>B·>;·>4·>-·>&·>·>·>·> ·>·>ü¶>õ¶>î¶>ç¶>à¶>Ù¶>Ò¶>˶>Ķ>½¶>¶¶>¯¶>¨¶>¡¶>š¶>“¶>Œ¶>…¶>~¶>w¶>p¶>i¶>b¶>[¶>T¶>M¶>F¶>?¶>8¶>1¶>*¶>#¶>¶>¶>¶>¶>¶>ùµ>òµ>ëµ>äµ>ݵ>Öµ>ϵ>ȵ>Áµ>ºµ>³µ>¬µ>¥µ>žµ>—µ>µ>‰µ>‚µ>{µ>tµ>mµ>fµ>_µ>Xµ>Qµ>Jµ>Cµ><µ>5µ>.µ>'µ> µ>µ>µ> µ>µ>ý´>ö´>ï´>è´>á´>Ú´>Ó´>Ì´>Å´>¾´>·´>°´>©´>¢´>›´>”´>´>†´>´>x´>q´>j´>c´>\´>U´>N´>G´>@´>9´>2´>+´>$´>´>´>´>´>´>ú³>ó³>ì³>å³>Þ³>׳>г>ɳ>³>»³>´³>­³>¦³>Ÿ³>˜³>‘³>г>ƒ³>|³>u³>n³>g³>`³>Y³>R³>K³>D³>=³>6³>/³>(³>!³>³>³> ³>³>þ²>÷²>ð²>é²>â²>Û²>Ô²>Ͳ>Ʋ>¿²>¸²>±²>ª²>£²>œ²>•²>޲>‡²>€²>y²>r²>k²>d²>]²>V²>O²>H²>A²>:²>3²>,²>%²>²>²>²> ²>²>û±>ô±>í±>æ±>ß±>ر>ѱ>ʱ>ñ>¼±>µ±>®±>§±> ±>™±>’±>‹±>„±>}±>v±>o±>h±>a±>Z±>S±>L±>E±>>±>7±>0±>)±>"±>±>±> ±>±>ÿ°>ø°>ñ°>ê°>ã°>ܰ>Õ°>ΰ>ǰ>À°>¹°>²°>«°>¤°>°>–°>°>ˆ°>°>z°>s°>l°>e°>^°>W°>P°>I°>B°>;°>4°>-°>&°>°>°>°> °>°>ü¯>õ¯>î¯>ç¯>à¯>Ù¯>Ò¯>˯>į>½¯>¶¯>¯¯>¨¯>¡¯>š¯>“¯>Œ¯>…¯>~¯>w¯>p¯>i¯>b¯>[¯>T¯>M¯>F¯>?¯>8¯>1¯>*¯>#¯>¯>¯>¯>¯>¯>ù®>ò®>ë®>ä®>Ý®>Ö®>Ï®>È®>Á®>º®>³®>¬®>¥®>ž®>—®>®>‰®>‚®>{®>t®>m®>f®>_®>X®>Q®>J®>C®><®>5®>.®>'®> ®>®>®> ®>®>ý­>ö­>ï­>è­>á­>Ú­>Ó­>Ì­>Å­>¾­>·­>°­>©­>¢­>›­>”­>­>†­>­>x­>q­>j­>c­>\­>U­>N­>G­>@­>9­>2­>+­>$­>­>­>­>­>­>ú¬>ó¬>ì¬>å¬>Þ¬>׬>Ь>ɬ>¬>»¬>´¬>­¬>¦¬>Ÿ¬>˜¬>‘¬>Ь>ƒ¬>|¬>u¬>n¬>g¬>`¬>Y¬>R¬>K¬>D¬>=¬>6¬>/¬>(¬>!¬>¬>¬> ¬>¬>þ«>÷«>ð«>é«>â«>Û«>Ô«>Í«>Æ«>¿«>¸«>±«>ª«>£«>œ«>•«>Ž«>‡«>€«>y«>r«>k«>d«>]«>V«>O«>H«>A«>:«>3«>,«>%«>«>«>«> «>«>ûª>ôª>íª>æª>ߪ>ت>Ѫ>ʪ>ê>¼ª>µª>®ª>§ª> ª>™ª>’ª>‹ª>„ª>}ª>vª>oª>hª>aª>Zª>Sª>Lª>Eª>>ª>7ª>0ª>)ª>"ª>ª>ª> ª>ª>ÿ©>ø©>ñ©>ê©>ã©>Ü©>Õ©>Ω>Ç©>À©>¹©>²©>«©>¤©>©>–©>©>ˆ©>©>z©>s©>l©>e©>^©>W©>P©>I©>B©>;©>4©>-©>&©>©>©>©> ©>©>ü¨>õ¨>î¨>ç¨>à¨>Ù¨>Ò¨>˨>Ĩ>½¨>¶¨>¯¨>¨¨>¡¨>š¨>“¨>Œ¨>…¨>~¨>w¨>p¨>i¨>b¨>[¨>T¨>M¨>F¨>?¨>8¨>1¨>*¨>#¨>¨>¨>¨>¨>¨>ù§>ò§>ë§>ä§>ݧ>Ö§>ϧ>ȧ>Á§>º§>³§>¬§>¥§>ž§>—§>§>‰§>‚§>{§>t§>m§>f§>_§>X§>Q§>J§>C§><§>5§>.§>'§> §>§>§> §>§>ý¦>ö¦>ï¦>è¦>á¦>Ú¦>Ó¦>̦>Ŧ>¾¦>·¦>°¦>©¦>¢¦>›¦>”¦>¦>†¦>¦>x¦>q¦>j¦>c¦>\¦>U¦>N¦>G¦>@¦>9¦>2¦>+¦>$¦>¦>¦>¦>¦>¦>ú¥>ó¥>ì¥>å¥>Þ¥>×¥>Ð¥>É¥>Â¥>»¥>´¥>­¥>¦¥>Ÿ¥>˜¥>‘¥>Š¥>ƒ¥>|¥>u¥>n¥>g¥>`¥>Y¥>R¥>K¥>D¥>=¥>6¥>/¥>(¥>!¥>¥>¥> ¥>¥>þ¤>÷¤>ð¤>é¤>â¤>Û¤>Ô¤>ͤ>Ƥ>¿¤>¸¤>±¤>ª¤>£¤>œ¤>•¤>ޤ>‡¤>€¤>y¤>r¤>k¤>d¤>]¤>V¤>O¤>H¤>A¤>:¤>3¤>,¤>%¤>¤>¤>¤> ¤>¤>û£>ô£>í£>æ£>ߣ>Ø£>Ñ£>Ê£>ã>¼£>µ£>®£>§£> £>™£>’£>‹£>„£>}£>v£>o£>h£>a£>Z£>S£>L£>E£>>£>7£>0£>)£>"£>£>£> £>£>ÿ¢>ø¢>ñ¢>ê¢>ã¢>Ü¢>Õ¢>΢>Ç¢>À¢>¹¢>²¢>«¢>¤¢>¢>–¢>¢>ˆ¢>¢>z¢>s¢>l¢>e¢>^¢>W¢>P¢>I¢>B¢>;¢>4¢>-¢>&¢>¢>¢>¢> ¢>¢>ü¡>õ¡>î¡>ç¡>à¡>Ù¡>Ò¡>Ë¡>Ä¡>½¡>¶¡>¯¡>¨¡>¡¡>š¡>“¡>Œ¡>…¡>~¡>w¡>p¡>i¡>b¡>[¡>T¡>M¡>F¡>?¡>8¡>1¡>*¡>#¡>¡>¡>¡>¡>¡>ù >ò >ë >ä >Ý >Ö >Ï >È >Á >º >³ >¬ >¥ >ž >— > >‰ >‚ >{ >t >m >f >_ >X >Q >J >C >< >5 >. >' >  > > >  > >ýŸ>öŸ>ïŸ>èŸ>áŸ>ÚŸ>ÓŸ>ÌŸ>ÅŸ>¾Ÿ>·Ÿ>°Ÿ>©Ÿ>¢Ÿ>›Ÿ>”Ÿ>Ÿ>†Ÿ>Ÿ>xŸ>qŸ>jŸ>cŸ>\Ÿ>UŸ>NŸ>GŸ>@Ÿ>9Ÿ>2Ÿ>+Ÿ>$Ÿ>Ÿ>Ÿ>Ÿ>Ÿ>Ÿ>úž>óž>ìž>åž>Þž>מ>О>Éž>ž>»ž>´ž>­ž>¦ž>Ÿž>˜ž>‘ž>Šž>ƒž>|ž>už>nž>gž>`ž>Yž>Rž>Kž>Dž>=ž>6ž>/ž>(ž>!ž>ž>ž> ž>ž>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>ûœ>ôœ>íœ>æœ>ßœ>Øœ>Ñœ>Êœ>Ü>¼œ>µœ>®œ>§œ> œ>™œ>’œ>‹œ>„œ>}œ>vœ>oœ>hœ>aœ>Zœ>Sœ>Lœ>Eœ>>œ>7œ>0œ>)œ>"œ>œ>œ> œ>œ>ÿ›>ø›>ñ›>ê›>ã›>Ü›>Õ›>Λ>Ç›>À›>¹›>²›>«›>¤›>›>–›>›>ˆ›>›>z›>s›>l›>e›>^›>W›>P›>I›>B›>;›>4›>-›>&›>›>›>›> ›>›>üš>õš>îš>çš>àš>Ùš>Òš>Ëš>Äš>½š>¶š>¯š>¨š>¡š>šš>“š>Œš>…š>~š>wš>pš>iš>bš>[š>Tš>Mš>Fš>?š>8š>1š>*š>#š>š>š>š>š>š>ù™>ò™>ë™>ä™>Ý™>Ö™>Ï™>È™>Á™>º™>³™>¬™>¥™>ž™>—™>™>‰™>‚™>{™>t™>m™>f™>_™>X™>Q™>J™>C™><™>5™>.™>'™> ™>™>™> ™>™>ý˜>ö˜>ï˜>è˜>á˜>Ú˜>Ó˜>̘>Ř>¾˜>·˜>°˜>©˜>¢˜>›˜>”˜>˜>†˜>˜>x˜>q˜>j˜>c˜>\˜>U˜>N˜>G˜>@˜>9˜>2˜>+˜>$˜>˜>˜>˜>˜>˜>ú—>ó—>ì—>å—>Þ—>×—>З>É—>—>»—>´—>­—>¦—>Ÿ—>˜—>‘—>Š—>ƒ—>|—>u—>n—>g—>`—>Y—>R—>K—>D—>=—>6—>/—>(—>!—>—>—> —>—>þ–>÷–>ð–>é–>â–>Û–>Ô–>Í–>Æ–>¿–>¸–>±–>ª–>£–>œ–>•–>Ž–>‡–>€–>y–>r–>k–>d–>]–>V–>O–>H–>A–>:–>3–>,–>%–>–>–>–> –>–>û•>ô•>í•>æ•>ß•>Ø•>Ñ•>Ê•>Õ>¼•>µ•>®•>§•> •>™•>’•>‹•>„•>}•>v•>o•>h•>a•>Z•>S•>L•>E•>>•>7•>0•>)•>"•>•>•> •>•>ÿ”>ø”>ñ”>ê”>ã”>Ü”>Õ”>Δ>Ç”>À”>¹”>²”>«”>¤”>”>–”>”>ˆ”>”>z”>s”>l”>e”>^”>W”>P”>I”>B”>;”>4”>-”>&”>”>”>”> ”>”>ü“>õ“>î“>ç“>à“>Ù“>Ò“>Ë“>Ä“>½“>¶“>¯“>¨“>¡“>š“>““>Œ“>…“>~“>w“>p“>i“>b“>[“>T“>M“>F“>?“>8“>1“>*“>#“>“>“>“>“>“>ù’>ò’>ë’>ä’>Ý’>Ö’>Ï’>È’>Á’>º’>³’>¬’>¥’>ž’>—’>’>‰’>‚’>{’>t’>m’>f’>_’>X’>Q’>J’>C’><’>5’>.’>'’> ’>’>’> ’>’>ý‘>ö‘>ï‘>è‘>á‘>Ú‘>Ó‘>Ì‘>Å‘>¾‘>·‘>°‘>©‘>¢‘>›‘>”‘>‘>†‘>‘>x‘>q‘>j‘>c‘>\‘>U‘>N‘>G‘>@‘>9‘>2‘>+‘>$‘>‘>‘>‘>‘>‘>ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>ûŽ>ôŽ>íŽ>æŽ>ߎ>ØŽ>ÑŽ>ÊŽ>ÃŽ>¼Ž>µŽ>®Ž>§Ž> Ž>™Ž>’Ž>‹Ž>„Ž>}Ž>vŽ>oŽ>hŽ>aŽ>ZŽ>SŽ>LŽ>EŽ>>Ž>7Ž>0Ž>)Ž>"Ž>Ž>Ž> Ž>Ž>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>üŒ>õŒ>îŒ>çŒ>àŒ>ÙŒ>ÒŒ>ËŒ>ÄŒ>½Œ>¶Œ>¯Œ>¨Œ>¡Œ>šŒ>“Œ>ŒŒ>…Œ>~Œ>wŒ>pŒ>iŒ>bŒ>[Œ>TŒ>MŒ>FŒ>?Œ>8Œ>1Œ>*Œ>#Œ>Œ>Œ>Œ>Œ>Œ>ù‹>ò‹>ë‹>ä‹>Ý‹>Ö‹>Ï‹>È‹>Á‹>º‹>³‹>¬‹>¥‹>ž‹>—‹>‹>‰‹>‚‹>{‹>t‹>m‹>f‹>_‹>X‹>Q‹>J‹>C‹><‹>5‹>.‹>'‹> ‹>‹>‹> ‹>‹>ýŠ>öŠ>ïŠ>èŠ>áŠ>ÚŠ>ÓŠ>ÌŠ>ÅŠ>¾Š>·Š>°Š>©Š>¢Š>›Š>”Š>Š>†Š>Š>xŠ>qŠ>jŠ>cŠ>\Š>UŠ>NŠ>GŠ>@Š>9Š>2Š>+Š>$Š>Š>Š>Š>Š>Š>ú‰>ó‰>ì‰>å‰>Þ‰>׉>Љ>ɉ>‰>»‰>´‰>­‰>¦‰>Ÿ‰>˜‰>‘‰>Љ>ƒ‰>|‰>u‰>n‰>g‰>`‰>Y‰>R‰>K‰>D‰>=‰>6‰>/‰>(‰>!‰>‰>‰> ‰>‰>þˆ>÷ˆ>ðˆ>éˆ>âˆ>Ûˆ>Ôˆ>͈>ƈ>¿ˆ>¸ˆ>±ˆ>ªˆ>£ˆ>œˆ>•ˆ>Žˆ>‡ˆ>€ˆ>yˆ>rˆ>kˆ>dˆ>]ˆ>Vˆ>Oˆ>Hˆ>Aˆ>:ˆ>3ˆ>,ˆ>%ˆ>ˆ>ˆ>ˆ> ˆ>ˆ>û‡>ô‡>í‡>æ‡>߇>؇>ч>ʇ>Ç>¼‡>µ‡>®‡>§‡> ‡>™‡>’‡>‹‡>„‡>}‡>v‡>o‡>h‡>a‡>Z‡>S‡>L‡>E‡>>‡>7‡>0‡>)‡>"‡>‡>‡> ‡>‡>ÿ†>ø†>ñ†>ê†>ã†>܆>Õ†>Ά>dž>À†>¹†>²†>«†>¤†>†>–†>†>ˆ†>†>z†>s†>l†>e†>^†>W†>P†>I†>B†>;†>4†>-†>&†>†>†>†> †>†>ü…>õ…>î…>ç…>à…>Ù…>Ò…>Ë…>Ä…>½…>¶…>¯…>¨…>¡…>š…>“…>Œ…>……>~…>w…>p…>i…>b…>[…>T…>M…>F…>?…>8…>1…>*…>#…>…>…>…>…>…>ù„>ò„>ë„>ä„>Ý„>Ö„>Ï„>È„>Á„>º„>³„>¬„>¥„>ž„>—„>„>‰„>‚„>{„>t„>m„>f„>_„>X„>Q„>J„>C„><„>5„>.„>'„> „>„>„> „>„>ýƒ>öƒ>ïƒ>èƒ>áƒ>Úƒ>Óƒ>̃>Ń>¾ƒ>·ƒ>°ƒ>©ƒ>¢ƒ>›ƒ>”ƒ>ƒ>†ƒ>ƒ>xƒ>qƒ>jƒ>cƒ>\ƒ>Uƒ>Nƒ>Gƒ>@ƒ>9ƒ>2ƒ>+ƒ>$ƒ>ƒ>ƒ>ƒ>ƒ>ƒ>ú‚>ó‚>ì‚>å‚>Þ‚>ׂ>Ђ>É‚>‚>»‚>´‚>­‚>¦‚>Ÿ‚>˜‚>‘‚>Š‚>ƒ‚>|‚>u‚>n‚>g‚>`‚>Y‚>R‚>K‚>D‚>=‚>6‚>/‚>(‚>!‚>‚>‚> ‚>‚>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û€>ô€>í€>æ€>߀>Ø€>Ñ€>Ê€>À>¼€>µ€>®€>§€> €>™€>’€>‹€>„€>}€>v€>o€>h€>a€>Z€>S€>L€>E€>>€>7€>0€>)€>"€>€>€> €>€>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü~>õ~>î~>ç~>à~>Ù~>Ò~>Ë~>Ä~>½~>¶~>¯~>¨~>¡~>š~>“~>Œ~>…~>~~>w~>p~>i~>b~>[~>T~>M~>F~>?~>8~>1~>*~>#~>~>~>~>~>~>ù}>ò}>ë}>ä}>Ý}>Ö}>Ï}>È}>Á}>º}>³}>¬}>¥}>ž}>—}>}>‰}>‚}>{}>t}>m}>f}>_}>X}>Q}>J}>C}><}>5}>.}>'}> }>}>}> }>}>ý|>ö|>ï|>è|>á|>Ú|>Ó|>Ì|>Å|>¾|>·|>°|>©|>¢|>›|>”|>|>†|>|>x|>q|>j|>c|>\|>U|>N|>G|>@|>9|>2|>+|>$|>|>|>|>|>|>ú{>ó{>ì{>å{>Þ{>×{>Ð{>É{>Â{>»{>´{>­{>¦{>Ÿ{>˜{>‘{>Š{>ƒ{>|{>u{>n{>g{>`{>Y{>R{>K{>D{>={>6{>/{>({>!{>{>{> {>{>þz>÷z>ðz>éz>âz>Ûz>Ôz>Íz>Æz>¿z>¸z>±z>ªz>£z>œz>•z>Žz>‡z>€z>yz>rz>kz>dz>]z>Vz>Oz>Hz>Az>:z>3z>,z>%z>z>z>z> z>z>ûy>ôy>íy>æy>ßy>Øy>Ñy>Êy>Ãy>¼y>µy>®y>§y> y>™y>’y>‹y>„y>}y>vy>oy>hy>ay>Zy>Sy>Ly>Ey>>y>7y>0y>)y>"y>y>y> y>y>ÿx>øx>ñx>êx>ãx>Üx>Õx>Îx>Çx>Àx>¹x>²x>«x>¤x>x>–x>x>ˆx>x>zx>sx>lx>ex>^x>Wx>Px>Ix>Bx>;x>4x>-x>&x>x>x>x> x>x>üw>õw>îw>çw>àw>Ùw>Òw>Ëw>Äw>½w>¶w>¯w>¨w>¡w>šw>“w>Œw>…w>~w>ww>pw>iw>bw>[w>Tw>Mw>Fw>?w>8w>1w>*w>#w>w>w>w>w>w>ùv>òv>ëv>äv>Ýv>Öv>Ïv>Èv>Áv>ºv>³v>¬v>¥v>žv>—v>v>‰v>‚v>{v>tv>mv>fv>_v>Xv>Qv>Jv>Cv>5v>.v>'v> v>v>v> v>v>ýu>öu>ïu>èu>áu>Úu>Óu>Ìu>Åu>¾u>·u>°u>©u>¢u>›u>”u>u>†u>u>xu>qu>ju>cu>\u>Uu>Nu>Gu>@u>9u>2u>+u>$u>u>u>u>u>u>út>ót>ìt>åt>Þt>×t>Ðt>Ét>Ât>»t>´t>­t>¦t>Ÿt>˜t>‘t>Št>ƒt>|t>ut>nt>gt>`t>Yt>Rt>Kt>Dt>=t>6t>/t>(t>!t>t>t> t>t>þs>÷s>ðs>és>âs>Ûs>Ôs>Ís>Æs>¿s>¸s>±s>ªs>£s>œs>•s>Žs>‡s>€s>ys>rs>ks>ds>]s>Vs>Os>Hs>As>:s>3s>,s>%s>s>s>s> s>s>ûr>ôr>ír>ær>ßr>Ør>Ñr>Êr>Ãr>¼r>µr>®r>§r> r>™r>’r>‹r>„r>}r>vr>or>hr>ar>Zr>Sr>Lr>Er>>r>7r>0r>)r>"r>r>r> r>r>ÿq>øq>ñq>êq>ãq>Üq>Õq>Îq>Çq>Àq>¹q>²q>«q>¤q>q>–q>q>ˆq>q>zq>sq>lq>eq>^q>Wq>Pq>Iq>Bq>;q>4q>-q>&q>q>q>q> q>q>üp>õp>îp>çp>àp>Ùp>Òp>Ëp>Äp>½p>¶p>¯p>¨p>¡p>šp>“p>Œp>…p>~p>wp>pp>ip>bp>[p>Tp>Mp>Fp>?p>8p>1p>*p>#p>p>p>p>p>p>ùo>òo>ëo>äo>Ýo>Öo>Ïo>Èo>Áo>ºo>³o>¬o>¥o>žo>—o>o>‰o>‚o>{o>to>mo>fo>_o>Xo>Qo>Jo>Co>5o>.o>'o> o>o>o> o>o>ýn>ön>ïn>èn>án>Ún>Ón>Ìn>Ån>¾n>·n>°n>©n>¢n>›n>”n>n>†n>n>xn>qn>jn>cn>\n>Un>Nn>Gn>@n>9n>2n>+n>$n>n>n>n>n>n>úm>óm>ìm>åm>Þm>×m>Ðm>Ém>Âm>»m>´m>­m>¦m>Ÿm>˜m>‘m>Šm>ƒm>|m>um>nm>gm>`m>Ym>Rm>Km>Dm>=m>6m>/m>(m>!m>m>m> m>m>þl>÷l>ðl>él>âl>Ûl>Ôl>Íl>Æl>¿l>¸l>±l>ªl>£l>œl>•l>Žl>‡l>€l>yl>rl>kl>dl>]l>Vl>Ol>Hl>Al>:l>3l>,l>%l>l>l>l> l>l>ûk>ôk>ík>æk>ßk>Øk>Ñk>Êk>Ãk>¼k>µk>®k>§k> k>™k>’k>‹k>„k>}k>vk>ok>hk>ak>Zk>Sk>Lk>Ek>>k>7k>0k>)k>"k>k>k> k>k>ÿj>øj>ñj>êj>ãj>Üj>Õj>Îj>Çj>Àj>¹j>²j>«j>¤j>j>–j>j>ˆj>j>zj>sj>lj>ej>^j>Wj>Pj>Ij>Bj>;j>4j>-j>&j>j>j>j> j>j>üi>õi>îi>çi>ài>Ùi>Òi>Ëi>Äi>½i>¶i>¯i>¨i>¡i>ši>“i>Œi>…i>~i>wi>pi>ii>bi>[i>Ti>Mi>Fi>?i>8i>1i>*i>#i>i>i>i>i>i>ùh>òh>ëh>äh>Ýh>Öh>Ïh>Èh>Áh>ºh>³h>¬h>¥h>žh>—h>h>‰h>‚h>{h>th>mh>fh>_h>Xh>Qh>Jh>Ch>5h>.h>'h> h>h>h> h>h>ýg>ög>ïg>èg>ág>Úg>Óg>Ìg>Åg>¾g>·g>°g>©g>¢g>›g>”g>g>†g>g>xg>qg>jg>cg>\g>Ug>Ng>Gg>@g>9g>2g>+g>$g>g>g>g>g>g>úf>óf>ìf>åf>Þf>×f>Ðf>Éf>Âf>»f>´f>­f>¦f>Ÿf>˜f>‘f>Šf>ƒf>|f>uf>nf>gf>`f>Yf>Rf>Kf>Df>=f>6f>/f>(f>!f>f>f> f>f>þe>÷e>ðe>ée>âe>Ûe>Ôe>Íe>Æe>¿e>¸e>±e>ªe>£e>œe>•e>Že>‡e>€e>ye>re>ke>de>]e>Ve>Oe>He>Ae>:e>3e>,e>%e>e>e>e> e>e>ûd>ôd>íd>æd>ßd>Ød>Ñd>Êd>Ãd>¼d>µd>®d>§d> d>™d>’d>‹d>„d>}d>vd>od>hd>ad>Zd>Sd>Ld>Ed>>d>7d>0d>)d>"d>d>d> d>d>ÿc>øc>ñc>êc>ãc>Üc>Õc>Îc>Çc>Àc>¹c>²c>«c>¤c>c>–c>c>ˆc>c>zc>sc>lc>ec>^c>Wc>Pc>Ic>Bc>;c>4c>-c>&c>c>c>c> c>c>üb>õb>îb>çb>àb>Ùb>Òb>Ëb>Äb>½b>¶b>¯b>¨b>¡b>šb>“b>Œb>…b>~b>wb>pb>ib>bb>[b>Tb>Mb>Fb>?b>8b>1b>*b>#b>b>b>b>b>b>ùa>òa>ëa>äa>Ýa>Öa>Ïa>Èa>Áa>ºa>³a>¬a>¥a>ža>—a>a>‰a>‚a>{a>ta>ma>fa>_a>Xa>Qa>Ja>Ca>5a>.a>'a> a>a>a> a>a>ý`>ö`>ï`>è`>á`>Ú`>Ó`>Ì`>Å`>¾`>·`>°`>©`>¢`>›`>”`>`>†`>`>x`>q`>j`>c`>\`>U`>N`>G`>@`>9`>2`>+`>$`>`>`>`>`>`>ú_>ó_>ì_>å_>Þ_>×_>Ð_>É_>Â_>»_>´_>­_>¦_>Ÿ_>˜_>‘_>Š_>ƒ_>|_>u_>n_>g_>`_>Y_>R_>K_>D_>=_>6_>/_>(_>!_>_>_> _>_>þ^>÷^>ð^>é^>â^>Û^>Ô^>Í^>Æ^>¿^>¸^>±^>ª^>£^>œ^>•^>Ž^>‡^>€^>y^>r^>k^>d^>]^>V^>O^>H^>A^>:^>3^>,^>%^>^>^>^> ^>^>û]>ô]>í]>æ]>ß]>Ø]>Ñ]>Ê]>Ã]>¼]>µ]>®]>§]> ]>™]>’]>‹]>„]>}]>v]>o]>h]>a]>Z]>S]>L]>E]>>]>7]>0]>)]>"]>]>]> ]>]>ÿ\>ø\>ñ\>ê\>ã\>Ü\>Õ\>Î\>Ç\>À\>¹\>²\>«\>¤\>\>–\>\>ˆ\>\>z\>s\>l\>e\>^\>W\>P\>I\>B\>;\>4\>-\>&\>\>\>\> \>\>ü[>õ[>î[>ç[>à[>Ù[>Ò[>Ë[>Ä[>½[>¶[>¯[>¨[>¡[>š[>“[>Œ[>…[>~[>w[>p[>i[>b[>[[>T[>M[>F[>?[>8[>1[>*[>#[>[>[>[>[>[>ùZ>òZ>ëZ>äZ>ÝZ>ÖZ>ÏZ>ÈZ>ÁZ>ºZ>³Z>¬Z>¥Z>žZ>—Z>Z>‰Z>‚Z>{Z>tZ>mZ>fZ>_Z>XZ>QZ>JZ>CZ>5Z>.Z>'Z> Z>Z>Z> Z>Z>ýY>öY>ïY>èY>áY>ÚY>ÓY>ÌY>ÅY>¾Y>·Y>°Y>©Y>¢Y>›Y>”Y>Y>†Y>Y>xY>qY>jY>cY>\Y>UY>NY>GY>@Y>9Y>2Y>+Y>$Y>Y>Y>Y>Y>Y>úX>óX>ìX>åX>ÞX>×X>ÐX>ÉX>ÂX>»X>´X>­X>¦X>ŸX>˜X>‘X>ŠX>ƒX>|X>uX>nX>gX>`X>YX>RX>KX>DX>=X>6X>/X>(X>!X>X>X> X>X>þW>÷W>ðW>éW>âW>ÛW>ÔW>ÍW>ÆW>¿W>¸W>±W>ªW>£W>œW>•W>ŽW>‡W>€W>yW>rW>kW>dW>]W>VW>OW>HW>AW>:W>3W>,W>%W>W>W>W> W>W>ûV>ôV>íV>æV>ßV>ØV>ÑV>ÊV>ÃV>¼V>µV>®V>§V> V>™V>’V>‹V>„V>}V>vV>oV>hV>aV>ZV>SV>LV>EV>>V>7V>0V>)V>"V>V>V> V>V>ÿU>øU>ñU>êU>ãU>ÜU>ÕU>ÎU>ÇU>ÀU>¹U>²U>«U>¤U>U>–U>U>ˆU>U>zU>sU>lU>eU>^U>WU>PU>IU>BU>;U>4U>-U>&U>U>U>U> U>U>üT>õT>îT>çT>àT>ÙT>ÒT>ËT>ÄT>½T>¶T>¯T>¨T>¡T>šT>“T>ŒT>…T>~T>wT>pT>iT>bT>[T>TT>MT>FT>?T>8T>1T>*T>#T>T>T>T>T>T>ùS>òS>ëS>äS>ÝS>ÖS>ÏS>ÈS>ÁS>ºS>³S>¬S>¥S>žS>—S>S>‰S>‚S>{S>tS>mS>fS>_S>XS>QS>JS>CS>5S>.S>'S> S>S>S> S>S>ýR>öR>ïR>èR>áR>ÚR>ÓR>ÌR>ÅR>¾R>·R>°R>©R>¢R>›R>”R>R>†R>R>xR>qR>jR>cR>\R>UR>NR>GR>@R>9R>2R>+R>$R>R>R>R>R>R>úQ>óQ>ìQ>åQ>ÞQ>×Q>ÐQ>ÉQ>ÂQ>»Q>´Q>­Q>¦Q>ŸQ>˜Q>‘Q>ŠQ>ƒQ>|Q>uQ>nQ>gQ>`Q>YQ>RQ>KQ>DQ>=Q>6Q>/Q>(Q>!Q>Q>Q> Q>Q>þP>÷P>ðP>éP>âP>ÛP>ÔP>ÍP>ÆP>¿P>¸P>±P>ªP>£P>œP>•P>ŽP>‡P>€P>yP>rP>kP>dP>]P>VP>OP>HP>AP>:P>3P>,P>%P>P>P>P> P>P>ûO>ôO>íO>æO>ßO>ØO>ÑO>ÊO>ÃO>¼O>µO>®O>§O> O>™O>’O>‹O>„O>}O>vO>oO>hO>aO>ZO>SO>LO>EO>>O>7O>0O>)O>"O>O>O> O>O>ÿN>øN>ñN>êN>ãN>ÜN>ÕN>ÎN>ÇN>ÀN>¹N>²N>«N>¤N>N>–N>N>ˆN>N>zN>sN>lN>eN>^N>WN>PN>IN>BN>;N>4N>-N>&N>N>N>N> N>N>üM>õM>îM>çM>àM>ÙM>ÒM>ËM>ÄM>½M>¶M>¯M>¨M>¡M>šM>“M>ŒM>…M>~M>wM>pM>iM>bM>[M>TM>MM>FM>?M>8M>1M>*M>#M>M>M>M>M>M>ùL>òL>ëL>äL>ÝL>ÖL>ÏL>ÈL>ÁL>ºL>³L>¬L>¥L>žL>—L>L>‰L>‚L>{L>tL>mL>fL>_L>XL>QL>JL>CL>5L>.L>'L> L>L>L> L>L>ýK>öK>ïK>èK>áK>ÚK>ÓK>ÌK>ÅK>¾K>·K>°K>©K>¢K>›K>”K>K>†K>K>xK>qK>jK>cK>\K>UK>NK>GK>@K>9K>2K>+K>$K>K>K>K>K>K>úJ>óJ>ìJ>åJ>ÞJ>×J>ÐJ>ÉJ>ÂJ>»J>´J>­J>¦J>ŸJ>˜J>‘J>ŠJ>ƒJ>|J>uJ>nJ>gJ>`J>YJ>RJ>KJ>DJ>=J>6J>/J>(J>!J>J>J> J>J>þI>÷I>ðI>éI>âI>ÛI>ÔI>ÍI>ÆI>¿I>¸I>±I>ªI>£I>œI>•I>ŽI>‡I>€I>yI>rI>kI>dI>]I>VI>OI>HI>AI>:I>3I>,I>%I>I>I>I> I>I>ûH>ôH>íH>æH>ßH>ØH>ÑH>ÊH>ÃH>¼H>µH>®H>§H> H>™H>’H>‹H>„H>}H>vH>oH>hH>aH>ZH>SH>LH>EH>>H>7H>0H>)H>"H>H>H> H>H>ÿG>øG>ñG>êG>ãG>ÜG>ÕG>ÎG>ÇG>ÀG>¹G>²G>«G>¤G>G>–G>G>ˆG>G>zG>sG>lG>eG>^G>WG>PG>IG>BG>;G>4G>-G>&G>G>G>G> G>G>üF>õF>îF>çF>àF>ÙF>ÒF>ËF>ÄF>½F>¶F>¯F>¨F>¡F>šF>“F>ŒF>…F>~F>wF>pF>iF>bF>[F>TF>MF>FF>?F>8F>1F>*F>#F>F>F>F>F>F>ùE>òE>ëE>äE>ÝE>ÖE>ÏE>ÈE>ÁE>ºE>³E>¬E>¥E>žE>—E>E>‰E>‚E>{E>tE>mE>fE>_E>XE>QE>JE>CE>5E>.E>'E> E>E>E> E>E>ýD>öD>ïD>èD>áD>ÚD>ÓD>ÌD>ÅD>¾D>·D>°D>©D>¢D>›D>”D>D>†D>D>xD>qD>jD>cD>\D>UD>ND>GD>@D>9D>2D>+D>$D>D>D>D>D>D>úC>óC>ìC>åC>ÞC>×C>ÐC>ÉC>ÂC>»C>´C>­C>¦C>ŸC>˜C>‘C>ŠC>ƒC>|C>uC>nC>gC>`C>YC>RC>KC>DC>=C>6C>/C>(C>!C>C>C> C>C>þB>÷B>ðB>éB>âB>ÛB>ÔB>ÍB>ÆB>¿B>¸B>±B>ªB>£B>œB>•B>ŽB>‡B>€B>yB>rB>kB>dB>]B>VB>OB>HB>AB>:B>3B>,B>%B>B>B>B> B>B>ûA>ôA>íA>æA>ßA>ØA>ÑA>ÊA>ÃA>¼A>µA>®A>§A> A>™A>’A>‹A>„A>}A>vA>oA>hA>aA>ZA>SA>LA>EA>>A>7A>0A>)A>"A>A>A> A>A>ÿ@>ø@>ñ@>ê@>ã@>Ü@>Õ@>Î@>Ç@>À@>¹@>²@>«@>¤@>@>–@>@>ˆ@>@>z@>s@>l@>e@>^@>W@>P@>I@>B@>;@>4@>-@>&@>@>@>@> @>@>ü?>õ?>î?>ç?>à?>Ù?>Ò?>Ë?>Ä?>½?>¶?>¯?>¨?>¡?>š?>“?>Œ?>…?>~?>w?>p?>i?>b?>[?>T?>M?>F?>??>8?>1?>*?>#?>?>?>?>?>?>ù>>ò>>ë>>ä>>Ý>>Ö>>Ï>>È>>Á>>º>>³>>¬>>¥>>ž>>—>>>>‰>>‚>>{>>t>>m>>f>>_>>X>>Q>>J>>C>><>>5>>.>>'>> >>>>>> >>>>ý=>ö=>ï=>è=>á=>Ú=>Ó=>Ì=>Å=>¾=>·=>°=>©=>¢=>›=>”=>=>†=>=>x=>q=>j=>c=>\=>U=>N=>G=>@=>9=>2=>+=>$=>=>=>=>=>=>ú<>ó<>ì<>å<>Þ<>×<>Ð<>É<>Â<>»<>´<>­<>¦<>Ÿ<>˜<>‘<>Š<>ƒ<>|<>u<>n<>g<>`<>Y<>R<>K<>D<>=<>6<>/<>(<>!<><><> <><>þ;>÷;>ð;>é;>â;>Û;>Ô;>Í;>Æ;>¿;>¸;>±;>ª;>£;>œ;>•;>Ž;>‡;>€;>y;>r;>k;>d;>];>V;>O;>H;>A;>:;>3;>,;>%;>;>;>;> ;>;>û:>ô:>í:>æ:>ß:>Ø:>Ñ:>Ê:>Ã:>¼:>µ:>®:>§:> :>™:>’:>‹:>„:>}:>v:>o:>h:>a:>Z:>S:>L:>E:>>:>7:>0:>):>":>:>:> :>:>ÿ9>ø9>ñ9>ê9>ã9>Ü9>Õ9>Î9>Ç9>À9>¹9>²9>«9>¤9>9>–9>9>ˆ9>9>z9>s9>l9>e9>^9>W9>P9>I9>B9>;9>49>-9>&9>9>9>9> 9>9>ü8>õ8>î8>ç8>à8>Ù8>Ò8>Ë8>Ä8>½8>¶8>¯8>¨8>¡8>š8>“8>Œ8>…8>~8>w8>p8>i8>b8>[8>T8>M8>F8>?8>88>18>*8>#8>8>8>8>8>8>ù7>ò7>ë7>ä7>Ý7>Ö7>Ï7>È7>Á7>º7>³7>¬7>¥7>ž7>—7>7>‰7>‚7>{7>t7>m7>f7>_7>X7>Q7>J7>C7><7>57>.7>'7> 7>7>7> 7>7>ý6>ö6>ï6>è6>á6>Ú6>Ó6>Ì6>Å6>¾6>·6>°6>©6>¢6>›6>”6>6>†6>6>x6>q6>j6>c6>\6>U6>N6>G6>@6>96>26>+6>$6>6>6>6>6>6>ú5>ó5>ì5>å5>Þ5>×5>Ð5>É5>Â5>»5>´5>­5>¦5>Ÿ5>˜5>‘5>Š5>ƒ5>|5>u5>n5>g5>`5>Y5>R5>K5>D5>=5>65>/5>(5>!5>5>5> 5>5>þ4>÷4>ð4>é4>â4>Û4>Ô4>Í4>Æ4>¿4>¸4>±4>ª4>£4>œ4>•4>Ž4>‡4>€4>y4>r4>k4>d4>]4>V4>O4>H4>A4>:4>34>,4>%4>4>4>4> 4>4>û3>ô3>í3>æ3>ß3>Ø3>Ñ3>Ê3>Ã3>¼3>µ3>®3>§3> 3>™3>’3>‹3>„3>}3>v3>o3>h3>a3>Z3>S3>L3>E3>>3>73>03>)3>"3>3>3> 3>3>ÿ2>ø2>ñ2>ê2>ã2>Ü2>Õ2>Î2>Ç2>À2>¹2>²2>«2>¤2>2>–2>2>ˆ2>2>z2>s2>l2>e2>^2>W2>P2>I2>B2>;2>42>-2>&2>2>2>2> 2>2>ü1>õ1>î1>ç1>à1>Ù1>Ò1>Ë1>Ä1>½1>¶1>¯1>¨1>¡1>š1>“1>Œ1>…1>~1>w1>p1>i1>b1>[1>T1>M1>F1>?1>81>11>*1>#1>1>1>1>1>1>ù0>ò0>ë0>ä0>Ý0>Ö0>Ï0>È0>Á0>º0>³0>¬0>¥0>ž0>—0>0>‰0>‚0>{0>t0>m0>f0>_0>X0>Q0>J0>C0><0>50>.0>'0> 0>0>0> 0>0>ý/>ö/>ï/>è/>á/>Ú/>Ó/>Ì/>Å/>¾/>·/>°/>©/>¢/>›/>”/>/>†/>/>x/>q/>j/>c/>\/>U/>N/>G/>@/>9/>2/>+/>$/>/>/>/>/>/>ú.>ó.>ì.>å.>Þ.>×.>Ð.>É.>Â.>».>´.>­.>¦.>Ÿ.>˜.>‘.>Š.>ƒ.>|.>u.>n.>g.>`.>Y.>R.>K.>D.>=.>6.>/.>(.>!.>.>.> .>.>þ->÷->ð->é->â->Û->Ô->Í->Æ->¿->¸->±->ª->£->œ->•->Ž->‡->€->y->r->k->d->]->V->O->H->A->:->3->,->%->->->-> ->->û,>ô,>í,>æ,>ß,>Ø,>Ñ,>Ê,>Ã,>¼,>µ,>®,>§,> ,>™,>’,>‹,>„,>},>v,>o,>h,>a,>Z,>S,>L,>E,>>,>7,>0,>),>",>,>,> ,>,>ÿ+>ø+>ñ+>ê+>ã+>Ü+>Õ+>Î+>Ç+>À+>¹+>²+>«+>¤+>+>–+>+>ˆ+>+>z+>s+>l+>e+>^+>W+>P+>I+>B+>;+>4+>-+>&+>+>+>+> +>+>ü*>õ*>î*>ç*>à*>Ù*>Ò*>Ë*>Ä*>½*>¶*>¯*>¨*>¡*>š*>“*>Œ*>…*>~*>w*>p*>i*>b*>[*>T*>M*>F*>?*>8*>1*>**>#*>*>*>*>*>*>ù)>ò)>ë)>ä)>Ý)>Ö)>Ï)>È)>Á)>º)>³)>¬)>¥)>ž)>—)>)>‰)>‚)>{)>t)>m)>f)>_)>X)>Q)>J)>C)><)>5)>.)>')> )>)>)> )>)>ý(>ö(>ï(>è(>á(>Ú(>Ó(>Ì(>Å(>¾(>·(>°(>©(>¢(>›(>”(>(>†(>(>x(>q(>j(>c(>\(>U(>N(>G(>@(>9(>2(>+(>$(>(>(>(>(>(>ú'>ó'>ì'>å'>Þ'>×'>Ð'>É'>Â'>»'>´'>­'>¦'>Ÿ'>˜'>‘'>Š'>ƒ'>|'>u'>n'>g'>`'>Y'>R'>K'>D'>='>6'>/'>('>!'>'>'> '>'>þ&>÷&>ð&>é&>â&>Û&>Ô&>Í&>Æ&>¿&>¸&>±&>ª&>£&>œ&>•&>Ž&>‡&>€&>y&>r&>k&>d&>]&>V&>O&>H&>A&>:&>3&>,&>%&>&>&>&> &>&>û%>ô%>í%>æ%>ß%>Ø%>Ñ%>Ê%>Ã%>¼%>µ%>®%>§%> %>™%>’%>‹%>„%>}%>v%>o%>h%>a%>Z%>S%>L%>E%>>%>7%>0%>)%>"%>%>%> %>%>ÿ$>ø$>ñ$>ê$>ã$>Ü$>Õ$>Î$>Ç$>À$>¹$>²$>«$>¤$>$>–$>$>ˆ$>$>z$>s$>l$>e$>^$>W$>P$>I$>B$>;$>4$>-$>&$>$>$>$> $>$>ü#>õ#>î#>ç#>à#>Ù#>Ò#>Ë#>Ä#>½#>¶#>¯#>¨#>¡#>š#>“#>Œ#>…#>~#>w#>p#>i#>b#>[#>T#>M#>F#>?#>8#>1#>*#>##>#>#>#>#>#>ù">ò">ë">ä">Ý">Ö">Ï">È">Á">º">³">¬">¥">ž">—">">‰">‚">{">t">m">f">_">X">Q">J">C"><">5">.">'"> ">">"> ">">ý!>ö!>ï!>è!>á!>Ú!>Ó!>Ì!>Å!>¾!>·!>°!>©!>¢!>›!>”!>!>†!>!>x!>q!>j!>c!>\!>U!>N!>G!>@!>9!>2!>+!>$!>!>!>!>!>!>ú >ó >ì >å >Þ >× >Ð >É > >» >´ >­ >¦ >Ÿ >˜ >‘ >Š >ƒ >| >u >n >g >` >Y >R >K >D >= >6 >/ >( >! > > > > >þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û>ô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý>ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û>ô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý>ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û>ô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù >ò >ë >ä >Ý >Ö >Ï >È >Á >º >³ >¬ >¥ >ž >— > >‰ >‚ >{ >t >m >f >_ >X >Q >J >C >< >5 >. >' > > > > > >ý >ö >ï >è >á >Ú >Ó >Ì >Å >¾ >· >° >© >¢ >› >” > >† > >x >q >j >c >\ >U >N >G >@ >9 >2 >+ >$ > > > > > >ú >ó >ì >å >Þ >× >Ð >É > >» >´ >­ >¦ >Ÿ >˜ >‘ >Š >ƒ >| >u >n >g >` >Y >R >K >D >= >6 >/ >( >! > > > > >þ >÷ >ð >é >â >Û >Ô >Í >Æ >¿ >¸ >± >ª >£ >œ >• >Ž >‡ >€ >y >r >k >d >] >V >O >H >A >: >3 >, >% > > > > > >û >ô >í >æ >ß >Ø >Ñ >Ê >à >¼ >µ >® >§ >  >™ >’ >‹ >„ >} >v >o >h >a >Z >S >L >E >> >7 >0 >) >" > > > > >ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý>ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ>÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û>ô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ùÿ=òÿ=ëÿ=äÿ=Ýÿ=Öÿ=Ïÿ=Èÿ=Áÿ=ºÿ=³ÿ=¬ÿ=¥ÿ=žÿ=—ÿ=ÿ=‰ÿ=‚ÿ={ÿ=tÿ=mÿ=fÿ=_ÿ=Xÿ=Qÿ=Jÿ=Cÿ=<ÿ=5ÿ=.ÿ='ÿ= ÿ=ÿ=ÿ= ÿ=ÿ=ýþ=öþ=ïþ=èþ=áþ=Úþ=Óþ=Ìþ=Åþ=¾þ=·þ=°þ=©þ=¢þ=›þ=”þ=þ=†þ=þ=xþ=qþ=jþ=cþ=\þ=Uþ=Nþ=Gþ=@þ=9þ=2þ=+þ=$þ=þ=þ=þ=þ=þ=úý=óý=ìý=åý=Þý=×ý=Ðý=Éý=Âý=»ý=´ý=­ý=¦ý=Ÿý=˜ý=‘ý=Šý=ƒý=|ý=uý=ný=gý=`ý=Yý=Rý=Ký=Dý==ý=6ý=/ý=(ý=!ý=ý=ý= ý=ý=þü=÷ü=ðü=éü=âü=Ûü=Ôü=Íü=Æü=¿ü=¸ü=±ü=ªü=£ü=œü=•ü=Žü=‡ü=€ü=yü=rü=kü=dü=]ü=Vü=Oü=Hü=Aü=:ü=3ü=,ü=%ü=ü=ü=ü= ü=ü=ûû=ôû=íû=æû=ßû=Øû=Ñû=Êû=Ãû=¼û=µû=®û=§û= û=™û=’û=‹û=„û=}û=vû=oû=hû=aû=Zû=Sû=Lû=Eû=>û=7û=0û=)û="û=û=û= û=û=ÿú=øú=ñú=êú=ãú=Üú=Õú=Îú=Çú=Àú=¹ú=²ú=«ú=¤ú=ú=–ú=ú=ˆú=ú=zú=sú=lú=eú=^ú=Wú=Pú=Iú=Bú=;ú=4ú=-ú=&ú=ú=ú=ú= ú=ú=üù=õù=îù=çù=àù=Ùù=Òù=Ëù=Äù=½ù=¶ù=¯ù=¨ù=¡ù=šù=“ù=Œù=…ù=~ù=wù=pù=iù=bù=[ù=Tù=Mù=Fù=?ù=8ù=1ù=*ù=#ù=ù=ù=ù=ù=ù=ùø=òø=ëø=äø=Ýø=Öø=Ïø=Èø=Áø=ºø=³ø=¬ø=¥ø=žø=—ø=ø=‰ø=‚ø={ø=tø=mø=fø=_ø=Xø=Qø=Jø=Cø=<ø=5ø=.ø='ø= ø=ø=ø= ø=ø=ý÷=ö÷=ï÷=è÷=á÷=Ú÷=Ó÷=Ì÷=Å÷=¾÷=·÷=°÷=©÷=¢÷=›÷=”÷=÷=†÷=÷=x÷=q÷=j÷=c÷=\÷=U÷=N÷=G÷=@÷=9÷=2÷=+÷=$÷=÷=÷=÷=÷=÷=úö=óö=ìö=åö=Þö=×ö=Ðö=Éö=Âö=»ö=´ö=­ö=¦ö=Ÿö=˜ö=‘ö=Šö=ƒö=|ö=uö=nö=gö=`ö=Yö=Rö=Kö=Dö==ö=6ö=/ö=(ö=!ö=ö=ö= ö=ö=þõ=÷õ=ðõ=éõ=âõ=Ûõ=Ôõ=Íõ=Æõ=¿õ=¸õ=±õ=ªõ=£õ=œõ=•õ=Žõ=‡õ=€õ=yõ=rõ=kõ=dõ=]õ=Võ=Oõ=Hõ=Aõ=:õ=3õ=,õ=%õ=õ=õ=õ= õ=õ=ûô=ôô=íô=æô=ßô=Øô=Ñô=Êô=Ãô=¼ô=µô=®ô=§ô= ô=™ô=’ô=‹ô=„ô=}ô=vô=oô=hô=aô=Zô=Sô=Lô=Eô=>ô=7ô=0ô=)ô="ô=ô=ô= ô=ô=ÿó=øó=ñó=êó=ãó=Üó=Õó=Îó=Çó=Àó=¹ó=²ó=«ó=¤ó=ó=–ó=ó=ˆó=ó=zó=só=ló=eó=^ó=Wó=Pó=Ió=Bó=;ó=4ó=-ó=&ó=ó=ó=ó= ó=ó=üò=õò=îò=çò=àò=Ùò=Òò=Ëò=Äò=½ò=¶ò=¯ò=¨ò=¡ò=šò=“ò=Œò=…ò=~ò=wò=pò=iò=bò=[ò=Tò=Mò=Fò=?ò=8ò=1ò=*ò=#ò=ò=ò=ò=ò=ò=ùñ=òñ=ëñ=äñ=Ýñ=Öñ=Ïñ=Èñ=Áñ=ºñ=³ñ=¬ñ=¥ñ=žñ=—ñ=ñ=‰ñ=‚ñ={ñ=tñ=mñ=fñ=_ñ=Xñ=Qñ=Jñ=Cñ=<ñ=5ñ=.ñ='ñ= ñ=ñ=ñ= ñ=ñ=ýð=öð=ïð=èð=áð=Úð=Óð=Ìð=Åð=¾ð=·ð=°ð=©ð=¢ð=›ð=”ð=ð=†ð=ð=xð=qð=jð=cð=\ð=Uð=Nð=Gð=@ð=9ð=2ð=+ð=$ð=ð=ð=ð=ð=ð=úï=óï=ìï=åï=Þï=×ï=Ðï=Éï=Âï=»ï=´ï=­ï=¦ï=Ÿï=˜ï=‘ï=Šï=ƒï=|ï=uï=nï=gï=`ï=Yï=Rï=Kï=Dï==ï=6ï=/ï=(ï=!ï=ï=ï= ï=ï=þî=÷î=ðî=éî=âî=Ûî=Ôî=Íî=Æî=¿î=¸î=±î=ªî=£î=œî=•î=Žî=‡î=€î=yî=rî=kî=dî=]î=Vî=Oî=Hî=Aî=:î=3î=,î=%î=î=î=î= î=î=ûí=ôí=íí=æí=ßí=Øí=Ñí=Êí=Ãí=¼í=µí=®í=§í= í=™í=’í=‹í=„í=}í=ví=oí=hí=aí=Zí=Sí=Lí=Eí=>í=7í=0í=)í="í=í=í= í=í=ÿì=øì=ñì=êì=ãì=Üì=Õì=Îì=Çì=Àì=¹ì=²ì=«ì=¤ì=ì=–ì=ì=ˆì=ì=zì=sì=lì=eì=^ì=Wì=Pì=Iì=Bì=;ì=4ì=-ì=&ì=ì=ì=ì= ì=ì=üë=õë=îë=çë=àë=Ùë=Òë=Ëë=Äë=½ë=¶ë=¯ë=¨ë=¡ë=šë=“ë=Œë=…ë=~ë=wë=pë=ië=bë=[ë=Të=Më=Fë=?ë=8ë=1ë=*ë=#ë=ë=ë=ë=ë=ë=ùê=òê=ëê=äê=Ýê=Öê=Ïê=Èê=Áê=ºê=³ê=¬ê=¥ê=žê=—ê=ê=‰ê=‚ê={ê=tê=mê=fê=_ê=Xê=Qê=Jê=Cê=<ê=5ê=.ê='ê= ê=ê=ê= ê=ê=ýé=öé=ïé=èé=áé=Úé=Óé=Ìé=Åé=¾é=·é=°é=©é=¢é=›é=”é=é=†é=é=xé=qé=jé=cé=\é=Ué=Né=Gé=@é=9é=2é=+é=$é=é=é=é=é=é=úè=óè=ìè=åè=Þè=×è=Ðè=Éè=Âè=»è=´è=­è=¦è=Ÿè=˜è=‘è=Šè=ƒè=|è=uè=nè=gè=`è=Yè=Rè=Kè=Dè==è=6è=/è=(è=!è=è=è= è=è=þç=÷ç=ðç=éç=âç=Ûç=Ôç=Íç=Æç=¿ç=¸ç=±ç=ªç=£ç=œç=•ç=Žç=‡ç=€ç=yç=rç=kç=dç=]ç=Vç=Oç=Hç=Aç=:ç=3ç=,ç=%ç=ç=ç=ç= ç=ç=ûæ=ôæ=íæ=ææ=ßæ=Øæ=Ñæ=Êæ=Ãæ=¼æ=µæ=®æ=§æ= æ=™æ=’æ=‹æ=„æ=}æ=væ=oæ=hæ=aæ=Zæ=Sæ=Læ=Eæ=>æ=7æ=0æ=)æ="æ=æ=æ= æ=æ=ÿå=øå=ñå=êå=ãå=Üå=Õå=Îå=Çå=Àå=¹å=²å=«å=¤å=å=–å=å=ˆå=å=zå=så=lå=eå=^å=Wå=På=Iå=Bå=;å=4å=-å=&å=å=å=å= å=å=üä=õä=îä=çä=àä=Ùä=Òä=Ëä=Ää=½ä=¶ä=¯ä=¨ä=¡ä=šä=“ä=Œä=…ä=~ä=wä=pä=iä=bä=[ä=Tä=Mä=Fä=?ä=8ä=1ä=*ä=#ä=ä=ä=ä=ä=ä=ùã=òã=ëã=äã=Ýã=Öã=Ïã=Èã=Áã=ºã=³ã=¬ã=¥ã=žã=—ã=ã=‰ã=‚ã={ã=tã=mã=fã=_ã=Xã=Qã=Jã=Cã=<ã=5ã=.ã='ã= ã=ã=ã= ã=ã=ýâ=öâ=ïâ=èâ=áâ=Úâ=Óâ=Ìâ=Åâ=¾â=·â=°â=©â=¢â=›â=”â=â=†â=â=xâ=qâ=jâ=câ=\â=Uâ=Nâ=Gâ=@â=9â=2â=+â=$â=â=â=â=â=â=úá=óá=ìá=åá=Þá=×á=Ðá=Éá=Âá=»á=´á=­á=¦á=Ÿá=˜á=‘á=Šá=ƒá=|á=uá=ná=gá=`á=Yá=Rá=Ká=Dá==á=6á=/á=(á=!á=á=á= á=á=þà=÷à=ðà=éà=âà=Ûà=Ôà=Íà=Æà=¿à=¸à=±à=ªà=£à=œà=•à=Žà=‡à=€à=yà=rà=kà=dà=]à=Và=Oà=Hà=Aà=:à=3à=,à=%à=à=à=à= à=à=ûß=ôß=íß=æß=ßß=Øß=Ñß=Êß=Ãß=¼ß=µß=®ß=§ß= ß=™ß=’ß=‹ß=„ß=}ß=vß=oß=hß=aß=Zß=Sß=Lß=Eß=>ß=7ß=0ß=)ß="ß=ß=ß= ß=ß=ÿÞ=øÞ=ñÞ=êÞ=ãÞ=ÜÞ=ÕÞ=ÎÞ=ÇÞ=ÀÞ=¹Þ=²Þ=«Þ=¤Þ=Þ=–Þ=Þ=ˆÞ=Þ=zÞ=sÞ=lÞ=eÞ=^Þ=WÞ=PÞ=IÞ=BÞ=;Þ=4Þ=-Þ=&Þ=Þ=Þ=Þ= Þ=Þ=üÝ=õÝ=îÝ=çÝ=àÝ=ÙÝ=ÒÝ=ËÝ=ÄÝ=½Ý=¶Ý=¯Ý=¨Ý=¡Ý=šÝ=“Ý=ŒÝ=…Ý=~Ý=wÝ=pÝ=iÝ=bÝ=[Ý=TÝ=MÝ=FÝ=?Ý=8Ý=1Ý=*Ý=#Ý=Ý=Ý=Ý=Ý=Ý=ùÜ=òÜ=ëÜ=äÜ=ÝÜ=ÖÜ=ÏÜ=ÈÜ=ÁÜ=ºÜ=³Ü=¬Ü=¥Ü=žÜ=—Ü=Ü=‰Ü=‚Ü={Ü=tÜ=mÜ=fÜ=_Ü=XÜ=QÜ=JÜ=CÜ=<Ü=5Ü=.Ü='Ü= Ü=Ü=Ü= Ü=Ü=ýÛ=öÛ=ïÛ=èÛ=áÛ=ÚÛ=ÓÛ=ÌÛ=ÅÛ=¾Û=·Û=°Û=©Û=¢Û=›Û=”Û=Û=†Û=Û=xÛ=qÛ=jÛ=cÛ=\Û=UÛ=NÛ=GÛ=@Û=9Û=2Û=+Û=$Û=Û=Û=Û=Û=Û=úÚ=óÚ=ìÚ=åÚ=ÞÚ=×Ú=ÐÚ=ÉÚ=ÂÚ=»Ú=´Ú=­Ú=¦Ú=ŸÚ=˜Ú=‘Ú=ŠÚ=ƒÚ=|Ú=uÚ=nÚ=gÚ=`Ú=YÚ=RÚ=KÚ=DÚ==Ú=6Ú=/Ú=(Ú=!Ú=Ú=Ú= Ú=Ú=þÙ=÷Ù=ðÙ=éÙ=âÙ=ÛÙ=ÔÙ=ÍÙ=ÆÙ=¿Ù=¸Ù=±Ù=ªÙ=£Ù=œÙ=•Ù=ŽÙ=‡Ù=€Ù=yÙ=rÙ=kÙ=dÙ=]Ù=VÙ=OÙ=HÙ=AÙ=:Ù=3Ù=,Ù=%Ù=Ù=Ù=Ù= Ù=Ù=ûØ=ôØ=íØ=æØ=ߨ=ØØ=ÑØ=ÊØ=ÃØ=¼Ø=µØ=®Ø=§Ø= Ø=™Ø=’Ø=‹Ø=„Ø=}Ø=vØ=oØ=hØ=aØ=ZØ=SØ=LØ=EØ=>Ø=7Ø=0Ø=)Ø="Ø=Ø=Ø= Ø=Ø=ÿ×=ø×=ñ×=ê×=ã×=Ü×=Õ×=Î×=Ç×=À×=¹×=²×=«×=¤×=×=–×=×=ˆ×=×=z×=s×=l×=e×=^×=W×=P×=I×=B×=;×=4×=-×=&×=×=×=×= ×=×=üÖ=õÖ=îÖ=çÖ=àÖ=ÙÖ=ÒÖ=ËÖ=ÄÖ=½Ö=¶Ö=¯Ö=¨Ö=¡Ö=šÖ=“Ö=ŒÖ=…Ö=~Ö=wÖ=pÖ=iÖ=bÖ=[Ö=TÖ=MÖ=FÖ=?Ö=8Ö=1Ö=*Ö=#Ö=Ö=Ö=Ö=Ö=Ö=ùÕ=òÕ=ëÕ=äÕ=ÝÕ=ÖÕ=ÏÕ=ÈÕ=ÁÕ=ºÕ=³Õ=¬Õ=¥Õ=žÕ=—Õ=Õ=‰Õ=‚Õ={Õ=tÕ=mÕ=fÕ=_Õ=XÕ=QÕ=JÕ=CÕ=<Õ=5Õ=.Õ='Õ= Õ=Õ=Õ= Õ=Õ=ýÔ=öÔ=ïÔ=èÔ=áÔ=ÚÔ=ÓÔ=ÌÔ=ÅÔ=¾Ô=·Ô=°Ô=©Ô=¢Ô=›Ô=”Ô=Ô=†Ô=Ô=xÔ=qÔ=jÔ=cÔ=\Ô=UÔ=NÔ=GÔ=@Ô=9Ô=2Ô=+Ô=$Ô=Ô=Ô=Ô=Ô=Ô=úÓ=óÓ=ìÓ=åÓ=ÞÓ=×Ó=ÐÓ=ÉÓ=ÂÓ=»Ó=´Ó=­Ó=¦Ó=ŸÓ=˜Ó=‘Ó=ŠÓ=ƒÓ=|Ó=uÓ=nÓ=gÓ=`Ó=YÓ=RÓ=KÓ=DÓ==Ó=6Ó=/Ó=(Ó=!Ó=Ó=Ó= Ó=Ó=þÒ=÷Ò=ðÒ=éÒ=âÒ=ÛÒ=ÔÒ=ÍÒ=ÆÒ=¿Ò=¸Ò=±Ò=ªÒ=£Ò=œÒ=•Ò=ŽÒ=‡Ò=€Ò=yÒ=rÒ=kÒ=dÒ=]Ò=VÒ=OÒ=HÒ=AÒ=:Ò=3Ò=,Ò=%Ò=Ò=Ò=Ò= Ò=Ò=ûÑ=ôÑ=íÑ=æÑ=ßÑ=ØÑ=ÑÑ=ÊÑ=ÃÑ=¼Ñ=µÑ=®Ñ=§Ñ= Ñ=™Ñ=’Ñ=‹Ñ=„Ñ=}Ñ=vÑ=oÑ=hÑ=aÑ=ZÑ=SÑ=LÑ=EÑ=>Ñ=7Ñ=0Ñ=)Ñ="Ñ=Ñ=Ñ= Ñ=Ñ=ÿÐ=øÐ=ñÐ=êÐ=ãÐ=ÜÐ=ÕÐ=ÎÐ=ÇÐ=ÀÐ=¹Ð=²Ð=«Ð=¤Ð=Ð=–Ð=Ð=ˆÐ=Ð=zÐ=sÐ=lÐ=eÐ=^Ð=WÐ=PÐ=IÐ=BÐ=;Ð=4Ð=-Ð=&Ð=Ð=Ð=Ð= Ð=Ð=üÏ=õÏ=îÏ=çÏ=àÏ=ÙÏ=ÒÏ=ËÏ=ÄÏ=½Ï=¶Ï=¯Ï=¨Ï=¡Ï=šÏ=“Ï=ŒÏ=…Ï=~Ï=wÏ=pÏ=iÏ=bÏ=[Ï=TÏ=MÏ=FÏ=?Ï=8Ï=1Ï=*Ï=#Ï=Ï=Ï=Ï=Ï=Ï=ùÎ=òÎ=ëÎ=äÎ=ÝÎ=ÖÎ=ÏÎ=ÈÎ=ÁÎ=ºÎ=³Î=¬Î=¥Î=žÎ=—Î=Î=‰Î=‚Î={Î=tÎ=mÎ=fÎ=_Î=XÎ=QÎ=JÎ=CÎ=<Î=5Î=.Î='Î= Î=Î=Î= Î=Î=ýÍ=öÍ=ïÍ=èÍ=áÍ=ÚÍ=ÓÍ=ÌÍ=ÅÍ=¾Í=·Í=°Í=©Í=¢Í=›Í=”Í=Í=†Í=Í=xÍ=qÍ=jÍ=cÍ=\Í=UÍ=NÍ=GÍ=@Í=9Í=2Í=+Í=$Í=Í=Í=Í=Í=Í=úÌ=óÌ=ìÌ=åÌ=ÞÌ=×Ì=ÐÌ=ÉÌ=ÂÌ=»Ì=´Ì=­Ì=¦Ì=ŸÌ=˜Ì=‘Ì=ŠÌ=ƒÌ=|Ì=uÌ=nÌ=gÌ=`Ì=YÌ=RÌ=KÌ=DÌ==Ì=6Ì=/Ì=(Ì=!Ì=Ì=Ì= Ì=Ì=þË=÷Ë=ðË=éË=âË=ÛË=ÔË=ÍË=ÆË=¿Ë=¸Ë=±Ë=ªË=£Ë=œË=•Ë=ŽË=‡Ë=€Ë=yË=rË=kË=dË=]Ë=VË=OË=HË=AË=:Ë=3Ë=,Ë=%Ë=Ë=Ë=Ë= Ë=Ë=ûÊ=ôÊ=íÊ=æÊ=ßÊ=ØÊ=ÑÊ=ÊÊ=ÃÊ=¼Ê=µÊ=®Ê=§Ê= Ê=™Ê=’Ê=‹Ê=„Ê=}Ê=vÊ=oÊ=hÊ=aÊ=ZÊ=SÊ=LÊ=EÊ=>Ê=7Ê=0Ê=)Ê="Ê=Ê=Ê= Ê=Ê=ÿÉ=øÉ=ñÉ=êÉ=ãÉ=ÜÉ=ÕÉ=ÎÉ=ÇÉ=ÀÉ=¹É=²É=«É=¤É=É=–É=É=ˆÉ=É=zÉ=sÉ=lÉ=eÉ=^É=WÉ=PÉ=IÉ=BÉ=;É=4É=-É=&É=É=É=É= É=É=üÈ=õÈ=îÈ=çÈ=àÈ=ÙÈ=ÒÈ=ËÈ=ÄÈ=½È=¶È=¯È=¨È=¡È=šÈ=“È=ŒÈ=…È=~È=wÈ=pÈ=iÈ=bÈ=[È=TÈ=MÈ=FÈ=?È=8È=1È=*È=#È=È=È=È=È=È=ùÇ=òÇ=ëÇ=äÇ=ÝÇ=ÖÇ=ÏÇ=ÈÇ=ÁÇ=ºÇ=³Ç=¬Ç=¥Ç=žÇ=—Ç=Ç=‰Ç=‚Ç={Ç=tÇ=mÇ=fÇ=_Ç=XÇ=QÇ=JÇ=CÇ=<Ç=5Ç=.Ç='Ç= Ç=Ç=Ç= Ç=Ç=ýÆ=öÆ=ïÆ=èÆ=áÆ=ÚÆ=ÓÆ=ÌÆ=ÅÆ=¾Æ=·Æ=°Æ=©Æ=¢Æ=›Æ=”Æ=Æ=†Æ=Æ=xÆ=qÆ=jÆ=cÆ=\Æ=UÆ=NÆ=GÆ=@Æ=9Æ=2Æ=+Æ=$Æ=Æ=Æ=Æ=Æ=Æ=úÅ=óÅ=ìÅ=åÅ=ÞÅ=×Å=ÐÅ=ÉÅ=ÂÅ=»Å=´Å=­Å=¦Å=ŸÅ=˜Å=‘Å=ŠÅ=ƒÅ=|Å=uÅ=nÅ=gÅ=`Å=YÅ=RÅ=KÅ=DÅ==Å=6Å=/Å=(Å=!Å=Å=Å= Å=Å=þÄ=÷Ä=ðÄ=éÄ=âÄ=ÛÄ=ÔÄ=ÍÄ=ÆÄ=¿Ä=¸Ä=±Ä=ªÄ=£Ä=œÄ=•Ä=ŽÄ=‡Ä=€Ä=yÄ=rÄ=kÄ=dÄ=]Ä=VÄ=OÄ=HÄ=AÄ=:Ä=3Ä=,Ä=%Ä=Ä=Ä=Ä= Ä=Ä=ûÃ=ôÃ=íÃ=æÃ=ßÃ=ØÃ=ÑÃ=ÊÃ=ÃÃ=¼Ã=µÃ=®Ã=§Ã= Ã=™Ã=’Ã=‹Ã=„Ã=}Ã=vÃ=oÃ=hÃ=aÃ=ZÃ=SÃ=LÃ=EÃ=>Ã=7Ã=0Ã=)Ã="Ã=Ã=Ã= Ã=Ã=ÿÂ=øÂ=ñÂ=êÂ=ãÂ=ÜÂ=ÕÂ=ÎÂ=ÇÂ=ÀÂ=¹Â=²Â=«Â=¤Â=Â=–Â=Â=ˆÂ=Â=zÂ=sÂ=lÂ=eÂ=^Â=WÂ=PÂ=IÂ=BÂ=;Â=4Â=-Â=&Â=Â=Â=Â= Â=Â=üÁ=õÁ=îÁ=çÁ=àÁ=ÙÁ=ÒÁ=ËÁ=ÄÁ=½Á=¶Á=¯Á=¨Á=¡Á=šÁ=“Á=ŒÁ=…Á=~Á=wÁ=pÁ=iÁ=bÁ=[Á=TÁ=MÁ=FÁ=?Á=8Á=1Á=*Á=#Á=Á=Á=Á=Á=Á=ùÀ=òÀ=ëÀ=äÀ=ÝÀ=ÖÀ=ÏÀ=ÈÀ=ÁÀ=ºÀ=³À=¬À=¥À=žÀ=—À=À=‰À=‚À={À=tÀ=mÀ=fÀ=_À=XÀ=QÀ=JÀ=CÀ=<À=5À=.À='À= À=À=À= À=À=ý¿=ö¿=ï¿=è¿=á¿=Ú¿=Ó¿=Ì¿=Å¿=¾¿=·¿=°¿=©¿=¢¿=›¿=”¿=¿=†¿=¿=x¿=q¿=j¿=c¿=\¿=U¿=N¿=G¿=@¿=9¿=2¿=+¿=$¿=¿=¿=¿=¿=¿=ú¾=ó¾=ì¾=å¾=Þ¾=×¾=о=ɾ=¾=»¾=´¾=­¾=¦¾=Ÿ¾=˜¾=‘¾=о=ƒ¾=|¾=u¾=n¾=g¾=`¾=Y¾=R¾=K¾=D¾==¾=6¾=/¾=(¾=!¾=¾=¾= ¾=¾=þ½=÷½=ð½=é½=â½=Û½=Ô½=ͽ=ƽ=¿½=¸½=±½=ª½=£½=œ½=•½=޽=‡½=€½=y½=r½=k½=d½=]½=V½=O½=H½=A½=:½=3½=,½=%½=½=½=½= ½=½=û¼=ô¼=í¼=æ¼=ß¼=ؼ=Ѽ=ʼ=ü=¼¼=µ¼=®¼=§¼= ¼=™¼=’¼=‹¼=„¼=}¼=v¼=o¼=h¼=a¼=Z¼=S¼=L¼=E¼=>¼=7¼=0¼=)¼="¼=¼=¼= ¼=¼=ÿ»=ø»=ñ»=ê»=ã»=Ü»=Õ»=λ=Ç»=À»=¹»=²»=«»=¤»=»=–»=»=ˆ»=»=z»=s»=l»=e»=^»=W»=P»=I»=B»=;»=4»=-»=&»=»=»=»= »=»=üº=õº=îº=çº=àº=Ùº=Òº=˺=ĺ=½º=¶º=¯º=¨º=¡º=šº=“º=Œº=…º=~º=wº=pº=iº=bº=[º=Tº=Mº=Fº=?º=8º=1º=*º=#º=º=º=º=º=º=ù¹=ò¹=ë¹=ä¹=ݹ=Ö¹=Ϲ=ȹ=Á¹=º¹=³¹=¬¹=¥¹=ž¹=—¹=¹=‰¹=‚¹={¹=t¹=m¹=f¹=_¹=X¹=Q¹=J¹=C¹=<¹=5¹=.¹='¹= ¹=¹=¹= ¹=¹=ý¸=ö¸=ï¸=è¸=á¸=Ú¸=Ó¸≠=Ÿ=¾¸=·¸=°¸=©¸=¢¸=›¸=”¸=¸=†¸=¸=x¸=q¸=j¸=c¸=\¸=U¸=N¸=G¸=@¸=9¸=2¸=+¸=$¸=¸=¸=¸=¸=¸=ú·=ó·=ì·=å·=Þ·=×·=з=É·=·=»·=´·=­·=¦·=Ÿ·=˜·=‘·=Š·=ƒ·=|·=u·=n·=g·=`·=Y·=R·=K·=D·==·=6·=/·=(·=!·=·=·= ·=·=þ¶=÷¶=ð¶=é¶=â¶=Û¶=Ô¶=Ͷ=ƶ=¿¶=¸¶=±¶=ª¶=£¶=œ¶=•¶=޶=‡¶=€¶=y¶=r¶=k¶=d¶=]¶=V¶=O¶=H¶=A¶=:¶=3¶=,¶=%¶=¶=¶=¶= ¶=¶=ûµ=ôµ=íµ=æµ=ßµ=ص=ѵ=ʵ=õ=¼µ=µµ=®µ=§µ= µ=™µ=’µ=‹µ=„µ=}µ=vµ=oµ=hµ=aµ=Zµ=Sµ=Lµ=Eµ=>µ=7µ=0µ=)µ="µ=µ=µ= µ=µ=ÿ´=ø´=ñ´=ê´=ã´=Ü´=Õ´=δ=Ç´=À´=¹´=²´=«´=¤´=´=–´=´=ˆ´=´=z´=s´=l´=e´=^´=W´=P´=I´=B´=;´=4´=-´=&´=´=´=´= ´=´=ü³=õ³=î³=ç³=à³=Ù³=Ò³=˳=ij=½³=¶³=¯³=¨³=¡³=š³=“³=Œ³=…³=~³=w³=p³=i³=b³=[³=T³=M³=F³=?³=8³=1³=*³=#³=³=³=³=³=³=ù²=ò²=ë²=ä²=ݲ=Ö²=ϲ=Ȳ=Á²=º²=³²=¬²=¥²=ž²=—²=²=‰²=‚²={²=t²=m²=f²=_²=X²=Q²=J²=C²=<²=5²=.²='²= ²=²=²= ²=²=ý±=ö±=ï±=è±=á±=Ú±=Ó±=̱=ű=¾±=·±=°±=©±=¢±=›±=”±=±=†±=±=x±=q±=j±=c±=\±=U±=N±=G±=@±=9±=2±=+±=$±=±=±=±=±=±=ú°=ó°=ì°=å°=Þ°=×°=а=ɰ=°=»°=´°=­°=¦°=Ÿ°=˜°=‘°=а=ƒ°=|°=u°=n°=g°=`°=Y°=R°=K°=D°==°=6°=/°=(°=!°=°=°= °=°=þ¯=÷¯=ð¯=é¯=â¯=Û¯=Ô¯=ͯ=Ư=¿¯=¸¯=±¯=ª¯=£¯=œ¯=•¯=ޝ=‡¯=€¯=y¯=r¯=k¯=d¯=]¯=V¯=O¯=H¯=A¯=:¯=3¯=,¯=%¯=¯=¯=¯= ¯=¯=û®=ô®=í®=æ®=ß®=Ø®=Ñ®=Ê®=î=¼®=µ®=®®=§®= ®=™®=’®=‹®=„®=}®=v®=o®=h®=a®=Z®=S®=L®=E®=>®=7®=0®=)®="®=®=®= ®=®=ÿ­=ø­=ñ­=ê­=ã­=Ü­=Õ­=έ=Ç­=À­=¹­=²­=«­=¤­=­=–­=­=ˆ­=­=z­=s­=l­=e­=^­=W­=P­=I­=B­=;­=4­=-­=&­=­=­=­= ­=­=ü¬=õ¬=î¬=ç¬=à¬=Ù¬=Ò¬=ˬ=Ĭ=½¬=¶¬=¯¬=¨¬=¡¬=š¬=“¬=Œ¬=…¬=~¬=w¬=p¬=i¬=b¬=[¬=T¬=M¬=F¬=?¬=8¬=1¬=*¬=#¬=¬=¬=¬=¬=¬=ù«=ò«=ë«=ä«=Ý«=Ö«=Ï«=È«=Á«=º«=³«=¬«=¥«=ž«=—«=«=‰«=‚«={«=t«=m«=f«=_«=X«=Q«=J«=C«=<«=5«=.«='«= «=«=«= «=«=ýª=öª=ïª=èª=áª=Úª=Óª=̪=Ū=¾ª=·ª=°ª=©ª=¢ª=›ª=”ª=ª=†ª=ª=xª=qª=jª=cª=\ª=Uª=Nª=Gª=@ª=9ª=2ª=+ª=$ª=ª=ª=ª=ª=ª=ú©=ó©=ì©=å©=Þ©=ש=Щ=É©=©=»©=´©=­©=¦©=Ÿ©=˜©=‘©=Š©=ƒ©=|©=u©=n©=g©=`©=Y©=R©=K©=D©==©=6©=/©=(©=!©=©=©= ©=©=þ¨=÷¨=ð¨=é¨=â¨=Û¨=Ô¨=ͨ=ƨ=¿¨=¸¨=±¨=ª¨=£¨=œ¨=•¨=ލ=‡¨=€¨=y¨=r¨=k¨=d¨=]¨=V¨=O¨=H¨=A¨=:¨=3¨=,¨=%¨=¨=¨=¨= ¨=¨=û§=ô§=í§=æ§=ß§=ا=ѧ=ʧ=ç=¼§=µ§=®§=§§= §=™§=’§=‹§=„§=}§=v§=o§=h§=a§=Z§=S§=L§=E§=>§=7§=0§=)§="§=§=§= §=§=ÿ¦=ø¦=ñ¦=ê¦=ã¦=ܦ=Õ¦=Φ=Ǧ=À¦=¹¦=²¦=«¦=¤¦=¦=–¦=¦=ˆ¦=¦=z¦=s¦=l¦=e¦=^¦=W¦=P¦=I¦=B¦=;¦=4¦=-¦=&¦=¦=¦=¦= ¦=¦=ü¥=õ¥=î¥=ç¥=à¥=Ù¥=Ò¥=Ë¥=Ä¥=½¥=¶¥=¯¥=¨¥=¡¥=š¥=“¥=Œ¥=…¥=~¥=w¥=p¥=i¥=b¥=[¥=T¥=M¥=F¥=?¥=8¥=1¥=*¥=#¥=¥=¥=¥=¥=¥=ù¤=ò¤=ë¤=ä¤=ݤ=Ö¤=Ϥ=Ȥ=Á¤=º¤=³¤=¬¤=¥¤=ž¤=—¤=¤=‰¤=‚¤={¤=t¤=m¤=f¤=_¤=X¤=Q¤=J¤=C¤=<¤=5¤=.¤='¤= ¤=¤=¤= ¤=¤=ý£=ö£=ï£=è£=á£=Ú£=Ó£=Ì£=Å£=¾£=·£=°£=©£=¢£=›£=”£=£=†£=£=x£=q£=j£=c£=\£=U£=N£=G£=@£=9£=2£=+£=$£=£=£=£=£=£=ú¢=ó¢=ì¢=å¢=Þ¢=×¢=Т=É¢=¢=»¢=´¢=­¢=¦¢=Ÿ¢=˜¢=‘¢=Š¢=ƒ¢=|¢=u¢=n¢=g¢=`¢=Y¢=R¢=K¢=D¢==¢=6¢=/¢=(¢=!¢=¢=¢= ¢=¢=þ¡=÷¡=ð¡=é¡=â¡=Û¡=Ô¡=Í¡=Æ¡=¿¡=¸¡=±¡=ª¡=£¡=œ¡=•¡=Ž¡=‡¡=€¡=y¡=r¡=k¡=d¡=]¡=V¡=O¡=H¡=A¡=:¡=3¡=,¡=%¡=¡=¡=¡= ¡=¡=û =ô =í =æ =ß =Ø =Ñ =Ê =à=¼ =µ =® =§ =  =™ =’ =‹ =„ =} =v =o =h =a =Z =S =L =E => =7 =0 =) =" = = =  = =ÿŸ=øŸ=ñŸ=êŸ=ãŸ=ÜŸ=ÕŸ=Ο=ÇŸ=ÀŸ=¹Ÿ=²Ÿ=«Ÿ=¤Ÿ=Ÿ=–Ÿ=Ÿ=ˆŸ=Ÿ=zŸ=sŸ=lŸ=eŸ=^Ÿ=WŸ=PŸ=IŸ=BŸ=;Ÿ=4Ÿ=-Ÿ=&Ÿ=Ÿ=Ÿ=Ÿ= Ÿ=Ÿ=üž=õž=îž=çž=àž=Ùž=Òž=Ëž=Äž=½ž=¶ž=¯ž=¨ž=¡ž=šž=“ž=Œž=…ž=~ž=wž=pž=iž=bž=[ž=Tž=Mž=Fž=?ž=8ž=1ž=*ž=#ž=ž=ž=ž=ž=ž=ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ýœ=öœ=ïœ=èœ=áœ=Úœ=Óœ=Ìœ=Åœ=¾œ=·œ=°œ=©œ=¢œ=›œ=”œ=œ=†œ=œ=xœ=qœ=jœ=cœ=\œ=Uœ=Nœ=Gœ=@œ=9œ=2œ=+œ=$œ=œ=œ=œ=œ=œ=ú›=ó›=ì›=å›=Þ›=×›=Л=É›=›=»›=´›=­›=¦›=Ÿ›=˜›=‘›=Š›=ƒ›=|›=u›=n›=g›=`›=Y›=R›=K›=D›==›=6›=/›=(›=!›=›=›= ›=›=þš=÷š=ðš=éš=âš=Ûš=Ôš=Íš=Æš=¿š=¸š=±š=ªš=£š=œš=•š=Žš=‡š=€š=yš=rš=kš=dš=]š=Vš=Oš=Hš=Aš=:š=3š=,š=%š=š=š=š= š=š=û™=ô™=í™=æ™=ß™=Ø™=Ñ™=Ê™=Ù=¼™=µ™=®™=§™= ™=™™=’™=‹™=„™=}™=v™=o™=h™=a™=Z™=S™=L™=E™=>™=7™=0™=)™="™=™=™= ™=™=ÿ˜=ø˜=ñ˜=ê˜=ã˜=ܘ=Õ˜=Θ=ǘ=À˜=¹˜=²˜=«˜=¤˜=˜=–˜=˜=ˆ˜=˜=z˜=s˜=l˜=e˜=^˜=W˜=P˜=I˜=B˜=;˜=4˜=-˜=&˜=˜=˜=˜= ˜=˜=ü—=õ—=î—=ç—=à—=Ù—=Ò—=Ë—=Ä—=½—=¶—=¯—=¨—=¡—=š—=“—=Œ—=…—=~—=w—=p—=i—=b—=[—=T—=M—=F—=?—=8—=1—=*—=#—=—=—=—=—=—=ù–=ò–=ë–=ä–=Ý–=Ö–=Ï–=È–=Á–=º–=³–=¬–=¥–=ž–=—–=–=‰–=‚–={–=t–=m–=f–=_–=X–=Q–=J–=C–=<–=5–=.–='–= –=–=–= –=–=ý•=ö•=ï•=è•=á•=Ú•=Ó•=Ì•=Å•=¾•=·•=°•=©•=¢•=›•=”•=•=†•=•=x•=q•=j•=c•=\•=U•=N•=G•=@•=9•=2•=+•=$•=•=•=•=•=•=ú”=ó”=ì”=å”=Þ”=×”=Д=É”=”=»”=´”=­”=¦”=Ÿ”=˜”=‘”=Š”=ƒ”=|”=u”=n”=g”=`”=Y”=R”=K”=D”==”=6”=/”=(”=!”=”=”= ”=”=þ“=÷“=ð“=é“=â“=Û“=Ô“=Í“=Æ“=¿“=¸“=±“=ª“=£“=œ“=•“=Ž“=‡“=€“=y“=r“=k“=d“=]“=V“=O“=H“=A“=:“=3“=,“=%“=“=“=“= “=“=û’=ô’=í’=æ’=ß’=Ø’=Ñ’=Ê’=Ã’=¼’=µ’=®’=§’= ’=™’=’’=‹’=„’=}’=v’=o’=h’=a’=Z’=S’=L’=E’=>’=7’=0’=)’="’=’=’= ’=’=ÿ‘=ø‘=ñ‘=ê‘=ã‘=Ü‘=Õ‘=Α=Ç‘=À‘=¹‘=²‘=«‘=¤‘=‘=–‘=‘=ˆ‘=‘=z‘=s‘=l‘=e‘=^‘=W‘=P‘=I‘=B‘=;‘=4‘=-‘=&‘=‘=‘=‘= ‘=‘=ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ýŽ=öŽ=ïŽ=èŽ=áŽ=ÚŽ=ÓŽ=ÌŽ=ÅŽ=¾Ž=·Ž=°Ž=©Ž=¢Ž=›Ž=”Ž=Ž=†Ž=Ž=xŽ=qŽ=jŽ=cŽ=\Ž=UŽ=NŽ=GŽ=@Ž=9Ž=2Ž=+Ž=$Ž=Ž=Ž=Ž=Ž=Ž=ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þŒ=÷Œ=ðŒ=éŒ=âŒ=ÛŒ=ÔŒ=ÍŒ=ÆŒ=¿Œ=¸Œ=±Œ=ªŒ=£Œ=œŒ=•Œ=ŽŒ=‡Œ=€Œ=yŒ=rŒ=kŒ=dŒ=]Œ=VŒ=OŒ=HŒ=AŒ=:Œ=3Œ=,Œ=%Œ=Œ=Œ=Œ= Œ=Œ=û‹=ô‹=í‹=æ‹=ß‹=Ø‹=Ñ‹=Ê‹=Ë=¼‹=µ‹=®‹=§‹= ‹=™‹=’‹=‹‹=„‹=}‹=v‹=o‹=h‹=a‹=Z‹=S‹=L‹=E‹=>‹=7‹=0‹=)‹="‹=‹=‹= ‹=‹=ÿŠ=øŠ=ñŠ=êŠ=ãŠ=ÜŠ=ÕŠ=Ί=ÇŠ=ÀŠ=¹Š=²Š=«Š=¤Š=Š=–Š=Š=ˆŠ=Š=zŠ=sŠ=lŠ=eŠ=^Š=WŠ=PŠ=IŠ=BŠ=;Š=4Š=-Š=&Š=Š=Š=Š= Š=Š=ü‰=õ‰=î‰=ç‰=à‰=Ù‰=Ò‰=ˉ=ĉ=½‰=¶‰=¯‰=¨‰=¡‰=š‰=“‰=Œ‰=…‰=~‰=w‰=p‰=i‰=b‰=[‰=T‰=M‰=F‰=?‰=8‰=1‰=*‰=#‰=‰=‰=‰=‰=‰=ùˆ=òˆ=ëˆ=äˆ=݈=Öˆ=ψ=Ȉ=Áˆ=ºˆ=³ˆ=¬ˆ=¥ˆ=žˆ=—ˆ=ˆ=‰ˆ=‚ˆ={ˆ=tˆ=mˆ=fˆ=_ˆ=Xˆ=Qˆ=Jˆ=Cˆ=<ˆ=5ˆ=.ˆ='ˆ= ˆ=ˆ=ˆ= ˆ=ˆ=ý‡=ö‡=ï‡=è‡=á‡=Ú‡=Ó‡=̇=Ň=¾‡=·‡=°‡=©‡=¢‡=›‡=”‡=‡=†‡=‡=x‡=q‡=j‡=c‡=\‡=U‡=N‡=G‡=@‡=9‡=2‡=+‡=$‡=‡=‡=‡=‡=‡=ú†=ó†=ì†=å†=Þ†=׆=І=Ɇ=†=»†=´†=­†=¦†=Ÿ†=˜†=‘†=І=ƒ†=|†=u†=n†=g†=`†=Y†=R†=K†=D†==†=6†=/†=(†=!†=†=†= †=†=þ…=÷…=ð…=é…=â…=Û…=Ô…=Í…=Æ…=¿…=¸…=±…=ª…=£…=œ…=•…=Ž…=‡…=€…=y…=r…=k…=d…=]…=V…=O…=H…=A…=:…=3…=,…=%…=…=…=…= …=…=û„=ô„=í„=æ„=ß„=Ø„=Ñ„=Ê„=Ä=¼„=µ„=®„=§„= „=™„=’„=‹„=„„=}„=v„=o„=h„=a„=Z„=S„=L„=E„=>„=7„=0„=)„="„=„=„= „=„=ÿƒ=øƒ=ñƒ=êƒ=ãƒ=܃=Õƒ=΃=ǃ=Àƒ=¹ƒ=²ƒ=«ƒ=¤ƒ=ƒ=–ƒ=ƒ=ˆƒ=ƒ=zƒ=sƒ=lƒ=eƒ=^ƒ=Wƒ=Pƒ=Iƒ=Bƒ=;ƒ=4ƒ=-ƒ=&ƒ=ƒ=ƒ=ƒ= ƒ=ƒ=ü‚=õ‚=î‚=ç‚=à‚=Ù‚=Ò‚=Ë‚=Ä‚=½‚=¶‚=¯‚=¨‚=¡‚=š‚=“‚=Œ‚=…‚=~‚=w‚=p‚=i‚=b‚=[‚=T‚=M‚=F‚=?‚=8‚=1‚=*‚=#‚=‚=‚=‚=‚=‚=ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý€=ö€=ï€=è€=á€=Ú€=Ó€=Ì€=Å€=¾€=·€=°€=©€=¢€=›€=”€=€=†€=€=x€=q€=j€=c€=\€=U€=N€=G€=@€=9€=2€=+€=$€=€=€=€=€=€=ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ~=÷~=ð~=é~=â~=Û~=Ô~=Í~=Æ~=¿~=¸~=±~=ª~=£~=œ~=•~=Ž~=‡~=€~=y~=r~=k~=d~=]~=V~=O~=H~=A~=:~=3~=,~=%~=~=~=~= ~=~=û}=ô}=í}=æ}=ß}=Ø}=Ñ}=Ê}=Ã}=¼}=µ}=®}=§}= }=™}=’}=‹}=„}=}}=v}=o}=h}=a}=Z}=S}=L}=E}=>}=7}=0}=)}="}=}=}= }=}=ÿ|=ø|=ñ|=ê|=ã|=Ü|=Õ|=Î|=Ç|=À|=¹|=²|=«|=¤|=|=–|=|=ˆ|=|=z|=s|=l|=e|=^|=W|=P|=I|=B|=;|=4|=-|=&|=|=|=|= |=|=ü{=õ{=î{=ç{=à{=Ù{=Ò{=Ë{=Ä{=½{=¶{=¯{=¨{=¡{=š{=“{=Œ{=…{=~{=w{=p{=i{=b{=[{=T{=M{=F{=?{=8{=1{=*{=#{={={={={={=ùz=òz=ëz=äz=Ýz=Öz=Ïz=Èz=Áz=ºz=³z=¬z=¥z=žz=—z=z=‰z=‚z={z=tz=mz=fz=_z=Xz=Qz=Jz=Cz=v=7v=0v=)v="v=v=v= v=v=ÿu=øu=ñu=êu=ãu=Üu=Õu=Îu=Çu=Àu=¹u=²u=«u=¤u=u=–u=u=ˆu=u=zu=su=lu=eu=^u=Wu=Pu=Iu=Bu=;u=4u=-u=&u=u=u=u= u=u=üt=õt=ît=çt=àt=Ùt=Òt=Ët=Ät=½t=¶t=¯t=¨t=¡t=št=“t=Œt=…t=~t=wt=pt=it=bt=[t=Tt=Mt=Ft=?t=8t=1t=*t=#t=t=t=t=t=t=ùs=òs=ës=äs=Ýs=Ös=Ïs=Ès=Ás=ºs=³s=¬s=¥s=žs=—s=s=‰s=‚s={s=ts=ms=fs=_s=Xs=Qs=Js=Cs=o=7o=0o=)o="o=o=o= o=o=ÿn=øn=ñn=ên=ãn=Ün=Õn=În=Çn=Àn=¹n=²n=«n=¤n=n=–n=n=ˆn=n=zn=sn=ln=en=^n=Wn=Pn=In=Bn=;n=4n=-n=&n=n=n=n= n=n=üm=õm=îm=çm=àm=Ùm=Òm=Ëm=Äm=½m=¶m=¯m=¨m=¡m=šm=“m=Œm=…m=~m=wm=pm=im=bm=[m=Tm=Mm=Fm=?m=8m=1m=*m=#m=m=m=m=m=m=ùl=òl=ël=äl=Ýl=Öl=Ïl=Èl=Ál=ºl=³l=¬l=¥l=žl=—l=l=‰l=‚l={l=tl=ml=fl=_l=Xl=Ql=Jl=Cl=h=7h=0h=)h="h=h=h= h=h=ÿg=øg=ñg=êg=ãg=Üg=Õg=Îg=Çg=Àg=¹g=²g=«g=¤g=g=–g=g=ˆg=g=zg=sg=lg=eg=^g=Wg=Pg=Ig=Bg=;g=4g=-g=&g=g=g=g= g=g=üf=õf=îf=çf=àf=Ùf=Òf=Ëf=Äf=½f=¶f=¯f=¨f=¡f=šf=“f=Œf=…f=~f=wf=pf=if=bf=[f=Tf=Mf=Ff=?f=8f=1f=*f=#f=f=f=f=f=f=ùe=òe=ëe=äe=Ýe=Öe=Ïe=Èe=Áe=ºe=³e=¬e=¥e=že=—e=e=‰e=‚e={e=te=me=fe=_e=Xe=Qe=Je=Ce=a=7a=0a=)a="a=a=a= a=a=ÿ`=ø`=ñ`=ê`=ã`=Ü`=Õ`=Î`=Ç`=À`=¹`=²`=«`=¤`=`=–`=`=ˆ`=`=z`=s`=l`=e`=^`=W`=P`=I`=B`=;`=4`=-`=&`=`=`=`= `=`=ü_=õ_=î_=ç_=à_=Ù_=Ò_=Ë_=Ä_=½_=¶_=¯_=¨_=¡_=š_=“_=Œ_=…_=~_=w_=p_=i_=b_=[_=T_=M_=F_=?_=8_=1_=*_=#_=_=_=_=_=_=ù^=ò^=ë^=ä^=Ý^=Ö^=Ï^=È^=Á^=º^=³^=¬^=¥^=ž^=—^=^=‰^=‚^={^=t^=m^=f^=_^=X^=Q^=J^=C^=<^=5^=.^='^= ^=^=^= ^=^=ý]=ö]=ï]=è]=á]=Ú]=Ó]=Ì]=Å]=¾]=·]=°]=©]=¢]=›]=”]=]=†]=]=x]=q]=j]=c]=\]=U]=N]=G]=@]=9]=2]=+]=$]=]=]=]=]=]=ú\=ó\=ì\=å\=Þ\=×\=Ð\=É\=Â\=»\=´\=­\=¦\=Ÿ\=˜\=‘\=Š\=ƒ\=|\=u\=n\=g\=`\=Y\=R\=K\=D\==\=6\=/\=(\=!\=\=\= \=\=þ[=÷[=ð[=é[=â[=Û[=Ô[=Í[=Æ[=¿[=¸[=±[=ª[=£[=œ[=•[=Ž[=‡[=€[=y[=r[=k[=d[=][=V[=O[=H[=A[=:[=3[=,[=%[=[=[=[= [=[=ûZ=ôZ=íZ=æZ=ßZ=ØZ=ÑZ=ÊZ=ÃZ=¼Z=µZ=®Z=§Z= Z=™Z=’Z=‹Z=„Z=}Z=vZ=oZ=hZ=aZ=ZZ=SZ=LZ=EZ=>Z=7Z=0Z=)Z="Z=Z=Z= Z=Z=ÿY=øY=ñY=êY=ãY=ÜY=ÕY=ÎY=ÇY=ÀY=¹Y=²Y=«Y=¤Y=Y=–Y=Y=ˆY=Y=zY=sY=lY=eY=^Y=WY=PY=IY=BY=;Y=4Y=-Y=&Y=Y=Y=Y= Y=Y=üX=õX=îX=çX=àX=ÙX=ÒX=ËX=ÄX=½X=¶X=¯X=¨X=¡X=šX=“X=ŒX=…X=~X=wX=pX=iX=bX=[X=TX=MX=FX=?X=8X=1X=*X=#X=X=X=X=X=X=ùW=òW=ëW=äW=ÝW=ÖW=ÏW=ÈW=ÁW=ºW=³W=¬W=¥W=žW=—W=W=‰W=‚W={W=tW=mW=fW=_W=XW=QW=JW=CW=S=7S=0S=)S="S=S=S= S=S=ÿR=øR=ñR=êR=ãR=ÜR=ÕR=ÎR=ÇR=ÀR=¹R=²R=«R=¤R=R=–R=R=ˆR=R=zR=sR=lR=eR=^R=WR=PR=IR=BR=;R=4R=-R=&R=R=R=R= R=R=üQ=õQ=îQ=çQ=àQ=ÙQ=ÒQ=ËQ=ÄQ=½Q=¶Q=¯Q=¨Q=¡Q=šQ=“Q=ŒQ=…Q=~Q=wQ=pQ=iQ=bQ=[Q=TQ=MQ=FQ=?Q=8Q=1Q=*Q=#Q=Q=Q=Q=Q=Q=ùP=òP=ëP=äP=ÝP=ÖP=ÏP=ÈP=ÁP=ºP=³P=¬P=¥P=žP=—P=P=‰P=‚P={P=tP=mP=fP=_P=XP=QP=JP=CP=L=7L=0L=)L="L=L=L= L=L=ÿK=øK=ñK=êK=ãK=ÜK=ÕK=ÎK=ÇK=ÀK=¹K=²K=«K=¤K=K=–K=K=ˆK=K=zK=sK=lK=eK=^K=WK=PK=IK=BK=;K=4K=-K=&K=K=K=K= K=K=üJ=õJ=îJ=çJ=àJ=ÙJ=ÒJ=ËJ=ÄJ=½J=¶J=¯J=¨J=¡J=šJ=“J=ŒJ=…J=~J=wJ=pJ=iJ=bJ=[J=TJ=MJ=FJ=?J=8J=1J=*J=#J=J=J=J=J=J=ùI=òI=ëI=äI=ÝI=ÖI=ÏI=ÈI=ÁI=ºI=³I=¬I=¥I=žI=—I=I=‰I=‚I={I=tI=mI=fI=_I=XI=QI=JI=CI=E=7E=0E=)E="E=E=E= E=E=ÿD=øD=ñD=êD=ãD=ÜD=ÕD=ÎD=ÇD=ÀD=¹D=²D=«D=¤D=D=–D=D=ˆD=D=zD=sD=lD=eD=^D=WD=PD=ID=BD=;D=4D=-D=&D=D=D=D= D=D=üC=õC=îC=çC=àC=ÙC=ÒC=ËC=ÄC=½C=¶C=¯C=¨C=¡C=šC=“C=ŒC=…C=~C=wC=pC=iC=bC=[C=TC=MC=FC=?C=8C=1C=*C=#C=C=C=C=C=C=ùB=òB=ëB=äB=ÝB=ÖB=ÏB=ÈB=ÁB=ºB=³B=¬B=¥B=žB=—B=B=‰B=‚B={B=tB=mB=fB=_B=XB=QB=JB=CB==ô>=í>=æ>=ß>=Ø>=Ñ>=Ê>=Ã>=¼>=µ>=®>=§>= >=™>=’>=‹>=„>=}>=v>=o>=h>=a>=Z>=S>=L>=E>=>>=7>=0>=)>=">=>=>= >=>=ÿ==ø==ñ==ê==ã==Ü==Õ==Î==Ç==À==¹==²==«==¤====–====ˆ====z==s==l==e==^==W==P==I==B==;==4==-==&======== ====ü<=õ<=î<=ç<=à<=Ù<=Ò<=Ë<=Ä<=½<=¶<=¯<=¨<=¡<=š<=“<=Œ<=…<=~<=w<=p<=i<=b<=[<=T<=M<=F<=?<=8<=1<=*<=#<=<=<=<=<=<=ù;=ò;=ë;=ä;=Ý;=Ö;=Ï;=È;=Á;=º;=³;=¬;=¥;=ž;=—;=;=‰;=‚;={;=t;=m;=f;=_;=X;=Q;=J;=C;=<;=5;=.;=';= ;=;=;= ;=;=ý:=ö:=ï:=è:=á:=Ú:=Ó:=Ì:=Å:=¾:=·:=°:=©:=¢:=›:=”:=:=†:=:=x:=q:=j:=c:=\:=U:=N:=G:=@:=9:=2:=+:=$:=:=:=:=:=:=ú9=ó9=ì9=å9=Þ9=×9=Ð9=É9=Â9=»9=´9=­9=¦9=Ÿ9=˜9=‘9=Š9=ƒ9=|9=u9=n9=g9=`9=Y9=R9=K9=D9==9=69=/9=(9=!9=9=9= 9=9=þ8=÷8=ð8=é8=â8=Û8=Ô8=Í8=Æ8=¿8=¸8=±8=ª8=£8=œ8=•8=Ž8=‡8=€8=y8=r8=k8=d8=]8=V8=O8=H8=A8=:8=38=,8=%8=8=8=8= 8=8=û7=ô7=í7=æ7=ß7=Ø7=Ñ7=Ê7=Ã7=¼7=µ7=®7=§7= 7=™7=’7=‹7=„7=}7=v7=o7=h7=a7=Z7=S7=L7=E7=>7=77=07=)7="7=7=7= 7=7=ÿ6=ø6=ñ6=ê6=ã6=Ü6=Õ6=Î6=Ç6=À6=¹6=²6=«6=¤6=6=–6=6=ˆ6=6=z6=s6=l6=e6=^6=W6=P6=I6=B6=;6=46=-6=&6=6=6=6= 6=6=ü5=õ5=î5=ç5=à5=Ù5=Ò5=Ë5=Ä5=½5=¶5=¯5=¨5=¡5=š5=“5=Œ5=…5=~5=w5=p5=i5=b5=[5=T5=M5=F5=?5=85=15=*5=#5=5=5=5=5=5=ù4=ò4=ë4=ä4=Ý4=Ö4=Ï4=È4=Á4=º4=³4=¬4=¥4=ž4=—4=4=‰4=‚4={4=t4=m4=f4=_4=X4=Q4=J4=C4=<4=54=.4='4= 4=4=4= 4=4=ý3=ö3=ï3=è3=á3=Ú3=Ó3=Ì3=Å3=¾3=·3=°3=©3=¢3=›3=”3=3=†3=3=x3=q3=j3=c3=\3=U3=N3=G3=@3=93=23=+3=$3=3=3=3=3=3=ú2=ó2=ì2=å2=Þ2=×2=Ð2=É2=Â2=»2=´2=­2=¦2=Ÿ2=˜2=‘2=Š2=ƒ2=|2=u2=n2=g2=`2=Y2=R2=K2=D2==2=62=/2=(2=!2=2=2= 2=2=þ1=÷1=ð1=é1=â1=Û1=Ô1=Í1=Æ1=¿1=¸1=±1=ª1=£1=œ1=•1=Ž1=‡1=€1=y1=r1=k1=d1=]1=V1=O1=H1=A1=:1=31=,1=%1=1=1=1= 1=1=û0=ô0=í0=æ0=ß0=Ø0=Ñ0=Ê0=Ã0=¼0=µ0=®0=§0= 0=™0=’0=‹0=„0=}0=v0=o0=h0=a0=Z0=S0=L0=E0=>0=70=00=)0="0=0=0= 0=0=ÿ/=ø/=ñ/=ê/=ã/=Ü/=Õ/=Î/=Ç/=À/=¹/=²/=«/=¤/=/=–/=/=ˆ/=/=z/=s/=l/=e/=^/=W/=P/=I/=B/=;/=4/=-/=&/=/=/=/= /=/=ü.=õ.=î.=ç.=à.=Ù.=Ò.=Ë.=Ä.=½.=¶.=¯.=¨.=¡.=š.=“.=Œ.=….=~.=w.=p.=i.=b.=[.=T.=M.=F.=?.=8.=1.=*.=#.=.=.=.=.=.=ù-=ò-=ë-=ä-=Ý-=Ö-=Ï-=È-=Á-=º-=³-=¬-=¥-=ž-=—-=-=‰-=‚-={-=t-=m-=f-=_-=X-=Q-=J-=C-=<-=5-=.-='-= -=-=-= -=-=ý,=ö,=ï,=è,=á,=Ú,=Ó,=Ì,=Å,=¾,=·,=°,=©,=¢,=›,=”,=,=†,=,=x,=q,=j,=c,=\,=U,=N,=G,=@,=9,=2,=+,=$,=,=,=,=,=,=ú+=ó+=ì+=å+=Þ+=×+=Ð+=É+=Â+=»+=´+=­+=¦+=Ÿ+=˜+=‘+=Š+=ƒ+=|+=u+=n+=g+=`+=Y+=R+=K+=D+==+=6+=/+=(+=!+=+=+= +=+=þ*=÷*=ð*=é*=â*=Û*=Ô*=Í*=Æ*=¿*=¸*=±*=ª*=£*=œ*=•*=Ž*=‡*=€*=y*=r*=k*=d*=]*=V*=O*=H*=A*=:*=3*=,*=%*=*=*=*= *=*=û)=ô)=í)=æ)=ß)=Ø)=Ñ)=Ê)=Ã)=¼)=µ)=®)=§)= )=™)=’)=‹)=„)=})=v)=o)=h)=a)=Z)=S)=L)=E)=>)=7)=0)=))=")=)=)= )=)=ÿ(=ø(=ñ(=ê(=ã(=Ü(=Õ(=Î(=Ç(=À(=¹(=²(=«(=¤(=(=–(=(=ˆ(=(=z(=s(=l(=e(=^(=W(=P(=I(=B(=;(=4(=-(=&(=(=(=(= (=(=ü'=õ'=î'=ç'=à'=Ù'=Ò'=Ë'=Ä'=½'=¶'=¯'=¨'=¡'=š'=“'=Œ'=…'=~'=w'=p'=i'=b'=['=T'=M'=F'=?'=8'=1'=*'=#'='='='='='=ù&=ò&=ë&=ä&=Ý&=Ö&=Ï&=È&=Á&=º&=³&=¬&=¥&=ž&=—&=&=‰&=‚&={&=t&=m&=f&=_&=X&=Q&=J&=C&=<&=5&=.&='&= &=&=&= &=&=ý%=ö%=ï%=è%=á%=Ú%=Ó%=Ì%=Å%=¾%=·%=°%=©%=¢%=›%=”%=%=†%=%=x%=q%=j%=c%=\%=U%=N%=G%=@%=9%=2%=+%=$%=%=%=%=%=%=ú$=ó$=ì$=å$=Þ$=×$=Ð$=É$=Â$=»$=´$=­$=¦$=Ÿ$=˜$=‘$=Š$=ƒ$=|$=u$=n$=g$=`$=Y$=R$=K$=D$==$=6$=/$=($=!$=$=$= $=$=þ#=÷#=ð#=é#=â#=Û#=Ô#=Í#=Æ#=¿#=¸#=±#=ª#=£#=œ#=•#=Ž#=‡#=€#=y#=r#=k#=d#=]#=V#=O#=H#=A#=:#=3#=,#=%#=#=#=#= #=#=û"=ô"=í"=æ"=ß"=Ø"=Ñ"=Ê"=Ã"=¼"=µ"=®"=§"= "=™"=’"=‹"=„"=}"=v"=o"=h"=a"=Z"=S"=L"=E"=>"=7"=0"=)"=""="="= "="=ÿ!=ø!=ñ!=ê!=ã!=Ü!=Õ!=Î!=Ç!=À!=¹!=²!=«!=¤!=!=–!=!=ˆ!=!=z!=s!=l!=e!=^!=W!=P!=I!=B!=;!=4!=-!=&!=!=!=!= !=!=ü =õ =î =ç =à =Ù =Ò =Ë =Ä =½ =¶ =¯ =¨ =¡ =š =“ =Œ =… =~ =w =p =i =b =[ =T =M =F =? =8 =1 =* =# = = = = = =ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û =ô =í =æ =ß =Ø =Ñ =Ê =à =¼ =µ =® =§ =  =™ =’ =‹ =„ =} =v =o =h =a =Z =S =L =E => =7 =0 =) =" = = = = =ÿ =ø =ñ =ê =ã =Ü =Õ =Î =Ç =À =¹ =² =« =¤ = =– = =ˆ = =z =s =l =e =^ =W =P =I =B =; =4 =- =& = = = = = =ü =õ =î =ç =à =Ù =Ò =Ë =Ä =½ =¶ =¯ =¨ =¡ =š =“ =Œ =… =~ =w =p =i =b =[ =T =M =F =? =8 =1 =* =# = = = = = =ù =ò =ë =ä =Ý =Ö =Ï =È =Á =º =³ =¬ =¥ =ž =— = =‰ =‚ ={ =t =m =f =_ =X =Q =J =C =< =5 =. =' = = = = = =ý =ö =ï =è =á =Ú =Ó =Ì =Å =¾ =· =° =© =¢ =› =” = =† = =x =q =j =c =\ =U =N =G =@ =9 =2 =+ =$ = = = = = =ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==ûÿ<ôÿ<íÿ<æÿ<ßÿ<Øÿ<Ñÿ<Êÿ<Ãÿ<¼ÿ<µÿ<®ÿ<§ÿ< ÿ<™ÿ<’ÿ<‹ÿ<„ÿ<}ÿ<vÿ<oÿ<hÿ<aÿ<Zÿ<Sÿ<Lÿ<Eÿ<>ÿ<7ÿ<0ÿ<)ÿ<"ÿ<ÿ<ÿ< ÿ<ÿ<ÿþ<øþ<ñþ<êþ<ãþ<Üþ<Õþ<Îþ<Çþ<Àþ<¹þ<²þ<«þ<¤þ<þ<–þ<þ<ˆþ<þ<zþ<sþ<lþ<eþ<^þ<Wþ<Pþ<Iþ<Bþ<;þ<4þ<-þ<&þ<þ<þ<þ< þ<þ<üý<õý<îý<çý<àý<Ùý<Òý<Ëý<Äý<½ý<¶ý<¯ý<¨ý<¡ý<šý<“ý<Œý<…ý<~ý<wý<pý<iý<bý<[ý<Tý<Mý<Fý<?ý<8ý<1ý<*ý<#ý<ý<ý<ý<ý<ý<ùü<òü<ëü<äü<Ýü<Öü<Ïü<Èü<Áü<ºü<³ü<¬ü<¥ü<žü<—ü<ü<‰ü<‚ü<{ü<tü<mü<fü<_ü<Xü<Qü<Jü<Cü<<ü<5ü<.ü<'ü< ü<ü<ü< ü<ü<ýû<öû<ïû<èû<áû<Úû<Óû<Ìû<Åû<¾û<·û<°û<©û<¢û<›û<”û<û<†û<û<xû<qû<jû<cû<\û<Uû<Nû<Gû<@û<9û<2û<+û<$û<û<û<û<û<û<úú<óú<ìú<åú<Þú<×ú<Ðú<Éú<Âú<»ú<´ú<­ú<¦ú<Ÿú<˜ú<‘ú<Šú<ƒú<|ú<uú<nú<gú<`ú<Yú<Rú<Kú<Dú<=ú<6ú</ú<(ú<!ú<ú<ú< ú<ú<þù<÷ù<ðù<éù<âù<Ûù<Ôù<Íù<Æù<¿ù<¸ù<±ù<ªù<£ù<œù<•ù<Žù<‡ù<€ù<yù<rù<kù<dù<]ù<Vù<Où<Hù<Aù<:ù<3ù<,ù<%ù<ù<ù<ù< ù<ù<ûø<ôø<íø<æø<ßø<Øø<Ñø<Êø<Ãø<¼ø<µø<®ø<§ø< ø<™ø<’ø<‹ø<„ø<}ø<vø<oø<hø<aø<Zø<Sø<Lø<Eø<>ø<7ø<0ø<)ø<"ø<ø<ø< ø<ø<ÿ÷<ø÷<ñ÷<ê÷<ã÷<Ü÷<Õ÷<Î÷<Ç÷<À÷<¹÷<²÷<«÷<¤÷<÷<–÷<÷<ˆ÷<÷<z÷<s÷<l÷<e÷<^÷<W÷<P÷<I÷<B÷<;÷<4÷<-÷<&÷<÷<÷<÷< ÷<÷<üö<õö<îö<çö<àö<Ùö<Òö<Ëö<Äö<½ö<¶ö<¯ö<¨ö<¡ö<šö<“ö<Œö<…ö<~ö<wö<pö<iö<bö<[ö<Tö<Mö<Fö<?ö<8ö<1ö<*ö<#ö<ö<ö<ö<ö<ö<ùõ<òõ<ëõ<äõ<Ýõ<Öõ<Ïõ<Èõ<Áõ<ºõ<³õ<¬õ<¥õ<žõ<—õ<õ<‰õ<‚õ<{õ<tõ<mõ<fõ<_õ<Xõ<Qõ<Jõ<Cõ<<õ<5õ<.õ<'õ< õ<õ<õ< õ<õ<ýô<öô<ïô<èô<áô<Úô<Óô<Ìô<Åô<¾ô<·ô<°ô<©ô<¢ô<›ô<”ô<ô<†ô<ô<xô<qô<jô<cô<\ô<Uô<Nô<Gô<@ô<9ô<2ô<+ô<$ô<ô<ô<ô<ô<ô<úó<óó<ìó<åó<Þó<×ó<Ðó<Éó<Âó<»ó<´ó<­ó<¦ó<Ÿó<˜ó<‘ó<Šó<ƒó<|ó<uó<nó<gó<`ó<Yó<Ró<Kó<Dó<=ó<6ó</ó<(ó<!ó<ó<ó< ó<ó<þò<÷ò<ðò<éò<âò<Ûò<Ôò<Íò<Æò<¿ò<¸ò<±ò<ªò<£ò<œò<•ò<Žò<‡ò<€ò<yò<rò<kò<dò<]ò<Vò<Oò<Hò<Aò<:ò<3ò<,ò<%ò<ò<ò<ò< ò<ò<ûñ<ôñ<íñ<æñ<ßñ<Øñ<Ññ<Êñ<Ãñ<¼ñ<µñ<®ñ<§ñ< ñ<™ñ<’ñ<‹ñ<„ñ<}ñ<vñ<oñ<hñ<añ<Zñ<Sñ<Lñ<Eñ<>ñ<7ñ<0ñ<)ñ<"ñ<ñ<ñ< ñ<ñ<ÿð<øð<ñð<êð<ãð<Üð<Õð<Îð<Çð<Àð<¹ð<²ð<«ð<¤ð<ð<–ð<ð<ˆð<ð<zð<sð<lð<eð<^ð<Wð<Pð<Ið<Bð<;ð<4ð<-ð<&ð<ð<ð<ð< ð<ð<üï<õï<îï<çï<àï<Ùï<Òï<Ëï<Äï<½ï<¶ï<¯ï<¨ï<¡ï<šï<“ï<Œï<…ï<~ï<wï<pï<iï<bï<[ï<Tï<Mï<Fï<?ï<8ï<1ï<*ï<#ï<ï<ï<ï<ï<ï<ùî<òî<ëî<äî<Ýî<Öî<Ïî<Èî<Áî<ºî<³î<¬î<¥î<žî<—î<î<‰î<‚î<{î<tî<mî<fî<_î<Xî<Qî<Jî<Cî<<î<5î<.î<'î< î<î<î< î<î<ýí<öí<ïí<èí<áí<Úí<Óí<Ìí<Åí<¾í<·í<°í<©í<¢í<›í<”í<í<†í<í<xí<qí<jí<cí<\í<Uí<Ní<Gí<@í<9í<2í<+í<$í<í<í<í<í<í<úì<óì<ìì<åì<Þì<×ì<Ðì<Éì<Âì<»ì<´ì<­ì<¦ì<Ÿì<˜ì<‘ì<Šì<ƒì<|ì<uì<nì<gì<`ì<Yì<Rì<Kì<Dì<=ì<6ì</ì<(ì<!ì<ì<ì< ì<ì<þë<÷ë<ðë<éë<âë<Ûë<Ôë<Íë<Æë<¿ë<¸ë<±ë<ªë<£ë<œë<•ë<Žë<‡ë<€ë<yë<rë<kë<dë<]ë<Vë<Oë<Hë<Aë<:ë<3ë<,ë<%ë<ë<ë<ë< ë<ë<ûê<ôê<íê<æê<ßê<Øê<Ñê<Êê<Ãê<¼ê<µê<®ê<§ê< ê<™ê<’ê<‹ê<„ê<}ê<vê<oê<hê<aê<Zê<Sê<Lê<Eê<>ê<7ê<0ê<)ê<"ê<ê<ê< ê<ê<ÿé<øé<ñé<êé<ãé<Üé<Õé<Îé<Çé<Àé<¹é<²é<«é<¤é<é<–é<é<ˆé<é<zé<sé<lé<eé<^é<Wé<Pé<Ié<Bé<;é<4é<-é<&é<é<é<é< é<é<üè<õè<îè<çè<àè<Ùè<Òè<Ëè<Äè<½è<¶è<¯è<¨è<¡è<šè<“è<Œè<…è<~è<wè<pè<iè<bè<[è<Tè<Mè<Fè<?è<8è<1è<*è<#è<è<è<è<è<è<ùç<òç<ëç<äç<Ýç<Öç<Ïç<Èç<Áç<ºç<³ç<¬ç<¥ç<žç<—ç<ç<‰ç<‚ç<{ç<tç<mç<fç<_ç<Xç<Qç<Jç<Cç<<ç<5ç<.ç<'ç< ç<ç<ç< ç<ç<ýæ<öæ<ïæ<èæ<áæ<Úæ<Óæ<Ìæ<Åæ<¾æ<·æ<°æ<©æ<¢æ<›æ<”æ<æ<†æ<æ<xæ<qæ<jæ<cæ<\æ<Uæ<Næ<Gæ<@æ<9æ<2æ<+æ<$æ<æ<æ<æ<æ<æ<úå<óå<ìå<åå<Þå<×å<Ðå<Éå<Âå<»å<´å<­å<¦å<Ÿå<˜å<‘å<Šå<ƒå<|å<uå<nå<gå<`å<Yå<Rå<Kå<Då<=å<6å</å<(å<!å<å<å< å<å<þä<÷ä<ðä<éä<âä<Ûä<Ôä<Íä<Æä<¿ä<¸ä<±ä<ªä<£ä<œä<•ä<Žä<‡ä<€ä<yä<rä<kä<dä<]ä<Vä<Oä<Hä<Aä<:ä<3ä<,ä<%ä<ä<ä<ä< ä<ä<ûã<ôã<íã<æã<ßã<Øã<Ñã<Êã<Ãã<¼ã<µã<®ã<§ã< ã<™ã<’ã<‹ã<„ã<}ã<vã<oã<hã<aã<Zã<Sã<Lã<Eã<>ã<7ã<0ã<)ã<"ã<ã<ã< ã<ã<ÿâ<øâ<ñâ<êâ<ãâ<Üâ<Õâ<Îâ<Çâ<Àâ<¹â<²â<«â<¤â<â<–â<â<ˆâ<â<zâ<sâ<lâ<eâ<^â<Wâ<Pâ<Iâ<Bâ<;â<4â<-â<&â<â<â<â< â<â<üá<õá<îá<çá<àá<Ùá<Òá<Ëá<Äá<½á<¶á<¯á<¨á<¡á<šá<“á<Œá<…á<~á<wá<pá<iá<bá<[á<Tá<Má<Fá<?á<8á<1á<*á<#á<á<á<á<á<á<ùà<òà<ëà<äà<Ýà<Öà<Ïà<Èà<Áà<ºà<³à<¬à<¥à<žà<—à<à<‰à<‚à<{à<tà<mà<fà<_à<Xà<Qà<Jà<Cà<<à<5à<.à<'à< à<à<à< à<à<ýß<öß<ïß<èß<áß<Úß<Óß<Ìß<Åß<¾ß<·ß<°ß<©ß<¢ß<›ß<”ß<ß<†ß<ß<xß<qß<jß<cß<\ß<Uß<Nß<Gß<@ß<9ß<2ß<+ß<$ß<ß<ß<ß<ß<ß<úÞ<óÞ<ìÞ<åÞ<ÞÞ<×Þ<ÐÞ<ÉÞ<ÂÞ<»Þ<´Þ<­Þ<¦Þ<ŸÞ<˜Þ<‘Þ<ŠÞ<ƒÞ<|Þ<uÞ<nÞ<gÞ<`Þ<YÞ<RÞ<KÞ<DÞ<=Þ<6Þ</Þ<(Þ<!Þ<Þ<Þ< Þ<Þ<þÝ<÷Ý<ðÝ<éÝ<âÝ<ÛÝ<ÔÝ<ÍÝ<ÆÝ<¿Ý<¸Ý<±Ý<ªÝ<£Ý<œÝ<•Ý<ŽÝ<‡Ý<€Ý<yÝ<rÝ<kÝ<dÝ<]Ý<VÝ<OÝ<HÝ<AÝ<:Ý<3Ý<,Ý<%Ý<Ý<Ý<Ý< Ý<Ý<ûÜ<ôÜ<íÜ<æÜ<ßÜ<ØÜ<ÑÜ<ÊÜ<ÃÜ<¼Ü<µÜ<®Ü<§Ü< Ü<™Ü<’Ü<‹Ü<„Ü<}Ü<vÜ<oÜ<hÜ<aÜ<ZÜ<SÜ<LÜ<EÜ<>Ü<7Ü<0Ü<)Ü<"Ü<Ü<Ü< Ü<Ü<ÿÛ<øÛ<ñÛ<êÛ<ãÛ<ÜÛ<ÕÛ<ÎÛ<ÇÛ<ÀÛ<¹Û<²Û<«Û<¤Û<Û<–Û<Û<ˆÛ<Û<zÛ<sÛ<lÛ<eÛ<^Û<WÛ<PÛ<IÛ<BÛ<;Û<4Û<-Û<&Û<Û<Û<Û< Û<Û<üÚ<õÚ<îÚ<çÚ<àÚ<ÙÚ<ÒÚ<ËÚ<ÄÚ<½Ú<¶Ú<¯Ú<¨Ú<¡Ú<šÚ<“Ú<ŒÚ<…Ú<~Ú<wÚ<pÚ<iÚ<bÚ<[Ú<TÚ<MÚ<FÚ<?Ú<8Ú<1Ú<*Ú<#Ú<Ú<Ú<Ú<Ú<Ú<ùÙ<òÙ<ëÙ<äÙ<ÝÙ<ÖÙ<ÏÙ<ÈÙ<ÁÙ<ºÙ<³Ù<¬Ù<¥Ù<žÙ<—Ù<Ù<‰Ù<‚Ù<{Ù<tÙ<mÙ<fÙ<_Ù<XÙ<QÙ<JÙ<CÙ<<Ù<5Ù<.Ù<'Ù< Ù<Ù<Ù< Ù<Ù<ýØ<öØ<ïØ<èØ<áØ<ÚØ<ÓØ<ÌØ<ÅØ<¾Ø<·Ø<°Ø<©Ø<¢Ø<›Ø<”Ø<Ø<†Ø<Ø<xØ<qØ<jØ<cØ<\Ø<UØ<NØ<GØ<@Ø<9Ø<2Ø<+Ø<$Ø<Ø<Ø<Ø<Ø<Ø<ú×<ó×<ì×<å×<Þ×<××<Ð×<É×<Â×<»×<´×<­×<¦×<Ÿ×<˜×<‘×<Š×<ƒ×<|×<u×<n×<g×<`×<Y×<R×<K×<D×<=×<6×</×<(×<!×<×<×< ×<×<þÖ<÷Ö<ðÖ<éÖ<âÖ<ÛÖ<ÔÖ<ÍÖ<ÆÖ<¿Ö<¸Ö<±Ö<ªÖ<£Ö<œÖ<•Ö<ŽÖ<‡Ö<€Ö<yÖ<rÖ<kÖ<dÖ<]Ö<VÖ<OÖ<HÖ<AÖ<:Ö<3Ö<,Ö<%Ö<Ö<Ö<Ö< Ö<Ö<ûÕ<ôÕ<íÕ<æÕ<ßÕ<ØÕ<ÑÕ<ÊÕ<ÃÕ<¼Õ<µÕ<®Õ<§Õ< Õ<™Õ<’Õ<‹Õ<„Õ<}Õ<vÕ<oÕ<hÕ<aÕ<ZÕ<SÕ<LÕ<EÕ<>Õ<7Õ<0Õ<)Õ<"Õ<Õ<Õ< Õ<Õ<ÿÔ<øÔ<ñÔ<êÔ<ãÔ<ÜÔ<ÕÔ<ÎÔ<ÇÔ<ÀÔ<¹Ô<²Ô<«Ô<¤Ô<Ô<–Ô<Ô<ˆÔ<Ô<zÔ<sÔ<lÔ<eÔ<^Ô<WÔ<PÔ<IÔ<BÔ<;Ô<4Ô<-Ô<&Ô<Ô<Ô<Ô< Ô<Ô<üÓ<õÓ<îÓ<çÓ<àÓ<ÙÓ<ÒÓ<ËÓ<ÄÓ<½Ó<¶Ó<¯Ó<¨Ó<¡Ó<šÓ<“Ó<ŒÓ<…Ó<~Ó<wÓ<pÓ<iÓ<bÓ<[Ó<TÓ<MÓ<FÓ<?Ó<8Ó<1Ó<*Ó<#Ó<Ó<Ó<Ó<Ó<Ó<ùÒ<òÒ<ëÒ<äÒ<ÝÒ<ÖÒ<ÏÒ<ÈÒ<ÁÒ<ºÒ<³Ò<¬Ò<¥Ò<žÒ<—Ò<Ò<‰Ò<‚Ò<{Ò<tÒ<mÒ<fÒ<_Ò<XÒ<QÒ<JÒ<CÒ<<Ò<5Ò<.Ò<'Ò< Ò<Ò<Ò< Ò<Ò<ýÑ<öÑ<ïÑ<èÑ<áÑ<ÚÑ<ÓÑ<ÌÑ<ÅÑ<¾Ñ<·Ñ<°Ñ<©Ñ<¢Ñ<›Ñ<”Ñ<Ñ<†Ñ<Ñ<xÑ<qÑ<jÑ<cÑ<\Ñ<UÑ<NÑ<GÑ<@Ñ<9Ñ<2Ñ<+Ñ<$Ñ<Ñ<Ñ<Ñ<Ñ<Ñ<úÐ<óÐ<ìÐ<åÐ<ÞÐ<×Ð<ÐÐ<ÉÐ<ÂÐ<»Ð<´Ð<­Ð<¦Ð<ŸÐ<˜Ð<‘Ð<ŠÐ<ƒÐ<|Ð<uÐ<nÐ<gÐ<`Ð<YÐ<RÐ<KÐ<DÐ<=Ð<6Ð</Ð<(Ð<!Ð<Ð<Ð< Ð<Ð<þÏ<÷Ï<ðÏ<éÏ<âÏ<ÛÏ<ÔÏ<ÍÏ<ÆÏ<¿Ï<¸Ï<±Ï<ªÏ<£Ï<œÏ<•Ï<ŽÏ<‡Ï<€Ï<yÏ<rÏ<kÏ<dÏ<]Ï<VÏ<OÏ<HÏ<AÏ<:Ï<3Ï<,Ï<%Ï<Ï<Ï<Ï< Ï<Ï<ûÎ<ôÎ<íÎ<æÎ<ßÎ<ØÎ<ÑÎ<ÊÎ<ÃÎ<¼Î<µÎ<®Î<§Î< Î<™Î<’Î<‹Î<„Î<}Î<vÎ<oÎ<hÎ<aÎ<ZÎ<SÎ<LÎ<EÎ<>Î<7Î<0Î<)Î<"Î<Î<Î< Î<Î<ÿÍ<øÍ<ñÍ<êÍ<ãÍ<ÜÍ<ÕÍ<ÎÍ<ÇÍ<ÀÍ<¹Í<²Í<«Í<¤Í<Í<–Í<Í<ˆÍ<Í<zÍ<sÍ<lÍ<eÍ<^Í<WÍ<PÍ<IÍ<BÍ<;Í<4Í<-Í<&Í<Í<Í<Í< Í<Í<üÌ<õÌ<îÌ<çÌ<àÌ<ÙÌ<ÒÌ<ËÌ<ÄÌ<½Ì<¶Ì<¯Ì<¨Ì<¡Ì<šÌ<“Ì<ŒÌ<…Ì<~Ì<wÌ<pÌ<iÌ<bÌ<[Ì<TÌ<MÌ<FÌ<?Ì<8Ì<1Ì<*Ì<#Ì<Ì<Ì<Ì<Ì<Ì<ùË<òË<ëË<äË<ÝË<ÖË<ÏË<ÈË<ÁË<ºË<³Ë<¬Ë<¥Ë<žË<—Ë<Ë<‰Ë<‚Ë<{Ë<tË<mË<fË<_Ë<XË<QË<JË<CË<<Ë<5Ë<.Ë<'Ë< Ë<Ë<Ë< Ë<Ë<ýÊ<öÊ<ïÊ<èÊ<áÊ<ÚÊ<ÓÊ<ÌÊ<ÅÊ<¾Ê<·Ê<°Ê<©Ê<¢Ê<›Ê<”Ê<Ê<†Ê<Ê<xÊ<qÊ<jÊ<cÊ<\Ê<UÊ<NÊ<GÊ<@Ê<9Ê<2Ê<+Ê<$Ê<Ê<Ê<Ê<Ê<Ê<úÉ<óÉ<ìÉ<åÉ<ÞÉ<×É<ÐÉ<ÉÉ<ÂÉ<»É<´É<­É<¦É<ŸÉ<˜É<‘É<ŠÉ<ƒÉ<|É<uÉ<nÉ<gÉ<`É<YÉ<RÉ<KÉ<DÉ<=É<6É</É<(É<!É<É<É< É<É<þÈ<÷È<ðÈ<éÈ<âÈ<ÛÈ<ÔÈ<ÍÈ<ÆÈ<¿È<¸È<±È<ªÈ<£È<œÈ<•È<ŽÈ<‡È<€È<yÈ<rÈ<kÈ<dÈ<]È<VÈ<OÈ<HÈ<AÈ<:È<3È<,È<%È<È<È<È< È<È<ûÇ<ôÇ<íÇ<æÇ<ßÇ<ØÇ<ÑÇ<ÊÇ<ÃÇ<¼Ç<µÇ<®Ç<§Ç< Ç<™Ç<’Ç<‹Ç<„Ç<}Ç<vÇ<oÇ<hÇ<aÇ<ZÇ<SÇ<LÇ<EÇ<>Ç<7Ç<0Ç<)Ç<"Ç<Ç<Ç< Ç<Ç<ÿÆ<øÆ<ñÆ<êÆ<ãÆ<ÜÆ<ÕÆ<ÎÆ<ÇÆ<ÀÆ<¹Æ<²Æ<«Æ<¤Æ<Æ<–Æ<Æ<ˆÆ<Æ<zÆ<sÆ<lÆ<eÆ<^Æ<WÆ<PÆ<IÆ<BÆ<;Æ<4Æ<-Æ<&Æ<Æ<Æ<Æ< Æ<Æ<üÅ<õÅ<îÅ<çÅ<àÅ<ÙÅ<ÒÅ<ËÅ<ÄÅ<½Å<¶Å<¯Å<¨Å<¡Å<šÅ<“Å<ŒÅ<…Å<~Å<wÅ<pÅ<iÅ<bÅ<[Å<TÅ<MÅ<FÅ<?Å<8Å<1Å<*Å<#Å<Å<Å<Å<Å<Å<ùÄ<òÄ<ëÄ<äÄ<ÝÄ<ÖÄ<ÏÄ<ÈÄ<ÁÄ<ºÄ<³Ä<¬Ä<¥Ä<žÄ<—Ä<Ä<‰Ä<‚Ä<{Ä<tÄ<mÄ<fÄ<_Ä<XÄ<QÄ<JÄ<CÄ<<Ä<5Ä<.Ä<'Ä< Ä<Ä<Ä< Ä<Ä<ýÃ<öÃ<ïÃ<èÃ<áÃ<ÚÃ<ÓÃ<ÌÃ<ÅÃ<¾Ã<·Ã<°Ã<©Ã<¢Ã<›Ã<”Ã<Ã<†Ã<Ã<xÃ<qÃ<jÃ<cÃ<\Ã<UÃ<NÃ<GÃ<@Ã<9Ã<2Ã<+Ã<$Ã<Ã<Ã<Ã<Ã<Ã<úÂ<óÂ<ìÂ<åÂ<ÞÂ<×Â<ÐÂ<ÉÂ<ÂÂ<»Â<´Â<­Â<¦Â<ŸÂ<˜Â<‘Â<ŠÂ<ƒÂ<|Â<uÂ<nÂ<gÂ<`Â<YÂ<RÂ<KÂ<DÂ<=Â<6Â</Â<(Â<!Â<Â<Â< Â<Â<þÁ<÷Á<ðÁ<éÁ<âÁ<ÛÁ<ÔÁ<ÍÁ<ÆÁ<¿Á<¸Á<±Á<ªÁ<£Á<œÁ<•Á<ŽÁ<‡Á<€Á<yÁ<rÁ<kÁ<dÁ<]Á<VÁ<OÁ<HÁ<AÁ<:Á<3Á<,Á<%Á<Á<Á<Á< Á<Á<ûÀ<ôÀ<íÀ<æÀ<ßÀ<ØÀ<ÑÀ<ÊÀ<ÃÀ<¼À<µÀ<®À<§À< À<™À<’À<‹À<„À<}À<vÀ<oÀ<hÀ<aÀ<ZÀ<SÀ<LÀ<EÀ<>À<7À<0À<)À<"À<À<À< À<À<ÿ¿<ø¿<ñ¿<ê¿<ã¿<Ü¿<Õ¿<ο<Ç¿<À¿<¹¿<²¿<«¿<¤¿<¿<–¿<¿<ˆ¿<¿<z¿<s¿<l¿<e¿<^¿<W¿<P¿<I¿<B¿<;¿<4¿<-¿<&¿<¿<¿<¿< ¿<¿<ü¾<õ¾<î¾<ç¾<à¾<Ù¾<Ò¾<˾<ľ<½¾<¶¾<¯¾<¨¾<¡¾<š¾<“¾<Œ¾<…¾<~¾<w¾<p¾<i¾<b¾<[¾<T¾<M¾<F¾<?¾<8¾<1¾<*¾<#¾<¾<¾<¾<¾<¾<ù½<ò½<ë½<ä½<ݽ<Ö½<Ͻ<Ƚ<Á½<º½<³½<¬½<¥½<ž½<—½<½<‰½<‚½<{½<t½<m½<f½<_½<X½<Q½<J½<C½<<½<5½<.½<'½< ½<½<½< ½<½<ý¼<ö¼<ï¼<è¼<á¼<Ú¼<Ó¼<̼<ż<¾¼<·¼<°¼<©¼<¢¼<›¼<”¼<¼<†¼<¼<x¼<q¼<j¼<c¼<\¼<U¼<N¼<G¼<@¼<9¼<2¼<+¼<$¼<¼<¼<¼<¼<¼<ú»<ó»<ì»<å»<Þ»<×»<л<É»<»<»»<´»<­»<¦»<Ÿ»<˜»<‘»<Š»<ƒ»<|»<u»<n»<g»<`»<Y»<R»<K»<D»<=»<6»</»<(»<!»<»<»< »<»<þº<÷º<ðº<éº<âº<Ûº<Ôº<ͺ<ƺ<¿º<¸º<±º<ªº<£º<œº<•º<Žº<‡º<€º<yº<rº<kº<dº<]º<Vº<Oº<Hº<Aº<:º<3º<,º<%º<º<º<º< º<º<û¹<ô¹<í¹<æ¹<ß¹<ع<ѹ<ʹ<ù<¼¹<µ¹<®¹<§¹< ¹<™¹<’¹<‹¹<„¹<}¹<v¹<o¹<h¹<a¹<Z¹<S¹<L¹<E¹<>¹<7¹<0¹<)¹<"¹<¹<¹< ¹<¹<ÿ¸<ø¸<ñ¸<ê¸<ã¸<ܸ<Õ¸<θ<Ǹ<À¸<¹¸<²¸<«¸<¤¸<¸<–¸<¸<ˆ¸<¸<z¸<s¸<l¸<e¸<^¸<W¸<P¸<I¸<B¸<;¸<4¸<-¸<&¸<¸<¸<¸< ¸<¸<ü·<õ·<î·<ç·<à·<Ù·<Ò·<Ë·<Ä·<½·<¶·<¯·<¨·<¡·<š·<“·<Œ·<…·<~·<w·<p·<i·<b·<[·<T·<M·<F·<?·<8·<1·<*·<#·<·<·<·<·<·<ù¶<ò¶<ë¶<ä¶<ݶ<Ö¶<϶<ȶ<Á¶<º¶<³¶<¬¶<¥¶<ž¶<—¶<¶<‰¶<‚¶<{¶<t¶<m¶<f¶<_¶<X¶<Q¶<J¶<C¶<<¶<5¶<.¶<'¶< ¶<¶<¶< ¶<¶<ýµ<öµ<ïµ<èµ<áµ<Úµ<Óµ<̵<ŵ<¾µ<·µ<°µ<©µ<¢µ<›µ<”µ<µ<†µ<µ<xµ<qµ<jµ<cµ<\µ<Uµ<Nµ<Gµ<@µ<9µ<2µ<+µ<$µ<µ<µ<µ<µ<µ<ú´<ó´<ì´<å´<Þ´<×´<д<É´<´<»´<´´<­´<¦´<Ÿ´<˜´<‘´<Š´<ƒ´<|´<u´<n´<g´<`´<Y´<R´<K´<D´<=´<6´</´<(´<!´<´<´< ´<´<þ³<÷³<ð³<é³<â³<Û³<Ô³<ͳ<Ƴ<¿³<¸³<±³<ª³<£³<œ³<•³<޳<‡³<€³<y³<r³<k³<d³<]³<V³<O³<H³<A³<:³<3³<,³<%³<³<³<³< ³<³<û²<ô²<í²<æ²<ß²<ز<Ѳ<ʲ<ò<¼²<µ²<®²<§²< ²<™²<’²<‹²<„²<}²<v²<o²<h²<a²<Z²<S²<L²<E²<>²<7²<0²<)²<"²<²<²< ²<²<ÿ±<ø±<ñ±<ê±<ã±<ܱ<Õ±<α<DZ<À±<¹±<²±<«±<¤±<±<–±<±<ˆ±<±<z±<s±<l±<e±<^±<W±<P±<I±<B±<;±<4±<-±<&±<±<±<±< ±<±<ü°<õ°<î°<ç°<à°<Ù°<Ò°<˰<İ<½°<¶°<¯°<¨°<¡°<š°<“°<Œ°<…°<~°<w°<p°<i°<b°<[°<T°<M°<F°<?°<8°<1°<*°<#°<°<°<°<°<°<ù¯<ò¯<ë¯<ä¯<ݯ<Ö¯<ϯ<ȯ<Á¯<º¯<³¯<¬¯<¥¯<ž¯<—¯<¯<‰¯<‚¯<{¯<t¯<m¯<f¯<_¯<X¯<Q¯<J¯<C¯<<¯<5¯<.¯<'¯< ¯<¯<¯< ¯<¯<ý®<ö®<ï®<è®<á®<Ú®<Ó®<Ì®<Å®<¾®<·®<°®<©®<¢®<›®<”®<®<†®<®<x®<q®<j®<c®<\®<U®<N®<G®<@®<9®<2®<+®<$®<®<®<®<®<®<ú­<ó­<ì­<å­<Þ­<×­<Э<É­<­<»­<´­<­­<¦­<Ÿ­<˜­<‘­<Š­<ƒ­<|­<u­<n­<g­<`­<Y­<R­<K­<D­<=­<6­</­<(­<!­<­<­< ­<­<þ¬<÷¬<ð¬<é¬<â¬<Û¬<Ô¬<ͬ<Ƭ<¿¬<¸¬<±¬<ª¬<£¬<œ¬<•¬<ެ<‡¬<€¬<y¬<r¬<k¬<d¬<]¬<V¬<O¬<H¬<A¬<:¬<3¬<,¬<%¬<¬<¬<¬< ¬<¬<û«<ô«<í«<æ«<ß«<Ø«<Ñ«<Ê«<ë<¼«<µ«<®«<§«< «<™«<’«<‹«<„«<}«<v«<o«<h«<a«<Z«<S«<L«<E«<>«<7«<0«<)«<"«<«<«< «<«<ÿª<øª<ñª<êª<ãª<ܪ<Õª<Ϊ<Ǫ<Àª<¹ª<²ª<«ª<¤ª<ª<–ª<ª<ˆª<ª<zª<sª<lª<eª<^ª<Wª<Pª<Iª<Bª<;ª<4ª<-ª<&ª<ª<ª<ª< ª<ª<ü©<õ©<î©<ç©<à©<Ù©<Ò©<Ë©<Ä©<½©<¶©<¯©<¨©<¡©<š©<“©<Œ©<…©<~©<w©<p©<i©<b©<[©<T©<M©<F©<?©<8©<1©<*©<#©<©<©<©<©<©<ù¨<ò¨<ë¨<ä¨<ݨ<Ö¨<Ϩ<Ȩ<Á¨<º¨<³¨<¬¨<¥¨<ž¨<—¨<¨<‰¨<‚¨<{¨<t¨<m¨<f¨<_¨<X¨<Q¨<J¨<C¨<<¨<5¨<.¨<'¨< ¨<¨<¨< ¨<¨<ý§<ö§<ï§<è§<á§<Ú§<Ó§<̧<ŧ<¾§<·§<°§<©§<¢§<›§<”§<§<†§<§<x§<q§<j§<c§<\§<U§<N§<G§<@§<9§<2§<+§<$§<§<§<§<§<§<ú¦<ó¦<ì¦<å¦<Þ¦<צ<Ц<ɦ<¦<»¦<´¦<­¦<¦¦<Ÿ¦<˜¦<‘¦<Ц<ƒ¦<|¦<u¦<n¦<g¦<`¦<Y¦<R¦<K¦<D¦<=¦<6¦</¦<(¦<!¦<¦<¦< ¦<¦<þ¥<÷¥<ð¥<é¥<â¥<Û¥<Ô¥<Í¥<Æ¥<¿¥<¸¥<±¥<ª¥<£¥<œ¥<•¥<Ž¥<‡¥<€¥<y¥<r¥<k¥<d¥<]¥<V¥<O¥<H¥<A¥<:¥<3¥<,¥<%¥<¥<¥<¥< ¥<¥<û¤<ô¤<í¤<æ¤<ߤ<ؤ<Ѥ<ʤ<ä<¼¤<µ¤<®¤<§¤< ¤<™¤<’¤<‹¤<„¤<}¤<v¤<o¤<h¤<a¤<Z¤<S¤<L¤<E¤<>¤<7¤<0¤<)¤<"¤<¤<¤< ¤<¤<ÿ£<ø£<ñ£<ê£<ã£<Ü£<Õ£<Σ<Ç£<À£<¹£<²£<«£<¤£<£<–£<£<ˆ£<£<z£<s£<l£<e£<^£<W£<P£<I£<B£<;£<4£<-£<&£<£<£<£< £<£<ü¢<õ¢<î¢<ç¢<à¢<Ù¢<Ò¢<Ë¢<Ä¢<½¢<¶¢<¯¢<¨¢<¡¢<š¢<“¢<Œ¢<…¢<~¢<w¢<p¢<i¢<b¢<[¢<T¢<M¢<F¢<?¢<8¢<1¢<*¢<#¢<¢<¢<¢<¢<¢<ù¡<ò¡<ë¡<ä¡<Ý¡<Ö¡<Ï¡<È¡<Á¡<º¡<³¡<¬¡<¥¡<ž¡<—¡<¡<‰¡<‚¡<{¡<t¡<m¡<f¡<_¡<X¡<Q¡<J¡<C¡<<¡<5¡<.¡<'¡< ¡<¡<¡< ¡<¡<ý <ö <ï <è <á <Ú <Ó <Ì <Å <¾ <· <° <© <¢ <› <” < <† < <x <q <j <c <\ <U <N <G <@ <9 <2 <+ <$ < < < < < <úŸ<óŸ<ìŸ<åŸ<ÞŸ<ן<П<ÉŸ<Ÿ<»Ÿ<´Ÿ<­Ÿ<¦Ÿ<ŸŸ<˜Ÿ<‘Ÿ<ŠŸ<ƒŸ<|Ÿ<uŸ<nŸ<gŸ<`Ÿ<YŸ<RŸ<KŸ<DŸ<=Ÿ<6Ÿ</Ÿ<(Ÿ<!Ÿ<Ÿ<Ÿ< Ÿ<Ÿ<þž<÷ž<ðž<éž<âž<Ûž<Ôž<Íž<Æž<¿ž<¸ž<±ž<ªž<£ž<œž<•ž<Žž<‡ž<€ž<yž<rž<kž<dž<]ž<Vž<Ož<Hž<Až<:ž<3ž<,ž<%ž<ž<ž<ž< ž<ž<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿœ<øœ<ñœ<êœ<ãœ<Üœ<Õœ<Μ<Çœ<Àœ<¹œ<²œ<«œ<¤œ<œ<–œ<œ<ˆœ<œ<zœ<sœ<lœ<eœ<^œ<Wœ<Pœ<Iœ<Bœ<;œ<4œ<-œ<&œ<œ<œ<œ< œ<œ<ü›<õ›<î›<ç›<à›<Ù›<Ò›<Ë›<Ä›<½›<¶›<¯›<¨›<¡›<š›<“›<Œ›<…›<~›<w›<p›<i›<b›<[›<T›<M›<F›<?›<8›<1›<*›<#›<›<›<›<›<›<ùš<òš<ëš<äš<Ýš<Öš<Ïš<Èš<Áš<ºš<³š<¬š<¥š<žš<—š<š<‰š<‚š<{š<tš<mš<fš<_š<Xš<Qš<Jš<Cš<<š<5š<.š<'š< š<š<š< š<š<ý™<ö™<ï™<è™<á™<Ú™<Ó™<Ì™<Å™<¾™<·™<°™<©™<¢™<›™<”™<™<†™<™<x™<q™<j™<c™<\™<U™<N™<G™<@™<9™<2™<+™<$™<™<™<™<™<™<ú˜<ó˜<ì˜<å˜<Þ˜<ט<И<ɘ<˜<»˜<´˜<­˜<¦˜<Ÿ˜<˜˜<‘˜<Š˜<ƒ˜<|˜<u˜<n˜<g˜<`˜<Y˜<R˜<K˜<D˜<=˜<6˜</˜<(˜<!˜<˜<˜< ˜<˜<þ—<÷—<ð—<é—<â—<Û—<Ô—<Í—<Æ—<¿—<¸—<±—<ª—<£—<œ—<•—<Ž—<‡—<€—<y—<r—<k—<d—<]—<V—<O—<H—<A—<:—<3—<,—<%—<—<—<—< —<—<û–<ô–<í–<æ–<ß–<Ø–<Ñ–<Ê–<Ö<¼–<µ–<®–<§–< –<™–<’–<‹–<„–<}–<v–<o–<h–<a–<Z–<S–<L–<E–<>–<7–<0–<)–<"–<–<–< –<–<ÿ•<ø•<ñ•<ê•<ã•<Ü•<Õ•<Ε<Ç•<À•<¹•<²•<«•<¤•<•<–•<•<ˆ•<•<z•<s•<l•<e•<^•<W•<P•<I•<B•<;•<4•<-•<&•<•<•<•< •<•<ü”<õ”<î”<ç”<à”<Ù”<Ò”<Ë”<Ä”<½”<¶”<¯”<¨”<¡”<š”<“”<Œ”<…”<~”<w”<p”<i”<b”<[”<T”<M”<F”<?”<8”<1”<*”<#”<”<”<”<”<”<ù“<ò“<ë“<ä“<Ý“<Ö“<Ï“<È“<Á“<º“<³“<¬“<¥“<ž“<—“<“<‰“<‚“<{“<t“<m“<f“<_“<X“<Q“<J“<C“<<“<5“<.“<'“< “<“<“< “<“<ý’<ö’<ï’<è’<á’<Ú’<Ó’<Ì’<Å’<¾’<·’<°’<©’<¢’<›’<”’<’<†’<’<x’<q’<j’<c’<\’<U’<N’<G’<@’<9’<2’<+’<$’<’<’<’<’<’<ú‘<ó‘<ì‘<å‘<Þ‘<ב<Б<É‘<‘<»‘<´‘<­‘<¦‘<Ÿ‘<˜‘<‘‘<Š‘<ƒ‘<|‘<u‘<n‘<g‘<`‘<Y‘<R‘<K‘<D‘<=‘<6‘</‘<(‘<!‘<‘<‘< ‘<‘<þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿŽ<øŽ<ñŽ<êŽ<ãŽ<ÜŽ<ÕŽ<ÎŽ<ÇŽ<ÀŽ<¹Ž<²Ž<«Ž<¤Ž<Ž<–Ž<Ž<ˆŽ<Ž<zŽ<sŽ<lŽ<eŽ<^Ž<WŽ<PŽ<IŽ<BŽ<;Ž<4Ž<-Ž<&Ž<Ž<Ž<Ž< Ž<Ž<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ùŒ<òŒ<ëŒ<äŒ<ÝŒ<ÖŒ<ÏŒ<ÈŒ<ÁŒ<ºŒ<³Œ<¬Œ<¥Œ<žŒ<—Œ<Œ<‰Œ<‚Œ<{Œ<tŒ<mŒ<fŒ<_Œ<XŒ<QŒ<JŒ<CŒ<<Œ<5Œ<.Œ<'Œ< Œ<Œ<Œ< Œ<Œ<ý‹<ö‹<ï‹<è‹<á‹<Ú‹<Ó‹<Ì‹<Å‹<¾‹<·‹<°‹<©‹<¢‹<›‹<”‹<‹<†‹<‹<x‹<q‹<j‹<c‹<\‹<U‹<N‹<G‹<@‹<9‹<2‹<+‹<$‹<‹<‹<‹<‹<‹<úŠ<óŠ<ìŠ<åŠ<ÞŠ<׊<Њ<ÉŠ<Š<»Š<´Š<­Š<¦Š<ŸŠ<˜Š<‘Š<ŠŠ<ƒŠ<|Š<uŠ<nŠ<gŠ<`Š<YŠ<RŠ<KŠ<DŠ<=Š<6Š</Š<(Š<!Š<Š<Š< Š<Š<þ‰<÷‰<ð‰<é‰<â‰<Û‰<Ô‰<͉<Ɖ<¿‰<¸‰<±‰<ª‰<£‰<œ‰<•‰<މ<‡‰<€‰<y‰<r‰<k‰<d‰<]‰<V‰<O‰<H‰<A‰<:‰<3‰<,‰<%‰<‰<‰<‰< ‰<‰<ûˆ<ôˆ<íˆ<æˆ<߈<؈<ш<ʈ<È<¼ˆ<µˆ<®ˆ<§ˆ< ˆ<™ˆ<’ˆ<‹ˆ<„ˆ<}ˆ<vˆ<oˆ<hˆ<aˆ<Zˆ<Sˆ<Lˆ<Eˆ<>ˆ<7ˆ<0ˆ<)ˆ<"ˆ<ˆ<ˆ< ˆ<ˆ<ÿ‡<ø‡<ñ‡<ê‡<ã‡<܇<Õ‡<·<LJ<À‡<¹‡<²‡<«‡<¤‡<‡<–‡<‡<ˆ‡<‡<z‡<s‡<l‡<e‡<^‡<W‡<P‡<I‡<B‡<;‡<4‡<-‡<&‡<‡<‡<‡< ‡<‡<ü†<õ†<î†<ç†<à†<Ù†<Ò†<ˆ<Ć<½†<¶†<¯†<¨†<¡†<š†<“†<Œ†<…†<~†<w†<p†<i†<b†<[†<T†<M†<F†<?†<8†<1†<*†<#†<†<†<†<†<†<ù…<ò…<ë…<ä…<Ý…<Ö…<Ï…<È…<Á…<º…<³…<¬…<¥…<ž…<—…<…<‰…<‚…<{…<t…<m…<f…<_…<X…<Q…<J…<C…<<…<5…<.…<'…< …<…<…< …<…<ý„<ö„<ï„<è„<á„<Ú„<Ó„<Ì„<Å„<¾„<·„<°„<©„<¢„<›„<”„<„<†„<„<x„<q„<j„<c„<\„<U„<N„<G„<@„<9„<2„<+„<$„<„<„<„<„<„<úƒ<óƒ<ìƒ<åƒ<Þƒ<׃<Ѓ<Ƀ<ƒ<»ƒ<´ƒ<­ƒ<¦ƒ<Ÿƒ<˜ƒ<‘ƒ<Šƒ<ƒƒ<|ƒ<uƒ<nƒ<gƒ<`ƒ<Yƒ<Rƒ<Kƒ<Dƒ<=ƒ<6ƒ</ƒ<(ƒ<!ƒ<ƒ<ƒ< ƒ<ƒ<þ‚<÷‚<ð‚<é‚<â‚<Û‚<Ô‚<Í‚<Æ‚<¿‚<¸‚<±‚<ª‚<£‚<œ‚<•‚<Ž‚<‡‚<€‚<y‚<r‚<k‚<d‚<]‚<V‚<O‚<H‚<A‚<:‚<3‚<,‚<%‚<‚<‚<‚< ‚<‚<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ€<ø€<ñ€<ê€<ã€<Ü€<Õ€<΀<Ç€<À€<¹€<²€<«€<¤€<€<–€<€<ˆ€<€<z€<s€<l€<e€<^€<W€<P€<I€<B€<;€<4€<-€<&€<€<€<€< €<€<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù~<ò~<ë~<ä~<Ý~<Ö~<Ï~<È~<Á~<º~<³~<¬~<¥~<ž~<—~<~<‰~<‚~<{~<t~<m~<f~<_~<X~<Q~<J~<C~<<~<5~<.~<'~< ~<~<~< ~<~<ý}<ö}<ï}<è}<á}<Ú}<Ó}<Ì}<Å}<¾}<·}<°}<©}<¢}<›}<”}<}<†}<}<x}<q}<j}<c}<\}<U}<N}<G}<@}<9}<2}<+}<$}<}<}<}<}<}<ú|<ó|<ì|<å|<Þ|<×|<Ð|<É|<Â|<»|<´|<­|<¦|<Ÿ|<˜|<‘|<Š|<ƒ|<||<u|<n|<g|<`|<Y|<R|<K|<D|<=|<6|</|<(|<!|<|<|< |<|<þ{<÷{<ð{<é{<â{<Û{<Ô{<Í{<Æ{<¿{<¸{<±{<ª{<£{<œ{<•{<Ž{<‡{<€{<y{<r{<k{<d{<]{<V{<O{<H{<A{<:{<3{<,{<%{<{<{<{< {<{<ûz<ôz<íz<æz<ßz<Øz<Ñz<Êz<Ãz<¼z<µz<®z<§z< z<™z<’z<‹z<„z<}z<vz<oz<hz<az<Zz<Sz<Lz<Ez<>z<7z<0z<)z<"z<z<z< z<z<ÿy<øy<ñy<êy<ãy<Üy<Õy<Îy<Çy<Ày<¹y<²y<«y<¤y<y<–y<y<ˆy<y<zy<sy<ly<ey<^y<Wy<Py<Iy<By<;y<4y<-y<&y<y<y<y< y<y<üx<õx<îx<çx<àx<Ùx<Òx<Ëx<Äx<½x<¶x<¯x<¨x<¡x<šx<“x<Œx<…x<~x<wx<px<ix<bx<[x<Tx<Mx<Fx<?x<8x<1x<*x<#x<x<x<x<x<x<ùw<òw<ëw<äw<Ýw<Öw<Ïw<Èw<Áw<ºw<³w<¬w<¥w<žw<—w<w<‰w<‚w<{w<tw<mw<fw<_w<Xw<Qw<Jw<Cw<s<7s<0s<)s<"s<s<s< s<s<ÿr<ør<ñr<êr<ãr<Ür<Õr<Îr<Çr<Àr<¹r<²r<«r<¤r<r<–r<r<ˆr<r<zr<sr<lr<er<^r<Wr<Pr<Ir<Br<;r<4r<-r<&r<r<r<r< r<r<üq<õq<îq<çq<àq<Ùq<Òq<Ëq<Äq<½q<¶q<¯q<¨q<¡q<šq<“q<Œq<…q<~q<wq<pq<iq<bq<[q<Tq<Mq<Fq<?q<8q<1q<*q<#q<q<q<q<q<q<ùp<òp<ëp<äp<Ýp<Öp<Ïp<Èp<Áp<ºp<³p<¬p<¥p<žp<—p<p<‰p<‚p<{p<tp<mp<fp<_p<Xp<Qp<Jp<Cp<l<7l<0l<)l<"l<l<l< l<l<ÿk<øk<ñk<êk<ãk<Ük<Õk<Îk<Çk<Àk<¹k<²k<«k<¤k<k<–k<k<ˆk<k<zk<sk<lk<ek<^k<Wk<Pk<Ik<Bk<;k<4k<-k<&k<k<k<k< k<k<üj<õj<îj<çj<àj<Ùj<Òj<Ëj<Äj<½j<¶j<¯j<¨j<¡j<šj<“j<Œj<…j<~j<wj<pj<ij<bj<[j<Tj<Mj<Fj<?j<8j<1j<*j<#j<j<j<j<j<j<ùi<òi<ëi<äi<Ýi<Öi<Ïi<Èi<Ái<ºi<³i<¬i<¥i<ži<—i<i<‰i<‚i<{i<ti<mi<fi<_i<Xi<Qi<Ji<Ci<e<7e<0e<)e<"e<e<e< e<e<ÿd<ød<ñd<êd<ãd<Üd<Õd<Îd<Çd<Àd<¹d<²d<«d<¤d<d<–d<d<ˆd<d<zd<sd<ld<ed<^d<Wd<Pd<Id<Bd<;d<4d<-d<&d<d<d<d< d<d<üc<õc<îc<çc<àc<Ùc<Òc<Ëc<Äc<½c<¶c<¯c<¨c<¡c<šc<“c<Œc<…c<~c<wc<pc<ic<bc<[c<Tc<Mc<Fc<?c<8c<1c<*c<#c<c<c<c<c<c<ùb<òb<ëb<äb<Ýb<Öb<Ïb<Èb<Áb<ºb<³b<¬b<¥b<žb<—b<b<‰b<‚b<{b<tb<mb<fb<_b<Xb<Qb<Jb<Cb<^<7^<0^<)^<"^<^<^< ^<^<ÿ]<ø]<ñ]<ê]<ã]<Ü]<Õ]<Î]<Ç]<À]<¹]<²]<«]<¤]<]<–]<]<ˆ]<]<z]<s]<l]<e]<^]<W]<P]<I]<B]<;]<4]<-]<&]<]<]<]< ]<]<ü\<õ\<î\<ç\<à\<Ù\<Ò\<Ë\<Ä\<½\<¶\<¯\<¨\<¡\<š\<“\<Œ\<…\<~\<w\<p\<i\<b\<[\<T\<M\<F\<?\<8\<1\<*\<#\<\<\<\<\<\<ù[<ò[<ë[<ä[<Ý[<Ö[<Ï[<È[<Á[<º[<³[<¬[<¥[<ž[<—[<[<‰[<‚[<{[<t[<m[<f[<_[<X[<Q[<J[<C[<<[<5[<.[<'[< [<[<[< [<[<ýZ<öZ<ïZ<èZ<áZ<ÚZ<ÓZ<ÌZ<ÅZ<¾Z<·Z<°Z<©Z<¢Z<›Z<”Z<Z<†Z<Z<xZ<qZ<jZ<cZ<\Z<UZ<NZ<GZ<@Z<9Z<2Z<+Z<$Z<Z<Z<Z<Z<Z<úY<óY<ìY<åY<ÞY<×Y<ÐY<ÉY<ÂY<»Y<´Y<­Y<¦Y<ŸY<˜Y<‘Y<ŠY<ƒY<|Y<uY<nY<gY<`Y<YY<RY<KY<DY<=Y<6Y</Y<(Y<!Y<Y<Y< Y<Y<þX<÷X<ðX<éX<âX<ÛX<ÔX<ÍX<ÆX<¿X<¸X<±X<ªX<£X<œX<•X<ŽX<‡X<€X<yX<rX<kX<dX<]X<VX<OX<HX<AX<:X<3X<,X<%X<X<X<X< X<X<ûW<ôW<íW<æW<ßW<ØW<ÑW<ÊW<ÃW<¼W<µW<®W<§W< W<™W<’W<‹W<„W<}W<vW<oW<hW<aW<ZW<SW<LW<EW<>W<7W<0W<)W<"W<W<W< W<W<ÿV<øV<ñV<êV<ãV<ÜV<ÕV<ÎV<ÇV<ÀV<¹V<²V<«V<¤V<V<–V<V<ˆV<V<zV<sV<lV<eV<^V<WV<PV<IV<BV<;V<4V<-V<&V<V<V<V< V<V<üU<õU<îU<çU<àU<ÙU<ÒU<ËU<ÄU<½U<¶U<¯U<¨U<¡U<šU<“U<ŒU<…U<~U<wU<pU<iU<bU<[U<TU<MU<FU<?U<8U<1U<*U<#U<U<U<U<U<U<ùT<òT<ëT<äT<ÝT<ÖT<ÏT<ÈT<ÁT<ºT<³T<¬T<¥T<žT<—T<T<‰T<‚T<{T<tT<mT<fT<_T<XT<QT<JT<CT<P<7P<0P<)P<"P<P<P< P<P<ÿO<øO<ñO<êO<ãO<ÜO<ÕO<ÎO<ÇO<ÀO<¹O<²O<«O<¤O<O<–O<O<ˆO<O<zO<sO<lO<eO<^O<WO<PO<IO<BO<;O<4O<-O<&O<O<O<O< O<O<üN<õN<îN<çN<àN<ÙN<ÒN<ËN<ÄN<½N<¶N<¯N<¨N<¡N<šN<“N<ŒN<…N<~N<wN<pN<iN<bN<[N<TN<MN<FN<?N<8N<1N<*N<#N<N<N<N<N<N<ùM<òM<ëM<äM<ÝM<ÖM<ÏM<ÈM<ÁM<ºM<³M<¬M<¥M<žM<—M<M<‰M<‚M<{M<tM<mM<fM<_M<XM<QM<JM<CM<I<7I<0I<)I<"I<I<I< I<I<ÿH<øH<ñH<êH<ãH<ÜH<ÕH<ÎH<ÇH<ÀH<¹H<²H<«H<¤H<H<–H<H<ˆH<H<zH<sH<lH<eH<^H<WH<PH<IH<BH<;H<4H<-H<&H<H<H<H< H<H<üG<õG<îG<çG<àG<ÙG<ÒG<ËG<ÄG<½G<¶G<¯G<¨G<¡G<šG<“G<ŒG<…G<~G<wG<pG<iG<bG<[G<TG<MG<FG<?G<8G<1G<*G<#G<G<G<G<G<G<ùF<òF<ëF<äF<ÝF<ÖF<ÏF<ÈF<ÁF<ºF<³F<¬F<¥F<žF<—F<F<‰F<‚F<{F<tF<mF<fF<_F<XF<QF<JF<CF<B<7B<0B<)B<"B<B<B< B<B<ÿA<øA<ñA<êA<ãA<ÜA<ÕA<ÎA<ÇA<ÀA<¹A<²A<«A<¤A<A<–A<A<ˆA<A<zA<sA<lA<eA<^A<WA<PA<IA<BA<;A<4A<-A<&A<A<A<A< A<A<ü@<õ@<î@<ç@<à@<Ù@<Ò@<Ë@<Ä@<½@<¶@<¯@<¨@<¡@<š@<“@<Œ@<…@<~@<w@<p@<i@<b@<[@<T@<M@<F@<?@<8@<1@<*@<#@<@<@<@<@<@<ù?<ò?<ë?<ä?<Ý?<Ö?<Ï?<È?<Á?<º?<³?<¬?<¥?<ž?<—?<?<‰?<‚?<{?<t?<m?<f?<_?<X?<Q?<J?<C?<<ö><ï><è><á><Ú><Ó><Ì><Å><¾><·><°><©><¢><›><”><><†><><x><q><j><c><\><U><N><G><@><9><2><+><$><><><><><><ú=<ó=<ì=<å=<Þ=<×=<Ð=<É=<Â=<»=<´=<­=<¦=<Ÿ=<˜=<‘=<Š=<ƒ=<|=<u=<n=<g=<`=<Y=<R=<K=<D=<==<6=</=<(=<!=<=<=< =<=<þ<<÷<<ð<<é<<â<<Û<<Ô<<Í<<Æ<<¿<<¸<<±<<ª<<£<<œ<<•<<Ž<<‡<<€<<y<<r<<k<<d<<]<<V<<O<<H<<A<<:<<3<<,<<%<<<<<<<< <<<<û;<ô;<í;<æ;<ß;<Ø;<Ñ;<Ê;<Ã;<¼;<µ;<®;<§;< ;<™;<’;<‹;<„;<};<v;<o;<h;<a;<Z;<S;<L;<E;<>;<7;<0;<);<";<;<;< ;<;<ÿ:<ø:<ñ:<ê:<ã:<Ü:<Õ:<Î:<Ç:<À:<¹:<²:<«:<¤:<:<–:<:<ˆ:<:<z:<s:<l:<e:<^:<W:<P:<I:<B:<;:<4:<-:<&:<:<:<:< :<:<ü9<õ9<î9<ç9<à9<Ù9<Ò9<Ë9<Ä9<½9<¶9<¯9<¨9<¡9<š9<“9<Œ9<…9<~9<w9<p9<i9<b9<[9<T9<M9<F9<?9<89<19<*9<#9<9<9<9<9<9<ù8<ò8<ë8<ä8<Ý8<Ö8<Ï8<È8<Á8<º8<³8<¬8<¥8<ž8<—8<8<‰8<‚8<{8<t8<m8<f8<_8<X8<Q8<J8<C8<<8<58<.8<'8< 8<8<8< 8<8<ý7<ö7<ï7<è7<á7<Ú7<Ó7<Ì7<Å7<¾7<·7<°7<©7<¢7<›7<”7<7<†7<7<x7<q7<j7<c7<\7<U7<N7<G7<@7<97<27<+7<$7<7<7<7<7<7<ú6<ó6<ì6<å6<Þ6<×6<Ð6<É6<Â6<»6<´6<­6<¦6<Ÿ6<˜6<‘6<Š6<ƒ6<|6<u6<n6<g6<`6<Y6<R6<K6<D6<=6<66</6<(6<!6<6<6< 6<6<þ5<÷5<ð5<é5<â5<Û5<Ô5<Í5<Æ5<¿5<¸5<±5<ª5<£5<œ5<•5<Ž5<‡5<€5<y5<r5<k5<d5<]5<V5<O5<H5<A5<:5<35<,5<%5<5<5<5< 5<5<û4<ô4<í4<æ4<ß4<Ø4<Ñ4<Ê4<Ã4<¼4<µ4<®4<§4< 4<™4<’4<‹4<„4<}4<v4<o4<h4<a4<Z4<S4<L4<E4<>4<74<04<)4<"4<4<4< 4<4<ÿ3<ø3<ñ3<ê3<ã3<Ü3<Õ3<Î3<Ç3<À3<¹3<²3<«3<¤3<3<–3<3<ˆ3<3<z3<s3<l3<e3<^3<W3<P3<I3<B3<;3<43<-3<&3<3<3<3< 3<3<ü2<õ2<î2<ç2<à2<Ù2<Ò2<Ë2<Ä2<½2<¶2<¯2<¨2<¡2<š2<“2<Œ2<…2<~2<w2<p2<i2<b2<[2<T2<M2<F2<?2<82<12<*2<#2<2<2<2<2<2<ù1<ò1<ë1<ä1<Ý1<Ö1<Ï1<È1<Á1<º1<³1<¬1<¥1<ž1<—1<1<‰1<‚1<{1<t1<m1<f1<_1<X1<Q1<J1<C1<<1<51<.1<'1< 1<1<1< 1<1<ý0<ö0<ï0<è0<á0<Ú0<Ó0<Ì0<Å0<¾0<·0<°0<©0<¢0<›0<”0<0<†0<0<x0<q0<j0<c0<\0<U0<N0<G0<@0<90<20<+0<$0<0<0<0<0<0<ú/<ó/<ì/<å/<Þ/<×/<Ð/<É/<Â/<»/<´/<­/<¦/<Ÿ/<˜/<‘/<Š/<ƒ/<|/<u/<n/<g/<`/<Y/<R/<K/<D/<=/<6/<//<(/<!/</</< /</<þ.<÷.<ð.<é.<â.<Û.<Ô.<Í.<Æ.<¿.<¸.<±.<ª.<£.<œ.<•.<Ž.<‡.<€.<y.<r.<k.<d.<].<V.<O.<H.<A.<:.<3.<,.<%.<.<.<.< .<.<û-<ô-<í-<æ-<ß-<Ø-<Ñ-<Ê-<Ã-<¼-<µ-<®-<§-< -<™-<’-<‹-<„-<}-<v-<o-<h-<a-<Z-<S-<L-<E-<>-<7-<0-<)-<"-<-<-< -<-<ÿ,<ø,<ñ,<ê,<ã,<Ü,<Õ,<Î,<Ç,<À,<¹,<²,<«,<¤,<,<–,<,<ˆ,<,<z,<s,<l,<e,<^,<W,<P,<I,<B,<;,<4,<-,<&,<,<,<,< ,<,<ü+<õ+<î+<ç+<à+<Ù+<Ò+<Ë+<Ä+<½+<¶+<¯+<¨+<¡+<š+<“+<Œ+<…+<~+<w+<p+<i+<b+<[+<T+<M+<F+<?+<8+<1+<*+<#+<+<+<+<+<+<ù*<ò*<ë*<ä*<Ý*<Ö*<Ï*<È*<Á*<º*<³*<¬*<¥*<ž*<—*<*<‰*<‚*<{*<t*<m*<f*<_*<X*<Q*<J*<C*<<*<5*<.*<'*< *<*<*< *<*<ý)<ö)<ï)<è)<á)<Ú)<Ó)<Ì)<Å)<¾)<·)<°)<©)<¢)<›)<”)<)<†)<)<x)<q)<j)<c)<\)<U)<N)<G)<@)<9)<2)<+)<$)<)<)<)<)<)<ú(<ó(<ì(<å(<Þ(<×(<Ð(<É(<Â(<»(<´(<­(<¦(<Ÿ(<˜(<‘(<Š(<ƒ(<|(<u(<n(<g(<`(<Y(<R(<K(<D(<=(<6(</(<((<!(<(<(< (<(<þ'<÷'<ð'<é'<â'<Û'<Ô'<Í'<Æ'<¿'<¸'<±'<ª'<£'<œ'<•'<Ž'<‡'<€'<y'<r'<k'<d'<]'<V'<O'<H'<A'<:'<3'<,'<%'<'<'<'< '<'<û&<ô&<í&<æ&<ß&<Ø&<Ñ&<Ê&<Ã&<¼&<µ&<®&<§&< &<™&<’&<‹&<„&<}&<v&<o&<h&<a&<Z&<S&<L&<E&<>&<7&<0&<)&<"&<&<&< &<&<ÿ%<ø%<ñ%<ê%<ã%<Ü%<Õ%<Î%<Ç%<À%<¹%<²%<«%<¤%<%<–%<%<ˆ%<%<z%<s%<l%<e%<^%<W%<P%<I%<B%<;%<4%<-%<&%<%<%<%< %<%<ü$<õ$<î$<ç$<à$<Ù$<Ò$<Ë$<Ä$<½$<¶$<¯$<¨$<¡$<š$<“$<Œ$<…$<~$<w$<p$<i$<b$<[$<T$<M$<F$<?$<8$<1$<*$<#$<$<$<$<$<$<ù#<ò#<ë#<ä#<Ý#<Ö#<Ï#<È#<Á#<º#<³#<¬#<¥#<ž#<—#<#<‰#<‚#<{#<t#<m#<f#<_#<X#<Q#<J#<C#<<#<5#<.#<'#< #<#<#< #<#<ý"<ö"<ï"<è"<á"<Ú"<Ó"<Ì"<Å"<¾"<·"<°"<©"<¢"<›"<”"<"<†"<"<x"<q"<j"<c"<\"<U"<N"<G"<@"<9"<2"<+"<$"<"<"<"<"<"<ú!<ó!<ì!<å!<Þ!<×!<Ð!<É!<Â!<»!<´!<­!<¦!<Ÿ!<˜!<‘!<Š!<ƒ!<|!<u!<n!<g!<`!<Y!<R!<K!<D!<=!<6!</!<(!<!!<!<!< !<!<þ <÷ <ð <é <â <Û <Ô <Í <Æ <¿ <¸ <± <ª <£ <œ <• <Ž <‡ <€ <y <r <k <d <] <V <O <H <A <: <3 <, <% < < < < < <û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý <ö <ï <è <á <Ú <Ó <Ì <Å <¾ <· <° <© <¢ <› <” < <† < <x <q <j <c <\ <U <N <G <@ <9 <2 <+ <$ < < < < < <ú <ó <ì <å <Þ <× <Ð <É < <» <´ <­ <¦ <Ÿ <˜ <‘ <Š <ƒ <| <u <n <g <` <Y <R <K <D <= <6 </ <( <! < < < < <þ <÷ <ð <é <â <Û <Ô <Í <Æ <¿ <¸ <± <ª <£ <œ <• <Ž <‡ <€ <y <r <k <d <] <V <O <H <A <: <3 <, <% < < < < < <û <ô <í <æ <ß <Ø <Ñ <Ê <à <¼ <µ <® <§ <  <™ <’ <‹ <„ <} <v <o <h <a <Z <S <L <E <> <7 <0 <) <" < < < < <ÿ <ø <ñ <ê <ã <Ü <Õ <Î <Ç <À <¹ <² <« <¤ < <– < <ˆ < <z <s <l <e <^ <W <P <I <B <; <4 <- <& < < < < < <ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ýÿ;öÿ;ïÿ;èÿ;áÿ;Úÿ;Óÿ;Ìÿ;Åÿ;¾ÿ;·ÿ;°ÿ;©ÿ;¢ÿ;›ÿ;”ÿ;ÿ;†ÿ;ÿ;xÿ;qÿ;jÿ;cÿ;\ÿ;Uÿ;Nÿ;Gÿ;@ÿ;9ÿ;2ÿ;+ÿ;$ÿ;ÿ;ÿ;ÿ;ÿ;ÿ;úþ;óþ;ìþ;åþ;Þþ;×þ;Ðþ;Éþ;Âþ;»þ;´þ;­þ;¦þ;Ÿþ;˜þ;‘þ;Šþ;ƒþ;|þ;uþ;nþ;gþ;`þ;Yþ;Rþ;Kþ;Dþ;=þ;6þ;/þ;(þ;!þ;þ;þ; þ;þ;þý;÷ý;ðý;éý;âý;Ûý;Ôý;Íý;Æý;¿ý;¸ý;±ý;ªý;£ý;œý;•ý;Žý;‡ý;€ý;yý;rý;ký;dý;]ý;Vý;Oý;Hý;Aý;:ý;3ý;,ý;%ý;ý;ý;ý; ý;ý;ûü;ôü;íü;æü;ßü;Øü;Ñü;Êü;Ãü;¼ü;µü;®ü;§ü; ü;™ü;’ü;‹ü;„ü;}ü;vü;oü;hü;aü;Zü;Sü;Lü;Eü;>ü;7ü;0ü;)ü;"ü;ü;ü; ü;ü;ÿû;øû;ñû;êû;ãû;Üû;Õû;Îû;Çû;Àû;¹û;²û;«û;¤û;û;–û;û;ˆû;û;zû;sû;lû;eû;^û;Wû;Pû;Iû;Bû;;û;4û;-û;&û;û;û;û; û;û;üú;õú;îú;çú;àú;Ùú;Òú;Ëú;Äú;½ú;¶ú;¯ú;¨ú;¡ú;šú;“ú;Œú;…ú;~ú;wú;pú;iú;bú;[ú;Tú;Mú;Fú;?ú;8ú;1ú;*ú;#ú;ú;ú;ú;ú;ú;ùù;òù;ëù;äù;Ýù;Öù;Ïù;Èù;Áù;ºù;³ù;¬ù;¥ù;žù;—ù;ù;‰ù;‚ù;{ù;tù;mù;fù;_ù;Xù;Qù;Jù;Cù;<ù;5ù;.ù;'ù; ù;ù;ù; ù;ù;ýø;öø;ïø;èø;áø;Úø;Óø;Ìø;Åø;¾ø;·ø;°ø;©ø;¢ø;›ø;”ø;ø;†ø;ø;xø;qø;jø;cø;\ø;Uø;Nø;Gø;@ø;9ø;2ø;+ø;$ø;ø;ø;ø;ø;ø;ú÷;ó÷;ì÷;å÷;Þ÷;×÷;Ð÷;É÷;Â÷;»÷;´÷;­÷;¦÷;Ÿ÷;˜÷;‘÷;Š÷;ƒ÷;|÷;u÷;n÷;g÷;`÷;Y÷;R÷;K÷;D÷;=÷;6÷;/÷;(÷;!÷;÷;÷; ÷;÷;þö;÷ö;ðö;éö;âö;Ûö;Ôö;Íö;Æö;¿ö;¸ö;±ö;ªö;£ö;œö;•ö;Žö;‡ö;€ö;yö;rö;kö;dö;]ö;Vö;Oö;Hö;Aö;:ö;3ö;,ö;%ö;ö;ö;ö; ö;ö;ûõ;ôõ;íõ;æõ;ßõ;Øõ;Ñõ;Êõ;Ãõ;¼õ;µõ;®õ;§õ; õ;™õ;’õ;‹õ;„õ;}õ;võ;oõ;hõ;aõ;Zõ;Sõ;Lõ;Eõ;>õ;7õ;0õ;)õ;"õ;õ;õ; õ;õ;ÿô;øô;ñô;êô;ãô;Üô;Õô;Îô;Çô;Àô;¹ô;²ô;«ô;¤ô;ô;–ô;ô;ˆô;ô;zô;sô;lô;eô;^ô;Wô;Pô;Iô;Bô;;ô;4ô;-ô;&ô;ô;ô;ô; ô;ô;üó;õó;îó;çó;àó;Ùó;Òó;Ëó;Äó;½ó;¶ó;¯ó;¨ó;¡ó;šó;“ó;Œó;…ó;~ó;wó;pó;ió;bó;[ó;Tó;Mó;Fó;?ó;8ó;1ó;*ó;#ó;ó;ó;ó;ó;ó;ùò;òò;ëò;äò;Ýò;Öò;Ïò;Èò;Áò;ºò;³ò;¬ò;¥ò;žò;—ò;ò;‰ò;‚ò;{ò;tò;mò;fò;_ò;Xò;Qò;Jò;Cò;<ò;5ò;.ò;'ò; ò;ò;ò; ò;ò;ýñ;öñ;ïñ;èñ;áñ;Úñ;Óñ;Ìñ;Åñ;¾ñ;·ñ;°ñ;©ñ;¢ñ;›ñ;”ñ;ñ;†ñ;ñ;xñ;qñ;jñ;cñ;\ñ;Uñ;Nñ;Gñ;@ñ;9ñ;2ñ;+ñ;$ñ;ñ;ñ;ñ;ñ;ñ;úð;óð;ìð;åð;Þð;×ð;Ðð;Éð;Âð;»ð;´ð;­ð;¦ð;Ÿð;˜ð;‘ð;Šð;ƒð;|ð;uð;nð;gð;`ð;Yð;Rð;Kð;Dð;=ð;6ð;/ð;(ð;!ð;ð;ð; ð;ð;þï;÷ï;ðï;éï;âï;Ûï;Ôï;Íï;Æï;¿ï;¸ï;±ï;ªï;£ï;œï;•ï;Žï;‡ï;€ï;yï;rï;kï;dï;]ï;Vï;Oï;Hï;Aï;:ï;3ï;,ï;%ï;ï;ï;ï; ï;ï;ûî;ôî;íî;æî;ßî;Øî;Ñî;Êî;Ãî;¼î;µî;®î;§î; î;™î;’î;‹î;„î;}î;vî;oî;hî;aî;Zî;Sî;Lî;Eî;>î;7î;0î;)î;"î;î;î; î;î;ÿí;øí;ñí;êí;ãí;Üí;Õí;Îí;Çí;Àí;¹í;²í;«í;¤í;í;–í;í;ˆí;í;zí;sí;lí;eí;^í;Wí;Pí;Ií;Bí;;í;4í;-í;&í;í;í;í; í;í;üì;õì;îì;çì;àì;Ùì;Òì;Ëì;Äì;½ì;¶ì;¯ì;¨ì;¡ì;šì;“ì;Œì;…ì;~ì;wì;pì;iì;bì;[ì;Tì;Mì;Fì;?ì;8ì;1ì;*ì;#ì;ì;ì;ì;ì;ì;ùë;òë;ëë;äë;Ýë;Öë;Ïë;Èë;Áë;ºë;³ë;¬ë;¥ë;žë;—ë;ë;‰ë;‚ë;{ë;të;më;fë;_ë;Xë;Që;Jë;Cë;<ë;5ë;.ë;'ë; ë;ë;ë; ë;ë;ýê;öê;ïê;èê;áê;Úê;Óê;Ìê;Åê;¾ê;·ê;°ê;©ê;¢ê;›ê;”ê;ê;†ê;ê;xê;qê;jê;cê;\ê;Uê;Nê;Gê;@ê;9ê;2ê;+ê;$ê;ê;ê;ê;ê;ê;úé;óé;ìé;åé;Þé;×é;Ðé;Éé;Âé;»é;´é;­é;¦é;Ÿé;˜é;‘é;Šé;ƒé;|é;ué;né;gé;`é;Yé;Ré;Ké;Dé;=é;6é;/é;(é;!é;é;é; é;é;þè;÷è;ðè;éè;âè;Ûè;Ôè;Íè;Æè;¿è;¸è;±è;ªè;£è;œè;•è;Žè;‡è;€è;yè;rè;kè;dè;]è;Vè;Oè;Hè;Aè;:è;3è;,è;%è;è;è;è; è;è;ûç;ôç;íç;æç;ßç;Øç;Ñç;Êç;Ãç;¼ç;µç;®ç;§ç; ç;™ç;’ç;‹ç;„ç;}ç;vç;oç;hç;aç;Zç;Sç;Lç;Eç;>ç;7ç;0ç;)ç;"ç;ç;ç; ç;ç;ÿæ;øæ;ñæ;êæ;ãæ;Üæ;Õæ;Îæ;Çæ;Àæ;¹æ;²æ;«æ;¤æ;æ;–æ;æ;ˆæ;æ;zæ;sæ;læ;eæ;^æ;Wæ;Pæ;Iæ;Bæ;;æ;4æ;-æ;&æ;æ;æ;æ; æ;æ;üå;õå;îå;çå;àå;Ùå;Òå;Ëå;Äå;½å;¶å;¯å;¨å;¡å;šå;“å;Œå;…å;~å;wå;på;iå;bå;[å;Tå;Må;Få;?å;8å;1å;*å;#å;å;å;å;å;å;ùä;òä;ëä;ää;Ýä;Öä;Ïä;Èä;Áä;ºä;³ä;¬ä;¥ä;žä;—ä;ä;‰ä;‚ä;{ä;tä;mä;fä;_ä;Xä;Qä;Jä;Cä;<ä;5ä;.ä;'ä; ä;ä;ä; ä;ä;ýã;öã;ïã;èã;áã;Úã;Óã;Ìã;Åã;¾ã;·ã;°ã;©ã;¢ã;›ã;”ã;ã;†ã;ã;xã;qã;jã;cã;\ã;Uã;Nã;Gã;@ã;9ã;2ã;+ã;$ã;ã;ã;ã;ã;ã;úâ;óâ;ìâ;åâ;Þâ;×â;Ðâ;Éâ;Ââ;»â;´â;­â;¦â;Ÿâ;˜â;‘â;Šâ;ƒâ;|â;uâ;nâ;gâ;`â;Yâ;Râ;Kâ;Dâ;=â;6â;/â;(â;!â;â;â; â;â;þá;÷á;ðá;éá;âá;Ûá;Ôá;Íá;Æá;¿á;¸á;±á;ªá;£á;œá;•á;Žá;‡á;€á;yá;rá;ká;dá;]á;Vá;Oá;Há;Aá;:á;3á;,á;%á;á;á;á; á;á;ûà;ôà;íà;æà;ßà;Øà;Ñà;Êà;Ãà;¼à;µà;®à;§à; à;™à;’à;‹à;„à;}à;và;oà;hà;aà;Zà;Sà;Là;Eà;>à;7à;0à;)à;"à;à;à; à;à;ÿß;øß;ñß;êß;ãß;Üß;Õß;Îß;Çß;Àß;¹ß;²ß;«ß;¤ß;ß;–ß;ß;ˆß;ß;zß;sß;lß;eß;^ß;Wß;Pß;Iß;Bß;;ß;4ß;-ß;&ß;ß;ß;ß; ß;ß;üÞ;õÞ;îÞ;çÞ;àÞ;ÙÞ;ÒÞ;ËÞ;ÄÞ;½Þ;¶Þ;¯Þ;¨Þ;¡Þ;šÞ;“Þ;ŒÞ;…Þ;~Þ;wÞ;pÞ;iÞ;bÞ;[Þ;TÞ;MÞ;FÞ;?Þ;8Þ;1Þ;*Þ;#Þ;Þ;Þ;Þ;Þ;Þ;ùÝ;òÝ;ëÝ;äÝ;ÝÝ;ÖÝ;ÏÝ;ÈÝ;ÁÝ;ºÝ;³Ý;¬Ý;¥Ý;žÝ;—Ý;Ý;‰Ý;‚Ý;{Ý;tÝ;mÝ;fÝ;_Ý;XÝ;QÝ;JÝ;CÝ;<Ý;5Ý;.Ý;'Ý; Ý;Ý;Ý; Ý;Ý;ýÜ;öÜ;ïÜ;èÜ;áÜ;ÚÜ;ÓÜ;ÌÜ;ÅÜ;¾Ü;·Ü;°Ü;©Ü;¢Ü;›Ü;”Ü;Ü;†Ü;Ü;xÜ;qÜ;jÜ;cÜ;\Ü;UÜ;NÜ;GÜ;@Ü;9Ü;2Ü;+Ü;$Ü;Ü;Ü;Ü;Ü;Ü;úÛ;óÛ;ìÛ;åÛ;ÞÛ;×Û;ÐÛ;ÉÛ;ÂÛ;»Û;´Û;­Û;¦Û;ŸÛ;˜Û;‘Û;ŠÛ;ƒÛ;|Û;uÛ;nÛ;gÛ;`Û;YÛ;RÛ;KÛ;DÛ;=Û;6Û;/Û;(Û;!Û;Û;Û; Û;Û;þÚ;÷Ú;ðÚ;éÚ;âÚ;ÛÚ;ÔÚ;ÍÚ;ÆÚ;¿Ú;¸Ú;±Ú;ªÚ;£Ú;œÚ;•Ú;ŽÚ;‡Ú;€Ú;yÚ;rÚ;kÚ;dÚ;]Ú;VÚ;OÚ;HÚ;AÚ;:Ú;3Ú;,Ú;%Ú;Ú;Ú;Ú; Ú;Ú;ûÙ;ôÙ;íÙ;æÙ;ßÙ;ØÙ;ÑÙ;ÊÙ;ÃÙ;¼Ù;µÙ;®Ù;§Ù; Ù;™Ù;’Ù;‹Ù;„Ù;}Ù;vÙ;oÙ;hÙ;aÙ;ZÙ;SÙ;LÙ;EÙ;>Ù;7Ù;0Ù;)Ù;"Ù;Ù;Ù; Ù;Ù;ÿØ;øØ;ñØ;êØ;ãØ;ÜØ;ÕØ;ÎØ;ÇØ;ÀØ;¹Ø;²Ø;«Ø;¤Ø;Ø;–Ø;Ø;ˆØ;Ø;zØ;sØ;lØ;eØ;^Ø;WØ;PØ;IØ;BØ;;Ø;4Ø;-Ø;&Ø;Ø;Ø;Ø; Ø;Ø;ü×;õ×;î×;ç×;à×;Ù×;Ò×;Ë×;Ä×;½×;¶×;¯×;¨×;¡×;š×;“×;Œ×;…×;~×;w×;p×;i×;b×;[×;T×;M×;F×;?×;8×;1×;*×;#×;×;×;×;×;×;ùÖ;òÖ;ëÖ;äÖ;ÝÖ;ÖÖ;ÏÖ;ÈÖ;ÁÖ;ºÖ;³Ö;¬Ö;¥Ö;žÖ;—Ö;Ö;‰Ö;‚Ö;{Ö;tÖ;mÖ;fÖ;_Ö;XÖ;QÖ;JÖ;CÖ;<Ö;5Ö;.Ö;'Ö; Ö;Ö;Ö; Ö;Ö;ýÕ;öÕ;ïÕ;èÕ;áÕ;ÚÕ;ÓÕ;ÌÕ;ÅÕ;¾Õ;·Õ;°Õ;©Õ;¢Õ;›Õ;”Õ;Õ;†Õ;Õ;xÕ;qÕ;jÕ;cÕ;\Õ;UÕ;NÕ;GÕ;@Õ;9Õ;2Õ;+Õ;$Õ;Õ;Õ;Õ;Õ;Õ;úÔ;óÔ;ìÔ;åÔ;ÞÔ;×Ô;ÐÔ;ÉÔ;ÂÔ;»Ô;´Ô;­Ô;¦Ô;ŸÔ;˜Ô;‘Ô;ŠÔ;ƒÔ;|Ô;uÔ;nÔ;gÔ;`Ô;YÔ;RÔ;KÔ;DÔ;=Ô;6Ô;/Ô;(Ô;!Ô;Ô;Ô; Ô;Ô;þÓ;÷Ó;ðÓ;éÓ;âÓ;ÛÓ;ÔÓ;ÍÓ;ÆÓ;¿Ó;¸Ó;±Ó;ªÓ;£Ó;œÓ;•Ó;ŽÓ;‡Ó;€Ó;yÓ;rÓ;kÓ;dÓ;]Ó;VÓ;OÓ;HÓ;AÓ;:Ó;3Ó;,Ó;%Ó;Ó;Ó;Ó; Ó;Ó;ûÒ;ôÒ;íÒ;æÒ;ßÒ;ØÒ;ÑÒ;ÊÒ;ÃÒ;¼Ò;µÒ;®Ò;§Ò; Ò;™Ò;’Ò;‹Ò;„Ò;}Ò;vÒ;oÒ;hÒ;aÒ;ZÒ;SÒ;LÒ;EÒ;>Ò;7Ò;0Ò;)Ò;"Ò;Ò;Ò; Ò;Ò;ÿÑ;øÑ;ñÑ;êÑ;ãÑ;ÜÑ;ÕÑ;ÎÑ;ÇÑ;ÀÑ;¹Ñ;²Ñ;«Ñ;¤Ñ;Ñ;–Ñ;Ñ;ˆÑ;Ñ;zÑ;sÑ;lÑ;eÑ;^Ñ;WÑ;PÑ;IÑ;BÑ;;Ñ;4Ñ;-Ñ;&Ñ;Ñ;Ñ;Ñ; Ñ;Ñ;üÐ;õÐ;îÐ;çÐ;àÐ;ÙÐ;ÒÐ;ËÐ;ÄÐ;½Ð;¶Ð;¯Ð;¨Ð;¡Ð;šÐ;“Ð;ŒÐ;…Ð;~Ð;wÐ;pÐ;iÐ;bÐ;[Ð;TÐ;MÐ;FÐ;?Ð;8Ð;1Ð;*Ð;#Ð;Ð;Ð;Ð;Ð;Ð;ùÏ;òÏ;ëÏ;äÏ;ÝÏ;ÖÏ;ÏÏ;ÈÏ;ÁÏ;ºÏ;³Ï;¬Ï;¥Ï;žÏ;—Ï;Ï;‰Ï;‚Ï;{Ï;tÏ;mÏ;fÏ;_Ï;XÏ;QÏ;JÏ;CÏ;<Ï;5Ï;.Ï;'Ï; Ï;Ï;Ï; Ï;Ï;ýÎ;öÎ;ïÎ;èÎ;áÎ;ÚÎ;ÓÎ;ÌÎ;ÅÎ;¾Î;·Î;°Î;©Î;¢Î;›Î;”Î;Î;†Î;Î;xÎ;qÎ;jÎ;cÎ;\Î;UÎ;NÎ;GÎ;@Î;9Î;2Î;+Î;$Î;Î;Î;Î;Î;Î;úÍ;óÍ;ìÍ;åÍ;ÞÍ;×Í;ÐÍ;ÉÍ;ÂÍ;»Í;´Í;­Í;¦Í;ŸÍ;˜Í;‘Í;ŠÍ;ƒÍ;|Í;uÍ;nÍ;gÍ;`Í;YÍ;RÍ;KÍ;DÍ;=Í;6Í;/Í;(Í;!Í;Í;Í; Í;Í;þÌ;÷Ì;ðÌ;éÌ;âÌ;ÛÌ;ÔÌ;ÍÌ;ÆÌ;¿Ì;¸Ì;±Ì;ªÌ;£Ì;œÌ;•Ì;ŽÌ;‡Ì;€Ì;yÌ;rÌ;kÌ;dÌ;]Ì;VÌ;OÌ;HÌ;AÌ;:Ì;3Ì;,Ì;%Ì;Ì;Ì;Ì; Ì;Ì;ûË;ôË;íË;æË;ßË;ØË;ÑË;ÊË;ÃË;¼Ë;µË;®Ë;§Ë; Ë;™Ë;’Ë;‹Ë;„Ë;}Ë;vË;oË;hË;aË;ZË;SË;LË;EË;>Ë;7Ë;0Ë;)Ë;"Ë;Ë;Ë; Ë;Ë;ÿÊ;øÊ;ñÊ;êÊ;ãÊ;ÜÊ;ÕÊ;ÎÊ;ÇÊ;ÀÊ;¹Ê;²Ê;«Ê;¤Ê;Ê;–Ê;Ê;ˆÊ;Ê;zÊ;sÊ;lÊ;eÊ;^Ê;WÊ;PÊ;IÊ;BÊ;;Ê;4Ê;-Ê;&Ê;Ê;Ê;Ê; Ê;Ê;üÉ;õÉ;îÉ;çÉ;àÉ;ÙÉ;ÒÉ;ËÉ;ÄÉ;½É;¶É;¯É;¨É;¡É;šÉ;“É;ŒÉ;…É;~É;wÉ;pÉ;iÉ;bÉ;[É;TÉ;MÉ;FÉ;?É;8É;1É;*É;#É;É;É;É;É;É;ùÈ;òÈ;ëÈ;äÈ;ÝÈ;ÖÈ;ÏÈ;ÈÈ;ÁÈ;ºÈ;³È;¬È;¥È;žÈ;—È;È;‰È;‚È;{È;tÈ;mÈ;fÈ;_È;XÈ;QÈ;JÈ;CÈ;<È;5È;.È;'È; È;È;È; È;È;ýÇ;öÇ;ïÇ;èÇ;áÇ;ÚÇ;ÓÇ;ÌÇ;ÅÇ;¾Ç;·Ç;°Ç;©Ç;¢Ç;›Ç;”Ç;Ç;†Ç;Ç;xÇ;qÇ;jÇ;cÇ;\Ç;UÇ;NÇ;GÇ;@Ç;9Ç;2Ç;+Ç;$Ç;Ç;Ç;Ç;Ç;Ç;úÆ;óÆ;ìÆ;åÆ;ÞÆ;ׯ;ÐÆ;ÉÆ;ÂÆ;»Æ;´Æ;­Æ;¦Æ;ŸÆ;˜Æ;‘Æ;ŠÆ;ƒÆ;|Æ;uÆ;nÆ;gÆ;`Æ;YÆ;RÆ;KÆ;DÆ;=Æ;6Æ;/Æ;(Æ;!Æ;Æ;Æ; Æ;Æ;þÅ;÷Å;ðÅ;éÅ;âÅ;ÛÅ;ÔÅ;ÍÅ;ÆÅ;¿Å;¸Å;±Å;ªÅ;£Å;œÅ;•Å;ŽÅ;‡Å;€Å;yÅ;rÅ;kÅ;dÅ;]Å;VÅ;OÅ;HÅ;AÅ;:Å;3Å;,Å;%Å;Å;Å;Å; Å;Å;ûÄ;ôÄ;íÄ;æÄ;ßÄ;ØÄ;ÑÄ;ÊÄ;ÃÄ;¼Ä;µÄ;®Ä;§Ä; Ä;™Ä;’Ä;‹Ä;„Ä;}Ä;vÄ;oÄ;hÄ;aÄ;ZÄ;SÄ;LÄ;EÄ;>Ä;7Ä;0Ä;)Ä;"Ä;Ä;Ä; Ä;Ä;ÿÃ;øÃ;ñÃ;êÃ;ãÃ;ÜÃ;ÕÃ;ÎÃ;ÇÃ;ÀÃ;¹Ã;²Ã;«Ã;¤Ã;Ã;–Ã;Ã;ˆÃ;Ã;zÃ;sÃ;lÃ;eÃ;^Ã;WÃ;PÃ;IÃ;BÃ;;Ã;4Ã;-Ã;&Ã;Ã;Ã;Ã; Ã;Ã;üÂ;õÂ;îÂ;çÂ;àÂ;ÙÂ;ÒÂ;ËÂ;ÄÂ;½Â;¶Â;¯Â;¨Â;¡Â;šÂ;“Â;ŒÂ;…Â;~Â;wÂ;pÂ;iÂ;bÂ;[Â;TÂ;MÂ;FÂ;?Â;8Â;1Â;*Â;#Â;Â;Â;Â;Â;Â;ùÁ;òÁ;ëÁ;äÁ;ÝÁ;ÖÁ;ÏÁ;ÈÁ;ÁÁ;ºÁ;³Á;¬Á;¥Á;žÁ;—Á;Á;‰Á;‚Á;{Á;tÁ;mÁ;fÁ;_Á;XÁ;QÁ;JÁ;CÁ;<Á;5Á;.Á;'Á; Á;Á;Á; Á;Á;ýÀ;öÀ;ïÀ;èÀ;áÀ;ÚÀ;ÓÀ;ÌÀ;ÅÀ;¾À;·À;°À;©À;¢À;›À;”À;À;†À;À;xÀ;qÀ;jÀ;cÀ;\À;UÀ;NÀ;GÀ;@À;9À;2À;+À;$À;À;À;À;À;À;ú¿;ó¿;ì¿;å¿;Þ¿;׿;п;É¿;¿;»¿;´¿;­¿;¦¿;Ÿ¿;˜¿;‘¿;Š¿;ƒ¿;|¿;u¿;n¿;g¿;`¿;Y¿;R¿;K¿;D¿;=¿;6¿;/¿;(¿;!¿;¿;¿; ¿;¿;þ¾;÷¾;ð¾;é¾;â¾;Û¾;Ô¾;;;ƾ;¿¾;¸¾;±¾;ª¾;£¾;œ¾;•¾;޾;‡¾;€¾;y¾;r¾;k¾;d¾;]¾;V¾;O¾;H¾;A¾;:¾;3¾;,¾;%¾;¾;¾;¾; ¾;¾;û½;ô½;í½;æ½;ß½;ؽ;ѽ;ʽ;ý;¼½;µ½;®½;§½; ½;™½;’½;‹½;„½;}½;v½;o½;h½;a½;Z½;S½;L½;E½;>½;7½;0½;)½;"½;½;½; ½;½;ÿ¼;ø¼;ñ¼;ê¼;ã¼;ܼ;Õ¼;μ;Ǽ;À¼;¹¼;²¼;«¼;¤¼;¼;–¼;¼;ˆ¼;¼;z¼;s¼;l¼;e¼;^¼;W¼;P¼;I¼;B¼;;¼;4¼;-¼;&¼;¼;¼;¼; ¼;¼;ü»;õ»;î»;ç»;à»;Ù»;Ò»;Ë»;Ä»;½»;¶»;¯»;¨»;¡»;š»;“»;Œ»;…»;~»;w»;p»;i»;b»;[»;T»;M»;F»;?»;8»;1»;*»;#»;»;»;»;»;»;ùº;òº;ëº;äº;ݺ;Öº;Ϻ;Ⱥ;Áº;ºº;³º;¬º;¥º;žº;—º;º;‰º;‚º;{º;tº;mº;fº;_º;Xº;Qº;Jº;Cº;<º;5º;.º;'º; º;º;º; º;º;ý¹;ö¹;ï¹;è¹;á¹;Ú¹;Ó¹;̹;Ź;¾¹;·¹;°¹;©¹;¢¹;›¹;”¹;¹;†¹;¹;x¹;q¹;j¹;c¹;\¹;U¹;N¹;G¹;@¹;9¹;2¹;+¹;$¹;¹;¹;¹;¹;¹;ú¸;ó¸;ì¸;å¸;Þ¸;׸;и;ɸ;¸;»¸;´¸;­¸;¦¸;Ÿ¸;˜¸;‘¸;Џ;ƒ¸;|¸;u¸;n¸;g¸;`¸;Y¸;R¸;K¸;D¸;=¸;6¸;/¸;(¸;!¸;¸;¸; ¸;¸;þ·;÷·;ð·;é·;â·;Û·;Ô·;Í·;Æ·;¿·;¸·;±·;ª·;£·;œ·;•·;Ž·;‡·;€·;y·;r·;k·;d·;]·;V·;O·;H·;A·;:·;3·;,·;%·;·;·;·; ·;·;û¶;ô¶;í¶;æ¶;ß¶;ض;Ѷ;ʶ;ö;¼¶;µ¶;®¶;§¶; ¶;™¶;’¶;‹¶;„¶;}¶;v¶;o¶;h¶;a¶;Z¶;S¶;L¶;E¶;>¶;7¶;0¶;)¶;"¶;¶;¶; ¶;¶;ÿµ;øµ;ñµ;êµ;ãµ;ܵ;Õµ;ε;ǵ;Àµ;¹µ;²µ;«µ;¤µ;µ;–µ;µ;ˆµ;µ;zµ;sµ;lµ;eµ;^µ;Wµ;Pµ;Iµ;Bµ;;µ;4µ;-µ;&µ;µ;µ;µ; µ;µ;ü´;õ´;î´;ç´;à´;Ù´;Ò´;Ë´;Ä´;½´;¶´;¯´;¨´;¡´;š´;“´;Œ´;…´;~´;w´;p´;i´;b´;[´;T´;M´;F´;?´;8´;1´;*´;#´;´;´;´;´;´;ù³;ò³;ë³;ä³;ݳ;Ö³;ϳ;ȳ;Á³;º³;³³;¬³;¥³;ž³;—³;³;‰³;‚³;{³;t³;m³;f³;_³;X³;Q³;J³;C³;<³;5³;.³;'³; ³;³;³; ³;³;ý²;ö²;ï²;è²;á²;Ú²;Ó²;̲;Ų;¾²;·²;°²;©²;¢²;›²;”²;²;†²;²;x²;q²;j²;c²;\²;U²;N²;G²;@²;9²;2²;+²;$²;²;²;²;²;²;ú±;ó±;ì±;å±;Þ±;×±;б;ɱ;±;»±;´±;­±;¦±;Ÿ±;˜±;‘±;б;ƒ±;|±;u±;n±;g±;`±;Y±;R±;K±;D±;=±;6±;/±;(±;!±;±;±; ±;±;þ°;÷°;ð°;é°;â°;Û°;Ô°;Ͱ;ư;¿°;¸°;±°;ª°;£°;œ°;•°;ް;‡°;€°;y°;r°;k°;d°;]°;V°;O°;H°;A°;:°;3°;,°;%°;°;°;°; °;°;û¯;ô¯;í¯;æ¯;߯;د;ѯ;ʯ;ï;¼¯;µ¯;®¯;§¯; ¯;™¯;’¯;‹¯;„¯;}¯;v¯;o¯;h¯;a¯;Z¯;S¯;L¯;E¯;>¯;7¯;0¯;)¯;"¯;¯;¯; ¯;¯;ÿ®;ø®;ñ®;ê®;ã®;Ü®;Õ®;ή;Ç®;À®;¹®;²®;«®;¤®;®;–®;®;ˆ®;®;z®;s®;l®;e®;^®;W®;P®;I®;B®;;®;4®;-®;&®;®;®;®; ®;®;ü­;õ­;î­;ç­;à­;Ù­;Ò­;Ë­;Ä­;½­;¶­;¯­;¨­;¡­;š­;“­;Œ­;…­;~­;w­;p­;i­;b­;[­;T­;M­;F­;?­;8­;1­;*­;#­;­;­;­;­;­;ù¬;ò¬;ë¬;ä¬;ݬ;Ö¬;Ϭ;Ȭ;Á¬;º¬;³¬;¬¬;¥¬;ž¬;—¬;¬;‰¬;‚¬;{¬;t¬;m¬;f¬;_¬;X¬;Q¬;J¬;C¬;<¬;5¬;.¬;'¬; ¬;¬;¬; ¬;¬;ý«;ö«;ï«;è«;á«;Ú«;Ó«;Ì«;Å«;¾«;·«;°«;©«;¢«;›«;”«;«;†«;«;x«;q«;j«;c«;\«;U«;N«;G«;@«;9«;2«;+«;$«;«;«;«;«;«;úª;óª;ìª;åª;Þª;ת;Ъ;ɪ;ª;»ª;´ª;­ª;¦ª;Ÿª;˜ª;‘ª;Šª;ƒª;|ª;uª;nª;gª;`ª;Yª;Rª;Kª;Dª;=ª;6ª;/ª;(ª;!ª;ª;ª; ª;ª;þ©;÷©;ð©;é©;â©;Û©;Ô©;Í©;Æ©;¿©;¸©;±©;ª©;£©;œ©;•©;Ž©;‡©;€©;y©;r©;k©;d©;]©;V©;O©;H©;A©;:©;3©;,©;%©;©;©;©; ©;©;û¨;ô¨;í¨;æ¨;ߨ;ب;Ѩ;ʨ;è;¼¨;µ¨;®¨;§¨; ¨;™¨;’¨;‹¨;„¨;}¨;v¨;o¨;h¨;a¨;Z¨;S¨;L¨;E¨;>¨;7¨;0¨;)¨;"¨;¨;¨; ¨;¨;ÿ§;ø§;ñ§;ê§;ã§;ܧ;Õ§;Χ;ǧ;À§;¹§;²§;«§;¤§;§;–§;§;ˆ§;§;z§;s§;l§;e§;^§;W§;P§;I§;B§;;§;4§;-§;&§;§;§;§; §;§;ü¦;õ¦;î¦;ç¦;à¦;Ù¦;Ò¦;˦;Ħ;½¦;¶¦;¯¦;¨¦;¡¦;š¦;“¦;Œ¦;…¦;~¦;w¦;p¦;i¦;b¦;[¦;T¦;M¦;F¦;?¦;8¦;1¦;*¦;#¦;¦;¦;¦;¦;¦;ù¥;ò¥;ë¥;ä¥;Ý¥;Ö¥;Ï¥;È¥;Á¥;º¥;³¥;¬¥;¥¥;ž¥;—¥;¥;‰¥;‚¥;{¥;t¥;m¥;f¥;_¥;X¥;Q¥;J¥;C¥;<¥;5¥;.¥;'¥; ¥;¥;¥; ¥;¥;ý¤;ö¤;ï¤;è¤;á¤;Ú¤;Ó¤;̤;Ť;¾¤;·¤;°¤;©¤;¢¤;›¤;”¤;¤;†¤;¤;x¤;q¤;j¤;c¤;\¤;U¤;N¤;G¤;@¤;9¤;2¤;+¤;$¤;¤;¤;¤;¤;¤;ú£;ó£;ì£;å£;Þ£;×£;У;É£;£;»£;´£;­£;¦£;Ÿ£;˜£;‘£;Š£;ƒ£;|£;u£;n£;g£;`£;Y£;R£;K£;D£;=£;6£;/£;(£;!£;£;£; £;£;þ¢;÷¢;ð¢;é¢;â¢;Û¢;Ô¢;Í¢;Æ¢;¿¢;¸¢;±¢;ª¢;£¢;œ¢;•¢;Ž¢;‡¢;€¢;y¢;r¢;k¢;d¢;]¢;V¢;O¢;H¢;A¢;:¢;3¢;,¢;%¢;¢;¢;¢; ¢;¢;û¡;ô¡;í¡;æ¡;ß¡;Ø¡;Ñ¡;Ê¡;á;¼¡;µ¡;®¡;§¡; ¡;™¡;’¡;‹¡;„¡;}¡;v¡;o¡;h¡;a¡;Z¡;S¡;L¡;E¡;>¡;7¡;0¡;)¡;"¡;¡;¡; ¡;¡;ÿ ;ø ;ñ ;ê ;ã ;Ü ;Õ ;Π;Ç ;À ;¹ ;² ;« ;¤ ; ;– ; ;ˆ ; ;z ;s ;l ;e ;^ ;W ;P ;I ;B ;; ;4 ;- ;& ; ; ; ;  ; ;üŸ;õŸ;îŸ;çŸ;àŸ;ÙŸ;ÒŸ;ËŸ;ÄŸ;½Ÿ;¶Ÿ;¯Ÿ;¨Ÿ;¡Ÿ;šŸ;“Ÿ;ŒŸ;…Ÿ;~Ÿ;wŸ;pŸ;iŸ;bŸ;[Ÿ;TŸ;MŸ;FŸ;?Ÿ;8Ÿ;1Ÿ;*Ÿ;#Ÿ;Ÿ;Ÿ;Ÿ;Ÿ;Ÿ;ùž;òž;ëž;äž;Ýž;Öž;Ïž;Èž;Áž;ºž;³ž;¬ž;¥ž;žž;—ž;ž;‰ž;‚ž;{ž;tž;mž;fž;_ž;Xž;Qž;Jž;Cž;<ž;5ž;.ž;'ž; ž;ž;ž; ž;ž;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;úœ;óœ;ìœ;åœ;Þœ;ל;М;Éœ;œ;»œ;´œ;­œ;¦œ;Ÿœ;˜œ;‘œ;Šœ;ƒœ;|œ;uœ;nœ;gœ;`œ;Yœ;Rœ;Kœ;Dœ;=œ;6œ;/œ;(œ;!œ;œ;œ; œ;œ;þ›;÷›;ð›;é›;â›;Û›;Ô›;Í›;Æ›;¿›;¸›;±›;ª›;£›;œ›;•›;Ž›;‡›;€›;y›;r›;k›;d›;]›;V›;O›;H›;A›;:›;3›;,›;%›;›;›;›; ›;›;ûš;ôš;íš;æš;ßš;Øš;Ñš;Êš;Ú;¼š;µš;®š;§š; š;™š;’š;‹š;„š;}š;vš;oš;hš;aš;Zš;Sš;Lš;Eš;>š;7š;0š;)š;"š;š;š; š;š;ÿ™;ø™;ñ™;ê™;ã™;Ü™;Õ™;Ι;Ç™;À™;¹™;²™;«™;¤™;™;–™;™;ˆ™;™;z™;s™;l™;e™;^™;W™;P™;I™;B™;;™;4™;-™;&™;™;™;™; ™;™;ü˜;õ˜;î˜;ç˜;à˜;Ù˜;Ò˜;˘;Ę;½˜;¶˜;¯˜;¨˜;¡˜;š˜;“˜;Œ˜;…˜;~˜;w˜;p˜;i˜;b˜;[˜;T˜;M˜;F˜;?˜;8˜;1˜;*˜;#˜;˜;˜;˜;˜;˜;ù—;ò—;ë—;ä—;Ý—;Ö—;Ï—;È—;Á—;º—;³—;¬—;¥—;ž—;——;—;‰—;‚—;{—;t—;m—;f—;_—;X—;Q—;J—;C—;<—;5—;.—;'—; —;—;—; —;—;ý–;ö–;ï–;è–;á–;Ú–;Ó–;Ì–;Å–;¾–;·–;°–;©–;¢–;›–;”–;–;†–;–;x–;q–;j–;c–;\–;U–;N–;G–;@–;9–;2–;+–;$–;–;–;–;–;–;ú•;ó•;ì•;å•;Þ•;ו;Е;É•;•;»•;´•;­•;¦•;Ÿ•;˜•;‘•;Š•;ƒ•;|•;u•;n•;g•;`•;Y•;R•;K•;D•;=•;6•;/•;(•;!•;•;•; •;•;þ”;÷”;ð”;é”;â”;Û”;Ô”;Í”;Æ”;¿”;¸”;±”;ª”;£”;œ”;•”;Ž”;‡”;€”;y”;r”;k”;d”;]”;V”;O”;H”;A”;:”;3”;,”;%”;”;”;”; ”;”;û“;ô“;í“;æ“;ß“;Ø“;Ñ“;Ê“;Ó;¼“;µ“;®“;§“; “;™“;’“;‹“;„“;}“;v“;o“;h“;a“;Z“;S“;L“;E“;>“;7“;0“;)“;"“;“;“; “;“;ÿ’;ø’;ñ’;ê’;ã’;Ü’;Õ’;Î’;Ç’;À’;¹’;²’;«’;¤’;’;–’;’;ˆ’;’;z’;s’;l’;e’;^’;W’;P’;I’;B’;;’;4’;-’;&’;’;’;’; ’;’;ü‘;õ‘;î‘;ç‘;à‘;Ù‘;Ò‘;Ë‘;Ä‘;½‘;¶‘;¯‘;¨‘;¡‘;š‘;“‘;Œ‘;…‘;~‘;w‘;p‘;i‘;b‘;[‘;T‘;M‘;F‘;?‘;8‘;1‘;*‘;#‘;‘;‘;‘;‘;‘;ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;úŽ;óŽ;ìŽ;åŽ;ÞŽ;׎;ÐŽ;ÉŽ;ÂŽ;»Ž;´Ž;­Ž;¦Ž;ŸŽ;˜Ž;‘Ž;ŠŽ;ƒŽ;|Ž;uŽ;nŽ;gŽ;`Ž;YŽ;RŽ;KŽ;DŽ;=Ž;6Ž;/Ž;(Ž;!Ž;Ž;Ž; Ž;Ž;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;ûŒ;ôŒ;íŒ;æŒ;ߌ;ØŒ;ÑŒ;ÊŒ;ÃŒ;¼Œ;µŒ;®Œ;§Œ; Œ;™Œ;’Œ;‹Œ;„Œ;}Œ;vŒ;oŒ;hŒ;aŒ;ZŒ;SŒ;LŒ;EŒ;>Œ;7Œ;0Œ;)Œ;"Œ;Œ;Œ; Œ;Œ;ÿ‹;ø‹;ñ‹;ê‹;ã‹;Ü‹;Õ‹;΋;Ç‹;À‹;¹‹;²‹;«‹;¤‹;‹;–‹;‹;ˆ‹;‹;z‹;s‹;l‹;e‹;^‹;W‹;P‹;I‹;B‹;;‹;4‹;-‹;&‹;‹;‹;‹; ‹;‹;üŠ;õŠ;îŠ;çŠ;àŠ;ÙŠ;ÒŠ;ËŠ;ÄŠ;½Š;¶Š;¯Š;¨Š;¡Š;šŠ;“Š;ŒŠ;…Š;~Š;wŠ;pŠ;iŠ;bŠ;[Š;TŠ;MŠ;FŠ;?Š;8Š;1Š;*Š;#Š;Š;Š;Š;Š;Š;ù‰;ò‰;ë‰;ä‰;݉;Ö‰;ω;ȉ;Á‰;º‰;³‰;¬‰;¥‰;ž‰;—‰;‰;‰‰;‚‰;{‰;t‰;m‰;f‰;_‰;X‰;Q‰;J‰;C‰;<‰;5‰;.‰;'‰; ‰;‰;‰; ‰;‰;ýˆ;öˆ;ïˆ;èˆ;áˆ;Úˆ;Óˆ;̈;ň;¾ˆ;·ˆ;°ˆ;©ˆ;¢ˆ;›ˆ;”ˆ;ˆ;†ˆ;ˆ;xˆ;qˆ;jˆ;cˆ;\ˆ;Uˆ;Nˆ;Gˆ;@ˆ;9ˆ;2ˆ;+ˆ;$ˆ;ˆ;ˆ;ˆ;ˆ;ˆ;ú‡;ó‡;ì‡;å‡;Þ‡;ׇ;Ї;ɇ;‡;»‡;´‡;­‡;¦‡;Ÿ‡;˜‡;‘‡;Ї;ƒ‡;|‡;u‡;n‡;g‡;`‡;Y‡;R‡;K‡;D‡;=‡;6‡;/‡;(‡;!‡;‡;‡; ‡;‡;þ†;÷†;ð†;é†;â†;Û†;Ô†;͆;Ɔ;¿†;¸†;±†;ª†;£†;œ†;•†;ކ;‡†;€†;y†;r†;k†;d†;]†;V†;O†;H†;A†;:†;3†;,†;%†;†;†;†; †;†;û…;ô…;í…;æ…;ß…;Ø…;Ñ…;Ê…;Ã…;¼…;µ…;®…;§…; …;™…;’…;‹…;„…;}…;v…;o…;h…;a…;Z…;S…;L…;E…;>…;7…;0…;)…;"…;…;…; …;…;ÿ„;ø„;ñ„;ê„;ã„;Ü„;Õ„;΄;Ç„;À„;¹„;²„;«„;¤„;„;–„;„;ˆ„;„;z„;s„;l„;e„;^„;W„;P„;I„;B„;;„;4„;-„;&„;„;„;„; „;„;üƒ;õƒ;îƒ;çƒ;àƒ;Ùƒ;Òƒ;˃;ă;½ƒ;¶ƒ;¯ƒ;¨ƒ;¡ƒ;šƒ;“ƒ;Œƒ;…ƒ;~ƒ;wƒ;pƒ;iƒ;bƒ;[ƒ;Tƒ;Mƒ;Fƒ;?ƒ;8ƒ;1ƒ;*ƒ;#ƒ;ƒ;ƒ;ƒ;ƒ;ƒ;ù‚;ò‚;ë‚;ä‚;Ý‚;Ö‚;Ï‚;È‚;Á‚;º‚;³‚;¬‚;¥‚;ž‚;—‚;‚;‰‚;‚‚;{‚;t‚;m‚;f‚;_‚;X‚;Q‚;J‚;C‚;<‚;5‚;.‚;'‚; ‚;‚;‚; ‚;‚;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú€;ó€;ì€;å€;Þ€;×€;Ѐ;É€;€;»€;´€;­€;¦€;Ÿ€;˜€;‘€;Š€;ƒ€;|€;u€;n€;g€;`€;Y€;R€;K€;D€;=€;6€;/€;(€;!€;€;€; €;€;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û~;ô~;í~;æ~;ß~;Ø~;Ñ~;Ê~;Ã~;¼~;µ~;®~;§~; ~;™~;’~;‹~;„~;}~;v~;o~;h~;a~;Z~;S~;L~;E~;>~;7~;0~;)~;"~;~;~; ~;~;ÿ};ø};ñ};ê};ã};Ü};Õ};Î};Ç};À};¹};²};«};¤};};–};};ˆ};};z};s};l};e};^};W};P};I};B};;};4};-};&};};};}; };};ü|;õ|;î|;ç|;à|;Ù|;Ò|;Ë|;Ä|;½|;¶|;¯|;¨|;¡|;š|;“|;Œ|;…|;~|;w|;p|;i|;b|;[|;T|;M|;F|;?|;8|;1|;*|;#|;|;|;|;|;|;ù{;ò{;ë{;ä{;Ý{;Ö{;Ï{;È{;Á{;º{;³{;¬{;¥{;ž{;—{;{;‰{;‚{;{{;t{;m{;f{;_{;X{;Q{;J{;C{;<{;5{;.{;'{; {;{;{; {;{;ýz;öz;ïz;èz;áz;Úz;Óz;Ìz;Åz;¾z;·z;°z;©z;¢z;›z;”z;z;†z;z;xz;qz;jz;cz;\z;Uz;Nz;Gz;@z;9z;2z;+z;$z;z;z;z;z;z;úy;óy;ìy;åy;Þy;×y;Ðy;Éy;Ây;»y;´y;­y;¦y;Ÿy;˜y;‘y;Šy;ƒy;|y;uy;ny;gy;`y;Yy;Ry;Ky;Dy;=y;6y;/y;(y;!y;y;y; y;y;þx;÷x;ðx;éx;âx;Ûx;Ôx;Íx;Æx;¿x;¸x;±x;ªx;£x;œx;•x;Žx;‡x;€x;yx;rx;kx;dx;]x;Vx;Ox;Hx;Ax;:x;3x;,x;%x;x;x;x; x;x;ûw;ôw;íw;æw;ßw;Øw;Ñw;Êw;Ãw;¼w;µw;®w;§w; w;™w;’w;‹w;„w;}w;vw;ow;hw;aw;Zw;Sw;Lw;Ew;>w;7w;0w;)w;"w;w;w; w;w;ÿv;øv;ñv;êv;ãv;Üv;Õv;Îv;Çv;Àv;¹v;²v;«v;¤v;v;–v;v;ˆv;v;zv;sv;lv;ev;^v;Wv;Pv;Iv;Bv;;v;4v;-v;&v;v;v;v; v;v;üu;õu;îu;çu;àu;Ùu;Òu;Ëu;Äu;½u;¶u;¯u;¨u;¡u;šu;“u;Œu;…u;~u;wu;pu;iu;bu;[u;Tu;Mu;Fu;?u;8u;1u;*u;#u;u;u;u;u;u;ùt;òt;ët;ät;Ýt;Öt;Ït;Èt;Át;ºt;³t;¬t;¥t;žt;—t;t;‰t;‚t;{t;tt;mt;ft;_t;Xt;Qt;Jt;Ct;p;7p;0p;)p;"p;p;p; p;p;ÿo;øo;ño;êo;ão;Üo;Õo;Îo;Ço;Ào;¹o;²o;«o;¤o;o;–o;o;ˆo;o;zo;so;lo;eo;^o;Wo;Po;Io;Bo;;o;4o;-o;&o;o;o;o; o;o;ün;õn;în;çn;àn;Ùn;Òn;Ën;Än;½n;¶n;¯n;¨n;¡n;šn;“n;Œn;…n;~n;wn;pn;in;bn;[n;Tn;Mn;Fn;?n;8n;1n;*n;#n;n;n;n;n;n;ùm;òm;ëm;äm;Ým;Öm;Ïm;Èm;Ám;ºm;³m;¬m;¥m;žm;—m;m;‰m;‚m;{m;tm;mm;fm;_m;Xm;Qm;Jm;Cm;i;7i;0i;)i;"i;i;i; i;i;ÿh;øh;ñh;êh;ãh;Üh;Õh;Îh;Çh;Àh;¹h;²h;«h;¤h;h;–h;h;ˆh;h;zh;sh;lh;eh;^h;Wh;Ph;Ih;Bh;;h;4h;-h;&h;h;h;h; h;h;üg;õg;îg;çg;àg;Ùg;Òg;Ëg;Äg;½g;¶g;¯g;¨g;¡g;šg;“g;Œg;…g;~g;wg;pg;ig;bg;[g;Tg;Mg;Fg;?g;8g;1g;*g;#g;g;g;g;g;g;ùf;òf;ëf;äf;Ýf;Öf;Ïf;Èf;Áf;ºf;³f;¬f;¥f;žf;—f;f;‰f;‚f;{f;tf;mf;ff;_f;Xf;Qf;Jf;Cf;b;7b;0b;)b;"b;b;b; b;b;ÿa;øa;ña;êa;ãa;Üa;Õa;Îa;Ça;Àa;¹a;²a;«a;¤a;a;–a;a;ˆa;a;za;sa;la;ea;^a;Wa;Pa;Ia;Ba;;a;4a;-a;&a;a;a;a; a;a;ü`;õ`;î`;ç`;à`;Ù`;Ò`;Ë`;Ä`;½`;¶`;¯`;¨`;¡`;š`;“`;Œ`;…`;~`;w`;p`;i`;b`;[`;T`;M`;F`;?`;8`;1`;*`;#`;`;`;`;`;`;ù_;ò_;ë_;ä_;Ý_;Ö_;Ï_;È_;Á_;º_;³_;¬_;¥_;ž_;—_;_;‰_;‚_;{_;t_;m_;f_;__;X_;Q_;J_;C_;<_;5_;._;'_; _;_;_; _;_;ý^;ö^;ï^;è^;á^;Ú^;Ó^;Ì^;Å^;¾^;·^;°^;©^;¢^;›^;”^;^;†^;^;x^;q^;j^;c^;\^;U^;N^;G^;@^;9^;2^;+^;$^;^;^;^;^;^;ú];ó];ì];å];Þ];×];Ð];É];Â];»];´];­];¦];Ÿ];˜];‘];Š];ƒ];|];u];n];g];`];Y];R];K];D];=];6];/];(];!];];]; ];];þ\;÷\;ð\;é\;â\;Û\;Ô\;Í\;Æ\;¿\;¸\;±\;ª\;£\;œ\;•\;Ž\;‡\;€\;y\;r\;k\;d\;]\;V\;O\;H\;A\;:\;3\;,\;%\;\;\;\; \;\;û[;ô[;í[;æ[;ß[;Ø[;Ñ[;Ê[;Ã[;¼[;µ[;®[;§[; [;™[;’[;‹[;„[;}[;v[;o[;h[;a[;Z[;S[;L[;E[;>[;7[;0[;)[;"[;[;[; [;[;ÿZ;øZ;ñZ;êZ;ãZ;ÜZ;ÕZ;ÎZ;ÇZ;ÀZ;¹Z;²Z;«Z;¤Z;Z;–Z;Z;ˆZ;Z;zZ;sZ;lZ;eZ;^Z;WZ;PZ;IZ;BZ;;Z;4Z;-Z;&Z;Z;Z;Z; Z;Z;üY;õY;îY;çY;àY;ÙY;ÒY;ËY;ÄY;½Y;¶Y;¯Y;¨Y;¡Y;šY;“Y;ŒY;…Y;~Y;wY;pY;iY;bY;[Y;TY;MY;FY;?Y;8Y;1Y;*Y;#Y;Y;Y;Y;Y;Y;ùX;òX;ëX;äX;ÝX;ÖX;ÏX;ÈX;ÁX;ºX;³X;¬X;¥X;žX;—X;X;‰X;‚X;{X;tX;mX;fX;_X;XX;QX;JX;CX;T;7T;0T;)T;"T;T;T; T;T;ÿS;øS;ñS;êS;ãS;ÜS;ÕS;ÎS;ÇS;ÀS;¹S;²S;«S;¤S;S;–S;S;ˆS;S;zS;sS;lS;eS;^S;WS;PS;IS;BS;;S;4S;-S;&S;S;S;S; S;S;üR;õR;îR;çR;àR;ÙR;ÒR;ËR;ÄR;½R;¶R;¯R;¨R;¡R;šR;“R;ŒR;…R;~R;wR;pR;iR;bR;[R;TR;MR;FR;?R;8R;1R;*R;#R;R;R;R;R;R;ùQ;òQ;ëQ;äQ;ÝQ;ÖQ;ÏQ;ÈQ;ÁQ;ºQ;³Q;¬Q;¥Q;žQ;—Q;Q;‰Q;‚Q;{Q;tQ;mQ;fQ;_Q;XQ;QQ;JQ;CQ;M;7M;0M;)M;"M;M;M; M;M;ÿL;øL;ñL;êL;ãL;ÜL;ÕL;ÎL;ÇL;ÀL;¹L;²L;«L;¤L;L;–L;L;ˆL;L;zL;sL;lL;eL;^L;WL;PL;IL;BL;;L;4L;-L;&L;L;L;L; L;L;üK;õK;îK;çK;àK;ÙK;ÒK;ËK;ÄK;½K;¶K;¯K;¨K;¡K;šK;“K;ŒK;…K;~K;wK;pK;iK;bK;[K;TK;MK;FK;?K;8K;1K;*K;#K;K;K;K;K;K;ùJ;òJ;ëJ;äJ;ÝJ;ÖJ;ÏJ;ÈJ;ÁJ;ºJ;³J;¬J;¥J;žJ;—J;J;‰J;‚J;{J;tJ;mJ;fJ;_J;XJ;QJ;JJ;CJ;F;7F;0F;)F;"F;F;F; F;F;ÿE;øE;ñE;êE;ãE;ÜE;ÕE;ÎE;ÇE;ÀE;¹E;²E;«E;¤E;E;–E;E;ˆE;E;zE;sE;lE;eE;^E;WE;PE;IE;BE;;E;4E;-E;&E;E;E;E; E;E;üD;õD;îD;çD;àD;ÙD;ÒD;ËD;ÄD;½D;¶D;¯D;¨D;¡D;šD;“D;ŒD;…D;~D;wD;pD;iD;bD;[D;TD;MD;FD;?D;8D;1D;*D;#D;D;D;D;D;D;ùC;òC;ëC;äC;ÝC;ÖC;ÏC;ÈC;ÁC;ºC;³C;¬C;¥C;žC;—C;C;‰C;‚C;{C;tC;mC;fC;_C;XC;QC;JC;CC;?;7?;0?;)?;"?;?;?; ?;?;ÿ>;ø>;ñ>;ê>;ã>;Ü>;Õ>;Î>;Ç>;À>;¹>;²>;«>;¤>;>;–>;>;ˆ>;>;z>;s>;l>;e>;^>;W>;P>;I>;B>;;>;4>;->;&>;>;>;>; >;>;ü=;õ=;î=;ç=;à=;Ù=;Ò=;Ë=;Ä=;½=;¶=;¯=;¨=;¡=;š=;“=;Œ=;…=;~=;w=;p=;i=;b=;[=;T=;M=;F=;?=;8=;1=;*=;#=;=;=;=;=;=;ù<;ò<;ë<;ä<;Ý<;Ö<;Ï<;È<;Á<;º<;³<;¬<;¥<;ž<;—<;<;‰<;‚<;{<;t<;m<;f<;_<;X<;Q<;J<;C<;<<;5<;.<;'<; <;<;<; <;<;ý;;ö;;ï;;è;;á;;Ú;;Ó;;Ì;;Å;;¾;;·;;°;;©;;¢;;›;;”;;;;†;;;;x;;q;;j;;c;;\;;U;;N;;G;;@;;9;;2;;+;;$;;;;;;;;;;;;ú:;ó:;ì:;å:;Þ:;×:;Ð:;É:;Â:;»:;´:;­:;¦:;Ÿ:;˜:;‘:;Š:;ƒ:;|:;u:;n:;g:;`:;Y:;R:;K:;D:;=:;6:;/:;(:;!:;:;:; :;:;þ9;÷9;ð9;é9;â9;Û9;Ô9;Í9;Æ9;¿9;¸9;±9;ª9;£9;œ9;•9;Ž9;‡9;€9;y9;r9;k9;d9;]9;V9;O9;H9;A9;:9;39;,9;%9;9;9;9; 9;9;û8;ô8;í8;æ8;ß8;Ø8;Ñ8;Ê8;Ã8;¼8;µ8;®8;§8; 8;™8;’8;‹8;„8;}8;v8;o8;h8;a8;Z8;S8;L8;E8;>8;78;08;)8;"8;8;8; 8;8;ÿ7;ø7;ñ7;ê7;ã7;Ü7;Õ7;Î7;Ç7;À7;¹7;²7;«7;¤7;7;–7;7;ˆ7;7;z7;s7;l7;e7;^7;W7;P7;I7;B7;;7;47;-7;&7;7;7;7; 7;7;ü6;õ6;î6;ç6;à6;Ù6;Ò6;Ë6;Ä6;½6;¶6;¯6;¨6;¡6;š6;“6;Œ6;…6;~6;w6;p6;i6;b6;[6;T6;M6;F6;?6;86;16;*6;#6;6;6;6;6;6;ù5;ò5;ë5;ä5;Ý5;Ö5;Ï5;È5;Á5;º5;³5;¬5;¥5;ž5;—5;5;‰5;‚5;{5;t5;m5;f5;_5;X5;Q5;J5;C5;<5;55;.5;'5; 5;5;5; 5;5;ý4;ö4;ï4;è4;á4;Ú4;Ó4;Ì4;Å4;¾4;·4;°4;©4;¢4;›4;”4;4;†4;4;x4;q4;j4;c4;\4;U4;N4;G4;@4;94;24;+4;$4;4;4;4;4;4;ú3;ó3;ì3;å3;Þ3;×3;Ð3;É3;Â3;»3;´3;­3;¦3;Ÿ3;˜3;‘3;Š3;ƒ3;|3;u3;n3;g3;`3;Y3;R3;K3;D3;=3;63;/3;(3;!3;3;3; 3;3;þ2;÷2;ð2;é2;â2;Û2;Ô2;Í2;Æ2;¿2;¸2;±2;ª2;£2;œ2;•2;Ž2;‡2;€2;y2;r2;k2;d2;]2;V2;O2;H2;A2;:2;32;,2;%2;2;2;2; 2;2;û1;ô1;í1;æ1;ß1;Ø1;Ñ1;Ê1;Ã1;¼1;µ1;®1;§1; 1;™1;’1;‹1;„1;}1;v1;o1;h1;a1;Z1;S1;L1;E1;>1;71;01;)1;"1;1;1; 1;1;ÿ0;ø0;ñ0;ê0;ã0;Ü0;Õ0;Î0;Ç0;À0;¹0;²0;«0;¤0;0;–0;0;ˆ0;0;z0;s0;l0;e0;^0;W0;P0;I0;B0;;0;40;-0;&0;0;0;0; 0;0;ü/;õ/;î/;ç/;à/;Ù/;Ò/;Ë/;Ä/;½/;¶/;¯/;¨/;¡/;š/;“/;Œ/;…/;~/;w/;p/;i/;b/;[/;T/;M/;F/;?/;8/;1/;*/;#/;/;/;/;/;/;ù.;ò.;ë.;ä.;Ý.;Ö.;Ï.;È.;Á.;º.;³.;¬.;¥.;ž.;—.;.;‰.;‚.;{.;t.;m.;f.;_.;X.;Q.;J.;C.;<.;5.;..;'.; .;.;.; .;.;ý-;ö-;ï-;è-;á-;Ú-;Ó-;Ì-;Å-;¾-;·-;°-;©-;¢-;›-;”-;-;†-;-;x-;q-;j-;c-;\-;U-;N-;G-;@-;9-;2-;+-;$-;-;-;-;-;-;ú,;ó,;ì,;å,;Þ,;×,;Ð,;É,;Â,;»,;´,;­,;¦,;Ÿ,;˜,;‘,;Š,;ƒ,;|,;u,;n,;g,;`,;Y,;R,;K,;D,;=,;6,;/,;(,;!,;,;,; ,;,;þ+;÷+;ð+;é+;â+;Û+;Ô+;Í+;Æ+;¿+;¸+;±+;ª+;£+;œ+;•+;Ž+;‡+;€+;y+;r+;k+;d+;]+;V+;O+;H+;A+;:+;3+;,+;%+;+;+;+; +;+;û*;ô*;í*;æ*;ß*;Ø*;Ñ*;Ê*;Ã*;¼*;µ*;®*;§*; *;™*;’*;‹*;„*;}*;v*;o*;h*;a*;Z*;S*;L*;E*;>*;7*;0*;)*;"*;*;*; *;*;ÿ);ø);ñ);ê);ã);Ü);Õ);Î);Ç);À);¹);²);«);¤););–););ˆ););z);s);l);e);^);W);P);I);B);;);4);-);&);););); ););ü(;õ(;î(;ç(;à(;Ù(;Ò(;Ë(;Ä(;½(;¶(;¯(;¨(;¡(;š(;“(;Œ(;…(;~(;w(;p(;i(;b(;[(;T(;M(;F(;?(;8(;1(;*(;#(;(;(;(;(;(;ù';ò';ë';ä';Ý';Ö';Ï';È';Á';º';³';¬';¥';ž';—';';‰';‚';{';t';m';f';_';X';Q';J';C';<';5';.';''; ';';'; ';';ý&;ö&;ï&;è&;á&;Ú&;Ó&;Ì&;Å&;¾&;·&;°&;©&;¢&;›&;”&;&;†&;&;x&;q&;j&;c&;\&;U&;N&;G&;@&;9&;2&;+&;$&;&;&;&;&;&;ú%;ó%;ì%;å%;Þ%;×%;Ð%;É%;Â%;»%;´%;­%;¦%;Ÿ%;˜%;‘%;Š%;ƒ%;|%;u%;n%;g%;`%;Y%;R%;K%;D%;=%;6%;/%;(%;!%;%;%; %;%;þ$;÷$;ð$;é$;â$;Û$;Ô$;Í$;Æ$;¿$;¸$;±$;ª$;£$;œ$;•$;Ž$;‡$;€$;y$;r$;k$;d$;]$;V$;O$;H$;A$;:$;3$;,$;%$;$;$;$; $;$;û#;ô#;í#;æ#;ß#;Ø#;Ñ#;Ê#;Ã#;¼#;µ#;®#;§#; #;™#;’#;‹#;„#;}#;v#;o#;h#;a#;Z#;S#;L#;E#;>#;7#;0#;)#;"#;#;#; #;#;ÿ";ø";ñ";ê";ã";Ü";Õ";Î";Ç";À";¹";²";«";¤";";–";";ˆ";";z";s";l";e";^";W";P";I";B";;";4";-";&";";";"; ";";ü!;õ!;î!;ç!;à!;Ù!;Ò!;Ë!;Ä!;½!;¶!;¯!;¨!;¡!;š!;“!;Œ!;…!;~!;w!;p!;i!;b!;[!;T!;M!;F!;?!;8!;1!;*!;#!;!;!;!;!;!;ù ;ò ;ë ;ä ;Ý ;Ö ;Ï ;È ;Á ;º ;³ ;¬ ;¥ ;ž ;— ; ;‰ ;‚ ;{ ;t ;m ;f ;_ ;X ;Q ;J ;C ;< ;5 ;. ;' ; ; ; ; ; ;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ ;ø ;ñ ;ê ;ã ;Ü ;Õ ;Î ;Ç ;À ;¹ ;² ;« ;¤ ; ;– ; ;ˆ ; ;z ;s ;l ;e ;^ ;W ;P ;I ;B ;; ;4 ;- ;& ; ; ; ; ; ;ü ;õ ;î ;ç ;à ;Ù ;Ò ;Ë ;Ä ;½ ;¶ ;¯ ;¨ ;¡ ;š ;“ ;Œ ;… ;~ ;w ;p ;i ;b ;[ ;T ;M ;F ;? ;8 ;1 ;* ;# ; ; ; ; ; ;ù ;ò ;ë ;ä ;Ý ;Ö ;Ï ;È ;Á ;º ;³ ;¬ ;¥ ;ž ;— ; ;‰ ;‚ ;{ ;t ;m ;f ;_ ;X ;Q ;J ;C ;< ;5 ;. ;' ; ; ; ; ; ;ý ;ö ;ï ;è ;á ;Ú ;Ó ;Ì ;Å ;¾ ;· ;° ;© ;¢ ;› ;” ; ;† ; ;x ;q ;j ;c ;\ ;U ;N ;G ;@ ;9 ;2 ;+ ;$ ; ; ; ; ; ;ú ;ó ;ì ;å ;Þ ;× ;Ð ;É ; ;» ;´ ;­ ;¦ ;Ÿ ;˜ ;‘ ;Š ;ƒ ;| ;u ;n ;g ;` ;Y ;R ;K ;D ;= ;6 ;/ ;( ;! ; ; ; ; ;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿÿ:øÿ:ñÿ:êÿ:ãÿ:Üÿ:Õÿ:Îÿ:Çÿ:Àÿ:¹ÿ:²ÿ:«ÿ:¤ÿ:ÿ:–ÿ:ÿ:ˆÿ:ÿ:zÿ:sÿ:lÿ:eÿ:^ÿ:Wÿ:Pÿ:Iÿ:Bÿ:;ÿ:4ÿ:-ÿ:&ÿ:ÿ:ÿ:ÿ: ÿ:ÿ:üþ:õþ:îþ:çþ:àþ:Ùþ:Òþ:Ëþ:Äþ:½þ:¶þ:¯þ:¨þ:¡þ:šþ:“þ:Œþ:…þ:~þ:wþ:pþ:iþ:bþ:[þ:Tþ:Mþ:Fþ:?þ:8þ:1þ:*þ:#þ:þ:þ:þ:þ:þ:ùý:òý:ëý:äý:Ýý:Öý:Ïý:Èý:Áý:ºý:³ý:¬ý:¥ý:žý:—ý:ý:‰ý:‚ý:{ý:tý:mý:fý:_ý:Xý:Qý:Jý:Cý:<ý:5ý:.ý:'ý: ý:ý:ý: ý:ý:ýü:öü:ïü:èü:áü:Úü:Óü:Ìü:Åü:¾ü:·ü:°ü:©ü:¢ü:›ü:”ü:ü:†ü:ü:xü:qü:jü:cü:\ü:Uü:Nü:Gü:@ü:9ü:2ü:+ü:$ü:ü:ü:ü:ü:ü:úû:óû:ìû:åû:Þû:×û:Ðû:Éû:Âû:»û:´û:­û:¦û:Ÿû:˜û:‘û:Šû:ƒû:|û:uû:nû:gû:`û:Yû:Rû:Kû:Dû:=û:6û:/û:(û:!û:û:û: û:û:þú:÷ú:ðú:éú:âú:Ûú:Ôú:Íú:Æú:¿ú:¸ú:±ú:ªú:£ú:œú:•ú:Žú:‡ú:€ú:yú:rú:kú:dú:]ú:Vú:Oú:Hú:Aú::ú:3ú:,ú:%ú:ú:ú:ú: ú:ú:ûù:ôù:íù:æù:ßù:Øù:Ñù:Êù:Ãù:¼ù:µù:®ù:§ù: ù:™ù:’ù:‹ù:„ù:}ù:vù:où:hù:aù:Zù:Sù:Lù:Eù:>ù:7ù:0ù:)ù:"ù:ù:ù: ù:ù:ÿø:øø:ñø:êø:ãø:Üø:Õø:Îø:Çø:Àø:¹ø:²ø:«ø:¤ø:ø:–ø:ø:ˆø:ø:zø:sø:lø:eø:^ø:Wø:Pø:Iø:Bø:;ø:4ø:-ø:&ø:ø:ø:ø: ø:ø:ü÷:õ÷:î÷:ç÷:à÷:Ù÷:Ò÷:Ë÷:Ä÷:½÷:¶÷:¯÷:¨÷:¡÷:š÷:“÷:Œ÷:…÷:~÷:w÷:p÷:i÷:b÷:[÷:T÷:M÷:F÷:?÷:8÷:1÷:*÷:#÷:÷:÷:÷:÷:÷:ùö:òö:ëö:äö:Ýö:Öö:Ïö:Èö:Áö:ºö:³ö:¬ö:¥ö:žö:—ö:ö:‰ö:‚ö:{ö:tö:mö:fö:_ö:Xö:Qö:Jö:Cö:<ö:5ö:.ö:'ö: ö:ö:ö: ö:ö:ýõ:öõ:ïõ:èõ:áõ:Úõ:Óõ:Ìõ:Åõ:¾õ:·õ:°õ:©õ:¢õ:›õ:”õ:õ:†õ:õ:xõ:qõ:jõ:cõ:\õ:Uõ:Nõ:Gõ:@õ:9õ:2õ:+õ:$õ:õ:õ:õ:õ:õ:úô:óô:ìô:åô:Þô:×ô:Ðô:Éô:Âô:»ô:´ô:­ô:¦ô:Ÿô:˜ô:‘ô:Šô:ƒô:|ô:uô:nô:gô:`ô:Yô:Rô:Kô:Dô:=ô:6ô:/ô:(ô:!ô:ô:ô: ô:ô:þó:÷ó:ðó:éó:âó:Ûó:Ôó:Íó:Æó:¿ó:¸ó:±ó:ªó:£ó:œó:•ó:Žó:‡ó:€ó:yó:ró:kó:dó:]ó:Vó:Oó:Hó:Aó::ó:3ó:,ó:%ó:ó:ó:ó: ó:ó:ûò:ôò:íò:æò:ßò:Øò:Ñò:Êò:Ãò:¼ò:µò:®ò:§ò: ò:™ò:’ò:‹ò:„ò:}ò:vò:oò:hò:aò:Zò:Sò:Lò:Eò:>ò:7ò:0ò:)ò:"ò:ò:ò: ò:ò:ÿñ:øñ:ññ:êñ:ãñ:Üñ:Õñ:Îñ:Çñ:Àñ:¹ñ:²ñ:«ñ:¤ñ:ñ:–ñ:ñ:ˆñ:ñ:zñ:sñ:lñ:eñ:^ñ:Wñ:Pñ:Iñ:Bñ:;ñ:4ñ:-ñ:&ñ:ñ:ñ:ñ: ñ:ñ:üð:õð:îð:çð:àð:Ùð:Òð:Ëð:Äð:½ð:¶ð:¯ð:¨ð:¡ð:šð:“ð:Œð:…ð:~ð:wð:pð:ið:bð:[ð:Tð:Mð:Fð:?ð:8ð:1ð:*ð:#ð:ð:ð:ð:ð:ð:ùï:òï:ëï:äï:Ýï:Öï:Ïï:Èï:Áï:ºï:³ï:¬ï:¥ï:žï:—ï:ï:‰ï:‚ï:{ï:tï:mï:fï:_ï:Xï:Qï:Jï:Cï:<ï:5ï:.ï:'ï: ï:ï:ï: ï:ï:ýî:öî:ïî:èî:áî:Úî:Óî:Ìî:Åî:¾î:·î:°î:©î:¢î:›î:”î:î:†î:î:xî:qî:jî:cî:\î:Uî:Nî:Gî:@î:9î:2î:+î:$î:î:î:î:î:î:úí:óí:ìí:åí:Þí:×í:Ðí:Éí:Âí:»í:´í:­í:¦í:Ÿí:˜í:‘í:Ší:ƒí:|í:uí:ní:gí:`í:Yí:Rí:Kí:Dí:=í:6í:/í:(í:!í:í:í: í:í:þì:÷ì:ðì:éì:âì:Ûì:Ôì:Íì:Æì:¿ì:¸ì:±ì:ªì:£ì:œì:•ì:Žì:‡ì:€ì:yì:rì:kì:dì:]ì:Vì:Oì:Hì:Aì::ì:3ì:,ì:%ì:ì:ì:ì: ì:ì:ûë:ôë:íë:æë:ßë:Øë:Ñë:Êë:Ãë:¼ë:µë:®ë:§ë: ë:™ë:’ë:‹ë:„ë:}ë:vë:oë:hë:aë:Zë:Së:Lë:Eë:>ë:7ë:0ë:)ë:"ë:ë:ë: ë:ë:ÿê:øê:ñê:êê:ãê:Üê:Õê:Îê:Çê:Àê:¹ê:²ê:«ê:¤ê:ê:–ê:ê:ˆê:ê:zê:sê:lê:eê:^ê:Wê:Pê:Iê:Bê:;ê:4ê:-ê:&ê:ê:ê:ê: ê:ê:üé:õé:îé:çé:àé:Ùé:Òé:Ëé:Äé:½é:¶é:¯é:¨é:¡é:šé:“é:Œé:…é:~é:wé:pé:ié:bé:[é:Té:Mé:Fé:?é:8é:1é:*é:#é:é:é:é:é:é:ùè:òè:ëè:äè:Ýè:Öè:Ïè:Èè:Áè:ºè:³è:¬è:¥è:žè:—è:è:‰è:‚è:{è:tè:mè:fè:_è:Xè:Qè:Jè:Cè:<è:5è:.è:'è: è:è:è: è:è:ýç:öç:ïç:èç:áç:Úç:Óç:Ìç:Åç:¾ç:·ç:°ç:©ç:¢ç:›ç:”ç:ç:†ç:ç:xç:qç:jç:cç:\ç:Uç:Nç:Gç:@ç:9ç:2ç:+ç:$ç:ç:ç:ç:ç:ç:úæ:óæ:ìæ:åæ:Þæ:׿:Ðæ:Éæ:Âæ:»æ:´æ:­æ:¦æ:Ÿæ:˜æ:‘æ:Šæ:ƒæ:|æ:uæ:næ:gæ:`æ:Yæ:Ræ:Kæ:Dæ:=æ:6æ:/æ:(æ:!æ:æ:æ: æ:æ:þå:÷å:ðå:éå:âå:Ûå:Ôå:Íå:Æå:¿å:¸å:±å:ªå:£å:œå:•å:Žå:‡å:€å:yå:rå:kå:då:]å:Vå:Oå:Hå:Aå::å:3å:,å:%å:å:å:å: å:å:ûä:ôä:íä:æä:ßä:Øä:Ñä:Êä:Ãä:¼ä:µä:®ä:§ä: ä:™ä:’ä:‹ä:„ä:}ä:vä:oä:hä:aä:Zä:Sä:Lä:Eä:>ä:7ä:0ä:)ä:"ä:ä:ä: ä:ä:ÿã:øã:ñã:êã:ãã:Üã:Õã:Îã:Çã:Àã:¹ã:²ã:«ã:¤ã:ã:–ã:ã:ˆã:ã:zã:sã:lã:eã:^ã:Wã:Pã:Iã:Bã:;ã:4ã:-ã:&ã:ã:ã:ã: ã:ã:üâ:õâ:îâ:çâ:àâ:Ùâ:Òâ:Ëâ:Äâ:½â:¶â:¯â:¨â:¡â:šâ:“â:Œâ:…â:~â:wâ:pâ:iâ:bâ:[â:Tâ:Mâ:Fâ:?â:8â:1â:*â:#â:â:â:â:â:â:ùá:òá:ëá:äá:Ýá:Öá:Ïá:Èá:Áá:ºá:³á:¬á:¥á:žá:—á:á:‰á:‚á:{á:tá:má:fá:_á:Xá:Qá:Já:Cá:<á:5á:.á:'á: á:á:á: á:á:ýà:öà:ïà:èà:áà:Úà:Óà:Ìà:Åà:¾à:·à:°à:©à:¢à:›à:”à:à:†à:à:xà:qà:jà:cà:\à:Uà:Nà:Gà:@à:9à:2à:+à:$à:à:à:à:à:à:úß:óß:ìß:åß:Þß:×ß:Ðß:Éß:Âß:»ß:´ß:­ß:¦ß:Ÿß:˜ß:‘ß:Šß:ƒß:|ß:uß:nß:gß:`ß:Yß:Rß:Kß:Dß:=ß:6ß:/ß:(ß:!ß:ß:ß: ß:ß:þÞ:÷Þ:ðÞ:éÞ:âÞ:ÛÞ:ÔÞ:ÍÞ:ÆÞ:¿Þ:¸Þ:±Þ:ªÞ:£Þ:œÞ:•Þ:ŽÞ:‡Þ:€Þ:yÞ:rÞ:kÞ:dÞ:]Þ:VÞ:OÞ:HÞ:AÞ::Þ:3Þ:,Þ:%Þ:Þ:Þ:Þ: Þ:Þ:ûÝ:ôÝ:íÝ:æÝ:ßÝ:ØÝ:ÑÝ:ÊÝ:ÃÝ:¼Ý:µÝ:®Ý:§Ý: Ý:™Ý:’Ý:‹Ý:„Ý:}Ý:vÝ:oÝ:hÝ:aÝ:ZÝ:SÝ:LÝ:EÝ:>Ý:7Ý:0Ý:)Ý:"Ý:Ý:Ý: Ý:Ý:ÿÜ:øÜ:ñÜ:êÜ:ãÜ:ÜÜ:ÕÜ:ÎÜ:ÇÜ:ÀÜ:¹Ü:²Ü:«Ü:¤Ü:Ü:–Ü:Ü:ˆÜ:Ü:zÜ:sÜ:lÜ:eÜ:^Ü:WÜ:PÜ:IÜ:BÜ:;Ü:4Ü:-Ü:&Ü:Ü:Ü:Ü: Ü:Ü:üÛ:õÛ:îÛ:çÛ:àÛ:ÙÛ:ÒÛ:ËÛ:ÄÛ:½Û:¶Û:¯Û:¨Û:¡Û:šÛ:“Û:ŒÛ:…Û:~Û:wÛ:pÛ:iÛ:bÛ:[Û:TÛ:MÛ:FÛ:?Û:8Û:1Û:*Û:#Û:Û:Û:Û:Û:Û:ùÚ:òÚ:ëÚ:äÚ:ÝÚ:ÖÚ:ÏÚ:ÈÚ:ÁÚ:ºÚ:³Ú:¬Ú:¥Ú:žÚ:—Ú:Ú:‰Ú:‚Ú:{Ú:tÚ:mÚ:fÚ:_Ú:XÚ:QÚ:JÚ:CÚ:<Ú:5Ú:.Ú:'Ú: Ú:Ú:Ú: Ú:Ú:ýÙ:öÙ:ïÙ:èÙ:áÙ:ÚÙ:ÓÙ:ÌÙ:ÅÙ:¾Ù:·Ù:°Ù:©Ù:¢Ù:›Ù:”Ù:Ù:†Ù:Ù:xÙ:qÙ:jÙ:cÙ:\Ù:UÙ:NÙ:GÙ:@Ù:9Ù:2Ù:+Ù:$Ù:Ù:Ù:Ù:Ù:Ù:úØ:óØ:ìØ:åØ:ÞØ:ר:ÐØ:ÉØ:ÂØ:»Ø:´Ø:­Ø:¦Ø:ŸØ:˜Ø:‘Ø:ŠØ:ƒØ:|Ø:uØ:nØ:gØ:`Ø:YØ:RØ:KØ:DØ:=Ø:6Ø:/Ø:(Ø:!Ø:Ø:Ø: Ø:Ø:þ×:÷×:ð×:é×:â×:Û×:Ô×:Í×:Æ×:¿×:¸×:±×:ª×:£×:œ×:•×:Ž×:‡×:€×:y×:r×:k×:d×:]×:V×:O×:H×:A×::×:3×:,×:%×:×:×:×: ×:×:ûÖ:ôÖ:íÖ:æÖ:ßÖ:ØÖ:ÑÖ:ÊÖ:ÃÖ:¼Ö:µÖ:®Ö:§Ö: Ö:™Ö:’Ö:‹Ö:„Ö:}Ö:vÖ:oÖ:hÖ:aÖ:ZÖ:SÖ:LÖ:EÖ:>Ö:7Ö:0Ö:)Ö:"Ö:Ö:Ö: Ö:Ö:ÿÕ:øÕ:ñÕ:êÕ:ãÕ:ÜÕ:ÕÕ:ÎÕ:ÇÕ:ÀÕ:¹Õ:²Õ:«Õ:¤Õ:Õ:–Õ:Õ:ˆÕ:Õ:zÕ:sÕ:lÕ:eÕ:^Õ:WÕ:PÕ:IÕ:BÕ:;Õ:4Õ:-Õ:&Õ:Õ:Õ:Õ: Õ:Õ:üÔ:õÔ:îÔ:çÔ:àÔ:ÙÔ:ÒÔ:ËÔ:ÄÔ:½Ô:¶Ô:¯Ô:¨Ô:¡Ô:šÔ:“Ô:ŒÔ:…Ô:~Ô:wÔ:pÔ:iÔ:bÔ:[Ô:TÔ:MÔ:FÔ:?Ô:8Ô:1Ô:*Ô:#Ô:Ô:Ô:Ô:Ô:Ô:ùÓ:òÓ:ëÓ:äÓ:ÝÓ:ÖÓ:ÏÓ:ÈÓ:ÁÓ:ºÓ:³Ó:¬Ó:¥Ó:žÓ:—Ó:Ó:‰Ó:‚Ó:{Ó:tÓ:mÓ:fÓ:_Ó:XÓ:QÓ:JÓ:CÓ:<Ó:5Ó:.Ó:'Ó: Ó:Ó:Ó: Ó:Ó:ýÒ:öÒ:ïÒ:èÒ:áÒ:ÚÒ:ÓÒ:ÌÒ:ÅÒ:¾Ò:·Ò:°Ò:©Ò:¢Ò:›Ò:”Ò:Ò:†Ò:Ò:xÒ:qÒ:jÒ:cÒ:\Ò:UÒ:NÒ:GÒ:@Ò:9Ò:2Ò:+Ò:$Ò:Ò:Ò:Ò:Ò:Ò:úÑ:óÑ:ìÑ:åÑ:ÞÑ:×Ñ:ÐÑ:ÉÑ:ÂÑ:»Ñ:´Ñ:­Ñ:¦Ñ:ŸÑ:˜Ñ:‘Ñ:ŠÑ:ƒÑ:|Ñ:uÑ:nÑ:gÑ:`Ñ:YÑ:RÑ:KÑ:DÑ:=Ñ:6Ñ:/Ñ:(Ñ:!Ñ:Ñ:Ñ: Ñ:Ñ:þÐ:÷Ð:ðÐ:éÐ:âÐ:ÛÐ:ÔÐ:ÍÐ:ÆÐ:¿Ð:¸Ð:±Ð:ªÐ:£Ð:œÐ:•Ð:ŽÐ:‡Ð:€Ð:yÐ:rÐ:kÐ:dÐ:]Ð:VÐ:OÐ:HÐ:AÐ::Ð:3Ð:,Ð:%Ð:Ð:Ð:Ð: Ð:Ð:ûÏ:ôÏ:íÏ:æÏ:ßÏ:ØÏ:ÑÏ:ÊÏ:ÃÏ:¼Ï:µÏ:®Ï:§Ï: Ï:™Ï:’Ï:‹Ï:„Ï:}Ï:vÏ:oÏ:hÏ:aÏ:ZÏ:SÏ:LÏ:EÏ:>Ï:7Ï:0Ï:)Ï:"Ï:Ï:Ï: Ï:Ï:ÿÎ:øÎ:ñÎ:êÎ:ãÎ:ÜÎ:ÕÎ:ÎÎ:ÇÎ:ÀÎ:¹Î:²Î:«Î:¤Î:Î:–Î:Î:ˆÎ:Î:zÎ:sÎ:lÎ:eÎ:^Î:WÎ:PÎ:IÎ:BÎ:;Î:4Î:-Î:&Î:Î:Î:Î: Î:Î:üÍ:õÍ:îÍ:çÍ:àÍ:ÙÍ:ÒÍ:ËÍ:ÄÍ:½Í:¶Í:¯Í:¨Í:¡Í:šÍ:“Í:ŒÍ:…Í:~Í:wÍ:pÍ:iÍ:bÍ:[Í:TÍ:MÍ:FÍ:?Í:8Í:1Í:*Í:#Í:Í:Í:Í:Í:Í:ùÌ:òÌ:ëÌ:äÌ:ÝÌ:ÖÌ:ÏÌ:ÈÌ:ÁÌ:ºÌ:³Ì:¬Ì:¥Ì:žÌ:—Ì:Ì:‰Ì:‚Ì:{Ì:tÌ:mÌ:fÌ:_Ì:XÌ:QÌ:JÌ:CÌ:<Ì:5Ì:.Ì:'Ì: Ì:Ì:Ì: Ì:Ì:ýË:öË:ïË:èË:áË:ÚË:ÓË:ÌË:ÅË:¾Ë:·Ë:°Ë:©Ë:¢Ë:›Ë:”Ë:Ë:†Ë:Ë:xË:qË:jË:cË:\Ë:UË:NË:GË:@Ë:9Ë:2Ë:+Ë:$Ë:Ë:Ë:Ë:Ë:Ë:úÊ:óÊ:ìÊ:åÊ:ÞÊ:×Ê:ÐÊ:ÉÊ:ÂÊ:»Ê:´Ê:­Ê:¦Ê:ŸÊ:˜Ê:‘Ê:ŠÊ:ƒÊ:|Ê:uÊ:nÊ:gÊ:`Ê:YÊ:RÊ:KÊ:DÊ:=Ê:6Ê:/Ê:(Ê:!Ê:Ê:Ê: Ê:Ê:þÉ:÷É:ðÉ:éÉ:âÉ:ÛÉ:ÔÉ:ÍÉ:ÆÉ:¿É:¸É:±É:ªÉ:£É:œÉ:•É:ŽÉ:‡É:€É:yÉ:rÉ:kÉ:dÉ:]É:VÉ:OÉ:HÉ:AÉ::É:3É:,É:%É:É:É:É: É:É:ûÈ:ôÈ:íÈ:æÈ:ßÈ:ØÈ:ÑÈ:ÊÈ:ÃÈ:¼È:µÈ:®È:§È: È:™È:’È:‹È:„È:}È:vÈ:oÈ:hÈ:aÈ:ZÈ:SÈ:LÈ:EÈ:>È:7È:0È:)È:"È:È:È: È:È:ÿÇ:øÇ:ñÇ:êÇ:ãÇ:ÜÇ:ÕÇ:ÎÇ:ÇÇ:ÀÇ:¹Ç:²Ç:«Ç:¤Ç:Ç:–Ç:Ç:ˆÇ:Ç:zÇ:sÇ:lÇ:eÇ:^Ç:WÇ:PÇ:IÇ:BÇ:;Ç:4Ç:-Ç:&Ç:Ç:Ç:Ç: Ç:Ç:üÆ:õÆ:îÆ:çÆ:àÆ:ÙÆ:ÒÆ:ËÆ:ÄÆ:½Æ:¶Æ:¯Æ:¨Æ:¡Æ:šÆ:“Æ:ŒÆ:…Æ:~Æ:wÆ:pÆ:iÆ:bÆ:[Æ:TÆ:MÆ:FÆ:?Æ:8Æ:1Æ:*Æ:#Æ:Æ:Æ:Æ:Æ:Æ:ùÅ:òÅ:ëÅ:äÅ:ÝÅ:ÖÅ:ÏÅ:ÈÅ:ÁÅ:ºÅ:³Å:¬Å:¥Å:žÅ:—Å:Å:‰Å:‚Å:{Å:tÅ:mÅ:fÅ:_Å:XÅ:QÅ:JÅ:CÅ:<Å:5Å:.Å:'Å: Å:Å:Å: Å:Å:ýÄ:öÄ:ïÄ:èÄ:áÄ:ÚÄ:ÓÄ:ÌÄ:ÅÄ:¾Ä:·Ä:°Ä:©Ä:¢Ä:›Ä:”Ä:Ä:†Ä:Ä:xÄ:qÄ:jÄ:cÄ:\Ä:UÄ:NÄ:GÄ:@Ä:9Ä:2Ä:+Ä:$Ä:Ä:Ä:Ä:Ä:Ä:úÃ:óÃ:ìÃ:åÃ:ÞÃ:×Ã:ÐÃ:ÉÃ:ÂÃ:»Ã:´Ã:­Ã:¦Ã:ŸÃ:˜Ã:‘Ã:ŠÃ:ƒÃ:|Ã:uÃ:nÃ:gÃ:`Ã:YÃ:RÃ:KÃ:DÃ:=Ã:6Ã:/Ã:(Ã:!Ã:Ã:Ã: Ã:Ã:þÂ:÷Â:ðÂ:éÂ:âÂ:ÛÂ:ÔÂ:ÍÂ:ÆÂ:¿Â:¸Â:±Â:ªÂ:£Â:œÂ:•Â:ŽÂ:‡Â:€Â:yÂ:rÂ:kÂ:dÂ:]Â:VÂ:OÂ:HÂ:AÂ::Â:3Â:,Â:%Â:Â:Â:Â: Â:Â:ûÁ:ôÁ:íÁ:æÁ:ßÁ:ØÁ:ÑÁ:ÊÁ:ÃÁ:¼Á:µÁ:®Á:§Á: Á:™Á:’Á:‹Á:„Á:}Á:vÁ:oÁ:hÁ:aÁ:ZÁ:SÁ:LÁ:EÁ:>Á:7Á:0Á:)Á:"Á:Á:Á: Á:Á:ÿÀ:øÀ:ñÀ:êÀ:ãÀ:ÜÀ:ÕÀ:ÎÀ:ÇÀ:ÀÀ:¹À:²À:«À:¤À:À:–À:À:ˆÀ:À:zÀ:sÀ:lÀ:eÀ:^À:WÀ:PÀ:IÀ:BÀ:;À:4À:-À:&À:À:À:À: À:À:ü¿:õ¿:î¿:ç¿:à¿:Ù¿:Ò¿:Ë¿:Ä¿:½¿:¶¿:¯¿:¨¿:¡¿:š¿:“¿:Œ¿:…¿:~¿:w¿:p¿:i¿:b¿:[¿:T¿:M¿:F¿:?¿:8¿:1¿:*¿:#¿:¿:¿:¿:¿:¿:ù¾:ò¾:ë¾:ä¾:ݾ:Ö¾:Ͼ:Ⱦ:Á¾:º¾:³¾:¬¾:¥¾:ž¾:—¾:¾:‰¾:‚¾:{¾:t¾:m¾:f¾:_¾:X¾:Q¾:J¾:C¾:<¾:5¾:.¾:'¾: ¾:¾:¾: ¾:¾:ý½:ö½:ï½:è½:á½:Ú½:Ó½:̽:Ž:¾½:·½:°½:©½:¢½:›½:”½:½:†½:½:x½:q½:j½:c½:\½:U½:N½:G½:@½:9½:2½:+½:$½:½:½:½:½:½:ú¼:ó¼:ì¼:å¼:Þ¼:×¼:м:ɼ:¼:»¼:´¼:­¼:¦¼:Ÿ¼:˜¼:‘¼:м:ƒ¼:|¼:u¼:n¼:g¼:`¼:Y¼:R¼:K¼:D¼:=¼:6¼:/¼:(¼:!¼:¼:¼: ¼:¼:þ»:÷»:ð»:é»:â»:Û»:Ô»:Í»:Æ»:¿»:¸»:±»:ª»:£»:œ»:•»:Ž»:‡»:€»:y»:r»:k»:d»:]»:V»:O»:H»:A»::»:3»:,»:%»:»:»:»: »:»:ûº:ôº:íº:æº:ߺ:غ:Ѻ:ʺ:ú:¼º:µº:®º:§º: º:™º:’º:‹º:„º:}º:vº:oº:hº:aº:Zº:Sº:Lº:Eº:>º:7º:0º:)º:"º:º:º: º:º:ÿ¹:ø¹:ñ¹:ê¹:ã¹:ܹ:Õ¹:ι:ǹ:À¹:¹¹:²¹:«¹:¤¹:¹:–¹:¹:ˆ¹:¹:z¹:s¹:l¹:e¹:^¹:W¹:P¹:I¹:B¹:;¹:4¹:-¹:&¹:¹:¹:¹: ¹:¹:ü¸:õ¸:î¸:ç¸:à¸:Ù¸:Ò¸:˸:ĸ:½¸:¶¸:¯¸:¨¸:¡¸:š¸:“¸:Œ¸:…¸:~¸:w¸:p¸:i¸:b¸:[¸:T¸:M¸:F¸:?¸:8¸:1¸:*¸:#¸:¸:¸:¸:¸:¸:ù·:ò·:ë·:ä·:Ý·:Ö·:Ï·:È·:Á·:º·:³·:¬·:¥·:ž·:—·:·:‰·:‚·:{·:t·:m·:f·:_·:X·:Q·:J·:C·:<·:5·:.·:'·: ·:·:·: ·:·:ý¶:ö¶:ï¶:è¶:á¶:Ú¶:Ó¶:̶:Ŷ:¾¶:·¶:°¶:©¶:¢¶:›¶:”¶:¶:†¶:¶:x¶:q¶:j¶:c¶:\¶:U¶:N¶:G¶:@¶:9¶:2¶:+¶:$¶:¶:¶:¶:¶:¶:úµ:óµ:ìµ:åµ:Þµ:×µ:е:ɵ:µ:»µ:´µ:­µ:¦µ:Ÿµ:˜µ:‘µ:е:ƒµ:|µ:uµ:nµ:gµ:`µ:Yµ:Rµ:Kµ:Dµ:=µ:6µ:/µ:(µ:!µ:µ:µ: µ:µ:þ´:÷´:ð´:é´:â´:Û´:Ô´:Í´:Æ´:¿´:¸´:±´:ª´:£´:œ´:•´:Ž´:‡´:€´:y´:r´:k´:d´:]´:V´:O´:H´:A´::´:3´:,´:%´:´:´:´: ´:´:û³:ô³:í³:æ³:ß³:س:ѳ:ʳ:ó:¼³:µ³:®³:§³: ³:™³:’³:‹³:„³:}³:v³:o³:h³:a³:Z³:S³:L³:E³:>³:7³:0³:)³:"³:³:³: ³:³:ÿ²:ø²:ñ²:ê²:ã²:ܲ:Õ²:β:Dz:À²:¹²:²²:«²:¤²:²:–²:²:ˆ²:²:z²:s²:l²:e²:^²:W²:P²:I²:B²:;²:4²:-²:&²:²:²:²: ²:²:ü±:õ±:î±:ç±:à±:Ù±:Ò±:˱:ı:½±:¶±:¯±:¨±:¡±:š±:“±:Œ±:…±:~±:w±:p±:i±:b±:[±:T±:M±:F±:?±:8±:1±:*±:#±:±:±:±:±:±:ù°:ò°:ë°:ä°:ݰ:Ö°:ϰ:Ȱ:Á°:º°:³°:¬°:¥°:ž°:—°:°:‰°:‚°:{°:t°:m°:f°:_°:X°:Q°:J°:C°:<°:5°:.°:'°: °:°:°: °:°:ý¯:ö¯:ï¯:è¯:á¯:Ú¯:Ó¯:̯:ů:¾¯:·¯:°¯:©¯:¢¯:›¯:”¯:¯:†¯:¯:x¯:q¯:j¯:c¯:\¯:U¯:N¯:G¯:@¯:9¯:2¯:+¯:$¯:¯:¯:¯:¯:¯:ú®:ó®:ì®:å®:Þ®:×®:Ю:É®:®:»®:´®:­®:¦®:Ÿ®:˜®:‘®:Š®:ƒ®:|®:u®:n®:g®:`®:Y®:R®:K®:D®:=®:6®:/®:(®:!®:®:®: ®:®:þ­:÷­:ð­:é­:â­:Û­:Ô­:Í­:Æ­:¿­:¸­:±­:ª­:£­:œ­:•­:Ž­:‡­:€­:y­:r­:k­:d­:]­:V­:O­:H­:A­::­:3­:,­:%­:­:­:­: ­:­:û¬:ô¬:í¬:æ¬:߬:ج:Ѭ:ʬ:ì:¼¬:µ¬:®¬:§¬: ¬:™¬:’¬:‹¬:„¬:}¬:v¬:o¬:h¬:a¬:Z¬:S¬:L¬:E¬:>¬:7¬:0¬:)¬:"¬:¬:¬: ¬:¬:ÿ«:ø«:ñ«:ê«:ã«:Ü«:Õ«:Ϋ:Ç«:À«:¹«:²«:««:¤«:«:–«:«:ˆ«:«:z«:s«:l«:e«:^«:W«:P«:I«:B«:;«:4«:-«:&«:«:«:«: «:«:üª:õª:îª:çª:àª:Ùª:Òª:˪:Ī:½ª:¶ª:¯ª:¨ª:¡ª:šª:“ª:Œª:…ª:~ª:wª:pª:iª:bª:[ª:Tª:Mª:Fª:?ª:8ª:1ª:*ª:#ª:ª:ª:ª:ª:ª:ù©:ò©:ë©:ä©:Ý©:Ö©:Ï©:È©:Á©:º©:³©:¬©:¥©:ž©:—©:©:‰©:‚©:{©:t©:m©:f©:_©:X©:Q©:J©:C©:<©:5©:.©:'©: ©:©:©: ©:©:ý¨:ö¨:ï¨:è¨:á¨:Ú¨:Ó¨:̨:Ũ:¾¨:·¨:°¨:©¨:¢¨:›¨:”¨:¨:†¨:¨:x¨:q¨:j¨:c¨:\¨:U¨:N¨:G¨:@¨:9¨:2¨:+¨:$¨:¨:¨:¨:¨:¨:ú§:ó§:ì§:å§:Þ§:×§:Ч:ɧ:§:»§:´§:­§:¦§:Ÿ§:˜§:‘§:Ч:ƒ§:|§:u§:n§:g§:`§:Y§:R§:K§:D§:=§:6§:/§:(§:!§:§:§: §:§:þ¦:÷¦:ð¦:é¦:â¦:Û¦:Ô¦:ͦ:Ʀ:¿¦:¸¦:±¦:ª¦:£¦:œ¦:•¦:ަ:‡¦:€¦:y¦:r¦:k¦:d¦:]¦:V¦:O¦:H¦:A¦::¦:3¦:,¦:%¦:¦:¦:¦: ¦:¦:û¥:ô¥:í¥:æ¥:ߥ:Ø¥:Ñ¥:Ê¥:Ã¥:¼¥:µ¥:®¥:§¥: ¥:™¥:’¥:‹¥:„¥:}¥:v¥:o¥:h¥:a¥:Z¥:S¥:L¥:E¥:>¥:7¥:0¥:)¥:"¥:¥:¥: ¥:¥:ÿ¤:ø¤:ñ¤:ê¤:ã¤:ܤ:Õ¤:Τ:Ǥ:À¤:¹¤:²¤:«¤:¤¤:¤:–¤:¤:ˆ¤:¤:z¤:s¤:l¤:e¤:^¤:W¤:P¤:I¤:B¤:;¤:4¤:-¤:&¤:¤:¤:¤: ¤:¤:ü£:õ£:î£:ç£:à£:Ù£:Ò£:Ë£:Ä£:½£:¶£:¯£:¨£:¡£:š£:“£:Œ£:…£:~£:w£:p£:i£:b£:[£:T£:M£:F£:?£:8£:1£:*£:#£:£:£:£:£:£:ù¢:ò¢:ë¢:ä¢:Ý¢:Ö¢:Ï¢:È¢:Á¢:º¢:³¢:¬¢:¥¢:ž¢:—¢:¢:‰¢:‚¢:{¢:t¢:m¢:f¢:_¢:X¢:Q¢:J¢:C¢:<¢:5¢:.¢:'¢: ¢:¢:¢: ¢:¢:ý¡:ö¡:ï¡:è¡:á¡:Ú¡:Ó¡:Ì¡:Å¡:¾¡:·¡:°¡:©¡:¢¡:›¡:”¡:¡:†¡:¡:x¡:q¡:j¡:c¡:\¡:U¡:N¡:G¡:@¡:9¡:2¡:+¡:$¡:¡:¡:¡:¡:¡:ú :ó :ì :å :Þ :× :Р:É : :» :´ :­ :¦ :Ÿ :˜ :‘ :Š :ƒ :| :u :n :g :` :Y :R :K :D := :6 :/ :( :! : : :  : :þŸ:÷Ÿ:ðŸ:éŸ:âŸ:ÛŸ:ÔŸ:ÍŸ:ÆŸ:¿Ÿ:¸Ÿ:±Ÿ:ªŸ:£Ÿ:œŸ:•Ÿ:ŽŸ:‡Ÿ:€Ÿ:yŸ:rŸ:kŸ:dŸ:]Ÿ:VŸ:OŸ:HŸ:AŸ::Ÿ:3Ÿ:,Ÿ:%Ÿ:Ÿ:Ÿ:Ÿ: Ÿ:Ÿ:ûž:ôž:íž:æž:ßž:Øž:Ñž:Êž:Þ:¼ž:µž:®ž:§ž: ž:™ž:’ž:‹ž:„ž:}ž:vž:ož:hž:až:Zž:Sž:Lž:Ež:>ž:7ž:0ž:)ž:"ž:ž:ž: ž:ž:ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::üœ:õœ:îœ:çœ:àœ:Ùœ:Òœ:Ëœ:Äœ:½œ:¶œ:¯œ:¨œ:¡œ:šœ:“œ:Œœ:…œ:~œ:wœ:pœ:iœ:bœ:[œ:Tœ:Mœ:Fœ:?œ:8œ:1œ:*œ:#œ:œ:œ:œ:œ:œ:ù›:ò›:ë›:ä›:Ý›:Ö›:Ï›:È›:Á›:º›:³›:¬›:¥›:ž›:—›:›:‰›:‚›:{›:t›:m›:f›:_›:X›:Q›:J›:C›:<›:5›:.›:'›: ›:›:›: ›:›:ýš:öš:ïš:èš:áš:Úš:Óš:Ìš:Åš:¾š:·š:°š:©š:¢š:›š:”š:š:†š:š:xš:qš:jš:cš:\š:Uš:Nš:Gš:@š:9š:2š:+š:$š:š:š:š:š:š:ú™:ó™:ì™:å™:Þ™:×™:Й:É™:™:»™:´™:­™:¦™:Ÿ™:˜™:‘™:Š™:ƒ™:|™:u™:n™:g™:`™:Y™:R™:K™:D™:=™:6™:/™:(™:!™:™:™: ™:™:þ˜:÷˜:ð˜:é˜:â˜:Û˜:Ô˜:͘:Ƙ:¿˜:¸˜:±˜:ª˜:£˜:œ˜:•˜:Ž˜:‡˜:€˜:y˜:r˜:k˜:d˜:]˜:V˜:O˜:H˜:A˜::˜:3˜:,˜:%˜:˜:˜:˜: ˜:˜:û—:ô—:í—:æ—:ß—:Ø—:Ñ—:Ê—:×:¼—:µ—:®—:§—: —:™—:’—:‹—:„—:}—:v—:o—:h—:a—:Z—:S—:L—:E—:>—:7—:0—:)—:"—:—:—: —:—:ÿ–:ø–:ñ–:ê–:ã–:Ü–:Õ–:Ζ:Ç–:À–:¹–:²–:«–:¤–:–:––:–:ˆ–:–:z–:s–:l–:e–:^–:W–:P–:I–:B–:;–:4–:-–:&–:–:–:–: –:–:ü•:õ•:î•:ç•:à•:Ù•:Ò•:Ë•:Ä•:½•:¶•:¯•:¨•:¡•:š•:“•:Œ•:…•:~•:w•:p•:i•:b•:[•:T•:M•:F•:?•:8•:1•:*•:#•:•:•:•:•:•:ù”:ò”:ë”:ä”:Ý”:Ö”:Ï”:È”:Á”:º”:³”:¬”:¥”:ž”:—”:”:‰”:‚”:{”:t”:m”:f”:_”:X”:Q”:J”:C”:<”:5”:.”:'”: ”:”:”: ”:”:ý“:ö“:ï“:è“:á“:Ú“:Ó“:Ì“:Å“:¾“:·“:°“:©“:¢“:›“:”“:“:†“:“:x“:q“:j“:c“:\“:U“:N“:G“:@“:9“:2“:+“:$“:“:“:“:“:“:ú’:ó’:ì’:å’:Þ’:×’:Ð’:É’:Â’:»’:´’:­’:¦’:Ÿ’:˜’:‘’:Š’:ƒ’:|’:u’:n’:g’:`’:Y’:R’:K’:D’:=’:6’:/’:(’:!’:’:’: ’:’:þ‘:÷‘:ð‘:é‘:â‘:Û‘:Ô‘:Í‘:Æ‘:¿‘:¸‘:±‘:ª‘:£‘:œ‘:•‘:Ž‘:‡‘:€‘:y‘:r‘:k‘:d‘:]‘:V‘:O‘:H‘:A‘::‘:3‘:,‘:%‘:‘:‘:‘: ‘:‘:û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::üŽ:õŽ:îŽ:çŽ:àŽ:ÙŽ:ÒŽ:ËŽ:ÄŽ:½Ž:¶Ž:¯Ž:¨Ž:¡Ž:šŽ:“Ž:ŒŽ:…Ž:~Ž:wŽ:pŽ:iŽ:bŽ:[Ž:TŽ:MŽ:FŽ:?Ž:8Ž:1Ž:*Ž:#Ž:Ž:Ž:Ž:Ž:Ž:ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ýŒ:öŒ:ïŒ:èŒ:áŒ:ÚŒ:ÓŒ:ÌŒ:ÅŒ:¾Œ:·Œ:°Œ:©Œ:¢Œ:›Œ:”Œ:Œ:†Œ:Œ:xŒ:qŒ:jŒ:cŒ:\Œ:UŒ:NŒ:GŒ:@Œ:9Œ:2Œ:+Œ:$Œ:Œ:Œ:Œ:Œ:Œ:ú‹:ó‹:ì‹:å‹:Þ‹:׋:Ћ:É‹:‹:»‹:´‹:­‹:¦‹:Ÿ‹:˜‹:‘‹:Š‹:ƒ‹:|‹:u‹:n‹:g‹:`‹:Y‹:R‹:K‹:D‹:=‹:6‹:/‹:(‹:!‹:‹:‹: ‹:‹:þŠ:÷Š:ðŠ:éŠ:âŠ:ÛŠ:ÔŠ:ÍŠ:ÆŠ:¿Š:¸Š:±Š:ªŠ:£Š:œŠ:•Š:ŽŠ:‡Š:€Š:yŠ:rŠ:kŠ:dŠ:]Š:VŠ:OŠ:HŠ:AŠ::Š:3Š:,Š:%Š:Š:Š:Š: Š:Š:û‰:ô‰:í‰:æ‰:߉:؉:щ:ʉ:É:¼‰:µ‰:®‰:§‰: ‰:™‰:’‰:‹‰:„‰:}‰:v‰:o‰:h‰:a‰:Z‰:S‰:L‰:E‰:>‰:7‰:0‰:)‰:"‰:‰:‰: ‰:‰:ÿˆ:øˆ:ñˆ:êˆ:ãˆ:܈:Õˆ:Έ:Lj:Àˆ:¹ˆ:²ˆ:«ˆ:¤ˆ:ˆ:–ˆ:ˆ:ˆˆ:ˆ:zˆ:sˆ:lˆ:eˆ:^ˆ:Wˆ:Pˆ:Iˆ:Bˆ:;ˆ:4ˆ:-ˆ:&ˆ:ˆ:ˆ:ˆ: ˆ:ˆ:ü‡:õ‡:î‡:ç‡:à‡:Ù‡:Ò‡:ˇ:ć:½‡:¶‡:¯‡:¨‡:¡‡:š‡:“‡:Œ‡:…‡:~‡:w‡:p‡:i‡:b‡:[‡:T‡:M‡:F‡:?‡:8‡:1‡:*‡:#‡:‡:‡:‡:‡:‡:ù†:ò†:ë†:ä†:݆:Ö†:φ:Ȇ:Á†:º†:³†:¬†:¥†:ž†:—†:†:‰†:‚†:{†:t†:m†:f†:_†:X†:Q†:J†:C†:<†:5†:.†:'†: †:†:†: †:†:ý…:ö…:ï…:è…:á…:Ú…:Ó…:Ì…:Å…:¾…:·…:°…:©…:¢…:›…:”…:…:†…:…:x…:q…:j…:c…:\…:U…:N…:G…:@…:9…:2…:+…:$…:…:…:…:…:…:ú„:ó„:ì„:å„:Þ„:ׄ:Є:É„:„:»„:´„:­„:¦„:Ÿ„:˜„:‘„:Š„:ƒ„:|„:u„:n„:g„:`„:Y„:R„:K„:D„:=„:6„:/„:(„:!„:„:„: „:„:þƒ:÷ƒ:ðƒ:éƒ:âƒ:Ûƒ:Ôƒ:̓:ƃ:¿ƒ:¸ƒ:±ƒ:ªƒ:£ƒ:œƒ:•ƒ:Žƒ:‡ƒ:€ƒ:yƒ:rƒ:kƒ:dƒ:]ƒ:Vƒ:Oƒ:Hƒ:Aƒ::ƒ:3ƒ:,ƒ:%ƒ:ƒ:ƒ:ƒ: ƒ:ƒ:û‚:ô‚:í‚:æ‚:ß‚:Ø‚:Ñ‚:Ê‚:Â:¼‚:µ‚:®‚:§‚: ‚:™‚:’‚:‹‚:„‚:}‚:v‚:o‚:h‚:a‚:Z‚:S‚:L‚:E‚:>‚:7‚:0‚:)‚:"‚:‚:‚: ‚:‚:ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü€:õ€:î€:ç€:à€:Ù€:Ò€:Ë€:Ä€:½€:¶€:¯€:¨€:¡€:š€:“€:Œ€:…€:~€:w€:p€:i€:b€:[€:T€:M€:F€:?€:8€:1€:*€:#€:€:€:€:€:€:ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý~:ö~:ï~:è~:á~:Ú~:Ó~:Ì~:Å~:¾~:·~:°~:©~:¢~:›~:”~:~:†~:~:x~:q~:j~:c~:\~:U~:N~:G~:@~:9~:2~:+~:$~:~:~:~:~:~:ú}:ó}:ì}:å}:Þ}:×}:Ð}:É}:Â}:»}:´}:­}:¦}:Ÿ}:˜}:‘}:Š}:ƒ}:|}:u}:n}:g}:`}:Y}:R}:K}:D}:=}:6}:/}:(}:!}:}:}: }:}:þ|:÷|:ð|:é|:â|:Û|:Ô|:Í|:Æ|:¿|:¸|:±|:ª|:£|:œ|:•|:Ž|:‡|:€|:y|:r|:k|:d|:]|:V|:O|:H|:A|::|:3|:,|:%|:|:|:|: |:|:û{:ô{:í{:æ{:ß{:Ø{:Ñ{:Ê{:Ã{:¼{:µ{:®{:§{: {:™{:’{:‹{:„{:}{:v{:o{:h{:a{:Z{:S{:L{:E{:>{:7{:0{:){:"{:{:{: {:{:ÿz:øz:ñz:êz:ãz:Üz:Õz:Îz:Çz:Àz:¹z:²z:«z:¤z:z:–z:z:ˆz:z:zz:sz:lz:ez:^z:Wz:Pz:Iz:Bz:;z:4z:-z:&z:z:z:z: z:z:üy:õy:îy:çy:ày:Ùy:Òy:Ëy:Äy:½y:¶y:¯y:¨y:¡y:šy:“y:Œy:…y:~y:wy:py:iy:by:[y:Ty:My:Fy:?y:8y:1y:*y:#y:y:y:y:y:y:ùx:òx:ëx:äx:Ýx:Öx:Ïx:Èx:Áx:ºx:³x:¬x:¥x:žx:—x:x:‰x:‚x:{x:tx:mx:fx:_x:Xx:Qx:Jx:Cx:t:7t:0t:)t:"t:t:t: t:t:ÿs:øs:ñs:ês:ãs:Üs:Õs:Îs:Çs:Às:¹s:²s:«s:¤s:s:–s:s:ˆs:s:zs:ss:ls:es:^s:Ws:Ps:Is:Bs:;s:4s:-s:&s:s:s:s: s:s:ür:õr:îr:çr:àr:Ùr:Òr:Ër:Är:½r:¶r:¯r:¨r:¡r:šr:“r:Œr:…r:~r:wr:pr:ir:br:[r:Tr:Mr:Fr:?r:8r:1r:*r:#r:r:r:r:r:r:ùq:òq:ëq:äq:Ýq:Öq:Ïq:Èq:Áq:ºq:³q:¬q:¥q:žq:—q:q:‰q:‚q:{q:tq:mq:fq:_q:Xq:Qq:Jq:Cq:m:7m:0m:)m:"m:m:m: m:m:ÿl:øl:ñl:êl:ãl:Ül:Õl:Îl:Çl:Àl:¹l:²l:«l:¤l:l:–l:l:ˆl:l:zl:sl:ll:el:^l:Wl:Pl:Il:Bl:;l:4l:-l:&l:l:l:l: l:l:ük:õk:îk:çk:àk:Ùk:Òk:Ëk:Äk:½k:¶k:¯k:¨k:¡k:šk:“k:Œk:…k:~k:wk:pk:ik:bk:[k:Tk:Mk:Fk:?k:8k:1k:*k:#k:k:k:k:k:k:ùj:òj:ëj:äj:Ýj:Öj:Ïj:Èj:Áj:ºj:³j:¬j:¥j:žj:—j:j:‰j:‚j:{j:tj:mj:fj:_j:Xj:Qj:Jj:Cj:f:7f:0f:)f:"f:f:f: f:f:ÿe:øe:ñe:êe:ãe:Üe:Õe:Îe:Çe:Àe:¹e:²e:«e:¤e:e:–e:e:ˆe:e:ze:se:le:ee:^e:We:Pe:Ie:Be:;e:4e:-e:&e:e:e:e: e:e:üd:õd:îd:çd:àd:Ùd:Òd:Ëd:Äd:½d:¶d:¯d:¨d:¡d:šd:“d:Œd:…d:~d:wd:pd:id:bd:[d:Td:Md:Fd:?d:8d:1d:*d:#d:d:d:d:d:d:ùc:òc:ëc:äc:Ýc:Öc:Ïc:Èc:Ác:ºc:³c:¬c:¥c:žc:—c:c:‰c:‚c:{c:tc:mc:fc:_c:Xc:Qc:Jc:Cc:_:7_:0_:)_:"_:_:_: _:_:ÿ^:ø^:ñ^:ê^:ã^:Ü^:Õ^:Î^:Ç^:À^:¹^:²^:«^:¤^:^:–^:^:ˆ^:^:z^:s^:l^:e^:^^:W^:P^:I^:B^:;^:4^:-^:&^:^:^:^: ^:^:ü]:õ]:î]:ç]:à]:Ù]:Ò]:Ë]:Ä]:½]:¶]:¯]:¨]:¡]:š]:“]:Œ]:…]:~]:w]:p]:i]:b]:[]:T]:M]:F]:?]:8]:1]:*]:#]:]:]:]:]:]:ù\:ò\:ë\:ä\:Ý\:Ö\:Ï\:È\:Á\:º\:³\:¬\:¥\:ž\:—\:\:‰\:‚\:{\:t\:m\:f\:_\:X\:Q\:J\:C\:<\:5\:.\:'\: \:\:\: \:\:ý[:ö[:ï[:è[:á[:Ú[:Ó[:Ì[:Å[:¾[:·[:°[:©[:¢[:›[:”[:[:†[:[:x[:q[:j[:c[:\[:U[:N[:G[:@[:9[:2[:+[:$[:[:[:[:[:[:úZ:óZ:ìZ:åZ:ÞZ:×Z:ÐZ:ÉZ:ÂZ:»Z:´Z:­Z:¦Z:ŸZ:˜Z:‘Z:ŠZ:ƒZ:|Z:uZ:nZ:gZ:`Z:YZ:RZ:KZ:DZ:=Z:6Z:/Z:(Z:!Z:Z:Z: Z:Z:þY:÷Y:ðY:éY:âY:ÛY:ÔY:ÍY:ÆY:¿Y:¸Y:±Y:ªY:£Y:œY:•Y:ŽY:‡Y:€Y:yY:rY:kY:dY:]Y:VY:OY:HY:AY::Y:3Y:,Y:%Y:Y:Y:Y: Y:Y:ûX:ôX:íX:æX:ßX:ØX:ÑX:ÊX:ÃX:¼X:µX:®X:§X: X:™X:’X:‹X:„X:}X:vX:oX:hX:aX:ZX:SX:LX:EX:>X:7X:0X:)X:"X:X:X: X:X:ÿW:øW:ñW:êW:ãW:ÜW:ÕW:ÎW:ÇW:ÀW:¹W:²W:«W:¤W:W:–W:W:ˆW:W:zW:sW:lW:eW:^W:WW:PW:IW:BW:;W:4W:-W:&W:W:W:W: W:W:üV:õV:îV:çV:àV:ÙV:ÒV:ËV:ÄV:½V:¶V:¯V:¨V:¡V:šV:“V:ŒV:…V:~V:wV:pV:iV:bV:[V:TV:MV:FV:?V:8V:1V:*V:#V:V:V:V:V:V:ùU:òU:ëU:äU:ÝU:ÖU:ÏU:ÈU:ÁU:ºU:³U:¬U:¥U:žU:—U:U:‰U:‚U:{U:tU:mU:fU:_U:XU:QU:JU:CU:Q:7Q:0Q:)Q:"Q:Q:Q: Q:Q:ÿP:øP:ñP:êP:ãP:ÜP:ÕP:ÎP:ÇP:ÀP:¹P:²P:«P:¤P:P:–P:P:ˆP:P:zP:sP:lP:eP:^P:WP:PP:IP:BP:;P:4P:-P:&P:P:P:P: P:P:üO:õO:îO:çO:àO:ÙO:ÒO:ËO:ÄO:½O:¶O:¯O:¨O:¡O:šO:“O:ŒO:…O:~O:wO:pO:iO:bO:[O:TO:MO:FO:?O:8O:1O:*O:#O:O:O:O:O:O:ùN:òN:ëN:äN:ÝN:ÖN:ÏN:ÈN:ÁN:ºN:³N:¬N:¥N:žN:—N:N:‰N:‚N:{N:tN:mN:fN:_N:XN:QN:JN:CN:J:7J:0J:)J:"J:J:J: J:J:ÿI:øI:ñI:êI:ãI:ÜI:ÕI:ÎI:ÇI:ÀI:¹I:²I:«I:¤I:I:–I:I:ˆI:I:zI:sI:lI:eI:^I:WI:PI:II:BI:;I:4I:-I:&I:I:I:I: I:I:üH:õH:îH:çH:àH:ÙH:ÒH:ËH:ÄH:½H:¶H:¯H:¨H:¡H:šH:“H:ŒH:…H:~H:wH:pH:iH:bH:[H:TH:MH:FH:?H:8H:1H:*H:#H:H:H:H:H:H:ùG:òG:ëG:äG:ÝG:ÖG:ÏG:ÈG:ÁG:ºG:³G:¬G:¥G:žG:—G:G:‰G:‚G:{G:tG:mG:fG:_G:XG:QG:JG:CG:C:7C:0C:)C:"C:C:C: C:C:ÿB:øB:ñB:êB:ãB:ÜB:ÕB:ÎB:ÇB:ÀB:¹B:²B:«B:¤B:B:–B:B:ˆB:B:zB:sB:lB:eB:^B:WB:PB:IB:BB:;B:4B:-B:&B:B:B:B: B:B:üA:õA:îA:çA:àA:ÙA:ÒA:ËA:ÄA:½A:¶A:¯A:¨A:¡A:šA:“A:ŒA:…A:~A:wA:pA:iA:bA:[A:TA:MA:FA:?A:8A:1A:*A:#A:A:A:A:A:A:ù@:ò@:ë@:ä@:Ý@:Ö@:Ï@:È@:Á@:º@:³@:¬@:¥@:ž@:—@:@:‰@:‚@:{@:t@:m@:f@:_@:X@:Q@:J@:C@:<@:5@:.@:'@: @:@:@: @:@:ý?:ö?:ï?:è?:á?:Ú?:Ó?:Ì?:Å?:¾?:·?:°?:©?:¢?:›?:”?:?:†?:?:x?:q?:j?:c?:\?:U?:N?:G?:@?:9?:2?:+?:$?:?:?:?:?:?:ú>:ó>:ì>:å>:Þ>:×>:Ð>:É>:Â>:»>:´>:­>:¦>:Ÿ>:˜>:‘>:Š>:ƒ>:|>:u>:n>:g>:`>:Y>:R>:K>:D>:=>:6>:/>:(>:!>:>:>: >:>:þ=:÷=:ð=:é=:â=:Û=:Ô=:Í=:Æ=:¿=:¸=:±=:ª=:£=:œ=:•=:Ž=:‡=:€=:y=:r=:k=:d=:]=:V=:O=:H=:A=::=:3=:,=:%=:=:=:=: =:=:û<:ô<:í<:æ<:ß<:Ø<:Ñ<:Ê<:Ã<:¼<:µ<:®<:§<: <:™<:’<:‹<:„<:}<:v<:o<:h<:a<:Z<:S<:L<:E<:><:7<:0<:)<:"<:<:<: <:<:ÿ;:ø;:ñ;:ê;:ã;:Ü;:Õ;:Î;:Ç;:À;:¹;:²;:«;:¤;:;:–;:;:ˆ;:;:z;:s;:l;:e;:^;:W;:P;:I;:B;:;;:4;:-;:&;:;:;:;: ;:;:ü::õ::î::ç::à::Ù::Ò::Ë::Ä::½::¶::¯::¨::¡::š::“::Œ::…::~::w::p::i::b::[::T::M::F::?::8::1::*::#::::::::::::ù9:ò9:ë9:ä9:Ý9:Ö9:Ï9:È9:Á9:º9:³9:¬9:¥9:ž9:—9:9:‰9:‚9:{9:t9:m9:f9:_9:X9:Q9:J9:C9:<9:59:.9:'9: 9:9:9: 9:9:ý8:ö8:ï8:è8:á8:Ú8:Ó8:Ì8:Å8:¾8:·8:°8:©8:¢8:›8:”8:8:†8:8:x8:q8:j8:c8:\8:U8:N8:G8:@8:98:28:+8:$8:8:8:8:8:8:ú7:ó7:ì7:å7:Þ7:×7:Ð7:É7:Â7:»7:´7:­7:¦7:Ÿ7:˜7:‘7:Š7:ƒ7:|7:u7:n7:g7:`7:Y7:R7:K7:D7:=7:67:/7:(7:!7:7:7: 7:7:þ6:÷6:ð6:é6:â6:Û6:Ô6:Í6:Æ6:¿6:¸6:±6:ª6:£6:œ6:•6:Ž6:‡6:€6:y6:r6:k6:d6:]6:V6:O6:H6:A6::6:36:,6:%6:6:6:6: 6:6:û5:ô5:í5:æ5:ß5:Ø5:Ñ5:Ê5:Ã5:¼5:µ5:®5:§5: 5:™5:’5:‹5:„5:}5:v5:o5:h5:a5:Z5:S5:L5:E5:>5:75:05:)5:"5:5:5: 5:5:ÿ4:ø4:ñ4:ê4:ã4:Ü4:Õ4:Î4:Ç4:À4:¹4:²4:«4:¤4:4:–4:4:ˆ4:4:z4:s4:l4:e4:^4:W4:P4:I4:B4:;4:44:-4:&4:4:4:4: 4:4:ü3:õ3:î3:ç3:à3:Ù3:Ò3:Ë3:Ä3:½3:¶3:¯3:¨3:¡3:š3:“3:Œ3:…3:~3:w3:p3:i3:b3:[3:T3:M3:F3:?3:83:13:*3:#3:3:3:3:3:3:ù2:ò2:ë2:ä2:Ý2:Ö2:Ï2:È2:Á2:º2:³2:¬2:¥2:ž2:—2:2:‰2:‚2:{2:t2:m2:f2:_2:X2:Q2:J2:C2:<2:52:.2:'2: 2:2:2: 2:2:ý1:ö1:ï1:è1:á1:Ú1:Ó1:Ì1:Å1:¾1:·1:°1:©1:¢1:›1:”1:1:†1:1:x1:q1:j1:c1:\1:U1:N1:G1:@1:91:21:+1:$1:1:1:1:1:1:ú0:ó0:ì0:å0:Þ0:×0:Ð0:É0:Â0:»0:´0:­0:¦0:Ÿ0:˜0:‘0:Š0:ƒ0:|0:u0:n0:g0:`0:Y0:R0:K0:D0:=0:60:/0:(0:!0:0:0: 0:0:þ/:÷/:ð/:é/:â/:Û/:Ô/:Í/:Æ/:¿/:¸/:±/:ª/:£/:œ/:•/:Ž/:‡/:€/:y/:r/:k/:d/:]/:V/:O/:H/:A/::/:3/:,/:%/:/:/:/: /:/:û.:ô.:í.:æ.:ß.:Ø.:Ñ.:Ê.:Ã.:¼.:µ.:®.:§.: .:™.:’.:‹.:„.:}.:v.:o.:h.:a.:Z.:S.:L.:E.:>.:7.:0.:).:".:.:.: .:.:ÿ-:ø-:ñ-:ê-:ã-:Ü-:Õ-:Î-:Ç-:À-:¹-:²-:«-:¤-:-:–-:-:ˆ-:-:z-:s-:l-:e-:^-:W-:P-:I-:B-:;-:4-:--:&-:-:-:-: -:-:ü,:õ,:î,:ç,:à,:Ù,:Ò,:Ë,:Ä,:½,:¶,:¯,:¨,:¡,:š,:“,:Œ,:…,:~,:w,:p,:i,:b,:[,:T,:M,:F,:?,:8,:1,:*,:#,:,:,:,:,:,:ù+:ò+:ë+:ä+:Ý+:Ö+:Ï+:È+:Á+:º+:³+:¬+:¥+:ž+:—+:+:‰+:‚+:{+:t+:m+:f+:_+:X+:Q+:J+:C+:<+:5+:.+:'+: +:+:+: +:+:ý*:ö*:ï*:è*:á*:Ú*:Ó*:Ì*:Å*:¾*:·*:°*:©*:¢*:›*:”*:*:†*:*:x*:q*:j*:c*:\*:U*:N*:G*:@*:9*:2*:+*:$*:*:*:*:*:*:ú):ó):ì):å):Þ):×):Ð):É):Â):»):´):­):¦):Ÿ):˜):‘):Š):ƒ):|):u):n):g):`):Y):R):K):D):=):6):/):():!):):): ):):þ(:÷(:ð(:é(:â(:Û(:Ô(:Í(:Æ(:¿(:¸(:±(:ª(:£(:œ(:•(:Ž(:‡(:€(:y(:r(:k(:d(:](:V(:O(:H(:A(::(:3(:,(:%(:(:(:(: (:(:û':ô':í':æ':ß':Ø':Ñ':Ê':Ã':¼':µ':®':§': ':™':’':‹':„':}':v':o':h':a':Z':S':L':E':>':7':0':)':"':':': ':':ÿ&:ø&:ñ&:ê&:ã&:Ü&:Õ&:Î&:Ç&:À&:¹&:²&:«&:¤&:&:–&:&:ˆ&:&:z&:s&:l&:e&:^&:W&:P&:I&:B&:;&:4&:-&:&&:&:&:&: &:&:ü%:õ%:î%:ç%:à%:Ù%:Ò%:Ë%:Ä%:½%:¶%:¯%:¨%:¡%:š%:“%:Œ%:…%:~%:w%:p%:i%:b%:[%:T%:M%:F%:?%:8%:1%:*%:#%:%:%:%:%:%:ù$:ò$:ë$:ä$:Ý$:Ö$:Ï$:È$:Á$:º$:³$:¬$:¥$:ž$:—$:$:‰$:‚$:{$:t$:m$:f$:_$:X$:Q$:J$:C$:<$:5$:.$:'$: $:$:$: $:$:ý#:ö#:ï#:è#:á#:Ú#:Ó#:Ì#:Å#:¾#:·#:°#:©#:¢#:›#:”#:#:†#:#:x#:q#:j#:c#:\#:U#:N#:G#:@#:9#:2#:+#:$#:#:#:#:#:#:ú":ó":ì":å":Þ":×":Ð":É":Â":»":´":­":¦":Ÿ":˜":‘":Š":ƒ":|":u":n":g":`":Y":R":K":D":=":6":/":(":!":":": ":":þ!:÷!:ð!:é!:â!:Û!:Ô!:Í!:Æ!:¿!:¸!:±!:ª!:£!:œ!:•!:Ž!:‡!:€!:y!:r!:k!:d!:]!:V!:O!:H!:A!::!:3!:,!:%!:!:!:!: !:!:û :ô :í :æ :ß :Ø :Ñ :Ê :à :¼ :µ :® :§ :  :™ :’ :‹ :„ :} :v :o :h :a :Z :S :L :E :> :7 :0 :) :" : : : : :ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú :ó :ì :å :Þ :× :Ð :É : :» :´ :­ :¦ :Ÿ :˜ :‘ :Š :ƒ :| :u :n :g :` :Y :R :K :D := :6 :/ :( :! : : : : :þ :÷ :ð :é :â :Û :Ô :Í :Æ :¿ :¸ :± :ª :£ :œ :• :Ž :‡ :€ :y :r :k :d :] :V :O :H :A :: :3 :, :% : : : : : :û :ô :í :æ :ß :Ø :Ñ :Ê :à :¼ :µ :® :§ :  :™ :’ :‹ :„ :} :v :o :h :a :Z :S :L :E :> :7 :0 :) :" : : : : :ÿ :ø :ñ :ê :ã :Ü :Õ :Î :Ç :À :¹ :² :« :¤ : :– : :ˆ : :z :s :l :e :^ :W :P :I :B :; :4 :- :& : : : : : :ü :õ :î :ç :à :Ù :Ò :Ë :Ä :½ :¶ :¯ :¨ :¡ :š :“ :Œ :… :~ :w :p :i :b :[ :T :M :F :? :8 :1 :* :# : : : : : :ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::úÿ9óÿ9ìÿ9åÿ9Þÿ9×ÿ9Ðÿ9Éÿ9Âÿ9»ÿ9´ÿ9­ÿ9¦ÿ9Ÿÿ9˜ÿ9‘ÿ9Šÿ9ƒÿ9|ÿ9uÿ9nÿ9gÿ9`ÿ9Yÿ9Rÿ9Kÿ9Dÿ9=ÿ96ÿ9/ÿ9(ÿ9!ÿ9ÿ9ÿ9 ÿ9ÿ9þþ9÷þ9ðþ9éþ9âþ9Ûþ9Ôþ9Íþ9Æþ9¿þ9¸þ9±þ9ªþ9£þ9œþ9•þ9Žþ9‡þ9€þ9yþ9rþ9kþ9dþ9]þ9Vþ9Oþ9Hþ9Aþ9:þ93þ9,þ9%þ9þ9þ9þ9 þ9þ9ûý9ôý9íý9æý9ßý9Øý9Ñý9Êý9Ãý9¼ý9µý9®ý9§ý9 ý9™ý9’ý9‹ý9„ý9}ý9vý9oý9hý9aý9Zý9Sý9Lý9Eý9>ý97ý90ý9)ý9"ý9ý9ý9 ý9ý9ÿü9øü9ñü9êü9ãü9Üü9Õü9Îü9Çü9Àü9¹ü9²ü9«ü9¤ü9ü9–ü9ü9ˆü9ü9zü9sü9lü9eü9^ü9Wü9Pü9Iü9Bü9;ü94ü9-ü9&ü9ü9ü9ü9 ü9ü9üû9õû9îû9çû9àû9Ùû9Òû9Ëû9Äû9½û9¶û9¯û9¨û9¡û9šû9“û9Œû9…û9~û9wû9pû9iû9bû9[û9Tû9Mû9Fû9?û98û91û9*û9#û9û9û9û9û9û9ùú9òú9ëú9äú9Ýú9Öú9Ïú9Èú9Áú9ºú9³ú9¬ú9¥ú9žú9—ú9ú9‰ú9‚ú9{ú9tú9mú9fú9_ú9Xú9Qú9Jú9Cú9<ú95ú9.ú9'ú9 ú9ú9ú9 ú9ú9ýù9öù9ïù9èù9áù9Úù9Óù9Ìù9Åù9¾ù9·ù9°ù9©ù9¢ù9›ù9”ù9ù9†ù9ù9xù9qù9jù9cù9\ù9Uù9Nù9Gù9@ù99ù92ù9+ù9$ù9ù9ù9ù9ù9ù9úø9óø9ìø9åø9Þø9×ø9Ðø9Éø9Âø9»ø9´ø9­ø9¦ø9Ÿø9˜ø9‘ø9Šø9ƒø9|ø9uø9nø9gø9`ø9Yø9Rø9Kø9Dø9=ø96ø9/ø9(ø9!ø9ø9ø9 ø9ø9þ÷9÷÷9ð÷9é÷9â÷9Û÷9Ô÷9Í÷9Æ÷9¿÷9¸÷9±÷9ª÷9£÷9œ÷9•÷9Ž÷9‡÷9€÷9y÷9r÷9k÷9d÷9]÷9V÷9O÷9H÷9A÷9:÷93÷9,÷9%÷9÷9÷9÷9 ÷9÷9ûö9ôö9íö9æö9ßö9Øö9Ñö9Êö9Ãö9¼ö9µö9®ö9§ö9 ö9™ö9’ö9‹ö9„ö9}ö9vö9oö9hö9aö9Zö9Sö9Lö9Eö9>ö97ö90ö9)ö9"ö9ö9ö9 ö9ö9ÿõ9øõ9ñõ9êõ9ãõ9Üõ9Õõ9Îõ9Çõ9Àõ9¹õ9²õ9«õ9¤õ9õ9–õ9õ9ˆõ9õ9zõ9sõ9lõ9eõ9^õ9Wõ9Põ9Iõ9Bõ9;õ94õ9-õ9&õ9õ9õ9õ9 õ9õ9üô9õô9îô9çô9àô9Ùô9Òô9Ëô9Äô9½ô9¶ô9¯ô9¨ô9¡ô9šô9“ô9Œô9…ô9~ô9wô9pô9iô9bô9[ô9Tô9Mô9Fô9?ô98ô91ô9*ô9#ô9ô9ô9ô9ô9ô9ùó9òó9ëó9äó9Ýó9Öó9Ïó9Èó9Áó9ºó9³ó9¬ó9¥ó9žó9—ó9ó9‰ó9‚ó9{ó9tó9mó9fó9_ó9Xó9Qó9Jó9Có9<ó95ó9.ó9'ó9 ó9ó9ó9 ó9ó9ýò9öò9ïò9èò9áò9Úò9Óò9Ìò9Åò9¾ò9·ò9°ò9©ò9¢ò9›ò9”ò9ò9†ò9ò9xò9qò9jò9cò9\ò9Uò9Nò9Gò9@ò99ò92ò9+ò9$ò9ò9ò9ò9ò9ò9úñ9óñ9ìñ9åñ9Þñ9×ñ9Ðñ9Éñ9Âñ9»ñ9´ñ9­ñ9¦ñ9Ÿñ9˜ñ9‘ñ9Šñ9ƒñ9|ñ9uñ9nñ9gñ9`ñ9Yñ9Rñ9Kñ9Dñ9=ñ96ñ9/ñ9(ñ9!ñ9ñ9ñ9 ñ9ñ9þð9÷ð9ðð9éð9âð9Ûð9Ôð9Íð9Æð9¿ð9¸ð9±ð9ªð9£ð9œð9•ð9Žð9‡ð9€ð9yð9rð9kð9dð9]ð9Vð9Oð9Hð9Að9:ð93ð9,ð9%ð9ð9ð9ð9 ð9ð9ûï9ôï9íï9æï9ßï9Øï9Ñï9Êï9Ãï9¼ï9µï9®ï9§ï9 ï9™ï9’ï9‹ï9„ï9}ï9vï9oï9hï9aï9Zï9Sï9Lï9Eï9>ï97ï90ï9)ï9"ï9ï9ï9 ï9ï9ÿî9øî9ñî9êî9ãî9Üî9Õî9Îî9Çî9Àî9¹î9²î9«î9¤î9î9–î9î9ˆî9î9zî9sî9lî9eî9^î9Wî9Pî9Iî9Bî9;î94î9-î9&î9î9î9î9 î9î9üí9õí9îí9çí9àí9Ùí9Òí9Ëí9Äí9½í9¶í9¯í9¨í9¡í9ší9“í9Œí9…í9~í9wí9pí9ií9bí9[í9Tí9Mí9Fí9?í98í91í9*í9#í9í9í9í9í9í9ùì9òì9ëì9äì9Ýì9Öì9Ïì9Èì9Áì9ºì9³ì9¬ì9¥ì9žì9—ì9ì9‰ì9‚ì9{ì9tì9mì9fì9_ì9Xì9Qì9Jì9Cì9<ì95ì9.ì9'ì9 ì9ì9ì9 ì9ì9ýë9öë9ïë9èë9áë9Úë9Óë9Ìë9Åë9¾ë9·ë9°ë9©ë9¢ë9›ë9”ë9ë9†ë9ë9xë9që9jë9cë9\ë9Uë9Në9Gë9@ë99ë92ë9+ë9$ë9ë9ë9ë9ë9ë9úê9óê9ìê9åê9Þê9×ê9Ðê9Éê9Âê9»ê9´ê9­ê9¦ê9Ÿê9˜ê9‘ê9Šê9ƒê9|ê9uê9nê9gê9`ê9Yê9Rê9Kê9Dê9=ê96ê9/ê9(ê9!ê9ê9ê9 ê9ê9þé9÷é9ðé9éé9âé9Ûé9Ôé9Íé9Æé9¿é9¸é9±é9ªé9£é9œé9•é9Žé9‡é9€é9yé9ré9ké9dé9]é9Vé9Oé9Hé9Aé9:é93é9,é9%é9é9é9é9 é9é9ûè9ôè9íè9æè9ßè9Øè9Ñè9Êè9Ãè9¼è9µè9®è9§è9 è9™è9’è9‹è9„è9}è9vè9oè9hè9aè9Zè9Sè9Lè9Eè9>è97è90è9)è9"è9è9è9 è9è9ÿç9øç9ñç9êç9ãç9Üç9Õç9Îç9Çç9Àç9¹ç9²ç9«ç9¤ç9ç9–ç9ç9ˆç9ç9zç9sç9lç9eç9^ç9Wç9Pç9Iç9Bç9;ç94ç9-ç9&ç9ç9ç9ç9 ç9ç9üæ9õæ9îæ9çæ9àæ9Ùæ9Òæ9Ëæ9Äæ9½æ9¶æ9¯æ9¨æ9¡æ9šæ9“æ9Œæ9…æ9~æ9wæ9pæ9iæ9bæ9[æ9Tæ9Mæ9Fæ9?æ98æ91æ9*æ9#æ9æ9æ9æ9æ9æ9ùå9òå9ëå9äå9Ýå9Öå9Ïå9Èå9Áå9ºå9³å9¬å9¥å9žå9—å9å9‰å9‚å9{å9tå9må9få9_å9Xå9Qå9Jå9Cå9<å95å9.å9'å9 å9å9å9 å9å9ýä9öä9ïä9èä9áä9Úä9Óä9Ìä9Åä9¾ä9·ä9°ä9©ä9¢ä9›ä9”ä9ä9†ä9ä9xä9qä9jä9cä9\ä9Uä9Nä9Gä9@ä99ä92ä9+ä9$ä9ä9ä9ä9ä9ä9úã9óã9ìã9åã9Þã9×ã9Ðã9Éã9Âã9»ã9´ã9­ã9¦ã9Ÿã9˜ã9‘ã9Šã9ƒã9|ã9uã9nã9gã9`ã9Yã9Rã9Kã9Dã9=ã96ã9/ã9(ã9!ã9ã9ã9 ã9ã9þâ9÷â9ðâ9éâ9ââ9Ûâ9Ôâ9Íâ9Æâ9¿â9¸â9±â9ªâ9£â9œâ9•â9Žâ9‡â9€â9yâ9râ9kâ9dâ9]â9Vâ9Oâ9Hâ9Aâ9:â93â9,â9%â9â9â9â9 â9â9ûá9ôá9íá9æá9ßá9Øá9Ñá9Êá9Ãá9¼á9µá9®á9§á9 á9™á9’á9‹á9„á9}á9vá9oá9há9aá9Zá9Sá9Lá9Eá9>á97á90á9)á9"á9á9á9 á9á9ÿà9øà9ñà9êà9ãà9Üà9Õà9Îà9Çà9Àà9¹à9²à9«à9¤à9à9–à9à9ˆà9à9zà9sà9là9eà9^à9Wà9Pà9Ià9Bà9;à94à9-à9&à9à9à9à9 à9à9üß9õß9îß9çß9àß9Ùß9Òß9Ëß9Äß9½ß9¶ß9¯ß9¨ß9¡ß9šß9“ß9Œß9…ß9~ß9wß9pß9iß9bß9[ß9Tß9Mß9Fß9?ß98ß91ß9*ß9#ß9ß9ß9ß9ß9ß9ùÞ9òÞ9ëÞ9äÞ9ÝÞ9ÖÞ9ÏÞ9ÈÞ9ÁÞ9ºÞ9³Þ9¬Þ9¥Þ9žÞ9—Þ9Þ9‰Þ9‚Þ9{Þ9tÞ9mÞ9fÞ9_Þ9XÞ9QÞ9JÞ9CÞ9<Þ95Þ9.Þ9'Þ9 Þ9Þ9Þ9 Þ9Þ9ýÝ9öÝ9ïÝ9èÝ9áÝ9ÚÝ9ÓÝ9ÌÝ9ÅÝ9¾Ý9·Ý9°Ý9©Ý9¢Ý9›Ý9”Ý9Ý9†Ý9Ý9xÝ9qÝ9jÝ9cÝ9\Ý9UÝ9NÝ9GÝ9@Ý99Ý92Ý9+Ý9$Ý9Ý9Ý9Ý9Ý9Ý9úÜ9óÜ9ìÜ9åÜ9ÞÜ9×Ü9ÐÜ9ÉÜ9ÂÜ9»Ü9´Ü9­Ü9¦Ü9ŸÜ9˜Ü9‘Ü9ŠÜ9ƒÜ9|Ü9uÜ9nÜ9gÜ9`Ü9YÜ9RÜ9KÜ9DÜ9=Ü96Ü9/Ü9(Ü9!Ü9Ü9Ü9 Ü9Ü9þÛ9÷Û9ðÛ9éÛ9âÛ9ÛÛ9ÔÛ9ÍÛ9ÆÛ9¿Û9¸Û9±Û9ªÛ9£Û9œÛ9•Û9ŽÛ9‡Û9€Û9yÛ9rÛ9kÛ9dÛ9]Û9VÛ9OÛ9HÛ9AÛ9:Û93Û9,Û9%Û9Û9Û9Û9 Û9Û9ûÚ9ôÚ9íÚ9æÚ9ßÚ9ØÚ9ÑÚ9ÊÚ9ÃÚ9¼Ú9µÚ9®Ú9§Ú9 Ú9™Ú9’Ú9‹Ú9„Ú9}Ú9vÚ9oÚ9hÚ9aÚ9ZÚ9SÚ9LÚ9EÚ9>Ú97Ú90Ú9)Ú9"Ú9Ú9Ú9 Ú9Ú9ÿÙ9øÙ9ñÙ9êÙ9ãÙ9ÜÙ9ÕÙ9ÎÙ9ÇÙ9ÀÙ9¹Ù9²Ù9«Ù9¤Ù9Ù9–Ù9Ù9ˆÙ9Ù9zÙ9sÙ9lÙ9eÙ9^Ù9WÙ9PÙ9IÙ9BÙ9;Ù94Ù9-Ù9&Ù9Ù9Ù9Ù9 Ù9Ù9üØ9õØ9îØ9çØ9àØ9ÙØ9ÒØ9ËØ9ÄØ9½Ø9¶Ø9¯Ø9¨Ø9¡Ø9šØ9“Ø9ŒØ9…Ø9~Ø9wØ9pØ9iØ9bØ9[Ø9TØ9MØ9FØ9?Ø98Ø91Ø9*Ø9#Ø9Ø9Ø9Ø9Ø9Ø9ù×9ò×9ë×9ä×9Ý×9Ö×9Ï×9È×9Á×9º×9³×9¬×9¥×9ž×9—×9×9‰×9‚×9{×9t×9m×9f×9_×9X×9Q×9J×9C×9<×95×9.×9'×9 ×9×9×9 ×9×9ýÖ9öÖ9ïÖ9èÖ9áÖ9ÚÖ9ÓÖ9ÌÖ9ÅÖ9¾Ö9·Ö9°Ö9©Ö9¢Ö9›Ö9”Ö9Ö9†Ö9Ö9xÖ9qÖ9jÖ9cÖ9\Ö9UÖ9NÖ9GÖ9@Ö99Ö92Ö9+Ö9$Ö9Ö9Ö9Ö9Ö9Ö9úÕ9óÕ9ìÕ9åÕ9ÞÕ9×Õ9ÐÕ9ÉÕ9ÂÕ9»Õ9´Õ9­Õ9¦Õ9ŸÕ9˜Õ9‘Õ9ŠÕ9ƒÕ9|Õ9uÕ9nÕ9gÕ9`Õ9YÕ9RÕ9KÕ9DÕ9=Õ96Õ9/Õ9(Õ9!Õ9Õ9Õ9 Õ9Õ9þÔ9÷Ô9ðÔ9éÔ9âÔ9ÛÔ9ÔÔ9ÍÔ9ÆÔ9¿Ô9¸Ô9±Ô9ªÔ9£Ô9œÔ9•Ô9ŽÔ9‡Ô9€Ô9yÔ9rÔ9kÔ9dÔ9]Ô9VÔ9OÔ9HÔ9AÔ9:Ô93Ô9,Ô9%Ô9Ô9Ô9Ô9 Ô9Ô9ûÓ9ôÓ9íÓ9æÓ9ßÓ9ØÓ9ÑÓ9ÊÓ9ÃÓ9¼Ó9µÓ9®Ó9§Ó9 Ó9™Ó9’Ó9‹Ó9„Ó9}Ó9vÓ9oÓ9hÓ9aÓ9ZÓ9SÓ9LÓ9EÓ9>Ó97Ó90Ó9)Ó9"Ó9Ó9Ó9 Ó9Ó9ÿÒ9øÒ9ñÒ9êÒ9ãÒ9ÜÒ9ÕÒ9ÎÒ9ÇÒ9ÀÒ9¹Ò9²Ò9«Ò9¤Ò9Ò9–Ò9Ò9ˆÒ9Ò9zÒ9sÒ9lÒ9eÒ9^Ò9WÒ9PÒ9IÒ9BÒ9;Ò94Ò9-Ò9&Ò9Ò9Ò9Ò9 Ò9Ò9üÑ9õÑ9îÑ9çÑ9àÑ9ÙÑ9ÒÑ9ËÑ9ÄÑ9½Ñ9¶Ñ9¯Ñ9¨Ñ9¡Ñ9šÑ9“Ñ9ŒÑ9…Ñ9~Ñ9wÑ9pÑ9iÑ9bÑ9[Ñ9TÑ9MÑ9FÑ9?Ñ98Ñ91Ñ9*Ñ9#Ñ9Ñ9Ñ9Ñ9Ñ9Ñ9ùÐ9òÐ9ëÐ9äÐ9ÝÐ9ÖÐ9ÏÐ9ÈÐ9ÁÐ9ºÐ9³Ð9¬Ð9¥Ð9žÐ9—Ð9Ð9‰Ð9‚Ð9{Ð9tÐ9mÐ9fÐ9_Ð9XÐ9QÐ9JÐ9CÐ9<Ð95Ð9.Ð9'Ð9 Ð9Ð9Ð9 Ð9Ð9ýÏ9öÏ9ïÏ9èÏ9áÏ9ÚÏ9ÓÏ9ÌÏ9ÅÏ9¾Ï9·Ï9°Ï9©Ï9¢Ï9›Ï9”Ï9Ï9†Ï9Ï9xÏ9qÏ9jÏ9cÏ9\Ï9UÏ9NÏ9GÏ9@Ï99Ï92Ï9+Ï9$Ï9Ï9Ï9Ï9Ï9Ï9úÎ9óÎ9ìÎ9åÎ9ÞÎ9×Î9ÐÎ9ÉÎ9ÂÎ9»Î9´Î9­Î9¦Î9ŸÎ9˜Î9‘Î9ŠÎ9ƒÎ9|Î9uÎ9nÎ9gÎ9`Î9YÎ9RÎ9KÎ9DÎ9=Î96Î9/Î9(Î9!Î9Î9Î9 Î9Î9þÍ9÷Í9ðÍ9éÍ9âÍ9ÛÍ9ÔÍ9ÍÍ9ÆÍ9¿Í9¸Í9±Í9ªÍ9£Í9œÍ9•Í9ŽÍ9‡Í9€Í9yÍ9rÍ9kÍ9dÍ9]Í9VÍ9OÍ9HÍ9AÍ9:Í93Í9,Í9%Í9Í9Í9Í9 Í9Í9ûÌ9ôÌ9íÌ9æÌ9ßÌ9ØÌ9ÑÌ9ÊÌ9ÃÌ9¼Ì9µÌ9®Ì9§Ì9 Ì9™Ì9’Ì9‹Ì9„Ì9}Ì9vÌ9oÌ9hÌ9aÌ9ZÌ9SÌ9LÌ9EÌ9>Ì97Ì90Ì9)Ì9"Ì9Ì9Ì9 Ì9Ì9ÿË9øË9ñË9êË9ãË9ÜË9ÕË9ÎË9ÇË9ÀË9¹Ë9²Ë9«Ë9¤Ë9Ë9–Ë9Ë9ˆË9Ë9zË9sË9lË9eË9^Ë9WË9PË9IË9BË9;Ë94Ë9-Ë9&Ë9Ë9Ë9Ë9 Ë9Ë9üÊ9õÊ9îÊ9çÊ9àÊ9ÙÊ9ÒÊ9ËÊ9ÄÊ9½Ê9¶Ê9¯Ê9¨Ê9¡Ê9šÊ9“Ê9ŒÊ9…Ê9~Ê9wÊ9pÊ9iÊ9bÊ9[Ê9TÊ9MÊ9FÊ9?Ê98Ê91Ê9*Ê9#Ê9Ê9Ê9Ê9Ê9Ê9ùÉ9òÉ9ëÉ9äÉ9ÝÉ9ÖÉ9ÏÉ9ÈÉ9ÁÉ9ºÉ9³É9¬É9¥É9žÉ9—É9É9‰É9‚É9{É9tÉ9mÉ9fÉ9_É9XÉ9QÉ9JÉ9CÉ9<É95É9.É9'É9 É9É9É9 É9É9ýÈ9öÈ9ïÈ9èÈ9áÈ9ÚÈ9ÓÈ9ÌÈ9ÅÈ9¾È9·È9°È9©È9¢È9›È9”È9È9†È9È9xÈ9qÈ9jÈ9cÈ9\È9UÈ9NÈ9GÈ9@È99È92È9+È9$È9È9È9È9È9È9úÇ9óÇ9ìÇ9åÇ9ÞÇ9×Ç9ÐÇ9ÉÇ9ÂÇ9»Ç9´Ç9­Ç9¦Ç9ŸÇ9˜Ç9‘Ç9ŠÇ9ƒÇ9|Ç9uÇ9nÇ9gÇ9`Ç9YÇ9RÇ9KÇ9DÇ9=Ç96Ç9/Ç9(Ç9!Ç9Ç9Ç9 Ç9Ç9þÆ9÷Æ9ðÆ9éÆ9âÆ9ÛÆ9ÔÆ9ÍÆ9ÆÆ9¿Æ9¸Æ9±Æ9ªÆ9£Æ9œÆ9•Æ9ŽÆ9‡Æ9€Æ9yÆ9rÆ9kÆ9dÆ9]Æ9VÆ9OÆ9HÆ9AÆ9:Æ93Æ9,Æ9%Æ9Æ9Æ9Æ9 Æ9Æ9ûÅ9ôÅ9íÅ9æÅ9ßÅ9ØÅ9ÑÅ9ÊÅ9ÃÅ9¼Å9µÅ9®Å9§Å9 Å9™Å9’Å9‹Å9„Å9}Å9vÅ9oÅ9hÅ9aÅ9ZÅ9SÅ9LÅ9EÅ9>Å97Å90Å9)Å9"Å9Å9Å9 Å9Å9ÿÄ9øÄ9ñÄ9êÄ9ãÄ9ÜÄ9ÕÄ9ÎÄ9ÇÄ9ÀÄ9¹Ä9²Ä9«Ä9¤Ä9Ä9–Ä9Ä9ˆÄ9Ä9zÄ9sÄ9lÄ9eÄ9^Ä9WÄ9PÄ9IÄ9BÄ9;Ä94Ä9-Ä9&Ä9Ä9Ä9Ä9 Ä9Ä9üÃ9õÃ9îÃ9çÃ9àÃ9ÙÃ9ÒÃ9ËÃ9ÄÃ9½Ã9¶Ã9¯Ã9¨Ã9¡Ã9šÃ9“Ã9ŒÃ9…Ã9~Ã9wÃ9pÃ9iÃ9bÃ9[Ã9TÃ9MÃ9FÃ9?Ã98Ã91Ã9*Ã9#Ã9Ã9Ã9Ã9Ã9Ã9ùÂ9òÂ9ëÂ9äÂ9ÝÂ9ÖÂ9ÏÂ9ÈÂ9ÁÂ9ºÂ9³Â9¬Â9¥Â9žÂ9—Â9Â9‰Â9‚Â9{Â9tÂ9mÂ9fÂ9_Â9XÂ9QÂ9JÂ9CÂ9<Â95Â9.Â9'Â9 Â9Â9Â9 Â9Â9ýÁ9öÁ9ïÁ9èÁ9áÁ9ÚÁ9ÓÁ9ÌÁ9ÅÁ9¾Á9·Á9°Á9©Á9¢Á9›Á9”Á9Á9†Á9Á9xÁ9qÁ9jÁ9cÁ9\Á9UÁ9NÁ9GÁ9@Á99Á92Á9+Á9$Á9Á9Á9Á9Á9Á9úÀ9óÀ9ìÀ9åÀ9ÞÀ9×À9ÐÀ9ÉÀ9ÂÀ9»À9´À9­À9¦À9ŸÀ9˜À9‘À9ŠÀ9ƒÀ9|À9uÀ9nÀ9gÀ9`À9YÀ9RÀ9KÀ9DÀ9=À96À9/À9(À9!À9À9À9 À9À9þ¿9÷¿9ð¿9é¿9â¿9Û¿9Ô¿9Í¿9Æ¿9¿¿9¸¿9±¿9ª¿9£¿9œ¿9•¿9Ž¿9‡¿9€¿9y¿9r¿9k¿9d¿9]¿9V¿9O¿9H¿9A¿9:¿93¿9,¿9%¿9¿9¿9¿9 ¿9¿9û¾9ô¾9í¾9æ¾9ß¾9ؾ9Ѿ9ʾ9þ9¼¾9µ¾9®¾9§¾9 ¾9™¾9’¾9‹¾9„¾9}¾9v¾9o¾9h¾9a¾9Z¾9S¾9L¾9E¾9>¾97¾90¾9)¾9"¾9¾9¾9 ¾9¾9ÿ½9ø½9ñ½9ê½9ã½9ܽ9Õ½9ν9ǽ9À½9¹½9²½9«½9¤½9½9–½9½9ˆ½9½9z½9s½9l½9e½9^½9W½9P½9I½9B½9;½94½9-½9&½9½9½9½9 ½9½9ü¼9õ¼9î¼9ç¼9à¼9Ù¼9Ò¼9˼9ļ9½¼9¶¼9¯¼9¨¼9¡¼9š¼9“¼9Œ¼9…¼9~¼9w¼9p¼9i¼9b¼9[¼9T¼9M¼9F¼9?¼98¼91¼9*¼9#¼9¼9¼9¼9¼9¼9ù»9ò»9ë»9ä»9Ý»9Ö»9Ï»9È»9Á»9º»9³»9¬»9¥»9ž»9—»9»9‰»9‚»9{»9t»9m»9f»9_»9X»9Q»9J»9C»9<»95»9.»9'»9 »9»9»9 »9»9ýº9öº9ïº9èº9áº9Úº9Óº9̺9ź9¾º9·º9°º9©º9¢º9›º9”º9º9†º9º9xº9qº9jº9cº9\º9Uº9Nº9Gº9@º99º92º9+º9$º9º9º9º9º9º9ú¹9ó¹9ì¹9å¹9Þ¹9×¹9й9ɹ9¹9»¹9´¹9­¹9¦¹9Ÿ¹9˜¹9‘¹9й9ƒ¹9|¹9u¹9n¹9g¹9`¹9Y¹9R¹9K¹9D¹9=¹96¹9/¹9(¹9!¹9¹9¹9 ¹9¹9þ¸9÷¸9ð¸9é¸9â¸9Û¸9Ô¸9͸9Ƹ9¿¸9¸¸9±¸9ª¸9£¸9œ¸9•¸9ޏ9‡¸9€¸9y¸9r¸9k¸9d¸9]¸9V¸9O¸9H¸9A¸9:¸93¸9,¸9%¸9¸9¸9¸9 ¸9¸9û·9ô·9í·9æ·9ß·9Ø·9Ñ·9Ê·9÷9¼·9µ·9®·9§·9 ·9™·9’·9‹·9„·9}·9v·9o·9h·9a·9Z·9S·9L·9E·9>·97·90·9)·9"·9·9·9 ·9·9ÿ¶9ø¶9ñ¶9ê¶9ã¶9ܶ9Õ¶9ζ9Ƕ9À¶9¹¶9²¶9«¶9¤¶9¶9–¶9¶9ˆ¶9¶9z¶9s¶9l¶9e¶9^¶9W¶9P¶9I¶9B¶9;¶94¶9-¶9&¶9¶9¶9¶9 ¶9¶9üµ9õµ9îµ9çµ9àµ9Ùµ9Òµ9˵9ĵ9½µ9¶µ9¯µ9¨µ9¡µ9šµ9“µ9Œµ9…µ9~µ9wµ9pµ9iµ9bµ9[µ9Tµ9Mµ9Fµ9?µ98µ91µ9*µ9#µ9µ9µ9µ9µ9µ9ù´9ò´9ë´9ä´9Ý´9Ö´9Ï´9È´9Á´9º´9³´9¬´9¥´9ž´9—´9´9‰´9‚´9{´9t´9m´9f´9_´9X´9Q´9J´9C´9<´95´9.´9'´9 ´9´9´9 ´9´9ý³9ö³9ï³9è³9á³9Ú³9Ó³9̳9ų9¾³9·³9°³9©³9¢³9›³9”³9³9†³9³9x³9q³9j³9c³9\³9U³9N³9G³9@³99³92³9+³9$³9³9³9³9³9³9ú²9ó²9ì²9å²9Þ²9ײ9в9ɲ9²9»²9´²9­²9¦²9Ÿ²9˜²9‘²9в9ƒ²9|²9u²9n²9g²9`²9Y²9R²9K²9D²9=²96²9/²9(²9!²9²9²9 ²9²9þ±9÷±9ð±9é±9â±9Û±9Ô±9ͱ9Ʊ9¿±9¸±9±±9ª±9£±9œ±9•±9ޱ9‡±9€±9y±9r±9k±9d±9]±9V±9O±9H±9A±9:±93±9,±9%±9±9±9±9 ±9±9û°9ô°9í°9æ°9ß°9ذ9Ѱ9ʰ9ð9¼°9µ°9®°9§°9 °9™°9’°9‹°9„°9}°9v°9o°9h°9a°9Z°9S°9L°9E°9>°97°90°9)°9"°9°9°9 °9°9ÿ¯9ø¯9ñ¯9ê¯9ã¯9ܯ9Õ¯9ί9ǯ9À¯9¹¯9²¯9«¯9¤¯9¯9–¯9¯9ˆ¯9¯9z¯9s¯9l¯9e¯9^¯9W¯9P¯9I¯9B¯9;¯94¯9-¯9&¯9¯9¯9¯9 ¯9¯9ü®9õ®9î®9ç®9à®9Ù®9Ò®9Ë®9Ä®9½®9¶®9¯®9¨®9¡®9š®9“®9Œ®9…®9~®9w®9p®9i®9b®9[®9T®9M®9F®9?®98®91®9*®9#®9®9®9®9®9®9ù­9ò­9ë­9ä­9Ý­9Ö­9Ï­9È­9Á­9º­9³­9¬­9¥­9ž­9—­9­9‰­9‚­9{­9t­9m­9f­9_­9X­9Q­9J­9C­9<­95­9.­9'­9 ­9­9­9 ­9­9ý¬9ö¬9ï¬9è¬9á¬9Ú¬9Ó¬9̬9Ŭ9¾¬9·¬9°¬9©¬9¢¬9›¬9”¬9¬9†¬9¬9x¬9q¬9j¬9c¬9\¬9U¬9N¬9G¬9@¬99¬92¬9+¬9$¬9¬9¬9¬9¬9¬9ú«9ó«9ì«9å«9Þ«9׫9Ы9É«9«9»«9´«9­«9¦«9Ÿ«9˜«9‘«9Š«9ƒ«9|«9u«9n«9g«9`«9Y«9R«9K«9D«9=«96«9/«9(«9!«9«9«9 «9«9þª9÷ª9ðª9éª9âª9Ûª9Ôª9ͪ9ƪ9¿ª9¸ª9±ª9ªª9£ª9œª9•ª9Žª9‡ª9€ª9yª9rª9kª9dª9]ª9Vª9Oª9Hª9Aª9:ª93ª9,ª9%ª9ª9ª9ª9 ª9ª9û©9ô©9í©9æ©9ß©9Ø©9Ñ©9Ê©9é9¼©9µ©9®©9§©9 ©9™©9’©9‹©9„©9}©9v©9o©9h©9a©9Z©9S©9L©9E©9>©97©90©9)©9"©9©9©9 ©9©9ÿ¨9ø¨9ñ¨9ê¨9ã¨9ܨ9Õ¨9Ψ9Ǩ9À¨9¹¨9²¨9«¨9¤¨9¨9–¨9¨9ˆ¨9¨9z¨9s¨9l¨9e¨9^¨9W¨9P¨9I¨9B¨9;¨94¨9-¨9&¨9¨9¨9¨9 ¨9¨9ü§9õ§9î§9ç§9à§9Ù§9Ò§9˧9ħ9½§9¶§9¯§9¨§9¡§9š§9“§9Œ§9…§9~§9w§9p§9i§9b§9[§9T§9M§9F§9?§98§91§9*§9#§9§9§9§9§9§9ù¦9ò¦9ë¦9ä¦9ݦ9Ö¦9Ϧ9Ȧ9Á¦9º¦9³¦9¬¦9¥¦9ž¦9—¦9¦9‰¦9‚¦9{¦9t¦9m¦9f¦9_¦9X¦9Q¦9J¦9C¦9<¦95¦9.¦9'¦9 ¦9¦9¦9 ¦9¦9ý¥9ö¥9ï¥9è¥9á¥9Ú¥9Ó¥9Ì¥9Å¥9¾¥9·¥9°¥9©¥9¢¥9›¥9”¥9¥9†¥9¥9x¥9q¥9j¥9c¥9\¥9U¥9N¥9G¥9@¥99¥92¥9+¥9$¥9¥9¥9¥9¥9¥9ú¤9ó¤9ì¤9å¤9Þ¤9פ9Ф9ɤ9¤9»¤9´¤9­¤9¦¤9Ÿ¤9˜¤9‘¤9Ф9ƒ¤9|¤9u¤9n¤9g¤9`¤9Y¤9R¤9K¤9D¤9=¤96¤9/¤9(¤9!¤9¤9¤9 ¤9¤9þ£9÷£9ð£9é£9â£9Û£9Ô£9Í£9Æ£9¿£9¸£9±£9ª£9££9œ£9•£9Ž£9‡£9€£9y£9r£9k£9d£9]£9V£9O£9H£9A£9:£93£9,£9%£9£9£9£9 £9£9û¢9ô¢9í¢9æ¢9ߢ9Ø¢9Ñ¢9Ê¢9â9¼¢9µ¢9®¢9§¢9 ¢9™¢9’¢9‹¢9„¢9}¢9v¢9o¢9h¢9a¢9Z¢9S¢9L¢9E¢9>¢97¢90¢9)¢9"¢9¢9¢9 ¢9¢9ÿ¡9ø¡9ñ¡9ê¡9ã¡9Ü¡9Õ¡9Ρ9Ç¡9À¡9¹¡9²¡9«¡9¤¡9¡9–¡9¡9ˆ¡9¡9z¡9s¡9l¡9e¡9^¡9W¡9P¡9I¡9B¡9;¡94¡9-¡9&¡9¡9¡9¡9 ¡9¡9ü 9õ 9î 9ç 9à 9Ù 9Ò 9Ë 9Ä 9½ 9¶ 9¯ 9¨ 9¡ 9š 9“ 9Œ 9… 9~ 9w 9p 9i 9b 9[ 9T 9M 9F 9? 98 91 9* 9# 9 9 9 9 9 9ùŸ9òŸ9ëŸ9äŸ9ÝŸ9ÖŸ9ÏŸ9ÈŸ9ÁŸ9ºŸ9³Ÿ9¬Ÿ9¥Ÿ9žŸ9—Ÿ9Ÿ9‰Ÿ9‚Ÿ9{Ÿ9tŸ9mŸ9fŸ9_Ÿ9XŸ9QŸ9JŸ9CŸ9<Ÿ95Ÿ9.Ÿ9'Ÿ9 Ÿ9Ÿ9Ÿ9 Ÿ9Ÿ9ýž9öž9ïž9èž9áž9Úž9Óž9Ìž9Åž9¾ž9·ž9°ž9©ž9¢ž9›ž9”ž9ž9†ž9ž9xž9qž9jž9cž9\ž9Už9Nž9Gž9@ž99ž92ž9+ž9$ž9ž9ž9ž9ž9ž9ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þœ9÷œ9ðœ9éœ9âœ9Ûœ9Ôœ9Íœ9Æœ9¿œ9¸œ9±œ9ªœ9£œ9œœ9•œ9Žœ9‡œ9€œ9yœ9rœ9kœ9dœ9]œ9Vœ9Oœ9Hœ9Aœ9:œ93œ9,œ9%œ9œ9œ9œ9 œ9œ9û›9ô›9í›9æ›9ß›9Ø›9Ñ›9Ê›9Û9¼›9µ›9®›9§›9 ›9™›9’›9‹›9„›9}›9v›9o›9h›9a›9Z›9S›9L›9E›9>›97›90›9)›9"›9›9›9 ›9›9ÿš9øš9ñš9êš9ãš9Üš9Õš9Κ9Çš9Àš9¹š9²š9«š9¤š9š9–š9š9ˆš9š9zš9sš9lš9eš9^š9Wš9Pš9Iš9Bš9;š94š9-š9&š9š9š9š9 š9š9ü™9õ™9î™9ç™9à™9Ù™9Ò™9Ë™9Ä™9½™9¶™9¯™9¨™9¡™9š™9“™9Œ™9…™9~™9w™9p™9i™9b™9[™9T™9M™9F™9?™98™91™9*™9#™9™9™9™9™9™9ù˜9ò˜9ë˜9ä˜9ݘ9Ö˜9Ϙ9Ș9Á˜9º˜9³˜9¬˜9¥˜9ž˜9—˜9˜9‰˜9‚˜9{˜9t˜9m˜9f˜9_˜9X˜9Q˜9J˜9C˜9<˜95˜9.˜9'˜9 ˜9˜9˜9 ˜9˜9ý—9ö—9ï—9è—9á—9Ú—9Ó—9Ì—9Å—9¾—9·—9°—9©—9¢—9›—9”—9—9†—9—9x—9q—9j—9c—9\—9U—9N—9G—9@—99—92—9+—9$—9—9—9—9—9—9ú–9ó–9ì–9å–9Þ–9×–9Ж9É–9–9»–9´–9­–9¦–9Ÿ–9˜–9‘–9Š–9ƒ–9|–9u–9n–9g–9`–9Y–9R–9K–9D–9=–96–9/–9(–9!–9–9–9 –9–9þ•9÷•9ð•9é•9â•9Û•9Ô•9Í•9Æ•9¿•9¸•9±•9ª•9£•9œ•9••9Ž•9‡•9€•9y•9r•9k•9d•9]•9V•9O•9H•9A•9:•93•9,•9%•9•9•9•9 •9•9û”9ô”9í”9æ”9ß”9Ø”9Ñ”9Ê”9Ô9¼”9µ”9®”9§”9 ”9™”9’”9‹”9„”9}”9v”9o”9h”9a”9Z”9S”9L”9E”9>”97”90”9)”9"”9”9”9 ”9”9ÿ“9ø“9ñ“9ê“9ã“9Ü“9Õ“9Γ9Ç“9À“9¹“9²“9«“9¤“9“9–“9“9ˆ“9“9z“9s“9l“9e“9^“9W“9P“9I“9B“9;“94“9-“9&“9“9“9“9 “9“9ü’9õ’9î’9ç’9à’9Ù’9Ò’9Ë’9Ä’9½’9¶’9¯’9¨’9¡’9š’9“’9Œ’9…’9~’9w’9p’9i’9b’9[’9T’9M’9F’9?’98’91’9*’9#’9’9’9’9’9’9ù‘9ò‘9ë‘9ä‘9Ý‘9Ö‘9Ï‘9È‘9Á‘9º‘9³‘9¬‘9¥‘9ž‘9—‘9‘9‰‘9‚‘9{‘9t‘9m‘9f‘9_‘9X‘9Q‘9J‘9C‘9<‘95‘9.‘9'‘9 ‘9‘9‘9 ‘9‘9ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þŽ9÷Ž9ðŽ9éŽ9âŽ9ÛŽ9ÔŽ9ÍŽ9ÆŽ9¿Ž9¸Ž9±Ž9ªŽ9£Ž9œŽ9•Ž9ŽŽ9‡Ž9€Ž9yŽ9rŽ9kŽ9dŽ9]Ž9VŽ9OŽ9HŽ9AŽ9:Ž93Ž9,Ž9%Ž9Ž9Ž9Ž9 Ž9Ž9û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿŒ9øŒ9ñŒ9êŒ9ãŒ9ÜŒ9ÕŒ9ÎŒ9ÇŒ9ÀŒ9¹Œ9²Œ9«Œ9¤Œ9Œ9–Œ9Œ9ˆŒ9Œ9zŒ9sŒ9lŒ9eŒ9^Œ9WŒ9PŒ9IŒ9BŒ9;Œ94Œ9-Œ9&Œ9Œ9Œ9Œ9 Œ9Œ9ü‹9õ‹9î‹9ç‹9à‹9Ù‹9Ò‹9Ë‹9Ä‹9½‹9¶‹9¯‹9¨‹9¡‹9š‹9“‹9Œ‹9…‹9~‹9w‹9p‹9i‹9b‹9[‹9T‹9M‹9F‹9?‹98‹91‹9*‹9#‹9‹9‹9‹9‹9‹9ùŠ9òŠ9ëŠ9äŠ9ÝŠ9ÖŠ9ÏŠ9ÈŠ9ÁŠ9ºŠ9³Š9¬Š9¥Š9žŠ9—Š9Š9‰Š9‚Š9{Š9tŠ9mŠ9fŠ9_Š9XŠ9QŠ9JŠ9CŠ9<Š95Š9.Š9'Š9 Š9Š9Š9 Š9Š9ý‰9ö‰9ï‰9è‰9á‰9Ú‰9Ó‰9̉9ʼn9¾‰9·‰9°‰9©‰9¢‰9›‰9”‰9‰9†‰9‰9x‰9q‰9j‰9c‰9\‰9U‰9N‰9G‰9@‰99‰92‰9+‰9$‰9‰9‰9‰9‰9‰9úˆ9óˆ9ìˆ9åˆ9Þˆ9׈9Ј9Ɉ9ˆ9»ˆ9´ˆ9­ˆ9¦ˆ9Ÿˆ9˜ˆ9‘ˆ9Šˆ9ƒˆ9|ˆ9uˆ9nˆ9gˆ9`ˆ9Yˆ9Rˆ9Kˆ9Dˆ9=ˆ96ˆ9/ˆ9(ˆ9!ˆ9ˆ9ˆ9 ˆ9ˆ9þ‡9÷‡9ð‡9é‡9â‡9Û‡9Ô‡9͇9Ƈ9¿‡9¸‡9±‡9ª‡9£‡9œ‡9•‡9އ9‡‡9€‡9y‡9r‡9k‡9d‡9]‡9V‡9O‡9H‡9A‡9:‡93‡9,‡9%‡9‡9‡9‡9 ‡9‡9û†9ô†9í†9æ†9߆9؆9ц9ʆ9Æ9¼†9µ†9®†9§†9 †9™†9’†9‹†9„†9}†9v†9o†9h†9a†9Z†9S†9L†9E†9>†97†90†9)†9"†9†9†9 †9†9ÿ…9ø…9ñ…9ê…9ã…9Ü…9Õ…9Î…9Ç…9À…9¹…9²…9«…9¤…9…9–…9…9ˆ…9…9z…9s…9l…9e…9^…9W…9P…9I…9B…9;…94…9-…9&…9…9…9…9 …9…9ü„9õ„9î„9ç„9à„9Ù„9Ò„9Ë„9Ä„9½„9¶„9¯„9¨„9¡„9š„9“„9Œ„9…„9~„9w„9p„9i„9b„9[„9T„9M„9F„9?„98„91„9*„9#„9„9„9„9„9„9ùƒ9òƒ9ëƒ9äƒ9݃9Öƒ9σ9ȃ9Áƒ9ºƒ9³ƒ9¬ƒ9¥ƒ9žƒ9—ƒ9ƒ9‰ƒ9‚ƒ9{ƒ9tƒ9mƒ9fƒ9_ƒ9Xƒ9Qƒ9Jƒ9Cƒ9<ƒ95ƒ9.ƒ9'ƒ9 ƒ9ƒ9ƒ9 ƒ9ƒ9ý‚9ö‚9ï‚9è‚9á‚9Ú‚9Ó‚9Ì‚9Å‚9¾‚9·‚9°‚9©‚9¢‚9›‚9”‚9‚9†‚9‚9x‚9q‚9j‚9c‚9\‚9U‚9N‚9G‚9@‚99‚92‚9+‚9$‚9‚9‚9‚9‚9‚9ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ€9÷€9ð€9é€9â€9Û€9Ô€9Í€9Æ€9¿€9¸€9±€9ª€9£€9œ€9•€9Ž€9‡€9€€9y€9r€9k€9d€9]€9V€9O€9H€9A€9:€93€9,€9%€9€9€9€9 €9€9û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ~9ø~9ñ~9ê~9ã~9Ü~9Õ~9Î~9Ç~9À~9¹~9²~9«~9¤~9~9–~9~9ˆ~9~9z~9s~9l~9e~9^~9W~9P~9I~9B~9;~94~9-~9&~9~9~9~9 ~9~9ü}9õ}9î}9ç}9à}9Ù}9Ò}9Ë}9Ä}9½}9¶}9¯}9¨}9¡}9š}9“}9Œ}9…}9~}9w}9p}9i}9b}9[}9T}9M}9F}9?}98}91}9*}9#}9}9}9}9}9}9ù|9ò|9ë|9ä|9Ý|9Ö|9Ï|9È|9Á|9º|9³|9¬|9¥|9ž|9—|9|9‰|9‚|9{|9t|9m|9f|9_|9X|9Q|9J|9C|9<|95|9.|9'|9 |9|9|9 |9|9ý{9ö{9ï{9è{9á{9Ú{9Ó{9Ì{9Å{9¾{9·{9°{9©{9¢{9›{9”{9{9†{9{9x{9q{9j{9c{9\{9U{9N{9G{9@{99{92{9+{9${9{9{9{9{9{9úz9óz9ìz9åz9Þz9×z9Ðz9Éz9Âz9»z9´z9­z9¦z9Ÿz9˜z9‘z9Šz9ƒz9|z9uz9nz9gz9`z9Yz9Rz9Kz9Dz9=z96z9/z9(z9!z9z9z9 z9z9þy9÷y9ðy9éy9ây9Ûy9Ôy9Íy9Æy9¿y9¸y9±y9ªy9£y9œy9•y9Žy9‡y9€y9yy9ry9ky9dy9]y9Vy9Oy9Hy9Ay9:y93y9,y9%y9y9y9y9 y9y9ûx9ôx9íx9æx9ßx9Øx9Ñx9Êx9Ãx9¼x9µx9®x9§x9 x9™x9’x9‹x9„x9}x9vx9ox9hx9ax9Zx9Sx9Lx9Ex9>x97x90x9)x9"x9x9x9 x9x9ÿw9øw9ñw9êw9ãw9Üw9Õw9Îw9Çw9Àw9¹w9²w9«w9¤w9w9–w9w9ˆw9w9zw9sw9lw9ew9^w9Ww9Pw9Iw9Bw9;w94w9-w9&w9w9w9w9 w9w9üv9õv9îv9çv9àv9Ùv9Òv9Ëv9Äv9½v9¶v9¯v9¨v9¡v9šv9“v9Œv9…v9~v9wv9pv9iv9bv9[v9Tv9Mv9Fv9?v98v91v9*v9#v9v9v9v9v9v9ùu9òu9ëu9äu9Ýu9Öu9Ïu9Èu9Áu9ºu9³u9¬u9¥u9žu9—u9u9‰u9‚u9{u9tu9mu9fu9_u9Xu9Qu9Ju9Cu9q97q90q9)q9"q9q9q9 q9q9ÿp9øp9ñp9êp9ãp9Üp9Õp9Îp9Çp9Àp9¹p9²p9«p9¤p9p9–p9p9ˆp9p9zp9sp9lp9ep9^p9Wp9Pp9Ip9Bp9;p94p9-p9&p9p9p9p9 p9p9üo9õo9îo9ço9ào9Ùo9Òo9Ëo9Äo9½o9¶o9¯o9¨o9¡o9šo9“o9Œo9…o9~o9wo9po9io9bo9[o9To9Mo9Fo9?o98o91o9*o9#o9o9o9o9o9o9ùn9òn9ën9än9Ýn9Ön9Ïn9Èn9Án9ºn9³n9¬n9¥n9žn9—n9n9‰n9‚n9{n9tn9mn9fn9_n9Xn9Qn9Jn9Cn9j97j90j9)j9"j9j9j9 j9j9ÿi9øi9ñi9êi9ãi9Üi9Õi9Îi9Çi9Ài9¹i9²i9«i9¤i9i9–i9i9ˆi9i9zi9si9li9ei9^i9Wi9Pi9Ii9Bi9;i94i9-i9&i9i9i9i9 i9i9üh9õh9îh9çh9àh9Ùh9Òh9Ëh9Äh9½h9¶h9¯h9¨h9¡h9šh9“h9Œh9…h9~h9wh9ph9ih9bh9[h9Th9Mh9Fh9?h98h91h9*h9#h9h9h9h9h9h9ùg9òg9ëg9äg9Ýg9Ög9Ïg9Èg9Ág9ºg9³g9¬g9¥g9žg9—g9g9‰g9‚g9{g9tg9mg9fg9_g9Xg9Qg9Jg9Cg9c97c90c9)c9"c9c9c9 c9c9ÿb9øb9ñb9êb9ãb9Üb9Õb9Îb9Çb9Àb9¹b9²b9«b9¤b9b9–b9b9ˆb9b9zb9sb9lb9eb9^b9Wb9Pb9Ib9Bb9;b94b9-b9&b9b9b9b9 b9b9üa9õa9îa9ça9àa9Ùa9Òa9Ëa9Äa9½a9¶a9¯a9¨a9¡a9ša9“a9Œa9…a9~a9wa9pa9ia9ba9[a9Ta9Ma9Fa9?a98a91a9*a9#a9a9a9a9a9a9ù`9ò`9ë`9ä`9Ý`9Ö`9Ï`9È`9Á`9º`9³`9¬`9¥`9ž`9—`9`9‰`9‚`9{`9t`9m`9f`9_`9X`9Q`9J`9C`9<`95`9.`9'`9 `9`9`9 `9`9ý_9ö_9ï_9è_9á_9Ú_9Ó_9Ì_9Å_9¾_9·_9°_9©_9¢_9›_9”_9_9†_9_9x_9q_9j_9c_9\_9U_9N_9G_9@_99_92_9+_9$_9_9_9_9_9_9ú^9ó^9ì^9å^9Þ^9×^9Ð^9É^9Â^9»^9´^9­^9¦^9Ÿ^9˜^9‘^9Š^9ƒ^9|^9u^9n^9g^9`^9Y^9R^9K^9D^9=^96^9/^9(^9!^9^9^9 ^9^9þ]9÷]9ð]9é]9â]9Û]9Ô]9Í]9Æ]9¿]9¸]9±]9ª]9£]9œ]9•]9Ž]9‡]9€]9y]9r]9k]9d]9]]9V]9O]9H]9A]9:]93]9,]9%]9]9]9]9 ]9]9û\9ô\9í\9æ\9ß\9Ø\9Ñ\9Ê\9Ã\9¼\9µ\9®\9§\9 \9™\9’\9‹\9„\9}\9v\9o\9h\9a\9Z\9S\9L\9E\9>\97\90\9)\9"\9\9\9 \9\9ÿ[9ø[9ñ[9ê[9ã[9Ü[9Õ[9Î[9Ç[9À[9¹[9²[9«[9¤[9[9–[9[9ˆ[9[9z[9s[9l[9e[9^[9W[9P[9I[9B[9;[94[9-[9&[9[9[9[9 [9[9üZ9õZ9îZ9çZ9àZ9ÙZ9ÒZ9ËZ9ÄZ9½Z9¶Z9¯Z9¨Z9¡Z9šZ9“Z9ŒZ9…Z9~Z9wZ9pZ9iZ9bZ9[Z9TZ9MZ9FZ9?Z98Z91Z9*Z9#Z9Z9Z9Z9Z9Z9ùY9òY9ëY9äY9ÝY9ÖY9ÏY9ÈY9ÁY9ºY9³Y9¬Y9¥Y9žY9—Y9Y9‰Y9‚Y9{Y9tY9mY9fY9_Y9XY9QY9JY9CY9U97U90U9)U9"U9U9U9 U9U9ÿT9øT9ñT9êT9ãT9ÜT9ÕT9ÎT9ÇT9ÀT9¹T9²T9«T9¤T9T9–T9T9ˆT9T9zT9sT9lT9eT9^T9WT9PT9IT9BT9;T94T9-T9&T9T9T9T9 T9T9üS9õS9îS9çS9àS9ÙS9ÒS9ËS9ÄS9½S9¶S9¯S9¨S9¡S9šS9“S9ŒS9…S9~S9wS9pS9iS9bS9[S9TS9MS9FS9?S98S91S9*S9#S9S9S9S9S9S9ùR9òR9ëR9äR9ÝR9ÖR9ÏR9ÈR9ÁR9ºR9³R9¬R9¥R9žR9—R9R9‰R9‚R9{R9tR9mR9fR9_R9XR9QR9JR9CR9N97N90N9)N9"N9N9N9 N9N9ÿM9øM9ñM9êM9ãM9ÜM9ÕM9ÎM9ÇM9ÀM9¹M9²M9«M9¤M9M9–M9M9ˆM9M9zM9sM9lM9eM9^M9WM9PM9IM9BM9;M94M9-M9&M9M9M9M9 M9M9üL9õL9îL9çL9àL9ÙL9ÒL9ËL9ÄL9½L9¶L9¯L9¨L9¡L9šL9“L9ŒL9…L9~L9wL9pL9iL9bL9[L9TL9ML9FL9?L98L91L9*L9#L9L9L9L9L9L9ùK9òK9ëK9äK9ÝK9ÖK9ÏK9ÈK9ÁK9ºK9³K9¬K9¥K9žK9—K9K9‰K9‚K9{K9tK9mK9fK9_K9XK9QK9JK9CK9G97G90G9)G9"G9G9G9 G9G9ÿF9øF9ñF9êF9ãF9ÜF9ÕF9ÎF9ÇF9ÀF9¹F9²F9«F9¤F9F9–F9F9ˆF9F9zF9sF9lF9eF9^F9WF9PF9IF9BF9;F94F9-F9&F9F9F9F9 F9F9üE9õE9îE9çE9àE9ÙE9ÒE9ËE9ÄE9½E9¶E9¯E9¨E9¡E9šE9“E9ŒE9…E9~E9wE9pE9iE9bE9[E9TE9ME9FE9?E98E91E9*E9#E9E9E9E9E9E9ùD9òD9ëD9äD9ÝD9ÖD9ÏD9ÈD9ÁD9ºD9³D9¬D9¥D9žD9—D9D9‰D9‚D9{D9tD9mD9fD9_D9XD9QD9JD9CD9@97@90@9)@9"@9@9@9 @9@9ÿ?9ø?9ñ?9ê?9ã?9Ü?9Õ?9Î?9Ç?9À?9¹?9²?9«?9¤?9?9–?9?9ˆ?9?9z?9s?9l?9e?9^?9W?9P?9I?9B?9;?94?9-?9&?9?9?9?9 ?9?9ü>9õ>9î>9ç>9à>9Ù>9Ò>9Ë>9Ä>9½>9¶>9¯>9¨>9¡>9š>9“>9Œ>9…>9~>9w>9p>9i>9b>9[>9T>9M>9F>9?>98>91>9*>9#>9>9>9>9>9>9ù=9ò=9ë=9ä=9Ý=9Ö=9Ï=9È=9Á=9º=9³=9¬=9¥=9ž=9—=9=9‰=9‚=9{=9t=9m=9f=9_=9X=9Q=9J=9C=9<=95=9.=9'=9 =9=9=9 =9=9ý<9ö<9ï<9è<9á<9Ú<9Ó<9Ì<9Å<9¾<9·<9°<9©<9¢<9›<9”<9<9†<9<9x<9q<9j<9c<9\<9U<9N<9G<9@<99<92<9+<9$<9<9<9<9<9<9ú;9ó;9ì;9å;9Þ;9×;9Ð;9É;9Â;9»;9´;9­;9¦;9Ÿ;9˜;9‘;9Š;9ƒ;9|;9u;9n;9g;9`;9Y;9R;9K;9D;9=;96;9/;9(;9!;9;9;9 ;9;9þ:9÷:9ð:9é:9â:9Û:9Ô:9Í:9Æ:9¿:9¸:9±:9ª:9£:9œ:9•:9Ž:9‡:9€:9y:9r:9k:9d:9]:9V:9O:9H:9A:9::93:9,:9%:9:9:9:9 :9:9û99ô99í99æ99ß99Ø99Ñ99Ê99Ã99¼99µ99®99§99 99™99’99‹99„99}99v99o99h99a99Z99S99L99E99>99799099)99"999999 9999ÿ89ø89ñ89ê89ã89Ü89Õ89Î89Ç89À89¹89²89«89¤8989–8989ˆ8989z89s89l89e89^89W89P89I89B89;89489-89&89898989 8989ü79õ79î79ç79à79Ù79Ò79Ë79Ä79½79¶79¯79¨79¡79š79“79Œ79…79~79w79p79i79b79[79T79M79F79?79879179*79#797979797979ù69ò69ë69ä69Ý69Ö69Ï69È69Á69º69³69¬69¥69ž69—6969‰69‚69{69t69m69f69_69X69Q69J69C69<69569.69'69 696969 6969ý59ö59ï59è59á59Ú59Ó59Ì59Å59¾59·59°59©59¢59›59”5959†5959x59q59j59c59\59U59N59G59@59959259+59$595959595959ú49ó49ì49å49Þ49×49Ð49É49Â49»49´49­49¦49Ÿ49˜49‘49Š49ƒ49|49u49n49g49`49Y49R49K49D49=49649/49(49!494949 4949þ39÷39ð39é39â39Û39Ô39Í39Æ39¿39¸39±39ª39£39œ39•39Ž39‡39€39y39r39k39d39]39V39O39H39A39:39339,39%39393939 3939û29ô29í29æ29ß29Ø29Ñ29Ê29Ã29¼29µ29®29§29 29™29’29‹29„29}29v29o29h29a29Z29S29L29E29>29729029)29"292929 2929ÿ19ø19ñ19ê19ã19Ü19Õ19Î19Ç19À19¹19²19«19¤1919–1919ˆ1919z19s19l19e19^19W19P19I19B19;19419-19&19191919 1919ü09õ09î09ç09à09Ù09Ò09Ë09Ä09½09¶09¯09¨09¡09š09“09Œ09…09~09w09p09i09b09[09T09M09F09?09809109*09#090909090909ù/9ò/9ë/9ä/9Ý/9Ö/9Ï/9È/9Á/9º/9³/9¬/9¥/9ž/9—/9/9‰/9‚/9{/9t/9m/9f/9_/9X/9Q/9J/9C/9+97+90+9)+9"+9+9+9 +9+9ÿ*9ø*9ñ*9ê*9ã*9Ü*9Õ*9Î*9Ç*9À*9¹*9²*9«*9¤*9*9–*9*9ˆ*9*9z*9s*9l*9e*9^*9W*9P*9I*9B*9;*94*9-*9&*9*9*9*9 *9*9ü)9õ)9î)9ç)9à)9Ù)9Ò)9Ë)9Ä)9½)9¶)9¯)9¨)9¡)9š)9“)9Œ)9…)9~)9w)9p)9i)9b)9[)9T)9M)9F)9?)98)91)9*)9#)9)9)9)9)9)9ù(9ò(9ë(9ä(9Ý(9Ö(9Ï(9È(9Á(9º(9³(9¬(9¥(9ž(9—(9(9‰(9‚(9{(9t(9m(9f(9_(9X(9Q(9J(9C(9<(95(9.(9'(9 (9(9(9 (9(9ý'9ö'9ï'9è'9á'9Ú'9Ó'9Ì'9Å'9¾'9·'9°'9©'9¢'9›'9”'9'9†'9'9x'9q'9j'9c'9\'9U'9N'9G'9@'99'92'9+'9$'9'9'9'9'9'9ú&9ó&9ì&9å&9Þ&9×&9Ð&9É&9Â&9»&9´&9­&9¦&9Ÿ&9˜&9‘&9Š&9ƒ&9|&9u&9n&9g&9`&9Y&9R&9K&9D&9=&96&9/&9(&9!&9&9&9 &9&9þ%9÷%9ð%9é%9â%9Û%9Ô%9Í%9Æ%9¿%9¸%9±%9ª%9£%9œ%9•%9Ž%9‡%9€%9y%9r%9k%9d%9]%9V%9O%9H%9A%9:%93%9,%9%%9%9%9%9 %9%9û$9ô$9í$9æ$9ß$9Ø$9Ñ$9Ê$9Ã$9¼$9µ$9®$9§$9 $9™$9’$9‹$9„$9}$9v$9o$9h$9a$9Z$9S$9L$9E$9>$97$90$9)$9"$9$9$9 $9$9ÿ#9ø#9ñ#9ê#9ã#9Ü#9Õ#9Î#9Ç#9À#9¹#9²#9«#9¤#9#9–#9#9ˆ#9#9z#9s#9l#9e#9^#9W#9P#9I#9B#9;#94#9-#9 #9#9#9 #9#9ü"9õ"9î"9ç"9à"9Ù"9Ò"9Ë"9Ä"9½"9¶"9¯"9¨"9¡"9š"9“"9Œ"9…"9~"9w"9p"9i"9b"9["9T"9M"9F"9?"98"91"9*"9#"9"9"9"9"9"9ù!9ò!9ë!9ä!9Ý!9Ö!9Ï!9È!9Á!9º!9³!9¬!9¥!9ž!9—!9!9‰!9‚!9{!9t!9m!9f!9_!9X!9Q!9J!9C!997909)9"999 99ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü 9õ 9î 9ç 9à 9Ù 9Ò 9Ë 9Ä 9½ 9¶ 9¯ 9¨ 9¡ 9š 9“ 9Œ 9… 9~ 9w 9p 9i 9b 9[ 9T 9M 9F 9? 98 91 9* 9# 9 9 9 9 9 9ù 9ò 9ë 9ä 9Ý 9Ö 9Ï 9È 9Á 9º 9³ 9¬ 9¥ 9ž 9— 9 9‰ 9‚ 9{ 9t 9m 9f 9_ 9X 9Q 9J 9C 9< 95 9. 9' 9 9 9 9 9 9ý 9ö 9ï 9è 9á 9Ú 9Ó 9Ì 9Å 9¾ 9· 9° 9© 9¢ 9› 9” 9 9† 9 9x 9q 9j 9c 9\ 9U 9N 9G 9@ 99 92 9+ 9$ 9 9 9 9 9 9ú 9ó 9ì 9å 9Þ 9× 9Ð 9É 9 9» 9´ 9­ 9¦ 9Ÿ 9˜ 9‘ 9Š 9ƒ 9| 9u 9n 9g 9` 9Y 9R 9K 9D 9= 96 9/ 9( 9! 9 9 9 9 9þ 9÷ 9ð 9é 9â 9Û 9Ô 9Í 9Æ 9¿ 9¸ 9± 9ª 9£ 9œ 9• 9Ž 9‡ 9€ 9y 9r 9k 9d 9] 9V 9O 9H 9A 9: 93 9, 9% 9 9 9 9 9 9û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99üÿ8õÿ8îÿ8çÿ8àÿ8Ùÿ8Òÿ8Ëÿ8Äÿ8½ÿ8¶ÿ8¯ÿ8¨ÿ8¡ÿ8šÿ8“ÿ8Œÿ8…ÿ8~ÿ8wÿ8pÿ8iÿ8bÿ8[ÿ8Tÿ8Mÿ8Fÿ8?ÿ88ÿ81ÿ8*ÿ8#ÿ8ÿ8ÿ8ÿ8ÿ8ÿ8ùþ8òþ8ëþ8äþ8Ýþ8Öþ8Ïþ8Èþ8Áþ8ºþ8³þ8¬þ8¥þ8žþ8—þ8þ8‰þ8‚þ8{þ8tþ8mþ8fþ8_þ8Xþ8Qþ8Jþ8Cþ8<þ85þ8.þ8'þ8 þ8þ8þ8 þ8þ8ýý8öý8ïý8èý8áý8Úý8Óý8Ìý8Åý8¾ý8·ý8°ý8©ý8¢ý8›ý8”ý8ý8†ý8ý8xý8qý8jý8cý8\ý8Uý8Ný8Gý8@ý89ý82ý8+ý8$ý8ý8ý8ý8ý8ý8úü8óü8ìü8åü8Þü8×ü8Ðü8Éü8Âü8»ü8´ü8­ü8¦ü8Ÿü8˜ü8‘ü8Šü8ƒü8|ü8uü8nü8gü8`ü8Yü8Rü8Kü8Dü8=ü86ü8/ü8(ü8!ü8ü8ü8 ü8ü8þû8÷û8ðû8éû8âû8Ûû8Ôû8Íû8Æû8¿û8¸û8±û8ªû8£û8œû8•û8Žû8‡û8€û8yû8rû8kû8dû8]û8Vû8Oû8Hû8Aû8:û83û8,û8%û8û8û8û8 û8û8ûú8ôú8íú8æú8ßú8Øú8Ñú8Êú8Ãú8¼ú8µú8®ú8§ú8 ú8™ú8’ú8‹ú8„ú8}ú8vú8oú8hú8aú8Zú8Sú8Lú8Eú8>ú87ú80ú8)ú8"ú8ú8ú8 ú8ú8ÿù8øù8ñù8êù8ãù8Üù8Õù8Îù8Çù8Àù8¹ù8²ù8«ù8¤ù8ù8–ù8ù8ˆù8ù8zù8sù8lù8eù8^ù8Wù8Pù8Iù8Bù8;ù84ù8-ù8&ù8ù8ù8ù8 ù8ù8üø8õø8îø8çø8àø8Ùø8Òø8Ëø8Äø8½ø8¶ø8¯ø8¨ø8¡ø8šø8“ø8Œø8…ø8~ø8wø8pø8iø8bø8[ø8Tø8Mø8Fø8?ø88ø81ø8*ø8#ø8ø8ø8ø8ø8ø8ù÷8ò÷8ë÷8ä÷8Ý÷8Ö÷8Ï÷8È÷8Á÷8º÷8³÷8¬÷8¥÷8ž÷8—÷8÷8‰÷8‚÷8{÷8t÷8m÷8f÷8_÷8X÷8Q÷8J÷8C÷8<÷85÷8.÷8'÷8 ÷8÷8÷8 ÷8÷8ýö8öö8ïö8èö8áö8Úö8Óö8Ìö8Åö8¾ö8·ö8°ö8©ö8¢ö8›ö8”ö8ö8†ö8ö8xö8qö8jö8cö8\ö8Uö8Nö8Gö8@ö89ö82ö8+ö8$ö8ö8ö8ö8ö8ö8úõ8óõ8ìõ8åõ8Þõ8×õ8Ðõ8Éõ8Âõ8»õ8´õ8­õ8¦õ8Ÿõ8˜õ8‘õ8Šõ8ƒõ8|õ8uõ8nõ8gõ8`õ8Yõ8Rõ8Kõ8Dõ8=õ86õ8/õ8(õ8!õ8õ8õ8 õ8õ8þô8÷ô8ðô8éô8âô8Ûô8Ôô8Íô8Æô8¿ô8¸ô8±ô8ªô8£ô8œô8•ô8Žô8‡ô8€ô8yô8rô8kô8dô8]ô8Vô8Oô8Hô8Aô8:ô83ô8,ô8%ô8ô8ô8ô8 ô8ô8ûó8ôó8íó8æó8ßó8Øó8Ñó8Êó8Ãó8¼ó8µó8®ó8§ó8 ó8™ó8’ó8‹ó8„ó8}ó8vó8oó8hó8aó8Zó8Só8Ló8Eó8>ó87ó80ó8)ó8"ó8ó8ó8 ó8ó8ÿò8øò8ñò8êò8ãò8Üò8Õò8Îò8Çò8Àò8¹ò8²ò8«ò8¤ò8ò8–ò8ò8ˆò8ò8zò8sò8lò8eò8^ò8Wò8Pò8Iò8Bò8;ò84ò8-ò8&ò8ò8ò8ò8 ò8ò8üñ8õñ8îñ8çñ8àñ8Ùñ8Òñ8Ëñ8Äñ8½ñ8¶ñ8¯ñ8¨ñ8¡ñ8šñ8“ñ8Œñ8…ñ8~ñ8wñ8pñ8iñ8bñ8[ñ8Tñ8Mñ8Fñ8?ñ88ñ81ñ8*ñ8#ñ8ñ8ñ8ñ8ñ8ñ8ùð8òð8ëð8äð8Ýð8Öð8Ïð8Èð8Áð8ºð8³ð8¬ð8¥ð8žð8—ð8ð8‰ð8‚ð8{ð8tð8mð8fð8_ð8Xð8Qð8Jð8Cð8<ð85ð8.ð8'ð8 ð8ð8ð8 ð8ð8ýï8öï8ïï8èï8áï8Úï8Óï8Ìï8Åï8¾ï8·ï8°ï8©ï8¢ï8›ï8”ï8ï8†ï8ï8xï8qï8jï8cï8\ï8Uï8Nï8Gï8@ï89ï82ï8+ï8$ï8ï8ï8ï8ï8ï8úî8óî8ìî8åî8Þî8×î8Ðî8Éî8Âî8»î8´î8­î8¦î8Ÿî8˜î8‘î8Šî8ƒî8|î8uî8nî8gî8`î8Yî8Rî8Kî8Dî8=î86î8/î8(î8!î8î8î8 î8î8þí8÷í8ðí8éí8âí8Ûí8Ôí8Íí8Æí8¿í8¸í8±í8ªí8£í8œí8•í8Ží8‡í8€í8yí8rí8kí8dí8]í8Ví8Oí8Hí8Aí8:í83í8,í8%í8í8í8í8 í8í8ûì8ôì8íì8æì8ßì8Øì8Ñì8Êì8Ãì8¼ì8µì8®ì8§ì8 ì8™ì8’ì8‹ì8„ì8}ì8vì8oì8hì8aì8Zì8Sì8Lì8Eì8>ì87ì80ì8)ì8"ì8ì8ì8 ì8ì8ÿë8øë8ñë8êë8ãë8Üë8Õë8Îë8Çë8Àë8¹ë8²ë8«ë8¤ë8ë8–ë8ë8ˆë8ë8zë8së8lë8eë8^ë8Wë8Pë8Ië8Bë8;ë84ë8-ë8&ë8ë8ë8ë8 ë8ë8üê8õê8îê8çê8àê8Ùê8Òê8Ëê8Äê8½ê8¶ê8¯ê8¨ê8¡ê8šê8“ê8Œê8…ê8~ê8wê8pê8iê8bê8[ê8Tê8Mê8Fê8?ê88ê81ê8*ê8#ê8ê8ê8ê8ê8ê8ùé8òé8ëé8äé8Ýé8Öé8Ïé8Èé8Áé8ºé8³é8¬é8¥é8žé8—é8é8‰é8‚é8{é8té8mé8fé8_é8Xé8Qé8Jé8Cé8<é85é8.é8'é8 é8é8é8 é8é8ýè8öè8ïè8èè8áè8Úè8Óè8Ìè8Åè8¾è8·è8°è8©è8¢è8›è8”è8è8†è8è8xè8qè8jè8cè8\è8Uè8Nè8Gè8@è89è82è8+è8$è8è8è8è8è8è8úç8óç8ìç8åç8Þç8×ç8Ðç8Éç8Âç8»ç8´ç8­ç8¦ç8Ÿç8˜ç8‘ç8Šç8ƒç8|ç8uç8nç8gç8`ç8Yç8Rç8Kç8Dç8=ç86ç8/ç8(ç8!ç8ç8ç8 ç8ç8þæ8÷æ8ðæ8éæ8âæ8Ûæ8Ôæ8Íæ8Ææ8¿æ8¸æ8±æ8ªæ8£æ8œæ8•æ8Žæ8‡æ8€æ8yæ8ræ8kæ8dæ8]æ8Væ8Oæ8Hæ8Aæ8:æ83æ8,æ8%æ8æ8æ8æ8 æ8æ8ûå8ôå8íå8æå8ßå8Øå8Ñå8Êå8Ãå8¼å8µå8®å8§å8 å8™å8’å8‹å8„å8}å8vå8oå8hå8aå8Zå8Så8Lå8Eå8>å87å80å8)å8"å8å8å8 å8å8ÿä8øä8ñä8êä8ãä8Üä8Õä8Îä8Çä8Àä8¹ä8²ä8«ä8¤ä8ä8–ä8ä8ˆä8ä8zä8sä8lä8eä8^ä8Wä8Pä8Iä8Bä8;ä84ä8-ä8&ä8ä8ä8ä8 ä8ä8üã8õã8îã8çã8àã8Ùã8Òã8Ëã8Äã8½ã8¶ã8¯ã8¨ã8¡ã8šã8“ã8Œã8…ã8~ã8wã8pã8iã8bã8[ã8Tã8Mã8Fã8?ã88ã81ã8*ã8#ã8ã8ã8ã8ã8ã8ùâ8òâ8ëâ8äâ8Ýâ8Öâ8Ïâ8Èâ8Áâ8ºâ8³â8¬â8¥â8žâ8—â8â8‰â8‚â8{â8tâ8mâ8fâ8_â8Xâ8Qâ8Jâ8Câ8<â85â8.â8'â8 â8â8â8 â8â8ýá8öá8ïá8èá8áá8Úá8Óá8Ìá8Åá8¾á8·á8°á8©á8¢á8›á8”á8á8†á8á8xá8qá8já8cá8\á8Uá8Ná8Gá8@á89á82á8+á8$á8á8á8á8á8á8úà8óà8ìà8åà8Þà8×à8Ðà8Éà8Âà8»à8´à8­à8¦à8Ÿà8˜à8‘à8Šà8ƒà8|à8uà8nà8gà8`à8Yà8Rà8Kà8Dà8=à86à8/à8(à8!à8à8à8 à8à8þß8÷ß8ðß8éß8âß8Ûß8Ôß8Íß8Æß8¿ß8¸ß8±ß8ªß8£ß8œß8•ß8Žß8‡ß8€ß8yß8rß8kß8dß8]ß8Vß8Oß8Hß8Aß8:ß83ß8,ß8%ß8ß8ß8ß8 ß8ß8ûÞ8ôÞ8íÞ8æÞ8ßÞ8ØÞ8ÑÞ8ÊÞ8ÃÞ8¼Þ8µÞ8®Þ8§Þ8 Þ8™Þ8’Þ8‹Þ8„Þ8}Þ8vÞ8oÞ8hÞ8aÞ8ZÞ8SÞ8LÞ8EÞ8>Þ87Þ80Þ8)Þ8"Þ8Þ8Þ8 Þ8Þ8ÿÝ8øÝ8ñÝ8êÝ8ãÝ8ÜÝ8ÕÝ8ÎÝ8ÇÝ8ÀÝ8¹Ý8²Ý8«Ý8¤Ý8Ý8–Ý8Ý8ˆÝ8Ý8zÝ8sÝ8lÝ8eÝ8^Ý8WÝ8PÝ8IÝ8BÝ8;Ý84Ý8-Ý8&Ý8Ý8Ý8Ý8 Ý8Ý8üÜ8õÜ8îÜ8çÜ8àÜ8ÙÜ8ÒÜ8ËÜ8ÄÜ8½Ü8¶Ü8¯Ü8¨Ü8¡Ü8šÜ8“Ü8ŒÜ8…Ü8~Ü8wÜ8pÜ8iÜ8bÜ8[Ü8TÜ8MÜ8FÜ8?Ü88Ü81Ü8*Ü8#Ü8Ü8Ü8Ü8Ü8Ü8ùÛ8òÛ8ëÛ8äÛ8ÝÛ8ÖÛ8ÏÛ8ÈÛ8ÁÛ8ºÛ8³Û8¬Û8¥Û8žÛ8—Û8Û8‰Û8‚Û8{Û8tÛ8mÛ8fÛ8_Û8XÛ8QÛ8JÛ8CÛ8<Û85Û8.Û8'Û8 Û8Û8Û8 Û8Û8ýÚ8öÚ8ïÚ8èÚ8áÚ8ÚÚ8ÓÚ8ÌÚ8ÅÚ8¾Ú8·Ú8°Ú8©Ú8¢Ú8›Ú8”Ú8Ú8†Ú8Ú8xÚ8qÚ8jÚ8cÚ8\Ú8UÚ8NÚ8GÚ8@Ú89Ú82Ú8+Ú8$Ú8Ú8Ú8Ú8Ú8Ú8úÙ8óÙ8ìÙ8åÙ8ÞÙ8×Ù8ÐÙ8ÉÙ8ÂÙ8»Ù8´Ù8­Ù8¦Ù8ŸÙ8˜Ù8‘Ù8ŠÙ8ƒÙ8|Ù8uÙ8nÙ8gÙ8`Ù8YÙ8RÙ8KÙ8DÙ8=Ù86Ù8/Ù8(Ù8!Ù8Ù8Ù8 Ù8Ù8þØ8÷Ø8ðØ8éØ8âØ8ÛØ8ÔØ8ÍØ8ÆØ8¿Ø8¸Ø8±Ø8ªØ8£Ø8œØ8•Ø8ŽØ8‡Ø8€Ø8yØ8rØ8kØ8dØ8]Ø8VØ8OØ8HØ8AØ8:Ø83Ø8,Ø8%Ø8Ø8Ø8Ø8 Ø8Ø8û×8ô×8í×8æ×8ß×8Ø×8Ñ×8Ê×8Ã×8¼×8µ×8®×8§×8 ×8™×8’×8‹×8„×8}×8v×8o×8h×8a×8Z×8S×8L×8E×8>×87×80×8)×8"×8×8×8 ×8×8ÿÖ8øÖ8ñÖ8êÖ8ãÖ8ÜÖ8ÕÖ8ÎÖ8ÇÖ8ÀÖ8¹Ö8²Ö8«Ö8¤Ö8Ö8–Ö8Ö8ˆÖ8Ö8zÖ8sÖ8lÖ8eÖ8^Ö8WÖ8PÖ8IÖ8BÖ8;Ö84Ö8-Ö8&Ö8Ö8Ö8Ö8 Ö8Ö8üÕ8õÕ8îÕ8çÕ8àÕ8ÙÕ8ÒÕ8ËÕ8ÄÕ8½Õ8¶Õ8¯Õ8¨Õ8¡Õ8šÕ8“Õ8ŒÕ8…Õ8~Õ8wÕ8pÕ8iÕ8bÕ8[Õ8TÕ8MÕ8FÕ8?Õ88Õ81Õ8*Õ8#Õ8Õ8Õ8Õ8Õ8Õ8ùÔ8òÔ8ëÔ8äÔ8ÝÔ8ÖÔ8ÏÔ8ÈÔ8ÁÔ8ºÔ8³Ô8¬Ô8¥Ô8žÔ8—Ô8Ô8‰Ô8‚Ô8{Ô8tÔ8mÔ8fÔ8_Ô8XÔ8QÔ8JÔ8CÔ8<Ô85Ô8.Ô8'Ô8 Ô8Ô8Ô8 Ô8Ô8ýÓ8öÓ8ïÓ8èÓ8áÓ8ÚÓ8ÓÓ8ÌÓ8ÅÓ8¾Ó8·Ó8°Ó8©Ó8¢Ó8›Ó8”Ó8Ó8†Ó8Ó8xÓ8qÓ8jÓ8cÓ8\Ó8UÓ8NÓ8GÓ8@Ó89Ó82Ó8+Ó8$Ó8Ó8Ó8Ó8Ó8Ó8úÒ8óÒ8ìÒ8åÒ8ÞÒ8×Ò8ÐÒ8ÉÒ8ÂÒ8»Ò8´Ò8­Ò8¦Ò8ŸÒ8˜Ò8‘Ò8ŠÒ8ƒÒ8|Ò8uÒ8nÒ8gÒ8`Ò8YÒ8RÒ8KÒ8DÒ8=Ò86Ò8/Ò8(Ò8!Ò8Ò8Ò8 Ò8Ò8þÑ8÷Ñ8ðÑ8éÑ8âÑ8ÛÑ8ÔÑ8ÍÑ8ÆÑ8¿Ñ8¸Ñ8±Ñ8ªÑ8£Ñ8œÑ8•Ñ8ŽÑ8‡Ñ8€Ñ8yÑ8rÑ8kÑ8dÑ8]Ñ8VÑ8OÑ8HÑ8AÑ8:Ñ83Ñ8,Ñ8%Ñ8Ñ8Ñ8Ñ8 Ñ8Ñ8ûÐ8ôÐ8íÐ8æÐ8ßÐ8ØÐ8ÑÐ8ÊÐ8ÃÐ8¼Ð8µÐ8®Ð8§Ð8 Ð8™Ð8’Ð8‹Ð8„Ð8}Ð8vÐ8oÐ8hÐ8aÐ8ZÐ8SÐ8LÐ8EÐ8>Ð87Ð80Ð8)Ð8"Ð8Ð8Ð8 Ð8Ð8ÿÏ8øÏ8ñÏ8êÏ8ãÏ8ÜÏ8ÕÏ8ÎÏ8ÇÏ8ÀÏ8¹Ï8²Ï8«Ï8¤Ï8Ï8–Ï8Ï8ˆÏ8Ï8zÏ8sÏ8lÏ8eÏ8^Ï8WÏ8PÏ8IÏ8BÏ8;Ï84Ï8-Ï8&Ï8Ï8Ï8Ï8 Ï8Ï8üÎ8õÎ8îÎ8çÎ8àÎ8ÙÎ8ÒÎ8ËÎ8ÄÎ8½Î8¶Î8¯Î8¨Î8¡Î8šÎ8“Î8ŒÎ8…Î8~Î8wÎ8pÎ8iÎ8bÎ8[Î8TÎ8MÎ8FÎ8?Î88Î81Î8*Î8#Î8Î8Î8Î8Î8Î8ùÍ8òÍ8ëÍ8äÍ8ÝÍ8ÖÍ8ÏÍ8ÈÍ8ÁÍ8ºÍ8³Í8¬Í8¥Í8žÍ8—Í8Í8‰Í8‚Í8{Í8tÍ8mÍ8fÍ8_Í8XÍ8QÍ8JÍ8CÍ8<Í85Í8.Í8'Í8 Í8Í8Í8 Í8Í8ýÌ8öÌ8ïÌ8èÌ8áÌ8ÚÌ8ÓÌ8ÌÌ8ÅÌ8¾Ì8·Ì8°Ì8©Ì8¢Ì8›Ì8”Ì8Ì8†Ì8Ì8xÌ8qÌ8jÌ8cÌ8\Ì8UÌ8NÌ8GÌ8@Ì89Ì82Ì8+Ì8$Ì8Ì8Ì8Ì8Ì8Ì8úË8óË8ìË8åË8ÞË8×Ë8ÐË8ÉË8ÂË8»Ë8´Ë8­Ë8¦Ë8ŸË8˜Ë8‘Ë8ŠË8ƒË8|Ë8uË8nË8gË8`Ë8YË8RË8KË8DË8=Ë86Ë8/Ë8(Ë8!Ë8Ë8Ë8 Ë8Ë8þÊ8÷Ê8ðÊ8éÊ8âÊ8ÛÊ8ÔÊ8ÍÊ8ÆÊ8¿Ê8¸Ê8±Ê8ªÊ8£Ê8œÊ8•Ê8ŽÊ8‡Ê8€Ê8yÊ8rÊ8kÊ8dÊ8]Ê8VÊ8OÊ8HÊ8AÊ8:Ê83Ê8,Ê8%Ê8Ê8Ê8Ê8 Ê8Ê8ûÉ8ôÉ8íÉ8æÉ8ßÉ8ØÉ8ÑÉ8ÊÉ8ÃÉ8¼É8µÉ8®É8§É8 É8™É8’É8‹É8„É8}É8vÉ8oÉ8hÉ8aÉ8ZÉ8SÉ8LÉ8EÉ8>É87É80É8)É8"É8É8É8 É8É8ÿÈ8øÈ8ñÈ8êÈ8ãÈ8ÜÈ8ÕÈ8ÎÈ8ÇÈ8ÀÈ8¹È8²È8«È8¤È8È8–È8È8ˆÈ8È8zÈ8sÈ8lÈ8eÈ8^È8WÈ8PÈ8IÈ8BÈ8;È84È8-È8&È8È8È8È8 È8È8üÇ8õÇ8îÇ8çÇ8àÇ8ÙÇ8ÒÇ8ËÇ8ÄÇ8½Ç8¶Ç8¯Ç8¨Ç8¡Ç8šÇ8“Ç8ŒÇ8…Ç8~Ç8wÇ8pÇ8iÇ8bÇ8[Ç8TÇ8MÇ8FÇ8?Ç88Ç81Ç8*Ç8#Ç8Ç8Ç8Ç8Ç8Ç8ùÆ8òÆ8ëÆ8äÆ8ÝÆ8ÖÆ8ÏÆ8ÈÆ8ÁÆ8ºÆ8³Æ8¬Æ8¥Æ8žÆ8—Æ8Æ8‰Æ8‚Æ8{Æ8tÆ8mÆ8fÆ8_Æ8XÆ8QÆ8JÆ8CÆ8<Æ85Æ8.Æ8'Æ8 Æ8Æ8Æ8 Æ8Æ8ýÅ8öÅ8ïÅ8èÅ8áÅ8ÚÅ8ÓÅ8ÌÅ8ÅÅ8¾Å8·Å8°Å8©Å8¢Å8›Å8”Å8Å8†Å8Å8xÅ8qÅ8jÅ8cÅ8\Å8UÅ8NÅ8GÅ8@Å89Å82Å8+Å8$Å8Å8Å8Å8Å8Å8úÄ8óÄ8ìÄ8åÄ8ÞÄ8×Ä8ÐÄ8ÉÄ8ÂÄ8»Ä8´Ä8­Ä8¦Ä8ŸÄ8˜Ä8‘Ä8ŠÄ8ƒÄ8|Ä8uÄ8nÄ8gÄ8`Ä8YÄ8RÄ8KÄ8DÄ8=Ä86Ä8/Ä8(Ä8!Ä8Ä8Ä8 Ä8Ä8þÃ8÷Ã8ðÃ8éÃ8âÃ8ÛÃ8ÔÃ8ÍÃ8ÆÃ8¿Ã8¸Ã8±Ã8ªÃ8£Ã8œÃ8•Ã8ŽÃ8‡Ã8€Ã8yÃ8rÃ8kÃ8dÃ8]Ã8VÃ8OÃ8HÃ8AÃ8:Ã83Ã8,Ã8%Ã8Ã8Ã8Ã8 Ã8Ã8ûÂ8ôÂ8íÂ8æÂ8ßÂ8ØÂ8ÑÂ8ÊÂ8ÃÂ8¼Â8µÂ8®Â8§Â8 Â8™Â8’Â8‹Â8„Â8}Â8vÂ8oÂ8hÂ8aÂ8ZÂ8SÂ8LÂ8EÂ8>Â87Â80Â8)Â8"Â8Â8Â8 Â8Â8ÿÁ8øÁ8ñÁ8êÁ8ãÁ8ÜÁ8ÕÁ8ÎÁ8ÇÁ8ÀÁ8¹Á8²Á8«Á8¤Á8Á8–Á8Á8ˆÁ8Á8zÁ8sÁ8lÁ8eÁ8^Á8WÁ8PÁ8IÁ8BÁ8;Á84Á8-Á8&Á8Á8Á8Á8 Á8Á8üÀ8õÀ8îÀ8çÀ8àÀ8ÙÀ8ÒÀ8ËÀ8ÄÀ8½À8¶À8¯À8¨À8¡À8šÀ8“À8ŒÀ8…À8~À8wÀ8pÀ8iÀ8bÀ8[À8TÀ8MÀ8FÀ8?À88À81À8*À8#À8À8À8À8À8À8ù¿8ò¿8ë¿8ä¿8Ý¿8Ö¿8Ï¿8È¿8Á¿8º¿8³¿8¬¿8¥¿8ž¿8—¿8¿8‰¿8‚¿8{¿8t¿8m¿8f¿8_¿8X¿8Q¿8J¿8C¿8<¿85¿8.¿8'¿8 ¿8¿8¿8 ¿8¿8ý¾8ö¾8ï¾8è¾8á¾8Ú¾8Ó¾8̾8ž8¾¾8·¾8°¾8©¾8¢¾8›¾8”¾8¾8†¾8¾8x¾8q¾8j¾8c¾8\¾8U¾8N¾8G¾8@¾89¾82¾8+¾8$¾8¾8¾8¾8¾8¾8ú½8ó½8ì½8å½8Þ½8×½8н8ɽ8½8»½8´½8­½8¦½8Ÿ½8˜½8‘½8н8ƒ½8|½8u½8n½8g½8`½8Y½8R½8K½8D½8=½86½8/½8(½8!½8½8½8 ½8½8þ¼8÷¼8ð¼8é¼8â¼8Û¼8Ô¼8ͼ8Ƽ8¿¼8¸¼8±¼8ª¼8£¼8œ¼8•¼8޼8‡¼8€¼8y¼8r¼8k¼8d¼8]¼8V¼8O¼8H¼8A¼8:¼83¼8,¼8%¼8¼8¼8¼8 ¼8¼8û»8ô»8í»8æ»8ß»8Ø»8Ñ»8Ê»8û8¼»8µ»8®»8§»8 »8™»8’»8‹»8„»8}»8v»8o»8h»8a»8Z»8S»8L»8E»8>»87»80»8)»8"»8»8»8 »8»8ÿº8øº8ñº8êº8ãº8ܺ8Õº8κ8Ǻ8Àº8¹º8²º8«º8¤º8º8–º8º8ˆº8º8zº8sº8lº8eº8^º8Wº8Pº8Iº8Bº8;º84º8-º8&º8º8º8º8 º8º8ü¹8õ¹8î¹8ç¹8à¹8Ù¹8Ò¹8˹8Ĺ8½¹8¶¹8¯¹8¨¹8¡¹8š¹8“¹8Œ¹8…¹8~¹8w¹8p¹8i¹8b¹8[¹8T¹8M¹8F¹8?¹88¹81¹8*¹8#¹8¹8¹8¹8¹8¹8ù¸8ò¸8ë¸8ä¸8ݸ8Ö¸8ϸ8ȸ8Á¸8º¸8³¸8¬¸8¥¸8ž¸8—¸8¸8‰¸8‚¸8{¸8t¸8m¸8f¸8_¸8X¸8Q¸8J¸8C¸8<¸85¸8.¸8'¸8 ¸8¸8¸8 ¸8¸8ý·8ö·8ï·8è·8á·8Ú·8Ó·8Ì·8Å·8¾·8··8°·8©·8¢·8›·8”·8·8†·8·8x·8q·8j·8c·8\·8U·8N·8G·8@·89·82·8+·8$·8·8·8·8·8·8ú¶8ó¶8ì¶8å¶8Þ¶8×¶8ж8ɶ8¶8»¶8´¶8­¶8¦¶8Ÿ¶8˜¶8‘¶8ж8ƒ¶8|¶8u¶8n¶8g¶8`¶8Y¶8R¶8K¶8D¶8=¶86¶8/¶8(¶8!¶8¶8¶8 ¶8¶8þµ8÷µ8ðµ8éµ8âµ8Ûµ8Ôµ8͵8Ƶ8¿µ8¸µ8±µ8ªµ8£µ8œµ8•µ8޵8‡µ8€µ8yµ8rµ8kµ8dµ8]µ8Vµ8Oµ8Hµ8Aµ8:µ83µ8,µ8%µ8µ8µ8µ8 µ8µ8û´8ô´8í´8æ´8ß´8Ø´8Ñ´8Ê´8ô8¼´8µ´8®´8§´8 ´8™´8’´8‹´8„´8}´8v´8o´8h´8a´8Z´8S´8L´8E´8>´87´80´8)´8"´8´8´8 ´8´8ÿ³8ø³8ñ³8ê³8ã³8ܳ8Õ³8γ8dz8À³8¹³8²³8«³8¤³8³8–³8³8ˆ³8³8z³8s³8l³8e³8^³8W³8P³8I³8B³8;³84³8-³8&³8³8³8³8 ³8³8ü²8õ²8î²8ç²8à²8Ù²8Ò²8˲8IJ8½²8¶²8¯²8¨²8¡²8š²8“²8Œ²8…²8~²8w²8p²8i²8b²8[²8T²8M²8F²8?²88²81²8*²8#²8²8²8²8²8²8ù±8ò±8ë±8ä±8ݱ8Ö±8ϱ8ȱ8Á±8º±8³±8¬±8¥±8ž±8—±8±8‰±8‚±8{±8t±8m±8f±8_±8X±8Q±8J±8C±8<±85±8.±8'±8 ±8±8±8 ±8±8ý°8ö°8ï°8è°8á°8Ú°8Ó°8̰8Ű8¾°8·°8°°8©°8¢°8›°8”°8°8†°8°8x°8q°8j°8c°8\°8U°8N°8G°8@°89°82°8+°8$°8°8°8°8°8°8ú¯8ó¯8ì¯8å¯8Þ¯8ׯ8Я8ɯ8¯8»¯8´¯8­¯8¦¯8Ÿ¯8˜¯8‘¯8Н8ƒ¯8|¯8u¯8n¯8g¯8`¯8Y¯8R¯8K¯8D¯8=¯86¯8/¯8(¯8!¯8¯8¯8 ¯8¯8þ®8÷®8ð®8é®8â®8Û®8Ô®8Í®8Æ®8¿®8¸®8±®8ª®8£®8œ®8•®8Ž®8‡®8€®8y®8r®8k®8d®8]®8V®8O®8H®8A®8:®83®8,®8%®8®8®8®8 ®8®8û­8ô­8í­8æ­8ß­8Ø­8Ñ­8Ê­8í8¼­8µ­8®­8§­8 ­8™­8’­8‹­8„­8}­8v­8o­8h­8a­8Z­8S­8L­8E­8>­87­80­8)­8"­8­8­8 ­8­8ÿ¬8ø¬8ñ¬8ê¬8ã¬8ܬ8Õ¬8ά8Ǭ8À¬8¹¬8²¬8«¬8¤¬8¬8–¬8¬8ˆ¬8¬8z¬8s¬8l¬8e¬8^¬8W¬8P¬8I¬8B¬8;¬84¬8-¬8&¬8¬8¬8¬8 ¬8¬8ü«8õ«8î«8ç«8à«8Ù«8Ò«8Ë«8Ä«8½«8¶«8¯«8¨«8¡«8š«8“«8Œ«8…«8~«8w«8p«8i«8b«8[«8T«8M«8F«8?«88«81«8*«8#«8«8«8«8«8«8ùª8òª8ëª8äª8ݪ8Öª8Ϫ8Ȫ8Áª8ºª8³ª8¬ª8¥ª8žª8—ª8ª8‰ª8‚ª8{ª8tª8mª8fª8_ª8Xª8Qª8Jª8Cª8<ª85ª8.ª8'ª8 ª8ª8ª8 ª8ª8ý©8ö©8ï©8è©8á©8Ú©8Ó©8Ì©8Å©8¾©8·©8°©8©©8¢©8›©8”©8©8†©8©8x©8q©8j©8c©8\©8U©8N©8G©8@©89©82©8+©8$©8©8©8©8©8©8ú¨8ó¨8ì¨8å¨8Þ¨8ר8Ш8ɨ8¨8»¨8´¨8­¨8¦¨8Ÿ¨8˜¨8‘¨8Ѝ8ƒ¨8|¨8u¨8n¨8g¨8`¨8Y¨8R¨8K¨8D¨8=¨86¨8/¨8(¨8!¨8¨8¨8 ¨8¨8þ§8÷§8ð§8é§8â§8Û§8Ô§8ͧ8Ƨ8¿§8¸§8±§8ª§8£§8œ§8•§8ާ8‡§8€§8y§8r§8k§8d§8]§8V§8O§8H§8A§8:§83§8,§8%§8§8§8§8 §8§8û¦8ô¦8í¦8æ¦8ߦ8ئ8Ѧ8ʦ8æ8¼¦8µ¦8®¦8§¦8 ¦8™¦8’¦8‹¦8„¦8}¦8v¦8o¦8h¦8a¦8Z¦8S¦8L¦8E¦8>¦87¦80¦8)¦8"¦8¦8¦8 ¦8¦8ÿ¥8ø¥8ñ¥8ê¥8ã¥8Ü¥8Õ¥8Î¥8Ç¥8À¥8¹¥8²¥8«¥8¤¥8¥8–¥8¥8ˆ¥8¥8z¥8s¥8l¥8e¥8^¥8W¥8P¥8I¥8B¥8;¥84¥8-¥8&¥8¥8¥8¥8 ¥8¥8ü¤8õ¤8î¤8ç¤8à¤8Ù¤8Ò¤8ˤ8Ĥ8½¤8¶¤8¯¤8¨¤8¡¤8š¤8“¤8Œ¤8…¤8~¤8w¤8p¤8i¤8b¤8[¤8T¤8M¤8F¤8?¤88¤81¤8*¤8#¤8¤8¤8¤8¤8¤8ù£8ò£8ë£8ä£8Ý£8Ö£8Ï£8È£8Á£8º£8³£8¬£8¥£8ž£8—£8£8‰£8‚£8{£8t£8m£8f£8_£8X£8Q£8J£8C£8<£85£8.£8'£8 £8£8£8 £8£8ý¢8ö¢8ï¢8è¢8á¢8Ú¢8Ó¢8Ì¢8Å¢8¾¢8·¢8°¢8©¢8¢¢8›¢8”¢8¢8†¢8¢8x¢8q¢8j¢8c¢8\¢8U¢8N¢8G¢8@¢89¢82¢8+¢8$¢8¢8¢8¢8¢8¢8ú¡8ó¡8ì¡8å¡8Þ¡8ס8С8É¡8¡8»¡8´¡8­¡8¦¡8Ÿ¡8˜¡8‘¡8Š¡8ƒ¡8|¡8u¡8n¡8g¡8`¡8Y¡8R¡8K¡8D¡8=¡86¡8/¡8(¡8!¡8¡8¡8 ¡8¡8þ 8÷ 8ð 8é 8â 8Û 8Ô 8Í 8Æ 8¿ 8¸ 8± 8ª 8£ 8œ 8• 8Ž 8‡ 8€ 8y 8r 8k 8d 8] 8V 8O 8H 8A 8: 83 8, 8% 8 8 8 8  8 8ûŸ8ôŸ8íŸ8æŸ8ߟ8ØŸ8ÑŸ8ÊŸ8ß8¼Ÿ8µŸ8®Ÿ8§Ÿ8 Ÿ8™Ÿ8’Ÿ8‹Ÿ8„Ÿ8}Ÿ8vŸ8oŸ8hŸ8aŸ8ZŸ8SŸ8LŸ8EŸ8>Ÿ87Ÿ80Ÿ8)Ÿ8"Ÿ8Ÿ8Ÿ8 Ÿ8Ÿ8ÿž8øž8ñž8êž8ãž8Üž8Õž8Ξ8Çž8Àž8¹ž8²ž8«ž8¤ž8ž8–ž8ž8ˆž8ž8zž8sž8lž8ež8^ž8Wž8Pž8Iž8Bž8;ž84ž8-ž8&ž8ž8ž8ž8 ž8ž8ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ùœ8òœ8ëœ8äœ8Ýœ8Öœ8Ïœ8Èœ8Áœ8ºœ8³œ8¬œ8¥œ8žœ8—œ8œ8‰œ8‚œ8{œ8tœ8mœ8fœ8_œ8Xœ8Qœ8Jœ8Cœ8<œ85œ8.œ8'œ8 œ8œ8œ8 œ8œ8ý›8ö›8ï›8è›8á›8Ú›8Ó›8Ì›8Å›8¾›8·›8°›8©›8¢›8››8”›8›8†›8›8x›8q›8j›8c›8\›8U›8N›8G›8@›89›82›8+›8$›8›8›8›8›8›8úš8óš8ìš8åš8Þš8ך8К8Éš8š8»š8´š8­š8¦š8Ÿš8˜š8‘š8Šš8ƒš8|š8uš8nš8gš8`š8Yš8Rš8Kš8Dš8=š86š8/š8(š8!š8š8š8 š8š8þ™8÷™8ð™8é™8â™8Û™8Ô™8Í™8Æ™8¿™8¸™8±™8ª™8£™8œ™8•™8Ž™8‡™8€™8y™8r™8k™8d™8]™8V™8O™8H™8A™8:™83™8,™8%™8™8™8™8 ™8™8û˜8ô˜8í˜8æ˜8ߘ8ؘ8ј8ʘ8Ø8¼˜8µ˜8®˜8§˜8 ˜8™˜8’˜8‹˜8„˜8}˜8v˜8o˜8h˜8a˜8Z˜8S˜8L˜8E˜8>˜87˜80˜8)˜8"˜8˜8˜8 ˜8˜8ÿ—8ø—8ñ—8ê—8ã—8Ü—8Õ—8Η8Ç—8À—8¹—8²—8«—8¤—8—8–—8—8ˆ—8—8z—8s—8l—8e—8^—8W—8P—8I—8B—8;—84—8-—8&—8—8—8—8 —8—8ü–8õ–8î–8ç–8à–8Ù–8Ò–8Ë–8Ä–8½–8¶–8¯–8¨–8¡–8š–8“–8Œ–8…–8~–8w–8p–8i–8b–8[–8T–8M–8F–8?–88–81–8*–8#–8–8–8–8–8–8ù•8ò•8ë•8ä•8Ý•8Ö•8Ï•8È•8Á•8º•8³•8¬•8¥•8ž•8—•8•8‰•8‚•8{•8t•8m•8f•8_•8X•8Q•8J•8C•8<•85•8.•8'•8 •8•8•8 •8•8ý”8ö”8ï”8è”8á”8Ú”8Ó”8Ì”8Å”8¾”8·”8°”8©”8¢”8›”8””8”8†”8”8x”8q”8j”8c”8\”8U”8N”8G”8@”89”82”8+”8$”8”8”8”8”8”8ú“8ó“8ì“8å“8Þ“8ד8Г8É“8“8»“8´“8­“8¦“8Ÿ“8˜“8‘“8Š“8ƒ“8|“8u“8n“8g“8`“8Y“8R“8K“8D“8=“86“8/“8(“8!“8“8“8 “8“8þ’8÷’8ð’8é’8â’8Û’8Ô’8Í’8Æ’8¿’8¸’8±’8ª’8£’8œ’8•’8Ž’8‡’8€’8y’8r’8k’8d’8]’8V’8O’8H’8A’8:’83’8,’8%’8’8’8’8 ’8’8û‘8ô‘8í‘8æ‘8ß‘8Ø‘8Ñ‘8Ê‘8Ñ8¼‘8µ‘8®‘8§‘8 ‘8™‘8’‘8‹‘8„‘8}‘8v‘8o‘8h‘8a‘8Z‘8S‘8L‘8E‘8>‘87‘80‘8)‘8"‘8‘8‘8 ‘8‘8ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ùŽ8òŽ8ëŽ8äŽ8ÝŽ8ÖŽ8ÏŽ8ÈŽ8ÁŽ8ºŽ8³Ž8¬Ž8¥Ž8žŽ8—Ž8Ž8‰Ž8‚Ž8{Ž8tŽ8mŽ8fŽ8_Ž8XŽ8QŽ8JŽ8CŽ8<Ž85Ž8.Ž8'Ž8 Ž8Ž8Ž8 Ž8Ž8ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888úŒ8óŒ8ìŒ8åŒ8ÞŒ8׌8ÐŒ8ÉŒ8ÂŒ8»Œ8´Œ8­Œ8¦Œ8ŸŒ8˜Œ8‘Œ8ŠŒ8ƒŒ8|Œ8uŒ8nŒ8gŒ8`Œ8YŒ8RŒ8KŒ8DŒ8=Œ86Œ8/Œ8(Œ8!Œ8Œ8Œ8 Œ8Œ8þ‹8÷‹8ð‹8é‹8â‹8Û‹8Ô‹8Í‹8Æ‹8¿‹8¸‹8±‹8ª‹8£‹8œ‹8•‹8Ž‹8‡‹8€‹8y‹8r‹8k‹8d‹8]‹8V‹8O‹8H‹8A‹8:‹83‹8,‹8%‹8‹8‹8‹8 ‹8‹8ûŠ8ôŠ8íŠ8æŠ8ߊ8ØŠ8ÑŠ8ÊŠ8Ê8¼Š8µŠ8®Š8§Š8 Š8™Š8’Š8‹Š8„Š8}Š8vŠ8oŠ8hŠ8aŠ8ZŠ8SŠ8LŠ8EŠ8>Š87Š80Š8)Š8"Š8Š8Š8 Š8Š8ÿ‰8ø‰8ñ‰8ê‰8ã‰8܉8Õ‰8Ή8lj8À‰8¹‰8²‰8«‰8¤‰8‰8–‰8‰8ˆ‰8‰8z‰8s‰8l‰8e‰8^‰8W‰8P‰8I‰8B‰8;‰84‰8-‰8&‰8‰8‰8‰8 ‰8‰8üˆ8õˆ8îˆ8çˆ8àˆ8Ùˆ8Òˆ8ˈ8Ĉ8½ˆ8¶ˆ8¯ˆ8¨ˆ8¡ˆ8šˆ8“ˆ8Œˆ8…ˆ8~ˆ8wˆ8pˆ8iˆ8bˆ8[ˆ8Tˆ8Mˆ8Fˆ8?ˆ88ˆ81ˆ8*ˆ8#ˆ8ˆ8ˆ8ˆ8ˆ8ˆ8ù‡8ò‡8ë‡8ä‡8݇8Ö‡8χ8ȇ8Á‡8º‡8³‡8¬‡8¥‡8ž‡8—‡8‡8‰‡8‚‡8{‡8t‡8m‡8f‡8_‡8X‡8Q‡8J‡8C‡8<‡85‡8.‡8'‡8 ‡8‡8‡8 ‡8‡8ý†8ö†8ï†8è†8á†8Ú†8Ó†8̆8ņ8¾†8·†8°†8©†8¢†8›†8”†8†8††8†8x†8q†8j†8c†8\†8U†8N†8G†8@†89†82†8+†8$†8†8†8†8†8†8ú…8ó…8ì…8å…8Þ…8×…8Ð…8É…8Â…8»…8´…8­…8¦…8Ÿ…8˜…8‘…8Š…8ƒ…8|…8u…8n…8g…8`…8Y…8R…8K…8D…8=…86…8/…8(…8!…8…8…8 …8…8þ„8÷„8ð„8é„8â„8Û„8Ô„8Í„8Æ„8¿„8¸„8±„8ª„8£„8œ„8•„8Ž„8‡„8€„8y„8r„8k„8d„8]„8V„8O„8H„8A„8:„83„8,„8%„8„8„8„8 „8„8ûƒ8ôƒ8íƒ8æƒ8߃8؃8у8ʃ8Ã8¼ƒ8µƒ8®ƒ8§ƒ8 ƒ8™ƒ8’ƒ8‹ƒ8„ƒ8}ƒ8vƒ8oƒ8hƒ8aƒ8Zƒ8Sƒ8Lƒ8Eƒ8>ƒ87ƒ80ƒ8)ƒ8"ƒ8ƒ8ƒ8 ƒ8ƒ8ÿ‚8ø‚8ñ‚8ê‚8ã‚8Ü‚8Õ‚8΂8Ç‚8À‚8¹‚8²‚8«‚8¤‚8‚8–‚8‚8ˆ‚8‚8z‚8s‚8l‚8e‚8^‚8W‚8P‚8I‚8B‚8;‚84‚8-‚8&‚8‚8‚8‚8 ‚8‚8ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù€8ò€8ë€8ä€8Ý€8Ö€8Ï€8È€8Á€8º€8³€8¬€8¥€8ž€8—€8€8‰€8‚€8{€8t€8m€8f€8_€8X€8Q€8J€8C€8<€85€8.€8'€8 €8€8€8 €8€8ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú~8ó~8ì~8å~8Þ~8×~8Ð~8É~8Â~8»~8´~8­~8¦~8Ÿ~8˜~8‘~8Š~8ƒ~8|~8u~8n~8g~8`~8Y~8R~8K~8D~8=~86~8/~8(~8!~8~8~8 ~8~8þ}8÷}8ð}8é}8â}8Û}8Ô}8Í}8Æ}8¿}8¸}8±}8ª}8£}8œ}8•}8Ž}8‡}8€}8y}8r}8k}8d}8]}8V}8O}8H}8A}8:}83}8,}8%}8}8}8}8 }8}8û|8ô|8í|8æ|8ß|8Ø|8Ñ|8Ê|8Ã|8¼|8µ|8®|8§|8 |8™|8’|8‹|8„|8}|8v|8o|8h|8a|8Z|8S|8L|8E|8>|87|80|8)|8"|8|8|8 |8|8ÿ{8ø{8ñ{8ê{8ã{8Ü{8Õ{8Î{8Ç{8À{8¹{8²{8«{8¤{8{8–{8{8ˆ{8{8z{8s{8l{8e{8^{8W{8P{8I{8B{8;{84{8-{8&{8{8{8{8 {8{8üz8õz8îz8çz8àz8Ùz8Òz8Ëz8Äz8½z8¶z8¯z8¨z8¡z8šz8“z8Œz8…z8~z8wz8pz8iz8bz8[z8Tz8Mz8Fz8?z88z81z8*z8#z8z8z8z8z8z8ùy8òy8ëy8äy8Ýy8Öy8Ïy8Èy8Áy8ºy8³y8¬y8¥y8žy8—y8y8‰y8‚y8{y8ty8my8fy8_y8Xy8Qy8Jy8Cy8u87u80u8)u8"u8u8u8 u8u8ÿt8øt8ñt8êt8ãt8Üt8Õt8Ît8Çt8Àt8¹t8²t8«t8¤t8t8–t8t8ˆt8t8zt8st8lt8et8^t8Wt8Pt8It8Bt8;t84t8-t8&t8t8t8t8 t8t8üs8õs8îs8çs8às8Ùs8Òs8Ës8Äs8½s8¶s8¯s8¨s8¡s8šs8“s8Œs8…s8~s8ws8ps8is8bs8[s8Ts8Ms8Fs8?s88s81s8*s8#s8s8s8s8s8s8ùr8òr8ër8är8Ýr8Ör8Ïr8Èr8Ár8ºr8³r8¬r8¥r8žr8—r8r8‰r8‚r8{r8tr8mr8fr8_r8Xr8Qr8Jr8Cr8n87n80n8)n8"n8n8n8 n8n8ÿm8øm8ñm8êm8ãm8Üm8Õm8Îm8Çm8Àm8¹m8²m8«m8¤m8m8–m8m8ˆm8m8zm8sm8lm8em8^m8Wm8Pm8Im8Bm8;m84m8-m8&m8m8m8m8 m8m8ül8õl8îl8çl8àl8Ùl8Òl8Ël8Äl8½l8¶l8¯l8¨l8¡l8šl8“l8Œl8…l8~l8wl8pl8il8bl8[l8Tl8Ml8Fl8?l88l81l8*l8#l8l8l8l8l8l8ùk8òk8ëk8äk8Ýk8Ök8Ïk8Èk8Ák8ºk8³k8¬k8¥k8žk8—k8k8‰k8‚k8{k8tk8mk8fk8_k8Xk8Qk8Jk8Ck8g87g80g8)g8"g8g8g8 g8g8ÿf8øf8ñf8êf8ãf8Üf8Õf8Îf8Çf8Àf8¹f8²f8«f8¤f8f8–f8f8ˆf8f8zf8sf8lf8ef8^f8Wf8Pf8If8Bf8;f84f8-f8&f8f8f8f8 f8f8üe8õe8îe8çe8àe8Ùe8Òe8Ëe8Äe8½e8¶e8¯e8¨e8¡e8še8“e8Œe8…e8~e8we8pe8ie8be8[e8Te8Me8Fe8?e88e81e8*e8#e8e8e8e8e8e8ùd8òd8ëd8äd8Ýd8Öd8Ïd8Èd8Ád8ºd8³d8¬d8¥d8žd8—d8d8‰d8‚d8{d8td8md8fd8_d8Xd8Qd8Jd8Cd8`87`80`8)`8"`8`8`8 `8`8ÿ_8ø_8ñ_8ê_8ã_8Ü_8Õ_8Î_8Ç_8À_8¹_8²_8«_8¤_8_8–_8_8ˆ_8_8z_8s_8l_8e_8^_8W_8P_8I_8B_8;_84_8-_8&_8_8_8_8 _8_8ü^8õ^8î^8ç^8à^8Ù^8Ò^8Ë^8Ä^8½^8¶^8¯^8¨^8¡^8š^8“^8Œ^8…^8~^8w^8p^8i^8b^8[^8T^8M^8F^8?^88^81^8*^8#^8^8^8^8^8^8ù]8ò]8ë]8ä]8Ý]8Ö]8Ï]8È]8Á]8º]8³]8¬]8¥]8ž]8—]8]8‰]8‚]8{]8t]8m]8f]8_]8X]8Q]8J]8C]8<]85]8.]8']8 ]8]8]8 ]8]8ý\8ö\8ï\8è\8á\8Ú\8Ó\8Ì\8Å\8¾\8·\8°\8©\8¢\8›\8”\8\8†\8\8x\8q\8j\8c\8\\8U\8N\8G\8@\89\82\8+\8$\8\8\8\8\8\8ú[8ó[8ì[8å[8Þ[8×[8Ð[8É[8Â[8»[8´[8­[8¦[8Ÿ[8˜[8‘[8Š[8ƒ[8|[8u[8n[8g[8`[8Y[8R[8K[8D[8=[86[8/[8([8![8[8[8 [8[8þZ8÷Z8ðZ8éZ8âZ8ÛZ8ÔZ8ÍZ8ÆZ8¿Z8¸Z8±Z8ªZ8£Z8œZ8•Z8ŽZ8‡Z8€Z8yZ8rZ8kZ8dZ8]Z8VZ8OZ8HZ8AZ8:Z83Z8,Z8%Z8Z8Z8Z8 Z8Z8ûY8ôY8íY8æY8ßY8ØY8ÑY8ÊY8ÃY8¼Y8µY8®Y8§Y8 Y8™Y8’Y8‹Y8„Y8}Y8vY8oY8hY8aY8ZY8SY8LY8EY8>Y87Y80Y8)Y8"Y8Y8Y8 Y8Y8ÿX8øX8ñX8êX8ãX8ÜX8ÕX8ÎX8ÇX8ÀX8¹X8²X8«X8¤X8X8–X8X8ˆX8X8zX8sX8lX8eX8^X8WX8PX8IX8BX8;X84X8-X8&X8X8X8X8 X8X8üW8õW8îW8çW8àW8ÙW8ÒW8ËW8ÄW8½W8¶W8¯W8¨W8¡W8šW8“W8ŒW8…W8~W8wW8pW8iW8bW8[W8TW8MW8FW8?W88W81W8*W8#W8W8W8W8W8W8ùV8òV8ëV8äV8ÝV8ÖV8ÏV8ÈV8ÁV8ºV8³V8¬V8¥V8žV8—V8V8‰V8‚V8{V8tV8mV8fV8_V8XV8QV8JV8CV8R87R80R8)R8"R8R8R8 R8R8ÿQ8øQ8ñQ8êQ8ãQ8ÜQ8ÕQ8ÎQ8ÇQ8ÀQ8¹Q8²Q8«Q8¤Q8Q8–Q8Q8ˆQ8Q8zQ8sQ8lQ8eQ8^Q8WQ8PQ8IQ8BQ8;Q84Q8-Q8&Q8Q8Q8Q8 Q8Q8üP8õP8îP8çP8àP8ÙP8ÒP8ËP8ÄP8½P8¶P8¯P8¨P8¡P8šP8“P8ŒP8…P8~P8wP8pP8iP8bP8[P8TP8MP8FP8?P88P81P8*P8#P8P8P8P8P8P8ùO8òO8ëO8äO8ÝO8ÖO8ÏO8ÈO8ÁO8ºO8³O8¬O8¥O8žO8—O8O8‰O8‚O8{O8tO8mO8fO8_O8XO8QO8JO8CO8K87K80K8)K8"K8K8K8 K8K8ÿJ8øJ8ñJ8êJ8ãJ8ÜJ8ÕJ8ÎJ8ÇJ8ÀJ8¹J8²J8«J8¤J8J8–J8J8ˆJ8J8zJ8sJ8lJ8eJ8^J8WJ8PJ8IJ8BJ8;J84J8-J8&J8J8J8J8 J8J8üI8õI8îI8çI8àI8ÙI8ÒI8ËI8ÄI8½I8¶I8¯I8¨I8¡I8šI8“I8ŒI8…I8~I8wI8pI8iI8bI8[I8TI8MI8FI8?I88I81I8*I8#I8I8I8I8I8I8ùH8òH8ëH8äH8ÝH8ÖH8ÏH8ÈH8ÁH8ºH8³H8¬H8¥H8žH8—H8H8‰H8‚H8{H8tH8mH8fH8_H8XH8QH8JH8CH8D87D80D8)D8"D8D8D8 D8D8ÿC8øC8ñC8êC8ãC8ÜC8ÕC8ÎC8ÇC8ÀC8¹C8²C8«C8¤C8C8–C8C8ˆC8C8zC8sC8lC8eC8^C8WC8PC8IC8BC8;C84C8-C8&C8C8C8C8 C8C8üB8õB8îB8çB8àB8ÙB8ÒB8ËB8ÄB8½B8¶B8¯B8¨B8¡B8šB8“B8ŒB8…B8~B8wB8pB8iB8bB8[B8TB8MB8FB8?B88B81B8*B8#B8B8B8B8B8B8ùA8òA8ëA8äA8ÝA8ÖA8ÏA8ÈA8ÁA8ºA8³A8¬A8¥A8žA8—A8A8‰A8‚A8{A8tA8mA8fA8_A8XA8QA8JA8CA88÷>8ð>8é>8â>8Û>8Ô>8Í>8Æ>8¿>8¸>8±>8ª>8£>8œ>8•>8Ž>8‡>8€>8y>8r>8k>8d>8]>8V>8O>8H>8A>8:>83>8,>8%>8>8>8>8 >8>8û=8ô=8í=8æ=8ß=8Ø=8Ñ=8Ê=8Ã=8¼=8µ=8®=8§=8 =8™=8’=8‹=8„=8}=8v=8o=8h=8a=8Z=8S=8L=8E=8>=87=80=8)=8"=8=8=8 =8=8ÿ<8ø<8ñ<8ê<8ã<8Ü<8Õ<8Î<8Ç<8À<8¹<8²<8«<8¤<8<8–<8<8ˆ<8<8z<8s<8l<8e<8^<8W<8P<8I<8B<8;<84<8-<8&<8<8<8<8 <8<8ü;8õ;8î;8ç;8à;8Ù;8Ò;8Ë;8Ä;8½;8¶;8¯;8¨;8¡;8š;8“;8Œ;8…;8~;8w;8p;8i;8b;8[;8T;8M;8F;8?;88;81;8*;8#;8;8;8;8;8;8ù:8ò:8ë:8ä:8Ý:8Ö:8Ï:8È:8Á:8º:8³:8¬:8¥:8ž:8—:8:8‰:8‚:8{:8t:8m:8f:8_:8X:8Q:8J:8C:8<:85:8.:8':8 :8:8:8 :8:8ý98ö98ï98è98á98Ú98Ó98Ì98Å98¾98·98°98©98¢98›98”9898†9898x98q98j98c98\98U98N98G98@98998298+98$989898989898ú88ó88ì88å88Þ88×88Ð88É88Â88»88´88­88¦88Ÿ88˜88‘88Š88ƒ88|88u88n88g88`88Y88R88K88D88=88688/88(88!888888 8888þ78÷78ð78é78â78Û78Ô78Í78Æ78¿78¸78±78ª78£78œ78•78Ž78‡78€78y78r78k78d78]78V78O78H78A78:78378,78%78787878 7878û68ô68í68æ68ß68Ø68Ñ68Ê68Ã68¼68µ68®68§68 68™68’68‹68„68}68v68o68h68a68Z68S68L68E68>68768068)68"686868 6868ÿ58ø58ñ58ê58ã58Ü58Õ58Î58Ç58À58¹58²58«58¤5858–5858ˆ5858z58s58l58e58^58W58P58I58B58;58458-58&58585858 5858ü48õ48î48ç48à48Ù48Ò48Ë48Ä48½48¶48¯48¨48¡48š48“48Œ48…48~48w48p48i48b48[48T48M48F48?48848148*48#484848484848ù38ò38ë38ä38Ý38Ö38Ï38È38Á38º38³38¬38¥38ž38—3838‰38‚38{38t38m38f38_38X38Q38J38C38<38538.38'38 383838 3838ý28ö28ï28è28á28Ú28Ó28Ì28Å28¾28·28°28©28¢28›28”2828†2828x28q28j28c28\28U28N28G28@28928228+28$282828282828ú18ó18ì18å18Þ18×18Ð18É18Â18»18´18­18¦18Ÿ18˜18‘18Š18ƒ18|18u18n18g18`18Y18R18K18D18=18618/18(18!181818 1818þ08÷08ð08é08â08Û08Ô08Í08Æ08¿08¸08±08ª08£08œ08•08Ž08‡08€08y08r08k08d08]08V08O08H08A08:08308,08%08080808 0808û/8ô/8í/8æ/8ß/8Ø/8Ñ/8Ê/8Ã/8¼/8µ/8®/8§/8 /8™/8’/8‹/8„/8}/8v/8o/8h/8a/8Z/8S/8L/8E/8>/87/80/8)/8"/8/8/8 /8/8ÿ.8ø.8ñ.8ê.8ã.8Ü.8Õ.8Î.8Ç.8À.8¹.8².8«.8¤.8.8–.8.8ˆ.8.8z.8s.8l.8e.8^.8W.8P.8I.8B.8;.84.8-.8&.8.8.8.8 .8.8ü-8õ-8î-8ç-8à-8Ù-8Ò-8Ë-8Ä-8½-8¶-8¯-8¨-8¡-8š-8“-8Œ-8…-8~-8w-8p-8i-8b-8[-8T-8M-8F-8?-88-81-8*-8#-8-8-8-8-8-8ù,8ò,8ë,8ä,8Ý,8Ö,8Ï,8È,8Á,8º,8³,8¬,8¥,8ž,8—,8,8‰,8‚,8{,8t,8m,8f,8_,8X,8Q,8J,8C,8<,85,8.,8',8 ,8,8,8 ,8,8ý+8ö+8ï+8è+8á+8Ú+8Ó+8Ì+8Å+8¾+8·+8°+8©+8¢+8›+8”+8+8†+8+8x+8q+8j+8c+8\+8U+8N+8G+8@+89+82+8++8$+8+8+8+8+8+8ú*8ó*8ì*8å*8Þ*8×*8Ð*8É*8Â*8»*8´*8­*8¦*8Ÿ*8˜*8‘*8Š*8ƒ*8|*8u*8n*8g*8`*8Y*8R*8K*8D*8=*86*8/*8(*8!*8*8*8 *8*8þ)8÷)8ð)8é)8â)8Û)8Ô)8Í)8Æ)8¿)8¸)8±)8ª)8£)8œ)8•)8Ž)8‡)8€)8y)8r)8k)8d)8])8V)8O)8H)8A)8:)83)8,)8%)8)8)8)8 )8)8û(8ô(8í(8æ(8ß(8Ø(8Ñ(8Ê(8Ã(8¼(8µ(8®(8§(8 (8™(8’(8‹(8„(8}(8v(8o(8h(8a(8Z(8S(8L(8E(8>(87(80(8)(8"(8(8(8 (8(8ÿ'8ø'8ñ'8ê'8ã'8Ü'8Õ'8Î'8Ç'8À'8¹'8²'8«'8¤'8'8–'8'8ˆ'8'8z'8s'8l'8e'8^'8W'8P'8I'8B'8;'84'8-'8&'8'8'8'8 '8'8ü&8õ&8î&8ç&8à&8Ù&8Ò&8Ë&8Ä&8½&8¶&8¯&8¨&8¡&8š&8“&8Œ&8…&8~&8w&8p&8i&8b&8[&8T&8M&8F&8?&88&81&8*&8#&8&8&8&8&8&8ù%8ò%8ë%8ä%8Ý%8Ö%8Ï%8È%8Á%8º%8³%8¬%8¥%8ž%8—%8%8‰%8‚%8{%8t%8m%8f%8_%8X%8Q%8J%8C%8<%85%8.%8'%8 %8%8%8 %8%8ý$8ö$8ï$8è$8á$8Ú$8Ó$8Ì$8Å$8¾$8·$8°$8©$8¢$8›$8”$8$8†$8$8x$8q$8j$8c$8\$8U$8N$8G$8@$89$82$8+$8$$8$8$8$8$8$8ú#8ó#8ì#8å#8Þ#8×#8Ð#8É#8Â#8»#8´#8­#8¦#8Ÿ#8˜#8‘#8Š#8ƒ#8|#8u#8n#8g#8`#8Y#8R#8K#8D#8=#86#8/#8(#8!#8#8#8 #8#8þ"8÷"8ð"8é"8â"8Û"8Ô"8Í"8Æ"8¿"8¸"8±"8ª"8£"8œ"8•"8Ž"8‡"8€"8y"8r"8k"8d"8]"8V"8O"8H"8A"8:"83"8,"8%"8"8"8"8 "8"8û!8ô!8í!8æ!8ß!8Ø!8Ñ!8Ê!8Ã!8¼!8µ!8®!8§!8 !8™!8’!8‹!8„!8}!8v!8o!8h!8a!8Z!8S!8L!8E!8>!87!80!8)!8"!8!8!8 !8!8ÿ 8ø 8ñ 8ê 8ã 8Ü 8Õ 8Î 8Ç 8À 8¹ 8² 8« 8¤ 8 8– 8 8ˆ 8 8z 8s 8l 8e 8^ 8W 8P 8I 8B 8; 84 8- 8& 8 8 8 8 8 8ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ 8÷ 8ð 8é 8â 8Û 8Ô 8Í 8Æ 8¿ 8¸ 8± 8ª 8£ 8œ 8• 8Ž 8‡ 8€ 8y 8r 8k 8d 8] 8V 8O 8H 8A 8: 83 8, 8% 8 8 8 8 8 8û 8ô 8í 8æ 8ß 8Ø 8Ñ 8Ê 8à 8¼ 8µ 8® 8§ 8  8™ 8’ 8‹ 8„ 8} 8v 8o 8h 8a 8Z 8S 8L 8E 8> 87 80 8) 8" 8 8 8 8 8ÿ 8ø 8ñ 8ê 8ã 8Ü 8Õ 8Î 8Ç 8À 8¹ 8² 8« 8¤ 8 8– 8 8ˆ 8 8z 8s 8l 8e 8^ 8W 8P 8I 8B 8; 84 8- 8& 8 8 8 8 8 8ü 8õ 8î 8ç 8à 8Ù 8Ò 8Ë 8Ä 8½ 8¶ 8¯ 8¨ 8¡ 8š 8“ 8Œ 8… 8~ 8w 8p 8i 8b 8[ 8T 8M 8F 8? 88 81 8* 8# 8 8 8 8 8 8ù 8ò 8ë 8ä 8Ý 8Ö 8Ï 8È 8Á 8º 8³ 8¬ 8¥ 8ž 8— 8 8‰ 8‚ 8{ 8t 8m 8f 8_ 8X 8Q 8J 8C 8< 85 8. 8' 8 8 8 8 8 8ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þÿ7÷ÿ7ðÿ7éÿ7âÿ7Ûÿ7Ôÿ7Íÿ7Æÿ7¿ÿ7¸ÿ7±ÿ7ªÿ7£ÿ7œÿ7•ÿ7Žÿ7‡ÿ7€ÿ7yÿ7rÿ7kÿ7dÿ7]ÿ7Vÿ7Oÿ7Hÿ7Aÿ7:ÿ73ÿ7,ÿ7%ÿ7ÿ7ÿ7ÿ7 ÿ7ÿ7ûþ7ôþ7íþ7æþ7ßþ7Øþ7Ñþ7Êþ7Ãþ7¼þ7µþ7®þ7§þ7 þ7™þ7’þ7‹þ7„þ7}þ7vþ7oþ7hþ7aþ7Zþ7Sþ7Lþ7Eþ7>þ77þ70þ7)þ7"þ7þ7þ7 þ7þ7ÿý7øý7ñý7êý7ãý7Üý7Õý7Îý7Çý7Àý7¹ý7²ý7«ý7¤ý7ý7–ý7ý7ˆý7ý7zý7sý7lý7eý7^ý7Wý7Pý7Iý7Bý7;ý74ý7-ý7&ý7ý7ý7ý7 ý7ý7üü7õü7îü7çü7àü7Ùü7Òü7Ëü7Äü7½ü7¶ü7¯ü7¨ü7¡ü7šü7“ü7Œü7…ü7~ü7wü7pü7iü7bü7[ü7Tü7Mü7Fü7?ü78ü71ü7*ü7#ü7ü7ü7ü7ü7ü7ùû7òû7ëû7äû7Ýû7Öû7Ïû7Èû7Áû7ºû7³û7¬û7¥û7žû7—û7û7‰û7‚û7{û7tû7mû7fû7_û7Xû7Qû7Jû7Cû7<û75û7.û7'û7 û7û7û7 û7û7ýú7öú7ïú7èú7áú7Úú7Óú7Ìú7Åú7¾ú7·ú7°ú7©ú7¢ú7›ú7”ú7ú7†ú7ú7xú7qú7jú7cú7\ú7Uú7Nú7Gú7@ú79ú72ú7+ú7$ú7ú7ú7ú7ú7ú7úù7óù7ìù7åù7Þù7×ù7Ðù7Éù7Âù7»ù7´ù7­ù7¦ù7Ÿù7˜ù7‘ù7Šù7ƒù7|ù7uù7nù7gù7`ù7Yù7Rù7Kù7Dù7=ù76ù7/ù7(ù7!ù7ù7ù7 ù7ù7þø7÷ø7ðø7éø7âø7Ûø7Ôø7Íø7Æø7¿ø7¸ø7±ø7ªø7£ø7œø7•ø7Žø7‡ø7€ø7yø7rø7kø7dø7]ø7Vø7Oø7Hø7Aø7:ø73ø7,ø7%ø7ø7ø7ø7 ø7ø7û÷7ô÷7í÷7æ÷7ß÷7Ø÷7Ñ÷7Ê÷7Ã÷7¼÷7µ÷7®÷7§÷7 ÷7™÷7’÷7‹÷7„÷7}÷7v÷7o÷7h÷7a÷7Z÷7S÷7L÷7E÷7>÷77÷70÷7)÷7"÷7÷7÷7 ÷7÷7ÿö7øö7ñö7êö7ãö7Üö7Õö7Îö7Çö7Àö7¹ö7²ö7«ö7¤ö7ö7–ö7ö7ˆö7ö7zö7sö7lö7eö7^ö7Wö7Pö7Iö7Bö7;ö74ö7-ö7&ö7ö7ö7ö7 ö7ö7üõ7õõ7îõ7çõ7àõ7Ùõ7Òõ7Ëõ7Äõ7½õ7¶õ7¯õ7¨õ7¡õ7šõ7“õ7Œõ7…õ7~õ7wõ7põ7iõ7bõ7[õ7Tõ7Mõ7Fõ7?õ78õ71õ7*õ7#õ7õ7õ7õ7õ7õ7ùô7òô7ëô7äô7Ýô7Öô7Ïô7Èô7Áô7ºô7³ô7¬ô7¥ô7žô7—ô7ô7‰ô7‚ô7{ô7tô7mô7fô7_ô7Xô7Qô7Jô7Cô7<ô75ô7.ô7'ô7 ô7ô7ô7 ô7ô7ýó7öó7ïó7èó7áó7Úó7Óó7Ìó7Åó7¾ó7·ó7°ó7©ó7¢ó7›ó7”ó7ó7†ó7ó7xó7qó7jó7có7\ó7Uó7Nó7Gó7@ó79ó72ó7+ó7$ó7ó7ó7ó7ó7ó7úò7óò7ìò7åò7Þò7×ò7Ðò7Éò7Âò7»ò7´ò7­ò7¦ò7Ÿò7˜ò7‘ò7Šò7ƒò7|ò7uò7nò7gò7`ò7Yò7Rò7Kò7Dò7=ò76ò7/ò7(ò7!ò7ò7ò7 ò7ò7þñ7÷ñ7ðñ7éñ7âñ7Ûñ7Ôñ7Íñ7Æñ7¿ñ7¸ñ7±ñ7ªñ7£ñ7œñ7•ñ7Žñ7‡ñ7€ñ7yñ7rñ7kñ7dñ7]ñ7Vñ7Oñ7Hñ7Añ7:ñ73ñ7,ñ7%ñ7ñ7ñ7ñ7 ñ7ñ7ûð7ôð7íð7æð7ßð7Øð7Ñð7Êð7Ãð7¼ð7µð7®ð7§ð7 ð7™ð7’ð7‹ð7„ð7}ð7vð7oð7hð7að7Zð7Sð7Lð7Eð7>ð77ð70ð7)ð7"ð7ð7ð7 ð7ð7ÿï7øï7ñï7êï7ãï7Üï7Õï7Îï7Çï7Àï7¹ï7²ï7«ï7¤ï7ï7–ï7ï7ˆï7ï7zï7sï7lï7eï7^ï7Wï7Pï7Iï7Bï7;ï74ï7-ï7&ï7ï7ï7ï7 ï7ï7üî7õî7îî7çî7àî7Ùî7Òî7Ëî7Äî7½î7¶î7¯î7¨î7¡î7šî7“î7Œî7…î7~î7wî7pî7iî7bî7[î7Tî7Mî7Fî7?î78î71î7*î7#î7î7î7î7î7î7ùí7òí7ëí7äí7Ýí7Öí7Ïí7Èí7Áí7ºí7³í7¬í7¥í7ží7—í7í7‰í7‚í7{í7tí7mí7fí7_í7Xí7Qí7Jí7Cí7<í75í7.í7'í7 í7í7í7 í7í7ýì7öì7ïì7èì7áì7Úì7Óì7Ìì7Åì7¾ì7·ì7°ì7©ì7¢ì7›ì7”ì7ì7†ì7ì7xì7qì7jì7cì7\ì7Uì7Nì7Gì7@ì79ì72ì7+ì7$ì7ì7ì7ì7ì7ì7úë7óë7ìë7åë7Þë7×ë7Ðë7Éë7Âë7»ë7´ë7­ë7¦ë7Ÿë7˜ë7‘ë7Šë7ƒë7|ë7uë7në7gë7`ë7Yë7Rë7Kë7Dë7=ë76ë7/ë7(ë7!ë7ë7ë7 ë7ë7þê7÷ê7ðê7éê7âê7Ûê7Ôê7Íê7Æê7¿ê7¸ê7±ê7ªê7£ê7œê7•ê7Žê7‡ê7€ê7yê7rê7kê7dê7]ê7Vê7Oê7Hê7Aê7:ê73ê7,ê7%ê7ê7ê7ê7 ê7ê7ûé7ôé7íé7æé7ßé7Øé7Ñé7Êé7Ãé7¼é7µé7®é7§é7 é7™é7’é7‹é7„é7}é7vé7oé7hé7aé7Zé7Sé7Lé7Eé7>é77é70é7)é7"é7é7é7 é7é7ÿè7øè7ñè7êè7ãè7Üè7Õè7Îè7Çè7Àè7¹è7²è7«è7¤è7è7–è7è7ˆè7è7zè7sè7lè7eè7^è7Wè7Pè7Iè7Bè7;è74è7-è7&è7è7è7è7 è7è7üç7õç7îç7çç7àç7Ùç7Òç7Ëç7Äç7½ç7¶ç7¯ç7¨ç7¡ç7šç7“ç7Œç7…ç7~ç7wç7pç7iç7bç7[ç7Tç7Mç7Fç7?ç78ç71ç7*ç7#ç7ç7ç7ç7ç7ç7ùæ7òæ7ëæ7äæ7Ýæ7Öæ7Ïæ7Èæ7Áæ7ºæ7³æ7¬æ7¥æ7žæ7—æ7æ7‰æ7‚æ7{æ7tæ7mæ7fæ7_æ7Xæ7Qæ7Jæ7Cæ7<æ75æ7.æ7'æ7 æ7æ7æ7 æ7æ7ýå7öå7ïå7èå7áå7Úå7Óå7Ìå7Åå7¾å7·å7°å7©å7¢å7›å7”å7å7†å7å7xå7qå7jå7cå7\å7Uå7Nå7Gå7@å79å72å7+å7$å7å7å7å7å7å7úä7óä7ìä7åä7Þä7×ä7Ðä7Éä7Âä7»ä7´ä7­ä7¦ä7Ÿä7˜ä7‘ä7Šä7ƒä7|ä7uä7nä7gä7`ä7Yä7Rä7Kä7Dä7=ä76ä7/ä7(ä7!ä7ä7ä7 ä7ä7þã7÷ã7ðã7éã7âã7Ûã7Ôã7Íã7Æã7¿ã7¸ã7±ã7ªã7£ã7œã7•ã7Žã7‡ã7€ã7yã7rã7kã7dã7]ã7Vã7Oã7Hã7Aã7:ã73ã7,ã7%ã7ã7ã7ã7 ã7ã7ûâ7ôâ7íâ7æâ7ßâ7Øâ7Ñâ7Êâ7Ãâ7¼â7µâ7®â7§â7 â7™â7’â7‹â7„â7}â7vâ7oâ7hâ7aâ7Zâ7Sâ7Lâ7Eâ7>â77â70â7)â7"â7â7â7 â7â7ÿá7øá7ñá7êá7ãá7Üá7Õá7Îá7Çá7Àá7¹á7²á7«á7¤á7á7–á7á7ˆá7á7zá7sá7lá7eá7^á7Wá7Pá7Iá7Bá7;á74á7-á7&á7á7á7á7 á7á7üà7õà7îà7çà7àà7Ùà7Òà7Ëà7Äà7½à7¶à7¯à7¨à7¡à7šà7“à7Œà7…à7~à7wà7pà7ià7bà7[à7Tà7Mà7Fà7?à78à71à7*à7#à7à7à7à7à7à7ùß7òß7ëß7äß7Ýß7Öß7Ïß7Èß7Áß7ºß7³ß7¬ß7¥ß7žß7—ß7ß7‰ß7‚ß7{ß7tß7mß7fß7_ß7Xß7Qß7Jß7Cß7<ß75ß7.ß7'ß7 ß7ß7ß7 ß7ß7ýÞ7öÞ7ïÞ7èÞ7áÞ7ÚÞ7ÓÞ7ÌÞ7ÅÞ7¾Þ7·Þ7°Þ7©Þ7¢Þ7›Þ7”Þ7Þ7†Þ7Þ7xÞ7qÞ7jÞ7cÞ7\Þ7UÞ7NÞ7GÞ7@Þ79Þ72Þ7+Þ7$Þ7Þ7Þ7Þ7Þ7Þ7úÝ7óÝ7ìÝ7åÝ7ÞÝ7×Ý7ÐÝ7ÉÝ7ÂÝ7»Ý7´Ý7­Ý7¦Ý7ŸÝ7˜Ý7‘Ý7ŠÝ7ƒÝ7|Ý7uÝ7nÝ7gÝ7`Ý7YÝ7RÝ7KÝ7DÝ7=Ý76Ý7/Ý7(Ý7!Ý7Ý7Ý7 Ý7Ý7þÜ7÷Ü7ðÜ7éÜ7âÜ7ÛÜ7ÔÜ7ÍÜ7ÆÜ7¿Ü7¸Ü7±Ü7ªÜ7£Ü7œÜ7•Ü7ŽÜ7‡Ü7€Ü7yÜ7rÜ7kÜ7dÜ7]Ü7VÜ7OÜ7HÜ7AÜ7:Ü73Ü7,Ü7%Ü7Ü7Ü7Ü7 Ü7Ü7ûÛ7ôÛ7íÛ7æÛ7ßÛ7ØÛ7ÑÛ7ÊÛ7ÃÛ7¼Û7µÛ7®Û7§Û7 Û7™Û7’Û7‹Û7„Û7}Û7vÛ7oÛ7hÛ7aÛ7ZÛ7SÛ7LÛ7EÛ7>Û77Û70Û7)Û7"Û7Û7Û7 Û7Û7ÿÚ7øÚ7ñÚ7êÚ7ãÚ7ÜÚ7ÕÚ7ÎÚ7ÇÚ7ÀÚ7¹Ú7²Ú7«Ú7¤Ú7Ú7–Ú7Ú7ˆÚ7Ú7zÚ7sÚ7lÚ7eÚ7^Ú7WÚ7PÚ7IÚ7BÚ7;Ú74Ú7-Ú7&Ú7Ú7Ú7Ú7 Ú7Ú7üÙ7õÙ7îÙ7çÙ7àÙ7ÙÙ7ÒÙ7ËÙ7ÄÙ7½Ù7¶Ù7¯Ù7¨Ù7¡Ù7šÙ7“Ù7ŒÙ7…Ù7~Ù7wÙ7pÙ7iÙ7bÙ7[Ù7TÙ7MÙ7FÙ7?Ù78Ù71Ù7*Ù7#Ù7Ù7Ù7Ù7Ù7Ù7ùØ7òØ7ëØ7äØ7ÝØ7ÖØ7ÏØ7ÈØ7ÁØ7ºØ7³Ø7¬Ø7¥Ø7žØ7—Ø7Ø7‰Ø7‚Ø7{Ø7tØ7mØ7fØ7_Ø7XØ7QØ7JØ7CØ7<Ø75Ø7.Ø7'Ø7 Ø7Ø7Ø7 Ø7Ø7ý×7ö×7ï×7è×7á×7Ú×7Ó×7Ì×7Å×7¾×7·×7°×7©×7¢×7›×7”×7×7†×7×7x×7q×7j×7c×7\×7U×7N×7G×7@×79×72×7+×7$×7×7×7×7×7×7úÖ7óÖ7ìÖ7åÖ7ÞÖ7×Ö7ÐÖ7ÉÖ7ÂÖ7»Ö7´Ö7­Ö7¦Ö7ŸÖ7˜Ö7‘Ö7ŠÖ7ƒÖ7|Ö7uÖ7nÖ7gÖ7`Ö7YÖ7RÖ7KÖ7DÖ7=Ö76Ö7/Ö7(Ö7!Ö7Ö7Ö7 Ö7Ö7þÕ7÷Õ7ðÕ7éÕ7âÕ7ÛÕ7ÔÕ7ÍÕ7ÆÕ7¿Õ7¸Õ7±Õ7ªÕ7£Õ7œÕ7•Õ7ŽÕ7‡Õ7€Õ7yÕ7rÕ7kÕ7dÕ7]Õ7VÕ7OÕ7HÕ7AÕ7:Õ73Õ7,Õ7%Õ7Õ7Õ7Õ7 Õ7Õ7ûÔ7ôÔ7íÔ7æÔ7ßÔ7ØÔ7ÑÔ7ÊÔ7ÃÔ7¼Ô7µÔ7®Ô7§Ô7 Ô7™Ô7’Ô7‹Ô7„Ô7}Ô7vÔ7oÔ7hÔ7aÔ7ZÔ7SÔ7LÔ7EÔ7>Ô77Ô70Ô7)Ô7"Ô7Ô7Ô7 Ô7Ô7ÿÓ7øÓ7ñÓ7êÓ7ãÓ7ÜÓ7ÕÓ7ÎÓ7ÇÓ7ÀÓ7¹Ó7²Ó7«Ó7¤Ó7Ó7–Ó7Ó7ˆÓ7Ó7zÓ7sÓ7lÓ7eÓ7^Ó7WÓ7PÓ7IÓ7BÓ7;Ó74Ó7-Ó7&Ó7Ó7Ó7Ó7 Ó7Ó7üÒ7õÒ7îÒ7çÒ7àÒ7ÙÒ7ÒÒ7ËÒ7ÄÒ7½Ò7¶Ò7¯Ò7¨Ò7¡Ò7šÒ7“Ò7ŒÒ7…Ò7~Ò7wÒ7pÒ7iÒ7bÒ7[Ò7TÒ7MÒ7FÒ7?Ò78Ò71Ò7*Ò7#Ò7Ò7Ò7Ò7Ò7Ò7ùÑ7òÑ7ëÑ7äÑ7ÝÑ7ÖÑ7ÏÑ7ÈÑ7ÁÑ7ºÑ7³Ñ7¬Ñ7¥Ñ7žÑ7—Ñ7Ñ7‰Ñ7‚Ñ7{Ñ7tÑ7mÑ7fÑ7_Ñ7XÑ7QÑ7JÑ7CÑ7<Ñ75Ñ7.Ñ7'Ñ7 Ñ7Ñ7Ñ7 Ñ7Ñ7ýÐ7öÐ7ïÐ7èÐ7áÐ7ÚÐ7ÓÐ7ÌÐ7ÅÐ7¾Ð7·Ð7°Ð7©Ð7¢Ð7›Ð7”Ð7Ð7†Ð7Ð7xÐ7qÐ7jÐ7cÐ7\Ð7UÐ7NÐ7GÐ7@Ð79Ð72Ð7+Ð7$Ð7Ð7Ð7Ð7Ð7Ð7úÏ7óÏ7ìÏ7åÏ7ÞÏ7×Ï7ÐÏ7ÉÏ7ÂÏ7»Ï7´Ï7­Ï7¦Ï7ŸÏ7˜Ï7‘Ï7ŠÏ7ƒÏ7|Ï7uÏ7nÏ7gÏ7`Ï7YÏ7RÏ7KÏ7DÏ7=Ï76Ï7/Ï7(Ï7!Ï7Ï7Ï7 Ï7Ï7þÎ7÷Î7ðÎ7éÎ7âÎ7ÛÎ7ÔÎ7ÍÎ7ÆÎ7¿Î7¸Î7±Î7ªÎ7£Î7œÎ7•Î7ŽÎ7‡Î7€Î7yÎ7rÎ7kÎ7dÎ7]Î7VÎ7OÎ7HÎ7AÎ7:Î73Î7,Î7%Î7Î7Î7Î7 Î7Î7ûÍ7ôÍ7íÍ7æÍ7ßÍ7ØÍ7ÑÍ7ÊÍ7ÃÍ7¼Í7µÍ7®Í7§Í7 Í7™Í7’Í7‹Í7„Í7}Í7vÍ7oÍ7hÍ7aÍ7ZÍ7SÍ7LÍ7EÍ7>Í77Í70Í7)Í7"Í7Í7Í7 Í7Í7ÿÌ7øÌ7ñÌ7êÌ7ãÌ7ÜÌ7ÕÌ7ÎÌ7ÇÌ7ÀÌ7¹Ì7²Ì7«Ì7¤Ì7Ì7–Ì7Ì7ˆÌ7Ì7zÌ7sÌ7lÌ7eÌ7^Ì7WÌ7PÌ7IÌ7BÌ7;Ì74Ì7-Ì7&Ì7Ì7Ì7Ì7 Ì7Ì7üË7õË7îË7çË7àË7ÙË7ÒË7ËË7ÄË7½Ë7¶Ë7¯Ë7¨Ë7¡Ë7šË7“Ë7ŒË7…Ë7~Ë7wË7pË7iË7bË7[Ë7TË7MË7FË7?Ë78Ë71Ë7*Ë7#Ë7Ë7Ë7Ë7Ë7Ë7ùÊ7òÊ7ëÊ7äÊ7ÝÊ7ÖÊ7ÏÊ7ÈÊ7ÁÊ7ºÊ7³Ê7¬Ê7¥Ê7žÊ7—Ê7Ê7‰Ê7‚Ê7{Ê7tÊ7mÊ7fÊ7_Ê7XÊ7QÊ7JÊ7CÊ7<Ê75Ê7.Ê7'Ê7 Ê7Ê7Ê7 Ê7Ê7ýÉ7öÉ7ïÉ7èÉ7áÉ7ÚÉ7ÓÉ7ÌÉ7ÅÉ7¾É7·É7°É7©É7¢É7›É7”É7É7†É7É7xÉ7qÉ7jÉ7cÉ7\É7UÉ7NÉ7GÉ7@É79É72É7+É7$É7É7É7É7É7É7úÈ7óÈ7ìÈ7åÈ7ÞÈ7×È7ÐÈ7ÉÈ7ÂÈ7»È7´È7­È7¦È7ŸÈ7˜È7‘È7ŠÈ7ƒÈ7|È7uÈ7nÈ7gÈ7`È7YÈ7RÈ7KÈ7DÈ7=È76È7/È7(È7!È7È7È7 È7È7þÇ7÷Ç7ðÇ7éÇ7âÇ7ÛÇ7ÔÇ7ÍÇ7ÆÇ7¿Ç7¸Ç7±Ç7ªÇ7£Ç7œÇ7•Ç7ŽÇ7‡Ç7€Ç7yÇ7rÇ7kÇ7dÇ7]Ç7VÇ7OÇ7HÇ7AÇ7:Ç73Ç7,Ç7%Ç7Ç7Ç7Ç7 Ç7Ç7ûÆ7ôÆ7íÆ7æÆ7߯7ØÆ7ÑÆ7ÊÆ7ÃÆ7¼Æ7µÆ7®Æ7§Æ7 Æ7™Æ7’Æ7‹Æ7„Æ7}Æ7vÆ7oÆ7hÆ7aÆ7ZÆ7SÆ7LÆ7EÆ7>Æ77Æ70Æ7)Æ7"Æ7Æ7Æ7 Æ7Æ7ÿÅ7øÅ7ñÅ7êÅ7ãÅ7ÜÅ7ÕÅ7ÎÅ7ÇÅ7ÀÅ7¹Å7²Å7«Å7¤Å7Å7–Å7Å7ˆÅ7Å7zÅ7sÅ7lÅ7eÅ7^Å7WÅ7PÅ7IÅ7BÅ7;Å74Å7-Å7&Å7Å7Å7Å7 Å7Å7üÄ7õÄ7îÄ7çÄ7àÄ7ÙÄ7ÒÄ7ËÄ7ÄÄ7½Ä7¶Ä7¯Ä7¨Ä7¡Ä7šÄ7“Ä7ŒÄ7…Ä7~Ä7wÄ7pÄ7iÄ7bÄ7[Ä7TÄ7MÄ7FÄ7?Ä78Ä71Ä7*Ä7#Ä7Ä7Ä7Ä7Ä7Ä7ùÃ7òÃ7ëÃ7äÃ7ÝÃ7ÖÃ7ÏÃ7ÈÃ7ÁÃ7ºÃ7³Ã7¬Ã7¥Ã7žÃ7—Ã7Ã7‰Ã7‚Ã7{Ã7tÃ7mÃ7fÃ7_Ã7XÃ7QÃ7JÃ7CÃ7<Ã75Ã7.Ã7'Ã7 Ã7Ã7Ã7 Ã7Ã7ýÂ7öÂ7ïÂ7èÂ7áÂ7ÚÂ7ÓÂ7ÌÂ7ÅÂ7¾Â7·Â7°Â7©Â7¢Â7›Â7”Â7Â7†Â7Â7xÂ7qÂ7jÂ7cÂ7\Â7UÂ7NÂ7GÂ7@Â79Â72Â7+Â7$Â7Â7Â7Â7Â7Â7úÁ7óÁ7ìÁ7åÁ7ÞÁ7×Á7ÐÁ7ÉÁ7ÂÁ7»Á7´Á7­Á7¦Á7ŸÁ7˜Á7‘Á7ŠÁ7ƒÁ7|Á7uÁ7nÁ7gÁ7`Á7YÁ7RÁ7KÁ7DÁ7=Á76Á7/Á7(Á7!Á7Á7Á7 Á7Á7þÀ7÷À7ðÀ7éÀ7âÀ7ÛÀ7ÔÀ7ÍÀ7ÆÀ7¿À7¸À7±À7ªÀ7£À7œÀ7•À7ŽÀ7‡À7€À7yÀ7rÀ7kÀ7dÀ7]À7VÀ7OÀ7HÀ7AÀ7:À73À7,À7%À7À7À7À7 À7À7û¿7ô¿7í¿7æ¿7ß¿7Ø¿7Ñ¿7Ê¿7ÿ7¼¿7µ¿7®¿7§¿7 ¿7™¿7’¿7‹¿7„¿7}¿7v¿7o¿7h¿7a¿7Z¿7S¿7L¿7E¿7>¿77¿70¿7)¿7"¿7¿7¿7 ¿7¿7ÿ¾7ø¾7ñ¾7ê¾7ã¾7ܾ7Õ¾7ξ7Ǿ7À¾7¹¾7²¾7«¾7¤¾7¾7–¾7¾7ˆ¾7¾7z¾7s¾7l¾7e¾7^¾7W¾7P¾7I¾7B¾7;¾74¾7-¾7&¾7¾7¾7¾7 ¾7¾7ü½7õ½7î½7ç½7à½7Ù½7Ò½7˽7Ľ7½½7¶½7¯½7¨½7¡½7š½7“½7Œ½7…½7~½7w½7p½7i½7b½7[½7T½7M½7F½7?½78½71½7*½7#½7½7½7½7½7½7ù¼7ò¼7ë¼7ä¼7ݼ7Ö¼7ϼ7ȼ7Á¼7º¼7³¼7¬¼7¥¼7ž¼7—¼7¼7‰¼7‚¼7{¼7t¼7m¼7f¼7_¼7X¼7Q¼7J¼7C¼7<¼75¼7.¼7'¼7 ¼7¼7¼7 ¼7¼7ý»7ö»7ï»7è»7á»7Ú»7Ó»7Ì»7Å»7¾»7·»7°»7©»7¢»7›»7”»7»7†»7»7x»7q»7j»7c»7\»7U»7N»7G»7@»79»72»7+»7$»7»7»7»7»7»7úº7óº7ìº7åº7Þº7׺7к7ɺ7º7»º7´º7­º7¦º7Ÿº7˜º7‘º7Šº7ƒº7|º7uº7nº7gº7`º7Yº7Rº7Kº7Dº7=º76º7/º7(º7!º7º7º7 º7º7þ¹7÷¹7ð¹7é¹7â¹7Û¹7Ô¹7͹7ƹ7¿¹7¸¹7±¹7ª¹7£¹7œ¹7•¹7޹7‡¹7€¹7y¹7r¹7k¹7d¹7]¹7V¹7O¹7H¹7A¹7:¹73¹7,¹7%¹7¹7¹7¹7 ¹7¹7û¸7ô¸7í¸7æ¸7߸7ظ7Ѹ7ʸ7ø7¼¸7µ¸7®¸7§¸7 ¸7™¸7’¸7‹¸7„¸7}¸7v¸7o¸7h¸7a¸7Z¸7S¸7L¸7E¸7>¸77¸70¸7)¸7"¸7¸7¸7 ¸7¸7ÿ·7ø·7ñ·7ê·7ã·7Ü·7Õ·7η7Ç·7À·7¹·7²·7«·7¤·7·7–·7·7ˆ·7·7z·7s·7l·7e·7^·7W·7P·7I·7B·7;·74·7-·7&·7·7·7·7 ·7·7ü¶7õ¶7î¶7ç¶7à¶7Ù¶7Ò¶7˶7Ķ7½¶7¶¶7¯¶7¨¶7¡¶7š¶7“¶7Œ¶7…¶7~¶7w¶7p¶7i¶7b¶7[¶7T¶7M¶7F¶7?¶78¶71¶7*¶7#¶7¶7¶7¶7¶7¶7ùµ7òµ7ëµ7äµ7ݵ7Öµ7ϵ7ȵ7Áµ7ºµ7³µ7¬µ7¥µ7žµ7—µ7µ7‰µ7‚µ7{µ7tµ7mµ7fµ7_µ7Xµ7Qµ7Jµ7Cµ7<µ75µ7.µ7'µ7 µ7µ7µ7 µ7µ7ý´7ö´7ï´7è´7á´7Ú´7Ó´7Ì´7Å´7¾´7·´7°´7©´7¢´7›´7”´7´7†´7´7x´7q´7j´7c´7\´7U´7N´7G´7@´79´72´7+´7$´7´7´7´7´7´7ú³7ó³7ì³7å³7Þ³7׳7г7ɳ7³7»³7´³7­³7¦³7Ÿ³7˜³7‘³7г7ƒ³7|³7u³7n³7g³7`³7Y³7R³7K³7D³7=³76³7/³7(³7!³7³7³7 ³7³7þ²7÷²7ð²7é²7â²7Û²7Ô²7Ͳ7Ʋ7¿²7¸²7±²7ª²7£²7œ²7•²7޲7‡²7€²7y²7r²7k²7d²7]²7V²7O²7H²7A²7:²73²7,²7%²7²7²7²7 ²7²7û±7ô±7í±7æ±7ß±7ر7ѱ7ʱ7ñ7¼±7µ±7®±7§±7 ±7™±7’±7‹±7„±7}±7v±7o±7h±7a±7Z±7S±7L±7E±7>±77±70±7)±7"±7±7±7 ±7±7ÿ°7ø°7ñ°7ê°7ã°7ܰ7Õ°7ΰ7ǰ7À°7¹°7²°7«°7¤°7°7–°7°7ˆ°7°7z°7s°7l°7e°7^°7W°7P°7I°7B°7;°74°7-°7&°7°7°7°7 °7°7ü¯7õ¯7î¯7ç¯7à¯7Ù¯7Ò¯7˯7į7½¯7¶¯7¯¯7¨¯7¡¯7š¯7“¯7Œ¯7…¯7~¯7w¯7p¯7i¯7b¯7[¯7T¯7M¯7F¯7?¯78¯71¯7*¯7#¯7¯7¯7¯7¯7¯7ù®7ò®7ë®7ä®7Ý®7Ö®7Ï®7È®7Á®7º®7³®7¬®7¥®7ž®7—®7®7‰®7‚®7{®7t®7m®7f®7_®7X®7Q®7J®7C®7<®75®7.®7'®7 ®7®7®7 ®7®7ý­7ö­7ï­7è­7á­7Ú­7Ó­7Ì­7Å­7¾­7·­7°­7©­7¢­7›­7”­7­7†­7­7x­7q­7j­7c­7\­7U­7N­7G­7@­79­72­7+­7$­7­7­7­7­7­7ú¬7ó¬7ì¬7å¬7Þ¬7׬7Ь7ɬ7¬7»¬7´¬7­¬7¦¬7Ÿ¬7˜¬7‘¬7Ь7ƒ¬7|¬7u¬7n¬7g¬7`¬7Y¬7R¬7K¬7D¬7=¬76¬7/¬7(¬7!¬7¬7¬7 ¬7¬7þ«7÷«7ð«7é«7â«7Û«7Ô«7Í«7Æ«7¿«7¸«7±«7ª«7£«7œ«7•«7Ž«7‡«7€«7y«7r«7k«7d«7]«7V«7O«7H«7A«7:«73«7,«7%«7«7«7«7 «7«7ûª7ôª7íª7æª7ߪ7ت7Ѫ7ʪ7ê7¼ª7µª7®ª7§ª7 ª7™ª7’ª7‹ª7„ª7}ª7vª7oª7hª7aª7Zª7Sª7Lª7Eª7>ª77ª70ª7)ª7"ª7ª7ª7 ª7ª7ÿ©7ø©7ñ©7ê©7ã©7Ü©7Õ©7Ω7Ç©7À©7¹©7²©7«©7¤©7©7–©7©7ˆ©7©7z©7s©7l©7e©7^©7W©7P©7I©7B©7;©74©7-©7&©7©7©7©7 ©7©7ü¨7õ¨7î¨7ç¨7à¨7Ù¨7Ò¨7˨7Ĩ7½¨7¶¨7¯¨7¨¨7¡¨7š¨7“¨7Œ¨7…¨7~¨7w¨7p¨7i¨7b¨7[¨7T¨7M¨7F¨7?¨78¨71¨7*¨7#¨7¨7¨7¨7¨7¨7ù§7ò§7ë§7ä§7ݧ7Ö§7ϧ7ȧ7Á§7º§7³§7¬§7¥§7ž§7—§7§7‰§7‚§7{§7t§7m§7f§7_§7X§7Q§7J§7C§7<§75§7.§7'§7 §7§7§7 §7§7ý¦7ö¦7ï¦7è¦7á¦7Ú¦7Ó¦7̦7Ŧ7¾¦7·¦7°¦7©¦7¢¦7›¦7”¦7¦7†¦7¦7x¦7q¦7j¦7c¦7\¦7U¦7N¦7G¦7@¦79¦72¦7+¦7$¦7¦7¦7¦7¦7¦7ú¥7ó¥7ì¥7å¥7Þ¥7×¥7Ð¥7É¥7Â¥7»¥7´¥7­¥7¦¥7Ÿ¥7˜¥7‘¥7Š¥7ƒ¥7|¥7u¥7n¥7g¥7`¥7Y¥7R¥7K¥7D¥7=¥76¥7/¥7(¥7!¥7¥7¥7 ¥7¥7þ¤7÷¤7ð¤7é¤7â¤7Û¤7Ô¤7ͤ7Ƥ7¿¤7¸¤7±¤7ª¤7£¤7œ¤7•¤7ޤ7‡¤7€¤7y¤7r¤7k¤7d¤7]¤7V¤7O¤7H¤7A¤7:¤73¤7,¤7%¤7¤7¤7¤7 ¤7¤7û£7ô£7í£7æ£7ߣ7Ø£7Ñ£7Ê£7ã7¼£7µ£7®£7§£7 £7™£7’£7‹£7„£7}£7v£7o£7h£7a£7Z£7S£7L£7E£7>£77£70£7)£7"£7£7£7 £7£7ÿ¢7ø¢7ñ¢7ê¢7ã¢7Ü¢7Õ¢7΢7Ç¢7À¢7¹¢7²¢7«¢7¤¢7¢7–¢7¢7ˆ¢7¢7z¢7s¢7l¢7e¢7^¢7W¢7P¢7I¢7B¢7;¢74¢7-¢7&¢7¢7¢7¢7 ¢7¢7ü¡7õ¡7î¡7ç¡7à¡7Ù¡7Ò¡7Ë¡7Ä¡7½¡7¶¡7¯¡7¨¡7¡¡7š¡7“¡7Œ¡7…¡7~¡7w¡7p¡7i¡7b¡7[¡7T¡7M¡7F¡7?¡78¡71¡7*¡7#¡7¡7¡7¡7¡7¡7ù 7ò 7ë 7ä 7Ý 7Ö 7Ï 7È 7Á 7º 7³ 7¬ 7¥ 7ž 7— 7 7‰ 7‚ 7{ 7t 7m 7f 7_ 7X 7Q 7J 7C 7< 75 7. 7' 7  7 7 7  7 7ýŸ7öŸ7ïŸ7èŸ7áŸ7ÚŸ7ÓŸ7ÌŸ7ÅŸ7¾Ÿ7·Ÿ7°Ÿ7©Ÿ7¢Ÿ7›Ÿ7”Ÿ7Ÿ7†Ÿ7Ÿ7xŸ7qŸ7jŸ7cŸ7\Ÿ7UŸ7NŸ7GŸ7@Ÿ79Ÿ72Ÿ7+Ÿ7$Ÿ7Ÿ7Ÿ7Ÿ7Ÿ7Ÿ7úž7óž7ìž7åž7Þž7מ7О7Éž7ž7»ž7´ž7­ž7¦ž7Ÿž7˜ž7‘ž7Šž7ƒž7|ž7už7nž7gž7`ž7Yž7Rž7Kž7Dž7=ž76ž7/ž7(ž7!ž7ž7ž7 ž7ž7þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77ûœ7ôœ7íœ7æœ7ßœ7Øœ7Ñœ7Êœ7Ü7¼œ7µœ7®œ7§œ7 œ7™œ7’œ7‹œ7„œ7}œ7vœ7oœ7hœ7aœ7Zœ7Sœ7Lœ7Eœ7>œ77œ70œ7)œ7"œ7œ7œ7 œ7œ7ÿ›7ø›7ñ›7ê›7ã›7Ü›7Õ›7Λ7Ç›7À›7¹›7²›7«›7¤›7›7–›7›7ˆ›7›7z›7s›7l›7e›7^›7W›7P›7I›7B›7;›74›7-›7&›7›7›7›7 ›7›7üš7õš7îš7çš7àš7Ùš7Òš7Ëš7Äš7½š7¶š7¯š7¨š7¡š7šš7“š7Œš7…š7~š7wš7pš7iš7bš7[š7Tš7Mš7Fš7?š78š71š7*š7#š7š7š7š7š7š7ù™7ò™7ë™7ä™7Ý™7Ö™7Ï™7È™7Á™7º™7³™7¬™7¥™7ž™7—™7™7‰™7‚™7{™7t™7m™7f™7_™7X™7Q™7J™7C™7<™75™7.™7'™7 ™7™7™7 ™7™7ý˜7ö˜7ï˜7è˜7á˜7Ú˜7Ó˜7̘7Ř7¾˜7·˜7°˜7©˜7¢˜7›˜7”˜7˜7†˜7˜7x˜7q˜7j˜7c˜7\˜7U˜7N˜7G˜7@˜79˜72˜7+˜7$˜7˜7˜7˜7˜7˜7ú—7ó—7ì—7å—7Þ—7×—7З7É—7—7»—7´—7­—7¦—7Ÿ—7˜—7‘—7Š—7ƒ—7|—7u—7n—7g—7`—7Y—7R—7K—7D—7=—76—7/—7(—7!—7—7—7 —7—7þ–7÷–7ð–7é–7â–7Û–7Ô–7Í–7Æ–7¿–7¸–7±–7ª–7£–7œ–7•–7Ž–7‡–7€–7y–7r–7k–7d–7]–7V–7O–7H–7A–7:–73–7,–7%–7–7–7–7 –7–7û•7ô•7í•7æ•7ß•7Ø•7Ñ•7Ê•7Õ7¼•7µ•7®•7§•7 •7™•7’•7‹•7„•7}•7v•7o•7h•7a•7Z•7S•7L•7E•7>•77•70•7)•7"•7•7•7 •7•7ÿ”7ø”7ñ”7ê”7ã”7Ü”7Õ”7Δ7Ç”7À”7¹”7²”7«”7¤”7”7–”7”7ˆ”7”7z”7s”7l”7e”7^”7W”7P”7I”7B”7;”74”7-”7&”7”7”7”7 ”7”7ü“7õ“7î“7ç“7à“7Ù“7Ò“7Ë“7Ä“7½“7¶“7¯“7¨“7¡“7š“7““7Œ“7…“7~“7w“7p“7i“7b“7[“7T“7M“7F“7?“78“71“7*“7#“7“7“7“7“7“7ù’7ò’7ë’7ä’7Ý’7Ö’7Ï’7È’7Á’7º’7³’7¬’7¥’7ž’7—’7’7‰’7‚’7{’7t’7m’7f’7_’7X’7Q’7J’7C’7<’75’7.’7'’7 ’7’7’7 ’7’7ý‘7ö‘7ï‘7è‘7á‘7Ú‘7Ó‘7Ì‘7Å‘7¾‘7·‘7°‘7©‘7¢‘7›‘7”‘7‘7†‘7‘7x‘7q‘7j‘7c‘7\‘7U‘7N‘7G‘7@‘79‘72‘7+‘7$‘7‘7‘7‘7‘7‘7ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77ûŽ7ôŽ7íŽ7æŽ7ߎ7ØŽ7ÑŽ7ÊŽ7ÃŽ7¼Ž7µŽ7®Ž7§Ž7 Ž7™Ž7’Ž7‹Ž7„Ž7}Ž7vŽ7oŽ7hŽ7aŽ7ZŽ7SŽ7LŽ7EŽ7>Ž77Ž70Ž7)Ž7"Ž7Ž7Ž7 Ž7Ž7ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77üŒ7õŒ7îŒ7çŒ7àŒ7ÙŒ7ÒŒ7ËŒ7ÄŒ7½Œ7¶Œ7¯Œ7¨Œ7¡Œ7šŒ7“Œ7ŒŒ7…Œ7~Œ7wŒ7pŒ7iŒ7bŒ7[Œ7TŒ7MŒ7FŒ7?Œ78Œ71Œ7*Œ7#Œ7Œ7Œ7Œ7Œ7Œ7ù‹7ò‹7ë‹7ä‹7Ý‹7Ö‹7Ï‹7È‹7Á‹7º‹7³‹7¬‹7¥‹7ž‹7—‹7‹7‰‹7‚‹7{‹7t‹7m‹7f‹7_‹7X‹7Q‹7J‹7C‹7<‹75‹7.‹7'‹7 ‹7‹7‹7 ‹7‹7ýŠ7öŠ7ïŠ7èŠ7áŠ7ÚŠ7ÓŠ7ÌŠ7ÅŠ7¾Š7·Š7°Š7©Š7¢Š7›Š7”Š7Š7†Š7Š7xŠ7qŠ7jŠ7cŠ7\Š7UŠ7NŠ7GŠ7@Š79Š72Š7+Š7$Š7Š7Š7Š7Š7Š7ú‰7ó‰7ì‰7å‰7Þ‰7׉7Љ7ɉ7‰7»‰7´‰7­‰7¦‰7Ÿ‰7˜‰7‘‰7Љ7ƒ‰7|‰7u‰7n‰7g‰7`‰7Y‰7R‰7K‰7D‰7=‰76‰7/‰7(‰7!‰7‰7‰7 ‰7‰7þˆ7÷ˆ7ðˆ7éˆ7âˆ7Ûˆ7Ôˆ7͈7ƈ7¿ˆ7¸ˆ7±ˆ7ªˆ7£ˆ7œˆ7•ˆ7Žˆ7‡ˆ7€ˆ7yˆ7rˆ7kˆ7dˆ7]ˆ7Vˆ7Oˆ7Hˆ7Aˆ7:ˆ73ˆ7,ˆ7%ˆ7ˆ7ˆ7ˆ7 ˆ7ˆ7û‡7ô‡7í‡7æ‡7߇7؇7ч7ʇ7Ç7¼‡7µ‡7®‡7§‡7 ‡7™‡7’‡7‹‡7„‡7}‡7v‡7o‡7h‡7a‡7Z‡7S‡7L‡7E‡7>‡77‡70‡7)‡7"‡7‡7‡7 ‡7‡7ÿ†7ø†7ñ†7ê†7ã†7܆7Õ†7Ά7dž7À†7¹†7²†7«†7¤†7†7–†7†7ˆ†7†7z†7s†7l†7e†7^†7W†7P†7I†7B†7;†74†7-†7&†7†7†7†7 †7†7ü…7õ…7î…7ç…7à…7Ù…7Ò…7Ë…7Ä…7½…7¶…7¯…7¨…7¡…7š…7“…7Œ…7……7~…7w…7p…7i…7b…7[…7T…7M…7F…7?…78…71…7*…7#…7…7…7…7…7…7ù„7ò„7ë„7ä„7Ý„7Ö„7Ï„7È„7Á„7º„7³„7¬„7¥„7ž„7—„7„7‰„7‚„7{„7t„7m„7f„7_„7X„7Q„7J„7C„7<„75„7.„7'„7 „7„7„7 „7„7ýƒ7öƒ7ïƒ7èƒ7áƒ7Úƒ7Óƒ7̃7Ń7¾ƒ7·ƒ7°ƒ7©ƒ7¢ƒ7›ƒ7”ƒ7ƒ7†ƒ7ƒ7xƒ7qƒ7jƒ7cƒ7\ƒ7Uƒ7Nƒ7Gƒ7@ƒ79ƒ72ƒ7+ƒ7$ƒ7ƒ7ƒ7ƒ7ƒ7ƒ7ú‚7ó‚7ì‚7å‚7Þ‚7ׂ7Ђ7É‚7‚7»‚7´‚7­‚7¦‚7Ÿ‚7˜‚7‘‚7Š‚7ƒ‚7|‚7u‚7n‚7g‚7`‚7Y‚7R‚7K‚7D‚7=‚76‚7/‚7(‚7!‚7‚7‚7 ‚7‚7þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û€7ô€7í€7æ€7߀7Ø€7Ñ€7Ê€7À7¼€7µ€7®€7§€7 €7™€7’€7‹€7„€7}€7v€7o€7h€7a€7Z€7S€7L€7E€7>€77€70€7)€7"€7€7€7 €7€7ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü~7õ~7î~7ç~7à~7Ù~7Ò~7Ë~7Ä~7½~7¶~7¯~7¨~7¡~7š~7“~7Œ~7…~7~~7w~7p~7i~7b~7[~7T~7M~7F~7?~78~71~7*~7#~7~7~7~7~7~7ù}7ò}7ë}7ä}7Ý}7Ö}7Ï}7È}7Á}7º}7³}7¬}7¥}7ž}7—}7}7‰}7‚}7{}7t}7m}7f}7_}7X}7Q}7J}7C}7<}75}7.}7'}7 }7}7}7 }7}7ý|7ö|7ï|7è|7á|7Ú|7Ó|7Ì|7Å|7¾|7·|7°|7©|7¢|7›|7”|7|7†|7|7x|7q|7j|7c|7\|7U|7N|7G|7@|79|72|7+|7$|7|7|7|7|7|7ú{7ó{7ì{7å{7Þ{7×{7Ð{7É{7Â{7»{7´{7­{7¦{7Ÿ{7˜{7‘{7Š{7ƒ{7|{7u{7n{7g{7`{7Y{7R{7K{7D{7={76{7/{7({7!{7{7{7 {7{7þz7÷z7ðz7éz7âz7Ûz7Ôz7Íz7Æz7¿z7¸z7±z7ªz7£z7œz7•z7Žz7‡z7€z7yz7rz7kz7dz7]z7Vz7Oz7Hz7Az7:z73z7,z7%z7z7z7z7 z7z7ûy7ôy7íy7æy7ßy7Øy7Ñy7Êy7Ãy7¼y7µy7®y7§y7 y7™y7’y7‹y7„y7}y7vy7oy7hy7ay7Zy7Sy7Ly7Ey7>y77y70y7)y7"y7y7y7 y7y7ÿx7øx7ñx7êx7ãx7Üx7Õx7Îx7Çx7Àx7¹x7²x7«x7¤x7x7–x7x7ˆx7x7zx7sx7lx7ex7^x7Wx7Px7Ix7Bx7;x74x7-x7&x7x7x7x7 x7x7üw7õw7îw7çw7àw7Ùw7Òw7Ëw7Äw7½w7¶w7¯w7¨w7¡w7šw7“w7Œw7…w7~w7ww7pw7iw7bw7[w7Tw7Mw7Fw7?w78w71w7*w7#w7w7w7w7w7w7ùv7òv7ëv7äv7Ýv7Öv7Ïv7Èv7Áv7ºv7³v7¬v7¥v7žv7—v7v7‰v7‚v7{v7tv7mv7fv7_v7Xv7Qv7Jv7Cv7r77r70r7)r7"r7r7r7 r7r7ÿq7øq7ñq7êq7ãq7Üq7Õq7Îq7Çq7Àq7¹q7²q7«q7¤q7q7–q7q7ˆq7q7zq7sq7lq7eq7^q7Wq7Pq7Iq7Bq7;q74q7-q7&q7q7q7q7 q7q7üp7õp7îp7çp7àp7Ùp7Òp7Ëp7Äp7½p7¶p7¯p7¨p7¡p7šp7“p7Œp7…p7~p7wp7pp7ip7bp7[p7Tp7Mp7Fp7?p78p71p7*p7#p7p7p7p7p7p7ùo7òo7ëo7äo7Ýo7Öo7Ïo7Èo7Áo7ºo7³o7¬o7¥o7žo7—o7o7‰o7‚o7{o7to7mo7fo7_o7Xo7Qo7Jo7Co7k77k70k7)k7"k7k7k7 k7k7ÿj7øj7ñj7êj7ãj7Üj7Õj7Îj7Çj7Àj7¹j7²j7«j7¤j7j7–j7j7ˆj7j7zj7sj7lj7ej7^j7Wj7Pj7Ij7Bj7;j74j7-j7&j7j7j7j7 j7j7üi7õi7îi7çi7ài7Ùi7Òi7Ëi7Äi7½i7¶i7¯i7¨i7¡i7ši7“i7Œi7…i7~i7wi7pi7ii7bi7[i7Ti7Mi7Fi7?i78i71i7*i7#i7i7i7i7i7i7ùh7òh7ëh7äh7Ýh7Öh7Ïh7Èh7Áh7ºh7³h7¬h7¥h7žh7—h7h7‰h7‚h7{h7th7mh7fh7_h7Xh7Qh7Jh7Ch7d77d70d7)d7"d7d7d7 d7d7ÿc7øc7ñc7êc7ãc7Üc7Õc7Îc7Çc7Àc7¹c7²c7«c7¤c7c7–c7c7ˆc7c7zc7sc7lc7ec7^c7Wc7Pc7Ic7Bc7;c74c7-c7&c7c7c7c7 c7c7üb7õb7îb7çb7àb7Ùb7Òb7Ëb7Äb7½b7¶b7¯b7¨b7¡b7šb7“b7Œb7…b7~b7wb7pb7ib7bb7[b7Tb7Mb7Fb7?b78b71b7*b7#b7b7b7b7b7b7ùa7òa7ëa7äa7Ýa7Öa7Ïa7Èa7Áa7ºa7³a7¬a7¥a7ža7—a7a7‰a7‚a7{a7ta7ma7fa7_a7Xa7Qa7Ja7Ca7]77]70]7)]7"]7]7]7 ]7]7ÿ\7ø\7ñ\7ê\7ã\7Ü\7Õ\7Î\7Ç\7À\7¹\7²\7«\7¤\7\7–\7\7ˆ\7\7z\7s\7l\7e\7^\7W\7P\7I\7B\7;\74\7-\7&\7\7\7\7 \7\7ü[7õ[7î[7ç[7à[7Ù[7Ò[7Ë[7Ä[7½[7¶[7¯[7¨[7¡[7š[7“[7Œ[7…[7~[7w[7p[7i[7b[7[[7T[7M[7F[7?[78[71[7*[7#[7[7[7[7[7[7ùZ7òZ7ëZ7äZ7ÝZ7ÖZ7ÏZ7ÈZ7ÁZ7ºZ7³Z7¬Z7¥Z7žZ7—Z7Z7‰Z7‚Z7{Z7tZ7mZ7fZ7_Z7XZ7QZ7JZ7CZ7V77V70V7)V7"V7V7V7 V7V7ÿU7øU7ñU7êU7ãU7ÜU7ÕU7ÎU7ÇU7ÀU7¹U7²U7«U7¤U7U7–U7U7ˆU7U7zU7sU7lU7eU7^U7WU7PU7IU7BU7;U74U7-U7&U7U7U7U7 U7U7üT7õT7îT7çT7àT7ÙT7ÒT7ËT7ÄT7½T7¶T7¯T7¨T7¡T7šT7“T7ŒT7…T7~T7wT7pT7iT7bT7[T7TT7MT7FT7?T78T71T7*T7#T7T7T7T7T7T7ùS7òS7ëS7äS7ÝS7ÖS7ÏS7ÈS7ÁS7ºS7³S7¬S7¥S7žS7—S7S7‰S7‚S7{S7tS7mS7fS7_S7XS7QS7JS7CS7O77O70O7)O7"O7O7O7 O7O7ÿN7øN7ñN7êN7ãN7ÜN7ÕN7ÎN7ÇN7ÀN7¹N7²N7«N7¤N7N7–N7N7ˆN7N7zN7sN7lN7eN7^N7WN7PN7IN7BN7;N74N7-N7&N7N7N7N7 N7N7üM7õM7îM7çM7àM7ÙM7ÒM7ËM7ÄM7½M7¶M7¯M7¨M7¡M7šM7“M7ŒM7…M7~M7wM7pM7iM7bM7[M7TM7MM7FM7?M78M71M7*M7#M7M7M7M7M7M7ùL7òL7ëL7äL7ÝL7ÖL7ÏL7ÈL7ÁL7ºL7³L7¬L7¥L7žL7—L7L7‰L7‚L7{L7tL7mL7fL7_L7XL7QL7JL7CL7H77H70H7)H7"H7H7H7 H7H7ÿG7øG7ñG7êG7ãG7ÜG7ÕG7ÎG7ÇG7ÀG7¹G7²G7«G7¤G7G7–G7G7ˆG7G7zG7sG7lG7eG7^G7WG7PG7IG7BG7;G74G7-G7&G7G7G7G7 G7G7üF7õF7îF7çF7àF7ÙF7ÒF7ËF7ÄF7½F7¶F7¯F7¨F7¡F7šF7“F7ŒF7…F7~F7wF7pF7iF7bF7[F7TF7MF7FF7?F78F71F7*F7#F7F7F7F7F7F7ùE7òE7ëE7äE7ÝE7ÖE7ÏE7ÈE7ÁE7ºE7³E7¬E7¥E7žE7—E7E7‰E7‚E7{E7tE7mE7fE7_E7XE7QE7JE7CE7A77A70A7)A7"A7A7A7 A7A7ÿ@7ø@7ñ@7ê@7ã@7Ü@7Õ@7Î@7Ç@7À@7¹@7²@7«@7¤@7@7–@7@7ˆ@7@7z@7s@7l@7e@7^@7W@7P@7I@7B@7;@74@7-@7&@7@7@7@7 @7@7ü?7õ?7î?7ç?7à?7Ù?7Ò?7Ë?7Ä?7½?7¶?7¯?7¨?7¡?7š?7“?7Œ?7…?7~?7w?7p?7i?7b?7[?7T?7M?7F?7??78?71?7*?7#?7?7?7?7?7?7ù>7ò>7ë>7ä>7Ý>7Ö>7Ï>7È>7Á>7º>7³>7¬>7¥>7ž>7—>7>7‰>7‚>7{>7t>7m>7f>7_>7X>7Q>7J>7C>7<>75>7.>7'>7 >7>7>7 >7>7ý=7ö=7ï=7è=7á=7Ú=7Ó=7Ì=7Å=7¾=7·=7°=7©=7¢=7›=7”=7=7†=7=7x=7q=7j=7c=7\=7U=7N=7G=7@=79=72=7+=7$=7=7=7=7=7=7ú<7ó<7ì<7å<7Þ<7×<7Ð<7É<7Â<7»<7´<7­<7¦<7Ÿ<7˜<7‘<7Š<7ƒ<7|<7u<7n<7g<7`<7Y<7R<7K<7D<7=<76<7/<7(<7!<7<7<7 <7<7þ;7÷;7ð;7é;7â;7Û;7Ô;7Í;7Æ;7¿;7¸;7±;7ª;7£;7œ;7•;7Ž;7‡;7€;7y;7r;7k;7d;7];7V;7O;7H;7A;7:;73;7,;7%;7;7;7;7 ;7;7û:7ô:7í:7æ:7ß:7Ø:7Ñ:7Ê:7Ã:7¼:7µ:7®:7§:7 :7™:7’:7‹:7„:7}:7v:7o:7h:7a:7Z:7S:7L:7E:7>:77:70:7):7":7:7:7 :7:7ÿ97ø97ñ97ê97ã97Ü97Õ97Î97Ç97À97¹97²97«97¤9797–9797ˆ9797z97s97l97e97^97W97P97I97B97;97497-97&97979797 9797ü87õ87î87ç87à87Ù87Ò87Ë87Ä87½87¶87¯87¨87¡87š87“87Œ87…87~87w87p87i87b87[87T87M87F87?87887187*87#878787878787ù77ò77ë77ä77Ý77Ö77Ï77È77Á77º77³77¬77¥77ž77—7777‰77‚77{77t77m77f77_77X77Q77J77C77<77577.77'77 777777 7777ý67ö67ï67è67á67Ú67Ó67Ì67Å67¾67·67°67©67¢67›67”6767†6767x67q67j67c67\67U67N67G67@67967267+67$676767676767ú57ó57ì57å57Þ57×57Ð57É57Â57»57´57­57¦57Ÿ57˜57‘57Š57ƒ57|57u57n57g57`57Y57R57K57D57=57657/57(57!575757 5757þ47÷47ð47é47â47Û47Ô47Í47Æ47¿47¸47±47ª47£47œ47•47Ž47‡47€47y47r47k47d47]47V47O47H47A47:47347,47%47474747 4747û37ô37í37æ37ß37Ø37Ñ37Ê37Ã37¼37µ37®37§37 37™37’37‹37„37}37v37o37h37a37Z37S37L37E37>37737037)37"373737 3737ÿ27ø27ñ27ê27ã27Ü27Õ27Î27Ç27À27¹27²27«27¤2727–2727ˆ2727z27s27l27e27^27W27P27I27B27;27427-27&27272727 2727ü17õ17î17ç17à17Ù17Ò17Ë17Ä17½17¶17¯17¨17¡17š17“17Œ17…17~17w17p17i17b17[17T17M17F17?17817117*17#171717171717ù07ò07ë07ä07Ý07Ö07Ï07È07Á07º07³07¬07¥07ž07—0707‰07‚07{07t07m07f07_07X07Q07J07C07<07507.07'07 070707 0707ý/7ö/7ï/7è/7á/7Ú/7Ó/7Ì/7Å/7¾/7·/7°/7©/7¢/7›/7”/7/7†/7/7x/7q/7j/7c/7\/7U/7N/7G/7@/79/72/7+/7$/7/7/7/7/7/7ú.7ó.7ì.7å.7Þ.7×.7Ð.7É.7Â.7».7´.7­.7¦.7Ÿ.7˜.7‘.7Š.7ƒ.7|.7u.7n.7g.7`.7Y.7R.7K.7D.7=.76.7/.7(.7!.7.7.7 .7.7þ-7÷-7ð-7é-7â-7Û-7Ô-7Í-7Æ-7¿-7¸-7±-7ª-7£-7œ-7•-7Ž-7‡-7€-7y-7r-7k-7d-7]-7V-7O-7H-7A-7:-73-7,-7%-7-7-7-7 -7-7û,7ô,7í,7æ,7ß,7Ø,7Ñ,7Ê,7Ã,7¼,7µ,7®,7§,7 ,7™,7’,7‹,7„,7},7v,7o,7h,7a,7Z,7S,7L,7E,7>,77,70,7),7",7,7,7 ,7,7ÿ+7ø+7ñ+7ê+7ã+7Ü+7Õ+7Î+7Ç+7À+7¹+7²+7«+7¤+7+7–+7+7ˆ+7+7z+7s+7l+7e+7^+7W+7P+7I+7B+7;+74+7-+7&+7+7+7+7 +7+7ü*7õ*7î*7ç*7à*7Ù*7Ò*7Ë*7Ä*7½*7¶*7¯*7¨*7¡*7š*7“*7Œ*7…*7~*7w*7p*7i*7b*7[*7T*7M*7F*7?*78*71*7**7#*7*7*7*7*7*7ù)7ò)7ë)7ä)7Ý)7Ö)7Ï)7È)7Á)7º)7³)7¬)7¥)7ž)7—)7)7‰)7‚)7{)7t)7m)7f)7_)7X)7Q)7J)7C)7<)75)7.)7')7 )7)7)7 )7)7ý(7ö(7ï(7è(7á(7Ú(7Ó(7Ì(7Å(7¾(7·(7°(7©(7¢(7›(7”(7(7†(7(7x(7q(7j(7c(7\(7U(7N(7G(7@(79(72(7+(7$(7(7(7(7(7(7ú'7ó'7ì'7å'7Þ'7×'7Ð'7É'7Â'7»'7´'7­'7¦'7Ÿ'7˜'7‘'7Š'7ƒ'7|'7u'7n'7g'7`'7Y'7R'7K'7D'7='76'7/'7('7!'7'7'7 '7'7þ&7÷&7ð&7é&7â&7Û&7Ô&7Í&7Æ&7¿&7¸&7±&7ª&7£&7œ&7•&7Ž&7‡&7€&7y&7r&7k&7d&7]&7V&7O&7H&7A&7:&73&7,&7%&7&7&7&7 &7&7û%7ô%7í%7æ%7ß%7Ø%7Ñ%7Ê%7Ã%7¼%7µ%7®%7§%7 %7™%7’%7‹%7„%7}%7v%7o%7h%7a%7Z%7S%7L%7E%7>%77%70%7)%7"%7%7%7 %7%7ÿ$7ø$7ñ$7ê$7ã$7Ü$7Õ$7Î$7Ç$7À$7¹$7²$7«$7¤$7$7–$7$7ˆ$7$7z$7s$7l$7e$7^$7W$7P$7I$7B$7;$74$7-$7&$7$7$7$7 $7$7ü#7õ#7î#7ç#7à#7Ù#7Ò#7Ë#7Ä#7½#7¶#7¯#7¨#7¡#7š#7“#7Œ#7…#7~#7w#7p#7i#7b#7[#7T#7M#7F#7?#78#71#7*#7##7#7#7#7#7#7ù"7ò"7ë"7ä"7Ý"7Ö"7Ï"7È"7Á"7º"7³"7¬"7¥"7ž"7—"7"7‰"7‚"7{"7t"7m"7f"7_"7X"7Q"7J"7C"7<"75"7."7'"7 "7"7"7 "7"7ý!7ö!7ï!7è!7á!7Ú!7Ó!7Ì!7Å!7¾!7·!7°!7©!7¢!7›!7”!7!7†!7!7x!7q!7j!7c!7\!7U!7N!7G!7@!79!72!7+!7$!7!7!7!7!7!7ú 7ó 7ì 7å 7Þ 7× 7Ð 7É 7 7» 7´ 7­ 7¦ 7Ÿ 7˜ 7‘ 7Š 7ƒ 7| 7u 7n 7g 7` 7Y 7R 7K 7D 7= 76 7/ 7( 7! 7 7 7 7 7þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù 7ò 7ë 7ä 7Ý 7Ö 7Ï 7È 7Á 7º 7³ 7¬ 7¥ 7ž 7— 7 7‰ 7‚ 7{ 7t 7m 7f 7_ 7X 7Q 7J 7C 7< 75 7. 7' 7 7 7 7 7 7ý 7ö 7ï 7è 7á 7Ú 7Ó 7Ì 7Å 7¾ 7· 7° 7© 7¢ 7› 7” 7 7† 7 7x 7q 7j 7c 7\ 7U 7N 7G 7@ 79 72 7+ 7$ 7 7 7 7 7 7ú 7ó 7ì 7å 7Þ 7× 7Ð 7É 7 7» 7´ 7­ 7¦ 7Ÿ 7˜ 7‘ 7Š 7ƒ 7| 7u 7n 7g 7` 7Y 7R 7K 7D 7= 76 7/ 7( 7! 7 7 7 7 7þ 7÷ 7ð 7é 7â 7Û 7Ô 7Í 7Æ 7¿ 7¸ 7± 7ª 7£ 7œ 7• 7Ž 7‡ 7€ 7y 7r 7k 7d 7] 7V 7O 7H 7A 7: 73 7, 7% 7 7 7 7 7 7û 7ô 7í 7æ 7ß 7Ø 7Ñ 7Ê 7à 7¼ 7µ 7® 7§ 7  7™ 7’ 7‹ 7„ 7} 7v 7o 7h 7a 7Z 7S 7L 7E 7> 77 70 7) 7" 7 7 7 7 7ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ùÿ6òÿ6ëÿ6äÿ6Ýÿ6Öÿ6Ïÿ6Èÿ6Áÿ6ºÿ6³ÿ6¬ÿ6¥ÿ6žÿ6—ÿ6ÿ6‰ÿ6‚ÿ6{ÿ6tÿ6mÿ6fÿ6_ÿ6Xÿ6Qÿ6Jÿ6Cÿ6<ÿ65ÿ6.ÿ6'ÿ6 ÿ6ÿ6ÿ6 ÿ6ÿ6ýþ6öþ6ïþ6èþ6áþ6Úþ6Óþ6Ìþ6Åþ6¾þ6·þ6°þ6©þ6¢þ6›þ6”þ6þ6†þ6þ6xþ6qþ6jþ6cþ6\þ6Uþ6Nþ6Gþ6@þ69þ62þ6+þ6$þ6þ6þ6þ6þ6þ6úý6óý6ìý6åý6Þý6×ý6Ðý6Éý6Âý6»ý6´ý6­ý6¦ý6Ÿý6˜ý6‘ý6Šý6ƒý6|ý6uý6ný6gý6`ý6Yý6Rý6Ký6Dý6=ý66ý6/ý6(ý6!ý6ý6ý6 ý6ý6þü6÷ü6ðü6éü6âü6Ûü6Ôü6Íü6Æü6¿ü6¸ü6±ü6ªü6£ü6œü6•ü6Žü6‡ü6€ü6yü6rü6kü6dü6]ü6Vü6Oü6Hü6Aü6:ü63ü6,ü6%ü6ü6ü6ü6 ü6ü6ûû6ôû6íû6æû6ßû6Øû6Ñû6Êû6Ãû6¼û6µû6®û6§û6 û6™û6’û6‹û6„û6}û6vû6oû6hû6aû6Zû6Sû6Lû6Eû6>û67û60û6)û6"û6û6û6 û6û6ÿú6øú6ñú6êú6ãú6Üú6Õú6Îú6Çú6Àú6¹ú6²ú6«ú6¤ú6ú6–ú6ú6ˆú6ú6zú6sú6lú6eú6^ú6Wú6Pú6Iú6Bú6;ú64ú6-ú6&ú6ú6ú6ú6 ú6ú6üù6õù6îù6çù6àù6Ùù6Òù6Ëù6Äù6½ù6¶ù6¯ù6¨ù6¡ù6šù6“ù6Œù6…ù6~ù6wù6pù6iù6bù6[ù6Tù6Mù6Fù6?ù68ù61ù6*ù6#ù6ù6ù6ù6ù6ù6ùø6òø6ëø6äø6Ýø6Öø6Ïø6Èø6Áø6ºø6³ø6¬ø6¥ø6žø6—ø6ø6‰ø6‚ø6{ø6tø6mø6fø6_ø6Xø6Qø6Jø6Cø6<ø65ø6.ø6'ø6 ø6ø6ø6 ø6ø6ý÷6ö÷6ï÷6è÷6á÷6Ú÷6Ó÷6Ì÷6Å÷6¾÷6·÷6°÷6©÷6¢÷6›÷6”÷6÷6†÷6÷6x÷6q÷6j÷6c÷6\÷6U÷6N÷6G÷6@÷69÷62÷6+÷6$÷6÷6÷6÷6÷6÷6úö6óö6ìö6åö6Þö6×ö6Ðö6Éö6Âö6»ö6´ö6­ö6¦ö6Ÿö6˜ö6‘ö6Šö6ƒö6|ö6uö6nö6gö6`ö6Yö6Rö6Kö6Dö6=ö66ö6/ö6(ö6!ö6ö6ö6 ö6ö6þõ6÷õ6ðõ6éõ6âõ6Ûõ6Ôõ6Íõ6Æõ6¿õ6¸õ6±õ6ªõ6£õ6œõ6•õ6Žõ6‡õ6€õ6yõ6rõ6kõ6dõ6]õ6Võ6Oõ6Hõ6Aõ6:õ63õ6,õ6%õ6õ6õ6õ6 õ6õ6ûô6ôô6íô6æô6ßô6Øô6Ñô6Êô6Ãô6¼ô6µô6®ô6§ô6 ô6™ô6’ô6‹ô6„ô6}ô6vô6oô6hô6aô6Zô6Sô6Lô6Eô6>ô67ô60ô6)ô6"ô6ô6ô6 ô6ô6ÿó6øó6ñó6êó6ãó6Üó6Õó6Îó6Çó6Àó6¹ó6²ó6«ó6¤ó6ó6–ó6ó6ˆó6ó6zó6só6ló6eó6^ó6Wó6Pó6Ió6Bó6;ó64ó6-ó6&ó6ó6ó6ó6 ó6ó6üò6õò6îò6çò6àò6Ùò6Òò6Ëò6Äò6½ò6¶ò6¯ò6¨ò6¡ò6šò6“ò6Œò6…ò6~ò6wò6pò6iò6bò6[ò6Tò6Mò6Fò6?ò68ò61ò6*ò6#ò6ò6ò6ò6ò6ò6ùñ6òñ6ëñ6äñ6Ýñ6Öñ6Ïñ6Èñ6Áñ6ºñ6³ñ6¬ñ6¥ñ6žñ6—ñ6ñ6‰ñ6‚ñ6{ñ6tñ6mñ6fñ6_ñ6Xñ6Qñ6Jñ6Cñ6<ñ65ñ6.ñ6'ñ6 ñ6ñ6ñ6 ñ6ñ6ýð6öð6ïð6èð6áð6Úð6Óð6Ìð6Åð6¾ð6·ð6°ð6©ð6¢ð6›ð6”ð6ð6†ð6ð6xð6qð6jð6cð6\ð6Uð6Nð6Gð6@ð69ð62ð6+ð6$ð6ð6ð6ð6ð6ð6úï6óï6ìï6åï6Þï6×ï6Ðï6Éï6Âï6»ï6´ï6­ï6¦ï6Ÿï6˜ï6‘ï6Šï6ƒï6|ï6uï6nï6gï6`ï6Yï6Rï6Kï6Dï6=ï66ï6/ï6(ï6!ï6ï6ï6 ï6ï6þî6÷î6ðî6éî6âî6Ûî6Ôî6Íî6Æî6¿î6¸î6±î6ªî6£î6œî6•î6Žî6‡î6€î6yî6rî6kî6dî6]î6Vî6Oî6Hî6Aî6:î63î6,î6%î6î6î6î6 î6î6ûí6ôí6íí6æí6ßí6Øí6Ñí6Êí6Ãí6¼í6µí6®í6§í6 í6™í6’í6‹í6„í6}í6ví6oí6hí6aí6Zí6Sí6Lí6Eí6>í67í60í6)í6"í6í6í6 í6í6ÿì6øì6ñì6êì6ãì6Üì6Õì6Îì6Çì6Àì6¹ì6²ì6«ì6¤ì6ì6–ì6ì6ˆì6ì6zì6sì6lì6eì6^ì6Wì6Pì6Iì6Bì6;ì64ì6-ì6&ì6ì6ì6ì6 ì6ì6üë6õë6îë6çë6àë6Ùë6Òë6Ëë6Äë6½ë6¶ë6¯ë6¨ë6¡ë6šë6“ë6Œë6…ë6~ë6wë6pë6ië6bë6[ë6Të6Më6Fë6?ë68ë61ë6*ë6#ë6ë6ë6ë6ë6ë6ùê6òê6ëê6äê6Ýê6Öê6Ïê6Èê6Áê6ºê6³ê6¬ê6¥ê6žê6—ê6ê6‰ê6‚ê6{ê6tê6mê6fê6_ê6Xê6Qê6Jê6Cê6<ê65ê6.ê6'ê6 ê6ê6ê6 ê6ê6ýé6öé6ïé6èé6áé6Úé6Óé6Ìé6Åé6¾é6·é6°é6©é6¢é6›é6”é6é6†é6é6xé6qé6jé6cé6\é6Ué6Né6Gé6@é69é62é6+é6$é6é6é6é6é6é6úè6óè6ìè6åè6Þè6×è6Ðè6Éè6Âè6»è6´è6­è6¦è6Ÿè6˜è6‘è6Šè6ƒè6|è6uè6nè6gè6`è6Yè6Rè6Kè6Dè6=è66è6/è6(è6!è6è6è6 è6è6þç6÷ç6ðç6éç6âç6Ûç6Ôç6Íç6Æç6¿ç6¸ç6±ç6ªç6£ç6œç6•ç6Žç6‡ç6€ç6yç6rç6kç6dç6]ç6Vç6Oç6Hç6Aç6:ç63ç6,ç6%ç6ç6ç6ç6 ç6ç6ûæ6ôæ6íæ6ææ6ßæ6Øæ6Ñæ6Êæ6Ãæ6¼æ6µæ6®æ6§æ6 æ6™æ6’æ6‹æ6„æ6}æ6væ6oæ6hæ6aæ6Zæ6Sæ6Læ6Eæ6>æ67æ60æ6)æ6"æ6æ6æ6 æ6æ6ÿå6øå6ñå6êå6ãå6Üå6Õå6Îå6Çå6Àå6¹å6²å6«å6¤å6å6–å6å6ˆå6å6zå6så6lå6eå6^å6Wå6På6Iå6Bå6;å64å6-å6&å6å6å6å6 å6å6üä6õä6îä6çä6àä6Ùä6Òä6Ëä6Ää6½ä6¶ä6¯ä6¨ä6¡ä6šä6“ä6Œä6…ä6~ä6wä6pä6iä6bä6[ä6Tä6Mä6Fä6?ä68ä61ä6*ä6#ä6ä6ä6ä6ä6ä6ùã6òã6ëã6äã6Ýã6Öã6Ïã6Èã6Áã6ºã6³ã6¬ã6¥ã6žã6—ã6ã6‰ã6‚ã6{ã6tã6mã6fã6_ã6Xã6Qã6Jã6Cã6<ã65ã6.ã6'ã6 ã6ã6ã6 ã6ã6ýâ6öâ6ïâ6èâ6áâ6Úâ6Óâ6Ìâ6Åâ6¾â6·â6°â6©â6¢â6›â6”â6â6†â6â6xâ6qâ6jâ6câ6\â6Uâ6Nâ6Gâ6@â69â62â6+â6$â6â6â6â6â6â6úá6óá6ìá6åá6Þá6×á6Ðá6Éá6Âá6»á6´á6­á6¦á6Ÿá6˜á6‘á6Šá6ƒá6|á6uá6ná6gá6`á6Yá6Rá6Ká6Dá6=á66á6/á6(á6!á6á6á6 á6á6þà6÷à6ðà6éà6âà6Ûà6Ôà6Íà6Æà6¿à6¸à6±à6ªà6£à6œà6•à6Žà6‡à6€à6yà6rà6kà6dà6]à6Và6Oà6Hà6Aà6:à63à6,à6%à6à6à6à6 à6à6ûß6ôß6íß6æß6ßß6Øß6Ñß6Êß6Ãß6¼ß6µß6®ß6§ß6 ß6™ß6’ß6‹ß6„ß6}ß6vß6oß6hß6aß6Zß6Sß6Lß6Eß6>ß67ß60ß6)ß6"ß6ß6ß6 ß6ß6ÿÞ6øÞ6ñÞ6êÞ6ãÞ6ÜÞ6ÕÞ6ÎÞ6ÇÞ6ÀÞ6¹Þ6²Þ6«Þ6¤Þ6Þ6–Þ6Þ6ˆÞ6Þ6zÞ6sÞ6lÞ6eÞ6^Þ6WÞ6PÞ6IÞ6BÞ6;Þ64Þ6-Þ6&Þ6Þ6Þ6Þ6 Þ6Þ6üÝ6õÝ6îÝ6çÝ6àÝ6ÙÝ6ÒÝ6ËÝ6ÄÝ6½Ý6¶Ý6¯Ý6¨Ý6¡Ý6šÝ6“Ý6ŒÝ6…Ý6~Ý6wÝ6pÝ6iÝ6bÝ6[Ý6TÝ6MÝ6FÝ6?Ý68Ý61Ý6*Ý6#Ý6Ý6Ý6Ý6Ý6Ý6ùÜ6òÜ6ëÜ6äÜ6ÝÜ6ÖÜ6ÏÜ6ÈÜ6ÁÜ6ºÜ6³Ü6¬Ü6¥Ü6žÜ6—Ü6Ü6‰Ü6‚Ü6{Ü6tÜ6mÜ6fÜ6_Ü6XÜ6QÜ6JÜ6CÜ6<Ü65Ü6.Ü6'Ü6 Ü6Ü6Ü6 Ü6Ü6ýÛ6öÛ6ïÛ6èÛ6áÛ6ÚÛ6ÓÛ6ÌÛ6ÅÛ6¾Û6·Û6°Û6©Û6¢Û6›Û6”Û6Û6†Û6Û6xÛ6qÛ6jÛ6cÛ6\Û6UÛ6NÛ6GÛ6@Û69Û62Û6+Û6$Û6Û6Û6Û6Û6Û6úÚ6óÚ6ìÚ6åÚ6ÞÚ6×Ú6ÐÚ6ÉÚ6ÂÚ6»Ú6´Ú6­Ú6¦Ú6ŸÚ6˜Ú6‘Ú6ŠÚ6ƒÚ6|Ú6uÚ6nÚ6gÚ6`Ú6YÚ6RÚ6KÚ6DÚ6=Ú66Ú6/Ú6(Ú6!Ú6Ú6Ú6 Ú6Ú6þÙ6÷Ù6ðÙ6éÙ6âÙ6ÛÙ6ÔÙ6ÍÙ6ÆÙ6¿Ù6¸Ù6±Ù6ªÙ6£Ù6œÙ6•Ù6ŽÙ6‡Ù6€Ù6yÙ6rÙ6kÙ6dÙ6]Ù6VÙ6OÙ6HÙ6AÙ6:Ù63Ù6,Ù6%Ù6Ù6Ù6Ù6 Ù6Ù6ûØ6ôØ6íØ6æØ6ߨ6ØØ6ÑØ6ÊØ6ÃØ6¼Ø6µØ6®Ø6§Ø6 Ø6™Ø6’Ø6‹Ø6„Ø6}Ø6vØ6oØ6hØ6aØ6ZØ6SØ6LØ6EØ6>Ø67Ø60Ø6)Ø6"Ø6Ø6Ø6 Ø6Ø6ÿ×6ø×6ñ×6ê×6ã×6Ü×6Õ×6Î×6Ç×6À×6¹×6²×6«×6¤×6×6–×6×6ˆ×6×6z×6s×6l×6e×6^×6W×6P×6I×6B×6;×64×6-×6&×6×6×6×6 ×6×6üÖ6õÖ6îÖ6çÖ6àÖ6ÙÖ6ÒÖ6ËÖ6ÄÖ6½Ö6¶Ö6¯Ö6¨Ö6¡Ö6šÖ6“Ö6ŒÖ6…Ö6~Ö6wÖ6pÖ6iÖ6bÖ6[Ö6TÖ6MÖ6FÖ6?Ö68Ö61Ö6*Ö6#Ö6Ö6Ö6Ö6Ö6Ö6ùÕ6òÕ6ëÕ6äÕ6ÝÕ6ÖÕ6ÏÕ6ÈÕ6ÁÕ6ºÕ6³Õ6¬Õ6¥Õ6žÕ6—Õ6Õ6‰Õ6‚Õ6{Õ6tÕ6mÕ6fÕ6_Õ6XÕ6QÕ6JÕ6CÕ6<Õ65Õ6.Õ6'Õ6 Õ6Õ6Õ6 Õ6Õ6ýÔ6öÔ6ïÔ6èÔ6áÔ6ÚÔ6ÓÔ6ÌÔ6ÅÔ6¾Ô6·Ô6°Ô6©Ô6¢Ô6›Ô6”Ô6Ô6†Ô6Ô6xÔ6qÔ6jÔ6cÔ6\Ô6UÔ6NÔ6GÔ6@Ô69Ô62Ô6+Ô6$Ô6Ô6Ô6Ô6Ô6Ô6úÓ6óÓ6ìÓ6åÓ6ÞÓ6×Ó6ÐÓ6ÉÓ6ÂÓ6»Ó6´Ó6­Ó6¦Ó6ŸÓ6˜Ó6‘Ó6ŠÓ6ƒÓ6|Ó6uÓ6nÓ6gÓ6`Ó6YÓ6RÓ6KÓ6DÓ6=Ó66Ó6/Ó6(Ó6!Ó6Ó6Ó6 Ó6Ó6þÒ6÷Ò6ðÒ6éÒ6âÒ6ÛÒ6ÔÒ6ÍÒ6ÆÒ6¿Ò6¸Ò6±Ò6ªÒ6£Ò6œÒ6•Ò6ŽÒ6‡Ò6€Ò6yÒ6rÒ6kÒ6dÒ6]Ò6VÒ6OÒ6HÒ6AÒ6:Ò63Ò6,Ò6%Ò6Ò6Ò6Ò6 Ò6Ò6ûÑ6ôÑ6íÑ6æÑ6ßÑ6ØÑ6ÑÑ6ÊÑ6ÃÑ6¼Ñ6µÑ6®Ñ6§Ñ6 Ñ6™Ñ6’Ñ6‹Ñ6„Ñ6}Ñ6vÑ6oÑ6hÑ6aÑ6ZÑ6SÑ6LÑ6EÑ6>Ñ67Ñ60Ñ6)Ñ6"Ñ6Ñ6Ñ6 Ñ6Ñ6ÿÐ6øÐ6ñÐ6êÐ6ãÐ6ÜÐ6ÕÐ6ÎÐ6ÇÐ6ÀÐ6¹Ð6²Ð6«Ð6¤Ð6Ð6–Ð6Ð6ˆÐ6Ð6zÐ6sÐ6lÐ6eÐ6^Ð6WÐ6PÐ6IÐ6BÐ6;Ð64Ð6-Ð6&Ð6Ð6Ð6Ð6 Ð6Ð6üÏ6õÏ6îÏ6çÏ6àÏ6ÙÏ6ÒÏ6ËÏ6ÄÏ6½Ï6¶Ï6¯Ï6¨Ï6¡Ï6šÏ6“Ï6ŒÏ6…Ï6~Ï6wÏ6pÏ6iÏ6bÏ6[Ï6TÏ6MÏ6FÏ6?Ï68Ï61Ï6*Ï6#Ï6Ï6Ï6Ï6Ï6Ï6ùÎ6òÎ6ëÎ6äÎ6ÝÎ6ÖÎ6ÏÎ6ÈÎ6ÁÎ6ºÎ6³Î6¬Î6¥Î6žÎ6—Î6Î6‰Î6‚Î6{Î6tÎ6mÎ6fÎ6_Î6XÎ6QÎ6JÎ6CÎ6<Î65Î6.Î6'Î6 Î6Î6Î6 Î6Î6ýÍ6öÍ6ïÍ6èÍ6áÍ6ÚÍ6ÓÍ6ÌÍ6ÅÍ6¾Í6·Í6°Í6©Í6¢Í6›Í6”Í6Í6†Í6Í6xÍ6qÍ6jÍ6cÍ6\Í6UÍ6NÍ6GÍ6@Í69Í62Í6+Í6$Í6Í6Í6Í6Í6Í6úÌ6óÌ6ìÌ6åÌ6ÞÌ6×Ì6ÐÌ6ÉÌ6ÂÌ6»Ì6´Ì6­Ì6¦Ì6ŸÌ6˜Ì6‘Ì6ŠÌ6ƒÌ6|Ì6uÌ6nÌ6gÌ6`Ì6YÌ6RÌ6KÌ6DÌ6=Ì66Ì6/Ì6(Ì6!Ì6Ì6Ì6 Ì6Ì6þË6÷Ë6ðË6éË6âË6ÛË6ÔË6ÍË6ÆË6¿Ë6¸Ë6±Ë6ªË6£Ë6œË6•Ë6ŽË6‡Ë6€Ë6yË6rË6kË6dË6]Ë6VË6OË6HË6AË6:Ë63Ë6,Ë6%Ë6Ë6Ë6Ë6 Ë6Ë6ûÊ6ôÊ6íÊ6æÊ6ßÊ6ØÊ6ÑÊ6ÊÊ6ÃÊ6¼Ê6µÊ6®Ê6§Ê6 Ê6™Ê6’Ê6‹Ê6„Ê6}Ê6vÊ6oÊ6hÊ6aÊ6ZÊ6SÊ6LÊ6EÊ6>Ê67Ê60Ê6)Ê6"Ê6Ê6Ê6 Ê6Ê6ÿÉ6øÉ6ñÉ6êÉ6ãÉ6ÜÉ6ÕÉ6ÎÉ6ÇÉ6ÀÉ6¹É6²É6«É6¤É6É6–É6É6ˆÉ6É6zÉ6sÉ6lÉ6eÉ6^É6WÉ6PÉ6IÉ6BÉ6;É64É6-É6&É6É6É6É6 É6É6üÈ6õÈ6îÈ6çÈ6àÈ6ÙÈ6ÒÈ6ËÈ6ÄÈ6½È6¶È6¯È6¨È6¡È6šÈ6“È6ŒÈ6…È6~È6wÈ6pÈ6iÈ6bÈ6[È6TÈ6MÈ6FÈ6?È68È61È6*È6#È6È6È6È6È6È6ùÇ6òÇ6ëÇ6äÇ6ÝÇ6ÖÇ6ÏÇ6ÈÇ6ÁÇ6ºÇ6³Ç6¬Ç6¥Ç6žÇ6—Ç6Ç6‰Ç6‚Ç6{Ç6tÇ6mÇ6fÇ6_Ç6XÇ6QÇ6JÇ6CÇ6<Ç65Ç6.Ç6'Ç6 Ç6Ç6Ç6 Ç6Ç6ýÆ6öÆ6ïÆ6èÆ6áÆ6ÚÆ6ÓÆ6ÌÆ6ÅÆ6¾Æ6·Æ6°Æ6©Æ6¢Æ6›Æ6”Æ6Æ6†Æ6Æ6xÆ6qÆ6jÆ6cÆ6\Æ6UÆ6NÆ6GÆ6@Æ69Æ62Æ6+Æ6$Æ6Æ6Æ6Æ6Æ6Æ6úÅ6óÅ6ìÅ6åÅ6ÞÅ6×Å6ÐÅ6ÉÅ6ÂÅ6»Å6´Å6­Å6¦Å6ŸÅ6˜Å6‘Å6ŠÅ6ƒÅ6|Å6uÅ6nÅ6gÅ6`Å6YÅ6RÅ6KÅ6DÅ6=Å66Å6/Å6(Å6!Å6Å6Å6 Å6Å6þÄ6÷Ä6ðÄ6éÄ6âÄ6ÛÄ6ÔÄ6ÍÄ6ÆÄ6¿Ä6¸Ä6±Ä6ªÄ6£Ä6œÄ6•Ä6ŽÄ6‡Ä6€Ä6yÄ6rÄ6kÄ6dÄ6]Ä6VÄ6OÄ6HÄ6AÄ6:Ä63Ä6,Ä6%Ä6Ä6Ä6Ä6 Ä6Ä6ûÃ6ôÃ6íÃ6æÃ6ßÃ6ØÃ6ÑÃ6ÊÃ6ÃÃ6¼Ã6µÃ6®Ã6§Ã6 Ã6™Ã6’Ã6‹Ã6„Ã6}Ã6vÃ6oÃ6hÃ6aÃ6ZÃ6SÃ6LÃ6EÃ6>Ã67Ã60Ã6)Ã6"Ã6Ã6Ã6 Ã6Ã6ÿÂ6øÂ6ñÂ6êÂ6ãÂ6ÜÂ6ÕÂ6ÎÂ6ÇÂ6ÀÂ6¹Â6²Â6«Â6¤Â6Â6–Â6Â6ˆÂ6Â6zÂ6sÂ6lÂ6eÂ6^Â6WÂ6PÂ6IÂ6BÂ6;Â64Â6-Â6&Â6Â6Â6Â6 Â6Â6üÁ6õÁ6îÁ6çÁ6àÁ6ÙÁ6ÒÁ6ËÁ6ÄÁ6½Á6¶Á6¯Á6¨Á6¡Á6šÁ6“Á6ŒÁ6…Á6~Á6wÁ6pÁ6iÁ6bÁ6[Á6TÁ6MÁ6FÁ6?Á68Á61Á6*Á6#Á6Á6Á6Á6Á6Á6ùÀ6òÀ6ëÀ6äÀ6ÝÀ6ÖÀ6ÏÀ6ÈÀ6ÁÀ6ºÀ6³À6¬À6¥À6žÀ6—À6À6‰À6‚À6{À6tÀ6mÀ6fÀ6_À6XÀ6QÀ6JÀ6CÀ6<À65À6.À6'À6 À6À6À6 À6À6ý¿6ö¿6ï¿6è¿6á¿6Ú¿6Ó¿6Ì¿6Å¿6¾¿6·¿6°¿6©¿6¢¿6›¿6”¿6¿6†¿6¿6x¿6q¿6j¿6c¿6\¿6U¿6N¿6G¿6@¿69¿62¿6+¿6$¿6¿6¿6¿6¿6¿6ú¾6ó¾6ì¾6å¾6Þ¾6×¾6о6ɾ6¾6»¾6´¾6­¾6¦¾6Ÿ¾6˜¾6‘¾6о6ƒ¾6|¾6u¾6n¾6g¾6`¾6Y¾6R¾6K¾6D¾6=¾66¾6/¾6(¾6!¾6¾6¾6 ¾6¾6þ½6÷½6ð½6é½6â½6Û½6Ô½6ͽ6ƽ6¿½6¸½6±½6ª½6£½6œ½6•½6޽6‡½6€½6y½6r½6k½6d½6]½6V½6O½6H½6A½6:½63½6,½6%½6½6½6½6 ½6½6û¼6ô¼6í¼6æ¼6ß¼6ؼ6Ѽ6ʼ6ü6¼¼6µ¼6®¼6§¼6 ¼6™¼6’¼6‹¼6„¼6}¼6v¼6o¼6h¼6a¼6Z¼6S¼6L¼6E¼6>¼67¼60¼6)¼6"¼6¼6¼6 ¼6¼6ÿ»6ø»6ñ»6ê»6ã»6Ü»6Õ»6λ6Ç»6À»6¹»6²»6«»6¤»6»6–»6»6ˆ»6»6z»6s»6l»6e»6^»6W»6P»6I»6B»6;»64»6-»6&»6»6»6»6 »6»6üº6õº6îº6çº6àº6Ùº6Òº6˺6ĺ6½º6¶º6¯º6¨º6¡º6šº6“º6Œº6…º6~º6wº6pº6iº6bº6[º6Tº6Mº6Fº6?º68º61º6*º6#º6º6º6º6º6º6ù¹6ò¹6ë¹6ä¹6ݹ6Ö¹6Ϲ6ȹ6Á¹6º¹6³¹6¬¹6¥¹6ž¹6—¹6¹6‰¹6‚¹6{¹6t¹6m¹6f¹6_¹6X¹6Q¹6J¹6C¹6<¹65¹6.¹6'¹6 ¹6¹6¹6 ¹6¹6ý¸6ö¸6ï¸6è¸6á¸6Ú¸6Ó¸6̸6Ÿ6¾¸6·¸6°¸6©¸6¢¸6›¸6”¸6¸6†¸6¸6x¸6q¸6j¸6c¸6\¸6U¸6N¸6G¸6@¸69¸62¸6+¸6$¸6¸6¸6¸6¸6¸6ú·6ó·6ì·6å·6Þ·6×·6з6É·6·6»·6´·6­·6¦·6Ÿ·6˜·6‘·6Š·6ƒ·6|·6u·6n·6g·6`·6Y·6R·6K·6D·6=·66·6/·6(·6!·6·6·6 ·6·6þ¶6÷¶6ð¶6é¶6â¶6Û¶6Ô¶6Ͷ6ƶ6¿¶6¸¶6±¶6ª¶6£¶6œ¶6•¶6޶6‡¶6€¶6y¶6r¶6k¶6d¶6]¶6V¶6O¶6H¶6A¶6:¶63¶6,¶6%¶6¶6¶6¶6 ¶6¶6ûµ6ôµ6íµ6æµ6ßµ6ص6ѵ6ʵ6õ6¼µ6µµ6®µ6§µ6 µ6™µ6’µ6‹µ6„µ6}µ6vµ6oµ6hµ6aµ6Zµ6Sµ6Lµ6Eµ6>µ67µ60µ6)µ6"µ6µ6µ6 µ6µ6ÿ´6ø´6ñ´6ê´6ã´6Ü´6Õ´6δ6Ç´6À´6¹´6²´6«´6¤´6´6–´6´6ˆ´6´6z´6s´6l´6e´6^´6W´6P´6I´6B´6;´64´6-´6&´6´6´6´6 ´6´6ü³6õ³6î³6ç³6à³6Ù³6Ò³6˳6ij6½³6¶³6¯³6¨³6¡³6š³6“³6Œ³6…³6~³6w³6p³6i³6b³6[³6T³6M³6F³6?³68³61³6*³6#³6³6³6³6³6³6ù²6ò²6ë²6ä²6ݲ6Ö²6ϲ6Ȳ6Á²6º²6³²6¬²6¥²6ž²6—²6²6‰²6‚²6{²6t²6m²6f²6_²6X²6Q²6J²6C²6<²65²6.²6'²6 ²6²6²6 ²6²6ý±6ö±6ï±6è±6á±6Ú±6Ó±6̱6ű6¾±6·±6°±6©±6¢±6›±6”±6±6†±6±6x±6q±6j±6c±6\±6U±6N±6G±6@±69±62±6+±6$±6±6±6±6±6±6ú°6ó°6ì°6å°6Þ°6×°6а6ɰ6°6»°6´°6­°6¦°6Ÿ°6˜°6‘°6а6ƒ°6|°6u°6n°6g°6`°6Y°6R°6K°6D°6=°66°6/°6(°6!°6°6°6 °6°6þ¯6÷¯6ð¯6é¯6â¯6Û¯6Ô¯6ͯ6Ư6¿¯6¸¯6±¯6ª¯6£¯6œ¯6•¯6ޝ6‡¯6€¯6y¯6r¯6k¯6d¯6]¯6V¯6O¯6H¯6A¯6:¯63¯6,¯6%¯6¯6¯6¯6 ¯6¯6û®6ô®6í®6æ®6ß®6Ø®6Ñ®6Ê®6î6¼®6µ®6®®6§®6 ®6™®6’®6‹®6„®6}®6v®6o®6h®6a®6Z®6S®6L®6E®6>®67®60®6)®6"®6®6®6 ®6®6ÿ­6ø­6ñ­6ê­6ã­6Ü­6Õ­6έ6Ç­6À­6¹­6²­6«­6¤­6­6–­6­6ˆ­6­6z­6s­6l­6e­6^­6W­6P­6I­6B­6;­64­6-­6&­6­6­6­6 ­6­6ü¬6õ¬6î¬6ç¬6à¬6Ù¬6Ò¬6ˬ6Ĭ6½¬6¶¬6¯¬6¨¬6¡¬6š¬6“¬6Œ¬6…¬6~¬6w¬6p¬6i¬6b¬6[¬6T¬6M¬6F¬6?¬68¬61¬6*¬6#¬6¬6¬6¬6¬6¬6ù«6ò«6ë«6ä«6Ý«6Ö«6Ï«6È«6Á«6º«6³«6¬«6¥«6ž«6—«6«6‰«6‚«6{«6t«6m«6f«6_«6X«6Q«6J«6C«6<«65«6.«6'«6 «6«6«6 «6«6ýª6öª6ïª6èª6áª6Úª6Óª6̪6Ū6¾ª6·ª6°ª6©ª6¢ª6›ª6”ª6ª6†ª6ª6xª6qª6jª6cª6\ª6Uª6Nª6Gª6@ª69ª62ª6+ª6$ª6ª6ª6ª6ª6ª6ú©6ó©6ì©6å©6Þ©6ש6Щ6É©6©6»©6´©6­©6¦©6Ÿ©6˜©6‘©6Š©6ƒ©6|©6u©6n©6g©6`©6Y©6R©6K©6D©6=©66©6/©6(©6!©6©6©6 ©6©6þ¨6÷¨6ð¨6é¨6â¨6Û¨6Ô¨6ͨ6ƨ6¿¨6¸¨6±¨6ª¨6£¨6œ¨6•¨6ލ6‡¨6€¨6y¨6r¨6k¨6d¨6]¨6V¨6O¨6H¨6A¨6:¨63¨6,¨6%¨6¨6¨6¨6 ¨6¨6û§6ô§6í§6æ§6ß§6ا6ѧ6ʧ6ç6¼§6µ§6®§6§§6 §6™§6’§6‹§6„§6}§6v§6o§6h§6a§6Z§6S§6L§6E§6>§67§60§6)§6"§6§6§6 §6§6ÿ¦6ø¦6ñ¦6ê¦6ã¦6ܦ6Õ¦6Φ6Ǧ6À¦6¹¦6²¦6«¦6¤¦6¦6–¦6¦6ˆ¦6¦6z¦6s¦6l¦6e¦6^¦6W¦6P¦6I¦6B¦6;¦64¦6-¦6&¦6¦6¦6¦6 ¦6¦6ü¥6õ¥6î¥6ç¥6à¥6Ù¥6Ò¥6Ë¥6Ä¥6½¥6¶¥6¯¥6¨¥6¡¥6š¥6“¥6Œ¥6…¥6~¥6w¥6p¥6i¥6b¥6[¥6T¥6M¥6F¥6?¥68¥61¥6*¥6#¥6¥6¥6¥6¥6¥6ù¤6ò¤6ë¤6ä¤6ݤ6Ö¤6Ϥ6Ȥ6Á¤6º¤6³¤6¬¤6¥¤6ž¤6—¤6¤6‰¤6‚¤6{¤6t¤6m¤6f¤6_¤6X¤6Q¤6J¤6C¤6<¤65¤6.¤6'¤6 ¤6¤6¤6 ¤6¤6ý£6ö£6ï£6è£6á£6Ú£6Ó£6Ì£6Å£6¾£6·£6°£6©£6¢£6›£6”£6£6†£6£6x£6q£6j£6c£6\£6U£6N£6G£6@£69£62£6+£6$£6£6£6£6£6£6ú¢6ó¢6ì¢6å¢6Þ¢6×¢6Т6É¢6¢6»¢6´¢6­¢6¦¢6Ÿ¢6˜¢6‘¢6Š¢6ƒ¢6|¢6u¢6n¢6g¢6`¢6Y¢6R¢6K¢6D¢6=¢66¢6/¢6(¢6!¢6¢6¢6 ¢6¢6þ¡6÷¡6ð¡6é¡6â¡6Û¡6Ô¡6Í¡6Æ¡6¿¡6¸¡6±¡6ª¡6£¡6œ¡6•¡6Ž¡6‡¡6€¡6y¡6r¡6k¡6d¡6]¡6V¡6O¡6H¡6A¡6:¡63¡6,¡6%¡6¡6¡6¡6 ¡6¡6û 6ô 6í 6æ 6ß 6Ø 6Ñ 6Ê 6à6¼ 6µ 6® 6§ 6  6™ 6’ 6‹ 6„ 6} 6v 6o 6h 6a 6Z 6S 6L 6E 6> 67 60 6) 6" 6 6 6  6 6ÿŸ6øŸ6ñŸ6êŸ6ãŸ6ÜŸ6ÕŸ6Ο6ÇŸ6ÀŸ6¹Ÿ6²Ÿ6«Ÿ6¤Ÿ6Ÿ6–Ÿ6Ÿ6ˆŸ6Ÿ6zŸ6sŸ6lŸ6eŸ6^Ÿ6WŸ6PŸ6IŸ6BŸ6;Ÿ64Ÿ6-Ÿ6&Ÿ6Ÿ6Ÿ6Ÿ6 Ÿ6Ÿ6üž6õž6îž6çž6àž6Ùž6Òž6Ëž6Äž6½ž6¶ž6¯ž6¨ž6¡ž6šž6“ž6Œž6…ž6~ž6wž6pž6iž6bž6[ž6Tž6Mž6Fž6?ž68ž61ž6*ž6#ž6ž6ž6ž6ž6ž6ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ýœ6öœ6ïœ6èœ6áœ6Úœ6Óœ6Ìœ6Åœ6¾œ6·œ6°œ6©œ6¢œ6›œ6”œ6œ6†œ6œ6xœ6qœ6jœ6cœ6\œ6Uœ6Nœ6Gœ6@œ69œ62œ6+œ6$œ6œ6œ6œ6œ6œ6ú›6ó›6ì›6å›6Þ›6×›6Л6É›6›6»›6´›6­›6¦›6Ÿ›6˜›6‘›6Š›6ƒ›6|›6u›6n›6g›6`›6Y›6R›6K›6D›6=›66›6/›6(›6!›6›6›6 ›6›6þš6÷š6ðš6éš6âš6Ûš6Ôš6Íš6Æš6¿š6¸š6±š6ªš6£š6œš6•š6Žš6‡š6€š6yš6rš6kš6dš6]š6Vš6Oš6Hš6Aš6:š63š6,š6%š6š6š6š6 š6š6û™6ô™6í™6æ™6ß™6Ø™6Ñ™6Ê™6Ù6¼™6µ™6®™6§™6 ™6™™6’™6‹™6„™6}™6v™6o™6h™6a™6Z™6S™6L™6E™6>™67™60™6)™6"™6™6™6 ™6™6ÿ˜6ø˜6ñ˜6ê˜6ã˜6ܘ6Õ˜6Θ6ǘ6À˜6¹˜6²˜6«˜6¤˜6˜6–˜6˜6ˆ˜6˜6z˜6s˜6l˜6e˜6^˜6W˜6P˜6I˜6B˜6;˜64˜6-˜6&˜6˜6˜6˜6 ˜6˜6ü—6õ—6î—6ç—6à—6Ù—6Ò—6Ë—6Ä—6½—6¶—6¯—6¨—6¡—6š—6“—6Œ—6…—6~—6w—6p—6i—6b—6[—6T—6M—6F—6?—68—61—6*—6#—6—6—6—6—6—6ù–6ò–6ë–6ä–6Ý–6Ö–6Ï–6È–6Á–6º–6³–6¬–6¥–6ž–6—–6–6‰–6‚–6{–6t–6m–6f–6_–6X–6Q–6J–6C–6<–65–6.–6'–6 –6–6–6 –6–6ý•6ö•6ï•6è•6á•6Ú•6Ó•6Ì•6Å•6¾•6·•6°•6©•6¢•6›•6”•6•6†•6•6x•6q•6j•6c•6\•6U•6N•6G•6@•69•62•6+•6$•6•6•6•6•6•6ú”6ó”6ì”6å”6Þ”6×”6Д6É”6”6»”6´”6­”6¦”6Ÿ”6˜”6‘”6Š”6ƒ”6|”6u”6n”6g”6`”6Y”6R”6K”6D”6=”66”6/”6(”6!”6”6”6 ”6”6þ“6÷“6ð“6é“6â“6Û“6Ô“6Í“6Æ“6¿“6¸“6±“6ª“6£“6œ“6•“6Ž“6‡“6€“6y“6r“6k“6d“6]“6V“6O“6H“6A“6:“63“6,“6%“6“6“6“6 “6“6û’6ô’6í’6æ’6ß’6Ø’6Ñ’6Ê’6Ã’6¼’6µ’6®’6§’6 ’6™’6’’6‹’6„’6}’6v’6o’6h’6a’6Z’6S’6L’6E’6>’67’60’6)’6"’6’6’6 ’6’6ÿ‘6ø‘6ñ‘6ê‘6ã‘6Ü‘6Õ‘6Α6Ç‘6À‘6¹‘6²‘6«‘6¤‘6‘6–‘6‘6ˆ‘6‘6z‘6s‘6l‘6e‘6^‘6W‘6P‘6I‘6B‘6;‘64‘6-‘6&‘6‘6‘6‘6 ‘6‘6ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ýŽ6öŽ6ïŽ6èŽ6áŽ6ÚŽ6ÓŽ6ÌŽ6ÅŽ6¾Ž6·Ž6°Ž6©Ž6¢Ž6›Ž6”Ž6Ž6†Ž6Ž6xŽ6qŽ6jŽ6cŽ6\Ž6UŽ6NŽ6GŽ6@Ž69Ž62Ž6+Ž6$Ž6Ž6Ž6Ž6Ž6Ž6ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þŒ6÷Œ6ðŒ6éŒ6âŒ6ÛŒ6ÔŒ6ÍŒ6ÆŒ6¿Œ6¸Œ6±Œ6ªŒ6£Œ6œŒ6•Œ6ŽŒ6‡Œ6€Œ6yŒ6rŒ6kŒ6dŒ6]Œ6VŒ6OŒ6HŒ6AŒ6:Œ63Œ6,Œ6%Œ6Œ6Œ6Œ6 Œ6Œ6û‹6ô‹6í‹6æ‹6ß‹6Ø‹6Ñ‹6Ê‹6Ë6¼‹6µ‹6®‹6§‹6 ‹6™‹6’‹6‹‹6„‹6}‹6v‹6o‹6h‹6a‹6Z‹6S‹6L‹6E‹6>‹67‹60‹6)‹6"‹6‹6‹6 ‹6‹6ÿŠ6øŠ6ñŠ6êŠ6ãŠ6ÜŠ6ÕŠ6Ί6ÇŠ6ÀŠ6¹Š6²Š6«Š6¤Š6Š6–Š6Š6ˆŠ6Š6zŠ6sŠ6lŠ6eŠ6^Š6WŠ6PŠ6IŠ6BŠ6;Š64Š6-Š6&Š6Š6Š6Š6 Š6Š6ü‰6õ‰6î‰6ç‰6à‰6Ù‰6Ò‰6ˉ6ĉ6½‰6¶‰6¯‰6¨‰6¡‰6š‰6“‰6Œ‰6…‰6~‰6w‰6p‰6i‰6b‰6[‰6T‰6M‰6F‰6?‰68‰61‰6*‰6#‰6‰6‰6‰6‰6‰6ùˆ6òˆ6ëˆ6äˆ6݈6Öˆ6ψ6Ȉ6Áˆ6ºˆ6³ˆ6¬ˆ6¥ˆ6žˆ6—ˆ6ˆ6‰ˆ6‚ˆ6{ˆ6tˆ6mˆ6fˆ6_ˆ6Xˆ6Qˆ6Jˆ6Cˆ6<ˆ65ˆ6.ˆ6'ˆ6 ˆ6ˆ6ˆ6 ˆ6ˆ6ý‡6ö‡6ï‡6è‡6á‡6Ú‡6Ó‡6̇6Ň6¾‡6·‡6°‡6©‡6¢‡6›‡6”‡6‡6†‡6‡6x‡6q‡6j‡6c‡6\‡6U‡6N‡6G‡6@‡69‡62‡6+‡6$‡6‡6‡6‡6‡6‡6ú†6ó†6ì†6å†6Þ†6׆6І6Ɇ6†6»†6´†6­†6¦†6Ÿ†6˜†6‘†6І6ƒ†6|†6u†6n†6g†6`†6Y†6R†6K†6D†6=†66†6/†6(†6!†6†6†6 †6†6þ…6÷…6ð…6é…6â…6Û…6Ô…6Í…6Æ…6¿…6¸…6±…6ª…6£…6œ…6•…6Ž…6‡…6€…6y…6r…6k…6d…6]…6V…6O…6H…6A…6:…63…6,…6%…6…6…6…6 …6…6û„6ô„6í„6æ„6ß„6Ø„6Ñ„6Ê„6Ä6¼„6µ„6®„6§„6 „6™„6’„6‹„6„„6}„6v„6o„6h„6a„6Z„6S„6L„6E„6>„67„60„6)„6"„6„6„6 „6„6ÿƒ6øƒ6ñƒ6êƒ6ãƒ6܃6Õƒ6΃6ǃ6Àƒ6¹ƒ6²ƒ6«ƒ6¤ƒ6ƒ6–ƒ6ƒ6ˆƒ6ƒ6zƒ6sƒ6lƒ6eƒ6^ƒ6Wƒ6Pƒ6Iƒ6Bƒ6;ƒ64ƒ6-ƒ6&ƒ6ƒ6ƒ6ƒ6 ƒ6ƒ6ü‚6õ‚6î‚6ç‚6à‚6Ù‚6Ò‚6Ë‚6Ä‚6½‚6¶‚6¯‚6¨‚6¡‚6š‚6“‚6Œ‚6…‚6~‚6w‚6p‚6i‚6b‚6[‚6T‚6M‚6F‚6?‚68‚61‚6*‚6#‚6‚6‚6‚6‚6‚6ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý€6ö€6ï€6è€6á€6Ú€6Ó€6Ì€6Å€6¾€6·€6°€6©€6¢€6›€6”€6€6†€6€6x€6q€6j€6c€6\€6U€6N€6G€6@€69€62€6+€6$€6€6€6€6€6€6ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ~6÷~6ð~6é~6â~6Û~6Ô~6Í~6Æ~6¿~6¸~6±~6ª~6£~6œ~6•~6Ž~6‡~6€~6y~6r~6k~6d~6]~6V~6O~6H~6A~6:~63~6,~6%~6~6~6~6 ~6~6û}6ô}6í}6æ}6ß}6Ø}6Ñ}6Ê}6Ã}6¼}6µ}6®}6§}6 }6™}6’}6‹}6„}6}}6v}6o}6h}6a}6Z}6S}6L}6E}6>}67}60}6)}6"}6}6}6 }6}6ÿ|6ø|6ñ|6ê|6ã|6Ü|6Õ|6Î|6Ç|6À|6¹|6²|6«|6¤|6|6–|6|6ˆ|6|6z|6s|6l|6e|6^|6W|6P|6I|6B|6;|64|6-|6&|6|6|6|6 |6|6ü{6õ{6î{6ç{6à{6Ù{6Ò{6Ë{6Ä{6½{6¶{6¯{6¨{6¡{6š{6“{6Œ{6…{6~{6w{6p{6i{6b{6[{6T{6M{6F{6?{68{61{6*{6#{6{6{6{6{6{6ùz6òz6ëz6äz6Ýz6Öz6Ïz6Èz6Áz6ºz6³z6¬z6¥z6žz6—z6z6‰z6‚z6{z6tz6mz6fz6_z6Xz6Qz6Jz6Cz6v67v60v6)v6"v6v6v6 v6v6ÿu6øu6ñu6êu6ãu6Üu6Õu6Îu6Çu6Àu6¹u6²u6«u6¤u6u6–u6u6ˆu6u6zu6su6lu6eu6^u6Wu6Pu6Iu6Bu6;u64u6-u6&u6u6u6u6 u6u6üt6õt6ît6çt6àt6Ùt6Òt6Ët6Ät6½t6¶t6¯t6¨t6¡t6št6“t6Œt6…t6~t6wt6pt6it6bt6[t6Tt6Mt6Ft6?t68t61t6*t6#t6t6t6t6t6t6ùs6òs6ës6äs6Ýs6Ös6Ïs6Ès6Ás6ºs6³s6¬s6¥s6žs6—s6s6‰s6‚s6{s6ts6ms6fs6_s6Xs6Qs6Js6Cs6o67o60o6)o6"o6o6o6 o6o6ÿn6øn6ñn6ên6ãn6Ün6Õn6În6Çn6Àn6¹n6²n6«n6¤n6n6–n6n6ˆn6n6zn6sn6ln6en6^n6Wn6Pn6In6Bn6;n64n6-n6&n6n6n6n6 n6n6üm6õm6îm6çm6àm6Ùm6Òm6Ëm6Äm6½m6¶m6¯m6¨m6¡m6šm6“m6Œm6…m6~m6wm6pm6im6bm6[m6Tm6Mm6Fm6?m68m61m6*m6#m6m6m6m6m6m6ùl6òl6ël6äl6Ýl6Öl6Ïl6Èl6Ál6ºl6³l6¬l6¥l6žl6—l6l6‰l6‚l6{l6tl6ml6fl6_l6Xl6Ql6Jl6Cl6h67h60h6)h6"h6h6h6 h6h6ÿg6øg6ñg6êg6ãg6Üg6Õg6Îg6Çg6Àg6¹g6²g6«g6¤g6g6–g6g6ˆg6g6zg6sg6lg6eg6^g6Wg6Pg6Ig6Bg6;g64g6-g6&g6g6g6g6 g6g6üf6õf6îf6çf6àf6Ùf6Òf6Ëf6Äf6½f6¶f6¯f6¨f6¡f6šf6“f6Œf6…f6~f6wf6pf6if6bf6[f6Tf6Mf6Ff6?f68f61f6*f6#f6f6f6f6f6f6ùe6òe6ëe6äe6Ýe6Öe6Ïe6Èe6Áe6ºe6³e6¬e6¥e6že6—e6e6‰e6‚e6{e6te6me6fe6_e6Xe6Qe6Je6Ce6a67a60a6)a6"a6a6a6 a6a6ÿ`6ø`6ñ`6ê`6ã`6Ü`6Õ`6Î`6Ç`6À`6¹`6²`6«`6¤`6`6–`6`6ˆ`6`6z`6s`6l`6e`6^`6W`6P`6I`6B`6;`64`6-`6&`6`6`6`6 `6`6ü_6õ_6î_6ç_6à_6Ù_6Ò_6Ë_6Ä_6½_6¶_6¯_6¨_6¡_6š_6“_6Œ_6…_6~_6w_6p_6i_6b_6[_6T_6M_6F_6?_68_61_6*_6#_6_6_6_6_6_6ù^6ò^6ë^6ä^6Ý^6Ö^6Ï^6È^6Á^6º^6³^6¬^6¥^6ž^6—^6^6‰^6‚^6{^6t^6m^6f^6_^6X^6Q^6J^6C^6<^65^6.^6'^6 ^6^6^6 ^6^6ý]6ö]6ï]6è]6á]6Ú]6Ó]6Ì]6Å]6¾]6·]6°]6©]6¢]6›]6”]6]6†]6]6x]6q]6j]6c]6\]6U]6N]6G]6@]69]62]6+]6$]6]6]6]6]6]6ú\6ó\6ì\6å\6Þ\6×\6Ð\6É\6Â\6»\6´\6­\6¦\6Ÿ\6˜\6‘\6Š\6ƒ\6|\6u\6n\6g\6`\6Y\6R\6K\6D\6=\66\6/\6(\6!\6\6\6 \6\6þ[6÷[6ð[6é[6â[6Û[6Ô[6Í[6Æ[6¿[6¸[6±[6ª[6£[6œ[6•[6Ž[6‡[6€[6y[6r[6k[6d[6][6V[6O[6H[6A[6:[63[6,[6%[6[6[6[6 [6[6ûZ6ôZ6íZ6æZ6ßZ6ØZ6ÑZ6ÊZ6ÃZ6¼Z6µZ6®Z6§Z6 Z6™Z6’Z6‹Z6„Z6}Z6vZ6oZ6hZ6aZ6ZZ6SZ6LZ6EZ6>Z67Z60Z6)Z6"Z6Z6Z6 Z6Z6ÿY6øY6ñY6êY6ãY6ÜY6ÕY6ÎY6ÇY6ÀY6¹Y6²Y6«Y6¤Y6Y6–Y6Y6ˆY6Y6zY6sY6lY6eY6^Y6WY6PY6IY6BY6;Y64Y6-Y6&Y6Y6Y6Y6 Y6Y6üX6õX6îX6çX6àX6ÙX6ÒX6ËX6ÄX6½X6¶X6¯X6¨X6¡X6šX6“X6ŒX6…X6~X6wX6pX6iX6bX6[X6TX6MX6FX6?X68X61X6*X6#X6X6X6X6X6X6ùW6òW6ëW6äW6ÝW6ÖW6ÏW6ÈW6ÁW6ºW6³W6¬W6¥W6žW6—W6W6‰W6‚W6{W6tW6mW6fW6_W6XW6QW6JW6CW6S67S60S6)S6"S6S6S6 S6S6ÿR6øR6ñR6êR6ãR6ÜR6ÕR6ÎR6ÇR6ÀR6¹R6²R6«R6¤R6R6–R6R6ˆR6R6zR6sR6lR6eR6^R6WR6PR6IR6BR6;R64R6-R6&R6R6R6R6 R6R6üQ6õQ6îQ6çQ6àQ6ÙQ6ÒQ6ËQ6ÄQ6½Q6¶Q6¯Q6¨Q6¡Q6šQ6“Q6ŒQ6…Q6~Q6wQ6pQ6iQ6bQ6[Q6TQ6MQ6FQ6?Q68Q61Q6*Q6#Q6Q6Q6Q6Q6Q6ùP6òP6ëP6äP6ÝP6ÖP6ÏP6ÈP6ÁP6ºP6³P6¬P6¥P6žP6—P6P6‰P6‚P6{P6tP6mP6fP6_P6XP6QP6JP6CP6L67L60L6)L6"L6L6L6 L6L6ÿK6øK6ñK6êK6ãK6ÜK6ÕK6ÎK6ÇK6ÀK6¹K6²K6«K6¤K6K6–K6K6ˆK6K6zK6sK6lK6eK6^K6WK6PK6IK6BK6;K64K6-K6&K6K6K6K6 K6K6üJ6õJ6îJ6çJ6àJ6ÙJ6ÒJ6ËJ6ÄJ6½J6¶J6¯J6¨J6¡J6šJ6“J6ŒJ6…J6~J6wJ6pJ6iJ6bJ6[J6TJ6MJ6FJ6?J68J61J6*J6#J6J6J6J6J6J6ùI6òI6ëI6äI6ÝI6ÖI6ÏI6ÈI6ÁI6ºI6³I6¬I6¥I6žI6—I6I6‰I6‚I6{I6tI6mI6fI6_I6XI6QI6JI6CI6E67E60E6)E6"E6E6E6 E6E6ÿD6øD6ñD6êD6ãD6ÜD6ÕD6ÎD6ÇD6ÀD6¹D6²D6«D6¤D6D6–D6D6ˆD6D6zD6sD6lD6eD6^D6WD6PD6ID6BD6;D64D6-D6&D6D6D6D6 D6D6üC6õC6îC6çC6àC6ÙC6ÒC6ËC6ÄC6½C6¶C6¯C6¨C6¡C6šC6“C6ŒC6…C6~C6wC6pC6iC6bC6[C6TC6MC6FC6?C68C61C6*C6#C6C6C6C6C6C6ùB6òB6ëB6äB6ÝB6ÖB6ÏB6ÈB6ÁB6ºB6³B6¬B6¥B6žB6—B6B6‰B6‚B6{B6tB6mB6fB6_B6XB6QB6JB6CB66ô>6í>6æ>6ß>6Ø>6Ñ>6Ê>6Ã>6¼>6µ>6®>6§>6 >6™>6’>6‹>6„>6}>6v>6o>6h>6a>6Z>6S>6L>6E>6>>67>60>6)>6">6>6>6 >6>6ÿ=6ø=6ñ=6ê=6ã=6Ü=6Õ=6Î=6Ç=6À=6¹=6²=6«=6¤=6=6–=6=6ˆ=6=6z=6s=6l=6e=6^=6W=6P=6I=6B=6;=64=6-=6&=6=6=6=6 =6=6ü<6õ<6î<6ç<6à<6Ù<6Ò<6Ë<6Ä<6½<6¶<6¯<6¨<6¡<6š<6“<6Œ<6…<6~<6w<6p<6i<6b<6[<6T<6M<6F<6?<68<61<6*<6#<6<6<6<6<6<6ù;6ò;6ë;6ä;6Ý;6Ö;6Ï;6È;6Á;6º;6³;6¬;6¥;6ž;6—;6;6‰;6‚;6{;6t;6m;6f;6_;6X;6Q;6J;6C;6<;65;6.;6';6 ;6;6;6 ;6;6ý:6ö:6ï:6è:6á:6Ú:6Ó:6Ì:6Å:6¾:6·:6°:6©:6¢:6›:6”:6:6†:6:6x:6q:6j:6c:6\:6U:6N:6G:6@:69:62:6+:6$:6:6:6:6:6:6ú96ó96ì96å96Þ96×96Ð96É96Â96»96´96­96¦96Ÿ96˜96‘96Š96ƒ96|96u96n96g96`96Y96R96K96D96=96696/96(96!969696 9696þ86÷86ð86é86â86Û86Ô86Í86Æ86¿86¸86±86ª86£86œ86•86Ž86‡86€86y86r86k86d86]86V86O86H86A86:86386,86%86868686 8686û76ô76í76æ76ß76Ø76Ñ76Ê76Ã76¼76µ76®76§76 76™76’76‹76„76}76v76o76h76a76Z76S76L76E76>76776076)76"767676 7676ÿ66ø66ñ66ê66ã66Ü66Õ66Î66Ç66À66¹66²66«66¤6666–6666ˆ6666z66s66l66e66^66W66P66I66B66;66466-66&66666666 6666ü56õ56î56ç56à56Ù56Ò56Ë56Ä56½56¶56¯56¨56¡56š56“56Œ56…56~56w56p56i56b56[56T56M56F56?56856156*56#565656565656ù46ò46ë46ä46Ý46Ö46Ï46È46Á46º46³46¬46¥46ž46—4646‰46‚46{46t46m46f46_46X46Q46J46C46<46546.46'46 464646 4646ý36ö36ï36è36á36Ú36Ó36Ì36Å36¾36·36°36©36¢36›36”3636†3636x36q36j36c36\36U36N36G36@36936236+36$363636363636ú26ó26ì26å26Þ26×26Ð26É26Â26»26´26­26¦26Ÿ26˜26‘26Š26ƒ26|26u26n26g26`26Y26R26K26D26=26626/26(26!262626 2626þ16÷16ð16é16â16Û16Ô16Í16Æ16¿16¸16±16ª16£16œ16•16Ž16‡16€16y16r16k16d16]16V16O16H16A16:16316,16%16161616 1616û06ô06í06æ06ß06Ø06Ñ06Ê06Ã06¼06µ06®06§06 06™06’06‹06„06}06v06o06h06a06Z06S06L06E06>06706006)06"060606 0606ÿ/6ø/6ñ/6ê/6ã/6Ü/6Õ/6Î/6Ç/6À/6¹/6²/6«/6¤/6/6–/6/6ˆ/6/6z/6s/6l/6e/6^/6W/6P/6I/6B/6;/64/6-/6&/6/6/6/6 /6/6ü.6õ.6î.6ç.6à.6Ù.6Ò.6Ë.6Ä.6½.6¶.6¯.6¨.6¡.6š.6“.6Œ.6….6~.6w.6p.6i.6b.6[.6T.6M.6F.6?.68.61.6*.6#.6.6.6.6.6.6ù-6ò-6ë-6ä-6Ý-6Ö-6Ï-6È-6Á-6º-6³-6¬-6¥-6ž-6—-6-6‰-6‚-6{-6t-6m-6f-6_-6X-6Q-6J-6C-6<-65-6.-6'-6 -6-6-6 -6-6ý,6ö,6ï,6è,6á,6Ú,6Ó,6Ì,6Å,6¾,6·,6°,6©,6¢,6›,6”,6,6†,6,6x,6q,6j,6c,6\,6U,6N,6G,6@,69,62,6+,6$,6,6,6,6,6,6ú+6ó+6ì+6å+6Þ+6×+6Ð+6É+6Â+6»+6´+6­+6¦+6Ÿ+6˜+6‘+6Š+6ƒ+6|+6u+6n+6g+6`+6Y+6R+6K+6D+6=+66+6/+6(+6!+6+6+6 +6+6þ*6÷*6ð*6é*6â*6Û*6Ô*6Í*6Æ*6¿*6¸*6±*6ª*6£*6œ*6•*6Ž*6‡*6€*6y*6r*6k*6d*6]*6V*6O*6H*6A*6:*63*6,*6%*6*6*6*6 *6*6û)6ô)6í)6æ)6ß)6Ø)6Ñ)6Ê)6Ã)6¼)6µ)6®)6§)6 )6™)6’)6‹)6„)6})6v)6o)6h)6a)6Z)6S)6L)6E)6>)67)60)6))6")6)6)6 )6)6ÿ(6ø(6ñ(6ê(6ã(6Ü(6Õ(6Î(6Ç(6À(6¹(6²(6«(6¤(6(6–(6(6ˆ(6(6z(6s(6l(6e(6^(6W(6P(6I(6B(6;(64(6-(6&(6(6(6(6 (6(6ü'6õ'6î'6ç'6à'6Ù'6Ò'6Ë'6Ä'6½'6¶'6¯'6¨'6¡'6š'6“'6Œ'6…'6~'6w'6p'6i'6b'6['6T'6M'6F'6?'68'61'6*'6#'6'6'6'6'6'6ù&6ò&6ë&6ä&6Ý&6Ö&6Ï&6È&6Á&6º&6³&6¬&6¥&6ž&6—&6&6‰&6‚&6{&6t&6m&6f&6_&6X&6Q&6J&6C&6<&65&6.&6'&6 &6&6&6 &6&6ý%6ö%6ï%6è%6á%6Ú%6Ó%6Ì%6Å%6¾%6·%6°%6©%6¢%6›%6”%6%6†%6%6x%6q%6j%6c%6\%6U%6N%6G%6@%69%62%6+%6$%6%6%6%6%6%6ú$6ó$6ì$6å$6Þ$6×$6Ð$6É$6Â$6»$6´$6­$6¦$6Ÿ$6˜$6‘$6Š$6ƒ$6|$6u$6n$6g$6`$6Y$6R$6K$6D$6=$66$6/$6($6!$6$6$6 $6$6þ#6÷#6ð#6é#6â#6Û#6Ô#6Í#6Æ#6¿#6¸#6±#6ª#6£#6œ#6•#6Ž#6‡#6€#6y#6r#6k#6d#6]#6V#6O#6H#6A#6:#63#6,#6%#6#6#6#6 #6#6û"6ô"6í"6æ"6ß"6Ø"6Ñ"6Ê"6Ã"6¼"6µ"6®"6§"6 "6™"6’"6‹"6„"6}"6v"6o"6h"6a"6Z"6S"6L"6E"6>"67"60"6)"6""6"6"6 "6"6ÿ!6ø!6ñ!6ê!6ã!6Ü!6Õ!6Î!6Ç!6À!6¹!6²!6«!6¤!6!6–!6!6ˆ!6!6z!6s!6l!6e!6^!6W!6P!6I!6B!6;!64!6-!6&!6!6!6!6 !6!6ü 6õ 6î 6ç 6à 6Ù 6Ò 6Ë 6Ä 6½ 6¶ 6¯ 6¨ 6¡ 6š 6“ 6Œ 6… 6~ 6w 6p 6i 6b 6[ 6T 6M 6F 6? 68 61 6* 6# 6 6 6 6 6 6ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û 6ô 6í 6æ 6ß 6Ø 6Ñ 6Ê 6à 6¼ 6µ 6® 6§ 6  6™ 6’ 6‹ 6„ 6} 6v 6o 6h 6a 6Z 6S 6L 6E 6> 67 60 6) 6" 6 6 6 6 6ÿ 6ø 6ñ 6ê 6ã 6Ü 6Õ 6Î 6Ç 6À 6¹ 6² 6« 6¤ 6 6– 6 6ˆ 6 6z 6s 6l 6e 6^ 6W 6P 6I 6B 6; 64 6- 6& 6 6 6 6 6 6ü 6õ 6î 6ç 6à 6Ù 6Ò 6Ë 6Ä 6½ 6¶ 6¯ 6¨ 6¡ 6š 6“ 6Œ 6… 6~ 6w 6p 6i 6b 6[ 6T 6M 6F 6? 68 61 6* 6# 6 6 6 6 6 6ù 6ò 6ë 6ä 6Ý 6Ö 6Ï 6È 6Á 6º 6³ 6¬ 6¥ 6ž 6— 6 6‰ 6‚ 6{ 6t 6m 6f 6_ 6X 6Q 6J 6C 6< 65 6. 6' 6 6 6 6 6 6ý 6ö 6ï 6è 6á 6Ú 6Ó 6Ì 6Å 6¾ 6· 6° 6© 6¢ 6› 6” 6 6† 6 6x 6q 6j 6c 6\ 6U 6N 6G 6@ 69 62 6+ 6$ 6 6 6 6 6 6ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66ûÿ5ôÿ5íÿ5æÿ5ßÿ5Øÿ5Ñÿ5Êÿ5Ãÿ5¼ÿ5µÿ5®ÿ5§ÿ5 ÿ5™ÿ5’ÿ5‹ÿ5„ÿ5}ÿ5vÿ5oÿ5hÿ5aÿ5Zÿ5Sÿ5Lÿ5Eÿ5>ÿ57ÿ50ÿ5)ÿ5"ÿ5ÿ5ÿ5 ÿ5ÿ5ÿþ5øþ5ñþ5êþ5ãþ5Üþ5Õþ5Îþ5Çþ5Àþ5¹þ5²þ5«þ5¤þ5þ5–þ5þ5ˆþ5þ5zþ5sþ5lþ5eþ5^þ5Wþ5Pþ5Iþ5Bþ5;þ54þ5-þ5&þ5þ5þ5þ5 þ5þ5üý5õý5îý5çý5àý5Ùý5Òý5Ëý5Äý5½ý5¶ý5¯ý5¨ý5¡ý5šý5“ý5Œý5…ý5~ý5wý5pý5iý5bý5[ý5Tý5Mý5Fý5?ý58ý51ý5*ý5#ý5ý5ý5ý5ý5ý5ùü5òü5ëü5äü5Ýü5Öü5Ïü5Èü5Áü5ºü5³ü5¬ü5¥ü5žü5—ü5ü5‰ü5‚ü5{ü5tü5mü5fü5_ü5Xü5Qü5Jü5Cü5<ü55ü5.ü5'ü5 ü5ü5ü5 ü5ü5ýû5öû5ïû5èû5áû5Úû5Óû5Ìû5Åû5¾û5·û5°û5©û5¢û5›û5”û5û5†û5û5xû5qû5jû5cû5\û5Uû5Nû5Gû5@û59û52û5+û5$û5û5û5û5û5û5úú5óú5ìú5åú5Þú5×ú5Ðú5Éú5Âú5»ú5´ú5­ú5¦ú5Ÿú5˜ú5‘ú5Šú5ƒú5|ú5uú5nú5gú5`ú5Yú5Rú5Kú5Dú5=ú56ú5/ú5(ú5!ú5ú5ú5 ú5ú5þù5÷ù5ðù5éù5âù5Ûù5Ôù5Íù5Æù5¿ù5¸ù5±ù5ªù5£ù5œù5•ù5Žù5‡ù5€ù5yù5rù5kù5dù5]ù5Vù5Où5Hù5Aù5:ù53ù5,ù5%ù5ù5ù5ù5 ù5ù5ûø5ôø5íø5æø5ßø5Øø5Ñø5Êø5Ãø5¼ø5µø5®ø5§ø5 ø5™ø5’ø5‹ø5„ø5}ø5vø5oø5hø5aø5Zø5Sø5Lø5Eø5>ø57ø50ø5)ø5"ø5ø5ø5 ø5ø5ÿ÷5ø÷5ñ÷5ê÷5ã÷5Ü÷5Õ÷5Î÷5Ç÷5À÷5¹÷5²÷5«÷5¤÷5÷5–÷5÷5ˆ÷5÷5z÷5s÷5l÷5e÷5^÷5W÷5P÷5I÷5B÷5;÷54÷5-÷5&÷5÷5÷5÷5 ÷5÷5üö5õö5îö5çö5àö5Ùö5Òö5Ëö5Äö5½ö5¶ö5¯ö5¨ö5¡ö5šö5“ö5Œö5…ö5~ö5wö5pö5iö5bö5[ö5Tö5Mö5Fö5?ö58ö51ö5*ö5#ö5ö5ö5ö5ö5ö5ùõ5òõ5ëõ5äõ5Ýõ5Öõ5Ïõ5Èõ5Áõ5ºõ5³õ5¬õ5¥õ5žõ5—õ5õ5‰õ5‚õ5{õ5tõ5mõ5fõ5_õ5Xõ5Qõ5Jõ5Cõ5<õ55õ5.õ5'õ5 õ5õ5õ5 õ5õ5ýô5öô5ïô5èô5áô5Úô5Óô5Ìô5Åô5¾ô5·ô5°ô5©ô5¢ô5›ô5”ô5ô5†ô5ô5xô5qô5jô5cô5\ô5Uô5Nô5Gô5@ô59ô52ô5+ô5$ô5ô5ô5ô5ô5ô5úó5óó5ìó5åó5Þó5×ó5Ðó5Éó5Âó5»ó5´ó5­ó5¦ó5Ÿó5˜ó5‘ó5Šó5ƒó5|ó5uó5nó5gó5`ó5Yó5Ró5Kó5Dó5=ó56ó5/ó5(ó5!ó5ó5ó5 ó5ó5þò5÷ò5ðò5éò5âò5Ûò5Ôò5Íò5Æò5¿ò5¸ò5±ò5ªò5£ò5œò5•ò5Žò5‡ò5€ò5yò5rò5kò5dò5]ò5Vò5Oò5Hò5Aò5:ò53ò5,ò5%ò5ò5ò5ò5 ò5ò5ûñ5ôñ5íñ5æñ5ßñ5Øñ5Ññ5Êñ5Ãñ5¼ñ5µñ5®ñ5§ñ5 ñ5™ñ5’ñ5‹ñ5„ñ5}ñ5vñ5oñ5hñ5añ5Zñ5Sñ5Lñ5Eñ5>ñ57ñ50ñ5)ñ5"ñ5ñ5ñ5 ñ5ñ5ÿð5øð5ñð5êð5ãð5Üð5Õð5Îð5Çð5Àð5¹ð5²ð5«ð5¤ð5ð5–ð5ð5ˆð5ð5zð5sð5lð5eð5^ð5Wð5Pð5Ið5Bð5;ð54ð5-ð5&ð5ð5ð5ð5 ð5ð5üï5õï5îï5çï5àï5Ùï5Òï5Ëï5Äï5½ï5¶ï5¯ï5¨ï5¡ï5šï5“ï5Œï5…ï5~ï5wï5pï5iï5bï5[ï5Tï5Mï5Fï5?ï58ï51ï5*ï5#ï5ï5ï5ï5ï5ï5ùî5òî5ëî5äî5Ýî5Öî5Ïî5Èî5Áî5ºî5³î5¬î5¥î5žî5—î5î5‰î5‚î5{î5tî5mî5fî5_î5Xî5Qî5Jî5Cî5<î55î5.î5'î5 î5î5î5 î5î5ýí5öí5ïí5èí5áí5Úí5Óí5Ìí5Åí5¾í5·í5°í5©í5¢í5›í5”í5í5†í5í5xí5qí5jí5cí5\í5Uí5Ní5Gí5@í59í52í5+í5$í5í5í5í5í5í5úì5óì5ìì5åì5Þì5×ì5Ðì5Éì5Âì5»ì5´ì5­ì5¦ì5Ÿì5˜ì5‘ì5Šì5ƒì5|ì5uì5nì5gì5`ì5Yì5Rì5Kì5Dì5=ì56ì5/ì5(ì5!ì5ì5ì5 ì5ì5þë5÷ë5ðë5éë5âë5Ûë5Ôë5Íë5Æë5¿ë5¸ë5±ë5ªë5£ë5œë5•ë5Žë5‡ë5€ë5yë5rë5kë5dë5]ë5Vë5Oë5Hë5Aë5:ë53ë5,ë5%ë5ë5ë5ë5 ë5ë5ûê5ôê5íê5æê5ßê5Øê5Ñê5Êê5Ãê5¼ê5µê5®ê5§ê5 ê5™ê5’ê5‹ê5„ê5}ê5vê5oê5hê5aê5Zê5Sê5Lê5Eê5>ê57ê50ê5)ê5"ê5ê5ê5 ê5ê5ÿé5øé5ñé5êé5ãé5Üé5Õé5Îé5Çé5Àé5¹é5²é5«é5¤é5é5–é5é5ˆé5é5zé5sé5lé5eé5^é5Wé5Pé5Ié5Bé5;é54é5-é5&é5é5é5é5 é5é5üè5õè5îè5çè5àè5Ùè5Òè5Ëè5Äè5½è5¶è5¯è5¨è5¡è5šè5“è5Œè5…è5~è5wè5pè5iè5bè5[è5Tè5Mè5Fè5?è58è51è5*è5#è5è5è5è5è5è5ùç5òç5ëç5äç5Ýç5Öç5Ïç5Èç5Áç5ºç5³ç5¬ç5¥ç5žç5—ç5ç5‰ç5‚ç5{ç5tç5mç5fç5_ç5Xç5Qç5Jç5Cç5<ç55ç5.ç5'ç5 ç5ç5ç5 ç5ç5ýæ5öæ5ïæ5èæ5áæ5Úæ5Óæ5Ìæ5Åæ5¾æ5·æ5°æ5©æ5¢æ5›æ5”æ5æ5†æ5æ5xæ5qæ5jæ5cæ5\æ5Uæ5Næ5Gæ5@æ59æ52æ5+æ5$æ5æ5æ5æ5æ5æ5úå5óå5ìå5åå5Þå5×å5Ðå5Éå5Âå5»å5´å5­å5¦å5Ÿå5˜å5‘å5Šå5ƒå5|å5uå5nå5gå5`å5Yå5Rå5Kå5Då5=å56å5/å5(å5!å5å5å5 å5å5þä5÷ä5ðä5éä5âä5Ûä5Ôä5Íä5Æä5¿ä5¸ä5±ä5ªä5£ä5œä5•ä5Žä5‡ä5€ä5yä5rä5kä5dä5]ä5Vä5Oä5Hä5Aä5:ä53ä5,ä5%ä5ä5ä5ä5 ä5ä5ûã5ôã5íã5æã5ßã5Øã5Ñã5Êã5Ãã5¼ã5µã5®ã5§ã5 ã5™ã5’ã5‹ã5„ã5}ã5vã5oã5hã5aã5Zã5Sã5Lã5Eã5>ã57ã50ã5)ã5"ã5ã5ã5 ã5ã5ÿâ5øâ5ñâ5êâ5ãâ5Üâ5Õâ5Îâ5Çâ5Àâ5¹â5²â5«â5¤â5â5–â5â5ˆâ5â5zâ5sâ5lâ5eâ5^â5Wâ5Pâ5Iâ5Bâ5;â54â5-â5&â5â5â5â5 â5â5üá5õá5îá5çá5àá5Ùá5Òá5Ëá5Äá5½á5¶á5¯á5¨á5¡á5šá5“á5Œá5…á5~á5wá5pá5iá5bá5[á5Tá5Má5Fá5?á58á51á5*á5#á5á5á5á5á5á5ùà5òà5ëà5äà5Ýà5Öà5Ïà5Èà5Áà5ºà5³à5¬à5¥à5žà5—à5à5‰à5‚à5{à5tà5mà5fà5_à5Xà5Qà5Jà5Cà5<à55à5.à5'à5 à5à5à5 à5à5ýß5öß5ïß5èß5áß5Úß5Óß5Ìß5Åß5¾ß5·ß5°ß5©ß5¢ß5›ß5”ß5ß5†ß5ß5xß5qß5jß5cß5\ß5Uß5Nß5Gß5@ß59ß52ß5+ß5$ß5ß5ß5ß5ß5ß5úÞ5óÞ5ìÞ5åÞ5ÞÞ5×Þ5ÐÞ5ÉÞ5ÂÞ5»Þ5´Þ5­Þ5¦Þ5ŸÞ5˜Þ5‘Þ5ŠÞ5ƒÞ5|Þ5uÞ5nÞ5gÞ5`Þ5YÞ5RÞ5KÞ5DÞ5=Þ56Þ5/Þ5(Þ5!Þ5Þ5Þ5 Þ5Þ5þÝ5÷Ý5ðÝ5éÝ5âÝ5ÛÝ5ÔÝ5ÍÝ5ÆÝ5¿Ý5¸Ý5±Ý5ªÝ5£Ý5œÝ5•Ý5ŽÝ5‡Ý5€Ý5yÝ5rÝ5kÝ5dÝ5]Ý5VÝ5OÝ5HÝ5AÝ5:Ý53Ý5,Ý5%Ý5Ý5Ý5Ý5 Ý5Ý5ûÜ5ôÜ5íÜ5æÜ5ßÜ5ØÜ5ÑÜ5ÊÜ5ÃÜ5¼Ü5µÜ5®Ü5§Ü5 Ü5™Ü5’Ü5‹Ü5„Ü5}Ü5vÜ5oÜ5hÜ5aÜ5ZÜ5SÜ5LÜ5EÜ5>Ü57Ü50Ü5)Ü5"Ü5Ü5Ü5 Ü5Ü5ÿÛ5øÛ5ñÛ5êÛ5ãÛ5ÜÛ5ÕÛ5ÎÛ5ÇÛ5ÀÛ5¹Û5²Û5«Û5¤Û5Û5–Û5Û5ˆÛ5Û5zÛ5sÛ5lÛ5eÛ5^Û5WÛ5PÛ5IÛ5BÛ5;Û54Û5-Û5&Û5Û5Û5Û5 Û5Û5üÚ5õÚ5îÚ5çÚ5àÚ5ÙÚ5ÒÚ5ËÚ5ÄÚ5½Ú5¶Ú5¯Ú5¨Ú5¡Ú5šÚ5“Ú5ŒÚ5…Ú5~Ú5wÚ5pÚ5iÚ5bÚ5[Ú5TÚ5MÚ5FÚ5?Ú58Ú51Ú5*Ú5#Ú5Ú5Ú5Ú5Ú5Ú5ùÙ5òÙ5ëÙ5äÙ5ÝÙ5ÖÙ5ÏÙ5ÈÙ5ÁÙ5ºÙ5³Ù5¬Ù5¥Ù5žÙ5—Ù5Ù5‰Ù5‚Ù5{Ù5tÙ5mÙ5fÙ5_Ù5XÙ5QÙ5JÙ5CÙ5<Ù55Ù5.Ù5'Ù5 Ù5Ù5Ù5 Ù5Ù5ýØ5öØ5ïØ5èØ5áØ5ÚØ5ÓØ5ÌØ5ÅØ5¾Ø5·Ø5°Ø5©Ø5¢Ø5›Ø5”Ø5Ø5†Ø5Ø5xØ5qØ5jØ5cØ5\Ø5UØ5NØ5GØ5@Ø59Ø52Ø5+Ø5$Ø5Ø5Ø5Ø5Ø5Ø5ú×5ó×5ì×5å×5Þ×5××5Ð×5É×5Â×5»×5´×5­×5¦×5Ÿ×5˜×5‘×5Š×5ƒ×5|×5u×5n×5g×5`×5Y×5R×5K×5D×5=×56×5/×5(×5!×5×5×5 ×5×5þÖ5÷Ö5ðÖ5éÖ5âÖ5ÛÖ5ÔÖ5ÍÖ5ÆÖ5¿Ö5¸Ö5±Ö5ªÖ5£Ö5œÖ5•Ö5ŽÖ5‡Ö5€Ö5yÖ5rÖ5kÖ5dÖ5]Ö5VÖ5OÖ5HÖ5AÖ5:Ö53Ö5,Ö5%Ö5Ö5Ö5Ö5 Ö5Ö5ûÕ5ôÕ5íÕ5æÕ5ßÕ5ØÕ5ÑÕ5ÊÕ5ÃÕ5¼Õ5µÕ5®Õ5§Õ5 Õ5™Õ5’Õ5‹Õ5„Õ5}Õ5vÕ5oÕ5hÕ5aÕ5ZÕ5SÕ5LÕ5EÕ5>Õ57Õ50Õ5)Õ5"Õ5Õ5Õ5 Õ5Õ5ÿÔ5øÔ5ñÔ5êÔ5ãÔ5ÜÔ5ÕÔ5ÎÔ5ÇÔ5ÀÔ5¹Ô5²Ô5«Ô5¤Ô5Ô5–Ô5Ô5ˆÔ5Ô5zÔ5sÔ5lÔ5eÔ5^Ô5WÔ5PÔ5IÔ5BÔ5;Ô54Ô5-Ô5&Ô5Ô5Ô5Ô5 Ô5Ô5üÓ5õÓ5îÓ5çÓ5àÓ5ÙÓ5ÒÓ5ËÓ5ÄÓ5½Ó5¶Ó5¯Ó5¨Ó5¡Ó5šÓ5“Ó5ŒÓ5…Ó5~Ó5wÓ5pÓ5iÓ5bÓ5[Ó5TÓ5MÓ5FÓ5?Ó58Ó51Ó5*Ó5#Ó5Ó5Ó5Ó5Ó5Ó5ùÒ5òÒ5ëÒ5äÒ5ÝÒ5ÖÒ5ÏÒ5ÈÒ5ÁÒ5ºÒ5³Ò5¬Ò5¥Ò5žÒ5—Ò5Ò5‰Ò5‚Ò5{Ò5tÒ5mÒ5fÒ5_Ò5XÒ5QÒ5JÒ5CÒ5<Ò55Ò5.Ò5'Ò5 Ò5Ò5Ò5 Ò5Ò5ýÑ5öÑ5ïÑ5èÑ5áÑ5ÚÑ5ÓÑ5ÌÑ5ÅÑ5¾Ñ5·Ñ5°Ñ5©Ñ5¢Ñ5›Ñ5”Ñ5Ñ5†Ñ5Ñ5xÑ5qÑ5jÑ5cÑ5\Ñ5UÑ5NÑ5GÑ5@Ñ59Ñ52Ñ5+Ñ5$Ñ5Ñ5Ñ5Ñ5Ñ5Ñ5úÐ5óÐ5ìÐ5åÐ5ÞÐ5×Ð5ÐÐ5ÉÐ5ÂÐ5»Ð5´Ð5­Ð5¦Ð5ŸÐ5˜Ð5‘Ð5ŠÐ5ƒÐ5|Ð5uÐ5nÐ5gÐ5`Ð5YÐ5RÐ5KÐ5DÐ5=Ð56Ð5/Ð5(Ð5!Ð5Ð5Ð5 Ð5Ð5þÏ5÷Ï5ðÏ5éÏ5âÏ5ÛÏ5ÔÏ5ÍÏ5ÆÏ5¿Ï5¸Ï5±Ï5ªÏ5£Ï5œÏ5•Ï5ŽÏ5‡Ï5€Ï5yÏ5rÏ5kÏ5dÏ5]Ï5VÏ5OÏ5HÏ5AÏ5:Ï53Ï5,Ï5%Ï5Ï5Ï5Ï5 Ï5Ï5ûÎ5ôÎ5íÎ5æÎ5ßÎ5ØÎ5ÑÎ5ÊÎ5ÃÎ5¼Î5µÎ5®Î5§Î5 Î5™Î5’Î5‹Î5„Î5}Î5vÎ5oÎ5hÎ5aÎ5ZÎ5SÎ5LÎ5EÎ5>Î57Î50Î5)Î5"Î5Î5Î5 Î5Î5ÿÍ5øÍ5ñÍ5êÍ5ãÍ5ÜÍ5ÕÍ5ÎÍ5ÇÍ5ÀÍ5¹Í5²Í5«Í5¤Í5Í5–Í5Í5ˆÍ5Í5zÍ5sÍ5lÍ5eÍ5^Í5WÍ5PÍ5IÍ5BÍ5;Í54Í5-Í5&Í5Í5Í5Í5 Í5Í5üÌ5õÌ5îÌ5çÌ5àÌ5ÙÌ5ÒÌ5ËÌ5ÄÌ5½Ì5¶Ì5¯Ì5¨Ì5¡Ì5šÌ5“Ì5ŒÌ5…Ì5~Ì5wÌ5pÌ5iÌ5bÌ5[Ì5TÌ5MÌ5FÌ5?Ì58Ì51Ì5*Ì5#Ì5Ì5Ì5Ì5Ì5Ì5ùË5òË5ëË5äË5ÝË5ÖË5ÏË5ÈË5ÁË5ºË5³Ë5¬Ë5¥Ë5žË5—Ë5Ë5‰Ë5‚Ë5{Ë5tË5mË5fË5_Ë5XË5QË5JË5CË5<Ë55Ë5.Ë5'Ë5 Ë5Ë5Ë5 Ë5Ë5ýÊ5öÊ5ïÊ5èÊ5áÊ5ÚÊ5ÓÊ5ÌÊ5ÅÊ5¾Ê5·Ê5°Ê5©Ê5¢Ê5›Ê5”Ê5Ê5†Ê5Ê5xÊ5qÊ5jÊ5cÊ5\Ê5UÊ5NÊ5GÊ5@Ê59Ê52Ê5+Ê5$Ê5Ê5Ê5Ê5Ê5Ê5úÉ5óÉ5ìÉ5åÉ5ÞÉ5×É5ÐÉ5ÉÉ5ÂÉ5»É5´É5­É5¦É5ŸÉ5˜É5‘É5ŠÉ5ƒÉ5|É5uÉ5nÉ5gÉ5`É5YÉ5RÉ5KÉ5DÉ5=É56É5/É5(É5!É5É5É5 É5É5þÈ5÷È5ðÈ5éÈ5âÈ5ÛÈ5ÔÈ5ÍÈ5ÆÈ5¿È5¸È5±È5ªÈ5£È5œÈ5•È5ŽÈ5‡È5€È5yÈ5rÈ5kÈ5dÈ5]È5VÈ5OÈ5HÈ5AÈ5:È53È5,È5%È5È5È5È5 È5È5ûÇ5ôÇ5íÇ5æÇ5ßÇ5ØÇ5ÑÇ5ÊÇ5ÃÇ5¼Ç5µÇ5®Ç5§Ç5 Ç5™Ç5’Ç5‹Ç5„Ç5}Ç5vÇ5oÇ5hÇ5aÇ5ZÇ5SÇ5LÇ5EÇ5>Ç57Ç50Ç5)Ç5"Ç5Ç5Ç5 Ç5Ç5ÿÆ5øÆ5ñÆ5êÆ5ãÆ5ÜÆ5ÕÆ5ÎÆ5ÇÆ5ÀÆ5¹Æ5²Æ5«Æ5¤Æ5Æ5–Æ5Æ5ˆÆ5Æ5zÆ5sÆ5lÆ5eÆ5^Æ5WÆ5PÆ5IÆ5BÆ5;Æ54Æ5-Æ5&Æ5Æ5Æ5Æ5 Æ5Æ5üÅ5õÅ5îÅ5çÅ5àÅ5ÙÅ5ÒÅ5ËÅ5ÄÅ5½Å5¶Å5¯Å5¨Å5¡Å5šÅ5“Å5ŒÅ5…Å5~Å5wÅ5pÅ5iÅ5bÅ5[Å5TÅ5MÅ5FÅ5?Å58Å51Å5*Å5#Å5Å5Å5Å5Å5Å5ùÄ5òÄ5ëÄ5äÄ5ÝÄ5ÖÄ5ÏÄ5ÈÄ5ÁÄ5ºÄ5³Ä5¬Ä5¥Ä5žÄ5—Ä5Ä5‰Ä5‚Ä5{Ä5tÄ5mÄ5fÄ5_Ä5XÄ5QÄ5JÄ5CÄ5<Ä55Ä5.Ä5'Ä5 Ä5Ä5Ä5 Ä5Ä5ýÃ5öÃ5ïÃ5èÃ5áÃ5ÚÃ5ÓÃ5ÌÃ5ÅÃ5¾Ã5·Ã5°Ã5©Ã5¢Ã5›Ã5”Ã5Ã5†Ã5Ã5xÃ5qÃ5jÃ5cÃ5\Ã5UÃ5NÃ5GÃ5@Ã59Ã52Ã5+Ã5$Ã5Ã5Ã5Ã5Ã5Ã5úÂ5óÂ5ìÂ5åÂ5ÞÂ5×Â5ÐÂ5ÉÂ5ÂÂ5»Â5´Â5­Â5¦Â5ŸÂ5˜Â5‘Â5ŠÂ5ƒÂ5|Â5uÂ5nÂ5gÂ5`Â5YÂ5RÂ5KÂ5DÂ5=Â56Â5/Â5(Â5!Â5Â5Â5 Â5Â5þÁ5÷Á5ðÁ5éÁ5âÁ5ÛÁ5ÔÁ5ÍÁ5ÆÁ5¿Á5¸Á5±Á5ªÁ5£Á5œÁ5•Á5ŽÁ5‡Á5€Á5yÁ5rÁ5kÁ5dÁ5]Á5VÁ5OÁ5HÁ5AÁ5:Á53Á5,Á5%Á5Á5Á5Á5 Á5Á5ûÀ5ôÀ5íÀ5æÀ5ßÀ5ØÀ5ÑÀ5ÊÀ5ÃÀ5¼À5µÀ5®À5§À5 À5™À5’À5‹À5„À5}À5vÀ5oÀ5hÀ5aÀ5ZÀ5SÀ5LÀ5EÀ5>À57À50À5)À5"À5À5À5 À5À5ÿ¿5ø¿5ñ¿5ê¿5ã¿5Ü¿5Õ¿5ο5Ç¿5À¿5¹¿5²¿5«¿5¤¿5¿5–¿5¿5ˆ¿5¿5z¿5s¿5l¿5e¿5^¿5W¿5P¿5I¿5B¿5;¿54¿5-¿5&¿5¿5¿5¿5 ¿5¿5ü¾5õ¾5î¾5ç¾5à¾5Ù¾5Ò¾5˾5ľ5½¾5¶¾5¯¾5¨¾5¡¾5š¾5“¾5Œ¾5…¾5~¾5w¾5p¾5i¾5b¾5[¾5T¾5M¾5F¾5?¾58¾51¾5*¾5#¾5¾5¾5¾5¾5¾5ù½5ò½5ë½5ä½5ݽ5Ö½5Ͻ5Ƚ5Á½5º½5³½5¬½5¥½5ž½5—½5½5‰½5‚½5{½5t½5m½5f½5_½5X½5Q½5J½5C½5<½55½5.½5'½5 ½5½5½5 ½5½5ý¼5ö¼5ï¼5è¼5á¼5Ú¼5Ó¼5̼5ż5¾¼5·¼5°¼5©¼5¢¼5›¼5”¼5¼5†¼5¼5x¼5q¼5j¼5c¼5\¼5U¼5N¼5G¼5@¼59¼52¼5+¼5$¼5¼5¼5¼5¼5¼5ú»5ó»5ì»5å»5Þ»5×»5л5É»5»5»»5´»5­»5¦»5Ÿ»5˜»5‘»5Š»5ƒ»5|»5u»5n»5g»5`»5Y»5R»5K»5D»5=»56»5/»5(»5!»5»5»5 »5»5þº5÷º5ðº5éº5âº5Ûº5Ôº5ͺ5ƺ5¿º5¸º5±º5ªº5£º5œº5•º5Žº5‡º5€º5yº5rº5kº5dº5]º5Vº5Oº5Hº5Aº5:º53º5,º5%º5º5º5º5 º5º5û¹5ô¹5í¹5æ¹5ß¹5ع5ѹ5ʹ5ù5¼¹5µ¹5®¹5§¹5 ¹5™¹5’¹5‹¹5„¹5}¹5v¹5o¹5h¹5a¹5Z¹5S¹5L¹5E¹5>¹57¹50¹5)¹5"¹5¹5¹5 ¹5¹5ÿ¸5ø¸5ñ¸5ê¸5ã¸5ܸ5Õ¸5θ5Ǹ5À¸5¹¸5²¸5«¸5¤¸5¸5–¸5¸5ˆ¸5¸5z¸5s¸5l¸5e¸5^¸5W¸5P¸5I¸5B¸5;¸54¸5-¸5&¸5¸5¸5¸5 ¸5¸5ü·5õ·5î·5ç·5à·5Ù·5Ò·5Ë·5Ä·5½·5¶·5¯·5¨·5¡·5š·5“·5Œ·5…·5~·5w·5p·5i·5b·5[·5T·5M·5F·5?·58·51·5*·5#·5·5·5·5·5·5ù¶5ò¶5ë¶5ä¶5ݶ5Ö¶5϶5ȶ5Á¶5º¶5³¶5¬¶5¥¶5ž¶5—¶5¶5‰¶5‚¶5{¶5t¶5m¶5f¶5_¶5X¶5Q¶5J¶5C¶5<¶55¶5.¶5'¶5 ¶5¶5¶5 ¶5¶5ýµ5öµ5ïµ5èµ5áµ5Úµ5Óµ5̵5ŵ5¾µ5·µ5°µ5©µ5¢µ5›µ5”µ5µ5†µ5µ5xµ5qµ5jµ5cµ5\µ5Uµ5Nµ5Gµ5@µ59µ52µ5+µ5$µ5µ5µ5µ5µ5µ5ú´5ó´5ì´5å´5Þ´5×´5д5É´5´5»´5´´5­´5¦´5Ÿ´5˜´5‘´5Š´5ƒ´5|´5u´5n´5g´5`´5Y´5R´5K´5D´5=´56´5/´5(´5!´5´5´5 ´5´5þ³5÷³5ð³5é³5â³5Û³5Ô³5ͳ5Ƴ5¿³5¸³5±³5ª³5£³5œ³5•³5޳5‡³5€³5y³5r³5k³5d³5]³5V³5O³5H³5A³5:³53³5,³5%³5³5³5³5 ³5³5û²5ô²5í²5æ²5ß²5ز5Ѳ5ʲ5ò5¼²5µ²5®²5§²5 ²5™²5’²5‹²5„²5}²5v²5o²5h²5a²5Z²5S²5L²5E²5>²57²50²5)²5"²5²5²5 ²5²5ÿ±5ø±5ñ±5ê±5ã±5ܱ5Õ±5α5DZ5À±5¹±5²±5«±5¤±5±5–±5±5ˆ±5±5z±5s±5l±5e±5^±5W±5P±5I±5B±5;±54±5-±5&±5±5±5±5 ±5±5ü°5õ°5î°5ç°5à°5Ù°5Ò°5˰5İ5½°5¶°5¯°5¨°5¡°5š°5“°5Œ°5…°5~°5w°5p°5i°5b°5[°5T°5M°5F°5?°58°51°5*°5#°5°5°5°5°5°5ù¯5ò¯5ë¯5ä¯5ݯ5Ö¯5ϯ5ȯ5Á¯5º¯5³¯5¬¯5¥¯5ž¯5—¯5¯5‰¯5‚¯5{¯5t¯5m¯5f¯5_¯5X¯5Q¯5J¯5C¯5<¯55¯5.¯5'¯5 ¯5¯5¯5 ¯5¯5ý®5ö®5ï®5è®5á®5Ú®5Ó®5Ì®5Å®5¾®5·®5°®5©®5¢®5›®5”®5®5†®5®5x®5q®5j®5c®5\®5U®5N®5G®5@®59®52®5+®5$®5®5®5®5®5®5ú­5ó­5ì­5å­5Þ­5×­5Э5É­5­5»­5´­5­­5¦­5Ÿ­5˜­5‘­5Š­5ƒ­5|­5u­5n­5g­5`­5Y­5R­5K­5D­5=­56­5/­5(­5!­5­5­5 ­5­5þ¬5÷¬5ð¬5é¬5â¬5Û¬5Ô¬5ͬ5Ƭ5¿¬5¸¬5±¬5ª¬5£¬5œ¬5•¬5ެ5‡¬5€¬5y¬5r¬5k¬5d¬5]¬5V¬5O¬5H¬5A¬5:¬53¬5,¬5%¬5¬5¬5¬5 ¬5¬5û«5ô«5í«5æ«5ß«5Ø«5Ñ«5Ê«5ë5¼«5µ«5®«5§«5 «5™«5’«5‹«5„«5}«5v«5o«5h«5a«5Z«5S«5L«5E«5>«57«50«5)«5"«5«5«5 «5«5ÿª5øª5ñª5êª5ãª5ܪ5Õª5Ϊ5Ǫ5Àª5¹ª5²ª5«ª5¤ª5ª5–ª5ª5ˆª5ª5zª5sª5lª5eª5^ª5Wª5Pª5Iª5Bª5;ª54ª5-ª5&ª5ª5ª5ª5 ª5ª5ü©5õ©5î©5ç©5à©5Ù©5Ò©5Ë©5Ä©5½©5¶©5¯©5¨©5¡©5š©5“©5Œ©5…©5~©5w©5p©5i©5b©5[©5T©5M©5F©5?©58©51©5*©5#©5©5©5©5©5©5ù¨5ò¨5ë¨5ä¨5ݨ5Ö¨5Ϩ5Ȩ5Á¨5º¨5³¨5¬¨5¥¨5ž¨5—¨5¨5‰¨5‚¨5{¨5t¨5m¨5f¨5_¨5X¨5Q¨5J¨5C¨5<¨55¨5.¨5'¨5 ¨5¨5¨5 ¨5¨5ý§5ö§5ï§5è§5á§5Ú§5Ó§5̧5ŧ5¾§5·§5°§5©§5¢§5›§5”§5§5†§5§5x§5q§5j§5c§5\§5U§5N§5G§5@§59§52§5+§5$§5§5§5§5§5§5ú¦5ó¦5ì¦5å¦5Þ¦5צ5Ц5ɦ5¦5»¦5´¦5­¦5¦¦5Ÿ¦5˜¦5‘¦5Ц5ƒ¦5|¦5u¦5n¦5g¦5`¦5Y¦5R¦5K¦5D¦5=¦56¦5/¦5(¦5!¦5¦5¦5 ¦5¦5þ¥5÷¥5ð¥5é¥5â¥5Û¥5Ô¥5Í¥5Æ¥5¿¥5¸¥5±¥5ª¥5£¥5œ¥5•¥5Ž¥5‡¥5€¥5y¥5r¥5k¥5d¥5]¥5V¥5O¥5H¥5A¥5:¥53¥5,¥5%¥5¥5¥5¥5 ¥5¥5û¤5ô¤5í¤5æ¤5ߤ5ؤ5Ѥ5ʤ5ä5¼¤5µ¤5®¤5§¤5 ¤5™¤5’¤5‹¤5„¤5}¤5v¤5o¤5h¤5a¤5Z¤5S¤5L¤5E¤5>¤57¤50¤5)¤5"¤5¤5¤5 ¤5¤5ÿ£5ø£5ñ£5ê£5ã£5Ü£5Õ£5Σ5Ç£5À£5¹£5²£5«£5¤£5£5–£5£5ˆ£5£5z£5s£5l£5e£5^£5W£5P£5I£5B£5;£54£5-£5&£5£5£5£5 £5£5ü¢5õ¢5î¢5ç¢5à¢5Ù¢5Ò¢5Ë¢5Ä¢5½¢5¶¢5¯¢5¨¢5¡¢5š¢5“¢5Œ¢5…¢5~¢5w¢5p¢5i¢5b¢5[¢5T¢5M¢5F¢5?¢58¢51¢5*¢5#¢5¢5¢5¢5¢5¢5ù¡5ò¡5ë¡5ä¡5Ý¡5Ö¡5Ï¡5È¡5Á¡5º¡5³¡5¬¡5¥¡5ž¡5—¡5¡5‰¡5‚¡5{¡5t¡5m¡5f¡5_¡5X¡5Q¡5J¡5C¡5<¡55¡5.¡5'¡5 ¡5¡5¡5 ¡5¡5ý 5ö 5ï 5è 5á 5Ú 5Ó 5Ì 5Å 5¾ 5· 5° 5© 5¢ 5› 5” 5 5† 5 5x 5q 5j 5c 5\ 5U 5N 5G 5@ 59 52 5+ 5$ 5 5 5 5 5 5úŸ5óŸ5ìŸ5åŸ5ÞŸ5ן5П5ÉŸ5Ÿ5»Ÿ5´Ÿ5­Ÿ5¦Ÿ5ŸŸ5˜Ÿ5‘Ÿ5ŠŸ5ƒŸ5|Ÿ5uŸ5nŸ5gŸ5`Ÿ5YŸ5RŸ5KŸ5DŸ5=Ÿ56Ÿ5/Ÿ5(Ÿ5!Ÿ5Ÿ5Ÿ5 Ÿ5Ÿ5þž5÷ž5ðž5éž5âž5Ûž5Ôž5Íž5Æž5¿ž5¸ž5±ž5ªž5£ž5œž5•ž5Žž5‡ž5€ž5yž5rž5kž5dž5]ž5Vž5Ož5Hž5Až5:ž53ž5,ž5%ž5ž5ž5ž5 ž5ž5û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿœ5øœ5ñœ5êœ5ãœ5Üœ5Õœ5Μ5Çœ5Àœ5¹œ5²œ5«œ5¤œ5œ5–œ5œ5ˆœ5œ5zœ5sœ5lœ5eœ5^œ5Wœ5Pœ5Iœ5Bœ5;œ54œ5-œ5&œ5œ5œ5œ5 œ5œ5ü›5õ›5î›5ç›5à›5Ù›5Ò›5Ë›5Ä›5½›5¶›5¯›5¨›5¡›5š›5“›5Œ›5…›5~›5w›5p›5i›5b›5[›5T›5M›5F›5?›58›51›5*›5#›5›5›5›5›5›5ùš5òš5ëš5äš5Ýš5Öš5Ïš5Èš5Áš5ºš5³š5¬š5¥š5žš5—š5š5‰š5‚š5{š5tš5mš5fš5_š5Xš5Qš5Jš5Cš5<š55š5.š5'š5 š5š5š5 š5š5ý™5ö™5ï™5è™5á™5Ú™5Ó™5Ì™5Å™5¾™5·™5°™5©™5¢™5›™5”™5™5†™5™5x™5q™5j™5c™5\™5U™5N™5G™5@™59™52™5+™5$™5™5™5™5™5™5ú˜5ó˜5ì˜5å˜5Þ˜5ט5И5ɘ5˜5»˜5´˜5­˜5¦˜5Ÿ˜5˜˜5‘˜5Š˜5ƒ˜5|˜5u˜5n˜5g˜5`˜5Y˜5R˜5K˜5D˜5=˜56˜5/˜5(˜5!˜5˜5˜5 ˜5˜5þ—5÷—5ð—5é—5â—5Û—5Ô—5Í—5Æ—5¿—5¸—5±—5ª—5£—5œ—5•—5Ž—5‡—5€—5y—5r—5k—5d—5]—5V—5O—5H—5A—5:—53—5,—5%—5—5—5—5 —5—5û–5ô–5í–5æ–5ß–5Ø–5Ñ–5Ê–5Ö5¼–5µ–5®–5§–5 –5™–5’–5‹–5„–5}–5v–5o–5h–5a–5Z–5S–5L–5E–5>–57–50–5)–5"–5–5–5 –5–5ÿ•5ø•5ñ•5ê•5ã•5Ü•5Õ•5Ε5Ç•5À•5¹•5²•5«•5¤•5•5–•5•5ˆ•5•5z•5s•5l•5e•5^•5W•5P•5I•5B•5;•54•5-•5&•5•5•5•5 •5•5ü”5õ”5î”5ç”5à”5Ù”5Ò”5Ë”5Ä”5½”5¶”5¯”5¨”5¡”5š”5“”5Œ”5…”5~”5w”5p”5i”5b”5[”5T”5M”5F”5?”58”51”5*”5#”5”5”5”5”5”5ù“5ò“5ë“5ä“5Ý“5Ö“5Ï“5È“5Á“5º“5³“5¬“5¥“5ž“5—“5“5‰“5‚“5{“5t“5m“5f“5_“5X“5Q“5J“5C“5<“55“5.“5'“5 “5“5“5 “5“5ý’5ö’5ï’5è’5á’5Ú’5Ó’5Ì’5Å’5¾’5·’5°’5©’5¢’5›’5”’5’5†’5’5x’5q’5j’5c’5\’5U’5N’5G’5@’59’52’5+’5$’5’5’5’5’5’5ú‘5ó‘5ì‘5å‘5Þ‘5ב5Б5É‘5‘5»‘5´‘5­‘5¦‘5Ÿ‘5˜‘5‘‘5Š‘5ƒ‘5|‘5u‘5n‘5g‘5`‘5Y‘5R‘5K‘5D‘5=‘56‘5/‘5(‘5!‘5‘5‘5 ‘5‘5þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿŽ5øŽ5ñŽ5êŽ5ãŽ5ÜŽ5ÕŽ5ÎŽ5ÇŽ5ÀŽ5¹Ž5²Ž5«Ž5¤Ž5Ž5–Ž5Ž5ˆŽ5Ž5zŽ5sŽ5lŽ5eŽ5^Ž5WŽ5PŽ5IŽ5BŽ5;Ž54Ž5-Ž5&Ž5Ž5Ž5Ž5 Ž5Ž5ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ùŒ5òŒ5ëŒ5äŒ5ÝŒ5ÖŒ5ÏŒ5ÈŒ5ÁŒ5ºŒ5³Œ5¬Œ5¥Œ5žŒ5—Œ5Œ5‰Œ5‚Œ5{Œ5tŒ5mŒ5fŒ5_Œ5XŒ5QŒ5JŒ5CŒ5<Œ55Œ5.Œ5'Œ5 Œ5Œ5Œ5 Œ5Œ5ý‹5ö‹5ï‹5è‹5á‹5Ú‹5Ó‹5Ì‹5Å‹5¾‹5·‹5°‹5©‹5¢‹5›‹5”‹5‹5†‹5‹5x‹5q‹5j‹5c‹5\‹5U‹5N‹5G‹5@‹59‹52‹5+‹5$‹5‹5‹5‹5‹5‹5úŠ5óŠ5ìŠ5åŠ5ÞŠ5׊5Њ5ÉŠ5Š5»Š5´Š5­Š5¦Š5ŸŠ5˜Š5‘Š5ŠŠ5ƒŠ5|Š5uŠ5nŠ5gŠ5`Š5YŠ5RŠ5KŠ5DŠ5=Š56Š5/Š5(Š5!Š5Š5Š5 Š5Š5þ‰5÷‰5ð‰5é‰5â‰5Û‰5Ô‰5͉5Ɖ5¿‰5¸‰5±‰5ª‰5£‰5œ‰5•‰5މ5‡‰5€‰5y‰5r‰5k‰5d‰5]‰5V‰5O‰5H‰5A‰5:‰53‰5,‰5%‰5‰5‰5‰5 ‰5‰5ûˆ5ôˆ5íˆ5æˆ5߈5؈5ш5ʈ5È5¼ˆ5µˆ5®ˆ5§ˆ5 ˆ5™ˆ5’ˆ5‹ˆ5„ˆ5}ˆ5vˆ5oˆ5hˆ5aˆ5Zˆ5Sˆ5Lˆ5Eˆ5>ˆ57ˆ50ˆ5)ˆ5"ˆ5ˆ5ˆ5 ˆ5ˆ5ÿ‡5ø‡5ñ‡5ê‡5ã‡5܇5Õ‡5·5LJ5À‡5¹‡5²‡5«‡5¤‡5‡5–‡5‡5ˆ‡5‡5z‡5s‡5l‡5e‡5^‡5W‡5P‡5I‡5B‡5;‡54‡5-‡5&‡5‡5‡5‡5 ‡5‡5ü†5õ†5î†5ç†5à†5Ù†5Ò†5ˆ5Ć5½†5¶†5¯†5¨†5¡†5š†5“†5Œ†5…†5~†5w†5p†5i†5b†5[†5T†5M†5F†5?†58†51†5*†5#†5†5†5†5†5†5ù…5ò…5ë…5ä…5Ý…5Ö…5Ï…5È…5Á…5º…5³…5¬…5¥…5ž…5—…5…5‰…5‚…5{…5t…5m…5f…5_…5X…5Q…5J…5C…5<…55…5.…5'…5 …5…5…5 …5…5ý„5ö„5ï„5è„5á„5Ú„5Ó„5Ì„5Å„5¾„5·„5°„5©„5¢„5›„5”„5„5†„5„5x„5q„5j„5c„5\„5U„5N„5G„5@„59„52„5+„5$„5„5„5„5„5„5úƒ5óƒ5ìƒ5åƒ5Þƒ5׃5Ѓ5Ƀ5ƒ5»ƒ5´ƒ5­ƒ5¦ƒ5Ÿƒ5˜ƒ5‘ƒ5Šƒ5ƒƒ5|ƒ5uƒ5nƒ5gƒ5`ƒ5Yƒ5Rƒ5Kƒ5Dƒ5=ƒ56ƒ5/ƒ5(ƒ5!ƒ5ƒ5ƒ5 ƒ5ƒ5þ‚5÷‚5ð‚5é‚5â‚5Û‚5Ô‚5Í‚5Æ‚5¿‚5¸‚5±‚5ª‚5£‚5œ‚5•‚5Ž‚5‡‚5€‚5y‚5r‚5k‚5d‚5]‚5V‚5O‚5H‚5A‚5:‚53‚5,‚5%‚5‚5‚5‚5 ‚5‚5û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ€5ø€5ñ€5ê€5ã€5Ü€5Õ€5΀5Ç€5À€5¹€5²€5«€5¤€5€5–€5€5ˆ€5€5z€5s€5l€5e€5^€5W€5P€5I€5B€5;€54€5-€5&€5€5€5€5 €5€5ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù~5ò~5ë~5ä~5Ý~5Ö~5Ï~5È~5Á~5º~5³~5¬~5¥~5ž~5—~5~5‰~5‚~5{~5t~5m~5f~5_~5X~5Q~5J~5C~5<~55~5.~5'~5 ~5~5~5 ~5~5ý}5ö}5ï}5è}5á}5Ú}5Ó}5Ì}5Å}5¾}5·}5°}5©}5¢}5›}5”}5}5†}5}5x}5q}5j}5c}5\}5U}5N}5G}5@}59}52}5+}5$}5}5}5}5}5}5ú|5ó|5ì|5å|5Þ|5×|5Ð|5É|5Â|5»|5´|5­|5¦|5Ÿ|5˜|5‘|5Š|5ƒ|5||5u|5n|5g|5`|5Y|5R|5K|5D|5=|56|5/|5(|5!|5|5|5 |5|5þ{5÷{5ð{5é{5â{5Û{5Ô{5Í{5Æ{5¿{5¸{5±{5ª{5£{5œ{5•{5Ž{5‡{5€{5y{5r{5k{5d{5]{5V{5O{5H{5A{5:{53{5,{5%{5{5{5{5 {5{5ûz5ôz5íz5æz5ßz5Øz5Ñz5Êz5Ãz5¼z5µz5®z5§z5 z5™z5’z5‹z5„z5}z5vz5oz5hz5az5Zz5Sz5Lz5Ez5>z57z50z5)z5"z5z5z5 z5z5ÿy5øy5ñy5êy5ãy5Üy5Õy5Îy5Çy5Ày5¹y5²y5«y5¤y5y5–y5y5ˆy5y5zy5sy5ly5ey5^y5Wy5Py5Iy5By5;y54y5-y5&y5y5y5y5 y5y5üx5õx5îx5çx5àx5Ùx5Òx5Ëx5Äx5½x5¶x5¯x5¨x5¡x5šx5“x5Œx5…x5~x5wx5px5ix5bx5[x5Tx5Mx5Fx5?x58x51x5*x5#x5x5x5x5x5x5ùw5òw5ëw5äw5Ýw5Öw5Ïw5Èw5Áw5ºw5³w5¬w5¥w5žw5—w5w5‰w5‚w5{w5tw5mw5fw5_w5Xw5Qw5Jw5Cw5s57s50s5)s5"s5s5s5 s5s5ÿr5ør5ñr5êr5ãr5Ür5Õr5Îr5Çr5Àr5¹r5²r5«r5¤r5r5–r5r5ˆr5r5zr5sr5lr5er5^r5Wr5Pr5Ir5Br5;r54r5-r5&r5r5r5r5 r5r5üq5õq5îq5çq5àq5Ùq5Òq5Ëq5Äq5½q5¶q5¯q5¨q5¡q5šq5“q5Œq5…q5~q5wq5pq5iq5bq5[q5Tq5Mq5Fq5?q58q51q5*q5#q5q5q5q5q5q5ùp5òp5ëp5äp5Ýp5Öp5Ïp5Èp5Áp5ºp5³p5¬p5¥p5žp5—p5p5‰p5‚p5{p5tp5mp5fp5_p5Xp5Qp5Jp5Cp5l57l50l5)l5"l5l5l5 l5l5ÿk5øk5ñk5êk5ãk5Ük5Õk5Îk5Çk5Àk5¹k5²k5«k5¤k5k5–k5k5ˆk5k5zk5sk5lk5ek5^k5Wk5Pk5Ik5Bk5;k54k5-k5&k5k5k5k5 k5k5üj5õj5îj5çj5àj5Ùj5Òj5Ëj5Äj5½j5¶j5¯j5¨j5¡j5šj5“j5Œj5…j5~j5wj5pj5ij5bj5[j5Tj5Mj5Fj5?j58j51j5*j5#j5j5j5j5j5j5ùi5òi5ëi5äi5Ýi5Öi5Ïi5Èi5Ái5ºi5³i5¬i5¥i5ži5—i5i5‰i5‚i5{i5ti5mi5fi5_i5Xi5Qi5Ji5Ci5e57e50e5)e5"e5e5e5 e5e5ÿd5ød5ñd5êd5ãd5Üd5Õd5Îd5Çd5Àd5¹d5²d5«d5¤d5d5–d5d5ˆd5d5zd5sd5ld5ed5^d5Wd5Pd5Id5Bd5;d54d5-d5&d5d5d5d5 d5d5üc5õc5îc5çc5àc5Ùc5Òc5Ëc5Äc5½c5¶c5¯c5¨c5¡c5šc5“c5Œc5…c5~c5wc5pc5ic5bc5[c5Tc5Mc5Fc5?c58c51c5*c5#c5c5c5c5c5c5ùb5òb5ëb5äb5Ýb5Öb5Ïb5Èb5Áb5ºb5³b5¬b5¥b5žb5—b5b5‰b5‚b5{b5tb5mb5fb5_b5Xb5Qb5Jb5Cb5^57^50^5)^5"^5^5^5 ^5^5ÿ]5ø]5ñ]5ê]5ã]5Ü]5Õ]5Î]5Ç]5À]5¹]5²]5«]5¤]5]5–]5]5ˆ]5]5z]5s]5l]5e]5^]5W]5P]5I]5B]5;]54]5-]5&]5]5]5]5 ]5]5ü\5õ\5î\5ç\5à\5Ù\5Ò\5Ë\5Ä\5½\5¶\5¯\5¨\5¡\5š\5“\5Œ\5…\5~\5w\5p\5i\5b\5[\5T\5M\5F\5?\58\51\5*\5#\5\5\5\5\5\5ù[5ò[5ë[5ä[5Ý[5Ö[5Ï[5È[5Á[5º[5³[5¬[5¥[5ž[5—[5[5‰[5‚[5{[5t[5m[5f[5_[5X[5Q[5J[5C[5<[55[5.[5'[5 [5[5[5 [5[5ýZ5öZ5ïZ5èZ5áZ5ÚZ5ÓZ5ÌZ5ÅZ5¾Z5·Z5°Z5©Z5¢Z5›Z5”Z5Z5†Z5Z5xZ5qZ5jZ5cZ5\Z5UZ5NZ5GZ5@Z59Z52Z5+Z5$Z5Z5Z5Z5Z5Z5úY5óY5ìY5åY5ÞY5×Y5ÐY5ÉY5ÂY5»Y5´Y5­Y5¦Y5ŸY5˜Y5‘Y5ŠY5ƒY5|Y5uY5nY5gY5`Y5YY5RY5KY5DY5=Y56Y5/Y5(Y5!Y5Y5Y5 Y5Y5þX5÷X5ðX5éX5âX5ÛX5ÔX5ÍX5ÆX5¿X5¸X5±X5ªX5£X5œX5•X5ŽX5‡X5€X5yX5rX5kX5dX5]X5VX5OX5HX5AX5:X53X5,X5%X5X5X5X5 X5X5ûW5ôW5íW5æW5ßW5ØW5ÑW5ÊW5ÃW5¼W5µW5®W5§W5 W5™W5’W5‹W5„W5}W5vW5oW5hW5aW5ZW5SW5LW5EW5>W57W50W5)W5"W5W5W5 W5W5ÿV5øV5ñV5êV5ãV5ÜV5ÕV5ÎV5ÇV5ÀV5¹V5²V5«V5¤V5V5–V5V5ˆV5V5zV5sV5lV5eV5^V5WV5PV5IV5BV5;V54V5-V5&V5V5V5V5 V5V5üU5õU5îU5çU5àU5ÙU5ÒU5ËU5ÄU5½U5¶U5¯U5¨U5¡U5šU5“U5ŒU5…U5~U5wU5pU5iU5bU5[U5TU5MU5FU5?U58U51U5*U5#U5U5U5U5U5U5ùT5òT5ëT5äT5ÝT5ÖT5ÏT5ÈT5ÁT5ºT5³T5¬T5¥T5žT5—T5T5‰T5‚T5{T5tT5mT5fT5_T5XT5QT5JT5CT5P57P50P5)P5"P5P5P5 P5P5ÿO5øO5ñO5êO5ãO5ÜO5ÕO5ÎO5ÇO5ÀO5¹O5²O5«O5¤O5O5–O5O5ˆO5O5zO5sO5lO5eO5^O5WO5PO5IO5BO5;O54O5-O5&O5O5O5O5 O5O5üN5õN5îN5çN5àN5ÙN5ÒN5ËN5ÄN5½N5¶N5¯N5¨N5¡N5šN5“N5ŒN5…N5~N5wN5pN5iN5bN5[N5TN5MN5FN5?N58N51N5*N5#N5N5N5N5N5N5ùM5òM5ëM5äM5ÝM5ÖM5ÏM5ÈM5ÁM5ºM5³M5¬M5¥M5žM5—M5M5‰M5‚M5{M5tM5mM5fM5_M5XM5QM5JM5CM5I57I50I5)I5"I5I5I5 I5I5ÿH5øH5ñH5êH5ãH5ÜH5ÕH5ÎH5ÇH5ÀH5¹H5²H5«H5¤H5H5–H5H5ˆH5H5zH5sH5lH5eH5^H5WH5PH5IH5BH5;H54H5-H5&H5H5H5H5 H5H5üG5õG5îG5çG5àG5ÙG5ÒG5ËG5ÄG5½G5¶G5¯G5¨G5¡G5šG5“G5ŒG5…G5~G5wG5pG5iG5bG5[G5TG5MG5FG5?G58G51G5*G5#G5G5G5G5G5G5ùF5òF5ëF5äF5ÝF5ÖF5ÏF5ÈF5ÁF5ºF5³F5¬F5¥F5žF5—F5F5‰F5‚F5{F5tF5mF5fF5_F5XF5QF5JF5CF5B57B50B5)B5"B5B5B5 B5B5ÿA5øA5ñA5êA5ãA5ÜA5ÕA5ÎA5ÇA5ÀA5¹A5²A5«A5¤A5A5–A5A5ˆA5A5zA5sA5lA5eA5^A5WA5PA5IA5BA5;A54A5-A5&A5A5A5A5 A5A5ü@5õ@5î@5ç@5à@5Ù@5Ò@5Ë@5Ä@5½@5¶@5¯@5¨@5¡@5š@5“@5Œ@5…@5~@5w@5p@5i@5b@5[@5T@5M@5F@5?@58@51@5*@5#@5@5@5@5@5@5ù?5ò?5ë?5ä?5Ý?5Ö?5Ï?5È?5Á?5º?5³?5¬?5¥?5ž?5—?5?5‰?5‚?5{?5t?5m?5f?5_?5X?5Q?5J?5C?55ö>5ï>5è>5á>5Ú>5Ó>5Ì>5Å>5¾>5·>5°>5©>5¢>5›>5”>5>5†>5>5x>5q>5j>5c>5\>5U>5N>5G>5@>59>52>5+>5$>5>5>5>5>5>5ú=5ó=5ì=5å=5Þ=5×=5Ð=5É=5Â=5»=5´=5­=5¦=5Ÿ=5˜=5‘=5Š=5ƒ=5|=5u=5n=5g=5`=5Y=5R=5K=5D=5==56=5/=5(=5!=5=5=5 =5=5þ<5÷<5ð<5é<5â<5Û<5Ô<5Í<5Æ<5¿<5¸<5±<5ª<5£<5œ<5•<5Ž<5‡<5€<5y<5r<5k<5d<5]<5V<5O<5H<5A<5:<53<5,<5%<5<5<5<5 <5<5û;5ô;5í;5æ;5ß;5Ø;5Ñ;5Ê;5Ã;5¼;5µ;5®;5§;5 ;5™;5’;5‹;5„;5};5v;5o;5h;5a;5Z;5S;5L;5E;5>;57;50;5);5";5;5;5 ;5;5ÿ:5ø:5ñ:5ê:5ã:5Ü:5Õ:5Î:5Ç:5À:5¹:5²:5«:5¤:5:5–:5:5ˆ:5:5z:5s:5l:5e:5^:5W:5P:5I:5B:5;:54:5-:5&:5:5:5:5 :5:5ü95õ95î95ç95à95Ù95Ò95Ë95Ä95½95¶95¯95¨95¡95š95“95Œ95…95~95w95p95i95b95[95T95M95F95?95895195*95#959595959595ù85ò85ë85ä85Ý85Ö85Ï85È85Á85º85³85¬85¥85ž85—8585‰85‚85{85t85m85f85_85X85Q85J85C85<85585.85'85 858585 8585ý75ö75ï75è75á75Ú75Ó75Ì75Å75¾75·75°75©75¢75›75”7575†7575x75q75j75c75\75U75N75G75@75975275+75$757575757575ú65ó65ì65å65Þ65×65Ð65É65Â65»65´65­65¦65Ÿ65˜65‘65Š65ƒ65|65u65n65g65`65Y65R65K65D65=65665/65(65!656565 6565þ55÷55ð55é55â55Û55Ô55Í55Æ55¿55¸55±55ª55£55œ55•55Ž55‡55€55y55r55k55d55]55V55O55H55A55:55355,55%55555555 5555û45ô45í45æ45ß45Ø45Ñ45Ê45Ã45¼45µ45®45§45 45™45’45‹45„45}45v45o45h45a45Z45S45L45E45>45745045)45"454545 4545ÿ35ø35ñ35ê35ã35Ü35Õ35Î35Ç35À35¹35²35«35¤3535–3535ˆ3535z35s35l35e35^35W35P35I35B35;35435-35&35353535 3535ü25õ25î25ç25à25Ù25Ò25Ë25Ä25½25¶25¯25¨25¡25š25“25Œ25…25~25w25p25i25b25[25T25M25F25?25825125*25#252525252525ù15ò15ë15ä15Ý15Ö15Ï15È15Á15º15³15¬15¥15ž15—1515‰15‚15{15t15m15f15_15X15Q15J15C15<15515.15'15 151515 1515ý05ö05ï05è05á05Ú05Ó05Ì05Å05¾05·05°05©05¢05›05”0505†0505x05q05j05c05\05U05N05G05@05905205+05$050505050505ú/5ó/5ì/5å/5Þ/5×/5Ð/5É/5Â/5»/5´/5­/5¦/5Ÿ/5˜/5‘/5Š/5ƒ/5|/5u/5n/5g/5`/5Y/5R/5K/5D/5=/56/5//5(/5!/5/5/5 /5/5þ.5÷.5ð.5é.5â.5Û.5Ô.5Í.5Æ.5¿.5¸.5±.5ª.5£.5œ.5•.5Ž.5‡.5€.5y.5r.5k.5d.5].5V.5O.5H.5A.5:.53.5,.5%.5.5.5.5 .5.5û-5ô-5í-5æ-5ß-5Ø-5Ñ-5Ê-5Ã-5¼-5µ-5®-5§-5 -5™-5’-5‹-5„-5}-5v-5o-5h-5a-5Z-5S-5L-5E-5>-57-50-5)-5"-5-5-5 -5-5ÿ,5ø,5ñ,5ê,5ã,5Ü,5Õ,5Î,5Ç,5À,5¹,5²,5«,5¤,5,5–,5,5ˆ,5,5z,5s,5l,5e,5^,5W,5P,5I,5B,5;,54,5-,5&,5,5,5,5 ,5,5ü+5õ+5î+5ç+5à+5Ù+5Ò+5Ë+5Ä+5½+5¶+5¯+5¨+5¡+5š+5“+5Œ+5…+5~+5w+5p+5i+5b+5[+5T+5M+5F+5?+58+51+5*+5#+5+5+5+5+5+5ù*5ò*5ë*5ä*5Ý*5Ö*5Ï*5È*5Á*5º*5³*5¬*5¥*5ž*5—*5*5‰*5‚*5{*5t*5m*5f*5_*5X*5Q*5J*5C*5<*55*5.*5'*5 *5*5*5 *5*5ý)5ö)5ï)5è)5á)5Ú)5Ó)5Ì)5Å)5¾)5·)5°)5©)5¢)5›)5”)5)5†)5)5x)5q)5j)5c)5\)5U)5N)5G)5@)59)52)5+)5$)5)5)5)5)5)5ú(5ó(5ì(5å(5Þ(5×(5Ð(5É(5Â(5»(5´(5­(5¦(5Ÿ(5˜(5‘(5Š(5ƒ(5|(5u(5n(5g(5`(5Y(5R(5K(5D(5=(56(5/(5((5!(5(5(5 (5(5þ'5÷'5ð'5é'5â'5Û'5Ô'5Í'5Æ'5¿'5¸'5±'5ª'5£'5œ'5•'5Ž'5‡'5€'5y'5r'5k'5d'5]'5V'5O'5H'5A'5:'53'5,'5%'5'5'5'5 '5'5û&5ô&5í&5æ&5ß&5Ø&5Ñ&5Ê&5Ã&5¼&5µ&5®&5§&5 &5™&5’&5‹&5„&5}&5v&5o&5h&5a&5Z&5S&5L&5E&5>&57&50&5)&5"&5&5&5 &5&5ÿ%5ø%5ñ%5ê%5ã%5Ü%5Õ%5Î%5Ç%5À%5¹%5²%5«%5¤%5%5–%5%5ˆ%5%5z%5s%5l%5e%5^%5W%5P%5I%5B%5;%54%5-%5&%5%5%5%5 %5%5ü$5õ$5î$5ç$5à$5Ù$5Ò$5Ë$5Ä$5½$5¶$5¯$5¨$5¡$5š$5“$5Œ$5…$5~$5w$5p$5i$5b$5[$5T$5M$5F$5?$58$51$5*$5#$5$5$5$5$5$5ù#5ò#5ë#5ä#5Ý#5Ö#5Ï#5È#5Á#5º#5³#5¬#5¥#5ž#5—#5#5‰#5‚#5{#5t#5m#5f#5_#5X#5Q#5J#5C#5<#55#5.#5'#5 #5#5#5 #5#5ý"5ö"5ï"5è"5á"5Ú"5Ó"5Ì"5Å"5¾"5·"5°"5©"5¢"5›"5”"5"5†"5"5x"5q"5j"5c"5\"5U"5N"5G"5@"59"52"5+"5$"5"5"5"5"5"5ú!5ó!5ì!5å!5Þ!5×!5Ð!5É!5Â!5»!5´!5­!5¦!5Ÿ!5˜!5‘!5Š!5ƒ!5|!5u!5n!5g!5`!5Y!5R!5K!5D!5=!56!5/!5(!5!!5!5!5 !5!5þ 5÷ 5ð 5é 5â 5Û 5Ô 5Í 5Æ 5¿ 5¸ 5± 5ª 5£ 5œ 5• 5Ž 5‡ 5€ 5y 5r 5k 5d 5] 5V 5O 5H 5A 5: 53 5, 5% 5 5 5 5 5 5û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý 5ö 5ï 5è 5á 5Ú 5Ó 5Ì 5Å 5¾ 5· 5° 5© 5¢ 5› 5” 5 5† 5 5x 5q 5j 5c 5\ 5U 5N 5G 5@ 59 52 5+ 5$ 5 5 5 5 5 5ú 5ó 5ì 5å 5Þ 5× 5Ð 5É 5 5» 5´ 5­ 5¦ 5Ÿ 5˜ 5‘ 5Š 5ƒ 5| 5u 5n 5g 5` 5Y 5R 5K 5D 5= 56 5/ 5( 5! 5 5 5 5 5þ 5÷ 5ð 5é 5â 5Û 5Ô 5Í 5Æ 5¿ 5¸ 5± 5ª 5£ 5œ 5• 5Ž 5‡ 5€ 5y 5r 5k 5d 5] 5V 5O 5H 5A 5: 53 5, 5% 5 5 5 5 5 5û 5ô 5í 5æ 5ß 5Ø 5Ñ 5Ê 5à 5¼ 5µ 5® 5§ 5  5™ 5’ 5‹ 5„ 5} 5v 5o 5h 5a 5Z 5S 5L 5E 5> 57 50 5) 5" 5 5 5 5 5ÿ 5ø 5ñ 5ê 5ã 5Ü 5Õ 5Î 5Ç 5À 5¹ 5² 5« 5¤ 5 5– 5 5ˆ 5 5z 5s 5l 5e 5^ 5W 5P 5I 5B 5; 54 5- 5& 5 5 5 5 5 5ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ýÿ4öÿ4ïÿ4èÿ4áÿ4Úÿ4Óÿ4Ìÿ4Åÿ4¾ÿ4·ÿ4°ÿ4©ÿ4¢ÿ4›ÿ4”ÿ4ÿ4†ÿ4ÿ4xÿ4qÿ4jÿ4cÿ4\ÿ4Uÿ4Nÿ4Gÿ4@ÿ49ÿ42ÿ4+ÿ4$ÿ4ÿ4ÿ4ÿ4ÿ4ÿ4úþ4óþ4ìþ4åþ4Þþ4×þ4Ðþ4Éþ4Âþ4»þ4´þ4­þ4¦þ4Ÿþ4˜þ4‘þ4Šþ4ƒþ4|þ4uþ4nþ4gþ4`þ4Yþ4Rþ4Kþ4Dþ4=þ46þ4/þ4(þ4!þ4þ4þ4 þ4þ4þý4÷ý4ðý4éý4âý4Ûý4Ôý4Íý4Æý4¿ý4¸ý4±ý4ªý4£ý4œý4•ý4Žý4‡ý4€ý4yý4rý4ký4dý4]ý4Vý4Oý4Hý4Aý4:ý43ý4,ý4%ý4ý4ý4ý4 ý4ý4ûü4ôü4íü4æü4ßü4Øü4Ñü4Êü4Ãü4¼ü4µü4®ü4§ü4 ü4™ü4’ü4‹ü4„ü4}ü4vü4oü4hü4aü4Zü4Sü4Lü4Eü4>ü47ü40ü4)ü4"ü4ü4ü4 ü4ü4ÿû4øû4ñû4êû4ãû4Üû4Õû4Îû4Çû4Àû4¹û4²û4«û4¤û4û4–û4û4ˆû4û4zû4sû4lû4eû4^û4Wû4Pû4Iû4Bû4;û44û4-û4&û4û4û4û4 û4û4üú4õú4îú4çú4àú4Ùú4Òú4Ëú4Äú4½ú4¶ú4¯ú4¨ú4¡ú4šú4“ú4Œú4…ú4~ú4wú4pú4iú4bú4[ú4Tú4Mú4Fú4?ú48ú41ú4*ú4#ú4ú4ú4ú4ú4ú4ùù4òù4ëù4äù4Ýù4Öù4Ïù4Èù4Áù4ºù4³ù4¬ù4¥ù4žù4—ù4ù4‰ù4‚ù4{ù4tù4mù4fù4_ù4Xù4Qù4Jù4Cù4<ù45ù4.ù4'ù4 ù4ù4ù4 ù4ù4ýø4öø4ïø4èø4áø4Úø4Óø4Ìø4Åø4¾ø4·ø4°ø4©ø4¢ø4›ø4”ø4ø4†ø4ø4xø4qø4jø4cø4\ø4Uø4Nø4Gø4@ø49ø42ø4+ø4$ø4ø4ø4ø4ø4ø4ú÷4ó÷4ì÷4å÷4Þ÷4×÷4Ð÷4É÷4Â÷4»÷4´÷4­÷4¦÷4Ÿ÷4˜÷4‘÷4Š÷4ƒ÷4|÷4u÷4n÷4g÷4`÷4Y÷4R÷4K÷4D÷4=÷46÷4/÷4(÷4!÷4÷4÷4 ÷4÷4þö4÷ö4ðö4éö4âö4Ûö4Ôö4Íö4Æö4¿ö4¸ö4±ö4ªö4£ö4œö4•ö4Žö4‡ö4€ö4yö4rö4kö4dö4]ö4Vö4Oö4Hö4Aö4:ö43ö4,ö4%ö4ö4ö4ö4 ö4ö4ûõ4ôõ4íõ4æõ4ßõ4Øõ4Ñõ4Êõ4Ãõ4¼õ4µõ4®õ4§õ4 õ4™õ4’õ4‹õ4„õ4}õ4võ4oõ4hõ4aõ4Zõ4Sõ4Lõ4Eõ4>õ47õ40õ4)õ4"õ4õ4õ4 õ4õ4ÿô4øô4ñô4êô4ãô4Üô4Õô4Îô4Çô4Àô4¹ô4²ô4«ô4¤ô4ô4–ô4ô4ˆô4ô4zô4sô4lô4eô4^ô4Wô4Pô4Iô4Bô4;ô44ô4-ô4&ô4ô4ô4ô4 ô4ô4üó4õó4îó4çó4àó4Ùó4Òó4Ëó4Äó4½ó4¶ó4¯ó4¨ó4¡ó4šó4“ó4Œó4…ó4~ó4wó4pó4ió4bó4[ó4Tó4Mó4Fó4?ó48ó41ó4*ó4#ó4ó4ó4ó4ó4ó4ùò4òò4ëò4äò4Ýò4Öò4Ïò4Èò4Áò4ºò4³ò4¬ò4¥ò4žò4—ò4ò4‰ò4‚ò4{ò4tò4mò4fò4_ò4Xò4Qò4Jò4Cò4<ò45ò4.ò4'ò4 ò4ò4ò4 ò4ò4ýñ4öñ4ïñ4èñ4áñ4Úñ4Óñ4Ìñ4Åñ4¾ñ4·ñ4°ñ4©ñ4¢ñ4›ñ4”ñ4ñ4†ñ4ñ4xñ4qñ4jñ4cñ4\ñ4Uñ4Nñ4Gñ4@ñ49ñ42ñ4+ñ4$ñ4ñ4ñ4ñ4ñ4ñ4úð4óð4ìð4åð4Þð4×ð4Ðð4Éð4Âð4»ð4´ð4­ð4¦ð4Ÿð4˜ð4‘ð4Šð4ƒð4|ð4uð4nð4gð4`ð4Yð4Rð4Kð4Dð4=ð46ð4/ð4(ð4!ð4ð4ð4 ð4ð4þï4÷ï4ðï4éï4âï4Ûï4Ôï4Íï4Æï4¿ï4¸ï4±ï4ªï4£ï4œï4•ï4Žï4‡ï4€ï4yï4rï4kï4dï4]ï4Vï4Oï4Hï4Aï4:ï43ï4,ï4%ï4ï4ï4ï4 ï4ï4ûî4ôî4íî4æî4ßî4Øî4Ñî4Êî4Ãî4¼î4µî4®î4§î4 î4™î4’î4‹î4„î4}î4vî4oî4hî4aî4Zî4Sî4Lî4Eî4>î47î40î4)î4"î4î4î4 î4î4ÿí4øí4ñí4êí4ãí4Üí4Õí4Îí4Çí4Àí4¹í4²í4«í4¤í4í4–í4í4ˆí4í4zí4sí4lí4eí4^í4Wí4Pí4Ií4Bí4;í44í4-í4&í4í4í4í4 í4í4üì4õì4îì4çì4àì4Ùì4Òì4Ëì4Äì4½ì4¶ì4¯ì4¨ì4¡ì4šì4“ì4Œì4…ì4~ì4wì4pì4iì4bì4[ì4Tì4Mì4Fì4?ì48ì41ì4*ì4#ì4ì4ì4ì4ì4ì4ùë4òë4ëë4äë4Ýë4Öë4Ïë4Èë4Áë4ºë4³ë4¬ë4¥ë4žë4—ë4ë4‰ë4‚ë4{ë4të4më4fë4_ë4Xë4Që4Jë4Cë4<ë45ë4.ë4'ë4 ë4ë4ë4 ë4ë4ýê4öê4ïê4èê4áê4Úê4Óê4Ìê4Åê4¾ê4·ê4°ê4©ê4¢ê4›ê4”ê4ê4†ê4ê4xê4qê4jê4cê4\ê4Uê4Nê4Gê4@ê49ê42ê4+ê4$ê4ê4ê4ê4ê4ê4úé4óé4ìé4åé4Þé4×é4Ðé4Éé4Âé4»é4´é4­é4¦é4Ÿé4˜é4‘é4Šé4ƒé4|é4ué4né4gé4`é4Yé4Ré4Ké4Dé4=é46é4/é4(é4!é4é4é4 é4é4þè4÷è4ðè4éè4âè4Ûè4Ôè4Íè4Æè4¿è4¸è4±è4ªè4£è4œè4•è4Žè4‡è4€è4yè4rè4kè4dè4]è4Vè4Oè4Hè4Aè4:è43è4,è4%è4è4è4è4 è4è4ûç4ôç4íç4æç4ßç4Øç4Ñç4Êç4Ãç4¼ç4µç4®ç4§ç4 ç4™ç4’ç4‹ç4„ç4}ç4vç4oç4hç4aç4Zç4Sç4Lç4Eç4>ç47ç40ç4)ç4"ç4ç4ç4 ç4ç4ÿæ4øæ4ñæ4êæ4ãæ4Üæ4Õæ4Îæ4Çæ4Àæ4¹æ4²æ4«æ4¤æ4æ4–æ4æ4ˆæ4æ4zæ4sæ4læ4eæ4^æ4Wæ4Pæ4Iæ4Bæ4;æ44æ4-æ4&æ4æ4æ4æ4 æ4æ4üå4õå4îå4çå4àå4Ùå4Òå4Ëå4Äå4½å4¶å4¯å4¨å4¡å4šå4“å4Œå4…å4~å4wå4på4iå4bå4[å4Tå4Må4Få4?å48å41å4*å4#å4å4å4å4å4å4ùä4òä4ëä4ää4Ýä4Öä4Ïä4Èä4Áä4ºä4³ä4¬ä4¥ä4žä4—ä4ä4‰ä4‚ä4{ä4tä4mä4fä4_ä4Xä4Qä4Jä4Cä4<ä45ä4.ä4'ä4 ä4ä4ä4 ä4ä4ýã4öã4ïã4èã4áã4Úã4Óã4Ìã4Åã4¾ã4·ã4°ã4©ã4¢ã4›ã4”ã4ã4†ã4ã4xã4qã4jã4cã4\ã4Uã4Nã4Gã4@ã49ã42ã4+ã4$ã4ã4ã4ã4ã4ã4úâ4óâ4ìâ4åâ4Þâ4×â4Ðâ4Éâ4Ââ4»â4´â4­â4¦â4Ÿâ4˜â4‘â4Šâ4ƒâ4|â4uâ4nâ4gâ4`â4Yâ4Râ4Kâ4Dâ4=â46â4/â4(â4!â4â4â4 â4â4þá4÷á4ðá4éá4âá4Ûá4Ôá4Íá4Æá4¿á4¸á4±á4ªá4£á4œá4•á4Žá4‡á4€á4yá4rá4ká4dá4]á4Vá4Oá4Há4Aá4:á43á4,á4%á4á4á4á4 á4á4ûà4ôà4íà4æà4ßà4Øà4Ñà4Êà4Ãà4¼à4µà4®à4§à4 à4™à4’à4‹à4„à4}à4và4oà4hà4aà4Zà4Sà4Là4Eà4>à47à40à4)à4"à4à4à4 à4à4ÿß4øß4ñß4êß4ãß4Üß4Õß4Îß4Çß4Àß4¹ß4²ß4«ß4¤ß4ß4–ß4ß4ˆß4ß4zß4sß4lß4eß4^ß4Wß4Pß4Iß4Bß4;ß44ß4-ß4&ß4ß4ß4ß4 ß4ß4üÞ4õÞ4îÞ4çÞ4àÞ4ÙÞ4ÒÞ4ËÞ4ÄÞ4½Þ4¶Þ4¯Þ4¨Þ4¡Þ4šÞ4“Þ4ŒÞ4…Þ4~Þ4wÞ4pÞ4iÞ4bÞ4[Þ4TÞ4MÞ4FÞ4?Þ48Þ41Þ4*Þ4#Þ4Þ4Þ4Þ4Þ4Þ4ùÝ4òÝ4ëÝ4äÝ4ÝÝ4ÖÝ4ÏÝ4ÈÝ4ÁÝ4ºÝ4³Ý4¬Ý4¥Ý4žÝ4—Ý4Ý4‰Ý4‚Ý4{Ý4tÝ4mÝ4fÝ4_Ý4XÝ4QÝ4JÝ4CÝ4<Ý45Ý4.Ý4'Ý4 Ý4Ý4Ý4 Ý4Ý4ýÜ4öÜ4ïÜ4èÜ4áÜ4ÚÜ4ÓÜ4ÌÜ4ÅÜ4¾Ü4·Ü4°Ü4©Ü4¢Ü4›Ü4”Ü4Ü4†Ü4Ü4xÜ4qÜ4jÜ4cÜ4\Ü4UÜ4NÜ4GÜ4@Ü49Ü42Ü4+Ü4$Ü4Ü4Ü4Ü4Ü4Ü4úÛ4óÛ4ìÛ4åÛ4ÞÛ4×Û4ÐÛ4ÉÛ4ÂÛ4»Û4´Û4­Û4¦Û4ŸÛ4˜Û4‘Û4ŠÛ4ƒÛ4|Û4uÛ4nÛ4gÛ4`Û4YÛ4RÛ4KÛ4DÛ4=Û46Û4/Û4(Û4!Û4Û4Û4 Û4Û4þÚ4÷Ú4ðÚ4éÚ4âÚ4ÛÚ4ÔÚ4ÍÚ4ÆÚ4¿Ú4¸Ú4±Ú4ªÚ4£Ú4œÚ4•Ú4ŽÚ4‡Ú4€Ú4yÚ4rÚ4kÚ4dÚ4]Ú4VÚ4OÚ4HÚ4AÚ4:Ú43Ú4,Ú4%Ú4Ú4Ú4Ú4 Ú4Ú4ûÙ4ôÙ4íÙ4æÙ4ßÙ4ØÙ4ÑÙ4ÊÙ4ÃÙ4¼Ù4µÙ4®Ù4§Ù4 Ù4™Ù4’Ù4‹Ù4„Ù4}Ù4vÙ4oÙ4hÙ4aÙ4ZÙ4SÙ4LÙ4EÙ4>Ù47Ù40Ù4)Ù4"Ù4Ù4Ù4 Ù4Ù4ÿØ4øØ4ñØ4êØ4ãØ4ÜØ4ÕØ4ÎØ4ÇØ4ÀØ4¹Ø4²Ø4«Ø4¤Ø4Ø4–Ø4Ø4ˆØ4Ø4zØ4sØ4lØ4eØ4^Ø4WØ4PØ4IØ4BØ4;Ø44Ø4-Ø4&Ø4Ø4Ø4Ø4 Ø4Ø4ü×4õ×4î×4ç×4à×4Ù×4Ò×4Ë×4Ä×4½×4¶×4¯×4¨×4¡×4š×4“×4Œ×4…×4~×4w×4p×4i×4b×4[×4T×4M×4F×4?×48×41×4*×4#×4×4×4×4×4×4ùÖ4òÖ4ëÖ4äÖ4ÝÖ4ÖÖ4ÏÖ4ÈÖ4ÁÖ4ºÖ4³Ö4¬Ö4¥Ö4žÖ4—Ö4Ö4‰Ö4‚Ö4{Ö4tÖ4mÖ4fÖ4_Ö4XÖ4QÖ4JÖ4CÖ4<Ö45Ö4.Ö4'Ö4 Ö4Ö4Ö4 Ö4Ö4ýÕ4öÕ4ïÕ4èÕ4áÕ4ÚÕ4ÓÕ4ÌÕ4ÅÕ4¾Õ4·Õ4°Õ4©Õ4¢Õ4›Õ4”Õ4Õ4†Õ4Õ4xÕ4qÕ4jÕ4cÕ4\Õ4UÕ4NÕ4GÕ4@Õ49Õ42Õ4+Õ4$Õ4Õ4Õ4Õ4Õ4Õ4úÔ4óÔ4ìÔ4åÔ4ÞÔ4×Ô4ÐÔ4ÉÔ4ÂÔ4»Ô4´Ô4­Ô4¦Ô4ŸÔ4˜Ô4‘Ô4ŠÔ4ƒÔ4|Ô4uÔ4nÔ4gÔ4`Ô4YÔ4RÔ4KÔ4DÔ4=Ô46Ô4/Ô4(Ô4!Ô4Ô4Ô4 Ô4Ô4þÓ4÷Ó4ðÓ4éÓ4âÓ4ÛÓ4ÔÓ4ÍÓ4ÆÓ4¿Ó4¸Ó4±Ó4ªÓ4£Ó4œÓ4•Ó4ŽÓ4‡Ó4€Ó4yÓ4rÓ4kÓ4dÓ4]Ó4VÓ4OÓ4HÓ4AÓ4:Ó43Ó4,Ó4%Ó4Ó4Ó4Ó4 Ó4Ó4ûÒ4ôÒ4íÒ4æÒ4ßÒ4ØÒ4ÑÒ4ÊÒ4ÃÒ4¼Ò4µÒ4®Ò4§Ò4 Ò4™Ò4’Ò4‹Ò4„Ò4}Ò4vÒ4oÒ4hÒ4aÒ4ZÒ4SÒ4LÒ4EÒ4>Ò47Ò40Ò4)Ò4"Ò4Ò4Ò4 Ò4Ò4ÿÑ4øÑ4ñÑ4êÑ4ãÑ4ÜÑ4ÕÑ4ÎÑ4ÇÑ4ÀÑ4¹Ñ4²Ñ4«Ñ4¤Ñ4Ñ4–Ñ4Ñ4ˆÑ4Ñ4zÑ4sÑ4lÑ4eÑ4^Ñ4WÑ4PÑ4IÑ4BÑ4;Ñ44Ñ4-Ñ4&Ñ4Ñ4Ñ4Ñ4 Ñ4Ñ4üÐ4õÐ4îÐ4çÐ4àÐ4ÙÐ4ÒÐ4ËÐ4ÄÐ4½Ð4¶Ð4¯Ð4¨Ð4¡Ð4šÐ4“Ð4ŒÐ4…Ð4~Ð4wÐ4pÐ4iÐ4bÐ4[Ð4TÐ4MÐ4FÐ4?Ð48Ð41Ð4*Ð4#Ð4Ð4Ð4Ð4Ð4Ð4ùÏ4òÏ4ëÏ4äÏ4ÝÏ4ÖÏ4ÏÏ4ÈÏ4ÁÏ4ºÏ4³Ï4¬Ï4¥Ï4žÏ4—Ï4Ï4‰Ï4‚Ï4{Ï4tÏ4mÏ4fÏ4_Ï4XÏ4QÏ4JÏ4CÏ4<Ï45Ï4.Ï4'Ï4 Ï4Ï4Ï4 Ï4Ï4ýÎ4öÎ4ïÎ4èÎ4áÎ4ÚÎ4ÓÎ4ÌÎ4ÅÎ4¾Î4·Î4°Î4©Î4¢Î4›Î4”Î4Î4†Î4Î4xÎ4qÎ4jÎ4cÎ4\Î4UÎ4NÎ4GÎ4@Î49Î42Î4+Î4$Î4Î4Î4Î4Î4Î4úÍ4óÍ4ìÍ4åÍ4ÞÍ4×Í4ÐÍ4ÉÍ4ÂÍ4»Í4´Í4­Í4¦Í4ŸÍ4˜Í4‘Í4ŠÍ4ƒÍ4|Í4uÍ4nÍ4gÍ4`Í4YÍ4RÍ4KÍ4DÍ4=Í46Í4/Í4(Í4!Í4Í4Í4 Í4Í4þÌ4÷Ì4ðÌ4éÌ4âÌ4ÛÌ4ÔÌ4ÍÌ4ÆÌ4¿Ì4¸Ì4±Ì4ªÌ4£Ì4œÌ4•Ì4ŽÌ4‡Ì4€Ì4yÌ4rÌ4kÌ4dÌ4]Ì4VÌ4OÌ4HÌ4AÌ4:Ì43Ì4,Ì4%Ì4Ì4Ì4Ì4 Ì4Ì4ûË4ôË4íË4æË4ßË4ØË4ÑË4ÊË4ÃË4¼Ë4µË4®Ë4§Ë4 Ë4™Ë4’Ë4‹Ë4„Ë4}Ë4vË4oË4hË4aË4ZË4SË4LË4EË4>Ë47Ë40Ë4)Ë4"Ë4Ë4Ë4 Ë4Ë4ÿÊ4øÊ4ñÊ4êÊ4ãÊ4ÜÊ4ÕÊ4ÎÊ4ÇÊ4ÀÊ4¹Ê4²Ê4«Ê4¤Ê4Ê4–Ê4Ê4ˆÊ4Ê4zÊ4sÊ4lÊ4eÊ4^Ê4WÊ4PÊ4IÊ4BÊ4;Ê44Ê4-Ê4&Ê4Ê4Ê4Ê4 Ê4Ê4üÉ4õÉ4îÉ4çÉ4àÉ4ÙÉ4ÒÉ4ËÉ4ÄÉ4½É4¶É4¯É4¨É4¡É4šÉ4“É4ŒÉ4…É4~É4wÉ4pÉ4iÉ4bÉ4[É4TÉ4MÉ4FÉ4?É48É41É4*É4#É4É4É4É4É4É4ùÈ4òÈ4ëÈ4äÈ4ÝÈ4ÖÈ4ÏÈ4ÈÈ4ÁÈ4ºÈ4³È4¬È4¥È4žÈ4—È4È4‰È4‚È4{È4tÈ4mÈ4fÈ4_È4XÈ4QÈ4JÈ4CÈ4<È45È4.È4'È4 È4È4È4 È4È4ýÇ4öÇ4ïÇ4èÇ4áÇ4ÚÇ4ÓÇ4ÌÇ4ÅÇ4¾Ç4·Ç4°Ç4©Ç4¢Ç4›Ç4”Ç4Ç4†Ç4Ç4xÇ4qÇ4jÇ4cÇ4\Ç4UÇ4NÇ4GÇ4@Ç49Ç42Ç4+Ç4$Ç4Ç4Ç4Ç4Ç4Ç4úÆ4óÆ4ìÆ4åÆ4ÞÆ4ׯ4ÐÆ4ÉÆ4ÂÆ4»Æ4´Æ4­Æ4¦Æ4ŸÆ4˜Æ4‘Æ4ŠÆ4ƒÆ4|Æ4uÆ4nÆ4gÆ4`Æ4YÆ4RÆ4KÆ4DÆ4=Æ46Æ4/Æ4(Æ4!Æ4Æ4Æ4 Æ4Æ4þÅ4÷Å4ðÅ4éÅ4âÅ4ÛÅ4ÔÅ4ÍÅ4ÆÅ4¿Å4¸Å4±Å4ªÅ4£Å4œÅ4•Å4ŽÅ4‡Å4€Å4yÅ4rÅ4kÅ4dÅ4]Å4VÅ4OÅ4HÅ4AÅ4:Å43Å4,Å4%Å4Å4Å4Å4 Å4Å4ûÄ4ôÄ4íÄ4æÄ4ßÄ4ØÄ4ÑÄ4ÊÄ4ÃÄ4¼Ä4µÄ4®Ä4§Ä4 Ä4™Ä4’Ä4‹Ä4„Ä4}Ä4vÄ4oÄ4hÄ4aÄ4ZÄ4SÄ4LÄ4EÄ4>Ä47Ä40Ä4)Ä4"Ä4Ä4Ä4 Ä4Ä4ÿÃ4øÃ4ñÃ4êÃ4ãÃ4ÜÃ4ÕÃ4ÎÃ4ÇÃ4ÀÃ4¹Ã4²Ã4«Ã4¤Ã4Ã4–Ã4Ã4ˆÃ4Ã4zÃ4sÃ4lÃ4eÃ4^Ã4WÃ4PÃ4IÃ4BÃ4;Ã44Ã4-Ã4&Ã4Ã4Ã4Ã4 Ã4Ã4üÂ4õÂ4îÂ4çÂ4àÂ4ÙÂ4ÒÂ4ËÂ4ÄÂ4½Â4¶Â4¯Â4¨Â4¡Â4šÂ4“Â4ŒÂ4…Â4~Â4wÂ4pÂ4iÂ4bÂ4[Â4TÂ4MÂ4FÂ4?Â48Â41Â4*Â4#Â4Â4Â4Â4Â4Â4ùÁ4òÁ4ëÁ4äÁ4ÝÁ4ÖÁ4ÏÁ4ÈÁ4ÁÁ4ºÁ4³Á4¬Á4¥Á4žÁ4—Á4Á4‰Á4‚Á4{Á4tÁ4mÁ4fÁ4_Á4XÁ4QÁ4JÁ4CÁ4<Á45Á4.Á4'Á4 Á4Á4Á4 Á4Á4ýÀ4öÀ4ïÀ4èÀ4áÀ4ÚÀ4ÓÀ4ÌÀ4ÅÀ4¾À4·À4°À4©À4¢À4›À4”À4À4†À4À4xÀ4qÀ4jÀ4cÀ4\À4UÀ4NÀ4GÀ4@À49À42À4+À4$À4À4À4À4À4À4ú¿4ó¿4ì¿4å¿4Þ¿4׿4п4É¿4¿4»¿4´¿4­¿4¦¿4Ÿ¿4˜¿4‘¿4Š¿4ƒ¿4|¿4u¿4n¿4g¿4`¿4Y¿4R¿4K¿4D¿4=¿46¿4/¿4(¿4!¿4¿4¿4 ¿4¿4þ¾4÷¾4ð¾4é¾4â¾4Û¾4Ô¾4;4ƾ4¿¾4¸¾4±¾4ª¾4£¾4œ¾4•¾4޾4‡¾4€¾4y¾4r¾4k¾4d¾4]¾4V¾4O¾4H¾4A¾4:¾43¾4,¾4%¾4¾4¾4¾4 ¾4¾4û½4ô½4í½4æ½4ß½4ؽ4ѽ4ʽ4ý4¼½4µ½4®½4§½4 ½4™½4’½4‹½4„½4}½4v½4o½4h½4a½4Z½4S½4L½4E½4>½47½40½4)½4"½4½4½4 ½4½4ÿ¼4ø¼4ñ¼4ê¼4ã¼4ܼ4Õ¼4μ4Ǽ4À¼4¹¼4²¼4«¼4¤¼4¼4–¼4¼4ˆ¼4¼4z¼4s¼4l¼4e¼4^¼4W¼4P¼4I¼4B¼4;¼44¼4-¼4&¼4¼4¼4¼4 ¼4¼4ü»4õ»4î»4ç»4à»4Ù»4Ò»4Ë»4Ä»4½»4¶»4¯»4¨»4¡»4š»4“»4Œ»4…»4~»4w»4p»4i»4b»4[»4T»4M»4F»4?»48»41»4*»4#»4»4»4»4»4»4ùº4òº4ëº4äº4ݺ4Öº4Ϻ4Ⱥ4Áº4ºº4³º4¬º4¥º4žº4—º4º4‰º4‚º4{º4tº4mº4fº4_º4Xº4Qº4Jº4Cº4<º45º4.º4'º4 º4º4º4 º4º4ý¹4ö¹4ï¹4è¹4á¹4Ú¹4Ó¹4̹4Ź4¾¹4·¹4°¹4©¹4¢¹4›¹4”¹4¹4†¹4¹4x¹4q¹4j¹4c¹4\¹4U¹4N¹4G¹4@¹49¹42¹4+¹4$¹4¹4¹4¹4¹4¹4ú¸4ó¸4ì¸4å¸4Þ¸4׸4и4ɸ4¸4»¸4´¸4­¸4¦¸4Ÿ¸4˜¸4‘¸4Џ4ƒ¸4|¸4u¸4n¸4g¸4`¸4Y¸4R¸4K¸4D¸4=¸46¸4/¸4(¸4!¸4¸4¸4 ¸4¸4þ·4÷·4ð·4é·4â·4Û·4Ô·4Í·4Æ·4¿·4¸·4±·4ª·4£·4œ·4•·4Ž·4‡·4€·4y·4r·4k·4d·4]·4V·4O·4H·4A·4:·43·4,·4%·4·4·4·4 ·4·4û¶4ô¶4í¶4æ¶4ß¶4ض4Ѷ4ʶ4ö4¼¶4µ¶4®¶4§¶4 ¶4™¶4’¶4‹¶4„¶4}¶4v¶4o¶4h¶4a¶4Z¶4S¶4L¶4E¶4>¶47¶40¶4)¶4"¶4¶4¶4 ¶4¶4ÿµ4øµ4ñµ4êµ4ãµ4ܵ4Õµ4ε4ǵ4Àµ4¹µ4²µ4«µ4¤µ4µ4–µ4µ4ˆµ4µ4zµ4sµ4lµ4eµ4^µ4Wµ4Pµ4Iµ4Bµ4;µ44µ4-µ4&µ4µ4µ4µ4 µ4µ4ü´4õ´4î´4ç´4à´4Ù´4Ò´4Ë´4Ä´4½´4¶´4¯´4¨´4¡´4š´4“´4Œ´4…´4~´4w´4p´4i´4b´4[´4T´4M´4F´4?´48´41´4*´4#´4´4´4´4´4´4ù³4ò³4ë³4ä³4ݳ4Ö³4ϳ4ȳ4Á³4º³4³³4¬³4¥³4ž³4—³4³4‰³4‚³4{³4t³4m³4f³4_³4X³4Q³4J³4C³4<³45³4.³4'³4 ³4³4³4 ³4³4ý²4ö²4ï²4è²4á²4Ú²4Ó²4̲4Ų4¾²4·²4°²4©²4¢²4›²4”²4²4†²4²4x²4q²4j²4c²4\²4U²4N²4G²4@²49²42²4+²4$²4²4²4²4²4²4ú±4ó±4ì±4å±4Þ±4×±4б4ɱ4±4»±4´±4­±4¦±4Ÿ±4˜±4‘±4б4ƒ±4|±4u±4n±4g±4`±4Y±4R±4K±4D±4=±46±4/±4(±4!±4±4±4 ±4±4þ°4÷°4ð°4é°4â°4Û°4Ô°4Ͱ4ư4¿°4¸°4±°4ª°4£°4œ°4•°4ް4‡°4€°4y°4r°4k°4d°4]°4V°4O°4H°4A°4:°43°4,°4%°4°4°4°4 °4°4û¯4ô¯4í¯4æ¯4߯4د4ѯ4ʯ4ï4¼¯4µ¯4®¯4§¯4 ¯4™¯4’¯4‹¯4„¯4}¯4v¯4o¯4h¯4a¯4Z¯4S¯4L¯4E¯4>¯47¯40¯4)¯4"¯4¯4¯4 ¯4¯4ÿ®4ø®4ñ®4ê®4ã®4Ü®4Õ®4ή4Ç®4À®4¹®4²®4«®4¤®4®4–®4®4ˆ®4®4z®4s®4l®4e®4^®4W®4P®4I®4B®4;®44®4-®4&®4®4®4®4 ®4®4ü­4õ­4î­4ç­4à­4Ù­4Ò­4Ë­4Ä­4½­4¶­4¯­4¨­4¡­4š­4“­4Œ­4…­4~­4w­4p­4i­4b­4[­4T­4M­4F­4?­48­41­4*­4#­4­4­4­4­4­4ù¬4ò¬4ë¬4ä¬4ݬ4Ö¬4Ϭ4Ȭ4Á¬4º¬4³¬4¬¬4¥¬4ž¬4—¬4¬4‰¬4‚¬4{¬4t¬4m¬4f¬4_¬4X¬4Q¬4J¬4C¬4<¬45¬4.¬4'¬4 ¬4¬4¬4 ¬4¬4ý«4ö«4ï«4è«4á«4Ú«4Ó«4Ì«4Å«4¾«4·«4°«4©«4¢«4›«4”«4«4†«4«4x«4q«4j«4c«4\«4U«4N«4G«4@«49«42«4+«4$«4«4«4«4«4«4úª4óª4ìª4åª4Þª4ת4Ъ4ɪ4ª4»ª4´ª4­ª4¦ª4Ÿª4˜ª4‘ª4Šª4ƒª4|ª4uª4nª4gª4`ª4Yª4Rª4Kª4Dª4=ª46ª4/ª4(ª4!ª4ª4ª4 ª4ª4þ©4÷©4ð©4é©4â©4Û©4Ô©4Í©4Æ©4¿©4¸©4±©4ª©4£©4œ©4•©4Ž©4‡©4€©4y©4r©4k©4d©4]©4V©4O©4H©4A©4:©43©4,©4%©4©4©4©4 ©4©4û¨4ô¨4í¨4æ¨4ߨ4ب4Ѩ4ʨ4è4¼¨4µ¨4®¨4§¨4 ¨4™¨4’¨4‹¨4„¨4}¨4v¨4o¨4h¨4a¨4Z¨4S¨4L¨4E¨4>¨47¨40¨4)¨4"¨4¨4¨4 ¨4¨4ÿ§4ø§4ñ§4ê§4ã§4ܧ4Õ§4Χ4ǧ4À§4¹§4²§4«§4¤§4§4–§4§4ˆ§4§4z§4s§4l§4e§4^§4W§4P§4I§4B§4;§44§4-§4&§4§4§4§4 §4§4ü¦4õ¦4î¦4ç¦4à¦4Ù¦4Ò¦4˦4Ħ4½¦4¶¦4¯¦4¨¦4¡¦4š¦4“¦4Œ¦4…¦4~¦4w¦4p¦4i¦4b¦4[¦4T¦4M¦4F¦4?¦48¦41¦4*¦4#¦4¦4¦4¦4¦4¦4ù¥4ò¥4ë¥4ä¥4Ý¥4Ö¥4Ï¥4È¥4Á¥4º¥4³¥4¬¥4¥¥4ž¥4—¥4¥4‰¥4‚¥4{¥4t¥4m¥4f¥4_¥4X¥4Q¥4J¥4C¥4<¥45¥4.¥4'¥4 ¥4¥4¥4 ¥4¥4ý¤4ö¤4ï¤4è¤4á¤4Ú¤4Ó¤4̤4Ť4¾¤4·¤4°¤4©¤4¢¤4›¤4”¤4¤4†¤4¤4x¤4q¤4j¤4c¤4\¤4U¤4N¤4G¤4@¤49¤42¤4+¤4$¤4¤4¤4¤4¤4¤4ú£4ó£4ì£4å£4Þ£4×£4У4É£4£4»£4´£4­£4¦£4Ÿ£4˜£4‘£4Š£4ƒ£4|£4u£4n£4g£4`£4Y£4R£4K£4D£4=£46£4/£4(£4!£4£4£4 £4£4þ¢4÷¢4ð¢4é¢4â¢4Û¢4Ô¢4Í¢4Æ¢4¿¢4¸¢4±¢4ª¢4£¢4œ¢4•¢4Ž¢4‡¢4€¢4y¢4r¢4k¢4d¢4]¢4V¢4O¢4H¢4A¢4:¢43¢4,¢4%¢4¢4¢4¢4 ¢4¢4û¡4ô¡4í¡4æ¡4ß¡4Ø¡4Ñ¡4Ê¡4á4¼¡4µ¡4®¡4§¡4 ¡4™¡4’¡4‹¡4„¡4}¡4v¡4o¡4h¡4a¡4Z¡4S¡4L¡4E¡4>¡47¡40¡4)¡4"¡4¡4¡4 ¡4¡4ÿ 4ø 4ñ 4ê 4ã 4Ü 4Õ 4Π4Ç 4À 4¹ 4² 4« 4¤ 4 4– 4 4ˆ 4 4z 4s 4l 4e 4^ 4W 4P 4I 4B 4; 44 4- 4& 4 4 4 4  4 4üŸ4õŸ4îŸ4çŸ4àŸ4ÙŸ4ÒŸ4ËŸ4ÄŸ4½Ÿ4¶Ÿ4¯Ÿ4¨Ÿ4¡Ÿ4šŸ4“Ÿ4ŒŸ4…Ÿ4~Ÿ4wŸ4pŸ4iŸ4bŸ4[Ÿ4TŸ4MŸ4FŸ4?Ÿ48Ÿ41Ÿ4*Ÿ4#Ÿ4Ÿ4Ÿ4Ÿ4Ÿ4Ÿ4ùž4òž4ëž4äž4Ýž4Öž4Ïž4Èž4Áž4ºž4³ž4¬ž4¥ž4žž4—ž4ž4‰ž4‚ž4{ž4tž4mž4fž4_ž4Xž4Qž4Jž4Cž4<ž45ž4.ž4'ž4 ž4ž4ž4 ž4ž4ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444úœ4óœ4ìœ4åœ4Þœ4ל4М4Éœ4œ4»œ4´œ4­œ4¦œ4Ÿœ4˜œ4‘œ4Šœ4ƒœ4|œ4uœ4nœ4gœ4`œ4Yœ4Rœ4Kœ4Dœ4=œ46œ4/œ4(œ4!œ4œ4œ4 œ4œ4þ›4÷›4ð›4é›4â›4Û›4Ô›4Í›4Æ›4¿›4¸›4±›4ª›4£›4œ›4•›4Ž›4‡›4€›4y›4r›4k›4d›4]›4V›4O›4H›4A›4:›43›4,›4%›4›4›4›4 ›4›4ûš4ôš4íš4æš4ßš4Øš4Ñš4Êš4Ú4¼š4µš4®š4§š4 š4™š4’š4‹š4„š4}š4vš4oš4hš4aš4Zš4Sš4Lš4Eš4>š47š40š4)š4"š4š4š4 š4š4ÿ™4ø™4ñ™4ê™4ã™4Ü™4Õ™4Ι4Ç™4À™4¹™4²™4«™4¤™4™4–™4™4ˆ™4™4z™4s™4l™4e™4^™4W™4P™4I™4B™4;™44™4-™4&™4™4™4™4 ™4™4ü˜4õ˜4î˜4ç˜4à˜4Ù˜4Ò˜4˘4Ę4½˜4¶˜4¯˜4¨˜4¡˜4š˜4“˜4Œ˜4…˜4~˜4w˜4p˜4i˜4b˜4[˜4T˜4M˜4F˜4?˜48˜41˜4*˜4#˜4˜4˜4˜4˜4˜4ù—4ò—4ë—4ä—4Ý—4Ö—4Ï—4È—4Á—4º—4³—4¬—4¥—4ž—4——4—4‰—4‚—4{—4t—4m—4f—4_—4X—4Q—4J—4C—4<—45—4.—4'—4 —4—4—4 —4—4ý–4ö–4ï–4è–4á–4Ú–4Ó–4Ì–4Å–4¾–4·–4°–4©–4¢–4›–4”–4–4†–4–4x–4q–4j–4c–4\–4U–4N–4G–4@–49–42–4+–4$–4–4–4–4–4–4ú•4ó•4ì•4å•4Þ•4ו4Е4É•4•4»•4´•4­•4¦•4Ÿ•4˜•4‘•4Š•4ƒ•4|•4u•4n•4g•4`•4Y•4R•4K•4D•4=•46•4/•4(•4!•4•4•4 •4•4þ”4÷”4ð”4é”4â”4Û”4Ô”4Í”4Æ”4¿”4¸”4±”4ª”4£”4œ”4•”4Ž”4‡”4€”4y”4r”4k”4d”4]”4V”4O”4H”4A”4:”43”4,”4%”4”4”4”4 ”4”4û“4ô“4í“4æ“4ß“4Ø“4Ñ“4Ê“4Ó4¼“4µ“4®“4§“4 “4™“4’“4‹“4„“4}“4v“4o“4h“4a“4Z“4S“4L“4E“4>“47“40“4)“4"“4“4“4 “4“4ÿ’4ø’4ñ’4ê’4ã’4Ü’4Õ’4Î’4Ç’4À’4¹’4²’4«’4¤’4’4–’4’4ˆ’4’4z’4s’4l’4e’4^’4W’4P’4I’4B’4;’44’4-’4&’4’4’4’4 ’4’4ü‘4õ‘4î‘4ç‘4à‘4Ù‘4Ò‘4Ë‘4Ä‘4½‘4¶‘4¯‘4¨‘4¡‘4š‘4“‘4Œ‘4…‘4~‘4w‘4p‘4i‘4b‘4[‘4T‘4M‘4F‘4?‘48‘41‘4*‘4#‘4‘4‘4‘4‘4‘4ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444úŽ4óŽ4ìŽ4åŽ4ÞŽ4׎4ÐŽ4ÉŽ4ÂŽ4»Ž4´Ž4­Ž4¦Ž4ŸŽ4˜Ž4‘Ž4ŠŽ4ƒŽ4|Ž4uŽ4nŽ4gŽ4`Ž4YŽ4RŽ4KŽ4DŽ4=Ž46Ž4/Ž4(Ž4!Ž4Ž4Ž4 Ž4Ž4þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44ûŒ4ôŒ4íŒ4æŒ4ߌ4ØŒ4ÑŒ4ÊŒ4ÃŒ4¼Œ4µŒ4®Œ4§Œ4 Œ4™Œ4’Œ4‹Œ4„Œ4}Œ4vŒ4oŒ4hŒ4aŒ4ZŒ4SŒ4LŒ4EŒ4>Œ47Œ40Œ4)Œ4"Œ4Œ4Œ4 Œ4Œ4ÿ‹4ø‹4ñ‹4ê‹4ã‹4Ü‹4Õ‹4΋4Ç‹4À‹4¹‹4²‹4«‹4¤‹4‹4–‹4‹4ˆ‹4‹4z‹4s‹4l‹4e‹4^‹4W‹4P‹4I‹4B‹4;‹44‹4-‹4&‹4‹4‹4‹4 ‹4‹4üŠ4õŠ4îŠ4çŠ4àŠ4ÙŠ4ÒŠ4ËŠ4ÄŠ4½Š4¶Š4¯Š4¨Š4¡Š4šŠ4“Š4ŒŠ4…Š4~Š4wŠ4pŠ4iŠ4bŠ4[Š4TŠ4MŠ4FŠ4?Š48Š41Š4*Š4#Š4Š4Š4Š4Š4Š4ù‰4ò‰4ë‰4ä‰4݉4Ö‰4ω4ȉ4Á‰4º‰4³‰4¬‰4¥‰4ž‰4—‰4‰4‰‰4‚‰4{‰4t‰4m‰4f‰4_‰4X‰4Q‰4J‰4C‰4<‰45‰4.‰4'‰4 ‰4‰4‰4 ‰4‰4ýˆ4öˆ4ïˆ4èˆ4áˆ4Úˆ4Óˆ4̈4ň4¾ˆ4·ˆ4°ˆ4©ˆ4¢ˆ4›ˆ4”ˆ4ˆ4†ˆ4ˆ4xˆ4qˆ4jˆ4cˆ4\ˆ4Uˆ4Nˆ4Gˆ4@ˆ49ˆ42ˆ4+ˆ4$ˆ4ˆ4ˆ4ˆ4ˆ4ˆ4ú‡4ó‡4ì‡4å‡4Þ‡4ׇ4Ї4ɇ4‡4»‡4´‡4­‡4¦‡4Ÿ‡4˜‡4‘‡4Ї4ƒ‡4|‡4u‡4n‡4g‡4`‡4Y‡4R‡4K‡4D‡4=‡46‡4/‡4(‡4!‡4‡4‡4 ‡4‡4þ†4÷†4ð†4é†4â†4Û†4Ô†4͆4Ɔ4¿†4¸†4±†4ª†4£†4œ†4•†4ކ4‡†4€†4y†4r†4k†4d†4]†4V†4O†4H†4A†4:†43†4,†4%†4†4†4†4 †4†4û…4ô…4í…4æ…4ß…4Ø…4Ñ…4Ê…4Ã…4¼…4µ…4®…4§…4 …4™…4’…4‹…4„…4}…4v…4o…4h…4a…4Z…4S…4L…4E…4>…47…40…4)…4"…4…4…4 …4…4ÿ„4ø„4ñ„4ê„4ã„4Ü„4Õ„4΄4Ç„4À„4¹„4²„4«„4¤„4„4–„4„4ˆ„4„4z„4s„4l„4e„4^„4W„4P„4I„4B„4;„44„4-„4&„4„4„4„4 „4„4üƒ4õƒ4îƒ4çƒ4àƒ4Ùƒ4Òƒ4˃4ă4½ƒ4¶ƒ4¯ƒ4¨ƒ4¡ƒ4šƒ4“ƒ4Œƒ4…ƒ4~ƒ4wƒ4pƒ4iƒ4bƒ4[ƒ4Tƒ4Mƒ4Fƒ4?ƒ48ƒ41ƒ4*ƒ4#ƒ4ƒ4ƒ4ƒ4ƒ4ƒ4ù‚4ò‚4ë‚4ä‚4Ý‚4Ö‚4Ï‚4È‚4Á‚4º‚4³‚4¬‚4¥‚4ž‚4—‚4‚4‰‚4‚‚4{‚4t‚4m‚4f‚4_‚4X‚4Q‚4J‚4C‚4<‚45‚4.‚4'‚4 ‚4‚4‚4 ‚4‚4ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú€4ó€4ì€4å€4Þ€4×€4Ѐ4É€4€4»€4´€4­€4¦€4Ÿ€4˜€4‘€4Š€4ƒ€4|€4u€4n€4g€4`€4Y€4R€4K€4D€4=€46€4/€4(€4!€4€4€4 €4€4þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û~4ô~4í~4æ~4ß~4Ø~4Ñ~4Ê~4Ã~4¼~4µ~4®~4§~4 ~4™~4’~4‹~4„~4}~4v~4o~4h~4a~4Z~4S~4L~4E~4>~47~40~4)~4"~4~4~4 ~4~4ÿ}4ø}4ñ}4ê}4ã}4Ü}4Õ}4Î}4Ç}4À}4¹}4²}4«}4¤}4}4–}4}4ˆ}4}4z}4s}4l}4e}4^}4W}4P}4I}4B}4;}44}4-}4&}4}4}4}4 }4}4ü|4õ|4î|4ç|4à|4Ù|4Ò|4Ë|4Ä|4½|4¶|4¯|4¨|4¡|4š|4“|4Œ|4…|4~|4w|4p|4i|4b|4[|4T|4M|4F|4?|48|41|4*|4#|4|4|4|4|4|4ù{4ò{4ë{4ä{4Ý{4Ö{4Ï{4È{4Á{4º{4³{4¬{4¥{4ž{4—{4{4‰{4‚{4{{4t{4m{4f{4_{4X{4Q{4J{4C{4<{45{4.{4'{4 {4{4{4 {4{4ýz4öz4ïz4èz4áz4Úz4Óz4Ìz4Åz4¾z4·z4°z4©z4¢z4›z4”z4z4†z4z4xz4qz4jz4cz4\z4Uz4Nz4Gz4@z49z42z4+z4$z4z4z4z4z4z4úy4óy4ìy4åy4Þy4×y4Ðy4Éy4Ây4»y4´y4­y4¦y4Ÿy4˜y4‘y4Šy4ƒy4|y4uy4ny4gy4`y4Yy4Ry4Ky4Dy4=y46y4/y4(y4!y4y4y4 y4y4þx4÷x4ðx4éx4âx4Ûx4Ôx4Íx4Æx4¿x4¸x4±x4ªx4£x4œx4•x4Žx4‡x4€x4yx4rx4kx4dx4]x4Vx4Ox4Hx4Ax4:x43x4,x4%x4x4x4x4 x4x4ûw4ôw4íw4æw4ßw4Øw4Ñw4Êw4Ãw4¼w4µw4®w4§w4 w4™w4’w4‹w4„w4}w4vw4ow4hw4aw4Zw4Sw4Lw4Ew4>w47w40w4)w4"w4w4w4 w4w4ÿv4øv4ñv4êv4ãv4Üv4Õv4Îv4Çv4Àv4¹v4²v4«v4¤v4v4–v4v4ˆv4v4zv4sv4lv4ev4^v4Wv4Pv4Iv4Bv4;v44v4-v4&v4v4v4v4 v4v4üu4õu4îu4çu4àu4Ùu4Òu4Ëu4Äu4½u4¶u4¯u4¨u4¡u4šu4“u4Œu4…u4~u4wu4pu4iu4bu4[u4Tu4Mu4Fu4?u48u41u4*u4#u4u4u4u4u4u4ùt4òt4ët4ät4Ýt4Öt4Ït4Èt4Át4ºt4³t4¬t4¥t4žt4—t4t4‰t4‚t4{t4tt4mt4ft4_t4Xt4Qt4Jt4Ct4p47p40p4)p4"p4p4p4 p4p4ÿo4øo4ño4êo4ão4Üo4Õo4Îo4Ço4Ào4¹o4²o4«o4¤o4o4–o4o4ˆo4o4zo4so4lo4eo4^o4Wo4Po4Io4Bo4;o44o4-o4&o4o4o4o4 o4o4ün4õn4în4çn4àn4Ùn4Òn4Ën4Än4½n4¶n4¯n4¨n4¡n4šn4“n4Œn4…n4~n4wn4pn4in4bn4[n4Tn4Mn4Fn4?n48n41n4*n4#n4n4n4n4n4n4ùm4òm4ëm4äm4Ým4Öm4Ïm4Èm4Ám4ºm4³m4¬m4¥m4žm4—m4m4‰m4‚m4{m4tm4mm4fm4_m4Xm4Qm4Jm4Cm4i47i40i4)i4"i4i4i4 i4i4ÿh4øh4ñh4êh4ãh4Üh4Õh4Îh4Çh4Àh4¹h4²h4«h4¤h4h4–h4h4ˆh4h4zh4sh4lh4eh4^h4Wh4Ph4Ih4Bh4;h44h4-h4&h4h4h4h4 h4h4üg4õg4îg4çg4àg4Ùg4Òg4Ëg4Äg4½g4¶g4¯g4¨g4¡g4šg4“g4Œg4…g4~g4wg4pg4ig4bg4[g4Tg4Mg4Fg4?g48g41g4*g4#g4g4g4g4g4g4ùf4òf4ëf4äf4Ýf4Öf4Ïf4Èf4Áf4ºf4³f4¬f4¥f4žf4—f4f4‰f4‚f4{f4tf4mf4ff4_f4Xf4Qf4Jf4Cf4b47b40b4)b4"b4b4b4 b4b4ÿa4øa4ña4êa4ãa4Üa4Õa4Îa4Ça4Àa4¹a4²a4«a4¤a4a4–a4a4ˆa4a4za4sa4la4ea4^a4Wa4Pa4Ia4Ba4;a44a4-a4&a4a4a4a4 a4a4ü`4õ`4î`4ç`4à`4Ù`4Ò`4Ë`4Ä`4½`4¶`4¯`4¨`4¡`4š`4“`4Œ`4…`4~`4w`4p`4i`4b`4[`4T`4M`4F`4?`48`41`4*`4#`4`4`4`4`4`4ù_4ò_4ë_4ä_4Ý_4Ö_4Ï_4È_4Á_4º_4³_4¬_4¥_4ž_4—_4_4‰_4‚_4{_4t_4m_4f_4__4X_4Q_4J_4C_4<_45_4._4'_4 _4_4_4 _4_4ý^4ö^4ï^4è^4á^4Ú^4Ó^4Ì^4Å^4¾^4·^4°^4©^4¢^4›^4”^4^4†^4^4x^4q^4j^4c^4\^4U^4N^4G^4@^49^42^4+^4$^4^4^4^4^4^4ú]4ó]4ì]4å]4Þ]4×]4Ð]4É]4Â]4»]4´]4­]4¦]4Ÿ]4˜]4‘]4Š]4ƒ]4|]4u]4n]4g]4`]4Y]4R]4K]4D]4=]46]4/]4(]4!]4]4]4 ]4]4þ\4÷\4ð\4é\4â\4Û\4Ô\4Í\4Æ\4¿\4¸\4±\4ª\4£\4œ\4•\4Ž\4‡\4€\4y\4r\4k\4d\4]\4V\4O\4H\4A\4:\43\4,\4%\4\4\4\4 \4\4û[4ô[4í[4æ[4ß[4Ø[4Ñ[4Ê[4Ã[4¼[4µ[4®[4§[4 [4™[4’[4‹[4„[4}[4v[4o[4h[4a[4Z[4S[4L[4E[4>[47[40[4)[4"[4[4[4 [4[4ÿZ4øZ4ñZ4êZ4ãZ4ÜZ4ÕZ4ÎZ4ÇZ4ÀZ4¹Z4²Z4«Z4¤Z4Z4–Z4Z4ˆZ4Z4zZ4sZ4lZ4eZ4^Z4WZ4PZ4IZ4BZ4;Z44Z4-Z4&Z4Z4Z4Z4 Z4Z4üY4õY4îY4çY4àY4ÙY4ÒY4ËY4ÄY4½Y4¶Y4¯Y4¨Y4¡Y4šY4“Y4ŒY4…Y4~Y4wY4pY4iY4bY4[Y4TY4MY4FY4?Y48Y41Y4*Y4#Y4Y4Y4Y4Y4Y4ùX4òX4ëX4äX4ÝX4ÖX4ÏX4ÈX4ÁX4ºX4³X4¬X4¥X4žX4—X4X4‰X4‚X4{X4tX4mX4fX4_X4XX4QX4JX4CX4T47T40T4)T4"T4T4T4 T4T4ÿS4øS4ñS4êS4ãS4ÜS4ÕS4ÎS4ÇS4ÀS4¹S4²S4«S4¤S4S4–S4S4ˆS4S4zS4sS4lS4eS4^S4WS4PS4IS4BS4;S44S4-S4&S4S4S4S4 S4S4üR4õR4îR4çR4àR4ÙR4ÒR4ËR4ÄR4½R4¶R4¯R4¨R4¡R4šR4“R4ŒR4…R4~R4wR4pR4iR4bR4[R4TR4MR4FR4?R48R41R4*R4#R4R4R4R4R4R4ùQ4òQ4ëQ4äQ4ÝQ4ÖQ4ÏQ4ÈQ4ÁQ4ºQ4³Q4¬Q4¥Q4žQ4—Q4Q4‰Q4‚Q4{Q4tQ4mQ4fQ4_Q4XQ4QQ4JQ4CQ4M47M40M4)M4"M4M4M4 M4M4ÿL4øL4ñL4êL4ãL4ÜL4ÕL4ÎL4ÇL4ÀL4¹L4²L4«L4¤L4L4–L4L4ˆL4L4zL4sL4lL4eL4^L4WL4PL4IL4BL4;L44L4-L4&L4L4L4L4 L4L4üK4õK4îK4çK4àK4ÙK4ÒK4ËK4ÄK4½K4¶K4¯K4¨K4¡K4šK4“K4ŒK4…K4~K4wK4pK4iK4bK4[K4TK4MK4FK4?K48K41K4*K4#K4K4K4K4K4K4ùJ4òJ4ëJ4äJ4ÝJ4ÖJ4ÏJ4ÈJ4ÁJ4ºJ4³J4¬J4¥J4žJ4—J4J4‰J4‚J4{J4tJ4mJ4fJ4_J4XJ4QJ4JJ4CJ4F47F40F4)F4"F4F4F4 F4F4ÿE4øE4ñE4êE4ãE4ÜE4ÕE4ÎE4ÇE4ÀE4¹E4²E4«E4¤E4E4–E4E4ˆE4E4zE4sE4lE4eE4^E4WE4PE4IE4BE4;E44E4-E4&E4E4E4E4 E4E4üD4õD4îD4çD4àD4ÙD4ÒD4ËD4ÄD4½D4¶D4¯D4¨D4¡D4šD4“D4ŒD4…D4~D4wD4pD4iD4bD4[D4TD4MD4FD4?D48D41D4*D4#D4D4D4D4D4D4ùC4òC4ëC4äC4ÝC4ÖC4ÏC4ÈC4ÁC4ºC4³C4¬C4¥C4žC4—C4C4‰C4‚C4{C4tC4mC4fC4_C4XC4QC4JC4CC4?47?40?4)?4"?4?4?4 ?4?4ÿ>4ø>4ñ>4ê>4ã>4Ü>4Õ>4Î>4Ç>4À>4¹>4²>4«>4¤>4>4–>4>4ˆ>4>4z>4s>4l>4e>4^>4W>4P>4I>4B>4;>44>4->4&>4>4>4>4 >4>4ü=4õ=4î=4ç=4à=4Ù=4Ò=4Ë=4Ä=4½=4¶=4¯=4¨=4¡=4š=4“=4Œ=4…=4~=4w=4p=4i=4b=4[=4T=4M=4F=4?=48=41=4*=4#=4=4=4=4=4=4ù<4ò<4ë<4ä<4Ý<4Ö<4Ï<4È<4Á<4º<4³<4¬<4¥<4ž<4—<4<4‰<4‚<4{<4t<4m<4f<4_<4X<4Q<4J<4C<4<<45<4.<4'<4 <4<4<4 <4<4ý;4ö;4ï;4è;4á;4Ú;4Ó;4Ì;4Å;4¾;4·;4°;4©;4¢;4›;4”;4;4†;4;4x;4q;4j;4c;4\;4U;4N;4G;4@;49;42;4+;4$;4;4;4;4;4;4ú:4ó:4ì:4å:4Þ:4×:4Ð:4É:4Â:4»:4´:4­:4¦:4Ÿ:4˜:4‘:4Š:4ƒ:4|:4u:4n:4g:4`:4Y:4R:4K:4D:4=:46:4/:4(:4!:4:4:4 :4:4þ94÷94ð94é94â94Û94Ô94Í94Æ94¿94¸94±94ª94£94œ94•94Ž94‡94€94y94r94k94d94]94V94O94H94A94:94394,94%94949494 9494û84ô84í84æ84ß84Ø84Ñ84Ê84Ã84¼84µ84®84§84 84™84’84‹84„84}84v84o84h84a84Z84S84L84E84>84784084)84"848484 8484ÿ74ø74ñ74ê74ã74Ü74Õ74Î74Ç74À74¹74²74«74¤7474–7474ˆ7474z74s74l74e74^74W74P74I74B74;74474-74&74747474 7474ü64õ64î64ç64à64Ù64Ò64Ë64Ä64½64¶64¯64¨64¡64š64“64Œ64…64~64w64p64i64b64[64T64M64F64?64864164*64#646464646464ù54ò54ë54ä54Ý54Ö54Ï54È54Á54º54³54¬54¥54ž54—5454‰54‚54{54t54m54f54_54X54Q54J54C54<54554.54'54 545454 5454ý44ö44ï44è44á44Ú44Ó44Ì44Å44¾44·44°44©44¢44›44”4444†4444x44q44j44c44\44U44N44G44@44944244+44$444444444444ú34ó34ì34å34Þ34×34Ð34É34Â34»34´34­34¦34Ÿ34˜34‘34Š34ƒ34|34u34n34g34`34Y34R34K34D34=34634/34(34!343434 3434þ24÷24ð24é24â24Û24Ô24Í24Æ24¿24¸24±24ª24£24œ24•24Ž24‡24€24y24r24k24d24]24V24O24H24A24:24324,24%24242424 2424û14ô14í14æ14ß14Ø14Ñ14Ê14Ã14¼14µ14®14§14 14™14’14‹14„14}14v14o14h14a14Z14S14L14E14>14714014)14"141414 1414ÿ04ø04ñ04ê04ã04Ü04Õ04Î04Ç04À04¹04²04«04¤0404–0404ˆ0404z04s04l04e04^04W04P04I04B04;04404-04&04040404 0404ü/4õ/4î/4ç/4à/4Ù/4Ò/4Ë/4Ä/4½/4¶/4¯/4¨/4¡/4š/4“/4Œ/4…/4~/4w/4p/4i/4b/4[/4T/4M/4F/4?/48/41/4*/4#/4/4/4/4/4/4ù.4ò.4ë.4ä.4Ý.4Ö.4Ï.4È.4Á.4º.4³.4¬.4¥.4ž.4—.4.4‰.4‚.4{.4t.4m.4f.4_.4X.4Q.4J.4C.4<.45.4..4'.4 .4.4.4 .4.4ý-4ö-4ï-4è-4á-4Ú-4Ó-4Ì-4Å-4¾-4·-4°-4©-4¢-4›-4”-4-4†-4-4x-4q-4j-4c-4\-4U-4N-4G-4@-49-42-4+-4$-4-4-4-4-4-4ú,4ó,4ì,4å,4Þ,4×,4Ð,4É,4Â,4»,4´,4­,4¦,4Ÿ,4˜,4‘,4Š,4ƒ,4|,4u,4n,4g,4`,4Y,4R,4K,4D,4=,46,4/,4(,4!,4,4,4 ,4,4þ+4÷+4ð+4é+4â+4Û+4Ô+4Í+4Æ+4¿+4¸+4±+4ª+4£+4œ+4•+4Ž+4‡+4€+4y+4r+4k+4d+4]+4V+4O+4H+4A+4:+43+4,+4%+4+4+4+4 +4+4û*4ô*4í*4æ*4ß*4Ø*4Ñ*4Ê*4Ã*4¼*4µ*4®*4§*4 *4™*4’*4‹*4„*4}*4v*4o*4h*4a*4Z*4S*4L*4E*4>*47*40*4)*4"*4*4*4 *4*4ÿ)4ø)4ñ)4ê)4ã)4Ü)4Õ)4Î)4Ç)4À)4¹)4²)4«)4¤)4)4–)4)4ˆ)4)4z)4s)4l)4e)4^)4W)4P)4I)4B)4;)44)4-)4&)4)4)4)4 )4)4ü(4õ(4î(4ç(4à(4Ù(4Ò(4Ë(4Ä(4½(4¶(4¯(4¨(4¡(4š(4“(4Œ(4…(4~(4w(4p(4i(4b(4[(4T(4M(4F(4?(48(41(4*(4#(4(4(4(4(4(4ù'4ò'4ë'4ä'4Ý'4Ö'4Ï'4È'4Á'4º'4³'4¬'4¥'4ž'4—'4'4‰'4‚'4{'4t'4m'4f'4_'4X'4Q'4J'4C'4<'45'4.'4''4 '4'4'4 '4'4ý&4ö&4ï&4è&4á&4Ú&4Ó&4Ì&4Å&4¾&4·&4°&4©&4¢&4›&4”&4&4†&4&4x&4q&4j&4c&4\&4U&4N&4G&4@&49&42&4+&4$&4&4&4&4&4&4ú%4ó%4ì%4å%4Þ%4×%4Ð%4É%4Â%4»%4´%4­%4¦%4Ÿ%4˜%4‘%4Š%4ƒ%4|%4u%4n%4g%4`%4Y%4R%4K%4D%4=%46%4/%4(%4!%4%4%4 %4%4þ$4÷$4ð$4é$4â$4Û$4Ô$4Í$4Æ$4¿$4¸$4±$4ª$4£$4œ$4•$4Ž$4‡$4€$4y$4r$4k$4d$4]$4V$4O$4H$4A$4:$43$4,$4%$4$4$4$4 $4$4û#4ô#4í#4æ#4ß#4Ø#4Ñ#4Ê#4Ã#4¼#4µ#4®#4§#4 #4™#4’#4‹#4„#4}#4v#4o#4h#4a#4Z#4S#4L#4E#4>#47#40#4)#4"#4#4#4 #4#4ÿ"4ø"4ñ"4ê"4ã"4Ü"4Õ"4Î"4Ç"4À"4¹"4²"4«"4¤"4"4–"4"4ˆ"4"4z"4s"4l"4e"4^"4W"4P"4I"4B"4;"44"4-"4&"4"4"4"4 "4"4ü!4õ!4î!4ç!4à!4Ù!4Ò!4Ë!4Ä!4½!4¶!4¯!4¨!4¡!4š!4“!4Œ!4…!4~!4w!4p!4i!4b!4[!4T!4M!4F!4?!48!41!4*!4#!4!4!4!4!4!4ù 4ò 4ë 4ä 4Ý 4Ö 4Ï 4È 4Á 4º 4³ 4¬ 4¥ 4ž 4— 4 4‰ 4‚ 4{ 4t 4m 4f 4_ 4X 4Q 4J 4C 4< 45 4. 4' 4 4 4 4 4 4ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ 4ø 4ñ 4ê 4ã 4Ü 4Õ 4Î 4Ç 4À 4¹ 4² 4« 4¤ 4 4– 4 4ˆ 4 4z 4s 4l 4e 4^ 4W 4P 4I 4B 4; 44 4- 4& 4 4 4 4 4 4ü 4õ 4î 4ç 4à 4Ù 4Ò 4Ë 4Ä 4½ 4¶ 4¯ 4¨ 4¡ 4š 4“ 4Œ 4… 4~ 4w 4p 4i 4b 4[ 4T 4M 4F 4? 48 41 4* 4# 4 4 4 4 4 4ù 4ò 4ë 4ä 4Ý 4Ö 4Ï 4È 4Á 4º 4³ 4¬ 4¥ 4ž 4— 4 4‰ 4‚ 4{ 4t 4m 4f 4_ 4X 4Q 4J 4C 4< 45 4. 4' 4 4 4 4 4 4ý 4ö 4ï 4è 4á 4Ú 4Ó 4Ì 4Å 4¾ 4· 4° 4© 4¢ 4› 4” 4 4† 4 4x 4q 4j 4c 4\ 4U 4N 4G 4@ 49 42 4+ 4$ 4 4 4 4 4 4ú 4ó 4ì 4å 4Þ 4× 4Ð 4É 4 4» 4´ 4­ 4¦ 4Ÿ 4˜ 4‘ 4Š 4ƒ 4| 4u 4n 4g 4` 4Y 4R 4K 4D 4= 46 4/ 4( 4! 4 4 4 4 4þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿÿ3øÿ3ñÿ3êÿ3ãÿ3Üÿ3Õÿ3Îÿ3Çÿ3Àÿ3¹ÿ3²ÿ3«ÿ3¤ÿ3ÿ3–ÿ3ÿ3ˆÿ3ÿ3zÿ3sÿ3lÿ3eÿ3^ÿ3Wÿ3Pÿ3Iÿ3Bÿ3;ÿ34ÿ3-ÿ3&ÿ3ÿ3ÿ3ÿ3 ÿ3ÿ3üþ3õþ3îþ3çþ3àþ3Ùþ3Òþ3Ëþ3Äþ3½þ3¶þ3¯þ3¨þ3¡þ3šþ3“þ3Œþ3…þ3~þ3wþ3pþ3iþ3bþ3[þ3Tþ3Mþ3Fþ3?þ38þ31þ3*þ3#þ3þ3þ3þ3þ3þ3ùý3òý3ëý3äý3Ýý3Öý3Ïý3Èý3Áý3ºý3³ý3¬ý3¥ý3žý3—ý3ý3‰ý3‚ý3{ý3tý3mý3fý3_ý3Xý3Qý3Jý3Cý3<ý35ý3.ý3'ý3 ý3ý3ý3 ý3ý3ýü3öü3ïü3èü3áü3Úü3Óü3Ìü3Åü3¾ü3·ü3°ü3©ü3¢ü3›ü3”ü3ü3†ü3ü3xü3qü3jü3cü3\ü3Uü3Nü3Gü3@ü39ü32ü3+ü3$ü3ü3ü3ü3ü3ü3úû3óû3ìû3åû3Þû3×û3Ðû3Éû3Âû3»û3´û3­û3¦û3Ÿû3˜û3‘û3Šû3ƒû3|û3uû3nû3gû3`û3Yû3Rû3Kû3Dû3=û36û3/û3(û3!û3û3û3 û3û3þú3÷ú3ðú3éú3âú3Ûú3Ôú3Íú3Æú3¿ú3¸ú3±ú3ªú3£ú3œú3•ú3Žú3‡ú3€ú3yú3rú3kú3dú3]ú3Vú3Oú3Hú3Aú3:ú33ú3,ú3%ú3ú3ú3ú3 ú3ú3ûù3ôù3íù3æù3ßù3Øù3Ñù3Êù3Ãù3¼ù3µù3®ù3§ù3 ù3™ù3’ù3‹ù3„ù3}ù3vù3où3hù3aù3Zù3Sù3Lù3Eù3>ù37ù30ù3)ù3"ù3ù3ù3 ù3ù3ÿø3øø3ñø3êø3ãø3Üø3Õø3Îø3Çø3Àø3¹ø3²ø3«ø3¤ø3ø3–ø3ø3ˆø3ø3zø3sø3lø3eø3^ø3Wø3Pø3Iø3Bø3;ø34ø3-ø3&ø3ø3ø3ø3 ø3ø3ü÷3õ÷3î÷3ç÷3à÷3Ù÷3Ò÷3Ë÷3Ä÷3½÷3¶÷3¯÷3¨÷3¡÷3š÷3“÷3Œ÷3…÷3~÷3w÷3p÷3i÷3b÷3[÷3T÷3M÷3F÷3?÷38÷31÷3*÷3#÷3÷3÷3÷3÷3÷3ùö3òö3ëö3äö3Ýö3Öö3Ïö3Èö3Áö3ºö3³ö3¬ö3¥ö3žö3—ö3ö3‰ö3‚ö3{ö3tö3mö3fö3_ö3Xö3Qö3Jö3Cö3<ö35ö3.ö3'ö3 ö3ö3ö3 ö3ö3ýõ3öõ3ïõ3èõ3áõ3Úõ3Óõ3Ìõ3Åõ3¾õ3·õ3°õ3©õ3¢õ3›õ3”õ3õ3†õ3õ3xõ3qõ3jõ3cõ3\õ3Uõ3Nõ3Gõ3@õ39õ32õ3+õ3$õ3õ3õ3õ3õ3õ3úô3óô3ìô3åô3Þô3×ô3Ðô3Éô3Âô3»ô3´ô3­ô3¦ô3Ÿô3˜ô3‘ô3Šô3ƒô3|ô3uô3nô3gô3`ô3Yô3Rô3Kô3Dô3=ô36ô3/ô3(ô3!ô3ô3ô3 ô3ô3þó3÷ó3ðó3éó3âó3Ûó3Ôó3Íó3Æó3¿ó3¸ó3±ó3ªó3£ó3œó3•ó3Žó3‡ó3€ó3yó3ró3kó3dó3]ó3Vó3Oó3Hó3Aó3:ó33ó3,ó3%ó3ó3ó3ó3 ó3ó3ûò3ôò3íò3æò3ßò3Øò3Ñò3Êò3Ãò3¼ò3µò3®ò3§ò3 ò3™ò3’ò3‹ò3„ò3}ò3vò3oò3hò3aò3Zò3Sò3Lò3Eò3>ò37ò30ò3)ò3"ò3ò3ò3 ò3ò3ÿñ3øñ3ññ3êñ3ãñ3Üñ3Õñ3Îñ3Çñ3Àñ3¹ñ3²ñ3«ñ3¤ñ3ñ3–ñ3ñ3ˆñ3ñ3zñ3sñ3lñ3eñ3^ñ3Wñ3Pñ3Iñ3Bñ3;ñ34ñ3-ñ3&ñ3ñ3ñ3ñ3 ñ3ñ3üð3õð3îð3çð3àð3Ùð3Òð3Ëð3Äð3½ð3¶ð3¯ð3¨ð3¡ð3šð3“ð3Œð3…ð3~ð3wð3pð3ið3bð3[ð3Tð3Mð3Fð3?ð38ð31ð3*ð3#ð3ð3ð3ð3ð3ð3ùï3òï3ëï3äï3Ýï3Öï3Ïï3Èï3Áï3ºï3³ï3¬ï3¥ï3žï3—ï3ï3‰ï3‚ï3{ï3tï3mï3fï3_ï3Xï3Qï3Jï3Cï3<ï35ï3.ï3'ï3 ï3ï3ï3 ï3ï3ýî3öî3ïî3èî3áî3Úî3Óî3Ìî3Åî3¾î3·î3°î3©î3¢î3›î3”î3î3†î3î3xî3qî3jî3cî3\î3Uî3Nî3Gî3@î39î32î3+î3$î3î3î3î3î3î3úí3óí3ìí3åí3Þí3×í3Ðí3Éí3Âí3»í3´í3­í3¦í3Ÿí3˜í3‘í3Ší3ƒí3|í3uí3ní3gí3`í3Yí3Rí3Kí3Dí3=í36í3/í3(í3!í3í3í3 í3í3þì3÷ì3ðì3éì3âì3Ûì3Ôì3Íì3Æì3¿ì3¸ì3±ì3ªì3£ì3œì3•ì3Žì3‡ì3€ì3yì3rì3kì3dì3]ì3Vì3Oì3Hì3Aì3:ì33ì3,ì3%ì3ì3ì3ì3 ì3ì3ûë3ôë3íë3æë3ßë3Øë3Ñë3Êë3Ãë3¼ë3µë3®ë3§ë3 ë3™ë3’ë3‹ë3„ë3}ë3vë3oë3hë3aë3Zë3Së3Lë3Eë3>ë37ë30ë3)ë3"ë3ë3ë3 ë3ë3ÿê3øê3ñê3êê3ãê3Üê3Õê3Îê3Çê3Àê3¹ê3²ê3«ê3¤ê3ê3–ê3ê3ˆê3ê3zê3sê3lê3eê3^ê3Wê3Pê3Iê3Bê3;ê34ê3-ê3&ê3ê3ê3ê3 ê3ê3üé3õé3îé3çé3àé3Ùé3Òé3Ëé3Äé3½é3¶é3¯é3¨é3¡é3šé3“é3Œé3…é3~é3wé3pé3ié3bé3[é3Té3Mé3Fé3?é38é31é3*é3#é3é3é3é3é3é3ùè3òè3ëè3äè3Ýè3Öè3Ïè3Èè3Áè3ºè3³è3¬è3¥è3žè3—è3è3‰è3‚è3{è3tè3mè3fè3_è3Xè3Qè3Jè3Cè3<è35è3.è3'è3 è3è3è3 è3è3ýç3öç3ïç3èç3áç3Úç3Óç3Ìç3Åç3¾ç3·ç3°ç3©ç3¢ç3›ç3”ç3ç3†ç3ç3xç3qç3jç3cç3\ç3Uç3Nç3Gç3@ç39ç32ç3+ç3$ç3ç3ç3ç3ç3ç3úæ3óæ3ìæ3åæ3Þæ3׿3Ðæ3Éæ3Âæ3»æ3´æ3­æ3¦æ3Ÿæ3˜æ3‘æ3Šæ3ƒæ3|æ3uæ3næ3gæ3`æ3Yæ3Ræ3Kæ3Dæ3=æ36æ3/æ3(æ3!æ3æ3æ3 æ3æ3þå3÷å3ðå3éå3âå3Ûå3Ôå3Íå3Æå3¿å3¸å3±å3ªå3£å3œå3•å3Žå3‡å3€å3yå3rå3kå3då3]å3Vå3Oå3Hå3Aå3:å33å3,å3%å3å3å3å3 å3å3ûä3ôä3íä3æä3ßä3Øä3Ñä3Êä3Ãä3¼ä3µä3®ä3§ä3 ä3™ä3’ä3‹ä3„ä3}ä3vä3oä3hä3aä3Zä3Sä3Lä3Eä3>ä37ä30ä3)ä3"ä3ä3ä3 ä3ä3ÿã3øã3ñã3êã3ãã3Üã3Õã3Îã3Çã3Àã3¹ã3²ã3«ã3¤ã3ã3–ã3ã3ˆã3ã3zã3sã3lã3eã3^ã3Wã3Pã3Iã3Bã3;ã34ã3-ã3&ã3ã3ã3ã3 ã3ã3üâ3õâ3îâ3çâ3àâ3Ùâ3Òâ3Ëâ3Äâ3½â3¶â3¯â3¨â3¡â3šâ3“â3Œâ3…â3~â3wâ3pâ3iâ3bâ3[â3Tâ3Mâ3Fâ3?â38â31â3*â3#â3â3â3â3â3â3ùá3òá3ëá3äá3Ýá3Öá3Ïá3Èá3Áá3ºá3³á3¬á3¥á3žá3—á3á3‰á3‚á3{á3tá3má3fá3_á3Xá3Qá3Já3Cá3<á35á3.á3'á3 á3á3á3 á3á3ýà3öà3ïà3èà3áà3Úà3Óà3Ìà3Åà3¾à3·à3°à3©à3¢à3›à3”à3à3†à3à3xà3qà3jà3cà3\à3Uà3Nà3Gà3@à39à32à3+à3$à3à3à3à3à3à3úß3óß3ìß3åß3Þß3×ß3Ðß3Éß3Âß3»ß3´ß3­ß3¦ß3Ÿß3˜ß3‘ß3Šß3ƒß3|ß3uß3nß3gß3`ß3Yß3Rß3Kß3Dß3=ß36ß3/ß3(ß3!ß3ß3ß3 ß3ß3þÞ3÷Þ3ðÞ3éÞ3âÞ3ÛÞ3ÔÞ3ÍÞ3ÆÞ3¿Þ3¸Þ3±Þ3ªÞ3£Þ3œÞ3•Þ3ŽÞ3‡Þ3€Þ3yÞ3rÞ3kÞ3dÞ3]Þ3VÞ3OÞ3HÞ3AÞ3:Þ33Þ3,Þ3%Þ3Þ3Þ3Þ3 Þ3Þ3ûÝ3ôÝ3íÝ3æÝ3ßÝ3ØÝ3ÑÝ3ÊÝ3ÃÝ3¼Ý3µÝ3®Ý3§Ý3 Ý3™Ý3’Ý3‹Ý3„Ý3}Ý3vÝ3oÝ3hÝ3aÝ3ZÝ3SÝ3LÝ3EÝ3>Ý37Ý30Ý3)Ý3"Ý3Ý3Ý3 Ý3Ý3ÿÜ3øÜ3ñÜ3êÜ3ãÜ3ÜÜ3ÕÜ3ÎÜ3ÇÜ3ÀÜ3¹Ü3²Ü3«Ü3¤Ü3Ü3–Ü3Ü3ˆÜ3Ü3zÜ3sÜ3lÜ3eÜ3^Ü3WÜ3PÜ3IÜ3BÜ3;Ü34Ü3-Ü3&Ü3Ü3Ü3Ü3 Ü3Ü3üÛ3õÛ3îÛ3çÛ3àÛ3ÙÛ3ÒÛ3ËÛ3ÄÛ3½Û3¶Û3¯Û3¨Û3¡Û3šÛ3“Û3ŒÛ3…Û3~Û3wÛ3pÛ3iÛ3bÛ3[Û3TÛ3MÛ3FÛ3?Û38Û31Û3*Û3#Û3Û3Û3Û3Û3Û3ùÚ3òÚ3ëÚ3äÚ3ÝÚ3ÖÚ3ÏÚ3ÈÚ3ÁÚ3ºÚ3³Ú3¬Ú3¥Ú3žÚ3—Ú3Ú3‰Ú3‚Ú3{Ú3tÚ3mÚ3fÚ3_Ú3XÚ3QÚ3JÚ3CÚ3<Ú35Ú3.Ú3'Ú3 Ú3Ú3Ú3 Ú3Ú3ýÙ3öÙ3ïÙ3èÙ3áÙ3ÚÙ3ÓÙ3ÌÙ3ÅÙ3¾Ù3·Ù3°Ù3©Ù3¢Ù3›Ù3”Ù3Ù3†Ù3Ù3xÙ3qÙ3jÙ3cÙ3\Ù3UÙ3NÙ3GÙ3@Ù39Ù32Ù3+Ù3$Ù3Ù3Ù3Ù3Ù3Ù3úØ3óØ3ìØ3åØ3ÞØ3ר3ÐØ3ÉØ3ÂØ3»Ø3´Ø3­Ø3¦Ø3ŸØ3˜Ø3‘Ø3ŠØ3ƒØ3|Ø3uØ3nØ3gØ3`Ø3YØ3RØ3KØ3DØ3=Ø36Ø3/Ø3(Ø3!Ø3Ø3Ø3 Ø3Ø3þ×3÷×3ð×3é×3â×3Û×3Ô×3Í×3Æ×3¿×3¸×3±×3ª×3£×3œ×3•×3Ž×3‡×3€×3y×3r×3k×3d×3]×3V×3O×3H×3A×3:×33×3,×3%×3×3×3×3 ×3×3ûÖ3ôÖ3íÖ3æÖ3ßÖ3ØÖ3ÑÖ3ÊÖ3ÃÖ3¼Ö3µÖ3®Ö3§Ö3 Ö3™Ö3’Ö3‹Ö3„Ö3}Ö3vÖ3oÖ3hÖ3aÖ3ZÖ3SÖ3LÖ3EÖ3>Ö37Ö30Ö3)Ö3"Ö3Ö3Ö3 Ö3Ö3ÿÕ3øÕ3ñÕ3êÕ3ãÕ3ÜÕ3ÕÕ3ÎÕ3ÇÕ3ÀÕ3¹Õ3²Õ3«Õ3¤Õ3Õ3–Õ3Õ3ˆÕ3Õ3zÕ3sÕ3lÕ3eÕ3^Õ3WÕ3PÕ3IÕ3BÕ3;Õ34Õ3-Õ3&Õ3Õ3Õ3Õ3 Õ3Õ3üÔ3õÔ3îÔ3çÔ3àÔ3ÙÔ3ÒÔ3ËÔ3ÄÔ3½Ô3¶Ô3¯Ô3¨Ô3¡Ô3šÔ3“Ô3ŒÔ3…Ô3~Ô3wÔ3pÔ3iÔ3bÔ3[Ô3TÔ3MÔ3FÔ3?Ô38Ô31Ô3*Ô3#Ô3Ô3Ô3Ô3Ô3Ô3ùÓ3òÓ3ëÓ3äÓ3ÝÓ3ÖÓ3ÏÓ3ÈÓ3ÁÓ3ºÓ3³Ó3¬Ó3¥Ó3žÓ3—Ó3Ó3‰Ó3‚Ó3{Ó3tÓ3mÓ3fÓ3_Ó3XÓ3QÓ3JÓ3CÓ3<Ó35Ó3.Ó3'Ó3 Ó3Ó3Ó3 Ó3Ó3ýÒ3öÒ3ïÒ3èÒ3áÒ3ÚÒ3ÓÒ3ÌÒ3ÅÒ3¾Ò3·Ò3°Ò3©Ò3¢Ò3›Ò3”Ò3Ò3†Ò3Ò3xÒ3qÒ3jÒ3cÒ3\Ò3UÒ3NÒ3GÒ3@Ò39Ò32Ò3+Ò3$Ò3Ò3Ò3Ò3Ò3Ò3úÑ3óÑ3ìÑ3åÑ3ÞÑ3×Ñ3ÐÑ3ÉÑ3ÂÑ3»Ñ3´Ñ3­Ñ3¦Ñ3ŸÑ3˜Ñ3‘Ñ3ŠÑ3ƒÑ3|Ñ3uÑ3nÑ3gÑ3`Ñ3YÑ3RÑ3KÑ3DÑ3=Ñ36Ñ3/Ñ3(Ñ3!Ñ3Ñ3Ñ3 Ñ3Ñ3þÐ3÷Ð3ðÐ3éÐ3âÐ3ÛÐ3ÔÐ3ÍÐ3ÆÐ3¿Ð3¸Ð3±Ð3ªÐ3£Ð3œÐ3•Ð3ŽÐ3‡Ð3€Ð3yÐ3rÐ3kÐ3dÐ3]Ð3VÐ3OÐ3HÐ3AÐ3:Ð33Ð3,Ð3%Ð3Ð3Ð3Ð3 Ð3Ð3ûÏ3ôÏ3íÏ3æÏ3ßÏ3ØÏ3ÑÏ3ÊÏ3ÃÏ3¼Ï3µÏ3®Ï3§Ï3 Ï3™Ï3’Ï3‹Ï3„Ï3}Ï3vÏ3oÏ3hÏ3aÏ3ZÏ3SÏ3LÏ3EÏ3>Ï37Ï30Ï3)Ï3"Ï3Ï3Ï3 Ï3Ï3ÿÎ3øÎ3ñÎ3êÎ3ãÎ3ÜÎ3ÕÎ3ÎÎ3ÇÎ3ÀÎ3¹Î3²Î3«Î3¤Î3Î3–Î3Î3ˆÎ3Î3zÎ3sÎ3lÎ3eÎ3^Î3WÎ3PÎ3IÎ3BÎ3;Î34Î3-Î3&Î3Î3Î3Î3 Î3Î3üÍ3õÍ3îÍ3çÍ3àÍ3ÙÍ3ÒÍ3ËÍ3ÄÍ3½Í3¶Í3¯Í3¨Í3¡Í3šÍ3“Í3ŒÍ3…Í3~Í3wÍ3pÍ3iÍ3bÍ3[Í3TÍ3MÍ3FÍ3?Í38Í31Í3*Í3#Í3Í3Í3Í3Í3Í3ùÌ3òÌ3ëÌ3äÌ3ÝÌ3ÖÌ3ÏÌ3ÈÌ3ÁÌ3ºÌ3³Ì3¬Ì3¥Ì3žÌ3—Ì3Ì3‰Ì3‚Ì3{Ì3tÌ3mÌ3fÌ3_Ì3XÌ3QÌ3JÌ3CÌ3<Ì35Ì3.Ì3'Ì3 Ì3Ì3Ì3 Ì3Ì3ýË3öË3ïË3èË3áË3ÚË3ÓË3ÌË3ÅË3¾Ë3·Ë3°Ë3©Ë3¢Ë3›Ë3”Ë3Ë3†Ë3Ë3xË3qË3jË3cË3\Ë3UË3NË3GË3@Ë39Ë32Ë3+Ë3$Ë3Ë3Ë3Ë3Ë3Ë3úÊ3óÊ3ìÊ3åÊ3ÞÊ3×Ê3ÐÊ3ÉÊ3ÂÊ3»Ê3´Ê3­Ê3¦Ê3ŸÊ3˜Ê3‘Ê3ŠÊ3ƒÊ3|Ê3uÊ3nÊ3gÊ3`Ê3YÊ3RÊ3KÊ3DÊ3=Ê36Ê3/Ê3(Ê3!Ê3Ê3Ê3 Ê3Ê3þÉ3÷É3ðÉ3éÉ3âÉ3ÛÉ3ÔÉ3ÍÉ3ÆÉ3¿É3¸É3±É3ªÉ3£É3œÉ3•É3ŽÉ3‡É3€É3yÉ3rÉ3kÉ3dÉ3]É3VÉ3OÉ3HÉ3AÉ3:É33É3,É3%É3É3É3É3 É3É3ûÈ3ôÈ3íÈ3æÈ3ßÈ3ØÈ3ÑÈ3ÊÈ3ÃÈ3¼È3µÈ3®È3§È3 È3™È3’È3‹È3„È3}È3vÈ3oÈ3hÈ3aÈ3ZÈ3SÈ3LÈ3EÈ3>È37È30È3)È3"È3È3È3 È3È3ÿÇ3øÇ3ñÇ3êÇ3ãÇ3ÜÇ3ÕÇ3ÎÇ3ÇÇ3ÀÇ3¹Ç3²Ç3«Ç3¤Ç3Ç3–Ç3Ç3ˆÇ3Ç3zÇ3sÇ3lÇ3eÇ3^Ç3WÇ3PÇ3IÇ3BÇ3;Ç34Ç3-Ç3&Ç3Ç3Ç3Ç3 Ç3Ç3üÆ3õÆ3îÆ3çÆ3àÆ3ÙÆ3ÒÆ3ËÆ3ÄÆ3½Æ3¶Æ3¯Æ3¨Æ3¡Æ3šÆ3“Æ3ŒÆ3…Æ3~Æ3wÆ3pÆ3iÆ3bÆ3[Æ3TÆ3MÆ3FÆ3?Æ38Æ31Æ3*Æ3#Æ3Æ3Æ3Æ3Æ3Æ3ùÅ3òÅ3ëÅ3äÅ3ÝÅ3ÖÅ3ÏÅ3ÈÅ3ÁÅ3ºÅ3³Å3¬Å3¥Å3žÅ3—Å3Å3‰Å3‚Å3{Å3tÅ3mÅ3fÅ3_Å3XÅ3QÅ3JÅ3CÅ3<Å35Å3.Å3'Å3 Å3Å3Å3 Å3Å3ýÄ3öÄ3ïÄ3èÄ3áÄ3ÚÄ3ÓÄ3ÌÄ3ÅÄ3¾Ä3·Ä3°Ä3©Ä3¢Ä3›Ä3”Ä3Ä3†Ä3Ä3xÄ3qÄ3jÄ3cÄ3\Ä3UÄ3NÄ3GÄ3@Ä39Ä32Ä3+Ä3$Ä3Ä3Ä3Ä3Ä3Ä3úÃ3óÃ3ìÃ3åÃ3ÞÃ3×Ã3ÐÃ3ÉÃ3ÂÃ3»Ã3´Ã3­Ã3¦Ã3ŸÃ3˜Ã3‘Ã3ŠÃ3ƒÃ3|Ã3uÃ3nÃ3gÃ3`Ã3YÃ3RÃ3KÃ3DÃ3=Ã36Ã3/Ã3(Ã3!Ã3Ã3Ã3 Ã3Ã3þÂ3÷Â3ðÂ3éÂ3âÂ3ÛÂ3ÔÂ3ÍÂ3ÆÂ3¿Â3¸Â3±Â3ªÂ3£Â3œÂ3•Â3ŽÂ3‡Â3€Â3yÂ3rÂ3kÂ3dÂ3]Â3VÂ3OÂ3HÂ3AÂ3:Â33Â3,Â3%Â3Â3Â3Â3 Â3Â3ûÁ3ôÁ3íÁ3æÁ3ßÁ3ØÁ3ÑÁ3ÊÁ3ÃÁ3¼Á3µÁ3®Á3§Á3 Á3™Á3’Á3‹Á3„Á3}Á3vÁ3oÁ3hÁ3aÁ3ZÁ3SÁ3LÁ3EÁ3>Á37Á30Á3)Á3"Á3Á3Á3 Á3Á3ÿÀ3øÀ3ñÀ3êÀ3ãÀ3ÜÀ3ÕÀ3ÎÀ3ÇÀ3ÀÀ3¹À3²À3«À3¤À3À3–À3À3ˆÀ3À3zÀ3sÀ3lÀ3eÀ3^À3WÀ3PÀ3IÀ3BÀ3;À34À3-À3&À3À3À3À3 À3À3ü¿3õ¿3î¿3ç¿3à¿3Ù¿3Ò¿3Ë¿3Ä¿3½¿3¶¿3¯¿3¨¿3¡¿3š¿3“¿3Œ¿3…¿3~¿3w¿3p¿3i¿3b¿3[¿3T¿3M¿3F¿3?¿38¿31¿3*¿3#¿3¿3¿3¿3¿3¿3ù¾3ò¾3ë¾3ä¾3ݾ3Ö¾3Ͼ3Ⱦ3Á¾3º¾3³¾3¬¾3¥¾3ž¾3—¾3¾3‰¾3‚¾3{¾3t¾3m¾3f¾3_¾3X¾3Q¾3J¾3C¾3<¾35¾3.¾3'¾3 ¾3¾3¾3 ¾3¾3ý½3ö½3ï½3è½3á½3Ú½3Ó½3̽3Ž3¾½3·½3°½3©½3¢½3›½3”½3½3†½3½3x½3q½3j½3c½3\½3U½3N½3G½3@½39½32½3+½3$½3½3½3½3½3½3ú¼3ó¼3ì¼3å¼3Þ¼3×¼3м3ɼ3¼3»¼3´¼3­¼3¦¼3Ÿ¼3˜¼3‘¼3м3ƒ¼3|¼3u¼3n¼3g¼3`¼3Y¼3R¼3K¼3D¼3=¼36¼3/¼3(¼3!¼3¼3¼3 ¼3¼3þ»3÷»3ð»3é»3â»3Û»3Ô»3Í»3Æ»3¿»3¸»3±»3ª»3£»3œ»3•»3Ž»3‡»3€»3y»3r»3k»3d»3]»3V»3O»3H»3A»3:»33»3,»3%»3»3»3»3 »3»3ûº3ôº3íº3æº3ߺ3غ3Ѻ3ʺ3ú3¼º3µº3®º3§º3 º3™º3’º3‹º3„º3}º3vº3oº3hº3aº3Zº3Sº3Lº3Eº3>º37º30º3)º3"º3º3º3 º3º3ÿ¹3ø¹3ñ¹3ê¹3ã¹3ܹ3Õ¹3ι3ǹ3À¹3¹¹3²¹3«¹3¤¹3¹3–¹3¹3ˆ¹3¹3z¹3s¹3l¹3e¹3^¹3W¹3P¹3I¹3B¹3;¹34¹3-¹3&¹3¹3¹3¹3 ¹3¹3ü¸3õ¸3î¸3ç¸3à¸3Ù¸3Ò¸3˸3ĸ3½¸3¶¸3¯¸3¨¸3¡¸3š¸3“¸3Œ¸3…¸3~¸3w¸3p¸3i¸3b¸3[¸3T¸3M¸3F¸3?¸38¸31¸3*¸3#¸3¸3¸3¸3¸3¸3ù·3ò·3ë·3ä·3Ý·3Ö·3Ï·3È·3Á·3º·3³·3¬·3¥·3ž·3—·3·3‰·3‚·3{·3t·3m·3f·3_·3X·3Q·3J·3C·3<·35·3.·3'·3 ·3·3·3 ·3·3ý¶3ö¶3ï¶3è¶3á¶3Ú¶3Ó¶3̶3Ŷ3¾¶3·¶3°¶3©¶3¢¶3›¶3”¶3¶3†¶3¶3x¶3q¶3j¶3c¶3\¶3U¶3N¶3G¶3@¶39¶32¶3+¶3$¶3¶3¶3¶3¶3¶3úµ3óµ3ìµ3åµ3Þµ3×µ3е3ɵ3µ3»µ3´µ3­µ3¦µ3Ÿµ3˜µ3‘µ3е3ƒµ3|µ3uµ3nµ3gµ3`µ3Yµ3Rµ3Kµ3Dµ3=µ36µ3/µ3(µ3!µ3µ3µ3 µ3µ3þ´3÷´3ð´3é´3â´3Û´3Ô´3Í´3Æ´3¿´3¸´3±´3ª´3£´3œ´3•´3Ž´3‡´3€´3y´3r´3k´3d´3]´3V´3O´3H´3A´3:´33´3,´3%´3´3´3´3 ´3´3û³3ô³3í³3æ³3ß³3س3ѳ3ʳ3ó3¼³3µ³3®³3§³3 ³3™³3’³3‹³3„³3}³3v³3o³3h³3a³3Z³3S³3L³3E³3>³37³30³3)³3"³3³3³3 ³3³3ÿ²3ø²3ñ²3ê²3ã²3ܲ3Õ²3β3Dz3À²3¹²3²²3«²3¤²3²3–²3²3ˆ²3²3z²3s²3l²3e²3^²3W²3P²3I²3B²3;²34²3-²3&²3²3²3²3 ²3²3ü±3õ±3î±3ç±3à±3Ù±3Ò±3˱3ı3½±3¶±3¯±3¨±3¡±3š±3“±3Œ±3…±3~±3w±3p±3i±3b±3[±3T±3M±3F±3?±38±31±3*±3#±3±3±3±3±3±3ù°3ò°3ë°3ä°3ݰ3Ö°3ϰ3Ȱ3Á°3º°3³°3¬°3¥°3ž°3—°3°3‰°3‚°3{°3t°3m°3f°3_°3X°3Q°3J°3C°3<°35°3.°3'°3 °3°3°3 °3°3ý¯3ö¯3ï¯3è¯3á¯3Ú¯3Ó¯3̯3ů3¾¯3·¯3°¯3©¯3¢¯3›¯3”¯3¯3†¯3¯3x¯3q¯3j¯3c¯3\¯3U¯3N¯3G¯3@¯39¯32¯3+¯3$¯3¯3¯3¯3¯3¯3ú®3ó®3ì®3å®3Þ®3×®3Ю3É®3®3»®3´®3­®3¦®3Ÿ®3˜®3‘®3Š®3ƒ®3|®3u®3n®3g®3`®3Y®3R®3K®3D®3=®36®3/®3(®3!®3®3®3 ®3®3þ­3÷­3ð­3é­3â­3Û­3Ô­3Í­3Æ­3¿­3¸­3±­3ª­3£­3œ­3•­3Ž­3‡­3€­3y­3r­3k­3d­3]­3V­3O­3H­3A­3:­33­3,­3%­3­3­3­3 ­3­3û¬3ô¬3í¬3æ¬3߬3ج3Ѭ3ʬ3ì3¼¬3µ¬3®¬3§¬3 ¬3™¬3’¬3‹¬3„¬3}¬3v¬3o¬3h¬3a¬3Z¬3S¬3L¬3E¬3>¬37¬30¬3)¬3"¬3¬3¬3 ¬3¬3ÿ«3ø«3ñ«3ê«3ã«3Ü«3Õ«3Ϋ3Ç«3À«3¹«3²«3««3¤«3«3–«3«3ˆ«3«3z«3s«3l«3e«3^«3W«3P«3I«3B«3;«34«3-«3&«3«3«3«3 «3«3üª3õª3îª3çª3àª3Ùª3Òª3˪3Ī3½ª3¶ª3¯ª3¨ª3¡ª3šª3“ª3Œª3…ª3~ª3wª3pª3iª3bª3[ª3Tª3Mª3Fª3?ª38ª31ª3*ª3#ª3ª3ª3ª3ª3ª3ù©3ò©3ë©3ä©3Ý©3Ö©3Ï©3È©3Á©3º©3³©3¬©3¥©3ž©3—©3©3‰©3‚©3{©3t©3m©3f©3_©3X©3Q©3J©3C©3<©35©3.©3'©3 ©3©3©3 ©3©3ý¨3ö¨3ï¨3è¨3á¨3Ú¨3Ó¨3̨3Ũ3¾¨3·¨3°¨3©¨3¢¨3›¨3”¨3¨3†¨3¨3x¨3q¨3j¨3c¨3\¨3U¨3N¨3G¨3@¨39¨32¨3+¨3$¨3¨3¨3¨3¨3¨3ú§3ó§3ì§3å§3Þ§3×§3Ч3ɧ3§3»§3´§3­§3¦§3Ÿ§3˜§3‘§3Ч3ƒ§3|§3u§3n§3g§3`§3Y§3R§3K§3D§3=§36§3/§3(§3!§3§3§3 §3§3þ¦3÷¦3ð¦3é¦3â¦3Û¦3Ô¦3ͦ3Ʀ3¿¦3¸¦3±¦3ª¦3£¦3œ¦3•¦3ަ3‡¦3€¦3y¦3r¦3k¦3d¦3]¦3V¦3O¦3H¦3A¦3:¦33¦3,¦3%¦3¦3¦3¦3 ¦3¦3û¥3ô¥3í¥3æ¥3ߥ3Ø¥3Ñ¥3Ê¥3Ã¥3¼¥3µ¥3®¥3§¥3 ¥3™¥3’¥3‹¥3„¥3}¥3v¥3o¥3h¥3a¥3Z¥3S¥3L¥3E¥3>¥37¥30¥3)¥3"¥3¥3¥3 ¥3¥3ÿ¤3ø¤3ñ¤3ê¤3ã¤3ܤ3Õ¤3Τ3Ǥ3À¤3¹¤3²¤3«¤3¤¤3¤3–¤3¤3ˆ¤3¤3z¤3s¤3l¤3e¤3^¤3W¤3P¤3I¤3B¤3;¤34¤3-¤3&¤3¤3¤3¤3 ¤3¤3ü£3õ£3î£3ç£3à£3Ù£3Ò£3Ë£3Ä£3½£3¶£3¯£3¨£3¡£3š£3“£3Œ£3…£3~£3w£3p£3i£3b£3[£3T£3M£3F£3?£38£31£3*£3#£3£3£3£3£3£3ù¢3ò¢3ë¢3ä¢3Ý¢3Ö¢3Ï¢3È¢3Á¢3º¢3³¢3¬¢3¥¢3ž¢3—¢3¢3‰¢3‚¢3{¢3t¢3m¢3f¢3_¢3X¢3Q¢3J¢3C¢3<¢35¢3.¢3'¢3 ¢3¢3¢3 ¢3¢3ý¡3ö¡3ï¡3è¡3á¡3Ú¡3Ó¡3Ì¡3Å¡3¾¡3·¡3°¡3©¡3¢¡3›¡3”¡3¡3†¡3¡3x¡3q¡3j¡3c¡3\¡3U¡3N¡3G¡3@¡39¡32¡3+¡3$¡3¡3¡3¡3¡3¡3ú 3ó 3ì 3å 3Þ 3× 3Р3É 3 3» 3´ 3­ 3¦ 3Ÿ 3˜ 3‘ 3Š 3ƒ 3| 3u 3n 3g 3` 3Y 3R 3K 3D 3= 36 3/ 3( 3! 3 3 3  3 3þŸ3÷Ÿ3ðŸ3éŸ3âŸ3ÛŸ3ÔŸ3ÍŸ3ÆŸ3¿Ÿ3¸Ÿ3±Ÿ3ªŸ3£Ÿ3œŸ3•Ÿ3ŽŸ3‡Ÿ3€Ÿ3yŸ3rŸ3kŸ3dŸ3]Ÿ3VŸ3OŸ3HŸ3AŸ3:Ÿ33Ÿ3,Ÿ3%Ÿ3Ÿ3Ÿ3Ÿ3 Ÿ3Ÿ3ûž3ôž3íž3æž3ßž3Øž3Ñž3Êž3Þ3¼ž3µž3®ž3§ž3 ž3™ž3’ž3‹ž3„ž3}ž3vž3ož3hž3až3Zž3Sž3Lž3Ež3>ž37ž30ž3)ž3"ž3ž3ž3 ž3ž3ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33üœ3õœ3îœ3çœ3àœ3Ùœ3Òœ3Ëœ3Äœ3½œ3¶œ3¯œ3¨œ3¡œ3šœ3“œ3Œœ3…œ3~œ3wœ3pœ3iœ3bœ3[œ3Tœ3Mœ3Fœ3?œ38œ31œ3*œ3#œ3œ3œ3œ3œ3œ3ù›3ò›3ë›3ä›3Ý›3Ö›3Ï›3È›3Á›3º›3³›3¬›3¥›3ž›3—›3›3‰›3‚›3{›3t›3m›3f›3_›3X›3Q›3J›3C›3<›35›3.›3'›3 ›3›3›3 ›3›3ýš3öš3ïš3èš3áš3Úš3Óš3Ìš3Åš3¾š3·š3°š3©š3¢š3›š3”š3š3†š3š3xš3qš3jš3cš3\š3Uš3Nš3Gš3@š39š32š3+š3$š3š3š3š3š3š3ú™3ó™3ì™3å™3Þ™3×™3Й3É™3™3»™3´™3­™3¦™3Ÿ™3˜™3‘™3Š™3ƒ™3|™3u™3n™3g™3`™3Y™3R™3K™3D™3=™36™3/™3(™3!™3™3™3 ™3™3þ˜3÷˜3ð˜3é˜3â˜3Û˜3Ô˜3͘3Ƙ3¿˜3¸˜3±˜3ª˜3£˜3œ˜3•˜3Ž˜3‡˜3€˜3y˜3r˜3k˜3d˜3]˜3V˜3O˜3H˜3A˜3:˜33˜3,˜3%˜3˜3˜3˜3 ˜3˜3û—3ô—3í—3æ—3ß—3Ø—3Ñ—3Ê—3×3¼—3µ—3®—3§—3 —3™—3’—3‹—3„—3}—3v—3o—3h—3a—3Z—3S—3L—3E—3>—37—30—3)—3"—3—3—3 —3—3ÿ–3ø–3ñ–3ê–3ã–3Ü–3Õ–3Ζ3Ç–3À–3¹–3²–3«–3¤–3–3––3–3ˆ–3–3z–3s–3l–3e–3^–3W–3P–3I–3B–3;–34–3-–3&–3–3–3–3 –3–3ü•3õ•3î•3ç•3à•3Ù•3Ò•3Ë•3Ä•3½•3¶•3¯•3¨•3¡•3š•3“•3Œ•3…•3~•3w•3p•3i•3b•3[•3T•3M•3F•3?•38•31•3*•3#•3•3•3•3•3•3ù”3ò”3ë”3ä”3Ý”3Ö”3Ï”3È”3Á”3º”3³”3¬”3¥”3ž”3—”3”3‰”3‚”3{”3t”3m”3f”3_”3X”3Q”3J”3C”3<”35”3.”3'”3 ”3”3”3 ”3”3ý“3ö“3ï“3è“3á“3Ú“3Ó“3Ì“3Å“3¾“3·“3°“3©“3¢“3›“3”“3“3†“3“3x“3q“3j“3c“3\“3U“3N“3G“3@“39“32“3+“3$“3“3“3“3“3“3ú’3ó’3ì’3å’3Þ’3×’3Ð’3É’3Â’3»’3´’3­’3¦’3Ÿ’3˜’3‘’3Š’3ƒ’3|’3u’3n’3g’3`’3Y’3R’3K’3D’3=’36’3/’3(’3!’3’3’3 ’3’3þ‘3÷‘3ð‘3é‘3â‘3Û‘3Ô‘3Í‘3Æ‘3¿‘3¸‘3±‘3ª‘3£‘3œ‘3•‘3Ž‘3‡‘3€‘3y‘3r‘3k‘3d‘3]‘3V‘3O‘3H‘3A‘3:‘33‘3,‘3%‘3‘3‘3‘3 ‘3‘3û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33üŽ3õŽ3îŽ3çŽ3àŽ3ÙŽ3ÒŽ3ËŽ3ÄŽ3½Ž3¶Ž3¯Ž3¨Ž3¡Ž3šŽ3“Ž3ŒŽ3…Ž3~Ž3wŽ3pŽ3iŽ3bŽ3[Ž3TŽ3MŽ3FŽ3?Ž38Ž31Ž3*Ž3#Ž3Ž3Ž3Ž3Ž3Ž3ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ýŒ3öŒ3ïŒ3èŒ3áŒ3ÚŒ3ÓŒ3ÌŒ3ÅŒ3¾Œ3·Œ3°Œ3©Œ3¢Œ3›Œ3”Œ3Œ3†Œ3Œ3xŒ3qŒ3jŒ3cŒ3\Œ3UŒ3NŒ3GŒ3@Œ39Œ32Œ3+Œ3$Œ3Œ3Œ3Œ3Œ3Œ3ú‹3ó‹3ì‹3å‹3Þ‹3׋3Ћ3É‹3‹3»‹3´‹3­‹3¦‹3Ÿ‹3˜‹3‘‹3Š‹3ƒ‹3|‹3u‹3n‹3g‹3`‹3Y‹3R‹3K‹3D‹3=‹36‹3/‹3(‹3!‹3‹3‹3 ‹3‹3þŠ3÷Š3ðŠ3éŠ3âŠ3ÛŠ3ÔŠ3ÍŠ3ÆŠ3¿Š3¸Š3±Š3ªŠ3£Š3œŠ3•Š3ŽŠ3‡Š3€Š3yŠ3rŠ3kŠ3dŠ3]Š3VŠ3OŠ3HŠ3AŠ3:Š33Š3,Š3%Š3Š3Š3Š3 Š3Š3û‰3ô‰3í‰3æ‰3߉3؉3щ3ʉ3É3¼‰3µ‰3®‰3§‰3 ‰3™‰3’‰3‹‰3„‰3}‰3v‰3o‰3h‰3a‰3Z‰3S‰3L‰3E‰3>‰37‰30‰3)‰3"‰3‰3‰3 ‰3‰3ÿˆ3øˆ3ñˆ3êˆ3ãˆ3܈3Õˆ3Έ3Lj3Àˆ3¹ˆ3²ˆ3«ˆ3¤ˆ3ˆ3–ˆ3ˆ3ˆˆ3ˆ3zˆ3sˆ3lˆ3eˆ3^ˆ3Wˆ3Pˆ3Iˆ3Bˆ3;ˆ34ˆ3-ˆ3&ˆ3ˆ3ˆ3ˆ3 ˆ3ˆ3ü‡3õ‡3î‡3ç‡3à‡3Ù‡3Ò‡3ˇ3ć3½‡3¶‡3¯‡3¨‡3¡‡3š‡3“‡3Œ‡3…‡3~‡3w‡3p‡3i‡3b‡3[‡3T‡3M‡3F‡3?‡38‡31‡3*‡3#‡3‡3‡3‡3‡3‡3ù†3ò†3ë†3ä†3݆3Ö†3φ3Ȇ3Á†3º†3³†3¬†3¥†3ž†3—†3†3‰†3‚†3{†3t†3m†3f†3_†3X†3Q†3J†3C†3<†35†3.†3'†3 †3†3†3 †3†3ý…3ö…3ï…3è…3á…3Ú…3Ó…3Ì…3Å…3¾…3·…3°…3©…3¢…3›…3”…3…3†…3…3x…3q…3j…3c…3\…3U…3N…3G…3@…39…32…3+…3$…3…3…3…3…3…3ú„3ó„3ì„3å„3Þ„3ׄ3Є3É„3„3»„3´„3­„3¦„3Ÿ„3˜„3‘„3Š„3ƒ„3|„3u„3n„3g„3`„3Y„3R„3K„3D„3=„36„3/„3(„3!„3„3„3 „3„3þƒ3÷ƒ3ðƒ3éƒ3âƒ3Ûƒ3Ôƒ3̓3ƃ3¿ƒ3¸ƒ3±ƒ3ªƒ3£ƒ3œƒ3•ƒ3Žƒ3‡ƒ3€ƒ3yƒ3rƒ3kƒ3dƒ3]ƒ3Vƒ3Oƒ3Hƒ3Aƒ3:ƒ33ƒ3,ƒ3%ƒ3ƒ3ƒ3ƒ3 ƒ3ƒ3û‚3ô‚3í‚3æ‚3ß‚3Ø‚3Ñ‚3Ê‚3Â3¼‚3µ‚3®‚3§‚3 ‚3™‚3’‚3‹‚3„‚3}‚3v‚3o‚3h‚3a‚3Z‚3S‚3L‚3E‚3>‚37‚30‚3)‚3"‚3‚3‚3 ‚3‚3ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü€3õ€3î€3ç€3à€3Ù€3Ò€3Ë€3Ä€3½€3¶€3¯€3¨€3¡€3š€3“€3Œ€3…€3~€3w€3p€3i€3b€3[€3T€3M€3F€3?€38€31€3*€3#€3€3€3€3€3€3ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý~3ö~3ï~3è~3á~3Ú~3Ó~3Ì~3Å~3¾~3·~3°~3©~3¢~3›~3”~3~3†~3~3x~3q~3j~3c~3\~3U~3N~3G~3@~39~32~3+~3$~3~3~3~3~3~3ú}3ó}3ì}3å}3Þ}3×}3Ð}3É}3Â}3»}3´}3­}3¦}3Ÿ}3˜}3‘}3Š}3ƒ}3|}3u}3n}3g}3`}3Y}3R}3K}3D}3=}36}3/}3(}3!}3}3}3 }3}3þ|3÷|3ð|3é|3â|3Û|3Ô|3Í|3Æ|3¿|3¸|3±|3ª|3£|3œ|3•|3Ž|3‡|3€|3y|3r|3k|3d|3]|3V|3O|3H|3A|3:|33|3,|3%|3|3|3|3 |3|3û{3ô{3í{3æ{3ß{3Ø{3Ñ{3Ê{3Ã{3¼{3µ{3®{3§{3 {3™{3’{3‹{3„{3}{3v{3o{3h{3a{3Z{3S{3L{3E{3>{37{30{3){3"{3{3{3 {3{3ÿz3øz3ñz3êz3ãz3Üz3Õz3Îz3Çz3Àz3¹z3²z3«z3¤z3z3–z3z3ˆz3z3zz3sz3lz3ez3^z3Wz3Pz3Iz3Bz3;z34z3-z3&z3z3z3z3 z3z3üy3õy3îy3çy3ày3Ùy3Òy3Ëy3Äy3½y3¶y3¯y3¨y3¡y3šy3“y3Œy3…y3~y3wy3py3iy3by3[y3Ty3My3Fy3?y38y31y3*y3#y3y3y3y3y3y3ùx3òx3ëx3äx3Ýx3Öx3Ïx3Èx3Áx3ºx3³x3¬x3¥x3žx3—x3x3‰x3‚x3{x3tx3mx3fx3_x3Xx3Qx3Jx3Cx3t37t30t3)t3"t3t3t3 t3t3ÿs3øs3ñs3ês3ãs3Üs3Õs3Îs3Çs3Às3¹s3²s3«s3¤s3s3–s3s3ˆs3s3zs3ss3ls3es3^s3Ws3Ps3Is3Bs3;s34s3-s3&s3s3s3s3 s3s3ür3õr3îr3çr3àr3Ùr3Òr3Ër3Är3½r3¶r3¯r3¨r3¡r3šr3“r3Œr3…r3~r3wr3pr3ir3br3[r3Tr3Mr3Fr3?r38r31r3*r3#r3r3r3r3r3r3ùq3òq3ëq3äq3Ýq3Öq3Ïq3Èq3Áq3ºq3³q3¬q3¥q3žq3—q3q3‰q3‚q3{q3tq3mq3fq3_q3Xq3Qq3Jq3Cq3m37m30m3)m3"m3m3m3 m3m3ÿl3øl3ñl3êl3ãl3Ül3Õl3Îl3Çl3Àl3¹l3²l3«l3¤l3l3–l3l3ˆl3l3zl3sl3ll3el3^l3Wl3Pl3Il3Bl3;l34l3-l3&l3l3l3l3 l3l3ük3õk3îk3çk3àk3Ùk3Òk3Ëk3Äk3½k3¶k3¯k3¨k3¡k3šk3“k3Œk3…k3~k3wk3pk3ik3bk3[k3Tk3Mk3Fk3?k38k31k3*k3#k3k3k3k3k3k3ùj3òj3ëj3äj3Ýj3Öj3Ïj3Èj3Áj3ºj3³j3¬j3¥j3žj3—j3j3‰j3‚j3{j3tj3mj3fj3_j3Xj3Qj3Jj3Cj3f37f30f3)f3"f3f3f3 f3f3ÿe3øe3ñe3êe3ãe3Üe3Õe3Îe3Çe3Àe3¹e3²e3«e3¤e3e3–e3e3ˆe3e3ze3se3le3ee3^e3We3Pe3Ie3Be3;e34e3-e3&e3e3e3e3 e3e3üd3õd3îd3çd3àd3Ùd3Òd3Ëd3Äd3½d3¶d3¯d3¨d3¡d3šd3“d3Œd3…d3~d3wd3pd3id3bd3[d3Td3Md3Fd3?d38d31d3*d3#d3d3d3d3d3d3ùc3òc3ëc3äc3Ýc3Öc3Ïc3Èc3Ác3ºc3³c3¬c3¥c3žc3—c3c3‰c3‚c3{c3tc3mc3fc3_c3Xc3Qc3Jc3Cc3_37_30_3)_3"_3_3_3 _3_3ÿ^3ø^3ñ^3ê^3ã^3Ü^3Õ^3Î^3Ç^3À^3¹^3²^3«^3¤^3^3–^3^3ˆ^3^3z^3s^3l^3e^3^^3W^3P^3I^3B^3;^34^3-^3&^3^3^3^3 ^3^3ü]3õ]3î]3ç]3à]3Ù]3Ò]3Ë]3Ä]3½]3¶]3¯]3¨]3¡]3š]3“]3Œ]3…]3~]3w]3p]3i]3b]3[]3T]3M]3F]3?]38]31]3*]3#]3]3]3]3]3]3ù\3ò\3ë\3ä\3Ý\3Ö\3Ï\3È\3Á\3º\3³\3¬\3¥\3ž\3—\3\3‰\3‚\3{\3t\3m\3f\3_\3X\3Q\3J\3C\3<\35\3.\3'\3 \3\3\3 \3\3ý[3ö[3ï[3è[3á[3Ú[3Ó[3Ì[3Å[3¾[3·[3°[3©[3¢[3›[3”[3[3†[3[3x[3q[3j[3c[3\[3U[3N[3G[3@[39[32[3+[3$[3[3[3[3[3[3úZ3óZ3ìZ3åZ3ÞZ3×Z3ÐZ3ÉZ3ÂZ3»Z3´Z3­Z3¦Z3ŸZ3˜Z3‘Z3ŠZ3ƒZ3|Z3uZ3nZ3gZ3`Z3YZ3RZ3KZ3DZ3=Z36Z3/Z3(Z3!Z3Z3Z3 Z3Z3þY3÷Y3ðY3éY3âY3ÛY3ÔY3ÍY3ÆY3¿Y3¸Y3±Y3ªY3£Y3œY3•Y3ŽY3‡Y3€Y3yY3rY3kY3dY3]Y3VY3OY3HY3AY3:Y33Y3,Y3%Y3Y3Y3Y3 Y3Y3ûX3ôX3íX3æX3ßX3ØX3ÑX3ÊX3ÃX3¼X3µX3®X3§X3 X3™X3’X3‹X3„X3}X3vX3oX3hX3aX3ZX3SX3LX3EX3>X37X30X3)X3"X3X3X3 X3X3ÿW3øW3ñW3êW3ãW3ÜW3ÕW3ÎW3ÇW3ÀW3¹W3²W3«W3¤W3W3–W3W3ˆW3W3zW3sW3lW3eW3^W3WW3PW3IW3BW3;W34W3-W3&W3W3W3W3 W3W3üV3õV3îV3çV3àV3ÙV3ÒV3ËV3ÄV3½V3¶V3¯V3¨V3¡V3šV3“V3ŒV3…V3~V3wV3pV3iV3bV3[V3TV3MV3FV3?V38V31V3*V3#V3V3V3V3V3V3ùU3òU3ëU3äU3ÝU3ÖU3ÏU3ÈU3ÁU3ºU3³U3¬U3¥U3žU3—U3U3‰U3‚U3{U3tU3mU3fU3_U3XU3QU3JU3CU3Q37Q30Q3)Q3"Q3Q3Q3 Q3Q3ÿP3øP3ñP3êP3ãP3ÜP3ÕP3ÎP3ÇP3ÀP3¹P3²P3«P3¤P3P3–P3P3ˆP3P3zP3sP3lP3eP3^P3WP3PP3IP3BP3;P34P3-P3&P3P3P3P3 P3P3üO3õO3îO3çO3àO3ÙO3ÒO3ËO3ÄO3½O3¶O3¯O3¨O3¡O3šO3“O3ŒO3…O3~O3wO3pO3iO3bO3[O3TO3MO3FO3?O38O31O3*O3#O3O3O3O3O3O3ùN3òN3ëN3äN3ÝN3ÖN3ÏN3ÈN3ÁN3ºN3³N3¬N3¥N3žN3—N3N3‰N3‚N3{N3tN3mN3fN3_N3XN3QN3JN3CN3J37J30J3)J3"J3J3J3 J3J3ÿI3øI3ñI3êI3ãI3ÜI3ÕI3ÎI3ÇI3ÀI3¹I3²I3«I3¤I3I3–I3I3ˆI3I3zI3sI3lI3eI3^I3WI3PI3II3BI3;I34I3-I3&I3I3I3I3 I3I3üH3õH3îH3çH3àH3ÙH3ÒH3ËH3ÄH3½H3¶H3¯H3¨H3¡H3šH3“H3ŒH3…H3~H3wH3pH3iH3bH3[H3TH3MH3FH3?H38H31H3*H3#H3H3H3H3H3H3ùG3òG3ëG3äG3ÝG3ÖG3ÏG3ÈG3ÁG3ºG3³G3¬G3¥G3žG3—G3G3‰G3‚G3{G3tG3mG3fG3_G3XG3QG3JG3CG3C37C30C3)C3"C3C3C3 C3C3ÿB3øB3ñB3êB3ãB3ÜB3ÕB3ÎB3ÇB3ÀB3¹B3²B3«B3¤B3B3–B3B3ˆB3B3zB3sB3lB3eB3^B3WB3PB3IB3BB3;B34B3-B3&B3B3B3B3 B3B3üA3õA3îA3çA3àA3ÙA3ÒA3ËA3ÄA3½A3¶A3¯A3¨A3¡A3šA3“A3ŒA3…A3~A3wA3pA3iA3bA3[A3TA3MA3FA3?A38A31A3*A3#A3A3A3A3A3A3ù@3ò@3ë@3ä@3Ý@3Ö@3Ï@3È@3Á@3º@3³@3¬@3¥@3ž@3—@3@3‰@3‚@3{@3t@3m@3f@3_@3X@3Q@3J@3C@3<@35@3.@3'@3 @3@3@3 @3@3ý?3ö?3ï?3è?3á?3Ú?3Ó?3Ì?3Å?3¾?3·?3°?3©?3¢?3›?3”?3?3†?3?3x?3q?3j?3c?3\?3U?3N?3G?3@?39?32?3+?3$?3?3?3?3?3?3ú>3ó>3ì>3å>3Þ>3×>3Ð>3É>3Â>3»>3´>3­>3¦>3Ÿ>3˜>3‘>3Š>3ƒ>3|>3u>3n>3g>3`>3Y>3R>3K>3D>3=>36>3/>3(>3!>3>3>3 >3>3þ=3÷=3ð=3é=3â=3Û=3Ô=3Í=3Æ=3¿=3¸=3±=3ª=3£=3œ=3•=3Ž=3‡=3€=3y=3r=3k=3d=3]=3V=3O=3H=3A=3:=33=3,=3%=3=3=3=3 =3=3û<3ô<3í<3æ<3ß<3Ø<3Ñ<3Ê<3Ã<3¼<3µ<3®<3§<3 <3™<3’<3‹<3„<3}<3v<3o<3h<3a<3Z<3S<3L<3E<3><37<30<3)<3"<3<3<3 <3<3ÿ;3ø;3ñ;3ê;3ã;3Ü;3Õ;3Î;3Ç;3À;3¹;3²;3«;3¤;3;3–;3;3ˆ;3;3z;3s;3l;3e;3^;3W;3P;3I;3B;3;;34;3-;3&;3;3;3;3 ;3;3ü:3õ:3î:3ç:3à:3Ù:3Ò:3Ë:3Ä:3½:3¶:3¯:3¨:3¡:3š:3“:3Œ:3…:3~:3w:3p:3i:3b:3[:3T:3M:3F:3?:38:31:3*:3#:3:3:3:3:3:3ù93ò93ë93ä93Ý93Ö93Ï93È93Á93º93³93¬93¥93ž93—9393‰93‚93{93t93m93f93_93X93Q93J93C93<93593.93'93 939393 9393ý83ö83ï83è83á83Ú83Ó83Ì83Å83¾83·83°83©83¢83›83”8383†8383x83q83j83c83\83U83N83G83@83983283+83$838383838383ú73ó73ì73å73Þ73×73Ð73É73Â73»73´73­73¦73Ÿ73˜73‘73Š73ƒ73|73u73n73g73`73Y73R73K73D73=73673/73(73!737373 7373þ63÷63ð63é63â63Û63Ô63Í63Æ63¿63¸63±63ª63£63œ63•63Ž63‡63€63y63r63k63d63]63V63O63H63A63:63363,63%63636363 6363û53ô53í53æ53ß53Ø53Ñ53Ê53Ã53¼53µ53®53§53 53™53’53‹53„53}53v53o53h53a53Z53S53L53E53>53753053)53"535353 5353ÿ43ø43ñ43ê43ã43Ü43Õ43Î43Ç43À43¹43²43«43¤4343–4343ˆ4343z43s43l43e43^43W43P43I43B43;43443-43&43434343 4343ü33õ33î33ç33à33Ù33Ò33Ë33Ä33½33¶33¯33¨33¡33š33“33Œ33…33~33w33p33i33b33[33T33M33F33?33833133*33#333333333333ù23ò23ë23ä23Ý23Ö23Ï23È23Á23º23³23¬23¥23ž23—2323‰23‚23{23t23m23f23_23X23Q23J23C23<23523.23'23 232323 2323ý13ö13ï13è13á13Ú13Ó13Ì13Å13¾13·13°13©13¢13›13”1313†1313x13q13j13c13\13U13N13G13@13913213+13$131313131313ú03ó03ì03å03Þ03×03Ð03É03Â03»03´03­03¦03Ÿ03˜03‘03Š03ƒ03|03u03n03g03`03Y03R03K03D03=03603/03(03!030303 0303þ/3÷/3ð/3é/3â/3Û/3Ô/3Í/3Æ/3¿/3¸/3±/3ª/3£/3œ/3•/3Ž/3‡/3€/3y/3r/3k/3d/3]/3V/3O/3H/3A/3:/33/3,/3%/3/3/3/3 /3/3û.3ô.3í.3æ.3ß.3Ø.3Ñ.3Ê.3Ã.3¼.3µ.3®.3§.3 .3™.3’.3‹.3„.3}.3v.3o.3h.3a.3Z.3S.3L.3E.3>.37.30.3).3".3.3.3 .3.3ÿ-3ø-3ñ-3ê-3ã-3Ü-3Õ-3Î-3Ç-3À-3¹-3²-3«-3¤-3-3–-3-3ˆ-3-3z-3s-3l-3e-3^-3W-3P-3I-3B-3;-34-3--3&-3-3-3-3 -3-3ü,3õ,3î,3ç,3à,3Ù,3Ò,3Ë,3Ä,3½,3¶,3¯,3¨,3¡,3š,3“,3Œ,3…,3~,3w,3p,3i,3b,3[,3T,3M,3F,3?,38,31,3*,3#,3,3,3,3,3,3ù+3ò+3ë+3ä+3Ý+3Ö+3Ï+3È+3Á+3º+3³+3¬+3¥+3ž+3—+3+3‰+3‚+3{+3t+3m+3f+3_+3X+3Q+3J+3C+3<+35+3.+3'+3 +3+3+3 +3+3ý*3ö*3ï*3è*3á*3Ú*3Ó*3Ì*3Å*3¾*3·*3°*3©*3¢*3›*3”*3*3†*3*3x*3q*3j*3c*3\*3U*3N*3G*3@*39*32*3+*3$*3*3*3*3*3*3ú)3ó)3ì)3å)3Þ)3×)3Ð)3É)3Â)3»)3´)3­)3¦)3Ÿ)3˜)3‘)3Š)3ƒ)3|)3u)3n)3g)3`)3Y)3R)3K)3D)3=)36)3/)3()3!)3)3)3 )3)3þ(3÷(3ð(3é(3â(3Û(3Ô(3Í(3Æ(3¿(3¸(3±(3ª(3£(3œ(3•(3Ž(3‡(3€(3y(3r(3k(3d(3](3V(3O(3H(3A(3:(33(3,(3%(3(3(3(3 (3(3û'3ô'3í'3æ'3ß'3Ø'3Ñ'3Ê'3Ã'3¼'3µ'3®'3§'3 '3™'3’'3‹'3„'3}'3v'3o'3h'3a'3Z'3S'3L'3E'3>'37'30'3)'3"'3'3'3 '3'3ÿ&3ø&3ñ&3ê&3ã&3Ü&3Õ&3Î&3Ç&3À&3¹&3²&3«&3¤&3&3–&3&3ˆ&3&3z&3s&3l&3e&3^&3W&3P&3I&3B&3;&34&3-&3&&3&3&3&3 &3&3ü%3õ%3î%3ç%3à%3Ù%3Ò%3Ë%3Ä%3½%3¶%3¯%3¨%3¡%3š%3“%3Œ%3…%3~%3w%3p%3i%3b%3[%3T%3M%3F%3?%38%31%3*%3#%3%3%3%3%3%3ù$3ò$3ë$3ä$3Ý$3Ö$3Ï$3È$3Á$3º$3³$3¬$3¥$3ž$3—$3$3‰$3‚$3{$3t$3m$3f$3_$3X$3Q$3J$3C$3<$35$3.$3'$3 $3$3$3 $3$3ý#3ö#3ï#3è#3á#3Ú#3Ó#3Ì#3Å#3¾#3·#3°#3©#3¢#3›#3”#3#3†#3#3x#3q#3j#3c#3\#3U#3N#3G#3@#39#32#3+#3$#3#3#3#3#3#3ú"3ó"3ì"3å"3Þ"3×"3Ð"3É"3Â"3»"3´"3­"3¦"3Ÿ"3˜"3‘"3Š"3ƒ"3|"3u"3n"3g"3`"3Y"3R"3K"3D"3="36"3/"3("3!"3"3"3 "3"3þ!3÷!3ð!3é!3â!3Û!3Ô!3Í!3Æ!3¿!3¸!3±!3ª!3£!3œ!3•!3Ž!3‡!3€!3y!3r!3k!3d!3]!3V!3O!3H!3A!3:!33!3,!3%!3!3!3!3 !3!3û 3ô 3í 3æ 3ß 3Ø 3Ñ 3Ê 3à 3¼ 3µ 3® 3§ 3  3™ 3’ 3‹ 3„ 3} 3v 3o 3h 3a 3Z 3S 3L 3E 3> 37 30 3) 3" 3 3 3 3 3ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú 3ó 3ì 3å 3Þ 3× 3Ð 3É 3 3» 3´ 3­ 3¦ 3Ÿ 3˜ 3‘ 3Š 3ƒ 3| 3u 3n 3g 3` 3Y 3R 3K 3D 3= 36 3/ 3( 3! 3 3 3 3 3þ 3÷ 3ð 3é 3â 3Û 3Ô 3Í 3Æ 3¿ 3¸ 3± 3ª 3£ 3œ 3• 3Ž 3‡ 3€ 3y 3r 3k 3d 3] 3V 3O 3H 3A 3: 33 3, 3% 3 3 3 3 3 3û 3ô 3í 3æ 3ß 3Ø 3Ñ 3Ê 3à 3¼ 3µ 3® 3§ 3  3™ 3’ 3‹ 3„ 3} 3v 3o 3h 3a 3Z 3S 3L 3E 3> 37 30 3) 3" 3 3 3 3 3ÿ 3ø 3ñ 3ê 3ã 3Ü 3Õ 3Î 3Ç 3À 3¹ 3² 3« 3¤ 3 3– 3 3ˆ 3 3z 3s 3l 3e 3^ 3W 3P 3I 3B 3; 34 3- 3& 3 3 3 3 3 3ü 3õ 3î 3ç 3à 3Ù 3Ò 3Ë 3Ä 3½ 3¶ 3¯ 3¨ 3¡ 3š 3“ 3Œ 3… 3~ 3w 3p 3i 3b 3[ 3T 3M 3F 3? 38 31 3* 3# 3 3 3 3 3 3ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333úÿ2óÿ2ìÿ2åÿ2Þÿ2×ÿ2Ðÿ2Éÿ2Âÿ2»ÿ2´ÿ2­ÿ2¦ÿ2Ÿÿ2˜ÿ2‘ÿ2Šÿ2ƒÿ2|ÿ2uÿ2nÿ2gÿ2`ÿ2Yÿ2Rÿ2Kÿ2Dÿ2=ÿ26ÿ2/ÿ2(ÿ2!ÿ2ÿ2ÿ2 ÿ2ÿ2þþ2÷þ2ðþ2éþ2âþ2Ûþ2Ôþ2Íþ2Æþ2¿þ2¸þ2±þ2ªþ2£þ2œþ2•þ2Žþ2‡þ2€þ2yþ2rþ2kþ2dþ2]þ2Vþ2Oþ2Hþ2Aþ2:þ23þ2,þ2%þ2þ2þ2þ2 þ2þ2ûý2ôý2íý2æý2ßý2Øý2Ñý2Êý2Ãý2¼ý2µý2®ý2§ý2 ý2™ý2’ý2‹ý2„ý2}ý2vý2oý2hý2aý2Zý2Sý2Lý2Eý2>ý27ý20ý2)ý2"ý2ý2ý2 ý2ý2ÿü2øü2ñü2êü2ãü2Üü2Õü2Îü2Çü2Àü2¹ü2²ü2«ü2¤ü2ü2–ü2ü2ˆü2ü2zü2sü2lü2eü2^ü2Wü2Pü2Iü2Bü2;ü24ü2-ü2&ü2ü2ü2ü2 ü2ü2üû2õû2îû2çû2àû2Ùû2Òû2Ëû2Äû2½û2¶û2¯û2¨û2¡û2šû2“û2Œû2…û2~û2wû2pû2iû2bû2[û2Tû2Mû2Fû2?û28û21û2*û2#û2û2û2û2û2û2ùú2òú2ëú2äú2Ýú2Öú2Ïú2Èú2Áú2ºú2³ú2¬ú2¥ú2žú2—ú2ú2‰ú2‚ú2{ú2tú2mú2fú2_ú2Xú2Qú2Jú2Cú2<ú25ú2.ú2'ú2 ú2ú2ú2 ú2ú2ýù2öù2ïù2èù2áù2Úù2Óù2Ìù2Åù2¾ù2·ù2°ù2©ù2¢ù2›ù2”ù2ù2†ù2ù2xù2qù2jù2cù2\ù2Uù2Nù2Gù2@ù29ù22ù2+ù2$ù2ù2ù2ù2ù2ù2úø2óø2ìø2åø2Þø2×ø2Ðø2Éø2Âø2»ø2´ø2­ø2¦ø2Ÿø2˜ø2‘ø2Šø2ƒø2|ø2uø2nø2gø2`ø2Yø2Rø2Kø2Dø2=ø26ø2/ø2(ø2!ø2ø2ø2 ø2ø2þ÷2÷÷2ð÷2é÷2â÷2Û÷2Ô÷2Í÷2Æ÷2¿÷2¸÷2±÷2ª÷2£÷2œ÷2•÷2Ž÷2‡÷2€÷2y÷2r÷2k÷2d÷2]÷2V÷2O÷2H÷2A÷2:÷23÷2,÷2%÷2÷2÷2÷2 ÷2÷2ûö2ôö2íö2æö2ßö2Øö2Ñö2Êö2Ãö2¼ö2µö2®ö2§ö2 ö2™ö2’ö2‹ö2„ö2}ö2vö2oö2hö2aö2Zö2Sö2Lö2Eö2>ö27ö20ö2)ö2"ö2ö2ö2 ö2ö2ÿõ2øõ2ñõ2êõ2ãõ2Üõ2Õõ2Îõ2Çõ2Àõ2¹õ2²õ2«õ2¤õ2õ2–õ2õ2ˆõ2õ2zõ2sõ2lõ2eõ2^õ2Wõ2Põ2Iõ2Bõ2;õ24õ2-õ2&õ2õ2õ2õ2 õ2õ2üô2õô2îô2çô2àô2Ùô2Òô2Ëô2Äô2½ô2¶ô2¯ô2¨ô2¡ô2šô2“ô2Œô2…ô2~ô2wô2pô2iô2bô2[ô2Tô2Mô2Fô2?ô28ô21ô2*ô2#ô2ô2ô2ô2ô2ô2ùó2òó2ëó2äó2Ýó2Öó2Ïó2Èó2Áó2ºó2³ó2¬ó2¥ó2žó2—ó2ó2‰ó2‚ó2{ó2tó2mó2fó2_ó2Xó2Qó2Jó2Có2<ó25ó2.ó2'ó2 ó2ó2ó2 ó2ó2ýò2öò2ïò2èò2áò2Úò2Óò2Ìò2Åò2¾ò2·ò2°ò2©ò2¢ò2›ò2”ò2ò2†ò2ò2xò2qò2jò2cò2\ò2Uò2Nò2Gò2@ò29ò22ò2+ò2$ò2ò2ò2ò2ò2ò2úñ2óñ2ìñ2åñ2Þñ2×ñ2Ðñ2Éñ2Âñ2»ñ2´ñ2­ñ2¦ñ2Ÿñ2˜ñ2‘ñ2Šñ2ƒñ2|ñ2uñ2nñ2gñ2`ñ2Yñ2Rñ2Kñ2Dñ2=ñ26ñ2/ñ2(ñ2!ñ2ñ2ñ2 ñ2ñ2þð2÷ð2ðð2éð2âð2Ûð2Ôð2Íð2Æð2¿ð2¸ð2±ð2ªð2£ð2œð2•ð2Žð2‡ð2€ð2yð2rð2kð2dð2]ð2Vð2Oð2Hð2Að2:ð23ð2,ð2%ð2ð2ð2ð2 ð2ð2ûï2ôï2íï2æï2ßï2Øï2Ñï2Êï2Ãï2¼ï2µï2®ï2§ï2 ï2™ï2’ï2‹ï2„ï2}ï2vï2oï2hï2aï2Zï2Sï2Lï2Eï2>ï27ï20ï2)ï2"ï2ï2ï2 ï2ï2ÿî2øî2ñî2êî2ãî2Üî2Õî2Îî2Çî2Àî2¹î2²î2«î2¤î2î2–î2î2ˆî2î2zî2sî2lî2eî2^î2Wî2Pî2Iî2Bî2;î24î2-î2&î2î2î2î2 î2î2üí2õí2îí2çí2àí2Ùí2Òí2Ëí2Äí2½í2¶í2¯í2¨í2¡í2ší2“í2Œí2…í2~í2wí2pí2ií2bí2[í2Tí2Mí2Fí2?í28í21í2*í2#í2í2í2í2í2í2ùì2òì2ëì2äì2Ýì2Öì2Ïì2Èì2Áì2ºì2³ì2¬ì2¥ì2žì2—ì2ì2‰ì2‚ì2{ì2tì2mì2fì2_ì2Xì2Qì2Jì2Cì2<ì25ì2.ì2'ì2 ì2ì2ì2 ì2ì2ýë2öë2ïë2èë2áë2Úë2Óë2Ìë2Åë2¾ë2·ë2°ë2©ë2¢ë2›ë2”ë2ë2†ë2ë2xë2që2jë2cë2\ë2Uë2Në2Gë2@ë29ë22ë2+ë2$ë2ë2ë2ë2ë2ë2úê2óê2ìê2åê2Þê2×ê2Ðê2Éê2Âê2»ê2´ê2­ê2¦ê2Ÿê2˜ê2‘ê2Šê2ƒê2|ê2uê2nê2gê2`ê2Yê2Rê2Kê2Dê2=ê26ê2/ê2(ê2!ê2ê2ê2 ê2ê2þé2÷é2ðé2éé2âé2Ûé2Ôé2Íé2Æé2¿é2¸é2±é2ªé2£é2œé2•é2Žé2‡é2€é2yé2ré2ké2dé2]é2Vé2Oé2Hé2Aé2:é23é2,é2%é2é2é2é2 é2é2ûè2ôè2íè2æè2ßè2Øè2Ñè2Êè2Ãè2¼è2µè2®è2§è2 è2™è2’è2‹è2„è2}è2vè2oè2hè2aè2Zè2Sè2Lè2Eè2>è27è20è2)è2"è2è2è2 è2è2ÿç2øç2ñç2êç2ãç2Üç2Õç2Îç2Çç2Àç2¹ç2²ç2«ç2¤ç2ç2–ç2ç2ˆç2ç2zç2sç2lç2eç2^ç2Wç2Pç2Iç2Bç2;ç24ç2-ç2&ç2ç2ç2ç2 ç2ç2üæ2õæ2îæ2çæ2àæ2Ùæ2Òæ2Ëæ2Äæ2½æ2¶æ2¯æ2¨æ2¡æ2šæ2“æ2Œæ2…æ2~æ2wæ2pæ2iæ2bæ2[æ2Tæ2Mæ2Fæ2?æ28æ21æ2*æ2#æ2æ2æ2æ2æ2æ2ùå2òå2ëå2äå2Ýå2Öå2Ïå2Èå2Áå2ºå2³å2¬å2¥å2žå2—å2å2‰å2‚å2{å2tå2må2få2_å2Xå2Qå2Jå2Cå2<å25å2.å2'å2 å2å2å2 å2å2ýä2öä2ïä2èä2áä2Úä2Óä2Ìä2Åä2¾ä2·ä2°ä2©ä2¢ä2›ä2”ä2ä2†ä2ä2xä2qä2jä2cä2\ä2Uä2Nä2Gä2@ä29ä22ä2+ä2$ä2ä2ä2ä2ä2ä2úã2óã2ìã2åã2Þã2×ã2Ðã2Éã2Âã2»ã2´ã2­ã2¦ã2Ÿã2˜ã2‘ã2Šã2ƒã2|ã2uã2nã2gã2`ã2Yã2Rã2Kã2Dã2=ã26ã2/ã2(ã2!ã2ã2ã2 ã2ã2þâ2÷â2ðâ2éâ2ââ2Ûâ2Ôâ2Íâ2Æâ2¿â2¸â2±â2ªâ2£â2œâ2•â2Žâ2‡â2€â2yâ2râ2kâ2dâ2]â2Vâ2Oâ2Hâ2Aâ2:â23â2,â2%â2â2â2â2 â2â2ûá2ôá2íá2æá2ßá2Øá2Ñá2Êá2Ãá2¼á2µá2®á2§á2 á2™á2’á2‹á2„á2}á2vá2oá2há2aá2Zá2Sá2Lá2Eá2>á27á20á2)á2"á2á2á2 á2á2ÿà2øà2ñà2êà2ãà2Üà2Õà2Îà2Çà2Àà2¹à2²à2«à2¤à2à2–à2à2ˆà2à2zà2sà2là2eà2^à2Wà2Pà2Ià2Bà2;à24à2-à2&à2à2à2à2 à2à2üß2õß2îß2çß2àß2Ùß2Òß2Ëß2Äß2½ß2¶ß2¯ß2¨ß2¡ß2šß2“ß2Œß2…ß2~ß2wß2pß2iß2bß2[ß2Tß2Mß2Fß2?ß28ß21ß2*ß2#ß2ß2ß2ß2ß2ß2ùÞ2òÞ2ëÞ2äÞ2ÝÞ2ÖÞ2ÏÞ2ÈÞ2ÁÞ2ºÞ2³Þ2¬Þ2¥Þ2žÞ2—Þ2Þ2‰Þ2‚Þ2{Þ2tÞ2mÞ2fÞ2_Þ2XÞ2QÞ2JÞ2CÞ2<Þ25Þ2.Þ2'Þ2 Þ2Þ2Þ2 Þ2Þ2ýÝ2öÝ2ïÝ2èÝ2áÝ2ÚÝ2ÓÝ2ÌÝ2ÅÝ2¾Ý2·Ý2°Ý2©Ý2¢Ý2›Ý2”Ý2Ý2†Ý2Ý2xÝ2qÝ2jÝ2cÝ2\Ý2UÝ2NÝ2GÝ2@Ý29Ý22Ý2+Ý2$Ý2Ý2Ý2Ý2Ý2Ý2úÜ2óÜ2ìÜ2åÜ2ÞÜ2×Ü2ÐÜ2ÉÜ2ÂÜ2»Ü2´Ü2­Ü2¦Ü2ŸÜ2˜Ü2‘Ü2ŠÜ2ƒÜ2|Ü2uÜ2nÜ2gÜ2`Ü2YÜ2RÜ2KÜ2DÜ2=Ü26Ü2/Ü2(Ü2!Ü2Ü2Ü2 Ü2Ü2þÛ2÷Û2ðÛ2éÛ2âÛ2ÛÛ2ÔÛ2ÍÛ2ÆÛ2¿Û2¸Û2±Û2ªÛ2£Û2œÛ2•Û2ŽÛ2‡Û2€Û2yÛ2rÛ2kÛ2dÛ2]Û2VÛ2OÛ2HÛ2AÛ2:Û23Û2,Û2%Û2Û2Û2Û2 Û2Û2ûÚ2ôÚ2íÚ2æÚ2ßÚ2ØÚ2ÑÚ2ÊÚ2ÃÚ2¼Ú2µÚ2®Ú2§Ú2 Ú2™Ú2’Ú2‹Ú2„Ú2}Ú2vÚ2oÚ2hÚ2aÚ2ZÚ2SÚ2LÚ2EÚ2>Ú27Ú20Ú2)Ú2"Ú2Ú2Ú2 Ú2Ú2ÿÙ2øÙ2ñÙ2êÙ2ãÙ2ÜÙ2ÕÙ2ÎÙ2ÇÙ2ÀÙ2¹Ù2²Ù2«Ù2¤Ù2Ù2–Ù2Ù2ˆÙ2Ù2zÙ2sÙ2lÙ2eÙ2^Ù2WÙ2PÙ2IÙ2BÙ2;Ù24Ù2-Ù2&Ù2Ù2Ù2Ù2 Ù2Ù2üØ2õØ2îØ2çØ2àØ2ÙØ2ÒØ2ËØ2ÄØ2½Ø2¶Ø2¯Ø2¨Ø2¡Ø2šØ2“Ø2ŒØ2…Ø2~Ø2wØ2pØ2iØ2bØ2[Ø2TØ2MØ2FØ2?Ø28Ø21Ø2*Ø2#Ø2Ø2Ø2Ø2Ø2Ø2ù×2ò×2ë×2ä×2Ý×2Ö×2Ï×2È×2Á×2º×2³×2¬×2¥×2ž×2—×2×2‰×2‚×2{×2t×2m×2f×2_×2X×2Q×2J×2C×2<×25×2.×2'×2 ×2×2×2 ×2×2ýÖ2öÖ2ïÖ2èÖ2áÖ2ÚÖ2ÓÖ2ÌÖ2ÅÖ2¾Ö2·Ö2°Ö2©Ö2¢Ö2›Ö2”Ö2Ö2†Ö2Ö2xÖ2qÖ2jÖ2cÖ2\Ö2UÖ2NÖ2GÖ2@Ö29Ö22Ö2+Ö2$Ö2Ö2Ö2Ö2Ö2Ö2úÕ2óÕ2ìÕ2åÕ2ÞÕ2×Õ2ÐÕ2ÉÕ2ÂÕ2»Õ2´Õ2­Õ2¦Õ2ŸÕ2˜Õ2‘Õ2ŠÕ2ƒÕ2|Õ2uÕ2nÕ2gÕ2`Õ2YÕ2RÕ2KÕ2DÕ2=Õ26Õ2/Õ2(Õ2!Õ2Õ2Õ2 Õ2Õ2þÔ2÷Ô2ðÔ2éÔ2âÔ2ÛÔ2ÔÔ2ÍÔ2ÆÔ2¿Ô2¸Ô2±Ô2ªÔ2£Ô2œÔ2•Ô2ŽÔ2‡Ô2€Ô2yÔ2rÔ2kÔ2dÔ2]Ô2VÔ2OÔ2HÔ2AÔ2:Ô23Ô2,Ô2%Ô2Ô2Ô2Ô2 Ô2Ô2ûÓ2ôÓ2íÓ2æÓ2ßÓ2ØÓ2ÑÓ2ÊÓ2ÃÓ2¼Ó2µÓ2®Ó2§Ó2 Ó2™Ó2’Ó2‹Ó2„Ó2}Ó2vÓ2oÓ2hÓ2aÓ2ZÓ2SÓ2LÓ2EÓ2>Ó27Ó20Ó2)Ó2"Ó2Ó2Ó2 Ó2Ó2ÿÒ2øÒ2ñÒ2êÒ2ãÒ2ÜÒ2ÕÒ2ÎÒ2ÇÒ2ÀÒ2¹Ò2²Ò2«Ò2¤Ò2Ò2–Ò2Ò2ˆÒ2Ò2zÒ2sÒ2lÒ2eÒ2^Ò2WÒ2PÒ2IÒ2BÒ2;Ò24Ò2-Ò2&Ò2Ò2Ò2Ò2 Ò2Ò2üÑ2õÑ2îÑ2çÑ2àÑ2ÙÑ2ÒÑ2ËÑ2ÄÑ2½Ñ2¶Ñ2¯Ñ2¨Ñ2¡Ñ2šÑ2“Ñ2ŒÑ2…Ñ2~Ñ2wÑ2pÑ2iÑ2bÑ2[Ñ2TÑ2MÑ2FÑ2?Ñ28Ñ21Ñ2*Ñ2#Ñ2Ñ2Ñ2Ñ2Ñ2Ñ2ùÐ2òÐ2ëÐ2äÐ2ÝÐ2ÖÐ2ÏÐ2ÈÐ2ÁÐ2ºÐ2³Ð2¬Ð2¥Ð2žÐ2—Ð2Ð2‰Ð2‚Ð2{Ð2tÐ2mÐ2fÐ2_Ð2XÐ2QÐ2JÐ2CÐ2<Ð25Ð2.Ð2'Ð2 Ð2Ð2Ð2 Ð2Ð2ýÏ2öÏ2ïÏ2èÏ2áÏ2ÚÏ2ÓÏ2ÌÏ2ÅÏ2¾Ï2·Ï2°Ï2©Ï2¢Ï2›Ï2”Ï2Ï2†Ï2Ï2xÏ2qÏ2jÏ2cÏ2\Ï2UÏ2NÏ2GÏ2@Ï29Ï22Ï2+Ï2$Ï2Ï2Ï2Ï2Ï2Ï2úÎ2óÎ2ìÎ2åÎ2ÞÎ2×Î2ÐÎ2ÉÎ2ÂÎ2»Î2´Î2­Î2¦Î2ŸÎ2˜Î2‘Î2ŠÎ2ƒÎ2|Î2uÎ2nÎ2gÎ2`Î2YÎ2RÎ2KÎ2DÎ2=Î26Î2/Î2(Î2!Î2Î2Î2 Î2Î2þÍ2÷Í2ðÍ2éÍ2âÍ2ÛÍ2ÔÍ2ÍÍ2ÆÍ2¿Í2¸Í2±Í2ªÍ2£Í2œÍ2•Í2ŽÍ2‡Í2€Í2yÍ2rÍ2kÍ2dÍ2]Í2VÍ2OÍ2HÍ2AÍ2:Í23Í2,Í2%Í2Í2Í2Í2 Í2Í2ûÌ2ôÌ2íÌ2æÌ2ßÌ2ØÌ2ÑÌ2ÊÌ2ÃÌ2¼Ì2µÌ2®Ì2§Ì2 Ì2™Ì2’Ì2‹Ì2„Ì2}Ì2vÌ2oÌ2hÌ2aÌ2ZÌ2SÌ2LÌ2EÌ2>Ì27Ì20Ì2)Ì2"Ì2Ì2Ì2 Ì2Ì2ÿË2øË2ñË2êË2ãË2ÜË2ÕË2ÎË2ÇË2ÀË2¹Ë2²Ë2«Ë2¤Ë2Ë2–Ë2Ë2ˆË2Ë2zË2sË2lË2eË2^Ë2WË2PË2IË2BË2;Ë24Ë2-Ë2&Ë2Ë2Ë2Ë2 Ë2Ë2üÊ2õÊ2îÊ2çÊ2àÊ2ÙÊ2ÒÊ2ËÊ2ÄÊ2½Ê2¶Ê2¯Ê2¨Ê2¡Ê2šÊ2“Ê2ŒÊ2…Ê2~Ê2wÊ2pÊ2iÊ2bÊ2[Ê2TÊ2MÊ2FÊ2?Ê28Ê21Ê2*Ê2#Ê2Ê2Ê2Ê2Ê2Ê2ùÉ2òÉ2ëÉ2äÉ2ÝÉ2ÖÉ2ÏÉ2ÈÉ2ÁÉ2ºÉ2³É2¬É2¥É2žÉ2—É2É2‰É2‚É2{É2tÉ2mÉ2fÉ2_É2XÉ2QÉ2JÉ2CÉ2<É25É2.É2'É2 É2É2É2 É2É2ýÈ2öÈ2ïÈ2èÈ2áÈ2ÚÈ2ÓÈ2ÌÈ2ÅÈ2¾È2·È2°È2©È2¢È2›È2”È2È2†È2È2xÈ2qÈ2jÈ2cÈ2\È2UÈ2NÈ2GÈ2@È29È22È2+È2$È2È2È2È2È2È2úÇ2óÇ2ìÇ2åÇ2ÞÇ2×Ç2ÐÇ2ÉÇ2ÂÇ2»Ç2´Ç2­Ç2¦Ç2ŸÇ2˜Ç2‘Ç2ŠÇ2ƒÇ2|Ç2uÇ2nÇ2gÇ2`Ç2YÇ2RÇ2KÇ2DÇ2=Ç26Ç2/Ç2(Ç2!Ç2Ç2Ç2 Ç2Ç2þÆ2÷Æ2ðÆ2éÆ2âÆ2ÛÆ2ÔÆ2ÍÆ2ÆÆ2¿Æ2¸Æ2±Æ2ªÆ2£Æ2œÆ2•Æ2ŽÆ2‡Æ2€Æ2yÆ2rÆ2kÆ2dÆ2]Æ2VÆ2OÆ2HÆ2AÆ2:Æ23Æ2,Æ2%Æ2Æ2Æ2Æ2 Æ2Æ2ûÅ2ôÅ2íÅ2æÅ2ßÅ2ØÅ2ÑÅ2ÊÅ2ÃÅ2¼Å2µÅ2®Å2§Å2 Å2™Å2’Å2‹Å2„Å2}Å2vÅ2oÅ2hÅ2aÅ2ZÅ2SÅ2LÅ2EÅ2>Å27Å20Å2)Å2"Å2Å2Å2 Å2Å2ÿÄ2øÄ2ñÄ2êÄ2ãÄ2ÜÄ2ÕÄ2ÎÄ2ÇÄ2ÀÄ2¹Ä2²Ä2«Ä2¤Ä2Ä2–Ä2Ä2ˆÄ2Ä2zÄ2sÄ2lÄ2eÄ2^Ä2WÄ2PÄ2IÄ2BÄ2;Ä24Ä2-Ä2&Ä2Ä2Ä2Ä2 Ä2Ä2üÃ2õÃ2îÃ2çÃ2àÃ2ÙÃ2ÒÃ2ËÃ2ÄÃ2½Ã2¶Ã2¯Ã2¨Ã2¡Ã2šÃ2“Ã2ŒÃ2…Ã2~Ã2wÃ2pÃ2iÃ2bÃ2[Ã2TÃ2MÃ2FÃ2?Ã28Ã21Ã2*Ã2#Ã2Ã2Ã2Ã2Ã2Ã2ùÂ2òÂ2ëÂ2äÂ2ÝÂ2ÖÂ2ÏÂ2ÈÂ2ÁÂ2ºÂ2³Â2¬Â2¥Â2žÂ2—Â2Â2‰Â2‚Â2{Â2tÂ2mÂ2fÂ2_Â2XÂ2QÂ2JÂ2CÂ2<Â25Â2.Â2'Â2 Â2Â2Â2 Â2Â2ýÁ2öÁ2ïÁ2èÁ2áÁ2ÚÁ2ÓÁ2ÌÁ2ÅÁ2¾Á2·Á2°Á2©Á2¢Á2›Á2”Á2Á2†Á2Á2xÁ2qÁ2jÁ2cÁ2\Á2UÁ2NÁ2GÁ2@Á29Á22Á2+Á2$Á2Á2Á2Á2Á2Á2úÀ2óÀ2ìÀ2åÀ2ÞÀ2×À2ÐÀ2ÉÀ2ÂÀ2»À2´À2­À2¦À2ŸÀ2˜À2‘À2ŠÀ2ƒÀ2|À2uÀ2nÀ2gÀ2`À2YÀ2RÀ2KÀ2DÀ2=À26À2/À2(À2!À2À2À2 À2À2þ¿2÷¿2ð¿2é¿2â¿2Û¿2Ô¿2Í¿2Æ¿2¿¿2¸¿2±¿2ª¿2£¿2œ¿2•¿2Ž¿2‡¿2€¿2y¿2r¿2k¿2d¿2]¿2V¿2O¿2H¿2A¿2:¿23¿2,¿2%¿2¿2¿2¿2 ¿2¿2û¾2ô¾2í¾2æ¾2ß¾2ؾ2Ѿ2ʾ2þ2¼¾2µ¾2®¾2§¾2 ¾2™¾2’¾2‹¾2„¾2}¾2v¾2o¾2h¾2a¾2Z¾2S¾2L¾2E¾2>¾27¾20¾2)¾2"¾2¾2¾2 ¾2¾2ÿ½2ø½2ñ½2ê½2ã½2ܽ2Õ½2ν2ǽ2À½2¹½2²½2«½2¤½2½2–½2½2ˆ½2½2z½2s½2l½2e½2^½2W½2P½2I½2B½2;½24½2-½2&½2½2½2½2 ½2½2ü¼2õ¼2î¼2ç¼2à¼2Ù¼2Ò¼2˼2ļ2½¼2¶¼2¯¼2¨¼2¡¼2š¼2“¼2Œ¼2…¼2~¼2w¼2p¼2i¼2b¼2[¼2T¼2M¼2F¼2?¼28¼21¼2*¼2#¼2¼2¼2¼2¼2¼2ù»2ò»2ë»2ä»2Ý»2Ö»2Ï»2È»2Á»2º»2³»2¬»2¥»2ž»2—»2»2‰»2‚»2{»2t»2m»2f»2_»2X»2Q»2J»2C»2<»25»2.»2'»2 »2»2»2 »2»2ýº2öº2ïº2èº2áº2Úº2Óº2̺2ź2¾º2·º2°º2©º2¢º2›º2”º2º2†º2º2xº2qº2jº2cº2\º2Uº2Nº2Gº2@º29º22º2+º2$º2º2º2º2º2º2ú¹2ó¹2ì¹2å¹2Þ¹2×¹2й2ɹ2¹2»¹2´¹2­¹2¦¹2Ÿ¹2˜¹2‘¹2й2ƒ¹2|¹2u¹2n¹2g¹2`¹2Y¹2R¹2K¹2D¹2=¹26¹2/¹2(¹2!¹2¹2¹2 ¹2¹2þ¸2÷¸2ð¸2é¸2â¸2Û¸2Ô¸2͸2Ƹ2¿¸2¸¸2±¸2ª¸2£¸2œ¸2•¸2ޏ2‡¸2€¸2y¸2r¸2k¸2d¸2]¸2V¸2O¸2H¸2A¸2:¸23¸2,¸2%¸2¸2¸2¸2 ¸2¸2û·2ô·2í·2æ·2ß·2Ø·2Ñ·2Ê·2÷2¼·2µ·2®·2§·2 ·2™·2’·2‹·2„·2}·2v·2o·2h·2a·2Z·2S·2L·2E·2>·27·20·2)·2"·2·2·2 ·2·2ÿ¶2ø¶2ñ¶2ê¶2ã¶2ܶ2Õ¶2ζ2Ƕ2À¶2¹¶2²¶2«¶2¤¶2¶2–¶2¶2ˆ¶2¶2z¶2s¶2l¶2e¶2^¶2W¶2P¶2I¶2B¶2;¶24¶2-¶2&¶2¶2¶2¶2 ¶2¶2üµ2õµ2îµ2çµ2àµ2Ùµ2Òµ2˵2ĵ2½µ2¶µ2¯µ2¨µ2¡µ2šµ2“µ2Œµ2…µ2~µ2wµ2pµ2iµ2bµ2[µ2Tµ2Mµ2Fµ2?µ28µ21µ2*µ2#µ2µ2µ2µ2µ2µ2ù´2ò´2ë´2ä´2Ý´2Ö´2Ï´2È´2Á´2º´2³´2¬´2¥´2ž´2—´2´2‰´2‚´2{´2t´2m´2f´2_´2X´2Q´2J´2C´2<´25´2.´2'´2 ´2´2´2 ´2´2ý³2ö³2ï³2è³2á³2Ú³2Ó³2̳2ų2¾³2·³2°³2©³2¢³2›³2”³2³2†³2³2x³2q³2j³2c³2\³2U³2N³2G³2@³29³22³2+³2$³2³2³2³2³2³2ú²2ó²2ì²2å²2Þ²2ײ2в2ɲ2²2»²2´²2­²2¦²2Ÿ²2˜²2‘²2в2ƒ²2|²2u²2n²2g²2`²2Y²2R²2K²2D²2=²26²2/²2(²2!²2²2²2 ²2²2þ±2÷±2ð±2é±2â±2Û±2Ô±2ͱ2Ʊ2¿±2¸±2±±2ª±2£±2œ±2•±2ޱ2‡±2€±2y±2r±2k±2d±2]±2V±2O±2H±2A±2:±23±2,±2%±2±2±2±2 ±2±2û°2ô°2í°2æ°2ß°2ذ2Ѱ2ʰ2ð2¼°2µ°2®°2§°2 °2™°2’°2‹°2„°2}°2v°2o°2h°2a°2Z°2S°2L°2E°2>°27°20°2)°2"°2°2°2 °2°2ÿ¯2ø¯2ñ¯2ê¯2ã¯2ܯ2Õ¯2ί2ǯ2À¯2¹¯2²¯2«¯2¤¯2¯2–¯2¯2ˆ¯2¯2z¯2s¯2l¯2e¯2^¯2W¯2P¯2I¯2B¯2;¯24¯2-¯2&¯2¯2¯2¯2 ¯2¯2ü®2õ®2î®2ç®2à®2Ù®2Ò®2Ë®2Ä®2½®2¶®2¯®2¨®2¡®2š®2“®2Œ®2…®2~®2w®2p®2i®2b®2[®2T®2M®2F®2?®28®21®2*®2#®2®2®2®2®2®2ù­2ò­2ë­2ä­2Ý­2Ö­2Ï­2È­2Á­2º­2³­2¬­2¥­2ž­2—­2­2‰­2‚­2{­2t­2m­2f­2_­2X­2Q­2J­2C­2<­25­2.­2'­2 ­2­2­2 ­2­2ý¬2ö¬2ï¬2è¬2á¬2Ú¬2Ó¬2̬2Ŭ2¾¬2·¬2°¬2©¬2¢¬2›¬2”¬2¬2†¬2¬2x¬2q¬2j¬2c¬2\¬2U¬2N¬2G¬2@¬29¬22¬2+¬2$¬2¬2¬2¬2¬2¬2ú«2ó«2ì«2å«2Þ«2׫2Ы2É«2«2»«2´«2­«2¦«2Ÿ«2˜«2‘«2Š«2ƒ«2|«2u«2n«2g«2`«2Y«2R«2K«2D«2=«26«2/«2(«2!«2«2«2 «2«2þª2÷ª2ðª2éª2âª2Ûª2Ôª2ͪ2ƪ2¿ª2¸ª2±ª2ªª2£ª2œª2•ª2Žª2‡ª2€ª2yª2rª2kª2dª2]ª2Vª2Oª2Hª2Aª2:ª23ª2,ª2%ª2ª2ª2ª2 ª2ª2û©2ô©2í©2æ©2ß©2Ø©2Ñ©2Ê©2é2¼©2µ©2®©2§©2 ©2™©2’©2‹©2„©2}©2v©2o©2h©2a©2Z©2S©2L©2E©2>©27©20©2)©2"©2©2©2 ©2©2ÿ¨2ø¨2ñ¨2ê¨2ã¨2ܨ2Õ¨2Ψ2Ǩ2À¨2¹¨2²¨2«¨2¤¨2¨2–¨2¨2ˆ¨2¨2z¨2s¨2l¨2e¨2^¨2W¨2P¨2I¨2B¨2;¨24¨2-¨2&¨2¨2¨2¨2 ¨2¨2ü§2õ§2î§2ç§2à§2Ù§2Ò§2˧2ħ2½§2¶§2¯§2¨§2¡§2š§2“§2Œ§2…§2~§2w§2p§2i§2b§2[§2T§2M§2F§2?§28§21§2*§2#§2§2§2§2§2§2ù¦2ò¦2ë¦2ä¦2ݦ2Ö¦2Ϧ2Ȧ2Á¦2º¦2³¦2¬¦2¥¦2ž¦2—¦2¦2‰¦2‚¦2{¦2t¦2m¦2f¦2_¦2X¦2Q¦2J¦2C¦2<¦25¦2.¦2'¦2 ¦2¦2¦2 ¦2¦2ý¥2ö¥2ï¥2è¥2á¥2Ú¥2Ó¥2Ì¥2Å¥2¾¥2·¥2°¥2©¥2¢¥2›¥2”¥2¥2†¥2¥2x¥2q¥2j¥2c¥2\¥2U¥2N¥2G¥2@¥29¥22¥2+¥2$¥2¥2¥2¥2¥2¥2ú¤2ó¤2ì¤2å¤2Þ¤2פ2Ф2ɤ2¤2»¤2´¤2­¤2¦¤2Ÿ¤2˜¤2‘¤2Ф2ƒ¤2|¤2u¤2n¤2g¤2`¤2Y¤2R¤2K¤2D¤2=¤26¤2/¤2(¤2!¤2¤2¤2 ¤2¤2þ£2÷£2ð£2é£2â£2Û£2Ô£2Í£2Æ£2¿£2¸£2±£2ª£2££2œ£2•£2Ž£2‡£2€£2y£2r£2k£2d£2]£2V£2O£2H£2A£2:£23£2,£2%£2£2£2£2 £2£2û¢2ô¢2í¢2æ¢2ߢ2Ø¢2Ñ¢2Ê¢2â2¼¢2µ¢2®¢2§¢2 ¢2™¢2’¢2‹¢2„¢2}¢2v¢2o¢2h¢2a¢2Z¢2S¢2L¢2E¢2>¢27¢20¢2)¢2"¢2¢2¢2 ¢2¢2ÿ¡2ø¡2ñ¡2ê¡2ã¡2Ü¡2Õ¡2Ρ2Ç¡2À¡2¹¡2²¡2«¡2¤¡2¡2–¡2¡2ˆ¡2¡2z¡2s¡2l¡2e¡2^¡2W¡2P¡2I¡2B¡2;¡24¡2-¡2&¡2¡2¡2¡2 ¡2¡2ü 2õ 2î 2ç 2à 2Ù 2Ò 2Ë 2Ä 2½ 2¶ 2¯ 2¨ 2¡ 2š 2“ 2Œ 2… 2~ 2w 2p 2i 2b 2[ 2T 2M 2F 2? 28 21 2* 2# 2 2 2 2 2 2ùŸ2òŸ2ëŸ2äŸ2ÝŸ2ÖŸ2ÏŸ2ÈŸ2ÁŸ2ºŸ2³Ÿ2¬Ÿ2¥Ÿ2žŸ2—Ÿ2Ÿ2‰Ÿ2‚Ÿ2{Ÿ2tŸ2mŸ2fŸ2_Ÿ2XŸ2QŸ2JŸ2CŸ2<Ÿ25Ÿ2.Ÿ2'Ÿ2 Ÿ2Ÿ2Ÿ2 Ÿ2Ÿ2ýž2öž2ïž2èž2áž2Úž2Óž2Ìž2Åž2¾ž2·ž2°ž2©ž2¢ž2›ž2”ž2ž2†ž2ž2xž2qž2jž2cž2\ž2Už2Nž2Gž2@ž29ž22ž2+ž2$ž2ž2ž2ž2ž2ž2ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þœ2÷œ2ðœ2éœ2âœ2Ûœ2Ôœ2Íœ2Æœ2¿œ2¸œ2±œ2ªœ2£œ2œœ2•œ2Žœ2‡œ2€œ2yœ2rœ2kœ2dœ2]œ2Vœ2Oœ2Hœ2Aœ2:œ23œ2,œ2%œ2œ2œ2œ2 œ2œ2û›2ô›2í›2æ›2ß›2Ø›2Ñ›2Ê›2Û2¼›2µ›2®›2§›2 ›2™›2’›2‹›2„›2}›2v›2o›2h›2a›2Z›2S›2L›2E›2>›27›20›2)›2"›2›2›2 ›2›2ÿš2øš2ñš2êš2ãš2Üš2Õš2Κ2Çš2Àš2¹š2²š2«š2¤š2š2–š2š2ˆš2š2zš2sš2lš2eš2^š2Wš2Pš2Iš2Bš2;š24š2-š2&š2š2š2š2 š2š2ü™2õ™2î™2ç™2à™2Ù™2Ò™2Ë™2Ä™2½™2¶™2¯™2¨™2¡™2š™2“™2Œ™2…™2~™2w™2p™2i™2b™2[™2T™2M™2F™2?™28™21™2*™2#™2™2™2™2™2™2ù˜2ò˜2ë˜2ä˜2ݘ2Ö˜2Ϙ2Ș2Á˜2º˜2³˜2¬˜2¥˜2ž˜2—˜2˜2‰˜2‚˜2{˜2t˜2m˜2f˜2_˜2X˜2Q˜2J˜2C˜2<˜25˜2.˜2'˜2 ˜2˜2˜2 ˜2˜2ý—2ö—2ï—2è—2á—2Ú—2Ó—2Ì—2Å—2¾—2·—2°—2©—2¢—2›—2”—2—2†—2—2x—2q—2j—2c—2\—2U—2N—2G—2@—29—22—2+—2$—2—2—2—2—2—2ú–2ó–2ì–2å–2Þ–2×–2Ж2É–2–2»–2´–2­–2¦–2Ÿ–2˜–2‘–2Š–2ƒ–2|–2u–2n–2g–2`–2Y–2R–2K–2D–2=–26–2/–2(–2!–2–2–2 –2–2þ•2÷•2ð•2é•2â•2Û•2Ô•2Í•2Æ•2¿•2¸•2±•2ª•2£•2œ•2••2Ž•2‡•2€•2y•2r•2k•2d•2]•2V•2O•2H•2A•2:•23•2,•2%•2•2•2•2 •2•2û”2ô”2í”2æ”2ß”2Ø”2Ñ”2Ê”2Ô2¼”2µ”2®”2§”2 ”2™”2’”2‹”2„”2}”2v”2o”2h”2a”2Z”2S”2L”2E”2>”27”20”2)”2"”2”2”2 ”2”2ÿ“2ø“2ñ“2ê“2ã“2Ü“2Õ“2Γ2Ç“2À“2¹“2²“2«“2¤“2“2–“2“2ˆ“2“2z“2s“2l“2e“2^“2W“2P“2I“2B“2;“24“2-“2&“2“2“2“2 “2“2ü’2õ’2î’2ç’2à’2Ù’2Ò’2Ë’2Ä’2½’2¶’2¯’2¨’2¡’2š’2“’2Œ’2…’2~’2w’2p’2i’2b’2[’2T’2M’2F’2?’28’21’2*’2#’2’2’2’2’2’2ù‘2ò‘2ë‘2ä‘2Ý‘2Ö‘2Ï‘2È‘2Á‘2º‘2³‘2¬‘2¥‘2ž‘2—‘2‘2‰‘2‚‘2{‘2t‘2m‘2f‘2_‘2X‘2Q‘2J‘2C‘2<‘25‘2.‘2'‘2 ‘2‘2‘2 ‘2‘2ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þŽ2÷Ž2ðŽ2éŽ2âŽ2ÛŽ2ÔŽ2ÍŽ2ÆŽ2¿Ž2¸Ž2±Ž2ªŽ2£Ž2œŽ2•Ž2ŽŽ2‡Ž2€Ž2yŽ2rŽ2kŽ2dŽ2]Ž2VŽ2OŽ2HŽ2AŽ2:Ž23Ž2,Ž2%Ž2Ž2Ž2Ž2 Ž2Ž2û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿŒ2øŒ2ñŒ2êŒ2ãŒ2ÜŒ2ÕŒ2ÎŒ2ÇŒ2ÀŒ2¹Œ2²Œ2«Œ2¤Œ2Œ2–Œ2Œ2ˆŒ2Œ2zŒ2sŒ2lŒ2eŒ2^Œ2WŒ2PŒ2IŒ2BŒ2;Œ24Œ2-Œ2&Œ2Œ2Œ2Œ2 Œ2Œ2ü‹2õ‹2î‹2ç‹2à‹2Ù‹2Ò‹2Ë‹2Ä‹2½‹2¶‹2¯‹2¨‹2¡‹2š‹2“‹2Œ‹2…‹2~‹2w‹2p‹2i‹2b‹2[‹2T‹2M‹2F‹2?‹28‹21‹2*‹2#‹2‹2‹2‹2‹2‹2ùŠ2òŠ2ëŠ2äŠ2ÝŠ2ÖŠ2ÏŠ2ÈŠ2ÁŠ2ºŠ2³Š2¬Š2¥Š2žŠ2—Š2Š2‰Š2‚Š2{Š2tŠ2mŠ2fŠ2_Š2XŠ2QŠ2JŠ2CŠ2<Š25Š2.Š2'Š2 Š2Š2Š2 Š2Š2ý‰2ö‰2ï‰2è‰2á‰2Ú‰2Ó‰2̉2ʼn2¾‰2·‰2°‰2©‰2¢‰2›‰2”‰2‰2†‰2‰2x‰2q‰2j‰2c‰2\‰2U‰2N‰2G‰2@‰29‰22‰2+‰2$‰2‰2‰2‰2‰2‰2úˆ2óˆ2ìˆ2åˆ2Þˆ2׈2Ј2Ɉ2ˆ2»ˆ2´ˆ2­ˆ2¦ˆ2Ÿˆ2˜ˆ2‘ˆ2Šˆ2ƒˆ2|ˆ2uˆ2nˆ2gˆ2`ˆ2Yˆ2Rˆ2Kˆ2Dˆ2=ˆ26ˆ2/ˆ2(ˆ2!ˆ2ˆ2ˆ2 ˆ2ˆ2þ‡2÷‡2ð‡2é‡2â‡2Û‡2Ô‡2͇2Ƈ2¿‡2¸‡2±‡2ª‡2£‡2œ‡2•‡2އ2‡‡2€‡2y‡2r‡2k‡2d‡2]‡2V‡2O‡2H‡2A‡2:‡23‡2,‡2%‡2‡2‡2‡2 ‡2‡2û†2ô†2í†2æ†2߆2؆2ц2ʆ2Æ2¼†2µ†2®†2§†2 †2™†2’†2‹†2„†2}†2v†2o†2h†2a†2Z†2S†2L†2E†2>†27†20†2)†2"†2†2†2 †2†2ÿ…2ø…2ñ…2ê…2ã…2Ü…2Õ…2Î…2Ç…2À…2¹…2²…2«…2¤…2…2–…2…2ˆ…2…2z…2s…2l…2e…2^…2W…2P…2I…2B…2;…24…2-…2&…2…2…2…2 …2…2ü„2õ„2î„2ç„2à„2Ù„2Ò„2Ë„2Ä„2½„2¶„2¯„2¨„2¡„2š„2“„2Œ„2…„2~„2w„2p„2i„2b„2[„2T„2M„2F„2?„28„21„2*„2#„2„2„2„2„2„2ùƒ2òƒ2ëƒ2äƒ2݃2Öƒ2σ2ȃ2Áƒ2ºƒ2³ƒ2¬ƒ2¥ƒ2žƒ2—ƒ2ƒ2‰ƒ2‚ƒ2{ƒ2tƒ2mƒ2fƒ2_ƒ2Xƒ2Qƒ2Jƒ2Cƒ2<ƒ25ƒ2.ƒ2'ƒ2 ƒ2ƒ2ƒ2 ƒ2ƒ2ý‚2ö‚2ï‚2è‚2á‚2Ú‚2Ó‚2Ì‚2Å‚2¾‚2·‚2°‚2©‚2¢‚2›‚2”‚2‚2†‚2‚2x‚2q‚2j‚2c‚2\‚2U‚2N‚2G‚2@‚29‚22‚2+‚2$‚2‚2‚2‚2‚2‚2ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ€2÷€2ð€2é€2â€2Û€2Ô€2Í€2Æ€2¿€2¸€2±€2ª€2£€2œ€2•€2Ž€2‡€2€€2y€2r€2k€2d€2]€2V€2O€2H€2A€2:€23€2,€2%€2€2€2€2 €2€2û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ~2ø~2ñ~2ê~2ã~2Ü~2Õ~2Î~2Ç~2À~2¹~2²~2«~2¤~2~2–~2~2ˆ~2~2z~2s~2l~2e~2^~2W~2P~2I~2B~2;~24~2-~2&~2~2~2~2 ~2~2ü}2õ}2î}2ç}2à}2Ù}2Ò}2Ë}2Ä}2½}2¶}2¯}2¨}2¡}2š}2“}2Œ}2…}2~}2w}2p}2i}2b}2[}2T}2M}2F}2?}28}21}2*}2#}2}2}2}2}2}2ù|2ò|2ë|2ä|2Ý|2Ö|2Ï|2È|2Á|2º|2³|2¬|2¥|2ž|2—|2|2‰|2‚|2{|2t|2m|2f|2_|2X|2Q|2J|2C|2<|25|2.|2'|2 |2|2|2 |2|2ý{2ö{2ï{2è{2á{2Ú{2Ó{2Ì{2Å{2¾{2·{2°{2©{2¢{2›{2”{2{2†{2{2x{2q{2j{2c{2\{2U{2N{2G{2@{29{22{2+{2${2{2{2{2{2{2úz2óz2ìz2åz2Þz2×z2Ðz2Éz2Âz2»z2´z2­z2¦z2Ÿz2˜z2‘z2Šz2ƒz2|z2uz2nz2gz2`z2Yz2Rz2Kz2Dz2=z26z2/z2(z2!z2z2z2 z2z2þy2÷y2ðy2éy2ây2Ûy2Ôy2Íy2Æy2¿y2¸y2±y2ªy2£y2œy2•y2Žy2‡y2€y2yy2ry2ky2dy2]y2Vy2Oy2Hy2Ay2:y23y2,y2%y2y2y2y2 y2y2ûx2ôx2íx2æx2ßx2Øx2Ñx2Êx2Ãx2¼x2µx2®x2§x2 x2™x2’x2‹x2„x2}x2vx2ox2hx2ax2Zx2Sx2Lx2Ex2>x27x20x2)x2"x2x2x2 x2x2ÿw2øw2ñw2êw2ãw2Üw2Õw2Îw2Çw2Àw2¹w2²w2«w2¤w2w2–w2w2ˆw2w2zw2sw2lw2ew2^w2Ww2Pw2Iw2Bw2;w24w2-w2&w2w2w2w2 w2w2üv2õv2îv2çv2àv2Ùv2Òv2Ëv2Äv2½v2¶v2¯v2¨v2¡v2šv2“v2Œv2…v2~v2wv2pv2iv2bv2[v2Tv2Mv2Fv2?v28v21v2*v2#v2v2v2v2v2v2ùu2òu2ëu2äu2Ýu2Öu2Ïu2Èu2Áu2ºu2³u2¬u2¥u2žu2—u2u2‰u2‚u2{u2tu2mu2fu2_u2Xu2Qu2Ju2Cu2q27q20q2)q2"q2q2q2 q2q2ÿp2øp2ñp2êp2ãp2Üp2Õp2Îp2Çp2Àp2¹p2²p2«p2¤p2p2–p2p2ˆp2p2zp2sp2lp2ep2^p2Wp2Pp2Ip2Bp2;p24p2-p2&p2p2p2p2 p2p2üo2õo2îo2ço2ào2Ùo2Òo2Ëo2Äo2½o2¶o2¯o2¨o2¡o2šo2“o2Œo2…o2~o2wo2po2io2bo2[o2To2Mo2Fo2?o28o21o2*o2#o2o2o2o2o2o2ùn2òn2ën2än2Ýn2Ön2Ïn2Èn2Án2ºn2³n2¬n2¥n2žn2—n2n2‰n2‚n2{n2tn2mn2fn2_n2Xn2Qn2Jn2Cn2j27j20j2)j2"j2j2j2 j2j2ÿi2øi2ñi2êi2ãi2Üi2Õi2Îi2Çi2Ài2¹i2²i2«i2¤i2i2–i2i2ˆi2i2zi2si2li2ei2^i2Wi2Pi2Ii2Bi2;i24i2-i2&i2i2i2i2 i2i2üh2õh2îh2çh2àh2Ùh2Òh2Ëh2Äh2½h2¶h2¯h2¨h2¡h2šh2“h2Œh2…h2~h2wh2ph2ih2bh2[h2Th2Mh2Fh2?h28h21h2*h2#h2h2h2h2h2h2ùg2òg2ëg2äg2Ýg2Ög2Ïg2Èg2Ág2ºg2³g2¬g2¥g2žg2—g2g2‰g2‚g2{g2tg2mg2fg2_g2Xg2Qg2Jg2Cg2c27c20c2)c2"c2c2c2 c2c2ÿb2øb2ñb2êb2ãb2Üb2Õb2Îb2Çb2Àb2¹b2²b2«b2¤b2b2–b2b2ˆb2b2zb2sb2lb2eb2^b2Wb2Pb2Ib2Bb2;b24b2-b2&b2b2b2b2 b2b2üa2õa2îa2ça2àa2Ùa2Òa2Ëa2Äa2½a2¶a2¯a2¨a2¡a2ša2“a2Œa2…a2~a2wa2pa2ia2ba2[a2Ta2Ma2Fa2?a28a21a2*a2#a2a2a2a2a2a2ù`2ò`2ë`2ä`2Ý`2Ö`2Ï`2È`2Á`2º`2³`2¬`2¥`2ž`2—`2`2‰`2‚`2{`2t`2m`2f`2_`2X`2Q`2J`2C`2<`25`2.`2'`2 `2`2`2 `2`2ý_2ö_2ï_2è_2á_2Ú_2Ó_2Ì_2Å_2¾_2·_2°_2©_2¢_2›_2”_2_2†_2_2x_2q_2j_2c_2\_2U_2N_2G_2@_29_22_2+_2$_2_2_2_2_2_2ú^2ó^2ì^2å^2Þ^2×^2Ð^2É^2Â^2»^2´^2­^2¦^2Ÿ^2˜^2‘^2Š^2ƒ^2|^2u^2n^2g^2`^2Y^2R^2K^2D^2=^26^2/^2(^2!^2^2^2 ^2^2þ]2÷]2ð]2é]2â]2Û]2Ô]2Í]2Æ]2¿]2¸]2±]2ª]2£]2œ]2•]2Ž]2‡]2€]2y]2r]2k]2d]2]]2V]2O]2H]2A]2:]23]2,]2%]2]2]2]2 ]2]2û\2ô\2í\2æ\2ß\2Ø\2Ñ\2Ê\2Ã\2¼\2µ\2®\2§\2 \2™\2’\2‹\2„\2}\2v\2o\2h\2a\2Z\2S\2L\2E\2>\27\20\2)\2"\2\2\2 \2\2ÿ[2ø[2ñ[2ê[2ã[2Ü[2Õ[2Î[2Ç[2À[2¹[2²[2«[2¤[2[2–[2[2ˆ[2[2z[2s[2l[2e[2^[2W[2P[2I[2B[2;[24[2-[2&[2[2[2[2 [2[2üZ2õZ2îZ2çZ2àZ2ÙZ2ÒZ2ËZ2ÄZ2½Z2¶Z2¯Z2¨Z2¡Z2šZ2“Z2ŒZ2…Z2~Z2wZ2pZ2iZ2bZ2[Z2TZ2MZ2FZ2?Z28Z21Z2*Z2#Z2Z2Z2Z2Z2Z2ùY2òY2ëY2äY2ÝY2ÖY2ÏY2ÈY2ÁY2ºY2³Y2¬Y2¥Y2žY2—Y2Y2‰Y2‚Y2{Y2tY2mY2fY2_Y2XY2QY2JY2CY2U27U20U2)U2"U2U2U2 U2U2ÿT2øT2ñT2êT2ãT2ÜT2ÕT2ÎT2ÇT2ÀT2¹T2²T2«T2¤T2T2–T2T2ˆT2T2zT2sT2lT2eT2^T2WT2PT2IT2BT2;T24T2-T2&T2T2T2T2 T2T2üS2õS2îS2çS2àS2ÙS2ÒS2ËS2ÄS2½S2¶S2¯S2¨S2¡S2šS2“S2ŒS2…S2~S2wS2pS2iS2bS2[S2TS2MS2FS2?S28S21S2*S2#S2S2S2S2S2S2ùR2òR2ëR2äR2ÝR2ÖR2ÏR2ÈR2ÁR2ºR2³R2¬R2¥R2žR2—R2R2‰R2‚R2{R2tR2mR2fR2_R2XR2QR2JR2CR2N27N20N2)N2"N2N2N2 N2N2ÿM2øM2ñM2êM2ãM2ÜM2ÕM2ÎM2ÇM2ÀM2¹M2²M2«M2¤M2M2–M2M2ˆM2M2zM2sM2lM2eM2^M2WM2PM2IM2BM2;M24M2-M2&M2M2M2M2 M2M2üL2õL2îL2çL2àL2ÙL2ÒL2ËL2ÄL2½L2¶L2¯L2¨L2¡L2šL2“L2ŒL2…L2~L2wL2pL2iL2bL2[L2TL2ML2FL2?L28L21L2*L2#L2L2L2L2L2L2ùK2òK2ëK2äK2ÝK2ÖK2ÏK2ÈK2ÁK2ºK2³K2¬K2¥K2žK2—K2K2‰K2‚K2{K2tK2mK2fK2_K2XK2QK2JK2CK2G27G20G2)G2"G2G2G2 G2G2ÿF2øF2ñF2êF2ãF2ÜF2ÕF2ÎF2ÇF2ÀF2¹F2²F2«F2¤F2F2–F2F2ˆF2F2zF2sF2lF2eF2^F2WF2PF2IF2BF2;F24F2-F2&F2F2F2F2 F2F2üE2õE2îE2çE2àE2ÙE2ÒE2ËE2ÄE2½E2¶E2¯E2¨E2¡E2šE2“E2ŒE2…E2~E2wE2pE2iE2bE2[E2TE2ME2FE2?E28E21E2*E2#E2E2E2E2E2E2ùD2òD2ëD2äD2ÝD2ÖD2ÏD2ÈD2ÁD2ºD2³D2¬D2¥D2žD2—D2D2‰D2‚D2{D2tD2mD2fD2_D2XD2QD2JD2CD2@27@20@2)@2"@2@2@2 @2@2ÿ?2ø?2ñ?2ê?2ã?2Ü?2Õ?2Î?2Ç?2À?2¹?2²?2«?2¤?2?2–?2?2ˆ?2?2z?2s?2l?2e?2^?2W?2P?2I?2B?2;?24?2-?2&?2?2?2?2 ?2?2ü>2õ>2î>2ç>2à>2Ù>2Ò>2Ë>2Ä>2½>2¶>2¯>2¨>2¡>2š>2“>2Œ>2…>2~>2w>2p>2i>2b>2[>2T>2M>2F>2?>28>21>2*>2#>2>2>2>2>2>2ù=2ò=2ë=2ä=2Ý=2Ö=2Ï=2È=2Á=2º=2³=2¬=2¥=2ž=2—=2=2‰=2‚=2{=2t=2m=2f=2_=2X=2Q=2J=2C=2<=25=2.=2'=2 =2=2=2 =2=2ý<2ö<2ï<2è<2á<2Ú<2Ó<2Ì<2Å<2¾<2·<2°<2©<2¢<2›<2”<2<2†<2<2x<2q<2j<2c<2\<2U<2N<2G<2@<29<22<2+<2$<2<2<2<2<2<2ú;2ó;2ì;2å;2Þ;2×;2Ð;2É;2Â;2»;2´;2­;2¦;2Ÿ;2˜;2‘;2Š;2ƒ;2|;2u;2n;2g;2`;2Y;2R;2K;2D;2=;26;2/;2(;2!;2;2;2 ;2;2þ:2÷:2ð:2é:2â:2Û:2Ô:2Í:2Æ:2¿:2¸:2±:2ª:2£:2œ:2•:2Ž:2‡:2€:2y:2r:2k:2d:2]:2V:2O:2H:2A:2::23:2,:2%:2:2:2:2 :2:2û92ô92í92æ92ß92Ø92Ñ92Ê92Ã92¼92µ92®92§92 92™92’92‹92„92}92v92o92h92a92Z92S92L92E92>92792092)92"929292 9292ÿ82ø82ñ82ê82ã82Ü82Õ82Î82Ç82À82¹82²82«82¤8282–8282ˆ8282z82s82l82e82^82W82P82I82B82;82482-82&82828282 8282ü72õ72î72ç72à72Ù72Ò72Ë72Ä72½72¶72¯72¨72¡72š72“72Œ72…72~72w72p72i72b72[72T72M72F72?72872172*72#727272727272ù62ò62ë62ä62Ý62Ö62Ï62È62Á62º62³62¬62¥62ž62—6262‰62‚62{62t62m62f62_62X62Q62J62C62<62562.62'62 626262 6262ý52ö52ï52è52á52Ú52Ó52Ì52Å52¾52·52°52©52¢52›52”5252†5252x52q52j52c52\52U52N52G52@52952252+52$525252525252ú42ó42ì42å42Þ42×42Ð42É42Â42»42´42­42¦42Ÿ42˜42‘42Š42ƒ42|42u42n42g42`42Y42R42K42D42=42642/42(42!424242 4242þ32÷32ð32é32â32Û32Ô32Í32Æ32¿32¸32±32ª32£32œ32•32Ž32‡32€32y32r32k32d32]32V32O32H32A32:32332,32%32323232 3232û22ô22í22æ22ß22Ø22Ñ22Ê22Ã22¼22µ22®22§22 22™22’22‹22„22}22v22o22h22a22Z22S22L22E22>22722022)22"222222 2222ÿ12ø12ñ12ê12ã12Ü12Õ12Î12Ç12À12¹12²12«12¤1212–1212ˆ1212z12s12l12e12^12W12P12I12B12;12412-12&12121212 1212ü02õ02î02ç02à02Ù02Ò02Ë02Ä02½02¶02¯02¨02¡02š02“02Œ02…02~02w02p02i02b02[02T02M02F02?02802102*02#020202020202ù/2ò/2ë/2ä/2Ý/2Ö/2Ï/2È/2Á/2º/2³/2¬/2¥/2ž/2—/2/2‰/2‚/2{/2t/2m/2f/2_/2X/2Q/2J/2C/2+27+20+2)+2"+2+2+2 +2+2ÿ*2ø*2ñ*2ê*2ã*2Ü*2Õ*2Î*2Ç*2À*2¹*2²*2«*2¤*2*2–*2*2ˆ*2*2z*2s*2l*2e*2^*2W*2P*2I*2B*2;*24*2-*2&*2*2*2*2 *2*2ü)2õ)2î)2ç)2à)2Ù)2Ò)2Ë)2Ä)2½)2¶)2¯)2¨)2¡)2š)2“)2Œ)2…)2~)2w)2p)2i)2b)2[)2T)2M)2F)2?)28)21)2*)2#)2)2)2)2)2)2ù(2ò(2ë(2ä(2Ý(2Ö(2Ï(2È(2Á(2º(2³(2¬(2¥(2ž(2—(2(2‰(2‚(2{(2t(2m(2f(2_(2X(2Q(2J(2C(2<(25(2.(2'(2 (2(2(2 (2(2ý'2ö'2ï'2è'2á'2Ú'2Ó'2Ì'2Å'2¾'2·'2°'2©'2¢'2›'2”'2'2†'2'2x'2q'2j'2c'2\'2U'2N'2G'2@'29'22'2+'2$'2'2'2'2'2'2ú&2ó&2ì&2å&2Þ&2×&2Ð&2É&2Â&2»&2´&2­&2¦&2Ÿ&2˜&2‘&2Š&2ƒ&2|&2u&2n&2g&2`&2Y&2R&2K&2D&2=&26&2/&2(&2!&2&2&2 &2&2þ%2÷%2ð%2é%2â%2Û%2Ô%2Í%2Æ%2¿%2¸%2±%2ª%2£%2œ%2•%2Ž%2‡%2€%2y%2r%2k%2d%2]%2V%2O%2H%2A%2:%23%2,%2%%2%2%2%2 %2%2û$2ô$2í$2æ$2ß$2Ø$2Ñ$2Ê$2Ã$2¼$2µ$2®$2§$2 $2™$2’$2‹$2„$2}$2v$2o$2h$2a$2Z$2S$2L$2E$2>$27$20$2)$2"$2$2$2 $2$2ÿ#2ø#2ñ#2ê#2ã#2Ü#2Õ#2Î#2Ç#2À#2¹#2²#2«#2¤#2#2–#2#2ˆ#2#2z#2s#2l#2e#2^#2W#2P#2I#2B#2;#24#2-#2#2#2#2 #2#2ü"2õ"2î"2ç"2à"2Ù"2Ò"2Ë"2Ä"2½"2¶"2¯"2¨"2¡"2š"2“"2Œ"2…"2~"2w"2p"2i"2b"2["2T"2M"2F"2?"28"21"2*"2#"2"2"2"2"2"2ù!2ò!2ë!2ä!2Ý!2Ö!2Ï!2È!2Á!2º!2³!2¬!2¥!2ž!2—!2!2‰!2‚!2{!2t!2m!2f!2_!2X!2Q!2J!2C!227202)2"222 22ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü 2õ 2î 2ç 2à 2Ù 2Ò 2Ë 2Ä 2½ 2¶ 2¯ 2¨ 2¡ 2š 2“ 2Œ 2… 2~ 2w 2p 2i 2b 2[ 2T 2M 2F 2? 28 21 2* 2# 2 2 2 2 2 2ù 2ò 2ë 2ä 2Ý 2Ö 2Ï 2È 2Á 2º 2³ 2¬ 2¥ 2ž 2— 2 2‰ 2‚ 2{ 2t 2m 2f 2_ 2X 2Q 2J 2C 2< 25 2. 2' 2 2 2 2 2 2ý 2ö 2ï 2è 2á 2Ú 2Ó 2Ì 2Å 2¾ 2· 2° 2© 2¢ 2› 2” 2 2† 2 2x 2q 2j 2c 2\ 2U 2N 2G 2@ 29 22 2+ 2$ 2 2 2 2 2 2ú 2ó 2ì 2å 2Þ 2× 2Ð 2É 2 2» 2´ 2­ 2¦ 2Ÿ 2˜ 2‘ 2Š 2ƒ 2| 2u 2n 2g 2` 2Y 2R 2K 2D 2= 26 2/ 2( 2! 2 2 2 2 2þ 2÷ 2ð 2é 2â 2Û 2Ô 2Í 2Æ 2¿ 2¸ 2± 2ª 2£ 2œ 2• 2Ž 2‡ 2€ 2y 2r 2k 2d 2] 2V 2O 2H 2A 2: 23 2, 2% 2 2 2 2 2 2û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22üÿ1õÿ1îÿ1çÿ1àÿ1Ùÿ1Òÿ1Ëÿ1Äÿ1½ÿ1¶ÿ1¯ÿ1¨ÿ1¡ÿ1šÿ1“ÿ1Œÿ1…ÿ1~ÿ1wÿ1pÿ1iÿ1bÿ1[ÿ1Tÿ1Mÿ1Fÿ1?ÿ18ÿ11ÿ1*ÿ1#ÿ1ÿ1ÿ1ÿ1ÿ1ÿ1ùþ1òþ1ëþ1äþ1Ýþ1Öþ1Ïþ1Èþ1Áþ1ºþ1³þ1¬þ1¥þ1žþ1—þ1þ1‰þ1‚þ1{þ1tþ1mþ1fþ1_þ1Xþ1Qþ1Jþ1Cþ1<þ15þ1.þ1'þ1 þ1þ1þ1 þ1þ1ýý1öý1ïý1èý1áý1Úý1Óý1Ìý1Åý1¾ý1·ý1°ý1©ý1¢ý1›ý1”ý1ý1†ý1ý1xý1qý1jý1cý1\ý1Uý1Ný1Gý1@ý19ý12ý1+ý1$ý1ý1ý1ý1ý1ý1úü1óü1ìü1åü1Þü1×ü1Ðü1Éü1Âü1»ü1´ü1­ü1¦ü1Ÿü1˜ü1‘ü1Šü1ƒü1|ü1uü1nü1gü1`ü1Yü1Rü1Kü1Dü1=ü16ü1/ü1(ü1!ü1ü1ü1 ü1ü1þû1÷û1ðû1éû1âû1Ûû1Ôû1Íû1Æû1¿û1¸û1±û1ªû1£û1œû1•û1Žû1‡û1€û1yû1rû1kû1dû1]û1Vû1Oû1Hû1Aû1:û13û1,û1%û1û1û1û1 û1û1ûú1ôú1íú1æú1ßú1Øú1Ñú1Êú1Ãú1¼ú1µú1®ú1§ú1 ú1™ú1’ú1‹ú1„ú1}ú1vú1oú1hú1aú1Zú1Sú1Lú1Eú1>ú17ú10ú1)ú1"ú1ú1ú1 ú1ú1ÿù1øù1ñù1êù1ãù1Üù1Õù1Îù1Çù1Àù1¹ù1²ù1«ù1¤ù1ù1–ù1ù1ˆù1ù1zù1sù1lù1eù1^ù1Wù1Pù1Iù1Bù1;ù14ù1-ù1&ù1ù1ù1ù1 ù1ù1üø1õø1îø1çø1àø1Ùø1Òø1Ëø1Äø1½ø1¶ø1¯ø1¨ø1¡ø1šø1“ø1Œø1…ø1~ø1wø1pø1iø1bø1[ø1Tø1Mø1Fø1?ø18ø11ø1*ø1#ø1ø1ø1ø1ø1ø1ù÷1ò÷1ë÷1ä÷1Ý÷1Ö÷1Ï÷1È÷1Á÷1º÷1³÷1¬÷1¥÷1ž÷1—÷1÷1‰÷1‚÷1{÷1t÷1m÷1f÷1_÷1X÷1Q÷1J÷1C÷1<÷15÷1.÷1'÷1 ÷1÷1÷1 ÷1÷1ýö1öö1ïö1èö1áö1Úö1Óö1Ìö1Åö1¾ö1·ö1°ö1©ö1¢ö1›ö1”ö1ö1†ö1ö1xö1qö1jö1cö1\ö1Uö1Nö1Gö1@ö19ö12ö1+ö1$ö1ö1ö1ö1ö1ö1úõ1óõ1ìõ1åõ1Þõ1×õ1Ðõ1Éõ1Âõ1»õ1´õ1­õ1¦õ1Ÿõ1˜õ1‘õ1Šõ1ƒõ1|õ1uõ1nõ1gõ1`õ1Yõ1Rõ1Kõ1Dõ1=õ16õ1/õ1(õ1!õ1õ1õ1 õ1õ1þô1÷ô1ðô1éô1âô1Ûô1Ôô1Íô1Æô1¿ô1¸ô1±ô1ªô1£ô1œô1•ô1Žô1‡ô1€ô1yô1rô1kô1dô1]ô1Vô1Oô1Hô1Aô1:ô13ô1,ô1%ô1ô1ô1ô1 ô1ô1ûó1ôó1íó1æó1ßó1Øó1Ñó1Êó1Ãó1¼ó1µó1®ó1§ó1 ó1™ó1’ó1‹ó1„ó1}ó1vó1oó1hó1aó1Zó1Só1Ló1Eó1>ó17ó10ó1)ó1"ó1ó1ó1 ó1ó1ÿò1øò1ñò1êò1ãò1Üò1Õò1Îò1Çò1Àò1¹ò1²ò1«ò1¤ò1ò1–ò1ò1ˆò1ò1zò1sò1lò1eò1^ò1Wò1Pò1Iò1Bò1;ò14ò1-ò1&ò1ò1ò1ò1 ò1ò1üñ1õñ1îñ1çñ1àñ1Ùñ1Òñ1Ëñ1Äñ1½ñ1¶ñ1¯ñ1¨ñ1¡ñ1šñ1“ñ1Œñ1…ñ1~ñ1wñ1pñ1iñ1bñ1[ñ1Tñ1Mñ1Fñ1?ñ18ñ11ñ1*ñ1#ñ1ñ1ñ1ñ1ñ1ñ1ùð1òð1ëð1äð1Ýð1Öð1Ïð1Èð1Áð1ºð1³ð1¬ð1¥ð1žð1—ð1ð1‰ð1‚ð1{ð1tð1mð1fð1_ð1Xð1Qð1Jð1Cð1<ð15ð1.ð1'ð1 ð1ð1ð1 ð1ð1ýï1öï1ïï1èï1áï1Úï1Óï1Ìï1Åï1¾ï1·ï1°ï1©ï1¢ï1›ï1”ï1ï1†ï1ï1xï1qï1jï1cï1\ï1Uï1Nï1Gï1@ï19ï12ï1+ï1$ï1ï1ï1ï1ï1ï1úî1óî1ìî1åî1Þî1×î1Ðî1Éî1Âî1»î1´î1­î1¦î1Ÿî1˜î1‘î1Šî1ƒî1|î1uî1nî1gî1`î1Yî1Rî1Kî1Dî1=î16î1/î1(î1!î1î1î1 î1î1þí1÷í1ðí1éí1âí1Ûí1Ôí1Íí1Æí1¿í1¸í1±í1ªí1£í1œí1•í1Ží1‡í1€í1yí1rí1kí1dí1]í1Ví1Oí1Hí1Aí1:í13í1,í1%í1í1í1í1 í1í1ûì1ôì1íì1æì1ßì1Øì1Ñì1Êì1Ãì1¼ì1µì1®ì1§ì1 ì1™ì1’ì1‹ì1„ì1}ì1vì1oì1hì1aì1Zì1Sì1Lì1Eì1>ì17ì10ì1)ì1"ì1ì1ì1 ì1ì1ÿë1øë1ñë1êë1ãë1Üë1Õë1Îë1Çë1Àë1¹ë1²ë1«ë1¤ë1ë1–ë1ë1ˆë1ë1zë1së1lë1eë1^ë1Wë1Pë1Ië1Bë1;ë14ë1-ë1&ë1ë1ë1ë1 ë1ë1üê1õê1îê1çê1àê1Ùê1Òê1Ëê1Äê1½ê1¶ê1¯ê1¨ê1¡ê1šê1“ê1Œê1…ê1~ê1wê1pê1iê1bê1[ê1Tê1Mê1Fê1?ê18ê11ê1*ê1#ê1ê1ê1ê1ê1ê1ùé1òé1ëé1äé1Ýé1Öé1Ïé1Èé1Áé1ºé1³é1¬é1¥é1žé1—é1é1‰é1‚é1{é1té1mé1fé1_é1Xé1Qé1Jé1Cé1<é15é1.é1'é1 é1é1é1 é1é1ýè1öè1ïè1èè1áè1Úè1Óè1Ìè1Åè1¾è1·è1°è1©è1¢è1›è1”è1è1†è1è1xè1qè1jè1cè1\è1Uè1Nè1Gè1@è19è12è1+è1$è1è1è1è1è1è1úç1óç1ìç1åç1Þç1×ç1Ðç1Éç1Âç1»ç1´ç1­ç1¦ç1Ÿç1˜ç1‘ç1Šç1ƒç1|ç1uç1nç1gç1`ç1Yç1Rç1Kç1Dç1=ç16ç1/ç1(ç1!ç1ç1ç1 ç1ç1þæ1÷æ1ðæ1éæ1âæ1Ûæ1Ôæ1Íæ1Ææ1¿æ1¸æ1±æ1ªæ1£æ1œæ1•æ1Žæ1‡æ1€æ1yæ1ræ1kæ1dæ1]æ1Væ1Oæ1Hæ1Aæ1:æ13æ1,æ1%æ1æ1æ1æ1 æ1æ1ûå1ôå1íå1æå1ßå1Øå1Ñå1Êå1Ãå1¼å1µå1®å1§å1 å1™å1’å1‹å1„å1}å1vå1oå1hå1aå1Zå1Så1Lå1Eå1>å17å10å1)å1"å1å1å1 å1å1ÿä1øä1ñä1êä1ãä1Üä1Õä1Îä1Çä1Àä1¹ä1²ä1«ä1¤ä1ä1–ä1ä1ˆä1ä1zä1sä1lä1eä1^ä1Wä1Pä1Iä1Bä1;ä14ä1-ä1&ä1ä1ä1ä1 ä1ä1üã1õã1îã1çã1àã1Ùã1Òã1Ëã1Äã1½ã1¶ã1¯ã1¨ã1¡ã1šã1“ã1Œã1…ã1~ã1wã1pã1iã1bã1[ã1Tã1Mã1Fã1?ã18ã11ã1*ã1#ã1ã1ã1ã1ã1ã1ùâ1òâ1ëâ1äâ1Ýâ1Öâ1Ïâ1Èâ1Áâ1ºâ1³â1¬â1¥â1žâ1—â1â1‰â1‚â1{â1tâ1mâ1fâ1_â1Xâ1Qâ1Jâ1Câ1<â15â1.â1'â1 â1â1â1 â1â1ýá1öá1ïá1èá1áá1Úá1Óá1Ìá1Åá1¾á1·á1°á1©á1¢á1›á1”á1á1†á1á1xá1qá1já1cá1\á1Uá1Ná1Gá1@á19á12á1+á1$á1á1á1á1á1á1úà1óà1ìà1åà1Þà1×à1Ðà1Éà1Âà1»à1´à1­à1¦à1Ÿà1˜à1‘à1Šà1ƒà1|à1uà1nà1gà1`à1Yà1Rà1Kà1Dà1=à16à1/à1(à1!à1à1à1 à1à1þß1÷ß1ðß1éß1âß1Ûß1Ôß1Íß1Æß1¿ß1¸ß1±ß1ªß1£ß1œß1•ß1Žß1‡ß1€ß1yß1rß1kß1dß1]ß1Vß1Oß1Hß1Aß1:ß13ß1,ß1%ß1ß1ß1ß1 ß1ß1ûÞ1ôÞ1íÞ1æÞ1ßÞ1ØÞ1ÑÞ1ÊÞ1ÃÞ1¼Þ1µÞ1®Þ1§Þ1 Þ1™Þ1’Þ1‹Þ1„Þ1}Þ1vÞ1oÞ1hÞ1aÞ1ZÞ1SÞ1LÞ1EÞ1>Þ17Þ10Þ1)Þ1"Þ1Þ1Þ1 Þ1Þ1ÿÝ1øÝ1ñÝ1êÝ1ãÝ1ÜÝ1ÕÝ1ÎÝ1ÇÝ1ÀÝ1¹Ý1²Ý1«Ý1¤Ý1Ý1–Ý1Ý1ˆÝ1Ý1zÝ1sÝ1lÝ1eÝ1^Ý1WÝ1PÝ1IÝ1BÝ1;Ý14Ý1-Ý1&Ý1Ý1Ý1Ý1 Ý1Ý1üÜ1õÜ1îÜ1çÜ1àÜ1ÙÜ1ÒÜ1ËÜ1ÄÜ1½Ü1¶Ü1¯Ü1¨Ü1¡Ü1šÜ1“Ü1ŒÜ1…Ü1~Ü1wÜ1pÜ1iÜ1bÜ1[Ü1TÜ1MÜ1FÜ1?Ü18Ü11Ü1*Ü1#Ü1Ü1Ü1Ü1Ü1Ü1ùÛ1òÛ1ëÛ1äÛ1ÝÛ1ÖÛ1ÏÛ1ÈÛ1ÁÛ1ºÛ1³Û1¬Û1¥Û1žÛ1—Û1Û1‰Û1‚Û1{Û1tÛ1mÛ1fÛ1_Û1XÛ1QÛ1JÛ1CÛ1<Û15Û1.Û1'Û1 Û1Û1Û1 Û1Û1ýÚ1öÚ1ïÚ1èÚ1áÚ1ÚÚ1ÓÚ1ÌÚ1ÅÚ1¾Ú1·Ú1°Ú1©Ú1¢Ú1›Ú1”Ú1Ú1†Ú1Ú1xÚ1qÚ1jÚ1cÚ1\Ú1UÚ1NÚ1GÚ1@Ú19Ú12Ú1+Ú1$Ú1Ú1Ú1Ú1Ú1Ú1úÙ1óÙ1ìÙ1åÙ1ÞÙ1×Ù1ÐÙ1ÉÙ1ÂÙ1»Ù1´Ù1­Ù1¦Ù1ŸÙ1˜Ù1‘Ù1ŠÙ1ƒÙ1|Ù1uÙ1nÙ1gÙ1`Ù1YÙ1RÙ1KÙ1DÙ1=Ù16Ù1/Ù1(Ù1!Ù1Ù1Ù1 Ù1Ù1þØ1÷Ø1ðØ1éØ1âØ1ÛØ1ÔØ1ÍØ1ÆØ1¿Ø1¸Ø1±Ø1ªØ1£Ø1œØ1•Ø1ŽØ1‡Ø1€Ø1yØ1rØ1kØ1dØ1]Ø1VØ1OØ1HØ1AØ1:Ø13Ø1,Ø1%Ø1Ø1Ø1Ø1 Ø1Ø1û×1ô×1í×1æ×1ß×1Ø×1Ñ×1Ê×1Ã×1¼×1µ×1®×1§×1 ×1™×1’×1‹×1„×1}×1v×1o×1h×1a×1Z×1S×1L×1E×1>×17×10×1)×1"×1×1×1 ×1×1ÿÖ1øÖ1ñÖ1êÖ1ãÖ1ÜÖ1ÕÖ1ÎÖ1ÇÖ1ÀÖ1¹Ö1²Ö1«Ö1¤Ö1Ö1–Ö1Ö1ˆÖ1Ö1zÖ1sÖ1lÖ1eÖ1^Ö1WÖ1PÖ1IÖ1BÖ1;Ö14Ö1-Ö1&Ö1Ö1Ö1Ö1 Ö1Ö1üÕ1õÕ1îÕ1çÕ1àÕ1ÙÕ1ÒÕ1ËÕ1ÄÕ1½Õ1¶Õ1¯Õ1¨Õ1¡Õ1šÕ1“Õ1ŒÕ1…Õ1~Õ1wÕ1pÕ1iÕ1bÕ1[Õ1TÕ1MÕ1FÕ1?Õ18Õ11Õ1*Õ1#Õ1Õ1Õ1Õ1Õ1Õ1ùÔ1òÔ1ëÔ1äÔ1ÝÔ1ÖÔ1ÏÔ1ÈÔ1ÁÔ1ºÔ1³Ô1¬Ô1¥Ô1žÔ1—Ô1Ô1‰Ô1‚Ô1{Ô1tÔ1mÔ1fÔ1_Ô1XÔ1QÔ1JÔ1CÔ1<Ô15Ô1.Ô1'Ô1 Ô1Ô1Ô1 Ô1Ô1ýÓ1öÓ1ïÓ1èÓ1áÓ1ÚÓ1ÓÓ1ÌÓ1ÅÓ1¾Ó1·Ó1°Ó1©Ó1¢Ó1›Ó1”Ó1Ó1†Ó1Ó1xÓ1qÓ1jÓ1cÓ1\Ó1UÓ1NÓ1GÓ1@Ó19Ó12Ó1+Ó1$Ó1Ó1Ó1Ó1Ó1Ó1úÒ1óÒ1ìÒ1åÒ1ÞÒ1×Ò1ÐÒ1ÉÒ1ÂÒ1»Ò1´Ò1­Ò1¦Ò1ŸÒ1˜Ò1‘Ò1ŠÒ1ƒÒ1|Ò1uÒ1nÒ1gÒ1`Ò1YÒ1RÒ1KÒ1DÒ1=Ò16Ò1/Ò1(Ò1!Ò1Ò1Ò1 Ò1Ò1þÑ1÷Ñ1ðÑ1éÑ1âÑ1ÛÑ1ÔÑ1ÍÑ1ÆÑ1¿Ñ1¸Ñ1±Ñ1ªÑ1£Ñ1œÑ1•Ñ1ŽÑ1‡Ñ1€Ñ1yÑ1rÑ1kÑ1dÑ1]Ñ1VÑ1OÑ1HÑ1AÑ1:Ñ13Ñ1,Ñ1%Ñ1Ñ1Ñ1Ñ1 Ñ1Ñ1ûÐ1ôÐ1íÐ1æÐ1ßÐ1ØÐ1ÑÐ1ÊÐ1ÃÐ1¼Ð1µÐ1®Ð1§Ð1 Ð1™Ð1’Ð1‹Ð1„Ð1}Ð1vÐ1oÐ1hÐ1aÐ1ZÐ1SÐ1LÐ1EÐ1>Ð17Ð10Ð1)Ð1"Ð1Ð1Ð1 Ð1Ð1ÿÏ1øÏ1ñÏ1êÏ1ãÏ1ÜÏ1ÕÏ1ÎÏ1ÇÏ1ÀÏ1¹Ï1²Ï1«Ï1¤Ï1Ï1–Ï1Ï1ˆÏ1Ï1zÏ1sÏ1lÏ1eÏ1^Ï1WÏ1PÏ1IÏ1BÏ1;Ï14Ï1-Ï1&Ï1Ï1Ï1Ï1 Ï1Ï1üÎ1õÎ1îÎ1çÎ1àÎ1ÙÎ1ÒÎ1ËÎ1ÄÎ1½Î1¶Î1¯Î1¨Î1¡Î1šÎ1“Î1ŒÎ1…Î1~Î1wÎ1pÎ1iÎ1bÎ1[Î1TÎ1MÎ1FÎ1?Î18Î11Î1*Î1#Î1Î1Î1Î1Î1Î1ùÍ1òÍ1ëÍ1äÍ1ÝÍ1ÖÍ1ÏÍ1ÈÍ1ÁÍ1ºÍ1³Í1¬Í1¥Í1žÍ1—Í1Í1‰Í1‚Í1{Í1tÍ1mÍ1fÍ1_Í1XÍ1QÍ1JÍ1CÍ1<Í15Í1.Í1'Í1 Í1Í1Í1 Í1Í1ýÌ1öÌ1ïÌ1èÌ1áÌ1ÚÌ1ÓÌ1ÌÌ1ÅÌ1¾Ì1·Ì1°Ì1©Ì1¢Ì1›Ì1”Ì1Ì1†Ì1Ì1xÌ1qÌ1jÌ1cÌ1\Ì1UÌ1NÌ1GÌ1@Ì19Ì12Ì1+Ì1$Ì1Ì1Ì1Ì1Ì1Ì1úË1óË1ìË1åË1ÞË1×Ë1ÐË1ÉË1ÂË1»Ë1´Ë1­Ë1¦Ë1ŸË1˜Ë1‘Ë1ŠË1ƒË1|Ë1uË1nË1gË1`Ë1YË1RË1KË1DË1=Ë16Ë1/Ë1(Ë1!Ë1Ë1Ë1 Ë1Ë1þÊ1÷Ê1ðÊ1éÊ1âÊ1ÛÊ1ÔÊ1ÍÊ1ÆÊ1¿Ê1¸Ê1±Ê1ªÊ1£Ê1œÊ1•Ê1ŽÊ1‡Ê1€Ê1yÊ1rÊ1kÊ1dÊ1]Ê1VÊ1OÊ1HÊ1AÊ1:Ê13Ê1,Ê1%Ê1Ê1Ê1Ê1 Ê1Ê1ûÉ1ôÉ1íÉ1æÉ1ßÉ1ØÉ1ÑÉ1ÊÉ1ÃÉ1¼É1µÉ1®É1§É1 É1™É1’É1‹É1„É1}É1vÉ1oÉ1hÉ1aÉ1ZÉ1SÉ1LÉ1EÉ1>É17É10É1)É1"É1É1É1 É1É1ÿÈ1øÈ1ñÈ1êÈ1ãÈ1ÜÈ1ÕÈ1ÎÈ1ÇÈ1ÀÈ1¹È1²È1«È1¤È1È1–È1È1ˆÈ1È1zÈ1sÈ1lÈ1eÈ1^È1WÈ1PÈ1IÈ1BÈ1;È14È1-È1&È1È1È1È1 È1È1üÇ1õÇ1îÇ1çÇ1àÇ1ÙÇ1ÒÇ1ËÇ1ÄÇ1½Ç1¶Ç1¯Ç1¨Ç1¡Ç1šÇ1“Ç1ŒÇ1…Ç1~Ç1wÇ1pÇ1iÇ1bÇ1[Ç1TÇ1MÇ1FÇ1?Ç18Ç11Ç1*Ç1#Ç1Ç1Ç1Ç1Ç1Ç1ùÆ1òÆ1ëÆ1äÆ1ÝÆ1ÖÆ1ÏÆ1ÈÆ1ÁÆ1ºÆ1³Æ1¬Æ1¥Æ1žÆ1—Æ1Æ1‰Æ1‚Æ1{Æ1tÆ1mÆ1fÆ1_Æ1XÆ1QÆ1JÆ1CÆ1<Æ15Æ1.Æ1'Æ1 Æ1Æ1Æ1 Æ1Æ1ýÅ1öÅ1ïÅ1èÅ1áÅ1ÚÅ1ÓÅ1ÌÅ1ÅÅ1¾Å1·Å1°Å1©Å1¢Å1›Å1”Å1Å1†Å1Å1xÅ1qÅ1jÅ1cÅ1\Å1UÅ1NÅ1GÅ1@Å19Å12Å1+Å1$Å1Å1Å1Å1Å1Å1úÄ1óÄ1ìÄ1åÄ1ÞÄ1×Ä1ÐÄ1ÉÄ1ÂÄ1»Ä1´Ä1­Ä1¦Ä1ŸÄ1˜Ä1‘Ä1ŠÄ1ƒÄ1|Ä1uÄ1nÄ1gÄ1`Ä1YÄ1RÄ1KÄ1DÄ1=Ä16Ä1/Ä1(Ä1!Ä1Ä1Ä1 Ä1Ä1þÃ1÷Ã1ðÃ1éÃ1âÃ1ÛÃ1ÔÃ1ÍÃ1ÆÃ1¿Ã1¸Ã1±Ã1ªÃ1£Ã1œÃ1•Ã1ŽÃ1‡Ã1€Ã1yÃ1rÃ1kÃ1dÃ1]Ã1VÃ1OÃ1HÃ1AÃ1:Ã13Ã1,Ã1%Ã1Ã1Ã1Ã1 Ã1Ã1ûÂ1ôÂ1íÂ1æÂ1ßÂ1ØÂ1ÑÂ1ÊÂ1ÃÂ1¼Â1µÂ1®Â1§Â1 Â1™Â1’Â1‹Â1„Â1}Â1vÂ1oÂ1hÂ1aÂ1ZÂ1SÂ1LÂ1EÂ1>Â17Â10Â1)Â1"Â1Â1Â1 Â1Â1ÿÁ1øÁ1ñÁ1êÁ1ãÁ1ÜÁ1ÕÁ1ÎÁ1ÇÁ1ÀÁ1¹Á1²Á1«Á1¤Á1Á1–Á1Á1ˆÁ1Á1zÁ1sÁ1lÁ1eÁ1^Á1WÁ1PÁ1IÁ1BÁ1;Á14Á1-Á1&Á1Á1Á1Á1 Á1Á1üÀ1õÀ1îÀ1çÀ1àÀ1ÙÀ1ÒÀ1ËÀ1ÄÀ1½À1¶À1¯À1¨À1¡À1šÀ1“À1ŒÀ1…À1~À1wÀ1pÀ1iÀ1bÀ1[À1TÀ1MÀ1FÀ1?À18À11À1*À1#À1À1À1À1À1À1ù¿1ò¿1ë¿1ä¿1Ý¿1Ö¿1Ï¿1È¿1Á¿1º¿1³¿1¬¿1¥¿1ž¿1—¿1¿1‰¿1‚¿1{¿1t¿1m¿1f¿1_¿1X¿1Q¿1J¿1C¿1<¿15¿1.¿1'¿1 ¿1¿1¿1 ¿1¿1ý¾1ö¾1ï¾1è¾1á¾1Ú¾1Ó¾1̾1ž1¾¾1·¾1°¾1©¾1¢¾1›¾1”¾1¾1†¾1¾1x¾1q¾1j¾1c¾1\¾1U¾1N¾1G¾1@¾19¾12¾1+¾1$¾1¾1¾1¾1¾1¾1ú½1ó½1ì½1å½1Þ½1×½1н1ɽ1½1»½1´½1­½1¦½1Ÿ½1˜½1‘½1н1ƒ½1|½1u½1n½1g½1`½1Y½1R½1K½1D½1=½16½1/½1(½1!½1½1½1 ½1½1þ¼1÷¼1ð¼1é¼1â¼1Û¼1Ô¼1ͼ1Ƽ1¿¼1¸¼1±¼1ª¼1£¼1œ¼1•¼1޼1‡¼1€¼1y¼1r¼1k¼1d¼1]¼1V¼1O¼1H¼1A¼1:¼13¼1,¼1%¼1¼1¼1¼1 ¼1¼1û»1ô»1í»1æ»1ß»1Ø»1Ñ»1Ê»1û1¼»1µ»1®»1§»1 »1™»1’»1‹»1„»1}»1v»1o»1h»1a»1Z»1S»1L»1E»1>»17»10»1)»1"»1»1»1 »1»1ÿº1øº1ñº1êº1ãº1ܺ1Õº1κ1Ǻ1Àº1¹º1²º1«º1¤º1º1–º1º1ˆº1º1zº1sº1lº1eº1^º1Wº1Pº1Iº1Bº1;º14º1-º1&º1º1º1º1 º1º1ü¹1õ¹1î¹1ç¹1à¹1Ù¹1Ò¹1˹1Ĺ1½¹1¶¹1¯¹1¨¹1¡¹1š¹1“¹1Œ¹1…¹1~¹1w¹1p¹1i¹1b¹1[¹1T¹1M¹1F¹1?¹18¹11¹1*¹1#¹1¹1¹1¹1¹1¹1ù¸1ò¸1ë¸1ä¸1ݸ1Ö¸1ϸ1ȸ1Á¸1º¸1³¸1¬¸1¥¸1ž¸1—¸1¸1‰¸1‚¸1{¸1t¸1m¸1f¸1_¸1X¸1Q¸1J¸1C¸1<¸15¸1.¸1'¸1 ¸1¸1¸1 ¸1¸1ý·1ö·1ï·1è·1á·1Ú·1Ó·1Ì·1Å·1¾·1··1°·1©·1¢·1›·1”·1·1†·1·1x·1q·1j·1c·1\·1U·1N·1G·1@·19·12·1+·1$·1·1·1·1·1·1ú¶1ó¶1ì¶1å¶1Þ¶1×¶1ж1ɶ1¶1»¶1´¶1­¶1¦¶1Ÿ¶1˜¶1‘¶1ж1ƒ¶1|¶1u¶1n¶1g¶1`¶1Y¶1R¶1K¶1D¶1=¶16¶1/¶1(¶1!¶1¶1¶1 ¶1¶1þµ1÷µ1ðµ1éµ1âµ1Ûµ1Ôµ1͵1Ƶ1¿µ1¸µ1±µ1ªµ1£µ1œµ1•µ1޵1‡µ1€µ1yµ1rµ1kµ1dµ1]µ1Vµ1Oµ1Hµ1Aµ1:µ13µ1,µ1%µ1µ1µ1µ1 µ1µ1û´1ô´1í´1æ´1ß´1Ø´1Ñ´1Ê´1ô1¼´1µ´1®´1§´1 ´1™´1’´1‹´1„´1}´1v´1o´1h´1a´1Z´1S´1L´1E´1>´17´10´1)´1"´1´1´1 ´1´1ÿ³1ø³1ñ³1ê³1ã³1ܳ1Õ³1γ1dz1À³1¹³1²³1«³1¤³1³1–³1³1ˆ³1³1z³1s³1l³1e³1^³1W³1P³1I³1B³1;³14³1-³1&³1³1³1³1 ³1³1ü²1õ²1î²1ç²1à²1Ù²1Ò²1˲1IJ1½²1¶²1¯²1¨²1¡²1š²1“²1Œ²1…²1~²1w²1p²1i²1b²1[²1T²1M²1F²1?²18²11²1*²1#²1²1²1²1²1²1ù±1ò±1ë±1ä±1ݱ1Ö±1ϱ1ȱ1Á±1º±1³±1¬±1¥±1ž±1—±1±1‰±1‚±1{±1t±1m±1f±1_±1X±1Q±1J±1C±1<±15±1.±1'±1 ±1±1±1 ±1±1ý°1ö°1ï°1è°1á°1Ú°1Ó°1̰1Ű1¾°1·°1°°1©°1¢°1›°1”°1°1†°1°1x°1q°1j°1c°1\°1U°1N°1G°1@°19°12°1+°1$°1°1°1°1°1°1ú¯1ó¯1ì¯1å¯1Þ¯1ׯ1Я1ɯ1¯1»¯1´¯1­¯1¦¯1Ÿ¯1˜¯1‘¯1Н1ƒ¯1|¯1u¯1n¯1g¯1`¯1Y¯1R¯1K¯1D¯1=¯16¯1/¯1(¯1!¯1¯1¯1 ¯1¯1þ®1÷®1ð®1é®1â®1Û®1Ô®1Í®1Æ®1¿®1¸®1±®1ª®1£®1œ®1•®1Ž®1‡®1€®1y®1r®1k®1d®1]®1V®1O®1H®1A®1:®13®1,®1%®1®1®1®1 ®1®1û­1ô­1í­1æ­1ß­1Ø­1Ñ­1Ê­1í1¼­1µ­1®­1§­1 ­1™­1’­1‹­1„­1}­1v­1o­1h­1a­1Z­1S­1L­1E­1>­17­10­1)­1"­1­1­1 ­1­1ÿ¬1ø¬1ñ¬1ê¬1ã¬1ܬ1Õ¬1ά1Ǭ1À¬1¹¬1²¬1«¬1¤¬1¬1–¬1¬1ˆ¬1¬1z¬1s¬1l¬1e¬1^¬1W¬1P¬1I¬1B¬1;¬14¬1-¬1&¬1¬1¬1¬1 ¬1¬1ü«1õ«1î«1ç«1à«1Ù«1Ò«1Ë«1Ä«1½«1¶«1¯«1¨«1¡«1š«1“«1Œ«1…«1~«1w«1p«1i«1b«1[«1T«1M«1F«1?«18«11«1*«1#«1«1«1«1«1«1ùª1òª1ëª1äª1ݪ1Öª1Ϫ1Ȫ1Áª1ºª1³ª1¬ª1¥ª1žª1—ª1ª1‰ª1‚ª1{ª1tª1mª1fª1_ª1Xª1Qª1Jª1Cª1<ª15ª1.ª1'ª1 ª1ª1ª1 ª1ª1ý©1ö©1ï©1è©1á©1Ú©1Ó©1Ì©1Å©1¾©1·©1°©1©©1¢©1›©1”©1©1†©1©1x©1q©1j©1c©1\©1U©1N©1G©1@©19©12©1+©1$©1©1©1©1©1©1ú¨1ó¨1ì¨1å¨1Þ¨1ר1Ш1ɨ1¨1»¨1´¨1­¨1¦¨1Ÿ¨1˜¨1‘¨1Ѝ1ƒ¨1|¨1u¨1n¨1g¨1`¨1Y¨1R¨1K¨1D¨1=¨16¨1/¨1(¨1!¨1¨1¨1 ¨1¨1þ§1÷§1ð§1é§1â§1Û§1Ô§1ͧ1Ƨ1¿§1¸§1±§1ª§1£§1œ§1•§1ާ1‡§1€§1y§1r§1k§1d§1]§1V§1O§1H§1A§1:§13§1,§1%§1§1§1§1 §1§1û¦1ô¦1í¦1æ¦1ߦ1ئ1Ѧ1ʦ1æ1¼¦1µ¦1®¦1§¦1 ¦1™¦1’¦1‹¦1„¦1}¦1v¦1o¦1h¦1a¦1Z¦1S¦1L¦1E¦1>¦17¦10¦1)¦1"¦1¦1¦1 ¦1¦1ÿ¥1ø¥1ñ¥1ê¥1ã¥1Ü¥1Õ¥1Î¥1Ç¥1À¥1¹¥1²¥1«¥1¤¥1¥1–¥1¥1ˆ¥1¥1z¥1s¥1l¥1e¥1^¥1W¥1P¥1I¥1B¥1;¥14¥1-¥1&¥1¥1¥1¥1 ¥1¥1ü¤1õ¤1î¤1ç¤1à¤1Ù¤1Ò¤1ˤ1Ĥ1½¤1¶¤1¯¤1¨¤1¡¤1š¤1“¤1Œ¤1…¤1~¤1w¤1p¤1i¤1b¤1[¤1T¤1M¤1F¤1?¤18¤11¤1*¤1#¤1¤1¤1¤1¤1¤1ù£1ò£1ë£1ä£1Ý£1Ö£1Ï£1È£1Á£1º£1³£1¬£1¥£1ž£1—£1£1‰£1‚£1{£1t£1m£1f£1_£1X£1Q£1J£1C£1<£15£1.£1'£1 £1£1£1 £1£1ý¢1ö¢1ï¢1è¢1á¢1Ú¢1Ó¢1Ì¢1Å¢1¾¢1·¢1°¢1©¢1¢¢1›¢1”¢1¢1†¢1¢1x¢1q¢1j¢1c¢1\¢1U¢1N¢1G¢1@¢19¢12¢1+¢1$¢1¢1¢1¢1¢1¢1ú¡1ó¡1ì¡1å¡1Þ¡1ס1С1É¡1¡1»¡1´¡1­¡1¦¡1Ÿ¡1˜¡1‘¡1Š¡1ƒ¡1|¡1u¡1n¡1g¡1`¡1Y¡1R¡1K¡1D¡1=¡16¡1/¡1(¡1!¡1¡1¡1 ¡1¡1þ 1÷ 1ð 1é 1â 1Û 1Ô 1Í 1Æ 1¿ 1¸ 1± 1ª 1£ 1œ 1• 1Ž 1‡ 1€ 1y 1r 1k 1d 1] 1V 1O 1H 1A 1: 13 1, 1% 1 1 1 1  1 1ûŸ1ôŸ1íŸ1æŸ1ߟ1ØŸ1ÑŸ1ÊŸ1ß1¼Ÿ1µŸ1®Ÿ1§Ÿ1 Ÿ1™Ÿ1’Ÿ1‹Ÿ1„Ÿ1}Ÿ1vŸ1oŸ1hŸ1aŸ1ZŸ1SŸ1LŸ1EŸ1>Ÿ17Ÿ10Ÿ1)Ÿ1"Ÿ1Ÿ1Ÿ1 Ÿ1Ÿ1ÿž1øž1ñž1êž1ãž1Üž1Õž1Ξ1Çž1Àž1¹ž1²ž1«ž1¤ž1ž1–ž1ž1ˆž1ž1zž1sž1lž1ež1^ž1Wž1Pž1Iž1Bž1;ž14ž1-ž1&ž1ž1ž1ž1 ž1ž1ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ùœ1òœ1ëœ1äœ1Ýœ1Öœ1Ïœ1Èœ1Áœ1ºœ1³œ1¬œ1¥œ1žœ1—œ1œ1‰œ1‚œ1{œ1tœ1mœ1fœ1_œ1Xœ1Qœ1Jœ1Cœ1<œ15œ1.œ1'œ1 œ1œ1œ1 œ1œ1ý›1ö›1ï›1è›1á›1Ú›1Ó›1Ì›1Å›1¾›1·›1°›1©›1¢›1››1”›1›1†›1›1x›1q›1j›1c›1\›1U›1N›1G›1@›19›12›1+›1$›1›1›1›1›1›1úš1óš1ìš1åš1Þš1ך1К1Éš1š1»š1´š1­š1¦š1Ÿš1˜š1‘š1Šš1ƒš1|š1uš1nš1gš1`š1Yš1Rš1Kš1Dš1=š16š1/š1(š1!š1š1š1 š1š1þ™1÷™1ð™1é™1â™1Û™1Ô™1Í™1Æ™1¿™1¸™1±™1ª™1£™1œ™1•™1Ž™1‡™1€™1y™1r™1k™1d™1]™1V™1O™1H™1A™1:™13™1,™1%™1™1™1™1 ™1™1û˜1ô˜1í˜1æ˜1ߘ1ؘ1ј1ʘ1Ø1¼˜1µ˜1®˜1§˜1 ˜1™˜1’˜1‹˜1„˜1}˜1v˜1o˜1h˜1a˜1Z˜1S˜1L˜1E˜1>˜17˜10˜1)˜1"˜1˜1˜1 ˜1˜1ÿ—1ø—1ñ—1ê—1ã—1Ü—1Õ—1Η1Ç—1À—1¹—1²—1«—1¤—1—1–—1—1ˆ—1—1z—1s—1l—1e—1^—1W—1P—1I—1B—1;—14—1-—1&—1—1—1—1 —1—1ü–1õ–1î–1ç–1à–1Ù–1Ò–1Ë–1Ä–1½–1¶–1¯–1¨–1¡–1š–1“–1Œ–1…–1~–1w–1p–1i–1b–1[–1T–1M–1F–1?–18–11–1*–1#–1–1–1–1–1–1ù•1ò•1ë•1ä•1Ý•1Ö•1Ï•1È•1Á•1º•1³•1¬•1¥•1ž•1—•1•1‰•1‚•1{•1t•1m•1f•1_•1X•1Q•1J•1C•1<•15•1.•1'•1 •1•1•1 •1•1ý”1ö”1ï”1è”1á”1Ú”1Ó”1Ì”1Å”1¾”1·”1°”1©”1¢”1›”1””1”1†”1”1x”1q”1j”1c”1\”1U”1N”1G”1@”19”12”1+”1$”1”1”1”1”1”1ú“1ó“1ì“1å“1Þ“1ד1Г1É“1“1»“1´“1­“1¦“1Ÿ“1˜“1‘“1Š“1ƒ“1|“1u“1n“1g“1`“1Y“1R“1K“1D“1=“16“1/“1(“1!“1“1“1 “1“1þ’1÷’1ð’1é’1â’1Û’1Ô’1Í’1Æ’1¿’1¸’1±’1ª’1£’1œ’1•’1Ž’1‡’1€’1y’1r’1k’1d’1]’1V’1O’1H’1A’1:’13’1,’1%’1’1’1’1 ’1’1û‘1ô‘1í‘1æ‘1ß‘1Ø‘1Ñ‘1Ê‘1Ñ1¼‘1µ‘1®‘1§‘1 ‘1™‘1’‘1‹‘1„‘1}‘1v‘1o‘1h‘1a‘1Z‘1S‘1L‘1E‘1>‘17‘10‘1)‘1"‘1‘1‘1 ‘1‘1ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ùŽ1òŽ1ëŽ1äŽ1ÝŽ1ÖŽ1ÏŽ1ÈŽ1ÁŽ1ºŽ1³Ž1¬Ž1¥Ž1žŽ1—Ž1Ž1‰Ž1‚Ž1{Ž1tŽ1mŽ1fŽ1_Ž1XŽ1QŽ1JŽ1CŽ1<Ž15Ž1.Ž1'Ž1 Ž1Ž1Ž1 Ž1Ž1ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111úŒ1óŒ1ìŒ1åŒ1ÞŒ1׌1ÐŒ1ÉŒ1ÂŒ1»Œ1´Œ1­Œ1¦Œ1ŸŒ1˜Œ1‘Œ1ŠŒ1ƒŒ1|Œ1uŒ1nŒ1gŒ1`Œ1YŒ1RŒ1KŒ1DŒ1=Œ16Œ1/Œ1(Œ1!Œ1Œ1Œ1 Œ1Œ1þ‹1÷‹1ð‹1é‹1â‹1Û‹1Ô‹1Í‹1Æ‹1¿‹1¸‹1±‹1ª‹1£‹1œ‹1•‹1Ž‹1‡‹1€‹1y‹1r‹1k‹1d‹1]‹1V‹1O‹1H‹1A‹1:‹13‹1,‹1%‹1‹1‹1‹1 ‹1‹1ûŠ1ôŠ1íŠ1æŠ1ߊ1ØŠ1ÑŠ1ÊŠ1Ê1¼Š1µŠ1®Š1§Š1 Š1™Š1’Š1‹Š1„Š1}Š1vŠ1oŠ1hŠ1aŠ1ZŠ1SŠ1LŠ1EŠ1>Š17Š10Š1)Š1"Š1Š1Š1 Š1Š1ÿ‰1ø‰1ñ‰1ê‰1ã‰1܉1Õ‰1Ή1lj1À‰1¹‰1²‰1«‰1¤‰1‰1–‰1‰1ˆ‰1‰1z‰1s‰1l‰1e‰1^‰1W‰1P‰1I‰1B‰1;‰14‰1-‰1&‰1‰1‰1‰1 ‰1‰1üˆ1õˆ1îˆ1çˆ1àˆ1Ùˆ1Òˆ1ˈ1Ĉ1½ˆ1¶ˆ1¯ˆ1¨ˆ1¡ˆ1šˆ1“ˆ1Œˆ1…ˆ1~ˆ1wˆ1pˆ1iˆ1bˆ1[ˆ1Tˆ1Mˆ1Fˆ1?ˆ18ˆ11ˆ1*ˆ1#ˆ1ˆ1ˆ1ˆ1ˆ1ˆ1ù‡1ò‡1ë‡1ä‡1݇1Ö‡1χ1ȇ1Á‡1º‡1³‡1¬‡1¥‡1ž‡1—‡1‡1‰‡1‚‡1{‡1t‡1m‡1f‡1_‡1X‡1Q‡1J‡1C‡1<‡15‡1.‡1'‡1 ‡1‡1‡1 ‡1‡1ý†1ö†1ï†1è†1á†1Ú†1Ó†1̆1ņ1¾†1·†1°†1©†1¢†1›†1”†1†1††1†1x†1q†1j†1c†1\†1U†1N†1G†1@†19†12†1+†1$†1†1†1†1†1†1ú…1ó…1ì…1å…1Þ…1×…1Ð…1É…1Â…1»…1´…1­…1¦…1Ÿ…1˜…1‘…1Š…1ƒ…1|…1u…1n…1g…1`…1Y…1R…1K…1D…1=…16…1/…1(…1!…1…1…1 …1…1þ„1÷„1ð„1é„1â„1Û„1Ô„1Í„1Æ„1¿„1¸„1±„1ª„1£„1œ„1•„1Ž„1‡„1€„1y„1r„1k„1d„1]„1V„1O„1H„1A„1:„13„1,„1%„1„1„1„1 „1„1ûƒ1ôƒ1íƒ1æƒ1߃1؃1у1ʃ1Ã1¼ƒ1µƒ1®ƒ1§ƒ1 ƒ1™ƒ1’ƒ1‹ƒ1„ƒ1}ƒ1vƒ1oƒ1hƒ1aƒ1Zƒ1Sƒ1Lƒ1Eƒ1>ƒ17ƒ10ƒ1)ƒ1"ƒ1ƒ1ƒ1 ƒ1ƒ1ÿ‚1ø‚1ñ‚1ê‚1ã‚1Ü‚1Õ‚1΂1Ç‚1À‚1¹‚1²‚1«‚1¤‚1‚1–‚1‚1ˆ‚1‚1z‚1s‚1l‚1e‚1^‚1W‚1P‚1I‚1B‚1;‚14‚1-‚1&‚1‚1‚1‚1 ‚1‚1ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù€1ò€1ë€1ä€1Ý€1Ö€1Ï€1È€1Á€1º€1³€1¬€1¥€1ž€1—€1€1‰€1‚€1{€1t€1m€1f€1_€1X€1Q€1J€1C€1<€15€1.€1'€1 €1€1€1 €1€1ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú~1ó~1ì~1å~1Þ~1×~1Ð~1É~1Â~1»~1´~1­~1¦~1Ÿ~1˜~1‘~1Š~1ƒ~1|~1u~1n~1g~1`~1Y~1R~1K~1D~1=~16~1/~1(~1!~1~1~1 ~1~1þ}1÷}1ð}1é}1â}1Û}1Ô}1Í}1Æ}1¿}1¸}1±}1ª}1£}1œ}1•}1Ž}1‡}1€}1y}1r}1k}1d}1]}1V}1O}1H}1A}1:}13}1,}1%}1}1}1}1 }1}1û|1ô|1í|1æ|1ß|1Ø|1Ñ|1Ê|1Ã|1¼|1µ|1®|1§|1 |1™|1’|1‹|1„|1}|1v|1o|1h|1a|1Z|1S|1L|1E|1>|17|10|1)|1"|1|1|1 |1|1ÿ{1ø{1ñ{1ê{1ã{1Ü{1Õ{1Î{1Ç{1À{1¹{1²{1«{1¤{1{1–{1{1ˆ{1{1z{1s{1l{1e{1^{1W{1P{1I{1B{1;{14{1-{1&{1{1{1{1 {1{1üz1õz1îz1çz1àz1Ùz1Òz1Ëz1Äz1½z1¶z1¯z1¨z1¡z1šz1“z1Œz1…z1~z1wz1pz1iz1bz1[z1Tz1Mz1Fz1?z18z11z1*z1#z1z1z1z1z1z1ùy1òy1ëy1äy1Ýy1Öy1Ïy1Èy1Áy1ºy1³y1¬y1¥y1žy1—y1y1‰y1‚y1{y1ty1my1fy1_y1Xy1Qy1Jy1Cy1u17u10u1)u1"u1u1u1 u1u1ÿt1øt1ñt1êt1ãt1Üt1Õt1Ît1Çt1Àt1¹t1²t1«t1¤t1t1–t1t1ˆt1t1zt1st1lt1et1^t1Wt1Pt1It1Bt1;t14t1-t1&t1t1t1t1 t1t1üs1õs1îs1çs1às1Ùs1Òs1Ës1Äs1½s1¶s1¯s1¨s1¡s1šs1“s1Œs1…s1~s1ws1ps1is1bs1[s1Ts1Ms1Fs1?s18s11s1*s1#s1s1s1s1s1s1ùr1òr1ër1är1Ýr1Ör1Ïr1Èr1Ár1ºr1³r1¬r1¥r1žr1—r1r1‰r1‚r1{r1tr1mr1fr1_r1Xr1Qr1Jr1Cr1n17n10n1)n1"n1n1n1 n1n1ÿm1øm1ñm1êm1ãm1Üm1Õm1Îm1Çm1Àm1¹m1²m1«m1¤m1m1–m1m1ˆm1m1zm1sm1lm1em1^m1Wm1Pm1Im1Bm1;m14m1-m1&m1m1m1m1 m1m1ül1õl1îl1çl1àl1Ùl1Òl1Ël1Äl1½l1¶l1¯l1¨l1¡l1šl1“l1Œl1…l1~l1wl1pl1il1bl1[l1Tl1Ml1Fl1?l18l11l1*l1#l1l1l1l1l1l1ùk1òk1ëk1äk1Ýk1Ök1Ïk1Èk1Ák1ºk1³k1¬k1¥k1žk1—k1k1‰k1‚k1{k1tk1mk1fk1_k1Xk1Qk1Jk1Ck1g17g10g1)g1"g1g1g1 g1g1ÿf1øf1ñf1êf1ãf1Üf1Õf1Îf1Çf1Àf1¹f1²f1«f1¤f1f1–f1f1ˆf1f1zf1sf1lf1ef1^f1Wf1Pf1If1Bf1;f14f1-f1&f1f1f1f1 f1f1üe1õe1îe1çe1àe1Ùe1Òe1Ëe1Äe1½e1¶e1¯e1¨e1¡e1še1“e1Œe1…e1~e1we1pe1ie1be1[e1Te1Me1Fe1?e18e11e1*e1#e1e1e1e1e1e1ùd1òd1ëd1äd1Ýd1Öd1Ïd1Èd1Ád1ºd1³d1¬d1¥d1žd1—d1d1‰d1‚d1{d1td1md1fd1_d1Xd1Qd1Jd1Cd1`17`10`1)`1"`1`1`1 `1`1ÿ_1ø_1ñ_1ê_1ã_1Ü_1Õ_1Î_1Ç_1À_1¹_1²_1«_1¤_1_1–_1_1ˆ_1_1z_1s_1l_1e_1^_1W_1P_1I_1B_1;_14_1-_1&_1_1_1_1 _1_1ü^1õ^1î^1ç^1à^1Ù^1Ò^1Ë^1Ä^1½^1¶^1¯^1¨^1¡^1š^1“^1Œ^1…^1~^1w^1p^1i^1b^1[^1T^1M^1F^1?^18^11^1*^1#^1^1^1^1^1^1ù]1ò]1ë]1ä]1Ý]1Ö]1Ï]1È]1Á]1º]1³]1¬]1¥]1ž]1—]1]1‰]1‚]1{]1t]1m]1f]1_]1X]1Q]1J]1C]1<]15]1.]1']1 ]1]1]1 ]1]1ý\1ö\1ï\1è\1á\1Ú\1Ó\1Ì\1Å\1¾\1·\1°\1©\1¢\1›\1”\1\1†\1\1x\1q\1j\1c\1\\1U\1N\1G\1@\19\12\1+\1$\1\1\1\1\1\1ú[1ó[1ì[1å[1Þ[1×[1Ð[1É[1Â[1»[1´[1­[1¦[1Ÿ[1˜[1‘[1Š[1ƒ[1|[1u[1n[1g[1`[1Y[1R[1K[1D[1=[16[1/[1([1![1[1[1 [1[1þZ1÷Z1ðZ1éZ1âZ1ÛZ1ÔZ1ÍZ1ÆZ1¿Z1¸Z1±Z1ªZ1£Z1œZ1•Z1ŽZ1‡Z1€Z1yZ1rZ1kZ1dZ1]Z1VZ1OZ1HZ1AZ1:Z13Z1,Z1%Z1Z1Z1Z1 Z1Z1ûY1ôY1íY1æY1ßY1ØY1ÑY1ÊY1ÃY1¼Y1µY1®Y1§Y1 Y1™Y1’Y1‹Y1„Y1}Y1vY1oY1hY1aY1ZY1SY1LY1EY1>Y17Y10Y1)Y1"Y1Y1Y1 Y1Y1ÿX1øX1ñX1êX1ãX1ÜX1ÕX1ÎX1ÇX1ÀX1¹X1²X1«X1¤X1X1–X1X1ˆX1X1zX1sX1lX1eX1^X1WX1PX1IX1BX1;X14X1-X1&X1X1X1X1 X1X1üW1õW1îW1çW1àW1ÙW1ÒW1ËW1ÄW1½W1¶W1¯W1¨W1¡W1šW1“W1ŒW1…W1~W1wW1pW1iW1bW1[W1TW1MW1FW1?W18W11W1*W1#W1W1W1W1W1W1ùV1òV1ëV1äV1ÝV1ÖV1ÏV1ÈV1ÁV1ºV1³V1¬V1¥V1žV1—V1V1‰V1‚V1{V1tV1mV1fV1_V1XV1QV1JV1CV1R17R10R1)R1"R1R1R1 R1R1ÿQ1øQ1ñQ1êQ1ãQ1ÜQ1ÕQ1ÎQ1ÇQ1ÀQ1¹Q1²Q1«Q1¤Q1Q1–Q1Q1ˆQ1Q1zQ1sQ1lQ1eQ1^Q1WQ1PQ1IQ1BQ1;Q14Q1-Q1&Q1Q1Q1Q1 Q1Q1üP1õP1îP1çP1àP1ÙP1ÒP1ËP1ÄP1½P1¶P1¯P1¨P1¡P1šP1“P1ŒP1…P1~P1wP1pP1iP1bP1[P1TP1MP1FP1?P18P11P1*P1#P1P1P1P1P1P1ùO1òO1ëO1äO1ÝO1ÖO1ÏO1ÈO1ÁO1ºO1³O1¬O1¥O1žO1—O1O1‰O1‚O1{O1tO1mO1fO1_O1XO1QO1JO1CO1K17K10K1)K1"K1K1K1 K1K1ÿJ1øJ1ñJ1êJ1ãJ1ÜJ1ÕJ1ÎJ1ÇJ1ÀJ1¹J1²J1«J1¤J1J1–J1J1ˆJ1J1zJ1sJ1lJ1eJ1^J1WJ1PJ1IJ1BJ1;J14J1-J1&J1J1J1J1 J1J1üI1õI1îI1çI1àI1ÙI1ÒI1ËI1ÄI1½I1¶I1¯I1¨I1¡I1šI1“I1ŒI1…I1~I1wI1pI1iI1bI1[I1TI1MI1FI1?I18I11I1*I1#I1I1I1I1I1I1ùH1òH1ëH1äH1ÝH1ÖH1ÏH1ÈH1ÁH1ºH1³H1¬H1¥H1žH1—H1H1‰H1‚H1{H1tH1mH1fH1_H1XH1QH1JH1CH1D17D10D1)D1"D1D1D1 D1D1ÿC1øC1ñC1êC1ãC1ÜC1ÕC1ÎC1ÇC1ÀC1¹C1²C1«C1¤C1C1–C1C1ˆC1C1zC1sC1lC1eC1^C1WC1PC1IC1BC1;C14C1-C1&C1C1C1C1 C1C1üB1õB1îB1çB1àB1ÙB1ÒB1ËB1ÄB1½B1¶B1¯B1¨B1¡B1šB1“B1ŒB1…B1~B1wB1pB1iB1bB1[B1TB1MB1FB1?B18B11B1*B1#B1B1B1B1B1B1ùA1òA1ëA1äA1ÝA1ÖA1ÏA1ÈA1ÁA1ºA1³A1¬A1¥A1žA1—A1A1‰A1‚A1{A1tA1mA1fA1_A1XA1QA1JA1CA11÷>1ð>1é>1â>1Û>1Ô>1Í>1Æ>1¿>1¸>1±>1ª>1£>1œ>1•>1Ž>1‡>1€>1y>1r>1k>1d>1]>1V>1O>1H>1A>1:>13>1,>1%>1>1>1>1 >1>1û=1ô=1í=1æ=1ß=1Ø=1Ñ=1Ê=1Ã=1¼=1µ=1®=1§=1 =1™=1’=1‹=1„=1}=1v=1o=1h=1a=1Z=1S=1L=1E=1>=17=10=1)=1"=1=1=1 =1=1ÿ<1ø<1ñ<1ê<1ã<1Ü<1Õ<1Î<1Ç<1À<1¹<1²<1«<1¤<1<1–<1<1ˆ<1<1z<1s<1l<1e<1^<1W<1P<1I<1B<1;<14<1-<1&<1<1<1<1 <1<1ü;1õ;1î;1ç;1à;1Ù;1Ò;1Ë;1Ä;1½;1¶;1¯;1¨;1¡;1š;1“;1Œ;1…;1~;1w;1p;1i;1b;1[;1T;1M;1F;1?;18;11;1*;1#;1;1;1;1;1;1ù:1ò:1ë:1ä:1Ý:1Ö:1Ï:1È:1Á:1º:1³:1¬:1¥:1ž:1—:1:1‰:1‚:1{:1t:1m:1f:1_:1X:1Q:1J:1C:1<:15:1.:1':1 :1:1:1 :1:1ý91ö91ï91è91á91Ú91Ó91Ì91Å91¾91·91°91©91¢91›91”9191†9191x91q91j91c91\91U91N91G91@91991291+91$919191919191ú81ó81ì81å81Þ81×81Ð81É81Â81»81´81­81¦81Ÿ81˜81‘81Š81ƒ81|81u81n81g81`81Y81R81K81D81=81681/81(81!818181 8181þ71÷71ð71é71â71Û71Ô71Í71Æ71¿71¸71±71ª71£71œ71•71Ž71‡71€71y71r71k71d71]71V71O71H71A71:71371,71%71717171 7171û61ô61í61æ61ß61Ø61Ñ61Ê61Ã61¼61µ61®61§61 61™61’61‹61„61}61v61o61h61a61Z61S61L61E61>61761061)61"616161 6161ÿ51ø51ñ51ê51ã51Ü51Õ51Î51Ç51À51¹51²51«51¤5151–5151ˆ5151z51s51l51e51^51W51P51I51B51;51451-51&51515151 5151ü41õ41î41ç41à41Ù41Ò41Ë41Ä41½41¶41¯41¨41¡41š41“41Œ41…41~41w41p41i41b41[41T41M41F41?41841141*41#414141414141ù31ò31ë31ä31Ý31Ö31Ï31È31Á31º31³31¬31¥31ž31—3131‰31‚31{31t31m31f31_31X31Q31J31C31<31531.31'31 313131 3131ý21ö21ï21è21á21Ú21Ó21Ì21Å21¾21·21°21©21¢21›21”2121†2121x21q21j21c21\21U21N21G21@21921221+21$212121212121ú11ó11ì11å11Þ11×11Ð11É11Â11»11´11­11¦11Ÿ11˜11‘11Š11ƒ11|11u11n11g11`11Y11R11K11D11=11611/11(11!111111 1111þ01÷01ð01é01â01Û01Ô01Í01Æ01¿01¸01±01ª01£01œ01•01Ž01‡01€01y01r01k01d01]01V01O01H01A01:01301,01%01010101 0101û/1ô/1í/1æ/1ß/1Ø/1Ñ/1Ê/1Ã/1¼/1µ/1®/1§/1 /1™/1’/1‹/1„/1}/1v/1o/1h/1a/1Z/1S/1L/1E/1>/17/10/1)/1"/1/1/1 /1/1ÿ.1ø.1ñ.1ê.1ã.1Ü.1Õ.1Î.1Ç.1À.1¹.1².1«.1¤.1.1–.1.1ˆ.1.1z.1s.1l.1e.1^.1W.1P.1I.1B.1;.14.1-.1&.1.1.1.1 .1.1ü-1õ-1î-1ç-1à-1Ù-1Ò-1Ë-1Ä-1½-1¶-1¯-1¨-1¡-1š-1“-1Œ-1…-1~-1w-1p-1i-1b-1[-1T-1M-1F-1?-18-11-1*-1#-1-1-1-1-1-1ù,1ò,1ë,1ä,1Ý,1Ö,1Ï,1È,1Á,1º,1³,1¬,1¥,1ž,1—,1,1‰,1‚,1{,1t,1m,1f,1_,1X,1Q,1J,1C,1<,15,1.,1',1 ,1,1,1 ,1,1ý+1ö+1ï+1è+1á+1Ú+1Ó+1Ì+1Å+1¾+1·+1°+1©+1¢+1›+1”+1+1†+1+1x+1q+1j+1c+1\+1U+1N+1G+1@+19+12+1++1$+1+1+1+1+1+1ú*1ó*1ì*1å*1Þ*1×*1Ð*1É*1Â*1»*1´*1­*1¦*1Ÿ*1˜*1‘*1Š*1ƒ*1|*1u*1n*1g*1`*1Y*1R*1K*1D*1=*16*1/*1(*1!*1*1*1 *1*1þ)1÷)1ð)1é)1â)1Û)1Ô)1Í)1Æ)1¿)1¸)1±)1ª)1£)1œ)1•)1Ž)1‡)1€)1y)1r)1k)1d)1])1V)1O)1H)1A)1:)13)1,)1%)1)1)1)1 )1)1û(1ô(1í(1æ(1ß(1Ø(1Ñ(1Ê(1Ã(1¼(1µ(1®(1§(1 (1™(1’(1‹(1„(1}(1v(1o(1h(1a(1Z(1S(1L(1E(1>(17(10(1)(1"(1(1(1 (1(1ÿ'1ø'1ñ'1ê'1ã'1Ü'1Õ'1Î'1Ç'1À'1¹'1²'1«'1¤'1'1–'1'1ˆ'1'1z'1s'1l'1e'1^'1W'1P'1I'1B'1;'14'1-'1&'1'1'1'1 '1'1ü&1õ&1î&1ç&1à&1Ù&1Ò&1Ë&1Ä&1½&1¶&1¯&1¨&1¡&1š&1“&1Œ&1…&1~&1w&1p&1i&1b&1[&1T&1M&1F&1?&18&11&1*&1#&1&1&1&1&1&1ù%1ò%1ë%1ä%1Ý%1Ö%1Ï%1È%1Á%1º%1³%1¬%1¥%1ž%1—%1%1‰%1‚%1{%1t%1m%1f%1_%1X%1Q%1J%1C%1<%15%1.%1'%1 %1%1%1 %1%1ý$1ö$1ï$1è$1á$1Ú$1Ó$1Ì$1Å$1¾$1·$1°$1©$1¢$1›$1”$1$1†$1$1x$1q$1j$1c$1\$1U$1N$1G$1@$19$12$1+$1$$1$1$1$1$1$1ú#1ó#1ì#1å#1Þ#1×#1Ð#1É#1Â#1»#1´#1­#1¦#1Ÿ#1˜#1‘#1Š#1ƒ#1|#1u#1n#1g#1`#1Y#1R#1K#1D#1=#16#1/#1(#1!#1#1#1 #1#1þ"1÷"1ð"1é"1â"1Û"1Ô"1Í"1Æ"1¿"1¸"1±"1ª"1£"1œ"1•"1Ž"1‡"1€"1y"1r"1k"1d"1]"1V"1O"1H"1A"1:"13"1,"1%"1"1"1"1 "1"1û!1ô!1í!1æ!1ß!1Ø!1Ñ!1Ê!1Ã!1¼!1µ!1®!1§!1 !1™!1’!1‹!1„!1}!1v!1o!1h!1a!1Z!1S!1L!1E!1>!17!10!1)!1"!1!1!1 !1!1ÿ 1ø 1ñ 1ê 1ã 1Ü 1Õ 1Î 1Ç 1À 1¹ 1² 1« 1¤ 1 1– 1 1ˆ 1 1z 1s 1l 1e 1^ 1W 1P 1I 1B 1; 14 1- 1& 1 1 1 1 1 1ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ 1÷ 1ð 1é 1â 1Û 1Ô 1Í 1Æ 1¿ 1¸ 1± 1ª 1£ 1œ 1• 1Ž 1‡ 1€ 1y 1r 1k 1d 1] 1V 1O 1H 1A 1: 13 1, 1% 1 1 1 1 1 1û 1ô 1í 1æ 1ß 1Ø 1Ñ 1Ê 1à 1¼ 1µ 1® 1§ 1  1™ 1’ 1‹ 1„ 1} 1v 1o 1h 1a 1Z 1S 1L 1E 1> 17 10 1) 1" 1 1 1 1 1ÿ 1ø 1ñ 1ê 1ã 1Ü 1Õ 1Î 1Ç 1À 1¹ 1² 1« 1¤ 1 1– 1 1ˆ 1 1z 1s 1l 1e 1^ 1W 1P 1I 1B 1; 14 1- 1& 1 1 1 1 1 1ü 1õ 1î 1ç 1à 1Ù 1Ò 1Ë 1Ä 1½ 1¶ 1¯ 1¨ 1¡ 1š 1“ 1Œ 1… 1~ 1w 1p 1i 1b 1[ 1T 1M 1F 1? 18 11 1* 1# 1 1 1 1 1 1ù 1ò 1ë 1ä 1Ý 1Ö 1Ï 1È 1Á 1º 1³ 1¬ 1¥ 1ž 1— 1 1‰ 1‚ 1{ 1t 1m 1f 1_ 1X 1Q 1J 1C 1< 15 1. 1' 1 1 1 1 1 1ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þÿ0÷ÿ0ðÿ0éÿ0âÿ0Ûÿ0Ôÿ0Íÿ0Æÿ0¿ÿ0¸ÿ0±ÿ0ªÿ0£ÿ0œÿ0•ÿ0Žÿ0‡ÿ0€ÿ0yÿ0rÿ0kÿ0dÿ0]ÿ0Vÿ0Oÿ0Hÿ0Aÿ0:ÿ03ÿ0,ÿ0%ÿ0ÿ0ÿ0ÿ0 ÿ0ÿ0ûþ0ôþ0íþ0æþ0ßþ0Øþ0Ñþ0Êþ0Ãþ0¼þ0µþ0®þ0§þ0 þ0™þ0’þ0‹þ0„þ0}þ0vþ0oþ0hþ0aþ0Zþ0Sþ0Lþ0Eþ0>þ07þ00þ0)þ0"þ0þ0þ0 þ0þ0ÿý0øý0ñý0êý0ãý0Üý0Õý0Îý0Çý0Àý0¹ý0²ý0«ý0¤ý0ý0–ý0ý0ˆý0ý0zý0sý0lý0eý0^ý0Wý0Pý0Iý0Bý0;ý04ý0-ý0&ý0ý0ý0ý0 ý0ý0üü0õü0îü0çü0àü0Ùü0Òü0Ëü0Äü0½ü0¶ü0¯ü0¨ü0¡ü0šü0“ü0Œü0…ü0~ü0wü0pü0iü0bü0[ü0Tü0Mü0Fü0?ü08ü01ü0*ü0#ü0ü0ü0ü0ü0ü0ùû0òû0ëû0äû0Ýû0Öû0Ïû0Èû0Áû0ºû0³û0¬û0¥û0žû0—û0û0‰û0‚û0{û0tû0mû0fû0_û0Xû0Qû0Jû0Cû0<û05û0.û0'û0 û0û0û0 û0û0ýú0öú0ïú0èú0áú0Úú0Óú0Ìú0Åú0¾ú0·ú0°ú0©ú0¢ú0›ú0”ú0ú0†ú0ú0xú0qú0jú0cú0\ú0Uú0Nú0Gú0@ú09ú02ú0+ú0$ú0ú0ú0ú0ú0ú0úù0óù0ìù0åù0Þù0×ù0Ðù0Éù0Âù0»ù0´ù0­ù0¦ù0Ÿù0˜ù0‘ù0Šù0ƒù0|ù0uù0nù0gù0`ù0Yù0Rù0Kù0Dù0=ù06ù0/ù0(ù0!ù0ù0ù0 ù0ù0þø0÷ø0ðø0éø0âø0Ûø0Ôø0Íø0Æø0¿ø0¸ø0±ø0ªø0£ø0œø0•ø0Žø0‡ø0€ø0yø0rø0kø0dø0]ø0Vø0Oø0Hø0Aø0:ø03ø0,ø0%ø0ø0ø0ø0 ø0ø0û÷0ô÷0í÷0æ÷0ß÷0Ø÷0Ñ÷0Ê÷0Ã÷0¼÷0µ÷0®÷0§÷0 ÷0™÷0’÷0‹÷0„÷0}÷0v÷0o÷0h÷0a÷0Z÷0S÷0L÷0E÷0>÷07÷00÷0)÷0"÷0÷0÷0 ÷0÷0ÿö0øö0ñö0êö0ãö0Üö0Õö0Îö0Çö0Àö0¹ö0²ö0«ö0¤ö0ö0–ö0ö0ˆö0ö0zö0sö0lö0eö0^ö0Wö0Pö0Iö0Bö0;ö04ö0-ö0&ö0ö0ö0ö0 ö0ö0üõ0õõ0îõ0çõ0àõ0Ùõ0Òõ0Ëõ0Äõ0½õ0¶õ0¯õ0¨õ0¡õ0šõ0“õ0Œõ0…õ0~õ0wõ0põ0iõ0bõ0[õ0Tõ0Mõ0Fõ0?õ08õ01õ0*õ0#õ0õ0õ0õ0õ0õ0ùô0òô0ëô0äô0Ýô0Öô0Ïô0Èô0Áô0ºô0³ô0¬ô0¥ô0žô0—ô0ô0‰ô0‚ô0{ô0tô0mô0fô0_ô0Xô0Qô0Jô0Cô0<ô05ô0.ô0'ô0 ô0ô0ô0 ô0ô0ýó0öó0ïó0èó0áó0Úó0Óó0Ìó0Åó0¾ó0·ó0°ó0©ó0¢ó0›ó0”ó0ó0†ó0ó0xó0qó0jó0có0\ó0Uó0Nó0Gó0@ó09ó02ó0+ó0$ó0ó0ó0ó0ó0ó0úò0óò0ìò0åò0Þò0×ò0Ðò0Éò0Âò0»ò0´ò0­ò0¦ò0Ÿò0˜ò0‘ò0Šò0ƒò0|ò0uò0nò0gò0`ò0Yò0Rò0Kò0Dò0=ò06ò0/ò0(ò0!ò0ò0ò0 ò0ò0þñ0÷ñ0ðñ0éñ0âñ0Ûñ0Ôñ0Íñ0Æñ0¿ñ0¸ñ0±ñ0ªñ0£ñ0œñ0•ñ0Žñ0‡ñ0€ñ0yñ0rñ0kñ0dñ0]ñ0Vñ0Oñ0Hñ0Añ0:ñ03ñ0,ñ0%ñ0ñ0ñ0ñ0 ñ0ñ0ûð0ôð0íð0æð0ßð0Øð0Ñð0Êð0Ãð0¼ð0µð0®ð0§ð0 ð0™ð0’ð0‹ð0„ð0}ð0vð0oð0hð0að0Zð0Sð0Lð0Eð0>ð07ð00ð0)ð0"ð0ð0ð0 ð0ð0ÿï0øï0ñï0êï0ãï0Üï0Õï0Îï0Çï0Àï0¹ï0²ï0«ï0¤ï0ï0–ï0ï0ˆï0ï0zï0sï0lï0eï0^ï0Wï0Pï0Iï0Bï0;ï04ï0-ï0&ï0ï0ï0ï0 ï0ï0üî0õî0îî0çî0àî0Ùî0Òî0Ëî0Äî0½î0¶î0¯î0¨î0¡î0šî0“î0Œî0…î0~î0wî0pî0iî0bî0[î0Tî0Mî0Fî0?î08î01î0*î0#î0î0î0î0î0î0ùí0òí0ëí0äí0Ýí0Öí0Ïí0Èí0Áí0ºí0³í0¬í0¥í0ží0—í0í0‰í0‚í0{í0tí0mí0fí0_í0Xí0Qí0Jí0Cí0<í05í0.í0'í0 í0í0í0 í0í0ýì0öì0ïì0èì0áì0Úì0Óì0Ìì0Åì0¾ì0·ì0°ì0©ì0¢ì0›ì0”ì0ì0†ì0ì0xì0qì0jì0cì0\ì0Uì0Nì0Gì0@ì09ì02ì0+ì0$ì0ì0ì0ì0ì0ì0úë0óë0ìë0åë0Þë0×ë0Ðë0Éë0Âë0»ë0´ë0­ë0¦ë0Ÿë0˜ë0‘ë0Šë0ƒë0|ë0uë0në0gë0`ë0Yë0Rë0Kë0Dë0=ë06ë0/ë0(ë0!ë0ë0ë0 ë0ë0þê0÷ê0ðê0éê0âê0Ûê0Ôê0Íê0Æê0¿ê0¸ê0±ê0ªê0£ê0œê0•ê0Žê0‡ê0€ê0yê0rê0kê0dê0]ê0Vê0Oê0Hê0Aê0:ê03ê0,ê0%ê0ê0ê0ê0 ê0ê0ûé0ôé0íé0æé0ßé0Øé0Ñé0Êé0Ãé0¼é0µé0®é0§é0 é0™é0’é0‹é0„é0}é0vé0oé0hé0aé0Zé0Sé0Lé0Eé0>é07é00é0)é0"é0é0é0 é0é0ÿè0øè0ñè0êè0ãè0Üè0Õè0Îè0Çè0Àè0¹è0²è0«è0¤è0è0–è0è0ˆè0è0zè0sè0lè0eè0^è0Wè0Pè0Iè0Bè0;è04è0-è0&è0è0è0è0 è0è0üç0õç0îç0çç0àç0Ùç0Òç0Ëç0Äç0½ç0¶ç0¯ç0¨ç0¡ç0šç0“ç0Œç0…ç0~ç0wç0pç0iç0bç0[ç0Tç0Mç0Fç0?ç08ç01ç0*ç0#ç0ç0ç0ç0ç0ç0ùæ0òæ0ëæ0äæ0Ýæ0Öæ0Ïæ0Èæ0Áæ0ºæ0³æ0¬æ0¥æ0žæ0—æ0æ0‰æ0‚æ0{æ0tæ0mæ0fæ0_æ0Xæ0Qæ0Jæ0Cæ0<æ05æ0.æ0'æ0 æ0æ0æ0 æ0æ0ýå0öå0ïå0èå0áå0Úå0Óå0Ìå0Åå0¾å0·å0°å0©å0¢å0›å0”å0å0†å0å0xå0qå0jå0cå0\å0Uå0Nå0Gå0@å09å02å0+å0$å0å0å0å0å0å0úä0óä0ìä0åä0Þä0×ä0Ðä0Éä0Âä0»ä0´ä0­ä0¦ä0Ÿä0˜ä0‘ä0Šä0ƒä0|ä0uä0nä0gä0`ä0Yä0Rä0Kä0Dä0=ä06ä0/ä0(ä0!ä0ä0ä0 ä0ä0þã0÷ã0ðã0éã0âã0Ûã0Ôã0Íã0Æã0¿ã0¸ã0±ã0ªã0£ã0œã0•ã0Žã0‡ã0€ã0yã0rã0kã0dã0]ã0Vã0Oã0Hã0Aã0:ã03ã0,ã0%ã0ã0ã0ã0 ã0ã0ûâ0ôâ0íâ0æâ0ßâ0Øâ0Ñâ0Êâ0Ãâ0¼â0µâ0®â0§â0 â0™â0’â0‹â0„â0}â0vâ0oâ0hâ0aâ0Zâ0Sâ0Lâ0Eâ0>â07â00â0)â0"â0â0â0 â0â0ÿá0øá0ñá0êá0ãá0Üá0Õá0Îá0Çá0Àá0¹á0²á0«á0¤á0á0–á0á0ˆá0á0zá0sá0lá0eá0^á0Wá0Pá0Iá0Bá0;á04á0-á0&á0á0á0á0 á0á0üà0õà0îà0çà0àà0Ùà0Òà0Ëà0Äà0½à0¶à0¯à0¨à0¡à0šà0“à0Œà0…à0~à0wà0pà0ià0bà0[à0Tà0Mà0Fà0?à08à01à0*à0#à0à0à0à0à0à0ùß0òß0ëß0äß0Ýß0Öß0Ïß0Èß0Áß0ºß0³ß0¬ß0¥ß0žß0—ß0ß0‰ß0‚ß0{ß0tß0mß0fß0_ß0Xß0Qß0Jß0Cß0<ß05ß0.ß0'ß0 ß0ß0ß0 ß0ß0ýÞ0öÞ0ïÞ0èÞ0áÞ0ÚÞ0ÓÞ0ÌÞ0ÅÞ0¾Þ0·Þ0°Þ0©Þ0¢Þ0›Þ0”Þ0Þ0†Þ0Þ0xÞ0qÞ0jÞ0cÞ0\Þ0UÞ0NÞ0GÞ0@Þ09Þ02Þ0+Þ0$Þ0Þ0Þ0Þ0Þ0Þ0úÝ0óÝ0ìÝ0åÝ0ÞÝ0×Ý0ÐÝ0ÉÝ0ÂÝ0»Ý0´Ý0­Ý0¦Ý0ŸÝ0˜Ý0‘Ý0ŠÝ0ƒÝ0|Ý0uÝ0nÝ0gÝ0`Ý0YÝ0RÝ0KÝ0DÝ0=Ý06Ý0/Ý0(Ý0!Ý0Ý0Ý0 Ý0Ý0þÜ0÷Ü0ðÜ0éÜ0âÜ0ÛÜ0ÔÜ0ÍÜ0ÆÜ0¿Ü0¸Ü0±Ü0ªÜ0£Ü0œÜ0•Ü0ŽÜ0‡Ü0€Ü0yÜ0rÜ0kÜ0dÜ0]Ü0VÜ0OÜ0HÜ0AÜ0:Ü03Ü0,Ü0%Ü0Ü0Ü0Ü0 Ü0Ü0ûÛ0ôÛ0íÛ0æÛ0ßÛ0ØÛ0ÑÛ0ÊÛ0ÃÛ0¼Û0µÛ0®Û0§Û0 Û0™Û0’Û0‹Û0„Û0}Û0vÛ0oÛ0hÛ0aÛ0ZÛ0SÛ0LÛ0EÛ0>Û07Û00Û0)Û0"Û0Û0Û0 Û0Û0ÿÚ0øÚ0ñÚ0êÚ0ãÚ0ÜÚ0ÕÚ0ÎÚ0ÇÚ0ÀÚ0¹Ú0²Ú0«Ú0¤Ú0Ú0–Ú0Ú0ˆÚ0Ú0zÚ0sÚ0lÚ0eÚ0^Ú0WÚ0PÚ0IÚ0BÚ0;Ú04Ú0-Ú0&Ú0Ú0Ú0Ú0 Ú0Ú0üÙ0õÙ0îÙ0çÙ0àÙ0ÙÙ0ÒÙ0ËÙ0ÄÙ0½Ù0¶Ù0¯Ù0¨Ù0¡Ù0šÙ0“Ù0ŒÙ0…Ù0~Ù0wÙ0pÙ0iÙ0bÙ0[Ù0TÙ0MÙ0FÙ0?Ù08Ù01Ù0*Ù0#Ù0Ù0Ù0Ù0Ù0Ù0ùØ0òØ0ëØ0äØ0ÝØ0ÖØ0ÏØ0ÈØ0ÁØ0ºØ0³Ø0¬Ø0¥Ø0žØ0—Ø0Ø0‰Ø0‚Ø0{Ø0tØ0mØ0fØ0_Ø0XØ0QØ0JØ0CØ0<Ø05Ø0.Ø0'Ø0 Ø0Ø0Ø0 Ø0Ø0ý×0ö×0ï×0è×0á×0Ú×0Ó×0Ì×0Å×0¾×0·×0°×0©×0¢×0›×0”×0×0†×0×0x×0q×0j×0c×0\×0U×0N×0G×0@×09×02×0+×0$×0×0×0×0×0×0úÖ0óÖ0ìÖ0åÖ0ÞÖ0×Ö0ÐÖ0ÉÖ0ÂÖ0»Ö0´Ö0­Ö0¦Ö0ŸÖ0˜Ö0‘Ö0ŠÖ0ƒÖ0|Ö0uÖ0nÖ0gÖ0`Ö0YÖ0RÖ0KÖ0DÖ0=Ö06Ö0/Ö0(Ö0!Ö0Ö0Ö0 Ö0Ö0þÕ0÷Õ0ðÕ0éÕ0âÕ0ÛÕ0ÔÕ0ÍÕ0ÆÕ0¿Õ0¸Õ0±Õ0ªÕ0£Õ0œÕ0•Õ0ŽÕ0‡Õ0€Õ0yÕ0rÕ0kÕ0dÕ0]Õ0VÕ0OÕ0HÕ0AÕ0:Õ03Õ0,Õ0%Õ0Õ0Õ0Õ0 Õ0Õ0ûÔ0ôÔ0íÔ0æÔ0ßÔ0ØÔ0ÑÔ0ÊÔ0ÃÔ0¼Ô0µÔ0®Ô0§Ô0 Ô0™Ô0’Ô0‹Ô0„Ô0}Ô0vÔ0oÔ0hÔ0aÔ0ZÔ0SÔ0LÔ0EÔ0>Ô07Ô00Ô0)Ô0"Ô0Ô0Ô0 Ô0Ô0ÿÓ0øÓ0ñÓ0êÓ0ãÓ0ÜÓ0ÕÓ0ÎÓ0ÇÓ0ÀÓ0¹Ó0²Ó0«Ó0¤Ó0Ó0–Ó0Ó0ˆÓ0Ó0zÓ0sÓ0lÓ0eÓ0^Ó0WÓ0PÓ0IÓ0BÓ0;Ó04Ó0-Ó0&Ó0Ó0Ó0Ó0 Ó0Ó0üÒ0õÒ0îÒ0çÒ0àÒ0ÙÒ0ÒÒ0ËÒ0ÄÒ0½Ò0¶Ò0¯Ò0¨Ò0¡Ò0šÒ0“Ò0ŒÒ0…Ò0~Ò0wÒ0pÒ0iÒ0bÒ0[Ò0TÒ0MÒ0FÒ0?Ò08Ò01Ò0*Ò0#Ò0Ò0Ò0Ò0Ò0Ò0ùÑ0òÑ0ëÑ0äÑ0ÝÑ0ÖÑ0ÏÑ0ÈÑ0ÁÑ0ºÑ0³Ñ0¬Ñ0¥Ñ0žÑ0—Ñ0Ñ0‰Ñ0‚Ñ0{Ñ0tÑ0mÑ0fÑ0_Ñ0XÑ0QÑ0JÑ0CÑ0<Ñ05Ñ0.Ñ0'Ñ0 Ñ0Ñ0Ñ0 Ñ0Ñ0ýÐ0öÐ0ïÐ0èÐ0áÐ0ÚÐ0ÓÐ0ÌÐ0ÅÐ0¾Ð0·Ð0°Ð0©Ð0¢Ð0›Ð0”Ð0Ð0†Ð0Ð0xÐ0qÐ0jÐ0cÐ0\Ð0UÐ0NÐ0GÐ0@Ð09Ð02Ð0+Ð0$Ð0Ð0Ð0Ð0Ð0Ð0úÏ0óÏ0ìÏ0åÏ0ÞÏ0×Ï0ÐÏ0ÉÏ0ÂÏ0»Ï0´Ï0­Ï0¦Ï0ŸÏ0˜Ï0‘Ï0ŠÏ0ƒÏ0|Ï0uÏ0nÏ0gÏ0`Ï0YÏ0RÏ0KÏ0DÏ0=Ï06Ï0/Ï0(Ï0!Ï0Ï0Ï0 Ï0Ï0þÎ0÷Î0ðÎ0éÎ0âÎ0ÛÎ0ÔÎ0ÍÎ0ÆÎ0¿Î0¸Î0±Î0ªÎ0£Î0œÎ0•Î0ŽÎ0‡Î0€Î0yÎ0rÎ0kÎ0dÎ0]Î0VÎ0OÎ0HÎ0AÎ0:Î03Î0,Î0%Î0Î0Î0Î0 Î0Î0ûÍ0ôÍ0íÍ0æÍ0ßÍ0ØÍ0ÑÍ0ÊÍ0ÃÍ0¼Í0µÍ0®Í0§Í0 Í0™Í0’Í0‹Í0„Í0}Í0vÍ0oÍ0hÍ0aÍ0ZÍ0SÍ0LÍ0EÍ0>Í07Í00Í0)Í0"Í0Í0Í0 Í0Í0ÿÌ0øÌ0ñÌ0êÌ0ãÌ0ÜÌ0ÕÌ0ÎÌ0ÇÌ0ÀÌ0¹Ì0²Ì0«Ì0¤Ì0Ì0–Ì0Ì0ˆÌ0Ì0zÌ0sÌ0lÌ0eÌ0^Ì0WÌ0PÌ0IÌ0BÌ0;Ì04Ì0-Ì0&Ì0Ì0Ì0Ì0 Ì0Ì0üË0õË0îË0çË0àË0ÙË0ÒË0ËË0ÄË0½Ë0¶Ë0¯Ë0¨Ë0¡Ë0šË0“Ë0ŒË0…Ë0~Ë0wË0pË0iË0bË0[Ë0TË0MË0FË0?Ë08Ë01Ë0*Ë0#Ë0Ë0Ë0Ë0Ë0Ë0ùÊ0òÊ0ëÊ0äÊ0ÝÊ0ÖÊ0ÏÊ0ÈÊ0ÁÊ0ºÊ0³Ê0¬Ê0¥Ê0žÊ0—Ê0Ê0‰Ê0‚Ê0{Ê0tÊ0mÊ0fÊ0_Ê0XÊ0QÊ0JÊ0CÊ0<Ê05Ê0.Ê0'Ê0 Ê0Ê0Ê0 Ê0Ê0ýÉ0öÉ0ïÉ0èÉ0áÉ0ÚÉ0ÓÉ0ÌÉ0ÅÉ0¾É0·É0°É0©É0¢É0›É0”É0É0†É0É0xÉ0qÉ0jÉ0cÉ0\É0UÉ0NÉ0GÉ0@É09É02É0+É0$É0É0É0É0É0É0úÈ0óÈ0ìÈ0åÈ0ÞÈ0×È0ÐÈ0ÉÈ0ÂÈ0»È0´È0­È0¦È0ŸÈ0˜È0‘È0ŠÈ0ƒÈ0|È0uÈ0nÈ0gÈ0`È0YÈ0RÈ0KÈ0DÈ0=È06È0/È0(È0!È0È0È0 È0È0þÇ0÷Ç0ðÇ0éÇ0âÇ0ÛÇ0ÔÇ0ÍÇ0ÆÇ0¿Ç0¸Ç0±Ç0ªÇ0£Ç0œÇ0•Ç0ŽÇ0‡Ç0€Ç0yÇ0rÇ0kÇ0dÇ0]Ç0VÇ0OÇ0HÇ0AÇ0:Ç03Ç0,Ç0%Ç0Ç0Ç0Ç0 Ç0Ç0ûÆ0ôÆ0íÆ0æÆ0߯0ØÆ0ÑÆ0ÊÆ0ÃÆ0¼Æ0µÆ0®Æ0§Æ0 Æ0™Æ0’Æ0‹Æ0„Æ0}Æ0vÆ0oÆ0hÆ0aÆ0ZÆ0SÆ0LÆ0EÆ0>Æ07Æ00Æ0)Æ0"Æ0Æ0Æ0 Æ0Æ0ÿÅ0øÅ0ñÅ0êÅ0ãÅ0ÜÅ0ÕÅ0ÎÅ0ÇÅ0ÀÅ0¹Å0²Å0«Å0¤Å0Å0–Å0Å0ˆÅ0Å0zÅ0sÅ0lÅ0eÅ0^Å0WÅ0PÅ0IÅ0BÅ0;Å04Å0-Å0&Å0Å0Å0Å0 Å0Å0üÄ0õÄ0îÄ0çÄ0àÄ0ÙÄ0ÒÄ0ËÄ0ÄÄ0½Ä0¶Ä0¯Ä0¨Ä0¡Ä0šÄ0“Ä0ŒÄ0…Ä0~Ä0wÄ0pÄ0iÄ0bÄ0[Ä0TÄ0MÄ0FÄ0?Ä08Ä01Ä0*Ä0#Ä0Ä0Ä0Ä0Ä0Ä0ùÃ0òÃ0ëÃ0äÃ0ÝÃ0ÖÃ0ÏÃ0ÈÃ0ÁÃ0ºÃ0³Ã0¬Ã0¥Ã0žÃ0—Ã0Ã0‰Ã0‚Ã0{Ã0tÃ0mÃ0fÃ0_Ã0XÃ0QÃ0JÃ0CÃ0<Ã05Ã0.Ã0'Ã0 Ã0Ã0Ã0 Ã0Ã0ýÂ0öÂ0ïÂ0èÂ0áÂ0ÚÂ0ÓÂ0ÌÂ0ÅÂ0¾Â0·Â0°Â0©Â0¢Â0›Â0”Â0Â0†Â0Â0xÂ0qÂ0jÂ0cÂ0\Â0UÂ0NÂ0GÂ0@Â09Â02Â0+Â0$Â0Â0Â0Â0Â0Â0úÁ0óÁ0ìÁ0åÁ0ÞÁ0×Á0ÐÁ0ÉÁ0ÂÁ0»Á0´Á0­Á0¦Á0ŸÁ0˜Á0‘Á0ŠÁ0ƒÁ0|Á0uÁ0nÁ0gÁ0`Á0YÁ0RÁ0KÁ0DÁ0=Á06Á0/Á0(Á0!Á0Á0Á0 Á0Á0þÀ0÷À0ðÀ0éÀ0âÀ0ÛÀ0ÔÀ0ÍÀ0ÆÀ0¿À0¸À0±À0ªÀ0£À0œÀ0•À0ŽÀ0‡À0€À0yÀ0rÀ0kÀ0dÀ0]À0VÀ0OÀ0HÀ0AÀ0:À03À0,À0%À0À0À0À0 À0À0û¿0ô¿0í¿0æ¿0ß¿0Ø¿0Ñ¿0Ê¿0ÿ0¼¿0µ¿0®¿0§¿0 ¿0™¿0’¿0‹¿0„¿0}¿0v¿0o¿0h¿0a¿0Z¿0S¿0L¿0E¿0>¿07¿00¿0)¿0"¿0¿0¿0 ¿0¿0ÿ¾0ø¾0ñ¾0ê¾0ã¾0ܾ0Õ¾0ξ0Ǿ0À¾0¹¾0²¾0«¾0¤¾0¾0–¾0¾0ˆ¾0¾0z¾0s¾0l¾0e¾0^¾0W¾0P¾0I¾0B¾0;¾04¾0-¾0&¾0¾0¾0¾0 ¾0¾0ü½0õ½0î½0ç½0à½0Ù½0Ò½0˽0Ľ0½½0¶½0¯½0¨½0¡½0š½0“½0Œ½0…½0~½0w½0p½0i½0b½0[½0T½0M½0F½0?½08½01½0*½0#½0½0½0½0½0½0ù¼0ò¼0ë¼0ä¼0ݼ0Ö¼0ϼ0ȼ0Á¼0º¼0³¼0¬¼0¥¼0ž¼0—¼0¼0‰¼0‚¼0{¼0t¼0m¼0f¼0_¼0X¼0Q¼0J¼0C¼0<¼05¼0.¼0'¼0 ¼0¼0¼0 ¼0¼0ý»0ö»0ï»0è»0á»0Ú»0Ó»0Ì»0Å»0¾»0·»0°»0©»0¢»0›»0”»0»0†»0»0x»0q»0j»0c»0\»0U»0N»0G»0@»09»02»0+»0$»0»0»0»0»0»0úº0óº0ìº0åº0Þº0׺0к0ɺ0º0»º0´º0­º0¦º0Ÿº0˜º0‘º0Šº0ƒº0|º0uº0nº0gº0`º0Yº0Rº0Kº0Dº0=º06º0/º0(º0!º0º0º0 º0º0þ¹0÷¹0ð¹0é¹0â¹0Û¹0Ô¹0͹0ƹ0¿¹0¸¹0±¹0ª¹0£¹0œ¹0•¹0޹0‡¹0€¹0y¹0r¹0k¹0d¹0]¹0V¹0O¹0H¹0A¹0:¹03¹0,¹0%¹0¹0¹0¹0 ¹0¹0û¸0ô¸0í¸0æ¸0߸0ظ0Ѹ0ʸ0ø0¼¸0µ¸0®¸0§¸0 ¸0™¸0’¸0‹¸0„¸0}¸0v¸0o¸0h¸0a¸0Z¸0S¸0L¸0E¸0>¸07¸00¸0)¸0"¸0¸0¸0 ¸0¸0ÿ·0ø·0ñ·0ê·0ã·0Ü·0Õ·0η0Ç·0À·0¹·0²·0«·0¤·0·0–·0·0ˆ·0·0z·0s·0l·0e·0^·0W·0P·0I·0B·0;·04·0-·0&·0·0·0·0 ·0·0ü¶0õ¶0î¶0ç¶0à¶0Ù¶0Ò¶0˶0Ķ0½¶0¶¶0¯¶0¨¶0¡¶0š¶0“¶0Œ¶0…¶0~¶0w¶0p¶0i¶0b¶0[¶0T¶0M¶0F¶0?¶08¶01¶0*¶0#¶0¶0¶0¶0¶0¶0ùµ0òµ0ëµ0äµ0ݵ0Öµ0ϵ0ȵ0Áµ0ºµ0³µ0¬µ0¥µ0žµ0—µ0µ0‰µ0‚µ0{µ0tµ0mµ0fµ0_µ0Xµ0Qµ0Jµ0Cµ0<µ05µ0.µ0'µ0 µ0µ0µ0 µ0µ0ý´0ö´0ï´0è´0á´0Ú´0Ó´0Ì´0Å´0¾´0·´0°´0©´0¢´0›´0”´0´0†´0´0x´0q´0j´0c´0\´0U´0N´0G´0@´09´02´0+´0$´0´0´0´0´0´0ú³0ó³0ì³0å³0Þ³0׳0г0ɳ0³0»³0´³0­³0¦³0Ÿ³0˜³0‘³0г0ƒ³0|³0u³0n³0g³0`³0Y³0R³0K³0D³0=³06³0/³0(³0!³0³0³0 ³0³0þ²0÷²0ð²0é²0â²0Û²0Ô²0Ͳ0Ʋ0¿²0¸²0±²0ª²0£²0œ²0•²0޲0‡²0€²0y²0r²0k²0d²0]²0V²0O²0H²0A²0:²03²0,²0%²0²0²0²0 ²0²0û±0ô±0í±0æ±0ß±0ر0ѱ0ʱ0ñ0¼±0µ±0®±0§±0 ±0™±0’±0‹±0„±0}±0v±0o±0h±0a±0Z±0S±0L±0E±0>±07±00±0)±0"±0±0±0 ±0±0ÿ°0ø°0ñ°0ê°0ã°0ܰ0Õ°0ΰ0ǰ0À°0¹°0²°0«°0¤°0°0–°0°0ˆ°0°0z°0s°0l°0e°0^°0W°0P°0I°0B°0;°04°0-°0&°0°0°0°0 °0°0ü¯0õ¯0î¯0ç¯0à¯0Ù¯0Ò¯0˯0į0½¯0¶¯0¯¯0¨¯0¡¯0š¯0“¯0Œ¯0…¯0~¯0w¯0p¯0i¯0b¯0[¯0T¯0M¯0F¯0?¯08¯01¯0*¯0#¯0¯0¯0¯0¯0¯0ù®0ò®0ë®0ä®0Ý®0Ö®0Ï®0È®0Á®0º®0³®0¬®0¥®0ž®0—®0®0‰®0‚®0{®0t®0m®0f®0_®0X®0Q®0J®0C®0<®05®0.®0'®0 ®0®0®0 ®0®0ý­0ö­0ï­0è­0á­0Ú­0Ó­0Ì­0Å­0¾­0·­0°­0©­0¢­0›­0”­0­0†­0­0x­0q­0j­0c­0\­0U­0N­0G­0@­09­02­0+­0$­0­0­0­0­0­0ú¬0ó¬0ì¬0å¬0Þ¬0׬0Ь0ɬ0¬0»¬0´¬0­¬0¦¬0Ÿ¬0˜¬0‘¬0Ь0ƒ¬0|¬0u¬0n¬0g¬0`¬0Y¬0R¬0K¬0D¬0=¬06¬0/¬0(¬0!¬0¬0¬0 ¬0¬0þ«0÷«0ð«0é«0â«0Û«0Ô«0Í«0Æ«0¿«0¸«0±«0ª«0£«0œ«0•«0Ž«0‡«0€«0y«0r«0k«0d«0]«0V«0O«0H«0A«0:«03«0,«0%«0«0«0«0 «0«0ûª0ôª0íª0æª0ߪ0ت0Ѫ0ʪ0ê0¼ª0µª0®ª0§ª0 ª0™ª0’ª0‹ª0„ª0}ª0vª0oª0hª0aª0Zª0Sª0Lª0Eª0>ª07ª00ª0)ª0"ª0ª0ª0 ª0ª0ÿ©0ø©0ñ©0ê©0ã©0Ü©0Õ©0Ω0Ç©0À©0¹©0²©0«©0¤©0©0–©0©0ˆ©0©0z©0s©0l©0e©0^©0W©0P©0I©0B©0;©04©0-©0&©0©0©0©0 ©0©0ü¨0õ¨0î¨0ç¨0à¨0Ù¨0Ò¨0˨0Ĩ0½¨0¶¨0¯¨0¨¨0¡¨0š¨0“¨0Œ¨0…¨0~¨0w¨0p¨0i¨0b¨0[¨0T¨0M¨0F¨0?¨08¨01¨0*¨0#¨0¨0¨0¨0¨0¨0ù§0ò§0ë§0ä§0ݧ0Ö§0ϧ0ȧ0Á§0º§0³§0¬§0¥§0ž§0—§0§0‰§0‚§0{§0t§0m§0f§0_§0X§0Q§0J§0C§0<§05§0.§0'§0 §0§0§0 §0§0ý¦0ö¦0ï¦0è¦0á¦0Ú¦0Ó¦0̦0Ŧ0¾¦0·¦0°¦0©¦0¢¦0›¦0”¦0¦0†¦0¦0x¦0q¦0j¦0c¦0\¦0U¦0N¦0G¦0@¦09¦02¦0+¦0$¦0¦0¦0¦0¦0¦0ú¥0ó¥0ì¥0å¥0Þ¥0×¥0Ð¥0É¥0Â¥0»¥0´¥0­¥0¦¥0Ÿ¥0˜¥0‘¥0Š¥0ƒ¥0|¥0u¥0n¥0g¥0`¥0Y¥0R¥0K¥0D¥0=¥06¥0/¥0(¥0!¥0¥0¥0 ¥0¥0þ¤0÷¤0ð¤0é¤0â¤0Û¤0Ô¤0ͤ0Ƥ0¿¤0¸¤0±¤0ª¤0£¤0œ¤0•¤0ޤ0‡¤0€¤0y¤0r¤0k¤0d¤0]¤0V¤0O¤0H¤0A¤0:¤03¤0,¤0%¤0¤0¤0¤0 ¤0¤0û£0ô£0í£0æ£0ߣ0Ø£0Ñ£0Ê£0ã0¼£0µ£0®£0§£0 £0™£0’£0‹£0„£0}£0v£0o£0h£0a£0Z£0S£0L£0E£0>£07£00£0)£0"£0£0£0 £0£0ÿ¢0ø¢0ñ¢0ê¢0ã¢0Ü¢0Õ¢0΢0Ç¢0À¢0¹¢0²¢0«¢0¤¢0¢0–¢0¢0ˆ¢0¢0z¢0s¢0l¢0e¢0^¢0W¢0P¢0I¢0B¢0;¢04¢0-¢0&¢0¢0¢0¢0 ¢0¢0ü¡0õ¡0î¡0ç¡0à¡0Ù¡0Ò¡0Ë¡0Ä¡0½¡0¶¡0¯¡0¨¡0¡¡0š¡0“¡0Œ¡0…¡0~¡0w¡0p¡0i¡0b¡0[¡0T¡0M¡0F¡0?¡08¡01¡0*¡0#¡0¡0¡0¡0¡0¡0ù 0ò 0ë 0ä 0Ý 0Ö 0Ï 0È 0Á 0º 0³ 0¬ 0¥ 0ž 0— 0 0‰ 0‚ 0{ 0t 0m 0f 0_ 0X 0Q 0J 0C 0< 05 0. 0' 0  0 0 0  0 0ýŸ0öŸ0ïŸ0èŸ0áŸ0ÚŸ0ÓŸ0ÌŸ0ÅŸ0¾Ÿ0·Ÿ0°Ÿ0©Ÿ0¢Ÿ0›Ÿ0”Ÿ0Ÿ0†Ÿ0Ÿ0xŸ0qŸ0jŸ0cŸ0\Ÿ0UŸ0NŸ0GŸ0@Ÿ09Ÿ02Ÿ0+Ÿ0$Ÿ0Ÿ0Ÿ0Ÿ0Ÿ0Ÿ0úž0óž0ìž0åž0Þž0מ0О0Éž0ž0»ž0´ž0­ž0¦ž0Ÿž0˜ž0‘ž0Šž0ƒž0|ž0už0nž0gž0`ž0Yž0Rž0Kž0Dž0=ž06ž0/ž0(ž0!ž0ž0ž0 ž0ž0þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00ûœ0ôœ0íœ0æœ0ßœ0Øœ0Ñœ0Êœ0Ü0¼œ0µœ0®œ0§œ0 œ0™œ0’œ0‹œ0„œ0}œ0vœ0oœ0hœ0aœ0Zœ0Sœ0Lœ0Eœ0>œ07œ00œ0)œ0"œ0œ0œ0 œ0œ0ÿ›0ø›0ñ›0ê›0ã›0Ü›0Õ›0Λ0Ç›0À›0¹›0²›0«›0¤›0›0–›0›0ˆ›0›0z›0s›0l›0e›0^›0W›0P›0I›0B›0;›04›0-›0&›0›0›0›0 ›0›0üš0õš0îš0çš0àš0Ùš0Òš0Ëš0Äš0½š0¶š0¯š0¨š0¡š0šš0“š0Œš0…š0~š0wš0pš0iš0bš0[š0Tš0Mš0Fš0?š08š01š0*š0#š0š0š0š0š0š0ù™0ò™0ë™0ä™0Ý™0Ö™0Ï™0È™0Á™0º™0³™0¬™0¥™0ž™0—™0™0‰™0‚™0{™0t™0m™0f™0_™0X™0Q™0J™0C™0<™05™0.™0'™0 ™0™0™0 ™0™0ý˜0ö˜0ï˜0è˜0á˜0Ú˜0Ó˜0̘0Ř0¾˜0·˜0°˜0©˜0¢˜0›˜0”˜0˜0†˜0˜0x˜0q˜0j˜0c˜0\˜0U˜0N˜0G˜0@˜09˜02˜0+˜0$˜0˜0˜0˜0˜0˜0ú—0ó—0ì—0å—0Þ—0×—0З0É—0—0»—0´—0­—0¦—0Ÿ—0˜—0‘—0Š—0ƒ—0|—0u—0n—0g—0`—0Y—0R—0K—0D—0=—06—0/—0(—0!—0—0—0 —0—0þ–0÷–0ð–0é–0â–0Û–0Ô–0Í–0Æ–0¿–0¸–0±–0ª–0£–0œ–0•–0Ž–0‡–0€–0y–0r–0k–0d–0]–0V–0O–0H–0A–0:–03–0,–0%–0–0–0–0 –0–0û•0ô•0í•0æ•0ß•0Ø•0Ñ•0Ê•0Õ0¼•0µ•0®•0§•0 •0™•0’•0‹•0„•0}•0v•0o•0h•0a•0Z•0S•0L•0E•0>•07•00•0)•0"•0•0•0 •0•0ÿ”0ø”0ñ”0ê”0ã”0Ü”0Õ”0Δ0Ç”0À”0¹”0²”0«”0¤”0”0–”0”0ˆ”0”0z”0s”0l”0e”0^”0W”0P”0I”0B”0;”04”0-”0&”0”0”0”0 ”0”0ü“0õ“0î“0ç“0à“0Ù“0Ò“0Ë“0Ä“0½“0¶“0¯“0¨“0¡“0š“0““0Œ“0…“0~“0w“0p“0i“0b“0[“0T“0M“0F“0?“08“01“0*“0#“0“0“0“0“0“0ù’0ò’0ë’0ä’0Ý’0Ö’0Ï’0È’0Á’0º’0³’0¬’0¥’0ž’0—’0’0‰’0‚’0{’0t’0m’0f’0_’0X’0Q’0J’0C’0<’05’0.’0'’0 ’0’0’0 ’0’0ý‘0ö‘0ï‘0è‘0á‘0Ú‘0Ó‘0Ì‘0Å‘0¾‘0·‘0°‘0©‘0¢‘0›‘0”‘0‘0†‘0‘0x‘0q‘0j‘0c‘0\‘0U‘0N‘0G‘0@‘09‘02‘0+‘0$‘0‘0‘0‘0‘0‘0ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00ûŽ0ôŽ0íŽ0æŽ0ߎ0ØŽ0ÑŽ0ÊŽ0ÃŽ0¼Ž0µŽ0®Ž0§Ž0 Ž0™Ž0’Ž0‹Ž0„Ž0}Ž0vŽ0oŽ0hŽ0aŽ0ZŽ0SŽ0LŽ0EŽ0>Ž07Ž00Ž0)Ž0"Ž0Ž0Ž0 Ž0Ž0ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00üŒ0õŒ0îŒ0çŒ0àŒ0ÙŒ0ÒŒ0ËŒ0ÄŒ0½Œ0¶Œ0¯Œ0¨Œ0¡Œ0šŒ0“Œ0ŒŒ0…Œ0~Œ0wŒ0pŒ0iŒ0bŒ0[Œ0TŒ0MŒ0FŒ0?Œ08Œ01Œ0*Œ0#Œ0Œ0Œ0Œ0Œ0Œ0ù‹0ò‹0ë‹0ä‹0Ý‹0Ö‹0Ï‹0È‹0Á‹0º‹0³‹0¬‹0¥‹0ž‹0—‹0‹0‰‹0‚‹0{‹0t‹0m‹0f‹0_‹0X‹0Q‹0J‹0C‹0<‹05‹0.‹0'‹0 ‹0‹0‹0 ‹0‹0ýŠ0öŠ0ïŠ0èŠ0áŠ0ÚŠ0ÓŠ0ÌŠ0ÅŠ0¾Š0·Š0°Š0©Š0¢Š0›Š0”Š0Š0†Š0Š0xŠ0qŠ0jŠ0cŠ0\Š0UŠ0NŠ0GŠ0@Š09Š02Š0+Š0$Š0Š0Š0Š0Š0Š0ú‰0ó‰0ì‰0å‰0Þ‰0׉0Љ0ɉ0‰0»‰0´‰0­‰0¦‰0Ÿ‰0˜‰0‘‰0Љ0ƒ‰0|‰0u‰0n‰0g‰0`‰0Y‰0R‰0K‰0D‰0=‰06‰0/‰0(‰0!‰0‰0‰0 ‰0‰0þˆ0÷ˆ0ðˆ0éˆ0âˆ0Ûˆ0Ôˆ0͈0ƈ0¿ˆ0¸ˆ0±ˆ0ªˆ0£ˆ0œˆ0•ˆ0Žˆ0‡ˆ0€ˆ0yˆ0rˆ0kˆ0dˆ0]ˆ0Vˆ0Oˆ0Hˆ0Aˆ0:ˆ03ˆ0,ˆ0%ˆ0ˆ0ˆ0ˆ0 ˆ0ˆ0û‡0ô‡0í‡0æ‡0߇0؇0ч0ʇ0Ç0¼‡0µ‡0®‡0§‡0 ‡0™‡0’‡0‹‡0„‡0}‡0v‡0o‡0h‡0a‡0Z‡0S‡0L‡0E‡0>‡07‡00‡0)‡0"‡0‡0‡0 ‡0‡0ÿ†0ø†0ñ†0ê†0ã†0܆0Õ†0Ά0dž0À†0¹†0²†0«†0¤†0†0–†0†0ˆ†0†0z†0s†0l†0e†0^†0W†0P†0I†0B†0;†04†0-†0&†0†0†0†0 †0†0ü…0õ…0î…0ç…0à…0Ù…0Ò…0Ë…0Ä…0½…0¶…0¯…0¨…0¡…0š…0“…0Œ…0……0~…0w…0p…0i…0b…0[…0T…0M…0F…0?…08…01…0*…0#…0…0…0…0…0…0ù„0ò„0ë„0ä„0Ý„0Ö„0Ï„0È„0Á„0º„0³„0¬„0¥„0ž„0—„0„0‰„0‚„0{„0t„0m„0f„0_„0X„0Q„0J„0C„0<„05„0.„0'„0 „0„0„0 „0„0ýƒ0öƒ0ïƒ0èƒ0áƒ0Úƒ0Óƒ0̃0Ń0¾ƒ0·ƒ0°ƒ0©ƒ0¢ƒ0›ƒ0”ƒ0ƒ0†ƒ0ƒ0xƒ0qƒ0jƒ0cƒ0\ƒ0Uƒ0Nƒ0Gƒ0@ƒ09ƒ02ƒ0+ƒ0$ƒ0ƒ0ƒ0ƒ0ƒ0ƒ0ú‚0ó‚0ì‚0å‚0Þ‚0ׂ0Ђ0É‚0‚0»‚0´‚0­‚0¦‚0Ÿ‚0˜‚0‘‚0Š‚0ƒ‚0|‚0u‚0n‚0g‚0`‚0Y‚0R‚0K‚0D‚0=‚06‚0/‚0(‚0!‚0‚0‚0 ‚0‚0þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û€0ô€0í€0æ€0߀0Ø€0Ñ€0Ê€0À0¼€0µ€0®€0§€0 €0™€0’€0‹€0„€0}€0v€0o€0h€0a€0Z€0S€0L€0E€0>€07€00€0)€0"€0€0€0 €0€0ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü~0õ~0î~0ç~0à~0Ù~0Ò~0Ë~0Ä~0½~0¶~0¯~0¨~0¡~0š~0“~0Œ~0…~0~~0w~0p~0i~0b~0[~0T~0M~0F~0?~08~01~0*~0#~0~0~0~0~0~0ù}0ò}0ë}0ä}0Ý}0Ö}0Ï}0È}0Á}0º}0³}0¬}0¥}0ž}0—}0}0‰}0‚}0{}0t}0m}0f}0_}0X}0Q}0J}0C}0<}05}0.}0'}0 }0}0}0 }0}0ý|0ö|0ï|0è|0á|0Ú|0Ó|0Ì|0Å|0¾|0·|0°|0©|0¢|0›|0”|0|0†|0|0x|0q|0j|0c|0\|0U|0N|0G|0@|09|02|0+|0$|0|0|0|0|0|0ú{0ó{0ì{0å{0Þ{0×{0Ð{0É{0Â{0»{0´{0­{0¦{0Ÿ{0˜{0‘{0Š{0ƒ{0|{0u{0n{0g{0`{0Y{0R{0K{0D{0={06{0/{0({0!{0{0{0 {0{0þz0÷z0ðz0éz0âz0Ûz0Ôz0Íz0Æz0¿z0¸z0±z0ªz0£z0œz0•z0Žz0‡z0€z0yz0rz0kz0dz0]z0Vz0Oz0Hz0Az0:z03z0,z0%z0z0z0z0 z0z0ûy0ôy0íy0æy0ßy0Øy0Ñy0Êy0Ãy0¼y0µy0®y0§y0 y0™y0’y0‹y0„y0}y0vy0oy0hy0ay0Zy0Sy0Ly0Ey0>y07y00y0)y0"y0y0y0 y0y0ÿx0øx0ñx0êx0ãx0Üx0Õx0Îx0Çx0Àx0¹x0²x0«x0¤x0x0–x0x0ˆx0x0zx0sx0lx0ex0^x0Wx0Px0Ix0Bx0;x04x0-x0&x0x0x0x0 x0x0üw0õw0îw0çw0àw0Ùw0Òw0Ëw0Äw0½w0¶w0¯w0¨w0¡w0šw0“w0Œw0…w0~w0ww0pw0iw0bw0[w0Tw0Mw0Fw0?w08w01w0*w0#w0w0w0w0w0w0ùv0òv0ëv0äv0Ýv0Öv0Ïv0Èv0Áv0ºv0³v0¬v0¥v0žv0—v0v0‰v0‚v0{v0tv0mv0fv0_v0Xv0Qv0Jv0Cv0r07r00r0)r0"r0r0r0 r0r0ÿq0øq0ñq0êq0ãq0Üq0Õq0Îq0Çq0Àq0¹q0²q0«q0¤q0q0–q0q0ˆq0q0zq0sq0lq0eq0^q0Wq0Pq0Iq0Bq0;q04q0-q0&q0q0q0q0 q0q0üp0õp0îp0çp0àp0Ùp0Òp0Ëp0Äp0½p0¶p0¯p0¨p0¡p0šp0“p0Œp0…p0~p0wp0pp0ip0bp0[p0Tp0Mp0Fp0?p08p01p0*p0#p0p0p0p0p0p0ùo0òo0ëo0äo0Ýo0Öo0Ïo0Èo0Áo0ºo0³o0¬o0¥o0žo0—o0o0‰o0‚o0{o0to0mo0fo0_o0Xo0Qo0Jo0Co0k07k00k0)k0"k0k0k0 k0k0ÿj0øj0ñj0êj0ãj0Üj0Õj0Îj0Çj0Àj0¹j0²j0«j0¤j0j0–j0j0ˆj0j0zj0sj0lj0ej0^j0Wj0Pj0Ij0Bj0;j04j0-j0&j0j0j0j0 j0j0üi0õi0îi0çi0ài0Ùi0Òi0Ëi0Äi0½i0¶i0¯i0¨i0¡i0ši0“i0Œi0…i0~i0wi0pi0ii0bi0[i0Ti0Mi0Fi0?i08i01i0*i0#i0i0i0i0i0i0ùh0òh0ëh0äh0Ýh0Öh0Ïh0Èh0Áh0ºh0³h0¬h0¥h0žh0—h0h0‰h0‚h0{h0th0mh0fh0_h0Xh0Qh0Jh0Ch0d07d00d0)d0"d0d0d0 d0d0ÿc0øc0ñc0êc0ãc0Üc0Õc0Îc0Çc0Àc0¹c0²c0«c0¤c0c0–c0c0ˆc0c0zc0sc0lc0ec0^c0Wc0Pc0Ic0Bc0;c04c0-c0&c0c0c0c0 c0c0üb0õb0îb0çb0àb0Ùb0Òb0Ëb0Äb0½b0¶b0¯b0¨b0¡b0šb0“b0Œb0…b0~b0wb0pb0ib0bb0[b0Tb0Mb0Fb0?b08b01b0*b0#b0b0b0b0b0b0ùa0òa0ëa0äa0Ýa0Öa0Ïa0Èa0Áa0ºa0³a0¬a0¥a0ža0—a0a0‰a0‚a0{a0ta0ma0fa0_a0Xa0Qa0Ja0Ca0]07]00]0)]0"]0]0]0 ]0]0ÿ\0ø\0ñ\0ê\0ã\0Ü\0Õ\0Î\0Ç\0À\0¹\0²\0«\0¤\0\0–\0\0ˆ\0\0z\0s\0l\0e\0^\0W\0P\0I\0B\0;\04\0-\0&\0\0\0\0 \0\0ü[0õ[0î[0ç[0à[0Ù[0Ò[0Ë[0Ä[0½[0¶[0¯[0¨[0¡[0š[0“[0Œ[0…[0~[0w[0p[0i[0b[0[[0T[0M[0F[0?[08[01[0*[0#[0[0[0[0[0[0ùZ0òZ0ëZ0äZ0ÝZ0ÖZ0ÏZ0ÈZ0ÁZ0ºZ0³Z0¬Z0¥Z0žZ0—Z0Z0‰Z0‚Z0{Z0tZ0mZ0fZ0_Z0XZ0QZ0JZ0CZ0V07V00V0)V0"V0V0V0 V0V0ÿU0øU0ñU0êU0ãU0ÜU0ÕU0ÎU0ÇU0ÀU0¹U0²U0«U0¤U0U0–U0U0ˆU0U0zU0sU0lU0eU0^U0WU0PU0IU0BU0;U04U0-U0&U0U0U0U0 U0U0üT0õT0îT0çT0àT0ÙT0ÒT0ËT0ÄT0½T0¶T0¯T0¨T0¡T0šT0“T0ŒT0…T0~T0wT0pT0iT0bT0[T0TT0MT0FT0?T08T01T0*T0#T0T0T0T0T0T0ùS0òS0ëS0äS0ÝS0ÖS0ÏS0ÈS0ÁS0ºS0³S0¬S0¥S0žS0—S0S0‰S0‚S0{S0tS0mS0fS0_S0XS0QS0JS0CS0O07O00O0)O0"O0O0O0 O0O0ÿN0øN0ñN0êN0ãN0ÜN0ÕN0ÎN0ÇN0ÀN0¹N0²N0«N0¤N0N0–N0N0ˆN0N0zN0sN0lN0eN0^N0WN0PN0IN0BN0;N04N0-N0&N0N0N0N0 N0N0üM0õM0îM0çM0àM0ÙM0ÒM0ËM0ÄM0½M0¶M0¯M0¨M0¡M0šM0“M0ŒM0…M0~M0wM0pM0iM0bM0[M0TM0MM0FM0?M08M01M0*M0#M0M0M0M0M0M0ùL0òL0ëL0äL0ÝL0ÖL0ÏL0ÈL0ÁL0ºL0³L0¬L0¥L0žL0—L0L0‰L0‚L0{L0tL0mL0fL0_L0XL0QL0JL0CL0H07H00H0)H0"H0H0H0 H0H0ÿG0øG0ñG0êG0ãG0ÜG0ÕG0ÎG0ÇG0ÀG0¹G0²G0«G0¤G0G0–G0G0ˆG0G0zG0sG0lG0eG0^G0WG0PG0IG0BG0;G04G0-G0&G0G0G0G0 G0G0üF0õF0îF0çF0àF0ÙF0ÒF0ËF0ÄF0½F0¶F0¯F0¨F0¡F0šF0“F0ŒF0…F0~F0wF0pF0iF0bF0[F0TF0MF0FF0?F08F01F0*F0#F0F0F0F0F0F0ùE0òE0ëE0äE0ÝE0ÖE0ÏE0ÈE0ÁE0ºE0³E0¬E0¥E0žE0—E0E0‰E0‚E0{E0tE0mE0fE0_E0XE0QE0JE0CE0A07A00A0)A0"A0A0A0 A0A0ÿ@0ø@0ñ@0ê@0ã@0Ü@0Õ@0Î@0Ç@0À@0¹@0²@0«@0¤@0@0–@0@0ˆ@0@0z@0s@0l@0e@0^@0W@0P@0I@0B@0;@04@0-@0&@0@0@0@0 @0@0ü?0õ?0î?0ç?0à?0Ù?0Ò?0Ë?0Ä?0½?0¶?0¯?0¨?0¡?0š?0“?0Œ?0…?0~?0w?0p?0i?0b?0[?0T?0M?0F?0??08?01?0*?0#?0?0?0?0?0?0ù>0ò>0ë>0ä>0Ý>0Ö>0Ï>0È>0Á>0º>0³>0¬>0¥>0ž>0—>0>0‰>0‚>0{>0t>0m>0f>0_>0X>0Q>0J>0C>0<>05>0.>0'>0 >0>0>0 >0>0ý=0ö=0ï=0è=0á=0Ú=0Ó=0Ì=0Å=0¾=0·=0°=0©=0¢=0›=0”=0=0†=0=0x=0q=0j=0c=0\=0U=0N=0G=0@=09=02=0+=0$=0=0=0=0=0=0ú<0ó<0ì<0å<0Þ<0×<0Ð<0É<0Â<0»<0´<0­<0¦<0Ÿ<0˜<0‘<0Š<0ƒ<0|<0u<0n<0g<0`<0Y<0R<0K<0D<0=<06<0/<0(<0!<0<0<0 <0<0þ;0÷;0ð;0é;0â;0Û;0Ô;0Í;0Æ;0¿;0¸;0±;0ª;0£;0œ;0•;0Ž;0‡;0€;0y;0r;0k;0d;0];0V;0O;0H;0A;0:;03;0,;0%;0;0;0;0 ;0;0û:0ô:0í:0æ:0ß:0Ø:0Ñ:0Ê:0Ã:0¼:0µ:0®:0§:0 :0™:0’:0‹:0„:0}:0v:0o:0h:0a:0Z:0S:0L:0E:0>:07:00:0):0":0:0:0 :0:0ÿ90ø90ñ90ê90ã90Ü90Õ90Î90Ç90À90¹90²90«90¤9090–9090ˆ9090z90s90l90e90^90W90P90I90B90;90490-90&90909090 9090ü80õ80î80ç80à80Ù80Ò80Ë80Ä80½80¶80¯80¨80¡80š80“80Œ80…80~80w80p80i80b80[80T80M80F80?80880180*80#808080808080ù70ò70ë70ä70Ý70Ö70Ï70È70Á70º70³70¬70¥70ž70—7070‰70‚70{70t70m70f70_70X70Q70J70C70<70570.70'70 707070 7070ý60ö60ï60è60á60Ú60Ó60Ì60Å60¾60·60°60©60¢60›60”6060†6060x60q60j60c60\60U60N60G60@60960260+60$606060606060ú50ó50ì50å50Þ50×50Ð50É50Â50»50´50­50¦50Ÿ50˜50‘50Š50ƒ50|50u50n50g50`50Y50R50K50D50=50650/50(50!505050 5050þ40÷40ð40é40â40Û40Ô40Í40Æ40¿40¸40±40ª40£40œ40•40Ž40‡40€40y40r40k40d40]40V40O40H40A40:40340,40%40404040 4040û30ô30í30æ30ß30Ø30Ñ30Ê30Ã30¼30µ30®30§30 30™30’30‹30„30}30v30o30h30a30Z30S30L30E30>30730030)30"303030 3030ÿ20ø20ñ20ê20ã20Ü20Õ20Î20Ç20À20¹20²20«20¤2020–2020ˆ2020z20s20l20e20^20W20P20I20B20;20420-20&20202020 2020ü10õ10î10ç10à10Ù10Ò10Ë10Ä10½10¶10¯10¨10¡10š10“10Œ10…10~10w10p10i10b10[10T10M10F10?10810110*10#101010101010ù00ò00ë00ä00Ý00Ö00Ï00È00Á00º00³00¬00¥00ž00—0000‰00‚00{00t00m00f00_00X00Q00J00C00<00500.00'00 000000 0000ý/0ö/0ï/0è/0á/0Ú/0Ó/0Ì/0Å/0¾/0·/0°/0©/0¢/0›/0”/0/0†/0/0x/0q/0j/0c/0\/0U/0N/0G/0@/09/02/0+/0$/0/0/0/0/0/0ú.0ó.0ì.0å.0Þ.0×.0Ð.0É.0Â.0».0´.0­.0¦.0Ÿ.0˜.0‘.0Š.0ƒ.0|.0u.0n.0g.0`.0Y.0R.0K.0D.0=.06.0/.0(.0!.0.0.0 .0.0þ-0÷-0ð-0é-0â-0Û-0Ô-0Í-0Æ-0¿-0¸-0±-0ª-0£-0œ-0•-0Ž-0‡-0€-0y-0r-0k-0d-0]-0V-0O-0H-0A-0:-03-0,-0%-0-0-0-0 -0-0û,0ô,0í,0æ,0ß,0Ø,0Ñ,0Ê,0Ã,0¼,0µ,0®,0§,0 ,0™,0’,0‹,0„,0},0v,0o,0h,0a,0Z,0S,0L,0E,0>,07,00,0),0",0,0,0 ,0,0ÿ+0ø+0ñ+0ê+0ã+0Ü+0Õ+0Î+0Ç+0À+0¹+0²+0«+0¤+0+0–+0+0ˆ+0+0z+0s+0l+0e+0^+0W+0P+0I+0B+0;+04+0-+0&+0+0+0+0 +0+0ü*0õ*0î*0ç*0à*0Ù*0Ò*0Ë*0Ä*0½*0¶*0¯*0¨*0¡*0š*0“*0Œ*0…*0~*0w*0p*0i*0b*0[*0T*0M*0F*0?*08*01*0**0#*0*0*0*0*0*0ù)0ò)0ë)0ä)0Ý)0Ö)0Ï)0È)0Á)0º)0³)0¬)0¥)0ž)0—)0)0‰)0‚)0{)0t)0m)0f)0_)0X)0Q)0J)0C)0<)05)0.)0')0 )0)0)0 )0)0ý(0ö(0ï(0è(0á(0Ú(0Ó(0Ì(0Å(0¾(0·(0°(0©(0¢(0›(0”(0(0†(0(0x(0q(0j(0c(0\(0U(0N(0G(0@(09(02(0+(0$(0(0(0(0(0(0ú'0ó'0ì'0å'0Þ'0×'0Ð'0É'0Â'0»'0´'0­'0¦'0Ÿ'0˜'0‘'0Š'0ƒ'0|'0u'0n'0g'0`'0Y'0R'0K'0D'0='06'0/'0('0!'0'0'0 '0'0þ&0÷&0ð&0é&0â&0Û&0Ô&0Í&0Æ&0¿&0¸&0±&0ª&0£&0œ&0•&0Ž&0‡&0€&0y&0r&0k&0d&0]&0V&0O&0H&0A&0:&03&0,&0%&0&0&0&0 &0&0û%0ô%0í%0æ%0ß%0Ø%0Ñ%0Ê%0Ã%0¼%0µ%0®%0§%0 %0™%0’%0‹%0„%0}%0v%0o%0h%0a%0Z%0S%0L%0E%0>%07%00%0)%0"%0%0%0 %0%0ÿ$0ø$0ñ$0ê$0ã$0Ü$0Õ$0Î$0Ç$0À$0¹$0²$0«$0¤$0$0–$0$0ˆ$0$0z$0s$0l$0e$0^$0W$0P$0I$0B$0;$04$0-$0&$0$0$0$0 $0$0ü#0õ#0î#0ç#0à#0Ù#0Ò#0Ë#0Ä#0½#0¶#0¯#0¨#0¡#0š#0“#0Œ#0…#0~#0w#0p#0i#0b#0[#0T#0M#0F#0?#08#01#0*#0##0#0#0#0#0#0ù"0ò"0ë"0ä"0Ý"0Ö"0Ï"0È"0Á"0º"0³"0¬"0¥"0ž"0—"0"0‰"0‚"0{"0t"0m"0f"0_"0X"0Q"0J"0C"0<"05"0."0'"0 "0"0"0 "0"0ý!0ö!0ï!0è!0á!0Ú!0Ó!0Ì!0Å!0¾!0·!0°!0©!0¢!0›!0”!0!0†!0!0x!0q!0j!0c!0\!0U!0N!0G!0@!09!02!0+!0$!0!0!0!0!0!0ú 0ó 0ì 0å 0Þ 0× 0Ð 0É 0 0» 0´ 0­ 0¦ 0Ÿ 0˜ 0‘ 0Š 0ƒ 0| 0u 0n 0g 0` 0Y 0R 0K 0D 0= 06 0/ 0( 0! 0 0 0 0 0þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù 0ò 0ë 0ä 0Ý 0Ö 0Ï 0È 0Á 0º 0³ 0¬ 0¥ 0ž 0— 0 0‰ 0‚ 0{ 0t 0m 0f 0_ 0X 0Q 0J 0C 0< 05 0. 0' 0 0 0 0 0 0ý 0ö 0ï 0è 0á 0Ú 0Ó 0Ì 0Å 0¾ 0· 0° 0© 0¢ 0› 0” 0 0† 0 0x 0q 0j 0c 0\ 0U 0N 0G 0@ 09 02 0+ 0$ 0 0 0 0 0 0ú 0ó 0ì 0å 0Þ 0× 0Ð 0É 0 0» 0´ 0­ 0¦ 0Ÿ 0˜ 0‘ 0Š 0ƒ 0| 0u 0n 0g 0` 0Y 0R 0K 0D 0= 06 0/ 0( 0! 0 0 0 0 0þ 0÷ 0ð 0é 0â 0Û 0Ô 0Í 0Æ 0¿ 0¸ 0± 0ª 0£ 0œ 0• 0Ž 0‡ 0€ 0y 0r 0k 0d 0] 0V 0O 0H 0A 0: 03 0, 0% 0 0 0 0 0 0û 0ô 0í 0æ 0ß 0Ø 0Ñ 0Ê 0à 0¼ 0µ 0® 0§ 0  0™ 0’ 0‹ 0„ 0} 0v 0o 0h 0a 0Z 0S 0L 0E 0> 07 00 0) 0" 0 0 0 0 0ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ùÿ/òÿ/ëÿ/äÿ/Ýÿ/Öÿ/Ïÿ/Èÿ/Áÿ/ºÿ/³ÿ/¬ÿ/¥ÿ/žÿ/—ÿ/ÿ/‰ÿ/‚ÿ/{ÿ/tÿ/mÿ/fÿ/_ÿ/Xÿ/Qÿ/Jÿ/Cÿ/<ÿ/5ÿ/.ÿ/'ÿ/ ÿ/ÿ/ÿ/ ÿ/ÿ/ýþ/öþ/ïþ/èþ/áþ/Úþ/Óþ/Ìþ/Åþ/¾þ/·þ/°þ/©þ/¢þ/›þ/”þ/þ/†þ/þ/xþ/qþ/jþ/cþ/\þ/Uþ/Nþ/Gþ/@þ/9þ/2þ/+þ/$þ/þ/þ/þ/þ/þ/úý/óý/ìý/åý/Þý/×ý/Ðý/Éý/Âý/»ý/´ý/­ý/¦ý/Ÿý/˜ý/‘ý/Šý/ƒý/|ý/uý/ný/gý/`ý/Yý/Rý/Ký/Dý/=ý/6ý//ý/(ý/!ý/ý/ý/ ý/ý/þü/÷ü/ðü/éü/âü/Ûü/Ôü/Íü/Æü/¿ü/¸ü/±ü/ªü/£ü/œü/•ü/Žü/‡ü/€ü/yü/rü/kü/dü/]ü/Vü/Oü/Hü/Aü/:ü/3ü/,ü/%ü/ü/ü/ü/ ü/ü/ûû/ôû/íû/æû/ßû/Øû/Ñû/Êû/Ãû/¼û/µû/®û/§û/ û/™û/’û/‹û/„û/}û/vû/oû/hû/aû/Zû/Sû/Lû/Eû/>û/7û/0û/)û/"û/û/û/ û/û/ÿú/øú/ñú/êú/ãú/Üú/Õú/Îú/Çú/Àú/¹ú/²ú/«ú/¤ú/ú/–ú/ú/ˆú/ú/zú/sú/lú/eú/^ú/Wú/Pú/Iú/Bú/;ú/4ú/-ú/&ú/ú/ú/ú/ ú/ú/üù/õù/îù/çù/àù/Ùù/Òù/Ëù/Äù/½ù/¶ù/¯ù/¨ù/¡ù/šù/“ù/Œù/…ù/~ù/wù/pù/iù/bù/[ù/Tù/Mù/Fù/?ù/8ù/1ù/*ù/#ù/ù/ù/ù/ù/ù/ùø/òø/ëø/äø/Ýø/Öø/Ïø/Èø/Áø/ºø/³ø/¬ø/¥ø/žø/—ø/ø/‰ø/‚ø/{ø/tø/mø/fø/_ø/Xø/Qø/Jø/Cø/<ø/5ø/.ø/'ø/ ø/ø/ø/ ø/ø/ý÷/ö÷/ï÷/è÷/á÷/Ú÷/Ó÷/Ì÷/Å÷/¾÷/·÷/°÷/©÷/¢÷/›÷/”÷/÷/†÷/÷/x÷/q÷/j÷/c÷/\÷/U÷/N÷/G÷/@÷/9÷/2÷/+÷/$÷/÷/÷/÷/÷/÷/úö/óö/ìö/åö/Þö/×ö/Ðö/Éö/Âö/»ö/´ö/­ö/¦ö/Ÿö/˜ö/‘ö/Šö/ƒö/|ö/uö/nö/gö/`ö/Yö/Rö/Kö/Dö/=ö/6ö//ö/(ö/!ö/ö/ö/ ö/ö/þõ/÷õ/ðõ/éõ/âõ/Ûõ/Ôõ/Íõ/Æõ/¿õ/¸õ/±õ/ªõ/£õ/œõ/•õ/Žõ/‡õ/€õ/yõ/rõ/kõ/dõ/]õ/Võ/Oõ/Hõ/Aõ/:õ/3õ/,õ/%õ/õ/õ/õ/ õ/õ/ûô/ôô/íô/æô/ßô/Øô/Ñô/Êô/Ãô/¼ô/µô/®ô/§ô/ ô/™ô/’ô/‹ô/„ô/}ô/vô/oô/hô/aô/Zô/Sô/Lô/Eô/>ô/7ô/0ô/)ô/"ô/ô/ô/ ô/ô/ÿó/øó/ñó/êó/ãó/Üó/Õó/Îó/Çó/Àó/¹ó/²ó/«ó/¤ó/ó/–ó/ó/ˆó/ó/zó/só/ló/eó/^ó/Wó/Pó/Ió/Bó/;ó/4ó/-ó/&ó/ó/ó/ó/ ó/ó/üò/õò/îò/çò/àò/Ùò/Òò/Ëò/Äò/½ò/¶ò/¯ò/¨ò/¡ò/šò/“ò/Œò/…ò/~ò/wò/pò/iò/bò/[ò/Tò/Mò/Fò/?ò/8ò/1ò/*ò/#ò/ò/ò/ò/ò/ò/ùñ/òñ/ëñ/äñ/Ýñ/Öñ/Ïñ/Èñ/Áñ/ºñ/³ñ/¬ñ/¥ñ/žñ/—ñ/ñ/‰ñ/‚ñ/{ñ/tñ/mñ/fñ/_ñ/Xñ/Qñ/Jñ/Cñ/<ñ/5ñ/.ñ/'ñ/ ñ/ñ/ñ/ ñ/ñ/ýð/öð/ïð/èð/áð/Úð/Óð/Ìð/Åð/¾ð/·ð/°ð/©ð/¢ð/›ð/”ð/ð/†ð/ð/xð/qð/jð/cð/\ð/Uð/Nð/Gð/@ð/9ð/2ð/+ð/$ð/ð/ð/ð/ð/ð/úï/óï/ìï/åï/Þï/×ï/Ðï/Éï/Âï/»ï/´ï/­ï/¦ï/Ÿï/˜ï/‘ï/Šï/ƒï/|ï/uï/nï/gï/`ï/Yï/Rï/Kï/Dï/=ï/6ï//ï/(ï/!ï/ï/ï/ ï/ï/þî/÷î/ðî/éî/âî/Ûî/Ôî/Íî/Æî/¿î/¸î/±î/ªî/£î/œî/•î/Žî/‡î/€î/yî/rî/kî/dî/]î/Vî/Oî/Hî/Aî/:î/3î/,î/%î/î/î/î/ î/î/ûí/ôí/íí/æí/ßí/Øí/Ñí/Êí/Ãí/¼í/µí/®í/§í/ í/™í/’í/‹í/„í/}í/ví/oí/hí/aí/Zí/Sí/Lí/Eí/>í/7í/0í/)í/"í/í/í/ í/í/ÿì/øì/ñì/êì/ãì/Üì/Õì/Îì/Çì/Àì/¹ì/²ì/«ì/¤ì/ì/–ì/ì/ˆì/ì/zì/sì/lì/eì/^ì/Wì/Pì/Iì/Bì/;ì/4ì/-ì/&ì/ì/ì/ì/ ì/ì/üë/õë/îë/çë/àë/Ùë/Òë/Ëë/Äë/½ë/¶ë/¯ë/¨ë/¡ë/šë/“ë/Œë/…ë/~ë/wë/pë/ië/bë/[ë/Të/Më/Fë/?ë/8ë/1ë/*ë/#ë/ë/ë/ë/ë/ë/ùê/òê/ëê/äê/Ýê/Öê/Ïê/Èê/Áê/ºê/³ê/¬ê/¥ê/žê/—ê/ê/‰ê/‚ê/{ê/tê/mê/fê/_ê/Xê/Qê/Jê/Cê/<ê/5ê/.ê/'ê/ ê/ê/ê/ ê/ê/ýé/öé/ïé/èé/áé/Úé/Óé/Ìé/Åé/¾é/·é/°é/©é/¢é/›é/”é/é/†é/é/xé/qé/jé/cé/\é/Ué/Né/Gé/@é/9é/2é/+é/$é/é/é/é/é/é/úè/óè/ìè/åè/Þè/×è/Ðè/Éè/Âè/»è/´è/­è/¦è/Ÿè/˜è/‘è/Šè/ƒè/|è/uè/nè/gè/`è/Yè/Rè/Kè/Dè/=è/6è//è/(è/!è/è/è/ è/è/þç/÷ç/ðç/éç/âç/Ûç/Ôç/Íç/Æç/¿ç/¸ç/±ç/ªç/£ç/œç/•ç/Žç/‡ç/€ç/yç/rç/kç/dç/]ç/Vç/Oç/Hç/Aç/:ç/3ç/,ç/%ç/ç/ç/ç/ ç/ç/ûæ/ôæ/íæ/ææ/ßæ/Øæ/Ñæ/Êæ/Ãæ/¼æ/µæ/®æ/§æ/ æ/™æ/’æ/‹æ/„æ/}æ/væ/oæ/hæ/aæ/Zæ/Sæ/Læ/Eæ/>æ/7æ/0æ/)æ/"æ/æ/æ/ æ/æ/ÿå/øå/ñå/êå/ãå/Üå/Õå/Îå/Çå/Àå/¹å/²å/«å/¤å/å/–å/å/ˆå/å/zå/så/lå/eå/^å/Wå/På/Iå/Bå/;å/4å/-å/&å/å/å/å/ å/å/üä/õä/îä/çä/àä/Ùä/Òä/Ëä/Ää/½ä/¶ä/¯ä/¨ä/¡ä/šä/“ä/Œä/…ä/~ä/wä/pä/iä/bä/[ä/Tä/Mä/Fä/?ä/8ä/1ä/*ä/#ä/ä/ä/ä/ä/ä/ùã/òã/ëã/äã/Ýã/Öã/Ïã/Èã/Áã/ºã/³ã/¬ã/¥ã/žã/—ã/ã/‰ã/‚ã/{ã/tã/mã/fã/_ã/Xã/Qã/Jã/Cã/<ã/5ã/.ã/'ã/ ã/ã/ã/ ã/ã/ýâ/öâ/ïâ/èâ/áâ/Úâ/Óâ/Ìâ/Åâ/¾â/·â/°â/©â/¢â/›â/”â/â/†â/â/xâ/qâ/jâ/câ/\â/Uâ/Nâ/Gâ/@â/9â/2â/+â/$â/â/â/â/â/â/úá/óá/ìá/åá/Þá/×á/Ðá/Éá/Âá/»á/´á/­á/¦á/Ÿá/˜á/‘á/Šá/ƒá/|á/uá/ná/gá/`á/Yá/Rá/Ká/Dá/=á/6á//á/(á/!á/á/á/ á/á/þà/÷à/ðà/éà/âà/Ûà/Ôà/Íà/Æà/¿à/¸à/±à/ªà/£à/œà/•à/Žà/‡à/€à/yà/rà/kà/dà/]à/Và/Oà/Hà/Aà/:à/3à/,à/%à/à/à/à/ à/à/ûß/ôß/íß/æß/ßß/Øß/Ñß/Êß/Ãß/¼ß/µß/®ß/§ß/ ß/™ß/’ß/‹ß/„ß/}ß/vß/oß/hß/aß/Zß/Sß/Lß/Eß/>ß/7ß/0ß/)ß/"ß/ß/ß/ ß/ß/ÿÞ/øÞ/ñÞ/êÞ/ãÞ/ÜÞ/ÕÞ/ÎÞ/ÇÞ/ÀÞ/¹Þ/²Þ/«Þ/¤Þ/Þ/–Þ/Þ/ˆÞ/Þ/zÞ/sÞ/lÞ/eÞ/^Þ/WÞ/PÞ/IÞ/BÞ/;Þ/4Þ/-Þ/&Þ/Þ/Þ/Þ/ Þ/Þ/üÝ/õÝ/îÝ/çÝ/àÝ/ÙÝ/ÒÝ/ËÝ/ÄÝ/½Ý/¶Ý/¯Ý/¨Ý/¡Ý/šÝ/“Ý/ŒÝ/…Ý/~Ý/wÝ/pÝ/iÝ/bÝ/[Ý/TÝ/MÝ/FÝ/?Ý/8Ý/1Ý/*Ý/#Ý/Ý/Ý/Ý/Ý/Ý/ùÜ/òÜ/ëÜ/äÜ/ÝÜ/ÖÜ/ÏÜ/ÈÜ/ÁÜ/ºÜ/³Ü/¬Ü/¥Ü/žÜ/—Ü/Ü/‰Ü/‚Ü/{Ü/tÜ/mÜ/fÜ/_Ü/XÜ/QÜ/JÜ/CÜ/<Ü/5Ü/.Ü/'Ü/ Ü/Ü/Ü/ Ü/Ü/ýÛ/öÛ/ïÛ/èÛ/áÛ/ÚÛ/ÓÛ/ÌÛ/ÅÛ/¾Û/·Û/°Û/©Û/¢Û/›Û/”Û/Û/†Û/Û/xÛ/qÛ/jÛ/cÛ/\Û/UÛ/NÛ/GÛ/@Û/9Û/2Û/+Û/$Û/Û/Û/Û/Û/Û/úÚ/óÚ/ìÚ/åÚ/ÞÚ/×Ú/ÐÚ/ÉÚ/ÂÚ/»Ú/´Ú/­Ú/¦Ú/ŸÚ/˜Ú/‘Ú/ŠÚ/ƒÚ/|Ú/uÚ/nÚ/gÚ/`Ú/YÚ/RÚ/KÚ/DÚ/=Ú/6Ú//Ú/(Ú/!Ú/Ú/Ú/ Ú/Ú/þÙ/÷Ù/ðÙ/éÙ/âÙ/ÛÙ/ÔÙ/ÍÙ/ÆÙ/¿Ù/¸Ù/±Ù/ªÙ/£Ù/œÙ/•Ù/ŽÙ/‡Ù/€Ù/yÙ/rÙ/kÙ/dÙ/]Ù/VÙ/OÙ/HÙ/AÙ/:Ù/3Ù/,Ù/%Ù/Ù/Ù/Ù/ Ù/Ù/ûØ/ôØ/íØ/æØ/ߨ/ØØ/ÑØ/ÊØ/ÃØ/¼Ø/µØ/®Ø/§Ø/ Ø/™Ø/’Ø/‹Ø/„Ø/}Ø/vØ/oØ/hØ/aØ/ZØ/SØ/LØ/EØ/>Ø/7Ø/0Ø/)Ø/"Ø/Ø/Ø/ Ø/Ø/ÿ×/ø×/ñ×/ê×/ã×/Ü×/Õ×/Î×/Ç×/À×/¹×/²×/«×/¤×/×/–×/×/ˆ×/×/z×/s×/l×/e×/^×/W×/P×/I×/B×/;×/4×/-×/&×/×/×/×/ ×/×/üÖ/õÖ/îÖ/çÖ/àÖ/ÙÖ/ÒÖ/ËÖ/ÄÖ/½Ö/¶Ö/¯Ö/¨Ö/¡Ö/šÖ/“Ö/ŒÖ/…Ö/~Ö/wÖ/pÖ/iÖ/bÖ/[Ö/TÖ/MÖ/FÖ/?Ö/8Ö/1Ö/*Ö/#Ö/Ö/Ö/Ö/Ö/Ö/ùÕ/òÕ/ëÕ/äÕ/ÝÕ/ÖÕ/ÏÕ/ÈÕ/ÁÕ/ºÕ/³Õ/¬Õ/¥Õ/žÕ/—Õ/Õ/‰Õ/‚Õ/{Õ/tÕ/mÕ/fÕ/_Õ/XÕ/QÕ/JÕ/CÕ/<Õ/5Õ/.Õ/'Õ/ Õ/Õ/Õ/ Õ/Õ/ýÔ/öÔ/ïÔ/èÔ/áÔ/ÚÔ/ÓÔ/ÌÔ/ÅÔ/¾Ô/·Ô/°Ô/©Ô/¢Ô/›Ô/”Ô/Ô/†Ô/Ô/xÔ/qÔ/jÔ/cÔ/\Ô/UÔ/NÔ/GÔ/@Ô/9Ô/2Ô/+Ô/$Ô/Ô/Ô/Ô/Ô/Ô/úÓ/óÓ/ìÓ/åÓ/ÞÓ/×Ó/ÐÓ/ÉÓ/ÂÓ/»Ó/´Ó/­Ó/¦Ó/ŸÓ/˜Ó/‘Ó/ŠÓ/ƒÓ/|Ó/uÓ/nÓ/gÓ/`Ó/YÓ/RÓ/KÓ/DÓ/=Ó/6Ó//Ó/(Ó/!Ó/Ó/Ó/ Ó/Ó/þÒ/÷Ò/ðÒ/éÒ/âÒ/ÛÒ/ÔÒ/ÍÒ/ÆÒ/¿Ò/¸Ò/±Ò/ªÒ/£Ò/œÒ/•Ò/ŽÒ/‡Ò/€Ò/yÒ/rÒ/kÒ/dÒ/]Ò/VÒ/OÒ/HÒ/AÒ/:Ò/3Ò/,Ò/%Ò/Ò/Ò/Ò/ Ò/Ò/ûÑ/ôÑ/íÑ/æÑ/ßÑ/ØÑ/ÑÑ/ÊÑ/ÃÑ/¼Ñ/µÑ/®Ñ/§Ñ/ Ñ/™Ñ/’Ñ/‹Ñ/„Ñ/}Ñ/vÑ/oÑ/hÑ/aÑ/ZÑ/SÑ/LÑ/EÑ/>Ñ/7Ñ/0Ñ/)Ñ/"Ñ/Ñ/Ñ/ Ñ/Ñ/ÿÐ/øÐ/ñÐ/êÐ/ãÐ/ÜÐ/ÕÐ/ÎÐ/ÇÐ/ÀÐ/¹Ð/²Ð/«Ð/¤Ð/Ð/–Ð/Ð/ˆÐ/Ð/zÐ/sÐ/lÐ/eÐ/^Ð/WÐ/PÐ/IÐ/BÐ/;Ð/4Ð/-Ð/&Ð/Ð/Ð/Ð/ Ð/Ð/üÏ/õÏ/îÏ/çÏ/àÏ/ÙÏ/ÒÏ/ËÏ/ÄÏ/½Ï/¶Ï/¯Ï/¨Ï/¡Ï/šÏ/“Ï/ŒÏ/…Ï/~Ï/wÏ/pÏ/iÏ/bÏ/[Ï/TÏ/MÏ/FÏ/?Ï/8Ï/1Ï/*Ï/#Ï/Ï/Ï/Ï/Ï/Ï/ùÎ/òÎ/ëÎ/äÎ/ÝÎ/ÖÎ/ÏÎ/ÈÎ/ÁÎ/ºÎ/³Î/¬Î/¥Î/žÎ/—Î/Î/‰Î/‚Î/{Î/tÎ/mÎ/fÎ/_Î/XÎ/QÎ/JÎ/CÎ/<Î/5Î/.Î/'Î/ Î/Î/Î/ Î/Î/ýÍ/öÍ/ïÍ/èÍ/áÍ/ÚÍ/ÓÍ/ÌÍ/ÅÍ/¾Í/·Í/°Í/©Í/¢Í/›Í/”Í/Í/†Í/Í/xÍ/qÍ/jÍ/cÍ/\Í/UÍ/NÍ/GÍ/@Í/9Í/2Í/+Í/$Í/Í/Í/Í/Í/Í/úÌ/óÌ/ìÌ/åÌ/ÞÌ/×Ì/ÐÌ/ÉÌ/ÂÌ/»Ì/´Ì/­Ì/¦Ì/ŸÌ/˜Ì/‘Ì/ŠÌ/ƒÌ/|Ì/uÌ/nÌ/gÌ/`Ì/YÌ/RÌ/KÌ/DÌ/=Ì/6Ì//Ì/(Ì/!Ì/Ì/Ì/ Ì/Ì/þË/÷Ë/ðË/éË/âË/ÛË/ÔË/ÍË/ÆË/¿Ë/¸Ë/±Ë/ªË/£Ë/œË/•Ë/ŽË/‡Ë/€Ë/yË/rË/kË/dË/]Ë/VË/OË/HË/AË/:Ë/3Ë/,Ë/%Ë/Ë/Ë/Ë/ Ë/Ë/ûÊ/ôÊ/íÊ/æÊ/ßÊ/ØÊ/ÑÊ/ÊÊ/ÃÊ/¼Ê/µÊ/®Ê/§Ê/ Ê/™Ê/’Ê/‹Ê/„Ê/}Ê/vÊ/oÊ/hÊ/aÊ/ZÊ/SÊ/LÊ/EÊ/>Ê/7Ê/0Ê/)Ê/"Ê/Ê/Ê/ Ê/Ê/ÿÉ/øÉ/ñÉ/êÉ/ãÉ/ÜÉ/ÕÉ/ÎÉ/ÇÉ/ÀÉ/¹É/²É/«É/¤É/É/–É/É/ˆÉ/É/zÉ/sÉ/lÉ/eÉ/^É/WÉ/PÉ/IÉ/BÉ/;É/4É/-É/&É/É/É/É/ É/É/üÈ/õÈ/îÈ/çÈ/àÈ/ÙÈ/ÒÈ/ËÈ/ÄÈ/½È/¶È/¯È/¨È/¡È/šÈ/“È/ŒÈ/…È/~È/wÈ/pÈ/iÈ/bÈ/[È/TÈ/MÈ/FÈ/?È/8È/1È/*È/#È/È/È/È/È/È/ùÇ/òÇ/ëÇ/äÇ/ÝÇ/ÖÇ/ÏÇ/ÈÇ/ÁÇ/ºÇ/³Ç/¬Ç/¥Ç/žÇ/—Ç/Ç/‰Ç/‚Ç/{Ç/tÇ/mÇ/fÇ/_Ç/XÇ/QÇ/JÇ/CÇ/<Ç/5Ç/.Ç/'Ç/ Ç/Ç/Ç/ Ç/Ç/ýÆ/öÆ/ïÆ/èÆ/áÆ/ÚÆ/ÓÆ/ÌÆ/ÅÆ/¾Æ/·Æ/°Æ/©Æ/¢Æ/›Æ/”Æ/Æ/†Æ/Æ/xÆ/qÆ/jÆ/cÆ/\Æ/UÆ/NÆ/GÆ/@Æ/9Æ/2Æ/+Æ/$Æ/Æ/Æ/Æ/Æ/Æ/úÅ/óÅ/ìÅ/åÅ/ÞÅ/×Å/ÐÅ/ÉÅ/ÂÅ/»Å/´Å/­Å/¦Å/ŸÅ/˜Å/‘Å/ŠÅ/ƒÅ/|Å/uÅ/nÅ/gÅ/`Å/YÅ/RÅ/KÅ/DÅ/=Å/6Å//Å/(Å/!Å/Å/Å/ Å/Å/þÄ/÷Ä/ðÄ/éÄ/âÄ/ÛÄ/ÔÄ/ÍÄ/ÆÄ/¿Ä/¸Ä/±Ä/ªÄ/£Ä/œÄ/•Ä/ŽÄ/‡Ä/€Ä/yÄ/rÄ/kÄ/dÄ/]Ä/VÄ/OÄ/HÄ/AÄ/:Ä/3Ä/,Ä/%Ä/Ä/Ä/Ä/ Ä/Ä/ûÃ/ôÃ/íÃ/æÃ/ßÃ/ØÃ/ÑÃ/ÊÃ/ÃÃ/¼Ã/µÃ/®Ã/§Ã/ Ã/™Ã/’Ã/‹Ã/„Ã/}Ã/vÃ/oÃ/hÃ/aÃ/ZÃ/SÃ/LÃ/EÃ/>Ã/7Ã/0Ã/)Ã/"Ã/Ã/Ã/ Ã/Ã/ÿÂ/øÂ/ñÂ/êÂ/ãÂ/ÜÂ/ÕÂ/ÎÂ/ÇÂ/ÀÂ/¹Â/²Â/«Â/¤Â/Â/–Â/Â/ˆÂ/Â/zÂ/sÂ/lÂ/eÂ/^Â/WÂ/PÂ/IÂ/BÂ/;Â/4Â/-Â/&Â/Â/Â/Â/ Â/Â/üÁ/õÁ/îÁ/çÁ/àÁ/ÙÁ/ÒÁ/ËÁ/ÄÁ/½Á/¶Á/¯Á/¨Á/¡Á/šÁ/“Á/ŒÁ/…Á/~Á/wÁ/pÁ/iÁ/bÁ/[Á/TÁ/MÁ/FÁ/?Á/8Á/1Á/*Á/#Á/Á/Á/Á/Á/Á/ùÀ/òÀ/ëÀ/äÀ/ÝÀ/ÖÀ/ÏÀ/ÈÀ/ÁÀ/ºÀ/³À/¬À/¥À/žÀ/—À/À/‰À/‚À/{À/tÀ/mÀ/fÀ/_À/XÀ/QÀ/JÀ/CÀ/<À/5À/.À/'À/ À/À/À/ À/À/ý¿/ö¿/ï¿/è¿/á¿/Ú¿/Ó¿/Ì¿/Å¿/¾¿/·¿/°¿/©¿/¢¿/›¿/”¿/¿/†¿/¿/x¿/q¿/j¿/c¿/\¿/U¿/N¿/G¿/@¿/9¿/2¿/+¿/$¿/¿/¿/¿/¿/¿/ú¾/ó¾/ì¾/å¾/Þ¾/×¾/о/ɾ/¾/»¾/´¾/­¾/¦¾/Ÿ¾/˜¾/‘¾/о/ƒ¾/|¾/u¾/n¾/g¾/`¾/Y¾/R¾/K¾/D¾/=¾/6¾//¾/(¾/!¾/¾/¾/ ¾/¾/þ½/÷½/ð½/é½/â½/Û½/Ô½/ͽ/ƽ/¿½/¸½/±½/ª½/£½/œ½/•½/޽/‡½/€½/y½/r½/k½/d½/]½/V½/O½/H½/A½/:½/3½/,½/%½/½/½/½/ ½/½/û¼/ô¼/í¼/æ¼/ß¼/ؼ/Ѽ/ʼ/ü/¼¼/µ¼/®¼/§¼/ ¼/™¼/’¼/‹¼/„¼/}¼/v¼/o¼/h¼/a¼/Z¼/S¼/L¼/E¼/>¼/7¼/0¼/)¼/"¼/¼/¼/ ¼/¼/ÿ»/ø»/ñ»/ê»/ã»/Ü»/Õ»/λ/Ç»/À»/¹»/²»/«»/¤»/»/–»/»/ˆ»/»/z»/s»/l»/e»/^»/W»/P»/I»/B»/;»/4»/-»/&»/»/»/»/ »/»/üº/õº/îº/çº/àº/Ùº/Òº/˺/ĺ/½º/¶º/¯º/¨º/¡º/šº/“º/Œº/…º/~º/wº/pº/iº/bº/[º/Tº/Mº/Fº/?º/8º/1º/*º/#º/º/º/º/º/º/ù¹/ò¹/ë¹/ä¹/ݹ/Ö¹/Ϲ/ȹ/Á¹/º¹/³¹/¬¹/¥¹/ž¹/—¹/¹/‰¹/‚¹/{¹/t¹/m¹/f¹/_¹/X¹/Q¹/J¹/C¹/<¹/5¹/.¹/'¹/ ¹/¹/¹/ ¹/¹/ý¸/ö¸/ï¸/è¸/á¸/Ú¸/Ó¸/̸/Ÿ/¾¸/·¸/°¸/©¸/¢¸/›¸/”¸/¸/†¸/¸/x¸/q¸/j¸/c¸/\¸/U¸/N¸/G¸/@¸/9¸/2¸/+¸/$¸/¸/¸/¸/¸/¸/ú·/ó·/ì·/å·/Þ·/×·/з/É·/·/»·/´·/­·/¦·/Ÿ·/˜·/‘·/Š·/ƒ·/|·/u·/n·/g·/`·/Y·/R·/K·/D·/=·/6·//·/(·/!·/·/·/ ·/·/þ¶/÷¶/ð¶/é¶/â¶/Û¶/Ô¶/Ͷ/ƶ/¿¶/¸¶/±¶/ª¶/£¶/œ¶/•¶/޶/‡¶/€¶/y¶/r¶/k¶/d¶/]¶/V¶/O¶/H¶/A¶/:¶/3¶/,¶/%¶/¶/¶/¶/ ¶/¶/ûµ/ôµ/íµ/æµ/ßµ/ص/ѵ/ʵ/õ/¼µ/µµ/®µ/§µ/ µ/™µ/’µ/‹µ/„µ/}µ/vµ/oµ/hµ/aµ/Zµ/Sµ/Lµ/Eµ/>µ/7µ/0µ/)µ/"µ/µ/µ/ µ/µ/ÿ´/ø´/ñ´/ê´/ã´/Ü´/Õ´/δ/Ç´/À´/¹´/²´/«´/¤´/´/–´/´/ˆ´/´/z´/s´/l´/e´/^´/W´/P´/I´/B´/;´/4´/-´/&´/´/´/´/ ´/´/ü³/õ³/î³/ç³/à³/Ù³/Ò³/˳/ij/½³/¶³/¯³/¨³/¡³/š³/“³/Œ³/…³/~³/w³/p³/i³/b³/[³/T³/M³/F³/?³/8³/1³/*³/#³/³/³/³/³/³/ù²/ò²/ë²/ä²/ݲ/Ö²/ϲ/Ȳ/Á²/º²/³²/¬²/¥²/ž²/—²/²/‰²/‚²/{²/t²/m²/f²/_²/X²/Q²/J²/C²/<²/5²/.²/'²/ ²/²/²/ ²/²/ý±/ö±/ï±/è±/á±/Ú±/Ó±/̱/ű/¾±/·±/°±/©±/¢±/›±/”±/±/†±/±/x±/q±/j±/c±/\±/U±/N±/G±/@±/9±/2±/+±/$±/±/±/±/±/±/ú°/ó°/ì°/å°/Þ°/×°/а/ɰ/°/»°/´°/­°/¦°/Ÿ°/˜°/‘°/а/ƒ°/|°/u°/n°/g°/`°/Y°/R°/K°/D°/=°/6°//°/(°/!°/°/°/ °/°/þ¯/÷¯/ð¯/é¯/â¯/Û¯/Ô¯/ͯ/Ư/¿¯/¸¯/±¯/ª¯/£¯/œ¯/•¯/ޝ/‡¯/€¯/y¯/r¯/k¯/d¯/]¯/V¯/O¯/H¯/A¯/:¯/3¯/,¯/%¯/¯/¯/¯/ ¯/¯/û®/ô®/í®/æ®/ß®/Ø®/Ñ®/Ê®/î/¼®/µ®/®®/§®/ ®/™®/’®/‹®/„®/}®/v®/o®/h®/a®/Z®/S®/L®/E®/>®/7®/0®/)®/"®/®/®/ ®/®/ÿ­/ø­/ñ­/ê­/ã­/Ü­/Õ­/έ/Ç­/À­/¹­/²­/«­/¤­/­/–­/­/ˆ­/­/z­/s­/l­/e­/^­/W­/P­/I­/B­/;­/4­/-­/&­/­/­/­/ ­/­/ü¬/õ¬/î¬/ç¬/à¬/Ù¬/Ò¬/ˬ/Ĭ/½¬/¶¬/¯¬/¨¬/¡¬/š¬/“¬/Œ¬/…¬/~¬/w¬/p¬/i¬/b¬/[¬/T¬/M¬/F¬/?¬/8¬/1¬/*¬/#¬/¬/¬/¬/¬/¬/ù«/ò«/ë«/ä«/Ý«/Ö«/Ï«/È«/Á«/º«/³«/¬«/¥«/ž«/—«/«/‰«/‚«/{«/t«/m«/f«/_«/X«/Q«/J«/C«/<«/5«/.«/'«/ «/«/«/ «/«/ýª/öª/ïª/èª/áª/Úª/Óª/̪/Ū/¾ª/·ª/°ª/©ª/¢ª/›ª/”ª/ª/†ª/ª/xª/qª/jª/cª/\ª/Uª/Nª/Gª/@ª/9ª/2ª/+ª/$ª/ª/ª/ª/ª/ª/ú©/ó©/ì©/å©/Þ©/ש/Щ/É©/©/»©/´©/­©/¦©/Ÿ©/˜©/‘©/Š©/ƒ©/|©/u©/n©/g©/`©/Y©/R©/K©/D©/=©/6©//©/(©/!©/©/©/ ©/©/þ¨/÷¨/ð¨/é¨/â¨/Û¨/Ô¨/ͨ/ƨ/¿¨/¸¨/±¨/ª¨/£¨/œ¨/•¨/ލ/‡¨/€¨/y¨/r¨/k¨/d¨/]¨/V¨/O¨/H¨/A¨/:¨/3¨/,¨/%¨/¨/¨/¨/ ¨/¨/û§/ô§/í§/æ§/ß§/ا/ѧ/ʧ/ç/¼§/µ§/®§/§§/ §/™§/’§/‹§/„§/}§/v§/o§/h§/a§/Z§/S§/L§/E§/>§/7§/0§/)§/"§/§/§/ §/§/ÿ¦/ø¦/ñ¦/ê¦/ã¦/ܦ/Õ¦/Φ/Ǧ/À¦/¹¦/²¦/«¦/¤¦/¦/–¦/¦/ˆ¦/¦/z¦/s¦/l¦/e¦/^¦/W¦/P¦/I¦/B¦/;¦/4¦/-¦/&¦/¦/¦/¦/ ¦/¦/ü¥/õ¥/î¥/ç¥/à¥/Ù¥/Ò¥/Ë¥/Ä¥/½¥/¶¥/¯¥/¨¥/¡¥/š¥/“¥/Œ¥/…¥/~¥/w¥/p¥/i¥/b¥/[¥/T¥/M¥/F¥/?¥/8¥/1¥/*¥/#¥/¥/¥/¥/¥/¥/ù¤/ò¤/ë¤/ä¤/ݤ/Ö¤/Ϥ/Ȥ/Á¤/º¤/³¤/¬¤/¥¤/ž¤/—¤/¤/‰¤/‚¤/{¤/t¤/m¤/f¤/_¤/X¤/Q¤/J¤/C¤/<¤/5¤/.¤/'¤/ ¤/¤/¤/ ¤/¤/ý£/ö£/ï£/è£/á£/Ú£/Ó£/Ì£/Å£/¾£/·£/°£/©£/¢£/›£/”£/£/†£/£/x£/q£/j£/c£/\£/U£/N£/G£/@£/9£/2£/+£/$£/£/£/£/£/£/ú¢/ó¢/ì¢/å¢/Þ¢/×¢/Т/É¢/¢/»¢/´¢/­¢/¦¢/Ÿ¢/˜¢/‘¢/Š¢/ƒ¢/|¢/u¢/n¢/g¢/`¢/Y¢/R¢/K¢/D¢/=¢/6¢//¢/(¢/!¢/¢/¢/ ¢/¢/þ¡/÷¡/ð¡/é¡/â¡/Û¡/Ô¡/Í¡/Æ¡/¿¡/¸¡/±¡/ª¡/£¡/œ¡/•¡/Ž¡/‡¡/€¡/y¡/r¡/k¡/d¡/]¡/V¡/O¡/H¡/A¡/:¡/3¡/,¡/%¡/¡/¡/¡/ ¡/¡/û /ô /í /æ /ß /Ø /Ñ /Ê /à/¼ /µ /® /§ /  /™ /’ /‹ /„ /} /v /o /h /a /Z /S /L /E /> /7 /0 /) /" / / /  / /ÿŸ/øŸ/ñŸ/êŸ/ãŸ/ÜŸ/ÕŸ/Ο/ÇŸ/ÀŸ/¹Ÿ/²Ÿ/«Ÿ/¤Ÿ/Ÿ/–Ÿ/Ÿ/ˆŸ/Ÿ/zŸ/sŸ/lŸ/eŸ/^Ÿ/WŸ/PŸ/IŸ/BŸ/;Ÿ/4Ÿ/-Ÿ/&Ÿ/Ÿ/Ÿ/Ÿ/ Ÿ/Ÿ/üž/õž/îž/çž/àž/Ùž/Òž/Ëž/Äž/½ž/¶ž/¯ž/¨ž/¡ž/šž/“ž/Œž/…ž/~ž/wž/pž/iž/bž/[ž/Tž/Mž/Fž/?ž/8ž/1ž/*ž/#ž/ž/ž/ž/ž/ž/ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/™/7™/0™/)™/"™/™/™/ ™/™/ÿ˜/ø˜/ñ˜/ê˜/ã˜/ܘ/Õ˜/Θ/ǘ/À˜/¹˜/²˜/«˜/¤˜/˜/–˜/˜/ˆ˜/˜/z˜/s˜/l˜/e˜/^˜/W˜/P˜/I˜/B˜/;˜/4˜/-˜/&˜/˜/˜/˜/ ˜/˜/ü—/õ—/î—/ç—/à—/Ù—/Ò—/Ë—/Ä—/½—/¶—/¯—/¨—/¡—/š—/“—/Œ—/…—/~—/w—/p—/i—/b—/[—/T—/M—/F—/?—/8—/1—/*—/#—/—/—/—/—/—/ù–/ò–/ë–/ä–/Ý–/Ö–/Ï–/È–/Á–/º–/³–/¬–/¥–/ž–/—–/–/‰–/‚–/{–/t–/m–/f–/_–/X–/Q–/J–/C–/<–/5–/.–/'–/ –/–/–/ –/–/ý•/ö•/ï•/è•/á•/Ú•/Ó•/Ì•/Å•/¾•/·•/°•/©•/¢•/›•/”•/•/†•/•/x•/q•/j•/c•/\•/U•/N•/G•/@•/9•/2•/+•/$•/•/•/•/•/•/ú”/ó”/ì”/å”/Þ”/×”/Д/É”/”/»”/´”/­”/¦”/Ÿ”/˜”/‘”/Š”/ƒ”/|”/u”/n”/g”/`”/Y”/R”/K”/D”/=”/6”//”/(”/!”/”/”/ ”/”/þ“/÷“/ð“/é“/â“/Û“/Ô“/Í“/Æ“/¿“/¸“/±“/ª“/£“/œ“/•“/Ž“/‡“/€“/y“/r“/k“/d“/]“/V“/O“/H“/A“/:“/3“/,“/%“/“/“/“/ “/“/û’/ô’/í’/æ’/ß’/Ø’/Ñ’/Ê’/Ã’/¼’/µ’/®’/§’/ ’/™’/’’/‹’/„’/}’/v’/o’/h’/a’/Z’/S’/L’/E’/>’/7’/0’/)’/"’/’/’/ ’/’/ÿ‘/ø‘/ñ‘/ê‘/ã‘/Ü‘/Õ‘/Α/Ç‘/À‘/¹‘/²‘/«‘/¤‘/‘/–‘/‘/ˆ‘/‘/z‘/s‘/l‘/e‘/^‘/W‘/P‘/I‘/B‘/;‘/4‘/-‘/&‘/‘/‘/‘/ ‘/‘/ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/‹/7‹/0‹/)‹/"‹/‹/‹/ ‹/‹/ÿŠ/øŠ/ñŠ/êŠ/ãŠ/ÜŠ/ÕŠ/Ί/ÇŠ/ÀŠ/¹Š/²Š/«Š/¤Š/Š/–Š/Š/ˆŠ/Š/zŠ/sŠ/lŠ/eŠ/^Š/WŠ/PŠ/IŠ/BŠ/;Š/4Š/-Š/&Š/Š/Š/Š/ Š/Š/ü‰/õ‰/î‰/ç‰/à‰/Ù‰/Ò‰/ˉ/ĉ/½‰/¶‰/¯‰/¨‰/¡‰/š‰/“‰/Œ‰/…‰/~‰/w‰/p‰/i‰/b‰/[‰/T‰/M‰/F‰/?‰/8‰/1‰/*‰/#‰/‰/‰/‰/‰/‰/ùˆ/òˆ/ëˆ/äˆ/݈/Öˆ/ψ/Ȉ/Áˆ/ºˆ/³ˆ/¬ˆ/¥ˆ/žˆ/—ˆ/ˆ/‰ˆ/‚ˆ/{ˆ/tˆ/mˆ/fˆ/_ˆ/Xˆ/Qˆ/Jˆ/Cˆ/<ˆ/5ˆ/.ˆ/'ˆ/ ˆ/ˆ/ˆ/ ˆ/ˆ/ý‡/ö‡/ï‡/è‡/á‡/Ú‡/Ó‡/̇/Ň/¾‡/·‡/°‡/©‡/¢‡/›‡/”‡/‡/†‡/‡/x‡/q‡/j‡/c‡/\‡/U‡/N‡/G‡/@‡/9‡/2‡/+‡/$‡/‡/‡/‡/‡/‡/ú†/ó†/ì†/å†/Þ†/׆/І/Ɇ/†/»†/´†/­†/¦†/Ÿ†/˜†/‘†/І/ƒ†/|†/u†/n†/g†/`†/Y†/R†/K†/D†/=†/6†//†/(†/!†/†/†/ †/†/þ…/÷…/ð…/é…/â…/Û…/Ô…/Í…/Æ…/¿…/¸…/±…/ª…/£…/œ…/•…/Ž…/‡…/€…/y…/r…/k…/d…/]…/V…/O…/H…/A…/:…/3…/,…/%…/…/…/…/ …/…/û„/ô„/í„/æ„/ß„/Ø„/Ñ„/Ê„/Ä/¼„/µ„/®„/§„/ „/™„/’„/‹„/„„/}„/v„/o„/h„/a„/Z„/S„/L„/E„/>„/7„/0„/)„/"„/„/„/ „/„/ÿƒ/øƒ/ñƒ/êƒ/ãƒ/܃/Õƒ/΃/ǃ/Àƒ/¹ƒ/²ƒ/«ƒ/¤ƒ/ƒ/–ƒ/ƒ/ˆƒ/ƒ/zƒ/sƒ/lƒ/eƒ/^ƒ/Wƒ/Pƒ/Iƒ/Bƒ/;ƒ/4ƒ/-ƒ/&ƒ/ƒ/ƒ/ƒ/ ƒ/ƒ/ü‚/õ‚/î‚/ç‚/à‚/Ù‚/Ò‚/Ë‚/Ä‚/½‚/¶‚/¯‚/¨‚/¡‚/š‚/“‚/Œ‚/…‚/~‚/w‚/p‚/i‚/b‚/[‚/T‚/M‚/F‚/?‚/8‚/1‚/*‚/#‚/‚/‚/‚/‚/‚/ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/}/7}/0}/)}/"}/}/}/ }/}/ÿ|/ø|/ñ|/ê|/ã|/Ü|/Õ|/Î|/Ç|/À|/¹|/²|/«|/¤|/|/–|/|/ˆ|/|/z|/s|/l|/e|/^|/W|/P|/I|/B|/;|/4|/-|/&|/|/|/|/ |/|/ü{/õ{/î{/ç{/à{/Ù{/Ò{/Ë{/Ä{/½{/¶{/¯{/¨{/¡{/š{/“{/Œ{/…{/~{/w{/p{/i{/b{/[{/T{/M{/F{/?{/8{/1{/*{/#{/{/{/{/{/{/ùz/òz/ëz/äz/Ýz/Öz/Ïz/Èz/Áz/ºz/³z/¬z/¥z/žz/—z/z/‰z/‚z/{z/tz/mz/fz/_z/Xz/Qz/Jz/Cz/v/7v/0v/)v/"v/v/v/ v/v/ÿu/øu/ñu/êu/ãu/Üu/Õu/Îu/Çu/Àu/¹u/²u/«u/¤u/u/–u/u/ˆu/u/zu/su/lu/eu/^u/Wu/Pu/Iu/Bu/;u/4u/-u/&u/u/u/u/ u/u/üt/õt/ît/çt/àt/Ùt/Òt/Ët/Ät/½t/¶t/¯t/¨t/¡t/št/“t/Œt/…t/~t/wt/pt/it/bt/[t/Tt/Mt/Ft/?t/8t/1t/*t/#t/t/t/t/t/t/ùs/òs/ës/äs/Ýs/Ös/Ïs/Ès/Ás/ºs/³s/¬s/¥s/žs/—s/s/‰s/‚s/{s/ts/ms/fs/_s/Xs/Qs/Js/Cs/o/7o/0o/)o/"o/o/o/ o/o/ÿn/øn/ñn/ên/ãn/Ün/Õn/În/Çn/Àn/¹n/²n/«n/¤n/n/–n/n/ˆn/n/zn/sn/ln/en/^n/Wn/Pn/In/Bn/;n/4n/-n/&n/n/n/n/ n/n/üm/õm/îm/çm/àm/Ùm/Òm/Ëm/Äm/½m/¶m/¯m/¨m/¡m/šm/“m/Œm/…m/~m/wm/pm/im/bm/[m/Tm/Mm/Fm/?m/8m/1m/*m/#m/m/m/m/m/m/ùl/òl/ël/äl/Ýl/Öl/Ïl/Èl/Ál/ºl/³l/¬l/¥l/žl/—l/l/‰l/‚l/{l/tl/ml/fl/_l/Xl/Ql/Jl/Cl/h/7h/0h/)h/"h/h/h/ h/h/ÿg/øg/ñg/êg/ãg/Üg/Õg/Îg/Çg/Àg/¹g/²g/«g/¤g/g/–g/g/ˆg/g/zg/sg/lg/eg/^g/Wg/Pg/Ig/Bg/;g/4g/-g/&g/g/g/g/ g/g/üf/õf/îf/çf/àf/Ùf/Òf/Ëf/Äf/½f/¶f/¯f/¨f/¡f/šf/“f/Œf/…f/~f/wf/pf/if/bf/[f/Tf/Mf/Ff/?f/8f/1f/*f/#f/f/f/f/f/f/ùe/òe/ëe/äe/Ýe/Öe/Ïe/Èe/Áe/ºe/³e/¬e/¥e/že/—e/e/‰e/‚e/{e/te/me/fe/_e/Xe/Qe/Je/Ce/a/7a/0a/)a/"a/a/a/ a/a/ÿ`/ø`/ñ`/ê`/ã`/Ü`/Õ`/Î`/Ç`/À`/¹`/²`/«`/¤`/`/–`/`/ˆ`/`/z`/s`/l`/e`/^`/W`/P`/I`/B`/;`/4`/-`/&`/`/`/`/ `/`/ü_/õ_/î_/ç_/à_/Ù_/Ò_/Ë_/Ä_/½_/¶_/¯_/¨_/¡_/š_/“_/Œ_/…_/~_/w_/p_/i_/b_/[_/T_/M_/F_/?_/8_/1_/*_/#_/_/_/_/_/_/ù^/ò^/ë^/ä^/Ý^/Ö^/Ï^/È^/Á^/º^/³^/¬^/¥^/ž^/—^/^/‰^/‚^/{^/t^/m^/f^/_^/X^/Q^/J^/C^/<^/5^/.^/'^/ ^/^/^/ ^/^/ý]/ö]/ï]/è]/á]/Ú]/Ó]/Ì]/Å]/¾]/·]/°]/©]/¢]/›]/”]/]/†]/]/x]/q]/j]/c]/\]/U]/N]/G]/@]/9]/2]/+]/$]/]/]/]/]/]/ú\/ó\/ì\/å\/Þ\/×\/Ð\/É\/Â\/»\/´\/­\/¦\/Ÿ\/˜\/‘\/Š\/ƒ\/|\/u\/n\/g\/`\/Y\/R\/K\/D\/=\/6\//\/(\/!\/\/\/ \/\/þ[/÷[/ð[/é[/â[/Û[/Ô[/Í[/Æ[/¿[/¸[/±[/ª[/£[/œ[/•[/Ž[/‡[/€[/y[/r[/k[/d[/][/V[/O[/H[/A[/:[/3[/,[/%[/[/[/[/ [/[/ûZ/ôZ/íZ/æZ/ßZ/ØZ/ÑZ/ÊZ/ÃZ/¼Z/µZ/®Z/§Z/ Z/™Z/’Z/‹Z/„Z/}Z/vZ/oZ/hZ/aZ/ZZ/SZ/LZ/EZ/>Z/7Z/0Z/)Z/"Z/Z/Z/ Z/Z/ÿY/øY/ñY/êY/ãY/ÜY/ÕY/ÎY/ÇY/ÀY/¹Y/²Y/«Y/¤Y/Y/–Y/Y/ˆY/Y/zY/sY/lY/eY/^Y/WY/PY/IY/BY/;Y/4Y/-Y/&Y/Y/Y/Y/ Y/Y/üX/õX/îX/çX/àX/ÙX/ÒX/ËX/ÄX/½X/¶X/¯X/¨X/¡X/šX/“X/ŒX/…X/~X/wX/pX/iX/bX/[X/TX/MX/FX/?X/8X/1X/*X/#X/X/X/X/X/X/ùW/òW/ëW/äW/ÝW/ÖW/ÏW/ÈW/ÁW/ºW/³W/¬W/¥W/žW/—W/W/‰W/‚W/{W/tW/mW/fW/_W/XW/QW/JW/CW/S/7S/0S/)S/"S/S/S/ S/S/ÿR/øR/ñR/êR/ãR/ÜR/ÕR/ÎR/ÇR/ÀR/¹R/²R/«R/¤R/R/–R/R/ˆR/R/zR/sR/lR/eR/^R/WR/PR/IR/BR/;R/4R/-R/&R/R/R/R/ R/R/üQ/õQ/îQ/çQ/àQ/ÙQ/ÒQ/ËQ/ÄQ/½Q/¶Q/¯Q/¨Q/¡Q/šQ/“Q/ŒQ/…Q/~Q/wQ/pQ/iQ/bQ/[Q/TQ/MQ/FQ/?Q/8Q/1Q/*Q/#Q/Q/Q/Q/Q/Q/ùP/òP/ëP/äP/ÝP/ÖP/ÏP/ÈP/ÁP/ºP/³P/¬P/¥P/žP/—P/P/‰P/‚P/{P/tP/mP/fP/_P/XP/QP/JP/CP/

    L/7L/0L/)L/"L/L/L/ L/L/ÿK/øK/ñK/êK/ãK/ÜK/ÕK/ÎK/ÇK/ÀK/¹K/²K/«K/¤K/K/–K/K/ˆK/K/zK/sK/lK/eK/^K/WK/PK/IK/BK/;K/4K/-K/&K/K/K/K/ K/K/üJ/õJ/îJ/çJ/àJ/ÙJ/ÒJ/ËJ/ÄJ/½J/¶J/¯J/¨J/¡J/šJ/“J/ŒJ/…J/~J/wJ/pJ/iJ/bJ/[J/TJ/MJ/FJ/?J/8J/1J/*J/#J/J/J/J/J/J/ùI/òI/ëI/äI/ÝI/ÖI/ÏI/ÈI/ÁI/ºI/³I/¬I/¥I/žI/—I/I/‰I/‚I/{I/tI/mI/fI/_I/XI/QI/JI/CI/E/7E/0E/)E/"E/E/E/ E/E/ÿD/øD/ñD/êD/ãD/ÜD/ÕD/ÎD/ÇD/ÀD/¹D/²D/«D/¤D/D/–D/D/ˆD/D/zD/sD/lD/eD/^D/WD/PD/ID/BD/;D/4D/-D/&D/D/D/D/ D/D/üC/õC/îC/çC/àC/ÙC/ÒC/ËC/ÄC/½C/¶C/¯C/¨C/¡C/šC/“C/ŒC/…C/~C/wC/pC/iC/bC/[C/TC/MC/FC/?C/8C/1C/*C/#C/C/C/C/C/C/ùB/òB/ëB/äB/ÝB/ÖB/ÏB/ÈB/ÁB/ºB/³B/¬B/¥B/žB/—B/B/‰B/‚B/{B/tB/mB/fB/_B/XB/QB/JB/CB//ô>/í>/æ>/ß>/Ø>/Ñ>/Ê>/Ã>/¼>/µ>/®>/§>/ >/™>/’>/‹>/„>/}>/v>/o>/h>/a>/Z>/S>/L>/E>/>>/7>/0>/)>/">/>/>/ >/>/ÿ=/ø=/ñ=/ê=/ã=/Ü=/Õ=/Î=/Ç=/À=/¹=/²=/«=/¤=/=/–=/=/ˆ=/=/z=/s=/l=/e=/^=/W=/P=/I=/B=/;=/4=/-=/&=/=/=/=/ =/=/ü7/77/07/)7/"7/7/7/ 7/7/ÿ6/ø6/ñ6/ê6/ã6/Ü6/Õ6/Î6/Ç6/À6/¹6/²6/«6/¤6/6/–6/6/ˆ6/6/z6/s6/l6/e6/^6/W6/P6/I6/B6/;6/46/-6/&6/6/6/6/ 6/6/ü5/õ5/î5/ç5/à5/Ù5/Ò5/Ë5/Ä5/½5/¶5/¯5/¨5/¡5/š5/“5/Œ5/…5/~5/w5/p5/i5/b5/[5/T5/M5/F5/?5/85/15/*5/#5/5/5/5/5/5/ù4/ò4/ë4/ä4/Ý4/Ö4/Ï4/È4/Á4/º4/³4/¬4/¥4/ž4/—4/4/‰4/‚4/{4/t4/m4/f4/_4/X4/Q4/J4/C4/<4/54/.4/'4/ 4/4/4/ 4/4/ý3/ö3/ï3/è3/á3/Ú3/Ó3/Ì3/Å3/¾3/·3/°3/©3/¢3/›3/”3/3/†3/3/x3/q3/j3/c3/\3/U3/N3/G3/@3/93/23/+3/$3/3/3/3/3/3/ú2/ó2/ì2/å2/Þ2/×2/Ð2/É2/Â2/»2/´2/­2/¦2/Ÿ2/˜2/‘2/Š2/ƒ2/|2/u2/n2/g2/`2/Y2/R2/K2/D2/=2/62//2/(2/!2/2/2/ 2/2/þ1/÷1/ð1/é1/â1/Û1/Ô1/Í1/Æ1/¿1/¸1/±1/ª1/£1/œ1/•1/Ž1/‡1/€1/y1/r1/k1/d1/]1/V1/O1/H1/A1/:1/31/,1/%1/1/1/1/ 1/1/û0/ô0/í0/æ0/ß0/Ø0/Ñ0/Ê0/Ã0/¼0/µ0/®0/§0/ 0/™0/’0/‹0/„0/}0/v0/o0/h0/a0/Z0/S0/L0/E0/>0/70/00/)0/"0/0/0/ 0/0/ÿ//ø//ñ//ê//ã//Ü//Õ//Î//Ç//À//¹//²//«//¤////–////ˆ////z//s//l//e//^//W//P//I//B//;//4//-//&//////// ////ü./õ./î./ç./à./Ù./Ò./Ë./Ä./½./¶./¯./¨./¡./š./“./Œ./…./~./w./p./i./b./[./T./M./F./?./8./1./*./#././././././ù-/ò-/ë-/ä-/Ý-/Ö-/Ï-/È-/Á-/º-/³-/¬-/¥-/ž-/—-/-/‰-/‚-/{-/t-/m-/f-/_-/X-/Q-/J-/C-/<-/5-/.-/'-/ -/-/-/ -/-/ý,/ö,/ï,/è,/á,/Ú,/Ó,/Ì,/Å,/¾,/·,/°,/©,/¢,/›,/”,/,/†,/,/x,/q,/j,/c,/\,/U,/N,/G,/@,/9,/2,/+,/$,/,/,/,/,/,/ú+/ó+/ì+/å+/Þ+/×+/Ð+/É+/Â+/»+/´+/­+/¦+/Ÿ+/˜+/‘+/Š+/ƒ+/|+/u+/n+/g+/`+/Y+/R+/K+/D+/=+/6+//+/(+/!+/+/+/ +/+/þ*/÷*/ð*/é*/â*/Û*/Ô*/Í*/Æ*/¿*/¸*/±*/ª*/£*/œ*/•*/Ž*/‡*/€*/y*/r*/k*/d*/]*/V*/O*/H*/A*/:*/3*/,*/%*/*/*/*/ */*/û)/ô)/í)/æ)/ß)/Ø)/Ñ)/Ê)/Ã)/¼)/µ)/®)/§)/ )/™)/’)/‹)/„)/})/v)/o)/h)/a)/Z)/S)/L)/E)/>)/7)/0)/))/")/)/)/ )/)/ÿ(/ø(/ñ(/ê(/ã(/Ü(/Õ(/Î(/Ç(/À(/¹(/²(/«(/¤(/(/–(/(/ˆ(/(/z(/s(/l(/e(/^(/W(/P(/I(/B(/;(/4(/-(/&(/(/(/(/ (/(/ü'/õ'/î'/ç'/à'/Ù'/Ò'/Ë'/Ä'/½'/¶'/¯'/¨'/¡'/š'/“'/Œ'/…'/~'/w'/p'/i'/b'/['/T'/M'/F'/?'/8'/1'/*'/#'/'/'/'/'/'/ù&/ò&/ë&/ä&/Ý&/Ö&/Ï&/È&/Á&/º&/³&/¬&/¥&/ž&/—&/&/‰&/‚&/{&/t&/m&/f&/_&/X&/Q&/J&/C&/<&/5&/.&/'&/ &/&/&/ &/&/ý%/ö%/ï%/è%/á%/Ú%/Ó%/Ì%/Å%/¾%/·%/°%/©%/¢%/›%/”%/%/†%/%/x%/q%/j%/c%/\%/U%/N%/G%/@%/9%/2%/+%/$%/%/%/%/%/%/ú$/ó$/ì$/å$/Þ$/×$/Ð$/É$/Â$/»$/´$/­$/¦$/Ÿ$/˜$/‘$/Š$/ƒ$/|$/u$/n$/g$/`$/Y$/R$/K$/D$/=$/6$//$/($/!$/$/$/ $/$/þ#/÷#/ð#/é#/â#/Û#/Ô#/Í#/Æ#/¿#/¸#/±#/ª#/£#/œ#/•#/Ž#/‡#/€#/y#/r#/k#/d#/]#/V#/O#/H#/A#/:#/3#/,#/%#/#/#/#/ #/#/û"/ô"/í"/æ"/ß"/Ø"/Ñ"/Ê"/Ã"/¼"/µ"/®"/§"/ "/™"/’"/‹"/„"/}"/v"/o"/h"/a"/Z"/S"/L"/E"/>"/7"/0"/)"/""/"/"/ "/"/ÿ!/ø!/ñ!/ê!/ã!/Ü!/Õ!/Î!/Ç!/À!/¹!/²!/«!/¤!/!/–!/!/ˆ!/!/z!/s!/l!/e!/^!/W!/P!/I!/B!/;!/4!/-!/&!/!/!/!/ !/!/ü /õ /î /ç /à /Ù /Ò /Ë /Ä /½ /¶ /¯ /¨ /¡ /š /“ /Œ /… /~ /w /p /i /b /[ /T /M /F /? /8 /1 /* /# / / / / / /ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/</5/./'/ /// //ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/</5/./'/ /// //ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/</5/./'/ /// //ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û /ô /í /æ /ß /Ø /Ñ /Ê /à /¼ /µ /® /§ /  /™ /’ /‹ /„ /} /v /o /h /a /Z /S /L /E /> /7 /0 /) /" / / / / /ÿ /ø /ñ /ê /ã /Ü /Õ /Î /Ç /À /¹ /² /« /¤ / /– / /ˆ / /z /s /l /e /^ /W /P /I /B /; /4 /- /& / / / / / /ü /õ /î /ç /à /Ù /Ò /Ë /Ä /½ /¶ /¯ /¨ /¡ /š /“ /Œ /… /~ /w /p /i /b /[ /T /M /F /? /8 /1 /* /# / / / / / /ù /ò /ë /ä /Ý /Ö /Ï /È /Á /º /³ /¬ /¥ /ž /— / /‰ /‚ /{ /t /m /f /_ /X /Q /J /C /< /5 /. /' / / / / / /ý /ö /ï /è /á /Ú /Ó /Ì /Å /¾ /· /° /© /¢ /› /” / /† / /x /q /j /c /\ /U /N /G /@ /9 /2 /+ /$ / / / / / /ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/</5/./'/ /// //ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //ûÿ.ôÿ.íÿ.æÿ.ßÿ.Øÿ.Ñÿ.Êÿ.Ãÿ.¼ÿ.µÿ.®ÿ.§ÿ. ÿ.™ÿ.’ÿ.‹ÿ.„ÿ.}ÿ.vÿ.oÿ.hÿ.aÿ.Zÿ.Sÿ.Lÿ.Eÿ.>ÿ.7ÿ.0ÿ.)ÿ."ÿ.ÿ.ÿ. ÿ.ÿ.ÿþ.øþ.ñþ.êþ.ãþ.Üþ.Õþ.Îþ.Çþ.Àþ.¹þ.²þ.«þ.¤þ.þ.–þ.þ.ˆþ.þ.zþ.sþ.lþ.eþ.^þ.Wþ.Pþ.Iþ.Bþ.;þ.4þ.-þ.&þ.þ.þ.þ. þ.þ.üý.õý.îý.çý.àý.Ùý.Òý.Ëý.Äý.½ý.¶ý.¯ý.¨ý.¡ý.šý.“ý.Œý.…ý.~ý.wý.pý.iý.bý.[ý.Tý.Mý.Fý.?ý.8ý.1ý.*ý.#ý.ý.ý.ý.ý.ý.ùü.òü.ëü.äü.Ýü.Öü.Ïü.Èü.Áü.ºü.³ü.¬ü.¥ü.žü.—ü.ü.‰ü.‚ü.{ü.tü.mü.fü._ü.Xü.Qü.Jü.Cü.<ü.5ü..ü.'ü. ü.ü.ü. ü.ü.ýû.öû.ïû.èû.áû.Úû.Óû.Ìû.Åû.¾û.·û.°û.©û.¢û.›û.”û.û.†û.û.xû.qû.jû.cû.\û.Uû.Nû.Gû.@û.9û.2û.+û.$û.û.û.û.û.û.úú.óú.ìú.åú.Þú.×ú.Ðú.Éú.Âú.»ú.´ú.­ú.¦ú.Ÿú.˜ú.‘ú.Šú.ƒú.|ú.uú.nú.gú.`ú.Yú.Rú.Kú.Dú.=ú.6ú./ú.(ú.!ú.ú.ú. ú.ú.þù.÷ù.ðù.éù.âù.Ûù.Ôù.Íù.Æù.¿ù.¸ù.±ù.ªù.£ù.œù.•ù.Žù.‡ù.€ù.yù.rù.kù.dù.]ù.Vù.Où.Hù.Aù.:ù.3ù.,ù.%ù.ù.ù.ù. ù.ù.ûø.ôø.íø.æø.ßø.Øø.Ñø.Êø.Ãø.¼ø.µø.®ø.§ø. ø.™ø.’ø.‹ø.„ø.}ø.vø.oø.hø.aø.Zø.Sø.Lø.Eø.>ø.7ø.0ø.)ø."ø.ø.ø. ø.ø.ÿ÷.ø÷.ñ÷.ê÷.ã÷.Ü÷.Õ÷.Î÷.Ç÷.À÷.¹÷.²÷.«÷.¤÷.÷.–÷.÷.ˆ÷.÷.z÷.s÷.l÷.e÷.^÷.W÷.P÷.I÷.B÷.;÷.4÷.-÷.&÷.÷.÷.÷. ÷.÷.üö.õö.îö.çö.àö.Ùö.Òö.Ëö.Äö.½ö.¶ö.¯ö.¨ö.¡ö.šö.“ö.Œö.…ö.~ö.wö.pö.iö.bö.[ö.Tö.Mö.Fö.?ö.8ö.1ö.*ö.#ö.ö.ö.ö.ö.ö.ùõ.òõ.ëõ.äõ.Ýõ.Öõ.Ïõ.Èõ.Áõ.ºõ.³õ.¬õ.¥õ.žõ.—õ.õ.‰õ.‚õ.{õ.tõ.mõ.fõ._õ.Xõ.Qõ.Jõ.Cõ.<õ.5õ..õ.'õ. õ.õ.õ. õ.õ.ýô.öô.ïô.èô.áô.Úô.Óô.Ìô.Åô.¾ô.·ô.°ô.©ô.¢ô.›ô.”ô.ô.†ô.ô.xô.qô.jô.cô.\ô.Uô.Nô.Gô.@ô.9ô.2ô.+ô.$ô.ô.ô.ô.ô.ô.úó.óó.ìó.åó.Þó.×ó.Ðó.Éó.Âó.»ó.´ó.­ó.¦ó.Ÿó.˜ó.‘ó.Šó.ƒó.|ó.uó.nó.gó.`ó.Yó.Ró.Kó.Dó.=ó.6ó./ó.(ó.!ó.ó.ó. ó.ó.þò.÷ò.ðò.éò.âò.Ûò.Ôò.Íò.Æò.¿ò.¸ò.±ò.ªò.£ò.œò.•ò.Žò.‡ò.€ò.yò.rò.kò.dò.]ò.Vò.Oò.Hò.Aò.:ò.3ò.,ò.%ò.ò.ò.ò. ò.ò.ûñ.ôñ.íñ.æñ.ßñ.Øñ.Ññ.Êñ.Ãñ.¼ñ.µñ.®ñ.§ñ. ñ.™ñ.’ñ.‹ñ.„ñ.}ñ.vñ.oñ.hñ.añ.Zñ.Sñ.Lñ.Eñ.>ñ.7ñ.0ñ.)ñ."ñ.ñ.ñ. ñ.ñ.ÿð.øð.ñð.êð.ãð.Üð.Õð.Îð.Çð.Àð.¹ð.²ð.«ð.¤ð.ð.–ð.ð.ˆð.ð.zð.sð.lð.eð.^ð.Wð.Pð.Ið.Bð.;ð.4ð.-ð.&ð.ð.ð.ð. ð.ð.üï.õï.îï.çï.àï.Ùï.Òï.Ëï.Äï.½ï.¶ï.¯ï.¨ï.¡ï.šï.“ï.Œï.…ï.~ï.wï.pï.iï.bï.[ï.Tï.Mï.Fï.?ï.8ï.1ï.*ï.#ï.ï.ï.ï.ï.ï.ùî.òî.ëî.äî.Ýî.Öî.Ïî.Èî.Áî.ºî.³î.¬î.¥î.žî.—î.î.‰î.‚î.{î.tî.mî.fî._î.Xî.Qî.Jî.Cî.<î.5î..î.'î. î.î.î. î.î.ýí.öí.ïí.èí.áí.Úí.Óí.Ìí.Åí.¾í.·í.°í.©í.¢í.›í.”í.í.†í.í.xí.qí.jí.cí.\í.Uí.Ní.Gí.@í.9í.2í.+í.$í.í.í.í.í.í.úì.óì.ìì.åì.Þì.×ì.Ðì.Éì.Âì.»ì.´ì.­ì.¦ì.Ÿì.˜ì.‘ì.Šì.ƒì.|ì.uì.nì.gì.`ì.Yì.Rì.Kì.Dì.=ì.6ì./ì.(ì.!ì.ì.ì. ì.ì.þë.÷ë.ðë.éë.âë.Ûë.Ôë.Íë.Æë.¿ë.¸ë.±ë.ªë.£ë.œë.•ë.Žë.‡ë.€ë.yë.rë.kë.dë.]ë.Vë.Oë.Hë.Aë.:ë.3ë.,ë.%ë.ë.ë.ë. ë.ë.ûê.ôê.íê.æê.ßê.Øê.Ñê.Êê.Ãê.¼ê.µê.®ê.§ê. ê.™ê.’ê.‹ê.„ê.}ê.vê.oê.hê.aê.Zê.Sê.Lê.Eê.>ê.7ê.0ê.)ê."ê.ê.ê. ê.ê.ÿé.øé.ñé.êé.ãé.Üé.Õé.Îé.Çé.Àé.¹é.²é.«é.¤é.é.–é.é.ˆé.é.zé.sé.lé.eé.^é.Wé.Pé.Ié.Bé.;é.4é.-é.&é.é.é.é. é.é.üè.õè.îè.çè.àè.Ùè.Òè.Ëè.Äè.½è.¶è.¯è.¨è.¡è.šè.“è.Œè.…è.~è.wè.pè.iè.bè.[è.Tè.Mè.Fè.?è.8è.1è.*è.#è.è.è.è.è.è.ùç.òç.ëç.äç.Ýç.Öç.Ïç.Èç.Áç.ºç.³ç.¬ç.¥ç.žç.—ç.ç.‰ç.‚ç.{ç.tç.mç.fç._ç.Xç.Qç.Jç.Cç.<ç.5ç..ç.'ç. ç.ç.ç. ç.ç.ýæ.öæ.ïæ.èæ.áæ.Úæ.Óæ.Ìæ.Åæ.¾æ.·æ.°æ.©æ.¢æ.›æ.”æ.æ.†æ.æ.xæ.qæ.jæ.cæ.\æ.Uæ.Næ.Gæ.@æ.9æ.2æ.+æ.$æ.æ.æ.æ.æ.æ.úå.óå.ìå.åå.Þå.×å.Ðå.Éå.Âå.»å.´å.­å.¦å.Ÿå.˜å.‘å.Šå.ƒå.|å.uå.nå.gå.`å.Yå.Rå.Kå.Då.=å.6å./å.(å.!å.å.å. å.å.þä.÷ä.ðä.éä.âä.Ûä.Ôä.Íä.Æä.¿ä.¸ä.±ä.ªä.£ä.œä.•ä.Žä.‡ä.€ä.yä.rä.kä.dä.]ä.Vä.Oä.Hä.Aä.:ä.3ä.,ä.%ä.ä.ä.ä. ä.ä.ûã.ôã.íã.æã.ßã.Øã.Ñã.Êã.Ãã.¼ã.µã.®ã.§ã. ã.™ã.’ã.‹ã.„ã.}ã.vã.oã.hã.aã.Zã.Sã.Lã.Eã.>ã.7ã.0ã.)ã."ã.ã.ã. ã.ã.ÿâ.øâ.ñâ.êâ.ãâ.Üâ.Õâ.Îâ.Çâ.Àâ.¹â.²â.«â.¤â.â.–â.â.ˆâ.â.zâ.sâ.lâ.eâ.^â.Wâ.Pâ.Iâ.Bâ.;â.4â.-â.&â.â.â.â. â.â.üá.õá.îá.çá.àá.Ùá.Òá.Ëá.Äá.½á.¶á.¯á.¨á.¡á.šá.“á.Œá.…á.~á.wá.pá.iá.bá.[á.Tá.Má.Fá.?á.8á.1á.*á.#á.á.á.á.á.á.ùà.òà.ëà.äà.Ýà.Öà.Ïà.Èà.Áà.ºà.³à.¬à.¥à.žà.—à.à.‰à.‚à.{à.tà.mà.fà._à.Xà.Qà.Jà.Cà.<à.5à..à.'à. à.à.à. à.à.ýß.öß.ïß.èß.áß.Úß.Óß.Ìß.Åß.¾ß.·ß.°ß.©ß.¢ß.›ß.”ß.ß.†ß.ß.xß.qß.jß.cß.\ß.Uß.Nß.Gß.@ß.9ß.2ß.+ß.$ß.ß.ß.ß.ß.ß.úÞ.óÞ.ìÞ.åÞ.ÞÞ.×Þ.ÐÞ.ÉÞ.ÂÞ.»Þ.´Þ.­Þ.¦Þ.ŸÞ.˜Þ.‘Þ.ŠÞ.ƒÞ.|Þ.uÞ.nÞ.gÞ.`Þ.YÞ.RÞ.KÞ.DÞ.=Þ.6Þ./Þ.(Þ.!Þ.Þ.Þ. Þ.Þ.þÝ.÷Ý.ðÝ.éÝ.âÝ.ÛÝ.ÔÝ.ÍÝ.ÆÝ.¿Ý.¸Ý.±Ý.ªÝ.£Ý.œÝ.•Ý.ŽÝ.‡Ý.€Ý.yÝ.rÝ.kÝ.dÝ.]Ý.VÝ.OÝ.HÝ.AÝ.:Ý.3Ý.,Ý.%Ý.Ý.Ý.Ý. Ý.Ý.ûÜ.ôÜ.íÜ.æÜ.ßÜ.ØÜ.ÑÜ.ÊÜ.ÃÜ.¼Ü.µÜ.®Ü.§Ü. Ü.™Ü.’Ü.‹Ü.„Ü.}Ü.vÜ.oÜ.hÜ.aÜ.ZÜ.SÜ.LÜ.EÜ.>Ü.7Ü.0Ü.)Ü."Ü.Ü.Ü. Ü.Ü.ÿÛ.øÛ.ñÛ.êÛ.ãÛ.ÜÛ.ÕÛ.ÎÛ.ÇÛ.ÀÛ.¹Û.²Û.«Û.¤Û.Û.–Û.Û.ˆÛ.Û.zÛ.sÛ.lÛ.eÛ.^Û.WÛ.PÛ.IÛ.BÛ.;Û.4Û.-Û.&Û.Û.Û.Û. Û.Û.üÚ.õÚ.îÚ.çÚ.àÚ.ÙÚ.ÒÚ.ËÚ.ÄÚ.½Ú.¶Ú.¯Ú.¨Ú.¡Ú.šÚ.“Ú.ŒÚ.…Ú.~Ú.wÚ.pÚ.iÚ.bÚ.[Ú.TÚ.MÚ.FÚ.?Ú.8Ú.1Ú.*Ú.#Ú.Ú.Ú.Ú.Ú.Ú.ùÙ.òÙ.ëÙ.äÙ.ÝÙ.ÖÙ.ÏÙ.ÈÙ.ÁÙ.ºÙ.³Ù.¬Ù.¥Ù.žÙ.—Ù.Ù.‰Ù.‚Ù.{Ù.tÙ.mÙ.fÙ._Ù.XÙ.QÙ.JÙ.CÙ.<Ù.5Ù..Ù.'Ù. Ù.Ù.Ù. Ù.Ù.ýØ.öØ.ïØ.èØ.áØ.ÚØ.ÓØ.ÌØ.ÅØ.¾Ø.·Ø.°Ø.©Ø.¢Ø.›Ø.”Ø.Ø.†Ø.Ø.xØ.qØ.jØ.cØ.\Ø.UØ.NØ.GØ.@Ø.9Ø.2Ø.+Ø.$Ø.Ø.Ø.Ø.Ø.Ø.ú×.ó×.ì×.å×.Þ×.××.Ð×.É×.Â×.»×.´×.­×.¦×.Ÿ×.˜×.‘×.Š×.ƒ×.|×.u×.n×.g×.`×.Y×.R×.K×.D×.=×.6×./×.(×.!×.×.×. ×.×.þÖ.÷Ö.ðÖ.éÖ.âÖ.ÛÖ.ÔÖ.ÍÖ.ÆÖ.¿Ö.¸Ö.±Ö.ªÖ.£Ö.œÖ.•Ö.ŽÖ.‡Ö.€Ö.yÖ.rÖ.kÖ.dÖ.]Ö.VÖ.OÖ.HÖ.AÖ.:Ö.3Ö.,Ö.%Ö.Ö.Ö.Ö. Ö.Ö.ûÕ.ôÕ.íÕ.æÕ.ßÕ.ØÕ.ÑÕ.ÊÕ.ÃÕ.¼Õ.µÕ.®Õ.§Õ. Õ.™Õ.’Õ.‹Õ.„Õ.}Õ.vÕ.oÕ.hÕ.aÕ.ZÕ.SÕ.LÕ.EÕ.>Õ.7Õ.0Õ.)Õ."Õ.Õ.Õ. Õ.Õ.ÿÔ.øÔ.ñÔ.êÔ.ãÔ.ÜÔ.ÕÔ.ÎÔ.ÇÔ.ÀÔ.¹Ô.²Ô.«Ô.¤Ô.Ô.–Ô.Ô.ˆÔ.Ô.zÔ.sÔ.lÔ.eÔ.^Ô.WÔ.PÔ.IÔ.BÔ.;Ô.4Ô.-Ô.&Ô.Ô.Ô.Ô. Ô.Ô.üÓ.õÓ.îÓ.çÓ.àÓ.ÙÓ.ÒÓ.ËÓ.ÄÓ.½Ó.¶Ó.¯Ó.¨Ó.¡Ó.šÓ.“Ó.ŒÓ.…Ó.~Ó.wÓ.pÓ.iÓ.bÓ.[Ó.TÓ.MÓ.FÓ.?Ó.8Ó.1Ó.*Ó.#Ó.Ó.Ó.Ó.Ó.Ó.ùÒ.òÒ.ëÒ.äÒ.ÝÒ.ÖÒ.ÏÒ.ÈÒ.ÁÒ.ºÒ.³Ò.¬Ò.¥Ò.žÒ.—Ò.Ò.‰Ò.‚Ò.{Ò.tÒ.mÒ.fÒ._Ò.XÒ.QÒ.JÒ.CÒ.<Ò.5Ò..Ò.'Ò. Ò.Ò.Ò. Ò.Ò.ýÑ.öÑ.ïÑ.èÑ.áÑ.ÚÑ.ÓÑ.ÌÑ.ÅÑ.¾Ñ.·Ñ.°Ñ.©Ñ.¢Ñ.›Ñ.”Ñ.Ñ.†Ñ.Ñ.xÑ.qÑ.jÑ.cÑ.\Ñ.UÑ.NÑ.GÑ.@Ñ.9Ñ.2Ñ.+Ñ.$Ñ.Ñ.Ñ.Ñ.Ñ.Ñ.úÐ.óÐ.ìÐ.åÐ.ÞÐ.×Ð.ÐÐ.ÉÐ.ÂÐ.»Ð.´Ð.­Ð.¦Ð.ŸÐ.˜Ð.‘Ð.ŠÐ.ƒÐ.|Ð.uÐ.nÐ.gÐ.`Ð.YÐ.RÐ.KÐ.DÐ.=Ð.6Ð./Ð.(Ð.!Ð.Ð.Ð. Ð.Ð.þÏ.÷Ï.ðÏ.éÏ.âÏ.ÛÏ.ÔÏ.ÍÏ.ÆÏ.¿Ï.¸Ï.±Ï.ªÏ.£Ï.œÏ.•Ï.ŽÏ.‡Ï.€Ï.yÏ.rÏ.kÏ.dÏ.]Ï.VÏ.OÏ.HÏ.AÏ.:Ï.3Ï.,Ï.%Ï.Ï.Ï.Ï. Ï.Ï.ûÎ.ôÎ.íÎ.æÎ.ßÎ.ØÎ.ÑÎ.ÊÎ.ÃÎ.¼Î.µÎ.®Î.§Î. Î.™Î.’Î.‹Î.„Î.}Î.vÎ.oÎ.hÎ.aÎ.ZÎ.SÎ.LÎ.EÎ.>Î.7Î.0Î.)Î."Î.Î.Î. Î.Î.ÿÍ.øÍ.ñÍ.êÍ.ãÍ.ÜÍ.ÕÍ.ÎÍ.ÇÍ.ÀÍ.¹Í.²Í.«Í.¤Í.Í.–Í.Í.ˆÍ.Í.zÍ.sÍ.lÍ.eÍ.^Í.WÍ.PÍ.IÍ.BÍ.;Í.4Í.-Í.&Í.Í.Í.Í. Í.Í.üÌ.õÌ.îÌ.çÌ.àÌ.ÙÌ.ÒÌ.ËÌ.ÄÌ.½Ì.¶Ì.¯Ì.¨Ì.¡Ì.šÌ.“Ì.ŒÌ.…Ì.~Ì.wÌ.pÌ.iÌ.bÌ.[Ì.TÌ.MÌ.FÌ.?Ì.8Ì.1Ì.*Ì.#Ì.Ì.Ì.Ì.Ì.Ì.ùË.òË.ëË.äË.ÝË.ÖË.ÏË.ÈË.ÁË.ºË.³Ë.¬Ë.¥Ë.žË.—Ë.Ë.‰Ë.‚Ë.{Ë.tË.mË.fË._Ë.XË.QË.JË.CË.<Ë.5Ë..Ë.'Ë. Ë.Ë.Ë. Ë.Ë.ýÊ.öÊ.ïÊ.èÊ.áÊ.ÚÊ.ÓÊ.ÌÊ.ÅÊ.¾Ê.·Ê.°Ê.©Ê.¢Ê.›Ê.”Ê.Ê.†Ê.Ê.xÊ.qÊ.jÊ.cÊ.\Ê.UÊ.NÊ.GÊ.@Ê.9Ê.2Ê.+Ê.$Ê.Ê.Ê.Ê.Ê.Ê.úÉ.óÉ.ìÉ.åÉ.ÞÉ.×É.ÐÉ.ÉÉ.ÂÉ.»É.´É.­É.¦É.ŸÉ.˜É.‘É.ŠÉ.ƒÉ.|É.uÉ.nÉ.gÉ.`É.YÉ.RÉ.KÉ.DÉ.=É.6É./É.(É.!É.É.É. É.É.þÈ.÷È.ðÈ.éÈ.âÈ.ÛÈ.ÔÈ.ÍÈ.ÆÈ.¿È.¸È.±È.ªÈ.£È.œÈ.•È.ŽÈ.‡È.€È.yÈ.rÈ.kÈ.dÈ.]È.VÈ.OÈ.HÈ.AÈ.:È.3È.,È.%È.È.È.È. È.È.ûÇ.ôÇ.íÇ.æÇ.ßÇ.ØÇ.ÑÇ.ÊÇ.ÃÇ.¼Ç.µÇ.®Ç.§Ç. Ç.™Ç.’Ç.‹Ç.„Ç.}Ç.vÇ.oÇ.hÇ.aÇ.ZÇ.SÇ.LÇ.EÇ.>Ç.7Ç.0Ç.)Ç."Ç.Ç.Ç. Ç.Ç.ÿÆ.øÆ.ñÆ.êÆ.ãÆ.ÜÆ.ÕÆ.ÎÆ.ÇÆ.ÀÆ.¹Æ.²Æ.«Æ.¤Æ.Æ.–Æ.Æ.ˆÆ.Æ.zÆ.sÆ.lÆ.eÆ.^Æ.WÆ.PÆ.IÆ.BÆ.;Æ.4Æ.-Æ.&Æ.Æ.Æ.Æ. Æ.Æ.üÅ.õÅ.îÅ.çÅ.àÅ.ÙÅ.ÒÅ.ËÅ.ÄÅ.½Å.¶Å.¯Å.¨Å.¡Å.šÅ.“Å.ŒÅ.…Å.~Å.wÅ.pÅ.iÅ.bÅ.[Å.TÅ.MÅ.FÅ.?Å.8Å.1Å.*Å.#Å.Å.Å.Å.Å.Å.ùÄ.òÄ.ëÄ.äÄ.ÝÄ.ÖÄ.ÏÄ.ÈÄ.ÁÄ.ºÄ.³Ä.¬Ä.¥Ä.žÄ.—Ä.Ä.‰Ä.‚Ä.{Ä.tÄ.mÄ.fÄ._Ä.XÄ.QÄ.JÄ.CÄ.<Ä.5Ä..Ä.'Ä. Ä.Ä.Ä. Ä.Ä.ýÃ.öÃ.ïÃ.èÃ.áÃ.ÚÃ.ÓÃ.ÌÃ.ÅÃ.¾Ã.·Ã.°Ã.©Ã.¢Ã.›Ã.”Ã.Ã.†Ã.Ã.xÃ.qÃ.jÃ.cÃ.\Ã.UÃ.NÃ.GÃ.@Ã.9Ã.2Ã.+Ã.$Ã.Ã.Ã.Ã.Ã.Ã.úÂ.óÂ.ìÂ.åÂ.ÞÂ.×Â.ÐÂ.ÉÂ.ÂÂ.»Â.´Â.­Â.¦Â.ŸÂ.˜Â.‘Â.ŠÂ.ƒÂ.|Â.uÂ.nÂ.gÂ.`Â.YÂ.RÂ.KÂ.DÂ.=Â.6Â./Â.(Â.!Â.Â.Â. Â.Â.þÁ.÷Á.ðÁ.éÁ.âÁ.ÛÁ.ÔÁ.ÍÁ.ÆÁ.¿Á.¸Á.±Á.ªÁ.£Á.œÁ.•Á.ŽÁ.‡Á.€Á.yÁ.rÁ.kÁ.dÁ.]Á.VÁ.OÁ.HÁ.AÁ.:Á.3Á.,Á.%Á.Á.Á.Á. Á.Á.ûÀ.ôÀ.íÀ.æÀ.ßÀ.ØÀ.ÑÀ.ÊÀ.ÃÀ.¼À.µÀ.®À.§À. À.™À.’À.‹À.„À.}À.vÀ.oÀ.hÀ.aÀ.ZÀ.SÀ.LÀ.EÀ.>À.7À.0À.)À."À.À.À. À.À.ÿ¿.ø¿.ñ¿.ê¿.ã¿.Ü¿.Õ¿.ο.Ç¿.À¿.¹¿.²¿.«¿.¤¿.¿.–¿.¿.ˆ¿.¿.z¿.s¿.l¿.e¿.^¿.W¿.P¿.I¿.B¿.;¿.4¿.-¿.&¿.¿.¿.¿. ¿.¿.ü¾.õ¾.î¾.ç¾.à¾.Ù¾.Ò¾.˾.ľ.½¾.¶¾.¯¾.¨¾.¡¾.š¾.“¾.Œ¾.…¾.~¾.w¾.p¾.i¾.b¾.[¾.T¾.M¾.F¾.?¾.8¾.1¾.*¾.#¾.¾.¾.¾.¾.¾.ù½.ò½.ë½.ä½.ݽ.Ö½.Ͻ.Ƚ.Á½.º½.³½.¬½.¥½.ž½.—½.½.‰½.‚½.{½.t½.m½.f½._½.X½.Q½.J½.C½.<½.5½..½.'½. ½.½.½. ½.½.ý¼.ö¼.ï¼.è¼.á¼.Ú¼.Ó¼.̼.ż.¾¼.·¼.°¼.©¼.¢¼.›¼.”¼.¼.†¼.¼.x¼.q¼.j¼.c¼.\¼.U¼.N¼.G¼.@¼.9¼.2¼.+¼.$¼.¼.¼.¼.¼.¼.ú».ó».ì».å».Þ».×».л.É».».»».´».­».¦».Ÿ».˜».‘».Š».ƒ».|».u».n».g».`».Y».R».K».D».=».6»./».(».!».».». ».».þº.÷º.ðº.éº.âº.Ûº.Ôº.ͺ.ƺ.¿º.¸º.±º.ªº.£º.œº.•º.Žº.‡º.€º.yº.rº.kº.dº.]º.Vº.Oº.Hº.Aº.:º.3º.,º.%º.º.º.º. º.º.û¹.ô¹.í¹.æ¹.ß¹.ع.ѹ.ʹ.ù.¼¹.µ¹.®¹.§¹. ¹.™¹.’¹.‹¹.„¹.}¹.v¹.o¹.h¹.a¹.Z¹.S¹.L¹.E¹.>¹.7¹.0¹.)¹."¹.¹.¹. ¹.¹.ÿ¸.ø¸.ñ¸.ê¸.ã¸.ܸ.Õ¸.θ.Ǹ.À¸.¹¸.²¸.«¸.¤¸.¸.–¸.¸.ˆ¸.¸.z¸.s¸.l¸.e¸.^¸.W¸.P¸.I¸.B¸.;¸.4¸.-¸.&¸.¸.¸.¸. ¸.¸.ü·.õ·.î·.ç·.à·.Ù·.Ò·.Ë·.Ä·.½·.¶·.¯·.¨·.¡·.š·.“·.Œ·.…·.~·.w·.p·.i·.b·.[·.T·.M·.F·.?·.8·.1·.*·.#·.·.·.·.·.·.ù¶.ò¶.ë¶.ä¶.ݶ.Ö¶.϶.ȶ.Á¶.º¶.³¶.¬¶.¥¶.ž¶.—¶.¶.‰¶.‚¶.{¶.t¶.m¶.f¶._¶.X¶.Q¶.J¶.C¶.<¶.5¶..¶.'¶. ¶.¶.¶. ¶.¶.ýµ.öµ.ïµ.èµ.áµ.Úµ.Óµ.̵.ŵ.¾µ.·µ.°µ.©µ.¢µ.›µ.”µ.µ.†µ.µ.xµ.qµ.jµ.cµ.\µ.Uµ.Nµ.Gµ.@µ.9µ.2µ.+µ.$µ.µ.µ.µ.µ.µ.ú´.ó´.ì´.å´.Þ´.×´.д.É´.´.»´.´´.­´.¦´.Ÿ´.˜´.‘´.Š´.ƒ´.|´.u´.n´.g´.`´.Y´.R´.K´.D´.=´.6´./´.(´.!´.´.´. ´.´.þ³.÷³.ð³.é³.â³.Û³.Ô³.ͳ.Ƴ.¿³.¸³.±³.ª³.£³.œ³.•³.޳.‡³.€³.y³.r³.k³.d³.]³.V³.O³.H³.A³.:³.3³.,³.%³.³.³.³. ³.³.û².ô².í².æ².ß².ز.Ѳ.ʲ.ò.¼².µ².®².§². ².™².’².‹².„².}².v².o².h².a².Z².S².L².E².>².7².0².)²."².².². ².².ÿ±.ø±.ñ±.ê±.ã±.ܱ.Õ±.α.DZ.À±.¹±.²±.«±.¤±.±.–±.±.ˆ±.±.z±.s±.l±.e±.^±.W±.P±.I±.B±.;±.4±.-±.&±.±.±.±. ±.±.ü°.õ°.î°.ç°.à°.Ù°.Ò°.˰.İ.½°.¶°.¯°.¨°.¡°.š°.“°.Œ°.…°.~°.w°.p°.i°.b°.[°.T°.M°.F°.?°.8°.1°.*°.#°.°.°.°.°.°.ù¯.ò¯.ë¯.ä¯.ݯ.Ö¯.ϯ.ȯ.Á¯.º¯.³¯.¬¯.¥¯.ž¯.—¯.¯.‰¯.‚¯.{¯.t¯.m¯.f¯._¯.X¯.Q¯.J¯.C¯.<¯.5¯..¯.'¯. ¯.¯.¯. ¯.¯.ý®.ö®.ï®.è®.á®.Ú®.Ó®.Ì®.Å®.¾®.·®.°®.©®.¢®.›®.”®.®.†®.®.x®.q®.j®.c®.\®.U®.N®.G®.@®.9®.2®.+®.$®.®.®.®.®.®.ú­.ó­.ì­.å­.Þ­.×­.Э.É­.­.»­.´­.­­.¦­.Ÿ­.˜­.‘­.Š­.ƒ­.|­.u­.n­.g­.`­.Y­.R­.K­.D­.=­.6­./­.(­.!­.­.­. ­.­.þ¬.÷¬.ð¬.é¬.â¬.Û¬.Ô¬.ͬ.Ƭ.¿¬.¸¬.±¬.ª¬.£¬.œ¬.•¬.ެ.‡¬.€¬.y¬.r¬.k¬.d¬.]¬.V¬.O¬.H¬.A¬.:¬.3¬.,¬.%¬.¬.¬.¬. ¬.¬.û«.ô«.í«.æ«.ß«.Ø«.Ñ«.Ê«.ë.¼«.µ«.®«.§«. «.™«.’«.‹«.„«.}«.v«.o«.h«.a«.Z«.S«.L«.E«.>«.7«.0«.)«."«.«.«. «.«.ÿª.øª.ñª.êª.ãª.ܪ.Õª.Ϊ.Ǫ.Àª.¹ª.²ª.«ª.¤ª.ª.–ª.ª.ˆª.ª.zª.sª.lª.eª.^ª.Wª.Pª.Iª.Bª.;ª.4ª.-ª.&ª.ª.ª.ª. ª.ª.ü©.õ©.î©.ç©.à©.Ù©.Ò©.Ë©.Ä©.½©.¶©.¯©.¨©.¡©.š©.“©.Œ©.…©.~©.w©.p©.i©.b©.[©.T©.M©.F©.?©.8©.1©.*©.#©.©.©.©.©.©.ù¨.ò¨.ë¨.ä¨.ݨ.Ö¨.Ϩ.Ȩ.Á¨.º¨.³¨.¬¨.¥¨.ž¨.—¨.¨.‰¨.‚¨.{¨.t¨.m¨.f¨._¨.X¨.Q¨.J¨.C¨.<¨.5¨..¨.'¨. ¨.¨.¨. ¨.¨.ý§.ö§.ï§.è§.á§.Ú§.Ó§.̧.ŧ.¾§.·§.°§.©§.¢§.›§.”§.§.†§.§.x§.q§.j§.c§.\§.U§.N§.G§.@§.9§.2§.+§.$§.§.§.§.§.§.ú¦.ó¦.ì¦.å¦.Þ¦.צ.Ц.ɦ.¦.»¦.´¦.­¦.¦¦.Ÿ¦.˜¦.‘¦.Ц.ƒ¦.|¦.u¦.n¦.g¦.`¦.Y¦.R¦.K¦.D¦.=¦.6¦./¦.(¦.!¦.¦.¦. ¦.¦.þ¥.÷¥.ð¥.é¥.â¥.Û¥.Ô¥.Í¥.Æ¥.¿¥.¸¥.±¥.ª¥.£¥.œ¥.•¥.Ž¥.‡¥.€¥.y¥.r¥.k¥.d¥.]¥.V¥.O¥.H¥.A¥.:¥.3¥.,¥.%¥.¥.¥.¥. ¥.¥.û¤.ô¤.í¤.æ¤.ߤ.ؤ.Ѥ.ʤ.ä.¼¤.µ¤.®¤.§¤. ¤.™¤.’¤.‹¤.„¤.}¤.v¤.o¤.h¤.a¤.Z¤.S¤.L¤.E¤.>¤.7¤.0¤.)¤."¤.¤.¤. ¤.¤.ÿ£.ø£.ñ£.ê£.ã£.Ü£.Õ£.Σ.Ç£.À£.¹£.²£.«£.¤£.£.–£.£.ˆ£.£.z£.s£.l£.e£.^£.W£.P£.I£.B£.;£.4£.-£.&£.£.£.£. £.£.ü¢.õ¢.î¢.ç¢.à¢.Ù¢.Ò¢.Ë¢.Ä¢.½¢.¶¢.¯¢.¨¢.¡¢.š¢.“¢.Œ¢.…¢.~¢.w¢.p¢.i¢.b¢.[¢.T¢.M¢.F¢.?¢.8¢.1¢.*¢.#¢.¢.¢.¢.¢.¢.ù¡.ò¡.ë¡.ä¡.Ý¡.Ö¡.Ï¡.È¡.Á¡.º¡.³¡.¬¡.¥¡.ž¡.—¡.¡.‰¡.‚¡.{¡.t¡.m¡.f¡._¡.X¡.Q¡.J¡.C¡.<¡.5¡..¡.'¡. ¡.¡.¡. ¡.¡.ý .ö .ï .è .á .Ú .Ó .Ì .Å .¾ .· .° .© .¢ .› .” . .† . .x .q .j .c .\ .U .N .G .@ .9 .2 .+ .$ . . . . . .úŸ.óŸ.ìŸ.åŸ.ÞŸ.ן.П.ÉŸ.Ÿ.»Ÿ.´Ÿ.­Ÿ.¦Ÿ.ŸŸ.˜Ÿ.‘Ÿ.ŠŸ.ƒŸ.|Ÿ.uŸ.nŸ.gŸ.`Ÿ.YŸ.RŸ.KŸ.DŸ.=Ÿ.6Ÿ./Ÿ.(Ÿ.!Ÿ.Ÿ.Ÿ. Ÿ.Ÿ.þž.÷ž.ðž.éž.âž.Ûž.Ôž.Íž.Æž.¿ž.¸ž.±ž.ªž.£ž.œž.•ž.Žž.‡ž.€ž.yž.rž.kž.dž.]ž.Vž.Ož.Hž.Až.:ž.3ž.,ž.%ž.ž.ž.ž. ž.ž.û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿœ.øœ.ñœ.êœ.ãœ.Üœ.Õœ.Μ.Çœ.Àœ.¹œ.²œ.«œ.¤œ.œ.–œ.œ.ˆœ.œ.zœ.sœ.lœ.eœ.^œ.Wœ.Pœ.Iœ.Bœ.;œ.4œ.-œ.&œ.œ.œ.œ. œ.œ.ü›.õ›.î›.ç›.à›.Ù›.Ò›.Ë›.Ä›.½›.¶›.¯›.¨›.¡›.š›.“›.Œ›.…›.~›.w›.p›.i›.b›.[›.T›.M›.F›.?›.8›.1›.*›.#›.›.›.›.›.›.ùš.òš.ëš.äš.Ýš.Öš.Ïš.Èš.Áš.ºš.³š.¬š.¥š.žš.—š.š.‰š.‚š.{š.tš.mš.fš._š.Xš.Qš.Jš.Cš.<š.5š..š.'š. š.š.š. š.š.ý™.ö™.ï™.è™.á™.Ú™.Ó™.Ì™.Å™.¾™.·™.°™.©™.¢™.›™.”™.™.†™.™.x™.q™.j™.c™.\™.U™.N™.G™.@™.9™.2™.+™.$™.™.™.™.™.™.ú˜.ó˜.ì˜.å˜.Þ˜.ט.И.ɘ.˜.»˜.´˜.­˜.¦˜.Ÿ˜.˜˜.‘˜.Š˜.ƒ˜.|˜.u˜.n˜.g˜.`˜.Y˜.R˜.K˜.D˜.=˜.6˜./˜.(˜.!˜.˜.˜. ˜.˜.þ—.÷—.ð—.é—.â—.Û—.Ô—.Í—.Æ—.¿—.¸—.±—.ª—.£—.œ—.•—.Ž—.‡—.€—.y—.r—.k—.d—.]—.V—.O—.H—.A—.:—.3—.,—.%—.—.—.—. —.—.û–.ô–.í–.æ–.ß–.Ø–.Ñ–.Ê–.Ö.¼–.µ–.®–.§–. –.™–.’–.‹–.„–.}–.v–.o–.h–.a–.Z–.S–.L–.E–.>–.7–.0–.)–."–.–.–. –.–.ÿ•.ø•.ñ•.ê•.ã•.Ü•.Õ•.Ε.Ç•.À•.¹•.²•.«•.¤•.•.–•.•.ˆ•.•.z•.s•.l•.e•.^•.W•.P•.I•.B•.;•.4•.-•.&•.•.•.•. •.•.ü”.õ”.î”.ç”.à”.Ù”.Ò”.Ë”.Ä”.½”.¶”.¯”.¨”.¡”.š”.“”.Œ”.…”.~”.w”.p”.i”.b”.[”.T”.M”.F”.?”.8”.1”.*”.#”.”.”.”.”.”.ù“.ò“.ë“.ä“.Ý“.Ö“.Ï“.È“.Á“.º“.³“.¬“.¥“.ž“.—“.“.‰“.‚“.{“.t“.m“.f“._“.X“.Q“.J“.C“.<“.5“..“.'“. “.“.“. “.“.ý’.ö’.ï’.è’.á’.Ú’.Ó’.Ì’.Å’.¾’.·’.°’.©’.¢’.›’.”’.’.†’.’.x’.q’.j’.c’.\’.U’.N’.G’.@’.9’.2’.+’.$’.’.’.’.’.’.ú‘.ó‘.ì‘.å‘.Þ‘.ב.Б.É‘.‘.»‘.´‘.­‘.¦‘.Ÿ‘.˜‘.‘‘.Š‘.ƒ‘.|‘.u‘.n‘.g‘.`‘.Y‘.R‘.K‘.D‘.=‘.6‘./‘.(‘.!‘.‘.‘. ‘.‘.þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿŽ.øŽ.ñŽ.êŽ.ãŽ.ÜŽ.ÕŽ.ÎŽ.ÇŽ.ÀŽ.¹Ž.²Ž.«Ž.¤Ž.Ž.–Ž.Ž.ˆŽ.Ž.zŽ.sŽ.lŽ.eŽ.^Ž.WŽ.PŽ.IŽ.BŽ.;Ž.4Ž.-Ž.&Ž.Ž.Ž.Ž. Ž.Ž.ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ùŒ.òŒ.ëŒ.äŒ.ÝŒ.ÖŒ.ÏŒ.ÈŒ.ÁŒ.ºŒ.³Œ.¬Œ.¥Œ.žŒ.—Œ.Œ.‰Œ.‚Œ.{Œ.tŒ.mŒ.fŒ._Œ.XŒ.QŒ.JŒ.CŒ.<Œ.5Œ..Œ.'Œ. Œ.Œ.Œ. Œ.Œ.ý‹.ö‹.ï‹.è‹.á‹.Ú‹.Ó‹.Ì‹.Å‹.¾‹.·‹.°‹.©‹.¢‹.›‹.”‹.‹.†‹.‹.x‹.q‹.j‹.c‹.\‹.U‹.N‹.G‹.@‹.9‹.2‹.+‹.$‹.‹.‹.‹.‹.‹.úŠ.óŠ.ìŠ.åŠ.ÞŠ.׊.Њ.ÉŠ.Š.»Š.´Š.­Š.¦Š.ŸŠ.˜Š.‘Š.ŠŠ.ƒŠ.|Š.uŠ.nŠ.gŠ.`Š.YŠ.RŠ.KŠ.DŠ.=Š.6Š./Š.(Š.!Š.Š.Š. Š.Š.þ‰.÷‰.ð‰.é‰.â‰.Û‰.Ô‰.͉.Ɖ.¿‰.¸‰.±‰.ª‰.£‰.œ‰.•‰.މ.‡‰.€‰.y‰.r‰.k‰.d‰.]‰.V‰.O‰.H‰.A‰.:‰.3‰.,‰.%‰.‰.‰.‰. ‰.‰.ûˆ.ôˆ.íˆ.æˆ.߈.؈.ш.ʈ.È.¼ˆ.µˆ.®ˆ.§ˆ. ˆ.™ˆ.’ˆ.‹ˆ.„ˆ.}ˆ.vˆ.oˆ.hˆ.aˆ.Zˆ.Sˆ.Lˆ.Eˆ.>ˆ.7ˆ.0ˆ.)ˆ."ˆ.ˆ.ˆ. ˆ.ˆ.ÿ‡.ø‡.ñ‡.ê‡.ã‡.܇.Õ‡.·.LJ.À‡.¹‡.²‡.«‡.¤‡.‡.–‡.‡.ˆ‡.‡.z‡.s‡.l‡.e‡.^‡.W‡.P‡.I‡.B‡.;‡.4‡.-‡.&‡.‡.‡.‡. ‡.‡.ü†.õ†.î†.ç†.à†.Ù†.Ò†.ˆ.Ć.½†.¶†.¯†.¨†.¡†.š†.“†.Œ†.…†.~†.w†.p†.i†.b†.[†.T†.M†.F†.?†.8†.1†.*†.#†.†.†.†.†.†.ù….ò….ë….ä….Ý….Ö….Ï….È….Á….º….³….¬….¥….ž….—….….‰….‚….{….t….m….f…._….X….Q….J….C….<….5…..….'…. ….….…. ….….ý„.ö„.ï„.è„.á„.Ú„.Ó„.Ì„.Å„.¾„.·„.°„.©„.¢„.›„.”„.„.†„.„.x„.q„.j„.c„.\„.U„.N„.G„.@„.9„.2„.+„.$„.„.„.„.„.„.úƒ.óƒ.ìƒ.åƒ.Þƒ.׃.Ѓ.Ƀ.ƒ.»ƒ.´ƒ.­ƒ.¦ƒ.Ÿƒ.˜ƒ.‘ƒ.Šƒ.ƒƒ.|ƒ.uƒ.nƒ.gƒ.`ƒ.Yƒ.Rƒ.Kƒ.Dƒ.=ƒ.6ƒ./ƒ.(ƒ.!ƒ.ƒ.ƒ. ƒ.ƒ.þ‚.÷‚.ð‚.é‚.â‚.Û‚.Ô‚.Í‚.Æ‚.¿‚.¸‚.±‚.ª‚.£‚.œ‚.•‚.Ž‚.‡‚.€‚.y‚.r‚.k‚.d‚.]‚.V‚.O‚.H‚.A‚.:‚.3‚.,‚.%‚.‚.‚.‚. ‚.‚.û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ€.ø€.ñ€.ê€.ã€.Ü€.Õ€.΀.Ç€.À€.¹€.²€.«€.¤€.€.–€.€.ˆ€.€.z€.s€.l€.e€.^€.W€.P€.I€.B€.;€.4€.-€.&€.€.€.€. €.€.ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù~.ò~.ë~.ä~.Ý~.Ö~.Ï~.È~.Á~.º~.³~.¬~.¥~.ž~.—~.~.‰~.‚~.{~.t~.m~.f~._~.X~.Q~.J~.C~.<~.5~..~.'~. ~.~.~. ~.~.ý}.ö}.ï}.è}.á}.Ú}.Ó}.Ì}.Å}.¾}.·}.°}.©}.¢}.›}.”}.}.†}.}.x}.q}.j}.c}.\}.U}.N}.G}.@}.9}.2}.+}.$}.}.}.}.}.}.ú|.ó|.ì|.å|.Þ|.×|.Ð|.É|.Â|.»|.´|.­|.¦|.Ÿ|.˜|.‘|.Š|.ƒ|.||.u|.n|.g|.`|.Y|.R|.K|.D|.=|.6|./|.(|.!|.|.|. |.|.þ{.÷{.ð{.é{.â{.Û{.Ô{.Í{.Æ{.¿{.¸{.±{.ª{.£{.œ{.•{.Ž{.‡{.€{.y{.r{.k{.d{.]{.V{.O{.H{.A{.:{.3{.,{.%{.{.{.{. {.{.ûz.ôz.íz.æz.ßz.Øz.Ñz.Êz.Ãz.¼z.µz.®z.§z. z.™z.’z.‹z.„z.}z.vz.oz.hz.az.Zz.Sz.Lz.Ez.>z.7z.0z.)z."z.z.z. z.z.ÿy.øy.ñy.êy.ãy.Üy.Õy.Îy.Çy.Ày.¹y.²y.«y.¤y.y.–y.y.ˆy.y.zy.sy.ly.ey.^y.Wy.Py.Iy.By.;y.4y.-y.&y.y.y.y. y.y.üx.õx.îx.çx.àx.Ùx.Òx.Ëx.Äx.½x.¶x.¯x.¨x.¡x.šx.“x.Œx.…x.~x.wx.px.ix.bx.[x.Tx.Mx.Fx.?x.8x.1x.*x.#x.x.x.x.x.x.ùw.òw.ëw.äw.Ýw.Öw.Ïw.Èw.Áw.ºw.³w.¬w.¥w.žw.—w.w.‰w.‚w.{w.tw.mw.fw._w.Xw.Qw.Jw.Cw.s.7s.0s.)s."s.s.s. s.s.ÿr.ør.ñr.êr.ãr.Ür.Õr.Îr.Çr.Àr.¹r.²r.«r.¤r.r.–r.r.ˆr.r.zr.sr.lr.er.^r.Wr.Pr.Ir.Br.;r.4r.-r.&r.r.r.r. r.r.üq.õq.îq.çq.àq.Ùq.Òq.Ëq.Äq.½q.¶q.¯q.¨q.¡q.šq.“q.Œq.…q.~q.wq.pq.iq.bq.[q.Tq.Mq.Fq.?q.8q.1q.*q.#q.q.q.q.q.q.ùp.òp.ëp.äp.Ýp.Öp.Ïp.Èp.Áp.ºp.³p.¬p.¥p.žp.—p.p.‰p.‚p.{p.tp.mp.fp._p.Xp.Qp.Jp.Cp.l.7l.0l.)l."l.l.l. l.l.ÿk.øk.ñk.êk.ãk.Ük.Õk.Îk.Çk.Àk.¹k.²k.«k.¤k.k.–k.k.ˆk.k.zk.sk.lk.ek.^k.Wk.Pk.Ik.Bk.;k.4k.-k.&k.k.k.k. k.k.üj.õj.îj.çj.àj.Ùj.Òj.Ëj.Äj.½j.¶j.¯j.¨j.¡j.šj.“j.Œj.…j.~j.wj.pj.ij.bj.[j.Tj.Mj.Fj.?j.8j.1j.*j.#j.j.j.j.j.j.ùi.òi.ëi.äi.Ýi.Öi.Ïi.Èi.Ái.ºi.³i.¬i.¥i.ži.—i.i.‰i.‚i.{i.ti.mi.fi._i.Xi.Qi.Ji.Ci.e.7e.0e.)e."e.e.e. e.e.ÿd.ød.ñd.êd.ãd.Üd.Õd.Îd.Çd.Àd.¹d.²d.«d.¤d.d.–d.d.ˆd.d.zd.sd.ld.ed.^d.Wd.Pd.Id.Bd.;d.4d.-d.&d.d.d.d. d.d.üc.õc.îc.çc.àc.Ùc.Òc.Ëc.Äc.½c.¶c.¯c.¨c.¡c.šc.“c.Œc.…c.~c.wc.pc.ic.bc.[c.Tc.Mc.Fc.?c.8c.1c.*c.#c.c.c.c.c.c.ùb.òb.ëb.äb.Ýb.Öb.Ïb.Èb.Áb.ºb.³b.¬b.¥b.žb.—b.b.‰b.‚b.{b.tb.mb.fb._b.Xb.Qb.Jb.Cb.^.7^.0^.)^."^.^.^. ^.^.ÿ].ø].ñ].ê].ã].Ü].Õ].Î].Ç].À].¹].²].«].¤].].–].].ˆ].].z].s].l].e].^].W].P].I].B].;].4].-].&].].].]. ].].ü\.õ\.î\.ç\.à\.Ù\.Ò\.Ë\.Ä\.½\.¶\.¯\.¨\.¡\.š\.“\.Œ\.…\.~\.w\.p\.i\.b\.[\.T\.M\.F\.?\.8\.1\.*\.#\.\.\.\.\.\.ù[.ò[.ë[.ä[.Ý[.Ö[.Ï[.È[.Á[.º[.³[.¬[.¥[.ž[.—[.[.‰[.‚[.{[.t[.m[.f[._[.X[.Q[.J[.C[.<[.5[..[.'[. [.[.[. [.[.ýZ.öZ.ïZ.èZ.áZ.ÚZ.ÓZ.ÌZ.ÅZ.¾Z.·Z.°Z.©Z.¢Z.›Z.”Z.Z.†Z.Z.xZ.qZ.jZ.cZ.\Z.UZ.NZ.GZ.@Z.9Z.2Z.+Z.$Z.Z.Z.Z.Z.Z.úY.óY.ìY.åY.ÞY.×Y.ÐY.ÉY.ÂY.»Y.´Y.­Y.¦Y.ŸY.˜Y.‘Y.ŠY.ƒY.|Y.uY.nY.gY.`Y.YY.RY.KY.DY.=Y.6Y./Y.(Y.!Y.Y.Y. Y.Y.þX.÷X.ðX.éX.âX.ÛX.ÔX.ÍX.ÆX.¿X.¸X.±X.ªX.£X.œX.•X.ŽX.‡X.€X.yX.rX.kX.dX.]X.VX.OX.HX.AX.:X.3X.,X.%X.X.X.X. X.X.ûW.ôW.íW.æW.ßW.ØW.ÑW.ÊW.ÃW.¼W.µW.®W.§W. W.™W.’W.‹W.„W.}W.vW.oW.hW.aW.ZW.SW.LW.EW.>W.7W.0W.)W."W.W.W. W.W.ÿV.øV.ñV.êV.ãV.ÜV.ÕV.ÎV.ÇV.ÀV.¹V.²V.«V.¤V.V.–V.V.ˆV.V.zV.sV.lV.eV.^V.WV.PV.IV.BV.;V.4V.-V.&V.V.V.V. V.V.üU.õU.îU.çU.àU.ÙU.ÒU.ËU.ÄU.½U.¶U.¯U.¨U.¡U.šU.“U.ŒU.…U.~U.wU.pU.iU.bU.[U.TU.MU.FU.?U.8U.1U.*U.#U.U.U.U.U.U.ùT.òT.ëT.äT.ÝT.ÖT.ÏT.ÈT.ÁT.ºT.³T.¬T.¥T.žT.—T.T.‰T.‚T.{T.tT.mT.fT._T.XT.QT.JT.CT.P.7P.0P.)P."P.P.P. P.P.ÿO.øO.ñO.êO.ãO.ÜO.ÕO.ÎO.ÇO.ÀO.¹O.²O.«O.¤O.O.–O.O.ˆO.O.zO.sO.lO.eO.^O.WO.PO.IO.BO.;O.4O.-O.&O.O.O.O. O.O.üN.õN.îN.çN.àN.ÙN.ÒN.ËN.ÄN.½N.¶N.¯N.¨N.¡N.šN.“N.ŒN.…N.~N.wN.pN.iN.bN.[N.TN.MN.FN.?N.8N.1N.*N.#N.N.N.N.N.N.ùM.òM.ëM.äM.ÝM.ÖM.ÏM.ÈM.ÁM.ºM.³M.¬M.¥M.žM.—M.M.‰M.‚M.{M.tM.mM.fM._M.XM.QM.JM.CM.I.7I.0I.)I."I.I.I. I.I.ÿH.øH.ñH.êH.ãH.ÜH.ÕH.ÎH.ÇH.ÀH.¹H.²H.«H.¤H.H.–H.H.ˆH.H.zH.sH.lH.eH.^H.WH.PH.IH.BH.;H.4H.-H.&H.H.H.H. H.H.üG.õG.îG.çG.àG.ÙG.ÒG.ËG.ÄG.½G.¶G.¯G.¨G.¡G.šG.“G.ŒG.…G.~G.wG.pG.iG.bG.[G.TG.MG.FG.?G.8G.1G.*G.#G.G.G.G.G.G.ùF.òF.ëF.äF.ÝF.ÖF.ÏF.ÈF.ÁF.ºF.³F.¬F.¥F.žF.—F.F.‰F.‚F.{F.tF.mF.fF._F.XF.QF.JF.CF.B.7B.0B.)B."B.B.B. B.B.ÿA.øA.ñA.êA.ãA.ÜA.ÕA.ÎA.ÇA.ÀA.¹A.²A.«A.¤A.A.–A.A.ˆA.A.zA.sA.lA.eA.^A.WA.PA.IA.BA.;A.4A.-A.&A.A.A.A. A.A.ü@.õ@.î@.ç@.à@.Ù@.Ò@.Ë@.Ä@.½@.¶@.¯@.¨@.¡@.š@.“@.Œ@.…@.~@.w@.p@.i@.b@.[@.T@.M@.F@.?@.8@.1@.*@.#@.@.@.@.@.@.ù?.ò?.ë?.ä?.Ý?.Ö?.Ï?.È?.Á?.º?.³?.¬?.¥?.ž?.—?.?.‰?.‚?.{?.t?.m?.f?._?.X?.Q?.J?.C?..ö>.ï>.è>.á>.Ú>.Ó>.Ì>.Å>.¾>.·>.°>.©>.¢>.›>.”>.>.†>.>.x>.q>.j>.c>.\>.U>.N>.G>.@>.9>.2>.+>.$>.>.>.>.>.>.ú=.ó=.ì=.å=.Þ=.×=.Ð=.É=.Â=.»=.´=.­=.¦=.Ÿ=.˜=.‘=.Š=.ƒ=.|=.u=.n=.g=.`=.Y=.R=.K=.D=.==.6=./=.(=.!=.=.=. =.=.þ<.÷<.ð<.é<.â<.Û<.Ô<.Í<.Æ<.¿<.¸<.±<.ª<.£<.œ<.•<.Ž<.‡<.€<.y<.r<.k<.d<.]<.V<.O<.H<.A<.:<.3<.,<.%<.<.<.<. <.<.û;.ô;.í;.æ;.ß;.Ø;.Ñ;.Ê;.Ã;.¼;.µ;.®;.§;. ;.™;.’;.‹;.„;.};.v;.o;.h;.a;.Z;.S;.L;.E;.>;.7;.0;.);.";.;.;. ;.;.ÿ:.ø:.ñ:.ê:.ã:.Ü:.Õ:.Î:.Ç:.À:.¹:.²:.«:.¤:.:.–:.:.ˆ:.:.z:.s:.l:.e:.^:.W:.P:.I:.B:.;:.4:.-:.&:.:.:.:. :.:.ü9.õ9.î9.ç9.à9.Ù9.Ò9.Ë9.Ä9.½9.¶9.¯9.¨9.¡9.š9.“9.Œ9.…9.~9.w9.p9.i9.b9.[9.T9.M9.F9.?9.89.19.*9.#9.9.9.9.9.9.ù8.ò8.ë8.ä8.Ý8.Ö8.Ï8.È8.Á8.º8.³8.¬8.¥8.ž8.—8.8.‰8.‚8.{8.t8.m8.f8._8.X8.Q8.J8.C8.<8.58..8.'8. 8.8.8. 8.8.ý7.ö7.ï7.è7.á7.Ú7.Ó7.Ì7.Å7.¾7.·7.°7.©7.¢7.›7.”7.7.†7.7.x7.q7.j7.c7.\7.U7.N7.G7.@7.97.27.+7.$7.7.7.7.7.7.ú6.ó6.ì6.å6.Þ6.×6.Ð6.É6.Â6.»6.´6.­6.¦6.Ÿ6.˜6.‘6.Š6.ƒ6.|6.u6.n6.g6.`6.Y6.R6.K6.D6.=6.66./6.(6.!6.6.6. 6.6.þ5.÷5.ð5.é5.â5.Û5.Ô5.Í5.Æ5.¿5.¸5.±5.ª5.£5.œ5.•5.Ž5.‡5.€5.y5.r5.k5.d5.]5.V5.O5.H5.A5.:5.35.,5.%5.5.5.5. 5.5.û4.ô4.í4.æ4.ß4.Ø4.Ñ4.Ê4.Ã4.¼4.µ4.®4.§4. 4.™4.’4.‹4.„4.}4.v4.o4.h4.a4.Z4.S4.L4.E4.>4.74.04.)4."4.4.4. 4.4.ÿ3.ø3.ñ3.ê3.ã3.Ü3.Õ3.Î3.Ç3.À3.¹3.²3.«3.¤3.3.–3.3.ˆ3.3.z3.s3.l3.e3.^3.W3.P3.I3.B3.;3.43.-3.&3.3.3.3. 3.3.ü2.õ2.î2.ç2.à2.Ù2.Ò2.Ë2.Ä2.½2.¶2.¯2.¨2.¡2.š2.“2.Œ2.…2.~2.w2.p2.i2.b2.[2.T2.M2.F2.?2.82.12.*2.#2.2.2.2.2.2.ù1.ò1.ë1.ä1.Ý1.Ö1.Ï1.È1.Á1.º1.³1.¬1.¥1.ž1.—1.1.‰1.‚1.{1.t1.m1.f1._1.X1.Q1.J1.C1.<1.51..1.'1. 1.1.1. 1.1.ý0.ö0.ï0.è0.á0.Ú0.Ó0.Ì0.Å0.¾0.·0.°0.©0.¢0.›0.”0.0.†0.0.x0.q0.j0.c0.\0.U0.N0.G0.@0.90.20.+0.$0.0.0.0.0.0.ú/.ó/.ì/.å/.Þ/.×/.Ð/.É/.Â/.»/.´/.­/.¦/.Ÿ/.˜/.‘/.Š/.ƒ/.|/.u/.n/.g/.`/.Y/.R/.K/.D/.=/.6/.//.(/.!/././. /./.þ..÷..ð..é..â..Û..Ô..Í..Æ..¿..¸..±..ª..£..œ..•..Ž..‡..€..y..r..k..d..]..V..O..H..A..:..3..,..%........ ....û-.ô-.í-.æ-.ß-.Ø-.Ñ-.Ê-.Ã-.¼-.µ-.®-.§-. -.™-.’-.‹-.„-.}-.v-.o-.h-.a-.Z-.S-.L-.E-.>-.7-.0-.)-."-.-.-. -.-.ÿ,.ø,.ñ,.ê,.ã,.Ü,.Õ,.Î,.Ç,.À,.¹,.²,.«,.¤,.,.–,.,.ˆ,.,.z,.s,.l,.e,.^,.W,.P,.I,.B,.;,.4,.-,.&,.,.,.,. ,.,.ü+.õ+.î+.ç+.à+.Ù+.Ò+.Ë+.Ä+.½+.¶+.¯+.¨+.¡+.š+.“+.Œ+.…+.~+.w+.p+.i+.b+.[+.T+.M+.F+.?+.8+.1+.*+.#+.+.+.+.+.+.ù*.ò*.ë*.ä*.Ý*.Ö*.Ï*.È*.Á*.º*.³*.¬*.¥*.ž*.—*.*.‰*.‚*.{*.t*.m*.f*._*.X*.Q*.J*.C*.<*.5*..*.'*. *.*.*. *.*.ý).ö).ï).è).á).Ú).Ó).Ì).Å).¾).·).°).©).¢).›).”).).†).).x).q).j).c).\).U).N).G).@).9).2).+).$).).).).).).ú(.ó(.ì(.å(.Þ(.×(.Ð(.É(.Â(.»(.´(.­(.¦(.Ÿ(.˜(.‘(.Š(.ƒ(.|(.u(.n(.g(.`(.Y(.R(.K(.D(.=(.6(./(.((.!(.(.(. (.(.þ'.÷'.ð'.é'.â'.Û'.Ô'.Í'.Æ'.¿'.¸'.±'.ª'.£'.œ'.•'.Ž'.‡'.€'.y'.r'.k'.d'.]'.V'.O'.H'.A'.:'.3'.,'.%'.'.'.'. '.'.û&.ô&.í&.æ&.ß&.Ø&.Ñ&.Ê&.Ã&.¼&.µ&.®&.§&. &.™&.’&.‹&.„&.}&.v&.o&.h&.a&.Z&.S&.L&.E&.>&.7&.0&.)&."&.&.&. &.&.ÿ%.ø%.ñ%.ê%.ã%.Ü%.Õ%.Î%.Ç%.À%.¹%.²%.«%.¤%.%.–%.%.ˆ%.%.z%.s%.l%.e%.^%.W%.P%.I%.B%.;%.4%.-%.&%.%.%.%. %.%.ü$.õ$.î$.ç$.à$.Ù$.Ò$.Ë$.Ä$.½$.¶$.¯$.¨$.¡$.š$.“$.Œ$.…$.~$.w$.p$.i$.b$.[$.T$.M$.F$.?$.8$.1$.*$.#$.$.$.$.$.$.ù#.ò#.ë#.ä#.Ý#.Ö#.Ï#.È#.Á#.º#.³#.¬#.¥#.ž#.—#.#.‰#.‚#.{#.t#.m#.f#._#.X#.Q#.J#.C#.<#.5#..#.'#. #.#.#. #.#.ý".ö".ï".è".á".Ú".Ó".Ì".Å".¾".·".°".©".¢".›".”".".†".".x".q".j".c".\".U".N".G".@".9".2".+".$".".".".".".ú!.ó!.ì!.å!.Þ!.×!.Ð!.É!.Â!.»!.´!.­!.¦!.Ÿ!.˜!.‘!.Š!.ƒ!.|!.u!.n!.g!.`!.Y!.R!.K!.D!.=!.6!./!.(!.!!.!.!. !.!.þ .÷ .ð .é .â .Û .Ô .Í .Æ .¿ .¸ .± .ª .£ .œ .• .Ž .‡ .€ .y .r .k .d .] .V .O .H .A .: .3 ., .% . . . . . .û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý.ö.ï.è.á.Ú.Ó.Ì.Å.¾.·.°.©.¢.›.”..†..x.q.j.c.\.U.N.G.@.9.2.+.$......ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý.ö.ï.è.á.Ú.Ó.Ì.Å.¾.·.°.©.¢.›.”..†..x.q.j.c.\.U.N.G.@.9.2.+.$......ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý .ö .ï .è .á .Ú .Ó .Ì .Å .¾ .· .° .© .¢ .› .” . .† . .x .q .j .c .\ .U .N .G .@ .9 .2 .+ .$ . . . . . .ú .ó .ì .å .Þ .× .Ð .É . .» .´ .­ .¦ .Ÿ .˜ .‘ .Š .ƒ .| .u .n .g .` .Y .R .K .D .= .6 ./ .( .! . . . . .þ .÷ .ð .é .â .Û .Ô .Í .Æ .¿ .¸ .± .ª .£ .œ .• .Ž .‡ .€ .y .r .k .d .] .V .O .H .A .: .3 ., .% . . . . . .û .ô .í .æ .ß .Ø .Ñ .Ê .à .¼ .µ .® .§ .  .™ .’ .‹ .„ .} .v .o .h .a .Z .S .L .E .> .7 .0 .) ." . . . . .ÿ .ø .ñ .ê .ã .Ü .Õ .Î .Ç .À .¹ .² .« .¤ . .– . .ˆ . .z .s .l .e .^ .W .P .I .B .; .4 .- .& . . . . . .ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý.ö.ï.è.á.Ú.Ó.Ì.Å.¾.·.°.©.¢.›.”..†..x.q.j.c.\.U.N.G.@.9.2.+.$......ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ýÿ-öÿ-ïÿ-èÿ-áÿ-Úÿ-Óÿ-Ìÿ-Åÿ-¾ÿ-·ÿ-°ÿ-©ÿ-¢ÿ-›ÿ-”ÿ-ÿ-†ÿ-ÿ-xÿ-qÿ-jÿ-cÿ-\ÿ-Uÿ-Nÿ-Gÿ-@ÿ-9ÿ-2ÿ-+ÿ-$ÿ-ÿ-ÿ-ÿ-ÿ-ÿ-úþ-óþ-ìþ-åþ-Þþ-×þ-Ðþ-Éþ-Âþ-»þ-´þ-­þ-¦þ-Ÿþ-˜þ-‘þ-Šþ-ƒþ-|þ-uþ-nþ-gþ-`þ-Yþ-Rþ-Kþ-Dþ-=þ-6þ-/þ-(þ-!þ-þ-þ- þ-þ-þý-÷ý-ðý-éý-âý-Ûý-Ôý-Íý-Æý-¿ý-¸ý-±ý-ªý-£ý-œý-•ý-Žý-‡ý-€ý-yý-rý-ký-dý-]ý-Vý-Oý-Hý-Aý-:ý-3ý-,ý-%ý-ý-ý-ý- ý-ý-ûü-ôü-íü-æü-ßü-Øü-Ñü-Êü-Ãü-¼ü-µü-®ü-§ü- ü-™ü-’ü-‹ü-„ü-}ü-vü-oü-hü-aü-Zü-Sü-Lü-Eü->ü-7ü-0ü-)ü-"ü-ü-ü- ü-ü-ÿû-øû-ñû-êû-ãû-Üû-Õû-Îû-Çû-Àû-¹û-²û-«û-¤û-û-–û-û-ˆû-û-zû-sû-lû-eû-^û-Wû-Pû-Iû-Bû-;û-4û--û-&û-û-û-û- û-û-üú-õú-îú-çú-àú-Ùú-Òú-Ëú-Äú-½ú-¶ú-¯ú-¨ú-¡ú-šú-“ú-Œú-…ú-~ú-wú-pú-iú-bú-[ú-Tú-Mú-Fú-?ú-8ú-1ú-*ú-#ú-ú-ú-ú-ú-ú-ùù-òù-ëù-äù-Ýù-Öù-Ïù-Èù-Áù-ºù-³ù-¬ù-¥ù-žù-—ù-ù-‰ù-‚ù-{ù-tù-mù-fù-_ù-Xù-Qù-Jù-Cù-<ù-5ù-.ù-'ù- ù-ù-ù- ù-ù-ýø-öø-ïø-èø-áø-Úø-Óø-Ìø-Åø-¾ø-·ø-°ø-©ø-¢ø-›ø-”ø-ø-†ø-ø-xø-qø-jø-cø-\ø-Uø-Nø-Gø-@ø-9ø-2ø-+ø-$ø-ø-ø-ø-ø-ø-ú÷-ó÷-ì÷-å÷-Þ÷-×÷-Ð÷-É÷-Â÷-»÷-´÷-­÷-¦÷-Ÿ÷-˜÷-‘÷-Š÷-ƒ÷-|÷-u÷-n÷-g÷-`÷-Y÷-R÷-K÷-D÷-=÷-6÷-/÷-(÷-!÷-÷-÷- ÷-÷-þö-÷ö-ðö-éö-âö-Ûö-Ôö-Íö-Æö-¿ö-¸ö-±ö-ªö-£ö-œö-•ö-Žö-‡ö-€ö-yö-rö-kö-dö-]ö-Vö-Oö-Hö-Aö-:ö-3ö-,ö-%ö-ö-ö-ö- ö-ö-ûõ-ôõ-íõ-æõ-ßõ-Øõ-Ñõ-Êõ-Ãõ-¼õ-µõ-®õ-§õ- õ-™õ-’õ-‹õ-„õ-}õ-võ-oõ-hõ-aõ-Zõ-Sõ-Lõ-Eõ->õ-7õ-0õ-)õ-"õ-õ-õ- õ-õ-ÿô-øô-ñô-êô-ãô-Üô-Õô-Îô-Çô-Àô-¹ô-²ô-«ô-¤ô-ô-–ô-ô-ˆô-ô-zô-sô-lô-eô-^ô-Wô-Pô-Iô-Bô-;ô-4ô--ô-&ô-ô-ô-ô- ô-ô-üó-õó-îó-çó-àó-Ùó-Òó-Ëó-Äó-½ó-¶ó-¯ó-¨ó-¡ó-šó-“ó-Œó-…ó-~ó-wó-pó-ió-bó-[ó-Tó-Mó-Fó-?ó-8ó-1ó-*ó-#ó-ó-ó-ó-ó-ó-ùò-òò-ëò-äò-Ýò-Öò-Ïò-Èò-Áò-ºò-³ò-¬ò-¥ò-žò-—ò-ò-‰ò-‚ò-{ò-tò-mò-fò-_ò-Xò-Qò-Jò-Cò-<ò-5ò-.ò-'ò- ò-ò-ò- ò-ò-ýñ-öñ-ïñ-èñ-áñ-Úñ-Óñ-Ìñ-Åñ-¾ñ-·ñ-°ñ-©ñ-¢ñ-›ñ-”ñ-ñ-†ñ-ñ-xñ-qñ-jñ-cñ-\ñ-Uñ-Nñ-Gñ-@ñ-9ñ-2ñ-+ñ-$ñ-ñ-ñ-ñ-ñ-ñ-úð-óð-ìð-åð-Þð-×ð-Ðð-Éð-Âð-»ð-´ð-­ð-¦ð-Ÿð-˜ð-‘ð-Šð-ƒð-|ð-uð-nð-gð-`ð-Yð-Rð-Kð-Dð-=ð-6ð-/ð-(ð-!ð-ð-ð- ð-ð-þï-÷ï-ðï-éï-âï-Ûï-Ôï-Íï-Æï-¿ï-¸ï-±ï-ªï-£ï-œï-•ï-Žï-‡ï-€ï-yï-rï-kï-dï-]ï-Vï-Oï-Hï-Aï-:ï-3ï-,ï-%ï-ï-ï-ï- ï-ï-ûî-ôî-íî-æî-ßî-Øî-Ñî-Êî-Ãî-¼î-µî-®î-§î- î-™î-’î-‹î-„î-}î-vî-oî-hî-aî-Zî-Sî-Lî-Eî->î-7î-0î-)î-"î-î-î- î-î-ÿí-øí-ñí-êí-ãí-Üí-Õí-Îí-Çí-Àí-¹í-²í-«í-¤í-í-–í-í-ˆí-í-zí-sí-lí-eí-^í-Wí-Pí-Ií-Bí-;í-4í--í-&í-í-í-í- í-í-üì-õì-îì-çì-àì-Ùì-Òì-Ëì-Äì-½ì-¶ì-¯ì-¨ì-¡ì-šì-“ì-Œì-…ì-~ì-wì-pì-iì-bì-[ì-Tì-Mì-Fì-?ì-8ì-1ì-*ì-#ì-ì-ì-ì-ì-ì-ùë-òë-ëë-äë-Ýë-Öë-Ïë-Èë-Áë-ºë-³ë-¬ë-¥ë-žë-—ë-ë-‰ë-‚ë-{ë-të-më-fë-_ë-Xë-Që-Jë-Cë-<ë-5ë-.ë-'ë- ë-ë-ë- ë-ë-ýê-öê-ïê-èê-áê-Úê-Óê-Ìê-Åê-¾ê-·ê-°ê-©ê-¢ê-›ê-”ê-ê-†ê-ê-xê-qê-jê-cê-\ê-Uê-Nê-Gê-@ê-9ê-2ê-+ê-$ê-ê-ê-ê-ê-ê-úé-óé-ìé-åé-Þé-×é-Ðé-Éé-Âé-»é-´é-­é-¦é-Ÿé-˜é-‘é-Šé-ƒé-|é-ué-né-gé-`é-Yé-Ré-Ké-Dé-=é-6é-/é-(é-!é-é-é- é-é-þè-÷è-ðè-éè-âè-Ûè-Ôè-Íè-Æè-¿è-¸è-±è-ªè-£è-œè-•è-Žè-‡è-€è-yè-rè-kè-dè-]è-Vè-Oè-Hè-Aè-:è-3è-,è-%è-è-è-è- è-è-ûç-ôç-íç-æç-ßç-Øç-Ñç-Êç-Ãç-¼ç-µç-®ç-§ç- ç-™ç-’ç-‹ç-„ç-}ç-vç-oç-hç-aç-Zç-Sç-Lç-Eç->ç-7ç-0ç-)ç-"ç-ç-ç- ç-ç-ÿæ-øæ-ñæ-êæ-ãæ-Üæ-Õæ-Îæ-Çæ-Àæ-¹æ-²æ-«æ-¤æ-æ-–æ-æ-ˆæ-æ-zæ-sæ-læ-eæ-^æ-Wæ-Pæ-Iæ-Bæ-;æ-4æ--æ-&æ-æ-æ-æ- æ-æ-üå-õå-îå-çå-àå-Ùå-Òå-Ëå-Äå-½å-¶å-¯å-¨å-¡å-šå-“å-Œå-…å-~å-wå-på-iå-bå-[å-Tå-Må-Få-?å-8å-1å-*å-#å-å-å-å-å-å-ùä-òä-ëä-ää-Ýä-Öä-Ïä-Èä-Áä-ºä-³ä-¬ä-¥ä-žä-—ä-ä-‰ä-‚ä-{ä-tä-mä-fä-_ä-Xä-Qä-Jä-Cä-<ä-5ä-.ä-'ä- ä-ä-ä- ä-ä-ýã-öã-ïã-èã-áã-Úã-Óã-Ìã-Åã-¾ã-·ã-°ã-©ã-¢ã-›ã-”ã-ã-†ã-ã-xã-qã-jã-cã-\ã-Uã-Nã-Gã-@ã-9ã-2ã-+ã-$ã-ã-ã-ã-ã-ã-úâ-óâ-ìâ-åâ-Þâ-×â-Ðâ-Éâ-Ââ-»â-´â-­â-¦â-Ÿâ-˜â-‘â-Šâ-ƒâ-|â-uâ-nâ-gâ-`â-Yâ-Râ-Kâ-Dâ-=â-6â-/â-(â-!â-â-â- â-â-þá-÷á-ðá-éá-âá-Ûá-Ôá-Íá-Æá-¿á-¸á-±á-ªá-£á-œá-•á-Žá-‡á-€á-yá-rá-ká-dá-]á-Vá-Oá-Há-Aá-:á-3á-,á-%á-á-á-á- á-á-ûà-ôà-íà-æà-ßà-Øà-Ñà-Êà-Ãà-¼à-µà-®à-§à- à-™à-’à-‹à-„à-}à-và-oà-hà-aà-Zà-Sà-Là-Eà->à-7à-0à-)à-"à-à-à- à-à-ÿß-øß-ñß-êß-ãß-Üß-Õß-Îß-Çß-Àß-¹ß-²ß-«ß-¤ß-ß-–ß-ß-ˆß-ß-zß-sß-lß-eß-^ß-Wß-Pß-Iß-Bß-;ß-4ß--ß-&ß-ß-ß-ß- ß-ß-üÞ-õÞ-îÞ-çÞ-àÞ-ÙÞ-ÒÞ-ËÞ-ÄÞ-½Þ-¶Þ-¯Þ-¨Þ-¡Þ-šÞ-“Þ-ŒÞ-…Þ-~Þ-wÞ-pÞ-iÞ-bÞ-[Þ-TÞ-MÞ-FÞ-?Þ-8Þ-1Þ-*Þ-#Þ-Þ-Þ-Þ-Þ-Þ-ùÝ-òÝ-ëÝ-äÝ-ÝÝ-ÖÝ-ÏÝ-ÈÝ-ÁÝ-ºÝ-³Ý-¬Ý-¥Ý-žÝ-—Ý-Ý-‰Ý-‚Ý-{Ý-tÝ-mÝ-fÝ-_Ý-XÝ-QÝ-JÝ-CÝ-<Ý-5Ý-.Ý-'Ý- Ý-Ý-Ý- Ý-Ý-ýÜ-öÜ-ïÜ-èÜ-áÜ-ÚÜ-ÓÜ-ÌÜ-ÅÜ-¾Ü-·Ü-°Ü-©Ü-¢Ü-›Ü-”Ü-Ü-†Ü-Ü-xÜ-qÜ-jÜ-cÜ-\Ü-UÜ-NÜ-GÜ-@Ü-9Ü-2Ü-+Ü-$Ü-Ü-Ü-Ü-Ü-Ü-úÛ-óÛ-ìÛ-åÛ-ÞÛ-×Û-ÐÛ-ÉÛ-ÂÛ-»Û-´Û-­Û-¦Û-ŸÛ-˜Û-‘Û-ŠÛ-ƒÛ-|Û-uÛ-nÛ-gÛ-`Û-YÛ-RÛ-KÛ-DÛ-=Û-6Û-/Û-(Û-!Û-Û-Û- Û-Û-þÚ-÷Ú-ðÚ-éÚ-âÚ-ÛÚ-ÔÚ-ÍÚ-ÆÚ-¿Ú-¸Ú-±Ú-ªÚ-£Ú-œÚ-•Ú-ŽÚ-‡Ú-€Ú-yÚ-rÚ-kÚ-dÚ-]Ú-VÚ-OÚ-HÚ-AÚ-:Ú-3Ú-,Ú-%Ú-Ú-Ú-Ú- Ú-Ú-ûÙ-ôÙ-íÙ-æÙ-ßÙ-ØÙ-ÑÙ-ÊÙ-ÃÙ-¼Ù-µÙ-®Ù-§Ù- Ù-™Ù-’Ù-‹Ù-„Ù-}Ù-vÙ-oÙ-hÙ-aÙ-ZÙ-SÙ-LÙ-EÙ->Ù-7Ù-0Ù-)Ù-"Ù-Ù-Ù- Ù-Ù-ÿØ-øØ-ñØ-êØ-ãØ-ÜØ-ÕØ-ÎØ-ÇØ-ÀØ-¹Ø-²Ø-«Ø-¤Ø-Ø-–Ø-Ø-ˆØ-Ø-zØ-sØ-lØ-eØ-^Ø-WØ-PØ-IØ-BØ-;Ø-4Ø--Ø-&Ø-Ø-Ø-Ø- Ø-Ø-ü×-õ×-î×-ç×-à×-Ù×-Ò×-Ë×-Ä×-½×-¶×-¯×-¨×-¡×-š×-“×-Œ×-…×-~×-w×-p×-i×-b×-[×-T×-M×-F×-?×-8×-1×-*×-#×-×-×-×-×-×-ùÖ-òÖ-ëÖ-äÖ-ÝÖ-ÖÖ-ÏÖ-ÈÖ-ÁÖ-ºÖ-³Ö-¬Ö-¥Ö-žÖ-—Ö-Ö-‰Ö-‚Ö-{Ö-tÖ-mÖ-fÖ-_Ö-XÖ-QÖ-JÖ-CÖ-<Ö-5Ö-.Ö-'Ö- Ö-Ö-Ö- Ö-Ö-ýÕ-öÕ-ïÕ-èÕ-áÕ-ÚÕ-ÓÕ-ÌÕ-ÅÕ-¾Õ-·Õ-°Õ-©Õ-¢Õ-›Õ-”Õ-Õ-†Õ-Õ-xÕ-qÕ-jÕ-cÕ-\Õ-UÕ-NÕ-GÕ-@Õ-9Õ-2Õ-+Õ-$Õ-Õ-Õ-Õ-Õ-Õ-úÔ-óÔ-ìÔ-åÔ-ÞÔ-×Ô-ÐÔ-ÉÔ-ÂÔ-»Ô-´Ô-­Ô-¦Ô-ŸÔ-˜Ô-‘Ô-ŠÔ-ƒÔ-|Ô-uÔ-nÔ-gÔ-`Ô-YÔ-RÔ-KÔ-DÔ-=Ô-6Ô-/Ô-(Ô-!Ô-Ô-Ô- Ô-Ô-þÓ-÷Ó-ðÓ-éÓ-âÓ-ÛÓ-ÔÓ-ÍÓ-ÆÓ-¿Ó-¸Ó-±Ó-ªÓ-£Ó-œÓ-•Ó-ŽÓ-‡Ó-€Ó-yÓ-rÓ-kÓ-dÓ-]Ó-VÓ-OÓ-HÓ-AÓ-:Ó-3Ó-,Ó-%Ó-Ó-Ó-Ó- Ó-Ó-ûÒ-ôÒ-íÒ-æÒ-ßÒ-ØÒ-ÑÒ-ÊÒ-ÃÒ-¼Ò-µÒ-®Ò-§Ò- Ò-™Ò-’Ò-‹Ò-„Ò-}Ò-vÒ-oÒ-hÒ-aÒ-ZÒ-SÒ-LÒ-EÒ->Ò-7Ò-0Ò-)Ò-"Ò-Ò-Ò- Ò-Ò-ÿÑ-øÑ-ñÑ-êÑ-ãÑ-ÜÑ-ÕÑ-ÎÑ-ÇÑ-ÀÑ-¹Ñ-²Ñ-«Ñ-¤Ñ-Ñ-–Ñ-Ñ-ˆÑ-Ñ-zÑ-sÑ-lÑ-eÑ-^Ñ-WÑ-PÑ-IÑ-BÑ-;Ñ-4Ñ--Ñ-&Ñ-Ñ-Ñ-Ñ- Ñ-Ñ-üÐ-õÐ-îÐ-çÐ-àÐ-ÙÐ-ÒÐ-ËÐ-ÄÐ-½Ð-¶Ð-¯Ð-¨Ð-¡Ð-šÐ-“Ð-ŒÐ-…Ð-~Ð-wÐ-pÐ-iÐ-bÐ-[Ð-TÐ-MÐ-FÐ-?Ð-8Ð-1Ð-*Ð-#Ð-Ð-Ð-Ð-Ð-Ð-ùÏ-òÏ-ëÏ-äÏ-ÝÏ-ÖÏ-ÏÏ-ÈÏ-ÁÏ-ºÏ-³Ï-¬Ï-¥Ï-žÏ-—Ï-Ï-‰Ï-‚Ï-{Ï-tÏ-mÏ-fÏ-_Ï-XÏ-QÏ-JÏ-CÏ-<Ï-5Ï-.Ï-'Ï- Ï-Ï-Ï- Ï-Ï-ýÎ-öÎ-ïÎ-èÎ-áÎ-ÚÎ-ÓÎ-ÌÎ-ÅÎ-¾Î-·Î-°Î-©Î-¢Î-›Î-”Î-Î-†Î-Î-xÎ-qÎ-jÎ-cÎ-\Î-UÎ-NÎ-GÎ-@Î-9Î-2Î-+Î-$Î-Î-Î-Î-Î-Î-úÍ-óÍ-ìÍ-åÍ-ÞÍ-×Í-ÐÍ-ÉÍ-ÂÍ-»Í-´Í-­Í-¦Í-ŸÍ-˜Í-‘Í-ŠÍ-ƒÍ-|Í-uÍ-nÍ-gÍ-`Í-YÍ-RÍ-KÍ-DÍ-=Í-6Í-/Í-(Í-!Í-Í-Í- Í-Í-þÌ-÷Ì-ðÌ-éÌ-âÌ-ÛÌ-ÔÌ-ÍÌ-ÆÌ-¿Ì-¸Ì-±Ì-ªÌ-£Ì-œÌ-•Ì-ŽÌ-‡Ì-€Ì-yÌ-rÌ-kÌ-dÌ-]Ì-VÌ-OÌ-HÌ-AÌ-:Ì-3Ì-,Ì-%Ì-Ì-Ì-Ì- Ì-Ì-ûË-ôË-íË-æË-ßË-ØË-ÑË-ÊË-ÃË-¼Ë-µË-®Ë-§Ë- Ë-™Ë-’Ë-‹Ë-„Ë-}Ë-vË-oË-hË-aË-ZË-SË-LË-EË->Ë-7Ë-0Ë-)Ë-"Ë-Ë-Ë- Ë-Ë-ÿÊ-øÊ-ñÊ-êÊ-ãÊ-ÜÊ-ÕÊ-ÎÊ-ÇÊ-ÀÊ-¹Ê-²Ê-«Ê-¤Ê-Ê-–Ê-Ê-ˆÊ-Ê-zÊ-sÊ-lÊ-eÊ-^Ê-WÊ-PÊ-IÊ-BÊ-;Ê-4Ê--Ê-&Ê-Ê-Ê-Ê- Ê-Ê-üÉ-õÉ-îÉ-çÉ-àÉ-ÙÉ-ÒÉ-ËÉ-ÄÉ-½É-¶É-¯É-¨É-¡É-šÉ-“É-ŒÉ-…É-~É-wÉ-pÉ-iÉ-bÉ-[É-TÉ-MÉ-FÉ-?É-8É-1É-*É-#É-É-É-É-É-É-ùÈ-òÈ-ëÈ-äÈ-ÝÈ-ÖÈ-ÏÈ-ÈÈ-ÁÈ-ºÈ-³È-¬È-¥È-žÈ-—È-È-‰È-‚È-{È-tÈ-mÈ-fÈ-_È-XÈ-QÈ-JÈ-CÈ-<È-5È-.È-'È- È-È-È- È-È-ýÇ-öÇ-ïÇ-èÇ-áÇ-ÚÇ-ÓÇ-ÌÇ-ÅÇ-¾Ç-·Ç-°Ç-©Ç-¢Ç-›Ç-”Ç-Ç-†Ç-Ç-xÇ-qÇ-jÇ-cÇ-\Ç-UÇ-NÇ-GÇ-@Ç-9Ç-2Ç-+Ç-$Ç-Ç-Ç-Ç-Ç-Ç-úÆ-óÆ-ìÆ-åÆ-ÞÆ-ׯ-ÐÆ-ÉÆ-ÂÆ-»Æ-´Æ-­Æ-¦Æ-ŸÆ-˜Æ-‘Æ-ŠÆ-ƒÆ-|Æ-uÆ-nÆ-gÆ-`Æ-YÆ-RÆ-KÆ-DÆ-=Æ-6Æ-/Æ-(Æ-!Æ-Æ-Æ- Æ-Æ-þÅ-÷Å-ðÅ-éÅ-âÅ-ÛÅ-ÔÅ-ÍÅ-ÆÅ-¿Å-¸Å-±Å-ªÅ-£Å-œÅ-•Å-ŽÅ-‡Å-€Å-yÅ-rÅ-kÅ-dÅ-]Å-VÅ-OÅ-HÅ-AÅ-:Å-3Å-,Å-%Å-Å-Å-Å- Å-Å-ûÄ-ôÄ-íÄ-æÄ-ßÄ-ØÄ-ÑÄ-ÊÄ-ÃÄ-¼Ä-µÄ-®Ä-§Ä- Ä-™Ä-’Ä-‹Ä-„Ä-}Ä-vÄ-oÄ-hÄ-aÄ-ZÄ-SÄ-LÄ-EÄ->Ä-7Ä-0Ä-)Ä-"Ä-Ä-Ä- Ä-Ä-ÿÃ-øÃ-ñÃ-êÃ-ãÃ-ÜÃ-ÕÃ-ÎÃ-ÇÃ-ÀÃ-¹Ã-²Ã-«Ã-¤Ã-Ã-–Ã-Ã-ˆÃ-Ã-zÃ-sÃ-lÃ-eÃ-^Ã-WÃ-PÃ-IÃ-BÃ-;Ã-4Ã--Ã-&Ã-Ã-Ã-Ã- Ã-Ã-üÂ-õÂ-îÂ-çÂ-àÂ-ÙÂ-ÒÂ-ËÂ-ÄÂ-½Â-¶Â-¯Â-¨Â-¡Â-šÂ-“Â-ŒÂ-…Â-~Â-wÂ-pÂ-iÂ-bÂ-[Â-TÂ-MÂ-FÂ-?Â-8Â-1Â-*Â-#Â-Â-Â-Â-Â-Â-ùÁ-òÁ-ëÁ-äÁ-ÝÁ-ÖÁ-ÏÁ-ÈÁ-ÁÁ-ºÁ-³Á-¬Á-¥Á-žÁ-—Á-Á-‰Á-‚Á-{Á-tÁ-mÁ-fÁ-_Á-XÁ-QÁ-JÁ-CÁ-<Á-5Á-.Á-'Á- Á-Á-Á- Á-Á-ýÀ-öÀ-ïÀ-èÀ-áÀ-ÚÀ-ÓÀ-ÌÀ-ÅÀ-¾À-·À-°À-©À-¢À-›À-”À-À-†À-À-xÀ-qÀ-jÀ-cÀ-\À-UÀ-NÀ-GÀ-@À-9À-2À-+À-$À-À-À-À-À-À-ú¿-ó¿-ì¿-å¿-Þ¿-׿-п-É¿-¿-»¿-´¿-­¿-¦¿-Ÿ¿-˜¿-‘¿-Š¿-ƒ¿-|¿-u¿-n¿-g¿-`¿-Y¿-R¿-K¿-D¿-=¿-6¿-/¿-(¿-!¿-¿-¿- ¿-¿-þ¾-÷¾-ð¾-é¾-â¾-Û¾-Ô¾-;-ƾ-¿¾-¸¾-±¾-ª¾-£¾-œ¾-•¾-޾-‡¾-€¾-y¾-r¾-k¾-d¾-]¾-V¾-O¾-H¾-A¾-:¾-3¾-,¾-%¾-¾-¾-¾- ¾-¾-û½-ô½-í½-æ½-ß½-ؽ-ѽ-ʽ-ý-¼½-µ½-®½-§½- ½-™½-’½-‹½-„½-}½-v½-o½-h½-a½-Z½-S½-L½-E½->½-7½-0½-)½-"½-½-½- ½-½-ÿ¼-ø¼-ñ¼-ê¼-ã¼-ܼ-Õ¼-μ-Ǽ-À¼-¹¼-²¼-«¼-¤¼-¼-–¼-¼-ˆ¼-¼-z¼-s¼-l¼-e¼-^¼-W¼-P¼-I¼-B¼-;¼-4¼--¼-&¼-¼-¼-¼- ¼-¼-ü»-õ»-î»-ç»-à»-Ù»-Ò»-Ë»-Ä»-½»-¶»-¯»-¨»-¡»-š»-“»-Œ»-…»-~»-w»-p»-i»-b»-[»-T»-M»-F»-?»-8»-1»-*»-#»-»-»-»-»-»-ùº-òº-ëº-äº-ݺ-Öº-Ϻ-Ⱥ-Áº-ºº-³º-¬º-¥º-žº-—º-º-‰º-‚º-{º-tº-mº-fº-_º-Xº-Qº-Jº-Cº-<º-5º-.º-'º- º-º-º- º-º-ý¹-ö¹-ï¹-è¹-á¹-Ú¹-Ó¹-̹-Ź-¾¹-·¹-°¹-©¹-¢¹-›¹-”¹-¹-†¹-¹-x¹-q¹-j¹-c¹-\¹-U¹-N¹-G¹-@¹-9¹-2¹-+¹-$¹-¹-¹-¹-¹-¹-ú¸-ó¸-ì¸-å¸-Þ¸-׸-и-ɸ-¸-»¸-´¸-­¸-¦¸-Ÿ¸-˜¸-‘¸-Џ-ƒ¸-|¸-u¸-n¸-g¸-`¸-Y¸-R¸-K¸-D¸-=¸-6¸-/¸-(¸-!¸-¸-¸- ¸-¸-þ·-÷·-ð·-é·-â·-Û·-Ô·-Í·-Æ·-¿·-¸·-±·-ª·-£·-œ·-•·-Ž·-‡·-€·-y·-r·-k·-d·-]·-V·-O·-H·-A·-:·-3·-,·-%·-·-·-·- ·-·-û¶-ô¶-í¶-æ¶-ß¶-ض-Ѷ-ʶ-ö-¼¶-µ¶-®¶-§¶- ¶-™¶-’¶-‹¶-„¶-}¶-v¶-o¶-h¶-a¶-Z¶-S¶-L¶-E¶->¶-7¶-0¶-)¶-"¶-¶-¶- ¶-¶-ÿµ-øµ-ñµ-êµ-ãµ-ܵ-Õµ-ε-ǵ-Àµ-¹µ-²µ-«µ-¤µ-µ-–µ-µ-ˆµ-µ-zµ-sµ-lµ-eµ-^µ-Wµ-Pµ-Iµ-Bµ-;µ-4µ--µ-&µ-µ-µ-µ- µ-µ-ü´-õ´-î´-ç´-à´-Ù´-Ò´-Ë´-Ä´-½´-¶´-¯´-¨´-¡´-š´-“´-Œ´-…´-~´-w´-p´-i´-b´-[´-T´-M´-F´-?´-8´-1´-*´-#´-´-´-´-´-´-ù³-ò³-ë³-ä³-ݳ-Ö³-ϳ-ȳ-Á³-º³-³³-¬³-¥³-ž³-—³-³-‰³-‚³-{³-t³-m³-f³-_³-X³-Q³-J³-C³-<³-5³-.³-'³- ³-³-³- ³-³-ý²-ö²-ï²-è²-á²-Ú²-Ó²-̲-Ų-¾²-·²-°²-©²-¢²-›²-”²-²-†²-²-x²-q²-j²-c²-\²-U²-N²-G²-@²-9²-2²-+²-$²-²-²-²-²-²-ú±-ó±-ì±-å±-Þ±-×±-б-ɱ-±-»±-´±-­±-¦±-Ÿ±-˜±-‘±-б-ƒ±-|±-u±-n±-g±-`±-Y±-R±-K±-D±-=±-6±-/±-(±-!±-±-±- ±-±-þ°-÷°-ð°-é°-â°-Û°-Ô°-Ͱ-ư-¿°-¸°-±°-ª°-£°-œ°-•°-ް-‡°-€°-y°-r°-k°-d°-]°-V°-O°-H°-A°-:°-3°-,°-%°-°-°-°- °-°-û¯-ô¯-í¯-æ¯-߯-د-ѯ-ʯ-ï-¼¯-µ¯-®¯-§¯- ¯-™¯-’¯-‹¯-„¯-}¯-v¯-o¯-h¯-a¯-Z¯-S¯-L¯-E¯->¯-7¯-0¯-)¯-"¯-¯-¯- ¯-¯-ÿ®-ø®-ñ®-ê®-ã®-Ü®-Õ®-ή-Ç®-À®-¹®-²®-«®-¤®-®-–®-®-ˆ®-®-z®-s®-l®-e®-^®-W®-P®-I®-B®-;®-4®--®-&®-®-®-®- ®-®-ü­-õ­-î­-ç­-à­-Ù­-Ò­-Ë­-Ä­-½­-¶­-¯­-¨­-¡­-š­-“­-Œ­-…­-~­-w­-p­-i­-b­-[­-T­-M­-F­-?­-8­-1­-*­-#­-­-­-­-­-­-ù¬-ò¬-ë¬-ä¬-ݬ-Ö¬-Ϭ-Ȭ-Á¬-º¬-³¬-¬¬-¥¬-ž¬-—¬-¬-‰¬-‚¬-{¬-t¬-m¬-f¬-_¬-X¬-Q¬-J¬-C¬-<¬-5¬-.¬-'¬- ¬-¬-¬- ¬-¬-ý«-ö«-ï«-è«-á«-Ú«-Ó«-Ì«-Å«-¾«-·«-°«-©«-¢«-›«-”«-«-†«-«-x«-q«-j«-c«-\«-U«-N«-G«-@«-9«-2«-+«-$«-«-«-«-«-«-úª-óª-ìª-åª-Þª-ת-Ъ-ɪ-ª-»ª-´ª-­ª-¦ª-Ÿª-˜ª-‘ª-Šª-ƒª-|ª-uª-nª-gª-`ª-Yª-Rª-Kª-Dª-=ª-6ª-/ª-(ª-!ª-ª-ª- ª-ª-þ©-÷©-ð©-é©-â©-Û©-Ô©-Í©-Æ©-¿©-¸©-±©-ª©-£©-œ©-•©-Ž©-‡©-€©-y©-r©-k©-d©-]©-V©-O©-H©-A©-:©-3©-,©-%©-©-©-©- ©-©-û¨-ô¨-í¨-æ¨-ߨ-ب-Ѩ-ʨ-è-¼¨-µ¨-®¨-§¨- ¨-™¨-’¨-‹¨-„¨-}¨-v¨-o¨-h¨-a¨-Z¨-S¨-L¨-E¨->¨-7¨-0¨-)¨-"¨-¨-¨- ¨-¨-ÿ§-ø§-ñ§-ê§-ã§-ܧ-Õ§-Χ-ǧ-À§-¹§-²§-«§-¤§-§-–§-§-ˆ§-§-z§-s§-l§-e§-^§-W§-P§-I§-B§-;§-4§--§-&§-§-§-§- §-§-ü¦-õ¦-î¦-ç¦-à¦-Ù¦-Ò¦-˦-Ħ-½¦-¶¦-¯¦-¨¦-¡¦-š¦-“¦-Œ¦-…¦-~¦-w¦-p¦-i¦-b¦-[¦-T¦-M¦-F¦-?¦-8¦-1¦-*¦-#¦-¦-¦-¦-¦-¦-ù¥-ò¥-ë¥-ä¥-Ý¥-Ö¥-Ï¥-È¥-Á¥-º¥-³¥-¬¥-¥¥-ž¥-—¥-¥-‰¥-‚¥-{¥-t¥-m¥-f¥-_¥-X¥-Q¥-J¥-C¥-<¥-5¥-.¥-'¥- ¥-¥-¥- ¥-¥-ý¤-ö¤-ï¤-è¤-á¤-Ú¤-Ó¤-̤-Ť-¾¤-·¤-°¤-©¤-¢¤-›¤-”¤-¤-†¤-¤-x¤-q¤-j¤-c¤-\¤-U¤-N¤-G¤-@¤-9¤-2¤-+¤-$¤-¤-¤-¤-¤-¤-ú£-ó£-ì£-å£-Þ£-×£-У-É£-£-»£-´£-­£-¦£-Ÿ£-˜£-‘£-Š£-ƒ£-|£-u£-n£-g£-`£-Y£-R£-K£-D£-=£-6£-/£-(£-!£-£-£- £-£-þ¢-÷¢-ð¢-é¢-â¢-Û¢-Ô¢-Í¢-Æ¢-¿¢-¸¢-±¢-ª¢-£¢-œ¢-•¢-Ž¢-‡¢-€¢-y¢-r¢-k¢-d¢-]¢-V¢-O¢-H¢-A¢-:¢-3¢-,¢-%¢-¢-¢-¢- ¢-¢-û¡-ô¡-í¡-æ¡-ß¡-Ø¡-Ñ¡-Ê¡-á-¼¡-µ¡-®¡-§¡- ¡-™¡-’¡-‹¡-„¡-}¡-v¡-o¡-h¡-a¡-Z¡-S¡-L¡-E¡->¡-7¡-0¡-)¡-"¡-¡-¡- ¡-¡-ÿ -ø -ñ -ê -ã -Ü -Õ -Π-Ç -À -¹ -² -« -¤ - -– - -ˆ - -z -s -l -e -^ -W -P -I -B -; -4 -- -& - - - -  - -üŸ-õŸ-îŸ-çŸ-àŸ-ÙŸ-ÒŸ-ËŸ-ÄŸ-½Ÿ-¶Ÿ-¯Ÿ-¨Ÿ-¡Ÿ-šŸ-“Ÿ-ŒŸ-…Ÿ-~Ÿ-wŸ-pŸ-iŸ-bŸ-[Ÿ-TŸ-MŸ-FŸ-?Ÿ-8Ÿ-1Ÿ-*Ÿ-#Ÿ-Ÿ-Ÿ-Ÿ-Ÿ-Ÿ-ùž-òž-ëž-äž-Ýž-Öž-Ïž-Èž-Áž-ºž-³ž-¬ž-¥ž-žž-—ž-ž-‰ž-‚ž-{ž-tž-mž-fž-_ž-Xž-Qž-Jž-Cž-<ž-5ž-.ž-'ž- ž-ž-ž- ž-ž-ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------úœ-óœ-ìœ-åœ-Þœ-ל-М-Éœ-œ-»œ-´œ-­œ-¦œ-Ÿœ-˜œ-‘œ-Šœ-ƒœ-|œ-uœ-nœ-gœ-`œ-Yœ-Rœ-Kœ-Dœ-=œ-6œ-/œ-(œ-!œ-œ-œ- œ-œ-þ›-÷›-ð›-é›-â›-Û›-Ô›-Í›-Æ›-¿›-¸›-±›-ª›-£›-œ›-•›-Ž›-‡›-€›-y›-r›-k›-d›-]›-V›-O›-H›-A›-:›-3›-,›-%›-›-›-›- ›-›-ûš-ôš-íš-æš-ßš-Øš-Ñš-Êš-Ú-¼š-µš-®š-§š- š-™š-’š-‹š-„š-}š-vš-oš-hš-aš-Zš-Sš-Lš-Eš->š-7š-0š-)š-"š-š-š- š-š-ÿ™-ø™-ñ™-ê™-ã™-Ü™-Õ™-Ι-Ç™-À™-¹™-²™-«™-¤™-™-–™-™-ˆ™-™-z™-s™-l™-e™-^™-W™-P™-I™-B™-;™-4™--™-&™-™-™-™- ™-™-ü˜-õ˜-î˜-ç˜-à˜-Ù˜-Ò˜-˘-Ę-½˜-¶˜-¯˜-¨˜-¡˜-š˜-“˜-Œ˜-…˜-~˜-w˜-p˜-i˜-b˜-[˜-T˜-M˜-F˜-?˜-8˜-1˜-*˜-#˜-˜-˜-˜-˜-˜-ù—-ò—-ë—-ä—-Ý—-Ö—-Ï—-È—-Á—-º—-³—-¬—-¥—-ž—-——-—-‰—-‚—-{—-t—-m—-f—-_—-X—-Q—-J—-C—-<—-5—-.—-'—- —-—-—- —-—-ý–-ö–-ï–-è–-á–-Ú–-Ó–-Ì–-Å–-¾–-·–-°–-©–-¢–-›–-”–-–-†–-–-x–-q–-j–-c–-\–-U–-N–-G–-@–-9–-2–-+–-$–-–-–-–-–-–-ú•-ó•-ì•-å•-Þ•-ו-Е-É•-•-»•-´•-­•-¦•-Ÿ•-˜•-‘•-Š•-ƒ•-|•-u•-n•-g•-`•-Y•-R•-K•-D•-=•-6•-/•-(•-!•-•-•- •-•-þ”-÷”-ð”-é”-â”-Û”-Ô”-Í”-Æ”-¿”-¸”-±”-ª”-£”-œ”-•”-Ž”-‡”-€”-y”-r”-k”-d”-]”-V”-O”-H”-A”-:”-3”-,”-%”-”-”-”- ”-”-û“-ô“-í“-æ“-ß“-Ø“-Ñ“-Ê“-Ó-¼“-µ“-®“-§“- “-™“-’“-‹“-„“-}“-v“-o“-h“-a“-Z“-S“-L“-E“->“-7“-0“-)“-"“-“-“- “-“-ÿ’-ø’-ñ’-ê’-ã’-Ü’-Õ’-Î’-Ç’-À’-¹’-²’-«’-¤’-’-–’-’-ˆ’-’-z’-s’-l’-e’-^’-W’-P’-I’-B’-;’-4’--’-&’-’-’-’- ’-’-ü‘-õ‘-î‘-ç‘-à‘-Ù‘-Ò‘-Ë‘-Ä‘-½‘-¶‘-¯‘-¨‘-¡‘-š‘-“‘-Œ‘-…‘-~‘-w‘-p‘-i‘-b‘-[‘-T‘-M‘-F‘-?‘-8‘-1‘-*‘-#‘-‘-‘-‘-‘-‘-ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------úŽ-óŽ-ìŽ-åŽ-ÞŽ-׎-ÐŽ-ÉŽ-ÂŽ-»Ž-´Ž-­Ž-¦Ž-ŸŽ-˜Ž-‘Ž-ŠŽ-ƒŽ-|Ž-uŽ-nŽ-gŽ-`Ž-YŽ-RŽ-KŽ-DŽ-=Ž-6Ž-/Ž-(Ž-!Ž-Ž-Ž- Ž-Ž-þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --ûŒ-ôŒ-íŒ-æŒ-ߌ-ØŒ-ÑŒ-ÊŒ-ÃŒ-¼Œ-µŒ-®Œ-§Œ- Œ-™Œ-’Œ-‹Œ-„Œ-}Œ-vŒ-oŒ-hŒ-aŒ-ZŒ-SŒ-LŒ-EŒ->Œ-7Œ-0Œ-)Œ-"Œ-Œ-Œ- Œ-Œ-ÿ‹-ø‹-ñ‹-ê‹-ã‹-Ü‹-Õ‹-΋-Ç‹-À‹-¹‹-²‹-«‹-¤‹-‹-–‹-‹-ˆ‹-‹-z‹-s‹-l‹-e‹-^‹-W‹-P‹-I‹-B‹-;‹-4‹--‹-&‹-‹-‹-‹- ‹-‹-üŠ-õŠ-îŠ-çŠ-àŠ-ÙŠ-ÒŠ-ËŠ-ÄŠ-½Š-¶Š-¯Š-¨Š-¡Š-šŠ-“Š-ŒŠ-…Š-~Š-wŠ-pŠ-iŠ-bŠ-[Š-TŠ-MŠ-FŠ-?Š-8Š-1Š-*Š-#Š-Š-Š-Š-Š-Š-ù‰-ò‰-ë‰-ä‰-݉-Ö‰-ω-ȉ-Á‰-º‰-³‰-¬‰-¥‰-ž‰-—‰-‰-‰‰-‚‰-{‰-t‰-m‰-f‰-_‰-X‰-Q‰-J‰-C‰-<‰-5‰-.‰-'‰- ‰-‰-‰- ‰-‰-ýˆ-öˆ-ïˆ-èˆ-áˆ-Úˆ-Óˆ-̈-ň-¾ˆ-·ˆ-°ˆ-©ˆ-¢ˆ-›ˆ-”ˆ-ˆ-†ˆ-ˆ-xˆ-qˆ-jˆ-cˆ-\ˆ-Uˆ-Nˆ-Gˆ-@ˆ-9ˆ-2ˆ-+ˆ-$ˆ-ˆ-ˆ-ˆ-ˆ-ˆ-ú‡-ó‡-ì‡-å‡-Þ‡-ׇ-Ї-ɇ-‡-»‡-´‡-­‡-¦‡-Ÿ‡-˜‡-‘‡-Ї-ƒ‡-|‡-u‡-n‡-g‡-`‡-Y‡-R‡-K‡-D‡-=‡-6‡-/‡-(‡-!‡-‡-‡- ‡-‡-þ†-÷†-ð†-é†-â†-Û†-Ô†-͆-Ɔ-¿†-¸†-±†-ª†-£†-œ†-•†-ކ-‡†-€†-y†-r†-k†-d†-]†-V†-O†-H†-A†-:†-3†-,†-%†-†-†-†- †-†-û…-ô…-í…-æ…-ß…-Ø…-Ñ…-Ê…-Ã…-¼…-µ…-®…-§…- …-™…-’…-‹…-„…-}…-v…-o…-h…-a…-Z…-S…-L…-E…->…-7…-0…-)…-"…-…-…- …-…-ÿ„-ø„-ñ„-ê„-ã„-Ü„-Õ„-΄-Ç„-À„-¹„-²„-«„-¤„-„-–„-„-ˆ„-„-z„-s„-l„-e„-^„-W„-P„-I„-B„-;„-4„--„-&„-„-„-„- „-„-üƒ-õƒ-îƒ-çƒ-àƒ-Ùƒ-Òƒ-˃-ă-½ƒ-¶ƒ-¯ƒ-¨ƒ-¡ƒ-šƒ-“ƒ-Œƒ-…ƒ-~ƒ-wƒ-pƒ-iƒ-bƒ-[ƒ-Tƒ-Mƒ-Fƒ-?ƒ-8ƒ-1ƒ-*ƒ-#ƒ-ƒ-ƒ-ƒ-ƒ-ƒ-ù‚-ò‚-ë‚-ä‚-Ý‚-Ö‚-Ï‚-È‚-Á‚-º‚-³‚-¬‚-¥‚-ž‚-—‚-‚-‰‚-‚‚-{‚-t‚-m‚-f‚-_‚-X‚-Q‚-J‚-C‚-<‚-5‚-.‚-'‚- ‚-‚-‚- ‚-‚-ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú€-ó€-ì€-å€-Þ€-×€-Ѐ-É€-€-»€-´€-­€-¦€-Ÿ€-˜€-‘€-Š€-ƒ€-|€-u€-n€-g€-`€-Y€-R€-K€-D€-=€-6€-/€-(€-!€-€-€- €-€-þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û~-ô~-í~-æ~-ß~-Ø~-Ñ~-Ê~-Ã~-¼~-µ~-®~-§~- ~-™~-’~-‹~-„~-}~-v~-o~-h~-a~-Z~-S~-L~-E~->~-7~-0~-)~-"~-~-~- ~-~-ÿ}-ø}-ñ}-ê}-ã}-Ü}-Õ}-Î}-Ç}-À}-¹}-²}-«}-¤}-}-–}-}-ˆ}-}-z}-s}-l}-e}-^}-W}-P}-I}-B}-;}-4}--}-&}-}-}-}- }-}-ü|-õ|-î|-ç|-à|-Ù|-Ò|-Ë|-Ä|-½|-¶|-¯|-¨|-¡|-š|-“|-Œ|-…|-~|-w|-p|-i|-b|-[|-T|-M|-F|-?|-8|-1|-*|-#|-|-|-|-|-|-ù{-ò{-ë{-ä{-Ý{-Ö{-Ï{-È{-Á{-º{-³{-¬{-¥{-ž{-—{-{-‰{-‚{-{{-t{-m{-f{-_{-X{-Q{-J{-C{-<{-5{-.{-'{- {-{-{- {-{-ýz-öz-ïz-èz-áz-Úz-Óz-Ìz-Åz-¾z-·z-°z-©z-¢z-›z-”z-z-†z-z-xz-qz-jz-cz-\z-Uz-Nz-Gz-@z-9z-2z-+z-$z-z-z-z-z-z-úy-óy-ìy-åy-Þy-×y-Ðy-Éy-Ây-»y-´y-­y-¦y-Ÿy-˜y-‘y-Šy-ƒy-|y-uy-ny-gy-`y-Yy-Ry-Ky-Dy-=y-6y-/y-(y-!y-y-y- y-y-þx-÷x-ðx-éx-âx-Ûx-Ôx-Íx-Æx-¿x-¸x-±x-ªx-£x-œx-•x-Žx-‡x-€x-yx-rx-kx-dx-]x-Vx-Ox-Hx-Ax-:x-3x-,x-%x-x-x-x- x-x-ûw-ôw-íw-æw-ßw-Øw-Ñw-Êw-Ãw-¼w-µw-®w-§w- w-™w-’w-‹w-„w-}w-vw-ow-hw-aw-Zw-Sw-Lw-Ew->w-7w-0w-)w-"w-w-w- w-w-ÿv-øv-ñv-êv-ãv-Üv-Õv-Îv-Çv-Àv-¹v-²v-«v-¤v-v-–v-v-ˆv-v-zv-sv-lv-ev-^v-Wv-Pv-Iv-Bv-;v-4v--v-&v-v-v-v- v-v-üu-õu-îu-çu-àu-Ùu-Òu-Ëu-Äu-½u-¶u-¯u-¨u-¡u-šu-“u-Œu-…u-~u-wu-pu-iu-bu-[u-Tu-Mu-Fu-?u-8u-1u-*u-#u-u-u-u-u-u-ùt-òt-ët-ät-Ýt-Öt-Ït-Èt-Át-ºt-³t-¬t-¥t-žt-—t-t-‰t-‚t-{t-tt-mt-ft-_t-Xt-Qt-Jt-Ct-p-7p-0p-)p-"p-p-p- p-p-ÿo-øo-ño-êo-ão-Üo-Õo-Îo-Ço-Ào-¹o-²o-«o-¤o-o-–o-o-ˆo-o-zo-so-lo-eo-^o-Wo-Po-Io-Bo-;o-4o--o-&o-o-o-o- o-o-ün-õn-în-çn-àn-Ùn-Òn-Ën-Än-½n-¶n-¯n-¨n-¡n-šn-“n-Œn-…n-~n-wn-pn-in-bn-[n-Tn-Mn-Fn-?n-8n-1n-*n-#n-n-n-n-n-n-ùm-òm-ëm-äm-Ým-Öm-Ïm-Èm-Ám-ºm-³m-¬m-¥m-žm-—m-m-‰m-‚m-{m-tm-mm-fm-_m-Xm-Qm-Jm-Cm-i-7i-0i-)i-"i-i-i- i-i-ÿh-øh-ñh-êh-ãh-Üh-Õh-Îh-Çh-Àh-¹h-²h-«h-¤h-h-–h-h-ˆh-h-zh-sh-lh-eh-^h-Wh-Ph-Ih-Bh-;h-4h--h-&h-h-h-h- h-h-üg-õg-îg-çg-àg-Ùg-Òg-Ëg-Äg-½g-¶g-¯g-¨g-¡g-šg-“g-Œg-…g-~g-wg-pg-ig-bg-[g-Tg-Mg-Fg-?g-8g-1g-*g-#g-g-g-g-g-g-ùf-òf-ëf-äf-Ýf-Öf-Ïf-Èf-Áf-ºf-³f-¬f-¥f-žf-—f-f-‰f-‚f-{f-tf-mf-ff-_f-Xf-Qf-Jf-Cf-b-7b-0b-)b-"b-b-b- b-b-ÿa-øa-ña-êa-ãa-Üa-Õa-Îa-Ça-Àa-¹a-²a-«a-¤a-a-–a-a-ˆa-a-za-sa-la-ea-^a-Wa-Pa-Ia-Ba-;a-4a--a-&a-a-a-a- a-a-ü`-õ`-î`-ç`-à`-Ù`-Ò`-Ë`-Ä`-½`-¶`-¯`-¨`-¡`-š`-“`-Œ`-…`-~`-w`-p`-i`-b`-[`-T`-M`-F`-?`-8`-1`-*`-#`-`-`-`-`-`-ù_-ò_-ë_-ä_-Ý_-Ö_-Ï_-È_-Á_-º_-³_-¬_-¥_-ž_-—_-_-‰_-‚_-{_-t_-m_-f_-__-X_-Q_-J_-C_-<_-5_-._-'_- _-_-_- _-_-ý^-ö^-ï^-è^-á^-Ú^-Ó^-Ì^-Å^-¾^-·^-°^-©^-¢^-›^-”^-^-†^-^-x^-q^-j^-c^-\^-U^-N^-G^-@^-9^-2^-+^-$^-^-^-^-^-^-ú]-ó]-ì]-å]-Þ]-×]-Ð]-É]-Â]-»]-´]-­]-¦]-Ÿ]-˜]-‘]-Š]-ƒ]-|]-u]-n]-g]-`]-Y]-R]-K]-D]-=]-6]-/]-(]-!]-]-]- ]-]-þ\-÷\-ð\-é\-â\-Û\-Ô\-Í\-Æ\-¿\-¸\-±\-ª\-£\-œ\-•\-Ž\-‡\-€\-y\-r\-k\-d\-]\-V\-O\-H\-A\-:\-3\-,\-%\-\-\-\- \-\-û[-ô[-í[-æ[-ß[-Ø[-Ñ[-Ê[-Ã[-¼[-µ[-®[-§[- [-™[-’[-‹[-„[-}[-v[-o[-h[-a[-Z[-S[-L[-E[->[-7[-0[-)[-"[-[-[- [-[-ÿZ-øZ-ñZ-êZ-ãZ-ÜZ-ÕZ-ÎZ-ÇZ-ÀZ-¹Z-²Z-«Z-¤Z-Z-–Z-Z-ˆZ-Z-zZ-sZ-lZ-eZ-^Z-WZ-PZ-IZ-BZ-;Z-4Z--Z-&Z-Z-Z-Z- Z-Z-üY-õY-îY-çY-àY-ÙY-ÒY-ËY-ÄY-½Y-¶Y-¯Y-¨Y-¡Y-šY-“Y-ŒY-…Y-~Y-wY-pY-iY-bY-[Y-TY-MY-FY-?Y-8Y-1Y-*Y-#Y-Y-Y-Y-Y-Y-ùX-òX-ëX-äX-ÝX-ÖX-ÏX-ÈX-ÁX-ºX-³X-¬X-¥X-žX-—X-X-‰X-‚X-{X-tX-mX-fX-_X-XX-QX-JX-CX-T-7T-0T-)T-"T-T-T- T-T-ÿS-øS-ñS-êS-ãS-ÜS-ÕS-ÎS-ÇS-ÀS-¹S-²S-«S-¤S-S-–S-S-ˆS-S-zS-sS-lS-eS-^S-WS-PS-IS-BS-;S-4S--S-&S-S-S-S- S-S-üR-õR-îR-çR-àR-ÙR-ÒR-ËR-ÄR-½R-¶R-¯R-¨R-¡R-šR-“R-ŒR-…R-~R-wR-pR-iR-bR-[R-TR-MR-FR-?R-8R-1R-*R-#R-R-R-R-R-R-ùQ-òQ-ëQ-äQ-ÝQ-ÖQ-ÏQ-ÈQ-ÁQ-ºQ-³Q-¬Q-¥Q-žQ-—Q-Q-‰Q-‚Q-{Q-tQ-mQ-fQ-_Q-XQ-QQ-JQ-CQ-M-7M-0M-)M-"M-M-M- M-M-ÿL-øL-ñL-êL-ãL-ÜL-ÕL-ÎL-ÇL-ÀL-¹L-²L-«L-¤L-L-–L-L-ˆL-L-zL-sL-lL-eL-^L-WL-PL-IL-BL-;L-4L--L-&L-L-L-L- L-L-üK-õK-îK-çK-àK-ÙK-ÒK-ËK-ÄK-½K-¶K-¯K-¨K-¡K-šK-“K-ŒK-…K-~K-wK-pK-iK-bK-[K-TK-MK-FK-?K-8K-1K-*K-#K-K-K-K-K-K-ùJ-òJ-ëJ-äJ-ÝJ-ÖJ-ÏJ-ÈJ-ÁJ-ºJ-³J-¬J-¥J-žJ-—J-J-‰J-‚J-{J-tJ-mJ-fJ-_J-XJ-QJ-JJ-CJ-F-7F-0F-)F-"F-F-F- F-F-ÿE-øE-ñE-êE-ãE-ÜE-ÕE-ÎE-ÇE-ÀE-¹E-²E-«E-¤E-E-–E-E-ˆE-E-zE-sE-lE-eE-^E-WE-PE-IE-BE-;E-4E--E-&E-E-E-E- E-E-üD-õD-îD-çD-àD-ÙD-ÒD-ËD-ÄD-½D-¶D-¯D-¨D-¡D-šD-“D-ŒD-…D-~D-wD-pD-iD-bD-[D-TD-MD-FD-?D-8D-1D-*D-#D-D-D-D-D-D-ùC-òC-ëC-äC-ÝC-ÖC-ÏC-ÈC-ÁC-ºC-³C-¬C-¥C-žC-—C-C-‰C-‚C-{C-tC-mC-fC-_C-XC-QC-JC-CC-?-7?-0?-)?-"?-?-?- ?-?-ÿ>-ø>-ñ>-ê>-ã>-Ü>-Õ>-Î>-Ç>-À>-¹>-²>-«>-¤>->-–>->-ˆ>->-z>-s>-l>-e>-^>-W>-P>-I>-B>-;>-4>-->-&>->->->- >->-ü=-õ=-î=-ç=-à=-Ù=-Ò=-Ë=-Ä=-½=-¶=-¯=-¨=-¡=-š=-“=-Œ=-…=-~=-w=-p=-i=-b=-[=-T=-M=-F=-?=-8=-1=-*=-#=-=-=-=-=-=-ù<-ò<-ë<-ä<-Ý<-Ö<-Ï<-È<-Á<-º<-³<-¬<-¥<-ž<-—<-<-‰<-‚<-{<-t<-m<-f<-_<-X<-Q<-J<-C<-<<-5<-.<-'<- <-<-<- <-<-ý;-ö;-ï;-è;-á;-Ú;-Ó;-Ì;-Å;-¾;-·;-°;-©;-¢;-›;-”;-;-†;-;-x;-q;-j;-c;-\;-U;-N;-G;-@;-9;-2;-+;-$;-;-;-;-;-;-ú:-ó:-ì:-å:-Þ:-×:-Ð:-É:-Â:-»:-´:-­:-¦:-Ÿ:-˜:-‘:-Š:-ƒ:-|:-u:-n:-g:-`:-Y:-R:-K:-D:-=:-6:-/:-(:-!:-:-:- :-:-þ9-÷9-ð9-é9-â9-Û9-Ô9-Í9-Æ9-¿9-¸9-±9-ª9-£9-œ9-•9-Ž9-‡9-€9-y9-r9-k9-d9-]9-V9-O9-H9-A9-:9-39-,9-%9-9-9-9- 9-9-û8-ô8-í8-æ8-ß8-Ø8-Ñ8-Ê8-Ã8-¼8-µ8-®8-§8- 8-™8-’8-‹8-„8-}8-v8-o8-h8-a8-Z8-S8-L8-E8->8-78-08-)8-"8-8-8- 8-8-ÿ7-ø7-ñ7-ê7-ã7-Ü7-Õ7-Î7-Ç7-À7-¹7-²7-«7-¤7-7-–7-7-ˆ7-7-z7-s7-l7-e7-^7-W7-P7-I7-B7-;7-47--7-&7-7-7-7- 7-7-ü6-õ6-î6-ç6-à6-Ù6-Ò6-Ë6-Ä6-½6-¶6-¯6-¨6-¡6-š6-“6-Œ6-…6-~6-w6-p6-i6-b6-[6-T6-M6-F6-?6-86-16-*6-#6-6-6-6-6-6-ù5-ò5-ë5-ä5-Ý5-Ö5-Ï5-È5-Á5-º5-³5-¬5-¥5-ž5-—5-5-‰5-‚5-{5-t5-m5-f5-_5-X5-Q5-J5-C5-<5-55-.5-'5- 5-5-5- 5-5-ý4-ö4-ï4-è4-á4-Ú4-Ó4-Ì4-Å4-¾4-·4-°4-©4-¢4-›4-”4-4-†4-4-x4-q4-j4-c4-\4-U4-N4-G4-@4-94-24-+4-$4-4-4-4-4-4-ú3-ó3-ì3-å3-Þ3-×3-Ð3-É3-Â3-»3-´3-­3-¦3-Ÿ3-˜3-‘3-Š3-ƒ3-|3-u3-n3-g3-`3-Y3-R3-K3-D3-=3-63-/3-(3-!3-3-3- 3-3-þ2-÷2-ð2-é2-â2-Û2-Ô2-Í2-Æ2-¿2-¸2-±2-ª2-£2-œ2-•2-Ž2-‡2-€2-y2-r2-k2-d2-]2-V2-O2-H2-A2-:2-32-,2-%2-2-2-2- 2-2-û1-ô1-í1-æ1-ß1-Ø1-Ñ1-Ê1-Ã1-¼1-µ1-®1-§1- 1-™1-’1-‹1-„1-}1-v1-o1-h1-a1-Z1-S1-L1-E1->1-71-01-)1-"1-1-1- 1-1-ÿ0-ø0-ñ0-ê0-ã0-Ü0-Õ0-Î0-Ç0-À0-¹0-²0-«0-¤0-0-–0-0-ˆ0-0-z0-s0-l0-e0-^0-W0-P0-I0-B0-;0-40--0-&0-0-0-0- 0-0-ü/-õ/-î/-ç/-à/-Ù/-Ò/-Ë/-Ä/-½/-¶/-¯/-¨/-¡/-š/-“/-Œ/-…/-~/-w/-p/-i/-b/-[/-T/-M/-F/-?/-8/-1/-*/-#/-/-/-/-/-/-ù.-ò.-ë.-ä.-Ý.-Ö.-Ï.-È.-Á.-º.-³.-¬.-¥.-ž.-—.-.-‰.-‚.-{.-t.-m.-f.-_.-X.-Q.-J.-C.-<.-5.-..-'.- .-.-.- .-.-ý--ö--ï--è--á--Ú--Ó--Ì--Å--¾--·--°--©--¢--›--”----†----x--q--j--c--\--U--N--G--@--9--2--+--$------------ú,-ó,-ì,-å,-Þ,-×,-Ð,-É,-Â,-»,-´,-­,-¦,-Ÿ,-˜,-‘,-Š,-ƒ,-|,-u,-n,-g,-`,-Y,-R,-K,-D,-=,-6,-/,-(,-!,-,-,- ,-,-þ+-÷+-ð+-é+-â+-Û+-Ô+-Í+-Æ+-¿+-¸+-±+-ª+-£+-œ+-•+-Ž+-‡+-€+-y+-r+-k+-d+-]+-V+-O+-H+-A+-:+-3+-,+-%+-+-+-+- +-+-û*-ô*-í*-æ*-ß*-Ø*-Ñ*-Ê*-Ã*-¼*-µ*-®*-§*- *-™*-’*-‹*-„*-}*-v*-o*-h*-a*-Z*-S*-L*-E*->*-7*-0*-)*-"*-*-*- *-*-ÿ)-ø)-ñ)-ê)-ã)-Ü)-Õ)-Î)-Ç)-À)-¹)-²)-«)-¤)-)-–)-)-ˆ)-)-z)-s)-l)-e)-^)-W)-P)-I)-B)-;)-4)--)-&)-)-)-)- )-)-ü(-õ(-î(-ç(-à(-Ù(-Ò(-Ë(-Ä(-½(-¶(-¯(-¨(-¡(-š(-“(-Œ(-…(-~(-w(-p(-i(-b(-[(-T(-M(-F(-?(-8(-1(-*(-#(-(-(-(-(-(-ù'-ò'-ë'-ä'-Ý'-Ö'-Ï'-È'-Á'-º'-³'-¬'-¥'-ž'-—'-'-‰'-‚'-{'-t'-m'-f'-_'-X'-Q'-J'-C'-<'-5'-.'-''- '-'-'- '-'-ý&-ö&-ï&-è&-á&-Ú&-Ó&-Ì&-Å&-¾&-·&-°&-©&-¢&-›&-”&-&-†&-&-x&-q&-j&-c&-\&-U&-N&-G&-@&-9&-2&-+&-$&-&-&-&-&-&-ú%-ó%-ì%-å%-Þ%-×%-Ð%-É%-Â%-»%-´%-­%-¦%-Ÿ%-˜%-‘%-Š%-ƒ%-|%-u%-n%-g%-`%-Y%-R%-K%-D%-=%-6%-/%-(%-!%-%-%- %-%-þ$-÷$-ð$-é$-â$-Û$-Ô$-Í$-Æ$-¿$-¸$-±$-ª$-£$-œ$-•$-Ž$-‡$-€$-y$-r$-k$-d$-]$-V$-O$-H$-A$-:$-3$-,$-%$-$-$-$- $-$-û#-ô#-í#-æ#-ß#-Ø#-Ñ#-Ê#-Ã#-¼#-µ#-®#-§#- #-™#-’#-‹#-„#-}#-v#-o#-h#-a#-Z#-S#-L#-E#->#-7#-0#-)#-"#-#-#- #-#-ÿ"-ø"-ñ"-ê"-ã"-Ü"-Õ"-Î"-Ç"-À"-¹"-²"-«"-¤"-"-–"-"-ˆ"-"-z"-s"-l"-e"-^"-W"-P"-I"-B"-;"-4"--"-&"-"-"-"- "-"-ü!-õ!-î!-ç!-à!-Ù!-Ò!-Ë!-Ä!-½!-¶!-¯!-¨!-¡!-š!-“!-Œ!-…!-~!-w!-p!-i!-b!-[!-T!-M!-F!-?!-8!-1!-*!-#!-!-!-!-!-!-ù -ò -ë -ä -Ý -Ö -Ï -È -Á -º -³ -¬ -¥ -ž -— - -‰ -‚ -{ -t -m -f -_ -X -Q -J -C -< -5 -. -' - - - - - -ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú-ó-ì-å-Þ-×-Ð-É-Â-»-´-­-¦-Ÿ-˜-‘-Š-ƒ-|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- --þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú-ó-ì-å-Þ-×-Ð-É-Â-»-´-­-¦-Ÿ-˜-‘-Š-ƒ-|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- --þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú-ó-ì-å-Þ-×-Ð-É-Â-»-´-­-¦-Ÿ-˜-‘-Š-ƒ-|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- --þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ -ø -ñ -ê -ã -Ü -Õ -Î -Ç -À -¹ -² -« -¤ - -– - -ˆ - -z -s -l -e -^ -W -P -I -B -; -4 -- -& - - - - - -ü -õ -î -ç -à -Ù -Ò -Ë -Ä -½ -¶ -¯ -¨ -¡ -š -“ -Œ -… -~ -w -p -i -b -[ -T -M -F -? -8 -1 -* -# - - - - - -ù -ò -ë -ä -Ý -Ö -Ï -È -Á -º -³ -¬ -¥ -ž -— - -‰ -‚ -{ -t -m -f -_ -X -Q -J -C -< -5 -. -' - - - - - -ý -ö -ï -è -á -Ú -Ó -Ì -Å -¾ -· -° -© -¢ -› -” - -† - -x -q -j -c -\ -U -N -G -@ -9 -2 -+ -$ - - - - - -ú -ó -ì -å -Þ -× -Ð -É - -» -´ -­ -¦ -Ÿ -˜ -‘ -Š -ƒ -| -u -n -g -` -Y -R -K -D -= -6 -/ -( -! - - - - -þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú-ó-ì-å-Þ-×-Ð-É-Â-»-´-­-¦-Ÿ-˜-‘-Š-ƒ-|-u-n-g-`-Y-R-K-D-=-6-/-(-!--- --þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿÿ,øÿ,ñÿ,êÿ,ãÿ,Üÿ,Õÿ,Îÿ,Çÿ,Àÿ,¹ÿ,²ÿ,«ÿ,¤ÿ,ÿ,–ÿ,ÿ,ˆÿ,ÿ,zÿ,sÿ,lÿ,eÿ,^ÿ,Wÿ,Pÿ,Iÿ,Bÿ,;ÿ,4ÿ,-ÿ,&ÿ,ÿ,ÿ,ÿ, ÿ,ÿ,üþ,õþ,îþ,çþ,àþ,Ùþ,Òþ,Ëþ,Äþ,½þ,¶þ,¯þ,¨þ,¡þ,šþ,“þ,Œþ,…þ,~þ,wþ,pþ,iþ,bþ,[þ,Tþ,Mþ,Fþ,?þ,8þ,1þ,*þ,#þ,þ,þ,þ,þ,þ,ùý,òý,ëý,äý,Ýý,Öý,Ïý,Èý,Áý,ºý,³ý,¬ý,¥ý,žý,—ý,ý,‰ý,‚ý,{ý,tý,mý,fý,_ý,Xý,Qý,Jý,Cý,<ý,5ý,.ý,'ý, ý,ý,ý, ý,ý,ýü,öü,ïü,èü,áü,Úü,Óü,Ìü,Åü,¾ü,·ü,°ü,©ü,¢ü,›ü,”ü,ü,†ü,ü,xü,qü,jü,cü,\ü,Uü,Nü,Gü,@ü,9ü,2ü,+ü,$ü,ü,ü,ü,ü,ü,úû,óû,ìû,åû,Þû,×û,Ðû,Éû,Âû,»û,´û,­û,¦û,Ÿû,˜û,‘û,Šû,ƒû,|û,uû,nû,gû,`û,Yû,Rû,Kû,Dû,=û,6û,/û,(û,!û,û,û, û,û,þú,÷ú,ðú,éú,âú,Ûú,Ôú,Íú,Æú,¿ú,¸ú,±ú,ªú,£ú,œú,•ú,Žú,‡ú,€ú,yú,rú,kú,dú,]ú,Vú,Oú,Hú,Aú,:ú,3ú,,ú,%ú,ú,ú,ú, ú,ú,ûù,ôù,íù,æù,ßù,Øù,Ñù,Êù,Ãù,¼ù,µù,®ù,§ù, ù,™ù,’ù,‹ù,„ù,}ù,vù,où,hù,aù,Zù,Sù,Lù,Eù,>ù,7ù,0ù,)ù,"ù,ù,ù, ù,ù,ÿø,øø,ñø,êø,ãø,Üø,Õø,Îø,Çø,Àø,¹ø,²ø,«ø,¤ø,ø,–ø,ø,ˆø,ø,zø,sø,lø,eø,^ø,Wø,Pø,Iø,Bø,;ø,4ø,-ø,&ø,ø,ø,ø, ø,ø,ü÷,õ÷,î÷,ç÷,à÷,Ù÷,Ò÷,Ë÷,Ä÷,½÷,¶÷,¯÷,¨÷,¡÷,š÷,“÷,Œ÷,…÷,~÷,w÷,p÷,i÷,b÷,[÷,T÷,M÷,F÷,?÷,8÷,1÷,*÷,#÷,÷,÷,÷,÷,÷,ùö,òö,ëö,äö,Ýö,Öö,Ïö,Èö,Áö,ºö,³ö,¬ö,¥ö,žö,—ö,ö,‰ö,‚ö,{ö,tö,mö,fö,_ö,Xö,Qö,Jö,Cö,<ö,5ö,.ö,'ö, ö,ö,ö, ö,ö,ýõ,öõ,ïõ,èõ,áõ,Úõ,Óõ,Ìõ,Åõ,¾õ,·õ,°õ,©õ,¢õ,›õ,”õ,õ,†õ,õ,xõ,qõ,jõ,cõ,\õ,Uõ,Nõ,Gõ,@õ,9õ,2õ,+õ,$õ,õ,õ,õ,õ,õ,úô,óô,ìô,åô,Þô,×ô,Ðô,Éô,Âô,»ô,´ô,­ô,¦ô,Ÿô,˜ô,‘ô,Šô,ƒô,|ô,uô,nô,gô,`ô,Yô,Rô,Kô,Dô,=ô,6ô,/ô,(ô,!ô,ô,ô, ô,ô,þó,÷ó,ðó,éó,âó,Ûó,Ôó,Íó,Æó,¿ó,¸ó,±ó,ªó,£ó,œó,•ó,Žó,‡ó,€ó,yó,ró,kó,dó,]ó,Vó,Oó,Hó,Aó,:ó,3ó,,ó,%ó,ó,ó,ó, ó,ó,ûò,ôò,íò,æò,ßò,Øò,Ñò,Êò,Ãò,¼ò,µò,®ò,§ò, ò,™ò,’ò,‹ò,„ò,}ò,vò,oò,hò,aò,Zò,Sò,Lò,Eò,>ò,7ò,0ò,)ò,"ò,ò,ò, ò,ò,ÿñ,øñ,ññ,êñ,ãñ,Üñ,Õñ,Îñ,Çñ,Àñ,¹ñ,²ñ,«ñ,¤ñ,ñ,–ñ,ñ,ˆñ,ñ,zñ,sñ,lñ,eñ,^ñ,Wñ,Pñ,Iñ,Bñ,;ñ,4ñ,-ñ,&ñ,ñ,ñ,ñ, ñ,ñ,üð,õð,îð,çð,àð,Ùð,Òð,Ëð,Äð,½ð,¶ð,¯ð,¨ð,¡ð,šð,“ð,Œð,…ð,~ð,wð,pð,ið,bð,[ð,Tð,Mð,Fð,?ð,8ð,1ð,*ð,#ð,ð,ð,ð,ð,ð,ùï,òï,ëï,äï,Ýï,Öï,Ïï,Èï,Áï,ºï,³ï,¬ï,¥ï,žï,—ï,ï,‰ï,‚ï,{ï,tï,mï,fï,_ï,Xï,Qï,Jï,Cï,<ï,5ï,.ï,'ï, ï,ï,ï, ï,ï,ýî,öî,ïî,èî,áî,Úî,Óî,Ìî,Åî,¾î,·î,°î,©î,¢î,›î,”î,î,†î,î,xî,qî,jî,cî,\î,Uî,Nî,Gî,@î,9î,2î,+î,$î,î,î,î,î,î,úí,óí,ìí,åí,Þí,×í,Ðí,Éí,Âí,»í,´í,­í,¦í,Ÿí,˜í,‘í,Ší,ƒí,|í,uí,ní,gí,`í,Yí,Rí,Kí,Dí,=í,6í,/í,(í,!í,í,í, í,í,þì,÷ì,ðì,éì,âì,Ûì,Ôì,Íì,Æì,¿ì,¸ì,±ì,ªì,£ì,œì,•ì,Žì,‡ì,€ì,yì,rì,kì,dì,]ì,Vì,Oì,Hì,Aì,:ì,3ì,,ì,%ì,ì,ì,ì, ì,ì,ûë,ôë,íë,æë,ßë,Øë,Ñë,Êë,Ãë,¼ë,µë,®ë,§ë, ë,™ë,’ë,‹ë,„ë,}ë,vë,oë,hë,aë,Zë,Së,Lë,Eë,>ë,7ë,0ë,)ë,"ë,ë,ë, ë,ë,ÿê,øê,ñê,êê,ãê,Üê,Õê,Îê,Çê,Àê,¹ê,²ê,«ê,¤ê,ê,–ê,ê,ˆê,ê,zê,sê,lê,eê,^ê,Wê,Pê,Iê,Bê,;ê,4ê,-ê,&ê,ê,ê,ê, ê,ê,üé,õé,îé,çé,àé,Ùé,Òé,Ëé,Äé,½é,¶é,¯é,¨é,¡é,šé,“é,Œé,…é,~é,wé,pé,ié,bé,[é,Té,Mé,Fé,?é,8é,1é,*é,#é,é,é,é,é,é,ùè,òè,ëè,äè,Ýè,Öè,Ïè,Èè,Áè,ºè,³è,¬è,¥è,žè,—è,è,‰è,‚è,{è,tè,mè,fè,_è,Xè,Qè,Jè,Cè,<è,5è,.è,'è, è,è,è, è,è,ýç,öç,ïç,èç,áç,Úç,Óç,Ìç,Åç,¾ç,·ç,°ç,©ç,¢ç,›ç,”ç,ç,†ç,ç,xç,qç,jç,cç,\ç,Uç,Nç,Gç,@ç,9ç,2ç,+ç,$ç,ç,ç,ç,ç,ç,úæ,óæ,ìæ,åæ,Þæ,׿,Ðæ,Éæ,Âæ,»æ,´æ,­æ,¦æ,Ÿæ,˜æ,‘æ,Šæ,ƒæ,|æ,uæ,næ,gæ,`æ,Yæ,Ræ,Kæ,Dæ,=æ,6æ,/æ,(æ,!æ,æ,æ, æ,æ,þå,÷å,ðå,éå,âå,Ûå,Ôå,Íå,Æå,¿å,¸å,±å,ªå,£å,œå,•å,Žå,‡å,€å,yå,rå,kå,då,]å,Vå,Oå,Hå,Aå,:å,3å,,å,%å,å,å,å, å,å,ûä,ôä,íä,æä,ßä,Øä,Ñä,Êä,Ãä,¼ä,µä,®ä,§ä, ä,™ä,’ä,‹ä,„ä,}ä,vä,oä,hä,aä,Zä,Sä,Lä,Eä,>ä,7ä,0ä,)ä,"ä,ä,ä, ä,ä,ÿã,øã,ñã,êã,ãã,Üã,Õã,Îã,Çã,Àã,¹ã,²ã,«ã,¤ã,ã,–ã,ã,ˆã,ã,zã,sã,lã,eã,^ã,Wã,Pã,Iã,Bã,;ã,4ã,-ã,&ã,ã,ã,ã, ã,ã,üâ,õâ,îâ,çâ,àâ,Ùâ,Òâ,Ëâ,Äâ,½â,¶â,¯â,¨â,¡â,šâ,“â,Œâ,…â,~â,wâ,pâ,iâ,bâ,[â,Tâ,Mâ,Fâ,?â,8â,1â,*â,#â,â,â,â,â,â,ùá,òá,ëá,äá,Ýá,Öá,Ïá,Èá,Áá,ºá,³á,¬á,¥á,žá,—á,á,‰á,‚á,{á,tá,má,fá,_á,Xá,Qá,Já,Cá,<á,5á,.á,'á, á,á,á, á,á,ýà,öà,ïà,èà,áà,Úà,Óà,Ìà,Åà,¾à,·à,°à,©à,¢à,›à,”à,à,†à,à,xà,qà,jà,cà,\à,Uà,Nà,Gà,@à,9à,2à,+à,$à,à,à,à,à,à,úß,óß,ìß,åß,Þß,×ß,Ðß,Éß,Âß,»ß,´ß,­ß,¦ß,Ÿß,˜ß,‘ß,Šß,ƒß,|ß,uß,nß,gß,`ß,Yß,Rß,Kß,Dß,=ß,6ß,/ß,(ß,!ß,ß,ß, ß,ß,þÞ,÷Þ,ðÞ,éÞ,âÞ,ÛÞ,ÔÞ,ÍÞ,ÆÞ,¿Þ,¸Þ,±Þ,ªÞ,£Þ,œÞ,•Þ,ŽÞ,‡Þ,€Þ,yÞ,rÞ,kÞ,dÞ,]Þ,VÞ,OÞ,HÞ,AÞ,:Þ,3Þ,,Þ,%Þ,Þ,Þ,Þ, Þ,Þ,ûÝ,ôÝ,íÝ,æÝ,ßÝ,ØÝ,ÑÝ,ÊÝ,ÃÝ,¼Ý,µÝ,®Ý,§Ý, Ý,™Ý,’Ý,‹Ý,„Ý,}Ý,vÝ,oÝ,hÝ,aÝ,ZÝ,SÝ,LÝ,EÝ,>Ý,7Ý,0Ý,)Ý,"Ý,Ý,Ý, Ý,Ý,ÿÜ,øÜ,ñÜ,êÜ,ãÜ,ÜÜ,ÕÜ,ÎÜ,ÇÜ,ÀÜ,¹Ü,²Ü,«Ü,¤Ü,Ü,–Ü,Ü,ˆÜ,Ü,zÜ,sÜ,lÜ,eÜ,^Ü,WÜ,PÜ,IÜ,BÜ,;Ü,4Ü,-Ü,&Ü,Ü,Ü,Ü, Ü,Ü,üÛ,õÛ,îÛ,çÛ,àÛ,ÙÛ,ÒÛ,ËÛ,ÄÛ,½Û,¶Û,¯Û,¨Û,¡Û,šÛ,“Û,ŒÛ,…Û,~Û,wÛ,pÛ,iÛ,bÛ,[Û,TÛ,MÛ,FÛ,?Û,8Û,1Û,*Û,#Û,Û,Û,Û,Û,Û,ùÚ,òÚ,ëÚ,äÚ,ÝÚ,ÖÚ,ÏÚ,ÈÚ,ÁÚ,ºÚ,³Ú,¬Ú,¥Ú,žÚ,—Ú,Ú,‰Ú,‚Ú,{Ú,tÚ,mÚ,fÚ,_Ú,XÚ,QÚ,JÚ,CÚ,<Ú,5Ú,.Ú,'Ú, Ú,Ú,Ú, Ú,Ú,ýÙ,öÙ,ïÙ,èÙ,áÙ,ÚÙ,ÓÙ,ÌÙ,ÅÙ,¾Ù,·Ù,°Ù,©Ù,¢Ù,›Ù,”Ù,Ù,†Ù,Ù,xÙ,qÙ,jÙ,cÙ,\Ù,UÙ,NÙ,GÙ,@Ù,9Ù,2Ù,+Ù,$Ù,Ù,Ù,Ù,Ù,Ù,úØ,óØ,ìØ,åØ,ÞØ,ר,ÐØ,ÉØ,ÂØ,»Ø,´Ø,­Ø,¦Ø,ŸØ,˜Ø,‘Ø,ŠØ,ƒØ,|Ø,uØ,nØ,gØ,`Ø,YØ,RØ,KØ,DØ,=Ø,6Ø,/Ø,(Ø,!Ø,Ø,Ø, Ø,Ø,þ×,÷×,ð×,é×,â×,Û×,Ô×,Í×,Æ×,¿×,¸×,±×,ª×,£×,œ×,•×,Ž×,‡×,€×,y×,r×,k×,d×,]×,V×,O×,H×,A×,:×,3×,,×,%×,×,×,×, ×,×,ûÖ,ôÖ,íÖ,æÖ,ßÖ,ØÖ,ÑÖ,ÊÖ,ÃÖ,¼Ö,µÖ,®Ö,§Ö, Ö,™Ö,’Ö,‹Ö,„Ö,}Ö,vÖ,oÖ,hÖ,aÖ,ZÖ,SÖ,LÖ,EÖ,>Ö,7Ö,0Ö,)Ö,"Ö,Ö,Ö, Ö,Ö,ÿÕ,øÕ,ñÕ,êÕ,ãÕ,ÜÕ,ÕÕ,ÎÕ,ÇÕ,ÀÕ,¹Õ,²Õ,«Õ,¤Õ,Õ,–Õ,Õ,ˆÕ,Õ,zÕ,sÕ,lÕ,eÕ,^Õ,WÕ,PÕ,IÕ,BÕ,;Õ,4Õ,-Õ,&Õ,Õ,Õ,Õ, Õ,Õ,üÔ,õÔ,îÔ,çÔ,àÔ,ÙÔ,ÒÔ,ËÔ,ÄÔ,½Ô,¶Ô,¯Ô,¨Ô,¡Ô,šÔ,“Ô,ŒÔ,…Ô,~Ô,wÔ,pÔ,iÔ,bÔ,[Ô,TÔ,MÔ,FÔ,?Ô,8Ô,1Ô,*Ô,#Ô,Ô,Ô,Ô,Ô,Ô,ùÓ,òÓ,ëÓ,äÓ,ÝÓ,ÖÓ,ÏÓ,ÈÓ,ÁÓ,ºÓ,³Ó,¬Ó,¥Ó,žÓ,—Ó,Ó,‰Ó,‚Ó,{Ó,tÓ,mÓ,fÓ,_Ó,XÓ,QÓ,JÓ,CÓ,<Ó,5Ó,.Ó,'Ó, Ó,Ó,Ó, Ó,Ó,ýÒ,öÒ,ïÒ,èÒ,áÒ,ÚÒ,ÓÒ,ÌÒ,ÅÒ,¾Ò,·Ò,°Ò,©Ò,¢Ò,›Ò,”Ò,Ò,†Ò,Ò,xÒ,qÒ,jÒ,cÒ,\Ò,UÒ,NÒ,GÒ,@Ò,9Ò,2Ò,+Ò,$Ò,Ò,Ò,Ò,Ò,Ò,úÑ,óÑ,ìÑ,åÑ,ÞÑ,×Ñ,ÐÑ,ÉÑ,ÂÑ,»Ñ,´Ñ,­Ñ,¦Ñ,ŸÑ,˜Ñ,‘Ñ,ŠÑ,ƒÑ,|Ñ,uÑ,nÑ,gÑ,`Ñ,YÑ,RÑ,KÑ,DÑ,=Ñ,6Ñ,/Ñ,(Ñ,!Ñ,Ñ,Ñ, Ñ,Ñ,þÐ,÷Ð,ðÐ,éÐ,âÐ,ÛÐ,ÔÐ,ÍÐ,ÆÐ,¿Ð,¸Ð,±Ð,ªÐ,£Ð,œÐ,•Ð,ŽÐ,‡Ð,€Ð,yÐ,rÐ,kÐ,dÐ,]Ð,VÐ,OÐ,HÐ,AÐ,:Ð,3Ð,,Ð,%Ð,Ð,Ð,Ð, Ð,Ð,ûÏ,ôÏ,íÏ,æÏ,ßÏ,ØÏ,ÑÏ,ÊÏ,ÃÏ,¼Ï,µÏ,®Ï,§Ï, Ï,™Ï,’Ï,‹Ï,„Ï,}Ï,vÏ,oÏ,hÏ,aÏ,ZÏ,SÏ,LÏ,EÏ,>Ï,7Ï,0Ï,)Ï,"Ï,Ï,Ï, Ï,Ï,ÿÎ,øÎ,ñÎ,êÎ,ãÎ,ÜÎ,ÕÎ,ÎÎ,ÇÎ,ÀÎ,¹Î,²Î,«Î,¤Î,Î,–Î,Î,ˆÎ,Î,zÎ,sÎ,lÎ,eÎ,^Î,WÎ,PÎ,IÎ,BÎ,;Î,4Î,-Î,&Î,Î,Î,Î, Î,Î,üÍ,õÍ,îÍ,çÍ,àÍ,ÙÍ,ÒÍ,ËÍ,ÄÍ,½Í,¶Í,¯Í,¨Í,¡Í,šÍ,“Í,ŒÍ,…Í,~Í,wÍ,pÍ,iÍ,bÍ,[Í,TÍ,MÍ,FÍ,?Í,8Í,1Í,*Í,#Í,Í,Í,Í,Í,Í,ùÌ,òÌ,ëÌ,äÌ,ÝÌ,ÖÌ,ÏÌ,ÈÌ,ÁÌ,ºÌ,³Ì,¬Ì,¥Ì,žÌ,—Ì,Ì,‰Ì,‚Ì,{Ì,tÌ,mÌ,fÌ,_Ì,XÌ,QÌ,JÌ,CÌ,<Ì,5Ì,.Ì,'Ì, Ì,Ì,Ì, Ì,Ì,ýË,öË,ïË,èË,áË,ÚË,ÓË,ÌË,ÅË,¾Ë,·Ë,°Ë,©Ë,¢Ë,›Ë,”Ë,Ë,†Ë,Ë,xË,qË,jË,cË,\Ë,UË,NË,GË,@Ë,9Ë,2Ë,+Ë,$Ë,Ë,Ë,Ë,Ë,Ë,úÊ,óÊ,ìÊ,åÊ,ÞÊ,×Ê,ÐÊ,ÉÊ,ÂÊ,»Ê,´Ê,­Ê,¦Ê,ŸÊ,˜Ê,‘Ê,ŠÊ,ƒÊ,|Ê,uÊ,nÊ,gÊ,`Ê,YÊ,RÊ,KÊ,DÊ,=Ê,6Ê,/Ê,(Ê,!Ê,Ê,Ê, Ê,Ê,þÉ,÷É,ðÉ,éÉ,âÉ,ÛÉ,ÔÉ,ÍÉ,ÆÉ,¿É,¸É,±É,ªÉ,£É,œÉ,•É,ŽÉ,‡É,€É,yÉ,rÉ,kÉ,dÉ,]É,VÉ,OÉ,HÉ,AÉ,:É,3É,,É,%É,É,É,É, É,É,ûÈ,ôÈ,íÈ,æÈ,ßÈ,ØÈ,ÑÈ,ÊÈ,ÃÈ,¼È,µÈ,®È,§È, È,™È,’È,‹È,„È,}È,vÈ,oÈ,hÈ,aÈ,ZÈ,SÈ,LÈ,EÈ,>È,7È,0È,)È,"È,È,È, È,È,ÿÇ,øÇ,ñÇ,êÇ,ãÇ,ÜÇ,ÕÇ,ÎÇ,ÇÇ,ÀÇ,¹Ç,²Ç,«Ç,¤Ç,Ç,–Ç,Ç,ˆÇ,Ç,zÇ,sÇ,lÇ,eÇ,^Ç,WÇ,PÇ,IÇ,BÇ,;Ç,4Ç,-Ç,&Ç,Ç,Ç,Ç, Ç,Ç,üÆ,õÆ,îÆ,çÆ,àÆ,ÙÆ,ÒÆ,ËÆ,ÄÆ,½Æ,¶Æ,¯Æ,¨Æ,¡Æ,šÆ,“Æ,ŒÆ,…Æ,~Æ,wÆ,pÆ,iÆ,bÆ,[Æ,TÆ,MÆ,FÆ,?Æ,8Æ,1Æ,*Æ,#Æ,Æ,Æ,Æ,Æ,Æ,ùÅ,òÅ,ëÅ,äÅ,ÝÅ,ÖÅ,ÏÅ,ÈÅ,ÁÅ,ºÅ,³Å,¬Å,¥Å,žÅ,—Å,Å,‰Å,‚Å,{Å,tÅ,mÅ,fÅ,_Å,XÅ,QÅ,JÅ,CÅ,<Å,5Å,.Å,'Å, Å,Å,Å, Å,Å,ýÄ,öÄ,ïÄ,èÄ,áÄ,ÚÄ,ÓÄ,ÌÄ,ÅÄ,¾Ä,·Ä,°Ä,©Ä,¢Ä,›Ä,”Ä,Ä,†Ä,Ä,xÄ,qÄ,jÄ,cÄ,\Ä,UÄ,NÄ,GÄ,@Ä,9Ä,2Ä,+Ä,$Ä,Ä,Ä,Ä,Ä,Ä,úÃ,óÃ,ìÃ,åÃ,ÞÃ,×Ã,ÐÃ,ÉÃ,ÂÃ,»Ã,´Ã,­Ã,¦Ã,ŸÃ,˜Ã,‘Ã,ŠÃ,ƒÃ,|Ã,uÃ,nÃ,gÃ,`Ã,YÃ,RÃ,KÃ,DÃ,=Ã,6Ã,/Ã,(Ã,!Ã,Ã,Ã, Ã,Ã,þÂ,÷Â,ðÂ,éÂ,âÂ,ÛÂ,ÔÂ,ÍÂ,ÆÂ,¿Â,¸Â,±Â,ªÂ,£Â,œÂ,•Â,ŽÂ,‡Â,€Â,yÂ,rÂ,kÂ,dÂ,]Â,VÂ,OÂ,HÂ,AÂ,:Â,3Â,,Â,%Â,Â,Â,Â, Â,Â,ûÁ,ôÁ,íÁ,æÁ,ßÁ,ØÁ,ÑÁ,ÊÁ,ÃÁ,¼Á,µÁ,®Á,§Á, Á,™Á,’Á,‹Á,„Á,}Á,vÁ,oÁ,hÁ,aÁ,ZÁ,SÁ,LÁ,EÁ,>Á,7Á,0Á,)Á,"Á,Á,Á, Á,Á,ÿÀ,øÀ,ñÀ,êÀ,ãÀ,ÜÀ,ÕÀ,ÎÀ,ÇÀ,ÀÀ,¹À,²À,«À,¤À,À,–À,À,ˆÀ,À,zÀ,sÀ,lÀ,eÀ,^À,WÀ,PÀ,IÀ,BÀ,;À,4À,-À,&À,À,À,À, À,À,ü¿,õ¿,î¿,ç¿,à¿,Ù¿,Ò¿,Ë¿,Ä¿,½¿,¶¿,¯¿,¨¿,¡¿,š¿,“¿,Œ¿,…¿,~¿,w¿,p¿,i¿,b¿,[¿,T¿,M¿,F¿,?¿,8¿,1¿,*¿,#¿,¿,¿,¿,¿,¿,ù¾,ò¾,ë¾,ä¾,ݾ,Ö¾,Ͼ,Ⱦ,Á¾,º¾,³¾,¬¾,¥¾,ž¾,—¾,¾,‰¾,‚¾,{¾,t¾,m¾,f¾,_¾,X¾,Q¾,J¾,C¾,<¾,5¾,.¾,'¾, ¾,¾,¾, ¾,¾,ý½,ö½,ï½,è½,á½,Ú½,Ó½,̽,Ž,¾½,·½,°½,©½,¢½,›½,”½,½,†½,½,x½,q½,j½,c½,\½,U½,N½,G½,@½,9½,2½,+½,$½,½,½,½,½,½,ú¼,ó¼,ì¼,å¼,Þ¼,×¼,м,ɼ,¼,»¼,´¼,­¼,¦¼,Ÿ¼,˜¼,‘¼,м,ƒ¼,|¼,u¼,n¼,g¼,`¼,Y¼,R¼,K¼,D¼,=¼,6¼,/¼,(¼,!¼,¼,¼, ¼,¼,þ»,÷»,ð»,é»,â»,Û»,Ô»,Í»,Æ»,¿»,¸»,±»,ª»,£»,œ»,•»,Ž»,‡»,€»,y»,r»,k»,d»,]»,V»,O»,H»,A»,:»,3»,,»,%»,»,»,», »,»,ûº,ôº,íº,æº,ߺ,غ,Ѻ,ʺ,ú,¼º,µº,®º,§º, º,™º,’º,‹º,„º,}º,vº,oº,hº,aº,Zº,Sº,Lº,Eº,>º,7º,0º,)º,"º,º,º, º,º,ÿ¹,ø¹,ñ¹,ê¹,ã¹,ܹ,Õ¹,ι,ǹ,À¹,¹¹,²¹,«¹,¤¹,¹,–¹,¹,ˆ¹,¹,z¹,s¹,l¹,e¹,^¹,W¹,P¹,I¹,B¹,;¹,4¹,-¹,&¹,¹,¹,¹, ¹,¹,ü¸,õ¸,î¸,ç¸,à¸,Ù¸,Ò¸,˸,ĸ,½¸,¶¸,¯¸,¨¸,¡¸,š¸,“¸,Œ¸,…¸,~¸,w¸,p¸,i¸,b¸,[¸,T¸,M¸,F¸,?¸,8¸,1¸,*¸,#¸,¸,¸,¸,¸,¸,ù·,ò·,ë·,ä·,Ý·,Ö·,Ï·,È·,Á·,º·,³·,¬·,¥·,ž·,—·,·,‰·,‚·,{·,t·,m·,f·,_·,X·,Q·,J·,C·,<·,5·,.·,'·, ·,·,·, ·,·,ý¶,ö¶,ï¶,è¶,á¶,Ú¶,Ó¶,̶,Ŷ,¾¶,·¶,°¶,©¶,¢¶,›¶,”¶,¶,†¶,¶,x¶,q¶,j¶,c¶,\¶,U¶,N¶,G¶,@¶,9¶,2¶,+¶,$¶,¶,¶,¶,¶,¶,úµ,óµ,ìµ,åµ,Þµ,×µ,е,ɵ,µ,»µ,´µ,­µ,¦µ,Ÿµ,˜µ,‘µ,е,ƒµ,|µ,uµ,nµ,gµ,`µ,Yµ,Rµ,Kµ,Dµ,=µ,6µ,/µ,(µ,!µ,µ,µ, µ,µ,þ´,÷´,ð´,é´,â´,Û´,Ô´,Í´,Æ´,¿´,¸´,±´,ª´,£´,œ´,•´,Ž´,‡´,€´,y´,r´,k´,d´,]´,V´,O´,H´,A´,:´,3´,,´,%´,´,´,´, ´,´,û³,ô³,í³,æ³,ß³,س,ѳ,ʳ,ó,¼³,µ³,®³,§³, ³,™³,’³,‹³,„³,}³,v³,o³,h³,a³,Z³,S³,L³,E³,>³,7³,0³,)³,"³,³,³, ³,³,ÿ²,ø²,ñ²,ê²,ã²,ܲ,Õ²,β,Dz,À²,¹²,²²,«²,¤²,²,–²,²,ˆ²,²,z²,s²,l²,e²,^²,W²,P²,I²,B²,;²,4²,-²,&²,²,²,², ²,²,ü±,õ±,î±,ç±,à±,Ù±,Ò±,˱,ı,½±,¶±,¯±,¨±,¡±,š±,“±,Œ±,…±,~±,w±,p±,i±,b±,[±,T±,M±,F±,?±,8±,1±,*±,#±,±,±,±,±,±,ù°,ò°,ë°,ä°,ݰ,Ö°,ϰ,Ȱ,Á°,º°,³°,¬°,¥°,ž°,—°,°,‰°,‚°,{°,t°,m°,f°,_°,X°,Q°,J°,C°,<°,5°,.°,'°, °,°,°, °,°,ý¯,ö¯,ï¯,è¯,á¯,Ú¯,Ó¯,̯,ů,¾¯,·¯,°¯,©¯,¢¯,›¯,”¯,¯,†¯,¯,x¯,q¯,j¯,c¯,\¯,U¯,N¯,G¯,@¯,9¯,2¯,+¯,$¯,¯,¯,¯,¯,¯,ú®,ó®,ì®,å®,Þ®,×®,Ю,É®,®,»®,´®,­®,¦®,Ÿ®,˜®,‘®,Š®,ƒ®,|®,u®,n®,g®,`®,Y®,R®,K®,D®,=®,6®,/®,(®,!®,®,®, ®,®,þ­,÷­,ð­,é­,â­,Û­,Ô­,Í­,Æ­,¿­,¸­,±­,ª­,£­,œ­,•­,Ž­,‡­,€­,y­,r­,k­,d­,]­,V­,O­,H­,A­,:­,3­,,­,%­,­,­,­, ­,­,û¬,ô¬,í¬,æ¬,߬,ج,Ѭ,ʬ,ì,¼¬,µ¬,®¬,§¬, ¬,™¬,’¬,‹¬,„¬,}¬,v¬,o¬,h¬,a¬,Z¬,S¬,L¬,E¬,>¬,7¬,0¬,)¬,"¬,¬,¬, ¬,¬,ÿ«,ø«,ñ«,ê«,ã«,Ü«,Õ«,Ϋ,Ç«,À«,¹«,²«,««,¤«,«,–«,«,ˆ«,«,z«,s«,l«,e«,^«,W«,P«,I«,B«,;«,4«,-«,&«,«,«,«, «,«,üª,õª,îª,çª,àª,Ùª,Òª,˪,Ī,½ª,¶ª,¯ª,¨ª,¡ª,šª,“ª,Œª,…ª,~ª,wª,pª,iª,bª,[ª,Tª,Mª,Fª,?ª,8ª,1ª,*ª,#ª,ª,ª,ª,ª,ª,ù©,ò©,ë©,ä©,Ý©,Ö©,Ï©,È©,Á©,º©,³©,¬©,¥©,ž©,—©,©,‰©,‚©,{©,t©,m©,f©,_©,X©,Q©,J©,C©,<©,5©,.©,'©, ©,©,©, ©,©,ý¨,ö¨,ï¨,è¨,á¨,Ú¨,Ó¨,̨,Ũ,¾¨,·¨,°¨,©¨,¢¨,›¨,”¨,¨,†¨,¨,x¨,q¨,j¨,c¨,\¨,U¨,N¨,G¨,@¨,9¨,2¨,+¨,$¨,¨,¨,¨,¨,¨,ú§,ó§,ì§,å§,Þ§,×§,Ч,ɧ,§,»§,´§,­§,¦§,Ÿ§,˜§,‘§,Ч,ƒ§,|§,u§,n§,g§,`§,Y§,R§,K§,D§,=§,6§,/§,(§,!§,§,§, §,§,þ¦,÷¦,ð¦,é¦,â¦,Û¦,Ô¦,ͦ,Ʀ,¿¦,¸¦,±¦,ª¦,£¦,œ¦,•¦,ަ,‡¦,€¦,y¦,r¦,k¦,d¦,]¦,V¦,O¦,H¦,A¦,:¦,3¦,,¦,%¦,¦,¦,¦, ¦,¦,û¥,ô¥,í¥,æ¥,ߥ,Ø¥,Ñ¥,Ê¥,Ã¥,¼¥,µ¥,®¥,§¥, ¥,™¥,’¥,‹¥,„¥,}¥,v¥,o¥,h¥,a¥,Z¥,S¥,L¥,E¥,>¥,7¥,0¥,)¥,"¥,¥,¥, ¥,¥,ÿ¤,ø¤,ñ¤,ê¤,ã¤,ܤ,Õ¤,Τ,Ǥ,À¤,¹¤,²¤,«¤,¤¤,¤,–¤,¤,ˆ¤,¤,z¤,s¤,l¤,e¤,^¤,W¤,P¤,I¤,B¤,;¤,4¤,-¤,&¤,¤,¤,¤, ¤,¤,ü£,õ£,î£,ç£,à£,Ù£,Ò£,Ë£,Ä£,½£,¶£,¯£,¨£,¡£,š£,“£,Œ£,…£,~£,w£,p£,i£,b£,[£,T£,M£,F£,?£,8£,1£,*£,#£,£,£,£,£,£,ù¢,ò¢,ë¢,ä¢,Ý¢,Ö¢,Ï¢,È¢,Á¢,º¢,³¢,¬¢,¥¢,ž¢,—¢,¢,‰¢,‚¢,{¢,t¢,m¢,f¢,_¢,X¢,Q¢,J¢,C¢,<¢,5¢,.¢,'¢, ¢,¢,¢, ¢,¢,ý¡,ö¡,ï¡,è¡,á¡,Ú¡,Ó¡,Ì¡,Å¡,¾¡,·¡,°¡,©¡,¢¡,›¡,”¡,¡,†¡,¡,x¡,q¡,j¡,c¡,\¡,U¡,N¡,G¡,@¡,9¡,2¡,+¡,$¡,¡,¡,¡,¡,¡,ú ,ó ,ì ,å ,Þ ,× ,Р,É , ,» ,´ ,­ ,¦ ,Ÿ ,˜ ,‘ ,Š ,ƒ ,| ,u ,n ,g ,` ,Y ,R ,K ,D ,= ,6 ,/ ,( ,! , , ,  , ,þŸ,÷Ÿ,ðŸ,éŸ,âŸ,ÛŸ,ÔŸ,ÍŸ,ÆŸ,¿Ÿ,¸Ÿ,±Ÿ,ªŸ,£Ÿ,œŸ,•Ÿ,ŽŸ,‡Ÿ,€Ÿ,yŸ,rŸ,kŸ,dŸ,]Ÿ,VŸ,OŸ,HŸ,AŸ,:Ÿ,3Ÿ,,Ÿ,%Ÿ,Ÿ,Ÿ,Ÿ, Ÿ,Ÿ,ûž,ôž,íž,æž,ßž,Øž,Ñž,Êž,Þ,¼ž,µž,®ž,§ž, ž,™ž,’ž,‹ž,„ž,}ž,vž,ož,hž,až,Zž,Sž,Lž,Ež,>ž,7ž,0ž,)ž,"ž,ž,ž, ž,ž,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,üœ,õœ,îœ,çœ,àœ,Ùœ,Òœ,Ëœ,Äœ,½œ,¶œ,¯œ,¨œ,¡œ,šœ,“œ,Œœ,…œ,~œ,wœ,pœ,iœ,bœ,[œ,Tœ,Mœ,Fœ,?œ,8œ,1œ,*œ,#œ,œ,œ,œ,œ,œ,ù›,ò›,ë›,ä›,Ý›,Ö›,Ï›,È›,Á›,º›,³›,¬›,¥›,ž›,—›,›,‰›,‚›,{›,t›,m›,f›,_›,X›,Q›,J›,C›,<›,5›,.›,'›, ›,›,›, ›,›,ýš,öš,ïš,èš,áš,Úš,Óš,Ìš,Åš,¾š,·š,°š,©š,¢š,›š,”š,š,†š,š,xš,qš,jš,cš,\š,Uš,Nš,Gš,@š,9š,2š,+š,$š,š,š,š,š,š,ú™,ó™,ì™,å™,Þ™,×™,Й,É™,™,»™,´™,­™,¦™,Ÿ™,˜™,‘™,Š™,ƒ™,|™,u™,n™,g™,`™,Y™,R™,K™,D™,=™,6™,/™,(™,!™,™,™, ™,™,þ˜,÷˜,ð˜,é˜,â˜,Û˜,Ô˜,͘,Ƙ,¿˜,¸˜,±˜,ª˜,£˜,œ˜,•˜,Ž˜,‡˜,€˜,y˜,r˜,k˜,d˜,]˜,V˜,O˜,H˜,A˜,:˜,3˜,,˜,%˜,˜,˜,˜, ˜,˜,û—,ô—,í—,æ—,ß—,Ø—,Ñ—,Ê—,×,¼—,µ—,®—,§—, —,™—,’—,‹—,„—,}—,v—,o—,h—,a—,Z—,S—,L—,E—,>—,7—,0—,)—,"—,—,—, —,—,ÿ–,ø–,ñ–,ê–,ã–,Ü–,Õ–,Ζ,Ç–,À–,¹–,²–,«–,¤–,–,––,–,ˆ–,–,z–,s–,l–,e–,^–,W–,P–,I–,B–,;–,4–,-–,&–,–,–,–, –,–,ü•,õ•,î•,ç•,à•,Ù•,Ò•,Ë•,Ä•,½•,¶•,¯•,¨•,¡•,š•,“•,Œ•,…•,~•,w•,p•,i•,b•,[•,T•,M•,F•,?•,8•,1•,*•,#•,•,•,•,•,•,ù”,ò”,ë”,ä”,Ý”,Ö”,Ï”,È”,Á”,º”,³”,¬”,¥”,ž”,—”,”,‰”,‚”,{”,t”,m”,f”,_”,X”,Q”,J”,C”,<”,5”,.”,'”, ”,”,”, ”,”,ý“,ö“,ï“,è“,á“,Ú“,Ó“,Ì“,Å“,¾“,·“,°“,©“,¢“,›“,”“,“,†“,“,x“,q“,j“,c“,\“,U“,N“,G“,@“,9“,2“,+“,$“,“,“,“,“,“,ú’,ó’,ì’,å’,Þ’,×’,Ð’,É’,Â’,»’,´’,­’,¦’,Ÿ’,˜’,‘’,Š’,ƒ’,|’,u’,n’,g’,`’,Y’,R’,K’,D’,=’,6’,/’,(’,!’,’,’, ’,’,þ‘,÷‘,ð‘,é‘,â‘,Û‘,Ô‘,Í‘,Æ‘,¿‘,¸‘,±‘,ª‘,£‘,œ‘,•‘,Ž‘,‡‘,€‘,y‘,r‘,k‘,d‘,]‘,V‘,O‘,H‘,A‘,:‘,3‘,,‘,%‘,‘,‘,‘, ‘,‘,û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,üŽ,õŽ,îŽ,çŽ,àŽ,ÙŽ,ÒŽ,ËŽ,ÄŽ,½Ž,¶Ž,¯Ž,¨Ž,¡Ž,šŽ,“Ž,ŒŽ,…Ž,~Ž,wŽ,pŽ,iŽ,bŽ,[Ž,TŽ,MŽ,FŽ,?Ž,8Ž,1Ž,*Ž,#Ž,Ž,Ž,Ž,Ž,Ž,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ýŒ,öŒ,ïŒ,èŒ,áŒ,ÚŒ,ÓŒ,ÌŒ,ÅŒ,¾Œ,·Œ,°Œ,©Œ,¢Œ,›Œ,”Œ,Œ,†Œ,Œ,xŒ,qŒ,jŒ,cŒ,\Œ,UŒ,NŒ,GŒ,@Œ,9Œ,2Œ,+Œ,$Œ,Œ,Œ,Œ,Œ,Œ,ú‹,ó‹,ì‹,å‹,Þ‹,׋,Ћ,É‹,‹,»‹,´‹,­‹,¦‹,Ÿ‹,˜‹,‘‹,Š‹,ƒ‹,|‹,u‹,n‹,g‹,`‹,Y‹,R‹,K‹,D‹,=‹,6‹,/‹,(‹,!‹,‹,‹, ‹,‹,þŠ,÷Š,ðŠ,éŠ,âŠ,ÛŠ,ÔŠ,ÍŠ,ÆŠ,¿Š,¸Š,±Š,ªŠ,£Š,œŠ,•Š,ŽŠ,‡Š,€Š,yŠ,rŠ,kŠ,dŠ,]Š,VŠ,OŠ,HŠ,AŠ,:Š,3Š,,Š,%Š,Š,Š,Š, Š,Š,û‰,ô‰,í‰,æ‰,߉,؉,щ,ʉ,É,¼‰,µ‰,®‰,§‰, ‰,™‰,’‰,‹‰,„‰,}‰,v‰,o‰,h‰,a‰,Z‰,S‰,L‰,E‰,>‰,7‰,0‰,)‰,"‰,‰,‰, ‰,‰,ÿˆ,øˆ,ñˆ,êˆ,ãˆ,܈,Õˆ,Έ,Lj,Àˆ,¹ˆ,²ˆ,«ˆ,¤ˆ,ˆ,–ˆ,ˆ,ˆˆ,ˆ,zˆ,sˆ,lˆ,eˆ,^ˆ,Wˆ,Pˆ,Iˆ,Bˆ,;ˆ,4ˆ,-ˆ,&ˆ,ˆ,ˆ,ˆ, ˆ,ˆ,ü‡,õ‡,î‡,ç‡,à‡,Ù‡,Ò‡,ˇ,ć,½‡,¶‡,¯‡,¨‡,¡‡,š‡,“‡,Œ‡,…‡,~‡,w‡,p‡,i‡,b‡,[‡,T‡,M‡,F‡,?‡,8‡,1‡,*‡,#‡,‡,‡,‡,‡,‡,ù†,ò†,ë†,ä†,݆,Ö†,φ,Ȇ,Á†,º†,³†,¬†,¥†,ž†,—†,†,‰†,‚†,{†,t†,m†,f†,_†,X†,Q†,J†,C†,<†,5†,.†,'†, †,†,†, †,†,ý…,ö…,ï…,è…,á…,Ú…,Ó…,Ì…,Å…,¾…,·…,°…,©…,¢…,›…,”…,…,†…,…,x…,q…,j…,c…,\…,U…,N…,G…,@…,9…,2…,+…,$…,…,…,…,…,…,ú„,ó„,ì„,å„,Þ„,ׄ,Є,É„,„,»„,´„,­„,¦„,Ÿ„,˜„,‘„,Š„,ƒ„,|„,u„,n„,g„,`„,Y„,R„,K„,D„,=„,6„,/„,(„,!„,„,„, „,„,þƒ,÷ƒ,ðƒ,éƒ,âƒ,Ûƒ,Ôƒ,̓,ƃ,¿ƒ,¸ƒ,±ƒ,ªƒ,£ƒ,œƒ,•ƒ,Žƒ,‡ƒ,€ƒ,yƒ,rƒ,kƒ,dƒ,]ƒ,Vƒ,Oƒ,Hƒ,Aƒ,:ƒ,3ƒ,,ƒ,%ƒ,ƒ,ƒ,ƒ, ƒ,ƒ,û‚,ô‚,í‚,æ‚,ß‚,Ø‚,Ñ‚,Ê‚,Â,¼‚,µ‚,®‚,§‚, ‚,™‚,’‚,‹‚,„‚,}‚,v‚,o‚,h‚,a‚,Z‚,S‚,L‚,E‚,>‚,7‚,0‚,)‚,"‚,‚,‚, ‚,‚,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü€,õ€,î€,ç€,à€,Ù€,Ò€,Ë€,Ä€,½€,¶€,¯€,¨€,¡€,š€,“€,Œ€,…€,~€,w€,p€,i€,b€,[€,T€,M€,F€,?€,8€,1€,*€,#€,€,€,€,€,€,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý~,ö~,ï~,è~,á~,Ú~,Ó~,Ì~,Å~,¾~,·~,°~,©~,¢~,›~,”~,~,†~,~,x~,q~,j~,c~,\~,U~,N~,G~,@~,9~,2~,+~,$~,~,~,~,~,~,ú},ó},ì},å},Þ},×},Ð},É},Â},»},´},­},¦},Ÿ},˜},‘},Š},ƒ},|},u},n},g},`},Y},R},K},D},=},6},/},(},!},},}, },},þ|,÷|,ð|,é|,â|,Û|,Ô|,Í|,Æ|,¿|,¸|,±|,ª|,£|,œ|,•|,Ž|,‡|,€|,y|,r|,k|,d|,]|,V|,O|,H|,A|,:|,3|,,|,%|,|,|,|, |,|,û{,ô{,í{,æ{,ß{,Ø{,Ñ{,Ê{,Ã{,¼{,µ{,®{,§{, {,™{,’{,‹{,„{,}{,v{,o{,h{,a{,Z{,S{,L{,E{,>{,7{,0{,){,"{,{,{, {,{,ÿz,øz,ñz,êz,ãz,Üz,Õz,Îz,Çz,Àz,¹z,²z,«z,¤z,z,–z,z,ˆz,z,zz,sz,lz,ez,^z,Wz,Pz,Iz,Bz,;z,4z,-z,&z,z,z,z, z,z,üy,õy,îy,çy,ày,Ùy,Òy,Ëy,Äy,½y,¶y,¯y,¨y,¡y,šy,“y,Œy,…y,~y,wy,py,iy,by,[y,Ty,My,Fy,?y,8y,1y,*y,#y,y,y,y,y,y,ùx,òx,ëx,äx,Ýx,Öx,Ïx,Èx,Áx,ºx,³x,¬x,¥x,žx,—x,x,‰x,‚x,{x,tx,mx,fx,_x,Xx,Qx,Jx,Cx,t,7t,0t,)t,"t,t,t, t,t,ÿs,øs,ñs,ês,ãs,Üs,Õs,Îs,Çs,Às,¹s,²s,«s,¤s,s,–s,s,ˆs,s,zs,ss,ls,es,^s,Ws,Ps,Is,Bs,;s,4s,-s,&s,s,s,s, s,s,ür,õr,îr,çr,àr,Ùr,Òr,Ër,Är,½r,¶r,¯r,¨r,¡r,šr,“r,Œr,…r,~r,wr,pr,ir,br,[r,Tr,Mr,Fr,?r,8r,1r,*r,#r,r,r,r,r,r,ùq,òq,ëq,äq,Ýq,Öq,Ïq,Èq,Áq,ºq,³q,¬q,¥q,žq,—q,q,‰q,‚q,{q,tq,mq,fq,_q,Xq,Qq,Jq,Cq,m,7m,0m,)m,"m,m,m, m,m,ÿl,øl,ñl,êl,ãl,Ül,Õl,Îl,Çl,Àl,¹l,²l,«l,¤l,l,–l,l,ˆl,l,zl,sl,ll,el,^l,Wl,Pl,Il,Bl,;l,4l,-l,&l,l,l,l, l,l,ük,õk,îk,çk,àk,Ùk,Òk,Ëk,Äk,½k,¶k,¯k,¨k,¡k,šk,“k,Œk,…k,~k,wk,pk,ik,bk,[k,Tk,Mk,Fk,?k,8k,1k,*k,#k,k,k,k,k,k,ùj,òj,ëj,äj,Ýj,Öj,Ïj,Èj,Áj,ºj,³j,¬j,¥j,žj,—j,j,‰j,‚j,{j,tj,mj,fj,_j,Xj,Qj,Jj,Cj,f,7f,0f,)f,"f,f,f, f,f,ÿe,øe,ñe,êe,ãe,Üe,Õe,Îe,Çe,Àe,¹e,²e,«e,¤e,e,–e,e,ˆe,e,ze,se,le,ee,^e,We,Pe,Ie,Be,;e,4e,-e,&e,e,e,e, e,e,üd,õd,îd,çd,àd,Ùd,Òd,Ëd,Äd,½d,¶d,¯d,¨d,¡d,šd,“d,Œd,…d,~d,wd,pd,id,bd,[d,Td,Md,Fd,?d,8d,1d,*d,#d,d,d,d,d,d,ùc,òc,ëc,äc,Ýc,Öc,Ïc,Èc,Ác,ºc,³c,¬c,¥c,žc,—c,c,‰c,‚c,{c,tc,mc,fc,_c,Xc,Qc,Jc,Cc,_,7_,0_,)_,"_,_,_, _,_,ÿ^,ø^,ñ^,ê^,ã^,Ü^,Õ^,Î^,Ç^,À^,¹^,²^,«^,¤^,^,–^,^,ˆ^,^,z^,s^,l^,e^,^^,W^,P^,I^,B^,;^,4^,-^,&^,^,^,^, ^,^,ü],õ],î],ç],à],Ù],Ò],Ë],Ä],½],¶],¯],¨],¡],š],“],Œ],…],~],w],p],i],b],[],T],M],F],?],8],1],*],#],],],],],],ù\,ò\,ë\,ä\,Ý\,Ö\,Ï\,È\,Á\,º\,³\,¬\,¥\,ž\,—\,\,‰\,‚\,{\,t\,m\,f\,_\,X\,Q\,J\,C\,<\,5\,.\,'\, \,\,\, \,\,ý[,ö[,ï[,è[,á[,Ú[,Ó[,Ì[,Å[,¾[,·[,°[,©[,¢[,›[,”[,[,†[,[,x[,q[,j[,c[,\[,U[,N[,G[,@[,9[,2[,+[,$[,[,[,[,[,[,úZ,óZ,ìZ,åZ,ÞZ,×Z,ÐZ,ÉZ,ÂZ,»Z,´Z,­Z,¦Z,ŸZ,˜Z,‘Z,ŠZ,ƒZ,|Z,uZ,nZ,gZ,`Z,YZ,RZ,KZ,DZ,=Z,6Z,/Z,(Z,!Z,Z,Z, Z,Z,þY,÷Y,ðY,éY,âY,ÛY,ÔY,ÍY,ÆY,¿Y,¸Y,±Y,ªY,£Y,œY,•Y,ŽY,‡Y,€Y,yY,rY,kY,dY,]Y,VY,OY,HY,AY,:Y,3Y,,Y,%Y,Y,Y,Y, Y,Y,ûX,ôX,íX,æX,ßX,ØX,ÑX,ÊX,ÃX,¼X,µX,®X,§X, X,™X,’X,‹X,„X,}X,vX,oX,hX,aX,ZX,SX,LX,EX,>X,7X,0X,)X,"X,X,X, X,X,ÿW,øW,ñW,êW,ãW,ÜW,ÕW,ÎW,ÇW,ÀW,¹W,²W,«W,¤W,W,–W,W,ˆW,W,zW,sW,lW,eW,^W,WW,PW,IW,BW,;W,4W,-W,&W,W,W,W, W,W,üV,õV,îV,çV,àV,ÙV,ÒV,ËV,ÄV,½V,¶V,¯V,¨V,¡V,šV,“V,ŒV,…V,~V,wV,pV,iV,bV,[V,TV,MV,FV,?V,8V,1V,*V,#V,V,V,V,V,V,ùU,òU,ëU,äU,ÝU,ÖU,ÏU,ÈU,ÁU,ºU,³U,¬U,¥U,žU,—U,U,‰U,‚U,{U,tU,mU,fU,_U,XU,QU,JU,CU,Q,7Q,0Q,)Q,"Q,Q,Q, Q,Q,ÿP,øP,ñP,êP,ãP,ÜP,ÕP,ÎP,ÇP,ÀP,¹P,²P,«P,¤P,P,–P,P,ˆP,P,zP,sP,lP,eP,^P,WP,PP,IP,BP,;P,4P,-P,&P,P,P,P, P,P,üO,õO,îO,çO,àO,ÙO,ÒO,ËO,ÄO,½O,¶O,¯O,¨O,¡O,šO,“O,ŒO,…O,~O,wO,pO,iO,bO,[O,TO,MO,FO,?O,8O,1O,*O,#O,O,O,O,O,O,ùN,òN,ëN,äN,ÝN,ÖN,ÏN,ÈN,ÁN,ºN,³N,¬N,¥N,žN,—N,N,‰N,‚N,{N,tN,mN,fN,_N,XN,QN,JN,CN,J,7J,0J,)J,"J,J,J, J,J,ÿI,øI,ñI,êI,ãI,ÜI,ÕI,ÎI,ÇI,ÀI,¹I,²I,«I,¤I,I,–I,I,ˆI,I,zI,sI,lI,eI,^I,WI,PI,II,BI,;I,4I,-I,&I,I,I,I, I,I,üH,õH,îH,çH,àH,ÙH,ÒH,ËH,ÄH,½H,¶H,¯H,¨H,¡H,šH,“H,ŒH,…H,~H,wH,pH,iH,bH,[H,TH,MH,FH,?H,8H,1H,*H,#H,H,H,H,H,H,ùG,òG,ëG,äG,ÝG,ÖG,ÏG,ÈG,ÁG,ºG,³G,¬G,¥G,žG,—G,G,‰G,‚G,{G,tG,mG,fG,_G,XG,QG,JG,CG,C,7C,0C,)C,"C,C,C, C,C,ÿB,øB,ñB,êB,ãB,ÜB,ÕB,ÎB,ÇB,ÀB,¹B,²B,«B,¤B,B,–B,B,ˆB,B,zB,sB,lB,eB,^B,WB,PB,IB,BB,;B,4B,-B,&B,B,B,B, B,B,üA,õA,îA,çA,àA,ÙA,ÒA,ËA,ÄA,½A,¶A,¯A,¨A,¡A,šA,“A,ŒA,…A,~A,wA,pA,iA,bA,[A,TA,MA,FA,?A,8A,1A,*A,#A,A,A,A,A,A,ù@,ò@,ë@,ä@,Ý@,Ö@,Ï@,È@,Á@,º@,³@,¬@,¥@,ž@,—@,@,‰@,‚@,{@,t@,m@,f@,_@,X@,Q@,J@,C@,<@,5@,.@,'@, @,@,@, @,@,ý?,ö?,ï?,è?,á?,Ú?,Ó?,Ì?,Å?,¾?,·?,°?,©?,¢?,›?,”?,?,†?,?,x?,q?,j?,c?,\?,U?,N?,G?,@?,9?,2?,+?,$?,?,?,?,?,?,ú>,ó>,ì>,å>,Þ>,×>,Ð>,É>,Â>,»>,´>,­>,¦>,Ÿ>,˜>,‘>,Š>,ƒ>,|>,u>,n>,g>,`>,Y>,R>,K>,D>,=>,6>,/>,(>,!>,>,>, >,>,þ=,÷=,ð=,é=,â=,Û=,Ô=,Í=,Æ=,¿=,¸=,±=,ª=,£=,œ=,•=,Ž=,‡=,€=,y=,r=,k=,d=,]=,V=,O=,H=,A=,:=,3=,,=,%=,=,=,=, =,=,û<,ô<,í<,æ<,ß<,Ø<,Ñ<,Ê<,Ã<,¼<,µ<,®<,§<, <,™<,’<,‹<,„<,}<,v<,o<,h<,a<,Z<,S<,L<,E<,><,7<,0<,)<,"<,<,<, <,<,ÿ;,ø;,ñ;,ê;,ã;,Ü;,Õ;,Î;,Ç;,À;,¹;,²;,«;,¤;,;,–;,;,ˆ;,;,z;,s;,l;,e;,^;,W;,P;,I;,B;,;;,4;,-;,&;,;,;,;, ;,;,ü:,õ:,î:,ç:,à:,Ù:,Ò:,Ë:,Ä:,½:,¶:,¯:,¨:,¡:,š:,“:,Œ:,…:,~:,w:,p:,i:,b:,[:,T:,M:,F:,?:,8:,1:,*:,#:,:,:,:,:,:,ù9,ò9,ë9,ä9,Ý9,Ö9,Ï9,È9,Á9,º9,³9,¬9,¥9,ž9,—9,9,‰9,‚9,{9,t9,m9,f9,_9,X9,Q9,J9,C9,<9,59,.9,'9, 9,9,9, 9,9,ý8,ö8,ï8,è8,á8,Ú8,Ó8,Ì8,Å8,¾8,·8,°8,©8,¢8,›8,”8,8,†8,8,x8,q8,j8,c8,\8,U8,N8,G8,@8,98,28,+8,$8,8,8,8,8,8,ú7,ó7,ì7,å7,Þ7,×7,Ð7,É7,Â7,»7,´7,­7,¦7,Ÿ7,˜7,‘7,Š7,ƒ7,|7,u7,n7,g7,`7,Y7,R7,K7,D7,=7,67,/7,(7,!7,7,7, 7,7,þ6,÷6,ð6,é6,â6,Û6,Ô6,Í6,Æ6,¿6,¸6,±6,ª6,£6,œ6,•6,Ž6,‡6,€6,y6,r6,k6,d6,]6,V6,O6,H6,A6,:6,36,,6,%6,6,6,6, 6,6,û5,ô5,í5,æ5,ß5,Ø5,Ñ5,Ê5,Ã5,¼5,µ5,®5,§5, 5,™5,’5,‹5,„5,}5,v5,o5,h5,a5,Z5,S5,L5,E5,>5,75,05,)5,"5,5,5, 5,5,ÿ4,ø4,ñ4,ê4,ã4,Ü4,Õ4,Î4,Ç4,À4,¹4,²4,«4,¤4,4,–4,4,ˆ4,4,z4,s4,l4,e4,^4,W4,P4,I4,B4,;4,44,-4,&4,4,4,4, 4,4,ü3,õ3,î3,ç3,à3,Ù3,Ò3,Ë3,Ä3,½3,¶3,¯3,¨3,¡3,š3,“3,Œ3,…3,~3,w3,p3,i3,b3,[3,T3,M3,F3,?3,83,13,*3,#3,3,3,3,3,3,ù2,ò2,ë2,ä2,Ý2,Ö2,Ï2,È2,Á2,º2,³2,¬2,¥2,ž2,—2,2,‰2,‚2,{2,t2,m2,f2,_2,X2,Q2,J2,C2,<2,52,.2,'2, 2,2,2, 2,2,ý1,ö1,ï1,è1,á1,Ú1,Ó1,Ì1,Å1,¾1,·1,°1,©1,¢1,›1,”1,1,†1,1,x1,q1,j1,c1,\1,U1,N1,G1,@1,91,21,+1,$1,1,1,1,1,1,ú0,ó0,ì0,å0,Þ0,×0,Ð0,É0,Â0,»0,´0,­0,¦0,Ÿ0,˜0,‘0,Š0,ƒ0,|0,u0,n0,g0,`0,Y0,R0,K0,D0,=0,60,/0,(0,!0,0,0, 0,0,þ/,÷/,ð/,é/,â/,Û/,Ô/,Í/,Æ/,¿/,¸/,±/,ª/,£/,œ/,•/,Ž/,‡/,€/,y/,r/,k/,d/,]/,V/,O/,H/,A/,:/,3/,,/,%/,/,/,/, /,/,û.,ô.,í.,æ.,ß.,Ø.,Ñ.,Ê.,Ã.,¼.,µ.,®.,§., .,™.,’.,‹.,„.,}.,v.,o.,h.,a.,Z.,S.,L.,E.,>.,7.,0.,).,".,.,., .,.,ÿ-,ø-,ñ-,ê-,ã-,Ü-,Õ-,Î-,Ç-,À-,¹-,²-,«-,¤-,-,–-,-,ˆ-,-,z-,s-,l-,e-,^-,W-,P-,I-,B-,;-,4-,--,&-,-,-,-, -,-,ü,,õ,,î,,ç,,à,,Ù,,Ò,,Ë,,Ä,,½,,¶,,¯,,¨,,¡,,š,,“,,Œ,,…,,~,,w,,p,,i,,b,,[,,T,,M,,F,,?,,8,,1,,*,,#,,,,,,,,,,,,ù+,ò+,ë+,ä+,Ý+,Ö+,Ï+,È+,Á+,º+,³+,¬+,¥+,ž+,—+,+,‰+,‚+,{+,t+,m+,f+,_+,X+,Q+,J+,C+,<+,5+,.+,'+, +,+,+, +,+,ý*,ö*,ï*,è*,á*,Ú*,Ó*,Ì*,Å*,¾*,·*,°*,©*,¢*,›*,”*,*,†*,*,x*,q*,j*,c*,\*,U*,N*,G*,@*,9*,2*,+*,$*,*,*,*,*,*,ú),ó),ì),å),Þ),×),Ð),É),Â),»),´),­),¦),Ÿ),˜),‘),Š),ƒ),|),u),n),g),`),Y),R),K),D),=),6),/),(),!),),), ),),þ(,÷(,ð(,é(,â(,Û(,Ô(,Í(,Æ(,¿(,¸(,±(,ª(,£(,œ(,•(,Ž(,‡(,€(,y(,r(,k(,d(,](,V(,O(,H(,A(,:(,3(,,(,%(,(,(,(, (,(,û',ô',í',æ',ß',Ø',Ñ',Ê',Ã',¼',µ',®',§', ',™',’',‹',„',}',v',o',h',a',Z',S',L',E',>',7',0',)',"',',', ',',ÿ&,ø&,ñ&,ê&,ã&,Ü&,Õ&,Î&,Ç&,À&,¹&,²&,«&,¤&,&,–&,&,ˆ&,&,z&,s&,l&,e&,^&,W&,P&,I&,B&,;&,4&,-&,&&,&,&,&, &,&,ü%,õ%,î%,ç%,à%,Ù%,Ò%,Ë%,Ä%,½%,¶%,¯%,¨%,¡%,š%,“%,Œ%,…%,~%,w%,p%,i%,b%,[%,T%,M%,F%,?%,8%,1%,*%,#%,%,%,%,%,%,ù$,ò$,ë$,ä$,Ý$,Ö$,Ï$,È$,Á$,º$,³$,¬$,¥$,ž$,—$,$,‰$,‚$,{$,t$,m$,f$,_$,X$,Q$,J$,C$,<$,5$,.$,'$, $,$,$, $,$,ý#,ö#,ï#,è#,á#,Ú#,Ó#,Ì#,Å#,¾#,·#,°#,©#,¢#,›#,”#,#,†#,#,x#,q#,j#,c#,\#,U#,N#,G#,@#,9#,2#,+#,$#,#,#,#,#,#,ú",ó",ì",å",Þ",×",Ð",É",Â",»",´",­",¦",Ÿ",˜",‘",Š",ƒ",|",u",n",g",`",Y",R",K",D",=",6",/",(",!",",", ",",þ!,÷!,ð!,é!,â!,Û!,Ô!,Í!,Æ!,¿!,¸!,±!,ª!,£!,œ!,•!,Ž!,‡!,€!,y!,r!,k!,d!,]!,V!,O!,H!,A!,:!,3!,,!,%!,!,!,!, !,!,û ,ô ,í ,æ ,ß ,Ø ,Ñ ,Ê ,à ,¼ ,µ ,® ,§ ,  ,™ ,’ ,‹ ,„ ,} ,v ,o ,h ,a ,Z ,S ,L ,E ,> ,7 ,0 ,) ," , , , , ,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ,÷,ð,é,â,Û,Ô,Í,Æ,¿,¸,±,ª,£,œ,•,Ž,‡,€,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ,÷,ð,é,â,Û,Ô,Í,Æ,¿,¸,±,ª,£,œ,•,Ž,‡,€,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú ,ó ,ì ,å ,Þ ,× ,Ð ,É , ,» ,´ ,­ ,¦ ,Ÿ ,˜ ,‘ ,Š ,ƒ ,| ,u ,n ,g ,` ,Y ,R ,K ,D ,= ,6 ,/ ,( ,! , , , , ,þ ,÷ ,ð ,é ,â ,Û ,Ô ,Í ,Æ ,¿ ,¸ ,± ,ª ,£ ,œ ,• ,Ž ,‡ ,€ ,y ,r ,k ,d ,] ,V ,O ,H ,A ,: ,3 ,, ,% , , , , , ,û ,ô ,í ,æ ,ß ,Ø ,Ñ ,Ê ,à ,¼ ,µ ,® ,§ ,  ,™ ,’ ,‹ ,„ ,} ,v ,o ,h ,a ,Z ,S ,L ,E ,> ,7 ,0 ,) ," , , , , ,ÿ ,ø ,ñ ,ê ,ã ,Ü ,Õ ,Î ,Ç ,À ,¹ ,² ,« ,¤ , ,– , ,ˆ , ,z ,s ,l ,e ,^ ,W ,P ,I ,B ,; ,4 ,- ,& , , , , , ,ü ,õ ,î ,ç ,à ,Ù ,Ò ,Ë ,Ä ,½ ,¶ ,¯ ,¨ ,¡ ,š ,“ ,Œ ,… ,~ ,w ,p ,i ,b ,[ ,T ,M ,F ,? ,8 ,1 ,* ,# , , , , , ,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ,÷,ð,é,â,Û,Ô,Í,Æ,¿,¸,±,ª,£,œ,•,Ž,‡,€,y,r,k,d,],V,O,H,A,:,3,,,%,,,, ,,û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,úÿ+óÿ+ìÿ+åÿ+Þÿ+×ÿ+Ðÿ+Éÿ+Âÿ+»ÿ+´ÿ+­ÿ+¦ÿ+Ÿÿ+˜ÿ+‘ÿ+Šÿ+ƒÿ+|ÿ+uÿ+nÿ+gÿ+`ÿ+Yÿ+Rÿ+Kÿ+Dÿ+=ÿ+6ÿ+/ÿ+(ÿ+!ÿ+ÿ+ÿ+ ÿ+ÿ+þþ+÷þ+ðþ+éþ+âþ+Ûþ+Ôþ+Íþ+Æþ+¿þ+¸þ+±þ+ªþ+£þ+œþ+•þ+Žþ+‡þ+€þ+yþ+rþ+kþ+dþ+]þ+Vþ+Oþ+Hþ+Aþ+:þ+3þ+,þ+%þ+þ+þ+þ+ þ+þ+ûý+ôý+íý+æý+ßý+Øý+Ñý+Êý+Ãý+¼ý+µý+®ý+§ý+ ý+™ý+’ý+‹ý+„ý+}ý+vý+oý+hý+aý+Zý+Sý+Lý+Eý+>ý+7ý+0ý+)ý+"ý+ý+ý+ ý+ý+ÿü+øü+ñü+êü+ãü+Üü+Õü+Îü+Çü+Àü+¹ü+²ü+«ü+¤ü+ü+–ü+ü+ˆü+ü+zü+sü+lü+eü+^ü+Wü+Pü+Iü+Bü+;ü+4ü+-ü+&ü+ü+ü+ü+ ü+ü+üû+õû+îû+çû+àû+Ùû+Òû+Ëû+Äû+½û+¶û+¯û+¨û+¡û+šû+“û+Œû+…û+~û+wû+pû+iû+bû+[û+Tû+Mû+Fû+?û+8û+1û+*û+#û+û+û+û+û+û+ùú+òú+ëú+äú+Ýú+Öú+Ïú+Èú+Áú+ºú+³ú+¬ú+¥ú+žú+—ú+ú+‰ú+‚ú+{ú+tú+mú+fú+_ú+Xú+Qú+Jú+Cú+<ú+5ú+.ú+'ú+ ú+ú+ú+ ú+ú+ýù+öù+ïù+èù+áù+Úù+Óù+Ìù+Åù+¾ù+·ù+°ù+©ù+¢ù+›ù+”ù+ù+†ù+ù+xù+qù+jù+cù+\ù+Uù+Nù+Gù+@ù+9ù+2ù++ù+$ù+ù+ù+ù+ù+ù+úø+óø+ìø+åø+Þø+×ø+Ðø+Éø+Âø+»ø+´ø+­ø+¦ø+Ÿø+˜ø+‘ø+Šø+ƒø+|ø+uø+nø+gø+`ø+Yø+Rø+Kø+Dø+=ø+6ø+/ø+(ø+!ø+ø+ø+ ø+ø+þ÷+÷÷+ð÷+é÷+â÷+Û÷+Ô÷+Í÷+Æ÷+¿÷+¸÷+±÷+ª÷+£÷+œ÷+•÷+Ž÷+‡÷+€÷+y÷+r÷+k÷+d÷+]÷+V÷+O÷+H÷+A÷+:÷+3÷+,÷+%÷+÷+÷+÷+ ÷+÷+ûö+ôö+íö+æö+ßö+Øö+Ñö+Êö+Ãö+¼ö+µö+®ö+§ö+ ö+™ö+’ö+‹ö+„ö+}ö+vö+oö+hö+aö+Zö+Sö+Lö+Eö+>ö+7ö+0ö+)ö+"ö+ö+ö+ ö+ö+ÿõ+øõ+ñõ+êõ+ãõ+Üõ+Õõ+Îõ+Çõ+Àõ+¹õ+²õ+«õ+¤õ+õ+–õ+õ+ˆõ+õ+zõ+sõ+lõ+eõ+^õ+Wõ+Põ+Iõ+Bõ+;õ+4õ+-õ+&õ+õ+õ+õ+ õ+õ+üô+õô+îô+çô+àô+Ùô+Òô+Ëô+Äô+½ô+¶ô+¯ô+¨ô+¡ô+šô+“ô+Œô+…ô+~ô+wô+pô+iô+bô+[ô+Tô+Mô+Fô+?ô+8ô+1ô+*ô+#ô+ô+ô+ô+ô+ô+ùó+òó+ëó+äó+Ýó+Öó+Ïó+Èó+Áó+ºó+³ó+¬ó+¥ó+žó+—ó+ó+‰ó+‚ó+{ó+tó+mó+fó+_ó+Xó+Qó+Jó+Có+<ó+5ó+.ó+'ó+ ó+ó+ó+ ó+ó+ýò+öò+ïò+èò+áò+Úò+Óò+Ìò+Åò+¾ò+·ò+°ò+©ò+¢ò+›ò+”ò+ò+†ò+ò+xò+qò+jò+cò+\ò+Uò+Nò+Gò+@ò+9ò+2ò++ò+$ò+ò+ò+ò+ò+ò+úñ+óñ+ìñ+åñ+Þñ+×ñ+Ðñ+Éñ+Âñ+»ñ+´ñ+­ñ+¦ñ+Ÿñ+˜ñ+‘ñ+Šñ+ƒñ+|ñ+uñ+nñ+gñ+`ñ+Yñ+Rñ+Kñ+Dñ+=ñ+6ñ+/ñ+(ñ+!ñ+ñ+ñ+ ñ+ñ+þð+÷ð+ðð+éð+âð+Ûð+Ôð+Íð+Æð+¿ð+¸ð+±ð+ªð+£ð+œð+•ð+Žð+‡ð+€ð+yð+rð+kð+dð+]ð+Vð+Oð+Hð+Að+:ð+3ð+,ð+%ð+ð+ð+ð+ ð+ð+ûï+ôï+íï+æï+ßï+Øï+Ñï+Êï+Ãï+¼ï+µï+®ï+§ï+ ï+™ï+’ï+‹ï+„ï+}ï+vï+oï+hï+aï+Zï+Sï+Lï+Eï+>ï+7ï+0ï+)ï+"ï+ï+ï+ ï+ï+ÿî+øî+ñî+êî+ãî+Üî+Õî+Îî+Çî+Àî+¹î+²î+«î+¤î+î+–î+î+ˆî+î+zî+sî+lî+eî+^î+Wî+Pî+Iî+Bî+;î+4î+-î+&î+î+î+î+ î+î+üí+õí+îí+çí+àí+Ùí+Òí+Ëí+Äí+½í+¶í+¯í+¨í+¡í+ší+“í+Œí+…í+~í+wí+pí+ií+bí+[í+Tí+Mí+Fí+?í+8í+1í+*í+#í+í+í+í+í+í+ùì+òì+ëì+äì+Ýì+Öì+Ïì+Èì+Áì+ºì+³ì+¬ì+¥ì+žì+—ì+ì+‰ì+‚ì+{ì+tì+mì+fì+_ì+Xì+Qì+Jì+Cì+<ì+5ì+.ì+'ì+ ì+ì+ì+ ì+ì+ýë+öë+ïë+èë+áë+Úë+Óë+Ìë+Åë+¾ë+·ë+°ë+©ë+¢ë+›ë+”ë+ë+†ë+ë+xë+që+jë+cë+\ë+Uë+Në+Gë+@ë+9ë+2ë++ë+$ë+ë+ë+ë+ë+ë+úê+óê+ìê+åê+Þê+×ê+Ðê+Éê+Âê+»ê+´ê+­ê+¦ê+Ÿê+˜ê+‘ê+Šê+ƒê+|ê+uê+nê+gê+`ê+Yê+Rê+Kê+Dê+=ê+6ê+/ê+(ê+!ê+ê+ê+ ê+ê+þé+÷é+ðé+éé+âé+Ûé+Ôé+Íé+Æé+¿é+¸é+±é+ªé+£é+œé+•é+Žé+‡é+€é+yé+ré+ké+dé+]é+Vé+Oé+Hé+Aé+:é+3é+,é+%é+é+é+é+ é+é+ûè+ôè+íè+æè+ßè+Øè+Ñè+Êè+Ãè+¼è+µè+®è+§è+ è+™è+’è+‹è+„è+}è+vè+oè+hè+aè+Zè+Sè+Lè+Eè+>è+7è+0è+)è+"è+è+è+ è+è+ÿç+øç+ñç+êç+ãç+Üç+Õç+Îç+Çç+Àç+¹ç+²ç+«ç+¤ç+ç+–ç+ç+ˆç+ç+zç+sç+lç+eç+^ç+Wç+Pç+Iç+Bç+;ç+4ç+-ç+&ç+ç+ç+ç+ ç+ç+üæ+õæ+îæ+çæ+àæ+Ùæ+Òæ+Ëæ+Äæ+½æ+¶æ+¯æ+¨æ+¡æ+šæ+“æ+Œæ+…æ+~æ+wæ+pæ+iæ+bæ+[æ+Tæ+Mæ+Fæ+?æ+8æ+1æ+*æ+#æ+æ+æ+æ+æ+æ+ùå+òå+ëå+äå+Ýå+Öå+Ïå+Èå+Áå+ºå+³å+¬å+¥å+žå+—å+å+‰å+‚å+{å+tå+må+få+_å+Xå+Qå+Jå+Cå+<å+5å+.å+'å+ å+å+å+ å+å+ýä+öä+ïä+èä+áä+Úä+Óä+Ìä+Åä+¾ä+·ä+°ä+©ä+¢ä+›ä+”ä+ä+†ä+ä+xä+qä+jä+cä+\ä+Uä+Nä+Gä+@ä+9ä+2ä++ä+$ä+ä+ä+ä+ä+ä+úã+óã+ìã+åã+Þã+×ã+Ðã+Éã+Âã+»ã+´ã+­ã+¦ã+Ÿã+˜ã+‘ã+Šã+ƒã+|ã+uã+nã+gã+`ã+Yã+Rã+Kã+Dã+=ã+6ã+/ã+(ã+!ã+ã+ã+ ã+ã+þâ+÷â+ðâ+éâ+ââ+Ûâ+Ôâ+Íâ+Æâ+¿â+¸â+±â+ªâ+£â+œâ+•â+Žâ+‡â+€â+yâ+râ+kâ+dâ+]â+Vâ+Oâ+Hâ+Aâ+:â+3â+,â+%â+â+â+â+ â+â+ûá+ôá+íá+æá+ßá+Øá+Ñá+Êá+Ãá+¼á+µá+®á+§á+ á+™á+’á+‹á+„á+}á+vá+oá+há+aá+Zá+Sá+Lá+Eá+>á+7á+0á+)á+"á+á+á+ á+á+ÿà+øà+ñà+êà+ãà+Üà+Õà+Îà+Çà+Àà+¹à+²à+«à+¤à+à+–à+à+ˆà+à+zà+sà+là+eà+^à+Wà+Pà+Ià+Bà+;à+4à+-à+&à+à+à+à+ à+à+üß+õß+îß+çß+àß+Ùß+Òß+Ëß+Äß+½ß+¶ß+¯ß+¨ß+¡ß+šß+“ß+Œß+…ß+~ß+wß+pß+iß+bß+[ß+Tß+Mß+Fß+?ß+8ß+1ß+*ß+#ß+ß+ß+ß+ß+ß+ùÞ+òÞ+ëÞ+äÞ+ÝÞ+ÖÞ+ÏÞ+ÈÞ+ÁÞ+ºÞ+³Þ+¬Þ+¥Þ+žÞ+—Þ+Þ+‰Þ+‚Þ+{Þ+tÞ+mÞ+fÞ+_Þ+XÞ+QÞ+JÞ+CÞ+<Þ+5Þ+.Þ+'Þ+ Þ+Þ+Þ+ Þ+Þ+ýÝ+öÝ+ïÝ+èÝ+áÝ+ÚÝ+ÓÝ+ÌÝ+ÅÝ+¾Ý+·Ý+°Ý+©Ý+¢Ý+›Ý+”Ý+Ý+†Ý+Ý+xÝ+qÝ+jÝ+cÝ+\Ý+UÝ+NÝ+GÝ+@Ý+9Ý+2Ý++Ý+$Ý+Ý+Ý+Ý+Ý+Ý+úÜ+óÜ+ìÜ+åÜ+ÞÜ+×Ü+ÐÜ+ÉÜ+ÂÜ+»Ü+´Ü+­Ü+¦Ü+ŸÜ+˜Ü+‘Ü+ŠÜ+ƒÜ+|Ü+uÜ+nÜ+gÜ+`Ü+YÜ+RÜ+KÜ+DÜ+=Ü+6Ü+/Ü+(Ü+!Ü+Ü+Ü+ Ü+Ü+þÛ+÷Û+ðÛ+éÛ+âÛ+ÛÛ+ÔÛ+ÍÛ+ÆÛ+¿Û+¸Û+±Û+ªÛ+£Û+œÛ+•Û+ŽÛ+‡Û+€Û+yÛ+rÛ+kÛ+dÛ+]Û+VÛ+OÛ+HÛ+AÛ+:Û+3Û+,Û+%Û+Û+Û+Û+ Û+Û+ûÚ+ôÚ+íÚ+æÚ+ßÚ+ØÚ+ÑÚ+ÊÚ+ÃÚ+¼Ú+µÚ+®Ú+§Ú+ Ú+™Ú+’Ú+‹Ú+„Ú+}Ú+vÚ+oÚ+hÚ+aÚ+ZÚ+SÚ+LÚ+EÚ+>Ú+7Ú+0Ú+)Ú+"Ú+Ú+Ú+ Ú+Ú+ÿÙ+øÙ+ñÙ+êÙ+ãÙ+ÜÙ+ÕÙ+ÎÙ+ÇÙ+ÀÙ+¹Ù+²Ù+«Ù+¤Ù+Ù+–Ù+Ù+ˆÙ+Ù+zÙ+sÙ+lÙ+eÙ+^Ù+WÙ+PÙ+IÙ+BÙ+;Ù+4Ù+-Ù+&Ù+Ù+Ù+Ù+ Ù+Ù+üØ+õØ+îØ+çØ+àØ+ÙØ+ÒØ+ËØ+ÄØ+½Ø+¶Ø+¯Ø+¨Ø+¡Ø+šØ+“Ø+ŒØ+…Ø+~Ø+wØ+pØ+iØ+bØ+[Ø+TØ+MØ+FØ+?Ø+8Ø+1Ø+*Ø+#Ø+Ø+Ø+Ø+Ø+Ø+ù×+ò×+ë×+ä×+Ý×+Ö×+Ï×+È×+Á×+º×+³×+¬×+¥×+ž×+—×+×+‰×+‚×+{×+t×+m×+f×+_×+X×+Q×+J×+C×+<×+5×+.×+'×+ ×+×+×+ ×+×+ýÖ+öÖ+ïÖ+èÖ+áÖ+ÚÖ+ÓÖ+ÌÖ+ÅÖ+¾Ö+·Ö+°Ö+©Ö+¢Ö+›Ö+”Ö+Ö+†Ö+Ö+xÖ+qÖ+jÖ+cÖ+\Ö+UÖ+NÖ+GÖ+@Ö+9Ö+2Ö++Ö+$Ö+Ö+Ö+Ö+Ö+Ö+úÕ+óÕ+ìÕ+åÕ+ÞÕ+×Õ+ÐÕ+ÉÕ+ÂÕ+»Õ+´Õ+­Õ+¦Õ+ŸÕ+˜Õ+‘Õ+ŠÕ+ƒÕ+|Õ+uÕ+nÕ+gÕ+`Õ+YÕ+RÕ+KÕ+DÕ+=Õ+6Õ+/Õ+(Õ+!Õ+Õ+Õ+ Õ+Õ+þÔ+÷Ô+ðÔ+éÔ+âÔ+ÛÔ+ÔÔ+ÍÔ+ÆÔ+¿Ô+¸Ô+±Ô+ªÔ+£Ô+œÔ+•Ô+ŽÔ+‡Ô+€Ô+yÔ+rÔ+kÔ+dÔ+]Ô+VÔ+OÔ+HÔ+AÔ+:Ô+3Ô+,Ô+%Ô+Ô+Ô+Ô+ Ô+Ô+ûÓ+ôÓ+íÓ+æÓ+ßÓ+ØÓ+ÑÓ+ÊÓ+ÃÓ+¼Ó+µÓ+®Ó+§Ó+ Ó+™Ó+’Ó+‹Ó+„Ó+}Ó+vÓ+oÓ+hÓ+aÓ+ZÓ+SÓ+LÓ+EÓ+>Ó+7Ó+0Ó+)Ó+"Ó+Ó+Ó+ Ó+Ó+ÿÒ+øÒ+ñÒ+êÒ+ãÒ+ÜÒ+ÕÒ+ÎÒ+ÇÒ+ÀÒ+¹Ò+²Ò+«Ò+¤Ò+Ò+–Ò+Ò+ˆÒ+Ò+zÒ+sÒ+lÒ+eÒ+^Ò+WÒ+PÒ+IÒ+BÒ+;Ò+4Ò+-Ò+&Ò+Ò+Ò+Ò+ Ò+Ò+üÑ+õÑ+îÑ+çÑ+àÑ+ÙÑ+ÒÑ+ËÑ+ÄÑ+½Ñ+¶Ñ+¯Ñ+¨Ñ+¡Ñ+šÑ+“Ñ+ŒÑ+…Ñ+~Ñ+wÑ+pÑ+iÑ+bÑ+[Ñ+TÑ+MÑ+FÑ+?Ñ+8Ñ+1Ñ+*Ñ+#Ñ+Ñ+Ñ+Ñ+Ñ+Ñ+ùÐ+òÐ+ëÐ+äÐ+ÝÐ+ÖÐ+ÏÐ+ÈÐ+ÁÐ+ºÐ+³Ð+¬Ð+¥Ð+žÐ+—Ð+Ð+‰Ð+‚Ð+{Ð+tÐ+mÐ+fÐ+_Ð+XÐ+QÐ+JÐ+CÐ+<Ð+5Ð+.Ð+'Ð+ Ð+Ð+Ð+ Ð+Ð+ýÏ+öÏ+ïÏ+èÏ+áÏ+ÚÏ+ÓÏ+ÌÏ+ÅÏ+¾Ï+·Ï+°Ï+©Ï+¢Ï+›Ï+”Ï+Ï+†Ï+Ï+xÏ+qÏ+jÏ+cÏ+\Ï+UÏ+NÏ+GÏ+@Ï+9Ï+2Ï++Ï+$Ï+Ï+Ï+Ï+Ï+Ï+úÎ+óÎ+ìÎ+åÎ+ÞÎ+×Î+ÐÎ+ÉÎ+ÂÎ+»Î+´Î+­Î+¦Î+ŸÎ+˜Î+‘Î+ŠÎ+ƒÎ+|Î+uÎ+nÎ+gÎ+`Î+YÎ+RÎ+KÎ+DÎ+=Î+6Î+/Î+(Î+!Î+Î+Î+ Î+Î+þÍ+÷Í+ðÍ+éÍ+âÍ+ÛÍ+ÔÍ+ÍÍ+ÆÍ+¿Í+¸Í+±Í+ªÍ+£Í+œÍ+•Í+ŽÍ+‡Í+€Í+yÍ+rÍ+kÍ+dÍ+]Í+VÍ+OÍ+HÍ+AÍ+:Í+3Í+,Í+%Í+Í+Í+Í+ Í+Í+ûÌ+ôÌ+íÌ+æÌ+ßÌ+ØÌ+ÑÌ+ÊÌ+ÃÌ+¼Ì+µÌ+®Ì+§Ì+ Ì+™Ì+’Ì+‹Ì+„Ì+}Ì+vÌ+oÌ+hÌ+aÌ+ZÌ+SÌ+LÌ+EÌ+>Ì+7Ì+0Ì+)Ì+"Ì+Ì+Ì+ Ì+Ì+ÿË+øË+ñË+êË+ãË+ÜË+ÕË+ÎË+ÇË+ÀË+¹Ë+²Ë+«Ë+¤Ë+Ë+–Ë+Ë+ˆË+Ë+zË+sË+lË+eË+^Ë+WË+PË+IË+BË+;Ë+4Ë+-Ë+&Ë+Ë+Ë+Ë+ Ë+Ë+üÊ+õÊ+îÊ+çÊ+àÊ+ÙÊ+ÒÊ+ËÊ+ÄÊ+½Ê+¶Ê+¯Ê+¨Ê+¡Ê+šÊ+“Ê+ŒÊ+…Ê+~Ê+wÊ+pÊ+iÊ+bÊ+[Ê+TÊ+MÊ+FÊ+?Ê+8Ê+1Ê+*Ê+#Ê+Ê+Ê+Ê+Ê+Ê+ùÉ+òÉ+ëÉ+äÉ+ÝÉ+ÖÉ+ÏÉ+ÈÉ+ÁÉ+ºÉ+³É+¬É+¥É+žÉ+—É+É+‰É+‚É+{É+tÉ+mÉ+fÉ+_É+XÉ+QÉ+JÉ+CÉ+<É+5É+.É+'É+ É+É+É+ É+É+ýÈ+öÈ+ïÈ+èÈ+áÈ+ÚÈ+ÓÈ+ÌÈ+ÅÈ+¾È+·È+°È+©È+¢È+›È+”È+È+†È+È+xÈ+qÈ+jÈ+cÈ+\È+UÈ+NÈ+GÈ+@È+9È+2È++È+$È+È+È+È+È+È+úÇ+óÇ+ìÇ+åÇ+ÞÇ+×Ç+ÐÇ+ÉÇ+ÂÇ+»Ç+´Ç+­Ç+¦Ç+ŸÇ+˜Ç+‘Ç+ŠÇ+ƒÇ+|Ç+uÇ+nÇ+gÇ+`Ç+YÇ+RÇ+KÇ+DÇ+=Ç+6Ç+/Ç+(Ç+!Ç+Ç+Ç+ Ç+Ç+þÆ+÷Æ+ðÆ+éÆ+âÆ+ÛÆ+ÔÆ+ÍÆ+ÆÆ+¿Æ+¸Æ+±Æ+ªÆ+£Æ+œÆ+•Æ+ŽÆ+‡Æ+€Æ+yÆ+rÆ+kÆ+dÆ+]Æ+VÆ+OÆ+HÆ+AÆ+:Æ+3Æ+,Æ+%Æ+Æ+Æ+Æ+ Æ+Æ+ûÅ+ôÅ+íÅ+æÅ+ßÅ+ØÅ+ÑÅ+ÊÅ+ÃÅ+¼Å+µÅ+®Å+§Å+ Å+™Å+’Å+‹Å+„Å+}Å+vÅ+oÅ+hÅ+aÅ+ZÅ+SÅ+LÅ+EÅ+>Å+7Å+0Å+)Å+"Å+Å+Å+ Å+Å+ÿÄ+øÄ+ñÄ+êÄ+ãÄ+ÜÄ+ÕÄ+ÎÄ+ÇÄ+ÀÄ+¹Ä+²Ä+«Ä+¤Ä+Ä+–Ä+Ä+ˆÄ+Ä+zÄ+sÄ+lÄ+eÄ+^Ä+WÄ+PÄ+IÄ+BÄ+;Ä+4Ä+-Ä+&Ä+Ä+Ä+Ä+ Ä+Ä+üÃ+õÃ+îÃ+çÃ+àÃ+ÙÃ+ÒÃ+ËÃ+ÄÃ+½Ã+¶Ã+¯Ã+¨Ã+¡Ã+šÃ+“Ã+ŒÃ+…Ã+~Ã+wÃ+pÃ+iÃ+bÃ+[Ã+TÃ+MÃ+FÃ+?Ã+8Ã+1Ã+*Ã+#Ã+Ã+Ã+Ã+Ã+Ã+ùÂ+òÂ+ëÂ+äÂ+ÝÂ+ÖÂ+ÏÂ+ÈÂ+ÁÂ+ºÂ+³Â+¬Â+¥Â+žÂ+—Â+Â+‰Â+‚Â+{Â+tÂ+mÂ+fÂ+_Â+XÂ+QÂ+JÂ+CÂ+<Â+5Â+.Â+'Â+ Â+Â+Â+ Â+Â+ýÁ+öÁ+ïÁ+èÁ+áÁ+ÚÁ+ÓÁ+ÌÁ+ÅÁ+¾Á+·Á+°Á+©Á+¢Á+›Á+”Á+Á+†Á+Á+xÁ+qÁ+jÁ+cÁ+\Á+UÁ+NÁ+GÁ+@Á+9Á+2Á++Á+$Á+Á+Á+Á+Á+Á+úÀ+óÀ+ìÀ+åÀ+ÞÀ+×À+ÐÀ+ÉÀ+ÂÀ+»À+´À+­À+¦À+ŸÀ+˜À+‘À+ŠÀ+ƒÀ+|À+uÀ+nÀ+gÀ+`À+YÀ+RÀ+KÀ+DÀ+=À+6À+/À+(À+!À+À+À+ À+À+þ¿+÷¿+ð¿+é¿+â¿+Û¿+Ô¿+Í¿+Æ¿+¿¿+¸¿+±¿+ª¿+£¿+œ¿+•¿+Ž¿+‡¿+€¿+y¿+r¿+k¿+d¿+]¿+V¿+O¿+H¿+A¿+:¿+3¿+,¿+%¿+¿+¿+¿+ ¿+¿+û¾+ô¾+í¾+æ¾+ß¾+ؾ+Ѿ+ʾ+þ+¼¾+µ¾+®¾+§¾+ ¾+™¾+’¾+‹¾+„¾+}¾+v¾+o¾+h¾+a¾+Z¾+S¾+L¾+E¾+>¾+7¾+0¾+)¾+"¾+¾+¾+ ¾+¾+ÿ½+ø½+ñ½+ê½+ã½+ܽ+Õ½+ν+ǽ+À½+¹½+²½+«½+¤½+½+–½+½+ˆ½+½+z½+s½+l½+e½+^½+W½+P½+I½+B½+;½+4½+-½+&½+½+½+½+ ½+½+ü¼+õ¼+î¼+ç¼+à¼+Ù¼+Ò¼+˼+ļ+½¼+¶¼+¯¼+¨¼+¡¼+š¼+“¼+Œ¼+…¼+~¼+w¼+p¼+i¼+b¼+[¼+T¼+M¼+F¼+?¼+8¼+1¼+*¼+#¼+¼+¼+¼+¼+¼+ù»+ò»+ë»+ä»+Ý»+Ö»+Ï»+È»+Á»+º»+³»+¬»+¥»+ž»+—»+»+‰»+‚»+{»+t»+m»+f»+_»+X»+Q»+J»+C»+<»+5»+.»+'»+ »+»+»+ »+»+ýº+öº+ïº+èº+áº+Úº+Óº+̺+ź+¾º+·º+°º+©º+¢º+›º+”º+º+†º+º+xº+qº+jº+cº+\º+Uº+Nº+Gº+@º+9º+2º++º+$º+º+º+º+º+º+ú¹+ó¹+ì¹+å¹+Þ¹+×¹+й+ɹ+¹+»¹+´¹+­¹+¦¹+Ÿ¹+˜¹+‘¹+й+ƒ¹+|¹+u¹+n¹+g¹+`¹+Y¹+R¹+K¹+D¹+=¹+6¹+/¹+(¹+!¹+¹+¹+ ¹+¹+þ¸+÷¸+ð¸+é¸+â¸+Û¸+Ô¸+͸+Ƹ+¿¸+¸¸+±¸+ª¸+£¸+œ¸+•¸+ޏ+‡¸+€¸+y¸+r¸+k¸+d¸+]¸+V¸+O¸+H¸+A¸+:¸+3¸+,¸+%¸+¸+¸+¸+ ¸+¸+û·+ô·+í·+æ·+ß·+Ø·+Ñ·+Ê·+÷+¼·+µ·+®·+§·+ ·+™·+’·+‹·+„·+}·+v·+o·+h·+a·+Z·+S·+L·+E·+>·+7·+0·+)·+"·+·+·+ ·+·+ÿ¶+ø¶+ñ¶+ê¶+ã¶+ܶ+Õ¶+ζ+Ƕ+À¶+¹¶+²¶+«¶+¤¶+¶+–¶+¶+ˆ¶+¶+z¶+s¶+l¶+e¶+^¶+W¶+P¶+I¶+B¶+;¶+4¶+-¶+&¶+¶+¶+¶+ ¶+¶+üµ+õµ+îµ+çµ+àµ+Ùµ+Òµ+˵+ĵ+½µ+¶µ+¯µ+¨µ+¡µ+šµ+“µ+Œµ+…µ+~µ+wµ+pµ+iµ+bµ+[µ+Tµ+Mµ+Fµ+?µ+8µ+1µ+*µ+#µ+µ+µ+µ+µ+µ+ù´+ò´+ë´+ä´+Ý´+Ö´+Ï´+È´+Á´+º´+³´+¬´+¥´+ž´+—´+´+‰´+‚´+{´+t´+m´+f´+_´+X´+Q´+J´+C´+<´+5´+.´+'´+ ´+´+´+ ´+´+ý³+ö³+ï³+è³+á³+Ú³+Ó³+̳+ų+¾³+·³+°³+©³+¢³+›³+”³+³+†³+³+x³+q³+j³+c³+\³+U³+N³+G³+@³+9³+2³++³+$³+³+³+³+³+³+ú²+ó²+ì²+å²+Þ²+ײ+в+ɲ+²+»²+´²+­²+¦²+Ÿ²+˜²+‘²+в+ƒ²+|²+u²+n²+g²+`²+Y²+R²+K²+D²+=²+6²+/²+(²+!²+²+²+ ²+²+þ±+÷±+ð±+é±+â±+Û±+Ô±+ͱ+Ʊ+¿±+¸±+±±+ª±+£±+œ±+•±+ޱ+‡±+€±+y±+r±+k±+d±+]±+V±+O±+H±+A±+:±+3±+,±+%±+±+±+±+ ±+±+û°+ô°+í°+æ°+ß°+ذ+Ѱ+ʰ+ð+¼°+µ°+®°+§°+ °+™°+’°+‹°+„°+}°+v°+o°+h°+a°+Z°+S°+L°+E°+>°+7°+0°+)°+"°+°+°+ °+°+ÿ¯+ø¯+ñ¯+ê¯+ã¯+ܯ+Õ¯+ί+ǯ+À¯+¹¯+²¯+«¯+¤¯+¯+–¯+¯+ˆ¯+¯+z¯+s¯+l¯+e¯+^¯+W¯+P¯+I¯+B¯+;¯+4¯+-¯+&¯+¯+¯+¯+ ¯+¯+ü®+õ®+î®+ç®+à®+Ù®+Ò®+Ë®+Ä®+½®+¶®+¯®+¨®+¡®+š®+“®+Œ®+…®+~®+w®+p®+i®+b®+[®+T®+M®+F®+?®+8®+1®+*®+#®+®+®+®+®+®+ù­+ò­+ë­+ä­+Ý­+Ö­+Ï­+È­+Á­+º­+³­+¬­+¥­+ž­+—­+­+‰­+‚­+{­+t­+m­+f­+_­+X­+Q­+J­+C­+<­+5­+.­+'­+ ­+­+­+ ­+­+ý¬+ö¬+ï¬+è¬+á¬+Ú¬+Ó¬+̬+Ŭ+¾¬+·¬+°¬+©¬+¢¬+›¬+”¬+¬+†¬+¬+x¬+q¬+j¬+c¬+\¬+U¬+N¬+G¬+@¬+9¬+2¬++¬+$¬+¬+¬+¬+¬+¬+ú«+ó«+ì«+å«+Þ«+׫+Ы+É«+«+»«+´«+­«+¦«+Ÿ«+˜«+‘«+Š«+ƒ«+|«+u«+n«+g«+`«+Y«+R«+K«+D«+=«+6«+/«+(«+!«+«+«+ «+«+þª+÷ª+ðª+éª+âª+Ûª+Ôª+ͪ+ƪ+¿ª+¸ª+±ª+ªª+£ª+œª+•ª+Žª+‡ª+€ª+yª+rª+kª+dª+]ª+Vª+Oª+Hª+Aª+:ª+3ª+,ª+%ª+ª+ª+ª+ ª+ª+û©+ô©+í©+æ©+ß©+Ø©+Ñ©+Ê©+é+¼©+µ©+®©+§©+ ©+™©+’©+‹©+„©+}©+v©+o©+h©+a©+Z©+S©+L©+E©+>©+7©+0©+)©+"©+©+©+ ©+©+ÿ¨+ø¨+ñ¨+ê¨+ã¨+ܨ+Õ¨+Ψ+Ǩ+À¨+¹¨+²¨+«¨+¤¨+¨+–¨+¨+ˆ¨+¨+z¨+s¨+l¨+e¨+^¨+W¨+P¨+I¨+B¨+;¨+4¨+-¨+&¨+¨+¨+¨+ ¨+¨+ü§+õ§+î§+ç§+à§+Ù§+Ò§+˧+ħ+½§+¶§+¯§+¨§+¡§+š§+“§+Œ§+…§+~§+w§+p§+i§+b§+[§+T§+M§+F§+?§+8§+1§+*§+#§+§+§+§+§+§+ù¦+ò¦+ë¦+ä¦+ݦ+Ö¦+Ϧ+Ȧ+Á¦+º¦+³¦+¬¦+¥¦+ž¦+—¦+¦+‰¦+‚¦+{¦+t¦+m¦+f¦+_¦+X¦+Q¦+J¦+C¦+<¦+5¦+.¦+'¦+ ¦+¦+¦+ ¦+¦+ý¥+ö¥+ï¥+è¥+á¥+Ú¥+Ó¥+Ì¥+Å¥+¾¥+·¥+°¥+©¥+¢¥+›¥+”¥+¥+†¥+¥+x¥+q¥+j¥+c¥+\¥+U¥+N¥+G¥+@¥+9¥+2¥++¥+$¥+¥+¥+¥+¥+¥+ú¤+ó¤+ì¤+å¤+Þ¤+פ+Ф+ɤ+¤+»¤+´¤+­¤+¦¤+Ÿ¤+˜¤+‘¤+Ф+ƒ¤+|¤+u¤+n¤+g¤+`¤+Y¤+R¤+K¤+D¤+=¤+6¤+/¤+(¤+!¤+¤+¤+ ¤+¤+þ£+÷£+ð£+é£+â£+Û£+Ô£+Í£+Æ£+¿£+¸£+±£+ª£+££+œ£+•£+Ž£+‡£+€£+y£+r£+k£+d£+]£+V£+O£+H£+A£+:£+3£+,£+%£+£+£+£+ £+£+û¢+ô¢+í¢+æ¢+ߢ+Ø¢+Ñ¢+Ê¢+â+¼¢+µ¢+®¢+§¢+ ¢+™¢+’¢+‹¢+„¢+}¢+v¢+o¢+h¢+a¢+Z¢+S¢+L¢+E¢+>¢+7¢+0¢+)¢+"¢+¢+¢+ ¢+¢+ÿ¡+ø¡+ñ¡+ê¡+ã¡+Ü¡+Õ¡+Ρ+Ç¡+À¡+¹¡+²¡+«¡+¤¡+¡+–¡+¡+ˆ¡+¡+z¡+s¡+l¡+e¡+^¡+W¡+P¡+I¡+B¡+;¡+4¡+-¡+&¡+¡+¡+¡+ ¡+¡+ü +õ +î +ç +à +Ù +Ò +Ë +Ä +½ +¶ +¯ +¨ +¡ +š +“ +Œ +… +~ +w +p +i +b +[ +T +M +F +? +8 +1 +* +# + + + + + +ùŸ+òŸ+ëŸ+äŸ+ÝŸ+ÖŸ+ÏŸ+ÈŸ+ÁŸ+ºŸ+³Ÿ+¬Ÿ+¥Ÿ+žŸ+—Ÿ+Ÿ+‰Ÿ+‚Ÿ+{Ÿ+tŸ+mŸ+fŸ+_Ÿ+XŸ+QŸ+JŸ+CŸ+<Ÿ+5Ÿ+.Ÿ+'Ÿ+ Ÿ+Ÿ+Ÿ+ Ÿ+Ÿ+ýž+öž+ïž+èž+áž+Úž+Óž+Ìž+Åž+¾ž+·ž+°ž+©ž+¢ž+›ž+”ž+ž+†ž+ž+xž+qž+jž+cž+\ž+Už+Nž+Gž+@ž+9ž+2ž++ž+$ž+ž+ž+ž+ž+ž+ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þœ+÷œ+ðœ+éœ+âœ+Ûœ+Ôœ+Íœ+Æœ+¿œ+¸œ+±œ+ªœ+£œ+œœ+•œ+Žœ+‡œ+€œ+yœ+rœ+kœ+dœ+]œ+Vœ+Oœ+Hœ+Aœ+:œ+3œ+,œ+%œ+œ+œ+œ+ œ+œ+û›+ô›+í›+æ›+ß›+Ø›+Ñ›+Ê›+Û+¼›+µ›+®›+§›+ ›+™›+’›+‹›+„›+}›+v›+o›+h›+a›+Z›+S›+L›+E›+>›+7›+0›+)›+"›+›+›+ ›+›+ÿš+øš+ñš+êš+ãš+Üš+Õš+Κ+Çš+Àš+¹š+²š+«š+¤š+š+–š+š+ˆš+š+zš+sš+lš+eš+^š+Wš+Pš+Iš+Bš+;š+4š+-š+&š+š+š+š+ š+š+ü™+õ™+î™+ç™+à™+Ù™+Ò™+Ë™+Ä™+½™+¶™+¯™+¨™+¡™+š™+“™+Œ™+…™+~™+w™+p™+i™+b™+[™+T™+M™+F™+?™+8™+1™+*™+#™+™+™+™+™+™+ù˜+ò˜+ë˜+ä˜+ݘ+Ö˜+Ϙ+Ș+Á˜+º˜+³˜+¬˜+¥˜+ž˜+—˜+˜+‰˜+‚˜+{˜+t˜+m˜+f˜+_˜+X˜+Q˜+J˜+C˜+<˜+5˜+.˜+'˜+ ˜+˜+˜+ ˜+˜+ý—+ö—+ï—+è—+á—+Ú—+Ó—+Ì—+Å—+¾—+·—+°—+©—+¢—+›—+”—+—+†—+—+x—+q—+j—+c—+\—+U—+N—+G—+@—+9—+2—++—+$—+—+—+—+—+—+ú–+ó–+ì–+å–+Þ–+×–+Ж+É–+–+»–+´–+­–+¦–+Ÿ–+˜–+‘–+Š–+ƒ–+|–+u–+n–+g–+`–+Y–+R–+K–+D–+=–+6–+/–+(–+!–+–+–+ –+–+þ•+÷•+ð•+é•+â•+Û•+Ô•+Í•+Æ•+¿•+¸•+±•+ª•+£•+œ•+••+Ž•+‡•+€•+y•+r•+k•+d•+]•+V•+O•+H•+A•+:•+3•+,•+%•+•+•+•+ •+•+û”+ô”+í”+æ”+ß”+Ø”+Ñ”+Ê”+Ô+¼”+µ”+®”+§”+ ”+™”+’”+‹”+„”+}”+v”+o”+h”+a”+Z”+S”+L”+E”+>”+7”+0”+)”+"”+”+”+ ”+”+ÿ“+ø“+ñ“+ê“+ã“+Ü“+Õ“+Γ+Ç“+À“+¹“+²“+«“+¤“+“+–“+“+ˆ“+“+z“+s“+l“+e“+^“+W“+P“+I“+B“+;“+4“+-“+&“+“+“+“+ “+“+ü’+õ’+î’+ç’+à’+Ù’+Ò’+Ë’+Ä’+½’+¶’+¯’+¨’+¡’+š’+“’+Œ’+…’+~’+w’+p’+i’+b’+[’+T’+M’+F’+?’+8’+1’+*’+#’+’+’+’+’+’+ù‘+ò‘+ë‘+ä‘+Ý‘+Ö‘+Ï‘+È‘+Á‘+º‘+³‘+¬‘+¥‘+ž‘+—‘+‘+‰‘+‚‘+{‘+t‘+m‘+f‘+_‘+X‘+Q‘+J‘+C‘+<‘+5‘+.‘+'‘+ ‘+‘+‘+ ‘+‘+ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þŽ+÷Ž+ðŽ+éŽ+âŽ+ÛŽ+ÔŽ+ÍŽ+ÆŽ+¿Ž+¸Ž+±Ž+ªŽ+£Ž+œŽ+•Ž+ŽŽ+‡Ž+€Ž+yŽ+rŽ+kŽ+dŽ+]Ž+VŽ+OŽ+HŽ+AŽ+:Ž+3Ž+,Ž+%Ž+Ž+Ž+Ž+ Ž+Ž+û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿŒ+øŒ+ñŒ+êŒ+ãŒ+ÜŒ+ÕŒ+ÎŒ+ÇŒ+ÀŒ+¹Œ+²Œ+«Œ+¤Œ+Œ+–Œ+Œ+ˆŒ+Œ+zŒ+sŒ+lŒ+eŒ+^Œ+WŒ+PŒ+IŒ+BŒ+;Œ+4Œ+-Œ+&Œ+Œ+Œ+Œ+ Œ+Œ+ü‹+õ‹+î‹+ç‹+à‹+Ù‹+Ò‹+Ë‹+Ä‹+½‹+¶‹+¯‹+¨‹+¡‹+š‹+“‹+Œ‹+…‹+~‹+w‹+p‹+i‹+b‹+[‹+T‹+M‹+F‹+?‹+8‹+1‹+*‹+#‹+‹+‹+‹+‹+‹+ùŠ+òŠ+ëŠ+äŠ+ÝŠ+ÖŠ+ÏŠ+ÈŠ+ÁŠ+ºŠ+³Š+¬Š+¥Š+žŠ+—Š+Š+‰Š+‚Š+{Š+tŠ+mŠ+fŠ+_Š+XŠ+QŠ+JŠ+CŠ+<Š+5Š+.Š+'Š+ Š+Š+Š+ Š+Š+ý‰+ö‰+ï‰+è‰+á‰+Ú‰+Ó‰+̉+ʼn+¾‰+·‰+°‰+©‰+¢‰+›‰+”‰+‰+†‰+‰+x‰+q‰+j‰+c‰+\‰+U‰+N‰+G‰+@‰+9‰+2‰++‰+$‰+‰+‰+‰+‰+‰+úˆ+óˆ+ìˆ+åˆ+Þˆ+׈+Ј+Ɉ+ˆ+»ˆ+´ˆ+­ˆ+¦ˆ+Ÿˆ+˜ˆ+‘ˆ+Šˆ+ƒˆ+|ˆ+uˆ+nˆ+gˆ+`ˆ+Yˆ+Rˆ+Kˆ+Dˆ+=ˆ+6ˆ+/ˆ+(ˆ+!ˆ+ˆ+ˆ+ ˆ+ˆ+þ‡+÷‡+ð‡+é‡+â‡+Û‡+Ô‡+͇+Ƈ+¿‡+¸‡+±‡+ª‡+£‡+œ‡+•‡+އ+‡‡+€‡+y‡+r‡+k‡+d‡+]‡+V‡+O‡+H‡+A‡+:‡+3‡+,‡+%‡+‡+‡+‡+ ‡+‡+û†+ô†+í†+æ†+߆+؆+ц+ʆ+Æ+¼†+µ†+®†+§†+ †+™†+’†+‹†+„†+}†+v†+o†+h†+a†+Z†+S†+L†+E†+>†+7†+0†+)†+"†+†+†+ †+†+ÿ…+ø…+ñ…+ê…+ã…+Ü…+Õ…+Î…+Ç…+À…+¹…+²…+«…+¤…+…+–…+…+ˆ…+…+z…+s…+l…+e…+^…+W…+P…+I…+B…+;…+4…+-…+&…+…+…+…+ …+…+ü„+õ„+î„+ç„+à„+Ù„+Ò„+Ë„+Ä„+½„+¶„+¯„+¨„+¡„+š„+“„+Œ„+…„+~„+w„+p„+i„+b„+[„+T„+M„+F„+?„+8„+1„+*„+#„+„+„+„+„+„+ùƒ+òƒ+ëƒ+äƒ+݃+Öƒ+σ+ȃ+Áƒ+ºƒ+³ƒ+¬ƒ+¥ƒ+žƒ+—ƒ+ƒ+‰ƒ+‚ƒ+{ƒ+tƒ+mƒ+fƒ+_ƒ+Xƒ+Qƒ+Jƒ+Cƒ+<ƒ+5ƒ+.ƒ+'ƒ+ ƒ+ƒ+ƒ+ ƒ+ƒ+ý‚+ö‚+ï‚+è‚+á‚+Ú‚+Ó‚+Ì‚+Å‚+¾‚+·‚+°‚+©‚+¢‚+›‚+”‚+‚+†‚+‚+x‚+q‚+j‚+c‚+\‚+U‚+N‚+G‚+@‚+9‚+2‚++‚+$‚+‚+‚+‚+‚+‚+ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ€+÷€+ð€+é€+â€+Û€+Ô€+Í€+Æ€+¿€+¸€+±€+ª€+£€+œ€+•€+Ž€+‡€+€€+y€+r€+k€+d€+]€+V€+O€+H€+A€+:€+3€+,€+%€+€+€+€+ €+€+û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿ~+ø~+ñ~+ê~+ã~+Ü~+Õ~+Î~+Ç~+À~+¹~+²~+«~+¤~+~+–~+~+ˆ~+~+z~+s~+l~+e~+^~+W~+P~+I~+B~+;~+4~+-~+&~+~+~+~+ ~+~+ü}+õ}+î}+ç}+à}+Ù}+Ò}+Ë}+Ä}+½}+¶}+¯}+¨}+¡}+š}+“}+Œ}+…}+~}+w}+p}+i}+b}+[}+T}+M}+F}+?}+8}+1}+*}+#}+}+}+}+}+}+ù|+ò|+ë|+ä|+Ý|+Ö|+Ï|+È|+Á|+º|+³|+¬|+¥|+ž|+—|+|+‰|+‚|+{|+t|+m|+f|+_|+X|+Q|+J|+C|+<|+5|+.|+'|+ |+|+|+ |+|+ý{+ö{+ï{+è{+á{+Ú{+Ó{+Ì{+Å{+¾{+·{+°{+©{+¢{+›{+”{+{+†{+{+x{+q{+j{+c{+\{+U{+N{+G{+@{+9{+2{++{+${+{+{+{+{+{+úz+óz+ìz+åz+Þz+×z+Ðz+Éz+Âz+»z+´z+­z+¦z+Ÿz+˜z+‘z+Šz+ƒz+|z+uz+nz+gz+`z+Yz+Rz+Kz+Dz+=z+6z+/z+(z+!z+z+z+ z+z+þy+÷y+ðy+éy+ây+Ûy+Ôy+Íy+Æy+¿y+¸y+±y+ªy+£y+œy+•y+Žy+‡y+€y+yy+ry+ky+dy+]y+Vy+Oy+Hy+Ay+:y+3y+,y+%y+y+y+y+ y+y+ûx+ôx+íx+æx+ßx+Øx+Ñx+Êx+Ãx+¼x+µx+®x+§x+ x+™x+’x+‹x+„x+}x+vx+ox+hx+ax+Zx+Sx+Lx+Ex+>x+7x+0x+)x+"x+x+x+ x+x+ÿw+øw+ñw+êw+ãw+Üw+Õw+Îw+Çw+Àw+¹w+²w+«w+¤w+w+–w+w+ˆw+w+zw+sw+lw+ew+^w+Ww+Pw+Iw+Bw+;w+4w+-w+&w+w+w+w+ w+w+üv+õv+îv+çv+àv+Ùv+Òv+Ëv+Äv+½v+¶v+¯v+¨v+¡v+šv+“v+Œv+…v+~v+wv+pv+iv+bv+[v+Tv+Mv+Fv+?v+8v+1v+*v+#v+v+v+v+v+v+ùu+òu+ëu+äu+Ýu+Öu+Ïu+Èu+Áu+ºu+³u+¬u+¥u+žu+—u+u+‰u+‚u+{u+tu+mu+fu+_u+Xu+Qu+Ju+Cu+q+7q+0q+)q+"q+q+q+ q+q+ÿp+øp+ñp+êp+ãp+Üp+Õp+Îp+Çp+Àp+¹p+²p+«p+¤p+p+–p+p+ˆp+p+zp+sp+lp+ep+^p+Wp+Pp+Ip+Bp+;p+4p+-p+&p+p+p+p+ p+p+üo+õo+îo+ço+ào+Ùo+Òo+Ëo+Äo+½o+¶o+¯o+¨o+¡o+šo+“o+Œo+…o+~o+wo+po+io+bo+[o+To+Mo+Fo+?o+8o+1o+*o+#o+o+o+o+o+o+ùn+òn+ën+än+Ýn+Ön+Ïn+Èn+Án+ºn+³n+¬n+¥n+žn+—n+n+‰n+‚n+{n+tn+mn+fn+_n+Xn+Qn+Jn+Cn+j+7j+0j+)j+"j+j+j+ j+j+ÿi+øi+ñi+êi+ãi+Üi+Õi+Îi+Çi+Ài+¹i+²i+«i+¤i+i+–i+i+ˆi+i+zi+si+li+ei+^i+Wi+Pi+Ii+Bi+;i+4i+-i+&i+i+i+i+ i+i+üh+õh+îh+çh+àh+Ùh+Òh+Ëh+Äh+½h+¶h+¯h+¨h+¡h+šh+“h+Œh+…h+~h+wh+ph+ih+bh+[h+Th+Mh+Fh+?h+8h+1h+*h+#h+h+h+h+h+h+ùg+òg+ëg+äg+Ýg+Ög+Ïg+Èg+Ág+ºg+³g+¬g+¥g+žg+—g+g+‰g+‚g+{g+tg+mg+fg+_g+Xg+Qg+Jg+Cg+c+7c+0c+)c+"c+c+c+ c+c+ÿb+øb+ñb+êb+ãb+Üb+Õb+Îb+Çb+Àb+¹b+²b+«b+¤b+b+–b+b+ˆb+b+zb+sb+lb+eb+^b+Wb+Pb+Ib+Bb+;b+4b+-b+&b+b+b+b+ b+b+üa+õa+îa+ça+àa+Ùa+Òa+Ëa+Äa+½a+¶a+¯a+¨a+¡a+ša+“a+Œa+…a+~a+wa+pa+ia+ba+[a+Ta+Ma+Fa+?a+8a+1a+*a+#a+a+a+a+a+a+ù`+ò`+ë`+ä`+Ý`+Ö`+Ï`+È`+Á`+º`+³`+¬`+¥`+ž`+—`+`+‰`+‚`+{`+t`+m`+f`+_`+X`+Q`+J`+C`+<`+5`+.`+'`+ `+`+`+ `+`+ý_+ö_+ï_+è_+á_+Ú_+Ó_+Ì_+Å_+¾_+·_+°_+©_+¢_+›_+”_+_+†_+_+x_+q_+j_+c_+\_+U_+N_+G_+@_+9_+2_++_+$_+_+_+_+_+_+ú^+ó^+ì^+å^+Þ^+×^+Ð^+É^+Â^+»^+´^+­^+¦^+Ÿ^+˜^+‘^+Š^+ƒ^+|^+u^+n^+g^+`^+Y^+R^+K^+D^+=^+6^+/^+(^+!^+^+^+ ^+^+þ]+÷]+ð]+é]+â]+Û]+Ô]+Í]+Æ]+¿]+¸]+±]+ª]+£]+œ]+•]+Ž]+‡]+€]+y]+r]+k]+d]+]]+V]+O]+H]+A]+:]+3]+,]+%]+]+]+]+ ]+]+û\+ô\+í\+æ\+ß\+Ø\+Ñ\+Ê\+Ã\+¼\+µ\+®\+§\+ \+™\+’\+‹\+„\+}\+v\+o\+h\+a\+Z\+S\+L\+E\+>\+7\+0\+)\+"\+\+\+ \+\+ÿ[+ø[+ñ[+ê[+ã[+Ü[+Õ[+Î[+Ç[+À[+¹[+²[+«[+¤[+[+–[+[+ˆ[+[+z[+s[+l[+e[+^[+W[+P[+I[+B[+;[+4[+-[+&[+[+[+[+ [+[+üZ+õZ+îZ+çZ+àZ+ÙZ+ÒZ+ËZ+ÄZ+½Z+¶Z+¯Z+¨Z+¡Z+šZ+“Z+ŒZ+…Z+~Z+wZ+pZ+iZ+bZ+[Z+TZ+MZ+FZ+?Z+8Z+1Z+*Z+#Z+Z+Z+Z+Z+Z+ùY+òY+ëY+äY+ÝY+ÖY+ÏY+ÈY+ÁY+ºY+³Y+¬Y+¥Y+žY+—Y+Y+‰Y+‚Y+{Y+tY+mY+fY+_Y+XY+QY+JY+CY+U+7U+0U+)U+"U+U+U+ U+U+ÿT+øT+ñT+êT+ãT+ÜT+ÕT+ÎT+ÇT+ÀT+¹T+²T+«T+¤T+T+–T+T+ˆT+T+zT+sT+lT+eT+^T+WT+PT+IT+BT+;T+4T+-T+&T+T+T+T+ T+T+üS+õS+îS+çS+àS+ÙS+ÒS+ËS+ÄS+½S+¶S+¯S+¨S+¡S+šS+“S+ŒS+…S+~S+wS+pS+iS+bS+[S+TS+MS+FS+?S+8S+1S+*S+#S+S+S+S+S+S+ùR+òR+ëR+äR+ÝR+ÖR+ÏR+ÈR+ÁR+ºR+³R+¬R+¥R+žR+—R+R+‰R+‚R+{R+tR+mR+fR+_R+XR+QR+JR+CR+N+7N+0N+)N+"N+N+N+ N+N+ÿM+øM+ñM+êM+ãM+ÜM+ÕM+ÎM+ÇM+ÀM+¹M+²M+«M+¤M+M+–M+M+ˆM+M+zM+sM+lM+eM+^M+WM+PM+IM+BM+;M+4M+-M+&M+M+M+M+ M+M+üL+õL+îL+çL+àL+ÙL+ÒL+ËL+ÄL+½L+¶L+¯L+¨L+¡L+šL+“L+ŒL+…L+~L+wL+pL+iL+bL+[L+TL+ML+FL+?L+8L+1L+*L+#L+L+L+L+L+L+ùK+òK+ëK+äK+ÝK+ÖK+ÏK+ÈK+ÁK+ºK+³K+¬K+¥K+žK+—K+K+‰K+‚K+{K+tK+mK+fK+_K+XK+QK+JK+CK+G+7G+0G+)G+"G+G+G+ G+G+ÿF+øF+ñF+êF+ãF+ÜF+ÕF+ÎF+ÇF+ÀF+¹F+²F+«F+¤F+F+–F+F+ˆF+F+zF+sF+lF+eF+^F+WF+PF+IF+BF+;F+4F+-F+&F+F+F+F+ F+F+üE+õE+îE+çE+àE+ÙE+ÒE+ËE+ÄE+½E+¶E+¯E+¨E+¡E+šE+“E+ŒE+…E+~E+wE+pE+iE+bE+[E+TE+ME+FE+?E+8E+1E+*E+#E+E+E+E+E+E+ùD+òD+ëD+äD+ÝD+ÖD+ÏD+ÈD+ÁD+ºD+³D+¬D+¥D+žD+—D+D+‰D+‚D+{D+tD+mD+fD+_D+XD+QD+JD+CD+@+7@+0@+)@+"@+@+@+ @+@+ÿ?+ø?+ñ?+ê?+ã?+Ü?+Õ?+Î?+Ç?+À?+¹?+²?+«?+¤?+?+–?+?+ˆ?+?+z?+s?+l?+e?+^?+W?+P?+I?+B?+;?+4?+-?+&?+?+?+?+ ?+?+ü>+õ>+î>+ç>+à>+Ù>+Ò>+Ë>+Ä>+½>+¶>+¯>+¨>+¡>+š>+“>+Œ>+…>+~>+w>+p>+i>+b>+[>+T>+M>+F>+?>+8>+1>+*>+#>+>+>+>+>+>+ù=+ò=+ë=+ä=+Ý=+Ö=+Ï=+È=+Á=+º=+³=+¬=+¥=+ž=+—=+=+‰=+‚=+{=+t=+m=+f=+_=+X=+Q=+J=+C=+<=+5=+.=+'=+ =+=+=+ =+=+ý<+ö<+ï<+è<+á<+Ú<+Ó<+Ì<+Å<+¾<+·<+°<+©<+¢<+›<+”<+<+†<+<+x<+q<+j<+c<+\<+U<+N<+G<+@<+9<+2<++<+$<+<+<+<+<+<+ú;+ó;+ì;+å;+Þ;+×;+Ð;+É;+Â;+»;+´;+­;+¦;+Ÿ;+˜;+‘;+Š;+ƒ;+|;+u;+n;+g;+`;+Y;+R;+K;+D;+=;+6;+/;+(;+!;+;+;+ ;+;+þ:+÷:+ð:+é:+â:+Û:+Ô:+Í:+Æ:+¿:+¸:+±:+ª:+£:+œ:+•:+Ž:+‡:+€:+y:+r:+k:+d:+]:+V:+O:+H:+A:+::+3:+,:+%:+:+:+:+ :+:+û9+ô9+í9+æ9+ß9+Ø9+Ñ9+Ê9+Ã9+¼9+µ9+®9+§9+ 9+™9+’9+‹9+„9+}9+v9+o9+h9+a9+Z9+S9+L9+E9+>9+79+09+)9+"9+9+9+ 9+9+ÿ8+ø8+ñ8+ê8+ã8+Ü8+Õ8+Î8+Ç8+À8+¹8+²8+«8+¤8+8+–8+8+ˆ8+8+z8+s8+l8+e8+^8+W8+P8+I8+B8+;8+48+-8+&8+8+8+8+ 8+8+ü7+õ7+î7+ç7+à7+Ù7+Ò7+Ë7+Ä7+½7+¶7+¯7+¨7+¡7+š7+“7+Œ7+…7+~7+w7+p7+i7+b7+[7+T7+M7+F7+?7+87+17+*7+#7+7+7+7+7+7+ù6+ò6+ë6+ä6+Ý6+Ö6+Ï6+È6+Á6+º6+³6+¬6+¥6+ž6+—6+6+‰6+‚6+{6+t6+m6+f6+_6+X6+Q6+J6+C6+<6+56+.6+'6+ 6+6+6+ 6+6+ý5+ö5+ï5+è5+á5+Ú5+Ó5+Ì5+Å5+¾5+·5+°5+©5+¢5+›5+”5+5+†5+5+x5+q5+j5+c5+\5+U5+N5+G5+@5+95+25++5+$5+5+5+5+5+5+ú4+ó4+ì4+å4+Þ4+×4+Ð4+É4+Â4+»4+´4+­4+¦4+Ÿ4+˜4+‘4+Š4+ƒ4+|4+u4+n4+g4+`4+Y4+R4+K4+D4+=4+64+/4+(4+!4+4+4+ 4+4+þ3+÷3+ð3+é3+â3+Û3+Ô3+Í3+Æ3+¿3+¸3+±3+ª3+£3+œ3+•3+Ž3+‡3+€3+y3+r3+k3+d3+]3+V3+O3+H3+A3+:3+33+,3+%3+3+3+3+ 3+3+û2+ô2+í2+æ2+ß2+Ø2+Ñ2+Ê2+Ã2+¼2+µ2+®2+§2+ 2+™2+’2+‹2+„2+}2+v2+o2+h2+a2+Z2+S2+L2+E2+>2+72+02+)2+"2+2+2+ 2+2+ÿ1+ø1+ñ1+ê1+ã1+Ü1+Õ1+Î1+Ç1+À1+¹1+²1+«1+¤1+1+–1+1+ˆ1+1+z1+s1+l1+e1+^1+W1+P1+I1+B1+;1+41+-1+&1+1+1+1+ 1+1+ü0+õ0+î0+ç0+à0+Ù0+Ò0+Ë0+Ä0+½0+¶0+¯0+¨0+¡0+š0+“0+Œ0+…0+~0+w0+p0+i0+b0+[0+T0+M0+F0+?0+80+10+*0+#0+0+0+0+0+0+ù/+ò/+ë/+ä/+Ý/+Ö/+Ï/+È/+Á/+º/+³/+¬/+¥/+ž/+—/+/+‰/+‚/+{/+t/+m/+f/+_/+X/+Q/+J/+C/+++7++0++)++"++++++ ++++ÿ*+ø*+ñ*+ê*+ã*+Ü*+Õ*+Î*+Ç*+À*+¹*+²*+«*+¤*+*+–*+*+ˆ*+*+z*+s*+l*+e*+^*+W*+P*+I*+B*+;*+4*+-*+&*+*+*+*+ *+*+ü)+õ)+î)+ç)+à)+Ù)+Ò)+Ë)+Ä)+½)+¶)+¯)+¨)+¡)+š)+“)+Œ)+…)+~)+w)+p)+i)+b)+[)+T)+M)+F)+?)+8)+1)+*)+#)+)+)+)+)+)+ù(+ò(+ë(+ä(+Ý(+Ö(+Ï(+È(+Á(+º(+³(+¬(+¥(+ž(+—(+(+‰(+‚(+{(+t(+m(+f(+_(+X(+Q(+J(+C(+<(+5(+.(+'(+ (+(+(+ (+(+ý'+ö'+ï'+è'+á'+Ú'+Ó'+Ì'+Å'+¾'+·'+°'+©'+¢'+›'+”'+'+†'+'+x'+q'+j'+c'+\'+U'+N'+G'+@'+9'+2'++'+$'+'+'+'+'+'+ú&+ó&+ì&+å&+Þ&+×&+Ð&+É&+Â&+»&+´&+­&+¦&+Ÿ&+˜&+‘&+Š&+ƒ&+|&+u&+n&+g&+`&+Y&+R&+K&+D&+=&+6&+/&+(&+!&+&+&+ &+&+þ%+÷%+ð%+é%+â%+Û%+Ô%+Í%+Æ%+¿%+¸%+±%+ª%+£%+œ%+•%+Ž%+‡%+€%+y%+r%+k%+d%+]%+V%+O%+H%+A%+:%+3%+,%+%%+%+%+%+ %+%+û$+ô$+í$+æ$+ß$+Ø$+Ñ$+Ê$+Ã$+¼$+µ$+®$+§$+ $+™$+’$+‹$+„$+}$+v$+o$+h$+a$+Z$+S$+L$+E$+>$+7$+0$+)$+"$+$+$+ $+$+ÿ#+ø#+ñ#+ê#+ã#+Ü#+Õ#+Î#+Ç#+À#+¹#+²#+«#+¤#+#+–#+#+ˆ#+#+z#+s#+l#+e#+^#+W#+P#+I#+B#+;#+4#+-#+&#+#+#+#+ #+#+ü"+õ"+î"+ç"+à"+Ù"+Ò"+Ë"+Ä"+½"+¶"+¯"+¨"+¡"+š"+“"+Œ"+…"+~"+w"+p"+i"+b"+["+T"+M"+F"+?"+8"+1"+*"+#"+"+"+"+"+"+ù!+ò!+ë!+ä!+Ý!+Ö!+Ï!+È!+Á!+º!+³!+¬!+¥!+ž!+—!+!+‰!+‚!+{!+t!+m!+f!+_!+X!+Q!+J!+C!++7+0+)+"+++ ++ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü +õ +î +ç +à +Ù +Ò +Ë +Ä +½ +¶ +¯ +¨ +¡ +š +“ +Œ +… +~ +w +p +i +b +[ +T +M +F +? +8 +1 +* +# + + + + + +ù +ò +ë +ä +Ý +Ö +Ï +È +Á +º +³ +¬ +¥ +ž +— + +‰ +‚ +{ +t +m +f +_ +X +Q +J +C +< +5 +. +' + + + + + +ý +ö +ï +è +á +Ú +Ó +Ì +Å +¾ +· +° +© +¢ +› +” + +† + +x +q +j +c +\ +U +N +G +@ +9 +2 ++ +$ + + + + + +ú +ó +ì +å +Þ +× +Ð +É + +» +´ +­ +¦ +Ÿ +˜ +‘ +Š +ƒ +| +u +n +g +` +Y +R +K +D += +6 +/ +( +! + + + + +þ +÷ +ð +é +â +Û +Ô +Í +Æ +¿ +¸ +± +ª +£ +œ +• +Ž +‡ +€ +y +r +k +d +] +V +O +H +A +: +3 +, +% + + + + + +û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û+ô+í+æ+ß+Ø+Ñ+Ê+Ã+¼+µ+®+§+ +™+’+‹+„+}+v+o+h+a+Z+S+L+E+>+7+0+)+"+++ ++ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++üÿ*õÿ*îÿ*çÿ*àÿ*Ùÿ*Òÿ*Ëÿ*Äÿ*½ÿ*¶ÿ*¯ÿ*¨ÿ*¡ÿ*šÿ*“ÿ*Œÿ*…ÿ*~ÿ*wÿ*pÿ*iÿ*bÿ*[ÿ*Tÿ*Mÿ*Fÿ*?ÿ*8ÿ*1ÿ**ÿ*#ÿ*ÿ*ÿ*ÿ*ÿ*ÿ*ùþ*òþ*ëþ*äþ*Ýþ*Öþ*Ïþ*Èþ*Áþ*ºþ*³þ*¬þ*¥þ*žþ*—þ*þ*‰þ*‚þ*{þ*tþ*mþ*fþ*_þ*Xþ*Qþ*Jþ*Cþ*<þ*5þ*.þ*'þ* þ*þ*þ* þ*þ*ýý*öý*ïý*èý*áý*Úý*Óý*Ìý*Åý*¾ý*·ý*°ý*©ý*¢ý*›ý*”ý*ý*†ý*ý*xý*qý*jý*cý*\ý*Uý*Ný*Gý*@ý*9ý*2ý*+ý*$ý*ý*ý*ý*ý*ý*úü*óü*ìü*åü*Þü*×ü*Ðü*Éü*Âü*»ü*´ü*­ü*¦ü*Ÿü*˜ü*‘ü*Šü*ƒü*|ü*uü*nü*gü*`ü*Yü*Rü*Kü*Dü*=ü*6ü*/ü*(ü*!ü*ü*ü* ü*ü*þû*÷û*ðû*éû*âû*Ûû*Ôû*Íû*Æû*¿û*¸û*±û*ªû*£û*œû*•û*Žû*‡û*€û*yû*rû*kû*dû*]û*Vû*Oû*Hû*Aû*:û*3û*,û*%û*û*û*û* û*û*ûú*ôú*íú*æú*ßú*Øú*Ñú*Êú*Ãú*¼ú*µú*®ú*§ú* ú*™ú*’ú*‹ú*„ú*}ú*vú*oú*hú*aú*Zú*Sú*Lú*Eú*>ú*7ú*0ú*)ú*"ú*ú*ú* ú*ú*ÿù*øù*ñù*êù*ãù*Üù*Õù*Îù*Çù*Àù*¹ù*²ù*«ù*¤ù*ù*–ù*ù*ˆù*ù*zù*sù*lù*eù*^ù*Wù*Pù*Iù*Bù*;ù*4ù*-ù*&ù*ù*ù*ù* ù*ù*üø*õø*îø*çø*àø*Ùø*Òø*Ëø*Äø*½ø*¶ø*¯ø*¨ø*¡ø*šø*“ø*Œø*…ø*~ø*wø*pø*iø*bø*[ø*Tø*Mø*Fø*?ø*8ø*1ø**ø*#ø*ø*ø*ø*ø*ø*ù÷*ò÷*ë÷*ä÷*Ý÷*Ö÷*Ï÷*È÷*Á÷*º÷*³÷*¬÷*¥÷*ž÷*—÷*÷*‰÷*‚÷*{÷*t÷*m÷*f÷*_÷*X÷*Q÷*J÷*C÷*<÷*5÷*.÷*'÷* ÷*÷*÷* ÷*÷*ýö*öö*ïö*èö*áö*Úö*Óö*Ìö*Åö*¾ö*·ö*°ö*©ö*¢ö*›ö*”ö*ö*†ö*ö*xö*qö*jö*cö*\ö*Uö*Nö*Gö*@ö*9ö*2ö*+ö*$ö*ö*ö*ö*ö*ö*úõ*óõ*ìõ*åõ*Þõ*×õ*Ðõ*Éõ*Âõ*»õ*´õ*­õ*¦õ*Ÿõ*˜õ*‘õ*Šõ*ƒõ*|õ*uõ*nõ*gõ*`õ*Yõ*Rõ*Kõ*Dõ*=õ*6õ*/õ*(õ*!õ*õ*õ* õ*õ*þô*÷ô*ðô*éô*âô*Ûô*Ôô*Íô*Æô*¿ô*¸ô*±ô*ªô*£ô*œô*•ô*Žô*‡ô*€ô*yô*rô*kô*dô*]ô*Vô*Oô*Hô*Aô*:ô*3ô*,ô*%ô*ô*ô*ô* ô*ô*ûó*ôó*íó*æó*ßó*Øó*Ñó*Êó*Ãó*¼ó*µó*®ó*§ó* ó*™ó*’ó*‹ó*„ó*}ó*vó*oó*hó*aó*Zó*Só*Ló*Eó*>ó*7ó*0ó*)ó*"ó*ó*ó* ó*ó*ÿò*øò*ñò*êò*ãò*Üò*Õò*Îò*Çò*Àò*¹ò*²ò*«ò*¤ò*ò*–ò*ò*ˆò*ò*zò*sò*lò*eò*^ò*Wò*Pò*Iò*Bò*;ò*4ò*-ò*&ò*ò*ò*ò* ò*ò*üñ*õñ*îñ*çñ*àñ*Ùñ*Òñ*Ëñ*Äñ*½ñ*¶ñ*¯ñ*¨ñ*¡ñ*šñ*“ñ*Œñ*…ñ*~ñ*wñ*pñ*iñ*bñ*[ñ*Tñ*Mñ*Fñ*?ñ*8ñ*1ñ**ñ*#ñ*ñ*ñ*ñ*ñ*ñ*ùð*òð*ëð*äð*Ýð*Öð*Ïð*Èð*Áð*ºð*³ð*¬ð*¥ð*žð*—ð*ð*‰ð*‚ð*{ð*tð*mð*fð*_ð*Xð*Qð*Jð*Cð*<ð*5ð*.ð*'ð* ð*ð*ð* ð*ð*ýï*öï*ïï*èï*áï*Úï*Óï*Ìï*Åï*¾ï*·ï*°ï*©ï*¢ï*›ï*”ï*ï*†ï*ï*xï*qï*jï*cï*\ï*Uï*Nï*Gï*@ï*9ï*2ï*+ï*$ï*ï*ï*ï*ï*ï*úî*óî*ìî*åî*Þî*×î*Ðî*Éî*Âî*»î*´î*­î*¦î*Ÿî*˜î*‘î*Šî*ƒî*|î*uî*nî*gî*`î*Yî*Rî*Kî*Dî*=î*6î*/î*(î*!î*î*î* î*î*þí*÷í*ðí*éí*âí*Ûí*Ôí*Íí*Æí*¿í*¸í*±í*ªí*£í*œí*•í*Ží*‡í*€í*yí*rí*kí*dí*]í*Ví*Oí*Hí*Aí*:í*3í*,í*%í*í*í*í* í*í*ûì*ôì*íì*æì*ßì*Øì*Ñì*Êì*Ãì*¼ì*µì*®ì*§ì* ì*™ì*’ì*‹ì*„ì*}ì*vì*oì*hì*aì*Zì*Sì*Lì*Eì*>ì*7ì*0ì*)ì*"ì*ì*ì* ì*ì*ÿë*øë*ñë*êë*ãë*Üë*Õë*Îë*Çë*Àë*¹ë*²ë*«ë*¤ë*ë*–ë*ë*ˆë*ë*zë*së*lë*eë*^ë*Wë*Pë*Ië*Bë*;ë*4ë*-ë*&ë*ë*ë*ë* ë*ë*üê*õê*îê*çê*àê*Ùê*Òê*Ëê*Äê*½ê*¶ê*¯ê*¨ê*¡ê*šê*“ê*Œê*…ê*~ê*wê*pê*iê*bê*[ê*Tê*Mê*Fê*?ê*8ê*1ê**ê*#ê*ê*ê*ê*ê*ê*ùé*òé*ëé*äé*Ýé*Öé*Ïé*Èé*Áé*ºé*³é*¬é*¥é*žé*—é*é*‰é*‚é*{é*té*mé*fé*_é*Xé*Qé*Jé*Cé*<é*5é*.é*'é* é*é*é* é*é*ýè*öè*ïè*èè*áè*Úè*Óè*Ìè*Åè*¾è*·è*°è*©è*¢è*›è*”è*è*†è*è*xè*qè*jè*cè*\è*Uè*Nè*Gè*@è*9è*2è*+è*$è*è*è*è*è*è*úç*óç*ìç*åç*Þç*×ç*Ðç*Éç*Âç*»ç*´ç*­ç*¦ç*Ÿç*˜ç*‘ç*Šç*ƒç*|ç*uç*nç*gç*`ç*Yç*Rç*Kç*Dç*=ç*6ç*/ç*(ç*!ç*ç*ç* ç*ç*þæ*÷æ*ðæ*éæ*âæ*Ûæ*Ôæ*Íæ*Ææ*¿æ*¸æ*±æ*ªæ*£æ*œæ*•æ*Žæ*‡æ*€æ*yæ*ræ*kæ*dæ*]æ*Væ*Oæ*Hæ*Aæ*:æ*3æ*,æ*%æ*æ*æ*æ* æ*æ*ûå*ôå*íå*æå*ßå*Øå*Ñå*Êå*Ãå*¼å*µå*®å*§å* å*™å*’å*‹å*„å*}å*vå*oå*hå*aå*Zå*Så*Lå*Eå*>å*7å*0å*)å*"å*å*å* å*å*ÿä*øä*ñä*êä*ãä*Üä*Õä*Îä*Çä*Àä*¹ä*²ä*«ä*¤ä*ä*–ä*ä*ˆä*ä*zä*sä*lä*eä*^ä*Wä*Pä*Iä*Bä*;ä*4ä*-ä*&ä*ä*ä*ä* ä*ä*üã*õã*îã*çã*àã*Ùã*Òã*Ëã*Äã*½ã*¶ã*¯ã*¨ã*¡ã*šã*“ã*Œã*…ã*~ã*wã*pã*iã*bã*[ã*Tã*Mã*Fã*?ã*8ã*1ã**ã*#ã*ã*ã*ã*ã*ã*ùâ*òâ*ëâ*äâ*Ýâ*Öâ*Ïâ*Èâ*Áâ*ºâ*³â*¬â*¥â*žâ*—â*â*‰â*‚â*{â*tâ*mâ*fâ*_â*Xâ*Qâ*Jâ*Câ*<â*5â*.â*'â* â*â*â* â*â*ýá*öá*ïá*èá*áá*Úá*Óá*Ìá*Åá*¾á*·á*°á*©á*¢á*›á*”á*á*†á*á*xá*qá*já*cá*\á*Uá*Ná*Gá*@á*9á*2á*+á*$á*á*á*á*á*á*úà*óà*ìà*åà*Þà*×à*Ðà*Éà*Âà*»à*´à*­à*¦à*Ÿà*˜à*‘à*Šà*ƒà*|à*uà*nà*gà*`à*Yà*Rà*Kà*Dà*=à*6à*/à*(à*!à*à*à* à*à*þß*÷ß*ðß*éß*âß*Ûß*Ôß*Íß*Æß*¿ß*¸ß*±ß*ªß*£ß*œß*•ß*Žß*‡ß*€ß*yß*rß*kß*dß*]ß*Vß*Oß*Hß*Aß*:ß*3ß*,ß*%ß*ß*ß*ß* ß*ß*ûÞ*ôÞ*íÞ*æÞ*ßÞ*ØÞ*ÑÞ*ÊÞ*ÃÞ*¼Þ*µÞ*®Þ*§Þ* Þ*™Þ*’Þ*‹Þ*„Þ*}Þ*vÞ*oÞ*hÞ*aÞ*ZÞ*SÞ*LÞ*EÞ*>Þ*7Þ*0Þ*)Þ*"Þ*Þ*Þ* Þ*Þ*ÿÝ*øÝ*ñÝ*êÝ*ãÝ*ÜÝ*ÕÝ*ÎÝ*ÇÝ*ÀÝ*¹Ý*²Ý*«Ý*¤Ý*Ý*–Ý*Ý*ˆÝ*Ý*zÝ*sÝ*lÝ*eÝ*^Ý*WÝ*PÝ*IÝ*BÝ*;Ý*4Ý*-Ý*&Ý*Ý*Ý*Ý* Ý*Ý*üÜ*õÜ*îÜ*çÜ*àÜ*ÙÜ*ÒÜ*ËÜ*ÄÜ*½Ü*¶Ü*¯Ü*¨Ü*¡Ü*šÜ*“Ü*ŒÜ*…Ü*~Ü*wÜ*pÜ*iÜ*bÜ*[Ü*TÜ*MÜ*FÜ*?Ü*8Ü*1Ü**Ü*#Ü*Ü*Ü*Ü*Ü*Ü*ùÛ*òÛ*ëÛ*äÛ*ÝÛ*ÖÛ*ÏÛ*ÈÛ*ÁÛ*ºÛ*³Û*¬Û*¥Û*žÛ*—Û*Û*‰Û*‚Û*{Û*tÛ*mÛ*fÛ*_Û*XÛ*QÛ*JÛ*CÛ*<Û*5Û*.Û*'Û* Û*Û*Û* Û*Û*ýÚ*öÚ*ïÚ*èÚ*áÚ*ÚÚ*ÓÚ*ÌÚ*ÅÚ*¾Ú*·Ú*°Ú*©Ú*¢Ú*›Ú*”Ú*Ú*†Ú*Ú*xÚ*qÚ*jÚ*cÚ*\Ú*UÚ*NÚ*GÚ*@Ú*9Ú*2Ú*+Ú*$Ú*Ú*Ú*Ú*Ú*Ú*úÙ*óÙ*ìÙ*åÙ*ÞÙ*×Ù*ÐÙ*ÉÙ*ÂÙ*»Ù*´Ù*­Ù*¦Ù*ŸÙ*˜Ù*‘Ù*ŠÙ*ƒÙ*|Ù*uÙ*nÙ*gÙ*`Ù*YÙ*RÙ*KÙ*DÙ*=Ù*6Ù*/Ù*(Ù*!Ù*Ù*Ù* Ù*Ù*þØ*÷Ø*ðØ*éØ*âØ*ÛØ*ÔØ*ÍØ*ÆØ*¿Ø*¸Ø*±Ø*ªØ*£Ø*œØ*•Ø*ŽØ*‡Ø*€Ø*yØ*rØ*kØ*dØ*]Ø*VØ*OØ*HØ*AØ*:Ø*3Ø*,Ø*%Ø*Ø*Ø*Ø* Ø*Ø*û×*ô×*í×*æ×*ß×*Ø×*Ñ×*Ê×*Ã×*¼×*µ×*®×*§×* ×*™×*’×*‹×*„×*}×*v×*o×*h×*a×*Z×*S×*L×*E×*>×*7×*0×*)×*"×*×*×* ×*×*ÿÖ*øÖ*ñÖ*êÖ*ãÖ*ÜÖ*ÕÖ*ÎÖ*ÇÖ*ÀÖ*¹Ö*²Ö*«Ö*¤Ö*Ö*–Ö*Ö*ˆÖ*Ö*zÖ*sÖ*lÖ*eÖ*^Ö*WÖ*PÖ*IÖ*BÖ*;Ö*4Ö*-Ö*&Ö*Ö*Ö*Ö* Ö*Ö*üÕ*õÕ*îÕ*çÕ*àÕ*ÙÕ*ÒÕ*ËÕ*ÄÕ*½Õ*¶Õ*¯Õ*¨Õ*¡Õ*šÕ*“Õ*ŒÕ*…Õ*~Õ*wÕ*pÕ*iÕ*bÕ*[Õ*TÕ*MÕ*FÕ*?Õ*8Õ*1Õ**Õ*#Õ*Õ*Õ*Õ*Õ*Õ*ùÔ*òÔ*ëÔ*äÔ*ÝÔ*ÖÔ*ÏÔ*ÈÔ*ÁÔ*ºÔ*³Ô*¬Ô*¥Ô*žÔ*—Ô*Ô*‰Ô*‚Ô*{Ô*tÔ*mÔ*fÔ*_Ô*XÔ*QÔ*JÔ*CÔ*<Ô*5Ô*.Ô*'Ô* Ô*Ô*Ô* Ô*Ô*ýÓ*öÓ*ïÓ*èÓ*áÓ*ÚÓ*ÓÓ*ÌÓ*ÅÓ*¾Ó*·Ó*°Ó*©Ó*¢Ó*›Ó*”Ó*Ó*†Ó*Ó*xÓ*qÓ*jÓ*cÓ*\Ó*UÓ*NÓ*GÓ*@Ó*9Ó*2Ó*+Ó*$Ó*Ó*Ó*Ó*Ó*Ó*úÒ*óÒ*ìÒ*åÒ*ÞÒ*×Ò*ÐÒ*ÉÒ*ÂÒ*»Ò*´Ò*­Ò*¦Ò*ŸÒ*˜Ò*‘Ò*ŠÒ*ƒÒ*|Ò*uÒ*nÒ*gÒ*`Ò*YÒ*RÒ*KÒ*DÒ*=Ò*6Ò*/Ò*(Ò*!Ò*Ò*Ò* Ò*Ò*þÑ*÷Ñ*ðÑ*éÑ*âÑ*ÛÑ*ÔÑ*ÍÑ*ÆÑ*¿Ñ*¸Ñ*±Ñ*ªÑ*£Ñ*œÑ*•Ñ*ŽÑ*‡Ñ*€Ñ*yÑ*rÑ*kÑ*dÑ*]Ñ*VÑ*OÑ*HÑ*AÑ*:Ñ*3Ñ*,Ñ*%Ñ*Ñ*Ñ*Ñ* Ñ*Ñ*ûÐ*ôÐ*íÐ*æÐ*ßÐ*ØÐ*ÑÐ*ÊÐ*ÃÐ*¼Ð*µÐ*®Ð*§Ð* Ð*™Ð*’Ð*‹Ð*„Ð*}Ð*vÐ*oÐ*hÐ*aÐ*ZÐ*SÐ*LÐ*EÐ*>Ð*7Ð*0Ð*)Ð*"Ð*Ð*Ð* Ð*Ð*ÿÏ*øÏ*ñÏ*êÏ*ãÏ*ÜÏ*ÕÏ*ÎÏ*ÇÏ*ÀÏ*¹Ï*²Ï*«Ï*¤Ï*Ï*–Ï*Ï*ˆÏ*Ï*zÏ*sÏ*lÏ*eÏ*^Ï*WÏ*PÏ*IÏ*BÏ*;Ï*4Ï*-Ï*&Ï*Ï*Ï*Ï* Ï*Ï*üÎ*õÎ*îÎ*çÎ*àÎ*ÙÎ*ÒÎ*ËÎ*ÄÎ*½Î*¶Î*¯Î*¨Î*¡Î*šÎ*“Î*ŒÎ*…Î*~Î*wÎ*pÎ*iÎ*bÎ*[Î*TÎ*MÎ*FÎ*?Î*8Î*1Î**Î*#Î*Î*Î*Î*Î*Î*ùÍ*òÍ*ëÍ*äÍ*ÝÍ*ÖÍ*ÏÍ*ÈÍ*ÁÍ*ºÍ*³Í*¬Í*¥Í*žÍ*—Í*Í*‰Í*‚Í*{Í*tÍ*mÍ*fÍ*_Í*XÍ*QÍ*JÍ*CÍ*<Í*5Í*.Í*'Í* Í*Í*Í* Í*Í*ýÌ*öÌ*ïÌ*èÌ*áÌ*ÚÌ*ÓÌ*ÌÌ*ÅÌ*¾Ì*·Ì*°Ì*©Ì*¢Ì*›Ì*”Ì*Ì*†Ì*Ì*xÌ*qÌ*jÌ*cÌ*\Ì*UÌ*NÌ*GÌ*@Ì*9Ì*2Ì*+Ì*$Ì*Ì*Ì*Ì*Ì*Ì*úË*óË*ìË*åË*ÞË*×Ë*ÐË*ÉË*ÂË*»Ë*´Ë*­Ë*¦Ë*ŸË*˜Ë*‘Ë*ŠË*ƒË*|Ë*uË*nË*gË*`Ë*YË*RË*KË*DË*=Ë*6Ë*/Ë*(Ë*!Ë*Ë*Ë* Ë*Ë*þÊ*÷Ê*ðÊ*éÊ*âÊ*ÛÊ*ÔÊ*ÍÊ*ÆÊ*¿Ê*¸Ê*±Ê*ªÊ*£Ê*œÊ*•Ê*ŽÊ*‡Ê*€Ê*yÊ*rÊ*kÊ*dÊ*]Ê*VÊ*OÊ*HÊ*AÊ*:Ê*3Ê*,Ê*%Ê*Ê*Ê*Ê* Ê*Ê*ûÉ*ôÉ*íÉ*æÉ*ßÉ*ØÉ*ÑÉ*ÊÉ*ÃÉ*¼É*µÉ*®É*§É* É*™É*’É*‹É*„É*}É*vÉ*oÉ*hÉ*aÉ*ZÉ*SÉ*LÉ*EÉ*>É*7É*0É*)É*"É*É*É* É*É*ÿÈ*øÈ*ñÈ*êÈ*ãÈ*ÜÈ*ÕÈ*ÎÈ*ÇÈ*ÀÈ*¹È*²È*«È*¤È*È*–È*È*ˆÈ*È*zÈ*sÈ*lÈ*eÈ*^È*WÈ*PÈ*IÈ*BÈ*;È*4È*-È*&È*È*È*È* È*È*üÇ*õÇ*îÇ*çÇ*àÇ*ÙÇ*ÒÇ*ËÇ*ÄÇ*½Ç*¶Ç*¯Ç*¨Ç*¡Ç*šÇ*“Ç*ŒÇ*…Ç*~Ç*wÇ*pÇ*iÇ*bÇ*[Ç*TÇ*MÇ*FÇ*?Ç*8Ç*1Ç**Ç*#Ç*Ç*Ç*Ç*Ç*Ç*ùÆ*òÆ*ëÆ*äÆ*ÝÆ*ÖÆ*ÏÆ*ÈÆ*ÁÆ*ºÆ*³Æ*¬Æ*¥Æ*žÆ*—Æ*Æ*‰Æ*‚Æ*{Æ*tÆ*mÆ*fÆ*_Æ*XÆ*QÆ*JÆ*CÆ*<Æ*5Æ*.Æ*'Æ* Æ*Æ*Æ* Æ*Æ*ýÅ*öÅ*ïÅ*èÅ*áÅ*ÚÅ*ÓÅ*ÌÅ*ÅÅ*¾Å*·Å*°Å*©Å*¢Å*›Å*”Å*Å*†Å*Å*xÅ*qÅ*jÅ*cÅ*\Å*UÅ*NÅ*GÅ*@Å*9Å*2Å*+Å*$Å*Å*Å*Å*Å*Å*úÄ*óÄ*ìÄ*åÄ*ÞÄ*×Ä*ÐÄ*ÉÄ*ÂÄ*»Ä*´Ä*­Ä*¦Ä*ŸÄ*˜Ä*‘Ä*ŠÄ*ƒÄ*|Ä*uÄ*nÄ*gÄ*`Ä*YÄ*RÄ*KÄ*DÄ*=Ä*6Ä*/Ä*(Ä*!Ä*Ä*Ä* Ä*Ä*þÃ*÷Ã*ðÃ*éÃ*âÃ*ÛÃ*ÔÃ*ÍÃ*ÆÃ*¿Ã*¸Ã*±Ã*ªÃ*£Ã*œÃ*•Ã*ŽÃ*‡Ã*€Ã*yÃ*rÃ*kÃ*dÃ*]Ã*VÃ*OÃ*HÃ*AÃ*:Ã*3Ã*,Ã*%Ã*Ã*Ã*Ã* Ã*Ã*ûÂ*ôÂ*íÂ*æÂ*ßÂ*ØÂ*ÑÂ*ÊÂ*ÃÂ*¼Â*µÂ*®Â*§Â* Â*™Â*’Â*‹Â*„Â*}Â*vÂ*oÂ*hÂ*aÂ*ZÂ*SÂ*LÂ*EÂ*>Â*7Â*0Â*)Â*"Â*Â*Â* Â*Â*ÿÁ*øÁ*ñÁ*êÁ*ãÁ*ÜÁ*ÕÁ*ÎÁ*ÇÁ*ÀÁ*¹Á*²Á*«Á*¤Á*Á*–Á*Á*ˆÁ*Á*zÁ*sÁ*lÁ*eÁ*^Á*WÁ*PÁ*IÁ*BÁ*;Á*4Á*-Á*&Á*Á*Á*Á* Á*Á*üÀ*õÀ*îÀ*çÀ*àÀ*ÙÀ*ÒÀ*ËÀ*ÄÀ*½À*¶À*¯À*¨À*¡À*šÀ*“À*ŒÀ*…À*~À*wÀ*pÀ*iÀ*bÀ*[À*TÀ*MÀ*FÀ*?À*8À*1À**À*#À*À*À*À*À*À*ù¿*ò¿*ë¿*ä¿*Ý¿*Ö¿*Ï¿*È¿*Á¿*º¿*³¿*¬¿*¥¿*ž¿*—¿*¿*‰¿*‚¿*{¿*t¿*m¿*f¿*_¿*X¿*Q¿*J¿*C¿*<¿*5¿*.¿*'¿* ¿*¿*¿* ¿*¿*ý¾*ö¾*ï¾*è¾*á¾*Ú¾*Ó¾*̾*ž*¾¾*·¾*°¾*©¾*¢¾*›¾*”¾*¾*†¾*¾*x¾*q¾*j¾*c¾*\¾*U¾*N¾*G¾*@¾*9¾*2¾*+¾*$¾*¾*¾*¾*¾*¾*ú½*ó½*ì½*å½*Þ½*×½*н*ɽ*½*»½*´½*­½*¦½*Ÿ½*˜½*‘½*н*ƒ½*|½*u½*n½*g½*`½*Y½*R½*K½*D½*=½*6½*/½*(½*!½*½*½* ½*½*þ¼*÷¼*ð¼*é¼*â¼*Û¼*Ô¼*ͼ*Ƽ*¿¼*¸¼*±¼*ª¼*£¼*œ¼*•¼*޼*‡¼*€¼*y¼*r¼*k¼*d¼*]¼*V¼*O¼*H¼*A¼*:¼*3¼*,¼*%¼*¼*¼*¼* ¼*¼*û»*ô»*í»*æ»*ß»*Ø»*Ñ»*Ê»*û*¼»*µ»*®»*§»* »*™»*’»*‹»*„»*}»*v»*o»*h»*a»*Z»*S»*L»*E»*>»*7»*0»*)»*"»*»*»* »*»*ÿº*øº*ñº*êº*ãº*ܺ*Õº*κ*Ǻ*Àº*¹º*²º*«º*¤º*º*–º*º*ˆº*º*zº*sº*lº*eº*^º*Wº*Pº*Iº*Bº*;º*4º*-º*&º*º*º*º* º*º*ü¹*õ¹*î¹*ç¹*à¹*Ù¹*Ò¹*˹*Ĺ*½¹*¶¹*¯¹*¨¹*¡¹*š¹*“¹*Œ¹*…¹*~¹*w¹*p¹*i¹*b¹*[¹*T¹*M¹*F¹*?¹*8¹*1¹**¹*#¹*¹*¹*¹*¹*¹*ù¸*ò¸*ë¸*ä¸*ݸ*Ö¸*ϸ*ȸ*Á¸*º¸*³¸*¬¸*¥¸*ž¸*—¸*¸*‰¸*‚¸*{¸*t¸*m¸*f¸*_¸*X¸*Q¸*J¸*C¸*<¸*5¸*.¸*'¸* ¸*¸*¸* ¸*¸*ý·*ö·*ï·*è·*á·*Ú·*Ó·*Ì·*Å·*¾·*··*°·*©·*¢·*›·*”·*·*†·*·*x·*q·*j·*c·*\·*U·*N·*G·*@·*9·*2·*+·*$·*·*·*·*·*·*ú¶*ó¶*ì¶*å¶*Þ¶*×¶*ж*ɶ*¶*»¶*´¶*­¶*¦¶*Ÿ¶*˜¶*‘¶*ж*ƒ¶*|¶*u¶*n¶*g¶*`¶*Y¶*R¶*K¶*D¶*=¶*6¶*/¶*(¶*!¶*¶*¶* ¶*¶*þµ*÷µ*ðµ*éµ*âµ*Ûµ*Ôµ*͵*Ƶ*¿µ*¸µ*±µ*ªµ*£µ*œµ*•µ*޵*‡µ*€µ*yµ*rµ*kµ*dµ*]µ*Vµ*Oµ*Hµ*Aµ*:µ*3µ*,µ*%µ*µ*µ*µ* µ*µ*û´*ô´*í´*æ´*ß´*Ø´*Ñ´*Ê´*ô*¼´*µ´*®´*§´* ´*™´*’´*‹´*„´*}´*v´*o´*h´*a´*Z´*S´*L´*E´*>´*7´*0´*)´*"´*´*´* ´*´*ÿ³*ø³*ñ³*ê³*ã³*ܳ*Õ³*γ*dz*À³*¹³*²³*«³*¤³*³*–³*³*ˆ³*³*z³*s³*l³*e³*^³*W³*P³*I³*B³*;³*4³*-³*&³*³*³*³* ³*³*ü²*õ²*î²*ç²*à²*Ù²*Ò²*˲*IJ*½²*¶²*¯²*¨²*¡²*š²*“²*Œ²*…²*~²*w²*p²*i²*b²*[²*T²*M²*F²*?²*8²*1²**²*#²*²*²*²*²*²*ù±*ò±*ë±*ä±*ݱ*Ö±*ϱ*ȱ*Á±*º±*³±*¬±*¥±*ž±*—±*±*‰±*‚±*{±*t±*m±*f±*_±*X±*Q±*J±*C±*<±*5±*.±*'±* ±*±*±* ±*±*ý°*ö°*ï°*è°*á°*Ú°*Ó°*̰*Ű*¾°*·°*°°*©°*¢°*›°*”°*°*†°*°*x°*q°*j°*c°*\°*U°*N°*G°*@°*9°*2°*+°*$°*°*°*°*°*°*ú¯*ó¯*ì¯*å¯*Þ¯*ׯ*Я*ɯ*¯*»¯*´¯*­¯*¦¯*Ÿ¯*˜¯*‘¯*Н*ƒ¯*|¯*u¯*n¯*g¯*`¯*Y¯*R¯*K¯*D¯*=¯*6¯*/¯*(¯*!¯*¯*¯* ¯*¯*þ®*÷®*ð®*é®*â®*Û®*Ô®*Í®*Æ®*¿®*¸®*±®*ª®*£®*œ®*•®*Ž®*‡®*€®*y®*r®*k®*d®*]®*V®*O®*H®*A®*:®*3®*,®*%®*®*®*®* ®*®*û­*ô­*í­*æ­*ß­*Ø­*Ñ­*Ê­*í*¼­*µ­*®­*§­* ­*™­*’­*‹­*„­*}­*v­*o­*h­*a­*Z­*S­*L­*E­*>­*7­*0­*)­*"­*­*­* ­*­*ÿ¬*ø¬*ñ¬*ê¬*ã¬*ܬ*Õ¬*ά*Ǭ*À¬*¹¬*²¬*«¬*¤¬*¬*–¬*¬*ˆ¬*¬*z¬*s¬*l¬*e¬*^¬*W¬*P¬*I¬*B¬*;¬*4¬*-¬*&¬*¬*¬*¬* ¬*¬*ü«*õ«*î«*ç«*à«*Ù«*Ò«*Ë«*Ä«*½«*¶«*¯«*¨«*¡«*š«*“«*Œ«*…«*~«*w«*p«*i«*b«*[«*T«*M«*F«*?«*8«*1«**«*#«*«*«*«*«*«*ùª*òª*ëª*äª*ݪ*Öª*Ϫ*Ȫ*Áª*ºª*³ª*¬ª*¥ª*žª*—ª*ª*‰ª*‚ª*{ª*tª*mª*fª*_ª*Xª*Qª*Jª*Cª*<ª*5ª*.ª*'ª* ª*ª*ª* ª*ª*ý©*ö©*ï©*è©*á©*Ú©*Ó©*Ì©*Å©*¾©*·©*°©*©©*¢©*›©*”©*©*†©*©*x©*q©*j©*c©*\©*U©*N©*G©*@©*9©*2©*+©*$©*©*©*©*©*©*ú¨*ó¨*ì¨*å¨*Þ¨*ר*Ш*ɨ*¨*»¨*´¨*­¨*¦¨*Ÿ¨*˜¨*‘¨*Ѝ*ƒ¨*|¨*u¨*n¨*g¨*`¨*Y¨*R¨*K¨*D¨*=¨*6¨*/¨*(¨*!¨*¨*¨* ¨*¨*þ§*÷§*ð§*é§*â§*Û§*Ô§*ͧ*Ƨ*¿§*¸§*±§*ª§*£§*œ§*•§*ާ*‡§*€§*y§*r§*k§*d§*]§*V§*O§*H§*A§*:§*3§*,§*%§*§*§*§* §*§*û¦*ô¦*í¦*æ¦*ߦ*ئ*Ѧ*ʦ*æ*¼¦*µ¦*®¦*§¦* ¦*™¦*’¦*‹¦*„¦*}¦*v¦*o¦*h¦*a¦*Z¦*S¦*L¦*E¦*>¦*7¦*0¦*)¦*"¦*¦*¦* ¦*¦*ÿ¥*ø¥*ñ¥*ê¥*ã¥*Ü¥*Õ¥*Î¥*Ç¥*À¥*¹¥*²¥*«¥*¤¥*¥*–¥*¥*ˆ¥*¥*z¥*s¥*l¥*e¥*^¥*W¥*P¥*I¥*B¥*;¥*4¥*-¥*&¥*¥*¥*¥* ¥*¥*ü¤*õ¤*î¤*ç¤*à¤*Ù¤*Ò¤*ˤ*Ĥ*½¤*¶¤*¯¤*¨¤*¡¤*š¤*“¤*Œ¤*…¤*~¤*w¤*p¤*i¤*b¤*[¤*T¤*M¤*F¤*?¤*8¤*1¤**¤*#¤*¤*¤*¤*¤*¤*ù£*ò£*ë£*ä£*Ý£*Ö£*Ï£*È£*Á£*º£*³£*¬£*¥£*ž£*—£*£*‰£*‚£*{£*t£*m£*f£*_£*X£*Q£*J£*C£*<£*5£*.£*'£* £*£*£* £*£*ý¢*ö¢*ï¢*è¢*á¢*Ú¢*Ó¢*Ì¢*Å¢*¾¢*·¢*°¢*©¢*¢¢*›¢*”¢*¢*†¢*¢*x¢*q¢*j¢*c¢*\¢*U¢*N¢*G¢*@¢*9¢*2¢*+¢*$¢*¢*¢*¢*¢*¢*ú¡*ó¡*ì¡*å¡*Þ¡*ס*С*É¡*¡*»¡*´¡*­¡*¦¡*Ÿ¡*˜¡*‘¡*Š¡*ƒ¡*|¡*u¡*n¡*g¡*`¡*Y¡*R¡*K¡*D¡*=¡*6¡*/¡*(¡*!¡*¡*¡* ¡*¡*þ *÷ *ð *é *â *Û *Ô *Í *Æ *¿ *¸ *± *ª *£ *œ *• *Ž *‡ *€ *y *r *k *d *] *V *O *H *A *: *3 *, *% * * * *  * *ûŸ*ôŸ*íŸ*æŸ*ߟ*ØŸ*ÑŸ*ÊŸ*ß*¼Ÿ*µŸ*®Ÿ*§Ÿ* Ÿ*™Ÿ*’Ÿ*‹Ÿ*„Ÿ*}Ÿ*vŸ*oŸ*hŸ*aŸ*ZŸ*SŸ*LŸ*EŸ*>Ÿ*7Ÿ*0Ÿ*)Ÿ*"Ÿ*Ÿ*Ÿ* Ÿ*Ÿ*ÿž*øž*ñž*êž*ãž*Üž*Õž*Ξ*Çž*Àž*¹ž*²ž*«ž*¤ž*ž*–ž*ž*ˆž*ž*zž*sž*lž*ež*^ž*Wž*Pž*Iž*Bž*;ž*4ž*-ž*&ž*ž*ž*ž* ž*ž*ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ùœ*òœ*ëœ*äœ*Ýœ*Öœ*Ïœ*Èœ*Áœ*ºœ*³œ*¬œ*¥œ*žœ*—œ*œ*‰œ*‚œ*{œ*tœ*mœ*fœ*_œ*Xœ*Qœ*Jœ*Cœ*<œ*5œ*.œ*'œ* œ*œ*œ* œ*œ*ý›*ö›*ï›*è›*á›*Ú›*Ó›*Ì›*Å›*¾›*·›*°›*©›*¢›*››*”›*›*†›*›*x›*q›*j›*c›*\›*U›*N›*G›*@›*9›*2›*+›*$›*›*›*›*›*›*úš*óš*ìš*åš*Þš*ך*К*Éš*š*»š*´š*­š*¦š*Ÿš*˜š*‘š*Šš*ƒš*|š*uš*nš*gš*`š*Yš*Rš*Kš*Dš*=š*6š*/š*(š*!š*š*š* š*š*þ™*÷™*ð™*é™*â™*Û™*Ô™*Í™*Æ™*¿™*¸™*±™*ª™*£™*œ™*•™*Ž™*‡™*€™*y™*r™*k™*d™*]™*V™*O™*H™*A™*:™*3™*,™*%™*™*™*™* ™*™*û˜*ô˜*í˜*æ˜*ߘ*ؘ*ј*ʘ*Ø*¼˜*µ˜*®˜*§˜* ˜*™˜*’˜*‹˜*„˜*}˜*v˜*o˜*h˜*a˜*Z˜*S˜*L˜*E˜*>˜*7˜*0˜*)˜*"˜*˜*˜* ˜*˜*ÿ—*ø—*ñ—*ê—*ã—*Ü—*Õ—*Η*Ç—*À—*¹—*²—*«—*¤—*—*–—*—*ˆ—*—*z—*s—*l—*e—*^—*W—*P—*I—*B—*;—*4—*-—*&—*—*—*—* —*—*ü–*õ–*î–*ç–*à–*Ù–*Ò–*Ë–*Ä–*½–*¶–*¯–*¨–*¡–*š–*“–*Œ–*…–*~–*w–*p–*i–*b–*[–*T–*M–*F–*?–*8–*1–**–*#–*–*–*–*–*–*ù•*ò•*ë•*ä•*Ý•*Ö•*Ï•*È•*Á•*º•*³•*¬•*¥•*ž•*—•*•*‰•*‚•*{•*t•*m•*f•*_•*X•*Q•*J•*C•*<•*5•*.•*'•* •*•*•* •*•*ý”*ö”*ï”*è”*á”*Ú”*Ó”*Ì”*Å”*¾”*·”*°”*©”*¢”*›”*””*”*†”*”*x”*q”*j”*c”*\”*U”*N”*G”*@”*9”*2”*+”*$”*”*”*”*”*”*ú“*ó“*ì“*å“*Þ“*ד*Г*É“*“*»“*´“*­“*¦“*Ÿ“*˜“*‘“*Š“*ƒ“*|“*u“*n“*g“*`“*Y“*R“*K“*D“*=“*6“*/“*(“*!“*“*“* “*“*þ’*÷’*ð’*é’*â’*Û’*Ô’*Í’*Æ’*¿’*¸’*±’*ª’*£’*œ’*•’*Ž’*‡’*€’*y’*r’*k’*d’*]’*V’*O’*H’*A’*:’*3’*,’*%’*’*’*’* ’*’*û‘*ô‘*í‘*æ‘*ß‘*Ø‘*Ñ‘*Ê‘*Ñ*¼‘*µ‘*®‘*§‘* ‘*™‘*’‘*‹‘*„‘*}‘*v‘*o‘*h‘*a‘*Z‘*S‘*L‘*E‘*>‘*7‘*0‘*)‘*"‘*‘*‘* ‘*‘*ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ùŽ*òŽ*ëŽ*äŽ*ÝŽ*ÖŽ*ÏŽ*ÈŽ*ÁŽ*ºŽ*³Ž*¬Ž*¥Ž*žŽ*—Ž*Ž*‰Ž*‚Ž*{Ž*tŽ*mŽ*fŽ*_Ž*XŽ*QŽ*JŽ*CŽ*<Ž*5Ž*.Ž*'Ž* Ž*Ž*Ž* Ž*Ž*ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******úŒ*óŒ*ìŒ*åŒ*ÞŒ*׌*ÐŒ*ÉŒ*ÂŒ*»Œ*´Œ*­Œ*¦Œ*ŸŒ*˜Œ*‘Œ*ŠŒ*ƒŒ*|Œ*uŒ*nŒ*gŒ*`Œ*YŒ*RŒ*KŒ*DŒ*=Œ*6Œ*/Œ*(Œ*!Œ*Œ*Œ* Œ*Œ*þ‹*÷‹*ð‹*é‹*â‹*Û‹*Ô‹*Í‹*Æ‹*¿‹*¸‹*±‹*ª‹*£‹*œ‹*•‹*Ž‹*‡‹*€‹*y‹*r‹*k‹*d‹*]‹*V‹*O‹*H‹*A‹*:‹*3‹*,‹*%‹*‹*‹*‹* ‹*‹*ûŠ*ôŠ*íŠ*æŠ*ߊ*ØŠ*ÑŠ*ÊŠ*Ê*¼Š*µŠ*®Š*§Š* Š*™Š*’Š*‹Š*„Š*}Š*vŠ*oŠ*hŠ*aŠ*ZŠ*SŠ*LŠ*EŠ*>Š*7Š*0Š*)Š*"Š*Š*Š* Š*Š*ÿ‰*ø‰*ñ‰*ê‰*ã‰*܉*Õ‰*Ή*lj*À‰*¹‰*²‰*«‰*¤‰*‰*–‰*‰*ˆ‰*‰*z‰*s‰*l‰*e‰*^‰*W‰*P‰*I‰*B‰*;‰*4‰*-‰*&‰*‰*‰*‰* ‰*‰*üˆ*õˆ*îˆ*çˆ*àˆ*Ùˆ*Òˆ*ˈ*Ĉ*½ˆ*¶ˆ*¯ˆ*¨ˆ*¡ˆ*šˆ*“ˆ*Œˆ*…ˆ*~ˆ*wˆ*pˆ*iˆ*bˆ*[ˆ*Tˆ*Mˆ*Fˆ*?ˆ*8ˆ*1ˆ**ˆ*#ˆ*ˆ*ˆ*ˆ*ˆ*ˆ*ù‡*ò‡*ë‡*ä‡*݇*Ö‡*χ*ȇ*Á‡*º‡*³‡*¬‡*¥‡*ž‡*—‡*‡*‰‡*‚‡*{‡*t‡*m‡*f‡*_‡*X‡*Q‡*J‡*C‡*<‡*5‡*.‡*'‡* ‡*‡*‡* ‡*‡*ý†*ö†*ï†*è†*á†*Ú†*Ó†*̆*ņ*¾†*·†*°†*©†*¢†*›†*”†*†*††*†*x†*q†*j†*c†*\†*U†*N†*G†*@†*9†*2†*+†*$†*†*†*†*†*†*ú…*ó…*ì…*å…*Þ…*×…*Ð…*É…*Â…*»…*´…*­…*¦…*Ÿ…*˜…*‘…*Š…*ƒ…*|…*u…*n…*g…*`…*Y…*R…*K…*D…*=…*6…*/…*(…*!…*…*…* …*…*þ„*÷„*ð„*é„*â„*Û„*Ô„*Í„*Æ„*¿„*¸„*±„*ª„*£„*œ„*•„*Ž„*‡„*€„*y„*r„*k„*d„*]„*V„*O„*H„*A„*:„*3„*,„*%„*„*„*„* „*„*ûƒ*ôƒ*íƒ*æƒ*߃*؃*у*ʃ*Ã*¼ƒ*µƒ*®ƒ*§ƒ* ƒ*™ƒ*’ƒ*‹ƒ*„ƒ*}ƒ*vƒ*oƒ*hƒ*aƒ*Zƒ*Sƒ*Lƒ*Eƒ*>ƒ*7ƒ*0ƒ*)ƒ*"ƒ*ƒ*ƒ* ƒ*ƒ*ÿ‚*ø‚*ñ‚*ê‚*ã‚*Ü‚*Õ‚*΂*Ç‚*À‚*¹‚*²‚*«‚*¤‚*‚*–‚*‚*ˆ‚*‚*z‚*s‚*l‚*e‚*^‚*W‚*P‚*I‚*B‚*;‚*4‚*-‚*&‚*‚*‚*‚* ‚*‚*ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù€*ò€*ë€*ä€*Ý€*Ö€*Ï€*È€*Á€*º€*³€*¬€*¥€*ž€*—€*€*‰€*‚€*{€*t€*m€*f€*_€*X€*Q€*J€*C€*<€*5€*.€*'€* €*€*€* €*€*ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú~*ó~*ì~*å~*Þ~*×~*Ð~*É~*Â~*»~*´~*­~*¦~*Ÿ~*˜~*‘~*Š~*ƒ~*|~*u~*n~*g~*`~*Y~*R~*K~*D~*=~*6~*/~*(~*!~*~*~* ~*~*þ}*÷}*ð}*é}*â}*Û}*Ô}*Í}*Æ}*¿}*¸}*±}*ª}*£}*œ}*•}*Ž}*‡}*€}*y}*r}*k}*d}*]}*V}*O}*H}*A}*:}*3}*,}*%}*}*}*}* }*}*û|*ô|*í|*æ|*ß|*Ø|*Ñ|*Ê|*Ã|*¼|*µ|*®|*§|* |*™|*’|*‹|*„|*}|*v|*o|*h|*a|*Z|*S|*L|*E|*>|*7|*0|*)|*"|*|*|* |*|*ÿ{*ø{*ñ{*ê{*ã{*Ü{*Õ{*Î{*Ç{*À{*¹{*²{*«{*¤{*{*–{*{*ˆ{*{*z{*s{*l{*e{*^{*W{*P{*I{*B{*;{*4{*-{*&{*{*{*{* {*{*üz*õz*îz*çz*àz*Ùz*Òz*Ëz*Äz*½z*¶z*¯z*¨z*¡z*šz*“z*Œz*…z*~z*wz*pz*iz*bz*[z*Tz*Mz*Fz*?z*8z*1z**z*#z*z*z*z*z*z*ùy*òy*ëy*äy*Ýy*Öy*Ïy*Èy*Áy*ºy*³y*¬y*¥y*žy*—y*y*‰y*‚y*{y*ty*my*fy*_y*Xy*Qy*Jy*Cy*u*7u*0u*)u*"u*u*u* u*u*ÿt*øt*ñt*êt*ãt*Üt*Õt*Ît*Çt*Àt*¹t*²t*«t*¤t*t*–t*t*ˆt*t*zt*st*lt*et*^t*Wt*Pt*It*Bt*;t*4t*-t*&t*t*t*t* t*t*üs*õs*îs*çs*às*Ùs*Òs*Ës*Äs*½s*¶s*¯s*¨s*¡s*šs*“s*Œs*…s*~s*ws*ps*is*bs*[s*Ts*Ms*Fs*?s*8s*1s**s*#s*s*s*s*s*s*ùr*òr*ër*är*Ýr*Ör*Ïr*Èr*Ár*ºr*³r*¬r*¥r*žr*—r*r*‰r*‚r*{r*tr*mr*fr*_r*Xr*Qr*Jr*Cr*n*7n*0n*)n*"n*n*n* n*n*ÿm*øm*ñm*êm*ãm*Üm*Õm*Îm*Çm*Àm*¹m*²m*«m*¤m*m*–m*m*ˆm*m*zm*sm*lm*em*^m*Wm*Pm*Im*Bm*;m*4m*-m*&m*m*m*m* m*m*ül*õl*îl*çl*àl*Ùl*Òl*Ël*Äl*½l*¶l*¯l*¨l*¡l*šl*“l*Œl*…l*~l*wl*pl*il*bl*[l*Tl*Ml*Fl*?l*8l*1l**l*#l*l*l*l*l*l*ùk*òk*ëk*äk*Ýk*Ök*Ïk*Èk*Ák*ºk*³k*¬k*¥k*žk*—k*k*‰k*‚k*{k*tk*mk*fk*_k*Xk*Qk*Jk*Ck*g*7g*0g*)g*"g*g*g* g*g*ÿf*øf*ñf*êf*ãf*Üf*Õf*Îf*Çf*Àf*¹f*²f*«f*¤f*f*–f*f*ˆf*f*zf*sf*lf*ef*^f*Wf*Pf*If*Bf*;f*4f*-f*&f*f*f*f* f*f*üe*õe*îe*çe*àe*Ùe*Òe*Ëe*Äe*½e*¶e*¯e*¨e*¡e*še*“e*Œe*…e*~e*we*pe*ie*be*[e*Te*Me*Fe*?e*8e*1e**e*#e*e*e*e*e*e*ùd*òd*ëd*äd*Ýd*Öd*Ïd*Èd*Ád*ºd*³d*¬d*¥d*žd*—d*d*‰d*‚d*{d*td*md*fd*_d*Xd*Qd*Jd*Cd*`*7`*0`*)`*"`*`*`* `*`*ÿ_*ø_*ñ_*ê_*ã_*Ü_*Õ_*Î_*Ç_*À_*¹_*²_*«_*¤_*_*–_*_*ˆ_*_*z_*s_*l_*e_*^_*W_*P_*I_*B_*;_*4_*-_*&_*_*_*_* _*_*ü^*õ^*î^*ç^*à^*Ù^*Ò^*Ë^*Ä^*½^*¶^*¯^*¨^*¡^*š^*“^*Œ^*…^*~^*w^*p^*i^*b^*[^*T^*M^*F^*?^*8^*1^**^*#^*^*^*^*^*^*ù]*ò]*ë]*ä]*Ý]*Ö]*Ï]*È]*Á]*º]*³]*¬]*¥]*ž]*—]*]*‰]*‚]*{]*t]*m]*f]*_]*X]*Q]*J]*C]*<]*5]*.]*']* ]*]*]* ]*]*ý\*ö\*ï\*è\*á\*Ú\*Ó\*Ì\*Å\*¾\*·\*°\*©\*¢\*›\*”\*\*†\*\*x\*q\*j\*c\*\\*U\*N\*G\*@\*9\*2\*+\*$\*\*\*\*\*\*ú[*ó[*ì[*å[*Þ[*×[*Ð[*É[*Â[*»[*´[*­[*¦[*Ÿ[*˜[*‘[*Š[*ƒ[*|[*u[*n[*g[*`[*Y[*R[*K[*D[*=[*6[*/[*([*![*[*[* [*[*þZ*÷Z*ðZ*éZ*âZ*ÛZ*ÔZ*ÍZ*ÆZ*¿Z*¸Z*±Z*ªZ*£Z*œZ*•Z*ŽZ*‡Z*€Z*yZ*rZ*kZ*dZ*]Z*VZ*OZ*HZ*AZ*:Z*3Z*,Z*%Z*Z*Z*Z* Z*Z*ûY*ôY*íY*æY*ßY*ØY*ÑY*ÊY*ÃY*¼Y*µY*®Y*§Y* Y*™Y*’Y*‹Y*„Y*}Y*vY*oY*hY*aY*ZY*SY*LY*EY*>Y*7Y*0Y*)Y*"Y*Y*Y* Y*Y*ÿX*øX*ñX*êX*ãX*ÜX*ÕX*ÎX*ÇX*ÀX*¹X*²X*«X*¤X*X*–X*X*ˆX*X*zX*sX*lX*eX*^X*WX*PX*IX*BX*;X*4X*-X*&X*X*X*X* X*X*üW*õW*îW*çW*àW*ÙW*ÒW*ËW*ÄW*½W*¶W*¯W*¨W*¡W*šW*“W*ŒW*…W*~W*wW*pW*iW*bW*[W*TW*MW*FW*?W*8W*1W**W*#W*W*W*W*W*W*ùV*òV*ëV*äV*ÝV*ÖV*ÏV*ÈV*ÁV*ºV*³V*¬V*¥V*žV*—V*V*‰V*‚V*{V*tV*mV*fV*_V*XV*QV*JV*CV*R*7R*0R*)R*"R*R*R* R*R*ÿQ*øQ*ñQ*êQ*ãQ*ÜQ*ÕQ*ÎQ*ÇQ*ÀQ*¹Q*²Q*«Q*¤Q*Q*–Q*Q*ˆQ*Q*zQ*sQ*lQ*eQ*^Q*WQ*PQ*IQ*BQ*;Q*4Q*-Q*&Q*Q*Q*Q* Q*Q*üP*õP*îP*çP*àP*ÙP*ÒP*ËP*ÄP*½P*¶P*¯P*¨P*¡P*šP*“P*ŒP*…P*~P*wP*pP*iP*bP*[P*TP*MP*FP*?P*8P*1P**P*#P*P*P*P*P*P*ùO*òO*ëO*äO*ÝO*ÖO*ÏO*ÈO*ÁO*ºO*³O*¬O*¥O*žO*—O*O*‰O*‚O*{O*tO*mO*fO*_O*XO*QO*JO*CO*K*7K*0K*)K*"K*K*K* K*K*ÿJ*øJ*ñJ*êJ*ãJ*ÜJ*ÕJ*ÎJ*ÇJ*ÀJ*¹J*²J*«J*¤J*J*–J*J*ˆJ*J*zJ*sJ*lJ*eJ*^J*WJ*PJ*IJ*BJ*;J*4J*-J*&J*J*J*J* J*J*üI*õI*îI*çI*àI*ÙI*ÒI*ËI*ÄI*½I*¶I*¯I*¨I*¡I*šI*“I*ŒI*…I*~I*wI*pI*iI*bI*[I*TI*MI*FI*?I*8I*1I**I*#I*I*I*I*I*I*ùH*òH*ëH*äH*ÝH*ÖH*ÏH*ÈH*ÁH*ºH*³H*¬H*¥H*žH*—H*H*‰H*‚H*{H*tH*mH*fH*_H*XH*QH*JH*CH*D*7D*0D*)D*"D*D*D* D*D*ÿC*øC*ñC*êC*ãC*ÜC*ÕC*ÎC*ÇC*ÀC*¹C*²C*«C*¤C*C*–C*C*ˆC*C*zC*sC*lC*eC*^C*WC*PC*IC*BC*;C*4C*-C*&C*C*C*C* C*C*üB*õB*îB*çB*àB*ÙB*ÒB*ËB*ÄB*½B*¶B*¯B*¨B*¡B*šB*“B*ŒB*…B*~B*wB*pB*iB*bB*[B*TB*MB*FB*?B*8B*1B**B*#B*B*B*B*B*B*ùA*òA*ëA*äA*ÝA*ÖA*ÏA*ÈA*ÁA*ºA*³A*¬A*¥A*žA*—A*A*‰A*‚A*{A*tA*mA*fA*_A*XA*QA*JA*CA**÷>*ð>*é>*â>*Û>*Ô>*Í>*Æ>*¿>*¸>*±>*ª>*£>*œ>*•>*Ž>*‡>*€>*y>*r>*k>*d>*]>*V>*O>*H>*A>*:>*3>*,>*%>*>*>*>* >*>*û=*ô=*í=*æ=*ß=*Ø=*Ñ=*Ê=*Ã=*¼=*µ=*®=*§=* =*™=*’=*‹=*„=*}=*v=*o=*h=*a=*Z=*S=*L=*E=*>=*7=*0=*)=*"=*=*=* =*=*ÿ<*ø<*ñ<*ê<*ã<*Ü<*Õ<*Î<*Ç<*À<*¹<*²<*«<*¤<*<*–<*<*ˆ<*<*z<*s<*l<*e<*^<*W<*P<*I<*B<*;<*4<*-<*&<*<*<*<* <*<*ü;*õ;*î;*ç;*à;*Ù;*Ò;*Ë;*Ä;*½;*¶;*¯;*¨;*¡;*š;*“;*Œ;*…;*~;*w;*p;*i;*b;*[;*T;*M;*F;*?;*8;*1;**;*#;*;*;*;*;*;*ù:*ò:*ë:*ä:*Ý:*Ö:*Ï:*È:*Á:*º:*³:*¬:*¥:*ž:*—:*:*‰:*‚:*{:*t:*m:*f:*_:*X:*Q:*J:*C:*<:*5:*.:*':* :*:*:* :*:*ý9*ö9*ï9*è9*á9*Ú9*Ó9*Ì9*Å9*¾9*·9*°9*©9*¢9*›9*”9*9*†9*9*x9*q9*j9*c9*\9*U9*N9*G9*@9*99*29*+9*$9*9*9*9*9*9*ú8*ó8*ì8*å8*Þ8*×8*Ð8*É8*Â8*»8*´8*­8*¦8*Ÿ8*˜8*‘8*Š8*ƒ8*|8*u8*n8*g8*`8*Y8*R8*K8*D8*=8*68*/8*(8*!8*8*8* 8*8*þ7*÷7*ð7*é7*â7*Û7*Ô7*Í7*Æ7*¿7*¸7*±7*ª7*£7*œ7*•7*Ž7*‡7*€7*y7*r7*k7*d7*]7*V7*O7*H7*A7*:7*37*,7*%7*7*7*7* 7*7*û6*ô6*í6*æ6*ß6*Ø6*Ñ6*Ê6*Ã6*¼6*µ6*®6*§6* 6*™6*’6*‹6*„6*}6*v6*o6*h6*a6*Z6*S6*L6*E6*>6*76*06*)6*"6*6*6* 6*6*ÿ5*ø5*ñ5*ê5*ã5*Ü5*Õ5*Î5*Ç5*À5*¹5*²5*«5*¤5*5*–5*5*ˆ5*5*z5*s5*l5*e5*^5*W5*P5*I5*B5*;5*45*-5*&5*5*5*5* 5*5*ü4*õ4*î4*ç4*à4*Ù4*Ò4*Ë4*Ä4*½4*¶4*¯4*¨4*¡4*š4*“4*Œ4*…4*~4*w4*p4*i4*b4*[4*T4*M4*F4*?4*84*14**4*#4*4*4*4*4*4*ù3*ò3*ë3*ä3*Ý3*Ö3*Ï3*È3*Á3*º3*³3*¬3*¥3*ž3*—3*3*‰3*‚3*{3*t3*m3*f3*_3*X3*Q3*J3*C3*<3*53*.3*'3* 3*3*3* 3*3*ý2*ö2*ï2*è2*á2*Ú2*Ó2*Ì2*Å2*¾2*·2*°2*©2*¢2*›2*”2*2*†2*2*x2*q2*j2*c2*\2*U2*N2*G2*@2*92*22*+2*$2*2*2*2*2*2*ú1*ó1*ì1*å1*Þ1*×1*Ð1*É1*Â1*»1*´1*­1*¦1*Ÿ1*˜1*‘1*Š1*ƒ1*|1*u1*n1*g1*`1*Y1*R1*K1*D1*=1*61*/1*(1*!1*1*1* 1*1*þ0*÷0*ð0*é0*â0*Û0*Ô0*Í0*Æ0*¿0*¸0*±0*ª0*£0*œ0*•0*Ž0*‡0*€0*y0*r0*k0*d0*]0*V0*O0*H0*A0*:0*30*,0*%0*0*0*0* 0*0*û/*ô/*í/*æ/*ß/*Ø/*Ñ/*Ê/*Ã/*¼/*µ/*®/*§/* /*™/*’/*‹/*„/*}/*v/*o/*h/*a/*Z/*S/*L/*E/*>/*7/*0/*)/*"/*/*/* /*/*ÿ.*ø.*ñ.*ê.*ã.*Ü.*Õ.*Î.*Ç.*À.*¹.*².*«.*¤.*.*–.*.*ˆ.*.*z.*s.*l.*e.*^.*W.*P.*I.*B.*;.*4.*-.*&.*.*.*.* .*.*ü-*õ-*î-*ç-*à-*Ù-*Ò-*Ë-*Ä-*½-*¶-*¯-*¨-*¡-*š-*“-*Œ-*…-*~-*w-*p-*i-*b-*[-*T-*M-*F-*?-*8-*1-**-*#-*-*-*-*-*-*ù,*ò,*ë,*ä,*Ý,*Ö,*Ï,*È,*Á,*º,*³,*¬,*¥,*ž,*—,*,*‰,*‚,*{,*t,*m,*f,*_,*X,*Q,*J,*C,*<,*5,*.,*',* ,*,*,* ,*,*ý+*ö+*ï+*è+*á+*Ú+*Ó+*Ì+*Å+*¾+*·+*°+*©+*¢+*›+*”+*+*†+*+*x+*q+*j+*c+*\+*U+*N+*G+*@+*9+*2+*++*$+*+*+*+*+*+*ú**ó**ì**å**Þ**×**Ð**É**Â**»**´**­**¦**Ÿ**˜**‘**Š**ƒ**|**u**n**g**`**Y**R**K**D**=**6**/**(**!****** ****þ)*÷)*ð)*é)*â)*Û)*Ô)*Í)*Æ)*¿)*¸)*±)*ª)*£)*œ)*•)*Ž)*‡)*€)*y)*r)*k)*d)*])*V)*O)*H)*A)*:)*3)*,)*%)*)*)*)* )*)*û(*ô(*í(*æ(*ß(*Ø(*Ñ(*Ê(*Ã(*¼(*µ(*®(*§(* (*™(*’(*‹(*„(*}(*v(*o(*h(*a(*Z(*S(*L(*E(*>(*7(*0(*)(*"(*(*(* (*(*ÿ'*ø'*ñ'*ê'*ã'*Ü'*Õ'*Î'*Ç'*À'*¹'*²'*«'*¤'*'*–'*'*ˆ'*'*z'*s'*l'*e'*^'*W'*P'*I'*B'*;'*4'*-'*&'*'*'*'* '*'*ü&*õ&*î&*ç&*à&*Ù&*Ò&*Ë&*Ä&*½&*¶&*¯&*¨&*¡&*š&*“&*Œ&*…&*~&*w&*p&*i&*b&*[&*T&*M&*F&*?&*8&*1&**&*#&*&*&*&*&*&*ù%*ò%*ë%*ä%*Ý%*Ö%*Ï%*È%*Á%*º%*³%*¬%*¥%*ž%*—%*%*‰%*‚%*{%*t%*m%*f%*_%*X%*Q%*J%*C%*<%*5%*.%*'%* %*%*%* %*%*ý$*ö$*ï$*è$*á$*Ú$*Ó$*Ì$*Å$*¾$*·$*°$*©$*¢$*›$*”$*$*†$*$*x$*q$*j$*c$*\$*U$*N$*G$*@$*9$*2$*+$*$$*$*$*$*$*$*ú#*ó#*ì#*å#*Þ#*×#*Ð#*É#*Â#*»#*´#*­#*¦#*Ÿ#*˜#*‘#*Š#*ƒ#*|#*u#*n#*g#*`#*Y#*R#*K#*D#*=#*6#*/#*(#*!#*#*#* #*#*þ"*÷"*ð"*é"*â"*Û"*Ô"*Í"*Æ"*¿"*¸"*±"*ª"*£"*œ"*•"*Ž"*‡"*€"*y"*r"*k"*d"*]"*V"*O"*H"*A"*:"*3"*,"*%"*"*"*"* "*"*û!*ô!*í!*æ!*ß!*Ø!*Ñ!*Ê!*Ã!*¼!*µ!*®!*§!* !*™!*’!*‹!*„!*}!*v!*o!*h!*a!*Z!*S!*L!*E!*>!*7!*0!*)!*"!*!*!* !*!*ÿ *ø *ñ *ê *ã *Ü *Õ *Î *Ç *À *¹ *² *« *¤ * *– * *ˆ * *z *s *l *e *^ *W *P *I *B *; *4 *- *& * * * * * *ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ *÷ *ð *é *â *Û *Ô *Í *Æ *¿ *¸ *± *ª *£ *œ *• *Ž *‡ *€ *y *r *k *d *] *V *O *H *A *: *3 *, *% * * * * * *û *ô *í *æ *ß *Ø *Ñ *Ê *à *¼ *µ *® *§ *  *™ *’ *‹ *„ *} *v *o *h *a *Z *S *L *E *> *7 *0 *) *" * * * * *ÿ *ø *ñ *ê *ã *Ü *Õ *Î *Ç *À *¹ *² *« *¤ * *– * *ˆ * *z *s *l *e *^ *W *P *I *B *; *4 *- *& * * * * * *ü *õ *î *ç *à *Ù *Ò *Ë *Ä *½ *¶ *¯ *¨ *¡ *š *“ *Œ *… *~ *w *p *i *b *[ *T *M *F *? *8 *1 ** *# * * * * * *ù *ò *ë *ä *Ý *Ö *Ï *È *Á *º *³ *¬ *¥ *ž *— * *‰ *‚ *{ *t *m *f *_ *X *Q *J *C *< *5 *. *' * * * * * *ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þÿ)÷ÿ)ðÿ)éÿ)âÿ)Ûÿ)Ôÿ)Íÿ)Æÿ)¿ÿ)¸ÿ)±ÿ)ªÿ)£ÿ)œÿ)•ÿ)Žÿ)‡ÿ)€ÿ)yÿ)rÿ)kÿ)dÿ)]ÿ)Vÿ)Oÿ)Hÿ)Aÿ):ÿ)3ÿ),ÿ)%ÿ)ÿ)ÿ)ÿ) ÿ)ÿ)ûþ)ôþ)íþ)æþ)ßþ)Øþ)Ñþ)Êþ)Ãþ)¼þ)µþ)®þ)§þ) þ)™þ)’þ)‹þ)„þ)}þ)vþ)oþ)hþ)aþ)Zþ)Sþ)Lþ)Eþ)>þ)7þ)0þ))þ)"þ)þ)þ) þ)þ)ÿý)øý)ñý)êý)ãý)Üý)Õý)Îý)Çý)Àý)¹ý)²ý)«ý)¤ý)ý)–ý)ý)ˆý)ý)zý)sý)lý)eý)^ý)Wý)Pý)Iý)Bý);ý)4ý)-ý)&ý)ý)ý)ý) ý)ý)üü)õü)îü)çü)àü)Ùü)Òü)Ëü)Äü)½ü)¶ü)¯ü)¨ü)¡ü)šü)“ü)Œü)…ü)~ü)wü)pü)iü)bü)[ü)Tü)Mü)Fü)?ü)8ü)1ü)*ü)#ü)ü)ü)ü)ü)ü)ùû)òû)ëû)äû)Ýû)Öû)Ïû)Èû)Áû)ºû)³û)¬û)¥û)žû)—û)û)‰û)‚û){û)tû)mû)fû)_û)Xû)Qû)Jû)Cû)<û)5û).û)'û) û)û)û) û)û)ýú)öú)ïú)èú)áú)Úú)Óú)Ìú)Åú)¾ú)·ú)°ú)©ú)¢ú)›ú)”ú)ú)†ú)ú)xú)qú)jú)cú)\ú)Uú)Nú)Gú)@ú)9ú)2ú)+ú)$ú)ú)ú)ú)ú)ú)úù)óù)ìù)åù)Þù)×ù)Ðù)Éù)Âù)»ù)´ù)­ù)¦ù)Ÿù)˜ù)‘ù)Šù)ƒù)|ù)uù)nù)gù)`ù)Yù)Rù)Kù)Dù)=ù)6ù)/ù)(ù)!ù)ù)ù) ù)ù)þø)÷ø)ðø)éø)âø)Ûø)Ôø)Íø)Æø)¿ø)¸ø)±ø)ªø)£ø)œø)•ø)Žø)‡ø)€ø)yø)rø)kø)dø)]ø)Vø)Oø)Hø)Aø):ø)3ø),ø)%ø)ø)ø)ø) ø)ø)û÷)ô÷)í÷)æ÷)ß÷)Ø÷)Ñ÷)Ê÷)Ã÷)¼÷)µ÷)®÷)§÷) ÷)™÷)’÷)‹÷)„÷)}÷)v÷)o÷)h÷)a÷)Z÷)S÷)L÷)E÷)>÷)7÷)0÷))÷)"÷)÷)÷) ÷)÷)ÿö)øö)ñö)êö)ãö)Üö)Õö)Îö)Çö)Àö)¹ö)²ö)«ö)¤ö)ö)–ö)ö)ˆö)ö)zö)sö)lö)eö)^ö)Wö)Pö)Iö)Bö);ö)4ö)-ö)&ö)ö)ö)ö) ö)ö)üõ)õõ)îõ)çõ)àõ)Ùõ)Òõ)Ëõ)Äõ)½õ)¶õ)¯õ)¨õ)¡õ)šõ)“õ)Œõ)…õ)~õ)wõ)põ)iõ)bõ)[õ)Tõ)Mõ)Fõ)?õ)8õ)1õ)*õ)#õ)õ)õ)õ)õ)õ)ùô)òô)ëô)äô)Ýô)Öô)Ïô)Èô)Áô)ºô)³ô)¬ô)¥ô)žô)—ô)ô)‰ô)‚ô){ô)tô)mô)fô)_ô)Xô)Qô)Jô)Cô)<ô)5ô).ô)'ô) ô)ô)ô) ô)ô)ýó)öó)ïó)èó)áó)Úó)Óó)Ìó)Åó)¾ó)·ó)°ó)©ó)¢ó)›ó)”ó)ó)†ó)ó)xó)qó)jó)có)\ó)Uó)Nó)Gó)@ó)9ó)2ó)+ó)$ó)ó)ó)ó)ó)ó)úò)óò)ìò)åò)Þò)×ò)Ðò)Éò)Âò)»ò)´ò)­ò)¦ò)Ÿò)˜ò)‘ò)Šò)ƒò)|ò)uò)nò)gò)`ò)Yò)Rò)Kò)Dò)=ò)6ò)/ò)(ò)!ò)ò)ò) ò)ò)þñ)÷ñ)ðñ)éñ)âñ)Ûñ)Ôñ)Íñ)Æñ)¿ñ)¸ñ)±ñ)ªñ)£ñ)œñ)•ñ)Žñ)‡ñ)€ñ)yñ)rñ)kñ)dñ)]ñ)Vñ)Oñ)Hñ)Añ):ñ)3ñ),ñ)%ñ)ñ)ñ)ñ) ñ)ñ)ûð)ôð)íð)æð)ßð)Øð)Ñð)Êð)Ãð)¼ð)µð)®ð)§ð) ð)™ð)’ð)‹ð)„ð)}ð)vð)oð)hð)að)Zð)Sð)Lð)Eð)>ð)7ð)0ð))ð)"ð)ð)ð) ð)ð)ÿï)øï)ñï)êï)ãï)Üï)Õï)Îï)Çï)Àï)¹ï)²ï)«ï)¤ï)ï)–ï)ï)ˆï)ï)zï)sï)lï)eï)^ï)Wï)Pï)Iï)Bï);ï)4ï)-ï)&ï)ï)ï)ï) ï)ï)üî)õî)îî)çî)àî)Ùî)Òî)Ëî)Äî)½î)¶î)¯î)¨î)¡î)šî)“î)Œî)…î)~î)wî)pî)iî)bî)[î)Tî)Mî)Fî)?î)8î)1î)*î)#î)î)î)î)î)î)ùí)òí)ëí)äí)Ýí)Öí)Ïí)Èí)Áí)ºí)³í)¬í)¥í)ží)—í)í)‰í)‚í){í)tí)mí)fí)_í)Xí)Qí)Jí)Cí)<í)5í).í)'í) í)í)í) í)í)ýì)öì)ïì)èì)áì)Úì)Óì)Ìì)Åì)¾ì)·ì)°ì)©ì)¢ì)›ì)”ì)ì)†ì)ì)xì)qì)jì)cì)\ì)Uì)Nì)Gì)@ì)9ì)2ì)+ì)$ì)ì)ì)ì)ì)ì)úë)óë)ìë)åë)Þë)×ë)Ðë)Éë)Âë)»ë)´ë)­ë)¦ë)Ÿë)˜ë)‘ë)Šë)ƒë)|ë)uë)në)gë)`ë)Yë)Rë)Kë)Dë)=ë)6ë)/ë)(ë)!ë)ë)ë) ë)ë)þê)÷ê)ðê)éê)âê)Ûê)Ôê)Íê)Æê)¿ê)¸ê)±ê)ªê)£ê)œê)•ê)Žê)‡ê)€ê)yê)rê)kê)dê)]ê)Vê)Oê)Hê)Aê):ê)3ê),ê)%ê)ê)ê)ê) ê)ê)ûé)ôé)íé)æé)ßé)Øé)Ñé)Êé)Ãé)¼é)µé)®é)§é) é)™é)’é)‹é)„é)}é)vé)oé)hé)aé)Zé)Sé)Lé)Eé)>é)7é)0é))é)"é)é)é) é)é)ÿè)øè)ñè)êè)ãè)Üè)Õè)Îè)Çè)Àè)¹è)²è)«è)¤è)è)–è)è)ˆè)è)zè)sè)lè)eè)^è)Wè)Pè)Iè)Bè);è)4è)-è)&è)è)è)è) è)è)üç)õç)îç)çç)àç)Ùç)Òç)Ëç)Äç)½ç)¶ç)¯ç)¨ç)¡ç)šç)“ç)Œç)…ç)~ç)wç)pç)iç)bç)[ç)Tç)Mç)Fç)?ç)8ç)1ç)*ç)#ç)ç)ç)ç)ç)ç)ùæ)òæ)ëæ)äæ)Ýæ)Öæ)Ïæ)Èæ)Áæ)ºæ)³æ)¬æ)¥æ)žæ)—æ)æ)‰æ)‚æ){æ)tæ)mæ)fæ)_æ)Xæ)Qæ)Jæ)Cæ)<æ)5æ).æ)'æ) æ)æ)æ) æ)æ)ýå)öå)ïå)èå)áå)Úå)Óå)Ìå)Åå)¾å)·å)°å)©å)¢å)›å)”å)å)†å)å)xå)qå)jå)cå)\å)Uå)Nå)Gå)@å)9å)2å)+å)$å)å)å)å)å)å)úä)óä)ìä)åä)Þä)×ä)Ðä)Éä)Âä)»ä)´ä)­ä)¦ä)Ÿä)˜ä)‘ä)Šä)ƒä)|ä)uä)nä)gä)`ä)Yä)Rä)Kä)Dä)=ä)6ä)/ä)(ä)!ä)ä)ä) ä)ä)þã)÷ã)ðã)éã)âã)Ûã)Ôã)Íã)Æã)¿ã)¸ã)±ã)ªã)£ã)œã)•ã)Žã)‡ã)€ã)yã)rã)kã)dã)]ã)Vã)Oã)Hã)Aã):ã)3ã),ã)%ã)ã)ã)ã) ã)ã)ûâ)ôâ)íâ)æâ)ßâ)Øâ)Ñâ)Êâ)Ãâ)¼â)µâ)®â)§â) â)™â)’â)‹â)„â)}â)vâ)oâ)hâ)aâ)Zâ)Sâ)Lâ)Eâ)>â)7â)0â))â)"â)â)â) â)â)ÿá)øá)ñá)êá)ãá)Üá)Õá)Îá)Çá)Àá)¹á)²á)«á)¤á)á)–á)á)ˆá)á)zá)sá)lá)eá)^á)Wá)Pá)Iá)Bá);á)4á)-á)&á)á)á)á) á)á)üà)õà)îà)çà)àà)Ùà)Òà)Ëà)Äà)½à)¶à)¯à)¨à)¡à)šà)“à)Œà)…à)~à)wà)pà)ià)bà)[à)Tà)Mà)Fà)?à)8à)1à)*à)#à)à)à)à)à)à)ùß)òß)ëß)äß)Ýß)Öß)Ïß)Èß)Áß)ºß)³ß)¬ß)¥ß)žß)—ß)ß)‰ß)‚ß){ß)tß)mß)fß)_ß)Xß)Qß)Jß)Cß)<ß)5ß).ß)'ß) ß)ß)ß) ß)ß)ýÞ)öÞ)ïÞ)èÞ)áÞ)ÚÞ)ÓÞ)ÌÞ)ÅÞ)¾Þ)·Þ)°Þ)©Þ)¢Þ)›Þ)”Þ)Þ)†Þ)Þ)xÞ)qÞ)jÞ)cÞ)\Þ)UÞ)NÞ)GÞ)@Þ)9Þ)2Þ)+Þ)$Þ)Þ)Þ)Þ)Þ)Þ)úÝ)óÝ)ìÝ)åÝ)ÞÝ)×Ý)ÐÝ)ÉÝ)ÂÝ)»Ý)´Ý)­Ý)¦Ý)ŸÝ)˜Ý)‘Ý)ŠÝ)ƒÝ)|Ý)uÝ)nÝ)gÝ)`Ý)YÝ)RÝ)KÝ)DÝ)=Ý)6Ý)/Ý)(Ý)!Ý)Ý)Ý) Ý)Ý)þÜ)÷Ü)ðÜ)éÜ)âÜ)ÛÜ)ÔÜ)ÍÜ)ÆÜ)¿Ü)¸Ü)±Ü)ªÜ)£Ü)œÜ)•Ü)ŽÜ)‡Ü)€Ü)yÜ)rÜ)kÜ)dÜ)]Ü)VÜ)OÜ)HÜ)AÜ):Ü)3Ü),Ü)%Ü)Ü)Ü)Ü) Ü)Ü)ûÛ)ôÛ)íÛ)æÛ)ßÛ)ØÛ)ÑÛ)ÊÛ)ÃÛ)¼Û)µÛ)®Û)§Û) Û)™Û)’Û)‹Û)„Û)}Û)vÛ)oÛ)hÛ)aÛ)ZÛ)SÛ)LÛ)EÛ)>Û)7Û)0Û))Û)"Û)Û)Û) Û)Û)ÿÚ)øÚ)ñÚ)êÚ)ãÚ)ÜÚ)ÕÚ)ÎÚ)ÇÚ)ÀÚ)¹Ú)²Ú)«Ú)¤Ú)Ú)–Ú)Ú)ˆÚ)Ú)zÚ)sÚ)lÚ)eÚ)^Ú)WÚ)PÚ)IÚ)BÚ);Ú)4Ú)-Ú)&Ú)Ú)Ú)Ú) Ú)Ú)üÙ)õÙ)îÙ)çÙ)àÙ)ÙÙ)ÒÙ)ËÙ)ÄÙ)½Ù)¶Ù)¯Ù)¨Ù)¡Ù)šÙ)“Ù)ŒÙ)…Ù)~Ù)wÙ)pÙ)iÙ)bÙ)[Ù)TÙ)MÙ)FÙ)?Ù)8Ù)1Ù)*Ù)#Ù)Ù)Ù)Ù)Ù)Ù)ùØ)òØ)ëØ)äØ)ÝØ)ÖØ)ÏØ)ÈØ)ÁØ)ºØ)³Ø)¬Ø)¥Ø)žØ)—Ø)Ø)‰Ø)‚Ø){Ø)tØ)mØ)fØ)_Ø)XØ)QØ)JØ)CØ)<Ø)5Ø).Ø)'Ø) Ø)Ø)Ø) Ø)Ø)ý×)ö×)ï×)è×)á×)Ú×)Ó×)Ì×)Å×)¾×)·×)°×)©×)¢×)›×)”×)×)†×)×)x×)q×)j×)c×)\×)U×)N×)G×)@×)9×)2×)+×)$×)×)×)×)×)×)úÖ)óÖ)ìÖ)åÖ)ÞÖ)×Ö)ÐÖ)ÉÖ)ÂÖ)»Ö)´Ö)­Ö)¦Ö)ŸÖ)˜Ö)‘Ö)ŠÖ)ƒÖ)|Ö)uÖ)nÖ)gÖ)`Ö)YÖ)RÖ)KÖ)DÖ)=Ö)6Ö)/Ö)(Ö)!Ö)Ö)Ö) Ö)Ö)þÕ)÷Õ)ðÕ)éÕ)âÕ)ÛÕ)ÔÕ)ÍÕ)ÆÕ)¿Õ)¸Õ)±Õ)ªÕ)£Õ)œÕ)•Õ)ŽÕ)‡Õ)€Õ)yÕ)rÕ)kÕ)dÕ)]Õ)VÕ)OÕ)HÕ)AÕ):Õ)3Õ),Õ)%Õ)Õ)Õ)Õ) Õ)Õ)ûÔ)ôÔ)íÔ)æÔ)ßÔ)ØÔ)ÑÔ)ÊÔ)ÃÔ)¼Ô)µÔ)®Ô)§Ô) Ô)™Ô)’Ô)‹Ô)„Ô)}Ô)vÔ)oÔ)hÔ)aÔ)ZÔ)SÔ)LÔ)EÔ)>Ô)7Ô)0Ô))Ô)"Ô)Ô)Ô) Ô)Ô)ÿÓ)øÓ)ñÓ)êÓ)ãÓ)ÜÓ)ÕÓ)ÎÓ)ÇÓ)ÀÓ)¹Ó)²Ó)«Ó)¤Ó)Ó)–Ó)Ó)ˆÓ)Ó)zÓ)sÓ)lÓ)eÓ)^Ó)WÓ)PÓ)IÓ)BÓ);Ó)4Ó)-Ó)&Ó)Ó)Ó)Ó) Ó)Ó)üÒ)õÒ)îÒ)çÒ)àÒ)ÙÒ)ÒÒ)ËÒ)ÄÒ)½Ò)¶Ò)¯Ò)¨Ò)¡Ò)šÒ)“Ò)ŒÒ)…Ò)~Ò)wÒ)pÒ)iÒ)bÒ)[Ò)TÒ)MÒ)FÒ)?Ò)8Ò)1Ò)*Ò)#Ò)Ò)Ò)Ò)Ò)Ò)ùÑ)òÑ)ëÑ)äÑ)ÝÑ)ÖÑ)ÏÑ)ÈÑ)ÁÑ)ºÑ)³Ñ)¬Ñ)¥Ñ)žÑ)—Ñ)Ñ)‰Ñ)‚Ñ){Ñ)tÑ)mÑ)fÑ)_Ñ)XÑ)QÑ)JÑ)CÑ)<Ñ)5Ñ).Ñ)'Ñ) Ñ)Ñ)Ñ) Ñ)Ñ)ýÐ)öÐ)ïÐ)èÐ)áÐ)ÚÐ)ÓÐ)ÌÐ)ÅÐ)¾Ð)·Ð)°Ð)©Ð)¢Ð)›Ð)”Ð)Ð)†Ð)Ð)xÐ)qÐ)jÐ)cÐ)\Ð)UÐ)NÐ)GÐ)@Ð)9Ð)2Ð)+Ð)$Ð)Ð)Ð)Ð)Ð)Ð)úÏ)óÏ)ìÏ)åÏ)ÞÏ)×Ï)ÐÏ)ÉÏ)ÂÏ)»Ï)´Ï)­Ï)¦Ï)ŸÏ)˜Ï)‘Ï)ŠÏ)ƒÏ)|Ï)uÏ)nÏ)gÏ)`Ï)YÏ)RÏ)KÏ)DÏ)=Ï)6Ï)/Ï)(Ï)!Ï)Ï)Ï) Ï)Ï)þÎ)÷Î)ðÎ)éÎ)âÎ)ÛÎ)ÔÎ)ÍÎ)ÆÎ)¿Î)¸Î)±Î)ªÎ)£Î)œÎ)•Î)ŽÎ)‡Î)€Î)yÎ)rÎ)kÎ)dÎ)]Î)VÎ)OÎ)HÎ)AÎ):Î)3Î),Î)%Î)Î)Î)Î) Î)Î)ûÍ)ôÍ)íÍ)æÍ)ßÍ)ØÍ)ÑÍ)ÊÍ)ÃÍ)¼Í)µÍ)®Í)§Í) Í)™Í)’Í)‹Í)„Í)}Í)vÍ)oÍ)hÍ)aÍ)ZÍ)SÍ)LÍ)EÍ)>Í)7Í)0Í))Í)"Í)Í)Í) Í)Í)ÿÌ)øÌ)ñÌ)êÌ)ãÌ)ÜÌ)ÕÌ)ÎÌ)ÇÌ)ÀÌ)¹Ì)²Ì)«Ì)¤Ì)Ì)–Ì)Ì)ˆÌ)Ì)zÌ)sÌ)lÌ)eÌ)^Ì)WÌ)PÌ)IÌ)BÌ);Ì)4Ì)-Ì)&Ì)Ì)Ì)Ì) Ì)Ì)üË)õË)îË)çË)àË)ÙË)ÒË)ËË)ÄË)½Ë)¶Ë)¯Ë)¨Ë)¡Ë)šË)“Ë)ŒË)…Ë)~Ë)wË)pË)iË)bË)[Ë)TË)MË)FË)?Ë)8Ë)1Ë)*Ë)#Ë)Ë)Ë)Ë)Ë)Ë)ùÊ)òÊ)ëÊ)äÊ)ÝÊ)ÖÊ)ÏÊ)ÈÊ)ÁÊ)ºÊ)³Ê)¬Ê)¥Ê)žÊ)—Ê)Ê)‰Ê)‚Ê){Ê)tÊ)mÊ)fÊ)_Ê)XÊ)QÊ)JÊ)CÊ)<Ê)5Ê).Ê)'Ê) Ê)Ê)Ê) Ê)Ê)ýÉ)öÉ)ïÉ)èÉ)áÉ)ÚÉ)ÓÉ)ÌÉ)ÅÉ)¾É)·É)°É)©É)¢É)›É)”É)É)†É)É)xÉ)qÉ)jÉ)cÉ)\É)UÉ)NÉ)GÉ)@É)9É)2É)+É)$É)É)É)É)É)É)úÈ)óÈ)ìÈ)åÈ)ÞÈ)×È)ÐÈ)ÉÈ)ÂÈ)»È)´È)­È)¦È)ŸÈ)˜È)‘È)ŠÈ)ƒÈ)|È)uÈ)nÈ)gÈ)`È)YÈ)RÈ)KÈ)DÈ)=È)6È)/È)(È)!È)È)È) È)È)þÇ)÷Ç)ðÇ)éÇ)âÇ)ÛÇ)ÔÇ)ÍÇ)ÆÇ)¿Ç)¸Ç)±Ç)ªÇ)£Ç)œÇ)•Ç)ŽÇ)‡Ç)€Ç)yÇ)rÇ)kÇ)dÇ)]Ç)VÇ)OÇ)HÇ)AÇ):Ç)3Ç),Ç)%Ç)Ç)Ç)Ç) Ç)Ç)ûÆ)ôÆ)íÆ)æÆ)߯)ØÆ)ÑÆ)ÊÆ)ÃÆ)¼Æ)µÆ)®Æ)§Æ) Æ)™Æ)’Æ)‹Æ)„Æ)}Æ)vÆ)oÆ)hÆ)aÆ)ZÆ)SÆ)LÆ)EÆ)>Æ)7Æ)0Æ))Æ)"Æ)Æ)Æ) Æ)Æ)ÿÅ)øÅ)ñÅ)êÅ)ãÅ)ÜÅ)ÕÅ)ÎÅ)ÇÅ)ÀÅ)¹Å)²Å)«Å)¤Å)Å)–Å)Å)ˆÅ)Å)zÅ)sÅ)lÅ)eÅ)^Å)WÅ)PÅ)IÅ)BÅ);Å)4Å)-Å)&Å)Å)Å)Å) Å)Å)üÄ)õÄ)îÄ)çÄ)àÄ)ÙÄ)ÒÄ)ËÄ)ÄÄ)½Ä)¶Ä)¯Ä)¨Ä)¡Ä)šÄ)“Ä)ŒÄ)…Ä)~Ä)wÄ)pÄ)iÄ)bÄ)[Ä)TÄ)MÄ)FÄ)?Ä)8Ä)1Ä)*Ä)#Ä)Ä)Ä)Ä)Ä)Ä)ùÃ)òÃ)ëÃ)äÃ)ÝÃ)ÖÃ)ÏÃ)ÈÃ)ÁÃ)ºÃ)³Ã)¬Ã)¥Ã)žÃ)—Ã)Ã)‰Ã)‚Ã){Ã)tÃ)mÃ)fÃ)_Ã)XÃ)QÃ)JÃ)CÃ)<Ã)5Ã).Ã)'Ã) Ã)Ã)Ã) Ã)Ã)ýÂ)öÂ)ïÂ)èÂ)áÂ)ÚÂ)ÓÂ)ÌÂ)ÅÂ)¾Â)·Â)°Â)©Â)¢Â)›Â)”Â)Â)†Â)Â)xÂ)qÂ)jÂ)cÂ)\Â)UÂ)NÂ)GÂ)@Â)9Â)2Â)+Â)$Â)Â)Â)Â)Â)Â)úÁ)óÁ)ìÁ)åÁ)ÞÁ)×Á)ÐÁ)ÉÁ)ÂÁ)»Á)´Á)­Á)¦Á)ŸÁ)˜Á)‘Á)ŠÁ)ƒÁ)|Á)uÁ)nÁ)gÁ)`Á)YÁ)RÁ)KÁ)DÁ)=Á)6Á)/Á)(Á)!Á)Á)Á) Á)Á)þÀ)÷À)ðÀ)éÀ)âÀ)ÛÀ)ÔÀ)ÍÀ)ÆÀ)¿À)¸À)±À)ªÀ)£À)œÀ)•À)ŽÀ)‡À)€À)yÀ)rÀ)kÀ)dÀ)]À)VÀ)OÀ)HÀ)AÀ):À)3À),À)%À)À)À)À) À)À)û¿)ô¿)í¿)æ¿)ß¿)Ø¿)Ñ¿)Ê¿)ÿ)¼¿)µ¿)®¿)§¿) ¿)™¿)’¿)‹¿)„¿)}¿)v¿)o¿)h¿)a¿)Z¿)S¿)L¿)E¿)>¿)7¿)0¿))¿)"¿)¿)¿) ¿)¿)ÿ¾)ø¾)ñ¾)ê¾)ã¾)ܾ)Õ¾)ξ)Ǿ)À¾)¹¾)²¾)«¾)¤¾)¾)–¾)¾)ˆ¾)¾)z¾)s¾)l¾)e¾)^¾)W¾)P¾)I¾)B¾);¾)4¾)-¾)&¾)¾)¾)¾) ¾)¾)ü½)õ½)î½)ç½)à½)Ù½)Ò½)˽)Ľ)½½)¶½)¯½)¨½)¡½)š½)“½)Œ½)…½)~½)w½)p½)i½)b½)[½)T½)M½)F½)?½)8½)1½)*½)#½)½)½)½)½)½)ù¼)ò¼)ë¼)ä¼)ݼ)Ö¼)ϼ)ȼ)Á¼)º¼)³¼)¬¼)¥¼)ž¼)—¼)¼)‰¼)‚¼){¼)t¼)m¼)f¼)_¼)X¼)Q¼)J¼)C¼)<¼)5¼).¼)'¼) ¼)¼)¼) ¼)¼)ý»)ö»)ï»)è»)á»)Ú»)Ó»)Ì»)Å»)¾»)·»)°»)©»)¢»)›»)”»)»)†»)»)x»)q»)j»)c»)\»)U»)N»)G»)@»)9»)2»)+»)$»)»)»)»)»)»)úº)óº)ìº)åº)Þº)׺)к)ɺ)º)»º)´º)­º)¦º)Ÿº)˜º)‘º)Šº)ƒº)|º)uº)nº)gº)`º)Yº)Rº)Kº)Dº)=º)6º)/º)(º)!º)º)º) º)º)þ¹)÷¹)ð¹)é¹)â¹)Û¹)Ô¹)͹)ƹ)¿¹)¸¹)±¹)ª¹)£¹)œ¹)•¹)޹)‡¹)€¹)y¹)r¹)k¹)d¹)]¹)V¹)O¹)H¹)A¹):¹)3¹),¹)%¹)¹)¹)¹) ¹)¹)û¸)ô¸)í¸)æ¸)߸)ظ)Ѹ)ʸ)ø)¼¸)µ¸)®¸)§¸) ¸)™¸)’¸)‹¸)„¸)}¸)v¸)o¸)h¸)a¸)Z¸)S¸)L¸)E¸)>¸)7¸)0¸))¸)"¸)¸)¸) ¸)¸)ÿ·)ø·)ñ·)ê·)ã·)Ü·)Õ·)η)Ç·)À·)¹·)²·)«·)¤·)·)–·)·)ˆ·)·)z·)s·)l·)e·)^·)W·)P·)I·)B·);·)4·)-·)&·)·)·)·) ·)·)ü¶)õ¶)î¶)ç¶)à¶)Ù¶)Ò¶)˶)Ķ)½¶)¶¶)¯¶)¨¶)¡¶)š¶)“¶)Œ¶)…¶)~¶)w¶)p¶)i¶)b¶)[¶)T¶)M¶)F¶)?¶)8¶)1¶)*¶)#¶)¶)¶)¶)¶)¶)ùµ)òµ)ëµ)äµ)ݵ)Öµ)ϵ)ȵ)Áµ)ºµ)³µ)¬µ)¥µ)žµ)—µ)µ)‰µ)‚µ){µ)tµ)mµ)fµ)_µ)Xµ)Qµ)Jµ)Cµ)<µ)5µ).µ)'µ) µ)µ)µ) µ)µ)ý´)ö´)ï´)è´)á´)Ú´)Ó´)Ì´)Å´)¾´)·´)°´)©´)¢´)›´)”´)´)†´)´)x´)q´)j´)c´)\´)U´)N´)G´)@´)9´)2´)+´)$´)´)´)´)´)´)ú³)ó³)ì³)å³)Þ³)׳)г)ɳ)³)»³)´³)­³)¦³)Ÿ³)˜³)‘³)г)ƒ³)|³)u³)n³)g³)`³)Y³)R³)K³)D³)=³)6³)/³)(³)!³)³)³) ³)³)þ²)÷²)ð²)é²)â²)Û²)Ô²)Ͳ)Ʋ)¿²)¸²)±²)ª²)£²)œ²)•²)޲)‡²)€²)y²)r²)k²)d²)]²)V²)O²)H²)A²):²)3²),²)%²)²)²)²) ²)²)û±)ô±)í±)æ±)ß±)ر)ѱ)ʱ)ñ)¼±)µ±)®±)§±) ±)™±)’±)‹±)„±)}±)v±)o±)h±)a±)Z±)S±)L±)E±)>±)7±)0±))±)"±)±)±) ±)±)ÿ°)ø°)ñ°)ê°)ã°)ܰ)Õ°)ΰ)ǰ)À°)¹°)²°)«°)¤°)°)–°)°)ˆ°)°)z°)s°)l°)e°)^°)W°)P°)I°)B°);°)4°)-°)&°)°)°)°) °)°)ü¯)õ¯)î¯)ç¯)à¯)Ù¯)Ò¯)˯)į)½¯)¶¯)¯¯)¨¯)¡¯)š¯)“¯)Œ¯)…¯)~¯)w¯)p¯)i¯)b¯)[¯)T¯)M¯)F¯)?¯)8¯)1¯)*¯)#¯)¯)¯)¯)¯)¯)ù®)ò®)ë®)ä®)Ý®)Ö®)Ï®)È®)Á®)º®)³®)¬®)¥®)ž®)—®)®)‰®)‚®){®)t®)m®)f®)_®)X®)Q®)J®)C®)<®)5®).®)'®) ®)®)®) ®)®)ý­)ö­)ï­)è­)á­)Ú­)Ó­)Ì­)Å­)¾­)·­)°­)©­)¢­)›­)”­)­)†­)­)x­)q­)j­)c­)\­)U­)N­)G­)@­)9­)2­)+­)$­)­)­)­)­)­)ú¬)ó¬)ì¬)å¬)Þ¬)׬)Ь)ɬ)¬)»¬)´¬)­¬)¦¬)Ÿ¬)˜¬)‘¬)Ь)ƒ¬)|¬)u¬)n¬)g¬)`¬)Y¬)R¬)K¬)D¬)=¬)6¬)/¬)(¬)!¬)¬)¬) ¬)¬)þ«)÷«)ð«)é«)â«)Û«)Ô«)Í«)Æ«)¿«)¸«)±«)ª«)£«)œ«)•«)Ž«)‡«)€«)y«)r«)k«)d«)]«)V«)O«)H«)A«):«)3«),«)%«)«)«)«) «)«)ûª)ôª)íª)æª)ߪ)ت)Ѫ)ʪ)ê)¼ª)µª)®ª)§ª) ª)™ª)’ª)‹ª)„ª)}ª)vª)oª)hª)aª)Zª)Sª)Lª)Eª)>ª)7ª)0ª))ª)"ª)ª)ª) ª)ª)ÿ©)ø©)ñ©)ê©)ã©)Ü©)Õ©)Ω)Ç©)À©)¹©)²©)«©)¤©)©)–©)©)ˆ©)©)z©)s©)l©)e©)^©)W©)P©)I©)B©);©)4©)-©)&©)©)©)©) ©)©)ü¨)õ¨)î¨)ç¨)à¨)Ù¨)Ò¨)˨)Ĩ)½¨)¶¨)¯¨)¨¨)¡¨)š¨)“¨)Œ¨)…¨)~¨)w¨)p¨)i¨)b¨)[¨)T¨)M¨)F¨)?¨)8¨)1¨)*¨)#¨)¨)¨)¨)¨)¨)ù§)ò§)ë§)ä§)ݧ)Ö§)ϧ)ȧ)Á§)º§)³§)¬§)¥§)ž§)—§)§)‰§)‚§){§)t§)m§)f§)_§)X§)Q§)J§)C§)<§)5§).§)'§) §)§)§) §)§)ý¦)ö¦)ï¦)è¦)á¦)Ú¦)Ó¦)̦)Ŧ)¾¦)·¦)°¦)©¦)¢¦)›¦)”¦)¦)†¦)¦)x¦)q¦)j¦)c¦)\¦)U¦)N¦)G¦)@¦)9¦)2¦)+¦)$¦)¦)¦)¦)¦)¦)ú¥)ó¥)ì¥)å¥)Þ¥)×¥)Ð¥)É¥)Â¥)»¥)´¥)­¥)¦¥)Ÿ¥)˜¥)‘¥)Š¥)ƒ¥)|¥)u¥)n¥)g¥)`¥)Y¥)R¥)K¥)D¥)=¥)6¥)/¥)(¥)!¥)¥)¥) ¥)¥)þ¤)÷¤)ð¤)é¤)â¤)Û¤)Ô¤)ͤ)Ƥ)¿¤)¸¤)±¤)ª¤)£¤)œ¤)•¤)ޤ)‡¤)€¤)y¤)r¤)k¤)d¤)]¤)V¤)O¤)H¤)A¤):¤)3¤),¤)%¤)¤)¤)¤) ¤)¤)û£)ô£)í£)æ£)ߣ)Ø£)Ñ£)Ê£)ã)¼£)µ£)®£)§£) £)™£)’£)‹£)„£)}£)v£)o£)h£)a£)Z£)S£)L£)E£)>£)7£)0£))£)"£)£)£) £)£)ÿ¢)ø¢)ñ¢)ê¢)ã¢)Ü¢)Õ¢)΢)Ç¢)À¢)¹¢)²¢)«¢)¤¢)¢)–¢)¢)ˆ¢)¢)z¢)s¢)l¢)e¢)^¢)W¢)P¢)I¢)B¢);¢)4¢)-¢)&¢)¢)¢)¢) ¢)¢)ü¡)õ¡)î¡)ç¡)à¡)Ù¡)Ò¡)Ë¡)Ä¡)½¡)¶¡)¯¡)¨¡)¡¡)š¡)“¡)Œ¡)…¡)~¡)w¡)p¡)i¡)b¡)[¡)T¡)M¡)F¡)?¡)8¡)1¡)*¡)#¡)¡)¡)¡)¡)¡)ù )ò )ë )ä )Ý )Ö )Ï )È )Á )º )³ )¬ )¥ )ž )— ) )‰ )‚ ){ )t )m )f )_ )X )Q )J )C )< )5 ). )' )  ) ) )  ) )ýŸ)öŸ)ïŸ)èŸ)áŸ)ÚŸ)ÓŸ)ÌŸ)ÅŸ)¾Ÿ)·Ÿ)°Ÿ)©Ÿ)¢Ÿ)›Ÿ)”Ÿ)Ÿ)†Ÿ)Ÿ)xŸ)qŸ)jŸ)cŸ)\Ÿ)UŸ)NŸ)GŸ)@Ÿ)9Ÿ)2Ÿ)+Ÿ)$Ÿ)Ÿ)Ÿ)Ÿ)Ÿ)Ÿ)úž)óž)ìž)åž)Þž)מ)О)Éž)ž)»ž)´ž)­ž)¦ž)Ÿž)˜ž)‘ž)Šž)ƒž)|ž)už)nž)gž)`ž)Yž)Rž)Kž)Dž)=ž)6ž)/ž)(ž)!ž)ž)ž) ž)ž)þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))ûœ)ôœ)íœ)æœ)ßœ)Øœ)Ñœ)Êœ)Ü)¼œ)µœ)®œ)§œ) œ)™œ)’œ)‹œ)„œ)}œ)vœ)oœ)hœ)aœ)Zœ)Sœ)Lœ)Eœ)>œ)7œ)0œ))œ)"œ)œ)œ) œ)œ)ÿ›)ø›)ñ›)ê›)ã›)Ü›)Õ›)Λ)Ç›)À›)¹›)²›)«›)¤›)›)–›)›)ˆ›)›)z›)s›)l›)e›)^›)W›)P›)I›)B›);›)4›)-›)&›)›)›)›) ›)›)üš)õš)îš)çš)àš)Ùš)Òš)Ëš)Äš)½š)¶š)¯š)¨š)¡š)šš)“š)Œš)…š)~š)wš)pš)iš)bš)[š)Tš)Mš)Fš)?š)8š)1š)*š)#š)š)š)š)š)š)ù™)ò™)ë™)ä™)Ý™)Ö™)Ï™)È™)Á™)º™)³™)¬™)¥™)ž™)—™)™)‰™)‚™){™)t™)m™)f™)_™)X™)Q™)J™)C™)<™)5™).™)'™) ™)™)™) ™)™)ý˜)ö˜)ï˜)è˜)á˜)Ú˜)Ó˜)̘)Ř)¾˜)·˜)°˜)©˜)¢˜)›˜)”˜)˜)†˜)˜)x˜)q˜)j˜)c˜)\˜)U˜)N˜)G˜)@˜)9˜)2˜)+˜)$˜)˜)˜)˜)˜)˜)ú—)ó—)ì—)å—)Þ—)×—)З)É—)—)»—)´—)­—)¦—)Ÿ—)˜—)‘—)Š—)ƒ—)|—)u—)n—)g—)`—)Y—)R—)K—)D—)=—)6—)/—)(—)!—)—)—) —)—)þ–)÷–)ð–)é–)â–)Û–)Ô–)Í–)Æ–)¿–)¸–)±–)ª–)£–)œ–)•–)Ž–)‡–)€–)y–)r–)k–)d–)]–)V–)O–)H–)A–):–)3–),–)%–)–)–)–) –)–)û•)ô•)í•)æ•)ß•)Ø•)Ñ•)Ê•)Õ)¼•)µ•)®•)§•) •)™•)’•)‹•)„•)}•)v•)o•)h•)a•)Z•)S•)L•)E•)>•)7•)0•))•)"•)•)•) •)•)ÿ”)ø”)ñ”)ê”)ã”)Ü”)Õ”)Δ)Ç”)À”)¹”)²”)«”)¤”)”)–”)”)ˆ”)”)z”)s”)l”)e”)^”)W”)P”)I”)B”);”)4”)-”)&”)”)”)”) ”)”)ü“)õ“)î“)ç“)à“)Ù“)Ò“)Ë“)Ä“)½“)¶“)¯“)¨“)¡“)š“)““)Œ“)…“)~“)w“)p“)i“)b“)[“)T“)M“)F“)?“)8“)1“)*“)#“)“)“)“)“)“)ù’)ò’)ë’)ä’)Ý’)Ö’)Ï’)È’)Á’)º’)³’)¬’)¥’)ž’)—’)’)‰’)‚’){’)t’)m’)f’)_’)X’)Q’)J’)C’)<’)5’).’)'’) ’)’)’) ’)’)ý‘)ö‘)ï‘)è‘)á‘)Ú‘)Ó‘)Ì‘)Å‘)¾‘)·‘)°‘)©‘)¢‘)›‘)”‘)‘)†‘)‘)x‘)q‘)j‘)c‘)\‘)U‘)N‘)G‘)@‘)9‘)2‘)+‘)$‘)‘)‘)‘)‘)‘)ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))ûŽ)ôŽ)íŽ)æŽ)ߎ)ØŽ)ÑŽ)ÊŽ)ÃŽ)¼Ž)µŽ)®Ž)§Ž) Ž)™Ž)’Ž)‹Ž)„Ž)}Ž)vŽ)oŽ)hŽ)aŽ)ZŽ)SŽ)LŽ)EŽ)>Ž)7Ž)0Ž))Ž)"Ž)Ž)Ž) Ž)Ž)ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))üŒ)õŒ)îŒ)çŒ)àŒ)ÙŒ)ÒŒ)ËŒ)ÄŒ)½Œ)¶Œ)¯Œ)¨Œ)¡Œ)šŒ)“Œ)ŒŒ)…Œ)~Œ)wŒ)pŒ)iŒ)bŒ)[Œ)TŒ)MŒ)FŒ)?Œ)8Œ)1Œ)*Œ)#Œ)Œ)Œ)Œ)Œ)Œ)ù‹)ò‹)ë‹)ä‹)Ý‹)Ö‹)Ï‹)È‹)Á‹)º‹)³‹)¬‹)¥‹)ž‹)—‹)‹)‰‹)‚‹){‹)t‹)m‹)f‹)_‹)X‹)Q‹)J‹)C‹)<‹)5‹).‹)'‹) ‹)‹)‹) ‹)‹)ýŠ)öŠ)ïŠ)èŠ)áŠ)ÚŠ)ÓŠ)ÌŠ)ÅŠ)¾Š)·Š)°Š)©Š)¢Š)›Š)”Š)Š)†Š)Š)xŠ)qŠ)jŠ)cŠ)\Š)UŠ)NŠ)GŠ)@Š)9Š)2Š)+Š)$Š)Š)Š)Š)Š)Š)ú‰)ó‰)ì‰)å‰)Þ‰)׉)Љ)ɉ)‰)»‰)´‰)­‰)¦‰)Ÿ‰)˜‰)‘‰)Љ)ƒ‰)|‰)u‰)n‰)g‰)`‰)Y‰)R‰)K‰)D‰)=‰)6‰)/‰)(‰)!‰)‰)‰) ‰)‰)þˆ)÷ˆ)ðˆ)éˆ)âˆ)Ûˆ)Ôˆ)͈)ƈ)¿ˆ)¸ˆ)±ˆ)ªˆ)£ˆ)œˆ)•ˆ)Žˆ)‡ˆ)€ˆ)yˆ)rˆ)kˆ)dˆ)]ˆ)Vˆ)Oˆ)Hˆ)Aˆ):ˆ)3ˆ),ˆ)%ˆ)ˆ)ˆ)ˆ) ˆ)ˆ)û‡)ô‡)í‡)æ‡)߇)؇)ч)ʇ)Ç)¼‡)µ‡)®‡)§‡) ‡)™‡)’‡)‹‡)„‡)}‡)v‡)o‡)h‡)a‡)Z‡)S‡)L‡)E‡)>‡)7‡)0‡))‡)"‡)‡)‡) ‡)‡)ÿ†)ø†)ñ†)ê†)ã†)܆)Õ†)Ά)dž)À†)¹†)²†)«†)¤†)†)–†)†)ˆ†)†)z†)s†)l†)e†)^†)W†)P†)I†)B†);†)4†)-†)&†)†)†)†) †)†)ü…)õ…)î…)ç…)à…)Ù…)Ò…)Ë…)Ä…)½…)¶…)¯…)¨…)¡…)š…)“…)Œ…)……)~…)w…)p…)i…)b…)[…)T…)M…)F…)?…)8…)1…)*…)#…)…)…)…)…)…)ù„)ò„)ë„)ä„)Ý„)Ö„)Ï„)È„)Á„)º„)³„)¬„)¥„)ž„)—„)„)‰„)‚„){„)t„)m„)f„)_„)X„)Q„)J„)C„)<„)5„).„)'„) „)„)„) „)„)ýƒ)öƒ)ïƒ)èƒ)áƒ)Úƒ)Óƒ)̃)Ń)¾ƒ)·ƒ)°ƒ)©ƒ)¢ƒ)›ƒ)”ƒ)ƒ)†ƒ)ƒ)xƒ)qƒ)jƒ)cƒ)\ƒ)Uƒ)Nƒ)Gƒ)@ƒ)9ƒ)2ƒ)+ƒ)$ƒ)ƒ)ƒ)ƒ)ƒ)ƒ)ú‚)ó‚)ì‚)å‚)Þ‚)ׂ)Ђ)É‚)‚)»‚)´‚)­‚)¦‚)Ÿ‚)˜‚)‘‚)Š‚)ƒ‚)|‚)u‚)n‚)g‚)`‚)Y‚)R‚)K‚)D‚)=‚)6‚)/‚)(‚)!‚)‚)‚) ‚)‚)þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û€)ô€)í€)æ€)߀)Ø€)Ñ€)Ê€)À)¼€)µ€)®€)§€) €)™€)’€)‹€)„€)}€)v€)o€)h€)a€)Z€)S€)L€)E€)>€)7€)0€))€)"€)€)€) €)€)ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü~)õ~)î~)ç~)à~)Ù~)Ò~)Ë~)Ä~)½~)¶~)¯~)¨~)¡~)š~)“~)Œ~)…~)~~)w~)p~)i~)b~)[~)T~)M~)F~)?~)8~)1~)*~)#~)~)~)~)~)~)ù})ò})ë})ä})Ý})Ö})Ï})È})Á})º})³})¬})¥})ž})—})})‰})‚}){})t})m})f})_})X})Q})J})C})<})5}).})'}) })})}) })})ý|)ö|)ï|)è|)á|)Ú|)Ó|)Ì|)Å|)¾|)·|)°|)©|)¢|)›|)”|)|)†|)|)x|)q|)j|)c|)\|)U|)N|)G|)@|)9|)2|)+|)$|)|)|)|)|)|)ú{)ó{)ì{)å{)Þ{)×{)Ð{)É{)Â{)»{)´{)­{)¦{)Ÿ{)˜{)‘{)Š{)ƒ{)|{)u{)n{)g{)`{)Y{)R{)K{)D{)={)6{)/{)({)!{){){) {){)þz)÷z)ðz)éz)âz)Ûz)Ôz)Íz)Æz)¿z)¸z)±z)ªz)£z)œz)•z)Žz)‡z)€z)yz)rz)kz)dz)]z)Vz)Oz)Hz)Az):z)3z),z)%z)z)z)z) z)z)ûy)ôy)íy)æy)ßy)Øy)Ñy)Êy)Ãy)¼y)µy)®y)§y) y)™y)’y)‹y)„y)}y)vy)oy)hy)ay)Zy)Sy)Ly)Ey)>y)7y)0y))y)"y)y)y) y)y)ÿx)øx)ñx)êx)ãx)Üx)Õx)Îx)Çx)Àx)¹x)²x)«x)¤x)x)–x)x)ˆx)x)zx)sx)lx)ex)^x)Wx)Px)Ix)Bx);x)4x)-x)&x)x)x)x) x)x)üw)õw)îw)çw)àw)Ùw)Òw)Ëw)Äw)½w)¶w)¯w)¨w)¡w)šw)“w)Œw)…w)~w)ww)pw)iw)bw)[w)Tw)Mw)Fw)?w)8w)1w)*w)#w)w)w)w)w)w)ùv)òv)ëv)äv)Ýv)Öv)Ïv)Èv)Áv)ºv)³v)¬v)¥v)žv)—v)v)‰v)‚v){v)tv)mv)fv)_v)Xv)Qv)Jv)Cv)r)7r)0r))r)"r)r)r) r)r)ÿq)øq)ñq)êq)ãq)Üq)Õq)Îq)Çq)Àq)¹q)²q)«q)¤q)q)–q)q)ˆq)q)zq)sq)lq)eq)^q)Wq)Pq)Iq)Bq);q)4q)-q)&q)q)q)q) q)q)üp)õp)îp)çp)àp)Ùp)Òp)Ëp)Äp)½p)¶p)¯p)¨p)¡p)šp)“p)Œp)…p)~p)wp)pp)ip)bp)[p)Tp)Mp)Fp)?p)8p)1p)*p)#p)p)p)p)p)p)ùo)òo)ëo)äo)Ýo)Öo)Ïo)Èo)Áo)ºo)³o)¬o)¥o)žo)—o)o)‰o)‚o){o)to)mo)fo)_o)Xo)Qo)Jo)Co)k)7k)0k))k)"k)k)k) k)k)ÿj)øj)ñj)êj)ãj)Üj)Õj)Îj)Çj)Àj)¹j)²j)«j)¤j)j)–j)j)ˆj)j)zj)sj)lj)ej)^j)Wj)Pj)Ij)Bj);j)4j)-j)&j)j)j)j) j)j)üi)õi)îi)çi)ài)Ùi)Òi)Ëi)Äi)½i)¶i)¯i)¨i)¡i)ši)“i)Œi)…i)~i)wi)pi)ii)bi)[i)Ti)Mi)Fi)?i)8i)1i)*i)#i)i)i)i)i)i)ùh)òh)ëh)äh)Ýh)Öh)Ïh)Èh)Áh)ºh)³h)¬h)¥h)žh)—h)h)‰h)‚h){h)th)mh)fh)_h)Xh)Qh)Jh)Ch)d)7d)0d))d)"d)d)d) d)d)ÿc)øc)ñc)êc)ãc)Üc)Õc)Îc)Çc)Àc)¹c)²c)«c)¤c)c)–c)c)ˆc)c)zc)sc)lc)ec)^c)Wc)Pc)Ic)Bc);c)4c)-c)&c)c)c)c) c)c)üb)õb)îb)çb)àb)Ùb)Òb)Ëb)Äb)½b)¶b)¯b)¨b)¡b)šb)“b)Œb)…b)~b)wb)pb)ib)bb)[b)Tb)Mb)Fb)?b)8b)1b)*b)#b)b)b)b)b)b)ùa)òa)ëa)äa)Ýa)Öa)Ïa)Èa)Áa)ºa)³a)¬a)¥a)ža)—a)a)‰a)‚a){a)ta)ma)fa)_a)Xa)Qa)Ja)Ca)])7])0]))])"])])]) ])])ÿ\)ø\)ñ\)ê\)ã\)Ü\)Õ\)Î\)Ç\)À\)¹\)²\)«\)¤\)\)–\)\)ˆ\)\)z\)s\)l\)e\)^\)W\)P\)I\)B\);\)4\)-\)&\)\)\)\) \)\)ü[)õ[)î[)ç[)à[)Ù[)Ò[)Ë[)Ä[)½[)¶[)¯[)¨[)¡[)š[)“[)Œ[)…[)~[)w[)p[)i[)b[)[[)T[)M[)F[)?[)8[)1[)*[)#[)[)[)[)[)[)ùZ)òZ)ëZ)äZ)ÝZ)ÖZ)ÏZ)ÈZ)ÁZ)ºZ)³Z)¬Z)¥Z)žZ)—Z)Z)‰Z)‚Z){Z)tZ)mZ)fZ)_Z)XZ)QZ)JZ)CZ)V)7V)0V))V)"V)V)V) V)V)ÿU)øU)ñU)êU)ãU)ÜU)ÕU)ÎU)ÇU)ÀU)¹U)²U)«U)¤U)U)–U)U)ˆU)U)zU)sU)lU)eU)^U)WU)PU)IU)BU);U)4U)-U)&U)U)U)U) U)U)üT)õT)îT)çT)àT)ÙT)ÒT)ËT)ÄT)½T)¶T)¯T)¨T)¡T)šT)“T)ŒT)…T)~T)wT)pT)iT)bT)[T)TT)MT)FT)?T)8T)1T)*T)#T)T)T)T)T)T)ùS)òS)ëS)äS)ÝS)ÖS)ÏS)ÈS)ÁS)ºS)³S)¬S)¥S)žS)—S)S)‰S)‚S){S)tS)mS)fS)_S)XS)QS)JS)CS)O)7O)0O))O)"O)O)O) O)O)ÿN)øN)ñN)êN)ãN)ÜN)ÕN)ÎN)ÇN)ÀN)¹N)²N)«N)¤N)N)–N)N)ˆN)N)zN)sN)lN)eN)^N)WN)PN)IN)BN);N)4N)-N)&N)N)N)N) N)N)üM)õM)îM)çM)àM)ÙM)ÒM)ËM)ÄM)½M)¶M)¯M)¨M)¡M)šM)“M)ŒM)…M)~M)wM)pM)iM)bM)[M)TM)MM)FM)?M)8M)1M)*M)#M)M)M)M)M)M)ùL)òL)ëL)äL)ÝL)ÖL)ÏL)ÈL)ÁL)ºL)³L)¬L)¥L)žL)—L)L)‰L)‚L){L)tL)mL)fL)_L)XL)QL)JL)CL)H)7H)0H))H)"H)H)H) H)H)ÿG)øG)ñG)êG)ãG)ÜG)ÕG)ÎG)ÇG)ÀG)¹G)²G)«G)¤G)G)–G)G)ˆG)G)zG)sG)lG)eG)^G)WG)PG)IG)BG);G)4G)-G)&G)G)G)G) G)G)üF)õF)îF)çF)àF)ÙF)ÒF)ËF)ÄF)½F)¶F)¯F)¨F)¡F)šF)“F)ŒF)…F)~F)wF)pF)iF)bF)[F)TF)MF)FF)?F)8F)1F)*F)#F)F)F)F)F)F)ùE)òE)ëE)äE)ÝE)ÖE)ÏE)ÈE)ÁE)ºE)³E)¬E)¥E)žE)—E)E)‰E)‚E){E)tE)mE)fE)_E)XE)QE)JE)CE)A)7A)0A))A)"A)A)A) A)A)ÿ@)ø@)ñ@)ê@)ã@)Ü@)Õ@)Î@)Ç@)À@)¹@)²@)«@)¤@)@)–@)@)ˆ@)@)z@)s@)l@)e@)^@)W@)P@)I@)B@);@)4@)-@)&@)@)@)@) @)@)ü?)õ?)î?)ç?)à?)Ù?)Ò?)Ë?)Ä?)½?)¶?)¯?)¨?)¡?)š?)“?)Œ?)…?)~?)w?)p?)i?)b?)[?)T?)M?)F?)??)8?)1?)*?)#?)?)?)?)?)?)ù>)ò>)ë>)ä>)Ý>)Ö>)Ï>)È>)Á>)º>)³>)¬>)¥>)ž>)—>)>)‰>)‚>){>)t>)m>)f>)_>)X>)Q>)J>)C>)<>)5>).>)'>) >)>)>) >)>)ý=)ö=)ï=)è=)á=)Ú=)Ó=)Ì=)Å=)¾=)·=)°=)©=)¢=)›=)”=)=)†=)=)x=)q=)j=)c=)\=)U=)N=)G=)@=)9=)2=)+=)$=)=)=)=)=)=)ú<)ó<)ì<)å<)Þ<)×<)Ð<)É<)Â<)»<)´<)­<)¦<)Ÿ<)˜<)‘<)Š<)ƒ<)|<)u<)n<)g<)`<)Y<)R<)K<)D<)=<)6<)/<)(<)!<)<)<) <)<)þ;)÷;)ð;)é;)â;)Û;)Ô;)Í;)Æ;)¿;)¸;)±;)ª;)£;)œ;)•;)Ž;)‡;)€;)y;)r;)k;)d;)];)V;)O;)H;)A;):;)3;),;)%;);););) ;);)û:)ô:)í:)æ:)ß:)Ø:)Ñ:)Ê:)Ã:)¼:)µ:)®:)§:) :)™:)’:)‹:)„:)}:)v:)o:)h:)a:)Z:)S:)L:)E:)>:)7:)0:)):)":):):) :):)ÿ9)ø9)ñ9)ê9)ã9)Ü9)Õ9)Î9)Ç9)À9)¹9)²9)«9)¤9)9)–9)9)ˆ9)9)z9)s9)l9)e9)^9)W9)P9)I9)B9);9)49)-9)&9)9)9)9) 9)9)ü8)õ8)î8)ç8)à8)Ù8)Ò8)Ë8)Ä8)½8)¶8)¯8)¨8)¡8)š8)“8)Œ8)…8)~8)w8)p8)i8)b8)[8)T8)M8)F8)?8)88)18)*8)#8)8)8)8)8)8)ù7)ò7)ë7)ä7)Ý7)Ö7)Ï7)È7)Á7)º7)³7)¬7)¥7)ž7)—7)7)‰7)‚7){7)t7)m7)f7)_7)X7)Q7)J7)C7)<7)57).7)'7) 7)7)7) 7)7)ý6)ö6)ï6)è6)á6)Ú6)Ó6)Ì6)Å6)¾6)·6)°6)©6)¢6)›6)”6)6)†6)6)x6)q6)j6)c6)\6)U6)N6)G6)@6)96)26)+6)$6)6)6)6)6)6)ú5)ó5)ì5)å5)Þ5)×5)Ð5)É5)Â5)»5)´5)­5)¦5)Ÿ5)˜5)‘5)Š5)ƒ5)|5)u5)n5)g5)`5)Y5)R5)K5)D5)=5)65)/5)(5)!5)5)5) 5)5)þ4)÷4)ð4)é4)â4)Û4)Ô4)Í4)Æ4)¿4)¸4)±4)ª4)£4)œ4)•4)Ž4)‡4)€4)y4)r4)k4)d4)]4)V4)O4)H4)A4):4)34),4)%4)4)4)4) 4)4)û3)ô3)í3)æ3)ß3)Ø3)Ñ3)Ê3)Ã3)¼3)µ3)®3)§3) 3)™3)’3)‹3)„3)}3)v3)o3)h3)a3)Z3)S3)L3)E3)>3)73)03))3)"3)3)3) 3)3)ÿ2)ø2)ñ2)ê2)ã2)Ü2)Õ2)Î2)Ç2)À2)¹2)²2)«2)¤2)2)–2)2)ˆ2)2)z2)s2)l2)e2)^2)W2)P2)I2)B2);2)42)-2)&2)2)2)2) 2)2)ü1)õ1)î1)ç1)à1)Ù1)Ò1)Ë1)Ä1)½1)¶1)¯1)¨1)¡1)š1)“1)Œ1)…1)~1)w1)p1)i1)b1)[1)T1)M1)F1)?1)81)11)*1)#1)1)1)1)1)1)ù0)ò0)ë0)ä0)Ý0)Ö0)Ï0)È0)Á0)º0)³0)¬0)¥0)ž0)—0)0)‰0)‚0){0)t0)m0)f0)_0)X0)Q0)J0)C0)<0)50).0)'0) 0)0)0) 0)0)ý/)ö/)ï/)è/)á/)Ú/)Ó/)Ì/)Å/)¾/)·/)°/)©/)¢/)›/)”/)/)†/)/)x/)q/)j/)c/)\/)U/)N/)G/)@/)9/)2/)+/)$/)/)/)/)/)/)ú.)ó.)ì.)å.)Þ.)×.)Ð.)É.)Â.)».)´.)­.)¦.)Ÿ.)˜.)‘.)Š.)ƒ.)|.)u.)n.)g.)`.)Y.)R.)K.)D.)=.)6.)/.)(.)!.).).) .).)þ-)÷-)ð-)é-)â-)Û-)Ô-)Í-)Æ-)¿-)¸-)±-)ª-)£-)œ-)•-)Ž-)‡-)€-)y-)r-)k-)d-)]-)V-)O-)H-)A-):-)3-),-)%-)-)-)-) -)-)û,)ô,)í,)æ,)ß,)Ø,)Ñ,)Ê,)Ã,)¼,)µ,)®,)§,) ,)™,)’,)‹,)„,)},)v,)o,)h,)a,)Z,)S,)L,)E,)>,)7,)0,)),)",),),) ,),)ÿ+)ø+)ñ+)ê+)ã+)Ü+)Õ+)Î+)Ç+)À+)¹+)²+)«+)¤+)+)–+)+)ˆ+)+)z+)s+)l+)e+)^+)W+)P+)I+)B+);+)4+)-+)&+)+)+)+) +)+)ü*)õ*)î*)ç*)à*)Ù*)Ò*)Ë*)Ä*)½*)¶*)¯*)¨*)¡*)š*)“*)Œ*)…*)~*)w*)p*)i*)b*)[*)T*)M*)F*)?*)8*)1*)**)#*)*)*)*)*)*)ù))ò))ë))ä))Ý))Ö))Ï))È))Á))º))³))¬))¥))ž))—))))‰))‚)){))t))m))f))_))X))Q))J))C))<))5)).))')) )))))) ))))ý()ö()ï()è()á()Ú()Ó()Ì()Å()¾()·()°()©()¢()›()”()()†()()x()q()j()c()\()U()N()G()@()9()2()+()$()()()()()()ú')ó')ì')å')Þ')×')Ð')É')Â')»')´')­')¦')Ÿ')˜')‘')Š')ƒ')|')u')n')g')`')Y')R')K')D')=')6')/')(')!')')') ')')þ&)÷&)ð&)é&)â&)Û&)Ô&)Í&)Æ&)¿&)¸&)±&)ª&)£&)œ&)•&)Ž&)‡&)€&)y&)r&)k&)d&)]&)V&)O&)H&)A&):&)3&),&)%&)&)&)&) &)&)û%)ô%)í%)æ%)ß%)Ø%)Ñ%)Ê%)Ã%)¼%)µ%)®%)§%) %)™%)’%)‹%)„%)}%)v%)o%)h%)a%)Z%)S%)L%)E%)>%)7%)0%))%)"%)%)%) %)%)ÿ$)ø$)ñ$)ê$)ã$)Ü$)Õ$)Î$)Ç$)À$)¹$)²$)«$)¤$)$)–$)$)ˆ$)$)z$)s$)l$)e$)^$)W$)P$)I$)B$);$)4$)-$)&$)$)$)$) $)$)ü#)õ#)î#)ç#)à#)Ù#)Ò#)Ë#)Ä#)½#)¶#)¯#)¨#)¡#)š#)“#)Œ#)…#)~#)w#)p#)i#)b#)[#)T#)M#)F#)?#)8#)1#)*#)##)#)#)#)#)#)ù")ò")ë")ä")Ý")Ö")Ï")È")Á")º")³")¬")¥")ž")—")")‰")‚"){")t")m")f")_")X")Q")J")C")<")5").")'") ")")") ")")ý!)ö!)ï!)è!)á!)Ú!)Ó!)Ì!)Å!)¾!)·!)°!)©!)¢!)›!)”!)!)†!)!)x!)q!)j!)c!)\!)U!)N!)G!)@!)9!)2!)+!)$!)!)!)!)!)!)ú )ó )ì )å )Þ )× )Ð )É ) )» )´ )­ )¦ )Ÿ )˜ )‘ )Š )ƒ )| )u )n )g )` )Y )R )K )D )= )6 )/ )( )! ) ) ) ) )þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù )ò )ë )ä )Ý )Ö )Ï )È )Á )º )³ )¬ )¥ )ž )— ) )‰ )‚ ){ )t )m )f )_ )X )Q )J )C )< )5 ). )' ) ) ) ) ) )ý )ö )ï )è )á )Ú )Ó )Ì )Å )¾ )· )° )© )¢ )› )” ) )† ) )x )q )j )c )\ )U )N )G )@ )9 )2 )+ )$ ) ) ) ) ) )ú )ó )ì )å )Þ )× )Ð )É ) )» )´ )­ )¦ )Ÿ )˜ )‘ )Š )ƒ )| )u )n )g )` )Y )R )K )D )= )6 )/ )( )! ) ) ) ) )þ )÷ )ð )é )â )Û )Ô )Í )Æ )¿ )¸ )± )ª )£ )œ )• )Ž )‡ )€ )y )r )k )d )] )V )O )H )A ): )3 ), )% ) ) ) ) ) )û )ô )í )æ )ß )Ø )Ñ )Ê )à )¼ )µ )® )§ )  )™ )’ )‹ )„ )} )v )o )h )a )Z )S )L )E )> )7 )0 )) )" ) ) ) ) )ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ùÿ(òÿ(ëÿ(äÿ(Ýÿ(Öÿ(Ïÿ(Èÿ(Áÿ(ºÿ(³ÿ(¬ÿ(¥ÿ(žÿ(—ÿ(ÿ(‰ÿ(‚ÿ({ÿ(tÿ(mÿ(fÿ(_ÿ(Xÿ(Qÿ(Jÿ(Cÿ(<ÿ(5ÿ(.ÿ('ÿ( ÿ(ÿ(ÿ( ÿ(ÿ(ýþ(öþ(ïþ(èþ(áþ(Úþ(Óþ(Ìþ(Åþ(¾þ(·þ(°þ(©þ(¢þ(›þ(”þ(þ(†þ(þ(xþ(qþ(jþ(cþ(\þ(Uþ(Nþ(Gþ(@þ(9þ(2þ(+þ($þ(þ(þ(þ(þ(þ(úý(óý(ìý(åý(Þý(×ý(Ðý(Éý(Âý(»ý(´ý(­ý(¦ý(Ÿý(˜ý(‘ý(Šý(ƒý(|ý(uý(ný(gý(`ý(Yý(Rý(Ký(Dý(=ý(6ý(/ý((ý(!ý(ý(ý( ý(ý(þü(÷ü(ðü(éü(âü(Ûü(Ôü(Íü(Æü(¿ü(¸ü(±ü(ªü(£ü(œü(•ü(Žü(‡ü(€ü(yü(rü(kü(dü(]ü(Vü(Oü(Hü(Aü(:ü(3ü(,ü(%ü(ü(ü(ü( ü(ü(ûû(ôû(íû(æû(ßû(Øû(Ñû(Êû(Ãû(¼û(µû(®û(§û( û(™û(’û(‹û(„û(}û(vû(oû(hû(aû(Zû(Sû(Lû(Eû(>û(7û(0û()û("û(û(û( û(û(ÿú(øú(ñú(êú(ãú(Üú(Õú(Îú(Çú(Àú(¹ú(²ú(«ú(¤ú(ú(–ú(ú(ˆú(ú(zú(sú(lú(eú(^ú(Wú(Pú(Iú(Bú(;ú(4ú(-ú(&ú(ú(ú(ú( ú(ú(üù(õù(îù(çù(àù(Ùù(Òù(Ëù(Äù(½ù(¶ù(¯ù(¨ù(¡ù(šù(“ù(Œù(…ù(~ù(wù(pù(iù(bù([ù(Tù(Mù(Fù(?ù(8ù(1ù(*ù(#ù(ù(ù(ù(ù(ù(ùø(òø(ëø(äø(Ýø(Öø(Ïø(Èø(Áø(ºø(³ø(¬ø(¥ø(žø(—ø(ø(‰ø(‚ø({ø(tø(mø(fø(_ø(Xø(Qø(Jø(Cø(<ø(5ø(.ø('ø( ø(ø(ø( ø(ø(ý÷(ö÷(ï÷(è÷(á÷(Ú÷(Ó÷(Ì÷(Å÷(¾÷(·÷(°÷(©÷(¢÷(›÷(”÷(÷(†÷(÷(x÷(q÷(j÷(c÷(\÷(U÷(N÷(G÷(@÷(9÷(2÷(+÷($÷(÷(÷(÷(÷(÷(úö(óö(ìö(åö(Þö(×ö(Ðö(Éö(Âö(»ö(´ö(­ö(¦ö(Ÿö(˜ö(‘ö(Šö(ƒö(|ö(uö(nö(gö(`ö(Yö(Rö(Kö(Dö(=ö(6ö(/ö((ö(!ö(ö(ö( ö(ö(þõ(÷õ(ðõ(éõ(âõ(Ûõ(Ôõ(Íõ(Æõ(¿õ(¸õ(±õ(ªõ(£õ(œõ(•õ(Žõ(‡õ(€õ(yõ(rõ(kõ(dõ(]õ(Võ(Oõ(Hõ(Aõ(:õ(3õ(,õ(%õ(õ(õ(õ( õ(õ(ûô(ôô(íô(æô(ßô(Øô(Ñô(Êô(Ãô(¼ô(µô(®ô(§ô( ô(™ô(’ô(‹ô(„ô(}ô(vô(oô(hô(aô(Zô(Sô(Lô(Eô(>ô(7ô(0ô()ô("ô(ô(ô( ô(ô(ÿó(øó(ñó(êó(ãó(Üó(Õó(Îó(Çó(Àó(¹ó(²ó(«ó(¤ó(ó(–ó(ó(ˆó(ó(zó(só(ló(eó(^ó(Wó(Pó(Ió(Bó(;ó(4ó(-ó(&ó(ó(ó(ó( ó(ó(üò(õò(îò(çò(àò(Ùò(Òò(Ëò(Äò(½ò(¶ò(¯ò(¨ò(¡ò(šò(“ò(Œò(…ò(~ò(wò(pò(iò(bò([ò(Tò(Mò(Fò(?ò(8ò(1ò(*ò(#ò(ò(ò(ò(ò(ò(ùñ(òñ(ëñ(äñ(Ýñ(Öñ(Ïñ(Èñ(Áñ(ºñ(³ñ(¬ñ(¥ñ(žñ(—ñ(ñ(‰ñ(‚ñ({ñ(tñ(mñ(fñ(_ñ(Xñ(Qñ(Jñ(Cñ(<ñ(5ñ(.ñ('ñ( ñ(ñ(ñ( ñ(ñ(ýð(öð(ïð(èð(áð(Úð(Óð(Ìð(Åð(¾ð(·ð(°ð(©ð(¢ð(›ð(”ð(ð(†ð(ð(xð(qð(jð(cð(\ð(Uð(Nð(Gð(@ð(9ð(2ð(+ð($ð(ð(ð(ð(ð(ð(úï(óï(ìï(åï(Þï(×ï(Ðï(Éï(Âï(»ï(´ï(­ï(¦ï(Ÿï(˜ï(‘ï(Šï(ƒï(|ï(uï(nï(gï(`ï(Yï(Rï(Kï(Dï(=ï(6ï(/ï((ï(!ï(ï(ï( ï(ï(þî(÷î(ðî(éî(âî(Ûî(Ôî(Íî(Æî(¿î(¸î(±î(ªî(£î(œî(•î(Žî(‡î(€î(yî(rî(kî(dî(]î(Vî(Oî(Hî(Aî(:î(3î(,î(%î(î(î(î( î(î(ûí(ôí(íí(æí(ßí(Øí(Ñí(Êí(Ãí(¼í(µí(®í(§í( í(™í(’í(‹í(„í(}í(ví(oí(hí(aí(Zí(Sí(Lí(Eí(>í(7í(0í()í("í(í(í( í(í(ÿì(øì(ñì(êì(ãì(Üì(Õì(Îì(Çì(Àì(¹ì(²ì(«ì(¤ì(ì(–ì(ì(ˆì(ì(zì(sì(lì(eì(^ì(Wì(Pì(Iì(Bì(;ì(4ì(-ì(&ì(ì(ì(ì( ì(ì(üë(õë(îë(çë(àë(Ùë(Òë(Ëë(Äë(½ë(¶ë(¯ë(¨ë(¡ë(šë(“ë(Œë(…ë(~ë(wë(pë(ië(bë([ë(Të(Më(Fë(?ë(8ë(1ë(*ë(#ë(ë(ë(ë(ë(ë(ùê(òê(ëê(äê(Ýê(Öê(Ïê(Èê(Áê(ºê(³ê(¬ê(¥ê(žê(—ê(ê(‰ê(‚ê({ê(tê(mê(fê(_ê(Xê(Qê(Jê(Cê(<ê(5ê(.ê('ê( ê(ê(ê( ê(ê(ýé(öé(ïé(èé(áé(Úé(Óé(Ìé(Åé(¾é(·é(°é(©é(¢é(›é(”é(é(†é(é(xé(qé(jé(cé(\é(Ué(Né(Gé(@é(9é(2é(+é($é(é(é(é(é(é(úè(óè(ìè(åè(Þè(×è(Ðè(Éè(Âè(»è(´è(­è(¦è(Ÿè(˜è(‘è(Šè(ƒè(|è(uè(nè(gè(`è(Yè(Rè(Kè(Dè(=è(6è(/è((è(!è(è(è( è(è(þç(÷ç(ðç(éç(âç(Ûç(Ôç(Íç(Æç(¿ç(¸ç(±ç(ªç(£ç(œç(•ç(Žç(‡ç(€ç(yç(rç(kç(dç(]ç(Vç(Oç(Hç(Aç(:ç(3ç(,ç(%ç(ç(ç(ç( ç(ç(ûæ(ôæ(íæ(ææ(ßæ(Øæ(Ñæ(Êæ(Ãæ(¼æ(µæ(®æ(§æ( æ(™æ(’æ(‹æ(„æ(}æ(væ(oæ(hæ(aæ(Zæ(Sæ(Læ(Eæ(>æ(7æ(0æ()æ("æ(æ(æ( æ(æ(ÿå(øå(ñå(êå(ãå(Üå(Õå(Îå(Çå(Àå(¹å(²å(«å(¤å(å(–å(å(ˆå(å(zå(så(lå(eå(^å(Wå(På(Iå(Bå(;å(4å(-å(&å(å(å(å( å(å(üä(õä(îä(çä(àä(Ùä(Òä(Ëä(Ää(½ä(¶ä(¯ä(¨ä(¡ä(šä(“ä(Œä(…ä(~ä(wä(pä(iä(bä([ä(Tä(Mä(Fä(?ä(8ä(1ä(*ä(#ä(ä(ä(ä(ä(ä(ùã(òã(ëã(äã(Ýã(Öã(Ïã(Èã(Áã(ºã(³ã(¬ã(¥ã(žã(—ã(ã(‰ã(‚ã({ã(tã(mã(fã(_ã(Xã(Qã(Jã(Cã(<ã(5ã(.ã('ã( ã(ã(ã( ã(ã(ýâ(öâ(ïâ(èâ(áâ(Úâ(Óâ(Ìâ(Åâ(¾â(·â(°â(©â(¢â(›â(”â(â(†â(â(xâ(qâ(jâ(câ(\â(Uâ(Nâ(Gâ(@â(9â(2â(+â($â(â(â(â(â(â(úá(óá(ìá(åá(Þá(×á(Ðá(Éá(Âá(»á(´á(­á(¦á(Ÿá(˜á(‘á(Šá(ƒá(|á(uá(ná(gá(`á(Yá(Rá(Ká(Dá(=á(6á(/á((á(!á(á(á( á(á(þà(÷à(ðà(éà(âà(Ûà(Ôà(Íà(Æà(¿à(¸à(±à(ªà(£à(œà(•à(Žà(‡à(€à(yà(rà(kà(dà(]à(Và(Oà(Hà(Aà(:à(3à(,à(%à(à(à(à( à(à(ûß(ôß(íß(æß(ßß(Øß(Ñß(Êß(Ãß(¼ß(µß(®ß(§ß( ß(™ß(’ß(‹ß(„ß(}ß(vß(oß(hß(aß(Zß(Sß(Lß(Eß(>ß(7ß(0ß()ß("ß(ß(ß( ß(ß(ÿÞ(øÞ(ñÞ(êÞ(ãÞ(ÜÞ(ÕÞ(ÎÞ(ÇÞ(ÀÞ(¹Þ(²Þ(«Þ(¤Þ(Þ(–Þ(Þ(ˆÞ(Þ(zÞ(sÞ(lÞ(eÞ(^Þ(WÞ(PÞ(IÞ(BÞ(;Þ(4Þ(-Þ(&Þ(Þ(Þ(Þ( Þ(Þ(üÝ(õÝ(îÝ(çÝ(àÝ(ÙÝ(ÒÝ(ËÝ(ÄÝ(½Ý(¶Ý(¯Ý(¨Ý(¡Ý(šÝ(“Ý(ŒÝ(…Ý(~Ý(wÝ(pÝ(iÝ(bÝ([Ý(TÝ(MÝ(FÝ(?Ý(8Ý(1Ý(*Ý(#Ý(Ý(Ý(Ý(Ý(Ý(ùÜ(òÜ(ëÜ(äÜ(ÝÜ(ÖÜ(ÏÜ(ÈÜ(ÁÜ(ºÜ(³Ü(¬Ü(¥Ü(žÜ(—Ü(Ü(‰Ü(‚Ü({Ü(tÜ(mÜ(fÜ(_Ü(XÜ(QÜ(JÜ(CÜ(<Ü(5Ü(.Ü('Ü( Ü(Ü(Ü( Ü(Ü(ýÛ(öÛ(ïÛ(èÛ(áÛ(ÚÛ(ÓÛ(ÌÛ(ÅÛ(¾Û(·Û(°Û(©Û(¢Û(›Û(”Û(Û(†Û(Û(xÛ(qÛ(jÛ(cÛ(\Û(UÛ(NÛ(GÛ(@Û(9Û(2Û(+Û($Û(Û(Û(Û(Û(Û(úÚ(óÚ(ìÚ(åÚ(ÞÚ(×Ú(ÐÚ(ÉÚ(ÂÚ(»Ú(´Ú(­Ú(¦Ú(ŸÚ(˜Ú(‘Ú(ŠÚ(ƒÚ(|Ú(uÚ(nÚ(gÚ(`Ú(YÚ(RÚ(KÚ(DÚ(=Ú(6Ú(/Ú((Ú(!Ú(Ú(Ú( Ú(Ú(þÙ(÷Ù(ðÙ(éÙ(âÙ(ÛÙ(ÔÙ(ÍÙ(ÆÙ(¿Ù(¸Ù(±Ù(ªÙ(£Ù(œÙ(•Ù(ŽÙ(‡Ù(€Ù(yÙ(rÙ(kÙ(dÙ(]Ù(VÙ(OÙ(HÙ(AÙ(:Ù(3Ù(,Ù(%Ù(Ù(Ù(Ù( Ù(Ù(ûØ(ôØ(íØ(æØ(ߨ(ØØ(ÑØ(ÊØ(ÃØ(¼Ø(µØ(®Ø(§Ø( Ø(™Ø(’Ø(‹Ø(„Ø(}Ø(vØ(oØ(hØ(aØ(ZØ(SØ(LØ(EØ(>Ø(7Ø(0Ø()Ø("Ø(Ø(Ø( Ø(Ø(ÿ×(ø×(ñ×(ê×(ã×(Ü×(Õ×(Î×(Ç×(À×(¹×(²×(«×(¤×(×(–×(×(ˆ×(×(z×(s×(l×(e×(^×(W×(P×(I×(B×(;×(4×(-×(&×(×(×(×( ×(×(üÖ(õÖ(îÖ(çÖ(àÖ(ÙÖ(ÒÖ(ËÖ(ÄÖ(½Ö(¶Ö(¯Ö(¨Ö(¡Ö(šÖ(“Ö(ŒÖ(…Ö(~Ö(wÖ(pÖ(iÖ(bÖ([Ö(TÖ(MÖ(FÖ(?Ö(8Ö(1Ö(*Ö(#Ö(Ö(Ö(Ö(Ö(Ö(ùÕ(òÕ(ëÕ(äÕ(ÝÕ(ÖÕ(ÏÕ(ÈÕ(ÁÕ(ºÕ(³Õ(¬Õ(¥Õ(žÕ(—Õ(Õ(‰Õ(‚Õ({Õ(tÕ(mÕ(fÕ(_Õ(XÕ(QÕ(JÕ(CÕ(<Õ(5Õ(.Õ('Õ( Õ(Õ(Õ( Õ(Õ(ýÔ(öÔ(ïÔ(èÔ(áÔ(ÚÔ(ÓÔ(ÌÔ(ÅÔ(¾Ô(·Ô(°Ô(©Ô(¢Ô(›Ô(”Ô(Ô(†Ô(Ô(xÔ(qÔ(jÔ(cÔ(\Ô(UÔ(NÔ(GÔ(@Ô(9Ô(2Ô(+Ô($Ô(Ô(Ô(Ô(Ô(Ô(úÓ(óÓ(ìÓ(åÓ(ÞÓ(×Ó(ÐÓ(ÉÓ(ÂÓ(»Ó(´Ó(­Ó(¦Ó(ŸÓ(˜Ó(‘Ó(ŠÓ(ƒÓ(|Ó(uÓ(nÓ(gÓ(`Ó(YÓ(RÓ(KÓ(DÓ(=Ó(6Ó(/Ó((Ó(!Ó(Ó(Ó( Ó(Ó(þÒ(÷Ò(ðÒ(éÒ(âÒ(ÛÒ(ÔÒ(ÍÒ(ÆÒ(¿Ò(¸Ò(±Ò(ªÒ(£Ò(œÒ(•Ò(ŽÒ(‡Ò(€Ò(yÒ(rÒ(kÒ(dÒ(]Ò(VÒ(OÒ(HÒ(AÒ(:Ò(3Ò(,Ò(%Ò(Ò(Ò(Ò( Ò(Ò(ûÑ(ôÑ(íÑ(æÑ(ßÑ(ØÑ(ÑÑ(ÊÑ(ÃÑ(¼Ñ(µÑ(®Ñ(§Ñ( Ñ(™Ñ(’Ñ(‹Ñ(„Ñ(}Ñ(vÑ(oÑ(hÑ(aÑ(ZÑ(SÑ(LÑ(EÑ(>Ñ(7Ñ(0Ñ()Ñ("Ñ(Ñ(Ñ( Ñ(Ñ(ÿÐ(øÐ(ñÐ(êÐ(ãÐ(ÜÐ(ÕÐ(ÎÐ(ÇÐ(ÀÐ(¹Ð(²Ð(«Ð(¤Ð(Ð(–Ð(Ð(ˆÐ(Ð(zÐ(sÐ(lÐ(eÐ(^Ð(WÐ(PÐ(IÐ(BÐ(;Ð(4Ð(-Ð(&Ð(Ð(Ð(Ð( Ð(Ð(üÏ(õÏ(îÏ(çÏ(àÏ(ÙÏ(ÒÏ(ËÏ(ÄÏ(½Ï(¶Ï(¯Ï(¨Ï(¡Ï(šÏ(“Ï(ŒÏ(…Ï(~Ï(wÏ(pÏ(iÏ(bÏ([Ï(TÏ(MÏ(FÏ(?Ï(8Ï(1Ï(*Ï(#Ï(Ï(Ï(Ï(Ï(Ï(ùÎ(òÎ(ëÎ(äÎ(ÝÎ(ÖÎ(ÏÎ(ÈÎ(ÁÎ(ºÎ(³Î(¬Î(¥Î(žÎ(—Î(Î(‰Î(‚Î({Î(tÎ(mÎ(fÎ(_Î(XÎ(QÎ(JÎ(CÎ(<Î(5Î(.Î('Î( Î(Î(Î( Î(Î(ýÍ(öÍ(ïÍ(èÍ(áÍ(ÚÍ(ÓÍ(ÌÍ(ÅÍ(¾Í(·Í(°Í(©Í(¢Í(›Í(”Í(Í(†Í(Í(xÍ(qÍ(jÍ(cÍ(\Í(UÍ(NÍ(GÍ(@Í(9Í(2Í(+Í($Í(Í(Í(Í(Í(Í(úÌ(óÌ(ìÌ(åÌ(ÞÌ(×Ì(ÐÌ(ÉÌ(ÂÌ(»Ì(´Ì(­Ì(¦Ì(ŸÌ(˜Ì(‘Ì(ŠÌ(ƒÌ(|Ì(uÌ(nÌ(gÌ(`Ì(YÌ(RÌ(KÌ(DÌ(=Ì(6Ì(/Ì((Ì(!Ì(Ì(Ì( Ì(Ì(þË(÷Ë(ðË(éË(âË(ÛË(ÔË(ÍË(ÆË(¿Ë(¸Ë(±Ë(ªË(£Ë(œË(•Ë(ŽË(‡Ë(€Ë(yË(rË(kË(dË(]Ë(VË(OË(HË(AË(:Ë(3Ë(,Ë(%Ë(Ë(Ë(Ë( Ë(Ë(ûÊ(ôÊ(íÊ(æÊ(ßÊ(ØÊ(ÑÊ(ÊÊ(ÃÊ(¼Ê(µÊ(®Ê(§Ê( Ê(™Ê(’Ê(‹Ê(„Ê(}Ê(vÊ(oÊ(hÊ(aÊ(ZÊ(SÊ(LÊ(EÊ(>Ê(7Ê(0Ê()Ê("Ê(Ê(Ê( Ê(Ê(ÿÉ(øÉ(ñÉ(êÉ(ãÉ(ÜÉ(ÕÉ(ÎÉ(ÇÉ(ÀÉ(¹É(²É(«É(¤É(É(–É(É(ˆÉ(É(zÉ(sÉ(lÉ(eÉ(^É(WÉ(PÉ(IÉ(BÉ(;É(4É(-É(&É(É(É(É( É(É(üÈ(õÈ(îÈ(çÈ(àÈ(ÙÈ(ÒÈ(ËÈ(ÄÈ(½È(¶È(¯È(¨È(¡È(šÈ(“È(ŒÈ(…È(~È(wÈ(pÈ(iÈ(bÈ([È(TÈ(MÈ(FÈ(?È(8È(1È(*È(#È(È(È(È(È(È(ùÇ(òÇ(ëÇ(äÇ(ÝÇ(ÖÇ(ÏÇ(ÈÇ(ÁÇ(ºÇ(³Ç(¬Ç(¥Ç(žÇ(—Ç(Ç(‰Ç(‚Ç({Ç(tÇ(mÇ(fÇ(_Ç(XÇ(QÇ(JÇ(CÇ(<Ç(5Ç(.Ç('Ç( Ç(Ç(Ç( Ç(Ç(ýÆ(öÆ(ïÆ(èÆ(áÆ(ÚÆ(ÓÆ(ÌÆ(ÅÆ(¾Æ(·Æ(°Æ(©Æ(¢Æ(›Æ(”Æ(Æ(†Æ(Æ(xÆ(qÆ(jÆ(cÆ(\Æ(UÆ(NÆ(GÆ(@Æ(9Æ(2Æ(+Æ($Æ(Æ(Æ(Æ(Æ(Æ(úÅ(óÅ(ìÅ(åÅ(ÞÅ(×Å(ÐÅ(ÉÅ(ÂÅ(»Å(´Å(­Å(¦Å(ŸÅ(˜Å(‘Å(ŠÅ(ƒÅ(|Å(uÅ(nÅ(gÅ(`Å(YÅ(RÅ(KÅ(DÅ(=Å(6Å(/Å((Å(!Å(Å(Å( Å(Å(þÄ(÷Ä(ðÄ(éÄ(âÄ(ÛÄ(ÔÄ(ÍÄ(ÆÄ(¿Ä(¸Ä(±Ä(ªÄ(£Ä(œÄ(•Ä(ŽÄ(‡Ä(€Ä(yÄ(rÄ(kÄ(dÄ(]Ä(VÄ(OÄ(HÄ(AÄ(:Ä(3Ä(,Ä(%Ä(Ä(Ä(Ä( Ä(Ä(ûÃ(ôÃ(íÃ(æÃ(ßÃ(ØÃ(ÑÃ(ÊÃ(ÃÃ(¼Ã(µÃ(®Ã(§Ã( Ã(™Ã(’Ã(‹Ã(„Ã(}Ã(vÃ(oÃ(hÃ(aÃ(ZÃ(SÃ(LÃ(EÃ(>Ã(7Ã(0Ã()Ã("Ã(Ã(Ã( Ã(Ã(ÿÂ(øÂ(ñÂ(êÂ(ãÂ(ÜÂ(ÕÂ(ÎÂ(ÇÂ(ÀÂ(¹Â(²Â(«Â(¤Â(Â(–Â(Â(ˆÂ(Â(zÂ(sÂ(lÂ(eÂ(^Â(WÂ(PÂ(IÂ(BÂ(;Â(4Â(-Â(&Â(Â(Â(Â( Â(Â(üÁ(õÁ(îÁ(çÁ(àÁ(ÙÁ(ÒÁ(ËÁ(ÄÁ(½Á(¶Á(¯Á(¨Á(¡Á(šÁ(“Á(ŒÁ(…Á(~Á(wÁ(pÁ(iÁ(bÁ([Á(TÁ(MÁ(FÁ(?Á(8Á(1Á(*Á(#Á(Á(Á(Á(Á(Á(ùÀ(òÀ(ëÀ(äÀ(ÝÀ(ÖÀ(ÏÀ(ÈÀ(ÁÀ(ºÀ(³À(¬À(¥À(žÀ(—À(À(‰À(‚À({À(tÀ(mÀ(fÀ(_À(XÀ(QÀ(JÀ(CÀ(<À(5À(.À('À( À(À(À( À(À(ý¿(ö¿(ï¿(è¿(á¿(Ú¿(Ó¿(Ì¿(Å¿(¾¿(·¿(°¿(©¿(¢¿(›¿(”¿(¿(†¿(¿(x¿(q¿(j¿(c¿(\¿(U¿(N¿(G¿(@¿(9¿(2¿(+¿($¿(¿(¿(¿(¿(¿(ú¾(ó¾(ì¾(å¾(Þ¾(×¾(о(ɾ(¾(»¾(´¾(­¾(¦¾(Ÿ¾(˜¾(‘¾(о(ƒ¾(|¾(u¾(n¾(g¾(`¾(Y¾(R¾(K¾(D¾(=¾(6¾(/¾((¾(!¾(¾(¾( ¾(¾(þ½(÷½(ð½(é½(â½(Û½(Ô½(ͽ(ƽ(¿½(¸½(±½(ª½(£½(œ½(•½(޽(‡½(€½(y½(r½(k½(d½(]½(V½(O½(H½(A½(:½(3½(,½(%½(½(½(½( ½(½(û¼(ô¼(í¼(æ¼(ß¼(ؼ(Ѽ(ʼ(ü(¼¼(µ¼(®¼(§¼( ¼(™¼(’¼(‹¼(„¼(}¼(v¼(o¼(h¼(a¼(Z¼(S¼(L¼(E¼(>¼(7¼(0¼()¼("¼(¼(¼( ¼(¼(ÿ»(ø»(ñ»(ê»(ã»(Ü»(Õ»(λ(Ç»(À»(¹»(²»(«»(¤»(»(–»(»(ˆ»(»(z»(s»(l»(e»(^»(W»(P»(I»(B»(;»(4»(-»(&»(»(»(»( »(»(üº(õº(îº(çº(àº(Ùº(Òº(˺(ĺ(½º(¶º(¯º(¨º(¡º(šº(“º(Œº(…º(~º(wº(pº(iº(bº([º(Tº(Mº(Fº(?º(8º(1º(*º(#º(º(º(º(º(º(ù¹(ò¹(ë¹(ä¹(ݹ(Ö¹(Ϲ(ȹ(Á¹(º¹(³¹(¬¹(¥¹(ž¹(—¹(¹(‰¹(‚¹({¹(t¹(m¹(f¹(_¹(X¹(Q¹(J¹(C¹(<¹(5¹(.¹('¹( ¹(¹(¹( ¹(¹(ý¸(ö¸(ï¸(è¸(á¸(Ú¸(Ó¸(̸(Ÿ(¾¸(·¸(°¸(©¸(¢¸(›¸(”¸(¸(†¸(¸(x¸(q¸(j¸(c¸(\¸(U¸(N¸(G¸(@¸(9¸(2¸(+¸($¸(¸(¸(¸(¸(¸(ú·(ó·(ì·(å·(Þ·(×·(з(É·(·(»·(´·(­·(¦·(Ÿ·(˜·(‘·(Š·(ƒ·(|·(u·(n·(g·(`·(Y·(R·(K·(D·(=·(6·(/·((·(!·(·(·( ·(·(þ¶(÷¶(ð¶(é¶(â¶(Û¶(Ô¶(Ͷ(ƶ(¿¶(¸¶(±¶(ª¶(£¶(œ¶(•¶(޶(‡¶(€¶(y¶(r¶(k¶(d¶(]¶(V¶(O¶(H¶(A¶(:¶(3¶(,¶(%¶(¶(¶(¶( ¶(¶(ûµ(ôµ(íµ(æµ(ßµ(ص(ѵ(ʵ(õ(¼µ(µµ(®µ(§µ( µ(™µ(’µ(‹µ(„µ(}µ(vµ(oµ(hµ(aµ(Zµ(Sµ(Lµ(Eµ(>µ(7µ(0µ()µ("µ(µ(µ( µ(µ(ÿ´(ø´(ñ´(ê´(ã´(Ü´(Õ´(δ(Ç´(À´(¹´(²´(«´(¤´(´(–´(´(ˆ´(´(z´(s´(l´(e´(^´(W´(P´(I´(B´(;´(4´(-´(&´(´(´(´( ´(´(ü³(õ³(î³(ç³(à³(Ù³(Ò³(˳(ij(½³(¶³(¯³(¨³(¡³(š³(“³(Œ³(…³(~³(w³(p³(i³(b³([³(T³(M³(F³(?³(8³(1³(*³(#³(³(³(³(³(³(ù²(ò²(ë²(ä²(ݲ(Ö²(ϲ(Ȳ(Á²(º²(³²(¬²(¥²(ž²(—²(²(‰²(‚²({²(t²(m²(f²(_²(X²(Q²(J²(C²(<²(5²(.²('²( ²(²(²( ²(²(ý±(ö±(ï±(è±(á±(Ú±(Ó±(̱(ű(¾±(·±(°±(©±(¢±(›±(”±(±(†±(±(x±(q±(j±(c±(\±(U±(N±(G±(@±(9±(2±(+±($±(±(±(±(±(±(ú°(ó°(ì°(å°(Þ°(×°(а(ɰ(°(»°(´°(­°(¦°(Ÿ°(˜°(‘°(а(ƒ°(|°(u°(n°(g°(`°(Y°(R°(K°(D°(=°(6°(/°((°(!°(°(°( °(°(þ¯(÷¯(ð¯(é¯(â¯(Û¯(Ô¯(ͯ(Ư(¿¯(¸¯(±¯(ª¯(£¯(œ¯(•¯(ޝ(‡¯(€¯(y¯(r¯(k¯(d¯(]¯(V¯(O¯(H¯(A¯(:¯(3¯(,¯(%¯(¯(¯(¯( ¯(¯(û®(ô®(í®(æ®(ß®(Ø®(Ñ®(Ê®(î(¼®(µ®(®®(§®( ®(™®(’®(‹®(„®(}®(v®(o®(h®(a®(Z®(S®(L®(E®(>®(7®(0®()®("®(®(®( ®(®(ÿ­(ø­(ñ­(ê­(ã­(Ü­(Õ­(έ(Ç­(À­(¹­(²­(«­(¤­(­(–­(­(ˆ­(­(z­(s­(l­(e­(^­(W­(P­(I­(B­(;­(4­(-­(&­(­(­(­( ­(­(ü¬(õ¬(î¬(ç¬(à¬(Ù¬(Ò¬(ˬ(Ĭ(½¬(¶¬(¯¬(¨¬(¡¬(š¬(“¬(Œ¬(…¬(~¬(w¬(p¬(i¬(b¬([¬(T¬(M¬(F¬(?¬(8¬(1¬(*¬(#¬(¬(¬(¬(¬(¬(ù«(ò«(ë«(ä«(Ý«(Ö«(Ï«(È«(Á«(º«(³«(¬«(¥«(ž«(—«(«(‰«(‚«({«(t«(m«(f«(_«(X«(Q«(J«(C«(<«(5«(.«('«( «(«(«( «(«(ýª(öª(ïª(èª(áª(Úª(Óª(̪(Ū(¾ª(·ª(°ª(©ª(¢ª(›ª(”ª(ª(†ª(ª(xª(qª(jª(cª(\ª(Uª(Nª(Gª(@ª(9ª(2ª(+ª($ª(ª(ª(ª(ª(ª(ú©(ó©(ì©(å©(Þ©(ש(Щ(É©(©(»©(´©(­©(¦©(Ÿ©(˜©(‘©(Š©(ƒ©(|©(u©(n©(g©(`©(Y©(R©(K©(D©(=©(6©(/©((©(!©(©(©( ©(©(þ¨(÷¨(ð¨(é¨(â¨(Û¨(Ô¨(ͨ(ƨ(¿¨(¸¨(±¨(ª¨(£¨(œ¨(•¨(ލ(‡¨(€¨(y¨(r¨(k¨(d¨(]¨(V¨(O¨(H¨(A¨(:¨(3¨(,¨(%¨(¨(¨(¨( ¨(¨(û§(ô§(í§(æ§(ß§(ا(ѧ(ʧ(ç(¼§(µ§(®§(§§( §(™§(’§(‹§(„§(}§(v§(o§(h§(a§(Z§(S§(L§(E§(>§(7§(0§()§("§(§(§( §(§(ÿ¦(ø¦(ñ¦(ê¦(ã¦(ܦ(Õ¦(Φ(Ǧ(À¦(¹¦(²¦(«¦(¤¦(¦(–¦(¦(ˆ¦(¦(z¦(s¦(l¦(e¦(^¦(W¦(P¦(I¦(B¦(;¦(4¦(-¦(&¦(¦(¦(¦( ¦(¦(ü¥(õ¥(î¥(ç¥(à¥(Ù¥(Ò¥(Ë¥(Ä¥(½¥(¶¥(¯¥(¨¥(¡¥(š¥(“¥(Œ¥(…¥(~¥(w¥(p¥(i¥(b¥([¥(T¥(M¥(F¥(?¥(8¥(1¥(*¥(#¥(¥(¥(¥(¥(¥(ù¤(ò¤(ë¤(ä¤(ݤ(Ö¤(Ϥ(Ȥ(Á¤(º¤(³¤(¬¤(¥¤(ž¤(—¤(¤(‰¤(‚¤({¤(t¤(m¤(f¤(_¤(X¤(Q¤(J¤(C¤(<¤(5¤(.¤('¤( ¤(¤(¤( ¤(¤(ý£(ö£(ï£(è£(á£(Ú£(Ó£(Ì£(Å£(¾£(·£(°£(©£(¢£(›£(”£(£(†£(£(x£(q£(j£(c£(\£(U£(N£(G£(@£(9£(2£(+£($£(£(£(£(£(£(ú¢(ó¢(ì¢(å¢(Þ¢(×¢(Т(É¢(¢(»¢(´¢(­¢(¦¢(Ÿ¢(˜¢(‘¢(Š¢(ƒ¢(|¢(u¢(n¢(g¢(`¢(Y¢(R¢(K¢(D¢(=¢(6¢(/¢((¢(!¢(¢(¢( ¢(¢(þ¡(÷¡(ð¡(é¡(â¡(Û¡(Ô¡(Í¡(Æ¡(¿¡(¸¡(±¡(ª¡(£¡(œ¡(•¡(Ž¡(‡¡(€¡(y¡(r¡(k¡(d¡(]¡(V¡(O¡(H¡(A¡(:¡(3¡(,¡(%¡(¡(¡(¡( ¡(¡(û (ô (í (æ (ß (Ø (Ñ (Ê (à(¼ (µ (® (§ (  (™ (’ (‹ („ (} (v (o (h (a (Z (S (L (E (> (7 (0 () (" ( ( (  ( (ÿŸ(øŸ(ñŸ(êŸ(ãŸ(ÜŸ(ÕŸ(Ο(ÇŸ(ÀŸ(¹Ÿ(²Ÿ(«Ÿ(¤Ÿ(Ÿ(–Ÿ(Ÿ(ˆŸ(Ÿ(zŸ(sŸ(lŸ(eŸ(^Ÿ(WŸ(PŸ(IŸ(BŸ(;Ÿ(4Ÿ(-Ÿ(&Ÿ(Ÿ(Ÿ(Ÿ( Ÿ(Ÿ(üž(õž(îž(çž(àž(Ùž(Òž(Ëž(Äž(½ž(¶ž(¯ž(¨ž(¡ž(šž(“ž(Œž(…ž(~ž(wž(pž(iž(bž([ž(Tž(Mž(Fž(?ž(8ž(1ž(*ž(#ž(ž(ž(ž(ž(ž(ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ýœ(öœ(ïœ(èœ(áœ(Úœ(Óœ(Ìœ(Åœ(¾œ(·œ(°œ(©œ(¢œ(›œ(”œ(œ(†œ(œ(xœ(qœ(jœ(cœ(\œ(Uœ(Nœ(Gœ(@œ(9œ(2œ(+œ($œ(œ(œ(œ(œ(œ(ú›(ó›(ì›(å›(Þ›(×›(Л(É›(›(»›(´›(­›(¦›(Ÿ›(˜›(‘›(Š›(ƒ›(|›(u›(n›(g›(`›(Y›(R›(K›(D›(=›(6›(/›((›(!›(›(›( ›(›(þš(÷š(ðš(éš(âš(Ûš(Ôš(Íš(Æš(¿š(¸š(±š(ªš(£š(œš(•š(Žš(‡š(€š(yš(rš(kš(dš(]š(Vš(Oš(Hš(Aš(:š(3š(,š(%š(š(š(š( š(š(û™(ô™(í™(æ™(ß™(Ø™(Ñ™(Ê™(Ù(¼™(µ™(®™(§™( ™(™™(’™(‹™(„™(}™(v™(o™(h™(a™(Z™(S™(L™(E™(>™(7™(0™()™("™(™(™( ™(™(ÿ˜(ø˜(ñ˜(ê˜(ã˜(ܘ(Õ˜(Θ(ǘ(À˜(¹˜(²˜(«˜(¤˜(˜(–˜(˜(ˆ˜(˜(z˜(s˜(l˜(e˜(^˜(W˜(P˜(I˜(B˜(;˜(4˜(-˜(&˜(˜(˜(˜( ˜(˜(ü—(õ—(î—(ç—(à—(Ù—(Ò—(Ë—(Ä—(½—(¶—(¯—(¨—(¡—(š—(“—(Œ—(…—(~—(w—(p—(i—(b—([—(T—(M—(F—(?—(8—(1—(*—(#—(—(—(—(—(—(ù–(ò–(ë–(ä–(Ý–(Ö–(Ï–(È–(Á–(º–(³–(¬–(¥–(ž–(—–(–(‰–(‚–({–(t–(m–(f–(_–(X–(Q–(J–(C–(<–(5–(.–('–( –(–(–( –(–(ý•(ö•(ï•(è•(á•(Ú•(Ó•(Ì•(Å•(¾•(·•(°•(©•(¢•(›•(”•(•(†•(•(x•(q•(j•(c•(\•(U•(N•(G•(@•(9•(2•(+•($•(•(•(•(•(•(ú”(ó”(ì”(å”(Þ”(×”(Д(É”(”(»”(´”(­”(¦”(Ÿ”(˜”(‘”(Š”(ƒ”(|”(u”(n”(g”(`”(Y”(R”(K”(D”(=”(6”(/”((”(!”(”(”( ”(”(þ“(÷“(ð“(é“(â“(Û“(Ô“(Í“(Æ“(¿“(¸“(±“(ª“(£“(œ“(•“(Ž“(‡“(€“(y“(r“(k“(d“(]“(V“(O“(H“(A“(:“(3“(,“(%“(“(“(“( “(“(û’(ô’(í’(æ’(ß’(Ø’(Ñ’(Ê’(Ã’(¼’(µ’(®’(§’( ’(™’(’’(‹’(„’(}’(v’(o’(h’(a’(Z’(S’(L’(E’(>’(7’(0’()’("’(’(’( ’(’(ÿ‘(ø‘(ñ‘(ê‘(ã‘(Ü‘(Õ‘(Α(Ç‘(À‘(¹‘(²‘(«‘(¤‘(‘(–‘(‘(ˆ‘(‘(z‘(s‘(l‘(e‘(^‘(W‘(P‘(I‘(B‘(;‘(4‘(-‘(&‘(‘(‘(‘( ‘(‘(ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ýŽ(öŽ(ïŽ(èŽ(áŽ(ÚŽ(ÓŽ(ÌŽ(ÅŽ(¾Ž(·Ž(°Ž(©Ž(¢Ž(›Ž(”Ž(Ž(†Ž(Ž(xŽ(qŽ(jŽ(cŽ(\Ž(UŽ(NŽ(GŽ(@Ž(9Ž(2Ž(+Ž($Ž(Ž(Ž(Ž(Ž(Ž(ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þŒ(÷Œ(ðŒ(éŒ(âŒ(ÛŒ(ÔŒ(ÍŒ(ÆŒ(¿Œ(¸Œ(±Œ(ªŒ(£Œ(œŒ(•Œ(ŽŒ(‡Œ(€Œ(yŒ(rŒ(kŒ(dŒ(]Œ(VŒ(OŒ(HŒ(AŒ(:Œ(3Œ(,Œ(%Œ(Œ(Œ(Œ( Œ(Œ(û‹(ô‹(í‹(æ‹(ß‹(Ø‹(Ñ‹(Ê‹(Ë(¼‹(µ‹(®‹(§‹( ‹(™‹(’‹(‹‹(„‹(}‹(v‹(o‹(h‹(a‹(Z‹(S‹(L‹(E‹(>‹(7‹(0‹()‹("‹(‹(‹( ‹(‹(ÿŠ(øŠ(ñŠ(êŠ(ãŠ(ÜŠ(ÕŠ(Ί(ÇŠ(ÀŠ(¹Š(²Š(«Š(¤Š(Š(–Š(Š(ˆŠ(Š(zŠ(sŠ(lŠ(eŠ(^Š(WŠ(PŠ(IŠ(BŠ(;Š(4Š(-Š(&Š(Š(Š(Š( Š(Š(ü‰(õ‰(î‰(ç‰(à‰(Ù‰(Ò‰(ˉ(ĉ(½‰(¶‰(¯‰(¨‰(¡‰(š‰(“‰(Œ‰(…‰(~‰(w‰(p‰(i‰(b‰([‰(T‰(M‰(F‰(?‰(8‰(1‰(*‰(#‰(‰(‰(‰(‰(‰(ùˆ(òˆ(ëˆ(äˆ(݈(Öˆ(ψ(Ȉ(Áˆ(ºˆ(³ˆ(¬ˆ(¥ˆ(žˆ(—ˆ(ˆ(‰ˆ(‚ˆ({ˆ(tˆ(mˆ(fˆ(_ˆ(Xˆ(Qˆ(Jˆ(Cˆ(<ˆ(5ˆ(.ˆ('ˆ( ˆ(ˆ(ˆ( ˆ(ˆ(ý‡(ö‡(ï‡(è‡(á‡(Ú‡(Ó‡(̇(Ň(¾‡(·‡(°‡(©‡(¢‡(›‡(”‡(‡(†‡(‡(x‡(q‡(j‡(c‡(\‡(U‡(N‡(G‡(@‡(9‡(2‡(+‡($‡(‡(‡(‡(‡(‡(ú†(ó†(ì†(å†(Þ†(׆(І(Ɇ(†(»†(´†(­†(¦†(Ÿ†(˜†(‘†(І(ƒ†(|†(u†(n†(g†(`†(Y†(R†(K†(D†(=†(6†(/†((†(!†(†(†( †(†(þ…(÷…(ð…(é…(â…(Û…(Ô…(Í…(Æ…(¿…(¸…(±…(ª…(£…(œ…(•…(Ž…(‡…(€…(y…(r…(k…(d…(]…(V…(O…(H…(A…(:…(3…(,…(%…(…(…(…( …(…(û„(ô„(í„(æ„(ß„(Ø„(Ñ„(Ê„(Ä(¼„(µ„(®„(§„( „(™„(’„(‹„(„„(}„(v„(o„(h„(a„(Z„(S„(L„(E„(>„(7„(0„()„("„(„(„( „(„(ÿƒ(øƒ(ñƒ(êƒ(ãƒ(܃(Õƒ(΃(ǃ(Àƒ(¹ƒ(²ƒ(«ƒ(¤ƒ(ƒ(–ƒ(ƒ(ˆƒ(ƒ(zƒ(sƒ(lƒ(eƒ(^ƒ(Wƒ(Pƒ(Iƒ(Bƒ(;ƒ(4ƒ(-ƒ(&ƒ(ƒ(ƒ(ƒ( ƒ(ƒ(ü‚(õ‚(î‚(ç‚(à‚(Ù‚(Ò‚(Ë‚(Ä‚(½‚(¶‚(¯‚(¨‚(¡‚(š‚(“‚(Œ‚(…‚(~‚(w‚(p‚(i‚(b‚([‚(T‚(M‚(F‚(?‚(8‚(1‚(*‚(#‚(‚(‚(‚(‚(‚(ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý€(ö€(ï€(è€(á€(Ú€(Ó€(Ì€(Å€(¾€(·€(°€(©€(¢€(›€(”€(€(†€(€(x€(q€(j€(c€(\€(U€(N€(G€(@€(9€(2€(+€($€(€(€(€(€(€(ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ~(÷~(ð~(é~(â~(Û~(Ô~(Í~(Æ~(¿~(¸~(±~(ª~(£~(œ~(•~(Ž~(‡~(€~(y~(r~(k~(d~(]~(V~(O~(H~(A~(:~(3~(,~(%~(~(~(~( ~(~(û}(ô}(í}(æ}(ß}(Ø}(Ñ}(Ê}(Ã}(¼}(µ}(®}(§}( }(™}(’}(‹}(„}(}}(v}(o}(h}(a}(Z}(S}(L}(E}(>}(7}(0}()}("}(}(}( }(}(ÿ|(ø|(ñ|(ê|(ã|(Ü|(Õ|(Î|(Ç|(À|(¹|(²|(«|(¤|(|(–|(|(ˆ|(|(z|(s|(l|(e|(^|(W|(P|(I|(B|(;|(4|(-|(&|(|(|(|( |(|(ü{(õ{(î{(ç{(à{(Ù{(Ò{(Ë{(Ä{(½{(¶{(¯{(¨{(¡{(š{(“{(Œ{(…{(~{(w{(p{(i{(b{([{(T{(M{(F{(?{(8{(1{(*{(#{({({({({({(ùz(òz(ëz(äz(Ýz(Öz(Ïz(Èz(Áz(ºz(³z(¬z(¥z(žz(—z(z(‰z(‚z({z(tz(mz(fz(_z(Xz(Qz(Jz(Cz(v(7v(0v()v("v(v(v( v(v(ÿu(øu(ñu(êu(ãu(Üu(Õu(Îu(Çu(Àu(¹u(²u(«u(¤u(u(–u(u(ˆu(u(zu(su(lu(eu(^u(Wu(Pu(Iu(Bu(;u(4u(-u(&u(u(u(u( u(u(üt(õt(ît(çt(àt(Ùt(Òt(Ët(Ät(½t(¶t(¯t(¨t(¡t(št(“t(Œt(…t(~t(wt(pt(it(bt([t(Tt(Mt(Ft(?t(8t(1t(*t(#t(t(t(t(t(t(ùs(òs(ës(äs(Ýs(Ös(Ïs(Ès(Ás(ºs(³s(¬s(¥s(žs(—s(s(‰s(‚s({s(ts(ms(fs(_s(Xs(Qs(Js(Cs(o(7o(0o()o("o(o(o( o(o(ÿn(øn(ñn(ên(ãn(Ün(Õn(În(Çn(Àn(¹n(²n(«n(¤n(n(–n(n(ˆn(n(zn(sn(ln(en(^n(Wn(Pn(In(Bn(;n(4n(-n(&n(n(n(n( n(n(üm(õm(îm(çm(àm(Ùm(Òm(Ëm(Äm(½m(¶m(¯m(¨m(¡m(šm(“m(Œm(…m(~m(wm(pm(im(bm([m(Tm(Mm(Fm(?m(8m(1m(*m(#m(m(m(m(m(m(ùl(òl(ël(äl(Ýl(Öl(Ïl(Èl(Ál(ºl(³l(¬l(¥l(žl(—l(l(‰l(‚l({l(tl(ml(fl(_l(Xl(Ql(Jl(Cl(h(7h(0h()h("h(h(h( h(h(ÿg(øg(ñg(êg(ãg(Üg(Õg(Îg(Çg(Àg(¹g(²g(«g(¤g(g(–g(g(ˆg(g(zg(sg(lg(eg(^g(Wg(Pg(Ig(Bg(;g(4g(-g(&g(g(g(g( g(g(üf(õf(îf(çf(àf(Ùf(Òf(Ëf(Äf(½f(¶f(¯f(¨f(¡f(šf(“f(Œf(…f(~f(wf(pf(if(bf([f(Tf(Mf(Ff(?f(8f(1f(*f(#f(f(f(f(f(f(ùe(òe(ëe(äe(Ýe(Öe(Ïe(Èe(Áe(ºe(³e(¬e(¥e(že(—e(e(‰e(‚e({e(te(me(fe(_e(Xe(Qe(Je(Ce(a(7a(0a()a("a(a(a( a(a(ÿ`(ø`(ñ`(ê`(ã`(Ü`(Õ`(Î`(Ç`(À`(¹`(²`(«`(¤`(`(–`(`(ˆ`(`(z`(s`(l`(e`(^`(W`(P`(I`(B`(;`(4`(-`(&`(`(`(`( `(`(ü_(õ_(î_(ç_(à_(Ù_(Ò_(Ë_(Ä_(½_(¶_(¯_(¨_(¡_(š_(“_(Œ_(…_(~_(w_(p_(i_(b_([_(T_(M_(F_(?_(8_(1_(*_(#_(_(_(_(_(_(ù^(ò^(ë^(ä^(Ý^(Ö^(Ï^(È^(Á^(º^(³^(¬^(¥^(ž^(—^(^(‰^(‚^({^(t^(m^(f^(_^(X^(Q^(J^(C^(<^(5^(.^('^( ^(^(^( ^(^(ý](ö](ï](è](á](Ú](Ó](Ì](Å](¾](·](°](©](¢](›](”](](†](](x](q](j](c](\](U](N](G](@](9](2](+]($](](](](](](ú\(ó\(ì\(å\(Þ\(×\(Ð\(É\(Â\(»\(´\(­\(¦\(Ÿ\(˜\(‘\(Š\(ƒ\(|\(u\(n\(g\(`\(Y\(R\(K\(D\(=\(6\(/\((\(!\(\(\( \(\(þ[(÷[(ð[(é[(â[(Û[(Ô[(Í[(Æ[(¿[(¸[(±[(ª[(£[(œ[(•[(Ž[(‡[(€[(y[(r[(k[(d[(][(V[(O[(H[(A[(:[(3[(,[(%[([([([( [([(ûZ(ôZ(íZ(æZ(ßZ(ØZ(ÑZ(ÊZ(ÃZ(¼Z(µZ(®Z(§Z( Z(™Z(’Z(‹Z(„Z(}Z(vZ(oZ(hZ(aZ(ZZ(SZ(LZ(EZ(>Z(7Z(0Z()Z("Z(Z(Z( Z(Z(ÿY(øY(ñY(êY(ãY(ÜY(ÕY(ÎY(ÇY(ÀY(¹Y(²Y(«Y(¤Y(Y(–Y(Y(ˆY(Y(zY(sY(lY(eY(^Y(WY(PY(IY(BY(;Y(4Y(-Y(&Y(Y(Y(Y( Y(Y(üX(õX(îX(çX(àX(ÙX(ÒX(ËX(ÄX(½X(¶X(¯X(¨X(¡X(šX(“X(ŒX(…X(~X(wX(pX(iX(bX([X(TX(MX(FX(?X(8X(1X(*X(#X(X(X(X(X(X(ùW(òW(ëW(äW(ÝW(ÖW(ÏW(ÈW(ÁW(ºW(³W(¬W(¥W(žW(—W(W(‰W(‚W({W(tW(mW(fW(_W(XW(QW(JW(CW(S(7S(0S()S("S(S(S( S(S(ÿR(øR(ñR(êR(ãR(ÜR(ÕR(ÎR(ÇR(ÀR(¹R(²R(«R(¤R(R(–R(R(ˆR(R(zR(sR(lR(eR(^R(WR(PR(IR(BR(;R(4R(-R(&R(R(R(R( R(R(üQ(õQ(îQ(çQ(àQ(ÙQ(ÒQ(ËQ(ÄQ(½Q(¶Q(¯Q(¨Q(¡Q(šQ(“Q(ŒQ(…Q(~Q(wQ(pQ(iQ(bQ([Q(TQ(MQ(FQ(?Q(8Q(1Q(*Q(#Q(Q(Q(Q(Q(Q(ùP(òP(ëP(äP(ÝP(ÖP(ÏP(ÈP(ÁP(ºP(³P(¬P(¥P(žP(—P(P(‰P(‚P({P(tP(mP(fP(_P(XP(QP(JP(CP(L(7L(0L()L("L(L(L( L(L(ÿK(øK(ñK(êK(ãK(ÜK(ÕK(ÎK(ÇK(ÀK(¹K(²K(«K(¤K(K(–K(K(ˆK(K(zK(sK(lK(eK(^K(WK(PK(IK(BK(;K(4K(-K(&K(K(K(K( K(K(üJ(õJ(îJ(çJ(àJ(ÙJ(ÒJ(ËJ(ÄJ(½J(¶J(¯J(¨J(¡J(šJ(“J(ŒJ(…J(~J(wJ(pJ(iJ(bJ([J(TJ(MJ(FJ(?J(8J(1J(*J(#J(J(J(J(J(J(ùI(òI(ëI(äI(ÝI(ÖI(ÏI(ÈI(ÁI(ºI(³I(¬I(¥I(žI(—I(I(‰I(‚I({I(tI(mI(fI(_I(XI(QI(JI(CI(E(7E(0E()E("E(E(E( E(E(ÿD(øD(ñD(êD(ãD(ÜD(ÕD(ÎD(ÇD(ÀD(¹D(²D(«D(¤D(D(–D(D(ˆD(D(zD(sD(lD(eD(^D(WD(PD(ID(BD(;D(4D(-D(&D(D(D(D( D(D(üC(õC(îC(çC(àC(ÙC(ÒC(ËC(ÄC(½C(¶C(¯C(¨C(¡C(šC(“C(ŒC(…C(~C(wC(pC(iC(bC([C(TC(MC(FC(?C(8C(1C(*C(#C(C(C(C(C(C(ùB(òB(ëB(äB(ÝB(ÖB(ÏB(ÈB(ÁB(ºB(³B(¬B(¥B(žB(—B(B(‰B(‚B({B(tB(mB(fB(_B(XB(QB(JB(CB((ô>(í>(æ>(ß>(Ø>(Ñ>(Ê>(Ã>(¼>(µ>(®>(§>( >(™>(’>(‹>(„>(}>(v>(o>(h>(a>(Z>(S>(L>(E>(>>(7>(0>()>(">(>(>( >(>(ÿ=(ø=(ñ=(ê=(ã=(Ü=(Õ=(Î=(Ç=(À=(¹=(²=(«=(¤=(=(–=(=(ˆ=(=(z=(s=(l=(e=(^=(W=(P=(I=(B=(;=(4=(-=(&=(=(=(=( =(=(ü<(õ<(î<(ç<(à<(Ù<(Ò<(Ë<(Ä<(½<(¶<(¯<(¨<(¡<(š<(“<(Œ<(…<(~<(w<(p<(i<(b<([<(T<(M<(F<(?<(8<(1<(*<(#<(<(<(<(<(<(ù;(ò;(ë;(ä;(Ý;(Ö;(Ï;(È;(Á;(º;(³;(¬;(¥;(ž;(—;(;(‰;(‚;({;(t;(m;(f;(_;(X;(Q;(J;(C;(<;(5;(.;(';( ;(;(;( ;(;(ý:(ö:(ï:(è:(á:(Ú:(Ó:(Ì:(Å:(¾:(·:(°:(©:(¢:(›:(”:(:(†:(:(x:(q:(j:(c:(\:(U:(N:(G:(@:(9:(2:(+:($:(:(:(:(:(:(ú9(ó9(ì9(å9(Þ9(×9(Ð9(É9(Â9(»9(´9(­9(¦9(Ÿ9(˜9(‘9(Š9(ƒ9(|9(u9(n9(g9(`9(Y9(R9(K9(D9(=9(69(/9((9(!9(9(9( 9(9(þ8(÷8(ð8(é8(â8(Û8(Ô8(Í8(Æ8(¿8(¸8(±8(ª8(£8(œ8(•8(Ž8(‡8(€8(y8(r8(k8(d8(]8(V8(O8(H8(A8(:8(38(,8(%8(8(8(8( 8(8(û7(ô7(í7(æ7(ß7(Ø7(Ñ7(Ê7(Ã7(¼7(µ7(®7(§7( 7(™7(’7(‹7(„7(}7(v7(o7(h7(a7(Z7(S7(L7(E7(>7(77(07()7("7(7(7( 7(7(ÿ6(ø6(ñ6(ê6(ã6(Ü6(Õ6(Î6(Ç6(À6(¹6(²6(«6(¤6(6(–6(6(ˆ6(6(z6(s6(l6(e6(^6(W6(P6(I6(B6(;6(46(-6(&6(6(6(6( 6(6(ü5(õ5(î5(ç5(à5(Ù5(Ò5(Ë5(Ä5(½5(¶5(¯5(¨5(¡5(š5(“5(Œ5(…5(~5(w5(p5(i5(b5([5(T5(M5(F5(?5(85(15(*5(#5(5(5(5(5(5(ù4(ò4(ë4(ä4(Ý4(Ö4(Ï4(È4(Á4(º4(³4(¬4(¥4(ž4(—4(4(‰4(‚4({4(t4(m4(f4(_4(X4(Q4(J4(C4(<4(54(.4('4( 4(4(4( 4(4(ý3(ö3(ï3(è3(á3(Ú3(Ó3(Ì3(Å3(¾3(·3(°3(©3(¢3(›3(”3(3(†3(3(x3(q3(j3(c3(\3(U3(N3(G3(@3(93(23(+3($3(3(3(3(3(3(ú2(ó2(ì2(å2(Þ2(×2(Ð2(É2(Â2(»2(´2(­2(¦2(Ÿ2(˜2(‘2(Š2(ƒ2(|2(u2(n2(g2(`2(Y2(R2(K2(D2(=2(62(/2((2(!2(2(2( 2(2(þ1(÷1(ð1(é1(â1(Û1(Ô1(Í1(Æ1(¿1(¸1(±1(ª1(£1(œ1(•1(Ž1(‡1(€1(y1(r1(k1(d1(]1(V1(O1(H1(A1(:1(31(,1(%1(1(1(1( 1(1(û0(ô0(í0(æ0(ß0(Ø0(Ñ0(Ê0(Ã0(¼0(µ0(®0(§0( 0(™0(’0(‹0(„0(}0(v0(o0(h0(a0(Z0(S0(L0(E0(>0(70(00()0("0(0(0( 0(0(ÿ/(ø/(ñ/(ê/(ã/(Ü/(Õ/(Î/(Ç/(À/(¹/(²/(«/(¤/(/(–/(/(ˆ/(/(z/(s/(l/(e/(^/(W/(P/(I/(B/(;/(4/(-/(&/(/(/(/( /(/(ü.(õ.(î.(ç.(à.(Ù.(Ò.(Ë.(Ä.(½.(¶.(¯.(¨.(¡.(š.(“.(Œ.(….(~.(w.(p.(i.(b.([.(T.(M.(F.(?.(8.(1.(*.(#.(.(.(.(.(.(ù-(ò-(ë-(ä-(Ý-(Ö-(Ï-(È-(Á-(º-(³-(¬-(¥-(ž-(—-(-(‰-(‚-({-(t-(m-(f-(_-(X-(Q-(J-(C-(<-(5-(.-('-( -(-(-( -(-(ý,(ö,(ï,(è,(á,(Ú,(Ó,(Ì,(Å,(¾,(·,(°,(©,(¢,(›,(”,(,(†,(,(x,(q,(j,(c,(\,(U,(N,(G,(@,(9,(2,(+,($,(,(,(,(,(,(ú+(ó+(ì+(å+(Þ+(×+(Ð+(É+(Â+(»+(´+(­+(¦+(Ÿ+(˜+(‘+(Š+(ƒ+(|+(u+(n+(g+(`+(Y+(R+(K+(D+(=+(6+(/+((+(!+(+(+( +(+(þ*(÷*(ð*(é*(â*(Û*(Ô*(Í*(Æ*(¿*(¸*(±*(ª*(£*(œ*(•*(Ž*(‡*(€*(y*(r*(k*(d*(]*(V*(O*(H*(A*(:*(3*(,*(%*(*(*(*( *(*(û)(ô)(í)(æ)(ß)(Ø)(Ñ)(Ê)(Ã)(¼)(µ)(®)(§)( )(™)(’)(‹)(„)(})(v)(o)(h)(a)(Z)(S)(L)(E)(>)(7)(0)())(")()()( )()(ÿ((ø((ñ((ê((ã((Ü((Õ((Î((Ç((À((¹((²((«((¤((((–((((ˆ((((z((s((l((e((^((W((P((I((B((;((4((-((&(((((((( ((((ü'(õ'(î'(ç'(à'(Ù'(Ò'(Ë'(Ä'(½'(¶'(¯'(¨'(¡'(š'(“'(Œ'(…'(~'(w'(p'(i'(b'(['(T'(M'(F'(?'(8'(1'(*'(#'('('('('('(ù&(ò&(ë&(ä&(Ý&(Ö&(Ï&(È&(Á&(º&(³&(¬&(¥&(ž&(—&(&(‰&(‚&({&(t&(m&(f&(_&(X&(Q&(J&(C&(<&(5&(.&('&( &(&(&( &(&(ý%(ö%(ï%(è%(á%(Ú%(Ó%(Ì%(Å%(¾%(·%(°%(©%(¢%(›%(”%(%(†%(%(x%(q%(j%(c%(\%(U%(N%(G%(@%(9%(2%(+%($%(%(%(%(%(%(ú$(ó$(ì$(å$(Þ$(×$(Ð$(É$(Â$(»$(´$(­$(¦$(Ÿ$(˜$(‘$(Š$(ƒ$(|$(u$(n$(g$(`$(Y$(R$(K$(D$(=$(6$(/$(($(!$($($( $($(þ#(÷#(ð#(é#(â#(Û#(Ô#(Í#(Æ#(¿#(¸#(±#(ª#(£#(œ#(•#(Ž#(‡#(€#(y#(r#(k#(d#(]#(V#(O#(H#(A#(:#(3#(,#(%#(#(#(#( #(#(û"(ô"(í"(æ"(ß"(Ø"(Ñ"(Ê"(Ã"(¼"(µ"(®"(§"( "(™"(’"(‹"(„"(}"(v"(o"(h"(a"(Z"(S"(L"(E"(>"(7"(0"()"(""("("( "("(ÿ!(ø!(ñ!(ê!(ã!(Ü!(Õ!(Î!(Ç!(À!(¹!(²!(«!(¤!(!(–!(!(ˆ!(!(z!(s!(l!(e!(^!(W!(P!(I!(B!(;!(4!(-!(&!(!(!(!( !(!(ü (õ (î (ç (à (Ù (Ò (Ë (Ä (½ (¶ (¯ (¨ (¡ (š (“ (Œ (… (~ (w (p (i (b ([ (T (M (F (? (8 (1 (* (# ( ( ( ( ( (ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û (ô (í (æ (ß (Ø (Ñ (Ê (à (¼ (µ (® (§ (  (™ (’ (‹ („ (} (v (o (h (a (Z (S (L (E (> (7 (0 () (" ( ( ( ( (ÿ (ø (ñ (ê (ã (Ü (Õ (Î (Ç (À (¹ (² (« (¤ ( (– ( (ˆ ( (z (s (l (e (^ (W (P (I (B (; (4 (- (& ( ( ( ( ( (ü (õ (î (ç (à (Ù (Ò (Ë (Ä (½ (¶ (¯ (¨ (¡ (š (“ (Œ (… (~ (w (p (i (b ([ (T (M (F (? (8 (1 (* (# ( ( ( ( ( (ù (ò (ë (ä (Ý (Ö (Ï (È (Á (º (³ (¬ (¥ (ž (— ( (‰ (‚ ({ (t (m (f (_ (X (Q (J (C (< (5 (. (' ( ( ( ( ( (ý (ö (ï (è (á (Ú (Ó (Ì (Å (¾ (· (° (© (¢ (› (” ( († ( (x (q (j (c (\ (U (N (G (@ (9 (2 (+ ($ ( ( ( ( ( (ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((ûÿ'ôÿ'íÿ'æÿ'ßÿ'Øÿ'Ñÿ'Êÿ'Ãÿ'¼ÿ'µÿ'®ÿ'§ÿ' ÿ'™ÿ'’ÿ'‹ÿ'„ÿ'}ÿ'vÿ'oÿ'hÿ'aÿ'Zÿ'Sÿ'Lÿ'Eÿ'>ÿ'7ÿ'0ÿ')ÿ'"ÿ'ÿ'ÿ' ÿ'ÿ'ÿþ'øþ'ñþ'êþ'ãþ'Üþ'Õþ'Îþ'Çþ'Àþ'¹þ'²þ'«þ'¤þ'þ'–þ'þ'ˆþ'þ'zþ'sþ'lþ'eþ'^þ'Wþ'Pþ'Iþ'Bþ';þ'4þ'-þ'&þ'þ'þ'þ' þ'þ'üý'õý'îý'çý'àý'Ùý'Òý'Ëý'Äý'½ý'¶ý'¯ý'¨ý'¡ý'šý'“ý'Œý'…ý'~ý'wý'pý'iý'bý'[ý'Tý'Mý'Fý'?ý'8ý'1ý'*ý'#ý'ý'ý'ý'ý'ý'ùü'òü'ëü'äü'Ýü'Öü'Ïü'Èü'Áü'ºü'³ü'¬ü'¥ü'žü'—ü'ü'‰ü'‚ü'{ü'tü'mü'fü'_ü'Xü'Qü'Jü'Cü'<ü'5ü'.ü''ü' ü'ü'ü' ü'ü'ýû'öû'ïû'èû'áû'Úû'Óû'Ìû'Åû'¾û'·û'°û'©û'¢û'›û'”û'û'†û'û'xû'qû'jû'cû'\û'Uû'Nû'Gû'@û'9û'2û'+û'$û'û'û'û'û'û'úú'óú'ìú'åú'Þú'×ú'Ðú'Éú'Âú'»ú'´ú'­ú'¦ú'Ÿú'˜ú'‘ú'Šú'ƒú'|ú'uú'nú'gú'`ú'Yú'Rú'Kú'Dú'=ú'6ú'/ú'(ú'!ú'ú'ú' ú'ú'þù'÷ù'ðù'éù'âù'Ûù'Ôù'Íù'Æù'¿ù'¸ù'±ù'ªù'£ù'œù'•ù'Žù'‡ù'€ù'yù'rù'kù'dù']ù'Vù'Où'Hù'Aù':ù'3ù',ù'%ù'ù'ù'ù' ù'ù'ûø'ôø'íø'æø'ßø'Øø'Ñø'Êø'Ãø'¼ø'µø'®ø'§ø' ø'™ø'’ø'‹ø'„ø'}ø'vø'oø'hø'aø'Zø'Sø'Lø'Eø'>ø'7ø'0ø')ø'"ø'ø'ø' ø'ø'ÿ÷'ø÷'ñ÷'ê÷'ã÷'Ü÷'Õ÷'Î÷'Ç÷'À÷'¹÷'²÷'«÷'¤÷'÷'–÷'÷'ˆ÷'÷'z÷'s÷'l÷'e÷'^÷'W÷'P÷'I÷'B÷';÷'4÷'-÷'&÷'÷'÷'÷' ÷'÷'üö'õö'îö'çö'àö'Ùö'Òö'Ëö'Äö'½ö'¶ö'¯ö'¨ö'¡ö'šö'“ö'Œö'…ö'~ö'wö'pö'iö'bö'[ö'Tö'Mö'Fö'?ö'8ö'1ö'*ö'#ö'ö'ö'ö'ö'ö'ùõ'òõ'ëõ'äõ'Ýõ'Öõ'Ïõ'Èõ'Áõ'ºõ'³õ'¬õ'¥õ'žõ'—õ'õ'‰õ'‚õ'{õ'tõ'mõ'fõ'_õ'Xõ'Qõ'Jõ'Cõ'<õ'5õ'.õ''õ' õ'õ'õ' õ'õ'ýô'öô'ïô'èô'áô'Úô'Óô'Ìô'Åô'¾ô'·ô'°ô'©ô'¢ô'›ô'”ô'ô'†ô'ô'xô'qô'jô'cô'\ô'Uô'Nô'Gô'@ô'9ô'2ô'+ô'$ô'ô'ô'ô'ô'ô'úó'óó'ìó'åó'Þó'×ó'Ðó'Éó'Âó'»ó'´ó'­ó'¦ó'Ÿó'˜ó'‘ó'Šó'ƒó'|ó'uó'nó'gó'`ó'Yó'Ró'Kó'Dó'=ó'6ó'/ó'(ó'!ó'ó'ó' ó'ó'þò'÷ò'ðò'éò'âò'Ûò'Ôò'Íò'Æò'¿ò'¸ò'±ò'ªò'£ò'œò'•ò'Žò'‡ò'€ò'yò'rò'kò'dò']ò'Vò'Oò'Hò'Aò':ò'3ò',ò'%ò'ò'ò'ò' ò'ò'ûñ'ôñ'íñ'æñ'ßñ'Øñ'Ññ'Êñ'Ãñ'¼ñ'µñ'®ñ'§ñ' ñ'™ñ'’ñ'‹ñ'„ñ'}ñ'vñ'oñ'hñ'añ'Zñ'Sñ'Lñ'Eñ'>ñ'7ñ'0ñ')ñ'"ñ'ñ'ñ' ñ'ñ'ÿð'øð'ñð'êð'ãð'Üð'Õð'Îð'Çð'Àð'¹ð'²ð'«ð'¤ð'ð'–ð'ð'ˆð'ð'zð'sð'lð'eð'^ð'Wð'Pð'Ið'Bð';ð'4ð'-ð'&ð'ð'ð'ð' ð'ð'üï'õï'îï'çï'àï'Ùï'Òï'Ëï'Äï'½ï'¶ï'¯ï'¨ï'¡ï'šï'“ï'Œï'…ï'~ï'wï'pï'iï'bï'[ï'Tï'Mï'Fï'?ï'8ï'1ï'*ï'#ï'ï'ï'ï'ï'ï'ùî'òî'ëî'äî'Ýî'Öî'Ïî'Èî'Áî'ºî'³î'¬î'¥î'žî'—î'î'‰î'‚î'{î'tî'mî'fî'_î'Xî'Qî'Jî'Cî'<î'5î'.î''î' î'î'î' î'î'ýí'öí'ïí'èí'áí'Úí'Óí'Ìí'Åí'¾í'·í'°í'©í'¢í'›í'”í'í'†í'í'xí'qí'jí'cí'\í'Uí'Ní'Gí'@í'9í'2í'+í'$í'í'í'í'í'í'úì'óì'ìì'åì'Þì'×ì'Ðì'Éì'Âì'»ì'´ì'­ì'¦ì'Ÿì'˜ì'‘ì'Šì'ƒì'|ì'uì'nì'gì'`ì'Yì'Rì'Kì'Dì'=ì'6ì'/ì'(ì'!ì'ì'ì' ì'ì'þë'÷ë'ðë'éë'âë'Ûë'Ôë'Íë'Æë'¿ë'¸ë'±ë'ªë'£ë'œë'•ë'Žë'‡ë'€ë'yë'rë'kë'dë']ë'Vë'Oë'Hë'Aë':ë'3ë',ë'%ë'ë'ë'ë' ë'ë'ûê'ôê'íê'æê'ßê'Øê'Ñê'Êê'Ãê'¼ê'µê'®ê'§ê' ê'™ê'’ê'‹ê'„ê'}ê'vê'oê'hê'aê'Zê'Sê'Lê'Eê'>ê'7ê'0ê')ê'"ê'ê'ê' ê'ê'ÿé'øé'ñé'êé'ãé'Üé'Õé'Îé'Çé'Àé'¹é'²é'«é'¤é'é'–é'é'ˆé'é'zé'sé'lé'eé'^é'Wé'Pé'Ié'Bé';é'4é'-é'&é'é'é'é' é'é'üè'õè'îè'çè'àè'Ùè'Òè'Ëè'Äè'½è'¶è'¯è'¨è'¡è'šè'“è'Œè'…è'~è'wè'pè'iè'bè'[è'Tè'Mè'Fè'?è'8è'1è'*è'#è'è'è'è'è'è'ùç'òç'ëç'äç'Ýç'Öç'Ïç'Èç'Áç'ºç'³ç'¬ç'¥ç'žç'—ç'ç'‰ç'‚ç'{ç'tç'mç'fç'_ç'Xç'Qç'Jç'Cç'<ç'5ç'.ç''ç' ç'ç'ç' ç'ç'ýæ'öæ'ïæ'èæ'áæ'Úæ'Óæ'Ìæ'Åæ'¾æ'·æ'°æ'©æ'¢æ'›æ'”æ'æ'†æ'æ'xæ'qæ'jæ'cæ'\æ'Uæ'Næ'Gæ'@æ'9æ'2æ'+æ'$æ'æ'æ'æ'æ'æ'úå'óå'ìå'åå'Þå'×å'Ðå'Éå'Âå'»å'´å'­å'¦å'Ÿå'˜å'‘å'Šå'ƒå'|å'uå'nå'gå'`å'Yå'Rå'Kå'Då'=å'6å'/å'(å'!å'å'å' å'å'þä'÷ä'ðä'éä'âä'Ûä'Ôä'Íä'Æä'¿ä'¸ä'±ä'ªä'£ä'œä'•ä'Žä'‡ä'€ä'yä'rä'kä'dä']ä'Vä'Oä'Hä'Aä':ä'3ä',ä'%ä'ä'ä'ä' ä'ä'ûã'ôã'íã'æã'ßã'Øã'Ñã'Êã'Ãã'¼ã'µã'®ã'§ã' ã'™ã'’ã'‹ã'„ã'}ã'vã'oã'hã'aã'Zã'Sã'Lã'Eã'>ã'7ã'0ã')ã'"ã'ã'ã' ã'ã'ÿâ'øâ'ñâ'êâ'ãâ'Üâ'Õâ'Îâ'Çâ'Àâ'¹â'²â'«â'¤â'â'–â'â'ˆâ'â'zâ'sâ'lâ'eâ'^â'Wâ'Pâ'Iâ'Bâ';â'4â'-â'&â'â'â'â' â'â'üá'õá'îá'çá'àá'Ùá'Òá'Ëá'Äá'½á'¶á'¯á'¨á'¡á'šá'“á'Œá'…á'~á'wá'pá'iá'bá'[á'Tá'Má'Fá'?á'8á'1á'*á'#á'á'á'á'á'á'ùà'òà'ëà'äà'Ýà'Öà'Ïà'Èà'Áà'ºà'³à'¬à'¥à'žà'—à'à'‰à'‚à'{à'tà'mà'fà'_à'Xà'Qà'Jà'Cà'<à'5à'.à''à' à'à'à' à'à'ýß'öß'ïß'èß'áß'Úß'Óß'Ìß'Åß'¾ß'·ß'°ß'©ß'¢ß'›ß'”ß'ß'†ß'ß'xß'qß'jß'cß'\ß'Uß'Nß'Gß'@ß'9ß'2ß'+ß'$ß'ß'ß'ß'ß'ß'úÞ'óÞ'ìÞ'åÞ'ÞÞ'×Þ'ÐÞ'ÉÞ'ÂÞ'»Þ'´Þ'­Þ'¦Þ'ŸÞ'˜Þ'‘Þ'ŠÞ'ƒÞ'|Þ'uÞ'nÞ'gÞ'`Þ'YÞ'RÞ'KÞ'DÞ'=Þ'6Þ'/Þ'(Þ'!Þ'Þ'Þ' Þ'Þ'þÝ'÷Ý'ðÝ'éÝ'âÝ'ÛÝ'ÔÝ'ÍÝ'ÆÝ'¿Ý'¸Ý'±Ý'ªÝ'£Ý'œÝ'•Ý'ŽÝ'‡Ý'€Ý'yÝ'rÝ'kÝ'dÝ']Ý'VÝ'OÝ'HÝ'AÝ':Ý'3Ý',Ý'%Ý'Ý'Ý'Ý' Ý'Ý'ûÜ'ôÜ'íÜ'æÜ'ßÜ'ØÜ'ÑÜ'ÊÜ'ÃÜ'¼Ü'µÜ'®Ü'§Ü' Ü'™Ü'’Ü'‹Ü'„Ü'}Ü'vÜ'oÜ'hÜ'aÜ'ZÜ'SÜ'LÜ'EÜ'>Ü'7Ü'0Ü')Ü'"Ü'Ü'Ü' Ü'Ü'ÿÛ'øÛ'ñÛ'êÛ'ãÛ'ÜÛ'ÕÛ'ÎÛ'ÇÛ'ÀÛ'¹Û'²Û'«Û'¤Û'Û'–Û'Û'ˆÛ'Û'zÛ'sÛ'lÛ'eÛ'^Û'WÛ'PÛ'IÛ'BÛ';Û'4Û'-Û'&Û'Û'Û'Û' Û'Û'üÚ'õÚ'îÚ'çÚ'àÚ'ÙÚ'ÒÚ'ËÚ'ÄÚ'½Ú'¶Ú'¯Ú'¨Ú'¡Ú'šÚ'“Ú'ŒÚ'…Ú'~Ú'wÚ'pÚ'iÚ'bÚ'[Ú'TÚ'MÚ'FÚ'?Ú'8Ú'1Ú'*Ú'#Ú'Ú'Ú'Ú'Ú'Ú'ùÙ'òÙ'ëÙ'äÙ'ÝÙ'ÖÙ'ÏÙ'ÈÙ'ÁÙ'ºÙ'³Ù'¬Ù'¥Ù'žÙ'—Ù'Ù'‰Ù'‚Ù'{Ù'tÙ'mÙ'fÙ'_Ù'XÙ'QÙ'JÙ'CÙ'<Ù'5Ù'.Ù''Ù' Ù'Ù'Ù' Ù'Ù'ýØ'öØ'ïØ'èØ'áØ'ÚØ'ÓØ'ÌØ'ÅØ'¾Ø'·Ø'°Ø'©Ø'¢Ø'›Ø'”Ø'Ø'†Ø'Ø'xØ'qØ'jØ'cØ'\Ø'UØ'NØ'GØ'@Ø'9Ø'2Ø'+Ø'$Ø'Ø'Ø'Ø'Ø'Ø'ú×'ó×'ì×'å×'Þ×'××'Ð×'É×'Â×'»×'´×'­×'¦×'Ÿ×'˜×'‘×'Š×'ƒ×'|×'u×'n×'g×'`×'Y×'R×'K×'D×'=×'6×'/×'(×'!×'×'×' ×'×'þÖ'÷Ö'ðÖ'éÖ'âÖ'ÛÖ'ÔÖ'ÍÖ'ÆÖ'¿Ö'¸Ö'±Ö'ªÖ'£Ö'œÖ'•Ö'ŽÖ'‡Ö'€Ö'yÖ'rÖ'kÖ'dÖ']Ö'VÖ'OÖ'HÖ'AÖ':Ö'3Ö',Ö'%Ö'Ö'Ö'Ö' Ö'Ö'ûÕ'ôÕ'íÕ'æÕ'ßÕ'ØÕ'ÑÕ'ÊÕ'ÃÕ'¼Õ'µÕ'®Õ'§Õ' Õ'™Õ'’Õ'‹Õ'„Õ'}Õ'vÕ'oÕ'hÕ'aÕ'ZÕ'SÕ'LÕ'EÕ'>Õ'7Õ'0Õ')Õ'"Õ'Õ'Õ' Õ'Õ'ÿÔ'øÔ'ñÔ'êÔ'ãÔ'ÜÔ'ÕÔ'ÎÔ'ÇÔ'ÀÔ'¹Ô'²Ô'«Ô'¤Ô'Ô'–Ô'Ô'ˆÔ'Ô'zÔ'sÔ'lÔ'eÔ'^Ô'WÔ'PÔ'IÔ'BÔ';Ô'4Ô'-Ô'&Ô'Ô'Ô'Ô' Ô'Ô'üÓ'õÓ'îÓ'çÓ'àÓ'ÙÓ'ÒÓ'ËÓ'ÄÓ'½Ó'¶Ó'¯Ó'¨Ó'¡Ó'šÓ'“Ó'ŒÓ'…Ó'~Ó'wÓ'pÓ'iÓ'bÓ'[Ó'TÓ'MÓ'FÓ'?Ó'8Ó'1Ó'*Ó'#Ó'Ó'Ó'Ó'Ó'Ó'ùÒ'òÒ'ëÒ'äÒ'ÝÒ'ÖÒ'ÏÒ'ÈÒ'ÁÒ'ºÒ'³Ò'¬Ò'¥Ò'žÒ'—Ò'Ò'‰Ò'‚Ò'{Ò'tÒ'mÒ'fÒ'_Ò'XÒ'QÒ'JÒ'CÒ'<Ò'5Ò'.Ò''Ò' Ò'Ò'Ò' Ò'Ò'ýÑ'öÑ'ïÑ'èÑ'áÑ'ÚÑ'ÓÑ'ÌÑ'ÅÑ'¾Ñ'·Ñ'°Ñ'©Ñ'¢Ñ'›Ñ'”Ñ'Ñ'†Ñ'Ñ'xÑ'qÑ'jÑ'cÑ'\Ñ'UÑ'NÑ'GÑ'@Ñ'9Ñ'2Ñ'+Ñ'$Ñ'Ñ'Ñ'Ñ'Ñ'Ñ'úÐ'óÐ'ìÐ'åÐ'ÞÐ'×Ð'ÐÐ'ÉÐ'ÂÐ'»Ð'´Ð'­Ð'¦Ð'ŸÐ'˜Ð'‘Ð'ŠÐ'ƒÐ'|Ð'uÐ'nÐ'gÐ'`Ð'YÐ'RÐ'KÐ'DÐ'=Ð'6Ð'/Ð'(Ð'!Ð'Ð'Ð' Ð'Ð'þÏ'÷Ï'ðÏ'éÏ'âÏ'ÛÏ'ÔÏ'ÍÏ'ÆÏ'¿Ï'¸Ï'±Ï'ªÏ'£Ï'œÏ'•Ï'ŽÏ'‡Ï'€Ï'yÏ'rÏ'kÏ'dÏ']Ï'VÏ'OÏ'HÏ'AÏ':Ï'3Ï',Ï'%Ï'Ï'Ï'Ï' Ï'Ï'ûÎ'ôÎ'íÎ'æÎ'ßÎ'ØÎ'ÑÎ'ÊÎ'ÃÎ'¼Î'µÎ'®Î'§Î' Î'™Î'’Î'‹Î'„Î'}Î'vÎ'oÎ'hÎ'aÎ'ZÎ'SÎ'LÎ'EÎ'>Î'7Î'0Î')Î'"Î'Î'Î' Î'Î'ÿÍ'øÍ'ñÍ'êÍ'ãÍ'ÜÍ'ÕÍ'ÎÍ'ÇÍ'ÀÍ'¹Í'²Í'«Í'¤Í'Í'–Í'Í'ˆÍ'Í'zÍ'sÍ'lÍ'eÍ'^Í'WÍ'PÍ'IÍ'BÍ';Í'4Í'-Í'&Í'Í'Í'Í' Í'Í'üÌ'õÌ'îÌ'çÌ'àÌ'ÙÌ'ÒÌ'ËÌ'ÄÌ'½Ì'¶Ì'¯Ì'¨Ì'¡Ì'šÌ'“Ì'ŒÌ'…Ì'~Ì'wÌ'pÌ'iÌ'bÌ'[Ì'TÌ'MÌ'FÌ'?Ì'8Ì'1Ì'*Ì'#Ì'Ì'Ì'Ì'Ì'Ì'ùË'òË'ëË'äË'ÝË'ÖË'ÏË'ÈË'ÁË'ºË'³Ë'¬Ë'¥Ë'žË'—Ë'Ë'‰Ë'‚Ë'{Ë'tË'mË'fË'_Ë'XË'QË'JË'CË'<Ë'5Ë'.Ë''Ë' Ë'Ë'Ë' Ë'Ë'ýÊ'öÊ'ïÊ'èÊ'áÊ'ÚÊ'ÓÊ'ÌÊ'ÅÊ'¾Ê'·Ê'°Ê'©Ê'¢Ê'›Ê'”Ê'Ê'†Ê'Ê'xÊ'qÊ'jÊ'cÊ'\Ê'UÊ'NÊ'GÊ'@Ê'9Ê'2Ê'+Ê'$Ê'Ê'Ê'Ê'Ê'Ê'úÉ'óÉ'ìÉ'åÉ'ÞÉ'×É'ÐÉ'ÉÉ'ÂÉ'»É'´É'­É'¦É'ŸÉ'˜É'‘É'ŠÉ'ƒÉ'|É'uÉ'nÉ'gÉ'`É'YÉ'RÉ'KÉ'DÉ'=É'6É'/É'(É'!É'É'É' É'É'þÈ'÷È'ðÈ'éÈ'âÈ'ÛÈ'ÔÈ'ÍÈ'ÆÈ'¿È'¸È'±È'ªÈ'£È'œÈ'•È'ŽÈ'‡È'€È'yÈ'rÈ'kÈ'dÈ']È'VÈ'OÈ'HÈ'AÈ':È'3È',È'%È'È'È'È' È'È'ûÇ'ôÇ'íÇ'æÇ'ßÇ'ØÇ'ÑÇ'ÊÇ'ÃÇ'¼Ç'µÇ'®Ç'§Ç' Ç'™Ç'’Ç'‹Ç'„Ç'}Ç'vÇ'oÇ'hÇ'aÇ'ZÇ'SÇ'LÇ'EÇ'>Ç'7Ç'0Ç')Ç'"Ç'Ç'Ç' Ç'Ç'ÿÆ'øÆ'ñÆ'êÆ'ãÆ'ÜÆ'ÕÆ'ÎÆ'ÇÆ'ÀÆ'¹Æ'²Æ'«Æ'¤Æ'Æ'–Æ'Æ'ˆÆ'Æ'zÆ'sÆ'lÆ'eÆ'^Æ'WÆ'PÆ'IÆ'BÆ';Æ'4Æ'-Æ'&Æ'Æ'Æ'Æ' Æ'Æ'üÅ'õÅ'îÅ'çÅ'àÅ'ÙÅ'ÒÅ'ËÅ'ÄÅ'½Å'¶Å'¯Å'¨Å'¡Å'šÅ'“Å'ŒÅ'…Å'~Å'wÅ'pÅ'iÅ'bÅ'[Å'TÅ'MÅ'FÅ'?Å'8Å'1Å'*Å'#Å'Å'Å'Å'Å'Å'ùÄ'òÄ'ëÄ'äÄ'ÝÄ'ÖÄ'ÏÄ'ÈÄ'ÁÄ'ºÄ'³Ä'¬Ä'¥Ä'žÄ'—Ä'Ä'‰Ä'‚Ä'{Ä'tÄ'mÄ'fÄ'_Ä'XÄ'QÄ'JÄ'CÄ'<Ä'5Ä'.Ä''Ä' Ä'Ä'Ä' Ä'Ä'ýÃ'öÃ'ïÃ'èÃ'áÃ'ÚÃ'ÓÃ'ÌÃ'ÅÃ'¾Ã'·Ã'°Ã'©Ã'¢Ã'›Ã'”Ã'Ã'†Ã'Ã'xÃ'qÃ'jÃ'cÃ'\Ã'UÃ'NÃ'GÃ'@Ã'9Ã'2Ã'+Ã'$Ã'Ã'Ã'Ã'Ã'Ã'úÂ'óÂ'ìÂ'åÂ'ÞÂ'×Â'ÐÂ'ÉÂ'ÂÂ'»Â'´Â'­Â'¦Â'ŸÂ'˜Â'‘Â'ŠÂ'ƒÂ'|Â'uÂ'nÂ'gÂ'`Â'YÂ'RÂ'KÂ'DÂ'=Â'6Â'/Â'(Â'!Â'Â'Â' Â'Â'þÁ'÷Á'ðÁ'éÁ'âÁ'ÛÁ'ÔÁ'ÍÁ'ÆÁ'¿Á'¸Á'±Á'ªÁ'£Á'œÁ'•Á'ŽÁ'‡Á'€Á'yÁ'rÁ'kÁ'dÁ']Á'VÁ'OÁ'HÁ'AÁ':Á'3Á',Á'%Á'Á'Á'Á' Á'Á'ûÀ'ôÀ'íÀ'æÀ'ßÀ'ØÀ'ÑÀ'ÊÀ'ÃÀ'¼À'µÀ'®À'§À' À'™À'’À'‹À'„À'}À'vÀ'oÀ'hÀ'aÀ'ZÀ'SÀ'LÀ'EÀ'>À'7À'0À')À'"À'À'À' À'À'ÿ¿'ø¿'ñ¿'ê¿'ã¿'Ü¿'Õ¿'ο'Ç¿'À¿'¹¿'²¿'«¿'¤¿'¿'–¿'¿'ˆ¿'¿'z¿'s¿'l¿'e¿'^¿'W¿'P¿'I¿'B¿';¿'4¿'-¿'&¿'¿'¿'¿' ¿'¿'ü¾'õ¾'î¾'ç¾'à¾'Ù¾'Ò¾'˾'ľ'½¾'¶¾'¯¾'¨¾'¡¾'š¾'“¾'Œ¾'…¾'~¾'w¾'p¾'i¾'b¾'[¾'T¾'M¾'F¾'?¾'8¾'1¾'*¾'#¾'¾'¾'¾'¾'¾'ù½'ò½'ë½'ä½'ݽ'Ö½'Ͻ'Ƚ'Á½'º½'³½'¬½'¥½'ž½'—½'½'‰½'‚½'{½'t½'m½'f½'_½'X½'Q½'J½'C½'<½'5½'.½''½' ½'½'½' ½'½'ý¼'ö¼'ï¼'è¼'á¼'Ú¼'Ó¼'̼'ż'¾¼'·¼'°¼'©¼'¢¼'›¼'”¼'¼'†¼'¼'x¼'q¼'j¼'c¼'\¼'U¼'N¼'G¼'@¼'9¼'2¼'+¼'$¼'¼'¼'¼'¼'¼'ú»'ó»'ì»'å»'Þ»'×»'л'É»'»'»»'´»'­»'¦»'Ÿ»'˜»'‘»'Š»'ƒ»'|»'u»'n»'g»'`»'Y»'R»'K»'D»'=»'6»'/»'(»'!»'»'»' »'»'þº'÷º'ðº'éº'âº'Ûº'Ôº'ͺ'ƺ'¿º'¸º'±º'ªº'£º'œº'•º'Žº'‡º'€º'yº'rº'kº'dº']º'Vº'Oº'Hº'Aº':º'3º',º'%º'º'º'º' º'º'û¹'ô¹'í¹'æ¹'ß¹'ع'ѹ'ʹ'ù'¼¹'µ¹'®¹'§¹' ¹'™¹'’¹'‹¹'„¹'}¹'v¹'o¹'h¹'a¹'Z¹'S¹'L¹'E¹'>¹'7¹'0¹')¹'"¹'¹'¹' ¹'¹'ÿ¸'ø¸'ñ¸'ê¸'ã¸'ܸ'Õ¸'θ'Ǹ'À¸'¹¸'²¸'«¸'¤¸'¸'–¸'¸'ˆ¸'¸'z¸'s¸'l¸'e¸'^¸'W¸'P¸'I¸'B¸';¸'4¸'-¸'&¸'¸'¸'¸' ¸'¸'ü·'õ·'î·'ç·'à·'Ù·'Ò·'Ë·'Ä·'½·'¶·'¯·'¨·'¡·'š·'“·'Œ·'…·'~·'w·'p·'i·'b·'[·'T·'M·'F·'?·'8·'1·'*·'#·'·'·'·'·'·'ù¶'ò¶'ë¶'ä¶'ݶ'Ö¶'϶'ȶ'Á¶'º¶'³¶'¬¶'¥¶'ž¶'—¶'¶'‰¶'‚¶'{¶'t¶'m¶'f¶'_¶'X¶'Q¶'J¶'C¶'<¶'5¶'.¶''¶' ¶'¶'¶' ¶'¶'ýµ'öµ'ïµ'èµ'áµ'Úµ'Óµ'̵'ŵ'¾µ'·µ'°µ'©µ'¢µ'›µ'”µ'µ'†µ'µ'xµ'qµ'jµ'cµ'\µ'Uµ'Nµ'Gµ'@µ'9µ'2µ'+µ'$µ'µ'µ'µ'µ'µ'ú´'ó´'ì´'å´'Þ´'×´'д'É´'´'»´'´´'­´'¦´'Ÿ´'˜´'‘´'Š´'ƒ´'|´'u´'n´'g´'`´'Y´'R´'K´'D´'=´'6´'/´'(´'!´'´'´' ´'´'þ³'÷³'ð³'é³'â³'Û³'Ô³'ͳ'Ƴ'¿³'¸³'±³'ª³'£³'œ³'•³'޳'‡³'€³'y³'r³'k³'d³']³'V³'O³'H³'A³':³'3³',³'%³'³'³'³' ³'³'û²'ô²'í²'æ²'ß²'ز'Ѳ'ʲ'ò'¼²'µ²'®²'§²' ²'™²'’²'‹²'„²'}²'v²'o²'h²'a²'Z²'S²'L²'E²'>²'7²'0²')²'"²'²'²' ²'²'ÿ±'ø±'ñ±'ê±'ã±'ܱ'Õ±'α'DZ'À±'¹±'²±'«±'¤±'±'–±'±'ˆ±'±'z±'s±'l±'e±'^±'W±'P±'I±'B±';±'4±'-±'&±'±'±'±' ±'±'ü°'õ°'î°'ç°'à°'Ù°'Ò°'˰'İ'½°'¶°'¯°'¨°'¡°'š°'“°'Œ°'…°'~°'w°'p°'i°'b°'[°'T°'M°'F°'?°'8°'1°'*°'#°'°'°'°'°'°'ù¯'ò¯'ë¯'ä¯'ݯ'Ö¯'ϯ'ȯ'Á¯'º¯'³¯'¬¯'¥¯'ž¯'—¯'¯'‰¯'‚¯'{¯'t¯'m¯'f¯'_¯'X¯'Q¯'J¯'C¯'<¯'5¯'.¯''¯' ¯'¯'¯' ¯'¯'ý®'ö®'ï®'è®'á®'Ú®'Ó®'Ì®'Å®'¾®'·®'°®'©®'¢®'›®'”®'®'†®'®'x®'q®'j®'c®'\®'U®'N®'G®'@®'9®'2®'+®'$®'®'®'®'®'®'ú­'ó­'ì­'å­'Þ­'×­'Э'É­'­'»­'´­'­­'¦­'Ÿ­'˜­'‘­'Š­'ƒ­'|­'u­'n­'g­'`­'Y­'R­'K­'D­'=­'6­'/­'(­'!­'­'­' ­'­'þ¬'÷¬'ð¬'é¬'â¬'Û¬'Ô¬'ͬ'Ƭ'¿¬'¸¬'±¬'ª¬'£¬'œ¬'•¬'ެ'‡¬'€¬'y¬'r¬'k¬'d¬']¬'V¬'O¬'H¬'A¬':¬'3¬',¬'%¬'¬'¬'¬' ¬'¬'û«'ô«'í«'æ«'ß«'Ø«'Ñ«'Ê«'ë'¼«'µ«'®«'§«' «'™«'’«'‹«'„«'}«'v«'o«'h«'a«'Z«'S«'L«'E«'>«'7«'0«')«'"«'«'«' «'«'ÿª'øª'ñª'êª'ãª'ܪ'Õª'Ϊ'Ǫ'Àª'¹ª'²ª'«ª'¤ª'ª'–ª'ª'ˆª'ª'zª'sª'lª'eª'^ª'Wª'Pª'Iª'Bª';ª'4ª'-ª'&ª'ª'ª'ª' ª'ª'ü©'õ©'î©'ç©'à©'Ù©'Ò©'Ë©'Ä©'½©'¶©'¯©'¨©'¡©'š©'“©'Œ©'…©'~©'w©'p©'i©'b©'[©'T©'M©'F©'?©'8©'1©'*©'#©'©'©'©'©'©'ù¨'ò¨'ë¨'ä¨'ݨ'Ö¨'Ϩ'Ȩ'Á¨'º¨'³¨'¬¨'¥¨'ž¨'—¨'¨'‰¨'‚¨'{¨'t¨'m¨'f¨'_¨'X¨'Q¨'J¨'C¨'<¨'5¨'.¨''¨' ¨'¨'¨' ¨'¨'ý§'ö§'ï§'è§'á§'Ú§'Ó§'̧'ŧ'¾§'·§'°§'©§'¢§'›§'”§'§'†§'§'x§'q§'j§'c§'\§'U§'N§'G§'@§'9§'2§'+§'$§'§'§'§'§'§'ú¦'ó¦'ì¦'å¦'Þ¦'צ'Ц'ɦ'¦'»¦'´¦'­¦'¦¦'Ÿ¦'˜¦'‘¦'Ц'ƒ¦'|¦'u¦'n¦'g¦'`¦'Y¦'R¦'K¦'D¦'=¦'6¦'/¦'(¦'!¦'¦'¦' ¦'¦'þ¥'÷¥'ð¥'é¥'â¥'Û¥'Ô¥'Í¥'Æ¥'¿¥'¸¥'±¥'ª¥'£¥'œ¥'•¥'Ž¥'‡¥'€¥'y¥'r¥'k¥'d¥']¥'V¥'O¥'H¥'A¥':¥'3¥',¥'%¥'¥'¥'¥' ¥'¥'û¤'ô¤'í¤'æ¤'ߤ'ؤ'Ѥ'ʤ'ä'¼¤'µ¤'®¤'§¤' ¤'™¤'’¤'‹¤'„¤'}¤'v¤'o¤'h¤'a¤'Z¤'S¤'L¤'E¤'>¤'7¤'0¤')¤'"¤'¤'¤' ¤'¤'ÿ£'ø£'ñ£'ê£'ã£'Ü£'Õ£'Σ'Ç£'À£'¹£'²£'«£'¤£'£'–£'£'ˆ£'£'z£'s£'l£'e£'^£'W£'P£'I£'B£';£'4£'-£'&£'£'£'£' £'£'ü¢'õ¢'î¢'ç¢'à¢'Ù¢'Ò¢'Ë¢'Ä¢'½¢'¶¢'¯¢'¨¢'¡¢'š¢'“¢'Œ¢'…¢'~¢'w¢'p¢'i¢'b¢'[¢'T¢'M¢'F¢'?¢'8¢'1¢'*¢'#¢'¢'¢'¢'¢'¢'ù¡'ò¡'ë¡'ä¡'Ý¡'Ö¡'Ï¡'È¡'Á¡'º¡'³¡'¬¡'¥¡'ž¡'—¡'¡'‰¡'‚¡'{¡'t¡'m¡'f¡'_¡'X¡'Q¡'J¡'C¡'<¡'5¡'.¡''¡' ¡'¡'¡' ¡'¡'ý 'ö 'ï 'è 'á 'Ú 'Ó 'Ì 'Å '¾ '· '° '© '¢ '› '” ' '† ' 'x 'q 'j 'c '\ 'U 'N 'G '@ '9 '2 '+ '$ ' ' ' ' ' 'úŸ'óŸ'ìŸ'åŸ'ÞŸ'ן'П'ÉŸ'Ÿ'»Ÿ'´Ÿ'­Ÿ'¦Ÿ'ŸŸ'˜Ÿ'‘Ÿ'ŠŸ'ƒŸ'|Ÿ'uŸ'nŸ'gŸ'`Ÿ'YŸ'RŸ'KŸ'DŸ'=Ÿ'6Ÿ'/Ÿ'(Ÿ'!Ÿ'Ÿ'Ÿ' Ÿ'Ÿ'þž'÷ž'ðž'éž'âž'Ûž'Ôž'Íž'Æž'¿ž'¸ž'±ž'ªž'£ž'œž'•ž'Žž'‡ž'€ž'yž'rž'kž'dž']ž'Vž'Ož'Hž'Až':ž'3ž',ž'%ž'ž'ž'ž' ž'ž'û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿœ'øœ'ñœ'êœ'ãœ'Üœ'Õœ'Μ'Çœ'Àœ'¹œ'²œ'«œ'¤œ'œ'–œ'œ'ˆœ'œ'zœ'sœ'lœ'eœ'^œ'Wœ'Pœ'Iœ'Bœ';œ'4œ'-œ'&œ'œ'œ'œ' œ'œ'ü›'õ›'î›'ç›'à›'Ù›'Ò›'Ë›'Ä›'½›'¶›'¯›'¨›'¡›'š›'“›'Œ›'…›'~›'w›'p›'i›'b›'[›'T›'M›'F›'?›'8›'1›'*›'#›'›'›'›'›'›'ùš'òš'ëš'äš'Ýš'Öš'Ïš'Èš'Áš'ºš'³š'¬š'¥š'žš'—š'š'‰š'‚š'{š'tš'mš'fš'_š'Xš'Qš'Jš'Cš'<š'5š'.š''š' š'š'š' š'š'ý™'ö™'ï™'è™'á™'Ú™'Ó™'Ì™'Å™'¾™'·™'°™'©™'¢™'›™'”™'™'†™'™'x™'q™'j™'c™'\™'U™'N™'G™'@™'9™'2™'+™'$™'™'™'™'™'™'ú˜'ó˜'ì˜'å˜'Þ˜'ט'И'ɘ'˜'»˜'´˜'­˜'¦˜'Ÿ˜'˜˜'‘˜'Š˜'ƒ˜'|˜'u˜'n˜'g˜'`˜'Y˜'R˜'K˜'D˜'=˜'6˜'/˜'(˜'!˜'˜'˜' ˜'˜'þ—'÷—'ð—'é—'â—'Û—'Ô—'Í—'Æ—'¿—'¸—'±—'ª—'£—'œ—'•—'Ž—'‡—'€—'y—'r—'k—'d—']—'V—'O—'H—'A—':—'3—',—'%—'—'—'—' —'—'û–'ô–'í–'æ–'ß–'Ø–'Ñ–'Ê–'Ö'¼–'µ–'®–'§–' –'™–'’–'‹–'„–'}–'v–'o–'h–'a–'Z–'S–'L–'E–'>–'7–'0–')–'"–'–'–' –'–'ÿ•'ø•'ñ•'ê•'ã•'Ü•'Õ•'Ε'Ç•'À•'¹•'²•'«•'¤•'•'–•'•'ˆ•'•'z•'s•'l•'e•'^•'W•'P•'I•'B•';•'4•'-•'&•'•'•'•' •'•'ü”'õ”'î”'ç”'à”'Ù”'Ò”'Ë”'Ä”'½”'¶”'¯”'¨”'¡”'š”'“”'Œ”'…”'~”'w”'p”'i”'b”'[”'T”'M”'F”'?”'8”'1”'*”'#”'”'”'”'”'”'ù“'ò“'ë“'ä“'Ý“'Ö“'Ï“'È“'Á“'º“'³“'¬“'¥“'ž“'—“'“'‰“'‚“'{“'t“'m“'f“'_“'X“'Q“'J“'C“'<“'5“'.“''“' “'“'“' “'“'ý’'ö’'ï’'è’'á’'Ú’'Ó’'Ì’'Å’'¾’'·’'°’'©’'¢’'›’'”’'’'†’'’'x’'q’'j’'c’'\’'U’'N’'G’'@’'9’'2’'+’'$’'’'’'’'’'’'ú‘'ó‘'ì‘'å‘'Þ‘'ב'Б'É‘'‘'»‘'´‘'­‘'¦‘'Ÿ‘'˜‘'‘‘'Š‘'ƒ‘'|‘'u‘'n‘'g‘'`‘'Y‘'R‘'K‘'D‘'=‘'6‘'/‘'(‘'!‘'‘'‘' ‘'‘'þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿŽ'øŽ'ñŽ'êŽ'ãŽ'ÜŽ'ÕŽ'ÎŽ'ÇŽ'ÀŽ'¹Ž'²Ž'«Ž'¤Ž'Ž'–Ž'Ž'ˆŽ'Ž'zŽ'sŽ'lŽ'eŽ'^Ž'WŽ'PŽ'IŽ'BŽ';Ž'4Ž'-Ž'&Ž'Ž'Ž'Ž' Ž'Ž'ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ùŒ'òŒ'ëŒ'äŒ'ÝŒ'ÖŒ'ÏŒ'ÈŒ'ÁŒ'ºŒ'³Œ'¬Œ'¥Œ'žŒ'—Œ'Œ'‰Œ'‚Œ'{Œ'tŒ'mŒ'fŒ'_Œ'XŒ'QŒ'JŒ'CŒ'<Œ'5Œ'.Œ''Œ' Œ'Œ'Œ' Œ'Œ'ý‹'ö‹'ï‹'è‹'á‹'Ú‹'Ó‹'Ì‹'Å‹'¾‹'·‹'°‹'©‹'¢‹'›‹'”‹'‹'†‹'‹'x‹'q‹'j‹'c‹'\‹'U‹'N‹'G‹'@‹'9‹'2‹'+‹'$‹'‹'‹'‹'‹'‹'úŠ'óŠ'ìŠ'åŠ'ÞŠ'׊'Њ'ÉŠ'Š'»Š'´Š'­Š'¦Š'ŸŠ'˜Š'‘Š'ŠŠ'ƒŠ'|Š'uŠ'nŠ'gŠ'`Š'YŠ'RŠ'KŠ'DŠ'=Š'6Š'/Š'(Š'!Š'Š'Š' Š'Š'þ‰'÷‰'ð‰'é‰'â‰'Û‰'Ô‰'͉'Ɖ'¿‰'¸‰'±‰'ª‰'£‰'œ‰'•‰'މ'‡‰'€‰'y‰'r‰'k‰'d‰']‰'V‰'O‰'H‰'A‰':‰'3‰',‰'%‰'‰'‰'‰' ‰'‰'ûˆ'ôˆ'íˆ'æˆ'߈'؈'ш'ʈ'È'¼ˆ'µˆ'®ˆ'§ˆ' ˆ'™ˆ'’ˆ'‹ˆ'„ˆ'}ˆ'vˆ'oˆ'hˆ'aˆ'Zˆ'Sˆ'Lˆ'Eˆ'>ˆ'7ˆ'0ˆ')ˆ'"ˆ'ˆ'ˆ' ˆ'ˆ'ÿ‡'ø‡'ñ‡'ê‡'ã‡'܇'Õ‡'·'LJ'À‡'¹‡'²‡'«‡'¤‡'‡'–‡'‡'ˆ‡'‡'z‡'s‡'l‡'e‡'^‡'W‡'P‡'I‡'B‡';‡'4‡'-‡'&‡'‡'‡'‡' ‡'‡'ü†'õ†'î†'ç†'à†'Ù†'Ò†'ˆ'Ć'½†'¶†'¯†'¨†'¡†'š†'“†'Œ†'…†'~†'w†'p†'i†'b†'[†'T†'M†'F†'?†'8†'1†'*†'#†'†'†'†'†'†'ù…'ò…'ë…'ä…'Ý…'Ö…'Ï…'È…'Á…'º…'³…'¬…'¥…'ž…'—…'…'‰…'‚…'{…'t…'m…'f…'_…'X…'Q…'J…'C…'<…'5…'.…''…' …'…'…' …'…'ý„'ö„'ï„'è„'á„'Ú„'Ó„'Ì„'Å„'¾„'·„'°„'©„'¢„'›„'”„'„'†„'„'x„'q„'j„'c„'\„'U„'N„'G„'@„'9„'2„'+„'$„'„'„'„'„'„'úƒ'óƒ'ìƒ'åƒ'Þƒ'׃'Ѓ'Ƀ'ƒ'»ƒ'´ƒ'­ƒ'¦ƒ'Ÿƒ'˜ƒ'‘ƒ'Šƒ'ƒƒ'|ƒ'uƒ'nƒ'gƒ'`ƒ'Yƒ'Rƒ'Kƒ'Dƒ'=ƒ'6ƒ'/ƒ'(ƒ'!ƒ'ƒ'ƒ' ƒ'ƒ'þ‚'÷‚'ð‚'é‚'â‚'Û‚'Ô‚'Í‚'Æ‚'¿‚'¸‚'±‚'ª‚'£‚'œ‚'•‚'Ž‚'‡‚'€‚'y‚'r‚'k‚'d‚']‚'V‚'O‚'H‚'A‚':‚'3‚',‚'%‚'‚'‚'‚' ‚'‚'û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ€'ø€'ñ€'ê€'ã€'Ü€'Õ€'΀'Ç€'À€'¹€'²€'«€'¤€'€'–€'€'ˆ€'€'z€'s€'l€'e€'^€'W€'P€'I€'B€';€'4€'-€'&€'€'€'€' €'€'ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù~'ò~'ë~'ä~'Ý~'Ö~'Ï~'È~'Á~'º~'³~'¬~'¥~'ž~'—~'~'‰~'‚~'{~'t~'m~'f~'_~'X~'Q~'J~'C~'<~'5~'.~''~' ~'~'~' ~'~'ý}'ö}'ï}'è}'á}'Ú}'Ó}'Ì}'Å}'¾}'·}'°}'©}'¢}'›}'”}'}'†}'}'x}'q}'j}'c}'\}'U}'N}'G}'@}'9}'2}'+}'$}'}'}'}'}'}'ú|'ó|'ì|'å|'Þ|'×|'Ð|'É|'Â|'»|'´|'­|'¦|'Ÿ|'˜|'‘|'Š|'ƒ|'||'u|'n|'g|'`|'Y|'R|'K|'D|'=|'6|'/|'(|'!|'|'|' |'|'þ{'÷{'ð{'é{'â{'Û{'Ô{'Í{'Æ{'¿{'¸{'±{'ª{'£{'œ{'•{'Ž{'‡{'€{'y{'r{'k{'d{']{'V{'O{'H{'A{':{'3{',{'%{'{'{'{' {'{'ûz'ôz'íz'æz'ßz'Øz'Ñz'Êz'Ãz'¼z'µz'®z'§z' z'™z'’z'‹z'„z'}z'vz'oz'hz'az'Zz'Sz'Lz'Ez'>z'7z'0z')z'"z'z'z' z'z'ÿy'øy'ñy'êy'ãy'Üy'Õy'Îy'Çy'Ày'¹y'²y'«y'¤y'y'–y'y'ˆy'y'zy'sy'ly'ey'^y'Wy'Py'Iy'By';y'4y'-y'&y'y'y'y' y'y'üx'õx'îx'çx'àx'Ùx'Òx'Ëx'Äx'½x'¶x'¯x'¨x'¡x'šx'“x'Œx'…x'~x'wx'px'ix'bx'[x'Tx'Mx'Fx'?x'8x'1x'*x'#x'x'x'x'x'x'ùw'òw'ëw'äw'Ýw'Öw'Ïw'Èw'Áw'ºw'³w'¬w'¥w'žw'—w'w'‰w'‚w'{w'tw'mw'fw'_w'Xw'Qw'Jw'Cw's'7s'0s')s'"s's's' s's'ÿr'ør'ñr'êr'ãr'Ür'Õr'Îr'Çr'Àr'¹r'²r'«r'¤r'r'–r'r'ˆr'r'zr'sr'lr'er'^r'Wr'Pr'Ir'Br';r'4r'-r'&r'r'r'r' r'r'üq'õq'îq'çq'àq'Ùq'Òq'Ëq'Äq'½q'¶q'¯q'¨q'¡q'šq'“q'Œq'…q'~q'wq'pq'iq'bq'[q'Tq'Mq'Fq'?q'8q'1q'*q'#q'q'q'q'q'q'ùp'òp'ëp'äp'Ýp'Öp'Ïp'Èp'Áp'ºp'³p'¬p'¥p'žp'—p'p'‰p'‚p'{p'tp'mp'fp'_p'Xp'Qp'Jp'Cp'l'7l'0l')l'"l'l'l' l'l'ÿk'øk'ñk'êk'ãk'Ük'Õk'Îk'Çk'Àk'¹k'²k'«k'¤k'k'–k'k'ˆk'k'zk'sk'lk'ek'^k'Wk'Pk'Ik'Bk';k'4k'-k'&k'k'k'k' k'k'üj'õj'îj'çj'àj'Ùj'Òj'Ëj'Äj'½j'¶j'¯j'¨j'¡j'šj'“j'Œj'…j'~j'wj'pj'ij'bj'[j'Tj'Mj'Fj'?j'8j'1j'*j'#j'j'j'j'j'j'ùi'òi'ëi'äi'Ýi'Öi'Ïi'Èi'Ái'ºi'³i'¬i'¥i'ži'—i'i'‰i'‚i'{i'ti'mi'fi'_i'Xi'Qi'Ji'Ci'e'7e'0e')e'"e'e'e' e'e'ÿd'ød'ñd'êd'ãd'Üd'Õd'Îd'Çd'Àd'¹d'²d'«d'¤d'd'–d'd'ˆd'd'zd'sd'ld'ed'^d'Wd'Pd'Id'Bd';d'4d'-d'&d'd'd'd' d'd'üc'õc'îc'çc'àc'Ùc'Òc'Ëc'Äc'½c'¶c'¯c'¨c'¡c'šc'“c'Œc'…c'~c'wc'pc'ic'bc'[c'Tc'Mc'Fc'?c'8c'1c'*c'#c'c'c'c'c'c'ùb'òb'ëb'äb'Ýb'Öb'Ïb'Èb'Áb'ºb'³b'¬b'¥b'žb'—b'b'‰b'‚b'{b'tb'mb'fb'_b'Xb'Qb'Jb'Cb'^'7^'0^')^'"^'^'^' ^'^'ÿ]'ø]'ñ]'ê]'ã]'Ü]'Õ]'Î]'Ç]'À]'¹]'²]'«]'¤]']'–]']'ˆ]']'z]'s]'l]'e]'^]'W]'P]'I]'B]';]'4]'-]'&]']']']' ]']'ü\'õ\'î\'ç\'à\'Ù\'Ò\'Ë\'Ä\'½\'¶\'¯\'¨\'¡\'š\'“\'Œ\'…\'~\'w\'p\'i\'b\'[\'T\'M\'F\'?\'8\'1\'*\'#\'\'\'\'\'\'ù['ò['ë['ä['Ý['Ö['Ï['È['Á['º['³['¬['¥['ž['—['['‰['‚['{['t['m['f['_['X['Q['J['C['<['5['.[''[' ['['[' ['['ýZ'öZ'ïZ'èZ'áZ'ÚZ'ÓZ'ÌZ'ÅZ'¾Z'·Z'°Z'©Z'¢Z'›Z'”Z'Z'†Z'Z'xZ'qZ'jZ'cZ'\Z'UZ'NZ'GZ'@Z'9Z'2Z'+Z'$Z'Z'Z'Z'Z'Z'úY'óY'ìY'åY'ÞY'×Y'ÐY'ÉY'ÂY'»Y'´Y'­Y'¦Y'ŸY'˜Y'‘Y'ŠY'ƒY'|Y'uY'nY'gY'`Y'YY'RY'KY'DY'=Y'6Y'/Y'(Y'!Y'Y'Y' Y'Y'þX'÷X'ðX'éX'âX'ÛX'ÔX'ÍX'ÆX'¿X'¸X'±X'ªX'£X'œX'•X'ŽX'‡X'€X'yX'rX'kX'dX']X'VX'OX'HX'AX':X'3X',X'%X'X'X'X' X'X'ûW'ôW'íW'æW'ßW'ØW'ÑW'ÊW'ÃW'¼W'µW'®W'§W' W'™W'’W'‹W'„W'}W'vW'oW'hW'aW'ZW'SW'LW'EW'>W'7W'0W')W'"W'W'W' W'W'ÿV'øV'ñV'êV'ãV'ÜV'ÕV'ÎV'ÇV'ÀV'¹V'²V'«V'¤V'V'–V'V'ˆV'V'zV'sV'lV'eV'^V'WV'PV'IV'BV';V'4V'-V'&V'V'V'V' V'V'üU'õU'îU'çU'àU'ÙU'ÒU'ËU'ÄU'½U'¶U'¯U'¨U'¡U'šU'“U'ŒU'…U'~U'wU'pU'iU'bU'[U'TU'MU'FU'?U'8U'1U'*U'#U'U'U'U'U'U'ùT'òT'ëT'äT'ÝT'ÖT'ÏT'ÈT'ÁT'ºT'³T'¬T'¥T'žT'—T'T'‰T'‚T'{T'tT'mT'fT'_T'XT'QT'JT'CT'P'7P'0P')P'"P'P'P' P'P'ÿO'øO'ñO'êO'ãO'ÜO'ÕO'ÎO'ÇO'ÀO'¹O'²O'«O'¤O'O'–O'O'ˆO'O'zO'sO'lO'eO'^O'WO'PO'IO'BO';O'4O'-O'&O'O'O'O' O'O'üN'õN'îN'çN'àN'ÙN'ÒN'ËN'ÄN'½N'¶N'¯N'¨N'¡N'šN'“N'ŒN'…N'~N'wN'pN'iN'bN'[N'TN'MN'FN'?N'8N'1N'*N'#N'N'N'N'N'N'ùM'òM'ëM'äM'ÝM'ÖM'ÏM'ÈM'ÁM'ºM'³M'¬M'¥M'žM'—M'M'‰M'‚M'{M'tM'mM'fM'_M'XM'QM'JM'CM'I'7I'0I')I'"I'I'I' I'I'ÿH'øH'ñH'êH'ãH'ÜH'ÕH'ÎH'ÇH'ÀH'¹H'²H'«H'¤H'H'–H'H'ˆH'H'zH'sH'lH'eH'^H'WH'PH'IH'BH';H'4H'-H'&H'H'H'H' H'H'üG'õG'îG'çG'àG'ÙG'ÒG'ËG'ÄG'½G'¶G'¯G'¨G'¡G'šG'“G'ŒG'…G'~G'wG'pG'iG'bG'[G'TG'MG'FG'?G'8G'1G'*G'#G'G'G'G'G'G'ùF'òF'ëF'äF'ÝF'ÖF'ÏF'ÈF'ÁF'ºF'³F'¬F'¥F'žF'—F'F'‰F'‚F'{F'tF'mF'fF'_F'XF'QF'JF'CF'B'7B'0B')B'"B'B'B' B'B'ÿA'øA'ñA'êA'ãA'ÜA'ÕA'ÎA'ÇA'ÀA'¹A'²A'«A'¤A'A'–A'A'ˆA'A'zA'sA'lA'eA'^A'WA'PA'IA'BA';A'4A'-A'&A'A'A'A' A'A'ü@'õ@'î@'ç@'à@'Ù@'Ò@'Ë@'Ä@'½@'¶@'¯@'¨@'¡@'š@'“@'Œ@'…@'~@'w@'p@'i@'b@'[@'T@'M@'F@'?@'8@'1@'*@'#@'@'@'@'@'@'ù?'ò?'ë?'ä?'Ý?'Ö?'Ï?'È?'Á?'º?'³?'¬?'¥?'ž?'—?'?'‰?'‚?'{?'t?'m?'f?'_?'X?'Q?'J?'C?''ö>'ï>'è>'á>'Ú>'Ó>'Ì>'Å>'¾>'·>'°>'©>'¢>'›>'”>'>'†>'>'x>'q>'j>'c>'\>'U>'N>'G>'@>'9>'2>'+>'$>'>'>'>'>'>'ú='ó='ì='å='Þ='×='Ð='É='Â='»='´='­='¦='Ÿ='˜='‘='Š='ƒ='|='u='n='g='`='Y='R='K='D='=='6='/='(='!='='=' ='='þ<'÷<'ð<'é<'â<'Û<'Ô<'Í<'Æ<'¿<'¸<'±<'ª<'£<'œ<'•<'Ž<'‡<'€<'y<'r<'k<'d<']<'V<'O<'H<'A<':<'3<',<'%<'<'<'<' <'<'û;'ô;'í;'æ;'ß;'Ø;'Ñ;'Ê;'Ã;'¼;'µ;'®;'§;' ;'™;'’;'‹;'„;'};'v;'o;'h;'a;'Z;'S;'L;'E;'>;'7;'0;');'";';';' ;';'ÿ:'ø:'ñ:'ê:'ã:'Ü:'Õ:'Î:'Ç:'À:'¹:'²:'«:'¤:':'–:':'ˆ:':'z:'s:'l:'e:'^:'W:'P:'I:'B:';:'4:'-:'&:':':':' :':'ü9'õ9'î9'ç9'à9'Ù9'Ò9'Ë9'Ä9'½9'¶9'¯9'¨9'¡9'š9'“9'Œ9'…9'~9'w9'p9'i9'b9'[9'T9'M9'F9'?9'89'19'*9'#9'9'9'9'9'9'ù8'ò8'ë8'ä8'Ý8'Ö8'Ï8'È8'Á8'º8'³8'¬8'¥8'ž8'—8'8'‰8'‚8'{8't8'm8'f8'_8'X8'Q8'J8'C8'<8'58'.8''8' 8'8'8' 8'8'ý7'ö7'ï7'è7'á7'Ú7'Ó7'Ì7'Å7'¾7'·7'°7'©7'¢7'›7'”7'7'†7'7'x7'q7'j7'c7'\7'U7'N7'G7'@7'97'27'+7'$7'7'7'7'7'7'ú6'ó6'ì6'å6'Þ6'×6'Ð6'É6'Â6'»6'´6'­6'¦6'Ÿ6'˜6'‘6'Š6'ƒ6'|6'u6'n6'g6'`6'Y6'R6'K6'D6'=6'66'/6'(6'!6'6'6' 6'6'þ5'÷5'ð5'é5'â5'Û5'Ô5'Í5'Æ5'¿5'¸5'±5'ª5'£5'œ5'•5'Ž5'‡5'€5'y5'r5'k5'd5']5'V5'O5'H5'A5':5'35',5'%5'5'5'5' 5'5'û4'ô4'í4'æ4'ß4'Ø4'Ñ4'Ê4'Ã4'¼4'µ4'®4'§4' 4'™4'’4'‹4'„4'}4'v4'o4'h4'a4'Z4'S4'L4'E4'>4'74'04')4'"4'4'4' 4'4'ÿ3'ø3'ñ3'ê3'ã3'Ü3'Õ3'Î3'Ç3'À3'¹3'²3'«3'¤3'3'–3'3'ˆ3'3'z3's3'l3'e3'^3'W3'P3'I3'B3';3'43'-3'&3'3'3'3' 3'3'ü2'õ2'î2'ç2'à2'Ù2'Ò2'Ë2'Ä2'½2'¶2'¯2'¨2'¡2'š2'“2'Œ2'…2'~2'w2'p2'i2'b2'[2'T2'M2'F2'?2'82'12'*2'#2'2'2'2'2'2'ù1'ò1'ë1'ä1'Ý1'Ö1'Ï1'È1'Á1'º1'³1'¬1'¥1'ž1'—1'1'‰1'‚1'{1't1'm1'f1'_1'X1'Q1'J1'C1'<1'51'.1''1' 1'1'1' 1'1'ý0'ö0'ï0'è0'á0'Ú0'Ó0'Ì0'Å0'¾0'·0'°0'©0'¢0'›0'”0'0'†0'0'x0'q0'j0'c0'\0'U0'N0'G0'@0'90'20'+0'$0'0'0'0'0'0'ú/'ó/'ì/'å/'Þ/'×/'Ð/'É/'Â/'»/'´/'­/'¦/'Ÿ/'˜/'‘/'Š/'ƒ/'|/'u/'n/'g/'`/'Y/'R/'K/'D/'=/'6/'//'(/'!/'/'/' /'/'þ.'÷.'ð.'é.'â.'Û.'Ô.'Í.'Æ.'¿.'¸.'±.'ª.'£.'œ.'•.'Ž.'‡.'€.'y.'r.'k.'d.'].'V.'O.'H.'A.':.'3.',.'%.'.'.'.' .'.'û-'ô-'í-'æ-'ß-'Ø-'Ñ-'Ê-'Ã-'¼-'µ-'®-'§-' -'™-'’-'‹-'„-'}-'v-'o-'h-'a-'Z-'S-'L-'E-'>-'7-'0-')-'"-'-'-' -'-'ÿ,'ø,'ñ,'ê,'ã,'Ü,'Õ,'Î,'Ç,'À,'¹,'²,'«,'¤,','–,','ˆ,','z,'s,'l,'e,'^,'W,'P,'I,'B,';,'4,'-,'&,',',',' ,','ü+'õ+'î+'ç+'à+'Ù+'Ò+'Ë+'Ä+'½+'¶+'¯+'¨+'¡+'š+'“+'Œ+'…+'~+'w+'p+'i+'b+'[+'T+'M+'F+'?+'8+'1+'*+'#+'+'+'+'+'+'ù*'ò*'ë*'ä*'Ý*'Ö*'Ï*'È*'Á*'º*'³*'¬*'¥*'ž*'—*'*'‰*'‚*'{*'t*'m*'f*'_*'X*'Q*'J*'C*'<*'5*'.*''*' *'*'*' *'*'ý)'ö)'ï)'è)'á)'Ú)'Ó)'Ì)'Å)'¾)'·)'°)'©)'¢)'›)'”)')'†)')'x)'q)'j)'c)'\)'U)'N)'G)'@)'9)'2)'+)'$)')')')')')'ú('ó('ì('å('Þ('×('Ð('É('Â('»('´('­('¦('Ÿ('˜('‘('Š('ƒ('|('u('n('g('`('Y('R('K('D('=('6('/('(('!('('(' ('('þ''÷''ð''é''â''Û''Ô''Í''Æ''¿''¸''±''ª''£''œ''•''Ž''‡''€''y''r''k''d'']''V''O''H''A'':''3'',''%'''''''' ''''û&'ô&'í&'æ&'ß&'Ø&'Ñ&'Ê&'Ã&'¼&'µ&'®&'§&' &'™&'’&'‹&'„&'}&'v&'o&'h&'a&'Z&'S&'L&'E&'>&'7&'0&')&'"&'&'&' &'&'ÿ%'ø%'ñ%'ê%'ã%'Ü%'Õ%'Î%'Ç%'À%'¹%'²%'«%'¤%'%'–%'%'ˆ%'%'z%'s%'l%'e%'^%'W%'P%'I%'B%';%'4%'-%'&%'%'%'%' %'%'ü$'õ$'î$'ç$'à$'Ù$'Ò$'Ë$'Ä$'½$'¶$'¯$'¨$'¡$'š$'“$'Œ$'…$'~$'w$'p$'i$'b$'[$'T$'M$'F$'?$'8$'1$'*$'#$'$'$'$'$'$'ù#'ò#'ë#'ä#'Ý#'Ö#'Ï#'È#'Á#'º#'³#'¬#'¥#'ž#'—#'#'‰#'‚#'{#'t#'m#'f#'_#'X#'Q#'J#'C#'<#'5#'.#''#' #'#'#' #'#'ý"'ö"'ï"'è"'á"'Ú"'Ó"'Ì"'Å"'¾"'·"'°"'©"'¢"'›"'”"'"'†"'"'x"'q"'j"'c"'\"'U"'N"'G"'@"'9"'2"'+"'$"'"'"'"'"'"'ú!'ó!'ì!'å!'Þ!'×!'Ð!'É!'Â!'»!'´!'­!'¦!'Ÿ!'˜!'‘!'Š!'ƒ!'|!'u!'n!'g!'`!'Y!'R!'K!'D!'=!'6!'/!'(!'!!'!'!' !'!'þ '÷ 'ð 'é 'â 'Û 'Ô 'Í 'Æ '¿ '¸ '± 'ª '£ 'œ '• 'Ž '‡ '€ 'y 'r 'k 'd '] 'V 'O 'H 'A ': '3 ', '% ' ' ' ' ' 'û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý 'ö 'ï 'è 'á 'Ú 'Ó 'Ì 'Å '¾ '· '° '© '¢ '› '” ' '† ' 'x 'q 'j 'c '\ 'U 'N 'G '@ '9 '2 '+ '$ ' ' ' ' ' 'ú 'ó 'ì 'å 'Þ '× 'Ð 'É ' '» '´ '­ '¦ 'Ÿ '˜ '‘ 'Š 'ƒ '| 'u 'n 'g '` 'Y 'R 'K 'D '= '6 '/ '( '! ' ' ' ' 'þ '÷ 'ð 'é 'â 'Û 'Ô 'Í 'Æ '¿ '¸ '± 'ª '£ 'œ '• 'Ž '‡ '€ 'y 'r 'k 'd '] 'V 'O 'H 'A ': '3 ', '% ' ' ' ' ' 'û 'ô 'í 'æ 'ß 'Ø 'Ñ 'Ê 'à '¼ 'µ '® '§ '  '™ '’ '‹ '„ '} 'v 'o 'h 'a 'Z 'S 'L 'E '> '7 '0 ') '" ' ' ' ' 'ÿ 'ø 'ñ 'ê 'ã 'Ü 'Õ 'Î 'Ç 'À '¹ '² '« '¤ ' '– ' 'ˆ ' 'z 's 'l 'e '^ 'W 'P 'I 'B '; '4 '- '& ' ' ' ' ' 'ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ýÿ&öÿ&ïÿ&èÿ&áÿ&Úÿ&Óÿ&Ìÿ&Åÿ&¾ÿ&·ÿ&°ÿ&©ÿ&¢ÿ&›ÿ&”ÿ&ÿ&†ÿ&ÿ&xÿ&qÿ&jÿ&cÿ&\ÿ&Uÿ&Nÿ&Gÿ&@ÿ&9ÿ&2ÿ&+ÿ&$ÿ&ÿ&ÿ&ÿ&ÿ&ÿ&úþ&óþ&ìþ&åþ&Þþ&×þ&Ðþ&Éþ&Âþ&»þ&´þ&­þ&¦þ&Ÿþ&˜þ&‘þ&Šþ&ƒþ&|þ&uþ&nþ&gþ&`þ&Yþ&Rþ&Kþ&Dþ&=þ&6þ&/þ&(þ&!þ&þ&þ& þ&þ&þý&÷ý&ðý&éý&âý&Ûý&Ôý&Íý&Æý&¿ý&¸ý&±ý&ªý&£ý&œý&•ý&Žý&‡ý&€ý&yý&rý&ký&dý&]ý&Vý&Oý&Hý&Aý&:ý&3ý&,ý&%ý&ý&ý&ý& ý&ý&ûü&ôü&íü&æü&ßü&Øü&Ñü&Êü&Ãü&¼ü&µü&®ü&§ü& ü&™ü&’ü&‹ü&„ü&}ü&vü&oü&hü&aü&Zü&Sü&Lü&Eü&>ü&7ü&0ü&)ü&"ü&ü&ü& ü&ü&ÿû&øû&ñû&êû&ãû&Üû&Õû&Îû&Çû&Àû&¹û&²û&«û&¤û&û&–û&û&ˆû&û&zû&sû&lû&eû&^û&Wû&Pû&Iû&Bû&;û&4û&-û&&û&û&û&û& û&û&üú&õú&îú&çú&àú&Ùú&Òú&Ëú&Äú&½ú&¶ú&¯ú&¨ú&¡ú&šú&“ú&Œú&…ú&~ú&wú&pú&iú&bú&[ú&Tú&Mú&Fú&?ú&8ú&1ú&*ú&#ú&ú&ú&ú&ú&ú&ùù&òù&ëù&äù&Ýù&Öù&Ïù&Èù&Áù&ºù&³ù&¬ù&¥ù&žù&—ù&ù&‰ù&‚ù&{ù&tù&mù&fù&_ù&Xù&Qù&Jù&Cù&<ù&5ù&.ù&'ù& ù&ù&ù& ù&ù&ýø&öø&ïø&èø&áø&Úø&Óø&Ìø&Åø&¾ø&·ø&°ø&©ø&¢ø&›ø&”ø&ø&†ø&ø&xø&qø&jø&cø&\ø&Uø&Nø&Gø&@ø&9ø&2ø&+ø&$ø&ø&ø&ø&ø&ø&ú÷&ó÷&ì÷&å÷&Þ÷&×÷&Ð÷&É÷&Â÷&»÷&´÷&­÷&¦÷&Ÿ÷&˜÷&‘÷&Š÷&ƒ÷&|÷&u÷&n÷&g÷&`÷&Y÷&R÷&K÷&D÷&=÷&6÷&/÷&(÷&!÷&÷&÷& ÷&÷&þö&÷ö&ðö&éö&âö&Ûö&Ôö&Íö&Æö&¿ö&¸ö&±ö&ªö&£ö&œö&•ö&Žö&‡ö&€ö&yö&rö&kö&dö&]ö&Vö&Oö&Hö&Aö&:ö&3ö&,ö&%ö&ö&ö&ö& ö&ö&ûõ&ôõ&íõ&æõ&ßõ&Øõ&Ñõ&Êõ&Ãõ&¼õ&µõ&®õ&§õ& õ&™õ&’õ&‹õ&„õ&}õ&võ&oõ&hõ&aõ&Zõ&Sõ&Lõ&Eõ&>õ&7õ&0õ&)õ&"õ&õ&õ& õ&õ&ÿô&øô&ñô&êô&ãô&Üô&Õô&Îô&Çô&Àô&¹ô&²ô&«ô&¤ô&ô&–ô&ô&ˆô&ô&zô&sô&lô&eô&^ô&Wô&Pô&Iô&Bô&;ô&4ô&-ô&&ô&ô&ô&ô& ô&ô&üó&õó&îó&çó&àó&Ùó&Òó&Ëó&Äó&½ó&¶ó&¯ó&¨ó&¡ó&šó&“ó&Œó&…ó&~ó&wó&pó&ió&bó&[ó&Tó&Mó&Fó&?ó&8ó&1ó&*ó&#ó&ó&ó&ó&ó&ó&ùò&òò&ëò&äò&Ýò&Öò&Ïò&Èò&Áò&ºò&³ò&¬ò&¥ò&žò&—ò&ò&‰ò&‚ò&{ò&tò&mò&fò&_ò&Xò&Qò&Jò&Cò&<ò&5ò&.ò&'ò& ò&ò&ò& ò&ò&ýñ&öñ&ïñ&èñ&áñ&Úñ&Óñ&Ìñ&Åñ&¾ñ&·ñ&°ñ&©ñ&¢ñ&›ñ&”ñ&ñ&†ñ&ñ&xñ&qñ&jñ&cñ&\ñ&Uñ&Nñ&Gñ&@ñ&9ñ&2ñ&+ñ&$ñ&ñ&ñ&ñ&ñ&ñ&úð&óð&ìð&åð&Þð&×ð&Ðð&Éð&Âð&»ð&´ð&­ð&¦ð&Ÿð&˜ð&‘ð&Šð&ƒð&|ð&uð&nð&gð&`ð&Yð&Rð&Kð&Dð&=ð&6ð&/ð&(ð&!ð&ð&ð& ð&ð&þï&÷ï&ðï&éï&âï&Ûï&Ôï&Íï&Æï&¿ï&¸ï&±ï&ªï&£ï&œï&•ï&Žï&‡ï&€ï&yï&rï&kï&dï&]ï&Vï&Oï&Hï&Aï&:ï&3ï&,ï&%ï&ï&ï&ï& ï&ï&ûî&ôî&íî&æî&ßî&Øî&Ñî&Êî&Ãî&¼î&µî&®î&§î& î&™î&’î&‹î&„î&}î&vî&oî&hî&aî&Zî&Sî&Lî&Eî&>î&7î&0î&)î&"î&î&î& î&î&ÿí&øí&ñí&êí&ãí&Üí&Õí&Îí&Çí&Àí&¹í&²í&«í&¤í&í&–í&í&ˆí&í&zí&sí&lí&eí&^í&Wí&Pí&Ií&Bí&;í&4í&-í&&í&í&í&í& í&í&üì&õì&îì&çì&àì&Ùì&Òì&Ëì&Äì&½ì&¶ì&¯ì&¨ì&¡ì&šì&“ì&Œì&…ì&~ì&wì&pì&iì&bì&[ì&Tì&Mì&Fì&?ì&8ì&1ì&*ì&#ì&ì&ì&ì&ì&ì&ùë&òë&ëë&äë&Ýë&Öë&Ïë&Èë&Áë&ºë&³ë&¬ë&¥ë&žë&—ë&ë&‰ë&‚ë&{ë&të&më&fë&_ë&Xë&Që&Jë&Cë&<ë&5ë&.ë&'ë& ë&ë&ë& ë&ë&ýê&öê&ïê&èê&áê&Úê&Óê&Ìê&Åê&¾ê&·ê&°ê&©ê&¢ê&›ê&”ê&ê&†ê&ê&xê&qê&jê&cê&\ê&Uê&Nê&Gê&@ê&9ê&2ê&+ê&$ê&ê&ê&ê&ê&ê&úé&óé&ìé&åé&Þé&×é&Ðé&Éé&Âé&»é&´é&­é&¦é&Ÿé&˜é&‘é&Šé&ƒé&|é&ué&né&gé&`é&Yé&Ré&Ké&Dé&=é&6é&/é&(é&!é&é&é& é&é&þè&÷è&ðè&éè&âè&Ûè&Ôè&Íè&Æè&¿è&¸è&±è&ªè&£è&œè&•è&Žè&‡è&€è&yè&rè&kè&dè&]è&Vè&Oè&Hè&Aè&:è&3è&,è&%è&è&è&è& è&è&ûç&ôç&íç&æç&ßç&Øç&Ñç&Êç&Ãç&¼ç&µç&®ç&§ç& ç&™ç&’ç&‹ç&„ç&}ç&vç&oç&hç&aç&Zç&Sç&Lç&Eç&>ç&7ç&0ç&)ç&"ç&ç&ç& ç&ç&ÿæ&øæ&ñæ&êæ&ãæ&Üæ&Õæ&Îæ&Çæ&Àæ&¹æ&²æ&«æ&¤æ&æ&–æ&æ&ˆæ&æ&zæ&sæ&læ&eæ&^æ&Wæ&Pæ&Iæ&Bæ&;æ&4æ&-æ&&æ&æ&æ&æ& æ&æ&üå&õå&îå&çå&àå&Ùå&Òå&Ëå&Äå&½å&¶å&¯å&¨å&¡å&šå&“å&Œå&…å&~å&wå&på&iå&bå&[å&Tå&Må&Få&?å&8å&1å&*å&#å&å&å&å&å&å&ùä&òä&ëä&ää&Ýä&Öä&Ïä&Èä&Áä&ºä&³ä&¬ä&¥ä&žä&—ä&ä&‰ä&‚ä&{ä&tä&mä&fä&_ä&Xä&Qä&Jä&Cä&<ä&5ä&.ä&'ä& ä&ä&ä& ä&ä&ýã&öã&ïã&èã&áã&Úã&Óã&Ìã&Åã&¾ã&·ã&°ã&©ã&¢ã&›ã&”ã&ã&†ã&ã&xã&qã&jã&cã&\ã&Uã&Nã&Gã&@ã&9ã&2ã&+ã&$ã&ã&ã&ã&ã&ã&úâ&óâ&ìâ&åâ&Þâ&×â&Ðâ&Éâ&Ââ&»â&´â&­â&¦â&Ÿâ&˜â&‘â&Šâ&ƒâ&|â&uâ&nâ&gâ&`â&Yâ&Râ&Kâ&Dâ&=â&6â&/â&(â&!â&â&â& â&â&þá&÷á&ðá&éá&âá&Ûá&Ôá&Íá&Æá&¿á&¸á&±á&ªá&£á&œá&•á&Žá&‡á&€á&yá&rá&ká&dá&]á&Vá&Oá&Há&Aá&:á&3á&,á&%á&á&á&á& á&á&ûà&ôà&íà&æà&ßà&Øà&Ñà&Êà&Ãà&¼à&µà&®à&§à& à&™à&’à&‹à&„à&}à&và&oà&hà&aà&Zà&Sà&Là&Eà&>à&7à&0à&)à&"à&à&à& à&à&ÿß&øß&ñß&êß&ãß&Üß&Õß&Îß&Çß&Àß&¹ß&²ß&«ß&¤ß&ß&–ß&ß&ˆß&ß&zß&sß&lß&eß&^ß&Wß&Pß&Iß&Bß&;ß&4ß&-ß&&ß&ß&ß&ß& ß&ß&üÞ&õÞ&îÞ&çÞ&àÞ&ÙÞ&ÒÞ&ËÞ&ÄÞ&½Þ&¶Þ&¯Þ&¨Þ&¡Þ&šÞ&“Þ&ŒÞ&…Þ&~Þ&wÞ&pÞ&iÞ&bÞ&[Þ&TÞ&MÞ&FÞ&?Þ&8Þ&1Þ&*Þ&#Þ&Þ&Þ&Þ&Þ&Þ&ùÝ&òÝ&ëÝ&äÝ&ÝÝ&ÖÝ&ÏÝ&ÈÝ&ÁÝ&ºÝ&³Ý&¬Ý&¥Ý&žÝ&—Ý&Ý&‰Ý&‚Ý&{Ý&tÝ&mÝ&fÝ&_Ý&XÝ&QÝ&JÝ&CÝ&<Ý&5Ý&.Ý&'Ý& Ý&Ý&Ý& Ý&Ý&ýÜ&öÜ&ïÜ&èÜ&áÜ&ÚÜ&ÓÜ&ÌÜ&ÅÜ&¾Ü&·Ü&°Ü&©Ü&¢Ü&›Ü&”Ü&Ü&†Ü&Ü&xÜ&qÜ&jÜ&cÜ&\Ü&UÜ&NÜ&GÜ&@Ü&9Ü&2Ü&+Ü&$Ü&Ü&Ü&Ü&Ü&Ü&úÛ&óÛ&ìÛ&åÛ&ÞÛ&×Û&ÐÛ&ÉÛ&ÂÛ&»Û&´Û&­Û&¦Û&ŸÛ&˜Û&‘Û&ŠÛ&ƒÛ&|Û&uÛ&nÛ&gÛ&`Û&YÛ&RÛ&KÛ&DÛ&=Û&6Û&/Û&(Û&!Û&Û&Û& Û&Û&þÚ&÷Ú&ðÚ&éÚ&âÚ&ÛÚ&ÔÚ&ÍÚ&ÆÚ&¿Ú&¸Ú&±Ú&ªÚ&£Ú&œÚ&•Ú&ŽÚ&‡Ú&€Ú&yÚ&rÚ&kÚ&dÚ&]Ú&VÚ&OÚ&HÚ&AÚ&:Ú&3Ú&,Ú&%Ú&Ú&Ú&Ú& Ú&Ú&ûÙ&ôÙ&íÙ&æÙ&ßÙ&ØÙ&ÑÙ&ÊÙ&ÃÙ&¼Ù&µÙ&®Ù&§Ù& Ù&™Ù&’Ù&‹Ù&„Ù&}Ù&vÙ&oÙ&hÙ&aÙ&ZÙ&SÙ&LÙ&EÙ&>Ù&7Ù&0Ù&)Ù&"Ù&Ù&Ù& Ù&Ù&ÿØ&øØ&ñØ&êØ&ãØ&ÜØ&ÕØ&ÎØ&ÇØ&ÀØ&¹Ø&²Ø&«Ø&¤Ø&Ø&–Ø&Ø&ˆØ&Ø&zØ&sØ&lØ&eØ&^Ø&WØ&PØ&IØ&BØ&;Ø&4Ø&-Ø&&Ø&Ø&Ø&Ø& Ø&Ø&ü×&õ×&î×&ç×&à×&Ù×&Ò×&Ë×&Ä×&½×&¶×&¯×&¨×&¡×&š×&“×&Œ×&…×&~×&w×&p×&i×&b×&[×&T×&M×&F×&?×&8×&1×&*×&#×&×&×&×&×&×&ùÖ&òÖ&ëÖ&äÖ&ÝÖ&ÖÖ&ÏÖ&ÈÖ&ÁÖ&ºÖ&³Ö&¬Ö&¥Ö&žÖ&—Ö&Ö&‰Ö&‚Ö&{Ö&tÖ&mÖ&fÖ&_Ö&XÖ&QÖ&JÖ&CÖ&<Ö&5Ö&.Ö&'Ö& Ö&Ö&Ö& Ö&Ö&ýÕ&öÕ&ïÕ&èÕ&áÕ&ÚÕ&ÓÕ&ÌÕ&ÅÕ&¾Õ&·Õ&°Õ&©Õ&¢Õ&›Õ&”Õ&Õ&†Õ&Õ&xÕ&qÕ&jÕ&cÕ&\Õ&UÕ&NÕ&GÕ&@Õ&9Õ&2Õ&+Õ&$Õ&Õ&Õ&Õ&Õ&Õ&úÔ&óÔ&ìÔ&åÔ&ÞÔ&×Ô&ÐÔ&ÉÔ&ÂÔ&»Ô&´Ô&­Ô&¦Ô&ŸÔ&˜Ô&‘Ô&ŠÔ&ƒÔ&|Ô&uÔ&nÔ&gÔ&`Ô&YÔ&RÔ&KÔ&DÔ&=Ô&6Ô&/Ô&(Ô&!Ô&Ô&Ô& Ô&Ô&þÓ&÷Ó&ðÓ&éÓ&âÓ&ÛÓ&ÔÓ&ÍÓ&ÆÓ&¿Ó&¸Ó&±Ó&ªÓ&£Ó&œÓ&•Ó&ŽÓ&‡Ó&€Ó&yÓ&rÓ&kÓ&dÓ&]Ó&VÓ&OÓ&HÓ&AÓ&:Ó&3Ó&,Ó&%Ó&Ó&Ó&Ó& Ó&Ó&ûÒ&ôÒ&íÒ&æÒ&ßÒ&ØÒ&ÑÒ&ÊÒ&ÃÒ&¼Ò&µÒ&®Ò&§Ò& Ò&™Ò&’Ò&‹Ò&„Ò&}Ò&vÒ&oÒ&hÒ&aÒ&ZÒ&SÒ&LÒ&EÒ&>Ò&7Ò&0Ò&)Ò&"Ò&Ò&Ò& Ò&Ò&ÿÑ&øÑ&ñÑ&êÑ&ãÑ&ÜÑ&ÕÑ&ÎÑ&ÇÑ&ÀÑ&¹Ñ&²Ñ&«Ñ&¤Ñ&Ñ&–Ñ&Ñ&ˆÑ&Ñ&zÑ&sÑ&lÑ&eÑ&^Ñ&WÑ&PÑ&IÑ&BÑ&;Ñ&4Ñ&-Ñ&&Ñ&Ñ&Ñ&Ñ& Ñ&Ñ&üÐ&õÐ&îÐ&çÐ&àÐ&ÙÐ&ÒÐ&ËÐ&ÄÐ&½Ð&¶Ð&¯Ð&¨Ð&¡Ð&šÐ&“Ð&ŒÐ&…Ð&~Ð&wÐ&pÐ&iÐ&bÐ&[Ð&TÐ&MÐ&FÐ&?Ð&8Ð&1Ð&*Ð&#Ð&Ð&Ð&Ð&Ð&Ð&ùÏ&òÏ&ëÏ&äÏ&ÝÏ&ÖÏ&ÏÏ&ÈÏ&ÁÏ&ºÏ&³Ï&¬Ï&¥Ï&žÏ&—Ï&Ï&‰Ï&‚Ï&{Ï&tÏ&mÏ&fÏ&_Ï&XÏ&QÏ&JÏ&CÏ&<Ï&5Ï&.Ï&'Ï& Ï&Ï&Ï& Ï&Ï&ýÎ&öÎ&ïÎ&èÎ&áÎ&ÚÎ&ÓÎ&ÌÎ&ÅÎ&¾Î&·Î&°Î&©Î&¢Î&›Î&”Î&Î&†Î&Î&xÎ&qÎ&jÎ&cÎ&\Î&UÎ&NÎ&GÎ&@Î&9Î&2Î&+Î&$Î&Î&Î&Î&Î&Î&úÍ&óÍ&ìÍ&åÍ&ÞÍ&×Í&ÐÍ&ÉÍ&ÂÍ&»Í&´Í&­Í&¦Í&ŸÍ&˜Í&‘Í&ŠÍ&ƒÍ&|Í&uÍ&nÍ&gÍ&`Í&YÍ&RÍ&KÍ&DÍ&=Í&6Í&/Í&(Í&!Í&Í&Í& Í&Í&þÌ&÷Ì&ðÌ&éÌ&âÌ&ÛÌ&ÔÌ&ÍÌ&ÆÌ&¿Ì&¸Ì&±Ì&ªÌ&£Ì&œÌ&•Ì&ŽÌ&‡Ì&€Ì&yÌ&rÌ&kÌ&dÌ&]Ì&VÌ&OÌ&HÌ&AÌ&:Ì&3Ì&,Ì&%Ì&Ì&Ì&Ì& Ì&Ì&ûË&ôË&íË&æË&ßË&ØË&ÑË&ÊË&ÃË&¼Ë&µË&®Ë&§Ë& Ë&™Ë&’Ë&‹Ë&„Ë&}Ë&vË&oË&hË&aË&ZË&SË&LË&EË&>Ë&7Ë&0Ë&)Ë&"Ë&Ë&Ë& Ë&Ë&ÿÊ&øÊ&ñÊ&êÊ&ãÊ&ÜÊ&ÕÊ&ÎÊ&ÇÊ&ÀÊ&¹Ê&²Ê&«Ê&¤Ê&Ê&–Ê&Ê&ˆÊ&Ê&zÊ&sÊ&lÊ&eÊ&^Ê&WÊ&PÊ&IÊ&BÊ&;Ê&4Ê&-Ê&&Ê&Ê&Ê&Ê& Ê&Ê&üÉ&õÉ&îÉ&çÉ&àÉ&ÙÉ&ÒÉ&ËÉ&ÄÉ&½É&¶É&¯É&¨É&¡É&šÉ&“É&ŒÉ&…É&~É&wÉ&pÉ&iÉ&bÉ&[É&TÉ&MÉ&FÉ&?É&8É&1É&*É&#É&É&É&É&É&É&ùÈ&òÈ&ëÈ&äÈ&ÝÈ&ÖÈ&ÏÈ&ÈÈ&ÁÈ&ºÈ&³È&¬È&¥È&žÈ&—È&È&‰È&‚È&{È&tÈ&mÈ&fÈ&_È&XÈ&QÈ&JÈ&CÈ&<È&5È&.È&'È& È&È&È& È&È&ýÇ&öÇ&ïÇ&èÇ&áÇ&ÚÇ&ÓÇ&ÌÇ&ÅÇ&¾Ç&·Ç&°Ç&©Ç&¢Ç&›Ç&”Ç&Ç&†Ç&Ç&xÇ&qÇ&jÇ&cÇ&\Ç&UÇ&NÇ&GÇ&@Ç&9Ç&2Ç&+Ç&$Ç&Ç&Ç&Ç&Ç&Ç&úÆ&óÆ&ìÆ&åÆ&ÞÆ&ׯ&ÐÆ&ÉÆ&ÂÆ&»Æ&´Æ&­Æ&¦Æ&ŸÆ&˜Æ&‘Æ&ŠÆ&ƒÆ&|Æ&uÆ&nÆ&gÆ&`Æ&YÆ&RÆ&KÆ&DÆ&=Æ&6Æ&/Æ&(Æ&!Æ&Æ&Æ& Æ&Æ&þÅ&÷Å&ðÅ&éÅ&âÅ&ÛÅ&ÔÅ&ÍÅ&ÆÅ&¿Å&¸Å&±Å&ªÅ&£Å&œÅ&•Å&ŽÅ&‡Å&€Å&yÅ&rÅ&kÅ&dÅ&]Å&VÅ&OÅ&HÅ&AÅ&:Å&3Å&,Å&%Å&Å&Å&Å& Å&Å&ûÄ&ôÄ&íÄ&æÄ&ßÄ&ØÄ&ÑÄ&ÊÄ&ÃÄ&¼Ä&µÄ&®Ä&§Ä& Ä&™Ä&’Ä&‹Ä&„Ä&}Ä&vÄ&oÄ&hÄ&aÄ&ZÄ&SÄ&LÄ&EÄ&>Ä&7Ä&0Ä&)Ä&"Ä&Ä&Ä& Ä&Ä&ÿÃ&øÃ&ñÃ&êÃ&ãÃ&ÜÃ&ÕÃ&ÎÃ&ÇÃ&ÀÃ&¹Ã&²Ã&«Ã&¤Ã&Ã&–Ã&Ã&ˆÃ&Ã&zÃ&sÃ&lÃ&eÃ&^Ã&WÃ&PÃ&IÃ&BÃ&;Ã&4Ã&-Ã&&Ã&Ã&Ã&Ã& Ã&Ã&üÂ&õÂ&îÂ&çÂ&àÂ&ÙÂ&ÒÂ&ËÂ&ÄÂ&½Â&¶Â&¯Â&¨Â&¡Â&šÂ&“Â&ŒÂ&…Â&~Â&wÂ&pÂ&iÂ&bÂ&[Â&TÂ&MÂ&FÂ&?Â&8Â&1Â&*Â&#Â&Â&Â&Â&Â&Â&ùÁ&òÁ&ëÁ&äÁ&ÝÁ&ÖÁ&ÏÁ&ÈÁ&ÁÁ&ºÁ&³Á&¬Á&¥Á&žÁ&—Á&Á&‰Á&‚Á&{Á&tÁ&mÁ&fÁ&_Á&XÁ&QÁ&JÁ&CÁ&<Á&5Á&.Á&'Á& Á&Á&Á& Á&Á&ýÀ&öÀ&ïÀ&èÀ&áÀ&ÚÀ&ÓÀ&ÌÀ&ÅÀ&¾À&·À&°À&©À&¢À&›À&”À&À&†À&À&xÀ&qÀ&jÀ&cÀ&\À&UÀ&NÀ&GÀ&@À&9À&2À&+À&$À&À&À&À&À&À&ú¿&ó¿&ì¿&å¿&Þ¿&׿&п&É¿&¿&»¿&´¿&­¿&¦¿&Ÿ¿&˜¿&‘¿&Š¿&ƒ¿&|¿&u¿&n¿&g¿&`¿&Y¿&R¿&K¿&D¿&=¿&6¿&/¿&(¿&!¿&¿&¿& ¿&¿&þ¾&÷¾&ð¾&é¾&â¾&Û¾&Ô¾&;&ƾ&¿¾&¸¾&±¾&ª¾&£¾&œ¾&•¾&޾&‡¾&€¾&y¾&r¾&k¾&d¾&]¾&V¾&O¾&H¾&A¾&:¾&3¾&,¾&%¾&¾&¾&¾& ¾&¾&û½&ô½&í½&æ½&ß½&ؽ&ѽ&ʽ&ý&¼½&µ½&®½&§½& ½&™½&’½&‹½&„½&}½&v½&o½&h½&a½&Z½&S½&L½&E½&>½&7½&0½&)½&"½&½&½& ½&½&ÿ¼&ø¼&ñ¼&ê¼&ã¼&ܼ&Õ¼&μ&Ǽ&À¼&¹¼&²¼&«¼&¤¼&¼&–¼&¼&ˆ¼&¼&z¼&s¼&l¼&e¼&^¼&W¼&P¼&I¼&B¼&;¼&4¼&-¼&&¼&¼&¼&¼& ¼&¼&ü»&õ»&î»&ç»&à»&Ù»&Ò»&Ë»&Ä»&½»&¶»&¯»&¨»&¡»&š»&“»&Œ»&…»&~»&w»&p»&i»&b»&[»&T»&M»&F»&?»&8»&1»&*»&#»&»&»&»&»&»&ùº&òº&ëº&äº&ݺ&Öº&Ϻ&Ⱥ&Áº&ºº&³º&¬º&¥º&žº&—º&º&‰º&‚º&{º&tº&mº&fº&_º&Xº&Qº&Jº&Cº&<º&5º&.º&'º& º&º&º& º&º&ý¹&ö¹&ï¹&è¹&á¹&Ú¹&Ó¹&̹&Ź&¾¹&·¹&°¹&©¹&¢¹&›¹&”¹&¹&†¹&¹&x¹&q¹&j¹&c¹&\¹&U¹&N¹&G¹&@¹&9¹&2¹&+¹&$¹&¹&¹&¹&¹&¹&ú¸&ó¸&ì¸&å¸&Þ¸&׸&и&ɸ&¸&»¸&´¸&­¸&¦¸&Ÿ¸&˜¸&‘¸&Џ&ƒ¸&|¸&u¸&n¸&g¸&`¸&Y¸&R¸&K¸&D¸&=¸&6¸&/¸&(¸&!¸&¸&¸& ¸&¸&þ·&÷·&ð·&é·&â·&Û·&Ô·&Í·&Æ·&¿·&¸·&±·&ª·&£·&œ·&•·&Ž·&‡·&€·&y·&r·&k·&d·&]·&V·&O·&H·&A·&:·&3·&,·&%·&·&·&·& ·&·&û¶&ô¶&í¶&æ¶&ß¶&ض&Ѷ&ʶ&ö&¼¶&µ¶&®¶&§¶& ¶&™¶&’¶&‹¶&„¶&}¶&v¶&o¶&h¶&a¶&Z¶&S¶&L¶&E¶&>¶&7¶&0¶&)¶&"¶&¶&¶& ¶&¶&ÿµ&øµ&ñµ&êµ&ãµ&ܵ&Õµ&ε&ǵ&Àµ&¹µ&²µ&«µ&¤µ&µ&–µ&µ&ˆµ&µ&zµ&sµ&lµ&eµ&^µ&Wµ&Pµ&Iµ&Bµ&;µ&4µ&-µ&&µ&µ&µ&µ& µ&µ&ü´&õ´&î´&ç´&à´&Ù´&Ò´&Ë´&Ä´&½´&¶´&¯´&¨´&¡´&š´&“´&Œ´&…´&~´&w´&p´&i´&b´&[´&T´&M´&F´&?´&8´&1´&*´&#´&´&´&´&´&´&ù³&ò³&ë³&ä³&ݳ&Ö³&ϳ&ȳ&Á³&º³&³³&¬³&¥³&ž³&—³&³&‰³&‚³&{³&t³&m³&f³&_³&X³&Q³&J³&C³&<³&5³&.³&'³& ³&³&³& ³&³&ý²&ö²&ï²&è²&á²&Ú²&Ó²&̲&Ų&¾²&·²&°²&©²&¢²&›²&”²&²&†²&²&x²&q²&j²&c²&\²&U²&N²&G²&@²&9²&2²&+²&$²&²&²&²&²&²&ú±&ó±&ì±&å±&Þ±&×±&б&ɱ&±&»±&´±&­±&¦±&Ÿ±&˜±&‘±&б&ƒ±&|±&u±&n±&g±&`±&Y±&R±&K±&D±&=±&6±&/±&(±&!±&±&±& ±&±&þ°&÷°&ð°&é°&â°&Û°&Ô°&Ͱ&ư&¿°&¸°&±°&ª°&£°&œ°&•°&ް&‡°&€°&y°&r°&k°&d°&]°&V°&O°&H°&A°&:°&3°&,°&%°&°&°&°& °&°&û¯&ô¯&í¯&æ¯&߯&د&ѯ&ʯ&ï&¼¯&µ¯&®¯&§¯& ¯&™¯&’¯&‹¯&„¯&}¯&v¯&o¯&h¯&a¯&Z¯&S¯&L¯&E¯&>¯&7¯&0¯&)¯&"¯&¯&¯& ¯&¯&ÿ®&ø®&ñ®&ê®&ã®&Ü®&Õ®&ή&Ç®&À®&¹®&²®&«®&¤®&®&–®&®&ˆ®&®&z®&s®&l®&e®&^®&W®&P®&I®&B®&;®&4®&-®&&®&®&®&®& ®&®&ü­&õ­&î­&ç­&à­&Ù­&Ò­&Ë­&Ä­&½­&¶­&¯­&¨­&¡­&š­&“­&Œ­&…­&~­&w­&p­&i­&b­&[­&T­&M­&F­&?­&8­&1­&*­&#­&­&­&­&­&­&ù¬&ò¬&ë¬&ä¬&ݬ&Ö¬&Ϭ&Ȭ&Á¬&º¬&³¬&¬¬&¥¬&ž¬&—¬&¬&‰¬&‚¬&{¬&t¬&m¬&f¬&_¬&X¬&Q¬&J¬&C¬&<¬&5¬&.¬&'¬& ¬&¬&¬& ¬&¬&ý«&ö«&ï«&è«&á«&Ú«&Ó«&Ì«&Å«&¾«&·«&°«&©«&¢«&›«&”«&«&†«&«&x«&q«&j«&c«&\«&U«&N«&G«&@«&9«&2«&+«&$«&«&«&«&«&«&úª&óª&ìª&åª&Þª&ת&Ъ&ɪ&ª&»ª&´ª&­ª&¦ª&Ÿª&˜ª&‘ª&Šª&ƒª&|ª&uª&nª&gª&`ª&Yª&Rª&Kª&Dª&=ª&6ª&/ª&(ª&!ª&ª&ª& ª&ª&þ©&÷©&ð©&é©&â©&Û©&Ô©&Í©&Æ©&¿©&¸©&±©&ª©&£©&œ©&•©&Ž©&‡©&€©&y©&r©&k©&d©&]©&V©&O©&H©&A©&:©&3©&,©&%©&©&©&©& ©&©&û¨&ô¨&í¨&æ¨&ߨ&ب&Ѩ&ʨ&è&¼¨&µ¨&®¨&§¨& ¨&™¨&’¨&‹¨&„¨&}¨&v¨&o¨&h¨&a¨&Z¨&S¨&L¨&E¨&>¨&7¨&0¨&)¨&"¨&¨&¨& ¨&¨&ÿ§&ø§&ñ§&ê§&ã§&ܧ&Õ§&Χ&ǧ&À§&¹§&²§&«§&¤§&§&–§&§&ˆ§&§&z§&s§&l§&e§&^§&W§&P§&I§&B§&;§&4§&-§&&§&§&§&§& §&§&ü¦&õ¦&î¦&ç¦&à¦&Ù¦&Ò¦&˦&Ħ&½¦&¶¦&¯¦&¨¦&¡¦&š¦&“¦&Œ¦&…¦&~¦&w¦&p¦&i¦&b¦&[¦&T¦&M¦&F¦&?¦&8¦&1¦&*¦&#¦&¦&¦&¦&¦&¦&ù¥&ò¥&ë¥&ä¥&Ý¥&Ö¥&Ï¥&È¥&Á¥&º¥&³¥&¬¥&¥¥&ž¥&—¥&¥&‰¥&‚¥&{¥&t¥&m¥&f¥&_¥&X¥&Q¥&J¥&C¥&<¥&5¥&.¥&'¥& ¥&¥&¥& ¥&¥&ý¤&ö¤&ï¤&è¤&á¤&Ú¤&Ó¤&̤&Ť&¾¤&·¤&°¤&©¤&¢¤&›¤&”¤&¤&†¤&¤&x¤&q¤&j¤&c¤&\¤&U¤&N¤&G¤&@¤&9¤&2¤&+¤&$¤&¤&¤&¤&¤&¤&ú£&ó£&ì£&å£&Þ£&×£&У&É£&£&»£&´£&­£&¦£&Ÿ£&˜£&‘£&Š£&ƒ£&|£&u£&n£&g£&`£&Y£&R£&K£&D£&=£&6£&/£&(£&!£&£&£& £&£&þ¢&÷¢&ð¢&é¢&â¢&Û¢&Ô¢&Í¢&Æ¢&¿¢&¸¢&±¢&ª¢&£¢&œ¢&•¢&Ž¢&‡¢&€¢&y¢&r¢&k¢&d¢&]¢&V¢&O¢&H¢&A¢&:¢&3¢&,¢&%¢&¢&¢&¢& ¢&¢&û¡&ô¡&í¡&æ¡&ß¡&Ø¡&Ñ¡&Ê¡&á&¼¡&µ¡&®¡&§¡& ¡&™¡&’¡&‹¡&„¡&}¡&v¡&o¡&h¡&a¡&Z¡&S¡&L¡&E¡&>¡&7¡&0¡&)¡&"¡&¡&¡& ¡&¡&ÿ &ø &ñ &ê &ã &Ü &Õ &Π&Ç &À &¹ &² &« &¤ & &– & &ˆ & &z &s &l &e &^ &W &P &I &B &; &4 &- && & & & &  & &üŸ&õŸ&îŸ&çŸ&àŸ&ÙŸ&ÒŸ&ËŸ&ÄŸ&½Ÿ&¶Ÿ&¯Ÿ&¨Ÿ&¡Ÿ&šŸ&“Ÿ&ŒŸ&…Ÿ&~Ÿ&wŸ&pŸ&iŸ&bŸ&[Ÿ&TŸ&MŸ&FŸ&?Ÿ&8Ÿ&1Ÿ&*Ÿ&#Ÿ&Ÿ&Ÿ&Ÿ&Ÿ&Ÿ&ùž&òž&ëž&äž&Ýž&Öž&Ïž&Èž&Áž&ºž&³ž&¬ž&¥ž&žž&—ž&ž&‰ž&‚ž&{ž&tž&mž&fž&_ž&Xž&Qž&Jž&Cž&<ž&5ž&.ž&'ž& ž&ž&ž& ž&ž&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&úœ&óœ&ìœ&åœ&Þœ&ל&М&Éœ&œ&»œ&´œ&­œ&¦œ&Ÿœ&˜œ&‘œ&Šœ&ƒœ&|œ&uœ&nœ&gœ&`œ&Yœ&Rœ&Kœ&Dœ&=œ&6œ&/œ&(œ&!œ&œ&œ& œ&œ&þ›&÷›&ð›&é›&â›&Û›&Ô›&Í›&Æ›&¿›&¸›&±›&ª›&£›&œ›&•›&Ž›&‡›&€›&y›&r›&k›&d›&]›&V›&O›&H›&A›&:›&3›&,›&%›&›&›&›& ›&›&ûš&ôš&íš&æš&ßš&Øš&Ñš&Êš&Ú&¼š&µš&®š&§š& š&™š&’š&‹š&„š&}š&vš&oš&hš&aš&Zš&Sš&Lš&Eš&>š&7š&0š&)š&"š&š&š& š&š&ÿ™&ø™&ñ™&ê™&ã™&Ü™&Õ™&Ι&Ç™&À™&¹™&²™&«™&¤™&™&–™&™&ˆ™&™&z™&s™&l™&e™&^™&W™&P™&I™&B™&;™&4™&-™&&™&™&™&™& ™&™&ü˜&õ˜&î˜&ç˜&à˜&Ù˜&Ò˜&˘&Ę&½˜&¶˜&¯˜&¨˜&¡˜&š˜&“˜&Œ˜&…˜&~˜&w˜&p˜&i˜&b˜&[˜&T˜&M˜&F˜&?˜&8˜&1˜&*˜&#˜&˜&˜&˜&˜&˜&ù—&ò—&ë—&ä—&Ý—&Ö—&Ï—&È—&Á—&º—&³—&¬—&¥—&ž—&——&—&‰—&‚—&{—&t—&m—&f—&_—&X—&Q—&J—&C—&<—&5—&.—&'—& —&—&—& —&—&ý–&ö–&ï–&è–&á–&Ú–&Ó–&Ì–&Å–&¾–&·–&°–&©–&¢–&›–&”–&–&†–&–&x–&q–&j–&c–&\–&U–&N–&G–&@–&9–&2–&+–&$–&–&–&–&–&–&ú•&ó•&ì•&å•&Þ•&ו&Е&É•&•&»•&´•&­•&¦•&Ÿ•&˜•&‘•&Š•&ƒ•&|•&u•&n•&g•&`•&Y•&R•&K•&D•&=•&6•&/•&(•&!•&•&•& •&•&þ”&÷”&ð”&é”&â”&Û”&Ô”&Í”&Æ”&¿”&¸”&±”&ª”&£”&œ”&•”&Ž”&‡”&€”&y”&r”&k”&d”&]”&V”&O”&H”&A”&:”&3”&,”&%”&”&”&”& ”&”&û“&ô“&í“&æ“&ß“&Ø“&Ñ“&Ê“&Ó&¼“&µ“&®“&§“& “&™“&’“&‹“&„“&}“&v“&o“&h“&a“&Z“&S“&L“&E“&>“&7“&0“&)“&"“&“&“& “&“&ÿ’&ø’&ñ’&ê’&ã’&Ü’&Õ’&Î’&Ç’&À’&¹’&²’&«’&¤’&’&–’&’&ˆ’&’&z’&s’&l’&e’&^’&W’&P’&I’&B’&;’&4’&-’&&’&’&’&’& ’&’&ü‘&õ‘&î‘&ç‘&à‘&Ù‘&Ò‘&Ë‘&Ä‘&½‘&¶‘&¯‘&¨‘&¡‘&š‘&“‘&Œ‘&…‘&~‘&w‘&p‘&i‘&b‘&[‘&T‘&M‘&F‘&?‘&8‘&1‘&*‘&#‘&‘&‘&‘&‘&‘&ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&úŽ&óŽ&ìŽ&åŽ&ÞŽ&׎&ÐŽ&ÉŽ&ÂŽ&»Ž&´Ž&­Ž&¦Ž&ŸŽ&˜Ž&‘Ž&ŠŽ&ƒŽ&|Ž&uŽ&nŽ&gŽ&`Ž&YŽ&RŽ&KŽ&DŽ&=Ž&6Ž&/Ž&(Ž&!Ž&Ž&Ž& Ž&Ž&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&ûŒ&ôŒ&íŒ&æŒ&ߌ&ØŒ&ÑŒ&ÊŒ&ÃŒ&¼Œ&µŒ&®Œ&§Œ& Œ&™Œ&’Œ&‹Œ&„Œ&}Œ&vŒ&oŒ&hŒ&aŒ&ZŒ&SŒ&LŒ&EŒ&>Œ&7Œ&0Œ&)Œ&"Œ&Œ&Œ& Œ&Œ&ÿ‹&ø‹&ñ‹&ê‹&ã‹&Ü‹&Õ‹&΋&Ç‹&À‹&¹‹&²‹&«‹&¤‹&‹&–‹&‹&ˆ‹&‹&z‹&s‹&l‹&e‹&^‹&W‹&P‹&I‹&B‹&;‹&4‹&-‹&&‹&‹&‹&‹& ‹&‹&üŠ&õŠ&îŠ&çŠ&àŠ&ÙŠ&ÒŠ&ËŠ&ÄŠ&½Š&¶Š&¯Š&¨Š&¡Š&šŠ&“Š&ŒŠ&…Š&~Š&wŠ&pŠ&iŠ&bŠ&[Š&TŠ&MŠ&FŠ&?Š&8Š&1Š&*Š&#Š&Š&Š&Š&Š&Š&ù‰&ò‰&ë‰&ä‰&݉&Ö‰&ω&ȉ&Á‰&º‰&³‰&¬‰&¥‰&ž‰&—‰&‰&‰‰&‚‰&{‰&t‰&m‰&f‰&_‰&X‰&Q‰&J‰&C‰&<‰&5‰&.‰&'‰& ‰&‰&‰& ‰&‰&ýˆ&öˆ&ïˆ&èˆ&áˆ&Úˆ&Óˆ&̈&ň&¾ˆ&·ˆ&°ˆ&©ˆ&¢ˆ&›ˆ&”ˆ&ˆ&†ˆ&ˆ&xˆ&qˆ&jˆ&cˆ&\ˆ&Uˆ&Nˆ&Gˆ&@ˆ&9ˆ&2ˆ&+ˆ&$ˆ&ˆ&ˆ&ˆ&ˆ&ˆ&ú‡&ó‡&ì‡&å‡&Þ‡&ׇ&Ї&ɇ&‡&»‡&´‡&­‡&¦‡&Ÿ‡&˜‡&‘‡&Ї&ƒ‡&|‡&u‡&n‡&g‡&`‡&Y‡&R‡&K‡&D‡&=‡&6‡&/‡&(‡&!‡&‡&‡& ‡&‡&þ†&÷†&ð†&é†&â†&Û†&Ô†&͆&Ɔ&¿†&¸†&±†&ª†&£†&œ†&•†&ކ&‡†&€†&y†&r†&k†&d†&]†&V†&O†&H†&A†&:†&3†&,†&%†&†&†&†& †&†&û…&ô…&í…&æ…&ß…&Ø…&Ñ…&Ê…&Ã…&¼…&µ…&®…&§…& …&™…&’…&‹…&„…&}…&v…&o…&h…&a…&Z…&S…&L…&E…&>…&7…&0…&)…&"…&…&…& …&…&ÿ„&ø„&ñ„&ê„&ã„&Ü„&Õ„&΄&Ç„&À„&¹„&²„&«„&¤„&„&–„&„&ˆ„&„&z„&s„&l„&e„&^„&W„&P„&I„&B„&;„&4„&-„&&„&„&„&„& „&„&üƒ&õƒ&îƒ&çƒ&àƒ&Ùƒ&Òƒ&˃&ă&½ƒ&¶ƒ&¯ƒ&¨ƒ&¡ƒ&šƒ&“ƒ&Œƒ&…ƒ&~ƒ&wƒ&pƒ&iƒ&bƒ&[ƒ&Tƒ&Mƒ&Fƒ&?ƒ&8ƒ&1ƒ&*ƒ&#ƒ&ƒ&ƒ&ƒ&ƒ&ƒ&ù‚&ò‚&ë‚&ä‚&Ý‚&Ö‚&Ï‚&È‚&Á‚&º‚&³‚&¬‚&¥‚&ž‚&—‚&‚&‰‚&‚‚&{‚&t‚&m‚&f‚&_‚&X‚&Q‚&J‚&C‚&<‚&5‚&.‚&'‚& ‚&‚&‚& ‚&‚&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú€&ó€&ì€&å€&Þ€&×€&Ѐ&É€&€&»€&´€&­€&¦€&Ÿ€&˜€&‘€&Š€&ƒ€&|€&u€&n€&g€&`€&Y€&R€&K€&D€&=€&6€&/€&(€&!€&€&€& €&€&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û~&ô~&í~&æ~&ß~&Ø~&Ñ~&Ê~&Ã~&¼~&µ~&®~&§~& ~&™~&’~&‹~&„~&}~&v~&o~&h~&a~&Z~&S~&L~&E~&>~&7~&0~&)~&"~&~&~& ~&~&ÿ}&ø}&ñ}&ê}&ã}&Ü}&Õ}&Î}&Ç}&À}&¹}&²}&«}&¤}&}&–}&}&ˆ}&}&z}&s}&l}&e}&^}&W}&P}&I}&B}&;}&4}&-}&&}&}&}&}& }&}&ü|&õ|&î|&ç|&à|&Ù|&Ò|&Ë|&Ä|&½|&¶|&¯|&¨|&¡|&š|&“|&Œ|&…|&~|&w|&p|&i|&b|&[|&T|&M|&F|&?|&8|&1|&*|&#|&|&|&|&|&|&ù{&ò{&ë{&ä{&Ý{&Ö{&Ï{&È{&Á{&º{&³{&¬{&¥{&ž{&—{&{&‰{&‚{&{{&t{&m{&f{&_{&X{&Q{&J{&C{&<{&5{&.{&'{& {&{&{& {&{&ýz&öz&ïz&èz&áz&Úz&Óz&Ìz&Åz&¾z&·z&°z&©z&¢z&›z&”z&z&†z&z&xz&qz&jz&cz&\z&Uz&Nz&Gz&@z&9z&2z&+z&$z&z&z&z&z&z&úy&óy&ìy&åy&Þy&×y&Ðy&Éy&Ây&»y&´y&­y&¦y&Ÿy&˜y&‘y&Šy&ƒy&|y&uy&ny&gy&`y&Yy&Ry&Ky&Dy&=y&6y&/y&(y&!y&y&y& y&y&þx&÷x&ðx&éx&âx&Ûx&Ôx&Íx&Æx&¿x&¸x&±x&ªx&£x&œx&•x&Žx&‡x&€x&yx&rx&kx&dx&]x&Vx&Ox&Hx&Ax&:x&3x&,x&%x&x&x&x& x&x&ûw&ôw&íw&æw&ßw&Øw&Ñw&Êw&Ãw&¼w&µw&®w&§w& w&™w&’w&‹w&„w&}w&vw&ow&hw&aw&Zw&Sw&Lw&Ew&>w&7w&0w&)w&"w&w&w& w&w&ÿv&øv&ñv&êv&ãv&Üv&Õv&Îv&Çv&Àv&¹v&²v&«v&¤v&v&–v&v&ˆv&v&zv&sv&lv&ev&^v&Wv&Pv&Iv&Bv&;v&4v&-v&&v&v&v&v& v&v&üu&õu&îu&çu&àu&Ùu&Òu&Ëu&Äu&½u&¶u&¯u&¨u&¡u&šu&“u&Œu&…u&~u&wu&pu&iu&bu&[u&Tu&Mu&Fu&?u&8u&1u&*u&#u&u&u&u&u&u&ùt&òt&ët&ät&Ýt&Öt&Ït&Èt&Át&ºt&³t&¬t&¥t&žt&—t&t&‰t&‚t&{t&tt&mt&ft&_t&Xt&Qt&Jt&Ct&p&7p&0p&)p&"p&p&p& p&p&ÿo&øo&ño&êo&ão&Üo&Õo&Îo&Ço&Ào&¹o&²o&«o&¤o&o&–o&o&ˆo&o&zo&so&lo&eo&^o&Wo&Po&Io&Bo&;o&4o&-o&&o&o&o&o& o&o&ün&õn&în&çn&àn&Ùn&Òn&Ën&Än&½n&¶n&¯n&¨n&¡n&šn&“n&Œn&…n&~n&wn&pn&in&bn&[n&Tn&Mn&Fn&?n&8n&1n&*n&#n&n&n&n&n&n&ùm&òm&ëm&äm&Ým&Öm&Ïm&Èm&Ám&ºm&³m&¬m&¥m&žm&—m&m&‰m&‚m&{m&tm&mm&fm&_m&Xm&Qm&Jm&Cm&i&7i&0i&)i&"i&i&i& i&i&ÿh&øh&ñh&êh&ãh&Üh&Õh&Îh&Çh&Àh&¹h&²h&«h&¤h&h&–h&h&ˆh&h&zh&sh&lh&eh&^h&Wh&Ph&Ih&Bh&;h&4h&-h&&h&h&h&h& h&h&üg&õg&îg&çg&àg&Ùg&Òg&Ëg&Äg&½g&¶g&¯g&¨g&¡g&šg&“g&Œg&…g&~g&wg&pg&ig&bg&[g&Tg&Mg&Fg&?g&8g&1g&*g&#g&g&g&g&g&g&ùf&òf&ëf&äf&Ýf&Öf&Ïf&Èf&Áf&ºf&³f&¬f&¥f&žf&—f&f&‰f&‚f&{f&tf&mf&ff&_f&Xf&Qf&Jf&Cf&b&7b&0b&)b&"b&b&b& b&b&ÿa&øa&ña&êa&ãa&Üa&Õa&Îa&Ça&Àa&¹a&²a&«a&¤a&a&–a&a&ˆa&a&za&sa&la&ea&^a&Wa&Pa&Ia&Ba&;a&4a&-a&&a&a&a&a& a&a&ü`&õ`&î`&ç`&à`&Ù`&Ò`&Ë`&Ä`&½`&¶`&¯`&¨`&¡`&š`&“`&Œ`&…`&~`&w`&p`&i`&b`&[`&T`&M`&F`&?`&8`&1`&*`&#`&`&`&`&`&`&ù_&ò_&ë_&ä_&Ý_&Ö_&Ï_&È_&Á_&º_&³_&¬_&¥_&ž_&—_&_&‰_&‚_&{_&t_&m_&f_&__&X_&Q_&J_&C_&<_&5_&._&'_& _&_&_& _&_&ý^&ö^&ï^&è^&á^&Ú^&Ó^&Ì^&Å^&¾^&·^&°^&©^&¢^&›^&”^&^&†^&^&x^&q^&j^&c^&\^&U^&N^&G^&@^&9^&2^&+^&$^&^&^&^&^&^&ú]&ó]&ì]&å]&Þ]&×]&Ð]&É]&Â]&»]&´]&­]&¦]&Ÿ]&˜]&‘]&Š]&ƒ]&|]&u]&n]&g]&`]&Y]&R]&K]&D]&=]&6]&/]&(]&!]&]&]& ]&]&þ\&÷\&ð\&é\&â\&Û\&Ô\&Í\&Æ\&¿\&¸\&±\&ª\&£\&œ\&•\&Ž\&‡\&€\&y\&r\&k\&d\&]\&V\&O\&H\&A\&:\&3\&,\&%\&\&\&\& \&\&û[&ô[&í[&æ[&ß[&Ø[&Ñ[&Ê[&Ã[&¼[&µ[&®[&§[& [&™[&’[&‹[&„[&}[&v[&o[&h[&a[&Z[&S[&L[&E[&>[&7[&0[&)[&"[&[&[& [&[&ÿZ&øZ&ñZ&êZ&ãZ&ÜZ&ÕZ&ÎZ&ÇZ&ÀZ&¹Z&²Z&«Z&¤Z&Z&–Z&Z&ˆZ&Z&zZ&sZ&lZ&eZ&^Z&WZ&PZ&IZ&BZ&;Z&4Z&-Z&&Z&Z&Z&Z& Z&Z&üY&õY&îY&çY&àY&ÙY&ÒY&ËY&ÄY&½Y&¶Y&¯Y&¨Y&¡Y&šY&“Y&ŒY&…Y&~Y&wY&pY&iY&bY&[Y&TY&MY&FY&?Y&8Y&1Y&*Y&#Y&Y&Y&Y&Y&Y&ùX&òX&ëX&äX&ÝX&ÖX&ÏX&ÈX&ÁX&ºX&³X&¬X&¥X&žX&—X&X&‰X&‚X&{X&tX&mX&fX&_X&XX&QX&JX&CX&T&7T&0T&)T&"T&T&T& T&T&ÿS&øS&ñS&êS&ãS&ÜS&ÕS&ÎS&ÇS&ÀS&¹S&²S&«S&¤S&S&–S&S&ˆS&S&zS&sS&lS&eS&^S&WS&PS&IS&BS&;S&4S&-S&&S&S&S&S& S&S&üR&õR&îR&çR&àR&ÙR&ÒR&ËR&ÄR&½R&¶R&¯R&¨R&¡R&šR&“R&ŒR&…R&~R&wR&pR&iR&bR&[R&TR&MR&FR&?R&8R&1R&*R&#R&R&R&R&R&R&ùQ&òQ&ëQ&äQ&ÝQ&ÖQ&ÏQ&ÈQ&ÁQ&ºQ&³Q&¬Q&¥Q&žQ&—Q&Q&‰Q&‚Q&{Q&tQ&mQ&fQ&_Q&XQ&QQ&JQ&CQ&M&7M&0M&)M&"M&M&M& M&M&ÿL&øL&ñL&êL&ãL&ÜL&ÕL&ÎL&ÇL&ÀL&¹L&²L&«L&¤L&L&–L&L&ˆL&L&zL&sL&lL&eL&^L&WL&PL&IL&BL&;L&4L&-L&&L&L&L&L& L&L&üK&õK&îK&çK&àK&ÙK&ÒK&ËK&ÄK&½K&¶K&¯K&¨K&¡K&šK&“K&ŒK&…K&~K&wK&pK&iK&bK&[K&TK&MK&FK&?K&8K&1K&*K&#K&K&K&K&K&K&ùJ&òJ&ëJ&äJ&ÝJ&ÖJ&ÏJ&ÈJ&ÁJ&ºJ&³J&¬J&¥J&žJ&—J&J&‰J&‚J&{J&tJ&mJ&fJ&_J&XJ&QJ&JJ&CJ&F&7F&0F&)F&"F&F&F& F&F&ÿE&øE&ñE&êE&ãE&ÜE&ÕE&ÎE&ÇE&ÀE&¹E&²E&«E&¤E&E&–E&E&ˆE&E&zE&sE&lE&eE&^E&WE&PE&IE&BE&;E&4E&-E&&E&E&E&E& E&E&üD&õD&îD&çD&àD&ÙD&ÒD&ËD&ÄD&½D&¶D&¯D&¨D&¡D&šD&“D&ŒD&…D&~D&wD&pD&iD&bD&[D&TD&MD&FD&?D&8D&1D&*D&#D&D&D&D&D&D&ùC&òC&ëC&äC&ÝC&ÖC&ÏC&ÈC&ÁC&ºC&³C&¬C&¥C&žC&—C&C&‰C&‚C&{C&tC&mC&fC&_C&XC&QC&JC&CC&?&7?&0?&)?&"?&?&?& ?&?&ÿ>&ø>&ñ>&ê>&ã>&Ü>&Õ>&Î>&Ç>&À>&¹>&²>&«>&¤>&>&–>&>&ˆ>&>&z>&s>&l>&e>&^>&W>&P>&I>&B>&;>&4>&->&&>&>&>&>& >&>&ü=&õ=&î=&ç=&à=&Ù=&Ò=&Ë=&Ä=&½=&¶=&¯=&¨=&¡=&š=&“=&Œ=&…=&~=&w=&p=&i=&b=&[=&T=&M=&F=&?=&8=&1=&*=&#=&=&=&=&=&=&ù<&ò<&ë<&ä<&Ý<&Ö<&Ï<&È<&Á<&º<&³<&¬<&¥<&ž<&—<&<&‰<&‚<&{<&t<&m<&f<&_<&X<&Q<&J<&C<&<<&5<&.<&'<& <&<&<& <&<&ý;&ö;&ï;&è;&á;&Ú;&Ó;&Ì;&Å;&¾;&·;&°;&©;&¢;&›;&”;&;&†;&;&x;&q;&j;&c;&\;&U;&N;&G;&@;&9;&2;&+;&$;&;&;&;&;&;&ú:&ó:&ì:&å:&Þ:&×:&Ð:&É:&Â:&»:&´:&­:&¦:&Ÿ:&˜:&‘:&Š:&ƒ:&|:&u:&n:&g:&`:&Y:&R:&K:&D:&=:&6:&/:&(:&!:&:&:& :&:&þ9&÷9&ð9&é9&â9&Û9&Ô9&Í9&Æ9&¿9&¸9&±9&ª9&£9&œ9&•9&Ž9&‡9&€9&y9&r9&k9&d9&]9&V9&O9&H9&A9&:9&39&,9&%9&9&9&9& 9&9&û8&ô8&í8&æ8&ß8&Ø8&Ñ8&Ê8&Ã8&¼8&µ8&®8&§8& 8&™8&’8&‹8&„8&}8&v8&o8&h8&a8&Z8&S8&L8&E8&>8&78&08&)8&"8&8&8& 8&8&ÿ7&ø7&ñ7&ê7&ã7&Ü7&Õ7&Î7&Ç7&À7&¹7&²7&«7&¤7&7&–7&7&ˆ7&7&z7&s7&l7&e7&^7&W7&P7&I7&B7&;7&47&-7&&7&7&7&7& 7&7&ü6&õ6&î6&ç6&à6&Ù6&Ò6&Ë6&Ä6&½6&¶6&¯6&¨6&¡6&š6&“6&Œ6&…6&~6&w6&p6&i6&b6&[6&T6&M6&F6&?6&86&16&*6&#6&6&6&6&6&6&ù5&ò5&ë5&ä5&Ý5&Ö5&Ï5&È5&Á5&º5&³5&¬5&¥5&ž5&—5&5&‰5&‚5&{5&t5&m5&f5&_5&X5&Q5&J5&C5&<5&55&.5&'5& 5&5&5& 5&5&ý4&ö4&ï4&è4&á4&Ú4&Ó4&Ì4&Å4&¾4&·4&°4&©4&¢4&›4&”4&4&†4&4&x4&q4&j4&c4&\4&U4&N4&G4&@4&94&24&+4&$4&4&4&4&4&4&ú3&ó3&ì3&å3&Þ3&×3&Ð3&É3&Â3&»3&´3&­3&¦3&Ÿ3&˜3&‘3&Š3&ƒ3&|3&u3&n3&g3&`3&Y3&R3&K3&D3&=3&63&/3&(3&!3&3&3& 3&3&þ2&÷2&ð2&é2&â2&Û2&Ô2&Í2&Æ2&¿2&¸2&±2&ª2&£2&œ2&•2&Ž2&‡2&€2&y2&r2&k2&d2&]2&V2&O2&H2&A2&:2&32&,2&%2&2&2&2& 2&2&û1&ô1&í1&æ1&ß1&Ø1&Ñ1&Ê1&Ã1&¼1&µ1&®1&§1& 1&™1&’1&‹1&„1&}1&v1&o1&h1&a1&Z1&S1&L1&E1&>1&71&01&)1&"1&1&1& 1&1&ÿ0&ø0&ñ0&ê0&ã0&Ü0&Õ0&Î0&Ç0&À0&¹0&²0&«0&¤0&0&–0&0&ˆ0&0&z0&s0&l0&e0&^0&W0&P0&I0&B0&;0&40&-0&&0&0&0&0& 0&0&ü/&õ/&î/&ç/&à/&Ù/&Ò/&Ë/&Ä/&½/&¶/&¯/&¨/&¡/&š/&“/&Œ/&…/&~/&w/&p/&i/&b/&[/&T/&M/&F/&?/&8/&1/&*/&#/&/&/&/&/&/&ù.&ò.&ë.&ä.&Ý.&Ö.&Ï.&È.&Á.&º.&³.&¬.&¥.&ž.&—.&.&‰.&‚.&{.&t.&m.&f.&_.&X.&Q.&J.&C.&<.&5.&..&'.& .&.&.& .&.&ý-&ö-&ï-&è-&á-&Ú-&Ó-&Ì-&Å-&¾-&·-&°-&©-&¢-&›-&”-&-&†-&-&x-&q-&j-&c-&\-&U-&N-&G-&@-&9-&2-&+-&$-&-&-&-&-&-&ú,&ó,&ì,&å,&Þ,&×,&Ð,&É,&Â,&»,&´,&­,&¦,&Ÿ,&˜,&‘,&Š,&ƒ,&|,&u,&n,&g,&`,&Y,&R,&K,&D,&=,&6,&/,&(,&!,&,&,& ,&,&þ+&÷+&ð+&é+&â+&Û+&Ô+&Í+&Æ+&¿+&¸+&±+&ª+&£+&œ+&•+&Ž+&‡+&€+&y+&r+&k+&d+&]+&V+&O+&H+&A+&:+&3+&,+&%+&+&+&+& +&+&û*&ô*&í*&æ*&ß*&Ø*&Ñ*&Ê*&Ã*&¼*&µ*&®*&§*& *&™*&’*&‹*&„*&}*&v*&o*&h*&a*&Z*&S*&L*&E*&>*&7*&0*&)*&"*&*&*& *&*&ÿ)&ø)&ñ)&ê)&ã)&Ü)&Õ)&Î)&Ç)&À)&¹)&²)&«)&¤)&)&–)&)&ˆ)&)&z)&s)&l)&e)&^)&W)&P)&I)&B)&;)&4)&-)&&)&)&)&)& )&)&ü(&õ(&î(&ç(&à(&Ù(&Ò(&Ë(&Ä(&½(&¶(&¯(&¨(&¡(&š(&“(&Œ(&…(&~(&w(&p(&i(&b(&[(&T(&M(&F(&?(&8(&1(&*(&#(&(&(&(&(&(&ù'&ò'&ë'&ä'&Ý'&Ö'&Ï'&È'&Á'&º'&³'&¬'&¥'&ž'&—'&'&‰'&‚'&{'&t'&m'&f'&_'&X'&Q'&J'&C'&<'&5'&.'&''& '&'&'& '&'&ý&&ö&&ï&&è&&á&&Ú&&Ó&&Ì&&Å&&¾&&·&&°&&©&&¢&&›&&”&&&&†&&&&x&&q&&j&&c&&\&&U&&N&&G&&@&&9&&2&&+&&$&&&&&&&&&&&&ú%&ó%&ì%&å%&Þ%&×%&Ð%&É%&Â%&»%&´%&­%&¦%&Ÿ%&˜%&‘%&Š%&ƒ%&|%&u%&n%&g%&`%&Y%&R%&K%&D%&=%&6%&/%&(%&!%&%&%& %&%&þ$&÷$&ð$&é$&â$&Û$&Ô$&Í$&Æ$&¿$&¸$&±$&ª$&£$&œ$&•$&Ž$&‡$&€$&y$&r$&k$&d$&]$&V$&O$&H$&A$&:$&3$&,$&%$&$&$&$& $&$&û#&ô#&í#&æ#&ß#&Ø#&Ñ#&Ê#&Ã#&¼#&µ#&®#&§#& #&™#&’#&‹#&„#&}#&v#&o#&h#&a#&Z#&S#&L#&E#&>#&7#&0#&)#&"#&#&#& #&#&ÿ"&ø"&ñ"&ê"&ã"&Ü"&Õ"&Î"&Ç"&À"&¹"&²"&«"&¤"&"&–"&"&ˆ"&"&z"&s"&l"&e"&^"&W"&P"&I"&B"&;"&4"&-"&&"&"&"&"& "&"&ü!&õ!&î!&ç!&à!&Ù!&Ò!&Ë!&Ä!&½!&¶!&¯!&¨!&¡!&š!&“!&Œ!&…!&~!&w!&p!&i!&b!&[!&T!&M!&F!&?!&8!&1!&*!&#!&!&!&!&!&!&ù &ò &ë &ä &Ý &Ö &Ï &È &Á &º &³ &¬ &¥ &ž &— & &‰ &‚ &{ &t &m &f &_ &X &Q &J &C &< &5 &. &' & & & & & &ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ &ø &ñ &ê &ã &Ü &Õ &Î &Ç &À &¹ &² &« &¤ & &– & &ˆ & &z &s &l &e &^ &W &P &I &B &; &4 &- && & & & & & &ü &õ &î &ç &à &Ù &Ò &Ë &Ä &½ &¶ &¯ &¨ &¡ &š &“ &Œ &… &~ &w &p &i &b &[ &T &M &F &? &8 &1 &* &# & & & & & &ù &ò &ë &ä &Ý &Ö &Ï &È &Á &º &³ &¬ &¥ &ž &— & &‰ &‚ &{ &t &m &f &_ &X &Q &J &C &< &5 &. &' & & & & & &ý &ö &ï &è &á &Ú &Ó &Ì &Å &¾ &· &° &© &¢ &› &” & &† & &x &q &j &c &\ &U &N &G &@ &9 &2 &+ &$ & & & & & &ú &ó &ì &å &Þ &× &Ð &É & &» &´ &­ &¦ &Ÿ &˜ &‘ &Š &ƒ &| &u &n &g &` &Y &R &K &D &= &6 &/ &( &! & & & & &þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿÿ%øÿ%ñÿ%êÿ%ãÿ%Üÿ%Õÿ%Îÿ%Çÿ%Àÿ%¹ÿ%²ÿ%«ÿ%¤ÿ%ÿ%–ÿ%ÿ%ˆÿ%ÿ%zÿ%sÿ%lÿ%eÿ%^ÿ%Wÿ%Pÿ%Iÿ%Bÿ%;ÿ%4ÿ%-ÿ%&ÿ%ÿ%ÿ%ÿ% ÿ%ÿ%üþ%õþ%îþ%çþ%àþ%Ùþ%Òþ%Ëþ%Äþ%½þ%¶þ%¯þ%¨þ%¡þ%šþ%“þ%Œþ%…þ%~þ%wþ%pþ%iþ%bþ%[þ%Tþ%Mþ%Fþ%?þ%8þ%1þ%*þ%#þ%þ%þ%þ%þ%þ%ùý%òý%ëý%äý%Ýý%Öý%Ïý%Èý%Áý%ºý%³ý%¬ý%¥ý%žý%—ý%ý%‰ý%‚ý%{ý%tý%mý%fý%_ý%Xý%Qý%Jý%Cý%<ý%5ý%.ý%'ý% ý%ý%ý% ý%ý%ýü%öü%ïü%èü%áü%Úü%Óü%Ìü%Åü%¾ü%·ü%°ü%©ü%¢ü%›ü%”ü%ü%†ü%ü%xü%qü%jü%cü%\ü%Uü%Nü%Gü%@ü%9ü%2ü%+ü%$ü%ü%ü%ü%ü%ü%úû%óû%ìû%åû%Þû%×û%Ðû%Éû%Âû%»û%´û%­û%¦û%Ÿû%˜û%‘û%Šû%ƒû%|û%uû%nû%gû%`û%Yû%Rû%Kû%Dû%=û%6û%/û%(û%!û%û%û% û%û%þú%÷ú%ðú%éú%âú%Ûú%Ôú%Íú%Æú%¿ú%¸ú%±ú%ªú%£ú%œú%•ú%Žú%‡ú%€ú%yú%rú%kú%dú%]ú%Vú%Oú%Hú%Aú%:ú%3ú%,ú%%ú%ú%ú%ú% ú%ú%ûù%ôù%íù%æù%ßù%Øù%Ñù%Êù%Ãù%¼ù%µù%®ù%§ù% ù%™ù%’ù%‹ù%„ù%}ù%vù%où%hù%aù%Zù%Sù%Lù%Eù%>ù%7ù%0ù%)ù%"ù%ù%ù% ù%ù%ÿø%øø%ñø%êø%ãø%Üø%Õø%Îø%Çø%Àø%¹ø%²ø%«ø%¤ø%ø%–ø%ø%ˆø%ø%zø%sø%lø%eø%^ø%Wø%Pø%Iø%Bø%;ø%4ø%-ø%&ø%ø%ø%ø% ø%ø%ü÷%õ÷%î÷%ç÷%à÷%Ù÷%Ò÷%Ë÷%Ä÷%½÷%¶÷%¯÷%¨÷%¡÷%š÷%“÷%Œ÷%…÷%~÷%w÷%p÷%i÷%b÷%[÷%T÷%M÷%F÷%?÷%8÷%1÷%*÷%#÷%÷%÷%÷%÷%÷%ùö%òö%ëö%äö%Ýö%Öö%Ïö%Èö%Áö%ºö%³ö%¬ö%¥ö%žö%—ö%ö%‰ö%‚ö%{ö%tö%mö%fö%_ö%Xö%Qö%Jö%Cö%<ö%5ö%.ö%'ö% ö%ö%ö% ö%ö%ýõ%öõ%ïõ%èõ%áõ%Úõ%Óõ%Ìõ%Åõ%¾õ%·õ%°õ%©õ%¢õ%›õ%”õ%õ%†õ%õ%xõ%qõ%jõ%cõ%\õ%Uõ%Nõ%Gõ%@õ%9õ%2õ%+õ%$õ%õ%õ%õ%õ%õ%úô%óô%ìô%åô%Þô%×ô%Ðô%Éô%Âô%»ô%´ô%­ô%¦ô%Ÿô%˜ô%‘ô%Šô%ƒô%|ô%uô%nô%gô%`ô%Yô%Rô%Kô%Dô%=ô%6ô%/ô%(ô%!ô%ô%ô% ô%ô%þó%÷ó%ðó%éó%âó%Ûó%Ôó%Íó%Æó%¿ó%¸ó%±ó%ªó%£ó%œó%•ó%Žó%‡ó%€ó%yó%ró%kó%dó%]ó%Vó%Oó%Hó%Aó%:ó%3ó%,ó%%ó%ó%ó%ó% ó%ó%ûò%ôò%íò%æò%ßò%Øò%Ñò%Êò%Ãò%¼ò%µò%®ò%§ò% ò%™ò%’ò%‹ò%„ò%}ò%vò%oò%hò%aò%Zò%Sò%Lò%Eò%>ò%7ò%0ò%)ò%"ò%ò%ò% ò%ò%ÿñ%øñ%ññ%êñ%ãñ%Üñ%Õñ%Îñ%Çñ%Àñ%¹ñ%²ñ%«ñ%¤ñ%ñ%–ñ%ñ%ˆñ%ñ%zñ%sñ%lñ%eñ%^ñ%Wñ%Pñ%Iñ%Bñ%;ñ%4ñ%-ñ%&ñ%ñ%ñ%ñ% ñ%ñ%üð%õð%îð%çð%àð%Ùð%Òð%Ëð%Äð%½ð%¶ð%¯ð%¨ð%¡ð%šð%“ð%Œð%…ð%~ð%wð%pð%ið%bð%[ð%Tð%Mð%Fð%?ð%8ð%1ð%*ð%#ð%ð%ð%ð%ð%ð%ùï%òï%ëï%äï%Ýï%Öï%Ïï%Èï%Áï%ºï%³ï%¬ï%¥ï%žï%—ï%ï%‰ï%‚ï%{ï%tï%mï%fï%_ï%Xï%Qï%Jï%Cï%<ï%5ï%.ï%'ï% ï%ï%ï% ï%ï%ýî%öî%ïî%èî%áî%Úî%Óî%Ìî%Åî%¾î%·î%°î%©î%¢î%›î%”î%î%†î%î%xî%qî%jî%cî%\î%Uî%Nî%Gî%@î%9î%2î%+î%$î%î%î%î%î%î%úí%óí%ìí%åí%Þí%×í%Ðí%Éí%Âí%»í%´í%­í%¦í%Ÿí%˜í%‘í%Ší%ƒí%|í%uí%ní%gí%`í%Yí%Rí%Kí%Dí%=í%6í%/í%(í%!í%í%í% í%í%þì%÷ì%ðì%éì%âì%Ûì%Ôì%Íì%Æì%¿ì%¸ì%±ì%ªì%£ì%œì%•ì%Žì%‡ì%€ì%yì%rì%kì%dì%]ì%Vì%Oì%Hì%Aì%:ì%3ì%,ì%%ì%ì%ì%ì% ì%ì%ûë%ôë%íë%æë%ßë%Øë%Ñë%Êë%Ãë%¼ë%µë%®ë%§ë% ë%™ë%’ë%‹ë%„ë%}ë%vë%oë%hë%aë%Zë%Së%Lë%Eë%>ë%7ë%0ë%)ë%"ë%ë%ë% ë%ë%ÿê%øê%ñê%êê%ãê%Üê%Õê%Îê%Çê%Àê%¹ê%²ê%«ê%¤ê%ê%–ê%ê%ˆê%ê%zê%sê%lê%eê%^ê%Wê%Pê%Iê%Bê%;ê%4ê%-ê%&ê%ê%ê%ê% ê%ê%üé%õé%îé%çé%àé%Ùé%Òé%Ëé%Äé%½é%¶é%¯é%¨é%¡é%šé%“é%Œé%…é%~é%wé%pé%ié%bé%[é%Té%Mé%Fé%?é%8é%1é%*é%#é%é%é%é%é%é%ùè%òè%ëè%äè%Ýè%Öè%Ïè%Èè%Áè%ºè%³è%¬è%¥è%žè%—è%è%‰è%‚è%{è%tè%mè%fè%_è%Xè%Qè%Jè%Cè%<è%5è%.è%'è% è%è%è% è%è%ýç%öç%ïç%èç%áç%Úç%Óç%Ìç%Åç%¾ç%·ç%°ç%©ç%¢ç%›ç%”ç%ç%†ç%ç%xç%qç%jç%cç%\ç%Uç%Nç%Gç%@ç%9ç%2ç%+ç%$ç%ç%ç%ç%ç%ç%úæ%óæ%ìæ%åæ%Þæ%׿%Ðæ%Éæ%Âæ%»æ%´æ%­æ%¦æ%Ÿæ%˜æ%‘æ%Šæ%ƒæ%|æ%uæ%næ%gæ%`æ%Yæ%Ræ%Kæ%Dæ%=æ%6æ%/æ%(æ%!æ%æ%æ% æ%æ%þå%÷å%ðå%éå%âå%Ûå%Ôå%Íå%Æå%¿å%¸å%±å%ªå%£å%œå%•å%Žå%‡å%€å%yå%rå%kå%då%]å%Vå%Oå%Hå%Aå%:å%3å%,å%%å%å%å%å% å%å%ûä%ôä%íä%æä%ßä%Øä%Ñä%Êä%Ãä%¼ä%µä%®ä%§ä% ä%™ä%’ä%‹ä%„ä%}ä%vä%oä%hä%aä%Zä%Sä%Lä%Eä%>ä%7ä%0ä%)ä%"ä%ä%ä% ä%ä%ÿã%øã%ñã%êã%ãã%Üã%Õã%Îã%Çã%Àã%¹ã%²ã%«ã%¤ã%ã%–ã%ã%ˆã%ã%zã%sã%lã%eã%^ã%Wã%Pã%Iã%Bã%;ã%4ã%-ã%&ã%ã%ã%ã% ã%ã%üâ%õâ%îâ%çâ%àâ%Ùâ%Òâ%Ëâ%Äâ%½â%¶â%¯â%¨â%¡â%šâ%“â%Œâ%…â%~â%wâ%pâ%iâ%bâ%[â%Tâ%Mâ%Fâ%?â%8â%1â%*â%#â%â%â%â%â%â%ùá%òá%ëá%äá%Ýá%Öá%Ïá%Èá%Áá%ºá%³á%¬á%¥á%žá%—á%á%‰á%‚á%{á%tá%má%fá%_á%Xá%Qá%Já%Cá%<á%5á%.á%'á% á%á%á% á%á%ýà%öà%ïà%èà%áà%Úà%Óà%Ìà%Åà%¾à%·à%°à%©à%¢à%›à%”à%à%†à%à%xà%qà%jà%cà%\à%Uà%Nà%Gà%@à%9à%2à%+à%$à%à%à%à%à%à%úß%óß%ìß%åß%Þß%×ß%Ðß%Éß%Âß%»ß%´ß%­ß%¦ß%Ÿß%˜ß%‘ß%Šß%ƒß%|ß%uß%nß%gß%`ß%Yß%Rß%Kß%Dß%=ß%6ß%/ß%(ß%!ß%ß%ß% ß%ß%þÞ%÷Þ%ðÞ%éÞ%âÞ%ÛÞ%ÔÞ%ÍÞ%ÆÞ%¿Þ%¸Þ%±Þ%ªÞ%£Þ%œÞ%•Þ%ŽÞ%‡Þ%€Þ%yÞ%rÞ%kÞ%dÞ%]Þ%VÞ%OÞ%HÞ%AÞ%:Þ%3Þ%,Þ%%Þ%Þ%Þ%Þ% Þ%Þ%ûÝ%ôÝ%íÝ%æÝ%ßÝ%ØÝ%ÑÝ%ÊÝ%ÃÝ%¼Ý%µÝ%®Ý%§Ý% Ý%™Ý%’Ý%‹Ý%„Ý%}Ý%vÝ%oÝ%hÝ%aÝ%ZÝ%SÝ%LÝ%EÝ%>Ý%7Ý%0Ý%)Ý%"Ý%Ý%Ý% Ý%Ý%ÿÜ%øÜ%ñÜ%êÜ%ãÜ%ÜÜ%ÕÜ%ÎÜ%ÇÜ%ÀÜ%¹Ü%²Ü%«Ü%¤Ü%Ü%–Ü%Ü%ˆÜ%Ü%zÜ%sÜ%lÜ%eÜ%^Ü%WÜ%PÜ%IÜ%BÜ%;Ü%4Ü%-Ü%&Ü%Ü%Ü%Ü% Ü%Ü%üÛ%õÛ%îÛ%çÛ%àÛ%ÙÛ%ÒÛ%ËÛ%ÄÛ%½Û%¶Û%¯Û%¨Û%¡Û%šÛ%“Û%ŒÛ%…Û%~Û%wÛ%pÛ%iÛ%bÛ%[Û%TÛ%MÛ%FÛ%?Û%8Û%1Û%*Û%#Û%Û%Û%Û%Û%Û%ùÚ%òÚ%ëÚ%äÚ%ÝÚ%ÖÚ%ÏÚ%ÈÚ%ÁÚ%ºÚ%³Ú%¬Ú%¥Ú%žÚ%—Ú%Ú%‰Ú%‚Ú%{Ú%tÚ%mÚ%fÚ%_Ú%XÚ%QÚ%JÚ%CÚ%<Ú%5Ú%.Ú%'Ú% Ú%Ú%Ú% Ú%Ú%ýÙ%öÙ%ïÙ%èÙ%áÙ%ÚÙ%ÓÙ%ÌÙ%ÅÙ%¾Ù%·Ù%°Ù%©Ù%¢Ù%›Ù%”Ù%Ù%†Ù%Ù%xÙ%qÙ%jÙ%cÙ%\Ù%UÙ%NÙ%GÙ%@Ù%9Ù%2Ù%+Ù%$Ù%Ù%Ù%Ù%Ù%Ù%úØ%óØ%ìØ%åØ%ÞØ%ר%ÐØ%ÉØ%ÂØ%»Ø%´Ø%­Ø%¦Ø%ŸØ%˜Ø%‘Ø%ŠØ%ƒØ%|Ø%uØ%nØ%gØ%`Ø%YØ%RØ%KØ%DØ%=Ø%6Ø%/Ø%(Ø%!Ø%Ø%Ø% Ø%Ø%þ×%÷×%ð×%é×%â×%Û×%Ô×%Í×%Æ×%¿×%¸×%±×%ª×%£×%œ×%•×%Ž×%‡×%€×%y×%r×%k×%d×%]×%V×%O×%H×%A×%:×%3×%,×%%×%×%×%×% ×%×%ûÖ%ôÖ%íÖ%æÖ%ßÖ%ØÖ%ÑÖ%ÊÖ%ÃÖ%¼Ö%µÖ%®Ö%§Ö% Ö%™Ö%’Ö%‹Ö%„Ö%}Ö%vÖ%oÖ%hÖ%aÖ%ZÖ%SÖ%LÖ%EÖ%>Ö%7Ö%0Ö%)Ö%"Ö%Ö%Ö% Ö%Ö%ÿÕ%øÕ%ñÕ%êÕ%ãÕ%ÜÕ%ÕÕ%ÎÕ%ÇÕ%ÀÕ%¹Õ%²Õ%«Õ%¤Õ%Õ%–Õ%Õ%ˆÕ%Õ%zÕ%sÕ%lÕ%eÕ%^Õ%WÕ%PÕ%IÕ%BÕ%;Õ%4Õ%-Õ%&Õ%Õ%Õ%Õ% Õ%Õ%üÔ%õÔ%îÔ%çÔ%àÔ%ÙÔ%ÒÔ%ËÔ%ÄÔ%½Ô%¶Ô%¯Ô%¨Ô%¡Ô%šÔ%“Ô%ŒÔ%…Ô%~Ô%wÔ%pÔ%iÔ%bÔ%[Ô%TÔ%MÔ%FÔ%?Ô%8Ô%1Ô%*Ô%#Ô%Ô%Ô%Ô%Ô%Ô%ùÓ%òÓ%ëÓ%äÓ%ÝÓ%ÖÓ%ÏÓ%ÈÓ%ÁÓ%ºÓ%³Ó%¬Ó%¥Ó%žÓ%—Ó%Ó%‰Ó%‚Ó%{Ó%tÓ%mÓ%fÓ%_Ó%XÓ%QÓ%JÓ%CÓ%<Ó%5Ó%.Ó%'Ó% Ó%Ó%Ó% Ó%Ó%ýÒ%öÒ%ïÒ%èÒ%áÒ%ÚÒ%ÓÒ%ÌÒ%ÅÒ%¾Ò%·Ò%°Ò%©Ò%¢Ò%›Ò%”Ò%Ò%†Ò%Ò%xÒ%qÒ%jÒ%cÒ%\Ò%UÒ%NÒ%GÒ%@Ò%9Ò%2Ò%+Ò%$Ò%Ò%Ò%Ò%Ò%Ò%úÑ%óÑ%ìÑ%åÑ%ÞÑ%×Ñ%ÐÑ%ÉÑ%ÂÑ%»Ñ%´Ñ%­Ñ%¦Ñ%ŸÑ%˜Ñ%‘Ñ%ŠÑ%ƒÑ%|Ñ%uÑ%nÑ%gÑ%`Ñ%YÑ%RÑ%KÑ%DÑ%=Ñ%6Ñ%/Ñ%(Ñ%!Ñ%Ñ%Ñ% Ñ%Ñ%þÐ%÷Ð%ðÐ%éÐ%âÐ%ÛÐ%ÔÐ%ÍÐ%ÆÐ%¿Ð%¸Ð%±Ð%ªÐ%£Ð%œÐ%•Ð%ŽÐ%‡Ð%€Ð%yÐ%rÐ%kÐ%dÐ%]Ð%VÐ%OÐ%HÐ%AÐ%:Ð%3Ð%,Ð%%Ð%Ð%Ð%Ð% Ð%Ð%ûÏ%ôÏ%íÏ%æÏ%ßÏ%ØÏ%ÑÏ%ÊÏ%ÃÏ%¼Ï%µÏ%®Ï%§Ï% Ï%™Ï%’Ï%‹Ï%„Ï%}Ï%vÏ%oÏ%hÏ%aÏ%ZÏ%SÏ%LÏ%EÏ%>Ï%7Ï%0Ï%)Ï%"Ï%Ï%Ï% Ï%Ï%ÿÎ%øÎ%ñÎ%êÎ%ãÎ%ÜÎ%ÕÎ%ÎÎ%ÇÎ%ÀÎ%¹Î%²Î%«Î%¤Î%Î%–Î%Î%ˆÎ%Î%zÎ%sÎ%lÎ%eÎ%^Î%WÎ%PÎ%IÎ%BÎ%;Î%4Î%-Î%&Î%Î%Î%Î% Î%Î%üÍ%õÍ%îÍ%çÍ%àÍ%ÙÍ%ÒÍ%ËÍ%ÄÍ%½Í%¶Í%¯Í%¨Í%¡Í%šÍ%“Í%ŒÍ%…Í%~Í%wÍ%pÍ%iÍ%bÍ%[Í%TÍ%MÍ%FÍ%?Í%8Í%1Í%*Í%#Í%Í%Í%Í%Í%Í%ùÌ%òÌ%ëÌ%äÌ%ÝÌ%ÖÌ%ÏÌ%ÈÌ%ÁÌ%ºÌ%³Ì%¬Ì%¥Ì%žÌ%—Ì%Ì%‰Ì%‚Ì%{Ì%tÌ%mÌ%fÌ%_Ì%XÌ%QÌ%JÌ%CÌ%<Ì%5Ì%.Ì%'Ì% Ì%Ì%Ì% Ì%Ì%ýË%öË%ïË%èË%áË%ÚË%ÓË%ÌË%ÅË%¾Ë%·Ë%°Ë%©Ë%¢Ë%›Ë%”Ë%Ë%†Ë%Ë%xË%qË%jË%cË%\Ë%UË%NË%GË%@Ë%9Ë%2Ë%+Ë%$Ë%Ë%Ë%Ë%Ë%Ë%úÊ%óÊ%ìÊ%åÊ%ÞÊ%×Ê%ÐÊ%ÉÊ%ÂÊ%»Ê%´Ê%­Ê%¦Ê%ŸÊ%˜Ê%‘Ê%ŠÊ%ƒÊ%|Ê%uÊ%nÊ%gÊ%`Ê%YÊ%RÊ%KÊ%DÊ%=Ê%6Ê%/Ê%(Ê%!Ê%Ê%Ê% Ê%Ê%þÉ%÷É%ðÉ%éÉ%âÉ%ÛÉ%ÔÉ%ÍÉ%ÆÉ%¿É%¸É%±É%ªÉ%£É%œÉ%•É%ŽÉ%‡É%€É%yÉ%rÉ%kÉ%dÉ%]É%VÉ%OÉ%HÉ%AÉ%:É%3É%,É%%É%É%É%É% É%É%ûÈ%ôÈ%íÈ%æÈ%ßÈ%ØÈ%ÑÈ%ÊÈ%ÃÈ%¼È%µÈ%®È%§È% È%™È%’È%‹È%„È%}È%vÈ%oÈ%hÈ%aÈ%ZÈ%SÈ%LÈ%EÈ%>È%7È%0È%)È%"È%È%È% È%È%ÿÇ%øÇ%ñÇ%êÇ%ãÇ%ÜÇ%ÕÇ%ÎÇ%ÇÇ%ÀÇ%¹Ç%²Ç%«Ç%¤Ç%Ç%–Ç%Ç%ˆÇ%Ç%zÇ%sÇ%lÇ%eÇ%^Ç%WÇ%PÇ%IÇ%BÇ%;Ç%4Ç%-Ç%&Ç%Ç%Ç%Ç% Ç%Ç%üÆ%õÆ%îÆ%çÆ%àÆ%ÙÆ%ÒÆ%ËÆ%ÄÆ%½Æ%¶Æ%¯Æ%¨Æ%¡Æ%šÆ%“Æ%ŒÆ%…Æ%~Æ%wÆ%pÆ%iÆ%bÆ%[Æ%TÆ%MÆ%FÆ%?Æ%8Æ%1Æ%*Æ%#Æ%Æ%Æ%Æ%Æ%Æ%ùÅ%òÅ%ëÅ%äÅ%ÝÅ%ÖÅ%ÏÅ%ÈÅ%ÁÅ%ºÅ%³Å%¬Å%¥Å%žÅ%—Å%Å%‰Å%‚Å%{Å%tÅ%mÅ%fÅ%_Å%XÅ%QÅ%JÅ%CÅ%<Å%5Å%.Å%'Å% Å%Å%Å% Å%Å%ýÄ%öÄ%ïÄ%èÄ%áÄ%ÚÄ%ÓÄ%ÌÄ%ÅÄ%¾Ä%·Ä%°Ä%©Ä%¢Ä%›Ä%”Ä%Ä%†Ä%Ä%xÄ%qÄ%jÄ%cÄ%\Ä%UÄ%NÄ%GÄ%@Ä%9Ä%2Ä%+Ä%$Ä%Ä%Ä%Ä%Ä%Ä%úÃ%óÃ%ìÃ%åÃ%ÞÃ%×Ã%ÐÃ%ÉÃ%ÂÃ%»Ã%´Ã%­Ã%¦Ã%ŸÃ%˜Ã%‘Ã%ŠÃ%ƒÃ%|Ã%uÃ%nÃ%gÃ%`Ã%YÃ%RÃ%KÃ%DÃ%=Ã%6Ã%/Ã%(Ã%!Ã%Ã%Ã% Ã%Ã%þÂ%÷Â%ðÂ%éÂ%âÂ%ÛÂ%ÔÂ%ÍÂ%ÆÂ%¿Â%¸Â%±Â%ªÂ%£Â%œÂ%•Â%ŽÂ%‡Â%€Â%yÂ%rÂ%kÂ%dÂ%]Â%VÂ%OÂ%HÂ%AÂ%:Â%3Â%,Â%%Â%Â%Â%Â% Â%Â%ûÁ%ôÁ%íÁ%æÁ%ßÁ%ØÁ%ÑÁ%ÊÁ%ÃÁ%¼Á%µÁ%®Á%§Á% Á%™Á%’Á%‹Á%„Á%}Á%vÁ%oÁ%hÁ%aÁ%ZÁ%SÁ%LÁ%EÁ%>Á%7Á%0Á%)Á%"Á%Á%Á% Á%Á%ÿÀ%øÀ%ñÀ%êÀ%ãÀ%ÜÀ%ÕÀ%ÎÀ%ÇÀ%ÀÀ%¹À%²À%«À%¤À%À%–À%À%ˆÀ%À%zÀ%sÀ%lÀ%eÀ%^À%WÀ%PÀ%IÀ%BÀ%;À%4À%-À%&À%À%À%À% À%À%ü¿%õ¿%î¿%ç¿%à¿%Ù¿%Ò¿%Ë¿%Ä¿%½¿%¶¿%¯¿%¨¿%¡¿%š¿%“¿%Œ¿%…¿%~¿%w¿%p¿%i¿%b¿%[¿%T¿%M¿%F¿%?¿%8¿%1¿%*¿%#¿%¿%¿%¿%¿%¿%ù¾%ò¾%ë¾%ä¾%ݾ%Ö¾%Ͼ%Ⱦ%Á¾%º¾%³¾%¬¾%¥¾%ž¾%—¾%¾%‰¾%‚¾%{¾%t¾%m¾%f¾%_¾%X¾%Q¾%J¾%C¾%<¾%5¾%.¾%'¾% ¾%¾%¾% ¾%¾%ý½%ö½%ï½%è½%á½%Ú½%Ó½%̽%Ž%¾½%·½%°½%©½%¢½%›½%”½%½%†½%½%x½%q½%j½%c½%\½%U½%N½%G½%@½%9½%2½%+½%$½%½%½%½%½%½%ú¼%ó¼%ì¼%å¼%Þ¼%×¼%м%ɼ%¼%»¼%´¼%­¼%¦¼%Ÿ¼%˜¼%‘¼%м%ƒ¼%|¼%u¼%n¼%g¼%`¼%Y¼%R¼%K¼%D¼%=¼%6¼%/¼%(¼%!¼%¼%¼% ¼%¼%þ»%÷»%ð»%é»%â»%Û»%Ô»%Í»%Æ»%¿»%¸»%±»%ª»%£»%œ»%•»%Ž»%‡»%€»%y»%r»%k»%d»%]»%V»%O»%H»%A»%:»%3»%,»%%»%»%»%»% »%»%ûº%ôº%íº%æº%ߺ%غ%Ѻ%ʺ%ú%¼º%µº%®º%§º% º%™º%’º%‹º%„º%}º%vº%oº%hº%aº%Zº%Sº%Lº%Eº%>º%7º%0º%)º%"º%º%º% º%º%ÿ¹%ø¹%ñ¹%ê¹%ã¹%ܹ%Õ¹%ι%ǹ%À¹%¹¹%²¹%«¹%¤¹%¹%–¹%¹%ˆ¹%¹%z¹%s¹%l¹%e¹%^¹%W¹%P¹%I¹%B¹%;¹%4¹%-¹%&¹%¹%¹%¹% ¹%¹%ü¸%õ¸%î¸%ç¸%à¸%Ù¸%Ò¸%˸%ĸ%½¸%¶¸%¯¸%¨¸%¡¸%š¸%“¸%Œ¸%…¸%~¸%w¸%p¸%i¸%b¸%[¸%T¸%M¸%F¸%?¸%8¸%1¸%*¸%#¸%¸%¸%¸%¸%¸%ù·%ò·%ë·%ä·%Ý·%Ö·%Ï·%È·%Á·%º·%³·%¬·%¥·%ž·%—·%·%‰·%‚·%{·%t·%m·%f·%_·%X·%Q·%J·%C·%<·%5·%.·%'·% ·%·%·% ·%·%ý¶%ö¶%ï¶%è¶%á¶%Ú¶%Ó¶%̶%Ŷ%¾¶%·¶%°¶%©¶%¢¶%›¶%”¶%¶%†¶%¶%x¶%q¶%j¶%c¶%\¶%U¶%N¶%G¶%@¶%9¶%2¶%+¶%$¶%¶%¶%¶%¶%¶%úµ%óµ%ìµ%åµ%Þµ%×µ%е%ɵ%µ%»µ%´µ%­µ%¦µ%Ÿµ%˜µ%‘µ%е%ƒµ%|µ%uµ%nµ%gµ%`µ%Yµ%Rµ%Kµ%Dµ%=µ%6µ%/µ%(µ%!µ%µ%µ% µ%µ%þ´%÷´%ð´%é´%â´%Û´%Ô´%Í´%Æ´%¿´%¸´%±´%ª´%£´%œ´%•´%Ž´%‡´%€´%y´%r´%k´%d´%]´%V´%O´%H´%A´%:´%3´%,´%%´%´%´%´% ´%´%û³%ô³%í³%æ³%ß³%س%ѳ%ʳ%ó%¼³%µ³%®³%§³% ³%™³%’³%‹³%„³%}³%v³%o³%h³%a³%Z³%S³%L³%E³%>³%7³%0³%)³%"³%³%³% ³%³%ÿ²%ø²%ñ²%ê²%ã²%ܲ%Õ²%β%Dz%À²%¹²%²²%«²%¤²%²%–²%²%ˆ²%²%z²%s²%l²%e²%^²%W²%P²%I²%B²%;²%4²%-²%&²%²%²%²% ²%²%ü±%õ±%î±%ç±%à±%Ù±%Ò±%˱%ı%½±%¶±%¯±%¨±%¡±%š±%“±%Œ±%…±%~±%w±%p±%i±%b±%[±%T±%M±%F±%?±%8±%1±%*±%#±%±%±%±%±%±%ù°%ò°%ë°%ä°%ݰ%Ö°%ϰ%Ȱ%Á°%º°%³°%¬°%¥°%ž°%—°%°%‰°%‚°%{°%t°%m°%f°%_°%X°%Q°%J°%C°%<°%5°%.°%'°% °%°%°% °%°%ý¯%ö¯%ï¯%è¯%á¯%Ú¯%Ó¯%̯%ů%¾¯%·¯%°¯%©¯%¢¯%›¯%”¯%¯%†¯%¯%x¯%q¯%j¯%c¯%\¯%U¯%N¯%G¯%@¯%9¯%2¯%+¯%$¯%¯%¯%¯%¯%¯%ú®%ó®%ì®%å®%Þ®%×®%Ю%É®%®%»®%´®%­®%¦®%Ÿ®%˜®%‘®%Š®%ƒ®%|®%u®%n®%g®%`®%Y®%R®%K®%D®%=®%6®%/®%(®%!®%®%®% ®%®%þ­%÷­%ð­%é­%â­%Û­%Ô­%Í­%Æ­%¿­%¸­%±­%ª­%£­%œ­%•­%Ž­%‡­%€­%y­%r­%k­%d­%]­%V­%O­%H­%A­%:­%3­%,­%%­%­%­%­% ­%­%û¬%ô¬%í¬%æ¬%߬%ج%Ѭ%ʬ%ì%¼¬%µ¬%®¬%§¬% ¬%™¬%’¬%‹¬%„¬%}¬%v¬%o¬%h¬%a¬%Z¬%S¬%L¬%E¬%>¬%7¬%0¬%)¬%"¬%¬%¬% ¬%¬%ÿ«%ø«%ñ«%ê«%ã«%Ü«%Õ«%Ϋ%Ç«%À«%¹«%²«%««%¤«%«%–«%«%ˆ«%«%z«%s«%l«%e«%^«%W«%P«%I«%B«%;«%4«%-«%&«%«%«%«% «%«%üª%õª%îª%çª%àª%Ùª%Òª%˪%Ī%½ª%¶ª%¯ª%¨ª%¡ª%šª%“ª%Œª%…ª%~ª%wª%pª%iª%bª%[ª%Tª%Mª%Fª%?ª%8ª%1ª%*ª%#ª%ª%ª%ª%ª%ª%ù©%ò©%ë©%ä©%Ý©%Ö©%Ï©%È©%Á©%º©%³©%¬©%¥©%ž©%—©%©%‰©%‚©%{©%t©%m©%f©%_©%X©%Q©%J©%C©%<©%5©%.©%'©% ©%©%©% ©%©%ý¨%ö¨%ï¨%è¨%á¨%Ú¨%Ó¨%̨%Ũ%¾¨%·¨%°¨%©¨%¢¨%›¨%”¨%¨%†¨%¨%x¨%q¨%j¨%c¨%\¨%U¨%N¨%G¨%@¨%9¨%2¨%+¨%$¨%¨%¨%¨%¨%¨%ú§%ó§%ì§%å§%Þ§%×§%Ч%ɧ%§%»§%´§%­§%¦§%Ÿ§%˜§%‘§%Ч%ƒ§%|§%u§%n§%g§%`§%Y§%R§%K§%D§%=§%6§%/§%(§%!§%§%§% §%§%þ¦%÷¦%ð¦%é¦%â¦%Û¦%Ô¦%ͦ%Ʀ%¿¦%¸¦%±¦%ª¦%£¦%œ¦%•¦%ަ%‡¦%€¦%y¦%r¦%k¦%d¦%]¦%V¦%O¦%H¦%A¦%:¦%3¦%,¦%%¦%¦%¦%¦% ¦%¦%û¥%ô¥%í¥%æ¥%ߥ%Ø¥%Ñ¥%Ê¥%Ã¥%¼¥%µ¥%®¥%§¥% ¥%™¥%’¥%‹¥%„¥%}¥%v¥%o¥%h¥%a¥%Z¥%S¥%L¥%E¥%>¥%7¥%0¥%)¥%"¥%¥%¥% ¥%¥%ÿ¤%ø¤%ñ¤%ê¤%ã¤%ܤ%Õ¤%Τ%Ǥ%À¤%¹¤%²¤%«¤%¤¤%¤%–¤%¤%ˆ¤%¤%z¤%s¤%l¤%e¤%^¤%W¤%P¤%I¤%B¤%;¤%4¤%-¤%&¤%¤%¤%¤% ¤%¤%ü£%õ£%î£%ç£%à£%Ù£%Ò£%Ë£%Ä£%½£%¶£%¯£%¨£%¡£%š£%“£%Œ£%…£%~£%w£%p£%i£%b£%[£%T£%M£%F£%?£%8£%1£%*£%#£%£%£%£%£%£%ù¢%ò¢%ë¢%ä¢%Ý¢%Ö¢%Ï¢%È¢%Á¢%º¢%³¢%¬¢%¥¢%ž¢%—¢%¢%‰¢%‚¢%{¢%t¢%m¢%f¢%_¢%X¢%Q¢%J¢%C¢%<¢%5¢%.¢%'¢% ¢%¢%¢% ¢%¢%ý¡%ö¡%ï¡%è¡%á¡%Ú¡%Ó¡%Ì¡%Å¡%¾¡%·¡%°¡%©¡%¢¡%›¡%”¡%¡%†¡%¡%x¡%q¡%j¡%c¡%\¡%U¡%N¡%G¡%@¡%9¡%2¡%+¡%$¡%¡%¡%¡%¡%¡%ú %ó %ì %å %Þ %× %Р%É % %» %´ %­ %¦ %Ÿ %˜ %‘ %Š %ƒ %| %u %n %g %` %Y %R %K %D %= %6 %/ %( %! % % %  % %þŸ%÷Ÿ%ðŸ%éŸ%âŸ%ÛŸ%ÔŸ%ÍŸ%ÆŸ%¿Ÿ%¸Ÿ%±Ÿ%ªŸ%£Ÿ%œŸ%•Ÿ%ŽŸ%‡Ÿ%€Ÿ%yŸ%rŸ%kŸ%dŸ%]Ÿ%VŸ%OŸ%HŸ%AŸ%:Ÿ%3Ÿ%,Ÿ%%Ÿ%Ÿ%Ÿ%Ÿ% Ÿ%Ÿ%ûž%ôž%íž%æž%ßž%Øž%Ñž%Êž%Þ%¼ž%µž%®ž%§ž% ž%™ž%’ž%‹ž%„ž%}ž%vž%ož%hž%až%Zž%Sž%Lž%Ež%>ž%7ž%0ž%)ž%"ž%ž%ž% ž%ž%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%üœ%õœ%îœ%çœ%àœ%Ùœ%Òœ%Ëœ%Äœ%½œ%¶œ%¯œ%¨œ%¡œ%šœ%“œ%Œœ%…œ%~œ%wœ%pœ%iœ%bœ%[œ%Tœ%Mœ%Fœ%?œ%8œ%1œ%*œ%#œ%œ%œ%œ%œ%œ%ù›%ò›%ë›%ä›%Ý›%Ö›%Ï›%È›%Á›%º›%³›%¬›%¥›%ž›%—›%›%‰›%‚›%{›%t›%m›%f›%_›%X›%Q›%J›%C›%<›%5›%.›%'›% ›%›%›% ›%›%ýš%öš%ïš%èš%áš%Úš%Óš%Ìš%Åš%¾š%·š%°š%©š%¢š%›š%”š%š%†š%š%xš%qš%jš%cš%\š%Uš%Nš%Gš%@š%9š%2š%+š%$š%š%š%š%š%š%ú™%ó™%ì™%å™%Þ™%×™%Й%É™%™%»™%´™%­™%¦™%Ÿ™%˜™%‘™%Š™%ƒ™%|™%u™%n™%g™%`™%Y™%R™%K™%D™%=™%6™%/™%(™%!™%™%™% ™%™%þ˜%÷˜%ð˜%é˜%â˜%Û˜%Ô˜%͘%Ƙ%¿˜%¸˜%±˜%ª˜%£˜%œ˜%•˜%Ž˜%‡˜%€˜%y˜%r˜%k˜%d˜%]˜%V˜%O˜%H˜%A˜%:˜%3˜%,˜%%˜%˜%˜%˜% ˜%˜%û—%ô—%í—%æ—%ß—%Ø—%Ñ—%Ê—%×%¼—%µ—%®—%§—% —%™—%’—%‹—%„—%}—%v—%o—%h—%a—%Z—%S—%L—%E—%>—%7—%0—%)—%"—%—%—% —%—%ÿ–%ø–%ñ–%ê–%ã–%Ü–%Õ–%Ζ%Ç–%À–%¹–%²–%«–%¤–%–%––%–%ˆ–%–%z–%s–%l–%e–%^–%W–%P–%I–%B–%;–%4–%-–%&–%–%–%–% –%–%ü•%õ•%î•%ç•%à•%Ù•%Ò•%Ë•%Ä•%½•%¶•%¯•%¨•%¡•%š•%“•%Œ•%…•%~•%w•%p•%i•%b•%[•%T•%M•%F•%?•%8•%1•%*•%#•%•%•%•%•%•%ù”%ò”%ë”%ä”%Ý”%Ö”%Ï”%È”%Á”%º”%³”%¬”%¥”%ž”%—”%”%‰”%‚”%{”%t”%m”%f”%_”%X”%Q”%J”%C”%<”%5”%.”%'”% ”%”%”% ”%”%ý“%ö“%ï“%è“%á“%Ú“%Ó“%Ì“%Å“%¾“%·“%°“%©“%¢“%›“%”“%“%†“%“%x“%q“%j“%c“%\“%U“%N“%G“%@“%9“%2“%+“%$“%“%“%“%“%“%ú’%ó’%ì’%å’%Þ’%×’%Ð’%É’%Â’%»’%´’%­’%¦’%Ÿ’%˜’%‘’%Š’%ƒ’%|’%u’%n’%g’%`’%Y’%R’%K’%D’%=’%6’%/’%(’%!’%’%’% ’%’%þ‘%÷‘%ð‘%é‘%â‘%Û‘%Ô‘%Í‘%Æ‘%¿‘%¸‘%±‘%ª‘%£‘%œ‘%•‘%Ž‘%‡‘%€‘%y‘%r‘%k‘%d‘%]‘%V‘%O‘%H‘%A‘%:‘%3‘%,‘%%‘%‘%‘%‘% ‘%‘%û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%üŽ%õŽ%îŽ%çŽ%àŽ%ÙŽ%ÒŽ%ËŽ%ÄŽ%½Ž%¶Ž%¯Ž%¨Ž%¡Ž%šŽ%“Ž%ŒŽ%…Ž%~Ž%wŽ%pŽ%iŽ%bŽ%[Ž%TŽ%MŽ%FŽ%?Ž%8Ž%1Ž%*Ž%#Ž%Ž%Ž%Ž%Ž%Ž%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ýŒ%öŒ%ïŒ%èŒ%áŒ%ÚŒ%ÓŒ%ÌŒ%ÅŒ%¾Œ%·Œ%°Œ%©Œ%¢Œ%›Œ%”Œ%Œ%†Œ%Œ%xŒ%qŒ%jŒ%cŒ%\Œ%UŒ%NŒ%GŒ%@Œ%9Œ%2Œ%+Œ%$Œ%Œ%Œ%Œ%Œ%Œ%ú‹%ó‹%ì‹%å‹%Þ‹%׋%Ћ%É‹%‹%»‹%´‹%­‹%¦‹%Ÿ‹%˜‹%‘‹%Š‹%ƒ‹%|‹%u‹%n‹%g‹%`‹%Y‹%R‹%K‹%D‹%=‹%6‹%/‹%(‹%!‹%‹%‹% ‹%‹%þŠ%÷Š%ðŠ%éŠ%âŠ%ÛŠ%ÔŠ%ÍŠ%ÆŠ%¿Š%¸Š%±Š%ªŠ%£Š%œŠ%•Š%ŽŠ%‡Š%€Š%yŠ%rŠ%kŠ%dŠ%]Š%VŠ%OŠ%HŠ%AŠ%:Š%3Š%,Š%%Š%Š%Š%Š% Š%Š%û‰%ô‰%í‰%æ‰%߉%؉%щ%ʉ%É%¼‰%µ‰%®‰%§‰% ‰%™‰%’‰%‹‰%„‰%}‰%v‰%o‰%h‰%a‰%Z‰%S‰%L‰%E‰%>‰%7‰%0‰%)‰%"‰%‰%‰% ‰%‰%ÿˆ%øˆ%ñˆ%êˆ%ãˆ%܈%Õˆ%Έ%Lj%Àˆ%¹ˆ%²ˆ%«ˆ%¤ˆ%ˆ%–ˆ%ˆ%ˆˆ%ˆ%zˆ%sˆ%lˆ%eˆ%^ˆ%Wˆ%Pˆ%Iˆ%Bˆ%;ˆ%4ˆ%-ˆ%&ˆ%ˆ%ˆ%ˆ% ˆ%ˆ%ü‡%õ‡%î‡%ç‡%à‡%Ù‡%Ò‡%ˇ%ć%½‡%¶‡%¯‡%¨‡%¡‡%š‡%“‡%Œ‡%…‡%~‡%w‡%p‡%i‡%b‡%[‡%T‡%M‡%F‡%?‡%8‡%1‡%*‡%#‡%‡%‡%‡%‡%‡%ù†%ò†%ë†%ä†%݆%Ö†%φ%Ȇ%Á†%º†%³†%¬†%¥†%ž†%—†%†%‰†%‚†%{†%t†%m†%f†%_†%X†%Q†%J†%C†%<†%5†%.†%'†% †%†%†% †%†%ý…%ö…%ï…%è…%á…%Ú…%Ó…%Ì…%Å…%¾…%·…%°…%©…%¢…%›…%”…%…%†…%…%x…%q…%j…%c…%\…%U…%N…%G…%@…%9…%2…%+…%$…%…%…%…%…%…%ú„%ó„%ì„%å„%Þ„%ׄ%Є%É„%„%»„%´„%­„%¦„%Ÿ„%˜„%‘„%Š„%ƒ„%|„%u„%n„%g„%`„%Y„%R„%K„%D„%=„%6„%/„%(„%!„%„%„% „%„%þƒ%÷ƒ%ðƒ%éƒ%âƒ%Ûƒ%Ôƒ%̓%ƃ%¿ƒ%¸ƒ%±ƒ%ªƒ%£ƒ%œƒ%•ƒ%Žƒ%‡ƒ%€ƒ%yƒ%rƒ%kƒ%dƒ%]ƒ%Vƒ%Oƒ%Hƒ%Aƒ%:ƒ%3ƒ%,ƒ%%ƒ%ƒ%ƒ%ƒ% ƒ%ƒ%û‚%ô‚%í‚%æ‚%ß‚%Ø‚%Ñ‚%Ê‚%Â%¼‚%µ‚%®‚%§‚% ‚%™‚%’‚%‹‚%„‚%}‚%v‚%o‚%h‚%a‚%Z‚%S‚%L‚%E‚%>‚%7‚%0‚%)‚%"‚%‚%‚% ‚%‚%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü€%õ€%î€%ç€%à€%Ù€%Ò€%Ë€%Ä€%½€%¶€%¯€%¨€%¡€%š€%“€%Œ€%…€%~€%w€%p€%i€%b€%[€%T€%M€%F€%?€%8€%1€%*€%#€%€%€%€%€%€%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý~%ö~%ï~%è~%á~%Ú~%Ó~%Ì~%Å~%¾~%·~%°~%©~%¢~%›~%”~%~%†~%~%x~%q~%j~%c~%\~%U~%N~%G~%@~%9~%2~%+~%$~%~%~%~%~%~%ú}%ó}%ì}%å}%Þ}%×}%Ð}%É}%Â}%»}%´}%­}%¦}%Ÿ}%˜}%‘}%Š}%ƒ}%|}%u}%n}%g}%`}%Y}%R}%K}%D}%=}%6}%/}%(}%!}%}%}% }%}%þ|%÷|%ð|%é|%â|%Û|%Ô|%Í|%Æ|%¿|%¸|%±|%ª|%£|%œ|%•|%Ž|%‡|%€|%y|%r|%k|%d|%]|%V|%O|%H|%A|%:|%3|%,|%%|%|%|%|% |%|%û{%ô{%í{%æ{%ß{%Ø{%Ñ{%Ê{%Ã{%¼{%µ{%®{%§{% {%™{%’{%‹{%„{%}{%v{%o{%h{%a{%Z{%S{%L{%E{%>{%7{%0{%){%"{%{%{% {%{%ÿz%øz%ñz%êz%ãz%Üz%Õz%Îz%Çz%Àz%¹z%²z%«z%¤z%z%–z%z%ˆz%z%zz%sz%lz%ez%^z%Wz%Pz%Iz%Bz%;z%4z%-z%&z%z%z%z% z%z%üy%õy%îy%çy%ày%Ùy%Òy%Ëy%Äy%½y%¶y%¯y%¨y%¡y%šy%“y%Œy%…y%~y%wy%py%iy%by%[y%Ty%My%Fy%?y%8y%1y%*y%#y%y%y%y%y%y%ùx%òx%ëx%äx%Ýx%Öx%Ïx%Èx%Áx%ºx%³x%¬x%¥x%žx%—x%x%‰x%‚x%{x%tx%mx%fx%_x%Xx%Qx%Jx%Cx%t%7t%0t%)t%"t%t%t% t%t%ÿs%øs%ñs%ês%ãs%Üs%Õs%Îs%Çs%Às%¹s%²s%«s%¤s%s%–s%s%ˆs%s%zs%ss%ls%es%^s%Ws%Ps%Is%Bs%;s%4s%-s%&s%s%s%s% s%s%ür%õr%îr%çr%àr%Ùr%Òr%Ër%Är%½r%¶r%¯r%¨r%¡r%šr%“r%Œr%…r%~r%wr%pr%ir%br%[r%Tr%Mr%Fr%?r%8r%1r%*r%#r%r%r%r%r%r%ùq%òq%ëq%äq%Ýq%Öq%Ïq%Èq%Áq%ºq%³q%¬q%¥q%žq%—q%q%‰q%‚q%{q%tq%mq%fq%_q%Xq%Qq%Jq%Cq%m%7m%0m%)m%"m%m%m% m%m%ÿl%øl%ñl%êl%ãl%Ül%Õl%Îl%Çl%Àl%¹l%²l%«l%¤l%l%–l%l%ˆl%l%zl%sl%ll%el%^l%Wl%Pl%Il%Bl%;l%4l%-l%&l%l%l%l% l%l%ük%õk%îk%çk%àk%Ùk%Òk%Ëk%Äk%½k%¶k%¯k%¨k%¡k%šk%“k%Œk%…k%~k%wk%pk%ik%bk%[k%Tk%Mk%Fk%?k%8k%1k%*k%#k%k%k%k%k%k%ùj%òj%ëj%äj%Ýj%Öj%Ïj%Èj%Áj%ºj%³j%¬j%¥j%žj%—j%j%‰j%‚j%{j%tj%mj%fj%_j%Xj%Qj%Jj%Cj%f%7f%0f%)f%"f%f%f% f%f%ÿe%øe%ñe%êe%ãe%Üe%Õe%Îe%Çe%Àe%¹e%²e%«e%¤e%e%–e%e%ˆe%e%ze%se%le%ee%^e%We%Pe%Ie%Be%;e%4e%-e%&e%e%e%e% e%e%üd%õd%îd%çd%àd%Ùd%Òd%Ëd%Äd%½d%¶d%¯d%¨d%¡d%šd%“d%Œd%…d%~d%wd%pd%id%bd%[d%Td%Md%Fd%?d%8d%1d%*d%#d%d%d%d%d%d%ùc%òc%ëc%äc%Ýc%Öc%Ïc%Èc%Ác%ºc%³c%¬c%¥c%žc%—c%c%‰c%‚c%{c%tc%mc%fc%_c%Xc%Qc%Jc%Cc%_%7_%0_%)_%"_%_%_% _%_%ÿ^%ø^%ñ^%ê^%ã^%Ü^%Õ^%Î^%Ç^%À^%¹^%²^%«^%¤^%^%–^%^%ˆ^%^%z^%s^%l^%e^%^^%W^%P^%I^%B^%;^%4^%-^%&^%^%^%^% ^%^%ü]%õ]%î]%ç]%à]%Ù]%Ò]%Ë]%Ä]%½]%¶]%¯]%¨]%¡]%š]%“]%Œ]%…]%~]%w]%p]%i]%b]%[]%T]%M]%F]%?]%8]%1]%*]%#]%]%]%]%]%]%ù\%ò\%ë\%ä\%Ý\%Ö\%Ï\%È\%Á\%º\%³\%¬\%¥\%ž\%—\%\%‰\%‚\%{\%t\%m\%f\%_\%X\%Q\%J\%C\%<\%5\%.\%'\% \%\%\% \%\%ý[%ö[%ï[%è[%á[%Ú[%Ó[%Ì[%Å[%¾[%·[%°[%©[%¢[%›[%”[%[%†[%[%x[%q[%j[%c[%\[%U[%N[%G[%@[%9[%2[%+[%$[%[%[%[%[%[%úZ%óZ%ìZ%åZ%ÞZ%×Z%ÐZ%ÉZ%ÂZ%»Z%´Z%­Z%¦Z%ŸZ%˜Z%‘Z%ŠZ%ƒZ%|Z%uZ%nZ%gZ%`Z%YZ%RZ%KZ%DZ%=Z%6Z%/Z%(Z%!Z%Z%Z% Z%Z%þY%÷Y%ðY%éY%âY%ÛY%ÔY%ÍY%ÆY%¿Y%¸Y%±Y%ªY%£Y%œY%•Y%ŽY%‡Y%€Y%yY%rY%kY%dY%]Y%VY%OY%HY%AY%:Y%3Y%,Y%%Y%Y%Y%Y% Y%Y%ûX%ôX%íX%æX%ßX%ØX%ÑX%ÊX%ÃX%¼X%µX%®X%§X% X%™X%’X%‹X%„X%}X%vX%oX%hX%aX%ZX%SX%LX%EX%>X%7X%0X%)X%"X%X%X% X%X%ÿW%øW%ñW%êW%ãW%ÜW%ÕW%ÎW%ÇW%ÀW%¹W%²W%«W%¤W%W%–W%W%ˆW%W%zW%sW%lW%eW%^W%WW%PW%IW%BW%;W%4W%-W%&W%W%W%W% W%W%üV%õV%îV%çV%àV%ÙV%ÒV%ËV%ÄV%½V%¶V%¯V%¨V%¡V%šV%“V%ŒV%…V%~V%wV%pV%iV%bV%[V%TV%MV%FV%?V%8V%1V%*V%#V%V%V%V%V%V%ùU%òU%ëU%äU%ÝU%ÖU%ÏU%ÈU%ÁU%ºU%³U%¬U%¥U%žU%—U%U%‰U%‚U%{U%tU%mU%fU%_U%XU%QU%JU%CU%Q%7Q%0Q%)Q%"Q%Q%Q% Q%Q%ÿP%øP%ñP%êP%ãP%ÜP%ÕP%ÎP%ÇP%ÀP%¹P%²P%«P%¤P%P%–P%P%ˆP%P%zP%sP%lP%eP%^P%WP%PP%IP%BP%;P%4P%-P%&P%P%P%P% P%P%üO%õO%îO%çO%àO%ÙO%ÒO%ËO%ÄO%½O%¶O%¯O%¨O%¡O%šO%“O%ŒO%…O%~O%wO%pO%iO%bO%[O%TO%MO%FO%?O%8O%1O%*O%#O%O%O%O%O%O%ùN%òN%ëN%äN%ÝN%ÖN%ÏN%ÈN%ÁN%ºN%³N%¬N%¥N%žN%—N%N%‰N%‚N%{N%tN%mN%fN%_N%XN%QN%JN%CN%J%7J%0J%)J%"J%J%J% J%J%ÿI%øI%ñI%êI%ãI%ÜI%ÕI%ÎI%ÇI%ÀI%¹I%²I%«I%¤I%I%–I%I%ˆI%I%zI%sI%lI%eI%^I%WI%PI%II%BI%;I%4I%-I%&I%I%I%I% I%I%üH%õH%îH%çH%àH%ÙH%ÒH%ËH%ÄH%½H%¶H%¯H%¨H%¡H%šH%“H%ŒH%…H%~H%wH%pH%iH%bH%[H%TH%MH%FH%?H%8H%1H%*H%#H%H%H%H%H%H%ùG%òG%ëG%äG%ÝG%ÖG%ÏG%ÈG%ÁG%ºG%³G%¬G%¥G%žG%—G%G%‰G%‚G%{G%tG%mG%fG%_G%XG%QG%JG%CG%C%7C%0C%)C%"C%C%C% C%C%ÿB%øB%ñB%êB%ãB%ÜB%ÕB%ÎB%ÇB%ÀB%¹B%²B%«B%¤B%B%–B%B%ˆB%B%zB%sB%lB%eB%^B%WB%PB%IB%BB%;B%4B%-B%&B%B%B%B% B%B%üA%õA%îA%çA%àA%ÙA%ÒA%ËA%ÄA%½A%¶A%¯A%¨A%¡A%šA%“A%ŒA%…A%~A%wA%pA%iA%bA%[A%TA%MA%FA%?A%8A%1A%*A%#A%A%A%A%A%A%ù@%ò@%ë@%ä@%Ý@%Ö@%Ï@%È@%Á@%º@%³@%¬@%¥@%ž@%—@%@%‰@%‚@%{@%t@%m@%f@%_@%X@%Q@%J@%C@%<@%5@%.@%'@% @%@%@% @%@%ý?%ö?%ï?%è?%á?%Ú?%Ó?%Ì?%Å?%¾?%·?%°?%©?%¢?%›?%”?%?%†?%?%x?%q?%j?%c?%\?%U?%N?%G?%@?%9?%2?%+?%$?%?%?%?%?%?%ú>%ó>%ì>%å>%Þ>%×>%Ð>%É>%Â>%»>%´>%­>%¦>%Ÿ>%˜>%‘>%Š>%ƒ>%|>%u>%n>%g>%`>%Y>%R>%K>%D>%=>%6>%/>%(>%!>%>%>% >%>%þ=%÷=%ð=%é=%â=%Û=%Ô=%Í=%Æ=%¿=%¸=%±=%ª=%£=%œ=%•=%Ž=%‡=%€=%y=%r=%k=%d=%]=%V=%O=%H=%A=%:=%3=%,=%%=%=%=%=% =%=%û<%ô<%í<%æ<%ß<%Ø<%Ñ<%Ê<%Ã<%¼<%µ<%®<%§<% <%™<%’<%‹<%„<%}<%v<%o<%h<%a<%Z<%S<%L<%E<%><%7<%0<%)<%"<%<%<% <%<%ÿ;%ø;%ñ;%ê;%ã;%Ü;%Õ;%Î;%Ç;%À;%¹;%²;%«;%¤;%;%–;%;%ˆ;%;%z;%s;%l;%e;%^;%W;%P;%I;%B;%;;%4;%-;%&;%;%;%;% ;%;%ü:%õ:%î:%ç:%à:%Ù:%Ò:%Ë:%Ä:%½:%¶:%¯:%¨:%¡:%š:%“:%Œ:%…:%~:%w:%p:%i:%b:%[:%T:%M:%F:%?:%8:%1:%*:%#:%:%:%:%:%:%ù9%ò9%ë9%ä9%Ý9%Ö9%Ï9%È9%Á9%º9%³9%¬9%¥9%ž9%—9%9%‰9%‚9%{9%t9%m9%f9%_9%X9%Q9%J9%C9%<9%59%.9%'9% 9%9%9% 9%9%ý8%ö8%ï8%è8%á8%Ú8%Ó8%Ì8%Å8%¾8%·8%°8%©8%¢8%›8%”8%8%†8%8%x8%q8%j8%c8%\8%U8%N8%G8%@8%98%28%+8%$8%8%8%8%8%8%ú7%ó7%ì7%å7%Þ7%×7%Ð7%É7%Â7%»7%´7%­7%¦7%Ÿ7%˜7%‘7%Š7%ƒ7%|7%u7%n7%g7%`7%Y7%R7%K7%D7%=7%67%/7%(7%!7%7%7% 7%7%þ6%÷6%ð6%é6%â6%Û6%Ô6%Í6%Æ6%¿6%¸6%±6%ª6%£6%œ6%•6%Ž6%‡6%€6%y6%r6%k6%d6%]6%V6%O6%H6%A6%:6%36%,6%%6%6%6%6% 6%6%û5%ô5%í5%æ5%ß5%Ø5%Ñ5%Ê5%Ã5%¼5%µ5%®5%§5% 5%™5%’5%‹5%„5%}5%v5%o5%h5%a5%Z5%S5%L5%E5%>5%75%05%)5%"5%5%5% 5%5%ÿ4%ø4%ñ4%ê4%ã4%Ü4%Õ4%Î4%Ç4%À4%¹4%²4%«4%¤4%4%–4%4%ˆ4%4%z4%s4%l4%e4%^4%W4%P4%I4%B4%;4%44%-4%&4%4%4%4% 4%4%ü3%õ3%î3%ç3%à3%Ù3%Ò3%Ë3%Ä3%½3%¶3%¯3%¨3%¡3%š3%“3%Œ3%…3%~3%w3%p3%i3%b3%[3%T3%M3%F3%?3%83%13%*3%#3%3%3%3%3%3%ù2%ò2%ë2%ä2%Ý2%Ö2%Ï2%È2%Á2%º2%³2%¬2%¥2%ž2%—2%2%‰2%‚2%{2%t2%m2%f2%_2%X2%Q2%J2%C2%<2%52%.2%'2% 2%2%2% 2%2%ý1%ö1%ï1%è1%á1%Ú1%Ó1%Ì1%Å1%¾1%·1%°1%©1%¢1%›1%”1%1%†1%1%x1%q1%j1%c1%\1%U1%N1%G1%@1%91%21%+1%$1%1%1%1%1%1%ú0%ó0%ì0%å0%Þ0%×0%Ð0%É0%Â0%»0%´0%­0%¦0%Ÿ0%˜0%‘0%Š0%ƒ0%|0%u0%n0%g0%`0%Y0%R0%K0%D0%=0%60%/0%(0%!0%0%0% 0%0%þ/%÷/%ð/%é/%â/%Û/%Ô/%Í/%Æ/%¿/%¸/%±/%ª/%£/%œ/%•/%Ž/%‡/%€/%y/%r/%k/%d/%]/%V/%O/%H/%A/%:/%3/%,/%%/%/%/%/% /%/%û.%ô.%í.%æ.%ß.%Ø.%Ñ.%Ê.%Ã.%¼.%µ.%®.%§.% .%™.%’.%‹.%„.%}.%v.%o.%h.%a.%Z.%S.%L.%E.%>.%7.%0.%).%".%.%.% .%.%ÿ-%ø-%ñ-%ê-%ã-%Ü-%Õ-%Î-%Ç-%À-%¹-%²-%«-%¤-%-%–-%-%ˆ-%-%z-%s-%l-%e-%^-%W-%P-%I-%B-%;-%4-%--%&-%-%-%-% -%-%ü,%õ,%î,%ç,%à,%Ù,%Ò,%Ë,%Ä,%½,%¶,%¯,%¨,%¡,%š,%“,%Œ,%…,%~,%w,%p,%i,%b,%[,%T,%M,%F,%?,%8,%1,%*,%#,%,%,%,%,%,%ù+%ò+%ë+%ä+%Ý+%Ö+%Ï+%È+%Á+%º+%³+%¬+%¥+%ž+%—+%+%‰+%‚+%{+%t+%m+%f+%_+%X+%Q+%J+%C+%<+%5+%.+%'+% +%+%+% +%+%ý*%ö*%ï*%è*%á*%Ú*%Ó*%Ì*%Å*%¾*%·*%°*%©*%¢*%›*%”*%*%†*%*%x*%q*%j*%c*%\*%U*%N*%G*%@*%9*%2*%+*%$*%*%*%*%*%*%ú)%ó)%ì)%å)%Þ)%×)%Ð)%É)%Â)%»)%´)%­)%¦)%Ÿ)%˜)%‘)%Š)%ƒ)%|)%u)%n)%g)%`)%Y)%R)%K)%D)%=)%6)%/)%()%!)%)%)% )%)%þ(%÷(%ð(%é(%â(%Û(%Ô(%Í(%Æ(%¿(%¸(%±(%ª(%£(%œ(%•(%Ž(%‡(%€(%y(%r(%k(%d(%](%V(%O(%H(%A(%:(%3(%,(%%(%(%(%(% (%(%û'%ô'%í'%æ'%ß'%Ø'%Ñ'%Ê'%Ã'%¼'%µ'%®'%§'% '%™'%’'%‹'%„'%}'%v'%o'%h'%a'%Z'%S'%L'%E'%>'%7'%0'%)'%"'%'%'% '%'%ÿ&%ø&%ñ&%ê&%ã&%Ü&%Õ&%Î&%Ç&%À&%¹&%²&%«&%¤&%&%–&%&%ˆ&%&%z&%s&%l&%e&%^&%W&%P&%I&%B&%;&%4&%-&%&&%&%&%&% &%&%ü%%õ%%î%%ç%%à%%Ù%%Ò%%Ë%%Ä%%½%%¶%%¯%%¨%%¡%%š%%“%%Œ%%…%%~%%w%%p%%i%%b%%[%%T%%M%%F%%?%%8%%1%%*%%#%%%%%%%%%%%%ù$%ò$%ë$%ä$%Ý$%Ö$%Ï$%È$%Á$%º$%³$%¬$%¥$%ž$%—$%$%‰$%‚$%{$%t$%m$%f$%_$%X$%Q$%J$%C$%<$%5$%.$%'$% $%$%$% $%$%ý#%ö#%ï#%è#%á#%Ú#%Ó#%Ì#%Å#%¾#%·#%°#%©#%¢#%›#%”#%#%†#%#%x#%q#%j#%c#%\#%U#%N#%G#%@#%9#%2#%+#%$#%#%#%#%#%#%ú"%ó"%ì"%å"%Þ"%×"%Ð"%É"%Â"%»"%´"%­"%¦"%Ÿ"%˜"%‘"%Š"%ƒ"%|"%u"%n"%g"%`"%Y"%R"%K"%D"%="%6"%/"%("%!"%"%"% "%"%þ!%÷!%ð!%é!%â!%Û!%Ô!%Í!%Æ!%¿!%¸!%±!%ª!%£!%œ!%•!%Ž!%‡!%€!%y!%r!%k!%d!%]!%V!%O!%H!%A!%:!%3!%,!%%!%!%!%!% !%!%û %ô %í %æ %ß %Ø %Ñ %Ê %à %¼ %µ %® %§ %  %™ %’ %‹ %„ %} %v %o %h %a %Z %S %L %E %> %7 %0 %) %" % % % % %ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú %ó %ì %å %Þ %× %Ð %É % %» %´ %­ %¦ %Ÿ %˜ %‘ %Š %ƒ %| %u %n %g %` %Y %R %K %D %= %6 %/ %( %! % % % % %þ %÷ %ð %é %â %Û %Ô %Í %Æ %¿ %¸ %± %ª %£ %œ %• %Ž %‡ %€ %y %r %k %d %] %V %O %H %A %: %3 %, %% % % % % % %û %ô %í %æ %ß %Ø %Ñ %Ê %à %¼ %µ %® %§ %  %™ %’ %‹ %„ %} %v %o %h %a %Z %S %L %E %> %7 %0 %) %" % % % % %ÿ %ø %ñ %ê %ã %Ü %Õ %Î %Ç %À %¹ %² %« %¤ % %– % %ˆ % %z %s %l %e %^ %W %P %I %B %; %4 %- %& % % % % % %ü %õ %î %ç %à %Ù %Ò %Ë %Ä %½ %¶ %¯ %¨ %¡ %š %“ %Œ %… %~ %w %p %i %b %[ %T %M %F %? %8 %1 %* %# % % % % % %ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%úÿ$óÿ$ìÿ$åÿ$Þÿ$×ÿ$Ðÿ$Éÿ$Âÿ$»ÿ$´ÿ$­ÿ$¦ÿ$Ÿÿ$˜ÿ$‘ÿ$Šÿ$ƒÿ$|ÿ$uÿ$nÿ$gÿ$`ÿ$Yÿ$Rÿ$Kÿ$Dÿ$=ÿ$6ÿ$/ÿ$(ÿ$!ÿ$ÿ$ÿ$ ÿ$ÿ$þþ$÷þ$ðþ$éþ$âþ$Ûþ$Ôþ$Íþ$Æþ$¿þ$¸þ$±þ$ªþ$£þ$œþ$•þ$Žþ$‡þ$€þ$yþ$rþ$kþ$dþ$]þ$Vþ$Oþ$Hþ$Aþ$:þ$3þ$,þ$%þ$þ$þ$þ$ þ$þ$ûý$ôý$íý$æý$ßý$Øý$Ñý$Êý$Ãý$¼ý$µý$®ý$§ý$ ý$™ý$’ý$‹ý$„ý$}ý$vý$oý$hý$aý$Zý$Sý$Lý$Eý$>ý$7ý$0ý$)ý$"ý$ý$ý$ ý$ý$ÿü$øü$ñü$êü$ãü$Üü$Õü$Îü$Çü$Àü$¹ü$²ü$«ü$¤ü$ü$–ü$ü$ˆü$ü$zü$sü$lü$eü$^ü$Wü$Pü$Iü$Bü$;ü$4ü$-ü$&ü$ü$ü$ü$ ü$ü$üû$õû$îû$çû$àû$Ùû$Òû$Ëû$Äû$½û$¶û$¯û$¨û$¡û$šû$“û$Œû$…û$~û$wû$pû$iû$bû$[û$Tû$Mû$Fû$?û$8û$1û$*û$#û$û$û$û$û$û$ùú$òú$ëú$äú$Ýú$Öú$Ïú$Èú$Áú$ºú$³ú$¬ú$¥ú$žú$—ú$ú$‰ú$‚ú${ú$tú$mú$fú$_ú$Xú$Qú$Jú$Cú$<ú$5ú$.ú$'ú$ ú$ú$ú$ ú$ú$ýù$öù$ïù$èù$áù$Úù$Óù$Ìù$Åù$¾ù$·ù$°ù$©ù$¢ù$›ù$”ù$ù$†ù$ù$xù$qù$jù$cù$\ù$Uù$Nù$Gù$@ù$9ù$2ù$+ù$$ù$ù$ù$ù$ù$ù$úø$óø$ìø$åø$Þø$×ø$Ðø$Éø$Âø$»ø$´ø$­ø$¦ø$Ÿø$˜ø$‘ø$Šø$ƒø$|ø$uø$nø$gø$`ø$Yø$Rø$Kø$Dø$=ø$6ø$/ø$(ø$!ø$ø$ø$ ø$ø$þ÷$÷÷$ð÷$é÷$â÷$Û÷$Ô÷$Í÷$Æ÷$¿÷$¸÷$±÷$ª÷$£÷$œ÷$•÷$Ž÷$‡÷$€÷$y÷$r÷$k÷$d÷$]÷$V÷$O÷$H÷$A÷$:÷$3÷$,÷$%÷$÷$÷$÷$ ÷$÷$ûö$ôö$íö$æö$ßö$Øö$Ñö$Êö$Ãö$¼ö$µö$®ö$§ö$ ö$™ö$’ö$‹ö$„ö$}ö$vö$oö$hö$aö$Zö$Sö$Lö$Eö$>ö$7ö$0ö$)ö$"ö$ö$ö$ ö$ö$ÿõ$øõ$ñõ$êõ$ãõ$Üõ$Õõ$Îõ$Çõ$Àõ$¹õ$²õ$«õ$¤õ$õ$–õ$õ$ˆõ$õ$zõ$sõ$lõ$eõ$^õ$Wõ$Põ$Iõ$Bõ$;õ$4õ$-õ$&õ$õ$õ$õ$ õ$õ$üô$õô$îô$çô$àô$Ùô$Òô$Ëô$Äô$½ô$¶ô$¯ô$¨ô$¡ô$šô$“ô$Œô$…ô$~ô$wô$pô$iô$bô$[ô$Tô$Mô$Fô$?ô$8ô$1ô$*ô$#ô$ô$ô$ô$ô$ô$ùó$òó$ëó$äó$Ýó$Öó$Ïó$Èó$Áó$ºó$³ó$¬ó$¥ó$žó$—ó$ó$‰ó$‚ó${ó$tó$mó$fó$_ó$Xó$Qó$Jó$Có$<ó$5ó$.ó$'ó$ ó$ó$ó$ ó$ó$ýò$öò$ïò$èò$áò$Úò$Óò$Ìò$Åò$¾ò$·ò$°ò$©ò$¢ò$›ò$”ò$ò$†ò$ò$xò$qò$jò$cò$\ò$Uò$Nò$Gò$@ò$9ò$2ò$+ò$$ò$ò$ò$ò$ò$ò$úñ$óñ$ìñ$åñ$Þñ$×ñ$Ðñ$Éñ$Âñ$»ñ$´ñ$­ñ$¦ñ$Ÿñ$˜ñ$‘ñ$Šñ$ƒñ$|ñ$uñ$nñ$gñ$`ñ$Yñ$Rñ$Kñ$Dñ$=ñ$6ñ$/ñ$(ñ$!ñ$ñ$ñ$ ñ$ñ$þð$÷ð$ðð$éð$âð$Ûð$Ôð$Íð$Æð$¿ð$¸ð$±ð$ªð$£ð$œð$•ð$Žð$‡ð$€ð$yð$rð$kð$dð$]ð$Vð$Oð$Hð$Að$:ð$3ð$,ð$%ð$ð$ð$ð$ ð$ð$ûï$ôï$íï$æï$ßï$Øï$Ñï$Êï$Ãï$¼ï$µï$®ï$§ï$ ï$™ï$’ï$‹ï$„ï$}ï$vï$oï$hï$aï$Zï$Sï$Lï$Eï$>ï$7ï$0ï$)ï$"ï$ï$ï$ ï$ï$ÿî$øî$ñî$êî$ãî$Üî$Õî$Îî$Çî$Àî$¹î$²î$«î$¤î$î$–î$î$ˆî$î$zî$sî$lî$eî$^î$Wî$Pî$Iî$Bî$;î$4î$-î$&î$î$î$î$ î$î$üí$õí$îí$çí$àí$Ùí$Òí$Ëí$Äí$½í$¶í$¯í$¨í$¡í$ší$“í$Œí$…í$~í$wí$pí$ií$bí$[í$Tí$Mí$Fí$?í$8í$1í$*í$#í$í$í$í$í$í$ùì$òì$ëì$äì$Ýì$Öì$Ïì$Èì$Áì$ºì$³ì$¬ì$¥ì$žì$—ì$ì$‰ì$‚ì${ì$tì$mì$fì$_ì$Xì$Qì$Jì$Cì$<ì$5ì$.ì$'ì$ ì$ì$ì$ ì$ì$ýë$öë$ïë$èë$áë$Úë$Óë$Ìë$Åë$¾ë$·ë$°ë$©ë$¢ë$›ë$”ë$ë$†ë$ë$xë$që$jë$cë$\ë$Uë$Në$Gë$@ë$9ë$2ë$+ë$$ë$ë$ë$ë$ë$ë$úê$óê$ìê$åê$Þê$×ê$Ðê$Éê$Âê$»ê$´ê$­ê$¦ê$Ÿê$˜ê$‘ê$Šê$ƒê$|ê$uê$nê$gê$`ê$Yê$Rê$Kê$Dê$=ê$6ê$/ê$(ê$!ê$ê$ê$ ê$ê$þé$÷é$ðé$éé$âé$Ûé$Ôé$Íé$Æé$¿é$¸é$±é$ªé$£é$œé$•é$Žé$‡é$€é$yé$ré$ké$dé$]é$Vé$Oé$Hé$Aé$:é$3é$,é$%é$é$é$é$ é$é$ûè$ôè$íè$æè$ßè$Øè$Ñè$Êè$Ãè$¼è$µè$®è$§è$ è$™è$’è$‹è$„è$}è$vè$oè$hè$aè$Zè$Sè$Lè$Eè$>è$7è$0è$)è$"è$è$è$ è$è$ÿç$øç$ñç$êç$ãç$Üç$Õç$Îç$Çç$Àç$¹ç$²ç$«ç$¤ç$ç$–ç$ç$ˆç$ç$zç$sç$lç$eç$^ç$Wç$Pç$Iç$Bç$;ç$4ç$-ç$&ç$ç$ç$ç$ ç$ç$üæ$õæ$îæ$çæ$àæ$Ùæ$Òæ$Ëæ$Äæ$½æ$¶æ$¯æ$¨æ$¡æ$šæ$“æ$Œæ$…æ$~æ$wæ$pæ$iæ$bæ$[æ$Tæ$Mæ$Fæ$?æ$8æ$1æ$*æ$#æ$æ$æ$æ$æ$æ$ùå$òå$ëå$äå$Ýå$Öå$Ïå$Èå$Áå$ºå$³å$¬å$¥å$žå$—å$å$‰å$‚å${å$tå$må$få$_å$Xå$Qå$Jå$Cå$<å$5å$.å$'å$ å$å$å$ å$å$ýä$öä$ïä$èä$áä$Úä$Óä$Ìä$Åä$¾ä$·ä$°ä$©ä$¢ä$›ä$”ä$ä$†ä$ä$xä$qä$jä$cä$\ä$Uä$Nä$Gä$@ä$9ä$2ä$+ä$$ä$ä$ä$ä$ä$ä$úã$óã$ìã$åã$Þã$×ã$Ðã$Éã$Âã$»ã$´ã$­ã$¦ã$Ÿã$˜ã$‘ã$Šã$ƒã$|ã$uã$nã$gã$`ã$Yã$Rã$Kã$Dã$=ã$6ã$/ã$(ã$!ã$ã$ã$ ã$ã$þâ$÷â$ðâ$éâ$ââ$Ûâ$Ôâ$Íâ$Æâ$¿â$¸â$±â$ªâ$£â$œâ$•â$Žâ$‡â$€â$yâ$râ$kâ$dâ$]â$Vâ$Oâ$Hâ$Aâ$:â$3â$,â$%â$â$â$â$ â$â$ûá$ôá$íá$æá$ßá$Øá$Ñá$Êá$Ãá$¼á$µá$®á$§á$ á$™á$’á$‹á$„á$}á$vá$oá$há$aá$Zá$Sá$Lá$Eá$>á$7á$0á$)á$"á$á$á$ á$á$ÿà$øà$ñà$êà$ãà$Üà$Õà$Îà$Çà$Àà$¹à$²à$«à$¤à$à$–à$à$ˆà$à$zà$sà$là$eà$^à$Wà$Pà$Ià$Bà$;à$4à$-à$&à$à$à$à$ à$à$üß$õß$îß$çß$àß$Ùß$Òß$Ëß$Äß$½ß$¶ß$¯ß$¨ß$¡ß$šß$“ß$Œß$…ß$~ß$wß$pß$iß$bß$[ß$Tß$Mß$Fß$?ß$8ß$1ß$*ß$#ß$ß$ß$ß$ß$ß$ùÞ$òÞ$ëÞ$äÞ$ÝÞ$ÖÞ$ÏÞ$ÈÞ$ÁÞ$ºÞ$³Þ$¬Þ$¥Þ$žÞ$—Þ$Þ$‰Þ$‚Þ${Þ$tÞ$mÞ$fÞ$_Þ$XÞ$QÞ$JÞ$CÞ$<Þ$5Þ$.Þ$'Þ$ Þ$Þ$Þ$ Þ$Þ$ýÝ$öÝ$ïÝ$èÝ$áÝ$ÚÝ$ÓÝ$ÌÝ$ÅÝ$¾Ý$·Ý$°Ý$©Ý$¢Ý$›Ý$”Ý$Ý$†Ý$Ý$xÝ$qÝ$jÝ$cÝ$\Ý$UÝ$NÝ$GÝ$@Ý$9Ý$2Ý$+Ý$$Ý$Ý$Ý$Ý$Ý$Ý$úÜ$óÜ$ìÜ$åÜ$ÞÜ$×Ü$ÐÜ$ÉÜ$ÂÜ$»Ü$´Ü$­Ü$¦Ü$ŸÜ$˜Ü$‘Ü$ŠÜ$ƒÜ$|Ü$uÜ$nÜ$gÜ$`Ü$YÜ$RÜ$KÜ$DÜ$=Ü$6Ü$/Ü$(Ü$!Ü$Ü$Ü$ Ü$Ü$þÛ$÷Û$ðÛ$éÛ$âÛ$ÛÛ$ÔÛ$ÍÛ$ÆÛ$¿Û$¸Û$±Û$ªÛ$£Û$œÛ$•Û$ŽÛ$‡Û$€Û$yÛ$rÛ$kÛ$dÛ$]Û$VÛ$OÛ$HÛ$AÛ$:Û$3Û$,Û$%Û$Û$Û$Û$ Û$Û$ûÚ$ôÚ$íÚ$æÚ$ßÚ$ØÚ$ÑÚ$ÊÚ$ÃÚ$¼Ú$µÚ$®Ú$§Ú$ Ú$™Ú$’Ú$‹Ú$„Ú$}Ú$vÚ$oÚ$hÚ$aÚ$ZÚ$SÚ$LÚ$EÚ$>Ú$7Ú$0Ú$)Ú$"Ú$Ú$Ú$ Ú$Ú$ÿÙ$øÙ$ñÙ$êÙ$ãÙ$ÜÙ$ÕÙ$ÎÙ$ÇÙ$ÀÙ$¹Ù$²Ù$«Ù$¤Ù$Ù$–Ù$Ù$ˆÙ$Ù$zÙ$sÙ$lÙ$eÙ$^Ù$WÙ$PÙ$IÙ$BÙ$;Ù$4Ù$-Ù$&Ù$Ù$Ù$Ù$ Ù$Ù$üØ$õØ$îØ$çØ$àØ$ÙØ$ÒØ$ËØ$ÄØ$½Ø$¶Ø$¯Ø$¨Ø$¡Ø$šØ$“Ø$ŒØ$…Ø$~Ø$wØ$pØ$iØ$bØ$[Ø$TØ$MØ$FØ$?Ø$8Ø$1Ø$*Ø$#Ø$Ø$Ø$Ø$Ø$Ø$ù×$ò×$ë×$ä×$Ý×$Ö×$Ï×$È×$Á×$º×$³×$¬×$¥×$ž×$—×$×$‰×$‚×${×$t×$m×$f×$_×$X×$Q×$J×$C×$<×$5×$.×$'×$ ×$×$×$ ×$×$ýÖ$öÖ$ïÖ$èÖ$áÖ$ÚÖ$ÓÖ$ÌÖ$ÅÖ$¾Ö$·Ö$°Ö$©Ö$¢Ö$›Ö$”Ö$Ö$†Ö$Ö$xÖ$qÖ$jÖ$cÖ$\Ö$UÖ$NÖ$GÖ$@Ö$9Ö$2Ö$+Ö$$Ö$Ö$Ö$Ö$Ö$Ö$úÕ$óÕ$ìÕ$åÕ$ÞÕ$×Õ$ÐÕ$ÉÕ$ÂÕ$»Õ$´Õ$­Õ$¦Õ$ŸÕ$˜Õ$‘Õ$ŠÕ$ƒÕ$|Õ$uÕ$nÕ$gÕ$`Õ$YÕ$RÕ$KÕ$DÕ$=Õ$6Õ$/Õ$(Õ$!Õ$Õ$Õ$ Õ$Õ$þÔ$÷Ô$ðÔ$éÔ$âÔ$ÛÔ$ÔÔ$ÍÔ$ÆÔ$¿Ô$¸Ô$±Ô$ªÔ$£Ô$œÔ$•Ô$ŽÔ$‡Ô$€Ô$yÔ$rÔ$kÔ$dÔ$]Ô$VÔ$OÔ$HÔ$AÔ$:Ô$3Ô$,Ô$%Ô$Ô$Ô$Ô$ Ô$Ô$ûÓ$ôÓ$íÓ$æÓ$ßÓ$ØÓ$ÑÓ$ÊÓ$ÃÓ$¼Ó$µÓ$®Ó$§Ó$ Ó$™Ó$’Ó$‹Ó$„Ó$}Ó$vÓ$oÓ$hÓ$aÓ$ZÓ$SÓ$LÓ$EÓ$>Ó$7Ó$0Ó$)Ó$"Ó$Ó$Ó$ Ó$Ó$ÿÒ$øÒ$ñÒ$êÒ$ãÒ$ÜÒ$ÕÒ$ÎÒ$ÇÒ$ÀÒ$¹Ò$²Ò$«Ò$¤Ò$Ò$–Ò$Ò$ˆÒ$Ò$zÒ$sÒ$lÒ$eÒ$^Ò$WÒ$PÒ$IÒ$BÒ$;Ò$4Ò$-Ò$&Ò$Ò$Ò$Ò$ Ò$Ò$üÑ$õÑ$îÑ$çÑ$àÑ$ÙÑ$ÒÑ$ËÑ$ÄÑ$½Ñ$¶Ñ$¯Ñ$¨Ñ$¡Ñ$šÑ$“Ñ$ŒÑ$…Ñ$~Ñ$wÑ$pÑ$iÑ$bÑ$[Ñ$TÑ$MÑ$FÑ$?Ñ$8Ñ$1Ñ$*Ñ$#Ñ$Ñ$Ñ$Ñ$Ñ$Ñ$ùÐ$òÐ$ëÐ$äÐ$ÝÐ$ÖÐ$ÏÐ$ÈÐ$ÁÐ$ºÐ$³Ð$¬Ð$¥Ð$žÐ$—Ð$Ð$‰Ð$‚Ð${Ð$tÐ$mÐ$fÐ$_Ð$XÐ$QÐ$JÐ$CÐ$<Ð$5Ð$.Ð$'Ð$ Ð$Ð$Ð$ Ð$Ð$ýÏ$öÏ$ïÏ$èÏ$áÏ$ÚÏ$ÓÏ$ÌÏ$ÅÏ$¾Ï$·Ï$°Ï$©Ï$¢Ï$›Ï$”Ï$Ï$†Ï$Ï$xÏ$qÏ$jÏ$cÏ$\Ï$UÏ$NÏ$GÏ$@Ï$9Ï$2Ï$+Ï$$Ï$Ï$Ï$Ï$Ï$Ï$úÎ$óÎ$ìÎ$åÎ$ÞÎ$×Î$ÐÎ$ÉÎ$ÂÎ$»Î$´Î$­Î$¦Î$ŸÎ$˜Î$‘Î$ŠÎ$ƒÎ$|Î$uÎ$nÎ$gÎ$`Î$YÎ$RÎ$KÎ$DÎ$=Î$6Î$/Î$(Î$!Î$Î$Î$ Î$Î$þÍ$÷Í$ðÍ$éÍ$âÍ$ÛÍ$ÔÍ$ÍÍ$ÆÍ$¿Í$¸Í$±Í$ªÍ$£Í$œÍ$•Í$ŽÍ$‡Í$€Í$yÍ$rÍ$kÍ$dÍ$]Í$VÍ$OÍ$HÍ$AÍ$:Í$3Í$,Í$%Í$Í$Í$Í$ Í$Í$ûÌ$ôÌ$íÌ$æÌ$ßÌ$ØÌ$ÑÌ$ÊÌ$ÃÌ$¼Ì$µÌ$®Ì$§Ì$ Ì$™Ì$’Ì$‹Ì$„Ì$}Ì$vÌ$oÌ$hÌ$aÌ$ZÌ$SÌ$LÌ$EÌ$>Ì$7Ì$0Ì$)Ì$"Ì$Ì$Ì$ Ì$Ì$ÿË$øË$ñË$êË$ãË$ÜË$ÕË$ÎË$ÇË$ÀË$¹Ë$²Ë$«Ë$¤Ë$Ë$–Ë$Ë$ˆË$Ë$zË$sË$lË$eË$^Ë$WË$PË$IË$BË$;Ë$4Ë$-Ë$&Ë$Ë$Ë$Ë$ Ë$Ë$üÊ$õÊ$îÊ$çÊ$àÊ$ÙÊ$ÒÊ$ËÊ$ÄÊ$½Ê$¶Ê$¯Ê$¨Ê$¡Ê$šÊ$“Ê$ŒÊ$…Ê$~Ê$wÊ$pÊ$iÊ$bÊ$[Ê$TÊ$MÊ$FÊ$?Ê$8Ê$1Ê$*Ê$#Ê$Ê$Ê$Ê$Ê$Ê$ùÉ$òÉ$ëÉ$äÉ$ÝÉ$ÖÉ$ÏÉ$ÈÉ$ÁÉ$ºÉ$³É$¬É$¥É$žÉ$—É$É$‰É$‚É${É$tÉ$mÉ$fÉ$_É$XÉ$QÉ$JÉ$CÉ$<É$5É$.É$'É$ É$É$É$ É$É$ýÈ$öÈ$ïÈ$èÈ$áÈ$ÚÈ$ÓÈ$ÌÈ$ÅÈ$¾È$·È$°È$©È$¢È$›È$”È$È$†È$È$xÈ$qÈ$jÈ$cÈ$\È$UÈ$NÈ$GÈ$@È$9È$2È$+È$$È$È$È$È$È$È$úÇ$óÇ$ìÇ$åÇ$ÞÇ$×Ç$ÐÇ$ÉÇ$ÂÇ$»Ç$´Ç$­Ç$¦Ç$ŸÇ$˜Ç$‘Ç$ŠÇ$ƒÇ$|Ç$uÇ$nÇ$gÇ$`Ç$YÇ$RÇ$KÇ$DÇ$=Ç$6Ç$/Ç$(Ç$!Ç$Ç$Ç$ Ç$Ç$þÆ$÷Æ$ðÆ$éÆ$âÆ$ÛÆ$ÔÆ$ÍÆ$ÆÆ$¿Æ$¸Æ$±Æ$ªÆ$£Æ$œÆ$•Æ$ŽÆ$‡Æ$€Æ$yÆ$rÆ$kÆ$dÆ$]Æ$VÆ$OÆ$HÆ$AÆ$:Æ$3Æ$,Æ$%Æ$Æ$Æ$Æ$ Æ$Æ$ûÅ$ôÅ$íÅ$æÅ$ßÅ$ØÅ$ÑÅ$ÊÅ$ÃÅ$¼Å$µÅ$®Å$§Å$ Å$™Å$’Å$‹Å$„Å$}Å$vÅ$oÅ$hÅ$aÅ$ZÅ$SÅ$LÅ$EÅ$>Å$7Å$0Å$)Å$"Å$Å$Å$ Å$Å$ÿÄ$øÄ$ñÄ$êÄ$ãÄ$ÜÄ$ÕÄ$ÎÄ$ÇÄ$ÀÄ$¹Ä$²Ä$«Ä$¤Ä$Ä$–Ä$Ä$ˆÄ$Ä$zÄ$sÄ$lÄ$eÄ$^Ä$WÄ$PÄ$IÄ$BÄ$;Ä$4Ä$-Ä$&Ä$Ä$Ä$Ä$ Ä$Ä$üÃ$õÃ$îÃ$çÃ$àÃ$ÙÃ$ÒÃ$ËÃ$ÄÃ$½Ã$¶Ã$¯Ã$¨Ã$¡Ã$šÃ$“Ã$ŒÃ$…Ã$~Ã$wÃ$pÃ$iÃ$bÃ$[Ã$TÃ$MÃ$FÃ$?Ã$8Ã$1Ã$*Ã$#Ã$Ã$Ã$Ã$Ã$Ã$ùÂ$òÂ$ëÂ$äÂ$ÝÂ$ÖÂ$ÏÂ$ÈÂ$ÁÂ$ºÂ$³Â$¬Â$¥Â$žÂ$—Â$Â$‰Â$‚Â${Â$tÂ$mÂ$fÂ$_Â$XÂ$QÂ$JÂ$CÂ$<Â$5Â$.Â$'Â$ Â$Â$Â$ Â$Â$ýÁ$öÁ$ïÁ$èÁ$áÁ$ÚÁ$ÓÁ$ÌÁ$ÅÁ$¾Á$·Á$°Á$©Á$¢Á$›Á$”Á$Á$†Á$Á$xÁ$qÁ$jÁ$cÁ$\Á$UÁ$NÁ$GÁ$@Á$9Á$2Á$+Á$$Á$Á$Á$Á$Á$Á$úÀ$óÀ$ìÀ$åÀ$ÞÀ$×À$ÐÀ$ÉÀ$ÂÀ$»À$´À$­À$¦À$ŸÀ$˜À$‘À$ŠÀ$ƒÀ$|À$uÀ$nÀ$gÀ$`À$YÀ$RÀ$KÀ$DÀ$=À$6À$/À$(À$!À$À$À$ À$À$þ¿$÷¿$ð¿$é¿$â¿$Û¿$Ô¿$Í¿$Æ¿$¿¿$¸¿$±¿$ª¿$£¿$œ¿$•¿$Ž¿$‡¿$€¿$y¿$r¿$k¿$d¿$]¿$V¿$O¿$H¿$A¿$:¿$3¿$,¿$%¿$¿$¿$¿$ ¿$¿$û¾$ô¾$í¾$æ¾$ß¾$ؾ$Ѿ$ʾ$þ$¼¾$µ¾$®¾$§¾$ ¾$™¾$’¾$‹¾$„¾$}¾$v¾$o¾$h¾$a¾$Z¾$S¾$L¾$E¾$>¾$7¾$0¾$)¾$"¾$¾$¾$ ¾$¾$ÿ½$ø½$ñ½$ê½$ã½$ܽ$Õ½$ν$ǽ$À½$¹½$²½$«½$¤½$½$–½$½$ˆ½$½$z½$s½$l½$e½$^½$W½$P½$I½$B½$;½$4½$-½$&½$½$½$½$ ½$½$ü¼$õ¼$î¼$ç¼$à¼$Ù¼$Ò¼$˼$ļ$½¼$¶¼$¯¼$¨¼$¡¼$š¼$“¼$Œ¼$…¼$~¼$w¼$p¼$i¼$b¼$[¼$T¼$M¼$F¼$?¼$8¼$1¼$*¼$#¼$¼$¼$¼$¼$¼$ù»$ò»$ë»$ä»$Ý»$Ö»$Ï»$È»$Á»$º»$³»$¬»$¥»$ž»$—»$»$‰»$‚»${»$t»$m»$f»$_»$X»$Q»$J»$C»$<»$5»$.»$'»$ »$»$»$ »$»$ýº$öº$ïº$èº$áº$Úº$Óº$̺$ź$¾º$·º$°º$©º$¢º$›º$”º$º$†º$º$xº$qº$jº$cº$\º$Uº$Nº$Gº$@º$9º$2º$+º$$º$º$º$º$º$º$ú¹$ó¹$ì¹$å¹$Þ¹$×¹$й$ɹ$¹$»¹$´¹$­¹$¦¹$Ÿ¹$˜¹$‘¹$й$ƒ¹$|¹$u¹$n¹$g¹$`¹$Y¹$R¹$K¹$D¹$=¹$6¹$/¹$(¹$!¹$¹$¹$ ¹$¹$þ¸$÷¸$ð¸$é¸$â¸$Û¸$Ô¸$͸$Ƹ$¿¸$¸¸$±¸$ª¸$£¸$œ¸$•¸$ޏ$‡¸$€¸$y¸$r¸$k¸$d¸$]¸$V¸$O¸$H¸$A¸$:¸$3¸$,¸$%¸$¸$¸$¸$ ¸$¸$û·$ô·$í·$æ·$ß·$Ø·$Ñ·$Ê·$÷$¼·$µ·$®·$§·$ ·$™·$’·$‹·$„·$}·$v·$o·$h·$a·$Z·$S·$L·$E·$>·$7·$0·$)·$"·$·$·$ ·$·$ÿ¶$ø¶$ñ¶$ê¶$ã¶$ܶ$Õ¶$ζ$Ƕ$À¶$¹¶$²¶$«¶$¤¶$¶$–¶$¶$ˆ¶$¶$z¶$s¶$l¶$e¶$^¶$W¶$P¶$I¶$B¶$;¶$4¶$-¶$&¶$¶$¶$¶$ ¶$¶$üµ$õµ$îµ$çµ$àµ$Ùµ$Òµ$˵$ĵ$½µ$¶µ$¯µ$¨µ$¡µ$šµ$“µ$Œµ$…µ$~µ$wµ$pµ$iµ$bµ$[µ$Tµ$Mµ$Fµ$?µ$8µ$1µ$*µ$#µ$µ$µ$µ$µ$µ$ù´$ò´$ë´$ä´$Ý´$Ö´$Ï´$È´$Á´$º´$³´$¬´$¥´$ž´$—´$´$‰´$‚´${´$t´$m´$f´$_´$X´$Q´$J´$C´$<´$5´$.´$'´$ ´$´$´$ ´$´$ý³$ö³$ï³$è³$á³$Ú³$Ó³$̳$ų$¾³$·³$°³$©³$¢³$›³$”³$³$†³$³$x³$q³$j³$c³$\³$U³$N³$G³$@³$9³$2³$+³$$³$³$³$³$³$³$ú²$ó²$ì²$å²$Þ²$ײ$в$ɲ$²$»²$´²$­²$¦²$Ÿ²$˜²$‘²$в$ƒ²$|²$u²$n²$g²$`²$Y²$R²$K²$D²$=²$6²$/²$(²$!²$²$²$ ²$²$þ±$÷±$ð±$é±$â±$Û±$Ô±$ͱ$Ʊ$¿±$¸±$±±$ª±$£±$œ±$•±$ޱ$‡±$€±$y±$r±$k±$d±$]±$V±$O±$H±$A±$:±$3±$,±$%±$±$±$±$ ±$±$û°$ô°$í°$æ°$ß°$ذ$Ѱ$ʰ$ð$¼°$µ°$®°$§°$ °$™°$’°$‹°$„°$}°$v°$o°$h°$a°$Z°$S°$L°$E°$>°$7°$0°$)°$"°$°$°$ °$°$ÿ¯$ø¯$ñ¯$ê¯$ã¯$ܯ$Õ¯$ί$ǯ$À¯$¹¯$²¯$«¯$¤¯$¯$–¯$¯$ˆ¯$¯$z¯$s¯$l¯$e¯$^¯$W¯$P¯$I¯$B¯$;¯$4¯$-¯$&¯$¯$¯$¯$ ¯$¯$ü®$õ®$î®$ç®$à®$Ù®$Ò®$Ë®$Ä®$½®$¶®$¯®$¨®$¡®$š®$“®$Œ®$…®$~®$w®$p®$i®$b®$[®$T®$M®$F®$?®$8®$1®$*®$#®$®$®$®$®$®$ù­$ò­$ë­$ä­$Ý­$Ö­$Ï­$È­$Á­$º­$³­$¬­$¥­$ž­$—­$­$‰­$‚­${­$t­$m­$f­$_­$X­$Q­$J­$C­$<­$5­$.­$'­$ ­$­$­$ ­$­$ý¬$ö¬$ï¬$è¬$á¬$Ú¬$Ó¬$̬$Ŭ$¾¬$·¬$°¬$©¬$¢¬$›¬$”¬$¬$†¬$¬$x¬$q¬$j¬$c¬$\¬$U¬$N¬$G¬$@¬$9¬$2¬$+¬$$¬$¬$¬$¬$¬$¬$ú«$ó«$ì«$å«$Þ«$׫$Ы$É«$«$»«$´«$­«$¦«$Ÿ«$˜«$‘«$Š«$ƒ«$|«$u«$n«$g«$`«$Y«$R«$K«$D«$=«$6«$/«$(«$!«$«$«$ «$«$þª$÷ª$ðª$éª$âª$Ûª$Ôª$ͪ$ƪ$¿ª$¸ª$±ª$ªª$£ª$œª$•ª$Žª$‡ª$€ª$yª$rª$kª$dª$]ª$Vª$Oª$Hª$Aª$:ª$3ª$,ª$%ª$ª$ª$ª$ ª$ª$û©$ô©$í©$æ©$ß©$Ø©$Ñ©$Ê©$é$¼©$µ©$®©$§©$ ©$™©$’©$‹©$„©$}©$v©$o©$h©$a©$Z©$S©$L©$E©$>©$7©$0©$)©$"©$©$©$ ©$©$ÿ¨$ø¨$ñ¨$ê¨$ã¨$ܨ$Õ¨$Ψ$Ǩ$À¨$¹¨$²¨$«¨$¤¨$¨$–¨$¨$ˆ¨$¨$z¨$s¨$l¨$e¨$^¨$W¨$P¨$I¨$B¨$;¨$4¨$-¨$&¨$¨$¨$¨$ ¨$¨$ü§$õ§$î§$ç§$à§$Ù§$Ò§$˧$ħ$½§$¶§$¯§$¨§$¡§$š§$“§$Œ§$…§$~§$w§$p§$i§$b§$[§$T§$M§$F§$?§$8§$1§$*§$#§$§$§$§$§$§$ù¦$ò¦$ë¦$ä¦$ݦ$Ö¦$Ϧ$Ȧ$Á¦$º¦$³¦$¬¦$¥¦$ž¦$—¦$¦$‰¦$‚¦${¦$t¦$m¦$f¦$_¦$X¦$Q¦$J¦$C¦$<¦$5¦$.¦$'¦$ ¦$¦$¦$ ¦$¦$ý¥$ö¥$ï¥$è¥$á¥$Ú¥$Ó¥$Ì¥$Å¥$¾¥$·¥$°¥$©¥$¢¥$›¥$”¥$¥$†¥$¥$x¥$q¥$j¥$c¥$\¥$U¥$N¥$G¥$@¥$9¥$2¥$+¥$$¥$¥$¥$¥$¥$¥$ú¤$ó¤$ì¤$å¤$Þ¤$פ$Ф$ɤ$¤$»¤$´¤$­¤$¦¤$Ÿ¤$˜¤$‘¤$Ф$ƒ¤$|¤$u¤$n¤$g¤$`¤$Y¤$R¤$K¤$D¤$=¤$6¤$/¤$(¤$!¤$¤$¤$ ¤$¤$þ£$÷£$ð£$é£$â£$Û£$Ô£$Í£$Æ£$¿£$¸£$±£$ª£$££$œ£$•£$Ž£$‡£$€£$y£$r£$k£$d£$]£$V£$O£$H£$A£$:£$3£$,£$%£$£$£$£$ £$£$û¢$ô¢$í¢$æ¢$ߢ$Ø¢$Ñ¢$Ê¢$â$¼¢$µ¢$®¢$§¢$ ¢$™¢$’¢$‹¢$„¢$}¢$v¢$o¢$h¢$a¢$Z¢$S¢$L¢$E¢$>¢$7¢$0¢$)¢$"¢$¢$¢$ ¢$¢$ÿ¡$ø¡$ñ¡$ê¡$ã¡$Ü¡$Õ¡$Ρ$Ç¡$À¡$¹¡$²¡$«¡$¤¡$¡$–¡$¡$ˆ¡$¡$z¡$s¡$l¡$e¡$^¡$W¡$P¡$I¡$B¡$;¡$4¡$-¡$&¡$¡$¡$¡$ ¡$¡$ü $õ $î $ç $à $Ù $Ò $Ë $Ä $½ $¶ $¯ $¨ $¡ $š $“ $Œ $… $~ $w $p $i $b $[ $T $M $F $? $8 $1 $* $# $ $ $ $ $ $ùŸ$òŸ$ëŸ$äŸ$ÝŸ$ÖŸ$ÏŸ$ÈŸ$ÁŸ$ºŸ$³Ÿ$¬Ÿ$¥Ÿ$žŸ$—Ÿ$Ÿ$‰Ÿ$‚Ÿ${Ÿ$tŸ$mŸ$fŸ$_Ÿ$XŸ$QŸ$JŸ$CŸ$<Ÿ$5Ÿ$.Ÿ$'Ÿ$ Ÿ$Ÿ$Ÿ$ Ÿ$Ÿ$ýž$öž$ïž$èž$áž$Úž$Óž$Ìž$Åž$¾ž$·ž$°ž$©ž$¢ž$›ž$”ž$ž$†ž$ž$xž$qž$jž$cž$\ž$Už$Nž$Gž$@ž$9ž$2ž$+ž$$ž$ž$ž$ž$ž$ž$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þœ$÷œ$ðœ$éœ$âœ$Ûœ$Ôœ$Íœ$Æœ$¿œ$¸œ$±œ$ªœ$£œ$œœ$•œ$Žœ$‡œ$€œ$yœ$rœ$kœ$dœ$]œ$Vœ$Oœ$Hœ$Aœ$:œ$3œ$,œ$%œ$œ$œ$œ$ œ$œ$û›$ô›$í›$æ›$ß›$Ø›$Ñ›$Ê›$Û$¼›$µ›$®›$§›$ ›$™›$’›$‹›$„›$}›$v›$o›$h›$a›$Z›$S›$L›$E›$>›$7›$0›$)›$"›$›$›$ ›$›$ÿš$øš$ñš$êš$ãš$Üš$Õš$Κ$Çš$Àš$¹š$²š$«š$¤š$š$–š$š$ˆš$š$zš$sš$lš$eš$^š$Wš$Pš$Iš$Bš$;š$4š$-š$&š$š$š$š$ š$š$ü™$õ™$î™$ç™$à™$Ù™$Ò™$Ë™$Ä™$½™$¶™$¯™$¨™$¡™$š™$“™$Œ™$…™$~™$w™$p™$i™$b™$[™$T™$M™$F™$?™$8™$1™$*™$#™$™$™$™$™$™$ù˜$ò˜$ë˜$ä˜$ݘ$Ö˜$Ϙ$Ș$Á˜$º˜$³˜$¬˜$¥˜$ž˜$—˜$˜$‰˜$‚˜${˜$t˜$m˜$f˜$_˜$X˜$Q˜$J˜$C˜$<˜$5˜$.˜$'˜$ ˜$˜$˜$ ˜$˜$ý—$ö—$ï—$è—$á—$Ú—$Ó—$Ì—$Å—$¾—$·—$°—$©—$¢—$›—$”—$—$†—$—$x—$q—$j—$c—$\—$U—$N—$G—$@—$9—$2—$+—$$—$—$—$—$—$—$ú–$ó–$ì–$å–$Þ–$×–$Ж$É–$–$»–$´–$­–$¦–$Ÿ–$˜–$‘–$Š–$ƒ–$|–$u–$n–$g–$`–$Y–$R–$K–$D–$=–$6–$/–$(–$!–$–$–$ –$–$þ•$÷•$ð•$é•$â•$Û•$Ô•$Í•$Æ•$¿•$¸•$±•$ª•$£•$œ•$••$Ž•$‡•$€•$y•$r•$k•$d•$]•$V•$O•$H•$A•$:•$3•$,•$%•$•$•$•$ •$•$û”$ô”$í”$æ”$ß”$Ø”$Ñ”$Ê”$Ô$¼”$µ”$®”$§”$ ”$™”$’”$‹”$„”$}”$v”$o”$h”$a”$Z”$S”$L”$E”$>”$7”$0”$)”$"”$”$”$ ”$”$ÿ“$ø“$ñ“$ê“$ã“$Ü“$Õ“$Γ$Ç“$À“$¹“$²“$«“$¤“$“$–“$“$ˆ“$“$z“$s“$l“$e“$^“$W“$P“$I“$B“$;“$4“$-“$&“$“$“$“$ “$“$ü’$õ’$î’$ç’$à’$Ù’$Ò’$Ë’$Ä’$½’$¶’$¯’$¨’$¡’$š’$“’$Œ’$…’$~’$w’$p’$i’$b’$[’$T’$M’$F’$?’$8’$1’$*’$#’$’$’$’$’$’$ù‘$ò‘$ë‘$ä‘$Ý‘$Ö‘$Ï‘$È‘$Á‘$º‘$³‘$¬‘$¥‘$ž‘$—‘$‘$‰‘$‚‘${‘$t‘$m‘$f‘$_‘$X‘$Q‘$J‘$C‘$<‘$5‘$.‘$'‘$ ‘$‘$‘$ ‘$‘$ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þŽ$÷Ž$ðŽ$éŽ$âŽ$ÛŽ$ÔŽ$ÍŽ$ÆŽ$¿Ž$¸Ž$±Ž$ªŽ$£Ž$œŽ$•Ž$ŽŽ$‡Ž$€Ž$yŽ$rŽ$kŽ$dŽ$]Ž$VŽ$OŽ$HŽ$AŽ$:Ž$3Ž$,Ž$%Ž$Ž$Ž$Ž$ Ž$Ž$û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿŒ$øŒ$ñŒ$êŒ$ãŒ$ÜŒ$ÕŒ$ÎŒ$ÇŒ$ÀŒ$¹Œ$²Œ$«Œ$¤Œ$Œ$–Œ$Œ$ˆŒ$Œ$zŒ$sŒ$lŒ$eŒ$^Œ$WŒ$PŒ$IŒ$BŒ$;Œ$4Œ$-Œ$&Œ$Œ$Œ$Œ$ Œ$Œ$ü‹$õ‹$î‹$ç‹$à‹$Ù‹$Ò‹$Ë‹$Ä‹$½‹$¶‹$¯‹$¨‹$¡‹$š‹$“‹$Œ‹$…‹$~‹$w‹$p‹$i‹$b‹$[‹$T‹$M‹$F‹$?‹$8‹$1‹$*‹$#‹$‹$‹$‹$‹$‹$ùŠ$òŠ$ëŠ$äŠ$ÝŠ$ÖŠ$ÏŠ$ÈŠ$ÁŠ$ºŠ$³Š$¬Š$¥Š$žŠ$—Š$Š$‰Š$‚Š${Š$tŠ$mŠ$fŠ$_Š$XŠ$QŠ$JŠ$CŠ$<Š$5Š$.Š$'Š$ Š$Š$Š$ Š$Š$ý‰$ö‰$ï‰$è‰$á‰$Ú‰$Ó‰$̉$ʼn$¾‰$·‰$°‰$©‰$¢‰$›‰$”‰$‰$†‰$‰$x‰$q‰$j‰$c‰$\‰$U‰$N‰$G‰$@‰$9‰$2‰$+‰$$‰$‰$‰$‰$‰$‰$úˆ$óˆ$ìˆ$åˆ$Þˆ$׈$Ј$Ɉ$ˆ$»ˆ$´ˆ$­ˆ$¦ˆ$Ÿˆ$˜ˆ$‘ˆ$Šˆ$ƒˆ$|ˆ$uˆ$nˆ$gˆ$`ˆ$Yˆ$Rˆ$Kˆ$Dˆ$=ˆ$6ˆ$/ˆ$(ˆ$!ˆ$ˆ$ˆ$ ˆ$ˆ$þ‡$÷‡$ð‡$é‡$â‡$Û‡$Ô‡$͇$Ƈ$¿‡$¸‡$±‡$ª‡$£‡$œ‡$•‡$އ$‡‡$€‡$y‡$r‡$k‡$d‡$]‡$V‡$O‡$H‡$A‡$:‡$3‡$,‡$%‡$‡$‡$‡$ ‡$‡$û†$ô†$í†$æ†$߆$؆$ц$ʆ$Æ$¼†$µ†$®†$§†$ †$™†$’†$‹†$„†$}†$v†$o†$h†$a†$Z†$S†$L†$E†$>†$7†$0†$)†$"†$†$†$ †$†$ÿ…$ø…$ñ…$ê…$ã…$Ü…$Õ…$Î…$Ç…$À…$¹…$²…$«…$¤…$…$–…$…$ˆ…$…$z…$s…$l…$e…$^…$W…$P…$I…$B…$;…$4…$-…$&…$…$…$…$ …$…$ü„$õ„$î„$ç„$à„$Ù„$Ò„$Ë„$Ä„$½„$¶„$¯„$¨„$¡„$š„$“„$Œ„$…„$~„$w„$p„$i„$b„$[„$T„$M„$F„$?„$8„$1„$*„$#„$„$„$„$„$„$ùƒ$òƒ$ëƒ$äƒ$݃$Öƒ$σ$ȃ$Áƒ$ºƒ$³ƒ$¬ƒ$¥ƒ$žƒ$—ƒ$ƒ$‰ƒ$‚ƒ${ƒ$tƒ$mƒ$fƒ$_ƒ$Xƒ$Qƒ$Jƒ$Cƒ$<ƒ$5ƒ$.ƒ$'ƒ$ ƒ$ƒ$ƒ$ ƒ$ƒ$ý‚$ö‚$ï‚$è‚$á‚$Ú‚$Ó‚$Ì‚$Å‚$¾‚$·‚$°‚$©‚$¢‚$›‚$”‚$‚$†‚$‚$x‚$q‚$j‚$c‚$\‚$U‚$N‚$G‚$@‚$9‚$2‚$+‚$$‚$‚$‚$‚$‚$‚$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ€$÷€$ð€$é€$â€$Û€$Ô€$Í€$Æ€$¿€$¸€$±€$ª€$£€$œ€$•€$Ž€$‡€$€€$y€$r€$k€$d€$]€$V€$O€$H€$A€$:€$3€$,€$%€$€$€$€$ €$€$û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ~$ø~$ñ~$ê~$ã~$Ü~$Õ~$Î~$Ç~$À~$¹~$²~$«~$¤~$~$–~$~$ˆ~$~$z~$s~$l~$e~$^~$W~$P~$I~$B~$;~$4~$-~$&~$~$~$~$ ~$~$ü}$õ}$î}$ç}$à}$Ù}$Ò}$Ë}$Ä}$½}$¶}$¯}$¨}$¡}$š}$“}$Œ}$…}$~}$w}$p}$i}$b}$[}$T}$M}$F}$?}$8}$1}$*}$#}$}$}$}$}$}$ù|$ò|$ë|$ä|$Ý|$Ö|$Ï|$È|$Á|$º|$³|$¬|$¥|$ž|$—|$|$‰|$‚|${|$t|$m|$f|$_|$X|$Q|$J|$C|$<|$5|$.|$'|$ |$|$|$ |$|$ý{$ö{$ï{$è{$á{$Ú{$Ó{$Ì{$Å{$¾{$·{$°{$©{$¢{$›{$”{${$†{${$x{$q{$j{$c{$\{$U{$N{$G{$@{$9{$2{$+{$${${${${${${$úz$óz$ìz$åz$Þz$×z$Ðz$Éz$Âz$»z$´z$­z$¦z$Ÿz$˜z$‘z$Šz$ƒz$|z$uz$nz$gz$`z$Yz$Rz$Kz$Dz$=z$6z$/z$(z$!z$z$z$ z$z$þy$÷y$ðy$éy$ây$Ûy$Ôy$Íy$Æy$¿y$¸y$±y$ªy$£y$œy$•y$Žy$‡y$€y$yy$ry$ky$dy$]y$Vy$Oy$Hy$Ay$:y$3y$,y$%y$y$y$y$ y$y$ûx$ôx$íx$æx$ßx$Øx$Ñx$Êx$Ãx$¼x$µx$®x$§x$ x$™x$’x$‹x$„x$}x$vx$ox$hx$ax$Zx$Sx$Lx$Ex$>x$7x$0x$)x$"x$x$x$ x$x$ÿw$øw$ñw$êw$ãw$Üw$Õw$Îw$Çw$Àw$¹w$²w$«w$¤w$w$–w$w$ˆw$w$zw$sw$lw$ew$^w$Ww$Pw$Iw$Bw$;w$4w$-w$&w$w$w$w$ w$w$üv$õv$îv$çv$àv$Ùv$Òv$Ëv$Äv$½v$¶v$¯v$¨v$¡v$šv$“v$Œv$…v$~v$wv$pv$iv$bv$[v$Tv$Mv$Fv$?v$8v$1v$*v$#v$v$v$v$v$v$ùu$òu$ëu$äu$Ýu$Öu$Ïu$Èu$Áu$ºu$³u$¬u$¥u$žu$—u$u$‰u$‚u${u$tu$mu$fu$_u$Xu$Qu$Ju$Cu$q$7q$0q$)q$"q$q$q$ q$q$ÿp$øp$ñp$êp$ãp$Üp$Õp$Îp$Çp$Àp$¹p$²p$«p$¤p$p$–p$p$ˆp$p$zp$sp$lp$ep$^p$Wp$Pp$Ip$Bp$;p$4p$-p$&p$p$p$p$ p$p$üo$õo$îo$ço$ào$Ùo$Òo$Ëo$Äo$½o$¶o$¯o$¨o$¡o$šo$“o$Œo$…o$~o$wo$po$io$bo$[o$To$Mo$Fo$?o$8o$1o$*o$#o$o$o$o$o$o$ùn$òn$ën$än$Ýn$Ön$Ïn$Èn$Án$ºn$³n$¬n$¥n$žn$—n$n$‰n$‚n${n$tn$mn$fn$_n$Xn$Qn$Jn$Cn$j$7j$0j$)j$"j$j$j$ j$j$ÿi$øi$ñi$êi$ãi$Üi$Õi$Îi$Çi$Ài$¹i$²i$«i$¤i$i$–i$i$ˆi$i$zi$si$li$ei$^i$Wi$Pi$Ii$Bi$;i$4i$-i$&i$i$i$i$ i$i$üh$õh$îh$çh$àh$Ùh$Òh$Ëh$Äh$½h$¶h$¯h$¨h$¡h$šh$“h$Œh$…h$~h$wh$ph$ih$bh$[h$Th$Mh$Fh$?h$8h$1h$*h$#h$h$h$h$h$h$ùg$òg$ëg$äg$Ýg$Ög$Ïg$Èg$Ág$ºg$³g$¬g$¥g$žg$—g$g$‰g$‚g${g$tg$mg$fg$_g$Xg$Qg$Jg$Cg$c$7c$0c$)c$"c$c$c$ c$c$ÿb$øb$ñb$êb$ãb$Üb$Õb$Îb$Çb$Àb$¹b$²b$«b$¤b$b$–b$b$ˆb$b$zb$sb$lb$eb$^b$Wb$Pb$Ib$Bb$;b$4b$-b$&b$b$b$b$ b$b$üa$õa$îa$ça$àa$Ùa$Òa$Ëa$Äa$½a$¶a$¯a$¨a$¡a$ša$“a$Œa$…a$~a$wa$pa$ia$ba$[a$Ta$Ma$Fa$?a$8a$1a$*a$#a$a$a$a$a$a$ù`$ò`$ë`$ä`$Ý`$Ö`$Ï`$È`$Á`$º`$³`$¬`$¥`$ž`$—`$`$‰`$‚`${`$t`$m`$f`$_`$X`$Q`$J`$C`$<`$5`$.`$'`$ `$`$`$ `$`$ý_$ö_$ï_$è_$á_$Ú_$Ó_$Ì_$Å_$¾_$·_$°_$©_$¢_$›_$”_$_$†_$_$x_$q_$j_$c_$\_$U_$N_$G_$@_$9_$2_$+_$$_$_$_$_$_$_$ú^$ó^$ì^$å^$Þ^$×^$Ð^$É^$Â^$»^$´^$­^$¦^$Ÿ^$˜^$‘^$Š^$ƒ^$|^$u^$n^$g^$`^$Y^$R^$K^$D^$=^$6^$/^$(^$!^$^$^$ ^$^$þ]$÷]$ð]$é]$â]$Û]$Ô]$Í]$Æ]$¿]$¸]$±]$ª]$£]$œ]$•]$Ž]$‡]$€]$y]$r]$k]$d]$]]$V]$O]$H]$A]$:]$3]$,]$%]$]$]$]$ ]$]$û\$ô\$í\$æ\$ß\$Ø\$Ñ\$Ê\$Ã\$¼\$µ\$®\$§\$ \$™\$’\$‹\$„\$}\$v\$o\$h\$a\$Z\$S\$L\$E\$>\$7\$0\$)\$"\$\$\$ \$\$ÿ[$ø[$ñ[$ê[$ã[$Ü[$Õ[$Î[$Ç[$À[$¹[$²[$«[$¤[$[$–[$[$ˆ[$[$z[$s[$l[$e[$^[$W[$P[$I[$B[$;[$4[$-[$&[$[$[$[$ [$[$üZ$õZ$îZ$çZ$àZ$ÙZ$ÒZ$ËZ$ÄZ$½Z$¶Z$¯Z$¨Z$¡Z$šZ$“Z$ŒZ$…Z$~Z$wZ$pZ$iZ$bZ$[Z$TZ$MZ$FZ$?Z$8Z$1Z$*Z$#Z$Z$Z$Z$Z$Z$ùY$òY$ëY$äY$ÝY$ÖY$ÏY$ÈY$ÁY$ºY$³Y$¬Y$¥Y$žY$—Y$Y$‰Y$‚Y${Y$tY$mY$fY$_Y$XY$QY$JY$CY$U$7U$0U$)U$"U$U$U$ U$U$ÿT$øT$ñT$êT$ãT$ÜT$ÕT$ÎT$ÇT$ÀT$¹T$²T$«T$¤T$T$–T$T$ˆT$T$zT$sT$lT$eT$^T$WT$PT$IT$BT$;T$4T$-T$&T$T$T$T$ T$T$üS$õS$îS$çS$àS$ÙS$ÒS$ËS$ÄS$½S$¶S$¯S$¨S$¡S$šS$“S$ŒS$…S$~S$wS$pS$iS$bS$[S$TS$MS$FS$?S$8S$1S$*S$#S$S$S$S$S$S$ùR$òR$ëR$äR$ÝR$ÖR$ÏR$ÈR$ÁR$ºR$³R$¬R$¥R$žR$—R$R$‰R$‚R${R$tR$mR$fR$_R$XR$QR$JR$CR$N$7N$0N$)N$"N$N$N$ N$N$ÿM$øM$ñM$êM$ãM$ÜM$ÕM$ÎM$ÇM$ÀM$¹M$²M$«M$¤M$M$–M$M$ˆM$M$zM$sM$lM$eM$^M$WM$PM$IM$BM$;M$4M$-M$&M$M$M$M$ M$M$üL$õL$îL$çL$àL$ÙL$ÒL$ËL$ÄL$½L$¶L$¯L$¨L$¡L$šL$“L$ŒL$…L$~L$wL$pL$iL$bL$[L$TL$ML$FL$?L$8L$1L$*L$#L$L$L$L$L$L$ùK$òK$ëK$äK$ÝK$ÖK$ÏK$ÈK$ÁK$ºK$³K$¬K$¥K$žK$—K$K$‰K$‚K${K$tK$mK$fK$_K$XK$QK$JK$CK$G$7G$0G$)G$"G$G$G$ G$G$ÿF$øF$ñF$êF$ãF$ÜF$ÕF$ÎF$ÇF$ÀF$¹F$²F$«F$¤F$F$–F$F$ˆF$F$zF$sF$lF$eF$^F$WF$PF$IF$BF$;F$4F$-F$&F$F$F$F$ F$F$üE$õE$îE$çE$àE$ÙE$ÒE$ËE$ÄE$½E$¶E$¯E$¨E$¡E$šE$“E$ŒE$…E$~E$wE$pE$iE$bE$[E$TE$ME$FE$?E$8E$1E$*E$#E$E$E$E$E$E$ùD$òD$ëD$äD$ÝD$ÖD$ÏD$ÈD$ÁD$ºD$³D$¬D$¥D$žD$—D$D$‰D$‚D${D$tD$mD$fD$_D$XD$QD$JD$CD$@$7@$0@$)@$"@$@$@$ @$@$ÿ?$ø?$ñ?$ê?$ã?$Ü?$Õ?$Î?$Ç?$À?$¹?$²?$«?$¤?$?$–?$?$ˆ?$?$z?$s?$l?$e?$^?$W?$P?$I?$B?$;?$4?$-?$&?$?$?$?$ ?$?$ü>$õ>$î>$ç>$à>$Ù>$Ò>$Ë>$Ä>$½>$¶>$¯>$¨>$¡>$š>$“>$Œ>$…>$~>$w>$p>$i>$b>$[>$T>$M>$F>$?>$8>$1>$*>$#>$>$>$>$>$>$ù=$ò=$ë=$ä=$Ý=$Ö=$Ï=$È=$Á=$º=$³=$¬=$¥=$ž=$—=$=$‰=$‚=${=$t=$m=$f=$_=$X=$Q=$J=$C=$<=$5=$.=$'=$ =$=$=$ =$=$ý<$ö<$ï<$è<$á<$Ú<$Ó<$Ì<$Å<$¾<$·<$°<$©<$¢<$›<$”<$<$†<$<$x<$q<$j<$c<$\<$U<$N<$G<$@<$9<$2<$+<$$<$<$<$<$<$<$ú;$ó;$ì;$å;$Þ;$×;$Ð;$É;$Â;$»;$´;$­;$¦;$Ÿ;$˜;$‘;$Š;$ƒ;$|;$u;$n;$g;$`;$Y;$R;$K;$D;$=;$6;$/;$(;$!;$;$;$ ;$;$þ:$÷:$ð:$é:$â:$Û:$Ô:$Í:$Æ:$¿:$¸:$±:$ª:$£:$œ:$•:$Ž:$‡:$€:$y:$r:$k:$d:$]:$V:$O:$H:$A:$::$3:$,:$%:$:$:$:$ :$:$û9$ô9$í9$æ9$ß9$Ø9$Ñ9$Ê9$Ã9$¼9$µ9$®9$§9$ 9$™9$’9$‹9$„9$}9$v9$o9$h9$a9$Z9$S9$L9$E9$>9$79$09$)9$"9$9$9$ 9$9$ÿ8$ø8$ñ8$ê8$ã8$Ü8$Õ8$Î8$Ç8$À8$¹8$²8$«8$¤8$8$–8$8$ˆ8$8$z8$s8$l8$e8$^8$W8$P8$I8$B8$;8$48$-8$&8$8$8$8$ 8$8$ü7$õ7$î7$ç7$à7$Ù7$Ò7$Ë7$Ä7$½7$¶7$¯7$¨7$¡7$š7$“7$Œ7$…7$~7$w7$p7$i7$b7$[7$T7$M7$F7$?7$87$17$*7$#7$7$7$7$7$7$ù6$ò6$ë6$ä6$Ý6$Ö6$Ï6$È6$Á6$º6$³6$¬6$¥6$ž6$—6$6$‰6$‚6${6$t6$m6$f6$_6$X6$Q6$J6$C6$<6$56$.6$'6$ 6$6$6$ 6$6$ý5$ö5$ï5$è5$á5$Ú5$Ó5$Ì5$Å5$¾5$·5$°5$©5$¢5$›5$”5$5$†5$5$x5$q5$j5$c5$\5$U5$N5$G5$@5$95$25$+5$$5$5$5$5$5$5$ú4$ó4$ì4$å4$Þ4$×4$Ð4$É4$Â4$»4$´4$­4$¦4$Ÿ4$˜4$‘4$Š4$ƒ4$|4$u4$n4$g4$`4$Y4$R4$K4$D4$=4$64$/4$(4$!4$4$4$ 4$4$þ3$÷3$ð3$é3$â3$Û3$Ô3$Í3$Æ3$¿3$¸3$±3$ª3$£3$œ3$•3$Ž3$‡3$€3$y3$r3$k3$d3$]3$V3$O3$H3$A3$:3$33$,3$%3$3$3$3$ 3$3$û2$ô2$í2$æ2$ß2$Ø2$Ñ2$Ê2$Ã2$¼2$µ2$®2$§2$ 2$™2$’2$‹2$„2$}2$v2$o2$h2$a2$Z2$S2$L2$E2$>2$72$02$)2$"2$2$2$ 2$2$ÿ1$ø1$ñ1$ê1$ã1$Ü1$Õ1$Î1$Ç1$À1$¹1$²1$«1$¤1$1$–1$1$ˆ1$1$z1$s1$l1$e1$^1$W1$P1$I1$B1$;1$41$-1$&1$1$1$1$ 1$1$ü0$õ0$î0$ç0$à0$Ù0$Ò0$Ë0$Ä0$½0$¶0$¯0$¨0$¡0$š0$“0$Œ0$…0$~0$w0$p0$i0$b0$[0$T0$M0$F0$?0$80$10$*0$#0$0$0$0$0$0$ù/$ò/$ë/$ä/$Ý/$Ö/$Ï/$È/$Á/$º/$³/$¬/$¥/$ž/$—/$/$‰/$‚/${/$t/$m/$f/$_/$X/$Q/$J/$C/$+$7+$0+$)+$"+$+$+$ +$+$ÿ*$ø*$ñ*$ê*$ã*$Ü*$Õ*$Î*$Ç*$À*$¹*$²*$«*$¤*$*$–*$*$ˆ*$*$z*$s*$l*$e*$^*$W*$P*$I*$B*$;*$4*$-*$&*$*$*$*$ *$*$ü)$õ)$î)$ç)$à)$Ù)$Ò)$Ë)$Ä)$½)$¶)$¯)$¨)$¡)$š)$“)$Œ)$…)$~)$w)$p)$i)$b)$[)$T)$M)$F)$?)$8)$1)$*)$#)$)$)$)$)$)$ù($ò($ë($ä($Ý($Ö($Ï($È($Á($º($³($¬($¥($ž($—($($‰($‚(${($t($m($f($_($X($Q($J($C($<($5($.($'($ ($($($ ($($ý'$ö'$ï'$è'$á'$Ú'$Ó'$Ì'$Å'$¾'$·'$°'$©'$¢'$›'$”'$'$†'$'$x'$q'$j'$c'$\'$U'$N'$G'$@'$9'$2'$+'$$'$'$'$'$'$'$ú&$ó&$ì&$å&$Þ&$×&$Ð&$É&$Â&$»&$´&$­&$¦&$Ÿ&$˜&$‘&$Š&$ƒ&$|&$u&$n&$g&$`&$Y&$R&$K&$D&$=&$6&$/&$(&$!&$&$&$ &$&$þ%$÷%$ð%$é%$â%$Û%$Ô%$Í%$Æ%$¿%$¸%$±%$ª%$£%$œ%$•%$Ž%$‡%$€%$y%$r%$k%$d%$]%$V%$O%$H%$A%$:%$3%$,%$%%$%$%$%$ %$%$û$$ô$$í$$æ$$ß$$Ø$$Ñ$$Ê$$Ã$$¼$$µ$$®$$§$$ $$™$$’$$‹$$„$$}$$v$$o$$h$$a$$Z$$S$$L$$E$$>$$7$$0$$)$$"$$$$$$ $$$$ÿ#$ø#$ñ#$ê#$ã#$Ü#$Õ#$Î#$Ç#$À#$¹#$²#$«#$¤#$#$–#$#$ˆ#$#$z#$s#$l#$e#$^#$W#$P#$I#$B#$;#$4#$-#$&#$#$#$#$ #$#$ü"$õ"$î"$ç"$à"$Ù"$Ò"$Ë"$Ä"$½"$¶"$¯"$¨"$¡"$š"$“"$Œ"$…"$~"$w"$p"$i"$b"$["$T"$M"$F"$?"$8"$1"$*"$#"$"$"$"$"$"$ù!$ò!$ë!$ä!$Ý!$Ö!$Ï!$È!$Á!$º!$³!$¬!$¥!$ž!$—!$!$‰!$‚!${!$t!$m!$f!$_!$X!$Q!$J!$C!$$7$0$)$"$$$ $$ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü $õ $î $ç $à $Ù $Ò $Ë $Ä $½ $¶ $¯ $¨ $¡ $š $“ $Œ $… $~ $w $p $i $b $[ $T $M $F $? $8 $1 $* $# $ $ $ $ $ $ù $ò $ë $ä $Ý $Ö $Ï $È $Á $º $³ $¬ $¥ $ž $— $ $‰ $‚ ${ $t $m $f $_ $X $Q $J $C $< $5 $. $' $ $ $ $ $ $ý $ö $ï $è $á $Ú $Ó $Ì $Å $¾ $· $° $© $¢ $› $” $ $† $ $x $q $j $c $\ $U $N $G $@ $9 $2 $+ $$ $ $ $ $ $ $ú $ó $ì $å $Þ $× $Ð $É $ $» $´ $­ $¦ $Ÿ $˜ $‘ $Š $ƒ $| $u $n $g $` $Y $R $K $D $= $6 $/ $( $! $ $ $ $ $þ $÷ $ð $é $â $Û $Ô $Í $Æ $¿ $¸ $± $ª $£ $œ $• $Ž $‡ $€ $y $r $k $d $] $V $O $H $A $: $3 $, $% $ $ $ $ $ $û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$üÿ#õÿ#îÿ#çÿ#àÿ#Ùÿ#Òÿ#Ëÿ#Äÿ#½ÿ#¶ÿ#¯ÿ#¨ÿ#¡ÿ#šÿ#“ÿ#Œÿ#…ÿ#~ÿ#wÿ#pÿ#iÿ#bÿ#[ÿ#Tÿ#Mÿ#Fÿ#?ÿ#8ÿ#1ÿ#*ÿ##ÿ#ÿ#ÿ#ÿ#ÿ#ÿ#ùþ#òþ#ëþ#äþ#Ýþ#Öþ#Ïþ#Èþ#Áþ#ºþ#³þ#¬þ#¥þ#žþ#—þ#þ#‰þ#‚þ#{þ#tþ#mþ#fþ#_þ#Xþ#Qþ#Jþ#Cþ#<þ#5þ#.þ#'þ# þ#þ#þ# þ#þ#ýý#öý#ïý#èý#áý#Úý#Óý#Ìý#Åý#¾ý#·ý#°ý#©ý#¢ý#›ý#”ý#ý#†ý#ý#xý#qý#jý#cý#\ý#Uý#Ný#Gý#@ý#9ý#2ý#+ý#$ý#ý#ý#ý#ý#ý#úü#óü#ìü#åü#Þü#×ü#Ðü#Éü#Âü#»ü#´ü#­ü#¦ü#Ÿü#˜ü#‘ü#Šü#ƒü#|ü#uü#nü#gü#`ü#Yü#Rü#Kü#Dü#=ü#6ü#/ü#(ü#!ü#ü#ü# ü#ü#þû#÷û#ðû#éû#âû#Ûû#Ôû#Íû#Æû#¿û#¸û#±û#ªû#£û#œû#•û#Žû#‡û#€û#yû#rû#kû#dû#]û#Vû#Oû#Hû#Aû#:û#3û#,û#%û#û#û#û# û#û#ûú#ôú#íú#æú#ßú#Øú#Ñú#Êú#Ãú#¼ú#µú#®ú#§ú# ú#™ú#’ú#‹ú#„ú#}ú#vú#oú#hú#aú#Zú#Sú#Lú#Eú#>ú#7ú#0ú#)ú#"ú#ú#ú# ú#ú#ÿù#øù#ñù#êù#ãù#Üù#Õù#Îù#Çù#Àù#¹ù#²ù#«ù#¤ù#ù#–ù#ù#ˆù#ù#zù#sù#lù#eù#^ù#Wù#Pù#Iù#Bù#;ù#4ù#-ù#&ù#ù#ù#ù# ù#ù#üø#õø#îø#çø#àø#Ùø#Òø#Ëø#Äø#½ø#¶ø#¯ø#¨ø#¡ø#šø#“ø#Œø#…ø#~ø#wø#pø#iø#bø#[ø#Tø#Mø#Fø#?ø#8ø#1ø#*ø##ø#ø#ø#ø#ø#ø#ù÷#ò÷#ë÷#ä÷#Ý÷#Ö÷#Ï÷#È÷#Á÷#º÷#³÷#¬÷#¥÷#ž÷#—÷#÷#‰÷#‚÷#{÷#t÷#m÷#f÷#_÷#X÷#Q÷#J÷#C÷#<÷#5÷#.÷#'÷# ÷#÷#÷# ÷#÷#ýö#öö#ïö#èö#áö#Úö#Óö#Ìö#Åö#¾ö#·ö#°ö#©ö#¢ö#›ö#”ö#ö#†ö#ö#xö#qö#jö#cö#\ö#Uö#Nö#Gö#@ö#9ö#2ö#+ö#$ö#ö#ö#ö#ö#ö#úõ#óõ#ìõ#åõ#Þõ#×õ#Ðõ#Éõ#Âõ#»õ#´õ#­õ#¦õ#Ÿõ#˜õ#‘õ#Šõ#ƒõ#|õ#uõ#nõ#gõ#`õ#Yõ#Rõ#Kõ#Dõ#=õ#6õ#/õ#(õ#!õ#õ#õ# õ#õ#þô#÷ô#ðô#éô#âô#Ûô#Ôô#Íô#Æô#¿ô#¸ô#±ô#ªô#£ô#œô#•ô#Žô#‡ô#€ô#yô#rô#kô#dô#]ô#Vô#Oô#Hô#Aô#:ô#3ô#,ô#%ô#ô#ô#ô# ô#ô#ûó#ôó#íó#æó#ßó#Øó#Ñó#Êó#Ãó#¼ó#µó#®ó#§ó# ó#™ó#’ó#‹ó#„ó#}ó#vó#oó#hó#aó#Zó#Só#Ló#Eó#>ó#7ó#0ó#)ó#"ó#ó#ó# ó#ó#ÿò#øò#ñò#êò#ãò#Üò#Õò#Îò#Çò#Àò#¹ò#²ò#«ò#¤ò#ò#–ò#ò#ˆò#ò#zò#sò#lò#eò#^ò#Wò#Pò#Iò#Bò#;ò#4ò#-ò#&ò#ò#ò#ò# ò#ò#üñ#õñ#îñ#çñ#àñ#Ùñ#Òñ#Ëñ#Äñ#½ñ#¶ñ#¯ñ#¨ñ#¡ñ#šñ#“ñ#Œñ#…ñ#~ñ#wñ#pñ#iñ#bñ#[ñ#Tñ#Mñ#Fñ#?ñ#8ñ#1ñ#*ñ##ñ#ñ#ñ#ñ#ñ#ñ#ùð#òð#ëð#äð#Ýð#Öð#Ïð#Èð#Áð#ºð#³ð#¬ð#¥ð#žð#—ð#ð#‰ð#‚ð#{ð#tð#mð#fð#_ð#Xð#Qð#Jð#Cð#<ð#5ð#.ð#'ð# ð#ð#ð# ð#ð#ýï#öï#ïï#èï#áï#Úï#Óï#Ìï#Åï#¾ï#·ï#°ï#©ï#¢ï#›ï#”ï#ï#†ï#ï#xï#qï#jï#cï#\ï#Uï#Nï#Gï#@ï#9ï#2ï#+ï#$ï#ï#ï#ï#ï#ï#úî#óî#ìî#åî#Þî#×î#Ðî#Éî#Âî#»î#´î#­î#¦î#Ÿî#˜î#‘î#Šî#ƒî#|î#uî#nî#gî#`î#Yî#Rî#Kî#Dî#=î#6î#/î#(î#!î#î#î# î#î#þí#÷í#ðí#éí#âí#Ûí#Ôí#Íí#Æí#¿í#¸í#±í#ªí#£í#œí#•í#Ží#‡í#€í#yí#rí#kí#dí#]í#Ví#Oí#Hí#Aí#:í#3í#,í#%í#í#í#í# í#í#ûì#ôì#íì#æì#ßì#Øì#Ñì#Êì#Ãì#¼ì#µì#®ì#§ì# ì#™ì#’ì#‹ì#„ì#}ì#vì#oì#hì#aì#Zì#Sì#Lì#Eì#>ì#7ì#0ì#)ì#"ì#ì#ì# ì#ì#ÿë#øë#ñë#êë#ãë#Üë#Õë#Îë#Çë#Àë#¹ë#²ë#«ë#¤ë#ë#–ë#ë#ˆë#ë#zë#së#lë#eë#^ë#Wë#Pë#Ië#Bë#;ë#4ë#-ë#&ë#ë#ë#ë# ë#ë#üê#õê#îê#çê#àê#Ùê#Òê#Ëê#Äê#½ê#¶ê#¯ê#¨ê#¡ê#šê#“ê#Œê#…ê#~ê#wê#pê#iê#bê#[ê#Tê#Mê#Fê#?ê#8ê#1ê#*ê##ê#ê#ê#ê#ê#ê#ùé#òé#ëé#äé#Ýé#Öé#Ïé#Èé#Áé#ºé#³é#¬é#¥é#žé#—é#é#‰é#‚é#{é#té#mé#fé#_é#Xé#Qé#Jé#Cé#<é#5é#.é#'é# é#é#é# é#é#ýè#öè#ïè#èè#áè#Úè#Óè#Ìè#Åè#¾è#·è#°è#©è#¢è#›è#”è#è#†è#è#xè#qè#jè#cè#\è#Uè#Nè#Gè#@è#9è#2è#+è#$è#è#è#è#è#è#úç#óç#ìç#åç#Þç#×ç#Ðç#Éç#Âç#»ç#´ç#­ç#¦ç#Ÿç#˜ç#‘ç#Šç#ƒç#|ç#uç#nç#gç#`ç#Yç#Rç#Kç#Dç#=ç#6ç#/ç#(ç#!ç#ç#ç# ç#ç#þæ#÷æ#ðæ#éæ#âæ#Ûæ#Ôæ#Íæ#Ææ#¿æ#¸æ#±æ#ªæ#£æ#œæ#•æ#Žæ#‡æ#€æ#yæ#ræ#kæ#dæ#]æ#Væ#Oæ#Hæ#Aæ#:æ#3æ#,æ#%æ#æ#æ#æ# æ#æ#ûå#ôå#íå#æå#ßå#Øå#Ñå#Êå#Ãå#¼å#µå#®å#§å# å#™å#’å#‹å#„å#}å#vå#oå#hå#aå#Zå#Så#Lå#Eå#>å#7å#0å#)å#"å#å#å# å#å#ÿä#øä#ñä#êä#ãä#Üä#Õä#Îä#Çä#Àä#¹ä#²ä#«ä#¤ä#ä#–ä#ä#ˆä#ä#zä#sä#lä#eä#^ä#Wä#Pä#Iä#Bä#;ä#4ä#-ä#&ä#ä#ä#ä# ä#ä#üã#õã#îã#çã#àã#Ùã#Òã#Ëã#Äã#½ã#¶ã#¯ã#¨ã#¡ã#šã#“ã#Œã#…ã#~ã#wã#pã#iã#bã#[ã#Tã#Mã#Fã#?ã#8ã#1ã#*ã##ã#ã#ã#ã#ã#ã#ùâ#òâ#ëâ#äâ#Ýâ#Öâ#Ïâ#Èâ#Áâ#ºâ#³â#¬â#¥â#žâ#—â#â#‰â#‚â#{â#tâ#mâ#fâ#_â#Xâ#Qâ#Jâ#Câ#<â#5â#.â#'â# â#â#â# â#â#ýá#öá#ïá#èá#áá#Úá#Óá#Ìá#Åá#¾á#·á#°á#©á#¢á#›á#”á#á#†á#á#xá#qá#já#cá#\á#Uá#Ná#Gá#@á#9á#2á#+á#$á#á#á#á#á#á#úà#óà#ìà#åà#Þà#×à#Ðà#Éà#Âà#»à#´à#­à#¦à#Ÿà#˜à#‘à#Šà#ƒà#|à#uà#nà#gà#`à#Yà#Rà#Kà#Dà#=à#6à#/à#(à#!à#à#à# à#à#þß#÷ß#ðß#éß#âß#Ûß#Ôß#Íß#Æß#¿ß#¸ß#±ß#ªß#£ß#œß#•ß#Žß#‡ß#€ß#yß#rß#kß#dß#]ß#Vß#Oß#Hß#Aß#:ß#3ß#,ß#%ß#ß#ß#ß# ß#ß#ûÞ#ôÞ#íÞ#æÞ#ßÞ#ØÞ#ÑÞ#ÊÞ#ÃÞ#¼Þ#µÞ#®Þ#§Þ# Þ#™Þ#’Þ#‹Þ#„Þ#}Þ#vÞ#oÞ#hÞ#aÞ#ZÞ#SÞ#LÞ#EÞ#>Þ#7Þ#0Þ#)Þ#"Þ#Þ#Þ# Þ#Þ#ÿÝ#øÝ#ñÝ#êÝ#ãÝ#ÜÝ#ÕÝ#ÎÝ#ÇÝ#ÀÝ#¹Ý#²Ý#«Ý#¤Ý#Ý#–Ý#Ý#ˆÝ#Ý#zÝ#sÝ#lÝ#eÝ#^Ý#WÝ#PÝ#IÝ#BÝ#;Ý#4Ý#-Ý#&Ý#Ý#Ý#Ý# Ý#Ý#üÜ#õÜ#îÜ#çÜ#àÜ#ÙÜ#ÒÜ#ËÜ#ÄÜ#½Ü#¶Ü#¯Ü#¨Ü#¡Ü#šÜ#“Ü#ŒÜ#…Ü#~Ü#wÜ#pÜ#iÜ#bÜ#[Ü#TÜ#MÜ#FÜ#?Ü#8Ü#1Ü#*Ü##Ü#Ü#Ü#Ü#Ü#Ü#ùÛ#òÛ#ëÛ#äÛ#ÝÛ#ÖÛ#ÏÛ#ÈÛ#ÁÛ#ºÛ#³Û#¬Û#¥Û#žÛ#—Û#Û#‰Û#‚Û#{Û#tÛ#mÛ#fÛ#_Û#XÛ#QÛ#JÛ#CÛ#<Û#5Û#.Û#'Û# Û#Û#Û# Û#Û#ýÚ#öÚ#ïÚ#èÚ#áÚ#ÚÚ#ÓÚ#ÌÚ#ÅÚ#¾Ú#·Ú#°Ú#©Ú#¢Ú#›Ú#”Ú#Ú#†Ú#Ú#xÚ#qÚ#jÚ#cÚ#\Ú#UÚ#NÚ#GÚ#@Ú#9Ú#2Ú#+Ú#$Ú#Ú#Ú#Ú#Ú#Ú#úÙ#óÙ#ìÙ#åÙ#ÞÙ#×Ù#ÐÙ#ÉÙ#ÂÙ#»Ù#´Ù#­Ù#¦Ù#ŸÙ#˜Ù#‘Ù#ŠÙ#ƒÙ#|Ù#uÙ#nÙ#gÙ#`Ù#YÙ#RÙ#KÙ#DÙ#=Ù#6Ù#/Ù#(Ù#!Ù#Ù#Ù# Ù#Ù#þØ#÷Ø#ðØ#éØ#âØ#ÛØ#ÔØ#ÍØ#ÆØ#¿Ø#¸Ø#±Ø#ªØ#£Ø#œØ#•Ø#ŽØ#‡Ø#€Ø#yØ#rØ#kØ#dØ#]Ø#VØ#OØ#HØ#AØ#:Ø#3Ø#,Ø#%Ø#Ø#Ø#Ø# Ø#Ø#û×#ô×#í×#æ×#ß×#Ø×#Ñ×#Ê×#Ã×#¼×#µ×#®×#§×# ×#™×#’×#‹×#„×#}×#v×#o×#h×#a×#Z×#S×#L×#E×#>×#7×#0×#)×#"×#×#×# ×#×#ÿÖ#øÖ#ñÖ#êÖ#ãÖ#ÜÖ#ÕÖ#ÎÖ#ÇÖ#ÀÖ#¹Ö#²Ö#«Ö#¤Ö#Ö#–Ö#Ö#ˆÖ#Ö#zÖ#sÖ#lÖ#eÖ#^Ö#WÖ#PÖ#IÖ#BÖ#;Ö#4Ö#-Ö#&Ö#Ö#Ö#Ö# Ö#Ö#üÕ#õÕ#îÕ#çÕ#àÕ#ÙÕ#ÒÕ#ËÕ#ÄÕ#½Õ#¶Õ#¯Õ#¨Õ#¡Õ#šÕ#“Õ#ŒÕ#…Õ#~Õ#wÕ#pÕ#iÕ#bÕ#[Õ#TÕ#MÕ#FÕ#?Õ#8Õ#1Õ#*Õ##Õ#Õ#Õ#Õ#Õ#Õ#ùÔ#òÔ#ëÔ#äÔ#ÝÔ#ÖÔ#ÏÔ#ÈÔ#ÁÔ#ºÔ#³Ô#¬Ô#¥Ô#žÔ#—Ô#Ô#‰Ô#‚Ô#{Ô#tÔ#mÔ#fÔ#_Ô#XÔ#QÔ#JÔ#CÔ#<Ô#5Ô#.Ô#'Ô# Ô#Ô#Ô# Ô#Ô#ýÓ#öÓ#ïÓ#èÓ#áÓ#ÚÓ#ÓÓ#ÌÓ#ÅÓ#¾Ó#·Ó#°Ó#©Ó#¢Ó#›Ó#”Ó#Ó#†Ó#Ó#xÓ#qÓ#jÓ#cÓ#\Ó#UÓ#NÓ#GÓ#@Ó#9Ó#2Ó#+Ó#$Ó#Ó#Ó#Ó#Ó#Ó#úÒ#óÒ#ìÒ#åÒ#ÞÒ#×Ò#ÐÒ#ÉÒ#ÂÒ#»Ò#´Ò#­Ò#¦Ò#ŸÒ#˜Ò#‘Ò#ŠÒ#ƒÒ#|Ò#uÒ#nÒ#gÒ#`Ò#YÒ#RÒ#KÒ#DÒ#=Ò#6Ò#/Ò#(Ò#!Ò#Ò#Ò# Ò#Ò#þÑ#÷Ñ#ðÑ#éÑ#âÑ#ÛÑ#ÔÑ#ÍÑ#ÆÑ#¿Ñ#¸Ñ#±Ñ#ªÑ#£Ñ#œÑ#•Ñ#ŽÑ#‡Ñ#€Ñ#yÑ#rÑ#kÑ#dÑ#]Ñ#VÑ#OÑ#HÑ#AÑ#:Ñ#3Ñ#,Ñ#%Ñ#Ñ#Ñ#Ñ# Ñ#Ñ#ûÐ#ôÐ#íÐ#æÐ#ßÐ#ØÐ#ÑÐ#ÊÐ#ÃÐ#¼Ð#µÐ#®Ð#§Ð# Ð#™Ð#’Ð#‹Ð#„Ð#}Ð#vÐ#oÐ#hÐ#aÐ#ZÐ#SÐ#LÐ#EÐ#>Ð#7Ð#0Ð#)Ð#"Ð#Ð#Ð# Ð#Ð#ÿÏ#øÏ#ñÏ#êÏ#ãÏ#ÜÏ#ÕÏ#ÎÏ#ÇÏ#ÀÏ#¹Ï#²Ï#«Ï#¤Ï#Ï#–Ï#Ï#ˆÏ#Ï#zÏ#sÏ#lÏ#eÏ#^Ï#WÏ#PÏ#IÏ#BÏ#;Ï#4Ï#-Ï#&Ï#Ï#Ï#Ï# Ï#Ï#üÎ#õÎ#îÎ#çÎ#àÎ#ÙÎ#ÒÎ#ËÎ#ÄÎ#½Î#¶Î#¯Î#¨Î#¡Î#šÎ#“Î#ŒÎ#…Î#~Î#wÎ#pÎ#iÎ#bÎ#[Î#TÎ#MÎ#FÎ#?Î#8Î#1Î#*Î##Î#Î#Î#Î#Î#Î#ùÍ#òÍ#ëÍ#äÍ#ÝÍ#ÖÍ#ÏÍ#ÈÍ#ÁÍ#ºÍ#³Í#¬Í#¥Í#žÍ#—Í#Í#‰Í#‚Í#{Í#tÍ#mÍ#fÍ#_Í#XÍ#QÍ#JÍ#CÍ#<Í#5Í#.Í#'Í# Í#Í#Í# Í#Í#ýÌ#öÌ#ïÌ#èÌ#áÌ#ÚÌ#ÓÌ#ÌÌ#ÅÌ#¾Ì#·Ì#°Ì#©Ì#¢Ì#›Ì#”Ì#Ì#†Ì#Ì#xÌ#qÌ#jÌ#cÌ#\Ì#UÌ#NÌ#GÌ#@Ì#9Ì#2Ì#+Ì#$Ì#Ì#Ì#Ì#Ì#Ì#úË#óË#ìË#åË#ÞË#×Ë#ÐË#ÉË#ÂË#»Ë#´Ë#­Ë#¦Ë#ŸË#˜Ë#‘Ë#ŠË#ƒË#|Ë#uË#nË#gË#`Ë#YË#RË#KË#DË#=Ë#6Ë#/Ë#(Ë#!Ë#Ë#Ë# Ë#Ë#þÊ#÷Ê#ðÊ#éÊ#âÊ#ÛÊ#ÔÊ#ÍÊ#ÆÊ#¿Ê#¸Ê#±Ê#ªÊ#£Ê#œÊ#•Ê#ŽÊ#‡Ê#€Ê#yÊ#rÊ#kÊ#dÊ#]Ê#VÊ#OÊ#HÊ#AÊ#:Ê#3Ê#,Ê#%Ê#Ê#Ê#Ê# Ê#Ê#ûÉ#ôÉ#íÉ#æÉ#ßÉ#ØÉ#ÑÉ#ÊÉ#ÃÉ#¼É#µÉ#®É#§É# É#™É#’É#‹É#„É#}É#vÉ#oÉ#hÉ#aÉ#ZÉ#SÉ#LÉ#EÉ#>É#7É#0É#)É#"É#É#É# É#É#ÿÈ#øÈ#ñÈ#êÈ#ãÈ#ÜÈ#ÕÈ#ÎÈ#ÇÈ#ÀÈ#¹È#²È#«È#¤È#È#–È#È#ˆÈ#È#zÈ#sÈ#lÈ#eÈ#^È#WÈ#PÈ#IÈ#BÈ#;È#4È#-È#&È#È#È#È# È#È#üÇ#õÇ#îÇ#çÇ#àÇ#ÙÇ#ÒÇ#ËÇ#ÄÇ#½Ç#¶Ç#¯Ç#¨Ç#¡Ç#šÇ#“Ç#ŒÇ#…Ç#~Ç#wÇ#pÇ#iÇ#bÇ#[Ç#TÇ#MÇ#FÇ#?Ç#8Ç#1Ç#*Ç##Ç#Ç#Ç#Ç#Ç#Ç#ùÆ#òÆ#ëÆ#äÆ#ÝÆ#ÖÆ#ÏÆ#ÈÆ#ÁÆ#ºÆ#³Æ#¬Æ#¥Æ#žÆ#—Æ#Æ#‰Æ#‚Æ#{Æ#tÆ#mÆ#fÆ#_Æ#XÆ#QÆ#JÆ#CÆ#<Æ#5Æ#.Æ#'Æ# Æ#Æ#Æ# Æ#Æ#ýÅ#öÅ#ïÅ#èÅ#áÅ#ÚÅ#ÓÅ#ÌÅ#ÅÅ#¾Å#·Å#°Å#©Å#¢Å#›Å#”Å#Å#†Å#Å#xÅ#qÅ#jÅ#cÅ#\Å#UÅ#NÅ#GÅ#@Å#9Å#2Å#+Å#$Å#Å#Å#Å#Å#Å#úÄ#óÄ#ìÄ#åÄ#ÞÄ#×Ä#ÐÄ#ÉÄ#ÂÄ#»Ä#´Ä#­Ä#¦Ä#ŸÄ#˜Ä#‘Ä#ŠÄ#ƒÄ#|Ä#uÄ#nÄ#gÄ#`Ä#YÄ#RÄ#KÄ#DÄ#=Ä#6Ä#/Ä#(Ä#!Ä#Ä#Ä# Ä#Ä#þÃ#÷Ã#ðÃ#éÃ#âÃ#ÛÃ#ÔÃ#ÍÃ#ÆÃ#¿Ã#¸Ã#±Ã#ªÃ#£Ã#œÃ#•Ã#ŽÃ#‡Ã#€Ã#yÃ#rÃ#kÃ#dÃ#]Ã#VÃ#OÃ#HÃ#AÃ#:Ã#3Ã#,Ã#%Ã#Ã#Ã#Ã# Ã#Ã#ûÂ#ôÂ#íÂ#æÂ#ßÂ#ØÂ#ÑÂ#ÊÂ#ÃÂ#¼Â#µÂ#®Â#§Â# Â#™Â#’Â#‹Â#„Â#}Â#vÂ#oÂ#hÂ#aÂ#ZÂ#SÂ#LÂ#EÂ#>Â#7Â#0Â#)Â#"Â#Â#Â# Â#Â#ÿÁ#øÁ#ñÁ#êÁ#ãÁ#ÜÁ#ÕÁ#ÎÁ#ÇÁ#ÀÁ#¹Á#²Á#«Á#¤Á#Á#–Á#Á#ˆÁ#Á#zÁ#sÁ#lÁ#eÁ#^Á#WÁ#PÁ#IÁ#BÁ#;Á#4Á#-Á#&Á#Á#Á#Á# Á#Á#üÀ#õÀ#îÀ#çÀ#àÀ#ÙÀ#ÒÀ#ËÀ#ÄÀ#½À#¶À#¯À#¨À#¡À#šÀ#“À#ŒÀ#…À#~À#wÀ#pÀ#iÀ#bÀ#[À#TÀ#MÀ#FÀ#?À#8À#1À#*À##À#À#À#À#À#À#ù¿#ò¿#ë¿#ä¿#Ý¿#Ö¿#Ï¿#È¿#Á¿#º¿#³¿#¬¿#¥¿#ž¿#—¿#¿#‰¿#‚¿#{¿#t¿#m¿#f¿#_¿#X¿#Q¿#J¿#C¿#<¿#5¿#.¿#'¿# ¿#¿#¿# ¿#¿#ý¾#ö¾#ï¾#è¾#á¾#Ú¾#Ó¾#̾#ž#¾¾#·¾#°¾#©¾#¢¾#›¾#”¾#¾#†¾#¾#x¾#q¾#j¾#c¾#\¾#U¾#N¾#G¾#@¾#9¾#2¾#+¾#$¾#¾#¾#¾#¾#¾#ú½#ó½#ì½#å½#Þ½#×½#н#ɽ#½#»½#´½#­½#¦½#Ÿ½#˜½#‘½#н#ƒ½#|½#u½#n½#g½#`½#Y½#R½#K½#D½#=½#6½#/½#(½#!½#½#½# ½#½#þ¼#÷¼#ð¼#é¼#â¼#Û¼#Ô¼#ͼ#Ƽ#¿¼#¸¼#±¼#ª¼#£¼#œ¼#•¼#޼#‡¼#€¼#y¼#r¼#k¼#d¼#]¼#V¼#O¼#H¼#A¼#:¼#3¼#,¼#%¼#¼#¼#¼# ¼#¼#û»#ô»#í»#æ»#ß»#Ø»#Ñ»#Ê»#û#¼»#µ»#®»#§»# »#™»#’»#‹»#„»#}»#v»#o»#h»#a»#Z»#S»#L»#E»#>»#7»#0»#)»#"»#»#»# »#»#ÿº#øº#ñº#êº#ãº#ܺ#Õº#κ#Ǻ#Àº#¹º#²º#«º#¤º#º#–º#º#ˆº#º#zº#sº#lº#eº#^º#Wº#Pº#Iº#Bº#;º#4º#-º#&º#º#º#º# º#º#ü¹#õ¹#î¹#ç¹#à¹#Ù¹#Ò¹#˹#Ĺ#½¹#¶¹#¯¹#¨¹#¡¹#š¹#“¹#Œ¹#…¹#~¹#w¹#p¹#i¹#b¹#[¹#T¹#M¹#F¹#?¹#8¹#1¹#*¹##¹#¹#¹#¹#¹#¹#ù¸#ò¸#ë¸#ä¸#ݸ#Ö¸#ϸ#ȸ#Á¸#º¸#³¸#¬¸#¥¸#ž¸#—¸#¸#‰¸#‚¸#{¸#t¸#m¸#f¸#_¸#X¸#Q¸#J¸#C¸#<¸#5¸#.¸#'¸# ¸#¸#¸# ¸#¸#ý·#ö·#ï·#è·#á·#Ú·#Ó·#Ì·#Å·#¾·#··#°·#©·#¢·#›·#”·#·#†·#·#x·#q·#j·#c·#\·#U·#N·#G·#@·#9·#2·#+·#$·#·#·#·#·#·#ú¶#ó¶#ì¶#å¶#Þ¶#×¶#ж#ɶ#¶#»¶#´¶#­¶#¦¶#Ÿ¶#˜¶#‘¶#ж#ƒ¶#|¶#u¶#n¶#g¶#`¶#Y¶#R¶#K¶#D¶#=¶#6¶#/¶#(¶#!¶#¶#¶# ¶#¶#þµ#÷µ#ðµ#éµ#âµ#Ûµ#Ôµ#͵#Ƶ#¿µ#¸µ#±µ#ªµ#£µ#œµ#•µ#޵#‡µ#€µ#yµ#rµ#kµ#dµ#]µ#Vµ#Oµ#Hµ#Aµ#:µ#3µ#,µ#%µ#µ#µ#µ# µ#µ#û´#ô´#í´#æ´#ß´#Ø´#Ñ´#Ê´#ô#¼´#µ´#®´#§´# ´#™´#’´#‹´#„´#}´#v´#o´#h´#a´#Z´#S´#L´#E´#>´#7´#0´#)´#"´#´#´# ´#´#ÿ³#ø³#ñ³#ê³#ã³#ܳ#Õ³#γ#dz#À³#¹³#²³#«³#¤³#³#–³#³#ˆ³#³#z³#s³#l³#e³#^³#W³#P³#I³#B³#;³#4³#-³#&³#³#³#³# ³#³#ü²#õ²#î²#ç²#à²#Ù²#Ò²#˲#IJ#½²#¶²#¯²#¨²#¡²#š²#“²#Œ²#…²#~²#w²#p²#i²#b²#[²#T²#M²#F²#?²#8²#1²#*²##²#²#²#²#²#²#ù±#ò±#ë±#ä±#ݱ#Ö±#ϱ#ȱ#Á±#º±#³±#¬±#¥±#ž±#—±#±#‰±#‚±#{±#t±#m±#f±#_±#X±#Q±#J±#C±#<±#5±#.±#'±# ±#±#±# ±#±#ý°#ö°#ï°#è°#á°#Ú°#Ó°#̰#Ű#¾°#·°#°°#©°#¢°#›°#”°#°#†°#°#x°#q°#j°#c°#\°#U°#N°#G°#@°#9°#2°#+°#$°#°#°#°#°#°#ú¯#ó¯#ì¯#å¯#Þ¯#ׯ#Я#ɯ#¯#»¯#´¯#­¯#¦¯#Ÿ¯#˜¯#‘¯#Н#ƒ¯#|¯#u¯#n¯#g¯#`¯#Y¯#R¯#K¯#D¯#=¯#6¯#/¯#(¯#!¯#¯#¯# ¯#¯#þ®#÷®#ð®#é®#â®#Û®#Ô®#Í®#Æ®#¿®#¸®#±®#ª®#£®#œ®#•®#Ž®#‡®#€®#y®#r®#k®#d®#]®#V®#O®#H®#A®#:®#3®#,®#%®#®#®#®# ®#®#û­#ô­#í­#æ­#ß­#Ø­#Ñ­#Ê­#í#¼­#µ­#®­#§­# ­#™­#’­#‹­#„­#}­#v­#o­#h­#a­#Z­#S­#L­#E­#>­#7­#0­#)­#"­#­#­# ­#­#ÿ¬#ø¬#ñ¬#ê¬#ã¬#ܬ#Õ¬#ά#Ǭ#À¬#¹¬#²¬#«¬#¤¬#¬#–¬#¬#ˆ¬#¬#z¬#s¬#l¬#e¬#^¬#W¬#P¬#I¬#B¬#;¬#4¬#-¬#&¬#¬#¬#¬# ¬#¬#ü«#õ«#î«#ç«#à«#Ù«#Ò«#Ë«#Ä«#½«#¶«#¯«#¨«#¡«#š«#“«#Œ«#…«#~«#w«#p«#i«#b«#[«#T«#M«#F«#?«#8«#1«#*«##«#«#«#«#«#«#ùª#òª#ëª#äª#ݪ#Öª#Ϫ#Ȫ#Áª#ºª#³ª#¬ª#¥ª#žª#—ª#ª#‰ª#‚ª#{ª#tª#mª#fª#_ª#Xª#Qª#Jª#Cª#<ª#5ª#.ª#'ª# ª#ª#ª# ª#ª#ý©#ö©#ï©#è©#á©#Ú©#Ó©#Ì©#Å©#¾©#·©#°©#©©#¢©#›©#”©#©#†©#©#x©#q©#j©#c©#\©#U©#N©#G©#@©#9©#2©#+©#$©#©#©#©#©#©#ú¨#ó¨#ì¨#å¨#Þ¨#ר#Ш#ɨ#¨#»¨#´¨#­¨#¦¨#Ÿ¨#˜¨#‘¨#Ѝ#ƒ¨#|¨#u¨#n¨#g¨#`¨#Y¨#R¨#K¨#D¨#=¨#6¨#/¨#(¨#!¨#¨#¨# ¨#¨#þ§#÷§#ð§#é§#â§#Û§#Ô§#ͧ#Ƨ#¿§#¸§#±§#ª§#£§#œ§#•§#ާ#‡§#€§#y§#r§#k§#d§#]§#V§#O§#H§#A§#:§#3§#,§#%§#§#§#§# §#§#û¦#ô¦#í¦#æ¦#ߦ#ئ#Ѧ#ʦ#æ#¼¦#µ¦#®¦#§¦# ¦#™¦#’¦#‹¦#„¦#}¦#v¦#o¦#h¦#a¦#Z¦#S¦#L¦#E¦#>¦#7¦#0¦#)¦#"¦#¦#¦# ¦#¦#ÿ¥#ø¥#ñ¥#ê¥#ã¥#Ü¥#Õ¥#Î¥#Ç¥#À¥#¹¥#²¥#«¥#¤¥#¥#–¥#¥#ˆ¥#¥#z¥#s¥#l¥#e¥#^¥#W¥#P¥#I¥#B¥#;¥#4¥#-¥#&¥#¥#¥#¥# ¥#¥#ü¤#õ¤#î¤#ç¤#à¤#Ù¤#Ò¤#ˤ#Ĥ#½¤#¶¤#¯¤#¨¤#¡¤#š¤#“¤#Œ¤#…¤#~¤#w¤#p¤#i¤#b¤#[¤#T¤#M¤#F¤#?¤#8¤#1¤#*¤##¤#¤#¤#¤#¤#¤#ù£#ò£#ë£#ä£#Ý£#Ö£#Ï£#È£#Á£#º£#³£#¬£#¥£#ž£#—£#£#‰£#‚£#{£#t£#m£#f£#_£#X£#Q£#J£#C£#<£#5£#.£#'£# £#£#£# £#£#ý¢#ö¢#ï¢#è¢#á¢#Ú¢#Ó¢#Ì¢#Å¢#¾¢#·¢#°¢#©¢#¢¢#›¢#”¢#¢#†¢#¢#x¢#q¢#j¢#c¢#\¢#U¢#N¢#G¢#@¢#9¢#2¢#+¢#$¢#¢#¢#¢#¢#¢#ú¡#ó¡#ì¡#å¡#Þ¡#ס#С#É¡#¡#»¡#´¡#­¡#¦¡#Ÿ¡#˜¡#‘¡#Š¡#ƒ¡#|¡#u¡#n¡#g¡#`¡#Y¡#R¡#K¡#D¡#=¡#6¡#/¡#(¡#!¡#¡#¡# ¡#¡#þ #÷ #ð #é #â #Û #Ô #Í #Æ #¿ #¸ #± #ª #£ #œ #• #Ž #‡ #€ #y #r #k #d #] #V #O #H #A #: #3 #, #% # # # #  # #ûŸ#ôŸ#íŸ#æŸ#ߟ#ØŸ#ÑŸ#ÊŸ#ß#¼Ÿ#µŸ#®Ÿ#§Ÿ# Ÿ#™Ÿ#’Ÿ#‹Ÿ#„Ÿ#}Ÿ#vŸ#oŸ#hŸ#aŸ#ZŸ#SŸ#LŸ#EŸ#>Ÿ#7Ÿ#0Ÿ#)Ÿ#"Ÿ#Ÿ#Ÿ# Ÿ#Ÿ#ÿž#øž#ñž#êž#ãž#Üž#Õž#Ξ#Çž#Àž#¹ž#²ž#«ž#¤ž#ž#–ž#ž#ˆž#ž#zž#sž#lž#ež#^ž#Wž#Pž#Iž#Bž#;ž#4ž#-ž#&ž#ž#ž#ž# ž#ž#ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ùœ#òœ#ëœ#äœ#Ýœ#Öœ#Ïœ#Èœ#Áœ#ºœ#³œ#¬œ#¥œ#žœ#—œ#œ#‰œ#‚œ#{œ#tœ#mœ#fœ#_œ#Xœ#Qœ#Jœ#Cœ#<œ#5œ#.œ#'œ# œ#œ#œ# œ#œ#ý›#ö›#ï›#è›#á›#Ú›#Ó›#Ì›#Å›#¾›#·›#°›#©›#¢›#››#”›#›#†›#›#x›#q›#j›#c›#\›#U›#N›#G›#@›#9›#2›#+›#$›#›#›#›#›#›#úš#óš#ìš#åš#Þš#ך#К#Éš#š#»š#´š#­š#¦š#Ÿš#˜š#‘š#Šš#ƒš#|š#uš#nš#gš#`š#Yš#Rš#Kš#Dš#=š#6š#/š#(š#!š#š#š# š#š#þ™#÷™#ð™#é™#â™#Û™#Ô™#Í™#Æ™#¿™#¸™#±™#ª™#£™#œ™#•™#Ž™#‡™#€™#y™#r™#k™#d™#]™#V™#O™#H™#A™#:™#3™#,™#%™#™#™#™# ™#™#û˜#ô˜#í˜#æ˜#ߘ#ؘ#ј#ʘ#Ø#¼˜#µ˜#®˜#§˜# ˜#™˜#’˜#‹˜#„˜#}˜#v˜#o˜#h˜#a˜#Z˜#S˜#L˜#E˜#>˜#7˜#0˜#)˜#"˜#˜#˜# ˜#˜#ÿ—#ø—#ñ—#ê—#ã—#Ü—#Õ—#Η#Ç—#À—#¹—#²—#«—#¤—#—#–—#—#ˆ—#—#z—#s—#l—#e—#^—#W—#P—#I—#B—#;—#4—#-—#&—#—#—#—# —#—#ü–#õ–#î–#ç–#à–#Ù–#Ò–#Ë–#Ä–#½–#¶–#¯–#¨–#¡–#š–#“–#Œ–#…–#~–#w–#p–#i–#b–#[–#T–#M–#F–#?–#8–#1–#*–##–#–#–#–#–#–#ù•#ò•#ë•#ä•#Ý•#Ö•#Ï•#È•#Á•#º•#³•#¬•#¥•#ž•#—•#•#‰•#‚•#{•#t•#m•#f•#_•#X•#Q•#J•#C•#<•#5•#.•#'•# •#•#•# •#•#ý”#ö”#ï”#è”#á”#Ú”#Ó”#Ì”#Å”#¾”#·”#°”#©”#¢”#›”#””#”#†”#”#x”#q”#j”#c”#\”#U”#N”#G”#@”#9”#2”#+”#$”#”#”#”#”#”#ú“#ó“#ì“#å“#Þ“#ד#Г#É“#“#»“#´“#­“#¦“#Ÿ“#˜“#‘“#Š“#ƒ“#|“#u“#n“#g“#`“#Y“#R“#K“#D“#=“#6“#/“#(“#!“#“#“# “#“#þ’#÷’#ð’#é’#â’#Û’#Ô’#Í’#Æ’#¿’#¸’#±’#ª’#£’#œ’#•’#Ž’#‡’#€’#y’#r’#k’#d’#]’#V’#O’#H’#A’#:’#3’#,’#%’#’#’#’# ’#’#û‘#ô‘#í‘#æ‘#ß‘#Ø‘#Ñ‘#Ê‘#Ñ#¼‘#µ‘#®‘#§‘# ‘#™‘#’‘#‹‘#„‘#}‘#v‘#o‘#h‘#a‘#Z‘#S‘#L‘#E‘#>‘#7‘#0‘#)‘#"‘#‘#‘# ‘#‘#ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ùŽ#òŽ#ëŽ#äŽ#ÝŽ#ÖŽ#ÏŽ#ÈŽ#ÁŽ#ºŽ#³Ž#¬Ž#¥Ž#žŽ#—Ž#Ž#‰Ž#‚Ž#{Ž#tŽ#mŽ#fŽ#_Ž#XŽ#QŽ#JŽ#CŽ#<Ž#5Ž#.Ž#'Ž# Ž#Ž#Ž# Ž#Ž#ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######úŒ#óŒ#ìŒ#åŒ#ÞŒ#׌#ÐŒ#ÉŒ#ÂŒ#»Œ#´Œ#­Œ#¦Œ#ŸŒ#˜Œ#‘Œ#ŠŒ#ƒŒ#|Œ#uŒ#nŒ#gŒ#`Œ#YŒ#RŒ#KŒ#DŒ#=Œ#6Œ#/Œ#(Œ#!Œ#Œ#Œ# Œ#Œ#þ‹#÷‹#ð‹#é‹#â‹#Û‹#Ô‹#Í‹#Æ‹#¿‹#¸‹#±‹#ª‹#£‹#œ‹#•‹#Ž‹#‡‹#€‹#y‹#r‹#k‹#d‹#]‹#V‹#O‹#H‹#A‹#:‹#3‹#,‹#%‹#‹#‹#‹# ‹#‹#ûŠ#ôŠ#íŠ#æŠ#ߊ#ØŠ#ÑŠ#ÊŠ#Ê#¼Š#µŠ#®Š#§Š# Š#™Š#’Š#‹Š#„Š#}Š#vŠ#oŠ#hŠ#aŠ#ZŠ#SŠ#LŠ#EŠ#>Š#7Š#0Š#)Š#"Š#Š#Š# Š#Š#ÿ‰#ø‰#ñ‰#ê‰#ã‰#܉#Õ‰#Ή#lj#À‰#¹‰#²‰#«‰#¤‰#‰#–‰#‰#ˆ‰#‰#z‰#s‰#l‰#e‰#^‰#W‰#P‰#I‰#B‰#;‰#4‰#-‰#&‰#‰#‰#‰# ‰#‰#üˆ#õˆ#îˆ#çˆ#àˆ#Ùˆ#Òˆ#ˈ#Ĉ#½ˆ#¶ˆ#¯ˆ#¨ˆ#¡ˆ#šˆ#“ˆ#Œˆ#…ˆ#~ˆ#wˆ#pˆ#iˆ#bˆ#[ˆ#Tˆ#Mˆ#Fˆ#?ˆ#8ˆ#1ˆ#*ˆ##ˆ#ˆ#ˆ#ˆ#ˆ#ˆ#ù‡#ò‡#ë‡#ä‡#݇#Ö‡#χ#ȇ#Á‡#º‡#³‡#¬‡#¥‡#ž‡#—‡#‡#‰‡#‚‡#{‡#t‡#m‡#f‡#_‡#X‡#Q‡#J‡#C‡#<‡#5‡#.‡#'‡# ‡#‡#‡# ‡#‡#ý†#ö†#ï†#è†#á†#Ú†#Ó†#̆#ņ#¾†#·†#°†#©†#¢†#›†#”†#†#††#†#x†#q†#j†#c†#\†#U†#N†#G†#@†#9†#2†#+†#$†#†#†#†#†#†#ú…#ó…#ì…#å…#Þ…#×…#Ð…#É…#Â…#»…#´…#­…#¦…#Ÿ…#˜…#‘…#Š…#ƒ…#|…#u…#n…#g…#`…#Y…#R…#K…#D…#=…#6…#/…#(…#!…#…#…# …#…#þ„#÷„#ð„#é„#â„#Û„#Ô„#Í„#Æ„#¿„#¸„#±„#ª„#£„#œ„#•„#Ž„#‡„#€„#y„#r„#k„#d„#]„#V„#O„#H„#A„#:„#3„#,„#%„#„#„#„# „#„#ûƒ#ôƒ#íƒ#æƒ#߃#؃#у#ʃ#Ã#¼ƒ#µƒ#®ƒ#§ƒ# ƒ#™ƒ#’ƒ#‹ƒ#„ƒ#}ƒ#vƒ#oƒ#hƒ#aƒ#Zƒ#Sƒ#Lƒ#Eƒ#>ƒ#7ƒ#0ƒ#)ƒ#"ƒ#ƒ#ƒ# ƒ#ƒ#ÿ‚#ø‚#ñ‚#ê‚#ã‚#Ü‚#Õ‚#΂#Ç‚#À‚#¹‚#²‚#«‚#¤‚#‚#–‚#‚#ˆ‚#‚#z‚#s‚#l‚#e‚#^‚#W‚#P‚#I‚#B‚#;‚#4‚#-‚#&‚#‚#‚#‚# ‚#‚#ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù€#ò€#ë€#ä€#Ý€#Ö€#Ï€#È€#Á€#º€#³€#¬€#¥€#ž€#—€#€#‰€#‚€#{€#t€#m€#f€#_€#X€#Q€#J€#C€#<€#5€#.€#'€# €#€#€# €#€#ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú~#ó~#ì~#å~#Þ~#×~#Ð~#É~#Â~#»~#´~#­~#¦~#Ÿ~#˜~#‘~#Š~#ƒ~#|~#u~#n~#g~#`~#Y~#R~#K~#D~#=~#6~#/~#(~#!~#~#~# ~#~#þ}#÷}#ð}#é}#â}#Û}#Ô}#Í}#Æ}#¿}#¸}#±}#ª}#£}#œ}#•}#Ž}#‡}#€}#y}#r}#k}#d}#]}#V}#O}#H}#A}#:}#3}#,}#%}#}#}#}# }#}#û|#ô|#í|#æ|#ß|#Ø|#Ñ|#Ê|#Ã|#¼|#µ|#®|#§|# |#™|#’|#‹|#„|#}|#v|#o|#h|#a|#Z|#S|#L|#E|#>|#7|#0|#)|#"|#|#|# |#|#ÿ{#ø{#ñ{#ê{#ã{#Ü{#Õ{#Î{#Ç{#À{#¹{#²{#«{#¤{#{#–{#{#ˆ{#{#z{#s{#l{#e{#^{#W{#P{#I{#B{#;{#4{#-{#&{#{#{#{# {#{#üz#õz#îz#çz#àz#Ùz#Òz#Ëz#Äz#½z#¶z#¯z#¨z#¡z#šz#“z#Œz#…z#~z#wz#pz#iz#bz#[z#Tz#Mz#Fz#?z#8z#1z#*z##z#z#z#z#z#z#ùy#òy#ëy#äy#Ýy#Öy#Ïy#Èy#Áy#ºy#³y#¬y#¥y#žy#—y#y#‰y#‚y#{y#ty#my#fy#_y#Xy#Qy#Jy#Cy#u#7u#0u#)u#"u#u#u# u#u#ÿt#øt#ñt#êt#ãt#Üt#Õt#Ît#Çt#Àt#¹t#²t#«t#¤t#t#–t#t#ˆt#t#zt#st#lt#et#^t#Wt#Pt#It#Bt#;t#4t#-t#&t#t#t#t# t#t#üs#õs#îs#çs#às#Ùs#Òs#Ës#Äs#½s#¶s#¯s#¨s#¡s#šs#“s#Œs#…s#~s#ws#ps#is#bs#[s#Ts#Ms#Fs#?s#8s#1s#*s##s#s#s#s#s#s#ùr#òr#ër#är#Ýr#Ör#Ïr#Èr#Ár#ºr#³r#¬r#¥r#žr#—r#r#‰r#‚r#{r#tr#mr#fr#_r#Xr#Qr#Jr#Cr#n#7n#0n#)n#"n#n#n# n#n#ÿm#øm#ñm#êm#ãm#Üm#Õm#Îm#Çm#Àm#¹m#²m#«m#¤m#m#–m#m#ˆm#m#zm#sm#lm#em#^m#Wm#Pm#Im#Bm#;m#4m#-m#&m#m#m#m# m#m#ül#õl#îl#çl#àl#Ùl#Òl#Ël#Äl#½l#¶l#¯l#¨l#¡l#šl#“l#Œl#…l#~l#wl#pl#il#bl#[l#Tl#Ml#Fl#?l#8l#1l#*l##l#l#l#l#l#l#ùk#òk#ëk#äk#Ýk#Ök#Ïk#Èk#Ák#ºk#³k#¬k#¥k#žk#—k#k#‰k#‚k#{k#tk#mk#fk#_k#Xk#Qk#Jk#Ck#g#7g#0g#)g#"g#g#g# g#g#ÿf#øf#ñf#êf#ãf#Üf#Õf#Îf#Çf#Àf#¹f#²f#«f#¤f#f#–f#f#ˆf#f#zf#sf#lf#ef#^f#Wf#Pf#If#Bf#;f#4f#-f#&f#f#f#f# f#f#üe#õe#îe#çe#àe#Ùe#Òe#Ëe#Äe#½e#¶e#¯e#¨e#¡e#še#“e#Œe#…e#~e#we#pe#ie#be#[e#Te#Me#Fe#?e#8e#1e#*e##e#e#e#e#e#e#ùd#òd#ëd#äd#Ýd#Öd#Ïd#Èd#Ád#ºd#³d#¬d#¥d#žd#—d#d#‰d#‚d#{d#td#md#fd#_d#Xd#Qd#Jd#Cd#`#7`#0`#)`#"`#`#`# `#`#ÿ_#ø_#ñ_#ê_#ã_#Ü_#Õ_#Î_#Ç_#À_#¹_#²_#«_#¤_#_#–_#_#ˆ_#_#z_#s_#l_#e_#^_#W_#P_#I_#B_#;_#4_#-_#&_#_#_#_# _#_#ü^#õ^#î^#ç^#à^#Ù^#Ò^#Ë^#Ä^#½^#¶^#¯^#¨^#¡^#š^#“^#Œ^#…^#~^#w^#p^#i^#b^#[^#T^#M^#F^#?^#8^#1^#*^##^#^#^#^#^#^#ù]#ò]#ë]#ä]#Ý]#Ö]#Ï]#È]#Á]#º]#³]#¬]#¥]#ž]#—]#]#‰]#‚]#{]#t]#m]#f]#_]#X]#Q]#J]#C]#<]#5]#.]#']# ]#]#]# ]#]#ý\#ö\#ï\#è\#á\#Ú\#Ó\#Ì\#Å\#¾\#·\#°\#©\#¢\#›\#”\#\#†\#\#x\#q\#j\#c\#\\#U\#N\#G\#@\#9\#2\#+\#$\#\#\#\#\#\#ú[#ó[#ì[#å[#Þ[#×[#Ð[#É[#Â[#»[#´[#­[#¦[#Ÿ[#˜[#‘[#Š[#ƒ[#|[#u[#n[#g[#`[#Y[#R[#K[#D[#=[#6[#/[#([#![#[#[# [#[#þZ#÷Z#ðZ#éZ#âZ#ÛZ#ÔZ#ÍZ#ÆZ#¿Z#¸Z#±Z#ªZ#£Z#œZ#•Z#ŽZ#‡Z#€Z#yZ#rZ#kZ#dZ#]Z#VZ#OZ#HZ#AZ#:Z#3Z#,Z#%Z#Z#Z#Z# Z#Z#ûY#ôY#íY#æY#ßY#ØY#ÑY#ÊY#ÃY#¼Y#µY#®Y#§Y# Y#™Y#’Y#‹Y#„Y#}Y#vY#oY#hY#aY#ZY#SY#LY#EY#>Y#7Y#0Y#)Y#"Y#Y#Y# Y#Y#ÿX#øX#ñX#êX#ãX#ÜX#ÕX#ÎX#ÇX#ÀX#¹X#²X#«X#¤X#X#–X#X#ˆX#X#zX#sX#lX#eX#^X#WX#PX#IX#BX#;X#4X#-X#&X#X#X#X# X#X#üW#õW#îW#çW#àW#ÙW#ÒW#ËW#ÄW#½W#¶W#¯W#¨W#¡W#šW#“W#ŒW#…W#~W#wW#pW#iW#bW#[W#TW#MW#FW#?W#8W#1W#*W##W#W#W#W#W#W#ùV#òV#ëV#äV#ÝV#ÖV#ÏV#ÈV#ÁV#ºV#³V#¬V#¥V#žV#—V#V#‰V#‚V#{V#tV#mV#fV#_V#XV#QV#JV#CV#R#7R#0R#)R#"R#R#R# R#R#ÿQ#øQ#ñQ#êQ#ãQ#ÜQ#ÕQ#ÎQ#ÇQ#ÀQ#¹Q#²Q#«Q#¤Q#Q#–Q#Q#ˆQ#Q#zQ#sQ#lQ#eQ#^Q#WQ#PQ#IQ#BQ#;Q#4Q#-Q#&Q#Q#Q#Q# Q#Q#üP#õP#îP#çP#àP#ÙP#ÒP#ËP#ÄP#½P#¶P#¯P#¨P#¡P#šP#“P#ŒP#…P#~P#wP#pP#iP#bP#[P#TP#MP#FP#?P#8P#1P#*P##P#P#P#P#P#P#ùO#òO#ëO#äO#ÝO#ÖO#ÏO#ÈO#ÁO#ºO#³O#¬O#¥O#žO#—O#O#‰O#‚O#{O#tO#mO#fO#_O#XO#QO#JO#CO#K#7K#0K#)K#"K#K#K# K#K#ÿJ#øJ#ñJ#êJ#ãJ#ÜJ#ÕJ#ÎJ#ÇJ#ÀJ#¹J#²J#«J#¤J#J#–J#J#ˆJ#J#zJ#sJ#lJ#eJ#^J#WJ#PJ#IJ#BJ#;J#4J#-J#&J#J#J#J# J#J#üI#õI#îI#çI#àI#ÙI#ÒI#ËI#ÄI#½I#¶I#¯I#¨I#¡I#šI#“I#ŒI#…I#~I#wI#pI#iI#bI#[I#TI#MI#FI#?I#8I#1I#*I##I#I#I#I#I#I#ùH#òH#ëH#äH#ÝH#ÖH#ÏH#ÈH#ÁH#ºH#³H#¬H#¥H#žH#—H#H#‰H#‚H#{H#tH#mH#fH#_H#XH#QH#JH#CH#D#7D#0D#)D#"D#D#D# D#D#ÿC#øC#ñC#êC#ãC#ÜC#ÕC#ÎC#ÇC#ÀC#¹C#²C#«C#¤C#C#–C#C#ˆC#C#zC#sC#lC#eC#^C#WC#PC#IC#BC#;C#4C#-C#&C#C#C#C# C#C#üB#õB#îB#çB#àB#ÙB#ÒB#ËB#ÄB#½B#¶B#¯B#¨B#¡B#šB#“B#ŒB#…B#~B#wB#pB#iB#bB#[B#TB#MB#FB#?B#8B#1B#*B##B#B#B#B#B#B#ùA#òA#ëA#äA#ÝA#ÖA#ÏA#ÈA#ÁA#ºA#³A#¬A#¥A#žA#—A#A#‰A#‚A#{A#tA#mA#fA#_A#XA#QA#JA#CA##÷>#ð>#é>#â>#Û>#Ô>#Í>#Æ>#¿>#¸>#±>#ª>#£>#œ>#•>#Ž>#‡>#€>#y>#r>#k>#d>#]>#V>#O>#H>#A>#:>#3>#,>#%>#>#>#># >#>#û=#ô=#í=#æ=#ß=#Ø=#Ñ=#Ê=#Ã=#¼=#µ=#®=#§=# =#™=#’=#‹=#„=#}=#v=#o=#h=#a=#Z=#S=#L=#E=#>=#7=#0=#)=#"=#=#=# =#=#ÿ<#ø<#ñ<#ê<#ã<#Ü<#Õ<#Î<#Ç<#À<#¹<#²<#«<#¤<#<#–<#<#ˆ<#<#z<#s<#l<#e<#^<#W<#P<#I<#B<#;<#4<#-<#&<#<#<#<# <#<#ü;#õ;#î;#ç;#à;#Ù;#Ò;#Ë;#Ä;#½;#¶;#¯;#¨;#¡;#š;#“;#Œ;#…;#~;#w;#p;#i;#b;#[;#T;#M;#F;#?;#8;#1;#*;##;#;#;#;#;#;#ù:#ò:#ë:#ä:#Ý:#Ö:#Ï:#È:#Á:#º:#³:#¬:#¥:#ž:#—:#:#‰:#‚:#{:#t:#m:#f:#_:#X:#Q:#J:#C:#<:#5:#.:#':# :#:#:# :#:#ý9#ö9#ï9#è9#á9#Ú9#Ó9#Ì9#Å9#¾9#·9#°9#©9#¢9#›9#”9#9#†9#9#x9#q9#j9#c9#\9#U9#N9#G9#@9#99#29#+9#$9#9#9#9#9#9#ú8#ó8#ì8#å8#Þ8#×8#Ð8#É8#Â8#»8#´8#­8#¦8#Ÿ8#˜8#‘8#Š8#ƒ8#|8#u8#n8#g8#`8#Y8#R8#K8#D8#=8#68#/8#(8#!8#8#8# 8#8#þ7#÷7#ð7#é7#â7#Û7#Ô7#Í7#Æ7#¿7#¸7#±7#ª7#£7#œ7#•7#Ž7#‡7#€7#y7#r7#k7#d7#]7#V7#O7#H7#A7#:7#37#,7#%7#7#7#7# 7#7#û6#ô6#í6#æ6#ß6#Ø6#Ñ6#Ê6#Ã6#¼6#µ6#®6#§6# 6#™6#’6#‹6#„6#}6#v6#o6#h6#a6#Z6#S6#L6#E6#>6#76#06#)6#"6#6#6# 6#6#ÿ5#ø5#ñ5#ê5#ã5#Ü5#Õ5#Î5#Ç5#À5#¹5#²5#«5#¤5#5#–5#5#ˆ5#5#z5#s5#l5#e5#^5#W5#P5#I5#B5#;5#45#-5#&5#5#5#5# 5#5#ü4#õ4#î4#ç4#à4#Ù4#Ò4#Ë4#Ä4#½4#¶4#¯4#¨4#¡4#š4#“4#Œ4#…4#~4#w4#p4#i4#b4#[4#T4#M4#F4#?4#84#14#*4##4#4#4#4#4#4#ù3#ò3#ë3#ä3#Ý3#Ö3#Ï3#È3#Á3#º3#³3#¬3#¥3#ž3#—3#3#‰3#‚3#{3#t3#m3#f3#_3#X3#Q3#J3#C3#<3#53#.3#'3# 3#3#3# 3#3#ý2#ö2#ï2#è2#á2#Ú2#Ó2#Ì2#Å2#¾2#·2#°2#©2#¢2#›2#”2#2#†2#2#x2#q2#j2#c2#\2#U2#N2#G2#@2#92#22#+2#$2#2#2#2#2#2#ú1#ó1#ì1#å1#Þ1#×1#Ð1#É1#Â1#»1#´1#­1#¦1#Ÿ1#˜1#‘1#Š1#ƒ1#|1#u1#n1#g1#`1#Y1#R1#K1#D1#=1#61#/1#(1#!1#1#1# 1#1#þ0#÷0#ð0#é0#â0#Û0#Ô0#Í0#Æ0#¿0#¸0#±0#ª0#£0#œ0#•0#Ž0#‡0#€0#y0#r0#k0#d0#]0#V0#O0#H0#A0#:0#30#,0#%0#0#0#0# 0#0#û/#ô/#í/#æ/#ß/#Ø/#Ñ/#Ê/#Ã/#¼/#µ/#®/#§/# /#™/#’/#‹/#„/#}/#v/#o/#h/#a/#Z/#S/#L/#E/#>/#7/#0/#)/#"/#/#/# /#/#ÿ.#ø.#ñ.#ê.#ã.#Ü.#Õ.#Î.#Ç.#À.#¹.#².#«.#¤.#.#–.#.#ˆ.#.#z.#s.#l.#e.#^.#W.#P.#I.#B.#;.#4.#-.#&.#.#.#.# .#.#ü-#õ-#î-#ç-#à-#Ù-#Ò-#Ë-#Ä-#½-#¶-#¯-#¨-#¡-#š-#“-#Œ-#…-#~-#w-#p-#i-#b-#[-#T-#M-#F-#?-#8-#1-#*-##-#-#-#-#-#-#ù,#ò,#ë,#ä,#Ý,#Ö,#Ï,#È,#Á,#º,#³,#¬,#¥,#ž,#—,#,#‰,#‚,#{,#t,#m,#f,#_,#X,#Q,#J,#C,#<,#5,#.,#',# ,#,#,# ,#,#ý+#ö+#ï+#è+#á+#Ú+#Ó+#Ì+#Å+#¾+#·+#°+#©+#¢+#›+#”+#+#†+#+#x+#q+#j+#c+#\+#U+#N+#G+#@+#9+#2+#++#$+#+#+#+#+#+#ú*#ó*#ì*#å*#Þ*#×*#Ð*#É*#Â*#»*#´*#­*#¦*#Ÿ*#˜*#‘*#Š*#ƒ*#|*#u*#n*#g*#`*#Y*#R*#K*#D*#=*#6*#/*#(*#!*#*#*# *#*#þ)#÷)#ð)#é)#â)#Û)#Ô)#Í)#Æ)#¿)#¸)#±)#ª)#£)#œ)#•)#Ž)#‡)#€)#y)#r)#k)#d)#])#V)#O)#H)#A)#:)#3)#,)#%)#)#)#)# )#)#û(#ô(#í(#æ(#ß(#Ø(#Ñ(#Ê(#Ã(#¼(#µ(#®(#§(# (#™(#’(#‹(#„(#}(#v(#o(#h(#a(#Z(#S(#L(#E(#>(#7(#0(#)(#"(#(#(# (#(#ÿ'#ø'#ñ'#ê'#ã'#Ü'#Õ'#Î'#Ç'#À'#¹'#²'#«'#¤'#'#–'#'#ˆ'#'#z'#s'#l'#e'#^'#W'#P'#I'#B'#;'#4'#-'#&'#'#'#'# '#'#ü&#õ&#î&#ç&#à&#Ù&#Ò&#Ë&#Ä&#½&#¶&#¯&#¨&#¡&#š&#“&#Œ&#…&#~&#w&#p&#i&#b&#[&#T&#M&#F&#?&#8&#1&#*&##&#&#&#&#&#&#ù%#ò%#ë%#ä%#Ý%#Ö%#Ï%#È%#Á%#º%#³%#¬%#¥%#ž%#—%#%#‰%#‚%#{%#t%#m%#f%#_%#X%#Q%#J%#C%#<%#5%#.%#'%# %#%#%# %#%#ý$#ö$#ï$#è$#á$#Ú$#Ó$#Ì$#Å$#¾$#·$#°$#©$#¢$#›$#”$#$#†$#$#x$#q$#j$#c$#\$#U$#N$#G$#@$#9$#2$#+$#$$#$#$#$#$#$#ú##ó##ì##å##Þ##×##Ð##É##Â##»##´##­##¦##Ÿ##˜##‘##Š##ƒ##|##u##n##g##`##Y##R##K##D##=##6##/##(##!###### ####þ"#÷"#ð"#é"#â"#Û"#Ô"#Í"#Æ"#¿"#¸"#±"#ª"#£"#œ"#•"#Ž"#‡"#€"#y"#r"#k"#d"#]"#V"#O"#H"#A"#:"#3"#,"#%"#"#"#"# "#"#û!#ô!#í!#æ!#ß!#Ø!#Ñ!#Ê!#Ã!#¼!#µ!#®!#§!# !#™!#’!#‹!#„!#}!#v!#o!#h!#a!#Z!#S!#L!#E!#>!#7!#0!#)!#"!#!#!# !#!#ÿ #ø #ñ #ê #ã #Ü #Õ #Î #Ç #À #¹ #² #« #¤ # #– # #ˆ # #z #s #l #e #^ #W #P #I #B #; #4 #- #& # # # # # #ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ #÷ #ð #é #â #Û #Ô #Í #Æ #¿ #¸ #± #ª #£ #œ #• #Ž #‡ #€ #y #r #k #d #] #V #O #H #A #: #3 #, #% # # # # # #û #ô #í #æ #ß #Ø #Ñ #Ê #à #¼ #µ #® #§ #  #™ #’ #‹ #„ #} #v #o #h #a #Z #S #L #E #> #7 #0 #) #" # # # # #ÿ #ø #ñ #ê #ã #Ü #Õ #Î #Ç #À #¹ #² #« #¤ # #– # #ˆ # #z #s #l #e #^ #W #P #I #B #; #4 #- #& # # # # # #ü #õ #î #ç #à #Ù #Ò #Ë #Ä #½ #¶ #¯ #¨ #¡ #š #“ #Œ #… #~ #w #p #i #b #[ #T #M #F #? #8 #1 #* ## # # # # # #ù #ò #ë #ä #Ý #Ö #Ï #È #Á #º #³ #¬ #¥ #ž #— # #‰ #‚ #{ #t #m #f #_ #X #Q #J #C #< #5 #. #' # # # # # #ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þÿ"÷ÿ"ðÿ"éÿ"âÿ"Ûÿ"Ôÿ"Íÿ"Æÿ"¿ÿ"¸ÿ"±ÿ"ªÿ"£ÿ"œÿ"•ÿ"Žÿ"‡ÿ"€ÿ"yÿ"rÿ"kÿ"dÿ"]ÿ"Vÿ"Oÿ"Hÿ"Aÿ":ÿ"3ÿ",ÿ"%ÿ"ÿ"ÿ"ÿ" ÿ"ÿ"ûþ"ôþ"íþ"æþ"ßþ"Øþ"Ñþ"Êþ"Ãþ"¼þ"µþ"®þ"§þ" þ"™þ"’þ"‹þ"„þ"}þ"vþ"oþ"hþ"aþ"Zþ"Sþ"Lþ"Eþ">þ"7þ"0þ")þ""þ"þ"þ" þ"þ"ÿý"øý"ñý"êý"ãý"Üý"Õý"Îý"Çý"Àý"¹ý"²ý"«ý"¤ý"ý"–ý"ý"ˆý"ý"zý"sý"lý"eý"^ý"Wý"Pý"Iý"Bý";ý"4ý"-ý"&ý"ý"ý"ý" ý"ý"üü"õü"îü"çü"àü"Ùü"Òü"Ëü"Äü"½ü"¶ü"¯ü"¨ü"¡ü"šü"“ü"Œü"…ü"~ü"wü"pü"iü"bü"[ü"Tü"Mü"Fü"?ü"8ü"1ü"*ü"#ü"ü"ü"ü"ü"ü"ùû"òû"ëû"äû"Ýû"Öû"Ïû"Èû"Áû"ºû"³û"¬û"¥û"žû"—û"û"‰û"‚û"{û"tû"mû"fû"_û"Xû"Qû"Jû"Cû"<û"5û".û"'û" û"û"û" û"û"ýú"öú"ïú"èú"áú"Úú"Óú"Ìú"Åú"¾ú"·ú"°ú"©ú"¢ú"›ú"”ú"ú"†ú"ú"xú"qú"jú"cú"\ú"Uú"Nú"Gú"@ú"9ú"2ú"+ú"$ú"ú"ú"ú"ú"ú"úù"óù"ìù"åù"Þù"×ù"Ðù"Éù"Âù"»ù"´ù"­ù"¦ù"Ÿù"˜ù"‘ù"Šù"ƒù"|ù"uù"nù"gù"`ù"Yù"Rù"Kù"Dù"=ù"6ù"/ù"(ù"!ù"ù"ù" ù"ù"þø"÷ø"ðø"éø"âø"Ûø"Ôø"Íø"Æø"¿ø"¸ø"±ø"ªø"£ø"œø"•ø"Žø"‡ø"€ø"yø"rø"kø"dø"]ø"Vø"Oø"Hø"Aø":ø"3ø",ø"%ø"ø"ø"ø" ø"ø"û÷"ô÷"í÷"æ÷"ß÷"Ø÷"Ñ÷"Ê÷"Ã÷"¼÷"µ÷"®÷"§÷" ÷"™÷"’÷"‹÷"„÷"}÷"v÷"o÷"h÷"a÷"Z÷"S÷"L÷"E÷">÷"7÷"0÷")÷""÷"÷"÷" ÷"÷"ÿö"øö"ñö"êö"ãö"Üö"Õö"Îö"Çö"Àö"¹ö"²ö"«ö"¤ö"ö"–ö"ö"ˆö"ö"zö"sö"lö"eö"^ö"Wö"Pö"Iö"Bö";ö"4ö"-ö"&ö"ö"ö"ö" ö"ö"üõ"õõ"îõ"çõ"àõ"Ùõ"Òõ"Ëõ"Äõ"½õ"¶õ"¯õ"¨õ"¡õ"šõ"“õ"Œõ"…õ"~õ"wõ"põ"iõ"bõ"[õ"Tõ"Mõ"Fõ"?õ"8õ"1õ"*õ"#õ"õ"õ"õ"õ"õ"ùô"òô"ëô"äô"Ýô"Öô"Ïô"Èô"Áô"ºô"³ô"¬ô"¥ô"žô"—ô"ô"‰ô"‚ô"{ô"tô"mô"fô"_ô"Xô"Qô"Jô"Cô"<ô"5ô".ô"'ô" ô"ô"ô" ô"ô"ýó"öó"ïó"èó"áó"Úó"Óó"Ìó"Åó"¾ó"·ó"°ó"©ó"¢ó"›ó"”ó"ó"†ó"ó"xó"qó"jó"có"\ó"Uó"Nó"Gó"@ó"9ó"2ó"+ó"$ó"ó"ó"ó"ó"ó"úò"óò"ìò"åò"Þò"×ò"Ðò"Éò"Âò"»ò"´ò"­ò"¦ò"Ÿò"˜ò"‘ò"Šò"ƒò"|ò"uò"nò"gò"`ò"Yò"Rò"Kò"Dò"=ò"6ò"/ò"(ò"!ò"ò"ò" ò"ò"þñ"÷ñ"ðñ"éñ"âñ"Ûñ"Ôñ"Íñ"Æñ"¿ñ"¸ñ"±ñ"ªñ"£ñ"œñ"•ñ"Žñ"‡ñ"€ñ"yñ"rñ"kñ"dñ"]ñ"Vñ"Oñ"Hñ"Añ":ñ"3ñ",ñ"%ñ"ñ"ñ"ñ" ñ"ñ"ûð"ôð"íð"æð"ßð"Øð"Ñð"Êð"Ãð"¼ð"µð"®ð"§ð" ð"™ð"’ð"‹ð"„ð"}ð"vð"oð"hð"að"Zð"Sð"Lð"Eð">ð"7ð"0ð")ð""ð"ð"ð" ð"ð"ÿï"øï"ñï"êï"ãï"Üï"Õï"Îï"Çï"Àï"¹ï"²ï"«ï"¤ï"ï"–ï"ï"ˆï"ï"zï"sï"lï"eï"^ï"Wï"Pï"Iï"Bï";ï"4ï"-ï"&ï"ï"ï"ï" ï"ï"üî"õî"îî"çî"àî"Ùî"Òî"Ëî"Äî"½î"¶î"¯î"¨î"¡î"šî"“î"Œî"…î"~î"wî"pî"iî"bî"[î"Tî"Mî"Fî"?î"8î"1î"*î"#î"î"î"î"î"î"ùí"òí"ëí"äí"Ýí"Öí"Ïí"Èí"Áí"ºí"³í"¬í"¥í"ží"—í"í"‰í"‚í"{í"tí"mí"fí"_í"Xí"Qí"Jí"Cí"<í"5í".í"'í" í"í"í" í"í"ýì"öì"ïì"èì"áì"Úì"Óì"Ìì"Åì"¾ì"·ì"°ì"©ì"¢ì"›ì"”ì"ì"†ì"ì"xì"qì"jì"cì"\ì"Uì"Nì"Gì"@ì"9ì"2ì"+ì"$ì"ì"ì"ì"ì"ì"úë"óë"ìë"åë"Þë"×ë"Ðë"Éë"Âë"»ë"´ë"­ë"¦ë"Ÿë"˜ë"‘ë"Šë"ƒë"|ë"uë"në"gë"`ë"Yë"Rë"Kë"Dë"=ë"6ë"/ë"(ë"!ë"ë"ë" ë"ë"þê"÷ê"ðê"éê"âê"Ûê"Ôê"Íê"Æê"¿ê"¸ê"±ê"ªê"£ê"œê"•ê"Žê"‡ê"€ê"yê"rê"kê"dê"]ê"Vê"Oê"Hê"Aê":ê"3ê",ê"%ê"ê"ê"ê" ê"ê"ûé"ôé"íé"æé"ßé"Øé"Ñé"Êé"Ãé"¼é"µé"®é"§é" é"™é"’é"‹é"„é"}é"vé"oé"hé"aé"Zé"Sé"Lé"Eé">é"7é"0é")é""é"é"é" é"é"ÿè"øè"ñè"êè"ãè"Üè"Õè"Îè"Çè"Àè"¹è"²è"«è"¤è"è"–è"è"ˆè"è"zè"sè"lè"eè"^è"Wè"Pè"Iè"Bè";è"4è"-è"&è"è"è"è" è"è"üç"õç"îç"çç"àç"Ùç"Òç"Ëç"Äç"½ç"¶ç"¯ç"¨ç"¡ç"šç"“ç"Œç"…ç"~ç"wç"pç"iç"bç"[ç"Tç"Mç"Fç"?ç"8ç"1ç"*ç"#ç"ç"ç"ç"ç"ç"ùæ"òæ"ëæ"äæ"Ýæ"Öæ"Ïæ"Èæ"Áæ"ºæ"³æ"¬æ"¥æ"žæ"—æ"æ"‰æ"‚æ"{æ"tæ"mæ"fæ"_æ"Xæ"Qæ"Jæ"Cæ"<æ"5æ".æ"'æ" æ"æ"æ" æ"æ"ýå"öå"ïå"èå"áå"Úå"Óå"Ìå"Åå"¾å"·å"°å"©å"¢å"›å"”å"å"†å"å"xå"qå"jå"cå"\å"Uå"Nå"Gå"@å"9å"2å"+å"$å"å"å"å"å"å"úä"óä"ìä"åä"Þä"×ä"Ðä"Éä"Âä"»ä"´ä"­ä"¦ä"Ÿä"˜ä"‘ä"Šä"ƒä"|ä"uä"nä"gä"`ä"Yä"Rä"Kä"Dä"=ä"6ä"/ä"(ä"!ä"ä"ä" ä"ä"þã"÷ã"ðã"éã"âã"Ûã"Ôã"Íã"Æã"¿ã"¸ã"±ã"ªã"£ã"œã"•ã"Žã"‡ã"€ã"yã"rã"kã"dã"]ã"Vã"Oã"Hã"Aã":ã"3ã",ã"%ã"ã"ã"ã" ã"ã"ûâ"ôâ"íâ"æâ"ßâ"Øâ"Ñâ"Êâ"Ãâ"¼â"µâ"®â"§â" â"™â"’â"‹â"„â"}â"vâ"oâ"hâ"aâ"Zâ"Sâ"Lâ"Eâ">â"7â"0â")â""â"â"â" â"â"ÿá"øá"ñá"êá"ãá"Üá"Õá"Îá"Çá"Àá"¹á"²á"«á"¤á"á"–á"á"ˆá"á"zá"sá"lá"eá"^á"Wá"Pá"Iá"Bá";á"4á"-á"&á"á"á"á" á"á"üà"õà"îà"çà"àà"Ùà"Òà"Ëà"Äà"½à"¶à"¯à"¨à"¡à"šà"“à"Œà"…à"~à"wà"pà"ià"bà"[à"Tà"Mà"Fà"?à"8à"1à"*à"#à"à"à"à"à"à"ùß"òß"ëß"äß"Ýß"Öß"Ïß"Èß"Áß"ºß"³ß"¬ß"¥ß"žß"—ß"ß"‰ß"‚ß"{ß"tß"mß"fß"_ß"Xß"Qß"Jß"Cß"<ß"5ß".ß"'ß" ß"ß"ß" ß"ß"ýÞ"öÞ"ïÞ"èÞ"áÞ"ÚÞ"ÓÞ"ÌÞ"ÅÞ"¾Þ"·Þ"°Þ"©Þ"¢Þ"›Þ"”Þ"Þ"†Þ"Þ"xÞ"qÞ"jÞ"cÞ"\Þ"UÞ"NÞ"GÞ"@Þ"9Þ"2Þ"+Þ"$Þ"Þ"Þ"Þ"Þ"Þ"úÝ"óÝ"ìÝ"åÝ"ÞÝ"×Ý"ÐÝ"ÉÝ"ÂÝ"»Ý"´Ý"­Ý"¦Ý"ŸÝ"˜Ý"‘Ý"ŠÝ"ƒÝ"|Ý"uÝ"nÝ"gÝ"`Ý"YÝ"RÝ"KÝ"DÝ"=Ý"6Ý"/Ý"(Ý"!Ý"Ý"Ý" Ý"Ý"þÜ"÷Ü"ðÜ"éÜ"âÜ"ÛÜ"ÔÜ"ÍÜ"ÆÜ"¿Ü"¸Ü"±Ü"ªÜ"£Ü"œÜ"•Ü"ŽÜ"‡Ü"€Ü"yÜ"rÜ"kÜ"dÜ"]Ü"VÜ"OÜ"HÜ"AÜ":Ü"3Ü",Ü"%Ü"Ü"Ü"Ü" Ü"Ü"ûÛ"ôÛ"íÛ"æÛ"ßÛ"ØÛ"ÑÛ"ÊÛ"ÃÛ"¼Û"µÛ"®Û"§Û" Û"™Û"’Û"‹Û"„Û"}Û"vÛ"oÛ"hÛ"aÛ"ZÛ"SÛ"LÛ"EÛ">Û"7Û"0Û")Û""Û"Û"Û" Û"Û"ÿÚ"øÚ"ñÚ"êÚ"ãÚ"ÜÚ"ÕÚ"ÎÚ"ÇÚ"ÀÚ"¹Ú"²Ú"«Ú"¤Ú"Ú"–Ú"Ú"ˆÚ"Ú"zÚ"sÚ"lÚ"eÚ"^Ú"WÚ"PÚ"IÚ"BÚ";Ú"4Ú"-Ú"&Ú"Ú"Ú"Ú" Ú"Ú"üÙ"õÙ"îÙ"çÙ"àÙ"ÙÙ"ÒÙ"ËÙ"ÄÙ"½Ù"¶Ù"¯Ù"¨Ù"¡Ù"šÙ"“Ù"ŒÙ"…Ù"~Ù"wÙ"pÙ"iÙ"bÙ"[Ù"TÙ"MÙ"FÙ"?Ù"8Ù"1Ù"*Ù"#Ù"Ù"Ù"Ù"Ù"Ù"ùØ"òØ"ëØ"äØ"ÝØ"ÖØ"ÏØ"ÈØ"ÁØ"ºØ"³Ø"¬Ø"¥Ø"žØ"—Ø"Ø"‰Ø"‚Ø"{Ø"tØ"mØ"fØ"_Ø"XØ"QØ"JØ"CØ"<Ø"5Ø".Ø"'Ø" Ø"Ø"Ø" Ø"Ø"ý×"ö×"ï×"è×"á×"Ú×"Ó×"Ì×"Å×"¾×"·×"°×"©×"¢×"›×"”×"×"†×"×"x×"q×"j×"c×"\×"U×"N×"G×"@×"9×"2×"+×"$×"×"×"×"×"×"úÖ"óÖ"ìÖ"åÖ"ÞÖ"×Ö"ÐÖ"ÉÖ"ÂÖ"»Ö"´Ö"­Ö"¦Ö"ŸÖ"˜Ö"‘Ö"ŠÖ"ƒÖ"|Ö"uÖ"nÖ"gÖ"`Ö"YÖ"RÖ"KÖ"DÖ"=Ö"6Ö"/Ö"(Ö"!Ö"Ö"Ö" Ö"Ö"þÕ"÷Õ"ðÕ"éÕ"âÕ"ÛÕ"ÔÕ"ÍÕ"ÆÕ"¿Õ"¸Õ"±Õ"ªÕ"£Õ"œÕ"•Õ"ŽÕ"‡Õ"€Õ"yÕ"rÕ"kÕ"dÕ"]Õ"VÕ"OÕ"HÕ"AÕ":Õ"3Õ",Õ"%Õ"Õ"Õ"Õ" Õ"Õ"ûÔ"ôÔ"íÔ"æÔ"ßÔ"ØÔ"ÑÔ"ÊÔ"ÃÔ"¼Ô"µÔ"®Ô"§Ô" Ô"™Ô"’Ô"‹Ô"„Ô"}Ô"vÔ"oÔ"hÔ"aÔ"ZÔ"SÔ"LÔ"EÔ">Ô"7Ô"0Ô")Ô""Ô"Ô"Ô" Ô"Ô"ÿÓ"øÓ"ñÓ"êÓ"ãÓ"ÜÓ"ÕÓ"ÎÓ"ÇÓ"ÀÓ"¹Ó"²Ó"«Ó"¤Ó"Ó"–Ó"Ó"ˆÓ"Ó"zÓ"sÓ"lÓ"eÓ"^Ó"WÓ"PÓ"IÓ"BÓ";Ó"4Ó"-Ó"&Ó"Ó"Ó"Ó" Ó"Ó"üÒ"õÒ"îÒ"çÒ"àÒ"ÙÒ"ÒÒ"ËÒ"ÄÒ"½Ò"¶Ò"¯Ò"¨Ò"¡Ò"šÒ"“Ò"ŒÒ"…Ò"~Ò"wÒ"pÒ"iÒ"bÒ"[Ò"TÒ"MÒ"FÒ"?Ò"8Ò"1Ò"*Ò"#Ò"Ò"Ò"Ò"Ò"Ò"ùÑ"òÑ"ëÑ"äÑ"ÝÑ"ÖÑ"ÏÑ"ÈÑ"ÁÑ"ºÑ"³Ñ"¬Ñ"¥Ñ"žÑ"—Ñ"Ñ"‰Ñ"‚Ñ"{Ñ"tÑ"mÑ"fÑ"_Ñ"XÑ"QÑ"JÑ"CÑ"<Ñ"5Ñ".Ñ"'Ñ" Ñ"Ñ"Ñ" Ñ"Ñ"ýÐ"öÐ"ïÐ"èÐ"áÐ"ÚÐ"ÓÐ"ÌÐ"ÅÐ"¾Ð"·Ð"°Ð"©Ð"¢Ð"›Ð"”Ð"Ð"†Ð"Ð"xÐ"qÐ"jÐ"cÐ"\Ð"UÐ"NÐ"GÐ"@Ð"9Ð"2Ð"+Ð"$Ð"Ð"Ð"Ð"Ð"Ð"úÏ"óÏ"ìÏ"åÏ"ÞÏ"×Ï"ÐÏ"ÉÏ"ÂÏ"»Ï"´Ï"­Ï"¦Ï"ŸÏ"˜Ï"‘Ï"ŠÏ"ƒÏ"|Ï"uÏ"nÏ"gÏ"`Ï"YÏ"RÏ"KÏ"DÏ"=Ï"6Ï"/Ï"(Ï"!Ï"Ï"Ï" Ï"Ï"þÎ"÷Î"ðÎ"éÎ"âÎ"ÛÎ"ÔÎ"ÍÎ"ÆÎ"¿Î"¸Î"±Î"ªÎ"£Î"œÎ"•Î"ŽÎ"‡Î"€Î"yÎ"rÎ"kÎ"dÎ"]Î"VÎ"OÎ"HÎ"AÎ":Î"3Î",Î"%Î"Î"Î"Î" Î"Î"ûÍ"ôÍ"íÍ"æÍ"ßÍ"ØÍ"ÑÍ"ÊÍ"ÃÍ"¼Í"µÍ"®Í"§Í" Í"™Í"’Í"‹Í"„Í"}Í"vÍ"oÍ"hÍ"aÍ"ZÍ"SÍ"LÍ"EÍ">Í"7Í"0Í")Í""Í"Í"Í" Í"Í"ÿÌ"øÌ"ñÌ"êÌ"ãÌ"ÜÌ"ÕÌ"ÎÌ"ÇÌ"ÀÌ"¹Ì"²Ì"«Ì"¤Ì"Ì"–Ì"Ì"ˆÌ"Ì"zÌ"sÌ"lÌ"eÌ"^Ì"WÌ"PÌ"IÌ"BÌ";Ì"4Ì"-Ì"&Ì"Ì"Ì"Ì" Ì"Ì"üË"õË"îË"çË"àË"ÙË"ÒË"ËË"ÄË"½Ë"¶Ë"¯Ë"¨Ë"¡Ë"šË"“Ë"ŒË"…Ë"~Ë"wË"pË"iË"bË"[Ë"TË"MË"FË"?Ë"8Ë"1Ë"*Ë"#Ë"Ë"Ë"Ë"Ë"Ë"ùÊ"òÊ"ëÊ"äÊ"ÝÊ"ÖÊ"ÏÊ"ÈÊ"ÁÊ"ºÊ"³Ê"¬Ê"¥Ê"žÊ"—Ê"Ê"‰Ê"‚Ê"{Ê"tÊ"mÊ"fÊ"_Ê"XÊ"QÊ"JÊ"CÊ"<Ê"5Ê".Ê"'Ê" Ê"Ê"Ê" Ê"Ê"ýÉ"öÉ"ïÉ"èÉ"áÉ"ÚÉ"ÓÉ"ÌÉ"ÅÉ"¾É"·É"°É"©É"¢É"›É"”É"É"†É"É"xÉ"qÉ"jÉ"cÉ"\É"UÉ"NÉ"GÉ"@É"9É"2É"+É"$É"É"É"É"É"É"úÈ"óÈ"ìÈ"åÈ"ÞÈ"×È"ÐÈ"ÉÈ"ÂÈ"»È"´È"­È"¦È"ŸÈ"˜È"‘È"ŠÈ"ƒÈ"|È"uÈ"nÈ"gÈ"`È"YÈ"RÈ"KÈ"DÈ"=È"6È"/È"(È"!È"È"È" È"È"þÇ"÷Ç"ðÇ"éÇ"âÇ"ÛÇ"ÔÇ"ÍÇ"ÆÇ"¿Ç"¸Ç"±Ç"ªÇ"£Ç"œÇ"•Ç"ŽÇ"‡Ç"€Ç"yÇ"rÇ"kÇ"dÇ"]Ç"VÇ"OÇ"HÇ"AÇ":Ç"3Ç",Ç"%Ç"Ç"Ç"Ç" Ç"Ç"ûÆ"ôÆ"íÆ"æÆ"߯"ØÆ"ÑÆ"ÊÆ"ÃÆ"¼Æ"µÆ"®Æ"§Æ" Æ"™Æ"’Æ"‹Æ"„Æ"}Æ"vÆ"oÆ"hÆ"aÆ"ZÆ"SÆ"LÆ"EÆ">Æ"7Æ"0Æ")Æ""Æ"Æ"Æ" Æ"Æ"ÿÅ"øÅ"ñÅ"êÅ"ãÅ"ÜÅ"ÕÅ"ÎÅ"ÇÅ"ÀÅ"¹Å"²Å"«Å"¤Å"Å"–Å"Å"ˆÅ"Å"zÅ"sÅ"lÅ"eÅ"^Å"WÅ"PÅ"IÅ"BÅ";Å"4Å"-Å"&Å"Å"Å"Å" Å"Å"üÄ"õÄ"îÄ"çÄ"àÄ"ÙÄ"ÒÄ"ËÄ"ÄÄ"½Ä"¶Ä"¯Ä"¨Ä"¡Ä"šÄ"“Ä"ŒÄ"…Ä"~Ä"wÄ"pÄ"iÄ"bÄ"[Ä"TÄ"MÄ"FÄ"?Ä"8Ä"1Ä"*Ä"#Ä"Ä"Ä"Ä"Ä"Ä"ùÃ"òÃ"ëÃ"äÃ"ÝÃ"ÖÃ"ÏÃ"ÈÃ"ÁÃ"ºÃ"³Ã"¬Ã"¥Ã"žÃ"—Ã"Ã"‰Ã"‚Ã"{Ã"tÃ"mÃ"fÃ"_Ã"XÃ"QÃ"JÃ"CÃ"<Ã"5Ã".Ã"'Ã" Ã"Ã"Ã" Ã"Ã"ýÂ"öÂ"ïÂ"èÂ"áÂ"ÚÂ"ÓÂ"ÌÂ"ÅÂ"¾Â"·Â"°Â"©Â"¢Â"›Â"”Â"Â"†Â"Â"xÂ"qÂ"jÂ"cÂ"\Â"UÂ"NÂ"GÂ"@Â"9Â"2Â"+Â"$Â"Â"Â"Â"Â"Â"úÁ"óÁ"ìÁ"åÁ"ÞÁ"×Á"ÐÁ"ÉÁ"ÂÁ"»Á"´Á"­Á"¦Á"ŸÁ"˜Á"‘Á"ŠÁ"ƒÁ"|Á"uÁ"nÁ"gÁ"`Á"YÁ"RÁ"KÁ"DÁ"=Á"6Á"/Á"(Á"!Á"Á"Á" Á"Á"þÀ"÷À"ðÀ"éÀ"âÀ"ÛÀ"ÔÀ"ÍÀ"ÆÀ"¿À"¸À"±À"ªÀ"£À"œÀ"•À"ŽÀ"‡À"€À"yÀ"rÀ"kÀ"dÀ"]À"VÀ"OÀ"HÀ"AÀ":À"3À",À"%À"À"À"À" À"À"û¿"ô¿"í¿"æ¿"ß¿"Ø¿"Ñ¿"Ê¿"ÿ"¼¿"µ¿"®¿"§¿" ¿"™¿"’¿"‹¿"„¿"}¿"v¿"o¿"h¿"a¿"Z¿"S¿"L¿"E¿">¿"7¿"0¿")¿""¿"¿"¿" ¿"¿"ÿ¾"ø¾"ñ¾"ê¾"ã¾"ܾ"Õ¾"ξ"Ǿ"À¾"¹¾"²¾"«¾"¤¾"¾"–¾"¾"ˆ¾"¾"z¾"s¾"l¾"e¾"^¾"W¾"P¾"I¾"B¾";¾"4¾"-¾"&¾"¾"¾"¾" ¾"¾"ü½"õ½"î½"ç½"à½"Ù½"Ò½"˽"Ľ"½½"¶½"¯½"¨½"¡½"š½"“½"Œ½"…½"~½"w½"p½"i½"b½"[½"T½"M½"F½"?½"8½"1½"*½"#½"½"½"½"½"½"ù¼"ò¼"ë¼"ä¼"ݼ"Ö¼"ϼ"ȼ"Á¼"º¼"³¼"¬¼"¥¼"ž¼"—¼"¼"‰¼"‚¼"{¼"t¼"m¼"f¼"_¼"X¼"Q¼"J¼"C¼"<¼"5¼".¼"'¼" ¼"¼"¼" ¼"¼"ý»"ö»"ï»"è»"á»"Ú»"Ó»"Ì»"Å»"¾»"·»"°»"©»"¢»"›»"”»"»"†»"»"x»"q»"j»"c»"\»"U»"N»"G»"@»"9»"2»"+»"$»"»"»"»"»"»"úº"óº"ìº"åº"Þº"׺"к"ɺ"º"»º"´º"­º"¦º"Ÿº"˜º"‘º"Šº"ƒº"|º"uº"nº"gº"`º"Yº"Rº"Kº"Dº"=º"6º"/º"(º"!º"º"º" º"º"þ¹"÷¹"ð¹"é¹"â¹"Û¹"Ô¹"͹"ƹ"¿¹"¸¹"±¹"ª¹"£¹"œ¹"•¹"޹"‡¹"€¹"y¹"r¹"k¹"d¹"]¹"V¹"O¹"H¹"A¹":¹"3¹",¹"%¹"¹"¹"¹" ¹"¹"û¸"ô¸"í¸"æ¸"߸"ظ"Ѹ"ʸ"ø"¼¸"µ¸"®¸"§¸" ¸"™¸"’¸"‹¸"„¸"}¸"v¸"o¸"h¸"a¸"Z¸"S¸"L¸"E¸">¸"7¸"0¸")¸""¸"¸"¸" ¸"¸"ÿ·"ø·"ñ·"ê·"ã·"Ü·"Õ·"η"Ç·"À·"¹·"²·"«·"¤·"·"–·"·"ˆ·"·"z·"s·"l·"e·"^·"W·"P·"I·"B·";·"4·"-·"&·"·"·"·" ·"·"ü¶"õ¶"î¶"ç¶"à¶"Ù¶"Ò¶"˶"Ķ"½¶"¶¶"¯¶"¨¶"¡¶"š¶"“¶"Œ¶"…¶"~¶"w¶"p¶"i¶"b¶"[¶"T¶"M¶"F¶"?¶"8¶"1¶"*¶"#¶"¶"¶"¶"¶"¶"ùµ"òµ"ëµ"äµ"ݵ"Öµ"ϵ"ȵ"Áµ"ºµ"³µ"¬µ"¥µ"žµ"—µ"µ"‰µ"‚µ"{µ"tµ"mµ"fµ"_µ"Xµ"Qµ"Jµ"Cµ"<µ"5µ".µ"'µ" µ"µ"µ" µ"µ"ý´"ö´"ï´"è´"á´"Ú´"Ó´"Ì´"Å´"¾´"·´"°´"©´"¢´"›´"”´"´"†´"´"x´"q´"j´"c´"\´"U´"N´"G´"@´"9´"2´"+´"$´"´"´"´"´"´"ú³"ó³"ì³"å³"Þ³"׳"г"ɳ"³"»³"´³"­³"¦³"Ÿ³"˜³"‘³"г"ƒ³"|³"u³"n³"g³"`³"Y³"R³"K³"D³"=³"6³"/³"(³"!³"³"³" ³"³"þ²"÷²"ð²"é²"â²"Û²"Ô²"Ͳ"Ʋ"¿²"¸²"±²"ª²"£²"œ²"•²"޲"‡²"€²"y²"r²"k²"d²"]²"V²"O²"H²"A²":²"3²",²"%²"²"²"²" ²"²"û±"ô±"í±"æ±"ß±"ر"ѱ"ʱ"ñ"¼±"µ±"®±"§±" ±"™±"’±"‹±"„±"}±"v±"o±"h±"a±"Z±"S±"L±"E±">±"7±"0±")±""±"±"±" ±"±"ÿ°"ø°"ñ°"ê°"ã°"ܰ"Õ°"ΰ"ǰ"À°"¹°"²°"«°"¤°"°"–°"°"ˆ°"°"z°"s°"l°"e°"^°"W°"P°"I°"B°";°"4°"-°"&°"°"°"°" °"°"ü¯"õ¯"î¯"ç¯"à¯"Ù¯"Ò¯"˯"į"½¯"¶¯"¯¯"¨¯"¡¯"š¯"“¯"Œ¯"…¯"~¯"w¯"p¯"i¯"b¯"[¯"T¯"M¯"F¯"?¯"8¯"1¯"*¯"#¯"¯"¯"¯"¯"¯"ù®"ò®"ë®"ä®"Ý®"Ö®"Ï®"È®"Á®"º®"³®"¬®"¥®"ž®"—®"®"‰®"‚®"{®"t®"m®"f®"_®"X®"Q®"J®"C®"<®"5®".®"'®" ®"®"®" ®"®"ý­"ö­"ï­"è­"á­"Ú­"Ó­"Ì­"Å­"¾­"·­"°­"©­"¢­"›­"”­"­"†­"­"x­"q­"j­"c­"\­"U­"N­"G­"@­"9­"2­"+­"$­"­"­"­"­"­"ú¬"ó¬"ì¬"å¬"Þ¬"׬"Ь"ɬ"¬"»¬"´¬"­¬"¦¬"Ÿ¬"˜¬"‘¬"Ь"ƒ¬"|¬"u¬"n¬"g¬"`¬"Y¬"R¬"K¬"D¬"=¬"6¬"/¬"(¬"!¬"¬"¬" ¬"¬"þ«"÷«"ð«"é«"â«"Û«"Ô«"Í«"Æ«"¿«"¸«"±«"ª«"£«"œ«"•«"Ž«"‡«"€«"y«"r«"k«"d«"]«"V«"O«"H«"A«":«"3«",«"%«"«"«"«" «"«"ûª"ôª"íª"æª"ߪ"ت"Ѫ"ʪ"ê"¼ª"µª"®ª"§ª" ª"™ª"’ª"‹ª"„ª"}ª"vª"oª"hª"aª"Zª"Sª"Lª"Eª">ª"7ª"0ª")ª""ª"ª"ª" ª"ª"ÿ©"ø©"ñ©"ê©"ã©"Ü©"Õ©"Ω"Ç©"À©"¹©"²©"«©"¤©"©"–©"©"ˆ©"©"z©"s©"l©"e©"^©"W©"P©"I©"B©";©"4©"-©"&©"©"©"©" ©"©"ü¨"õ¨"î¨"ç¨"à¨"Ù¨"Ò¨"˨"Ĩ"½¨"¶¨"¯¨"¨¨"¡¨"š¨"“¨"Œ¨"…¨"~¨"w¨"p¨"i¨"b¨"[¨"T¨"M¨"F¨"?¨"8¨"1¨"*¨"#¨"¨"¨"¨"¨"¨"ù§"ò§"ë§"ä§"ݧ"Ö§"ϧ"ȧ"Á§"º§"³§"¬§"¥§"ž§"—§"§"‰§"‚§"{§"t§"m§"f§"_§"X§"Q§"J§"C§"<§"5§".§"'§" §"§"§" §"§"ý¦"ö¦"ï¦"è¦"á¦"Ú¦"Ó¦"̦"Ŧ"¾¦"·¦"°¦"©¦"¢¦"›¦"”¦"¦"†¦"¦"x¦"q¦"j¦"c¦"\¦"U¦"N¦"G¦"@¦"9¦"2¦"+¦"$¦"¦"¦"¦"¦"¦"ú¥"ó¥"ì¥"å¥"Þ¥"×¥"Ð¥"É¥"Â¥"»¥"´¥"­¥"¦¥"Ÿ¥"˜¥"‘¥"Š¥"ƒ¥"|¥"u¥"n¥"g¥"`¥"Y¥"R¥"K¥"D¥"=¥"6¥"/¥"(¥"!¥"¥"¥" ¥"¥"þ¤"÷¤"ð¤"é¤"â¤"Û¤"Ô¤"ͤ"Ƥ"¿¤"¸¤"±¤"ª¤"£¤"œ¤"•¤"ޤ"‡¤"€¤"y¤"r¤"k¤"d¤"]¤"V¤"O¤"H¤"A¤":¤"3¤",¤"%¤"¤"¤"¤" ¤"¤"û£"ô£"í£"æ£"ߣ"Ø£"Ñ£"Ê£"ã"¼£"µ£"®£"§£" £"™£"’£"‹£"„£"}£"v£"o£"h£"a£"Z£"S£"L£"E£">£"7£"0£")£""£"£"£" £"£"ÿ¢"ø¢"ñ¢"ê¢"ã¢"Ü¢"Õ¢"΢"Ç¢"À¢"¹¢"²¢"«¢"¤¢"¢"–¢"¢"ˆ¢"¢"z¢"s¢"l¢"e¢"^¢"W¢"P¢"I¢"B¢";¢"4¢"-¢"&¢"¢"¢"¢" ¢"¢"ü¡"õ¡"î¡"ç¡"à¡"Ù¡"Ò¡"Ë¡"Ä¡"½¡"¶¡"¯¡"¨¡"¡¡"š¡"“¡"Œ¡"…¡"~¡"w¡"p¡"i¡"b¡"[¡"T¡"M¡"F¡"?¡"8¡"1¡"*¡"#¡"¡"¡"¡"¡"¡"ù "ò "ë "ä "Ý "Ö "Ï "È "Á "º "³ "¬ "¥ "ž "— " "‰ "‚ "{ "t "m "f "_ "X "Q "J "C "< "5 ". "' "  " " "  " "ýŸ"öŸ"ïŸ"èŸ"áŸ"ÚŸ"ÓŸ"ÌŸ"ÅŸ"¾Ÿ"·Ÿ"°Ÿ"©Ÿ"¢Ÿ"›Ÿ"”Ÿ"Ÿ"†Ÿ"Ÿ"xŸ"qŸ"jŸ"cŸ"\Ÿ"UŸ"NŸ"GŸ"@Ÿ"9Ÿ"2Ÿ"+Ÿ"$Ÿ"Ÿ"Ÿ"Ÿ"Ÿ"Ÿ"úž"óž"ìž"åž"Þž"מ"О"Éž"ž"»ž"´ž"­ž"¦ž"Ÿž"˜ž"‘ž"Šž"ƒž"|ž"už"nž"gž"`ž"Yž"Rž"Kž"Dž"=ž"6ž"/ž"(ž"!ž"ž"ž" ž"ž"þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""ûœ"ôœ"íœ"æœ"ßœ"Øœ"Ñœ"Êœ"Ü"¼œ"µœ"®œ"§œ" œ"™œ"’œ"‹œ"„œ"}œ"vœ"oœ"hœ"aœ"Zœ"Sœ"Lœ"Eœ">œ"7œ"0œ")œ""œ"œ"œ" œ"œ"ÿ›"ø›"ñ›"ê›"ã›"Ü›"Õ›"Λ"Ç›"À›"¹›"²›"«›"¤›"›"–›"›"ˆ›"›"z›"s›"l›"e›"^›"W›"P›"I›"B›";›"4›"-›"&›"›"›"›" ›"›"üš"õš"îš"çš"àš"Ùš"Òš"Ëš"Äš"½š"¶š"¯š"¨š"¡š"šš"“š"Œš"…š"~š"wš"pš"iš"bš"[š"Tš"Mš"Fš"?š"8š"1š"*š"#š"š"š"š"š"š"ù™"ò™"ë™"ä™"Ý™"Ö™"Ï™"È™"Á™"º™"³™"¬™"¥™"ž™"—™"™"‰™"‚™"{™"t™"m™"f™"_™"X™"Q™"J™"C™"<™"5™".™"'™" ™"™"™" ™"™"ý˜"ö˜"ï˜"è˜"á˜"Ú˜"Ó˜"̘"Ř"¾˜"·˜"°˜"©˜"¢˜"›˜"”˜"˜"†˜"˜"x˜"q˜"j˜"c˜"\˜"U˜"N˜"G˜"@˜"9˜"2˜"+˜"$˜"˜"˜"˜"˜"˜"ú—"ó—"ì—"å—"Þ—"×—"З"É—"—"»—"´—"­—"¦—"Ÿ—"˜—"‘—"Š—"ƒ—"|—"u—"n—"g—"`—"Y—"R—"K—"D—"=—"6—"/—"(—"!—"—"—" —"—"þ–"÷–"ð–"é–"â–"Û–"Ô–"Í–"Æ–"¿–"¸–"±–"ª–"£–"œ–"•–"Ž–"‡–"€–"y–"r–"k–"d–"]–"V–"O–"H–"A–":–"3–",–"%–"–"–"–" –"–"û•"ô•"í•"æ•"ß•"Ø•"Ñ•"Ê•"Õ"¼•"µ•"®•"§•" •"™•"’•"‹•"„•"}•"v•"o•"h•"a•"Z•"S•"L•"E•">•"7•"0•")•""•"•"•" •"•"ÿ”"ø”"ñ”"ê”"ã”"Ü”"Õ”"Δ"Ç”"À”"¹”"²”"«”"¤”"”"–”"”"ˆ”"”"z”"s”"l”"e”"^”"W”"P”"I”"B”";”"4”"-”"&”"”"”"”" ”"”"ü“"õ“"î“"ç“"à“"Ù“"Ò“"Ë“"Ä“"½“"¶“"¯“"¨“"¡“"š“"““"Œ“"…“"~“"w“"p“"i“"b“"[“"T“"M“"F“"?“"8“"1“"*“"#“"“"“"“"“"“"ù’"ò’"ë’"ä’"Ý’"Ö’"Ï’"È’"Á’"º’"³’"¬’"¥’"ž’"—’"’"‰’"‚’"{’"t’"m’"f’"_’"X’"Q’"J’"C’"<’"5’".’"'’" ’"’"’" ’"’"ý‘"ö‘"ï‘"è‘"á‘"Ú‘"Ó‘"Ì‘"Å‘"¾‘"·‘"°‘"©‘"¢‘"›‘"”‘"‘"†‘"‘"x‘"q‘"j‘"c‘"\‘"U‘"N‘"G‘"@‘"9‘"2‘"+‘"$‘"‘"‘"‘"‘"‘"ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""ûŽ"ôŽ"íŽ"æŽ"ߎ"ØŽ"ÑŽ"ÊŽ"ÃŽ"¼Ž"µŽ"®Ž"§Ž" Ž"™Ž"’Ž"‹Ž"„Ž"}Ž"vŽ"oŽ"hŽ"aŽ"ZŽ"SŽ"LŽ"EŽ">Ž"7Ž"0Ž")Ž""Ž"Ž"Ž" Ž"Ž"ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""üŒ"õŒ"îŒ"çŒ"àŒ"ÙŒ"ÒŒ"ËŒ"ÄŒ"½Œ"¶Œ"¯Œ"¨Œ"¡Œ"šŒ"“Œ"ŒŒ"…Œ"~Œ"wŒ"pŒ"iŒ"bŒ"[Œ"TŒ"MŒ"FŒ"?Œ"8Œ"1Œ"*Œ"#Œ"Œ"Œ"Œ"Œ"Œ"ù‹"ò‹"ë‹"ä‹"Ý‹"Ö‹"Ï‹"È‹"Á‹"º‹"³‹"¬‹"¥‹"ž‹"—‹"‹"‰‹"‚‹"{‹"t‹"m‹"f‹"_‹"X‹"Q‹"J‹"C‹"<‹"5‹".‹"'‹" ‹"‹"‹" ‹"‹"ýŠ"öŠ"ïŠ"èŠ"áŠ"ÚŠ"ÓŠ"ÌŠ"ÅŠ"¾Š"·Š"°Š"©Š"¢Š"›Š"”Š"Š"†Š"Š"xŠ"qŠ"jŠ"cŠ"\Š"UŠ"NŠ"GŠ"@Š"9Š"2Š"+Š"$Š"Š"Š"Š"Š"Š"ú‰"ó‰"ì‰"å‰"Þ‰"׉"Љ"ɉ"‰"»‰"´‰"­‰"¦‰"Ÿ‰"˜‰"‘‰"Љ"ƒ‰"|‰"u‰"n‰"g‰"`‰"Y‰"R‰"K‰"D‰"=‰"6‰"/‰"(‰"!‰"‰"‰" ‰"‰"þˆ"÷ˆ"ðˆ"éˆ"âˆ"Ûˆ"Ôˆ"͈"ƈ"¿ˆ"¸ˆ"±ˆ"ªˆ"£ˆ"œˆ"•ˆ"Žˆ"‡ˆ"€ˆ"yˆ"rˆ"kˆ"dˆ"]ˆ"Vˆ"Oˆ"Hˆ"Aˆ":ˆ"3ˆ",ˆ"%ˆ"ˆ"ˆ"ˆ" ˆ"ˆ"û‡"ô‡"í‡"æ‡"߇"؇"ч"ʇ"Ç"¼‡"µ‡"®‡"§‡" ‡"™‡"’‡"‹‡"„‡"}‡"v‡"o‡"h‡"a‡"Z‡"S‡"L‡"E‡">‡"7‡"0‡")‡""‡"‡"‡" ‡"‡"ÿ†"ø†"ñ†"ê†"ã†"܆"Õ†"Ά"dž"À†"¹†"²†"«†"¤†"†"–†"†"ˆ†"†"z†"s†"l†"e†"^†"W†"P†"I†"B†";†"4†"-†"&†"†"†"†" †"†"ü…"õ…"î…"ç…"à…"Ù…"Ò…"Ë…"Ä…"½…"¶…"¯…"¨…"¡…"š…"“…"Œ…"……"~…"w…"p…"i…"b…"[…"T…"M…"F…"?…"8…"1…"*…"#…"…"…"…"…"…"ù„"ò„"ë„"ä„"Ý„"Ö„"Ï„"È„"Á„"º„"³„"¬„"¥„"ž„"—„"„"‰„"‚„"{„"t„"m„"f„"_„"X„"Q„"J„"C„"<„"5„".„"'„" „"„"„" „"„"ýƒ"öƒ"ïƒ"èƒ"áƒ"Úƒ"Óƒ"̃"Ń"¾ƒ"·ƒ"°ƒ"©ƒ"¢ƒ"›ƒ"”ƒ"ƒ"†ƒ"ƒ"xƒ"qƒ"jƒ"cƒ"\ƒ"Uƒ"Nƒ"Gƒ"@ƒ"9ƒ"2ƒ"+ƒ"$ƒ"ƒ"ƒ"ƒ"ƒ"ƒ"ú‚"ó‚"ì‚"å‚"Þ‚"ׂ"Ђ"É‚"‚"»‚"´‚"­‚"¦‚"Ÿ‚"˜‚"‘‚"Š‚"ƒ‚"|‚"u‚"n‚"g‚"`‚"Y‚"R‚"K‚"D‚"=‚"6‚"/‚"(‚"!‚"‚"‚" ‚"‚"þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û€"ô€"í€"æ€"߀"Ø€"Ñ€"Ê€"À"¼€"µ€"®€"§€" €"™€"’€"‹€"„€"}€"v€"o€"h€"a€"Z€"S€"L€"E€">€"7€"0€")€""€"€"€" €"€"ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü~"õ~"î~"ç~"à~"Ù~"Ò~"Ë~"Ä~"½~"¶~"¯~"¨~"¡~"š~"“~"Œ~"…~"~~"w~"p~"i~"b~"[~"T~"M~"F~"?~"8~"1~"*~"#~"~"~"~"~"~"ù}"ò}"ë}"ä}"Ý}"Ö}"Ï}"È}"Á}"º}"³}"¬}"¥}"ž}"—}"}"‰}"‚}"{}"t}"m}"f}"_}"X}"Q}"J}"C}"<}"5}".}"'}" }"}"}" }"}"ý|"ö|"ï|"è|"á|"Ú|"Ó|"Ì|"Å|"¾|"·|"°|"©|"¢|"›|"”|"|"†|"|"x|"q|"j|"c|"\|"U|"N|"G|"@|"9|"2|"+|"$|"|"|"|"|"|"ú{"ó{"ì{"å{"Þ{"×{"Ð{"É{"Â{"»{"´{"­{"¦{"Ÿ{"˜{"‘{"Š{"ƒ{"|{"u{"n{"g{"`{"Y{"R{"K{"D{"={"6{"/{"({"!{"{"{" {"{"þz"÷z"ðz"éz"âz"Ûz"Ôz"Íz"Æz"¿z"¸z"±z"ªz"£z"œz"•z"Žz"‡z"€z"yz"rz"kz"dz"]z"Vz"Oz"Hz"Az":z"3z",z"%z"z"z"z" z"z"ûy"ôy"íy"æy"ßy"Øy"Ñy"Êy"Ãy"¼y"µy"®y"§y" y"™y"’y"‹y"„y"}y"vy"oy"hy"ay"Zy"Sy"Ly"Ey">y"7y"0y")y""y"y"y" y"y"ÿx"øx"ñx"êx"ãx"Üx"Õx"Îx"Çx"Àx"¹x"²x"«x"¤x"x"–x"x"ˆx"x"zx"sx"lx"ex"^x"Wx"Px"Ix"Bx";x"4x"-x"&x"x"x"x" x"x"üw"õw"îw"çw"àw"Ùw"Òw"Ëw"Äw"½w"¶w"¯w"¨w"¡w"šw"“w"Œw"…w"~w"ww"pw"iw"bw"[w"Tw"Mw"Fw"?w"8w"1w"*w"#w"w"w"w"w"w"ùv"òv"ëv"äv"Ýv"Öv"Ïv"Èv"Áv"ºv"³v"¬v"¥v"žv"—v"v"‰v"‚v"{v"tv"mv"fv"_v"Xv"Qv"Jv"Cv"r"7r"0r")r""r"r"r" r"r"ÿq"øq"ñq"êq"ãq"Üq"Õq"Îq"Çq"Àq"¹q"²q"«q"¤q"q"–q"q"ˆq"q"zq"sq"lq"eq"^q"Wq"Pq"Iq"Bq";q"4q"-q"&q"q"q"q" q"q"üp"õp"îp"çp"àp"Ùp"Òp"Ëp"Äp"½p"¶p"¯p"¨p"¡p"šp"“p"Œp"…p"~p"wp"pp"ip"bp"[p"Tp"Mp"Fp"?p"8p"1p"*p"#p"p"p"p"p"p"ùo"òo"ëo"äo"Ýo"Öo"Ïo"Èo"Áo"ºo"³o"¬o"¥o"žo"—o"o"‰o"‚o"{o"to"mo"fo"_o"Xo"Qo"Jo"Co"k"7k"0k")k""k"k"k" k"k"ÿj"øj"ñj"êj"ãj"Üj"Õj"Îj"Çj"Àj"¹j"²j"«j"¤j"j"–j"j"ˆj"j"zj"sj"lj"ej"^j"Wj"Pj"Ij"Bj";j"4j"-j"&j"j"j"j" j"j"üi"õi"îi"çi"ài"Ùi"Òi"Ëi"Äi"½i"¶i"¯i"¨i"¡i"ši"“i"Œi"…i"~i"wi"pi"ii"bi"[i"Ti"Mi"Fi"?i"8i"1i"*i"#i"i"i"i"i"i"ùh"òh"ëh"äh"Ýh"Öh"Ïh"Èh"Áh"ºh"³h"¬h"¥h"žh"—h"h"‰h"‚h"{h"th"mh"fh"_h"Xh"Qh"Jh"Ch"d"7d"0d")d""d"d"d" d"d"ÿc"øc"ñc"êc"ãc"Üc"Õc"Îc"Çc"Àc"¹c"²c"«c"¤c"c"–c"c"ˆc"c"zc"sc"lc"ec"^c"Wc"Pc"Ic"Bc";c"4c"-c"&c"c"c"c" c"c"üb"õb"îb"çb"àb"Ùb"Òb"Ëb"Äb"½b"¶b"¯b"¨b"¡b"šb"“b"Œb"…b"~b"wb"pb"ib"bb"[b"Tb"Mb"Fb"?b"8b"1b"*b"#b"b"b"b"b"b"ùa"òa"ëa"äa"Ýa"Öa"Ïa"Èa"Áa"ºa"³a"¬a"¥a"ža"—a"a"‰a"‚a"{a"ta"ma"fa"_a"Xa"Qa"Ja"Ca"]"7]"0]")]""]"]"]" ]"]"ÿ\"ø\"ñ\"ê\"ã\"Ü\"Õ\"Î\"Ç\"À\"¹\"²\"«\"¤\"\"–\"\"ˆ\"\"z\"s\"l\"e\"^\"W\"P\"I\"B\";\"4\"-\"&\"\"\"\" \"\"ü["õ["î["ç["à["Ù["Ò["Ë["Ä["½["¶["¯["¨["¡["š["“["Œ["…["~["w["p["i["b["[["T["M["F["?["8["1["*["#["["["["["["ùZ"òZ"ëZ"äZ"ÝZ"ÖZ"ÏZ"ÈZ"ÁZ"ºZ"³Z"¬Z"¥Z"žZ"—Z"Z"‰Z"‚Z"{Z"tZ"mZ"fZ"_Z"XZ"QZ"JZ"CZ"V"7V"0V")V""V"V"V" V"V"ÿU"øU"ñU"êU"ãU"ÜU"ÕU"ÎU"ÇU"ÀU"¹U"²U"«U"¤U"U"–U"U"ˆU"U"zU"sU"lU"eU"^U"WU"PU"IU"BU";U"4U"-U"&U"U"U"U" U"U"üT"õT"îT"çT"àT"ÙT"ÒT"ËT"ÄT"½T"¶T"¯T"¨T"¡T"šT"“T"ŒT"…T"~T"wT"pT"iT"bT"[T"TT"MT"FT"?T"8T"1T"*T"#T"T"T"T"T"T"ùS"òS"ëS"äS"ÝS"ÖS"ÏS"ÈS"ÁS"ºS"³S"¬S"¥S"žS"—S"S"‰S"‚S"{S"tS"mS"fS"_S"XS"QS"JS"CS"O"7O"0O")O""O"O"O" O"O"ÿN"øN"ñN"êN"ãN"ÜN"ÕN"ÎN"ÇN"ÀN"¹N"²N"«N"¤N"N"–N"N"ˆN"N"zN"sN"lN"eN"^N"WN"PN"IN"BN";N"4N"-N"&N"N"N"N" N"N"üM"õM"îM"çM"àM"ÙM"ÒM"ËM"ÄM"½M"¶M"¯M"¨M"¡M"šM"“M"ŒM"…M"~M"wM"pM"iM"bM"[M"TM"MM"FM"?M"8M"1M"*M"#M"M"M"M"M"M"ùL"òL"ëL"äL"ÝL"ÖL"ÏL"ÈL"ÁL"ºL"³L"¬L"¥L"žL"—L"L"‰L"‚L"{L"tL"mL"fL"_L"XL"QL"JL"CL"H"7H"0H")H""H"H"H" H"H"ÿG"øG"ñG"êG"ãG"ÜG"ÕG"ÎG"ÇG"ÀG"¹G"²G"«G"¤G"G"–G"G"ˆG"G"zG"sG"lG"eG"^G"WG"PG"IG"BG";G"4G"-G"&G"G"G"G" G"G"üF"õF"îF"çF"àF"ÙF"ÒF"ËF"ÄF"½F"¶F"¯F"¨F"¡F"šF"“F"ŒF"…F"~F"wF"pF"iF"bF"[F"TF"MF"FF"?F"8F"1F"*F"#F"F"F"F"F"F"ùE"òE"ëE"äE"ÝE"ÖE"ÏE"ÈE"ÁE"ºE"³E"¬E"¥E"žE"—E"E"‰E"‚E"{E"tE"mE"fE"_E"XE"QE"JE"CE"A"7A"0A")A""A"A"A" A"A"ÿ@"ø@"ñ@"ê@"ã@"Ü@"Õ@"Î@"Ç@"À@"¹@"²@"«@"¤@"@"–@"@"ˆ@"@"z@"s@"l@"e@"^@"W@"P@"I@"B@";@"4@"-@"&@"@"@"@" @"@"ü?"õ?"î?"ç?"à?"Ù?"Ò?"Ë?"Ä?"½?"¶?"¯?"¨?"¡?"š?"“?"Œ?"…?"~?"w?"p?"i?"b?"[?"T?"M?"F?"??"8?"1?"*?"#?"?"?"?"?"?"ù>"ò>"ë>"ä>"Ý>"Ö>"Ï>"È>"Á>"º>"³>"¬>"¥>"ž>"—>">"‰>"‚>"{>"t>"m>"f>"_>"X>"Q>"J>"C>"<>"5>".>"'>" >">">" >">"ý="ö="ï="è="á="Ú="Ó="Ì="Å="¾="·="°="©="¢="›="”="="†="="x="q="j="c="\="U="N="G="@="9="2="+="$="="="="="="ú<"ó<"ì<"å<"Þ<"×<"Ð<"É<"Â<"»<"´<"­<"¦<"Ÿ<"˜<"‘<"Š<"ƒ<"|<"u<"n<"g<"`<"Y<"R<"K<"D<"=<"6<"/<"(<"!<"<"<" <"<"þ;"÷;"ð;"é;"â;"Û;"Ô;"Í;"Æ;"¿;"¸;"±;"ª;"£;"œ;"•;"Ž;"‡;"€;"y;"r;"k;"d;"];"V;"O;"H;"A;":;"3;",;"%;";";";" ;";"û:"ô:"í:"æ:"ß:"Ø:"Ñ:"Ê:"Ã:"¼:"µ:"®:"§:" :"™:"’:"‹:"„:"}:"v:"o:"h:"a:"Z:"S:"L:"E:">:"7:"0:"):"":":":" :":"ÿ9"ø9"ñ9"ê9"ã9"Ü9"Õ9"Î9"Ç9"À9"¹9"²9"«9"¤9"9"–9"9"ˆ9"9"z9"s9"l9"e9"^9"W9"P9"I9"B9";9"49"-9"&9"9"9"9" 9"9"ü8"õ8"î8"ç8"à8"Ù8"Ò8"Ë8"Ä8"½8"¶8"¯8"¨8"¡8"š8"“8"Œ8"…8"~8"w8"p8"i8"b8"[8"T8"M8"F8"?8"88"18"*8"#8"8"8"8"8"8"ù7"ò7"ë7"ä7"Ý7"Ö7"Ï7"È7"Á7"º7"³7"¬7"¥7"ž7"—7"7"‰7"‚7"{7"t7"m7"f7"_7"X7"Q7"J7"C7"<7"57".7"'7" 7"7"7" 7"7"ý6"ö6"ï6"è6"á6"Ú6"Ó6"Ì6"Å6"¾6"·6"°6"©6"¢6"›6"”6"6"†6"6"x6"q6"j6"c6"\6"U6"N6"G6"@6"96"26"+6"$6"6"6"6"6"6"ú5"ó5"ì5"å5"Þ5"×5"Ð5"É5"Â5"»5"´5"­5"¦5"Ÿ5"˜5"‘5"Š5"ƒ5"|5"u5"n5"g5"`5"Y5"R5"K5"D5"=5"65"/5"(5"!5"5"5" 5"5"þ4"÷4"ð4"é4"â4"Û4"Ô4"Í4"Æ4"¿4"¸4"±4"ª4"£4"œ4"•4"Ž4"‡4"€4"y4"r4"k4"d4"]4"V4"O4"H4"A4":4"34",4"%4"4"4"4" 4"4"û3"ô3"í3"æ3"ß3"Ø3"Ñ3"Ê3"Ã3"¼3"µ3"®3"§3" 3"™3"’3"‹3"„3"}3"v3"o3"h3"a3"Z3"S3"L3"E3">3"73"03")3""3"3"3" 3"3"ÿ2"ø2"ñ2"ê2"ã2"Ü2"Õ2"Î2"Ç2"À2"¹2"²2"«2"¤2"2"–2"2"ˆ2"2"z2"s2"l2"e2"^2"W2"P2"I2"B2";2"42"-2"&2"2"2"2" 2"2"ü1"õ1"î1"ç1"à1"Ù1"Ò1"Ë1"Ä1"½1"¶1"¯1"¨1"¡1"š1"“1"Œ1"…1"~1"w1"p1"i1"b1"[1"T1"M1"F1"?1"81"11"*1"#1"1"1"1"1"1"ù0"ò0"ë0"ä0"Ý0"Ö0"Ï0"È0"Á0"º0"³0"¬0"¥0"ž0"—0"0"‰0"‚0"{0"t0"m0"f0"_0"X0"Q0"J0"C0"<0"50".0"'0" 0"0"0" 0"0"ý/"ö/"ï/"è/"á/"Ú/"Ó/"Ì/"Å/"¾/"·/"°/"©/"¢/"›/"”/"/"†/"/"x/"q/"j/"c/"\/"U/"N/"G/"@/"9/"2/"+/"$/"/"/"/"/"/"ú."ó."ì."å."Þ."×."Ð."É."Â."»."´."­."¦."Ÿ."˜."‘."Š."ƒ."|."u."n."g."`."Y."R."K."D."=."6."/."(."!."."." ."."þ-"÷-"ð-"é-"â-"Û-"Ô-"Í-"Æ-"¿-"¸-"±-"ª-"£-"œ-"•-"Ž-"‡-"€-"y-"r-"k-"d-"]-"V-"O-"H-"A-":-"3-",-"%-"-"-"-" -"-"û,"ô,"í,"æ,"ß,"Ø,"Ñ,"Ê,"Ã,"¼,"µ,"®,"§," ,"™,"’,"‹,"„,"},"v,"o,"h,"a,"Z,"S,"L,"E,">,"7,"0,"),"",","," ,","ÿ+"ø+"ñ+"ê+"ã+"Ü+"Õ+"Î+"Ç+"À+"¹+"²+"«+"¤+"+"–+"+"ˆ+"+"z+"s+"l+"e+"^+"W+"P+"I+"B+";+"4+"-+"&+"+"+"+" +"+"ü*"õ*"î*"ç*"à*"Ù*"Ò*"Ë*"Ä*"½*"¶*"¯*"¨*"¡*"š*"“*"Œ*"…*"~*"w*"p*"i*"b*"[*"T*"M*"F*"?*"8*"1*"**"#*"*"*"*"*"*"ù)"ò)"ë)"ä)"Ý)"Ö)"Ï)"È)"Á)"º)"³)"¬)"¥)"ž)"—)")"‰)"‚)"{)"t)"m)"f)"_)"X)"Q)"J)"C)"<)"5)".)"')" )")")" )")"ý("ö("ï("è("á("Ú("Ó("Ì("Å("¾("·("°("©("¢("›("”("("†("("x("q("j("c("\("U("N("G("@("9("2("+("$("("("("("("ú'"ó'"ì'"å'"Þ'"×'"Ð'"É'"Â'"»'"´'"­'"¦'"Ÿ'"˜'"‘'"Š'"ƒ'"|'"u'"n'"g'"`'"Y'"R'"K'"D'"='"6'"/'"('"!'"'"'" '"'"þ&"÷&"ð&"é&"â&"Û&"Ô&"Í&"Æ&"¿&"¸&"±&"ª&"£&"œ&"•&"Ž&"‡&"€&"y&"r&"k&"d&"]&"V&"O&"H&"A&":&"3&",&"%&"&"&"&" &"&"û%"ô%"í%"æ%"ß%"Ø%"Ñ%"Ê%"Ã%"¼%"µ%"®%"§%" %"™%"’%"‹%"„%"}%"v%"o%"h%"a%"Z%"S%"L%"E%">%"7%"0%")%""%"%"%" %"%"ÿ$"ø$"ñ$"ê$"ã$"Ü$"Õ$"Î$"Ç$"À$"¹$"²$"«$"¤$"$"–$"$"ˆ$"$"z$"s$"l$"e$"^$"W$"P$"I$"B$";$"4$"-$"&$"$"$"$" $"$"ü#"õ#"î#"ç#"à#"Ù#"Ò#"Ë#"Ä#"½#"¶#"¯#"¨#"¡#"š#"“#"Œ#"…#"~#"w#"p#"i#"b#"[#"T#"M#"F#"?#"8#"1#"*#"##"#"#"#"#"#"ù""ò""ë""ä""Ý""Ö""Ï""È""Á""º""³""¬""¥""ž""—""""‰""‚""{""t""m""f""_""X""Q""J""C""<""5"".""'"" """""" """"ý!"ö!"ï!"è!"á!"Ú!"Ó!"Ì!"Å!"¾!"·!"°!"©!"¢!"›!"”!"!"†!"!"x!"q!"j!"c!"\!"U!"N!"G!"@!"9!"2!"+!"$!"!"!"!"!"!"ú "ó "ì "å "Þ "× "Ð "É " "» "´ "­ "¦ "Ÿ "˜ "‘ "Š "ƒ "| "u "n "g "` "Y "R "K "D "= "6 "/ "( "! " " " " "þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù "ò "ë "ä "Ý "Ö "Ï "È "Á "º "³ "¬ "¥ "ž "— " "‰ "‚ "{ "t "m "f "_ "X "Q "J "C "< "5 ". "' " " " " " "ý "ö "ï "è "á "Ú "Ó "Ì "Å "¾ "· "° "© "¢ "› "” " "† " "x "q "j "c "\ "U "N "G "@ "9 "2 "+ "$ " " " " " "ú "ó "ì "å "Þ "× "Ð "É " "» "´ "­ "¦ "Ÿ "˜ "‘ "Š "ƒ "| "u "n "g "` "Y "R "K "D "= "6 "/ "( "! " " " " "þ "÷ "ð "é "â "Û "Ô "Í "Æ "¿ "¸ "± "ª "£ "œ "• "Ž "‡ "€ "y "r "k "d "] "V "O "H "A ": "3 ", "% " " " " " "û "ô "í "æ "ß "Ø "Ñ "Ê "à "¼ "µ "® "§ "  "™ "’ "‹ "„ "} "v "o "h "a "Z "S "L "E "> "7 "0 ") "" " " " " "ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ùÿ!òÿ!ëÿ!äÿ!Ýÿ!Öÿ!Ïÿ!Èÿ!Áÿ!ºÿ!³ÿ!¬ÿ!¥ÿ!žÿ!—ÿ!ÿ!‰ÿ!‚ÿ!{ÿ!tÿ!mÿ!fÿ!_ÿ!Xÿ!Qÿ!Jÿ!Cÿ!<ÿ!5ÿ!.ÿ!'ÿ! ÿ!ÿ!ÿ! ÿ!ÿ!ýþ!öþ!ïþ!èþ!áþ!Úþ!Óþ!Ìþ!Åþ!¾þ!·þ!°þ!©þ!¢þ!›þ!”þ!þ!†þ!þ!xþ!qþ!jþ!cþ!\þ!Uþ!Nþ!Gþ!@þ!9þ!2þ!+þ!$þ!þ!þ!þ!þ!þ!úý!óý!ìý!åý!Þý!×ý!Ðý!Éý!Âý!»ý!´ý!­ý!¦ý!Ÿý!˜ý!‘ý!Šý!ƒý!|ý!uý!ný!gý!`ý!Yý!Rý!Ký!Dý!=ý!6ý!/ý!(ý!!ý!ý!ý! ý!ý!þü!÷ü!ðü!éü!âü!Ûü!Ôü!Íü!Æü!¿ü!¸ü!±ü!ªü!£ü!œü!•ü!Žü!‡ü!€ü!yü!rü!kü!dü!]ü!Vü!Oü!Hü!Aü!:ü!3ü!,ü!%ü!ü!ü!ü! ü!ü!ûû!ôû!íû!æû!ßû!Øû!Ñû!Êû!Ãû!¼û!µû!®û!§û! û!™û!’û!‹û!„û!}û!vû!oû!hû!aû!Zû!Sû!Lû!Eû!>û!7û!0û!)û!"û!û!û! û!û!ÿú!øú!ñú!êú!ãú!Üú!Õú!Îú!Çú!Àú!¹ú!²ú!«ú!¤ú!ú!–ú!ú!ˆú!ú!zú!sú!lú!eú!^ú!Wú!Pú!Iú!Bú!;ú!4ú!-ú!&ú!ú!ú!ú! ú!ú!üù!õù!îù!çù!àù!Ùù!Òù!Ëù!Äù!½ù!¶ù!¯ù!¨ù!¡ù!šù!“ù!Œù!…ù!~ù!wù!pù!iù!bù![ù!Tù!Mù!Fù!?ù!8ù!1ù!*ù!#ù!ù!ù!ù!ù!ù!ùø!òø!ëø!äø!Ýø!Öø!Ïø!Èø!Áø!ºø!³ø!¬ø!¥ø!žø!—ø!ø!‰ø!‚ø!{ø!tø!mø!fø!_ø!Xø!Qø!Jø!Cø!<ø!5ø!.ø!'ø! ø!ø!ø! ø!ø!ý÷!ö÷!ï÷!è÷!á÷!Ú÷!Ó÷!Ì÷!Å÷!¾÷!·÷!°÷!©÷!¢÷!›÷!”÷!÷!†÷!÷!x÷!q÷!j÷!c÷!\÷!U÷!N÷!G÷!@÷!9÷!2÷!+÷!$÷!÷!÷!÷!÷!÷!úö!óö!ìö!åö!Þö!×ö!Ðö!Éö!Âö!»ö!´ö!­ö!¦ö!Ÿö!˜ö!‘ö!Šö!ƒö!|ö!uö!nö!gö!`ö!Yö!Rö!Kö!Dö!=ö!6ö!/ö!(ö!!ö!ö!ö! ö!ö!þõ!÷õ!ðõ!éõ!âõ!Ûõ!Ôõ!Íõ!Æõ!¿õ!¸õ!±õ!ªõ!£õ!œõ!•õ!Žõ!‡õ!€õ!yõ!rõ!kõ!dõ!]õ!Võ!Oõ!Hõ!Aõ!:õ!3õ!,õ!%õ!õ!õ!õ! õ!õ!ûô!ôô!íô!æô!ßô!Øô!Ñô!Êô!Ãô!¼ô!µô!®ô!§ô! ô!™ô!’ô!‹ô!„ô!}ô!vô!oô!hô!aô!Zô!Sô!Lô!Eô!>ô!7ô!0ô!)ô!"ô!ô!ô! ô!ô!ÿó!øó!ñó!êó!ãó!Üó!Õó!Îó!Çó!Àó!¹ó!²ó!«ó!¤ó!ó!–ó!ó!ˆó!ó!zó!só!ló!eó!^ó!Wó!Pó!Ió!Bó!;ó!4ó!-ó!&ó!ó!ó!ó! ó!ó!üò!õò!îò!çò!àò!Ùò!Òò!Ëò!Äò!½ò!¶ò!¯ò!¨ò!¡ò!šò!“ò!Œò!…ò!~ò!wò!pò!iò!bò![ò!Tò!Mò!Fò!?ò!8ò!1ò!*ò!#ò!ò!ò!ò!ò!ò!ùñ!òñ!ëñ!äñ!Ýñ!Öñ!Ïñ!Èñ!Áñ!ºñ!³ñ!¬ñ!¥ñ!žñ!—ñ!ñ!‰ñ!‚ñ!{ñ!tñ!mñ!fñ!_ñ!Xñ!Qñ!Jñ!Cñ!<ñ!5ñ!.ñ!'ñ! ñ!ñ!ñ! ñ!ñ!ýð!öð!ïð!èð!áð!Úð!Óð!Ìð!Åð!¾ð!·ð!°ð!©ð!¢ð!›ð!”ð!ð!†ð!ð!xð!qð!jð!cð!\ð!Uð!Nð!Gð!@ð!9ð!2ð!+ð!$ð!ð!ð!ð!ð!ð!úï!óï!ìï!åï!Þï!×ï!Ðï!Éï!Âï!»ï!´ï!­ï!¦ï!Ÿï!˜ï!‘ï!Šï!ƒï!|ï!uï!nï!gï!`ï!Yï!Rï!Kï!Dï!=ï!6ï!/ï!(ï!!ï!ï!ï! ï!ï!þî!÷î!ðî!éî!âî!Ûî!Ôî!Íî!Æî!¿î!¸î!±î!ªî!£î!œî!•î!Žî!‡î!€î!yî!rî!kî!dî!]î!Vî!Oî!Hî!Aî!:î!3î!,î!%î!î!î!î! î!î!ûí!ôí!íí!æí!ßí!Øí!Ñí!Êí!Ãí!¼í!µí!®í!§í! í!™í!’í!‹í!„í!}í!ví!oí!hí!aí!Zí!Sí!Lí!Eí!>í!7í!0í!)í!"í!í!í! í!í!ÿì!øì!ñì!êì!ãì!Üì!Õì!Îì!Çì!Àì!¹ì!²ì!«ì!¤ì!ì!–ì!ì!ˆì!ì!zì!sì!lì!eì!^ì!Wì!Pì!Iì!Bì!;ì!4ì!-ì!&ì!ì!ì!ì! ì!ì!üë!õë!îë!çë!àë!Ùë!Òë!Ëë!Äë!½ë!¶ë!¯ë!¨ë!¡ë!šë!“ë!Œë!…ë!~ë!wë!pë!ië!bë![ë!Të!Më!Fë!?ë!8ë!1ë!*ë!#ë!ë!ë!ë!ë!ë!ùê!òê!ëê!äê!Ýê!Öê!Ïê!Èê!Áê!ºê!³ê!¬ê!¥ê!žê!—ê!ê!‰ê!‚ê!{ê!tê!mê!fê!_ê!Xê!Qê!Jê!Cê!<ê!5ê!.ê!'ê! ê!ê!ê! ê!ê!ýé!öé!ïé!èé!áé!Úé!Óé!Ìé!Åé!¾é!·é!°é!©é!¢é!›é!”é!é!†é!é!xé!qé!jé!cé!\é!Ué!Né!Gé!@é!9é!2é!+é!$é!é!é!é!é!é!úè!óè!ìè!åè!Þè!×è!Ðè!Éè!Âè!»è!´è!­è!¦è!Ÿè!˜è!‘è!Šè!ƒè!|è!uè!nè!gè!`è!Yè!Rè!Kè!Dè!=è!6è!/è!(è!!è!è!è! è!è!þç!÷ç!ðç!éç!âç!Ûç!Ôç!Íç!Æç!¿ç!¸ç!±ç!ªç!£ç!œç!•ç!Žç!‡ç!€ç!yç!rç!kç!dç!]ç!Vç!Oç!Hç!Aç!:ç!3ç!,ç!%ç!ç!ç!ç! ç!ç!ûæ!ôæ!íæ!ææ!ßæ!Øæ!Ñæ!Êæ!Ãæ!¼æ!µæ!®æ!§æ! æ!™æ!’æ!‹æ!„æ!}æ!væ!oæ!hæ!aæ!Zæ!Sæ!Læ!Eæ!>æ!7æ!0æ!)æ!"æ!æ!æ! æ!æ!ÿå!øå!ñå!êå!ãå!Üå!Õå!Îå!Çå!Àå!¹å!²å!«å!¤å!å!–å!å!ˆå!å!zå!så!lå!eå!^å!Wå!På!Iå!Bå!;å!4å!-å!&å!å!å!å! å!å!üä!õä!îä!çä!àä!Ùä!Òä!Ëä!Ää!½ä!¶ä!¯ä!¨ä!¡ä!šä!“ä!Œä!…ä!~ä!wä!pä!iä!bä![ä!Tä!Mä!Fä!?ä!8ä!1ä!*ä!#ä!ä!ä!ä!ä!ä!ùã!òã!ëã!äã!Ýã!Öã!Ïã!Èã!Áã!ºã!³ã!¬ã!¥ã!žã!—ã!ã!‰ã!‚ã!{ã!tã!mã!fã!_ã!Xã!Qã!Jã!Cã!<ã!5ã!.ã!'ã! ã!ã!ã! ã!ã!ýâ!öâ!ïâ!èâ!áâ!Úâ!Óâ!Ìâ!Åâ!¾â!·â!°â!©â!¢â!›â!”â!â!†â!â!xâ!qâ!jâ!câ!\â!Uâ!Nâ!Gâ!@â!9â!2â!+â!$â!â!â!â!â!â!úá!óá!ìá!åá!Þá!×á!Ðá!Éá!Âá!»á!´á!­á!¦á!Ÿá!˜á!‘á!Šá!ƒá!|á!uá!ná!gá!`á!Yá!Rá!Ká!Dá!=á!6á!/á!(á!!á!á!á! á!á!þà!÷à!ðà!éà!âà!Ûà!Ôà!Íà!Æà!¿à!¸à!±à!ªà!£à!œà!•à!Žà!‡à!€à!yà!rà!kà!dà!]à!Và!Oà!Hà!Aà!:à!3à!,à!%à!à!à!à! à!à!ûß!ôß!íß!æß!ßß!Øß!Ñß!Êß!Ãß!¼ß!µß!®ß!§ß! ß!™ß!’ß!‹ß!„ß!}ß!vß!oß!hß!aß!Zß!Sß!Lß!Eß!>ß!7ß!0ß!)ß!"ß!ß!ß! ß!ß!ÿÞ!øÞ!ñÞ!êÞ!ãÞ!ÜÞ!ÕÞ!ÎÞ!ÇÞ!ÀÞ!¹Þ!²Þ!«Þ!¤Þ!Þ!–Þ!Þ!ˆÞ!Þ!zÞ!sÞ!lÞ!eÞ!^Þ!WÞ!PÞ!IÞ!BÞ!;Þ!4Þ!-Þ!&Þ!Þ!Þ!Þ! Þ!Þ!üÝ!õÝ!îÝ!çÝ!àÝ!ÙÝ!ÒÝ!ËÝ!ÄÝ!½Ý!¶Ý!¯Ý!¨Ý!¡Ý!šÝ!“Ý!ŒÝ!…Ý!~Ý!wÝ!pÝ!iÝ!bÝ![Ý!TÝ!MÝ!FÝ!?Ý!8Ý!1Ý!*Ý!#Ý!Ý!Ý!Ý!Ý!Ý!ùÜ!òÜ!ëÜ!äÜ!ÝÜ!ÖÜ!ÏÜ!ÈÜ!ÁÜ!ºÜ!³Ü!¬Ü!¥Ü!žÜ!—Ü!Ü!‰Ü!‚Ü!{Ü!tÜ!mÜ!fÜ!_Ü!XÜ!QÜ!JÜ!CÜ!<Ü!5Ü!.Ü!'Ü! Ü!Ü!Ü! Ü!Ü!ýÛ!öÛ!ïÛ!èÛ!áÛ!ÚÛ!ÓÛ!ÌÛ!ÅÛ!¾Û!·Û!°Û!©Û!¢Û!›Û!”Û!Û!†Û!Û!xÛ!qÛ!jÛ!cÛ!\Û!UÛ!NÛ!GÛ!@Û!9Û!2Û!+Û!$Û!Û!Û!Û!Û!Û!úÚ!óÚ!ìÚ!åÚ!ÞÚ!×Ú!ÐÚ!ÉÚ!ÂÚ!»Ú!´Ú!­Ú!¦Ú!ŸÚ!˜Ú!‘Ú!ŠÚ!ƒÚ!|Ú!uÚ!nÚ!gÚ!`Ú!YÚ!RÚ!KÚ!DÚ!=Ú!6Ú!/Ú!(Ú!!Ú!Ú!Ú! Ú!Ú!þÙ!÷Ù!ðÙ!éÙ!âÙ!ÛÙ!ÔÙ!ÍÙ!ÆÙ!¿Ù!¸Ù!±Ù!ªÙ!£Ù!œÙ!•Ù!ŽÙ!‡Ù!€Ù!yÙ!rÙ!kÙ!dÙ!]Ù!VÙ!OÙ!HÙ!AÙ!:Ù!3Ù!,Ù!%Ù!Ù!Ù!Ù! Ù!Ù!ûØ!ôØ!íØ!æØ!ߨ!ØØ!ÑØ!ÊØ!ÃØ!¼Ø!µØ!®Ø!§Ø! Ø!™Ø!’Ø!‹Ø!„Ø!}Ø!vØ!oØ!hØ!aØ!ZØ!SØ!LØ!EØ!>Ø!7Ø!0Ø!)Ø!"Ø!Ø!Ø! Ø!Ø!ÿ×!ø×!ñ×!ê×!ã×!Ü×!Õ×!Î×!Ç×!À×!¹×!²×!«×!¤×!×!–×!×!ˆ×!×!z×!s×!l×!e×!^×!W×!P×!I×!B×!;×!4×!-×!&×!×!×!×! ×!×!üÖ!õÖ!îÖ!çÖ!àÖ!ÙÖ!ÒÖ!ËÖ!ÄÖ!½Ö!¶Ö!¯Ö!¨Ö!¡Ö!šÖ!“Ö!ŒÖ!…Ö!~Ö!wÖ!pÖ!iÖ!bÖ![Ö!TÖ!MÖ!FÖ!?Ö!8Ö!1Ö!*Ö!#Ö!Ö!Ö!Ö!Ö!Ö!ùÕ!òÕ!ëÕ!äÕ!ÝÕ!ÖÕ!ÏÕ!ÈÕ!ÁÕ!ºÕ!³Õ!¬Õ!¥Õ!žÕ!—Õ!Õ!‰Õ!‚Õ!{Õ!tÕ!mÕ!fÕ!_Õ!XÕ!QÕ!JÕ!CÕ!<Õ!5Õ!.Õ!'Õ! Õ!Õ!Õ! Õ!Õ!ýÔ!öÔ!ïÔ!èÔ!áÔ!ÚÔ!ÓÔ!ÌÔ!ÅÔ!¾Ô!·Ô!°Ô!©Ô!¢Ô!›Ô!”Ô!Ô!†Ô!Ô!xÔ!qÔ!jÔ!cÔ!\Ô!UÔ!NÔ!GÔ!@Ô!9Ô!2Ô!+Ô!$Ô!Ô!Ô!Ô!Ô!Ô!úÓ!óÓ!ìÓ!åÓ!ÞÓ!×Ó!ÐÓ!ÉÓ!ÂÓ!»Ó!´Ó!­Ó!¦Ó!ŸÓ!˜Ó!‘Ó!ŠÓ!ƒÓ!|Ó!uÓ!nÓ!gÓ!`Ó!YÓ!RÓ!KÓ!DÓ!=Ó!6Ó!/Ó!(Ó!!Ó!Ó!Ó! Ó!Ó!þÒ!÷Ò!ðÒ!éÒ!âÒ!ÛÒ!ÔÒ!ÍÒ!ÆÒ!¿Ò!¸Ò!±Ò!ªÒ!£Ò!œÒ!•Ò!ŽÒ!‡Ò!€Ò!yÒ!rÒ!kÒ!dÒ!]Ò!VÒ!OÒ!HÒ!AÒ!:Ò!3Ò!,Ò!%Ò!Ò!Ò!Ò! Ò!Ò!ûÑ!ôÑ!íÑ!æÑ!ßÑ!ØÑ!ÑÑ!ÊÑ!ÃÑ!¼Ñ!µÑ!®Ñ!§Ñ! Ñ!™Ñ!’Ñ!‹Ñ!„Ñ!}Ñ!vÑ!oÑ!hÑ!aÑ!ZÑ!SÑ!LÑ!EÑ!>Ñ!7Ñ!0Ñ!)Ñ!"Ñ!Ñ!Ñ! Ñ!Ñ!ÿÐ!øÐ!ñÐ!êÐ!ãÐ!ÜÐ!ÕÐ!ÎÐ!ÇÐ!ÀÐ!¹Ð!²Ð!«Ð!¤Ð!Ð!–Ð!Ð!ˆÐ!Ð!zÐ!sÐ!lÐ!eÐ!^Ð!WÐ!PÐ!IÐ!BÐ!;Ð!4Ð!-Ð!&Ð!Ð!Ð!Ð! Ð!Ð!üÏ!õÏ!îÏ!çÏ!àÏ!ÙÏ!ÒÏ!ËÏ!ÄÏ!½Ï!¶Ï!¯Ï!¨Ï!¡Ï!šÏ!“Ï!ŒÏ!…Ï!~Ï!wÏ!pÏ!iÏ!bÏ![Ï!TÏ!MÏ!FÏ!?Ï!8Ï!1Ï!*Ï!#Ï!Ï!Ï!Ï!Ï!Ï!ùÎ!òÎ!ëÎ!äÎ!ÝÎ!ÖÎ!ÏÎ!ÈÎ!ÁÎ!ºÎ!³Î!¬Î!¥Î!žÎ!—Î!Î!‰Î!‚Î!{Î!tÎ!mÎ!fÎ!_Î!XÎ!QÎ!JÎ!CÎ!<Î!5Î!.Î!'Î! Î!Î!Î! Î!Î!ýÍ!öÍ!ïÍ!èÍ!áÍ!ÚÍ!ÓÍ!ÌÍ!ÅÍ!¾Í!·Í!°Í!©Í!¢Í!›Í!”Í!Í!†Í!Í!xÍ!qÍ!jÍ!cÍ!\Í!UÍ!NÍ!GÍ!@Í!9Í!2Í!+Í!$Í!Í!Í!Í!Í!Í!úÌ!óÌ!ìÌ!åÌ!ÞÌ!×Ì!ÐÌ!ÉÌ!ÂÌ!»Ì!´Ì!­Ì!¦Ì!ŸÌ!˜Ì!‘Ì!ŠÌ!ƒÌ!|Ì!uÌ!nÌ!gÌ!`Ì!YÌ!RÌ!KÌ!DÌ!=Ì!6Ì!/Ì!(Ì!!Ì!Ì!Ì! Ì!Ì!þË!÷Ë!ðË!éË!âË!ÛË!ÔË!ÍË!ÆË!¿Ë!¸Ë!±Ë!ªË!£Ë!œË!•Ë!ŽË!‡Ë!€Ë!yË!rË!kË!dË!]Ë!VË!OË!HË!AË!:Ë!3Ë!,Ë!%Ë!Ë!Ë!Ë! Ë!Ë!ûÊ!ôÊ!íÊ!æÊ!ßÊ!ØÊ!ÑÊ!ÊÊ!ÃÊ!¼Ê!µÊ!®Ê!§Ê! Ê!™Ê!’Ê!‹Ê!„Ê!}Ê!vÊ!oÊ!hÊ!aÊ!ZÊ!SÊ!LÊ!EÊ!>Ê!7Ê!0Ê!)Ê!"Ê!Ê!Ê! Ê!Ê!ÿÉ!øÉ!ñÉ!êÉ!ãÉ!ÜÉ!ÕÉ!ÎÉ!ÇÉ!ÀÉ!¹É!²É!«É!¤É!É!–É!É!ˆÉ!É!zÉ!sÉ!lÉ!eÉ!^É!WÉ!PÉ!IÉ!BÉ!;É!4É!-É!&É!É!É!É! É!É!üÈ!õÈ!îÈ!çÈ!àÈ!ÙÈ!ÒÈ!ËÈ!ÄÈ!½È!¶È!¯È!¨È!¡È!šÈ!“È!ŒÈ!…È!~È!wÈ!pÈ!iÈ!bÈ![È!TÈ!MÈ!FÈ!?È!8È!1È!*È!#È!È!È!È!È!È!ùÇ!òÇ!ëÇ!äÇ!ÝÇ!ÖÇ!ÏÇ!ÈÇ!ÁÇ!ºÇ!³Ç!¬Ç!¥Ç!žÇ!—Ç!Ç!‰Ç!‚Ç!{Ç!tÇ!mÇ!fÇ!_Ç!XÇ!QÇ!JÇ!CÇ!<Ç!5Ç!.Ç!'Ç! Ç!Ç!Ç! Ç!Ç!ýÆ!öÆ!ïÆ!èÆ!áÆ!ÚÆ!ÓÆ!ÌÆ!ÅÆ!¾Æ!·Æ!°Æ!©Æ!¢Æ!›Æ!”Æ!Æ!†Æ!Æ!xÆ!qÆ!jÆ!cÆ!\Æ!UÆ!NÆ!GÆ!@Æ!9Æ!2Æ!+Æ!$Æ!Æ!Æ!Æ!Æ!Æ!úÅ!óÅ!ìÅ!åÅ!ÞÅ!×Å!ÐÅ!ÉÅ!ÂÅ!»Å!´Å!­Å!¦Å!ŸÅ!˜Å!‘Å!ŠÅ!ƒÅ!|Å!uÅ!nÅ!gÅ!`Å!YÅ!RÅ!KÅ!DÅ!=Å!6Å!/Å!(Å!!Å!Å!Å! Å!Å!þÄ!÷Ä!ðÄ!éÄ!âÄ!ÛÄ!ÔÄ!ÍÄ!ÆÄ!¿Ä!¸Ä!±Ä!ªÄ!£Ä!œÄ!•Ä!ŽÄ!‡Ä!€Ä!yÄ!rÄ!kÄ!dÄ!]Ä!VÄ!OÄ!HÄ!AÄ!:Ä!3Ä!,Ä!%Ä!Ä!Ä!Ä! Ä!Ä!ûÃ!ôÃ!íÃ!æÃ!ßÃ!ØÃ!ÑÃ!ÊÃ!ÃÃ!¼Ã!µÃ!®Ã!§Ã! Ã!™Ã!’Ã!‹Ã!„Ã!}Ã!vÃ!oÃ!hÃ!aÃ!ZÃ!SÃ!LÃ!EÃ!>Ã!7Ã!0Ã!)Ã!"Ã!Ã!Ã! Ã!Ã!ÿÂ!øÂ!ñÂ!êÂ!ãÂ!ÜÂ!ÕÂ!ÎÂ!ÇÂ!ÀÂ!¹Â!²Â!«Â!¤Â!Â!–Â!Â!ˆÂ!Â!zÂ!sÂ!lÂ!eÂ!^Â!WÂ!PÂ!IÂ!BÂ!;Â!4Â!-Â!&Â!Â!Â!Â! Â!Â!üÁ!õÁ!îÁ!çÁ!àÁ!ÙÁ!ÒÁ!ËÁ!ÄÁ!½Á!¶Á!¯Á!¨Á!¡Á!šÁ!“Á!ŒÁ!…Á!~Á!wÁ!pÁ!iÁ!bÁ![Á!TÁ!MÁ!FÁ!?Á!8Á!1Á!*Á!#Á!Á!Á!Á!Á!Á!ùÀ!òÀ!ëÀ!äÀ!ÝÀ!ÖÀ!ÏÀ!ÈÀ!ÁÀ!ºÀ!³À!¬À!¥À!žÀ!—À!À!‰À!‚À!{À!tÀ!mÀ!fÀ!_À!XÀ!QÀ!JÀ!CÀ!<À!5À!.À!'À! À!À!À! À!À!ý¿!ö¿!ï¿!è¿!á¿!Ú¿!Ó¿!Ì¿!Å¿!¾¿!·¿!°¿!©¿!¢¿!›¿!”¿!¿!†¿!¿!x¿!q¿!j¿!c¿!\¿!U¿!N¿!G¿!@¿!9¿!2¿!+¿!$¿!¿!¿!¿!¿!¿!ú¾!ó¾!ì¾!å¾!Þ¾!×¾!о!ɾ!¾!»¾!´¾!­¾!¦¾!Ÿ¾!˜¾!‘¾!о!ƒ¾!|¾!u¾!n¾!g¾!`¾!Y¾!R¾!K¾!D¾!=¾!6¾!/¾!(¾!!¾!¾!¾! ¾!¾!þ½!÷½!ð½!é½!â½!Û½!Ô½!ͽ!ƽ!¿½!¸½!±½!ª½!£½!œ½!•½!޽!‡½!€½!y½!r½!k½!d½!]½!V½!O½!H½!A½!:½!3½!,½!%½!½!½!½! ½!½!û¼!ô¼!í¼!æ¼!ß¼!ؼ!Ѽ!ʼ!ü!¼¼!µ¼!®¼!§¼! ¼!™¼!’¼!‹¼!„¼!}¼!v¼!o¼!h¼!a¼!Z¼!S¼!L¼!E¼!>¼!7¼!0¼!)¼!"¼!¼!¼! ¼!¼!ÿ»!ø»!ñ»!ê»!ã»!Ü»!Õ»!λ!Ç»!À»!¹»!²»!«»!¤»!»!–»!»!ˆ»!»!z»!s»!l»!e»!^»!W»!P»!I»!B»!;»!4»!-»!&»!»!»!»! »!»!üº!õº!îº!çº!àº!Ùº!Òº!˺!ĺ!½º!¶º!¯º!¨º!¡º!šº!“º!Œº!…º!~º!wº!pº!iº!bº![º!Tº!Mº!Fº!?º!8º!1º!*º!#º!º!º!º!º!º!ù¹!ò¹!ë¹!ä¹!ݹ!Ö¹!Ϲ!ȹ!Á¹!º¹!³¹!¬¹!¥¹!ž¹!—¹!¹!‰¹!‚¹!{¹!t¹!m¹!f¹!_¹!X¹!Q¹!J¹!C¹!<¹!5¹!.¹!'¹! ¹!¹!¹! ¹!¹!ý¸!ö¸!ï¸!è¸!á¸!Ú¸!Ó¸!̸!Ÿ!¾¸!·¸!°¸!©¸!¢¸!›¸!”¸!¸!†¸!¸!x¸!q¸!j¸!c¸!\¸!U¸!N¸!G¸!@¸!9¸!2¸!+¸!$¸!¸!¸!¸!¸!¸!ú·!ó·!ì·!å·!Þ·!×·!з!É·!·!»·!´·!­·!¦·!Ÿ·!˜·!‘·!Š·!ƒ·!|·!u·!n·!g·!`·!Y·!R·!K·!D·!=·!6·!/·!(·!!·!·!·! ·!·!þ¶!÷¶!ð¶!é¶!â¶!Û¶!Ô¶!Ͷ!ƶ!¿¶!¸¶!±¶!ª¶!£¶!œ¶!•¶!޶!‡¶!€¶!y¶!r¶!k¶!d¶!]¶!V¶!O¶!H¶!A¶!:¶!3¶!,¶!%¶!¶!¶!¶! ¶!¶!ûµ!ôµ!íµ!æµ!ßµ!ص!ѵ!ʵ!õ!¼µ!µµ!®µ!§µ! µ!™µ!’µ!‹µ!„µ!}µ!vµ!oµ!hµ!aµ!Zµ!Sµ!Lµ!Eµ!>µ!7µ!0µ!)µ!"µ!µ!µ! µ!µ!ÿ´!ø´!ñ´!ê´!ã´!Ü´!Õ´!δ!Ç´!À´!¹´!²´!«´!¤´!´!–´!´!ˆ´!´!z´!s´!l´!e´!^´!W´!P´!I´!B´!;´!4´!-´!&´!´!´!´! ´!´!ü³!õ³!î³!ç³!à³!Ù³!Ò³!˳!ij!½³!¶³!¯³!¨³!¡³!š³!“³!Œ³!…³!~³!w³!p³!i³!b³![³!T³!M³!F³!?³!8³!1³!*³!#³!³!³!³!³!³!ù²!ò²!ë²!ä²!ݲ!Ö²!ϲ!Ȳ!Á²!º²!³²!¬²!¥²!ž²!—²!²!‰²!‚²!{²!t²!m²!f²!_²!X²!Q²!J²!C²!<²!5²!.²!'²! ²!²!²! ²!²!ý±!ö±!ï±!è±!á±!Ú±!Ó±!̱!ű!¾±!·±!°±!©±!¢±!›±!”±!±!†±!±!x±!q±!j±!c±!\±!U±!N±!G±!@±!9±!2±!+±!$±!±!±!±!±!±!ú°!ó°!ì°!å°!Þ°!×°!а!ɰ!°!»°!´°!­°!¦°!Ÿ°!˜°!‘°!а!ƒ°!|°!u°!n°!g°!`°!Y°!R°!K°!D°!=°!6°!/°!(°!!°!°!°! °!°!þ¯!÷¯!ð¯!é¯!â¯!Û¯!Ô¯!ͯ!Ư!¿¯!¸¯!±¯!ª¯!£¯!œ¯!•¯!ޝ!‡¯!€¯!y¯!r¯!k¯!d¯!]¯!V¯!O¯!H¯!A¯!:¯!3¯!,¯!%¯!¯!¯!¯! ¯!¯!û®!ô®!í®!æ®!ß®!Ø®!Ñ®!Ê®!î!¼®!µ®!®®!§®! ®!™®!’®!‹®!„®!}®!v®!o®!h®!a®!Z®!S®!L®!E®!>®!7®!0®!)®!"®!®!®! ®!®!ÿ­!ø­!ñ­!ê­!ã­!Ü­!Õ­!έ!Ç­!À­!¹­!²­!«­!¤­!­!–­!­!ˆ­!­!z­!s­!l­!e­!^­!W­!P­!I­!B­!;­!4­!-­!&­!­!­!­! ­!­!ü¬!õ¬!î¬!ç¬!à¬!Ù¬!Ò¬!ˬ!Ĭ!½¬!¶¬!¯¬!¨¬!¡¬!š¬!“¬!Œ¬!…¬!~¬!w¬!p¬!i¬!b¬![¬!T¬!M¬!F¬!?¬!8¬!1¬!*¬!#¬!¬!¬!¬!¬!¬!ù«!ò«!ë«!ä«!Ý«!Ö«!Ï«!È«!Á«!º«!³«!¬«!¥«!ž«!—«!«!‰«!‚«!{«!t«!m«!f«!_«!X«!Q«!J«!C«!<«!5«!.«!'«! «!«!«! «!«!ýª!öª!ïª!èª!áª!Úª!Óª!̪!Ū!¾ª!·ª!°ª!©ª!¢ª!›ª!”ª!ª!†ª!ª!xª!qª!jª!cª!\ª!Uª!Nª!Gª!@ª!9ª!2ª!+ª!$ª!ª!ª!ª!ª!ª!ú©!ó©!ì©!å©!Þ©!ש!Щ!É©!©!»©!´©!­©!¦©!Ÿ©!˜©!‘©!Š©!ƒ©!|©!u©!n©!g©!`©!Y©!R©!K©!D©!=©!6©!/©!(©!!©!©!©! ©!©!þ¨!÷¨!ð¨!é¨!â¨!Û¨!Ô¨!ͨ!ƨ!¿¨!¸¨!±¨!ª¨!£¨!œ¨!•¨!ލ!‡¨!€¨!y¨!r¨!k¨!d¨!]¨!V¨!O¨!H¨!A¨!:¨!3¨!,¨!%¨!¨!¨!¨! ¨!¨!û§!ô§!í§!æ§!ß§!ا!ѧ!ʧ!ç!¼§!µ§!®§!§§! §!™§!’§!‹§!„§!}§!v§!o§!h§!a§!Z§!S§!L§!E§!>§!7§!0§!)§!"§!§!§! §!§!ÿ¦!ø¦!ñ¦!ê¦!ã¦!ܦ!Õ¦!Φ!Ǧ!À¦!¹¦!²¦!«¦!¤¦!¦!–¦!¦!ˆ¦!¦!z¦!s¦!l¦!e¦!^¦!W¦!P¦!I¦!B¦!;¦!4¦!-¦!&¦!¦!¦!¦! ¦!¦!ü¥!õ¥!î¥!ç¥!à¥!Ù¥!Ò¥!Ë¥!Ä¥!½¥!¶¥!¯¥!¨¥!¡¥!š¥!“¥!Œ¥!…¥!~¥!w¥!p¥!i¥!b¥![¥!T¥!M¥!F¥!?¥!8¥!1¥!*¥!#¥!¥!¥!¥!¥!¥!ù¤!ò¤!ë¤!ä¤!ݤ!Ö¤!Ϥ!Ȥ!Á¤!º¤!³¤!¬¤!¥¤!ž¤!—¤!¤!‰¤!‚¤!{¤!t¤!m¤!f¤!_¤!X¤!Q¤!J¤!C¤!<¤!5¤!.¤!'¤! ¤!¤!¤! ¤!¤!ý£!ö£!ï£!è£!á£!Ú£!Ó£!Ì£!Å£!¾£!·£!°£!©£!¢£!›£!”£!£!†£!£!x£!q£!j£!c£!\£!U£!N£!G£!@£!9£!2£!+£!$£!£!£!£!£!£!ú¢!ó¢!ì¢!å¢!Þ¢!×¢!Т!É¢!¢!»¢!´¢!­¢!¦¢!Ÿ¢!˜¢!‘¢!Š¢!ƒ¢!|¢!u¢!n¢!g¢!`¢!Y¢!R¢!K¢!D¢!=¢!6¢!/¢!(¢!!¢!¢!¢! ¢!¢!þ¡!÷¡!ð¡!é¡!â¡!Û¡!Ô¡!Í¡!Æ¡!¿¡!¸¡!±¡!ª¡!£¡!œ¡!•¡!Ž¡!‡¡!€¡!y¡!r¡!k¡!d¡!]¡!V¡!O¡!H¡!A¡!:¡!3¡!,¡!%¡!¡!¡!¡! ¡!¡!û !ô !í !æ !ß !Ø !Ñ !Ê !à!¼ !µ !® !§ !  !™ !’ !‹ !„ !} !v !o !h !a !Z !S !L !E !> !7 !0 !) !" ! ! !  ! !ÿŸ!øŸ!ñŸ!êŸ!ãŸ!ÜŸ!ÕŸ!Ο!ÇŸ!ÀŸ!¹Ÿ!²Ÿ!«Ÿ!¤Ÿ!Ÿ!–Ÿ!Ÿ!ˆŸ!Ÿ!zŸ!sŸ!lŸ!eŸ!^Ÿ!WŸ!PŸ!IŸ!BŸ!;Ÿ!4Ÿ!-Ÿ!&Ÿ!Ÿ!Ÿ!Ÿ! Ÿ!Ÿ!üž!õž!îž!çž!àž!Ùž!Òž!Ëž!Äž!½ž!¶ž!¯ž!¨ž!¡ž!šž!“ž!Œž!…ž!~ž!wž!pž!iž!bž![ž!Tž!Mž!Fž!?ž!8ž!1ž!*ž!#ž!ž!ž!ž!ž!ž!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!™!7™!0™!)™!"™!™!™! ™!™!ÿ˜!ø˜!ñ˜!ê˜!ã˜!ܘ!Õ˜!Θ!ǘ!À˜!¹˜!²˜!«˜!¤˜!˜!–˜!˜!ˆ˜!˜!z˜!s˜!l˜!e˜!^˜!W˜!P˜!I˜!B˜!;˜!4˜!-˜!&˜!˜!˜!˜! ˜!˜!ü—!õ—!î—!ç—!à—!Ù—!Ò—!Ë—!Ä—!½—!¶—!¯—!¨—!¡—!š—!“—!Œ—!…—!~—!w—!p—!i—!b—![—!T—!M—!F—!?—!8—!1—!*—!#—!—!—!—!—!—!ù–!ò–!ë–!ä–!Ý–!Ö–!Ï–!È–!Á–!º–!³–!¬–!¥–!ž–!—–!–!‰–!‚–!{–!t–!m–!f–!_–!X–!Q–!J–!C–!<–!5–!.–!'–! –!–!–! –!–!ý•!ö•!ï•!è•!á•!Ú•!Ó•!Ì•!Å•!¾•!·•!°•!©•!¢•!›•!”•!•!†•!•!x•!q•!j•!c•!\•!U•!N•!G•!@•!9•!2•!+•!$•!•!•!•!•!•!ú”!ó”!ì”!å”!Þ”!×”!Д!É”!”!»”!´”!­”!¦”!Ÿ”!˜”!‘”!Š”!ƒ”!|”!u”!n”!g”!`”!Y”!R”!K”!D”!=”!6”!/”!(”!!”!”!”! ”!”!þ“!÷“!ð“!é“!â“!Û“!Ô“!Í“!Æ“!¿“!¸“!±“!ª“!£“!œ“!•“!Ž“!‡“!€“!y“!r“!k“!d“!]“!V“!O“!H“!A“!:“!3“!,“!%“!“!“!“! “!“!û’!ô’!í’!æ’!ß’!Ø’!Ñ’!Ê’!Ã’!¼’!µ’!®’!§’! ’!™’!’’!‹’!„’!}’!v’!o’!h’!a’!Z’!S’!L’!E’!>’!7’!0’!)’!"’!’!’! ’!’!ÿ‘!ø‘!ñ‘!ê‘!ã‘!Ü‘!Õ‘!Α!Ç‘!À‘!¹‘!²‘!«‘!¤‘!‘!–‘!‘!ˆ‘!‘!z‘!s‘!l‘!e‘!^‘!W‘!P‘!I‘!B‘!;‘!4‘!-‘!&‘!‘!‘!‘! ‘!‘!ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!‹!7‹!0‹!)‹!"‹!‹!‹! ‹!‹!ÿŠ!øŠ!ñŠ!êŠ!ãŠ!ÜŠ!ÕŠ!Ί!ÇŠ!ÀŠ!¹Š!²Š!«Š!¤Š!Š!–Š!Š!ˆŠ!Š!zŠ!sŠ!lŠ!eŠ!^Š!WŠ!PŠ!IŠ!BŠ!;Š!4Š!-Š!&Š!Š!Š!Š! Š!Š!ü‰!õ‰!î‰!ç‰!à‰!Ù‰!Ò‰!ˉ!ĉ!½‰!¶‰!¯‰!¨‰!¡‰!š‰!“‰!Œ‰!…‰!~‰!w‰!p‰!i‰!b‰![‰!T‰!M‰!F‰!?‰!8‰!1‰!*‰!#‰!‰!‰!‰!‰!‰!ùˆ!òˆ!ëˆ!äˆ!݈!Öˆ!ψ!Ȉ!Áˆ!ºˆ!³ˆ!¬ˆ!¥ˆ!žˆ!—ˆ!ˆ!‰ˆ!‚ˆ!{ˆ!tˆ!mˆ!fˆ!_ˆ!Xˆ!Qˆ!Jˆ!Cˆ!<ˆ!5ˆ!.ˆ!'ˆ! ˆ!ˆ!ˆ! ˆ!ˆ!ý‡!ö‡!ï‡!è‡!á‡!Ú‡!Ó‡!̇!Ň!¾‡!·‡!°‡!©‡!¢‡!›‡!”‡!‡!†‡!‡!x‡!q‡!j‡!c‡!\‡!U‡!N‡!G‡!@‡!9‡!2‡!+‡!$‡!‡!‡!‡!‡!‡!ú†!ó†!ì†!å†!Þ†!׆!І!Ɇ!†!»†!´†!­†!¦†!Ÿ†!˜†!‘†!І!ƒ†!|†!u†!n†!g†!`†!Y†!R†!K†!D†!=†!6†!/†!(†!!†!†!†! †!†!þ…!÷…!ð…!é…!â…!Û…!Ô…!Í…!Æ…!¿…!¸…!±…!ª…!£…!œ…!•…!Ž…!‡…!€…!y…!r…!k…!d…!]…!V…!O…!H…!A…!:…!3…!,…!%…!…!…!…! …!…!û„!ô„!í„!æ„!ß„!Ø„!Ñ„!Ê„!Ä!¼„!µ„!®„!§„! „!™„!’„!‹„!„„!}„!v„!o„!h„!a„!Z„!S„!L„!E„!>„!7„!0„!)„!"„!„!„! „!„!ÿƒ!øƒ!ñƒ!êƒ!ãƒ!܃!Õƒ!΃!ǃ!Àƒ!¹ƒ!²ƒ!«ƒ!¤ƒ!ƒ!–ƒ!ƒ!ˆƒ!ƒ!zƒ!sƒ!lƒ!eƒ!^ƒ!Wƒ!Pƒ!Iƒ!Bƒ!;ƒ!4ƒ!-ƒ!&ƒ!ƒ!ƒ!ƒ! ƒ!ƒ!ü‚!õ‚!î‚!ç‚!à‚!Ù‚!Ò‚!Ë‚!Ä‚!½‚!¶‚!¯‚!¨‚!¡‚!š‚!“‚!Œ‚!…‚!~‚!w‚!p‚!i‚!b‚![‚!T‚!M‚!F‚!?‚!8‚!1‚!*‚!#‚!‚!‚!‚!‚!‚!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!}!7}!0}!)}!"}!}!}! }!}!ÿ|!ø|!ñ|!ê|!ã|!Ü|!Õ|!Î|!Ç|!À|!¹|!²|!«|!¤|!|!–|!|!ˆ|!|!z|!s|!l|!e|!^|!W|!P|!I|!B|!;|!4|!-|!&|!|!|!|! |!|!ü{!õ{!î{!ç{!à{!Ù{!Ò{!Ë{!Ä{!½{!¶{!¯{!¨{!¡{!š{!“{!Œ{!…{!~{!w{!p{!i{!b{![{!T{!M{!F{!?{!8{!1{!*{!#{!{!{!{!{!{!ùz!òz!ëz!äz!Ýz!Öz!Ïz!Èz!Áz!ºz!³z!¬z!¥z!žz!—z!z!‰z!‚z!{z!tz!mz!fz!_z!Xz!Qz!Jz!Cz!v!7v!0v!)v!"v!v!v! v!v!ÿu!øu!ñu!êu!ãu!Üu!Õu!Îu!Çu!Àu!¹u!²u!«u!¤u!u!–u!u!ˆu!u!zu!su!lu!eu!^u!Wu!Pu!Iu!Bu!;u!4u!-u!&u!u!u!u! u!u!üt!õt!ît!çt!àt!Ùt!Òt!Ët!Ät!½t!¶t!¯t!¨t!¡t!št!“t!Œt!…t!~t!wt!pt!it!bt![t!Tt!Mt!Ft!?t!8t!1t!*t!#t!t!t!t!t!t!ùs!òs!ës!äs!Ýs!Ös!Ïs!Ès!Ás!ºs!³s!¬s!¥s!žs!—s!s!‰s!‚s!{s!ts!ms!fs!_s!Xs!Qs!Js!Cs!o!7o!0o!)o!"o!o!o! o!o!ÿn!øn!ñn!ên!ãn!Ün!Õn!În!Çn!Àn!¹n!²n!«n!¤n!n!–n!n!ˆn!n!zn!sn!ln!en!^n!Wn!Pn!In!Bn!;n!4n!-n!&n!n!n!n! n!n!üm!õm!îm!çm!àm!Ùm!Òm!Ëm!Äm!½m!¶m!¯m!¨m!¡m!šm!“m!Œm!…m!~m!wm!pm!im!bm![m!Tm!Mm!Fm!?m!8m!1m!*m!#m!m!m!m!m!m!ùl!òl!ël!äl!Ýl!Öl!Ïl!Èl!Ál!ºl!³l!¬l!¥l!žl!—l!l!‰l!‚l!{l!tl!ml!fl!_l!Xl!Ql!Jl!Cl!h!7h!0h!)h!"h!h!h! h!h!ÿg!øg!ñg!êg!ãg!Üg!Õg!Îg!Çg!Àg!¹g!²g!«g!¤g!g!–g!g!ˆg!g!zg!sg!lg!eg!^g!Wg!Pg!Ig!Bg!;g!4g!-g!&g!g!g!g! g!g!üf!õf!îf!çf!àf!Ùf!Òf!Ëf!Äf!½f!¶f!¯f!¨f!¡f!šf!“f!Œf!…f!~f!wf!pf!if!bf![f!Tf!Mf!Ff!?f!8f!1f!*f!#f!f!f!f!f!f!ùe!òe!ëe!äe!Ýe!Öe!Ïe!Èe!Áe!ºe!³e!¬e!¥e!že!—e!e!‰e!‚e!{e!te!me!fe!_e!Xe!Qe!Je!Ce!a!7a!0a!)a!"a!a!a! a!a!ÿ`!ø`!ñ`!ê`!ã`!Ü`!Õ`!Î`!Ç`!À`!¹`!²`!«`!¤`!`!–`!`!ˆ`!`!z`!s`!l`!e`!^`!W`!P`!I`!B`!;`!4`!-`!&`!`!`!`! `!`!ü_!õ_!î_!ç_!à_!Ù_!Ò_!Ë_!Ä_!½_!¶_!¯_!¨_!¡_!š_!“_!Œ_!…_!~_!w_!p_!i_!b_![_!T_!M_!F_!?_!8_!1_!*_!#_!_!_!_!_!_!ù^!ò^!ë^!ä^!Ý^!Ö^!Ï^!È^!Á^!º^!³^!¬^!¥^!ž^!—^!^!‰^!‚^!{^!t^!m^!f^!_^!X^!Q^!J^!C^!<^!5^!.^!'^! ^!^!^! ^!^!ý]!ö]!ï]!è]!á]!Ú]!Ó]!Ì]!Å]!¾]!·]!°]!©]!¢]!›]!”]!]!†]!]!x]!q]!j]!c]!\]!U]!N]!G]!@]!9]!2]!+]!$]!]!]!]!]!]!ú\!ó\!ì\!å\!Þ\!×\!Ð\!É\!Â\!»\!´\!­\!¦\!Ÿ\!˜\!‘\!Š\!ƒ\!|\!u\!n\!g\!`\!Y\!R\!K\!D\!=\!6\!/\!(\!!\!\!\! \!\!þ[!÷[!ð[!é[!â[!Û[!Ô[!Í[!Æ[!¿[!¸[!±[!ª[!£[!œ[!•[!Ž[!‡[!€[!y[!r[!k[!d[!][!V[!O[!H[!A[!:[!3[!,[!%[![![![! [![!ûZ!ôZ!íZ!æZ!ßZ!ØZ!ÑZ!ÊZ!ÃZ!¼Z!µZ!®Z!§Z! Z!™Z!’Z!‹Z!„Z!}Z!vZ!oZ!hZ!aZ!ZZ!SZ!LZ!EZ!>Z!7Z!0Z!)Z!"Z!Z!Z! Z!Z!ÿY!øY!ñY!êY!ãY!ÜY!ÕY!ÎY!ÇY!ÀY!¹Y!²Y!«Y!¤Y!Y!–Y!Y!ˆY!Y!zY!sY!lY!eY!^Y!WY!PY!IY!BY!;Y!4Y!-Y!&Y!Y!Y!Y! Y!Y!üX!õX!îX!çX!àX!ÙX!ÒX!ËX!ÄX!½X!¶X!¯X!¨X!¡X!šX!“X!ŒX!…X!~X!wX!pX!iX!bX![X!TX!MX!FX!?X!8X!1X!*X!#X!X!X!X!X!X!ùW!òW!ëW!äW!ÝW!ÖW!ÏW!ÈW!ÁW!ºW!³W!¬W!¥W!žW!—W!W!‰W!‚W!{W!tW!mW!fW!_W!XW!QW!JW!CW!S!7S!0S!)S!"S!S!S! S!S!ÿR!øR!ñR!êR!ãR!ÜR!ÕR!ÎR!ÇR!ÀR!¹R!²R!«R!¤R!R!–R!R!ˆR!R!zR!sR!lR!eR!^R!WR!PR!IR!BR!;R!4R!-R!&R!R!R!R! R!R!üQ!õQ!îQ!çQ!àQ!ÙQ!ÒQ!ËQ!ÄQ!½Q!¶Q!¯Q!¨Q!¡Q!šQ!“Q!ŒQ!…Q!~Q!wQ!pQ!iQ!bQ![Q!TQ!MQ!FQ!?Q!8Q!1Q!*Q!#Q!Q!Q!Q!Q!Q!ùP!òP!ëP!äP!ÝP!ÖP!ÏP!ÈP!ÁP!ºP!³P!¬P!¥P!žP!—P!P!‰P!‚P!{P!tP!mP!fP!_P!XP!QP!JP!CP!L!7L!0L!)L!"L!L!L! L!L!ÿK!øK!ñK!êK!ãK!ÜK!ÕK!ÎK!ÇK!ÀK!¹K!²K!«K!¤K!K!–K!K!ˆK!K!zK!sK!lK!eK!^K!WK!PK!IK!BK!;K!4K!-K!&K!K!K!K! K!K!üJ!õJ!îJ!çJ!àJ!ÙJ!ÒJ!ËJ!ÄJ!½J!¶J!¯J!¨J!¡J!šJ!“J!ŒJ!…J!~J!wJ!pJ!iJ!bJ![J!TJ!MJ!FJ!?J!8J!1J!*J!#J!J!J!J!J!J!ùI!òI!ëI!äI!ÝI!ÖI!ÏI!ÈI!ÁI!ºI!³I!¬I!¥I!žI!—I!I!‰I!‚I!{I!tI!mI!fI!_I!XI!QI!JI!CI!E!7E!0E!)E!"E!E!E! E!E!ÿD!øD!ñD!êD!ãD!ÜD!ÕD!ÎD!ÇD!ÀD!¹D!²D!«D!¤D!D!–D!D!ˆD!D!zD!sD!lD!eD!^D!WD!PD!ID!BD!;D!4D!-D!&D!D!D!D! D!D!üC!õC!îC!çC!àC!ÙC!ÒC!ËC!ÄC!½C!¶C!¯C!¨C!¡C!šC!“C!ŒC!…C!~C!wC!pC!iC!bC![C!TC!MC!FC!?C!8C!1C!*C!#C!C!C!C!C!C!ùB!òB!ëB!äB!ÝB!ÖB!ÏB!ÈB!ÁB!ºB!³B!¬B!¥B!žB!—B!B!‰B!‚B!{B!tB!mB!fB!_B!XB!QB!JB!CB!!ô>!í>!æ>!ß>!Ø>!Ñ>!Ê>!Ã>!¼>!µ>!®>!§>! >!™>!’>!‹>!„>!}>!v>!o>!h>!a>!Z>!S>!L>!E>!>>!7>!0>!)>!">!>!>! >!>!ÿ=!ø=!ñ=!ê=!ã=!Ü=!Õ=!Î=!Ç=!À=!¹=!²=!«=!¤=!=!–=!=!ˆ=!=!z=!s=!l=!e=!^=!W=!P=!I=!B=!;=!4=!-=!&=!=!=!=! =!=!ü7!77!07!)7!"7!7!7! 7!7!ÿ6!ø6!ñ6!ê6!ã6!Ü6!Õ6!Î6!Ç6!À6!¹6!²6!«6!¤6!6!–6!6!ˆ6!6!z6!s6!l6!e6!^6!W6!P6!I6!B6!;6!46!-6!&6!6!6!6! 6!6!ü5!õ5!î5!ç5!à5!Ù5!Ò5!Ë5!Ä5!½5!¶5!¯5!¨5!¡5!š5!“5!Œ5!…5!~5!w5!p5!i5!b5![5!T5!M5!F5!?5!85!15!*5!#5!5!5!5!5!5!ù4!ò4!ë4!ä4!Ý4!Ö4!Ï4!È4!Á4!º4!³4!¬4!¥4!ž4!—4!4!‰4!‚4!{4!t4!m4!f4!_4!X4!Q4!J4!C4!<4!54!.4!'4! 4!4!4! 4!4!ý3!ö3!ï3!è3!á3!Ú3!Ó3!Ì3!Å3!¾3!·3!°3!©3!¢3!›3!”3!3!†3!3!x3!q3!j3!c3!\3!U3!N3!G3!@3!93!23!+3!$3!3!3!3!3!3!ú2!ó2!ì2!å2!Þ2!×2!Ð2!É2!Â2!»2!´2!­2!¦2!Ÿ2!˜2!‘2!Š2!ƒ2!|2!u2!n2!g2!`2!Y2!R2!K2!D2!=2!62!/2!(2!!2!2!2! 2!2!þ1!÷1!ð1!é1!â1!Û1!Ô1!Í1!Æ1!¿1!¸1!±1!ª1!£1!œ1!•1!Ž1!‡1!€1!y1!r1!k1!d1!]1!V1!O1!H1!A1!:1!31!,1!%1!1!1!1! 1!1!û0!ô0!í0!æ0!ß0!Ø0!Ñ0!Ê0!Ã0!¼0!µ0!®0!§0! 0!™0!’0!‹0!„0!}0!v0!o0!h0!a0!Z0!S0!L0!E0!>0!70!00!)0!"0!0!0! 0!0!ÿ/!ø/!ñ/!ê/!ã/!Ü/!Õ/!Î/!Ç/!À/!¹/!²/!«/!¤/!/!–/!/!ˆ/!/!z/!s/!l/!e/!^/!W/!P/!I/!B/!;/!4/!-/!&/!/!/!/! /!/!ü.!õ.!î.!ç.!à.!Ù.!Ò.!Ë.!Ä.!½.!¶.!¯.!¨.!¡.!š.!“.!Œ.!….!~.!w.!p.!i.!b.![.!T.!M.!F.!?.!8.!1.!*.!#.!.!.!.!.!.!ù-!ò-!ë-!ä-!Ý-!Ö-!Ï-!È-!Á-!º-!³-!¬-!¥-!ž-!—-!-!‰-!‚-!{-!t-!m-!f-!_-!X-!Q-!J-!C-!<-!5-!.-!'-! -!-!-! -!-!ý,!ö,!ï,!è,!á,!Ú,!Ó,!Ì,!Å,!¾,!·,!°,!©,!¢,!›,!”,!,!†,!,!x,!q,!j,!c,!\,!U,!N,!G,!@,!9,!2,!+,!$,!,!,!,!,!,!ú+!ó+!ì+!å+!Þ+!×+!Ð+!É+!Â+!»+!´+!­+!¦+!Ÿ+!˜+!‘+!Š+!ƒ+!|+!u+!n+!g+!`+!Y+!R+!K+!D+!=+!6+!/+!(+!!+!+!+! +!+!þ*!÷*!ð*!é*!â*!Û*!Ô*!Í*!Æ*!¿*!¸*!±*!ª*!£*!œ*!•*!Ž*!‡*!€*!y*!r*!k*!d*!]*!V*!O*!H*!A*!:*!3*!,*!%*!*!*!*! *!*!û)!ô)!í)!æ)!ß)!Ø)!Ñ)!Ê)!Ã)!¼)!µ)!®)!§)! )!™)!’)!‹)!„)!})!v)!o)!h)!a)!Z)!S)!L)!E)!>)!7)!0)!))!")!)!)! )!)!ÿ(!ø(!ñ(!ê(!ã(!Ü(!Õ(!Î(!Ç(!À(!¹(!²(!«(!¤(!(!–(!(!ˆ(!(!z(!s(!l(!e(!^(!W(!P(!I(!B(!;(!4(!-(!&(!(!(!(! (!(!ü'!õ'!î'!ç'!à'!Ù'!Ò'!Ë'!Ä'!½'!¶'!¯'!¨'!¡'!š'!“'!Œ'!…'!~'!w'!p'!i'!b'!['!T'!M'!F'!?'!8'!1'!*'!#'!'!'!'!'!'!ù&!ò&!ë&!ä&!Ý&!Ö&!Ï&!È&!Á&!º&!³&!¬&!¥&!ž&!—&!&!‰&!‚&!{&!t&!m&!f&!_&!X&!Q&!J&!C&!<&!5&!.&!'&! &!&!&! &!&!ý%!ö%!ï%!è%!á%!Ú%!Ó%!Ì%!Å%!¾%!·%!°%!©%!¢%!›%!”%!%!†%!%!x%!q%!j%!c%!\%!U%!N%!G%!@%!9%!2%!+%!$%!%!%!%!%!%!ú$!ó$!ì$!å$!Þ$!×$!Ð$!É$!Â$!»$!´$!­$!¦$!Ÿ$!˜$!‘$!Š$!ƒ$!|$!u$!n$!g$!`$!Y$!R$!K$!D$!=$!6$!/$!($!!$!$!$! $!$!þ#!÷#!ð#!é#!â#!Û#!Ô#!Í#!Æ#!¿#!¸#!±#!ª#!£#!œ#!•#!Ž#!‡#!€#!y#!r#!k#!d#!]#!V#!O#!H#!A#!:#!3#!,#!%#!#!#!#! #!#!û"!ô"!í"!æ"!ß"!Ø"!Ñ"!Ê"!Ã"!¼"!µ"!®"!§"! "!™"!’"!‹"!„"!}"!v"!o"!h"!a"!Z"!S"!L"!E"!>"!7"!0"!)"!""!"!"! "!"!ÿ!!ø!!ñ!!ê!!ã!!Ü!!Õ!!Î!!Ç!!À!!¹!!²!!«!!¤!!!!–!!!!ˆ!!!!z!!s!!l!!e!!^!!W!!P!!I!!B!!;!!4!!-!!&!!!!!!!! !!!!ü !õ !î !ç !à !Ù !Ò !Ë !Ä !½ !¶ !¯ !¨ !¡ !š !“ !Œ !… !~ !w !p !i !b ![ !T !M !F !? !8 !1 !* !# ! ! ! ! ! !ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û !ô !í !æ !ß !Ø !Ñ !Ê !à !¼ !µ !® !§ !  !™ !’ !‹ !„ !} !v !o !h !a !Z !S !L !E !> !7 !0 !) !" ! ! ! ! !ÿ !ø !ñ !ê !ã !Ü !Õ !Î !Ç !À !¹ !² !« !¤ ! !– ! !ˆ ! !z !s !l !e !^ !W !P !I !B !; !4 !- !& ! ! ! ! ! !ü !õ !î !ç !à !Ù !Ò !Ë !Ä !½ !¶ !¯ !¨ !¡ !š !“ !Œ !… !~ !w !p !i !b ![ !T !M !F !? !8 !1 !* !# ! ! ! ! ! !ù !ò !ë !ä !Ý !Ö !Ï !È !Á !º !³ !¬ !¥ !ž !— ! !‰ !‚ !{ !t !m !f !_ !X !Q !J !C !< !5 !. !' ! ! ! ! ! !ý !ö !ï !è !á !Ú !Ó !Ì !Å !¾ !· !° !© !¢ !› !” ! !† ! !x !q !j !c !\ !U !N !G !@ !9 !2 !+ !$ ! ! ! ! ! !ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!<!5!.!'! !!! !!ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!ûÿ ôÿ íÿ æÿ ßÿ Øÿ Ñÿ Êÿ Ãÿ ¼ÿ µÿ ®ÿ §ÿ  ÿ ™ÿ ’ÿ ‹ÿ „ÿ }ÿ vÿ oÿ hÿ aÿ Zÿ Sÿ Lÿ Eÿ >ÿ 7ÿ 0ÿ )ÿ "ÿ ÿ ÿ  ÿ ÿ ÿþ øþ ñþ êþ ãþ Üþ Õþ Îþ Çþ Àþ ¹þ ²þ «þ ¤þ þ –þ þ ˆþ þ zþ sþ lþ eþ ^þ Wþ Pþ Iþ Bþ ;þ 4þ -þ &þ þ þ þ  þ þ üý õý îý çý àý Ùý Òý Ëý Äý ½ý ¶ý ¯ý ¨ý ¡ý šý “ý Œý …ý ~ý wý pý iý bý [ý Tý Mý Fý ?ý 8ý 1ý *ý #ý ý ý ý ý ý ùü òü ëü äü Ýü Öü Ïü Èü Áü ºü ³ü ¬ü ¥ü žü —ü ü ‰ü ‚ü {ü tü mü fü _ü Xü Qü Jü Cü <ü 5ü .ü 'ü  ü ü ü  ü ü ýû öû ïû èû áû Úû Óû Ìû Åû ¾û ·û °û ©û ¢û ›û ”û û †û û xû qû jû cû \û Uû Nû Gû @û 9û 2û +û $û û û û û û úú óú ìú åú Þú ×ú Ðú Éú Âú »ú ´ú ­ú ¦ú Ÿú ˜ú ‘ú Šú ƒú |ú uú nú gú `ú Yú Rú Kú Dú =ú 6ú /ú (ú !ú ú ú  ú ú þù ÷ù ðù éù âù Ûù Ôù Íù Æù ¿ù ¸ù ±ù ªù £ù œù •ù Žù ‡ù €ù yù rù kù dù ]ù Vù Où Hù Aù :ù 3ù ,ù %ù ù ù ù  ù ù ûø ôø íø æø ßø Øø Ñø Êø Ãø ¼ø µø ®ø §ø  ø ™ø ’ø ‹ø „ø }ø vø oø hø aø Zø Sø Lø Eø >ø 7ø 0ø )ø "ø ø ø  ø ø ÿ÷ ø÷ ñ÷ ê÷ ã÷ Ü÷ Õ÷ Î÷ Ç÷ À÷ ¹÷ ²÷ «÷ ¤÷ ÷ –÷ ÷ ˆ÷ ÷ z÷ s÷ l÷ e÷ ^÷ W÷ P÷ I÷ B÷ ;÷ 4÷ -÷ &÷ ÷ ÷ ÷  ÷ ÷ üö õö îö çö àö Ùö Òö Ëö Äö ½ö ¶ö ¯ö ¨ö ¡ö šö “ö Œö …ö ~ö wö pö iö bö [ö Tö Mö Fö ?ö 8ö 1ö *ö #ö ö ö ö ö ö ùõ òõ ëõ äõ Ýõ Öõ Ïõ Èõ Áõ ºõ ³õ ¬õ ¥õ žõ —õ õ ‰õ ‚õ {õ tõ mõ fõ _õ Xõ Qõ Jõ Cõ <õ 5õ .õ 'õ  õ õ õ  õ õ ýô öô ïô èô áô Úô Óô Ìô Åô ¾ô ·ô °ô ©ô ¢ô ›ô ”ô ô †ô ô xô qô jô cô \ô Uô Nô Gô @ô 9ô 2ô +ô $ô ô ô ô ô ô úó óó ìó åó Þó ×ó Ðó Éó Âó »ó ´ó ­ó ¦ó Ÿó ˜ó ‘ó Šó ƒó |ó uó nó gó `ó Yó Ró Kó Dó =ó 6ó /ó (ó !ó ó ó  ó ó þò ÷ò ðò éò âò Ûò Ôò Íò Æò ¿ò ¸ò ±ò ªò £ò œò •ò Žò ‡ò €ò yò rò kò dò ]ò Vò Oò Hò Aò :ò 3ò ,ò %ò ò ò ò  ò ò ûñ ôñ íñ æñ ßñ Øñ Ññ Êñ Ãñ ¼ñ µñ ®ñ §ñ  ñ ™ñ ’ñ ‹ñ „ñ }ñ vñ oñ hñ añ Zñ Sñ Lñ Eñ >ñ 7ñ 0ñ )ñ "ñ ñ ñ  ñ ñ ÿð øð ñð êð ãð Üð Õð Îð Çð Àð ¹ð ²ð «ð ¤ð ð –ð ð ˆð ð zð sð lð eð ^ð Wð Pð Ið Bð ;ð 4ð -ð &ð ð ð ð  ð ð üï õï îï çï àï Ùï Òï Ëï Äï ½ï ¶ï ¯ï ¨ï ¡ï šï “ï Œï …ï ~ï wï pï iï bï [ï Tï Mï Fï ?ï 8ï 1ï *ï #ï ï ï ï ï ï ùî òî ëî äî Ýî Öî Ïî Èî Áî ºî ³î ¬î ¥î žî —î î ‰î ‚î {î tî mî fî _î Xî Qî Jî Cî <î 5î .î 'î  î î î  î î ýí öí ïí èí áí Úí Óí Ìí Åí ¾í ·í °í ©í ¢í ›í ”í í †í í xí qí jí cí \í Uí Ní Gí @í 9í 2í +í $í í í í í í úì óì ìì åì Þì ×ì Ðì Éì Âì »ì ´ì ­ì ¦ì Ÿì ˜ì ‘ì Šì ƒì |ì uì nì gì `ì Yì Rì Kì Dì =ì 6ì /ì (ì !ì ì ì  ì ì þë ÷ë ðë éë âë Ûë Ôë Íë Æë ¿ë ¸ë ±ë ªë £ë œë •ë Žë ‡ë €ë yë rë kë dë ]ë Vë Oë Hë Aë :ë 3ë ,ë %ë ë ë ë  ë ë ûê ôê íê æê ßê Øê Ñê Êê Ãê ¼ê µê ®ê §ê  ê ™ê ’ê ‹ê „ê }ê vê oê hê aê Zê Sê Lê Eê >ê 7ê 0ê )ê "ê ê ê  ê ê ÿé øé ñé êé ãé Üé Õé Îé Çé Àé ¹é ²é «é ¤é é –é é ˆé é zé sé lé eé ^é Wé Pé Ié Bé ;é 4é -é &é é é é  é é üè õè îè çè àè Ùè Òè Ëè Äè ½è ¶è ¯è ¨è ¡è šè “è Œè …è ~è wè pè iè bè [è Tè Mè Fè ?è 8è 1è *è #è è è è è è ùç òç ëç äç Ýç Öç Ïç Èç Áç ºç ³ç ¬ç ¥ç žç —ç ç ‰ç ‚ç {ç tç mç fç _ç Xç Qç Jç Cç <ç 5ç .ç 'ç  ç ç ç  ç ç ýæ öæ ïæ èæ áæ Úæ Óæ Ìæ Åæ ¾æ ·æ °æ ©æ ¢æ ›æ ”æ æ †æ æ xæ qæ jæ cæ \æ Uæ Næ Gæ @æ 9æ 2æ +æ $æ æ æ æ æ æ úå óå ìå åå Þå ×å Ðå Éå Âå »å ´å ­å ¦å Ÿå ˜å ‘å Šå ƒå |å uå nå gå `å Yå Rå Kå Då =å 6å /å (å !å å å  å å þä ÷ä ðä éä âä Ûä Ôä Íä Æä ¿ä ¸ä ±ä ªä £ä œä •ä Žä ‡ä €ä yä rä kä dä ]ä Vä Oä Hä Aä :ä 3ä ,ä %ä ä ä ä  ä ä ûã ôã íã æã ßã Øã Ñã Êã Ãã ¼ã µã ®ã §ã  ã ™ã ’ã ‹ã „ã }ã vã oã hã aã Zã Sã Lã Eã >ã 7ã 0ã )ã "ã ã ã  ã ã ÿâ øâ ñâ êâ ãâ Üâ Õâ Îâ Çâ À⠹⠲⠫⠤â â –â â ˆâ â zâ sâ lâ eâ ^â Wâ Pâ Iâ Bâ ;â 4â -â &â â â â  â â üá õá îá çá àá Ùá Òá Ëá Äá ½á ¶á ¯á ¨á ¡á šá “á Œá …á ~á wá pá iá bá [á Tá Má Fá ?á 8á 1á *á #á á á á á á ùà òà ëà äà Ýà Öà Ïà Èà Áà ºà ³à ¬à ¥à žà —à à ‰à ‚à {à tà mà fà _à Xà Qà Jà Cà <à 5à .à 'à  à à à  à à ýß öß ïß èß áß Úß Óß Ìß Åß ¾ß ·ß °ß ©ß ¢ß ›ß ”ß ß †ß ß xß qß jß cß \ß Uß Nß Gß @ß 9ß 2ß +ß $ß ß ß ß ß ß úÞ óÞ ìÞ åÞ ÞÞ ×Þ ÐÞ ÉÞ ÂÞ »Þ ´Þ ­Þ ¦Þ ŸÞ ˜Þ ‘Þ ŠÞ ƒÞ |Þ uÞ nÞ gÞ `Þ YÞ RÞ KÞ DÞ =Þ 6Þ /Þ (Þ !Þ Þ Þ  Þ Þ þÝ ÷Ý ðÝ éÝ âÝ ÛÝ ÔÝ ÍÝ ÆÝ ¿Ý ¸Ý ±Ý ªÝ £Ý œÝ •Ý ŽÝ ‡Ý €Ý yÝ rÝ kÝ dÝ ]Ý VÝ OÝ HÝ AÝ :Ý 3Ý ,Ý %Ý Ý Ý Ý  Ý Ý ûÜ ôÜ íÜ æÜ ßÜ ØÜ ÑÜ ÊÜ ÃÜ ¼Ü µÜ ®Ü §Ü  Ü ™Ü ’Ü ‹Ü „Ü }Ü vÜ oÜ hÜ aÜ ZÜ SÜ LÜ EÜ >Ü 7Ü 0Ü )Ü "Ü Ü Ü  Ü Ü ÿÛ øÛ ñÛ êÛ ãÛ ÜÛ ÕÛ ÎÛ ÇÛ ÀÛ ¹Û ²Û «Û ¤Û Û –Û Û ˆÛ Û zÛ sÛ lÛ eÛ ^Û WÛ PÛ IÛ BÛ ;Û 4Û -Û &Û Û Û Û  Û Û üÚ õÚ îÚ çÚ àÚ ÙÚ ÒÚ ËÚ ÄÚ ½Ú ¶Ú ¯Ú ¨Ú ¡Ú šÚ “Ú ŒÚ …Ú ~Ú wÚ pÚ iÚ bÚ [Ú TÚ MÚ FÚ ?Ú 8Ú 1Ú *Ú #Ú Ú Ú Ú Ú Ú ùÙ òÙ ëÙ äÙ ÝÙ ÖÙ ÏÙ ÈÙ ÁÙ ºÙ ³Ù ¬Ù ¥Ù žÙ —Ù Ù ‰Ù ‚Ù {Ù tÙ mÙ fÙ _Ù XÙ QÙ JÙ CÙ <Ù 5Ù .Ù 'Ù  Ù Ù Ù  Ù Ù ýØ öØ ïØ èØ áØ ÚØ ÓØ ÌØ ÅØ ¾Ø ·Ø °Ø ©Ø ¢Ø ›Ø ”Ø Ø †Ø Ø xØ qØ jØ cØ \Ø UØ NØ GØ @Ø 9Ø 2Ø +Ø $Ø Ø Ø Ø Ø Ø ú× ó× ì× å× Þ× ×× Ð× É× Â× »× ´× ­× ¦× Ÿ× ˜× ‘× Š× ƒ× |× u× n× g× `× Y× R× K× D× =× 6× /× (× !× × ×  × × þÖ ÷Ö ðÖ éÖ âÖ ÛÖ ÔÖ ÍÖ ÆÖ ¿Ö ¸Ö ±Ö ªÖ £Ö œÖ •Ö ŽÖ ‡Ö €Ö yÖ rÖ kÖ dÖ ]Ö VÖ OÖ HÖ AÖ :Ö 3Ö ,Ö %Ö Ö Ö Ö  Ö Ö ûÕ ôÕ íÕ æÕ ßÕ ØÕ ÑÕ ÊÕ ÃÕ ¼Õ µÕ ®Õ §Õ  Õ ™Õ ’Õ ‹Õ „Õ }Õ vÕ oÕ hÕ aÕ ZÕ SÕ LÕ EÕ >Õ 7Õ 0Õ )Õ "Õ Õ Õ  Õ Õ ÿÔ øÔ ñÔ êÔ ãÔ ÜÔ ÕÔ ÎÔ ÇÔ ÀÔ ¹Ô ²Ô «Ô ¤Ô Ô –Ô Ô ˆÔ Ô zÔ sÔ lÔ eÔ ^Ô WÔ PÔ IÔ BÔ ;Ô 4Ô -Ô &Ô Ô Ô Ô  Ô Ô üÓ õÓ îÓ çÓ àÓ ÙÓ ÒÓ ËÓ ÄÓ ½Ó ¶Ó ¯Ó ¨Ó ¡Ó šÓ “Ó ŒÓ …Ó ~Ó wÓ pÓ iÓ bÓ [Ó TÓ MÓ FÓ ?Ó 8Ó 1Ó *Ó #Ó Ó Ó Ó Ó Ó ùÒ òÒ ëÒ äÒ ÝÒ ÖÒ ÏÒ ÈÒ ÁÒ ºÒ ³Ò ¬Ò ¥Ò žÒ —Ò Ò ‰Ò ‚Ò {Ò tÒ mÒ fÒ _Ò XÒ QÒ JÒ CÒ <Ò 5Ò .Ò 'Ò  Ò Ò Ò  Ò Ò ýÑ öÑ ïÑ èÑ áÑ ÚÑ ÓÑ ÌÑ ÅÑ ¾Ñ ·Ñ °Ñ ©Ñ ¢Ñ ›Ñ ”Ñ Ñ †Ñ Ñ xÑ qÑ jÑ cÑ \Ñ UÑ NÑ GÑ @Ñ 9Ñ 2Ñ +Ñ $Ñ Ñ Ñ Ñ Ñ Ñ úÐ óÐ ìÐ åÐ ÞÐ ×Ð ÐÐ ÉÐ ÂÐ »Ð ´Ð ­Ð ¦Ð ŸÐ ˜Ð ‘Ð ŠÐ ƒÐ |Ð uÐ nÐ gÐ `Ð YÐ RÐ KÐ DÐ =Ð 6Ð /Ð (Ð !Ð Ð Ð  Ð Ð þÏ ÷Ï ðÏ éÏ âÏ ÛÏ ÔÏ ÍÏ ÆÏ ¿Ï ¸Ï ±Ï ªÏ £Ï œÏ •Ï ŽÏ ‡Ï €Ï yÏ rÏ kÏ dÏ ]Ï VÏ OÏ HÏ AÏ :Ï 3Ï ,Ï %Ï Ï Ï Ï  Ï Ï ûÎ ôÎ íÎ æÎ ßÎ ØÎ ÑÎ ÊÎ ÃÎ ¼Î µÎ ®Î §Î  Î ™Î ’Î ‹Î „Î }Î vÎ oÎ hÎ aÎ ZÎ SÎ LÎ EÎ >Î 7Î 0Î )Î "Î Î Î  Î Î ÿÍ øÍ ñÍ êÍ ãÍ ÜÍ ÕÍ ÎÍ ÇÍ ÀÍ ¹Í ²Í «Í ¤Í Í –Í Í ˆÍ Í zÍ sÍ lÍ eÍ ^Í WÍ PÍ IÍ BÍ ;Í 4Í -Í &Í Í Í Í  Í Í üÌ õÌ îÌ çÌ àÌ ÙÌ ÒÌ ËÌ ÄÌ ½Ì ¶Ì ¯Ì ¨Ì ¡Ì šÌ “Ì ŒÌ …Ì ~Ì wÌ pÌ iÌ bÌ [Ì TÌ MÌ FÌ ?Ì 8Ì 1Ì *Ì #Ì Ì Ì Ì Ì Ì ùË òË ëË äË ÝË ÖË ÏË ÈË ÁË ºË ³Ë ¬Ë ¥Ë žË —Ë Ë ‰Ë ‚Ë {Ë tË mË fË _Ë XË QË JË CË <Ë 5Ë .Ë 'Ë  Ë Ë Ë  Ë Ë ýÊ öÊ ïÊ èÊ áÊ ÚÊ ÓÊ ÌÊ ÅÊ ¾Ê ·Ê °Ê ©Ê ¢Ê ›Ê ”Ê Ê †Ê Ê xÊ qÊ jÊ cÊ \Ê UÊ NÊ GÊ @Ê 9Ê 2Ê +Ê $Ê Ê Ê Ê Ê Ê úÉ óÉ ìÉ åÉ ÞÉ ×É ÐÉ ÉÉ ÂÉ »É ´É ­É ¦É ŸÉ ˜É ‘É ŠÉ ƒÉ |É uÉ nÉ gÉ `É YÉ RÉ KÉ DÉ =É 6É /É (É !É É É  É É þÈ ÷È ðÈ éÈ âÈ ÛÈ ÔÈ ÍÈ ÆÈ ¿È ¸È ±È ªÈ £È œÈ •È ŽÈ ‡È €È yÈ rÈ kÈ dÈ ]È VÈ OÈ HÈ AÈ :È 3È ,È %È È È È  È È ûÇ ôÇ íÇ æÇ ßÇ ØÇ ÑÇ ÊÇ ÃÇ ¼Ç µÇ ®Ç §Ç  Ç ™Ç ’Ç ‹Ç „Ç }Ç vÇ oÇ hÇ aÇ ZÇ SÇ LÇ EÇ >Ç 7Ç 0Ç )Ç "Ç Ç Ç  Ç Ç ÿÆ øÆ ñÆ êÆ ãÆ ÜÆ ÕÆ ÎÆ ÇÆ ÀÆ ¹Æ ²Æ «Æ ¤Æ Æ –Æ Æ ˆÆ Æ zÆ sÆ lÆ eÆ ^Æ WÆ PÆ IÆ BÆ ;Æ 4Æ -Æ &Æ Æ Æ Æ  Æ Æ üÅ õÅ îÅ çÅ àÅ ÙÅ ÒÅ ËÅ ÄÅ ½Å ¶Å ¯Å ¨Å ¡Å šÅ “Å ŒÅ …Å ~Å wÅ pÅ iÅ bÅ [Å TÅ MÅ FÅ ?Å 8Å 1Å *Å #Å Å Å Å Å Å ùÄ òÄ ëÄ äÄ ÝÄ ÖÄ ÏÄ ÈÄ ÁÄ ºÄ ³Ä ¬Ä ¥Ä žÄ —Ä Ä ‰Ä ‚Ä {Ä tÄ mÄ fÄ _Ä XÄ QÄ JÄ CÄ <Ä 5Ä .Ä 'Ä  Ä Ä Ä  Ä Ä ýà öà ïà èà áà Úà Óà Ìà Åà ¾Ã ·Ã °Ã ©Ã ¢Ã ›Ã ”à à †Ã à xà qà jà cà \à Uà Nà Gà @à 9à 2à +à $à à à à à à ú ó ì å Þ × РÉ  »Â ´Â ­Â ¦Â ŸÂ ˜Â ‘ ŠÂ ƒÂ | u n g ` Y R K D = 6 / ( !      þÁ ÷Á ðÁ éÁ âÁ ÛÁ ÔÁ ÍÁ ÆÁ ¿Á ¸Á ±Á ªÁ £Á œÁ •Á ŽÁ ‡Á €Á yÁ rÁ kÁ dÁ ]Á VÁ OÁ HÁ AÁ :Á 3Á ,Á %Á Á Á Á  Á Á ûÀ ôÀ íÀ æÀ ßÀ ØÀ ÑÀ ÊÀ ÃÀ ¼À µÀ ®À §À  À ™À ’À ‹À „À }À vÀ oÀ hÀ aÀ ZÀ SÀ LÀ EÀ >À 7À 0À )À "À À À  À À ÿ¿ ø¿ ñ¿ ê¿ ã¿ Ü¿ Õ¿ ο Ç¿ À¿ ¹¿ ²¿ «¿ ¤¿ ¿ –¿ ¿ ˆ¿ ¿ z¿ s¿ l¿ e¿ ^¿ W¿ P¿ I¿ B¿ ;¿ 4¿ -¿ &¿ ¿ ¿ ¿  ¿ ¿ ü¾ õ¾ î¾ ç¾ ྠÙ¾ Ò¾ ˾ ľ ½¾ ¶¾ ¯¾ ¨¾ ¡¾ š¾ “¾ Œ¾ …¾ ~¾ w¾ p¾ i¾ b¾ [¾ T¾ M¾ F¾ ?¾ 8¾ 1¾ *¾ #¾ ¾ ¾ ¾ ¾ ¾ ù½ ò½ ë½ ä½ ݽ Ö½ Ͻ Ƚ Á½ º½ ³½ ¬½ ¥½ ž½ —½ ½ ‰½ ‚½ {½ t½ m½ f½ _½ X½ Q½ J½ C½ <½ 5½ .½ '½  ½ ½ ½  ½ ½ ý¼ ö¼ ï¼ è¼ á¼ Ú¼ Ó¼ ̼ ż ¾¼ ·¼ °¼ ©¼ ¢¼ ›¼ ”¼ ¼ †¼ ¼ x¼ q¼ j¼ c¼ \¼ U¼ N¼ G¼ @¼ 9¼ 2¼ +¼ $¼ ¼ ¼ ¼ ¼ ¼ ú» ó» ì» å» Þ» ×» л É» » »» ´» ­» ¦» Ÿ» ˜» ‘» Š» ƒ» |» u» n» g» `» Y» R» K» D» =» 6» /» (» !» » »  » » þº ÷º ðº éº ⺠Ûº Ôº ͺ ƺ ¿º ¸º ±º ªº £º œº •º Žº ‡º €º yº rº kº dº ]º Vº Oº Hº Aº :º 3º ,º %º º º º  º º û¹ ô¹ í¹ æ¹ ß¹ ع ѹ ʹ ù ¼¹ µ¹ ®¹ §¹  ¹ ™¹ ’¹ ‹¹ „¹ }¹ v¹ o¹ h¹ a¹ Z¹ S¹ L¹ E¹ >¹ 7¹ 0¹ )¹ "¹ ¹ ¹  ¹ ¹ ÿ¸ ø¸ ñ¸ ê¸ 㸠ܸ Õ¸ θ Ǹ À¸ ¹¸ ²¸ «¸ ¤¸ ¸ –¸ ¸ ˆ¸ ¸ z¸ s¸ l¸ e¸ ^¸ W¸ P¸ I¸ B¸ ;¸ 4¸ -¸ &¸ ¸ ¸ ¸  ¸ ¸ ü· õ· î· ç· à· Ù· Ò· Ë· Ä· ½· ¶· ¯· ¨· ¡· š· “· Œ· …· ~· w· p· i· b· [· T· M· F· ?· 8· 1· *· #· · · · · · ù¶ ò¶ ë¶ ä¶ ݶ Ö¶ ϶ ȶ Á¶ º¶ ³¶ ¬¶ ¥¶ ž¶ —¶ ¶ ‰¶ ‚¶ {¶ t¶ m¶ f¶ _¶ X¶ Q¶ J¶ C¶ <¶ 5¶ .¶ '¶  ¶ ¶ ¶  ¶ ¶ ýµ öµ ïµ èµ áµ Úµ Óµ ̵ ŵ ¾µ ·µ °µ ©µ ¢µ ›µ ”µ µ †µ µ xµ qµ jµ cµ \µ Uµ Nµ Gµ @µ 9µ 2µ +µ $µ µ µ µ µ µ ú´ ó´ ì´ å´ Þ´ ×´ д É´ ´ »´ ´´ ­´ ¦´ Ÿ´ ˜´ ‘´ Š´ ƒ´ |´ u´ n´ g´ `´ Y´ R´ K´ D´ =´ 6´ /´ (´ !´ ´ ´  ´ ´ þ³ ÷³ ð³ é³ â³ Û³ Ô³ ͳ Ƴ ¿³ ¸³ ±³ ª³ £³ œ³ •³ ޳ ‡³ €³ y³ r³ k³ d³ ]³ V³ O³ H³ A³ :³ 3³ ,³ %³ ³ ³ ³  ³ ³ û² ô² í² æ² ß² ز Ѳ ʲ ò ¼² µ² ®² §²  ² ™² ’² ‹² „² }² v² o² h² a² Z² S² L² E² >² 7² 0² )² "² ² ²  ² ² ÿ± ø± ñ± ê± ã± ܱ Õ± α DZ À± ¹± ²± «± ¤± ± –± ± ˆ± ± z± s± l± e± ^± W± P± I± B± ;± 4± -± &± ± ± ±  ± ± ü° õ° î° ç° à° Ù° Ò° ˰ İ ½° ¶° ¯° ¨° ¡° š° “° Œ° …° ~° w° p° i° b° [° T° M° F° ?° 8° 1° *° #° ° ° ° ° ° ù¯ ò¯ ë¯ ä¯ ݯ Ö¯ ϯ ȯ Á¯ º¯ ³¯ ¬¯ ¥¯ ž¯ —¯ ¯ ‰¯ ‚¯ {¯ t¯ m¯ f¯ _¯ X¯ Q¯ J¯ C¯ <¯ 5¯ .¯ '¯  ¯ ¯ ¯  ¯ ¯ ý® ö® ï® è® á® Ú® Ó® Ì® Å® ¾® ·® °® ©® ¢® ›® ”® ® †® ® x® q® j® c® \® U® N® G® @® 9® 2® +® $® ® ® ® ® ® ú­ ó­ ì­ å­ Þ­ ×­ Э É­ ­ »­ ´­ ­­ ¦­ Ÿ­ ˜­ ‘­ Š­ ƒ­ |­ u­ n­ g­ `­ Y­ R­ K­ D­ =­ 6­ /­ (­ !­ ­ ­  ­ ­ þ¬ ÷¬ ð¬ é¬ ⬠Û¬ Ô¬ ͬ Ƭ ¿¬ ¸¬ ±¬ ª¬ £¬ œ¬ •¬ ެ ‡¬ €¬ y¬ r¬ k¬ d¬ ]¬ V¬ O¬ H¬ A¬ :¬ 3¬ ,¬ %¬ ¬ ¬ ¬  ¬ ¬ û« ô« í« æ« ß« Ø« Ñ« Ê« ë ¼« µ« ®« §«  « ™« ’« ‹« „« }« v« o« h« a« Z« S« L« E« >« 7« 0« )« "« « «  « « ÿª øª ñª êª 㪠ܪ Õª Ϊ Ǫ Àª ¹ª ²ª «ª ¤ª ª –ª ª ˆª ª zª sª lª eª ^ª Wª Pª Iª Bª ;ª 4ª -ª &ª ª ª ª  ª ª ü© õ© î© ç© à© Ù© Ò© Ë© Ä© ½© ¶© ¯© ¨© ¡© š© “© Œ© …© ~© w© p© i© b© [© T© M© F© ?© 8© 1© *© #© © © © © © ù¨ ò¨ ë¨ ä¨ ݨ Ö¨ Ϩ Ȩ Á¨ º¨ ³¨ ¬¨ ¥¨ ž¨ —¨ ¨ ‰¨ ‚¨ {¨ t¨ m¨ f¨ _¨ X¨ Q¨ J¨ C¨ <¨ 5¨ .¨ '¨  ¨ ¨ ¨  ¨ ¨ ý§ ö§ ï§ è§ á§ Ú§ Ó§ ̧ ŧ ¾§ ·§ °§ ©§ ¢§ ›§ ”§ § †§ § x§ q§ j§ c§ \§ U§ N§ G§ @§ 9§ 2§ +§ $§ § § § § § ú¦ ó¦ ì¦ å¦ Þ¦ צ Ц ɦ ¦ »¦ ´¦ ­¦ ¦¦ Ÿ¦ ˜¦ ‘¦ Ц ƒ¦ |¦ u¦ n¦ g¦ `¦ Y¦ R¦ K¦ D¦ =¦ 6¦ /¦ (¦ !¦ ¦ ¦  ¦ ¦ þ¥ ÷¥ ð¥ é¥ ⥠Û¥ Ô¥ Í¥ Æ¥ ¿¥ ¸¥ ±¥ ª¥ £¥ œ¥ •¥ Ž¥ ‡¥ €¥ y¥ r¥ k¥ d¥ ]¥ V¥ O¥ H¥ A¥ :¥ 3¥ ,¥ %¥ ¥ ¥ ¥  ¥ ¥ û¤ ô¤ í¤ æ¤ ߤ ؤ Ѥ ʤ ä ¼¤ µ¤ ®¤ §¤  ¤ ™¤ ’¤ ‹¤ „¤ }¤ v¤ o¤ h¤ a¤ Z¤ S¤ L¤ E¤ >¤ 7¤ 0¤ )¤ "¤ ¤ ¤  ¤ ¤ ÿ£ ø£ ñ£ ê£ 㣠Ü£ Õ£ Σ Ç£ À£ ¹£ ²£ «£ ¤£ £ –£ £ ˆ£ £ z£ s£ l£ e£ ^£ W£ P£ I£ B£ ;£ 4£ -£ &£ £ £ £  £ £ ü¢ õ¢ î¢ ç¢ ࢠÙ¢ Ò¢ Ë¢ Ä¢ ½¢ ¶¢ ¯¢ ¨¢ ¡¢ 𢠓¢ Œ¢ …¢ ~¢ w¢ p¢ i¢ b¢ [¢ T¢ M¢ F¢ ?¢ 8¢ 1¢ *¢ #¢ ¢ ¢ ¢ ¢ ¢ ù¡ ò¡ ë¡ ä¡ Ý¡ Ö¡ Ï¡ È¡ Á¡ º¡ ³¡ ¬¡ ¥¡ ž¡ —¡ ¡ ‰¡ ‚¡ {¡ t¡ m¡ f¡ _¡ X¡ Q¡ J¡ C¡ <¡ 5¡ .¡ '¡  ¡ ¡ ¡  ¡ ¡ ý  ö  ï  è  á  Ú  Ó  Ì  Å  ¾  ·  °  ©  ¢  ›  ”    †    x  q  j  c  \  U  N  G  @  9  2  +  $            úŸ óŸ ìŸ åŸ ÞŸ ן П ÉŸ Ÿ »Ÿ ´Ÿ ­Ÿ ¦Ÿ ŸŸ ˜Ÿ ‘Ÿ ŠŸ ƒŸ |Ÿ uŸ nŸ gŸ `Ÿ YŸ RŸ KŸ DŸ =Ÿ 6Ÿ /Ÿ (Ÿ !Ÿ Ÿ Ÿ  Ÿ Ÿ þž ÷ž ðž éž âž Ûž Ôž Íž Æž ¿ž ¸ž ±ž ªž £ž œž •ž Žž ‡ž €ž yž rž kž dž ]ž Vž Ož Hž Až :ž 3ž ,ž %ž ž ž ž  ž ž û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿœ øœ ñœ êœ 㜠Üœ Õœ Μ Çœ Àœ ¹œ ²œ «œ ¤œ œ –œ œ ˆœ œ zœ sœ lœ eœ ^œ Wœ Pœ Iœ Bœ ;œ 4œ -œ &œ œ œ œ  œ œ ü› õ› î› ç› à› Ù› Ò› Ë› Ä› ½› ¶› ¯› ¨› ¡› š› “› Œ› …› ~› w› p› i› b› [› T› M› F› ?› 8› 1› *› #› › › › › › ùš òš ëš äš Ýš Öš Ïš Èš Áš ºš ³š ¬š ¥š žš —š š ‰š ‚š {š tš mš fš _š Xš Qš Jš Cš <š 5š .š 'š  š š š  š š ý™ ö™ ï™ è™ á™ Ú™ Ó™ Ì™ Å™ ¾™ ·™ °™ ©™ ¢™ ›™ ”™ ™ †™ ™ x™ q™ j™ c™ \™ U™ N™ G™ @™ 9™ 2™ +™ $™ ™ ™ ™ ™ ™ ú˜ ó˜ ì˜ å˜ Þ˜ ט И ɘ ˜ »˜ ´˜ ­˜ ¦˜ Ÿ˜ ˜˜ ‘˜ Š˜ ƒ˜ |˜ u˜ n˜ g˜ `˜ Y˜ R˜ K˜ D˜ =˜ 6˜ /˜ (˜ !˜ ˜ ˜  ˜ ˜ þ— ÷— ð— é— â— Û— Ô— Í— Æ— ¿— ¸— ±— ª— £— œ— •— Ž— ‡— €— y— r— k— d— ]— V— O— H— A— :— 3— ,— %— — — —  — — û– ô– í– æ– ß– Ø– Ñ– Ê– Ö ¼– µ– ®– §–  – ™– ’– ‹– „– }– v– o– h– a– Z– S– L– E– >– 7– 0– )– "– – –  – – ÿ• ø• ñ• ê• ã• Ü• Õ• Ε Ç• À• ¹• ²• «• ¤• • –• • ˆ• • z• s• l• e• ^• W• P• I• B• ;• 4• -• &• • • •  • • ü” õ” î” ç” à” Ù” Ò” Ë” Ä” ½” ¶” ¯” ¨” ¡” š” “” Œ” …” ~” w” p” i” b” [” T” M” F” ?” 8” 1” *” #” ” ” ” ” ” ù“ ò“ ë“ ä“ Ý“ Ö“ Ï“ È“ Á“ º“ ³“ ¬“ ¥“ ž“ —“ “ ‰“ ‚“ {“ t“ m“ f“ _“ X“ Q“ J“ C“ <“ 5“ .“ '“  “ “ “  “ “ ý’ ö’ ï’ è’ á’ Ú’ Ó’ Ì’ Å’ ¾’ ·’ °’ ©’ ¢’ ›’ ”’ ’ †’ ’ x’ q’ j’ c’ \’ U’ N’ G’ @’ 9’ 2’ +’ $’ ’ ’ ’ ’ ’ ú‘ ó‘ ì‘ å‘ Þ‘ ב Б É‘ ‘ »‘ ´‘ ­‘ ¦‘ Ÿ‘ ˜‘ ‘‘ Š‘ ƒ‘ |‘ u‘ n‘ g‘ `‘ Y‘ R‘ K‘ D‘ =‘ 6‘ /‘ (‘ !‘ ‘ ‘  ‘ ‘ þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿŽ øŽ ñŽ êŽ ㎠ÜŽ ÕŽ ÎŽ ÇŽ ÀŽ ¹Ž ²Ž «Ž ¤Ž Ž –Ž Ž ˆŽ Ž zŽ sŽ lŽ eŽ ^Ž WŽ PŽ IŽ BŽ ;Ž 4Ž -Ž &Ž Ž Ž Ž  Ž Ž ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŒ òŒ ëŒ äŒ ÝŒ ÖŒ ÏŒ ÈŒ ÁŒ ºŒ ³Œ ¬Œ ¥Œ žŒ —Œ Œ ‰Œ ‚Œ {Œ tŒ mŒ fŒ _Œ XŒ QŒ JŒ CŒ <Œ 5Œ .Œ 'Œ  Œ Œ Œ  Œ Œ ý‹ ö‹ ï‹ è‹ á‹ Ú‹ Ó‹ Ì‹ Å‹ ¾‹ ·‹ °‹ ©‹ ¢‹ ›‹ ”‹ ‹ †‹ ‹ x‹ q‹ j‹ c‹ \‹ U‹ N‹ G‹ @‹ 9‹ 2‹ +‹ $‹ ‹ ‹ ‹ ‹ ‹ úŠ óŠ ìŠ åŠ ÞŠ ׊ Њ ÉŠ Š »Š ´Š ­Š ¦Š ŸŠ ˜Š ‘Š ŠŠ ƒŠ |Š uŠ nŠ gŠ `Š YŠ RŠ KŠ DŠ =Š 6Š /Š (Š !Š Š Š  Š Š þ‰ ÷‰ ð‰ é‰ ≠Û‰ Ô‰ ͉ Ɖ ¿‰ ¸‰ ±‰ ª‰ £‰ œ‰ •‰ މ ‡‰ €‰ y‰ r‰ k‰ d‰ ]‰ V‰ O‰ H‰ A‰ :‰ 3‰ ,‰ %‰ ‰ ‰ ‰  ‰ ‰ ûˆ ôˆ íˆ æˆ ߈ ؈ ш ʈ È ¼ˆ µˆ ®ˆ §ˆ  ˆ ™ˆ ’ˆ ‹ˆ „ˆ }ˆ vˆ oˆ hˆ aˆ Zˆ Sˆ Lˆ Eˆ >ˆ 7ˆ 0ˆ )ˆ "ˆ ˆ ˆ  ˆ ˆ ÿ‡ ø‡ ñ‡ ê‡ ㇠܇ Õ‡ · LJ À‡ ¹‡ ²‡ «‡ ¤‡ ‡ –‡ ‡ ˆ‡ ‡ z‡ s‡ l‡ e‡ ^‡ W‡ P‡ I‡ B‡ ;‡ 4‡ -‡ &‡ ‡ ‡ ‡  ‡ ‡ ü† õ† î† ç† à† Ù† Ò† ˆ Ć ½† ¶† ¯† ¨† ¡† š† “† Œ† …† ~† w† p† i† b† [† T† M† F† ?† 8† 1† *† #† † † † † † ù… ò… ë… ä… Ý… Ö… Ï… È… Á… º… ³… ¬… ¥… ž… —… … ‰… ‚… {… t… m… f… _… X… Q… J… C… <… 5… .… '…  … … …  … … ý„ ö„ ï„ è„ á„ Ú„ Ó„ Ì„ Å„ ¾„ ·„ °„ ©„ ¢„ ›„ ”„ „ †„ „ x„ q„ j„ c„ \„ U„ N„ G„ @„ 9„ 2„ +„ $„ „ „ „ „ „ úƒ óƒ ìƒ åƒ Þƒ ׃ Ѓ Ƀ ƒ »ƒ ´ƒ ­ƒ ¦ƒ Ÿƒ ˜ƒ ‘ƒ Šƒ ƒƒ |ƒ uƒ nƒ gƒ `ƒ Yƒ Rƒ Kƒ Dƒ =ƒ 6ƒ /ƒ (ƒ !ƒ ƒ ƒ  ƒ ƒ þ‚ ÷‚ ð‚ é‚ â‚ Û‚ Ô‚ Í‚ Æ‚ ¿‚ ¸‚ ±‚ ª‚ £‚ œ‚ •‚ Ž‚ ‡‚ €‚ y‚ r‚ k‚ d‚ ]‚ V‚ O‚ H‚ A‚ :‚ 3‚ ,‚ %‚ ‚ ‚ ‚  ‚ ‚ û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ€ ø€ ñ€ ê€ 〠Ü€ Õ€ ΀ Ç€ À€ ¹€ ²€ «€ ¤€ € –€ € ˆ€ € z€ s€ l€ e€ ^€ W€ P€ I€ B€ ;€ 4€ -€ &€ € € €  € € ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù~ ò~ ë~ ä~ Ý~ Ö~ Ï~ È~ Á~ º~ ³~ ¬~ ¥~ ž~ —~ ~ ‰~ ‚~ {~ t~ m~ f~ _~ X~ Q~ J~ C~ <~ 5~ .~ '~  ~ ~ ~  ~ ~ ý} ö} ï} è} á} Ú} Ó} Ì} Å} ¾} ·} °} ©} ¢} ›} ”} } †} } x} q} j} c} \} U} N} G} @} 9} 2} +} $} } } } } } ú| ó| ì| å| Þ| ×| Ð| É| Â| »| ´| ­| ¦| Ÿ| ˜| ‘| Š| ƒ| || u| n| g| `| Y| R| K| D| =| 6| /| (| !| | |  | | þ{ ÷{ ð{ é{ â{ Û{ Ô{ Í{ Æ{ ¿{ ¸{ ±{ ª{ £{ œ{ •{ Ž{ ‡{ €{ y{ r{ k{ d{ ]{ V{ O{ H{ A{ :{ 3{ ,{ %{ { { {  { { ûz ôz íz æz ßz Øz Ñz Êz Ãz ¼z µz ®z §z  z ™z ’z ‹z „z }z vz oz hz az Zz Sz Lz Ez >z 7z 0z )z "z z z  z z ÿy øy ñy êy ãy Üy Õy Îy Çy Ày ¹y ²y «y ¤y y –y y ˆy y zy sy ly ey ^y Wy Py Iy By ;y 4y -y &y y y y  y y üx õx îx çx àx Ùx Òx Ëx Äx ½x ¶x ¯x ¨x ¡x šx “x Œx …x ~x wx px ix bx [x Tx Mx Fx ?x 8x 1x *x #x x x x x x ùw òw ëw äw Ýw Öw Ïw Èw Áw ºw ³w ¬w ¥w žw —w w ‰w ‚w {w tw mw fw _w Xw Qw Jw Cw s 7s 0s )s "s s s  s s ÿr ør ñr êr ãr Ür Õr Îr Çr Àr ¹r ²r «r ¤r r –r r ˆr r zr sr lr er ^r Wr Pr Ir Br ;r 4r -r &r r r r  r r üq õq îq çq àq Ùq Òq Ëq Äq ½q ¶q ¯q ¨q ¡q šq “q Œq …q ~q wq pq iq bq [q Tq Mq Fq ?q 8q 1q *q #q q q q q q ùp òp ëp äp Ýp Öp Ïp Èp Áp ºp ³p ¬p ¥p žp —p p ‰p ‚p {p tp mp fp _p Xp Qp Jp Cp 

    L 7L 0L )L "L L L  L L ÿK øK ñK êK ãK ÜK ÕK ÎK ÇK ÀK ¹K ²K «K ¤K K –K K ˆK K zK sK lK eK ^K WK PK IK BK ;K 4K -K &K K K K  K K üJ õJ îJ çJ àJ ÙJ ÒJ ËJ ÄJ ½J ¶J ¯J ¨J ¡J šJ “J ŒJ …J ~J wJ pJ iJ bJ [J TJ MJ FJ ?J 8J 1J *J #J J J J J J ùI òI ëI äI ÝI ÖI ÏI ÈI ÁI ºI ³I ¬I ¥I žI —I I ‰I ‚I {I tI mI fI _I XI QI JI CI E 7E 0E )E "E E E  E E ÿD øD ñD êD ãD ÜD ÕD ÎD ÇD ÀD ¹D ²D «D ¤D D –D D ˆD D zD sD lD eD ^D WD PD ID BD ;D 4D -D &D D D D  D D üC õC îC çC àC ÙC ÒC ËC ÄC ½C ¶C ¯C ¨C ¡C šC “C ŒC …C ~C wC pC iC bC [C TC MC FC ?C 8C 1C *C #C C C C C C ùB òB ëB äB ÝB ÖB ÏB ÈB ÁB ºB ³B ¬B ¥B žB —B B ‰B ‚B {B tB mB fB _B XB QB JB CB  ô> í> æ> ß> Ø> Ñ> Ê> Ã> ¼> µ> ®> §>  > ™> ’> ‹> „> }> v> o> h> a> Z> S> L> E> >> 7> 0> )> "> > >  > > ÿ= ø= ñ= ê= ã= Ü= Õ= Î= Ç= À= ¹= ²= «= ¤= = –= = ˆ= = z= s= l= e= ^= W= P= I= B= ;= 4= -= &= = = =  = = ü< õ< î< ç< à< Ù< Ò< Ë< Ä< ½< ¶< ¯< ¨< ¡< š< “< Œ< …< ~< w< p< i< b< [< T< M< F< ?< 8< 1< *< #< < < < < < ù; ò; ë; ä; Ý; Ö; Ï; È; Á; º; ³; ¬; ¥; ž; —; ; ‰; ‚; {; t; m; f; _; X; Q; J; C; <; 5; .; ';  ; ; ;  ; ; ý: ö: ï: è: á: Ú: Ó: Ì: Å: ¾: ·: °: ©: ¢: ›: ”: : †: : x: q: j: c: \: U: N: G: @: 9: 2: +: $: : : : : : ú9 ó9 ì9 å9 Þ9 ×9 Ð9 É9 Â9 »9 ´9 ­9 ¦9 Ÿ9 ˜9 ‘9 Š9 ƒ9 |9 u9 n9 g9 `9 Y9 R9 K9 D9 =9 69 /9 (9 !9 9 9  9 9 þ8 ÷8 ð8 é8 â8 Û8 Ô8 Í8 Æ8 ¿8 ¸8 ±8 ª8 £8 œ8 •8 Ž8 ‡8 €8 y8 r8 k8 d8 ]8 V8 O8 H8 A8 :8 38 ,8 %8 8 8 8  8 8 û7 ô7 í7 æ7 ß7 Ø7 Ñ7 Ê7 Ã7 ¼7 µ7 ®7 §7  7 ™7 ’7 ‹7 „7 }7 v7 o7 h7 a7 Z7 S7 L7 E7 >7 77 07 )7 "7 7 7  7 7 ÿ6 ø6 ñ6 ê6 ã6 Ü6 Õ6 Î6 Ç6 À6 ¹6 ²6 «6 ¤6 6 –6 6 ˆ6 6 z6 s6 l6 e6 ^6 W6 P6 I6 B6 ;6 46 -6 &6 6 6 6  6 6 ü5 õ5 î5 ç5 à5 Ù5 Ò5 Ë5 Ä5 ½5 ¶5 ¯5 ¨5 ¡5 š5 “5 Œ5 …5 ~5 w5 p5 i5 b5 [5 T5 M5 F5 ?5 85 15 *5 #5 5 5 5 5 5 ù4 ò4 ë4 ä4 Ý4 Ö4 Ï4 È4 Á4 º4 ³4 ¬4 ¥4 ž4 —4 4 ‰4 ‚4 {4 t4 m4 f4 _4 X4 Q4 J4 C4 <4 54 .4 '4  4 4 4  4 4 ý3 ö3 ï3 è3 á3 Ú3 Ó3 Ì3 Å3 ¾3 ·3 °3 ©3 ¢3 ›3 ”3 3 †3 3 x3 q3 j3 c3 \3 U3 N3 G3 @3 93 23 +3 $3 3 3 3 3 3 ú2 ó2 ì2 å2 Þ2 ×2 Ð2 É2 Â2 »2 ´2 ­2 ¦2 Ÿ2 ˜2 ‘2 Š2 ƒ2 |2 u2 n2 g2 `2 Y2 R2 K2 D2 =2 62 /2 (2 !2 2 2  2 2 þ1 ÷1 ð1 é1 â1 Û1 Ô1 Í1 Æ1 ¿1 ¸1 ±1 ª1 £1 œ1 •1 Ž1 ‡1 €1 y1 r1 k1 d1 ]1 V1 O1 H1 A1 :1 31 ,1 %1 1 1 1  1 1 û0 ô0 í0 æ0 ß0 Ø0 Ñ0 Ê0 Ã0 ¼0 µ0 ®0 §0  0 ™0 ’0 ‹0 „0 }0 v0 o0 h0 a0 Z0 S0 L0 E0 >0 70 00 )0 "0 0 0  0 0 ÿ/ ø/ ñ/ ê/ ã/ Ü/ Õ/ Î/ Ç/ À/ ¹/ ²/ «/ ¤/ / –/ / ˆ/ / z/ s/ l/ e/ ^/ W/ P/ I/ B/ ;/ 4/ -/ &/ / / /  / / ü. õ. î. ç. à. Ù. Ò. Ë. Ä. ½. ¶. ¯. ¨. ¡. š. “. Œ. …. ~. w. p. i. b. [. T. M. F. ?. 8. 1. *. #. . . . . . ù- ò- ë- ä- Ý- Ö- Ï- È- Á- º- ³- ¬- ¥- ž- —- - ‰- ‚- {- t- m- f- _- X- Q- J- C- <- 5- .- '-  - - -  - - ý, ö, ï, è, á, Ú, Ó, Ì, Å, ¾, ·, °, ©, ¢, ›, ”, , †, , x, q, j, c, \, U, N, G, @, 9, 2, +, $, , , , , , ú+ ó+ ì+ å+ Þ+ ×+ Ð+ É+ Â+ »+ ´+ ­+ ¦+ Ÿ+ ˜+ ‘+ Š+ ƒ+ |+ u+ n+ g+ `+ Y+ R+ K+ D+ =+ 6+ /+ (+ !+ + +  + + þ* ÷* ð* é* â* Û* Ô* Í* Æ* ¿* ¸* ±* ª* £* œ* •* Ž* ‡* €* y* r* k* d* ]* V* O* H* A* :* 3* ,* %* * * *  * * û) ô) í) æ) ß) Ø) Ñ) Ê) Ã) ¼) µ) ®) §)  ) ™) ’) ‹) „) }) v) o) h) a) Z) S) L) E) >) 7) 0) )) ") ) )  ) ) ÿ( ø( ñ( ê( ã( Ü( Õ( Î( Ç( À( ¹( ²( «( ¤( ( –( ( ˆ( ( z( s( l( e( ^( W( P( I( B( ;( 4( -( &( ( ( (  ( ( ü' õ' î' ç' à' Ù' Ò' Ë' Ä' ½' ¶' ¯' ¨' ¡' š' “' Œ' …' ~' w' p' i' b' [' T' M' F' ?' 8' 1' *' #' ' ' ' ' ' ù& ò& ë& ä& Ý& Ö& Ï& È& Á& º& ³& ¬& ¥& ž& —& & ‰& ‚& {& t& m& f& _& X& Q& J& C& <& 5& .& '&  & & &  & & ý% ö% ï% è% á% Ú% Ó% Ì% Å% ¾% ·% °% ©% ¢% ›% ”% % †% % x% q% j% c% \% U% N% G% @% 9% 2% +% $% % % % % % ú$ ó$ ì$ å$ Þ$ ×$ Ð$ É$ Â$ »$ ´$ ­$ ¦$ Ÿ$ ˜$ ‘$ Š$ ƒ$ |$ u$ n$ g$ `$ Y$ R$ K$ D$ =$ 6$ /$ ($ !$ $ $  $ $ þ# ÷# ð# é# â# Û# Ô# Í# Æ# ¿# ¸# ±# ª# £# œ# •# Ž# ‡# €# y# r# k# d# ]# V# O# H# A# :# 3# ,# %# # # #  # # û" ô" í" æ" ß" Ø" Ñ" Ê" Ã" ¼" µ" ®" §"  " ™" ’" ‹" „" }" v" o" h" a" Z" S" L" E" >" 7" 0" )" "" " "  " " ÿ! ø! ñ! ê! ã! Ü! Õ! Î! Ç! À! ¹! ²! «! ¤! ! –! ! ˆ! ! z! s! l! e! ^! W! P! I! B! ;! 4! -! &! ! ! !  ! ! ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûÿ ôÿ íÿ æÿ ßÿ Øÿ Ñÿ Êÿ Ãÿ ¼ÿ µÿ ®ÿ §ÿ  ÿ ™ÿ ’ÿ ‹ÿ „ÿ }ÿ vÿ oÿ hÿ aÿ Zÿ Sÿ Lÿ Eÿ >ÿ 7ÿ 0ÿ )ÿ "ÿ ÿ ÿ  ÿ ÿ ÿþ øþ ñþ êþ ãþ Üþ Õþ Îþ Çþ Àþ ¹þ ²þ «þ ¤þ þ –þ þ ˆþ þ zþ sþ lþ eþ ^þ Wþ Pþ Iþ Bþ ;þ 4þ -þ &þ þ þ þ  þ þ üý õý îý çý àý Ùý Òý Ëý Äý ½ý ¶ý ¯ý ¨ý ¡ý šý “ý Œý …ý ~ý wý pý iý bý [ý Tý Mý Fý ?ý 8ý 1ý *ý #ý ý ý ý ý ý ùü òü ëü äü Ýü Öü Ïü Èü Áü ºü ³ü ¬ü ¥ü žü —ü ü ‰ü ‚ü {ü tü mü fü _ü Xü Qü Jü Cü <ü 5ü .ü 'ü  ü ü ü  ü ü ýû öû ïû èû áû Úû Óû Ìû Åû ¾û ·û °û ©û ¢û ›û ”û û †û û xû qû jû cû \û Uû Nû Gû @û 9û 2û +û $û û û û û û úú óú ìú åú Þú ×ú Ðú Éú Âú »ú ´ú ­ú ¦ú Ÿú ˜ú ‘ú Šú ƒú |ú uú nú gú `ú Yú Rú Kú Dú =ú 6ú /ú (ú !ú ú ú  ú ú þù ÷ù ðù éù âù Ûù Ôù Íù Æù ¿ù ¸ù ±ù ªù £ù œù •ù Žù ‡ù €ù yù rù kù dù ]ù Vù Où Hù Aù :ù 3ù ,ù %ù ù ù ù  ù ù ûø ôø íø æø ßø Øø Ñø Êø Ãø ¼ø µø ®ø §ø  ø ™ø ’ø ‹ø „ø }ø vø oø hø aø Zø Sø Lø Eø >ø 7ø 0ø )ø "ø ø ø  ø ø ÿ÷ ø÷ ñ÷ ê÷ ã÷ Ü÷ Õ÷ Î÷ Ç÷ À÷ ¹÷ ²÷ «÷ ¤÷ ÷ –÷ ÷ ˆ÷ ÷ z÷ s÷ l÷ e÷ ^÷ W÷ P÷ I÷ B÷ ;÷ 4÷ -÷ &÷ ÷ ÷ ÷  ÷ ÷ üö õö îö çö àö Ùö Òö Ëö Äö ½ö ¶ö ¯ö ¨ö ¡ö šö “ö Œö …ö ~ö wö pö iö bö [ö Tö Mö Fö ?ö 8ö 1ö *ö #ö ö ö ö ö ö ùõ òõ ëõ äõ Ýõ Öõ Ïõ Èõ Áõ ºõ ³õ ¬õ ¥õ žõ —õ õ ‰õ ‚õ {õ tõ mõ fõ _õ Xõ Qõ Jõ Cõ <õ 5õ .õ 'õ  õ õ õ  õ õ ýô öô ïô èô áô Úô Óô Ìô Åô ¾ô ·ô °ô ©ô ¢ô ›ô ”ô ô †ô ô xô qô jô cô \ô Uô Nô Gô @ô 9ô 2ô +ô $ô ô ô ô ô ô úó óó ìó åó Þó ×ó Ðó Éó Âó »ó ´ó ­ó ¦ó Ÿó ˜ó ‘ó Šó ƒó |ó uó nó gó `ó Yó Ró Kó Dó =ó 6ó /ó (ó !ó ó ó  ó ó þò ÷ò ðò éò âò Ûò Ôò Íò Æò ¿ò ¸ò ±ò ªò £ò œò •ò Žò ‡ò €ò yò rò kò dò ]ò Vò Oò Hò Aò :ò 3ò ,ò %ò ò ò ò  ò ò ûñ ôñ íñ æñ ßñ Øñ Ññ Êñ Ãñ ¼ñ µñ ®ñ §ñ  ñ ™ñ ’ñ ‹ñ „ñ }ñ vñ oñ hñ añ Zñ Sñ Lñ Eñ >ñ 7ñ 0ñ )ñ "ñ ñ ñ  ñ ñ ÿð øð ñð êð ãð Üð Õð Îð Çð Àð ¹ð ²ð «ð ¤ð ð –ð ð ˆð ð zð sð lð eð ^ð Wð Pð Ið Bð ;ð 4ð -ð &ð ð ð ð  ð ð üï õï îï çï àï Ùï Òï Ëï Äï ½ï ¶ï ¯ï ¨ï ¡ï šï “ï Œï …ï ~ï wï pï iï bï [ï Tï Mï Fï ?ï 8ï 1ï *ï #ï ï ï ï ï ï ùî òî ëî äî Ýî Öî Ïî Èî Áî ºî ³î ¬î ¥î žî —î î ‰î ‚î {î tî mî fî _î Xî Qî Jî Cî <î 5î .î 'î  î î î  î î ýí öí ïí èí áí Úí Óí Ìí Åí ¾í ·í °í ©í ¢í ›í ”í í †í í xí qí jí cí \í Uí Ní Gí @í 9í 2í +í $í í í í í í úì óì ìì åì Þì ×ì Ðì Éì Âì »ì ´ì ­ì ¦ì Ÿì ˜ì ‘ì Šì ƒì |ì uì nì gì `ì Yì Rì Kì Dì =ì 6ì /ì (ì !ì ì ì  ì ì þë ÷ë ðë éë âë Ûë Ôë Íë Æë ¿ë ¸ë ±ë ªë £ë œë •ë Žë ‡ë €ë yë rë kë dë ]ë Vë Oë Hë Aë :ë 3ë ,ë %ë ë ë ë  ë ë ûê ôê íê æê ßê Øê Ñê Êê Ãê ¼ê µê ®ê §ê  ê ™ê ’ê ‹ê „ê }ê vê oê hê aê Zê Sê Lê Eê >ê 7ê 0ê )ê "ê ê ê  ê ê ÿé øé ñé êé ãé Üé Õé Îé Çé Àé ¹é ²é «é ¤é é –é é ˆé é zé sé lé eé ^é Wé Pé Ié Bé ;é 4é -é &é é é é  é é üè õè îè çè àè Ùè Òè Ëè Äè ½è ¶è ¯è ¨è ¡è šè “è Œè …è ~è wè pè iè bè [è Tè Mè Fè ?è 8è 1è *è #è è è è è è ùç òç ëç äç Ýç Öç Ïç Èç Áç ºç ³ç ¬ç ¥ç žç —ç ç ‰ç ‚ç {ç tç mç fç _ç Xç Qç Jç Cç <ç 5ç .ç 'ç  ç ç ç  ç ç ýæ öæ ïæ èæ áæ Úæ Óæ Ìæ Åæ ¾æ ·æ °æ ©æ ¢æ ›æ ”æ æ †æ æ xæ qæ jæ cæ \æ Uæ Næ Gæ @æ 9æ 2æ +æ $æ æ æ æ æ æ úå óå ìå åå Þå ×å Ðå Éå Âå »å ´å ­å ¦å Ÿå ˜å ‘å Šå ƒå |å uå nå gå `å Yå Rå Kå Då =å 6å /å (å !å å å  å å þä ÷ä ðä éä âä Ûä Ôä Íä Æä ¿ä ¸ä ±ä ªä £ä œä •ä Žä ‡ä €ä yä rä kä dä ]ä Vä Oä Hä Aä :ä 3ä ,ä %ä ä ä ä  ä ä ûã ôã íã æã ßã Øã Ñã Êã Ãã ¼ã µã ®ã §ã  ã ™ã ’ã ‹ã „ã }ã vã oã hã aã Zã Sã Lã Eã >ã 7ã 0ã )ã "ã ã ã  ã ã ÿâ øâ ñâ êâ ãâ Üâ Õâ Îâ Çâ À⠹⠲⠫⠤â â –â â ˆâ â zâ sâ lâ eâ ^â Wâ Pâ Iâ Bâ ;â 4â -â &â â â â  â â üá õá îá çá àá Ùá Òá Ëá Äá ½á ¶á ¯á ¨á ¡á šá “á Œá …á ~á wá pá iá bá [á Tá Má Fá ?á 8á 1á *á #á á á á á á ùà òà ëà äà Ýà Öà Ïà Èà Áà ºà ³à ¬à ¥à žà —à à ‰à ‚à {à tà mà fà _à Xà Qà Jà Cà <à 5à .à 'à  à à à  à à ýß öß ïß èß áß Úß Óß Ìß Åß ¾ß ·ß °ß ©ß ¢ß ›ß ”ß ß †ß ß xß qß jß cß \ß Uß Nß Gß @ß 9ß 2ß +ß $ß ß ß ß ß ß úÞ óÞ ìÞ åÞ ÞÞ ×Þ ÐÞ ÉÞ ÂÞ »Þ ´Þ ­Þ ¦Þ ŸÞ ˜Þ ‘Þ ŠÞ ƒÞ |Þ uÞ nÞ gÞ `Þ YÞ RÞ KÞ DÞ =Þ 6Þ /Þ (Þ !Þ Þ Þ  Þ Þ þÝ ÷Ý ðÝ éÝ âÝ ÛÝ ÔÝ ÍÝ ÆÝ ¿Ý ¸Ý ±Ý ªÝ £Ý œÝ •Ý ŽÝ ‡Ý €Ý yÝ rÝ kÝ dÝ ]Ý VÝ OÝ HÝ AÝ :Ý 3Ý ,Ý %Ý Ý Ý Ý  Ý Ý ûÜ ôÜ íÜ æÜ ßÜ ØÜ ÑÜ ÊÜ ÃÜ ¼Ü µÜ ®Ü §Ü  Ü ™Ü ’Ü ‹Ü „Ü }Ü vÜ oÜ hÜ aÜ ZÜ SÜ LÜ EÜ >Ü 7Ü 0Ü )Ü "Ü Ü Ü  Ü Ü ÿÛ øÛ ñÛ êÛ ãÛ ÜÛ ÕÛ ÎÛ ÇÛ ÀÛ ¹Û ²Û «Û ¤Û Û –Û Û ˆÛ Û zÛ sÛ lÛ eÛ ^Û WÛ PÛ IÛ BÛ ;Û 4Û -Û &Û Û Û Û  Û Û üÚ õÚ îÚ çÚ àÚ ÙÚ ÒÚ ËÚ ÄÚ ½Ú ¶Ú ¯Ú ¨Ú ¡Ú šÚ “Ú ŒÚ …Ú ~Ú wÚ pÚ iÚ bÚ [Ú TÚ MÚ FÚ ?Ú 8Ú 1Ú *Ú #Ú Ú Ú Ú Ú Ú ùÙ òÙ ëÙ äÙ ÝÙ ÖÙ ÏÙ ÈÙ ÁÙ ºÙ ³Ù ¬Ù ¥Ù žÙ —Ù Ù ‰Ù ‚Ù {Ù tÙ mÙ fÙ _Ù XÙ QÙ JÙ CÙ <Ù 5Ù .Ù 'Ù  Ù Ù Ù  Ù Ù ýØ öØ ïØ èØ áØ ÚØ ÓØ ÌØ ÅØ ¾Ø ·Ø °Ø ©Ø ¢Ø ›Ø ”Ø Ø †Ø Ø xØ qØ jØ cØ \Ø UØ NØ GØ @Ø 9Ø 2Ø +Ø $Ø Ø Ø Ø Ø Ø ú× ó× ì× å× Þ× ×× Ð× É× Â× »× ´× ­× ¦× Ÿ× ˜× ‘× Š× ƒ× |× u× n× g× `× Y× R× K× D× =× 6× /× (× !× × ×  × × þÖ ÷Ö ðÖ éÖ âÖ ÛÖ ÔÖ ÍÖ ÆÖ ¿Ö ¸Ö ±Ö ªÖ £Ö œÖ •Ö ŽÖ ‡Ö €Ö yÖ rÖ kÖ dÖ ]Ö VÖ OÖ HÖ AÖ :Ö 3Ö ,Ö %Ö Ö Ö Ö  Ö Ö ûÕ ôÕ íÕ æÕ ßÕ ØÕ ÑÕ ÊÕ ÃÕ ¼Õ µÕ ®Õ §Õ  Õ ™Õ ’Õ ‹Õ „Õ }Õ vÕ oÕ hÕ aÕ ZÕ SÕ LÕ EÕ >Õ 7Õ 0Õ )Õ "Õ Õ Õ  Õ Õ ÿÔ øÔ ñÔ êÔ ãÔ ÜÔ ÕÔ ÎÔ ÇÔ ÀÔ ¹Ô ²Ô «Ô ¤Ô Ô –Ô Ô ˆÔ Ô zÔ sÔ lÔ eÔ ^Ô WÔ PÔ IÔ BÔ ;Ô 4Ô -Ô &Ô Ô Ô Ô  Ô Ô üÓ õÓ îÓ çÓ àÓ ÙÓ ÒÓ ËÓ ÄÓ ½Ó ¶Ó ¯Ó ¨Ó ¡Ó šÓ “Ó ŒÓ …Ó ~Ó wÓ pÓ iÓ bÓ [Ó TÓ MÓ FÓ ?Ó 8Ó 1Ó *Ó #Ó Ó Ó Ó Ó Ó ùÒ òÒ ëÒ äÒ ÝÒ ÖÒ ÏÒ ÈÒ ÁÒ ºÒ ³Ò ¬Ò ¥Ò žÒ —Ò Ò ‰Ò ‚Ò {Ò tÒ mÒ fÒ _Ò XÒ QÒ JÒ CÒ <Ò 5Ò .Ò 'Ò  Ò Ò Ò  Ò Ò ýÑ öÑ ïÑ èÑ áÑ ÚÑ ÓÑ ÌÑ ÅÑ ¾Ñ ·Ñ °Ñ ©Ñ ¢Ñ ›Ñ ”Ñ Ñ †Ñ Ñ xÑ qÑ jÑ cÑ \Ñ UÑ NÑ GÑ @Ñ 9Ñ 2Ñ +Ñ $Ñ Ñ Ñ Ñ Ñ Ñ úÐ óÐ ìÐ åÐ ÞÐ ×Ð ÐÐ ÉÐ ÂÐ »Ð ´Ð ­Ð ¦Ð ŸÐ ˜Ð ‘Ð ŠÐ ƒÐ |Ð uÐ nÐ gÐ `Ð YÐ RÐ KÐ DÐ =Ð 6Ð /Ð (Ð !Ð Ð Ð  Ð Ð þÏ ÷Ï ðÏ éÏ âÏ ÛÏ ÔÏ ÍÏ ÆÏ ¿Ï ¸Ï ±Ï ªÏ £Ï œÏ •Ï ŽÏ ‡Ï €Ï yÏ rÏ kÏ dÏ ]Ï VÏ OÏ HÏ AÏ :Ï 3Ï ,Ï %Ï Ï Ï Ï  Ï Ï ûÎ ôÎ íÎ æÎ ßÎ ØÎ ÑÎ ÊÎ ÃÎ ¼Î µÎ ®Î §Î  Î ™Î ’Î ‹Î „Î }Î vÎ oÎ hÎ aÎ ZÎ SÎ LÎ EÎ >Î 7Î 0Î )Î "Î Î Î  Î Î ÿÍ øÍ ñÍ êÍ ãÍ ÜÍ ÕÍ ÎÍ ÇÍ ÀÍ ¹Í ²Í «Í ¤Í Í –Í Í ˆÍ Í zÍ sÍ lÍ eÍ ^Í WÍ PÍ IÍ BÍ ;Í 4Í -Í &Í Í Í Í  Í Í üÌ õÌ îÌ çÌ àÌ ÙÌ ÒÌ ËÌ ÄÌ ½Ì ¶Ì ¯Ì ¨Ì ¡Ì šÌ “Ì ŒÌ …Ì ~Ì wÌ pÌ iÌ bÌ [Ì TÌ MÌ FÌ ?Ì 8Ì 1Ì *Ì #Ì Ì Ì Ì Ì Ì ùË òË ëË äË ÝË ÖË ÏË ÈË ÁË ºË ³Ë ¬Ë ¥Ë žË —Ë Ë ‰Ë ‚Ë {Ë tË mË fË _Ë XË QË JË CË <Ë 5Ë .Ë 'Ë  Ë Ë Ë  Ë Ë ýÊ öÊ ïÊ èÊ áÊ ÚÊ ÓÊ ÌÊ ÅÊ ¾Ê ·Ê °Ê ©Ê ¢Ê ›Ê ”Ê Ê †Ê Ê xÊ qÊ jÊ cÊ \Ê UÊ NÊ GÊ @Ê 9Ê 2Ê +Ê $Ê Ê Ê Ê Ê Ê úÉ óÉ ìÉ åÉ ÞÉ ×É ÐÉ ÉÉ ÂÉ »É ´É ­É ¦É ŸÉ ˜É ‘É ŠÉ ƒÉ |É uÉ nÉ gÉ `É YÉ RÉ KÉ DÉ =É 6É /É (É !É É É  É É þÈ ÷È ðÈ éÈ âÈ ÛÈ ÔÈ ÍÈ ÆÈ ¿È ¸È ±È ªÈ £È œÈ •È ŽÈ ‡È €È yÈ rÈ kÈ dÈ ]È VÈ OÈ HÈ AÈ :È 3È ,È %È È È È  È È ûÇ ôÇ íÇ æÇ ßÇ ØÇ ÑÇ ÊÇ ÃÇ ¼Ç µÇ ®Ç §Ç  Ç ™Ç ’Ç ‹Ç „Ç }Ç vÇ oÇ hÇ aÇ ZÇ SÇ LÇ EÇ >Ç 7Ç 0Ç )Ç "Ç Ç Ç  Ç Ç ÿÆ øÆ ñÆ êÆ ãÆ ÜÆ ÕÆ ÎÆ ÇÆ ÀÆ ¹Æ ²Æ «Æ ¤Æ Æ –Æ Æ ˆÆ Æ zÆ sÆ lÆ eÆ ^Æ WÆ PÆ IÆ BÆ ;Æ 4Æ -Æ &Æ Æ Æ Æ  Æ Æ üÅ õÅ îÅ çÅ àÅ ÙÅ ÒÅ ËÅ ÄÅ ½Å ¶Å ¯Å ¨Å ¡Å šÅ “Å ŒÅ …Å ~Å wÅ pÅ iÅ bÅ [Å TÅ MÅ FÅ ?Å 8Å 1Å *Å #Å Å Å Å Å Å ùÄ òÄ ëÄ äÄ ÝÄ ÖÄ ÏÄ ÈÄ ÁÄ ºÄ ³Ä ¬Ä ¥Ä žÄ —Ä Ä ‰Ä ‚Ä {Ä tÄ mÄ fÄ _Ä XÄ QÄ JÄ CÄ <Ä 5Ä .Ä 'Ä  Ä Ä Ä  Ä Ä ýà öà ïà èà áà Úà Óà Ìà Åà ¾Ã ·Ã °Ã ©Ã ¢Ã ›Ã ”à à †Ã à xà qà jà cà \à Uà Nà Gà @à 9à 2à +à $à à à à à à ú ó ì å Þ × РÉ  »Â ´Â ­Â ¦Â ŸÂ ˜Â ‘ ŠÂ ƒÂ | u n g ` Y R K D = 6 / ( !      þÁ ÷Á ðÁ éÁ âÁ ÛÁ ÔÁ ÍÁ ÆÁ ¿Á ¸Á ±Á ªÁ £Á œÁ •Á ŽÁ ‡Á €Á yÁ rÁ kÁ dÁ ]Á VÁ OÁ HÁ AÁ :Á 3Á ,Á %Á Á Á Á  Á Á ûÀ ôÀ íÀ æÀ ßÀ ØÀ ÑÀ ÊÀ ÃÀ ¼À µÀ ®À §À  À ™À ’À ‹À „À }À vÀ oÀ hÀ aÀ ZÀ SÀ LÀ EÀ >À 7À 0À )À "À À À  À À ÿ¿ ø¿ ñ¿ ê¿ ã¿ Ü¿ Õ¿ ο Ç¿ À¿ ¹¿ ²¿ «¿ ¤¿ ¿ –¿ ¿ ˆ¿ ¿ z¿ s¿ l¿ e¿ ^¿ W¿ P¿ I¿ B¿ ;¿ 4¿ -¿ &¿ ¿ ¿ ¿  ¿ ¿ ü¾ õ¾ î¾ ç¾ ྠÙ¾ Ò¾ ˾ ľ ½¾ ¶¾ ¯¾ ¨¾ ¡¾ š¾ “¾ Œ¾ …¾ ~¾ w¾ p¾ i¾ b¾ [¾ T¾ M¾ F¾ ?¾ 8¾ 1¾ *¾ #¾ ¾ ¾ ¾ ¾ ¾ ù½ ò½ ë½ ä½ ݽ Ö½ Ͻ Ƚ Á½ º½ ³½ ¬½ ¥½ ž½ —½ ½ ‰½ ‚½ {½ t½ m½ f½ _½ X½ Q½ J½ C½ <½ 5½ .½ '½  ½ ½ ½  ½ ½ ý¼ ö¼ ï¼ è¼ á¼ Ú¼ Ó¼ ̼ ż ¾¼ ·¼ °¼ ©¼ ¢¼ ›¼ ”¼ ¼ †¼ ¼ x¼ q¼ j¼ c¼ \¼ U¼ N¼ G¼ @¼ 9¼ 2¼ +¼ $¼ ¼ ¼ ¼ ¼ ¼ ú» ó» ì» å» Þ» ×» л É» » »» ´» ­» ¦» Ÿ» ˜» ‘» Š» ƒ» |» u» n» g» `» Y» R» K» D» =» 6» /» (» !» » »  » » þº ÷º ðº éº ⺠Ûº Ôº ͺ ƺ ¿º ¸º ±º ªº £º œº •º Žº ‡º €º yº rº kº dº ]º Vº Oº Hº Aº :º 3º ,º %º º º º  º º û¹ ô¹ í¹ æ¹ ß¹ ع ѹ ʹ ù ¼¹ µ¹ ®¹ §¹  ¹ ™¹ ’¹ ‹¹ „¹ }¹ v¹ o¹ h¹ a¹ Z¹ S¹ L¹ E¹ >¹ 7¹ 0¹ )¹ "¹ ¹ ¹  ¹ ¹ ÿ¸ ø¸ ñ¸ ê¸ 㸠ܸ Õ¸ θ Ǹ À¸ ¹¸ ²¸ «¸ ¤¸ ¸ –¸ ¸ ˆ¸ ¸ z¸ s¸ l¸ e¸ ^¸ W¸ P¸ I¸ B¸ ;¸ 4¸ -¸ &¸ ¸ ¸ ¸  ¸ ¸ ü· õ· î· ç· à· Ù· Ò· Ë· Ä· ½· ¶· ¯· ¨· ¡· š· “· Œ· …· ~· w· p· i· b· [· T· M· F· ?· 8· 1· *· #· · · · · · ù¶ ò¶ ë¶ ä¶ ݶ Ö¶ ϶ ȶ Á¶ º¶ ³¶ ¬¶ ¥¶ ž¶ —¶ ¶ ‰¶ ‚¶ {¶ t¶ m¶ f¶ _¶ X¶ Q¶ J¶ C¶ <¶ 5¶ .¶ '¶  ¶ ¶ ¶  ¶ ¶ ýµ öµ ïµ èµ áµ Úµ Óµ ̵ ŵ ¾µ ·µ °µ ©µ ¢µ ›µ ”µ µ †µ µ xµ qµ jµ cµ \µ Uµ Nµ Gµ @µ 9µ 2µ +µ $µ µ µ µ µ µ ú´ ó´ ì´ å´ Þ´ ×´ д É´ ´ »´ ´´ ­´ ¦´ Ÿ´ ˜´ ‘´ Š´ ƒ´ |´ u´ n´ g´ `´ Y´ R´ K´ D´ =´ 6´ /´ (´ !´ ´ ´  ´ ´ þ³ ÷³ ð³ é³ â³ Û³ Ô³ ͳ Ƴ ¿³ ¸³ ±³ ª³ £³ œ³ •³ ޳ ‡³ €³ y³ r³ k³ d³ ]³ V³ O³ H³ A³ :³ 3³ ,³ %³ ³ ³ ³  ³ ³ û² ô² í² æ² ß² ز Ѳ ʲ ò ¼² µ² ®² §²  ² ™² ’² ‹² „² }² v² o² h² a² Z² S² L² E² >² 7² 0² )² "² ² ²  ² ² ÿ± ø± ñ± ê± ã± ܱ Õ± α DZ À± ¹± ²± «± ¤± ± –± ± ˆ± ± z± s± l± e± ^± W± P± I± B± ;± 4± -± &± ± ± ±  ± ± ü° õ° î° ç° à° Ù° Ò° ˰ İ ½° ¶° ¯° ¨° ¡° š° “° Œ° …° ~° w° p° i° b° [° T° M° F° ?° 8° 1° *° #° ° ° ° ° ° ù¯ ò¯ ë¯ ä¯ ݯ Ö¯ ϯ ȯ Á¯ º¯ ³¯ ¬¯ ¥¯ ž¯ —¯ ¯ ‰¯ ‚¯ {¯ t¯ m¯ f¯ _¯ X¯ Q¯ J¯ C¯ <¯ 5¯ .¯ '¯  ¯ ¯ ¯  ¯ ¯ ý® ö® ï® è® á® Ú® Ó® Ì® Å® ¾® ·® °® ©® ¢® ›® ”® ® †® ® x® q® j® c® \® U® N® G® @® 9® 2® +® $® ® ® ® ® ® ú­ ó­ ì­ å­ Þ­ ×­ Э É­ ­ »­ ´­ ­­ ¦­ Ÿ­ ˜­ ‘­ Š­ ƒ­ |­ u­ n­ g­ `­ Y­ R­ K­ D­ =­ 6­ /­ (­ !­ ­ ­  ­ ­ þ¬ ÷¬ ð¬ é¬ ⬠Û¬ Ô¬ ͬ Ƭ ¿¬ ¸¬ ±¬ ª¬ £¬ œ¬ •¬ ެ ‡¬ €¬ y¬ r¬ k¬ d¬ ]¬ V¬ O¬ H¬ A¬ :¬ 3¬ ,¬ %¬ ¬ ¬ ¬  ¬ ¬ û« ô« í« æ« ß« Ø« Ñ« Ê« ë ¼« µ« ®« §«  « ™« ’« ‹« „« }« v« o« h« a« Z« S« L« E« >« 7« 0« )« "« « «  « « ÿª øª ñª êª 㪠ܪ Õª Ϊ Ǫ Àª ¹ª ²ª «ª ¤ª ª –ª ª ˆª ª zª sª lª eª ^ª Wª Pª Iª Bª ;ª 4ª -ª &ª ª ª ª  ª ª ü© õ© î© ç© à© Ù© Ò© Ë© Ä© ½© ¶© ¯© ¨© ¡© š© “© Œ© …© ~© w© p© i© b© [© T© M© F© ?© 8© 1© *© #© © © © © © ù¨ ò¨ ë¨ ä¨ ݨ Ö¨ Ϩ Ȩ Á¨ º¨ ³¨ ¬¨ ¥¨ ž¨ —¨ ¨ ‰¨ ‚¨ {¨ t¨ m¨ f¨ _¨ X¨ Q¨ J¨ C¨ <¨ 5¨ .¨ '¨  ¨ ¨ ¨  ¨ ¨ ý§ ö§ ï§ è§ á§ Ú§ Ó§ ̧ ŧ ¾§ ·§ °§ ©§ ¢§ ›§ ”§ § †§ § x§ q§ j§ c§ \§ U§ N§ G§ @§ 9§ 2§ +§ $§ § § § § § ú¦ ó¦ ì¦ å¦ Þ¦ צ Ц ɦ ¦ »¦ ´¦ ­¦ ¦¦ Ÿ¦ ˜¦ ‘¦ Ц ƒ¦ |¦ u¦ n¦ g¦ `¦ Y¦ R¦ K¦ D¦ =¦ 6¦ /¦ (¦ !¦ ¦ ¦  ¦ ¦ þ¥ ÷¥ ð¥ é¥ ⥠Û¥ Ô¥ Í¥ Æ¥ ¿¥ ¸¥ ±¥ ª¥ £¥ œ¥ •¥ Ž¥ ‡¥ €¥ y¥ r¥ k¥ d¥ ]¥ V¥ O¥ H¥ A¥ :¥ 3¥ ,¥ %¥ ¥ ¥ ¥  ¥ ¥ û¤ ô¤ í¤ æ¤ ߤ ؤ Ѥ ʤ ä ¼¤ µ¤ ®¤ §¤  ¤ ™¤ ’¤ ‹¤ „¤ }¤ v¤ o¤ h¤ a¤ Z¤ S¤ L¤ E¤ >¤ 7¤ 0¤ )¤ "¤ ¤ ¤  ¤ ¤ ÿ£ ø£ ñ£ ê£ 㣠Ü£ Õ£ Σ Ç£ À£ ¹£ ²£ «£ ¤£ £ –£ £ ˆ£ £ z£ s£ l£ e£ ^£ W£ P£ I£ B£ ;£ 4£ -£ &£ £ £ £  £ £ ü¢ õ¢ î¢ ç¢ ࢠÙ¢ Ò¢ Ë¢ Ä¢ ½¢ ¶¢ ¯¢ ¨¢ ¡¢ 𢠓¢ Œ¢ …¢ ~¢ w¢ p¢ i¢ b¢ [¢ T¢ M¢ F¢ ?¢ 8¢ 1¢ *¢ #¢ ¢ ¢ ¢ ¢ ¢ ù¡ ò¡ ë¡ ä¡ Ý¡ Ö¡ Ï¡ È¡ Á¡ º¡ ³¡ ¬¡ ¥¡ ž¡ —¡ ¡ ‰¡ ‚¡ {¡ t¡ m¡ f¡ _¡ X¡ Q¡ J¡ C¡ <¡ 5¡ .¡ '¡  ¡ ¡ ¡  ¡ ¡ ý  ö  ï  è  á  Ú  Ó  Ì  Å  ¾  ·  °  ©  ¢  ›  ”    †    x  q  j  c  \  U  N  G  @  9  2  +  $            úŸ óŸ ìŸ åŸ ÞŸ ן П ÉŸ Ÿ »Ÿ ´Ÿ ­Ÿ ¦Ÿ ŸŸ ˜Ÿ ‘Ÿ ŠŸ ƒŸ |Ÿ uŸ nŸ gŸ `Ÿ YŸ RŸ KŸ DŸ =Ÿ 6Ÿ /Ÿ (Ÿ !Ÿ Ÿ Ÿ  Ÿ Ÿ þž ÷ž ðž éž âž Ûž Ôž Íž Æž ¿ž ¸ž ±ž ªž £ž œž •ž Žž ‡ž €ž yž rž kž dž ]ž Vž Ož Hž Až :ž 3ž ,ž %ž ž ž ž  ž ž û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿœ øœ ñœ êœ 㜠Üœ Õœ Μ Çœ Àœ ¹œ ²œ «œ ¤œ œ –œ œ ˆœ œ zœ sœ lœ eœ ^œ Wœ Pœ Iœ Bœ ;œ 4œ -œ &œ œ œ œ  œ œ ü› õ› î› ç› à› Ù› Ò› Ë› Ä› ½› ¶› ¯› ¨› ¡› š› “› Œ› …› ~› w› p› i› b› [› T› M› F› ?› 8› 1› *› #› › › › › › ùš òš ëš äš Ýš Öš Ïš Èš Áš ºš ³š ¬š ¥š žš —š š ‰š ‚š {š tš mš fš _š Xš Qš Jš Cš <š 5š .š 'š  š š š  š š ý™ ö™ ï™ è™ á™ Ú™ Ó™ Ì™ Å™ ¾™ ·™ °™ ©™ ¢™ ›™ ”™ ™ †™ ™ x™ q™ j™ c™ \™ U™ N™ G™ @™ 9™ 2™ +™ $™ ™ ™ ™ ™ ™ ú˜ ó˜ ì˜ å˜ Þ˜ ט И ɘ ˜ »˜ ´˜ ­˜ ¦˜ Ÿ˜ ˜˜ ‘˜ Š˜ ƒ˜ |˜ u˜ n˜ g˜ `˜ Y˜ R˜ K˜ D˜ =˜ 6˜ /˜ (˜ !˜ ˜ ˜  ˜ ˜ þ— ÷— ð— é— â— Û— Ô— Í— Æ— ¿— ¸— ±— ª— £— œ— •— Ž— ‡— €— y— r— k— d— ]— V— O— H— A— :— 3— ,— %— — — —  — — û– ô– í– æ– ß– Ø– Ñ– Ê– Ö ¼– µ– ®– §–  – ™– ’– ‹– „– }– v– o– h– a– Z– S– L– E– >– 7– 0– )– "– – –  – – ÿ• ø• ñ• ê• ã• Ü• Õ• Ε Ç• À• ¹• ²• «• ¤• • –• • ˆ• • z• s• l• e• ^• W• P• I• B• ;• 4• -• &• • • •  • • ü” õ” î” ç” à” Ù” Ò” Ë” Ä” ½” ¶” ¯” ¨” ¡” š” “” Œ” …” ~” w” p” i” b” [” T” M” F” ?” 8” 1” *” #” ” ” ” ” ” ù“ ò“ ë“ ä“ Ý“ Ö“ Ï“ È“ Á“ º“ ³“ ¬“ ¥“ ž“ —“ “ ‰“ ‚“ {“ t“ m“ f“ _“ X“ Q“ J“ C“ <“ 5“ .“ '“  “ “ “  “ “ ý’ ö’ ï’ è’ á’ Ú’ Ó’ Ì’ Å’ ¾’ ·’ °’ ©’ ¢’ ›’ ”’ ’ †’ ’ x’ q’ j’ c’ \’ U’ N’ G’ @’ 9’ 2’ +’ $’ ’ ’ ’ ’ ’ ú‘ ó‘ ì‘ å‘ Þ‘ ב Б É‘ ‘ »‘ ´‘ ­‘ ¦‘ Ÿ‘ ˜‘ ‘‘ Š‘ ƒ‘ |‘ u‘ n‘ g‘ `‘ Y‘ R‘ K‘ D‘ =‘ 6‘ /‘ (‘ !‘ ‘ ‘  ‘ ‘ þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿŽ øŽ ñŽ êŽ ㎠ÜŽ ÕŽ ÎŽ ÇŽ ÀŽ ¹Ž ²Ž «Ž ¤Ž Ž –Ž Ž ˆŽ Ž zŽ sŽ lŽ eŽ ^Ž WŽ PŽ IŽ BŽ ;Ž 4Ž -Ž &Ž Ž Ž Ž  Ž Ž ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŒ òŒ ëŒ äŒ ÝŒ ÖŒ ÏŒ ÈŒ ÁŒ ºŒ ³Œ ¬Œ ¥Œ žŒ —Œ Œ ‰Œ ‚Œ {Œ tŒ mŒ fŒ _Œ XŒ QŒ JŒ CŒ <Œ 5Œ .Œ 'Œ  Œ Œ Œ  Œ Œ ý‹ ö‹ ï‹ è‹ á‹ Ú‹ Ó‹ Ì‹ Å‹ ¾‹ ·‹ °‹ ©‹ ¢‹ ›‹ ”‹ ‹ †‹ ‹ x‹ q‹ j‹ c‹ \‹ U‹ N‹ G‹ @‹ 9‹ 2‹ +‹ $‹ ‹ ‹ ‹ ‹ ‹ úŠ óŠ ìŠ åŠ ÞŠ ׊ Њ ÉŠ Š »Š ´Š ­Š ¦Š ŸŠ ˜Š ‘Š ŠŠ ƒŠ |Š uŠ nŠ gŠ `Š YŠ RŠ KŠ DŠ =Š 6Š /Š (Š !Š Š Š  Š Š þ‰ ÷‰ ð‰ é‰ ≠Û‰ Ô‰ ͉ Ɖ ¿‰ ¸‰ ±‰ ª‰ £‰ œ‰ •‰ މ ‡‰ €‰ y‰ r‰ k‰ d‰ ]‰ V‰ O‰ H‰ A‰ :‰ 3‰ ,‰ %‰ ‰ ‰ ‰  ‰ ‰ ûˆ ôˆ íˆ æˆ ߈ ؈ ш ʈ È ¼ˆ µˆ ®ˆ §ˆ  ˆ ™ˆ ’ˆ ‹ˆ „ˆ }ˆ vˆ oˆ hˆ aˆ Zˆ Sˆ Lˆ Eˆ >ˆ 7ˆ 0ˆ )ˆ "ˆ ˆ ˆ  ˆ ˆ ÿ‡ ø‡ ñ‡ ê‡ ㇠܇ Õ‡ · LJ À‡ ¹‡ ²‡ «‡ ¤‡ ‡ –‡ ‡ ˆ‡ ‡ z‡ s‡ l‡ e‡ ^‡ W‡ P‡ I‡ B‡ ;‡ 4‡ -‡ &‡ ‡ ‡ ‡  ‡ ‡ ü† õ† î† ç† à† Ù† Ò† ˆ Ć ½† ¶† ¯† ¨† ¡† š† “† Œ† …† ~† w† p† i† b† [† T† M† F† ?† 8† 1† *† #† † † † † † ù… ò… ë… ä… Ý… Ö… Ï… È… Á… º… ³… ¬… ¥… ž… —… … ‰… ‚… {… t… m… f… _… X… Q… J… C… <… 5… .… '…  … … …  … … ý„ ö„ ï„ è„ á„ Ú„ Ó„ Ì„ Å„ ¾„ ·„ °„ ©„ ¢„ ›„ ”„ „ †„ „ x„ q„ j„ c„ \„ U„ N„ G„ @„ 9„ 2„ +„ $„ „ „ „ „ „ úƒ óƒ ìƒ åƒ Þƒ ׃ Ѓ Ƀ ƒ »ƒ ´ƒ ­ƒ ¦ƒ Ÿƒ ˜ƒ ‘ƒ Šƒ ƒƒ |ƒ uƒ nƒ gƒ `ƒ Yƒ Rƒ Kƒ Dƒ =ƒ 6ƒ /ƒ (ƒ !ƒ ƒ ƒ  ƒ ƒ þ‚ ÷‚ ð‚ é‚ â‚ Û‚ Ô‚ Í‚ Æ‚ ¿‚ ¸‚ ±‚ ª‚ £‚ œ‚ •‚ Ž‚ ‡‚ €‚ y‚ r‚ k‚ d‚ ]‚ V‚ O‚ H‚ A‚ :‚ 3‚ ,‚ %‚ ‚ ‚ ‚  ‚ ‚ û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ€ ø€ ñ€ ê€ 〠Ü€ Õ€ ΀ Ç€ À€ ¹€ ²€ «€ ¤€ € –€ € ˆ€ € z€ s€ l€ e€ ^€ W€ P€ I€ B€ ;€ 4€ -€ &€ € € €  € € ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù~ ò~ ë~ ä~ Ý~ Ö~ Ï~ È~ Á~ º~ ³~ ¬~ ¥~ ž~ —~ ~ ‰~ ‚~ {~ t~ m~ f~ _~ X~ Q~ J~ C~ <~ 5~ .~ '~  ~ ~ ~  ~ ~ ý} ö} ï} è} á} Ú} Ó} Ì} Å} ¾} ·} °} ©} ¢} ›} ”} } †} } x} q} j} c} \} U} N} G} @} 9} 2} +} $} } } } } } ú| ó| ì| å| Þ| ×| Ð| É| Â| »| ´| ­| ¦| Ÿ| ˜| ‘| Š| ƒ| || u| n| g| `| Y| R| K| D| =| 6| /| (| !| | |  | | þ{ ÷{ ð{ é{ â{ Û{ Ô{ Í{ Æ{ ¿{ ¸{ ±{ ª{ £{ œ{ •{ Ž{ ‡{ €{ y{ r{ k{ d{ ]{ V{ O{ H{ A{ :{ 3{ ,{ %{ { { {  { { ûz ôz íz æz ßz Øz Ñz Êz Ãz ¼z µz ®z §z  z ™z ’z ‹z „z }z vz oz hz az Zz Sz Lz Ez >z 7z 0z )z "z z z  z z ÿy øy ñy êy ãy Üy Õy Îy Çy Ày ¹y ²y «y ¤y y –y y ˆy y zy sy ly ey ^y Wy Py Iy By ;y 4y -y &y y y y  y y üx õx îx çx àx Ùx Òx Ëx Äx ½x ¶x ¯x ¨x ¡x šx “x Œx …x ~x wx px ix bx [x Tx Mx Fx ?x 8x 1x *x #x x x x x x ùw òw ëw äw Ýw Öw Ïw Èw Áw ºw ³w ¬w ¥w žw —w w ‰w ‚w {w tw mw fw _w Xw Qw Jw Cw s 7s 0s )s "s s s  s s ÿr ør ñr êr ãr Ür Õr Îr Çr Àr ¹r ²r «r ¤r r –r r ˆr r zr sr lr er ^r Wr Pr Ir Br ;r 4r -r &r r r r  r r üq õq îq çq àq Ùq Òq Ëq Äq ½q ¶q ¯q ¨q ¡q šq “q Œq …q ~q wq pq iq bq [q Tq Mq Fq ?q 8q 1q *q #q q q q q q ùp òp ëp äp Ýp Öp Ïp Èp Áp ºp ³p ¬p ¥p žp —p p ‰p ‚p {p tp mp fp _p Xp Qp Jp Cp l 7l 0l )l "l l l  l l ÿk øk ñk êk ãk Ük Õk Îk Çk Àk ¹k ²k «k ¤k k –k k ˆk k zk sk lk ek ^k Wk Pk Ik Bk ;k 4k -k &k k k k  k k üj õj îj çj àj Ùj Òj Ëj Äj ½j ¶j ¯j ¨j ¡j šj “j Œj …j ~j wj pj ij bj [j Tj Mj Fj ?j 8j 1j *j #j j j j j j ùi òi ëi äi Ýi Öi Ïi Èi Ái ºi ³i ¬i ¥i ži —i i ‰i ‚i {i ti mi fi _i Xi Qi Ji Ci e 7e 0e )e "e e e  e e ÿd ød ñd êd ãd Üd Õd Îd Çd Àd ¹d ²d «d ¤d d –d d ˆd d zd sd ld ed ^d Wd Pd Id Bd ;d 4d -d &d d d d  d d üc õc îc çc àc Ùc Òc Ëc Äc ½c ¶c ¯c ¨c ¡c šc “c Œc …c ~c wc pc ic bc [c Tc Mc Fc ?c 8c 1c *c #c c c c c c ùb òb ëb äb Ýb Öb Ïb Èb Áb ºb ³b ¬b ¥b žb —b b ‰b ‚b {b tb mb fb _b Xb Qb Jb Cb ^ 7^ 0^ )^ "^ ^ ^  ^ ^ ÿ] ø] ñ] ê] ã] Ü] Õ] Î] Ç] À] ¹] ²] «] ¤] ] –] ] ˆ] ] z] s] l] e] ^] W] P] I] B] ;] 4] -] &] ] ] ]  ] ] ü\ õ\ î\ ç\ à\ Ù\ Ò\ Ë\ Ä\ ½\ ¶\ ¯\ ¨\ ¡\ š\ “\ Œ\ …\ ~\ w\ p\ i\ b\ [\ T\ M\ F\ ?\ 8\ 1\ *\ #\ \ \ \ \ \ ù[ ò[ ë[ ä[ Ý[ Ö[ Ï[ È[ Á[ º[ ³[ ¬[ ¥[ ž[ —[ [ ‰[ ‚[ {[ t[ m[ f[ _[ X[ Q[ J[ C[ <[ 5[ .[ '[  [ [ [  [ [ ýZ öZ ïZ èZ áZ ÚZ ÓZ ÌZ ÅZ ¾Z ·Z °Z ©Z ¢Z ›Z ”Z Z †Z Z xZ qZ jZ cZ \Z UZ NZ GZ @Z 9Z 2Z +Z $Z Z Z Z Z Z úY óY ìY åY ÞY ×Y ÐY ÉY ÂY »Y ´Y ­Y ¦Y ŸY ˜Y ‘Y ŠY ƒY |Y uY nY gY `Y YY RY KY DY =Y 6Y /Y (Y !Y Y Y  Y Y þX ÷X ðX éX âX ÛX ÔX ÍX ÆX ¿X ¸X ±X ªX £X œX •X ŽX ‡X €X yX rX kX dX ]X VX OX HX AX :X 3X ,X %X X X X  X X ûW ôW íW æW ßW ØW ÑW ÊW ÃW ¼W µW ®W §W  W ™W ’W ‹W „W }W vW oW hW aW ZW SW LW EW >W 7W 0W )W "W W W  W W ÿV øV ñV êV ãV ÜV ÕV ÎV ÇV ÀV ¹V ²V «V ¤V V –V V ˆV V zV sV lV eV ^V WV PV IV BV ;V 4V -V &V V V V  V V üU õU îU çU àU ÙU ÒU ËU ÄU ½U ¶U ¯U ¨U ¡U šU “U ŒU …U ~U wU pU iU bU [U TU MU FU ?U 8U 1U *U #U U U U U U ùT òT ëT äT ÝT ÖT ÏT ÈT ÁT ºT ³T ¬T ¥T žT —T T ‰T ‚T {T tT mT fT _T XT QT JT CT P 7P 0P )P "P P P  P P ÿO øO ñO êO ãO ÜO ÕO ÎO ÇO ÀO ¹O ²O «O ¤O O –O O ˆO O zO sO lO eO ^O WO PO IO BO ;O 4O -O &O O O O  O O üN õN îN çN àN ÙN ÒN ËN ÄN ½N ¶N ¯N ¨N ¡N šN “N ŒN …N ~N wN pN iN bN [N TN MN FN ?N 8N 1N *N #N N N N N N ùM òM ëM äM ÝM ÖM ÏM ÈM ÁM ºM ³M ¬M ¥M žM —M M ‰M ‚M {M tM mM fM _M XM QM JM CM I 7I 0I )I "I I I  I I ÿH øH ñH êH ãH ÜH ÕH ÎH ÇH ÀH ¹H ²H «H ¤H H –H H ˆH H zH sH lH eH ^H WH PH IH BH ;H 4H -H &H H H H  H H üG õG îG çG àG ÙG ÒG ËG ÄG ½G ¶G ¯G ¨G ¡G šG “G ŒG …G ~G wG pG iG bG [G TG MG FG ?G 8G 1G *G #G G G G G G ùF òF ëF äF ÝF ÖF ÏF ÈF ÁF ºF ³F ¬F ¥F žF —F F ‰F ‚F {F tF mF fF _F XF QF JF CF B 7B 0B )B "B B B  B B ÿA øA ñA êA ãA ÜA ÕA ÎA ÇA ÀA ¹A ²A «A ¤A A –A A ˆA A zA sA lA eA ^A WA PA IA BA ;A 4A -A &A A A A  A A ü@ õ@ î@ ç@ à@ Ù@ Ò@ Ë@ Ä@ ½@ ¶@ ¯@ ¨@ ¡@ š@ “@ Œ@ …@ ~@ w@ p@ i@ b@ [@ T@ M@ F@ ?@ 8@ 1@ *@ #@ @ @ @ @ @ ù? ò? ë? ä? Ý? Ö? Ï? È? Á? º? ³? ¬? ¥? ž? —? ? ‰? ‚? {? t? m? f? _? X? Q? J? C?  ö> ï> è> á> Ú> Ó> Ì> Å> ¾> ·> °> ©> ¢> ›> ”> > †> > x> q> j> c> \> U> N> G> @> 9> 2> +> $> > > > > > ú= ó= ì= å= Þ= ×= Ð= É= Â= »= ´= ­= ¦= Ÿ= ˜= ‘= Š= ƒ= |= u= n= g= `= Y= R= K= D= == 6= /= (= != = =  = = þ< ÷< ð< é< â< Û< Ô< Í< Æ< ¿< ¸< ±< ª< £< œ< •< Ž< ‡< €< y< r< k< d< ]< V< O< H< A< :< 3< ,< %< < < <  < < û; ô; í; æ; ß; Ø; Ñ; Ê; Ã; ¼; µ; ®; §;  ; ™; ’; ‹; „; }; v; o; h; a; Z; S; L; E; >; 7; 0; ); "; ; ;  ; ; ÿ: ø: ñ: ê: ã: Ü: Õ: Î: Ç: À: ¹: ²: «: ¤: : –: : ˆ: : z: s: l: e: ^: W: P: I: B: ;: 4: -: &: : : :  : : ü9 õ9 î9 ç9 à9 Ù9 Ò9 Ë9 Ä9 ½9 ¶9 ¯9 ¨9 ¡9 š9 “9 Œ9 …9 ~9 w9 p9 i9 b9 [9 T9 M9 F9 ?9 89 19 *9 #9 9 9 9 9 9 ù8 ò8 ë8 ä8 Ý8 Ö8 Ï8 È8 Á8 º8 ³8 ¬8 ¥8 ž8 —8 8 ‰8 ‚8 {8 t8 m8 f8 _8 X8 Q8 J8 C8 <8 58 .8 '8  8 8 8  8 8 ý7 ö7 ï7 è7 á7 Ú7 Ó7 Ì7 Å7 ¾7 ·7 °7 ©7 ¢7 ›7 ”7 7 †7 7 x7 q7 j7 c7 \7 U7 N7 G7 @7 97 27 +7 $7 7 7 7 7 7 ú6 ó6 ì6 å6 Þ6 ×6 Ð6 É6 Â6 »6 ´6 ­6 ¦6 Ÿ6 ˜6 ‘6 Š6 ƒ6 |6 u6 n6 g6 `6 Y6 R6 K6 D6 =6 66 /6 (6 !6 6 6  6 6 þ5 ÷5 ð5 é5 â5 Û5 Ô5 Í5 Æ5 ¿5 ¸5 ±5 ª5 £5 œ5 •5 Ž5 ‡5 €5 y5 r5 k5 d5 ]5 V5 O5 H5 A5 :5 35 ,5 %5 5 5 5  5 5 û4 ô4 í4 æ4 ß4 Ø4 Ñ4 Ê4 Ã4 ¼4 µ4 ®4 §4  4 ™4 ’4 ‹4 „4 }4 v4 o4 h4 a4 Z4 S4 L4 E4 >4 74 04 )4 "4 4 4  4 4 ÿ3 ø3 ñ3 ê3 ã3 Ü3 Õ3 Î3 Ç3 À3 ¹3 ²3 «3 ¤3 3 –3 3 ˆ3 3 z3 s3 l3 e3 ^3 W3 P3 I3 B3 ;3 43 -3 &3 3 3 3  3 3 ü2 õ2 î2 ç2 à2 Ù2 Ò2 Ë2 Ä2 ½2 ¶2 ¯2 ¨2 ¡2 š2 “2 Œ2 …2 ~2 w2 p2 i2 b2 [2 T2 M2 F2 ?2 82 12 *2 #2 2 2 2 2 2 ù1 ò1 ë1 ä1 Ý1 Ö1 Ï1 È1 Á1 º1 ³1 ¬1 ¥1 ž1 —1 1 ‰1 ‚1 {1 t1 m1 f1 _1 X1 Q1 J1 C1 <1 51 .1 '1  1 1 1  1 1 ý0 ö0 ï0 è0 á0 Ú0 Ó0 Ì0 Å0 ¾0 ·0 °0 ©0 ¢0 ›0 ”0 0 †0 0 x0 q0 j0 c0 \0 U0 N0 G0 @0 90 20 +0 $0 0 0 0 0 0 ú/ ó/ ì/ å/ Þ/ ×/ Ð/ É/ Â/ »/ ´/ ­/ ¦/ Ÿ/ ˜/ ‘/ Š/ ƒ/ |/ u/ n/ g/ `/ Y/ R/ K/ D/ =/ 6/ // (/ !/ / /  / / þ. ÷. ð. é. â. Û. Ô. Í. Æ. ¿. ¸. ±. ª. £. œ. •. Ž. ‡. €. y. r. k. d. ]. V. O. H. A. :. 3. ,. %. . . .  . . û- ô- í- æ- ß- Ø- Ñ- Ê- Ã- ¼- µ- ®- §-  - ™- ’- ‹- „- }- v- o- h- a- Z- S- L- E- >- 7- 0- )- "- - -  - - ÿ, ø, ñ, ê, ã, Ü, Õ, Î, Ç, À, ¹, ², «, ¤, , –, , ˆ, , z, s, l, e, ^, W, P, I, B, ;, 4, -, &, , , ,  , , ü+ õ+ î+ ç+ à+ Ù+ Ò+ Ë+ Ä+ ½+ ¶+ ¯+ ¨+ ¡+ š+ “+ Œ+ …+ ~+ w+ p+ i+ b+ [+ T+ M+ F+ ?+ 8+ 1+ *+ #+ + + + + + ù* ò* ë* ä* Ý* Ö* Ï* È* Á* º* ³* ¬* ¥* ž* —* * ‰* ‚* {* t* m* f* _* X* Q* J* C* <* 5* .* '*  * * *  * * ý) ö) ï) è) á) Ú) Ó) Ì) Å) ¾) ·) °) ©) ¢) ›) ”) ) †) ) x) q) j) c) \) U) N) G) @) 9) 2) +) $) ) ) ) ) ) ú( ó( ì( å( Þ( ×( Ð( É( Â( »( ´( ­( ¦( Ÿ( ˜( ‘( Š( ƒ( |( u( n( g( `( Y( R( K( D( =( 6( /( (( !( ( (  ( ( þ' ÷' ð' é' â' Û' Ô' Í' Æ' ¿' ¸' ±' ª' £' œ' •' Ž' ‡' €' y' r' k' d' ]' V' O' H' A' :' 3' ,' %' ' ' '  ' ' û& ô& í& æ& ß& Ø& Ñ& Ê& Ã& ¼& µ& ®& §&  & ™& ’& ‹& „& }& v& o& h& a& Z& S& L& E& >& 7& 0& )& "& & &  & & ÿ% ø% ñ% ê% ã% Ü% Õ% Î% Ç% À% ¹% ²% «% ¤% % –% % ˆ% % z% s% l% e% ^% W% P% I% B% ;% 4% -% &% % % %  % % ü$ õ$ î$ ç$ à$ Ù$ Ò$ Ë$ Ä$ ½$ ¶$ ¯$ ¨$ ¡$ š$ “$ Œ$ …$ ~$ w$ p$ i$ b$ [$ T$ M$ F$ ?$ 8$ 1$ *$ #$ $ $ $ $ $ ù# ò# ë# ä# Ý# Ö# Ï# È# Á# º# ³# ¬# ¥# ž# —# # ‰# ‚# {# t# m# f# _# X# Q# J# C# <# 5# .# '#  # # #  # # ý" ö" ï" è" á" Ú" Ó" Ì" Å" ¾" ·" °" ©" ¢" ›" ”" " †" " x" q" j" c" \" U" N" G" @" 9" 2" +" $" " " " " " ú! ó! ì! å! Þ! ×! Ð! É! Â! »! ´! ­! ¦! Ÿ! ˜! ‘! Š! ƒ! |! u! n! g! `! Y! R! K! D! =! 6! /! (! !! ! !  ! ! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýÿ öÿ ïÿ èÿ áÿ Úÿ Óÿ Ìÿ Åÿ ¾ÿ ·ÿ °ÿ ©ÿ ¢ÿ ›ÿ ”ÿ ÿ †ÿ ÿ xÿ qÿ jÿ cÿ \ÿ Uÿ Nÿ Gÿ @ÿ 9ÿ 2ÿ +ÿ $ÿ ÿ ÿ ÿ ÿ ÿ úþ óþ ìþ åþ Þþ ×þ Ðþ Éþ Âþ »þ ´þ ­þ ¦þ Ÿþ ˜þ ‘þ Šþ ƒþ |þ uþ nþ gþ `þ Yþ Rþ Kþ Dþ =þ 6þ /þ (þ !þ þ þ  þ þ þý ÷ý ðý éý âý Ûý Ôý Íý Æý ¿ý ¸ý ±ý ªý £ý œý •ý Žý ‡ý €ý yý rý ký dý ]ý Vý Oý Hý Aý :ý 3ý ,ý %ý ý ý ý  ý ý ûü ôü íü æü ßü Øü Ñü Êü Ãü ¼ü µü ®ü §ü  ü ™ü ’ü ‹ü „ü }ü vü oü hü aü Zü Sü Lü Eü >ü 7ü 0ü )ü "ü ü ü  ü ü ÿû øû ñû êû ãû Üû Õû Îû Çû Àû ¹û ²û «û ¤û û –û û ˆû û zû sû lû eû ^û Wû Pû Iû Bû ;û 4û -û &û û û û  û û üú õú îú çú àú Ùú Òú Ëú Äú ½ú ¶ú ¯ú ¨ú ¡ú šú “ú Œú …ú ~ú wú pú iú bú [ú Tú Mú Fú ?ú 8ú 1ú *ú #ú ú ú ú ú ú ùù òù ëù äù Ýù Öù Ïù Èù Áù ºù ³ù ¬ù ¥ù žù —ù ù ‰ù ‚ù {ù tù mù fù _ù Xù Qù Jù Cù <ù 5ù .ù 'ù  ù ù ù  ù ù ýø öø ïø èø áø Úø Óø Ìø Åø ¾ø ·ø °ø ©ø ¢ø ›ø ”ø ø †ø ø xø qø jø cø \ø Uø Nø Gø @ø 9ø 2ø +ø $ø ø ø ø ø ø ú÷ ó÷ ì÷ å÷ Þ÷ ×÷ Ð÷ É÷ Â÷ »÷ ´÷ ­÷ ¦÷ Ÿ÷ ˜÷ ‘÷ Š÷ ƒ÷ |÷ u÷ n÷ g÷ `÷ Y÷ R÷ K÷ D÷ =÷ 6÷ /÷ (÷ !÷ ÷ ÷  ÷ ÷ þö ÷ö ðö éö âö Ûö Ôö Íö Æö ¿ö ¸ö ±ö ªö £ö œö •ö Žö ‡ö €ö yö rö kö dö ]ö Vö Oö Hö Aö :ö 3ö ,ö %ö ö ö ö  ö ö ûõ ôõ íõ æõ ßõ Øõ Ñõ Êõ Ãõ ¼õ µõ ®õ §õ  õ ™õ ’õ ‹õ „õ }õ võ oõ hõ aõ Zõ Sõ Lõ Eõ >õ 7õ 0õ )õ "õ õ õ  õ õ ÿô øô ñô êô ãô Üô Õô Îô Çô Àô ¹ô ²ô «ô ¤ô ô –ô ô ˆô ô zô sô lô eô ^ô Wô Pô Iô Bô ;ô 4ô -ô &ô ô ô ô  ô ô üó õó îó çó àó Ùó Òó Ëó Äó ½ó ¶ó ¯ó ¨ó ¡ó šó “ó Œó …ó ~ó wó pó ió bó [ó Tó Mó Fó ?ó 8ó 1ó *ó #ó ó ó ó ó ó ùò òò ëò äò Ýò Öò Ïò Èò Áò ºò ³ò ¬ò ¥ò žò —ò ò ‰ò ‚ò {ò tò mò fò _ò Xò Qò Jò Cò <ò 5ò .ò 'ò  ò ò ò  ò ò ýñ öñ ïñ èñ áñ Úñ Óñ Ìñ Åñ ¾ñ ·ñ °ñ ©ñ ¢ñ ›ñ ”ñ ñ †ñ ñ xñ qñ jñ cñ \ñ Uñ Nñ Gñ @ñ 9ñ 2ñ +ñ $ñ ñ ñ ñ ñ ñ úð óð ìð åð Þð ×ð Ðð Éð Âð »ð ´ð ­ð ¦ð Ÿð ˜ð ‘ð Šð ƒð |ð uð nð gð `ð Yð Rð Kð Dð =ð 6ð /ð (ð !ð ð ð  ð ð þï ÷ï ðï éï âï Ûï Ôï Íï Æï ¿ï ¸ï ±ï ªï £ï œï •ï Žï ‡ï €ï yï rï kï dï ]ï Vï Oï Hï Aï :ï 3ï ,ï %ï ï ï ï  ï ï ûî ôî íî æî ßî Øî Ñî Êî Ãî ¼î µî ®î §î  î ™î ’î ‹î „î }î vî oî hî aî Zî Sî Lî Eî >î 7î 0î )î "î î î  î î ÿí øí ñí êí ãí Üí Õí Îí Çí Àí ¹í ²í «í ¤í í –í í ˆí í zí sí lí eí ^í Wí Pí Ií Bí ;í 4í -í &í í í í  í í üì õì îì çì àì Ùì Òì Ëì Äì ½ì ¶ì ¯ì ¨ì ¡ì šì “ì Œì …ì ~ì wì pì iì bì [ì Tì Mì Fì ?ì 8ì 1ì *ì #ì ì ì ì ì ì ùë òë ëë äë Ýë Öë Ïë Èë Áë ºë ³ë ¬ë ¥ë žë —ë ë ‰ë ‚ë {ë të më fë _ë Xë Që Jë Cë <ë 5ë .ë 'ë  ë ë ë  ë ë ýê öê ïê èê áê Úê Óê Ìê Åê ¾ê ·ê °ê ©ê ¢ê ›ê ”ê ê †ê ê xê qê jê cê \ê Uê Nê Gê @ê 9ê 2ê +ê $ê ê ê ê ê ê úé óé ìé åé Þé ×é Ðé Éé Âé »é ´é ­é ¦é Ÿé ˜é ‘é Šé ƒé |é ué né gé `é Yé Ré Ké Dé =é 6é /é (é !é é é  é é þè ÷è ðè éè âè Ûè Ôè Íè Æè ¿è ¸è ±è ªè £è œè •è Žè ‡è €è yè rè kè dè ]è Vè Oè Hè Aè :è 3è ,è %è è è è  è è ûç ôç íç æç ßç Øç Ñç Êç Ãç ¼ç µç ®ç §ç  ç ™ç ’ç ‹ç „ç }ç vç oç hç aç Zç Sç Lç Eç >ç 7ç 0ç )ç "ç ç ç  ç ç ÿæ øæ ñæ êæ ãæ Üæ Õæ Îæ Çæ Àæ ¹æ ²æ «æ ¤æ æ –æ æ ˆæ æ zæ sæ læ eæ ^æ Wæ Pæ Iæ Bæ ;æ 4æ -æ &æ æ æ æ  æ æ üå õå îå çå àå Ùå Òå Ëå Äå ½å ¶å ¯å ¨å ¡å šå “å Œå …å ~å wå på iå bå [å Tå Må Få ?å 8å 1å *å #å å å å å å ùä òä ëä ää Ýä Öä Ïä Èä Áä ºä ³ä ¬ä ¥ä žä —ä ä ‰ä ‚ä {ä tä mä fä _ä Xä Qä Jä Cä <ä 5ä .ä 'ä  ä ä ä  ä ä ýã öã ïã èã áã Úã Óã Ìã Å㠾㠷㠰㠩㠢㠛㠔ã ã †ã ã xã qã jã cã \ã Uã Nã Gã @ã 9ã 2ã +ã $ã ã ã ã ã ã úâ óâ ìâ åâ Þâ ×â Ðâ Éâ Â⠻⠴⠭⠦⠟⠘⠑⠊⠃â |â uâ nâ gâ `â Yâ Râ Kâ Dâ =â 6â /â (â !â â â  â â þá ÷á ðá éá âá Ûá Ôá Íá Æá ¿á ¸á ±á ªá £á œá •á Žá ‡á €á yá rá ká dá ]á Vá Oá Há Aá :á 3á ,á %á á á á  á á ûà ôà íà æà ßà Øà Ñà Êà Ãà ¼à µà ®à §à  à ™à ’à ‹à „à }à và oà hà aà Zà Sà Là Eà >à 7à 0à )à "à à à  à à ÿß øß ñß êß ãß Üß Õß Îß Çß Àß ¹ß ²ß «ß ¤ß ß –ß ß ˆß ß zß sß lß eß ^ß Wß Pß Iß Bß ;ß 4ß -ß &ß ß ß ß  ß ß üÞ õÞ îÞ çÞ àÞ ÙÞ ÒÞ ËÞ ÄÞ ½Þ ¶Þ ¯Þ ¨Þ ¡Þ šÞ “Þ ŒÞ …Þ ~Þ wÞ pÞ iÞ bÞ [Þ TÞ MÞ FÞ ?Þ 8Þ 1Þ *Þ #Þ Þ Þ Þ Þ Þ ùÝ òÝ ëÝ äÝ ÝÝ ÖÝ ÏÝ ÈÝ ÁÝ ºÝ ³Ý ¬Ý ¥Ý žÝ —Ý Ý ‰Ý ‚Ý {Ý tÝ mÝ fÝ _Ý XÝ QÝ JÝ CÝ <Ý 5Ý .Ý 'Ý  Ý Ý Ý  Ý Ý ýÜ öÜ ïÜ èÜ áÜ ÚÜ ÓÜ ÌÜ ÅÜ ¾Ü ·Ü °Ü ©Ü ¢Ü ›Ü ”Ü Ü †Ü Ü xÜ qÜ jÜ cÜ \Ü UÜ NÜ GÜ @Ü 9Ü 2Ü +Ü $Ü Ü Ü Ü Ü Ü úÛ óÛ ìÛ åÛ ÞÛ ×Û ÐÛ ÉÛ ÂÛ »Û ´Û ­Û ¦Û ŸÛ ˜Û ‘Û ŠÛ ƒÛ |Û uÛ nÛ gÛ `Û YÛ RÛ KÛ DÛ =Û 6Û /Û (Û !Û Û Û  Û Û þÚ ÷Ú ðÚ éÚ âÚ ÛÚ ÔÚ ÍÚ ÆÚ ¿Ú ¸Ú ±Ú ªÚ £Ú œÚ •Ú ŽÚ ‡Ú €Ú yÚ rÚ kÚ dÚ ]Ú VÚ OÚ HÚ AÚ :Ú 3Ú ,Ú %Ú Ú Ú Ú  Ú Ú ûÙ ôÙ íÙ æÙ ßÙ ØÙ ÑÙ ÊÙ ÃÙ ¼Ù µÙ ®Ù §Ù  Ù ™Ù ’Ù ‹Ù „Ù }Ù vÙ oÙ hÙ aÙ ZÙ SÙ LÙ EÙ >Ù 7Ù 0Ù )Ù "Ù Ù Ù  Ù Ù ÿØ øØ ñØ êØ ãØ ÜØ ÕØ ÎØ ÇØ ÀØ ¹Ø ²Ø «Ø ¤Ø Ø –Ø Ø ˆØ Ø zØ sØ lØ eØ ^Ø WØ PØ IØ BØ ;Ø 4Ø -Ø &Ø Ø Ø Ø  Ø Ø ü× õ× î× ç× à× Ù× Ò× Ë× Ä× ½× ¶× ¯× ¨× ¡× š× “× Œ× …× ~× w× p× i× b× [× T× M× F× ?× 8× 1× *× #× × × × × × ùÖ òÖ ëÖ äÖ ÝÖ ÖÖ ÏÖ ÈÖ ÁÖ ºÖ ³Ö ¬Ö ¥Ö žÖ —Ö Ö ‰Ö ‚Ö {Ö tÖ mÖ fÖ _Ö XÖ QÖ JÖ CÖ <Ö 5Ö .Ö 'Ö  Ö Ö Ö  Ö Ö ýÕ öÕ ïÕ èÕ áÕ ÚÕ ÓÕ ÌÕ ÅÕ ¾Õ ·Õ °Õ ©Õ ¢Õ ›Õ ”Õ Õ †Õ Õ xÕ qÕ jÕ cÕ \Õ UÕ NÕ GÕ @Õ 9Õ 2Õ +Õ $Õ Õ Õ Õ Õ Õ úÔ óÔ ìÔ åÔ ÞÔ ×Ô ÐÔ ÉÔ ÂÔ »Ô ´Ô ­Ô ¦Ô ŸÔ ˜Ô ‘Ô ŠÔ ƒÔ |Ô uÔ nÔ gÔ `Ô YÔ RÔ KÔ DÔ =Ô 6Ô /Ô (Ô !Ô Ô Ô  Ô Ô þÓ ÷Ó ðÓ éÓ âÓ ÛÓ ÔÓ ÍÓ ÆÓ ¿Ó ¸Ó ±Ó ªÓ £Ó œÓ •Ó ŽÓ ‡Ó €Ó yÓ rÓ kÓ dÓ ]Ó VÓ OÓ HÓ AÓ :Ó 3Ó ,Ó %Ó Ó Ó Ó  Ó Ó ûÒ ôÒ íÒ æÒ ßÒ ØÒ ÑÒ ÊÒ ÃÒ ¼Ò µÒ ®Ò §Ò  Ò ™Ò ’Ò ‹Ò „Ò }Ò vÒ oÒ hÒ aÒ ZÒ SÒ LÒ EÒ >Ò 7Ò 0Ò )Ò "Ò Ò Ò  Ò Ò ÿÑ øÑ ñÑ êÑ ãÑ ÜÑ ÕÑ ÎÑ ÇÑ ÀÑ ¹Ñ ²Ñ «Ñ ¤Ñ Ñ –Ñ Ñ ˆÑ Ñ zÑ sÑ lÑ eÑ ^Ñ WÑ PÑ IÑ BÑ ;Ñ 4Ñ -Ñ &Ñ Ñ Ñ Ñ  Ñ Ñ üÐ õÐ îÐ çÐ àÐ ÙÐ ÒÐ ËÐ ÄÐ ½Ð ¶Ð ¯Ð ¨Ð ¡Ð šÐ “Ð ŒÐ …Ð ~Ð wÐ pÐ iÐ bÐ [Ð TÐ MÐ FÐ ?Ð 8Ð 1Ð *Ð #Ð Ð Ð Ð Ð Ð ùÏ òÏ ëÏ äÏ ÝÏ ÖÏ ÏÏ ÈÏ ÁÏ ºÏ ³Ï ¬Ï ¥Ï žÏ —Ï Ï ‰Ï ‚Ï {Ï tÏ mÏ fÏ _Ï XÏ QÏ JÏ CÏ <Ï 5Ï .Ï 'Ï  Ï Ï Ï  Ï Ï ýÎ öÎ ïÎ èÎ áÎ ÚÎ ÓÎ ÌÎ ÅÎ ¾Î ·Î °Î ©Î ¢Î ›Î ”Î Î †Î Î xÎ qÎ jÎ cÎ \Î UÎ NÎ GÎ @Î 9Î 2Î +Î $Î Î Î Î Î Î úÍ óÍ ìÍ åÍ ÞÍ ×Í ÐÍ ÉÍ ÂÍ »Í ´Í ­Í ¦Í ŸÍ ˜Í ‘Í ŠÍ ƒÍ |Í uÍ nÍ gÍ `Í YÍ RÍ KÍ DÍ =Í 6Í /Í (Í !Í Í Í  Í Í þÌ ÷Ì ðÌ éÌ âÌ ÛÌ ÔÌ ÍÌ ÆÌ ¿Ì ¸Ì ±Ì ªÌ £Ì œÌ •Ì ŽÌ ‡Ì €Ì yÌ rÌ kÌ dÌ ]Ì VÌ OÌ HÌ AÌ :Ì 3Ì ,Ì %Ì Ì Ì Ì  Ì Ì ûË ôË íË æË ßË ØË ÑË ÊË ÃË ¼Ë µË ®Ë §Ë  Ë ™Ë ’Ë ‹Ë „Ë }Ë vË oË hË aË ZË SË LË EË >Ë 7Ë 0Ë )Ë "Ë Ë Ë  Ë Ë ÿÊ øÊ ñÊ êÊ ãÊ ÜÊ ÕÊ ÎÊ ÇÊ ÀÊ ¹Ê ²Ê «Ê ¤Ê Ê –Ê Ê ˆÊ Ê zÊ sÊ lÊ eÊ ^Ê WÊ PÊ IÊ BÊ ;Ê 4Ê -Ê &Ê Ê Ê Ê  Ê Ê üÉ õÉ îÉ çÉ àÉ ÙÉ ÒÉ ËÉ ÄÉ ½É ¶É ¯É ¨É ¡É šÉ “É ŒÉ …É ~É wÉ pÉ iÉ bÉ [É TÉ MÉ FÉ ?É 8É 1É *É #É É É É É É ùÈ òÈ ëÈ äÈ ÝÈ ÖÈ ÏÈ ÈÈ ÁÈ ºÈ ³È ¬È ¥È žÈ —È È ‰È ‚È {È tÈ mÈ fÈ _È XÈ QÈ JÈ CÈ <È 5È .È 'È  È È È  È È ýÇ öÇ ïÇ èÇ áÇ ÚÇ ÓÇ ÌÇ ÅÇ ¾Ç ·Ç °Ç ©Ç ¢Ç ›Ç ”Ç Ç †Ç Ç xÇ qÇ jÇ cÇ \Ç UÇ NÇ GÇ @Ç 9Ç 2Ç +Ç $Ç Ç Ç Ç Ç Ç úÆ óÆ ìÆ åÆ ÞÆ ׯ ÐÆ ÉÆ ÂÆ »Æ ´Æ ­Æ ¦Æ ŸÆ ˜Æ ‘Æ ŠÆ ƒÆ |Æ uÆ nÆ gÆ `Æ YÆ RÆ KÆ DÆ =Æ 6Æ /Æ (Æ !Æ Æ Æ  Æ Æ þÅ ÷Å ðÅ éÅ âÅ ÛÅ ÔÅ ÍÅ ÆÅ ¿Å ¸Å ±Å ªÅ £Å œÅ •Å ŽÅ ‡Å €Å yÅ rÅ kÅ dÅ ]Å VÅ OÅ HÅ AÅ :Å 3Å ,Å %Å Å Å Å  Å Å ûÄ ôÄ íÄ æÄ ßÄ ØÄ ÑÄ ÊÄ ÃÄ ¼Ä µÄ ®Ä §Ä  Ä ™Ä ’Ä ‹Ä „Ä }Ä vÄ oÄ hÄ aÄ ZÄ SÄ LÄ EÄ >Ä 7Ä 0Ä )Ä "Ä Ä Ä  Ä Ä ÿà øÃ ñà êà ãà Üà Õà Îà Çà Àà ¹Ã ²Ã «Ã ¤Ã à –à à ˆÃ à zà sà là eà ^à Wà Pà Ià Bà ;à 4à -à &à à à à  à à ü õ î ç à Ù Ò Ë Ä ½Â ¶Â ¯Â ¨Â ¡Â šÂ “ ŒÂ … ~ w p i b [ T M F ? 8 1 * #      ùÁ òÁ ëÁ äÁ ÝÁ ÖÁ ÏÁ ÈÁ ÁÁ ºÁ ³Á ¬Á ¥Á žÁ —Á Á ‰Á ‚Á {Á tÁ mÁ fÁ _Á XÁ QÁ JÁ CÁ <Á 5Á .Á 'Á  Á Á Á  Á Á ýÀ öÀ ïÀ èÀ áÀ ÚÀ ÓÀ ÌÀ ÅÀ ¾À ·À °À ©À ¢À ›À ”À À †À À xÀ qÀ jÀ cÀ \À UÀ NÀ GÀ @À 9À 2À +À $À À À À À À ú¿ ó¿ ì¿ å¿ Þ¿ ׿ п É¿ ¿ »¿ ´¿ ­¿ ¦¿ Ÿ¿ ˜¿ ‘¿ Š¿ ƒ¿ |¿ u¿ n¿ g¿ `¿ Y¿ R¿ K¿ D¿ =¿ 6¿ /¿ (¿ !¿ ¿ ¿  ¿ ¿ þ¾ ÷¾ ð¾ é¾ â¾ Û¾ Ô¾ ; ƾ ¿¾ ¸¾ ±¾ ª¾ £¾ œ¾ •¾ ޾ ‡¾ €¾ y¾ r¾ k¾ d¾ ]¾ V¾ O¾ H¾ A¾ :¾ 3¾ ,¾ %¾ ¾ ¾ ¾  ¾ ¾ û½ ô½ í½ æ½ ß½ ؽ ѽ ʽ ý ¼½ µ½ ®½ §½  ½ ™½ ’½ ‹½ „½ }½ v½ o½ h½ a½ Z½ S½ L½ E½ >½ 7½ 0½ )½ "½ ½ ½  ½ ½ ÿ¼ ø¼ ñ¼ ê¼ ã¼ ܼ Õ¼ μ Ǽ À¼ ¹¼ ²¼ «¼ ¤¼ ¼ –¼ ¼ ˆ¼ ¼ z¼ s¼ l¼ e¼ ^¼ W¼ P¼ I¼ B¼ ;¼ 4¼ -¼ &¼ ¼ ¼ ¼  ¼ ¼ ü» õ» î» ç» à» Ù» Ò» Ë» Ä» ½» ¶» ¯» ¨» ¡» š» “» Œ» …» ~» w» p» i» b» [» T» M» F» ?» 8» 1» *» #» » » » » » ùº òº ëº äº ݺ Öº Ϻ Ⱥ Áº ºº ³º ¬º ¥º žº —º º ‰º ‚º {º tº mº fº _º Xº Qº Jº Cº <º 5º .º 'º  º º º  º º ý¹ ö¹ ï¹ è¹ á¹ Ú¹ Ó¹ ̹ Ź ¾¹ ·¹ °¹ ©¹ ¢¹ ›¹ ”¹ ¹ †¹ ¹ x¹ q¹ j¹ c¹ \¹ U¹ N¹ G¹ @¹ 9¹ 2¹ +¹ $¹ ¹ ¹ ¹ ¹ ¹ ú¸ ó¸ ì¸ å¸ Þ¸ ׸ и ɸ ¸ »¸ ´¸ ­¸ ¦¸ Ÿ¸ ˜¸ ‘¸ Џ ƒ¸ |¸ u¸ n¸ g¸ `¸ Y¸ R¸ K¸ D¸ =¸ 6¸ /¸ (¸ !¸ ¸ ¸  ¸ ¸ þ· ÷· ð· é· â· Û· Ô· Í· Æ· ¿· ¸· ±· ª· £· œ· •· Ž· ‡· €· y· r· k· d· ]· V· O· H· A· :· 3· ,· %· · · ·  · · û¶ ô¶ í¶ æ¶ ß¶ ض Ѷ ʶ ö ¼¶ µ¶ ®¶ §¶  ¶ ™¶ ’¶ ‹¶ „¶ }¶ v¶ o¶ h¶ a¶ Z¶ S¶ L¶ E¶ >¶ 7¶ 0¶ )¶ "¶ ¶ ¶  ¶ ¶ ÿµ øµ ñµ êµ ãµ ܵ Õµ ε ǵ Àµ ¹µ ²µ «µ ¤µ µ –µ µ ˆµ µ zµ sµ lµ eµ ^µ Wµ Pµ Iµ Bµ ;µ 4µ -µ &µ µ µ µ  µ µ ü´ õ´ î´ ç´ à´ Ù´ Ò´ Ë´ Ä´ ½´ ¶´ ¯´ ¨´ ¡´ š´ “´ Œ´ …´ ~´ w´ p´ i´ b´ [´ T´ M´ F´ ?´ 8´ 1´ *´ #´ ´ ´ ´ ´ ´ ù³ ò³ ë³ ä³ ݳ Ö³ ϳ ȳ Á³ º³ ³³ ¬³ ¥³ ž³ —³ ³ ‰³ ‚³ {³ t³ m³ f³ _³ X³ Q³ J³ C³ <³ 5³ .³ '³  ³ ³ ³  ³ ³ ý² ö² ï² è² á² Ú² Ó² ̲ Ų ¾² ·² °² ©² ¢² ›² ”² ² †² ² x² q² j² c² \² U² N² G² @² 9² 2² +² $² ² ² ² ² ² ú± ó± ì± å± Þ± ×± б ɱ ± »± ´± ­± ¦± Ÿ± ˜± ‘± б ƒ± |± u± n± g± `± Y± R± K± D± =± 6± /± (± !± ± ±  ± ± þ° ÷° ð° é° â° Û° Ô° Ͱ ư ¿° ¸° ±° ª° £° œ° •° ް ‡° €° y° r° k° d° ]° V° O° H° A° :° 3° ,° %° ° ° °  ° ° û¯ ô¯ í¯ æ¯ ߯ د ѯ ʯ ï ¼¯ µ¯ ®¯ §¯  ¯ ™¯ ’¯ ‹¯ „¯ }¯ v¯ o¯ h¯ a¯ Z¯ S¯ L¯ E¯ >¯ 7¯ 0¯ )¯ "¯ ¯ ¯  ¯ ¯ ÿ® ø® ñ® ê® ã® Ü® Õ® ή Ç® À® ¹® ²® «® ¤® ® –® ® ˆ® ® z® s® l® e® ^® W® P® I® B® ;® 4® -® &® ® ® ®  ® ® ü­ õ­ î­ ç­ à­ Ù­ Ò­ Ë­ Ä­ ½­ ¶­ ¯­ ¨­ ¡­ š­ “­ Œ­ …­ ~­ w­ p­ i­ b­ [­ T­ M­ F­ ?­ 8­ 1­ *­ #­ ­ ­ ­ ­ ­ ù¬ ò¬ ë¬ ä¬ ݬ Ö¬ Ϭ Ȭ Á¬ º¬ ³¬ ¬¬ ¥¬ ž¬ —¬ ¬ ‰¬ ‚¬ {¬ t¬ m¬ f¬ _¬ X¬ Q¬ J¬ C¬ <¬ 5¬ .¬ '¬  ¬ ¬ ¬  ¬ ¬ ý« ö« ï« è« á« Ú« Ó« Ì« Å« ¾« ·« °« ©« ¢« ›« ”« « †« « x« q« j« c« \« U« N« G« @« 9« 2« +« $« « « « « « úª óª ìª åª Þª ת Ъ ɪ ª »ª ´ª ­ª ¦ª Ÿª ˜ª ‘ª Šª ƒª |ª uª nª gª `ª Yª Rª Kª Dª =ª 6ª /ª (ª !ª ª ª  ª ª þ© ÷© ð© é© â© Û© Ô© Í© Æ© ¿© ¸© ±© ª© £© œ© •© Ž© ‡© €© y© r© k© d© ]© V© O© H© A© :© 3© ,© %© © © ©  © © û¨ ô¨ í¨ æ¨ ߨ ب Ѩ ʨ è ¼¨ µ¨ ®¨ §¨  ¨ ™¨ ’¨ ‹¨ „¨ }¨ v¨ o¨ h¨ a¨ Z¨ S¨ L¨ E¨ >¨ 7¨ 0¨ )¨ "¨ ¨ ¨  ¨ ¨ ÿ§ ø§ ñ§ ê§ ã§ ܧ Õ§ Χ ǧ À§ ¹§ ²§ «§ ¤§ § –§ § ˆ§ § z§ s§ l§ e§ ^§ W§ P§ I§ B§ ;§ 4§ -§ &§ § § §  § § ü¦ õ¦ î¦ ç¦ ঠÙ¦ Ò¦ ˦ Ħ ½¦ ¶¦ ¯¦ ¨¦ ¡¦ 𦠓¦ Œ¦ …¦ ~¦ w¦ p¦ i¦ b¦ [¦ T¦ M¦ F¦ ?¦ 8¦ 1¦ *¦ #¦ ¦ ¦ ¦ ¦ ¦ ù¥ ò¥ ë¥ ä¥ Ý¥ Ö¥ Ï¥ È¥ Á¥ º¥ ³¥ ¬¥ ¥¥ ž¥ —¥ ¥ ‰¥ ‚¥ {¥ t¥ m¥ f¥ _¥ X¥ Q¥ J¥ C¥ <¥ 5¥ .¥ '¥  ¥ ¥ ¥  ¥ ¥ ý¤ ö¤ ï¤ è¤ ᤠÚ¤ Ó¤ ̤ Ť ¾¤ ·¤ °¤ ©¤ ¢¤ ›¤ ”¤ ¤ †¤ ¤ x¤ q¤ j¤ c¤ \¤ U¤ N¤ G¤ @¤ 9¤ 2¤ +¤ $¤ ¤ ¤ ¤ ¤ ¤ ú£ ó£ ì£ å£ Þ£ ×£ У É£ £ »£ ´£ ­£ ¦£ Ÿ£ ˜£ ‘£ Š£ ƒ£ |£ u£ n£ g£ `£ Y£ R£ K£ D£ =£ 6£ /£ (£ !£ £ £  £ £ þ¢ ÷¢ ð¢ é¢ ⢠Û¢ Ô¢ Í¢ Æ¢ ¿¢ ¸¢ ±¢ ª¢ £¢ œ¢ •¢ Ž¢ ‡¢ €¢ y¢ r¢ k¢ d¢ ]¢ V¢ O¢ H¢ A¢ :¢ 3¢ ,¢ %¢ ¢ ¢ ¢  ¢ ¢ û¡ ô¡ í¡ æ¡ ß¡ Ø¡ Ñ¡ Ê¡ á ¼¡ µ¡ ®¡ §¡  ¡ ™¡ ’¡ ‹¡ „¡ }¡ v¡ o¡ h¡ a¡ Z¡ S¡ L¡ E¡ >¡ 7¡ 0¡ )¡ "¡ ¡ ¡  ¡ ¡ ÿ  ø  ñ  ê  ã  Ü  Õ  Π Ç  À  ¹  ²  «  ¤    –    ˆ    z  s  l  e  ^  W  P  I  B  ;  4  -  &             üŸ õŸ îŸ çŸ àŸ ÙŸ ÒŸ ËŸ ÄŸ ½Ÿ ¶Ÿ ¯Ÿ ¨Ÿ ¡Ÿ šŸ “Ÿ ŒŸ …Ÿ ~Ÿ wŸ pŸ iŸ bŸ [Ÿ TŸ MŸ FŸ ?Ÿ 8Ÿ 1Ÿ *Ÿ #Ÿ Ÿ Ÿ Ÿ Ÿ Ÿ ùž òž ëž äž Ýž Öž Ïž Èž Áž ºž ³ž ¬ž ¥ž žž —ž ž ‰ž ‚ž {ž tž mž fž _ž Xž Qž Jž Cž <ž 5ž .ž 'ž  ž ž ž  ž ž ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úœ óœ ìœ åœ Þœ ל М Éœ œ »œ ´œ ­œ ¦œ Ÿœ ˜œ ‘œ Šœ ƒœ |œ uœ nœ gœ `œ Yœ Rœ Kœ Dœ =œ 6œ /œ (œ !œ œ œ  œ œ þ› ÷› ð› é› â› Û› Ô› Í› Æ› ¿› ¸› ±› ª› £› œ› •› Ž› ‡› €› y› r› k› d› ]› V› O› H› A› :› 3› ,› %› › › ›  › › ûš ôš íš æš ßš Øš Ñš Êš Ú ¼š µš ®š §š  š ™š ’š ‹š „š }š vš oš hš aš Zš Sš Lš Eš >š 7š 0š )š "š š š  š š ÿ™ ø™ ñ™ ê™ ã™ Ü™ Õ™ Ι Ç™ À™ ¹™ ²™ «™ ¤™ ™ –™ ™ ˆ™ ™ z™ s™ l™ e™ ^™ W™ P™ I™ B™ ;™ 4™ -™ &™ ™ ™ ™  ™ ™ ü˜ õ˜ î˜ ç˜ à˜ Ù˜ Ò˜ ˘ Ę ½˜ ¶˜ ¯˜ ¨˜ ¡˜ š˜ “˜ Œ˜ …˜ ~˜ w˜ p˜ i˜ b˜ [˜ T˜ M˜ F˜ ?˜ 8˜ 1˜ *˜ #˜ ˜ ˜ ˜ ˜ ˜ ù— ò— ë— ä— Ý— Ö— Ï— È— Á— º— ³— ¬— ¥— ž— —— — ‰— ‚— {— t— m— f— _— X— Q— J— C— <— 5— .— '—  — — —  — — ý– ö– ï– è– á– Ú– Ó– Ì– Å– ¾– ·– °– ©– ¢– ›– ”– – †– – x– q– j– c– \– U– N– G– @– 9– 2– +– $– – – – – – ú• ó• ì• å• Þ• ו Е É• • »• ´• ­• ¦• Ÿ• ˜• ‘• Š• ƒ• |• u• n• g• `• Y• R• K• D• =• 6• /• (• !• • •  • • þ” ÷” ð” é” â” Û” Ô” Í” Æ” ¿” ¸” ±” ª” £” œ” •” Ž” ‡” €” y” r” k” d” ]” V” O” H” A” :” 3” ,” %” ” ” ”  ” ” û“ ô“ í“ æ“ ß“ Ø“ Ñ“ Ê“ Ó ¼“ µ“ ®“ §“  “ ™“ ’“ ‹“ „“ }“ v“ o“ h“ a“ Z“ S“ L“ E“ >“ 7“ 0“ )“ "“ “ “  “ “ ÿ’ ø’ ñ’ ê’ ã’ Ü’ Õ’ Î’ Ç’ À’ ¹’ ²’ «’ ¤’ ’ –’ ’ ˆ’ ’ z’ s’ l’ e’ ^’ W’ P’ I’ B’ ;’ 4’ -’ &’ ’ ’ ’  ’ ’ ü‘ õ‘ î‘ ç‘ à‘ Ù‘ Ò‘ Ë‘ Ä‘ ½‘ ¶‘ ¯‘ ¨‘ ¡‘ š‘ “‘ Œ‘ …‘ ~‘ w‘ p‘ i‘ b‘ [‘ T‘ M‘ F‘ ?‘ 8‘ 1‘ *‘ #‘ ‘ ‘ ‘ ‘ ‘ ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úŽ óŽ ìŽ åŽ ÞŽ ׎ ÐŽ ÉŽ ÂŽ »Ž ´Ž ­Ž ¦Ž ŸŽ ˜Ž ‘Ž ŠŽ ƒŽ |Ž uŽ nŽ gŽ `Ž YŽ RŽ KŽ DŽ =Ž 6Ž /Ž (Ž !Ž Ž Ž  Ž Ž þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûŒ ôŒ íŒ æŒ ߌ ØŒ ÑŒ ÊŒ ÃŒ ¼Œ µŒ ®Œ §Œ  Œ ™Œ ’Œ ‹Œ „Œ }Œ vŒ oŒ hŒ aŒ ZŒ SŒ LŒ EŒ >Œ 7Œ 0Œ )Œ "Œ Œ Œ  Œ Œ ÿ‹ ø‹ ñ‹ ê‹ ã‹ Ü‹ Õ‹ ΋ Ç‹ À‹ ¹‹ ²‹ «‹ ¤‹ ‹ –‹ ‹ ˆ‹ ‹ z‹ s‹ l‹ e‹ ^‹ W‹ P‹ I‹ B‹ ;‹ 4‹ -‹ &‹ ‹ ‹ ‹  ‹ ‹ üŠ õŠ îŠ çŠ àŠ ÙŠ ÒŠ ËŠ ÄŠ ½Š ¶Š ¯Š ¨Š ¡Š šŠ “Š ŒŠ …Š ~Š wŠ pŠ iŠ bŠ [Š TŠ MŠ FŠ ?Š 8Š 1Š *Š #Š Š Š Š Š Š ù‰ ò‰ ë‰ ä‰ ݉ Ö‰ ω ȉ Á‰ º‰ ³‰ ¬‰ ¥‰ ž‰ —‰ ‰ ‰‰ ‚‰ {‰ t‰ m‰ f‰ _‰ X‰ Q‰ J‰ C‰ <‰ 5‰ .‰ '‰  ‰ ‰ ‰  ‰ ‰ ýˆ öˆ ïˆ èˆ ሠÚˆ Óˆ ̈ ň ¾ˆ ·ˆ °ˆ ©ˆ ¢ˆ ›ˆ ”ˆ ˆ †ˆ ˆ xˆ qˆ jˆ cˆ \ˆ Uˆ Nˆ Gˆ @ˆ 9ˆ 2ˆ +ˆ $ˆ ˆ ˆ ˆ ˆ ˆ ú‡ ó‡ ì‡ å‡ Þ‡ ׇ Ї ɇ ‡ »‡ ´‡ ­‡ ¦‡ Ÿ‡ ˜‡ ‘‡ Ї ƒ‡ |‡ u‡ n‡ g‡ `‡ Y‡ R‡ K‡ D‡ =‡ 6‡ /‡ (‡ !‡ ‡ ‡  ‡ ‡ þ† ÷† ð† é† ↠Û† Ô† ͆ Ɔ ¿† ¸† ±† ª† £† œ† •† ކ ‡† €† y† r† k† d† ]† V† O† H† A† :† 3† ,† %† † † †  † † û… ô… í… æ… ß… Ø… Ñ… Ê… Ã… ¼… µ… ®… §…  … ™… ’… ‹… „… }… v… o… h… a… Z… S… L… E… >… 7… 0… )… "… … …  … … ÿ„ ø„ ñ„ ê„ ã„ Ü„ Õ„ ΄ Ç„ À„ ¹„ ²„ «„ ¤„ „ –„ „ ˆ„ „ z„ s„ l„ e„ ^„ W„ P„ I„ B„ ;„ 4„ -„ &„ „ „ „  „ „ üƒ õƒ îƒ çƒ àƒ Ùƒ Òƒ ˃ ă ½ƒ ¶ƒ ¯ƒ ¨ƒ ¡ƒ šƒ “ƒ Œƒ …ƒ ~ƒ wƒ pƒ iƒ bƒ [ƒ Tƒ Mƒ Fƒ ?ƒ 8ƒ 1ƒ *ƒ #ƒ ƒ ƒ ƒ ƒ ƒ ù‚ ò‚ ë‚ ä‚ Ý‚ Ö‚ Ï‚ È‚ Á‚ º‚ ³‚ ¬‚ ¥‚ ž‚ —‚ ‚ ‰‚ ‚‚ {‚ t‚ m‚ f‚ _‚ X‚ Q‚ J‚ C‚ <‚ 5‚ .‚ '‚  ‚ ‚ ‚  ‚ ‚ ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú€ ó€ ì€ å€ Þ€ ×€ Ѐ É€ € »€ ´€ ­€ ¦€ Ÿ€ ˜€ ‘€ Š€ ƒ€ |€ u€ n€ g€ `€ Y€ R€ K€ D€ =€ 6€ /€ (€ !€ € €  € € þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û~ ô~ í~ æ~ ß~ Ø~ Ñ~ Ê~ Ã~ ¼~ µ~ ®~ §~  ~ ™~ ’~ ‹~ „~ }~ v~ o~ h~ a~ Z~ S~ L~ E~ >~ 7~ 0~ )~ "~ ~ ~  ~ ~ ÿ} ø} ñ} ê} ã} Ü} Õ} Î} Ç} À} ¹} ²} «} ¤} } –} } ˆ} } z} s} l} e} ^} W} P} I} B} ;} 4} -} &} } } }  } } ü| õ| î| ç| à| Ù| Ò| Ë| Ä| ½| ¶| ¯| ¨| ¡| š| “| Œ| …| ~| w| p| i| b| [| T| M| F| ?| 8| 1| *| #| | | | | | ù{ ò{ ë{ ä{ Ý{ Ö{ Ï{ È{ Á{ º{ ³{ ¬{ ¥{ ž{ —{ { ‰{ ‚{ {{ t{ m{ f{ _{ X{ Q{ J{ C{ <{ 5{ .{ '{  { { {  { { ýz öz ïz èz áz Úz Óz Ìz Åz ¾z ·z °z ©z ¢z ›z ”z z †z z xz qz jz cz \z Uz Nz Gz @z 9z 2z +z $z z z z z z úy óy ìy åy Þy ×y Ðy Éy Ây »y ´y ­y ¦y Ÿy ˜y ‘y Šy ƒy |y uy ny gy `y Yy Ry Ky Dy =y 6y /y (y !y y y  y y þx ÷x ðx éx âx Ûx Ôx Íx Æx ¿x ¸x ±x ªx £x œx •x Žx ‡x €x yx rx kx dx ]x Vx Ox Hx Ax :x 3x ,x %x x x x  x x ûw ôw íw æw ßw Øw Ñw Êw Ãw ¼w µw ®w §w  w ™w ’w ‹w „w }w vw ow hw aw Zw Sw Lw Ew >w 7w 0w )w "w w w  w w ÿv øv ñv êv ãv Üv Õv Îv Çv Àv ¹v ²v «v ¤v v –v v ˆv v zv sv lv ev ^v Wv Pv Iv Bv ;v 4v -v &v v v v  v v üu õu îu çu àu Ùu Òu Ëu Äu ½u ¶u ¯u ¨u ¡u šu “u Œu …u ~u wu pu iu bu [u Tu Mu Fu ?u 8u 1u *u #u u u u u u ùt òt ët ät Ýt Öt Ït Èt Át ºt ³t ¬t ¥t žt —t t ‰t ‚t {t tt mt ft _t Xt Qt Jt Ct p 7p 0p )p "p p p  p p ÿo øo ño êo ão Üo Õo Îo Ço Ào ¹o ²o «o ¤o o –o o ˆo o zo so lo eo ^o Wo Po Io Bo ;o 4o -o &o o o o  o o ün õn în çn àn Ùn Òn Ën Än ½n ¶n ¯n ¨n ¡n šn “n Œn …n ~n wn pn in bn [n Tn Mn Fn ?n 8n 1n *n #n n n n n n ùm òm ëm äm Ým Öm Ïm Èm Ám ºm ³m ¬m ¥m žm —m m ‰m ‚m {m tm mm fm _m Xm Qm Jm Cm i 7i 0i )i "i i i  i i ÿh øh ñh êh ãh Üh Õh Îh Çh Àh ¹h ²h «h ¤h h –h h ˆh h zh sh lh eh ^h Wh Ph Ih Bh ;h 4h -h &h h h h  h h üg õg îg çg àg Ùg Òg Ëg Äg ½g ¶g ¯g ¨g ¡g šg “g Œg …g ~g wg pg ig bg [g Tg Mg Fg ?g 8g 1g *g #g g g g g g ùf òf ëf äf Ýf Öf Ïf Èf Áf ºf ³f ¬f ¥f žf —f f ‰f ‚f {f tf mf ff _f Xf Qf Jf Cf b 7b 0b )b "b b b  b b ÿa øa ña êa ãa Üa Õa Îa Ça Àa ¹a ²a «a ¤a a –a a ˆa a za sa la ea ^a Wa Pa Ia Ba ;a 4a -a &a a a a  a a ü` õ` î` ç` à` Ù` Ò` Ë` Ä` ½` ¶` ¯` ¨` ¡` š` “` Œ` …` ~` w` p` i` b` [` T` M` F` ?` 8` 1` *` #` ` ` ` ` ` ù_ ò_ ë_ ä_ Ý_ Ö_ Ï_ È_ Á_ º_ ³_ ¬_ ¥_ ž_ —_ _ ‰_ ‚_ {_ t_ m_ f_ __ X_ Q_ J_ C_ <_ 5_ ._ '_  _ _ _  _ _ ý^ ö^ ï^ è^ á^ Ú^ Ó^ Ì^ Å^ ¾^ ·^ °^ ©^ ¢^ ›^ ”^ ^ †^ ^ x^ q^ j^ c^ \^ U^ N^ G^ @^ 9^ 2^ +^ $^ ^ ^ ^ ^ ^ ú] ó] ì] å] Þ] ×] Ð] É] Â] »] ´] ­] ¦] Ÿ] ˜] ‘] Š] ƒ] |] u] n] g] `] Y] R] K] D] =] 6] /] (] !] ] ]  ] ] þ\ ÷\ ð\ é\ â\ Û\ Ô\ Í\ Æ\ ¿\ ¸\ ±\ ª\ £\ œ\ •\ Ž\ ‡\ €\ y\ r\ k\ d\ ]\ V\ O\ H\ A\ :\ 3\ ,\ %\ \ \ \  \ \ û[ ô[ í[ æ[ ß[ Ø[ Ñ[ Ê[ Ã[ ¼[ µ[ ®[ §[  [ ™[ ’[ ‹[ „[ }[ v[ o[ h[ a[ Z[ S[ L[ E[ >[ 7[ 0[ )[ "[ [ [  [ [ ÿZ øZ ñZ êZ ãZ ÜZ ÕZ ÎZ ÇZ ÀZ ¹Z ²Z «Z ¤Z Z –Z Z ˆZ Z zZ sZ lZ eZ ^Z WZ PZ IZ BZ ;Z 4Z -Z &Z Z Z Z  Z Z üY õY îY çY àY ÙY ÒY ËY ÄY ½Y ¶Y ¯Y ¨Y ¡Y šY “Y ŒY …Y ~Y wY pY iY bY [Y TY MY FY ?Y 8Y 1Y *Y #Y Y Y Y Y Y ùX òX ëX äX ÝX ÖX ÏX ÈX ÁX ºX ³X ¬X ¥X žX —X X ‰X ‚X {X tX mX fX _X XX QX JX CX T 7T 0T )T "T T T  T T ÿS øS ñS êS ãS ÜS ÕS ÎS ÇS ÀS ¹S ²S «S ¤S S –S S ˆS S zS sS lS eS ^S WS PS IS BS ;S 4S -S &S S S S  S S üR õR îR çR àR ÙR ÒR ËR ÄR ½R ¶R ¯R ¨R ¡R šR “R ŒR …R ~R wR pR iR bR [R TR MR FR ?R 8R 1R *R #R R R R R R ùQ òQ ëQ äQ ÝQ ÖQ ÏQ ÈQ ÁQ ºQ ³Q ¬Q ¥Q žQ —Q Q ‰Q ‚Q {Q tQ mQ fQ _Q XQ QQ JQ CQ M 7M 0M )M "M M M  M M ÿL øL ñL êL ãL ÜL ÕL ÎL ÇL ÀL ¹L ²L «L ¤L L –L L ˆL L zL sL lL eL ^L WL PL IL BL ;L 4L -L &L L L L  L L üK õK îK çK àK ÙK ÒK ËK ÄK ½K ¶K ¯K ¨K ¡K šK “K ŒK …K ~K wK pK iK bK [K TK MK FK ?K 8K 1K *K #K K K K K K ùJ òJ ëJ äJ ÝJ ÖJ ÏJ ÈJ ÁJ ºJ ³J ¬J ¥J žJ —J J ‰J ‚J {J tJ mJ fJ _J XJ QJ JJ CJ F 7F 0F )F "F F F  F F ÿE øE ñE êE ãE ÜE ÕE ÎE ÇE ÀE ¹E ²E «E ¤E E –E E ˆE E zE sE lE eE ^E WE PE IE BE ;E 4E -E &E E E E  E E üD õD îD çD àD ÙD ÒD ËD ÄD ½D ¶D ¯D ¨D ¡D šD “D ŒD …D ~D wD pD iD bD [D TD MD FD ?D 8D 1D *D #D D D D D D ùC òC ëC äC ÝC ÖC ÏC ÈC ÁC ºC ³C ¬C ¥C žC —C C ‰C ‚C {C tC mC fC _C XC QC JC CC ? 7? 0? )? "? ? ?  ? ? ÿ> ø> ñ> ê> ã> Ü> Õ> Î> Ç> À> ¹> ²> «> ¤> > –> > ˆ> > z> s> l> e> ^> W> P> I> B> ;> 4> -> &> > > >  > > ü= õ= î= ç= à= Ù= Ò= Ë= Ä= ½= ¶= ¯= ¨= ¡= š= “= Œ= …= ~= w= p= i= b= [= T= M= F= ?= 8= 1= *= #= = = = = = ù< ò< ë< ä< Ý< Ö< Ï< È< Á< º< ³< ¬< ¥< ž< —< < ‰< ‚< {< t< m< f< _< X< Q< J< C< << 5< .< '<  < < <  < < ý; ö; ï; è; á; Ú; Ó; Ì; Å; ¾; ·; °; ©; ¢; ›; ”; ; †; ; x; q; j; c; \; U; N; G; @; 9; 2; +; $; ; ; ; ; ; ú: ó: ì: å: Þ: ×: Ð: É: Â: »: ´: ­: ¦: Ÿ: ˜: ‘: Š: ƒ: |: u: n: g: `: Y: R: K: D: =: 6: /: (: !: : :  : : þ9 ÷9 ð9 é9 â9 Û9 Ô9 Í9 Æ9 ¿9 ¸9 ±9 ª9 £9 œ9 •9 Ž9 ‡9 €9 y9 r9 k9 d9 ]9 V9 O9 H9 A9 :9 39 ,9 %9 9 9 9  9 9 û8 ô8 í8 æ8 ß8 Ø8 Ñ8 Ê8 Ã8 ¼8 µ8 ®8 §8  8 ™8 ’8 ‹8 „8 }8 v8 o8 h8 a8 Z8 S8 L8 E8 >8 78 08 )8 "8 8 8  8 8 ÿ7 ø7 ñ7 ê7 ã7 Ü7 Õ7 Î7 Ç7 À7 ¹7 ²7 «7 ¤7 7 –7 7 ˆ7 7 z7 s7 l7 e7 ^7 W7 P7 I7 B7 ;7 47 -7 &7 7 7 7  7 7 ü6 õ6 î6 ç6 à6 Ù6 Ò6 Ë6 Ä6 ½6 ¶6 ¯6 ¨6 ¡6 š6 “6 Œ6 …6 ~6 w6 p6 i6 b6 [6 T6 M6 F6 ?6 86 16 *6 #6 6 6 6 6 6 ù5 ò5 ë5 ä5 Ý5 Ö5 Ï5 È5 Á5 º5 ³5 ¬5 ¥5 ž5 —5 5 ‰5 ‚5 {5 t5 m5 f5 _5 X5 Q5 J5 C5 <5 55 .5 '5  5 5 5  5 5 ý4 ö4 ï4 è4 á4 Ú4 Ó4 Ì4 Å4 ¾4 ·4 °4 ©4 ¢4 ›4 ”4 4 †4 4 x4 q4 j4 c4 \4 U4 N4 G4 @4 94 24 +4 $4 4 4 4 4 4 ú3 ó3 ì3 å3 Þ3 ×3 Ð3 É3 Â3 »3 ´3 ­3 ¦3 Ÿ3 ˜3 ‘3 Š3 ƒ3 |3 u3 n3 g3 `3 Y3 R3 K3 D3 =3 63 /3 (3 !3 3 3  3 3 þ2 ÷2 ð2 é2 â2 Û2 Ô2 Í2 Æ2 ¿2 ¸2 ±2 ª2 £2 œ2 •2 Ž2 ‡2 €2 y2 r2 k2 d2 ]2 V2 O2 H2 A2 :2 32 ,2 %2 2 2 2  2 2 û1 ô1 í1 æ1 ß1 Ø1 Ñ1 Ê1 Ã1 ¼1 µ1 ®1 §1  1 ™1 ’1 ‹1 „1 }1 v1 o1 h1 a1 Z1 S1 L1 E1 >1 71 01 )1 "1 1 1  1 1 ÿ0 ø0 ñ0 ê0 ã0 Ü0 Õ0 Î0 Ç0 À0 ¹0 ²0 «0 ¤0 0 –0 0 ˆ0 0 z0 s0 l0 e0 ^0 W0 P0 I0 B0 ;0 40 -0 &0 0 0 0  0 0 ü/ õ/ î/ ç/ à/ Ù/ Ò/ Ë/ Ä/ ½/ ¶/ ¯/ ¨/ ¡/ š/ “/ Œ/ …/ ~/ w/ p/ i/ b/ [/ T/ M/ F/ ?/ 8/ 1/ */ #/ / / / / / ù. ò. ë. ä. Ý. Ö. Ï. È. Á. º. ³. ¬. ¥. ž. —. . ‰. ‚. {. t. m. f. _. X. Q. J. C. <. 5. .. '.  . . .  . . ý- ö- ï- è- á- Ú- Ó- Ì- Å- ¾- ·- °- ©- ¢- ›- ”- - †- - x- q- j- c- \- U- N- G- @- 9- 2- +- $- - - - - - ú, ó, ì, å, Þ, ×, Ð, É, Â, », ´, ­, ¦, Ÿ, ˜, ‘, Š, ƒ, |, u, n, g, `, Y, R, K, D, =, 6, /, (, !, , ,  , , þ+ ÷+ ð+ é+ â+ Û+ Ô+ Í+ Æ+ ¿+ ¸+ ±+ ª+ £+ œ+ •+ Ž+ ‡+ €+ y+ r+ k+ d+ ]+ V+ O+ H+ A+ :+ 3+ ,+ %+ + + +  + + û* ô* í* æ* ß* Ø* Ñ* Ê* Ã* ¼* µ* ®* §*  * ™* ’* ‹* „* }* v* o* h* a* Z* S* L* E* >* 7* 0* )* "* * *  * * ÿ) ø) ñ) ê) ã) Ü) Õ) Î) Ç) À) ¹) ²) «) ¤) ) –) ) ˆ) ) z) s) l) e) ^) W) P) I) B) ;) 4) -) &) ) ) )  ) ) ü( õ( î( ç( à( Ù( Ò( Ë( Ä( ½( ¶( ¯( ¨( ¡( š( “( Œ( …( ~( w( p( i( b( [( T( M( F( ?( 8( 1( *( #( ( ( ( ( ( ù' ò' ë' ä' Ý' Ö' Ï' È' Á' º' ³' ¬' ¥' ž' —' ' ‰' ‚' {' t' m' f' _' X' Q' J' C' <' 5' .' ''  ' ' '  ' ' ý& ö& ï& è& á& Ú& Ó& Ì& Å& ¾& ·& °& ©& ¢& ›& ”& & †& & x& q& j& c& \& U& N& G& @& 9& 2& +& $& & & & & & ú% ó% ì% å% Þ% ×% Ð% É% Â% »% ´% ­% ¦% Ÿ% ˜% ‘% Š% ƒ% |% u% n% g% `% Y% R% K% D% =% 6% /% (% !% % %  % % þ$ ÷$ ð$ é$ â$ Û$ Ô$ Í$ Æ$ ¿$ ¸$ ±$ ª$ £$ œ$ •$ Ž$ ‡$ €$ y$ r$ k$ d$ ]$ V$ O$ H$ A$ :$ 3$ ,$ %$ $ $ $  $ $ û# ô# í# æ# ß# Ø# Ñ# Ê# Ã# ¼# µ# ®# §#  # ™# ’# ‹# „# }# v# o# h# a# Z# S# L# E# ># 7# 0# )# "# # #  # # ÿ" ø" ñ" ê" ã" Ü" Õ" Î" Ç" À" ¹" ²" «" ¤" " –" " ˆ" " z" s" l" e" ^" W" P" I" B" ;" 4" -" &" " " "  " " ü! õ! î! ç! à! Ù! Ò! Ë! Ä! ½! ¶! ¯! ¨! ¡! š! “! Œ! …! ~! w! p! i! b! [! T! M! F! ?! 8! 1! *! #! ! ! ! ! ! ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿÿ øÿ ñÿ êÿ ãÿ Üÿ Õÿ Îÿ Çÿ Àÿ ¹ÿ ²ÿ «ÿ ¤ÿ ÿ –ÿ ÿ ˆÿ ÿ zÿ sÿ lÿ eÿ ^ÿ Wÿ Pÿ Iÿ Bÿ ;ÿ 4ÿ -ÿ &ÿ ÿ ÿ ÿ  ÿ ÿ üþ õþ îþ çþ àþ Ùþ Òþ Ëþ Äþ ½þ ¶þ ¯þ ¨þ ¡þ šþ “þ Œþ …þ ~þ wþ pþ iþ bþ [þ Tþ Mþ Fþ ?þ 8þ 1þ *þ #þ þ þ þ þ þ ùý òý ëý äý Ýý Öý Ïý Èý Áý ºý ³ý ¬ý ¥ý žý —ý ý ‰ý ‚ý {ý tý mý fý _ý Xý Qý Jý Cý <ý 5ý .ý 'ý  ý ý ý  ý ý ýü öü ïü èü áü Úü Óü Ìü Åü ¾ü ·ü °ü ©ü ¢ü ›ü ”ü ü †ü ü xü qü jü cü \ü Uü Nü Gü @ü 9ü 2ü +ü $ü ü ü ü ü ü úû óû ìû åû Þû ×û Ðû Éû Âû »û ´û ­û ¦û Ÿû ˜û ‘û Šû ƒû |û uû nû gû `û Yû Rû Kû Dû =û 6û /û (û !û û û  û û þú ÷ú ðú éú âú Ûú Ôú Íú Æú ¿ú ¸ú ±ú ªú £ú œú •ú Žú ‡ú €ú yú rú kú dú ]ú Vú Oú Hú Aú :ú 3ú ,ú %ú ú ú ú  ú ú ûù ôù íù æù ßù Øù Ñù Êù Ãù ¼ù µù ®ù §ù  ù ™ù ’ù ‹ù „ù }ù vù où hù aù Zù Sù Lù Eù >ù 7ù 0ù )ù "ù ù ù  ù ù ÿø øø ñø êø ãø Üø Õø Îø Çø Àø ¹ø ²ø «ø ¤ø ø –ø ø ˆø ø zø sø lø eø ^ø Wø Pø Iø Bø ;ø 4ø -ø &ø ø ø ø  ø ø ü÷ õ÷ î÷ ç÷ à÷ Ù÷ Ò÷ Ë÷ Ä÷ ½÷ ¶÷ ¯÷ ¨÷ ¡÷ š÷ “÷ Œ÷ …÷ ~÷ w÷ p÷ i÷ b÷ [÷ T÷ M÷ F÷ ?÷ 8÷ 1÷ *÷ #÷ ÷ ÷ ÷ ÷ ÷ ùö òö ëö äö Ýö Öö Ïö Èö Áö ºö ³ö ¬ö ¥ö žö —ö ö ‰ö ‚ö {ö tö mö fö _ö Xö Qö Jö Cö <ö 5ö .ö 'ö  ö ö ö  ö ö ýõ öõ ïõ èõ áõ Úõ Óõ Ìõ Åõ ¾õ ·õ °õ ©õ ¢õ ›õ ”õ õ †õ õ xõ qõ jõ cõ \õ Uõ Nõ Gõ @õ 9õ 2õ +õ $õ õ õ õ õ õ úô óô ìô åô Þô ×ô Ðô Éô Âô »ô ´ô ­ô ¦ô Ÿô ˜ô ‘ô Šô ƒô |ô uô nô gô `ô Yô Rô Kô Dô =ô 6ô /ô (ô !ô ô ô  ô ô þó ÷ó ðó éó âó Ûó Ôó Íó Æó ¿ó ¸ó ±ó ªó £ó œó •ó Žó ‡ó €ó yó ró kó dó ]ó Vó Oó Hó Aó :ó 3ó ,ó %ó ó ó ó  ó ó ûò ôò íò æò ßò Øò Ñò Êò Ãò ¼ò µò ®ò §ò  ò ™ò ’ò ‹ò „ò }ò vò oò hò aò Zò Sò Lò Eò >ò 7ò 0ò )ò "ò ò ò  ò ò ÿñ øñ ññ êñ ãñ Üñ Õñ Îñ Çñ Àñ ¹ñ ²ñ «ñ ¤ñ ñ –ñ ñ ˆñ ñ zñ sñ lñ eñ ^ñ Wñ Pñ Iñ Bñ ;ñ 4ñ -ñ &ñ ñ ñ ñ  ñ ñ üð õð îð çð àð Ùð Òð Ëð Äð ½ð ¶ð ¯ð ¨ð ¡ð šð “ð Œð …ð ~ð wð pð ið bð [ð Tð Mð Fð ?ð 8ð 1ð *ð #ð ð ð ð ð ð ùï òï ëï äï Ýï Öï Ïï Èï Áï ºï ³ï ¬ï ¥ï žï —ï ï ‰ï ‚ï {ï tï mï fï _ï Xï Qï Jï Cï <ï 5ï .ï 'ï  ï ï ï  ï ï ýî öî ïî èî áî Úî Óî Ìî Åî ¾î ·î °î ©î ¢î ›î ”î î †î î xî qî jî cî \î Uî Nî Gî @î 9î 2î +î $î î î î î î úí óí ìí åí Þí ×í Ðí Éí Âí »í ´í ­í ¦í Ÿí ˜í ‘í Ší ƒí |í uí ní gí `í Yí Rí Kí Dí =í 6í /í (í !í í í  í í þì ÷ì ðì éì âì Ûì Ôì Íì Æì ¿ì ¸ì ±ì ªì £ì œì •ì Žì ‡ì €ì yì rì kì dì ]ì Vì Oì Hì Aì :ì 3ì ,ì %ì ì ì ì  ì ì ûë ôë íë æë ßë Øë Ñë Êë Ãë ¼ë µë ®ë §ë  ë ™ë ’ë ‹ë „ë }ë vë oë hë aë Zë Së Lë Eë >ë 7ë 0ë )ë "ë ë ë  ë ë ÿê øê ñê êê ãê Üê Õê Îê Çê Àê ¹ê ²ê «ê ¤ê ê –ê ê ˆê ê zê sê lê eê ^ê Wê Pê Iê Bê ;ê 4ê -ê &ê ê ê ê  ê ê üé õé îé çé àé Ùé Òé Ëé Äé ½é ¶é ¯é ¨é ¡é šé “é Œé …é ~é wé pé ié bé [é Té Mé Fé ?é 8é 1é *é #é é é é é é ùè òè ëè äè Ýè Öè Ïè Èè Áè ºè ³è ¬è ¥è žè —è è ‰è ‚è {è tè mè fè _è Xè Qè Jè Cè <è 5è .è 'è  è è è  è è ýç öç ïç èç áç Úç Óç Ìç Åç ¾ç ·ç °ç ©ç ¢ç ›ç ”ç ç †ç ç xç qç jç cç \ç Uç Nç Gç @ç 9ç 2ç +ç $ç ç ç ç ç ç úæ óæ ìæ åæ Þæ ׿ Ðæ Éæ Âæ »æ ´æ ­æ ¦æ Ÿæ ˜æ ‘æ Šæ ƒæ |æ uæ næ gæ `æ Yæ Ræ Kæ Dæ =æ 6æ /æ (æ !æ æ æ  æ æ þå ÷å ðå éå âå Ûå Ôå Íå Æå ¿å ¸å ±å ªå £å œå •å Žå ‡å €å yå rå kå då ]å Vå Oå Hå Aå :å 3å ,å %å å å å  å å ûä ôä íä æä ßä Øä Ñä Êä Ãä ¼ä µä ®ä §ä  ä ™ä ’ä ‹ä „ä }ä vä oä hä aä Zä Sä Lä Eä >ä 7ä 0ä )ä "ä ä ä  ä ä ÿã øã ñã êã ãã Üã Õã Îã Çã À㠹㠲㠫㠤ã ã –ã ã ˆã ã zã sã lã eã ^ã Wã Pã Iã Bã ;ã 4ã -ã &ã ã ã ã  ã ã üâ õâ îâ çâ àâ Ùâ Òâ Ëâ Äâ ½â ¶â ¯â ¨â ¡â šâ “â Œâ …â ~â wâ pâ iâ bâ [â Tâ Mâ Fâ ?â 8â 1â *â #â â â â â â ùá òá ëá äá Ýá Öá Ïá Èá Áá ºá ³á ¬á ¥á žá —á á ‰á ‚á {á tá má fá _á Xá Qá Já Cá <á 5á .á 'á  á á á  á á ýà öà ïà èà áà Úà Óà Ìà Åà ¾à ·à °à ©à ¢à ›à ”à à †à à xà qà jà cà \à Uà Nà Gà @à 9à 2à +à $à à à à à à úß óß ìß åß Þß ×ß Ðß Éß Âß »ß ´ß ­ß ¦ß Ÿß ˜ß ‘ß Šß ƒß |ß uß nß gß `ß Yß Rß Kß Dß =ß 6ß /ß (ß !ß ß ß  ß ß þÞ ÷Þ ðÞ éÞ âÞ ÛÞ ÔÞ ÍÞ ÆÞ ¿Þ ¸Þ ±Þ ªÞ £Þ œÞ •Þ ŽÞ ‡Þ €Þ yÞ rÞ kÞ dÞ ]Þ VÞ OÞ HÞ AÞ :Þ 3Þ ,Þ %Þ Þ Þ Þ  Þ Þ ûÝ ôÝ íÝ æÝ ßÝ ØÝ ÑÝ ÊÝ ÃÝ ¼Ý µÝ ®Ý §Ý  Ý ™Ý ’Ý ‹Ý „Ý }Ý vÝ oÝ hÝ aÝ ZÝ SÝ LÝ EÝ >Ý 7Ý 0Ý )Ý "Ý Ý Ý  Ý Ý ÿÜ øÜ ñÜ êÜ ãÜ ÜÜ ÕÜ ÎÜ ÇÜ ÀÜ ¹Ü ²Ü «Ü ¤Ü Ü –Ü Ü ˆÜ Ü zÜ sÜ lÜ eÜ ^Ü WÜ PÜ IÜ BÜ ;Ü 4Ü -Ü &Ü Ü Ü Ü  Ü Ü üÛ õÛ îÛ çÛ àÛ ÙÛ ÒÛ ËÛ ÄÛ ½Û ¶Û ¯Û ¨Û ¡Û šÛ “Û ŒÛ …Û ~Û wÛ pÛ iÛ bÛ [Û TÛ MÛ FÛ ?Û 8Û 1Û *Û #Û Û Û Û Û Û ùÚ òÚ ëÚ äÚ ÝÚ ÖÚ ÏÚ ÈÚ ÁÚ ºÚ ³Ú ¬Ú ¥Ú žÚ —Ú Ú ‰Ú ‚Ú {Ú tÚ mÚ fÚ _Ú XÚ QÚ JÚ CÚ <Ú 5Ú .Ú 'Ú  Ú Ú Ú  Ú Ú ýÙ öÙ ïÙ èÙ áÙ ÚÙ ÓÙ ÌÙ ÅÙ ¾Ù ·Ù °Ù ©Ù ¢Ù ›Ù ”Ù Ù †Ù Ù xÙ qÙ jÙ cÙ \Ù UÙ NÙ GÙ @Ù 9Ù 2Ù +Ù $Ù Ù Ù Ù Ù Ù úØ óØ ìØ åØ ÞØ ר ÐØ ÉØ ÂØ »Ø ´Ø ­Ø ¦Ø ŸØ ˜Ø ‘Ø ŠØ ƒØ |Ø uØ nØ gØ `Ø YØ RØ KØ DØ =Ø 6Ø /Ø (Ø !Ø Ø Ø  Ø Ø þ× ÷× ð× é× â× Û× Ô× Í× Æ× ¿× ¸× ±× ª× £× œ× •× Ž× ‡× €× y× r× k× d× ]× V× O× H× A× :× 3× ,× %× × × ×  × × ûÖ ôÖ íÖ æÖ ßÖ ØÖ ÑÖ ÊÖ ÃÖ ¼Ö µÖ ®Ö §Ö  Ö ™Ö ’Ö ‹Ö „Ö }Ö vÖ oÖ hÖ aÖ ZÖ SÖ LÖ EÖ >Ö 7Ö 0Ö )Ö "Ö Ö Ö  Ö Ö ÿÕ øÕ ñÕ êÕ ãÕ ÜÕ ÕÕ ÎÕ ÇÕ ÀÕ ¹Õ ²Õ «Õ ¤Õ Õ –Õ Õ ˆÕ Õ zÕ sÕ lÕ eÕ ^Õ WÕ PÕ IÕ BÕ ;Õ 4Õ -Õ &Õ Õ Õ Õ  Õ Õ üÔ õÔ îÔ çÔ àÔ ÙÔ ÒÔ ËÔ ÄÔ ½Ô ¶Ô ¯Ô ¨Ô ¡Ô šÔ “Ô ŒÔ …Ô ~Ô wÔ pÔ iÔ bÔ [Ô TÔ MÔ FÔ ?Ô 8Ô 1Ô *Ô #Ô Ô Ô Ô Ô Ô ùÓ òÓ ëÓ äÓ ÝÓ ÖÓ ÏÓ ÈÓ ÁÓ ºÓ ³Ó ¬Ó ¥Ó žÓ —Ó Ó ‰Ó ‚Ó {Ó tÓ mÓ fÓ _Ó XÓ QÓ JÓ CÓ <Ó 5Ó .Ó 'Ó  Ó Ó Ó  Ó Ó ýÒ öÒ ïÒ èÒ áÒ ÚÒ ÓÒ ÌÒ ÅÒ ¾Ò ·Ò °Ò ©Ò ¢Ò ›Ò ”Ò Ò †Ò Ò xÒ qÒ jÒ cÒ \Ò UÒ NÒ GÒ @Ò 9Ò 2Ò +Ò $Ò Ò Ò Ò Ò Ò úÑ óÑ ìÑ åÑ ÞÑ ×Ñ ÐÑ ÉÑ ÂÑ »Ñ ´Ñ ­Ñ ¦Ñ ŸÑ ˜Ñ ‘Ñ ŠÑ ƒÑ |Ñ uÑ nÑ gÑ `Ñ YÑ RÑ KÑ DÑ =Ñ 6Ñ /Ñ (Ñ !Ñ Ñ Ñ  Ñ Ñ þÐ ÷Ð ðÐ éÐ âÐ ÛÐ ÔÐ ÍÐ ÆÐ ¿Ð ¸Ð ±Ð ªÐ £Ð œÐ •Ð ŽÐ ‡Ð €Ð yÐ rÐ kÐ dÐ ]Ð VÐ OÐ HÐ AÐ :Ð 3Ð ,Ð %Ð Ð Ð Ð  Ð Ð ûÏ ôÏ íÏ æÏ ßÏ ØÏ ÑÏ ÊÏ ÃÏ ¼Ï µÏ ®Ï §Ï  Ï ™Ï ’Ï ‹Ï „Ï }Ï vÏ oÏ hÏ aÏ ZÏ SÏ LÏ EÏ >Ï 7Ï 0Ï )Ï "Ï Ï Ï  Ï Ï ÿÎ øÎ ñÎ êÎ ãÎ ÜÎ ÕÎ ÎÎ ÇÎ ÀÎ ¹Î ²Î «Î ¤Î Î –Î Î ˆÎ Î zÎ sÎ lÎ eÎ ^Î WÎ PÎ IÎ BÎ ;Î 4Î -Î &Î Î Î Î  Î Î üÍ õÍ îÍ çÍ àÍ ÙÍ ÒÍ ËÍ ÄÍ ½Í ¶Í ¯Í ¨Í ¡Í šÍ “Í ŒÍ …Í ~Í wÍ pÍ iÍ bÍ [Í TÍ MÍ FÍ ?Í 8Í 1Í *Í #Í Í Í Í Í Í ùÌ òÌ ëÌ äÌ ÝÌ ÖÌ ÏÌ ÈÌ ÁÌ ºÌ ³Ì ¬Ì ¥Ì žÌ —Ì Ì ‰Ì ‚Ì {Ì tÌ mÌ fÌ _Ì XÌ QÌ JÌ CÌ <Ì 5Ì .Ì 'Ì  Ì Ì Ì  Ì Ì ýË öË ïË èË áË ÚË ÓË ÌË ÅË ¾Ë ·Ë °Ë ©Ë ¢Ë ›Ë ”Ë Ë †Ë Ë xË qË jË cË \Ë UË NË GË @Ë 9Ë 2Ë +Ë $Ë Ë Ë Ë Ë Ë úÊ óÊ ìÊ åÊ ÞÊ ×Ê ÐÊ ÉÊ ÂÊ »Ê ´Ê ­Ê ¦Ê ŸÊ ˜Ê ‘Ê ŠÊ ƒÊ |Ê uÊ nÊ gÊ `Ê YÊ RÊ KÊ DÊ =Ê 6Ê /Ê (Ê !Ê Ê Ê  Ê Ê þÉ ÷É ðÉ éÉ âÉ ÛÉ ÔÉ ÍÉ ÆÉ ¿É ¸É ±É ªÉ £É œÉ •É ŽÉ ‡É €É yÉ rÉ kÉ dÉ ]É VÉ OÉ HÉ AÉ :É 3É ,É %É É É É  É É ûÈ ôÈ íÈ æÈ ßÈ ØÈ ÑÈ ÊÈ ÃÈ ¼È µÈ ®È §È  È ™È ’È ‹È „È }È vÈ oÈ hÈ aÈ ZÈ SÈ LÈ EÈ >È 7È 0È )È "È È È  È È ÿÇ øÇ ñÇ êÇ ãÇ ÜÇ ÕÇ ÎÇ ÇÇ ÀÇ ¹Ç ²Ç «Ç ¤Ç Ç –Ç Ç ˆÇ Ç zÇ sÇ lÇ eÇ ^Ç WÇ PÇ IÇ BÇ ;Ç 4Ç -Ç &Ç Ç Ç Ç  Ç Ç üÆ õÆ îÆ çÆ àÆ ÙÆ ÒÆ ËÆ ÄÆ ½Æ ¶Æ ¯Æ ¨Æ ¡Æ šÆ “Æ ŒÆ …Æ ~Æ wÆ pÆ iÆ bÆ [Æ TÆ MÆ FÆ ?Æ 8Æ 1Æ *Æ #Æ Æ Æ Æ Æ Æ ùÅ òÅ ëÅ äÅ ÝÅ ÖÅ ÏÅ ÈÅ ÁÅ ºÅ ³Å ¬Å ¥Å žÅ —Å Å ‰Å ‚Å {Å tÅ mÅ fÅ _Å XÅ QÅ JÅ CÅ <Å 5Å .Å 'Å  Å Å Å  Å Å ýÄ öÄ ïÄ èÄ áÄ ÚÄ ÓÄ ÌÄ ÅÄ ¾Ä ·Ä °Ä ©Ä ¢Ä ›Ä ”Ä Ä †Ä Ä xÄ qÄ jÄ cÄ \Ä UÄ NÄ GÄ @Ä 9Ä 2Ä +Ä $Ä Ä Ä Ä Ä Ä úà óà ìà åà Þà ×à Ðà Éà Âà »Ã ´Ã ­Ã ¦Ã ŸÃ ˜Ã ‘à ŠÃ ƒÃ |à uà nà gà `à Yà Rà Kà Dà =à 6à /à (à !à à à  à à þ ÷ ð é â Û Ô Í ÆÂ ¿Â ¸Â ±Â ªÂ £Â œÂ • ŽÂ ‡Â €Â y r k d ] V O H A : 3 , %       ûÁ ôÁ íÁ æÁ ßÁ ØÁ ÑÁ ÊÁ ÃÁ ¼Á µÁ ®Á §Á  Á ™Á ’Á ‹Á „Á }Á vÁ oÁ hÁ aÁ ZÁ SÁ LÁ EÁ >Á 7Á 0Á )Á "Á Á Á  Á Á ÿÀ øÀ ñÀ êÀ ãÀ ÜÀ ÕÀ ÎÀ ÇÀ ÀÀ ¹À ²À «À ¤À À –À À ˆÀ À zÀ sÀ lÀ eÀ ^À WÀ PÀ IÀ BÀ ;À 4À -À &À À À À  À À ü¿ õ¿ î¿ ç¿ à¿ Ù¿ Ò¿ Ë¿ Ä¿ ½¿ ¶¿ ¯¿ ¨¿ ¡¿ š¿ “¿ Œ¿ …¿ ~¿ w¿ p¿ i¿ b¿ [¿ T¿ M¿ F¿ ?¿ 8¿ 1¿ *¿ #¿ ¿ ¿ ¿ ¿ ¿ ù¾ ò¾ ë¾ ä¾ ݾ Ö¾ Ͼ Ⱦ Á¾ º¾ ³¾ ¬¾ ¥¾ ž¾ —¾ ¾ ‰¾ ‚¾ {¾ t¾ m¾ f¾ _¾ X¾ Q¾ J¾ C¾ <¾ 5¾ .¾ '¾  ¾ ¾ ¾  ¾ ¾ ý½ ö½ ï½ è½ á½ Ú½ Ó½ ̽ Ž ¾½ ·½ °½ ©½ ¢½ ›½ ”½ ½ †½ ½ x½ q½ j½ c½ \½ U½ N½ G½ @½ 9½ 2½ +½ $½ ½ ½ ½ ½ ½ ú¼ ó¼ ì¼ å¼ Þ¼ ×¼ м ɼ ¼ »¼ ´¼ ­¼ ¦¼ Ÿ¼ ˜¼ ‘¼ м ƒ¼ |¼ u¼ n¼ g¼ `¼ Y¼ R¼ K¼ D¼ =¼ 6¼ /¼ (¼ !¼ ¼ ¼  ¼ ¼ þ» ÷» ð» é» â» Û» Ô» Í» Æ» ¿» ¸» ±» ª» £» œ» •» Ž» ‡» €» y» r» k» d» ]» V» O» H» A» :» 3» ,» %» » » »  » » ûº ôº íº æº ߺ غ Ѻ ʺ ú ¼º µº ®º §º  º ™º ’º ‹º „º }º vº oº hº aº Zº Sº Lº Eº >º 7º 0º )º "º º º  º º ÿ¹ ø¹ ñ¹ ê¹ ã¹ ܹ Õ¹ ι ǹ À¹ ¹¹ ²¹ «¹ ¤¹ ¹ –¹ ¹ ˆ¹ ¹ z¹ s¹ l¹ e¹ ^¹ W¹ P¹ I¹ B¹ ;¹ 4¹ -¹ &¹ ¹ ¹ ¹  ¹ ¹ ü¸ õ¸ î¸ ç¸ ภÙ¸ Ò¸ ˸ ĸ ½¸ ¶¸ ¯¸ ¨¸ ¡¸ š¸ “¸ Œ¸ …¸ ~¸ w¸ p¸ i¸ b¸ [¸ T¸ M¸ F¸ ?¸ 8¸ 1¸ *¸ #¸ ¸ ¸ ¸ ¸ ¸ ù· ò· ë· ä· Ý· Ö· Ï· È· Á· º· ³· ¬· ¥· ž· —· · ‰· ‚· {· t· m· f· _· X· Q· J· C· <· 5· .· '·  · · ·  · · ý¶ ö¶ ï¶ è¶ á¶ Ú¶ Ó¶ ̶ Ŷ ¾¶ ·¶ °¶ ©¶ ¢¶ ›¶ ”¶ ¶ †¶ ¶ x¶ q¶ j¶ c¶ \¶ U¶ N¶ G¶ @¶ 9¶ 2¶ +¶ $¶ ¶ ¶ ¶ ¶ ¶ úµ óµ ìµ åµ Þµ ×µ е ɵ µ »µ ´µ ­µ ¦µ Ÿµ ˜µ ‘µ е ƒµ |µ uµ nµ gµ `µ Yµ Rµ Kµ Dµ =µ 6µ /µ (µ !µ µ µ  µ µ þ´ ÷´ ð´ é´ â´ Û´ Ô´ Í´ Æ´ ¿´ ¸´ ±´ ª´ £´ œ´ •´ Ž´ ‡´ €´ y´ r´ k´ d´ ]´ V´ O´ H´ A´ :´ 3´ ,´ %´ ´ ´ ´  ´ ´ û³ ô³ í³ æ³ ß³ س ѳ ʳ ó ¼³ µ³ ®³ §³  ³ ™³ ’³ ‹³ „³ }³ v³ o³ h³ a³ Z³ S³ L³ E³ >³ 7³ 0³ )³ "³ ³ ³  ³ ³ ÿ² ø² ñ² ê² ã² ܲ Õ² β Dz À² ¹² ²² «² ¤² ² –² ² ˆ² ² z² s² l² e² ^² W² P² I² B² ;² 4² -² &² ² ² ²  ² ² ü± õ± î± ç± à± Ù± Ò± ˱ ı ½± ¶± ¯± ¨± ¡± š± “± Œ± …± ~± w± p± i± b± [± T± M± F± ?± 8± 1± *± #± ± ± ± ± ± ù° ò° ë° ä° ݰ Ö° ϰ Ȱ Á° º° ³° ¬° ¥° ž° —° ° ‰° ‚° {° t° m° f° _° X° Q° J° C° <° 5° .° '°  ° ° °  ° ° ý¯ ö¯ ï¯ è¯ ᯠÚ¯ Ó¯ ̯ ů ¾¯ ·¯ °¯ ©¯ ¢¯ ›¯ ”¯ ¯ †¯ ¯ x¯ q¯ j¯ c¯ \¯ U¯ N¯ G¯ @¯ 9¯ 2¯ +¯ $¯ ¯ ¯ ¯ ¯ ¯ ú® ó® ì® å® Þ® ×® Ю É® ® »® ´® ­® ¦® Ÿ® ˜® ‘® Š® ƒ® |® u® n® g® `® Y® R® K® D® =® 6® /® (® !® ® ®  ® ® þ­ ÷­ ð­ é­ â­ Û­ Ô­ Í­ Æ­ ¿­ ¸­ ±­ ª­ £­ œ­ •­ Ž­ ‡­ €­ y­ r­ k­ d­ ]­ V­ O­ H­ A­ :­ 3­ ,­ %­ ­ ­ ­  ­ ­ û¬ ô¬ í¬ æ¬ ߬ ج Ѭ ʬ ì ¼¬ µ¬ ®¬ §¬  ¬ ™¬ ’¬ ‹¬ „¬ }¬ v¬ o¬ h¬ a¬ Z¬ S¬ L¬ E¬ >¬ 7¬ 0¬ )¬ "¬ ¬ ¬  ¬ ¬ ÿ« ø« ñ« ê« ã« Ü« Õ« Ϋ Ç« À« ¹« ²« «« ¤« « –« « ˆ« « z« s« l« e« ^« W« P« I« B« ;« 4« -« &« « « «  « « üª õª îª çª ઠÙª Òª ˪ Ī ½ª ¶ª ¯ª ¨ª ¡ª šª “ª Œª …ª ~ª wª pª iª bª [ª Tª Mª Fª ?ª 8ª 1ª *ª #ª ª ª ª ª ª ù© ò© ë© ä© Ý© Ö© Ï© È© Á© º© ³© ¬© ¥© ž© —© © ‰© ‚© {© t© m© f© _© X© Q© J© C© <© 5© .© '©  © © ©  © © ý¨ ö¨ ï¨ è¨ ᨠÚ¨ Ó¨ ̨ Ũ ¾¨ ·¨ °¨ ©¨ ¢¨ ›¨ ”¨ ¨ †¨ ¨ x¨ q¨ j¨ c¨ \¨ U¨ N¨ G¨ @¨ 9¨ 2¨ +¨ $¨ ¨ ¨ ¨ ¨ ¨ ú§ ó§ ì§ å§ Þ§ ×§ Ч ɧ § »§ ´§ ­§ ¦§ Ÿ§ ˜§ ‘§ Ч ƒ§ |§ u§ n§ g§ `§ Y§ R§ K§ D§ =§ 6§ /§ (§ !§ § §  § § þ¦ ÷¦ ð¦ é¦ ⦠Û¦ Ô¦ ͦ Ʀ ¿¦ ¸¦ ±¦ ª¦ £¦ œ¦ •¦ ަ ‡¦ €¦ y¦ r¦ k¦ d¦ ]¦ V¦ O¦ H¦ A¦ :¦ 3¦ ,¦ %¦ ¦ ¦ ¦  ¦ ¦ û¥ ô¥ í¥ æ¥ ߥ Ø¥ Ñ¥ Ê¥ Ã¥ ¼¥ µ¥ ®¥ §¥  ¥ ™¥ ’¥ ‹¥ „¥ }¥ v¥ o¥ h¥ a¥ Z¥ S¥ L¥ E¥ >¥ 7¥ 0¥ )¥ "¥ ¥ ¥  ¥ ¥ ÿ¤ ø¤ ñ¤ ê¤ 㤠ܤ Õ¤ Τ Ǥ À¤ ¹¤ ²¤ «¤ ¤¤ ¤ –¤ ¤ ˆ¤ ¤ z¤ s¤ l¤ e¤ ^¤ W¤ P¤ I¤ B¤ ;¤ 4¤ -¤ &¤ ¤ ¤ ¤  ¤ ¤ ü£ õ£ î£ ç£ ࣠Ù£ Ò£ Ë£ Ä£ ½£ ¶£ ¯£ ¨£ ¡£ 𣠓£ Œ£ …£ ~£ w£ p£ i£ b£ [£ T£ M£ F£ ?£ 8£ 1£ *£ #£ £ £ £ £ £ ù¢ ò¢ ë¢ ä¢ Ý¢ Ö¢ Ï¢ È¢ Á¢ º¢ ³¢ ¬¢ ¥¢ ž¢ —¢ ¢ ‰¢ ‚¢ {¢ t¢ m¢ f¢ _¢ X¢ Q¢ J¢ C¢ <¢ 5¢ .¢ '¢  ¢ ¢ ¢  ¢ ¢ ý¡ ö¡ ï¡ è¡ á¡ Ú¡ Ó¡ Ì¡ Å¡ ¾¡ ·¡ °¡ ©¡ ¢¡ ›¡ ”¡ ¡ †¡ ¡ x¡ q¡ j¡ c¡ \¡ U¡ N¡ G¡ @¡ 9¡ 2¡ +¡ $¡ ¡ ¡ ¡ ¡ ¡ ú  ó  ì  å  Þ  ×  Р É    »  ´  ­  ¦  Ÿ  ˜  ‘  Š  ƒ  |  u  n  g  `  Y  R  K  D  =  6  /  (  !           þŸ ÷Ÿ ðŸ éŸ ⟠ÛŸ ÔŸ ÍŸ ÆŸ ¿Ÿ ¸Ÿ ±Ÿ ªŸ £Ÿ œŸ •Ÿ ŽŸ ‡Ÿ €Ÿ yŸ rŸ kŸ dŸ ]Ÿ VŸ OŸ HŸ AŸ :Ÿ 3Ÿ ,Ÿ %Ÿ Ÿ Ÿ Ÿ  Ÿ Ÿ ûž ôž íž æž ßž Øž Ñž Êž Þ ¼ž µž ®ž §ž  ž ™ž ’ž ‹ž „ž }ž vž ož hž až Zž Sž Lž Ež >ž 7ž 0ž )ž "ž ž ž  ž ž ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üœ õœ îœ çœ àœ Ùœ Òœ Ëœ Äœ ½œ ¶œ ¯œ ¨œ ¡œ šœ “œ Œœ …œ ~œ wœ pœ iœ bœ [œ Tœ Mœ Fœ ?œ 8œ 1œ *œ #œ œ œ œ œ œ ù› ò› ë› ä› Ý› Ö› Ï› È› Á› º› ³› ¬› ¥› ž› —› › ‰› ‚› {› t› m› f› _› X› Q› J› C› <› 5› .› '›  › › ›  › › ýš öš ïš èš áš Úš Óš Ìš Åš ¾š ·š °š ©š ¢š ›š ”š š †š š xš qš jš cš \š Uš Nš Gš @š 9š 2š +š $š š š š š š ú™ ó™ ì™ å™ Þ™ ×™ Й É™ ™ »™ ´™ ­™ ¦™ Ÿ™ ˜™ ‘™ Š™ ƒ™ |™ u™ n™ g™ `™ Y™ R™ K™ D™ =™ 6™ /™ (™ !™ ™ ™  ™ ™ þ˜ ÷˜ ð˜ é˜ ☠Û˜ Ô˜ ͘ Ƙ ¿˜ ¸˜ ±˜ ª˜ £˜ œ˜ •˜ Ž˜ ‡˜ €˜ y˜ r˜ k˜ d˜ ]˜ V˜ O˜ H˜ A˜ :˜ 3˜ ,˜ %˜ ˜ ˜ ˜  ˜ ˜ û— ô— í— æ— ß— Ø— Ñ— Ê— × ¼— µ— ®— §—  — ™— ’— ‹— „— }— v— o— h— a— Z— S— L— E— >— 7— 0— )— "— — —  — — ÿ– ø– ñ– ê– ã– Ü– Õ– Ζ Ç– À– ¹– ²– «– ¤– – –– – ˆ– – z– s– l– e– ^– W– P– I– B– ;– 4– -– &– – – –  – – ü• õ• î• ç• à• Ù• Ò• Ë• Ä• ½• ¶• ¯• ¨• ¡• š• “• Œ• …• ~• w• p• i• b• [• T• M• F• ?• 8• 1• *• #• • • • • • ù” ò” ë” ä” Ý” Ö” Ï” È” Á” º” ³” ¬” ¥” ž” —” ” ‰” ‚” {” t” m” f” _” X” Q” J” C” <” 5” .” '”  ” ” ”  ” ” ý“ ö“ ï“ è“ á“ Ú“ Ó“ Ì“ Å“ ¾“ ·“ °“ ©“ ¢“ ›“ ”“ “ †“ “ x“ q“ j“ c“ \“ U“ N“ G“ @“ 9“ 2“ +“ $“ “ “ “ “ “ ú’ ó’ ì’ å’ Þ’ ×’ Ð’ É’ Â’ »’ ´’ ­’ ¦’ Ÿ’ ˜’ ‘’ Š’ ƒ’ |’ u’ n’ g’ `’ Y’ R’ K’ D’ =’ 6’ /’ (’ !’ ’ ’  ’ ’ þ‘ ÷‘ ð‘ é‘ â‘ Û‘ Ô‘ Í‘ Æ‘ ¿‘ ¸‘ ±‘ ª‘ £‘ œ‘ •‘ Ž‘ ‡‘ €‘ y‘ r‘ k‘ d‘ ]‘ V‘ O‘ H‘ A‘ :‘ 3‘ ,‘ %‘ ‘ ‘ ‘  ‘ ‘ û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üŽ õŽ îŽ çŽ àŽ ÙŽ ÒŽ ËŽ ÄŽ ½Ž ¶Ž ¯Ž ¨Ž ¡Ž šŽ “Ž ŒŽ …Ž ~Ž wŽ pŽ iŽ bŽ [Ž TŽ MŽ FŽ ?Ž 8Ž 1Ž *Ž #Ž Ž Ž Ž Ž Ž ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýŒ öŒ ïŒ èŒ ጠÚŒ ÓŒ ÌŒ ÅŒ ¾Œ ·Œ °Œ ©Œ ¢Œ ›Œ ”Œ Œ †Œ Œ xŒ qŒ jŒ cŒ \Œ UŒ NŒ GŒ @Œ 9Œ 2Œ +Œ $Œ Œ Œ Œ Œ Œ ú‹ ó‹ ì‹ å‹ Þ‹ ׋ Ћ É‹ ‹ »‹ ´‹ ­‹ ¦‹ Ÿ‹ ˜‹ ‘‹ Š‹ ƒ‹ |‹ u‹ n‹ g‹ `‹ Y‹ R‹ K‹ D‹ =‹ 6‹ /‹ (‹ !‹ ‹ ‹  ‹ ‹ þŠ ÷Š ðŠ éŠ ⊠ÛŠ ÔŠ ÍŠ ÆŠ ¿Š ¸Š ±Š ªŠ £Š œŠ •Š ŽŠ ‡Š €Š yŠ rŠ kŠ dŠ ]Š VŠ OŠ HŠ AŠ :Š 3Š ,Š %Š Š Š Š  Š Š û‰ ô‰ í‰ æ‰ ߉ ؉ щ ʉ É ¼‰ µ‰ ®‰ §‰  ‰ ™‰ ’‰ ‹‰ „‰ }‰ v‰ o‰ h‰ a‰ Z‰ S‰ L‰ E‰ >‰ 7‰ 0‰ )‰ "‰ ‰ ‰  ‰ ‰ ÿˆ øˆ ñˆ êˆ ㈠܈ Õˆ Έ Lj Àˆ ¹ˆ ²ˆ «ˆ ¤ˆ ˆ –ˆ ˆ ˆˆ ˆ zˆ sˆ lˆ eˆ ^ˆ Wˆ Pˆ Iˆ Bˆ ;ˆ 4ˆ -ˆ &ˆ ˆ ˆ ˆ  ˆ ˆ ü‡ õ‡ î‡ ç‡ à‡ Ù‡ Ò‡ ˇ ć ½‡ ¶‡ ¯‡ ¨‡ ¡‡ š‡ “‡ Œ‡ …‡ ~‡ w‡ p‡ i‡ b‡ [‡ T‡ M‡ F‡ ?‡ 8‡ 1‡ *‡ #‡ ‡ ‡ ‡ ‡ ‡ ù† ò† ë† ä† ݆ Ö† φ Ȇ Á† º† ³† ¬† ¥† ž† —† † ‰† ‚† {† t† m† f† _† X† Q† J† C† <† 5† .† '†  † † †  † † ý… ö… ï… è… á… Ú… Ó… Ì… Å… ¾… ·… °… ©… ¢… ›… ”… … †… … x… q… j… c… \… U… N… G… @… 9… 2… +… $… … … … … … ú„ ó„ ì„ å„ Þ„ ׄ Є É„ „ »„ ´„ ­„ ¦„ Ÿ„ ˜„ ‘„ Š„ ƒ„ |„ u„ n„ g„ `„ Y„ R„ K„ D„ =„ 6„ /„ („ !„ „ „  „ „ þƒ ÷ƒ ðƒ éƒ ⃠Ûƒ Ôƒ ̓ ƃ ¿ƒ ¸ƒ ±ƒ ªƒ £ƒ œƒ •ƒ Žƒ ‡ƒ €ƒ yƒ rƒ kƒ dƒ ]ƒ Vƒ Oƒ Hƒ Aƒ :ƒ 3ƒ ,ƒ %ƒ ƒ ƒ ƒ  ƒ ƒ û‚ ô‚ í‚ æ‚ ß‚ Ø‚ Ñ‚ Ê‚  ¼‚ µ‚ ®‚ §‚  ‚ ™‚ ’‚ ‹‚ „‚ }‚ v‚ o‚ h‚ a‚ Z‚ S‚ L‚ E‚ >‚ 7‚ 0‚ )‚ "‚ ‚ ‚  ‚ ‚ ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü€ õ€ î€ ç€ à€ Ù€ Ò€ Ë€ Ä€ ½€ ¶€ ¯€ ¨€ ¡€ š€ “€ Œ€ …€ ~€ w€ p€ i€ b€ [€ T€ M€ F€ ?€ 8€ 1€ *€ #€ € € € € € ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý~ ö~ ï~ è~ á~ Ú~ Ó~ Ì~ Å~ ¾~ ·~ °~ ©~ ¢~ ›~ ”~ ~ †~ ~ x~ q~ j~ c~ \~ U~ N~ G~ @~ 9~ 2~ +~ $~ ~ ~ ~ ~ ~ ú} ó} ì} å} Þ} ×} Ð} É} Â} »} ´} ­} ¦} Ÿ} ˜} ‘} Š} ƒ} |} u} n} g} `} Y} R} K} D} =} 6} /} (} !} } }  } } þ| ÷| ð| é| â| Û| Ô| Í| Æ| ¿| ¸| ±| ª| £| œ| •| Ž| ‡| €| y| r| k| d| ]| V| O| H| A| :| 3| ,| %| | | |  | | û{ ô{ í{ æ{ ß{ Ø{ Ñ{ Ê{ Ã{ ¼{ µ{ ®{ §{  { ™{ ’{ ‹{ „{ }{ v{ o{ h{ a{ Z{ S{ L{ E{ >{ 7{ 0{ ){ "{ { {  { { ÿz øz ñz êz ãz Üz Õz Îz Çz Àz ¹z ²z «z ¤z z –z z ˆz z zz sz lz ez ^z Wz Pz Iz Bz ;z 4z -z &z z z z  z z üy õy îy çy ày Ùy Òy Ëy Äy ½y ¶y ¯y ¨y ¡y šy “y Œy …y ~y wy py iy by [y Ty My Fy ?y 8y 1y *y #y y y y y y ùx òx ëx äx Ýx Öx Ïx Èx Áx ºx ³x ¬x ¥x žx —x x ‰x ‚x {x tx mx fx _x Xx Qx Jx Cx t 7t 0t )t "t t t  t t ÿs øs ñs ês ãs Üs Õs Îs Çs Às ¹s ²s «s ¤s s –s s ˆs s zs ss ls es ^s Ws Ps Is Bs ;s 4s -s &s s s s  s s ür õr îr çr àr Ùr Òr Ër Är ½r ¶r ¯r ¨r ¡r šr “r Œr …r ~r wr pr ir br [r Tr Mr Fr ?r 8r 1r *r #r r r r r r ùq òq ëq äq Ýq Öq Ïq Èq Áq ºq ³q ¬q ¥q žq —q q ‰q ‚q {q tq mq fq _q Xq Qq Jq Cq m 7m 0m )m "m m m  m m ÿl øl ñl êl ãl Ül Õl Îl Çl Àl ¹l ²l «l ¤l l –l l ˆl l zl sl ll el ^l Wl Pl Il Bl ;l 4l -l &l l l l  l l ük õk îk çk àk Ùk Òk Ëk Äk ½k ¶k ¯k ¨k ¡k šk “k Œk …k ~k wk pk ik bk [k Tk Mk Fk ?k 8k 1k *k #k k k k k k ùj òj ëj äj Ýj Öj Ïj Èj Áj ºj ³j ¬j ¥j žj —j j ‰j ‚j {j tj mj fj _j Xj Qj Jj Cj f 7f 0f )f "f f f  f f ÿe øe ñe êe ãe Üe Õe Îe Çe Àe ¹e ²e «e ¤e e –e e ˆe e ze se le ee ^e We Pe Ie Be ;e 4e -e &e e e e  e e üd õd îd çd àd Ùd Òd Ëd Äd ½d ¶d ¯d ¨d ¡d šd “d Œd …d ~d wd pd id bd [d Td Md Fd ?d 8d 1d *d #d d d d d d ùc òc ëc äc Ýc Öc Ïc Èc Ác ºc ³c ¬c ¥c žc —c c ‰c ‚c {c tc mc fc _c Xc Qc Jc Cc _ 7_ 0_ )_ "_ _ _  _ _ ÿ^ ø^ ñ^ ê^ ã^ Ü^ Õ^ Î^ Ç^ À^ ¹^ ²^ «^ ¤^ ^ –^ ^ ˆ^ ^ z^ s^ l^ e^ ^^ W^ P^ I^ B^ ;^ 4^ -^ &^ ^ ^ ^  ^ ^ ü] õ] î] ç] à] Ù] Ò] Ë] Ä] ½] ¶] ¯] ¨] ¡] š] “] Œ] …] ~] w] p] i] b] [] T] M] F] ?] 8] 1] *] #] ] ] ] ] ] ù\ ò\ ë\ ä\ Ý\ Ö\ Ï\ È\ Á\ º\ ³\ ¬\ ¥\ ž\ —\ \ ‰\ ‚\ {\ t\ m\ f\ _\ X\ Q\ J\ C\ <\ 5\ .\ '\  \ \ \  \ \ ý[ ö[ ï[ è[ á[ Ú[ Ó[ Ì[ Å[ ¾[ ·[ °[ ©[ ¢[ ›[ ”[ [ †[ [ x[ q[ j[ c[ \[ U[ N[ G[ @[ 9[ 2[ +[ $[ [ [ [ [ [ úZ óZ ìZ åZ ÞZ ×Z ÐZ ÉZ ÂZ »Z ´Z ­Z ¦Z ŸZ ˜Z ‘Z ŠZ ƒZ |Z uZ nZ gZ `Z YZ RZ KZ DZ =Z 6Z /Z (Z !Z Z Z  Z Z þY ÷Y ðY éY âY ÛY ÔY ÍY ÆY ¿Y ¸Y ±Y ªY £Y œY •Y ŽY ‡Y €Y yY rY kY dY ]Y VY OY HY AY :Y 3Y ,Y %Y Y Y Y  Y Y ûX ôX íX æX ßX ØX ÑX ÊX ÃX ¼X µX ®X §X  X ™X ’X ‹X „X }X vX oX hX aX ZX SX LX EX >X 7X 0X )X "X X X  X X ÿW øW ñW êW ãW ÜW ÕW ÎW ÇW ÀW ¹W ²W «W ¤W W –W W ˆW W zW sW lW eW ^W WW PW IW BW ;W 4W -W &W W W W  W W üV õV îV çV àV ÙV ÒV ËV ÄV ½V ¶V ¯V ¨V ¡V šV “V ŒV …V ~V wV pV iV bV [V TV MV FV ?V 8V 1V *V #V V V V V V ùU òU ëU äU ÝU ÖU ÏU ÈU ÁU ºU ³U ¬U ¥U žU —U U ‰U ‚U {U tU mU fU _U XU QU JU CU Q 7Q 0Q )Q "Q Q Q  Q Q ÿP øP ñP êP ãP ÜP ÕP ÎP ÇP ÀP ¹P ²P «P ¤P P –P P ˆP P zP sP lP eP ^P WP PP IP BP ;P 4P -P &P P P P  P P üO õO îO çO àO ÙO ÒO ËO ÄO ½O ¶O ¯O ¨O ¡O šO “O ŒO …O ~O wO pO iO bO [O TO MO FO ?O 8O 1O *O #O O O O O O ùN òN ëN äN ÝN ÖN ÏN ÈN ÁN ºN ³N ¬N ¥N žN —N N ‰N ‚N {N tN mN fN _N XN QN JN CN J 7J 0J )J "J J J  J J ÿI øI ñI êI ãI ÜI ÕI ÎI ÇI ÀI ¹I ²I «I ¤I I –I I ˆI I zI sI lI eI ^I WI PI II BI ;I 4I -I &I I I I  I I üH õH îH çH àH ÙH ÒH ËH ÄH ½H ¶H ¯H ¨H ¡H šH “H ŒH …H ~H wH pH iH bH [H TH MH FH ?H 8H 1H *H #H H H H H H ùG òG ëG äG ÝG ÖG ÏG ÈG ÁG ºG ³G ¬G ¥G žG —G G ‰G ‚G {G tG mG fG _G XG QG JG CG C 7C 0C )C "C C C  C C ÿB øB ñB êB ãB ÜB ÕB ÎB ÇB ÀB ¹B ²B «B ¤B B –B B ˆB B zB sB lB eB ^B WB PB IB BB ;B 4B -B &B B B B  B B üA õA îA çA àA ÙA ÒA ËA ÄA ½A ¶A ¯A ¨A ¡A šA “A ŒA …A ~A wA pA iA bA [A TA MA FA ?A 8A 1A *A #A A A A A A ù@ ò@ ë@ ä@ Ý@ Ö@ Ï@ È@ Á@ º@ ³@ ¬@ ¥@ ž@ —@ @ ‰@ ‚@ {@ t@ m@ f@ _@ X@ Q@ J@ C@ <@ 5@ .@ '@  @ @ @  @ @ ý? ö? ï? è? á? Ú? Ó? Ì? Å? ¾? ·? °? ©? ¢? ›? ”? ? †? ? x? q? j? c? \? U? N? G? @? 9? 2? +? $? ? ? ? ? ? ú> ó> ì> å> Þ> ×> Ð> É> Â> »> ´> ­> ¦> Ÿ> ˜> ‘> Š> ƒ> |> u> n> g> `> Y> R> K> D> => 6> /> (> !> > >  > > þ= ÷= ð= é= â= Û= Ô= Í= Æ= ¿= ¸= ±= ª= £= œ= •= Ž= ‡= €= y= r= k= d= ]= V= O= H= A= := 3= ,= %= = = =  = = û< ô< í< æ< ß< Ø< Ñ< Ê< Ã< ¼< µ< ®< §<  < ™< ’< ‹< „< }< v< o< h< a< Z< S< L< E< >< 7< 0< )< "< < <  < < ÿ; ø; ñ; ê; ã; Ü; Õ; Î; Ç; À; ¹; ²; «; ¤; ; –; ; ˆ; ; z; s; l; e; ^; W; P; I; B; ;; 4; -; &; ; ; ;  ; ; ü: õ: î: ç: à: Ù: Ò: Ë: Ä: ½: ¶: ¯: ¨: ¡: š: “: Œ: …: ~: w: p: i: b: [: T: M: F: ?: 8: 1: *: #: : : : : : ù9 ò9 ë9 ä9 Ý9 Ö9 Ï9 È9 Á9 º9 ³9 ¬9 ¥9 ž9 —9 9 ‰9 ‚9 {9 t9 m9 f9 _9 X9 Q9 J9 C9 <9 59 .9 '9  9 9 9  9 9 ý8 ö8 ï8 è8 á8 Ú8 Ó8 Ì8 Å8 ¾8 ·8 °8 ©8 ¢8 ›8 ”8 8 †8 8 x8 q8 j8 c8 \8 U8 N8 G8 @8 98 28 +8 $8 8 8 8 8 8 ú7 ó7 ì7 å7 Þ7 ×7 Ð7 É7 Â7 »7 ´7 ­7 ¦7 Ÿ7 ˜7 ‘7 Š7 ƒ7 |7 u7 n7 g7 `7 Y7 R7 K7 D7 =7 67 /7 (7 !7 7 7  7 7 þ6 ÷6 ð6 é6 â6 Û6 Ô6 Í6 Æ6 ¿6 ¸6 ±6 ª6 £6 œ6 •6 Ž6 ‡6 €6 y6 r6 k6 d6 ]6 V6 O6 H6 A6 :6 36 ,6 %6 6 6 6  6 6 û5 ô5 í5 æ5 ß5 Ø5 Ñ5 Ê5 Ã5 ¼5 µ5 ®5 §5  5 ™5 ’5 ‹5 „5 }5 v5 o5 h5 a5 Z5 S5 L5 E5 >5 75 05 )5 "5 5 5  5 5 ÿ4 ø4 ñ4 ê4 ã4 Ü4 Õ4 Î4 Ç4 À4 ¹4 ²4 «4 ¤4 4 –4 4 ˆ4 4 z4 s4 l4 e4 ^4 W4 P4 I4 B4 ;4 44 -4 &4 4 4 4  4 4 ü3 õ3 î3 ç3 à3 Ù3 Ò3 Ë3 Ä3 ½3 ¶3 ¯3 ¨3 ¡3 š3 “3 Œ3 …3 ~3 w3 p3 i3 b3 [3 T3 M3 F3 ?3 83 13 *3 #3 3 3 3 3 3 ù2 ò2 ë2 ä2 Ý2 Ö2 Ï2 È2 Á2 º2 ³2 ¬2 ¥2 ž2 —2 2 ‰2 ‚2 {2 t2 m2 f2 _2 X2 Q2 J2 C2 <2 52 .2 '2  2 2 2  2 2 ý1 ö1 ï1 è1 á1 Ú1 Ó1 Ì1 Å1 ¾1 ·1 °1 ©1 ¢1 ›1 ”1 1 †1 1 x1 q1 j1 c1 \1 U1 N1 G1 @1 91 21 +1 $1 1 1 1 1 1 ú0 ó0 ì0 å0 Þ0 ×0 Ð0 É0 Â0 »0 ´0 ­0 ¦0 Ÿ0 ˜0 ‘0 Š0 ƒ0 |0 u0 n0 g0 `0 Y0 R0 K0 D0 =0 60 /0 (0 !0 0 0  0 0 þ/ ÷/ ð/ é/ â/ Û/ Ô/ Í/ Æ/ ¿/ ¸/ ±/ ª/ £/ œ/ •/ Ž/ ‡/ €/ y/ r/ k/ d/ ]/ V/ O/ H/ A/ :/ 3/ ,/ %/ / / /  / / û. ô. í. æ. ß. Ø. Ñ. Ê. Ã. ¼. µ. ®. §.  . ™. ’. ‹. „. }. v. o. h. a. Z. S. L. E. >. 7. 0. ). ". . .  . . ÿ- ø- ñ- ê- ã- Ü- Õ- Î- Ç- À- ¹- ²- «- ¤- - –- - ˆ- - z- s- l- e- ^- W- P- I- B- ;- 4- -- &- - - -  - - ü, õ, î, ç, à, Ù, Ò, Ë, Ä, ½, ¶, ¯, ¨, ¡, š, “, Œ, …, ~, w, p, i, b, [, T, M, F, ?, 8, 1, *, #, , , , , , ù+ ò+ ë+ ä+ Ý+ Ö+ Ï+ È+ Á+ º+ ³+ ¬+ ¥+ ž+ —+ + ‰+ ‚+ {+ t+ m+ f+ _+ X+ Q+ J+ C+ <+ 5+ .+ '+  + + +  + + ý* ö* ï* è* á* Ú* Ó* Ì* Å* ¾* ·* °* ©* ¢* ›* ”* * †* * x* q* j* c* \* U* N* G* @* 9* 2* +* $* * * * * * ú) ó) ì) å) Þ) ×) Ð) É) Â) ») ´) ­) ¦) Ÿ) ˜) ‘) Š) ƒ) |) u) n) g) `) Y) R) K) D) =) 6) /) () !) ) )  ) ) þ( ÷( ð( é( â( Û( Ô( Í( Æ( ¿( ¸( ±( ª( £( œ( •( Ž( ‡( €( y( r( k( d( ]( V( O( H( A( :( 3( ,( %( ( ( (  ( ( û' ô' í' æ' ß' Ø' Ñ' Ê' Ã' ¼' µ' ®' §'  ' ™' ’' ‹' „' }' v' o' h' a' Z' S' L' E' >' 7' 0' )' "' ' '  ' ' ÿ& ø& ñ& ê& ã& Ü& Õ& Î& Ç& À& ¹& ²& «& ¤& & –& & ˆ& & z& s& l& e& ^& W& P& I& B& ;& 4& -& && & & &  & & ü% õ% î% ç% à% Ù% Ò% Ë% Ä% ½% ¶% ¯% ¨% ¡% š% “% Œ% …% ~% w% p% i% b% [% T% M% F% ?% 8% 1% *% #% % % % % % ù$ ò$ ë$ ä$ Ý$ Ö$ Ï$ È$ Á$ º$ ³$ ¬$ ¥$ ž$ —$ $ ‰$ ‚$ {$ t$ m$ f$ _$ X$ Q$ J$ C$ <$ 5$ .$ '$  $ $ $  $ $ ý# ö# ï# è# á# Ú# Ó# Ì# Å# ¾# ·# °# ©# ¢# ›# ”# # †# # x# q# j# c# \# U# N# G# @# 9# 2# +# $# # # # # # ú" ó" ì" å" Þ" ×" Ð" É" Â" »" ´" ­" ¦" Ÿ" ˜" ‘" Š" ƒ" |" u" n" g" `" Y" R" K" D" =" 6" /" (" !" " "  " " þ! ÷! ð! é! â! Û! Ô! Í! Æ! ¿! ¸! ±! ª! £! œ! •! Ž! ‡! €! y! r! k! d! ]! V! O! H! A! :! 3! ,! %! ! ! !  ! ! û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û»ô»í»æ»ß»Ø»Ñ»Ê»û¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿºøºñºêºãºܺÕºκǺÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû´ô´í´æ´ß´Ø´Ñ´Ê´ô¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ³ø³ñ³ê³ã³ܳÕ³γdzÀ³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü²õ²î²ç²à²Ù²Ò²˲IJ½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û­ô­í­æ­ß­Ø­Ñ­Ê­í¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ¬ø¬ñ¬ê¬ã¬ܬÕ¬άǬÀ¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û¦ô¦í¦æ¦ߦئѦʦ漦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŸôŸíŸæŸߟØŸÑŸÊŸß¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿžøžñžêžãžÜžÕžΞÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››úšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û˜ô˜í˜æ˜ߘؘјʘؼ˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ—ø—ñ—ê—ã—Ü—Õ—ΗÇ—À—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŠôŠíŠæŠߊØŠÑŠÊŠÊ¼ŠµŠ®Š§Š Š™Š’Š‹Š„Š}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿ‰ø‰ñ‰ê‰ã‰܉Õ‰ΉljÀ‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰üˆõˆîˆçˆàˆÙˆÒˆˈĈ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûƒôƒíƒæƒ߃؃уʃüƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂Ç‚À‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{üzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCyu7u0u)u"uuu uuÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøû÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××úÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÆôÆíÆæÆ߯ØÆÑÆÊÆÃÆ¼ÆµÆ®Æ§Æ Æ™Æ’ƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀû¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿ÿ¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¾ø¾ñ¾ê¾ã¾ܾÕ¾ξǾÀ¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù¼ò¼ë¼ä¼ݼÖ¼ϼȼÁ¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»úºóºìºåºÞº׺кɺº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþ¹÷¹ð¹é¹â¹Û¹Ô¹͹ƹ¿¹¸¹±¹ª¹£¹œ¹•¹޹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¸ô¸í¸æ¸߸ظѸʸø¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ·ø·ñ·ê·ã·Ü·Õ·ηÇ·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ùµòµëµäµݵÖµϵȵÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú³ó³ì³å³Þ³׳гɳ³»³´³­³¦³Ÿ³˜³‘³гƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ²÷²ð²é²â²Û²Ô²ͲƲ¿²¸²±²ª²£²œ²•²޲‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û±ô±í±æ±ß±رѱʱñ¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ°ø°ñ°ê°ã°ܰÕ°ΰǰÀ°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú¬ó¬ì¬å¬Þ¬׬Ьɬ¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Ьƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««ûªôªíªæªߪتѪʪ꼪µª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿ©ø©ñ©ê©ã©Ü©Õ©ΩÇ©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù§ò§ë§ä§ݧÖ§ϧȧÁ§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý¦ö¦ï¦è¦á¦Ú¦Ó¦̦Ŧ¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¤÷¤ð¤é¤â¤Û¤Ô¤ͤƤ¿¤¸¤±¤ª¤£¤œ¤•¤ޤ‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û£ô£í£æ£ߣأѣʣ㼣µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢΢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúžóžìžåžÞžמОÉžž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûœôœíœæœßœØœÑœÊœÜ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿ›ø›ñ›ê›ã›Ü›Õ›ΛÇ›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››üšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý˜ö˜ï˜è˜á˜Ú˜Ó˜̘Ř¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú—ó—ì—å—Þ—×—ЗÉ——»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û•ô•í•æ•ߕؕѕʕռ•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ”ø”ñ”ê”ã”ܔՔΔÇ”À”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŽôŽíŽæŽߎØŽÑŽÊŽÃŽ¼ŽµŽ®Ž§Ž Ž™Ž’ދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠú‰ó‰ì‰å‰Þ‰׉Љɉ‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Љƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þˆ÷ˆðˆéˆâˆÛˆÔˆ͈ƈ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆû‡ô‡í‡æ‡߇؇чʇǼ‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ†ø†ñ†ê†ã†܆Õ†ΆdžÀ†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ýƒöƒïƒèƒáƒÚƒÓƒ̃Ѿƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒú‚ó‚ì‚å‚Þ‚ׂЂÉ‚‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û€ô€í€æ€߀؀рʀÀ¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCok7k0k)k"kkk kkÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhChd7d0d)d"ddd ddÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa]7]0])]"]]] ]]ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCSO7O0O)O"OOO OOÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECEA7A0A)A"AAA AAÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷úöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûØôØíØæØߨØØÑØÊØÃØ¼ØµØ®Ø§Ø Ø™Ø’؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××üÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ½÷½ð½é½â½Û½Ô½ͽƽ¿½¸½±½ª½£½œ½•½޽‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û¼ô¼í¼æ¼ß¼ؼѼʼü¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ»ø»ñ»ê»ã»Ü»Õ»λÇ»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»üºõºîºçºàºÙºÒº˺ĺ½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººù¹ò¹ë¹ä¹ݹÖ¹ϹȹÁ¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¸ö¸ï¸è¸á¸Ú¸Ó¸̸Ÿ¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ¶÷¶ð¶é¶â¶Û¶Ô¶Ͷƶ¿¶¸¶±¶ª¶£¶œ¶•¶޶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶ûµôµíµæµßµصѵʵõ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿ´ø´ñ´ê´ã´Ü´Õ´δÇ´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü³õ³î³ç³à³Ù³Ò³˳ij½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù²ò²ë²ä²ݲÖ²ϲȲÁ²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý±ö±ï±è±á±Ú±Ó±̱ű¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ¯÷¯ð¯é¯â¯Û¯Ô¯ͯƯ¿¯¸¯±¯ª¯£¯œ¯•¯ޝ‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û®ô®í®æ®ß®Ø®Ñ®Ê®î¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ­ø­ñ­ê­ã­Ü­Õ­έÇ­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü¬õ¬î¬ç¬à¬Ù¬Ò¬ˬĬ½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ýªöªïªèªáªÚªÓª̪Ū¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ¨÷¨ð¨é¨â¨Û¨Ô¨ͨƨ¿¨¸¨±¨ª¨£¨œ¨•¨ލ‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û§ô§í§æ§ß§اѧʧç¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ¦ø¦ñ¦ê¦ã¦ܦÕ¦ΦǦÀ¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¤ò¤ë¤ä¤ݤÖ¤ϤȤÁ¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û ô í æ ß Ø Ñ Ê à¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿŸøŸñŸêŸãŸÜŸÕŸΟÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššû™ô™í™æ™ß™Ø™Ñ™Ê™Ù¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ˜ø˜ñ˜ê˜ã˜ܘÕ˜ΘǘÀ˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑÇ‘À‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒû‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ë¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿŠøŠñŠêŠãŠÜŠÕŠΊÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠü‰õ‰î‰ç‰à‰Ù‰Ò‰ˉĉ½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ùˆòˆëˆäˆ݈ÖˆψȈÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆý‡ö‡ï‡è‡á‡Ú‡Ó‡̇Ň¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿƒøƒñƒêƒãƒ܃Õƒ΃ǃÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCso7o0o)o"ooo ooÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCea7a0a)a"aaa aaÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICIE7E0E)E"EEE EEÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCBô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¾õ¾î¾ç¾à¾Ù¾Ò¾˾ľ½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù½ò½ë½ä½ݽÖ½ϽȽÁ½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý¼ö¼ï¼è¼á¼Ú¼Ó¼̼ż¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú»ó»ì»å»Þ»×»лÉ»»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þº÷ºðºéºâºÛºÔºͺƺ¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººû¹ô¹í¹æ¹ß¹عѹʹù¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù¶ò¶ë¶ä¶ݶÖ¶϶ȶÁ¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ýµöµïµèµáµÚµÓµ̵ŵ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµú´ó´ì´å´Þ´×´дÉ´´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ³÷³ð³é³â³Û³Ô³ͳƳ¿³¸³±³ª³£³œ³•³޳‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û²ô²í²æ²ß²زѲʲò¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü°õ°î°ç°à°Ù°Ò°˰ݽ°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù¯ò¯ë¯ä¯ݯÖ¯ϯȯÁ¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú­ó­ì­å­Þ­×­ЭÉ­­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ¬÷¬ð¬é¬â¬Û¬Ô¬ͬƬ¿¬¸¬±¬ª¬£¬œ¬•¬ެ‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û«ô«í«æ«ß«Ø«Ñ«Ê«ë¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù¨ò¨ë¨ä¨ݨÖ¨ϨȨÁ¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý§ö§ï§è§á§Ú§Ó§̧ŧ¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú¦ó¦ì¦å¦Þ¦צЦɦ¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Цƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¤ô¤í¤æ¤ߤؤѤʤ伤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úŸóŸìŸåŸÞŸןПÉŸŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú˜ó˜ì˜å˜Þ˜טИɘ˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û–ô–í–æ–ß–Ø–Ñ–Ê–Ö¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú‘ó‘ì‘å‘Þ‘בБÉ‘‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹úŠóŠìŠåŠÞŠ׊ЊÉŠŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþ‰÷‰ð‰é‰â‰Û‰Ô‰͉Ɖ¿‰¸‰±‰ª‰£‰œ‰•‰މ‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰ûˆôˆíˆæˆ߈؈шʈȼˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü†õ†î†ç†à†Ù†Ò†ˆĆ½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„úƒóƒìƒåƒÞƒ׃ЃɃƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{ûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCws7s0s)s"sss ssÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCpl7l0l)l"lll llÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCie7e0e)e"eee eeÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCMI7I0I)I"III IIÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúæóæìæåæÞæ׿ÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúØóØìØåØÞØרÐØÉØÂØ»Ø´Ø­Ø¦ØŸØ˜Ø‘؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××ûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¾ò¾ë¾ä¾ݾÖ¾ϾȾÁ¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý½ö½ï½è½á½Ú½Ó½̽޾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú¼ó¼ì¼å¼Þ¼×¼мɼ¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼мƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»ûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿ¹ø¹ñ¹ê¹ã¹ܹÕ¹ιǹÀ¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¸õ¸î¸ç¸à¸Ù¸Ò¸˸ĸ½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý¶ö¶ï¶è¶á¶Ú¶Ó¶̶Ŷ¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶úµóµìµåµÞµ×µеɵµ»µ´µ­µ¦µŸµ˜µ‘µеƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ²ø²ñ²ê²ã²ܲÕ²βDzÀ²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü±õ±î±ç±à±Ù±Ò±˱ı½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù°ò°ë°ä°ݰÖ°ϰȰÁ°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý¯ö¯ï¯è¯á¯Ú¯Ó¯̯ů¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú®ó®ì®å®Þ®×®ЮÉ®®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ«ø«ñ«ê«ã«Ü«Õ«ΫÇ«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««üªõªîªçªàªÙªÒª˪νª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý¨ö¨ï¨è¨á¨Ú¨Ó¨̨Ũ¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú§ó§ì§å§Þ§×§Чɧ§»§´§­§¦§Ÿ§˜§‘§Чƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ¦÷¦ð¦é¦â¦Û¦Ô¦ͦƦ¿¦¸¦±¦ª¦£¦œ¦•¦ަ‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¤ø¤ñ¤ê¤ã¤ܤÕ¤ΤǤÀ¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú ó ì å Þ × РÉ  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššú™ó™ì™å™Þ™×™ЙÉ™™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ˜÷˜ð˜é˜â˜Û˜Ô˜͘Ƙ¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ–ø–ñ–ê–ã–Ü–Õ–ΖÇ–À–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒú‹ó‹ì‹å‹Þ‹׋ЋÉ‹‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠû‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿˆøˆñˆêˆãˆ܈ÕˆΈLjÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆü‡õ‡î‡ç‡à‡Ù‡Ò‡ˇć½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù†ò†ë†ä†݆Ö†φȆÁ†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú„ó„ì„å„Þ„ׄЄÉ„„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þƒ÷ƒðƒéƒâƒÛƒÔƒ̓ƃ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒû‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc_7_0_)_"___ __ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[úZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û»ô»í»æ»ß»Ø»Ñ»Ê»û¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿºøºñºêºãºܺÕºκǺÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû´ô´í´æ´ß´Ø´Ñ´Ê´ô¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ³ø³ñ³ê³ã³ܳÕ³γdzÀ³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü²õ²î²ç²à²Ù²Ò²˲IJ½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û­ô­í­æ­ß­Ø­Ñ­Ê­í¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ¬ø¬ñ¬ê¬ã¬ܬÕ¬άǬÀ¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û¦ô¦í¦æ¦ߦئѦʦ漦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŸôŸíŸæŸߟØŸÑŸÊŸß¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿžøžñžêžãžÜžÕžΞÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››úšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û˜ô˜í˜æ˜ߘؘјʘؼ˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ—ø—ñ—ê—ã—Ü—Õ—ΗÇ—À—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŠôŠíŠæŠߊØŠÑŠÊŠÊ¼ŠµŠ®Š§Š Š™Š’Š‹Š„Š}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿ‰ø‰ñ‰ê‰ã‰܉Õ‰ΉljÀ‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰üˆõˆîˆçˆàˆÙˆÒˆˈĈ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûƒôƒíƒæƒ߃؃уʃüƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂Ç‚À‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{üzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCyu7u0u)u"uuu uuÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! mongo-c-driver-2.2.1/src/libbson/tests/binary/stream.bson000066400000000000000000000116101511661753600234010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/binary/stream_corrupt.bson000066400000000000000000000116111511661753600251600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/binary/test1.bson000066400000000000000000000000161511661753600231440ustar00rootroot00000000000000intmongo-c-driver-2.2.1/src/libbson/tests/binary/test10.bson000066400000000000000000000000231511661753600232220ustar00rootroot00000000000000 regex1234imongo-c-driver-2.2.1/src/libbson/tests/binary/test11.bson000066400000000000000000000000261511661753600232260ustar00rootroot00000000000000helloworldmongo-c-driver-2.2.1/src/libbson/tests/binary/test12.bson000066400000000000000000000000611511661753600232260ustar00rootroot000000000000001BSON&0awesome1333333@2Âmongo-c-driver-2.2.1/src/libbson/tests/binary/test13.bson000066400000000000000000000000431511661753600232270ustar00rootroot00000000000000#array[bool]012mongo-c-driver-2.2.1/src/libbson/tests/binary/test14.bson000066400000000000000000000000631511661753600232320ustar00rootroot000000000000003array[string]0hello1worldmongo-c-driver-2.2.1/src/libbson/tests/binary/test15.bson000066400000000000000000000000611511661753600232310ustar00rootroot000000000000001array[datetime] 0 1 ˜Œ+3mongo-c-driver-2.2.1/src/libbson/tests/binary/test16.bson000066400000000000000000000000401511661753600232270ustar00rootroot00000000000000 array[null] 0 1 2mongo-c-driver-2.2.1/src/libbson/tests/binary/test17.bson000066400000000000000000000003271511661753600232400ustar00rootroot00000000000000×_id#Edocumentw_id#Etags)01122334text asdfanothersourcenameblahtype0sourcemissing0server_created_atmongo-c-driver-2.2.1/src/libbson/tests/binary/test18.bson000066400000000000000000000000141511661753600232320ustar00rootroot00000000000000 hellomongo-c-driver-2.2.1/src/libbson/tests/binary/test19.bson000066400000000000000000000000141511661753600232330ustar00rootroot00000000000000 boolmongo-c-driver-2.2.1/src/libbson/tests/binary/test2.bson000066400000000000000000000000241511661753600231440ustar00rootroot00000000000000int64mongo-c-driver-2.2.1/src/libbson/tests/binary/test20.bson000066400000000000000000000000251511661753600232250ustar00rootroot00000000000000doubleS£’:Ý^@mongo-c-driver-2.2.1/src/libbson/tests/binary/test21.bson000066400000000000000000000000241511661753600232250ustar00rootroot00000000000000documentmongo-c-driver-2.2.1/src/libbson/tests/binary/test22.bson000066400000000000000000000000261511661753600232300ustar00rootroot00000000000000oid4Vx«Íï4«Ímongo-c-driver-2.2.1/src/libbson/tests/binary/test23.bson000066400000000000000000000000531511661753600232310ustar00rootroot00000000000000+array0hello1worldmongo-c-driver-2.2.1/src/libbson/tests/binary/test24.bson000066400000000000000000000000261511661753600232320ustar00rootroot00000000000000binary€1234mongo-c-driver-2.2.1/src/libbson/tests/binary/test25.bson000066400000000000000000000000201511661753600232250ustar00rootroot00000000000000undefinedmongo-c-driver-2.2.1/src/libbson/tests/binary/test26.bson000066400000000000000000000000251511661753600232330ustar00rootroot00000000000000 time_tPûqmongo-c-driver-2.2.1/src/libbson/tests/binary/test27.bson000066400000000000000000000000261511661753600232350ustar00rootroot00000000000000 regex^abcdilxmongo-c-driver-2.2.1/src/libbson/tests/binary/test28.bson000066400000000000000000000000441511661753600232360ustar00rootroot00000000000000$ dbpointerfoo#«Í#«Í#«Ímongo-c-driver-2.2.1/src/libbson/tests/binary/test29.bson000066400000000000000000000000331511661753600232350ustar00rootroot00000000000000 code var a = {};mongo-c-driver-2.2.1/src/libbson/tests/binary/test3.bson000066400000000000000000000000251511661753600231460ustar00rootroot00000000000000double+‡ÙÎ÷ñ?mongo-c-driver-2.2.1/src/libbson/tests/binary/test30.bson000066400000000000000000000000331511661753600232250ustar00rootroot00000000000000 code var a = {};mongo-c-driver-2.2.1/src/libbson/tests/binary/test31.bson000066400000000000000000000000611511661753600232270ustar00rootroot000000000000001code& var a = {};foobarmongo-c-driver-2.2.1/src/libbson/tests/binary/test32.bson000066400000000000000000000000261511661753600232310ustar00rootroot00000000000000helloworldmongo-c-driver-2.2.1/src/libbson/tests/binary/test33.bson000066400000000000000000000000321511661753600232270ustar00rootroot00000000000000a…ÿÿÿcb{mongo-c-driver-2.2.1/src/libbson/tests/binary/test34.bson000066400000000000000000000000201511661753600232250ustar00rootroot00000000000000a@zóZmongo-c-driver-2.2.1/src/libbson/tests/binary/test35.bson000066400000000000000000000000301511661753600232270ustar00rootroot00000000000000timestamp”&Òmongo-c-driver-2.2.1/src/libbson/tests/binary/test36.bson000066400000000000000000000000151511661753600232330ustar00rootroot00000000000000 ÿminkeymongo-c-driver-2.2.1/src/libbson/tests/binary/test37.bson000066400000000000000000000000151511661753600232340ustar00rootroot00000000000000 maxkeymongo-c-driver-2.2.1/src/libbson/tests/binary/test38.bson000066400000000000000000000014451511661753600232450ustar00rootroot00000000000000%aaa aaýaõaíaåaÝaÕaÍaÅa½aµa­a¥aa•aa…a}auamaea]aUaMaEa=a5a-a%aaa aaýaõaíaåaÝaÕaÍaÅa½aµa­a¥aa•aa…a}auamaea]aUaMaEa=a5a-a%aaa aaýaõaíaåaÝaÕaÍaÅa½aµa­a¥aa•aa…a}auamaea]aUaMaEa=a5a-a%aaa amongo-c-driver-2.2.1/src/libbson/tests/binary/test39.bson000066400000000000000000000014541511661753600232460ustar00rootroot00000000000000,b$bbb bbübôbìbäbÜbÔbÌbÄb¼b´b¬b¤bœb”bŒb„b|btblbdb\bTbLbDb<b4b,b$bbb bbübôbìbäbÜbÔbÌbÄb¼b´b¬b¤bœb”bŒb„b|btblbdb\bTbLbDb<b4b,b$bbb bbübôbìbäbÜbÔbÌbÄb¼b´b¬b¤bœb”bŒb„b|btblbdb\bTbLbDb<b4b,b$bbb bÒmongo-c-driver-2.2.1/src/libbson/tests/binary/test4.bson000066400000000000000000000000221511661753600231440ustar00rootroot00000000000000 utc ˜Œ+3mongo-c-driver-2.2.1/src/libbson/tests/binary/test40.bson000066400000000000000000000000141511661753600232250ustar00rootroot00000000000000 mongo-c-driver-2.2.1/src/libbson/tests/binary/test41.bson000066400000000000000000000000221511661753600232250ustar00rootroot00000000000000ÿÿÿÿfoobarmongo-c-driver-2.2.1/src/libbson/tests/binary/test42.bson000066400000000000000000000000141511661753600232270ustar00rootroot00000000000000 mongo-c-driver-2.2.1/src/libbson/tests/binary/test43.bson000066400000000000000000000000221511661753600232270ustar00rootroot00000000000000ÿÿÿÿfoobarmongo-c-driver-2.2.1/src/libbson/tests/binary/test44.bson000066400000000000000000000000301511661753600232270ustar00rootroot00000000000000 RYµjú[ØAÖX]™mongo-c-driver-2.2.1/src/libbson/tests/binary/test45.bson000066400000000000000000000000361511661753600232360ustar00rootroot00000000000000 ÿÿÿÿfoobarRYµjú[ØAÖX]™mongo-c-driver-2.2.1/src/libbson/tests/binary/test46.bson000066400000000000000000000000141511661753600232330ustar00rootroot00000000000000 mongo-c-driver-2.2.1/src/libbson/tests/binary/test47.bson000066400000000000000000000000141511661753600232340ustar00rootroot00000000000000 ÿÿÿÿmongo-c-driver-2.2.1/src/libbson/tests/binary/test48.bson000066400000000000000000000000341511661753600232370ustar00rootroot00000000000000 mongo-c-driver-2.2.1/src/libbson/tests/binary/test49.bson000066400000000000000000000000341511661753600232400ustar00rootroot00000000000000ÿÿÿÿ mongo-c-driver-2.2.1/src/libbson/tests/binary/test5.bson000066400000000000000000000000351511661753600231510ustar00rootroot00000000000000string some stringmongo-c-driver-2.2.1/src/libbson/tests/binary/test50.bson000066400000000000000000000000341511661753600232300ustar00rootroot00000000000000 mongo-c-driver-2.2.1/src/libbson/tests/binary/test51.bson000066400000000000000000000000341511661753600232310ustar00rootroot00000000000000 ÿÿÿÿmongo-c-driver-2.2.1/src/libbson/tests/binary/test52.bson000066400000000000000000000000301511661753600232260ustar00rootroot00000000000000foo÷ÿÿÿbar!ÿÿmongo-c-driver-2.2.1/src/libbson/tests/binary/test53.bson000066400000000000000000000000361511661753600232350ustar00rootroot00000000000000 îÿÿÿfoobarRYµjú[ØAÖX]™mongo-c-driver-2.2.1/src/libbson/tests/binary/test54.bson000066400000000000000000000000261511661753600232350ustar00rootroot00000000000000binaryóÿÿÿ€1234mongo-c-driver-2.2.1/src/libbson/tests/binary/test55.bson000066400000000000000000000000301511661753600232310ustar00rootroot00000000000000ÿÿbarÿÿÿmongo-c-driver-2.2.1/src/libbson/tests/binary/test56.bson000066400000000000000000000000521511661753600232360ustar00rootroot00000000000000*€€€€€"‚¬â‚¬â‚¬â‚¬â‚¬mongo-c-driver-2.2.1/src/libbson/tests/binary/test57.bson000066400000000000000000000000321511661753600232350ustar00rootroot00000000000000binary1234mongo-c-driver-2.2.1/src/libbson/tests/binary/test58.bson000066400000000000000000000000301511661753600232340ustar00rootroot00000000000000amongo-c-driver-2.2.1/src/libbson/tests/binary/test59.bson000066400000000000000000000000211511661753600232350ustar00rootroot00000000000000.mongo-c-driver-2.2.1/src/libbson/tests/binary/test6.bson000066400000000000000000000001001511661753600231430ustar00rootroot00000000000000@array[int]/012345mongo-c-driver-2.2.1/src/libbson/tests/binary/test60.bson000066400000000000000000000000171511661753600232320ustar00rootroot00000000000000testmongo-c-driver-2.2.1/src/libbson/tests/binary/test7.bson000066400000000000000000000000571511661753600231570ustar00rootroot00000000000000/array[double]0+‡ÙÎ÷ñ?1–C‹lçû@mongo-c-driver-2.2.1/src/libbson/tests/binary/test8.bson000066400000000000000000000000351511661753600231540ustar00rootroot00000000000000documentintmongo-c-driver-2.2.1/src/libbson/tests/binary/test9.bson000066400000000000000000000000131511661753600231510ustar00rootroot00000000000000 nullmongo-c-driver-2.2.1/src/libbson/tests/binary/trailingnull.bson000066400000000000000000000000201511661753600246030ustar00rootroot00000000000000aabcÿmongo-c-driver-2.2.1/src/libbson/tests/corpus-test.c000066400000000000000000000127131511661753600224000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./corpus-test.h" #include #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif void corpus_test_print_description(const char *description) { if (test_suite_debug_output()) { printf(" - %s\n", description); fflush(stdout); } } uint8_t * corpus_test_unhexlify(bson_iter_t *iter, uint32_t *bson_str_len) { const char *hex_str; uint8_t *data = NULL; unsigned int byte; uint32_t tmp; int x = 0; int i = 0; ASSERT(BSON_ITER_HOLDS_UTF8(iter)); hex_str = bson_iter_utf8(iter, &tmp); *bson_str_len = tmp / 2; data = bson_malloc(*bson_str_len); while (SSCANF(&hex_str[i], "%2x", &byte) == 1) { data[x++] = (uint8_t)byte; i += 2; } return data; } void corpus_test(bson_t *scenario, test_bson_valid_cb valid, test_bson_decode_error_cb decode_error, test_bson_parse_error_cb parse_error) { bson_iter_t iter; bson_iter_t inner_iter; const char *scenario_description = NULL; bson_type_t bson_type; BSON_ASSERT(scenario); BSON_ASSERT(bson_iter_init_find(&iter, scenario, "description")); scenario_description = bson_iter_utf8(&iter, NULL); BSON_ASSERT(bson_iter_init_find(&iter, scenario, "bson_type")); /* like "0x0C */ if (sscanf(bson_iter_utf8(&iter, NULL), "%i", (int *)&bson_type) != 1) { fprintf(stderr, "Couldn't parse bson_type %s\n", bson_iter_utf8(&iter, NULL)); abort(); } /* test valid BSON and Extended JSON */ if (bson_iter_init_find(&iter, scenario, "valid")) { BSON_ASSERT(bson_iter_recurse(&iter, &inner_iter)); while (bson_iter_next(&inner_iter)) { bson_iter_t test_iter; test_bson_valid_type_t test = {scenario_description, bson_type, NULL}; BSON_ASSERT(bson_iter_recurse(&inner_iter, &test_iter)); while (bson_iter_next(&test_iter)) { const char *key = bson_iter_key(&test_iter); if (!strcmp(key, "description")) { test.test_description = bson_iter_utf8(&test_iter, NULL); corpus_test_print_description(test.test_description); } if (!strcmp(key, "canonical_bson")) { test.cB = corpus_test_unhexlify(&test_iter, &test.cB_len); } if (!strcmp(key, "degenerate_bson")) { test.dB = corpus_test_unhexlify(&test_iter, &test.dB_len); } if (!strcmp(key, "canonical_extjson")) { test.cE = bson_iter_utf8(&test_iter, NULL); } if (!strcmp(key, "degenerate_extjson")) { test.dE = bson_iter_utf8(&test_iter, NULL); } if (!strcmp(key, "relaxed_extjson")) { test.rE = bson_iter_utf8(&test_iter, NULL); } if (!strcmp(key, "lossy")) { test.lossy = bson_iter_bool(&test_iter); } } /* execute the test callback */ valid(&test); bson_free(test.cB); bson_free(test.dB); } } /* test decoding errors (i.e. invalid BSON) */ if (bson_iter_init_find(&iter, scenario, "decodeErrors")) { BSON_ASSERT(bson_iter_recurse(&iter, &inner_iter)); while (bson_iter_next(&inner_iter)) { bson_iter_t test_iter; test_bson_decode_error_type_t test = {scenario_description, bson_type, NULL}; BSON_ASSERT(bson_iter_recurse(&inner_iter, &test_iter)); while (bson_iter_next(&test_iter)) { if (!strcmp(bson_iter_key(&test_iter), "description")) { test.test_description = bson_iter_utf8(&test_iter, NULL); corpus_test_print_description(test.test_description); } if (!strcmp(bson_iter_key(&test_iter), "bson")) { test.bson = corpus_test_unhexlify(&test_iter, &test.bson_len); } } /* execute the test callback */ decode_error(&test); bson_free(test.bson); } } /* test parsing errors (e.g. invalid JSON or Decimal128 strings) */ if (bson_iter_init_find(&iter, scenario, "parseErrors")) { BSON_ASSERT(bson_iter_recurse(&iter, &inner_iter)); while (bson_iter_next(&inner_iter)) { bson_iter_t test_iter; test_bson_parse_error_type_t test = {scenario_description, bson_type, NULL}; BSON_ASSERT(bson_iter_recurse(&inner_iter, &test_iter)); while (bson_iter_next(&test_iter)) { if (!strcmp(bson_iter_key(&test_iter), "description")) { test.test_description = bson_iter_utf8(&test_iter, NULL); corpus_test_print_description(test.test_description); } if (!strcmp(bson_iter_key(&test_iter), "string")) { test.str = bson_iter_utf8(&test_iter, &test.str_len); } } /* execute the test callback */ parse_error(&test); } } } mongo-c-driver-2.2.1/src/libbson/tests/corpus-test.h000066400000000000000000000046251511661753600224100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef CORPUS_TEST_H #define CORPUS_TEST_H #include #include /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-validity */ typedef struct _test_bson_valid_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; uint8_t *cB; /* "canonical_bson" */ uint32_t cB_len; uint8_t *dB; /* "degenerate_bson" */ uint32_t dB_len; const char *cE; /* "canonical_extjson" */ const char *rE; /* "relaxed_extjson" */ const char *dE; /* "degenerate_extjson" */ bool lossy; } test_bson_valid_type_t; /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-decode-errors */ typedef struct _test_bson_decode_error_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; uint8_t *bson; uint32_t bson_len; } test_bson_decode_error_type_t; /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-parsing-errors */ typedef struct _test_bson_parse_error_type_t { const char *scenario_description; bson_type_t bson_type; const char *test_description; const char *str; uint32_t str_len; } test_bson_parse_error_type_t; typedef void (*test_bson_valid_cb)(test_bson_valid_type_t *test); typedef void (*test_bson_decode_error_cb)(test_bson_decode_error_type_t *test); typedef void (*test_bson_parse_error_cb)(test_bson_parse_error_type_t *test); void corpus_test_print_description(const char *description); uint8_t * corpus_test_unhexlify(bson_iter_t *iter, uint32_t *bson_str_len); void corpus_test(bson_t *scenario, test_bson_valid_cb valid, test_bson_decode_error_cb decode_error, test_bson_parse_error_cb parse_error); #endif mongo-c-driver-2.2.1/src/libbson/tests/json/000077500000000000000000000000001511661753600207115ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/json/bson_binary_vector/000077500000000000000000000000001511661753600246005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/json/bson_binary_vector/float32.json000066400000000000000000000037501511661753600267520ustar00rootroot00000000000000{ "description": "Tests of Binary subtype 9, Vectors, with dtype FLOAT32", "test_key": "vector", "tests": [ { "description": "Simple Vector FLOAT32", "valid": true, "vector": [127.0, 7.0], "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "padding": 0, "canonical_bson": "1C00000005766563746F72000A0000000927000000FE420000E04000" }, { "description": "Vector with decimals and negative value FLOAT32", "valid": true, "vector": [127.7, -7.7], "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "padding": 0, "canonical_bson": "1C00000005766563746F72000A0000000927006666FF426666F6C000" }, { "description": "Empty Vector FLOAT32", "valid": true, "vector": [], "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "padding": 0, "canonical_bson": "1400000005766563746F72000200000009270000" }, { "description": "Infinity Vector FLOAT32", "valid": true, "vector": [{"$numberDouble": "-Infinity"}, 0.0, {"$numberDouble": "Infinity"} ], "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "padding": 0, "canonical_bson": "2000000005766563746F72000E000000092700000080FF000000000000807F00" }, { "description": "FLOAT32 with padding", "valid": false, "vector": [127.0, 7.0], "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "padding": 3, "canonical_bson": "1C00000005766563746F72000A0000000927030000FE420000E04000" }, { "description": "Insufficient vector data with 3 bytes FLOAT32", "valid": false, "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "canonical_bson": "1700000005766563746F7200050000000927002A2A2A00" }, { "description": "Insufficient vector data with 5 bytes FLOAT32", "valid": false, "dtype_hex": "0x27", "dtype_alias": "FLOAT32", "canonical_bson": "1900000005766563746F7200070000000927002A2A2A2A2A00" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_binary_vector/int8.json000066400000000000000000000025721511661753600263630ustar00rootroot00000000000000{ "description": "Tests of Binary subtype 9, Vectors, with dtype INT8", "test_key": "vector", "tests": [ { "description": "Simple Vector INT8", "valid": true, "vector": [127, 7], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 0, "canonical_bson": "1600000005766563746F7200040000000903007F0700" }, { "description": "Empty Vector INT8", "valid": true, "vector": [], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 0, "canonical_bson": "1400000005766563746F72000200000009030000" }, { "description": "Overflow Vector INT8", "valid": false, "vector": [128], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 0 }, { "description": "Underflow Vector INT8", "valid": false, "vector": [-129], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 0 }, { "description": "INT8 with padding", "valid": false, "vector": [127, 7], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 3, "canonical_bson": "1600000005766563746F7200040000000903037F0700" }, { "description": "INT8 with float inputs", "valid": false, "vector": [127.77, 7.77], "dtype_hex": "0x03", "dtype_alias": "INT8", "padding": 0 } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_binary_vector/packed_bit.json000066400000000000000000000046671511661753600275750ustar00rootroot00000000000000{ "description": "Tests of Binary subtype 9, Vectors, with dtype PACKED_BIT", "test_key": "vector", "tests": [ { "description": "Padding specified with no vector data PACKED_BIT", "valid": false, "vector": [], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 1, "canonical_bson": "1400000005766563746F72000200000009100100" }, { "description": "Simple Vector PACKED_BIT", "valid": true, "vector": [127, 7], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 0, "canonical_bson": "1600000005766563746F7200040000000910007F0700" }, { "description": "PACKED_BIT with padding", "valid": true, "vector": [127, 8], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 3, "canonical_bson": "1600000005766563746F7200040000000910037F0800" }, { "description": "PACKED_BIT with inconsistent padding", "valid": false, "vector": [127, 7], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 3, "canonical_bson": "1600000005766563746F7200040000000910037F0700" }, { "description": "Empty Vector PACKED_BIT", "valid": true, "vector": [], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 0, "canonical_bson": "1400000005766563746F72000200000009100000" }, { "description": "Overflow Vector PACKED_BIT", "valid": false, "vector": [256], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 0 }, { "description": "Underflow Vector PACKED_BIT", "valid": false, "vector": [-1], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 0 }, { "description": "Vector with float values PACKED_BIT", "valid": false, "vector": [127.5], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 0 }, { "description": "Exceeding maximum padding PACKED_BIT", "valid": false, "vector": [1], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": 8, "canonical_bson": "1500000005766563746F7200030000000910080100" }, { "description": "Negative padding PACKED_BIT", "valid": false, "vector": [1], "dtype_hex": "0x10", "dtype_alias": "PACKED_BIT", "padding": -1 } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/000077500000000000000000000000001511661753600232455ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/array.json000066400000000000000000000037461511661753600252700ustar00rootroot00000000000000{ "description": "Array", "bson_type": "0x04", "test_key": "a", "valid": [ { "description": "Empty", "canonical_bson": "0D000000046100050000000000", "canonical_extjson": "{\"a\" : []}" }, { "description": "Single Element Array", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Single Element Array with index set incorrectly to empty string", "degenerate_bson": "130000000461000B00000010000A0000000000", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Single Element Array with index set incorrectly to ab", "degenerate_bson": "150000000461000D000000106162000A0000000000", "canonical_bson": "140000000461000C0000001030000A0000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}]}" }, { "description": "Multi Element Array with duplicate indexes", "degenerate_bson": "1b000000046100130000001030000a000000103000140000000000", "canonical_bson": "1b000000046100130000001030000a000000103100140000000000", "canonical_extjson": "{\"a\" : [{\"$numberInt\": \"10\"}, {\"$numberInt\": \"20\"}]}" } ], "decodeErrors": [ { "description": "Array length too long: eats outer terminator", "bson": "140000000461000D0000001030000A0000000000" }, { "description": "Array length too short: leaks terminator", "bson": "140000000461000B0000001030000A0000000000" }, { "description": "Invalid Array: bad string length in field", "bson": "1A00000004666F6F00100000000230000500000062617A000000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/binary.json000066400000000000000000000161271511661753600254330ustar00rootroot00000000000000{ "description": "Binary type", "bson_type": "0x05", "test_key": "x", "valid": [ { "description": "subtype 0x00 (Zero-length)", "canonical_bson": "0D000000057800000000000000", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"\", \"subType\" : \"00\"}}}" }, { "description": "subtype 0x00 (Zero-length, keys reversed)", "canonical_bson": "0D000000057800000000000000", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"\", \"subType\" : \"00\"}}}", "degenerate_extjson": "{\"x\" : { \"$binary\" : {\"subType\" : \"00\", \"base64\" : \"\"}}}" }, { "description": "subtype 0x00", "canonical_bson": "0F0000000578000200000000FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"00\"}}}" }, { "description": "subtype 0x01", "canonical_bson": "0F0000000578000200000001FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"01\"}}}" }, { "description": "subtype 0x02", "canonical_bson": "13000000057800060000000202000000FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"02\"}}}" }, { "description": "subtype 0x03", "canonical_bson": "1D000000057800100000000373FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"03\"}}}" }, { "description": "subtype 0x04", "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}" }, { "description": "subtype 0x04 UUID", "canonical_bson": "1D000000057800100000000473FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"04\"}}}", "degenerate_extjson": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}" }, { "description": "subtype 0x05", "canonical_bson": "1D000000057800100000000573FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"05\"}}}" }, { "description": "subtype 0x07", "canonical_bson": "1D000000057800100000000773FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"07\"}}}" }, { "description": "subtype 0x08", "canonical_bson": "1D000000057800100000000873FFD26444B34C6990E8E7D1DFC035D400", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"c//SZESzTGmQ6OfR38A11A==\", \"subType\" : \"08\"}}}" }, { "description": "subtype 0x80", "canonical_bson": "0F0000000578000200000080FFFF00", "canonical_extjson": "{\"x\" : { \"$binary\" : {\"base64\" : \"//8=\", \"subType\" : \"80\"}}}" }, { "description": "$type query operator (conflicts with legacy $binary form with $type field)", "canonical_bson": "1F000000037800170000000224747970650007000000737472696E67000000", "canonical_extjson": "{\"x\" : { \"$type\" : \"string\"}}" }, { "description": "$type query operator (conflicts with legacy $binary form with $type field)", "canonical_bson": "180000000378001000000010247479706500020000000000", "canonical_extjson": "{\"x\" : { \"$type\" : {\"$numberInt\": \"2\"}}}" }, { "description": "subtype 0x09 Vector FLOAT32", "canonical_bson": "170000000578000A0000000927000000FE420000E04000", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"JwAAAP5CAADgQA==\", \"subType\": \"09\"}}}" }, { "description": "subtype 0x09 Vector INT8", "canonical_bson": "11000000057800040000000903007F0700", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"AwB/Bw==\", \"subType\": \"09\"}}}" }, { "description": "subtype 0x09 Vector PACKED_BIT", "canonical_bson": "11000000057800040000000910007F0700", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"EAB/Bw==\", \"subType\": \"09\"}}}" }, { "description": "subtype 0x09 Vector (Zero-length) FLOAT32", "canonical_bson": "0F0000000578000200000009270000", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"JwA=\", \"subType\": \"09\"}}}" }, { "description": "subtype 0x09 Vector (Zero-length) INT8", "canonical_bson": "0F0000000578000200000009030000", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"AwA=\", \"subType\": \"09\"}}}" }, { "description": "subtype 0x09 Vector (Zero-length) PACKED_BIT", "canonical_bson": "0F0000000578000200000009100000", "canonical_extjson": "{\"x\": {\"$binary\": {\"base64\": \"EAA=\", \"subType\": \"09\"}}}" } ], "decodeErrors": [ { "description": "Length longer than document", "bson": "1D000000057800FF0000000573FFD26444B34C6990E8E7D1DFC035D400" }, { "description": "Negative length", "bson": "0D000000057800FFFFFFFF0000" }, { "description": "subtype 0x02 length too long ", "bson": "13000000057800060000000203000000FFFF00" }, { "description": "subtype 0x02 length too short", "bson": "13000000057800060000000201000000FFFF00" }, { "description": "subtype 0x02 length negative one", "bson": "130000000578000600000002FFFFFFFFFFFF00" } ], "parseErrors": [ { "description": "$uuid wrong type", "string": "{\"x\" : { \"$uuid\" : { \"data\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4\"}}}" }, { "description": "$uuid invalid value--too short", "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-90e8-e7d1dfc035d4\"}}" }, { "description": "$uuid invalid value--too long", "string": "{\"x\" : { \"$uuid\" : \"73ffd264-44b3-4c69-90e8-e7d1dfc035d4-789e4\"}}" }, { "description": "$uuid invalid value--misplaced hyphens", "string": "{\"x\" : { \"$uuid\" : \"73ff-d26444b-34c6-990e8e-7d1dfc035d4\"}}" }, { "description": "$uuid invalid value--too many hyphens", "string": "{\"x\" : { \"$uuid\" : \"----d264-44b3-4--9-90e8-e7d1dfc0----\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/boolean.json000066400000000000000000000012551511661753600255620ustar00rootroot00000000000000{ "description": "Boolean", "bson_type": "0x08", "test_key": "b", "valid": [ { "description": "True", "canonical_bson": "090000000862000100", "canonical_extjson": "{\"b\" : true}" }, { "description": "False", "canonical_bson": "090000000862000000", "canonical_extjson": "{\"b\" : false}" } ], "decodeErrors": [ { "description": "Invalid boolean value of 2", "bson": "090000000862000200" }, { "description": "Invalid boolean value of -1", "bson": "09000000086200FF00" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/code.json000066400000000000000000000046521511661753600250610ustar00rootroot00000000000000{ "description": "Javascript Code", "bson_type": "0x0D", "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D0000000D6100010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\"}}" }, { "description": "Single character", "canonical_bson": "0E0000000D610002000000620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"b\"}}" }, { "description": "Multi-character", "canonical_bson": "190000000D61000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abababababab\"}}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000D61000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000D61000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u2606\\u2606\\u2606\\u2606\"}}" }, { "description": "Embedded nulls", "canonical_bson": "190000000D61000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\" : {\"$code\" : \"ab\\u0000bab\\u0000babab\"}}" } ], "decodeErrors": [ { "description": "bad code string length: 0 (but no 0x00 either)", "bson": "0C0000000D61000000000000" }, { "description": "bad code string length: -1", "bson": "0C0000000D6100FFFFFFFF00" }, { "description": "bad code string length: eats terminator", "bson": "100000000D6100050000006200620000" }, { "description": "bad code string length: longer than rest of document", "bson": "120000000D00FFFFFF00666F6F6261720000" }, { "description": "code string is not null-terminated", "bson": "100000000D610004000000616263FF00" }, { "description": "empty code string, but extra null", "bson": "0E0000000D610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E0000000D610002000000E90000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/code_w_scope.json000066400000000000000000000067741511661753600266070ustar00rootroot00000000000000{ "description": "Javascript Code with Scope", "bson_type": "0x0F", "test_key": "a", "valid": [ { "description": "Empty code string, empty scope", "canonical_bson": "160000000F61000E0000000100000000050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {}}}" }, { "description": "Non-empty code string, empty scope", "canonical_bson": "1A0000000F610012000000050000006162636400050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {}}}" }, { "description": "Empty code string, non-empty scope", "canonical_bson": "1D0000000F61001500000001000000000C000000107800010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}" }, { "description": "Non-empty code string and non-empty scope", "canonical_bson": "210000000F6100190000000500000061626364000C000000107800010000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"abcd\", \"$scope\" : {\"x\" : {\"$numberInt\": \"1\"}}}}" }, { "description": "Unicode and embedded null in code string, empty scope", "canonical_bson": "1A0000000F61001200000005000000C3A9006400050000000000", "canonical_extjson": "{\"a\" : {\"$code\" : \"\\u00e9\\u0000d\", \"$scope\" : {}}}" } ], "decodeErrors": [ { "description": "field length zero", "bson": "280000000F6100000000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length negative", "bson": "280000000F6100FFFFFFFF0500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too short (less than minimum size)", "bson": "160000000F61000D0000000100000000050000000000" }, { "description": "field length too short (truncates scope)", "bson": "280000000F61001F0000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too long (clips outer doc)", "bson": "280000000F6100210000000500000061626364001300000010780001000000107900010000000000" }, { "description": "field length too long (longer than outer doc)", "bson": "280000000F6100FF0000000500000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length too short", "bson": "280000000F6100200000000400000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length too long (clips scope)", "bson": "280000000F6100200000000600000061626364001300000010780001000000107900010000000000" }, { "description": "bad code string: negative length", "bson": "280000000F610020000000FFFFFFFF61626364001300000010780001000000107900010000000000" }, { "description": "bad code string: length longer than field", "bson": "280000000F610020000000FF00000061626364001300000010780001000000107900010000000000" }, { "description": "bad scope doc (field has bad string length)", "bson": "1C0000000F001500000001000000000C000000020000000000000000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/datetime.json000066400000000000000000000034131511661753600257350ustar00rootroot00000000000000{ "description": "DateTime", "bson_type": "0x09", "test_key": "a", "valid": [ { "description": "epoch", "canonical_bson": "10000000096100000000000000000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"1970-01-01T00:00:00Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"0\"}}}" }, { "description": "positive ms", "canonical_bson": "10000000096100C5D8D6CC3B01000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.501Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330501\"}}}" }, { "description": "negative", "canonical_bson": "10000000096100C33CE7B9BDFFFFFF00", "relaxed_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"-284643869501\"}}}" }, { "description" : "Y10K", "canonical_bson" : "1000000009610000DC1FD277E6000000", "relaxed_extjson" : "{\"a\":{\"$date\":{\"$numberLong\":\"253402300800000\"}}}", "canonical_extjson" : "{\"a\":{\"$date\":{\"$numberLong\":\"253402300800000\"}}}" }, { "description": "leading zero ms", "canonical_bson": "10000000096100D1D6D6CC3B01000000", "relaxed_extjson": "{\"a\" : {\"$date\" : \"2012-12-24T12:15:30.001Z\"}}", "canonical_extjson": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330001\"}}}" } ], "decodeErrors": [ { "description": "datetime field truncated", "bson": "0C0000000961001234567800" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/dbpointer.json000066400000000000000000000054031511661753600261300ustar00rootroot00000000000000{ "description": "DBPointer type (deprecated)", "bson_type": "0x0C", "deprecated": true, "test_key": "a", "valid": [ { "description": "DBpointer", "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" }, { "description": "DBpointer with opposite key order", "canonical_bson": "1A0000000C610002000000620056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "degenerate_extjson": "{\"a\": {\"$dbPointer\": {\"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}, \"$ref\": \"b\"}}}", "converted_bson": "2a00000003610022000000022472656600020000006200072469640056e1fc72e0c917e9c47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"b\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" }, { "description": "With two-byte UTF-8", "canonical_bson": "1B0000000C610003000000C3A90056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\": {\"$dbPointer\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}}", "converted_bson": "2B0000000361002300000002247265660003000000C3A900072469640056E1FC72E0C917E9C47141610000", "converted_extjson": "{\"a\": {\"$ref\": \"é\", \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}}}" } ], "decodeErrors": [ { "description": "String with negative length", "bson": "1A0000000C6100FFFFFFFF620056E1FC72E0C917E9C471416100" }, { "description": "String with zero length", "bson": "1A0000000C610000000000620056E1FC72E0C917E9C471416100" }, { "description": "String not null terminated", "bson": "1A0000000C610002000000626256E1FC72E0C917E9C471416100" }, { "description": "short OID (less than minimum length for field)", "bson": "160000000C61000300000061620056E1FC72E0C91700" }, { "description": "short OID (greater than minimum, but truncated)", "bson": "1A0000000C61000300000061620056E1FC72E0C917E9C4716100" }, { "description": "String with bad UTF-8", "bson": "1A0000000C610002000000E90056E1FC72E0C917E9C471416100" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/dbref.json000066400000000000000000000067661511661753600252410ustar00rootroot00000000000000{ "description": "Document type (DBRef sub-documents)", "bson_type": "0x03", "valid": [ { "description": "DBRef", "canonical_bson": "37000000036462726566002b0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}" }, { "description": "DBRef with database", "canonical_bson": "4300000003646272656600370000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e0224646200030000006462000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": \"db\"}}" }, { "description": "DBRef with database and additional fields", "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e0010246964002a00000002246462000300000064620002666f6f0004000000626172000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$numberInt\": \"42\"}, \"$db\": \"db\", \"foo\": \"bar\"}}" }, { "description": "DBRef with additional fields", "canonical_bson": "4400000003646272656600380000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e02666f6f0004000000626172000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"foo\": \"bar\"}}" }, { "description": "Document with key names similar to those of a DBRef", "canonical_bson": "3e0000000224726566000c0000006e6f742d612d646272656600072469640058921b3e6e32ab156a22b59e022462616e616e6100050000007065656c0000", "canonical_extjson": "{\"$ref\": \"not-a-dbref\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$banana\": \"peel\"}" }, { "description": "DBRef with additional dollar-prefixed and dotted fields", "canonical_bson": "48000000036462726566003c0000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e10612e62000100000010246300010000000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"a.b\": {\"$numberInt\": \"1\"}, \"$c\": {\"$numberInt\": \"1\"}}}" }, { "description": "Sub-document resembles DBRef but $id is missing", "canonical_bson": "26000000036462726566001a0000000224726566000b000000636f6c6c656374696f6e000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\"}}" }, { "description": "Sub-document resembles DBRef but $ref is not a string", "canonical_bson": "2c000000036462726566002000000010247265660001000000072469640058921b3e6e32ab156a22b59e0000", "canonical_extjson": "{\"dbref\": {\"$ref\": {\"$numberInt\": \"1\"}, \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}}}" }, { "description": "Sub-document resembles DBRef but $db is not a string", "canonical_bson": "4000000003646272656600340000000224726566000b000000636f6c6c656374696f6e00072469640058921b3e6e32ab156a22b59e1024646200010000000000", "canonical_extjson": "{\"dbref\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"58921b3e6e32ab156a22b59e\"}, \"$db\": {\"$numberInt\": \"1\"}}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-1.json000066400000000000000000000457031511661753600261400ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "Special - Canonical NaN", "canonical_bson": "180000001364000000000000000000000000000000007C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Special - Negative NaN", "canonical_bson": "18000000136400000000000000000000000000000000FC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Negative NaN", "canonical_bson": "18000000136400000000000000000000000000000000FC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-NaN\"}}", "lossy": true }, { "description": "Special - Canonical SNaN", "canonical_bson": "180000001364000000000000000000000000000000007E00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Negative SNaN", "canonical_bson": "18000000136400000000000000000000000000000000FE00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - NaN with a payload", "canonical_bson": "180000001364001200000000000000000000000000007E00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}", "lossy": true }, { "description": "Special - Canonical Positive Infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Special - Canonical Negative Infinity", "canonical_bson": "18000000136400000000000000000000000000000000F800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Special - Invalid representation treated as 0", "canonical_bson": "180000001364000000000000000000000000000000106C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}", "lossy": true }, { "description": "Special - Invalid representation treated as -0", "canonical_bson": "18000000136400DCBA9876543210DEADBEEF00000010EC00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}", "lossy": true }, { "description": "Special - Invalid representation treated as 0E3", "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF116C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}", "lossy": true }, { "description": "Regular - Adjusted Exponent Limit", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF22F00", "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"0.000001234567890123456789012345678901234\" }}" }, { "description": "Regular - Smallest", "canonical_bson": "18000000136400D204000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001234\"}}" }, { "description": "Regular - Smallest with Trailing Zeros", "canonical_bson": "1800000013640040EF5A07000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00123400000\"}}" }, { "description": "Regular - 0.1", "canonical_bson": "1800000013640001000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1\"}}" }, { "description": "Regular - 0.1234567890123456789012345678901234", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFC2F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1234567890123456789012345678901234\"}}" }, { "description": "Regular - 0", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "Regular - -0", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "Regular - -0.0", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "Regular - 2", "canonical_bson": "180000001364000200000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2\"}}" }, { "description": "Regular - 2.000", "canonical_bson": "18000000136400D0070000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2.000\"}}" }, { "description": "Regular - Largest", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "Scientific - Tiniest", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09ED010000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E-6143\"}}" }, { "description": "Scientific - Tiny", "canonical_bson": "180000001364000100000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "Scientific - Negative Tiny", "canonical_bson": "180000001364000100000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "Scientific - Adjusted Exponent Limit", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CF02F00", "canonical_extjson": "{\"d\": { \"$numberDecimal\": \"1.234567890123456789012345678901234E-7\" }}" }, { "description": "Scientific - Fractional", "canonical_bson": "1800000013640064000000000000000000000000002CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}" }, { "description": "Scientific - 0 with Exponent", "canonical_bson": "180000001364000000000000000000000000000000205F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6000\"}}" }, { "description": "Scientific - 0 with Negative Exponent", "canonical_bson": "1800000013640000000000000000000000000000007A2B00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-611\"}}" }, { "description": "Scientific - No Decimal with Signed Exponent", "canonical_bson": "180000001364000100000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Scientific - Trailing Zero", "canonical_bson": "180000001364001A04000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.050E+4\"}}" }, { "description": "Scientific - With Decimal", "canonical_bson": "180000001364006900000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.05E+3\"}}" }, { "description": "Scientific - Full", "canonical_bson": "18000000136400FFFFFFFFFFFFFFFFFFFFFFFFFFFF403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5192296858534827628530496329220095\"}}" }, { "description": "Scientific - Large", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "Scientific - Largest", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFF5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E+6144\"}}" }, { "description": "Non-Canonical Parsing - Exponent Normalization", "canonical_bson": "1800000013640064000000000000000000000000002CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-100E-10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00E-8\"}}" }, { "description": "Non-Canonical Parsing - Unsigned Positive Exponent", "canonical_bson": "180000001364000100000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Non-Canonical Parsing - Lowercase Exponent Identifier", "canonical_bson": "180000001364000100000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+3\"}}" }, { "description": "Non-Canonical Parsing - Long Significand with Exponent", "canonical_bson": "1800000013640079D9E0F9763ADA429D0200000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345689012345789012345E+12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.2345689012345789012345E+34\"}}" }, { "description": "Non-Canonical Parsing - Positive Sign", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+1234567890123456789012345678901234\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "Non-Canonical Parsing - Long Decimal String", "canonical_bson": "180000001364000100000000000000000000000000722800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-999\"}}" }, { "description": "Non-Canonical Parsing - nan", "canonical_bson": "180000001364000000000000000000000000000000007C00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nan\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Non-Canonical Parsing - nAn", "canonical_bson": "180000001364000000000000000000000000000000007C00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"nAn\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "Non-Canonical Parsing - +infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - infinity", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - infiniTY", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"infiniTY\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - inf", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inf\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - inF", "canonical_bson": "180000001364000000000000000000000000000000007800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"inF\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "Non-Canonical Parsing - -infinity", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -infiniTy", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-infiniTy\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -Inf", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -inf", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inf\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Non-Canonical Parsing - -inF", "canonical_bson": "18000000136400000000000000000000000000000000F800", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-inF\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "Rounded Subnormal number", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "Clamped", "canonical_bson": "180000001364000a00000000000000000000000000fe5f00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" }, { "description": "Exact rounding", "canonical_bson": "18000000136400000000000a5bc138938d44c64d31cc3700", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+999\"}}" }, { "description": "Clamped zeros with a large positive exponent", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "Clamped zeros with a large negative exponent", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "Clamped negative zeros with a large positive exponent", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "Clamped negative zeros with a large negative exponent", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-2147483647\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-2.json000066400000000000000000001136001511661753600261310ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[decq021] Normality", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C40B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1234567890123456789012345678901234\"}}" }, { "description": "[decq823] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400010000800000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483649\"}}" }, { "description": "[decq822] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400000000800000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483648\"}}" }, { "description": "[decq821] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFF7F0000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483647\"}}" }, { "description": "[decq820] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFF7F0000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-2147483646\"}}" }, { "description": "[decq152] fold-downs (more below)", "canonical_bson": "18000000136400393000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-12345\"}}" }, { "description": "[decq154] fold-downs (more below)", "canonical_bson": "18000000136400D20400000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1234\"}}" }, { "description": "[decq006] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-750\"}}" }, { "description": "[decq164] fold-downs (more below)", "canonical_bson": "1800000013640039300000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-123.45\"}}" }, { "description": "[decq156] fold-downs (more below)", "canonical_bson": "180000001364007B0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-123\"}}" }, { "description": "[decq008] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-75.0\"}}" }, { "description": "[decq158] fold-downs (more below)", "canonical_bson": "180000001364000C0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-12\"}}" }, { "description": "[decq122] Nmax and similar", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFFDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.999999999999999999999999999999999E+6144\"}}" }, { "description": "[decq002] (mostly derived from the Strawman 4 document and examples)", "canonical_bson": "18000000136400EE020000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50\"}}" }, { "description": "[decq004] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000042B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50E+3\"}}" }, { "description": "[decq018] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000002EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-7.50E-7\"}}" }, { "description": "[decq125] Nmax and similar", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.234567890123456789012345678901234E+6144\"}}" }, { "description": "[decq131] fold-downs (more below)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq162] fold-downs (more below)", "canonical_bson": "180000001364007B000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.23\"}}" }, { "description": "[decq176] Nmin and below", "canonical_bson": "18000000136400010000000A5BC138938D44C64D31008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000001E-6143\"}}" }, { "description": "[decq174] Nmin and below", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E-6143\"}}" }, { "description": "[decq133] fold-downs (more below)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq160] fold-downs (more below)", "canonical_bson": "18000000136400010000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1\"}}" }, { "description": "[decq172] Nmin and below", "canonical_bson": "180000001364000100000000000000000000000000428000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6143\"}}" }, { "description": "[decq010] derivative canonical plain strings", "canonical_bson": "18000000136400EE020000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.750\"}}" }, { "description": "[decq012] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0750\"}}" }, { "description": "[decq014] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000034B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000750\"}}" }, { "description": "[decq016] derivative canonical plain strings", "canonical_bson": "18000000136400EE0200000000000000000000000030B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000750\"}}" }, { "description": "[decq404] zeros", "canonical_bson": "180000001364000000000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq424] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq407] zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[decq427] negative zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[decq409] zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[decq428] negative zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[decq700] Selected DPD codes", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[decq406] zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[decq426] negative zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[decq410] zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[decq431] negative zeros", "canonical_bson": "18000000136400000000000000000000000000000046B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+3\"}}" }, { "description": "[decq419] clamped zeros...", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq432] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq405] zeros", "canonical_bson": "180000001364000000000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq425] negative zeros", "canonical_bson": "180000001364000000000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq508] Specials", "canonical_bson": "180000001364000000000000000000000000000000007800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"Infinity\"}}" }, { "description": "[decq528] Specials", "canonical_bson": "18000000136400000000000000000000000000000000F800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-Infinity\"}}" }, { "description": "[decq541] Specials", "canonical_bson": "180000001364000000000000000000000000000000007C00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"NaN\"}}" }, { "description": "[decq074] Nmin and below", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E-6143\"}}" }, { "description": "[decq602] fold-down full sequence", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq604] fold-down full sequence", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E+6143\"}}" }, { "description": "[decq606] fold-down full sequence", "canonical_bson": "1800000013640000000080264B91C02220BE377E00FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000000E+6142\"}}" }, { "description": "[decq608] fold-down full sequence", "canonical_bson": "1800000013640000000040EAED7446D09C2C9F0C00FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000E+6141\"}}" }, { "description": "[decq610] fold-down full sequence", "canonical_bson": "18000000136400000000A0CA17726DAE0F1E430100FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000E+6140\"}}" }, { "description": "[decq612] fold-down full sequence", "canonical_bson": "18000000136400000000106102253E5ECE4F200000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000E+6139\"}}" }, { "description": "[decq614] fold-down full sequence", "canonical_bson": "18000000136400000000E83C80D09F3C2E3B030000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000E+6138\"}}" }, { "description": "[decq616] fold-down full sequence", "canonical_bson": "18000000136400000000E4D20CC8DCD2B752000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000E+6137\"}}" }, { "description": "[decq618] fold-down full sequence", "canonical_bson": "180000001364000000004A48011416954508000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000E+6136\"}}" }, { "description": "[decq620] fold-down full sequence", "canonical_bson": "18000000136400000000A1EDCCCE1BC2D300000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000E+6135\"}}" }, { "description": "[decq622] fold-down full sequence", "canonical_bson": "18000000136400000080F64AE1C7022D1500000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000E+6134\"}}" }, { "description": "[decq624] fold-down full sequence", "canonical_bson": "18000000136400000040B2BAC9E0191E0200000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000E+6133\"}}" }, { "description": "[decq626] fold-down full sequence", "canonical_bson": "180000001364000000A0DEC5ADC935360000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000E+6132\"}}" }, { "description": "[decq628] fold-down full sequence", "canonical_bson": "18000000136400000010632D5EC76B050000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000E+6131\"}}" }, { "description": "[decq630] fold-down full sequence", "canonical_bson": "180000001364000000E8890423C78A000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000E+6130\"}}" }, { "description": "[decq632] fold-down full sequence", "canonical_bson": "18000000136400000064A7B3B6E00D000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000E+6129\"}}" }, { "description": "[decq634] fold-down full sequence", "canonical_bson": "1800000013640000008A5D78456301000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000E+6128\"}}" }, { "description": "[decq636] fold-down full sequence", "canonical_bson": "180000001364000000C16FF2862300000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000E+6127\"}}" }, { "description": "[decq638] fold-down full sequence", "canonical_bson": "180000001364000080C6A47E8D0300000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000E+6126\"}}" }, { "description": "[decq640] fold-down full sequence", "canonical_bson": "1800000013640000407A10F35A0000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000E+6125\"}}" }, { "description": "[decq642] fold-down full sequence", "canonical_bson": "1800000013640000A0724E18090000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000E+6124\"}}" }, { "description": "[decq644] fold-down full sequence", "canonical_bson": "180000001364000010A5D4E8000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000E+6123\"}}" }, { "description": "[decq646] fold-down full sequence", "canonical_bson": "1800000013640000E8764817000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000E+6122\"}}" }, { "description": "[decq648] fold-down full sequence", "canonical_bson": "1800000013640000E40B5402000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000E+6121\"}}" }, { "description": "[decq650] fold-down full sequence", "canonical_bson": "1800000013640000CA9A3B00000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000E+6120\"}}" }, { "description": "[decq652] fold-down full sequence", "canonical_bson": "1800000013640000E1F50500000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000E+6119\"}}" }, { "description": "[decq654] fold-down full sequence", "canonical_bson": "180000001364008096980000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000E+6118\"}}" }, { "description": "[decq656] fold-down full sequence", "canonical_bson": "1800000013640040420F0000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000E+6117\"}}" }, { "description": "[decq658] fold-down full sequence", "canonical_bson": "18000000136400A086010000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000E+6116\"}}" }, { "description": "[decq660] fold-down full sequence", "canonical_bson": "180000001364001027000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000E+6115\"}}" }, { "description": "[decq662] fold-down full sequence", "canonical_bson": "18000000136400E803000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000E+6114\"}}" }, { "description": "[decq664] fold-down full sequence", "canonical_bson": "180000001364006400000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+6113\"}}" }, { "description": "[decq666] fold-down full sequence", "canonical_bson": "180000001364000A00000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" }, { "description": "[decq060] fold-downs (more below)", "canonical_bson": "180000001364000100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1\"}}" }, { "description": "[decq670] fold-down full sequence", "canonical_bson": "180000001364000100000000000000000000000000FC5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6110\"}}" }, { "description": "[decq668] fold-down full sequence", "canonical_bson": "180000001364000100000000000000000000000000FE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6111\"}}" }, { "description": "[decq072] Nmin and below", "canonical_bson": "180000001364000100000000000000000000000000420000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6143\"}}" }, { "description": "[decq076] Nmin and below", "canonical_bson": "18000000136400010000000A5BC138938D44C64D31000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000001E-6143\"}}" }, { "description": "[decq036] fold-downs (more below)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq062] fold-downs (more below)", "canonical_bson": "180000001364007B000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23\"}}" }, { "description": "[decq034] Nmax and similar", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3CFE5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.234567890123456789012345678901234E+6144\"}}" }, { "description": "[decq441] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7\"}}" }, { "description": "[decq449] exponent lengths", "canonical_bson": "1800000013640007000000000000000000000000001E5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+5999\"}}" }, { "description": "[decq447] exponent lengths", "canonical_bson": "1800000013640007000000000000000000000000000E3800", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+999\"}}" }, { "description": "[decq445] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000063100", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+99\"}}" }, { "description": "[decq443] exponent lengths", "canonical_bson": "180000001364000700000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+9\"}}" }, { "description": "[decq842] VG testcase", "canonical_bson": "180000001364000000FED83F4E7C9FE4E269E38A5BCD1700", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7.049000000000010795488000000000000E-3097\"}}" }, { "description": "[decq841] VG testcase", "canonical_bson": "180000001364000000203B9DB5056F000000000000002400", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"8.000000000000000000E-1550\"}}" }, { "description": "[decq840] VG testcase", "canonical_bson": "180000001364003C17258419D710C42F0000000000002400", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"8.81125000000001349436E-1548\"}}" }, { "description": "[decq701] Selected DPD codes", "canonical_bson": "180000001364000900000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9\"}}" }, { "description": "[decq032] Nmax and similar", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09EDFF5F00", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.999999999999999999999999999999999E+6144\"}}" }, { "description": "[decq702] Selected DPD codes", "canonical_bson": "180000001364000A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[decq057] fold-downs (more below)", "canonical_bson": "180000001364000C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12\"}}" }, { "description": "[decq703] Selected DPD codes", "canonical_bson": "180000001364001300000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"19\"}}" }, { "description": "[decq704] Selected DPD codes", "canonical_bson": "180000001364001400000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"20\"}}" }, { "description": "[decq705] Selected DPD codes", "canonical_bson": "180000001364001D00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"29\"}}" }, { "description": "[decq706] Selected DPD codes", "canonical_bson": "180000001364001E00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"30\"}}" }, { "description": "[decq707] Selected DPD codes", "canonical_bson": "180000001364002700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"39\"}}" }, { "description": "[decq708] Selected DPD codes", "canonical_bson": "180000001364002800000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"40\"}}" }, { "description": "[decq709] Selected DPD codes", "canonical_bson": "180000001364003100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"49\"}}" }, { "description": "[decq710] Selected DPD codes", "canonical_bson": "180000001364003200000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"50\"}}" }, { "description": "[decq711] Selected DPD codes", "canonical_bson": "180000001364003B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"59\"}}" }, { "description": "[decq712] Selected DPD codes", "canonical_bson": "180000001364003C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"60\"}}" }, { "description": "[decq713] Selected DPD codes", "canonical_bson": "180000001364004500000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"69\"}}" }, { "description": "[decq714] Selected DPD codes", "canonical_bson": "180000001364004600000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"70\"}}" }, { "description": "[decq715] Selected DPD codes", "canonical_bson": "180000001364004700000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"71\"}}" }, { "description": "[decq716] Selected DPD codes", "canonical_bson": "180000001364004800000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"72\"}}" }, { "description": "[decq717] Selected DPD codes", "canonical_bson": "180000001364004900000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"73\"}}" }, { "description": "[decq718] Selected DPD codes", "canonical_bson": "180000001364004A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"74\"}}" }, { "description": "[decq719] Selected DPD codes", "canonical_bson": "180000001364004B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"75\"}}" }, { "description": "[decq720] Selected DPD codes", "canonical_bson": "180000001364004C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"76\"}}" }, { "description": "[decq721] Selected DPD codes", "canonical_bson": "180000001364004D00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"77\"}}" }, { "description": "[decq722] Selected DPD codes", "canonical_bson": "180000001364004E00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"78\"}}" }, { "description": "[decq723] Selected DPD codes", "canonical_bson": "180000001364004F00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"79\"}}" }, { "description": "[decq056] fold-downs (more below)", "canonical_bson": "180000001364007B00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123\"}}" }, { "description": "[decq064] fold-downs (more below)", "canonical_bson": "1800000013640039300000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123.45\"}}" }, { "description": "[decq732] Selected DPD codes", "canonical_bson": "180000001364000802000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"520\"}}" }, { "description": "[decq733] Selected DPD codes", "canonical_bson": "180000001364000902000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"521\"}}" }, { "description": "[decq740] DPD: one of each of the huffman groups", "canonical_bson": "180000001364000903000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"777\"}}" }, { "description": "[decq741] DPD: one of each of the huffman groups", "canonical_bson": "180000001364000A03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"778\"}}" }, { "description": "[decq742] DPD: one of each of the huffman groups", "canonical_bson": "180000001364001303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"787\"}}" }, { "description": "[decq746] DPD: one of each of the huffman groups", "canonical_bson": "180000001364001F03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"799\"}}" }, { "description": "[decq743] DPD: one of each of the huffman groups", "canonical_bson": "180000001364006D03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"877\"}}" }, { "description": "[decq753] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364007803000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"888\"}}" }, { "description": "[decq754] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364007903000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"889\"}}" }, { "description": "[decq760] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364008203000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"898\"}}" }, { "description": "[decq764] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "180000001364008303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"899\"}}" }, { "description": "[decq745] DPD: one of each of the huffman groups", "canonical_bson": "18000000136400D303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"979\"}}" }, { "description": "[decq770] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400DC03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"988\"}}" }, { "description": "[decq774] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400DD03000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"989\"}}" }, { "description": "[decq730] Selected DPD codes", "canonical_bson": "18000000136400E203000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"994\"}}" }, { "description": "[decq731] Selected DPD codes", "canonical_bson": "18000000136400E303000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"995\"}}" }, { "description": "[decq744] DPD: one of each of the huffman groups", "canonical_bson": "18000000136400E503000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"997\"}}" }, { "description": "[decq780] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400E603000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"998\"}}" }, { "description": "[decq787] DPD all-highs cases (includes the 24 redundant codes)", "canonical_bson": "18000000136400E703000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"999\"}}" }, { "description": "[decq053] fold-downs (more below)", "canonical_bson": "18000000136400D204000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234\"}}" }, { "description": "[decq052] fold-downs (more below)", "canonical_bson": "180000001364003930000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345\"}}" }, { "description": "[decq792] Miscellaneous (testers' queries, etc.)", "canonical_bson": "180000001364003075000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"30000\"}}" }, { "description": "[decq793] Miscellaneous (testers' queries, etc.)", "canonical_bson": "1800000013640090940D0000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"890000\"}}" }, { "description": "[decq824] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFF7F00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483646\"}}" }, { "description": "[decq825] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFF7F00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483647\"}}" }, { "description": "[decq826] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000000008000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483648\"}}" }, { "description": "[decq827] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000100008000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2147483649\"}}" }, { "description": "[decq828] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FEFFFFFF00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967294\"}}" }, { "description": "[decq829] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "18000000136400FFFFFFFF00000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967295\"}}" }, { "description": "[decq830] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000000000001000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967296\"}}" }, { "description": "[decq831] values around [u]int32 edges (zeros done earlier)", "canonical_bson": "180000001364000100000001000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4294967297\"}}" }, { "description": "[decq022] Normality", "canonical_bson": "18000000136400C7711CC7B548F377DC80A131C836403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1111111111111111111111111111111111\"}}" }, { "description": "[decq020] Normality", "canonical_bson": "18000000136400F2AF967ED05C82DE3297FF6FDE3C403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1234567890123456789012345678901234\"}}" }, { "description": "[decq550] Specials", "canonical_bson": "18000000136400FFFFFFFF638E8D37C087ADBE09ED413000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9999999999999999999999999999999999\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-3.json000066400000000000000000002613321511661753600261400ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[basx066] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx065] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx064] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE0000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-345678.5432\"}}" }, { "description": "[basx041] strings without E cannot generate E in result", "canonical_bson": "180000001364004C0000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-76\"}}" }, { "description": "[basx027] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000F270000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.999\"}}" }, { "description": "[basx026] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364009F230000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.119\"}}" }, { "description": "[basx025] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364008F030000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.11\"}}" }, { "description": "[basx024] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364005B000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.1\"}}" }, { "description": "[dqbsr531] negatives (Rounded)", "canonical_bson": "1800000013640099761CC7B548F377DC80A131C836FEAF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.1111111111111111111111111111123450\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.111111111111111111111111111112345\"}}" }, { "description": "[basx022] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0\"}}" }, { "description": "[basx021] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400010000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1\"}}" }, { "description": "[basx601] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx622] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002EB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-9\"}}" }, { "description": "[basx602] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx621] Zeros", "canonical_bson": "18000000136400000000000000000000000000000030B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-8\"}}" }, { "description": "[basx603] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx620] Zeros", "canonical_bson": "18000000136400000000000000000000000000000032B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-7\"}}" }, { "description": "[basx604] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx619] Zeros", "canonical_bson": "18000000136400000000000000000000000000000034B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000\"}}" }, { "description": "[basx605] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx618] Zeros", "canonical_bson": "18000000136400000000000000000000000000000036B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx680] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx606] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx617] Zeros", "canonical_bson": "18000000136400000000000000000000000000000038B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx681] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx686] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx687] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx019] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-00.00\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx607] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx616] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx682] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx155] Numbers with E", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000e+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx130] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx290] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx131] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx291] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000036B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx132] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx292] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000034B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000\"}}" }, { "description": "[basx133] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx293] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000032B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-7\"}}" }, { "description": "[basx608] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx615] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx683] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx630] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx670] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx631] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx671] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx134] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx294] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx632] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx672] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx135] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx295] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000036B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000\"}}" }, { "description": "[basx633] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx673] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx136] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx674] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx634] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx137] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx635] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx675] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx636] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx676] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx637] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx677] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx638] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx678] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-10\"}}" }, { "description": "[basx149] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"000E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx639] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx679] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-11\"}}" }, { "description": "[basx063] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+00345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx018] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx609] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx614] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx684] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx640] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx660] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx641] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx661] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00\"}}" }, { "description": "[basx296] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx642] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx662] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000\"}}" }, { "description": "[basx297] some more negative zeros [systematic tests below]", "canonical_bson": "18000000136400000000000000000000000000000038B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0000\"}}" }, { "description": "[basx643] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx663] Zeros", "canonical_bson": "180000001364000000000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000\"}}" }, { "description": "[basx644] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx664] Zeros", "canonical_bson": "180000001364000000000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000\"}}" }, { "description": "[basx645] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx665] Zeros", "canonical_bson": "180000001364000000000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000\"}}" }, { "description": "[basx646] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx666] Zeros", "canonical_bson": "180000001364000000000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-7\"}}" }, { "description": "[basx647] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx667] Zeros", "canonical_bson": "180000001364000000000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8\"}}" }, { "description": "[basx648] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx668] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx160] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx161] Numbers with E", "canonical_bson": "1800000013640000000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-9\"}}" }, { "description": "[basx649] Zeros", "canonical_bson": "180000001364000000000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8\"}}" }, { "description": "[basx669] Zeros", "canonical_bson": "1800000013640000000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0E-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-10\"}}" }, { "description": "[basx062] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx001] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000000000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx017] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400000000000000000000000000000040B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx611] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx613] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx685] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx688] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx689] Zeros", "canonical_bson": "18000000136400000000000000000000000000000040B000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0\"}}" }, { "description": "[basx650] Zeros", "canonical_bson": "180000001364000000000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0\"}}" }, { "description": "[basx651] Zeros", "canonical_bson": "180000001364000000000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+1\"}}" }, { "description": "[basx298] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003CB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00\"}}" }, { "description": "[basx652] Zeros", "canonical_bson": "180000001364000000000000000000000000000000443000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+2\"}}" }, { "description": "[basx299] some more negative zeros [systematic tests below]", "canonical_bson": "1800000013640000000000000000000000000000003AB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000\"}}" }, { "description": "[basx653] Zeros", "canonical_bson": "180000001364000000000000000000000000000000463000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+3\"}}" }, { "description": "[basx654] Zeros", "canonical_bson": "180000001364000000000000000000000000000000483000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+4\"}}" }, { "description": "[basx655] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+5\"}}" }, { "description": "[basx656] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6\"}}" }, { "description": "[basx657] Zeros", "canonical_bson": "1800000013640000000000000000000000000000004E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+7\"}}" }, { "description": "[basx658] Zeros", "canonical_bson": "180000001364000000000000000000000000000000503000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8\"}}" }, { "description": "[basx138] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx139] Numbers with E", "canonical_bson": "18000000136400000000000000000000000000000052B000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+9\"}}" }, { "description": "[basx144] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx154] Numbers with E", "canonical_bson": "180000001364000000000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx659] Zeros", "canonical_bson": "180000001364000000000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+9\"}}" }, { "description": "[basx042] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+12.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx143] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+1E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx061] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+345678.5432\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx036] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000203000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000000123456789\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23456789E-8\"}}" }, { "description": "[basx035] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000223000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000123456789\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23456789E-7\"}}" }, { "description": "[basx034] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000243000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000123456789\"}}" }, { "description": "[basx053] strings without E cannot generate E in result", "canonical_bson": "180000001364003200000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000050\"}}" }, { "description": "[basx033] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640015CD5B0700000000000000000000263000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000123456789\"}}" }, { "description": "[basx016] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000C000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.012\"}}" }, { "description": "[basx015] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364007B000000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123\"}}" }, { "description": "[basx037] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640078DF0D8648700000000000000000223000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123456789012344\"}}" }, { "description": "[basx038] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640079DF0D8648700000000000000000223000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.123456789012345\"}}" }, { "description": "[basx250] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx257] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx256] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx258] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx251] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000103000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-21\"}}" }, { "description": "[basx263] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000603000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+19\"}}" }, { "description": "[basx255] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx259] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx254] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0001265\"}}" }, { "description": "[basx260] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx253] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00001265\"}}" }, { "description": "[basx261] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx252] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000283000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-9\"}}" }, { "description": "[basx262] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+7\"}}" }, { "description": "[basx159] Numbers with E", "canonical_bson": "1800000013640049000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.73e-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7.3E-8\"}}" }, { "description": "[basx004] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640064000000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00\"}}" }, { "description": "[basx003] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0\"}}" }, { "description": "[basx002] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000100000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1\"}}" }, { "description": "[basx148] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx153] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx141] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx146] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx151] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx142] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx147] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx152] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+90\"}}" }, { "description": "[basx140] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx150] Numbers with E", "canonical_bson": "180000001364000100000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+9\"}}" }, { "description": "[basx014] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400D2040000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.234\"}}" }, { "description": "[basx170] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx177] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx176] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx178] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx171] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000123000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-20\"}}" }, { "description": "[basx183] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000623000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+20\"}}" }, { "description": "[basx175] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx179] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx174] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx180] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx173] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0001265\"}}" }, { "description": "[basx181] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx172] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-8\"}}" }, { "description": "[basx182] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+8\"}}" }, { "description": "[basx157] Numbers with E", "canonical_bson": "180000001364000400000000000000000000000000523000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4E+9\"}}" }, { "description": "[basx067] examples", "canonical_bson": "180000001364000500000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000005\"}}" }, { "description": "[basx069] examples", "canonical_bson": "180000001364000500000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-7\"}}" }, { "description": "[basx385] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7\"}}" }, { "description": "[basx365] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000543000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+10\"}}" }, { "description": "[basx405] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-10\"}}" }, { "description": "[basx363] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000563000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+11\"}}" }, { "description": "[basx407] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002A3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-11\"}}" }, { "description": "[basx361] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+12\"}}" }, { "description": "[basx409] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000283000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-12\"}}" }, { "description": "[basx411] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000263000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-13\"}}" }, { "description": "[basx383] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+1\"}}" }, { "description": "[basx387] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.7\"}}" }, { "description": "[basx381] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+2\"}}" }, { "description": "[basx389] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.07\"}}" }, { "description": "[basx379] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+3\"}}" }, { "description": "[basx391] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.007\"}}" }, { "description": "[basx377] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+4\"}}" }, { "description": "[basx393] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0007\"}}" }, { "description": "[basx375] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+5\"}}" }, { "description": "[basx395] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00007\"}}" }, { "description": "[basx373] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+6\"}}" }, { "description": "[basx397] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000007\"}}" }, { "description": "[basx371] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+7\"}}" }, { "description": "[basx399] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000323000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-7\"}}" }, { "description": "[basx369] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+8\"}}" }, { "description": "[basx401] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000303000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-8\"}}" }, { "description": "[basx367] Engineering notation tests", "canonical_bson": "180000001364000700000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E+9\"}}" }, { "description": "[basx403] Engineering notation tests", "canonical_bson": "1800000013640007000000000000000000000000002E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"7E-9\"}}" }, { "description": "[basx007] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640064000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.0\"}}" }, { "description": "[basx005] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364000A00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[basx165] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx163] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx325] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10\"}}" }, { "description": "[basx305] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000543000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+11\"}}" }, { "description": "[basx345] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-10\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-9\"}}" }, { "description": "[basx303] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000563000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+12\"}}" }, { "description": "[basx347] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-11\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-10\"}}" }, { "description": "[basx301] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000583000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+13\"}}" }, { "description": "[basx349] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000283000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-12\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-11\"}}" }, { "description": "[basx351] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000263000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-13\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-12\"}}" }, { "description": "[basx323] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+2\"}}" }, { "description": "[basx327] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0\"}}" }, { "description": "[basx321] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+3\"}}" }, { "description": "[basx329] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.10\"}}" }, { "description": "[basx319] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+4\"}}" }, { "description": "[basx331] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.010\"}}" }, { "description": "[basx317] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+5\"}}" }, { "description": "[basx333] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0010\"}}" }, { "description": "[basx315] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6\"}}" }, { "description": "[basx335] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00010\"}}" }, { "description": "[basx313] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+7\"}}" }, { "description": "[basx337] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-6\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000010\"}}" }, { "description": "[basx311] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+8\"}}" }, { "description": "[basx339] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000010\"}}" }, { "description": "[basx309] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+9\"}}" }, { "description": "[basx341] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-7\"}}" }, { "description": "[basx164] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+91\"}}" }, { "description": "[basx162] Numbers with E", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx307] Engineering notation tests", "canonical_bson": "180000001364000A00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+10\"}}" }, { "description": "[basx343] Engineering notation tests", "canonical_bson": "180000001364000A000000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"10e-9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-8\"}}" }, { "description": "[basx008] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640065000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.1\"}}" }, { "description": "[basx009] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640068000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.4\"}}" }, { "description": "[basx010] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640069000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.5\"}}" }, { "description": "[basx011] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006A000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.6\"}}" }, { "description": "[basx012] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006D000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"10.9\"}}" }, { "description": "[basx013] conform to rules and exponent will be in permitted range).", "canonical_bson": "180000001364006E000000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"11.0\"}}" }, { "description": "[basx040] strings without E cannot generate E in result", "canonical_bson": "180000001364000C00000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12\"}}" }, { "description": "[basx190] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx197] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx196] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx198] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx191] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000143000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-19\"}}" }, { "description": "[basx203] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000643000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+21\"}}" }, { "description": "[basx195] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx199] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx194] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx200] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx193] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000343000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.001265\"}}" }, { "description": "[basx201] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx192] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-7\"}}" }, { "description": "[basx202] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+9\"}}" }, { "description": "[basx044] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"012.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx042] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx046] strings without E cannot generate E in result", "canonical_bson": "180000001364001100000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"17.\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"17\"}}" }, { "description": "[basx049] strings without E cannot generate E in result", "canonical_bson": "180000001364002C00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0044\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"44\"}}" }, { "description": "[basx048] strings without E cannot generate E in result", "canonical_bson": "180000001364002C00000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"044\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"44\"}}" }, { "description": "[basx158] Numbers with E", "canonical_bson": "180000001364002C00000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"44E+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"4.4E+10\"}}" }, { "description": "[basx068] examples", "canonical_bson": "180000001364003200000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"50E-7\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000050\"}}" }, { "description": "[basx169] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+009\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx167] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+09\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx168] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000F43000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100E+90\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+92\"}}" }, { "description": "[basx166] Numbers with E", "canonical_bson": "180000001364006400000000000000000000000000523000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"100e+9\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+11\"}}" }, { "description": "[basx210] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx217] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx216] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx218] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx211] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000163000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-18\"}}" }, { "description": "[basx223] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000663000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+22\"}}" }, { "description": "[basx215] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx219] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx214] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx220] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx213] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.01265\"}}" }, { "description": "[basx221] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+6\"}}" }, { "description": "[basx212] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000002E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000001265\"}}" }, { "description": "[basx222] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000004E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+10\"}}" }, { "description": "[basx006] conform to rules and exponent will be in permitted range).", "canonical_bson": "18000000136400E803000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1000\"}}" }, { "description": "[basx230] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx237] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000403000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265\"}}" }, { "description": "[basx236] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"126.5\"}}" }, { "description": "[basx238] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000423000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+1\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+4\"}}" }, { "description": "[basx231] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000183000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E-17\"}}" }, { "description": "[basx243] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000683000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+20\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+23\"}}" }, { "description": "[basx235] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.65\"}}" }, { "description": "[basx239] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000443000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+2\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+5\"}}" }, { "description": "[basx234] Numbers with E", "canonical_bson": "18000000136400F1040000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265\"}}" }, { "description": "[basx240] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000463000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+3\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+6\"}}" }, { "description": "[basx233] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000383000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1265\"}}" }, { "description": "[basx241] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000483000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+4\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+7\"}}" }, { "description": "[basx232] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E-8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00001265\"}}" }, { "description": "[basx242] Numbers with E", "canonical_bson": "18000000136400F104000000000000000000000000503000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1265E+8\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.265E+11\"}}" }, { "description": "[basx060] strings without E cannot generate E in result", "canonical_bson": "18000000136400185C0ACE00000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.5432\"}}" }, { "description": "[basx059] strings without E cannot generate E in result", "canonical_bson": "18000000136400F198670C08000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0345678.54321\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.54321\"}}" }, { "description": "[basx058] strings without E cannot generate E in result", "canonical_bson": "180000001364006AF90B7C50000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"345678.543210\"}}" }, { "description": "[basx057] strings without E cannot generate E in result", "canonical_bson": "180000001364006A19562522020000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"2345678.543210\"}}" }, { "description": "[basx056] strings without E cannot generate E in result", "canonical_bson": "180000001364006AB9C8733A0B0000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12345678.543210\"}}" }, { "description": "[basx031] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640040AF0D8648700000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789.000000\"}}" }, { "description": "[basx030] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640080910F8648700000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789.123456\"}}" }, { "description": "[basx032] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640080910F8648700000000000000000403000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"123456789123456\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-4.json000066400000000000000000000157371511661753600261470ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[basx023] conform to rules and exponent will be in permitted range).", "canonical_bson": "1800000013640001000000000000000000000000003EB000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.1\"}}" }, { "description": "[basx045] strings without E cannot generate E in result", "canonical_bson": "1800000013640003000000000000000000000000003A3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+0.003\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.003\"}}" }, { "description": "[basx610] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0\"}}" }, { "description": "[basx612] Zeros", "canonical_bson": "1800000013640000000000000000000000000000003EB000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-.0\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.0\"}}" }, { "description": "[basx043] strings without E cannot generate E in result", "canonical_bson": "18000000136400FC040000000000000000000000003C3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"+12.76\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"12.76\"}}" }, { "description": "[basx055] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000303000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-8\"}}" }, { "description": "[basx054] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000323000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0000005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"5E-7\"}}" }, { "description": "[basx052] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000343000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000005\"}}" }, { "description": "[basx051] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000363000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"00.00005\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00005\"}}" }, { "description": "[basx050] strings without E cannot generate E in result", "canonical_bson": "180000001364000500000000000000000000000000383000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.0005\"}}" }, { "description": "[basx047] strings without E cannot generate E in result", "canonical_bson": "1800000013640005000000000000000000000000003E3000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".5\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.5\"}}" }, { "description": "[dqbsr431] check rounding modes heeded (Rounded)", "canonical_bson": "1800000013640099761CC7B548F377DC80A131C836FE2F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.1111111111111111111111111111123450\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.111111111111111111111111111112345\"}}" }, { "description": "OK2", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FC2F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \".100000000000000000000000000000000000000000000000000000000000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.1000000000000000000000000000000000\"}}" } ], "parseErrors": [ { "description": "[basx564] Near-specials (Conversion_syntax)", "string": "Infi" }, { "description": "[basx565] Near-specials (Conversion_syntax)", "string": "Infin" }, { "description": "[basx566] Near-specials (Conversion_syntax)", "string": "Infini" }, { "description": "[basx567] Near-specials (Conversion_syntax)", "string": "Infinit" }, { "description": "[basx568] Near-specials (Conversion_syntax)", "string": "-Infinit" }, { "description": "[basx590] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".Infinity" }, { "description": "[basx562] Near-specials (Conversion_syntax)", "string": "NaNq" }, { "description": "[basx563] Near-specials (Conversion_syntax)", "string": "NaNs" }, { "description": "[dqbas939] overflow results at different rounding modes (Overflow & Inexact & Rounded)", "string": "-7e10000" }, { "description": "[dqbsr534] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234650" }, { "description": "[dqbsr535] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234551" }, { "description": "[dqbsr533] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234550" }, { "description": "[dqbsr532] negatives (Rounded & Inexact)", "string": "-1.11111111111111111111111111111234549" }, { "description": "[dqbsr432] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234549" }, { "description": "[dqbsr433] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234550" }, { "description": "[dqbsr435] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234551" }, { "description": "[dqbsr434] check rounding modes heeded (Rounded & Inexact)", "string": "1.11111111111111111111111111111234650" }, { "description": "[dqbas938] overflow results at different rounding modes (Overflow & Inexact & Rounded)", "string": "7e10000" }, { "description": "Inexact rounding#1", "string": "100000000000000000000000000000000000000000000000000000000001" }, { "description": "Inexact rounding#2", "string": "1E-6177" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-5.json000066400000000000000000000554551511661753600261510ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "[decq035] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.23E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq037] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq077] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.100000000000000000000000000000000E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq078] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq079] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000000000000000000000000010E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-6175\"}}" }, { "description": "[decq080] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E-6175\"}}" }, { "description": "[decq081] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000020000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.00000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6175\"}}" }, { "description": "[decq082] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000020000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6175\"}}" }, { "description": "[decq083] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0.000000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq084] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq090] underflows cannot be tested for simple copies, check edge cases (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E-6176\"}}" }, { "description": "[decq100] underflows cannot be tested for simple copies, check edge cases (Subnormal)", "canonical_bson": "18000000136400FFFFFFFF095BC138938D44C64D31000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"999999999999999999999999999999999e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"9.99999999999999999999999999999999E-6144\"}}" }, { "description": "[decq130] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000807F1BCF85B27059C8A43CFEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.23E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.230000000000000000000000000000000E+6144\"}}" }, { "description": "[decq132] fold-downs (more below) (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq177] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.100000000000000000000000000000000E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq178] Nmin and below (Subnormal)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.00000000000000000000000000000000E-6144\"}}" }, { "description": "[decq179] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000000000000000000000000010E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0E-6175\"}}" }, { "description": "[decq180] Nmin and below (Subnormal)", "canonical_bson": "180000001364000A00000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.0E-6175\"}}" }, { "description": "[decq181] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000028000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.00000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6175\"}}" }, { "description": "[decq182] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000028000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6175\"}}" }, { "description": "[decq183] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0.000000000000000000000000000000001E-6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq184] Nmin and below (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq190] underflow edge cases (Subnormal)", "canonical_bson": "180000001364000100000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1E-6176\"}}" }, { "description": "[decq200] underflow edge cases (Subnormal)", "canonical_bson": "18000000136400FFFFFFFF095BC138938D44C64D31008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-999999999999999999999999999999999e-6176\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-9.99999999999999999999999999999999E-6144\"}}" }, { "description": "[decq400] zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq401] zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000000000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E-6176\"}}" }, { "description": "[decq414] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq416] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq418] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"0E+6111\"}}" }, { "description": "[decq420] negative zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq421] negative zeros (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000008000", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6177\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E-6176\"}}" }, { "description": "[decq434] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq436] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq438] clamped zeros... (Clamped)", "canonical_bson": "180000001364000000000000000000000000000000FEDF00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+8000\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-0E+6111\"}}" }, { "description": "[decq601] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000000A5BC138938D44C64D31FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6144\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000000E+6144\"}}" }, { "description": "[decq603] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000000081EFAC855B416D2DEE04FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6143\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000000E+6143\"}}" }, { "description": "[decq605] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000000080264B91C02220BE377E00FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6142\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000000E+6142\"}}" }, { "description": "[decq607] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000000040EAED7446D09C2C9F0C00FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6141\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000000E+6141\"}}" }, { "description": "[decq609] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000A0CA17726DAE0F1E430100FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6140\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000000E+6140\"}}" }, { "description": "[decq611] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000106102253E5ECE4F200000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6139\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000000E+6139\"}}" }, { "description": "[decq613] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000E83C80D09F3C2E3B030000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6138\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000000E+6138\"}}" }, { "description": "[decq615] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000E4D20CC8DCD2B752000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6137\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000000E+6137\"}}" }, { "description": "[decq617] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000004A48011416954508000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6136\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000000E+6136\"}}" }, { "description": "[decq619] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000000A1EDCCCE1BC2D300000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6135\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000000E+6135\"}}" }, { "description": "[decq621] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000080F64AE1C7022D1500000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6134\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000000E+6134\"}}" }, { "description": "[decq623] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000040B2BAC9E0191E0200000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6133\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000000E+6133\"}}" }, { "description": "[decq625] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000A0DEC5ADC935360000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6132\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000000E+6132\"}}" }, { "description": "[decq627] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000010632D5EC76B050000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6131\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000000E+6131\"}}" }, { "description": "[decq629] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000E8890423C78A000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6130\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000000E+6130\"}}" }, { "description": "[decq631] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400000064A7B3B6E00D000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6129\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000000E+6129\"}}" }, { "description": "[decq633] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000008A5D78456301000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6128\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000000E+6128\"}}" }, { "description": "[decq635] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000000C16FF2862300000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6127\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000000E+6127\"}}" }, { "description": "[decq637] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000080C6A47E8D0300000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6126\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000000E+6126\"}}" }, { "description": "[decq639] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000407A10F35A0000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6125\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000000E+6125\"}}" }, { "description": "[decq641] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000A0724E18090000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6124\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000000E+6124\"}}" }, { "description": "[decq643] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000010A5D4E8000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6123\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000000E+6123\"}}" }, { "description": "[decq645] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E8764817000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6122\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000000E+6122\"}}" }, { "description": "[decq647] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E40B5402000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6121\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000000E+6121\"}}" }, { "description": "[decq649] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000CA9A3B00000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6120\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000000E+6120\"}}" }, { "description": "[decq651] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640000E1F50500000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6119\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000000E+6119\"}}" }, { "description": "[decq653] fold-down full sequence (Clamped)", "canonical_bson": "180000001364008096980000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6118\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000000E+6118\"}}" }, { "description": "[decq655] fold-down full sequence (Clamped)", "canonical_bson": "1800000013640040420F0000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6117\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000000E+6117\"}}" }, { "description": "[decq657] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400A086010000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6116\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00000E+6116\"}}" }, { "description": "[decq659] fold-down full sequence (Clamped)", "canonical_bson": "180000001364001027000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6115\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0000E+6115\"}}" }, { "description": "[decq661] fold-down full sequence (Clamped)", "canonical_bson": "18000000136400E803000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6114\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.000E+6114\"}}" }, { "description": "[decq663] fold-down full sequence (Clamped)", "canonical_bson": "180000001364006400000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6113\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.00E+6113\"}}" }, { "description": "[decq665] fold-down full sequence (Clamped)", "canonical_bson": "180000001364000A00000000000000000000000000FE5F00", "degenerate_extjson": "{\"d\" : {\"$numberDecimal\" : \"1E+6112\"}}", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"1.0E+6112\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-6.json000066400000000000000000000060111511661753600261320ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "parseErrors": [ { "description": "Incomplete Exponent", "string": "1e" }, { "description": "Exponent at the beginning", "string": "E01" }, { "description": "Just a decimal place", "string": "." }, { "description": "2 decimal places", "string": "..3" }, { "description": "2 decimal places", "string": ".13.3" }, { "description": "2 decimal places", "string": "1..3" }, { "description": "2 decimal places", "string": "1.3.4" }, { "description": "2 decimal places", "string": "1.34." }, { "description": "Decimal with no digits", "string": ".e" }, { "description": "2 signs", "string": "+-32.4" }, { "description": "2 signs", "string": "-+32.4" }, { "description": "2 negative signs", "string": "--32.4" }, { "description": "2 negative signs", "string": "-32.-4" }, { "description": "End in negative sign", "string": "32.0-" }, { "description": "2 negative signs", "string": "32.4E--21" }, { "description": "2 negative signs", "string": "32.4E-2-1" }, { "description": "2 signs", "string": "32.4E+-21" }, { "description": "Empty string", "string": "" }, { "description": "leading white space positive number", "string": " 1" }, { "description": "leading white space negative number", "string": " -1" }, { "description": "trailing white space", "string": "1 " }, { "description": "Invalid", "string": "E" }, { "description": "Invalid", "string": "invalid" }, { "description": "Invalid", "string": "i" }, { "description": "Invalid", "string": "in" }, { "description": "Invalid", "string": "-in" }, { "description": "Invalid", "string": "Na" }, { "description": "Invalid", "string": "-Na" }, { "description": "Invalid", "string": "1.23abc" }, { "description": "Invalid", "string": "1.23abcE+02" }, { "description": "Invalid", "string": "1.23E+0aabs2" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-7.json000066400000000000000000000310171511661753600261370ustar00rootroot00000000000000{ "description": "Decimal128", "bson_type": "0x13", "test_key": "d", "parseErrors": [ { "description": "[basx572] Near-specials (Conversion_syntax)", "string": "-9Inf" }, { "description": "[basx516] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "-1-" }, { "description": "[basx533] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "0000.." }, { "description": "[basx534] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".0000." }, { "description": "[basx535] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "00..00" }, { "description": "[basx569] Near-specials (Conversion_syntax)", "string": "0Inf" }, { "description": "[basx571] Near-specials (Conversion_syntax)", "string": "-0Inf" }, { "description": "[basx575] Near-specials (Conversion_syntax)", "string": "0sNaN" }, { "description": "[basx503] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "++1" }, { "description": "[basx504] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "--1" }, { "description": "[basx505] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "-+1" }, { "description": "[basx506] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "+-1" }, { "description": "[basx510] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " +1" }, { "description": "[basx513] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " + 1" }, { "description": "[basx514] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": " - 1" }, { "description": "[basx501] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "." }, { "description": "[basx502] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".." }, { "description": "[basx519] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "" }, { "description": "[basx525] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "e100" }, { "description": "[basx549] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "e+1" }, { "description": "[basx577] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".e+1" }, { "description": "[basx578] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.e+1" }, { "description": "[basx581] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "E+1" }, { "description": "[basx582] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".E+1" }, { "description": "[basx583] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.E+1" }, { "description": "[basx579] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.e+" }, { "description": "[basx580] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.e" }, { "description": "[basx584] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.E+" }, { "description": "[basx585] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.E" }, { "description": "[basx589] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.Inf" }, { "description": "[basx586] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": ".NaN" }, { "description": "[basx587] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "-.NaN" }, { "description": "[basx545] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "ONE" }, { "description": "[basx561] Near-specials (Conversion_syntax)", "string": "qNaN" }, { "description": "[basx573] Near-specials (Conversion_syntax)", "string": "-sNa" }, { "description": "[basx588] some baddies with dots and Es and dots and specials (Conversion_syntax)", "string": "+.sNaN" }, { "description": "[basx544] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "ten" }, { "description": "[basx527] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "u0b65" }, { "description": "[basx526] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "u0e5a" }, { "description": "[basx515] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "x" }, { "description": "[basx574] Near-specials (Conversion_syntax)", "string": "xNaN" }, { "description": "[basx530] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": ".123.5" }, { "description": "[basx500] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1..2" }, { "description": "[basx542] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e1.0" }, { "description": "[basx553] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+1.2.3" }, { "description": "[basx543] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e123e" }, { "description": "[basx552] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+1.2" }, { "description": "[basx546] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e.1" }, { "description": "[basx547] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e1." }, { "description": "[basx554] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E++1" }, { "description": "[basx555] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E--1" }, { "description": "[basx556] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E+-1" }, { "description": "[basx557] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E-+1" }, { "description": "[basx558] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E'1" }, { "description": "[basx559] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E\"1" }, { "description": "[basx520] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1e-" }, { "description": "[basx560] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1E" }, { "description": "[basx548] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1ee" }, { "description": "[basx551] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.2.1" }, { "description": "[basx550] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.23.4" }, { "description": "[basx529] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "1.34.5" }, { "description": "[basx531] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "01.35." }, { "description": "[basx532] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "01.35-" }, { "description": "[basx518] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "3+" }, { "description": "[basx521] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e99999a" }, { "description": "[basx570] Near-specials (Conversion_syntax)", "string": "9Inf" }, { "description": "[basx512] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12 " }, { "description": "[basx517] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12-" }, { "description": "[basx507] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12e" }, { "description": "[basx508] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12e++" }, { "description": "[basx509] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "12f4" }, { "description": "[basx536] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e*123" }, { "description": "[basx537] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e123-" }, { "description": "[basx540] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e1*23" }, { "description": "[basx538] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e+12+" }, { "description": "[basx539] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111e1-3-" }, { "description": "[basx541] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "111E1e+3" }, { "description": "[basx528] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "123,65" }, { "description": "[basx523] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e12356789012x" }, { "description": "[basx522] The 'baddies' tests from DiagBigDecimal, plus some new ones (Conversion_syntax)", "string": "7e123567890x" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/decimal128-mongoc.json000066400000000000000000000007421511661753600272540ustar00rootroot00000000000000{ "description": "Decimal128 - libmongoc-specific tests", "bson_type": "0x13", "test_key": "d", "valid": [ { "description": "Scientific - Longest", "degenerate_bson": "1800000013640030303030303030303030303030FFFF8000", "canonical_bson": "18000000136400386B9ED104386B9ED104386B1E33008100", "canonical_extjson": "{\"d\" : {\"$numberDecimal\" : \"-1.036812917280316154812861194857272E-6015\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/document.json000066400000000000000000000043741511661753600257660ustar00rootroot00000000000000{ "description": "Document type (sub-documents)", "bson_type": "0x03", "test_key": "x", "valid": [ { "description": "Empty subdoc", "canonical_bson": "0D000000037800050000000000", "canonical_extjson": "{\"x\" : {}}" }, { "description": "Empty-string key subdoc", "canonical_bson": "150000000378000D00000002000200000062000000", "canonical_extjson": "{\"x\" : {\"\" : \"b\"}}" }, { "description": "Single-character key subdoc", "canonical_bson": "160000000378000E0000000261000200000062000000", "canonical_extjson": "{\"x\" : {\"a\" : \"b\"}}" }, { "description": "Dollar-prefixed key in sub-document", "canonical_bson": "170000000378000F000000022461000200000062000000", "canonical_extjson": "{\"x\" : {\"$a\" : \"b\"}}" }, { "description": "Dollar as key in sub-document", "canonical_bson": "160000000378000E0000000224000200000061000000", "canonical_extjson": "{\"x\" : {\"$\" : \"a\"}}" }, { "description": "Dotted key in sub-document", "canonical_bson": "180000000378001000000002612E62000200000063000000", "canonical_extjson": "{\"x\" : {\"a.b\" : \"c\"}}" }, { "description": "Dot as key in sub-document", "canonical_bson": "160000000378000E000000022E000200000061000000", "canonical_extjson": "{\"x\" : {\".\" : \"a\"}}" } ], "decodeErrors": [ { "description": "Subdocument length too long: eats outer terminator", "bson": "1800000003666F6F000F0000001062617200FFFFFF7F0000" }, { "description": "Subdocument length too short: leaks terminator", "bson": "1500000003666F6F000A0000000862617200010000" }, { "description": "Invalid subdocument: bad string length in field", "bson": "1C00000003666F6F001200000002626172000500000062617A000000" }, { "description": "Null byte in sub-document key", "bson": "150000000378000D00000010610000010000000000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/double.json000066400000000000000000000067071511661753600254240ustar00rootroot00000000000000{ "description": "Double type", "bson_type": "0x01", "test_key": "d", "valid": [ { "description": "+1.0", "canonical_bson": "10000000016400000000000000F03F00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.0\"}}", "relaxed_extjson": "{\"d\" : 1.0}" }, { "description": "-1.0", "canonical_bson": "10000000016400000000000000F0BF00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.0\"}}", "relaxed_extjson": "{\"d\" : -1.0}" }, { "description": "+1.0001220703125", "canonical_bson": "10000000016400000000008000F03F00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.0001220703125\"}}", "relaxed_extjson": "{\"d\" : 1.0001220703125}" }, { "description": "-1.0001220703125", "canonical_bson": "10000000016400000000008000F0BF00", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.0001220703125\"}}", "relaxed_extjson": "{\"d\" : -1.0001220703125}" }, { "description": "1.2345678921232E+18", "canonical_bson": "100000000164002a1bf5f41022b14300", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"1.2345678921232E+18\"}}", "relaxed_extjson": "{\"d\" : 1.2345678921232E+18}" }, { "description": "-1.2345678921232E+18", "canonical_bson": "100000000164002a1bf5f41022b1c300", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-1.2345678921232E+18\"}}", "relaxed_extjson": "{\"d\" : -1.2345678921232E+18}" }, { "description": "0.0", "canonical_bson": "10000000016400000000000000000000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"0.0\"}}", "relaxed_extjson": "{\"d\" : 0.0}" }, { "description": "-0.0", "canonical_bson": "10000000016400000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-0.0\"}}", "relaxed_extjson": "{\"d\" : -0.0}" }, { "description": "NaN", "canonical_bson": "10000000016400000000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "NaN with payload", "canonical_bson": "10000000016400120000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "Inf", "canonical_bson": "10000000016400000000000000F07F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}" }, { "description": "-Inf", "canonical_bson": "10000000016400000000000000F0FF00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}" } ], "decodeErrors": [ { "description": "double truncated", "bson": "0B0000000164000000F03F00" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/double2.json000066400000000000000000000031571511661753600255020ustar00rootroot00000000000000{ "description": "Double type", "bson_type": "0x01", "test_key": "d", "valid": [ { "description": "-0.0", "canonical_bson": "10000000016400000000000000008000", "canonical_extjson": "{\"d\" : {\"$numberDouble\": \"-0.0\"}}", "relaxed_extjson": "{\"d\" : -0.0}" }, { "description": "NaN", "canonical_bson": "10000000016400000000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "NaN with payload", "canonical_bson": "10000000016400120000000000F87F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"NaN\"}}", "lossy": true }, { "description": "Inf", "canonical_bson": "10000000016400000000000000F07F00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"Infinity\"}}" }, { "description": "-Inf", "canonical_bson": "10000000016400000000000000F0FF00", "canonical_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}", "relaxed_extjson": "{\"d\": {\"$numberDouble\": \"-Infinity\"}}" } ], "decodeErrors": [ { "description": "double truncated", "bson": "0B0000000164000000F03F00" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/int32.json000066400000000000000000000026271511661753600251060ustar00rootroot00000000000000{ "description": "Int32 type", "bson_type": "0x10", "test_key": "i", "valid": [ { "description": "MinValue", "canonical_bson": "0C0000001069000000008000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"-2147483648\"}}", "relaxed_extjson": "{\"i\" : -2147483648}" }, { "description": "MaxValue", "canonical_bson": "0C000000106900FFFFFF7F00", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"2147483647\"}}", "relaxed_extjson": "{\"i\" : 2147483647}" }, { "description": "-1", "canonical_bson": "0C000000106900FFFFFFFF00", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"-1\"}}", "relaxed_extjson": "{\"i\" : -1}" }, { "description": "0", "canonical_bson": "0C0000001069000000000000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"0\"}}", "relaxed_extjson": "{\"i\" : 0}" }, { "description": "1", "canonical_bson": "0C0000001069000100000000", "canonical_extjson": "{\"i\" : {\"$numberInt\": \"1\"}}", "relaxed_extjson": "{\"i\" : 1}" } ], "decodeErrors": [ { "description": "Bad int32 field length", "bson": "090000001061000500" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/int64.json000066400000000000000000000027621511661753600251130ustar00rootroot00000000000000{ "description": "Int64 type", "bson_type": "0x12", "test_key": "a", "valid": [ { "description": "MinValue", "canonical_bson": "10000000126100000000000000008000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"-9223372036854775808\"}}", "relaxed_extjson": "{\"a\" : -9223372036854775808}" }, { "description": "MaxValue", "canonical_bson": "10000000126100FFFFFFFFFFFFFF7F00", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"9223372036854775807\"}}", "relaxed_extjson": "{\"a\" : 9223372036854775807}" }, { "description": "-1", "canonical_bson": "10000000126100FFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"-1\"}}", "relaxed_extjson": "{\"a\" : -1}" }, { "description": "0", "canonical_bson": "10000000126100000000000000000000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"0\"}}", "relaxed_extjson": "{\"a\" : 0}" }, { "description": "1", "canonical_bson": "10000000126100010000000000000000", "canonical_extjson": "{\"a\" : {\"$numberLong\" : \"1\"}}", "relaxed_extjson": "{\"a\" : 1}" } ], "decodeErrors": [ { "description": "int64 field truncated", "bson": "0C0000001261001234567800" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/maxkey.json000066400000000000000000000004231511661753600254350ustar00rootroot00000000000000{ "description": "Maxkey type", "bson_type": "0x7F", "test_key": "a", "valid": [ { "description": "Maxkey", "canonical_bson": "080000007F610000", "canonical_extjson": "{\"a\" : {\"$maxKey\" : 1}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/minkey.json000066400000000000000000000004231511661753600254330ustar00rootroot00000000000000{ "description": "Minkey type", "bson_type": "0xFF", "test_key": "a", "valid": [ { "description": "Minkey", "canonical_bson": "08000000FF610000", "canonical_extjson": "{\"a\" : {\"$minKey\" : 1}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/multi-type-deprecated.json000066400000000000000000000124541511661753600303550ustar00rootroot00000000000000{ "description": "Multiple types within the same document", "bson_type": "0x00", "deprecated": true, "valid": [ { "description": "All BSON types", "canonical_bson": "38020000075F69640057E193D7A9CC81B4027498B50E53796D626F6C000700000073796D626F6C0002537472696E670007000000737472696E670010496E743332002A00000012496E743634002A0000000000000001446F75626C6500000000000000F0BF0542696E617279001000000003A34C38F7C3ABEDC8A37814A992AB8DB60542696E61727955736572446566696E656400050000008001020304050D436F6465000E00000066756E6374696F6E2829207B7D000F436F64655769746853636F7065001B0000000E00000066756E6374696F6E2829207B7D00050000000003537562646F63756D656E74001200000002666F6F0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696D657374616D7000010000002A0000000B5265676578007061747465726E0000094461746574696D6545706F6368000000000000000000094461746574696D65506F73697469766500FFFFFF7F00000000094461746574696D654E656761746976650000000080FFFFFFFF085472756500010846616C736500000C4442506F696E746572000B000000636F6C6C656374696F6E0057E193D7A9CC81B4027498B1034442526566003D0000000224726566000B000000636F6C6C656374696F6E00072469640057FD71E96E32AB4225B723FB02246462000900000064617461626173650000FF4D696E6B6579007F4D61786B6579000A4E756C6C0006556E646566696E65640000", "converted_bson": "48020000075f69640057e193d7a9cc81b4027498b50253796d626f6c000700000073796d626f6c0002537472696e670007000000737472696e670010496e743332002a00000012496e743634002a0000000000000001446f75626c6500000000000000f0bf0542696e617279001000000003a34c38f7c3abedc8a37814a992ab8db60542696e61727955736572446566696e656400050000008001020304050d436f6465000e00000066756e6374696f6e2829207b7d000f436f64655769746853636f7065001b0000000e00000066756e6374696f6e2829207b7d00050000000003537562646f63756d656e74001200000002666f6f0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696d657374616d7000010000002a0000000b5265676578007061747465726e0000094461746574696d6545706f6368000000000000000000094461746574696d65506f73697469766500ffffff7f00000000094461746574696d654e656761746976650000000080ffffffff085472756500010846616c73650000034442506f696e746572002b0000000224726566000b000000636f6c6c656374696f6e00072469640057e193d7a9cc81b4027498b100034442526566003d0000000224726566000b000000636f6c6c656374696f6e00072469640057fd71e96e32ab4225b723fb02246462000900000064617461626173650000ff4d696e6b6579007f4d61786b6579000a4e756c6c000a556e646566696e65640000", "canonical_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"Symbol\": {\"$symbol\": \"symbol\"}, \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBPointer\": {\"$dbPointer\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57e193d7a9cc81b4027498b1\"}}}, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null, \"Undefined\": {\"$undefined\": true}}", "converted_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"Symbol\": \"symbol\", \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBPointer\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57e193d7a9cc81b4027498b1\"}}, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null, \"Undefined\": null}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/multi-type.json000066400000000000000000000046451511661753600262620ustar00rootroot00000000000000{ "description": "Multiple types within the same document", "bson_type": "0x00", "valid": [ { "description": "All BSON types", "canonical_bson": "F4010000075F69640057E193D7A9CC81B4027498B502537472696E670007000000737472696E670010496E743332002A00000012496E743634002A0000000000000001446F75626C6500000000000000F0BF0542696E617279001000000003A34C38F7C3ABEDC8A37814A992AB8DB60542696E61727955736572446566696E656400050000008001020304050D436F6465000E00000066756E6374696F6E2829207B7D000F436F64655769746853636F7065001B0000000E00000066756E6374696F6E2829207B7D00050000000003537562646F63756D656E74001200000002666F6F0004000000626172000004417272617900280000001030000100000010310002000000103200030000001033000400000010340005000000001154696D657374616D7000010000002A0000000B5265676578007061747465726E0000094461746574696D6545706F6368000000000000000000094461746574696D65506F73697469766500FFFFFF7F00000000094461746574696D654E656761746976650000000080FFFFFFFF085472756500010846616C73650000034442526566003D0000000224726566000B000000636F6C6C656374696F6E00072469640057FD71E96E32AB4225B723FB02246462000900000064617461626173650000FF4D696E6B6579007F4D61786B6579000A4E756C6C0000", "canonical_extjson": "{\"_id\": {\"$oid\": \"57e193d7a9cc81b4027498b5\"}, \"String\": \"string\", \"Int32\": {\"$numberInt\": \"42\"}, \"Int64\": {\"$numberLong\": \"42\"}, \"Double\": {\"$numberDouble\": \"-1.0\"}, \"Binary\": { \"$binary\" : {\"base64\": \"o0w498Or7cijeBSpkquNtg==\", \"subType\": \"03\"}}, \"BinaryUserDefined\": { \"$binary\" : {\"base64\": \"AQIDBAU=\", \"subType\": \"80\"}}, \"Code\": {\"$code\": \"function() {}\"}, \"CodeWithScope\": {\"$code\": \"function() {}\", \"$scope\": {}}, \"Subdocument\": {\"foo\": \"bar\"}, \"Array\": [{\"$numberInt\": \"1\"}, {\"$numberInt\": \"2\"}, {\"$numberInt\": \"3\"}, {\"$numberInt\": \"4\"}, {\"$numberInt\": \"5\"}], \"Timestamp\": {\"$timestamp\": {\"t\": 42, \"i\": 1}}, \"Regex\": {\"$regularExpression\": {\"pattern\": \"pattern\", \"options\": \"\"}}, \"DatetimeEpoch\": {\"$date\": {\"$numberLong\": \"0\"}}, \"DatetimePositive\": {\"$date\": {\"$numberLong\": \"2147483647\"}}, \"DatetimeNegative\": {\"$date\": {\"$numberLong\": \"-2147483648\"}}, \"True\": true, \"False\": false, \"DBRef\": {\"$ref\": \"collection\", \"$id\": {\"$oid\": \"57fd71e96e32ab4225b723fb\"}, \"$db\": \"database\"}, \"Minkey\": {\"$minKey\": 1}, \"Maxkey\": {\"$maxKey\": 1}, \"Null\": null}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/null.json000066400000000000000000000004021511661753600251060ustar00rootroot00000000000000{ "description": "Null type", "bson_type": "0x0A", "test_key": "a", "valid": [ { "description": "Null", "canonical_bson": "080000000A610000", "canonical_extjson": "{\"a\" : null}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/oid.json000066400000000000000000000016221511661753600247140ustar00rootroot00000000000000{ "description": "ObjectId", "bson_type": "0x07", "test_key": "a", "valid": [ { "description": "All zeroes", "canonical_bson": "1400000007610000000000000000000000000000", "canonical_extjson": "{\"a\" : {\"$oid\" : \"000000000000000000000000\"}}" }, { "description": "All ones", "canonical_bson": "14000000076100FFFFFFFFFFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$oid\" : \"ffffffffffffffffffffffff\"}}" }, { "description": "Random", "canonical_bson": "1400000007610056E1FC72E0C917E9C471416100", "canonical_extjson": "{\"a\" : {\"$oid\" : \"56e1fc72e0c917e9c4714161\"}}" } ], "decodeErrors": [ { "description": "OID truncated", "bson": "1200000007610056E1FC72E0C917E9C471" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/regex.json000066400000000000000000000062011511661753600252510ustar00rootroot00000000000000{ "description": "Regular Expression type", "bson_type": "0x0B", "test_key": "a", "valid": [ { "description": "empty regex with no options", "canonical_bson": "0A0000000B6100000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"\", \"options\" : \"\"}}}" }, { "description": "regex without options", "canonical_bson": "0D0000000B6100616263000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"\"}}}" }, { "description": "regex with options", "canonical_bson": "0F0000000B610061626300696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"im\"}}}" }, { "description": "regex with options (keys reversed)", "canonical_bson": "0F0000000B610061626300696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"im\"}}}", "degenerate_extjson": "{\"a\" : {\"$regularExpression\" : {\"options\" : \"im\", \"pattern\": \"abc\"}}}" }, { "description": "regex with slash", "canonical_bson": "110000000B610061622F636400696D0000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"ab/cd\", \"options\" : \"im\"}}}" }, { "description": "flags not alphabetized", "degenerate_bson": "100000000B6100616263006D69780000", "canonical_bson": "100000000B610061626300696D780000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"imx\"}}}", "degenerate_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"abc\", \"options\" : \"mix\"}}}" }, { "description" : "Required escapes", "canonical_bson" : "100000000B610061625C226162000000", "canonical_extjson": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"ab\\\\\\\"ab\", \"options\" : \"\"}}}" }, { "description" : "Regular expression as value of $regex query operator", "canonical_bson" : "180000000B247265676578007061747465726E0069780000", "canonical_extjson": "{\"$regex\" : {\"$regularExpression\" : { \"pattern\": \"pattern\", \"options\" : \"ix\"}}}" }, { "description" : "Regular expression as value of $regex query operator with $options", "canonical_bson" : "270000000B247265676578007061747465726E000002246F7074696F6E73000300000069780000", "canonical_extjson": "{\"$regex\" : {\"$regularExpression\" : { \"pattern\": \"pattern\", \"options\" : \"\"}}, \"$options\" : \"ix\"}" } ], "decodeErrors": [ { "description": "Null byte in pattern string", "bson": "0F0000000B610061006300696D0000" }, { "description": "Null byte in flags string", "bson": "100000000B61006162630069006D0000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/string.json000066400000000000000000000053741511661753600254570ustar00rootroot00000000000000{ "description": "String", "bson_type": "0x02", "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D000000026100010000000000", "canonical_extjson": "{\"a\" : \"\"}" }, { "description": "Single character", "canonical_bson": "0E00000002610002000000620000", "canonical_extjson": "{\"a\" : \"b\"}" }, { "description": "Multi-character", "canonical_bson": "190000000261000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\" : \"abababababab\"}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\" : \"\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\\u00e9\"}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000261000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\" : \"\\u2606\\u2606\\u2606\\u2606\"}" }, { "description": "Embedded nulls", "canonical_bson": "190000000261000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\" : \"ab\\u0000bab\\u0000babab\"}" }, { "description": "Required escapes", "canonical_bson" : "320000000261002600000061625C220102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F61620000", "canonical_extjson" : "{\"a\":\"ab\\\\\\\"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001fab\"}" } ], "decodeErrors": [ { "description": "bad string length: 0 (but no 0x00 either)", "bson": "0C0000000261000000000000" }, { "description": "bad string length: -1", "bson": "0C000000026100FFFFFFFF00" }, { "description": "bad string length: eats terminator", "bson": "10000000026100050000006200620000" }, { "description": "bad string length: longer than rest of document", "bson": "120000000200FFFFFF00666F6F6261720000" }, { "description": "string is not null-terminated", "bson": "1000000002610004000000616263FF00" }, { "description": "empty string, but extra null", "bson": "0E00000002610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E00000002610002000000E90000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/symbol.json000066400000000000000000000062401511661753600254470ustar00rootroot00000000000000{ "description": "Symbol", "bson_type": "0x0E", "deprecated": true, "test_key": "a", "valid": [ { "description": "Empty string", "canonical_bson": "0D0000000E6100010000000000", "canonical_extjson": "{\"a\": {\"$symbol\": \"\"}}", "converted_bson": "0D000000026100010000000000", "converted_extjson": "{\"a\": \"\"}" }, { "description": "Single character", "canonical_bson": "0E0000000E610002000000620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"b\"}}", "converted_bson": "0E00000002610002000000620000", "converted_extjson": "{\"a\": \"b\"}" }, { "description": "Multi-character", "canonical_bson": "190000000E61000D0000006162616261626162616261620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"abababababab\"}}", "converted_bson": "190000000261000D0000006162616261626162616261620000", "converted_extjson": "{\"a\": \"abababababab\"}" }, { "description": "two-byte UTF-8 (\u00e9)", "canonical_bson": "190000000E61000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "canonical_extjson": "{\"a\": {\"$symbol\": \"éééééé\"}}", "converted_bson": "190000000261000D000000C3A9C3A9C3A9C3A9C3A9C3A90000", "converted_extjson": "{\"a\": \"éééééé\"}" }, { "description": "three-byte UTF-8 (\u2606)", "canonical_bson": "190000000E61000D000000E29886E29886E29886E298860000", "canonical_extjson": "{\"a\": {\"$symbol\": \"☆☆☆☆\"}}", "converted_bson": "190000000261000D000000E29886E29886E29886E298860000", "converted_extjson": "{\"a\": \"☆☆☆☆\"}" }, { "description": "Embedded nulls", "canonical_bson": "190000000E61000D0000006162006261620062616261620000", "canonical_extjson": "{\"a\": {\"$symbol\": \"ab\\u0000bab\\u0000babab\"}}", "converted_bson": "190000000261000D0000006162006261620062616261620000", "converted_extjson": "{\"a\": \"ab\\u0000bab\\u0000babab\"}" } ], "decodeErrors": [ { "description": "bad symbol length: 0 (but no 0x00 either)", "bson": "0C0000000E61000000000000" }, { "description": "bad symbol length: -1", "bson": "0C0000000E6100FFFFFFFF00" }, { "description": "bad symbol length: eats terminator", "bson": "100000000E6100050000006200620000" }, { "description": "bad symbol length: longer than rest of document", "bson": "120000000E00FFFFFF00666F6F6261720000" }, { "description": "symbol is not null-terminated", "bson": "100000000E610004000000616263FF00" }, { "description": "empty symbol, but extra null", "bson": "0E0000000E610001000000000000" }, { "description": "invalid UTF-8", "bson": "0E0000000E610002000000E90000" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/timestamp.json000066400000000000000000000026651511661753600261540ustar00rootroot00000000000000{ "description": "Timestamp type", "bson_type": "0x11", "test_key": "a", "valid": [ { "description": "Timestamp: (123456789, 42)", "canonical_bson": "100000001161002A00000015CD5B0700", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : 42} } }" }, { "description": "Timestamp: (123456789, 42) (keys reversed)", "canonical_bson": "100000001161002A00000015CD5B0700", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : 42} } }", "degenerate_extjson": "{\"a\" : {\"$timestamp\" : {\"i\" : 42, \"t\" : 123456789} } }" }, { "description": "Timestamp with high-order bit set on both seconds and increment", "canonical_bson": "10000000116100FFFFFFFFFFFFFFFF00", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4294967295, \"i\" : 4294967295} } }" }, { "description": "Timestamp with high-order bit set on both seconds and increment (not UINT32_MAX)", "canonical_bson": "1000000011610000286BEE00286BEE00", "canonical_extjson": "{\"a\" : {\"$timestamp\" : {\"t\" : 4000000000, \"i\" : 4000000000} } }" } ], "decodeErrors": [ { "description": "Truncated timestamp field", "bson": "0f0000001161002A00000015CD5B00" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/top-mongoc.json000066400000000000000000000010461511661753600262230ustar00rootroot00000000000000{ "description": "Top-level document validity - libmongoc-specific tests. TODO (CDRIVER-4016) move this file.", "bson_type": "0x00", "valid": [], "decodeErrors": [], "parseErrors": [ { "description": "Null byte in legacy $regex string", "string": "{\"a\" : {\"$regex\" : \"b\\u0000\", \"$options\" : \"i\"}}" }, { "description": "Null byte in legacy $options string", "string": "{\"a\" : {\"$regex\" : \"b\", \"$options\" : \"i\\u0000\"}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/top.json000066400000000000000000000246401511661753600247500ustar00rootroot00000000000000{ "description": "Top-level document validity", "bson_type": "0x00", "valid": [ { "description": "Dollar-prefixed key in top-level document", "canonical_bson": "0F00000010246B6579002A00000000", "canonical_extjson": "{\"$key\": {\"$numberInt\": \"42\"}}" }, { "description": "Dollar as key in top-level document", "canonical_bson": "0E00000002240002000000610000", "canonical_extjson": "{\"$\": \"a\"}" }, { "description": "Dotted key in top-level document", "canonical_bson": "1000000002612E620002000000630000", "canonical_extjson": "{\"a.b\": \"c\"}" }, { "description": "Dot as key in top-level document", "canonical_bson": "0E000000022E0002000000610000", "canonical_extjson": "{\".\": \"a\"}" } ], "decodeErrors": [ { "description": "An object size that's too small to even include the object size, but is a well-formed, empty object", "bson": "0100000000" }, { "description": "An object size that's only enough for the object size, but is a well-formed, empty object", "bson": "0400000000" }, { "description": "One object, with length shorter than size (missing EOO)", "bson": "05000000" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0x01", "bson": "0500000001" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0xff", "bson": "05000000FF" }, { "description": "One object, sized correctly, with a spot for an EOO, but the EOO is 0x70", "bson": "0500000070" }, { "description": "Byte count is zero (with non-zero input length)", "bson": "00000000000000000000" }, { "description": "Stated length exceeds byte count, with truncated document", "bson": "1200000002666F6F0004000000626172" }, { "description": "Stated length less than byte count, with garbage after envelope", "bson": "1200000002666F6F00040000006261720000DEADBEEF" }, { "description": "Stated length exceeds byte count, with valid envelope", "bson": "1300000002666F6F00040000006261720000" }, { "description": "Stated length less than byte count, with valid envelope", "bson": "1100000002666F6F00040000006261720000" }, { "description": "Invalid BSON type low range", "bson": "07000000000000" }, { "description": "Invalid BSON type high range", "bson": "07000000800000" }, { "description": "Document truncated mid-key", "bson": "1200000002666F" }, { "description": "Null byte in document key", "bson": "0D000000107800000100000000" } ], "parseErrors": [ { "description" : "Bad $regularExpression (extra field)", "string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\", \"options\": \"\", \"unrelated\": true}}}" }, { "description" : "Bad $regularExpression (missing options field)", "string" : "{\"a\" : {\"$regularExpression\": {\"pattern\": \"abc\"}}}" }, { "description": "Bad $regularExpression (pattern is number, not string)", "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": 42, \"options\" : \"\"}}}" }, { "description": "Bad $regularExpression (options are number, not string)", "string": "{\"x\" : {\"$regularExpression\" : { \"pattern\": \"a\", \"options\" : 0}}}" }, { "description" : "Bad $regularExpression (missing pattern field)", "string" : "{\"a\" : {\"$regularExpression\": {\"options\":\"ix\"}}}" }, { "description": "Bad $oid (number, not string)", "string": "{\"a\" : {\"$oid\" : 42}}" }, { "description": "Bad $oid (extra field)", "string": "{\"a\" : {\"$oid\" : \"56e1fc72e0c917e9c4714161\", \"unrelated\": true}}" }, { "description": "Bad $numberInt (number, not string)", "string": "{\"a\" : {\"$numberInt\" : 42}}" }, { "description": "Bad $numberInt (extra field)", "string": "{\"a\" : {\"$numberInt\" : \"42\", \"unrelated\": true}}" }, { "description": "Bad $numberLong (number, not string)", "string": "{\"a\" : {\"$numberLong\" : 42}}" }, { "description": "Bad $numberLong (extra field)", "string": "{\"a\" : {\"$numberLong\" : \"42\", \"unrelated\": true}}" }, { "description": "Bad $numberDouble (number, not string)", "string": "{\"a\" : {\"$numberDouble\" : 42}}" }, { "description": "Bad $numberDouble (extra field)", "string": "{\"a\" : {\"$numberDouble\" : \".1\", \"unrelated\": true}}" }, { "description": "Bad $numberDecimal (number, not string)", "string": "{\"a\" : {\"$numberDecimal\" : 42}}" }, { "description": "Bad $numberDecimal (extra field)", "string": "{\"a\" : {\"$numberDecimal\" : \".1\", \"unrelated\": true}}" }, { "description": "Bad $binary (binary is number, not string)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : 0, \"subType\" : \"00\"}}}" }, { "description": "Bad $binary (type is number, not string)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"\", \"subType\" : 0}}}" }, { "description": "Bad $binary (missing $type)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"//8=\"}}}" }, { "description": "Bad $binary (missing $binary)", "string": "{\"x\" : {\"$binary\" : {\"subType\" : \"00\"}}}" }, { "description": "Bad $binary (extra field)", "string": "{\"x\" : {\"$binary\" : {\"base64\" : \"//8=\", \"subType\" : 0, \"unrelated\": true}}}" }, { "description": "Bad $code (type is number, not string)", "string": "{\"a\" : {\"$code\" : 42}}" }, { "description": "Bad $code (type is number, not string) when $scope is also present", "string": "{\"a\" : {\"$code\" : 42, \"$scope\" : {}}}" }, { "description": "Bad $code (extra field)", "string": "{\"a\" : {\"$code\" : \"\", \"unrelated\": true}}" }, { "description": "Bad $code with $scope (scope is number, not doc)", "string": "{\"x\" : {\"$code\" : \"\", \"$scope\" : 42}}" }, { "description": "Bad $timestamp (type is number, not doc)", "string": "{\"a\" : {\"$timestamp\" : 42} }" }, { "description": "Bad $timestamp ('t' type is string, not number)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : 42} } }" }, { "description": "Bad $timestamp ('i' type is string, not number)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : 123456789, \"i\" : \"42\"} } }" }, { "description": "Bad $timestamp (extra field at same level as $timestamp)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : \"42\"}, \"unrelated\": true } }" }, { "description": "Bad $timestamp (extra field at same level as t and i)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\", \"i\" : \"42\", \"unrelated\": true} } }" }, { "description": "Bad $timestamp (missing t)", "string": "{\"a\" : {\"$timestamp\" : {\"i\" : \"42\"} } }" }, { "description": "Bad $timestamp (missing i)", "string": "{\"a\" : {\"$timestamp\" : {\"t\" : \"123456789\"} } }" }, { "description": "Bad $date (number, not string or hash)", "string": "{\"a\" : {\"$date\" : 42}}" }, { "description": "Bad $date (extra field)", "string": "{\"a\" : {\"$date\" : {\"$numberLong\" : \"1356351330501\"}, \"unrelated\": true}}" }, { "description": "Bad $minKey (boolean, not integer)", "string": "{\"a\" : {\"$minKey\" : true}}" }, { "description": "Bad $minKey (wrong integer)", "string": "{\"a\" : {\"$minKey\" : 0}}" }, { "description": "Bad $minKey (extra field)", "string": "{\"a\" : {\"$minKey\" : 1, \"unrelated\": true}}" }, { "description": "Bad $maxKey (boolean, not integer)", "string": "{\"a\" : {\"$maxKey\" : true}}" }, { "description": "Bad $maxKey (wrong integer)", "string": "{\"a\" : {\"$maxKey\" : 0}}" }, { "description": "Bad $maxKey (extra field)", "string": "{\"a\" : {\"$maxKey\" : 1, \"unrelated\": true}}" }, { "description": "Bad DBpointer (extra field)", "string": "{\"a\": {\"$dbPointer\": {\"a\": {\"$numberInt\": \"1\"}, \"$id\": {\"$oid\": \"56e1fc72e0c917e9c4714161\"}, \"c\": {\"$numberInt\": \"2\"}, \"$ref\": \"b\"}}}" }, { "description" : "Null byte in document key", "string" : "{\"a\\u0000\": 1 }" }, { "description" : "Null byte in sub-document key", "string" : "{\"a\" : {\"b\\u0000\": 1 }}" }, { "description": "Null byte in $regularExpression pattern", "string": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"b\\u0000\", \"options\" : \"i\"}}}" }, { "description": "Null byte in $regularExpression options", "string": "{\"a\" : {\"$regularExpression\" : { \"pattern\": \"b\", \"options\" : \"i\\u0000\"}}}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/bson_corpus/undefined.json000066400000000000000000000006511511661753600261030ustar00rootroot00000000000000{ "description": "Undefined type (deprecated)", "bson_type": "0x06", "deprecated": true, "test_key": "a", "valid": [ { "description": "Undefined", "canonical_bson": "0800000006610000", "canonical_extjson": "{\"a\" : {\"$undefined\" : true}}", "converted_bson": "080000000A610000", "converted_extjson": "{\"a\" : null}" } ] } mongo-c-driver-2.2.1/src/libbson/tests/json/test.json000066400000000000000000000001051511661753600225570ustar00rootroot00000000000000{"foo": "bar", "a": 1} {"_id": {"$oid": "aabbccddeeff001122334455"}} mongo-c-driver-2.2.1/src/libbson/tests/test-b64.c000066400000000000000000000104561511661753600214620ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include static void _test_encode_helper(char *input, size_t input_len, char *expected_output, int expected_output_len) { char *output; size_t target_size; int ret; target_size = mcommon_b64_ntop_calculate_target_size(input_len); output = bson_malloc(target_size); /* bson_ntop_calculate_target_size includes trailing NULL. */ ASSERT_CMPSIZE_T(target_size, ==, (size_t)expected_output_len + 1); /* returned value does not count trailing NULL. */ ret = mcommon_b64_ntop((uint8_t *)input, input_len, output, target_size); ASSERT(mlib_cmp(target_size - 1u, ==, ret)); ASSERT_CMPSTR(output, expected_output); bson_free(output); } static void test_bson_b64_encode(void) { char output[32]; int ret; _test_encode_helper("", 0, "", 0); _test_encode_helper("f", 1, "Zg==", 4); _test_encode_helper("fo", 2, "Zm8=", 4); _test_encode_helper("foo", 3, "Zm9v", 4); _test_encode_helper("foob", 4, "Zm9vYg==", 8); _test_encode_helper("fooba", 5, "Zm9vYmE=", 8); _test_encode_helper("foobar", 6, "Zm9vYmFy", 8); /* Even on empty input, the output is still NULL terminated. */ output[0] = 'a'; ret = mcommon_b64_ntop((uint8_t *)"", 0, output, 1); ASSERT_CMPINT(ret, ==, 0); BSON_ASSERT(output[0] == '\0'); /* Test NULL input. */ ret = mcommon_b64_ntop(NULL, 0, output, 32); ASSERT_CMPINT(0, ==, ret); BSON_ASSERT(output[0] == '\0'); /* Test NULL output */ ret = mcommon_b64_ntop(NULL, 0, NULL, 0); ASSERT_CMPINT(-1, ==, ret); /* Test output not large enough. */ ret = mcommon_b64_ntop((uint8_t *)"test", 4, output, 1); ASSERT_CMPINT(-1, ==, ret); } static void _test_decode_helper(char *input, char *expected_output, int expected_calculated_target_size, int expected_output_len) { uint8_t *output; size_t target_size; int exact_target_size; int ret; target_size = mcommon_b64_pton_calculate_target_size(strlen(input)); output = bson_malloc(target_size); /* bson_malloc returns NULL if requesting 0 bytes, memcmp expects non-NULL. */ if (target_size == 0) { output = bson_malloc(1); } /* Calling mcommon_b64_pton with a NULL output is valid, and * returns the exact target size. */ exact_target_size = mcommon_b64_pton(input, NULL, 0); ASSERT_CMPINT(exact_target_size, ==, expected_output_len); ASSERT_CMPSIZE_T(target_size, ==, (size_t)expected_calculated_target_size); ret = mcommon_b64_pton(input, output, target_size); ASSERT_CMPINT(expected_output_len, ==, ret); BSON_ASSERT(0 == memcmp(output, expected_output, ret)); bson_free(output); } static void test_bson_b64_decode(void) { uint8_t output[32]; int ret; _test_decode_helper("", "", 0, 0); _test_decode_helper("Zg==", "f", 3, 1); _test_decode_helper("Zm8=", "fo", 3, 2); _test_decode_helper("Zm9v", "foo", 3, 3); _test_decode_helper("Zm9vYg==", "foob", 6, 4); _test_decode_helper("Zm9vYmE=", "fooba", 6, 5); _test_decode_helper("Zm9vYmFy", "foobar", 6, 6); /* Test NULL input. */ ret = mcommon_b64_pton(NULL, output, 32); ASSERT_CMPINT(ret, ==, -1); /* Test NULL output. */ ret = mcommon_b64_pton("Zm8=", NULL, 0); /* The return value is actually the number of bytes for output. */ ASSERT_CMPINT(ret, ==, 2); /* Test output not large enough. */ ret = mcommon_b64_pton("Zm9vYmFy", output, 1); ASSERT_CMPINT(ret, ==, -1); /* Test malformed base64 */ ret = mcommon_b64_pton("bad!", output, 32); ASSERT_CMPINT(ret, ==, -1); } void test_b64_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/b64/encode", test_bson_b64_encode); TestSuite_Add(suite, "/bson/b64/decode", test_bson_b64_decode); } mongo-c-driver-2.2.1/src/libbson/tests/test-bcon-basic.c000066400000000000000000000313761511661753600230730ustar00rootroot00000000000000#include #include static void test_utf8(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_utf8(&expected, "hello", -1, "world", -1); BCON_APPEND(&bcon, "hello", "world"); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_double(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_double(&expected, "foo", -1, 1.1); BCON_APPEND(&bcon, "foo", BCON_DOUBLE(1.1)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_decimal128(void) { bson_t bcon, expected; bson_decimal128_t dec; bson_decimal128_from_string("120E20", &dec); bson_init(&bcon); bson_init(&expected); bson_append_decimal128(&expected, "foo", -1, &dec); BCON_APPEND(&bcon, "foo", BCON_DECIMAL128(&dec)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_binary(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_binary(&expected, "foo", -1, BSON_SUBTYPE_BINARY, (uint8_t *)"deadbeef", 8); BCON_APPEND(&bcon, "foo", BCON_BIN(BSON_SUBTYPE_BINARY, (const uint8_t *)"deadbeef", 8), NULL); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_undefined(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_undefined(&expected, "foo", -1); BCON_APPEND(&bcon, "foo", BCON_UNDEFINED); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_oid(void) { bson_t bcon, expected; bson_oid_t oid; bson_init(&bcon); bson_init(&expected); bson_oid_init(&oid, NULL); bson_append_oid(&expected, "foo", -1, &oid); BCON_APPEND(&bcon, "foo", BCON_OID(&oid)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_bool(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_bool(&expected, "foo", -1, 1); BCON_APPEND(&bcon, "foo", BCON_BOOL(1)); bson_eq_bson(&bcon, &expected); bson_reinit(&bcon); bson_reinit(&expected); bson_append_bool(&expected, "foo", -1, 0); BCON_APPEND(&bcon, "foo", BCON_BOOL(0)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_date_time(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_date_time(&expected, "foo", -1, 10000); BCON_APPEND(&bcon, "foo", BCON_DATE_TIME(10000)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_null(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_null(&expected, "foo", -1); BCON_APPEND(&bcon, "foo", BCON_NULL); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_regex(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); /* option flags are sorted */ bson_append_regex(&expected, "foo", -1, "^foo|bar$", "mis"); BCON_APPEND(&bcon, "foo", BCON_REGEX("^foo|bar$", "msi")); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_dbpointer(void) { bson_t bcon, expected; bson_oid_t oid; bson_init(&bcon); bson_init(&expected); bson_oid_init(&oid, NULL); bson_append_dbpointer(&expected, "foo", -1, "collection", &oid); BCON_APPEND(&bcon, "foo", BCON_DBPOINTER("collection", &oid)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_code(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_code(&expected, "foo", -1, "var a = {};"); BCON_APPEND(&bcon, "foo", BCON_CODE("var a = {};")); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_symbol(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_symbol(&expected, "foo", -1, "deadbeef", -1); BCON_APPEND(&bcon, "foo", BCON_SYMBOL("deadbeef")); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_codewscope(void) { bson_t bcon, expected, scope; bson_init(&bcon); bson_init(&expected); bson_init(&scope); bson_append_int32(&scope, "b", -1, 10); bson_append_code_with_scope(&expected, "foo", -1, "var a = b;", &scope); BCON_APPEND(&bcon, "foo", BCON_CODEWSCOPE("var a = b;", &scope)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&scope); } static void test_int32(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_int32(&expected, "foo", -1, 100); BCON_APPEND(&bcon, "foo", BCON_INT32(100)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_timestamp(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_timestamp(&expected, "foo", -1, 100, 1000); BCON_APPEND(&bcon, "foo", BCON_TIMESTAMP(100, 1000)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_int64(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_int64(&expected, "foo", -1, 100); BCON_APPEND(&bcon, "foo", BCON_INT64(100)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_maxkey(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_maxkey(&expected, "foo", -1); BCON_APPEND(&bcon, "foo", BCON_MAXKEY); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_minkey(void) { bson_t bcon, expected; bson_init(&bcon); bson_init(&expected); bson_append_minkey(&expected, "foo", -1); BCON_APPEND(&bcon, "foo", BCON_MINKEY); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_bson_document(void) { bson_t bcon, expected, child; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_append_utf8(&child, "bar", -1, "baz", -1); bson_append_document(&expected, "foo", -1, &child); BCON_APPEND(&bcon, "foo", BCON_DOCUMENT(&child)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&child); } static void test_bson_array(void) { bson_t bcon, expected, child; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_append_utf8(&child, "0", -1, "baz", -1); bson_append_array(&expected, "foo", -1, &child); BCON_APPEND(&bcon, "foo", BCON_ARRAY(&child)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&child); } static void test_inline_array(void) { bson_t bcon, expected, child; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_append_utf8(&child, "0", -1, "baz", -1); bson_append_array(&expected, "foo", -1, &child); BCON_APPEND(&bcon, "foo", "[", "baz", "]"); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&child); bson_destroy(&expected); } static void test_inline_doc(void) { bson_t bcon, expected, child; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_append_utf8(&child, "bar", -1, "baz", -1); bson_append_document(&expected, "foo", -1, &child); BCON_APPEND(&bcon, "foo", "{", "bar", "baz", "}"); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&child); } static void test_inline_nested(void) { bson_t bcon, expected, foo, bar, third; bson_init(&bcon); bson_init(&expected); bson_init(&foo); bson_init(&bar); bson_init(&third); bson_append_utf8(&third, "hello", -1, "world", -1); bson_append_int32(&bar, "0", -1, 1); bson_append_int32(&bar, "1", -1, 2); bson_append_document(&bar, "2", -1, &third); bson_append_array(&foo, "bar", -1, &bar); bson_append_document(&expected, "foo", -1, &foo); BCON_APPEND(&bcon, "foo", "{", "bar", "[", BCON_INT32(1), BCON_INT32(2), "{", "hello", "world", "}", "]", "}"); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&foo); bson_destroy(&bar); bson_destroy(&third); } static void test_concat(void) { bson_t bcon, expected, child, child2; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_init(&child2); bson_append_utf8(&child, "hello", -1, "world", -1); bson_append_document(&expected, "foo", -1, &child); BCON_APPEND(&bcon, "foo", "{", BCON(&child), "}"); bson_eq_bson(&bcon, &expected); bson_reinit(&bcon); bson_reinit(&expected); bson_reinit(&child); bson_append_utf8(&child, "0", -1, "bar", -1); bson_append_utf8(&child, "1", -1, "baz", -1); bson_append_array(&expected, "foo", -1, &child); bson_append_utf8(&child2, "0", -1, "baz", -1); BCON_APPEND(&bcon, "foo", "[", "bar", BCON(&child2), "]"); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&child); bson_destroy(&child2); bson_destroy(&expected); } static void test_iter(void) { bson_t bcon, expected; bson_iter_t iter; bson_init(&bcon); bson_init(&expected); bson_append_int32(&expected, "foo", -1, 100); bson_iter_init_find(&iter, &expected, "foo"); BCON_APPEND(&bcon, "foo", BCON_ITER(&iter)); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); } static void test_bcon_new(void) { bson_t expected; bson_t *bcon; bson_init(&expected); bson_append_utf8(&expected, "hello", -1, "world", -1); bcon = BCON_NEW("hello", "world"); bson_eq_bson(bcon, &expected); bson_destroy(bcon); bson_destroy(&expected); } static void test_append_ctx_helper(bson_t *bson, ...) { va_list ap; bcon_append_ctx_t ctx; bcon_append_ctx_init(&ctx); va_start(ap, bson); bcon_append_ctx_va(bson, &ctx, &ap); va_arg(ap, char *); BCON_APPEND_CTX(bson, &ctx, "c", "d"); bcon_append_ctx_va(bson, &ctx, &ap); va_end(ap); } static void test_append_ctx(void) { bson_t bcon, expected, child; bson_init(&bcon); bson_init(&expected); bson_init(&child); bson_append_utf8(&child, "c", -1, "d", -1); bson_append_utf8(&child, "e", -1, "f", -1); bson_append_document(&expected, "a", -1, &child); test_append_ctx_helper(&bcon, "a", "{", NULL, "add magic", "e", "f", "}", NULL); bson_eq_bson(&bcon, &expected); bson_destroy(&bcon); bson_destroy(&expected); bson_destroy(&child); } void test_bcon_basic_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/bcon/test_utf8", test_utf8); TestSuite_Add(suite, "/bson/bcon/test_double", test_double); TestSuite_Add(suite, "/bson/bcon/test_binary", test_binary); TestSuite_Add(suite, "/bson/bcon/test_undefined", test_undefined); TestSuite_Add(suite, "/bson/bcon/test_oid", test_oid); TestSuite_Add(suite, "/bson/bcon/test_bool", test_bool); TestSuite_Add(suite, "/bson/bcon/test_date_time", test_date_time); TestSuite_Add(suite, "/bson/bcon/test_null", test_null); TestSuite_Add(suite, "/bson/bcon/test_regex", test_regex); TestSuite_Add(suite, "/bson/bcon/test_dbpointer", test_dbpointer); TestSuite_Add(suite, "/bson/bcon/test_code", test_code); TestSuite_Add(suite, "/bson/bcon/test_symbol", test_symbol); TestSuite_Add(suite, "/bson/bcon/test_codewscope", test_codewscope); TestSuite_Add(suite, "/bson/bcon/test_int32", test_int32); TestSuite_Add(suite, "/bson/bcon/test_timestamp", test_timestamp); TestSuite_Add(suite, "/bson/bcon/test_int64", test_int64); TestSuite_Add(suite, "/bson/bcon/test_decimal128", test_decimal128); TestSuite_Add(suite, "/bson/bcon/test_maxkey", test_maxkey); TestSuite_Add(suite, "/bson/bcon/test_minkey", test_minkey); TestSuite_Add(suite, "/bson/bcon/test_bson_document", test_bson_document); TestSuite_Add(suite, "/bson/bcon/test_bson_array", test_bson_array); TestSuite_Add(suite, "/bson/bcon/test_inline_array", test_inline_array); TestSuite_Add(suite, "/bson/bcon/test_inline_doc", test_inline_doc); TestSuite_Add(suite, "/bson/bcon/test_inline_nested", test_inline_nested); TestSuite_Add(suite, "/bson/bcon/test_concat", test_concat); TestSuite_Add(suite, "/bson/bcon/test_iter", test_iter); TestSuite_Add(suite, "/bson/bcon/test_bcon_new", test_bcon_new); TestSuite_Add(suite, "/bson/bcon/test_append_ctx", test_append_ctx); } mongo-c-driver-2.2.1/src/libbson/tests/test-bcon-extract.c000066400000000000000000000242121511661753600234530ustar00rootroot00000000000000#include #include static void test_utf8(void) { const char *val; bson_t *bcon = BCON_NEW("hello", "world"); BSON_ASSERT(BCON_EXTRACT(bcon, "hello", BCONE_UTF8(val))); BSON_ASSERT(strcmp(val, "world") == 0); bson_destroy(bcon); } static void test_double(void) { double val; bson_t *bcon = BCON_NEW("foo", BCON_DOUBLE(1.1)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_DOUBLE(val))); BSON_ASSERT(val == 1.1); bson_destroy(bcon); } static void test_decimal128(void) { bson_decimal128_t val = {0}; bson_decimal128_t dec = {0}; bson_t *bcon = NULL; bson_decimal128_from_string("12", &dec); bcon = BCON_NEW("foo", BCON_DECIMAL128(&dec)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_DECIMAL128(val))); BSON_ASSERT(val.low == 0xCULL); BSON_ASSERT(val.high == 0x3040000000000000ULL); bson_destroy(bcon); } static void test_binary(void) { bson_subtype_t subtype; uint32_t len; const uint8_t *binary; bson_t *bcon = BCON_NEW("foo", BCON_BIN(BSON_SUBTYPE_BINARY, (uint8_t *)"deadbeef", 8)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_BIN(subtype, binary, len))); BSON_ASSERT(subtype == BSON_SUBTYPE_BINARY); BSON_ASSERT(len == 8); BSON_ASSERT(memcmp(binary, "deadbeef", 8) == 0); bson_destroy(bcon); } static void test_undefined(void) { bson_t *bcon = BCON_NEW("foo", BCON_UNDEFINED); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_UNDEFINED)); bson_destroy(bcon); } static void test_oid(void) { bson_oid_t oid; bson_t *bcon; const bson_oid_t *ooid; bson_oid_init(&oid, NULL); bcon = BCON_NEW("foo", BCON_OID(&oid)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_OID(ooid))); BSON_ASSERT(bson_oid_equal(&oid, ooid)); bson_destroy(bcon); } static void test_bool(void) { bool b; bson_t *bcon = BCON_NEW("foo", BCON_BOOL(true)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_BOOL(b))); BSON_ASSERT(b == true); bson_destroy(bcon); } static void test_date_time(void) { int64_t out; bson_t *bcon = BCON_NEW("foo", BCON_DATE_TIME(10000)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_DATE_TIME(out))); BSON_ASSERT(out == 10000); bson_destroy(bcon); } static void test_null(void) { bson_t *bcon = BCON_NEW("foo", BCON_NULL); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_NULL)); bson_destroy(bcon); } static void test_regex(void) { const char *regex; const char *flags; bson_t *bcon = BCON_NEW("foo", BCON_REGEX("^foo|bar$", "i")); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_REGEX(regex, flags))); BSON_ASSERT(strcmp(regex, "^foo|bar$") == 0); BSON_ASSERT(strcmp(flags, "i") == 0); bson_destroy(bcon); } static void test_dbpointer(void) { const char *collection; bson_oid_t oid; const bson_oid_t *ooid; bson_t *bcon; bson_oid_init(&oid, NULL); bcon = BCON_NEW("foo", BCON_DBPOINTER("collection", &oid)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_DBPOINTER(collection, ooid))); BSON_ASSERT(strcmp(collection, "collection") == 0); BSON_ASSERT(bson_oid_equal(ooid, &oid)); bson_destroy(bcon); } static void test_code(void) { const char *val; bson_t *bcon = BCON_NEW("foo", BCON_CODE("var a = {};")); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_CODE(val))); BSON_ASSERT(strcmp(val, "var a = {};") == 0); bson_destroy(bcon); } static void test_symbol(void) { const char *val; bson_t *bcon = BCON_NEW("foo", BCON_SYMBOL("symbol")); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_SYMBOL(val))); BSON_ASSERT(strcmp(val, "symbol") == 0); bson_destroy(bcon); } static void test_codewscope(void) { const char *code; bson_t oscope; bson_t *scope = BCON_NEW("b", BCON_INT32(10)); bson_t *bcon = BCON_NEW("foo", BCON_CODEWSCOPE("var a = b;", scope)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_CODEWSCOPE(code, oscope))); BSON_ASSERT(strcmp(code, "var a = b;") == 0); bson_eq_bson(&oscope, scope); bson_destroy(&oscope); bson_destroy(scope); bson_destroy(bcon); } static void test_int32(void) { int32_t i32; bson_t *bcon = BCON_NEW("foo", BCON_INT32(10)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_INT32(i32))); BSON_ASSERT(i32 == 10); bson_destroy(bcon); } static void test_timestamp(void) { int32_t timestamp; int32_t increment; bson_t *bcon = BCON_NEW("foo", BCON_TIMESTAMP(100, 1000)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_TIMESTAMP(timestamp, increment))); BSON_ASSERT(timestamp == 100); BSON_ASSERT(increment == 1000); bson_destroy(bcon); } static void test_int64(void) { int64_t i64; bson_t *bcon = BCON_NEW("foo", BCON_INT64(10)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_INT64(i64))); BSON_ASSERT(i64 == 10); bson_destroy(bcon); } static void test_maxkey(void) { bson_t *bcon = BCON_NEW("foo", BCON_MAXKEY); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_MAXKEY)); bson_destroy(bcon); } static void test_minkey(void) { bson_t *bcon = BCON_NEW("foo", BCON_MINKEY); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_MINKEY)); bson_destroy(bcon); } static void test_bson_document(void) { bson_t ochild; bson_t *child = BCON_NEW("bar", "baz"); bson_t *bcon = BCON_NEW("foo", BCON_DOCUMENT(child)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_DOCUMENT(ochild))); bson_eq_bson(&ochild, child); bson_destroy(&ochild); bson_destroy(child); bson_destroy(bcon); } static void test_bson_array(void) { bson_t ochild; bson_t *child = BCON_NEW("0", "baz"); bson_t *bcon = BCON_NEW("foo", BCON_ARRAY(child)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_ARRAY(ochild))); bson_eq_bson(&ochild, child); bson_destroy(&ochild); bson_destroy(child); bson_destroy(bcon); } static void test_inline_array(void) { int32_t a, b; bson_t *bcon = BCON_NEW("foo", "[", BCON_INT32(1), BCON_INT32(2), "]"); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", "[", BCONE_INT32(a), BCONE_INT32(b), "]")); BSON_ASSERT(a == 1); BSON_ASSERT(b == 2); bson_destroy(bcon); } static void test_inline_doc(void) { int32_t a, b; bson_t *bcon = BCON_NEW("foo", "{", "b", BCON_INT32(2), "a", BCON_INT32(1), "}"); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", "{", "a", BCONE_INT32(a), "b", BCONE_INT32(b), "}")); BSON_ASSERT(a == 1); BSON_ASSERT(b == 2); bson_destroy(bcon); } static void test_extract_ctx_helper(bson_t *bson, ...) { va_list ap; bcon_extract_ctx_t ctx; int i; int n; bcon_extract_ctx_init(&ctx); va_start(ap, bson); n = va_arg(ap, int); for (i = 0; i < n; i++) { BSON_ASSERT(bcon_extract_ctx_va(bson, &ctx, &ap)); } va_end(ap); } static void test_extract_ctx(void) { int32_t a, b, c; bson_t *bson = BCON_NEW("a", BCON_INT32(1), "b", BCON_INT32(2), "c", BCON_INT32(3)); test_extract_ctx_helper(bson, 3, "a", BCONE_INT32(a), NULL, "b", BCONE_INT32(b), NULL, "c", BCONE_INT32(c), NULL); BSON_ASSERT(a == 1); BSON_ASSERT(b == 2); BSON_ASSERT(c == 3); bson_destroy(bson); } static void test_nested(void) { const char *utf8; int i32; bson_t *bcon = BCON_NEW("hello", "world", "foo", "{", "bar", BCON_INT32(10), "}"); BSON_ASSERT(BCON_EXTRACT(bcon, "hello", BCONE_UTF8(utf8), "foo", "{", "bar", BCONE_INT32(i32), "}")); BSON_ASSERT(strcmp("world", utf8) == 0); BSON_ASSERT(i32 == 10); bson_destroy(bcon); } static void test_skip(void) { bson_t *bcon = BCON_NEW("hello", "world", "foo", "{", "bar", BCON_INT32(10), "}"); BSON_ASSERT( BCON_EXTRACT(bcon, "hello", BCONE_SKIP(BSON_TYPE_UTF8), "foo", "{", "bar", BCONE_SKIP(BSON_TYPE_INT32), "}")); BSON_ASSERT( !BCON_EXTRACT(bcon, "hello", BCONE_SKIP(BSON_TYPE_UTF8), "foo", "{", "bar", BCONE_SKIP(BSON_TYPE_INT64), "}")); bson_destroy(bcon); } static void test_iter(void) { bson_iter_t iter; bson_t *other; bson_t *bcon = BCON_NEW("foo", BCON_INT32(10)); BSON_ASSERT(BCON_EXTRACT(bcon, "foo", BCONE_ITER(iter))); BSON_ASSERT(bson_iter_type(&iter) == BSON_TYPE_INT32); BSON_ASSERT(bson_iter_int32(&iter) == 10); other = BCON_NEW("foo", BCON_ITER(&iter)); bson_eq_bson(other, bcon); bson_destroy(bcon); bson_destroy(other); } void test_bcon_extract_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/bcon/extract/test_utf8", test_utf8); TestSuite_Add(suite, "/bson/bcon/extract/test_double", test_double); TestSuite_Add(suite, "/bson/bcon/extract/test_decimal128", test_decimal128); TestSuite_Add(suite, "/bson/bcon/extract/test_binary", test_binary); TestSuite_Add(suite, "/bson/bcon/extract/test_undefined", test_undefined); TestSuite_Add(suite, "/bson/bcon/extract/test_oid", test_oid); TestSuite_Add(suite, "/bson/bcon/extract/test_bool", test_bool); TestSuite_Add(suite, "/bson/bcon/extract/test_date_time", test_date_time); TestSuite_Add(suite, "/bson/bcon/extract/test_null", test_null); TestSuite_Add(suite, "/bson/bcon/extract/test_regex", test_regex); TestSuite_Add(suite, "/bson/bcon/extract/test_dbpointer", test_dbpointer); TestSuite_Add(suite, "/bson/bcon/extract/test_code", test_code); TestSuite_Add(suite, "/bson/bcon/extract/test_symbol", test_symbol); TestSuite_Add(suite, "/bson/bcon/extract/test_codewscope", test_codewscope); TestSuite_Add(suite, "/bson/bcon/extract/test_int32", test_int32); TestSuite_Add(suite, "/bson/bcon/extract/test_timestamp", test_timestamp); TestSuite_Add(suite, "/bson/bcon/extract/test_int64", test_int64); TestSuite_Add(suite, "/bson/bcon/extract/test_maxkey", test_maxkey); TestSuite_Add(suite, "/bson/bcon/extract/test_minkey", test_minkey); TestSuite_Add(suite, "/bson/bcon/extract/test_bson_document", test_bson_document); TestSuite_Add(suite, "/bson/bcon/extract/test_bson_array", test_bson_array); TestSuite_Add(suite, "/bson/bcon/extract/test_inline_array", test_inline_array); TestSuite_Add(suite, "/bson/bcon/extract/test_inline_doc", test_inline_doc); TestSuite_Add(suite, "/bson/bcon/extract/test_extract_ctx", test_extract_ctx); TestSuite_Add(suite, "/bson/bcon/extract/test_nested", test_nested); TestSuite_Add(suite, "/bson/bcon/extract/test_skip", test_skip); TestSuite_Add(suite, "/bson/bcon/extract/test_iter", test_iter); } mongo-c-driver-2.2.1/src/libbson/tests/test-bson-corpus.c000066400000000000000000000206161511661753600233400ustar00rootroot00000000000000#include "./corpus-test.h" #include #include #include #include #include #define IS_NAN(dec) (dec).high == 0x7c00000000000000ull typedef struct { const char *scenario; const char *test; } skipped_corpus_test_t; skipped_corpus_test_t SKIPPED_CORPUS_TESTS[] = { /* CDRIVER-1879, can't make Code with embedded NIL */ {"Javascript Code", "Embedded nulls"}, {"Javascript Code with Scope", "Unicode and embedded null in code string, empty scope"}, /* CDRIVER-2223, legacy extended JSON $date syntax uses numbers */ {"Top-level document validity", "Bad $date (number, not string or hash)"}, /* CDRIVER-3500, floating point output differs */ {"Double type", "1.2345678921232E+18"}, {"Double type", "-1.2345678921232E+18"}, /* CDRIVER-4017, libbson does not emit escape sequences */ {"Javascript Code", "two-byte UTF-8 (\xc3\xa9)"}, /* \u00e9 */ {"Javascript Code", "three-byte UTF-8 (\xe2\x98\x86)"}, /* \u2606 */ {"String", "two-byte UTF-8 (\xc3\xa9)"}, /* \u00e9 */ {"String", "three-byte UTF-8 (\xe2\x98\x86)"}, /* \u2606 */ {0}}; skipped_corpus_test_t VS2013_SKIPPED_CORPUS_TESTS[] = { /* VS 2013 and older is imprecise stackoverflow.com/questions/32232331 */ {"Double type", "1.23456789012345677E+18"}, {"Double type", "-1.23456789012345677E+18"}, {0}}; static void compare_data(const uint8_t *a, uint32_t a_len, const uint8_t *b, uint32_t b_len) { mcommon_string_append_t a_str, b_str; uint32_t i; if (a_len != b_len || memcmp(a, b, (size_t)a_len)) { mcommon_string_new_as_append(&a_str); for (i = 0; i < a_len; i++) { mcommon_string_append_printf(&a_str, "%02" PRIx8, a[i]); } mcommon_string_new_as_append(&b_str); for (i = 0; i < b_len; i++) { mcommon_string_append_printf(&b_str, "%02" PRIx8, b[i]); } fprintf(stderr, "unequal data of length %" PRIu32 " and %" PRIu32 ":\n%s\n%s\n", a_len, b_len, mcommon_str_from_append(&a_str), mcommon_str_from_append(&b_str)); abort(); } } static bool is_test_skipped(const char *scenario, const char *description) { skipped_corpus_test_t *skip; for (skip = SKIPPED_CORPUS_TESTS; skip->scenario != NULL; skip++) { if (!strcmp(skip->scenario, scenario) && !strcmp(skip->test, description)) { return true; } } /* _MSC_VER 1900 is Visual Studio 2015 */ #if (defined(_MSC_VER) && _MSC_VER < 1900) for (skip = VS2013_SKIPPED_CORPUS_TESTS; skip->scenario != NULL; skip++) { if (!strcmp(skip->scenario, scenario) && !strcmp(skip->test, description)) { return true; } } #endif return false; } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-validity * for cB input: * bson_to_canonical_extended_json(cB) = cE * bson_to_relaxed_extended_json(cB) = rE (if rE exists) * for cE input: * json_to_bson(cE) = cB (unless lossy) * for dB input (if it exists): * bson_to_canonical_extended_json(dB) = cE * bson_to_relaxed_extended_json(dB) = rE (if rE exists) * for dE input (if it exists): * json_to_bson(dE) = cB (unless lossy) * for rE input (if it exists): bson_to_relaxed_extended_json(json_to_bson(rE)) = rE */ static void test_bson_corpus_valid(test_bson_valid_type_t *test) { bson_t cB; bson_t dB; bson_t *decode_cE; bson_t *decode_dE; bson_t *decode_rE; bson_error_t error; BSON_ASSERT(test->cB); BSON_ASSERT(test->cE); if (is_test_skipped(test->scenario_description, test->test_description)) { if (test_suite_debug_output()) { printf(" SKIP\n"); fflush(stdout); } return; } BSON_ASSERT(bson_init_static(&cB, test->cB, test->cB_len)); ASSERT_CMPJSON(bson_as_canonical_extended_json(&cB, NULL), test->cE); if (test->rE) { ASSERT_CMPJSON(bson_as_relaxed_extended_json(&cB, NULL), test->rE); } decode_cE = bson_new_from_json((const uint8_t *)test->cE, -1, &error); ASSERT_OR_PRINT(decode_cE, error); if (!test->lossy) { compare_data(bson_get_data(decode_cE), decode_cE->len, test->cB, test->cB_len); } if (test->dB) { BSON_ASSERT(bson_init_static(&dB, test->dB, test->dB_len)); ASSERT_CMPJSON(bson_as_canonical_extended_json(&dB, NULL), test->cE); if (test->rE) { ASSERT_CMPJSON(bson_as_relaxed_extended_json(&dB, NULL), test->rE); } bson_destroy(&dB); } if (test->dE) { decode_dE = bson_new_from_json((const uint8_t *)test->dE, -1, &error); ASSERT_OR_PRINT(decode_dE, error); ASSERT_CMPJSON(bson_as_canonical_extended_json(decode_dE, NULL), test->cE); if (!test->lossy) { compare_data(bson_get_data(decode_dE), decode_dE->len, test->cB, test->cB_len); } bson_destroy(decode_dE); } if (test->rE) { decode_rE = bson_new_from_json((const uint8_t *)test->rE, -1, &error); ASSERT_OR_PRINT(decode_rE, error); ASSERT_CMPJSON(bson_as_relaxed_extended_json(decode_rE, NULL), test->rE); bson_destroy(decode_rE); } bson_destroy(decode_cE); bson_destroy(&cB); } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-decode-errors */ static void test_bson_corpus_decode_error(test_bson_decode_error_type_t *test) { bson_t invalid_bson; BSON_ASSERT(test->bson); if (is_test_skipped(test->scenario_description, test->test_description)) { if (test_suite_debug_output()) { printf(" SKIP\n"); fflush(stdout); } return; } ASSERT(test->bson); ASSERT(!bson_init_static(&invalid_bson, test->bson, test->bson_len) || bson_empty(&invalid_bson) || !bson_as_canonical_extended_json(&invalid_bson, NULL)); } /* See: github.com/mongodb/specifications/blob/master/source/bson-corpus/bson-corpus.rst #testing-parsing-errors */ static void test_bson_corpus_parse_error(test_bson_parse_error_type_t *test) { BSON_ASSERT(test->str); if (is_test_skipped(test->scenario_description, test->test_description)) { if (test_suite_debug_output()) { printf(" SKIP\n"); fflush(stdout); } return; } switch (test->bson_type) { case BSON_TYPE_EOD: /* top-level document to be parsed as JSON */ case BSON_TYPE_BINARY: ASSERT(!bson_new_from_json((uint8_t *)test->str, test->str_len, NULL)); break; case BSON_TYPE_DECIMAL128: { bson_decimal128_t dec; ASSERT(!bson_decimal128_from_string(test->str, &dec)); ASSERT(IS_NAN(dec)); break; } case BSON_TYPE_DOUBLE: case BSON_TYPE_UTF8: case BSON_TYPE_DOCUMENT: case BSON_TYPE_ARRAY: case BSON_TYPE_UNDEFINED: case BSON_TYPE_OID: case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_REGEX: case BSON_TYPE_DBPOINTER: case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_CODEWSCOPE: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: default: fprintf(stderr, "Unsupported parseError type: %#x\n", test->bson_type); abort(); } } static void test_bson_corpus_cb(void *scenario) { corpus_test(scenario, test_bson_corpus_valid, test_bson_corpus_decode_error, test_bson_corpus_parse_error); } static void test_bson_corpus_prose_1(void) { bson_t *bson; bool ok; bson_t subdoc; /* Field name within a root document */ bson = bson_new(); ok = bson_append_int32(bson, "a\0b", 3, 123); BSON_ASSERT(!ok); bson_destroy(bson); /* Field name within a sub-document */ bson = bson_new(); bson_append_document_begin(bson, "subdoc", -1, &subdoc); ok = bson_append_int32(&subdoc, "a\0b", 3, 123); BSON_ASSERT(!ok); bson_destroy(&subdoc); bson_destroy(bson); /* Pattern for a regular expression */ bson = bson_new(); ok = bson_append_regex_w_len(bson, "key", 3, "a\0b", 3, ""); BSON_ASSERT(!ok); bson_destroy(bson); /* Testing options for a regular expression is not possible, since * bson_append_regex_w_len does not accept a length for options. */ } void test_bson_corpus_install(TestSuite *suite) { install_json_test_suite_with_check(suite, BSON_JSON_DIR, "bson_corpus", test_bson_corpus_cb); TestSuite_Add(suite, "/bson_corpus/prose_1", test_bson_corpus_prose_1); } mongo-c-driver-2.2.1/src/libbson/tests/test-bson-error.c000066400000000000000000000046571511661753600231650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include static void test_bson_error_basic(void) { bson_error_t error; bson_set_error(&error, 123, 456, "%s:%d", "localhost", 27017); ASSERT_CMPSTR(error.message, "localhost:27017"); ASSERT_CMPUINT32(error.domain, ==, 123u); ASSERT_CMPUINT32(error.code, ==, 456u); ASSERT_CMPUINT(error.reserved, ==, 1u); // BSON_ERROR_CATEGORY } static void test_bson_error_clear(void) { bson_error_t err; err.code = 42; err.domain = 1729; bson_error_clear(&err); mlib_check(err.code, eq, 0); mlib_check(err.domain, eq, 0); // Valid no-op: bson_error_clear(NULL); } static void test_bson_error_reset(void) { bson_error_t err; bson_error_t *eptr = &err; err.code = 42; bson_error_reset(eptr); mlib_check(eptr, ptr_eq, &err); mlib_check(err.code, eq, 0); eptr = NULL; bson_error_reset(eptr); mlib_check(eptr != NULL, because, "bson_error_reset sets null pointers to non-null"); mlib_check(eptr->code, eq, 0); } static void test_bson_strerror_r(void) { FILE *f = fopen("file-that-does-not-exist", "r"); ASSERT(!f); char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg = bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf); // Check a message is returned. Do not check platform-dependent contents: ASSERT(errmsg); const char *unknown_msg = "Unknown error"; if (strstr(errmsg, unknown_msg)) { test_error("Expected error message to contain platform-dependent content, not: '%s'", errmsg); } } void test_bson_error_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/error/basic", test_bson_error_basic); TestSuite_Add(suite, "/bson/error/clear", test_bson_error_clear); TestSuite_Add(suite, "/bson/error/reset", test_bson_error_reset); TestSuite_Add(suite, "/bson/strerror_r", test_bson_strerror_r); } mongo-c-driver-2.2.1/src/libbson/tests/test-bson-vector.c000066400000000000000000002144141511661753600233300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifdef _MSC_VER #define SSCANF sscanf_s #else #define SSCANF sscanf #endif struct view_abi_reference_type { void *data; uint32_t data_len; uint8_t header_0; uint8_t header_1; }; /* ABI: Make sure vector views have the expected size. */ #define EXPECTED_VECTOR_VIEW_SIZE (sizeof(struct view_abi_reference_type)) BSON_STATIC_ASSERT2(sizeof_bson_vector_int8_const_view_t, sizeof(bson_vector_int8_const_view_t) == EXPECTED_VECTOR_VIEW_SIZE); BSON_STATIC_ASSERT2(sizeof_bson_vector_int8_view_t, sizeof(bson_vector_int8_view_t) == EXPECTED_VECTOR_VIEW_SIZE); BSON_STATIC_ASSERT2(sizeof_bson_vector_float32_const_view_t, sizeof(bson_vector_float32_const_view_t) == EXPECTED_VECTOR_VIEW_SIZE); BSON_STATIC_ASSERT2(sizeof_bson_vector_float32_view_t, sizeof(bson_vector_float32_view_t) == EXPECTED_VECTOR_VIEW_SIZE); BSON_STATIC_ASSERT2(sizeof_bson_vector_packed_bit_const_view_t, sizeof(bson_vector_packed_bit_const_view_t) == EXPECTED_VECTOR_VIEW_SIZE); BSON_STATIC_ASSERT2(sizeof_bson_vector_packed_bit_view_t, sizeof(bson_vector_packed_bit_view_t) == EXPECTED_VECTOR_VIEW_SIZE); #undef EXPECTED_VECTOR_VIEW_SIZE typedef struct vector_json_test_case_t { char *scenario_description, *scenario_test_key; char *test_description, *test_dtype_hex_str, *test_dtype_alias_str, *test_canonical_bson_str; bson_t *test_vector_array; int64_t *test_padding; bool *test_valid; } vector_json_test_case_t; static bool append_vector_packed_bit_from_packed_array( bson_t *bson, const char *key, int key_length, const bson_iter_t *iter, int64_t padding, bson_error_t *error) { // (Spec test improvement TODO) This implements something the test covers that our API doesn't. If the test // were modified to cover element-by-element conversion, this can be replaced with // bson_append_vector_packed_bit_from_array. BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(iter); size_t byte_count = 0; { bson_iter_t validation_iter = *iter; while (bson_iter_next(&validation_iter)) { if (!BSON_ITER_HOLDS_INT(&validation_iter)) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_TYPE, "expected int32 or int64 in BSON array key '%s', found item type 0x%02X", bson_iter_key(&validation_iter), (unsigned)bson_iter_type(&validation_iter)); return false; } int64_t byte_as_int64 = bson_iter_as_int64(&validation_iter); if (byte_as_int64 < 0 || byte_as_int64 > UINT8_MAX) { bson_set_error(error, BSON_ERROR_VECTOR, BSON_VECTOR_ERROR_ARRAY_ELEMENT_VALUE, "BSON array key '%s' value %" PRId64 " is out of range for packed byte", bson_iter_key(&validation_iter), byte_as_int64); return false; } byte_count++; } } if (padding < 0 || padding > 7) { bson_set_error(error, TEST_ERROR_DOMAIN, TEST_ERROR_CODE, "'padding' parameter (%" PRId64 ") for append_vector_packed_bit_from_packed_array is out of range", padding); return false; } if (byte_count < 1 && padding > 0) { bson_set_error(error, TEST_ERROR_DOMAIN, TEST_ERROR_CODE, "nonzero 'padding' parameter (%" PRId64 ") for zero-length append_vector_packed_bit_from_packed_array", padding); return false; } bson_vector_packed_bit_view_t view; if (bson_append_vector_packed_bit_uninit(bson, key, key_length, byte_count * 8u - (size_t)padding, &view)) { bson_iter_t copy_iter = *iter; for (size_t i = 0; i < byte_count; i++) { ASSERT(bson_iter_next(©_iter)); uint8_t packed_byte = (uint8_t)bson_iter_as_int64(©_iter); ASSERT(bson_vector_packed_bit_view_write_packed(view, &packed_byte, 1, i)); // Read back the packed byte, interpret any masking as a conversion failure. uint8_t packed_byte_check; ASSERT(bson_vector_packed_bit_view_read_packed(view, &packed_byte_check, 1, i)); if (packed_byte != packed_byte_check) { bson_set_error(error, TEST_ERROR_DOMAIN, TEST_ERROR_CODE, "byte at index %zu with value 0x%02X included write to masked bits (reads as 0x%02X)", i, packed_byte, packed_byte_check); return false; } } return true; } else { return false; } } static void hex_str_to_bson(bson_t *bson_out, const char *hex_str) { uint32_t size = (uint32_t)strlen(hex_str) / 2u; uint8_t *buffer = bson_reserve_buffer(bson_out, size); for (uint32_t i = 0; i < size; i++) { unsigned int byte; ASSERT(SSCANF(&hex_str[i * 2], "%2x", &byte) == 1); buffer[i] = (uint8_t)byte; } } // Implement spec tests, given parsed arguments static void test_bson_vector_json_case(vector_json_test_case_t *test_case) { bson_t expected_bson = BSON_INITIALIZER; if (test_case->test_canonical_bson_str) { hex_str_to_bson(&expected_bson, test_case->test_canonical_bson_str); } ASSERT(test_case->test_valid); ASSERT(test_case->test_dtype_hex_str); ASSERT(test_case->scenario_test_key); bson_t vector_from_array = BSON_INITIALIZER; bson_error_t vector_from_array_error; bool vector_from_array_ok; // Try a format conversion from array to the indicated vector format. // The spec calls the first header byte "dtype" (combining the element type and element size fields) if (0 == strcmp("0x03", test_case->test_dtype_hex_str)) { // int8 vector from int32/int64 array bson_iter_t iter; bool padding_ok = !test_case->test_padding || *test_case->test_padding == 0; vector_from_array_ok = test_case->test_vector_array && padding_ok && bson_iter_init(&iter, test_case->test_vector_array) && BSON_APPEND_VECTOR_INT8_FROM_ARRAY( &vector_from_array, test_case->scenario_test_key, &iter, &vector_from_array_error); } else if (0 == strcmp("0x27", test_case->test_dtype_hex_str)) { // float32 vector from float64 array bson_iter_t iter; bool padding_ok = !test_case->test_padding || *test_case->test_padding == 0; vector_from_array_ok = test_case->test_vector_array && padding_ok && bson_iter_init(&iter, test_case->test_vector_array) && BSON_APPEND_VECTOR_FLOAT32_FROM_ARRAY( &vector_from_array, test_case->scenario_test_key, &iter, &vector_from_array_error); } else if (0 == strcmp("0x10", test_case->test_dtype_hex_str)) { // packed_bit from packed bytes in an int array, with "padding" parameter supplied separately. // Suggested changes to reduce the special cases here: // - Array-to-Vector should be defined as an element-by-element conversion. This test shouldn't operate on packed // representations. // - Include additional JSON tests for packed access, distinct from Array conversion. // - Tests should keep the unused bits zeroed as required. // (Spec test improvement TODO) bson_iter_t iter; if (!test_case->test_padding) { test_error("test '%s' is missing required 'padding' field", test_case->test_description); } vector_from_array_ok = test_case->test_vector_array && bson_iter_init(&iter, test_case->test_vector_array) && append_vector_packed_bit_from_packed_array(&vector_from_array, test_case->scenario_test_key, -1, &iter, *test_case->test_padding, &vector_from_array_error); } else { test_error( "test '%s' has unsupported dtype_hex format '%s'", test_case->test_description, test_case->test_dtype_hex_str); } if (*test_case->test_valid) { /* * "To prove correct in a valid case (valid: true), one MUST * - encode a document from the numeric values, dtype, and padding, along with the "test_key", and assert this * matches the canonical_bson string. * - decode the canonical_bson into its binary form, and then assert that the numeric values, dtype, and padding * all match those provided in the JSON." */ // Check the vector-from-array performed above ("encode") if (!test_case->test_vector_array) { test_error("test '%s' should be valid, but missing 'vector' field", test_case->test_description); } if (!vector_from_array_ok) { test_error("test '%s' should be valid, but vector-from-array failed: %s", test_case->test_description, vector_from_array_error.message); } if (0 != bson_compare(&vector_from_array, &expected_bson)) { test_error("test '%s' did not exactly match the reference document.\n " "Actual: %s\n Expected: %s", test_case->test_description, tmp_json(&vector_from_array), tmp_json(&expected_bson)); } // Perform an array-from-vector and check it ("decode") bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &expected_bson, test_case->scenario_test_key)); bson_t array_from_vector = BSON_INITIALIZER; { bson_array_builder_t *array_builder = bson_array_builder_new(); if (!bson_array_builder_append_vector_elements(array_builder, &iter)) { test_error("test '%s' should be valid but failed array-from-vector conversion", test_case->test_description); } ASSERT(bson_array_builder_build(array_builder, &array_from_vector)); bson_array_builder_destroy(array_builder); } if (BSON_ITER_HOLDS_VECTOR_FLOAT32(&iter)) { // float32 special case: Due to underspecified rounding and conversion rules we compare value inexactly. // (Spec test improvement TODO) bson_iter_t actual_iter, expected_iter; ASSERT(bson_iter_init(&actual_iter, &array_from_vector)); ASSERT(bson_iter_init(&expected_iter, test_case->test_vector_array)); for (size_t i = 0;; i++) { bool actual_next = bson_iter_next(&actual_iter); bool expected_next = bson_iter_next(&expected_iter); if (!actual_next && !expected_next) { break; } else if (!actual_next) { test_error("converted array is shorter than expected"); } else if (!expected_next) { test_error("converted array is longer than expected"); } if (!BSON_ITER_HOLDS_DOUBLE(&actual_iter)) { test_error("converted array element %d has unexpected type, should be double", (int)i); } double actual_double = bson_iter_double(&actual_iter); double expected_double; if (BSON_ITER_HOLDS_DOUBLE(&expected_iter)) { expected_double = bson_iter_double(&expected_iter); } else { test_error("test-vector array element %d has unexpected type, should be double, 'inf', or '-inf'.", (int)i); } bool is_sorta_equal = false; if (expected_double != expected_double) { // Expect NaN, any type is fine. if (actual_double != actual_double) { is_sorta_equal = true; } } else if (expected_double == 0.0 || expected_double * 0.0 != 0.0) { // Infinity or zero, equality comparison is fine. is_sorta_equal = expected_double == actual_double; } else { // Finite number, allow +/- error relative to the scale of the expected value. // Note that ASSERT_EQUAL_DOUBLE() in TestSuite exists but its fixed error threshold of 20% seems too // loose for this application. static const double allowed_relative_error = 1e-7; double allowed_absolute_error = fabs(allowed_relative_error * expected_double); is_sorta_equal = actual_double >= expected_double - allowed_absolute_error && actual_double <= expected_double + allowed_absolute_error; } if (!is_sorta_equal) { test_error("test-vector array element %d failed inexact float32 match. Actual: %f Expected: %f", (int)i, actual_double, expected_double); } } } else if (BSON_ITER_HOLDS_VECTOR_PACKED_BIT(&iter)) { // packed_bit special case: The tests for packed_bit aren't actually testing vector-to-array conversion as we // understand it, they're operating on bytes rather than elements. This is the inverse of // append_vector_packed_bit_from_packed_array() above, and it bypasses the vector-to-array conversion. // 'array_from_vector' is ignored on this path. // (Spec test improvement TODO) bson_iter_t expected_iter; ASSERT(bson_iter_init(&expected_iter, test_case->test_vector_array)); bson_vector_packed_bit_const_view_t actual_view; ASSERT(bson_vector_packed_bit_const_view_from_iter(&actual_view, &iter)); size_t byte_count = 0; while (bson_iter_next(&expected_iter)) { int64_t expected_byte; if (BSON_ITER_HOLDS_INT(&expected_iter)) { expected_byte = bson_iter_as_int64(&expected_iter); } else { test_error("test-vector array element %d has unexpected type, should be int.", (int)byte_count); } // Note, the zero initializer is only needed due to a false positive -Wmaybe-uninitialized warning in // uncommon configurations where the compiler does not have visibility into memcpy(). uint8_t actual_byte = 0; ASSERT(bson_vector_packed_bit_const_view_read_packed(actual_view, &actual_byte, 1, byte_count)); if (expected_byte != (int64_t)actual_byte) { test_error("failed to match packed byte %d of packed_bit test-vector. Actual: 0x%02x Expected: 0x%02x", (int)byte_count, (unsigned)actual_byte, (unsigned)expected_byte); } byte_count++; } ASSERT_CMPSIZE_T(byte_count, ==, bson_vector_packed_bit_const_view_length_bytes(actual_view)); } else { // No special case, expect an exact match. (Used for int8 vectors) if (0 != bson_compare(&array_from_vector, test_case->test_vector_array)) { test_error("bson_binary_vector JSON scenario '%s' test '%s' did not exactly match the reference array " "after array-from-vector.\n " "Actual: %s\n Expected: %s", test_case->scenario_description, test_case->test_description, tmp_json(&array_from_vector), tmp_json(test_case->test_vector_array)); } } bson_destroy(&array_from_vector); } else { /* * "To prove correct in an invalid case (valid:false), one MUST * - if the vector field is present, raise an exception when attempting to encode a document from the numeric * values, dtype, and padding. * - if the canonical_bson field is present, raise an exception when attempting to deserialize it into the * corresponding numeric values, as the field contains corrupted data." */ if (vector_from_array_ok) { test_error("bson_binary_vector JSON scenario '%s' test '%s' should be invalid but vector-from-array " "succeeded with result: %s", test_case->scenario_description, test_case->test_description, tmp_json(&vector_from_array)); } if (test_case->test_canonical_bson_str) { bson_t array_from_vector = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &expected_bson, test_case->scenario_test_key)); if (BSON_APPEND_ARRAY_FROM_VECTOR(&array_from_vector, "should_fail", &iter)) { test_error("bson_binary_vector JSON scenario '%s' test '%s' should be invalid but array-from-vector " "succeeded with result: %s", test_case->scenario_description, test_case->test_description, tmp_json(&array_from_vector)); } bson_destroy(&array_from_vector); } } bson_destroy(&expected_bson); } // callback for install_json_test_suite_with_check, implements JSON spec tests static void test_bson_vector_json_cb(void *test_arg) { BSON_ASSERT_PARAM(test_arg); bson_t *scenario = (bson_t *)test_arg; bson_error_t error; vector_json_test_case_t test_case; bson_parser_t *scenario_opts = bson_parser_new(); bson_t *tests; bson_parser_utf8(scenario_opts, "description", &test_case.scenario_description); bson_parser_utf8(scenario_opts, "test_key", &test_case.scenario_test_key); bson_parser_array(scenario_opts, "tests", &tests); if (!bson_parser_parse(scenario_opts, scenario, &error)) { test_error("format error in bson_binary_vector JSON scenario: %s", error.message); } bson_iter_t tests_iter; ASSERT(bson_iter_init(&tests_iter, tests)); while (bson_iter_next(&tests_iter)) { bson_t test_subdoc; bson_iter_bson(&tests_iter, &test_subdoc); bson_parser_t *test_opts = bson_parser_new(); bson_parser_utf8(test_opts, "description", &test_case.test_description); bson_parser_bool(test_opts, "valid", &test_case.test_valid); bson_parser_array_optional(test_opts, "vector", &test_case.test_vector_array); bson_parser_utf8(test_opts, "dtype_hex", &test_case.test_dtype_hex_str); bson_parser_utf8(test_opts, "dtype_alias", &test_case.test_dtype_alias_str); bson_parser_int_optional(test_opts, "padding", &test_case.test_padding); bson_parser_utf8_optional(test_opts, "canonical_bson", &test_case.test_canonical_bson_str); if (!bson_parser_parse(test_opts, &test_subdoc, &error)) { test_error( "format error in bson_binary_vector JSON test for '%s': %s", test_case.scenario_description, error.message); } if (test_suite_debug_output()) { printf("bson_binary_vector JSON scenario '%s' test '%s'\n", test_case.scenario_description, test_case.test_description); } test_bson_vector_json_case(&test_case); bson_parser_destroy_with_parsed_fields(test_opts); } bson_parser_destroy_with_parsed_fields(scenario_opts); } static void test_bson_vector_view_api_usage_int8(void) { bson_t doc = BSON_INITIALIZER; // Construct a small vector by writing individual elements { bson_vector_int8_view_t view; const size_t length = 25; ASSERT(BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "vector", length, &view)); for (size_t i = 0; i < length; i++) { int8_t v = (int8_t)i - 9; bson_vector_int8_view_write(view, &v, 1, i); } } ASSERT_CMPJSON( bson_as_canonical_extended_json(&doc, NULL), BSON_STR({"vector" : {"$binary" : {"base64" : "AwD3+Pn6+/z9/v8AAQIDBAUGBwgJCgsMDQ4P", "subType" : "09"}}})); // Construct a longer vector by writing individual elements { bson_vector_int8_view_t view; const size_t length = 50000; ASSERT(bson_append_vector_int8_uninit(&doc, "longer_vector", -1, length, &view)); for (size_t i = 0; i < length; i++) { int8_t v = (int8_t)(uint8_t)i; bson_vector_int8_view_write(view, &v, 1, i); } } // Fail appending a vector that would be too large to represent { bson_vector_int8_view_t view; const size_t length = UINT32_MAX - 1; ASSERT(!bson_append_vector_int8_uninit(&doc, "overlong_vector", -1, length, &view)); } // Use a mutable view to partially overwrite "vector" { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); bson_vector_int8_view_t view; ASSERT(bson_vector_int8_view_from_iter(&view, &iter)); ASSERT(bson_vector_int8_view_length(view) == 25); int8_t values[5] = {12, 34, 56, 78, 90}; ASSERT(bson_vector_int8_view_write(view, values, sizeof values / sizeof values[0], 3)); } // Read the modified small vector into an int8_t array { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR_INT8(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_FLOAT32(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_PACKED_BIT(&iter)); bson_vector_int8_const_view_t view; ASSERT(bson_vector_int8_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_int8_const_view_length(view) == 25); int8_t values[25]; static const int8_t expected_values[25] = {-9, -8, -7, 12, 34, 56, 78, 90, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; ASSERT(bson_vector_int8_const_view_read(view, values, sizeof values / sizeof values[0], 0)); ASSERT_MEMCMP(values, expected_values, (int)sizeof expected_values); } // Convert the small vector to a BSON Array, and check the resulting canonical extended JSON. // Each element will be losslessly converted to int32. // Convert the output back, and add a "round_trip" key to the original document. { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT_CMPJSON(bson_as_canonical_extended_json(&converted, NULL), BSON_STR({ "array" : [ {"$numberInt" : "-9"}, {"$numberInt" : "-8"}, {"$numberInt" : "-7"}, {"$numberInt" : "12"}, {"$numberInt" : "34"}, {"$numberInt" : "56"}, {"$numberInt" : "78"}, {"$numberInt" : "90"}, {"$numberInt" : "-1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "2"}, {"$numberInt" : "3"}, {"$numberInt" : "4"}, {"$numberInt" : "5"}, {"$numberInt" : "6"}, {"$numberInt" : "7"}, {"$numberInt" : "8"}, {"$numberInt" : "9"}, {"$numberInt" : "10"}, {"$numberInt" : "11"}, {"$numberInt" : "12"}, {"$numberInt" : "13"}, {"$numberInt" : "14"}, {"$numberInt" : "15"} ] })); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_INT8_FROM_ARRAY(&doc, "round_trip", &iter, NULL)); bson_destroy(&converted); } // The original small vector and round_trip small vector must be identical { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "vector")); ASSERT(bson_iter_init_find(&b, &doc, "round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } // Try the same round trip conversion with our longer vector // (Note that BSON arrays special-case keys below "1000") { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "longer_vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_INT8_FROM_ARRAY(&doc, "longer_round_trip", &iter, NULL)); bson_destroy(&converted); } { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "longer_vector")); ASSERT(bson_iter_init_find(&b, &doc, "longer_round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } bson_destroy(&doc); } static void test_bson_vector_view_api_usage_float32(void) { bson_t doc = BSON_INITIALIZER; // Construct a small vector by writing individual elements { bson_vector_float32_view_t view; const size_t length = 5; ASSERT(BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "vector", length, &view)); for (size_t i = 0; i < length; i++) { float v = 1.0f + 0.25f * (float)i; bson_vector_float32_view_write(view, &v, 1, i); } } ASSERT_CMPJSON( bson_as_canonical_extended_json(&doc, NULL), BSON_STR({"vector" : {"$binary" : {"base64" : "JwAAAIA/AACgPwAAwD8AAOA/AAAAQA==", "subType" : "09"}}})); // Construct a longer vector by writing individual elements { bson_vector_float32_view_t view; const size_t length = 10000; ASSERT(bson_append_vector_float32_uninit(&doc, "longer_vector", -1, length, &view)); for (size_t i = 0; i < length; i++) { float v = (float)i; bson_vector_float32_view_write(view, &v, 1, i); } } // Fail appending a vector that would be too large to represent { bson_vector_float32_view_t view; const size_t length = (UINT32_MAX - 1) / 4; ASSERT(!bson_append_vector_float32_uninit(&doc, "overlong_vector", -1, length, &view)); } // Read the small vector into a float array { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_INT8(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR_FLOAT32(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_PACKED_BIT(&iter)); bson_vector_float32_const_view_t view; ASSERT(bson_vector_float32_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_float32_const_view_length(view) == 5); float values[5]; static const float expected_values[5] = {1.0f, 1.25f, 1.5f, 1.75f, 2.0f}; ASSERT(bson_vector_float32_const_view_read(view, values, sizeof values / sizeof values[0], 0)); ASSERT_MEMCMP(values, expected_values, (int)sizeof expected_values); } // Convert the small vector to a BSON Array, and check the resulting canonical extended JSON. // Each element will be converted from 32-bit to 64-bit float. // Convert the output back, and add a "round_trip" key to the original document. { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT_CMPJSON(bson_as_canonical_extended_json(&converted, NULL), BSON_STR({ "array" : [ {"$numberDouble" : "1.0"}, {"$numberDouble" : "1.25"}, {"$numberDouble" : "1.5"}, {"$numberDouble" : "1.75"}, {"$numberDouble" : "2.0"} ] })); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_FLOAT32_FROM_ARRAY(&doc, "round_trip", &iter, NULL)); bson_destroy(&converted); } // The original small vector and round_trip small vector must be identical { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "vector")); ASSERT(bson_iter_init_find(&b, &doc, "round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } // Try the same round trip conversion with our longer vector // (Note that BSON arrays special-case keys below "1000") { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "longer_vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_FLOAT32_FROM_ARRAY(&doc, "longer_round_trip", &iter, NULL)); bson_destroy(&converted); } { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "longer_vector")); ASSERT(bson_iter_init_find(&b, &doc, "longer_round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } bson_destroy(&doc); } static void test_bson_vector_view_api_usage_packed_bit(void) { bson_t doc = BSON_INITIALIZER; // Construct a small vector by packing individual elements from a 'bool' source { bson_vector_packed_bit_view_t view; const size_t length = 123; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "vector", length, &view)); for (size_t i = 0; i < length; i++) { bool v = (i & 1) != 0; bson_vector_packed_bit_view_pack_bool(view, &v, 1, i); } } ASSERT_CMPJSON(bson_as_canonical_extended_json(&doc, NULL), BSON_STR({"vector" : {"$binary" : {"base64" : "EAVVVVVVVVVVVVVVVVVVVVVA", "subType" : "09"}}})); // Construct a longer vector by packing individual elements from a 'bool' source { bson_vector_packed_bit_view_t view; const size_t length = 100002; ASSERT(bson_append_vector_packed_bit_uninit(&doc, "longer_vector", -1, length, &view)); for (size_t i = 0; i < length; i++) { bool v = (i & 3) != 0; bson_vector_packed_bit_view_pack_bool(view, &v, 1, i); } } // Fail appending a vector that would be too large to represent { bson_vector_int8_view_t view; const size_t length = (UINT32_MAX - 1) * (size_t)8; ASSERT(!bson_append_vector_int8_uninit(&doc, "overlong_vector", -1, length, &view)); } // Unpack the small vector into a bool array { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_INT8(&iter)); ASSERT(!BSON_ITER_HOLDS_VECTOR_FLOAT32(&iter)); ASSERT(BSON_ITER_HOLDS_VECTOR_PACKED_BIT(&iter)); bson_vector_packed_bit_const_view_t view; ASSERT(bson_vector_packed_bit_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_const_view_length(view) == 123); bool values[123]; bool expected_values[123]; for (size_t i = 0; i < sizeof expected_values / sizeof expected_values[0]; i++) { expected_values[i] = (i & 1) != 0; } ASSERT(bson_vector_packed_bit_const_view_unpack_bool(view, values, sizeof values / sizeof values[0], 0)); ASSERT_MEMCMP(values, expected_values, (int)sizeof expected_values); } // Read the packed representation without unpacking { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); bson_vector_packed_bit_const_view_t view; ASSERT(bson_vector_packed_bit_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_const_view_length(view) == 123); uint8_t packed[16]; static const uint8_t expected_packed[16] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x40}; ASSERT(bson_vector_packed_bit_const_view_read_packed(view, packed, sizeof packed, 0)); ASSERT_MEMCMP(packed, expected_packed, (int)sizeof expected_packed); } // Partial overwrite of the packed representation { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); bson_vector_packed_bit_view_t view; ASSERT(bson_vector_packed_bit_view_from_iter(&view, &iter)); uint8_t packed[2] = {0x12, 0x34}; ASSERT(bson_vector_packed_bit_view_write_packed(view, packed, sizeof packed, 12)); } // Partial read of the packed representation { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); bson_vector_packed_bit_const_view_t view; ASSERT(bson_vector_packed_bit_const_view_from_iter(&view, &iter)); uint8_t packed[5]; static const uint8_t expected_packed[5] = {0x55, 0x12, 0x34, 0x55, 0x40}; ASSERT(bson_vector_packed_bit_const_view_read_packed(view, packed, sizeof packed, 11)); ASSERT_MEMCMP(packed, expected_packed, (int)sizeof expected_packed); } // Partial write from a bool array, spanning complete and partial packed bytes { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); bson_vector_packed_bit_view_t view; ASSERT(bson_vector_packed_bit_view_from_iter(&view, &iter)); bool values[24] = { false, false, false, true, false, false, false, true, true, true, false, true, true, false, false, false, false, true, false, false, false, false, false, true, }; ASSERT(bson_vector_packed_bit_view_pack_bool(view, values, sizeof values / sizeof values[0], 3)); } // Convert the small vector to a BSON Array, and check the resulting canonical extended JSON. // Each element will be losslessly converted to int32. // Convert the output back, and add a "round_trip" key to the original document. { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT_CMPJSON(bson_as_canonical_extended_json(&converted, NULL), BSON_STR({ "array" : [ {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "1"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"}, {"$numberInt" : "1"}, {"$numberInt" : "0"} ] })); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_FROM_ARRAY(&doc, "round_trip", &iter, NULL)); bson_destroy(&converted); } // The original small vector and round_trip small vector must be identical { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "vector")); ASSERT(bson_iter_init_find(&b, &doc, "round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } // Try the same round trip conversion with our longer vector // (Note that BSON arrays special-case keys below "1000") { bson_t converted = BSON_INITIALIZER; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &doc, "longer_vector")); ASSERT(BSON_APPEND_ARRAY_FROM_VECTOR(&converted, "array", &iter)); ASSERT(bson_iter_init_find(&iter, &converted, "array")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &iter)); ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_FROM_ARRAY(&doc, "longer_round_trip", &iter, NULL)); bson_destroy(&converted); } { bson_iter_t a, b; ASSERT(bson_iter_init_find(&a, &doc, "longer_vector")); ASSERT(bson_iter_init_find(&b, &doc, "longer_round_trip")); ASSERT(bson_iter_binary_equal(&a, &b)); } // Padding bits will be initialized to zero when a packed_bit vector is first allocated by // bson_append_vector_packed_bit_uninit { // Set the uninitialized part of 'doc' to a known value static const uint32_t reserve_len = 512; memset(bson_reserve_buffer(&doc, doc.len + reserve_len) + doc.len, 0xdd, reserve_len); bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "padding_init_test", 12, &view)); ASSERT(bson_vector_packed_bit_view_length_bytes(view) == 2); ASSERT(bson_vector_packed_bit_view_padding(view) == 4); // BSON validity only requires the low 4 bits to be zero, but the entire last // byte will be zeroed by our implementation. uint8_t bytes[2]; ASSERT(bson_vector_packed_bit_view_read_packed(view, bytes, sizeof bytes, 0)); ASSERT_CMPUINT((unsigned)bytes[0], ==, 0xdd); ASSERT_CMPUINT((unsigned)bytes[1], ==, 0x00); } // Padding bits can't be forcibly given nonzero values using bson_vector_packed_bit_view_write_packed { bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "padding_mask_test", 13, &view)); ASSERT(bson_vector_packed_bit_view_length_bytes(view) == 2); ASSERT(bson_vector_packed_bit_view_padding(view) == 3); uint8_t bytes[2] = {0xff, 0xff}; ASSERT(bson_vector_packed_bit_view_write_packed(view, bytes, sizeof bytes, 0)); ASSERT(bson_vector_packed_bit_view_read_packed(view, bytes, sizeof bytes, 0)); ASSERT_CMPUINT((unsigned)bytes[0], ==, 0xff); ASSERT_CMPUINT((unsigned)bytes[1], ==, 0xf8); } bson_destroy(&doc); } // Note: The effective MAX_TESTED_VECTOR_LENGTH is limited to 2047 on Windows due to RAND_MAX==0x7fff #define MAX_TESTED_VECTOR_LENGTH 10000 #define FUZZ_TEST_ITERS 5000 static void test_bson_vector_view_api_fuzz_int8(void) { size_t current_length = 0; bson_t vector_doc = BSON_INITIALIZER; int8_t *expected_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, int8_t); int8_t *actual_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, int8_t); for (int fuzz_iter = 0; fuzz_iter < FUZZ_TEST_ITERS; fuzz_iter++) { unsigned r = (unsigned)rand(); unsigned r_operation = r & 0xFu; size_t r_param = r >> 4; if (current_length == 0 || r_operation == 15) { // Resize and fill size_t new_length = (size_t)r_param % MAX_TESTED_VECTOR_LENGTH; bson_reinit(&vector_doc); bson_vector_int8_view_t view; ASSERT(BSON_APPEND_VECTOR_INT8_UNINIT(&vector_doc, "vector", new_length, &view)); for (size_t i = 0; i < new_length; i++) { expected_elements[i] = (int8_t)(uint8_t)rand(); } ASSERT(bson_vector_int8_view_write(view, expected_elements, new_length, 0)); current_length = new_length; } else if (r_operation < 7) { // Partial write size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); for (size_t i = 0; i < element_count; i++) { expected_elements[offset + i] = (int8_t)(uint8_t)rand(); } bson_vector_int8_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_int8_view_from_iter(&view, &iter)); ASSERT(bson_vector_int8_view_write(view, expected_elements + offset, element_count, offset)); } else { // Partial read size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); bson_vector_int8_const_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_int8_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_int8_const_view_read(view, actual_elements, element_count, offset)); ASSERT_MEMCMP(actual_elements, expected_elements + offset, element_count * sizeof *actual_elements); } } bson_destroy(&vector_doc); bson_free(expected_elements); bson_free(actual_elements); } static void test_bson_vector_view_api_fuzz_float32(void) { size_t current_length = 0; bson_t vector_doc = BSON_INITIALIZER; float *expected_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, float); float *actual_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, float); for (int fuzz_iter = 0; fuzz_iter < FUZZ_TEST_ITERS; fuzz_iter++) { unsigned r = (unsigned)rand(); unsigned r_operation = r & 0xFu; size_t r_param = r >> 4; if (current_length == 0 || r_operation == 15) { // Resize and fill size_t new_length = (size_t)r_param % MAX_TESTED_VECTOR_LENGTH; bson_reinit(&vector_doc); bson_vector_float32_view_t view; ASSERT(BSON_APPEND_VECTOR_FLOAT32_UNINIT(&vector_doc, "vector", new_length, &view)); for (size_t i = 0; i < new_length; i++) { expected_elements[i] = (float)rand(); } ASSERT(bson_vector_float32_view_write(view, expected_elements, new_length, 0)); current_length = new_length; } else if (r_operation < 7) { // Partial write size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); for (size_t i = 0; i < element_count; i++) { expected_elements[offset + i] = (float)rand(); } bson_vector_float32_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_float32_view_from_iter(&view, &iter)); ASSERT(bson_vector_float32_view_write(view, expected_elements + offset, element_count, offset)); } else { // Partial read size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); bson_vector_float32_const_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_float32_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_float32_const_view_read(view, actual_elements, element_count, offset)); ASSERT_MEMCMP(actual_elements, expected_elements + offset, element_count * sizeof *actual_elements); } } bson_destroy(&vector_doc); bson_free(expected_elements); bson_free(actual_elements); } static void test_bson_vector_view_api_fuzz_packed_bit(void) { size_t current_length = 0; bson_t vector_doc = BSON_INITIALIZER; bool *expected_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, bool); bool *actual_elements = BSON_ARRAY_ALLOC(MAX_TESTED_VECTOR_LENGTH, bool); uint8_t *packed_buffer = bson_malloc((MAX_TESTED_VECTOR_LENGTH + 7) / 8); for (int fuzz_iter = 0; fuzz_iter < FUZZ_TEST_ITERS; fuzz_iter++) { unsigned r = (unsigned)rand(); unsigned r_operation = r & 0xFu; size_t r_param = r >> 4; if (current_length == 0 || r_operation == 15) { // Resize and fill from unpacked bool source size_t new_length = (size_t)r_param % MAX_TESTED_VECTOR_LENGTH; bson_reinit(&vector_doc); bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&vector_doc, "vector", new_length, &view)); for (size_t i = 0; i < new_length; i++) { expected_elements[i] = ((unsigned)rand() & 1u) != 0u; } ASSERT(bson_vector_packed_bit_view_pack_bool(view, expected_elements, new_length, 0)); current_length = new_length; } else if (r_operation < 7) { // Partial write if (r_operation & 1) { // Partial write from unpacked bool source size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); for (size_t i = 0; i < element_count; i++) { expected_elements[offset + i] = ((unsigned)rand() & 1u) != 0u; } bson_vector_packed_bit_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_packed_bit_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_view_length(view) == current_length); ASSERT(bson_vector_packed_bit_view_pack_bool(view, expected_elements + offset, element_count, offset)); } else { // Partial write of packed bytes size_t current_length_bytes = (current_length + 7) / 8; size_t byte_count = r_param % current_length_bytes; size_t byte_offset = (size_t)rand() % (current_length_bytes - byte_count); for (size_t i = 0; i < byte_count; i++) { uint8_t packed_byte = (uint8_t)rand(); packed_buffer[i] = packed_byte; for (unsigned bit = 0; bit < 8; bit++) { expected_elements[(byte_offset + i) * 8 + bit] = (packed_byte & (0x80 >> bit)) != 0; } } bson_vector_packed_bit_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_packed_bit_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_view_length(view) == current_length); ASSERT(bson_vector_packed_bit_view_length_bytes(view) == current_length_bytes); ASSERT(bson_vector_packed_bit_view_write_packed(view, packed_buffer, byte_count, byte_offset)); } } else { // Partial read if (r_operation & 1) { // Partial read to unpacked bool destination size_t element_count = r_param % current_length; size_t offset = (size_t)rand() % (current_length - element_count); bson_vector_packed_bit_const_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_packed_bit_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_const_view_length(view) == current_length); ASSERT(bson_vector_packed_bit_const_view_unpack_bool(view, actual_elements, element_count, offset)); ASSERT_MEMCMP(actual_elements, expected_elements + offset, element_count * sizeof *actual_elements); } else { // Partial read of packed bytes size_t current_length_bytes = (current_length + 7) / 8; size_t byte_count = r_param % current_length_bytes; size_t byte_offset = (size_t)rand() % (current_length_bytes - byte_count); bson_vector_packed_bit_const_view_t view; bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &vector_doc, "vector")); ASSERT(bson_vector_packed_bit_const_view_from_iter(&view, &iter)); ASSERT(bson_vector_packed_bit_const_view_length(view) == current_length); ASSERT(bson_vector_packed_bit_const_view_length_bytes(view) == current_length_bytes); ASSERT(bson_vector_packed_bit_const_view_read_packed(view, packed_buffer, byte_count, byte_offset)); for (size_t i = 0; i < byte_count; i++) { uint8_t packed_byte = packed_buffer[i]; for (unsigned bit = 0; bit < 8; bit++) { ASSERT(expected_elements[(byte_offset + i) * 8 + bit] == ((packed_byte & (0x80 >> bit)) != 0)); } } } } } bson_destroy(&vector_doc); bson_free(expected_elements); bson_free(actual_elements); bson_free(packed_buffer); } static void test_bson_vector_example_int8_const_view(void) { // setup: construct a sample document bson_t doc = BSON_INITIALIZER; { static const int8_t values[] = {12, 34, -56}; bson_vector_int8_view_t view; ASSERT(BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "vector", sizeof values / sizeof values[0], &view)); ASSERT(bson_vector_int8_view_write(view, values, sizeof values / sizeof values[0], 0)); } // bson_vector_int8_const_view_t.rst // Edits: // - Added test_suite_debug_output() test. // - Added unnecessary zero initializer to work around false positive compiler warning. // (same as in bson_array_builder_append_vector_int8_elements) { bson_iter_t iter; bson_vector_int8_const_view_t view; if (bson_iter_init_find(&iter, &doc, "vector") && bson_vector_int8_const_view_from_iter(&view, &iter)) { size_t length = bson_vector_int8_const_view_length(view); if (test_suite_debug_output()) { printf("Elements in 'vector':\n"); } for (size_t i = 0; i < length; i++) { int8_t element = 0; // Workaround ASSERT(bson_vector_int8_const_view_read(view, &element, 1, i)); if (test_suite_debug_output()) { printf(" [%d] = %d\n", (int)i, (int)element); } } } } bson_destroy(&doc); } static void test_bson_vector_example_int8_view(void) { bson_t doc = BSON_INITIALIZER; // bson_vector_int8_view_t.rst { static const int8_t values[] = {1, 2, 3}; const size_t values_count = sizeof values / sizeof values[0]; bson_vector_int8_view_t view; ASSERT(BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "vector", values_count, &view)); ASSERT(bson_vector_int8_view_write(view, values, values_count, 0)); } bson_destroy(&doc); } static void test_bson_vector_example_float32_const_view(void) { // setup: construct a sample document bson_t doc = BSON_INITIALIZER; { const float values[] = {5.0f, -1e10f, INFINITY, NAN, -1.0f}; // C2099 "initializer is not a constant" bson_vector_float32_view_t view; ASSERT(BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "vector", sizeof values / sizeof values[0], &view)); ASSERT(bson_vector_float32_view_write(view, values, sizeof values / sizeof values[0], 0)); } // bson_vector_float32_const_view_t.rst // Edits: // - Added test_suite_debug_output() test. { bson_iter_t iter; bson_vector_float32_const_view_t view; if (bson_iter_init_find(&iter, &doc, "vector") && bson_vector_float32_const_view_from_iter(&view, &iter)) { size_t length = bson_vector_float32_const_view_length(view); if (test_suite_debug_output()) { printf("Elements in 'vector':\n"); } for (size_t i = 0; i < length; i++) { float element; ASSERT(bson_vector_float32_const_view_read(view, &element, 1, i)); if (test_suite_debug_output()) { printf(" [%d] = %f\n", (int)i, element); } } } } bson_destroy(&doc); } static void test_bson_vector_example_float32_view(void) { bson_t doc = BSON_INITIALIZER; // bson_vector_float32_view_t.rst { static const float values[] = {1.0f, 2.0f, 3.0f}; const size_t values_count = sizeof values / sizeof values[0]; bson_vector_float32_view_t view; ASSERT(BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "vector", values_count, &view)); ASSERT(bson_vector_float32_view_write(view, values, values_count, 0)); } bson_destroy(&doc); } static void test_bson_vector_example_packed_bit_const_view(void) { // setup: construct a sample document bson_t doc = BSON_INITIALIZER; { static const bool values[] = {true, false, true, true, false, true, false, true, true, false}; bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "vector", sizeof values / sizeof values[0], &view)); ASSERT(bson_vector_packed_bit_view_pack_bool(view, values, sizeof values / sizeof values[0], 0)); } // bson_vector_packed_bit_const_view_t.rst // Edits: // - Added test_suite_debug_output() test. // - Added unnecessary zero initializer to work around false positive compiler warning. // (same as in bson_array_builder_append_vector_int8_elements) { bson_iter_t iter; bson_vector_packed_bit_const_view_t view; if (bson_iter_init_find(&iter, &doc, "vector") && bson_vector_packed_bit_const_view_from_iter(&view, &iter)) { size_t length = bson_vector_packed_bit_const_view_length(view); size_t length_bytes = bson_vector_packed_bit_const_view_length_bytes(view); size_t padding = bson_vector_packed_bit_const_view_padding(view); if (test_suite_debug_output()) { printf("Elements in 'vector':\n"); } for (size_t i = 0; i < length; i++) { bool element; ASSERT(bson_vector_packed_bit_const_view_unpack_bool(view, &element, 1, i)); if (test_suite_debug_output()) { printf(" elements[%d] = %d\n", (int)i, (int)element); } } if (test_suite_debug_output()) { printf("Bytes in 'vector': (%d bits unused)\n", (int)padding); } for (size_t i = 0; i < length_bytes; i++) { uint8_t packed_byte = 0; // Workaround ASSERT(bson_vector_packed_bit_const_view_read_packed(view, &packed_byte, 1, i)); if (test_suite_debug_output()) { printf(" bytes[%d] = 0x%02x\n", (int)i, (unsigned)packed_byte); } } } } bson_destroy(&doc); } static void test_bson_vector_example_packed_bit_view(void) { bson_t doc = BSON_INITIALIZER; // bson_vector_packed_bit_view_t.rst { // Fill a new vector with individual boolean elements { static const bool bool_values[] = {true, false, true, true, false}; const size_t bool_values_count = sizeof bool_values / sizeof bool_values[0]; bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "from_bool", bool_values_count, &view)); ASSERT(bson_vector_packed_bit_view_pack_bool(view, bool_values, bool_values_count, 0)); } // Fill another new vector with packed bytes { static const uint8_t packed_bytes[] = {0xb0}; const size_t unused_bits_count = 3; const size_t packed_values_count = sizeof packed_bytes * 8 - unused_bits_count; bson_vector_packed_bit_view_t view; ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "from_packed", packed_values_count, &view)); ASSERT(bson_vector_packed_bit_view_write_packed(view, packed_bytes, sizeof packed_bytes, 0)); } // Compare both vectors. They match exactly. { bson_iter_t from_bool_iter, from_packed_iter; ASSERT(bson_iter_init_find(&from_bool_iter, &doc, "from_bool")); ASSERT(bson_iter_init_find(&from_packed_iter, &doc, "from_packed")); ASSERT(bson_iter_binary_equal(&from_bool_iter, &from_packed_iter)); } } bson_destroy(&doc); } // Shared edge case tests that apply to all reader/writer functions. #define TEST_BSON_VECTOR_RW(_expected, _view, _v, _count, _offset, _read, _write) \ if (true) { \ ASSERT((_expected) == (_write)((_view), (_v), (_count), (_offset))); \ ASSERT((_expected) == (_read)((_view), (_v), (_count), (_offset))); \ } else \ ((void)0) #if defined(__USE_FORTIFY_LEVEL) && __USE_FORTIFY_LEVEL > 0 // Prevent memcpy size overflows even in dead code #define MAX_TESTABLE_COPY_COUNT (SIZE_MAX / 2u / sizeof(float)) #else // Allow dead code to contain an oversized or overflowing memcpy #define MAX_TESTABLE_COPY_COUNT SIZE_MAX #endif #define TEST_BSON_VECTOR_EDGE_CASES_RW_COMMON(_view, _alloc_size, _v, _v_size, _read, _write) \ if (true) { \ TEST_BSON_VECTOR_RW(false, (_view), (_v), (_alloc_size) + 1u, 0, (_read), (_write)); \ TEST_BSON_VECTOR_RW(true, (_view), (_v), (_v_size), (_alloc_size) - (_v_size), (_read), (_write)); \ TEST_BSON_VECTOR_RW(false, (_view), (_v), (_v_size), (_alloc_size) - (_v_size) + 1u, (_read), (_write)); \ TEST_BSON_VECTOR_RW(false, (_view), (_v), (_v_size) + 1u, (_alloc_size) - (_v_size), (_read), (_write)); \ TEST_BSON_VECTOR_RW( \ false, (_view), (_v), MAX_TESTABLE_COPY_COUNT, (_alloc_size) - (_v_size), (_read), (_write)); \ TEST_BSON_VECTOR_RW( \ false, (_view), (_v), MAX_TESTABLE_COPY_COUNT, (_alloc_size) - (_v_size) + 1u, (_read), (_write)); \ TEST_BSON_VECTOR_RW(true, (_view), (_v), (_v_size), 0, (_read), (_write)); \ } else \ ((void)0) static void test_bson_vector_edge_cases_int8(void) { size_t max_representable_elements = (size_t)UINT32_MAX - BSON_VECTOR_HEADER_LEN; // Test binary_data_length (uint32_t) edge cases, without any allocation. { ASSERT_CMPUINT32(bson_vector_int8_binary_data_length(max_representable_elements - 1u), ==, UINT32_MAX - 1u); ASSERT_CMPUINT32(bson_vector_int8_binary_data_length(max_representable_elements), ==, UINT32_MAX); ASSERT_CMPUINT32(bson_vector_int8_binary_data_length(max_representable_elements + 1u), ==, 0); } // Needs little real memory because most bytes are never accessed, // but we should require a virtual address space larger than 32 bits. #if BSON_WORD_SIZE > 32 size_t expected_bson_overhead = 5 /* empty bson document */ + 3 /* "v" element header */ + 5 /* binary item header */; size_t max_alloc_elements = (size_t)BSON_MAX_SIZE - expected_bson_overhead - BSON_VECTOR_HEADER_LEN; bson_t doc = BSON_INITIALIZER; bson_vector_int8_view_t view; // Test allocation (BSON_MAX_SIZE + uint32_t) edge cases. { ASSERT(!BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "v", max_representable_elements, &view)); ASSERT(!BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "v", max_representable_elements + 1u, &view)); ASSERT(!BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "v", max_alloc_elements + 1u, &view)); ASSERT(BSON_APPEND_VECTOR_INT8_UNINIT(&doc, "v", max_alloc_elements, &view)); } // Test some read and write boundaries. { size_t values_size = 100; int8_t *values = BSON_ARRAY_ALLOC0(values_size, int8_t); TEST_BSON_VECTOR_EDGE_CASES_RW_COMMON( view, max_alloc_elements, values, values_size, bson_vector_int8_view_read, bson_vector_int8_view_write); bson_free(values); } bson_destroy(&doc); #endif // BSON_WORD_SIZE > 32 } static void test_bson_vector_edge_cases_float32(void) { size_t max_representable_elements = ((size_t)UINT32_MAX - BSON_VECTOR_HEADER_LEN) / sizeof(float); // Test binary_data_length (uint32_t) edge cases, without any allocation. // Note that the longest possible multiple of a complete element is 1 byte short of UINT32_MAX. { ASSERT_CMPUINT32( bson_vector_float32_binary_data_length(max_representable_elements - 1u), ==, UINT32_MAX - 1u - 4u); ASSERT_CMPUINT32(bson_vector_float32_binary_data_length(max_representable_elements), ==, UINT32_MAX - 1u); ASSERT_CMPUINT32(bson_vector_float32_binary_data_length(max_representable_elements + 1u), ==, 0); } // Needs little real memory because most bytes are never accessed, // but we should require a virtual address space larger than 32 bits. #if BSON_WORD_SIZE > 32 size_t expected_bson_overhead = 5 /* empty bson document */ + 3 /* "v" element header */ + 5 /* binary item header */; size_t max_alloc_elements = ((size_t)BSON_MAX_SIZE - expected_bson_overhead - BSON_VECTOR_HEADER_LEN) / sizeof(float); bson_t doc = BSON_INITIALIZER; bson_vector_float32_view_t view; // Test allocation (BSON_MAX_SIZE + uint32_t) edge cases. { ASSERT(!BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "v", max_representable_elements, &view)); ASSERT(!BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "v", max_representable_elements + 1u, &view)); ASSERT(!BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "v", max_alloc_elements + 1u, &view)); ASSERT(BSON_APPEND_VECTOR_FLOAT32_UNINIT(&doc, "v", max_alloc_elements, &view)); } // Test some read and write boundaries. { size_t values_size = 100; float *values = BSON_ARRAY_ALLOC0(values_size, float); TEST_BSON_VECTOR_EDGE_CASES_RW_COMMON( view, max_alloc_elements, values, values_size, bson_vector_float32_view_read, bson_vector_float32_view_write); bson_free(values); } bson_destroy(&doc); #endif // BSON_WORD_SIZE > 32 } static void test_bson_vector_edge_cases_packed_bit(void) { // Test UINT32_MAX as an element count. This is the largest representable on systems with a 32-bit size_t. uint32_t len_for_max_count = (uint32_t)(((uint64_t)UINT32_MAX + 7u) / 8u + BSON_VECTOR_HEADER_LEN); { ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX), ==, len_for_max_count); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX - 1u), ==, len_for_max_count); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX - 6u), ==, len_for_max_count); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX - 7u), ==, len_for_max_count - 1u); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX - 8u), ==, len_for_max_count - 1u); } // Test the real max_representable_elements only if size_t is large enough. #if SIZE_MAX > UINT32_MAX size_t max_representable_elements = ((size_t)UINT32_MAX - BSON_VECTOR_HEADER_LEN) * 8u; // Test binary_data_length (uint32_t) edge cases, without any allocation. { ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX + 1u), ==, len_for_max_count); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX + 2u), ==, len_for_max_count + 1u); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length((size_t)UINT32_MAX + 9u), ==, len_for_max_count + 1u); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length(max_representable_elements - 8u), ==, UINT32_MAX - 1u); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length(max_representable_elements - 7u), ==, UINT32_MAX); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length(max_representable_elements), ==, UINT32_MAX); ASSERT_CMPUINT32(bson_vector_packed_bit_binary_data_length(max_representable_elements + 1u), ==, 0); } #endif // SIZE_MAX > UINT32_MAX // If we additionally have a 64-bit address space, allocate this max-sized vector and run tests. // Needs little real memory because most bytes are never accessed. #if BSON_WORD_SIZE > 32 #if !(SIZE_MAX > UINT32_MAX) #error 64-bit platforms should have a 64-bit size_t #endif size_t expected_bson_overhead = 5 /* empty bson document */ + 3 /* "v" element header */ + 5 /* binary item header */; size_t max_alloc_bytes = (size_t)BSON_MAX_SIZE - expected_bson_overhead - BSON_VECTOR_HEADER_LEN; size_t max_alloc_elements = max_alloc_bytes * 8u; bson_t doc = BSON_INITIALIZER; bson_vector_packed_bit_view_t view; // Test allocation (BSON_MAX_SIZE + uint32_t) edge cases. { ASSERT(!BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "v", max_representable_elements, &view)); ASSERT(!BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "v", max_representable_elements + 1u, &view)); ASSERT(!BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "v", max_alloc_elements + 1u, &view)); ASSERT(BSON_APPEND_VECTOR_PACKED_BIT_UNINIT(&doc, "v", max_alloc_elements, &view)); } // Test pack and unpack boundaries with the same tests used for read/write of non-packed element types. // Only tests one length, but it's chosen to be greater than 8 and not a multiple of 8. { size_t values_size = 190; bool *values = BSON_ARRAY_ALLOC0(values_size, bool); TEST_BSON_VECTOR_EDGE_CASES_RW_COMMON(view, max_alloc_elements, values, values_size, bson_vector_packed_bit_view_unpack_bool, bson_vector_packed_bit_view_pack_bool); bson_free(values); } // Test read and write boundaries on packed bytes. { size_t packed_size = 50; uint8_t *packed = bson_malloc0(packed_size); TEST_BSON_VECTOR_EDGE_CASES_RW_COMMON(view, max_alloc_bytes, packed, packed_size, bson_vector_packed_bit_view_read_packed, bson_vector_packed_bit_view_write_packed); bson_free(packed); } bson_destroy(&doc); #endif // BSON_WORD_SIZE > 32 } void test_bson_vector_install(TestSuite *suite) { install_json_test_suite_with_check(suite, BSON_JSON_DIR, "bson_binary_vector", test_bson_vector_json_cb); TestSuite_Add(suite, "/bson_binary_vector/view_api/usage/int8", test_bson_vector_view_api_usage_int8); TestSuite_Add(suite, "/bson_binary_vector/view_api/usage/float32", test_bson_vector_view_api_usage_float32); TestSuite_Add(suite, "/bson_binary_vector/view_api/usage/packed_bit", test_bson_vector_view_api_usage_packed_bit); TestSuite_Add(suite, "/bson_binary_vector/view_api/fuzz/int8", test_bson_vector_view_api_fuzz_int8); TestSuite_Add(suite, "/bson_binary_vector/view_api/fuzz/float32", test_bson_vector_view_api_fuzz_float32); TestSuite_Add(suite, "/bson_binary_vector/view_api/fuzz/packed_bit", test_bson_vector_view_api_fuzz_packed_bit); TestSuite_Add(suite, "/bson_binary_vector/example/int8_const_view", test_bson_vector_example_int8_const_view); TestSuite_Add(suite, "/bson_binary_vector/example/int8_view", test_bson_vector_example_int8_view); TestSuite_Add(suite, "/bson_binary_vector/example/float32_const_view", test_bson_vector_example_float32_const_view); TestSuite_Add(suite, "/bson_binary_vector/example/float32_view", test_bson_vector_example_float32_view); TestSuite_Add( suite, "/bson_binary_vector/example/packed_bit_const_view", test_bson_vector_example_packed_bit_const_view); TestSuite_Add(suite, "/bson_binary_vector/example/packed_bit_view", test_bson_vector_example_packed_bit_view); TestSuite_Add(suite, "/bson_binary_vector/edge_cases/int8", test_bson_vector_edge_cases_int8); TestSuite_Add(suite, "/bson_binary_vector/edge_cases/float32", test_bson_vector_edge_cases_float32); TestSuite_Add(suite, "/bson_binary_vector/edge_cases/packed_bit", test_bson_vector_edge_cases_packed_bit); } mongo-c-driver-2.2.1/src/libbson/tests/test-bson-version.c000066400000000000000000000012121511661753600235010ustar00rootroot00000000000000#include #include static void test_bson_version(void) { ASSERT_CMPINT(bson_get_major_version(), ==, BSON_MAJOR_VERSION); ASSERT_CMPINT(bson_get_minor_version(), ==, BSON_MINOR_VERSION); ASSERT_CMPINT(bson_get_micro_version(), ==, BSON_MICRO_VERSION); ASSERT_CMPSTR(bson_get_version(), BSON_VERSION_S); ASSERT(bson_check_version(BSON_MAJOR_VERSION, BSON_MINOR_VERSION, BSON_MICRO_VERSION)); ASSERT(!bson_check_version(BSON_MAJOR_VERSION, BSON_MINOR_VERSION + 1, BSON_MICRO_VERSION)); } void test_bson_version_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/version", test_bson_version); } mongo-c-driver-2.2.1/src/libbson/tests/test-bson.c000066400000000000000000002604721511661753600220350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include /* CDRIVER-2460 ensure the unused old BSON_ASSERT_STATIC macro still compiles */ BSON_STATIC_ASSERT(1 == 1); static bson_t * get_bson(const char *filename) { ssize_t len; uint8_t buf[4096]; bson_t *b; char real_filename[256]; int fd; bson_snprintf(real_filename, sizeof real_filename, BSON_BINARY_DIR "/%s", filename); real_filename[sizeof real_filename - 1] = '\0'; if (-1 == (fd = bson_open(real_filename, O_RDONLY))) { fprintf(stderr, "Failed to bson_open: %s\n", real_filename); abort(); } len = bson_read(fd, buf, sizeof buf); BSON_ASSERT(len > 0); b = bson_new_from_data(buf, (uint32_t)len); bson_close(fd); return b; } static void test_bson_new(void) { bson_t *b; b = bson_new(); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); bson_destroy(b); b = bson_sized_new(32); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); bson_destroy(b); } static void test_bson_alloc(void) { static const uint8_t empty_bson[] = {5, 0, 0, 0, 0}; bson_t *b; b = bson_new(); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); BSON_ASSERT((b->flags & BSON_FLAG_INLINE)); BSON_ASSERT(!(b->flags & BSON_FLAG_CHILD)); BSON_ASSERT(!(b->flags & BSON_FLAG_STATIC)); BSON_ASSERT(!(b->flags & BSON_FLAG_NO_FREE)); bson_destroy(b); /* * This checks that we fit in the inline buffer size. */ b = bson_sized_new(44); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); BSON_ASSERT((b->flags & BSON_FLAG_INLINE)); bson_destroy(b); /* * Make sure we grow to next power of 2. */ b = bson_sized_new(121); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); BSON_ASSERT(!(b->flags & BSON_FLAG_INLINE)); bson_destroy(b); /* * Make sure we grow to next power of 2. */ b = bson_sized_new(129); ASSERT_CMPUINT32(b->len, ==, (uint32_t)5); BSON_ASSERT(!(b->flags & BSON_FLAG_INLINE)); bson_destroy(b); b = bson_new_from_data(empty_bson, sizeof empty_bson); ASSERT_CMPUINT32(b->len, ==, (uint32_t)sizeof empty_bson); BSON_ASSERT((b->flags & BSON_FLAG_INLINE)); BSON_ASSERT(!memcmp(bson_get_data(b), empty_bson, sizeof empty_bson)); bson_destroy(b); } static void test_bson_array_alloc(void) { // Can allocate an array of items: { int *arr = BSON_ARRAY_ALLOC(2, int); arr[0] = 1; arr[1] = 2; bson_free(arr); } // Allocating with overflow in byte size aborts: mlib_assert_aborts () { int *arr = BSON_ARRAY_ALLOC(SIZE_MAX, int); bson_free(arr); } } static void BSON_ASSERT_BSON_EQUAL(const bson_t *a, const bson_t *b) { const uint8_t *data1 = bson_get_data(a); const uint8_t *data2 = bson_get_data(b); uint32_t i; if (!bson_equal(a, b)) { for (i = 0; i < BSON_MAX(a->len, b->len); i++) { if (i >= a->len) { printf("a is too short len=%u\n", a->len); abort(); } else if (i >= b->len) { printf("b is too short len=%u\n", b->len); abort(); } if (data1[i] != data2[i]) { printf("a[%u](0x%02x,%u) != b[%u](0x%02x,%u)\n", i, data1[i], data1[i], i, data2[i], data2[i]); abort(); } } } } static void BSON_ASSERT_BSON_EQUAL_FILE(const bson_t *b, const char *filename) { bson_t *b2 = get_bson(filename); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b2); } static void test_bson_append_utf8(void) { bson_t *b; bson_t *b2; b = bson_new(); b2 = get_bson("test11.bson"); BSON_ASSERT(bson_append_utf8(b, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_symbol(void) { bson_t *b; bson_t *b2; b = bson_new(); b2 = get_bson("test32.bson"); BSON_ASSERT(bson_append_symbol(b, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_null(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_null(b, "hello", -1)); b2 = get_bson("test18.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_bool(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_bool(b, "bool", -1, true)); b2 = get_bson("test19.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_double(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_double(b, "double", -1, 123.4567)); b2 = get_bson("test20.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_document(void) { bson_t *b; bson_t *b2; b = bson_new(); b2 = bson_new(); BSON_ASSERT(bson_append_document(b, "document", -1, b2)); bson_destroy(b2); b2 = get_bson("test21.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_oid(void) { bson_oid_t oid; bson_t *b; bson_t *b2; bson_oid_init_from_string(&oid, "1234567890abcdef1234abcd"); b = bson_new(); BSON_ASSERT(bson_append_oid(b, "oid", -1, &oid)); b2 = get_bson("test22.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_array(void) { bson_t *b; bson_t *b2; b = bson_new(); b2 = bson_new(); BSON_ASSERT(bson_append_utf8(b2, "0", -1, "hello", -1)); BSON_ASSERT(bson_append_utf8(b2, "1", -1, "world", -1)); BSON_ASSERT(bson_append_array(b, "array", -1, b2)); bson_destroy(b2); b2 = get_bson("test23.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_binary(void) { static const uint8_t binary[] = {'1', '2', '3', '4'}; bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_binary(b, "binary", -1, BSON_SUBTYPE_USER, binary, 4)); b2 = get_bson("test24.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_binary_deprecated(void) { static const uint8_t binary[] = {'1', '2', '3', '4'}; bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_binary(b, "binary", -1, BSON_SUBTYPE_BINARY_DEPRECATED, binary, 4)); b2 = get_bson("binary_deprecated.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_time_t(void) { bson_t *b; bson_t *b2; time_t t; t = 1234567890; b = bson_new(); BSON_ASSERT(bson_append_time_t(b, "time_t", -1, t)); b2 = get_bson("test26.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_timeval(void) { struct timeval tv = {0}; bson_t *b; bson_t *b2; tv.tv_sec = 1234567890; tv.tv_usec = 0; b = bson_new(); BSON_ASSERT(bson_append_timeval(b, "time_t", -1, &tv)); b2 = get_bson("test26.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_undefined(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_undefined(b, "undefined", -1)); b2 = get_bson("test25.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_regex(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_regex(b, "regex", -1, "^abcd", "ilx")); b2 = get_bson("test27.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_regex_w_len(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_regex_w_len(b, "regex", -1, "^abcd", 5, "ilx")); b2 = get_bson("test27.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); b = bson_new(); BSON_ASSERT(bson_append_regex_w_len(b, "regex", -1, "^abcd", -1, "ilx")); b2 = get_bson("test27.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); b = bson_new(); BSON_ASSERT(bson_append_regex_w_len(b, "regex", -1, "^abcd ", 5, "ilx")); b2 = get_bson("test27.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_code(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_code(b, "code", -1, "var a = {};")); b2 = get_bson("test29.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_code_with_scope(void) { const uint8_t *scope_buf = NULL; uint32_t scopelen = 0; uint32_t len = 0; bson_iter_t iter; bool r; const char *code = NULL; bson_t *b; bson_t *b2; bson_t *scope; bson_error_t err; bool eof; bson_reader_t *reader; const bson_t *ticket_bson; uint8_t malformed_data[] = { 0x00, 0x00, 0x00, 0x00, /* length of doc (set below) */ 0x0F, /* code_w_s type */ 0x00, /* empty key */ 0x10, 0x00, 0x00, 0x00, /* code_w_s length (needs to be > 14 for initial */ /* validation so give a non-empty scope doc) */ 0x00, 0x00, 0x00, 0x00, /* invalid string length (must have trailing \0) */ 0x08, 0x00, 0x00, 0x00, /* scope doc length */ 0x08, 0x00, 0x00, /* "" : false */ 0x00, /* end of scope doc */ 0x00 /* end of doc */ }; /* Test with NULL bson, which converts to just CODE type. */ b = bson_new(); BSON_ASSERT(bson_append_code_with_scope(b, "code", -1, "var a = {};", NULL)); b2 = get_bson("test30.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); r = bson_iter_init_find(&iter, b, "code"); BSON_ASSERT(r); BSON_ASSERT(BSON_ITER_HOLDS_CODE(&iter)); /* Not codewscope */ bson_destroy(b); bson_destroy(b2); /* Empty scope is still CODEWSCOPE. */ b = bson_new(); scope = bson_new(); BSON_ASSERT(bson_append_code_with_scope(b, "code", -1, "var a = {};", scope)); b2 = get_bson("code_w_empty_scope.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); r = bson_iter_init_find(&iter, b, "code"); BSON_ASSERT(r); BSON_ASSERT(BSON_ITER_HOLDS_CODEWSCOPE(&iter)); bson_destroy(b); bson_destroy(b2); bson_destroy(scope); /* Test with non-empty scope */ b = bson_new(); scope = bson_new(); BSON_ASSERT(bson_append_utf8(scope, "foo", -1, "bar", -1)); BSON_ASSERT(bson_append_code_with_scope(b, "code", -1, "var a = {};", scope)); b2 = get_bson("test31.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); r = bson_iter_init_find(&iter, b, "code"); BSON_ASSERT(r); BSON_ASSERT(BSON_ITER_HOLDS_CODEWSCOPE(&iter)); code = bson_iter_codewscope(&iter, &len, &scopelen, &scope_buf); BSON_ASSERT(len == 11); BSON_ASSERT(scopelen == scope->len); BSON_ASSERT(!strcmp(code, "var a = {};")); bson_destroy(b); bson_destroy(b2); bson_destroy(scope); /* CDRIVER-2269 Test with a malformed zero length code string */ malformed_data[0] = (uint8_t)sizeof(malformed_data); b = bson_new_from_data(malformed_data, sizeof(malformed_data)); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); bson_destroy(b); /* CDRIVER-2269 Test with malformed BSON from ticket */ reader = bson_reader_new_from_file(BSON_BINARY_DIR "/cdriver2269.bson", &err); BSON_ASSERT(reader); ticket_bson = bson_reader_read(reader, &eof); BSON_ASSERT(ticket_bson); BSON_ASSERT(bson_iter_init(&iter, ticket_bson)); BSON_ASSERT(!bson_iter_next(&iter)); bson_reader_destroy(reader); } static void test_bson_append_dbpointer(void) { bson_oid_t oid; bson_t *b; bson_t *b2; uint8_t malformed_data[] = { 0x0C, 0x00, 0x00, 0x00, /* document length (12) */ 0x0C, /* dbpointer type */ 0x00, /* empty string key */ 0x04, 0x00, 0x00, 0x00, /* string length (4). This is OOB. */ 0x00, /* empty string */ 0x00 /* end of document */ }; size_t error_offset = 0; b = bson_new(); bson_oid_init_from_string(&oid, "0123abcd0123abcd0123abcd"); BSON_ASSERT(bson_append_dbpointer(b, "dbpointer", -1, "foo", &oid)); b2 = get_bson("test28.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); b = bson_new_from_data(malformed_data, sizeof(malformed_data)); BSON_ASSERT(b); BSON_ASSERT(!bson_validate(b, BSON_VALIDATE_NONE, &error_offset)); BSON_ASSERT(error_offset == 6); bson_destroy(b); } static void test_bson_append_int32(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_int32(b, "a", -1, -123)); BSON_ASSERT(bson_append_int32(b, "c", -1, 0)); BSON_ASSERT(bson_append_int32(b, "b", -1, 123)); b2 = get_bson("test33.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_int64(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_int64(b, "a", -1, 100000000000000ULL)); b2 = get_bson("test34.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_decimal128(void) { bson_t *b; bson_t *b2; bson_decimal128_t value; value.high = 0; value.low = 1; b = bson_new(); BSON_ASSERT(bson_append_decimal128(b, "a", -1, &value)); b2 = get_bson("test58.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_iter(void) { bson_iter_t iter; bool r; bson_t b; bson_t c; bson_init(&b); bson_append_int32(&b, "a", 1, 1); bson_append_int32(&b, "b", 1, 2); bson_append_int32(&b, "c", 1, 3); bson_append_utf8(&b, "d", 1, "hello", 5); bson_init(&c); r = bson_iter_init_find(&iter, &b, "a"); BSON_ASSERT(r); r = bson_append_iter(&c, NULL, 0, &iter); BSON_ASSERT(r); r = bson_iter_init_find(&iter, &b, "c"); BSON_ASSERT(r); r = bson_append_iter(&c, NULL, 0, &iter); BSON_ASSERT(r); r = bson_iter_init_find(&iter, &b, "d"); BSON_ASSERT(r); r = bson_append_iter(&c, "world", -1, &iter); BSON_ASSERT(r); bson_iter_init(&iter, &c); r = bson_iter_next(&iter); BSON_ASSERT(r); ASSERT_CMPSTR("a", bson_iter_key(&iter)); ASSERT_CMPINT(BSON_TYPE_INT32, ==, bson_iter_type(&iter)); ASSERT_CMPINT(1, ==, bson_iter_int32(&iter)); r = bson_iter_next(&iter); BSON_ASSERT(r); ASSERT_CMPSTR("c", bson_iter_key(&iter)); ASSERT_CMPINT(BSON_TYPE_INT32, ==, bson_iter_type(&iter)); ASSERT_CMPINT(3, ==, bson_iter_int32(&iter)); r = bson_iter_next(&iter); BSON_ASSERT(r); ASSERT_CMPINT(BSON_TYPE_UTF8, ==, bson_iter_type(&iter)); ASSERT_CMPSTR("world", bson_iter_key(&iter)); ASSERT_CMPSTR("hello", bson_iter_utf8(&iter, NULL)); bson_destroy(&b); bson_destroy(&c); } static void test_bson_append_timestamp(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_timestamp(b, "timestamp", -1, 1234, 9876)); b2 = get_bson("test35.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_maxkey(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_maxkey(b, "maxkey", -1)); b2 = get_bson("test37.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_minkey(void) { bson_t *b; bson_t *b2; b = bson_new(); BSON_ASSERT(bson_append_minkey(b, "minkey", -1)); b2 = get_bson("test36.bson"); BSON_ASSERT_BSON_EQUAL(b, b2); bson_destroy(b); bson_destroy(b2); } static void test_bson_append_general(void) { uint8_t bytes[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x23, 0x45}; bson_oid_t oid; bson_t *bson; bson_t *array; bson_t *subdoc; bson = bson_new(); BSON_ASSERT(bson_append_int32(bson, "int", -1, 1)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test1.bson"); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_int64(bson, "int64", -1, 1)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test2.bson"); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_double(bson, "double", -1, 1.123)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test3.bson"); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_utf8(bson, "string", -1, "some string", -1)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test5.bson"); bson_destroy(bson); bson = bson_new(); array = bson_new(); BSON_ASSERT(bson_append_int32(array, "0", -1, 1)); BSON_ASSERT(bson_append_int32(array, "1", -1, 2)); BSON_ASSERT(bson_append_int32(array, "2", -1, 3)); BSON_ASSERT(bson_append_int32(array, "3", -1, 4)); BSON_ASSERT(bson_append_int32(array, "4", -1, 5)); BSON_ASSERT(bson_append_int32(array, "5", -1, 6)); BSON_ASSERT(bson_append_array(bson, "array[int]", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test6.bson"); bson_destroy(array); bson_destroy(bson); bson = bson_new(); array = bson_new(); BSON_ASSERT(bson_append_double(array, "0", -1, 1.123)); BSON_ASSERT(bson_append_double(array, "1", -1, 2.123)); BSON_ASSERT(bson_append_array(bson, "array[double]", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test7.bson"); bson_destroy(array); bson_destroy(bson); bson = bson_new(); subdoc = bson_new(); BSON_ASSERT(bson_append_int32(subdoc, "int", -1, 1)); BSON_ASSERT(bson_append_document(bson, "document", -1, subdoc)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test8.bson"); bson_destroy(subdoc); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_null(bson, "null", -1)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test9.bson"); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_regex(bson, "regex", -1, "1234", "i")); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test10.bson"); bson_destroy(bson); bson = bson_new(); BSON_ASSERT(bson_append_utf8(bson, "hello", -1, "world", -1)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test11.bson"); bson_destroy(bson); bson = bson_new(); array = bson_new(); BSON_ASSERT(bson_append_utf8(array, "0", -1, "awesome", -1)); BSON_ASSERT(bson_append_double(array, "1", -1, 5.05)); BSON_ASSERT(bson_append_int32(array, "2", -1, 1986)); BSON_ASSERT(bson_append_array(bson, "BSON", -1, array)); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test12.bson"); bson_destroy(bson); bson_destroy(array); bson = bson_new(); memcpy(&oid, bytes, sizeof oid); BSON_ASSERT(bson_append_oid(bson, "_id", -1, &oid)); subdoc = bson_new(); BSON_ASSERT(bson_append_oid(subdoc, "_id", -1, &oid)); array = bson_new(); BSON_ASSERT(bson_append_utf8(array, "0", -1, "1", -1)); BSON_ASSERT(bson_append_utf8(array, "1", -1, "2", -1)); BSON_ASSERT(bson_append_utf8(array, "2", -1, "3", -1)); BSON_ASSERT(bson_append_utf8(array, "3", -1, "4", -1)); BSON_ASSERT(bson_append_array(subdoc, "tags", -1, array)); bson_destroy(array); BSON_ASSERT(bson_append_utf8(subdoc, "text", -1, "asdfanother", -1)); array = bson_new(); BSON_ASSERT(bson_append_utf8(array, "name", -1, "blah", -1)); BSON_ASSERT(bson_append_document(subdoc, "source", -1, array)); bson_destroy(array); BSON_ASSERT(bson_append_document(bson, "document", -1, subdoc)); bson_destroy(subdoc); array = bson_new(); BSON_ASSERT(bson_append_utf8(array, "0", -1, "source", -1)); BSON_ASSERT(bson_append_array(bson, "type", -1, array)); bson_destroy(array); array = bson_new(); BSON_ASSERT(bson_append_utf8(array, "0", -1, "server_created_at", -1)); BSON_ASSERT(bson_append_array(bson, "missing", -1, array)); bson_destroy(array); BSON_ASSERT_BSON_EQUAL_FILE(bson, "test17.bson"); bson_destroy(bson); } static void test_bson_append_deep(void) { bson_t *a; bson_t *tmp; int i; a = bson_new(); for (i = 0; i < 100; i++) { tmp = a; a = bson_new(); BSON_ASSERT(bson_append_document(a, "a", -1, tmp)); bson_destroy(tmp); } BSON_ASSERT_BSON_EQUAL_FILE(a, "test38.bson"); bson_destroy(a); } static void _make_deep_bson(bson_t *const dst, const size_t depth) { const size_t n_docs = depth + 1; // Needed size: 5 bytes for doc header/trailer, 2 bytes for each tag and empty // key, minus 2 because the outer document has no tag and key const size_t buffer_size = (n_docs * (5 + 2)) - 2; uint8_t *const buffer = calloc(buffer_size, 1); mlib_check(buffer); uint8_t *out = buffer; mlib_foreach_urange (i, n_docs) { // Bytes we have already written: const size_t begin_offset = (size_t)(out - buffer); // The number of bytes for this inner doc: size_t inner_size = buffer_size; mlib_check(!mlib_sub(&inner_size, begin_offset)); mlib_check(!mlib_sub(&inner_size, i)); // Write a header: out = (uint8_t *)mlib_write_i32le(out, mlib_assert_narrow(int32_t, inner_size)); // Add a new element header if we're not at the innermost doc if (!loop.last) { *out++ = 0x3; // Document tag ++out; // Leave a null terminator to make a "" key string } } bson_t big; mlib_check(bson_init_static(&big, buffer, buffer_size)); bson_copy_to(&big, dst); free(buffer); } /** * @brief Test case: Check that we stop validating if we go too deep. * * The current validation is implemented as a simple recursive algorithm. This * is fast since it doesn't allocate, but we risk blowing out the stack if the * data is too deep. We don't want to crash user applications because of untrusted * input, so assert that we stop when we hit a reasonably high depth. */ static void test_bson_validate_deep(void) { bson_t deep; // Just barely too deep _make_deep_bson(&deep, BSON_VALIDATION_MAX_NESTING_DEPTH + 1); bson_error_t err; mlib_check(!bson_validate_with_error(&deep, 0, &err)); mlib_check(err.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(err.message, str_eq, "BSON document nesting depth is too deep"); bson_destroy(&deep); // At the limit _make_deep_bson(&deep, BSON_VALIDATION_MAX_NESTING_DEPTH); mlib_check(bson_validate(&deep, 0, NULL)); bson_destroy(&deep); } static void test_bson_validate_with_error_and_offset(void) { size_t err_offset = 12345; bson_error_t err = {67890}; bson_t bson = {0}; ASSERT(!bson_validate_with_error_and_offset(&bson, BSON_VALIDATE_NONE, &err_offset, &err)); ASSERT_CMPSIZE_T(err_offset, ==, 0); ASSERT_CMPUINT32(err.domain, !=, 67890); // domain is overwritten. } static void test_bson_init(void) { bson_t b; char key[12]; int i; bson_init(&b); BSON_ASSERT((b.flags & BSON_FLAG_INLINE)); BSON_ASSERT((b.flags & BSON_FLAG_STATIC)); BSON_ASSERT(!(b.flags & BSON_FLAG_RDONLY)); for (i = 0; i < 100; i++) { bson_snprintf(key, sizeof key, "%d", i); BSON_ASSERT(bson_append_utf8(&b, key, -1, "bar", -1)); } BSON_ASSERT(!(b.flags & BSON_FLAG_INLINE)); bson_destroy(&b); } static void test_bson_init_static(void) { static const uint8_t data[5] = {5}; bson_t b; ASSERT(bson_init_static(&b, data, sizeof data)); BSON_ASSERT((b.flags & BSON_FLAG_RDONLY)); bson_destroy(&b); } static void * realloc_func_never_called(void *mem, size_t num_bytes, void *ctx) { // Reallocate function for tests that should never reallocate BSON_UNUSED(num_bytes); BSON_UNUSED(ctx); BSON_ASSERT(false); return mem; } static void test_bson_new_from_buffer(void) { // Buffer size matches document size { size_t len = 5; uint8_t *buf = bson_malloc0(5); mlib_write_i32le(buf, 5); bson_t *b = bson_new_from_buffer(&buf, &len, bson_realloc_ctx, NULL); BSON_ASSERT(b->flags & BSON_FLAG_NO_FREE); BSON_ASSERT(len == 5); BSON_ASSERT(b->len == 5); bson_append_utf8(b, "hello", -1, "world", -1); BSON_ASSERT(len == 32); BSON_ASSERT(b->len == 22); bson_destroy(b); BSON_ASSERT(buf); bson_free(buf); } // Buffer is NULL. An empty document will be allocated. { uint8_t *buf = NULL; size_t len = 0; bson_t *b = bson_new_from_buffer(&buf, &len, bson_realloc_ctx, NULL); BSON_ASSERT(b->flags & BSON_FLAG_NO_FREE); BSON_ASSERT(len == 5); BSON_ASSERT(b->len == 5); bson_destroy(b); BSON_ASSERT(buf); bson_free(buf); } // Buffer is larger than the document. Expect it to be growable without reallocating. { size_t buf_len = 0x10000; uint8_t *buf = bson_malloc0(buf_len); uint32_t doc_len_le = BSON_UINT32_TO_LE(5); memcpy(buf, &doc_len_le, sizeof(doc_len_le)); bson_t *b = bson_new_from_buffer(&buf, &buf_len, realloc_func_never_called, NULL); BSON_ASSERT(b->flags & BSON_FLAG_NO_FREE); BSON_ASSERT(buf_len == 0x10000); BSON_ASSERT(&buf_len == ((bson_impl_alloc_t *)b)->buflen); BSON_ASSERT(b->len == 5); bson_append_utf8(b, "hello", -1, "world", -1); BSON_ASSERT(buf_len == 0x10000); BSON_ASSERT(b->len == 22); bson_destroy(b); BSON_ASSERT(buf); bson_free(buf); } // Otherwise valid, but buffer is smaller than the document size. bson_new_from_buffer() must fail. { uint8_t *buf = NULL; size_t buf_len = SIZE_MAX; // Must be ignored when buf == NULL // Start with a valid doc bson_t *valid_doc = bson_new_from_buffer(&buf, &buf_len, bson_realloc_ctx, NULL); BSON_ASSERT(BSON_APPEND_UTF8(valid_doc, "hello", "world")); ASSERT_CMPUINT32(valid_doc->len, ==, 22); bson_destroy(valid_doc); ASSERT_CMPSIZE_T(buf_len, ==, 32); // Check that a slightly-too-small buffer is rejected buf_len = 21; BSON_ASSERT(!bson_new_from_buffer(&buf, &buf_len, realloc_func_never_called, NULL)); // Successful return if one more byte is included in the buf_len. buf_len++; bson_t *minimal = bson_new_from_buffer(&buf, &buf_len, realloc_func_never_called, NULL); BSON_ASSERT(minimal != NULL); ASSERT_CMPUINT32(minimal->len, ==, 22); bson_destroy(minimal); bson_free(buf); } } static void test_bson_utf8_key(void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" #define FIVE_EUROS EU EU EU EU EU uint32_t length; bson_iter_t iter; const char *str; bson_t *b; size_t offset; b = get_bson("eurokey.bson"); BSON_ASSERT(bson_validate(b, BSON_VALIDATE_NONE, &offset)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(!strcmp(bson_iter_key(&iter), FIVE_EUROS)); str = bson_iter_utf8(&iter, &length); BSON_ASSERT(str); BSON_ASSERT(length == 15); /* 5 3-byte sequences. */ BSON_ASSERT(!strcmp(str, FIVE_EUROS)); bson_destroy(b); } static void test_bson_new_1mm(void) { bson_t *b; int i; for (i = 0; i < 1000000; i++) { b = bson_new(); bson_destroy(b); } } static void test_bson_init_1mm(void) { bson_t b; int i; for (i = 0; i < 1000000; i++) { bson_init(&b); bson_destroy(&b); } } static void test_bson_build_child(void) { bson_t b; bson_t child; bson_t *b2; bson_t *child2; bson_init(&b); BSON_ASSERT(bson_append_document_begin(&b, "foo", -1, &child)); BSON_ASSERT(bson_append_utf8(&child, "bar", -1, "baz", -1)); BSON_ASSERT(bson_append_document_end(&b, &child)); b2 = bson_new(); child2 = bson_new(); BSON_ASSERT(bson_append_utf8(child2, "bar", -1, "baz", -1)); BSON_ASSERT(bson_append_document(b2, "foo", -1, child2)); bson_destroy(child2); BSON_ASSERT(b.len == b2->len); BSON_ASSERT_BSON_EQUAL(&b, b2); bson_destroy(&b); bson_destroy(b2); } static void test_bson_build_child_array(void) { bson_t b; bson_t child; bson_t *b2; bson_t *child2; bson_init(&b); BSON_ASSERT(bson_append_array_begin(&b, "foo", -1, &child)); BSON_ASSERT(bson_append_utf8(&child, "0", -1, "baz", -1)); BSON_ASSERT(bson_append_array_end(&b, &child)); b2 = bson_new(); child2 = bson_new(); BSON_ASSERT(bson_append_utf8(child2, "0", -1, "baz", -1)); BSON_ASSERT(bson_append_array(b2, "foo", -1, child2)); bson_destroy(child2); BSON_ASSERT(b.len == b2->len); BSON_ASSERT_BSON_EQUAL(&b, b2); bson_destroy(&b); bson_destroy(b2); } static void test_bson_build_child_deep_1(bson_t *b, int *count) { bson_t child; (*count)++; BSON_ASSERT(bson_append_document_begin(b, "b", -1, &child)); BSON_ASSERT(!(b->flags & BSON_FLAG_INLINE)); BSON_ASSERT((b->flags & BSON_FLAG_IN_CHILD)); BSON_ASSERT(!(child.flags & BSON_FLAG_INLINE)); BSON_ASSERT((child.flags & BSON_FLAG_STATIC)); BSON_ASSERT((child.flags & BSON_FLAG_CHILD)); if (*count < 100) { test_bson_build_child_deep_1(&child, count); } else { BSON_ASSERT(bson_append_int32(&child, "b", -1, 1234)); } BSON_ASSERT(bson_append_document_end(b, &child)); BSON_ASSERT(!(b->flags & BSON_FLAG_IN_CHILD)); } static void test_bson_build_child_deep(void) { union { bson_t b; bson_impl_alloc_t a; } u; int count = 0; bson_init(&u.b); BSON_ASSERT((u.b.flags & BSON_FLAG_INLINE)); test_bson_build_child_deep_1(&u.b, &count); BSON_ASSERT(!(u.b.flags & BSON_FLAG_INLINE)); BSON_ASSERT((u.b.flags & BSON_FLAG_STATIC)); BSON_ASSERT(!(u.b.flags & BSON_FLAG_NO_FREE)); BSON_ASSERT(!(u.b.flags & BSON_FLAG_RDONLY)); BSON_ASSERT(bson_validate(&u.b, BSON_VALIDATE_NONE, NULL)); BSON_ASSERT(((bson_impl_alloc_t *)&u.b)->alloclen == 1024); BSON_ASSERT_BSON_EQUAL_FILE(&u.b, "test39.bson"); bson_destroy(&u.b); } static void test_bson_build_child_deep_no_begin_end_1(bson_t *b, int *count) { bson_t child; (*count)++; bson_init(&child); if (*count < 100) { test_bson_build_child_deep_1(&child, count); } else { BSON_ASSERT(bson_append_int32(&child, "b", -1, 1234)); } BSON_ASSERT(bson_append_document(b, "b", -1, &child)); bson_destroy(&child); } static void test_bson_build_child_deep_no_begin_end(void) { union { bson_t b; bson_impl_alloc_t a; } u; int count = 0; bson_init(&u.b); test_bson_build_child_deep_no_begin_end_1(&u.b, &count); BSON_ASSERT(bson_validate(&u.b, BSON_VALIDATE_NONE, NULL)); BSON_ASSERT(u.a.alloclen == 1024); BSON_ASSERT_BSON_EQUAL_FILE(&u.b, "test39.bson"); bson_destroy(&u.b); } static void test_bson_count_keys(void) { bson_t b; bson_init(&b); BSON_ASSERT(bson_append_int32(&b, "0", -1, 0)); BSON_ASSERT(bson_append_int32(&b, "1", -1, 1)); BSON_ASSERT(bson_append_int32(&b, "2", -1, 2)); ASSERT_CMPINT(bson_count_keys(&b), ==, 3); bson_destroy(&b); } static void test_bson_copy(void) { bson_t b; bson_t *c; bson_init(&b); BSON_ASSERT(bson_append_int32(&b, "foobar", -1, 1234)); c = bson_copy(&b); BSON_ASSERT_BSON_EQUAL(&b, c); bson_destroy(c); bson_destroy(&b); } static void test_bson_copy_to(void) { bson_t b; bson_t c; int i; /* * Test inline structure copy. */ bson_init(&b); BSON_ASSERT(bson_append_int32(&b, "foobar", -1, 1234)); bson_copy_to(&b, &c); BSON_ASSERT_BSON_EQUAL(&b, &c); bson_destroy(&c); bson_destroy(&b); /* * Test malloced copy. */ bson_init(&b); for (i = 0; i < 1000; i++) { BSON_ASSERT(bson_append_int32(&b, "foobar", -1, 1234)); } bson_copy_to(&b, &c); BSON_ASSERT_BSON_EQUAL(&b, &c); bson_destroy(&c); bson_destroy(&b); } static void test_bson_copy_to_excluding_noinit(void) { bson_iter_t iter; bool r; bson_t b; bson_t c; int i; bson_init(&b); bson_append_int32(&b, "a", 1, 1); bson_append_int32(&b, "b", 1, 2); bson_init(&c); bson_copy_to_excluding_noinit(&b, &c, "b", NULL); r = bson_iter_init_find(&iter, &c, "a"); BSON_ASSERT(r); r = bson_iter_init_find(&iter, &c, "b"); BSON_ASSERT(!r); i = bson_count_keys(&b); ASSERT_CMPINT(i, ==, 2); i = bson_count_keys(&c); ASSERT_CMPINT(i, ==, 1); bson_destroy(&b); bson_destroy(&c); } static void test_bson_append_overflow(void) { const char *key = "a"; uint32_t len; bson_t b; len = BSON_MAX_SIZE; len -= 4; /* len */ len -= 1; /* type */ len -= 1; /* value */ len -= 1; /* end byte */ bson_init(&b); BSON_ASSERT(!bson_append_bool(&b, key, len, true)); bson_destroy(&b); } static void test_bson_initializer(void) { bson_t b = BSON_INITIALIZER; BSON_ASSERT(bson_empty(&b)); bson_append_bool(&b, "foo", -1, true); BSON_ASSERT(!bson_empty(&b)); bson_destroy(&b); } static void test_bson_concat(void) { bson_t a = BSON_INITIALIZER; bson_t b = BSON_INITIALIZER; bson_t c = BSON_INITIALIZER; bson_append_int32(&a, "abc", 3, 1); bson_append_int32(&b, "def", 3, 1); bson_concat(&a, &b); bson_append_int32(&c, "abc", 3, 1); bson_append_int32(&c, "def", 3, 1); BSON_ASSERT(0 == bson_compare(&c, &a)); bson_destroy(&a); bson_destroy(&b); bson_destroy(&c); } static void test_bson_reinit(void) { bson_t b = BSON_INITIALIZER; int i; for (i = 0; i < 1000; i++) { bson_append_int32(&b, "", 0, i); } bson_reinit(&b); for (i = 0; i < 1000; i++) { bson_append_int32(&b, "", 0, i); } bson_destroy(&b); } static void test_bson_macros(void) { const uint8_t data[] = {1, 2, 3, 4}; bson_t b = BSON_INITIALIZER; bson_t ar = BSON_INITIALIZER; bson_decimal128_t dec; bson_oid_t oid; struct timeval tv; time_t t; dec.high = 0x3040000000000000ULL; dec.low = 0x0ULL; t = time(NULL); #ifdef BSON_OS_WIN32 tv.tv_sec = (long)t; #else tv.tv_sec = t; #endif tv.tv_usec = 0; bson_oid_init(&oid, NULL); BSON_APPEND_ARRAY(&b, "0", &ar); BSON_APPEND_BINARY(&b, "1", 0, data, sizeof data); BSON_APPEND_BOOL(&b, "2", true); BSON_APPEND_CODE(&b, "3", "function(){}"); BSON_APPEND_CODE_WITH_SCOPE(&b, "4", "function(){}", &ar); BSON_APPEND_DOUBLE(&b, "6", 123.45); BSON_APPEND_DOCUMENT(&b, "7", &ar); BSON_APPEND_INT32(&b, "8", 123); BSON_APPEND_INT64(&b, "9", 456); BSON_APPEND_MINKEY(&b, "10"); BSON_APPEND_MAXKEY(&b, "11"); BSON_APPEND_NULL(&b, "12"); BSON_APPEND_OID(&b, "13", &oid); BSON_APPEND_REGEX(&b, "14", "^abc", "i"); BSON_APPEND_UTF8(&b, "15", "utf8"); BSON_APPEND_SYMBOL(&b, "16", "symbol"); BSON_APPEND_TIME_T(&b, "17", t); BSON_APPEND_TIMEVAL(&b, "18", &tv); BSON_APPEND_DATE_TIME(&b, "19", 123); BSON_APPEND_TIMESTAMP(&b, "20", 123, 0); BSON_APPEND_UNDEFINED(&b, "21"); BSON_APPEND_DECIMAL128(&b, "22", &dec); bson_destroy(&b); bson_destroy(&ar); } static void test_bson_clear(void) { bson_t *doc = NULL; bson_clear(&doc); BSON_ASSERT(doc == NULL); doc = bson_new(); BSON_ASSERT(doc != NULL); bson_clear(&doc); BSON_ASSERT(doc == NULL); } static void bloat(bson_t *b) { uint32_t i; char buf[16]; const char *key; for (i = 0; i < 100; i++) { bson_uint32_to_string(i, &key, buf, sizeof buf); BSON_APPEND_UTF8(b, key, "long useless value foo bar baz quux quizzle"); } /* spilled over */ ASSERT(!(b->flags & BSON_FLAG_INLINE)); } static void test_bson_steal(void) { bson_t stack_alloced; bson_t *heap_alloced; bson_t dst; uint8_t *alloc; uint8_t *buf; size_t len; /* inline, stack-allocated */ bson_init(&stack_alloced); BSON_APPEND_INT32(&stack_alloced, "a", 1); ASSERT(bson_steal(&dst, &stack_alloced)); ASSERT(bson_has_field(&dst, "a")); ASSERT(dst.flags & BSON_FLAG_INLINE); /* src was invalidated */ ASSERT(!bson_validate(&stack_alloced, BSON_VALIDATE_NONE, 0)); bson_destroy(&dst); /* spilled over, stack-allocated */ bson_init(&stack_alloced); bloat(&stack_alloced); alloc = ((bson_impl_alloc_t *)&stack_alloced)->alloc; ASSERT(bson_steal(&dst, &stack_alloced)); /* data was transferred */ ASSERT(alloc == ((bson_impl_alloc_t *)&dst)->alloc); ASSERT(bson_has_field(&dst, "99")); ASSERT(!(dst.flags & BSON_FLAG_INLINE)); ASSERT(!bson_validate(&stack_alloced, BSON_VALIDATE_NONE, 0)); bson_destroy(&dst); /* inline, heap-allocated */ heap_alloced = bson_new(); BSON_APPEND_INT32(heap_alloced, "a", 1); ASSERT(bson_steal(&dst, heap_alloced)); ASSERT(bson_has_field(&dst, "a")); ASSERT(dst.flags & BSON_FLAG_INLINE); bson_destroy(&dst); /* spilled over, heap-allocated */ heap_alloced = bson_new(); bloat(heap_alloced); alloc = ((bson_impl_alloc_t *)heap_alloced)->alloc; ASSERT(bson_steal(&dst, heap_alloced)); /* data was transferred */ ASSERT(alloc == ((bson_impl_alloc_t *)&dst)->alloc); ASSERT(bson_has_field(&dst, "99")); ASSERT(!(dst.flags & BSON_FLAG_INLINE)); bson_destroy(&dst); /* test stealing from a bson created with bson_new_from_buffer */ buf = bson_malloc0(5); len = 5; mlib_write_u32le(buf, 5); heap_alloced = bson_new_from_buffer(&buf, &len, bson_realloc_ctx, NULL); ASSERT(bson_steal(&dst, heap_alloced)); ASSERT(dst.flags & BSON_FLAG_NO_FREE); ASSERT(dst.flags & BSON_FLAG_STATIC); ASSERT(((bson_impl_alloc_t *)&dst)->realloc == bson_realloc_ctx); ASSERT(((bson_impl_alloc_t *)&dst)->realloc_func_ctx == NULL); bson_destroy(&dst); bson_free(buf); } static void BSON_ASSERT_KEY_AND_VALUE(const bson_t *bson) { bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, bson, "key")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR("value", bson_iter_utf8(&iter, NULL)); } static void test_bson_reserve_buffer(void) { bson_t src = BSON_INITIALIZER; bson_t stack_alloced; bson_t *heap_alloced; uint8_t *buf; /* inline, stack-allocated */ bson_init(&stack_alloced); BSON_APPEND_UTF8(&src, "key", "value"); ASSERT((buf = bson_reserve_buffer(&stack_alloced, src.len))); ASSERT_CMPUINT32(src.len, ==, stack_alloced.len); ASSERT(stack_alloced.flags & BSON_FLAG_INLINE); memcpy(buf, ((bson_impl_inline_t *)&src)->data, src.len); /* data was transferred */ BSON_ASSERT_KEY_AND_VALUE(&stack_alloced); bson_destroy(&stack_alloced); /* spilled over, stack-allocated */ bloat(&src); bson_init(&stack_alloced); ASSERT((buf = bson_reserve_buffer(&stack_alloced, src.len))); ASSERT_CMPUINT32(src.len, ==, stack_alloced.len); ASSERT(!(stack_alloced.flags & BSON_FLAG_INLINE)); memcpy(buf, ((bson_impl_alloc_t *)&src)->alloc, src.len); BSON_ASSERT_KEY_AND_VALUE(&stack_alloced); ASSERT(bson_has_field(&stack_alloced, "99")); bson_destroy(&src); bson_destroy(&stack_alloced); /* inline, heap-allocated */ heap_alloced = bson_new(); bson_init(&src); BSON_APPEND_UTF8(&src, "key", "value"); ASSERT((buf = bson_reserve_buffer(heap_alloced, src.len))); ASSERT_CMPUINT32(src.len, ==, heap_alloced->len); ASSERT(heap_alloced->flags & BSON_FLAG_INLINE); memcpy(buf, ((bson_impl_inline_t *)&src)->data, src.len); BSON_ASSERT_KEY_AND_VALUE(heap_alloced); bson_destroy(heap_alloced); /* spilled over, heap-allocated */ heap_alloced = bson_new(); bloat(&src); ASSERT((buf = bson_reserve_buffer(heap_alloced, src.len))); ASSERT_CMPUINT32(src.len, ==, heap_alloced->len); ASSERT(!(heap_alloced->flags & BSON_FLAG_INLINE)); memcpy(buf, ((bson_impl_alloc_t *)&src)->alloc, src.len); BSON_ASSERT_KEY_AND_VALUE(heap_alloced); ASSERT(bson_has_field(heap_alloced, "99")); bson_destroy(&src); bson_destroy(heap_alloced); } static void test_bson_reserve_buffer_errors(void) { bson_t bson = BSON_INITIALIZER; bson_t child; uint8_t data[5] = {0}; /* too big */ ASSERT(!bson_reserve_buffer(&bson, (uint32_t)(BSON_MAX_SIZE + 1u))); /* exactly the maximum size */ #if BSON_WORD_SIZE > 32 ASSERT(bson_reserve_buffer(&bson, (uint32_t)BSON_MAX_SIZE)); ASSERT_CMPUINT32(bson.len, ==, BSON_MAX_SIZE); #endif bson_destroy(&bson); /* make a static bson, it refuses bson_reserve_buffer since it's read-only */ mlib_write_u32le(data, 5); ASSERT(bson_init_static(&bson, data, sizeof data)); ASSERT(!bson_reserve_buffer(&bson, 10)); /* parent's and child's buffers are locked */ bson_init(&bson); BSON_APPEND_DOCUMENT_BEGIN(&bson, "child", &child); ASSERT(!bson_reserve_buffer(&bson, 10)); ASSERT(!bson_reserve_buffer(&child, 10)); /* unlock parent's buffer */ bson_append_document_end(&bson, &child); ASSERT(bson_reserve_buffer(&bson, 10)); bson_destroy(&bson); } static void test_bson_destroy_with_steal(void) { bson_t *b1; bson_t b2; uint32_t len = 0; uint8_t *data; int i; b1 = bson_new(); for (i = 0; i < 100; i++) { BSON_APPEND_INT32(b1, "some-key", i); } data = bson_destroy_with_steal(b1, true, &len); BSON_ASSERT(data); BSON_ASSERT(len == 1405); bson_free(data); data = NULL; bson_init(&b2); len = 0; for (i = 0; i < 100; i++) { BSON_APPEND_INT32(&b2, "some-key", i); } BSON_ASSERT(!bson_destroy_with_steal(&b2, false, &len)); BSON_ASSERT(len == 1405); bson_init(&b2); BSON_ASSERT(!bson_destroy_with_steal(&b2, false, NULL)); bson_init(&b2); data = bson_destroy_with_steal(&b2, true, &len); BSON_ASSERT(data); BSON_ASSERT(len == 5); bson_free(data); data = NULL; } static void test_bson_has_field(void) { bson_t *b; bool r; b = BCON_NEW("foo", "[", "{", "bar", BCON_INT32(1), "}", "]"); r = bson_has_field(b, "foo"); BSON_ASSERT(r); r = bson_has_field(b, "foo.0"); BSON_ASSERT(r); r = bson_has_field(b, "foo.0.bar"); BSON_ASSERT(r); r = bson_has_field(b, "0"); BSON_ASSERT(!r); r = bson_has_field(b, "bar"); BSON_ASSERT(!r); r = bson_has_field(b, "0.bar"); BSON_ASSERT(!r); bson_destroy(b); } static void test_next_power_of_two(void) { size_t s; s = 3; s = bson_next_power_of_two(s); BSON_ASSERT(s == 4); s = 4; s = bson_next_power_of_two(s); BSON_ASSERT(s == 4); s = 33; s = bson_next_power_of_two(s); BSON_ASSERT(s == 64); s = 91; s = bson_next_power_of_two(s); BSON_ASSERT(s == 128); s = 939524096UL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 1073741824); s = 1073741824UL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 1073741824UL); #if BSON_WORD_SIZE == 64 s = 4294967296LL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 4294967296LL); s = 4294967297LL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 8589934592LL); s = 17179901952LL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 34359738368LL); s = 9223372036854775807ULL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 9223372036854775808ULL); s = 36028795806651656ULL; s = bson_next_power_of_two(s); BSON_ASSERT(s == 36028797018963968ULL); #endif } void visit_corrupt(const bson_iter_t *iter, void *data) { BSON_UNUSED(iter); *((bool *)data) = true; } static void test_bson_visit_invalid_field(void) { /* key is invalid utf-8 char: {"\x80": 1} */ const char data[] = "\x0c\x00\x00\x00\x10\x80\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; bson_visitor_t visitor = {0}; bool visited = false; visitor.visit_corrupt = visit_corrupt; BSON_ASSERT(bson_init_static(&b, (const uint8_t *)data, sizeof data - 1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(!bson_iter_visit_all(&iter, &visitor, (void *)&visited)); BSON_ASSERT(visited); } typedef struct { bool visited; const char *key; uint32_t type_code; } unsupported_type_test_data_t; void visit_unsupported_type(const bson_iter_t *iter, const char *key, uint32_t type_code, void *data) { unsupported_type_test_data_t *context; BSON_UNUSED(iter); context = (unsupported_type_test_data_t *)data; context->visited = true; context->key = key; context->type_code = type_code; } static void test_bson_visit_unsupported_type(void) { /* {k: 1}, but instead of BSON type 0x10 (int32), use unknown type 0x33 */ const char data[] = "\x0c\x00\x00\x00\x33k\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT(bson_init_static(&b, (const uint8_t *)data, sizeof data - 1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(!bson_iter_visit_all(&iter, &visitor, (void *)&context)); BSON_ASSERT(!bson_iter_next(&iter)); BSON_ASSERT(context.visited); BSON_ASSERT(!strcmp(context.key, "k")); BSON_ASSERT(context.type_code == '\x33'); } static void test_bson_visit_unsupported_type_bad_key(void) { /* key is invalid utf-8 char, '\x80' */ const char data[] = "\x0c\x00\x00\x00\x33\x80\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT(bson_init_static(&b, (const uint8_t *)data, sizeof data - 1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(!bson_iter_visit_all(&iter, &visitor, (void *)&context)); BSON_ASSERT(!bson_iter_next(&iter)); /* unsupported type error wasn't reported, because the bson is corrupt */ BSON_ASSERT(!context.visited); } static void test_bson_visit_unsupported_type_empty_key(void) { /* {"": 1}, but instead of BSON type 0x10 (int32), use unknown type 0x33 */ const char data[] = "\x0b\x00\x00\x00\x33\x00\x01\x00\x00\x00\x00"; bson_t b; bson_iter_t iter; unsupported_type_test_data_t context = {0}; bson_visitor_t visitor = {0}; visitor.visit_unsupported_type = visit_unsupported_type; BSON_ASSERT(bson_init_static(&b, (const uint8_t *)data, sizeof data - 1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(!bson_iter_visit_all(&iter, &visitor, (void *)&context)); BSON_ASSERT(!bson_iter_next(&iter)); BSON_ASSERT(context.visited); BSON_ASSERT(!strcmp(context.key, "")); BSON_ASSERT(context.type_code == '\x33'); } static void test_bson_subtype_2(void) { bson_t b; /* taken from BSON Corpus Tests */ const char ok[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00\x02\x02\x00" "\x00\x00\xff\xff\x00"; /* Deprecated subtype 0x02 includes a redundant length inside the binary * payload. Check that we validate this length. */ const char len_too_long[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\x03\x00\x00\x00\xFF\xFF\x00"; const char len_too_short[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\x01\x00\x00\x00\xFF\xFF\x00"; const char len_negative[] = "\x13\x00\x00\x00\x05\x78\x00\x06\x00\x00\x00" "\x02\xFF\xFF\xFF\xFF\xFF\xFF\x00"; bson_t *bson_ok = BCON_NEW("x", BCON_BIN(2, (uint8_t *)"\xff\xff", 2)); BSON_ASSERT(bson_init_static(&b, (uint8_t *)ok, sizeof(ok) - 1)); BSON_ASSERT(bson_validate(&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT(0 == bson_compare(&b, bson_ok)); BSON_ASSERT(bson_init_static(&b, (uint8_t *)len_too_long, sizeof(len_too_long) - 1)); BSON_ASSERT(!bson_validate(&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT(bson_init_static(&b, (uint8_t *)len_too_short, sizeof(len_too_short) - 1)); BSON_ASSERT(!bson_validate(&b, BSON_VALIDATE_NONE, 0)); BSON_ASSERT(bson_init_static(&b, (uint8_t *)len_negative, sizeof(len_negative) - 1)); BSON_ASSERT(!bson_validate(&b, BSON_VALIDATE_NONE, 0)); bson_destroy(bson_ok); } /* CDRIVER-2455 Off-by-one error while appending regex */ void test_bson_regex_lengths(void) { bson_t new = BSON_INITIALIZER; bson_oid_t oid; bson_oid_init_from_string(&oid, "1234567890abcdef12345678"); bson_append_oid(&new, "0123456", -1, &oid); bson_append_regex( &new, "0_________1_________2_________3___4", -1, "0_________1_________2_________3_________4_________5___4", "i"); ASSERT(new.len == 121); ASSERT(new.flags & BSON_FLAG_STATIC); ASSERT(!(new.flags & BSON_FLAG_INLINE)); bson_destroy(&new); } void test_bson_empty_binary(void) { uint8_t data = 0xAB; bson_t test; const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_init(&test); bson_append_binary(&test, "test", 4, BSON_SUBTYPE_BINARY, &data, 0); BSON_ASSERT(bson_iter_init_find(&iter, &test, "test")); value = bson_iter_value(&iter); /* CDRIVER-2569, this would memcpy (0 bytes) to a NULL destination. */ bson_value_copy(value, ©); bson_value_destroy(©); bson_destroy(&test); } void test_bson_iter_key_len(void) { bson_t *bson = bson_with_all_types(); bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, bson)); while (bson_iter_next(&iter)) { ASSERT_WITH_MSG(strlen(bson_iter_key(&iter)) == bson_iter_key_len(&iter), "iter_key_len differs from real key length. got %" PRIu32 " but expected %zu for key %s\n", bson_iter_key_len(&iter), strlen(bson_iter_key(&iter)), bson_iter_key(&iter)); } } void test_bson_iter_init_from_data_at_offset(void) { bson_t *bson = bson_with_all_types(); /* zero out iter, since bson_iter_init doesn't zero out iter->value. */ bson_iter_t iter = {0}; BSON_ASSERT(bson_iter_init(&iter, bson)); ASSERT_CMPINT(bson_iter_offset(&iter), ==, 0); while (bson_iter_next(&iter)) { const uint8_t *data = bson_get_data(bson); int keylen = bson_iter_key_len(&iter); uint32_t offset = bson_iter_offset(&iter); bson_iter_t recreated = {0}; BSON_ASSERT(bson_iter_init_from_data_at_offset(&recreated, data, bson->len, offset, keylen)); if (memcmp((void *)&iter, (void *)&recreated, sizeof(bson_iter_t)) != 0) { int i; bson_iter_t *iters[] = {&iter, &recreated}; fprintf(stderr, "recreated iterator does not match initial iterator:\n"); for (i = 0; i < 2; i++) { fprintf(stderr, "iter %d: ", i); fprintf(stderr, "len=%" PRIu32 ", off=%" PRIu32 ", type=%" PRIu32 ", key=%" PRIu32 ", d1=%" PRIu32 ", d2=%" PRIu32 ", d3=%" PRIu32 ", d4=%" PRIu32 ", next_off=%" PRIu32 ", err_off=%" PRIu32 "\n", iters[i]->len, iters[i]->off, iters[i]->type, iters[i]->key, iters[i]->d1, iters[i]->d2, iters[i]->d3, iters[i]->d4, iters[i]->next_off, iters[i]->err_off); } ASSERT(false); } } } static void _check_null_binary(bson_t *bson, bool is_legacy) { const bson_value_t *original; bson_value_t copy; bson_iter_t iter; BSON_UNUSED(is_legacy); BSON_ASSERT(bson_iter_init_find(&iter, bson, "binary")); BSON_ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); original = bson_iter_value(&iter); ASSERT_CMPINT(original->value.v_binary.data_len, ==, 0); /* Because v_binary.data points to the BSON buffer, data is not NULL */ BSON_ASSERT(original->value.v_binary.data != NULL); /* But copying it results in a NULL value because it is empty, even if is * legacy binary, (which appends the length in the data payload when * appending). */ bson_value_copy(original, ©); BSON_ASSERT(copy.value.v_binary.data_len == 0); BSON_ASSERT(copy.value.v_binary.data == NULL); bson_value_destroy(©); } /* Check the behavior of what happens when that bson binary value is NULL. */ static void _binary_null_handling(bool is_legacy) { bson_value_t val; bson_t *bson; bson_error_t error; bson_subtype_t subtype = BSON_SUBTYPE_BINARY; if (is_legacy) { subtype = BSON_SUBTYPE_BINARY_DEPRECATED; } bson = bson_new(); BSON_ASSERT(bson_append_binary(bson, "binary", -1, subtype, NULL, 0)); _check_null_binary(bson, is_legacy); bson_destroy(bson); /* Appending NULL with non-zero length is an error */ bson = bson_new(); BSON_ASSERT(!bson_append_binary(bson, "binary", -1, subtype, NULL, 1)); bson_destroy(bson); bson = bson_new(); val.value_type = BSON_TYPE_BINARY; val.value.v_binary.subtype = subtype; val.value.v_binary.data = NULL; val.value.v_binary.data_len = 0; BSON_ASSERT(bson_append_value(bson, "binary", -1, &val)); _check_null_binary(bson, is_legacy); bson_destroy(bson); bson = BCON_NEW("binary", BCON_BIN(subtype, NULL, 0)); _check_null_binary(bson, is_legacy); bson_destroy(bson); bson = bson_new_from_json((uint8_t *)"{\"binary\": { \"$binary\": { \"subType\": \"00\", " "\"base64\": \"\" } } }", -1, &error); ASSERT_OR_PRINT(bson, error); _check_null_binary(bson, is_legacy); bson_destroy(bson); } static void test_bson_binary_null_handling(void) { _binary_null_handling(false /* is legacy */); _binary_null_handling(true /* is legacy */); } static void test_bson_append_null_from_utf8_or_symbol(void) { bson_t bson; bson_iter_t iter; bson_init(&bson); bson_append_utf8(&bson, "from_utf8", -1, NULL, 0); bson_append_symbol(&bson, "from_symbol", -1, NULL, 0); bson_iter_init(&iter, &bson); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_NULL(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_NULL(&iter)); bson_destroy(&bson); } static void test_bson_as_json_string(void) { bson_t *all_types; char *actual; const char *expected = "{ \"double\" : { \"$numberDouble\" : \"1.0\" }, \"string\" : " "\"string_example\", \"document\" : { \"x\" : \"y\" }, \"document\" : [ " "\"x\" ], \"binary\" : { \"$binary\" : { \"base64\" : \"ZGF0YQ==\", " "\"subType\" : \"00\" } }, \"undefined\" : { \"$undefined\" : true }, " "\"oid\" : { \"$oid\" : \"000000000000000000000000\" }, \"bool\" : true, " "\"datetime\" : { \"$date\" : { \"$numberLong\" : \"123\" } }, \"null\" " ": null, \"regex\" : { \"$regularExpression\" : { \"pattern\" : \"a+\", " "\"options\" : \"\" } }, \"dbpointer\" : { \"$dbPointer\" : { \"$ref\" : " "\"collection\", \"$id\" : { \"$oid\" : \"000000000000000000000000\" } } " "}, \"code\" : { \"$code\" : \"var x = 1;\" }, \"symbol\" : { " "\"$symbol\" : \"symbol_example\" }, \"code\" : { \"$code\" : \"var x = " "1;\" }, \"code_w_scope\" : { \"$code\" : \"var x = 1;\", \"$scope\" : { " "} }, \"int32\" : { \"$numberInt\" : \"1\" }, \"timestamp\" : { " "\"$timestamp\" : { \"t\" : 2, \"i\" : 3 } }, \"int64\" : { " "\"$numberLong\" : \"4\" }, \"decimal128\" : { \"$numberDecimal\" : " "\"1.23456789\" }, \"minkey\" : { \"$minKey\" : 1 }, \"maxkey\" : { " "\"$maxKey\" : 1 }, \"\" : { \"$numberInt\" : \"-1\" } }"; all_types = bson_with_all_types(); actual = bson_as_canonical_extended_json(all_types, NULL); for (size_t i = 0u; i < strlen(expected); i++) { if (expected[i] != actual[i]) { test_error("character mismatch at %zu. Expected: %s, got %s", i, expected, actual); } } bson_free(actual); } #define JSON_STRING(...) #__VA_ARGS__ #define TMP_BSON_FROM_JSON(...) tmp_bson(JSON_STRING(__VA_ARGS__)) /** * @brief Test the parsing component of the BSON EDSL */ static void test_bson_dsl_parse(void) { // Do nothing: bsonParse(*TMP_BSON_FROM_JSON({}), do()); BSON_ASSERT(!bsonParseError); // Generate an error bsonParse(*TMP_BSON_FROM_JSON({}), error("failed 1")); ASSERT_CMPSTR(bsonParseError, "failed 1"); // Error is reset on each entry bsonParse(*TMP_BSON_FROM_JSON({}), do()); BSON_ASSERT(!bsonParseError); // Find an element bson_t *simple_foo_bar = TMP_BSON_FROM_JSON({"foo" : "bar"}); bool found = false; bsonParse(*simple_foo_bar, find(key("foo"), do(found = true))); BSON_ASSERT(found); // Store a reference to the string const char *found_string = NULL; bsonParse(*simple_foo_bar, find(key("foo"), storeStrRef(found_string))); ASSERT_CMPSTR(found_string, "bar"); // We can fail to find too found = false; bool not_found = false; bsonParse(*simple_foo_bar, find(key("bad"), do(found = true)), else(do(not_found = true))); BSON_ASSERT(!found); BSON_ASSERT(not_found); // We can find two items int32_t a = 0, b = 0; bsonParse(*TMP_BSON_FROM_JSON({"foo" : 1729, "bar" : 42}), find(key("foo"), do(a = bsonAs(int32))), find(key("bar"), do(b = bsonAs(int32)))); ASSERT_CMPINT(a, ==, 1729); ASSERT_CMPINT(b, ==, 42); // Wrong types are zeroed a = 91; found = false; bsonParse(*TMP_BSON_FROM_JSON({"foo" : "string"}), find(key("foo"), do(found = true; a = bsonAs(int32)))); BSON_ASSERT(found); ASSERT_CMPINT(a, ==, 0); // Nested errors do not continue found = false; bsonParse(*TMP_BSON_FROM_JSON({"foo" : null, "bar" : null}), find(key("foo"), error("got foo")), find(key("bar"), do(found = true))); ASSERT_CMPSTR(bsonParseError, "got foo"); BSON_ASSERT(!found); // Halting does not continue found = false; bsonParse( *TMP_BSON_FROM_JSON({"foo" : null, "bar" : null}), find(key("foo"), halt), find(key("bar"), do(found = true))); BSON_ASSERT(!bsonParseError); BSON_ASSERT(!found); // "if" will branch a = 812; b = 0; bsonParse( *TMP_BSON_FROM_JSON({"foo" : 1, "bar" : 2}), if (a == 812, then(find(key("foo"), do(b = bsonAs(int32)))), else(find(key("bar"), do(b = bsonAs(int32)))))); ASSERT_CMPINT(b, ==, 1); a = 4; bsonParse( *TMP_BSON_FROM_JSON({"foo" : 1, "bar" : 2}), if (a == 812, then(find(key("foo"), do(b = bsonAs(int32)))), else(find(key("bar"), do(b = bsonAs(int32)))))); ASSERT_CMPINT(b, ==, 2); bson_t tmp = BSON_INITIALIZER; for (int i = 0; i < 1024; ++i) { BSON_APPEND_BOOL(&tmp, ".", true); } BSON_APPEND_BOOL(&tmp, "final", true); int unvisited = 0; bsonParse(tmp, find(key("final"), nop), visitOthers(do(++unvisited))); ASSERT_CMPINT(unvisited, ==, 1024); bson_destroy(&tmp); } static void test_bson_dsl_visit(void) { // Count elements int count = 0; bsonVisitEach(*TMP_BSON_FROM_JSON({"foo" : 1, "bar" : 1}), do(++count)); ASSERT_CMPINT(count, ==, 2); // Branch on keys int foo_val = 0; int bar_val = 0; bsonVisitEach(*TMP_BSON_FROM_JSON({"foo" : 61, "bar" : 951}), if (key("foo"), then(do(foo_val = bsonAs(int32)))), if (key("bar"), then(do(bar_val = bsonAs(int32))))); ASSERT_CMPINT(foo_val, ==, 61); ASSERT_CMPINT(bar_val, ==, 951); // Store reference to subdocs bson_t subdoc; bsonVisitEach(*TMP_BSON_FROM_JSON({"foo" : {"bar" : 42}}), storeDocRef(subdoc)); bar_val = 0; bsonVisitEach(subdoc, do(bar_val = bsonAs(int32))); ASSERT_CMPINT(bar_val, ==, 42); // Visit subdocs directly const char *baz_str = NULL; char *path = NULL; bsonVisitEach(*TMP_BSON_FROM_JSON({"foo" : {"bar" : {"baz" : "baz_string"}}}), visitEach(visitEach(storeStrRef(baz_str), dupPath(path)))); ASSERT_CMPSTR(baz_str, "baz_string"); ASSERT_CMPSTR(path, "$.foo.bar.baz"); bson_free(path); } mlib_diagnostic_push(); mlib_msvc_warning(disable : 4702); // do (abort()) static void test_bson_dsl_predicate(void) { bson_t *document = TMP_BSON_FROM_JSON({ "number1" : 1, "number2" : 2.1, "zero" : 0, "string" : "hello", "doc" : {"hello" : null}, "null" : null, "empty_string" : "", "empty_array" : [], "empty_doc" : {}, "with_last" : {"a" : null, "b" : "lastElement"}, "unhandled" : 12 }); bool saw_other = false; bsonParse( // *document, require(key("number1"), // require(type(int32)), require(isNumeric), require(isTrue)), require(key("number2"), // require(isNumeric), require(type(double)), require(isTrue)), require(key("zero"), // require(isFalse)), require(key("string"), // require(type(utf8)), require(strEqual("hello")), require(not(strEqual("goodbye"))), require(iStrEqual("HELLO")), require(not(iStrEqual("GOODBYE")))), require( key("doc"), require(type(doc)), require(not(empty)), visitEach(require(key("hello")), require(type(null)))), require(key("null"), require(type(null))), require(key("empty_string"), require(type(utf8))), require(key("empty_array"), require(type(array)), require(empty)), require(key("empty_doc"), require(type(doc)), require(empty)), require(key("with_last"), require(type(doc)), visitEach(if (lastElement, then(require(key("b")), require(type(utf8))), else(require(key("a")), require(type(null)))))), require(key("with_last"), visitEach(case (when(key("a"), require(type(null))), when(key("b"), require(strEqual("lastElement"))), else(do(abort()))))), require(key("string"), case (when(strEqual("goodbye"), do(abort())), when(strEqual("hello"), nop), // Not eached since the prior case matched: when(strEqual("hello"), do(abort())), else(do(abort())))), visitOthers(if (key("unhandled"), then(do(saw_other = true)), else(do(abort()))))); BSON_ASSERT(saw_other); } mlib_diagnostic_pop(); static void do_assert_bson_equal(const bson_t *actual, const bson_t *expected, const char *file, int line) { char *actual_str = bson_as_canonical_extended_json(actual, NULL); ASSERT(actual_str); char *expected_str = bson_as_canonical_extended_json(expected, NULL); ASSERT(expected_str); if (strcmp(actual_str, expected_str) != 0) { test_error("%s:%d: BSON documents are not equal:\n Expected: %s\n " "Actual: %s\n", file, line, expected_str, actual_str); } bson_free(actual_str); bson_free(expected_str); } #define ASSERT_BSON_EQUAL(Actual, ...) \ do_assert_bson_equal(&(Actual), TMP_BSON_FROM_JSON(__VA_ARGS__), __FILE__, __LINE__) #define ASSERT_BSON_EQUAL_BSON(Actual, Expected) do_assert_bson_equal(&(Actual), &(Expected), __FILE__, __LINE__) static void test_bson_dsl_build(void) { // Create a very simple empty document bsonBuildDecl(doc, do()); BSON_ASSERT(!bsonBuildError); ASSERT_BSON_EQUAL(doc, {}); bson_destroy(&doc); bsonBuild(doc, kv("foo", cstr("bar"))); ASSERT_BSON_EQUAL(doc, {"foo" : "bar"}); bson_destroy(&doc); bsonBuild(doc, kv("foo", int32(92))); ASSERT_BSON_EQUAL(doc, {"foo" : 92}); bson_destroy(&doc); bsonBuild(doc, kvl("hello", 1, int32(9))); ASSERT_BSON_EQUAL(doc, {"h" : 9}); bson_destroy(&doc); // Conditional insert bsonBuild(doc, if (0, then(kv("never", null)), else(kv("truth", int32(1))))); ASSERT_BSON_EQUAL(doc, {"truth" : 1}); bson_destroy(&doc); // Insert a subdoc bson_t *subdoc = TMP_BSON_FROM_JSON({"child" : [ 1, 2, 3 ], "other" : null}); bsonBuild(doc, kv("subdoc", doc(insert(*subdoc, always)))); ASSERT_BSON_EQUAL(doc, {"subdoc" : {"child" : [ 1, 2, 3 ], "other" : null}}); bson_destroy(&doc); // Conditional insert bsonBuild(doc, kv("subdoc", doc(insert(*subdoc, key("other"))))); ASSERT_BSON_EQUAL(doc, {"subdoc" : {"other" : null}}); bson_destroy(&doc); // Nested DSL docs bsonBuild(doc, kv("top", doc(kv("inner1", array()), kv("inner2", null), kv("inner3", array(int32(1), int32(2), int32(3))), insert(*subdoc, always), kv("inner4", doc(kv("innermost", int32(42))))))); ASSERT_BSON_EQUAL(doc, { "top" : { "inner1" : [], "inner2" : null, "inner3" : [ 1, 2, 3 ], "child" : [ 1, 2, 3 ], "other" : null, "inner4" : {"innermost" : 42} } }); // Do not destroy doc, but append to it bsonBuildAppend(doc, kv("anotherTop", null)); ASSERT_BSON_EQUAL(doc, { "top" : { "inner1" : [], "inner2" : null, "inner3" : [ 1, 2, 3 ], "child" : [ 1, 2, 3 ], "other" : null, "inner4" : {"innermost" : 42} }, "anotherTop" : null }); bson_destroy(&doc); } static void test_bson_with_duplicate_keys(void) { bson_t with_dups = BSON_INITIALIZER; // Assert bson_t can be constructed with duplicate keys. { BSON_ASSERT(BSON_APPEND_INT32(&with_dups, "duplicate", 1)); BSON_ASSERT(BSON_APPEND_INT32(&with_dups, "duplicate", 2)); } // Assert bson_iter_find locates the first duplicate. { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, &with_dups)); BSON_ASSERT(bson_iter_find(&iter, "duplicate")); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, 1); } // Assert bson_iter_find_case locates the first duplicate. { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, &with_dups)); BSON_ASSERT(bson_iter_find_case(&iter, "dUpLiCaTe")); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, 1); } // Assert bson_iter_find_w_len locates the first duplicate. { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, &with_dups)); BSON_ASSERT(bson_iter_find_w_len(&iter, "duplicate", 9)); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, 1); } // Assert bson_iter_find_descendant locates the first duplicate. { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, &with_dups)); BSON_ASSERT(bson_iter_find_descendant(&iter, "duplicate", &iter)); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, 1); } // Assert that bson_as_relaxed_extended_json preserves duplicate keys. { char *json_str = bson_as_relaxed_extended_json(&with_dups, NULL /* length */); ASSERT_CMPSTR(json_str, "{ \"duplicate\" : 1, \"duplicate\" : 2 }"); bson_free(json_str); } // Assert that bson_init_from_json preserves duplicate keys. { bson_t from_json; bson_error_t error; ASSERT_OR_PRINT(bson_init_from_json(&from_json, "{ \"duplicate\" : 1, \"duplicate\" : 2 }", -1, &error), error); BSON_ASSERT_BSON_EQUAL(&with_dups, &from_json); } bson_destroy(&with_dups); } static void test_bson_uint32_to_string(void) { // Test a value < 1000. { char buf[16] = {0}; const char *strptr; size_t got = bson_uint32_to_string(123, &strptr, buf, sizeof buf); ASSERT_CMPSIZE_T(got, ==, 3); ASSERT_CMPSTR(strptr, "123"); // Values < 1000 return a static string. Expect the input buffer is not // used. ASSERT_CMPSTR(buf, ""); } // Test a value >= 1000. { char buf[16] = {0}; const char *strptr; size_t got = bson_uint32_to_string(1000, &strptr, buf, sizeof buf); ASSERT_CMPSIZE_T(got, ==, 4); ASSERT_CMPSTR(strptr, "1000"); // Expect the input buffer is used. ASSERT_CMPSTR(buf, "1000"); } // Test when input buffer is too small. { char buf[4] = {0}; const char *strptr; size_t got = bson_uint32_to_string(1000, &strptr, buf, sizeof buf); // Expect the returned value is the number of required bytes excluding the // NULL terminator. ASSERT_CMPSIZE_T(got, ==, 4); // Expect only three characters are written. ASSERT_CMPSTR(strptr, "100"); // Expect the input buffer is used. ASSERT_CMPSTR(buf, "100"); } } static void test_bson_array_builder(void) { // Build a top-level array. { bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_int32(bab, 1)); ASSERT(bson_array_builder_append_int32(bab, 2)); bson_t b; ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ 1, 2 ]); bson_array_builder_destroy(bab); bson_destroy(&b); } // Build a top-level, heap allocated array. { char *large_str = bson_malloc0(64); for (size_t i = 0; i < 64 - 1; i++) { large_str[i] = '.'; } bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_utf8(bab, large_str, -1)); ASSERT(bson_array_builder_append_utf8(bab, large_str, -1)); // heap allocates. ASSERT(bson_array_builder_append_utf8(bab, large_str, -1)); bson_t *expect = BCON_NEW("0", BCON_UTF8(large_str), "1", BCON_UTF8(large_str), "2", BCON_UTF8(large_str)); bson_t b; ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL_BSON(b, *expect); bson_destroy(expect); bson_array_builder_destroy(bab); bson_destroy(&b); bson_free(large_str); } // Build a nested array. { bson_t *b = bson_new(); bson_array_builder_t *child; ASSERT(BSON_APPEND_ARRAY_BUILDER_BEGIN(b, "array", &child)); ASSERT(bson_array_builder_append_int32(child, 1)); ASSERT(bson_array_builder_append_int32(child, 2)); ASSERT(bson_append_array_builder_end(b, child)); ASSERT_BSON_EQUAL(*b, {"array" : [ 1, 2 ]}); bson_destroy(b); } // Reuse a `bson_array_builder`. { bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_int32(bab, 1)); ASSERT(bson_array_builder_append_int32(bab, 2)); bson_t b; ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ 1, 2 ]); bson_destroy(&b); // Reuse to build another array. ASSERT(bson_array_builder_append_int32(bab, 3)); ASSERT(bson_array_builder_append_int32(bab, 4)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ 3, 4 ]); bson_destroy(&b); bson_array_builder_destroy(bab); } // Test each bson_array_builder_append_* function. { { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_value_t v = {.value_type = BSON_TYPE_INT32, .value = {.v_int32 = 1}}; ASSERT(bson_array_builder_append_value(bab, &v)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [1]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_array(bab, TMP_BSON_FROM_JSON([ 1, 2 ]))); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [[ 1, 2 ]]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_binary(bab, BSON_SUBTYPE_BINARY, (const uint8_t *)"A", 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$binary" : {"base64" : "QQ==", "subType" : "00"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_bool(bab, true)); ASSERT(bson_array_builder_build(bab, &b)); // Use string literal for expectation instead of `ASSERT_BSON_EQUAL` // macro, since `true` may be replaced by `1` in preprocessing. ASSERT_BSON_EQUAL_BSON(b, *tmp_bson("[true]")); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_code(bab, "A")); ASSERT(bson_array_builder_build(bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$code": ... }]` results in incorrect BSON. See CDRIVER-4678. ASSERT_BSON_EQUAL(b, {"0" : {"$code" : "A"}}); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_code_with_scope(bab, "A", TMP_BSON_FROM_JSON({"B" : 1}))); ASSERT(bson_array_builder_build(bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$code": ... }]` results in incorrect BSON. See CDRIVER-4678. ASSERT_BSON_EQUAL(b, {"0" : {"$code" : "A", "$scope" : {"B" : 1}}}); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_oid_t oid; bson_oid_init_from_string(&oid, "FFFFFFFFFFFFFFFFFFFFFFFF"); ASSERT(bson_array_builder_append_dbpointer(bab, "E", &oid)); ASSERT(bson_array_builder_build(bab, &b)); // Use document string: `{ "0": ... , "1": ... }` instead of array // string: `[ ... , ... ]` for expectation. Parsing the array string // `[{ "$dbPointer": ... }]` results in incorrect BSON. See // CDRIVER-4678. ASSERT_BSON_EQUAL(b, {"0" : {"$dbPointer" : {"$ref" : "E", "$id" : {"$oid" : "ffffffffffffffffffffffff"}}}}); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_double(bab, 1.0)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$numberDouble" : "1.0"} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_document(bab, TMP_BSON_FROM_JSON({"A" : 1}))); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"A" : {"$numberInt" : "1"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_t child; ASSERT(bson_array_builder_append_document_begin(bab, &child)); ASSERT(BSON_APPEND_INT32(&child, "A", 1)); ASSERT(bson_array_builder_append_document_end(bab, &child)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"A" : {"$numberInt" : "1"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_int32(bab, 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [1]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_int64(bab, 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$numberLong" : "1"} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_decimal128_t d128; ASSERT(bson_decimal128_from_string("1.0", &d128)); ASSERT(bson_array_builder_append_decimal128(bab, &d128)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$numberDecimal" : "1.0"} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); { bson_t *bb = TMP_BSON_FROM_JSON({"A" : 1}); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, bb, "A")); ASSERT(bson_array_builder_append_iter(bab, &iter)); } ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [1]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_minkey(bab)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$minKey" : 1} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_maxkey(bab)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$maxKey" : 1} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_null(bab)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [null]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_oid_t oid; bson_oid_init_from_string(&oid, "FFFFFFFFFFFFFFFFFFFFFFFF"); ASSERT(bson_array_builder_append_oid(bab, &oid)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$oid" : "ffffffffffffffffffffffff"} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_regex(bab, "A", "i")); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$regularExpression" : {"pattern" : "A", "options" : "i"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_regex_w_len(bab, "A", 1, "i")); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$regularExpression" : {"pattern" : "A", "options" : "i"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_utf8(bab, "A", 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, ["A"]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_symbol(bab, "A", 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$symbol" : "A"} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); time_t t = {0}; ASSERT(bson_array_builder_append_time_t(bab, t)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$date" : {"$numberLong" : "0"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); struct timeval t = {0}; ASSERT(bson_array_builder_append_timeval(bab, &t)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$date" : {"$numberLong" : "0"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_date_time(bab, 1)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$date" : {"$numberLong" : "1"}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_now_utc(bab)); ASSERT(bson_array_builder_build(bab, &b)); // Check that one element exists of the expected type. Do not check // exact value. ASSERT_CMPUINT32(bson_count_keys(&b), ==, 1); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, &b, "0")); ASSERT_CMPINT((int)bson_iter_type(&iter), ==, (int)BSON_TYPE_DATE_TIME); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_timestamp(bab, 1, 2)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [ {"$timestamp" : {"t" : 1, "i" : 2}} ]); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); ASSERT(bson_array_builder_append_undefined(bab)); ASSERT(bson_array_builder_build(bab, &b)); // Use string literal for expectation instead of `ASSERT_BSON_EQUAL` // macro, since `true` may be replaced by `1` in preprocessing. ASSERT_BSON_EQUAL_BSON(b, *tmp_bson("[{'$undefined' : true}]")); bson_destroy(&b); bson_array_builder_destroy(bab); } { bson_t b; bson_array_builder_t *bab = bson_array_builder_new(); bson_array_builder_t *child; ASSERT(bson_array_builder_append_array_builder_begin(bab, &child)); ASSERT(bson_array_builder_append_int32(child, 1)); ASSERT(bson_array_builder_append_int32(child, 2)); ASSERT(bson_array_builder_append_array_builder_end(bab, child)); ASSERT(bson_array_builder_build(bab, &b)); ASSERT_BSON_EQUAL(b, [[ 1, 2 ]]); bson_destroy(&b); bson_array_builder_destroy(bab); } } // A failure in bson_append_array_builder_begin does not allocate. { bson_t b = BSON_INITIALIZER; bson_array_builder_t *child; bool ok = bson_append_array_builder_begin(&b, "has_embedded_null\0", strlen("has_embedded_null") + 1, &child); ASSERT(!ok); bson_destroy(&b); // Not necessary to free `child`. } } void test_bson_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/new", test_bson_new); TestSuite_Add(suite, "/bson/new_from_buffer", test_bson_new_from_buffer); TestSuite_Add(suite, "/bson/init", test_bson_init); TestSuite_Add(suite, "/bson/init_static", test_bson_init_static); TestSuite_Add(suite, "/bson/basic", test_bson_alloc); TestSuite_Add(suite, "/bson/basic_array_alloc", test_bson_array_alloc); TestSuite_Add(suite, "/bson/append_overflow", test_bson_append_overflow); TestSuite_Add(suite, "/bson/append_array", test_bson_append_array); TestSuite_Add(suite, "/bson/append_binary", test_bson_append_binary); TestSuite_Add(suite, "/bson/append_binary_deprecated", test_bson_append_binary_deprecated); TestSuite_Add(suite, "/bson/append_bool", test_bson_append_bool); TestSuite_Add(suite, "/bson/append_code", test_bson_append_code); TestSuite_Add(suite, "/bson/append_code_with_scope", test_bson_append_code_with_scope); TestSuite_Add(suite, "/bson/append_dbpointer", test_bson_append_dbpointer); TestSuite_Add(suite, "/bson/append_document", test_bson_append_document); TestSuite_Add(suite, "/bson/append_double", test_bson_append_double); TestSuite_Add(suite, "/bson/append_int32", test_bson_append_int32); TestSuite_Add(suite, "/bson/append_int64", test_bson_append_int64); TestSuite_Add(suite, "/bson/append_decimal128", test_bson_append_decimal128); TestSuite_Add(suite, "/bson/append_iter", test_bson_append_iter); TestSuite_Add(suite, "/bson/append_maxkey", test_bson_append_maxkey); TestSuite_Add(suite, "/bson/append_minkey", test_bson_append_minkey); TestSuite_Add(suite, "/bson/append_null", test_bson_append_null); TestSuite_Add(suite, "/bson/append_oid", test_bson_append_oid); TestSuite_Add(suite, "/bson/append_regex", test_bson_append_regex); TestSuite_Add(suite, "/bson/append_regex_w_len", test_bson_append_regex_w_len); TestSuite_Add(suite, "/bson/append_utf8", test_bson_append_utf8); TestSuite_Add(suite, "/bson/append_symbol", test_bson_append_symbol); TestSuite_Add(suite, "/bson/append_time_t", test_bson_append_time_t); TestSuite_Add(suite, "/bson/append_timestamp", test_bson_append_timestamp); TestSuite_Add(suite, "/bson/append_timeval", test_bson_append_timeval); TestSuite_Add(suite, "/bson/append_undefined", test_bson_append_undefined); TestSuite_Add(suite, "/bson/append_general", test_bson_append_general); TestSuite_Add(suite, "/bson/append_deep", test_bson_append_deep); TestSuite_Add(suite, "/bson/utf8_key", test_bson_utf8_key); TestSuite_Add(suite, "/bson/validate/deep", test_bson_validate_deep); TestSuite_Add(suite, "/bson/validate/with_error_and_offset", test_bson_validate_with_error_and_offset); TestSuite_Add(suite, "/bson/new_1mm", test_bson_new_1mm); TestSuite_Add(suite, "/bson/init_1mm", test_bson_init_1mm); TestSuite_Add(suite, "/bson/build_child", test_bson_build_child); TestSuite_Add(suite, "/bson/build_child_deep", test_bson_build_child_deep); TestSuite_Add(suite, "/bson/build_child_deep_no_begin_end", test_bson_build_child_deep_no_begin_end); TestSuite_Add(suite, "/bson/build_child_array", test_bson_build_child_array); TestSuite_Add(suite, "/bson/count", test_bson_count_keys); TestSuite_Add(suite, "/bson/copy", test_bson_copy); TestSuite_Add(suite, "/bson/copy_to", test_bson_copy_to); TestSuite_Add(suite, "/bson/copy_to_excluding_noinit", test_bson_copy_to_excluding_noinit); TestSuite_Add(suite, "/bson/initializer", test_bson_initializer); TestSuite_Add(suite, "/bson/concat", test_bson_concat); TestSuite_Add(suite, "/bson/reinit", test_bson_reinit); TestSuite_Add(suite, "/bson/macros", test_bson_macros); TestSuite_Add(suite, "/bson/clear", test_bson_clear); TestSuite_Add(suite, "/bson/steal", test_bson_steal); TestSuite_Add(suite, "/bson/reserve_buffer", test_bson_reserve_buffer); TestSuite_Add(suite, "/bson/reserve_buffer/errors", test_bson_reserve_buffer_errors); TestSuite_Add(suite, "/bson/destroy_with_steal", test_bson_destroy_with_steal); TestSuite_Add(suite, "/bson/has_field", test_bson_has_field); TestSuite_Add(suite, "/bson/visit_invalid_field", test_bson_visit_invalid_field); TestSuite_Add(suite, "/bson/unsupported_type", test_bson_visit_unsupported_type); TestSuite_Add(suite, "/bson/unsupported_type/bad_key", test_bson_visit_unsupported_type_bad_key); TestSuite_Add(suite, "/bson/unsupported_type/empty_key", test_bson_visit_unsupported_type_empty_key); TestSuite_Add(suite, "/bson/binary_subtype_2", test_bson_subtype_2); TestSuite_Add(suite, "/bson/regex_length", test_bson_regex_lengths); TestSuite_Add(suite, "/util/next_power_of_two", test_next_power_of_two); TestSuite_Add(suite, "/bson/empty_binary", test_bson_empty_binary); TestSuite_Add(suite, "/bson/iter/key_len", test_bson_iter_key_len); TestSuite_Add(suite, "/bson/iter/init_from_data_at_offset", test_bson_iter_init_from_data_at_offset); TestSuite_Add(suite, "/bson/value/null_handling", test_bson_binary_null_handling); TestSuite_Add(suite, "/bson/append_null_from_utf8_or_symbol", test_bson_append_null_from_utf8_or_symbol); TestSuite_Add(suite, "/bson/as_json_string", test_bson_as_json_string); TestSuite_Add(suite, "/bson/dsl/predicate", test_bson_dsl_predicate); TestSuite_Add(suite, "/bson/dsl/parse", test_bson_dsl_parse); TestSuite_Add(suite, "/bson/dsl/visit", test_bson_dsl_visit); TestSuite_Add(suite, "/bson/dsl/build", test_bson_dsl_build); TestSuite_Add(suite, "/bson/with_duplicate_keys", test_bson_with_duplicate_keys); TestSuite_Add(suite, "/bson/uint32_to_string", test_bson_uint32_to_string); TestSuite_Add(suite, "/bson/array_builder", test_bson_array_builder); } mongo-c-driver-2.2.1/src/libbson/tests/test-clock.c000066400000000000000000000006141511661753600221550ustar00rootroot00000000000000#include #include static void test_get_monotonic_time(void) { int64_t t; int64_t t2; t = bson_get_monotonic_time(); t2 = bson_get_monotonic_time(); BSON_ASSERT(t); BSON_ASSERT(t2); ASSERT_CMPINT64(t, <=, t2); } void test_clock_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/clock/get_monotonic_time", test_get_monotonic_time); } mongo-c-driver-2.2.1/src/libbson/tests/test-decimal128.c000066400000000000000000001007411511661753600227150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include /* *---------------------------------------------------------------------------- * decimal128_to_string tests * * The following tests confirm functionality of the decimal128_to_string *function. * * All decimal test data is generated using the Intel Decimal Floating-Point * Math Library's bid128_from_string routine. * *---------------------------------------------------------------------------- */ #define DECIMAL128_FROM_ULLS(dec, h, l) \ do { \ (dec).high = (h); \ (dec).low = (l); \ } while (0) static void test_decimal128_to_string__infinity(void) { bson_decimal128_t positive_infinity; bson_decimal128_t negative_infinity; char bid_string[BSON_DECIMAL128_STRING]; DECIMAL128_FROM_ULLS(positive_infinity, 0x7800000000000000, 0); DECIMAL128_FROM_ULLS(negative_infinity, 0xf800000000000000, 0); bson_decimal128_to_string(&positive_infinity, bid_string); ASSERT_CMPSTR(bid_string, "Infinity"); bson_decimal128_to_string(&negative_infinity, bid_string); ASSERT_CMPSTR(bid_string, "-Infinity"); } static void test_decimal128_to_string__nan(void) { bson_decimal128_t dec_pnan; bson_decimal128_t dec_nnan; bson_decimal128_t dec_psnan; bson_decimal128_t dec_nsnan; bson_decimal128_t dec_payload_nan; /* All the above should just be NaN. */ char bid_string[BSON_DECIMAL128_STRING]; DECIMAL128_FROM_ULLS(dec_pnan, 0x7c00000000000000, 0); DECIMAL128_FROM_ULLS(dec_nnan, 0xfc00000000000000, 0); DECIMAL128_FROM_ULLS(dec_psnan, 0x7e00000000000000, 0); DECIMAL128_FROM_ULLS(dec_nsnan, 0xfe00000000000000, 0); DECIMAL128_FROM_ULLS(dec_payload_nan, 0x7e00000000000000, 12); bson_decimal128_to_string(&dec_pnan, bid_string); ASSERT_CMPSTR(bid_string, "NaN"); bson_decimal128_to_string(&dec_nnan, bid_string); ASSERT_CMPSTR(bid_string, "NaN"); bson_decimal128_to_string(&dec_psnan, bid_string); ASSERT_CMPSTR(bid_string, "NaN"); bson_decimal128_to_string(&dec_nsnan, bid_string); ASSERT_CMPSTR(bid_string, "NaN"); bson_decimal128_to_string(&dec_payload_nan, bid_string); ASSERT_CMPSTR(bid_string, "NaN"); } static void test_decimal128_to_string__regular(void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t one; bson_decimal128_t zero; bson_decimal128_t two; bson_decimal128_t negative_one; bson_decimal128_t negative_zero; bson_decimal128_t tenth; bson_decimal128_t smallest_regular; bson_decimal128_t largest_regular; bson_decimal128_t trailing_zeros; bson_decimal128_t all_digits; bson_decimal128_t full_house; bson_decimal128_t untruncated_significand; bson_decimal128_t truncated_significand; DECIMAL128_FROM_ULLS(one, 0x3040000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS(zero, 0x3040000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS(two, 0x3040000000000000, 0x0000000000000002); DECIMAL128_FROM_ULLS(negative_one, 0xb040000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS(negative_zero, 0xb040000000000000, 0x0000000000000000); // 0.1 DECIMAL128_FROM_ULLS(tenth, 0x303e000000000000, 0x0000000000000001); // 0.001234 DECIMAL128_FROM_ULLS(smallest_regular, 0x3034000000000000, 0x00000000000004d2); // 12345789012 DECIMAL128_FROM_ULLS(largest_regular, 0x3040000000000000, 0x0000001cbe991a14); // 0.00123400000 DECIMAL128_FROM_ULLS(trailing_zeros, 0x302a000000000000, 0x00000000075aef40); // 0.1234567890123456789012345678901234 DECIMAL128_FROM_ULLS(all_digits, 0x2ffc3cde6fff9732, 0xde825cd07e96aff2); // 5192296858534827628530496329220095 DECIMAL128_FROM_ULLS(full_house, 0x3040ffffffffffff, 0xffffffffffffffff); // 0.0000010384593717069655257060992658440191 (inexact rounding) DECIMAL128_FROM_ULLS(untruncated_significand, 0x2ff1ffffffffffff, 0xffffffffffffffff); // -0.000001038459371706965525706099265844019 (inexact rounding) DECIMAL128_FROM_ULLS(truncated_significand, 0xaff1ffffffffffff, 0xffffffffffffffff); bson_decimal128_to_string(&one, bid_string); ASSERT_CMPSTR("1", bid_string); bson_decimal128_to_string(&zero, bid_string); ASSERT_CMPSTR("0", bid_string); bson_decimal128_to_string(&two, bid_string); ASSERT_CMPSTR("2", bid_string); bson_decimal128_to_string(&negative_one, bid_string); ASSERT_CMPSTR("-1", bid_string); bson_decimal128_to_string(&negative_zero, bid_string); ASSERT_CMPSTR("-0", bid_string); bson_decimal128_to_string(&tenth, bid_string); ASSERT_CMPSTR("0.1", bid_string); bson_decimal128_to_string(&smallest_regular, bid_string); ASSERT_CMPSTR("0.001234", bid_string); bson_decimal128_to_string(&largest_regular, bid_string); ASSERT_CMPSTR("123456789012", bid_string); bson_decimal128_to_string(&trailing_zeros, bid_string); ASSERT_CMPSTR("0.00123400000", bid_string); bson_decimal128_to_string(&all_digits, bid_string); ASSERT_CMPSTR("0.1234567890123456789012345678901234", bid_string); bson_decimal128_to_string(&full_house, bid_string); ASSERT_CMPSTR("5192296858534827628530496329220095", bid_string); bson_decimal128_to_string(&untruncated_significand, bid_string); ASSERT_CMPSTR("0.0000010384593717069655257060992658440191", bid_string); bson_decimal128_to_string(&truncated_significand, bid_string); ASSERT_CMPSTR("-0.000001038459371706965525706099265844019", bid_string); } static void test_decimal128_to_string__scientific(void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t huge; /* 1.000000000000000000000000000000000E+6144 */ bson_decimal128_t tiny; /* 1E-6176 */ bson_decimal128_t neg_tiny; /* -1E-6176 */ bson_decimal128_t large; /* 9.999987654321E+112 */ bson_decimal128_t largest; /* 9.999999999999999999999999999999999E+6144 */ bson_decimal128_t tiniest; /* 9.999999999999999999999999999999999E-6143 */ bson_decimal128_t trailing_zero; /* 1.050E9 */ bson_decimal128_t one_trailing_zero; /* 1.050E4 */ bson_decimal128_t move_decimal; /* 105 */ bson_decimal128_t move_decimal_after; /* 1.05E3 */ bson_decimal128_t trailing_zero_no_decimal; /* 1E3 */ DECIMAL128_FROM_ULLS(huge, 0x5ffe314dc6448d93, 0x38c15b0a00000000); DECIMAL128_FROM_ULLS(tiny, 0x0000000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS(neg_tiny, 0x8000000000000000, 0x0000000000000001); DECIMAL128_FROM_ULLS(large, 0x3108000000000000, 0x000009184db63eb1); DECIMAL128_FROM_ULLS(largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff); DECIMAL128_FROM_ULLS(tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff); DECIMAL128_FROM_ULLS(trailing_zero, 0x304c000000000000, 0x000000000000041a); DECIMAL128_FROM_ULLS(one_trailing_zero, 0x3042000000000000, 0x000000000000041a); DECIMAL128_FROM_ULLS(move_decimal, 0x3040000000000000, 0x0000000000000069); DECIMAL128_FROM_ULLS(move_decimal_after, 0x3042000000000000, 0x0000000000000069); DECIMAL128_FROM_ULLS(trailing_zero_no_decimal, 0x3046000000000000, 0x0000000000000001); bson_decimal128_to_string(&huge, bid_string); ASSERT_CMPSTR("1.000000000000000000000000000000000E+6144", bid_string); bson_decimal128_to_string(&tiny, bid_string); ASSERT_CMPSTR("1E-6176", bid_string); bson_decimal128_to_string(&neg_tiny, bid_string); ASSERT_CMPSTR("-1E-6176", bid_string); bson_decimal128_to_string(&neg_tiny, bid_string); ASSERT_CMPSTR("-1E-6176", bid_string); bson_decimal128_to_string(&large, bid_string); ASSERT_CMPSTR("9.999987654321E+112", bid_string); bson_decimal128_to_string(&largest, bid_string); ASSERT_CMPSTR("9.999999999999999999999999999999999E+6144", bid_string); bson_decimal128_to_string(&tiniest, bid_string); ASSERT_CMPSTR("9.999999999999999999999999999999999E-6143", bid_string); bson_decimal128_to_string(&trailing_zero, bid_string); ASSERT_CMPSTR("1.050E+9", bid_string); bson_decimal128_to_string(&one_trailing_zero, bid_string); ASSERT_CMPSTR("1.050E+4", bid_string); bson_decimal128_to_string(&move_decimal, bid_string); ASSERT_CMPSTR("105", bid_string); bson_decimal128_to_string(&move_decimal_after, bid_string); ASSERT_CMPSTR("1.05E+3", bid_string); bson_decimal128_to_string(&trailing_zero_no_decimal, bid_string); ASSERT_CMPSTR("1E+3", bid_string); } static void test_decimal128_to_string__zeros(void) { char bid_string[BSON_DECIMAL128_STRING]; bson_decimal128_t zero; /* 0 */ bson_decimal128_t pos_exp_zero; /* 0E+300 */ bson_decimal128_t neg_exp_zero; /* 0E-600 */ DECIMAL128_FROM_ULLS(zero, 0x3040000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS(pos_exp_zero, 0x3298000000000000, 0x0000000000000000); DECIMAL128_FROM_ULLS(neg_exp_zero, 0x2b90000000000000, 0x0000000000000000); bson_decimal128_to_string(&zero, bid_string); ASSERT_CMPSTR("0", bid_string); bson_decimal128_to_string(&pos_exp_zero, bid_string); ASSERT_CMPSTR("0E+300", bid_string); bson_decimal128_to_string(&neg_exp_zero, bid_string); ASSERT_CMPSTR("0E-600", bid_string); } #define IS_NAN(dec) (dec).high == 0x7c00000000000000ull static void test_decimal128_from_string__invalid_inputs(void) { bson_decimal128_t dec; ASSERT(!bson_decimal128_from_string(".", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("1e", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string(".e", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("invalid", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("in", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("i", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("E02", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("..1", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("1abcede", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("1.24abc", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("1.24abcE+02", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("1.24E+02abc2d", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("E+02", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string("e+02", &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len(".", 1, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("1e", 2, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len(".e", 2, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("", 0, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("invalid", 7, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("in", 2, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("i", 1, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("E02", 3, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("..1", 3, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("1abcede", 7, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("1.24abc", 7, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("1.24abcE+02", 11, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("1.24E+02abc2d", 13, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("E+02", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(!bson_decimal128_from_string_w_len("e+02", 4, &dec)); ASSERT(IS_NAN(dec)); } static void test_decimal128_from_string__nan(void) { bson_decimal128_t dec; ASSERT(bson_decimal128_from_string("NaN", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("+NaN", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("-NaN", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("-nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("+nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("Nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("+Nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string("-Nan", &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("NaN", 3, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("+NaN", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("-NaN", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("-nan", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("+nan", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("nan", 3, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("Nan", 3, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("+Nan", 4, &dec)); ASSERT(IS_NAN(dec)); ASSERT(bson_decimal128_from_string_w_len("-Nan", 4, &dec)); ASSERT(IS_NAN(dec)); } #define IS_PINFINITY(dec) (dec).high == 0x7800000000000000 #define IS_NINFINITY(dec) (dec).high == 0xf800000000000000 static void test_decimal128_from_string__infinity(void) { bson_decimal128_t dec; ASSERT(bson_decimal128_from_string("Infinity", &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string("+Infinity", &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string("+Inf", &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string("-Inf", &dec)); ASSERT(IS_NINFINITY(dec)); ASSERT(bson_decimal128_from_string("-Infinity", &dec)); ASSERT(IS_NINFINITY(dec)); ASSERT(bson_decimal128_from_string_w_len("Infinity", 8, &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string_w_len("+Infinity", 9, &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string_w_len("+Inf", 4, &dec)); ASSERT(IS_PINFINITY(dec)); ASSERT(bson_decimal128_from_string_w_len("-Inf", 4, &dec)); ASSERT(IS_NINFINITY(dec)); ASSERT(bson_decimal128_from_string_w_len("-Infinity", 9, &dec)); ASSERT(IS_NINFINITY(dec)); } static bool decimal128_equal(bson_decimal128_t *dec, uint64_t high, uint64_t low) { bson_decimal128_t test; DECIMAL128_FROM_ULLS(test, high, low); return memcmp(dec, &test, sizeof(*dec)) == 0; } static void test_decimal128_from_string__simple(void) { bson_decimal128_t one; bson_decimal128_t negative_one; bson_decimal128_t zero; bson_decimal128_t negative_zero; bson_decimal128_t number; bson_decimal128_t number_two; bson_decimal128_t negative_number; bson_decimal128_t fractional_number; bson_decimal128_t leading_zeros; bson_decimal128_t leading_insignificant_zeros; bson_decimal128_t untruncated_significand; bson_decimal128_t truncated_significand; ASSERT(bson_decimal128_from_string("1", &one)); ASSERT(bson_decimal128_from_string("-1", &negative_one)); ASSERT(bson_decimal128_from_string("0", &zero)); ASSERT(bson_decimal128_from_string("-0", &negative_zero)); ASSERT(bson_decimal128_from_string("12345678901234567", &number)); ASSERT(bson_decimal128_from_string("989898983458", &number_two)); ASSERT(bson_decimal128_from_string("-12345678901234567", &negative_number)); ASSERT(bson_decimal128_from_string("0.12345", &fractional_number)); ASSERT(bson_decimal128_from_string("0.0012345", &leading_zeros)); ASSERT(bson_decimal128_from_string("00012345678901234567", &leading_insignificant_zeros)); // Inexact Rounding Error ASSERT(!bson_decimal128_from_string("0.0000010384593717069655257060992658440191", &untruncated_significand)); ASSERT(!bson_decimal128_from_string("-0.0000010384593717069655257060992658440191", &truncated_significand)); // OK ASSERT(bson_decimal128_from_string("0.000001038459371706965525706099265844019", &untruncated_significand)); ASSERT(bson_decimal128_from_string("-0.000001038459371706965525706099265844019", &truncated_significand)); ASSERT(decimal128_equal(&one, 0x3040000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&negative_one, 0xb040000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&zero, 0x3040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&negative_zero, 0xb040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&number, 0x3040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&number_two, 0x3040000000000000, 0x000000e67a93c822)); ASSERT(decimal128_equal(&negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&fractional_number, 0x3036000000000000, 0x0000000000003039)); ASSERT(decimal128_equal(&leading_zeros, 0x3032000000000000, 0x0000000000003039)); ASSERT(decimal128_equal(&leading_insignificant_zeros, 0x3040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&untruncated_significand, 0x2ff2333333333333, 0x3333333333333333)); ASSERT(decimal128_equal(&truncated_significand, 0xaff2333333333333, 0x3333333333333333)); ASSERT(bson_decimal128_from_string_w_len("1", 1, &one)); ASSERT(bson_decimal128_from_string_w_len("-1", 2, &negative_one)); ASSERT(bson_decimal128_from_string_w_len("0", 1, &zero)); ASSERT(bson_decimal128_from_string_w_len("-0", 2, &negative_zero)); ASSERT(bson_decimal128_from_string_w_len("12345678901234567", 17, &number)); ASSERT(bson_decimal128_from_string_w_len("989898983458", 12, &number_two)); ASSERT(bson_decimal128_from_string_w_len("-12345678901234567", 18, &negative_number)); ASSERT(bson_decimal128_from_string_w_len("0.12345", 7, &fractional_number)); ASSERT(bson_decimal128_from_string_w_len("0.0012345", 9, &leading_zeros)); ASSERT(bson_decimal128_from_string_w_len("00012345678901234567", 20, &leading_insignificant_zeros)); // Inexact Rounding Error ASSERT( !bson_decimal128_from_string_w_len("0.0000010384593717069655257060992658440191", 42, &untruncated_significand)); ASSERT( !bson_decimal128_from_string_w_len("-0.0000010384593717069655257060992658440191", 43, &truncated_significand)); // OK ASSERT(bson_decimal128_from_string_w_len("0.000001038459371706965525706099265844019", 41, &untruncated_significand)); ASSERT(bson_decimal128_from_string_w_len("-0.000001038459371706965525706099265844019", 42, &truncated_significand)); ASSERT(decimal128_equal(&one, 0x3040000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&negative_one, 0xb040000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&zero, 0x3040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&negative_zero, 0xb040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&number, 0x3040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&number_two, 0x3040000000000000, 0x000000e67a93c822)); ASSERT(decimal128_equal(&negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&fractional_number, 0x3036000000000000, 0x0000000000003039)); ASSERT(decimal128_equal(&leading_zeros, 0x3032000000000000, 0x0000000000003039)); ASSERT(decimal128_equal(&leading_insignificant_zeros, 0x3040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&untruncated_significand, 0x2ff2333333333333, 0x3333333333333333)); ASSERT(decimal128_equal(&truncated_significand, 0xaff2333333333333, 0x3333333333333333)); } static void test_decimal128_from_string__scientific(void) { bson_decimal128_t ten; bson_decimal128_t ten_again; bson_decimal128_t one; bson_decimal128_t huge_exp; bson_decimal128_t tiny_exp; bson_decimal128_t fractional; bson_decimal128_t trailing_zeros; ASSERT(bson_decimal128_from_string("10e0", &ten)); ASSERT(bson_decimal128_from_string("1e1", &ten_again)); ASSERT(bson_decimal128_from_string("10e-1", &one)); ASSERT(decimal128_equal(&ten, 0x3040000000000000, 0x000000000000000a)); ASSERT(decimal128_equal(&ten_again, 0x3042000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&one, 0x303e000000000000, 0x000000000000000a)); ASSERT(bson_decimal128_from_string("12345678901234567e6111", &huge_exp)); ASSERT(bson_decimal128_from_string("1e-6176", &tiny_exp)); ASSERT(decimal128_equal(&huge_exp, 0x5ffe000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&tiny_exp, 0x0000000000000000, 0x0000000000000001)); ASSERT(bson_decimal128_from_string("-100E-10", &fractional)); ASSERT(bson_decimal128_from_string("10.50E8", &trailing_zeros)); ASSERT(decimal128_equal(&fractional, 0xb02c000000000000, 0x0000000000000064)); ASSERT(decimal128_equal(&trailing_zeros, 0x304c000000000000, 0x000000000000041a)); ASSERT(bson_decimal128_from_string_w_len("10e0", 4, &ten)); ASSERT(bson_decimal128_from_string_w_len("1e1", 3, &ten_again)); ASSERT(bson_decimal128_from_string_w_len("10e-1", 5, &one)); ASSERT(decimal128_equal(&ten, 0x3040000000000000, 0x000000000000000a)); ASSERT(decimal128_equal(&ten_again, 0x3042000000000000, 0x0000000000000001)); ASSERT(decimal128_equal(&one, 0x303e000000000000, 0x000000000000000a)); ASSERT(bson_decimal128_from_string_w_len("12345678901234567e6111", 22, &huge_exp)); ASSERT(bson_decimal128_from_string_w_len("1e-6176", 7, &tiny_exp)); ASSERT(decimal128_equal(&huge_exp, 0x5ffe000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&tiny_exp, 0x0000000000000000, 0x0000000000000001)); ASSERT(bson_decimal128_from_string_w_len("-100E-10", 8, &fractional)); ASSERT(bson_decimal128_from_string_w_len("10.50E8", 7, &trailing_zeros)); ASSERT(decimal128_equal(&fractional, 0xb02c000000000000, 0x0000000000000064)); ASSERT(decimal128_equal(&trailing_zeros, 0x304c000000000000, 0x000000000000041a)); } static void test_decimal128_from_string__large(void) { bson_decimal128_t large; bson_decimal128_t all_digits; bson_decimal128_t largest; bson_decimal128_t tiniest; bson_decimal128_t full_house; ASSERT(bson_decimal128_from_string("12345689012345789012345", &large)); ASSERT(bson_decimal128_from_string("1234567890123456789012345678901234", &all_digits)); ASSERT(bson_decimal128_from_string("9.999999999999999999999999999999999E+6144", &largest)); ASSERT(bson_decimal128_from_string("9.999999999999999999999999999999999E-6143", &tiniest)); ASSERT(bson_decimal128_from_string("5.192296858534827628530496329220095E+33", &full_house)); ASSERT(decimal128_equal(&large, 0x304000000000029d, 0x42da3a76f9e0d979)); ASSERT(decimal128_equal(&all_digits, 0x30403cde6fff9732, 0xde825cd07e96aff2)); ASSERT(decimal128_equal(&largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff)); ASSERT(decimal128_equal(&tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff)); ASSERT(decimal128_equal(&full_house, 0x3040ffffffffffff, 0xffffffffffffffff)); ASSERT(bson_decimal128_from_string_w_len("12345689012345789012345", -1, &large)); ASSERT(bson_decimal128_from_string_w_len("1234567890123456789012345678901234", -1, &all_digits)); ASSERT(bson_decimal128_from_string_w_len("9.999999999999999999999999999999999E+6144", -1, &largest)); ASSERT(bson_decimal128_from_string_w_len("9.999999999999999999999999999999999E-6143", -1, &tiniest)); ASSERT(bson_decimal128_from_string_w_len("5.192296858534827628530496329220095E+33", -1, &full_house)); ASSERT(decimal128_equal(&large, 0x304000000000029d, 0x42da3a76f9e0d979)); ASSERT(decimal128_equal(&all_digits, 0x30403cde6fff9732, 0xde825cd07e96aff2)); ASSERT(decimal128_equal(&largest, 0x5fffed09bead87c0, 0x378d8e63ffffffff)); ASSERT(decimal128_equal(&tiniest, 0x0001ed09bead87c0, 0x378d8e63ffffffff)); ASSERT(decimal128_equal(&full_house, 0x3040ffffffffffff, 0xffffffffffffffff)); } static void test_decimal128_from_string__exponent_normalization(void) { bson_decimal128_t trailing_zeros; bson_decimal128_t one_normalize; bson_decimal128_t no_normalize; bson_decimal128_t a_disaster; ASSERT(bson_decimal128_from_string("1000000000000000000000000000000000000000", &trailing_zeros)); ASSERT(bson_decimal128_from_string("10000000000000000000000000000000000", &one_normalize)); ASSERT(bson_decimal128_from_string("1000000000000000000000000000000000", &no_normalize)); bson_decimal128_from_string("100000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000", &a_disaster); ASSERT(decimal128_equal(&trailing_zeros, 0x304c314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&one_normalize, 0x3042314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&no_normalize, 0x3040314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&a_disaster, 0x37cc314dc6448d93, 0x38c15b0a00000000)); ASSERT(bson_decimal128_from_string_w_len("1000000000000000000000000000000000000000", -1, &trailing_zeros)); ASSERT(bson_decimal128_from_string_w_len("10000000000000000000000000000000000", -1, &one_normalize)); ASSERT(bson_decimal128_from_string_w_len("1000000000000000000000000000000000", -1, &no_normalize)); bson_decimal128_from_string_w_len("100000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000", -1, &a_disaster); ASSERT(decimal128_equal(&trailing_zeros, 0x304c314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&one_normalize, 0x3042314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&no_normalize, 0x3040314dc6448d93, 0x38c15b0a00000000)); ASSERT(decimal128_equal(&a_disaster, 0x37cc314dc6448d93, 0x38c15b0a00000000)); } static void test_decimal128_from_string__zeros(void) { bson_decimal128_t zero; bson_decimal128_t exponent_zero; bson_decimal128_t large_exponent; bson_decimal128_t negative_zero; ASSERT(bson_decimal128_from_string("0", &zero)); ASSERT(bson_decimal128_from_string("0e-611", &exponent_zero)); ASSERT(bson_decimal128_from_string("0e+6000", &large_exponent)); ASSERT(bson_decimal128_from_string("-0e-1", &negative_zero)); ASSERT(decimal128_equal(&zero, 0x3040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&exponent_zero, 0x2b7a000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&large_exponent, 0x5f20000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&negative_zero, 0xb03e000000000000, 0x0000000000000000)); ASSERT(bson_decimal128_from_string_w_len("0", 1, &zero)); ASSERT(bson_decimal128_from_string_w_len("0e-611", -1, &exponent_zero)); ASSERT(bson_decimal128_from_string_w_len("0e+6000", 7, &large_exponent)); ASSERT(bson_decimal128_from_string_w_len("-0e-1", 5, &negative_zero)); ASSERT(decimal128_equal(&zero, 0x3040000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&exponent_zero, 0x2b7a000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&large_exponent, 0x5f20000000000000, 0x0000000000000000)); ASSERT(decimal128_equal(&negative_zero, 0xb03e000000000000, 0x0000000000000000)); } static void test_decimal128_from_string_w_len__special(void) { bson_decimal128_t number; bson_decimal128_t number_two; bson_decimal128_t negative_number; /* These strings have more bytes than the length indicates. */ ASSERT(bson_decimal128_from_string_w_len("12345678901234567abcd", 17, &number)); ASSERT(bson_decimal128_from_string_w_len("989898983458abcd", 12, &number_two)); ASSERT(bson_decimal128_from_string_w_len("-12345678901234567abcd", 18, &negative_number)); ASSERT(decimal128_equal(&number, 0x3040000000000000, 0x002bdc545d6b4b87)); ASSERT(decimal128_equal(&number_two, 0x3040000000000000, 0x000000e67a93c822)); ASSERT(decimal128_equal(&negative_number, 0xb040000000000000, 0x002bdc545d6b4b87)); } void test_decimal128_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/decimal128/to_string/infinity", test_decimal128_to_string__infinity); TestSuite_Add(suite, "/bson/decimal128/to_string/nan", test_decimal128_to_string__nan); TestSuite_Add(suite, "/bson/decimal128/to_string/regular", test_decimal128_to_string__regular); TestSuite_Add(suite, "/bson/decimal128/to_string/scientific", test_decimal128_to_string__scientific); TestSuite_Add(suite, "/bson/decimal128/to_string/zero", test_decimal128_to_string__zeros); TestSuite_Add(suite, "/bson/decimal128/from_string/invalid", test_decimal128_from_string__invalid_inputs); TestSuite_Add(suite, "/bson/decimal128/from_string/nan", test_decimal128_from_string__nan); TestSuite_Add(suite, "/bson/decimal128/from_string/infinity", test_decimal128_from_string__infinity); TestSuite_Add(suite, "/bson/decimal128/from_string/basic", test_decimal128_from_string__simple); TestSuite_Add(suite, "/bson/decimal128/from_string/scientific", test_decimal128_from_string__scientific); TestSuite_Add(suite, "/bson/decimal128/from_string/large", test_decimal128_from_string__large); TestSuite_Add(suite, "/bson/decimal128/from_string/exponent_normalization", test_decimal128_from_string__exponent_normalization); TestSuite_Add(suite, "/bson/decimal128/from_string/zero", test_decimal128_from_string__zeros); TestSuite_Add(suite, "/bson/decimal128/from_string/with_length", test_decimal128_from_string_w_len__special); } mongo-c-driver-2.2.1/src/libbson/tests/test-endian.c000066400000000000000000000026261511661753600223250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void test_swap16(void) { uint16_t v = 0xFCBA; BSON_ASSERT(BSON_UINT16_SWAP_LE_BE(v) == 0xBAFC); BSON_ASSERT(__bson_uint16_swap_slow(v) == 0xBAFC); } static void test_swap32(void) { uint32_t v = 0x00112233; BSON_ASSERT(BSON_UINT32_SWAP_LE_BE(v) == 0x33221100); BSON_ASSERT(__bson_uint32_swap_slow(v) == 0x33221100); } static void test_swap64(void) { uint64_t v = 0x0011223344556677ULL; BSON_ASSERT(BSON_UINT64_SWAP_LE_BE(v) == 0x7766554433221100ULL); BSON_ASSERT(__bson_uint64_swap_slow(v) == 0x7766554433221100ULL); } void test_endian_install(TestSuite *suite) { TestSuite_Add(suite, "/endian/swap16", test_swap16); TestSuite_Add(suite, "/endian/swap32", test_swap32); TestSuite_Add(suite, "/endian/swap64", test_swap64); } mongo-c-driver-2.2.1/src/libbson/tests/test-iso8601.c000066400000000000000000000403471511661753600222020ustar00rootroot00000000000000#include #include #include #include #include #include static const bool is_time_t_small = (sizeof(time_t) == sizeof(int32_t)); static void test_date(const char *str, int64_t millis) { int64_t v; bson_error_t error; const size_t len = strlen(str); BSON_ASSERT(mlib_in_range(int32_t, len)); if (!_bson_iso8601_date_parse(str, (int32_t)len, &v, &error)) { fprintf(stderr, "could not parse (%s)\n", str); abort(); } if (v != millis) { fprintf(stderr, "parsed value not correct: %" PRId64 " != %" PRId64 "\n", millis, v); fprintf(stderr, "parsing: [%s]\n", str); abort(); } } static void test_date_io(const char *str_in, const char *str_out, int64_t millis) { test_date(str_in, millis); mcommon_string_append_t bson_str; mcommon_string_new_as_append(&bson_str); mcommon_iso8601_string_append(&bson_str, millis); ASSERT_CMPSTR(mcommon_str_from_append(&bson_str), str_out); mcommon_string_from_append_destroy(&bson_str); } /* round trip str -> millis -> str */ static void test_date_rt(const char *str, int64_t millis) { test_date_io(str, str, millis); } static void test_date_should_fail(const char *str) { int64_t v; bson_error_t error; const size_t len = strlen(str); BSON_ASSERT(mlib_in_range(int32_t, len)); if (_bson_iso8601_date_parse(str, (int32_t)len, &v, &error)) { fprintf(stderr, "should not be able to parse (%s)\n", str); abort(); } } static void test_bson_iso8601_utc(void) { /* Allowed date format: * YYYY-MM-DDTHH:MM[:SS[.m[m[m]]]]Z * Year, month, day, hour, and minute are required, while the seconds * component and one to * three milliseconds are optional. */ test_date_rt("1971-02-03T04:05:06.789Z", 34401906789ULL); test_date_io("1971-02-03T04:05:06.78Z", "1971-02-03T04:05:06.780Z", 34401906780ULL); test_date_io("1971-02-03T04:05:06.7Z", "1971-02-03T04:05:06.700Z", 34401906700ULL); test_date_rt("1971-02-03T04:05:06Z", 34401906000ULL); test_date_io("1971-02-03T04:05Z", "1971-02-03T04:05:00Z", 34401900000ULL); test_date_io("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0ULL); test_date_rt("1970-06-30T01:06:40.981Z", 15556000981ULL); test_date("1970-01-01T00:00:00.000+0100", -3600LL * 1000); test_date("1970-01-01T00:00:00.000+01:00", -3600LL * 1000); if (!is_time_t_small) { test_date_rt("2058-02-20T18:29:11.100Z", 2781455351100ULL); test_date("3001-01-01T08:00:00.000Z", 32535244800000ULL); } test_date_rt("2013-02-20T18:29:11.100Z", 1361384951100ULL); /* from the BSON Corpus Tests */ test_date_io("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0); test_date_rt("2012-12-24T12:15:30.500Z", 1356351330500); test_date("1960-12-24T12:15:30.500Z", -284643869500LL); } static void test_bson_iso8601_local(void) { /* Allowed date format: * YYYY-MM-DDTHH:MM[:SS[.m[m[m]]]]+HHMM * Year, month, day, hour, and minute are required, while the seconds * component and one to * three milliseconds are optional. The time zone offset must be four * digits. */ test_date_io("1971-02-03T09:16:06.789+0511", "1971-02-03T04:05:06.789Z", 34401906789ULL); test_date_io("1971-02-03T09:16:06.78+0511", "1971-02-03T04:05:06.780Z", 34401906780ULL); test_date_io("1971-02-03T09:16:06.7+0511", "1971-02-03T04:05:06.700Z", 34401906700ULL); test_date_io("1971-02-03T09:16:06+0511", "1971-02-03T04:05:06Z", 34401906000ULL); test_date_io("1971-02-03T09:16+0511", "1971-02-03T04:05:00Z", 34401900000ULL); test_date_io("1971-02-03T09:16+05:11", "1971-02-03T04:05:00Z", 34401900000ULL); test_date_io("1970-01-01T00:00:00.000Z", "1970-01-01T00:00:00Z", 0ULL); test_date_rt("1970-06-30T01:06:40.981Z", 15556000981ULL); test_date_io("1970-06-29T21:06:40.981-0400", "1970-06-30T01:06:40.981Z", 15556000981ULL); test_date_io("1969-12-31T16:00:00.000-0800", "1970-01-01T00:00:00Z", 0ULL); if (!is_time_t_small) { test_date_io("2058-02-20T13:29:11.100-0500", "2058-02-20T18:29:11.100Z", 2781455351100ULL); test_date_rt("3000-12-31T23:59:59Z", 32535215999000ULL); } else { test_date_rt("2038-01-19T03:14:07Z", 2147483647000ULL); } test_date_io("2013-02-20T13:29:11.100-0500", "2013-02-20T18:29:11.100Z", 1361384951100ULL); test_date_io("2013-02-20T13:29:11.100-0501", "2013-02-20T18:30:11.100Z", 1361385011100ULL); test_date("0000-01-01T00:00:00.000Z", -62167219200000LL); test_date("0000-01-01T00:00:00.000+2300", -62167302000000LL); test_date("9999-01-01T00:00:00.000Z", 253370764800000ULL); } static void test_bson_iso8601_invalid(void) { /* Invalid decimal */ test_date_should_fail("1970-01-01T00:00:00.0.0Z"); test_date_should_fail("1970-01-01T00:00:.0.000Z"); test_date_should_fail("1970-01-01T00:.0:00.000Z"); test_date_should_fail("1970-01-01T.0:00:00.000Z"); test_date_should_fail("1970-01-.1T00:00:00.000Z"); test_date_should_fail("1970-.1-01T00:00:00.000Z"); test_date_should_fail(".970-01-01T00:00:00.000Z"); /* Extra sign characters */ test_date_should_fail("1970-01-01T00:00:00.+00Z"); test_date_should_fail("1970-01-01T00:00:+0.000Z"); test_date_should_fail("1970-01-01T00:+0:00.000Z"); test_date_should_fail("1970-01-01T+0:00:00.000Z"); test_date_should_fail("1970-01-+1T00:00:00.000Z"); test_date_should_fail("1970-+1-01T00:00:00.000Z"); test_date_should_fail("+970-01-01T00:00:00.000Z"); test_date_should_fail("1970-01-01T00:00:00.-00Z"); test_date_should_fail("1970-01-01T00:00:-0.000Z"); test_date_should_fail("1970-01-01T00:-0:00.000Z"); test_date_should_fail("1970-01-01T-0:00:00.000Z"); test_date_should_fail("1970-01--1T00:00:00.000Z"); test_date_should_fail("1970--1-01T00:00:00.000Z"); test_date_should_fail("-970-01-01T00:00:00.000Z"); /* Out of range */ test_date_should_fail("1970-01-01T00:60:00.000Z"); test_date_should_fail("1970-01-01T24:00:00.000Z"); test_date_should_fail("1970-01-32T00:00:00.000Z"); test_date_should_fail("1970-01-00T00:00:00.000Z"); test_date_should_fail("1970-13-01T00:00:00.000Z"); test_date_should_fail("1970-00-01T00:00:00.000Z"); test_date_should_fail("10000-01-01T00:00:00.000Z"); test_date_should_fail("-10000-01-01T00:00:00.000Z"); /* Invalid lengths */ test_date_should_fail("01970-01-01T00:00:00.000Z"); test_date_should_fail("1970-001-01T00:00:00.000Z"); test_date_should_fail("1970-01-001T00:00:00.000Z"); test_date_should_fail("1970-01-01T000:00:00.000Z"); test_date_should_fail("1970-01-01T00:000:00.000Z"); test_date_should_fail("1970-01-01T00:00:000.000Z"); test_date_should_fail("1970-01-01T00:00:00.0000Z"); test_date_should_fail("197-01-01T00:00:00.000Z"); test_date_should_fail("1970-1-01T00:00:00.000Z"); test_date_should_fail("1970-01-1T00:00:00.000Z"); test_date_should_fail("1970-01-01T0:00:00.000Z"); test_date_should_fail("1970-01-01T00:0:00.000Z"); test_date_should_fail("1970-01-01T00:00:0.000Z"); /* Invalid delimiters */ test_date_should_fail("1970+01-01T00:00:00.000Z"); test_date_should_fail("1970-01+01T00:00:00.000Z"); test_date_should_fail("1970-01-01Q00:00:00.000Z"); test_date_should_fail("1970-01-01T00-00:00.000Z"); test_date_should_fail("1970-01-01T00:00-00.000Z"); test_date_should_fail("1970-01-01T00:00:00-000Z"); /* Missing numbers */ test_date_should_fail("1970--01T00:00:00.000Z"); test_date_should_fail("1970-01-T00:00:00.000Z"); test_date_should_fail("1970-01-01T:00:00.000Z"); test_date_should_fail("1970-01-01T00::00.000Z"); test_date_should_fail("1970-01-01T00:00:.000Z"); test_date_should_fail("1970-01-01T00:00:00.Z"); /* Bad time offset field */ test_date_should_fail("1970-01-01T05:00:01ZZ"); test_date_should_fail("1970-01-01T05:00:01+"); test_date_should_fail("1970-01-01T05:00:01-"); test_date_should_fail("1970-01-01T05:00:01-11111"); test_date_should_fail("1970-01-01T05:00:01Z1111"); test_date_should_fail("1970-01-01T05:00:01+111"); test_date_should_fail("1970-01-01T05:00:01+1160"); test_date_should_fail("1970-01-01T05:00:01+2400"); test_date_should_fail("1970-01-01T05:00:01+00+0"); /* Bad prefixes */ test_date_should_fail("1970-01-01T05:00:01."); test_date_should_fail("1970-01-01T05:00:"); test_date_should_fail("1970-01-01T05:"); test_date_should_fail("1970-01-01T"); test_date_should_fail("1970-01-"); test_date_should_fail("1970-"); test_date_should_fail("1970-01-01T05+0500"); test_date_should_fail("1970-01-01+0500"); test_date_should_fail("1970-01+0500"); test_date_should_fail("1970+0500"); test_date_should_fail("1970-01-01T01Z"); test_date_should_fail("1970-01-01Z"); test_date_should_fail("1970-01Z"); test_date_should_fail("1970Z"); /* No local time */ test_date_should_fail("1970-01-01T00:00:00.000"); test_date_should_fail("1970-01-01T00:00:00"); test_date_should_fail("1970-01-01T00:00"); test_date_should_fail("1970-01-01T00"); test_date_should_fail("1970-01-01"); test_date_should_fail("1970-01"); test_date_should_fail("1970"); /* Invalid hex base specifiers */ test_date_should_fail("x970-01-01T00:00:00.000Z"); test_date_should_fail("1970-x1-01T00:00:00.000Z"); test_date_should_fail("1970-01-x1T00:00:00.000Z"); test_date_should_fail("1970-01-01Tx0:00:00.000Z"); test_date_should_fail("1970-01-01T00:x0:00.000Z"); test_date_should_fail("1970-01-01T00:00:x0.000Z"); test_date_should_fail("1970-01-01T00:00:00.x00Z"); } static void test_bson_iso8601_leap_year(void) { test_date_rt("1972-02-29T00:00:00Z", 68169600000ULL); test_date_rt("1976-02-29T00:00:00Z", 194400000000ULL); test_date_rt("1980-02-29T00:00:00Z", 320630400000ULL); test_date_rt("1984-02-29T00:00:00Z", 446860800000ULL); test_date_rt("1988-02-29T00:00:00Z", 573091200000ULL); test_date_rt("1992-02-29T00:00:00Z", 699321600000ULL); test_date_rt("1996-02-29T00:00:00Z", 825552000000ULL); test_date_rt("2000-02-29T00:00:00Z", 951782400000ULL); test_date_rt("2004-02-29T00:00:00Z", 1078012800000ULL); test_date_rt("2008-02-29T00:00:00Z", 1204243200000ULL); test_date_rt("2012-02-29T00:00:00Z", 1330473600000ULL); test_date_rt("2016-02-29T00:00:00Z", 1456704000000ULL); test_date_rt("2020-02-29T00:00:00Z", 1582934400000ULL); test_date_rt("2024-02-29T00:00:00Z", 1709164800000ULL); test_date_rt("2028-02-29T00:00:00Z", 1835395200000ULL); test_date_rt("2032-02-29T00:00:00Z", 1961625600000ULL); test_date_rt("2036-02-29T00:00:00Z", 2087856000000ULL); if (!is_time_t_small) { test_date_rt("2040-02-29T00:00:00Z", 2214086400000ULL); test_date_rt("2044-02-29T00:00:00Z", 2340316800000ULL); test_date_rt("2048-02-29T00:00:00Z", 2466547200000ULL); test_date_rt("2052-02-29T00:00:00Z", 2592777600000ULL); test_date_rt("2056-02-29T00:00:00Z", 2719008000000ULL); test_date_rt("2060-02-29T00:00:00Z", 2845238400000ULL); test_date_rt("2064-02-29T00:00:00Z", 2971468800000ULL); test_date_rt("2068-02-29T00:00:00Z", 3097699200000ULL); test_date_rt("2072-02-29T00:00:00Z", 3223929600000ULL); test_date_rt("2076-02-29T00:00:00Z", 3350160000000ULL); test_date_rt("2080-02-29T00:00:00Z", 3476390400000ULL); test_date_rt("2084-02-29T00:00:00Z", 3602620800000ULL); test_date_rt("2088-02-29T00:00:00Z", 3728851200000ULL); test_date_rt("2092-02-29T00:00:00Z", 3855081600000ULL); test_date_rt("2096-02-29T00:00:00Z", 3981312000000ULL); test_date_rt("2104-02-29T00:00:00Z", 4233686400000ULL); test_date_rt("2108-02-29T00:00:00Z", 4359916800000ULL); test_date_rt("2112-02-29T00:00:00Z", 4486147200000ULL); test_date_rt("2116-02-29T00:00:00Z", 4612377600000ULL); test_date_rt("2120-02-29T00:00:00Z", 4738608000000ULL); test_date_rt("2124-02-29T00:00:00Z", 4864838400000ULL); test_date_rt("2128-02-29T00:00:00Z", 4991068800000ULL); test_date_rt("2132-02-29T00:00:00Z", 5117299200000ULL); test_date_rt("2136-02-29T00:00:00Z", 5243529600000ULL); test_date_rt("2140-02-29T00:00:00Z", 5369760000000ULL); test_date_rt("2144-02-29T00:00:00Z", 5495990400000ULL); test_date_rt("2148-02-29T00:00:00Z", 5622220800000ULL); test_date_rt("2152-02-29T00:00:00Z", 5748451200000ULL); test_date_rt("2156-02-29T00:00:00Z", 5874681600000ULL); test_date_rt("2160-02-29T00:00:00Z", 6000912000000ULL); test_date_rt("2164-02-29T00:00:00Z", 6127142400000ULL); test_date_rt("2168-02-29T00:00:00Z", 6253372800000ULL); test_date_rt("2172-02-29T00:00:00Z", 6379603200000ULL); test_date_rt("2176-02-29T00:00:00Z", 6505833600000ULL); test_date_rt("2180-02-29T00:00:00Z", 6632064000000ULL); test_date_rt("2184-02-29T00:00:00Z", 6758294400000ULL); test_date_rt("2188-02-29T00:00:00Z", 6884524800000ULL); test_date_rt("2192-02-29T00:00:00Z", 7010755200000ULL); test_date_rt("2196-02-29T00:00:00Z", 7136985600000ULL); test_date_rt("2204-02-29T00:00:00Z", 7389360000000ULL); test_date_rt("2208-02-29T00:00:00Z", 7515590400000ULL); test_date_rt("2212-02-29T00:00:00Z", 7641820800000ULL); test_date_rt("2216-02-29T00:00:00Z", 7768051200000ULL); test_date_rt("2220-02-29T00:00:00Z", 7894281600000ULL); test_date_rt("2224-02-29T00:00:00Z", 8020512000000ULL); test_date_rt("2228-02-29T00:00:00Z", 8146742400000ULL); test_date_rt("2232-02-29T00:00:00Z", 8272972800000ULL); test_date_rt("2236-02-29T00:00:00Z", 8399203200000ULL); test_date_rt("2240-02-29T00:00:00Z", 8525433600000ULL); test_date_rt("2244-02-29T00:00:00Z", 8651664000000ULL); test_date_rt("2248-02-29T00:00:00Z", 8777894400000ULL); test_date_rt("2252-02-29T00:00:00Z", 8904124800000ULL); test_date_rt("2256-02-29T00:00:00Z", 9030355200000ULL); test_date_rt("2260-02-29T00:00:00Z", 9156585600000ULL); test_date_rt("2264-02-29T00:00:00Z", 9282816000000ULL); test_date_rt("2268-02-29T00:00:00Z", 9409046400000ULL); test_date_rt("2272-02-29T00:00:00Z", 9535276800000ULL); test_date_rt("2276-02-29T00:00:00Z", 9661507200000ULL); test_date_rt("2280-02-29T00:00:00Z", 9787737600000ULL); test_date_rt("2284-02-29T00:00:00Z", 9913968000000ULL); test_date_rt("2288-02-29T00:00:00Z", 10040198400000ULL); test_date_rt("2292-02-29T00:00:00Z", 10166428800000ULL); test_date_rt("2296-02-29T00:00:00Z", 10292659200000ULL); test_date_rt("2304-02-29T00:00:00Z", 10545033600000ULL); test_date_rt("2308-02-29T00:00:00Z", 10671264000000ULL); test_date_rt("2312-02-29T00:00:00Z", 10797494400000ULL); test_date_rt("2316-02-29T00:00:00Z", 10923724800000ULL); test_date_rt("2320-02-29T00:00:00Z", 11049955200000ULL); test_date_rt("2324-02-29T00:00:00Z", 11176185600000ULL); test_date_rt("2328-02-29T00:00:00Z", 11302416000000ULL); test_date_rt("2332-02-29T00:00:00Z", 11428646400000ULL); test_date_rt("2336-02-29T00:00:00Z", 11554876800000ULL); test_date_rt("2340-02-29T00:00:00Z", 11681107200000ULL); test_date_rt("2344-02-29T00:00:00Z", 11807337600000ULL); test_date_rt("2348-02-29T00:00:00Z", 11933568000000ULL); test_date_rt("2352-02-29T00:00:00Z", 12059798400000ULL); test_date_rt("2356-02-29T00:00:00Z", 12186028800000ULL); test_date_rt("2360-02-29T00:00:00Z", 12312259200000ULL); test_date_rt("2364-02-29T00:00:00Z", 12438489600000ULL); test_date_rt("2368-02-29T00:00:00Z", 12564720000000ULL); test_date_rt("2372-02-29T00:00:00Z", 12690950400000ULL); test_date_rt("2376-02-29T00:00:00Z", 12817180800000ULL); test_date_rt("2380-02-29T00:00:00Z", 12943411200000ULL); test_date_rt("2384-02-29T00:00:00Z", 13069641600000ULL); test_date_rt("2388-02-29T00:00:00Z", 13195872000000ULL); test_date_rt("2392-02-29T00:00:00Z", 13322102400000ULL); test_date_rt("2396-02-29T00:00:00Z", 13448332800000ULL); test_date_rt("2400-02-29T00:00:00Z", 13574563200000ULL); } } void test_iso8601_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/iso8601/utc", test_bson_iso8601_utc); TestSuite_Add(suite, "/bson/iso8601/local", test_bson_iso8601_local); TestSuite_Add(suite, "/bson/iso8601/invalid", test_bson_iso8601_invalid); TestSuite_Add(suite, "/bson/iso8601/leap_year", test_bson_iso8601_leap_year); } mongo-c-driver-2.2.1/src/libbson/tests/test-iter.c000066400000000000000000000530131511661753600220260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #define FUZZ_N_PASSES 100000 static bson_t * get_bson(const char *filename) { uint8_t buf[4096]; bson_t *b; ssize_t len; int fd; if (-1 == (fd = bson_open(filename, O_RDONLY))) { fprintf(stderr, "Failed to open: %s\n", filename); abort(); } if ((len = bson_read(fd, buf, sizeof buf)) < 0) { fprintf(stderr, "Failed to read: %s\n", filename); abort(); } BSON_ASSERT(len > 0); b = bson_new_from_data(buf, (uint32_t)len); bson_close(fd); return b; } static void test_bson_iter_utf8(void) { uint32_t len = 0; bson_iter_t iter; bson_t *b; char *s; b = bson_new(); BSON_ASSERT(bson_append_utf8(b, "foo", -1, "bar", -1)); BSON_ASSERT(bson_append_utf8(b, "bar", -1, "baz", -1)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); BSON_ASSERT(!strcmp(bson_iter_key(&iter), "foo")); BSON_ASSERT(!strcmp(bson_iter_utf8(&iter, NULL), "bar")); s = bson_iter_dup_utf8(&iter, &len); ASSERT_CMPSTR("bar", s); ASSERT_CMPINT(len, ==, 3); bson_free(s); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); BSON_ASSERT(!strcmp(bson_iter_key(&iter), "bar")); BSON_ASSERT(!strcmp(bson_iter_utf8(&iter, NULL), "baz")); BSON_ASSERT(!bson_iter_next(&iter)); bson_destroy(b); } static void test_bson_iter_mixed(void) { bson_iter_t iter; bson_decimal128_t iter_value; bson_decimal128_t value; bson_t *b; bson_t *b2; b = bson_new(); b2 = bson_new(); value.high = 0; value.low = 1; BSON_ASSERT(bson_append_utf8(b2, "foo", -1, "bar", -1)); BSON_ASSERT(bson_append_code(b, "0", -1, "var a = {};")); BSON_ASSERT(bson_append_code_with_scope(b, "1", -1, "var b = {};", b2)); BSON_ASSERT(bson_append_int32(b, "2", -1, 1234)); BSON_ASSERT(bson_append_int64(b, "3", -1, 4567)); BSON_ASSERT(bson_append_time_t(b, "4", -1, 123456)); BSON_ASSERT(bson_append_decimal128(b, "5", -1, &value)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_CODE(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_CODEWSCOPE(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_DATE_TIME(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_DECIMAL128(&iter)); BSON_ASSERT(!bson_iter_next(&iter)); BSON_ASSERT(bson_iter_init_find(&iter, b, "3")); BSON_ASSERT(!strcmp(bson_iter_key(&iter), "3")); BSON_ASSERT(bson_iter_int64(&iter) == 4567); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(BSON_ITER_HOLDS_DATE_TIME(&iter)); BSON_ASSERT(bson_iter_time_t(&iter) == 123456); BSON_ASSERT(bson_iter_date_time(&iter) == 123456000); BSON_ASSERT(bson_iter_next(&iter)); bson_iter_decimal128(&iter, &iter_value); /* This test uses memcmp because libbson lacks decimal128 comparison. */ BSON_ASSERT(memcmp(&iter_value, &value, sizeof(value)) == 0); BSON_ASSERT(!bson_iter_next(&iter)); bson_destroy(b); bson_destroy(b2); } static void test_bson_iter_overflow(void) { bson_iter_t iter; bson_t *b; b = get_bson(BSON_BINARY_DIR "/overflow1.bson"); BSON_ASSERT(!b); b = get_bson(BSON_BINARY_DIR "/overflow2.bson"); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); bson_destroy(b); } static void test_bson_iter_binary_deprecated(void) { bson_subtype_t subtype; uint32_t binary_len; const uint8_t *binary; bson_iter_t iter; bson_t *b; b = get_bson(BSON_BINARY_DIR "/binary_deprecated.bson"); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); bson_iter_binary(&iter, &subtype, &binary_len, &binary); BSON_ASSERT(binary_len == 4); BSON_ASSERT(memcmp(binary, "1234", 4) == 0); bson_destroy(b); } static void test_bson_iter_timeval(void) { bson_iter_t iter; bson_t *b; struct timeval tv; b = get_bson(BSON_BINARY_DIR "/test26.bson"); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); bson_iter_timeval(&iter, &tv); BSON_ASSERT(tv.tv_sec == 1234567890); BSON_ASSERT(tv.tv_usec == 0); bson_destroy(b); } static void test_bson_iter_trailing_null(void) { bson_iter_t iter; bson_t *b; b = get_bson(BSON_BINARY_DIR "/trailingnull.bson"); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); bson_destroy(b); } static void test_bson_iter_fuzz(void) { uint8_t *data; uint32_t len = 512; uint32_t r; bson_iter_t iter; bson_t *b; uint32_t i; int pass; for (pass = 0; pass < FUZZ_N_PASSES; pass++) { data = bson_malloc0(len); mlib_write_u32le(data, len); for (i = 4; i < len; i += 4) { r = rand(); memcpy(&data[i], &r, sizeof(r)); } if (!(b = bson_new_from_data(data, len))) { /* * It could fail on buffer length or missing trailing null byte. */ bson_free(data); continue; } BSON_ASSERT(b); /* * TODO: Most of the following ignores the key. That should be fixed * but has it's own perils too. */ BSON_ASSERT(bson_iter_init(&iter, b)); while (bson_iter_next(&iter)) { BSON_ASSERT(iter.next_off < len); switch (bson_iter_type(&iter)) { case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: { const uint8_t *child = NULL; uint32_t child_len = 0; bson_iter_document(&iter, &child_len, &child); if (child_len) { BSON_ASSERT(child); BSON_ASSERT(child_len >= 5); BSON_ASSERT((iter.off + child_len) < b->len); BSON_ASSERT(child_len < (uint32_t)-1); child_len = mlib_read_u32le(child); BSON_ASSERT(child_len >= 5); } } break; case BSON_TYPE_DOUBLE: case BSON_TYPE_UTF8: case BSON_TYPE_BINARY: case BSON_TYPE_UNDEFINED: break; case BSON_TYPE_OID: BSON_ASSERT(iter.off + 12 < iter.len); break; case BSON_TYPE_BOOL: case BSON_TYPE_DATE_TIME: case BSON_TYPE_NULL: case BSON_TYPE_REGEX: /* TODO: check for 2 valid cstring. */ case BSON_TYPE_DBPOINTER: case BSON_TYPE_CODE: case BSON_TYPE_SYMBOL: case BSON_TYPE_CODEWSCOPE: case BSON_TYPE_INT32: case BSON_TYPE_TIMESTAMP: case BSON_TYPE_INT64: case BSON_TYPE_DECIMAL128: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: break; case BSON_TYPE_EOD: default: /* Code should not be reached. */ BSON_ASSERT(false); break; } } bson_destroy(b); bson_free(data); } } static void test_bson_iter_regex(void) { bson_iter_t iter; bson_t *b; b = bson_new(); BSON_ASSERT(bson_append_regex(b, "foo", -1, "^abcd", "")); BSON_ASSERT(bson_append_regex(b, "foo", -1, "^abcd", NULL)); BSON_ASSERT(bson_append_regex(b, "foo", -1, "^abcd", "ix")); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(bson_iter_next(&iter)); BSON_ASSERT(bson_iter_next(&iter)); bson_destroy(b); } static void test_bson_iter_next_after_finish(void) { bson_iter_t iter; bson_t *b; int i; b = bson_new(); BSON_ASSERT(bson_append_int32(b, "key", -1, 1234)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_next(&iter)); for (i = 0; i < 1000; i++) { BSON_ASSERT(!bson_iter_next(&iter)); } bson_destroy(b); } static void test_bson_iter_find_case(void) { bson_t b; bson_iter_t iter; bson_init(&b); BSON_ASSERT(bson_append_utf8(&b, "key", -1, "value", -1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find_case(&iter, "KEY")); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(!bson_iter_find(&iter, "KEY")); bson_destroy(&b); } static void test_bson_iter_find_w_len(void) { bson_t b; bson_iter_t iter; bson_init(&b); BSON_ASSERT(bson_append_utf8(&b, "key", -1, "value", -1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find_w_len(&iter, "key", 3)); bson_destroy(&b); bson_init(&b); BSON_ASSERT(bson_append_utf8(&b, "key", -1, "value", -1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find_w_len(&iter, "keys", 3)); bson_destroy(&b); bson_init(&b); BSON_ASSERT(bson_append_utf8(&b, "key", -1, "value", -1)); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find_w_len(&iter, "key", -1)); bson_destroy(&b); } static void test_bson_iter_init_find_w_len(void) { bson_t b; bson_iter_t iter; bson_init(&b); BSON_ASSERT(bson_append_utf8(&b, "key", -1, "value", -1)); BSON_ASSERT(bson_iter_init_find_w_len(&iter, &b, "key", 3)); BSON_ASSERT(bson_iter_init_find_w_len(&iter, &b, "keys", 3)); BSON_ASSERT(bson_iter_init_find_w_len(&iter, &b, "key", -1)); bson_destroy(&b); } static void test_bson_iter_empty_key(void) { /* create a bson document empty keys. */ bson_t *bson = BCON_NEW("", "{", "x", BCON_INT32(1), "", "{", "y", BCON_INT32(2), "}", "}"); bson_iter_t iter; bson_iter_t descendant; BSON_ASSERT(bson_iter_init_find(&iter, bson, "")); BSON_ASSERT(bson_iter_init_find_case(&iter, bson, "")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); /* tests fixes applied in CDRIVER-2755. */ /* a find_w_len and length 0 should also find the key. */ BSON_ASSERT(bson_iter_init_find_w_len(&iter, bson, "", 0)); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); /* similarly, we should descend on an empty key. */ bson_iter_init(&iter, bson); BSON_ASSERT(bson_iter_find_descendant(&iter, ".x", &descendant)); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&descendant)); ASSERT_CMPINT(bson_iter_int32(&descendant), ==, 1); bson_iter_init(&iter, bson); BSON_ASSERT(bson_iter_find_descendant(&iter, "..y", &descendant)); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&descendant)); ASSERT_CMPINT(bson_iter_int32(&descendant), ==, 2); bson_destroy(bson); } static void test_bson_iter_as_double(void) { bson_iter_t iter; bson_t b; bson_init(&b); ASSERT(bson_append_double(&b, "key", -1, 1234.1234)); ASSERT(bson_iter_init_find(&iter, &b, "key")); ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); ASSERT(bson_iter_as_double(&iter) == 1234.1234); bson_destroy(&b); bson_init(&b); ASSERT(bson_append_int32(&b, "key", -1, 1234)); ASSERT(bson_iter_init_find(&iter, &b, "key")); ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT(bson_iter_as_double(&iter) == 1234.0); bson_destroy(&b); bson_init(&b); ASSERT(bson_append_int64(&b, "key", -1, 4321)); ASSERT(bson_iter_init_find(&iter, &b, "key")); ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT(bson_iter_as_double(&iter) == 4321.0); bson_destroy(&b); } static void test_bson_iter_overwrite_int32(void) { bson_iter_t iter; bson_t b; bson_init(&b); BSON_ASSERT(bson_append_int32(&b, "key", -1, 1234)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); bson_iter_overwrite_int32(&iter, 4321); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT_CMPINT(bson_iter_int32(&iter), ==, 4321); bson_destroy(&b); } static void test_bson_iter_overwrite_int64(void) { bson_iter_t iter; bson_t b; bson_init(&b); BSON_ASSERT(bson_append_int64(&b, "key", -1, 1234)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); bson_iter_overwrite_int64(&iter, 4641); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)4641); bson_destroy(&b); } static void test_bson_iter_overwrite_decimal128(void) { bson_iter_t iter; bson_t b; bson_decimal128_t value; bson_decimal128_t new_value; bson_decimal128_t iter_value; value.high = 0; value.low = 1; new_value.high = 0; new_value.low = 2; bson_init(&b); BSON_ASSERT(bson_append_decimal128(&b, "key", -1, &value)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_DECIMAL128(&iter)); bson_iter_overwrite_decimal128(&iter, &new_value); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_DECIMAL128(&iter)); BSON_ASSERT(bson_iter_decimal128(&iter, &iter_value)); BSON_ASSERT(memcmp(&iter_value, &new_value, sizeof(new_value)) == 0); bson_destroy(&b); } static void test_bson_iter_overwrite_double(void) { bson_iter_t iter; bson_t b; bson_init(&b); BSON_ASSERT(bson_append_double(&b, "key", -1, 1234.1234)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); bson_iter_overwrite_double(&iter, 4641.1234); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); ASSERT_CMPDOUBLE(bson_iter_double(&iter), ==, 4641.1234); bson_destroy(&b); } static void test_bson_iter_overwrite_bool(void) { bson_iter_t iter; bson_t b; bson_init(&b); BSON_ASSERT(bson_append_bool(&b, "key", -1, true)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_BOOL(&iter)); bson_iter_overwrite_bool(&iter, false); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_BOOL(&iter)); ASSERT_CMPINT(bson_iter_bool(&iter), ==, false); bson_destroy(&b); } static void test_bson_iter_overwrite_oid(void) { bson_oid_t oid; bson_iter_t iter; bson_t b; bson_oid_init_from_string(&oid, "000000000000000000001234"); bson_init(&b); BSON_ASSERT(BSON_APPEND_OID(&b, "key", &oid)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); bson_oid_init_from_string(&oid, "000000000000000000004321"); bson_iter_overwrite_oid(&iter, &oid); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); ASSERT_CMPOID(bson_iter_oid(&iter), &oid); bson_destroy(&b); } static void test_bson_iter_overwrite_timestamp(void) { bson_iter_t iter; bson_t b; uint32_t t, i; bson_init(&b); BSON_ASSERT(BSON_APPEND_TIMESTAMP(&b, "key", 1, 2)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); bson_iter_overwrite_timestamp(&iter, 3, 4); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); bson_iter_timestamp(&iter, &t, &i); ASSERT_CMPUINT32(t, ==, 3); ASSERT_CMPUINT32(i, ==, 4); bson_destroy(&b); } static void test_bson_iter_overwrite_date_time(void) { bson_iter_t iter; bson_t b; bson_init(&b); BSON_ASSERT(BSON_APPEND_DATE_TIME(&b, "key", 1234567890)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); bson_iter_overwrite_date_time(&iter, -1234567890); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); ASSERT_CMPINT64(bson_iter_date_time(&iter), ==, -1234567890); bson_destroy(&b); } static void test_bson_iter_recurse(void) { bson_iter_t iter; bson_iter_t child; bson_t b; bson_t cb; bson_init(&b); bson_init(&cb); BSON_ASSERT(bson_append_int32(&cb, "0", 1, 0)); BSON_ASSERT(bson_append_int32(&cb, "1", 1, 1)); BSON_ASSERT(bson_append_int32(&cb, "2", 1, 2)); BSON_ASSERT(bson_append_array(&b, "key", -1, &cb)); BSON_ASSERT(bson_iter_init_find(&iter, &b, "key")); BSON_ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); BSON_ASSERT(bson_iter_recurse(&iter, &child)); BSON_ASSERT(bson_iter_find(&child, "0")); BSON_ASSERT(bson_iter_find(&child, "1")); BSON_ASSERT(bson_iter_find(&child, "2")); BSON_ASSERT(!bson_iter_next(&child)); bson_destroy(&b); bson_destroy(&cb); } static void test_bson_iter_init_find_case(void) { bson_t b; bson_iter_t iter; bson_init(&b); BSON_ASSERT(bson_append_int32(&b, "FOO", -1, 1234)); BSON_ASSERT(bson_iter_init_find_case(&iter, &b, "foo")); ASSERT_CMPINT(bson_iter_int32(&iter), ==, 1234); bson_destroy(&b); } static void test_bson_iter_find_descendant(void) { bson_iter_t iter; bson_iter_t desc; bson_t *b; b = get_bson(BSON_BINARY_DIR "/dotkey.bson"); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_find_descendant(&iter, "a.b.c.0", &desc)); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&desc)); BSON_ASSERT(bson_iter_int32(&desc) == 1); bson_destroy(b); b = BCON_NEW("foo", "{", "bar", "[", "{", "baz", BCON_INT32(1), "}", "]", "}"); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_find_descendant(&iter, "foo.bar.0.baz", &desc)); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&desc)); BSON_ASSERT(bson_iter_int32(&desc) == 1); bson_destroy(b); b = BCON_NEW("nModified", BCON_INT32(1), "n", BCON_INT32(2)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_find_descendant(&iter, "n", &desc)); BSON_ASSERT(!strcmp(bson_iter_key(&desc), "n")); bson_destroy(b); b = BCON_NEW("", BCON_INT32(1), "n", BCON_INT32(2)); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(bson_iter_find_descendant(&iter, "n", &desc)); BSON_ASSERT(!strcmp(bson_iter_key(&desc), "n")); bson_destroy(b); } static void test_bson_iter_as_bool(void) { bson_iter_t iter; bson_t b; bson_init(&b); bson_append_int32(&b, "int32[true]", -1, 1); bson_append_int32(&b, "int32[false]", -1, 0); bson_append_int64(&b, "int64[true]", -1, 1); bson_append_int64(&b, "int64[false]", -1, 0); bson_append_double(&b, "int64[true]", -1, 1.0); bson_append_double(&b, "int64[false]", -1, 0.0); bson_iter_init(&iter, &b); bson_iter_next(&iter); ASSERT_CMPINT(true, ==, bson_iter_as_bool(&iter)); bson_iter_next(&iter); ASSERT_CMPINT(false, ==, bson_iter_as_bool(&iter)); bson_iter_next(&iter); ASSERT_CMPINT(true, ==, bson_iter_as_bool(&iter)); bson_iter_next(&iter); ASSERT_CMPINT(false, ==, bson_iter_as_bool(&iter)); bson_iter_next(&iter); ASSERT_CMPINT(true, ==, bson_iter_as_bool(&iter)); bson_iter_next(&iter); ASSERT_CMPINT(false, ==, bson_iter_as_bool(&iter)); bson_destroy(&b); } static void test_bson_iter_from_data(void) { /* {"b": true}, with implicit NULL at end */ uint8_t data[] = "\x09\x00\x00\x00\x08\x62\x00\x01"; bson_iter_t iter; ASSERT(bson_iter_init_from_data(&iter, data, sizeof data)); ASSERT(bson_iter_next(&iter)); ASSERT(BSON_ITER_HOLDS_BOOL(&iter)); ASSERT(bson_iter_bool(&iter)); } void test_iter_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/iter/test_string", test_bson_iter_utf8); TestSuite_Add(suite, "/bson/iter/test_mixed", test_bson_iter_mixed); TestSuite_Add(suite, "/bson/iter/test_overflow", test_bson_iter_overflow); TestSuite_Add(suite, "/bson/iter/test_timeval", test_bson_iter_timeval); TestSuite_Add(suite, "/bson/iter/test_trailing_null", test_bson_iter_trailing_null); TestSuite_Add(suite, "/bson/iter/test_fuzz", test_bson_iter_fuzz); TestSuite_Add(suite, "/bson/iter/test_regex", test_bson_iter_regex); TestSuite_Add(suite, "/bson/iter/test_next_after_finish", test_bson_iter_next_after_finish); TestSuite_Add(suite, "/bson/iter/test_find_case", test_bson_iter_find_case); TestSuite_Add(suite, "/bson/iter/test_find_w_len", test_bson_iter_find_w_len); TestSuite_Add(suite, "/bson/iter/test_init_find_w_len", test_bson_iter_init_find_w_len); TestSuite_Add(suite, "/bson/iter/test_bson_iter_as_double", test_bson_iter_as_double); TestSuite_Add(suite, "/bson/iter/test_overwrite_int32", test_bson_iter_overwrite_int32); TestSuite_Add(suite, "/bson/iter/test_overwrite_int64", test_bson_iter_overwrite_int64); TestSuite_Add(suite, "/bson/iter/test_overwrite_double", test_bson_iter_overwrite_double); TestSuite_Add(suite, "/bson/iter/test_overwrite_bool", test_bson_iter_overwrite_bool); TestSuite_Add(suite, "/bson/iter/test_overwrite_oid", test_bson_iter_overwrite_oid); TestSuite_Add(suite, "/bson/iter/test_overwrite_timestamp", test_bson_iter_overwrite_timestamp); TestSuite_Add(suite, "/bson/iter/test_overwrite_date_time", test_bson_iter_overwrite_date_time); TestSuite_Add(suite, "/bson/iter/test_bson_iter_overwrite_decimal128", test_bson_iter_overwrite_decimal128); TestSuite_Add(suite, "/bson/iter/recurse", test_bson_iter_recurse); TestSuite_Add(suite, "/bson/iter/init_find_case", test_bson_iter_init_find_case); TestSuite_Add(suite, "/bson/iter/find_descendant", test_bson_iter_find_descendant); TestSuite_Add(suite, "/bson/iter/as_bool", test_bson_iter_as_bool); TestSuite_Add(suite, "/bson/iter/binary_deprecated", test_bson_iter_binary_deprecated); TestSuite_Add(suite, "/bson/iter/from_data", test_bson_iter_from_data); TestSuite_Add(suite, "/bson/iter/empty_key", test_bson_iter_empty_key); } mongo-c-driver-2.2.1/src/libbson/tests/test-json.c000066400000000000000000003760771511661753600220560ustar00rootroot00000000000000/* required on old Windows for rand_s to be defined */ #ifdef _WIN32 #define _CRT_RAND_S #endif #include #include #include #include #include #include #include #include #include static ssize_t test_bson_json_read_cb_helper(void *string, uint8_t *buf, size_t len) { size_t str_size = strlen((char *)string); if (str_size) { memcpy(buf, string, BSON_MIN(str_size, len)); return str_size; } else { return 0; } } static void test_bson_json_allow_multiple(void) { int32_t one; bson_error_t error; bson_json_reader_t *reader; bson_t bson; const char *collection; const bson_oid_t *oid; bson_oid_t oid_expected; int i; /* nested JSON tests code that reuses parser stack frames, CDRIVER-2524 */ char *multiple_json = "{\"a\": 1}" "{\"b\": {\"$dbPointer\": " " {\"$ref\": \"c\", \"$id\": {\"$oid\": \"12341234123412abcdababcd\"}}}}" "{\"c\": {\"x\": 1}}"; bson_oid_init_from_string(&oid_expected, "12341234123412abcdababcd"); for (i = 0; i < 2; i++) { reader = bson_json_reader_new(multiple_json, &test_bson_json_read_cb_helper, NULL, i == 1 /* allow_multiple */, 0); BSON_ASSERT(reader); /* read first json */ bson_init(&bson); ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "a", BCONE_INT32(one)); ASSERT_CMPINT(1, ==, one); /* read second json */ bson_reinit(&bson); ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "b", BCONE_DBPOINTER(collection, oid)); ASSERT_CMPSTR(collection, "c"); BSON_ASSERT(0 == bson_oid_compare(oid, &oid_expected)); /* read third json */ bson_reinit(&bson); ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "c", BCONE_INT32(one)); ASSERT_CMPINT(1, ==, one); /* surprisingly, the reader begins at the start of the string again */ bson_reinit(&bson); ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "a", BCONE_INT32(one)); ASSERT_CMPINT(1, ==, one); bson_json_reader_destroy(reader); bson_destroy(&bson); } } static void test_bson_as_json_x1000(void) { bson_oid_t oid; bson_decimal128_t decimal128; bson_t *b; bson_t *b2; char *str; size_t len; int i; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; bson_oid_init_from_string(&oid, "123412341234abcdabcdabcd"); b = bson_new(); BSON_ASSERT(bson_append_utf8(b, "utf8", -1, "bar", -1)); BSON_ASSERT(bson_append_int32(b, "int32", -1, 1234)); BSON_ASSERT(bson_append_int64(b, "int64", -1, 4321)); BSON_ASSERT(bson_append_double(b, "double", -1, 123.4)); BSON_ASSERT(bson_append_undefined(b, "undefined", -1)); BSON_ASSERT(bson_append_null(b, "null", -1)); BSON_ASSERT(bson_append_oid(b, "oid", -1, &oid)); BSON_ASSERT(bson_append_bool(b, "true", -1, true)); BSON_ASSERT(bson_append_bool(b, "false", -1, false)); BSON_ASSERT(bson_append_time_t(b, "date", -1, time(NULL))); BSON_ASSERT(bson_append_timestamp(b, "timestamp", -1, (uint32_t)time(NULL), 1234)); BSON_ASSERT(bson_append_regex(b, "regex", -1, "^abcd", "xi")); BSON_ASSERT(bson_append_dbpointer(b, "dbpointer", -1, "mycollection", &oid)); BSON_ASSERT(bson_append_minkey(b, "minkey", -1)); BSON_ASSERT(bson_append_maxkey(b, "maxkey", -1)); BSON_ASSERT(bson_append_symbol(b, "symbol", -1, "var a = {};", -1)); BSON_ASSERT(bson_append_decimal128(b, "decimal128", -1, &decimal128)); b2 = bson_new(); BSON_ASSERT(bson_append_int32(b2, "0", -1, 60)); BSON_ASSERT(bson_append_document(b, "document", -1, b2)); BSON_ASSERT(bson_append_array(b, "array", -1, b2)); { const uint8_t binary[] = {0, 1, 2, 3, 4}; BSON_ASSERT(bson_append_binary(b, "binary", -1, BSON_SUBTYPE_BINARY, binary, sizeof binary)); } for (i = 0; i < 1000; i++) { str = bson_as_legacy_extended_json(b, &len); bson_free(str); } bson_destroy(b); bson_destroy(b2); } static void test_bson_as_json_multi(void) { bson_t *b; char *str; size_t len; b = bson_new(); { bson_oid_t oid; bson_oid_init_from_string(&oid, "57e193d7a9cc81b4027498b5"); BSON_ASSERT(bson_append_oid(b, "_id", -1, &oid)); } BSON_ASSERT(bson_append_symbol(b, "Symbol", -1, "symbol", -1)); BSON_ASSERT(bson_append_utf8(b, "String", -1, "string", -1)); BSON_ASSERT(bson_append_int32(b, "Int32", -1, 42)); BSON_ASSERT(bson_append_int64(b, "Int64", -1, 42)); BSON_ASSERT(bson_append_double(b, "Double", -1, -1.0)); { const uint8_t binary[] = { 0xa3, 0x4c, 0x38, 0xf7, 0xc3, 0xab, 0xed, 0xc8, 0xa3, 0x78, 0x14, 0xa9, 0x92, 0xab, 0x8d, 0xb6}; BSON_ASSERT(bson_append_binary(b, "Binary", -1, BSON_SUBTYPE_UUID_DEPRECATED, binary, sizeof binary)); } { const uint8_t binary[] = {1, 2, 3, 4, 5}; BSON_ASSERT(bson_append_binary(b, "BinaryUserDefined", -1, BSON_SUBTYPE_USER, binary, sizeof binary)); } BSON_ASSERT(bson_append_code(b, "Code", -1, "function() {}")); { bson_t *scope = bson_new(); BSON_ASSERT(bson_append_code_with_scope(b, "CodeWithScope", -1, "function() {}", scope)); bson_destroy(scope); } { bson_t *document = bson_new(); BSON_ASSERT(bson_append_utf8(document, "foo", -1, "bar", -1)); BSON_ASSERT(bson_append_document(b, "Subdocument", -1, document)); bson_destroy(document); } { bson_t *array = bson_new(); BSON_ASSERT(bson_append_int32(array, "0", -1, 1)); BSON_ASSERT(bson_append_int32(array, "1", -1, 2)); BSON_ASSERT(bson_append_int32(array, "2", -1, 3)); BSON_ASSERT(bson_append_int32(array, "3", -1, 4)); BSON_ASSERT(bson_append_int32(array, "4", -1, 5)); BSON_ASSERT(bson_append_array(b, "Array", -1, array)); bson_destroy(array); } BSON_ASSERT(bson_append_timestamp(b, "Timestamp", -1, 42, 1)); BSON_ASSERT(bson_append_regex(b, "Regex", -1, "pattern", "")); BSON_ASSERT(bson_append_date_time(b, "DatetimeEpoch", -1, 0)); BSON_ASSERT(bson_append_date_time(b, "DatetimePositive", -1, (int64_t)2147483647LL)); BSON_ASSERT(bson_append_date_time(b, "DatetimeNegative", -1, (int64_t)-2147483648LL)); BSON_ASSERT(bson_append_bool(b, "True", -1, true)); BSON_ASSERT(bson_append_bool(b, "False", -1, false)); { bson_oid_t oid; bson_oid_init_from_string(&oid, "57e193d7a9cc81b4027498b1"); BSON_ASSERT(bson_append_dbpointer(b, "DBPointer", -1, "collection", &oid)); } { bson_oid_t oid; bson_t *dbref = bson_new(); bson_oid_init_from_string(&oid, "57fd71e96e32ab4225b723fb"); BSON_ASSERT(bson_append_utf8(dbref, "$ref", -1, "collection", -1)); BSON_ASSERT(bson_append_oid(dbref, "$id", -1, &oid)); BSON_ASSERT(bson_append_utf8(dbref, "$db", -1, "database", -1)); BSON_ASSERT(bson_append_document(b, "DBRef", -1, dbref)); bson_destroy(dbref); } BSON_ASSERT(bson_append_minkey(b, "Minkey", -1)); BSON_ASSERT(bson_append_maxkey(b, "Maxkey", -1)); BSON_ASSERT(bson_append_null(b, "Null", -1)); BSON_ASSERT(bson_append_undefined(b, "Undefined", -1)); { bson_decimal128_t decimal128; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; BSON_ASSERT(bson_append_decimal128(b, "Decimal128", -1, &decimal128)); } str = bson_as_legacy_extended_json(b, &len); /* Based on multi-type-deprecated.json from BSON Corpus Tests. */ ASSERT_CMPSTR(str, "{" " \"_id\" : { \"$oid\" : \"57e193d7a9cc81b4027498b5\" }," " \"Symbol\" : \"symbol\"," " \"String\" : \"string\"," " \"Int32\" : 42," " \"Int64\" : 42," " \"Double\" : -1.0," " \"Binary\" : { \"$binary\" : \"o0w498Or7cijeBSpkquNtg==\", \"$type\" : " "\"03\" }," " \"BinaryUserDefined\" : { \"$binary\" : \"AQIDBAU=\", \"$type\" : " "\"80\" }," " \"Code\" : { \"$code\" : \"function() {}\" }," " \"CodeWithScope\" : { \"$code\" : \"function() {}\", \"$scope\" : { } " "}," " \"Subdocument\" : { \"foo\" : \"bar\" }," " \"Array\" : [ 1, 2, 3, 4, 5 ]," " \"Timestamp\" : { \"$timestamp\" : { \"t\" : 42, \"i\" : 1 } }," " \"Regex\" : { \"$regex\" : \"pattern\", \"$options\" : \"\" }," " \"DatetimeEpoch\" : { \"$date\" : 0 }," " \"DatetimePositive\" : { \"$date\" : 2147483647 }," " \"DatetimeNegative\" : { \"$date\" : -2147483648 }," " \"True\" : true," " \"False\" : false," " \"DBPointer\" : { \"$ref\" : \"collection\", \"$id\" : " "\"57e193d7a9cc81b4027498b1\" }," " \"DBRef\" : { \"$ref\" : \"collection\", \"$id\" : { \"$oid\" : " "\"57fd71e96e32ab4225b723fb\" }, \"$db\" : \"database\" }," " \"Minkey\" : { \"$minKey\" : 1 }," " \"Maxkey\" : { \"$maxKey\" : 1 }," " \"Null\" : null," " \"Undefined\" : { \"$undefined\" : true }," " \"Decimal128\" : { \"$numberDecimal\" : \"11\" } }"); bson_free(str); bson_destroy(b); } static void test_bson_as_json_string(void) { size_t len; bson_t *b; char *str; b = bson_new(); BSON_ASSERT(bson_append_utf8(b, "foo", -1, "bar", -1)); str = bson_as_legacy_extended_json(b, &len); BSON_ASSERT(len == 17); BSON_ASSERT(!strcmp("{ \"foo\" : \"bar\" }", str)); bson_free(str); bson_destroy(b); } static void test_bson_as_json_int32(void) { size_t len; bson_t *b; char *str; b = bson_new(); BSON_ASSERT(bson_append_int32(b, "foo", -1, 1234)); str = bson_as_legacy_extended_json(b, &len); BSON_ASSERT(len == 16); BSON_ASSERT(!strcmp("{ \"foo\" : 1234 }", str)); bson_free(str); bson_destroy(b); } static void test_bson_as_json_int64(void) { size_t len; bson_t *b; char *str; b = bson_new(); BSON_ASSERT(bson_append_int64(b, "foo", -1, 341234123412341234ULL)); str = bson_as_legacy_extended_json(b, &len); BSON_ASSERT(len == 30); BSON_ASSERT(!strcmp("{ \"foo\" : 341234123412341234 }", str)); bson_free(str); bson_destroy(b); } static void test_bson_as_json_double(void) { size_t len; bson_t *b; char *str; char *expected; b = bson_new(); BSON_ASSERT(bson_append_double(b, "foo", -1, 123.5)); BSON_ASSERT(bson_append_double(b, "bar", -1, 3)); BSON_ASSERT(bson_append_double(b, "baz", -1, -1)); BSON_ASSERT(bson_append_double(b, "quux", -1, 0.03125)); BSON_ASSERT(bson_append_double(b, "huge", -1, 1e99)); str = bson_as_legacy_extended_json(b, &len); expected = bson_strdup_printf("{" " \"foo\" : 123.5," " \"bar\" : 3.0," " \"baz\" : -1.0," " \"quux\" : 0.03125," " \"huge\" : %.20g }", 1e99); ASSERT_CMPSTR(str, expected); bson_free(expected); bson_free(str); bson_destroy(b); } static void test_bson_as_json_double_nonfinite(void) { size_t len; bson_t *b; char *str; char *expected; const double pos_inf = INFINITY; const double neg_inf = -pos_inf; b = bson_new(); BSON_ASSERT(bson_append_double(b, "nan", -1, NAN)); BSON_ASSERT(bson_append_double(b, "pos_inf", -1, pos_inf)); BSON_ASSERT(bson_append_double(b, "neg_inf", -1, neg_inf)); str = bson_as_legacy_extended_json(b, &len); expected = bson_strdup_printf("{" " \"nan\" : %.20g," " \"pos_inf\" : %.20g," " \"neg_inf\" : %.20g }", NAN, pos_inf, neg_inf); ASSERT_CMPSTR(str, expected); bson_free(expected); bson_free(str); bson_destroy(b); } static void test_bson_as_json_decimal128(void) { size_t len; bson_t *b; char *str; bson_decimal128_t decimal128; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; b = bson_new(); BSON_ASSERT(bson_append_decimal128(b, "decimal128", -1, &decimal128)); str = bson_as_legacy_extended_json(b, &len); ASSERT_CMPSTR(str, "{ " "\"decimal128\" : { \"$numberDecimal\" : \"11\" }" " }"); bson_free(str); bson_destroy(b); } static void test_bson_as_json_code(void) { bson_t code = BSON_INITIALIZER; bson_t scope = BSON_INITIALIZER; char *str; BSON_ASSERT(bson_append_code(&code, "c", -1, "function () {}")); str = bson_as_legacy_extended_json(&code, NULL); ASSERT_CMPSTR(str, "{ \"c\" : { \"$code\" : \"function () {}\" } }"); bson_free(str); bson_reinit(&code); /* empty scope */ BSON_ASSERT(BSON_APPEND_CODE_WITH_SCOPE(&code, "c", "function () {}", &scope)); str = bson_as_legacy_extended_json(&code, NULL); ASSERT_CMPSTR(str, "{ \"c\" : { \"$code\" : \"function () {}\", \"$scope\" : { } } }"); bson_free(str); bson_reinit(&code); BSON_APPEND_INT32(&scope, "x", 1); BSON_ASSERT(BSON_APPEND_CODE_WITH_SCOPE(&code, "c", "function () {}", &scope)); str = bson_as_legacy_extended_json(&code, NULL); ASSERT_CMPSTR(str, "{ \"c\" : { \"$code\" : \"function () {}\", \"$scope\" " ": { \"x\" : 1 } } }"); bson_free(str); bson_reinit(&code); /* test that embedded quotes are backslash-escaped */ BSON_ASSERT(BSON_APPEND_CODE(&code, "c", "return \"a\"")); str = bson_as_legacy_extended_json(&code, NULL); /* hard to read, this is { "c" : { "$code" : "return \"a\"" } } */ ASSERT_CMPSTR(str, "{ \"c\" : { \"$code\" : \"return \\\"a\\\"\" } }"); bson_free(str); bson_destroy(&code); bson_destroy(&scope); } static void test_bson_as_json_date_time(void) { bson_t *b; char *str; size_t len; b = bson_new(); BSON_ASSERT(bson_append_date_time(b, "epoch", -1, 0)); BSON_ASSERT(bson_append_date_time(b, "negative", -1, -123456000)); BSON_ASSERT(bson_append_date_time(b, "positive", -1, 123456000)); str = bson_as_legacy_extended_json(b, &len); ASSERT_CMPSTR(str, "{" " \"epoch\" : { \"$date\" : 0 }," " \"negative\" : { \"$date\" : -123456000 }," " \"positive\" : { \"$date\" : 123456000 } }"); bson_free(str); bson_destroy(b); } static void test_bson_as_json_regex(void) { bson_t *b; char *str; size_t len; b = bson_new(); BSON_ASSERT(bson_append_regex(b, "regex", -1, "^abcd", "xi")); BSON_ASSERT(bson_append_regex(b, "escaping", -1, "^\"", "")); BSON_ASSERT(bson_append_regex(b, "ordered", -1, "^abcd", "ilmsux")); BSON_ASSERT(bson_append_regex(b, "unordered", -1, "^abcd", "xusmli")); BSON_ASSERT(bson_append_regex(b, "duplicate", -1, "^abcd", "mmiii")); BSON_ASSERT(bson_append_regex(b, "unsupported", -1, "^abcd", "jkmlvz")); str = bson_as_legacy_extended_json(b, &len); ASSERT_CMPSTR(str, "{" " \"regex\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ix\" }," " \"escaping\" : { \"$regex\" : \"^\\\"\", \"$options\" " ": \"\" }," " \"ordered\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ilmsux\" }," " \"unordered\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"ilmsux\" }," " \"duplicate\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"im\" }," " \"unsupported\" : { \"$regex\" : \"^abcd\", \"$options\" " ": \"lm\" } }"); bson_free(str); bson_destroy(b); } static void test_bson_as_json_symbol(void) { bson_t *b; char *str; size_t len; b = bson_new(); BSON_ASSERT(bson_append_symbol(b, "symbol", -1, "foo", -1)); BSON_ASSERT(bson_append_symbol(b, "escaping", -1, "\"bar\"", -1)); str = bson_as_legacy_extended_json(b, &len); ASSERT_CMPSTR(str, "{" " \"symbol\" : \"foo\"," " \"escaping\" : \"\\\"bar\\\"\" }"); bson_free(str); bson_destroy(b); } static void test_bson_as_json_utf8(void) { /* euro currency symbol */ #define EU "\xe2\x82\xac" #define FIVE_EUROS EU EU EU EU EU size_t len; bson_t *b; char *str; b = bson_new(); BSON_ASSERT(bson_append_utf8(b, FIVE_EUROS, -1, FIVE_EUROS, -1)); str = bson_as_legacy_extended_json(b, &len); BSON_ASSERT(!strcmp(str, "{ \"" FIVE_EUROS "\" : \"" FIVE_EUROS "\" }")); bson_free(str); bson_destroy(b); } static void test_bson_as_json_dbpointer(void) { bson_oid_t oid; bson_t *b; char *str; size_t len; bson_oid_init_from_string(&oid, "12341234123412abcdababcd"); b = bson_new(); BSON_ASSERT(bson_append_dbpointer(b, "dbpointer", -1, "collection", &oid)); BSON_ASSERT(bson_append_dbpointer(b, "escaping", -1, "\"coll\"", &oid)); str = bson_as_legacy_extended_json(b, &len); ASSERT_CMPSTR(str, "{" " \"dbpointer\" : { \"$ref\" : \"collection\", \"$id\" " ": \"12341234123412abcdababcd\" }," " \"escaping\" : { \"$ref\" : \"\\\"coll\\\"\", \"$id\" " ": \"12341234123412abcdababcd\" } }"); bson_free(str); bson_destroy(b); } static void test_bson_as_canonical_extended_json_dbpointer(void) { bson_oid_t oid; bson_t *b; size_t len; char *str; bson_oid_init_from_string(&oid, "12341234123412abcdababcd"); b = bson_new(); BSON_ASSERT(BSON_APPEND_DBPOINTER(b, "p", "coll", &oid)); str = bson_as_canonical_extended_json(b, &len); ASSERT_CMPJSON(str, "{ \"p\" : { \"$dbPointer\" : { \"$ref\" : " "\"coll\", \"$id\" : { \"$oid\" : " "\"12341234123412abcdababcd\" } } } }"); bson_destroy(b); } static void test_bson_as_json_stack_overflow(void) { uint8_t *buf; bson_t b; size_t buflen = 1024 * 1024 * 17; char *str; int fd; ssize_t r; buf = bson_malloc0(buflen); fd = bson_open(BSON_BINARY_DIR "/stackoverflow.bson", O_RDONLY); BSON_ASSERT(-1 != fd); r = bson_read(fd, buf, buflen); BSON_ASSERT(r == 16777220); r = bson_init_static(&b, buf, 16777220); BSON_ASSERT(r); str = bson_as_legacy_extended_json(&b, NULL); BSON_ASSERT(str); r = !!strstr(str, "..."); BSON_ASSERT(r); bson_free(str); bson_destroy(&b); bson_free(buf); } static void test_bson_corrupt(void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0(buflen); fd = bson_open(BSON_BINARY_DIR "/test55.bson", O_RDONLY); BSON_ASSERT(-1 != fd); r = bson_read(fd, buf, buflen); BSON_ASSERT(r == 24); r = bson_init_static(&b, buf, (uint32_t)r); BSON_ASSERT(r); str = bson_as_legacy_extended_json(&b, NULL); BSON_ASSERT(!str); bson_destroy(&b); bson_free(buf); } static void test_bson_corrupt_utf8(void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0(buflen); fd = bson_open(BSON_BINARY_DIR "/test56.bson", O_RDONLY); BSON_ASSERT(-1 != fd); r = bson_read(fd, buf, buflen); BSON_ASSERT(r == 42); r = bson_init_static(&b, buf, (uint32_t)r); BSON_ASSERT(r); str = bson_as_legacy_extended_json(&b, NULL); BSON_ASSERT(!str); bson_destroy(&b); bson_free(buf); } static void test_bson_corrupt_binary(void) { uint8_t *buf; bson_t b; size_t buflen = 1024; char *str; int fd; ssize_t r; buf = bson_malloc0(buflen); fd = bson_open(BSON_BINARY_DIR "/test57.bson", O_RDONLY); BSON_ASSERT(-1 != fd); r = bson_read(fd, buf, buflen); BSON_ASSERT(r == 26); r = bson_init_static(&b, buf, (uint32_t)r); BSON_ASSERT(r); str = bson_as_legacy_extended_json(&b, NULL); BSON_ASSERT(!str); bson_destroy(&b); bson_free(buf); } #if !defined(BSON_HAVE_RAND_R) && !defined(_WIN32) static int rand_r(unsigned int *seed) { srand(*seed); return rand(); } #endif #ifdef _WIN32 #define RAND_R rand_s #else #define RAND_R rand_r #endif static char * rand_str(size_t maxlen, unsigned int *seed /* IN / OUT */, char *buf /* IN / OUT */) { size_t len = RAND_R(seed) % (maxlen - 1); size_t i; for (i = 0; i < len; i++) { buf[i] = (char)('a' + i % 26); } buf[len] = '\0'; return buf; } /* test with random buffer sizes to ensure we parse whole keys and values when * reads pause and resume in the middle of tokens */ static void test_bson_json_read_buffering(void) { bson_t **bsons; mcommon_string_append_t json; bson_error_t error; bson_t bson_out = BSON_INITIALIZER; int i; unsigned int seed = 42; int n_docs, docs_idx; int n_elems, elem_idx; char key[25]; char val[25]; bson_json_reader_t *reader; int r; mcommon_string_new_as_append(&json); /* parse between 1 and 10 JSON objects */ for (n_docs = 1; n_docs < 10; n_docs++) { /* do 50 trials */ for (i = 0; i < 50; i++) { bsons = bson_malloc(n_docs * sizeof(bson_t *)); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { /* a BSON document with up to 10 strings and numbers */ bsons[docs_idx] = bson_new(); n_elems = RAND_R(&seed) % 5; for (elem_idx = 0; elem_idx < n_elems; elem_idx++) { bson_append_utf8( bsons[docs_idx], rand_str(sizeof key, &seed, key), -1, rand_str(sizeof val, &seed, val), -1); bson_append_int32(bsons[docs_idx], rand_str(sizeof key, &seed, key), -1, RAND_R(&seed) % INT32_MAX); } /* append the BSON document's JSON representation to "json" */ BSON_ASSERT( mcommon_json_append_bson_document(&json, bsons[docs_idx], BSON_JSON_MODE_LEGACY, BSON_MAX_RECURSION)); } reader = bson_json_data_reader_new(true /* "allow_multiple" is unused */, (size_t)RAND_R(&seed) % 100 /* bufsize*/); bson_json_data_reader_ingest( reader, (uint8_t *)mcommon_str_from_append(&json), mcommon_strlen_from_append(&json)); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { bson_reinit(&bson_out); r = bson_json_reader_read(reader, &bson_out, &error); if (r == -1) { fprintf(stderr, "%s\n", error.message); abort(); } BSON_ASSERT(r); bson_eq_bson(&bson_out, bsons[docs_idx]); } /* finished parsing */ ASSERT_CMPINT(0, ==, bson_json_reader_read(reader, &bson_out, &error)); bson_json_reader_destroy(reader); mcommon_string_from_append_clear(&json); for (docs_idx = 0; docs_idx < n_docs; docs_idx++) { bson_destroy(bsons[docs_idx]); } bson_free(bsons); } } mcommon_string_from_append_destroy(&json); bson_destroy(&bson_out); } static void _test_bson_json_read_compare(const char *json, int size, ...) { bson_error_t error = {0}; bson_json_reader_t *reader; va_list ap; int r; bson_t *compare; bson_t bson = BSON_INITIALIZER; reader = bson_json_data_reader_new((size == 1), size); bson_json_data_reader_ingest(reader, (uint8_t *)json, strlen(json)); va_start(ap, size); while ((r = bson_json_reader_read(reader, &bson, &error))) { if (r == -1) { fprintf(stderr, "%s\n", error.message); abort(); } compare = va_arg(ap, bson_t *); BSON_ASSERT(compare); bson_eq_bson(&bson, compare); bson_destroy(compare); bson_reinit(&bson); } va_end(ap); bson_json_reader_destroy(reader); bson_destroy(&bson); } static void test_bson_json_read(void) { char *json = bson_strdup_printf("%s { \"after\": \"b\" } { \"twice\" : true }", json_with_all_types()); bson_oid_t oid; bson_t *first, *second, *third; bson_oid_init_from_string(&oid, "000000000000000000000000"); first = bson_copy(bson_with_all_types()); second = BCON_NEW("after", "b"); third = BCON_NEW("twice", BCON_BOOL(true)); _test_bson_json_read_compare(json, 5, first, second, third, NULL); bson_free(json); } static void test_bson_json_read_invalid_base64(void) { const char *bad_json = "{ \"x\": { \"$binary\": {\"subType\": \"00\", " "\"base64\": \"\x30\x30\x30\x30\xcd\x8d\x79\" }}}"; bson_error_t error = {0}; BSON_ASSERT(!bson_new_from_json((uint8_t *)bad_json, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"\x30\x30\x30\x30\xcd\x8d\x79\", looking for " "base64-encoded binary"); } static void test_bson_json_read_raw_utf8(void) { bson_t *bson; bson_iter_t iter; bson = bson_new_from_json((const uint8_t *)"{\"" EU "\": \"" EU "\"}", -1, NULL); ASSERT(bson); ASSERT(bson_iter_init_find(&iter, bson, EU)); ASSERT_CMPSTR(bson_iter_key(&iter), EU); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), EU); ASSERT(!bson_iter_next(&iter)); bson_destroy(bson); } static void test_bson_json_read_corrupt_utf8(void) { const char *bad_key = "{ \"\x80\" : \"a\"}"; const char *bad_value = "{ \"a\" : \"\x80\"}"; bson_error_t error = {0}; BSON_ASSERT(!bson_new_from_json((uint8_t *)bad_key, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "invalid bytes in UTF8 string"); memset(&error, 0, sizeof error); BSON_ASSERT(!bson_new_from_json((uint8_t *)bad_value, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "invalid bytes in UTF8 string"); } /* exercise early exit from _bson_as_json_visit_document/array, CDRIVER-2541 */ static void test_bson_json_read_corrupt_document(void) { /* like {a: {a: "\x80"}}, the value is invalid UTF-8 */ const char bad_doc[] = "\x16\x00\x00\x00" /* length */ "\x03\x61\x00" /* subdoc field with key "a" */ "\x0e\x00\x00\x00" /* length of subdoc in bytes */ "\x02\x61\x00\x02\x00\x00\x00\x80\x00" /* a: "\x80" */ "\x00"; /* terminator */ /* like {a: ["\x80"]}, the inner value is invalid UTF-8 */ const char bad_array[] = "\x16\x00\x00\x00" /* length */ "\x04\x61\x00" /* array field with key "a" */ "\x0e\x00\x00\x00" /* length of array in bytes */ "\x02\x30\x00" /* key "0" */ "\x02\x00\x00\x00\x80\x00" /* string "\x80" */ "\x00"; /* terminator */ bson_t bson; BSON_ASSERT(bson_init_static(&bson, (uint8_t *)bad_doc, sizeof(bad_doc))); BSON_ASSERT(!bson_as_legacy_extended_json(&bson, NULL)); BSON_ASSERT(bson_init_static(&bson, (uint8_t *)bad_array, sizeof(bad_array))); BSON_ASSERT(!bson_as_legacy_extended_json(&bson, NULL)); } static void test_bson_json_read_decimal128(void) { const char *json = "{ \"decimal\" : { \"$numberDecimal\" : \"123.5\" }}"; bson_decimal128_t dec; bson_t *doc; bson_decimal128_from_string("123.5", &dec); doc = BCON_NEW("decimal", BCON_DECIMAL128(&dec)); _test_bson_json_read_compare(json, 5, doc, NULL); } static void test_bson_json_read_dbpointer(void) { bson_t b; bson_error_t error; bool r; /* must have both $ref and $id, $id must be ObjectId */ const char *invalid[] = {"{\"p\": {\"$dbPointer\": {\"$ref\": \"db.collection\"}}", "$dbPointer requires both $id and $ref", "{\"p\": {\"$dbPointer\": {\"$ref\": \"db.collection\", \"$id\": 1}}", "$dbPointer.$id must be like {\"$oid\": ...\"}", "{\"p\": {\"$dbPointer\": {\"$id\": {" "\"$oid\": \"57e193d7a9cc81b4027498b1\"}}}}", "$dbPointer requires both $id and $ref", "{\"p\": {\"$dbPointer\": {}}}", "Empty $dbPointer", NULL}; const char **p; for (p = invalid; *p; p += 2) { r = bson_init_from_json(&b, *p, -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, *(p + 1)); } } static void test_bson_json_read_legacy_regex(void) { bson_t b; bson_error_t error; bool r; const char *pattern; const char *flags; r = bson_init_from_json(&b, "{\"a\": {\"$regex\": \"abc\", \"$options\": \"ix\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "a", BCONE_REGEX(pattern, flags)); ASSERT_CMPSTR(pattern, "abc"); ASSERT_CMPSTR(flags, "ix"); bson_destroy(&b); r = bson_init_from_json(&b, "{\"a\": {\"$regex\": \"abc\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "a", BCONE_REGEX(pattern, flags)); ASSERT_CMPSTR(pattern, "abc"); ASSERT_CMPSTR(flags, ""); bson_destroy(&b); r = bson_init_from_json(&b, "{\"a\": {\"$options\": \"ix\"}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"$regex\" after \"$options\""); } static void test_bson_json_read_regex_options_order(void) { bson_t b; bson_error_t error; bool r; const char *pattern; const char *flags; r = bson_init_from_json(&b, "{\"a\": {\"$regex\": \"\", \"$options\": \"ism\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "a", BCONE_REGEX(pattern, flags)); ASSERT_CMPSTR(flags, "ims"); bson_destroy(&b); r = bson_init_from_json(&b, "{\"a\": {\"$regex\": \"\", \"$options\": \"misl\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "a", BCONE_REGEX(pattern, flags)); ASSERT_CMPSTR(flags, "ilms"); bson_destroy(&b); } static void test_bson_json_read_binary(void) { bson_error_t error; bson_t b; bool r; bson_subtype_t subtype; uint32_t len; const uint8_t *binary; r = bson_init_from_json(&b, "{\"b\": {\"$binary\": {\"base64\": \"Zm9v\", \"subType\": \"05\"}}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "b", BCONE_BIN(subtype, binary, len)); ASSERT_CMPINT((int)subtype, ==, 5); ASSERT_CMPUINT32(len, ==, (uint32_t)3); ASSERT_CMPSTR((const char *)binary, "foo"); bson_destroy(&b); r = bson_init_from_json(&b, "{\"b\": {\"$binary\": {\"subType\": \"05\", \"base64\": \"Zm9v\"}}}", -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "b", BCONE_BIN(subtype, binary, len)); ASSERT_CMPINT((int)subtype, ==, 5); ASSERT_CMPUINT32(len, ==, (uint32_t)3); ASSERT_CMPSTR((const char *)binary, "foo"); bson_destroy(&b); /* no base64 */ r = bson_init_from_json(&b, "{\"b\": {\"$binary\": {\"subType\": \"5\"}}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"base64\" after \"subType\""); memset(&error, 0, sizeof error); /* no subType */ r = bson_init_from_json(&b, "{\"b\": {\"$binary\": {\"base64\": \"Zm9v\"}}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Missing \"subType\" after \"base64\""); } static void test_bson_json_read_legacy_binary(void) { const char *jsons[] = {"{\"x\": {\"$binary\": \"Zm9v\", \"$type\": \"05\"}}", "{\"x\": {\"$type\": \"05\", \"$binary\": \"Zm9v\"}}", NULL}; const char **json; bson_error_t error; bson_t b; bool r; bson_subtype_t subtype; uint32_t len; const uint8_t *binary; for (json = jsons; *json; json++) { r = bson_init_from_json(&b, *json, -1, &error); ASSERT_OR_PRINT(r, error); BCON_EXTRACT(&b, "x", BCONE_BIN(subtype, binary, len)); ASSERT_CMPINT((int)subtype, ==, 5); ASSERT_CMPUINT32(len, ==, (uint32_t)3); ASSERT_CMPSTR((const char *)binary, "foo"); bson_destroy(&b); } } static void test_json_reader_new_from_file(void) { const char *path = BSON_JSON_DIR "/test.json"; const char *bar; const bson_oid_t *oid; bson_oid_t oid_expected; int32_t one; bson_t bson = BSON_INITIALIZER; bson_json_reader_t *reader; bson_error_t error; reader = bson_json_reader_new_from_file(path, &error); BSON_ASSERT(reader); /* read two documents */ ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "foo", BCONE_UTF8(bar), "a", BCONE_INT32(one)); ASSERT_CMPSTR("bar", bar); ASSERT_CMPINT(1, ==, one); bson_reinit(&bson); ASSERT_CMPINT(1, ==, bson_json_reader_read(reader, &bson, &error)); BCON_EXTRACT(&bson, "_id", BCONE_OID(oid)); bson_oid_init_from_string(&oid_expected, "aabbccddeeff001122334455"); BSON_ASSERT(bson_oid_equal(&oid_expected, oid)); bson_destroy(&bson); bson_json_reader_destroy(reader); } static void test_json_reader_new_from_bad_path(void) { const char *bad_path = BSON_JSON_DIR "/does-not-exist"; bson_json_reader_t *reader; bson_error_t error; reader = bson_json_reader_new_from_file(bad_path, &error); BSON_ASSERT(!reader); ASSERT_CMPINT(BSON_ERROR_READER, ==, error.domain); ASSERT_CMPINT(BSON_ERROR_READER_BADFD, ==, error.code); } static void test_bson_json_error(const char *json, int domain, bson_json_error_code_t code) { bson_error_t error; bson_t *bson; bson = bson_new_from_json((const uint8_t *)json, strlen(json), &error); BSON_ASSERT(!bson); BSON_ASSERT(mlib_cmp(error.domain, ==, domain)); BSON_ASSERT(error.code == code); } static void test_bson_json_read_empty(void) { bson_error_t error; bson_t *bson_ptr; bson_t bson; bson_ptr = bson_new_from_json((uint8_t *)"", 0, &error); BSON_ASSERT(!bson_ptr); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); memset(&error, 0, sizeof error); bson_init_from_json(&bson, "", 0, &error); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Empty JSON string"); } static void test_bson_json_read_missing_complex(void) { const char *json = "{ \n\ \"foo\" : { \n\ \"$options\" : \"ism\"\n\ }\n\ }"; test_bson_json_error(json, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM); } static void test_bson_json_read_invalid_binary(void) { bson_error_t error; const char *json = "{ " " \"bin\" : { \"$binary\" : \"invalid\", \"$type\" : \"80\" } }"; bson_t b; bool r; r = bson_init_from_json(&b, json, -1, &error); BSON_ASSERT(!r); } static void test_bson_json_read_invalid_json(void) { const char *json = "{ \n\ \"foo\" : { \n\ }"; bson_t *b; test_bson_json_error(json, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS); b = bson_new_from_json((uint8_t *)"1", 1, NULL); BSON_ASSERT(!b); b = bson_new_from_json((uint8_t *)"*", 1, NULL); BSON_ASSERT(!b); b = bson_new_from_json((uint8_t *)"", 0, NULL); BSON_ASSERT(!b); b = bson_new_from_json((uint8_t *)"asdfasdf", -1, NULL); BSON_ASSERT(!b); b = bson_new_from_json((uint8_t *)"{\"a\":*}", -1, NULL); BSON_ASSERT(!b); } static ssize_t test_bson_json_read_bad_cb_helper(void *_ctx, uint8_t *buf, size_t len) { BSON_UNUSED(_ctx); BSON_UNUSED(buf); BSON_UNUSED(len); return -1; } static void test_bson_json_read_bad_cb(void) { bson_error_t error; bson_json_reader_t *reader; int r; bson_t bson = BSON_INITIALIZER; reader = bson_json_reader_new(NULL, &test_bson_json_read_bad_cb_helper, NULL, false, 0); r = bson_json_reader_read(reader, &bson, &error); BSON_ASSERT(r == -1); BSON_ASSERT(error.domain == BSON_ERROR_JSON); BSON_ASSERT(error.code == BSON_JSON_ERROR_READ_CB_FAILURE); bson_json_reader_destroy(reader); bson_destroy(&bson); } static ssize_t test_bson_json_read_invalid_helper(void *ctx, uint8_t *buf, size_t len) { BSON_UNUSED(ctx); BSON_ASSERT(len); *buf = 0x80; /* no UTF-8 sequence can start with 0x80 */ return 1; } static void test_bson_json_read_invalid(void) { bson_error_t error; bson_json_reader_t *reader; int r; bson_t bson = BSON_INITIALIZER; reader = bson_json_reader_new(NULL, test_bson_json_read_invalid_helper, NULL, false, 0); r = bson_json_reader_read(reader, &bson, &error); BSON_ASSERT(r == -1); BSON_ASSERT(error.domain == BSON_ERROR_JSON); BSON_ASSERT(error.code == BSON_JSON_ERROR_READ_CORRUPT_JS); bson_json_reader_destroy(reader); bson_destroy(&bson); } static void test_bson_json_number_long(void) { bson_error_t error; bson_iter_t iter; bson_t b; bool r; r = bson_init_from_json(&b, "{\"key\": {\"$numberLong\": \"4611686018427387904\"}}", -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find(&iter, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); BSON_ASSERT(bson_iter_int64(&iter) == 4611686018427387904LL); bson_destroy(&b); BSON_ASSERT(!bson_init_from_json(&b, "{\"key\": {\"$numberLong\": \"461168601abcd\"}}", -1, &error)); BSON_ASSERT(!bson_init_from_json(&b, "{\"key\": {\"$numberLong\": \"461168601abcd\"}}", -1, &error)); /* INT64_MAX */ r = bson_init_from_json(&b, "{\"x\": {\"$numberLong\": \"9223372036854775807\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)INT64_MAX); bson_destroy(&b); /* INT64_MIN */ r = bson_init_from_json(&b, "{\"x\": {\"$numberLong\": \"-9223372036854775808\"}}", -1, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)INT64_MIN); bson_destroy(&b); /* INT64_MAX + 1 */ r = bson_init_from_json(&b, "{\"x\": {\"$numberLong\": \"9223372036854775808\"}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"9223372036854775808\" is out of range"); memset(&error, 0, sizeof error); /* INT64_MIN - 1 */ r = bson_init_from_json(&b, "{\"x\": {\"$numberLong\": \"-9223372036854775809\"}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-9223372036854775809\" is out of range"); memset(&error, 0, sizeof error); r = bson_init_from_json(&b, "{\"x\": {\"$numberLong\": \"10000000000000000000\"}}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"10000000000000000000\" is out of range"); memset(&error, 0, sizeof error); /* INT64_MIN - 2 */ r = bson_init_from_json(&b, "{\"x\": -10000000000000000000}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_number_long_zero(void) { bson_error_t error; bson_iter_t iter; const char *json = "{ \"key\": { \"$numberLong\": \"0\" }}"; bson_t b; bool r; r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find(&iter, "key")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); BSON_ASSERT(bson_iter_int64(&iter) == 0); bson_destroy(&b); } static void test_bson_json_code(void) { const char *json_code = "{\"a\": {\"$code\": \"b\"}}"; bson_t *bson_code = BCON_NEW("a", BCON_CODE("b")); const char *json_code_w_nulls = "{\"a\": {\"$code\": \"b\\u0000c\\u0000\"}}"; bson_t *bson_code_w_nulls = BCON_NEW("a", BCON_CODE("b\0c\0")); const char *json_code_w_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}}"; bson_t *scope1 = BCON_NEW("var", BCON_INT32(1)); bson_t *bson_code_w_scope = BCON_NEW("a", BCON_CODEWSCOPE("b", scope1)); const char *json_code_w_scope_special = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var2\": {\"$numberLong\": \"2\"}}}}"; bson_t *scope2 = BCON_NEW("var2", BCON_INT64(2)); bson_t *bson_code_w_scope_special = BCON_NEW("a", BCON_CODEWSCOPE("b", scope2)); const char *json_2_codes_w_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}," " \"c\": {\"$code\": \"d\", " " \"$scope\": {\"var2\": {\"$numberLong\": \"2\"}}}}"; bson_t *bson_2_codes_w_scope = BCON_NEW("a", BCON_CODEWSCOPE("b", scope1), "c", BCON_CODEWSCOPE("d", scope2)); const char *json_code_then_regular = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": 1}}," " \"c\": {\"key1\": \"value\", " " \"subdoc\": {\"key2\": \"value2\"}}}"; bson_t *bson_code_then_regular = BCON_NEW("a", BCON_CODEWSCOPE("b", scope1), "c", "{", "key1", BCON_UTF8("value"), "subdoc", "{", "key2", BCON_UTF8("value2"), "}", "}"); const char *json_code_w_scope_reverse = "{\"a\": {\"$scope\": {\"var\": 1}, " " \"$code\": \"b\"}}"; bson_t *bson_code_w_scope_reverse = BCON_NEW("a", BCON_CODEWSCOPE("b", scope1)); const char *json_code_w_scope_nest = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"var\": {}}}}"; bson_t *scope3 = BCON_NEW("var", "{", "}"); bson_t *bson_code_w_scope_nest = BCON_NEW("a", BCON_CODEWSCOPE("b", scope3)); const char *json_code_w_scope_nest_deep = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"arr\": [1, 2], \"d\": {}," " \"n\": {\"$numberLong\": \"1\"}," " \"d2\": {\"x\": 1, \"d3\": {\"z\": 3}}}}}"; bson_t *scope_deep = BCON_NEW("arr", "[", BCON_INT32(1), BCON_INT32(2), "]", "d", "{", "}", "n", BCON_INT64(1), "d2", "{", "x", BCON_INT32(1), "d3", "{", "z", BCON_INT32(3), "}", "}"); bson_t *bson_code_w_scope_nest_deep = BCON_NEW("a", BCON_CODEWSCOPE("b", scope_deep)); const char *json_code_w_empty_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {}}}"; bson_t *empty = bson_new(); bson_t *bson_code_w_empty_scope = BCON_NEW("a", BCON_CODEWSCOPE("b", empty)); const char *json_code_in_scope = "{\"a\": {\"$code\": \"b\", " " \"$scope\": {\"x\": {\"$code\": \"c\"}}}}"; bson_t *code_in_scope = BCON_NEW("x", "{", "$code", BCON_UTF8("c"), "}"); bson_t *bson_code_in_scope = BCON_NEW("a", BCON_CODEWSCOPE("b", code_in_scope)); typedef struct { const char *json; bson_t *expected_bson; } code_test_t; code_test_t tests[] = { {json_code, bson_code}, {json_code_w_nulls, bson_code_w_nulls}, {json_code_w_scope, bson_code_w_scope}, {json_code_w_scope_special, bson_code_w_scope_special}, {json_code_then_regular, bson_code_then_regular}, {json_2_codes_w_scope, bson_2_codes_w_scope}, {json_code_w_scope_reverse, bson_code_w_scope_reverse}, {json_code_w_scope_nest, bson_code_w_scope_nest}, {json_code_w_scope_nest_deep, bson_code_w_scope_nest_deep}, {json_code_w_empty_scope, bson_code_w_empty_scope}, {json_code_in_scope, bson_code_in_scope}, }; int n_tests = sizeof(tests) / sizeof(code_test_t); int i; bson_t b; bool r; bson_error_t error; for (i = 0; i < n_tests; i++) { r = bson_init_from_json(&b, tests[i].json, -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, tests[i].expected_bson); bson_destroy(&b); } for (i = 0; i < n_tests; i++) { bson_destroy(tests[i].expected_bson); } bson_destroy(scope1); bson_destroy(scope2); bson_destroy(scope3); bson_destroy(scope_deep); bson_destroy(code_in_scope); bson_destroy(empty); } static void test_bson_json_code_errors(void) { bson_error_t error; bson_t b; bool r; size_t i; typedef struct { const char *json; const char *error_message; } code_error_test_t; code_error_test_t tests[] = { {"{\"a\": {\"$scope\": {}}", "Missing $code after $scope"}, {"{\"a\": {\"$scope\": {}, \"$x\": 1}", "Invalid key \"$x\""}, {"{\"a\": {\"$scope\": {\"a\": 1}}", "Missing $code after $scope"}, {"{\"a\": {\"$code\": \"\", \"$scope\": \"a\"}}", "Invalid read of \"a\""}, {"{\"a\": {\"$code\": \"\", \"$scope\": 1}}", "Unexpected integer 1 in state \"IN_BSON_TYPE_SCOPE_STARTMAP\""}, {"{\"a\": {\"$code\": \"\", \"$scope\": []}}", "Invalid read of \"[\""}, {"{\"a\": {\"$code\": \"\", \"x\": 1}}", "Invalid key \"x\". Looking for values for type \"code\""}, {"{\"a\": {\"$code\": \"\", \"$x\": 1}}", "Invalid key \"$x\""}, {"{\"a\": {\"$code\": \"\", \"$numberLong\": \"1\"}}", "Invalid key \"$numberLong\""}, }; for (i = 0; i < sizeof(tests) / (sizeof(code_error_test_t)); i++) { r = bson_init_from_json(&b, tests[i].json, -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, tests[i].error_message); } } static const bson_oid_t * oid_zero(void) { static bool initialized = false; static bson_oid_t oid; if (!initialized) { bson_oid_init_from_string(&oid, "000000000000000000000000"); initialized = true; } return &oid; } static void test_bson_json_dbref(void) { bson_error_t error; const char *json_with_objectid_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": {\"$oid\": \"000000000000000000000000\"}}}"; bson_t *bson_with_objectid_id = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", BCON_OID(oid_zero()), "}"); const char *json_with_int_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1}}"; bson_t *bson_with_int_id = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", BCON_INT32(1), "}"); const char *json_with_subdoc_id = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": {\"a\": 1}}}"; bson_t *bson_with_subdoc_id = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", "{", "a", BCON_INT32(1), "}", "}"); const char *json_with_metadata = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"meta\": true}}"; bson_t *bson_with_metadata = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", BCON_INT32(1), "meta", BCON_BOOL(true), "}"); const char *json_with_db = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"$db\": \"database\"}}"; bson_t *bson_with_db = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", BCON_INT32(1), "$db", BCON_UTF8("database"), "}"); /* Note: the following examples are not valid DBRefs but are intended to test * that the Extended JSON parser leaves such documents as-is. */ const char *json_with_missing_ref = "{\"key\": {\"$id\": 1}}"; bson_t *bson_with_missing_ref = BCON_NEW("key", "{", "$id", BCON_INT32(1), "}"); const char *json_with_missing_id = "{\"key\": {\"$ref\": \"collection\"}}"; bson_t *bson_with_missing_id = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "}"); const char *json_with_int_ref = "{\"key\": {\"$ref\": 1, \"$id\": 1}}"; bson_t *bson_with_int_ref = BCON_NEW("key", "{", "$ref", BCON_INT32(1), "$id", BCON_INT32(1), "}"); const char *json_with_int_db = "{ \"key\": {" "\"$ref\": \"collection\"," "\"$id\": 1," "\"$db\": 1}}"; bson_t *bson_with_int_db = BCON_NEW("key", "{", "$ref", BCON_UTF8("collection"), "$id", BCON_INT32(1), "$db", BCON_INT32(1), "}"); bson_t b; bool r; typedef struct { const char *json; bson_t *expected_bson; } dbref_test_t; dbref_test_t tests[] = { {json_with_objectid_id, bson_with_objectid_id}, {json_with_int_id, bson_with_int_id}, {json_with_subdoc_id, bson_with_subdoc_id}, {json_with_metadata, bson_with_metadata}, {json_with_db, bson_with_db}, {json_with_missing_ref, bson_with_missing_ref}, {json_with_missing_id, bson_with_missing_id}, {json_with_int_ref, bson_with_int_ref}, {json_with_int_db, bson_with_int_db}, }; int n_tests = sizeof(tests) / sizeof(dbref_test_t); int i; for (i = 0; i < n_tests; i++) { r = bson_init_from_json(&b, tests[i].json, -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, tests[i].expected_bson); bson_destroy(&b); } for (i = 0; i < n_tests; i++) { bson_destroy(tests[i].expected_bson); } } static void test_bson_json_uescape(void) { bson_error_t error; bson_t b; bool r; const char *euro = "{ \"euro\": \"\\u20AC\"}"; bson_t *bson_euro = BCON_NEW("euro", BCON_UTF8("\xE2\x82\xAC")); const char *crlf = "{ \"crlf\": \"\\r\\n\"}"; bson_t *bson_crlf = BCON_NEW("crlf", BCON_UTF8("\r\n")); const char *quote = "{ \"quote\": \"\\\"\"}"; bson_t *bson_quote = BCON_NEW("quote", BCON_UTF8("\"")); const char *backslash = "{ \"backslash\": \"\\\\\"}"; bson_t *bson_backslash = BCON_NEW("backslash", BCON_UTF8("\\")); const char *empty = "{ \"\": \"\"}"; bson_t *bson_empty = BCON_NEW("", BCON_UTF8("")); const char *escapes = "{ \"escapes\": \"\\f\\b\\t\"}"; bson_t *bson_escapes = BCON_NEW("escapes", BCON_UTF8("\f\b\t")); const char *nil_byte = "{ \"nil\": \"\\u0000\"}"; bson_t *bson_nil_byte = bson_new(); /* we'll append "\0" to it, below */ typedef struct { const char *json; bson_t *expected_bson; } uencode_test_t; uencode_test_t tests[] = { {euro, bson_euro}, {crlf, bson_crlf}, {quote, bson_quote}, {backslash, bson_backslash}, {empty, bson_empty}, {escapes, bson_escapes}, {nil_byte, bson_nil_byte}, }; int n_tests = sizeof(tests) / sizeof(uencode_test_t); int i; bson_append_utf8(bson_nil_byte, "nil", -1, "\0", 1); for (i = 0; i < n_tests; i++) { r = bson_init_from_json(&b, tests[i].json, -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, tests[i].expected_bson); bson_destroy(&b); } for (i = 0; i < n_tests; i++) { bson_destroy(tests[i].expected_bson); } } static void test_bson_json_uescape_key(void) { bson_error_t error; bson_t b; bool r; bson_t *bson_euro = BCON_NEW("\xE2\x82\xAC", BCON_UTF8("euro")); r = bson_init_from_json(&b, "{ \"\\u20AC\": \"euro\"}", -1, &error); BSON_ASSERT(r); bson_eq_bson(&b, bson_euro); bson_destroy(&b); bson_destroy(bson_euro); } static void test_bson_json_uescape_bad(void) { bson_error_t error; bson_t b; bool r; r = bson_init_from_json(&b, "{ \"bad\": \"\\u1\"}", -1, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "UESCAPE_TOOSHORT"); } static void test_bson_json_int32(void) { bson_t b; bson_iter_t iter; bson_error_t error; /* INT32_MAX */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 2147483647 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, (int32_t)2147483647LL); bson_destroy(&b); /* INT32_MIN */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": -2147483648 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, (int32_t)-2147483648LL); bson_destroy(&b); /* INT32_MAX + 1 */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 2147483648 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)2147483648LL); bson_destroy(&b); /* INT32_MIN - 1 */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": -2147483649 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)-2147483649LL); bson_destroy(&b); } static void test_bson_json_int64(void) { bson_t b; bson_iter_t iter; bson_error_t error; /* INT64_MAX */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 9223372036854775807 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)9223372036854775807LL); bson_destroy(&b); /* INT64_MIN */ ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": -9223372036854775808 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)INT64_MIN); bson_destroy(&b); /* INT64_MAX + 1 */ BSON_ASSERT(!bson_init_from_json(&b, "{ \"x\": 9223372036854775808 }", -1, &error)); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"9223372036854775808\" is out of range"); memset(&error, 0, sizeof error); /* INT64_MIN - 1 */ BSON_ASSERT(!bson_init_from_json(&b, "{ \"x\": -9223372036854775809 }", -1, &error)); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-9223372036854775809\" is out of range"); memset(&error, 0, sizeof error); BSON_ASSERT(!bson_init_from_json(&b, "{ \"x\": 10000000000000000000 }", -1, &error)); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"10000000000000000000\" is out of range"); memset(&error, 0, sizeof error); /* INT64_MIN - 2 */ BSON_ASSERT(!bson_init_from_json(&b, "{ \"x\": -10000000000000000000 }", -1, &error)); ASSERT_ERROR_CONTAINS( error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_double(void) { bson_t b; bson_error_t error; bson_iter_t iter; ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 1 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT_CMPINT32(bson_iter_int32(&iter), ==, (int32_t)1); bson_destroy(&b); ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 4294967296 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), ==, (int64_t)4294967296); bson_destroy(&b); ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 1.0 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); ASSERT_CMPDOUBLE(bson_iter_double(&iter), ==, 1.0); bson_destroy(&b); ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": 0.0 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); ASSERT_CMPDOUBLE(bson_iter_double(&iter), ==, 0.0); bson_destroy(&b); ASSERT_OR_PRINT(bson_init_from_json(&b, "{ \"x\": -0.0 }", -1, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &b, "x")); BSON_ASSERT(BSON_ITER_HOLDS_DOUBLE(&iter)); ASSERT_CMPDOUBLE(bson_iter_double(&iter), ==, 0.0); /* check that "x" is -0.0. signbit not available on FreeBSD or VS 2010 or AIX */ #if !defined(__FreeBSD__) && (!defined(_MSC_VER) || (_MSC_VER >= 1800)) && (!defined(_AIX)) BSON_ASSERT(signbit(bson_iter_double(&iter))); #endif bson_destroy(&b); } static void test_bson_json_double_overflow(void) { const char *nums[] = {"2e400", "-2e400", NULL}; const char **p; char *j; bson_error_t error; bson_t b; for (p = nums; *p; p++) { j = bson_strdup_printf("{ \"d\" : %s }", *p); BSON_ASSERT(!bson_init_from_json(&b, j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "out of range"); bson_free(j); memset(&error, 0, sizeof error); /* same test with canonical Extended JSON */ j = bson_strdup_printf("{ \"d\" : { \"$numberDouble\" : \"%s\" } }", *p); BSON_ASSERT(!bson_init_from_json(&b, j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "out of range"); bson_free(j); } } static void test_bson_json_nan(void) { bson_error_t error; bson_t b; double d; /* should parse any capitalization of NaN */ const char *jsons[] = {"{ \"d\": NaN }", "{ \"d\": nAn }", "{ \"d\": {\"$numberDouble\": \"NaN\" } }", "{ \"d\": {\"$numberDouble\": \"nAn\" } }", NULL}; /* test our patch to JSONSL that updates its state while parsing "n..." */ const char *bad[] = {"{ \"d\": NaNn }", "{ \"d\": nul }", "{ \"d\": nulll }", "{ \"d\": nulll }", "{ \"d\": foo }", "{ \"d\": NULL }", "{ \"d\": nall }", NULL}; const char *partial[] = {"{ \"d\": nu", "{ \"d\": na", "{ \"d\": n", NULL}; const char **j; for (j = jsons; *j; j++) { BSON_ASSERT(bson_init_from_json(&b, *j, -1, &error)); BSON_ASSERT(BCON_EXTRACT(&b, "d", BCONE_DOUBLE(d))); BSON_ASSERT(d != d); bson_destroy(&b); } for (j = bad; *j; j++) { BSON_ASSERT(!bson_init_from_json(&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at"); memset(&error, 0, sizeof error); } for (j = partial; *j; j++) { BSON_ASSERT(!bson_init_from_json(&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Incomplete JSON"); memset(&error, 0, sizeof error); } } static void test_bson_json_infinity(void) { bson_error_t error; bson_t b; double d; /* should parse any capitalization of Infinity */ const char *infs[] = {"{ \"d\": Infinity }", "{ \"d\": infinity }", "{ \"d\": inFINIty }", NULL}; const char *negs[] = {"{ \"d\": -Infinity }", "{ \"d\": -infinity }", "{ \"d\": -inFINIty }", NULL}; const char *bad[] = {"{ \"d\": Infinityy }", "{ \"d\": Infinit }", "{ \"d\": -Infinityy }", "{ \"d\": -Infinit }", "{ \"d\": infinityy }", "{ \"d\": infinit }", "{ \"d\": -infinityy }", "{ \"d\": -infinit }", NULL}; const char *partial[] = {"{ \"d\": In", "{ \"d\": I", "{ \"d\": i", NULL}; const char **j; for (j = infs; *j; j++) { BSON_ASSERT(bson_init_from_json(&b, *j, -1, &error)); BSON_ASSERT(BCON_EXTRACT(&b, "d", BCONE_DOUBLE(d))); /* Infinite */ BSON_ASSERT(d == d && ((d - d) != (d - d))); bson_destroy(&b); } for (j = negs; *j; j++) { BSON_ASSERT(bson_init_from_json(&b, *j, -1, &error)); BSON_ASSERT(BCON_EXTRACT(&b, "d", BCONE_DOUBLE(d))); /* Infinite */ BSON_ASSERT(d == d && ((d - d) != (d - d))); BSON_ASSERT(d < 0); bson_destroy(&b); } for (j = bad; *j; j++) { BSON_ASSERT(!bson_init_from_json(&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at"); memset(&error, 0, sizeof error); } for (j = partial; *j; j++) { BSON_ASSERT(!bson_init_from_json(&b, *j, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Incomplete JSON"); memset(&error, 0, sizeof error); } } static void test_bson_json_null(void) { bson_error_t error; bson_t b; const char *json = "{ \"x\": null }"; BSON_ASSERT(bson_init_from_json(&b, json, -1, &error)); BSON_ASSERT(BCON_EXTRACT(&b, "x", BCONE_NULL)); bson_destroy(&b); } static void test_bson_json_empty_final_object(void) { const char *json = "{\"a\": {\"b\": {}}}"; bson_t *bson = BCON_NEW("a", "{", "b", "{", "}", "}"); bson_t b; bool r; bson_error_t error; r = bson_init_from_json(&b, json, -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, bson); bson_destroy(&b); bson_destroy(bson); } static void test_bson_json_number_decimal(void) { bson_error_t error; bson_iter_t iter; bson_decimal128_t decimal128; const char *json = "{ \"key\" : { \"$numberDecimal\": \"11\" }}"; bson_t b; bool r; r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); BSON_ASSERT(bson_iter_init(&iter, &b)); BSON_ASSERT(bson_iter_find(&iter, "key")); BSON_ASSERT(BSON_ITER_HOLDS_DECIMAL128(&iter)); bson_iter_decimal128(&iter, &decimal128); BSON_ASSERT(decimal128.low == 11); BSON_ASSERT(decimal128.high == 0x3040000000000000ULL); bson_destroy(&b); } static void test_bson_json_inc(void) { /* test that reproduces a bug with special mode checking. Specifically, * mistaking '$inc' for '$id' * * From https://github.com/mongodb/mongo-c-driver/issues/62 */ bson_error_t error; const char *json = "{ \"$inc\" : { \"ref\" : 1 } }"; bson_t b; bool r; r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); bson_destroy(&b); } static void test_bson_json_array(void) { bson_error_t error; const char *json = "[ 0, 1, 2, 3 ]"; bson_t b, compare; bool r; bson_init(&compare); bson_append_int32(&compare, "0", 1, 0); bson_append_int32(&compare, "1", 1, 1); bson_append_int32(&compare, "2", 1, 2); bson_append_int32(&compare, "3", 1, 3); r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_json_array_single(void) { bson_error_t error; const char *json = "[ 0 ]"; bson_t b, compare; bool r; bson_init(&compare); bson_append_int32(&compare, "0", 1, 0); r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_json_array_int64(void) { bson_error_t error; const char *json = "[ { \"$numberLong\" : \"123\" }," " { \"$numberLong\" : \"42\" } ]"; bson_t b, compare; bool r; bson_init(&compare); bson_append_int64(&compare, "0", 1, 123); bson_append_int64(&compare, "1", 1, 42); r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_json_array_subdoc(void) { bson_error_t error; const char *json = "[ { \"a\" : 123 } ]"; bson_t b, compare, subdoc; bool r; bson_init(&compare); bson_init(&subdoc); bson_append_int32(&subdoc, "a", 1, 123); bson_append_document(&compare, "0", 1, &subdoc); r = bson_init_from_json(&b, json, -1, &error); if (!r) fprintf(stderr, "%s\n", error.message); BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&subdoc); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_json_merge_multiple(void) { bson_error_t error; bson_t *b = bson_new_from_json((const uint8_t *)"{\"a\" : 1}, {\"b\" : 2}", -1, &error); ASSERT_OR_PRINT(b, error); bson_t *compare = bson_new_from_json((const uint8_t *)BSON_STR({"a" : 1, "b" : 2}), -1, &error); bson_eq_bson(b, compare); bson_destroy(b); bson_destroy(compare); } static void test_bson_json_extra_chars(void) { bson_error_t error; { bson_t *b = bson_new_from_json((const uint8_t *)"{\"a\": 1}abc", -1, &error); ASSERT(b == NULL); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error at \"a\""); } { bson_t *b = bson_new_from_json((const uint8_t *)"{\"a\" : 1}{abc,[],{},123", -1, &error); ASSERT_OR_PRINT(b, error); bson_t *compare = bson_new_from_json((const uint8_t *)"{\"a\" : 1}", -1, &error); bson_eq_bson(b, compare); bson_destroy(b); bson_destroy(compare); } } static void test_bson_json_date_check(const char *json, int64_t value) { bson_error_t error = {0}; bson_t b, compare; bool r; bson_init(&compare); BSON_APPEND_DATE_TIME(&compare, "dt", value); r = bson_init_from_json(&b, json, -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_json_date_error(const char *json, const char *msg) { bson_error_t error = {0}; bson_t b; bool r; r = bson_init_from_json(&b, json, -1, &error); if (r) { fprintf(stderr, "parsing %s should fail\n", json); } BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, msg); } static void test_bson_json_date(void) { /* to make a timestamp, "python3 -m pip install iso8601" and in Python 3: * iso8601.parse_date("2016-12-13T12:34:56.123Z").timestamp() * 1000 */ test_bson_json_date_check("{ \"dt\" : { \"$date\" : \"2016-12-13T12:34:56.123Z\" } }", 1481632496123); test_bson_json_date_check("{ \"dt\" : { \"$date\" : \"1970-01-01T00:00:00.000Z\" } }", 0); test_bson_json_date_check("{ \"dt\" : { \"$date\" : \"1969-12-31T16:00:00.000-0800\" } }", 0); test_bson_json_date_check("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+01:00\" } }", 0); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:30:\" } }", "reached end of date while looking for seconds"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:+01:00\" } }", "seconds is required"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:30:00.\" } }", "reached end of date while looking for milliseconds"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.+01:00\" } }", "milliseconds is required"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"foo-01-01T00:00:00.000Z\" } }", "year must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-foo-01T00:00:00.000Z\" } }", "month must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-fooT00:00:00.000Z\" } }", "day must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01Tfoo:00:00.000Z\" } }", "hour must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T00:foo:00.000Z\" } }", "minute must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T00:00:foo.000Z\" } }", "seconds must be an integer"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000\" } }", "timezone is required"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000X\" } }", "timezone is required"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+1\" } }", "could not parse timezone"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+xx00\" } }", "could not parse timezone"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+2400\" } }", "timezone hour must be at most 23"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000-2400\" } }", "timezone hour must be at most 23"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000+0060\" } }", "timezone minute must be at most 59"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : \"1970-01-01T01:00:00.000-0060\" } }", "timezone minute must be at most 59"); } static void test_bson_json_date_legacy(void) { test_bson_json_date_check("{ \"dt\" : { \"$date\" : 0 } }", 0); test_bson_json_date_check("{ \"dt\" : { \"$date\" : 1356351330500 } }", 1356351330500); test_bson_json_date_check("{ \"dt\" : { \"$date\" : -62135593139000 } }", -62135593139000); /* INT64_MAX */ test_bson_json_date_check("{ \"dt\" : { \"$date\" : 9223372036854775807 } }", INT64_MAX); /* INT64_MIN */ test_bson_json_date_check("{ \"dt\" : { \"$date\" : -9223372036854775808 } }", INT64_MIN); /* INT64_MAX + 1 */ test_bson_json_date_error("{ \"dt\" : { \"$date\" : 9223372036854775808 } }", "Number \"9223372036854775808\" is out of range"); /* INT64_MIN - 1 */ test_bson_json_date_error("{ \"dt\" : { \"$date\" : -9223372036854775809 } }", "Number \"-9223372036854775809\" is out of range"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : 10000000000000000000 } }", "Number \"10000000000000000000\" is out of range"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : -10000000000000000000 } }", "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_date_numberlong(void) { test_bson_json_date_check("{ \"dt\" : { \"$date\" : {\"$numberLong\": \"0\" } } }", 0); test_bson_json_date_check("{ \"dt\" : { \"$date\" : {\"$numberLong\": \"1356351330500\" } } }", 1356351330500); test_bson_json_date_check("{ \"dt\" : { \"$date\" : { \"$numberLong\" : \"-62135593139000\" } } }", -62135593139000); /* INT64_MAX */ test_bson_json_date_check("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"9223372036854775807\" } } }", INT64_MAX); /* INT64_MIN */ test_bson_json_date_check("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-9223372036854775808\" } } }", INT64_MIN); /* INT64_MAX + 1 */ test_bson_json_date_error("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"9223372036854775808\" } } }", "Number \"9223372036854775808\" is out of range"); /* INT64_MIN - 1 */ test_bson_json_date_error("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-9223372036854775809\" } } }", "Number \"-9223372036854775809\" is out of range"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"10000000000000000000\" } } }", "Number \"10000000000000000000\" is out of range"); test_bson_json_date_error("{ \"dt\" : { \"$date\" : { \"$numberLong\" " ": \"-10000000000000000000\" } } }", "Number \"-10000000000000000000\" is out of range"); } static void test_bson_json_timestamp(void) { bson_error_t error = {0}; bson_t b, compare; bool r; bson_init(&compare); BSON_APPEND_TIMESTAMP(&compare, "ts", (uint32_t)1486785977, (uint32_t)1234); r = bson_init_from_json(&b, "{\"ts\": {\"$timestamp\": {\"t\": 1486785977, \"i\": 1234}}}", -1, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } BSON_ASSERT(r); bson_eq_bson(&b, &compare); bson_destroy(&compare); bson_destroy(&b); } static void test_bson_array_as_legacy_json(void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_legacy_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ ]"); ASSERT_CMPSIZE_T(len, ==, 3u); bson_free(str); BSON_APPEND_INT32(&d, "0", 1); str = bson_array_as_legacy_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ 1 ]"); ASSERT_CMPSIZE_T(len, ==, 5u); bson_free(str); /* test corrupted bson */ BSON_APPEND_UTF8(&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_legacy_extended_json(&d, &len); BSON_ASSERT(!str); BSON_ASSERT(!len); bson_destroy(&d); } static void test_bson_array_as_relaxed_json(void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_relaxed_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ ]"); ASSERT_CMPSIZE_T(len, ==, 3u); bson_free(str); BSON_APPEND_INT32(&d, "0", 1); str = bson_array_as_relaxed_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ 1 ]"); ASSERT_CMPSIZE_T(len, ==, 5u); bson_free(str); /* test corrupted bson */ BSON_APPEND_UTF8(&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_relaxed_extended_json(&d, &len); BSON_ASSERT(!str); BSON_ASSERT(!len); bson_destroy(&d); } static void test_bson_array_as_canonical_json(void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_array_as_canonical_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ ]"); ASSERT_CMPSIZE_T(len, ==, 3u); bson_free(str); BSON_APPEND_INT32(&d, "0", 1); str = bson_array_as_canonical_extended_json(&d, &len); ASSERT_CMPSTR(str, "[ { \"$numberInt\" : \"1\" } ]"); ASSERT_CMPSIZE_T(len, ==, 26u); bson_free(str); /* test corrupted bson */ BSON_APPEND_UTF8(&d, "1", "\x80"); /* bad UTF-8 */ str = bson_array_as_canonical_extended_json(&d, &len); BSON_ASSERT(!str); BSON_ASSERT(!len); bson_destroy(&d); } static void test_bson_as_json_spacing(void) { bson_t d = BSON_INITIALIZER; size_t len; char *str; str = bson_as_legacy_extended_json(&d, &len); BSON_ASSERT(0 == strcmp(str, "{ }")); BSON_ASSERT(len == 3); bson_free(str); BSON_APPEND_INT32(&d, "a", 1); str = bson_as_legacy_extended_json(&d, &len); BSON_ASSERT(0 == strcmp(str, "{ \"a\" : 1 }")); BSON_ASSERT(len == 11); bson_free(str); bson_destroy(&d); } static void test_bson_json_errors(void) { typedef const char *test_bson_json_error_t[2]; test_bson_json_error_t tests[] = { {BSON_STR({"x" : {"$numberLong" : 1}}), "Invalid state for integer read: INT64"}, {BSON_STR({"x" : {"$binary" : 1}}), "Unexpected integer 1 in type \"binary\""}, {BSON_STR({"x" : {"$numberInt" : true}}), "Invalid read of boolean in state IN_BSON_TYPE"}, {BSON_STR({"x" : {"$dbPointer" : true}}), "Invalid read of boolean in state IN_BSON_TYPE_DBPOINTER_STARTMAP"}, {BSON_STR([ {"$code" : {}} ]), "Unexpected nested object value for \"$code\" key"}, {BSON_STR([ {"$scope" : {}, "$dbPointer" : {"" : {"$code" : ""}}} ]), "Invalid key \"$dbPointer\". Looking for values for type \"code\", got \"dbpointer\""}, {BSON_STR({"x" : {"$numberInt" : "8589934592"}}), "Invalid input string \"8589934592\", looking for INT32"}, {0}, }; bson_error_t error; test_bson_json_error_t *p; for (p = tests; *(p[0]); p++) { BSON_ASSERT(!bson_new_from_json((const uint8_t *)(*p)[0], -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, (*p)[1]); } } static void test_bson_integer_width(void) { const char *sd = "{\"v\":-1234567890123, \"x\":12345678901234}"; char *match; bson_error_t err; bson_t *bs = bson_new_from_json((const uint8_t *)sd, strlen(sd), &err); match = bson_as_legacy_extended_json(bs, 0); ASSERT_CMPSTR(match, "{ \"v\" : -1234567890123, \"x\" : 12345678901234 }"); bson_free(match); bson_destroy(bs); } static void test_bson_json_null_in_str(void) { const char bad_json[] = "{\"a\":\"\0\"}"; const char cdriver2305[] = "{\"\0"; bson_error_t err; ASSERT(!bson_new_from_json((const uint8_t *)bad_json, sizeof(bad_json) - 1, &err)); ASSERT_ERROR_CONTAINS(err, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error"); memset(&err, 0, sizeof err); ASSERT(!bson_new_from_json((const uint8_t *)cdriver2305, sizeof(cdriver2305) - 1, &err)); ASSERT_ERROR_CONTAINS(err, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_CORRUPT_JS, "Got parse error"); } static char * _single_to_double(const char *json) { char *copy; char *to_ret = copy = bson_malloc(strlen(json) + 1); strcpy(copy, json); while (*copy) { if (*copy == '\'') { *copy = '\"'; } else { copy++; } } return to_ret; } static void _test_json_produces_multiple(const char *json_in, int err_expected, ...) { bson_t bson_in = BSON_INITIALIZER; bson_t *bson_expected; bson_error_t err = {0}; int ret; va_list ap; char *json = _single_to_double(json_in); bson_json_reader_t *reader = bson_json_data_reader_new(false /* ignored */, 512 /* buffer size */); va_start(ap, err_expected); bson_json_data_reader_ingest(reader, (uint8_t *)json, strlen(json)); while ((ret = bson_json_reader_read(reader, &bson_in, &err)) == 1) { bson_expected = va_arg(ap, bson_t *); if (!bson_expected) { fprintf(stderr, "Extra bson documents returned for input %s\n", json); abort(); } if (bson_compare(&bson_in, bson_expected) != 0) { char *expect = bson_as_relaxed_extended_json(bson_expected, NULL); char *in = bson_as_relaxed_extended_json(&bson_in, NULL); fprintf(stderr, "Got %s, but expected %s for input %s\n", expect, in, json); bson_free(expect); bson_free(in); abort(); } bson_destroy(bson_expected); bson_reinit(&bson_in); } if (ret == 0) { ASSERT(!err_expected); } else { ASSERT_OR_PRINT(err_expected, err); } if (va_arg(ap, bson_t *) != NULL) { fprintf(stderr, "Not all bson docs matched for input %s\n", json); abort(); } va_end(ap); bson_json_reader_destroy(reader); bson_destroy(&bson_in); bson_free(json); } #define TEST_JSON_PRODUCES_MULTIPLE(_json, _has_err, ...) \ _test_json_produces_multiple(_json, _has_err, __VA_ARGS__, NULL) static void test_bson_as_json_multi_object(void) { /* Test malformed documents that produce errors */ TEST_JSON_PRODUCES_MULTIPLE("[],[{''", 1, NULL); TEST_JSON_PRODUCES_MULTIPLE("{},[{''", 1, NULL); /* Test the desired multiple document behavior */ TEST_JSON_PRODUCES_MULTIPLE("{'a': 1} {'b': 1}", 0, BCON_NEW("a", BCON_INT32(1)), BCON_NEW("b", BCON_INT32(1))); TEST_JSON_PRODUCES_MULTIPLE("{}{}{}", 0, bson_new(), bson_new(), bson_new()); /* Test strange behavior we may consider changing */ /* Combines both documents into one? */ TEST_JSON_PRODUCES_MULTIPLE("{'a': 1}, {'b': 1}", 0, BCON_NEW("a", BCON_INT32(1), "b", BCON_INT32(1))); TEST_JSON_PRODUCES_MULTIPLE("{},{'a': 1}", 0, BCON_NEW("a", BCON_INT32(1))); TEST_JSON_PRODUCES_MULTIPLE("{},{},{'a': 1}", 0, BCON_NEW("a", BCON_INT32(1))); TEST_JSON_PRODUCES_MULTIPLE("[],{'a': 1}", 0, BCON_NEW("a", BCON_INT32(1))); /* We support a root level array */ TEST_JSON_PRODUCES_MULTIPLE("[]", 0, bson_new()); TEST_JSON_PRODUCES_MULTIPLE("[{'x': 0}]", 0, BCON_NEW("0", "{", "x", BCON_INT32(0), "}")); /* Yet this fails */ TEST_JSON_PRODUCES_MULTIPLE("[],[{'a': 1}]", 1, NULL); } static void test_bson_as_json_with_opts(bson_t *bson, bson_json_mode_t mode, int max_len, const char *expected) { bson_json_opts_t *opts = bson_json_opts_new(mode, max_len); size_t json_len; char *str = bson_as_json_with_opts(bson, &json_len, opts); ASSERT_CMPSTR(str, expected); ASSERT_CMPSIZE_T(json_len, ==, strlen(expected)); if (max_len != BSON_MAX_LEN_UNLIMITED) { ASSERT(mlib_in_range(size_t, max_len)); ASSERT_CMPSIZE_T(json_len, <=, (size_t)max_len); } bson_free(str); bson_json_opts_destroy(opts); } char * truncate_string(const char *str, size_t len) { char *truncated; truncated = (char *)bson_malloc0(len + 1); strncpy(truncated, str, len); truncated[len] = '\0'; return truncated; } /* Run multiple tests against a particular bson_t and bson_json_mode_t, with expected output. * This test assumes naive string truncation (not UTF-8 preserving) so it's unsuitable * when expected json output includes multi-byte UTF-8 sequences. */ static void run_bson_as_json_with_opts_tests(bson_t *bson, bson_json_mode_t mode, const char *expected) { const size_t ulen = strlen(expected); char *truncated; BSON_ASSERT(mlib_in_range(int, ulen)); const int len = (int)ulen; /* Test with 0 length (empty string). */ test_bson_as_json_with_opts(bson, mode, 0, ""); BSON_ASSERT(INT_MAX - 2 >= len); /* Test with a limit that does not truncate the string. */ test_bson_as_json_with_opts(bson, mode, len + 2, expected); /* Test with unlimited length. */ test_bson_as_json_with_opts(bson, mode, BSON_MAX_LEN_UNLIMITED, expected); /* Test every possible limit from 0 to length. */ for (int i = 0; i < len; i++) { truncated = truncate_string(expected, (size_t)i); test_bson_as_json_with_opts(bson, mode, i, truncated); bson_free(truncated); } } static void test_bson_as_json_with_opts_double(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_DOUBLE(b, "v", 1.0)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberDouble\" : \"1.0\" } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 1.0 }"); bson_destroy(b); } static void test_bson_as_json_with_opts_utf8(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_UTF8(b, "v", "abcdef")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : \"abcdef\" }"); bson_destroy(b); } static void test_bson_as_json_with_opts_document(void) { bson_t *b; bson_t nested; b = bson_new(); BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(b, "v", &nested)); BSON_ASSERT(BSON_APPEND_UTF8(&nested, "v", "abcdef")); BSON_ASSERT(bson_append_document_end(b, &nested)); BSON_ASSERT(BSON_APPEND_UTF8(b, "w", "abcdef")); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"v\" : \"abcdef\" }, \"w\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"v\" : \"abcdef\" }, \"w\" : \"abcdef\" }"); bson_destroy(b); bson_destroy(&nested); } static void test_bson_as_json_with_opts_array(void) { bson_t *b; bson_t nested; b = bson_new(); BSON_ASSERT(BSON_APPEND_ARRAY_BEGIN(b, "v", &nested)); BSON_ASSERT(BSON_APPEND_UTF8(&nested, "0", "abcdef")); BSON_ASSERT(bson_append_array_end(b, &nested)); BSON_ASSERT(BSON_APPEND_UTF8(b, "w", "abcdef")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : [ \"abcdef\" ], \"w\" : \"abcdef\" }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : [ \"abcdef\" ], \"w\" : \"abcdef\" }"); bson_destroy(b); bson_destroy(&nested); } static void test_bson_as_json_with_opts_binary(void) { const uint8_t data[] = {1, 2, 3, 4}; bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_BINARY(b, "v", 0, data, sizeof data)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$binary\" : { \"base64\" : " "\"AQIDBA==\", \"subType\" : \"00\" } } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$binary\" : { \"base64\" : " "\"AQIDBA==\", \"subType\" : \"00\" } } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_undefined(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_UNDEFINED(b, "v")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$undefined\" : true } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$undefined\" : true } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_oid(void) { bson_oid_t oid; bson_t *b; bson_oid_init_from_string(&oid, "12341234123412abcdababcd"); b = bson_new(); BSON_ASSERT(BSON_APPEND_OID(b, "v", &oid)); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$oid\" : \"12341234123412abcdababcd\" } }"); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$oid\" : \"12341234123412abcdababcd\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_bool(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_BOOL(b, "v", false)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : false }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : false }"); bson_destroy(b); } static void test_bson_as_json_with_opts_date_time(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_DATE_TIME(b, "v", 1602572588123)); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$date\" : \"2020-10-13T07:03:08.123Z\" } }"); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$date\" : { \"$numberLong\" : \"1602572588123\" } } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_null(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_NULL(b, "v")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : null }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : null }"); bson_destroy(b); } static void test_bson_as_json_with_opts_regex(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_REGEX(b, "v", "^abc", "i")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$regularExpression\" : { \"pattern\" : \"^abc\", " "\"options\" : \"i\" } } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$regularExpression\" : { \"pattern\" : \"^abc\", " "\"options\" : \"i\" } } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_dbpointer(void) { bson_oid_t oid; bson_t *b; bson_oid_init_from_string(&oid, "12341234123412abcdababcd"); b = bson_new(); BSON_ASSERT(BSON_APPEND_DBPOINTER(b, "v", "coll", &oid)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$dbPointer\" : { \"$ref\" : \"coll\", \"$id\" : { " "\"$oid\" : \"12341234123412abcdababcd\" } } } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$dbPointer\" : { \"$ref\" : \"coll\", \"$id\" : { " "\"$oid\" : \"12341234123412abcdababcd\" } } } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_code(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_CODE(b, "v", "function(){}")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$code\" : \"function(){}\" } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$code\" : \"function(){}\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_symbol(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_SYMBOL(b, "v", "symbol")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$symbol\" : \"symbol\" } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$symbol\" : \"symbol\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_codewscope(void) { bson_t *b; bson_t *scope; scope = bson_new(); BSON_ASSERT(BSON_APPEND_UTF8(scope, "v", "abcdef")); b = bson_new(); BSON_ASSERT(BSON_APPEND_CODE_WITH_SCOPE(b, "v", "function(){}", scope)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$code\" : \"function(){}\", " "\"$scope\" : { \"v\" : \"abcdef\" } } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$code\" : \"function(){}\", " "\"$scope\" : { \"v\" : \"abcdef\" } } }"); bson_destroy(b); bson_destroy(scope); } static void test_bson_as_json_with_opts_int32(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_INT32(b, "v", 461394000)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 461394000 }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberInt\" : \"461394000\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_int64(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_INT64(b, "v", 461394000)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : 461394000 }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberLong\" : \"461394000\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_timestamp(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_TIMESTAMP(b, "v", 461394000, 2)); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$timestamp\" : { \"t\" : 461394000, \"i\" : 2 } } }"); run_bson_as_json_with_opts_tests( b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$timestamp\" : { \"t\" : 461394000, \"i\" : 2 } } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_minkey(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_MINKEY(b, "v")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$minKey\" : 1 } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$minKey\" : 1 } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_maxkey(void) { bson_t *b; b = bson_new(); BSON_ASSERT(BSON_APPEND_MAXKEY(b, "v")); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$maxKey\" : 1 } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$maxKey\" : 1 } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_decimal128(void) { bson_t *b; bson_decimal128_t dec; dec.high = 0x3040ffffffffffffULL; dec.low = 0xffffffffffffffffULL; b = bson_new(); BSON_ASSERT(BSON_APPEND_DECIMAL128(b, "v", &dec)); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_RELAXED, "{ \"v\" : { \"$numberDecimal\" : " "\"5192296858534827628530496329220095\" } }"); run_bson_as_json_with_opts_tests(b, BSON_JSON_MODE_CANONICAL, "{ \"v\" : { \"$numberDecimal\" : " "\"5192296858534827628530496329220095\" } }"); bson_destroy(b); } static void test_bson_as_json_with_opts_all_types(void) { char *full_canonical; char *full_relaxed; bson_oid_t oid; bson_decimal128_t decimal128; bson_t b; bson_t scope; decimal128.high = 0x3040000000000000ULL; decimal128.low = 0x000000000000000B; bson_oid_init_from_string(&oid, "123412341234abcdabcdabcd"); bson_init(&scope); BCON_APPEND(&scope, "x", BCON_INT32(1)); bson_init(&b); BCON_APPEND(&b, "double", BCON_DOUBLE(123.0)); BCON_APPEND(&b, "utf8", "bar"); BCON_APPEND(&b, "document", "{", "x", BCON_INT32(1), "}"); BCON_APPEND(&b, "array", "[", BCON_INT32(1), "]"); BCON_APPEND(&b, "binary", BCON_BIN(BSON_SUBTYPE_BINARY, (uint8_t *)"abc", 3)); BCON_APPEND(&b, "undefined", BCON_UNDEFINED); BCON_APPEND(&b, "oid", BCON_OID(&oid)); BCON_APPEND(&b, "false", BCON_BOOL(false)); BCON_APPEND(&b, "true", BCON_BOOL(true)); BCON_APPEND(&b, "date", BCON_DATE_TIME(time(NULL))); BCON_APPEND(&b, "null", BCON_NULL); BCON_APPEND(&b, "regex", BCON_REGEX("^abcd", "xi")); BCON_APPEND(&b, "dbpointer", BCON_DBPOINTER("mycollection", &oid)); BCON_APPEND(&b, "code", BCON_CODE("code")); BCON_APPEND(&b, "symbol", BCON_SYMBOL("symbol")); BCON_APPEND(&b, "codewscope", BCON_CODEWSCOPE("code", &scope)); BCON_APPEND(&b, "int32", BCON_INT32(1234)); BCON_APPEND(&b, "timestamp", BCON_TIMESTAMP((uint32_t)time(NULL), 1234)); BCON_APPEND(&b, "int64", BCON_INT64(4321)); BCON_APPEND(&b, "decimal128", BCON_DECIMAL128(&decimal128)); BCON_APPEND(&b, "minkey", BCON_MINKEY); BCON_APPEND(&b, "maxkey", BCON_MAXKEY); full_canonical = bson_as_canonical_extended_json(&b, NULL); full_relaxed = bson_as_relaxed_extended_json(&b, NULL); run_bson_as_json_with_opts_tests(&b, BSON_JSON_MODE_RELAXED, full_relaxed); run_bson_as_json_with_opts_tests(&b, BSON_JSON_MODE_CANONICAL, full_canonical); bson_free(full_canonical); bson_free(full_relaxed); bson_destroy(&b); bson_destroy(&scope); } /* Helper for test_bson_as_json_with_opts_utf8_truncation. Expects to be able to truncate the * string output at all lengths except those identified in a variable-length (-1) terminated integer argument list. */ static void _test_bson_json_utf8_truncation(bson_t *test_doc, bson_json_mode_t mode, const char *expected, ...) { size_t expected_len = expected ? strlen(expected) : 64; size_t last_valid_truncation = 0; for (size_t checking_len = 0; checking_len < expected_len; checking_len++) { bool expect_truncation_here = true; va_list ap; va_start(ap, expected); while (true) { int arg = va_arg(ap, int); if (arg < 0) { BSON_ASSERT(arg == -1); break; } else if (mlib_cmp(arg, ==, checking_len)) { expect_truncation_here = false; } } va_end(ap); if (expect_truncation_here) { last_valid_truncation = checking_len; } bson_json_opts_t *opts = bson_json_opts_new(mode, checking_len); size_t json_len; char *str = bson_as_json_with_opts(test_doc, &json_len, opts); bson_json_opts_destroy(opts); if (str) { BSON_ASSERT(expected); ASSERT_CMPSIZE_T(json_len, ==, last_valid_truncation); char *str_trunc = bson_strndup(str, json_len); char *expected_trunc = bson_strndup(expected, last_valid_truncation); ASSERT_CMPSTR(str_trunc, expected_trunc); bson_free(str_trunc); bson_free(expected_trunc); bson_free(str); } else { BSON_ASSERT(!expected); } } bson_destroy(test_doc); } static void test_bson_as_json_with_opts_utf8_truncation(void) { // Plain ASCII, in a subdocument. Just checking that all truncations here are okay. _test_bson_json_utf8_truncation( BCON_NEW("doc", "{", "a", BCON_UTF8("b"), "}"), BSON_JSON_MODE_CANONICAL, "{ \"doc\" : { \"a\" : \"b\" } }", -1); // Escape sequences, also fine to truncate anywhere _test_bson_json_utf8_truncation(BCON_NEW("doc", "{", "\x01", BCON_UTF8("\xc0\x80"), "}"), BSON_JSON_MODE_CANONICAL, "{ \"doc\" : { \"\\u0001\" : \"\\u0000\" } }", -1); // Invalid UTF-8 sequence, rejected by bson_as_json_with_opts _test_bson_json_utf8_truncation( BCON_NEW("foo\xff\xff bar", "{", "a", BCON_UTF8("b"), "}"), BSON_JSON_MODE_CANONICAL, NULL, -1); // Valid 2-byte UTF-8 sequence _test_bson_json_utf8_truncation(BCON_NEW("foo \xc2\xa9", "{", "\xc2\xa9 bar", BCON_UTF8("foo \xc2\xa9 bar"), "}"), BSON_JSON_MODE_CANONICAL, "{ \"foo \xc2\xa9\" : { \"\xc2\xa9 bar\" : \"foo \xc2\xa9 bar\" } }", 8, 17, 32, -1); // Valid 3-byte UTF-8 sequence _test_bson_json_utf8_truncation( BCON_NEW("foo \xef\xbf\xbd", "{", "\xef\xbf\xbd bar", BCON_UTF8("foo \xef\xbf\xbd bar"), "}"), BSON_JSON_MODE_CANONICAL, "{ \"foo \xef\xbf\xbd\" : { \"\xef\xbf\xbd bar\" : \"foo \xef\xbf\xbd bar\" } }", 8, 9, 18, 19, 34, 35, -1); // Valid 4-byte UTF-8 sequence _test_bson_json_utf8_truncation( BCON_NEW("foo \xf4\x8f\xbf\xbf", "{", "\xf4\x8f\xbf\xbf bar", BCON_UTF8("foo \xf4\x8f\xbf\xbf bar"), "}"), BSON_JSON_MODE_CANONICAL, "{ \"foo \xf4\x8f\xbf\xbf\" : { \"\xf4\x8f\xbf\xbf bar\" : \"foo \xf4\x8f\xbf\xbf bar\" } }", 8, 9, 10, 19, 20, 21, 36, 37, 38, -1); } static void test_decimal128_overflowing_exponent(void) { { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("0E+2147483648", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("0E-2147483649", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("-0E+2147483648", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("-0E-2147483649", &decimal128)); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"0E+2147483648\"}}"; BSON_ASSERT(!bson_new_from_json((const uint8_t *)degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"0E+2147483648\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"0E-2147483649\"}}"; BSON_ASSERT(!bson_new_from_json((const uint8_t *)degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"0E-2147483649\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"-0E+2147483648\"}}"; BSON_ASSERT(!bson_new_from_json((const uint8_t *)degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"-0E+2147483648\", looking for DECIMAL128"); } { bson_error_t error; const char *degenerate_extjson = "{\"d\" : {\"$numberDecimal\" : \"-0E-2147483649\"}}"; BSON_ASSERT(!bson_new_from_json((const uint8_t *)degenerate_extjson, -1, &error)); ASSERT_ERROR_CONTAINS(error, BSON_ERROR_JSON, BSON_JSON_ERROR_READ_INVALID_PARAM, "Invalid input string \"-0E-2147483649\", looking for DECIMAL128"); } { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("0E+99999999999999999999", &decimal128)); } { bson_decimal128_t decimal128; BSON_ASSERT(!bson_decimal128_from_string("0E-99999999999999999999", &decimal128)); } } static void test_parse_array(void) { { bson_t *b1; { const char *json = BSON_STR([ {"$code" : "A"} ]); bson_error_t error; b1 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b1, error); } bson_t *b2; { const char *json = BSON_STR({"0" : {"$code" : "A"}}); bson_error_t error; b2 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b2, error); } ASSERT(bson_equal(b1, b2)); bson_destroy(b2); bson_destroy(b1); } { bson_t *b1; { const char *json = BSON_STR([ {"$code" : "A"}, {"$code" : "B"} ]); bson_error_t error; b1 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b1, error); } bson_t *b2; { const char *json = BSON_STR({"0" : {"$code" : "A"}}, {"1" : {"$code" : "B"}}); bson_error_t error; b2 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b2, error); } ASSERT(bson_equal(b1, b2)); bson_destroy(b2); bson_destroy(b1); } { bson_t *b1; { const char *json = BSON_STR([ {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}} ]); bson_error_t error; b1 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b1, error); } bson_t *b2; { const char *json = BSON_STR({"0" : {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}}}); bson_error_t error; b2 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b2, error); } ASSERT(bson_equal(b1, b2)); bson_destroy(b2); bson_destroy(b1); } { bson_t *b1; { const char *json = BSON_STR([ {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}}, {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}} ]); bson_error_t error; b1 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b1, error); } bson_t *b2; { const char *json = BSON_STR({"0" : {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}}}, {"1" : {"$dbPointer" : {"$ref" : "foo", "$id" : {"$oid" : "01234567890abcdef0123456"}}}}); bson_error_t error; b2 = bson_new_from_json((const uint8_t *)json, -1, &error); ASSERT_OR_PRINT(b2, error); } ASSERT(bson_equal(b1, b2)); bson_destroy(b2); bson_destroy(b1); } } static void test_bson_as_json_all_formats(void) { bson_error_t error; #define ASSERT_AS_JSON(bson, mode, expect_single_quoted) \ if (1) { \ bson_json_opts_t *opts = bson_json_opts_new(mode, BSON_MAX_LEN_UNLIMITED); \ char *got = bson_as_json_with_opts(bson, NULL, opts); \ ASSERT(got); \ char *expect = single_quotes_to_double(expect_single_quoted); \ ASSERT_CMPSTR(got, expect); \ bson_free(got); \ bson_free(expect); \ bson_json_opts_destroy(opts); \ } else \ (void)0 // Test each BSON type listed on: https://www.mongodb.com/docs/manual/reference/bson-types/ { // BSON type: double { bson_t *b = BCON_NEW("double", BCON_DOUBLE(1.5)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'double' : { '$numberDouble' : '1.5' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'double' : 1.5 }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'double' : 1.5 }"); bson_destroy(b); } // BSON type: string { bson_t *b = BCON_NEW("string", "foo"); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'string' : 'foo' }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'string' : 'foo' }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'string' : 'foo' }"); bson_destroy(b); } // BSON type: object { bson_t *b = BCON_NEW("object", "{", "a", "b", "}"); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'object' : { 'a' : 'b' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'object' : { 'a' : 'b' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'object' : { 'a' : 'b' } }"); bson_destroy(b); } // BSON type: array { bson_t *b = BCON_NEW("array", "[", "a", "]"); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'array' : [ 'a' ] }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'array' : [ 'a' ] }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'array' : [ 'a' ] }"); bson_destroy(b); } // BSON type: binData { bson_t *b = BCON_NEW("binData", BCON_BIN(BSON_SUBTYPE_BINARY, (uint8_t *)"abc", 3u)); ASSERT_AS_JSON( b, BSON_JSON_MODE_CANONICAL, "{ 'binData' : { '$binary' : { 'base64' : 'YWJj', 'subType' : '00' } } }"); ASSERT_AS_JSON( b, BSON_JSON_MODE_RELAXED, "{ 'binData' : { '$binary' : { 'base64' : 'YWJj', 'subType' : '00' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'binData' : { '$binary' : 'YWJj', '$type' : '00' } }"); bson_destroy(b); } // BSON type: undefined { bson_t *b = BCON_NEW("undefined", BCON_UNDEFINED); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'undefined' : { '$undefined' : true } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'undefined' : { '$undefined' : true } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'undefined' : { '$undefined' : true } }"); bson_destroy(b); } // BSON type: objectId { bson_oid_t oid; bson_oid_init_from_string(&oid, "123412341234abcdabcdabcd"); bson_t *b = BCON_NEW("objectId", BCON_OID(&oid)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'objectId' : { '$oid' : '123412341234abcdabcdabcd' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'objectId' : { '$oid' : '123412341234abcdabcdabcd' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'objectId' : { '$oid' : '123412341234abcdabcdabcd' } }"); bson_destroy(b); } // BSON type: bool { bson_t *b = BCON_NEW("bool", BCON_BOOL(true)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'bool' : true }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'bool' : true }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'bool' : true }"); bson_destroy(b); } // BSON type: date { const char *date_str = "2024-01-01T00:00Z"; int64_t date_ms; ASSERT_OR_PRINT(_bson_iso8601_date_parse(date_str, (int32_t)strlen(date_str), &date_ms, &error), error); bson_t *b = BCON_NEW("date", BCON_DATE_TIME(date_ms)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'date' : { '$date' : { '$numberLong' : '1704067200000' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'date' : { '$date' : '2024-01-01T00:00:00Z' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'date' : { '$date' : 1704067200000 } }"); bson_destroy(b); } // BSON type: null { bson_t *b = BCON_NEW("null", BCON_NULL); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'null' : null }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'null' : null }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'null' : null }"); bson_destroy(b); } // BSON type: regex { bson_t *b = BCON_NEW("regex", BCON_REGEX("a.*b", "i")); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'regex' : { '$regularExpression' : { 'pattern' : 'a.*b', 'options' : 'i' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'regex' : { '$regularExpression' : { 'pattern' : 'a.*b', 'options' : 'i' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'regex' : { '$regex' : 'a.*b', '$options' : 'i' } }"); bson_destroy(b); } // BSON type: dbPointer { bson_oid_t oid; bson_oid_init_from_string(&oid, "123412341234abcdabcdabcd"); bson_t *b = BCON_NEW("dbPointer", BCON_DBPOINTER("coll", &oid)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'dbPointer' : { '$dbPointer' : { '$ref' : 'coll', '$id' : { '$oid' : " "'123412341234abcdabcdabcd' } } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'dbPointer' : { '$dbPointer' : { '$ref' : 'coll', '$id' : { '$oid' : " "'123412341234abcdabcdabcd' } } } }"); ASSERT_AS_JSON( b, BSON_JSON_MODE_LEGACY, "{ 'dbPointer' : { '$ref' : 'coll', '$id' : '123412341234abcdabcdabcd' } }"); bson_destroy(b); } // BSON type: javascript { bson_t *b = BCON_NEW("javascript", BCON_CODE("code")); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'javascript' : { '$code' : 'code' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'javascript' : { '$code' : 'code' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'javascript' : { '$code' : 'code' } }"); bson_destroy(b); } // BSON type: symbol { bson_t *b = BCON_NEW("symbol", BCON_SYMBOL("symbol")); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'symbol' : { '$symbol' : 'symbol' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'symbol' : { '$symbol' : 'symbol' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'symbol' : 'symbol' }"); bson_destroy(b); } // BSON type: int { bson_t *b = BCON_NEW("int", BCON_INT32(123)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'int' : { '$numberInt' : '123' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'int' : 123 }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'int' : 123 }"); bson_destroy(b); } // BSON type: timestamp { bson_t *b = BCON_NEW("timestamp", BCON_TIMESTAMP(0u, 1u)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'timestamp' : { '$timestamp' : { 't' : 0, 'i' : 1 } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'timestamp' : { '$timestamp' : { 't' : 0, 'i' : 1 } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'timestamp' : { '$timestamp' : { 't' : 0, 'i' : 1 } } }"); bson_destroy(b); } // BSON type: long { bson_t *b = BCON_NEW("long", BCON_INT64(456)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'long' : { '$numberLong' : '456' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'long' : 456 }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'long' : 456 }"); bson_destroy(b); } // BSON type: decimal { bson_decimal128_t decimal128; ASSERT(bson_decimal128_from_string("1.23", &decimal128)); bson_t *b = BCON_NEW("decimal", BCON_DECIMAL128(&decimal128)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'decimal' : { '$numberDecimal' : '1.23' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'decimal' : { '$numberDecimal' : '1.23' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'decimal' : { '$numberDecimal' : '1.23' } }"); bson_destroy(b); } // BSON type: minKey { bson_t *b = BCON_NEW("minKey", BCON_MINKEY); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'minKey' : { '$minKey' : 1 } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'minKey' : { '$minKey' : 1 } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'minKey' : { '$minKey' : 1 } }"); bson_destroy(b); } // BSON type: maxKey { bson_t *b = BCON_NEW("maxKey", BCON_MAXKEY); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'maxKey' : { '$maxKey' : 1 } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'maxKey' : { '$maxKey' : 1 } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'maxKey' : { '$maxKey' : 1 } }"); bson_destroy(b); } } // Test other cases referenced in the Extended JSON specification that sometimes encode differently. { // Code with scope { bson_t *scope = BCON_NEW("a", "b"); bson_t *b = BCON_NEW("codewscope", BCON_CODEWSCOPE("code", scope)); ASSERT_AS_JSON( b, BSON_JSON_MODE_CANONICAL, "{ 'codewscope' : { '$code' : 'code', '$scope' : { 'a' : 'b' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'codewscope' : { '$code' : 'code', '$scope' : { 'a' : 'b' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'codewscope' : { '$code' : 'code', '$scope' : { 'a' : 'b' } } }"); bson_destroy(scope); bson_destroy(b); } // Double NaN. { bson_t *b = BCON_NEW("double_nan", BCON_DOUBLE(NAN)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'double_nan' : { '$numberDouble' : 'NaN' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'double_nan' : { '$numberDouble' : 'NaN' } }"); // Legacy encoding is platform dependent. May encode to '[-]nan' or '[-]nan(n-char-sequence)' without quotes. { char *as_legacy = bson_as_legacy_extended_json(b, NULL); char *ptr = as_legacy; const char *expected_prefix = "{ \"double_nan\" : "; ASSERT_STARTSWITH(ptr, expected_prefix); ptr += strlen(expected_prefix); if (ptr[0] == '-') { ptr += 1; } ASSERT_STARTSWITH(ptr, "nan"); bson_free(as_legacy); } bson_destroy(b); } // Double Infinity. { bson_t *b = BCON_NEW("double_inf", BCON_DOUBLE(INFINITY)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'double_inf' : { '$numberDouble' : 'Infinity' } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'double_inf' : { '$numberDouble' : 'Infinity' } }"); // Legacy encoding is platform dependent. May encode to 'inf' or 'infinity' without quotes. { char *as_legacy = bson_as_legacy_extended_json(b, NULL); bool found_match = (0 == strcmp("{ \"double_inf\" : inf }", as_legacy)) || (0 == strcmp("{ \"double_inf\" : infinity }", as_legacy)); if (!found_match) { test_error("got unexpected Extended Legacy JSON: %s\n", as_legacy); } bson_free(as_legacy); } bson_destroy(b); } // Date before year 1970. { const char *date_str = "1969-01-01T00:00Z"; int64_t date_ms; ASSERT_OR_PRINT(_bson_iso8601_date_parse(date_str, (int32_t)strlen(date_str), &date_ms, &error), error); bson_t *b = BCON_NEW("date_before_1970", BCON_DATE_TIME(-1)); ASSERT_AS_JSON(b, BSON_JSON_MODE_CANONICAL, "{ 'date_before_1970' : { '$date' : { '$numberLong' : '-1' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_RELAXED, "{ 'date_before_1970' : { '$date' : { '$numberLong' : '-1' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'date_before_1970' : { '$date' : -1 } }"); bson_destroy(b); } // Date after year 9999 (excluding year 9999). { const int64_t msec_since_Y10K = 253402300800000; // Milliseconds since 10000-01-01T00:00:00Z. bson_t *b = BCON_NEW("date_after_9999", BCON_DATE_TIME(msec_since_Y10K)); ASSERT_AS_JSON( b, BSON_JSON_MODE_CANONICAL, "{ 'date_after_9999' : { '$date' : { '$numberLong' : '253402300800000' } } }"); ASSERT_AS_JSON( b, BSON_JSON_MODE_RELAXED, "{ 'date_after_9999' : { '$date' : { '$numberLong' : '253402300800000' } } }"); ASSERT_AS_JSON(b, BSON_JSON_MODE_LEGACY, "{ 'date_after_9999' : { '$date' : 253402300800000 } }"); bson_destroy(b); } } } void test_json_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/as_json/x1000", test_bson_as_json_x1000); TestSuite_Add(suite, "/bson/as_json/multi", test_bson_as_json_multi); TestSuite_Add(suite, "/bson/as_json/string", test_bson_as_json_string); TestSuite_Add(suite, "/bson/as_json/int32", test_bson_as_json_int32); TestSuite_Add(suite, "/bson/as_json/int64", test_bson_as_json_int64); TestSuite_Add(suite, "/bson/as_json/double", test_bson_as_json_double); TestSuite_Add(suite, "/bson/as_json/double/nonfinite", test_bson_as_json_double_nonfinite); TestSuite_Add(suite, "/bson/as_json/code", test_bson_as_json_code); TestSuite_Add(suite, "/bson/as_json/date_time", test_bson_as_json_date_time); TestSuite_Add(suite, "/bson/as_json/regex", test_bson_as_json_regex); TestSuite_Add(suite, "/bson/as_json/symbol", test_bson_as_json_symbol); TestSuite_Add(suite, "/bson/as_json/utf8", test_bson_as_json_utf8); TestSuite_Add(suite, "/bson/as_json/dbpointer", test_bson_as_json_dbpointer); TestSuite_Add(suite, "/bson/as_canonical_extended_json/dbpointer", test_bson_as_canonical_extended_json_dbpointer); TestSuite_Add(suite, "/bson/as_json/stack_overflow", test_bson_as_json_stack_overflow); TestSuite_Add(suite, "/bson/as_json/corrupt", test_bson_corrupt); TestSuite_Add(suite, "/bson/as_json/corrupt_utf8", test_bson_corrupt_utf8); TestSuite_Add(suite, "/bson/as_json/corrupt_binary", test_bson_corrupt_binary); TestSuite_Add(suite, "/bson/as_json_spacing", test_bson_as_json_spacing); TestSuite_Add(suite, "/bson/array_as_legacy_json", test_bson_array_as_legacy_json); TestSuite_Add(suite, "/bson/array_as_relaxed_json", test_bson_array_as_relaxed_json); TestSuite_Add(suite, "/bson/array_as_canonical_json", test_bson_array_as_canonical_json); TestSuite_Add(suite, "/bson/json/allow_multiple", test_bson_json_allow_multiple); TestSuite_Add(suite, "/bson/json/read/buffering", test_bson_json_read_buffering); TestSuite_Add(suite, "/bson/json/read", test_bson_json_read); TestSuite_Add(suite, "/bson/json/inc", test_bson_json_inc); TestSuite_Add(suite, "/bson/json/array", test_bson_json_array); TestSuite_Add(suite, "/bson/json/array/single", test_bson_json_array_single); TestSuite_Add(suite, "/bson/json/array/int64", test_bson_json_array_int64); TestSuite_Add(suite, "/bson/json/array/subdoc", test_bson_json_array_subdoc); TestSuite_Add(suite, "/bson/json/date", test_bson_json_date); TestSuite_Add(suite, "/bson/json/date/legacy", test_bson_json_date_legacy); TestSuite_Add(suite, "/bson/json/date/long", test_bson_json_date_numberlong); TestSuite_Add(suite, "/bson/json/timestamp", test_bson_json_timestamp); TestSuite_Add(suite, "/bson/json/read/empty", test_bson_json_read_empty); TestSuite_Add(suite, "/bson/json/read/missing_complex", test_bson_json_read_missing_complex); TestSuite_Add(suite, "/bson/json/read/invalid_binary", test_bson_json_read_invalid_binary); TestSuite_Add(suite, "/bson/json/read/invalid_json", test_bson_json_read_invalid_json); TestSuite_Add(suite, "/bson/json/read/bad_cb", test_bson_json_read_bad_cb); TestSuite_Add(suite, "/bson/json/read/invalid", test_bson_json_read_invalid); TestSuite_Add(suite, "/bson/json/read/invalid_base64", test_bson_json_read_invalid_base64); TestSuite_Add(suite, "/bson/json/read/raw_utf8", test_bson_json_read_raw_utf8); TestSuite_Add(suite, "/bson/json/read/corrupt_utf8", test_bson_json_read_corrupt_utf8); TestSuite_Add(suite, "/bson/json/read/corrupt_document", test_bson_json_read_corrupt_document); TestSuite_Add(suite, "/bson/json/read/decimal128", test_bson_json_read_decimal128); TestSuite_Add(suite, "/bson/json/read/dbpointer", test_bson_json_read_dbpointer); TestSuite_Add(suite, "/bson/json/read/legacy_regex", test_bson_json_read_legacy_regex); TestSuite_Add(suite, "/bson/json/read/regex_options_order", test_bson_json_read_regex_options_order); TestSuite_Add(suite, "/bson/json/read/binary", test_bson_json_read_binary); TestSuite_Add(suite, "/bson/json/read/legacy_binary", test_bson_json_read_legacy_binary); TestSuite_Add(suite, "/bson/json/read/file", test_json_reader_new_from_file); TestSuite_Add(suite, "/bson/json/read/bad_path", test_json_reader_new_from_bad_path); TestSuite_Add(suite, "/bson/json/read/$numberLong", test_bson_json_number_long); TestSuite_Add(suite, "/bson/json/read/$numberLong/zero", test_bson_json_number_long_zero); TestSuite_Add(suite, "/bson/json/read/code", test_bson_json_code); TestSuite_Add(suite, "/bson/json/read/code/errors", test_bson_json_code_errors); TestSuite_Add(suite, "/bson/json/read/dbref", test_bson_json_dbref); TestSuite_Add(suite, "/bson/json/read/uescape", test_bson_json_uescape); TestSuite_Add(suite, "/bson/json/read/uescape/key", test_bson_json_uescape_key); TestSuite_Add(suite, "/bson/json/read/uescape/bad", test_bson_json_uescape_bad); TestSuite_Add(suite, "/bson/json/read/int32", test_bson_json_int32); TestSuite_Add(suite, "/bson/json/read/int64", test_bson_json_int64); TestSuite_Add(suite, "/bson/json/read/double", test_bson_json_double); TestSuite_Add(suite, "/bson/json/read/double/overflow", test_bson_json_double_overflow); TestSuite_Add(suite, "/bson/json/read/double/nan", test_bson_json_nan); TestSuite_Add(suite, "/bson/json/read/double/infinity", test_bson_json_infinity); TestSuite_Add(suite, "/bson/json/read/null", test_bson_json_null); TestSuite_Add(suite, "/bson/json/read/empty_final", test_bson_json_empty_final_object); TestSuite_Add(suite, "/bson/as_json/decimal128", test_bson_as_json_decimal128); TestSuite_Add(suite, "/bson/json/read/$numberDecimal", test_bson_json_number_decimal); TestSuite_Add(suite, "/bson/json/errors", test_bson_json_errors); TestSuite_Add(suite, "/bson/integer/width", test_bson_integer_width); TestSuite_Add(suite, "/bson/json/read/null_in_str", test_bson_json_null_in_str); TestSuite_Add(suite, "/bson/json/read/merge_multiple", test_bson_json_merge_multiple); TestSuite_Add(suite, "/bson/json/read/extra_chars", test_bson_json_extra_chars); TestSuite_Add(suite, "/bson/as_json/multi_object", test_bson_as_json_multi_object); TestSuite_Add(suite, "/bson/as_json_with_opts/double", test_bson_as_json_with_opts_double); TestSuite_Add(suite, "/bson/as_json_with_opts/utf8", test_bson_as_json_with_opts_utf8); TestSuite_Add(suite, "/bson/as_json_with_opts/document", test_bson_as_json_with_opts_document); TestSuite_Add(suite, "/bson/as_json_with_opts/array", test_bson_as_json_with_opts_array); TestSuite_Add(suite, "/bson/as_json_with_opts/binary", test_bson_as_json_with_opts_binary); TestSuite_Add(suite, "/bson/as_json_with_opts/undefined", test_bson_as_json_with_opts_undefined); TestSuite_Add(suite, "/bson/as_json_with_opts/oid", test_bson_as_json_with_opts_oid); TestSuite_Add(suite, "/bson/as_json_with_opts/bool", test_bson_as_json_with_opts_bool); TestSuite_Add(suite, "/bson/as_json_with_opts/date_time", test_bson_as_json_with_opts_date_time); TestSuite_Add(suite, "/bson/as_json_with_opts/null", test_bson_as_json_with_opts_null); TestSuite_Add(suite, "/bson/as_json_with_opts/regex", test_bson_as_json_with_opts_regex); TestSuite_Add(suite, "/bson/as_json_with_opts/dbpointer", test_bson_as_json_with_opts_dbpointer); TestSuite_Add(suite, "/bson/as_json_with_opts/code", test_bson_as_json_with_opts_code); TestSuite_Add(suite, "/bson/as_json_with_opts/symbol", test_bson_as_json_with_opts_symbol); TestSuite_Add(suite, "/bson/as_json_with_opts/codewscope", test_bson_as_json_with_opts_codewscope); TestSuite_Add(suite, "/bson/as_json_with_opts/int32", test_bson_as_json_with_opts_int32); TestSuite_Add(suite, "/bson/as_json_with_opts/int64", test_bson_as_json_with_opts_int64); TestSuite_Add(suite, "/bson/as_json_with_opts/timestamp", test_bson_as_json_with_opts_timestamp); TestSuite_Add(suite, "/bson/as_json_with_opts/minkey", test_bson_as_json_with_opts_minkey); TestSuite_Add(suite, "/bson/as_json_with_opts/maxkey", test_bson_as_json_with_opts_maxkey); TestSuite_Add(suite, "/bson/as_json_with_opts/decimal128", test_bson_as_json_with_opts_decimal128); TestSuite_Add(suite, "/bson/as_json_with_opts/all_types", test_bson_as_json_with_opts_all_types); TestSuite_Add(suite, "/bson/as_json_with_opts/utf8_truncation", test_bson_as_json_with_opts_utf8_truncation); TestSuite_Add(suite, "/bson/parse_array", test_parse_array); TestSuite_Add(suite, "/bson/decimal128_overflowing_exponent", test_decimal128_overflowing_exponent); TestSuite_Add(suite, "/bson/as_json/all_formats", test_bson_as_json_all_formats); } mongo-c-driver-2.2.1/src/libbson/tests/test-oid.c000066400000000000000000000340461511661753600216430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define BSON_INSIDE #include #include #include #undef BSON_INSIDE #ifdef BSON_HAVE_STRINGS_H #include #endif #include #include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #define N_THREADS 4 static const char *gTestOids[] = {"000000000000000000000000", "010101010101010101010101", "0123456789abcdefafcdef03", "fcdeab182763817236817236", "ffffffffffffffffffffffff", "eeeeeeeeeeeeeeeeeeeeeeee", "999999999999999999999999", "111111111111111111111111", NULL}; static const char *gTestOidsCase[] = {"0123456789ABCDEFAFCDEF03", "FCDEAB182763817236817236", "FFFFFFFFFFFFFFFFFFFFFFFF", "EEEEEEEEEEEEEEEEEEEEEEEE", "01234567890ACBCDEFabcdef", NULL}; static const char *gTestOidsFail[] = {" ", "abasdf ", "asdfasdfasdfasdfasdf ", "00000000000000000000000z", "00187263123ghh21382812a8", NULL}; BSON_THREAD_FUN(oid_worker, data) { bson_context_t *context = data; bson_oid_t oid; bson_oid_t oid2; int i; bson_oid_init(&oid2, context); for (i = 0; i < 500000; i++) { bson_oid_init(&oid, context); BSON_ASSERT(false == bson_oid_equal(&oid, &oid2)); BSON_ASSERT(0 < bson_oid_compare(&oid, &oid2)); bson_oid_copy(&oid, &oid2); } BSON_THREAD_RETURN; } static void test_bson_oid_init_from_string(void) { bson_context_t *context; bson_oid_t oid; char str[25]; int i; context = bson_context_new(BSON_CONTEXT_NONE); /* * Test successfully parsed oids. */ for (i = 0; gTestOids[i]; i++) { bson_oid_init_from_string(&oid, gTestOids[i]); bson_oid_to_string(&oid, str); BSON_ASSERT(!strcmp(str, gTestOids[i])); } /* * Test successfully parsed oids (case-insensitive). */ for (i = 0; gTestOidsCase[i]; i++) { char oid_lower[25]; int j; bson_oid_init_from_string(&oid, gTestOidsCase[i]); bson_oid_to_string(&oid, str); BSON_ASSERT(!bson_strcasecmp(str, gTestOidsCase[i])); for (j = 0; gTestOidsCase[i][j]; j++) { oid_lower[j] = tolower(gTestOidsCase[i][j]); } oid_lower[24] = '\0'; BSON_ASSERT(!strcmp(str, oid_lower)); } /* * Test that sizeof(str) works (len of 25 with \0 instead of 24). */ BSON_ASSERT(bson_oid_is_valid("ffffffffffffffffffffffff", 24)); bson_oid_init_from_string(&oid, "ffffffffffffffffffffffff"); bson_oid_to_string(&oid, str); BSON_ASSERT(bson_oid_is_valid(str, sizeof str)); /* * Test the failures. */ for (i = 0; gTestOidsFail[i]; i++) { bson_oid_init_from_string(&oid, gTestOidsFail[i]); bson_oid_to_string(&oid, str); BSON_ASSERT(strcmp(str, gTestOidsFail[i])); } bson_context_destroy(context); } static void test_bson_oid_hash(void) { bson_oid_t oid; bson_oid_init_from_string(&oid, "000000000000000000000000"); BSON_ASSERT(bson_oid_hash(&oid) == 1487062149); } static void test_bson_oid_compare(void) { bson_oid_t oid; bson_oid_t oid2; bson_oid_init_from_string(&oid, "000000000000000000001234"); bson_oid_init_from_string(&oid2, "000000000000000000001234"); BSON_ASSERT(0 == bson_oid_compare(&oid, &oid2)); BSON_ASSERT(true == bson_oid_equal(&oid, &oid2)); bson_oid_init_from_string(&oid, "000000000000000000001234"); bson_oid_init_from_string(&oid2, "000000000000000000004321"); BSON_ASSERT(bson_oid_compare(&oid, &oid2) < 0); BSON_ASSERT(bson_oid_compare(&oid2, &oid) > 0); BSON_ASSERT(false == bson_oid_equal(&oid, &oid2)); } static void test_bson_oid_copy(void) { bson_oid_t oid; bson_oid_t oid2; bson_oid_init_from_string(&oid, "000000000000000000001234"); bson_oid_init_from_string(&oid2, "000000000000000000004321"); bson_oid_copy(&oid, &oid2); BSON_ASSERT(true == bson_oid_equal(&oid, &oid2)); } static void test_bson_oid_init(void) { bson_context_t *context; bson_oid_t oid; bson_oid_t oid2; int i; context = bson_context_new(BSON_CONTEXT_NONE); bson_oid_init(&oid, context); for (i = 0; i < 10000; i++) { bson_oid_init(&oid2, context); BSON_ASSERT(false == bson_oid_equal(&oid, &oid2)); BSON_ASSERT(0 > bson_oid_compare(&oid, &oid2)); bson_oid_copy(&oid2, &oid); } bson_context_destroy(context); /* * Test that the shared context works. */ bson_oid_init(&oid, NULL); BSON_ASSERT(bson_context_get_default()); } static char * get_time_as_string(const bson_oid_t *oid) { mcommon_string_append_t str; mcommon_string_new_as_append(&str); time_t time = bson_oid_get_time_t(oid); mcommon_iso8601_string_append(&str, time * 1000); return mcommon_string_from_append_destroy_with_steal(&str); } static void test_bson_oid_get_time_t(void) { bson_context_t *context; bson_oid_t oid; uint32_t start = (uint32_t)time(NULL); char *str; context = bson_context_new(BSON_CONTEXT_NONE); bson_oid_init(&oid, context); ASSERT_CMPUINT32((uint32_t)bson_oid_get_time_t(&oid), >=, start); ASSERT_CMPUINT32((uint32_t)bson_oid_get_time_t(&oid), <=, (uint32_t)time(NULL)); bson_oid_init_from_string(&oid, "000000000000000000000000"); str = get_time_as_string(&oid); ASSERT_CMPSTR(str, "1970-01-01T00:00:00Z"); bson_free(str); /* if time_t is a signed int32, then a negative value may be interpreted * as a negative date when printing. */ mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); if (sizeof(time_t) == 8) { mlib_diagnostic_pop(); bson_oid_init_from_string(&oid, "7FFFFFFF0000000000000000"); str = get_time_as_string(&oid); ASSERT_CMPSTR(str, "2038-01-19T03:14:07Z"); bson_free(str); bson_oid_init_from_string(&oid, "800000000000000000000000"); str = get_time_as_string(&oid); ASSERT_CMPSTR(str, "2038-01-19T03:14:08Z"); bson_free(str); bson_oid_init_from_string(&oid, "FFFFFFFF0000000000000000"); str = get_time_as_string(&oid); ASSERT_CMPSTR(str, "2106-02-07T06:28:15Z"); bson_free(str); } bson_context_destroy(context); } static void test_bson_oid_init_with_threads(void) { bson_context_t *context; int i; int r; { bson_context_flags_t flags = BSON_CONTEXT_NONE; bson_context_t *contexts[N_THREADS]; bson_thread_t threads[N_THREADS]; for (i = 0; i < N_THREADS; i++) { contexts[i] = bson_context_new(flags); r = mcommon_thread_create(&threads[i], oid_worker, contexts[i]); BSON_ASSERT(r == 0); } for (i = 0; i < N_THREADS; i++) { mcommon_thread_join(threads[i]); } for (i = 0; i < N_THREADS; i++) { bson_context_destroy(contexts[i]); } } /* * Test threaded generation of oids using a single context; */ { bson_thread_t threads[N_THREADS]; context = bson_context_new(BSON_CONTEXT_THREAD_SAFE); for (i = 0; i < N_THREADS; i++) { r = mcommon_thread_create(&threads[i], oid_worker, context); BSON_ASSERT(r == 0); } for (i = 0; i < N_THREADS; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_context_destroy(context); } } static void test_bson_oid_counter_overflow(void) { bson_oid_t oid; char str[25]; bson_context_t *ctx = bson_context_new(BSON_CONTEXT_NONE); ctx->seq32 = 0xFFFFFF; bson_oid_init(&oid, ctx); bson_oid_to_string(&oid, str); /* check that the counter portion of the string is FFFFFF" */ ASSERT_CMPSTR(str + (24 - 6), "ffffff"); bson_oid_init(&oid, ctx); /* the next oid should have overflowed the counter. */ bson_oid_to_string(&oid, str); ASSERT_CMPSTR(str + (24 - 6), "000000"); bson_context_destroy(ctx); } #ifndef _WIN32 #include typedef struct { uint32_t timestamp; /* timestamp */ uint64_t rand; /* only really 5 bytes */ uint32_t counter; /* only really 3 bytes */ } _parsed_oid_t; /* parse an oid into parts usable for comparison. */ static void _parse_oid(bson_oid_t *oid, _parsed_oid_t *out) { memset(out, 0, sizeof(_parsed_oid_t)); memcpy(&out->timestamp, oid->bytes, 4); out->timestamp = BSON_UINT32_FROM_BE(out->timestamp); /* rand_bytes is 5 bytes starting at index 4. Read all of it into an 8 byte * uint64_t * and chop off the extra 3 bytes. */ memcpy(&out->rand, oid->bytes + 1, 8); out->rand = BSON_UINT64_FROM_BE(out->rand) & 0x000000FFFFFFFFFF; /* counter is 3 bytes. Read four bytes and chop off extra 1. */ memcpy(&out->counter, oid->bytes + 8, 4); out->counter = BSON_UINT32_FROM_BE(out->counter) & 0x00FFFFFF; } /* Only test where fork() is available. Does not exercise platform specific * code. */ static void test_bson_oid_after_fork(void) { bson_context_t *ctx; bson_oid_t parent_oid, self_check; _parsed_oid_t parent_parsed, self_check_parsed; pid_t pid; int child_exit_status = 0; /* a self check of the parsing utility. */ bson_oid_init_from_string(&self_check, "AAAAAAAABBBBBBBBBBCCCCCC"); _parse_oid(&self_check, &self_check_parsed); ASSERT_CMPUINT32(self_check_parsed.timestamp, ==, 0xAAAAAAAA); ASSERT_CMPUINT64(self_check_parsed.rand, ==, 0x000000BBBBBBBBBB); ASSERT_CMPUINT32(self_check_parsed.counter, ==, 0x00CCCCCC); bson_oid_init(&parent_oid, bson_context_get_default()); _parse_oid(&parent_oid, &parent_parsed); pid = fork(); if (pid == 0) { bson_oid_t child_oid, child_2_oid; _parsed_oid_t child_parsed, child_2_parsed; bson_oid_init(&child_oid, bson_context_get_default()); _parse_oid(&child_oid, &child_parsed); ASSERT_CMPUINT64(child_parsed.rand, !=, parent_parsed.rand); ASSERT_CMPUINT32(child_parsed.counter, ==, parent_parsed.counter + 1); BSON_ASSERT(0 != bson_oid_compare(&parent_oid, &child_oid)); /* but a different OID gets the same random bytes. */ bson_oid_init(&child_2_oid, bson_context_get_default()); _parse_oid(&child_2_oid, &child_2_parsed); ASSERT_CMPUINT64(child_2_parsed.rand, !=, parent_parsed.rand); ASSERT_CMPUINT64(child_2_parsed.rand, ==, child_parsed.rand); ASSERT_CMPUINT32(child_2_parsed.counter, ==, child_parsed.counter + 1); BSON_ASSERT(0 != bson_oid_compare(&child_oid, &child_2_oid)); exit(0); } else { bson_oid_t parent_2_oid; _parsed_oid_t parent_2_parsed; BSON_ASSERT(-1 != waitpid(pid, &child_exit_status, 0 /* opts */)); BSON_ASSERT(child_exit_status == 0); /* but initializing another OID in the parent does *not* change random * bytes. */ bson_oid_init(&parent_2_oid, bson_context_get_default()); _parse_oid(&parent_2_oid, &parent_2_parsed); ASSERT_CMPUINT64(parent_2_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32(parent_2_parsed.counter, ==, parent_parsed.counter + 1); } /* now test with PID caching enabled. */ ctx = bson_context_new(BSON_CONTEXT_NONE); bson_oid_init(&parent_oid, ctx); _parse_oid(&parent_oid, &parent_parsed); pid = fork(); if (pid == 0) { bson_oid_t child_oid; _parsed_oid_t child_parsed; bson_oid_init(&child_oid, ctx); _parse_oid(&child_oid, &child_parsed); /* since PID is cached, random value does not get regenerated. */ ASSERT_CMPUINT64(child_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32(child_parsed.counter, ==, parent_parsed.counter + 1); BSON_ASSERT(0 != bson_oid_compare(&parent_oid, &child_oid)); exit(0); } else { bson_oid_t parent_2_oid; _parsed_oid_t parent_2_parsed; BSON_ASSERT(-1 != waitpid(pid, &child_exit_status, 0 /* opts */)); BSON_ASSERT(child_exit_status == 0); /* but initializing another OID in the parent does *not* change random * bytes. */ bson_oid_init(&parent_2_oid, ctx); _parse_oid(&parent_2_oid, &parent_2_parsed); ASSERT_CMPUINT64(parent_2_parsed.rand, ==, parent_parsed.rand); ASSERT_CMPUINT32(parent_2_parsed.counter, ==, parent_parsed.counter + 1); } bson_context_destroy(ctx); } #endif void test_oid_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/oid/init", test_bson_oid_init); TestSuite_Add(suite, "/bson/oid/init_from_string", test_bson_oid_init_from_string); TestSuite_Add(suite, "/bson/oid/init_with_threads", test_bson_oid_init_with_threads); TestSuite_Add(suite, "/bson/oid/hash", test_bson_oid_hash); TestSuite_Add(suite, "/bson/oid/compare", test_bson_oid_compare); TestSuite_Add(suite, "/bson/oid/copy", test_bson_oid_copy); TestSuite_Add(suite, "/bson/oid/get_time_t", test_bson_oid_get_time_t); TestSuite_Add(suite, "/bson/oid/counter_overflow", test_bson_oid_counter_overflow); #ifndef _WIN32 if (!TestSuite_NoFork(suite)) { TestSuite_Add(suite, "/bson/oid/after_fork", test_bson_oid_after_fork); } #endif } mongo-c-driver-2.2.1/src/libbson/tests/test-reader.c000066400000000000000000000171701511661753600223310ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include static void test_reader_from_data(void) { bson_reader_t *reader; uint8_t *buffer; const bson_t *b; uint32_t i; bool eof = false; buffer = bson_malloc0(4095); for (i = 0; i < 4095; i += 5) { buffer[i] = 5; } reader = bson_reader_new_from_data(buffer, 4095); for (i = 0; (b = bson_reader_read(reader, &eof)); i++) { const uint8_t *buf = bson_get_data(b); /* do nothing */ BSON_ASSERT(b->len == 5); BSON_ASSERT(buf[0] == 5); BSON_ASSERT(buf[1] == 0); BSON_ASSERT(buf[2] == 0); BSON_ASSERT(buf[3] == 0); BSON_ASSERT(buf[4] == 0); } BSON_ASSERT(i == (4095 / 5)); ASSERT_CMPINT(eof, ==, true); bson_free(buffer); bson_reader_destroy(reader); } static void test_reader_from_data_overflow(void) { bson_reader_t *reader; uint8_t *buffer; const bson_t *b; uint32_t i; bool eof = false; buffer = bson_malloc0(4096); for (i = 0; i < 4095; i += 5) { buffer[i] = 5; } buffer[4095] = 5; reader = bson_reader_new_from_data(buffer, 4096); for (i = 0; (b = bson_reader_read(reader, &eof)); i++) { const uint8_t *buf = bson_get_data(b); BSON_ASSERT(b->len == 5); BSON_ASSERT(buf[0] == 5); BSON_ASSERT(buf[1] == 0); BSON_ASSERT(buf[2] == 0); BSON_ASSERT(buf[3] == 0); BSON_ASSERT(buf[4] == 0); eof = false; } BSON_ASSERT(i == (4095 / 5)); ASSERT_CMPINT(eof, ==, false); bson_free(buffer); bson_reader_destroy(reader); } static void test_reader_from_data_document_length_too_large(void) { bson_reader_t *reader; uint8_t *buffer; bool eof = false; buffer = bson_malloc0(5); buffer[0] = 6; reader = bson_reader_new_from_data(buffer, 5); BSON_ASSERT(!bson_reader_read(reader, &eof)); ASSERT_CMPINT(eof, ==, false); bson_free(buffer); bson_reader_destroy(reader); } static void test_reader_from_data_document_length_too_small(void) { bson_reader_t *reader; uint8_t *buffer; bool eof = false; buffer = bson_malloc0(5); buffer[0] = 4; reader = bson_reader_new_from_data(buffer, 5); BSON_ASSERT(!bson_reader_read(reader, &eof)); ASSERT_CMPINT(eof, ==, false); bson_free(buffer); bson_reader_destroy(reader); } static ssize_t test_reader_from_handle_read(void *handle, void *buf, size_t len) { return bson_read(*(int *)handle, buf, len); } static void test_reader_from_handle_destroy(void *handle) { bson_close(*(int *)handle); } static void test_reader_from_handle(void) { bson_reader_t *reader; const bson_t *b; bson_iter_t iter; uint32_t i; bool eof = true; int fd; fd = bson_open(BSON_BINARY_DIR "/stream.bson", O_RDONLY); BSON_ASSERT(-1 != fd); reader = bson_reader_new_from_handle((void *)&fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { eof = false; b = bson_reader_read(reader, &eof); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); } ASSERT_CMPINT(eof, ==, false); b = bson_reader_read(reader, &eof); BSON_ASSERT(!b); ASSERT_CMPINT(eof, ==, true); bson_reader_destroy(reader); } static void test_reader_tell(void) { bson_reader_t *reader; const bson_t *b; uint32_t i; bson_iter_t iter; bool eof = true; int fd; fd = bson_open(BSON_BINARY_DIR "/stream.bson", O_RDONLY); BSON_ASSERT(-1 != fd); reader = bson_reader_new_from_handle((void *)&fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { if (i) { ASSERT_CMPINT(5 * i, ==, (int)bson_reader_tell(reader)); } else { ASSERT_CMPINT(0, ==, (int)bson_reader_tell(reader)); } eof = false; b = bson_reader_read(reader, &eof); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); } ASSERT_CMPINT(5000, ==, (int)bson_reader_tell(reader)); ASSERT(!eof); b = bson_reader_read(reader, &eof); BSON_ASSERT(!b); BSON_ASSERT(eof); bson_reader_destroy(reader); } static void test_reader_from_handle_corrupt(void) { bson_reader_t *reader; const bson_t *b; uint32_t i; bson_iter_t iter; bool eof; int fd; fd = bson_open(BSON_BINARY_DIR "/stream_corrupt.bson", O_RDONLY); BSON_ASSERT(-1 != fd); reader = bson_reader_new_from_handle((void *)&fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); for (i = 0; i < 1000; i++) { b = bson_reader_read(reader, &eof); BSON_ASSERT(b); BSON_ASSERT(bson_iter_init(&iter, b)); BSON_ASSERT(!bson_iter_next(&iter)); } b = bson_reader_read(reader, &eof); BSON_ASSERT(!b); bson_reader_destroy(reader); } static void test_reader_grow_buffer(void) { bson_reader_t *reader; const bson_t *b; bool eof = false; int fd; fd = bson_open(BSON_BINARY_DIR "/readergrow.bson", O_RDONLY); BSON_ASSERT(-1 != fd); reader = bson_reader_new_from_handle((void *)&fd, &test_reader_from_handle_read, &test_reader_from_handle_destroy); b = bson_reader_read(reader, &eof); BSON_ASSERT(b); BSON_ASSERT(!eof); b = bson_reader_read(reader, &eof); BSON_ASSERT(!b); BSON_ASSERT(eof); bson_reader_destroy(reader); } static void test_reader_reset(void) { uint8_t buffer[10]; bson_reader_t *reader; bool eof; memset(buffer, 0, sizeof buffer); /* two empty bson documents, length prefix indicates 5 bytes */ buffer[0] = buffer[5] = 5; reader = bson_reader_new_from_data(buffer, sizeof buffer); BSON_ASSERT(bson_reader_read(reader, &eof)->len == 5 && !eof); BSON_ASSERT(bson_reader_read(reader, &eof)->len == 5 && !eof); BSON_ASSERT(!bson_reader_read(reader, &eof) && eof); BSON_ASSERT(bson_reader_tell(reader) == 10); bson_reader_reset(reader); BSON_ASSERT(bson_reader_tell(reader) == 0); BSON_ASSERT(bson_reader_read(reader, &eof)->len == 5 && !eof); BSON_ASSERT(bson_reader_read(reader, &eof)->len == 5 && !eof); BSON_ASSERT(!bson_reader_read(reader, &eof) && eof); BSON_ASSERT(bson_reader_tell(reader) == 10); bson_reader_destroy(reader); } void test_reader_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/reader/new_from_data", test_reader_from_data); TestSuite_Add(suite, "/bson/reader/new_from_data_overflow", test_reader_from_data_overflow); TestSuite_Add( suite, "/bson/reader/new_from_data_document_length_too_large", test_reader_from_data_document_length_too_large); TestSuite_Add( suite, "/bson/reader/new_from_data_document_length_too_small", test_reader_from_data_document_length_too_small); TestSuite_Add(suite, "/bson/reader/new_from_handle", test_reader_from_handle); TestSuite_Add(suite, "/bson/reader/tell", test_reader_tell); TestSuite_Add(suite, "/bson/reader/new_from_handle_corrupt", test_reader_from_handle_corrupt); TestSuite_Add(suite, "/bson/reader/grow_buffer", test_reader_grow_buffer); TestSuite_Add(suite, "/bson/reader/reset", test_reader_reset); } mongo-c-driver-2.2.1/src/libbson/tests/test-string.c000066400000000000000000000160051511661753600223710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include static void test_bson_strdup_printf(void) { char *s; s = bson_strdup_printf("%s:%d", "localhost", 27017); BSON_ASSERT(!strcmp(s, "localhost:27017")); bson_free(s); } static void test_bson_strdup(void) { char *s; s = bson_strdup("localhost:27017"); BSON_ASSERT(!strcmp(s, "localhost:27017")); bson_free(s); } static void test_bson_strndup(void) { char *s; s = bson_strndup("asdf", 2); BSON_ASSERT(!strcmp(s, "as")); bson_free(s); s = bson_strndup("asdf", 10); BSON_ASSERT(!strcmp(s, "asdf")); bson_free(s); /* Some tests where we truncate to size n-1, n, n+1 */ s = bson_strndup("asdf", 3); BSON_ASSERT(!strcmp(s, "asd")); bson_free(s); s = bson_strndup("asdf", 4); BSON_ASSERT(!strcmp(s, "asdf")); bson_free(s); s = bson_strndup("asdf", 5); BSON_ASSERT(!strcmp(s, "asdf")); bson_free(s); } static void test_bson_strnlen(void) { char *s = "test"; ASSERT_CMPINT((int)strlen(s), ==, (int)bson_strnlen(s, 100)); } typedef struct { const char *str; int base; int64_t rv; const char *remaining; int _errno; } strtoll_test; static void test_bson_ascii_strtoll(void) { #ifdef END #undef END #endif #define END "" int64_t rv; int i; char *endptr; strtoll_test tests[] = {/* input, base, expected output, # of chars parsed, expected errno */ {"1", 10, 1, END, 0}, {"+1", 10, 1, END, 0}, {"-1", 10, -1, END, 0}, {"0", 10, 0, END, 0}, {"0 ", 10, 0, " ", 0}, {" 0 ", 10, 0, " ", 0}, {" 0", 10, 0, END, 0}, {" 0\"", 10, 0, "\"", 0}, {"0l", 10, 0, "l", 0}, {"0l ", 10, 0, "l ", 0}, {"0u", 10, 0, "u", 0}, {"0u ", 10, 0, "u ", 0}, {"0L", 10, 0, "L", 0}, {"0L ", 10, 0, "L ", 0}, {"0U", 10, 0, "U", 0}, {"0U ", 10, 0, "U ", 0}, {"-0", 10, 0, END, 0}, {"+0", 10, 0, END, 0}, {"010", 8, 8, END, 0}, /* stroll "takes as many characters as possible to form a valid base-n * integer", so it ignores "8" and returns 0 */ {"08", 0, 0, "8", 0}, {"010", 10, 10, END, 0}, {"010", 8, 8, END, 0}, {"010", 0, 8, END, 0}, {"68719476736", 10, 68719476736, END, 0}, {"-68719476736", 10, -68719476736, END, 0}, {"+68719476736", 10, 68719476736, END, 0}, {" 68719476736 ", 10, 68719476736, " ", 0}, {" 68719476736 ", 0, 68719476736, " ", 0}, {" -68719476736 ", 10, -68719476736, " ", 0}, {" -68719476736 ", 0, -68719476736, " ", 0}, {" 4611686018427387904LL", 10, 4611686018427387904LL, "LL", 0}, {" -4611686018427387904LL ", 10, -4611686018427387904LL, "LL ", 0}, {"0x1000000000", 16, 68719476736, END, 0}, {"0x1000000000", 0, 68719476736, END, 0}, {"-0x1000000000", 16, -68719476736, END, 0}, {"-0x1000000000", 0, -68719476736, END, 0}, {"+0x1000000000", 16, 68719476736, END, 0}, {"+0x1000000000", 0, 68719476736, END, 0}, {"01234", 8, 668, END, 0}, {"01234", 0, 668, END, 0}, {"-01234", 8, -668, END, 0}, {"-01234", 0, -668, END, 0}, {"+01234", 8, 668, END, 0}, {"+01234", 0, 668, END, 0}, {"9223372036854775807", 10, INT64_MAX, END, 0}, {"-9223372036854775808", 10, INT64_MIN, END, 0}, {"9223372036854775808", 10, INT64_MAX, "8", ERANGE}, /* LLONG_MAX+1 */ {"-9223372036854775809", 10, INT64_MIN, "9", ERANGE}, /* LLONG_MIN-1 */ {"18446744073709551615", 10, INT64_MAX, "5", ERANGE}, /* 2*LLONG_MAX+1 */ {"-18446744073709551618", 10, INT64_MIN, "8", ERANGE}, /* 2*LLONG_MIN-1 */ {NULL}}; for (i = 0; tests[i].str; i++) { errno = 0; rv = bson_ascii_strtoll(tests[i].str, &endptr, tests[i].base); ASSERT_CMPINT64(rv, ==, tests[i].rv); ASSERT_CMPINT(errno, ==, tests[i]._errno); ASSERT_CMPSTR(endptr, tests[i].remaining); } #undef END } static void test_bson_strncpy(void) { char buf[5]; bson_strncpy(buf, "foo", sizeof buf); ASSERT_CMPSTR("foo", buf); bson_strncpy(buf, "foobar", sizeof buf); ASSERT_CMPSTR("foob", buf); /* CDRIVER-2596 make sure strncpy with size 0 doesn't write to buf[-1] */ bson_strncpy(buf + 1, "z", 0); ASSERT_CMPSTR("foob", buf); } static void test_bson_snprintf(void) { char buf[] = "ab"; /* CDRIVER-2595 make sure snprintf with size 0 doesn't write to buf[-1] */ ASSERT_CMPINT(bson_snprintf(buf + 1, 0, "%d", 1), ==, 0); ASSERT_CMPSTR(buf, "ab"); } static void test_bson_strcasecmp(void) { BSON_ASSERT(!bson_strcasecmp("FoO", "foo")); BSON_ASSERT(bson_strcasecmp("Foa", "foo") < 0); BSON_ASSERT(bson_strcasecmp("FoZ", "foo") > 0); } void test_string_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/string/strdup", test_bson_strdup); TestSuite_Add(suite, "/bson/string/strdup_printf", test_bson_strdup_printf); TestSuite_Add(suite, "/bson/string/strndup", test_bson_strndup); TestSuite_Add(suite, "/bson/string/ascii_strtoll", test_bson_ascii_strtoll); TestSuite_Add(suite, "/bson/string/strncpy", test_bson_strncpy); TestSuite_Add(suite, "/bson/string/snprintf", test_bson_snprintf); TestSuite_Add(suite, "/bson/string/strnlen", test_bson_strnlen); TestSuite_Add(suite, "/bson/string/strcasecmp", test_bson_strcasecmp); } mongo-c-driver-2.2.1/src/libbson/tests/test-utf8.c000066400000000000000000000233531511661753600217550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void test_bson_utf8_validate(void) { static const unsigned char test1[] = {0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, 0}; static const unsigned char test2[] = {0xc0, 0x80, 0}; static const unsigned char out_of_bound[] = {0xfd, 0x9f, 0xb0, 0x80, 0x80, 0x80, 0}; static const unsigned char bad[] = {0xed, 0xa0, 0xa5, 0}; BSON_ASSERT(bson_utf8_validate("asdf", 4, false)); BSON_ASSERT(bson_utf8_validate("asdf", 4, true)); BSON_ASSERT(bson_utf8_validate("asdf", 5, true)); BSON_ASSERT(!bson_utf8_validate("asdf", 5, false)); BSON_ASSERT(bson_utf8_validate((const char *)test1, 11, true)); BSON_ASSERT(bson_utf8_validate((const char *)test1, 11, false)); BSON_ASSERT(bson_utf8_validate((const char *)test1, 12, true)); BSON_ASSERT(!bson_utf8_validate((const char *)test1, 12, false)); BSON_ASSERT(bson_utf8_validate((const char *)test2, 2, true)); BSON_ASSERT(!bson_utf8_validate((const char *)test2, 2, false)); /* * This character is allowed in 6-byte-sequence UTF-8 standard but seen as * out of bound in 4-byte-sequence UTF-8 standard (RFC 3629). */ BSON_ASSERT(!bson_utf8_validate((const char *)out_of_bound, 1, true)); BSON_ASSERT(!bson_utf8_validate((const char *)out_of_bound, 1, false)); /* * Some UTF-8 code points are prohibited to match the constraints of * the UTF-16 character encoding (RFC 3629). */ BSON_ASSERT(!bson_utf8_validate((const char *)bad, 1, true)); BSON_ASSERT(!bson_utf8_validate((const char *)bad, 1, false)); } static void test_bson_utf8_escape_for_json(void) { char *str; char *unescaped = "\x0e"; str = bson_utf8_escape_for_json("my\0key", 6); ASSERT_CMPSTR(str, "my\\u0000key"); bson_free(str); str = bson_utf8_escape_for_json("my\xc0\x80key", 7); ASSERT_CMPSTR(str, "my\\u0000key"); bson_free(str); str = bson_utf8_escape_for_json("my\"key", 6); ASSERT_CMPSTR(str, "my\\\"key"); bson_free(str); str = bson_utf8_escape_for_json("my\\key", 6); ASSERT_CMPSTR(str, "my\\\\key"); bson_free(str); str = bson_utf8_escape_for_json("\\\"\\\"", -1); ASSERT_CMPSTR(str, "\\\\\\\"\\\\\\\""); bson_free(str); str = bson_utf8_escape_for_json(unescaped, -1); ASSERT_CMPSTR(str, "\\u000e"); bson_free(str); // 2 bytes expected { str = bson_utf8_escape_for_json("\xc2", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xc3\xa9", -1); ASSERT_CMPSTR(str, "é"); bson_free(str); } // 3 bytes expected { str = bson_utf8_escape_for_json("\xed", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xed\x90", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xe4\xb8\xad", -1); ASSERT_CMPSTR(str, "中"); bson_free(str); } // 4 bytes expected { str = bson_utf8_escape_for_json("\xf0", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xf0\x9f", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xf0\x9f\x9f", -1); ASSERT(!str); str = bson_utf8_escape_for_json("\xf0\xa0\x9c\x8f", -1); ASSERT_CMPSTR(str, "ð œ"); bson_free(str); } // Normal strings { str = bson_utf8_escape_for_json("this is a normal string", -1); ASSERT_CMPSTR(str, "this is a normal string"); bson_free(str); str = bson_utf8_escape_for_json("this is a normal string", 23); ASSERT_CMPSTR(str, "this is a normal string"); bson_free(str); str = bson_utf8_escape_for_json("this is a normal string", 10); ASSERT_CMPSTR(str, "this is a "); bson_free(str); } } static void test_bson_utf8_invalid(void) { /* no UTF-8 sequence can start with 0x80 */ static const unsigned char bad[] = {0x80, 0}; BSON_ASSERT(!bson_utf8_validate((const char *)bad, 1, true)); BSON_ASSERT(!bson_utf8_validate((const char *)bad, 1, false)); BSON_ASSERT(!bson_utf8_escape_for_json((const char *)bad, 1)); } static void test_bson_utf8_nil(void) { static const unsigned char test[] = {'a', 0, 'b', 0}; char *str; BSON_ASSERT(bson_utf8_validate((const char *)test, 3, true)); BSON_ASSERT(!bson_utf8_validate((const char *)test, 3, false)); /* no length provided, stop at first nil */ str = bson_utf8_escape_for_json((const char *)test, -1); ASSERT_CMPSTR("a", str); bson_free(str); str = bson_utf8_escape_for_json((const char *)test, 3); ASSERT_CMPSTR("a\\u0000b", str); bson_free(str); } static void test_bson_utf8_get_char(void) { static const char *test1 = "asdf"; static const unsigned char test2[] = {0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, ' ', 0xe2, 0x82, 0xac, 0}; const char *c; c = test1; BSON_ASSERT(bson_utf8_get_char(c) == 'a'); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == 's'); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == 'd'); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == 'f'); c = bson_utf8_next_char(c); BSON_ASSERT(!*c); c = (const char *)test2; BSON_ASSERT(bson_utf8_get_char(c) == 0x20AC); c = bson_utf8_next_char(c); BSON_ASSERT(c == (const char *)test2 + 3); BSON_ASSERT(bson_utf8_get_char(c) == ' '); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == 0x20AC); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == ' '); c = bson_utf8_next_char(c); BSON_ASSERT(bson_utf8_get_char(c) == 0x20AC); c = bson_utf8_next_char(c); BSON_ASSERT(!*c); } static void test_bson_utf8_from_unichar(void) { static const char test1[] = {'a'}; static const unsigned char test2[] = {0xc3, 0xbf}; static const unsigned char test3[] = {0xe2, 0x82, 0xac}; uint32_t len; char str[6]; /* * First possible sequence of a certain length. */ bson_utf8_from_unichar(0, str, &len); BSON_ASSERT(len == 1); bson_utf8_from_unichar(0x00000080, str, &len); BSON_ASSERT(len == 2); bson_utf8_from_unichar(0x00000800, str, &len); BSON_ASSERT(len == 3); bson_utf8_from_unichar(0x00010000, str, &len); BSON_ASSERT(len == 4); /* * Last possible sequence of a certain length. */ bson_utf8_from_unichar(0x0000007F, str, &len); BSON_ASSERT(len == 1); bson_utf8_from_unichar(0x000007FF, str, &len); BSON_ASSERT(len == 2); bson_utf8_from_unichar(0x0000FFFF, str, &len); BSON_ASSERT(len == 3); bson_utf8_from_unichar(0x0010FFFF, str, &len); BSON_ASSERT(len == 4); /* * Other interesting values. */ bson_utf8_from_unichar(0x0000D7FF, str, &len); BSON_ASSERT(len == 3); bson_utf8_from_unichar(0x0000E000, str, &len); BSON_ASSERT(len == 3); bson_utf8_from_unichar(0x0000FFFD, str, &len); BSON_ASSERT(len == 3); bson_utf8_from_unichar(0x0010EFFF, str, &len); BSON_ASSERT(len == 4); bson_utf8_from_unichar(0x00110000, str, &len); BSON_ASSERT(len == 4); bson_utf8_from_unichar('a', str, &len); BSON_ASSERT(len == 1); BSON_ASSERT(!memcmp(test1, str, 1)); bson_utf8_from_unichar(0xFF, str, &len); BSON_ASSERT(len == 2); BSON_ASSERT(!memcmp((const char *)test2, str, 2)); bson_utf8_from_unichar(0x20AC, str, &len); BSON_ASSERT(len == 3); BSON_ASSERT(!memcmp((const char *)test3, str, 3)); } static void test_bson_utf8_non_shortest(void) { static const char *tests[] = {"\xE0\x80\x80", /* Non-shortest form representation of U+0000 */ "\xF0\x80\x80\x80", /* Non-shortest form representation of U+0000 */ "\xE0\x83\xBF", /* Non-shortest form representation of U+00FF */ "\xF0\x80\x83\xBF", /* Non-shortest form representation of U+00FF */ "\xF0\x80\xA3\x80", /* Non-shortest form representation of U+08C0 */ NULL}; static const char *valid_tests[] = {"\xC0\x80", /* Non-shortest form representation of U+0000. * This is how \0 should be encoded. Special casing * to allow for use in things like strlen(). */ NULL}; int i; for (i = 0; tests[i]; i++) { if (bson_utf8_validate(tests[i], strlen(tests[i]), false)) { fprintf(stderr, "non-shortest form failure, test %d\n", i); BSON_ASSERT(false); } } for (i = 0; valid_tests[i]; i++) { if (!bson_utf8_validate(valid_tests[i], strlen(valid_tests[i]), true)) { fprintf(stderr, "non-shortest form failure, valid_tests %d\n", i); BSON_ASSERT(false); } } } void test_utf8_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/utf8/validate", test_bson_utf8_validate); TestSuite_Add(suite, "/bson/utf8/invalid", test_bson_utf8_invalid); TestSuite_Add(suite, "/bson/utf8/nil", test_bson_utf8_nil); TestSuite_Add(suite, "/bson/utf8/escape_for_json", test_bson_utf8_escape_for_json); TestSuite_Add(suite, "/bson/utf8/get_char_next_char", test_bson_utf8_get_char); TestSuite_Add(suite, "/bson/utf8/from_unichar", test_bson_utf8_from_unichar); TestSuite_Add(suite, "/bson/utf8/non_shortest", test_bson_utf8_non_shortest); } mongo-c-driver-2.2.1/src/libbson/tests/test-validate.generated.c000066400000000000000000003000121511661753600246030ustar00rootroot00000000000000// ! This code is GENERATED! Do not edit it directly! // clang-format off #include #include #include // ! This code is GENERATED! Do not edit it directly! // Case: empty static inline void _test_case_empty(void) { /** * Test a simple empty document object. */ const uint8_t bytes[] = { 5, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: bad-element static inline void _test_case_bad_element(void) { /** * The element content is not valid */ const uint8_t bytes[] = { 6, 0, 0, 0, 'f', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 6); } // ! This code is GENERATED! Do not edit it directly! // Case: invalid-type static inline void _test_case_invalid_type(void) { /** * The type tag "0x0e" is not a valid type */ const uint8_t bytes[] = { 0x0d, 0, 0, 0, 0x0e, 'f', 'o', 'o', 0, 'f', 'o', 'o', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: key/invalid/accept static inline void _test_case_key_invalid_accept(void) { /** * The element key contains an invalid UTF-8 byte, but we accept it * because we aren't doing UTF-8 validation. */ const uint8_t bytes[] = { 0x28, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, 'f', 'o', 'o', 0xff, 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 2, 'c', 0, 2, 0, 0, 0, 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/invalid/reject static inline void _test_case_key_invalid_reject(void) { /** * The element key is not valid UTF-8 and we reject it when we do UTF-8 * validation. */ const uint8_t bytes[] = { 0x28, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, 'f', 'o', 'o', 0xff, 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 2, 'c', 0, 2, 0, 0, 0, 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: key/empty/accept static inline void _test_case_key_empty_accept(void) { /** * The element has an empty string key, and we accept this. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, 0, 7, 0, 0, 0, 's', 't', 'r', 'i', 'n', 'g', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/empty/reject static inline void _test_case_key_empty_reject(void) { /** * The element has an empty key, and we can reject it. */ const uint8_t bytes[] = { 0x1b, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, 0, 7, 0, 0, 0, 's', 't', 'r', 'i', 'n', 'g', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_EMPTY_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_EMPTY_KEYS); mlib_check(error.message, str_eq, "Element key cannot be an empty string"); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: key/empty/accept-if-absent static inline void _test_case_key_empty_accept_if_absent(void) { /** * We are checking for empty keys, and accept if they are absent. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_EMPTY_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dot/accept static inline void _test_case_key_dot_accept(void) { /** * The element key has an ASCII dot, and we accept this since we don't * ask to validate it. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'f', 'o', 'o', '.', 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_EMPTY_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dot/reject static inline void _test_case_key_dot_reject(void) { /** * The element has an ASCII dot, and we reject it when we ask to validate * it. */ const uint8_t bytes[] = { 0x1f, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, 'f', 'o', 'o', '.', 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOT_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOT_KEYS); mlib_check(error.message, str_eq, "Disallowed '.' in element key: \"foo.bar\""); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dot/accept-if-absent static inline void _test_case_key_dot_accept_if_absent(void) { /** * We are checking for keys with dot '.', and accept if they are absent. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOT_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dollar/accept static inline void _test_case_key_dollar_accept(void) { /** * We can accept an element key that starts with a dollar '$' sign. */ const uint8_t bytes[] = { 0x1c, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, '$', 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dollar/reject static inline void _test_case_key_dollar_reject(void) { /** * We can reject an element key that starts with a dollar '$' sign. */ const uint8_t bytes[] = { 0x1c, 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 2, '$', 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Disallowed '$' in element key: \"$foo\""); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dollar/accept-in-middle static inline void _test_case_key_dollar_accept_in_middle(void) { /** * This contains a element key "foo$bar", but we don't reject this, as we * only care about keys that *start* with dollars. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'f', 'o', 'o', '$', 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: key/dollar/accept-if-absent static inline void _test_case_key_dollar_accept_if_absent(void) { /** * We are validating for dollar-keys, and we accept because this document * doesn't contain any such keys. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/simple static inline void _test_case_utf8_simple(void) { /** * Simple UTF-8 string element */ const uint8_t bytes[] = { 0x1d, 0, 0, 0, 2, 's', 't', 'r', 'i', 'n', 'g', 0, 0x0c, 0, 0, 0, 's', 'o', 'm', 'e', 0x20, 's', 't', 'r', 'i', 'n', 'g', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/missing-null static inline void _test_case_utf8_missing_null(void) { /** * The UTF-8 element "a" contains 4 characters and declares its length of 4, * but the fourth character is supposed to be a null terminator. In this case, * it is the letter 'd'. */ const uint8_t bytes[] = { 0x10, 0, 0, 0, 2, 'a', 0, 4, 0, 0, 0, 'a', 'b', 'c', 'd', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 14); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/length-zero static inline void _test_case_utf8_length_zero(void) { /** * UTF-8 string length must always be at least 1 for the null terminator */ const uint8_t bytes[] = { 0x0c, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 6); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/length-too-short static inline void _test_case_utf8_length_too_short(void) { /** * UTF-8 string is three chars and a null terminator, but the declared length is 3 (should be 4) */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 2, 0, 3, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 12); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/header-too-large static inline void _test_case_utf8_header_too_large(void) { /** * Data { "foo": "bar" } but the declared length of "bar" is way too large. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, 'f', 'o', 'o', 0, 0xff, 0xff, 0xff, 0xff, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/valid static inline void _test_case_utf8_valid(void) { /** * Validate a valid UTF-8 string with UTF-8 validation enabled. */ const uint8_t bytes[] = { 0x13, 0, 0, 0, 2, 'f', 'o', 'o', 0, 5, 0, 0, 0, 'a', 'b', 'c', 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/invalid/accept static inline void _test_case_utf8_invalid_accept(void) { /** * Validate an invalid UTF-8 string, but accept invalid UTF-8. */ const uint8_t bytes[] = { 0x14, 0, 0, 0, 2, 'f', 'o', 'o', 0, 6, 0, 0, 0, 'a', 'b', 'c', 0xff, 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/invalid/reject static inline void _test_case_utf8_invalid_reject(void) { /** * Validate an invalid UTF-8 string, and expect rejection. */ const uint8_t bytes[] = { 0x14, 0, 0, 0, 2, 'f', 'o', 'o', 0, 6, 0, 0, 0, 'a', 'b', 'c', 0xff, 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/valid-with-null/accept-1 static inline void _test_case_utf8_valid_with_null_accept_1(void) { /** * This is a valid UTF-8 string that contains a null character. We accept * it because we don't do UTF-8 validation. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'f', 'o', 'o', 0, 8, 0, 0, 0, 'a', 'b', 'c', 0, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/valid-with-null/accept-2 static inline void _test_case_utf8_valid_with_null_accept_2(void) { /** * This is a valid UTF-8 string that contains a null character. We allow * it explicitly when we request UTF-8 validation. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'f', 'o', 'o', 0, 8, 0, 0, 0, 'a', 'b', 'c', 0, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/valid-with-null/reject static inline void _test_case_utf8_valid_with_null_reject(void) { /** * This is a valid UTF-8 string that contains a null character. We reject * this because we don't pass BSON_VALIDATE_UTF8_ALLOW_NULL. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'f', 'o', 'o', 0, 8, 0, 0, 0, 'a', 'b', 'c', 0, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8_ALLOW_NULL); mlib_check(error.message, str_eq, "UTF-8 string contains a U+0000 (null) character"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/overlong-null/accept-1 static inline void _test_case_utf8_overlong_null_accept_1(void) { /** * This is an *invalid* UTF-8 string, and contains an overlong null. We should * accept it because we aren't doing UTF-8 validation. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 2, 'f', 'o', 'o', 0, 9, 0, 0, 0, 'a', 'b', 'c', 0xc0, 0x80, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/overlong-null/accept-2 static inline void _test_case_utf8_overlong_null_accept_2(void) { /** * ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence * * This is an *invalid* UTF-8 string, because it contains an overlong null * "0xc0 0x80". Despite being invalid, we accept it because our current UTF-8 * validation considers the overlong null to be a valid encoding for the null * codepoint (it isn't, but changing it would be a breaking change). * * If/when UTF-8 validation is changed to reject overlong null, then this * test should change to expect rejection the invalid UTF-8. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 2, 'f', 'o', 'o', 0, 9, 0, 0, 0, 'a', 'b', 'c', 0xc0, 0x80, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8/overlong-null/reject static inline void _test_case_utf8_overlong_null_reject(void) { /** * ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence * * This is an *invalid* UTF-8 string, because it contains an overlong null * character. Our UTF-8 validator wrongly accepts overlong null as a valid * UTF-8 sequence. This test fails because we disallow null codepoints, not * because the UTF-8 is invalid, and the error message reflects that. * * If/when UTF-8 validation is changed to reject overlong null, then the * expected error code and error message for this test should change. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 2, 'f', 'o', 'o', 0, 9, 0, 0, 0, 'a', 'b', 'c', 0xc0, 0x80, '1', '2', '3', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8_ALLOW_NULL); mlib_check(error.message, str_eq, "UTF-8 string contains a U+0000 (null) character"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8-key/invalid/accept static inline void _test_case_utf8_key_invalid_accept(void) { /** * The element key is not valid UTf-8, but we accept it if we don't do * UTF-8 validation. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'a', 'b', 'c', 0xff, 'd', 'e', 'f', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8-key/invalid/reject static inline void _test_case_utf8_key_invalid_reject(void) { /** * The element key is not valid UTF-8, and we reject it when we requested * UTF-8 validation. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 2, 'a', 'b', 'c', 0xff, 'd', 'e', 'f', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8-key/overlong-null/reject static inline void _test_case_utf8_key_overlong_null_reject(void) { /** * ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence * * The element key is invalid UTF-8 because it contains an overlong null. We accept the * overlong null as a valid encoding of U+0000, but we reject the key because * we disallow null in UTF-8 strings. * * If/when UTF-8 validation is changed to reject overlong null, then the * expected error code and error message for this test should change. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 2, 'a', 'b', 'c', 0xc0, 0x80, 'd', 'e', 'f', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8_ALLOW_NULL); mlib_check(error.message, str_eq, "UTF-8 string contains a U+0000 (null) character"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: utf8-key/overlong-null/accept static inline void _test_case_utf8_key_overlong_null_accept(void) { /** * ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence * * The element key is invalid UTF-8 because it contains an overlong null. We accept the * overlong null as a valid encoding of U+0000, and we allow it in an element key because * we pass ALLOW_NULL * * If/when UTF-8 validation is changed to reject overlong null, then this * test case should instead reject the key string as invalid UTF-8. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 2, 'a', 'b', 'c', 0xc0, 0x80, 'd', 'e', 'f', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8 | BSON_VALIDATE_UTF8_ALLOW_NULL, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: array/empty static inline void _test_case_array_empty(void) { /** * Simple empty array element */ const uint8_t bytes[] = { 0x11, 0, 0, 0, 4, 'a', 'r', 'r', 'a', 'y', 0, 5, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: array/simple static inline void _test_case_array_simple(void) { /** * Simple array element of integers */ const uint8_t bytes[] = { 0x26, 0, 0, 0, 4, 'a', 'r', 'r', 'a', 'y', 0, 0x1a, 0, 0, 0, 0x10, '0', 0, 0x2a, 0, 0, 0, 0x10, '1', 0, 0xc1, 6, 0, 0, 0x10, '2', 0, 0xf8, 0xff, 0xff, 0xff, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: array/invalid-element static inline void _test_case_array_invalid_element(void) { /** * Simple array element of integers, but one element is truncated */ const uint8_t bytes[] = { 0x23, 0, 0, 0, 4, 'a', 'r', 'r', 'a', 'y', 0, 0x17, 0, 0, 0, 0x10, '0', 0, 0x2a, 0, 0, 0, 0x10, '1', 0, 0, 0x10, '2', 0, 0xf8, 0xff, 0xff, 0xff, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 34); } // ! This code is GENERATED! Do not edit it directly! // Case: array/invalid-element-check-offset static inline void _test_case_array_invalid_element_check_offset(void) { /** * This is the same as the array/invalid-element test, but with a longer * key string on the parent array. This is to check that the error offset * is properly adjusted for the additional characters. */ const uint8_t bytes[] = { 0x2b, 0, 0, 0, 4, 'a', 'r', 'r', 'a', 'y', '-', 's', 'h', 'i', 'f', 't', 'e', 'd', 0, 0x17, 0, 0, 0, 0x10, '0', 0, 0x2a, 0, 0, 0, 0x10, '1', 0, 0, 0x10, '2', 0, 0xf8, 0xff, 0xff, 0xff, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 42); } // ! This code is GENERATED! Do not edit it directly! // Case: symbol/simple static inline void _test_case_symbol_simple(void) { /** * A simple document: { symbol: Symbol("void 0;") } */ const uint8_t bytes[] = { 0x19, 0, 0, 0, 0x0e, 's', 'y', 'm', 'b', 'o', 'l', 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: symbol/invalid-utf8/accept static inline void _test_case_symbol_invalid_utf8_accept(void) { /** * A simple symbol document, but the string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x1a, 0, 0, 0, 0x0e, 's', 'y', 'm', 'b', 'o', 'l', 0, 9, 0, 0, 0, 'v', 'o', 'i', 'd', 0xff, 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: symbol/invalid-utf8/reject static inline void _test_case_symbol_invalid_utf8_reject(void) { /** * A simple symbol document, but the string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x1a, 0, 0, 0, 0x0e, 's', 'y', 'm', 'b', 'o', 'l', 0, 9, 0, 0, 0, 'v', 'o', 'i', 'd', 0xff, 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: symbol/length-zero static inline void _test_case_symbol_length_zero(void) { /** * Symbol string length must always be at least 1 for the null terminator */ const uint8_t bytes[] = { 0x0c, 0, 0, 0, 0x0e, 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 6); } // ! This code is GENERATED! Do not edit it directly! // Case: symbol/length-too-short static inline void _test_case_symbol_length_too_short(void) { /** * Symbol string is three chars and a null terminator, but the declared * length is 3 (should be 4) */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 0x0e, 0, 3, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 12); } // ! This code is GENERATED! Do not edit it directly! // Case: code/simple static inline void _test_case_code_simple(void) { /** * A simple document: { code: Code("void 0;") } */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 0x0d, 'c', 'o', 'd', 'e', 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: code/invalid-utf8/accept static inline void _test_case_code_invalid_utf8_accept(void) { /** * A simple code document, but the string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x18, 0, 0, 0, 0x0d, 'c', 'o', 'd', 'e', 0, 9, 0, 0, 0, 'v', 'o', 'i', 'd', 0xff, 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: code/invalid-utf8/reject static inline void _test_case_code_invalid_utf8_reject(void) { /** * A simple code document, but the string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x18, 0, 0, 0, 0x0d, 'c', 'o', 'd', 'e', 0, 9, 0, 0, 0, 'v', 'o', 'i', 'd', 0xff, 0x20, '0', 0x3b, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: code/length-zero static inline void _test_case_code_length_zero(void) { /** * Code string length must always be at least 1 for the null terminator */ const uint8_t bytes[] = { 0x10, 0, 0, 0, 0x0d, 'c', 'o', 'd', 'e', 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 10); } // ! This code is GENERATED! Do not edit it directly! // Case: code/length-too-short static inline void _test_case_code_length_too_short(void) { /** * Code string is three chars and a null terminator, but the declared length is 3 (should be 4) */ const uint8_t bytes[] = { 0x13, 0, 0, 0, 0x0d, 'c', 'o', 'd', 'e', 0, 3, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 16); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/simple static inline void _test_case_code_with_scope_simple(void) { /** * A simple valid code-with-scope element */ const uint8_t bytes[] = { 0x1f, 0, 0, 0, 0x0f, 'f', 'o', 'o', 0, 0x15, 0, 0, 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 5, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/invalid-code-length-zero static inline void _test_case_code_with_scope_invalid_code_length_zero(void) { /** * Data { "": CodeWithScope("", {}) }, but the code string length is zero, when * it must be at least 1 */ const uint8_t bytes[] = { 0x15, 0, 0, 0, 0x0f, 0, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 6); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/invalid-code-length-too-large static inline void _test_case_code_with_scope_invalid_code_length_too_large(void) { /** * Data { "": CodeWithScope("", {}) }, but the code string length is way too large */ const uint8_t bytes[] = { 0x15, 0, 0, 0, 0x0f, 0, 0x0a, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 5, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 6); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/invalid-scope static inline void _test_case_code_with_scope_invalid_scope(void) { /** * A code-with-scope element, but the scope document is corrupted */ const uint8_t bytes[] = { 0x1e, 0, 0, 0, 0x0f, 'f', 'o', 'o', 0, 0x14, 0, 0, 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 5, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/empty-key-in-scope static inline void _test_case_code_with_scope_empty_key_in_scope(void) { /** * A code-with-scope element. The scope itself contains empty keys within * objects, and we ask to reject empty keys. But the scope document should * be treated as an opaque closure, so our outer validation rules do not * apply. */ const uint8_t bytes[] = { '7', 0, 0, 0, 0x0f, 'c', 'o', 'd', 'e', 0, 0x2c, 0, 0, 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 0x1c, 0, 0, 0, 3, 'o', 'b', 'j', 0, 0x12, 0, 0, 0, 2, 0, 7, 0, 0, 0, 's', 't', 'r', 'i', 'n', 'g', 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_EMPTY_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/corrupt-scope static inline void _test_case_code_with_scope_corrupt_scope(void) { /** * A code-with-scope element, but the scope contains corruption */ const uint8_t bytes[] = { 0x2a, 0, 0, 0, 0x0f, 'c', 'o', 'd', 'e', 0, 0x1f, 0, 0, 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 0x0f, 0, 0, 0, 2, 'f', 'o', 'o', 0, 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "Error in scope document for element \"code\": corrupt BSON"); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: code-with-scope/corrupt-scope-2 static inline void _test_case_code_with_scope_corrupt_scope_2(void) { /** * A code-with-scope element, but the scope contains corruption */ const uint8_t bytes[] = { 0x2a, 0, 0, 0, 0x0f, 'c', 'o', 'd', 'e', 0, 0x1f, 0, 0, 0, 8, 0, 0, 0, 'v', 'o', 'i', 'd', 0x20, '0', 0x3b, 0, 0x0f, 0, 0, 0, 2, 'f', 'o', 'o', 0, 0xff, 0xff, 0xff, 0xff, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "Error in scope document for element \"code\": corrupt BSON"); mlib_check(offset, eq, 13); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/simple static inline void _test_case_regex_simple(void) { /** * Simple document: { regex: Regex("1234", "gi") } */ const uint8_t bytes[] = { 0x14, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, '1', '2', '3', '4', 0, 'g', 'i', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/invalid-opts static inline void _test_case_regex_invalid_opts(void) { /** * A regular expression element with missing null terminator. The main * option string "foo" has a null terminator, but the option component "bar" * does not have a null terminator. A naive parse will see the doc's null * terminator as the null terminator for the options string, but that's * invalid! */ const uint8_t bytes[] = { 0x13, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, 'f', 'o', 'o', 0, 'b', 'a', 'r', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/double-null static inline void _test_case_regex_double_null(void) { /** * A regular expression element with an extra null terminator. Since regex * is delimited by its null terminator, the iterator will stop early before * the actual EOD. */ const uint8_t bytes[] = { 0x15, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, 'f', 'o', 'o', 0, 'b', 'a', 'r', 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 21); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/invalid-utf8/accept static inline void _test_case_regex_invalid_utf8_accept(void) { /** * A regular expression that contains invalid UTF-8. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, 'f', 'o', 'o', 0xff, 'b', 'a', 'r', 0, 'g', 'i', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/invalid-utf8/reject static inline void _test_case_regex_invalid_utf8_reject(void) { /** * A regular expression that contains invalid UTF-8. */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, 'f', 'o', 'o', 0xff, 'b', 'a', 'r', 0, 'g', 'i', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: regex/invalid-utf8/accept-if-absent static inline void _test_case_regex_invalid_utf8_accept_if_absent(void) { /** * A regular valid UTf-8 regex. We check for invalid UTf-8, and accept becaues * the regex is fine. */ const uint8_t bytes[] = { 0x13, 0, 0, 0, 0x0b, 'r', 'e', 'g', 'e', 'x', 0, 'f', 'o', 'o', 0, 'g', 'i', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/string-length-zero static inline void _test_case_dbpointer_string_length_zero(void) { /** * Document { "foo": DBPointer("", ) }, but the length header on the inner * string is zero, when it must be at least 1. */ const uint8_t bytes[] = { 0x1b, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 0, 0, 0, 0, 0, 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/string-length-too-big static inline void _test_case_dbpointer_string_length_too_big(void) { /** * Document { "foo": DBPointer("foobar", ) }, but the length header on the inner * string is far too large */ const uint8_t bytes[] = { 0x21, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 0xff, 0xff, 0xff, 0xff, 'f', 'o', 'o', 'b', 'a', 'r', 0, 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/truncated static inline void _test_case_dbpointer_truncated(void) { /** * Document { "foo": DBPointer("foobar", ) }, but the length header on * the string is one byte too large, causing it to use the first byte of the * OID as the null terminator. This should fail when iterating. */ const uint8_t bytes[] = { '2', 0, 0, 0, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 0x0c, 'f', 'o', 'o', 0, 7, 0, 0, 0, 'f', 'o', 'o', 'b', 'a', 'r', 0, 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 2, 'a', 0, 2, 0, 0, 0, 'b', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 43); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/missing-null static inline void _test_case_dbpointer_missing_null(void) { /** * Document { "foo": DBPointer("abcd", ) }, the length header on * the string is 4, but the fourth byte is not a null terminator. */ const uint8_t bytes[] = { 0x1e, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'a', 'b', 'c', 'd', 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 16); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/invalid-utf8/accept static inline void _test_case_dbpointer_invalid_utf8_accept(void) { /** * DBPointer document, but the collection string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x22, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 8, 0, 0, 0, 'a', 'b', 'c', 0xff, 'd', 'e', 'f', 0, 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/invalid-utf8/reject static inline void _test_case_dbpointer_invalid_utf8_reject(void) { /** * DBPointer document, but the collection string contains invalid UTF-8 */ const uint8_t bytes[] = { 0x22, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 8, 0, 0, 0, 'a', 'b', 'c', 0xff, 'd', 'e', 'f', 0, 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_UTF8); mlib_check(error.message, str_eq, "Text element is not valid UTF-8"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: dbpointer/invalid-utf8/accept-if-absent static inline void _test_case_dbpointer_invalid_utf8_accept_if_absent(void) { /** * DBPointer document, and we validate UTF-8. Accepts because there is no * invalid UTF-8 here. */ const uint8_t bytes[] = { 0x21, 0, 0, 0, 0x0c, 'f', 'o', 'o', 0, 7, 0, 0, 0, 'a', 'b', 'c', 'd', 'e', 'f', 0, 'R', 'Y', 0xb5, 'j', 0xfa, 0x5b, 0xd8, 'A', 0xd6, 'X', 0x5d, 0x99, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_UTF8, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/simple static inline void _test_case_subdoc_simple(void) { /** * A simple document: { doc: { foo: "bar" } } */ const uint8_t bytes[] = { 0x1c, 0, 0, 0, 3, 'd', 'o', 'c', 0, 0x12, 0, 0, 0, 2, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/invalid-shared-null static inline void _test_case_subdoc_invalid_shared_null(void) { /** * A truncated subdocument element, with its null terminator accidentally * overlapping the parent document's null. */ const uint8_t bytes[] = { 0x0e, 0, 0, 0, 3, 'd', 'o', 'c', 0, 5, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/overlapping-utf8-null static inline void _test_case_subdoc_overlapping_utf8_null(void) { /** * Encodes the document: * * { "foo": { "bar": "baz" } } * * but the foo.bar UTF-8 string is truncated improperly and reuses the null * terminator for "foo" */ const uint8_t bytes[] = { 0x1c, 0, 0, 0, 3, 'd', 'o', 'c', 0, 0x12, 0, 0, 0, 2, 'b', 'a', 'r', 0, 5, 0, 0, 0, 'b', 'a', 'z', 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/invalid-element static inline void _test_case_subdoc_invalid_element(void) { /** * A subdocument that contains an invalid element */ const uint8_t bytes[] = { 0x18, 0, 0, 0, 3, 'd', 'o', 'c', 0, 0x0e, 0, 0, 0, 1, 'd', 'b', 'l', 0, 'a', 'b', 'c', 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/header-too-large static inline void _test_case_subdoc_header_too_large(void) { /** * Data {"foo": {}}, but the subdoc header is too large. */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 3, 'f', 'o', 'o', 0, 0xf7, 0xff, 0xff, 0xff, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/header-too-small static inline void _test_case_subdoc_header_too_small(void) { /** * Nested document with a header value of 4, which is always too small. */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 3, 't', 'e', 's', 't', 0, 4, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: subdoc/impossible-size static inline void _test_case_subdoc_impossible_size(void) { /** * Data {"foo": {}}, but the subdoc header is UINT32_MAX/INT32_MIN, which * becomes is an invalid document header. */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 3, 'f', 'o', 'o', 0, 0xff, 0xff, 0xff, 0xff, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: null/simple static inline void _test_case_null_simple(void) { /** * A simple document: { "null": null } */ const uint8_t bytes[] = { 0x0b, 0, 0, 0, 0x0a, 'n', 'u', 'l', 'l', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: undefined/simple static inline void _test_case_undefined_simple(void) { /** * A simple document: { "undefined": undefined } */ const uint8_t bytes[] = { 0x10, 0, 0, 0, 6, 'u', 'n', 'd', 'e', 'f', 'i', 'n', 'e', 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/simple static inline void _test_case_binary_simple(void) { /** * Simple binary data { "binary": Binary(0x80, b'12345') } */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 5, 0, 0, 0, 0x80, '1', '2', '3', '4', '5', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/bad-length-zero-subtype-2 static inline void _test_case_binary_bad_length_zero_subtype_2(void) { /** * Binary data that has an invalid length header. It is subtype 2, * which means it contains an additional length header. */ const uint8_t bytes[] = { 0x1a, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, '1', '2', '3', '4', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 12); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/bad-inner-length-on-subtype-2 static inline void _test_case_binary_bad_inner_length_on_subtype_2(void) { /** * Binary data that has an valid outer length header, but the inner length * header for subtype 2 has an incorrect value. */ const uint8_t bytes[] = { 0x1a, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 8, 0, 0, 0, 2, 2, 0, 0, 0, '1', '2', '3', '4', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 17); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/bad-length-too-small static inline void _test_case_binary_bad_length_too_small(void) { /** * Data { "binary": Binary(0x80, b'1234') }, but the length header on * the Binary object is too small. * * This won't cause the binary to decode wrong, but it will cause the iterator * to jump into the middle of the binary data which will not decode as a * proper BSON element. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 2, 0, 0, 0, 0x80, '1', '2', '3', '4', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 22); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/bad-length-too-big static inline void _test_case_binary_bad_length_too_big(void) { /** * Data { "binary": Binary(0x80, b'1234') }, but the length header on * the Binary object is too large. */ const uint8_t bytes[] = { 0x16, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 0xf3, 0xff, 0xff, 0xff, 0x80, '1', '2', '3', '4', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 12); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/old-invalid/1 static inline void _test_case_binary_old_invalid_1(void) { /** * This is an old-style binary type 0x2. It has an inner length header of 5, * but it should be 4. */ const uint8_t bytes[] = { 0x1a, 0, 0, 0, 5, 'b', 'i', 'n', 'a', 'r', 'y', 0, 8, 0, 0, 0, 2, 5, 0, 0, 0, 'a', 'b', 'c', 'd', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 17); } // ! This code is GENERATED! Do not edit it directly! // Case: binary/old-invalid/2 static inline void _test_case_binary_old_invalid_2(void) { /** * This is an old-style binary type 0x2. The data segment is too small to * be valid. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 5, 'b', 'i', 'n', 0, 3, 0, 0, 0, 2, 'a', 'b', 'c', 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: minkey/simple static inline void _test_case_minkey_simple(void) { /** * A simple document with a MinKey element */ const uint8_t bytes[] = { 0x0a, 0, 0, 0, 0xff, 'm', 'i', 'n', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: maxkey/simple static inline void _test_case_maxkey_simple(void) { /** * A simple document with a MaxKey element */ const uint8_t bytes[] = { 0x0a, 0, 0, 0, 0x7f, 'm', 'a', 'x', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: int32/simple static inline void _test_case_int32_simple(void) { /** * A simple document with a valid single int32 element */ const uint8_t bytes[] = { 0x10, 0, 0, 0, 0x10, 'i', 'n', 't', '3', '2', 0, 0x2a, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: int32/truncated static inline void _test_case_int32_truncated(void) { /** * Truncated 32-bit integer */ const uint8_t bytes[] = { 0x19, 0, 0, 0, 0x10, 'i', 'n', 't', '3', '2', '-', 't', 'r', 'u', 'n', 'c', 'a', 't', 'e', 'd', 0, 0x2a, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 21); } // ! This code is GENERATED! Do not edit it directly! // Case: timestamp/simple static inline void _test_case_timestamp_simple(void) { /** * A simple timestamp element */ const uint8_t bytes[] = { 0x18, 0, 0, 0, 0x11, 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 0, 0xc1, 6, 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: timestamp/truncated static inline void _test_case_timestamp_truncated(void) { /** * A truncated timestamp element */ const uint8_t bytes[] = { 0x17, 0, 0, 0, 0x11, 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 0, 0xc1, 6, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 15); } // ! This code is GENERATED! Do not edit it directly! // Case: int64/simple static inline void _test_case_int64_simple(void) { /** * A simple document with a valid single int64 element */ const uint8_t bytes[] = { 0x14, 0, 0, 0, 0x12, 'i', 'n', 't', '6', '4', 0, 0xc1, 6, 0, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: int64/truncated static inline void _test_case_int64_truncated(void) { /** * Truncated 64-bit integer */ const uint8_t bytes[] = { 0x1d, 0, 0, 0, 0x12, 'i', 'n', 't', '6', '4', '-', 't', 'r', 'u', 'n', 'c', 'a', 't', 'e', 'd', 0, 0xc1, 6, 0, 0, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 21); } // ! This code is GENERATED! Do not edit it directly! // Case: double/simple static inline void _test_case_double_simple(void) { /** * Simple float64 element */ const uint8_t bytes[] = { 0x15, 0, 0, 0, 1, 'd', 'o', 'u', 'b', 'l', 'e', 0, 0x1f, 0x85, 0xeb, 'Q', 0xb8, 0x1e, 9, 0x40, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: double/truncated static inline void _test_case_double_truncated(void) { /** * Truncated 64-bit float */ const uint8_t bytes[] = { 0x1e, 0, 0, 0, 1, 'd', 'o', 'u', 'b', 'l', 'e', '-', 't', 'r', 'u', 'n', 'c', 'a', 't', 'e', 'd', 0, 0x0a, 0xd7, 0xa3, 'p', 0x3d, 0x0a, 9, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 22); } // ! This code is GENERATED! Do not edit it directly! // Case: boolean/simple-false static inline void _test_case_boolean_simple_false(void) { /** * A simple boolean 'false' */ const uint8_t bytes[] = { 0x0c, 0, 0, 0, 8, 'b', 'o', 'o', 'l', 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: boolean/simple-true static inline void _test_case_boolean_simple_true(void) { /** * A simple boolean 'true' */ const uint8_t bytes[] = { 0x0c, 0, 0, 0, 8, 'b', 'o', 'o', 'l', 0, 1, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: boolean/invalid static inline void _test_case_boolean_invalid(void) { /** * An invalid boolean octet. Must be '0' or '1', but is 0xc3. */ const uint8_t bytes[] = { 0x0c, 0, 0, 0, 8, 'b', 'o', 'o', 'l', 0, 0xc3, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 10); } // ! This code is GENERATED! Do not edit it directly! // Case: datetime/simple static inline void _test_case_datetime_simple(void) { /** * Simple datetime element */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 9, 'u', 't', 'c', 0, 0x0b, 0x98, 0x8c, 0x2b, '3', 1, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: datetime/truncated static inline void _test_case_datetime_truncated(void) { /** * Truncated datetime element */ const uint8_t bytes[] = { 0x11, 0, 0, 0, 9, 'u', 't', 'c', 0, 0x0b, 0x98, 0x8c, 0x2b, '3', 1, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, 0, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_CORRUPT); mlib_check(error.message, str_eq, "corrupt BSON"); mlib_check(offset, eq, 9); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/missing-id static inline void _test_case_dbref_missing_id(void) { /** * This dbref document is missing an $id element */ const uint8_t bytes[] = { 0x13, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Expected an $id element following $ref"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/non-id static inline void _test_case_dbref_non_id(void) { /** * The 'bar' element should be an '$id' element. */ const uint8_t bytes[] = { 0x20, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, 'b', 'a', 'r', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Expected an $id element following $ref"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/not-first-elements static inline void _test_case_dbref_not_first_elements(void) { /** * This would be a valid DBRef, but the "$ref" key must come first. */ const uint8_t bytes[] = { 0x29, 0, 0, 0, 2, 'f', 'o', 'o', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, '$', 'r', 'e', 'f', 0, 2, 0, 0, 0, 'a', 0, 2, '$', 'i', 'd', 0, 2, 0, 0, 0, 'b', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Disallowed '$' in element key: \"$ref\""); mlib_check(offset, eq, 17); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/ref-without-id-with-db static inline void _test_case_dbref_ref_without_id_with_db(void) { /** * There should be an $id element, but we skip straight to $db */ const uint8_t bytes[] = { 0x20, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'd', 'b', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Expected an $id element following $ref"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/non-string-ref static inline void _test_case_dbref_non_string_ref(void) { /** * The $ref element must be a string, but is an integer. */ const uint8_t bytes[] = { 0x0f, 0, 0, 0, 0x10, '$', 'r', 'e', 'f', 0, 0x2a, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "$ref element must be a UTF-8 element"); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/non-string-db static inline void _test_case_dbref_non_string_db(void) { /** * The $db element should be a string, but is an integer. */ const uint8_t bytes[] = { 0x29, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0x10, '$', 'd', 'b', 0, 0x2a, 0, 0, 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "$db element in DBRef must be a UTF-8 element"); mlib_check(offset, eq, 31); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/invalid-extras-between static inline void _test_case_dbref_invalid_extras_between(void) { /** * Almost a valid DBRef, but there is an extra field before $db. We reject $db * as an invalid key. */ const uint8_t bytes[] = { 0x3e, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, 'e', 'x', 't', 'r', 'a', 0, 6, 0, 0, 0, 'f', 'i', 'e', 'l', 'd', 0, 2, '$', 'd', 'b', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Disallowed '$' in element key: \"$db\""); mlib_check(offset, eq, 48); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/invalid-double-ref static inline void _test_case_dbref_invalid_double_ref(void) { /** * Invalid DBRef contains a second $ref element. */ const uint8_t bytes[] = { '.', 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Expected an $id element following $ref"); mlib_check(offset, eq, 18); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/invalid-missing-ref static inline void _test_case_dbref_invalid_missing_ref(void) { /** * DBRef document requires a $ref key to be first. */ const uint8_t bytes[] = { 0x12, 0, 0, 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); mlib_check(!is_valid); mlib_check(error.code, eq, BSON_VALIDATE_DOLLAR_KEYS); mlib_check(error.message, str_eq, "Disallowed '$' in element key: \"$id\""); mlib_check(offset, eq, 4); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/valid/simple static inline void _test_case_dbref_valid_simple(void) { /** * This is a simple valid DBRef element. */ const uint8_t bytes[] = { 0x20, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/valid/simple-with-db static inline void _test_case_dbref_valid_simple_with_db(void) { /** * A simple DBRef of the form: * * { $ref: "foo", $id: "bar", $db: "baz" } */ const uint8_t bytes[] = { '-', 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, '$', 'd', 'b', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/valid/nested-id-doc static inline void _test_case_dbref_valid_nested_id_doc(void) { /** * This is a valid DBRef of the form: * * { $ref: foo, $id: { $ref: "foo2", $id: "bar2", $db: "baz2" }, $db: "baz" } */ const uint8_t bytes[] = { 'U', 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 3, '$', 'i', 'd', 0, '0', 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 5, 0, 0, 0, 'f', 'o', 'o', '2', 0, 2, '$', 'i', 'd', 0, 5, 0, 0, 0, 'b', 'a', 'r', '2', 0, 2, '$', 'd', 'b', 0, 5, 0, 0, 0, 'b', 'a', 'z', '2', 0, 0, 2, '$', 'd', 'b', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/valid/trailing-content static inline void _test_case_dbref_valid_trailing_content(void) { /** * A valid DBRef of the form: * * { * $ref: "foo", * $id: "bar", * $db: "baz", * extra: "field", * } */ const uint8_t bytes[] = { 0x3e, 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, '$', 'd', 'b', 0, 4, 0, 0, 0, 'b', 'a', 'z', 0, 2, 'e', 'x', 't', 'r', 'a', 0, 6, 0, 0, 0, 'f', 'i', 'e', 'l', 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! // Case: dbref/valid/trailing-content-no-db static inline void _test_case_dbref_valid_trailing_content_no_db(void) { /** * A valid DBRef of the form: * * { * $ref: "foo", * $id: "bar", * extra: "field", * } */ const uint8_t bytes[] = { '1', 0, 0, 0, 2, '$', 'r', 'e', 'f', 0, 4, 0, 0, 0, 'f', 'o', 'o', 0, 2, '$', 'i', 'd', 0, 4, 0, 0, 0, 'b', 'a', 'r', 0, 2, 'e', 'x', 't', 'r', 'a', 0, 6, 0, 0, 0, 'f', 'i', 'e', 'l', 'd', 0, 0 }; bson_t doc; mlib_check(bson_init_static(&doc, bytes, sizeof bytes)); bson_error_t error = {0}; size_t offset = 999999; const bool is_valid = bson_validate_with_error_and_offset(&doc, BSON_VALIDATE_DOLLAR_KEYS, &offset, &error); ASSERT_OR_PRINT(is_valid, error); mlib_check(error.code, eq, 0); mlib_check(error.message, str_eq, ""); } // ! This code is GENERATED! Do not edit it directly! void test_install_generated_bson_validation(TestSuite* suite) { TestSuite_Add(suite, "/bson/validate/" "empty", _test_case_empty); TestSuite_Add(suite, "/bson/validate/" "bad-element", _test_case_bad_element); TestSuite_Add(suite, "/bson/validate/" "invalid-type", _test_case_invalid_type); TestSuite_Add(suite, "/bson/validate/" "key/invalid/accept", _test_case_key_invalid_accept); TestSuite_Add(suite, "/bson/validate/" "key/invalid/reject", _test_case_key_invalid_reject); TestSuite_Add(suite, "/bson/validate/" "key/empty/accept", _test_case_key_empty_accept); TestSuite_Add(suite, "/bson/validate/" "key/empty/reject", _test_case_key_empty_reject); TestSuite_Add(suite, "/bson/validate/" "key/empty/accept-if-absent", _test_case_key_empty_accept_if_absent); TestSuite_Add(suite, "/bson/validate/" "key/dot/accept", _test_case_key_dot_accept); TestSuite_Add(suite, "/bson/validate/" "key/dot/reject", _test_case_key_dot_reject); TestSuite_Add(suite, "/bson/validate/" "key/dot/accept-if-absent", _test_case_key_dot_accept_if_absent); TestSuite_Add(suite, "/bson/validate/" "key/dollar/accept", _test_case_key_dollar_accept); TestSuite_Add(suite, "/bson/validate/" "key/dollar/reject", _test_case_key_dollar_reject); TestSuite_Add(suite, "/bson/validate/" "key/dollar/accept-in-middle", _test_case_key_dollar_accept_in_middle); TestSuite_Add(suite, "/bson/validate/" "key/dollar/accept-if-absent", _test_case_key_dollar_accept_if_absent); TestSuite_Add(suite, "/bson/validate/" "utf8/simple", _test_case_utf8_simple); TestSuite_Add(suite, "/bson/validate/" "utf8/missing-null", _test_case_utf8_missing_null); TestSuite_Add(suite, "/bson/validate/" "utf8/length-zero", _test_case_utf8_length_zero); TestSuite_Add(suite, "/bson/validate/" "utf8/length-too-short", _test_case_utf8_length_too_short); TestSuite_Add(suite, "/bson/validate/" "utf8/header-too-large", _test_case_utf8_header_too_large); TestSuite_Add(suite, "/bson/validate/" "utf8/valid", _test_case_utf8_valid); TestSuite_Add(suite, "/bson/validate/" "utf8/invalid/accept", _test_case_utf8_invalid_accept); TestSuite_Add(suite, "/bson/validate/" "utf8/invalid/reject", _test_case_utf8_invalid_reject); TestSuite_Add(suite, "/bson/validate/" "utf8/valid-with-null/accept-1", _test_case_utf8_valid_with_null_accept_1); TestSuite_Add(suite, "/bson/validate/" "utf8/valid-with-null/accept-2", _test_case_utf8_valid_with_null_accept_2); TestSuite_Add(suite, "/bson/validate/" "utf8/valid-with-null/reject", _test_case_utf8_valid_with_null_reject); TestSuite_Add(suite, "/bson/validate/" "utf8/overlong-null/accept-1", _test_case_utf8_overlong_null_accept_1); TestSuite_Add(suite, "/bson/validate/" "utf8/overlong-null/accept-2", _test_case_utf8_overlong_null_accept_2); TestSuite_Add(suite, "/bson/validate/" "utf8/overlong-null/reject", _test_case_utf8_overlong_null_reject); TestSuite_Add(suite, "/bson/validate/" "utf8-key/invalid/accept", _test_case_utf8_key_invalid_accept); TestSuite_Add(suite, "/bson/validate/" "utf8-key/invalid/reject", _test_case_utf8_key_invalid_reject); TestSuite_Add(suite, "/bson/validate/" "utf8-key/overlong-null/reject", _test_case_utf8_key_overlong_null_reject); TestSuite_Add(suite, "/bson/validate/" "utf8-key/overlong-null/accept", _test_case_utf8_key_overlong_null_accept); TestSuite_Add(suite, "/bson/validate/" "array/empty", _test_case_array_empty); TestSuite_Add(suite, "/bson/validate/" "array/simple", _test_case_array_simple); TestSuite_Add(suite, "/bson/validate/" "array/invalid-element", _test_case_array_invalid_element); TestSuite_Add(suite, "/bson/validate/" "array/invalid-element-check-offset", _test_case_array_invalid_element_check_offset); TestSuite_Add(suite, "/bson/validate/" "symbol/simple", _test_case_symbol_simple); TestSuite_Add(suite, "/bson/validate/" "symbol/invalid-utf8/accept", _test_case_symbol_invalid_utf8_accept); TestSuite_Add(suite, "/bson/validate/" "symbol/invalid-utf8/reject", _test_case_symbol_invalid_utf8_reject); TestSuite_Add(suite, "/bson/validate/" "symbol/length-zero", _test_case_symbol_length_zero); TestSuite_Add(suite, "/bson/validate/" "symbol/length-too-short", _test_case_symbol_length_too_short); TestSuite_Add(suite, "/bson/validate/" "code/simple", _test_case_code_simple); TestSuite_Add(suite, "/bson/validate/" "code/invalid-utf8/accept", _test_case_code_invalid_utf8_accept); TestSuite_Add(suite, "/bson/validate/" "code/invalid-utf8/reject", _test_case_code_invalid_utf8_reject); TestSuite_Add(suite, "/bson/validate/" "code/length-zero", _test_case_code_length_zero); TestSuite_Add(suite, "/bson/validate/" "code/length-too-short", _test_case_code_length_too_short); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/simple", _test_case_code_with_scope_simple); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/invalid-code-length-zero", _test_case_code_with_scope_invalid_code_length_zero); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/invalid-code-length-too-large", _test_case_code_with_scope_invalid_code_length_too_large); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/invalid-scope", _test_case_code_with_scope_invalid_scope); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/empty-key-in-scope", _test_case_code_with_scope_empty_key_in_scope); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/corrupt-scope", _test_case_code_with_scope_corrupt_scope); TestSuite_Add(suite, "/bson/validate/" "code-with-scope/corrupt-scope-2", _test_case_code_with_scope_corrupt_scope_2); TestSuite_Add(suite, "/bson/validate/" "regex/simple", _test_case_regex_simple); TestSuite_Add(suite, "/bson/validate/" "regex/invalid-opts", _test_case_regex_invalid_opts); TestSuite_Add(suite, "/bson/validate/" "regex/double-null", _test_case_regex_double_null); TestSuite_Add(suite, "/bson/validate/" "regex/invalid-utf8/accept", _test_case_regex_invalid_utf8_accept); TestSuite_Add(suite, "/bson/validate/" "regex/invalid-utf8/reject", _test_case_regex_invalid_utf8_reject); TestSuite_Add(suite, "/bson/validate/" "regex/invalid-utf8/accept-if-absent", _test_case_regex_invalid_utf8_accept_if_absent); TestSuite_Add(suite, "/bson/validate/" "dbpointer/string-length-zero", _test_case_dbpointer_string_length_zero); TestSuite_Add(suite, "/bson/validate/" "dbpointer/string-length-too-big", _test_case_dbpointer_string_length_too_big); TestSuite_Add(suite, "/bson/validate/" "dbpointer/truncated", _test_case_dbpointer_truncated); TestSuite_Add(suite, "/bson/validate/" "dbpointer/missing-null", _test_case_dbpointer_missing_null); TestSuite_Add(suite, "/bson/validate/" "dbpointer/invalid-utf8/accept", _test_case_dbpointer_invalid_utf8_accept); TestSuite_Add(suite, "/bson/validate/" "dbpointer/invalid-utf8/reject", _test_case_dbpointer_invalid_utf8_reject); TestSuite_Add(suite, "/bson/validate/" "dbpointer/invalid-utf8/accept-if-absent", _test_case_dbpointer_invalid_utf8_accept_if_absent); TestSuite_Add(suite, "/bson/validate/" "subdoc/simple", _test_case_subdoc_simple); TestSuite_Add(suite, "/bson/validate/" "subdoc/invalid-shared-null", _test_case_subdoc_invalid_shared_null); TestSuite_Add(suite, "/bson/validate/" "subdoc/overlapping-utf8-null", _test_case_subdoc_overlapping_utf8_null); TestSuite_Add(suite, "/bson/validate/" "subdoc/invalid-element", _test_case_subdoc_invalid_element); TestSuite_Add(suite, "/bson/validate/" "subdoc/header-too-large", _test_case_subdoc_header_too_large); TestSuite_Add(suite, "/bson/validate/" "subdoc/header-too-small", _test_case_subdoc_header_too_small); TestSuite_Add(suite, "/bson/validate/" "subdoc/impossible-size", _test_case_subdoc_impossible_size); TestSuite_Add(suite, "/bson/validate/" "null/simple", _test_case_null_simple); TestSuite_Add(suite, "/bson/validate/" "undefined/simple", _test_case_undefined_simple); TestSuite_Add(suite, "/bson/validate/" "binary/simple", _test_case_binary_simple); TestSuite_Add(suite, "/bson/validate/" "binary/bad-length-zero-subtype-2", _test_case_binary_bad_length_zero_subtype_2); TestSuite_Add(suite, "/bson/validate/" "binary/bad-inner-length-on-subtype-2", _test_case_binary_bad_inner_length_on_subtype_2); TestSuite_Add(suite, "/bson/validate/" "binary/bad-length-too-small", _test_case_binary_bad_length_too_small); TestSuite_Add(suite, "/bson/validate/" "binary/bad-length-too-big", _test_case_binary_bad_length_too_big); TestSuite_Add(suite, "/bson/validate/" "binary/old-invalid/1", _test_case_binary_old_invalid_1); TestSuite_Add(suite, "/bson/validate/" "binary/old-invalid/2", _test_case_binary_old_invalid_2); TestSuite_Add(suite, "/bson/validate/" "minkey/simple", _test_case_minkey_simple); TestSuite_Add(suite, "/bson/validate/" "maxkey/simple", _test_case_maxkey_simple); TestSuite_Add(suite, "/bson/validate/" "int32/simple", _test_case_int32_simple); TestSuite_Add(suite, "/bson/validate/" "int32/truncated", _test_case_int32_truncated); TestSuite_Add(suite, "/bson/validate/" "timestamp/simple", _test_case_timestamp_simple); TestSuite_Add(suite, "/bson/validate/" "timestamp/truncated", _test_case_timestamp_truncated); TestSuite_Add(suite, "/bson/validate/" "int64/simple", _test_case_int64_simple); TestSuite_Add(suite, "/bson/validate/" "int64/truncated", _test_case_int64_truncated); TestSuite_Add(suite, "/bson/validate/" "double/simple", _test_case_double_simple); TestSuite_Add(suite, "/bson/validate/" "double/truncated", _test_case_double_truncated); TestSuite_Add(suite, "/bson/validate/" "boolean/simple-false", _test_case_boolean_simple_false); TestSuite_Add(suite, "/bson/validate/" "boolean/simple-true", _test_case_boolean_simple_true); TestSuite_Add(suite, "/bson/validate/" "boolean/invalid", _test_case_boolean_invalid); TestSuite_Add(suite, "/bson/validate/" "datetime/simple", _test_case_datetime_simple); TestSuite_Add(suite, "/bson/validate/" "datetime/truncated", _test_case_datetime_truncated); TestSuite_Add(suite, "/bson/validate/" "dbref/missing-id", _test_case_dbref_missing_id); TestSuite_Add(suite, "/bson/validate/" "dbref/non-id", _test_case_dbref_non_id); TestSuite_Add(suite, "/bson/validate/" "dbref/not-first-elements", _test_case_dbref_not_first_elements); TestSuite_Add(suite, "/bson/validate/" "dbref/ref-without-id-with-db", _test_case_dbref_ref_without_id_with_db); TestSuite_Add(suite, "/bson/validate/" "dbref/non-string-ref", _test_case_dbref_non_string_ref); TestSuite_Add(suite, "/bson/validate/" "dbref/non-string-db", _test_case_dbref_non_string_db); TestSuite_Add(suite, "/bson/validate/" "dbref/invalid-extras-between", _test_case_dbref_invalid_extras_between); TestSuite_Add(suite, "/bson/validate/" "dbref/invalid-double-ref", _test_case_dbref_invalid_double_ref); TestSuite_Add(suite, "/bson/validate/" "dbref/invalid-missing-ref", _test_case_dbref_invalid_missing_ref); TestSuite_Add(suite, "/bson/validate/" "dbref/valid/simple", _test_case_dbref_valid_simple); TestSuite_Add(suite, "/bson/validate/" "dbref/valid/simple-with-db", _test_case_dbref_valid_simple_with_db); TestSuite_Add(suite, "/bson/validate/" "dbref/valid/nested-id-doc", _test_case_dbref_valid_nested_id_doc); TestSuite_Add(suite, "/bson/validate/" "dbref/valid/trailing-content", _test_case_dbref_valid_trailing_content); TestSuite_Add(suite, "/bson/validate/" "dbref/valid/trailing-content-no-db", _test_case_dbref_valid_trailing_content_no_db); } mongo-c-driver-2.2.1/src/libbson/tests/test-value.c000066400000000000000000000103371511661753600222010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include // skip_if_no_large_allocations static void test_value_basic(void) { static const uint8_t raw[16] = {0}; const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_oid_t oid; bson_t other = BSON_INITIALIZER; bson_t *doc; bson_t sub = BSON_INITIALIZER; bool r; int i; bson_oid_init(&oid, NULL); doc = BCON_NEW("double", BCON_DOUBLE(123.4), "utf8", "this is my string", "document", BCON_DOCUMENT(&sub), "array", BCON_DOCUMENT(&sub), "binary", BCON_BIN(BSON_SUBTYPE_BINARY, raw, sizeof raw), "undefined", BCON_UNDEFINED, "oid", BCON_OID(&oid), "bool", BCON_BOOL(true), "datetime", BCON_DATE_TIME(12345678), "null", BCON_NULL, "regex", BCON_REGEX("^hello", "i"), "dbpointer", BCON_DBPOINTER("test.test", &oid), "code", BCON_CODE("var a = function() {}"), "symbol", BCON_SYMBOL("my_symbol"), "codewscope", BCON_CODEWSCOPE("var a = 1;", &sub), "int32", BCON_INT32(1234), "timestamp", BCON_TIMESTAMP(1234, 4567), "int64", BCON_INT32(4321), "maxkey", BCON_MAXKEY, "minkey", BCON_MINKEY); r = bson_iter_init(&iter, doc); BSON_ASSERT(r); for (i = 0; i < 20; i++) { r = bson_iter_next(&iter); BSON_ASSERT(r); value = bson_iter_value(&iter); BSON_ASSERT(value); bson_value_copy(value, ©); r = bson_append_value(&other, bson_iter_key(&iter), -1, ©); BSON_ASSERT(r); bson_value_destroy(©); } r = bson_iter_next(&iter); BSON_ASSERT(!r); bson_destroy(doc); bson_destroy(&sub); bson_destroy(&other); } static void test_value_decimal128(void) { const bson_value_t *value; bson_value_t copy; bson_iter_t iter; bson_decimal128_t dec; bson_t other = BSON_INITIALIZER; bson_t *doc; BSON_ASSERT(bson_decimal128_from_string("123.5", &dec)); doc = BCON_NEW("decimal128", BCON_DECIMAL128(&dec)); BSON_ASSERT(bson_iter_init(&iter, doc) && bson_iter_next(&iter)); value = bson_iter_value(&iter); BSON_ASSERT(value); bson_value_copy(value, ©); BSON_ASSERT(bson_append_value(&other, bson_iter_key(&iter), -1, ©)); bson_value_destroy(©); bson_destroy(doc); bson_destroy(&other); } static void test_value_big_copy(void *unused) { BSON_UNUSED(unused); char *big_string = bson_malloc(UINT32_MAX); ASSERT(big_string); memset(big_string, UINT32_MAX, 'a'); // `big_string` is not NULL-terminated. bson_value_t dst; bson_value_t src = {.value_type = BSON_TYPE_UTF8, .value = {.v_utf8 = {.str = big_string, .len = UINT32_MAX}}}; bson_value_copy(&src, &dst); bson_free(big_string); bson_value_destroy(&dst); } void test_value_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/value/basic", test_value_basic); TestSuite_Add(suite, "/bson/value/decimal128", test_value_decimal128); TestSuite_AddFull(suite, "/bson/value/big_copy", test_value_big_copy, NULL, NULL, skip_if_no_large_allocations); } mongo-c-driver-2.2.1/src/libbson/tests/test-writer.c000066400000000000000000000112641511661753600224010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void * test_bson_writer_custom_realloc_helper(void *mem, size_t num_bytes, void *ctx) { int *x = (int *)ctx; *x = *x + 1; return bson_realloc(mem, num_bytes); } static void test_bson_writer_custom_realloc(void) { bson_writer_t *writer; uint8_t *buf = bson_malloc(0); size_t buflen = 0; bson_t *b; int x = 0; writer = bson_writer_new(&buf, &buflen, 0, test_bson_writer_custom_realloc_helper, &x); BSON_ASSERT(bson_writer_begin(writer, &b)); BSON_ASSERT(bson_append_utf8(b, "hello", -1, "world", -1)); bson_writer_end(writer); bson_writer_destroy(writer); ASSERT_CMPINT(x, >, 0); bson_free(buf); } static void test_bson_writer_shared_buffer(void) { bson_writer_t *writer; uint8_t *buf = bson_malloc0(32); bool rolled_back = false; size_t buflen = 32; size_t n_bytes; bson_t *b; const char *key; char keystr[32]; int i = 0; int j = 0; int n_docs = 10000; writer = bson_writer_new(&buf, &buflen, 0, bson_realloc_ctx, NULL); for (i = 0; i < n_docs; i++) { BSON_ASSERT(bson_writer_begin(writer, &b)); for (j = 0; j < 1000; j++) { bson_uint32_to_string(j, &key, keystr, sizeof keystr); BSON_ASSERT(bson_append_int64(b, key, -1, j)); } if (bson_writer_get_length(writer) > (48 * 1024 * 1024)) { rolled_back = true; bson_writer_rollback(writer); break; } else { bson_writer_end(writer); } } n_bytes = bson_writer_get_length(writer); bson_writer_destroy(writer); ASSERT_CMPSIZE_T(n_bytes, <, (size_t)(48 * 1024 * 1024)); BSON_ASSERT(rolled_back); bson_free(buf); } static void test_bson_writer_empty_sequence(void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = NULL; bson_t *b; size_t len = 0; int r; int i; writer = bson_writer_new(&buf, &len, 0, bson_realloc_ctx, NULL); for (i = 0; i < 5; i++) { BSON_ASSERT(bson_writer_begin(writer, &b)); bson_writer_end(writer); } r = memcmp(buf, testdata, 25); BSON_ASSERT(r == 0); bson_writer_destroy(writer); bson_free(buf); } static void test_bson_writer_null_realloc(void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = bson_malloc0(32); size_t buflen = 32; bson_t *b; int r; int i; writer = bson_writer_new(&buf, &buflen, 0, NULL, NULL); for (i = 0; i < 6; i++) { BSON_ASSERT(bson_writer_begin(writer, &b)); bson_writer_end(writer); } BSON_ASSERT(!bson_writer_begin(writer, &b)); r = memcmp(buf, testdata, 32); BSON_ASSERT(r == 0); bson_writer_destroy(writer); bson_free(buf); } static void test_bson_writer_null_realloc_2(void) { const uint8_t testdata[] = {5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0}; bson_writer_t *writer; uint8_t *buf = bson_malloc0(32); size_t buflen = 32; bson_t *b; int r; int i; writer = bson_writer_new(&buf, &buflen, 0, NULL, NULL); for (i = 0; i < 5; i++) { BSON_ASSERT(bson_writer_begin(writer, &b)); bson_writer_end(writer); } BSON_ASSERT(bson_writer_begin(writer, &b)); BSON_ASSERT(!bson_append_int32(b, "a", -1, 123)); bson_writer_end(writer); r = memcmp(buf, testdata, 32); BSON_ASSERT(r == 0); bson_writer_destroy(writer); bson_free(buf); } void test_writer_install(TestSuite *suite) { TestSuite_Add(suite, "/bson/writer/custom_realloc", test_bson_writer_custom_realloc); TestSuite_Add(suite, "/bson/writer/shared_buffer", test_bson_writer_shared_buffer); TestSuite_Add(suite, "/bson/writer/empty_sequence", test_bson_writer_empty_sequence); TestSuite_Add(suite, "/bson/writer/null_realloc", test_bson_writer_null_realloc); TestSuite_Add(suite, "/bson/writer/null_realloc_2", test_bson_writer_null_realloc_2); } mongo-c-driver-2.2.1/src/libbson/tests/validate-tests.py000066400000000000000000001325261511661753600232540ustar00rootroot00000000000000""" This script generates a C source file containing test cases for BSON validation and iteration. Run this script with Python 3.12+, and pipe the output into a file. This script takes no command-line arguments. """ # /// script # requires-python = ">=3.12" # dependencies = [] # /// import argparse import enum import json import re import struct import textwrap from dataclasses import dataclass from typing import Iterable class Tag(enum.Enum): """BSON type tag byte values""" EOD = 0 Double = 1 UTF8 = 2 Document = 3 Array = 4 Binary = 5 Undefined = 6 OID = 7 Boolean = 8 Datetime = 9 Null = 10 Regex = 11 DBPointer = 12 Code = 13 Symbol = 14 CodeWithScope = 15 Int32 = 16 Timestamp = 17 Int64 = 18 Decimal128 = 19 MinKey = 0xFF MaxKey = 0x7F type _ByteIter = bytes | Iterable[_ByteIter] """A set of bytes, or an iterable that yields more sets of bytes""" def flatten_bytes(data: _ByteIter) -> bytes: """Flatten a (recursive) iterator of bytes into a single bytes object""" match data: case bytes(data): return data case it: return b''.join(map(flatten_bytes, it)) def i32le(i: int) -> bytes: """Encode an integer as a 32-bit little-endian integer""" return struct.pack(' bytes: """Encode an integer as a 64-bit little-endian integer""" return struct.pack(' bytes: """Encode a float as a 64-bit little-endian float""" return struct.pack(' bytes: """Add a BSON document header a null terminator to a set of bytes""" flat = flatten_bytes(data) # +5 for the null terminator and the header bytes hdr = i32le(len(flat) + 5) return hdr + flat + b'\0' def code_with_scope(code: str, doc: _ByteIter) -> bytes: """Create a BSON code-with-scope object with appropriate header""" s = string(code) doc = flatten_bytes(doc) # +4 to include the length prefix too len_prefix = i32le(len(s) + len(doc) + 4) return len_prefix + s + doc def elem(key: str | _ByteIter, tag: int | Tag, *bs: _ByteIter) -> bytes: """Add a BSON element header to a set of bytes""" if isinstance(tag, Tag): tag = tag.value return bytes([tag]) + cstring(key) + flatten_bytes(bs) def binary(subtype: int, *bs: _ByteIter) -> bytes: """ Create a BSON binary object with appropriate header and subtype tag byte. """ flat = flatten_bytes(bs) st = bytes([subtype]) return i32le(len(flat)) + st + flat def cstring(s: str | _ByteIter) -> bytes: """Encode a string as UTF-8 and add a null terminator""" match s: case str(s): return cstring(s.encode('utf-8')) case bs: bs = flatten_bytes(bs) return bs + b'\0' def string(s: str | _ByteIter) -> bytes: """Add a length header and null terminator to a UTF-8 string""" cs = cstring(s) # Length header includes the null terminator hdr = i32le(len(cs)) return hdr + cs def utf8elem(key: str | _ByteIter, s: str | _ByteIter) -> bytes: """Create a valid UTF-8 BSON element for the given string""" return elem(key, Tag.UTF8, string(s)) @dataclass(frozen=True) class ErrorInfo: """ Information about an expected validation error """ code: str """Spellling of the error code to be expected""" message: str """The expected error message""" offset: int """The expected error offset""" @dataclass(frozen=True) class TestCase: """ Defines a single validation test case. """ name: str """The name of the test case, as displayed in test runners, which will have a "/bson/validate" prefix""" data: bytes """The bytes that will be injested by `bson_init_static` to form the document to be validated""" description: str | None """A plaintext description of the test case and what it actually does. Rendered as a comment.""" flags: str = '0' """Spelling of the flags argument passed to the validation API""" error: ErrorInfo = ErrorInfo('0', '', 0) """Expected error, if any""" @property def fn_name(self) -> str: """Get a C identifier function name for this test case""" return '_test_case_' + re.sub(r'[^\w]', '_', self.name).lower() def fmt_byte(n: int) -> str: """ Format an octet value for C code. Will emit a char literal if certain ASCII, otherwise an integer literal. """ match n: case 0: return '0' case a if re.match(r'[a-zA-Z0-9.$-]', chr(a)): return f"'{chr(a)}'" case a if a < 10: return str(a) case n: return f'0x{n:0>2x}' GENERATED_NOTE = '// ! This code is GENERATED! Do not edit it directly!' HEADER = rf"""{GENERATED_NOTE} // clang-format off #include #include #include """ def generate(case: TestCase) -> Iterable[str]: """ Generate the lines of a test case function. """ # A comment header yield f'{GENERATED_NOTE}\n' yield f'// Case: {case.name}\n' # The function head yield f'static inline void {case.fn_name}(void) {{\n' # If we have a description, emit that in a block comment if case.description: yield ' /**\n' lines = textwrap.dedent(case.description).strip().splitlines() yield from (f' * {ln}\n' for ln in lines) yield ' */\n' # Emit the byte array literal yield ' const uint8_t bytes[] = {\n' yield '\n'.join( textwrap.wrap( ', '.join(map(fmt_byte, case.data)), subsequent_indent=' ' * 4, initial_indent=' ' * 4, width=80, ) ) yield '\n };\n' yield from [ # Initialize a BSON doc that points to the byte array ' bson_t doc;\n', ' mlib_check(bson_init_static(&doc, bytes, sizeof bytes));\n', # The error object to be filled ' bson_error_t error = {0};\n', # The error offset. Expected to be reset to zero on success. ' size_t offset = 999999;\n' # Do the actual validation: f' const bool is_valid = bson_validate_with_error_and_offset(&doc, {case.flags}, &offset, &error);\n', ] is_error = case.error.code != '0' yield from [ ' mlib_check(!is_valid);\n' if is_error else ' ASSERT_OR_PRINT(is_valid, error);\n', f' mlib_check(error.code, eq, {case.error.code});\n', f' mlib_check(error.message, str_eq, {json.dumps(case.error.message)});\n', f' mlib_check(offset, eq, {case.error.offset});\n' if is_error else '', ] yield '}\n' def corruption_at(off: int) -> ErrorInfo: """ Generate an ErrorInfo to expect a message of "corrupt BSON" at the given byte offset. Note that this won't match if the error message is something other than "corrupt BSON". """ return ErrorInfo(BSON_VALIDATE_CORRUPT, 'corrupt BSON', off) BSON_VALIDATE_CORRUPT = 'BSON_VALIDATE_CORRUPT' BSON_VALIDATE_DOLLAR_KEYS = 'BSON_VALIDATE_DOLLAR_KEYS' BSON_VALIDATE_DOT_KEYS = 'BSON_VALIDATE_DOT_KEYS' BSON_VALIDATE_EMPTY_KEYS = 'BSON_VALIDATE_EMPTY_KEYS' BSON_VALIDATE_UTF8 = 'BSON_VALIDATE_UTF8' BSON_VALIDATE_UTF8_ALLOW_NULL = 'BSON_VALIDATE_UTF8_ALLOW_NULL' MSG_EXPECTED_ID_FOLLOWING_REF = 'Expected an $id element following $ref' def disallowed_key(char: str, k: str) -> str: return f'Disallowed \'{char}\' in element key: "{k}"' # d888888b d88888b .d8888. d888888b .o88b. .d8b. .d8888. d88888b .d8888. # `~~88~~' 88' 88' YP `~~88~~' d8P Y8 d8' `8b 88' YP 88' 88' YP # 88 88ooooo `8bo. 88 8P 88ooo88 `8bo. 88ooooo `8bo. # 88 88~~~~~ `Y8b. 88 8b 88~~~88 `Y8b. 88~~~~~ `Y8b. # 88 88. db 8D 88 Y8b d8 88 88 db 8D 88. db 8D # YP Y88888P `8888Y' YP `Y88P' YP YP `8888Y' Y88888P `8888Y' CASES: list[TestCase] = [ TestCase( 'empty', doc(), """Test a simple empty document object.""", ), TestCase( 'bad-element', doc(b'f'), 'The element content is not valid', error=corruption_at(6), ), TestCase( 'invalid-type', doc(elem('foo', 0xE, b'foo')), """The type tag "0x0e" is not a valid type""", error=corruption_at(9), ), TestCase( 'key/invalid/accept', doc( utf8elem('a', 'b'), utf8elem(b'foo\xffbar', 'baz'), utf8elem('c', 'd'), ), """ The element key contains an invalid UTF-8 byte, but we accept it because we aren't doing UTF-8 validation. """, ), TestCase( 'key/invalid/reject', doc( utf8elem('a', 'b'), elem(b'foo\xffbar', Tag.UTF8, string('baz')), utf8elem('c', 'd'), ), """ The element key is not valid UTF-8 and we reject it when we do UTF-8 validation. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 13), ), TestCase( 'key/empty/accept', doc(utf8elem('', 'string')), """ The element has an empty string key, and we accept this. """, ), TestCase( 'key/empty/reject', doc( utf8elem('a', 'b'), utf8elem('', 'string'), ), """ The element has an empty key, and we can reject it. """, flags=BSON_VALIDATE_EMPTY_KEYS, error=ErrorInfo(BSON_VALIDATE_EMPTY_KEYS, 'Element key cannot be an empty string', 13), ), TestCase( 'key/empty/accept-if-absent', doc(utf8elem('foo', 'bar')), """ We are checking for empty keys, and accept if they are absent. """, flags=BSON_VALIDATE_EMPTY_KEYS, ), TestCase( 'key/dot/accept', doc(utf8elem('foo.bar', 'baz')), """ The element key has an ASCII dot, and we accept this since we don't ask to validate it. """, flags=BSON_VALIDATE_EMPTY_KEYS, ), TestCase( 'key/dot/reject', doc(utf8elem('a', 'b'), utf8elem('foo.bar', 'baz')), """ The element has an ASCII dot, and we reject it when we ask to validate it. """, flags=BSON_VALIDATE_DOT_KEYS, error=ErrorInfo(BSON_VALIDATE_DOT_KEYS, disallowed_key('.', 'foo.bar'), 13), ), TestCase( 'key/dot/accept-if-absent', doc(utf8elem('foo', 'bar')), """ We are checking for keys with dot '.', and accept if they are absent. """, flags=BSON_VALIDATE_DOT_KEYS, ), TestCase( 'key/dollar/accept', doc(utf8elem('a', 'b'), utf8elem('$foo', 'bar')), """ We can accept an element key that starts with a dollar '$' sign. """, ), TestCase( 'key/dollar/reject', doc(utf8elem('a', 'b'), utf8elem('$foo', 'bar')), """ We can reject an element key that starts with a dollar '$' sign. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, disallowed_key('$', '$foo'), 13), ), TestCase( 'key/dollar/accept-in-middle', doc(utf8elem('foo$bar', 'baz')), """ This contains a element key "foo$bar", but we don't reject this, as we only care about keys that *start* with dollars. """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'key/dollar/accept-if-absent', doc(utf8elem('foo', 'bar')), """ We are validating for dollar-keys, and we accept because this document doesn't contain any such keys. """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'utf8/simple', doc(utf8elem('string', 'some string')), 'Simple UTF-8 string element', ), TestCase( 'utf8/missing-null', doc(elem('a', Tag.UTF8, i32le(4), b'abcd')), """ The UTF-8 element "a" contains 4 characters and declares its length of 4, but the fourth character is supposed to be a null terminator. In this case, it is the letter 'd'. """, error=corruption_at(14), ), TestCase( 'utf8/length-zero', doc(elem('', Tag.UTF8, i32le(0), b'\0')), 'UTF-8 string length must always be at least 1 for the null terminator', error=corruption_at(6), ), TestCase( 'utf8/length-too-short', doc(elem('', Tag.UTF8, i32le(3), b'bar\0')), 'UTF-8 string is three chars and a null terminator, but the declared length is 3 (should be 4)', error=corruption_at(12), ), TestCase( 'utf8/header-too-large', doc(elem('foo', Tag.UTF8, b'\xff\xff\xff\xffbar\0')), """ Data { "foo": "bar" } but the declared length of "bar" is way too large. """, error=corruption_at(9), ), TestCase( 'utf8/valid', doc(elem('foo', Tag.UTF8, string('abcd'))), """ Validate a valid UTF-8 string with UTF-8 validation enabled. """, flags=BSON_VALIDATE_UTF8, ), TestCase( 'utf8/invalid/accept', doc(utf8elem('foo', b'abc\xffd')), """ Validate an invalid UTF-8 string, but accept invalid UTF-8. """, ), TestCase( 'utf8/invalid/reject', doc(utf8elem('foo', b'abc\xffd')), """ Validate an invalid UTF-8 string, and expect rejection. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'utf8/valid-with-null/accept-1', doc(utf8elem('foo', b'abc\x00123')), """ This is a valid UTF-8 string that contains a null character. We accept it because we don't do UTF-8 validation. """, ), TestCase( 'utf8/valid-with-null/accept-2', doc(utf8elem('foo', b'abc\x00123')), """ This is a valid UTF-8 string that contains a null character. We allow it explicitly when we request UTF-8 validation. """, flags=f'{BSON_VALIDATE_UTF8} | {BSON_VALIDATE_UTF8_ALLOW_NULL}', ), TestCase( 'utf8/valid-with-null/reject', doc(utf8elem('foo', b'abc\x00123')), """ This is a valid UTF-8 string that contains a null character. We reject this because we don't pass BSON_VALIDATE_UTF8_ALLOW_NULL. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8_ALLOW_NULL, 'UTF-8 string contains a U+0000 (null) character', 4), ), TestCase( 'utf8/overlong-null/accept-1', doc(utf8elem('foo', b'abc\xc0\x80123')), """ This is an *invalid* UTF-8 string, and contains an overlong null. We should accept it because we aren't doing UTF-8 validation. """, ), TestCase( 'utf8/overlong-null/accept-2', doc(utf8elem('foo', b'abc\xc0\x80123')), """ ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence This is an *invalid* UTF-8 string, because it contains an overlong null "0xc0 0x80". Despite being invalid, we accept it because our current UTF-8 validation considers the overlong null to be a valid encoding for the null codepoint (it isn't, but changing it would be a breaking change). If/when UTF-8 validation is changed to reject overlong null, then this test should change to expect rejection the invalid UTF-8. """, flags=f'{BSON_VALIDATE_UTF8} | {BSON_VALIDATE_UTF8_ALLOW_NULL}', ), TestCase( 'utf8/overlong-null/reject', doc(utf8elem('foo', b'abc\xc0\x80123')), """ ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence This is an *invalid* UTF-8 string, because it contains an overlong null character. Our UTF-8 validator wrongly accepts overlong null as a valid UTF-8 sequence. This test fails because we disallow null codepoints, not because the UTF-8 is invalid, and the error message reflects that. If/when UTF-8 validation is changed to reject overlong null, then the expected error code and error message for this test should change. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8_ALLOW_NULL, 'UTF-8 string contains a U+0000 (null) character', 4), ), TestCase( 'utf8-key/invalid/accept', doc(utf8elem(b'abc\xffdef', 'bar')), """ The element key is not valid UTf-8, but we accept it if we don't do UTF-8 validation. """, ), TestCase( 'utf8-key/invalid/reject', doc(utf8elem(b'abc\xffdef', 'bar')), """ The element key is not valid UTF-8, and we reject it when we requested UTF-8 validation. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'utf8-key/overlong-null/reject', doc(utf8elem(b'abc\xc0\x80def', 'bar')), """ ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence The element key is invalid UTF-8 because it contains an overlong null. We accept the overlong null as a valid encoding of U+0000, but we reject the key because we disallow null in UTF-8 strings. If/when UTF-8 validation is changed to reject overlong null, then the expected error code and error message for this test should change. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8_ALLOW_NULL, 'UTF-8 string contains a U+0000 (null) character', 4), ), TestCase( 'utf8-key/overlong-null/accept', doc(utf8elem(b'abc\xc0\x80def', 'bar')), """ ! NOTE: overlong-null: This test relies on our UTF-8 validation accepting the `c0 80` sequence The element key is invalid UTF-8 because it contains an overlong null. We accept the overlong null as a valid encoding of U+0000, and we allow it in an element key because we pass ALLOW_NULL If/when UTF-8 validation is changed to reject overlong null, then this test case should instead reject the key string as invalid UTF-8. """, flags=f'{BSON_VALIDATE_UTF8} | {BSON_VALIDATE_UTF8_ALLOW_NULL}', ), TestCase( 'array/empty', doc(elem('array', Tag.Array, doc())), 'Simple empty array element', ), TestCase( 'array/simple', doc( elem( 'array', Tag.Array, doc( elem('0', Tag.Int32, i32le(42)), elem('1', Tag.Int32, i32le(1729)), elem('2', Tag.Int32, i32le(-8)), ), ) ), 'Simple array element of integers', ), TestCase( 'array/invalid-element', doc( elem( 'array', Tag.Array, doc( elem('0', Tag.Int32, i32le(42)), elem('1', Tag.Int32, i32le(1729)[-1:]), # Truncated elem('2', Tag.Int32, i32le(-8)), ), ) ), 'Simple array element of integers, but one element is truncated', error=corruption_at(34), ), TestCase( 'array/invalid-element-check-offset', doc( elem( 'array-shifted', Tag.Array, doc( elem('0', Tag.Int32, i32le(42)), elem('1', Tag.Int32, i32le(1729)[-1:]), # Truncated elem('2', Tag.Int32, i32le(-8)), ), ) ), """ This is the same as the array/invalid-element test, but with a longer key string on the parent array. This is to check that the error offset is properly adjusted for the additional characters. """, error=corruption_at(42), ), TestCase( 'symbol/simple', doc(elem('symbol', Tag.Symbol, string('void 0;'))), """ A simple document: { symbol: Symbol("void 0;") } """, ), TestCase( 'symbol/invalid-utf8/accept', doc(elem('symbol', Tag.Symbol, string(b'void\xff 0;'))), """ A simple symbol document, but the string contains invalid UTF-8 """, ), TestCase( 'symbol/invalid-utf8/reject', doc(elem('symbol', Tag.Symbol, string(b'void\xff 0;'))), """ A simple symbol document, but the string contains invalid UTF-8 """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'symbol/length-zero', doc(b'\x0e\0' + i32le(0) + b'\0'), 'Symbol string length must always be at least 1 for the null terminator', error=corruption_at(6), ), TestCase( 'symbol/length-too-short', doc(b'\x0e\0' + i32le(3) + b'bar\0'), """ Symbol string is three chars and a null terminator, but the declared length is 3 (should be 4) """, error=corruption_at(12), ), TestCase( 'code/simple', doc(elem('code', Tag.Code, string('void 0;'))), """ A simple document: { code: Code("void 0;") } """, ), TestCase( 'code/invalid-utf8/accept', doc(elem('code', Tag.Code, string(b'void\xff 0;'))), """ A simple code document, but the string contains invalid UTF-8 """, ), TestCase( 'code/invalid-utf8/reject', doc(elem('code', Tag.Code, string(b'void\xff 0;'))), """ A simple code document, but the string contains invalid UTF-8 """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'code/length-zero', doc(elem('code', Tag.Code, i32le(0), b'\0')), 'Code string length must always be at least 1 for the null terminator', error=corruption_at(10), ), TestCase( 'code/length-too-short', doc(elem('code', Tag.Code, i32le(3), b'bar\0')), 'Code string is three chars and a null terminator, but the declared length is 3 (should be 4)', error=corruption_at(16), ), # Code w/ scope TestCase( 'code-with-scope/simple', doc(elem('foo', Tag.CodeWithScope, code_with_scope('void 0;', doc()))), 'A simple valid code-with-scope element', ), TestCase( 'code-with-scope/invalid-code-length-zero', doc( elem( '', Tag.CodeWithScope, i32le(10), b'\0\0\0\0', # strlen b'\0', # code doc(), # scope ) ), """ Data { "": CodeWithScope("", {}) }, but the code string length is zero, when it must be at least 1 """, error=corruption_at(6), ), TestCase( 'code-with-scope/invalid-code-length-too-large', doc( elem( '', Tag.CodeWithScope, i32le(10), b'\xff\xff\xff\xff', # strlen (too big) b'\0', doc(), # Scope ) ), """ Data { "": CodeWithScope("", {}) }, but the code string length is way too large """, error=corruption_at(6), ), TestCase( 'code-with-scope/invalid-scope', doc(elem('foo', Tag.CodeWithScope, code_with_scope('void 0;', doc()[:-1]))), 'A code-with-scope element, but the scope document is corrupted', error=corruption_at(13), ), TestCase( 'code-with-scope/empty-key-in-scope', doc( elem( 'code', Tag.CodeWithScope, code_with_scope( 'void 0;', doc( elem('obj', Tag.Document, doc(utf8elem('', 'string'))), ), ), ) ), """ A code-with-scope element. The scope itself contains empty keys within objects, and we ask to reject empty keys. But the scope document should be treated as an opaque closure, so our outer validation rules do not apply. """, flags=BSON_VALIDATE_EMPTY_KEYS, ), TestCase( 'code-with-scope/corrupt-scope', doc( elem( 'code', Tag.CodeWithScope, code_with_scope( 'void 0;', doc( elem( 'foo', Tag.UTF8, i32le(0), # Invalid string length b'\0', ) ), ), ) ), 'A code-with-scope element, but the scope contains corruption', error=ErrorInfo(BSON_VALIDATE_CORRUPT, 'Error in scope document for element "code": corrupt BSON', offset=13), ), TestCase( 'code-with-scope/corrupt-scope-2', doc( elem( 'code', Tag.CodeWithScope, code_with_scope( 'void 0;', doc( elem( 'foo', Tag.UTF8, b'\xff\xff\xff\xff', # Invalid string length b'\0', ) ), ), ) ), 'A code-with-scope element, but the scope contains corruption', error=ErrorInfo(BSON_VALIDATE_CORRUPT, 'Error in scope document for element "code": corrupt BSON', offset=13), ), TestCase( 'regex/simple', doc(elem('regex', Tag.Regex, b'1234\0gi\0')), """ Simple document: { regex: Regex("1234", "gi") } """, ), TestCase( 'regex/invalid-opts', doc(elem('regex', Tag.Regex, b'foo\0bar')), """ A regular expression element with missing null terminator. The main option string "foo" has a null terminator, but the option component "bar" does not have a null terminator. A naive parse will see the doc's null terminator as the null terminator for the options string, but that's invalid! """, error=corruption_at(18), ), TestCase( 'regex/double-null', doc(elem('regex', Tag.Regex, b'foo\0bar\0\0')), """ A regular expression element with an extra null terminator. Since regex is delimited by its null terminator, the iterator will stop early before the actual EOD. """, error=corruption_at(21), ), TestCase( 'regex/invalid-utf8/accept', doc(elem('regex', Tag.Regex, b'foo\xffbar\0gi\0')), """ A regular expression that contains invalid UTF-8. """, ), TestCase( 'regex/invalid-utf8/reject', doc(elem('regex', Tag.Regex, b'foo\xffbar\0gi\0')), """ A regular expression that contains invalid UTF-8. """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'regex/invalid-utf8/accept-if-absent', doc(elem('regex', Tag.Regex, b'foo\0gi\0')), """ A regular valid UTf-8 regex. We check for invalid UTf-8, and accept becaues the regex is fine. """, flags=BSON_VALIDATE_UTF8, ), TestCase( 'dbpointer/string-length-zero', doc( elem( 'foo', Tag.DBPointer, i32le(0), # String length (invalid) b'\0', # Empty string b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ Document { "foo": DBPointer("", ) }, but the length header on the inner string is zero, when it must be at least 1. """, error=corruption_at(9), ), TestCase( 'dbpointer/string-length-too-big', doc( elem( 'foo', Tag.DBPointer, b'\xff\xff\xff\xff', # String length (invalid) b'foobar\0', # Simple string b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ Document { "foo": DBPointer("foobar", ) }, but the length header on the inner string is far too large """, error=corruption_at(9), ), TestCase( 'dbpointer/truncated', doc( utf8elem('a', 'b'), elem( 'foo', Tag.DBPointer, i32le(7), # 7 bytes, bleeding into the null terminator b'foobar', # Simple string, missing a null terminator. b'\x00\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ), utf8elem('a', 'b'), ), """ Document { "foo": DBPointer("foobar", ) }, but the length header on the string is one byte too large, causing it to use the first byte of the OID as the null terminator. This should fail when iterating. """, error=corruption_at(43), ), TestCase( 'dbpointer/missing-null', doc( elem( 'foo', Tag.DBPointer, i32le(4), b'abcd', # Missing null terminator b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ Document { "foo": DBPointer("abcd", ) }, the length header on the string is 4, but the fourth byte is not a null terminator. """, error=corruption_at(16), ), TestCase( 'dbpointer/invalid-utf8/accept', doc( elem( 'foo', Tag.DBPointer, string(b'abc\xffdef'), # String with invalid UTF-8 b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ DBPointer document, but the collection string contains invalid UTF-8 """, ), TestCase( 'dbpointer/invalid-utf8/reject', doc( elem( 'foo', Tag.DBPointer, string(b'abc\xffdef'), # String with invalid UTF-8 b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ DBPointer document, but the collection string contains invalid UTF-8 """, flags=BSON_VALIDATE_UTF8, error=ErrorInfo(BSON_VALIDATE_UTF8, 'Text element is not valid UTF-8', 4), ), TestCase( 'dbpointer/invalid-utf8/accept-if-absent', doc( elem( 'foo', Tag.DBPointer, string(b'abcdef'), # Valid string b'\x52\x59\xb5\x6a\xfa\x5b\xd8\x41\xd6\x58\x5d\x99', # OID ) ), """ DBPointer document, and we validate UTF-8. Accepts because there is no invalid UTF-8 here. """, flags=BSON_VALIDATE_UTF8, ), TestCase( 'subdoc/simple', doc(elem('doc', Tag.Document, doc(utf8elem('foo', 'bar')))), """ A simple document: { doc: { foo: "bar" } } """, ), TestCase( 'subdoc/invalid-shared-null', doc(elem('doc', Tag.Document, doc()[:-1])), """ A truncated subdocument element, with its null terminator accidentally overlapping the parent document's null. """, error=corruption_at(9), ), TestCase( 'subdoc/overlapping-utf8-null', doc(elem('doc', Tag.Document, doc(utf8elem('bar', 'baz\0')[:-1]))), """ Encodes the document: { "foo": { "bar": "baz" } } but the foo.bar UTF-8 string is truncated improperly and reuses the null terminator for "foo" """, error=corruption_at(18), ), TestCase( 'subdoc/invalid-element', doc(elem('doc', Tag.Document, doc(elem('dbl', Tag.Double, b'abcd')))), 'A subdocument that contains an invalid element', error=corruption_at(18), ), TestCase( 'subdoc/header-too-large', doc( elem( 'foo', Tag.Document, b'\xf7\xff\xff\xff\0', # Bad document ), ), """ Data {"foo": {}}, but the subdoc header is too large. """, error=corruption_at(9), ), TestCase( 'subdoc/header-too-small', doc( elem( 'test', Tag.Document, b'\x04\0\0\0', # Only four bytes. All docs must be at least 5 ), ), """ Nested document with a header value of 4, which is always too small. """, error=corruption_at(4), ), TestCase( 'subdoc/impossible-size', doc( elem( 'foo', Tag.Document, b'\xff\xff\xff\xff\0', # Bad document ), ), """ Data {"foo": {}}, but the subdoc header is UINT32_MAX/INT32_MIN, which becomes is an invalid document header. """, error=corruption_at(9), ), TestCase( 'null/simple', doc(elem('null', Tag.Null)), """ A simple document: { "null": null } """, ), TestCase( 'undefined/simple', doc(elem('undefined', Tag.Undefined)), """ A simple document: { "undefined": undefined } """, ), TestCase( 'binary/simple', doc(elem('binary', Tag.Binary, binary(0x80, b'12345'))), """ Simple binary data { "binary": Binary(0x80, b'12345') } """, ), TestCase( 'binary/bad-length-zero-subtype-2', doc( elem( 'binary', Tag.Binary, i32le(0), # Invalid: Zero length b'\x02', # subtype two i32le(4), # Length of 4 b'1234', # payload ), ), """ Binary data that has an invalid length header. It is subtype 2, which means it contains an additional length header. """, error=corruption_at(12), ), TestCase( 'binary/bad-inner-length-on-subtype-2', doc( elem( 'binary', Tag.Binary, i32le(8), # Valid length b'\x02', # subtype two i32le(2), # Invalid length of (should be 4) b'1234', # payload ), ), """ Binary data that has an valid outer length header, but the inner length header for subtype 2 has an incorrect value. """, error=corruption_at(17), ), TestCase( 'binary/bad-length-too-small', doc( elem( 'binary', Tag.Binary, i32le(2), # Length prefix (too small) b'\x80', # subtype b'1234', # payload ), ), """ Data { "binary": Binary(0x80, b'1234') }, but the length header on the Binary object is too small. This won't cause the binary to decode wrong, but it will cause the iterator to jump into the middle of the binary data which will not decode as a proper BSON element. """, error=corruption_at(22), ), TestCase( 'binary/bad-length-too-big', doc( elem( 'binary', Tag.Binary, b'\xf3\xff\xff\xff', # Length prefix (too big) b'\x80', # subtype b'1234', # data ), ), """ Data { "binary": Binary(0x80, b'1234') }, but the length header on the Binary object is too large. """, error=corruption_at(12), ), TestCase( 'binary/old-invalid/1', doc( elem( 'binary', Tag.Binary, binary( 2, i32le(5), # Bad length prefix: Should be 4 b'abcd', ), ), ), """ This is an old-style binary type 0x2. It has an inner length header of 5, but it should be 4. """, error=corruption_at(17), ), TestCase( 'binary/old-invalid/2', doc( elem( 'bin', Tag.Binary, binary( 2, b'abc', # Bad: Subtype 2 requires at least four bytes ), ) ), """ This is an old-style binary type 0x2. The data segment is too small to be valid. """, error=corruption_at(9), ), TestCase( 'minkey/simple', doc(elem('min', Tag.MinKey)), 'A simple document with a MinKey element', ), TestCase( 'maxkey/simple', doc(elem('max', Tag.MaxKey)), 'A simple document with a MaxKey element', ), TestCase( 'int32/simple', doc(elem('int32', Tag.Int32, i32le(42))), 'A simple document with a valid single int32 element', ), TestCase( 'int32/truncated', doc(elem('int32-truncated', Tag.Int32, i32le(42)[:-1])), 'Truncated 32-bit integer', error=corruption_at(21), ), TestCase('timestamp/simple', doc(elem('timestamp', Tag.Timestamp, i64le(1729))), """A simple timestamp element"""), TestCase( 'timestamp/truncated', doc(elem('timestamp', Tag.Timestamp, i64le(1729)[:-1])), """A truncated timestamp element""", error=corruption_at(15), ), TestCase( 'int64/simple', doc(elem('int64', Tag.Int64, i64le(1729))), 'A simple document with a valid single int64 element', ), TestCase( 'int64/truncated', doc(elem('int64-truncated', Tag.Int64, i64le(1729)[:-1])), 'Truncated 64-bit integer', error=corruption_at(21), ), TestCase( 'double/simple', doc(elem('double', Tag.Double, f64le(3.14))), 'Simple float64 element', ), TestCase( 'double/truncated', doc(elem('double-truncated', Tag.Double, f64le(3.13)[:-1])), 'Truncated 64-bit float', error=corruption_at(22), ), TestCase( 'boolean/simple-false', doc(elem('bool', Tag.Boolean, b'\x00')), """A simple boolean 'false'""", ), TestCase( 'boolean/simple-true', doc(elem('bool', Tag.Boolean, b'\x01')), """A simple boolean 'true'""", ), TestCase( 'boolean/invalid', doc(elem('bool', Tag.Boolean, b'\xc3')), """ An invalid boolean octet. Must be '0' or '1', but is 0xc3. """, error=corruption_at(10), ), TestCase( 'datetime/simple', doc(elem('utc', Tag.Datetime, b'\x0b\x98\x8c\x2b\x33\x01\x00\x00')), 'Simple datetime element', ), TestCase( 'datetime/truncated', doc(elem('utc', Tag.Datetime, b'\x0b\x98\x8c\x2b\x33\x01\x00')), 'Truncated datetime element', error=corruption_at(9), ), # DBRef TestCase( 'dbref/missing-id', doc(utf8elem('$ref', 'foo')), """This dbref document is missing an $id element""", flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, MSG_EXPECTED_ID_FOLLOWING_REF, 18), ), TestCase( 'dbref/non-id', doc(utf8elem('$ref', 'foo'), utf8elem('bar', 'baz')), """ The 'bar' element should be an '$id' element. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, MSG_EXPECTED_ID_FOLLOWING_REF, 18), ), TestCase( 'dbref/not-first-elements', doc(utf8elem('foo', 'bar'), utf8elem('$ref', 'a'), utf8elem('$id', 'b')), """ This would be a valid DBRef, but the "$ref" key must come first. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, disallowed_key('$', '$ref'), 17), ), TestCase( 'dbref/ref-without-id-with-db', doc(utf8elem('$ref', 'foo'), utf8elem('$db', 'bar')), """ There should be an $id element, but we skip straight to $db """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, MSG_EXPECTED_ID_FOLLOWING_REF, 18), ), TestCase( 'dbref/non-string-ref', doc(elem('$ref', Tag.Int32, i32le(42))), """ The $ref element must be a string, but is an integer. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, '$ref element must be a UTF-8 element', 4), ), TestCase( 'dbref/non-string-db', doc( utf8elem('$ref', 'foo'), utf8elem('$id', 'bar'), elem('$db', Tag.Int32, i32le(42)), ), """ The $db element should be a string, but is an integer. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, '$db element in DBRef must be a UTF-8 element', 31), ), TestCase( 'dbref/invalid-extras-between', doc( utf8elem('$ref', 'foo'), utf8elem('$id', 'bar'), utf8elem('extra', 'field'), utf8elem('$db', 'baz'), ), """ Almost a valid DBRef, but there is an extra field before $db. We reject $db as an invalid key. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, disallowed_key('$', '$db'), 48), ), TestCase( 'dbref/invalid-double-ref', doc( utf8elem('$ref', 'foo'), utf8elem('$ref', 'bar'), utf8elem('$id', 'baz'), ), """ Invalid DBRef contains a second $ref element. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, MSG_EXPECTED_ID_FOLLOWING_REF, 18), ), TestCase( 'dbref/invalid-missing-ref', doc(utf8elem('$id', 'foo')), """ DBRef document requires a $ref key to be first. """, flags=BSON_VALIDATE_DOLLAR_KEYS, error=ErrorInfo(BSON_VALIDATE_DOLLAR_KEYS, disallowed_key('$', '$id'), 4), ), TestCase( 'dbref/valid/simple', doc(utf8elem('$ref', 'foo'), utf8elem('$id', 'bar')), """ This is a simple valid DBRef element. """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'dbref/valid/simple-with-db', doc(utf8elem('$ref', 'foo'), utf8elem('$id', 'bar'), utf8elem('$db', 'baz')), """ A simple DBRef of the form: { $ref: "foo", $id: "bar", $db: "baz" } """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'dbref/valid/nested-id-doc', doc( utf8elem('$ref', 'foo'), elem( '$id', Tag.Document, doc( utf8elem('$ref', 'foo2'), utf8elem('$id', 'bar2'), utf8elem('$db', 'baz2'), ), ), utf8elem('$db', 'baz'), ), """ This is a valid DBRef of the form: { $ref: foo, $id: { $ref: "foo2", $id: "bar2", $db: "baz2" }, $db: "baz" } """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'dbref/valid/trailing-content', doc( utf8elem('$ref', 'foo'), utf8elem('$id', 'bar'), utf8elem('$db', 'baz'), utf8elem('extra', 'field'), ), """ A valid DBRef of the form: { $ref: "foo", $id: "bar", $db: "baz", extra: "field", } """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), TestCase( 'dbref/valid/trailing-content-no-db', doc( utf8elem('$ref', 'foo'), utf8elem('$id', 'bar'), utf8elem('extra', 'field'), ), """ A valid DBRef of the form: { $ref: "foo", $id: "bar", extra: "field", } """, flags=BSON_VALIDATE_DOLLAR_KEYS, ), ] if __name__ == '__main__': # We don't take an arguments, but error if any are given parser = argparse.ArgumentParser(description=__doc__) parser.parse_args() # Start with the header print(HEADER) # Print each test case for c in CASES: print() for part in generate(c): print(part, end='') # Print the registration function print(f'\n{GENERATED_NOTE}') print('void test_install_generated_bson_validation(TestSuite* suite) {') for c in CASES: print(f' TestSuite_Add(suite, "/bson/validate/" {json.dumps(c.name)}, {c.fn_name});') print('}') mongo-c-driver-2.2.1/src/libmongoc/000077500000000000000000000000001511661753600171175ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/.gitignore000066400000000000000000000012421511661753600211060ustar00rootroot00000000000000# Test program for mongoc_get_accept_args in CMakeLists.txt accept_test1.c # Example binaries aggregation1 basic-aggregation bulk-collation bulk1 bulk2 bulk3 bulk4 bulk5 bulk6 common-operations example-client example-collection-watch example-command-monitoring example-command-with-opts example-manage-collection-indexes example-gridfs example-gridfs-bucket example-pool example-resume example-scram example-sdam-monitoring example-session example-start-at-optime example-structured-log example-transaction example-update fam find-and-modify hello_mongoc mongoc-dump mongoc-ping mongoc2-stat mongoc-tail # Test binaries test-libmongoc test-mongoc-gssapi test-mongoc-cache mongo-c-driver-2.2.1/src/libmongoc/CMakeLists.txt000066400000000000000000001720641511661753600216710ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) project (libmongoc LANGUAGES C # Inherit the version from mongo-c-driver VERSION "${PROJECT_VERSION}" DESCRIPTION "The MongoDB C Database Driver library" ) # These values are inherited from the mongo-c-driver parent. These are named as to # match the CMake variables generated by project(). set(libmongoc_VERSION_PRERELEASE ${mongo-c-driver_VERSION_PRERELEASE}) set(libmongoc_VERSION_FULL ${mongo-c-driver_VERSION_FULL}) include (CheckSchedGetCPU) include (CheckStructHasMember) include (CheckSymbolExists) include (CheckTypeSize) include (CMakePushCheckState) include (InstallRequiredSystemLibraries) message (STATUS "libmongoc version (from VERSION_CURRENT file): ${MONGOC_VERSION}") # Defaults. set (MONGOC_ENABLE_COMPRESSION 0) set (MONGOC_ENABLE_COMPRESSION_SNAPPY 0) set (MONGOC_ENABLE_COMPRESSION_ZLIB 0) set (MONGOC_ENABLE_COMPRESSION_ZSTD 0) if(NOT DEFINED MONGOC_INSTALL_INCLUDEDIR) set(MONGOC_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/mongoc-${PROJECT_VERSION}") endif() if(NOT DEFINED MONGOC_INSTALL_CMAKEDIR) set(MONGOC_INSTALL_CMAKEDIR "${MONGO_C_DRIVER_INSTALL_CMAKEDIR}/mongoc-${PROJECT_VERSION}") endif() # Definition for mongoc-config.h: mongo_pick(MONGOC_ENABLE_SRV 1 0 ENABLE_SRV) set (MONGOC_OUTPUT_BASENAME "mongoc" CACHE STRING "Output mongoc library base name") if (NOT ENABLE_ZLIB MATCHES "SYSTEM|AUTO|BUNDLED|OFF") message (FATAL_ERROR "ENABLE_ZLIB option must be SYSTEM, BUNDLED, AUTO, or OFF" ) endif () if (NOT ENABLE_ZSTD MATCHES "ON|AUTO|OFF") message (FATAL_ERROR "ENABLE_ZSTD option must be ON, AUTO, or OFF") endif () set (ZLIB_INCLUDE_DIRS "") if (ENABLE_ZLIB MATCHES "SYSTEM|AUTO") message (STATUS "Searching for zlib CMake packages") include (FindZLIB) if (ZLIB_FOUND) message (STATUS " zlib found version \"${ZLIB_VERSION_STRING}\"") message (STATUS " zlib include path \"${ZLIB_INCLUDE_DIRS}\"") message (STATUS " zlib libraries \"${ZLIB_LIBRARIES}\"") else () if (ENABLE_ZLIB STREQUAL "SYSTEM") message (FATAL_ERROR "Unable to find system zlib package. Either specify the zlib \ location by setting ZLIB_ROOT, or else set ENABLE_ZLIB=BUNDLED or \ set ENABLE_ZLIB=OFF." ) endif () set (ZLIB_LIBRARIES "") endif () endif () if ( (ENABLE_ZLIB STREQUAL "BUNDLED") OR (ENABLE_ZLIB STREQUAL "AUTO" AND NOT ZLIB_FOUND) ) message (STATUS "Enabling zlib compression (bundled)") add_library (zlib_obj OBJECT ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/adler32.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/crc32.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/deflate.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/infback.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/inffast.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/inflate.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/inftrees.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/trees.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/zutil.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/compress.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/uncompr.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/gzclose.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/gzlib.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/gzread.c ${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1/gzwrite.c ) set_property (TARGET zlib_obj PROPERTY POSITION_INDEPENDENT_CODE TRUE) # This tells the bundled zlib where to find its generated headers target_include_directories (zlib_obj BEFORE PUBLIC "${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1" "${CMAKE_BINARY_DIR}/src/zlib-1.3.1" ) # Disable all warnings for compiling Zlib target_compile_options (zlib_obj PRIVATE -w) set (SOURCES ${SOURCES} $) # This tells mongoc_shared/mongoc_static where to find generated zlib headers set ( ZLIB_INCLUDE_DIRS "${mongo-c-driver_SOURCE_DIR}/src/zlib-1.3.1" "${CMAKE_BINARY_DIR}/src/zlib-1.3.1" ) endif () if (NOT ENABLE_ZLIB STREQUAL "OFF") # At this point the system zlib was found, or the bundled library was used include (CheckIncludeFiles) check_include_files ("unistd.h" HAVE_UNISTD_H) check_include_files ("stdarg.h" HAVE_STDARG_H) if (HAVE_UNISTD_H) add_definitions (-DHAVE_UNISTD_H) list (APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_UNISTD_H) endif () if (HAVE_STDARG_H) add_definitions (-DHAVE_STDARG_H) list (APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDARG_H) endif () set (MONGOC_ENABLE_COMPRESSION 1) set (MONGOC_ENABLE_COMPRESSION_ZLIB 1) else () message (STATUS "Disabling zlib compression") endif () if (NOT ENABLE_ZSTD STREQUAL OFF) message (STATUS "Searching for compression library zstd") find_package(PkgConfig) pkg_check_modules (ZSTD libzstd) if (NOT ZSTD_FOUND) if (ENABLE_ZSTD MATCHES "ON") message (FATAL_ERROR " Not found") else () message (STATUS " Not found") endif () # The compression format below this version isn't supported. See SERVER-43070 elseif (${ZSTD_VERSION} VERSION_LESS "0.8.0") if (ENABLE_ZSTD MATCHES "ON") message (FATAL_ERROR "Detected zstd version ${ZSTD_VERSION} but version 0.8.0 required") else () message (STATUS "Detected zstd version ${ZSTD_VERSION} but version 0.8.0 required") endif () else () message (STATUS " Found zstd version ${ZSTD_VERSION} in ${ZSTD_INCLUDE_DIRS}") set (MONGOC_ENABLE_COMPRESSION 1) set (MONGOC_ENABLE_COMPRESSION_ZSTD 1) include_directories (${ZSTD_INCLUDE_DIRS}) link_directories (${ZSTD_LIBRARY_DIRS}) set (MONGOC_ZSTD_LIBRARIES ${ZSTD_LINK_LIBRARIES}) endif() endif() add_library(_mongoc-dependencies INTERFACE) add_library(mongo::detail::c_dependencies ALIAS _mongoc-dependencies) target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_platform) target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_platform $<$:advapi32.lib>) install(TARGETS _mongoc-dependencies EXPORT mongoc-targets) set_property(TARGET _mongoc-dependencies PROPERTY EXPORT_NAME detail::c_dependencies) # d888888b db .d8888. # `~~88~~' 88 88' YP # 88 88 `8bo. # 88 88 `Y8b. # 88 88booo. db 8D # YP Y88888P `8888Y' # Pick the TLS library to use. function(_pick_which_tls_lib ssl_opt) # Initial value, if not later set: set_property(DIRECTORY PROPERTY _mongoc-tls-backend OFF) if(ssl_opt STREQUAL "AUTO") # Try to pick one automatically _auto_pick_tls_lib() elseif(ssl_opt) # The user named a TLS library specifically. Use that one: _use_named_tls_lib("${ssl_opt}") else() # User has disabled TLS selection endif() endfunction() # Attempt to automatically find and use a TLS library for the current platform function(_auto_pick_tls_lib) if(WIN32) # Windows has SecureChannel _use_named_tls_lib(WINDOWS) elseif(APPLE) # Apple has SecureTransport _use_named_tls_lib(DARWIN) else() # Try to find one of the common open-source TLS libraries find_package(OpenSSL) if(OpenSSL_FOUND) _use_named_tls_lib(OPENSSL) endif() endif() endfunction() # Per-backend link libs/options: set(SecureTransport/LINK_LIBRARIES "-framework CoreFoundation" "-framework Security") set(SecureTransport/pkg_config_LIBS -framework Corefoundation -framework Security) set(SecureChannel/LINK_LIBRARIES secur32.lib crypt32.lib Bcrypt.lib ncrypt.lib) set(SecureChannel/pkg_config_LIBS ${SecureChannel/LINK_LIBRARIES}) set(OpenSSL/LINK_LIBRARIES OpenSSL::SSL OpenSSL::Crypto $<$:crypt32.lib>) set(OpenSSL/pkg_config_LIBS -lssl -lcrypto $<$:crypt32.lib>) # Use *exactly* the TLS library identified by the given name, which is one of # `OPENSSL`, `DARWIN`, or `WINDOWS`. function(_use_named_tls_lib libname) # Use this property to track what package we import for our TLS libraries: set_property(DIRECTORY PROPERTY _mongoc-tls-package NO) if(libname STREQUAL "OPENSSL") find_package(OpenSSL REQUIRED) set(backend OpenSSL) set_property(DIRECTORY PROPERTY _mongoc-tls-package OpenSSL) elseif(libname STREQUAL "DARWIN") set(backend SecureTransport) elseif(libname STREQUAL "WINDOWS") set(backend SecureChannel) else() message(FATAL_ERROR "Unknown TLS library requested: “${libname}â€") endif() add_library(_mongoc-tls_backend INTERFACE) install(TARGETS _mongoc-tls_backend EXPORT mongoc-targets) target_link_libraries(_mongoc-dependencies INTERFACE _mongoc-tls_backend) set_property(TARGET _mongoc-tls_backend PROPERTY EXPORT_NAME detail::c_tls_backend) target_link_libraries(_mongoc-tls_backend INTERFACE ${${backend}/LINK_LIBRARIES}) target_link_options(_mongoc-tls_backend INTERFACE ${${backend}/LINK_OPTIONS}) set_property(DIRECTORY PROPERTY _mongoc-tls-backend "${backend}") endfunction() _pick_which_tls_lib("${ENABLE_SSL}") # This property will be set by _pick_which_tls_lib: get_directory_property(TLS_BACKEND _mongoc-tls-backend) message(STATUS "libmongoc TLS : ${TLS_BACKEND}") # Used by *-config.cmake to do a find_dependency(): get_directory_property(TLS_IMPORT_PACKAGE _mongoc-tls-package) set_package_properties( OpenSSL PROPERTIES DESCRIPTION "the standard open-source implementation of TLS, X509, and more" TYPE OPTIONAL PURPOSE "Provides a cryptography and TLS backend" ) mongo_bool01(MONGOC_ENABLE_SSL [[TLS_BACKEND]]) mongo_bool01(MONGOC_ENABLE_SSL_SECURE_CHANNEL [[TLS_BACKEND STREQUAL "SecureChannel"]]) mongo_bool01(MONGOC_ENABLE_SSL_SECURE_TRANSPORT [[TLS_BACKEND STREQUAL "SecureTransport"]]) mongo_bool01(MONGOC_ENABLE_SSL_OPENSSL [[TLS_BACKEND STREQUAL "OpenSSL"]]) mongo_bool01(MONGOC_ENABLE_CRYPTO [[TLS_BACKEND]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_LIBCRYPTO [[MONGOC_ENABLE_SSL_OPENSSL]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_CNG [[MONGOC_ENABLE_SSL_SECURE_CHANNEL]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO [[MONGOC_ENABLE_SSL_SECURE_TRANSPORT]]) mongo_bool01(MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE [[ENABLE_CRYPTO_SYSTEM_PROFILE]]) add_feature_info("TLS" "${MONGOC_ENABLE_SSL}" "for secure network communication (${TLS_BACKEND})") add_feature_info("Cryptography" "${MONGOC_ENABLE_CRYPTO}" "cryptographic primitives (${TLS_BACKEND})") include(CMakePushCheckState) include(CheckSymbolExists) if(TLS_BACKEND STREQUAL "OpenSSL") # Check for newer OpenSSL string functions cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) check_symbol_exists( ASN1_STRING_get0_data "openssl/asn1.h" HAVE_ASN1_STRING_GET0_DATA ) cmake_pop_check_state() endif() mongo_bool01(MONGOC_HAVE_ASN1_STRING_GET0_DATA [[HAVE_ASN1_STRING_GET0_DATA]]) if(ENABLE_CRYPTO_SYSTEM_PROFILE AND NOT MONGOC_ENABLE_SSL_OPENSSL) message (FATAL_ERROR "ENABLE_CRYPTO_SYSTEM_PROFILE is only available with OpenSSL") endif() set(_aws_feature_desc "authenticate with MongoDB servers using credentials from AWS instance metadata") if(ENABLE_MONGODB_AWS_AUTH) # We may want AWS auth if(NOT MONGOC_ENABLE_SSL) # No TLS libs if(ENABLE_MONGODB_AWS_AUTH STREQUAL "AUTO") # Okay: Just turn it off message(STATUS "Note: AWS Authentication was disabled automatically because no TLS library is found/enabled") set(_enable_aws_auth FALSE) add_feature_info("AWS Authentication" OFF "${_aws_feature_desc}. (Disabled automatically: No TLS backend available)") else() # Bad message(FATAL_ERROR "MongoDB AWS Authentication requires a TLS library, no TLS library was found/enabled") endif() endif() set(_enable_aws_auth TRUE) add_feature_info("AWS Authentication" ON "${_aws_feature_desc}") else() # AWS Auth is explicitly disabled set(_enable_aws_auth FALSE) add_feature_info("AWS Authentication" OFF "${_aws_feature_desc}. (Manually disabled)") endif() # .d8888. .d8b. .d8888. db # 88' YP d8' `8b 88' YP 88 # `8bo. 88ooo88 `8bo. 88 # `Y8b. 88~~~88 `Y8b. 88 # db 8D 88 88 db 8D 88booo. # `8888Y' YP YP `8888Y' Y88888P function(_pick_sasl sasl) if(sasl STREQUAL "AUTO") if(WIN32) # On Windows: Use SSPI _use_sasl("SSPI") else() # Other platforms: Use Cyrus (aka libsasl2) find_package(SASL2 2.0) if(SASL2_FOUND) # Found it _use_sasl("CYRUS") else() # Nope. That's okay, just turn SASL off set_property(DIRECTORY PROPERTY _mongoc-sasl-backend NOTFOUND) endif() endif() elseif(sasl) _use_sasl("${sasl}") else() set_property(DIRECTORY PROPERTY _mongoc-sasl-backend OFF) endif() endfunction() # Use the named SASL library. Must be either "CYRUS" or "SSPI" function(_use_sasl libname) add_library(_mongoc-sasl_backend INTERFACE) set_property(TARGET _mongoc-sasl_backend PROPERTY EXPORT_NAME detail::c_sasl_backend) target_link_libraries(_mongoc-dependencies INTERFACE _mongoc-sasl_backend) install(TARGETS _mongoc-sasl_backend EXPORT mongoc-targets) if(libname STREQUAL "SSPI") target_link_libraries(_mongoc-sasl_backend INTERFACE secur32.lib crypt32.lib Shlwapi.lib) set(backend "SSPI") elseif(libname STREQUAL "CYRUS") find_package(SASL2 2.0 REQUIRED) target_link_libraries(_mongoc-sasl_backend INTERFACE SASL2::SASL2) install(FILES "${mongo-c-driver_SOURCE_DIR}/build/cmake/FindSASL2.cmake" DESTINATION "${MONGOC_INSTALL_CMAKEDIR}/3rdParty") set(backend "Cyrus") else() message(FATAL_ERROR "Unknown SASL backend “${libname}â€") endif() set_property(DIRECTORY PROPERTY _mongoc-sasl-backend "${backend}") endfunction() _pick_sasl("${ENABLE_SASL}") # Variable is used here, as well as within the mongoc-config.cmake template: get_directory_property(SASL_BACKEND _mongoc-sasl-backend) message(STATUS "Using SASL backend : ${SASL_BACKEND}") set_package_properties(SASL2 PROPERTIES DESCRIPTION "Cyrus implementation of SASL" TYPE OPTIONAL PURPOSE "Provides libmongoc SASL authentication support" ) if(SASL_BACKEND STREQUAL "Cyrus") cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES SASL2::SASL2) check_symbol_exists( sasl_client_done sasl/sasl.h SASL2_HAVE_SASL_CLIENT_DONE ) cmake_pop_check_state() endif() mongo_bool01(MONGOC_HAVE_SASL_CLIENT_DONE [[SASL2_HAVE_SASL_CLIENT_DONE]]) mongo_bool01(MONGOC_ENABLE_SASL_SSPI [[SASL_BACKEND STREQUAL "SSPI"]]) mongo_bool01(MONGOC_ENABLE_SASL_CYRUS [[SASL_BACKEND STREQUAL "Cyrus"]]) mongo_bool01(MONGOC_ENABLE_SASL [[MONGOC_ENABLE_SASL_SSPI OR MONGOC_ENABLE_SASL_CYRUS]]) add_feature_info( "SASL Authentication" "${MONGOC_ENABLE_SASL}" "authenticate with MongoDB servers using SASL: “Simple Authentication and Security Layer†(${SASL_BACKEND})" ) if (WIN32) SET (CMAKE_EXTRA_INCLUDE_FILES "ws2tcpip.h") else () SET (CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") endif () CHECK_TYPE_SIZE (socklen_t HAVE_SOCKLEN) SET (CMAKE_EXTRA_INCLUDE_FILES) if (HAVE_SOCKLEN) set (MONGOC_HAVE_SOCKLEN 1) set (MONGOC_SOCKET_ARG3 "socklen_t") else () set (MONGOC_HAVE_SOCKLEN 0) set (MONGOC_SOCKET_ARG3 "int") endif () # Find name resolution libaries. Also sets definitions used in configure_file(): include(ResSearch) function (mongoc_get_accept_args ARG2 ARG3) SET (VAR 0) foreach (ARG2_VAL "struct sockaddr" "void") foreach (ARG3_VAL "socklen_t" "size_t" "int") MATH (EXPR VAR "${VAR}+1") FILE (WRITE ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.c "#include #include int main () { int a = 0; ${ARG2_VAL} *b = 0; ${ARG3_VAL} *c = 0; accept (a, b, c); return 0; } ") TRY_COMPILE (RES ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/accept_test${VAR}.c CMAKE_FLAGS "-Werror -DCMAKE_CXX_LINK_EXECUTABLE='echo not linking now...'" OUTPUT_VARIABLE LOG2) if (RES) message ( STATUS "Detected parameters: accept (int, ${ARG2_VAL} *, ${ARG3_VAL} *)") set (${ARG2} ${ARG2_VAL} PARENT_SCOPE) set (${ARG3} ${ARG3_VAL} PARENT_SCOPE) return () endif () endforeach () endforeach () endfunction () # Reasonable defaults. set (MONGOC_SOCKET_ARG2 "struct sockaddr") set (MONGOC_SOCKET_ARG3 "socklen_t") if (NOT WIN32) mongoc_get_accept_args (MONGOC_SOCKET_ARG2 MONGOC_SOCKET_ARG3) endif () set (MONGOC_CC ${CMAKE_C_COMPILER}) set (MONGOC_USER_SET_CFLAGS ${CMAKE_C_FLAGS}) set (MONGOC_USER_SET_LDFLAGS ${CMAKE_EXE_LINKER_FLAGS}) if (ENABLE_TRACING) set (MONGOC_TRACE 1) else () set (MONGOC_TRACE 0) endif () # Sets SNAPPY_LIBRARIES and SNAPPY_INCLUDE_DIRS. include (FindSnappy) if (SNAPPY_INCLUDE_DIRS) set (MONGOC_ENABLE_COMPRESSION 1) include_directories ("${SNAPPY_INCLUDE_DIRS}") endif () mongo_bool01 (MONGOC_ENABLE_SHM_COUNTERS ENABLE_SHM_COUNTERS) # Configure In-Use Encryption set (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION 0) if (NOT ENABLE_CLIENT_SIDE_ENCRYPTION MATCHES "AUTO|ON|OFF") message (FATAL_ERROR, "ENABLE_CLIENT_SIDE_ENCRYPTION option must be AUTO, ON, or OFF") endif () if (NOT MONGOC_ENABLE_SSL) if (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) message (FATAL_ERROR "SSL disabled, but is required for In-Use Encryption support.") elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL AUTO) message (STATUS "SSL disabled. Configuring without In-Use Encryption support.") endif () elseif (NOT ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL OFF) message (STATUS "Searching for libmongocrypt") if (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) # do not suppress log output if find_package cannot find libmongocrypt find_package (mongocrypt) elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL AUTO) find_package (mongocrypt QUIET) endif () if (mongocrypt_FOUND AND "${mongocrypt_VERSION}" VERSION_LESS 1.15.1) message (STATUS " libmongocrypt found at ${mongocrypt_DIR}") message (STATUS " libmongocrypt version ${mongocrypt_VERSION} found") message (STATUS " libmongocrypt version 1.15.1 is required to enable In-Use Encryption Support.") set (REQUIRED_MONGOCRYPT_VERSION_FOUND OFF) elseif (mongocrypt_FOUND) set (REQUIRED_MONGOCRYPT_VERSION_FOUND ON) else () set (REQUIRED_MONGOCRYPT_VERSION_FOUND OFF) endif () if (REQUIRED_MONGOCRYPT_VERSION_FOUND) set (LIBMONGOCRYPT_TARGET mongo::mongocrypt) get_target_property (LIBMONGOCRYPT_RUNTIME_LIBRARY mongo::mongocrypt LOCATION) get_filename_component(LIBMONGOCRYPT_LIBRARY_LOCATION ${LIBMONGOCRYPT_RUNTIME_LIBRARY} DIRECTORY) find_library (LIBMONGOCRYPT_LIBRARY NAMES mongocrypt PATHS ${LIBMONGOCRYPT_LIBRARY_LOCATION}) get_target_property (LIBMONGOCRYPT_INCLUDE_DIRECTORIES mongo::mongocrypt INTERFACE_INCLUDE_DIRECTORIES) message (STATUS " libmongocrypt found at ${LIBMONGOCRYPT_LIBRARY}") message (STATUS " libmongocrypt include path ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}") message (STATUS " libmongocrypt version ${mongocrypt_VERSION}") set (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION 1) elseif (ENABLE_CLIENT_SIDE_ENCRYPTION STREQUAL ON) message (FATAL_ERROR "Required library (libmongocrypt) not found.") else () message (STATUS "libmongocrypt not found. Configuring without In-Use Encryption support.") endif () endif () CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage" ss_family "sys/socket.h" MONGOC_HAVE_SS_FAMILY) if (NOT MONGOC_HAVE_SS_FAMILY) set (MONGOC_HAVE_SS_FAMILY 0) else () set (MONGOC_HAVE_SS_FAMILY 1) endif () # Check if BCryptDeriveKeyPBKDF2 is defined in bcrypt.h if (WIN32 AND MONGOC_ENABLE_CRYPTO_CNG) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_WIN32_WINNT=0x0601) list(APPEND CMAKE_REQUIRED_LIBRARIES Bcrypt.lib) check_symbol_exists (BCryptDeriveKeyPBKDF2 "windows.h;bcrypt.h" HAVE_BCRYPT_PBKDF2) cmake_pop_check_state() endif () if (HAVE_BCRYPT_PBKDF2) set (MONGOC_HAVE_BCRYPT_PBKDF2 1) else () set (MONGOC_HAVE_BCRYPT_PBKDF2 0) endif () set (MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-azure.c ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-nsinfo.c ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-rpc.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-aggregate.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-apm.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-async.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-async-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-buffer.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulk-operation.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-change-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-pool.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-side-encryption.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-aws.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-oidc.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-sasl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-collection.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-compression.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-counters.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypt.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-change-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-cmd-deprecated.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-find.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor-array.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-database.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-error.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-deprioritized-servers.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-flags.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-find-and-modify.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-generation-map.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-page.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-handshake.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-host-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-http.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-interrupt.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-list.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-linux-distro-scanner.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-log.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-log-and-monitor-private.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-memcmp.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cmd.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-oidc-cache.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-oidc-callback.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-oidc-env.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opcode.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-optional.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opts-helpers.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opts.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-queue.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-concern.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-prefs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rpc.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-api.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-description.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-session.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-monitor.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-set.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-shared.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-socket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-buffered.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-file.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs-download.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs-upload.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-socket.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-structured-log.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-timeout.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-background-monitoring.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description-apm.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-scanner.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ts-pool.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-uri.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-util.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version-functions.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-command.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-concern.c ${PROJECT_SOURCE_DIR}/src/mongoc/service-gcp.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-atomic.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-b64.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-md5.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-json.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-string.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-oid.c ${mongo-c-driver_SOURCE_DIR}/src/common/src/common-thread.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-scram.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-cng.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-cng.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-secure-channel.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-secure-channel.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-common-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-common-crypto.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-secure-transport.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-secure-transport.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-crypto-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl-bio.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-openssl.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ocsp-cache.c ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulkwrite.c ) if (MONGOC_ENABLE_SASL) list (APPEND MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sasl.c) if (MONGOC_ENABLE_SASL_CYRUS) message (STATUS "Compiling against Cyrus SASL") list (APPEND MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-cyrus.c) list (APPEND MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cyrus.c) elseif (MONGOC_ENABLE_SASL_SSPI) message (STATUS "Compiling against Windows SSPI") list (APPEND MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cluster-sspi.c) list (APPEND MONGOC_SOURCES ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sspi.c) endif () else () message (STATUS "SASL disabled") endif () # Enable unconditional warnings-as-errors for our source code. set_property(SOURCE ${MONGOC_SOURCES} APPEND PROPERTY COMPILE_OPTIONS ${mongoc-warning-options}) list (APPEND SOURCES ${MONGOC_SOURCES}) set (HEADERS ${PROJECT_BINARY_DIR}/src/mongoc/mongoc-config.h ${PROJECT_BINARY_DIR}/src/mongoc/mongoc-version.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-apm.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulk-operation.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulkwrite.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-change-stream.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-pool.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-side-encryption.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-collection.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-cursor.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-database.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-error.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-flags.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-find-and-modify.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-bucket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-page.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-gridfs-file-list.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-handshake.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-host-list.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-init.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-iovec.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-log.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-macros.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-oidc-callback.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-opcode.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-optional.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-prelude.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-concern.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-read-prefs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-api.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-server-description.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-client-session.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-sleep.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-socket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls-openssl.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-buffered.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-file.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-gridfs.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-socket.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-structured-log.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-topology-description.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-uri.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version-functions.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-write-concern.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-rand.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-stream-tls.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-ssl.h ${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-bulkwrite.h ) configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-config.h.in" "${PROJECT_BINARY_DIR}/src/mongoc/mongoc-config.h" ) set(MONGOC_CXX_COMPILER_ID "Unknown") set(MONGOC_CXX_COMPILER_VERSION "") if(DEFINED CMAKE_CXX_COMPILER_ID) set(MONGOC_CXX_COMPILER_ID "${CMAKE_CXX_COMPILER_ID}") endif() if(DEFINED CMAKE_CXX_COMPILER_VERSION) set(MONGOC_CXX_COMPILER_VERSION "${CMAKE_CXX_COMPILER_VERSION}") endif() configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-config-private.h.in" "${PROJECT_BINARY_DIR}/src/mongoc/mongoc-config-private.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/src/mongoc/mongoc-version.h.in" "${PROJECT_BINARY_DIR}/src/mongoc/mongoc-version.h" ) set (LIBRARIES ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) set (STATIC_LIBRARIES ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY} ) # utf8proc configuration find_package(Utf8Proc REQUIRED) set(UTF8PROC_INCLUDE_DIRS, "") if (USE_BUNDLED_UTF8PROC) set ( UTF8PROC_INCLUDE_DIRS "${mongo-c-driver_SOURCE_DIR}/src/utf8proc-2.8.0" ) list(APPEND SOURCES $) else() target_link_libraries(_mongoc-dependencies INTERFACE utf8proc) endif() if(ENABLE_SRV) # Interface target defined by ResSearch.cmake: if(NOT TARGET mongo::detail::c_resolve) message(SEND_ERROR "ENABLE_SRV is “${ENABLE_SRV}â€, but we were unable to find a name resolution library") endif() target_link_libraries(_mongoc-dependencies INTERFACE mongo::detail::c_resolve) endif() if (MONGOC_ENABLE_MONGODB_AWS_AUTH) set (KMS_MSG_SOURCES ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/hexlify.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_b64.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_caller_identity_request.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_crypto_apple.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_crypto_libcrypto.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_crypto_none.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_crypto_windows.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_decrypt_request.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_encrypt_request.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_kmip_response_parser.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_kv_list.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_message.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_port.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_request.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_request_opt.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_request_str.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_response.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/kms_response_parser.c ${mongo-c-driver_SOURCE_DIR}/src/kms-message/src/sort.c ) # Disable warnings on bundled kms_message source files. set_source_files_properties (${KMS_MSG_SOURCES} PROPERTIES COMPILE_FLAGS -w) set (SOURCES ${SOURCES} ${KMS_MSG_SOURCES}) set (KMS_MSG_DEFINITIONS KMS_MSG_STATIC KMS_MESSAGE_ENABLE_CRYPTO) include (TestBigEndian) TEST_BIG_ENDIAN (KMS_BIG_ENDIAN) if (KMS_BIG_ENDIAN) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_BIG_ENDIAN) else () set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_LITTLE_ENDIAN) endif () if (MONGOC_ENABLE_CRYPTO_CNG) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_CNG) elseif (MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_COMMON_CRYPTO) elseif(MONGOC_ENABLE_CRYPTO_LIBCRYPTO) set (KMS_MSG_DEFINITIONS ${KMS_MSG_DEFINITIONS} KMS_MESSAGE_ENABLE_CRYPTO_LIBCRYPTO) else () message (FATAL_ERROR "MONGODB-AWS requires a crypto library") endif() endif () if (TARGET bson::static) add_library (mcd_rpc STATIC EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/mongoc/mcd-rpc.c) target_include_directories (mcd_rpc PUBLIC ${PROJECT_SOURCE_DIR}/src) target_link_libraries (mcd_rpc PUBLIC bson::static) if (NOT WIN32 AND ENABLE_PIC) set_property (TARGET mcd_rpc PROPERTY POSITION_INDEPENDENT_CODE TRUE) endif () set_target_properties (mcd_rpc PROPERTIES OUTPUT_NAME "mcd-rpc") endif () set ( UTHASH_INCLUDE_DIR "${mongo-c-driver_SOURCE_DIR}/src/uthash" ) if (ENABLE_SHARED) add_library (mongoc_shared SHARED ${SOURCES} ${HEADERS}) add_library(mongoc::shared ALIAS mongoc_shared) set_property(TARGET mongoc_shared PROPERTY EXPORT_NAME mongoc::shared) if(WIN32) # Add resource-definition script for Windows shared library (.dll). configure_file(libmongoc.rc.in libmongoc.rc) target_sources(mongoc_shared PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/libmongoc.rc) endif() set_target_properties (mongoc_shared PROPERTIES CMAKE_CXX_VISIBILITY_PRESET hidden) target_link_libraries (mongoc_shared PRIVATE ${LIBRARIES} PUBLIC bson::shared mongo::detail::c_dependencies) target_include_directories (mongoc_shared PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_shared PRIVATE ${UTF8PROC_INCLUDE_DIRS}) target_include_directories (mongoc_shared PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) target_include_directories (mongoc_shared PRIVATE ${UTHASH_INCLUDE_DIR}) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) target_include_directories (mongoc_shared PRIVATE "${mongo-c-driver_SOURCE_DIR}/src/kms-message/src") if (APPLE) set_target_properties (mongoc_shared PROPERTIES LINK_FLAGS "-Wl,-unexported_symbols_list,\"${mongo-c-driver_SOURCE_DIR}/build/cmake/libmongoc-hidden-symbols.txt\"") elseif (UNIX) set_target_properties (mongoc_shared PROPERTIES LINK_FLAGS "-Wl,--version-script=\"${mongo-c-driver_SOURCE_DIR}/build/cmake/libmongoc-hidden-symbols.map\"") endif () endif () target_compile_definitions (mongoc_shared PRIVATE MONGOC_COMPILATION ${KMS_MSG_DEFINITIONS} MCOMMON_NAME_PREFIX=_mongoc_mcommon ) if (USE_BUNDLED_UTF8PROC) target_compile_definitions (mongoc_shared PRIVATE UTF8PROC_STATIC) endif () # Several directories in the source and build trees contain headers we would like # include via relative reference, but they all end up in the same install path target_include_directories ( mongoc_shared PUBLIC $ $ $ $ $ ) set_target_properties (mongoc_shared PROPERTIES OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}${PROJECT_VERSION_MAJOR}" VERSION "${PROJECT_VERSION}" SOVERSION "${PROJECT_VERSION_MAJOR}" pkg_config_REQUIRES "bson${PROJECT_VERSION_MAJOR}" ) mongo_generate_pkg_config(mongoc_shared INSTALL RENAME mongoc${PROJECT_VERSION_MAJOR}.pc) add_executable (mongoc-stat ${mongo-c-driver_SOURCE_DIR}/src/tools/mongoc-stat.c) target_compile_options (mongoc-stat PRIVATE ${mongoc-warning-options}) target_link_libraries (mongoc-stat mongoc_shared ${LIBRARIES}) set_property (TARGET mongoc-stat PROPERTY OUTPUT_NAME mongoc${PROJECT_VERSION_MAJOR}-stat) # mongoc-stat works if shared memory performance counters are enabled. if (ENABLE_SHM_COUNTERS) install (TARGETS mongoc-stat EXPORT mongoc_targets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") endif () # ENABLE_SHM_COUNTERS endif () # ENABLE_SHARED if (MONGOC_ENABLE_STATIC_BUILD) add_library (mongoc_static STATIC ${SOURCES} ${HEADERS}) add_library(mongoc::static ALIAS mongoc_static) set_property(TARGET mongoc_static PROPERTY EXPORT_NAME mongoc::static) target_link_libraries (mongoc_static PUBLIC ${STATIC_LIBRARIES} bson::static mongo::detail::c_dependencies) if (NOT WIN32 AND ENABLE_PIC) set_property(TARGET mongoc_static PROPERTY POSITION_INDEPENDENT_CODE TRUE) message (STATUS "Adding -fPIC to compilation of mongoc_static components") endif () if(ENABLE_SRV AND RESOLVE_LIB_NAME) # The static library needs to link to the resolver in pkg-config: set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS "-l${RESOLVE_LIB_NAME}") endif() if(SASL_BACKEND STREQUAL "Cyrus") set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS "-lsasl2") endif() set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS ${${TLS_BACKEND}/pkg_config_LIBS}) target_include_directories (mongoc_static PRIVATE ${ZLIB_INCLUDE_DIRS}) target_include_directories (mongoc_static PRIVATE ${UTF8PROC_INCLUDE_DIRS}) target_include_directories (mongoc_static PRIVATE ${LIBMONGOCRYPT_INCLUDE_DIRECTORIES}) target_include_directories (mongoc_static PRIVATE ${UTHASH_INCLUDE_DIR}) if (MONGOC_ENABLE_MONGODB_AWS_AUTH) target_include_directories (mongoc_static PRIVATE "${mongo-c-driver_SOURCE_DIR}/src/kms-message/src") endif () target_compile_definitions (mongoc_static PUBLIC MONGOC_STATIC PRIVATE MONGOC_COMPILATION ${KMS_MSG_DEFINITIONS} MCOMMON_NAME_PREFIX=_mongoc_mcommon ) if (USE_BUNDLED_UTF8PROC) target_compile_definitions (mongoc_static PRIVATE UTF8PROC_STATIC) endif () # Several directories in the source and build trees contain headers we would like # include via relative reference, but they all end up in the same install path target_include_directories ( mongoc_static PUBLIC $ $ $ $ $ ) set_target_properties (mongoc_static PROPERTIES VERSION "${PROJECT_VERSION}" OUTPUT_NAME "${MONGOC_OUTPUT_BASENAME}${PROJECT_VERSION_MAJOR}" pkg_config_REQUIRES "bson${PROJECT_VERSION_MAJOR}-static" ) if(MONGOC_ENABLE_STATIC_INSTALL) mongo_generate_pkg_config (mongoc_static FILENAME mongoc${PROJECT_VERSION_MAJOR}-static.pc INSTALL) endif() if(MONGO_CAN_VERIFY_HEADERS AND ENABLE_TESTS) mongo_verify_headers( mongoc USE_LIBRARIES mongoc::static HEADERS "src/*.h" EXCLUDE_REGEX # Ignore all headers that start with "mongoc-", as they have not # been sanitized for direct inclusion. "mongoc/mongoc-.*\\.h" # Other private headers that aren't for public consumption: "/mcd-" "service-gcp\\.h" "uthash\\.h" "utlist\\.h" ) endif() endif () set (test-libmongoc-sources ${mongo-c-driver_SOURCE_DIR}/src/common/tests/test-common-atomic.c ${mongo-c-driver_SOURCE_DIR}/src/common/tests/test-mlib.c ${mongo-c-driver_SOURCE_DIR}/src/common/tests/test-common-oid.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/corpus-test.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/corpus-test.h ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-b64.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bcon-basic.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bcon-extract.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bson-corpus.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bson-error.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bson-vector.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bson-version.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-bson.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-clock.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-decimal128.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-endian.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-iso8601.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-iter.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-json.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-oid.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-reader.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-string.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-utf8.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-validate.generated.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-value.c ${mongo-c-driver_SOURCE_DIR}/src/libbson/tests/test-writer.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-match.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-parser.c ${PROJECT_SOURCE_DIR}/tests/bsonutil/bson-val.c ${PROJECT_SOURCE_DIR}/tests/debug-stream.c ${PROJECT_SOURCE_DIR}/tests/json-test-monitoring.c ${PROJECT_SOURCE_DIR}/tests/json-test-operations.c ${PROJECT_SOURCE_DIR}/tests/json-test.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future-functions.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future-value.c ${PROJECT_SOURCE_DIR}/tests/mock_server/future.c ${PROJECT_SOURCE_DIR}/tests/mock_server/mock-rs.c ${PROJECT_SOURCE_DIR}/tests/mock_server/mock-server.c ${PROJECT_SOURCE_DIR}/tests/mock_server/request.c ${PROJECT_SOURCE_DIR}/tests/mock_server/sync-queue.c ${PROJECT_SOURCE_DIR}/tests/stream-tracker.c ${PROJECT_SOURCE_DIR}/tests/test-conveniences.c ${PROJECT_SOURCE_DIR}/tests/test-happy-eyeballs.c ${PROJECT_SOURCE_DIR}/tests/test-libmongoc.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-aggregate.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-array.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-async.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-aws.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-background-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-buffer.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-bulk.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-bulkwrite.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-change-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-pool.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-session.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cluster.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cmd.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-collection-find-with-opts.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-collection.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-command-logging-and-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-command-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-connection-uri.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-counters.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-crud.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cursor.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-database.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-dns.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-error.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-exhaust.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-find-and-modify.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-generation-map.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs-bucket.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs-file-page.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gridfs.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-handshake.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-hedged-reads.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-http.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-interrupt.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-linux-distro-scanner.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-list.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-loadbalanced.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-log.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-long-namespace.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-max-staleness.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-mongos-pinning.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-oidc.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-oidc-callback.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-oidc-cache.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-opts.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-primary-stepdown.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-queue.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-prefs.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-read-write-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryability-helpers.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryable-reads.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-retryable-writes.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sample-commands.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-scram.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sdam-monitoring.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-sdam.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-secure-channel.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-description.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-selection-errors.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-selection.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-server-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-set.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-shared.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-socket.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-speculative-auth.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ssl.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-streamable-hello.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-structured-log.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-thread.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-timeout.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-description.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-reconcile.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology-scanner.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-topology.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-transactions.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ts-pool.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-uri.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-usleep.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-util.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-version.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-versioned-api.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-with-transaction.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-write-commands.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-write-concern.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-azure-imds.c ${PROJECT_SOURCE_DIR}/tests/test-service-gcp.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-integer.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-nsinfo.c ${PROJECT_SOURCE_DIR}/tests/test-mcd-rpc.c ${PROJECT_SOURCE_DIR}/tests/TestSuite.c ${PROJECT_SOURCE_DIR}/tests/unified/operation.c ${PROJECT_SOURCE_DIR}/tests/unified/entity-map.c ${PROJECT_SOURCE_DIR}/tests/unified/result.c ${PROJECT_SOURCE_DIR}/tests/unified/runner.c ${PROJECT_SOURCE_DIR}/tests/unified/test-diagnostics.c ${PROJECT_SOURCE_DIR}/tests/unified/util.c ) if (MONGOC_ENABLE_SSL) set (test-libmongoc-sources ${test-libmongoc-sources} ${PROJECT_SOURCE_DIR}/tests/ssl-test.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-client-side-encryption.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream-tls-error.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-stream-tls.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-x509.c ${PROJECT_SOURCE_DIR}/tests/test-mongoc-ocsp-cache.c ) endif () if (MONGOC_ENABLE_SASL_CYRUS) set (test-libmongoc-sources ${test-libmongoc-sources} ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cyrus.c ) endif () if (ENABLE_TESTS) add_library (test-libmongoc-lib STATIC EXCLUDE_FROM_ALL ${test-libmongoc-sources}) if (MSVC AND MSVC_VERSION VERSION_LESS 1900) message (STATUS "Disabling warning C4756 for VS 2013 and older") # Macro constant INFINITY triggers constant arithmetic overflow warnings in # VS 2013, but VS 2013 doesn't support inline warning suppression. # Remove once support for VS 2013 is dropped. target_compile_options(test-libmongoc-lib PRIVATE /wd4756) endif () target_link_libraries (test-libmongoc-lib PUBLIC mongoc::static) # We have tests that test our deprecated api. target_compile_options (test-libmongoc-lib PRIVATE $<$>:-Wno-deprecated-declarations> ) # Enable unconditional warnings-as-errors for our source code. target_compile_options (test-libmongoc-lib PRIVATE ${mongoc-warning-options}) target_include_directories (test-libmongoc-lib PRIVATE ${PROJECT_SOURCE_DIR}/tests ${UTHASH_INCLUDE_DIR} ) target_compile_definitions (test-libmongoc-lib PUBLIC "MONGOC_COMPILATION" "BSON_COMPILATION" "MCOMMON_NAME_PREFIX=_mongoc_mcommon" ) function (mongoc_add_test test) add_executable (${test} EXCLUDE_FROM_ALL ${ARGN}) add_dependencies (mongo_c_driver_tests ${test}) target_link_libraries (${test} PUBLIC $<$:DbgHelp.lib> mongoc_static ) # We have tests that test our deprecated api. target_compile_options (${test} PRIVATE $<$>:-Wno-deprecated-declarations> ) # Enable unconditional warnings-as-errors for our source code. target_compile_options (${test} PRIVATE ${mongoc-warning-options}) target_include_directories (${test} PRIVATE ${PROJECT_SOURCE_DIR}/tests ) target_compile_definitions (${test} PUBLIC "MONGOC_COMPILATION" "BSON_COMPILATION" "MCOMMON_NAME_PREFIX=_mongoc_mcommon" ) endfunction () mongoc_add_test (test-libmongoc ${PROJECT_SOURCE_DIR}/tests/test-libmongoc-main.c) target_link_libraries (test-libmongoc PUBLIC test-libmongoc-lib) mongoc_add_test (test-mongoc-gssapi ${PROJECT_SOURCE_DIR}/tests/test-mongoc-gssapi.c) mongoc_add_test (test-mongoc-cache ${PROJECT_SOURCE_DIR}/tests/test-mongoc-cache.c) mongoc_add_test (test-azurekms ${PROJECT_SOURCE_DIR}/tests/test-azurekms.c) mongoc_add_test (test-gcpkms ${PROJECT_SOURCE_DIR}/tests/test-gcpkms.c) mongoc_add_test (test-awsauth ${PROJECT_SOURCE_DIR}/tests/test-awsauth.c) # "make test" doesn't compile tests, so we create "make check" which compiles # and runs tests: https://gitlab.kitware.com/cmake/cmake/issues/8774 add_custom_target (check COMMAND ${CMAKE_CTEST_COMMAND} -V DEPENDS test-libmongoc ) endif () if (ENABLE_EXAMPLES AND ENABLE_SHARED) function (mongoc_add_example example) add_executable (${example} EXCLUDE_FROM_ALL ${ARGN}) add_dependencies (mongo_c_driver_examples ${example}) # Enable unconditional warnings-as-errors for our source code. target_compile_options (${example} PRIVATE ${mongoc-warning-options}) target_link_libraries (${example} PRIVATE mongoc::shared ${LIBRARIES}) if (WIN32) target_link_libraries (${example} PRIVATE shlwapi) endif () endfunction () # examples/ mongoc_add_example (example-client ${PROJECT_SOURCE_DIR}/examples/example-client.c) mongoc_add_example (example-collection-watch ${PROJECT_SOURCE_DIR}/examples/example-collection-watch.c) if (NOT WIN32) mongoc_add_example (example-resume ${PROJECT_SOURCE_DIR}/examples/example-resume.c) endif() mongoc_add_example (example-start-at-optime ${PROJECT_SOURCE_DIR}/examples/example-start-at-optime.c) mongoc_add_example (example-command-monitoring ${PROJECT_SOURCE_DIR}/examples/example-command-monitoring.c) mongoc_add_example (example-command-with-opts ${PROJECT_SOURCE_DIR}/examples/example-command-with-opts.c) mongoc_add_example (example-manage-collection-indexes ${PROJECT_SOURCE_DIR}/examples/example-manage-collection-indexes.c) mongoc_add_example (example-manage-search-indexes ${PROJECT_SOURCE_DIR}/examples/example-manage-search-indexes.c) mongoc_add_example (example-gridfs ${PROJECT_SOURCE_DIR}/examples/example-gridfs.c) mongoc_add_example (example-gridfs-bucket ${PROJECT_SOURCE_DIR}/examples/example-gridfs-bucket.c) if (NOT WIN32 AND ENABLE_EXAMPLES) # Examples that use pthreads mongoc_add_example (example-pool ${PROJECT_SOURCE_DIR}/examples/example-pool.c) mongoc_add_example (example-structured-log ${PROJECT_SOURCE_DIR}/examples/example-structured-log.c) endif () mongoc_add_example (example-scram ${PROJECT_SOURCE_DIR}/examples/example-scram.c) mongoc_add_example (example-sdam-monitoring ${PROJECT_SOURCE_DIR}/examples/example-sdam-monitoring.c) mongoc_add_example (example-session ${PROJECT_SOURCE_DIR}/examples/example-session.c) mongoc_add_example (example-transaction ${PROJECT_SOURCE_DIR}/examples/example-transaction.c) mongoc_add_example (example-update ${PROJECT_SOURCE_DIR}/examples/example-update.c) mongoc_add_example (find-and-modify ${PROJECT_SOURCE_DIR}/examples/find-and-modify.c) mongoc_add_example (hello_mongoc ${PROJECT_SOURCE_DIR}/examples/hello_mongoc.c) mongoc_add_example (mongoc-dump ${PROJECT_SOURCE_DIR}/examples/mongoc-dump.c) mongoc_add_example (mongoc-ping ${PROJECT_SOURCE_DIR}/examples/mongoc-ping.c) mongoc_add_example (mongoc-tail ${PROJECT_SOURCE_DIR}/examples/mongoc-tail.c) mongoc_add_example (example-collection-command ${PROJECT_SOURCE_DIR}/examples/example-collection-command.c) mongoc_add_example (example-bulkwrite ${PROJECT_SOURCE_DIR}/examples/example-bulkwrite.c) # examples/aggregation/ mongoc_add_example (aggregation1 ${PROJECT_SOURCE_DIR}/examples/aggregation/aggregation1.c) # examples/basic_aggregation/ mongoc_add_example (basic-aggregation ${PROJECT_SOURCE_DIR}/examples/basic_aggregation/basic-aggregation.c) # examples/bulk/ mongoc_add_example (bulk-collation ${PROJECT_SOURCE_DIR}/examples/bulk/bulk-collation.c) mongoc_add_example (bulk1 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk1.c) mongoc_add_example (bulk2 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk2.c) mongoc_add_example (bulk3 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk3.c) mongoc_add_example (bulk4 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk4.c) mongoc_add_example (bulk5 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk5.c) mongoc_add_example (bulk6 ${PROJECT_SOURCE_DIR}/examples/bulk/bulk6.c) # examples/common_operations/ mongoc_add_example (common-operations ${PROJECT_SOURCE_DIR}/examples/common_operations/common-operations.c) # examples/find_and_modify_with_opts/ mongoc_add_example (fam ${PROJECT_SOURCE_DIR}/examples/find_and_modify_with_opts/fam.c) if (MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION) mongoc_add_example (client-side-encryption-schema-map ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-schema-map.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-server-schema ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-server-schema.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-explicit ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-explicit.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-auto-decryption ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-auto-decryption.c ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-helpers.c) mongoc_add_example (client-side-encryption-doc-snippets ${PROJECT_SOURCE_DIR}/examples/client-side-encryption-doc-snippets.c) endif () # examples/tutorial mongoc_add_example (executing ${PROJECT_SOURCE_DIR}/examples/tutorial/executing.c) mongoc_add_example (appending ${PROJECT_SOURCE_DIR}/examples/tutorial/appending.c) endif () if (ENABLE_TESTS AND ENABLE_SHARED AND MONGOC_ENABLE_SSL AND NOT WIN32) # Add benchmarks to measure opening many TLS connections. # Benchmarks require SSL, and do not build on Windows. add_executable (benchmark-tls-pooled ${PROJECT_SOURCE_DIR}/tests/benchmark-tls-pooled.c) target_compile_options (benchmark-tls-pooled PRIVATE ${mongoc-warning-options}) target_link_libraries (benchmark-tls-pooled PRIVATE mongoc::shared ${LIBRARIES}) endif () file (COPY ${PROJECT_SOURCE_DIR}/tests/binary DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/json DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/x509gen DESTINATION ${PROJECT_BINARY_DIR}/tests) file (COPY ${PROJECT_SOURCE_DIR}/tests/release_files DESTINATION ${PROJECT_BINARY_DIR}/tests) set (TARGETS_TO_INSTALL) if (MONGOC_ENABLE_STATIC_INSTALL) list (APPEND TARGETS_TO_INSTALL mongoc_static) endif () if (ENABLE_SHARED) list (APPEND TARGETS_TO_INSTALL mongoc_shared) endif () install ( TARGETS ${TARGETS_TO_INSTALL} EXPORT mongoc-targets LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${MONGOC_INSTALL_INCLUDEDIR} ) install ( FILES ${HEADERS} DESTINATION "${MONGOC_INSTALL_INCLUDEDIR}/mongoc" ) # Collect link items for the static library to be inserted into the pkg-config if(TARGET mongoc_static) set(link_options ${ZLIB_LIBRARIES} ${SNAPPY_LIBRARIES} ${MONGOC_ZSTD_LIBRARIES} ${LIBMONGOCRYPT_LIBRARY}) # Replace all absolute paths with search-dir link-file options: list(TRANSFORM link_options REPLACE "^(.+)/lib([^/\\.]+)\\..+$" "-L\\1;-l\\2" REGEX "^/") # Prepend "-l" to all bare names: list(TRANSFORM link_options PREPEND "-l" REGEX "^[^-]") list(REMOVE_DUPLICATES link_options) message(DEBUG "Computed static library link options: ${link_options}") set_property(TARGET mongoc_static APPEND PROPERTY pkg_config_LIBS ${link_options}) endif() # Relative include-path will be given the install prefix: set_property(TARGET ${TARGETS_TO_INSTALL} APPEND PROPERTY pkg_config_INCLUDE_DIRECTORIES "${MONGOC_INSTALL_INCLUDEDIR}") install (EXPORT mongoc-targets FILE mongoc-targets.cmake DESTINATION "${MONGOC_INSTALL_CMAKEDIR}" ) configure_file( ${mongo-c-driver_SOURCE_DIR}/build/cmake/packageConfigVersion.cmake.in mongocConfigVersion.cmake @ONLY ) configure_file( etc/mongocConfig.cmake.in mongocConfig.cmake @ONLY ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/mongocConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/mongocConfigVersion.cmake" DESTINATION "${MONGOC_INSTALL_CMAKEDIR}" ) if (ENABLE_MAN_PAGES OR ENABLE_HTML_DOCS) find_package (Sphinx REQUIRED) add_subdirectory (doc) add_custom_target (mongoc-doc ALL DEPENDS $ $ ) endif () mongo-c-driver-2.2.1/src/libmongoc/THIRD_PARTY_NOTICES000066400000000000000000000026521511661753600220640ustar00rootroot00000000000000The MongoDB C Driver uses third-party code distributed under different licenses. License notice for mongoc-stream-tls-secure-channel.c ------------------------------------------------------------------------------- Curl License Significant portions of mongoc-stream-tls-secure-channel.c are from Curl. Copyright (C) 2012 - 2015, Marc Hoersken, Copyright (C) 2012, Mark Salisbury, Copyright (C) 2012 - 2015, Daniel Stenberg, , et al. All rights reserved. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 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 OF THIRD PARTY RIGHTS. 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. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. mongo-c-driver-2.2.1/src/libmongoc/doc/000077500000000000000000000000001511661753600176645ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc/.gitignore000066400000000000000000000002531511661753600216540ustar00rootroot00000000000000*.7 *.pyc .doctrees objects.inv html/*.html html/*.css html/*.js html/*.png html/_sources html/_static html/_images/ html/.buildinfo html/.nojekyll man/*.3 man/.buildinfo mongo-c-driver-2.2.1/src/libmongoc/doc/CMakeLists.txt000066400000000000000000000002511511661753600224220ustar00rootroot00000000000000include (SphinxBuild) if (ENABLE_HTML_DOCS) sphinx_build_html (mongoc-html mongo-c-driver) endif () if (ENABLE_MAN_PAGES) sphinx_build_man (mongoc-man) endif () mongo-c-driver-2.2.1/src/libmongoc/doc/api.rst000066400000000000000000000034401511661753600211700ustar00rootroot00000000000000API Reference ============= .. toctree:: :titlesonly: :maxdepth: 1 init-cleanup logging errors lifecycle gridfs mongoc_auto_encryption_opts_t mongoc_bulkwrite_t mongoc_bulkwriteopts_t mongoc_bulkwriteresult_t mongoc_bulkwriteexception_t mongoc_bulkwrite_check_acknowledged_t mongoc_bulkwrite_serverid_t mongoc_bulk_operation_t mongoc_change_stream_t mongoc_client_encryption_t mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_text_opts_t mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_opts_t mongoc_client_pool_t mongoc_client_session_t mongoc_client_session_with_transaction_cb_t mongoc_client_t mongoc_collection_t mongoc_cursor_t mongoc_database_t mongoc_find_and_modify_opts_t mongoc_gridfs_file_list_t mongoc_gridfs_file_opt_t mongoc_gridfs_file_t mongoc_gridfs_bucket_t mongoc_gridfs_t mongoc_host_list_t mongoc_insert_flags_t mongoc_iovec_t mongoc_oidc_callback_fn_t mongoc_oidc_callback_params_t mongoc_oidc_callback_t mongoc_oidc_credential_t mongoc_optional_t mongoc_query_flags_t mongoc_rand mongoc_read_concern_t mongoc_read_mode_t mongoc_read_prefs_t mongoc_remove_flags_t mongoc_server_api_t mongoc_server_api_version_t mongoc_server_description_t mongoc_session_opt_t mongoc_socket_t mongoc_ssl_opt_t mongoc_stream_buffered_t mongoc_stream_file_t mongoc_stream_socket_t mongoc_stream_t mongoc_stream_tls_t mongoc_topology_description_t mongoc_transaction_opt_t mongoc_transaction_state_t mongoc_update_flags_t mongoc_uri_t mongoc_version mongoc_write_concern_t mongo-c-driver-2.2.1/src/libmongoc/doc/application-performance-monitoring.rst000066400000000000000000000117341511661753600274110ustar00rootroot00000000000000:man_page: mongoc_application_performance_monitoring Application Performance Monitoring (APM) ======================================== The MongoDB C Driver allows you to monitor all the MongoDB operations the driver executes. This event-notification system conforms to two MongoDB driver specs: * `Command Logging and Monitoring `_: events related to all application operations. * `SDAM Monitoring `_: events related to the driver's Server Discovery And Monitoring logic. To receive notifications, create a ``mongoc_apm_callbacks_t`` with :symbol:`mongoc_apm_callbacks_new`, set callbacks on it, then pass it to :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. Command-Monitoring Example -------------------------- .. literalinclude:: ../examples/example-command-monitoring.c :language: c :caption: example-command-monitoring.c This example program prints: .. code-block:: none Command drop started on 127.0.0.1: { "drop" : "test" } Command drop succeeded: { "ns" : "test.test", "nIndexesWas" : 1, "ok" : 1.0 } Command insert started on 127.0.0.1: { "insert" : "test", "ordered" : true, "documents" : [ { "_id" : 0 }, { "_id" : 1 } ] } Command insert succeeded: { "n" : 2, "ok" : 1.0 } Command insert started on 127.0.0.1: { "insert" : "test", "ordered" : true, "documents" : [ { "_id" : 0 } ] } Command insert succeeded: { "n" : 0, "writeErrors" : [ { "index" : 0, "code" : 11000, "errmsg" : "duplicate key" } ], "ok" : 1.0 } started: 3 succeeded: 3 failed: 0 The output has been edited and formatted for clarity. Depending on your server configuration, messages may include metadata like database name, logical session ids, or cluster times that are not shown here. The final "insert" command is considered successful, despite the writeError, because the server replied to the overall command with ``"ok": 1``. SDAM Monitoring Example ----------------------- .. literalinclude:: ../examples/example-sdam-monitoring.c :language: c :caption: example-sdam-monitoring.c Start a 3-node replica set on localhost with set name "rs" and start the program: .. code-block:: none ./example-sdam-monitoring "mongodb://localhost:27017,localhost:27018/?replicaSet=rs" This example program prints something like: .. code-block:: none topology opening topology changed: Unknown -> ReplicaSetNoPrimary secondary UNAVAILABLE primary UNAVAILABLE server opening: localhost:27017 server opening: localhost:27018 localhost:27017 heartbeat started localhost:27018 heartbeat started localhost:27017 heartbeat succeeded: { ... reply ... } server changed: localhost:27017 Unknown -> RSPrimary server opening: localhost:27019 topology changed: ReplicaSetNoPrimary -> ReplicaSetWithPrimary new servers: RSPrimary localhost:27017 secondary UNAVAILABLE primary AVAILABLE localhost:27019 heartbeat started localhost:27018 heartbeat succeeded: { ... reply ... } server changed: localhost:27018 Unknown -> RSSecondary topology changed: ReplicaSetWithPrimary -> ReplicaSetWithPrimary previous servers: RSPrimary localhost:27017 new servers: RSPrimary localhost:27017 RSSecondary localhost:27018 secondary AVAILABLE primary AVAILABLE localhost:27019 heartbeat succeeded: { ... reply ... } server changed: localhost:27019 Unknown -> RSSecondary topology changed: ReplicaSetWithPrimary -> ReplicaSetWithPrimary previous servers: RSPrimary localhost:27017 RSSecondary localhost:27018 new servers: RSPrimary localhost:27017 RSSecondary localhost:27018 RSSecondary localhost:27019 secondary AVAILABLE primary AVAILABLE topology closed Events: server changed: 3 server opening: 3 server closed: 0 topology changed: 4 topology opening: 1 topology closed: 1 heartbeat started: 3 heartbeat succeeded: 3 heartbeat failed: 0 The driver connects to the mongods on ports 27017 and 27018, which were specified in the URI, and determines which is primary. It also discovers the third member, "localhost:27019", and adds it to the topology. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_callbacks_t mongoc_apm_command_failed_t mongoc_apm_command_started_t mongoc_apm_command_succeeded_t mongoc_apm_server_changed_t mongoc_apm_server_closed_t mongoc_apm_server_heartbeat_failed_t mongoc_apm_server_heartbeat_started_t mongoc_apm_server_heartbeat_succeeded_t mongoc_apm_server_opening_t mongoc_apm_topology_changed_t mongoc_apm_topology_closed_t mongoc_apm_topology_opening_t mongo-c-driver-2.2.1/src/libmongoc/doc/cmakerefdomain.py000066400000000000000000000026101511661753600232020ustar00rootroot00000000000000""" This is a miniature Sphinx extension that is only used to permit resolution of external references to the CMake Sphinx documentation. It defines no additional directives or object types. This extension defines a "cmake" domain, which may conflict with a proper CMake domain plugin. If that is the case, this extention can likely be disabled and replaced by a more full-featured extension. """ from typing import Any, List from sphinx.application import Sphinx from sphinx.domains import Domain, ObjType from sphinx.roles import XRefRole kinds = [ 'command', 'cpack_gen', 'envvar', 'generator', 'genex', 'guide', 'variable', 'module', 'policy', 'prop_cache', 'prop_dir', 'prop_gbl', 'prop_inst', 'prop_sf', 'prop_test', 'prop_tgt', 'manual', ] class CMakeRefDomain(Domain): name = 'cmake' label = 'CMake (Minimal)' object_types = {k: ObjType(k, k) for k in kinds} roles = {k: XRefRole() for k in kinds} roles['command'] = XRefRole(fix_parens=True) directives = {} initial_data: Any = {} def merge_domaindata(self, docnames: List[str], otherdata: Any) -> None: # We have nothing to do, but this is required for parallel execution return def setup(app: Sphinx): app.add_domain(CMakeRefDomain) return { 'parallel_read_safe': True, 'parallel_write_safe': True, } mongo-c-driver-2.2.1/src/libmongoc/doc/conf.py000066400000000000000000000244131511661753600211670ustar00rootroot00000000000000# -*- coding: utf-8 -*- import http.client import os.path import sys import urllib.request from pathlib import Path from typing import Any, Dict try: from sphinx.builders.dirhtml import DirectoryHTMLBuilder except ImportError: # Try importing from older Sphinx version path. from sphinx.builders.html import DirectoryHTMLBuilder from docutils.parsers.rst import Directive, directives from sphinx.application import Sphinx from sphinx.application import logger as sphinx_log has_sphinx_design = False try: # Try to import sphinx-design to include directives for HTML pages (e.g. tabs and dropdowns). # sphinx-design is not required for building man pages. # python-sphinx-design is not currently available on EPEL. The package for EPEL includes man pages. from sphinx_design.dropdown import DropdownDirective has_sphinx_design = True except ImportError: pass # Ensure we can import "mongoc" extension module. this_path = os.path.dirname(__file__) sys.path.append(this_path) sys.path.append(os.path.normpath(os.path.join(this_path, '../../../build/sphinx'))) from mongoc_common import * # noqa: E402, F403 extensions = [ 'mongoc', 'sphinx.ext.intersphinx', # NOTE: We use our own "minimal" CMake domain that lets us refer to external # objects from the CMake inventory, but provides no other features. The # build *could* otherwise use sphinxcontrib-moderncmakedomain, which is # more full-featured, but it is not (currently) available in repositories for # package building. # "sphinxcontrib.moderncmakedomain", 'cmakerefdomain', 'sphinx.ext.mathjax', ] if has_sphinx_design: extensions.append('sphinx_design') # General information about the project. project = 'libmongoc' copyright = '2009-present, MongoDB, Inc.' author = 'MongoDB, Inc' version_path = os.path.join(os.path.dirname(__file__), '../../..', 'VERSION_CURRENT') version = open(version_path).read().strip() # The extension requires the "base" to contain '%s' exactly once, but we never intend to use it though language = 'en' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] master_doc = 'index' html_static_path = ['static'] # Set an empty list of disabled reftypes. # Sphinx 5.0 disables "std:doc" by default. # Many documentation references use :doc: intersphinx_disabled_reftypes = [] # Give the peer 30sec to give us the inventory: intersphinx_timeout = 30 intersphinx_mapping = { 'sphinx': ('https://www.sphinx-doc.org/en/master', 'includes/sphinx.inv'), 'python': ('https://docs.python.org/3', 'includes/python.inv'), 'bson': ('https://www.mongoc.org/libbson/current', 'includes/libbson.inv'), 'cmake': ('https://cmake.org/cmake/help/latest', 'includes/cmake.inv'), } _UPDATE_KEY = 'update_external_inventories' def _maybe_update_inventories(app: Sphinx): """ We save Sphinx inventories for external projects saved within our own project so that we can support fully-offline builds. This is a convenience function to update those inventories automatically. This function will only have an effect if the appropriate command-line config value is defined. """ prefix = '[libmongoc/doc/conf.py]' config = app.config if not config[_UPDATE_KEY]: sphinx_log.info( '%s Using existing intersphinx inventories. Refresh by running with ‘-D %s=1’', prefix, _UPDATE_KEY, ) return for name, tup in intersphinx_mapping.items(): urlbase, filename = tup url = f'{urlbase}/objects.inv' sphinx_log.info('%s Downloading external inventory for %s from [%s]', prefix, name, url) with urllib.request.urlopen(url) as req: req: http.client.HTTPResponse = req dest = Path(app.srcdir) / filename sphinx_log.info('%s Saving inventory [%s] to file [%s]', prefix, url, dest) with dest.open('wb') as out: buf = req.read(1024 * 4) while buf: out.write(buf) buf = req.read(1024 * 4) sphinx_log.info( '%s Inventory file [%s] was updated. Commit the result to save it for subsequent builds.', prefix, dest, ) # -- Options for HTML output ---------------------------------------------- html_theme = 'furo' html_title = html_shorttitle = 'libmongoc %s' % version # html_favicon = None html_use_index = True rst_prolog = rf""" .. _the findAndModify command: https://www.mongodb.com/docs/manual/reference/command/findAndModify/ .. |version| replace:: {version} .. |version.pre| replace:: ``{version}`` .. |vversion| replace:: ``v{version}`` .. role:: bash(code) :language: bash .. role:: batch(code) :language: batch .. role:: c(code) :language: c .. role:: cpp(code) :language: c++ .. role:: bolded-name(literal) :class: bolded-name .. |libbson| replace:: :bolded-name:`libbson` .. |libmongoc| replace:: :bolded-name:`libmongoc` .. |mongo-c-driver| replace:: :bolded-name:`mongo-c-driver` .. The CMake inventory mangles the names of its custom domain objects, for some reason? Offer these substitutions for simpler variable references: .. |cmvar:CMAKE_BUILD_TYPE| replace:: :cmake:variable:`CMAKE_BUILD_TYPE ` .. |cmvar:CMAKE_INSTALL_PREFIX| replace:: :cmake:variable:`CMAKE_INSTALL_PREFIX ` .. |cmvar:CMAKE_PREFIX_PATH| replace:: :cmake:variable:`CMAKE_PREFIX_PATH ` .. |cmcmd:find_package| replace:: :cmake:command:`find_package() ` .. |bson_t-storage-ptr| replace:: non-``NULL`` pointer to `overwritable storage`_ for a :symbol:`bson_t` .. |bson_t-opt-storage-ptr| replace:: maybe-``NULL`` pointer to `overwritable storage`_ for a :symbol:`bson_t` .. _overwritable storage: https://www.mongodb.com/docs/languages/c/c-driver/current/libbson/guides/lifetimes/#overwritable-storage .. |encrypt-text-is-experimental| replace:: The "TextPreview" algorithm is in preview and should be used for experimental workloads only. These features are unstable and their security is not guaranteed until released as Generally Available (GA). The GA version of these features may not be backwards compatible with the preview version. .. _mongodb_docs_cdriver: https://www.mongodb.com/docs/languages/c/c-driver/current/ .. _queryable-encryption: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/queryable-encryption/ .. _authentication: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/authentication/ .. _bulk: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/bulk/ .. _client-side-field-level-encryption: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/client-side-field-level-encryption/ .. _configuring_tls: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/configuring_tls/ .. _connection-pooling: https://www.mongodb.com/docs/languages/c/c-driver/current/connect/connection-pools/. .. _in-use-encryption: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/in-use-encryption/ .. _manage-collection-indexes: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/manage-collection-indexes/ .. _setting_collation_order: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/bulk/#setting-collation-order .. _tutorial_crud_operations: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/tutorial/#basic-crud-operations .. _bulk_operation_bypassing_document_validation: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/bulk/#bulk-operation-bypassing-document-validation .. _cursors_tailable: https://www.mongodb.com/docs/languages/c/c-driver/current/libmongoc/guides/cursors/#tailable-cursors .. _bson_errors: https://www.mongodb.com/docs/languages/c/c-driver/current/libbson/tutorials/errors/ .. _bson_lifetimes: https://www.mongodb.com/docs/languages/c/c-driver/current/libbson/guides/lifetimes/ .. |ssl:naming| replace:: Though some API names include the term "ssl", the C driver only support TLS protocols, which supersede SSL. """ def add_canonical_link(app: Sphinx, pagename: str, templatename: str, context: Dict[str, Any], doctree: Any): link = f'' context['metatags'] = context.get('metatags', '') + link if has_sphinx_design: class AdDropdown(DropdownDirective): """A sphinx-design dropdown that can also be an admonition.""" option_spec = DropdownDirective.option_spec | {'admonition': directives.unchanged_required} def run(self): adm = self.options.get('admonition') if adm is not None: self.options.setdefault('class-container', []).extend(('admonition', adm)) self.options.setdefault('class-title', []).append('admonition-title') return super().run() else: class EmptyDirective(Directive): has_content = True def run(self): return [] has_add_css_file = True def check_html_builder_requirements(app): if isinstance(app.builder, DirectoryHTMLBuilder): if not has_sphinx_design: raise RuntimeError( 'The sphinx-design package is required to build HTML documentation but was not detected. Install sphinx-design.' ) if not has_add_css_file: raise RuntimeError( 'A newer version of Sphinx is required to build HTML documentation with CSS files. Upgrade Sphinx to v3.5.0 or newer' ) def setup(app: Sphinx): mongoc_common_setup(app) # noqa: F405 app.connect('builder-inited', check_html_builder_requirements) if has_sphinx_design: app.add_directive('ad-dropdown', AdDropdown) else: app.add_directive('ad-dropdown', EmptyDirective) app.add_directive('tab-set', EmptyDirective) app.connect('html-page-context', add_canonical_link) if hasattr(app, 'add_css_file'): app.add_css_file('styles.css') else: global has_add_css_file has_add_css_file = False app.connect('builder-inited', _maybe_update_inventories) app.add_config_value(_UPDATE_KEY, default=False, rebuild=True, types=[bool]) mongo-c-driver-2.2.1/src/libmongoc/doc/errors.rst000066400000000000000000001514201511661753600217350ustar00rootroot00000000000000:man_page: mongoc_errors « :doc:`index` Error Reporting =============== Description ----------- Many C Driver functions report errors by returning ``false`` or -1 and filling out a :symbol:`bson:bson_error_t` structure with an error domain, error code, and message. Use ``domain`` to determine which subsystem generated the error, and ``code`` for the specific error. ``message`` is a human-readable error description. .. seealso:: | `Handling Errors in libbson `_. .. _Error code from server: https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.yml +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Code | Description | | +=========================================+==================================================================================================================================+==========================================================================================================================================================================================================================================================================================================================+ | ``MONGOC_ERROR_CLIENT`` | ``MONGOC_ERROR_CLIENT_TOO_BIG`` | You tried to send a message larger than the server's max message size. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_AUTHENTICATE`` | Wrong credentials, or failure sending or receiving authentication messages. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER`` | You tried an TLS connection but the driver was not built with TLS. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_IN_EXHAUST`` | You began iterating an exhaust cursor, then tried to begin another operation with the same :symbol:`mongoc_client_t`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_SESSION_FAILURE`` | Failure related to creating or using a logical session. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG`` | Failure related to arguments passed when initializing In-Use Encryption. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE`` | Failure related to In-Use Encryption. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER`` | You attempted to connect to a MongoDB server behind a load balancer, but the server does not advertize load balanced support. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CLIENT_NOT_READY`` | You attempted to create a client but did not previously call :symbol:`mongoc_init` | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_STREAM`` | ``MONGOC_ERROR_STREAM_NAME_RESOLUTION`` | DNS failure. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_STREAM_SOCKET`` | Timeout communicating with server, or connection closed. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_STREAM_CONNECT`` | Failed to connect to server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_PROTOCOL`` | ``MONGOC_ERROR_PROTOCOL_INVALID_REPLY`` | Corrupt response from server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION`` | The server version is too old or too new to communicate with the driver. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_CURSOR`` | ``MONGOC_ERROR_CURSOR_INVALID_CURSOR`` | You passed bad arguments to :symbol:`mongoc_collection_find_with_opts`, or you called :symbol:`mongoc_cursor_next` on a completed or failed cursor, or the cursor timed out on the server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN`` | A resume token was not returned in a document found with :symbol:`mongoc_change_stream_next` | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_QUERY_FAILURE`` | :ref:`Error API Version 1 `: Server error from command or query. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | ``MONGOC_ERROR_QUERY_FAILURE`` | :ref:`Error API Version 2 `: Server error from command or query. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SASL`` | A SASL error code. | ``man sasl_errors`` for a list of codes. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_BSON`` | ``MONGOC_ERROR_BSON_INVALID`` | You passed an invalid or oversized BSON document as a parameter or the server reply was corrupt. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_NAMESPACE`` | ``MONGOC_ERROR_NAMESPACE_INVALID`` | You tried to create a collection with an invalid name. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_COMMAND_INVALID_ARG`` | Many functions set this error code when passed bad parameters. Print the error message for details. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION`` | You tried to use a command option the server does not support. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_DUPLICATE_KEY`` | An insert or update failed because because of a duplicate ``_id`` or other unique-index violation. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_MAX_TIME_MS_EXPIRED`` | The operation failed because maxTimeMS expired. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_SERVER_SELECTION_INVALID_ID`` | The ``serverId`` option for an operation conflicts with the pinned server for that operation's client session (denoted by the ``sessionId`` option). | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COMMAND`` | `Error code from server`_. | :ref:`Error API Version 1 `: Server error from a command. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | `Error code from server`_. | :ref:`Error API Version 2 `: Server error from a command. The server error message is in ``message``. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COLLECTION`` | ``MONGOC_ERROR_COLLECTION_INSERT_FAILED``, ``MONGOC_ERROR_COLLECTION_UPDATE_FAILED``, ``MONGOC_ERROR_COLLECTION_DELETE_FAILED``. | Invalid or empty input to :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_many`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, :symbol:`mongoc_collection_delete_one`, or :symbol:`mongoc_collection_delete_many`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_COLLECTION`` | `Error code from server`_. | :ref:`Error API Version 1 `: Server error from :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_many`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER`` | `Error code from server`_. | :ref:`Error API Version 2 `: Server error from :symbol:`mongoc_collection_insert_one`, :symbol:`mongoc_collection_insert_many`, :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, :symbol:`mongoc_collection_replace_one`, | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_GRIDFS`` | ``MONGOC_ERROR_GRIDFS_CHUNK_MISSING`` | The GridFS file is missing a document in its ``chunks`` collection. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_CORRUPT`` | A data inconsistency was detected in GridFS. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_INVALID_FILENAME`` | You passed a NULL filename to :symbol:`mongoc_gridfs_remove_by_filename`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR`` | You called :symbol:`mongoc_gridfs_file_set_id` after :symbol:`mongoc_gridfs_file_save`, or tried to write on a closed GridFS stream. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND`` | A GridFS file is missing from ``files`` collection. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_GRIDFS_BUCKET_STREAM`` | An error occurred on a stream created from a GridFS operation like :symbol:`mongoc_gridfs_bucket_upload_from_stream`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SCRAM`` | ``MONGOC_ERROR_SCRAM_PROTOCOL_ERROR`` | Failure in SCRAM-SHA-1 or SCRAM-SHA-256 authentication. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_SERVER_SELECTION`` | ``MONGOC_ERROR_SERVER_SELECTION_FAILURE`` | No replica set member or mongos is available, or none matches your :doc:`read preference `, or you supplied an invalid :symbol:`mongoc_read_prefs_t`. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_WRITE_CONCERN`` | `Error code from server`_. | There was a :doc:`write concern ` error or :doc:`timeout ` from the server. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_TRANSACTION`` | ``MONGOC_ERROR_TRANSACTION_INVALID`` | You attempted to start a transaction when one is already in progress, or commit or abort when there is no transaction. | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION`` | Error code produced by libmongocrypt. | An error occurred in the library responsible for In-Use Encryption | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_AZURE`` | ``MONGOC_ERROR_KMS_SERVER_HTTP`` | An Azure HTTP service responded with an error status | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_KMS_SERVER_BAD_JSON`` | An Azure service responded with invalid JSON data | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ``MONGOC_ERROR_GCP`` | ``MONGOC_ERROR_KMS_SERVER_HTTP`` | A GCP HTTP service responded with an error status | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | | ``MONGOC_ERROR_KMS_SERVER_BAD_JSON`` | A GCP service responded with invalid JSON data | +-----------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ .. _error_labels: Error Labels ------------ In some cases your application must make decisions based on what category of error the driver has returned, but these categories do not correspond perfectly to an error domain or code. In such cases, error *labels* provide a reliable way to determine how your application should respond to an error. Any C Driver function that has a :symbol:`bson:bson_t` out-parameter named ``reply`` may include error labels to the reply, in the form of a BSON field named "errorLabels" containing an array of strings: .. code-block:: none { "errorLabels": [ "TransientTransactionError" ] } Use :symbol:`mongoc_error_has_label` to test if a reply contains a specific label. See :symbol:`mongoc_client_session_start_transaction` for example code that demonstrates the use of error labels in application logic. The following error labels are currently defined. Future versions of MongoDB may introduce new labels. TransientTransactionError ^^^^^^^^^^^^^^^^^^^^^^^^^ Within a multi-document transaction, certain errors can leave the transaction in an unknown or aborted state. These include write conflicts, primary stepdowns, and network errors. In response, the application should abort the transaction and try the same sequence of operations again in a new transaction. UnknownTransactionCommitResult ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When :symbol:`mongoc_client_session_commit_transaction` encounters a network error or certain server errors, it is not known whether the transaction was committed. Applications should attempt to commit the transaction again until: the commit succeeds, the commit fails with an error *not* labeled "UnknownTransactionCommitResult", or the application chooses to give up. .. _errors_error_api_version: .. _error_api_version: Setting the Error API Version ----------------------------- The driver's error reporting began with a design flaw: when the error *domain* is ``MONGOC_ERROR_COLLECTION``, ``MONGOC_ERROR_QUERY``, or ``MONGOC_ERROR_COMMAND``, the error *code* might originate from the server or the driver. An application cannot always know where an error originated, and therefore cannot tell what the code means. For example, if :symbol:`mongoc_collection_update_one` sets the error's domain to ``MONGOC_ERROR_COLLECTION`` and its code to 24, the application cannot know whether 24 is the generic driver error code ``MONGOC_ERROR_COLLECTION_UPDATE_FAILED`` or the specific server error code "LockTimeout". To fix this flaw while preserving backward compatibility, the C Driver 1.4 introduces "Error API Versions". Version 1, the default Error API Version, maintains the flawed behavior. Version 2 adds a new error domain, ``MONGOC_ERROR_SERVER``. In Version 2, error codes originating on the server always have error domain ``MONGOC_ERROR_SERVER`` or ``MONGOC_ERROR_WRITE_CONCERN``. When the driver uses Version 2 the application can always determine the origin and meaning of error codes. New applications should use Version 2, and existing applications should be updated to use Version 2 as well. +------------------------------------------------------+----------------------------------------+----------------------------------------+ | Error Source | API Version 1 | API Version 2 | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_cursor_error` | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_client_command_with_opts`, | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | | :symbol:`mongoc_database_command_with_opts`, and | | | | other command functions | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_client_get_database_names_with_opts` | ``MONGOC_ERROR_QUERY`` | ``MONGOC_ERROR_SERVER`` | | and other command helper functions | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_collection_insert_one` | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_SERVER`` | | :symbol:`mongoc_collection_insert_many` | | | | :symbol:`mongoc_collection_update_one` | | | | :symbol:`mongoc_collection_update_many` | | | | :symbol:`mongoc_collection_replace_one` | | | | :symbol:`mongoc_collection_delete_one` | | | | :symbol:`mongoc_collection_delete_many` | | | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | :symbol:`mongoc_bulk_operation_execute` | ``MONGOC_ERROR_COMMAND`` | ``MONGOC_ERROR_SERVER`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ | Write-concern timeout | ``MONGOC_ERROR_WRITE_CONCERN`` | ``MONGOC_ERROR_WRITE_CONCERN`` | +------------------------------------------------------+----------------------------------------+----------------------------------------+ The Error API Versions are defined with ``MONGOC_ERROR_API_VERSION_LEGACY`` and ``MONGOC_ERROR_API_VERSION_2``. Set the version with :symbol:`mongoc_client_set_error_api` or :symbol:`mongoc_client_pool_set_error_api`. .. seealso:: | `MongoDB Server Error Codes `_ .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_error_has_label mongo-c-driver-2.2.1/src/libmongoc/doc/full_index.rst000066400000000000000000000004311511661753600225450ustar00rootroot00000000000000:man_page: mongoc_reference :orphan: .. Yes it's confusing: the home page is called "index" so this is "full_index", and it works by including the complete Table of Contents from the homepage, i.e., "index". Index ===== .. toctree:: :maxdepth: 6 :titlesonly: index mongo-c-driver-2.2.1/src/libmongoc/doc/gridfs.rst000066400000000000000000000017101511661753600216730ustar00rootroot00000000000000GridFS ====== The C driver includes two APIs for GridFS. The older API consists of :symbol:`mongoc_gridfs_t` and its derivatives. It contains deprecated API, does not support read preferences, and is not recommended in new applications. It does not conform to the `MongoDB GridFS specification `_. The newer API consists of :symbol:`mongoc_gridfs_bucket_t` and allows uploading/downloading through derived :symbol:`mongoc_stream_t` objects. It conforms to the `MongoDB GridFS specification `_. There is not always a straightforward upgrade path from an application built with :symbol:`mongoc_gridfs_t` to :symbol:`mongoc_gridfs_bucket_t` (e.g. a :symbol:`mongoc_gridfs_file_t` provides functions to seek but :symbol:`mongoc_stream_t` does not). But users are encouraged to upgrade when possible. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/000077500000000000000000000000001511661753600214725ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc/includes/aggregate-opts.txt000066400000000000000000000044341511661753600251510ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. * ``batchSize``: An ``int32`` representing number of documents requested to be returned on each call to :symbol:`mongoc_cursor_next` * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-insert-opts.txt000066400000000000000000000004701511661753600254560ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-opts.txt000066400000000000000000000023611511661753600241550ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``ordered``: set to ``false`` to attempt to insert all documents, continuing after errors. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-remove-many-opts.txt000066400000000000000000000010171511661753600264070ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-remove-one-opts.txt000066400000000000000000000010171511661753600262240ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-replace-one-opts.txt000066400000000000000000000014651511661753600263510ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. * ``sort``: Specify a sort order when matching documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-update-many-opts.txt000066400000000000000000000015361511661753600264020ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulk-update-one-opts.txt000066400000000000000000000016301511661753600262120ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: If true, insert a document if none match ``selector``. * ``sort``: Specify a sort order when matching documents. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/bulkwrite-vs-bulk_operation.txt000066400000000000000000000013001511661753600276760ustar00rootroot00000000000000If using MongoDB server 8.0+, prefer :symbol:`mongoc_bulkwrite_t` over :symbol:`mongoc_bulk_operation_t` to reduce network round trips. :symbol:`mongoc_bulkwrite_t` uses the ``bulkWrite`` server command introduced in MongoDB server 8.0. ``bulkWrite`` command supports insert, update, and delete operations in the same payload. ``bulkWrite`` supports use of multiple collection namespaces in the same payload. :symbol:`mongoc_bulk_operation_t` uses the ``insert``, ``update`` and ``delete`` server commands available in all current MongoDB server versions. Write operations are grouped by type (insert, update, delete) and sent in separate commands. Only one collection may be specified per bulk write. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/change-stream-opts.txt000066400000000000000000000060221511661753600257340ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE .. versionchanged:: 2.0.0 ``batchSize`` of 0 is applied to the ``aggregate`` command. 0 was previously ignored. ``opts`` may be NULL or a BSON document with additional command options: * ``batchSize``: An ``int32`` requesting a limit of documents returned in each server reply. If positive, the ``batchSize`` is applied to both ``aggregate`` and ``getMore`` commands. If 0, the ``batchSize`` is only applied to the ``aggregate`` command (Useful to request an immediate cursor without significant server-side work. See `Aggregate Data Specifying Batch Size `_). If omitted or negative, the value is ignored and server defaults are used (See `Cursor Batches `_ for a description of server defaults). * ``resumeAfter``: A ``Document`` representing the logical starting point of the change stream. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``startAfter`` and ``startAtOperationTime``. * ``startAfter``: A ``Document`` representing the logical starting point of the change stream. Unlike ``resumeAfter``, this can resume notifications after an "invalidate" event. The result of :symbol:`mongoc_change_stream_get_resume_token()` or the ``_id`` field of any change received from a change stream can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAtOperationTime``. * ``startAtOperationTime``: A ``Timestamp``. The change stream only provides changes that occurred at or after the specified timestamp. Any command run against the server will return an operation time that can be used here. This option is mutually exclusive with ``resumeAfter`` and ``startAfter``. * ``maxAwaitTimeMS``: An ``int64`` representing the maximum amount of time a call to :symbol:`mongoc_change_stream_next` will block waiting for data * ``fullDocument``: An optional UTF-8 string. Set this option to "default", "updateLookup", "whenAvailable", or "required", If unset, The string "default" is assumed. Set this option to "updateLookup" to direct the change stream cursor to lookup the most current majority-committed version of the document associated to an update change stream event. * ``fullDocumentBeforeChange``: An optional UTF-8 string. Set this option to "whenAvailable", "required", or "off". When unset, the default value is "off". Similar to "fullDocument", but returns the value of the document before the associated change. * ``showExpandedEvents``: Set to ``true`` to return an expanded list of change stream events. Available only on MongoDB versions >=6.0 * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/cmake.inv000066400000000000000000002007361511661753600233000ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: CMake # Version: 3.27.1 # The remainder of this file is compressed using zlib. xÚ¼½YoãÈ’Çû~?E÷p桦[®½Q(€¢(™m‰T“”—~!T¶ìÒi[òÑRË|ú›).‘‘=Ì´§ÿ_pIæ™y»~zš¯îþ˜ßÝå·ë§çåã"¿[Ü/WËÝr½Ú¾º}šÿ³øãV[½ê½2ý†ØÿÏ·ÝÓãÿûÿ½zýÿÜàõ3jlà~»[?åäÕLIÜn¾yXì84m øOÏúÔîÏ‹ÕÝbu»\ØHCµø¹¸Ýïæ_$è`cîóÝ~³È—«ûu ô´¾Û?.~j›t/þ}ó æü{¾Áä³íâÏù÷9¬{\~Ý(yƬþa•ª!ŒÚî¿Þ-7‹ÛÝÚrAUCµ[léR' éên³^Þå…E~7ßͱçêiãLØÍvËGQîÀ²²ÿ™o×ûÍ­ø¨í7·‘_×·ÿ  õ+ Ú,æ„Hþ ˆöËÇ;kP³Â «ùÓÂB&mùí·Åí?ùmQ‹mòûÇùöN|iìûÆt(,q yІ»¥‘©26à­ºÙ¯XÀd¿ÂaüæÜïÏŸ.Äëk.Ôé1^_3äl””|˜øëéëúQTÉËíÎŽTƲŠ÷ëÍn3_9<סVpžm¿ß¯ne¥É¹nƒ ïê]^ qÀ{‰ ÖYƒS/Óé‘°žÅruû¸¿[ä÷K =¯âBm8\>.8,Yî¸ß,åðsU—ƽ.©-Ç–;3B‘ñσÂ8~FŠŠbª¶fþ¼D{Øu3æ_ÿÙ/6¿þÛ‰¦$-â·µEmmw‹'5ÆÝ<ÍÁ{®“vÙóÕÃ~þ°°P 3æ_·óÇÇÿv‚IÎUÃbãTœ¸ø>w¼B©Ày‹øŽ·[ñwþ¸~ÈߎâµA¼ˆ× {Ü e”å—¬G¿/ï\Ÿ’€¼>@^–×'QÓ>íŸòÍâ?{1®¾³8išcæy¾ÙŠ/`ó°_èÖBmXãÐÝ7+i÷ •¯—·¿le Ö«û僌GáR3£0ÏóÛd™ÒÿBw¯eu7Õö¾2?_<>/6[¿[®öä*@*¯(/¢¢ë•xèÉ‹ñ +*ج÷ϧ—«íNÔ(ª ;vxwë«Çõün{pyÿC]bñf7 Ý© ±áðÊÜ,ž×Û%s î—÷~ÝqŒw̆’߃!ù…52æ,±ûç»ùnqÚsÜ,$âßóïó»õ­s@¹"ÿv¬X…]u‘z\A\ØÀn¿Í7ÏùC¥¹ÙíÅ›„’ÅJ¥ˆˆêV¨òJVþÏâWþu¾íº=¨›Úíòa%Æ·[ÙÖŠzu·\tBþ±\‰ªe+£=O]³Ο»ºbURT /S P~»Hi‡ƒ¾/6dŸµffÈ?bDö þ}Hr®Â7 _ F~|‰ÁOÏ;Q¦—+ß±Ï^P"Ì…<ªq–Z˜aQ”3‰p¬ÎkÙ£àý*ßÞn–Ï;±4ÄPÛÇÅâÙBQ6(`7ߨ.CÙ €ý×§¥• Œ09±v0Á亲´޽+BˆŸ?Õïèa1å**5ÿçÏ ¼éY•þ=4ìÐú篇ÅJ]ho·ÔÕ ´m²xÜâTþK–÷¤hyÈV*bm7ìP|ËÕƒcÌ Ì=Z€RÑ^-æ·ß(±1åf^Ô@½ù+(zšßnÖ”N€Òߨ!]aI¿çºRÅ3X}Ÿ¨ÿoKrÑó[>vÀ»†î˜íùóјŸ‹[ùm?læOøc­ÁˆýNÕbµ%);$£Ô„^þŒÉäÚ‘­swÝh‹ÙÖÊB9Ø-6«ù£\‚¡ëkx-‘¹ÐÀ˜„9FTþ(qGâ߈R¼ßË>œ¸@hªMY,Ñ)X›o¿}ùo†T6ÕógùÉpÔÚ²¥ßÜ~[~c=û`q´âµV`<ñµlæ·; ‘4‰·ßÄãçp”!¨c³Ûýf»`S^A‹V ÁY¤r\ߢ<ÿâžAZ5¼ä^«rÙ¤èH—\Áâ(ó×Ò¼I*BÀLaÛdˆ1ÈbÃ,}…m›¡ÆË»åÓ¢Ö à1w¯öu­ júx\eñ„¤u)†Ò+…&”ÏÁÓ&AŽ`8r5jhõ„s„áP¤ÁëC¬§Á“qEÚAZ9ÅÏ-ÈÒþµ±XjŒ z|­¦ÕZÑ„È OÒ„ö´þ¾àa¤%¬w)wZ•¼Š ó8*ÞÐË¥µZbÑÔî6bÈÎú i“ ?pñ9<=s¥q‹²ÎS¦,Òúµ2ß° ­Ü ŒÀ­ð³[ïo™aªóÕšßPŠ×…¢ÉÓ13Ç„àú›%ï2”aM½ªì¸øEN«PXi:£ héâ D|Ìv %´í§¨!3³J#ŒÈͦÅfK¬3’ÔÌ»Ÿ‹éNüg¾¹ó6[‹ƒoJ £ÎJ!ÂÛný‹!J Ll ÎTÄãîŸüÇfþœïñeUU#a 1¢ñE³rúv)†/›ûù­xТ1ÄÙËÊÞƒÅbyÿë¤-ŠÇ?eÐT̶(zÛÆ•}²mcË™X|=AÛ6‡±¬k¤¯Ì,æT«ðX8H£uø…GmØ"@9éÂÃU-ØjoºÉânU\gþu»~”áÑbÕŒø+Õ£hj«ÁZYôP›B«²Ñzýð¸€g‡4ân¹US³Çsˆùhr`yÿ¯9[(4óZXA¨ÌŸveñKC-çjÇ‘k˺^Ï‘1¼úzñŸ=µ²Ð*³†R-ÑeHõªßšöAuŸ6v±1Õ9óÚùkà–+5bg,W¯Õ„I]½-¿aûº0nQÃË ZjÎjñC~/¢KÁ)ó×Ò¼E²2+˜öS0[FÙVm÷ÅJ[è­>Íw¢ÛÆpo ëêÕšQ„Q]µfæu£?ÏŰq'.€s­ã&e÷ûĤ-ôÄôjV†^/­iÅè“é½°léÙÕÁÁcäük!ê=¢fQäô{SË+üÆT;Üöè^…a&ëÚ§RT3€5]±Õî-,z=ÎâÞ½1‡î¾ ±‹VÁËWƒæz}DI+ȼ"SÛå¦Êq½<¸ém8Dÿt£ÌNË¢™¢¦³[XÌHæO[3)iå¶%8þa/ÒV¢²Â!›ÅÃþq¾‘³ÚñT©¡.ð:®³Ôï¨Ð²¢¯f…CŽ éT´¹^¼°=ž±Z“£&Xa…!ŽÂfØ›$cש|œÏ¤iˆ tPÌ *Í ±6^.ÿÕ:-{¶¦e•^<²’>èµe[Ïó.íšZ²‘.VTý Ö–Mýóú9ÿ:§¦ÅaûZÚBŒûÍzµãB”q‹²Yp 1mÌ´ÏœufÆg¾C(wûgÑÇÍõÖv!ÔånñäÀ“æm’l¯<Š2m¶k^i•v-íþ+=R®Èµi“ c¡[¹ÅÃ(QJίsJÍk¸ö90åtûO¹3{ùìVÂ×JˆÓEé}œß.ÜÈF„S¸ZËuîÖë¼êøÀ4¢*u-wÌÅ•&@â~³$NªµôZ_d¡o}ŸPÿC¦˜zšoþÉçÛ|~÷}¾º%6Ì6 !1…óÎÞˆ}œUaاÅOj>i¢,IÂ~µÜY×ú[8fµS.;D¦c´¸+æÕ¶²‘ßǃ(XIJ@»Í.¾Ï—âÖõ?nÖë]·.žd-±¿¿_þ<´Y<.æÛ…ÚJ§¯1ÕÈàÃA…,þSjõÒâêîxÁÖ¿·…H·B·FÒ<¬÷»çý®Ü‘nÖmèó?fŠXß1=uûσފ sÔ.Â"Çc¶ ¹Â±á€âl–+5#¯¥L±¸=v½®ÆéÍ(]ÐèÁ?:ÒW™f¾îïóbU]~ûLn^˜õük÷ͲB¥ýg§gÀ¡Ë)îªbƒˆyöƒI[nVSaRý3&cåm›B8ñÚWBþÜ–mÏsõìY$Ú¦nGèw à_ª óßvî Õµ‹Õw†RX5t+™Óå‘!Õ†uu{òž `ðat’UrŠ2]q8kû4Ûü–œÊßÖWl¹ÑÀê lè–5•ÓðlfÃ@Š1.Ò´´ÄúiÀy$J}Å@è©T¬~ÆdÖ] Uycƒ!؆¯UBkØZ0¶·Ë%!MÛ¹ÆFnž±ÌTIFÒš0h­/³=ùSó#®›„ix 'b pc2às¹à¤Lƒ½ZïŽ *ˆ»º¥¢huš´¶=# Lk׈!ÑAÝ*¤Ö5zV0§Šƒ8†ömñ“ù¹‹ñvKM‡z«òF°·ÐoEßÒá]K{¬ô(õn‘êÁï*LJn¡Záè*M'Bt ™Ì‰0Ͷ Ekí*¨Ò¶NOl‹>1™‘ʤXµH.{â*‚u›/e>Ÿåý’ûÜÕÚþÛ×Y›l éWyí ¾¡lÄßë'DیŃøÕ:&H ^+I#7$!ÀúΤÓn#Ûá’ø¼àÖâÚd¸\r%u/Rën÷_mkqj”¼Mb솩’ ý0ɯqZañ’²½:6E·)ûý’ù™I˪^aöŒ}ùšÐV¿ÛôðÇò!§ŽÏ8Lè§WáX¦½m 3òq9b—XñhÜ aöV°íìØź,àÁ%(ž½ê±§Áö5 5 e>`ú|–r˜½(^„Þ‘bŶ(K$Ù 3£²·‰KæÏ™£ÑL¹Ü¾¿|”@Ùü* ~%ÍVTÅâ÷¶p¿¢ÂwêW@´]ä⛕þ×7 ”Êž÷Ë<`T3kcÊŒÙfú¡-KöCuj¬$eÖÆÐÉÌGjŸ¢L鸼-Ãpå$R7™lµ r«âÁ¤-ÿy[îWùº—[ê¨þµo4©@lÓ¤-„J>*Fž¨œ¢¯<âÕHÏ+¬Ëw…¼¯âïßL. ××÷Ä£é€Ãü_?Äà”»UÆ8lô™¤»ÅW³™?DƒÍú™ {zÀaEþ&«X]Ї›Å¢Ÿ˜¼{aýu{‡ãÂáµ¼ÿA`V«õ«t±ÛsÚR¶ÒgFi˜2i«írK€ö#Q…3Iûúw ”©@d]²aM%%-688™N˜¼Íó޹ ¯™˜ËŸ8æy#ª—ÛNÌʼ͊ä^¬¾‹VàÏSÏ¿ðFAäM‚/yÇ™aéßHÿñ›y¾‘\» ÍÒÁâ4’7H§ ü½­L'Ÿ¡7üì &N'¹1!åñ7Jí eÖù>¢ô}Àvâ]¹ã$Ee›6ºV¹Bü<ö¢ÑÁLÃqäcoùçA‚±”HjÚÚC8™ŽC?Ìòq]ˆg—ˆG'aæÁµ?ž »G+‚¾©rºÃ†¡{Ói ÆA>õ²s’Z7Åy ŭÆQ>Mb?HÓ8±! â¡? Çq ‰7ã|\c Hvv3 Di†pTA—ŸØ(ŠÓ,ôSײF©Ñ0Í/ Ås’îmÜ–=I¶ßxÅ!×Ó8ÉŠÏKþwâEú: âa˜ˆªþ*N.ì%¶nŠðDÛˆGd)£¥•’‡Qšy‘ðp¥¹•;{Ù0N&LnanåfqE[«`kò"ÍÏ-ÝÀKÏû±— ÔW+ºRñ$Wo¡öm²øG1üÁ8ú×–jˆ I‡í!éºã!|¿çá°úGHCy*~néÂtŠÝü ´§•¿·”ã¥3¿¶TÏ—-·è£Œã›Ieyæ%#´ˆ™·¸òÌV„!íÑw¢liþÊD3 /º‘M°ëJ|À–z¦ ò&ÒtœûæàE¿j‚뉾HͦM¸ ‡vŸúÇ–†î3¶ºŠE@ïþzó(çd<³ºy¥´”òïߌõý^ÚCP}·è˼·4í`†AÆË219ŽF ¸}\>o¯üAö–„CqWÒB6‹ÅêÕùòñqûj"Ú´ä)kASöòYI„½˜[nïbßÚ$½I™¯LšÚÞ×d¹]qyÒÖŒä¯L ²uþOÜ âo¡ÑËÕ¿ç4LZàÒÉþq·|­gíyQ„Må^ç§Å«lñs÷êŒDS•Æâ?gp¶Zþd¾ ij{—Ë­\šîöwËõ«Þï¯Î~ÿ‡¢j…àjÍI¼Xñ†ƒžtpæê §œ1œIo\œioÞJï\¼ÕÞ1¼“>¸:x§|`8x/|ruð^;øÄpðA88s~É”ƒ3ÆK~ïˆ~oGº>ïäÿD¢ÿvöûï®ÅQ> ©UäwF¡ü(½¸–ÉÏ(’Ÿ$þ£#þ“Æ„ðWóÝíúéÕ•j (¬6$e ¡®o×w4CYÔ¥?ÿð¢AEô³2ŽVË—KõëCÖ¥íÿ|hSFãàuÒ©Çã.0j–DÅ“†^?8Ž}oÜ)WÍ8tʼnfš¤ š^5ØÚRÎμQÐ12—÷:¤ÆÑø¦\gï¤2«Öo6ðÓÑÝ<ºRŒÒÒŽ.õúºë+­;¼Ð®/ó%.r\†~ æé; ͼ.jía8΂.Z“Q¾ã7Ñ¢v÷>ä$çu\vòÏÃiÇw^#vw×2ÊÜU ‡]@Ìtn— |ÁÔó‡Å3+cá'‘Òi×µUÙ]Qù3»À¨õOj©+X‡}™’×]GF#õ‚®puŠ:*ÃãøJ4ßK»xz¡‘xôA”…ð“¶(Š»¸M=ãÐñÇÚ„v÷¹Jò \ì‹\j/Ù,謣_YBr*&ïªwV¬êêæu&Á$–˺.NÝ>IËÃaçø¸ÿgàw œú:ñ%¾—’ÝéGRR;¾Øxú7ò’x$Ù e2ëçî°É,ÊBQþãqú"Tùú;$§±ú\»ý *ÐnKkÜm5äéšµÙ/òT^ Ó4›N»‹Ã›èng¡Ë‚7J¯›æ±ó+iÚ1®³k¼]¯î–•£%Ždí—w‹?T£WÙ^¦,›çö©ŸäÚ5ùßßvæÇß–«»ÅÏ& ¯äÁñ™¼¤‘ÒBñ¿¯—K÷$Þ“‰å‚àgñÿØBñzQXÃèÙv±Q—*Ïw¡/u/LÕµS (¯l R.V·2—…”—xW1†¡åÓö^õe:ªWén®Át½,O¤GÞ÷_g¿+•Z©uâO¥ÄÝÝI¼~Ö¯|“çx^-`ˆ7%|-•{ªb›ÃC˜àPB™K­ö^–o‹Ëtÿ¬nò^8¿’ ®Ôœo¿}]Õ´97ñ×½º€¹Z*¿5»¤Y/æ×Vžž&Jäf½}^Ü:YÀ²M[ÝmÖË;ÙÅ™©¬Ã0mñtBYªaÕ¢¨á±¼|½ôt`q—Õήá fËÄÆe)ü5©œº ’sœ;ÜÌŸ?Ö›¶6äÁ§)a› Q\Åá­7· _wÂ6$­j³F›ùó·ËåÿƵLó ­a ó ÜÙ”ε]'o¶ ¯qÔ"¬Z"4y2(çú*vIàÕ<‘znû(aBßo¿ùòœW9Æ!‹Nݦ].6Ë{QðWËûCºpV·lÓ¨® ä¿IÆ ¡×Ì,^Õ÷«™ÒAy¿‘J¼ª–_ÂzµXí(@i„0t*r ÐÈ?^U&#J*~Ft‹¯¤®š¨¼ª+Ò€ZcëeÞoB+~FuEèpQ‰û`š-LTi¾ ŠüQª¼Þ”TÀÚ©NWÝW® DÕ&ÉÌÝ@ü ë®ÂkJ'~nëdäÙÖSjXµ)QCd` ÿÕ_‹þºªÐe|fäÇ—0‡¹éífù¼£šÏºL™mãù~uû¨õ›vm’¬dý¢Y>Î0TËa¥*ŸŸ1Ü’´º)ÉKö+Kš!œëkö]ÖMQžÃ6-LëÝV qÖ¯§¯ëÇàçr»³Ò*¦ûð¬OÎ >¸@ÀœäEQ—]û}ƒ’Íã €Á¶½ù–1Âä?ÆÝ‡ÓØL+-î(VÕ!é#®¨f´afå£Ñ¶¥•¶e²'561=ŠRØ =[cq5CŒµúÇþ¬`ŠÜ[ÇýX›¶8‘ÿ)µ­mTÛGT·Äiü&£mMQÝî×vT-9÷ooA¦aÀúê«vi³Þ­e‚ßAyÐ l›Ã\þs䣄òwX)ÆÑ¢ƒxK=­Ò&¬×èX¹üV”*Pë{ýr©,$U¿ÃÊÙ€*‘ògT—­×ÿ,w¹±B(ɘ”'p™ö/©‚!~…UëåêÍ€*X»ÞRJñ3¢Ûl´RÀÚŸ?‰ÈKÅVSáɃ¨ø“삪ßa%Þ6?úÅ÷* êwX¹þùKž-Ghµ¨®§^FhÕï°rõ}¢×PòÒd ÇÁ5¡–?#:òõÈŸQÝ™E׌CѪÝVsƒòÒfl Ù1¥ÆÔ|ÿzBmk©?ú2ù( ‡°j\Q2ñ3¢›e¤n—ÅQJÞ\ŠÜYˆFHÑEh„• ‘¥.¡5Ùh±ÛÉÜÖ„V[Àj²…!-ÓhµÏÆT#£ 0­èPïh±´Õçƒá;B*†u¶>â9ÞG<Ï&c9³I© ¬§j…s¸6ý!¿Â*²Ì†H™ É]ˆôåBQ—}'uâwL)WÑZi«ŸÔ‰±Kt^µaSV;òÄÏ îÏ($dâWX5 F”Lü ëæÛgtœ0@´ßç¤òûÔ] ‚7„NþŒéÞÒº· nìÉsÂ¥6@´ÙEP¿ÃÊ,[=ÌRª=)L`ýò+=G_7Âã¿' ˜úúéñŒVK T½}ÜYÔÂS/WÏ{‹\™Àú=U4ů˜êÝï´îÝ免gQö@å¤<‚ ÒMªç0UUô÷>Á¾wùÙEx†(CR×K“ùîqþ•*X»Þ-ï)©üVnQ£ù3¨‹}êeÈŸaÝóbåù¤T[àê±M«ƒÌPˮȞda‚éwë¯û{Z¯L`ý¯Ý·5„Ò„öÌ*>#Ôo¬ê7„Zm~¶"´Á±•ÝÒdüEõ¶þÚ!š7¤è ¢zKªà:ﯽkeò¨-B[Ø€„$£ú0I÷a’ý×_”Lü êÒõA‰_1Uþpÿ“VJ T½|¢«ÞÒ%<-’ŸriƒVäTб@ÕÛõ~ugÑ+”°ÛÝ[ôÂVÿ%O(¤Jµ±€ÕW!Õ0ËŸaÝâñ^6‰øjȆLùÏ~¹¥šLmk÷_¿ î’¬EF ##»¢ÒÍÂ!ä•?úÛÇt·§ÆS“Jý+­½>ªÇ'ì3é)DÕ ä\’‘¸K$w¹ügN½amj¯ÈZþ ëè2y…•Èë5¢¿Â*ßè¾öÑH÷õdœL©aœ6€µóÇùŠÔ*X»ØÜ.¶¤X[€ê¿ÇaŸÊŸAÝzKõů˜Ê[-É­5M3Œ3èÓ€zÝÃkZ9¼Æ”#VŽ«»%Ú‰­Ù€ÿúÚ»½]<ï¶ÄÂø¶!È_œ¥¡øOz»F—Ö–-݉áÓþZ¶vdÍã¦ò oBÓŒÊÈÑüi±}Æk À²E›mÁí»1ó+¤"&œÍ¯˜Êœo·òCz\¢µdŠñÒ_OËÕ?[UXA[ضjé‰@ƒùRå¶v¨flMaÕ¤¥¿ÚˆŠ[eQÔ7v©c ÄúhBÓ‹],2/†jÑÉö‰’ø*%Я?üÉôwñ?¥ÿQ ô¿™_UTõÕ©:CToHÕDõ–T½ETïHÕ;DõžT½GTHÕDõ‘T}DTŸHÕ'XÕ#ËF)=²lô²Ñ#ËF)=²lô²Ñ#ËF)=²lô²Ñ#ËF)=²lô²Ñ#ËF)=²lô²qF–3¤lœ‘eã )gdÙ8CÊÆY6βqF–3¤lœ‘eã )gdÙ8CÊÆY6βqF–3¤lœ‘eã )oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oȲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)oɲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïȲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)ïɲñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)Ȳñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ɲñ)ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ )ŸÈ²ñ .=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.ÚCâ¢=2.Ú«ÅE7ëçüv~ûmñ‡7¸ô"?(²Z~‘òòÿù­0çÁxšfIXnéÄ(C3‰á0´^Ka24>µ ŒHÈn¦E.M@í¥7žÙÄʦ¡¾[nÄ›„YGÞ8÷Ç©#€k7"¬ ”øó7X@“'ÞEàŽoªý0’ÛND†#ˆ0 ǃô&Í‚I®D¦®°˜¾çŸù¥—„2ÅkXB,uÿQœû³4‹'«n ±ô£a8š%A>¦A4 ¯V@ìx2U‡SÃ0Roä¶­yÌü³¾˜/nps „xʽfc °x÷Nßspígƒ &ñ$÷ÊÌH¨i ÐÂÉtúaV¼¸<Œ´&K¼(Æ U ìbØcœdÁ€ñ15M!šñ(¾ÝÀÏâ$$¿&Àš`&Áh6ö’<¸ž&A*Åf Û"ÐC$Ó$-×,™,1“ðo/³ùÀeŽ^8Ÿ ©G¿—±×ÆÔKÐ2Œ.˜/²iŠÑìmÕ ¤¤™:ó>͹Ž`NÕ M¯dÖ !’êPe(³ %«Kõ;¢+«æ!ý¾[¶^ê„®Ó¢ú@—i>Ç}QG¥âÉËêi ·Ÿ·zÝ1UÉ!Òms!åKô{Žt%”¤'Q™$Ùl* ã?…††7Œć¯ˆ>@|•f²Ùö²À|~PK,¬ ºøó7Zyšeñ(ˆróQ’x6¥ø€9A5~óa< ƒ[ äIì»\oÓœ :]o[€ßéz›æu:Q›æÕŒf/¿ˆâ+1X ¼L ¨‡jpþõµ3¾%ÁéÎl.9‰ë2H“Faôg£rôåµú: dQÃTV´ÎͶl^àÃiˆ.±侩žäud¢³BÑ-J«¯Èzý =ÄØ¤iJÐÆ^4šy#®´xb¼( Â~"Ã3q;âï7gùÔËÎ)4%czyÿö(/…ŒéåúÈ›¹v¹›XŒaûé ¿ 9lk„ mÞÚjÀ§hŠñÝÅI¦ùd6ÎBó5žP Ä×Ý‹b8®¿÷I< *TcçËPÒ?&‹/&è¡h§ÅÓ% fÝ ý÷E7.SVÚz™¶V~j¢ýER7¤HQœñi¥1DL :„EìÝ Tð“@]ráÜ(D­; ’,$_3¡‚|ÐcÐ&Û:m1[cP A›Äæ”àcÐ’6 ÒÔRß×ìŽ~¹—øçá¥(+ï&ïyz.†þªJ¢àv1î‘qí Kœ•Φ²¼¤n— ©²:ÖÅ›bV¬Æµ/jÀ<˜„Y ‡r¸väÓ±—ɨ¦è'L¨k7<.WÛݾüüEE™^dñTÜ¢¸SVïI»Â‘üû7Dƒã£@4Py,þÏUfÞPàhñ¹O¼HôËÐÒÇ£Y—ÑÒXð¢¤F3w îä*¼Î=ÌàËj{ÿ‡×OEÏ´>ôßÞ„íýo… 5ƒ> Z'Ôí`çq@»6È2TƒÙg€` Ù¶‘á.UÅÁpììת¬pˆíùÑH$¬©/§;EwPôÑf¾W·‘bà$r25î7#L5Zî 29r¤·‰‡sêf8FtYÔÔCšZQÓ6Îôžë“÷5JiÑŸžhTÔ2£ñ Êh¶Q–yªÍ>K%€A0•£Ö jNLÕXu³6¦=[S“ƒs5J¦£„PÒØoÍsեƠ-x~œ^禛œ[Iˆ}¬Ë44Ý]ãÕÍPL<˦Ö³6&½§¹‰\¢ª˜Ä¾!ŒDâ3‰O!D£`G#!zÔYc8ÞF#!ꈢvÕkJÓÚöx&Zч–Ë>ô4ù9â3éÇcêÉ@úcy¿3å4ˆüPPc¬: ¶GÁ¡7Šâ4 }·aÞÆê'Ò 7×X›6àR¶àÓ›<‹ågÕœè«qÚ¦0NŽ1¦ùçÝüa5Z|!yÚÖ˜‚8ñlÇñÍDNΚè%l[Û Öº6±EûFùe^SȆ)ˆK‚b~ ˆdQĶ5Mƒ,k.¨k¢ p®šl¿®­m ¡„Žr¤Ã¸:¼ÆàWÍil–ÜLã.O-c IwuvHÇ ²£@¦ÁTÝ«æÐa6%$^5Äy¥ÇqÐQ.š‹7(°€³†)æÀ¹O¡f‚³8«Á}HbÍD]{“±õFK£6â*ñdWUU((¢jÔF˜À˵Y–¦Þ>yE˜C+/Ë’°?ˈ.xË’ÆÑ€øðZÍvêõØõ~\›Û0&Ið×LŒ„˜² ­«ÆS®âÖ¯0ÏB,Äü"Ú(ñŸ< 7LÙ,94ù]É9sá\´3oI :Š•˜ÙéÀî¥) ØÓ©0hTrÒØ‘¤qc ‹€ÆíÑk…SFºSê`‰ÓŠèÆÕ¹—å7ñL.ô±q! îA®px7 sœ›f^4ð’ XØÙIp7Œ@¢=±û2LÃ~8–q=ÙÂÖ÷ßlû~Å™µ_Q‘ÃëâÃóDE©Ã¯$@äqè¥åâŠX3ÄHf™¹cÌ J4Hâp{b\Qy<Àüe“K )Oå)È$¶z2ÄÈ'aÄãHKŠ•4º (i÷ª”4•k­I?ŒÙF3ÎsVãOÑÇ«ÆþÀ¦ÄFwz ɾôrxsÊ®)vä©e;ã°ïúp%Ó—Ó£‚…„'3¼ýÜk¾bM3G3º±iš2hyÑ?ó²srUFxI_nW–«S®‹–†â«YMQ ¦Y0å°«ö7kÇX1dFZM¯ÿ+úÒp—¾AE$tpeÓ ¼@ðfDÖ<æ¯døu›­IzØR{5m ž¨Fa­e@ uAžz‰èÆc³0%hfM'ÿ:ë‚,Wvš ¦7Π·Eˆ‡ÆŠ ×^NQÑÆWå¢ìÔ΃T„ýŒdG6k¬t@ðuA®E%˜É`8ƒz0&ˆjÛ³úV8Z±¦˜±Ï鬶­ ¦¬ðåÓ§ƒ €5Âl,«8í55-ÿMÔ "ï‰á+E VcµÀh/õ©hùwV7&ˆ¼;×®VYi «ùöv$X5¨p~š ÍO£ªMH,}˜ŠÍЛ™T“ÀÃU(ù*va”fr¬šEË ã*žÞãhK@z4 K¢6@•ð"M.Ô”4ÑLâ¨Ü˜'³HÉ'¨€ÙâîC¹R@%ýÊ u?ŽÇ4ÖpùÑlÒW÷kW/¥«/²P[”\_í”c?`þ±Â±f`Ó«æ&§Ë^8_õí˜E¸ÈŽÙ­¹8 C‹“ª{‹@/Ư²¦ƒ¾}î¢nÊ ¹¼Rc}ÒÒaÔGɽ¸ÞX¨®¼Dî»Í½4’$NŽšˆžÄiªí¥e0™›k›pX±e~5jÌÄMÚ¾’–1Fôg¢Ç`† íE$µ%ÀȬù•†%Æz™ãe¶[~´×.è–#O3'nãʕãKY³^†²1°N-*Ô‡nþ‹]ëVxÝ£¦ë˶Ìá©€"Ôƒ}.«fgãpf²`D¾¾f~5C„¤wiÉ:φªXÚYùgÙ8|á#Ñ6ê`FÏÖÕ ­¤”J­,§›•öĽR{í¨e·]Ie芙…Â*Î=Äe–eKIfÝ!ynwǺ7ØÂ¾,¤frdôÍT¶$§brÊÝ•™RÛd5¡¢}$Á$ÎV§PÁ>Ķj¿b1Ìn z—V‰Š EAùÓØ¤i¡ð°bÇY$³ ¨…0#œ`"ÜÃD¸• ¨ì¸¦‚ÏÎO€V¾Ì®½æzwuCˆDd¹m²è,·-šø0½Ù8Ó“)\nMää3î!Ôè¨Ç,,)о öxôD ¢ÀÙ–AmÅŠ`Äy;ã%*Lqœ‹Æ¡hïöÛ:Ým–« T„vÒ†̰£”Œï›ú¢_b5TÑdqÊ›…€–9—ÚƒS_;øUQÕê9KCŸÑåb¨ Ÿí<ÌTP%:ÎÖ¦“t8ÂES!Hâ!“¸“®¬!æyª‚˜£D.Êó¦ÔZ‡–-“õ@e‘}kG€…$=šíÖêA @{î¥2a$¡560›FÉMÅŠf؇8UcäÍzw0" ) ‘’ öMc¶s¹ˆ†NkÙ"<Öˆ¨nˆ£¢ª™…Âö×퀆çSŒG•ÚŸæ*B»OŠÙ¤´7,Ñ*î„ȵZc[—ì6,)–z#}K[ÚYœNES‚ö"JCaei„š¦ šÓ¥εÊÌrÎÌDEé~¨U{Œ?ÇÛC Ìû=LO‚™jI·€öî÷ AÜï×ùýÚcüt¿Ç¿_5ÐõøÍž«ò#½žrã5ãÞck¼ªeËá¹ÝB!²_¯êÝrkÊÒ˜EtºäƒŠwͶqÛ˜"ꔬҘ2hN÷_hìwÏ]öwuÄ‹â½%ûjÆšÎIgCGÛA:;^“fͧ™ìåfŒ5få*±`_y5ñ‚m­™MJyã¢9“]Tœ.Ôº ôQÔÂn+zIÕoU'ª!ùn+®HËc….bypyRöuO[ö,.ª!ù¼hÏåÊ\$nåNB\±¢y_ž’§b´ÅÃU²:ñKObÏgJ 9žúÁ0N‚c\Õ•_“˜ ŸÄVšøû¯™pÍ|—{€«uå®ËÐ(ìÅò©âßfå„0Ëd°ùy8$ Ó@ü´¾sÉ–r´‡¹*ú7Ål?§©Mk3÷’ÑL.°MÝèÅvæî8ý­Á¦ÏÙÁ=pNÜQöéEWw+2 R‡øÑÉ#±¯ž¨ ôÒÍ%#½ˆ_ˆ†Rn~žæŸ7‹{ufožy#ø_Ôqd@ŠŸî‹\Gêæ,eRõÉÅrÎiìè ¢äù:L=¯h!Öla^êû¹7»¶Ä]ê†8I5UkóàƒÍ¢dú’‹ÐúE®!ãzÉ<ÿÂÕ…ÔØøæ!;wPš:W?NÅÛ<Î"ê÷ƒsï2Œg‰ûm’“®ÀéØI¶kq™¾¤…6OË}þ#-¡B}\ûº–³b C”)ÝþHƒƒ²˜Ñù㳉 «Œ¸Õ>ha!(ÅŸ¿Mç·ÿÌ‘œ¨¬÷<+<Ò|­­C'AlE’C'PbôA ×Ë+¾"±óÏãI0•AóY2æ:¨jìB™ÛgšƒË€í¡ª±{h-´ò¡µ‚½ï´¢[ÑM WÔûƉ#]‹|„Ñ>¤ˆïc*çˆ\}(ßGvx®>”ôqøÖ»¨ÌQñÄX@Úé´ìŒ€Jù; ëÇÉø°îR H›’ºÔ¨àŒN· Ž)EhÚ<ß ÁP¿Cº‰wqXñÜ8ˆ)Aýhœ+Wt~ÉÍëRþ¹ìÜÊ­¾¢A·ú‘z\îî·¶MÃÙms×kmy¯³×æÚ_īܣvÈ ²W}Õ4\¾èf›­áz‰ Ós7ZcóпÉä±Ð‡R ý`o#ûÊ> 7<òÁžO.&~DqÐ9Ø\]µVßzÝב±æRs¯º‘¥‚OO\áW^Ùš‡gG55Û«œNMäÑjeíàè¸ `û&q”Él—^zQæè¹)gûu~¸ÏSÇt\‹w)ãû‰½AàzZÄö!'=JN‹˜¹þÚ¶ïÄ‹G;pýiÛ‡^áèC‹Ø>ìCÈ >R!½è5ù‘7>Î])gú­/kå9k­kEªÍ®“šÈêC¯zÖw2]Z«ÇzþO›VPšêciªØ^Ž=P¶wÇNs[ÇöÔÈ­ÊuÔΰ û©¤L=¶”oÉP?^_íÀT  ²0:d»°?:\Š{ L2¼2áIq E¹ÿF&Ú·ûf‚ˆ+I§¶å+ Kœ^ã{û0(ý˜Å^”ÉÛW¹;ÍaFœ ‰–Û½NC¾‹iÈáɈ• SÚÛ¹‰·&þ9‹Èš¼n äIuU:‡šñ_ª°µòþô(-¶Þò<ñ :†ŸK·R”ÔYýÈÆãRmÈ>î"z'¿GgŒ!-wôÊ]j–ÏcÖAï½a<óš9N•ÑÓÊBj;·!°Å0ªÜqUÌVv^1ÝY(ø5”Ë$œ¦äøbn¡n)øl³ÓÎÝ…Úigñ”ë´‹]j3}ÁbÊc‘÷€—çª)`“ù3-¥e6õÄ˰ƒ¸£óë´Dǹ²øPÛüŠîŽyŸœWêl~¢¸r¬ë(L3F<—Ú¼ëÊÁO–xE ˘giØ[¸õ$æãæô9(5êSu´ËõêV'usšª†¬%Š {šËïpÖÍijñÄÌ.^¹‡ŠYÙÓržW½î“ñ–AÏ»$*ÚG—­7sÙ+,£½_håÐb‹ƒª‚É>¢®²ØžÍÒ÷“/áð®C§bÊk§½0]פ¯º9“ªZ8öÆBëä;Mhü™”?£uó—Ä#ÑÐçOki*¶jÆß屈Å×sýãË…_6în*R»·c: mÝÏq­(¤tðåVw€R»7ó¸/ˆ€íùøGëÜ3‰Ç¬†L™áþÁ>Z(ãÈ“Ù8 ÇñcŽ­Uªyo¾fŽS×›Ýf¾’óÒÏt¨›[©¢²]vÂ/XÆõÂÊ·h8üx–9ó ‡?+…1¡Õ“¨HMDíã Aéü¸ˆ="RZèÊŸ“Ƕ-aЋ,…ôB ËõgœTi-Á=õCVò¡hå99@¿¬ÛõÓÓ|u÷›ú!ÿ¶Þîòí¯ínñ”/W÷ëÍÓ|·\¯Žô–æ+xv÷eüê“1Ó—pW,à¬fíÁ'{ ÷ËÇ…;/t§qá-<æyªÂzŠMçÔe-Qĸ'5ð+7å3ØUn>xÁ#\Êñ&·»ßÑAåæÃùŽRÜ[4Û­'öÆÁØ¡œs™.ÆiÙ|KA²Ö‚ÕÍI*{=XÕ˜Eä¯ U¸xâÒo¨›T¹áÂr´iÓ”¦Ñ‡–Ö iÒ8Œf×<–2¥ii<ö’0åñŒ±…¨†;L ²åðx_|SÀ"ó³*–îŠ @CógQÈ, Ò’f]…Ñ›3L™¢4sâ k˜V±µòTÄ {àô‰š ­Ï0Ù@*®æ4¨Â}˜½ÅtÎä qáË5žê\¼¡Ç§ØVÏ•],y?I¾Ï¶ÔÉ[±õ¯u„Õ;¯”WŒ b±Æ¨X÷+ŠU$_«N¥ål¯‡%µÓ ™„)¯ó¢X¯a"*jNd¾aoå²x°³v8Š™ñẙZ'zãðï@f@a§Xë5$Á$¾¬Ï$̲NìžÝÜð™*Ê«Ž°p÷P×þL‰òp N:lPEûPÝšÁ,1yÉ'áß¼¥”ø(ü¨2I±Ä”Ã8-߇¨ØúaÄ¢@"ÜC:õÍâz‡ ¨bùàv-Zš.ï7™é­„)'9 ¨B}ü÷óiÌÙÝ\ZZYÅš=6²ØÉòƒåc¥µÙÚ‹ÁwÐ’¢Þ.äúx•І·J­aOsÒ”Üqu.'ÕAÆr®.¸>Ê–Z½9çHÁ„ΞÎÌÅ–ºµqŪ1‹È<]ª© Øò¸Ê`èrZKb£ë=k2j¬Ö¬r=4d¯‘- qR™·¬§zù6"¤<¹Ô¬<¿fšÓ¦O@ãÂw¨E±­!üñveâNéý™îh‡O¼é`‹óÒK?reÚd³G0ŒôŠSuÀ'o©*©¦}ºf„D¨‡(È{LYÑ Þ:­ƒ)N £?½"¾ár&Ä=Å™é)›o‚WeÀ2‹Ê”…‘èðñz^m E7+†I<)û)õ÷ÿtL`ÖRØØìO {.—¿ì ’ž\Ÿ ÷ɸ=ÞS9ò™¸=9¿®791ÎñkØã\=Ÿ¸‹ ªpbÔã¶^°¥ Ùâ"Æñš,e®ÒU¤ñq³Ns®Ø¢¼©ç˜0²) È.g2ðNc˜úæ¬ ÑÊI QÇÉWÆ[D•¤/µµ3Œ.½1ㄦ'“³Ý)Wûi9ÚÉÍ^N|‹ÆÇ¼E1RHcÖÊJŒ{ŒÇ¡sX-3™~ŽÄÿ0n¯%”:›Ÿ"w¼³ŸŠÐâ'U•«Ñ¦®É2uòâÄ}9,ðã¬ì31.ð`LU£ñÙüñZ–…/ì­Í…¼ª¶îm¦}rç^(×¶y˜B;ô>VÍÙÖXùryöT fɘí *²zp}QÜwsäËp|þ¼Z«bl%fñTGzŠKIÙü¶ÔêÝêÖí¹\ëu¥k߇Œ ¹û*¶Õëpö¡TlÙUà]8ûP*ÔGâEbðo…j3œ¢;ú§äTœœª¬,ÙsMd¼ÈRíSÍš`êÈŠsï :{â÷ÒP‚¥§¦[ ‚Õão pr=?˜cîDRÍõÉ '*®æ¼4¨²ûpˆo>¿¨Ab[)#üñÂ͸S:ê éŽvÈñT„®Š^MÄôàVðj"ÜCøwóKyTýÔŽ®ZãÌ‹pêt°iS@“‹Áz»‚‰ùÜðœÀZž?‡{á­m¯›²NwhKhºÃ5[®•2ãDqý#9&æ~35sŠš…¾s[©¸>¸Ÿ$¤²ûpi Ú¾C[ˆmmáY5£N-54 ;Ú!íiÖËÞ˜Zƒp&7ÍÈuø™(µŒw‡kÙþÌ)¨æ‹$œ½¶„ï©øJÒT-½ViE8cMP…û`Ƹmñmó;{‹BÃÞÊemP¨SDÎvnËNn3ñW¦Ñå…ä@•͇cš(Peóá²Á¹-áÒ¢¡¨ÒêËe») ±ñ6Ÿãd(·õ;?t‡§ÍO5ÀÎ2p0䇺Ï Ý1s¤?–÷;•¾&C3l:(³xqÎ.Ë,^¢Ù$ÏΓÀcä”o)Pvæ‰N°èbrói5ìqîXôT<¹,ÈŽ,MIšxáð†EÓ¦8M\».<òâ@usœªBPEÿÊ™Èv˜’åKæÆ.æ/½$”á£ÔÉ'H`ù>Ññ‘^Mž%Ö1gˆ÷#ãÏìê¢f2g¢}£;˜VbÅ–ÃËûjý€ŒO¸ +2–ñ÷_³ ®ÿ Â}¤b”QÆ©Ó\Þ•„Œé3Lèì‰{4 ª'Oˆ™©Ó•äQ—º7“r5$(]\B?6E±j²¦€"‹ ´²é«ØÈÍÙÂE‰)¬/Îö­]†iØDz†‘<{5ÍÏÃÁ `1%î+Õ«_G*=?ïð*@ãÂwØýLªY>+0œ¼Ut,?rT$ûü©¦}^Ê0ƒÓÛª*(¶ÎÈz1Æ”¢c "èyÈ€ÂlI Žÿòtüc ÚŒ+9rÝ&ømÊóŸ³4Ë'7j%‘)fœÓôP%åk’ê¦Ò¡@6$]t슾jð™·ÈH/3uJíá<Œ³B’ž¶Ë‡o»lñ°™»”@Fy9¬Êã ý›6™ ²ïñB:Ê(؃øª¼Æ²šœ„‘Ë-20Ç\EWpº÷bƒ|WQ ,W#ªšþKǨ©AùjƒŠÃÁÍ {š{ê±Íq™è­;洞e¸™¹ÒÐÚù EV%Çœ+o;½™ô9©úp)êíZͼ,K¾|ÒŸç«×óÝn³üºß1Öý6åUµÅ§®˜˜³Ým‰…~8›Þ?ÃPÅõqX™_ «ež&WŸ0År *ãŒ~.Ósy‚ +Ë ¡µøsHÁ2‹ýøso0P+ERO¦¾ý›ÑðÑò#½ª´7ÌÄ_I Æ&щ—Ñâñ®Kgľ Y- '†ÁÃ0¯"LÕÀb"'õlªNräúvóJnÄ迲šns¦‚íWïji˜7 Åkåä¼fQx×`ÖÆ¦3¥T»My-,ã|ªg›ûÞTå$s¨Š8(ç«IÏÕ§oK‰Ýª/^ŸÜ[”3ºTá4(CÛä5mžŸZ¯ÎžËý QÇÐQ°¯ûÕÝã‚Éß\ŽÐb~"uêÉîtÕöÇ‘e¨>ÈÒWfèÓE˜G±•]e*SŽQ9ŒgSâ`W.Ðzä1ë3(–<Eâ” 2¨óA8ËB²6»{z°b¦#dÍó¼÷x»ûº_>ÞÙI<˜ùY·Ð$øûÔMƒ ^–ÈÆèf$Í;hc+4•?Œ#‰ÔM©ÊQœrðBl"=N|¢¼|:önZ«êµ¾[AÚÏUx,¼X› Æ:ºÎêß³!øˆî‡^¨È~]¤ÇÖÝzeN1 ÆÚ\@ qO7£«°˜4ÖU]Ýþzø±\Ùh:§Ÿ­êsaaÓàlÚ è‡ž:ò̼aKeR©¡_]¨¬Nµ#³X!H/º:ßø"}°XŽC?{!v–Äc92J¼ä§YÊän塘/à m:O&ѹùÁK _¨¬OE›ðbcš„qf7/‚Ž/ÃÁ‹ïJÉ%°/þÁÏh‡[=ja«å¬Wè«éäT.ª†ó}9pÓÙêÎ ³)#\gª¹GdA¶9-‹OHǼ•Ñ Q¤-JOéf YQQ‚(=éí]ÆãÙä´Â$Iœœ²Û‚OÁ¯á: ’ÈëÓ¬ŠJ†|䋟»Åf5´3ÍpÌäýì†YÖªÖÏ…Ï”³âYÎD<íþ‡IôÓC"u¹åf„ìä;`ï7‹Å×ퟪº"Y—H[óìÎcT\±Œ¯÷H¤<É:ìøx0¯÷îJµÕ:®’)¼IȺðÀ_‚Ê%"KVÜA¶…\ŽhÎã.8ª½Y™ÊAÕaaZWD ·µî\pW³ OÆ;©¦2iyzÞÍ·—“ø2¨4ôÝ@õx±“ÛUWëäÁã¨z§™}w.Z®Y•Û+t–즦\£›‹»ŸuÓ½;poä¨õ<:©ÉÕJëÎ@¢AÇñ+1,ýÄ䢘Ê]ÐYÅ}þ-7½éõ΃ptž½ø*tÓ11Üô<–ÿ¦F”i—¬ÊäIí©ù«£¾²lÆ¢mÌtøX·©§!Áã0øú.dz&îÑˆã—æ± 7Œ¢XGÊ+ëËP'ëq¬Vëíb·føÐã—CN½ŽéÌ .L¿8Ø/패—@Ï¢â)ÛfMœàõµÍò¿ÉLM8vvýz_iþùi~»YéŠÊ¬ùŽ"2»sNì,ñ̰´3¨låíà>‡¥ˆÂÚVO–Û'“‹óÛl5º“5çåT½cdóÂqÄ©—¦Wq2èŒgêJ‡ñx`: åxæðquöL+t·Ü,nwËï‹Îª9Q©· öe€Æu„ËüIdú”]M‚ü" {òcÖ!Ô݇ã͘/´v6óÉ0;SŒ@þ–0¦Œþƒb½´Y`ÝÉ$Žâq˜‡>/q ŠÒ0=ºS·Ú.·4¹Ÿˆ×¥ùa‡¨Ùʧö5»vÞ òÈ­—.$³@áÐÃíCÙ[`,‹bÀYENÚÕ'QéqNuænF·Ó ›ÝQeÖ^ýº3ÅE¾öPœº¡ŠQL˜žÛãˆn¤ü:æ4ày0žZ‡…vŒcÿŸ,{j¬rzMQÎìæ“Y¨¡>˜Åì¨ua'‰Rñ%¦aî]yɉWÆ608ñ@ö mÓ¿ Ð,4¥wjf*Nç郜¬kLy0[ä›GUGW «`,ªŸ òÐúa6ñ¦§³_†Ìµ´“õo¬DƦ†qîõãÙ‰©yn]Tä5ÔÉ5¹:¸¦Ò/q̲ó˜^²Ú?,vîd?žÞ$¶9#ÙzGJù–àøüóÝây±º[¬n}á, :Ú'k2ötzžÎDÅÒ½<ÎK±-Ê6u$ÞZm}™ .B}/Öý¨ºnÓI ®9KOtÂÚPr¤ÂÆWQð"u¦Ù,–Gqö"[æ^kmíŽãvTÛ:í…â;n<;o1ÙœÝ`ݵ¹ÿg í ´®/ؤ¾D;ÚeãÙq‹Ùu3Ù}Ûør ⋵‚]6}ݶw/ÒÈ *+]ù<=ߦ™\pÛ•‡.ÚÎNÌÎZɸÿ§lzÈh6k–G€³É´Ð,›Î2sü² *›V™Ù?…s°ÓYºº¸?VcäFħ!œ8ää¼ YøäÌ`äó´rèÚ 7ÌnûlêQ¼$…i–ÜäÁ©Èžù¥è*½[ÐZYCÉ'ÞŸ]]‘<±3–ÊÁyK-ä7Å@ôy†áµuÁ&Ä=™´ÒåŽk§…•ºÄŠRëŸ{Œ­i×£+9ñ¸_ä“ £ë;dýfnóc^ÈÍ=ñ0"Ûú“< ¼äÂûk潸ƒÿÃ{ÑÄžH°W©/î‹NÑ£Y¾˜“—^/ý˜::ƒXîxL_š{ÑÍÕy/C·MÔOž¥ô²Ww2uœ÷éÜÎÚã*ºã6¹Š.÷sÚ6ˆrÑê„×ÓÇ r]z0ž>*f&8:‚¥—Îw‚2ÓÖDz¦,¹4Øå Ô¤Ê/Q]­mŸZ=é¢\¦K/ó=‰®ñËá­»û`Úª=Ò$ŸkÕEÁÓ2³â±Ç¡y]À_©k ã£Ø³,–™;_‚›½ö%®˜•ˆù0sÊët7ÕDúE8–ùòË4Ã1`NÖÙc¸fãŸ*Øð¢ðYôrøîë¡*»û+礅=Žkn>k™0å#u@õ²Ì‘é4ðm»Im|o0PÛp¼±\ }ÒA‘§ú]|o/Ñ)c¤hŒãQ~êSsZüÂqφ°±¢àZg 8õÂIJÜtƒî¤»ÕigðKÃh$Ç]0;ͼĦ³qKWƒ•¢à “x¢z 3qj'…»“"]ž·UûyL¦cñë)ŠY¥«0;WÁ”S`2$w¨O!Eq-¶PŸû’‹]bß;õ /Âíz¨×åð®Ã!]ÇøN‡n쵚|P'ã>öI/\ÐÉu´Cnh.êÔJ¯Óqf—cK‡ÓGQrkvÖOÖ`¶ÍÓ|Üé=ùÎGË/0BîzTÜýH¸~ÂJ'/¤‹t‡ƒçŽ̶…MǬKA­(¹¥ž=ää1¨bf‰'féxØÚõ¢Kd·wžÝßø¡7©æeÓÓX¦"©ŽZNšÈÊôbdB-S/ñ&iGHþr7¼öp'¶! 6‘¹t²»SX]‡ä:™HMe®KQ»ƒ³ö5†[œ§_î©çKŒÉ[qÊâcCêlQ{Qz;ZÓlpò”Íéi÷y:AmuÊÍdçr-ñþË\¥™7:!®Ššt’_zIxʲ÷+/‰N>9ŠÁ¯ ¼Î?Ëtõ_gÕîåO&,ñòáØ²¡ÆFã-l“:®ìë5ï'gcyQéi •<õz2>í™wóæô+‹ûHv=Wch`½’lx F­”·öŸ¬“y{4 ]pl›5—„› Ü4H²›üsñ×—Sp¶%–}> <ùqÃ]NLëö<M=÷ü´‘^„‡ü©§¿I…“ÌBÞ¹06 '°ocˆk±ÓÀ BoN„ˆÎÿI„©xSbÐsdMÉ_¦ƒÎJµ p²?™”uvlÕÚ„»l Pšâ´¿þõlIÞl:Sñ4³%^E$(]OÓƒŸxZZ¬À¿ˆÕwûMNV#ŽY¢øð¼}“Ý’Xéÿ› ‚-ºÓÅI˜ûYZ–¿ÔÅYt&“£<¶Ô<Ÿ³i±? E‚ê”Ϧšå“Ïh Pr$ó§ŒoÌÁ³YȈjµ%(}ú6÷Ç!¸à¸--I³ÈL)·˜L)šcÍÐR ìr»¹ZÁ*dm NŸE2“È 3Xúœ&½%Aé©?e¿´Š-ÁSËø‘â¦'sºQdê°!Š{m NM´j®=? /ež ùÑq:æ¨Òæ \éÃ…)N»Œøïÿ`Kò¸_XÅ–ä9~¸m J×-tìÙï½´¤YÜ×^5ƉI8‰öŽUò«Æ(±èñ1_xÝÜF徿»1fE¹8ßpÑU ›/þHBFìÑá~R™Ox‰¦ž‰¬YCÌ›ÑUHw• Ä×7òíAœq¿ —«»Áú篇ÅÊÂ)Óœ9“Ù8 ÍQÓi<8Ÿ¦X0*PYDéɸŽ{¼Ü''˯O„{òÀrh…&Œ¦³S&hÏ<ÊÃY—úIÍÃÅ"W:¢Ô„Á‰0ñ¤f¢6»<õ¢ÔZŽÓK-#*¢b§Ù²HAtIT´âWHs8ÐD¸:`@Dþ¹[lVóÇÁ|7/ÖWÀë–ÌÍU6^uÞ¯K ¹¦øï=žiF ŸÿYüúÒ Wa§'N£nÞNçéÍ9ïž^5™§rïi7Ä4'&cÓǧ^’mµæÑ\l£Æ©Üt6쌫ǴÕfS®çîzw‚•KZ¼ñ(Î?ÏÖ_:üä%¹Xxxô5 Ä×c꼯w¶MûbwûÍ_¯v‹ÕÎÎÆc¹/ÿ‰O?t‚ýkY'¤C¤%ÿ¼~^lnçÛ…JÚÓ ^fŒ†Ñ \S?Q=‚¬Gƒi÷ÏwölóÝ~³H÷OOóͯü³Œ?a%QWÚÑE¹¯ ‹ .€igD³KpÐztžªÑ,Ñï+L uâMÏ/ÿËE–!±?ÿ>ÚÌŸ¿].ÿ7~Þ-׫-…e€áÌ”do,:?ýî¨åÕË•¼z$æ wÇ–˜“~;†ÒÑ‘f'a×å+5X2ôü Û 'Á»eFñÀÚksešÞu§×™ž{²jê–™‰¡”ß-s]DñUÔ 4Œ©p©øÒÜ®WßÿÐÿ!GýÊ0âk´>ŒÊloÝPÒS0©Úæ {Ó'PÄM¼$ Ò“7'8¡!ÁrPއ<$‡ä¬vœ’&Ì05»œñéñn#Ìf%Ü­g•.»žS¶8{ÉbP胗Šy˜Ì0&` 2£Ù5I¿º‰—½~5ߪ¹=º¬Læ»ÇùWœ§†„Hš3&ŒFWÄí¨ß!]zéS2ñ3¢êýnÑõ~Ç”=›²‡)ÏlÊ3LùÖ¦|‹(ßÛîó=vŸlʨÒö„>`Oè£ÍçGÌç'›ò¦Ìé¹êÂS˼2u ZåÕI sŒÊ¤Q”›”Tß@½>ýê=ζ¦ý˜ãAßÿCý_R/ µÙFx´ÜÞ Ôܾ“‘ áµãvÂÍ1z¼1ùlĨ–nʧÿ<øëÕýòæ0gí™4¹ÀÃä÷ÐyS­ËHp1;]î·&¾ž¶1A$£-dÅš`Òg”¶ Us‚*úž™ÜÜ!Óä0¨Us‚jÙ>^5#(‡¸6ƒu0&ˆö*¶aigaýUŒ¨í9ÜÿŸ¸wïmG½ÿϧ0Î>ØާG¹ôe1˜Ží$žöm,;ÞƒÁm+‰§}ÉXv:ÙOÿò*V‘,J¶2» lOĪúE—(ÞDú[°4—ë—à ¾¦òê—àŽ¿´Ÿà }÷÷qçêKÁ‘_‹ûKµY”¨Ú£d(¯ÅwÝÁ:bü¸M§sß(ʤ<(•‹=V_:ý³P³OÈývÍvØ®ÙöÛµ_Ø}ß úöF/ÀSÛ%8BÏùk‚Í+!§ìJ<£HÏ˧ٮì«GjÓ˜â†E¡tàT®q`S¦ß²Ír¿K“§éî±–íæÿdm¸tY«³'j³ZM×ów'äÒL›Ô… CÌçÉlŸí6«D™ü}7Ý>¤»øy®¾âÎçu™^WéuÉ©]òÓûjíçt½Ë„»?¦[ÌVw8ÉÒߦÏSÃãŠ2‡ËÅ·ítûZ[¬ž6Û]:¯É„EšÑ¹T6§êR7Žævuw»àC°ÓeMà O³ÿùvùÏbÌêʬa@]‘Ñܰ¶J§Ù~›®x ì…'Ö8äáRëáÉt¹˜f5ùÓXΘ§ýt)#¦.Î\Ì^³]ºúéƒrÊMëÚ´!@cyu2}zJ×ór!("Wè'Ùn»X?”Œ\aRW&Ážûít•þØl¿z3ܺ¬w•'œL·³ÇÅsZÛìwOû]mºÝ-î§³ƒ MRê’R7”†Â$¾¡ÌïÞÿVÂÏnó=];~–ÓõÃ~új',׫é¶.´ë¢|5d6}N§TX­¦³íFçSÔµACš2!Gf•2ömš-fµlñ°sÅþ|ݳº.áMŽ aV7f—ëë“o‹5¯Ò—t¶ßñŠóÀŸIÚסý¥D¶MÒÉ·å4{·œòœÕX}6ßl3oMÆëêËnCõɹU]ZÕµ—¾ë6øº‹Ú­L;ù¶Ù,Óéš—ÂÓb™&º0k¬]”n§»Í–ÝßÓ6Í2öpn/W¯õ,¿Q餮œä¿˜×Šÿ^*S¾ã){òO·¯ž,‚tÕD‰Ê׎=q›ànðMptµávóG:Û̦³Ç´Æ~(V]?mYA³wið`”tî¢.@Ê=è?Ù“ß~ÚL‰7g2õúcº|Îf«ùFLÛ׌?t#¹B]¦×y qtãùXDhVÇe»7àKá${™¿ß/—UÀÂÞ†Jû*XEðƒ+7Ä8.Ä §]üàêy¿‹¬:Þ“§Ír1[Tcç /üµ2ú•W.sˆq\àÚñX†B8x}ü+ ¯^Dd»ÉÇ^*xȼò=`å&{ èg^¬³Ýt¹de˜Þ/^ŽÄ[€çoùÙãt±>’lìô9ÝæƒÃ‘ÚÚG’€qy$ã0šG2š€Ñ:’ÑŒë#×€qóM¨øHF ã#cÀ˜ɘƗyÊžŽÙ”JGƒÄ}>ø Iév»ÙË’Æ€¶ÞÔ«ß2†ØôçJØg‹Wéös{Ã||ƒ'àú"ûŒ°Tç¼qÅûîÿ«ž§w·Õs3ŸfÅ}oÞig¯"ÖÿߥÛ@ןEVºä ºï/rEcý£évžÏœÕÖÓU°Ëë8±’ëikW·ÚÿÆ*SYJ_|Œ©L/^:äua0Jwûíša—û´ö÷65Yú?9æK×LÝ™%žàÔzNh«?\Ï‹íf-ÆpËéH9´¡ÚÀ‰.ËÌÎ oÌUð,Í»ü_›ü÷evþå“’• ­®>rºUbÍ5ò%žO`]ÿY?-7#»÷‹m Á"«‘-@q]ˆ®*t pÀüå­äLÏÖ‡GÇÉ«£–ËtYÁÁªpW©˜%o–Ï|[L±ëûtËžñ´J  NÔÄöñÎ<7µÏRVÏY› @ìõõM±Gv ¼iļm‰>¿ÍªžªxÆWO›µž8¬{¼†âuqt5bø¸"1ðyz?Ý/wõù‚5w>ÐnW 0“w¬Ï0Ù“•‚±ƒ`5¯þìóÅO•îE<è*φûâêù­ˆ|ÕÂýróƒåõžÕfGq5D!|ðʯ¤Ü‡ÿ­\Ux…äN¬·Hû§Ùôiúm±\GACè6Ÿv­# ¤ï*AQNÙU…&ìÕ=ÓmšÜ/–Õnq ÿéµöéÕ¢%y•R‘ @”‡dqÏ.îÅk÷fî0Õòý–)?ÛtºKÖ óµ U¼X$ÇGöºzd<ÌÓeÊÛôá¹R ;=n*@…9¦%`5ÜñPMìu•»çÖˆ•ÂKôu”¯Ó#¼eoæ)óy ..íA/ ¶éoJÖJj¿‡7úI¬%ÕŽ¯ðªêònòµÕ~ou7x‘µßWöV~¼ÑU¸àº´¸ìÚëåõ|¼ÒÞèw±b;¾Š×b—w…Vdž^ßÌÏkÈË[•ž½FÛöW¸L»´+¸X›òòFwå¬Ú¦üeoçËŽ‰³jE|kRMr‹û•ƒEv†|Y y‰a7oÙ&‰+Áb {|Ëœ½uë+¼"ôà_-5¢‡ç2°Xôˆüý¤§¿2féì{]~ƒÉõã&t] ð >_oê?¦ÛõbýPŸf«žƒ¾<ãuž~Û?ÔùG9æ>fýéûCE®@xÙÏGŽíZ›­6 8ž¬6w·}U?I6€Xü‡´Bipc—WŸOŸêËÍC%nñðŸOi5¸ òñ+qÐFzàƒ?/ŽPÈ ¯ðA±-H©.9 ótÅ£×A]ï2ôÌ&v·ƒTØÍ> ‹dâ®õ¡Ýêho —èJ‡Ñ¨ }h÷¹:ë¬*Û‰ŠRÝä ØîÐ5.æ¾ú©ËÙÓ >° Æ;]߃º½eد¹jÉøº¸uoƒx»[{x—¶>˜û¬:þ®jÙk•%³.­Êrd÷CfÅ®¼JÖ·8–s7|½ßz—¾÷ÓA{L]òOÁŽfJkCTüú~½ÏRþõÌâ(´c|TXŒ0ks¿Xò>I…‰NâãWhÎ;ÃW]¸ÅZz.êYS<ã£øÛü}™¯‰Ûé‘«¥¥EâÛtÛE›[!&ÀænS¹†­9GØìl³ßV)\ 0Ü2C6Ò QÏõb½Ø-¦ËÅ¿Óã~7Æñ!ꎣÇH૯ *}¢`x£8 ¸< piÍ£M8nŽºeG®´1€ë£×pSµ[Üý¿ÿ÷oþßQ˜n½Á2£úGAú0£˜ùŒaîîœQ´qFÉö-ÆÂŠ'HJ@Þò [0Rœ›‚É’ù;8×׬-ù|È>åªÁklõ†åºM—°ÚÚÖ½ŠCp ;!!»Mb®’¼¯}s·©ƒ+ØÏÎ]€‚=Ú(`äDì&ñÓîeWçû©›½‘±‡ýbž¾ÛíwÖ__¾küïÓŸÅîÌì¿ñŽïw½~`7 }æ²a×ì»\ZƒÚÙ?å¹]_†²ý7ü1 ™¥ù\fbÊþß…ÛÂ{²‚¨"3§…™¹ß¥[ùQ ï›±®õvš,Ö³å~no·AålÂkößQúç~¡öjg—¬ÛP&ÛÿõÜÿ(]±NßþDl»"”kZ¹Ö¾úƒØ¾3¹í¶z¢ÅêàŸ<ÛS7Õ~á»ê³?аÞ[p© “Ã%¯¶‘{«ëŸmQPèqºdz2‹,Bw"TEAÇSÖÊK›ïëË,éµDf1S”ê¹ñÄEEOœÞ"ý~9}(ù„]ë½¼e`æ€{ó¦fª%¾\wmOد“,æ]Ƹ±«ób^²ŽÒ3›NdÊ_ô/*a\E£i¤·­¢qåœ; ç.]ó‡Á8»¢Y¹êÈÙ ÕøÙK3ov$¹®É¢°.Š +•›W ö-Ïgƒ~"×Ù[–† ò©¨@Të.Î4+4Ó5ûGå0Ýz3„Á%3!Î (õãÄû'õë˜gK•êiöømÞùpÖ„»rïpm³bÝŽûýz¦Î»›–¼Îú¶:¦5ñ'VC¸ƒ[)ýE/Hì¤Ôk›°êl.¿×ûäи;(¯Qí`áÃyQ£oWŠ¥ßÔ¡0Rƒ"bÝf’‰ž?“ì/î›@¯uéµ.¼–)£üˆ43üF%f‘Eù}øg­ÇÏ+ýx¾ gñIžöñ¶í/ -׈VÚh˜î­³’Ãu…³$^ÿù1è׌5”+F¹b¢{Lj7PñÂ}yû>“ô–w°·r B•au›IÙ†ƒC@eU¿¼ Ÿrm:£ÿµ@¡ï)Cgî4Û¥O§oSy2/½?òø2ÿÉ•s(Ï-ËÑ•!Ζ¸±óÿ\`àœ+ïåºâH«í~ý¦Í~-×ú¥ŽÉøX*3f&ê-s"©å^Jû,MV¯+gVæØ çûÚ*ž.‡pËÁÙ\O„èm7Íí\u±æo^ç®Ô›YeÔß²¼ÖÑ—'z)ûbý¼™£æì·­ÖªCë¦"vLÚ‰YÓ¾Nkà8µü¼ÂR'3f¶[Ž«ƒÃÖNå¢Þååùkcî1ç™’'«Wû<½ st1Ì73ç0aWUäªF½~àþãJÍåož0ØEšæJ%+“µDQ{‹˜*ÚyÊwL×ùzu/Ðè@¢IEHkÑ4gÒN<Ç;S$xús $X öæ+ˆ¨i&!IIê$LEÈ|ǃʄ®é+cºIä¾$œ#žBz$9þÛr£†·,žH€øÓXlÓ©ß‚ ”ÿÓXˆ¾sà D Š“,R¾5 Ã¥Á¯Oð :I¦O kHN³`›l—È·‰½n×Ë&  +BÅòœ AºÊßL€­Ó,˜wšÐ µ5!Ü–ØK¶¬M öú°¡ Ktâ.ŽaÕÒ‰š¹¶æ?BÈD¤Œ;íeƒ†B¡4cí¹=…² ®Œ©Ü…W9/ÿ|a‰ òj*¬Wv‚O´7ŸCÛd#V8“`1ò 9¹ då‰ï™5i‚8©i2Í‚¥«§Ýk"OWÃ!}èȯa¹]¥+ñe7íHk@´N³`ì‡Ìfëp/ÕQ…xGhûÙ¯“l¶]<írDÎS-¤Ù½ÓKb 6ƒÜ\Œ<Áfì¿­!ˆ#ŠH±0TKÀH!µdÒþi®÷âô"¤BdŠƒYn¦ó†Ë1†§äÑèd œZµH–Š„Y‰9/Õ6[ž.-ù_H}qO,îÉâÞÉy×лÓRQœhóà<®·]óN°9Ù Ó2 ˜ãfK`í„t:{$Œ•47W× zâA‰ B%@ñƒpAn‡~Žùj:Ûn#!ËíÄ4ýñH¼bµ,7WÆ”uFxøñ#Ú¼æ@® aö;ȳ4Ë(P10xù4›ƒámÍÿ¶ŒtǨ°ÃP‡x¯Bî“jÙ˜ö jÅð=1ÚF µ¡ºÄÖ~"”†ÝS‰j‰Qr€Q)6ÆßÊÌ…Ú˜2…<(‡ +ðî—»ïÉíô)Ù{;1P®0 Å`è ÕvUª'p%áÔbÆH6›o WKâÜt6ÇuÁ]MãÀ•!'<6yŸ2Á'Iyœ¸šÆ‰+CNŠòïæÚ›WÕí=×"¤O×à}RäJÍBy±ÔŒK€Ù¼íQH†J€ “sªÿ-¥_Qàý¤æŒ¼ÚR¤Lä…mçL2úP ñ Àa§/»t»ž.“UgÕ ®6öäʇ¬å³‡|ŒIi›>ì—Ó-sªg}CXWûpå'ÖLŸn&jê¶£{JH1¬^‘NUux¦u0O§:Hù̉JUbÎà‘jëH¢Š‘x’Ô\¢U05œ`þ“¦@ƒ¼’ÌØ ËûØ©2ͯ-=^ åbV’ [ЪÅMZÏ3Žéwg€§Øö{2Í’éüyºžùGôl Ä©éo÷¬ò&Ï ¶vVìa$Z[J¤ŒäEn–zYfR"­ä߯H|È‘<ÒO®WQ!}¢kÑÇD5ª]}þ¹“-¯Ù“wˆ¥=Hpþöž‘bhë•å–±”HCù·eT4)åjA˜wjj+Oö¸Døß¹Q–ò#nwÈ®–„¹é¼ó“vÚtuÝ"QÅQº9Õ+E®B­žÌiHe¾T†›oY‰LêÆ ¡€|â]À›£hü8"ì¯ç.ãÀÒ|Kbðüj¢)*¾4Ö²x¶›½÷‘‡rÅ)³ÛcJR¢LÅ߯HL@ª~»¿H†‚ 4   scg­ ,¨@hmI§å”Cõ¥HoZÕëJ )?Yg¿¦×‹=]°PÑïˆìJÐrÛa™v ¡Š\‘­Bz]À‹ÕFôмŠwU€G`³ù¾ ê‡{L§ótòà*#?®Øö&+† ¥¸*ÍÀØîk“ŒXaLbl÷kÊž‰Œ-»ÈíÌYN–•Hñ§±à Ϧë‡%k‚±¶áÔklé(Ž•j;~Èïk¶S²HCáPZÓßË醢÷×q”$ÒIv©?¦;ÿ Ö°x"-‡‘#ã`X‰Ë3ϨQZ#U¶ùµ$f¹›ì6ßÓuáZ9Þ±]‰“š˜v].å™ù×ð÷Þߌò"c>Mç¿Ô²¹:Ð+è JkÃíbÅÇž›ÆX­.ó°[ðõP‹õ.ÝÞó-ͬF‰?3b\.ó@Y°zƒ›c6³NîlÛ/ëùBþ¯ëÝô…X?y¯½)íºÒnææ±H0¼)X—ø6eƒýŠ&/Ì5.o>ã/fjjt>” ­óOµÄæ¹yÓ$Ö†*ñ~9öÓbýŸ?¯ÄØÏ«¼æNÌWÍ|cëô™-_èVœÿö ¾G•X ºµôóB6òÖìyš.xGJ¾Nõ¤¨ï—®ðCk/j•¸òâ5Ïôú9Ý–ÜETüg;Ý‹À v»Zîn7ÖÏz7ÝÎÖüŸ-”#;MÞÿ­5”~þe `}Û¯çK%et)µ} ÙëÃÅÚ’2jJmˆõ¹ü&€ˆVûÒo¿z ìWÈ~;}è·XkÂKÑ+hü(-…¼¶¶ðáî·iú-›ûiJaW,é2nyY‹û~@Fçê‹ß~½f/Ÿ5›åŠ‹%ÖbaäC®³Eæ§q õãNìGìíO/±Aö×L×GQƒ@|`aë‡A ÈT#E=aéEoYÿd¶s¿ñj@4²ô¡·O+?‘ h4ìyí¨£R{&€ö_:wÐ~;}­Í¶›,«Ãéÿ°P~T„ bæulÞäWbXS‰ÁךÖv–.zU|ŽÇïxyà?È ý ÓyÆžüGöžx÷mÉïëwó“«sUêœ)¶6šÕs¦/­xX‹o£æ»K¥çÏãz¾ÝØ»u“/ÅñæEÊ‚þ,v5>eÅ·|XnÖi ¸òy«sõiÝøÇ²ò­ó›¼µ]ñ=±§p¾˜ÖXíüð¸«íÒ‡í´ö¼Èä`Ù~¾ØÔR=õð–·)ÝÖ¥Ûºp[—nëÒm]»-¼óþm§ÕiÔúòÆânåÄòÚU\¼ŠZÏ¿¿í­2hC o„{ï·>{³¹Ødÿ§¶{æÿ²+1+¸É*ç“QëZgk¦/›‹A̽óµ÷Aìäómž2æOä†úµ«¾t܈/ítZ쎢ö[ãM¾•ŠÚ##ÞñÏ dS32R%϶@熬vâÈr¬ùúµ|vÍ4Èr3G¡lç_—F˜®@>S-×FÞKWMpð)i ªÒη¹¬5— >áõÌ*.é#V˜ª0åG¡å³-,`žÅŽ`(Ãú#Ñ ÂQ%`U~ËCUvs¤ÊmÌ?"-”&:‘ƒe-¹X¢>].ár€ þXSD­Ìhäf605Í@kس€ Úµ[mhÓ³§t¶¸_H×õ{²eKd;†æµ+±.B¨ÖÅqëÍ.0D‹JÚtæEűPŠ$«'>É–B|(ÎBØì‚)Ô¹IÀêÙtõ^/Î-æØ^Ò±£[¾&Ød3 ~<Û0Hzýi9Ýñ=>ÞÂÑþø{34 ˆ;Ͳ½ñ7!üÎñ8?b{XofËtº®@×9ߊ÷h² Ød¸"ñ8²&ØdømÂqdM°ÉÛýºâó¥ 6luXîM•ŠÌþoïñU¦g69¸"ªªWDAbÁЍB¦YåR+±µ" ñÃ+¢ŠÑùŠ(—Z5×xE”ËϪ²¨(\U†+¢òkEZ±œ­Qˆ_¼"ªVDy试ٯ¹jÉØ+¢ ÂQ…x¸"ÊG®˜{gE”ÏGV~×Ýî)úéçã ÊÖÐÄÚþéLØ(ZéÍŽ…(ãK aè¶ÇQ.ºmw|k³ Ye–™…`ö23Å]M_ê?óÝãQPcmˆëxæ«ÔÕ‘G¡=äCn¶_­ôfGGxÀÄgír}@EE'òdr:. OÒøÇ~}d¯.ÿÚâêÀEñ±Ãéb©÷±<2Ÿ€<°Þ“øìê8rnmˆüƒøå2=®i÷…—u†0fYgÎb5šŒáìH"@îæa{l÷(76¼?÷‹#oùw@Ù¦Oéô8Œ2µYõýz·XŠø©€…èåðÄt~$ ŒÂ›Á÷Ã鯸Èf©hvoY¯isܨ¤Í€ô|šêPhì`D?¼Jo>Bæãæ«Q–ÇUõ}HÚmžªÖp6âï« \a ˆr^m±žÙVAò©ÙïPìØfUÇ@‹{ì¸mnlñòýb k‹ÈÛªÇÕS=¥ÞÙâßi•*Šb¼=M³ì­¼)–ßÛŽÕž`NµŠ3€²|ñ‡hsdû07«Û»ã ï8Äã{!#ȪrÃî½nV›í–U¹»éq­J0\Öt=²Ü&€Ris²cóÖ§KZ£êÌx³êŒu«ê„N»êÌËÕqóШ<rÕ¬<×qWž×¸©:7ЩZ»t«ltÛ•ÇYzU_ŠýªÍ½AÕ>ñïU{G£ªU{\µA+·¿ÇU›ˆ“ª•þmÕÚþö¶òŒícÕ‡ú-& ÿ¨:ÐþĬd.ÞòոĬ\nÞݾE>?cû°cÊ}l5×…Û§œÌöóiÂW#}_ì’ÙþÛršy?ï¸b¹æ¤ÕKUå€וq]Ïö—ÝFlsçËéÑXn;Û·º z¿;Êmgû««±u—0@åÆ +Ö1bîrñms|ÑJëÙ¾Û¹8…Ë"ìh0·ÿÚЭîXCÆ£4Û/wùN[™í!Û,ŸÕ§cÇøPæ³}<èÞ¶G]xu<]š3ú°1ŠÛ˜>ß.˜k¾Þ‘| à¿Ö¸b­%®k]}öt¶~z:Ò ·ì‡î¹Â3®Œ×Ïî3¾~~ØNŸKëõóõ¨1¼±Ñ,v|¤£áÚ~ýüÛb×e9žÒ‡ãéܘ¡‡ík›»ZMe¦êž^ׯ>í^ŽærÛõóp|§>üH·6}»›Mç¶ëçѸiCåŠ×—ÝÑä°~æjY›ukùx9;ÏlÅ¿ºyJ׳cDe<`ÿiZ¿¡<*æHîvgªŽŸqX¥yÝaÖZÎä7…Ëñs‹º²°?L¸·$Ô,½ÍÏÄÛ6³ØNí£zÇ0þÍX×u+Oä»ùÉD¯Ÿ„Oä=/Ò¾vÖ>ãßEÁ#{Þ‰±kÚq=ÇQ9àMΧ|zËå[;¡kíî¨`u«çœc‹*ú@<›×7uòŠ]äM¯ê|5‰•Ã7ËåôM~E2èt³| .Çè#{zÞ‚*8˸NÐÙ˜ùhñó]À+úÈY¿Ý¿M l÷(JÔV÷›7 žôÖKUáOr'¦¼cÖoY×` q¾=¨è!ÿ£³·cà ìÇソުø¹@玸{Æ‚ãrĶ›F¿Ôf·`û}õal€+)Í^¶µÍºÖ›ˆÏë~‰Ï‡ó]jÛôa‘íìLwGÈAâƒk%­ç ò£öE`@)>I—éJ7Gü{ÏÓçtÉï‚Þä8]?³îä;¾·A2 Æp+[&wãÈ/sÛ¸—´:n»éµ6Re÷~Q ¿zWÝÆuæ&’5±Ùô0šMµ¡HÓ¨õŸÛIsÐŒb¯kc”s¨l7Af›8‡Ó/'ýV· ãÀ£¦p‰géq§ÛiúÉp4h¶ãx0 yñé[î|*Øïå¤Óm±üŒÝn»›tÛ·í.éÔ§ =úä>wã¯Ãv®â¢y*Šß–GÛu;͘ä:šïm/ý«ÎõdÔwXQò\„ü8ºØ“#öù —ÐqÙžRjß £1“÷†.×ëõý}„>ôE¨`¿W£F¯ýe0ú~d°ô‚%~Ýî·Y1’\"óD‚–túñ¸Ño¶‹±¹ª—ŸK)GÃnc|5õJ8Òª~GZJ9ݸ=.áGiúÝ(!öÒé7»“VA• ¦ÛXVvÝnÒ´Ú¬QÂX“ޱÝFÿZÇìˆ]MúÍ›6@~uèê®ò««ãqÛé YUÜ'ÝNÿ3«kFìM8uÚ1{–D1„³QhîÉV¡'›\µtÙXÊž,X–ÃÎå¨1ú¨ÀtŒí5î:½I/a·;żžmµ‡„>tF¨X~ãÛf‡…óhÒß’­ˆ²”(޼ÐVW¾®÷•êz_å]ï+êþ¯ÀÝ_¡{¿é ý%,ÒDþ L(?Z”›!_x軞, ø_P™r“ËŒrÔmQ–J"íÔ…¶ê5šüíÈÚ ÝÁ×^»?NÆÑµ·9N©J.%ÕŽ—¿ùÊ'Kÿ *{ )0æRÃZ}~=1e«HÌ/ ùW4 5òex¤²;j5ªàGðáŸ+Ž»I³Í:©þŠ¥=Lq DkÉ- |ÿÇ_:WcßÝJ²kº¡‡Úwy³.›MŸÒZ–þ¹O׳ส}¢š4­Ó¶dÅ:AÁv±™«ÏŽ=¬M¡ót½[ì^ß‚•¥«Ål³¬xŠ\“7]%Žô*9*.•ÿ.ÿ󿑪ŸKü]W>r{5*] ÇÃs‚š;(O0“ 2!ùcºÍŠ·HVÖB™›îÒ5_ÈOi-w„WnRç&|^Bœ¥«÷KŸOw|ٟҨݧâdDñ‘œ?kzGõ³2xÍ©KN]pêšÓ”ð+—ûCf'bÃ"sZ©sîò¹Û0n Z¾vv"sÀgùv†é‹ØÛŽXÍÄU›R3ßÒPHŽÆÜ/ÖóDÏgð}äés‡òh=íèÄõCí ßžæãïÿ8q§Ã|Å\Õôia¶IÕ_lû­¯‰úºŽìßÄ~gü,¼ÚÿÊ%ÝÍÃÿ27R§è>Ò¡´WgqñfVa‡ PR<)U®”ù“WþÉÕøÁ‡‚—¬-y¤Ôàž7þbpfÔDPj;¾Î¨Ö“’(ÖÁÔ~°?7?²2S„~r9˜ Báo’Ép—.òÙAúL·Åõ¦ðð‡X‚Ÿ—D-­Nä·rþr„€¦ŸR…¨+s ö„Z<¬ÅiÖ¥™Ìªn¬®8$Ö—'ªvKkÓšÞ:œgJ—µ^X¥íëS½õ <Uו?TøK#>ÉëÖw—›í’¯Òå§0˜ÐSm,GíŸþœ+Ê&—cØMÖ@º\nfß ¨‘«^c~mAºzÛ/‚K €_óöl¹xÊÒZ³5>÷#”?s”éH´°ëmÊꆛÅr™Õz“î¸ã' 5ÆŠ¼È¸ª;@ÿ<¥î’K¤=ÿ ˜ôâ¯qÑOÇuÜß [Bäb}ý¥É•Þ[òÕžc¾öÔV:âËþ©È©êY![¬/E?×q!l øx€èçÚéÏÑÏ~²Tåß¶åÿÍ5y¦ÙTçÎÇ¢}E\~ZÚW$}z}Iíë”ËÏJû:•¾Î¼¾$‹öuÎå¥}K_^_’Eûºàò¥}]H_¼¾$‹öõžË?•öõ^úúäõ%Y´¯L~Z>6>_§þØ,Ò×û²^ÞûèïIné_Åûk|pê·Çìž~.ϼx¸‘(¥Ÿ½Q ¨¤ç\\:°?JoÞ¸–$ÒÑ'.þXÖÑ'éè£Ï‘$G_¦;Ö ¬}éé/ùRƒ1…Ž„B+»›éMíŠIcñ§°z©‰ ýøiÓí"«pº¼ ÉÝá ­»Goèèu³§[Þ¦¯î2G uý¹O·áå’e}i’põ»¼€žvÛé:Ë÷Ýx 6QxãDÞ‡Ý9ŸÇãXêþÇf±~´À ð6]mžY_xÿ´ä§:¼Éo%™uÀÔ.yŸúíâžÓPÜ9Þ{áužrÍMVttSY¿˜'<·`ôý&ðªIÂ~ „§7} „G›(<ûù{äƒ'oñ㪅ÍbJ–n¶¸2_©T5ÿÅÿ<ÑKÞ GvþG`wI>6[ÎŒ™Ô‰Dèq¡ò„ÜBXЦë§äB idJh—lÓå”o’Êy»ò mVf µÙì’‚åò^³«;;¬€”@V>Jdz Y mf¸Ü|cm‰#—ÿKkjíÿ}íZÒãK<‘ß·±ÿÃ!èw&ìuƒVSÏA«mÆ«YŒ^sM_ñ™ >ä'ç4Ø_¤JUyÑb~h\­­U7³'Bírš-fò$)q${í\ŸÆ€5¾„‰håI#ö§0S=d~BSôÏš}âÝ”Ae3??ÌìÓEäBoå íøè´„á9¡}ÙÉ'K¸‘® Ëä'7”yËkQ“¡óÏj{*Ór4•…üvÃwÅ,û£J;ö²û`2æqAäf’ÉOiþܳJOXdêvÔG¿er&ì¿‚ T±@^Ïò¼e€È÷TϪcûÄc­G¨çⸯ2Y繓 ñ´Oÿæ8ö7‚üÌó_"#ä-PÆþb<Ù Ê«#'xtͧ£”vi ò‚PFÀñÅ?k~°í^®MÏ…8%GîÞ±L§Yè÷É­ø3Èíò¬([X—±Bx¡34]ë{À§Lò2]‹çOL|‚y€`Û}Ìr5¿{ìØ‹€ÅzüÈšFsõ.ÒP•š›ËÍN¼qÄs&!y”,RX½F?ÿ³VƳ[â]‹åzu.Ÿ+ɉþú=Ýšíðéæ_O 3™h (zeSŸ×û\>ÄWs‡-ø‰ºtó8Ímr3ÔäæˆÃšÜœšÜpp“›3p“›cŽhrsÝä¨#šÜ‚e7¹sØa›Ü9â°òMnŽ(ßäæÖªÉP_ª ÇbJ‚ËwÜ8v5 oN«CÑ.ká­iyD.ßã®o‘+ÂîöWÜ®IílViÀªýù“ÇyÆ•u¾´©£qc™àòï·ìåê?q½Ì¶Ç:癓×IÿÉVî~’ðvú=«zÊ, È)ãº1f%·–ç}ÌÍÔâE%·°ÛÂÐae*¹uÀlj nq;* -+ n#ìÄ©FÑÐkXÎ÷²]© àï|ÌøeÊH^ÔgòLmž×‡0`5¢AÁu~^J¾ÒO#Ä”ã!9»itB-ˆ&éJÆyXÛŒÎ(Øà&K*EI°§ëéò'D“êšT—¤®ökW<ýÄ„ãz³«É½xÕ~©òa=ºA“Óùæõœ^tÓ¼ 1Õck2÷×e¬ SM;•¯×š:ƒ‹huÕ Š¢T0=Ô2ø†œð}¦ÄsEnhçms³º6ërFS^œ¨«V•Wÿ +iý,Tà|ç µrÚÀóbZûŸ_ä 2‘ÒìW…£”8*Y¢†¿)¼^Xm¢€áÕÛWÉø¯ ³¢Ö]w­¬È®’Áåoíæ8þ•ç|ϪݧtÆú-ôÆ‘|Äënž›ýK=7é¢Ë“Õt¶ÝÔžY§b¿žíȽP“<ñgý™u´EO3®TÊÉJ­R;¶7§ía?N¯|ƒ=8Q‹vaãÜÉfº¼ú{ôú±ñAˆ‡«æþþÁBëp\£¡:ÕG´êäÙW}×üR'õ½?|.èéa@ä8o^n¿kV²M×ÏæpÌØÒƒp$r˜ïH¶õID §:DbFćfàkÚq)o” w¿ð?FŠHû…óLšZœäX} §:™RŸb€¹ä©Dgvl#yÖ¦n5œêÕéÅ!b®‚ˆ*Õ%ÊSGC@­x2у3]¥ÑêOÕìt‡ûç.ÀãBÈùsçØgéö9X‰hÈ‘i‹Î§‹à• Ó¤;Ü2UQ‘UýŒ¡ç >[<ø {GIÁ¬t˜.ògGJfGv^|f [SÒl÷¨›™\`Ä­e?í^võÕb½XíWz|o·£ŸÎËõšÿåµð:´|uƒ˜êê<†oÀÛ¤<ä.švß–j¦ò¼Ôí¼ˆ{{ÿOÞ±|ÔM¾ì]ðN³?·;Ýù¯Þ¦›‘À=~8è÷Yš¬^yZ}q_îN 2ˈuCYúdg ]ý4{y 媮GÜß¼OÏ7Zê!W“×óíf1çýÙÉn±\ì´GM±= ¿Ü¯çË4ĵ4ÔNa8QÓÄÛ—ß kqo§ëxÿ §€Émði‹_y¼d-‹Óí\|Ö¿[|ã¹zµ¶.£¼R*ȯþµvƒ'ûc€ðbI,8ky¯ëô6Žù¹”³”7 h>mäʧ€<²ž«zõÂü1vñ8ô*^9rÇW™“6åê™G¸òHGWÛé*ý±Ù~ÏB>Œ–…7‡¬6îYû»Ô,6`øf;Kõy¾$*A0LGØk~(óíâßpì«l©´%Apu/²«}“.Ÿô˜£ÇƒO¸ñ‰-_Û,mlöæÓ ¯¨…øP€É[Öí-Ê=ÐTì2åû¹³Î·ÅÒmÛ£€=î³Ç&9çÍ@26±ô€ˆ|›n÷ìA[/îÙ;…"c-@Æ‚œLUo "CU¿hlgz‘·ÇL‰µJAù2£R 2øƒ¶Y§ëÉ'Oèׇ‹5ÉR ˆÐê]SæLlÙ6L¿‘†é7h˜~C†WÛ4½Œ[”±€JAÎÕ ÀDÀ˜]Ù†zh/µ??éa$!~?îÄ“ˇ_bÛýuJ…Bk~̇òk/ù]!A:“s4ìQ(&v… ¿tî(C&†ì*7äΧPóÒÒÐǡĜ6&ª›±©`ưJáM~¬·x‘,yÏøº9¸¥U@õH‘#¹]:ÕÀkm’¥Ý)ë=ï [arÎä5yS7øç>¨£¤¨N:ÆÆbV¶ '…}`¬ÑXâƒöë"0Wq¡<ïîJVƒ`,±á% ÃVÄB¢¥Á"J>´¯Xâ×շͲýÂGOC` f¡ÃË8QÚTQ«Na´GxðH}Žô`H¸|¼Ê®3,÷¹+F^e×] œF(¤EÊZ%KŽ,2º¬:ÃÚ (S\¨¨03åpÕ’°T ѤR@bLÂÕòcáøƒ%ÊJp3?i×|½çåi9`é$Ì‘Máß)A"L·°ëïá‡Ýh  ND4~T™ ÄÖd[äðË=È®¦å#ðqèùÅZ^ºóäʃ²Ê–ùÆt…/åË)ðêô‰I_E¥E¼Cmâ;í ê.LÆÌíf·Ù½>¥­|a‰vU¡WŠ•û ÈÂ{q{‹š(äx·e]››iÖKWßücc5ÈÅ /Ñ "š@dûgÌÊ<^ü›¬Tµ°tâܪO4¹ÃZ€‰šÜÒ;aOV§+²¿råôi¹yý}wî³Ð2e¦/sÛÍL ¶Q#_H®0éÄs°•ãœ{Uƒ)6DŸ¨Bs”F©Ä“üà(ñqc ¾ÕÇ0¬ Ž–Di'ž3¨¼ 눪L9_ç6ºqÃP"e¬®aÿ¹sD’ÍY“sQJŠk<Å“²Í~=0„SD’ÍÙíî&Å –€¿w»” }%™€_:Tû€‹€-»B†éòž¿pý+‰- €1‰ˆöç~‘Qoh) qÌ÷ßÔGü"W˜< ¢ÆdCz [ÑcÜ„w®¨qp.vì ΖñnOõ””˜Ë‹@–œ!k\náö©Ó6õ´K'ëÅ‹úÈšÂ@©xKTÞÂÊ[Þé ÍÓ,–­£xv²f^÷'j?ÉÖÂÛdÆ ’†Ór”ÚÄFnBw#öÆô=j ë‘øŽUWbGðŒu¼9µT4§æÀÍæa™í#TüZ›«ûWÒÍå×éÞÃuKè#C:ÚµØô¡Ü,”ªÚÚ…jG¬6gMl³m².¢¯˜°‚„â4’;5©O]Ðæ„¾l´ÕyôBîQôÆÌG§>7–Šb[©ÈS.íõ|ámÒ#¹D¡$ÈiÞÝ5f³ôi—ß™¸J†ˆÓ!–=å~Üaÿ‰gïÊ-–[9Þ±žÖêì¯K⑪ãI-Gq<µ=¯T¥Ù¨q«?]¥Ù“¿²ôha(œ˜#Û³ïæ•$?Pš_œàƒýVf)ƒº°¬šËi–ñ‡”ï H#â!‰åIÍÕ©-46Å9Ç™giÄÀ’ä¦p؇]&¡×+’ç„Äy½²ÄÐÛŠsŠó®ÿ²e/™Ëi¶˜É[»•C9ÄGmé" €<êïÍøÎG¢C¾~CêÀ'¡q²Ú/YO„Ÿ9¢V‘ï ^v/L‹¬·çÉjãðd­O/{÷ZŸ-.â^§?Ä™|U޼[/ÖL=ŽMóØú‚b[ón–Çž[*­Á¡¥}‰3­ ©qH J¤.Aqµø÷tWúÌúÿQ™PF'ÎYÝ¡} sÞßIµSÓSÕ©Sþ›—;’›3Ùµò6}`•0uƩ¿©ëznªf”k#• àüÐCÿéöîBË ÌFðê¿:ŸüøTõ·: áDüò|kÏé¶äQ³ü¯º¶¨KÀ<å j§ó0Ø®¯$X=L‡QÑuþ§äñ}ï³C‰È¬.$õÏ}jÿøAœÔÿÿ{¢žUþ=ç~+"¹ÑÝf¹y8š3ĺ1ä.âÜEƒ¹ñ‰8yJw|ÛÕ,äRâ”èSœ”{¨ç€¡ÆêZ9x×ì fÿƒï/,Ñ[l‰ l‘V´Š°Õ)iu ­N±Õiu­Î°Õ9iu­Î±Õiu­.°Õ{Òê=´z­>V Õlõ‘´ú­>b«O¤Õ'hõ YEdlD06"ŒÇFDÆFc#±‘±Á؈plDdlD06"ŒÇFDÆFc#±‘±Á؈plDdlD06"ŒÇÆ)§06Nqlœ’±q cãÇÆ)§06Nqlœ’±q cãÇÆ)§06Nqlœ’±q cãÇÆ)§06Nqlœ’±q cãÇÆ)§06Nqlœ’±q cãÇÆg06Îplœ‘±qcã ÇÆg06Îplœ‘±qcã ÇÆg06Îplœ‘±qcã ÇÆg06Îplœ‘±qcã ÇÆg06Îplœ‘±qcã ÇÆ9ç06Îqlœ“±qcãÇÆ9ç06Îqlœ“±qcãÇÆ9ç06Îqlœ“±qcãÇÆ9ç06Îqlœ“±qcãÇÆ9ç06Îqlœ“±qcãÇÆ06.pl\±qcãÇÆ06.pl\±qcãÇÆ06.pl\±qcãÇÆ06.pl\±qcãÇÆ06.pl\±qcãÇÆ{26ÞÃØxcã=ïal¼Ç±ñžŒ÷06ÞãØxOÆÆ{ïql¼'cã=Œ÷86Þ“±ñÆÆ{ïÉØxcã=Ž÷dl¼‡±ñÇÆ{26ÞÃØxcã=ïal¼Ç±ñŒ06>àØø@ÆÆpl| cãŒ86>±ñÆÆÈØøcãŽdl|€±ñÇÆ26>ÀØø€cã`l|À±ñŒ06>àØø@ÆÆpl|$cã#Œ86>’±ñÆÆGÉØøcã#Ždl|„±ñÇÆG26>ÂØøˆcã#al|ıñ‘Œ06>âØøHÆÆGql|$cã#Œ86>’±ñÆÆGŸÈØøcãŽOdl|‚±ñ ÇÆ'26>ÁØø„cãŸ`l|±ñ‰ŒO06>áØøDÆÆ'Ÿpl|"cãŒO86>‘±ñ ÆÆ'ŸÈØøcãŽOdl|‚±ñ ÅFDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ð¸hDŽ‹Fp\4Âã¢9.ÁqÑ‹Fä¸hÇE#<.‘ã¢ø¸è6åksvÉýb=O¼+när³}ÆW³ÌÁ2æwæË¿iLcô›Ú„ÛÔ†[¹þg§×Õdµ/‹Ýc züû?XN6| ±æa!—nƒõ>ÛÍS2›ÎÓwÖm£ßl£mO=bu€¥º‚€›vwG¼g†WABÌ5Äô­ÎU‡Ì‡«Åáê $2&ì•T­¢–ÐzüuØ&L¹H­¼eA£ÛFwBY ™4J»ùbËŠ´ÕwýF7ivÛ~rÕé¶Ý|Óªú·ðɼnzÏíC|ÙúŽC[Áx½ìô£¯I«3ò:1bu|i~ “N·Çí^2nŒ®Ûc†=z ê ½ÙhÞ´“ÛÆ¨Ã7=ö“-õÐãD@åÐ$ÍI<ôüD¬£ˆ8eùúWëɨ´ÚÃv¿EäÕ¯«+*¯xô†ìd‚«N_üº„WOypAºÊLY'Jô•ü"~u†Å·£t0^%bQá8…â-Œö]³;iµ“«Ñ —4ð&š¤’ÚëÞJ5ÐNoØí4;cýË&¾Týøj0ò‡c±™úæ§Pee0·[ÁgÖVÊÝ TUþXÑnŽ£ñÄzôÚ¸ôQûzÒmŒ’öÝpÔŽãÞ«¾„:öåÊ¡Ëq{4 ØKt2b5)¶^ç_1í”6ÐnirŽCe »âlxÓnã²Ýõÿ˜R$©òo`Öé.Œ[I¡¬T ª/ €95E·ù 1‰ÇÖ~›„ІÁ4ƒë5š£?GR¤ZCâoc6lŒÚýq~«_½[I} g¥èhÂò×mLúÍ›DÕ”^®GO¢=‚N¿F]5Ûz™BÿÕ Á\ÉÅòT“Q³M6sŒX58ók€˜\Å1VQ(”p¢½ãÇ‘2³q;&ªj!Qí^þ'¶ÉßWT 8Z†…’ܸ8&È ËáöžÕÒó´ñnãäº;¸dÕZÌŠž×hÃó–¹û;”4Qžü:¿(¥_ƒ`í¹ý Ò=Sñ{gUÓh<2ÁoL™ri©å~¬t‰~ø¶|Çš3ƒ/IkÂq[=¾d#¢ØDuV‚:Àýd<¸n÷õ„^“¡ß©GQ¹òH\Êsr5è¶Ú£  ¬Š`vÓ4Ë݇­h\Ø×AÉûpU±“Ð}Œš%ïÃV4.l v0é”t`+¶Ä8P}®I«‘|î¾°r»1f/,“Ú¨çŠww¸s”‘7Gê8;ÀUÈQ›ÑÀójÁbˆã×Ñj_N®ó®oÃß¶£u7Ε˜¿$ZáRp´ÚN6Üv³ÛÆmÖ{`¬¤©*Lž1kšù½ب^dX‰ÊA?pw^MŸ·¾s—ý…g+)rŸ,:%é6úדÆu5×ÂØ<ÙpYož¥w.G|¬jÂnŠý}vš ã¿‹Úó$ vüþü@ÇÚ€v¬5ÂŽï¾å»â{¾+qÓƒa»·’Ûöˆw¦}#Í%íˆ|¸Š&7ì¥ÛfÏþ`”tâ¤7éŽ;To9¨­¶j¡ÄÀŸléYõ-MHj+”˜ôÇG#¿6»Ä£C){½åRã¬Ã0¬Ì©þ£«¢‡`šÁý6¸d æAןÙ\*!ù¥±çç\ð'µB&ý–‚Ut'¦ypýÁ¸ 2W³°y:@ÚbPÑŒ‘…`¤¶rD‰¿Q›È%,J‘½-†íѸCF@_u¥iàµÄ¡W0ÆàXùÇüjá1ÛÆ;ÆàS 1äú½v“o2¤p:ɰäïœ4FÍ›Î- ±^ãkrÙNâ›Æ¨-êB¿ƒb3Õõ.Ôs²¼1K9!o.ž yŒÅeïʧ<ùŒWþâß «YL‚¡Ü5Ymœ´{qÒ¾ºâ½ðÛv2ì6Æ|p5›zþ' ØLú,Ö“Yá3Äïš¼bÕwüy<²›f÷ÞœxZœ!eÕ ÷ _ý6{å&öÏ—QgÜy²T¡KäxaõL¯ÑgmÜ?W‚ä<ÑaêñŒR¥ä(CŽÐï‹Å}r€;Kßñhɧ_:wI£Ù ùQ*­’$-»׸ŒYóß3\dªS­®Œ©êÆSãò® îþ£Áy¥Ì{í< ‚{û6¯ÌÔ©_­`æÔoDµ:ƒÚeçMäªÛ¸ÞˆPÀ`‘ä]~þ•+ßÝ%q“/5`ífÖxøZ§„ž"{$9žuPÛ#¾¨apéØtUô¤,JÌyj7Kî«×ðâ°ÚS¥90ÖdSkq- 5é9XõD<ëm õZôr¦pÓn°×˜dOýîWÄÖÑ‹pjŽ,3ÓëW+˜èeFŸÛí!ˆh÷½s»Ž†$â´FL\æwÞRˆä ‚ßLÊ´¡¼2¦ƒ¦vÈ”©ºÊM{æ ¾KTÇ" ‘Õ|‚Ñ'ÌýÈ'€\¦âhH*N³aƒÉxè{Ï9¦ÒrXü¹3LÔØ¹åj‚ ¤¸˜Þ Ä0¹…a).fÔ cFMÃR\ {-1LnaX ư.ÇØ7 bÉF¥` «atõ-Ÿð˜$ºªî ±Ÿ {±®_à%§ú¨šÖÞ¼rãðkïrÐ%ŠXÉô¤ª¼2¦?÷;Ùí~³ÃÇ |YZUýBÛO§qÝÄãN³Ð¥‰¼X²Ü‰,%ÿD «~ŽIÈ·¼E2üšŒüõΛ{µòùC+y÷l˜ì¦ë)Þî›T2X™ü‹JÿrY±w_{|=„#'Ø®bÎwE„‡PÝì×ôùpjæ[³d«ÓOnãÎáÀÒÊáV:ÚzLjlW1Ç»"è!nÇÞ5½Xl&™Ub܈‡špA«’HnÀÄø (yüËÙ9v 5moPæu2}:d¤:z®-ñàÉ®¥bCq÷À¤óèn˜'TlžHôðT@´-½#'AmÛ‹-÷9­´i \:úŽSGÃãÖ»VÝѰÑfñ:RÕ‹]J”RµñHýŒƒ®œuZ”¤““Q*DÞ5zÝP)äò•§ä˜/£oÝ‹Ú͇rµõ0HÉ1j€íN­“ÑBåŒÒECuŽÔr%Òãñ¨s9ûûH^EèÄYºx¬gæ‹oǧ }ùäÒá.ÍvïX.øºú±ÞË££FeP d}ÌäªÑé–k]Ÿ-ŽX—hìÇr‰ÒˆÇÀ„ê A¡^z:ER¬V ÆJŠWóvÿ¶3ô{¾VŒ­ çÃó?'‘_áí– ¶ãI;^æe–g‡”ÕXˆ_}uîÄzùa‹§±ëÕÒSÊ8Õ‡µŸtFÔ/è¨Y`ì#³vOav…ŽÅiH m™;¸!„½v#fD:º€‚R0 €3lÄq韛PÖ“©^!ô%GÄ#â†\Ïšêk$i\‰ÁÕ¯°\Ï‚æé®òP݈uô\+LC@¸d$"%D‰>&ë{|. r‹Ç“ mÒgQÉZDmäzºS_ˆèÛ—"BŒ£Hi°ç‰ áiJxµ=OXÖ™h³¶ Ÿ¦„j®R^¸¶,¢Æ¼±Ü7o‚¨ˆ˜PàáÇk>ü}=j°ßqÈ~„A+ìÇc€ýyh¿Þö*¥èõcZªÂìK§Û 4r±j êKHŒ>³þgàË ¿š"ÚÉŠü°+ûÉ(­Züɨ°íÜñ(ç 5ìîä°áÆ«ªÜxeÀM·ÓˆóÅ'~“s,õªæQ’/âŽC4Ÿ>þÏ£àz•eÇ» cßÔ>­Š}a™ë¦}Çjé1º º0joÒ]´øF^<„áì= }Ð w\=‹>hz:JÈ_Wüç¹êÜé@ÓÓ}ëP€ -¨t,Ëü\X /Ф~®Ð¢ON`Õ§Öö­“2´ÎÓ±,s›X ¯¥n3´Õ£XŒ µã6ïßiQŠÖg­@b6vÂbÿÆNBG¼¦FdSÈÁFN2ÁK‘o‰WS¨:l ³Ý|é0q§ù@†x…“@ëC‡^… ×¢òr•INIö[DPK‘ñ¿m³ÀzJŸDÙ‹*¹>{ õýüãËd4éóÑ:/›ÐÍWû„È+†Ÿª[Ö\ñÁÆËÁ Kùòk›5Ë^q¿þ¤w)†VïÊ{56ßF©dˆG§À¦D:ý‚›è<ÃM5¥h…>¡W°DŸ° uª/Ò‡ò³iŸ’µX}6ô½ë{ rí?Ô ½Ùʯþ‡ÚÃÖ%Ý㳕0S§ÒÐ2¿œ¥ëwøÍ¸J©®zÈÀõJwÙCZeo8Øu*Òñ¥1âßX'8iFƒQ0¶2ölK¡31´T4TàªI:÷þ¡=n5àûvÝ…ÀJÅ‚ªT âXÞ¿voÒõ.¨ 誂ñ '¾—ˆ›³Š®C5ÅwÒ-tsš~ªWI¬ !U Gf¹É›ì6‰ñª1.sWxp…–'^ÅÝ•sä¨?ŽÌr3—tb)–ÄrÀ'ñ»·ü•uÛá¯ßÀta@¸ó+Ø^eƒNoàp‡¡,±Äm>$Å›¥JÏ«œyå¶Ëq£ß¢î‘«$‚XoDªzèöÂ#n{wWøü!óž÷écéò£<þö y@ÇA"I ÔþE/;ù…‹~õºˆ‰9l¬â`c8‡Óã¼ØŒ)b©"Ðz>²· ¿Ê¤‹>ËÌí‚ÏP@÷©©…OÓEû‰ÂÂ}üCÁ=Ûwì»ß²wKÞkèNå2¡–Ò€;i9­9Þ¬êy‚4ÀæÊ: ²ò¯`À" zL@?_‚K)x½ŽÚ½Á¸]дè;^mä•¥Ñï% Ï©:PÔ§+%¾Ý «£EÇä'|‚¡½Ä°T¥Ð^çŽ>«“îXN}㑺Ç’—qê?ZeÀÓwVëéô“ÅG9Ô¤(¡«½z…Ž'²Á䈈{È:qû”0O§:ÐÀ^T^-„µ÷³ÇM¼ÛòóV¼À\¬HùµA»q‘ZzöÙ²`­bÕ#žšÃ<Òp79ý¦ i)K˯_Õ Ör5Qgj)½Ÿ…xHøðŸØ±:Í`´„Þ0# èæ†ØèÃU¡wú€º¦×hGPÊØ…-uöñ«…7á6fCúCLBÏÞ$ÑúöRXÝÄbÄÿzÄ?2o ý µ-E¶“1—×8à+ÿ!eãÅ'Îú“ݦç/r%S(ya,o1ߟ×k©djŸy,Ûê{e¢yäh§ܳ‰ô/k+9<§3©dTOÚˆ õ MZ\ÀˆmHì£Þî-ƒDçæøŠÀÂWGKqídÌ-èubCôõçÆ5N™ÿ.2²Õ)œšÁݲºŽKwÏldøZÃÒ±Èö7¹@üd—a¢Ô±ˆ2‘$†ÚP~U/ßÓJÊ5˜˜¬ll% ®Rih©ìc]¿‹ð ð“uÔºû±V§šç…VŽ¿Úù(YAã’¹*,&³\Þ¥¼”•/CµòQ¾˜hã’¹:¤˜ˆ&UA†Š¢É£zT1•ˆ&Ÿvùb]3ùÖúzPÖ a8[Pó° SdûòÙ Ü 0têhÙ>ö0ª#*w³X™ðº ÑÅ(~oäj–‹<=„.u+¶6å¨èfèq"WÍãÃ+ÊerŸ‚ÚC)YX•JCK•Öõ»•M™_Ùû“¿ï?nè—-øYCKÖ‘Ä:ËÔUr<¹*`I Ä’I€UbQB¯`“QiUb™°m0½ 8_ºÛî nÛ Ü2…^\d„RZžL{ôà,u «ÆË‘±¾ÇV€^õ[¢ì!A pâ%¥Bù.ZöOjû|z?0*eÀ-l¿ÁE±®Zp¥*­NyuW¯º:åŠ×» •{ý•X´Aj;þ¨…F¥hˆË«iûñ{yÅ|»ÍÛö¨sõµ¼7cðk”|9(_I,lï·ix罺"§PÕöe´›Ò÷ç?Ζ–“. ºR„²×¯ãDh¨¬äSÙ„]+¥Ò9 ·û;À¶TŽð.z¹Ê=uØ/ó¹bQ7³È7£þ ŠÊÙÙ ½¹)·Ä$dàø,3Ÿ„ˆI˜"oJËv¡’½\ôïÏ2mèx'5­ •=M¼È ìiâEœ`¿â/8M\pqþ• ‹K~Ä”?EåÑ#âa31SX©Y¯¦ráù}„ú;ŽšKwz>\&&³'ò _ºáÓl‘ñ¡X#îò)á³Ùð¡]Hß{¬–£aáÌZHÓ©;Â`GÝòâÈKjGŇÀ†ŠBÖ¿Nšâßq§õ•°G:ê ~ý+H&™z‡.&ò½UƉcDxuôìlèMäÁgís[»´¥¶£á¥6?øJcU¢Këú6×¶lV7ßO;×,˜¸µtÐ7y+ôõ«âËMcœ|Lxg˜¦û´‘Ÿ‚å‘?_¥~EKù±d–‹à”4Ò@PwZé†ç¥ýª^¾gnZXßvâÎe§Ë‡¢ù®‘í@Ð8ªÈ‘#ŽÔ¦¥>*¤”UDH‹…Þö6aמ·¼¥J‹zô¼¾ðð¨GxÀÍ9ä>¹ï–Tðçyt4%bb°ëö\ýýU˜*FØÅ)ˆ…H£êÂÌvSЀöw鎯Ðß31Y_2›´pXZ6øÍKOp†ç5‹§3™Å,5yyÀœå¡S•…3”¥&&œ,; yØìc‰ñߨ 5Öb ;ð“ÔôY¾%ØHßç)x½~¥t 5O_­ÓHËàÇžA‹€Ïä•bÿL¡ÑwLÆ?#RÕN:|Ï+Ö^»ùUÜ‘ùÝÈc=K:‚Ê®+(µœ7.m-€'š’¡ ùÐwP|¤}“í9ö^£y3Hô#²ñZÉÐÏУ¯“ш¥•ð‡5‘',B>øI~:þÏÞ%³šðj°ú/c²Ç:ÎÌÇåüùô‘KŸ‚㕞÷„ ˆkÍzöýI£ËêÔF«Õno~Ð×nHèu˜Xk2C ­®}ºrÏÃß6å U¢HùGü) |%´P®C*–ï2ø'rƒ²Ëaú¸S^¥c-Îñ¬ÉÉW¶ÈÏÄ‚‹ ]Ãö§Áåo%>ìw´òã7©Ïû•(Ø·tÓíÉ[‚p_žRöúðôæ¹F™Bñ Y ÅÅá) ¢((ˆP1 A޾·‹+.¯¦râ¬Ö,þLÂÑRl;9À U”2áÅSýM8cÞ±ˆ’cÔØCxÌaØT[²J®1n'¬Rvc¢ÄImu‚ %ÆþøFMLï¶Ñí´H7PÉÐa*€†¶ÃÛ€¹Û•ÙöË»ÝW`›¯ÒÛ{ÑÛz…·ó:t¯Âí»JnÛuØTrÁr‰icþ]i>7Gá˜òdëå>l —›Š¦& CÓήŒU¥|Aã–ô,(‡@ù¦æ á"K{u%».UÔŽZŽ tç–W6¬¢‘0 âârýzR~q~È@SÐ@ŽÉzU NMV’tú]~ÐKrÓi±ÊÉÏ¢´1Þ€>øÊ«™ŸÝîŠ1*|ÍÊImeEy°õr¾-Ò“Æèz¿‘ŠËú1¤G£â÷<¼›Öuý¹gz[Ö%N0-²p½6jñçñîI|-€oJû–ûãµMQüjRz߇ ŒgJÃç˜õÆÛ#Ö:à»( “mz¿ž®ÒdܸNvÓþwA> íílaƒ_”ůÂäeók0§qÙ,Ťï8ì€=ïâèni_À†v ”‚9ÐYÖ»Ö'=›‚öù“í“¡ú¸À)V¶=b©ÏÙA{L›Ù(Þi’ë;IãKcD?eZÁàu ÉÍ`’Ïí¯ÌYñc­‰“}\=zÄ_9qéÚ>Ðçi4`ÅÇ¿6šíOH×ö„„>OÏÓíbúm™8Ñj6ÿ-À‘ÜŒ¨¿ýÚ¹+¿Øñ§c}܈?‡½Â¬ˆeà iê3ÛR–Á aU"OêÌœëáD¨Še­ôçOåL=¹"u‹³%Ú/I³1äkœ‹*õ2æáì¹úÅYŒoÄÔè‘…çX‡3訓ù OÓQÊ^:¬î¿º>WžÞ R¸žðz¬2hû‚ÚoPLøË—3‚ißb¿>+ŸZ8åâ(Ó^±í©^“x<{¦,=Ù TÉ<ñ_IýdíµSy7¶R8|iñe©H· hßZ£Àñ¸AìCj\r1áOý(´8m _[¥¤ï’qç5+‘‹PÄMúòtÇVrÙ¾iÜv“Ñ!e4÷d-¨LK]1ãÐ̆ µÜšŽ°‰'?UHï_|/µvpÇ1V°½Þ5K_± dë4ˆ·cêEÎEÚœÿ}òôZ_mæ‹õ<}&Ëé·t)ŒŒ@}Gðº{ܬk½Í|¿Lk.8ùsW›îw›óƒŒWÓõ~º|7[M¿§õ?w?}ˆ¿ý¹«kuµó°&lg¸:'Œš9a¿8ˆÀÕÕNÄ'îÓíkí»×ͬ¶MÙŽ% Úl³bÀ¹Ä%›l—d¯Ù.]%‹õýf»šî›µòÀqu…«ç¸ß…—/–éAJ÷ITºOðÒ}‚F|ĉ ¥û$*Ý'xé>AJ÷ITºOðÒ}‚”tŸà¥û)Ý'Qé>ÁK÷ RºO¢Ò}‚—näjF¿–È¥Œ®$~!‘ë]Fü*"1º†ø%D®`tñë‡<¢gþh@ž у{.ôò(ƒW!·9bþçªl¾7´º’Ö4kܳÆm¢ÛûM7¤Xš§#é4_îonŸ`ÈÐ"G6ÕPK6Sàéÿ·fÓ춨R)îÍþî@Ô‘••düass|Üomm¬K×U(Ç}ºªÓšµZu|±ßíŽë?6Ï­û=>ŒnÚóßo6£nŒx&®æôEߌ}âØ+“pâŽÏtÂF7BªŒ‘‹¤C~j ÕÉý—¦·êì_U›mÜ~¸¹=R—ü÷ÇíýmfuWÛfÛ,ã>KåÒ—6}ÖZÝõÝæËFýxnÿZ6G¸ôlÔ­»¿¥zâXÇ/·ûíI†ö`Õ¿UM4]T³zÃßË÷¼±áÙ›S›à‹ÃæfÕ÷í17?ÑÆ—ªØµX“ïN•_Øþõ|Q¿žÛ?ºæ¥å{Þd÷ðaûQ÷l:6¨T¾¨ ­²l™vœ `«\7û¿yxVkÎå{nûR•£¾¦pŽÚqåQ1þø¸½Û|ÿxØìÇÛ‡ãf¯J¢ÒõžÞÿpil÷ij—þÔ¤¿l¿8|Ú}ÝFÿ{Pþw¿ÿïæöhJÒ=ÿkÔÔñÍa¬©cK[jí’¾­ËŨ´Iõ½qØ=îo7#ýØ4ýGõ{ÚP¿ÕÔ^:›Â˜:÷áûà_©«/ªnsÿ¹Ù§ÝÏ»,abëîd„\ [ƾûôÝöïò`3Ž?©«äÄ_þgԸग{ñøðô…-·ÿT¸j³u [Ìßó¹°Ëöw|àë’Ýo>ÞÜþõ¼\_îTcÕÝîÝÃý_|Ã쟣•!]ZR©HQõÿû-Ö]@¥rĺ úœš®iÂ&õܕΚÔrÿ¼¹ܬ»¾¹'·Nl×\w-…g$sÇ÷››ýæá–¬åÅ·¹e=vÛ&W'ÞëT¾ÏÓª Wí‰c¶oÆýÃc.—áH±0âXúÏžsZV³hé˜8fyî³FXu˨}´™Û`wÀјk˜£\¦øpŸw’M.às6×Ï­ÿô8óì]¾ÎNͤO=½nŠE¿\ l#µ=ê4*11º&»qÚ ƒº™.zGÊ’0E`PÈIíÖËd† ÝÁ$cqÅÌ-‘Û_úÿF_³4¯Ûm3š9:ˆ!‘¨¡e!Q_ Ô² òê9¹²Ü‰ä×!T£š\H Ì®ŽS©Õ«¦×PLBÇp™y2î™Â26FÉ,òr!”ÑPLFÇP™Úì:Žì1&&Ò 3‘_Mrñ¯ªC¢};_IJˆBAéÕa,ïÛ¬B·R ÅCʺ‹çïßÛì2[ÃËÉʰvÁ´õ»óÒÌdzõ&äJ< º%0‘sÄß ÅôD}ú”š¾#òê ¢ô3½ï °hü "¢ )Czõ—É…žÎq¡»o²s¡¡”ˆJ‘2CÀ¢Cx¼v9 "ë0Œ2£g6)¯ëõ<»èyhHÏ zfâŒLÌ@%ãdÚžâIûh”¼Ã¬TM#yi$¥c©ë|¢'šec¤§˜p Ñ„:ЫžëºqÝäK‰º•}ªjöú™•‹¼ÿaIÄèÀáVfÉ\~ KÚX"³\ºmå¸Û‰ ÌôÒª½¨Ú·î\V´Ĉ$!H¢MÊ„òäB¿_©í„”PÆHå¥ë‡1%fúåì“ÜçRú|æ?Ÿ)._Ò9._FI._&YVMyž/ÖªÎs^,  E„@D`ÂˬÊf³p¯ ‰µ1LF/1á6¦–“ é…™P¯øÓ²–(;$$çBƼœ0¹çå$Ω§uÁÈv­D½ÞYngÖ|~ˆhB0̇-BºS¯aêÄ R˜0<ûC‚Þüw„?Ï&Uiö%œ¢‡†ä¼0ª§þ+èKÑ ^Æôô[mn Å£!=/ŒéUù,»Ê§l‡ý8$YM¸ŸBĉõŒH)/{!P`ÊžFÈʇ„dˆû¿*¸‹³*’‹£'{ÂHùÅ Á€sq4Bvq<$$C_œvGl]¬%B>Róã±äi6y÷^µ‰êp§hBaøÂ$Ñ.z1ºg« ÝÑ$)¼Ž Òz;Aá ó’·™„G@Ô<,¬›4¬˜¥ú(’”nõ )Ð챑÷EsÑmÐgvìbn0ÎJeA˜À‡¬<¤ÆXRÌ7O³H}âÎ `võF[V‚.'(…aD¯X ÑóÑ€ž†õ–fã"©^€Nõ‚p¢w¦·÷n˜[Õ‚ìÝÑ$©Þk}yV¯õÞl³Œzž&Ø@"¦Jë_“ÙU<̨$YT5ætVNÞÕ}M¼ zû`B "áüÊ4—ÌÀ•þZË`¹ˆ 9S/­Ü<™í Ëœ™ëÇñTrVêïBÙù¢¬›bBëEØP, ÂJúÏxã˜j´‘T Ù F„)í^H)ÒŸ“—/ 3ö¸(o@³õú|±"ëí TiƒœÒÕÕ©«+JëêŠ;óF.¦À„˜Š"bkn;ê4Àˆb…ïå°¥ÆÐÞ¾–¤·×keê‰TUdç-F¼Ä˜T>ÞÙŒ~Ì$èP4 Ãzk½?6ÝÖ¾J{%ÛX"¡7Àä:“——½ªC.&y ÙK'Á™‚!-|ܦjª;ð@ˆC’²ŠCŒeˆjƒŠÖ“l±>Ó] f«vN&†Çbq”¼»ËV³Föa)‡ŠqãÛ­’AÚ®í¬¬bÑíRÉLC¡&Á´u_± ÁÁ!U?žHvýV³ì4'[J14Šb©ŒÝÙå¬XL»}KÝdÔE´ýõ@jhÀþâÅŒéñî!ǺÇI™•˜h?jšŒuÉÿB< IµñÉ¡"ÌO µ‡ÝÎàäìˆdìŽ"Iãݾy…˜ÈÅ¡¶à¥h/s4ö”OfŲö6L3{MMç„®$R·’åú¾X0ëÌÕZÝ#oˆ¯Iº ¡˜§vð+Û#  !n¯Ö:_LÊ)Ý“Œr ù„9à k„„Ô°Â8-$°>,ÈîORÛM‘ì¼bòŽÀ }Iôgo.%A‘(˨¦v7G½EâÍUgµ~jˆ!$.»p.<Æ Ü` ÂA½:£ëÉ Q´AVi­G[ ‘3Rsý‹†ü KçÝÜ«v-€|rQ²`ZjÆVÚmäÎfÙ9s£h$Ä8þc, DÑ®H.õ‹(šá Mäà Y3C]°ò°ªY˜¡­‚º"Aßn*ƒD{Qv•ñ*?/ê†ü ‚“ 11Ü@ž×nª¬­«ßv#d¨„`~­³S¥} Ñ•AŠ—ê#ÀØizu³Øùèë…PÀöN0ƒú#d"ч@ IS#& hÃÂDÛKéÖ…ÑsÏÙ7ML  HÒRAÊ·RUPdA<ªJQõàh«Eìt˜è&P¸}dè¶9§éc9?H+ zürTÜÿ(ŽñnÆÜ3Ü!(“…ôªï§z˲uœ„: P¤ õø5Ýl5óI '¡&cÂŽ¨¯çºêQË}„<ÂJ$ÝÔú%l­Ó­(‚…: a¼²šæÕ †Aë©íF¯Ïgåi6“ê‡,ÔC#}èˆú÷e¿°I}„,ÔG}èÅθ‰÷!0Që"´€©3¦,\:€I|ðCŒçpAÝ­èñ8&òQ•çªÞ5Ô‡e±>, ôa¾³¸Ž§nKmQ‰Ä™‰ÊxæƒÑèu¯Ù!²‰P÷P¨‰a•»”Ê ªw6´>q@}Q%JŸ‰ ‰ö@>+½õžòc@¨ !ËÙzÊM’Ö6 lb«œ1µ$Ì‘$‘¤¹ ¶TÑFj÷)j¾š5E4R_P–ðA'0ëäëi\ñ €°2Xtv{½ù‹?4Ϩ»L@½bT}³¢  `ˆ`„u/¢\U£ I&ôÊU3@¯E#zm˜Ð[ÍrÑì$Œ‚(L^½/\—¼@¸C’}4“ô2‚ý‹hÏb°/¾Å$—¤îÀ FÅÅ–³¬Ñ¿‘X †ÅÚ(.¦‡\×y#ÒrXXÊ¥‹Út:ØoµçU¹Zrã\1J ‹`yÓnëÖ ²Í9JÂÂ@¤Êõxá$Vìóza’!§Þãé Rpê‰Õ‡O}±:îæÔÃÆ!‚ôöPœëB/ñ'œ •`ýüIR# ±>–TG£I}XœQêÇ$cJA<&†Ž+½(ç²—Z t‚H* çࡻĠ0q{LŠmfB’„ÁÞñY±X]q (IiŽ‚Iër–UEÍ¥u°$±;§6­6³A¥‰Ía"/÷¼‰¡ˆølñã’(A<&ˆ®>éƒøMSD6ÈjQ°eJc’Üú ˜ñ}±ø÷ —Ò€’œæhœ´8_”Û·ã¡ü´Þa,¯éç¦ïÁJMÄææ[zø±Òƒð$`TÙ/¯ žP…¿³¶3ûÚ‰=ô—(¦až…^,š¼:ËÈ =GeœXÌ–7Áq}š«šºÄPJ‚¬¤(‰‰vxþ“Ì„dÎTˆÆÌq¿= ‚¿·n8`;B•Ü…¾mÌkƒ&†ò’3ÔÏ&XæÕ¼¨¹ú ˆOÙ ˜Ë¹zAÑß9"$¤ìB˜†`ý4jÑ4n¥4qç8Þ'Nw…‡Q3.­ÈfÅo¹^–Nп%âãvæ²ÊçåeøA¥bw4ò†aQ[R¨ ›ÝôTëÏìë!Z! Ua©· WÛGÃì5âCmªšZætU¹­¡æÅoÜ lŠ–x@pC¬ðë¶ÔÚ±^”uwGÕü´XmZxâ‰d½œ¸iR¢†-ˆD!¥ÊW0¦‡T5B_‡jeçà×ôs >‘Œ±êÛòt½,éµP:ŒŸ½;ˆelG ·P(Ceô“D¢¡q € Ù“Yz©„ê&¨ØÄ;=ɬFÈ i¾\5ij t¢EÏ2 X¶fôê̳ɽöM Ö3S,p¬Ð[ "y"Cp% ÉË>€HžÈü`²yÝ.ÙROf]hH;Š“*WÅJªhÑ„¢ŠgªšX_H-šP´PñôºÉÙñPꃠŠ]5¶)¦×œJTú £Ò΂0£¬™æ G%}$hØ?e>ÀA’È4ù€ÇTT,¡UQ#~%—ªH%O3ô"À$¶@i?Ý2½’M£8*å*EÓÆÎTã­Ñû†\fU‘-±­˜H™Š±´¥·‹¾CÜM™e«ÅäBþë”h‹a¤KUu’Ÿ§…“²A‹öÛÒf9sTÊLЦUÙbVœŠÍX8eÀ"hQö:§DáOèaþkˆ§d‘o>`ž®[a¨Ž(pÒa)Këò”YF@ãâ+.—ê9yÇj9¤âBX~Õké5 ή#prSñ‹æ+²R †p줔ڀ§Dùš¬)&C/E@"\8ІhPG„ñWÐÁŒ0HU¬ÙäâæÐ÷ @œ9ß3øÞÀ‹‰ }}Inv:L`uÁ9ê^.3)W&k ¨ ‰rBN²ÇÓ’Ü ÊI-Fe^¨2û[^å3™VG{ˆHwÀ‰F$îô$Ïê\&ïÀ¨¬‹órNÙgp‚“Õk|©ÒW,ÎJ±¾Ç¡x0±‡a"& Ýà—Å 9‘¿v`!ÁÀÒsU1™ ^)šåB†8íÍ|“{б˜H¹Š±Ký,Œ'›S°6A–À°­ô 6ÙÑXc6ãnüû‹¬Y_—+ýÁ•up  ôÐwòûv8ðÁf içD•%j§ïçôܘ€ ÷™´Y 5;WÕñz° +1äÁ)oï+ÝãÏÎ(Â(¸%5 ÷/x‚ M“ÑHÔŒlŸRŽˆ»•öYì”U­wqË6‹ÔfÇþâ°¿r´®WKݱÏ÷ëñ¹ìi¸ßöñcvd”–ã”…ùJ€'ƒMHôEÒ²’…“'>E¸á%drvÄ¥Ì>°<39z•”iÿu./N s–A'nË´®&Íyˆñ€z u»qaüç ¨yQP¨.̶[’Ïhò¢´°“<ÆS’T'¹n…—gëiÖdëeSñ²T °¨ëhž—ò¦Ì‚,€@Ø ?‡,ÀAjÈ<²€'íÇŒñ„Ù‡ÙžÐx¥¸”iãµ#ˆÛ\)ƒòA·´†Líƒ ”66½Ïn\Ônu] ¯ùïo N0‰ôÀfÓ¢5åŒ^6#¿(lIœ¼Ea&lgŠQ Ü6¦Nð€fJÌàßÚ‰TôqéA£Àý[!‰±˜\õ0ýQù™¬>Ÿ€C­8ŠˆÙý7ô<}ó©ŽŒ€h„ …Ûñ÷t—Ì@¥{¬=dFÂHµÙ¹\Oió š»Ú¹ÏjâjÝ>©Y«9Ýt<ÙK¡$V (ßEÍæ7‚ÍÕ Vb†>®å²M/lÌiÇSMx¾í>¬ÙN·Ø%Mõ'µÒE ôA-óg6ʶǟØ׬:×ÕµÜgÇNp¶Bb$AP Q5ä} &îc@yéWŠ›’ß$’nv Ì U×àЦy6)ë«5»òy€óu‚’›èÀÜà”Àyö¶” ´ par/f'Y”Ó‡…¹ß¡Ënγ¥›vŸOÛQ(lM'…²) «ϳFý&åŠÒæ¡B¡î0œ÷ÍùæûåpyUÌWsÕì¨CU¥cÊÈÕ@H¢m§;ë ÙäWäU ‘Vb4T¹|/2pBÍÄ1Éb1Í’³²@HÆF0Yy¾žå—ähž ÉtÁDélÂÕKZH×KÒ W.l׆äé‚P9ÈËžh>."žhvÙ?áî9:PJÃ=Ác%1êøcÍÈ÷a˜RCàˆˆð;„<÷VîQ€øN®/'Å4_W«›<‚ Q ’éÆ-ÚÅIõCœ]é”äÅP èFYmйd]sžhGñXr‘7U 6q?©9fáÖuìAI>píÆE±x›µ½t¦_‹ªŠQA“È—kÙ¸Ÿ*÷ ƒ 4ˆH…ÍÀM±Põl®¾›‚CÁ8 ˆ¹•ÀΪrÞUùhEˆÉBX»<}+ÞK=ÁúzIQ|¸Š€ öé* K>•`BýX¢qòKI\Hæ2J/"z É 8øòñOtéôBTv—ƒìŠVô‘‘”J4ì‚#í®ÔùbB÷>‚ø@$ªªÉ+]¼4ÁjqRRNfåµY؇*âcÅ©ª'^‹ŸÑr¨XÁŽó.3³ŒÛ¬¨î­C}…8–Êè¶*_Mp¡€H²«]mº)ôˆõ<Ö#7ÈB€rU 90;׋ËlFމ¡±žKd¦§C>XBð@ˆK$ù6 Áâ  ­’n0Žz麂 Ú…uɬeGÑ/.±RΊÉu¿èÝ|¹Pÿ¡L€„@>Aü¢!¿"Òº”˜ê•T:"Ò“®‹ÆNbmÅzÁ?r”@@‰Ñ2¥Èú¤Ä¤®×‘OÜÃÂÌýq µy]NózRKfù1 ÅaLO/÷¼ÔA«j&ôá¢Ç$ù}²"$$„쇅ù/Î0PD¾7·(î)ãÁ ð)âbîÿÇfGùE„hô/>ðWîCYåW›`Ë­1w¢)—¶g³Å×c) ò“¢0‚ªLˆ„ä°êL¶]äJOèY«ª;F‡¨j<©ªœª©ç P5xJÕ8Õæ}ž½ jð”ªĪìRéâðb®ym/zsûÇÍÇÍâæó†’`¨8„ýÅ'5¦y·K I¥ûIÝG ê‡à‚¤~ ÍnûT¢1J¨ c¤ò|…šaJÌ k[—°Û2mÀêëÆ±D&ÜW<_èyMnÁ/êN“¼Àdܰ® žP‡»ZÁ½Õåªé¸€ªŠ>chPÿŒ@øŽ“u¼\£¹ïF SjüŽž`Gâƒo?H ‹}dƒ8-)-ó—DJ¼fr©Wäf„¸@Ä$ÙßKó¹aÊŽÒ‰¡FeÚu”í*ö®ôšS„Y‰8 #}ˆN]°<Òbê×b1 ÆÅt|&ðØùEô*™=(HÚM’6Ù¹îœá°0HDou'‘NŠäR£Ê? <¡Š<Zì}˜¢AEâ}˜BïC”ĨãïC4#û¢™RCð <ÁŽÄ(¿:éÚ²úu¢÷lЫª7ê‡B– œ˜Àaœ+×b^M•çÜ$\ÊSN-õÔ±ÚÌ£2›`Ò >tUöcð¡ ùÈå Ö¯@nlõú6Ì,^ïàìÐÒõìréîqðÆqn¨B¶\Ú‘Ç\7ˆOe"¢*޼ĪôVÎ$Û7-zÄ.jBô•åÒøŒ(ÛL @CªÄÖR"œ0 =jú l»Cd§Cb“Ãn;·Œ¾WüM’l¦Hí£Èm¡ØÇ%µ4,†~âïÖˆoÔHïÑXÝ~8š9Ï+Ý) ˆ€…ì)Ran?q‹Z¬æëæ¢Ê³iÍjzØTÎ ÆJM¦Z2zõ}v{ìé«D¡Dc¦ª‹³fa 2wG¡¤ê¶g×LR Š“Ú£IÒnç ¦#4ɃH"`ºlíºÌ¶V¼b+T('Å@”ƒEÙ{0ëÏŸÒím–‹9Á”³'Û’{fÈmÂÝ\/s¡Y𠉶þ‚$xÔ¸@ÇÄÙW ½"„©ó¹=”ŸÙ;Lä]Ÿš![º#M&á5A «¿ÿ»bÖäñ˜lHTkÕ¶ì¾:ÕëR]îª ¿Þc”@ÁHåÍ{í  ObÄ­.øÑK·ªÇÎ¥­5Ö´‰)GÑXLY9-k;myXÇP_(Ž2ê=áM}o·|£g´S´HÅV˜‡ð@Þº0Åbf¶£¸(¦ÓœÌŽq= ”8pËhŸ«³å·ÜÐjè‰vH#yŒ|×4ìí*ôá10„ÒÖíg]s“TnIæ#‚n.uט°øØDÕJç³ò4›1·Û¢Üî(´m'·Ÿú}hÙ7¬€Ùàà„¿vÇÓüalÄý5ùl}¶Û÷7FXqÔÄl½]ÕÍz~m¢ºò\¯U”A€ƒymë¢FŽ4£( ¦ªèmµÔT³Øs‘(€€„WºÜ–—*¯z¬!F‰Å! $Ø~ütl6÷7²2bé÷ÎéN­‰1NF°Ð F¡d±Å}ßÁ 1Q¤£€¬'«i6LÔPeƒ‘Ê«ÿQ¥oÎ|°%¦<¸ÄßE©FÂÅÿD|ÎcB¸ý01çÿ‰ÖÓwÝ2Ù™8)r PíBàC}@<Ð DÜ [5'>«„:dûµ` €˜PŒ‰÷Å¢jžf%¡†,b«_Ä%Øqˆ•~H‹ÜGÊL¤ Àë`ë?znQqVäÌ“˜ F^¤Ä[¿Nö„ãØœµ.ñ÷4_B?¸v ½­µ.VóSîŽAŒH‚ÚêW6-ßwv»÷żXÈ.‡ AäLÀ`ôY&‡|²¹vA©g™l“ 3Û²`Óê{z-«'ÇèÔFŽõÌLßi¾T°Œ^‰"Bú:QÔP§œÖålÕôýSÕ *ܧ' =qÃàS‹j%X &„6 D"\,þ}"Û´%†bQ 1¥Ñmm®¯F}=?-Én(œI#¨ØÄ•élÈš¦*Nõ}¹yßûíïGjºEóĸ_|௰ûf7¥àTØÂbn ™ž¥r‘“ÍmŸJFFµŸXØö;éÅkå.`>á &À.ͪ—ö./ô6„szN7ÁJ0ØÇ€®˜ªseoá:›NͰÄ:[Þ~’5€S#r˜!óY,;kô6Þ¹j;/žì0É$·œPÉs°+‚MˉùÒ¾‚éÎEYÔ1Ê µiþÎõÐ ;XÆ®þ*/D Ü,Ρí^/²¹7Ò]or_‹BdÜ"„š3£¯³e¡ Mvž÷òCéÒM<_® Á¬¸ÂUˆd PŸ(CjÔ´Ö“liV¬=¨%I$†S–Ôt}a¾i?ë'9$–ãXò£~Ð/±î|¥—îš«J\9‘êûÔ€"Øm0ÅãÒX.êKœ )ï…óÁ–eàá¼®UKêã£Æ0ãRßaw»ó)=žaÎb¨Ä“ž~J7±(ç¦Å‰¬4¹L<ÊaMhéÀÝÐÁõ˘‡:‰ƒÜ *Ñ Yì‹/Ë«Å4?+ô \§ùEvY”«jøu#“ fIÖÓMº¼|¦§Ùç/üA4uÈ п•óÓ¢]uRüD Y¨•û¸š°s5C`ªÖF<=0¡ï&óºÇ̰qä<’fP± =D£\è–RûñM•ÛwÀ1Ý7&Á'í'í¶3‘NR+&–Ï«ª¬žÖ‹*çûÆD„Øå“îžìžÉïTïÓŽùêWŸYæÕ¼¨‰%{åüК€»´£‚ô3¨¥SóÝIŠïÃÄòzо‘èxå‹x‡ã¼OïìÓ}';ûut}ªŽ{_Ö‘¢ B4Kdøqs).@FËyA|ØVJóFCµlä·Jbø· ´û[…šU¡Õrª;…K³bdͤÁ±JÅ&ÙâŸzbüÔÝÁ4£jý”«Fpmbh˜?Œ%2~S”˜åƒ€©$Љ咓бTŽŸÖe^ÙÍmx¡ê„1T&¿jªŒZQ…ƒr^<‘\U3Aöa„wÐòÄ^[z›jµ˜d²— ÌC<¤@ÄM».þ€·qB<$F^øNà„,ü^¾¬»š2%åÁ ï8˜š¯„ö¨$1RõT!qó&Ç*tófZéa5%[œ/Àìó¼¹(§\n‹J2ÛÃ`Þºhr.«Æ$9õA4ãz2Íê I^‹³Û®¡ßiïËj*’iÁ°RÅÅô”w‘Â": Ø–LWûדI íKáXï¼´˜=”Ÿß; åÕËèéeäì"65“?BÇ:QÒs¿IûcÔl¬ %þA’‚-äArq.¸;=ÈOÞ’ŠO ÁF´ýYvšÏj½·£¾un„!%|M «ÊPY]Û &´/ „z‚‹K°}ì‚ûÐþcÞ0' ó’I7n1G#Mây¨›H¹a:îb(¦ uÚ-Šó‹fv­?óWªÖX¿)Ø—J£±Øòõz2+ÐH!ÆOÝ„2²?˜ç„*—Á%EJ—Šˆc 6’ cªXÙIdõ2Ÿp…7ûZi4[-t¯£Ù'Ïn•@‰%à@,‰Æbõd)¸ÝÊOïNóš=$Ÿobh¨Æº²×S¡*j4=tAƒÔQ,‘Q5S‹É&Mq©W½Ñ?gºù„ra „8@·ùŠ@€F¸¥—\.$å§GiûÃP^þWí¡â¼È/Y‡Ä«Ð [_)3êÒt?uwÌÈ–äEŠGSfæ'åÂÔÞñ8u[fËIôÓ‡D€¿£øÝ¤ï¤‹¶óñ99òܹ\Å tÓÅâ,¬nÇ»æd¿}€ tü€—ýúü}t†˜Ëaþîiùâä¨ã– þðÐýòÞ~æpêr‚±^æü¢ž¯fM&nƒ6Uû¯ž\”ðeUÇ-EýÑ£ÛÉÜé8› øÙ«+$ŸŠ´ÔŸ=g^,Î߃±ó§Ç©/á±ê:àê¯ðê%Jyõ²'½zÑ^á´WíUD;Ái'í$¢½Æi¯=Úëö#~n?zçöctnopÚö&¦á—äwIÞD—ä'\í'Oí§Hígœö³Gû9¢­±'\ì©ëà¹eŽHV€€^Rte§ D×5’àºn‰×Þ¯?Ø'³Ìæ@°6m´ƒfF´¸mh10¨nCd`w¡EÑ  ¼ m¸éhÝÏ}å}4¨èEf¿ ªAûÿ|ª°B@P%)¾“Øu‡Srñ®£ptÓQN‹†›Ž‚Yð=Gq8)í9 fÁ·Åá¤h´åh;í[öpIž+éñ4µðY’>FÈm¬ÅXã[WÓ›Vwû> ŸÀCФèÑt³hx›èö¨ì “<\ÒãijÁ%|– ëfÊw-&ö+fv*–ïQLìNÌìK,ß‘˜Ø‹˜Ù…X¾ÿ0±ó0³ç°·O/¾/o jŸ0Þ¿Ñ.½«2L^,]ÿÕÌò( ÃD,Åüp&9Æ™äg’³Êò¢\ ÜÑå襹ð¥HD˜+ZhÔÌs˜ˆåš?#ùÛ ^Žþw¹Ù¶»‡Ñas¿¹=š¿Tšû›ß7÷:Ñíîó盇»ï?lîÖ_ìí6iþáˆãž8Ù=|Ø~Íww›Ñ¥K[·Ñn7÷*ûãÝv7ú¸yØìoŽ»ý!ÔSb õýíç›?6ãôÝ'j’Œm/>º´Ùk›ý¼ D²_îoŽvûÏØéFóµÜ2)zŒ¦[ ²Ñ&õ.EhgÙªöWãëíÝ§ÑæÛÍç/÷›ÑãA]Õè:ìîuñÙo›Éîó—íýf?Ý-ûbss·Ù[+:ÑØ%ÛD¹K»ÒÿzñUݹÝ×ÃH·¦ïþPøÛöóãçQ{ß•¯ÑŸ‡ÑÉËW?„º‹û½=™¼´§£þxõZý¦8VbüêåXIŒÄ¸-!Jbüçal$Þ÷nêé»Ñܹ¹ôÜ\ÖÆÍ‹¯»ýîw_õµØà¥ä»W΄ƒ ¼z|݌޷)–ûÍasìS~1ÿ&Šžtå®Kîˆqâo·Zô÷ÇíýÝèð×á¸AKXY¯4Ǧ7ô±¡-Ý+KÍnw¯5ÕÏptjj«Ð—¦ÿÓÁÂmongo-c-driver-2.2.1/src/libmongoc/doc/includes/count-document-opts.txt000066400000000000000000000035321511661753600261650ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. * ``skip``: An int specifying how many documents matching the ``query`` should be skipped before counting. * ``limit``: An int specifying the maximum number of documents to count. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Only string values are supported prior to MongoDB 4.4. * ``hint``: A document or string that specifies the index to use to support the query predicate. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/create-index-opts.txt000066400000000000000000000014671511661753600255760ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``command_opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/delete-many-opts.txt000066400000000000000000000032711511661753600254250ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/delete-one-opts.txt000066400000000000000000000032711511661753600252420ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/find-and-modify-appended-opts.txt000066400000000000000000000023661511661753600277500ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``extra`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/generic-opts.txt000066400000000000000000000013321511661753600246310ustar00rootroot00000000000000``opts`` may be NULL or a BSON document with additional command options: * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/gridfs-bucket-opts.txt000066400000000000000000000020731511661753600257510ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``bucketName``: A UTF-8 string used as the prefix to the GridFS "chunks" and "files" collections. Defaults to "fs". The bucket name, together with the database and suffix collections must not exceed 120 characters. See the manual for `the max namespace length `_. * ``chunkSizeBytes``: An ``int32`` representing the chunk size. Defaults to 255KB. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/gridfs-bucket-upload-opts.txt000066400000000000000000000005341511661753600272330ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``chunkSizeBytes``: An ``int32`` chunk size to use for this file. Overrides the ``chunkSizeBytes`` set on ``bucket``. * ``metadata``: A :symbol:`bson_t` representing metadata to include with the file. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/init_cleanup.txt000066400000000000000000000014151511661753600247060ustar00rootroot00000000000000Initialize the MongoDB C Driver by calling :symbol:`mongoc_init` exactly once at the beginning of your program. It is responsible for initializing global state such as process counters, SSL, and threading primitives. Exception to this is ``mongoc_log_set_handler()``, which should be called before ``mongoc_init()`` or some log traces would not use your log handling function. See :ref:`Custom Log Handlers ` for a detailed example. Call :symbol:`mongoc_cleanup` exactly once at the end of your program to release all memory and other resources allocated by the driver. You must not call any other MongoDB C Driver functions after :symbol:`mongoc_cleanup`. Note that :symbol:`mongoc_init` does **not** reinitialize the driver after :symbol:`mongoc_cleanup`. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/insert-many-opts.txt000066400000000000000000000025621511661753600254710ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``ordered``: set to ``false`` to attempt to insert all documents, continuing after errors. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/insert-one-opts.txt000066400000000000000000000024251511661753600253040ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/ipv4-and-ipv6.txt000066400000000000000000000014211511661753600245350ustar00rootroot00000000000000If connecting to a hostname that has both IPv4 and IPv6 DNS records, the behavior follows `RFC-6555 `_. A connection to the IPv6 address is attempted first. If IPv6 fails, then a connection is attempted to the IPv4 address. If the connection attempt to IPv6 does not complete within 250ms, then IPv4 is tried in parallel. Whichever succeeds connection first cancels the other. The successful DNS result is cached for 10 minutes. As a consequence, attempts to connect to a mongod only listening on IPv4 may be delayed if there are both A (IPv4) and AAAA (IPv6) DNS records associated with the host. To avoid a delay, configure hostnames to match the MongoDB configuration. That is, only create an A record if the mongod is only listening on IPv4.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/libbson.inv000066400000000000000000000071261511661753600236460ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: libbson # Version: 2.2.1 # The remainder of this file is compressed using zlib. xÚ]M䶽ϯh —ä°ÁÚ1Œ ·ØÈÁ¿à|4jöŒ¼j©£™ÿúðC¢ªŠ¯(öœvºÞ«W%‘,R"»·¾µ§i>ÿë<4§_ê[û÷çùÚþýë§ßÌÅŒ¦oÌÃcÛ×ã[õbšy)ŸÁó»O¿ü|úÎÛO¿¯Ëãüv³2ÓÐWu×>õælÿí¬ÕJÐ ˜Úÿú7 õ1¯õQûÕn7Ó[ã8Öo©©1#êÑ<µ}V-PÍBeûW^×þ¥©Ú¿ æe®¨•sD-¡Ū.ÝPÏÿøº8ææP{£æÐöó?Ëpì’èŽwúV7Ÿmw|lçòvŸ’4v¶H& `-l@ÓÁ¥ª¥o{ýBI^a©? *k1 f­B¤ÎFqX*â¬@¤zmççjj†[Vа4!ˆ(çz6ÕÜ^UýHH•#$5oƒí’FÞ‘47Hjš¦½ÖÝW_«ÃggÕˆIÙ¡Y®¦W{Ò†ÉQó5™³tqX™#˜)Δ“‘OKôyX;½3x :»²Í¨W[¦BÞœê|ûMFçÛo Î·ßHLlaglÓ~x­¿|6j) h*ìRªísRRÞ.¤úáµZæFÓZáTl¤ÚÒ©5Ða@ÇZ…ÈЪÓB©„5 …Ñ<™/š†SoF:ÕkÕ™>«(Šf…òôv}Ô§‹€¦zÁ.¤\­Ô2ÐT*ØÔ4××[NͰ ‡€æKÝå-Œõ, Ô–þl.­]kz‘*FHjÎujpP²V!bS]ÔâçÁTÆ›¥[†ERvɯ:€x5ŸC~Åɇ±á ЬIË/\°ÕÈ‚— ]t½„™™»Ò}Ù[~½ÐGM²“)º ¿$ q7üƒ€ò¤½cTx·‘9•Xæ£Ð™ª¦î‡¾mê®2_f{6õ?,AÓVÒx*5É¡3OuóVšb£èˆ—„MW±`alHGÁ!‘G\ÚîlFÑ}LgÜ’sRrÈ;%™äé%ùl5ì]yIçÂü¤[Iž¾ü¼+IæY˜!ó)IT…w% ü Sž8áù ¡µä}X}ï(EEã¸\LþcxFnèJ×ç‘-«?Ç•ç æW›‚:sTa¦¦m«iç=£P”©û&Õ<›æ³íLãÔ‚\J¤˜=J ×[=¦ ÇÕN݃ewì›z~ÎÌÜœxÍöîTg»T‡7äNq®C)ødt©—nVE TŠ÷æUµ³V)¢çÅGq3ÜÐ}¹ñ›q#wàöVÍt±váe-ÂÑöÖ¦[ÎmÿdŸ©á²K#¦Ò å(–})g¹-kºôsõÙ¼M Æ1É͸)ì/ßÂêÕv=)QÃ4¢Œ ù(ÊcŽ|‘¿ œ9‡÷O w$’pv޳¥!- ¢¬×ƳÏü)%•#à¦lþ·1o%þþstG;Ñ7©Ów£î»•‹Œf2³"â±DÄ[¹ˆ&ÀÛö2št*pFÂ}Ü´}ͬçt oñÛLÔ÷ZÿasÐ&²„!ÔÆdÛfò²”!e)Æeû£l)#‘í•l‡~˜Ý* of¤” üéÍöÑëé{ûùyËe‡ó=ÛuÌ¥5]ú‚+"D Ú6w8ˆÉ‚N ¾dû ×];ÀÔ¦¹žÛKLêk™&»@ObµSç`‰Ž³[éÃW(;DÝ£‘+Lx+‚‰ÊÄ6ó6›²%Âa Å7E6+ÞÍ`(ÐbûÞ¨ì©LÊðýTbRJsÂÀ‚¼dS`=‘‘^9ŠôŠrqµYQ›& ÷f#"Ýé¾l4¼â Y#©W¶ëÍú,‡¥\²ù¬êÖ+‡5¹í¬ú¦«À½dÃ5˜µíV†&bb«u5ê£I0ÏË o04ZíLêÒ‚ÝØˆH gKÜ«¦žŒ®áa$äTÍ.Åû]k·[ ò§úxi-p¨ÊÐÞŒg¼ ‘"lîÛ ™ˆ0JÛ"Z3 Â9ªnÚ4;”¹‚¤Ëã;æt¸¦¬¾¡ñªž«árA ë,;pç‰Ðè4Á¥¢ä$ÁfÑf^8í¦s.Ú®ßéM6é·Ïz{¯ ÐHÚ·7_”Ûí©àlÌ=×^¸u@[ ½ý HÜ[>¸»T~íŸÙŒd%ª×B¨kÎÉÈËõÃÌÜ€¨‡Á³9ÁfbÄÌDó3!d&WÉÊ„I'ÜÌŒgAÒ¤cœaÚh¤¬¾¨;¦Jѵõq¡ŸßЈz”ä<‡ÇGÓ,£6³­ Ô\ÍBÐÙ¡TƒœÎñå Á¤?=ãMJ9ãoe‚ Ÿ²!˜ ÇOØDS¦}ÔVÁm¡¬¡ RzÏ\ú“z¾JžªôU0Z'«_|pf‡¤;4,ídWu§Ü‰'J°©ùÝ0¿M}öóø“½ï‰¬Â#ú C „v8)‚ìyxìêNï*ÉŒõrow»€êà„!³¡KÅê5n(”“WåvUQ ‹mÃë0ÍÊ+Ÿ,†¼4ôœ nèÚ6Ù[Ê925޲„Ž:Þo”.³›Ã¢úr>Þxz€‘Ô‚5ƒÊ< ÖîkJpÿd£¸q÷Òœ³‚¼G\ñI§«<äteç›®ÊѦkrªéÊ4]ÍÕmEÌÃhª—¹F˲”Bå*»Ñ’QÝa¡¸Dm«ù`Þ?ÊOu_?ùÁõ|ÞÛIÝãq¹\Àk.sŠ$‚ðq™¡HŒ>"G#| ÏP$EßÁÛÕ¡zª€`D†XHµôS}Éj­,¹‚\l±o@¢²oµoŸó)E(dðìˆöÆ:r Q)¹m!e½Éa¡·X-—fÂRµAÂÏõô U „œIúæ#8PÉÀ‚ $èëÀísfL§ —ŽnŽ([öˆ¤ªó-{„ån©Â=ˆ†nõä–ãàq–‚Rv5SÜ^|òô–!w÷ÐIfßB,ÊÔõ^ŠqkuYú\d± ”«Ø)ÍÎ1‹»ìºN_Ò­ær¹5œÄžëþ\!Ð21AD‹D¼>KCb:è „‚º>uBA”yݺÚ&3³N§IJ^ª. P¼¦\”HÂ!",ôÕ›oßlÀë‚¥±•„„+õÕÎéZ}ýX5óÍÙa©€³JíFFP\8œø‚™¤“žë2ã‹ÑÖÄf*ØÔ\ûùsM‰PDˆF´E÷öOs†‹úˆP÷ÍÝû›­òó%õ^꼚¢/<¯&¨±Siv$¸-º¼ÍÛ!漉ÂyÞÖÌ=­{UÚµR4ѨäU;ãK^ëE{IÕÖóoHi…¸Êj$ îxÛ ò÷÷ö&âÛ7à¹bµsOg¡ŽJ3ôI;ô¼!z´/·Ú…#Ù[Ϧ€’6´SžÀ±PZü¾Gf% ä"$´]ÍÒ·Ís tDxó埕™šÚfw±­y‰æà˜Ãüü¾ÆÇâ”!•)ÆdÝS.¹¡Rn³3)·¿šÑа‹SóKêz6XlC¥ÖfߤT  ùV—®~BïI%uŠúÓ¿xA“Ôv¨ªÝÇñŽvžžIˆ$úbð;⪫‘+h+ MtÄÃJ0Ίˆh“õ«qá`4ÞM¤±}}m=œç·-lA|šŸ5E݃^â7^6'6C?ÍÕK»=Àßw(ðÑSAìãdà .O/J®øtVYƒ$E”6|úÊÓ‹âÓg4uÏÍÏösÏpßßsü#QFÖ¯†Ñ”k¹¯K—væ¢n\Ü ºîQ§½£»uÔã.ZÜ9 ºåQ‡,늅Ðæ(Òò̃¬=G¤í¿ø[^ØzX!¢è÷ÔsÕAÉ  ’K^n îqd0$¥à®”nÌ;­ÏÓƒ‹ƒå +7*÷8.›’Rܾp„zRÑ‘2•ôs³ÃN(EãâxD”…£Qíÿ¥=ÿ¸Ïôöâ~^ÐÃúvY¯>êÏÙž\ЇKzovr´\šhZ!?ÒP>¹dÒ ²t=Ÿ{¦›·lNSfçîQš Œ˜XÜVSŽ}G2ÕãÛl¦÷¤<ïK,ø¥w«ÏgôB®Ä©4©•^”߆ Ð}9ÇÒ¼ˆKQnwömXÄ0uéþ/u,½jâ¢_uÑ"Aãg3É-$íž*wG}+­l÷Ô´²jVPÇî«`¥µ«¨j½§^ÝW©î¨Qkå(Üá8ÒQP^!‹kcYU|G=¼«–×ÀâêWT÷ÞQñîªuwV¹ðµ“ûn1õ9Î…²c2îKð:"Âo£ºËü¶™_ä>³OaT~♂D„š…Ž¶'ÀáTKì ¬Vô«Ð;”ªß€^-n§K©™ #ÕÛ1!‹ŽìP*D¬–qèºGÛðšÌ†§Z"gM‰w—?Í8àŸu‰ m6˜Ûâ«ÿ#î—üqXæ¶çB–Ä¿ß('K9} [¿¿­”ó¥¾Þ:S5Ë4»Ÿä»ZÛ¯˜tõ£é”Añ—ÕõCpý@\ÿÓ÷9ý‘‡ËÒuvî=óïíÖòîχ'Óï̘Éf¥ÌD0ºöÑ%úàþÛ‡£Ÿ¶ÓÒîÇUçGϰ—§ÿ~úåç‡ëp©ÞÞ>lÀz’}8/ö¶„¤ zàöëÛül#3ïÉÔcó̃mý…š€ÿZ?™ð»4ìçh¶Kû=mÿxø? xümongo-c-driver-2.2.1/src/libmongoc/doc/includes/mongoc_client_pool_call_once.txt000066400000000000000000000002341511661753600301020ustar00rootroot00000000000000Thread Safety ------------- This function can only be called once on a pool, and must be called before the first call to :symbol:`mongoc_client_pool_pop`. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/mongoc_client_pool_thread_safe.txt000066400000000000000000000001221511661753600304240ustar00rootroot00000000000000Thread Safety ------------- This function is safe to call from multiple threads. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/not-retryable-read.txt000066400000000000000000000000731511661753600257330ustar00rootroot00000000000000This function is not considered a retryable read operation.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/opts-sources.txt000066400000000000000000000014541511661753600247050ustar00rootroot00000000000000Read preferences, read and write concern, and collation can be overridden by various sources. The highest-priority sources for these options are listed first: ================== ============== ============== ========= Read Preferences Read Concern Write Concern Collation ================== ============== ============== ========= ``read_prefs`` ``opts`` ``opts`` ``opts`` Transaction Transaction Transaction ================== ============== ============== ========= In a transaction, read concern and write concern are prohibited in ``opts`` and the read preference must be primary or NULL. :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/python.inv000066400000000000000000004030261511661753600235360ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: Python # Version: 3.11 # The remainder of this file is compressed using zlib. xÚ̽Ùrä8š.xž¢ÍfnÛÏ”*§;íÜyH®ïÔV¢+"³nh —XA'™Ý%õÓ.‚ˆÿ”=fUt~ ö…X.ïãë§ÝÓã&¾Ú~ßFÛû»KÿÏžIóoû·ôß“:ÿß'Ò|¼æ/¯«×öPü_éêÿþ·ÿ_·›Ý·øòfEüý$mªñuÚ6Ç´=6„Î÷›ß·Ñ¹^G»ËõÍ óÛæ÷W kü?÷WÄÝýúñ+Hãòr´[ï¶—Ä÷õ#ÀÑ÷›Ûøêþv½½c¡¿ÁX.¨š#äþËA!ëNøvý_÷ñ÷Íã!'öÿä9g¹’æU©"·—÷HäRóqs³YG›øfó}sƒBF›Çíý¾¹ÜÝ?ò’³DºÝÜí¢øþú:ÚÌ‹WšÅ .ÂÛüýXo[ÒÄ—¯$ýÉ`ûc™¶ì™³_€U%A’&9hqSÁ]n·÷Ïÿ"iËÚšŒÀc™§UFÍò#"­Ù%%­°ª.%œ"¢’lÞá&-PýNNÐ5/1Q¢OšE|x{Å~¢F] '+LöUsHZ/ŽÝ±.€Æã¾ÓÒp¡Âab[—Ùoäã­j2Š—„FQv`WÀÜ]ãç<2>Cå-ÿSY'éOX¾”0ÀT“Õtl‡ä= Y^†#+“ñcûžÀª­þ}` ** 4ï›xNAì «IÆBaRAF"X^‰ •Þ>_ã:qŠX½°Ö#ˆ3â…±®)˜€Q®ÎŒ:¾U~Gzùîiæ»Õþ‘HjïªCèÔEÕÚPº¦Tê—]ômÏ îbÖú8wŽ̸vŠ-®æõøœþŽ|©ß« ðØßæ€Yÿ–ÆàÈîZI˜®fs§NQ¼¼l)Ý9Ã2ô3àGÞ¾JkžÜÀÝJçד¢X^œ´UcíªÚº”YÆÏ4'tw“9OW µâkº“ç‚`ŒpÕ!%e›—“ÖO¨Ï-æ`ñ˜Ód¶~]ÁX²¶ IuL5=Šhœd ´{¬ªŠ‡ ½5G¨e¡·Â –I¯H—ß«Œ¯¤åS¡Ý²+X0ÎÐU:F 00’¼B= ØØíåM2¡ÜMW»:ã8/KBX!µ|E[ò3|ïò±$ôÒP[Cy·‡zúñÔ-¤ i¥×ÔñUñsQM*,N*nÂÃÖáðI8ëH‘1¦a44sÖ ñ6)ÓUŽ>ÎmÒ™"S=+vH²_ G*áH_ ËÔ3wÞÔõ{¦~ŒõûTÀ'Z5PmHäÛ†Dš6d Å• #¶UŠ´J‘¾õ¨Ñ…W¥&E¡ŸºNɬÇÊžXz¸–÷W•ùc›Œ›hŒ_Å~PWAööŠÿä gÒBäH —#í™ÀÔ°èåxÅ ‹Ì±¶æÿˆ@Q!¢2’£’œ’âHð  Äˆ‰ɉÁ à†eý°Qã·Êˆ¡àÍvówãu–57lx«Œ˜Ž«ýžK3(‘ÌD5œi„ªJ“~®¬ç´AÜÀ â%)³8­Šã¡üêbšCÂÓ6iÚÏrÝ‘òmnžôY©kž`É,5OüŸ|€ïSÒP€°„ÊËz:ö'Ðÿ.Îudšë†xèÜÀ¨'ÓÝü9ÌC‚[Ôd²ïIÃ; ÀhPp£ÞHgêJèÅyW"i^ÒêX‚*αC1¤óÜ ™æ^ AI[?ä=%5‡¶Öiiª}^ûpĉ¤¡-¯ËÊǺ/Éa^Äá$?ßøÖ‹ YŽGŠ"y'ZÞ k ?Ž?IáÖ §?­›Õ\XNó:L²9Ôí¬l™ëôttØÒgddA òÏŒ½gÅi=]àY Û¨lÈ$o?`ôˆÖ"àÕö@„¥&-9 D«âǵy ¯"„m/!Ÿœ©0í ˆÕCêŠþEÉì@$°ýˆ²7a”0ÌÍi[Ê4þÂX$ôõ‘ÔE’’MÓTæAnêNÁëzkÒi˜ŒVÎBW$µŒþµÞ:ÈŠ”ìÛRr­¡^oΦƑW¥.RÄs5ˆ˜i¼¢¦‘ø6%8q:ÒA¯7gC$މ “8®3WÔȉ³})«S¶e ¼DOd%Ò2m?í*)09wGƓƇ]‘µ\50¹d÷MÞѨøEÄ\ã·²z+7sïËq0A"ƒ?U?sßTÕÏc-²/È“„[î/ÎÜȪgNþñßDÏÐð²<7p¦$/9m¹w­(Išô5ÞŸ—#lÒsbxÂM].ǹQSoJ Ïf^lŽðÌ ¦œµ I$Öe2YŒ'Ú&fDÍåÂKÅ?òþhò…Ð+ {m3: í¼ø(Ôñæi‹(2^(&²gÒ§²ÁÔg˜_ )ÉŸÉ¿½¹|MšG²ÇW!x¼™ÌtR‡:IÛ§îüxÀáò˜¤¹î'к~Ö»2Ð*ÝÇ{’ðÝ)qȾÛ:žÞ…3º 礪3âG-"^ÓËþ¯ú”t‚ÚvÍ(Ze™Õ²RÁâe連 yÑ‚ôļdÑÅâ«i HÿXœ´…M#lÙ'gô4W‰¯ªãsaú°¿`ªÇ®òCò‚³5¨›˜Y=_„cÞ2ŸkÚý° F••‰ºÌÌúÚ– FÙš¨Ë̦E­™rŸ¿¨uV^æ|aÿI÷:ÿ8wÒìB[@='”Ää5 uCöù»Ãqøl€!@«‹“HÓ6Ë+^ì÷|Kš²ëçá)¯ âׄ¾ÆõGJãC7}eáSÎy>¾ÄMR¾Š¡àðV6ÅFEFNHÿÙñPÇ,¾½²žO®Û'Ç¢}MʬмˆfúÁúƒ‡X$x =G …Èy” ­ˆhËÅv®¸ÍQà’Ö]o l“¢ˆiþR&EÜ'Åñ]¹¬B?aìÓªHZL\ä%I?̪ⷼ7Š- /ÞI‹:+Ú|WG? ª“ö5 IÜ­¦U5ËBù‹5¹qANb+6”£É_b\³Wó{%|°MW_cÐík÷óÐê ’ ðÚ"ÎrDÕ…­lë¦za] ¸Ÿxƒ¢?Ò„5–誾þh_«’G«p‰öç1ÇdÓæX²Ÿ‡¤Ìp`i Ý78–&{"J'úZ½ñ¶<V@ñyKâ|ؼ ÿÌë˜VÇ&%±X4,ö‡òð Ö£eîñÈF¹e- é*k8øÈ{Óå)oª’èÁxt ޼n‰ÈjÂws~ÀIN¤y®("áx•ÈjVÑ9óH?NS‰5rˆä{ã3¡1¤¨Þð;V9¾,X»ª="ÅØÌGšÌIe‰qË^ÞöýK•×ÙלÅǤƓ¢õ Z ?¿2‡¯Û‰I‡¯Àøã8OBWâ‹H»îú@`+=T¬ Fy´õœ§Ðœ±¦g'EyÄÞˆ÷ŠÂ³ ûéóØý¢ÕÊo>ôÍ5vûóßx”΃³i°±Yó¹:Ÿ"àÓA"Ùb+@ÔÚØCÓþÈ3Òýp“Ó§SϸUY•Ä=T…й!•¦É@§?!Fù¢(‹mªj¢òvÕOR¢@‹_ß`¶ããæTf+3 Ó»½ïIñŒ“)2F ½éhgüœa´pÂÄ‚½ñô)ù'‘6!)”—ã¯;KkvsÞe8¡\Xpæ|$ŸGxÕö• ÎSg@K쓘ZÚÔÈ;ÇFZ?^ÔPâê?Ϛ̿3ÔañeUà1à*mß‘n¸¬JwylRâ"hc<šË ‰Éæ|rÖðä=G†=ŒpY™Y·ÂsxS™–_5ÕüÝÅ¢°²žv%çj#™1f´ÒÝqöfa&{n z†Ò—Àa ŸÄ”®j ¯’–ìòƒåè~;ÿ4lÃÙ’IÅÏ4çtÆüââe1ß,:çŸñùÕz·ç˜_ßß\!ŒMð–JÝbmjAÏþíþéÑÇÇ{ºôì·ÛËÇûhsyç…§WÙIëîi·ñs˼ zÿ ™ÖxÜýs{w}ïã±cðôØÛ˜*lnvkñëÕúcqB€t85aà—ò«ŸQ™È×ðÄ”A/„ç@vµNÅjXöu™írý±¶ >†Uf¹ÌâS5bÕx­ŽÍ§‹òòØ’Ï—aÎ×OW¡„ul³O—9þE:$ùô Àþ¸®ŠÌ¿HôDJÆ`ËEq?õÿWH*šÉ`$¨ØB4ƒ.ˆèñD5P7Jò¿Ð69ÔÈâ=âWÖëÉœž]LúÞÂZÄuÙãíýÝîÒÀâýtÒ3Ö?6ëG¤!ÅûÂÎÝöÖk€<ÁãŒM-èÙ‘ä ÞÓÝ|€<þä7@ÖÑxz5¥7d…ÁÛè|€<þè£A"Óè²ÂàéQ7@æÿùgU’øiw9ŸQ4ÛÃÌ(bg•™Dô,¢× ¢nöplŠ>¢»|–œ³aúk6>DÅ@‡ìŠøwCt]R´ 8ûžAÀ¬#©)DЬ Ñ>¤<,Š$‹ž NzÏÃldМÓu]ñŒÇ0”4mâ-e™*ÑÆÿ=¯g·Gʸ•xÉlcF¡ÈžùîÈÛe‘P:Þ. ô3ů*«1ŇQ í¾W…¤ÿJZÃ…Å wÐÕ im׊Xmõê:Z|Xu¤·]ƒŒ f‰‹óÓkëHñÔ“¢³±”ƒ±~æyË;×êH4I]#“²Çz8Ôµ´oâÏìÓ˜›ÌyÚê—&dì%ÚØ“‡¦zÿ0­X€¬L×vˆ”ŒWå6KC«¾xúË\TîVŒÿ4÷*,²Kǽ˜´¥®„xfÚ eÒ› `²ã¶§îŸüLõ¼¤Ñ²úI>@ʃԜ©öåÑ/Ü2 þ€JöK´Ä¿XçfÛ’@±G@clšñÔ!XÌ[ ì¡èwàÂ"m ÐpÖY'˜:=¢AhÆS‡`§Î‡ ‹!.1©cgä§ÏÙ´p„"Ãx–63×ax·ÊÖ’¥Š÷aâÄÈðù€ò×azB`Äß’æ…ôÄû«"ØI( ÏÞ Õ‰4Mn¹Å‘ˆq#òç4"2FI#:hKÄtN,)¨OÉÞ~o¯ÃrôÝpµ„Ö,:Šº¢¾ö-‹$â~j±§gа!§zþă¤ª#Æì[€ ØYˆp…Hmæ#LgÁÈr²œràw:"ŸNG¤ï"DøN‡#.®fœÓÛ]#н ñúë±§:3}S±`mQ/¢r<ûp|ç5¤Ó`Û‹Ž*£ÿæ}HÒ¦’öȶ³Ý«ß×No³Ž`ü%ÉÖÍËñ`ØÆ3ÞiFµÐ-ßKS&Åe2¹±Û .¦"qpcMS6Ðføí6iÓWB}ñÖ³ çDû5aÿ†Z U-6zN&Qnv:U•Î6ÿb²w©ªæ€3g‡:ßÉ7ÑÉ*|{ÕŒÙw\˜¾{êûŒÑ+Xsº“õ®+²²Ò²-÷4¢ÎHŸ²!ék‰1¥dW^ô¤ßÄaœÙF“YÜ"1?‘Ò·ÎÔ’ *N½»Î X‰ßæŠR+ŽW{›¨kiy_âh­Ñ´|:êªJ}â±§ðÎÁ‹MÄ;rDªôÓ5¼“s&RÝ’Cw&!,)y¥_°Q¾PÍPõ‹ÆˆE¡}þdÛø¡pŸ¦|¯~Ü6žlQ Í;¶¢¤é‹„òƒVxOb000?’îìÒãqò c Û[R]˜è»}=¿öu<Ú9˜F[5±¶Â÷Ñá#¦sf"ÃõÊT¶HôÒøLóî¸qöa:ŽUNšìNëÆ*ƒŠR° oW®ç÷›£cGæ[¾8Œ‰Sg Á ',Qò÷ꕳA’µcý¼Äí]í|JBã¬|J¢£¬ÐÏI{úÙ‰Oц.þãè3$ÜÌ'fIÕ féŒôè›Dói™&J\?EÏÉc™ýµÄD݈Eò¬®£õì#hy¼j½³EIïØÉ¡_ Ûk÷öËä¡™7.6Aã$MÃF'ýÜø¤Hÿc>>!egâ^£±@C1ó)èè蓆Fn#ƒO¹ û~ÑP fuV$­¸›Ç¸ÞtÁ¡„^è ÆœlÀÀŒÍ!Ôý­HŸ@ŸS¾¿Ì/V¯¯[ zþ©éª u]¥¤¶VНGiŽ5¦›3bá3×SôŠß†x< ‚'yÈïªSÝsº šºûèÙI›÷ÇzBôhgÎh^Q¸¶~±ÞPš¼ ÌH+ö¦œØøR ?Ê6y¿©ÒÕôMЄ© =¿S®¬>‡Q¨ü*­Š¸Úïm»‰Ý,Ê…[ Å6‰ Ñl@ÖŽp®–xX ˆw‘ ’Šÿ"ÏãjÅÉËôã½›¥^U¡ÃV‡z6Ÿï•ZƺÈÓ¼ÅEU‡õ°Þ–—©‘ùn™Ø/Á­ÌÃE«¡‰ò’Óö3RWÎÂd2m51‘ ’á–ed¾e‘ÑAÅ?S.‹É Ürê3Ò/[* ¡%Zä¢;©oÛ¡2óhŸÊ&Éiò\€‡d |eÛ´ft¥XÜl(¯Ó?yCX÷à§ér;Å‘„Ú½6–›O—p«–ųåÜZ™C«;Òòÿ\V™6fO¤ùxÍ_^5në1M¨pUqNöRTÏÓ½)¾Œë»…$Ôwø"Šu«øå¦ýMâ(7C·jNKS¦EE ÍZ&ÌÈþ3"”цŽPÏŒm`ýùöÁÿùö ðó-4£_ÉVI¯Ã÷…¢-p«=ÆF'9gCU1=ÒÉ6FcûÚToû"y Âü•´_ŽyÑŽjȾ â‘&œ_ùç'C2-€Ÿåƒ]q¤1æ,u•öÎ#8w"çùXº›d@öð묚rvt£G7$¿¾ë’P@_Hœ qYj6j®YÞ¤À"3'X¥à¢£q1 <’‚$Ú7ìQà¾á‡èNu%Z±žaG¡ìȺ#m”œà^"ÂÏã#nÈ^À4Þ%=mâζã+ä`áLh:­9<$ S_ìy ‹=4®É:ŒÓxµs™)lT8C¯È;lL8ןWc#ux?k½‡ùN³¾fodð2xö1ˆ¼’u@¯R…â.Ò§läe,Ä>Y挷^ŽºìM›g¢ÒFî™!£ 2²fȳt¢Y€¯œga_kk>Ñ^L‚,VÏÇýž4¶ÃTeüTLåâÃ}²Ï0‘2­²0¦_qB Ø¡²œæNcõÐ7>¹ïÃÄ»ì¹~‹!ãõˆU ‘df,µ _SR“’ä¿UÕO@(äêU¬l nTñ‘[Ì›?FI¨Õ^Ë,z‘%µŒ¶n†¯Ãf^ÿc‹¥Å³¿L¤%:36êÅVT‰áüì=ÿI ¯£øêþéËö eÔªþ/™mËsQ‰’^UGÃW³„´1Hž çy-,è­U>Ÿé-ýÛx¨·]{éXo³óÁÞÝCq<Î°Õ æBœÒYJ¤ÍÅPˆÚîC-GâÈ\ÃÞ1£ †¹MÞÁ¼AX§íŽXY>Zk£¥ÓQYê$ïþ$¿€càT ü2c©C¼û“ü Ž_Q1ð댥AòîG¢?mÒü§²›Ž´AkÎT‡!úŒ_ÁøEÃT‡!úŒ_‘ÁøUÃT{5ò6½i_K|†›€?²t.¬{·Y†N…Î4üCW”î1«}c&êä¹)™åK›ÕDÃd'¤¦E&6#b Îĸ|c|ò•”¤IZý^/›‹ˆ´ržÒš?¶YÝt0¬—^tBy“Ð6‡ú ¤‹NpJÇÆ÷wGÓ\V##ëæ,=%6~Ò´Ú(¬•NòLhhquúÕ“2"–ñ%­c©›%è\JCeW-yXYÙŒHc«ñÃ¥üž*6Æo”å†N6†{ªÎOôé7—ïU ­[ÿ«ciãp–«oUøLrÂÆrïº,«Vl• ;S‚UUcŒ).TËÙÂ6€»Œw6¨ÏˆMMã²%Þ@âýŒm¤ô°¿ ™‚ojÔW©mí墯¡ÕDÛš4œÒó[ue:ÀT‡Å{êµ'´† oÁ ¯ôRë'³‘±Ò“É–<ùøAÿ8&…i½ÔrðdŸ NœXEü¢À]çOöûw%¤Pä[£O V‰–ÌÙkd©Ú£mÇ‚¾í8ƒWVÛíiÈ·e²{4z¸2›ìú&!ònmŒÔ†^·6À_/ã˪( ßü^Rz¬ù 3ЕyG‹´)á˜-íP¶½‰øª=sßr¾.kÄlJS9±€øz ×œv‹Â¢ÖpO… _Ãèˆ"†®ö )goš#Áü¶íy %óOðÆ”Yrñòz½îyÔĺZUÞÎÛ‡¹3Å¡mïÿ¾Ô¬›d'íܬÉÓÑ–ŸÂºØX;3ëë(MŒµ]5§ætÚ6Ç´eUYWÕ÷¯³ÌܵÍó*CÅÙ#pÊ QÕQš—V¸ê0xÙ’Ö2 ?Õ5)3¾ˆµMž¡ÖdìŠ×Röõ¹sFzT¸MÔ›w’òÑ#*‹LÁ¶ma[Šº™fWrý6ç`Û÷Ã9yë÷Õ˜èý¿ ÀO”ú\T×QxÇõ¼àëeÂĉ£Ú_&ôׄŠ7s½õJô “wÚO}¹Š†‰3”öÿ짇¸E·´,_>;¥p´ÙêÃn¶¿sOç]2‹­¯Ãñzú¯^nHûÉ~†ÀÈÊSÚÛä%OÍ_âìžx—¼ ˜žÄy“ï¦3¨êëÜòt @¨ôz329C¢ÜÈÎ&>¬"¨†ÞDÈñ¼¹êþðˆWï5Å%²K:³‘tu(rÚúx›vç¥)q_þ…3|é}ÓÍL~£œ—M<’~«L€TtP±!HÃ;¿8ˆøæše ÚsÆ.ÙëOY2T†rW “¹za2š»`Lg—»«¾¦ã ܲ]Ïàmvp"É<’¢Jp3˜2tu€úš Ö2#ïæOe·rmjä ±,Ï™"§BKÞÆÝÁyóË ˆÌäåËÿ~>æÿ‹j¶I™’[Ò¾V™ÙþAü¾Œµ„cJaÖð_ë¶ø*?`­4ô_7»øúéîr·½¿C:”)<\Nœhd Ÿ| Š@¶ëgÃ× å±þˆÞ¿Ö aÿ>N¾qÌ?ü©ˆø² IãöÑP]åâ±ãY}-ý)ˆëgPØÓ\ï@+ð•´Hk|‘—ipíŒö ÙàÁ$±½ÂÛÛ^ù›cúZúoΧßÌ ·‰~Ï›ÔPE8!ß[¨gDÞ ÇMÌ~éÖxÄæ™ÀÓ£äD±,«.ÚY_a|ßÒÄʰ‰ÄÈ`L'½ HÞ9)ø¿"ÖùÈñ×ù9—A!1eÈ[ËF7 –rôX´(–6ªÒ¯:áã­i°ù»ýçW] Íy é¦§Š¶ÿÜCÁ!(u¡u¦b ï´ì,ŠwÖd–“‡tâ½ÔŒ  QTä)…B@Vü”C x§5§B„ÃHU½ù1±i ³ÀSµšñ+d 4JUC7Î|tW"8 èÄ?ɉ4’ {8œƒÒHÁëÂUF³ ,ÂÖ…ªÊ“\«EØZ-R+£‘ XŒDàhÕA«Ç[=F³šh¤â‚‹‰.$¬¶Õ0åÿ Š]ö:Ü?×8ST Ú¿W¬äªT?G¥Ñ«ÊCŸ¿Rç\ù»Ö3™ «úƒ¿a”WÕ$²›J Qÿa=0A+,d–u™Ý³ª|?Í‚n$,ÎŒ,nãžô@Å9>ÞuqïÿAÒÀ!šÂ¤…EˆW-q A•¿^M&£ÔÃYx*ù…ª$gKˆ23Q6{¹ âlÉÝmBz9äð¤µaPñ²èoOµö½Ê³‡¶9ê1¨ÔôF:óŒ‘^~qÆh®*Íÿ4ÏYdgŒ ÚÒŒf?{Ð`ÀéäAåÜÁñ°0¸ø´ÌOòx sàöæ ‚[P›ñŒ¢P¬ªó`<}Òf¡;{ò9±œón2q>zR¥SæÜ}él'c؞ʜŸZ`^êe‰§ ]Su ù1(3ª¢Bá9Tß Qñ´åomnÞŠJ(Xƒ"Ël†QñLú6©k–ûõTó°Î… ²:ÔqBiLÏ4mòº«:²¤|Û'pp¤Ë‚ªî ʶ”j Vådª+R˜&­zÜê'ù€ÛDu„UP:s{⺾êö £T‡ëÉ«ÔýG d¨'h\¨§ÌäUHêo ýmbÖ-¸ Î^RCW$C¦£ ö ž1ªñ‰h$æIKÁ!(ŒNN¦b¶àú„‘b2ÑÍÐüÀô;ÆA/(“E^•Gä_yDÆùV®Ô§ Ô† öxäŸA0!¾„ ¾'Å‘À³tÃ8è;²†¾Šü’ŒòÚuëÅÝ3†øBõd£Y)·ù©6'„‹žfz¬·êgX"ð±*ûP5Äk°8]ˆÏó϶ ÆÙl_^³¤M|íNJ®E˶ÂO*zíöœâSqÂà‘ˆS'²Š¸ñ†gÆ]…r©à‘U6…¯>Y‚4tºõ$”H—g|âZfð‰í‰»ŠOŒCd¼bÝMYIi8‚ÄŠ¦âÐJ‰YŒÖßµØVÍUuè¶LfiäP5JlH(±Ý_&£ßƒdC¬HA§=-u÷‘Œžh)D%)ÈÁ‡çJ¿{Û䟽n™mÓé]õ[€ù߯B jü} œðüLí!U!º2n•h–}L¤µ¼Ù9=IoÁ™ð¶Ï; íÛi¾éVd’´©õ“7xIA˜ÂrVœÓÁ‹Œ– š—{0;BË-&*QI~“˜XŸ ¡ß£à9 WíÍ… .zahf,}¹p+…²2Œü+ÃHWoEž•¡‰ôX_‘çã ¿à”ÂùLÀY£€WÈ÷ú«h€–Mús¼*:g«žÿ'YÖ„!°a‹<ÂlXfwPl15%eYé{NÞlç ðwNìYdM°ÖUIs¸ÂÊÇÄ_Ä]ÛH[g‚kNò¡èþéá°ûçÂýÃ{#f…Ãb¯Áß¡“ƒ0/½pŒc‡™ J+%¤_ø^¶/ëhƒ´7ÀWŸ<:šÐ±?]_o}ì ‚;#ª¿ §ló—cu¤X—2ÇêYÖ¶[s;ñdóÈS•&#MH¾ŒÔ]è«Cg¢Ë©^¬å‚*9 –ŸB‚„ö‡ð€ °ƒwîÌÚA°£¬ÓÇÈÄäH£ttGè`üÌÏ‘žG››k„C{š!àðì¡=Êa= %ÅÞ“&šR¸€CPñ'´$"÷s†úaç5Uw¼–áåÕ!î×Zª ¨´?“ÓÖˆK }7DÆ•{@ ¾\B #t ª¨ZŠ„±?q’ß6ɰñ‚ŒùymÚ¢°ˆâ÷+™ Ã>œ²E,ì <.+ÚÁ@ÁÀá‰3’_Å1´[èj¯!q‰¸©ûA=xЗz[òÞ?&­…‡ZãÉÌôÖ£}É>¨áØoÅ´ßlúÏ¡–¡ ŸòØO%EƼßÎG²ÇFÛ#¯]ýbŽ«›¨½âÏFì‹sæî+-¾6˜âñQªø°Š #"f L±›ü(|ŠM ¡}™Î<5‡ii›¤A]‹JŒ›%— ,m˜´¹8ošž6Äp;¡Í†!:jƒÜŒëåàoáBÇÖ!bŽ× 8“ó a®À EÂpÔ°á £†Pl€%ûu™E5Ia›‚1ATäÍÜtê.(ù…W°/üÃ}ac÷ÏË1ÿhžÐîx„DoBfñ^Q¡ËÁôpž/ÞE>­ŸÙ#¾Ä¯4Ü)j·2 ñvFm=1jè0ÃûÛ›÷ÑÙw¨8»óН»y\ÝyÄÓ]€8º3Åñ^b»'ÃÛéT%JÓ¤¯ÙŸ­ÅôÁÇÙÚñŸ¨tqXóÔà—ÚV©eµ®Ù ]eUJU'W&v\𛍠Öšv÷·AöWO«ò9NžiU[⸱yŽÏ24´DCŸ«ªÀb³üÄâ‹ÞUÒz€«†È3t„‡5"Áu‘¤Ä'ÕFŠÒ›"Ltt\}Í÷­/Ë!a¥ñ=>‹6¯‹oº@MÈ/>ücbÙšGèÍä÷ .Ä÷ >¬÷ð"$áC?žCN@ñáë”´ŸCû÷À´Ò‡#gVú‹Ï ÷h=›„GSÍýèÙ$‰£óðÞñ¨o#¿O¾kŽÄ§ûsÆãÃ.y° \|†Àï²x3 >Ì¿W‰ò"åô&-·1 |ø×IMxN†Ûï¬â„Q? wÎõOLçd[Ä»›m ÒãyØÃ¿1u&ºÿ<ïߢ{Ìs*¯>²wçØÜYõî[¨‘õ¦Å&hº»ó×H ¼LŒ‚¸‹ê[OûÀ¨Þô”âáü=b~€Áãnœ°Á;ñØÞû¬#Œí¯›ˆþîM„í“ûtƵÝdŸî·žÓx {Úóž0ºo=§Bö¦=ºÑº.®GÇYG·«¾$Zt û (½Þœ¬ À„íö{õ÷õýp¯¾žÞ§Çuæ•.7®û>ÜGñzß’æºj´_¿è‡r`ƒ ˆ/_ó"ƒÃ˜C¢ßÒ¥Ã}!ûª!ƒâ[Ô&©3â:zHôçÓ›ß^Õ‰es¾„“z†mY[~èØüÛ;W|ð xgªüüâ"/ɰwö¡ÊËV·òÁȉ‹Éâ¶Š©qAiZ•ý®€EøÂ1Js&½ #{Õ’6æ×&}šFÝ4·nðV°îJóe?%E(îÒÒüŵto[nWóOßÃ)H¬{{å^بF àU—5‹§v,-¬ÏÇÐdUU:ëÉ_`2Ë­m®\,¥‡;jEÿÖïõT¢‹Då /™ñ²È…Éð)³»ª ýp'pLÞSR·ˆ*ÌYŠd.qy¥Äg–RIäŸ] T˜©•Ìɳ–9©¥ùäUÏØèàeÁÂvJ<É´wÕ›)ë7õÄ_gûîºZSB±nÆ †ªøÒÔ}Z¶`X«Ý=c­Yg<‘û]<;ÃÅëèr»Õeت3cÄX樦PEJæ¡—¯Ic>±”ñt'ê]HèþC›£)“Þƒ=¶]®â©`;CÍ·N^‘îºGý–ß¶aˆ×)ØrÌaŸpó>ÅÏhŸ—<ØÙÑ)î €Mqµ¸³Ü'je üèÈuÒÀF¯üËG«¿§ÌRM ¼šì¤$~¶KÁžk…9`•4¶a½ê¨4üÍäÙ²/Ôêç[O¶³>­q2žö‰ÔäÌOõRKÌ­§± sôÁ‰"ÔmGûë`èhëUõ¤Ö Ü8J[µ‚b¼«PÉ*ƒ½ÂÙëÛè=ÂlcÇæè Ú+ìÖœ<x„ÞÎ_ö#6ôÌëx´·NÞÆîµËô>«eG¥>—ã+F}&7>auÓq-¥tôÄœ@-.ûd]}º÷ŒáÓÒº_4A/¯š*Îé`—W™Ùøç4óðÀ26Ö2kèRËÂ*«Ï`P!°÷³mÞôªK~®õ’°Ÿ÷Ú:åýÖ½Þ› ^UjM0µ§ÈìUýq5½SÖ){Ø*#´§â ©#¤M‚Ïp1aÕ|ætD­*óÅ=Ñ›­Û¶òzÔ*aÿ‰­-¦a¸7Èj8«p\æÃ‡–ÃÖŸäBéŒ -’—ßv-GY¯…7;‚¶*WΕ9&÷䓜s­É\„;ÐðÙßzp ÁE/;ç\˜ÑqäÜá(A÷öÉBË×KSýö’Òc]W>B;œ­†›áUÍ)Û–^çeR°.J†r#áÑ®d*û®IÒŸho=ÚÃÙ ?eÖ]~ºh‡¾w—cÀpã5ðè ¬Óøfí„Zã —×cãUË)¢LD›ét§ŒO%ÞMEû´eVR’&Oùõ¿ð>ɼ´Ùо™¼ú fÓѬNa'´¦UÙv_y‘æÆ“ZõüUpæÈ'©#ÿ¤ŽŒ y&õ2³ý<|v|FŠ‚d¤È–Ü^i™Ù3RçìízÛxí`˜€ö‚ ›ºÒÒ—›á×­(:˜ÂÜú%µ•*ºðš¸PcÉ Ö;„ó1ß”¿ É‹š5q+òÎÛ}Ë÷tÃÉYYKk_·ã´ÞW ¤DŒÀ{f>jت`\ *< ÖÁ$F¿mÖW³‘„}­›ÀÄÛ»í L(¢úêQøÂ=Èj8«p\¨êk‚õἚ™òW!y_áA}E9xUYîªv{¨ r ¬•!lL p¦’Â6bƒ/ø€OÀ¬³QæÁ^')“.R\˜ô7)âf½Ç›e*ëþ Y7å CzŠëj­ó 8JŸØR)éV\æ•`ñ8WiA¡C’Õsæ%mC‘FÇç´H(‡pâB8Êê936Î9Mj%/^¾@‚×j½˜ÄtCÊ—ZÏw ¸|/6cú–—-Êòë’’cÑ¢­’¾ž¼ Ãx‹YpÛƇŽ/ogŸðusÐ µªaz UA’!à‘Ìe$އžfa(dPïäæ\u ¢Ê›ç‘`ò[‚g¸ANÃU᪡ Ç£’Yòôõ²:ÔI­ %¤m‹¿É‡¤k"½ø Ò:ÏÂÓ~é.«AFGûE¡Ð·‘_|&¹_”ªô‘ç,fn3²Íbâ>ID¾³˜š}ô' ×)jJ! 3#™f.#¿QGÞSH^Äœa„Ÿ3Œæó|vÎÐÂu ÁeX`‹ñ¹¬­|¥àÅUL§ÅÊt!µEV\ Ö¯–þm¼DbA}é" ‹…óe3>ë\„òûú5‰üý§jRè´3 ±–]ÒÔSâÖz/Òþ|ã5ph³%€}XRÓ‡m‡ô‡}ÒDý2¬Pû¦ÍýÏ·,OÛO"÷K*39bsœ öJ²ù´½gÞwP€ï'Òû¤$ðÐ˪܋£&Ç(äeβâ?M“lDL:âÊé è´"MJâ4æ$ Á¿%M‰$â°vÁÇMFNñ¡ÊpàœVEÒêîusä%I?̪ⷼ7ïiLʴʺ~:œŽã(‰Y;¡àG&å)oªò@t‚¸p´û_Ñ‘)>>lû³÷¬:B‰ØTÊiéÓð.˜›‹>|°"Zz{—iÂ8Ÿë«š4í‡áäì|¶ÆÄç㱌×å?>C>ý‘€hµŸß%? ŒJ1ÕœÑÕaˆ6ï¨àlÞWiQQ’·8›w £_é)ëpd×ÊT6$¶Ö7Ê:nßȳ“[gñ½˜ë ´ø4 ‹fK>1hc­CPÂ+5ŸmR áê²9ÅKQ='õæÝ)Ú&MëË­š½êe¥Òó«‘ du|RϹÐÉ=§Â&ùŒ Q…ù·1º*5@ë²H‹¨9ëÀ„>ÎÌê‘õ̤øL8çDæCïübp‚Î+F¾: >˜ÑùÃDˆÍS¾-?=Iù}&7UUÃò‡ÆæÕƒ‘¾þbDÉÐ1 ¾5}ðE¡R’Ä}IбͰâ™;0‘ןAë—Å‚0!·¥Küå¦Qˆr¾ì>î9ã°Q+)ëHëtЄŒDö#'âZ^ïx3ס)…p¦¬ëÙ7I 8ˆ¿Ln^õ³”výÚ™´:’2CÙ’ÖϨÑYJ‚ðfŽ2ßôÖòc£K\¿ZM€Ž Õ£ÖSaúÒ&¦&&_ù¦·1¥}†DK¬‰h&Å'§³ñdŒH™=z,f÷(ä­º³9"ò]©±q‡$³¯Z˜m— We²»ÉFeG ´¢äO„.'3é¿ëÕ¤LI·Â€ªñ¬½ÔAÁ¬èŸqBiœwë#]®…Ð0¤U™&­¾Mò’âò²æ÷M{;xR/¯ø,†]WH<ʽ¹ôÑþ β,>¤C>ÎÏrTŠÃ&rµÛƒÎܾ¹Z—á|ò±Ž/B7Ò‘O#éšÔȧ‘¶2žB2b›ýȯٴ­iä×ì/VŸÀy ÈiØ¡¼”ö]Ê6ÃNåñÉîX‡3ÑIvl­á>bÒªºm¼Î2½Qý»ÖÝíèL.ƒÙ 8°eªQã³›`¬Ý¥äiÅþ_›÷$maŠ–í„F"~ÕŽ»,«ÀH`aÔ)s€IùÓNýIL 5£¹Êiš4îy¸¦:ˆ¨$ PIìóëãD4î•éÖôÍJ«Ê?U‰ÏI¶Ô3Éógª6~Ð/œÔª±wa±úÐ/\ä7×ü%QßCcRªê[ç·¹XþR&o¬~$?ɱ¾ÖfVòž’š?¡KèÕÞ¼b΢Õļåd•쿎´e}}ö}- šç©¥9rU¨C%"e½¶‰ÙþµÚ‹˜ÔŸÃ[â5·z¦Dé?­=Ãô¥æOü›Om!rĆʒª–“*=ì”ð¼µL ÍUËŒUXFýBI‡då[ˆ¼¶_y¨áõJÜÚOóì“{l´ødc­Â°šú¦ì#–ºÀcjì@H$ÐxÑqT^†&ßö§²N€5xÁ”‡^lN|34 ÌL•S›´¼ÕÌn«ì¨hÄ/JOaü _ó!…ü\RÇwPÝ`)¯ó´36IôÌøHÕ‰`¼ÈH„›‰ðÀz¤Îçàt¯¯HÓÄ 9ge¾çm ;à¤GòP‚Qñ¦iô‡o:¥pŽ™H˔à ågóz§K1„¥ÑÁ„YAÁ²£¼•Óc§¿[ ÿ÷–¢“«‡úDΠ>eEFN‡ô´£DÏ]u+ŽxÅø¹ÿ Dñ¥74­jsªK¨UViJ­#vŸ“"£hxçeâó05ýfñÙ±û¤Æ ¯a¼jÆhy™¤ÝYd©º"ßj×]Yé}ªÝåõ ÆÌ5cäY£»Pã#ÔLþTò¦?z€ÊÊëc–·ßªJ?£òAí Õë©Ì9|ÈŸLT=-ß‘’æ*iÎISÞ‡\¦Q+ ò ÉiéžÊ\+¼ôàÕqF16X$~‡ÇÐï¨èù]ždî²üí9Ûò®™ª˜Rì«æ 9®:j3Ò4ÎÞeX¢8c¬Ž-ÜámpÅñ«´&ÆÍȰ=“?+IL}Ž¢Îê„òϵCipŠ[T^N¦A´ÀÏôN­ãÿi0 ÍÉŸFÿ…Ê€Í;2ÃÇ •êˆêXgIKêÄòÊ‘˜ƒ#dŽf9øÌtò¤yH ë‡ àﯬq§Ó*Ë&o °”0àúGÖSù • „A{ªÀÝ?·å¾2¯'à9´ÍJ¯KFÙÖ¨hEO¥2®¬[vÑ­°C[9/µÛ½6$ÉħÝ'ÅÁùåUÎYªõóûF”yUŸlÕÒÞ¦Kå1WUI¯HAZ7Óáðnz]=íå±iHÙÂ]mxzìš$5¹âŽÆ‡lâA•øJ¡b Óµ*‹ÀëfZÛ‘øhµ5ÔÛ+”£í•—¦ª#E¸!üZ{”©3ÞÏäC•¹!ɉ ³µŒÆ[œxP%L§žX}‰¥¤C µ3ÌÆMŸ½·ï->Z„¦JÉûkô£L7ï)Ü^‘÷áI–·±[îŽD’¿%5"À …O¡y¦dc%1{|AŒÄ)û/#›._†e¢¹ò€Yžë-Kjcu‹ÄNö1ÕËKì/¤Eúš ᦦÂ/E;¢~ލ“£…Mš0æ–ÒØx[³1œÕ $ 7’¤Â˜»¨ g$S{§âé¾!p„3!ä¶XÿqÀà p1…+)Û8Cqn$i…™""…b#…Î#…s!Êì„RÿY•$¾nªÃý~o’aL<¯*•cqd¬q` _—ÙaTál°ç°OF9¹Ü,…ˆU <…2b€³g­) tòd Äš&Nø3?ü/@lõZ¨QsNwÈËcKR~[ðš‘åËëªÈ УWû)ÈÓàÀHî“È‹ä~I¾Hï—\‹ôÇ€ül|NnE/æ×ÖM±SÉ*p•U‡$/Íë´'$:e=mm9ËI§=}IŸÊu=Ô'òu56g¼ñåúæÆiêº{üþæ÷ËÍÃn{=nvOBäf{·qûþáòþ ð> |e‹þlÍ¢ñ¶¹ÃaG¸¯ ’ecgî½t‚Ù€ÔÏ+}§ ¨ƒÉÂ[•Ê}”•Ì´ßß±ç˜qËÿ´Šm‚«Kk¿"pDꨌ‡íØÒ4Ã";8Ÿ2£°Õ[8²Ú›Ê}¥ìø>ßÑ Ó'âÅ¿`õÄ+ äC2©œ"Lµ_ݪˆi¨ê€TЂ¡#C”pðòÔ©Ôœ¨FŽ‘9•á@slðCA !Îéþ©ß"¬Sd/:|…¸áÝU[Ó».§µ+HÊþ÷Q¢ÁÏÇý^|6E¡I]ko½wƒ—GB¢-¬–ñÏ Å)™§ý@ŽN“ô‹, °_äGfŸ£3R q4múÙu,šbÑÝÚpœÖDÀ‘q¼ÏˤÀæÄá²²ûú²TMÚ¶ñÁVX06m^úŠòa&Hã\~à—• k¦¼EÖáXv >ààA‘Øáº™“ {c€bÇ5¤Æ%K“§¯iu¨“g˜zVêSX)Vôøœ Ŷëm“œXNÄEÖ‰ýY5è&ú =šnŸuã6ÁuåÞHò³èNpƃÁþ-3iÚîöâ5E2l"1e0O¢Ydû¯u`miM<ã]²Ë¾+èj€fè^Y—YT“Ô»:ÀÎá˜Ë[ØŽÜñ¥§ÓÐû’#"mC¯þ#o_¿()âjcÄâÒt*oadžVCþ•”„µOkÓr(Cˆeت½ˆ¡‰ªžÔ¾+Hišõ³ŽOý%Í &`ã B÷ó- I‡Œ#…®5ÞjŒŸ‚ÐoÏ·YOÌGg™åûC³úÒyYÓG_>®&Gp9»@ëù]6'¬‰@mÔÖ/.…²ÛÛƒöÓéÊ´¦ÕRf#bÉÂÁyyRÿàǤ€Ë(Œ…QQ&ŒŠª…YàˆÂ\ä…ÒŒŽ)Ñ·„^“¤=6˜<ƒVûxу$©c¬|¹¶Qüõñ>L¶“83ÐèøÜšNK1¨˜UR¥4LÏžL¬œçû\¿ÖŒΉ£ÖHõH’ì -Þëv*#I_€>LˆWWòßký!ˆ®ð¾pDwÝE'Ÿ¼3-ÿ}aŽÝ…Â2½é·O¥¹0˜gŠ\Ð<ªÝí¾mÍ^îOï¸"ü¿â´ÂøÒ¸¹Àtò½‘dEJöhº3nù|³§%±ì/ÑY8¥:¤T¥$ðyRì¿´*ÿ)û9ÇA”X'a3Ï{˜œ,1Y÷ü9Ú–Ù³¶³e¢·³ (fl:æS5`ñÒOQ†±,œ¡áQ-WH×O ×½)³Z¤Q¤iAÈsgiI+Hݲ¤…(¡Q°YKN¬„.êÉëQȼ-åõ³Z˜ÐE0Dኮh9»,\:5Ñ$iº LØh2³)f!l£+@1cÓA7ÝZž@–çM·òº:Óòr=¯]”°µ‹Ž&ç¥òîY»@Ô¢%4 VB#kɉ‚•ÐE y= ™×£¥¼¢é† †(\QÀÂ-g÷€…K§¦_ÝŸ)«‹]“”´`ƒwÏ6S˃-”zSËj¸$D¨¡›PU8ïó†tþº~1Q…³?/ôów°åÞÀÎü¬<šÑ\3 T¢£%:Z*cQÈí¢ªHD‹DäP$B´½8Ù@%1 [#§R¶$ê4ã¿}ùc·‰¯Ö»µ.ŽlͲµ|IV´ÂsÒß¶wü\ÉC’6•›™ |8.¼Âq¡Ç2¿àÃñ‹W8~чãd8Ö.=‚AR¡{ºÛöÛþÁNz(ÒÌ õD>ž Ö¦²O—Ñ/·¶·.ƒ­ U=£íðcZÕqy»{‚‘’]2ƒÈàP¼!¬î®ÿöè,¡}²­lb&ð÷ {ÚÓÞhb&ð+Îׯž†~ÕPòí2†³ õhû±` ¦fvÏP›|2ɯAòȯú,b¾lɘã`6WÒ`³§ÙeB€Ï1SV ÿH°Êx¶ä›ñå6üGžÞ¡Fx èdµ ¼_¢~ûRt¢O ¼£ÓšÎþyÊ"cÜÓk€¥½F/çý½“'Æ-¾Ë.–6úÚ­œ·ûŽÇø@3nU}‹0Ó«ê›üå5,%ßèé3?¢§YQ• æTuå È(?I®LD†0tš>tжI®¿ q)dÈXâ/˜qà(®%&9Ønü„ÒÖ¼Æc¥›4˜àÊðÕ¾©c ü±ýóC•×ê->$åÇgj´Õç²J,KLQg(ë'P‹.8'CÍD×$;>âC}­À~ª˜}§è¼ÂõÌcr¹×Õq"§’ÍŒaÉP=[#Ÿhp‘Ñ/°žñÕ雸?‹Ö#MÌýdTöèUf»|}ÁÙàÀÌî—TËüè¯^®> gf¿Ž®È>9-2ñF<>¿ž-Xè±sDzšfu³8&1”sÐë¾^!c¦{–ŽÞ‘ýóˆ=bÖÌ]¥IÍiØ7>;FvTïljگ˜M8‚Ä%×O´P_î0BÞQoâßy‘Ï¡žñ-Ô ÌŸCêQv-¼âôžý±ðˆÉ‚Ï/Ðãd>6G? Zþ©çªô׈x¦®EG][€Li•Æ3f®ÿZ1qПΑI!°«ç–TMFÐlgÁDï—¼vîÏ¢õH2+³g%9á”n–?•ó­”ajr³Ö_%㛫ìJ¿À窿_ÉMÌ‚‰Þ;=-ÜŸEë—^ffÿZàÌ(Ý–²VÈZ  ×8kýU2¾¹Ê®ôŸøLõŸþÑýŸ&æÏ!õ‹J¯ñüÏÅå?<\aqVúkDuõé_MÌŸCê“&^ÿròkÈròëB‚‡+'ÎJˆgêÚt ÷CŽõÇÂaFù@Ÿø7*u»w.Ùÿ’xÜOá+ñ¬ž9UŒXD°i뮀^ý¸(ÿ§à}=ê?Êu¿!?È`ÏDÒ|ذ{^C]Vå‰4-/u–°ü°V¸+YÜDÜ:Í6ÞÜ]Õ€ nÄvÖ“âªåÍ xǃV{öŸ8.}wµÂEg„ GÙ ¸ôdèò¤¡Óú±ße¶Êò†t„‹é1!j½œž Ùz²&r¥œ– µÍc®ÒWœÙ†‰‘Ñ3C˜‰ÑÃLé‘Al¤M(ʪ9 –˜w0ûÅCf#¦†o¯ºñ`lªC¿Ý|6–=Œ*ƒÇÂ˹›%d' ªƒk§E°¹j„âsÂY]ÏüÝÃÕ÷¶¾¹OÈÒd¡þùu™]M×Wº[£÷Ý«>l?sT PÀ•—5#P<3Sîè¦S3Ò€T¤FVä%¡¸HÐÕOBjÔ×IÞ@MÑŠò‰ÄŒHÜ'¢³°žù‘h™¶ EºKòâ´)|˜<"}>ÛåõÔ¨TY"E¦Ê2mó ¤È¦ÇÀ;\%Oí‰þ„uÖÖó₹@Ú&Ï F«½]Ûm?Äà ~îþÇí>Þ(䘨Sœ³!»¶&:ܸÈÄvJŠ# B×ä-n>{D®Òá(„¡Q^OM„ZôcJü=iô×±"}LÛcC”»YFÀªzŽû)ÍõÕó¿ ¸øÈmï¶»Y±2j2XÕ¤IQÄ—‰~…ÿÑ Zñ¿Yk™b®©£ÌrËMïpºöX‡²w=Ä4ª m$at2ª*¤wëǯØŠ@­Jþ~÷ÒirÊ$ùÙ½ù<Ó·î…©‘ Šåu£­ê͸šêýgC@ñ^:åë#Ùãì0 Þ W•ù‡ û/ÿµ¹ÜÍœ¡«†ìá~$é ­í?»¡ñÂ>œŸÉý|ÃÓ;ò†Ë:PÔ€Ïɤ 8:µµ¼˜<`bÄdÆæ<5;öœÈ lyÖÔ}“ÓY›—y§U¹Ï_”€M`+õA¼®•q}(Êë˜3Õ;{x(º¨úŸñ°-)Ñ_V‡ŽÚŽr¡ˆ Wob"xúÂ=„O_³^:¦å¸ Àß$,¯5¦|¡i“׬2…Åë/Ѭ7œ—mS©ïÝüXÿ±ÞóÍönã†È²–ùYˆL]g+ˆ/)¶&Ø9¥T9çñ¢k7ïúÙcúAÕ€ˆwí’êÌ.Ð_6_·w,ÎoîÄ»oü”.•f±÷åæþò7à˜Ùwe<<Xìß_Zü*a§:ÏGKèm¢_vp"ÍÇkþòªjž+Ì‘ª¢'js¢“/Ѥ)Y.¹.’}qU‚Áçvn×ÑoNeèòf£ÿˆÊš{ñaOìj –Ïœä(ÔT‡:/,wÒg‚ãÛ¢H™$z§ÊRû,ޱ É·yçù€bc­‡ûGÞàÃ"¡ø Í_Õm~°­óð—ðË .üÍ'°{e@ÙÃêÍ3kعýÒl‰» Îl‡»$W?÷N/iP®ðJ±%v$à—)–Ù› ÜW›ËÇÍ5¬1î0àÖ¸—ê)7—ëÝæÊ©ÇpEžî‘+’æ=,ax˜:©Âz~À¼;=9÷Ø6*˜ö©g‡+(Ûrõ"SU¶â“ïг\c}swïÛoþ1{Kû¹#ÞE^Ó\3ø¤Ežõíšóó⺢ŽÑ8;XaJ×’÷Öƒ)+¯ë†ŽgÐEë´ji;ýÐm$*Š=!ûë#I ÍOÄ4ô%ï)©ù“yìªðÕÛ+iÌ–æLz»óøUŒ^yd“v½ò¿EºÌæµtK^´Ó7Z'Bá:)¨æâsU)Ÿ…Ø›mRlx6w‹¸óû«¡ÔvÈÍ4þ$¡Ž(ÛR‘»=9N´ÜõP<(šzÎÚ‹-/“°¡ES>‡×7ﮀ¦úoR:×Å_7ŽÕê×Íns÷Ý© þºså$%iòt]ä‰vHÀQ¯LZpöm÷3UuÎW5ùK^dÔ¯€1‡­]7/éz:5ãPiH@û ‘¾ªuu|§|bl[î+Ç¼Ì }w´ êuÕìdóNÒÖmËßÝ1‰~—œáí"iùŒ!õÓT/,U®E´Ö例äè£}­Êoó°ÖØÜ*€o }}LʬbC¯„¿ì\¥mïà•îÔ÷REïþxЮ?3-¯0Ý9T’šp´5ñ¡y)«†lÊSÞT%¿õÑ=¾Kø ªÃÀã»<¢¶ÌIiJÏçÆT†¬øï4¡®½ã‰žBÇwo^Š*VÉëV©JäR?k½ô´f£~@ú]w …•ºzæm:"?°È¡“ ñ)0p³TÏqNšÌ5ŸÒ»ª„Zå¸S!Ô3ìš#T”Cà¢B¨g¨øãÌ9§Ý¸vpo¶·ÛÝæ*^?l5ë#ùFàÚͽ!ɉà‡Ä7ä%I?~ä¬-|£×Ѧ?wÉ=d|Ôfyå ½]ÿîÔã¿ÝÜ~Ù<‡8¼¿½s{ö‰õuôü=õMô ¿sÍiw÷uwä >­c^Ðen“‡•WÀ6YZußUQÞº·wÕ% ‡\‰Ý0Uóáˆ+5#ª’×gê‹íöPw·X‹ÊTTÝùtßÏ÷;ƒuÕ—;#úö|]±$FµåSsbÞ¯ýg7Gofh©÷b×8}¶F¸^ $DüÈ$öÏ®ÔNZ°Q$ÿq̉{o–ç.ïv ^Mâz¡ža÷ôx_¯o¢y£ ™”íß¿»×´!šjp|}·½}¸ÙÜnîtŸÓ´•a}Ü^~»¼¿}X?º6r=p÷øä"R7bÖÔ5Q«JýPíð•à¬9’‰®Ø‚@¡-tšÙ±4uyÌÕE´Ùarí͹’ ÊÄ»–ãœéLÇaYC³p–Q|<ëÌbÿ2êFž @˜0œ'rFø„BNLüŸ£l÷¸½ûº½þéWf`#Ì4ç´²~FR¦~½‘:k:Á¬^+˜ƒ³Ú@µI™%Mµ I›ù ¾ fôøå£€çæ N–„ìÛ¨a2»‡ë›õ×(þ²fù¾+«. › ‹7¿_ÆÑÓ—Ë›uAñì6|µ¹^?9O@Œ¨íå­¸º5Û»h·¾Ûm×»íýäÛúû&¾ÞÞ­ot3د—Ô÷Íåîþñ’ù‡¢7ëDÖØÞÞ>íÖ_n0Ùêf¡Óèæþî+{»~x`õ/µÙ}»¿bÙ1º|Ü>°H⇣ºÀ¸Õhó§ÍÝ%4=vO¬ÇŒTžþXìÓÝöòþ ‡ö:0=Žs'¡Ÿ^^GòtýM݇§=#€¿yáüæ/ŽoÞ÷†ôñïÊß%¯$ïžnDP û!fª3ƇokœÄ[᪠ãÕær{»¾Á˜é¡X;ƒ²ÊºýºÝ¡ìp ÚŒPUùLð–-ÃØÁXKgu•ùþÇæe‰Ñv„ªÂÈòöæq{‰1ÓC±ve…õ UD±4‚±¦Îê sô°¾DY@¬NUaÜmw¸Ø@¬•NUa|zxÀedÄZéTÆøÛöë7Ö¢?>Þ]ï6nÇÉxÞ÷€c¡ÿu¿½;ƒ# zw®þG(.ÎÊ*+®úïh3óêw¬g{ ÖŠ¦žÝÝ£ëÙе£­gw÷ÈZ¤bÍhj‘Ý=²éX+“Z„µÒ—ßúVgy†ìéî)rÜ4óTv÷Ù ¶<àû6Ò—¢—”ëºj´Ë`c†E:xݰ-#`[¶'Zs.ûýD‹T¤y®¨ûæóÒIå]öÿä9?u?+ ß1;¶~GnÙú]Þ³õ;f æïÈ5˜¿Ë‹0Ç,|ø¹òáwyéÃx#Ôd´Ø=Uôú‡ìÍÈÙó/“‹»’ˆâ§wh˜³¡ RÂe–`ˆîf( !IV•Å E_“x~LlF(t|®ö{JZW\Zñå,ïj6ë+/“SRÄyY5yư‚Šï—BU§,šÅ¶±i[Ã~:ΖÍß_uÄÝkº2 "Xe–3¿¦L6v ¾46¤y|ŽñÆß^ñÿ`âL¯f¡™9ô”UŒàŒCy kçšwPÚ&II–Ìì$/õ]Jã»Íæ*Òui@´KÌñÇXW?jXæõÌ·`Vâc|OàªÜœ¬$oÖ¯ÔËt—ñ‘× u<†TEýÈÛ×ßÈÇ[ÕdÔ™ášÙ$V9I‡e.Ž´’oh×3 Îu==eÈ‹§k1k§oŒN¾ô²Q û*ÏJTúûÆõcµ“7GiϘÓËögײh½ÊÓö¡Õ.š/]Ò!­÷JN)´Â2«áœ±¤(ªTlWÒ›á×ÿX×eÌ ¦š ÙwýáË6¾/Ý$¸àä{Òè(}7Rîøy¼–ŠVœ×«„LÆ,ÖUpNW{Im€K»â~¥s$êQÍØÏ”Èqgù^;ÒtÏûõ( TÒ™pØ/,Y&)É È8{U0E.2ÔÕH½Ï:@5L‹È`Ç‚¦Ê`–‘¸BgÂHÜ ÉŸÇª9ç€U–ŸØÐÊr¾VXhÍx¨å®¾ez<€ì³÷ñÎUdD¬÷{qƒv}±ssP'çb^ µÉ3äÝaIœ:5ˆšJ×}×,axÎˤùp|YëùBZÈëòºˆŠªqxyßâÈË 'mÛÀÞ®Ü_ïfXÁs|?g]0Göׄ¾:¾Ê3‰£‡¼ü󘋽?“7µ³ÈÜlIÞ]Ó° ¥ã›¬Ïàø&û'û_Ò¼8¯{ßñå†$¡”† ©]°ÉÓ×ôP;¾MY­ëü*$SSX¦S,Â!¯ƒ’HL’:W;m“ð)w¢#×fÚ#€ü4^¥ ¨7°M_Ì´>Ö ¯X‰O»ƒvêÿ3nK`È"n˜ÑÙV¥ü¨gö Žd ?[F~aá|p¸Šã²âs1§H7 Š$Ë g`ñ÷Êú4 8ÿX„c‰ÖM‰SöQ¾6Õ±FG¡@¯2ÒðcŒðú«ókèØèˆ†£¥üXºë =ÂCÏ/Cĺq°ŽÐϼ|ÙÞà Ãz¾9‰Æo¬X·¤ÅFSý$åC^#J¥hšà0é´hîò5/²Vñ$‹^VeÙ]³·~fu!É<< ¬kH½Ä k2Áø+Â7UŠ9DÌoî¯ÁŠãé‹ #îT;¿ž²Ûd<ñJ¼ÝoÈÀ˜;ŸT7‰iSðUiw¸‡S„\ç«crÚ³:‡ÞUíuu,áíº¨þuû¡Êñy}äÓüˆDǤ%¬»#OõçV K‘0DضeÆòf‚ª98öb­As¬1ÕÜ–®Ç3Ààß ó\%M6š†€oªêç±kÞ’&x·âK'ºlñ-€p?â©Ê`¾<’N9!ÃUQ€%ï#,„ïÿ++H7gŽç€z`/0`Ú6d-û–—p,˜î‹ê Åým/~=†ÒrJ1U^ßÃC–ìþt%„.ëš‘†”)A iulRL»÷È×’!j…‡PŒÚª^Ó2ÝòÃÚ }ŽÆ?XoÉ$¿Í:æ·—Ã ¾ÊÐ-³Â2`ªïçßÏ»8SŒÅd±Ú’"­ Ø<£Vâ6^@wÉ3ØäŽ•ºêï=Ší‘N*?%LÿT>ó.‰8ëλ“ý±èîz4Úw>vø A†Æö§½`á IhU¢áÝ•!pôxG;6æõ?ã ËåÁ6BýɈ`©’¦ºâŸ”1ÝŽ8N“ô•dóIéfèL?¤oshÆ/9éöŠex‘ƒÄÒ^Gµþ]cûØ/ùüF¹óÏ®{áß»v„Rúd>`‡G½Õñm-ª$#«Ûñm=$yitÛý¨ñÊwW¹þ]«“ôgòâŒ<¿ÞÛWw¤x—Ãø dWXÿ.ƒµ¯|%¼>Zºßæ±Ò?g­ËOq†ý<»M êëg†Ýövsÿ´ljº‘Ȉ3O¿â‰Ä|*Ü­tlSÜ™ØJ­Žˆô×SŒ}¯ÅÑé®~z!m̶@(Θ)O™ðó—ÙO@®3îÌ—S2¢¼à™‘Çû*IùW~ý÷#Û¤pñÿtÓîT=Fa꿷èЙ‹ÕºéÏX,ûs/ 4abõ`IÞ¤2ëÎ7…þûÿJžSm¡gÏgž?[¹äï§EB©¤6¾.½wKX1¼»bu×ñY¼ýÊFù}%­Æ¹Ý—œòÃúœPÉ3å_L[!׿®H#‡ª›ª&MûÅñû}ò¦É °èÄ-ÿšç ;Ö¯ §á¤nhêÖš‹—_ÿöžðÕ:JbŸ[+ò^7DÌ©È$-*¥\:Áhß«‡¡X©Þ@°|o(Yì‡yÑâÇÿè³ðˆ›ö À<Þ–,ñU„à ×öNìPh’ <$ÍO †4 +Óפ,IŠÐa5_× FÑäP¿åYû òæá²!oy™ ™I(6“PD&¡ØÔ¦¸Ô¦¨Ôæ¨ Áe–À¡DTH¸&ys…²FÖØÞ)o÷}ÇF« µãËe?·êúúàåæ…å¾"Ÿµ1ýóvføaSõ³îÙ;5/GþQïŠì“cÑÒo¤¨¯Å¦ó>\Ö™üÿV¼‹Õ{IÿHŸÁPT±yíŒðpl,ã}Ä,ŽŠ#¿$$5ëq‹ßL­Ÿ3YZ•'Ö¯åŸcX—3–5zÐŽCpŽ÷Ü7Y»£âW–áÃ0‡å‰T¼{ŸuEÑ“I< ‘\‘çòw’…ãüYVoehºÀFÆ"tD!²=gtè¿oªÄ­Y¾qwÌÏ·I{ÛOZº¼›¾º¿¹¦îÙýõÛ¤®û¥£nÇžŒx7"ùbBœ©Ù:6(¤M–Ü+ûÛ*s}ïX8Rºæ»~Q‚Ó‹™s{}7,†æóõÄóŸ·Qß_½ðÖ(Ocq^‡~œnƒƒ`%_íX8Zl]ßsìcñÍnYÖ±ø<¸â‡nÏò{—×qw—Ýîþ!¾Ù|ßÜÄëëíN7£¡EßßÝü÷ÓNqØåý-¿z7rA=º73INÝŠÈ#i[âD¤u}Ϲ9ŠŠÜ±äYC2Çw+ÇUt|v}¯û8àôö®ùp}Ϲ~ÇH:½ùä:™óäú'~V‘ãpúÇkîèÓyòƒ¿ˆ!üÁgøœ4Ä›Î]ޤȷ(i^\ßÃqXyàf‡/»jÈ+)‡¥iUÄ颦å5*(;våßåÝ}þ‹Âå˨C]Áâ{x•ò“ö»nš+¨Û§Sòr0¯¶Ÿ!ó2mÄwiJÖ Ç†>qÊO­‰ËažÜwž¦vüìŽÞvJÛ‚ó'…¸À•ÿÀû‰qš8¶/ã‚%îc zý-)~:¿ËêþIÊÁô_ögúìÐý¨ùöÐÿ þs%o®’4ÎËþ>ˆqÿÀ¬wàÈTÛ Tb qüƪVàJÃw%7¦ª(øñά0U^ê…<_–Ó4i²>”ÔƒiÏwÎÆb}H™´¦EHNT¼Ž BTé«'<§ÅñSw)ññBÑÊ+syÊ+}qbÏ×ý~qà×^ó˜Æeâý¯+ÖŸü˜ikyÄZ¸®N~=Oÿê¦nÛ„Õ’Eeú’!µ,âÇÐå4>ÏÆ…¡ì¾ÂŒÔ͉µµ7},šð—xT;ð<AŸ,¤PunD€ßÎùÓ?À»Ÿ^R©ùž°O¢¦Ÿ'Ô?N¾°±dn¯JøFà*y®LKbœðÏͰ;KßÉwá(cþáÖrØ ërµ9¡~$ é×5 ãcø †SòÐTmÅúÖBÝ¿cgà šû³YÖ¢vCpÊC’‘”urä=±fL{_B–xl€QÌžš?3(\š;G&Q‰¾³ºÄ²tAYKÏ›µÆ<Àâ_Ô‘¾þxg˜d9$õ«q>ÍZ:E%×qûrb;O©gIWX†å¬ÝÖ× K*+©öqCRÂ:VÁ8ynë/“Ä1^&eJب+sJÝá$#SUf¹q‘5G¨uÛ¿+‡e»¿+EYµùþ#Eœ…íÄWd:%ˆ÷Uƒ ¹b#ø—&9ø•P•e•õ| ÔŒXl1 ÅêÙêÍh:—6¾ù½Å¶zý¶¿ã'A¯4ŒõH‚É—šµ­¸Þi÷Á" %¿GÑwΣ;Ù†ìj2!W±¸ÔÇt&ÇØV´Ý)¡F>ÍÂg c~O…ñ¶GO©hÈüŠ…R¿@bŸ]Æù´q, ï,Ž€8ú›`éÇEëà F÷!¢‡yØé–„"ç:°Knu%YʰžmÙÝÖ’G’ø÷5tüò;6È%ÙÒ$”WÌMtߦ𴧤È3qŸ¨wØoò}õ#9ZóÅŸüö·ü,ææX0¢ñ‰>Š÷J‚›þ 5X}³t’—Ý›¿Y:°ËçkÎrÞ±ñmmòlŸy“4yÕäí6‹±þmÂÏ|÷6÷ëÆOºï¾ìãjl´ ÜŠðk¬ÊVøþ¸0F´¢_ú Kฬ»¢VŽUy‰G’wë^P~<Ú{GÁŸCpð6¡?ãÅŽ£b3ä@[«a#¸îó ÏÛdÏî„‚ÊøSø Ï)]7)’±Ÿ÷¤<–¥½-hÄ&¤Ã,øÓ(aƒýŒ‚GÉžø¶‰)Hˆ6Íc{„zôrÎè®Î™ß߉øíÝ­PëS’Ésáß+ŽHs²'®5]8Ø!Ÿ/s8eõe1]Ôœ– ý2g!|F•œfî¸x®i¿Ò:‰aÃPÌ‹”CN£–U°^ó.|ŽïÙñ«¤Y7Ñ^,\xÆs±½YÈ;ëaÈøšÓ0LüΘƒêG“·>éÕáùÔ†øêL<“m [¬Cœh²&Yèë:Ѿ:;ñ9~!vâê*¶ þT­Ü)´. qas­QÜÈøhÂäPAÅ‹12âÏuw'–ß}γªs±÷ Äú{ˆéw÷ï˜ù€×s£!òZÉ¢ã‹Oò,8#K£IiHÞˆmfæ‰PÄ?ó¢HÇ?”ÆüÔ”$$ë°^ð]B­s²|ZAòþ€'H`Ÿï,n>†,¢—¾‚,,5Ÿ†Å¹ Öí‹–…@,3®šÊo>ÌÝ /î¦Àt\zQ€?VZ¹¿ ZÐÔ36¥Wi¯›†W Ý%õ)ë_°>MÛ×-P â&âý¹£¿AÈ?;æ ®JèX6à—h âAÂ7EááÞÓ/œ§ñú\-1,ÆÆã×wêo]›}ÅÂ/:êgsˆŒ¼ïÎ ‡×r/…Ê}@íLÉ+þ޲_/[ðOÏô“È?±8SÓÏô½<²„Q…K.Ǧ™/æ7x7cÓ Ý[»ØsŒ ’œˆ/Ép½“/ϱ ÄÄú‚.Pèëû„ÆÃ — EзÚte°1/I¨Îo»ÒWRþŒÑlâ±iøÎ.4))¿|r?.~´0˜–~½$í«ñ‚»¼v7 …ÅÔÌÌ÷ýÙr¬¹EžòÄõØî!=ñ/}ÝA >®rʇ2ǶŸÏÇrN½ÒW˜âãÚfüì€éíŒ4ݜӆWº·qrMÃGGqÒúsŒýÎ ¡”üªá4´ªÊ0,ý͈4Ù?BŸO˜C7ÿ')uÂr–øê„“QÌñaëz-þt]sqžwÁ6îaÍx]åe‚ô\áø2Ññk¹/ÓâðÝ‘çXæïÓ@Pi‘Iàz¨»EçùøâÍÞ—X&¶à_2Öš4‹xøT—7Oÿý¿T``éû ^4ýTb€@ϰÐ3è°˜ò]~2òä¥mÛÊŸK,?C^t´_ÐäI¢>.^ U4xCCV0ôõØfâ†.þô…”4 ]Ø8d=¨¾?åÏÓ·‘þD IOaXø}fUª}úa¦@Æxù^Ú]íLä_Q L¾AsZ³Ì‚_ëØÌg’Bp“Hh²6? j~®n’‚_'«ôŠm“b†%;‚EÓÁFPõ«°-HÓ:lÞæŽ3.Êp<ùBMqÑ@S\4à}Œ…GKAHCŽ+rãÒ”5: eÐ…á9Oí^m¾ß=Ýܘ΋\˜–~{Ø>l°tZ—œ‚˜øQ¸â½¥¥9@ÚÅEI@¾~¡—ue%Œqº+ ±ë*(mËÆhMh¯m–—á9ûå IÝÖI—¥pã‹vW÷O;dénÏË?Àufíç¸áðªoQè!öPÀá„8¸IjïZýÎ'ý¬UCôg°ò²œÖ ‹|*œ\-À žó2ó€/ÌÍ/ã—F~Ë ýìïÂŒþ"O7 {G脇dþL¾Q<ÐxÇtOd¹FDó"ší;Š\Y–,Òð›dm«» x0ø–A/ ÛÔÇ"œ¯z€Ç _ºÃ´€ÚO>ÄèºT yPƒ¡Kë)ªåû(ô-…øiÞNt‡%6&% ,¡ÎKs\qÇ,¶xÎ v¿ÍöÏ“ÌØÞËÈ)¤NE^‚Eò†Â^º†‚žû L@éw.m* #Öe±&Ôžuº¹m¨ž@šûu6Ø!y‡Â^HK“C£ȲԅȔ( Ë”"sØ!‡ˆKç6¦ÂH (¤a5X×âPç›éA°¸œµÕ¡2_dcFñ:›€qG`µøœPò¿hkûî§Yeß?N~ý³ñ"{’ŒžÂH ‡=ÿí?0j †RûûJíïHµWòŽdH”æü‚ü_Pj¸¼òŒË+©#Ú_c°Ã ÄøÕ䙸‰—|2cüØü«V^‚ÃÔ³g}•=Ïk'öìK¦½uo|]zoõÌ/§“òã ô£ †I“²*óà§òò³¯c!G1H1®ÁÁŸëçòxx6¬‰°!¹ž;h´‰M‡˜}ó§k<óÃkÆk=Ul>cY‹Ø‹ â» |ψa1‰Ë×¹a²8‘êKó´‡ÊÏö͵Z?¤èg^×$fóM-ú×%èeXá€öôþpW¡€ÂS^|ß®Ê6/†*É{ CüyÌhÁ¦"k‘†à÷.o>RHi«Ø> Sã š;îHùå› |) ˆj[à`åQ@€©ú>Ûè¦Fæïóì?®ƒ_îuŒ¯¯¦U­î›¦Ý5Ž¡’|ž')N+²âžaô2ÂׯÞ° ËÄÆYhŽ”0T‡%s`«Ù‡ Ø×Ü|Ð —¿”ýWN(r(²P\KuÅßr§¯$ý)GŽn€¡‚È~OÆ«]“:|`œŽÑÉË Mó\?âéüÿx{×öÄu¤]ø½<³zÍdÏþHˆÓáY }˜/¾Œ-À+¶å–ì$ô¯%ù€˨Jʾ®™ÕÝX÷­s©J‡ªk³§ù0èìà~†;9‡G€ƒ/[ÿ´‘Ô×ÃØùÀå8\YÂqÛ/º’‹ª¤b*)q˜J†,üó æ~!ê'%©CDÁ€e‡òæØûzZÉO=“Jý|öæs‚^aü„ìp@ï@dœñÚ̓(f “ö{Óë“g•¡Ü,ãD˜¼¿ƒë×]|,„Q΂^W%¼ˆŠcNº™4ÉGaÇEè¼i B•8Œ–ÍkuÚ§ÁHqy~äAÁ–ƒ¡;Ý ¤A£i-YA8 F”ƒâA"”|.?\«?ÀpQ¼ .¡ïˆñsag†+â"ÁàÊæn§ Ì0Jþ.9¼)q ™p¡ç`X¼åŒTAƒ´vû²zy™3²‹?`^îpà<ÁŒ6†’J '*jÔ0‹þày‚˜ò 7âp™)”ÞáÒ T¾ÚÀ­cȾy¨ 0ĉ45}ÝÕõ!$NþÞéÞ^ô£¸¹VÅq‡kS¬Iq¸Å1ÇiOª9q„ÖÄGÐôPÈšGhI¡!q„vÄšGhE¡q„6Ä¡škA|o0°öÃQšGi=«ñp¬¶Ãšk9®áp°vÃqš ‡k5®Ñð<”&ÃqZ !j×^ø.z0Z ÁÅH[ùý¥ãè÷—ë=#ñÛý¿Lh*¦5ç´÷¹@ ìEÈ·±ê¯ý'MÃØ]Ròƒ1ð„à‚v1J÷ö _{^í=¼¹…͉¸g¹þÕçMŽ2+9‰”Ó2ÇcÜïíY—v”òjÖBÝöìÛ8½LÞ&éÁ$m¸d´õÙq9öóêÛÕøƒDú a½ æ£5štà—{Žî…¤Ó¦”fÅAô¨F’iŽŽX¾¸¡ùÓ Í?­hÞÅh¶j™S *ÑÀ™ŽÂ&vS½ŠÉEí&,Ñãjú0þÙóÚ|ó´yž!§t: 9WP_u‘NRãØüCý:Ô eF£àèŒíX_ uFæ´²„»còk™â¤€ÕÕ§v¬@FyÏ‘À'‹†&öJ5£ò¯3©"ØI𼘃gþz¼yYÁQ/ðœ6O/«5õâ!@ø6ìBmÆgf|žÑä̾(9Ãã»÷0GôCw ëÑbRÂÛ-ƒå'QÍ1sÔ.f¼¨Å¼¤1Oˆö±ïN¢Ý †l†hÔ oV…ÃgA¶'plΠÁÀMËIa7ˆ¤£ž} Ç¡3”ÀCëÖ×›4÷jÍnó„ûþ â÷kËRüö(ÝÊ­ ÊÄê+_{¨6íUûø,›+hs7ú62ô/ˆûûà ×IˤˆåN¨1LE‚‹bFZ´æ0’½ÅLëBqä—<ØT.p¦am™6B±ÕŸbÛ7‚į§»ßýüÅö"‡QÇc°1Dü’¾¨Ÿ¼¤?0Àü:”Ùk É/×-¤~4¨+­èºH=àjT»DGÀ´ñ­`1–ÈŠÒzÀpÝáæU³?€)tþa/1²G¾º×Ì«8¦}FÙõ~yŒ3ù¦8$êÖýE TFv„ññäÊ/I® RF1ùòr«þŠÎ·!hªmpFPASMˆPMú:ùÄLâæ‰p33ô½ ÿS}¸ž˜ÕÏ“ ÍÞ»ˆì…ŒÂÆ%øeG˜TOC"k¢n50–ùÇižøÛ£ßŽ!,Qµt;a:Ú6ª—†Xakú—ùåzô©_ƒjm‘ì<ýàÚ4Úô° „ƒ¦el!hõÚW½ ?roœíL™EÒ¿ÓòV+0. ßÉXÛ@L]~s@ Ý“ÿñ .ŽI›Š¤ÆíŸXëç±15Mô&{€éßÖô¦Š¨$࿨8@Á•EPš´|¤‘ÙQÄŽF“´×µb›¼“n$þlÜ^+“À¯’”Úמý š”i¦UÝû!u¤ÏÓÚh„hرÛëDÒ¼8jŸª÷BâˆdExª('aFWJ©1Bô|QcL*¤6¦hFšjÔ9mËf€Ñœ‹Ä41: P3±26l™!Gf)4S¼^«96—Ÿ¯$Œøp-bäSy+;Poª…"Êiÿeš~(Ç·ú©¿ý(rÝ•)3¸h­Ó-$,‡ô S…ÊF°¨¿ŠqXô{§5+0º»ì NKÚòpa‡ðcVzoÒ06õ*«sõcÎ¥wÝÃ!£XùÖNÓ Ó™û=ÀîÐ6B„\;CÞ;ÅÏ÷‹ç>-¢ƒ9Oìß{°ô3`ú—Íãw¸` Q¼ê<‚)ž@!Š÷osÄDþ1ô‚eG2nZ³ì“SC˜N9{W¥[p’YÁã,d$JXTa.¨ªBᩆܼÜW‘ˆØ°–`Fr ˜ ñT壿:­FÈõ§§|8õ…်#f@‰–ñç¾’Œ°  7åQ˨¥šÊíê­nu3Y—I|µ.Ïý± f}>H3éÜrÇ“´ÿ¶¤ƈ°™%KÒÞŠÅÍð{¬uëŠA—òo1y·ea.Šbß(‰•ݺ:BáÉmÇ~Ía_–RMg'Eª¨ÖäWÙ\¿´ç*¬hV*è\l;tœTɶ.ëø7‰¬¾IIì†o}—'ª-¼¼‹s.FæB8ˆ¬þ»_…Ê<¢õ€Hv5²j9’ál±še—¡ñeÑÇ>2% ùѯóùgH@> Ë–¬l[Rïw˘@è¨VEHƒ¤ÚéÂii«Ø”AÀm[²ò°fÇÐESÐm‡Êýʨ(ó“Õ œ¦äÄ2òÞˆRxi.¹vò]eót¿•ÒKëŽNútSß!¿{:2ÊøQ»û¦>öYxõ‡„˶ßê{¿CqŽåoh¬I¬Èåohì1þÇ ¼¾í6¬áË­ ЄÁºîÐæsO—¶Ÿš­Ü(Öo”ŸóhvC÷-Œò@ÿž]ÃT+“A„‡faÉä&ëhW%#ºYp™¬§ñ®’Ü3úJ2e¡†£ãÖNä3G1‹£Á;@Òn¯5<•ÜI×È ?”EDß3·¤å6 ”êO X‚H,Z4#* ÝÀ=R w¨ÆsÂ:ò˜#NYy‡tÃAþpœâ¯Ú8Â2ËêýGŒ2@ØgT½ Qé¸úŠ´jŸ2?£E¼;úîFë4{ ’8ZKU×¥ø\2Η”&%éæ /c¸&SBËÂeíî· ´ 5ˆ1¯Ú³^@;­ë¨Ä…jÙšþÔÌŽØåY®vñ^½×f:%¤MЧ~œ>Þ<«G4 ô›ø—|WDõe[&KŠÑýb1óÆs½o¼µÞx‚±®½Éf²ò\ÑÉ•—ŸÎ>ú„ˆ¯kzZ“íµ·þÀ<2 2Wt»„ÎÊgn¨B8ÑÜYWJ:—CCž’»U%]r}4‘¬ùnÉü![ëuÚ oOoðírGTêv‡ÃyP3ºœ ¼{ÌžÌͺ'}“é¡Ì“8ªæB5ü-•˘n]µ”-Ÿ5^#È…žqÆñ Js°-Ý£S²çêtÎM§ž1¯ÕT[Êçñ:ßx«åb6ÞLsÿÁ[nžzêÝ&«*[¹'u9ܶ€sê¦íæÔÑL“]TÒ–f¼;З/X\h£—”`éX]á‘nÖämoc?eH> ‘@gÎÔŸûŒ™æÓxËÕEMuWkRýþdÁ^ÛÀg¤6{¢NqäC¸+4·y¼¸XõŸÁ(ps"RÑìü@þèש°J÷ émM+ùˆQåtЕ6½xª‹M³tX°£àrXt}§hîIbI¢÷œ1È fD­”÷ïÈ ¢å¨ªÿž¤œ(< ¥ Cm*à¢ìY™$'`¤r,ì#¡?0{Z"K"£ 0@×-(ÁjfWÁ\ i(ú­vŤ[DåwÝ*ª¾MNݧM' vèê“!ÃÀæ•Áà~‰ÅÀ#CVfvoê¡Ç·€Ùô¥€[w†äöaÎ3ôšÙœͱ‘ç¨öTÈÑót½žÎ¿¢[¢b¡Iä«¡aÉó6È烜㾑¬¿ä¨eõ€Ê=’IüxÃÜj`mú&‹Þ"]¥ŽÉAFöÚ ˆo½u¿‹æ6E/`; ]h‡¯·cúPñþPô[òÒÿuqÖ#õ›‰eðÆSÓÈ//šâŠ£ï #AA|~ ¬¯ö(æ… MøÿlËXÞjæÅ4Š«“ƒaÇÊÞuË/×=¬~}ö6O‹ÿ~¶øþ8]÷n£œÐW°ÉêçrÄ@Õ÷ú ’½˜W$¦¹Tw÷®û’¿]÷¤øí!¢¹žß@.Ò !’Äé ¯!-’–Û„ü*iAÀXÊ/'ò¹9*rÈØ‹qÖ± ¸*/*c‰¬mNþ”Å?Ûxã0å ‹9úä#ußWê;”Ù€—}òêÜáäQóZ£¹Ä/¦—©ÿó²Øxþx6ë›ýý‰Ÿ§óéó˜/æ(õüåÙ[M'&˜u7î+o¶jVÝBZ´Áqù§Dü¿rŸ"¬¼L¨HºHÿßÙ"é®ñÕÏc¶/¥»Šax¹ËÒ`Yˆìª Òü„dûâ  3 –ÿ€Bïã½—‰¦ÏÖÊðÐ];¾~ÉtçµýÀÉCµ^˜&|™O6?—ž®»ûaI2‘eKhÍ+É%ÅDp¡¼íÀà*Æ¥7ą̈(2ƒ|Zyë—ÙЮ³êóŒj•ÜHþQÿÒ/ƒu$E‘üàëâ¡ão‘Ø\.Ô18¬C–?qãvyN¦ùUä6àü¯±ƒ›oýHLŸµ˜‘d4;¦´ä>6ßæÝœ0^¡pèXû>ã†Á÷8ƒ@ˆ òP{u1̦Œü­ ±m¾:#$â;FЕ4ŽCK'R~EÍ Ž©Øê‡<ß›¢}ýQÈmŠ<`AŠÇ™éQ5ÀG1 –d•h £€í[ ÒQ ž0¦bâañ¢‹ûÂ…Ý‚/i¬ux6 Á©b-ZíŠgð½–‘Þx:w`£á3ƒ~‚zÑLîI¼Ï¤z ƒmŒs ýmý"ðIàX Ùéü©6Aö"½1¢¾-I_…=€ ªHÄÝ?¡ˆƒ Õ¸æ :DÂÀy©ã BnD!L ž'%t|•ðVÂGX b%xŒ•àŽ/QÃ¥„—7G@iôyïp™pàòÐªÇ ÌPf±ô.‹¢›zBiÉ(&£˜ û@îǦ$m<¿€@õ=sL~ÒŠ c­¬ú^èuð<ó|8®á¹EÃËBBUŸztÀ¦—G×£]œE~rÚnÁÀSþ2`æïàB—Œë¶]Õ§ëm×êçñdíß߯×}§7à%b¶˜ü„,Æ« d}-×z}F@óØxñ2›yfò¢ÁÆ«Õâ;ã}]A+ô0?/æÀÂ}õþóÒ©Ç<ͦs`Ùfc¹w8‡‚à 7CÔg6›,Vójk€Z¡Pàq:GÔh9¦Ÿ=Oç/k(ŠX!:tn°õÀôÓÿ`úÿ L°B"߃Ð_ÖdãýUe²˜- ,ägHò§ÅjúßÅ|öþtþm jÛ©È ÿ^1óA 5{¾X=Ãê¼\-6ÞT¦•÷Íc™~}å±ÞŒç‹f³XB’¿Ì”øUDÔ|3@šXLØÍb.§<3٬ୟ¦à¬2"ò_Þ(zé~æáñË•·^c€+oæQH!F—˜"+©µ¦x 1%ЋÅL~ŽçPŒ4À çñWOÈV(l9žÂ[oî ÿûÓtn¼ŸÞ $k PoXíþò~úã?€éÿ„¥¿ÿL/Æðz9žx@˜÷Xyã¿€Íø†˜wlÜÉx>ñfP ¼Bþ­ ÅØ…“Åóó²R–?ÑñhÑÀMö0¦öâÃâû†ð¦À"yоðš«fÈb¬€Ó ñø`ú)´¡3Xú'o¶"ÏÀ!S`ÇÁì…æð<^ýEü„)T h œ©Ï‹¨ì|^|"æ CZ!–àª/–ފs| /™0¾M/ÐŒVÓ9°Õ„Z¹€"½•7‡j@& œ'(h9Ãsí'ÕéáÙlÆ+xF/PÑÜ3õ:ßÖ` uÑîÖ(-j W£Ö=j U‹ÖP½h-lõ ´3ÁšÎ¬·¬ázÈúš¬ˆ¬ášÅ®Z¬¡ºÅ®,¬QKó¾n®á 絨­qKÔ±F­WÐôàEmZiÖˆ¥fç+øª±F¬ë—õ.lÀÆçúeîLÉàÙ¼¤Ü1 þ@ù÷}ü‘fÕód3PÀÃ8º¤ènU7h;ø+àý"0\ãp“¡-ÞAà ‡{Ú,~ÁÿÄÿ‰b{ñaæá€Þ37ÿ¸Ø ë ¸¹Çà€Hr.~Eâž]1CÖo>FJ·9rZÌ_À²E×S$nÅ=!K$;'Ö/ÈY¸þ‰\hÕ¢!à ²ó¿!§Ó€?'p£uààòM£Ië´^ú°` >ÿ˜Ií’O+»&Œù6 ²W‚0³lDÛNˆâ}\ØìYlú®}aB’Âjä,άš —8‚Ö»– Ìs»6ü°„ˆÛ ŒX]Y½B’ÃaÉ'ªÙžø*Ž,½e$xbd6~ýö̓ZLñ‡?𪑟3º÷¥ïI8”H’ °IpôiYä%´À´Ì#ð˜!áYôg@ xë&rÉÔÙÅIA€ùì’€ ’â 8ßÔ“AªN†#‹`;ôXN ”þWà(~ücÀã$;DkTIøŽ#u¢ŠÀ—Ëeœ'˜Žy%ÀÆ‘Þ11â\áàâUÂxq_zõ«çŸŒ‘A¢ÿGPœ$p¹%ßrÃóº­²]!äÄVuß‚M\¾³ Os.«þlöÍw3òžÀ¡!0à‘›.£Å'£ð¥6£ð²ýŠÕÒ…±à‘‚§Ç)¤°r·Ðe:²:ª³æHA%Ð)T—ê¿Á¶~EíéŠIC±%‰Î©1- šÚqâ("™5‡ec¤ÖÍÉHžÔöžD¾ðbå³$:ØömAs;'õ²0ÂפŸ~;íô3uˆEˆd[ ј¶•mT±p0É`â %‰ÁrXBÁZªk«*tqƒ”"ÂR ŽãÁ¼”m¨q¬¡Æ&—À”9¢IŠ€¡L™•ôÇá0¸>,cÆÔ зHmÄŸ[úÑëŽf0Ï9Ѝh¦4 ²hHˆÞb‘!Glðû 8fà ݺäjGUïop˜IR ²}íÄXzöØÍ“^/ ƒ: H:Á j˜l_cäÖÏ{x@ÀP ÄnQ½¸Êˆj_(D~~DvA™¨]‰'Ù 6G+]JúÁ ©xÂe¼`8$(f9Õ…¢¸Ì@mPµAäöu!aÈ )‹C?¨ð°0Å 0,޾¢¬ B÷ÇB M0Pñ¯c–9+Ô4Ôœ8¡P& Êê& Pî5;ŠPh6¥÷’FCÑ–†Ñòô‘kgá‚#·dü@Bq¢¤]0á¸zLƒl-…Ö‚…â–DexzG!J~ÅQ‚Ã¥)‰pÈ 5pâŒcqBr¡Ä–€V`¡HF Ñ@Ž+]´ ex Ž@ü ò ±\a@±h¿Ô¼µ«ƒ½¡W²ô ‡Ëh»­FqJêPÞ`lY0²c„c¦œh\†+³Dª(Vl^¸&f$bÁ{‚‡b³Å¶ïÉ 0ÈCF“ DM5¹S²&ü/[YD² Å ~^nqòHqCAêòâO,×/Xû/UÔÔo׺ef~——·¯R¶ ¹›¢v[5n¡;߯öo»ßeا¾­Û+‚+$£¿I6UáœC2×ï&×_ßýÅ|Ö÷Úû&´ã xkoÏ ‹2×nÔÞ„·ÇìšžCƒÑY ÅͺøiðJìY:Ú8‘¢H7mÔǾ9S}xÿøÙïyê{šÎá —ÍD·“0€j.§öÌç!ÈÈ÷w*Ì¢&8îm¸0"ذí(2ª”ED©˜_1§a=A³QdÈQ5š²(΂—ÿB8ÍQ ¶m`W~'ä5Ò(ý·àiðíÿ´ZÕQPš,xè Îm,§IYÔ*˜ÜÅ$Ý¡g›ü[»æÁÑÛ˵™"6ãëXŸ šºie V±“Å5Z«¿íFüñ›fMÒtÛà±õlD‚Ý>ŠxÎzG+­›·ƒu­Ëƒ—í-‹Åäm9¬Ö¸ê-m¦òÈE›Ú·§Ýz©þ‚_3+x2ÊIH³ÈŽ&³„—±b°XÄÕ_2Í•O¬…Pã-õû^´Q'‚ÜŠÀl'U¬T¢Ão<œÚÈ+ͪbøg;j3†ŠßÍ¥ETÊ"t³@"›)-àt·Ó]’1d°N¶«RãEh»–š®–‹UÒl4{¥ÊF±S?,ô:ƒ…¾`§+Ø,ÕöË´Ýmµ<ÛIv ©n'Iå"’ôGl7ÁYŒñ¥ÞzÀT4-‚įÆÇ´bc÷Q°rUa¥|ÝÆãG‚×Y#Ú½#n;Õ ®@¨æ®ØÆ®ÐȦ®Àà–Ú¦ýÇ5Ûôú¤Fü•é Pÿ‘ÿÐßÿlá½8y2€ úÝè‡Ðœèž]_`ôû¬5˜HÏa´6o‹ÙÅŒkïêaù@ ¡ldº«2z ùHgfÐÁ‡€‚t¢a_žTö¦Ï€=ªÒCjIû~ˆÃC´5JNÂ8 úß¹×߮۵þý>àq8‘ò?zƒ°Ÿá»ÀI" TÁ0˜|*ÌÈ+âL3øoC5O«o"ƒ-G£ ƒŒfq¨ÛŸ —o8|ùzŽÛ,ȱ4ÍF¬À>÷º j¥8: ðÓ`¥Éx¤| Ý 8†ŒìµçNF²‘pFäó@»:œqøRCƒêv nÑEñ›Îé…!Ö¯ý#¢ðBtã°ä)ûvi€ÆÜ·”b‚a'D4\hævYá±rc _õ_6yË9G"<Ü*ïrkYõß„Q8A;¡û?þ†nÑH99|“c‚8{#¬°ã Ìÿ%¨7¨P@ü¢œÆh•k‰\ÍÓ2)âÑd—p›÷ÇíghŒÉ}F7¹8ØNl€`;±"-ò·3; 3±ÇÙ™°½ÕÅ"Œ­ü—MÞ;³ ·ÊggvàvfNÅFØ™èÄÙ™—;ó’j&^â?°`;³Ä/&`;³ÄçŠ5÷Îðp“ç Ž1÷Zœ¹×ÂÑæ^À³¼4Âòj¡¦SË0,Þtj¦S‹…›N-ôV2Y?ŠÆø±&ÀXO}4oARâ×­ÃL)åˆs¸û¿ÅÒ§âýñ¿õŠl õê ˜l¥Ò¹È‰²Ù`•}óüÉb¾ñ~l¾õ¿‚„nžVÞøa ÁM³v`sš‰QG¸:>øžø¤³\yf:ùLç`Ìf:ÿ -„ö²«ï·Âjñ2ðÿñ¯ÞÊ7Po:Ó8r>,¾Ïá¨ÇÙb±‚ÞƳGdŽ ê}ó°PL£1´”âÔåë®aaŒz‘«6xxIß'ÑÕwÅG‡Läã=$–#rU®H5ò}yM²z¢Ðw¯”‘tsÌ5`¡\$p‚D&Ô¶ù© ˆû%eµH9à+UÐÝéФ—›¯äÈ!˜½æ.©&y\Ä-O®¹>¥O.‹ˆaY»s† NÑëLJ52¯ûn'¾ö_««¾]_««V‡(W¡‹¼† ïÇê°Oâ‰eØ€ÄÔT¼|\ž•÷›]œ|l¡Óµ?y¯Æ“·òÿ÷eþ—N¤ ˆUÚCa×äWI²<Exöôv$ddäË`„ ã=Ðù”5æ“^t÷Œ–9‰|š‡4Ò y¡*—°“ü­X^:)Ù¯2_‡Î^L‰\Pa|9+ ³B~ýá„å‹`_ÕŠ†Õ‚ 2½äŸþöXEÊ¡¥îpW#NaÊËÄÔ¥Œ@aeïb1KaY‚Ô!…ƒ²£_]‡¼t²ż(‹8áÿ³-ã¤ÿì‚5þøâ?|â·{Ñ_aèZž•ê”x$ÿC·÷éöZLS²ë±¨C¨G~ãÇÐ8#uF%Ï×É6_y6¡nC¤çAV†ZK} ý(`{“*]@ÉVG„ bîÿ]¦¹XáY­ØBЧ§U TÞŒCªyAå”+ ‡C*¦7“Ën>7GH›ZÁöÍ[ñ„#™ x‹ÆÊze†3Ç„bDUfÉÍ”T]½ÞQ­€½ÔÂÅ0©ôȘnõ¾3{ !¤(ÅÖ4±T#“`«V×!xÔH4EÉ6>ccÜ!àãæV·©Ô/ Óî1¥ý»¾£a’”‘Ä0©Ú•1Lk*fhž¹YBSJ§Òõû®…Xø|"lS½{Ù L¥QèT‡êkŸQ ˜04Þˆ/ÿuFrRV‚\è5;CŽÊÀ¬Ñê?]Ê[\bºlƒ$qÂõ;ÎÛȵ ó\N(fØv Œ&“U³>™Ô£‡B¾Ÿ2&LJ!»k…·Õ¢l8;OB]ò9.cöê ˜\Úp²2“¯ÐÝ—7˨µÄ Yý“®êõ—^EúÍ6ž-kD¶åÞÏÙåK.<ŸX‚¥¥^ÜG ÛCØ9A¶/ƒ½›¦$$,ÕþœÚå»r•`Ç놫ÚB«÷ÎÕ Kµß e„é'´Wç´N»§!uZÎìÕ‘—î8ùA¨§‘3yÑåt(ÑÓ×<(n¨èq7aª:¶ã;!Íå^ wC׳ºã*t;2¹3ÎŽ6䎴jƒ˜¸f<º.f«¹#íŽÈ»óÝ­Læyðîf˜ÊËŽu÷€Ù”mO2Ùõ\äƒèœë$6QÃ'KM˜‘w7DµI_ý UÉ4B›i4šœÂƒÌ¾TªoêÖo·§`èC¦nœ¸£r ÏËmþ*’ºW'š<¦‡êblåONHü+dh¦<_…™Âܰ±<µ&*ã$rB⇗wGÐLõm-{¢úê’ž3BЬ×ù_ ú§YœܶŽáÔG}6$ ©_8ÙÐlïmYä^}½[é€FŹrÅu AT¯Y.è̸†ÊÑXbd/~³pÜNz3bƒE¯ðûój½»8Û6&Pý9-VoŸK?ä½H ÁÇý»°Ùl÷×ÕŽ#œ[¢4x©«¢”Ôs‚êRš=MÄì=æ˜3iì[µH¯^[õ¡#²Í&µ-Íi;ËÀˆÚB/›”[O´˜%]Ù€!ØYxô…m',£Gù¯-D^éx¤5+Ÿñ±\&9Ø -jɧìÒå‹-sÓžh¾ËžŽÉ3.ŽÖïyô`D$¤·•Èh *™<ì=±œíØ¢YT€qšÄbÒ'½¤¥üÍzM=í¢aÀGn§–·#ï‡7‘æ§Ý§v&pâ°„‡%/h*·J,¶¢Ntêò­ú«8ÛùtÁø0‡TÜšK^ßPÊYEó£–™ÜêwEU[Dh*~¢j·F€dêx{„˜0-Áh#þöX3AVÖk†7ßH¢Æ§·-P£«0ë–\ÜY™¹,ê Ìâk©o³†«%S>Gð;wT€ó RA¶'>£´ÀSy!/{‹ÍÐ$Tytñ‘†ƒâèÜßÀÀ•”J‚B†qÂr°]øï/_|Âà G„çI\ø¿J:ô<âGÁ º¥4A”[^`×%Ñ•#¨q*mø”„†¹ÐùÚkÕ·ë<êß'‹çåx5]/æþãlüµ×ýA—¢‹}XÌ7þx2ñ–ÿ~6žÿ%ßìa 6«Ï\¬ü?@ rfUf™æ¡ŸGC)ôÖe\hïÛ`7usCò“˜‘ø÷É©Io [ ä#HóúúŠ «¡ö Ýâ³?=$@ÁmJþÄIYm¸ö†*1ƒ7=`YŠÑ¾Zhl(šYâhÉBq…TûúßPÝÀ/…(Åå\!«ÿŽÌÃ@Ñtg–'— p‚ë„”a©Ðv§,Cäޛ¸à)ëka8¦2#9 äikÇ š¶´‚ó2M¦uCvƒµÞx³Ùt¹ž‚–fï$£Œ‡Vò-ôS_¡¼Y†#ˆÞ¹X‚ÂsZ² áï¢êãé̯7.ž~/VžïýêÓTèoÞFð@(Áóx6ý¯çšn¼õr<éo‹²ÈËb"Í ;CÖ†U¿ÁæÕ9OÅ ÞlF²8IWÞr±ÚLç_áªpõ'ÓÇGnŽÄ-泟þãtµÞør ½¬<É 4óõ_Ó%$ýK+ÂÏÜØt°´"ÖÏúƒ‘h!d(½¬=O†¬ Õ³ÎB(°¹þPŸ3ɸd`Š2ó[{æL“‚°T×9ª Ph"õ„¸ÿð+½¡ ´á‘ÿé9x1Âé-öAØi¹1AJO¤ýÑÕ—++¿ú5€<qãï"ÚÒèè‹u‡j‘!ɶ @ŒÒà¹bµ+¤:©®VÝî(³â¬®ž9kÇ3:ÿzóÝšÔU÷ÄÙE3ºbõð]÷´3Jë2Ê·´A:¡oLÒ©MS#0‰tΔi]Ý¿¾ÀŸ%ÔÉîóD“êŸÏ'r$ïá6$Uµ—rádQ¢‰Wä&þé¹Ô'ÓÉŠOÊ»Ïá Í‚wu½Øï Ë õÁê¢î•\g|`¢4I4S¤ý\/ÿ‡²oãapN©çÚœÜýÓ UFiî„èWIs㨮ï^U]CWï¥ÿ_ñ†â†_Ó]ñ<©5XmÂÚR=ÎÅàrDã¦H*¸`À¤÷öúMY_S¤C«I›FÓy§ïÒ‹ÿÚ¥ì_C.oSÉ«ÙÆgÜI'Å$sÊ©.èÙ1>(7t‘›FtÌâ¢w€ƒ¶¯ö!ÓY%Ð þúãSKÒßÌ] ø¶ñkFrÃò5#¹eöš°yN4æ$7m½A’HÍ&ÿÔÅÚumF9}²$©¶ÕØñæ@k¸6Ñ8ŠX}œ64òÎIo± ­ÐÌ™Ïó[öŠ;ŠyžGè€ =•¡~>¸ä„}N™Íd†Su¤ø—þ®‰uêÙ‘Kú{¡o;m‘¡t Õ¸¹p^ÚÑŽ&‘«‰Ø¡•ÒB¡oŸSjÇCº6Ä$¯:íK}caúÑé‹ûZmXña^gÏÐ]¥.ÙGañ =³9æä3ºäÄÛö… ùð™IIÿé™ÈÐnóx ·]p"É ÒóŽÃâ~m–:(©âr­µT¤Ÿ±ÔUÌŸ¤±T=¶ê¨›øœT´t(Ü;kê+ú½mI?-‡T>.¤­(q‘ÃóôÙûVmÇ8…W¼¢ðW&½£Ó“Cœ}rëïŽòXLL¤‚È+x‘ÌÐi/hØåÏ u)Öb‰NÈg¨ð=ÌtsXþ—ÚËxÉHdW|!Ô†ÍЮr›Fc-Ÿ¾ûm±Mø Â>&uP.O‹ýæ7[F)†""[îêZ²¦ÕNó@›Õ)4-Ö|õ俞Odý=xÆ5L"¤º 3(Óa|R#ºšKʈ$7£ÉRcLHæ;/ß-- ÂVÞr¤¨]Á»b-Š <¤Ã'ŒPÒÎf²B&ƒ)’È#?hrC7ˆΧìˆä28C†píóÀ_iŽ Hò8¡û’¸+ីj¡Äüs"þ) ÿ<ÉÂ?AðO™­’õ*ÿ à¦ù %¼aBÒU¾1¶qÖ ª½2WNÉ©ÆÄEANf ”¥¾¤¨»û >ë.>ÈOAž'q(_-r£b|ú÷À~EKzÉVF1­xäß ò•¨"W«ø8m¶\¦éðECwÛæöu-K³|V<ÝÅÈ”ÑìœlN3>éïXñlêXæø¼uW¨mÝ!z5Þêê á#!‘ÞùáÐxïgéq•mA¶#ƒ»Ù·¹:ïq­*èŠaÀ1#†èÖ¶Ì ›u×;h\`»&írѧ¡BJ=­«èfbõqR/ºíÐaÑÂo=Ø1'©Wvk®Ú%ÍŽáÁ¿ÙOÊÊG•c΂2W”i ¯¼V*Ű3ȧN?–íC ŽÃè´ÓÒ:̰/—Õ¨»ä±x]ºfì¡èÖ££ººÐ=¬gãqº˜'}´öS¥Ëʈêüa?§@βØýÛ‚êi³Yj=Ê "­¦k3Soø;0âÁân>ô2a²™áî&w3•s%¿:œ±år6Ïd÷“Øùü­ •ó:’Û2G+fËöQ½”HH¶¯¢–X6›ÖëI#󂘟f‘lIظOµ›ëg¬à“È—Íã¿qè°£ÃÑõ–&,÷|B(V…KPü«`+ýz16I‚\ ¶ ¿|ùó_mö n=uH/Ùj#§ó ’º@X–Ú©—%‹ õ~÷0žF>7³cåÀ2ìIqöšÑÐ0Hl¢ºsÈ÷q„fx•ùûÅo,ZplºBØôDK áÚ­ºIT$),¸ÌàðÚÅQôÊ/å&´Gt!G:^O¦SMÞ]Ž^ðK7þ•àpyv3’ƒÑé6ä¸: sÂÿ·Ï/"yÞ„óR3Îû׉æ«7ÚRZˆå)кY<ç8wž:›BËTSÔ2í)¥øÑ«!W¶N‹8K*ïÆÚ;oZL½@aq«‹ªp`´hxInôé0mÄæLF@TJ!ÞgRŸ×ê:\s.åƒrô¡Á´š ¤"h†–J?š,æ›éüeñ²Æd7šŸ½‡S¬ 0þe>ýÏ‹„nj+ݰ¢2ù GÃÀ÷ƒÁàÙ[㤠ThìÐÝÛA¬z\‚\!Ä1"Å.‰ÌÁu  ƒî—IEA¤Gõz ¤ ù€cÄ߈°Â*¡ ÞwnÞ¶`‘Ââq±zL×3¸÷¿ÞdƒÿåyK,v½YMA9O³°P‹Ô€1¹= _ÔAYPä2døÓ«ñ\R’nõ¾5¯ÓËK@HÎhNXq4Gð}÷e´ÿtýÇ Yfñ/ýÂuz!ªâyÉ”šb–0VEM»Ö'å—k…Rýê}¹Ÿ~íÛŒ9a:‰e¨Öµyꇇ•ÐÖ1_lÆßúã˜é@ßÌÓ>Îë—¥ {eŽù:žÎÍSÏV¢D?Óß¾£Ö{aVÞ£˜PÌÚ3oÏ1ÚgÁ’/&Àz#ÅÂÊû9fñ H»ÿ3OþŸ@jïÇtmžúqüöÁý´X‹j~Ÿƒ/b(Œ'OƘéÃʼݧ³5 G§óåjñUŒÌ5²Y›¯8Ó…yÒµœR€äS@©×‚6N=ûò^³/óõϹ¹Ðžý bÿs˜³é½Ð< ÉÅIîýð@ôÏãäë‰ù˜Í!‹Èl±X'~~œÎÌuçÙtn.¦…î°žþÀ.DÝô Px¹W´Y,f @ëÌaŠä܃ÉH‘¶V T¦ÎA}6_Œç @êû—Ç5 ùd=¤~oÆäÞ7@j ò‰Ôù=_Ìú‰H ™'óų÷ I ÐÉç‹9d0.–A¸Å,æß’Áz iõõ ’xJý2Ì7÷3H‡n&ãåø4K7 ¥@¤‡h"¹÷¼Üü„ z„H¾^€fÈV¹­ožþ@[,eá…ýoŽøæ­g‹ïÆ€¥P‚—ˆíˆåti>ÔÔ¤…¥F”HÂ6?ÅúÏãËÌ|]^ç_͹WÞóäé+$¹˜/Àä€!·’ö+ 1W À’¼~z©,rânà=¼ ºõ  à¬WÏ€¥\´%@ЊETðÍô–øañb^v±z>ç?W ƒ7?6÷€ýª—ÉÌ›†—ùx誗µ·2/ú÷ÅËìá´×ó¢þ€È±¹sð$€]÷mßÞÔqßÍÇP$*‚¬è¤T,»¡m/7õ» ®ööÏ>†A’ÄÊ4÷ „d„¯¾t^§;W¹æ¾"blµ€MΊãŠÇ¶Z$³«UÌýŠ"Âs4W‹ñ e†ã³"élòËõ(S¿¶¨¾|N¸ ¡úïÄ4„å 3Øâ„ø!#+ÇB ñBÝçûŸm'…üç9.Lû¯šÕ߮۫þý¡Úéõ§_ç‹•§½úrFÓÅ×>¯ƒð ©Zhš# ò¯Š‹bVçvyœ|"/§§ú˜!fhyu†[R´Õ¶á(³ìˆåˆâÝή*{;Š„ì ¬Ÿˆ‰cE@³Ý„ŒäTãÍÇ *z0I|ùоŽ)‚呎 âÀ’*ÞÐm©ÀV½Q1ØtRb7y¹Oí8ËËB+ªÕ×^a]}y›6 }²¬CpŽlÝ3hä¦(ÿ&TU:0èæÞ( ‹Êõ@é«/ß©—š¢zς·ý òS…lrœ õ Ã@ñ½,ï/øàéǨ„×ÖŠPÔ‚þA¯I+=ÆYAö„ùLzÓér¢­äKÙ+°|Œx  4}ÜЖ¥AQ;:½Õ·kÑQÿ>ÜÞ]ðê”#z‰£ƒ2th2pÙì ¨’0ÏÔOýÍØ|½nÈöËcý·ÞÑxŽïÊ;¹$Ö]á6¥ƒH{ÙÖ”ƒÉ{¥VF³ÌŒ*Â'³&YïŠjD¤^G$ŒÓ ±(OåY¬‘;H’$Ncéwï¬jH®ú&´yÒ¾(GŒìËù¹ÿ#Æ9颌þ&Yí~ðrˆ÷È¥&¹ôBm*ËZŒ>Ó ŠæG0HÚ0U­- ~™7ï < ¼}äôbœ„Z¼¦`lÁc.Šþ75N †¡BEÖ¹±¼Ì Ã@sšƒ1Œ¤ô Þ2ü˜Šôòñ‚ÅÈê#ÁvU™a ,³"ûOõézå¬~~¬¼ \­˜ÐyêQ°ÕšËzÞ Ýˆf™ÎsÂì=‚B„œ%¸|ÂÊ„Bö¤x'‰°À™%tgPPú nŠ4á`L–pp/eEŽ>LÁùåðþUÆà"2½SîATÁ<ëÜ@*ÿ-` ¼ 9É¢“jÓ¶Ü'ä$tð70.þ îéR× ‰ê‹ýFcDwø›Ù&½%B>â: r…aˆåŒ>™cœ'þÈâùŠWóžcX F¥÷…f¤^º‘ä—&ï PT“¢Ò‡ú…,Huòb”ö:¥÷:í×k£ý2xuŽïFþ7{Ãòô—ú¯…NXé£K_oè[@GÛëw²Mä/V¢áÞ)‹¬JQO_ÝF¡ÍHT†¨–ç*Ľ ’2´Sf΀¬@A‹ ñEë‘/æƒ •࿳ χwfu ÊÍû°w–ïëé-~zðî_¾ú“ÅlæM6š® ò 2󯙦]¿yãÞ‹<ýÉ7ãÍÚ4ñËTxéãA^"áIi’ÔÆKOÃ_$¾+s‘xðÊEÚ#ä·aÚ}À¶µS÷áªUvjwмÎhž¼*64ºý» f¨·ÛÀF‹’Cq`„jŸ·!1÷wBÍM„ŠlŽ·¡^ÍÓ_XºHÎaÝÍáU.3óa]ùò¡läWî||Í~+ùP§’çÛ´'ôõþ…1TZZ8¤hú†ÆBHÅ—nI„îàk½]o"]À)‹÷qfA |¹ÕiARf¹«0 1ërÊËÒÓ­Šg\ ··jÿ8æ'X@óþ+Õ§ëõ³úù«úÓZ¹N!ït9³oæh0YéCq¹Ô’4!¿õµ†ú]4ÇRüù=`Y­2ijwbéÂ;Y÷T +¹V¿êƒu”¾ ªP"=T¿¿lêãÔæÀóR§<£ÀŽºå¸´I27,¹˼Lt£^‚GŽ˜ÍIdè×]­.ZR E3gqÒ°£8ÛQk ¡iBš³dnꓹpÈq»³Hþ%¢2Ú¦^úô££Nž \†æX$(tÛŠAfÕ—¶1Ñm‰ÅáZqéÆÐ„öGÊ×k£ü‘ð0ȵJ} kÓ7Y˜¥ŽAɃ„T?äÝñkóñºÎ͇É1LȰþwÆqÞМʣA¡/¯)+úƒ7AðÚÛ" ’H/ÄRÜAt´§F¯¼…óæ TÒÓqÀÉ8¬¶ÙrÍ(Ë{X.[Pè…Ëϸ«ôz—äýé³ 5Jÿ[ãxY~¸.½üñ>ˆ¾Š?ëK¬½sãw|‘Ǩ ¹š ú䣴q>Þge‡\ðárB4ºá5¨¹7­kék„ ÅМdF©‡ÙÇp€¥ÖIÔúÛÕˆi~’=eqqHÅ” â¤Ù-½ØÔ<£Ñà÷e –¾¢{hJ°M‚WòE·ØÜ‚žÇ?ü‡éWo½ñ5sŒ(þò~¢ñKoµ^ÌÑðõx†-;ǵ·o5nÙjÜ®Õ8®ÕÔëÄ(Þ^@[Nþ)2§á«ß\°0ÍUAµ—=‡a§Â¢€¸²È:ß!é>Œ¸Â§¦Ñ¿ ™‘w($ß¾F»/þ! B(”‡ì˜ƒ? 0_¾üƒú×õç¿1yýéãÊ(p¸RúØrþë/õJPó¼B"'«û|ù7ª¼ î Aþ«_7‘_®5“êWñ_½wçòRßœAJ­®5ˆAd%o Ú;½°”°=%Zàz1<f”äí´zSf˜¸–±×cE|¸*òǧçñäbeî]|Z‚s¤~aÖ†fÛ U¼Ó[ƒ\…5˜¡õ÷¢"Þ±[ÚÔ5š~`¹>O,þÒ?pćë#$Y1ázX“b?’lsù¸äKÓî—êÖ5Ù5‹úË1";Žeÿú,‹þ¥­ ”eh7òÔmú¼ ÞßðÝxå—ÍÞpß<ÏôدXôðç–]m÷Z‘Ô7`XQ{_{BdÌ)·¦©×ÊÃ5FvÎèhš’¬pE§¬+.&®¸HUD7lRN8ì…ˆª,gµoˆ¾]ê+²K–Ie´X‹‘ö¤BB; Z‘_e­˜ ˜dcNª'xšwõ@ŠJ¥T„Cëià­!”K´}×›;¡ë˜é¹0*ÜT5/‹C;Æ\°±Ó@³¦sÉuuóOtóÕ†²(Å?-è¼vVÛLñUgl¡&xCPÍÆÈjn·\çÍmÏwòZ„kë–HÌÆÆK¨=“í<¼æânÈJ–8 êɾµ7Ï`4)ß»)¼˜à <’FX§Ô ׿w„qñV‹²çª“=ÑFdk*ÍÚ×øÆ6B£ÁÓ´zyªT<ñ:ç4“[^ÒóÁªËHš· ‰£—Õ M!Uç ¥3ª¿ñ}“cN‹ºa¾.+’Ò‚<ÄA.Ü’¦ò‡SFNš"ºæóãO_ݱæ4‰Ã£=ß²å±àM³3¹¡9©oM|ˆ£¦«¿8™Õ5oFŠöDç\Ÿ>¡ >Q,0ÿ÷î_.ë.‡¦] ˆ Eâhtö°Ô Å[Â[ýXÏ¿zœÈÆ}nüÑ|J&ké±²ødú9} ÿôL²‡ö­šã|‚$¡ï$ò+éÄÎê”ëóè…^çð Ì-üºy\³×ê«/m7R¶/)p>¹eŸÜÇ\Í?ú¬PógüÿE²½NÆ}’ìÓ³s`gRf¤¶]ó¶ès2ªd—¹ÉýCvÌôŸD.Kw¥ÄiSJìt=gcDôLáŽoV¦ÆìûÒEïÎD# ¾H6äy¦¿c1ám‹ÄomÌò¡mY>º81Ú˜åýÙwFsŸ–E-h › ¸LÆ¢³ò¨ylø€FWEëÁÒUT¦cQÇòL¯n :¿ª•¥vší±µ©©Tø"ßtë&Y~´,OÌW„öF¢¿ˆ-—õü¨yj­vmã¤$úK–†¨Zå-‰†4“ØŽ»µ:ŽDÉS5ÈŽÙªïý¼þ&åKu)@]{:Àí-G—ÑŒjôL8öd’Ô~Ä´Í„à¢H>È÷ù 1‚ ®Ž6ý:×Ww»üðìî„S~š¦A¹¦UÎs¥[‡Ïhq’EþÍ[W^å¡[´u!;Tú6tÝ,Ui5ÐýS°.—yì’’>¥}ª{ôŸ@)7ÅðöÿøÇ?>ƒfÄ¿y¿CopÍA›Ð½ÿ©óGfÐú°tÊZl缟Ñ{7÷*0œõíßäàÁ_·Ã'Ó7Á6ÝRwn9%n"mº$•7Ø?aŠðÓÊåž÷ö[[æ6¾°CúF/uÛ{òëgM~äŸE]Ó~†Ì·š&“¯SGº/Ó(ÜÇ2,¼Ð(‹-dD?{Dýåb½Áµ§ºwÜSp}+£ÍQãéÈd ¿zÈ ‘>yãǬäCh×ʺŸ9º§µüŽ&ÿæP=Ø#ú_ëÆ¯ÇKEÉxâý×ä·+›<­¦Tßt˜Ñôy¼üg_5΀WˆÑrµØ,&‹™ÿÍ[­§‹¹®Uoд ûvoaó\÷ªìR>»ËŠ8ÔíàÜÀ‡¢ñ$} ¨}$y ¨ÛY¼…CWÇ6n¢Wb8!ÍóçàS40rhSûö#/³=*Ûi¢•2$®$R¾J´Ñroü*©Æ‚!–QZ`ðIÌq8mÀN ² õkgpZâ ÍË-—Y¼?ƒ•G¼<BÔhΨ&°ð \ãèŠë„tCý8jc/Þk_à;ƒmL-„Œj´ÎÊM¤6ðêMä€ñyËIÀp’‘“Dç;à&§Lp´,æ¶²˜[Èb~(‹ˆ¾ãò•7®p¬ X} §µ$‰­ßÏ‘”áÆo¹å¡ÐšPà―0eŒƒeøY#°6u-‹Ý¿ýNL3„²ù4Eäí¯×3¸á#7bHådݘ_ÆK8„", ¹ïÿ¥(smœA-ƒò*ô˜{Enâ”|éÀœ`ˆ˜Æ•Ÿz Qõs!ìõ¾§¢]T'ùû!(´eºDäšòä=…ÉGÿþe:ÛLç½¥ÉψEbïÇÆ›7ð­ä2VÍ4͵Ñ!*‹_×£¼_ —}õ¦+o²Y¬~š”oùÓŸ,ž—Ó™÷`˜üqµø¯77L¼^¼¬&žIâ üUÆŒøòn¯¶Ÿ/0*6°¿c4õ9-YHLíj‘¯EÓ`‡/w»øƒp¦vNf’\^aVCù5=m´Ç+@FÞY0±´Ö“S_Ç3I]uvÕñCñ¡/bRéwÍê¯}¢þâûÕß«hˆýùuIÎÑÁ6Dç,°#¥ÌPÞÕ “Áü/9ªp¯‹¾}f˜QÞ µ(Ð ^Eª ´ª-ŒÈU¥.§˜×ÐujÏСµO†ï, 5Y”†y¦™|œ]X ›3†£Ú]êË‘3®ÓÒdËs_Æc öNج‡ö9]-” jÑxC¢.EµýmU-W£ÊU3×<…ÏHÎp<Ϥ–BtXH€s {IÐÇ'Ç”¶¸r$‡ƒR8ŽU2zYÁŽívÁQU4¡Ú; 8B›žè%ÄwÅ%£¾X‘JÊXȉs K­cm[š.½ÄY_Ö /‰¯¨lV±32ÛEìŒÌZ¸ž±)gm :dr'’; ãèaz!j VKmñܲúf>”$È8#숶 Z†ÑýÏ7Yv؆2F–Þ1)œ—Ûz_¡º€Ñv;·Ìc±ÜLŸ§ÿõœë3[}$v¦³žÑVĺÝÈ8ñV'r®:£2Rœ(‚—TŽô‡+Z+“q€×à¸ât°örbíÒZ¼…zIšÎލs:':º–Ø^‘î¥v9.¨Î† ng3â‚×Á¬ø.$+}ç+²9~k÷Ä$‰Áaÿ)‚vöè÷7šd·NÒõe`õÎ(¿Qˆ6Ý`)š4ËÓÀ½¾ÒϨ£j¶n]pÝ>?KkTÕîöòŠÜ^=9˜Sj·¤¸]&Bò0b$Õìò‘7ÂÿßäÔ|lÝÔ¹ËiÃùâ¬y’â¬ã;¼#ß/XI¢ø­º„ò)…—½ÅìSù›—¨Ÿ”°Ï?µÓ8ûÔd¸xZd0ðû¼Ðìoៜ‡6ª­‹,VÝ%ñ3æs›ò·è²­NSlP0\.»‹ ¾¶¶.È.)”j=ÚÆYP99£lF« ÂFþ¸àª¦«ÓúžÍN[LƳ5×q߯«ñêëŽúËûù}±z!™öÓ:Ò­ñmQʳpå9ò£ÀÍ-Ïë&ÌßHD<…ÜQý°ÀËwóUÌh$ANy<|’©ãX’DwÄ5:âËzÔñYŒd i^-ð¯±Þ%¬!\ÔB¾Î-Û5NpFòDëáB_w—ãAТFÛXç\À ë:»¸Íëý¾V“Dïaç6IÞô·(‰]÷5¡º,&冉ì·AõšÑx(´(»uáDƒ^:X¹~¢ÀÉõ)×Ox¹.C*fÕZ…Z\Éä­›vQ…`+÷ÎB·UŽß9.•O#·ÉZ¶®º*‡´lÉXM²‚‚ÂR.æý[ÀP9WÑšqPF…IšiÓ&V í6 bp ÔÐFñL·¸V—¡Ø²{4è=É ÊÐ-Ý2`[:ÎjLö)I·„Y ñ³rø%ÇM`†Ì0£DL‹FÞ×¼ DΊ ,W9p™cl¹ Í‹@òcîI†Gvu Ã{šƒn«Ç3p`ØÂê›_PT-—- øæ•ÛEÒ[ ]àV¸Z@mr/TÈ|ƒU2ÖŽAÙ)Hœ}ÎïLºÊÅÀQ«CÌÑó£èÚVèÙV/X rSÅ„‚ÊLöUY(¯ø(áV]ðé3pxɸ4ggEŸmÚ{ŠQÈ»â²'ÌgҮ赬{3mcy{¶Ôx–Ôc„â°×Ü–é©íýý‘~PAaÚ˜C¯Ïqèè^º3гýt1¯7¨r·#ŒDÓ…tÉß»0EÒÕ¤æ–Ñ ïZûx¨õDxö'ºŽZ@1Ù¾³X箺·ú¾ bèÀ•ÜjH!ýÑ!À('äT“æ$¬Ÿ;0Pƒ—- ©V¨"XÁ3ô¬”Ó…Iɪ”R»ßªÌôÔÆü3Ř7r`<¼ÇñËlãß¿<>z+=ýoïÑá9H^¿7j¬*¡¼‰A PÜÚ•äjìb…:Ujê4*Sž¦¹üË€âdJE>òDÆu·&й¿O趺waË$&Ü«ºáê†Ò¼Ù)³åJËDÃâ… ²œÅoC>8TâOGÍI?–j‡-ÞÅèÒàCT“ìâ„dÖlòF·ƒB1"Ÿ?§r;YóÝ—w“G…ØÕ¥`éÒ¢Gqn_¡]:`z•ï ^¤wÆ'Šç’Î~lÎOíîº;ªóÅÊ””: ¦d[FƒHŠ(¿³zÚTM­7#~=4¸]ù¬^ •õêÕYÒ.‘eû¸Yÿºl¶ë_‡Ë~ýëÙ®*ëõ¯Ãåbýkèܬ ›­ðëðÈ? ˆ¬L.bÏFÅzš¹å4r×ê¼ÜŠóéή@ ·%Æ\¦‹(e±®“­æÓð¸QÎØ\Í7jÂ…ýxçÈ~¼sg?Þ¹²[¢8û§Œi»à²µEïœÚ¢wmÑ;—¶è;[ôΡ-ÚåârçËYë;XÙïœZ¶wn,Û;Ç–mËÇCš?¶/? º£¥}‘ yfM­i,W®;+›ýÎ…Í~çÌf¿sl³ß¹µÙï\Ûìw6ûK›ýιÍ~çÔf¿sg³ß¹²Ùï\Ùìwö6ûS›ýΡÍ~çÒf¿sg³ß9´Ù»\ô·;wNwîíÜ9Þ¸sºpçdàÎÙÀ›€;;wNvî\íÜ9Ú¸sºpçràÎáÀ¼*Šå9tH9+ÈùLë;DbQyãùòZ·ÿJŽ–8ïÊ:î*Ð|Gç…¢y™¦‹· é³ Û£ òöOY¼ñdÁ9îмyüpÇÄ…zÖ‡)´ob4©åS$÷WüU³[Õó¬à„ËäM® 4Ñ\i¾^_i¿aX -iàEë9É9:<ú—x7Õ‹ UwíÇAšJÿƒƒÏÜMñ¾uµßˆ´˜ ̇äÂ0¶Dfz TçEŒæï‡Þʼnb GÁ÷Œ–ùöˆÆ<‰CT¦y³÷W`¡3¤ek9³/Du°”$@!…€d©þ9Ù´^ zpû-Ö¶„Šåˆjû7¯T°+é'?\ >õãÿ®óêšó Br"Ð!¥Z¢wLb€¯/ ÑÃ~Q R¾·@産н·P‡µßÑÞ%â’ï>íeÐ’Öˆ®.`fÕ}jL1•ór:*S\ФææÉÂIhRÈåü7ŸðBǺrÔ ¨¿é0b¥é { w†?rº+à×÷$®àÅó*-BefŒJ´Wœ{ZñéKAÿìm>ùáªíäÚœñ¾x!U {qÆž‘Ö½ìûµ'“æ‹øø:ä¡ö‚äÈfX´°&ýöAhü>‚óå½¶¯™RŒ fúàZíjº@}ºnÿêçñlã?L¿N7}.3»Ðfò4^ùÏãÄâÁ[{`5Ÿü\oVæˆÿñyI¾¼Õ”Øóû˜B!Cê’3›øãÙÌ<‘~²˜ÍƆÙü\ÂÏÞz=þê­a ±ænÆ«Ÿ ÐüåÙ[M' Ìfú ¨Î|áýXüjü0ý!§¢9dó´xY{K6¶Trü¼|6Çü‚Tï ¨6}ûD®ÃÒ§|îÑT¿9¢ÁVnÃ# …b)› ƒU^çâ߈CåVÝßÂ`|^0ý«) Tz¶«4ñÓòBßx¬¥"ó“»ìDô~„ÎÞ'ÕB1{CàÀã&Kü$Èöîÿt@9 àùÉCVTo`aä¹ô±c) „“G€mò„î÷õ˜íQ"Õ·-²úý¾y^ú¨¦»ÆõÇË0¼#k®Ô_8Í#¥…Æœì‰hã²kÉ&«éf:÷ëP̃wÿòðV«Å .8ž‚,JntW•„ øÎ€ñ4.ð4БWAê­pXŸâ†ºÝ¿D{­oE³nœ£á)6qJ` &#Oƒ‘gsY¬;c»‰Â_eÌEˆÑ˜&Z(#AAfÚUæ3K‡ÜYTXï¾æ61Cl%%l°­¥ '`$!¶›Ié±cBù9N(†y# =?. ëÏŒîWBu­öWe@‹’ ó3á\ {ˆa<;ùOèŽÐÃCË› ‘m¹G! |4HÜêT£wø†–Áé&A‚mh1®&‡8‰°`OhŽB»~#ˆ9T³`ÄW åõ(ã(|cÜÁÜËä-è9^Ä?Q¸4x%'A†çŒæÁ~àZð-¼Ä>#°‘ 8]ƒß–5–;Ž‚¼@ÉÒ)[?lœäg>_ltç :D™$V¶N‡ÀX3"³0xº4&CK´.DR«ö9£°©Ô9‘úhÈ$¦Hõƒ61tSyñŒ²›RCËø}¼šOç _¨jžÏõÎݵØmÀãp¢yA¡¡˜«%#ß+AÁÁð6SíÎR•D»ÁTŽâ°0ªA—®‡G:átÁ#ÏiIfÇÁ šÏÏÐŽñ ªŽjé˜V+b>öA kõH¨«BB€ûzAÄL”.–?y~»cz9Cåñ?N±' œ \”Ö¢]åQ»|&Ôz&l›@º:\©HVÙÞjbTn„-$ñ 7£…Îå« fÑ-~7ÈÛ§dB4N³%î¨/èl”=©¡gåZ&Ñ£ î±ôö¥csÒ¦—œÒÞZ å—8gæ$‹l9Ÿ6›¥›¶ì09iÇ._ägÛ_6¼ÏÂ|dG7u>ã²:ÔÑP:™ç”B³ßlo?/hÝÍñùÆ{#™\•ÝôÒŸ›žº¦u1ì¯Yå™üi"ÖÕ}­}N›cN>…½Þxž>زÿ§$%q3*ºTNzîœ0û%ÿé”3gDúypÂYÙPn±á’»J·¤uKúbµSCݲ[mi8?£ŸÔÓ¦Â5%ÍmýÙúvÄã(¢+š$ÒUÀ'”×Éä_?»Ò£:L®K&EñºÜþMB{V¥Ñ:ªq—ËÍÚ|A©v Ý(áçÌN:èŒÑø8J,íe¾&Ä=ïg4­ ëf}äδÈ3.G£ôœÒå(=cv2JÏÕÛ»%‹)‹‹£[naì¹"–÷¬"÷K”ŽÖá:¥ÍÂE_jÉÅú ÿÉ7ô$Ä~ï{P„¹kùkB' ÒCˈŒx2ÝÍ ©=˜!2¼ú­ÙQS¬Hóœ tÂ^_ åvuC±÷¶à¾TÏ"×€³ H¸ýæ?·ÚÃ燲ˆè;øÔ¤sÀö; ú ćë£ùãì¿ÏãIícƒöÏ«ùè¸Â7á;PýXùQâ.¬zåªþÁTûŒ‚T/§°%È„Ü1„ó²°¡)³’“ÈW'Þ0šá·‹ý˜ÇÚÿ…aŸÉäúت= þbzçi†‰¹¯߆Å2ÇÄ:Oq²¥½ºþv5§›ßïƒí1ékç3àB¹óÚÅÞ›[’p :ÑÝÞ¹+3$²sUÖH5PÞý¨ê‹Ïܮͺ$o1·¨~kXªKoÖ5â.jÄԨ̅P#8¢AÙ¦G}ý& ©$p•š„Ã>?FóóS“7.Hªy»1„•ãGÝã«!¨Þ¶BE1ÍñÜN¯` ¡p¢°âÚEB¹ÜâÎBÂÁhyû©ÎKQʨ4H¶e¹UËb™ç'Ì Ó¢ÔôjJŒÌÙn<], ¶e±éç‡GX+ vK(¢·% 5L5PN¸J'ÁsÕV‚[R0šâšnUn_Ž«ÉI]7ïÄúOßiVqÆÁëpË€]È[ÑvþY Ð Éð`nWv1p@åî …ë@õŸ8E¨þ£ Õê®ô˜ýí±Ëý!É;ètà]¢ÁÉa /G&GC™%ü•-ÐoÒÉ8ϱŒÖæš &@ÙÐ80J¥­ÿD) VY¸8,¶g£˜×8±Ò’%¤k Îl¨ñRÈgX(JÈK(RNK(^^¶h‹æ²0CÔ„H#±¦ÀÎG…EÎGEÙgP¬pN"{ß¶hsâšEûúBÂËm-µÐ4xÛ䜇»h^î¤y¹‹æåØæE ÷9]—á¡^¿p;¤sZxi^qèjߥxí5ÅéA)V¥@L§tpHÔe@ Ž+ °õÞe@Ïõ. ·¯ |"¬"ôŠo½Ç…òwé #•7T4“gø.P4vhý˜÷ÀrsxiÀø!H4Rßz*Tý>à‹ý z‰áPЀ_öA 8£Nh¬‹Çé=â iµâÐÓdâÇ ¤ú5 ³Ô@r®u’¨I !/‚ –ú ,9 ,á–€Ô$N©iº…¤Î<Þg%4KDöŒ}s@;’Þ9qŒíœlRä Ä_@©Ó?Ì“ï‚-‡¤–wáâ0 w Õz èK. 5µäŽ—©yê}V·ã “‡€‚Ž9ŒX¡u›Ù˜·†Ì|'ïV‚uiL“gyó_‘˜„€&>d´$À ¿êÚŸøÀ’ç ä‘!¦ Cëî¼=e½`§Ýב¾©c³‚äô@Ê ˆQd *L…@èÎF)C0]6Ù@ŠL*‚Ò¬/ &øÌyËÄtÖ|ì õÊü-&ïfÁ`NéG¾O~G–ìàBuÞïKZj~ Ô¸ÙÚeº³-õÉ,z ðúª“³ÚÉ=8Ǭ=°„C£8EéöoŽ‘ ¢YrD‚õÞqÂêÌqm+OS#dãòrKw;^‡¾à ª?ˆ¾lâEAqÝÞ1ÁÆ"‘ü©ß†o¾^òí—gñ·MÃpµ“wN AŽš˜ܯ7múZÚk_ʰÈA’øB‡ o"~^ojAøZ.{ªBç–ÂEö°-ÞŠ}ç>#{1Ð4^8„»Ü†—»]üá óÕ¿]òøq\Ì%·§›žîS!†°!MSšùí¼¼Tm†°WS ÖÍhzæ ŽÛ‚Ò.Åâª÷5f{Íè{&O]À½¥æ¢ü穳¡E>Ÿ;ÌÏ&‹ x2Mu§ißÑ€üñyüðÍ¿lëŸó¾`k'ä9d²Xy€ä‹‡—ç%ð¸XýÌ7à<æD.sÏ{@WžL—õø~†ÂA@O/_½åø+ò}¹˜®säÙ[}õ€Õ™/€#l¾@Tf¾X=÷ÆÒ€ód¹Zl¼É€Xç‹gÀ{^|ƒÔzíýçÅ›o¦ š¯ñø8›Î!y½Ì1½ÿ}:›A¦ÙÒÏ͇d•úçóâemyðæ?¿¯¦Ïâýð&/HÕ—þr±|ÑÄñÔ!VÓo Àúi¼‚4íz3žÊÈfº²Hú“]žBDZåPƒ’§ß l®æii½ÅÀÊ诔jz+d îeƒQM”f¨Ùˆ1‡€û…ëŠkÐ2$I@€w›W!Œ{E)l»v úZ·ë$¸ÖñºÇQ´ Â×`O–õý>µ÷ŠîŠçYýã±-ÒÕl‡QŒª/ÚÍ(#¹.Ž7˜ªÌ|²8GÓ­Hž!©ÛÖæ< úû\}ºîíêçû8 ªÍ…«žéà:€Éø–zä¹ÎµÖJšØG;:Í FHé*„Ü bm(¤`"Ýb€éÉw½1T¹ìt{£AJ_ÎÛ€“ÑD¿ŒÞB‚{¤…~•~…¬bÇiVmû»eZˆ±ô­>œ1ÇA}|k8.*Àh‘ Ê©r'Ó8ëBOƒˆÔ/ƒ°\(/BˆÀþ¨Àò„”î-1­Ô„S6‡1Òzk2îÉSÝFÕÞ»½…Þ't‹CÖ×GócˆÃ+?¬¾tJC3  yœL+R2hå¡®¨VÖAå”sº™à°¢®äø»W£÷k3 Ë| Õ?(Òà«(‡ùäó¡ö–Ä~•ÞïHMh k°~šd¯{Ûr ¼xÅ8ˆ]Ûd¼Œôd‚úzå‘•_2š¦qùˆbwcÝRÞëå¶,k\õ^Ê8 ¹Ãõ …ò>HXpÜ#©¯§ƒP¢³&4)Ólª}è2€Ú~¼5¨\sOjæÍ©\}´3†+dì'ÃíIæ—¢ëa(å´1BIm.ô£êîÝå.‘&}Ç׈¢Q-n¦~ këïÚj’Ÿz¬&õóì/¶èßèêàÎóû±‚BÀ€—9!ŸÓP¾;y±ïíuTÿ¢dÏæ‘Ï;8£ rý‰›ôº=èÏ=û!òñ–Þë§$Ý b;*/Á% àFÊ¢˜XÀ²•b) |eRÄuàÓFÕ¸çi®åÄÅ÷1cÎËl/W/IYdPŠP­òÃM9ïÆbÍÖœ1‡P|"­…PÏTc9“©`^JׇzgΪ~“îÖºP^³Çƒfø_«ðËÿi–¸aýMcáŽã+þêGT·•`JÚDßE×RŒ‚ðW3E¼ÕhÌôd>à£1Í2Ö_™1æ8ÅeF7qÍ1 „Xy%ÚÛ¢`¾ƒ:(U´šºNJF>â"¬×'„±¼‹¿9ª­ý\n˜^cÝÁ”©‰{餹ò8rÆÅJGmÕóä¤dúÈI`ª&޵›æFc°_Áª•& „I—ørÐûÅAZ dµ>‘Ž!\íJÛ¹XñhÝ­iüŒ¾±6ǽW;¯w@ã°Ž¿ô÷L‰VÖúÐÊB´r§¹Qù×qš»ÐŒ;<.ä@—Î4èÒYÏå.™õ¤‘áyhY¸Y¾IGr¶êm oÄq1m€cºf Û3g[cþD7š$qmº)Ÿ´W;EEO…^F“¢ŸXEH§ŸÁœSÛÕ³Ÿ—‘ðí³x‡œ›ºb÷ã¬ø”׆ÁsÀë¸a†bÊÚð ñ# órÊš&²Œ•¥ÑÇívn·´2:˜_µ‰\<Èø;aBĉ{âP†Jß×oŸÄÝ(•Vtyé‡Ía±Qu×ÂÏO»A6tQ™¦G'+äŽò›4ñlË%Mùä­º Soî‚T^¶ªO m©ÎS·–¶|¢T~AeD˜uáÒjû“;! Ùè^!U´ï#t&p{Ék©`'s{™«@LÖÓŽ¼zPü)ÔÝÀ†®©í7ÕÎx—Œ~Ý 8E7ò}FrmÐ+b^| o(äêIÔ¸å£ø­10σ”ð<‰›^[F¢gå™ ¸‚ù•G\6ÕoòÈm¦½êõY¹Ö¿}N¦Ç,t*É;„§t#©ËÛ9ÿvÍÜs*î8‹Éð»+nOÿ¬ÁŠw¦õElE{&s·;“ŽyWŸÔŸ9ä¾9”è]Þ(?c´%¦VK›.M¬œÒĉþ,‰Fc.ªº"\|³’¸—döûÓWŒò„è蘓—¡ü¶+ÇÄö'GŠrI5¯ÑÀ,ò ]rtT¤ŠÌd…]Q:Ø}:‘ÅÚWW8.¿Ì(0‰\±ÚßÔøÿyûÖ.ÅqdÛ”÷tõÌœs>’`2¹EƒÉʪùâelî4¶Û²óÑ¿þ*ä&±dEÈ}ךéªÂ±·^¡PèºpXX(ë¨Í ³®óWӛǑÎHHÂÜɶî·pŠÉ› þ>¶^}ä#/ ]ùõFƒQÏL@34]KßLvFšaiR¹ Ô7qÆOLÆòoH®~üÿ*?ÿþ¢uf¥ŸvÔ‰ÜíËÃÿ·!ÆEû´0GõìSÓER?µ2‰£äuüŠ 4¡5‘y—pœóþWŒ[ÿýo!弯éøŒð~Ũ„àœò4:ŒNVäA¯ÆÈ/7zRýº‚ÿnüœ3í1›…[¶Ðtv#PÙ Sœù…okî«‘WKë—Ô58ÿrW&U<<¨AŸR®(¬Áý OÍÊ­ÇžxIÔo¦Äï·*'~ |y‹hD™V#¿JË'ÙÁýà SxošÎYý6T¬úš×µpRdªÐ7õ·Ûú©_­v›^}ìâ¾î„'Š@zä>U¬èaÊ`¬ G¤Z6Fs¼z ÌßGqTDŒÈðÎâ =SÊ®ŽI¢ÇT™‡`1%µèä¿QJ«âýÀ",=F JØ»lNÊÿÑ”BÂ?Q¯&ê<φgHUûþzX–’Z÷Ï2¢ÀäË¥l_cöÆb ALÓ}¹RÄœ¥õãRÚãƒÖŽKFï"êЖH̘ ƒÏHš»aùÙ‡ Eô\lò´Hƒ4¦3@½O:|ÇÎY bt Ïu—(¯"dp)у±Gy„ì\ž÷ªÃXõ·[¿§þ}š‚¡ë}¼ö ÚƒSO”G¥G2ξzÒ0Ι£Á2RQîǨҮäŸ(ÈVÈtÐ$•ËØ•Ò¡JØ’ˆXN£`†O÷ÔgÞ¾ŠöÌY*a1‡ó÷üË.g–CP—ÿG D܇ CN!–¡QACFä4b1ÁÙ¡!a‹“„ܧiLÊk $R£YD‚nÃ6x3ŠÆP™,"Vx QB«,ñ+ƒŠe£BÉu gF* Ù»O ±œÑ›øD‚Ò ÒÍ›r†0ª;Ä©OF¦9)j—–p$è‘aÔä r«±RË©äž&°b:îçG®X‰Í¢à5fzä54Ü¡q´æ9ùüDFT?%¢Žü‘U‰b~Š´J|q.c"–h=#rаWNDí§òr_ù4jÊo,'B‰†;ÊÒw0·PAQ»4 u ŽŠ¼däÞöA¬Ü˜a w,NÞ‰ª~F%¦Áä&‘w–ê–Æ`ªU9GrO˜†%šÀsž‚™GÄIµ¬ #ÂŽDÍž»X–r"Ž–Íœê)äTO!·˜´ä,,´÷U£ðî^ÏN¿i>aÃ… iåJåV/·0A9¹MÉ)»X÷ hHr/³p.¬ D¿$·q/rª{Á‰³XÀÁñ#*˜<æ3XNœJò8-(Þ§–‘¨B6$°I@BbU/@x‚Ö(évçãf?¬ùx³!Ö~èlQô¤wÿ lFt40!/ëáhdšÍRÛY•Æ¢¯Öy±àf ‹»Ù±èfq+èE=['"«aDÖÃÈF"»Æ¹ZÂBƒ»ŽœR닞æe }#ÛÕ$4¶ÐÀÖåC#s…h‡]4òjàE£?¨“M·‰‰8›ÞFîläFʼnÀ”X¯TÝi=ð@bç´é›Üf8%÷k«nMìÕÂ%€ÂC>%&n¹)”‡Ô4XðY (é`pÒW¥ ˤXðÀÚÁÅÙŸxLã;á‘Ê`ˆZLA+Ú‘ÐtI¡Á‰% ¨úÑ v\ Àj¥SJÝÐÒjî&`”^'œTˆå”H †*Ll÷˜€¡”j±FtJ’¬)Ÿ £`Žðàñ(á$âAYÊ) ‚ ¢Z NõHÆ„l°8áa8+Rdp[Z±&]}ìY“®?LÎûèX¦%_gƒïý]³]ÑÜû¡Á:S=G0º›Lw‹õÊUÑ5 X¾L~¹Þîׯ™yÖlîn½uìiFÊ ÐX½é£3ýîlé,~ »ë8Œ‡a`ïWq íäAžh^ß-‰Ni0‚4á^_®·!°I¾¹ËLC ßÀós:Ab×xp䟌ž¦É!Ž‚ÂÎRÚ¡š›ëhc+#säPù‚xª`JFâGÁ9V–ó¬:šÓ4+™•%©|ÏÚ¾ÄOyCVrÿȬY:×ÐÉ<'ŸQCò'ûöÊr8j_;Ïõ“³súÆÆ¨"~ ¬Â­‰,ªHÆo¢1 æ†F(<ú¯:§··œÅOÓåÌ›®W»ÅêÙ™õ¼nŸ^KñÙóÓÆTÖù¹Ø™Ê~_,—¦²Â=Ýgb·˜ Ï¢ÜIŠþðz Ñ»(©ŸÉ½U‚õ:,BYa1üó¬ §‚éÂe©0™_M1eˆ‰/g.t¹v~:ÓááÕzu¿\O¿›I»ÎÓdó(æ:â?½édµ›nÉÎLz½š/ŒDg“ÝÄÙndkSÉÕúqíî E«Í³©ìÆÙ>ŠîæëçÕÌPøÙuÌJ¶þn&æšVÕÚ/–fJ°Ù®wëézi$ì®ç»—‰¡z휧Í|²0c~^M~Ùɽa¶ŸÝɃäÜ3ëå¶«‡ÉPVzí£zâòMFÓæ)óZEô١ّ|‹ þP¤a”Ír!@IY]Q`¯N÷0–Ù73I–¼EyuxDŸv-¸7Ôßø" /} [«öòú¡sÄ{†êogÆQ m†‘E¿!D1´FÖ˜ØÌxÖû€°È„I>@›÷bMÄ5qc¾Ê¦ù«¹dVÒLU6çÕû¦ÒÒ®K7&ÓD¶ð „èÛ›J›·ž Eä›Ú‰Ã»¶ ‡ÜÇiðj<"ëG|=ó*ÈÉOByLõÄ„ÁÓ¼ÿÛƒ%ê÷c¯y‘Ó¼‡Ù½±0;FæÌ,yÃÈ"rQ"rɱ<ÞÛ<¤eŽàÆâqê‡þÛ!Œcé SÖì˜gæÂb”p¥¢S| Tfz6gS)B£[!‹áý€S‰fÒ£„܆Õýű¹df¨Ö1j*#<áyÀ ©FnRsÕ„’Æ#š·ƒ©¨°žq#Çœ1Óš;gÿ47}eb‚†ŽrCå9³³˜›b:cêtˆÁÖ8߯Æ}~=D‡ÔT61Õ÷æÜ³^1_6ã3w®AÒØeÎ|³5€Æë»ßúîÈßýý€'|Awa{Ÿ·/-cpAz>§ %Å™³CôÅŠ*¤d–}DõkÇ8T&ÆÙ’³œ†|óstšò ”_Bða‰¸3§wÆûapmŽãAZ£5/p(ýH§Bõ+‡ý°?R[Û‰iª,ìù9ð9£à(}ž1¤áH0.l¥¹VœŠÕ» œ˜[Ñ@a½1Rý »WfYšÜ+ÅÐ owBià{YÌ—ˆiÓ5~7ò\Å<ìW~Mõ,2]bIÃåï ÓBÔCÎŽbÔ`¹çžù’puï#k>)©äs¿|ÀK½•5ÎIû¦“ƒül<Ýáp‘—סÓ}<8±P¾Ò×,ygÿÃ4±[¬é[‹õXuùDÂÄ4È?#1ò/eÌr ®MhàteGºù{g5ÎàblÊs¯ZÞ½ìÍ19å´Êä„ÊäÄÊüŒXlhÃÄl2Ô»S×ÒC8Golp‹] NÙ¥à˜]ŽY¼çˆÅ{Ž[Šç˜ÅrŽY,çØ5m«Î˜¼`–´9nI[Šc¤9BË¥¯cdF8C c¨ß0²(â %lL/$ŠÉa^ L¡ñ²2Hz Ñqa2À]¤Åß½vuÉdhëz §¡÷Q^œè‰ïã×fÁ‰£1ßrá<͉`z«Ú®÷ð@yn®…So·¶P®o¦ÅYBVVŒ’”<×\HºJ­T*i¦¦xhNVG1;“aµ ÿH$ [ :’®Â%J(qáÒ4ç% ¤›µ¿ý§0žñáÍ'¦²^uÜÒÀ&2õ&üõ#p¨Di§ïMp%“d.a˜ *Íøÿäæ £µ°éº¨×D&¾–-Ô ˜"@Ínm ø)WòwA—gcKu•§L‘‘ñBîà^Q|š/X•gŸªY‰`M̵·L8â¬Z‰9€Tê÷»¢ï¾éUüÝ\ô梦4Í0Â`°Kc~ÂÕü(b±€Íý2ŒÒzï9–Ð~ï9špù¶vÝ ü]uñ+ÙWíæˆö}hV¾†8÷ä?¼êþÅݾ<4Æ­g½Ëœü$a1‹N³”LâÒ8&X>¹—˜Ž”91ˆÎÅXÕ¦w̱lú Œh¶4Ù7;‰#5úÛ^y‰ï³±”.KùX9k¶àF¡åH\\jîxdr?€Aðè±83ÆÆª¸Æ?ªçÆâª_n£ÑÉ1e$«{Í•&EžÚ Wt¶F÷ŠìhÓ ¾2‰ùoÀó`$BA6rÍñÑ ËÇ.,ìê³_^8?#z]ºúÛ;×ü¾©Oh}Ð]á¾à|ª˜Ó)ú­Úž~ÇâÞ)¨Ë ;4°{^ >ÆéžSÆâ×ãN~.šˆéž)íñj%¾V^ƒp“s+U ïA`s|‚Œ‰™=+ý³A(5ͨXMò°0H´Ž©Ýœ®Ç±2˜¹×Þz@âšé+öžl ¸½Õ.Üœ%`‰ús9ç…¶ç¸ÐH12½‘D«Ý#Câºçœ±Pš¦×†€Ö½Š´ NÜeá ”ÎcªâŠ/=…_wìœÅõɧÛÞÑânw~–±D¥—:`§ £àÒì“ Ù¾<pê=-,˱^ÔÛÏ_q¯Ç²ˆâþ¶®¾Ý¶výû✉ÿóÔo»ð/¸¥èHÔ“ÌÀ"©×aìCؽPºN •;nsŠÂn¥ôu¸¨S§X,-·°ß&ËIèJ=ÐØzMÕÓœVTbáÀ›h×àÕ?"Ýãæç~…¯?Þj|óÁσ“(oPˆyž*É+’+4œz -ÒÌKåâSÛÐðüá¿ùðd3)DòìÓ§(!”2Q}Ô º ŒDæ) O eÌ>…•M¨ ÔH…ø"©¸é@Åá° Ïu—ˆÎ/¯8zÂÝ«öõz׳nÍ&ø­Y_z¬üª¾ÙAUâï ÙüÔ²gyTöºÉŒüt››êçèAÅç&—Ñgzë«Wáà€³JUMð‡c?ÍŠ5#(…ófA’Ù–¤Ó†øë²÷ˆj\§¼æÀN  +ßÔƒ9†û–³,7EiRèë"yÚžºé#Õ·ÛNRÿ¾¹`oúGÚƒ¹«¢'{`Ëvyˆ!„Чª®1ŽMâ,¡§-[È&qå–³P½ýl.>pXͰR'cˆÊX^Eúªƒ}Ú~©uce—;·kz/¥ÖX…ÖÎ.7忽n߯qT* ºÂ·Ãçt<µrsvæ¥y¨r«´xžæôÄy‘G™×Äm4WÊ{«Åç­.Šß4Ñ&[H#«§~#® Hz-\_¹Éó{x›gñDEx×ïh`Wò‰2_¿¼:صüg³þ×_„öómI.Ÿ6ŸÓêoú­Þ/\7$Á"yóã(”ˈOõ"îA³ÜMéwgæ=NÜGåÉ<ínñ主Iõ>ëHœÏ«2Ûiоæïñ>Wh|êi}ùóZç.8Eq˜«ƒ#u9nÀMF! ‡:<’ZÙ!NÃV5DjOÅê€buP^f,G"çµÖP¶ÅÚ¶ÅÂ1ìæN/ORMjåMhèKjk˜^²ÜÛëpû0††i °âË©ø³deÿè"¿ôËß9çz¨îJ:À b^?>j XF‡ôßM澎3½ˆMt‡"Hß±¦ø7.“t(³ FuÑZñ’´‰¥ƒA6/R`0YY Ä þ©Œ·¢>õBÕy¢^ +÷LqŠÑÁ`Õ£ E5ø ºV»xTC~Z%ŒhÔ*‰/k®˜4~Rð®dšÕ÷“n|ê±jògíC¥]è fRÊøÔ ¤ö¡S-•Ú%Z×MmTŸnj£þyÛ¿ö€.®på–7¶g…ÿæç‘:ºšœRu<^-†ã@ì#KI9<úç³OD–™ËúiÈ}Tà°*€Ìaœá RéèÇ$(x`­5dí4×Cq0õ:µ¤Œ‘§Áè­WÀ¸V‰QaêÐ>EIø©<°™ÖMÔBû9W&‘挘ô–&çˆ3NÒ¨w&¦1^‘½Ž/BˆË¿ˆV±ÄUs5¨z]‡I1˜þyC~;i?Mz†îœuÉî&ît±›9÷ÏbëÝd¹–3Hqñ°ZoéÄu†e R\®§“¥Õ“Èór·X.V&lp§è΃‡J"8˜Ö¼£¤:¬®ÎRåâM?D†Î1OBöF-FA„psyÑ‘‹6WÆåT”„ì…ÂÖnÎPâ\´…yÁ[Ód*Þ8®ùY­çˉAOß.–'ò`¿jÇP‰ ÅÆ‹ £ o¯ÂˆAB}c_’ …Ñ+ 6‹èìeÕŸÈd8ƒÃö˜tÚ'å)n¤ð[vdó¸ E3µ¹–u‡µöÙ@dµ˜®g¶ý‡³½_›ŒN?‡Eôû_„™nK©OB{«×}{ú¥â^È™Qò8U®1Æf˜ñÀÏ +´cÃÌ„#õ•¢¯Ò]4,ŽÍÊühX¾K÷7Õ¼•úU´êòF‚‰‘¤ a¥rp«=nnýÁCï o:ÿT&Öå¸Ë[“ Þ;è:£’$ˆEEÓó«‰{x’냆#3jšÁ½ÅÑ™[±ÈK#Ÿ#’”9ìø´Í³äXœh\¢YÉ5Ú¤©/£2Ø”þâíÛ8‚(á,/<Í{ÄpõŒ˜&xû( ñxÐήOI x©‘Œ‡Ð±ÿIƒ©–JPÇȳdñ~Y¤tãÂí Å@ðkQ·Œ'G=ƽSš¾ÒHm»—/³ÂÓ•°³Bχœ™•‘¡Š†Gì/Êó¿=§AZu7¨þÖ3ÎV¿oë”nñî+Ž=Äo~\j¦Å:øÙÿðóÜÿ$£Cö§EÚÍ: |ÈÓ¿XR_ƒ!1´·`hèˆ[$êVÀiqR´DÛÔØÐ’Ç¼½îŠG7±gb;û ‡ó›žx3µTÚ{žÆZhÐ OË„x¾ù©ñ¹é™MÃëÜYæU8kIÓ– s×DÅD´z÷á³Eu‹/=µ ¿6÷Ó{haù?ËTy'«Ðfë¶zUÒ°òu–ëˆêN¥·O q,=PP2@fÌ|U¤)¶=ÃŒMTCÙ”*ŸJ.as%ºø&Z /ræŸ PýQu 0K3¯sNQÌ t»”1ŠäãØ”:ÎJ~"'/ ¤ö!kDõ41%ÉK‘IVÀæ$&É6ŸÈßá= žù¤ì^À^{†K‘æ!A4'öoÊjªO=ƒ€üYŬ í`\1Ö·" )°Á)}W;ýú"â¢9—9€ª=/ð¬W¡A5!°q(a‚‘i…õt;â Œ0ò˜7æUqu9ž@8ç(ñcOs@/xñ†–|a˜WßaB‚Ïþ+kJD¦XD³ 𥶉$WU†ä8㵫ÂÜùoir¯y]ԹȄÆHörÕY'Uûe1Ū;4)åe®ˆÐS_aðå§[ƒ_ý<Ým—ÞýÖ™|÷äZHß*H‡à+rŠE=úIØ„‚½™ôCprm O¢ÎÍÓ©A¢`K4èÇb»{FáŠèÌrýø×\¹‹ót„ðä~»Ã–Û'@*ñì¢ä§Ë€•_¯p•4ß8(ùÇç J~±\âä‘ùÿŽMN0 ®óðØ}Ÿ/q¥Ø9HU}v·¿aßP€—ÅjúˆBx÷ŠC×ÈlŽk=oñ°Â\g÷4q‘Ùz^aËÏ>ÅwWþAø±¯ŒB¤€È¨,`¢Ñ°Ë¸jËüRùš …‡Ðãp3™”bq’óö×(&"yÕr8pîGœ‘2 WèÞ…s\fÞ!DC)m)þäeV ‘øòEG¸f®#¨ÆAÙÂ&à# IEõû°`‘SªEFü®†C ÅÞøÐãÕŠÕä~éxÏ®ðå\ÅÎ^ nQ›­3_üt\3iI~ß´J%nž? áÏ0Rkù FZ«‚ <îÚ„W§ö¾Æj©@´Ͼz¯áZ:®Ë¼è!eï hGð奊œÁ»9IÀþÔ<¬³tõë\dŠCÜðåVÃä¯3Ø[åè²üMq”û¿à6eÎ6yúñiŒpŸv›éÉO’êÜ7ª¤>Ã5Ò$!ƒ†t°P‘‘ 2Æèå΃¬(Ô!h†ñ,`Ñ =í¶²1 ì|Ð3ÃK¼cÎÄÀ©¾*;Ì"~J£íMœK²Ÿ] wA•¸Wáhé6ï{gñŸz ôv£â–Cu÷¾þÖk\à÷¥HYUÖ« ¸Í.pç—ÅIY5 ¬‚òà’¦Á9$àØ)N‰0/ͽF/§Ä)éŸ|î±"¡@)ëqzŒ(É)_ ÕÃäÔcH¹õp°Ø$èà ŠCõ¦§*z¶ò0 8ý†%EÈaýºŸŽgZu$:ÁL /t´Ó(èG¡Øô´Wiá–Y–æÂË¥³lYeºÚ²CYª&°ðL¸’Ì®>\ÑXn“j¬™E¼6°DÕË®· $<…ý÷@«O·ãSõsÁxµöu&ÓAuÄßOê­5¢Îš ( ^™â—üt[ŽêçÉÜ›,{×ß;°kùéd…’_¬œð/b¹X}G6“éwd®þ½ØL·»- ³¹(ùçÕâ' ðÃU¬Nö#îg“ÙlëMV¿ÐTÚ%”Ä»Ÿ>á w½Ûà ÿ÷·ÿýýqíäśϼùvòä¸xèÿ]/VÞ|±Ü9[ úÉ}ð–Uœ‚¾þ¬A¹BYîqº¡Z¼Ù¡°€ª †ÃÀ–¡×¾…g†[¬§»¥÷ãÉvv®÷àì*󦋙9O Ù:˜žÖyÑŒ w§ØÁíÇoFpƒ78¤ñp§OU¾!0‹µ÷Ýq6“åâ‡ãý˜,]v¹^oîE¹¼ùÄ݉ö†ðÐà·ÓýôU¡*Þt¹v~:S$jö z;³Z«740a#°ˆ6k®óo¬BU¸ÝÖÁÕÃç§·ë§ÉÏézµÂ@„‡0]?-VŠ8V* ücW‡j5ôgÛÍoýšwíÁÖ¾4~Yg2‡êïäöc.WÍÓ ?ù9²bŽ~DÉá‘°‚«Û¢QÃêzì(¥e†7ë·(Ð)åÅþ³Yt&@›÷#‰Põ[Žz4)Y‘Z&ËÓ"%–ú†&Ý8(,…¥s8çEÙÛ¿ðøefyN”¾r*Ò$FæL@8<ùl„@¢ÛÖ ¥Î„X5­‘EJÁ&p·ÀÚb KŠÔ§Á2,CgR$tŠñd›ç,xó!%U (+ÃÍ©ö첊r³p¤ÜùtÐþET-° 5Ž„i.Üéqº] d=´ Á¡ÀO² ¯0éQÿÅÊðÉXÍý_-ÙG‰°ÙQáïcFcØÇâ¯õ% Û½ÎãÑð7;tJêÜéäHp”ELÀAœhÕõ.-®34—bPéðдl/!Ei²£¤H‰Øæðj“týÀ IM˜3’5˜êY°a$Q›äv#©’j¤çü˜Š'V¯­‰äV&’Û˜)nc¦Ú¹2Wa}; m¤A›ÌóÖN½˜ÏT.ËŠ «J@±mU„(0[xí€õ¥µïÖå3 ‚·¯"®sZ°„'ù爄B%µþÑ Ÿæ@†àî:_Sí!#1¬¡À‘#Θ3ŽÓw/g%¼öSñC<è:šæ‰,ÊZ|ÓñØ*=öÚÕ‰qèFÏß°µ6%l¾—Śɓ±‡Ú½ö*(‹–ìÑ6Õ/ž/‚7¿`#2ŽÙñjι4’mhŠ¡‹&ë°^g³ev Œ©ÚõŽZAþî û¦„lOVs³íÂpÖì˜ûçQ|Žyšƒ#û},;ŠÝtc5”×4Ï3;WFµ¥nlK´“Wº,k·%-7¶5lO¢F‡­‰ªæÆÓäæµž½+®¦ˆ·³ø–£2õ·à5"ñÏfˆ?ã¨`¿÷gªúv›¯ú÷û8Ý÷ÖU÷ [îÕâ@ë0ÎØ+V0Õˆ&Äá¦W;ëÆuyÝíýàU5w2‹Œ7ÑèH„í¢ÓóYuÄÝ^0ðÇœý‚ÙiûMkص]Ï’ç]x‚bŽgOWæ\5Ç1€‡L¿Èk÷žÄÁX*óâÔáöK¸MØ J‹¯ñg?ù´åàAet»}'ˆD%^‘û ÷[éu2˜:wªiyáiÕ<íë—FT"/ay¦›¶‘4-6Œ¬èÀ~Ð<L­ûX?G|JsÁ’[Ñdyz”ëY§‹sL&Ú+¦•oYÏܶ#ÁkÛc´T‘~ &“£æ¢§’¨5Õæî€„ÜÉ·vµK0”±¼F^ù1”´ÃÚŽZPÐÆ„+,a<¸Â“Æ‚ŠáÀ ¡2Xdz &g^¢Ó„VsBI aâ¢ÚlVö±¥ÒRóÐÈÂÀâÐy8©CZ5ŽaøÚŸ hh Ô]õ¯jå<¨C]¢*þ–¦9±¢Yå(¦]Ÿ´Â<ºÇ,à‰ÓÐæ—&U ëŒåÒÛ¢fa3ÙºŽ7]/Wª DzäÌ™.w¿6HhÎ༠" Ò5ÒmÀïðÅœ19ÒJ¼­^Î3NPÈß½²O¤Qpÿ½\ì zúo§ À«þǰ‡€ëïЋŸ'õñTúYÔ:÷¦i5‡Vñ"Κ§³Ô í? ¬žu6Îeåkî›@¤&¡³þ™Ÿ1Ãü4ô³B} b/ÊÿÆrCmcámÙÚ·2Íû5ÒkÎÆ›Â«`dð„cõV©)ŽSt¹"º*ï ­*~›,íNtgwº]lv‹õÊ{œ¬fîãä»ãÍ'‹åswåñU’=4‹ÕÎÙ®&KÏÙn×[#1Û*f×Îò5û šBº«õÊ(—Rx-ó×M¶°uþý¼Ø:3#€¨½•³ôîò5qO9„ÜEÙ£Dj±¿gÎÖ Ø+Roã<É¿«:ÒWìãÄõ&ËÍÊ$ƒ ëLg¦²+ç‡ÈÙôÑë€ë§'¡0ÃÍs宯¢îòíFøwSáÝÒ}û %ì!Å¿áÄrþÄÎbnr¿XõµVZûôˆÕ 5ˆDª7IÔÍžÅÈ«‹7 \oœ•PïÜO^i숰“ó5·z~ºw¶fHOqƒ·GrºØy^ÿü¯ÿõ6“ínáz‘ù”`w·]LÑIî¶Ï.lÍ[× , ༙ ö¶Jþ©žo ŠW»à ©˜ù ?&4^&­ïÄ´KHÈÍ`Å$¸ à8`Žšé¹)¾¹»}ɯ)úìÁÉŠ÷õeþ6©*¿=A#>ܡ狥ãMvB‹ïŸwâoÛéãâGïŽTK¡Â6[˜ý§Má3çÇbJKy¶Ø:ÓÝzû‹„vVÓí¯ÍŽ˜íÇÅlæ¬HP8fô°]ì~iÂ&’¬ÖÛ§þAÐÏøÂÎÐb5s~«öˆ§Ûç{žÄ°žÏ—‹­ñEÍÍÖ«å/"¸:2»Y+ždp+ø•†ÿ%FZÓ œp}&Dµ×¼À}‹…`êuUí&Þd³éªW1ñOëg¡sˆJÿ‚w=™§íÎe~W3sñÊ šOOÏ;8=bŒX‰@Á]M6îãÚ°¾ÜhéÅ“c,=EI [m,û°˜Ë.VkcÙ§õÌ<ÃO¨âaZf繋ÿ˜S?׆—æO¦Íí-Toô Ïï—ßÍ…§[saŃ áõ!½˜¯Í…—+D «zîs¯úåaÆiξuÌ…UïíôK¿<šç£é0ÆÅ„‘Õ˜}û°Ý˜ ¯û”ô ?»æJ²}ùù€^c„Ÿ…ݺƒ×µ[w2s@ÝÑ€º³™#šgŽ07öB¸î¢æìM·3GÔ]ÏÐt?sÄ3¦È?v?Í…ëÎmœ•L|ÁtÁ—­âYí~iL‡ý‰ÉôOL¦gãç! qì\W@0Åg´Kù .åìùiƒÇx °ÞLþýl˜8ÑÔìvéoÔëêæ›Å+—<ªÏ½ õ§UšŸýxñþ½Å/Jð]*NÝ3È€Ö܇ yÜ’*JÞ<û ™¯Þ_B°„Ñ(<º£Æ,éËcÕö“1Kf]·–~RDö-=޾ð"doö•ûæç¢©ƒšé/¤ªxÖz·ý«~3KÏ"RÏÙ%䔀i º•ǚ·‡Y**-ÎqòósšXQÄQÂüÜËÙ±s–OCÏÀÅðP±Þ1OËLKÐŒãOVqu5ž€×¿:džµö„€µë7Wv·È8)ßýGÑŠbÜ^ Þ~š@S g‡41–ª3Sý€&‹¡y™üòæÛõ“÷×÷dªú"W~UyÐ׈jå¼Àw½´ãØl×SÇu½‡íúyCgZ{/‹ÕlýB`ð㘅›ê_úÍm,Ñ]pV_F“U÷ÇãËåÝTm¬,4'lôåù¨|)½Ìuw¤ÅQÜ5+N#d§^ʺn†ÛÁIjߪ_íÚ´‡Þ¢3g7™>:³Æjà{ûÌù±zî|ª>.­-úb¶t¬IF]6‹ Ároš×óIâlzOEaáʤ½ Ší-É«r‘ÛE¡U²Ô&uëî]Ñp–„މo‘+ÃÐRD‰-ÝžT›>G‰•J½ûª,=Zx/K¸AeÝ›ÝÝd»›CÐ[÷qýBõ…:,»Äü_:Ô¼ä"Ù\=+Ñ£Ï~þJ*ÏÉ `“:Z&-KLÃê"¤@áª×{ªŽêÐðj¦sö®<$ªÃqQØ”^Á”Ëý(—‘Ðs*'j‹¦© §©âNhÖLPÆKÓÆ Nlbù_ry;èÜ7'˜Õô š•Ç^oî‹|Öº´Ïû<_.ܸrõÇ[o®ù0m"Ÿß¬r\Ao1ò`bUUŠjWÌ›À¥ÛÀª³£9cä„%Ã1N÷~lÇÏRXR$i2‹ì³¬PŽ|j÷ó¼W<ë;ªò¯ô.Œáš»,8báာ°¶){n‰ßj__” C¿ #ÙL3ãg‘§yâþFLó°÷9*Æïrgx(‰Aˆ_Y$㌕Q\ˆž\¸Êí2Jí³`iV®Ñ0ly…°I Òì3ާÂ$Ž]5åãÞé¿åt#œŠn^= o¿ Á„Mi{ªIž.¶‡ÐÄ๠tÄKåe°[ióaÜåqêÆ¯’ÎY–‹QçÓ,Ûà}ùü3 ŽÂ²Bí›dé]§¹Ü„7ê¥B_á‰PôW¡éÂÐgÅ C%ú®wö?DÎsïrkÏ-˜þîÅŸ¨"ˆn§Q(ìdûº£!²~t;ž2†Å´V Q{Püµ`ç*ÖŒ¼º`A€Ës–§€G rx6žX¸Â xh£ïBàâGzÀÞ£"8IoñÍÇ´:(8¦j¿£3›Å|ædÜíOì1ÄGp"Xh@¡¼±zƒHÌM¬QãbÂRO”@ø'„2Æ>/¤aÍã›C™ªõÓH¸½›?$-,VséÈ@ÎΟbÊçˇ\Œ„¥c4¢€öLÝ<ÓôAî2xI׋lùeÆ2‹ýîޙʊad䢙»ÿÍL웑ا,<Â%áäÑš7Zs«Ñš“Æ?Ž8uâÔÑ#G‡Ë¡¹ÁfoÎiŠoè ÍåÈÝdq‚ílãá 5Óm !®@L«1þÕ¢ÆEx÷ó1¡ãý›ÑÄ0H“CtT­¼U_ûÖßê/žÜ6“+ì°ãÂ…Ñ®Ãt ¯™*?þê<èa‰v±ÃˆèÍÏíÈ¥ižC«*…ÊáÔ :¬ë¤E©ØK?¦2ÐÁ1—„ÿ¢ džÏâ$úì ­g©ò@¯NØ«2+G!…BFnj»Š!N•ÖB|ê3ð³=JèHìÂu!6Í”\ÑO~œÐêQ£îÎð§æQ&S Õš±¾r~8[t§Ø<¬‘€Åâ÷üôÜÅtËxZæ›±$RDZÓ¸ë-±¸O“åÝܵÐaZa]ÿ¹26+GªR)üo^¨û6¤àâïh|™ÉmðiîóÓ–5¶Qˆ¨ko6ÙM¼Ùb‹«9 }\?9Tèn·ñž·KÔ}Þl@Åð ‹Ì}áQÔÚá%Hóð:*1k ¢Ì/˜wÙ)sFàÈ\>àP­)E€Öºs¶²}tôÃ0—qGÍpfg"¶¾iæXÜ<¢ˆ÷7¾°ÜÝ×ÿ†FŸÖoœ!ºÆÝ`by±Hî;÷ä0½×0Uúw¦!OPÂcÈœ÷ñ§çs¯óØ$"%x‘%Ýÿ¡õHµà7 tV”òØa{ÆšN ™âáÓ² €;r9 í ÝvÔqÉh¢°ÊW](§ A#b1o¦…`¬|›¼@€Ï?€y‚×t—òþÏ \hòB1kŠb*ÿL a¿ÛÇ€Úh:p}¢´9ˆC‹b³ ðà–÷9âÒÿ$Ô&MW÷‚s:Ë1ÀcáÁfÝþŒ ‹ÐÉÀF±:îŽâxAÇõ& ÷qÚ-4¼ºŠãÇdKa¥ÿÕ5,»QöŠãn3?Yœ žç5Ï,Êù:q?ù¦>>Of:¤ù‘–uÓüKX.¡pu-C9\WðªX^öXÓUW el‘¤ÌƢ㬰'+“8õC ÄI“×½qsûCZi4,¯'Îu(Bž¡¤¼Ìæ™_®ZÚ 9â0¯^|ÙŒ\ƒ‹8‡›…†TXöܻަ€ËD’DÐÐ`awÔ+ó¸i C½Q'W)·3¹-þÎIÞ¢«õ2ƒå>Á–»—úß[9•GŸ•ýJWžHÒË>yu¤Ÿº>˜12kó«=_tLҜٔ'û¬^D0„﹟)4¢úØ£õ‡øË‹øK¦jü. YÅÛs=Ñ;ß…"©o^cè„·{úÌNu¨+ º0O3ïý$¾ö% 6ö‘ùŸ(ü½m¾‘òž¥!^X/á†À“J0%hTÎ"K‘˜ñG~,›°ž0ZÁº$íÔá ÌXr&f5ܪ(4}¸Æ{‡4Çs8oµÍCµ£DÝÉwÁˆIÂé5RªÐPZ]/Ó*ŒªšD×t‰†÷fÏü ƒÉš¹%wkWÞ­]žéf±EÒó~¡ 翾½· û´Ðv! Uî vúìœÒæšáÈŠ•ê±O|¤õtMø¬--\ŒÑ½° Gk£eááx”§ Øe@¢¼·n€æØ²¸¥ É5K::$³¦yf¶wÆåJÚväüŠ”O“´H“( @P ’±üP¹&ê+¾z.¹æTmtQ¸äê×É„fY)uCíHÜÂyÌX†/ò®`‘¡eP´õwã]Ü"ê*À%Ó¡*™ …ÞÜj5Ó4Y®>Äs#JÇ%*z]ñ³zæÒ}•¿óË"ÍáÊPÿ´E­®'ÿÍYÆüëTŽ!®yš­hjGÑ=ÐK&Í1— š`^£Æ.Þ¶uõí¶±ëߟSG¸$ëÞ[}]l“꺜 ³ ”;gJHÿJ¡Zü®{G¤w¹Bƒ=û\÷î‡Y¼¢Q/ÛÅ[ƒ/Q(‘Z}­&P¨·šÃƈ¯zЮú¤)ß7ki¾¯Ë2‡â÷Þ&S‘„ÕyleC‰ïÊü÷Y>^4EÕ2-‹®]äBТ$ª¢«ZѤ‰wN›G[&íJý•ø¿×®9jtµ—z2]A/è;mŒf•ruð¢¯â½µ¦@@†³Ÿ„(uï' £n²•2:U³M9'gg4NøuôŒV¤ãçT>‰>ZÁùòÅdUUÉ—Ž@’¾ŽVû–Ñ4|Ì:çcÔù2õCkKrMõn©¦ëúÙ B^ Jê„[€­kãšd„Ú®UØ,z†,3ˆw£ÙÀ‘hž½ÆñQ˜ìX ¦®Ï­ëçBC©¡4)´Þ#¨½ øx¿^Î4sž Á rž*Ž™Aa{³ôõþæEpT2%c[RdŸVgÑþeÎ,9ÄT7àT1õ]öoW cWðˆ×’†Ý®Ÿ&+ôàŸ£8Ro’ 3è ‰!¼H›ˆæisÿÈö釶_Ĕݸ#òTýU×+¿*˜ÀL¾ÌÍéþ,á™äùœ9].4þsÔ ~2®z>ŒÆ5^î`U¡ );™úAY¬98Ëm«„·©Iáïí8b“§Gx¯^@«|¯»2…£aÙ,)‘ÅÍ¢„jk,Ý‚5dæŸ1£åw†Î€žDô ˆçéUÖÆ`j—Ñm‰ŒX=UìÖq¤É ¢Ó–™ àC¤‡'Q#4OÅcÝ8¼±Q‡²c*9±T0Wx‹Ø;©5໽jÑМ"HãòœX’TÇ<­I ?8Y’°¨ŽÂjArHƒÒ–C^Â霶 :uÂçÐYì<¢oÅiÙj«9]ÎŽC{s6Å!XÝìpÐýÈ IóԂ✾Ùvõ¤Ù£Sd~n¯/YÎÞ,)`dÁnqƬt‡á<yrÙÕ³ÔæBGöZ{¸ŠôxŒí³fŸ¡ÑŒÂ?ÊPÏ#ÐXzéW\'ßvPýh\& ŽO:Gu¯…ä²ÕWbìᆦº[5–¡‰€w»ì_nü䯓§ÓûêüóEØù÷sÿá«^„ûk55Þ™Kârñ2YsOÛéóÓ|éüÄ#P¹š®—ýWî”ÂHú§§ FØY×ÑÌ™a¤×Ñçû¥ã.'î#‚ªŸ·›lñTBÎr¹Ø¸ ×X^"\¬ÌågO“íwónìü—”ðv»ÞîÖßcÍ~Ø:¢;o‘â¨L-Vu]¸N¡¤ï„e?`µ^‰<=-VUžÌÔò~;™:¦¥Y:óû¸˜ïÐT‹~ábdqäóNºtÿ}o*+ª•!ÿl\ÊÕäɸ‘VÎËRäÅXÜ8Ç«5®W;o=Ÿ»Ž±¶¬žŸîÍ;ïÊ“¦Á¸×SIá˜L}¼GÕÍfiÞø ‹"ßN„á|1–F™€íâág.\!ýt‹è§®ó´0–Åøx¯Á]ÏwÞwç×Ëz;3Æ | ´wáî¶_a·XÎŒõf÷kãxHÏPb«õÖ8™÷æÕ²¨êÿõT¡Uzäë¨pýS(ñ±vð}Øë+Ž+pÈ y7 ÒPóVˆšàÈ5Ñ“¿p&!<;'zÆÏ,KBùöOuo,Æôp¨·Faü¼â3c#ò±Ëñ—1»7ÊGá#Ú%Õå‘E/­/HØ3ƒq¸z¼Ñšr\M<óãXTã*´ ù7J…ɈÎce«¹Šæ’–TÒëÓáëAÔkKC%(öô¥‹Ø¡õ¯˜b8ÚNJ$j†l"œÜ5žÖ W0É`z#TÂA)èhrÍUpZŽûñ+=e‰F'|yù²ß{¯¾÷ûïõ·Y ôçmÈ¥^ß°Ë£#¸ å?´æË˜+J‚¸äõ³%$:‹RÕyÿèXT‹LØÖLÍÒ¸8^&XXnÍ7V›ø Zå•M#¤™ë7LcY 7ñ3~J RA0ÄØ„ƒk^‘ª#¢°«jNsµÀdÇ5‹»Ê†±*èÂå…uÆF §Ö[ª1³fß’úµÖA¤íZ‘XÕpE1RM4 ´Úèøù4Kxa)Ò½D×gˆ®š{^Œ Ê‡ÕqÀmˆtÿìC]Õ1•«ÇÆ[Q…Þ™Õ&͉ª[²E\’i6ë†äo/c>¹–µ!¢‡ÁiFÅþ+óxÇÛ2&)>ûgKÅçí,Iü&j(Øçš*jp@î¿I—YÿÝH^„°ÎÊ»¢y+6çä§Û¼W?oý÷MœØ.î°k3ĸAÎP‰4!¿¦~òæs ðäg +÷ßÁ¥Nå]~4º"*º:~°àÛ !/ÊÛŠèS²~”Κªï~"Qì%žîz.KÕ+n ÜQû¨‚ ”©Ÿ‹R@°µ÷‰l  ʃ‹iÞ¨FBx«£X`áŸ3*ŽcõëE^$DXNdJ!;Š*äXPì#Õ;.8ÄÔD¢Ð5ªÇQà©@°%‰· €Â[öiÄÖèæ DÐ:€i\7(Íñö¼N|ýÉ× `!Aƒv`GÁ2¬IŠ%” ŸÃ‹#†€¥EŠCtîr#@QÈ(Ù;¥g,i)"Ž·‹x´Ç&fdæ`«?12 X·ˆÓ9nâǤ¤ÿ²œ“v']¡‘}NG8&Qyx  èI'%( &q¤Øèë.+hú±ôÏûÐÇ žü,Öi“§Ÿ(Íú Ô<‹gW†é5BCÐ>neŸ6ð7?.†€÷,§µ±ýÀ›¸ ñ’‹3\RÒ´ãTª…Üy0pjn˜ Âá¸%ËmäAc |æ¯þÑŠB̰•°Jq{• x› B‹2”f¸òM«œÏTgÛúpíÙ+”n<'ƒm„¨u–ÖQ‚fôà ^ {÷ª¬!@™™á¼3˜3žÆoÌÛûœ™›(¹=N™øÔç•ÁÏ“=——›\El¿¸‹J’‚è…ýµÞùD »EŽçrZÝ^}òÿ¨¸¡A·n¸(n3™Þ»È´î£D|]¬1Ï‚¹í;v† ©ÇMÖÌmzò…k^…X7MÄ~ø͘‰¬@yA\J¡ÝI=é5M))DPšGVÙi׊cʤ@¥2c¿Œ‹Y(ÔŸ%&_Hú¹PèØ¼YæÕá‚-;`ÒÈÓ¿X‚³‰RO#ˆGŸŸÕ÷ànÿPçWb°`ü¾ G™1å#h*qÈB·jÀÅVšÁêI"g5Yü'¿¨bs›Ê—rp!d¯ºÐñ“€Q˜vÏ4ܩޫ@ì!Æ{×ø¤„pî+/KëÞë '(z8/…w "ž#ÝÂa›QOi±Íå_°zÖÓÓÖ¹˜ó±9TlüÜ?»bªEÁPÛáBàçGNÃe:|RcÍj·…}o5¶·uM«7O‹4P<ÛÛÁë×úz{ÌÊ0—Åó$¶gäÜè/bäË,Kó‚Oöœ€—Ÿ‚›¦°TðA@Λ'»‘¸EóšGIm+|fL+T‘éwEìHLõ¨½ZåÕµƒ¥avp#ˆ·+áæ)<”õ¡_sÈ?GæK „!ßC3¢-ù¤ ,“DIÁíXà©I?ü¤°â±ç m5ëzua6Ic‡ÿ#Mk—Ãýzê‚)¯‡#{¦ê†*–A®—šw›ç$«oH™ÉÿÈ™†§—4>vÿ‚¥Ùl?›M$BÞå…›Ú¢ý`¨"z=^áóR¨®òìk®ôÃ;åÕ…ÿú.“bûJÓÑ·¹Ðù~³ÃÐý¶Ba3ƒË´¯'í®¯$°&{T_-Ƨç}”¨«E‰ÎôüƒžN±“ˆž]PÁLMÏçÂwЕä6 q3I¡\Þg¥ ÏÄ›¦§ÞDU"a›²“ Ês³îK—Aèýî}óþ«gX'üéÉ)r¯'¡¢sý:Voûl@õ¡=™#þ1­¯¡|u.®Y®à žÆ°ß(w΢t\¸y^í !Q<L¡…‹Yÿó¸Œ;áÆÌêÛ(cÂù€¼»ƒ:±*4¸†Ê}²]­e}qä5P¢Nt•@n/•àšÇšæ Ο¥°2Åç\ö܈K:Ø“øœòBZ2É]Ä1ˆ`4Ïs?V‰‘ß?2›œý™&ˆª EZõÝR*Cë®!·¢(é#!§Ì̯ÑÓæh7â”æíu Õ#'FDY3 Ü[á â’Ä ¹B—òVaî_!Y¾Ñ¦o5ƒIª6×GÖŽD«&:?1;°5ÿäó<=W—OÆb[Õk§cqVÌî‘‹> ÿ¬®Gñg^ïÐÛ”—QÁZŦóm®69;DölP÷õ.jÞ.Î ²ßU@XêjŽÄ¶X‡â#cAÁÂy5HÛ‘B ™– t›Ü% âRÃ…ä9auýÚÓ]¢©•ÍÎÐ6×cÉÎá¡>`ÇbŸáU”qèÖQ¨-x„gÕþš DÒ¶Tã–cKsöZš4³„[¤¢°+G±÷â4ðcK5ó:'t–ò«i°ÕÞwŸ×L‡’4YsË:žr<’¸;σ+Õ™,RÊr&WœÎ`¿ QñW4*8inöQXx™HS.øÎ;û¯ŒºsÅD¨¡•¿ÞÙGì?& bè¬&]&F·»üJxz•>Çg@®×Ô$´UvëÒá²Áêv?úI+O%jðÍ«,HTªxuúJB}NB~¬~éìÂÐ…=ø§´ÿ Cs6ÓO>=në›Ç |,ŸÑK74È´Þ{T™™{dÚ“Ï+j>"i’ŽÛh@åén8‘ ÛçIGcÕ¾­…d¬§i­©gÎ|ò¼ÜQMÄ|±Ü9[o¶ØRžücdgd¬Áp BÇö¬¦¦ £AŸo˜NA§(-›÷«í¾~<0Ùôß[.Ks« ´´ˆ=¬ã‚uR>ØÕqš¥(üà4†êAvìMó5•½Q¾ðÙ›ã–Ë`yc˜'MÑQ¸¨cÔ}½(˜]Öàož˜MÈpS¶9®‘ò5Æ XÁmuOi³ÏBæ±ÃvêµJ“&ŽýHÙ%³áÙ䩌 `EÒ Eº9ѾêÄ= 5~ OIz~Y¤jS³$õ:U¿#`D’5‘6¬î4w ,g8E—ÅÌž©zµÒž>-5‡3ߟ@¸¤˜àò6o\–ƒpK9;§oŒ¼QÁ©‰óz Zh¸ç$V¿kÒƒÍcñ±ÉD~º]+©~fí¶¡'´è*þVRìÒÔ…³íNdïÕƒV#:ð ¦qX†iw»mÖZŽ» ~´Â63ò9'¦Ù‡Ãp {Î5gª†©ž·KÛ*j(l2“ù9g:¥”*¥¬>ÎØ!÷š%ð&-…2´‡Ïþk•“ƒMFÜ,Ž «Œtl2"ÿëý©´oæ 1âÏ2Uß6…{‡<={ûOõ;#ÆLY\Zp”‰eqj‚q²á©m¥”É{îgø<eÿµ¢€w®BfEñGªÞ1"èí}pÆM|ëwþh[#K·ìX1”‰}.Ê„œB¢¼Œ{%¢kšÏMà{ŸGÁ¤,NGUa¯˜”Pdž8aêv‚P*ªu/\J³è(þ9nîo8ÇϾ¨ fŸá l{tZñ"81ˆSÕyJN[]µÐÝ~6-Íç£mÖ:LµWVý{ÄBL¹°c‹Çe‰ŠSÝ[·ÌÏãÕ0oò(Í¡“ýM´W_'ò·7À%©ˆËIlc~Áþ¾„ªÇÇMl˪ðoãôú/l]ûü»½}Ö²û[Ùÿ[ÙÿûoeÿŸ±Ùóúß^w­Ã‚ßGùÜné¹õ ³–~õL–Ôʸ&’æït)ð8Ùëì¹Ãg[{ò¾]õ^¾kÿï¿­ó;¦ÃÚO8vŽíó¹½ôa;†J±Ys§Z¬.[™4¦†IÝÄLµ˜05T‡2޽zÍ|:8¨Ú¥´-)ðWoÀVsŒÀÇ5ÇË[Åä©ß$Åò¥¼©Q/U6Y?F^oÄ,V'YFlÎâvØ!p(1{7FÞšÏ#ä«LÞX¢&è³åK‚—Õ@ÛáûšÉ«—ÇÇaÌ™¨$öÆÆaë˵©ýª€öÃé5Ñhû ûn/\D½+9Ä$Œ8ô¤hh}ˆ§¾Ä7Jž2¿8AÔçoõ°GgÿüÖ°Y3úKžÆ<º3¬Æ$Ý^C!ê,R·¥+ ðÌ¢äÖm…î'7,&çÞ0tBÃF|wë¥#{c·lfGó0ŒðçX¹]º(ÇÌœ…kœîÓB±Ð%íˆ)·#²…¿Ã¶Ô¦eV)ðWb3Æ»ÀO¼«+Û„Jžûï±²Øÿü;èEÝ gf`Q‘Ê OdüÄ—ƒ#çÌÿ^©ñ^^?b<6?8ËC‹J-æWÞÙÏ8ž¼ìïÅåm¯-ïôç…Ë.«|ºC}šîZVòîJ¶y›ß(ìɱøq5yrÜÍdêx³•Ûw—¡Eö@Ö‹"<`,äç?ÿë¿Ì0[Çu¶?œ™7Þ=o$èi1Ý®Ýõ|‡Ä­¦†·O½üöí›™´ëØósUÃ7Æ^-~ÇÅ_”ƒ—×™,á¡ÈDå’ ´hüÈ‹±ùºCI¢S;±,$ÒœSA¸G¨ê»ú^ ¤~ ˜×Þ„£šèÌÛ þóNüwœø?pâÿ4ªš»6?ñŽ4KÞzM9|¸1åòG'y»‡ùv¿xÁõêû½Ã£ Ðkî,ûʰ³z–p¸ðÖû8‘"Ê”ž¤™ÛWño) Y*áˆ(žZу%ÎË>(!Ãéy/³c.&iÂÍóöPø ˆJ¼4v^Ë¿û9¼xÆ{•³ùx£ í‡îoz]’¯ŠzÍq>DqÁò.¸'»:<<³UÔÿÄÃå-szêü”¾“Óæ¼‹\U ¡¡<ö‘ÅQ ¼TÐc åxcÿ¼w[nÝHÓïõ˜˜Š ×.C.ºªÚ3»+(ŠZ‹m‰’IÊk¹z: R( €Ò¢¯ê!öÅìˆî—«'™ÿ'  rU_ô…½(d~_&yüó?X:ÅzÖ}†/nPXÔÅOåâË6m‡ç®P¥õá³UçNÿqx –/ÍŽ -OOYúÖtG¥“-¤Jjß´W(*Xta’¥qܦòáF±H·3Ñ,Šà©Õ&lîa­@y¬°»VhÛjx)­?Z¶•;ƒt‚䂎@Ù»,%Õ»+?âV¬¦² °‰Ja¸Ä¸}PÑÌL÷2%lôÉ xÆaò¬_y?I?yÀ(Çì\PÕ Îu%'ì·½@=^wôi$«Qòei² “bc¼E|dg¹‰÷ù³s•ßÿ0úy1¼Ìf£Ùbzo»Øj…>N§£É|1¼ŸÜŒßõ?ÎFSGèõÏ“Åõ`>p„ÝÞ·‹»Áðýx2rÄ>Œ¦7÷Ó»Á/B݋ƗœuÇ dp{» ‡£™#n8 æ£ÅíxòC/àìñjºaG“Ç»ÑÔ€;Vzôq4|œÜ@“ûùøÆ±¢?>ަ?/~Ü>:s톘æ} úpÿáß-¾ýÆù0ðß¹§c—¦ÇøÎS šáô¹.=s¼¨Û÷i­¸ë–3H+p±  Mg¯cX88¹A„Óåaœ¬Sç†%ä $á{,vçúM§£w‹«ñd0uèÛˆ¹þp?½îÂÞÁ¬v=Lú oÇóùí¨ÁèãÃ`r½˜ýÅ vóëÅt4»œâ5š §ã‡ùýÔÅmÕ@ÄÝãí|ì\ÛÉ½Ë ŒˆÝ?ä§~ Õœ·ãÙ¼'t:úñq<ÝÁVgփǥagÁ«û=²D¹ ã<Ý'«¦Ã%ÚŽgœp†»æ’ p uwµÃÞt0›¦ãYCÇ>}„ òÝ`>¾Ÿô¿‡ÁÜ ;•Y¯Rï]_”ƒ;÷kâ‡88Ìä‡uƒÎ`–ÜŽ3·êlöódè»ߎPmÐy{ÿàŽºÝÝ7-Xm¸É}sÀ•£ÐÙ¼OU'÷ãå=­²¦°WœT+S<¦‰8˜µjt™$ºæ6ãö®Þ  Õâi¿^7ìOÚÁ;<YÖà‚ X¡ö¯ÒýSÃÚÛ½>©âë8 ŠÞàtü²ï_óœô]ú£:vÀžVñÞõ&+1Üc²sr¹J“°OY=ÇR ¾Kó¨QørŒ w+±SµSŠÞ'ýæ‚*ó|P%pŸª ë“_Âyn¨¸³…ûX«R¸ÎUüé/áò[ûfž×ix¶J·ù!­ s9( ”“.ƒxÒ¢a\b©Á“ÞÈlO¢Oý°­ñ—¡Ãt‹÷VG©àëû»‘)N¶îgZÀc<bñ´Õ×ér¿mŠÔ›mÞdçÀøä7À¹Ï\™DD•ª‰ÏÂÂ.hzóˆpLj[é'¾ˆ”³Ê8Ùe¿l^ñ:2ÎÃOŤÉÇÜq’•øa4‘Û“D°{ùÕal&MvÕý¨ú¶;Ž«K QPDÍÞfº±D¨)˜ñlÿ$ö9ý¹zMÁe†”Gý‰/µƒíJ´¯NcÉyn{±ly‘E¿†£,sž¥GwóŸʱ”EÀÓ å>†Ý­ç”gcpí¨VçñÜÄrBmNÍmL}k ܉_Êdè[ öP}bE*$gªKÿŽ“Ÿ<ò3 ‚ü,ƒ ?Ó (t¿wšÔÞG!dX>Ä]MŸymœ¬ÂO}'Åq²Ïu§èÇ@ÂÊÁw+' Ÿ “f'pÜ‘+P‡Ÿ@3+‚~m}`…ýè.Ø]¢W·ÞT‚Ça²aoN= 9r8’ö«ŠÑ,qœ¾…«~æ'8‰hâåF˜@Ljâ•cCZ6›û¾‡ðK,õÅÇiÒcj"ì:ÊòB½¸{Ùæâ•÷(ðÃÒë;â£$³â*\§YŸ×ò®ýýÚ.Njºþ‚'rü=NÇ=à˜6‹`¯Íò¤¸õøß¼%ØÄqôO½Ä7žm•{ ÇïÎá•'-nÙàûI¬$ö5J÷ùIßwh}§»,ÜÅÐízÂo#ŒŽà¾bIhßÕ*-nP‘¼ßQÌö»]šý–«€¥ŸôÐNUÙ¦ÇévHŠàSŸ7BO¿ø¥ÉFžÓûýñýüî¶ßáúãÝídÖÚߥ&m¸joäØFItL6/ò4Êèe:à"…i¤(ò‚ i–H[ØÎóO`F{9Y1œ\'å8¿åSu#™©+›>T»}ûú"Oã×—éxùðÊÎ!”§¬ŒÇ©.Cò?qt#åJ‹’š×cbrWÒ–;ᮌðïuzZ οšÄ!ðŠ=›™†™é(U—þÞ¤So¤’{Nš6CøÒ¡šŒ“e¼_…ª±âTê7Ð1:d4ý>Nñ¿gbÃïÆß@T÷5¾Ëá×ßM>àܘÍÕ†ÁÖó\+zi܇éÝ/»Ÿ³TQÊÏø¤ß8øûóÒ&¨m;Ô›ãleç¯1lá>KK¬£ÏÅÚ¤ë21ìŠó3oÂÏ@ÊòŽÏÀÛôTÚìó°~žn†ÌŸ§7¼„‡ÏоhÑ$èMÎb‚óóæŸc`Áæ³Ì¾EÅŸ‡Xt³sË­Ã9—Mú+²4=ÿ·£ßŸe<+æÏ±t(òÏ2aÐïÍçlñÏ27+æÏ÷=›#ÚLÝìÿ 5……S– gš²5.è©Ü¦âóùø›ÍÎuhøQ^Fœ¥©gû'ãr®:âÿZÂ'ÊÙátê#j'‘Kiòg`N—E›&ëIäg=BUˆIþy¸wÑçáÍÑ´ò3RŸµA>ÞÝžs\Ç<#asÞÓÏ=Ihâu®ÎË»ãÏÐ Šõs4…&ÿŒÍ!ŸŽ¯ç£Åèã|4 nÿb:º9SWƒëÅðý`zNJr¤}þª âý`òn´¸ 0Äúâ#&< ¦³ñäÝ™Š¹~„ž2Ä`ªýÏÄ,Zäz4¼LG׋ñdñp6îJAÇÀ·çkÙÞÂßôlI×ósΛñd<{¶Á>ž ïa¼àž­‘s: çÐÂÃûëó5íxòÓΈ‹ÁôÝ#úñ>3íüþ‡ÑäLœÿú8ùa1¸ž¶¸¾‡ÉîvtÆ ßg·ƒ!Œ |ö0>íä~¾˜Ía4 ní^á{“>ÎF“ë³uÚÉýâêñæÆ®¦'Ÿø@³ó16úœîÃóöàîüëÐÎÇ0â²v.ÊÇ+XÆçúÔ0<Â’õÓèü/sóhú "¥–º†ç$€ ?.„¬ìó0OÎÕmÏ=Pßù–Ø9ÎÏD6¼Ã©ôn0?ÛÖv› Úµœ‰ïqruÿ8‘ßúl¤ÃÛûô !ÐZÌ`¥¶‡78‰üœ«)4ía+q¶ T÷¬Ç‘ÇÉèã4+ð‚z¶]1ì)&÷&çÞVÑõÔ>»”æg½¶þ¢' œ˜ÃøÄƒ5<áèÛ%M×á26|ÒÖ$Äê¥9•Õ,nž•¯ÏÇ·ÏÐ6ëêP„d­|‚Ô¦F:Lãý6™ì·OÍn¸ûðÞFIxFÖkÖr>[“–ù8Îäé¬B:zÖ.:JVCz3GvNÞk¾C>wuE+œ“R™eŸ¹®ETÎK‰óæy*QO"רÎ<è‰õÌC~ô‰½ñWªŠ›OüL%îi¸>[xèæÿ,Däz˜&ªxN„hðY¨5˜&áÙÞw"¼#u=4*ùÓÜ4Eëp£²iyí}gçê4@/lõ˜ir«èF‹z*Ÿe"æÏ±ñ¹W""ý}6â3÷r¢>c?‡ÝÒ9¦:M£\Éâþé\u#êåãiÔòLœ§ñ뉯^¦Bøãçø:&‘V%;OÅ.×pbŠGg&} ²ää¾}~B…ès´`™ê¨=MNtcˆ÷bç&m:õ¥¤èü5åiþÔºq¼X³×ú¼Á¥JgX“wa&=}÷eµY„B·Øœ™ow>¥‘½`'wgf= «b/Øuº˜Nåa´ìñà:³‰¾rX¬`i‚m>[3Ž%§ó¦ÛE"äã'“Å<ôÎZAH0"œ¸ÒQ<IJjв·þŽ)4ƒŽz;²Bá? —·ž6)GãYSRà]øMCo–’ѦÊàk"z&a&÷õ}yÂ|쎵æ1˜@ÐÑ&ŒÓݾXäé>[žJùË>-B”òœÈ³ONyCø7ÓÑo›¾=giüøŠäR»ßEqέrÙ¸ü™Ì](IŠ{VÆÖÀ2}•#س0¢Û±¶îïÂ5™É&¼:üر óLý¹˜ó3“Ò‡:KœþÅÆÉ2cWsGÌM{Ò±3íËÚj`Ú—´Ý?bWVŒÑ«&íSZRaB…í½ò<D^¥Þô9ÈGÉ2];ˆ:³>arÎÇ:3Âæœ‰5ÿLŸ-ÿœŸ-ÿ,Ÿ-ÿ,Ÿ-?Ûg3„ºý‡¬ ¡aUQŸ9½j´É)©Ïœ‡óLŸÅ`<Ó'MùTmûEߥz=uŽ ’³ë’$ø\¬uAëÙ˜+ÒÑsñ z؃òA’ÏÆÙîHË•-ÿlÝ*ÿ,Ý*ÿlÝ*ÿLÝ*?·Jœ±â³2öí¨Ùn ÛäHŠÄ-'cÃv06R¯¢ 3f•¥ ~,ÂAwžpÙâ½3M˜œFs¡9£FiÝ N~!Etê+Ý jzï÷!ô%©·Ûé9qi‰`o¶; ‰†Âke¯wƒAX¤Ë4ns?èÈ‚—~ËS۩ƸÍ7g$|¦i%?#ã>‹Ob›…,.Àù©ÿ|dpˆ¸¦—hàsGc&ï?|,¼Lô>ŒwŸvm’Öì87z’Ê›¯Ç Ðû?‚œ^«mmâMk“H¾ãrù0¡Ûo–«´ùÄ5É"ã§m-Þ_¹aR ùùŠˆ’¼’eøY‹(²UCéÖM¾SþKÜâ$¿¤ËæÓK»N—çîXÍ”¸Ë[p®…ŒÖœÖº–´ÈÏUœ âÓ 9÷W`¾™š~ÎÁóy>aS '·&â?Ö,Â3gý^Í”—k± ŠçcÛ“îœØ'êTçœÕÛØOŸÐÛÙÏ<—·vâ4þkÔäSÑ•2»u ÂIµ½‡x¼$sÀ†€Ž^›.®M »áFÚ25®QµÂ^Kƒ2K]1ÍVYz~¬þí¤=šM‹¿ÄP‡®û@o1*Rßr¾v¯ŽÃVÀeø ú½»´£|±Š²~Àu“ß$|û~eþ5’]Р–ÐMZÂ˶#Ó]˜ô(Üê>š¢w7Ú ¶csµ¢ôt´_‹P²=`VuºfàÁÝ{¹Dql…ÝÁ­eþ2~X\Áÿ¾q©)‚®G7·»WÉVÜí_Ùü~êXR–”íØ¬HpªŽÆ“į§ý¦7†ÞÕö«º7Åq9ŠÇ?zÍ%’Á(Y§ýJG¤ôýëŽÞ¾8O»Š¯Ü¿`÷)T"wlz×§Ñ~H8ì`<½¥YO˜÷ ±#s7‡éÍ ÷‹Né2 ær8ö „=a"‘xØKæy«)sw–¢%ŠüqÞ³œòTØÙç-asŽÒ¬¤ˆ¶ý_GiôK=×¾,YpzYœÜøÇi]ä”iŸ â`³xŠŠ¼?C–n{l¹%œ/4íNȲ°±Ã©½¢Ï¡CbQ©¾«Þ…¿¢*‘û‡„:'Qû¹µ†„Ó~šMGWNµ^E V™~µúƯ0•)Ô/»t§+öÒ8ð74[71¿‰æhèݨÂOáò,DbÎæ|"ÑÙj„r§ÓhPàÒx/îÄÒUˉŜEOcÒfýy¢DX[…‹e°|n>¨w¤Ë»`ùÒä£3vijt"¶œs±1Gž®ÏUð£>MááØ:©=”½Ê o6å[@ëxŸ?wE]‡Ë>…°Uèúz8L×ß Ø÷%aiJ“Ö¸Õ¢-èì1ô¾³hÓ\²üåv|µ˜>Næã»Ñâ§Ñtf÷¨Û„tBxòí7M«q`~C7DúôWP¶t©U¹o¹bœjÖ¶¥’?MB%¦¨M"±>%È„1O­ó¿ ”ðƒ¶ž·\b+Ñ~0·9¥nÁü~4žeÃ.—qd¼ ØÇ^Ž#[õ /á¡qØu€'éio0I‹›tŸ¬Ú÷Í<Á+L<蠆Πø¸±w7“ùТøUJü;¡ÿ//VßïVO(Z@³† ®•èà:Õÿ=@|ÿ ƒCp¹]¥ò=÷èç+˜K×ÑfŸ‰½Ê @‡†^¾øÏAþì?0kú»Ã2o¢Û®0¦T•ÌNä«(džô£Ýë\«Xšd("òyàæ}IKH[;|þm ϺŽÌuƒvÁÆñ-Í^\Y¿1YpsE?ò_â¨}”r$9]µö«l ¡Q,b¶Ñ¯AqBIeƒ|—¥0×à ÛXãMÒC^½?¡D„ùs…«ž|lÐí“¥BAœ¯œ{Ä×&Ñ[oýÕŽ%ÑÒ‡VxéßVªjQ»âÅÒù)e("‡c°/öú®œ©žQ[ÓiÞ"„„úx«â '”¢“׈RŸ8%ïÁ£ D–æ…k‹Áý>ˆñ-¤ÌÓé%$ Þ¢âÙV+Ü&úyDEôk˜¹Ö¨Eç蕦ǴV…+JZXa mKÒ‹´DP¢-¢„YØпaÞ» •* wç°i[ù›´HûQ¡ÐÔŸ>ùÛ rn˜ßkŠÕÓ*M>Q{UÍÄkR”Ô‡ýøª¨Âm¾Ì¢¬£~š4E/Ö:‹.NÇY¸‹výˆZª½‰OÒ­>¬ EM[ ޤüµíE]¡PÔð—½ hÒlûÒ”k“÷¥1ÆG\¤ýX§H¶á6Í'Nš5E×áy÷b•Ø*™ŸÑ1éJÁ ˆw/Ÿ½X ¸¦Œƒ>Þýô¢ÔpMy`e’^|«ÈpS…Ëj/6Vtب+Žzâç{¼—ïEl¡ÑE°ÞV/Z†j*º¸ö9(t/B“ J eBŠð*%λU¸<…Wq(rZŒàc®û},®)í=6TQíè ÐÉVþSø¼Fivâ,ÕJh+N[>Þæ=K*s(òWX›²(YõbU`E÷ö†1M?}ç™2ƒ$N÷…Ç:²r†™-Ì–Q¿ý©È,:d´…†Zr ’× ë[Ž…©TPºôÙM^Þ»ƒÂ¤Þ \xɾ¼ o’ž2A—ð&)Š*èÀþÔÿÌaåBþìv~£]ú•…žþÈ2v‡ü«;侤æÁ2u‡ÌÜ!?¹C>¸C>ºCžÜ!KwÈÊòì‰Ü![wÈ/îܲw‡8 ÌHúùɹ˜ËËKÂa§¶¯½Mœæ9z“ ¬ø”®/¿š§iœµšh)þ¹ÜüóŸÿþ·Æÿ¥þýãüáqŽ¿_ÿÝÿá\¡`{€ñ(ð©.XéGž-aögÓáõx OnÆ·#*óï—&¦ö:Ïé[‘Êâ+-péS}Nõuá®êæ¿ôTrU|Y³ÿà÷_§™Eæò|õõ?ú­êà ?ÿ£_3ýW¾0•ÿ~gØLíöÅå[§ÿèWæ´ÿÊW5ø¿7žÐ é¿ðÅ_ÿÁï¼þï4a?ÿwš¬ÓÿNSÖë£1‹¿þ+_7È6ô¼õ7ßËÞîÆÁSãVüí9(ò$|ûê›Ëo¹&”g°|IÒ·8\mÈ-sØœ=øiñ,ä…-$åÌ÷ôÿás`ÈÔ¬ºAËß‹o¾k­Ðw­ú'²'  œ×°‘⟘ÂÌ:®þDõ€ØTnj!•Ù&áÛ—Þx»ËÒ×põ%½Þ4ÜâÞg¹øæ­/ú‡Ö-Òo»œž0ŸÕY¥ ©Ã†F缡œ…ë0 “eد3Sÿþ·ÿå öEº xïb}ã©÷­GfE$yLH\»”Äéÿ˜rñíé:N0[?ç¨Phñ njão/ÿ(ô÷"Å ù#BÊžóŸ¢Â–ØÎÏ¢ÍsÑÐÄoQ’….©aoÆ¡?—ÿò/ÿrìâPo0ûy2\¼M¦–V¥;jS]ð*:8…:ÄÕ`6ÞÜÞ±ì)L^Q„Û ’äT{x胼¾¹íÒU¯F7÷ÓÑ‚_ìÃxþÞá¥êOÓŸ÷ÎÙãÕl8u€Ý^ÏÞÐß­áǷ׋áýd6_ü0úyqçô |;žÍ]1=Š™œK™Ýއ#gÐ|:ž¼sEÍnІï²ßÞºå^Ü̃¾›<²2?~tã¾ÝŽæ°”Ï竤]¦£gÔÍÀe¡ w·÷Wƒ[gØdp7r¹î®ÇÃùân4}7rÄ<>\æ Ñàæ¡K'M®ÅÞ fzús@Ž;}焚zMzP9˜˜aÝ>:4 098¼×»Ñ|1è™À«9B>@9ƒ+—- ÂÜëv;š¸~`{u3½¿s-mÜéDð~ðÓûÍãÝhâÐhãkÑVGèÇw÷Ó9ÕßœAns€Íæ‡F»­5ÿúx÷°¸ ø0˜^÷„ÁâºOàSNæŽ0„z”<¾©ûvÛ¢éâÁùu=Ÿ>ºƒø@Ða½½ú¹S—íµÉ9ekÓïhy;¾r­ãxòƒëOŸ‹ÁÃ,- ^5Aó{×£ÞíýµÙhÊDZéÔeic´Ó‡ â\ ;" ã¸AÀûl¢]Q(zpÄô©Ûæ ®[7Ýæïï¯An3ýœ\‡ÉÝà8]\Ä‘bØÃbp}í€3®kWeУŸ1P¿'Ãf£GqÒÝô¾Ël>qYTî§î‡Q§7¬l(o¹¬Èˆ)¯ìr¡=‘cr?9b~\ø{PˆmÊ)íaPô|Ãü ,î1wéÚÓ‘›˜‹éh:ÃÖÎmÛû0…(tø'Ì=Þf.æƒÙŽcðq:¾ùÙ3{OÀñäæÞ¡’›<:5ãϰ`MèÔ=¾¿]=Ú壦ХYOB_MGƒîÇ“¹;v8˜îè»M‡#Øt@¯¹Ã{¾éõè§;h¥ÀûÉüÃްW?ÏGÃ~0 aã3ëÄü?ñjÃѦNá+ YÀèãhø¨N•»<ÞÎß&p¢žº£ßfïg£†³I;òþ®GmÇ“ÙÃh8ïœß >ÎæÓëñ»ñ¼ÇGßÃþNo“Ýövôn0üùúá‡ÙÍìLD³ùõøÞã¦ùûa_Ìô}ZoÂsÛt0y7꜡Ÿ¯y.›¶ñÝø/=äHÊu;˜ÃáûzÜc8‰UŽ…Iè­ÅÏt»‰³Åø£;|6¸õ{oÜÀáÜ8ë×uÏa> G}»´ðVÂÙÝDÕ “«Ç››Ñ´ÏÔ‡}•-z ç7rGýÅÝ÷)öž°äÒ ÑÎB:Žz¡ÌÇ“¬÷·ýnGå$X/i¢ï§ý+|ß÷Á½® Ø·ÀSÄš‡ì”ÏË·›ßþþ÷¿?vÈæ¬>e•ÀhÙåhÎ盟ÓÁôƒ°CŒ\³Ç;§üóÇéµÃ ¤¹‹LS ¯ÏfNÂÚ”ñ°Àº Û…1¬ NP7\oD)jŠ£`—1ŽÂO¹I?ã*þd”›(“1®÷Ö³.êc¤O7ÆEhÀvw>þi䌻w.êáv—ŽE= HOÈâ.ÌDµG!!$Y‹Ãëñ ®ãhÿK˜xéÚë¦?™ýt-æX/ë=ÆÙ],ºL°‹E§EÞ-sð” #¯ZùíÑÊä (­xóГA%s@äù§¤·»ôƒ]ô•L“ž@2ïýÓ_Ãe‘{·Á!Ì4zÙôØ?쑺J9æôâ_Xž† ÅÅa‹ŸªX˜µH=tÊÀ–)óWÃÜ‹xÇ¡ˆÕ<-K¥Dð¢{rçÄq%­eí³ýøŠX½ÕƸB–ÈØ”¢qt9«hƒn=O-èšhZKÚdÁv4°uJï.U¸Þ”¨ ÿÍÕøÿ¨Qþ€ÏÚë›mvA–Á‚Õ+†¥\ùäbhSS“ç^%‘~Qð® m&”Ø/ì2n~m© è>#( h?ƒÀ6pD®4Ñ=TâÔà÷†Á轃¤M3•¢':++;¿†«¯Em>%ÉÒß…0 `?w¿ 3®ÄŒ#ê`¸Ì¾$1½-‚§§,|íò9(¿/òCE„§…RV_…ŸÈ©¶*ó*Mã0€”«)@Àh6IMNA>y±-Ï IÒ‚ì*KaÐcˆì]œŽ C€¢¯ÏnÓ‰Âyç¥r¬iÎb¿s'd¢é¦}¨sç>™H• e«)#Sµ\ty…qÆÈÀ‡>ø.:6ŒŠLù€¾V9¯Ð$ÃÃíS¸ZuTN^.Ý_çÇñ*+!£dïWáqܘ3zÅKB!¹þXíir"XËX/ÅØþÒ›v¢kªì†éžz%ðA¿^â_«£ ç­À÷ \‰Ë™EÁmÆM°ë)ö”ñd‚<ªK=Œ5ôªÇʦÁüÁSdºa­Îœf³LlÊÁÕØû‰“ /Ù.Ž–¥ ÉQ«ÜÞØ¾ù | šN‘Ñ—×`hE‰<³§¨À ¢Cø[˜Ù‚Mõõy<Æ)Y:Ûi)9¡ÀÔåI– Ôhþ¥’Õ°Dþ2€¶(µ’Ì¥é|=Ó64Ô3~kÕPªæ m|\Æ;$KøƒÈx“IÕ"²øø5ˆ÷ô®¼žÀ4 ë^ÄÖ9­²ˆ¿½¹!MÞmÿpR\¦° Ì6¯é¶/ÕiÚΛV3ôD‹±ÊëÙ¶èøJ¯a@^`|0G®Á ¾/Ø!°ËÊŠ5Q(]|às샆FßÃæ«06¯¾@åÎCÍ\Ñ»ïìûØ}/ãèè¶x(¾ó-z3{Ä!ÉPh`X@2ãÍå]X(»wƒÙ‰ÁØ…t^ÂfiZøIº C§Õ£¬„Ô-p9+5V“O˜аòžé³!Z,о µ‘»r×Jv¼@I’-é)# ’”Ö9_×t~Ÿ^½æ¹÷牜S"·ÎmHÈC²t›¼†i–‚”PGFô*\»0ý»j&OE:!ßœoíˆ|fîäâYRS艟‰™Ü‘—Pš¸¶`áxÒ‡É æ¨¬qeÀ?Ø‹õÂŽðç,MÒ}MC,Þ`äIO¢=YÇ.èx fÝ ]P‰Fì aBBØ>“=à9ÀY4À¿i2ã\’Mþ ó)¡¨¥hAO´àQq•­¶¾ìá’zƒgml'Rj¤“¦¯ú®Õèù“hÖ®´ d#s­cCÍŒºË±›;öVTTMeY·7=JÒ¯%Ëî²”¤u›ýF g©Á…œ˜)Jýà-ˆŠÁ‡ÌWù‹*KaÍRN£°ÁÆbù¢ÿŽU;ç*|ÕòƒGuÂÉŽëàee–Çröy‘ný] µèX)×A­õôB×âi¿Ñ€nµEæw1Xâà®HŽt¤ZðŽI§éNm®¸¹ðK +=¡ÔÔ(àÕ¡~¯aœb÷àõAd¹(ÕÀÇ*8Öt„¼[xbáòi¿ËPÛI²7ú„1‰leµ2º”qgº÷ç¨xƒ(«Æ­òÙ$["_aâL’åfo,•Ê· þSœ._š¥ õŽ5Ý'UðJ‡æ@F˜u&»eù‡‚o÷qq%—:Á6e¹Ïpò=á®D£Øwp`ô_ÂÃ[š9w_³T¼à™€Dnõ5«®r.JS•ã„V›É8YÊq¡ò«›fñ°páx$ÀÆo0¿ñþ‚ªy¨`˜vx߃¾Ô’™²´Hay;B%r)2ñ·æùeî}Ê#)~$€ÂÃF6 ¶G8“>UDS쟠žtqÖ΢ò)&õ$´Ñ©×ÏÝZIÓZÌ 7ëõª5õš9³X @'X8bú¿À\QèjÏZáÅ%¶U" ´H´Ðš&,–;?\>§(MÂå¤GŸ˜<¤ð˜Â“Þ¾Ê=E”‡n™N)ˆ)š ’­æÖî–ÆÖŸ°ooÔ¤Ô]ê=r¿*7¿©áñúÁaà ‰¥Î.ÚüDö±(ö· €m`æ6#Š®ýA`5Y”¬Ò·¼ó„R[¨Œq#½ºAÿÀ´²˜…8p/ž‚,‹Ž­üz(éÝÁ} ÷kĸ ^@ÝŽqWVìjHã3Íu”ÃËheâmCáa4zÞ(ëò¾øm½2020l}š$a›Z‚õÃתDd¾A6?aŽ>E9ßÂÃ6+,òãUqŸŽVHQNà TÚŽoäᵩVxÔăɶ(T´u©ÖYwÉFÂt[2*m,ÄYïH¼î¾e®$ðuâMP÷êÙ|v®Ò t6F-8Ä-žCT¤H³xuÒ|¾Á÷zè·îýyš&–ÎO;Ÿ^úvÞ!Uë@I>QÔ_8Ãp×·l!¥®ØL¼…Xwbæ§ÌÕ]šG_±2L¾ø-ï«ÕS¹øµU-Ç}Ú3*Çl–¶€?ÔýúÎÿ$f†:=~uX’e÷í˜â KËÝ—õo}–õZ‰Ë†nº,{‹zexqÞÊT÷-ª2å­ˆªÌ>‰>-ð¾4piUk€D¾$šá±’~{BÙ1§%d6~‡¸ÔÍÇïæ£é]­B¸ÜÔ.cº÷ ÷-İZ¬O›c‰ÄÚŽy·ŽâÐ[…EËðžp<"+dš…Šáë–òS-͑˫ U½÷óùƒ85Ô©¿9‰Ú8'\À‚û):vÙBy)ý¥/ZP‚áõk´ŽZn§,’ô±úblÃü·L“0=váº"pçcþ ¼ºAnQæºh!øê⻓šˆÌ,Ü"w¾xc‘wô+‰eT‰Lb°*·V|®9s?ÉÛe<Ÿ¶ñe|ºÄf¦^‰bÎ'3v4¾P•LsŸLlÒî)@];g¾O‚½zóÇb%ˆÚûot&7 ‚+S¯-ʘƒ×Y³áÓFi)ª2Y7=4h÷g7kÐî XWvárÙX ¥ñ³…cƒæ-R »^ƒ` ⃣¤)8Iñ ¢2›» K#—þKùuÂ…º ë2$ñn¦H­s`ø©=¥~) 3@á± Ÿr6$S±¶÷ »öÿà«úþÄ™I5äV“¥„(–b“v*=Ñþá;ØFÀÁ¹ñSq&%Gyát›Ãœ/•1°tÕûzŠÔŽtP&g@@¸ÃV3CiQ°ÑJ}ä³sVŸ²Êj‰²Ýò’—äJuÔ§bŽ‘ÆN…†EËê+ÍHÐäá/Mz®+Ò­̰+¡f/k#c(‚§ ®/éŸ Ë‚Ã—[¼Fá›*…m¾?å©Dz¨Ê–²¬q½e½~ƒ_ÈXÎå3 XéŠ(]{ô€1ªÚym³hñB-ŒêŽv#Þ•=EƒÃkP)Я‰¹dÍð·¡„à ’öM’IÁ=»à!á7ÞAÖ¿cñ,Ònˆy7¼ˆc•ê'‘ÇyÄH 9\â yñÑâ¼ñÓŰ×[ñ"€ þ!4)B=‚^нci¼Õãºè©VÜ5úê´Ð¬Kí/Óôå þÓ7áA¬®ÁAz?Ä ì0ÃùOlpâ³êqǶF*?±º2‘`û> Bƒ7¨z6 8gG;h:AÔ78#|’îÈåsýÒm8PEÒ¼}f.Øéª[þpå\AXºÇ^®f²cwB•iH‹Òé à0©|‹ÉBc7m%F›èN]Ⱦ8C7ýÒK³/=hmI˜Ÿf>…,-6*˜\«”l‘4ËÒ7øZeC¶•R ÓÆ»Ôÿö¿ÿÓ?ùÒð¯1âÌŸŒ9‘Púú¨µŽ®-®.þ'ë_†ñÚ—†­8)˜Z׸(s§‹'Øà¿¸êÃKÔÅÔ$NOÐv°Ä’a†Z[MwBoá“È«>ÿIš› Õ_1_ý¾J³ mýð—ÑôÞÞg#ïjvíaì‘ üFOæäïk<ñæïGû$ñ¾½üúëËï¼ëû!yž&'OûõZl4]vt„òž¶Ù\ˆóéqGe ”Wðècªî:¥‚¥®TZbª]´TH! ±8¹¬[L† V–DØ‹8X§T±Ø¢ºêŠ4–ƒ8>è‚óm±s)uÆÇ•z™pf ·pØú’Ò'Y;QTÛÌbk#%¼†ñ–›Öèø7£—î+x|AöAÈy,¼ÏÉ+j¨!Ù†ÉeÊĨáÀ&ÓK<¤æÄd¿û¬ˆ™/dnŸÂÑÓÍh±HîÄk^´ª"8¸=–„²Ôr1ìæŸ×ø…5%ÑÐÞ¦ûQUR ”AšÜèЂW¿ Ò”ÿT{¼¦“Æ¡ÞÁ² F5#. 8áåEãùÒCô¡–Ý¡LÑD¸oàQ{ôÏÒûúS|ä²õihjL´TêìÔ6,dE ­á‰ž²áÑRª¥“Gˆ¼ ¯½ÒûpáeâJ’ž±øÕñô‡¦ Û h+U¶1;˜ \upÔAâÜ»Q‚3Ž^¤ôÑíƒÈí /HZ•>k›+ªޝ+ÙØÆF‹|¡ —ú0¿~ãïqb”绦3â¯ßh5N‘ެ½ RÈ é“Ý6Êßì«aÙ¸ 3öA|QöÅaN§/M>:ª~ ,4eŸÇ<XÌu-œ5kÞ&[^eDj!–¥íJõŽ·N¥öÁµ]°¹šYpz•«­q•o—æÛL`ôH;<×м‚ÂKý:Ÿ2fˆé•Ê.ƒ]¾b‹ Œ$’þP…Ö‚BUP¨Žj "g·2Dέ峱N\Ú1K Z¾•V2V –çmÛ!Q8(?Ùè(Ar®É~ûdì¨eÎd‰aPmœ"ID>Û°C¯A–[yd¢¢"Û¤Ÿ‚,bËZ•œNc®Ë` ¶—^¥pŠP!ByÊ®\Ô¬*¢­¥udŠØíÁ_sÌWë»Ó:J“F•·BÙ&E|*€õ S(ËY*r“¼"3Ñ‚„åºå”d¹ǧ DÏ•r×qXjLÒþ.…•· Ï[ƒÓc§”´~¬EŠÀÊ|eøfi*Ä—ð*Iô8þƒv¿‡%B½wAö+"t"i¢$ICKuà!½S&[åªÀéÜZ~ÎØñVÖA6V] T-Æ–b´µ‘D²t´.…ã ë } 1þ25¡5rÁní´"Ѭa¥œ4È d`´¯öuRa”—me?'"µ°-€‘ª+ûÎêšR²ü«a5޾üUcyÞ(AcyÈðn1½IK{áSõr$&/£¶ÁnÙ€"±w"Wå%·0I?± L j¶ <ñ„¹b€\˜nœ,Ú½“wÇyØ4—¤Mf¼¬iÂcšÉñæMËM@Ûl>—‡§.ìùœ¹Òˆ4ª, ô\ÏyÊÀ$M,0|Ê "«uF¢xe®ãè9#Åê]ù`ðâM{:•ÄøûxÕ°µ3N5Uy¿#Lu$Ê­PL(a˶eÊ‚ˆÒǵç‰ÌXñó£W+ȇ ë€NS$åé:—·‰5¨L+€ÌWi ioTÊu#¬Žï%˜>ÊQAé;þ2Œž‹í Íî³BêÈR:hCË4µgܪEÒ”+Šì‡ÐÖ¨{a{,°‘‚“°:=ã„r”ßOÇ<óD'>Gò6µ†£$³“²&½ÌŽ%Ä®v)µÕ@ÈZê@Sã=Š\²$UciŒÈ-[ÐB$“U¥­a_|xŽ6Ïu LÑ3œWðâù•­K{ü·0xÉ„—ŠH`–xe ‡§ÑÙFß«SV³—%P»,T›‹Dsß@æ$”›v ¡ÜGöái¼…Ö· V?ާëâ-¨ÊÆ×Á/uq⇌Ք†^”{ÏA¶ú¿=¢ö{_ Ži1º" ÈœêÏËþçMËàÉžk›G¨)#¥ƒ+ÝÁò9\»S4n†Èq3¨jݨ“v¥¥ÕY›°¥Ó6Ú¥ÈýµG±´Iw¬j9«”Œ½Ï'½~œ°.”/ÂC™×vÝÒ¢Q8ÚîãLJÒd½ké@²Óîq»È¤‡b»$z¦’Øzë,Ýzà ‹í}ë=)òq½s?È[Ý5Z•Øø=ЍI[#ZÅ¡YæÈ.ò»t±vÈ—æÌ;T‹f¨<)œ v¸òôô6d´v†òœ6o‡JÞƒà’Ägcu®¨ü›ÈhVÈÛ®efd$žêbIW>qºi¸-RéŠF>Ð\Þ¹4ß8}{ùõïËprµAFÏÜEé£=‡Ëߨ·öŸóçûmWý•ukº€$€ôxˆ mVçª;ÙÕþ›»÷"‚h¿JùE''к´W!ê:† Ü¾Ê-àÂkˆ< ÷Ñžæj¹mx‰Vøx”O»Ëë02B$æTgˆW U‹vµ[˜Ž5Þ¥¹¸6äáè†ÊEx²ˆrɽ>¯ž"ðÏMXÀ¹~ë£X‘ÜçПßd± –…À-A‚z…—µ“‚תM†oc»"7G +îr^‰¶:·A‡"#nŒÕІ~*ÙKä2kÖ¨£x¾‘Rd„ð•'l–ì jseâ÷éÞôïsØ’I¿Ø_.@8âQÉÙYï=ð˜@ó—éa®öqaUÈk! î-n|0æ°`ÖŠÉBXÝ’¾ÄèÆ&"}#÷Bfœþþ·ÿ@Mÿ÷¿ýg©€n•õr³Ðç£78ôµáµ#_ÅY6JRX&ÇÑsYá[|¹VÀÒër»j×£… jhlWJ±q­»û NmT¶+ÖPð(_CjGj¾C<ŠŠÿ5M­ë›ùʇ¢Ù¾‡'â’+RMí¡ÀûhÒ¦«ˆ½Ø.ø‚­ìËrR–*žý¿æMvÑòÅìþÇ¢ÄdNç=b†âÛoBÇ­A5•Þ.e^éÍ[82­>4`˶²íxl`°‡ÜFÉ iš°¿aÊ^`¾ø«ý®Å뮩xmÕ)U.¿\R”Àò­¨>íþu;V§+—÷týS…nuݪBwâËW_v}ݺBøi*t=ø4º¸B—žF—Vèv§Ñí*t¿œF÷K….;.«Ð8aTçˆO§Ñ}*Ó­¢ ÖyuÚ›•6ŠªT‚Ræ8‰\XòÓmd>¥<ÁËÝNïø¥pºxD ¤d™Ó¯p1yÚwbY¬2šåÐcÓCOšmˆÊV•ùBjX7´mâÎí‹Ü¾„·îÓ´¦–*»®«%ä®^ÆJ<ËœùsÐh"ž¢ÜÌBbÈÂg©íÝ}û"\W±(5ò/½<·]+©Å©"òÜC›B{%5nH°¡ 5¶ZŠlÂá¦M•MæñV¤²W-“/ú1ŒbŠ{).Ù½H¡/ i¸àR‰h–Ù”r–qr«ë@@ /a’í)*üuÆ+šdôúhœj–UÇQSx)Di¶cyL#K“zþXå†RÔ¸qÕ|¥~Ò•®Ô)Ù|¹ƒ_õâýR VÍEÐfú–H-\}ÛVÑ#eòÅ&“TjÆKu±º–+B‡öU´ìׄmiKþ§A?ÄÎÊéH…Ë®ïÑJU(ŦpkÜëZ«­ÙÇ›Ÿ?䌅`Q7¶áhޱžÂ*î4 £Mâö!nTo¥ Nš;¿²2ÉÔ0ƒqÐ*vlÇ´ôD;o““afô»Á·Ýë:Vá„Kpá’_~u€ó º«vúþ·Ìà T±}©÷YNŸ&Khêa¶ŠÀ8,ŒQë†÷Eš}ïíäSµv{O=p«Jt)©²2 }ºÎ_nÊt¥€na£õvá/û›TÉ(:3Ï )WH&-¦`¦/ÖõÁ£ZB-‹+ÇÁ£Ô^V–Þk½žµ­ÐŠ‘ûA,õ’'?ÍVMÎ_ËeøŠoŸí²(ïø®2³D‹0Æ Â*; ~•äSÌŶY·ù•-¸õùU »ý<úÕù›þT—¾+ èp7šû-.x8—ÑÖŒ:öf%”öQ$ÐÍÇ®nH¡Ý‘ )*̺È=” ÛI¹bZÊ©gøCK˜ …¼»c^µË•œä)ý¤í‰˜‰l.D|>«Ôˆ_®[k—^ÏlsÚìñ݆öªé"k” úÐ4Þô¶ÁEôñtjêþ+<}e¼æ;À/~+KÁ`„Ʀ{9ž‚¦kÈòu[Õ+L·e4tÑp sVßw¿M7S"Œ´@íš¾·ÎQ +½(`Z&Žº½ÌH®(‚B «˜BŸò}á\©U»fùov"é` À4§`ÛˆÛçê )r’‚k+_ÙæòZ`J$8ùôóF~-ÐÒ¹jäÎ_}.à ¦¸ ~§rUå|ž7 ‚/ÄÚ²˜¨äR…x»*}áøˆ¬ ®Ýåšrm«ñÊÝN'ŽÂtº£x’ z 1 sÖ‘j@Yqg2AhÑÝOzÍ%âêþ†E#¾ht'áìV¦_ÓÄ¡6¿¦‰­F¿Ö/ÝY8o•£åR¤ÊPoY gí|áɳɽZ'=©GA¥‘IA‘Ã)`g5 Ð‚YÊÃYJQ¸7r‡O<ÎÁ¼±ˆÕ ýƃŸäry®m6¯V‘à†:hÜ d¾†”´öÛ0²4iÕ…_cmá\Ýj "2U¯îSõE™CüÛ‰ãZä­r¬ƒ_œð7ƒ6I‹Æ ±Œ®¸´¢iVÑÀŽ Úu$šr^EÝ;Ü4l[ÜcÖZSèI’Ö XôŒó*lklÜ öCš½¨Ý¹j¢VYZ…éÇ}´|ñI·@›RAgÍ@ÄhÇMG®=WÂÁEgK%»2ƒ¥ù^G2i+xòõ5Yï©e!=ök‚Ö¶[¤°z&$aŽâÆP§"O^eýÀÏñî¿ I‹/ºNVÌ,»[Qòç‚*'á›í ­o!¥/d÷5^€(Œ«@Ú}oö×õ>W°?ðÅu^³ÆŸ¡Ö£ap8%ØEËV±I9ˆ!R/þ Y]F‘êî)âZ TȈñ£[ôÇš ´®H`8Co Wþ·—ß³Ü3sûßüÓäi]íÔÛ©ªHœ'p&_o·3–¯À­|¸¨?!Q¨/ ]¶ ï)¼Ð•+‘—aÞu*òò@”Ô»–@Á–™¬äïòèd+s£q”é··ËAf Zk´ãÌܤlÛP–]oªf(9ßÔ™…T­<0ÍSïZ.\ÝjÊ]šå–6xÆpÌèM)][,6Ô®Ž’ú™çP¶Á28æø3¿†qºÛ6FN52èÒ˜yšÒ6ãU×Ù¶†·Úáj’»”Ú÷VÍ#²?Ö­•THý‚`ÃÆ÷ŠêÃGËÂɪA¹_] MáE1>:7ìèÜ(÷Õt¸ÒÏ»ŒA»d×q «q~W¢T~»1Qv&h½‘þŠß·«ˆ_´«–`&SÚC¥Ò((Z{“Á¬¤úÊ»E'’·´ºÆÀ­‹È ÌYcœ×Ttȃa\±%³åv×þ"8ä!Siç@0ö´¹RÈw;^3pŽ\>-ò]ð–tÓÌ@Ÿ€>¯é™‹aD¯µ÷º†£Æ¿õ`¦5 øâ·ªXÊàV CœŠÂñÞ«i0@CÑeG1 ßp[I¥^Ý1þǵ‰!ý ËÂÈcsço¦—½ú—ØÅÔ|ga­{%nàìÈØlÄG^‘q@Á&?Àµ^U:ŸÉí–¬dزjtÙ–‘YáÚL±³Y}a³è+Õ‰@—ÀÒ&sýõ 4 wEcý"ÃϱiYF˜ÿ«äÈD“ênÿ` f4ôY¥n]Åûâ6ÜpRw§¿- ÛXžŸèÒ³ßWG)\ÛË`hÏN0cp‰¹æ-®ý‹ ’’Ãjœö¯-ÍÎ>»Æþ‘¼a•N’Ò í@u­«Cš °5,l½ì«5[{½<…E%Ú–ÝËËsÃÿ“¤^qø/9ì*>I«i:(‡ödQ—µS”µiÛÙC™fúÆŠétík× [õ´ÐÄUš6”ª3J”g$Q.9N§ùÉ /í’jä2UOÎô\kãšY¥g°&S%›%&”ÛÒ¿íËEuRé9¥”úrS•ÞÞq\~%¦¨–ê›9´×]Qy9? ÿÅÃáalVܘ}ìäÕéÉÒfâvAcÈ ©yèôʼ%•A¼ßÅR1ÌÆ«’…Ïb•[4B.£L—Eó/ìÛû†®ûêiNál½9!GHÑÒ]ˆŸ‘îÉ™…Tˆ¬Ážê\ÆrŸ.}¾Jô1Dq£ G\7r5§Ëw·Ó‡áŒë“Hº4âT; ¦KŽiï{5ß¡êäÂ9µ ­p·‡¾$ µeg V30ñ*œe'¼ºMÓxr‚™»¨ìšÿíO—óЈáPá@-Þ&Ѹ醩­í]ø„-~_¶O7¾)#ª|­†„&1ôjmv,âo…†$UòŸ«þþÙ`~Ž\IÖIÿþ·ÿ‹`÷‚BÞTjv©ž}DàP&Ç‹ Ô8¸V£SXCåŸM‚*VºŒçôÍ ÿ ΡÝùÇ]ÇéVMš”=-x7q°1ÈöÜïvì*÷„ Dµ«ˆ,Ž]Fl`Ù71—š/J`mBU<±Õ©U3Mï_’ú|Æ;¥Áµ;•ÀyV^Ntž3 4mJ·^.2kôs´|öÕªÑuÈh oñ#JŒnü½šy-J_¤‘”=ƒÌ§\~mJ׋•f]¤ú²â$rIÔ\Æ"‘1ªÎQ³5—–Ÿ­¤Ü(ÊM³Eº^÷f× ÈºöliÖç/;!wÙz-ÍD žœ™Š¢ƒ““Æ2²Õלèhȉjc5IWá]°+Q ”NdÂe…‡ý‹4Z(Õ8T~ÂËàN‘Þ_J5‘LÇcÎ7°•ž cÈwVNd#Æ”yÚv—Rf¥îï´`ƒ8ÚwÕj¨ì„ŽJáŠÜZçþ®ìÈ|µ½ç:uHÓ}«dpïÖ*C&é-KD€—$Š]äÄò ,ìôûäæðÈZÊù[eÇ‘ QÔƒSÆ‘þxw[fÝ£ÃV‘؃à$IGOe ¬‰OqÊg"ÁY*ìÜÔžÐè?NÌ ¯&snDø³ùû£:íVt»ÅWß—¾ã×—ß–HñtY×eRm¬4R_1‹µêŸÄ@êAýq,¡"pb‰wwqÔØ^ÀÝmÅ]cµøþg)xÚJBgš}˜§Z'rTåE.a¤Êdçá©è+ýˆhˆÝ®—Ö¿a/ëßká´r¦ÛÙÛîH!Äl܉p´ÛÅÑR,a2Ÿz½M{nN3\ªE,mb•Âe–â–fšª G}øtyôà«W/í”PjpV^UVá2øZ-×t~úŠîq„ÞÓ‘¸#U ¬´ \«Î±°B©,„oT ©1º–‹_{n GÄ1zx&Ev`ÃzgÕ‹bÙ”‰ö[}»ÐLsg@ " pû‚YBq¯¹Å#º ôð(ó´ž3—Ê·]‹ôÄQ¥VÆÆòN vGðLxBª')Š? bazŒyÈñff(Y\íÂ,JWÇÐh%õ@9 JÇ ûdTÇÎöOôö$ó„礄îÒeÃÜlZhù˜ÑMs´Ú°GgYIåÌ/ˆð·ºGfYš5Ø7Œ5Dxâà¯Alñ,Ъê9BKîo½ c¡££e:ê÷_Å #«æ‹%®¦ªóŠ&0Ðöy(® #Ã|‚ÑÿÊthäÓƒŽ`üû”骇<±®º¸iö5ÌnPÎz§ZœT“éÐAM2§cgbCø„Ü?m¸TW(ޏV;ä¦ÚÊë0¶H†¥²ÀC{ñ°×“.äÈÀ­ÉFmw ¼_ؤý+íxÑ|ÈIóC7®þáÀSî½%M›²ÆÃ¢GzÈóSëÌ`«OR¥Î€µ¨ðÿ𲱑ënEàyC!H.ôÜÖEÚ£s£ã¾q)ÒùNXРM”r®†,( NgÀš&7ØüËïTé'Äz–˜)øº3uî™Ô1Èɜ蟿øê·òW÷rª{º†ª(‚Û0HD4¯Ÿoò¾ ýãc§š 飡p+€žø&G Íç”®V2ÊTCQ‡¢ÏdûDVçˆavOØXvåZP56Pè.!¸Dô11qQûä œ,ñt€À7ö6".F€·Ät‹L¼µWãM®y`̲*­ŠÑ{1;ë§r¶§8—¼‡Ï†NÐi f³.®¥„Ê:ø•^%Ç&LpN¬2ˆÇŒ'òÈ‘"¡û¨ÛG"܇?¢à¬l%´¶~—Ge·1ù•°æÿ“H`¶¿ÿí?ðƒÁ”­V} Äž ¨g{¨ãŸÿþ·ÿTuG·*·xÌÌ·"ïŒå²(ŒŽSe©ö©’»C‰·¬ÝÕ./ßH/Ïc,½%‡uñic‡Æ__k„qì ¥w{H ÓHã쎶ÒÈŸd~¢ùsºW0~8Àú ’WdúJN4¥ â(wÚ…áj¿ËkEþ5*:5¦‰}yÿ:ž{­~Vc;l·¯]è`jI`qŰ1¸´TýpŠ…—Àå.q‚ÀRÐ]‰»7±òd"¥†Ä"U@š¬ÍLúís8ìÒ”Kâ"Ã1ÁÅzµˆhš¨hÖL“Æë•oæ¿aòFÍÛ’Ë»žˆÝóÞT¡ rKÛbVѨ¸;Ä¿Œ°4­q­ížtÊhr! Îk—©Ÿîäŵå[øä=e0ÒP²LÅ÷òˆ¥J&KGˆ—î6ÈÙW„C•…7ÄC±:>æ¯|#ÕŠM7Ï8ôËö©˜ZÙ\W3#{"m1tJïÄg&hñ±¥”<´Ø-Ž Lc^*Éü'™0óÛ3Ï¡åu!±T J¯š‘5o% ¼ÐŒ^Ï[³#ùÄLâKR±*ÝÓˆ&«äkŸiDÍQ$ÿR™JÞ¢4s 7Â_òb›¼FYJ§'î¢Í%UÅŸ+;¾1¿’D:ˆ´…×Úb.>Oüë6°øú±DÙÄ"k’ûFˆBçø`«®§Š:‹†€‡ª0t³ÁÖ¥Nžl…µ)ŇEÖø®á†Kú͈·0x‘V²Ì€Pæ'‚'ñÁíJK‚Ä•‘a˜uLê@9sê×Í¥Ù›c3 ƒ¼œÀ‹5ú ü~m¢‚¾†U¿2电ð‰Á× ¾àÄè/‰ôÉÓ‡RHFú¿¹©ÉQ⥓Ïi´L!Y¡3£'¾CoNE “ éM†XÅsZVZOûpX0õ¸VRÞ.I¯Ã¢áó¶%Ó\fªA§°î¬¢×¨ËåöUnx¥4ŽÓ·E~ØZb3Öö±”ÙW™ž¹ë|1H*}¡»š$¬ž3¹!°ƒiÁˆpj #{›¹nÚa @]éF%Ö¡/Ë7½¡I¨Øþ¸’³€Sæ/XaÙ㣥‡¢'U)\×¾§0 öÈ¢kïÓç›\‘®ñ¤y'á+”ô{¿Ob6hÊl²tšó­ögÝ ©R• Bw-Æ èW„&)“ç'~ͼþ1ñ¦âJ—)ߢ•PíÉÉš”@ß٦Ťï83ËCK^ꢣ2Wµ(„ä´b žjB÷v¡%v½K)SU ¢ogh2ƒ§VÄ铃(Ã:=p!ôv óz«o)%¦j1YH¦¨Aé•O+«NgxhÐ l>„d(ÀÚ§¼†FØù{û™À¬½Z°$D0¨¯Ù =ŒX sK³$›=úÝ„m¶ÐvNþD³CRŸKqL’S=J”ÞÉ' ’Guñª‹fˆü†dÕç; {"Zîã «Etûî7ϸ•!—s¡°ÎBZ\¡úŒkq Ó+:ÃÞJyuà£{妋´æ€áÆÝôç•@uþþŸíÒ¯a’‡ŽÕo!øî¤ÙX  —¡j«Äùm`VsÖw2¹³|Í G~š›þ®‘ÍKÅI’A˜Š†i@4Q›j™§V{sÐ •š®}:× Qy.×¹Õ5Ì~qÄt±¬(­mu(YŒ¾‰|Cí§®‡¿‰¬ *Ц¥ Ð4U°lA7u+d$½}ÃPògïWͬn˜C«Ö¯÷xûä2GßH„RØ48zö&ÈžÐÕ™Ž˜~¬‡ „¦iÂÖ¾ɲâ|‡oú<ߨ'†„ÎÜ]Xa|cRÉŽÜH! »’VÞwuBAbжÄǪºçÖË1²ˆÄZÜéÉòõÐϦ:V‡‹#´üSým@שûnovP÷N¯B@xwŠC Ç­Ñ'ûÆM”à¢n ‚ÛçÃݘx,Šbò)ëY°OÂMX,ßV{çÑÎZB~š²9ØK]ÁBy0üÍÞK¡,©(XN“ÉKû4õ‰bšÁŽ +'°t EV^[©8?Ð Ÿç0% %··âA¤Õp=´3?Úã æ0Ÿ`¾ $·;Bõ¨<öW`YrœúªneÙ¦N©>H@•³ê^TªüoŒì(ýówt\k¶a°ïpÞ!Ö{؋ͯÑN9¸:´/˜±j_†'uÂÍ¥ï?I'ˆËíJH&m *Õ§â åK»Éi¥iPMÇ€PŠã9ŒwîÏŠ`uÊ<ŸP²2ñr‚Ã9—îç…¾¡¶qdË7 7¨wp†“j§ÐM¿EhwUN›òìJ¹â¬*›M ä‘IgÁ¶èÐ’†³WkSÞlÏ)rXuáˆû(Ž©fÆÕD•;Žž¦ê\5yòÅKxp]-öìñ&Í¢âyۤʙŒSú{TÌÕæÀ˜¦+owX›Nunss”©ý‘­¡¨ œ:à ÎÓNÕÕ(άáp.÷™¼Ç퀃mƒÆó;&@¯Wm™ÅÆLMÂ騼N®å³'åüøÜ{*ƒs_?,úâŒ]ÏÂevJ|9ΧÌ|Ì&¨£¦im˜¯–ØÖ%årŠÐ5Ù´¦³ôÁ^¤RùÛ 3¦»…QG??é½w«NV‰ÉÕ‘Kû;¨S(/ì}áýý‡ùýEU”R‡UÄ,JÖ”5¹MºšÎ»ñ¸¤ËM \¡ðÒ_;´àKäiE>$ƒ.Óšîzž¡&>ŽîéæÍƒ,k¬VjÓV.E&)'ùQÅI>Ú9hIÞ#¿ŒËT©3»ˆ«à%òU´!/Ô'Ôþš(«ÏjÁªö}®±°²©jx‰^øH*5ðM–¾´¾|«wd²G0”’ » Ïßà¬âo7ΟäA`ï6•ú˜¤l¬¾Ë"ø(øýO(ä0= ö‚r‰YÈŽ©ûö®©À[›—ãbàþ°¥…ËÁ3|„õrŸ“ÑRׯÃ2Uââ³äôR­ƒYsɸe†]‹4uÀÌ B‹$Iº7ž1ôÇo [ø$\÷q̆2%£$žH$¼ô¶0"QøÔ‡òޱ%>XÅvðêý§\bÌOÛ³jþS“#YH)9Ñ`­¨ÍÎz˜Á·Ä™U²°@]ýÝO9ßíœ ð­ìPǵ|¡Ý°G®<‰O×tCØA®#”ÇDU㾚ìרñõèÂ@¹Vbl@ñµà؉ –¥[çûc® ½ªJ®Âm„ìü¡eÍh‹#å–ûRZºŠ¿p“7:Š7b‡ocç¤?ûòR'ƒ76ÏNv_”]z¡ÓšL„¿Ð~\&-:âçZeiýFàEØR=fÐX '¤c¡Dve¹gx…PHÅÉÍÜ,ˆ¨’™¶íÊ?N-õ×äQº¥Žä]ÁãùIJºÁFUÅV…€ 'EÂ¥'d¯ßžÔbx–§P³’Ux‡ÐÅqÓw)dÂ&|¥ý£È3ºb*‚åK'"Zã M"B*ž}¾*å¤c5/J’ƒ4[Š@úä´)f”¨´n†¬„„cG©k\Șä嚉‡eOeÆ1…“åôSfòŸÓmèDtßÓweŠå3,>u~h^ÕÁðÓ ÅP´ž/È1ñ‰â~ÛXžÕ˜S‘ÒER§R÷µ«Î­ÈF+J'~-0©•[¹dÔŽ¿÷æÑŽ;ç<‹–/9 -ÔüAÓ·.„ŽÊ„–ûÊcl­ÅjÈ>GªÔ]hu¬åz0ò2cNöR(Ù°ª¡väCÃa ÙéF}aÜUú>¶Ð«V*ôd¥œ²²Ù‘b’½È…Ëì@&ŸÅ÷­•ÃŒ[ÎHXÕ…çÅlåôíXuHLÇæ YT #ms_zÔêò†|ºCà]´„U%]žÆþE©€4š›ù¤‹iY¥­e<”§QL—‡A¶|öëÑf¬4pÐ.ZxûC¡gDA»IÁ¹ƒ †ö».½Xf§©á¯é“·ß "ñ…zñL~Tš"Lua¦,Њmó`e›cnZáÅ÷ø =$Àܵ–[ê˰œ5ù¢HË¡½,¶ <'Êw”Íu°âƒ*e5n 䑊ƢÏÝ0dT-ÅNWª´|qn‚åÁ†Ñ¿UÔqpH÷2À²M$^qIi·dh*y¾%è†$s‚ö—}žÆú8Vd¬“÷kH¾(5˜y _oÉíH£s²Iåò›g/æ3ÌœÃIº¨êÜà”\§vìU„¥*N§p%hdM>v[ìv8G©vèmƒæšÇ™šjPEŸÍ¦$]Ôƒ`Zl²E_¢Nv1†y>¡u¡/PxÒÙж*ãéFù€}ËŠ£m¤D”×ýI”¡o1DÊw)2xåkØÃ‰ÞØ@³/½*ß1Ñ)Ýü¹³…LÃQ‡SË·‹¬ùS¤Ë4æ½åLDVÓÇ©UçËÓ×ó¾P1OÛDþ†‡Â”¨Ž‹älMn¸v7†L‘ê A}Å ³t·.+æÕh8¶JôEIÎáÞ©¼aKµ7=Ö½á¦*Jï7‡*²˜ˆïŽLíÉ ‘1‹·ÝQŸR^Yð…Rü³ÝkÛ4ñàÔQ‡0Ú5øw€-”/p¿¬-§èÓ“ª‰ZPÕLÌ*|¾T\,·ÐFÖ'ìX?ð†øà ­ ?¸#òwq(…%†$-º_&ç>fo ’ óL‚ƒ©ëí«iËY•~†\Næ“óÍEW+P³”¶ÅSæ©•¨&xP¤iœ÷i•ÊŒfð)8Td裩Y4ÕD•ÃD8Í´èy õלÄà´î©X„µš`®#âK"*Rwðõµ}+~‰Õ¿ôùjÙlò¥‘Z²¦ð>_‰T([Í¿Úùž+T‚ÿŒ•£öÂÏ{²eæ“¥½A¾Œ¢žôU–ZçoÔ'ö_ÂCßÑø2/ôÇ3Vóù,] }O¶ØøµS¡¡Ÿ 09á x"©dÖý¶‡ÔK‡@‰åp?„¥0‰h2×Õrí’ «y¡/¦b°t€“2¬Ê¯((üÆ¢!0L™ÉD¡d•ó æ©õöòË>܇NMIÕ”q°}Z›‘[”€G–dΙ÷*ƒýn5hm‹ÔÊÍ«tÖåÍp㊛ï8€ïÿ\ýDV¡‰âÔÊ‘RGIƒ*ê@ÅbdyåûÞx2‚i–5¸2x¡ƒÍeQ7[œ9‡JÑ¿1‰Kðr¥ðQ☧u‰æS=½4^±]¢ÑÙ´›2iÑBöƒXꜮ}÷VÀäsÉÓM·!R± ­êà²æ JõMa·[Ây2îBdõºÁ¶y¿–m‡*QA¥E¥ã¦VÇ%SòÝ:Wí.À8Úg©õhiîÿL Vm_èQŽ¿ÿíy8oIC(Áí[§# ’\ÜHŽÅ‚=á,¶t*—cäÆÒªnuJ®›4ëÏÙù9M²‹œÈ=OwlUËuµçxÍÌ^-¬Äœ$xE>¤½Mß­Šúë ÆŠ3xZÚøà1sa:5ôS^tê BÉ@³Dk; <<˜‰¦X3\¢9¦Ê`|sC¡œ˜$:†¹ÜJ‹ FПhéݳù7$u3=ñ*ÓéåsôZ±«% Í HcLZªQ ež‹ª5¶Ñ4ŠU9± „ŽÔš‚»òŽ„Î3¼ÏÁÐ¥ØlùþI{Ì·‘®íjåB‚,ó`‰£õ:Z¢ ?£+TŠT-GžÊ báË¢J+æpÓKB\{γ°Är€e*h â4É'r)ýý>ÝÇg[?ñê_Is þ¡\V”6%¤AžÌW+hüÕ}• è~M”Þ˜I˜ø)ËxbÂO³ _Û(!Y OºÓáÈ8C6¥qšîÚXU&aCLÙ[ø»NWö0ÑÄW^¨Loõ¬–è_™*‘Àjl†³*Î!Í9lO5Owú¼F6iMûvôûÊáÖöS™„‘­¼–òìZþ4Ž–‡VFÊ!mvQµÞòÞ;!Ìj%y˜jŽK(Kkp*RÒ÷5oè[x)“þˆ?ëÙ>I¬ƒssbú]gY) ¶m,œC˜Óo ‹r´ÚÊTvÇ ŸOþmy=ü§• þ4bn’Ûö‡ ¯›¢W iä/m¤˜.¼¤°,HCZ9P¡K[V*‡”ÊÙ4]×fç#±[‰)EÐr.Z«ð‡4‚Õ4ûUÔ4Éq’ ùé.H¢Ý5u)¸#%ytÿnB‹ÍŽyµL.ð‰'$=Td¨Œò‡ïl4œÂ"Ö·R_ÿáKú÷Ûoøß?|ÇÿþéŸx"ï.tK<­ž¬e9‡‡éÈ~>í7xèk myUe¡i—sQ5j»)̨DvLõ‘9±RCºJ-TZQÚ^͆ã±ÁŸKíÏ{.% žÈE}‘6;ü€vlÒ˦ÜG1 뇖i‚V椯„àýUªÏsŒùõ+Õ¯ÂâÓ‘@Lê´ß{ú5Ú}ã-õÎR±a`O.b æM2Î2ÒDö¢lÒÄ&ìE<‘‹{üô2éo +ÙHlŸ›9E‹™yÈ \òÐÎ2 ){é¬1ªdI«ó‹)¦€c54vRô°q_6œ|+Yje\¶žˆ¹OË” N3¯^"¥©¢8§ž.Ùœ2)ƒ°Ž2  •jyµ"dª,Då¦)î@ÞQKß„¡Q©ñ’å>C¹ÚÁ^†J–;ñ €5=\îKr˜¥Nlãó<Šœ „Ðm°]òö??B*rÉÆ¨¡IrB’VZÃðÆ^QÚ4±Ž­¦ÊSéª$ß×Ð=¦û N5 1¼™ÕKàD±`Ë•J»33r¢Þ„´o¬óˆTUO™kùˆÁn‹HônòÆ¡E`"o­(åÕÔ^&— £ürü¢Ö†Ž—¨¡»†ž·;H® u=MНNlxÀÈHCV¤ˆÈå§{ϾX%Ή¶Ix#¤œK7é,†ª@ÒD+-C‚nPˆ§¶û.²»°!ù=aÃÿa7âCcüçERÞ‹o£|òÛ÷ØÈŒ!‰™û°fh1š‡ìjÊÜ+¹¹8îøv^î9’õ{šªµI– ¾ ø¬¿ã¿ZwGRÚÎÃ#¤Àδî­%ßH]í…12[G&½õmRDŒ)ÿÿ=)ýø’¡¸è¾þ² ý(™V.‰Õ€¼ª#­ÒoD5 u±Ê=Gu/¾‘`=2é5:þ­[­2x·ÐTþnwön3ƒ´“]f–¦¼Ò­<ÇN#r$éPgÄdȾî³Ò O$RÑ<ªñò&EÕ‹…Šé$NÅ2:5p 7h!id“~I1Û”X”÷1CŸ·“¿v´¬FÞW¹ògįD³çOóÛ/ÇJÜN7«ž:àËÔ,éåÅWd­72øÿúó?tq’>I>7 ©W"»Uü‡v«0=MpR—Ýöøx#uTÔâ2…Y…A÷|ƒzßì*u8Maßëå+玿3PHÇ>3¥o•Îÿqqâ8(€éõ6w.àüˆÐ%]˧›»CFµÁh;o™Â€hš>â‘–t$ƒþþXR¯4ñ4á„'*°€N“3yüàšPXæËº lÕÂm«áG²‰DgŒo51e²Ü´Ìº: ÏV{À8Àj¤Lh>÷ õ1-‘Nû)f9^@ØN+§é{ņo´E¬ÒYæðF_­<Ÿx¥¾ïJ~ÜteF¡.xIgËîyÎAsP"œŠ«ùœÑM²öêj7_uÝn¢„=[‚*¿ YY°SÛ@‘U™Gm¥'Ü<¢r„_ê—gò.¢evXUÓ²vK€'RR¡U§JçÍ2RÑ&h?†Uàâ:úõôþϨlÖð!µ´-ëÙáe“°ÌÁèOYS˜7³jå“öBL)1I'+!²-gKZ˜ìKÿ[U “Û^Ÿ¡ŠºÑCB5ôøQKD¯¨_Ú‹–xRN= %+VD­¥‘;ªz+åönYKï–5{·èÀ1ݯJOúéì:úîï):g^Â…à÷wí5‚ó#Æ_k3ø§O=&¶Ö;¢7ÒªO€›¸Ž!&2R¹‘áëª n\Í¥µ=É(é¾Û—ÏRQZ—vò× ª‘t×í¼¨½Êò™„¯û•Ýæjw”¶ ÑÎy°.Ws¯Í7lÊÊn¾(<[?’ˆÎ^Qödó¨a"W æ Æ5K šÞ4*äÑçëkU“î¶(Æ,µ·'hgdó##é@]lë(¾Gƒ®¢¢F‚'°Œ+fÚT¡üé(4Lc@À–Ù×ÚXú±ázy©Õ@ìíÀÀ'Ü$¢Â! ¿¹÷g<6áõ)îFlY0{*š:n‘y´| q¥6c-mX˜Ú‡–âþ\œ ôˆa™ŽfemÔî¼ä… Ç2tØ ËÏWR°1d±VÔóFK\š¹ >° Lbµ­|Ö1ùLŠdJšÆ>µ´¨œ`µ~d-=£È}‹?=a¹Zú/?_x—þ"¯²'7˜x ±ªìIMU^Q®¸ý|}ö»ûê¿(ÊÌm§' MTÊÍ|§ÅQ5§:ôº§ =êØ°ÈØ¹µSm?s[jRA.«´™AúLöŒïº·Nƒø™‘gª»Ô%cçÆ«ØLd(‘ L=eLMí ãÌî­‘²™.oK78<‘ÀHe¬1\Šì¶ÌñÚ¥¥õ@s¢Š$(<ÃÏÊ®sdYоyxEi"ÊéGU¬4\lºÇ="AO꺧zAxª€ä¿óELS:bCuK<± :W¤‹wOTÞx~#ŽŸh(¡R1ëb¯¢¨4€¹þnDx"!‘ ãÀÑ fØÃèÈ(( ZN%¼î¶–ª’ŒI)ô„¤0•µH4=øQÛÑÃ/ƒâ9^V8×ÉÄ\G…G¥¯ìÒ3 Ë”ØÐO_ô]—„2-JÏúÉ$&ÑáWS5Aà×ï¾oÝdØF™œ8=“èLIÝÁ4x£›­É6c!/)¬¶v´ÇŒoÐËåBü•™¥Ÿ`Ÿ7;K kÖîø1|À†¬aÓ¤–Fæ”âýžíP=ŹxâÂ&Ú˜ÿnLï¿*ŠÂ©†ð#Fb:kWt×o`ì•ô³f>Ssžp"gŸd›ˆ \žBÐvÂ?7 J1¼ÈoI¦ Ög/?sÀµ5\ˆÚã¿«šÈy©‡8u `Kw¶'ó\ z܃sÓÆ%ª®îZ8Ôa,EèF”5 #¢1.õ—ÜtŠÉ§OÒ‰§´Iã­QÏp¬FXoˉO“¨È¥Dgç DrfJŒa ×î¿Kä:å—¯Ó®Ô²¹80[ïh‘çÚ§³ZÕ…{ªÁFE„½¸¹ÄÝÍœf+¯¡iåIsÑch¨Ö3Ï7=a8¢jÝqóývY¼ñ+iTJ¨âBÅ'ŒJTv®·µ¾#ënÄá÷S0Ÿ›2 O…TÇËë8/T•²R:ee*•Õ"™å=ºeõÊ%8“ò#Fe:ìëŸbÈÖ´ÿâGÝØèë¿ÃàSÁyZJåž•œ û Ÿ_¿¼¾>Á¯›í$ü9ÚÂà3âĬ¥Æ‡V²…&µØ˜Å¾*V,N¬5™;›ƒ~ª¡™ºcã7žuÍF²P†[ˆQDC{|Úñ˜\@ÃÉ^*C.Sæþŵ^áÑ=…žšÈH­oMÄç¹&üKñ i]ª‘ ¼QûQYß ÃöÐd`ò§ä6–‚ÚŸXªPÊ &Aõ§Ãý¨jÖIãF$ Ð8.®›utò¥uÒG$1›Ó™GµQOeö+EÝ6oV›•δކágÜ@Ii›Ùdl}ÑXA ”É”ãîVé.ójPŽH½Ý¨tÈíº™š€‹ŸG„&ЧöVÍU±ÐÛ@{ÐbÉGR*û…v½½N]!4óæXÓòÈC''Õ{Fy0{cuéäÌSKO”H Òn¼ô·Œá—·? U|¨u²^;õoùŒ¥Ü(§²ë’Õ­h:¨FYaCBé3¦ð#‰OtŽI E” ´ms¨Ó¥X7x&[È”ô‰î£ ÎJH³®Ïtî\²|ÈЊ–Ôø«ç>Ò—®@§*Pi nàòÂp=3êRUœ{…¢'’Óí]¤ ªÉ#.|)*éŠ àAœþ:Ž¡€ÔÎü\œ,<ú™rŽ$à¼(ô"#)º”ÝÜïµòŒ»Á(95˜éŒcWfÚào¦Ë—]ؘ+i*ŽU¿ “Îh#†²ÄL"â4”cNŽàÙzÖ'O<¶Å=®weB#pVBB­–‰RRÏs· Ú|nã#Ž!îHü×> x|sºT¶,ƒÛ”(#„³*¬¡DlÕ´„›™wpÐÙ‚-Üæùšá¿e³»´Û™uÖû–uÖz½š/ T±[1¨˜NÃŽAXû&‹b?2é©ã@YX‰æ³œß§N />`4¤á„JœB Qp ò¢[™ÚJÝŒŒÙ©_<3D%]²ÑV" 2Ы¥o¥G˜èÔttóùâ¼½%c@<` ¤QÙ#Ñ2øé^µO¥±J;ÊT4©W<4ä -)`pùƒËX2<ÏÌÒÓPÅ_`¡uß= IL¯ß‹ýJðçÖ©v_Õòz¨æë!•1‰·{‡\7eíQYð bÒ?9•ä;T'Jí:ö~³NVBIGS ùáZå 1¯¦<Úeâ/ߦO”(¹]›1X(o‘™ö,ð-û¡Ï#ÇxLÈ&=«Ê¸Ÿ¾o6d ª®¡)JÆ«Q³BÃi'Ï«â\åîalØøÄBðläl;k[Ôq_ 7¥O&!²ý£¬Ó™)ïɃÎË4žF®åÁ®£"6¥o¢'Ü R­?_®ÎulQÛìÏ<˜¤Ÿ›ÈÌAÛˆÌ'"cÊ$c‡A&.Ó¯è¶T¯GùÜ’Úòìwƒ³¤›SeAÛRXx¦°$I.c£„C½™â-/R, èÍoóÚ×¥²…Üèû`ø1á³êEýdt§ÓhҰŤi<·‘MC.û­m©i²™/›IÄŒ”½/_ÎÞ«B¯ÏK<6ˆÏqõñ4zýj_¡>¤k§§üN¨HÛ½\!… ÿ•uƒñ‡ªšˆniߥ}×£(鞆Š~¶…‰ûò~—0Îc÷o'¿¶: }—éÜ G‘é°]âߺò‰u«®ü]pò©DTÔ*ë<Ä“X>âw7ïî¸ð’S†Q“ ¼`¹–SÏ*%8vD ?½H©eðo_:„ºôè=‚¢4ª·Íßàƒ¶û¹Jž|ò°Ø—”tí¼>ù}ŸÃ¯«=O™°^p3ÑM›OÖ °¢!…Än¤Žä,½ ¼l [žø/3Ú>Ž îw^Þ•æÍ¶dزÄÿtAx—/w4hŽ;ž(@ ÑÆ«ËS¾„$ £¯ºóøý¡í)Ç oâbÇ?µV\¦÷_³Z– 㢕2“JIíëÕ?²")œÖNzB¨LÅÑSä] ‡]¼fáƒ0¤›`Ë·ï³Qó#%@Y¨ƒk`41üãìÒ ÉQØnPz¨`™‡#ýS†Ì`TÉ?œ­ö쨽á¹3˜Ñj†7eâ5¦Ðá®Ä‰ËÏ[Rb›O>9~6ÌyÓtÝVÝñ'YGªÂÔHTºìaÉ•¢dt¹Cò7cî=t¿]1Uq •ÚÌÈ“Vtí‚-d\ÀÛEæÍ )õÊ* éË*­›‚âªôÛÒX((ÙC6X¯Ê÷Û >.rLXCˆØSæ›FºNÑÌþr¤Àld¬†0äeÌérª1õá ¹Å¹ˆ¸%\5~\ß—7žrµI ( ìM¹ÎàpBòX‘K€ØLä¨3ª"‰Å›é«gi·ž …‘Òƒ-,jì³X¼tjÕx_‚-¤Ǿ\"ˆ{ƒÿê²ËØð€Ú©WDmܵkÒö^53kâŸq2KŠz s˜@0%“ÙC"ÆÚ,S0‡0€â¦'Ì£b—o˜W¡ÞÂ:’v\/ÝŸÃÔîeãzÞ(šX®ªUu–Ma\¯Íú'"øap;Ñ!°‡Å ƒ®§ƒÐ.N)ÙzZÒñb9FÊ™Ávj‡¼;…<óU$@ï«4Béšñ±6P\zÆXVŒÌlp^%Û#À€·ŠP~!1ùyÔ22P^ÜFÔù'Ÿ1üAW$>¿¿ÿë™ Š¦] ú”W`éƒØ¥Ûòv¯ÛÊsÚ¿dèì¦Òv;£zËL§PIÁK~©s¹‡NR€ f<áPÚcBƳA~‡…¬)yçØýœ˜eö úk‚nxëY5!$g›Írÿ$Û c"—èòg@»W,†&¦¥O«‘™fh¬@uh¨nPFŽÚÑÿ$²f±¾ëÓÞòµ±8Õ©½> ô·ÓÕm:Sª‰QeM_*µÍ¤›\|¾_S1yÁM›ê™G$Ý1d¨‡,¬Yú¸·J¦ReÍì­âï2Á¶V%ã?€2Á'‘Iåu%6]1`c»ÊP§÷U|qòþ×É?%†V‰øªBKȳ!Í ic¦÷Ì?‡ È«*hƒø7ÚáPôñïq>±åßn<£ÔL+‚{½ ´ùÌ<ÞA윰P¡Xw`C*Õ»ä†ÿβ2ˆù‚hÛ¼cÞ€!Úï°’žCü@hqôÉôw¿NÜ~ –)wZ…µcÿÅàÕy¿tZ¿šÍÃX/Þ´¸FÉÌmÉ£ú‹Óéýµž€+¬o·0Œ2ÿÄè7«ª×¿˜ ód²±ösyWè:T£7ÈÌ8Ó ÈFæ "_F¡™©z&©s×~Ü~!9eIL™¶@&‹±O–q‹äek,zv(@Å• u‰+~VŸ¨(:» 1ó#ýÒD)ÓÉY¬Çl&ÝÒ¨ $K£‚„#»“óÍÁÅBtL‚Ï2×:#¯‘tÉ1¼UÚ%RÉ—8‘lޱ¶]wúU§^°Æm0*cžNWÜSnÎlìD0ýÓ¸Lu?³O±Ê“ÑÒÌ«GÁx•®ò9Û.N~Ÿ\žÜüCyi:g­R \dE »®8ň‘¸c§ºPälÄp9vÚ­“éÐ]èz›)~ÑÌt¦Ð~á²Ô„äÞ¤]mÑ;4þ¬¯@CßB]£0‚Ôé†>+í†Æ=«ˆ¦ÒÇÈŠa‘‘ͪO?ô8–b¦'ˆX9<…™J S±#^`^{-Æ¡5,µ«Ò9-´JŒ-õ—R<{V†ÖÎóäh…õÁ¬Ð¥R´Â?Ï€MÊ;í¢#?”Ö,ãÏ3ÏÙÐ »ÒLd&ìáëØ‰q2Oª2\ >‘"]ãKçGgMäZì±bgpÒìã]2 „Šþ=[m)ÇänCŸoþ»¦4ÎéT²`xêÁ j6®t û§>Pà¶üÎÉÛÌ<Áª#·\[ù/ss#ÿŒ7âÆÜ åkµ"¢d†Õ=•.p@—µ’ ÂÛŠ0èP¿0ù<ÄpÏ œöù¶×œIØ_Ë@‚‡Æç ؤ1É–4ü;€H7ð „àóÓÖND…ï Ÿî=2kÄ{qŠ›À¢v›ù±x˜m¬hÅW¦¤Š¥VÉu¤_ ±éªÕa7µFŸ»Ö îjd:gTlbù€Ý§(bî ~Ù“ás“’)å)§o"")q$clÔ·Um{\$uµN_î¿84G?ÓÊ2‚Œ*–AÓQ¥…bÄ‘Ä- ŽƒÔ-Ó×kCÛ¤`Hs‰gôµmj…Œ“Šäs‘ˆ±û–J$І$j¹®š]9•9ÖôêWŠ”®÷ë2—é]ªÏâyûÂâœ*]ö/ Z„%øôËTYÒªzdà x„Æ2UµgYµOu½.¥˜ê$.ÄZÆ­häáé¡y[‘Ì{2ƒŠØÆÀ-"º+ñÞÞÀ »,.fbi *)ê–ðbkÿZ¦|ñd•3Ó W[9\cÎ\›ÅغßÔ‘—–Î?˜õ^Öeë`7¤\ŽDµJâ@6÷.ò€õÙ ¬Ï¸-´%æ³kR̵TFÁžKnÔ¦N¹K[_gŒƒ¾`¦ZaT0hV>‹×ŒS9:àŸ6“~Õ%À‰£VøKøK/º-Z±Ò=Ä”¸ràRÓónq²Jæp$Ãïp¤ÓÓƒ¥:D{MÒ¯M²¬Ðôì–¤ÌÒÈ <1ñà G“ ÂL¢ù—èHÚÿAØy9™/“»*与Ày¦šÍËÿB0±-5Åð{!iL¤ô†Uѱ.ù  \}R,4šZ]JÄ20? ½È ¯# ¤3ÝL!VZ&—OÄ Ãm†çGS†u=6<{–Ó”…jšÃo‰´1Ñkí7 ™Y¸ù–Ø‘‡3j÷«t:·€¡ ÜrIàôJ±Y¯"p¼¦Ó9ö´XIÒìÁpLàt]2ûx"ó8 ñþaŒ»ŸjÏíÒ÷+)‰Û)qê…ÂB3™~§­w¹ÀÎ âÓE²†;pÄy„óf‡½ </$"“.\ßË‚dÈ0Ou©Ãa3Æ(U/īմK£‚Œ^Ñ_‹AúuýC]{į^ù…¼)Dž¬é»öj¬Óµ¦'£l%AVbEyŒdzªóBæÔrغez¢Š˜€U¦@KÔqtRUàŽ3‹npOrºTn±(@4NËÏ~Rõ ÖÒ}uÔÊ÷´…·7dÙX°Œ¤üðÙ!¿Z±òu*szw_žZ›xÇæý+_£'®o?©0t©{¡fðÉ;5ñÓ)—ÍÓ_y=â¾ë§\!+Ó+´Õ“ A‘ë=g‚Âqb3.èÊ_ês0b>^N'Kp€fS4懀A8)c$Ž%R¬‘b :Ðs‘A=:‘i€:ÆM <¡·ºütƒÙXÅyQ^®›årK,Ái¢9î*U°ñüÓ—óóè’¹ö(‡«sá-éÔ•?=qïÎÝkw³‚Æ7BYöB†ì™õ2ºëˆQ1Ã`öÖÌ`z´…†]’ɳù<’-¡<ʱ8÷Ü~XaA èDáé!ßU-›ÍÊ Å±jåqˆß*YÏ\’… MLy¬é—w¦'­]I 1ƒoàˆáìžÎ宸!zH– ÇS÷æËYL ¥7³÷”ߘ-|ÎZ'ü¨0öò‚'S*ùí÷¼ŸÉ!N ±ÉðŠŒŸö 軥R º¡í 긴;ܱY¶3väb€ÎDiØUÃ̪63fŒ1_,=¨º—Lf­Ó£GÕ§Š ¶z*ÀªÝ`3bß•ˆP[ašÎ0í²®‚3rÁRÍÛ#1:ÖÓ "vDzÆD>­­§kM4Èb:`L„a ŠfÒ7À¬Z<ìHˌШÕe]LÇò€È³JâAZ"(b¾ž…!ý¤è5ÜÊŽ´CƯ°N™/’×A¯Ž#1K dGböHÙßRÊþq4]¤Ý¦Ðõ=r¶”sà’}ÇÕÁ¡dÂ÷=R_o)õµ”š”·YyWÄþCž9=â·wxÁJ1âîÊ4âr´¥£c¬ôHÞ9 Š7E 8Üùz¾„™ø6­S±x;}N½x’=bvåpª%pÙØÈm3Œ+KÏÖXwK¼+ÄY:Ošeónøžxx‡µ°ð<«?×PT: 'jÊr8$ŒêX…ÜéO¥@ÇV…³AÄ’OÕ;Ó˜\Ë@©‚KàÏŠ ˾h4™:*¾¥sâ¸7—öȹ£ï`cú¾Û‹üQ}µ ÿ•.ã¿äê{ m«L#â¶±í÷I«Þka—õ} "-…7Þ¡@ 66ï·FPQ¿Ü@¹ò˜xpe;nÿ¦[ÞÎÖMH½&n$fÑH\(VkaÚ%×r,¡E^ðéfÔ"u©ØœË*à€É kc#3ü063‹•…Ù9±»ß &gu Žu~—úoâ;øÄe5dPŒ$³F:5¸þâee¦º‡Çט^úá©Æ‹6ySJõ ÝyTˆ—»8eâLé0©WÄÏSLS‰C«RZrŒ Ð*[ÓÏÀ¤Ñ¤Óœš×c¦QÖ’fw{µÑG(Àmì– ™7Rnm ºI7ScQ|™ßm¡4ƒâŒ]÷BÈ€uÅåþ°ÃŒA;ês|1¼ß örw‹çyàŒøMpá®#÷EÁù¯-P(ÔGîäzÛB‚†Ñëžp·;Êý_Ä{—Ï3‹Cïvq6Ÿ¯tˆM^Þ‰Eäø°”_½?†R"(.²4ƒáb/wûHoZgdÌ»N…uƦ\|˜‹ž§ì5õ>¥h0HýQ¡óUì~´QÈ0ôÞHyÏ”6¤xuþ–¡L;ë4:‘ãÄÿ ó&F¿ò¹%‰¡!¶ 4Y…‰bó™LÍ݈.¯]2—»ý̨Ù8F5‘(‚2ƒj˜Yå5 à¾Tu2ö¤kò¶~Ì'X)·åÇœWO°ûÄ4@ªç«fÇIy›ð*Ü# Kš[ûö#0´j™A) °R‘+Ÿ„ûâf+Ñq)-D/^{/E_³¹ÐÁ%Žõ¤Ó?3¾øâw벟 Ú1ä=´¥\¢ Kûþ. 1³ãµÌx3¶ˆx ˆóZu¤ëlWè(ÆD0åN¦÷ëüQ@h”R²»³õ4/¡àÜ©^çóúQ,è$a„µ]Úõpkj¡8ZVlò¦˜ŠC—¼‘ЖìÇ5ÝÏ•]'áž;Ï’MŒWX=Šñw±Î9i<3⑪±ÁLÒjËÞaf@.é§œ>@ s8îëø0&Ò>ü¬3ٹȣ?úîrsyö½ÆP4Gw»c“ÿ;{¼˜P)žÉžmt캒³ê0‰#“‡> ×.->XÑ¡;K ¦móá «ÔSÜ­ªa$4|í’ ­í_ ,wdT¨#SLMŸ <•VÓ,£<\é,¦òX}·Î3êÉõéÙ'qE?ȧíßtðJEU‡[ N>*§‘TÕX7æ‘.†íböùl=&…2F’qµ*©‰3t¨&‚ˆVñ=Ê7QZl#d#ƒSöBæñ ƒ@rˆ—Ù}…Ý-*z¢wH˜i+qˆÕ c4@”â¬_¢ØX¸9-Ò"þñàõÁ°×Òå‡ËHãøùëÏÿ5å¯?ÿËEˆutˆutt 5ŸÅ.šÕä`«( ¥Š>‚ƒ{YÖ|eÎøo~ Äóãqt)Ö·íP—S¥KT1"óU(æ+zÿ–#°\þ%Üþ°ïÁíË«,q¬ú ÷))TB,Ìi¯¯bþm(üÛc¾–œ>þf!4qÈ]]SéÀ¼Dìƒß+lý£€>•×0b1ú ÷FzŠôîI\Ò”jsRÀ¸ Ó½ú1ô ÊcQ¯{KÎp‡Áp‡Çtñ€o©Šô$œW¡£QPë[±2‰K}—áöƒáÄÐ]D'¯d„£`1ÿÀÉ* ŸsA ÆxŒ!†ÁUú€ÙÂ~jæsÓGbÅM1K¼‘z†k¨†„féD­4ßänMÂT)Û™YÈ^Š~üb žÜV¨„PŽêSŽç"¤ý7¡HûoŽUŠ-™ŸTf؆v_oDŸ$lp÷E±Iâ¨9Íù’Ÿ@^γW¯1D}ÀâFò¢ÒiE¯^¼’àÁ³î5Ì:é+^»œ.¨@Æ'®AO€‡¯BÇÁá+Z²þ/Xã?_SèõçH嵋Rá_ûoñ‹CzÊ ûí ˆðBñÞÂì–åÕÙÇ Š¨^Ó©žàzºÓ†ƒÞü²†{ íâ%½ðË9”6Zò»¾ÞÛ§Å·{â›H¿f:ÚýCÛt¸l&%Z_£g“5÷Cw(÷7ã N#“@k,^ G20|0â›PÄ7êu'D™LàÉ(A`o ÏoÅòO“gÅût™ÞñEÄö]7·wòóò»ƒ@äwâÅ?‚-ãV{…]¥°Ûëá»7¡€â½yq8OÄv·`­A–Ê´×Þ ´…ööÏ_¹€Ë³€ Âx7¼6 ìwâì_/|C­$Л£!ó½µsÜâî;M…â1M#…K9ú'¬+·›ˆ}"6у«>Ä+s¢|h¿8ÙAl /ÐÉ °ò/]êß÷ŠÅ¦Ú>Ñå%ss¦K¯ƒôÚÝtNªUHd$|!Ú2 3Do<» Â.™Uœë¾Kø 5 Ü×0Ó#¦P`œ<¿ ùÜÔq>gȵÔ@‚êÿ°öŸ3Ÿ£A³êªƒƒÂº©Dܘxi3ªý­8rã*Ô¬ù¯U°¬ÈTA¸Àp/3Ð2Œ˜ôb˜½ðÓÂ7øy™ß¢ÉšuR½ Rc¯cÞ´»‹ qœ¬Ñ7ž0§«ß¾µa ;‡"ŠGqGV ™j(cþÒç‚/;à ƒ>uÕA5ìµÏÀÍ;¸ 92Ÿ\´‘“¶Ý«ÕοS¾ó/TììËxN¬2r•…Ò쥑õ È—FÇ*]nó—9% Ts;/¶ˆÜŒ©ºü|y ÷ bîî`Ö’Ë®»¼ScBU6>%{\çq¿Æ~¥èK<”X„Cå¥b¼°F˜áÚ"h¤GÃXЫÇ*ƒ†²/tÝm“]‡l…ú5_/7OD€×b2Âð‰(×þ!QeOfL,sœöæ”9h)Úšöe@±°Îšn·ep¢x^cŽ‘Ø0ð¹æ•qOw>3Gš3ÊdMñatÕë»jBsº™ï™Z|],°Ó1>hýGf°Wls—‡&±EiZzâžhõ.¤opÝwÂC_|.I0”1¼sUm¬ûeè¡ëþ˜žÀá…þΑÀå÷àkjz…‘Qææ þ3¦…²”ó0Y‹3»ÂZªôºUžNÇ«ß ÎUp×\#5$ï+à È”ÈÚÈ)qÊØŒå ìƒA¨èÜújžäÖæŠv©a¡…ºç¸C”ù]hÒ  ÖPs%,N£úšŠ…ónqÒ¡=þ¯we¨…zÇ­‰®¶¬cG`ÔjTK¨=y¼%çßÁÔ“­ª…Ôm€ÙÙŒUŒ~…ÚëðˆBÕd‹5ŒY%z’ä´ÀÄb³öÅr  1+Â=d)n'—gƒ:›&ÜôÀ1At‚ÊöD•¨0õWop¹;’sDam*HÆAææçfÙäì~–ˆ÷ˆá—±-n­šÇfDŸoØåõÇèüìôçëÑÉÏW>\|øt}'Ø¿ßüòùS„™G^ïÍí2Ã(oy@ñ—ø#G¦õÝKË'éŠò#ãòdù&a‘r¸ '÷BÌû- ¾\Âr¡Ê»Ê*ŸùTY™ÈÍbçfYÎXßÝnØíé{ß:/™DÀDr漿ÛIs¸çE{töÖ´® eewDâ¸ùïø÷ûí†ðÜXâ7ûo0Ñ—ø`Óõþëˆq]þ[©kNf3J\£ÎÁoЫ‚¡áâ+Mðºe3»âƒP#fýi:,_µÓdºøà…‡` —·%e¨ÐY‘RÇ4‚ò«&¡ÈØò1@_Éb3‡“'AÄ0ëâE6ó›tF g¬9á{­Ä¹,ŸgÃÇã—¤Æÿ§#ØFųô¶¹CO¢€”þï8"bÐHô|ç ½"ø[¬çóy•ÖA©Äi(J£ ú”º’v)c_èbdæ“=ZÜ|_ž),¢¼jÖXV%åå1»Õ5PÕb¿Mµíkdâàk»àã¯M–Ö»õŠùú­%ü? µþ¿;’"4T4·haœç8™À1ΗM§sij“éØX1cue¬g»”"Ñœrj©îDNÍúb[Ý”Ì&b Ìîð®ý7}‚».ž’}øÝ¦°¥c¢K&?û½-È®ÄjÂÑD>q®`¢~‰Ò!NèC»í]Ñ%Nv¸îµõ«º¯»}éTmÖÓÉYç“"¯ £Ñ7j)a¨1°‡‰cgõ­š¢ð] *à¹#‹……èWU»ÜS4žCÔn§©wŽòƒaƒÄ¶"ûL;·Àø-/EžíÞóÁu”©Çvmìq"÷ÉßE¯ Ú'u÷×íhÀ㮜¡ ª+ÓQíȨ%ÁRÀ1zRAB]‰2;ò JæN/ À®0Nz>Ùé §ê[,Êf1™gér¶Ã¥ ‹í_7åN]„LÄŽ¸o¦Òk³UºcÛ¯ Ø•¶È滌ú3ð²ò²ÞµMÔí¸c«] ¸GðŽ­v-`·à[FMÔ>‘ߢ—ûŒ£Á·èç>󍱨ìh=2»â`ãÙ¡.bàydíÎÔÀsÊê«ã¹‡è·0Bö›ái AäѪw÷ü·t!{åïÚ?Ì땽Ãáj"zåípÈšˆ.yT?e—c‰ÂVõní%Ñ!¬”õ×wЇˆå”Ù­w±ÞFöˆÞ}̺ë»ó¨u ¶+´Á¤g½ªÝø¡c‚ºDR‚ëÝ­6&¢C^V§;|7@ëÙiú _î ú½wšo%É3Íërój·÷‘Ñ%lçÂöýÂv.ìÀ/lç²<¢šÑÏômŠb·7þ&`GÚ·qÕpÓ{\dJûh‰dW\¶œM“oà¦×vˆ®½ Ø2%¢[Øn{ÕŸ3K=šXå'v*UCwÄ?}§ö§^¯ö§oàÖþä÷kÚéê“÷Ju¶¾Éî’ xY»>uP=rwh'0•0ôÉž'¾¢v…ÕÈf/ s0©ér9\”C …´ã•/k³™ª_rR-K•qø³u¾Ìï6’ëc+¢½ùGV`™*økß5™+á­é´ãižßߊÿ©Ò Ñßêèç/gX2‰ö¾6É’ yjêuE-½x¾6i“öç+gI/˜H%ïý°rÆrÆYb…»­€Î™•z»),fÝ© »¯Œª6ƒwckÜK&Y TƒŒ(ZRŠ&ä+Y(Äó¾DÔ)ˆX&FÐÄ(¡býžgTùa \‚I©’À'§øó%þ¬z¿LÍì0qkë¾—1QËt¨ŒÂ‚wÍ2)šàFŸ ÌÊ^ã5 ö4¯ ï@ª 7¨¨ëxÉ\¶¹L(w8PSRµ+‰ß—¤UÎb3Û|ШºÒÌVªzèi^Îú»uUeFÆü+ä0ºsÚ”ÝQ@9ÁU©åÊàfrYZ§LÅê<~j!W9ÉÒR™ŠzëM2G¬8N©´ËU*ë²`qûM‘V?¨Ôï⟰È|®ÖD+‚èà:ž®üóªNŸj«Û˜)âg‘X ’;(ÿ"V£©PÛÝoRÿÒ`¼~‰^F !– Gvôp(0[gkÞ÷Ô:éÛ]ytF—•ÄfV›8´‰)ò˜Èc ;Ê(¥ÌJFu¤ód}×@G“Zª9BÏòé úŽÅjø€Ê[Dµç(Ïå´«wQEVü{ÏW‚Çã(Ó#ëˆC&ÿ¢R(}p¶Æi¬aæË±þçÆà‡Äÿ±zÜÏ’œ‹ Rq‡vE7šQ-¿¨¤Ýmbµ×úô]`#tLtª;9@[J¥UàiÏrÃ9MÑ9ýÉ_÷ÜZ‹²£×D×o:ŽñêÀtÃú"5£›¼ˆ©Ž®~ ¨gsÐOµˆ¬wé“¿j>îÙrùüÛÍg)koI¦Ú¨ÏsÕ¬×XøFüVEM¥ é± ;r¤7ŒK"1¹QIz¹Ð€®Âª¥\2û3GgÄ héìGEZx6¤zSX‹>1@QsdÏ“Ùøx%¶Ò™X“U9ÔwÞ:(ï´däÜXp¼PYPä¶¹k½*ü¢ë›$X& )ÑOâp–[H+‡4΢´6ùÂT°T?€»\Ô3¡2¡À„Vycú•¿&*,½Jë6$£¨».ed Ô*_>¤ýåKÇ1cLŒWðÁçs*R Ðʪ4îpÇuÈ' wd›1FÆŸ jj&6F*‰þVœ{ä¥5ú)¹Ô9RÃŒ|Ïú¯ Gò5ާªCSͦ‹éª€ô3UpiRшå”kûaÂMq´ôŽÎêÔ,E†«.14\œ²„œÎýSª^”TÆLACh5— ‚ ¬ håÙÊ6rÅ`ñ‘&’²Ùæ«6ë˜+L˜»€Úðµ ®’'.˜ØûŽO«å A*ßQ;³]°!å‘n°#ÁrÝ“ß?HF Å¿šåÉä1Pà<&µKÏhÄZ§úæ"ÛxÁH¡c\#ÊÑ:¯#Ο!¦ÿ¼_晉`¯‚³˜L³'"1kª&ZåM)ÎAæüõ „•ÚÆ^•&åtaK ßX•£ç—bR2müPQ(æy‚È¿û>z¨^P¹áï¾bZ€˜o÷þ qû†ö5€¢s Gf·y»ª®Á««˜¸ŒößG'ÑOPL7Yã‘[¡¤P ]tVutp]S¯b°’ß@lVI* D|óî8R<Ü9€£R…6íP¼%+Ý?+^'Tµƒ_…A Âc¥ýaa@ܧ.xçFÃÅ{9m û¡ö±ò©”Ñ/PÎF: E¯F€¸‚’Ô8R`¡lÁ½ …{#^Í8âÛê:†ÌY=Ï Ç”0ö®É˜ý‘JKVt¢êéIhô øÚЦ"®‘ø±~lâǤ\wDzZטl"ÉŒµ;]%Å"4›v¶ºkɨì†jܦ©‘ÔBËÖRgñ?~¦¹™V–Þµ¹{ÎJôúDKKšoçše󹡵H‘ÌÓnvl…²8×-­ù&Ì®©â¡³¢8nÁ-G„Çš*žl K¸RõaÕ,iW%-ÉàZ ÷ÝÀèDez—¨ÎADï %Ï…ššz^0ʇ´¤ºã‹8_#7Ò5ë5à¯5Ç«#e·` †Nbþ =›´߈³¥`íéKñÔlµñ¾¨º¦ë‡‡¤½¡Õâåc¶žå•^›ÀÞÞTÇ€ƒãEðfeŽå¤"’¦ÈMáTÎMÕžš÷ž¿‰õKšJ®!:5µu\÷šÜç|ÐHC$~ìk|¾W-`œ èÌ@¢t>øC!䃌¤²ñ. Æ%ÑGW ŽÄøÚäu*7¹ èøÜ1¨ Ùäþžju?.™¢T}7ºÏ@­ñt–•[A“Ý&B ‚AS‹SÀ˜VKžv£Å"TC|²Ž(ë:Nçâ,+ Šõ‘sÙÁ‹6Â@؆r5ömˆC¿KvG7Á}HÓ¹Þ¦Ÿ+¨e“îQ…ð_ª¿Ì¶We]éý–™®)œ¨bÚxbÚ¨ú7'¢±¿8¿º<¥JÏ7|D\ÄÔßa¡øj%‚GÙ| j Pß!Çr ÓÜX ¾¯gcN,9¡Ö 1k ·NuÄìÛ(I°"—1˜’k«_“H¼­¬ø2«Á—E¤¦JceÙ‚!´Õ•, `?D €Þ»Z0QÅ|NGóÔ !K^ˆžµöuB’ޤĥÊ[OYcéJÊØ Í[h•tFV‘繯< ¨aܧÇêo„U󂂤ª1›!³Þ¼F…y–·õïlv$Xó- ‘d³Aâ¿þ°*\6F¸Ò>™ ýd²W­êb`ÝæX½¸¹ÔS¸·²\Œ´X"J¿áhƒú|ùô>­Þi:ªqn×~äUoÀH¾[BzÞb†#)ÞRÃ~O÷„ŒÓßÖ»0T«3À½1oÂ>å) Ç‚’¼k^ÇV¤žch¹Ýl¡]ó:ú7fPxWÖÓ?ø\3ãŸÐ)ö šÕFµ‰”¼ê>’Àß#)›óÌ{¨=öØŠVhºÜØ¿‹©cÉ/óü¾)‚çëµ-•¸%d-ó}éz†gñ6Ή,(\IÞ«´¡öÐÕYU s®øg%¶¨jŒË©ÀKî¡Ó™ ’ {ÕW8ÖÄÉ,)øÖFèð¯R4¡ðˆMéÕÄ{ªBˆ¡-# ò—üÌõÈñÕ‰tãE Øòÿvûú»i1·Ëüv`ŠÛ¢~ Q.g8£Lóe³ZWñí&V¹C@W¢Í]œµJxøÎp'AoŽ{•rÍ–Ë–®7FŠÐØóA¢µ• —À1ýzª‘{^ß§M]m¼Ñp‰ÁÆ’¾‡à"ƒ¢WQ‰0Y7š!b ˜Fù¨f3—=pñAw€kQM)Öïq=,^šLÒ,ë±Ol‘š¿Ö4×ðÚ 4VÝš⸼Nj¯¯qBÑ+ \ ã2Œ…ú]çåfÔ‚݉Î0ÄJD(™ñAPBðwì]“Í ô* â‹àÓ‰Óì:p\Ð%²br ÕéH°¹ô˜mƒ©ÏCÃÄ<‹|99·à{Y¼â7(Ñ.gY¶†i}mRëcz<_}+¼ò"Tüâ ™š®=B(Kb„%˰U‰‰5÷&t›æeF·s¥iÊ,‡˜ûQ/TÐ{²£1þ—«3Y-ã©X ÈÔÛÀJé<§1r¯ó5ööÛ5³R²×pA­¸èX€h\ u- aÖˆi«li¤^V¯&Š2>ˆnί£W/ö*ﱓž¨^ˆN.Ï¢kñ[&úzÃ|±ø3^vôl'€œÒù<:ÏVèÝ M i’“ÆF@µúB¬&³¤œùnñµ)f–NµvÌ\æÝ=ÿ„þ+£oV$³gßñ…&èv;ÿÆFn…w¸ê„üä§ `Þ” IgHcŸŠß³©y¤jrC‰í^B=(<Ž…ë¬Fוí²=dcmè8¢&$èÅž+:±NW0ÒqÑk§çgQRKöðŽ-’h{­l%–%𰚺1÷+’Sô†àé*áG´SÍ øÓb‹co-”„Õ–f äUf Bëöpü–=“€ñ ù´mÂBÃCD9ì7âê@ÇV-DÆ6µm<\·us°¦Àý|ÿ¸MÉC–ûüİ2eácþï¾ç©A(âÏŸg2ž€ž+‚K3 0ÕP3y}laÌ’çÝ w~ÚÂ4Øà ¨â"XW$®þÅ7;JÃ.ÄR þ±ƒ¶’þtA¶B¹'2ü³Ú²óàí~”{Ü 0-2o`œf•Þ'ÛË2Ÿ‚­Y@^3'åâo[ì3:!½¡8â’ÐLÅB½ÌîÖjásu¶ RVñ:ÑgØú~ˆ®³?R @;‘³ß«Ã†Ô—nÄK_?vv½¾9÷ºÂYcÃá|¢¸‚S8ýz²pºLªJ¿‰ržé¹‚¨›Bk.äxãpMa<©ÀŒx'µÇ«·jn)¾(Ñã™/å\m›¼Æ±Ù"fC8Ç5ƒsŒz }„wûiQ†Å-\k.;†AÀ47Ìܨ¾~QÄF<„àÔÏpøÒa•t0@ÏWÅÄg?Sæ€vÞ‘§”ô¶bj¤ouádò Åõ+\F…xó&«2²(ÂEŠA1FR`CÜfL î5±Dgk­–kuSˆ ùBFôs¦8è; ˆŒ¶™n¦p¥+¦7œënÊô"³G§‚]¨g?'å-¸°žæKçU5BÅ¿eK ÙôÑ5=beI´rSkß"†ÉäyÛ –ë[LÌù†ñ„âotMd8 ÉMõÈ#élOîÖðH›=ô™d#¦ðÝ–Êá¦:Ïï”rˆ±£ Ö6&/$ÊQón¯N†<…éâ¥6ZÕncäÏ/Æ“xÀ:¡ˆ™_4å ÓfUÕP#0lcð¾×ðqë^ €«DCTˆWAît䊈«rЦ©ÂZù‘dã©WcõûíÚ7Ii¥!‘ã˜M˜>¿ G»¨þ&îØäWÜQ²›FßoÈÜ& ²lÇë4˜Š$ÝŒ‹žh0¡ŸßæÕÖßãÁ›nýUM”­Ûb ‹åÖÝm¢lßÏ&ÊÃ3{7ëØÙ›±1ûª{,îíaOªÍzšå1ÐiŒê>ú™öê[1íîÇ›"êt¹òÍ C¸Á”—cô¿¾C½º*x²÷î8LÖÝr$ÿêþ ¾e:ň’  ÷š^o˜ Úþ¥ß³´Nõ¿h‘'Øi3_1†NTÆ™úFÛØèLEI¨ )8ô¹r3§R¹‘ÎÑÈ T—$’–WC#‰Úî9°TÅFŽØ0Ëâ͇ë›ÉåÕ‡g¿#Â4©ú´­/ßÀ l`Ôq8kTÿÞYKKôÐé¯ËqLÌ0–‚‘˜è>Ô šn BÈdă¶dVgYônûëÏÿ CŠqžmã+¾M¦÷•8.à†à®Ió1€fý“d‚ËÁ$À¢祹ôÑèhèæcÝ>°w—2áBÏYúy¢sàtâa…Ô [~ws~ý=Þ¤0ì¸(+ÆT+ aÈÀÔ-Zw-cZu¯­u‰Qíù€#2X$Åé Bpæ +Ù².ÒFÒ«‡Ë—ÛßÚZ^«ÃBöó2¿M–¤ž³"·3{âBÃï£Å³ÙÐý¸iþ=žèì=Úèz±î±M㸜ðäëtL+n˜§ÕŠY¼ƒðuÀž¹bØ)=cl&=—ÑÑwÌ"Ü-ÀBÒ:ýÇ‹tYø:ƒÙÐçH¬›ÕmߣhmI«ÕVH…‰T¦EšÔÛ•&FQm‡S™8´¤Œ†iL˜Á3NÒƒ´xþw_?ÿ‹ÏÿÔåó?rõüïÛ<ÿÛ><c·IàÑ»ä=.JÞ{­&Å3h}4–j9bãóͽ²–R_“ˆÔ°Ô¤Ú)qdxfÞçîÖB’a™ŸÙÈŒ©v…F/ö®ÌÀÎE÷ øï*4Óôi,,ã{ÉV Z«Ñúá!°…–îªU‹ç¶hµ¿ÄÅÆ¢¡VK+*ªVÏ<÷ ¾\i0ž]ÙÒê‚îy‚CQþúóÿÔ¤Týù÷ÀžæPÕ ÀcåÁÃ1è5alÔáy&„kØáó8ÖyE£_„$C¿*±ÈΑ8§Ž:ÄĘýÃÞ|&»[C"†-_Êàî@i¶CUÕ%0˜?už§‘ Kh•Ñ™r ˜•³ÎcJþ¶ Е´=ŠÙï|_· LeÀˆÍp˾¹3QJ©Ÿ©[ ÷b·\nõÅo $Óee$ŒdU`§ÏœþWÏ.7ÏìŒé3—Áù3—®çŽ­å3§ÿê™ó¾|æD­ž9CëgM+0 a%™]B?G`åÔš{SïÕe혪a™9{Lš&O¬ÊmÖeS/ “Hú+xØ£]œÅêvÈÅPæ0#“LžX×÷U½YzÝÖ¤j]ëCÀM}]ÏzM°0ýèÄ£Èêetèã æb±“Ô™1,Œ° ¨‘frÁÿëÏÿO²ö‡ØÌ*’@0ÅÉz†¢ÎqF"¾ä¨ù2lÛ¿¢ÍMh$§h_,((ùX9óßÄ[Þf547)ïF´åD²‰Q™õŠQp{ sªVOº€†C–d˜KâD [L•¥Uœ­§Ë¦ãw£Å¯Æ)â'É&tpb#´l ¾@No‹’JÊ÷[^Þ댷@‰Å9_ÿy²ÁðbÄW׊A]HäÝE…®Uê òOL—U ÎyMEñçy^HYY:¯ó¦ ë Ç#AÎÎ8ʽ Z?æaÝ3 ŒW'—àv†B„.4…$[yéÒ2_p0qMREItª`üìÐw?CÃ.(=ò6Ò÷IÈéÑòÄ^?c±ÒªûL)b–ÎÑ»©½Úô£¾×\\µBŽjžÙçªÙß ½tFš¬ÛAÛŠ|eŒÄŒâ,€)\'S½ú0¦ ‚»,SìF1›Ý€®"¶—4|6ái{•þñGyñº6¨” Ó{Â+M4u¬<#r‘ªªø#iïÀö2þJ:[Õ 8Ó‡/ÆÌÁ”9Ódæ-”Þ•t“J¥½k…]à•£¬Å¢ nP8¡sá™jüä/¤Z#ÌNhèÐÞ¹g÷îC ‰œ2màÒEÐ@4g†s”Ãñ|-\šO5“DJ9%R¶J«P î30’r‹Òi¶J–ñ¼[ß}ôq™S†Ë\Œ1ˆÄDY¥u6eTŒ÷·ýÊ aµkþJQù ˜­ý#Æ&¿§šçÆM.G ø®Ä£4L@É2é†y À½7É·u¹ÅnHV~÷½z!âϧN—’ÞϧØÑ4N¥Ç> é`ºáoøØJ‡–Æ uó‘ 4béDež.’¾ßT¹£O™­…æò²ò`]%Y%cGä FbŒÂ¡'ú².9»±·åë¼Nûa Ó_ƒ‘‚†©6n5®'ˆ{÷¬ &ô>ñÿv,¼!ÑœËÐÌ0Uõ [ð.ä7É¢PœQA} “i¹…~fû°2à¨+º>Âo,óHRb+«z”Ns"¸¨µB®-Ñ d°¡&Ü5rÝäØ×F^"öÎVÇ´b­”K~gWïàêdWmø«ë…ˆEï"2çí£€ÝÃ,‰‘VjAÂ¥A‚‘S÷4ïuEg„F:Ð*3ÏßËµÅø²€ûFŽ‘ù[²?cy­BL³ëVÈ’¡¹ÖÚ‘ÍÃ{CжFWFQ'˃þd-cUìzI ^rÁ1BÆôûI'ù‚¯ŸÎ4бhÔÁC¥Ìe‡õâÀMÓT…‚˜šõ€ÁV¾mEf⇭b¸ke&0è¤:«¥/Háö «Áÿ7™*'—¡}àŒyÄ x4NÞ˜›…u² S®ø„tÒb‰[æ=Ÿ¥60þ¶à+ö¿Ãéÿ„Ÿ2ÌC~?Êús&9êE÷ ”åá+-}V<ëàïPZ\Îjsmù÷Ê{öpÈ¿NèÅY‹EXJµ@BÈût¹RzŒÎà½Inñd³Lk,G,b‰ YêÆ'8µ]ë|»LV·³$åœèÛ«*\yÆuž/Mn7H ;¯e|ÓæE„ƒá¸cðóÑ3k´1:†Ýq®¬b¬­;®5dÐB,°gaAÞªX8;¹aÆ¡^#¡r*º /pÎe’‰1/²Y–¯Fö6° y7ét±Î¾Ê—sSéQDÞÚ"Å‹],ÂÐ MOü¨ÚÅH‡¶ö0>j†DM»?øˆÀõ'!™ ß—òF`Ž<øsÅXPiò)À¾¹ÑoÒ³pFvAXÉX9°… ã ›IË@H_Ûº¹»ŽY6>rÓØ =#ý†+ó­Øg¢O˜×w7c(æ³Yà8þ ”h?Xó‘2¯|®ÈžÙô™òƒi‘‚` 7'ÀÃÝpøÔúTîƒv 7\ɧbÖjÄþ‡Ô­eF¼'¾LI“ª)Ón² O']j^±v(^½¿‹©L f {7ªÝùÏÑG¨ž•È×%Ì2{èdò ‚K&¶o7ŠÍ4™.Ò°æüõçÿTýgýùå½Ì\™¾6 äÓŠû$»ÏþF<ª€5à”lTc€jÇÊd}7âŠÔ –¶ÑP|Á¤¼œgWX&ªròWÓ¼H> >kà éŠó¾@'["1›ÄßÈ Ê`}ÛQÇ’‰ûzT*d½Qh?ûj9E¡*ÂV/jätÊFPÂd+T-è0â*|Fˆ|·9j;S¢æ~†Y¼¼·o®‹ó­¡Ä*&©R&*"ÝphÇhe*âêQÑó¸c6gÔ“¬<œÆ]QÀϨ>…PxÑ;¼O7ÃlåGŽ€ ÞEo=±7Årä‹Ü ŒusˆXÍ6cø\C×§ŽEõ‹dv9‹@…„‘Öz<ˆårk½oƹ|Q5©ykÒõƒIœ_31#“¥iQ¡n´´’Ç4¹×©¬B]PÀMD¥Be ER¯9z¯ ÀOµ¥FLÚOùã¿îIŠXWvwõÒÌ:åž1˜ìuÊ,jî^Ä,Ÿ#ÛžäeVƦS“µÕ9‘Ìmм`è V7wk0÷˜\óÊ ê˜z®ÄùNcRøïV'X÷^`Ë[c9éáÕ?¸Œýăcï7NÓ_Çšæ²­m[Š;‹Œ_˜± .AÝmˇkïk–ÒâD6S‹1W+'£±eº Y `æ~(hÛýL¯ÜNtµ¤‡-èÖrë4—bs!Þø’ru«Î+ÚÜ®H'ÎPI5è‰,(c¢d¶E6œ?¹˜Áw¼)ÌHCÕ6è8`Îçì³×²h£,¨Î|ldV¹½RÅ÷÷fÎl§·à— ¯:ŠïòÙ|»©Å¡¥L6a^Ü?)ò6HPYÌ\J¢¿.E'5/•Ÿ¸`&ö £Lž rgh‡zñ;Œ>n&Ñ)¦s?vì/ÙšXñ‡?§nûeä•ñ«t%é‡,} ƒ¸@z1ïÓGx ïp#¸A{ /X<Å{ˆóïÆ@ãNLt™ºr)|÷Ÿ‰ò¡ ¬NPJ°Þü³)Õ«(UJZÿUÞÿH×⟌%&ž·ÐD í ’êv ;h±¾ð3ݺzþ·‡’¤¶¾éJh¤=y}[C‰‰u‡€óÉê+Óù§Ëêàå”Û4üˆe׳iç'&Öý'¾&(ƒ?``í2}"Ü ³­õ†•tØCÉYúp+óz:ÝÉõ§&[Âe³1é«à$?V~zO¸íø!ÂSódT˜èë:zO‰VgÃÕ%B^¶Z5=aÑA©ÈívkÀn½½%ã¨v\ ´ÂamõA]©ÁŠýÕÈý†³y‹ÍjuÏPGyHÊe"ÞkÖz‰•®Y'þ¨+G¾Û/HŸ¨óÎÛ¬~̪Ô, Û¬¹Žö6MÒÉ?GlÌæ¯õÇí¼¡TàŽ­!A´û©\j×HñnÞ Í­vI'G4\A)I½0eÏnîyG©šà‚…ÙÅö¤î8*—O[áôdó1°ûÊuÐŒeun¾4‰…ÿY‡m¥¾ÈKY_v°0÷ŠKÐ “rÞÅ.©òHRY"v*­öHʸ.áÁ-¡øv¥úv_¡þv]þ°ë¾^ekŒÝènÏ­Ÿ’J,Ö²,·Âª\Ùºá _­ÓÇ—û/Þ¨•¤˜¡Ï;inÇ‘D0 î³½²ÝžkIMùÒ1BðIœþ0g’-Ñr¨°­ÞØŒÈù^ò(,1n›ù¼'Á×àg¹5¾¤!QŽ@[¡Mm4xùyR=c@Îm@ÌbøŒ©Ãü&æí®únº«n›ïª»î·º' HP!Ž\bþÀŽ:hÀR±â@jÕ'cw2Ò9ÊŒœ@2¡¶‰ÐÈÖUÕ:.â½’ÿ∷X2pE¡ï¯¯¯Ïæý:\ËXYWK̃T‚b­çã‚à”X†žTgË-”Äbž»ݧ ýZ&c–ù¶ñò‹dŽ$sÌ{âecø`û‹Qp·Ø¨WçsG’{Gë¿È5BÑýi³_wÆçêuæèc Ÿrê¾JÉM¡âk0 ñ«HÃâ·j«2щÇô ÅNµI]žh}]­ýš/ñs^!Ž®Òy³ôd{³jœ—¸‚Cg{kŒK]i ² [·ÁÌÈ¥—Áƒ\°àÅi#Óœ}%Ü}Nhbç*ª®¦'åîe™?d7ÅÁØ™¬¡Ð9"Ë-$Àq7K‹u1+½n07%LeÊF¸r”q ~ÔŽp†ß4º~é*€ß¸!12€+ íYŽl)7Fx‚—MÝÙ¸ÒºÉJÜF€©[nÕi!ñ³3øÜDÉԊ׈¦\òt¹LÖiÞTÝæt÷ÃöÖmb¥Å…CZ\bÄæN&~äkÇoô˜¡ ]öô.3Ó±uÓ*ße]Ÿñ#+ßfäj[o›»Êë‚uóíYom^úu»#`Hƒ‹Á<»KªJ>’`’’oo‰*euËEÀzÀL…¡?ï?p×vïéÛKMïBóRy‹Yø¾áþRN‹UÍ ‘ùÒ`Ž9¼üƒ«žz•ûËrj?åˆR ÐFóåæ4úî狛,‰ä×#7º¦ž¿…g­Gñ»y÷«¦ÛvOóåøøóšN`©…62Lí`+“2PÁßÖ&€žúæmqŽš—ÃúT\+³[ts‰£°Í"»[¸zU>³{¶ÜD¿Ã9fh=O6b-…ëÙ1ÅÙàvV‚ØEÃXSDZÄ&K¬€Äµhî‘äño±¯±ï¼*ϼnýâ.Ä‚ùLì¸kdgh 8Ë*ÿ=O»aŸÅ',Ii­1›¥¡ZP ²¯¨WÆ€lWäÒ8ý×»m¨“‡$[â»h+¿„¢¼«³0 ´Ïaÿú,õè“^¿ò/“÷)¸-¦½¯e@A¾²¾ë}ñf–X›–¬•Qr1Ϊ)£_(*(Õ*N¨g°˜¹gšÃb¡=KoOª*]ÝŠ¦é­õLsâ ¶}%„ßÁ¬ð˜<¤ñp% Ó(éĪã XÎx$ òh˜4¹/µ‹ƒˆÚ»£äí—oóÚ¼f8 ™êóä:}´.?[h²ü £õ\s¶j!¦Äw¢hÿsœØâýG^ëø±Ûôñ:ÇýõçU8³µÔƒÞ䎹²—ûàÅkùrL¨9ÅA[(ÎEV ó*R“»Y…06+Íã8Æ+&ë$ï~q¨Ê1uŽC{tµ"֜˲quL‡¦•8õ/Äîv0,ŠI ^Œ—T »´XSîG5:‡"Íé 8æ¼üp ÂcÆpº„òK-¨×ûP¯÷£ëd.'ŸØתjjó0óð¸•TMlc§<™ØÇíd ÷˜á %%´^‹NÃUì§XÂrF¹…Þ§EÍqNý”¯c:{ «§-ííð&io£8:™Q®9(<¡âI(—‹ì³öë¾ |ÃW⛲îÈ©Ìt˜UcŽwm‹8qpŒÉg³iVG?åy >+t›'>ÐåÙ¥±æ¡cÔré~§ÐOt(>nN9©¥Ð¸¦ pºAÕé("v²³^´ßêèUà—„qT`˜ æYš÷4èBòlE—éùÚw*î‚PGÅꀣ.[C==r¡É±.ä (Åoè tÝÙô&ôýÞÀû‰³y5íÇLrRWþúó?¢$ºMk™P. Å?µC‚L;Òú¶oÄT¾J1W3…ZSy¸ìTY1>œ}º¹j x*àÝ1d~—­ë:/ÎdíH%BʰÞw¤Ó3µD½}(JÆÚÁ·Ú%oa¢ªo€3”5a1™Êü)[AhsÊÈm1G¡bÄܹHîSÓxž©àv˜]]ÐçÏ΋….qoߊåa™É¨K\þþ™Cª[˜¡Ÿ÷­ø¼”¡X$UJ:%ZØj×én‰y·(FÆâUæŸB–B §…è.({Eioµ¶®Ä¯6ìlzonUºÄV ³*Rƒ[ –e ŽvÝ\$ªIU-É«ü¶G=l9”ÿtöY+é ìSU7…‰ó­ÁßÜš…ÒzÛ¡i5½¬âW¯âWû£Þ_e̪H[Ü«ta©±Fø#+Ä,Nt{Æ¡ãGÓDlþ®sœgMWW ¯L}ÈþȾ rà990A^{@^€¼6A= ‡ ‡&È‘ähäÈyãy3òfÏBîqrà'g äÀ'žqrà'&È+ Ä×”WCmye7ÆÛšÁæXíÙ÷Àì ì› ƒäµäõÈkäÐr8rh‚y@Ž@ŽL77 Ö¸}ëy;òÖyçy7òNƒÐc™ß9¡ÔS¾Ï”îÙ†'¯q#9`0ÙãñÑp¹hž2¥É] ÞÁ«an0jÄ"¾¨Šª5E+:¯~ôÖWïNj«¸º…!T²Ã£ƒþËJ /R(_N•% È#«æ»7˜TDƒa)м· múí_þ:=¦ÿ=,Qì!èý¯ˆÒà~'3qâ‹ó|Çü /hÂ$ÆSÛ8æCж÷m“-g1áV@xÒŒ¹Ý8cØE8˜´àHÖhêÀv¯)Ý`è…têC°¯z¬D­mž&ŽŒ*Þ÷‘Éh™Äi4µ]Šœ€—ÄA£Jpdæþ¶ïÁi¶ ™RÓÛ[¦†û¯úÆ>}ç1£Ÿ¾ëì¥”ëš •ivN«NŸ5Vjb n ÉÄ u%0$µùw04.!bЄ¼Ñ¹èæF¬Ù/bæ’ w‰é 5uBÊ8S‘¢§“ Âì½~ÑÖý ð‘E.žÒ†€ð‘Lx§-¢‹'˜qó6öÍ“¯! ;ù[8†|,Aæ‚!ßÏýcº#Éð“&fSôêVÉJðXš†ü ®ˆÁ…åÌÖ‡ÅéÒl¬éºÙ@ÎæÜÁv6Çä2yÐB hm0vs*»$­…°HªEØÜdJ‹;›-C¾æÙûó¨%}cU”¸û„/7gÌâ\w²5†cêb«XH>SÙ+¥Qù[ÀZ$dº3¥Å½LþØÄr¶—É*p›M“"-ˆ€[5¹mpÔ¹‰°ÅëÈ ía¦„Ð&÷ª“ÝÑÉ dÞp˜B®o­®|†!$i‹jÿ‘„ÎÂÏ&½ž·x ŒÿeªŠ 8 Púy$8³`œj=ÉMa´©38q‡îÜ5XûÒ¹¿¥:OfðÄLË2H}ƒË 8c¯’M´Îëè–®æx¾ï`¿{·ÙŽö·c빘·_ànæ1³ïLlË2Œ¦ƒwø:ïðõ±¨ÿ3„¢ÈSøñŸ»Ð‡ÁЇpËF)þ¡ÂC6ƒë4¸%œAÑ/¸@]a¢sgÊà+Š />M,ÿî ,üÍ1ø[¤ñ¥Žˆ¨:Fàš Æ–ºÄptà»`AïŽ)Þ.Ú0æ,):µþÚøo~Üjœ¼9mÖ›pXÎ1Rª‹üá’Zƒ]RÑ+YÙý6ûí±Yâkš¬aR¦XþK|1¼hIJao_…Êxûꘒ/RB1ñëŠý MÌ]šäbG–îÛ®¨†œoÔÏ3•P•ÌÓ"L7±çO¢Fµv‚ç5øÛX_Ê´XŠuk ì³8ñªE#£ûQˆÐæÍ§÷iˆâL„6ïWXMB4¦´¹ë2l„¡ÍÛ¬V ?n³S‚3ÐUºLÁÍ"–â­“pµ ù‚ªÍEqDa¼Dk!@ip# ¤6¿»è†@ÕÚ°ÂNþó>×a%J›{ÐYÁàïx+ ¦|m$tðnk,€±„›‚X6NS €“au©apƒº‚y (y‰ÉßÍŽíä2‹ÏOêä}T&?…ð‰# ;e ãpÔ_Tl^¤Oi¤8Ù a{oŒ?²ÐyÔšûu\­³1®5ÀQ-åmÝ8FÑñ4År"y9ÊAüàˆêKOë^oë#sˆ"¥}r5ñ„òõúèí0¹s ýîÊX–X4­]…,ú ®àmô·oÑß ÿ[ZFÓ¶G4i{Sp^v¼ÁÛ7B3Ó®Ìáò´´ŠŒ>¬å°5ÀHлÃ@ðwBÍ>Ö£†˜¼du›‰“¹«ùïB?À;ñtáZÞ2—²p­zøãÑ0j•Š.í¼æá«ÀׄÇÑ—µøêb'ƒuP¨£2å¹§Y¯Þ…b‹ƒ8‘c"šÙäV‹Ú¢tHlÃïÿ¿ÿ£5˜)ÅåIM¡“)>¥lwŽa}¸*çÀ| °F)ÚÒІ‹]±itn0XHèw؇SÜ/Ê| Ù~îzKÌ£PLpH§à,áˆðíb¿ Å~«<™å:i!óeªü [0¨º#$tí¿ëAÿ\EƒrBGÒÁ­ÎoU-4qñ38Ujô¿ßüòùÓÅÉùùçS+jV~ zX:êQŸˆ¿O}RÜïo€R7bWÞ$LÇ[#ÀîWËŽ|ZÙQ¿¶räVVÞH¯‘³ú¯ÿˆ†ºbñÉ:Kzc¿Þ´r¼‡ë¼ÀO ¢ïâß#ò½ ŠCòm&I1¿ÎÓ»dº‰Ni‚*i9µv} úƒˆŒ¤87x~ˆi£»« dšhÁ¿þ1þõ¸¹Á±–’)ð"%Uh£†¢Š•Qvs>m´Ýý,Gí˜F?ÜD?Ü?ÆÈœøVœ$gÑ‹b3å ëmăPD±]¨DÉ·¢{ï±ÂÇw±Ðc:}ÓëfAìG¡ŸåH|–SPT¯!žÓ—KLÚCé ÚÂBûóhß G…”aæšcj—î íæ#ÑÍ—yU9Ö$Ò2ÈsmpŒÿ:ÿ5ÍÔþTػ؇„êò)YçÔ˜a:±eS;fåQè?üz‘?*s£“þ~bM&«$[O&ü€áÃçÈ+e³‡¬ˆž¸7“!¯¾7FÀ±µ;Vé‰Jƒ1)Uf¶p`ÅknXCý¦NRÑ™Ë güu–oèžàtT20Ç-fØ8R>Ž àlqÇŽ¸˜N:ÇU>½7 yb6!£Àéš‡ÒÆ€­dãœSSyBÖ2}‚"ñâËM•éyÍy›Öi oîS4›xš¬c±BÙ±XüS¬eÙ*A‡.~Ðé»m¹óäëKq&ÄZή$þúó¿êè,xÓMãÁd?h¼Eùܹ ¯Äªýõç½ l )Ç.7 €2eG3u¸ »9taò²ålš”³-³ùüÆì:¡š8’/_A+³×‰Xì™á"ô"fÖqÒðBPþ¦÷ççx¼D˜iŠ(ž¬Jîc¨¬pógóQººMg³nZ'?ŒRƒ‹Ó*¬Ž#|×D'9vI„f¹ l’f& gIFX7wmk»i_äå|“JÁÀz5é#Õ±7%SUT:,SÞv]dÓ2¯òy `§Ÿ's’8qú8PUïŸò=‘-_Iï’¬}g´l—ZµÄŸà“sïË\) äöØF(®±¦wño˜Æ•Xá‹…4„Ôq%V%‹)´[¢‘ô7"‡\j5f©TŒ;UWWÜÆfS}š•ƒ™ŠYTתæ3ìõ'W±.)—ŸÌ^ TªrÌæÑ@+O¹ñ@2ý~qV>Nv¡Ü”EüÐ,Á^rëLÜæjñæ^x‘b#¶„¤603«õ*0è;D´¦Jž^­w…?XpÅ4ž.3Ø4{sèé "meÒÁ´ø€ >éÚ!c†4WçŒÁ¹ÉÒåÌ7á+´w§»d’ÿ†-~D5¿#†ñ`ï´ÌW_C’çv2^7·x ƒø·&mdÂ¥(Ž’è÷âo*ýœýfD'Q$í¨rÄ2Pì‚qûsÛH*‡1ój·nÞ› CóSµ¸Ì Ú.Û8€w­¸)EˆáÊÄ1Þ­¨` and for :ref:`the "distinct" command with opts `. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/read-opts.txt000066400000000000000000000025441511661753600241360ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/read-write-opts-sources.txt000066400000000000000000000015551511661753600267500ustar00rootroot00000000000000Use this function for commands that both read and write, such as "mapReduce" with an output collection. Read and write concern and collation can be overridden by various sources. In a transaction, read concern and write concern are prohibited in ``opts``. The highest-priority sources for these options are listed first in the following table. Read preferences are *not* applied. The write concern is omitted for MongoDB before 3.4. ============== ============== ========= Read Concern Write Concern Collation ============== ============== ========= ``opts`` ``opts`` ``opts`` Transaction Transaction |opts-source| |opts-source| ============== ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/read-write-opts.txt000066400000000000000000000031031511661753600252560ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``readConcern``: Construct a :symbol:`mongoc_read_concern_t` and use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. See the example code for :symbol:`mongoc_client_read_command_with_opts`. Read concern requires MongoDB 3.2 or later, otherwise an error is returned. * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/replace-one-opts.txt000066400000000000000000000036731511661753600254210ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``sort``: Specify a sort order when matching documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/retryable-read-aggregate.txt000066400000000000000000000005251511661753600270630ustar00rootroot00000000000000This function is considered a retryable read operation unless the pipeline contains a write stage like $out or $merge. Upon a transient error (a network error, errors due to replica set failover, etc.) the operation is safely retried once. If ``retryreads`` is false in the URI (see :symbol:`mongoc_uri_t`) the retry behavior does not apply.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/retryable-read-command.txt000066400000000000000000000004131511661753600265470ustar00rootroot00000000000000Retry logic occurs regardless of the underlying command. Retrying ``mapReduce`` has the potential for degraded performance. Retrying a ``getMore`` command has the potential to miss results. For those commands, use generic command helpers (like |generic-cmd|) instead.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/retryable-read.txt000066400000000000000000000004261511661753600251370ustar00rootroot00000000000000This function is considered a retryable read operation. Upon a transient error (a network error, errors due to replica set failover, etc.) the operation is safely retried once. If ``retryreads`` is false in the URI (see :symbol:`mongoc_uri_t`) the retry behavior does not apply.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/returns-cursor.txt000066400000000000000000000012241511661753600252470ustar00rootroot00000000000000This function returns a newly allocated :symbol:`mongoc_cursor_t` that should be freed with :symbol:`mongoc_cursor_destroy()` when no longer in use. The returned :symbol:`mongoc_cursor_t` is never ``NULL``, even on error. The user must call :symbol:`mongoc_cursor_next()` on the returned :symbol:`mongoc_cursor_t` to execute the initial command. Cursor errors can be checked with :symbol:`mongoc_cursor_error_document`. It always fills out the :symbol:`bson_error_t` if an error occurred, and optionally includes a server reply document if the error occurred server-side. .. warning:: Failure to handle the result of this function is a programming error. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/seealso/000077500000000000000000000000001511661753600231255ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc/includes/seealso/authmechanism.txt000066400000000000000000000005261511661753600265170ustar00rootroot00000000000000.. seealso:: | `Authentication `_ | :symbol:`mongoc_uri_get_auth_mechanism()` | :symbol:`mongoc_uri_get_auth_source()` | :symbol:`mongoc_uri_get_mechanism_properties()` | :symbol:`mongoc_uri_set_auth_mechanism()` | :symbol:`mongoc_uri_set_auth_source()` | :symbol:`mongoc_uri_set_mechanism_properties()` mongo-c-driver-2.2.1/src/libmongoc/doc/includes/seealso/cursor-error.txt000066400000000000000000000001401511661753600263250ustar00rootroot00000000000000.. seealso:: | :symbol:`mongoc_cursor_error()` | :symbol:`mongoc_cursor_error_document()` mongo-c-driver-2.2.1/src/libmongoc/doc/includes/seealso/session.txt000066400000000000000000000034171511661753600253560ustar00rootroot00000000000000.. seealso:: | :symbol:`mongoc_client_session_abort_transaction()` | :symbol:`mongoc_client_session_advance_cluster_time()` | :symbol:`mongoc_client_session_advance_operation_time()` | :symbol:`mongoc_client_session_commit_transaction()` | :symbol:`mongoc_client_session_destroy()` | :symbol:`mongoc_client_session_get_client()` | :symbol:`mongoc_client_session_get_cluster_time()` | :symbol:`mongoc_client_session_get_lsid()` | :symbol:`mongoc_client_session_get_operation_time()` | :symbol:`mongoc_client_session_get_opts()` | :symbol:`mongoc_client_session_get_server_id()` | :symbol:`mongoc_client_session_start_transaction()` | :symbol:`mongoc_client_session_t()` | :symbol:`mongoc_client_start_session()` | :symbol:`mongoc_session_opts_clone()` | :symbol:`mongoc_session_opts_destroy()` | :symbol:`mongoc_session_opts_get_causal_consistency()` | :symbol:`mongoc_session_opts_get_default_transaction_opts()` | :symbol:`mongoc_session_opts_get_transaction_opts()` | :symbol:`mongoc_session_opts_new()` | :symbol:`mongoc_session_opts_set_causal_consistency()` | :symbol:`mongoc_session_opts_set_default_transaction_opts()` | :symbol:`mongoc_transaction_opts_clone()` | :symbol:`mongoc_transaction_opts_destroy()` | :symbol:`mongoc_transaction_opts_get_max_commit_time_ms()` | :symbol:`mongoc_transaction_opts_get_read_concern()` | :symbol:`mongoc_transaction_opts_get_read_prefs()` | :symbol:`mongoc_transaction_opts_get_write_concern()` | :symbol:`mongoc_transaction_opts_new()` | :symbol:`mongoc_transaction_opts_set_max_commit_time_ms()` | :symbol:`mongoc_transaction_opts_set_read_concern()` | :symbol:`mongoc_transaction_opts_set_read_prefs()` | :symbol:`mongoc_transaction_opts_set_write_concern()` mongo-c-driver-2.2.1/src/libmongoc/doc/includes/session-lifecycle.txt000066400000000000000000000023731511661753600256600ustar00rootroot00000000000000Start a session with :symbol:`mongoc_client_start_session`, use the session for a sequence of operations and multi-document transactions, then free it with :symbol:`mongoc_client_session_destroy()`. Any :symbol:`mongoc_cursor_t` or :symbol:`mongoc_change_stream_t` using a session must be destroyed before the session, and a session must be destroyed before the :symbol:`mongoc_client_t` it came from. By default, sessions are `causally consistent `_. To disable causal consistency, before starting a session create a :symbol:`mongoc_session_opt_t` with :symbol:`mongoc_session_opts_new()` and call :symbol:`mongoc_session_opts_set_causal_consistency()`, then free the struct with :symbol:`mongoc_session_opts_destroy`. Unacknowledged writes are prohibited with sessions. .. the timeout warning is mandated by the Driver Sessions Spec A :symbol:`mongoc_client_session_t` must be used by only one thread at a time. Due to session pooling, :symbol:`mongoc_client_start_session` may return a session that has been idle for some time and is about to be closed after its idle timeout. Use the session within one minute of acquiring it to refresh the session and avoid a timeout. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/sphinx.inv000066400000000000000000000341041511661753600235230ustar00rootroot00000000000000# Sphinx inventory version 2 # Project: Sphinx # Version: 7.2.0 # The remainder of this file is compressed using zlib. xÚÅÝŽä6– ïó)³;³ŠêêqO7ƒÅ”³ÒvîV•ÓÎì¶Ý… ªTH*ýDføÊï°WìÞîƒùIöþ‰’¨?’ʾèv¥‚ç;I‘‡‡äá¿I”Û(¨‚Mx}"§)6o7uÈ›‚”UQ‡U]¨"/Õ›(;qZnÕ)ù‡pûÕæi–^NY]þ/ʸúwÆÛl_§ag©!n/YÛ'…vÁi6Rf§EÞ>]½g/̤äУ’ÛçV§Ë^ +yQh[£ è·ŠÜ9Aî®î/—œøß‘”qø.I²Ð¬‚=j›Æ9•Æ•¬Ë^QO«1ª5ïjoZ~ûmlü{¿©Ë*;}ˆËjæù5-‘·›ª®²"’7)Ã"ÞÅéÁ ³ˆ0IÿæþþüõÛ?ˆæO%Ã$(Ë™ªàk!}Í¿À,ù‚æÓ×ÈøkõµÛ #v?*®ãúš©YTE:=ouš€ÞV¶s¤l§U¶»úx¹ÉÒ „¯Tß|=w¸}ûëA!]_?29åIP‘%J¡ªyëðÃ,-+¾ò"€vf–óO- o¿n3o©Ên³žOÿWV&YQ‘¨]ÆË:Ç/Ÿª·ù@Êòñ¤7Ù)‡BÝ%äöîíãííÛ?kÕ9©ˆ)Íý—Äœ<ҞѸä~¨+›Òú“d\_ߥVÿéO”ó'йí`¡€¼U)©ylJŠÏð‚ûoÿô_-J—2îî¡þU “Ö¦cÇieœ[ŒÛ8W͸*SñΛǸºÛeYb^R]w»[Tósä¹qQÑŽ‰#®¯-?ëOæ$–ÓÛÚ¾ZÛšÂÖêqX¿sõºê4EilØÐñ?ˆÎA²>¡!Újþr'Fà»?ÞU··æàóOðg£j r3¶ÍVW­—[MáÞ¼ ßîc@^-³Ê@Ù™ID>y  ”¡ n ?­Ooÿµ {{s«Wq}mQZEo÷·Ñ+êŠ_Q×y ]ÿ}q!^_G–-îÓßC§É‹Æ+½(¶š²Š°cS¦50+ I^-îÞÕn¦ vÓwN¨(Œg® ÷-˜ªªˆw0L•›ürMgú ’–På› ®²²>‚âÂp8*í²è¢EäL’,?‘´zÃ_>NJò:N"Èï| Ö.Í•2xh {:eQ͸>Ž5ˆ²Ô,…Ç„òKŽÕ‚׊âž]ü* —HeaYÅäl‘L]ÅI¹…ieIŠr[”Uë¡L€ñ â©Îƒ<î½ŸŽ°}>Ð3ÍŠ¯ô¨iÆ6(5¾­1Ùmˆ»$ Ÿ|üœ!¡@ëqÎó³ý¾$î°û8 _”¨ÿ|ŒáÃ΃8Óp Jßua$qJÒÌ. NîÞ7Ëñ»÷Ëœ„Ž™JE•ŽÑîxùRÃÑ Y-ê”öE¤:f‘ ¨¬`˜u–-JóOAx„V¹œêƒùƒŒ§ûlAWcy‘h‰H 5Rðwï£Poá¼LQ)eäúäS£#yASI´­Eë>8ÇÐeøu‘,x»}œ¿¬÷ûøe‰T$âû_–I^ Ë_{Ä2«‹pÉÈ Bþ•š˜ŠÓ#) G|fú-Ïk¤‡.È) ï•_çzQãDÓ÷¥ekÐ'=#ÉÙ–q‚‘™O¦%ÝS°H tÁ¡\& AÎXÁš‰-WgôU¥Ü›YÙ£K!KårHÄ¿Ýå] wr;-Rˆ!t¶Du¬²…ýD^óEö¿IvA±0W ‘$>½]¦ˆÊüq™ J²LLЧ%õRdYµ°µú¼òq\[¢©ù‡ñ*ÞÇl¾4çIÊ¡ ;ÂÏ:çl_x{+,ÞÛ¢Èh)'îMTÜç>Òä¶,ŠV7XI>úP¤âv×åcĤÞ(qÿœ%޼¸(û)Ñ“âÃ/A’ìn>¥l‡ G]cž•€*‚´ÜgÅÉžçæKBŠË†Z’ ¾ê¶2¿[Eq†kÜpv8Gõ‰c:ŒRë@‹8)÷±™g&ŠK7fÞºx/rŠ-3ƒèB‹²TÖ‰%-.éüÙćÿÏž™nÌêÊE9)>V+_õKiŸ›¿ZIx·—Ö °êÜ—þvKXZ•ù#ßzõMGb6‰i3¶qjÜÎ;¤”<oøSÿTÅÆ†MÍL.—,¾Ê8]2ìóÙT©ÙI%~zC°¡Ù¬Hµý¦™—uª'S/¤·´}Â@›Z¤t²‚”îN‰÷qè†Æ{mYÙÐ+=Œ/÷óYVÉcn‹Ú‚Î#;Z–€öÐ?”GÛ"Cs%¨dç=;\¸f«T¥mÎX\Ĺz]Ä.xU€.!´¡Îy cdÓØL^\äõŸ‹¸è8—àÊ:Ïé@zÒËÊOЗºh³ ›"édÊ-· § F8g9ÆB%bÕÕ¤XÃ#Ì~ˆƒ±‰ƒ¶7쿚¡j;Ÿ7Ð!8AëÚ»ð¬fµLƒø›}µqßí——ï?~°®¼1ª“*U`_‘£ø5ª³>.*1Û÷øÿöUØc¹(×>t…Ò$y½ûûÒ¤˜í-þ¿uiöYN> Ö¾’4Ð*‰®}½TöÕÄAÛÌ/{ÃܲÖ56ŠuRyãìëqœ¿B•º‘hÇûPiÙM‰“ñh˜é¤&GðöÕ8_¡û›”*‘ílþ<’_¬+¯ÏrRi¬}ei kTRœ>…G>9¨(£þ7Ki|ÀÍŸö57 wS•3ô8¨ÛZV¨ìSæbuʪª9hû1Hë ¹‡ZWð ÒIµÓí+s˜½B–qzHˆ›á±amè?¿7ƒäÙIN*±¯ÚI+Ô0ôúât›]õrÐö‘ý׺Rõ<'U9€¶¯Àð:ÕV9©³ 3[¹¨­ÉU=µ¡Nj¨\¡n^\ô–ÙÞ—¤Ž²_ô:š“*Ò‚í«I‹]§ª¶®Êw…’u^¦«”&Û+»½¡ÿ™¿B/7ŒjO ±­R#;¥ñítÙ{ÂNeéw·wx3A[±;í“÷\]pù¹Ò®Á™j¨²Ð'iU\ä9GdºuŠ-ÌÁÜ—'&\á÷xrW9¶äˆ»#ðùÀKjªÁò–§z\¶”#Ô"ž£WO9COE1O‡Ü°ψ»aÈŸ,Ô¯˜aH“;$ ?]ʬæ‘©Þ˽­ó{Þ–èœÍÀ³YÔÝ…QÆ%”Gx±£%$(†«gS¢ætxŒë9(Rø¯A‹êY<[†ˆsbÍ;M²œb]>SÖ<ìÙ;Lû–ŠPŒt⩃„ž43±úLö%•Ö|Aûñ‡ö5€»ƒbèô]´ü$Ø n"œ ¶p |_¿È”q!ì[šÍP:PëÒ΋ ꬴîøwÉ#°Æ8°ª²äLÀ¨½¸ƒÙƒNŠ,XWÝ»m–»Õ3%·ôðÙÀfÓiØ4úSìÓ²ù´¥VÖ Clïé,L g«Dé1ªZ3ÅÍxMÔ åå=eˆ;¨2-z{’žã"KO˜íÔ,ü`ä4ö|Èø©îùœ¡£ØËSG±h/`ܲ¸<šeìNNH4øá5œíŽTÏ„¤s¢Kâ*¬+*­´…•„E³n ñUSO½1M:ª1ÕóB¼C¿‹N‰TsHв ®z‚;D´àIYg'ËYÄod˜ ÝÛ à2úç0I¤#âêXïò@ÄL) GyÏòÿ:ã©ÆHñ¾™,“DªQÒ鉠‚Eì­aš’r‚x&ó SŒBXhl¼êÉbŒzšÈ]#°»øù®yö¾ÉÉà×ÒËH/P~J¸‡‘7’ ÇÞèsi_Úts°ä3H©ÆH¨iÇ£õšçÿ¼ØAÒ Ï2Õ£ˆTc$CÆ)˜bŒpŽÉót‹TC¤$ ƒ„lýΨÇGòøí_Ò^‹"2%œÄ1îåRtÑ–ûÒgJóËtsöÓÈô@\q/CuLÐaPtÜ…7›Ó)[Æ‚é¡ìX~#,æIÙÞ7•n°_f3sø¬ŸT.ÁŒø2—aÐ…9ä1Y@ÂÌüq`»ƒ·|eú}< (½`[vï6ê¦áÈ-(b¢ú¨Fíš5¯Fo;èÏÁ¹XšÏÔŒ­¤v :A¾‡§Vå6K#]æÏÒãÒ—[KWS2°{j1›…³ØÞánTSضܵàmpâ÷Ž |^ŽÔ0SÞ\TŒ¬<:ÕV­W2üP^Ęחußp«žæ½>ÝÊë¨~ÕÊ´1«3p(Å E‹Þ} ˆ[>É Z `sÉ;)œ Ù¦cw8Ë̱dì¢CŠÁ82Î[8”ŒÃÐ~G›zÈþ3er[Cžs€-]b->·à¨jjdSõB˜ƒ&B9îZű»G 7ï8zäBÖȆ……¤ñ«Šàyä>Ó…03R’x‡}€¿Hñ. r½õ#R/EmCŒœÚȈÆÐˆìêƒS"ËWΈC=™1p ^·1l]V§L¾­Ý˜ Ýê]?³â¦þ·’ºYßU˜š“È5p éèúªº¥Ñ5^òÎӪΓ巀áxýc’#IrÓ“°=Ðöþë{ø—áiÍi¢Å¹ÍpÓœ3ÐÎÎr ]PÙ.*c¶ïÙ-+NOsPi`Û À:¯,|좶g‹!'|hC<56ˆ¶­³A°óZûR¹¨3FÙþX9¨/ËA]i±¶õ¤…:¯#¶¡6þ:•å¿=üðÉ"bÍL¬ƒ2ŸÒ`[üSüÕkâ>Ÿ¬¢Í¯P}®ë£¯aõyhþ^¡Zôt¼~r$ÔÉò®ãu]’Šc0€éÖGéDYYaVWK|+(c÷ ±ûµ\ê3Ùñö·ý™ìØ?ûM#ˆÎ¸u&zÓ¤£™ÛŒRùí}§S÷¼Cýk#ÂÑ9×;IêšÏ¯\\S¿£Ší>-×Ò$v”Ÿ³ÎÁC[,ûÛo‚’<ÐÎk®L,`‘ÒD¿÷pQ9Ð ýgwoó¾ôõï ‰^Q½ÜƒÅÂéúªVŨ·|©Iqy=­tCÕë¿ìºo‰DdûÀþûM>‘4šùy2™“1×¶ B<è°p q§}ñçTuïÞÇWБ„TäïõÖ egz鎅%æ†;Íù{)^<¢;ÓÍÜùu‰ñ‘Oöê« ß}3Ó‡.w:ÌM϶ ÎO-nBŸ)Qã½q¸"«ÈLd¡’%ñ³’HÛi¦Êåëʲ“²¦2%ìvŦ(«k·C¼îÈ,꣫Eh½¡A9˜þ“zà‚ôb* EÕ̡фLš:Á$SJîl)´”­!$„oùÚ’š„¶$ÙlA¼ °Æ07¯ ôK§îyo᮳|Öi¸†Ê¼ì pK[^Ägè½Õ´v´´Ó+ƒd=í]-íÐ fázºÛx¦Yîð±m,â$â,N«o³Âë ‰ƒ¡Î¦×÷‰x0Rè1Šä]Ÿ‚—>÷ãx±ÎåóÂåj< oô¥Y‘eÕ*Ú8uÉ.u|„hqézTgκ¸)¤E[ž£ƒŒuòËòÅQ²YUÞKnLBQdàèaÈ ¢‚12Í// R©×ìºí3/Å…qŠðgéº ÞˆFÌÙ)‹Ìúe¥Í[^ ÊëU7YR´»·/*†é «áÐR4(²mæR‹ëåYîŽMi~]]*@j`¢ÖdŽé—י©,:¼Jöx4’©íÛQH‹f%Á¨S'£´yË3ÕPÎý‡‹ •µ"ù4]%e­á8™ðRNÖé`ºD>ÝVx&¯Ê(<œ…ÇÒXfî+ ÌáO ìÆÔŽèÍR;â"kûÔÐbb qzéª3±£žAÐd>¤³×|„àPAU%•{•¢`–'d¹’Æý!Mû> ÔpƒN(I‚KV;/1NmÔLÏv—+áS\ŒfظyäÔÉÆÝŠžÚiÛÙsšd錘¤gû®±2ÈÅSA~‰}_|,Œ¦ÇS †šIV–Ëê ûZÜ ]\»ƒsÞ½©Û*][·c[¡[kwjktiÍ}wÖêÌd€bû¶¿­Ðáçv‹djª”TªŠ5š&ªé´NªÊy¥ŠÔ6ŠjVh¦¨§ÝRQ‘óÆŠjD{­cºÝ¬?Ƈ#4¦c妗¸u2$^®c4 ™¿:õ˜%Ñzª»Š }ï‹iʨæ“ÝO;²y‡Bï°s“!‰š˜éu(²…QÀ*‹-”,¾%æ¸'¢¥O—a7PyûÝ?—ô¨§Ñ<÷séQYIÛì<×ÎäP†¢d¾f Š¾±E4xå.çµ¼•Bõ¸§r5²Í{Aqñí‰*Ï °бû(ÜûÌ)œÏœÉe…ûŠ•9Ïó yÃMé¦%Ge%%‹ìËsæ+–S8]bYd\`òÝÆöð/)/Æñ®žv¦ó÷'ryÎ Sé$†Âk: “:"nFLxÙäH‚ˆ˜:NÁ1w%œ‚oa1–®Ž®ŠaÖ—9”‰ë´>á]Ä&Må=.4’Ö%IHÓ7ä(†Ïhžw_'ž’çòPdun*ŸUŽçìRÕeƒß‰kï+ËÒÄ‘ß(ËŒxÐò‚ɉiÍætìJ-gs`Ž˜¿K E%¼ÛÅÜ|Î/Â|nÅ[±{%æ³J¾ƒ4KiV—òªÑkTtt÷W"]ªå ‹-ç ©WTÉðT§‹ °ÅÄ¢E4hT]ÎzõÎæ#:g:÷qº–>†Vt½’ý)30j~js…íóÕ³¦SÚäÏÉ|@è•“¤giY·]*Ì8uQ´rb‡#¹…£L”̧¸*ÏàÅÛ”õ>Y¤w¿Xªqš*kúfªg•n™*Rzä©CêKªW¢ÚäWìu¤ÎÉžGŸ»Wè}ôYìdrW½PHµ—ÐôsDQÁ .ìoÆ$bH%¯3VJ¼:^6:_¯õ6™j½úܽBëÕgq°õ»2AweªL¬–âÊT¸×AyáùtXTÒkÉèm«ZRkgäzm·­š•©Ö¬ÍÛ+4fmÛ²±s4qçr:ɺ%«½7w.»’†+Ô©°/,îPî(ié_ã+j›oˆk[í â;ßÐ:4!p§·;KàšWú¸NeÜ{Ý…Š& S}„&_¯ÐCh27Ú?`1úq¸ji©`º —q©0œLÕy#4´ÛA‰°xAŠU/8£—†®£UâUÐQey—+é”xª3Û}6­w¥Œ‰¸J j^’ZÜ•Ç%¡F;2É<¬ØoË ôzn©} TÛx †»“Úìô2æ E9Ó%‘boºœ€Ñ÷2ÊJ /F»BåT.Ýa_;Y¼j©à­e@“ûV©S.š§¬û÷£˜Ѥ‚§Þqèf±­ N¦ ½dKÒ.£”„I™9‚ÑëHe4k^ìê$(Â,©OiéˆI ÓåI«Ðvž,ªÔç8FF?šjˆXñDM:|c¼%±‚ã­íÏ©u_O!(Ç ¢Já'Aï™,5ÌØï™)j_Ý¥ÕmZŸd6øñ³æíK‹5/ºCRØÃ²ðÉOx»‹}Îr0nIq&¢ØÑÏäÓ@}Ä ºÎÊ!ÉgdèwàWAq •C8¿ÕÈ'1ÔM‘Ù5îϢߒ/ƒ5Î ª‚3ÐÐ’öñKs9  ìÖ/¬Áž8Ñ«@=~aÑΦƯþ¹i0‰QÉçä^ed\^P %Ÿ;ƒHŠñöˆs ŸÁÌí:?whÀ2óý IÜ‘OüÎ`q=‰+ðÒv †SòHZ$yªóYþ…–›ü«Í7ˆÙ|¤òWôÚ3GŸëN¸Qr»l’D-£´ÃXûìoyicé09 “Üýö¸Xëš]z]ïæž¦¾â7ñÎqWñ¤Þ¹8w¤Ðö ú‹€ù…Â,wTQS¯]KSAv³¢!VGrÒwTø‹rç×7L`î¥5¬:Œ€±¹Ù°Ft%ÚŸIÃ{¤ ÷DÝ^&œ¾‹ìfC·Í£¼¬Oïwõù¡Q£#˜m‘/º"`tŒOõ©1i}Üib1­™«Ô6cÔ-ÝšòGlBzCÿH²C+¥¬#5-VF“Ãb“—o ŸY¯'5ÌlÙ3V(]j,Jö³=ަÒÍ"Ù4îUŠ<Í@¶÷x2ñæ­‡bî|ƒ ²=veøT$xx4+Ðc­íd åNåÛôYJ ”ñûæÝýݸW‰©ÖœOλb÷T-Ú†•iV\¦:Ç–˜×ˆQ 8ãÖ, æÎ3¤-užZé~¾#UŦåTˆù¥ hLÚ+Z·uJg*’‚èÞ…é Å 7H Ã Ð%çÿ.s(–["™æ˜_ØécȺÿ—¸ÉÏYå wǧ·ØÁ¼Þgkç.°¸'§¬â°ô« 'ڊαÀÃUöXjÑûý€^—jd1ß­ì’þgi™ÍÒ6ØûæÎ>Aœƒ" x=®›Ò)²)ʽuPö‰\Ö;h»U=¸Ô9¾ú Š ¨/egŠíD¥»ô²$/CãaA“áVÙyß6 ̳²Ã ý<¨IÓ…Á¨ ÆFIIC³ ÝdŠA·Ú,ª[´5ýáV¢îwn2òÂÃ1_üÒ±c¬&k›Ÿ¡kAH/ƒ-ö(ç˜<Åxl•2i®ô—'¡;×+oåßm›Ž R”ÙÚæûÇØDMMs5餄z´ç;¯õDˆˆøoß|‹ Çm%¦;)@:²,2aåèâ„3±Ð_–t°4&(ËÙÆ òB#-Zæ—ãSp°@ê82olsç>¶¨$H5j4À,‚ÿGfórÊÉ3 íê#/lkþ—à"¡yy–¡4ÝŒÄÑÒ¨‹Äü*+ýTztÓÔ,Šé&F&…Ã{6æLÇ™â%t“æ/P›mOg²%ñ›É á™y(Ð÷mö 86ë]4ê.}4!˜E&tÅ'Ìþ!Ëú³ŠMÛNÌ öÌã€[öçæ;öçCuÿçsš÷r»šT›Ö§ü2S+MÛVÊÄ…ÎOõéþ2¥²å~ÏØDõ¾ÈØJA]6£+ýòcKŠvH–ÇÀ™S;·2ñ•í`.„>@³ïú¥òâ·Iõ®;ø¡Ñ+ü ÜãÈN£Ä¿2Ïâ´ÿyƒwÓ­àòyòöðœ½/U„¶cž.É‡Ž¿³ý c|àÉI¶Iÿ¾ò7QRa]Å0xó½O %Å4}.¥éyG|´««ìÐßîÒôT,Šr¨MÊßx?DÿTó’³Þe@ZþØêÆTyöŽ}QúœIýþ áí”s¦w"±ÜÎ\zMÍOlè wggby˜Äé´«F¤&À¦‚"õAáîÈ·‹ 1¯1_Ä·ï~¼›3«É°ˆœÈíœ&v ©¦îÄS–Ã;üçÕÈ&¥J¿£—Ù~ @çß‹ä[›K³œrúèý}ý믿*‚´LcCX2¡ùùt˜°¡„Ù)ÌÎo ·¦“fÁ¨ M[yKŸÒJ[]Àæ;þW;iÓjZýÅWýä^Ûß¾|cWCäW[ùQ6¹¡}KVëŠ-³t€b¾¨™[î‡yò)«ÉC±˜-â[@^.=)³<‡T ½YN·&Ëʦ+š…‘HI6žBŠãžB ÃWñÔ­õóßhöZªô‘=£¢_³}/…iE¨inêÕ¢ ôt¨¤ò8(ÒuŸÝrVú%†™óhïéc‡Ò‚2|Tbž|~Û‘5‹aã>¥fÜ£!-0ä%'EŒ´|ò'ÛÖÇöD›žv¦ˆ}p6=ÂÍä¡dý²ÞnZ¢ŒÏ¶†? ´lÅߟÌÛ‹¶o“£ÌX/Àñ 6\aÑ.ø¨GRèÄ Î„íõ Ú˾U;+ñ |ÄÝæÈ3'‘ v¹Â±Ê¦DŸ`aA Óš µl½å1+*so´`<Û­š5Q<ìü”%‹$v‡rØäϘÃPMF¾‡umçI\™;σƴ…ìlãõ›FÚú3f«B°ûè¬VA$!Ëa2D?9+L kuɃÔÜv´Ž‰Dý£IP­vHˆÇEw±ûŒÑé;¸çG]dÞa6„ãLŠj:Ö@|:È´õmجiûñ@ Œ†ñ‰ª8Ÿ$¢À0):Çù€´1ëõ&Aåùprq<Ù!ö0ǃ1íWb‡a-iž£fœDƒ»9@8(^ÆÉ œv‰ea¿ $¹GÞ„G OöÔY£ËƒwBdÃE®ø…«V £½…)õ°IÂìD®p?š·Iy bá¾Ä;ÜÂGÊP¯gáG&»ªî5ãí×hh$‚Æ‹GdÜ!©7Ò1×Éœ ÁèK/¿tÆá¿·†æ;åÙf_d§ÍýG£¡“¾íö1vxèø¯þ8ë·sà)L•‰ÅÄFDÓŠ[?u0D ÉŠCŠ}-KMÁ?¨2ð¾xfŽ_‰¼<¹¤×¡;ÞÄ‘¿ÿöå†ÿ¾á¿3<›ùaqF~Š«é6%Åtmªaò@…‘_=ÆÍ)‘OAžÇÓÆÀl^ŸÈŒ˜S¼D÷Ñ?¿¥“æ3êï¡+[Y·ïäêspؾQ÷ç ?—æG1QšŽˆs*è‡Â'Br@Éh³ñ5ö ÿ›h´›Á#ùe#B±z ?{§ ,²±0¶ižÚ¦1°<ðI·„šecO-'å0Ã4ö£3» Ö†@OYX!lºVËœ‚/¤‡Úk"¹'’ãñN^Úá'JùA¨KC'Äge×Ô?Τ©—Ú`h(-1¦›†¢¢±t=WbêºRÄm|W*ÆÔyÅYžà#ŸGl3\w`0œë°ꤊÙÅv¸øR/Æ´ásçî}Ì“*ÃGãG§¦ùâ”dÐ=‡ä&cÁ™;ÀœšÄ=ÎñsÛnP…„§ø/›3ûÇUï–íæh'z¹Ø.™µ.âùËüRœí7¢–!ÛbÖêœyØé„b qòZÏYñdó:è0àG^§Lm‘^C¢ÌaZg˜¶ÃxÐÍ­nG†®KÝ| žHs¬C *—YÐ}†L{4±G©‹_kIË£Œ´¾?ò¼jješƒ| å†ö0Ð1+=W„|(œ'xyÐp{Ä ÿW½ë<ºâý»>6­G-B]e’!دm{vÕ-ÈDSÈõ‰*þ¥ŽÃ'º×u€Ñ$hšÇHóiƒá&ŒßŽ»¶°Õ"ÍxO [Ù¨ ÊMGÜŽeÏÚÁ^üÖÌ<Ùß TâŠR+¾ïÈöu–\y§Zñ‰/šãâãñmyÚŒó“‘ÕÈüIÁ 7·õK°ëW•Áï#»ã–›?Ù‡[Kƒ#ê¦sÕÖY]çtøÆÖBËþÇ?ÆkóÜ xÐkG4zº#VAoŒ5g•¾ÝCÆ0ß’ m ­|m ClÁ1šl4ge»“ãæ´,ù4㼬¹Ç$- Q`»™}ãl³ÊœÓ³,¥§Èñè)FzUülK„Ùy>9áÅ1~cI’c–˜z’ØyäA‡Gû¸2?h,ðIo¨PæAK•óãËæ¢ÃoŸ”nÂ6ð¬ÓÛmçñhЦdû¤;Ÿ…8ÛŒ§þ“ì¢øî¥$‹ (æ¥Ü%Ï`WŠ}9axò-û3¿ØZñºQN©–Ó\œƒNt9ÒáÝ œ/61¸­>Œ ?càÑ'<„“÷y¿iK5¥O¹ïøã«±Šœ‚~ÕD%kªìçXî}„ Aˆˆ=³. {PÅE¼ü Ç\Ñ¥õà…u%m£/‡[cr….ׄXŸF¤Ç¼¾Ô™á¥Џ„¦VT ß§`–f`ö]K,}ë’%þhY`i&duX›#Ø´Ðâå-Ρµ—‹=/*.^Qó =E|#ÐÐÒò?È$^ëG/Õ ÷îò”séæüDË—á&ÌÁ{¸kkæÜo5Üø„Qøb3œZòÖå¢Cö³»¢À΂±ÄVãG ?Í<ÜŽÓlÒ6Çßêñ•°~ÍÉ2_»°EßkÐ%A®=›hØâ¾[èÓlñ•Ÿ…t7Œ-šcz ÞÙ’ßõ™·+4¼oWè¾·e~ßg~\᛾_á›øÉ–ùSŸù¸B·ð7[æßúÌÀ–ô™‘-3ê3×è¯ö+ ÒÉ ÅVPfËÌúÌ/¶Ì/}¦õÀ­±;*—ƒßœH­(zW¸×º+|@‰²¥Q£…ýêÅ:50ýÊq‰„ÛNÁ„I8KQ S¤Úò6ðR–‚ƒRÒUF°N™ÄëÔifÍ4Ørº«œVÛ™ëaDÊlÔhTöI÷¸âÂzDôÈ4„‹øØ‡~Îv¥ôsЧJ½C&'ñ¦h…ÓÓsEý©>C—'=0îJúð]xc¼éßÛß÷€·vÀÛð£ðcøÉuë¹·Þ÷€?Úìí€=àÏvÀŸ{ÀÀô€;;à® -û÷0²F=àÑu÷õÙõ aÙÁ¦=à;à—°²ömƒ³ðÜ>ÛŸ r&ÈóÔ»êôì΢¾‚&ú=¶´ì‚*²4ü?)ÐllÕ‰¼g‡è0_0¡³9Z&òÁÏ–q¤e°VAÁ°´åÔû™,«t Ä6t« ÙoŒ4óÙ1 Õ6 «xQøÁ[5!zÏ_Ó~è=³ÍµTÆyòSòŒgÌ.®Æ ü5<ž–à—Qzì¤Î}ÿÒ¾¾ò Êî>ýc\D^Žwítý[#&…zlå±!lš4-ðìÛ5) ¢ë‘ ]UI‰âÁÒ0+13%ÞÅD¨²Ðg'}’ÇcìSD âÂøËgQ¬ïߥƒ;ÞÀc(ï, Ë M¯NDg¯‘=|¦ís/½¶‡)»ç_ð™O0Žç¨q¥¥ts!#üà6z+S–&CFs6žÐ;PÛQÄÛ0)á">ù|Èß'ÁÁœ²Ï² ãè4²o|ø[ÄRˆ°ÐîiøÓëÍ74Ð# ±ÀNŽˆ[+„ DZÃÎR{UÃA&l"Šo’÷—O´ÓÅÝŸ’’¢wãÆdb6+x'~턇P ôrÌÎU?Ö„Vc;Åæ³º^®7ï¥Xйá,n¯†Jb@O¿´@‡xH󬄔r-žóK{ŽÐ’ð~“CÆÞÿnäi-ðGòRËQ~g¼où"ª<²NÛŒ(6qíæõÀ"g{üÖ{­¾N9ÝãÆ>}xÕnÅZŽëcAë~sÊ "œ­›´JS‹èv…¼ý¥}m„$¤A-óL¼ND¶´L×'ñc§í+MF„ƒšc=zWš{NÔ\ ]ƒ¢¿eؽ ¢Ñè±í„¼:aVú3Ù=pÁ öÜ# zMd"iëÚ"гáŠFTèÃÛÎI/îÕ’Z6?âohMŽjÔÛžÔª9´Ý;²=Û 4S¥ÆwÔ÷éŽn÷ùš£Ýì{nò݉Óß%ô:ÞÕ<ºêê®™ªŸF[L}B}|Ì5Óý4io,£–zõ|bþ٩|¨‰µjѨ÷ë*HyfŸõà1ŒîôêÓÌ)7ÿŽæ‹¥Óg‰307ß±šldÁÓÁ®ïëom.R.õ4KiT{“% ŽZHQ°A¥Q«n.ÒÊÓô” YÔùH!i ö‹Œ7…µÚ‡F÷`ÓÖ$êkÒ¨þ# J˜½lÄç*ƒ‘-ÑO֣󒓪 ^5šlÒé:COÇC«†¸Ô4‡­„tâq;©Ý¸wãänœþVà»±w3ØJ“ìÅÁ‹³8ÝÄcäqÝZk}€ºXÁ:´GöIáê¸A¹å¿ü+Øýަ¢>@S#w9•ŽâpÙuj4— ÕÜ©&8:Ê’*JCâ®=«ÝÊSþþÛÿ»jíE[V¢ôöPÔ< ÖøB«/U %óÛÑ dé%$¯wS m–î-}–7_äÍo°"Óˆ·c+­³p¸þâY\ÈÑxeænüi‡ÐëûÚ¤þ¦ñ1/ß]Òóã5I;ƒÒ vw××WƒŽµç#Á0‚9 ,¤ XÝò‚—þè.Þ@'îû gó3ç\=CéeÏ¥G QïD`¶ͽýj¼~¤2@Kë\ø¿´ûvøJér×ÝýrJðÆŠª2Z~|ÁP¼åLçÁxéêÿ›ï¯Ëmongo-c-driver-2.2.1/src/libmongoc/doc/includes/tls-options.txt000066400000000000000000000031261511661753600245300ustar00rootroot00000000000000.. list-table:: :header-rows: 1 * - Constant - Key - Description * - MONGOC_URI_TLS - tls - {true|false}, indicating if TLS must be used. * - MONGOC_URI_TLSCERTIFICATEKEYFILE - tlscertificatekeyfile - Path to PEM formatted Private Key, with its Public Certificate concatenated at the end. * - MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD - tlscertificatekeypassword - The password, if any, to use to unlock encrypted Private Key. * - MONGOC_URI_TLSCAFILE - tlscafile - One, or a bundle of, Certificate Authorities whom should be considered to be trusted. * - MONGOC_URI_TLSALLOWINVALIDCERTIFICATES - tlsallowinvalidcertificates - Accept and ignore certificate verification errors (e.g. untrusted issuer, expired, etc.) * - MONGOC_URI_TLSALLOWINVALIDHOSTNAMES - tlsallowinvalidhostnames - Ignore hostname verification of the certificate (e.g. Man In The Middle, using valid certificate, but issued for another hostname) * - MONGOC_URI_TLSINSECURE - tlsinsecure - {true|false}, indicating if insecure TLS options should be used. Currently this implies MONGOC_URI_TLSALLOWINVALIDCERTIFICATES and MONGOC_URI_TLSALLOWINVALIDHOSTNAMES. * - MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK - tlsdisablecertificaterevocationcheck - {true|false}, indicates if revocation checking (CRL / OCSP) should be disabled. * - MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK - tlsdisableocspendpointcheck - {true|false}, indicates if OCSP responder endpoints should not be requested when an OCSP response is not stapled.mongo-c-driver-2.2.1/src/libmongoc/doc/includes/update-many-opts.txt000066400000000000000000000037441511661753600254520ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/update-one-opts.txt000066400000000000000000000040361511661753600252620ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``validate``: Construct a bitwise-or of all desired :symbol:`bson_validate_flags_t`. Set to ``false`` to skip client-side validation of the provided BSON documents. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. * ``bypassDocumentValidation``: Set to ``true`` to skip server-side schema validation of the provided BSON documents. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``hint``: A document or string that specifies the index to use to support the query predicate. * ``upsert``: When true, creates a new document if no document matches the query. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. * ``arrayFilters``: An array of filters specifying to which array elements an update should apply. * ``sort``: Specify a sort order when matching documents. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/write-opts-sources.txt000066400000000000000000000014051511661753600260310ustar00rootroot00000000000000Use this function for commands that write such as "drop" or "createRole" (but not for "insert", "update", or "delete", see `Basic Write Operations`_). Write concern and collation can be overridden by various sources. In a transaction, read concern and write concern are prohibited in ``opts``. The highest-priority sources for these options are listed first in the following table. The write concern is omitted for MongoDB before 3.4. ============== ========= Write Concern Collation ============== ========= ``opts`` ``opts`` Transaction |opts-source| ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. mongo-c-driver-2.2.1/src/libmongoc/doc/includes/write-opts.txt000066400000000000000000000024351511661753600243540ustar00rootroot00000000000000 .. Generated with build/generate-opts.py DO NOT EDIT THIS FILE ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``collation``: Configure textual comparisons. See `Setting Collation Order `_, and `the MongoDB Manual entry on Collation `_. Collation requires MongoDB 3.2 or later, otherwise an error is returned. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. mongo-c-driver-2.2.1/src/libmongoc/doc/index.rst000066400000000000000000000011031511661753600215200ustar00rootroot00000000000000libmongoc - API =============== A Cross Platform MongoDB Client Library for C This site documents the API. For tutorials, guides, and explainers, see `MongoDB C Driver `_. Introduction ------------ The MongoDB C Driver, also known as "libmongoc", is a library for using MongoDB from C applications, and for writing MongoDB drivers in higher-level languages. It depends on :doc:`libbson ` to generate and parse BSON documents, the native data format of MongoDB. .. toctree:: :maxdepth: 2 api application-performance-monitoring mongo-c-driver-2.2.1/src/libmongoc/doc/init-cleanup.rst000066400000000000000000000010211511661753600230000ustar00rootroot00000000000000:man_page: mongoc_init_cleanup Initialization and cleanup ========================== Synopsis -------- .. include:: includes/init_cleanup.txt .. only:: html .. toctree:: :titlesonly: :maxdepth: 1 mongoc_init mongoc_cleanup .. versionchanged:: 2.0.0 Versions prior to 2.0.0 supported a non-portable automatic initialization and cleanup with the CMake option ``ENABLE_AUTOMATIC_INIT_AND_CLEANUP``. This was removed in 2.0.0. Ensure your application call :symbol:`mongoc_init` and :symbol:`mongoc_cleanup`. mongo-c-driver-2.2.1/src/libmongoc/doc/lifecycle.rst000066400000000000000000000067501511661753600223650ustar00rootroot00000000000000Object Lifecycle ================ This page documents the order of creation and destruction for libmongoc's main struct types. Clients and pools ----------------- Call :symbol:`mongoc_init()` once, before calling any other libmongoc functions, and call :symbol:`mongoc_cleanup()` once before your program exits. A program that uses libmongoc from multiple threads should create a :symbol:`mongoc_client_pool_t` with :symbol:`mongoc_client_pool_new()`. Each thread acquires a :symbol:`mongoc_client_t` from the pool with :symbol:`mongoc_client_pool_pop()` and returns it with :symbol:`mongoc_client_pool_push()` when the thread is finished using it. To destroy the pool, first return all clients, then call :symbol:`mongoc_client_pool_destroy()`. If your program uses libmongoc from only one thread, create a :symbol:`mongoc_client_t` directly with :symbol:`mongoc_client_new()` or :symbol:`mongoc_client_new_from_uri()`. Destroy it with :symbol:`mongoc_client_destroy()`. Databases, collections, and related objects ------------------------------------------- You can create a :symbol:`mongoc_database_t` or :symbol:`mongoc_collection_t` from a :symbol:`mongoc_client_t`, and create a :symbol:`mongoc_cursor_t` or :symbol:`mongoc_bulk_operation_t` from a :symbol:`mongoc_collection_t`. Each of these objects must be destroyed before the client they were created from, but their lifetimes are otherwise independent. GridFS objects -------------- You can create a :symbol:`mongoc_gridfs_t` from a :symbol:`mongoc_client_t`, create a :symbol:`mongoc_gridfs_file_t` or :symbol:`mongoc_gridfs_file_list_t` from a :symbol:`mongoc_gridfs_t`, create a :symbol:`mongoc_gridfs_file_t` from a :symbol:`mongoc_gridfs_file_list_t`, and create a :symbol:`mongoc_stream_t` from a :symbol:`mongoc_gridfs_file_t`. Each of these objects depends on the object it was created from. Always destroy GridFS objects in the reverse of the order they were created. The sole exception is that a :symbol:`mongoc_gridfs_file_t` need not be destroyed before the :symbol:`mongoc_gridfs_file_list_t` it was created from. GridFS bucket objects --------------------- Create :symbol:`mongoc_gridfs_bucket_t` with a :symbol:`mongoc_database_t` derived from a :symbol:`mongoc_client_t`. The :symbol:`mongoc_database_t` is independent from the :symbol:`mongoc_gridfs_bucket_t`. But the :symbol:`mongoc_client_t` must outlive the :symbol:`mongoc_gridfs_bucket_t`. A :symbol:`mongoc_stream_t` may be created from the :symbol:`mongoc_gridfs_bucket_t`. The :symbol:`mongoc_gridfs_bucket_t` must outlive the :symbol:`mongoc_stream_t`. Sessions -------- .. include:: includes/session-lifecycle.txt Client Side Encryption ---------------------- When configuring a :symbol:`mongoc_client_t` for automatic encryption via :symbol:`mongoc_client_enable_auto_encryption()`, if a separate key vault client is set in the options (via :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()`) the key vault client must outlive the encrypted client. When configuring a :symbol:`mongoc_client_pool_t` for automatic encryption via :symbol:`mongoc_client_pool_enable_auto_encryption()`, if a separate key vault client pool is set in the options (via :symbol:`mongoc_auto_encryption_opts_set_keyvault_client_pool()`) the key vault client pool must outlive the encrypted client pool. When creating a :symbol:`mongoc_client_encryption_t`, the configured key vault client (set via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`) must outlive the :symbol:`mongoc_client_encryption_t`.mongo-c-driver-2.2.1/src/libmongoc/doc/logging.rst000066400000000000000000000012701511661753600220440ustar00rootroot00000000000000:man_page: mongoc_logging Logging ======= The MongoDB C driver has two different types of logging available: * The original ``mongoc_log`` facility supports freeform string messages that originate from the driver itself or from application code. This has been retroactively termed "unstructured logging". * A new ``mongoc_structured_log`` facility reports messages from the driver itself using a BSON format defined across driver implementations by the `MongoDB Logging Specification `_. These two systems are configured and used independently. .. toctree:: :titlesonly: :maxdepth: 1 unstructured_log structured_log mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_callbacks_destroy.rst000066400000000000000000000006351511661753600263110ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_destroy mongoc_apm_callbacks_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_apm_callbacks_destroy (mongoc_apm_callbacks_t *callbacks); Free a :symbol:`mongoc_apm_callbacks_t`. Does nothing if ``callbacks`` is NULL. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_callbacks_new.rst000066400000000000000000000007301511661753600254050ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_new mongoc_apm_callbacks_new() ========================== Synopsis -------- .. code-block:: c mongoc_apm_callbacks_t * mongoc_apm_callbacks_new (void); Create a struct to hold event-notification callbacks. Returns ------- A new ``mongoc_apm_callbacks_t`` you must free with :symbol:`mongoc_apm_callbacks_destroy`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_callbacks_t.rst000066400000000000000000000022401511661753600250550ustar00rootroot00000000000000:man_page: mongoc_apm_callbacks_t mongoc_apm_callbacks_t ====================== Notification callbacks Synopsis -------- Used to receive notification of events, such as when a MongoDB command begins, succeeds, or fails. Create a ``mongoc_apm_callbacks_t`` with :symbol:`mongoc_apm_callbacks_new`, set callbacks on it, then pass it to :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_callbacks_destroy mongoc_apm_callbacks_new mongoc_apm_set_command_failed_cb mongoc_apm_set_command_started_cb mongoc_apm_set_command_succeeded_cb mongoc_apm_set_server_changed_cb mongoc_apm_set_server_closed_cb mongoc_apm_set_server_heartbeat_failed_cb mongoc_apm_set_server_heartbeat_started_cb mongoc_apm_set_server_heartbeat_succeeded_cb mongoc_apm_set_server_opening_cb mongoc_apm_set_topology_changed_cb mongoc_apm_set_topology_closed_cb mongoc_apm_set_topology_opening_cb mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_command_name.rst000066400000000000000000000013251511661753600310750ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_command_name mongoc_apm_command_failed_get_command_name() ============================================ Synopsis -------- .. code-block:: c const char * mongoc_apm_command_failed_get_command_name ( const mongoc_apm_command_failed_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_context.rst000066400000000000000000000011631511661753600301430ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_context mongoc_apm_command_failed_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_command_failed_get_context ( const mongoc_apm_command_failed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_database_name.rst000066400000000000000000000013321511661753600312210ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_database_name mongoc_apm_command_failed_get_database_name() ============================================= Synopsis -------- .. code-block:: c const char * mongoc_apm_command_failed_get_database_name ( const mongoc_apm_command_failed_t *event); Returns this event's database name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_duration.rst000066400000000000000000000010521511661753600303010ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_duration mongoc_apm_command_failed_get_duration() ======================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_duration ( const mongoc_apm_command_failed_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_error.rst000066400000000000000000000011501511661753600276040ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_error mongoc_apm_command_failed_get_error() ===================================== Synopsis -------- .. code-block:: c void mongoc_apm_command_failed_get_error (const mongoc_apm_command_failed_t *event, bson_error_t *error); Copies this event's error info. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. * ``error``: A :symbol:`bson:bson_error_t` to receive the event's error info. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_host.rst000066400000000000000000000014651511661753600274410ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_host mongoc_apm_command_failed_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_failed_get_host (const mongoc_apm_command_failed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_operation_id.rst000066400000000000000000000013011511661753600311250ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_operation_id mongoc_apm_command_failed_get_operation_id() ============================================ Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_operation_id ( const mongoc_apm_command_failed_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_reply.rst000066400000000000000000000016211511661753600276110ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_reply mongoc_apm_command_failed_get_reply() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_failed_get_reply ( const mongoc_apm_command_failed_t *event); Returns the server's reply to a command that failed. The reply contains details about why the command failed. If no server reply was received, such as in the event of a network error, then the reply is a valid empty BSON document. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_request_id.rst000066400000000000000000000011761511661753600306270ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_request_id mongoc_apm_command_failed_get_request_id() ========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_request_id ( const mongoc_apm_command_failed_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_server_connection_id_int64.rst000066400000000000000000000016271511661753600337110ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_server_connection_id_int64 mongoc_apm_command_failed_get_server_connection_id_int64() ========================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_failed_get_server_connection_id_int64 ( const mongoc_apm_command_failed_t *event); Returns this event's context. Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_failed_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_server_id.rst000066400000000000000000000010411511661753600304340ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_server_id mongoc_apm_command_failed_get_server_id() ========================================= Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_failed_get_server_id ( const mongoc_apm_command_failed_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_get_service_id.rst000066400000000000000000000011451511661753600305730ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_get_service_id mongoc_apm_command_failed_get_service_id() ========================================== Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_failed_get_service_id ( const mongoc_apm_command_failed_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_failed_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_failed_t.rst000066400000000000000000000017051511661753600260650ustar00rootroot00000000000000:man_page: mongoc_apm_command_failed_t mongoc_apm_command_failed_t =========================== Command-failed event Synopsis -------- An event notification sent when the driver fails to execute a MongoDB command. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_failed_get_command_name mongoc_apm_command_failed_get_database_name mongoc_apm_command_failed_get_context mongoc_apm_command_failed_get_duration mongoc_apm_command_failed_get_error mongoc_apm_command_failed_get_host mongoc_apm_command_failed_get_operation_id mongoc_apm_command_failed_get_reply mongoc_apm_command_failed_get_request_id mongoc_apm_command_failed_get_server_id mongoc_apm_command_failed_get_service_id mongoc_apm_command_failed_get_server_connection_id_int64 .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_command.rst000066400000000000000000000013231511661753600303150ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_command mongoc_apm_command_started_get_command() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_started_get_command ( const mongoc_apm_command_started_t *event); Returns this event's command. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_command_name.rst000066400000000000000000000013331511661753600313160ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_command_name mongoc_apm_command_started_get_command_name() ============================================= Synopsis -------- .. code-block:: c const char * mongoc_apm_command_started_get_command_name ( const mongoc_apm_command_started_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_context.rst000066400000000000000000000011711511661753600303640ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_context mongoc_apm_command_started_get_context() ======================================== Synopsis -------- .. code-block:: c void * mongoc_apm_command_started_get_context ( const mongoc_apm_command_started_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_database_name.rst000066400000000000000000000013401511661753600314420ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_database_name mongoc_apm_command_started_get_database_name() ============================================== Synopsis -------- .. code-block:: c const char * mongoc_apm_command_started_get_database_name ( const mongoc_apm_command_started_t *event); Returns this event's database name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_host.rst000066400000000000000000000014731511661753600276620ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_host mongoc_apm_command_started_get_host() ===================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_started_get_host (const mongoc_apm_command_started_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_operation_id.rst000066400000000000000000000013071511661753600313550ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_operation_id mongoc_apm_command_started_get_operation_id() ============================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_operation_id ( const mongoc_apm_command_started_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_request_id.rst000066400000000000000000000012041511661753600310410ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_request_id mongoc_apm_command_started_get_request_id() =========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_request_id ( const mongoc_apm_command_started_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_server_connection_id_int64.rst000066400000000000000000000015771511661753600341370ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_server_connection_id_int64 mongoc_apm_command_started_get_server_connection_id_int64() =========================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_started_get_server_connection_id_int64 ( const mongoc_apm_command_started_t *event); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_started_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_server_id.rst000066400000000000000000000010471511661753600306640ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_server_id mongoc_apm_command_started_get_server_id() ========================================== Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_started_get_server_id ( const mongoc_apm_command_started_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_get_service_id.rst000066400000000000000000000011531511661753600310140ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_get_service_id mongoc_apm_command_started_get_service_id() =========================================== Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_started_get_service_id ( const mongoc_apm_command_started_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_started_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_started_t.rst000066400000000000000000000016021511661753600263030ustar00rootroot00000000000000:man_page: mongoc_apm_command_started_t mongoc_apm_command_started_t ============================ Command-started event Synopsis -------- An event notification sent when the driver begins executing a MongoDB command. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_started_get_command mongoc_apm_command_started_get_command_name mongoc_apm_command_started_get_context mongoc_apm_command_started_get_database_name mongoc_apm_command_started_get_host mongoc_apm_command_started_get_operation_id mongoc_apm_command_started_get_request_id mongoc_apm_command_started_get_server_id mongoc_apm_command_started_get_service_id mongoc_apm_command_started_get_server_connection_id_int64 mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_command_name.rst000066400000000000000000000013471511661753600316010ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_command_name mongoc_apm_command_succeeded_get_command_name() =============================================== Synopsis -------- .. code-block:: c const char * mongoc_apm_command_succeeded_get_command_name ( const mongoc_apm_command_succeeded_t *event); Returns this event's command name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_context.rst000066400000000000000000000012051511661753600306400ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_context mongoc_apm_command_succeeded_get_context() ========================================== Synopsis -------- .. code-block:: c void * mongoc_apm_command_succeeded_get_context ( const mongoc_apm_command_succeeded_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_database_name.rst000066400000000000000000000013541511661753600317250ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_database_name mongoc_apm_command_succeeded_get_database_name() ================================================ Synopsis -------- .. code-block:: c const char * mongoc_apm_command_succeeded_get_database_name ( const mongoc_apm_command_succeeded_t *event); Returns this event's database name. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A string that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_duration.rst000066400000000000000000000010741511661753600310050ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_duration mongoc_apm_command_succeeded_get_duration() =========================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_duration ( const mongoc_apm_command_succeeded_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_host.rst000066400000000000000000000015151511661753600301350ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_host mongoc_apm_command_succeeded_get_host() ======================================= Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_command_succeeded_get_host ( const mongoc_apm_command_succeeded_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_operation_id.rst000066400000000000000000000013231511661753600316310ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_operation_id mongoc_apm_command_succeeded_get_operation_id() =============================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_operation_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's operation id. This number correlates all the commands in a bulk operation, or all the "find" and "getMore" commands required to stream a large query result. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's operation id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_reply.rst000066400000000000000000000013251511661753600303120ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_reply mongoc_apm_command_succeeded_get_reply() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_command_succeeded_get_reply ( const mongoc_apm_command_succeeded_t *event); Returns this event's reply. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_request_id.rst000066400000000000000000000012201511661753600313150ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_request_id mongoc_apm_command_succeeded_get_request_id() ============================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_request_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's wire-protocol request id. Use this number to correlate client-side events with server log messages. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's request id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongoc_apm_command_succeeded_get_server_connection_id_int64.rst000066400000000000000000000016151511661753600343270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_apm_command_succeeded_get_server_connection_id_int64 mongoc_apm_command_succeeded_get_server_connection_id_int64() ============================================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_command_succeeded_get_server_connection_id_int64 ( const mongoc_apm_command_succeeded_t *event); Returns the server connection ID for the command. The server connection ID is distinct from the server ID (:symbol:`mongoc_apm_command_succeeded_get_server_id`) and is returned by the hello or legacy hello response as "connectionId" from the server on 4.2+. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The server connection ID as a positive integer or -1 if it is not available. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_server_id.rst000066400000000000000000000010631511661753600311400ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_server_id mongoc_apm_command_succeeded_get_server_id() ============================================ Synopsis -------- .. code-block:: c uint32_t mongoc_apm_command_succeeded_get_server_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's server id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- The event's server id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_get_service_id.rst000066400000000000000000000011671511661753600312770ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_get_service_id mongoc_apm_command_succeeded_get_service_id() ============================================= Synopsis -------- .. code-block:: c const bson_oid_t * mongoc_apm_command_succeeded_get_service_id ( const mongoc_apm_command_succeeded_t *event); Returns this event's service ID, which identifies the MongoDB service behind a load balancer, or ``NULL`` if not connected to a load balanced cluster. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_command_succeeded_t`. Returns ------- A :symbol:`bson_oid_t` that should not be modified or freed or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_command_succeeded_t.rst000066400000000000000000000017171511661753600265700ustar00rootroot00000000000000:man_page: mongoc_apm_command_succeeded_t mongoc_apm_command_succeeded_t ============================== Command-succeeded event Synopsis -------- An event notification sent when the driver successfully executes a MongoDB command. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_command_succeeded_get_command_name mongoc_apm_command_succeeded_get_database_name mongoc_apm_command_succeeded_get_context mongoc_apm_command_succeeded_get_duration mongoc_apm_command_succeeded_get_host mongoc_apm_command_succeeded_get_operation_id mongoc_apm_command_succeeded_get_reply mongoc_apm_command_succeeded_get_request_id mongoc_apm_command_succeeded_get_server_id mongoc_apm_command_succeeded_get_service_id mongoc_apm_command_succeeded_get_server_connection_id_int64 mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_get_context.rst000066400000000000000000000011631511661753600302000ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_context mongoc_apm_server_changed_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_changed_get_context ( const mongoc_apm_server_changed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_get_host.rst000066400000000000000000000014651511661753600274760ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_host mongoc_apm_server_changed_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_changed_get_host (const mongoc_apm_server_changed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_get_new_description.rst000066400000000000000000000014321511661753600317070ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_new_description mongoc_apm_server_changed_get_new_description() =============================================== Synopsis -------- .. code-block:: c const mongoc_server_description_t * mongoc_apm_server_changed_get_new_description ( const mongoc_apm_server_changed_t *event); Returns this event's new description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_server_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_get_previous_description.rst000066400000000000000000000014631511661753600327760ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_previous_description mongoc_apm_server_changed_get_previous_description() ==================================================== Synopsis -------- .. code-block:: c const mongoc_server_description_t * mongoc_apm_server_changed_get_previous_description ( const mongoc_apm_server_changed_t *event); Returns this event's previous description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. Returns ------- A :symbol:`mongoc_server_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_get_topology_id.rst000066400000000000000000000012251511661753600310430ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_get_topology_id mongoc_apm_server_changed_get_topology_id() =========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_changed_get_topology_id ( const mongoc_apm_server_changed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_changed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_changed_t.rst000066400000000000000000000012501511661753600261150ustar00rootroot00000000000000:man_page: mongoc_apm_server_changed_t mongoc_apm_server_changed_t =========================== Server-changed event Synopsis -------- An event notification sent when the driver observes a change in status of a server it is connected to. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_changed_get_context mongoc_apm_server_changed_get_host mongoc_apm_server_changed_get_new_description mongoc_apm_server_changed_get_previous_description mongoc_apm_server_changed_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_closed_get_context.rst000066400000000000000000000011471511661753600300620ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_context mongoc_apm_server_closed_get_context() ====================================== Synopsis -------- .. code-block:: c void * mongoc_apm_server_closed_get_context (const mongoc_apm_server_closed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_closed_get_host.rst000066400000000000000000000014571511661753600273570ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_host mongoc_apm_server_closed_get_host() =================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_closed_get_host (const mongoc_apm_server_closed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_closed_get_topology_id.rst000066400000000000000000000012171511661753600307240ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_get_topology_id mongoc_apm_server_closed_get_topology_id() ========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_closed_get_topology_id ( const mongoc_apm_server_closed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_closed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_closed_t.rst000066400000000000000000000011151511661753600257750ustar00rootroot00000000000000:man_page: mongoc_apm_server_closed_t mongoc_apm_server_closed_t ========================== Server-closed event Synopsis -------- An event notification sent when the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_closed_get_context mongoc_apm_server_closed_get_host mongoc_apm_server_closed_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_awaited.rst000066400000000000000000000012311511661753600320000ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_awaited mongoc_apm_server_heartbeat_failed_get_awaited() ================================================ Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_failed_get_awaited ( const mongoc_apm_server_heartbeat_failed_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_context.rst000066400000000000000000000012511511661753600320500ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_context mongoc_apm_server_heartbeat_failed_get_context() ================================================ Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_failed_get_context ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_duration.rst000066400000000000000000000011401511661753600322060ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_duration mongoc_apm_server_heartbeat_failed_get_duration() ================================================= Synopsis -------- .. code-block:: c int64_t mongoc_apm_server_heartbeat_failed_get_duration ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_error.rst000066400000000000000000000011751511661753600315220ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_error mongoc_apm_server_heartbeat_failed_get_error() ============================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_heartbeat_failed_get_error ( const mongoc_apm_server_heartbeat_failed_t *event, bson_error_t *error); Copies this event's error info. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. * ``error``: A :symbol:`bson:bson_error_t` to receive the event's error info. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_get_host.rst000066400000000000000000000015611511661753600313450ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_get_host mongoc_apm_server_heartbeat_failed_get_host() ============================================= Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_failed_get_host ( const mongoc_apm_server_heartbeat_failed_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_failed_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_failed_t.rst000066400000000000000000000013361511661753600277740ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_failed_t mongoc_apm_server_heartbeat_failed_t ==================================== Heartbeat-failed event Synopsis -------- An event notification sent when the driver failed to send a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_failed_get_awaited mongoc_apm_server_heartbeat_failed_get_context mongoc_apm_server_heartbeat_failed_get_duration mongoc_apm_server_heartbeat_failed_get_error mongoc_apm_server_heartbeat_failed_get_host mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_awaited.rst000066400000000000000000000012371511661753600322300ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_awaited mongoc_apm_server_heartbeat_started_get_awaited() ================================================= Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_started_get_awaited ( const mongoc_apm_server_heartbeat_started_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_context.rst000066400000000000000000000012571511661753600323000ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_context mongoc_apm_server_heartbeat_started_get_context() ================================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_started_get_context ( const mongoc_apm_server_heartbeat_started_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_get_host.rst000066400000000000000000000015671511661753600315750ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_get_host mongoc_apm_server_heartbeat_started_get_host() ============================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_started_get_host ( const mongoc_apm_server_heartbeat_started_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_started_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_started_t.rst000066400000000000000000000012021511661753600302060ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_started_t mongoc_apm_server_heartbeat_started_t ===================================== Heartbeat-started event Synopsis -------- An event notification sent when the driver begins executing a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_started_get_awaited mongoc_apm_server_heartbeat_started_get_context mongoc_apm_server_heartbeat_started_get_host mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_awaited.rst000066400000000000000000000012531511661753600325040ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_awaited mongoc_apm_server_heartbeat_succeeded_get_awaited() =================================================== Synopsis -------- .. code-block:: c bool mongoc_apm_server_heartbeat_succeeded_get_awaited ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns whether this event came from an awaitable hello. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A bool indicating whether the heartbeat event came from an awaitable hello. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_context.rst000066400000000000000000000012731511661753600325540ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_context mongoc_apm_server_heartbeat_succeeded_get_context() =================================================== Synopsis -------- .. code-block:: c void * mongoc_apm_server_heartbeat_succeeded_get_context ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_duration.rst000066400000000000000000000011621511661753600327120ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_duration mongoc_apm_server_heartbeat_succeeded_get_duration() ==================================================== Synopsis -------- .. code-block:: c int64_t mongoc_apm_server_heartbeat_succeeded_get_duration ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's duration in microseconds. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- The event's duration. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_host.rst000066400000000000000000000016031511661753600320420ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_host mongoc_apm_server_heartbeat_succeeded_get_host() ================================================ Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_heartbeat_succeeded_get_host ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_get_reply.rst000066400000000000000000000014131511661753600322170ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_get_reply mongoc_apm_server_heartbeat_succeeded_get_reply() ================================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_apm_server_heartbeat_succeeded_get_reply ( const mongoc_apm_server_heartbeat_succeeded_t *event); Returns this event's reply. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_heartbeat_succeeded_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_heartbeat_succeeded_t.rst000066400000000000000000000013641511661753600304750ustar00rootroot00000000000000:man_page: mongoc_apm_server_heartbeat_succeeded_t mongoc_apm_server_heartbeat_succeeded_t ======================================= Heartbeat-succeeded event Synopsis -------- An event notification sent when the driver completes a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_heartbeat_succeeded_get_awaited mongoc_apm_server_heartbeat_succeeded_get_context mongoc_apm_server_heartbeat_succeeded_get_duration mongoc_apm_server_heartbeat_succeeded_get_host mongoc_apm_server_heartbeat_succeeded_get_reply mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_opening_get_context.rst000066400000000000000000000011631511661753600302460ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_context mongoc_apm_server_opening_get_context() ======================================= Synopsis -------- .. code-block:: c void * mongoc_apm_server_opening_get_context ( const mongoc_apm_server_opening_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_opening_get_host.rst000066400000000000000000000014651511661753600275440ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_host mongoc_apm_server_opening_get_host() ==================================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_apm_server_opening_get_host (const mongoc_apm_server_opening_t *event); Returns this event's host. This :symbol:`mongoc_host_list_t` is *not* part of a linked list, it is solely the server for this event. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. Returns ------- A :symbol:`mongoc_host_list_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_opening_get_topology_id.rst000066400000000000000000000012251511661753600311110ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_get_topology_id mongoc_apm_server_opening_get_topology_id() =========================================== Synopsis -------- .. code-block:: c void mongoc_apm_server_opening_get_topology_id ( const mongoc_apm_server_opening_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_server_opening_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_server_opening_t.rst000066400000000000000000000011371511661753600261670ustar00rootroot00000000000000:man_page: mongoc_apm_server_opening_t mongoc_apm_server_opening_t =========================== Server-opening event Synopsis -------- An event notification sent when the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_server_opening_get_context mongoc_apm_server_opening_get_host mongoc_apm_server_opening_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_command_failed_cb.rst000066400000000000000000000014331511661753600270570ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_failed_cb mongoc_apm_set_command_failed_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_failed_cb_t) ( const mongoc_apm_command_failed_t *event); void mongoc_apm_set_command_failed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_failed_cb_t cb); Receive an event notification whenever the driver fails to execute a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_failed_t` whenever a MongoDB operation fails. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_command_started_cb.rst000066400000000000000000000014461511661753600273050ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_started_cb mongoc_apm_set_command_started_cb() =================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_started_cb_t) ( const mongoc_apm_command_started_t *event); void mongoc_apm_set_command_started_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_started_cb_t cb); Receive an event notification whenever the driver starts a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_started_t` whenever the driver begins a MongoDB operation. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_command_succeeded_cb.rst000066400000000000000000000014761511661753600275660ustar00rootroot00000000000000:man_page: mongoc_apm_set_command_succeeded_cb mongoc_apm_set_command_succeeded_cb() ===================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_command_succeeded_cb_t) ( const mongoc_apm_command_succeeded_t *event); void mongoc_apm_set_command_succeeded_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_succeeded_cb_t cb); Receive an event notification whenever the driver completes a MongoDB operation. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_command_succeeded_t` whenever the driver completes a MongoDB operation. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_changed_cb.rst000066400000000000000000000015351511661753600271170ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_changed_cb mongoc_apm_set_server_changed_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_changed_cb_t) ( const mongoc_apm_server_changed_t *event); void mongoc_apm_set_server_changed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_changed_cb_t cb); Receive an event notification whenever the driver observes a change in status of a server it is connected to. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_changed_t` whenever the driver observes a change in status of a server it is connected to. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_closed_cb.rst000066400000000000000000000015761511661753600270040ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_closed_cb mongoc_apm_set_server_closed_cb() ================================= Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_closed_cb_t) ( const mongoc_apm_server_closed_t *event); void mongoc_apm_set_server_closed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_closed_cb_t cb); Receive an event notification whenever the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_closed_t` whenever the driver stops monitoring a server and removes its :symbol:`mongoc_server_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_failed_cb.rst000066400000000000000000000016701511661753600307710ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_failed_cb mongoc_apm_set_server_heartbeat_failed_cb() =========================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_failed_cb_t) ( const mongoc_apm_server_heartbeat_failed_t *event); void mongoc_apm_set_server_heartbeat_failed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_failed_cb_t cb); Receive an event notification whenever the driver fails to send a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_failed_t` whenever the driver fails to send a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_started_cb.rst000066400000000000000000000017071511661753600312140ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_started_cb mongoc_apm_set_server_heartbeat_started_cb() ============================================ Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_started_cb_t) ( const mongoc_apm_server_heartbeat_started_t *event); void mongoc_apm_set_server_heartbeat_started_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_started_cb_t cb); Receive an event notification whenever the driver begins executing a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_started_t` whenever the driver begins executing a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_heartbeat_succeeded_cb.rst000066400000000000000000000017131511661753600314670ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_heartbeat_succeeded_cb mongoc_apm_set_server_heartbeat_succeeded_cb() ============================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_heartbeat_succeeded_cb_t) ( const mongoc_apm_server_heartbeat_succeeded_t *event); void mongoc_apm_set_server_heartbeat_succeeded_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_succeeded_cb_t cb); Receive an event notification whenever the driver completes a "hello" command to check the status of a server. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_heartbeat_succeeded_t` whenever the driver completes a "hello" command to check the status of a server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_server_opening_cb.rst000066400000000000000000000016351511661753600271660ustar00rootroot00000000000000:man_page: mongoc_apm_set_server_opening_cb mongoc_apm_set_server_opening_cb() ================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_server_opening_cb_t) ( const mongoc_apm_server_opening_t *event); void mongoc_apm_set_server_opening_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_opening_cb_t cb); Receive an event notification whenever the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_server_opening_t` whenever the driver adds a :symbol:`mongoc_server_description_t` for a new server it was not monitoring before. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_topology_changed_cb.rst000066400000000000000000000017051511661753600274640ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_changed_cb mongoc_apm_set_topology_changed_cb() ==================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_changed_cb_t) ( const mongoc_apm_topology_changed_t *event); void mongoc_apm_set_topology_changed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_changed_cb_t cb); Receive an event notification whenever the driver observes a change in any of the servers it is connected to or a change in the overall server topology. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_changed_t` whenever the driver observes a change in any of the servers it is connected to or a change in the overall server topology. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_topology_closed_cb.rst000066400000000000000000000016501511661753600273430ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_closed_cb mongoc_apm_set_topology_closed_cb() =================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_closed_cb_t) ( const mongoc_apm_topology_closed_t *event); void mongoc_apm_set_topology_closed_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_closed_cb_t cb); Receive an event notification whenever the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_closed_t` whenever the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_set_topology_opening_cb.rst000066400000000000000000000015451511661753600275340ustar00rootroot00000000000000:man_page: mongoc_apm_set_topology_opening_cb mongoc_apm_set_topology_opening_cb() ==================================== Synopsis -------- .. code-block:: c typedef void (*mongoc_apm_topology_opening_cb_t) ( const mongoc_apm_topology_opening_t *event); void mongoc_apm_set_topology_opening_cb (mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_opening_cb_t cb); Receive an event notification whenever the driver initializes a :symbol:`mongoc_topology_description_t`. Parameters ---------- * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``cb``: A function to call with a :symbol:`mongoc_apm_topology_opening_t` whenever the driver initializes a :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_changed_get_context.rst000066400000000000000000000011771511661753600305530ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_context mongoc_apm_topology_changed_get_context() ========================================= Synopsis -------- .. code-block:: c void * mongoc_apm_topology_changed_get_context ( const mongoc_apm_topology_changed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_changed_get_new_description.rst000066400000000000000000000014521511661753600322570ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_new_description mongoc_apm_topology_changed_get_new_description() ================================================= Synopsis -------- .. code-block:: c const mongoc_topology_description_t * mongoc_apm_topology_changed_get_new_description ( const mongoc_apm_topology_changed_t *event); Returns this event's new description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- A :symbol:`mongoc_topology_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_changed_get_previous_description.rst000066400000000000000000000015031511661753600333370ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_previous_description mongoc_apm_topology_changed_get_previous_description() ====================================================== Synopsis -------- .. code-block:: c const mongoc_topology_description_t * mongoc_apm_topology_changed_get_previous_description ( const mongoc_apm_topology_changed_t *event); Returns this event's previous description. The data is only valid in the scope of the callback that receives this event; copy it if it will be accessed after the callback returns. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. Returns ------- A :symbol:`mongoc_topology_description_t` that should not be modified or freed. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_changed_get_topology_id.rst000066400000000000000000000012411511661753600314070ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_get_topology_id mongoc_apm_topology_changed_get_topology_id() ============================================= Synopsis -------- .. code-block:: c void mongoc_apm_topology_changed_get_topology_id ( const mongoc_apm_topology_changed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_changed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_changed_t.rst000066400000000000000000000012741511661753600264710ustar00rootroot00000000000000:man_page: mongoc_apm_topology_changed_t mongoc_apm_topology_changed_t ============================= Topology-changed event Synopsis -------- An event notification sent when the driver observes a change in any of the servers it is connected to or a change in the overall server topology. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_changed_get_context mongoc_apm_topology_changed_get_new_description mongoc_apm_topology_changed_get_previous_description mongoc_apm_topology_changed_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_closed_get_context.rst000066400000000000000000000011711511661753600304250ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_get_context mongoc_apm_topology_closed_get_context() ======================================== Synopsis -------- .. code-block:: c void * mongoc_apm_topology_closed_get_context ( const mongoc_apm_topology_closed_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_closed_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_closed_get_topology_id.rst000066400000000000000000000012331511661753600312700ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_get_topology_id mongoc_apm_topology_closed_get_topology_id() ============================================ Synopsis -------- .. code-block:: c void mongoc_apm_topology_closed_get_topology_id ( const mongoc_apm_topology_closed_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_closed_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_closed_t.rst000066400000000000000000000010771511661753600263520ustar00rootroot00000000000000:man_page: mongoc_apm_topology_closed_t mongoc_apm_topology_closed_t ============================ Topology-closed event Synopsis -------- An event notification sent when the driver stops monitoring a server topology and destroys its :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_closed_get_context mongoc_apm_topology_closed_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_opening_get_context.rst000066400000000000000000000011771511661753600306210ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_get_context mongoc_apm_topology_opening_get_context() ========================================= Synopsis -------- .. code-block:: c void * mongoc_apm_topology_opening_get_context ( const mongoc_apm_topology_opening_t *event); Returns this event's context. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_opening_t`. Returns ------- The pointer passed with :symbol:`mongoc_client_set_apm_callbacks` or :symbol:`mongoc_client_pool_set_apm_callbacks`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_opening_get_topology_id.rst000066400000000000000000000012411511661753600314550ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_get_topology_id mongoc_apm_topology_opening_get_topology_id() ============================================= Synopsis -------- .. code-block:: c void mongoc_apm_topology_opening_get_topology_id ( const mongoc_apm_topology_opening_t *event, bson_oid_t *topology_id); Returns this event's topology id. Parameters ---------- * ``event``: A :symbol:`mongoc_apm_topology_opening_t`. * ``topology_id``: A :symbol:`bson:bson_oid_t` to receive the event's topology_id. Returns ------- The event's topology id. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_apm_topology_opening_t.rst000066400000000000000000000010371511661753600265340ustar00rootroot00000000000000:man_page: mongoc_apm_topology_opening_t mongoc_apm_topology_opening_t ============================= Topology-opening event Synopsis -------- An event notification sent when the driver initializes a :symbol:`mongoc_topology_description_t`. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_apm_topology_opening_get_context mongoc_apm_topology_opening_get_topology_id mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_destroy.rst000066400000000000000000000007671511661753600300320ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_destroy mongoc_auto_encryption_opts_destroy() ===================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_destroy (mongoc_auto_encryption_opts_t *opts); Destroy a :symbol:`mongoc_auto_encryption_opts_t`. Parameters ---------- * ``opts`` The :symbol:`mongoc_auto_encryption_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_new()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_new.rst000066400000000000000000000022051511661753600271170ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_new mongoc_auto_encryption_opts_new() ================================= Synopsis -------- .. code-block:: c mongoc_auto_encryption_opts_t * mongoc_auto_encryption_opts_new (void); Create a new :symbol:`mongoc_auto_encryption_opts_t`. Caller must set the required options: * :symbol:`mongoc_auto_encryption_opts_set_keyvault_namespace()` * :symbol:`mongoc_auto_encryption_opts_set_kms_providers()` Caller may set optionally set the following: * :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()` * :symbol:`mongoc_auto_encryption_opts_set_schema_map()` * :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` * :symbol:`mongoc_auto_encryption_opts_set_extra()` This options struct is used to enable auto encryption with :symbol:`mongoc_client_enable_auto_encryption()`. Returns ------- A new :symbol:`mongoc_auto_encryption_opts_t`, which must be destroyed with :symbol:`mongoc_auto_encryption_opts_destroy()`. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_destroy()` | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_bypass_auto_encryption.rst000066400000000000000000000013661511661753600340130ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_bypass_auto_encryption mongoc_auto_encryption_opts_set_bypass_auto_encryption() ======================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_bypass_auto_encryption ( mongoc_auto_encryption_opts_t *opts, bool bypass_auto_encryption); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``bypass_auto_encryption``: A boolean. If true, a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_client_enable_auto_encryption()` will only perform automatic decryption (not encryption). .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_bypass_query_analysis.rst000066400000000000000000000016171511661753600336400ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_bypass_query_analysis mongoc_auto_encryption_opts_set_bypass_query_analysis() ======================================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_bypass_query_analysis ( mongoc_auto_encryption_opts_t *opts, bool bypass_query_analysis); .. versionadded:: 1.22.0 Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``bypass_query_analysis``: A boolean. ``bypass_query_analysis`` disables automatic analysis of outgoing commands. ``bypass_query_analysis`` is useful for encrypting indexed fields without the ``crypt_shared`` library or ``mongocryptd`` process. Set ``bypass_query_analysis`` to true to use explicit encryption on indexed fields. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_encrypted_fields_map.rst000066400000000000000000000021071511661753600333620ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_encrypted_fields_map mongoc_auto_encryption_opts_set_encrypted_fields_map() ====================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_encrypted_fields_map ( mongoc_auto_encryption_opts_t *opts, const bson_t *encrypted_fields_map); .. versionadded:: 1.22.0 Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``encrypted_fields_map``: A :symbol:`bson_t` where keys are collection namespaces and values are encrypted fields documents. Supplying an ``encrypted_fields_map`` provides more security than relying on an ``encryptedFields`` obtained from the server. It protects against a malicious server advertising a false ``encryptedFields``. The schema map does not apply to collections encrypted with: `Queryable Encryption `_. See :symbol:`mongoc_auto_encryption_opts_set_schema_map()` instead. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_extra.rst000066400000000000000000000060761511661753600303360ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_extra mongoc_auto_encryption_opts_set_extra() ======================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_extra (mongoc_auto_encryption_opts_t *opts, const bson_t *extra); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``extra``: A :symbol:`bson_t` of additional options. ``extra`` is a :symbol:`bson_t` containing any of the following optional fields: * ``mongocryptdURI`` set to a URI to connect to the mongocryptd process (default is "mongodb://localhost:27020"). * ``mongocryptdBypassSpawn`` set to true to prevent the driver from spawning the mongocryptd process (default behavior is to spawn). * ``mongocryptdSpawnPath`` set to a path (with trailing slash) to search for mongocryptd (defaults to empty string and uses default system paths). * ``mongocryptdSpawnArgs`` set to an array of string arguments to pass to ``mongocryptd`` when spawning (defaults to ``[ "--idleShutdownTimeoutSecs=60" ]``). * ``cryptSharedLibPath`` - Set a filepath string referring to a ``crypt_shared`` library file. Unset by default. * If not set (the default), ``libmongocrypt`` will attempt to load ``crypt_shared`` using the host system's default dynamic-library-search system. * If set, the given path should identify the ``crypt_shared`` dynamic library file itself, not the directory that contains it. * If the given path is a relative path and the first path component is ``$ORIGIN``, the ``$ORIGIN`` component will be replaced with the absolute path to the directory containing the ``libmongocrypt`` library in use by the application. .. note:: No other ``RPATH``/``RUNPATH``-style substitutions are available. * If the given path is a relative path, the path will be resolved relative to the working directory of the operating system process. * If this option is set and ``libmongocrypt`` fails to load ``crypt_shared`` from the given filepath, ``libmongocrypt`` will fail to initialize and will not attempt to search for ``crypt_shared`` in any other locations. * ``cryptSharedLibRequired`` - If set to ``true``, and ``libmongocrypt`` fails to load a ``crypt_shared`` library, initialization of auto-encryption will fail immediately and will not attempt to spawn ``mongocryptd``. If set to ``false`` (the default), ``cryptSharedLibPath`` is not set, *and* ``libmongocrypt`` fails to load ``crypt_shared``, then ``libmongocrypt`` will proceed without ``crypt_shared`` and fall back to using ``mongocryptd``. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ | MongoDB Manual documentation for ``crypt_shared``: `Automatic Encryption Shared Library `_ | MongoDB Manual documentation for ``mongocryptd``: `Install and Configure mongocryptd `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_key_expiration.rst000066400000000000000000000012351511661753600322350ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_expiration mongoc_auto_encryption_opts_set_key_expiration() ======================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_key_expiration ( mongoc_auto_encryption_opts_t *opts, uint64_t cache_expiration_ms); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``cache_expiration_ms``: The data encryption key cache expiration time in milliseconds. Defaults to 60,000. 0 means "never expire". .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_client.rst000066400000000000000000000022671511661753600324130ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_client mongoc_auto_encryption_opts_set_keyvault_client() ================================================= Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_client ( mongoc_auto_encryption_opts_t *opts, mongoc_client_t *client); Set an optional separate :symbol:`mongoc_client_t` to use during key lookup for automatic encryption and decryption. Only applies to automatic encryption on a single-threaded :symbol:`mongoc_client_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_auto_encryption_opts_t`. * ``client``: A :symbol:`mongoc_client_t` to use for key queries. This client should *not* have automatic encryption enabled, as it will only execute ``find`` commands against the key vault collection to retrieve keys for automatic encryption and decryption. This ``client`` MUST outlive any :symbol:`mongoc_client_t` which has been enabled to use it through :symbol:`mongoc_client_enable_auto_encryption()`. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_auto_encryption_opts_set_keyvault_client_pool()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_client_pool.rst000066400000000000000000000024731511661753600334430ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_client_pool mongoc_auto_encryption_opts_set_keyvault_client_pool() ====================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_client_pool ( mongoc_auto_encryption_opts_t *opts, mongoc_client_pool_t *pool); Set an optional separate :symbol:`mongoc_client_pool_t` to use during key lookup for automatic encryption and decryption. Only applies to automatic encryption on a :symbol:`mongoc_client_pool_t`. It is invalid to set this for automatic encryption on a single-threaded :symbol:`mongoc_client_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_auto_encryption_opts_t`. * ``pool``: A :symbol:`mongoc_client_pool_t` to use for key queries. This client pool should *not* have automatic encryption enabled, as it will only execute ``find`` commands against the key vault collection to retrieve keys for automatic encryption and decryption. This ``pool`` MUST outlive any :symbol:`mongoc_client_pool_t` which has been enabled to use it through :symbol:`mongoc_client_pool_enable_auto_encryption()`. .. seealso:: | :symbol:`mongoc_client_pool_enable_auto_encryption()` | :symbol:`mongoc_auto_encryption_opts_set_keyvault_client()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_keyvault_namespace.rst000066400000000000000000000016241511661753600330650ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_key_vault_namespace mongoc_auto_encryption_opts_set_keyvault_namespace() ==================================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_keyvault_namespace ( mongoc_auto_encryption_opts_t *opts, const char *db, const char *coll); Set the database and collection name of the key vault. The key vault is the specially designated collection containing encrypted data keys for `In-Use Encryption `_. Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``db``: A ``const char *`` representing the database name of the key vault collection. * ``coll``: A ``const char *`` representing the collection name of the key vault collection. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongoc_auto_encryption_opts_set_kms_credential_provider_callback.rst000066400000000000000000000017541511661753600356440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_auto_encryption_opts_set_kms_credential_provider_callback mongoc_auto_encryption_opts_set_kms_credential_provider_callback() ================================================================== .. versionadded:: 1.23.0 Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_kms_credential_provider_callback( mongoc_auto_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); Set the user-provided callback to provide KMS credentials on-demand when they are needed. Parameters ---------- - ``opts`` - The options object to update. - ``fn`` - The provider callback to set on the options object. May be ``NULL`` to clear the callback. Refer to: :c:type:`mongoc_kms_credentials_provider_callback_fn` - ``userdata`` - An arbitrary pointer that will be passed along to the callback function when it is called by libmongoc. .. seealso:: :doc:`mongoc_client_encryption_opts_set_kms_credential_provider_callback` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_kms_providers.rst000066400000000000000000000050761511661753600321010ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_kms_providers mongoc_auto_encryption_opts_set_kms_providers() =============================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_kms_providers ( mongoc_auto_encryption_opts_t *opts, const bson_t *kms_providers); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``kms_providers``: A :symbol:`bson_t` containing configuration for an external Key Management Service (KMS). ``kms_providers`` is a BSON document containing configuration for each KMS provider. KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). At least one KMS provider must be specified. The format for the KMS provider type ``aws`` is as follows: .. code-block:: javascript aws: { accessKeyId: String, secretAccessKey: String } The format for the KMS provider type ``local`` is as follows: .. code-block:: javascript local: { key: <96 byte BSON binary of subtype 0> or String /* The master key used to encrypt/decrypt data keys. May be passed as a base64 encoded string. */ } The format for the KMS provider type ``azure`` is as follows: .. code-block:: javascript azure: { tenantId: String, clientId: String, clientSecret: String, identityPlatformEndpoint: Optional /* Defaults to login.microsoftonline.com */ } The format for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript gcp: { email: String, privateKey: byte[] or String, /* May be passed as a base64 encoded string. */ endpoint: Optional /* Defaults to oauth2.googleapis.com */ } The format for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript kmip: { endpoint: String } KMS providers may include an optional name suffix separate with a colon. This enables configuring multiple KMS providers with the same KMS provider type. Example: .. code-block:: javascript "aws:name1": { accessKeyId: String, secretAccessKey: String }, "aws:name2": { accessKeyId: String, secretAccessKey: String } .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_schema_map.rst000066400000000000000000000040351511661753600313010ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_schema_map mongoc_auto_encryption_opts_set_schema_map() ============================================ Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_schema_map (mongoc_auto_encryption_opts_t *opts, const bson_t *schema_map); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``schema_map``: A :symbol:`bson_t` where keys are collection namespaces and values are JSON schemas. Supplying a schema map provides more security than relying on JSON Schemas obtained from the server. It protects against a malicious server advertising a false JSON Schema, which could trick the client into sending unencrypted data that should be encrypted. Schemas supplied in the schema map only apply to configuring automatic encryption for `Client-Side Field Level Encryption `_. Other validation rules in the JSON schema will not be enforced by the driver and will result in an error. The following is an example of a schema map which configures automatic encryption for the collection ``db.coll``: .. code-block:: js { "db.coll": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } The schema map does not apply to collections encrypted with: `Queryable Encryption `_. Use :symbol:`mongoc_auto_encryption_opts_set_encrypted_fields_map()` instead. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_set_tls_opts.rst000066400000000000000000000031641511661753600310550ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_set_tls_opts mongoc_auto_encryption_opts_set_tls_opts() ========================================== Synopsis -------- .. code-block:: c void mongoc_auto_encryption_opts_set_tls_opts ( mongoc_auto_encryption_opts_t *opts, const bson_t *tls_opts); Parameters ---------- * ``opts``: The :symbol:`mongoc_auto_encryption_opts_t` * ``tls_opts``: A :symbol:`bson_t` mapping a Key Management Service (KMS) provider to a BSON document with TLS options. ``tls_opts`` is a BSON document of the following form: .. code-block:: javascript : { tlsCaFile: Optional tlsCertificateKeyFile: Optional tlsCertificateKeyFilePassword: Optional } The KMS providers ``aws``, ``azure``, ``gcp``, and ``kmip`` are supported as keys in the ``tls_opts`` document. They may include an optional name suffix separated with a colon. Example: ``aws:name2``. ``tls_opts`` maps the KMS provider name to a BSON document for TLS options. The BSON document for TLS options may contain the following keys: - ``MONGOC_URI_TLSCERTIFICATEKEYFILE`` - ``MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD`` - ``MONGOC_URI_TLSCAFILE`` .. literalinclude:: ../examples/client-side-encryption-doc-snippets.c :caption: Example use :start-after: BEGIN:mongoc_auto_encryption_opts_set_tls_opts :end-before: END:mongoc_auto_encryption_opts_set_tls_opts :dedent: 6 See `Configuring TLS `_ for a description of the behavior of these options. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_auto_encryption_opts_t.rst000066400000000000000000000022551511661753600265760ustar00rootroot00000000000000:man_page: mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t ============================= Options for enabling automatic encryption and decryption for `In-Use Encryption `_. Synopsis -------- .. code-block:: c typedef struct _mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t; .. seealso:: | `In-Use Encryption `_ .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_auto_encryption_opts_new mongoc_auto_encryption_opts_destroy mongoc_auto_encryption_opts_set_keyvault_client mongoc_auto_encryption_opts_set_keyvault_client_pool mongoc_auto_encryption_opts_set_keyvault_namespace mongoc_auto_encryption_opts_set_kms_providers mongoc_auto_encryption_opts_set_kms_credential_provider_callback mongoc_auto_encryption_opts_set_schema_map mongoc_auto_encryption_opts_set_bypass_auto_encryption mongoc_auto_encryption_opts_set_extra mongoc_auto_encryption_opts_set_tls_opts mongoc_auto_encryption_opts_set_encrypted_fields_map mongoc_auto_encryption_opts_set_bypass_query_analysis mongoc_auto_encryption_opts_set_key_expiration mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_destroy.rst000066400000000000000000000006141511661753600265470ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_destroy mongoc_bulk_operation_destroy() =============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_destroy (mongoc_bulk_operation_t *bulk); Destroys a :symbol:`mongoc_bulk_operation_t` and frees the structure. Does nothing if ``bulk`` is NULL. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_execute.rst000066400000000000000000000034621511661753600265240ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_execute mongoc_bulk_operation_execute() =============================== Synopsis -------- .. code-block:: c uint32_t mongoc_bulk_operation_execute (mongoc_bulk_operation_t *bulk, bson_t *reply, bson_error_t *error); This function executes all operations queued into the bulk operation. Unless ``ordered: false`` was specified in the ``opts`` passed to :symbol:`mongoc_collection_create_bulk_operation_with_opts()`, then forward progress will be stopped upon the first error. It is only valid to call :symbol:`mongoc_bulk_operation_execute()` once on the same :symbol:`mongoc_bulk_operation_t`. Calling repeatedly results in error. Call :symbol:`mongoc_bulk_operation_destroy` to destroy ``bulk`` afterwards. .. versionchanged:: 2.0.0 Calling :symbol:`mongoc_bulk_operation_execute()` repeatedly results in an error. .. warning:: ``reply`` is always initialized, even upon failure. Callers *must* call :symbol:`bson:bson_destroy()` to release this potential allocation. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- On success, returns the server id used. On failure, returns 0 and sets ``error``. A write concern timeout or write concern error is considered a failure. The ``reply`` document counts operations and collects error information. See `Bulk Write Operations `_ for examples. .. seealso:: | `Bulk Write Operations `_ | :symbol:`mongoc_bulk_operation_get_server_id`, which gets the id of the server used even if the operation failed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_get_server_id.rst000066400000000000000000000013701511661753600276770ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_get_server_id mongoc_bulk_operation_get_server_id() ===================================== Synopsis -------- .. code-block:: c uint32_t mongoc_bulk_operation_get_server_id (const mongoc_bulk_operation_t *bulk); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. Description ----------- Retrieves the opaque id of the server used for the operation. This number is zero until the driver actually uses a server in :symbol:`mongoc_bulk_operation_execute`. The server id is the same number as the return value of a successful :symbol:`mongoc_bulk_operation_execute`, so ``mongoc_bulk_operation_get_server_id`` is useful mainly in case :symbol:`mongoc_bulk_operation_execute` fails and returns zero. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_get_write_concern.rst000066400000000000000000000010231511661753600305510ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_get_write_concern mongoc_bulk_operation_get_write_concern() ========================================= Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_bulk_operation_get_write_concern (const mongoc_bulk_operation_t *bulk); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. Description ----------- Fetches the write concern to be used for ``bulk``. Returns ------- A :symbol:`mongoc_write_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_insert.rst000066400000000000000000000013611511661753600263620ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_insert mongoc_bulk_operation_insert() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_insert (mongoc_bulk_operation_t *bulk, const bson_t *document); Queue an insert of a single document into a bulk operation. The insert is not performed until :symbol:`mongoc_bulk_operation_execute()` is called. This function is superseded by :symbol:`mongoc_bulk_operation_insert_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``document``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | `Bulk Write Operations `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_insert_with_opts.rst000066400000000000000000000021071511661753600304610ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_insert_with_opts mongoc_bulk_operation_insert_with_opts() ======================================== Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_insert_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ Queue an insert of a single document into a bulk operation. The insert is not performed until :symbol:`mongoc_bulk_operation_execute()` is called. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``document``: A :symbol:`bson:bson_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-insert-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_remove.rst000066400000000000000000000016601511661753600263550ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove mongoc_bulk_operation_remove() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_remove (mongoc_bulk_operation_t *bulk, const bson_t *selector); Remove documents as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_remove_one_with_opts()` and :symbol:`mongoc_bulk_operation_remove_many_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t`. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one()` | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_remove_many_with_opts.rst000066400000000000000000000024101511661753600314730ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_many_with_opts mongoc_bulk_operation_remove_many_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_remove_many_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ Delete documents as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-remove-many-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove()` | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_remove_one.rst000066400000000000000000000016041511661753600272140ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_one mongoc_bulk_operation_remove_one() ================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_remove_one (mongoc_bulk_operation_t *bulk, const bson_t *selector); Remove a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_remove_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one_with_opts()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_remove_one_with_opts.rst000066400000000000000000000024151511661753600313150ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_remove_one_with_opts mongoc_bulk_operation_remove_one_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_remove_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ Remove a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/bulk-remove-one-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_one()` | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_replace_one.rst000066400000000000000000000022351511661753600273330ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_replace_one mongoc_bulk_operation_replace_one() =================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_replace_one (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); Replace a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_replace_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the replacement document. * ``upsert``: ``true`` if this should be an ``upsert``. .. warning:: ``document`` may not contain fields with keys containing ``.`` or ``$``. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_replace_one_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_replace_one_with_opts.rst000066400000000000000000000027711511661753600314400ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_replace_one_with_opts mongoc_bulk_operation_replace_one_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_replace_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ Replace a single document as part of a bulk operation. This only queues the operation. To execute it, call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the replacement document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-replace-one-opts.txt .. warning:: ``document`` may not contain fields with keys containing ``.`` or ``$``. Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_remove_many_with_opts()` | :symbol:`mongoc_bulk_operation_insert()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_set_bypass_document_validation.rst000066400000000000000000000012371511661753600333440ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_bypass_document_validation mongoc_bulk_operation_set_bypass_document_validation() ====================================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_bypass_document_validation ( mongoc_bulk_operation_t *bulk, bool bypass); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``bypass``: A boolean. Description ----------- Will bypass document validation for all operations part of this :doc:`bulk `. .. seealso:: | `Bulk Operation Bypassing Document Validation `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_set_client_session.rst000066400000000000000000000012741511661753600307550ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_client_session mongoc_bulk_operation_set_client_session() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_client_session ( mongoc_bulk_operation_t *bulk, mongoc_client_session_t *client_session); Sets an explicit client session to use for the bulk operation. It is an error to use a session for unacknowledged writes. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``client_session``: A :symbol:`mongoc_client_session_t`. Must be derived from the same :symbol:`mongoc_client_t` as ``bulk``. .. seealso:: | :symbol:`mongoc_client_start_session()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_set_comment.rst000066400000000000000000000014731511661753600273770ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_comment mongoc_bulk_operation_set_comment() =================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_comment ( mongoc_bulk_operation_t *bulk, const bson_value_t *comment); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``comment``: A :symbol:`bson_value_t` specifying the comment to associate with this bulk write. Description ----------- Assigns a comment to attach to all commands executed as part of this :doc:`bulk `. The comment will appear in log messages, profiler output, and currentOp output. Comments for write commands are only supported by MongoDB 4.4+. It is prohibited to call this function after adding operations to the :doc:`bulk `. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_set_let.rst000066400000000000000000000013641511661753600265200ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_let mongoc_bulk_operation_set_let() =============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_let ( mongoc_bulk_operation_t *bulk, const bson_t *let); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``let``: A BSON document consisting of any number of parameter names, each followed by definitions of constants in the MQL Aggregate Expression language. Description ----------- Defines constants that can be accessed by all update, replace, and delete operations executed as part of this :doc:`bulk `. It is prohibited to call this function after adding operations to the :doc:`bulk `. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_set_server_id.rst000066400000000000000000000014371511661753600277170ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_set_server_id mongoc_bulk_operation_set_server_id() ===================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_set_server_id (mongoc_bulk_operation_t *bulk, uint32_t server_id); Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``server_id``: An opaque id identifying the server to use. Description ----------- Specifies which server to use for the operation. This function has an effect only if called before :symbol:`mongoc_bulk_operation_execute`. Use ``mongoc_bulk_operation_set_server_id`` only for building a language driver that wraps the C Driver. When writing applications in C, leave the server id unset and allow the driver to choose a suitable server for the bulk operation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_t.rst000066400000000000000000000033521511661753600253230ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_t mongoc_bulk_operation_t ======================= Bulk Write Operations Synopsis -------- .. code-block:: c typedef struct _mongoc_bulk_operation_t mongoc_bulk_operation_t; Description ----------- :symbol:`mongoc_bulk_operation_t` provides an abstraction for submitting multiple write operations as a single batch. After adding all of the write operations to the :symbol:`mongoc_bulk_operation_t`, call :symbol:`mongoc_bulk_operation_execute()` to execute the operation. .. warning:: It is only valid to call :symbol:`mongoc_bulk_operation_execute()` once. The ``mongoc_bulk_operation_t`` must be destroyed afterwards. .. seealso:: | `Bulk Write Operations `_ | :symbol:`mongoc_bulkwrite_t` .. note:: .. include:: includes/bulkwrite-vs-bulk_operation.txt .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulk_operation_destroy mongoc_bulk_operation_execute mongoc_bulk_operation_get_server_id mongoc_bulk_operation_get_write_concern mongoc_bulk_operation_insert mongoc_bulk_operation_insert_with_opts mongoc_bulk_operation_remove mongoc_bulk_operation_remove_many_with_opts mongoc_bulk_operation_remove_one mongoc_bulk_operation_remove_one_with_opts mongoc_bulk_operation_replace_one mongoc_bulk_operation_replace_one_with_opts mongoc_bulk_operation_set_bypass_document_validation mongoc_bulk_operation_set_client_session mongoc_bulk_operation_set_comment mongoc_bulk_operation_set_server_id mongoc_bulk_operation_set_let mongoc_bulk_operation_update mongoc_bulk_operation_update_many_with_opts mongoc_bulk_operation_update_one mongoc_bulk_operation_update_one_with_opts mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_update.rst000066400000000000000000000024751511661753600263470ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update mongoc_bulk_operation_update() ============================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_update (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); This function queues an update as part of a bulk operation. This does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. ``document`` MUST only contain fields whose key starts with ``$``. See the update document specification for more details. This function is superseded by :symbol:`mongoc_bulk_operation_update_one_with_opts()` and :symbol:`mongoc_bulk_operation_update_many_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which documents to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``upsert``: ``true`` if an ``upsert`` should be performed. Errors ------ Errors are propagated via :symbol:`mongoc_bulk_operation_execute()`. .. seealso:: | :symbol:`mongoc_bulk_operation_update_one_with_opts()` | :symbol:`mongoc_bulk_operation_update_many_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_update_many_with_opts.rst000066400000000000000000000031121511661753600314600ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_many_with_opts mongoc_bulk_operation_update_many_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_update_many_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ This function queues an update as part of a bulk operation. This does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. .. warning:: ``document`` MUST only contain fields whose key starts with ``$``. See the update document specification for more details. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which documents to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-update-many-opts.txt Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if there is a server or network error or if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_update_one_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_update_one.rst000066400000000000000000000024201511661753600271760ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_one mongoc_bulk_operation_update_one() ================================== Synopsis -------- .. code-block:: c void mongoc_bulk_operation_update_one (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); This function queues an update as part of a bulk operation. It will only modify a single document on the MongoDB server. This function does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. This function is superseded by :symbol:`mongoc_bulk_operation_update_one_with_opts()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``upsert``: ``true`` if an ``upsert`` should be performed. .. warning:: ``document`` *must only* contain fields whose key starts with ``$``. See the update document specification for more details. .. seealso:: | :symbol:`mongoc_bulk_operation_update()` | :symbol:`mongoc_bulk_operation_update_one_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulk_operation_update_one_with_opts.rst000066400000000000000000000032111511661753600312750ustar00rootroot00000000000000:man_page: mongoc_bulk_operation_update_one_with_opts mongoc_bulk_operation_update_one_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_bulk_operation_update_one_with_opts (mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ This function queues an update as part of a bulk operation. It will only modify a single document on the MongoDB server. This function does not execute the operation. To execute the entirety of the bulk operation call :symbol:`mongoc_bulk_operation_execute()`. Parameters ---------- * ``bulk``: A :symbol:`mongoc_bulk_operation_t`. * ``selector``: A :symbol:`bson:bson_t` that selects which document to remove. * ``document``: A :symbol:`bson:bson_t` containing the update document. * ``error``: A :symbol:`bson:bson_error_t` any errors that may have occurred. .. include:: includes/bulk-update-one-opts.txt .. warning:: ``document`` *must only* contain fields whose key starts with ``$``. See the update document specification for more details. Errors ------ Operation errors are propagated via :symbol:`mongoc_bulk_operation_execute()`, while argument validation errors are reported by the ``error`` argument. Returns ------- Returns true on success, and false if there is a server or network error or if passed invalid arguments. .. seealso:: | :symbol:`mongoc_bulk_operation_update_many_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_deletemany.rst000066400000000000000000000012441511661753600275270ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_deletemany mongoc_bulkwrite_append_deletemany() ==================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_deletemany (mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deletemanyopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a multi-document delete into the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_deleteone.rst000066400000000000000000000012341511661753600273430ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_deleteone mongoc_bulkwrite_append_deleteone() =================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_deleteone (mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deleteoneopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a single-document delete into the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_insertone.rst000066400000000000000000000012321511661753600274030ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_insertone mongoc_bulkwrite_append_insertone() =================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_insertone (mongoc_bulkwrite_t *self, const char *ns, const bson_t *document, const mongoc_bulkwrite_insertoneopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a document to insert into the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_replaceone.rst000066400000000000000000000013411511661753600275130ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_replaceone mongoc_bulkwrite_append_replaceone() ==================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_replaceone (mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *replacement, const mongoc_bulkwrite_replaceoneopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a replace operation for the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_updatemany.rst000066400000000000000000000013401511661753600275440ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_updatemany mongoc_bulkwrite_append_updatemany() ==================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_updatemany (mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updatemanyopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a multi-document update for the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_append_updateone.rst000066400000000000000000000013271511661753600273660ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_append_updateone mongoc_bulkwrite_append_updateone() =================================== Synopsis -------- .. code-block:: c bool mongoc_bulkwrite_append_updateone (mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updateoneopts_t *opts /* May be NULL */, bson_error_t *error); Description ----------- Adds a single-document update for the namespace ``ns``. Returns true on success. Returns false and sets ``error`` if an error occurred. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_check_acknowledged.rst000066400000000000000000000011031511661753600276270ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_check_acknowledged mongoc_bulkwrite_check_acknowledged() ===================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_check_acknowledged_t mongoc_bulkwrite_check_acknowledged (const mongoc_bulkwrite_t * self, bson_error_t * error); Description ----------- Checks whether or not the previous call to :symbol:`mongoc_bulkwrite_execute` used an acknowledged write concern. If an error occurred, the ``is_ok`` member of :symbol:`mongoc_bulkwrite_check_acknowledged_t` will be ``false`` and ``error`` will be set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_check_acknowledged_t.rst000066400000000000000000000014651511661753600301650ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_check_acknowledged_t mongoc_bulkwrite_check_acknowledged_t ===================================== Synopsis -------- .. code-block:: c typedef struct { bool is_ok; // true if no error bool is_acknowledged; // true if the previous call to `mongoc_bulkwrite_execute` used an acknowledged write concern } mongoc_bulkwrite_check_acknowledged_t; Description ----------- :symbol:`mongoc_bulkwrite_check_acknowledged_t` is returned by :symbol:`mongoc_bulkwrite_check_acknowledged`. ``is_ok`` is ``false`` if there was no previous call to :symbol:`mongoc_bulkwrite_execute` or if execution failed before the write concern could be determined. ``is_acknowledged`` is ``true`` if the previous :symbol:`mongoc_bulkwrite_execute` call used an acknowledged write concern. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deletemanyopts_destroy.rst000066400000000000000000000005341511661753600306600ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deletemanyopts_destroy mongoc_bulkwrite_deletemanyopts_destroy() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deletemanyopts_destroy (mongoc_bulkwrite_deletemanyopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_deletemanyopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deletemanyopts_new.rst000066400000000000000000000005201511661753600277530ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deletemanyopts_new mongoc_bulkwrite_deletemanyopts_new() ===================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_deletemanyopts_t * mongoc_bulkwrite_deletemanyopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_deletemanyopts_new`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deletemanyopts_set_collation.rst000066400000000000000000000005571511661753600320330ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deletemanyopts_set_collation mongoc_bulkwrite_deletemanyopts_set_collation() =============================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deletemanyopts_set_collation (mongoc_bulkwrite_deletemanyopts_t *self, const bson_t *collation); Description ----------- Specifies a collation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deletemanyopts_set_hint.rst000066400000000000000000000007721511661753600310100ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deletemanyopts_set_hint mongoc_bulkwrite_deletemanyopts_set_hint() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deletemanyopts_set_hint (mongoc_bulkwrite_deletemanyopts_t *self, const bson_value_t *hint); Description ----------- Specifies the index to use. Specify either the index name as a string or the index key pattern. If specified, then the query system will only consider plans using the hinted index. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deletemanyopts_t.rst000066400000000000000000000007771511661753600274430ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deletemanyopts_t mongoc_bulkwrite_deletemanyopts_t ================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_deletemanyopts_t mongoc_bulkwrite_deletemanyopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_deletemanyopts_new mongoc_bulkwrite_deletemanyopts_destroy mongoc_bulkwrite_deletemanyopts_set_collation mongoc_bulkwrite_deletemanyopts_set_hint mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deleteoneopts_destroy.rst000066400000000000000000000005261511661753600304760ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deleteoneopts_destroy mongoc_bulkwrite_deleteoneopts_destroy() ======================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deleteoneopts_destroy (mongoc_bulkwrite_deleteoneopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_deleteoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deleteoneopts_new.rst000066400000000000000000000005101511661753600275670ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deleteoneopts_new mongoc_bulkwrite_deleteoneopts_new() ==================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_deleteoneopts_t * mongoc_bulkwrite_deleteoneopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_deleteoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deleteoneopts_set_collation.rst000066400000000000000000000005521511661753600316430ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deleteoneopts_set_collation mongoc_bulkwrite_deleteoneopts_set_collation() ============================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deleteoneopts_set_collation (mongoc_bulkwrite_deleteoneopts_t *self, const bson_t *collation); Description ----------- Specifies a collation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deleteoneopts_set_hint.rst000066400000000000000000000007651511661753600306270ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deleteoneopts_set_hint mongoc_bulkwrite_deleteoneopts_set_hint() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_deleteoneopts_set_hint (mongoc_bulkwrite_deleteoneopts_t *self, const bson_value_t *hint); Description ----------- Specifies the index to use. Specify either the index name as a string or the index key pattern. If specified, then the query system will only consider plans using the hinted index. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_deleteoneopts_t.rst000066400000000000000000000007661511661753600272560ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_deleteoneopts_t mongoc_bulkwrite_deleteoneopts_t ================================ Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_deleteoneopts_t mongoc_bulkwrite_deleteoneopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_deleteoneopts_new mongoc_bulkwrite_deleteoneopts_destroy mongoc_bulkwrite_deleteoneopts_set_collation mongoc_bulkwrite_deleteoneopts_set_hint mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_destroy.rst000066400000000000000000000004021511661753600255350ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_destroy mongoc_bulkwrite_destroy() ========================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_destroy (mongoc_bulkwrite_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_execute.rst000066400000000000000000000010071511661753600255100ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_execute mongoc_bulkwrite_execute() ========================== Synopsis -------- .. code-block:: c mongoc_bulkwritereturn_t mongoc_bulkwrite_execute (mongoc_bulkwrite_t *self, const mongoc_bulkwriteopts_t *opts); Description ----------- Executes a :symbol:`mongoc_bulkwrite_t`. Once executed, it is an error to call other functions on ``self``, aside from :symbol:`mongoc_bulkwrite_check_acknowledged`, :symbol:`mongoc_bulkwrite_serverid`, and :symbol:`mongoc_bulkwrite_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_insertoneopts_destroy.rst000066400000000000000000000005261511661753600305400ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_insertoneopts_destroy mongoc_bulkwrite_insertoneopts_destroy() ======================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_insertoneopts_destroy (mongoc_bulkwrite_insertoneopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_insertoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_insertoneopts_new.rst000066400000000000000000000006041511661753600276350ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_insertoneopts_new mongoc_bulkwrite_insertoneopts_new() ==================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_insertoneopts_t * mongoc_bulkwrite_insertoneopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_insertoneopts_t`. Free with :symbol:`mongoc_bulkwrite_insertoneopts_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_insertoneopts_t.rst000066400000000000000000000006311511661753600273070ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_insertoneopts_t mongoc_bulkwrite_insertoneopts_t ================================ Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_insertoneopts_t mongoc_bulkwrite_insertoneopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_insertoneopts_new mongoc_bulkwrite_insertoneopts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_new.rst000066400000000000000000000006001511661753600246350ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_new mongoc_bulkwrite_new() ====================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_t * mongoc_bulkwrite_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_t`. Free with :symbol:`mongoc_bulkwrite_destroy()`. A client must be assigned with :symbol:`mongoc_bulkwrite_set_client()` prior to execution. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_destroy.rst000066400000000000000000000005341511661753600306460ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_destroy mongoc_bulkwrite_replaceoneopts_destroy() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_replaceoneopts_destroy (mongoc_bulkwrite_replaceoneopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_replaceoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_new.rst000066400000000000000000000005161511661753600277460ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_new mongoc_bulkwrite_replaceoneopts_new() ===================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_replaceoneopts_t * mongoc_bulkwrite_replaceoneopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_replaceoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_set_collation.rst000066400000000000000000000005571511661753600320210ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_set_collation mongoc_bulkwrite_replaceoneopts_set_collation() =============================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_replaceoneopts_set_collation (mongoc_bulkwrite_replaceoneopts_t *self, const bson_t *collation); Description ----------- Specifies a collation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_set_hint.rst000066400000000000000000000007721511661753600307760ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_set_hint mongoc_bulkwrite_replaceoneopts_set_hint() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_replaceoneopts_set_hint (mongoc_bulkwrite_replaceoneopts_t *self, const bson_value_t *hint); Description ----------- Specifies the index to use. Specify either the index name as a string or the index key pattern. If specified, then the query system will only consider plans using the hinted index. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_set_sort.rst000066400000000000000000000010101511661753600310050ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_set_sort mongoc_bulkwrite_replaceoneopts_set_sort() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_replaceoneopts_set_sort (mongoc_bulkwrite_replaceoneopts_t *self, bson_t* sort); Description ----------- ``sort`` specifies a sorting order if the query matches multiple documents. The first document matched by the sort order will be replaced. This option is only sent if the caller explicitly provides a value. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_set_upsert.rst000066400000000000000000000007701511661753600313540ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_set_upsert mongoc_bulkwrite_replaceoneopts_set_upsert() ============================================ Synopsis -------- .. code-block:: c void mongoc_bulkwrite_replaceoneopts_set_upsert (mongoc_bulkwrite_replaceoneopts_t *self, bool upsert); Description ----------- If ``upsert`` is true, creates a new document if no document matches the query. The ``upsert`` option is not sent if this function is not called. The server's default value is false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_replaceoneopts_t.rst000066400000000000000000000011331511661753600274140ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_replaceoneopts_t mongoc_bulkwrite_replaceoneopts_t ================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_replaceoneopts_t mongoc_bulkwrite_replaceoneopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_replaceoneopts_new mongoc_bulkwrite_replaceoneopts_set_collation mongoc_bulkwrite_replaceoneopts_set_hint mongoc_bulkwrite_replaceoneopts_set_upsert mongoc_bulkwrite_replaceoneopts_set_sort mongoc_bulkwrite_replaceoneopts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_serverid.rst000066400000000000000000000007561511661753600257030ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_serverid mongoc_bulkwrite_serverid() =========================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_serverid_t mongoc_bulkwrite_serverid (const mongoc_bulkwrite_t * self, bson_error_t * error); Description ----------- Gets the server ID last used in the previous call to :symbol:`mongoc_bulkwrite_execute`. If an error occurred, the ``is_ok`` member of :symbol:`mongoc_bulkwrite_serverid_t` will be ``false`` and ``error`` will be set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_serverid_t.rst000066400000000000000000000011641511661753600262200ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_serverid_t mongoc_bulkwrite_serverid_t =========================== Synopsis -------- .. code-block:: c typedef struct { bool is_ok; // true if no error uint32_t serverid; // the server ID last used in `mongoc_bulkwrite_execute` } mongoc_bulkwrite_serverid_t; Description ----------- :symbol:`mongoc_bulkwrite_serverid_t` is returned by :symbol:`mongoc_bulkwrite_serverid`. ``is_ok`` is ``false`` if there was no previous call to :symbol:`mongoc_bulkwrite_execute` or if execution failed. ``serverid`` is the server ID last used in :symbol:`mongoc_bulkwrite_execute`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_set_client.rst000066400000000000000000000005201511661753600261760ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_set_client mongoc_bulkwrite_set_client() ============================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_set_client (mongoc_bulkwrite_t *self, mongoc_client_t *client); Description ----------- Sets the client that will be used to execute the :symbol:`mongoc_bulkwrite_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_set_session.rst000066400000000000000000000004501511661753600264050ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_set_session mongoc_bulkwrite_set_session() ============================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_set_session (mongoc_bulkwrite_t *self, mongoc_client_session_t *session); Description ----------- Sets an explicit session. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_t.rst000066400000000000000000000026551511661753600243230ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_t mongoc_bulkwrite_t ================== Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_t mongoc_bulkwrite_t; Description ----------- :symbol:`mongoc_bulkwrite_t` provides an abstraction for submitting multiple write operations as a single batch. After adding all of the write operations to the :symbol:`mongoc_bulkwrite_t`, call :symbol:`mongoc_bulkwrite_execute()` to execute the operation. .. warning:: It is only valid to call :symbol:`mongoc_bulkwrite_execute()` once. The :symbol:`mongoc_bulkwrite_t` must be destroyed afterwards. .. note:: .. include:: includes/bulkwrite-vs-bulk_operation.txt .. only:: html API --- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_insertoneopts_t mongoc_bulkwrite_append_insertone mongoc_bulkwrite_updateoneopts_t mongoc_bulkwrite_append_updateone mongoc_bulkwrite_updatemanyopts_t mongoc_bulkwrite_append_updatemany mongoc_bulkwrite_replaceoneopts_t mongoc_bulkwrite_append_replaceone mongoc_bulkwrite_deleteoneopts_t mongoc_bulkwrite_append_deleteone mongoc_bulkwrite_deletemanyopts_t mongoc_bulkwrite_append_deletemany mongoc_bulkwritereturn_t mongoc_bulkwrite_new mongoc_bulkwrite_set_client mongoc_bulkwrite_set_session mongoc_bulkwrite_execute mongoc_bulkwrite_check_acknowledged mongoc_bulkwrite_serverid mongoc_bulkwrite_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_destroy.rst000066400000000000000000000005341511661753600307000ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_destroy mongoc_bulkwrite_updatemanyopts_destroy() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updatemanyopts_destroy (mongoc_bulkwrite_updatemanyopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_updatemanyopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_new.rst000066400000000000000000000005161511661753600300000ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_new mongoc_bulkwrite_updatemanyopts_new() ===================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_updatemanyopts_t * mongoc_bulkwrite_updatemanyopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_updatemanyopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_set_arrayfilters.rst000066400000000000000000000006701511661753600325720ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_set_arrayfilters mongoc_bulkwrite_updatemanyopts_set_arrayfilters() ================================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updatemanyopts_set_arrayfilters (mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *arrayfilters); Description ----------- Sets a set of filters specifying to which array elements an update should apply. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_set_collation.rst000066400000000000000000000005571511661753600320530ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_set_collation mongoc_bulkwrite_updatemanyopts_set_collation() =============================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updatemanyopts_set_collation (mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *collation); Description ----------- Specifies a collation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_set_hint.rst000066400000000000000000000007721511661753600310300ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_set_hint mongoc_bulkwrite_updatemanyopts_set_hint() ========================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updatemanyopts_set_hint (mongoc_bulkwrite_updatemanyopts_t *self, const bson_value_t *hint); Description ----------- Specifies the index to use. Specify either the index name as a string or the index key pattern. If specified, then the query system will only consider plans using the hinted index. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_set_upsert.rst000066400000000000000000000007701511661753600314060ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_set_upsert mongoc_bulkwrite_updatemanyopts_set_upsert() ============================================ Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updatemanyopts_set_upsert (mongoc_bulkwrite_updatemanyopts_t *self, bool upsert); Description ----------- If ``upsert`` is true, creates a new document if no document matches the query. The ``upsert`` option is not sent if this function is not called. The server's default value is false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updatemanyopts_t.rst000066400000000000000000000011431511661753600274470ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updatemanyopts_t mongoc_bulkwrite_updatemanyopts_t ================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_updatemanyopts_t mongoc_bulkwrite_updatemanyopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_updatemanyopts_new mongoc_bulkwrite_updatemanyopts_set_arrayfilters mongoc_bulkwrite_updatemanyopts_set_collation mongoc_bulkwrite_updatemanyopts_set_hint mongoc_bulkwrite_updatemanyopts_set_upsert mongoc_bulkwrite_updatemanyopts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_destroy.rst000066400000000000000000000005261511661753600305160ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_destroy mongoc_bulkwrite_updateoneopts_destroy() ======================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_destroy (mongoc_bulkwrite_updateoneopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwrite_updateoneopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_new.rst000066400000000000000000000006041511661753600276130ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_new mongoc_bulkwrite_updateoneopts_new() ==================================== Synopsis -------- .. code-block:: c mongoc_bulkwrite_updateoneopts_t * mongoc_bulkwrite_updateoneopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_updateoneopts_t`. Free with :symbol:`mongoc_bulkwrite_updateoneopts_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_set_arrayfilters.rst000066400000000000000000000006631511661753600324110ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_set_arrayfilters mongoc_bulkwrite_updateoneopts_set_arrayfilters() ================================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_set_arrayfilters (mongoc_bulkwrite_updateoneopts_t *self, const bson_t *arrayfilters); Description ----------- Sets a set of filters specifying to which array elements an update should apply. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_set_collation.rst000066400000000000000000000005521511661753600316630ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_set_collation mongoc_bulkwrite_updateoneopts_set_collation() ============================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_set_collation (mongoc_bulkwrite_updateoneopts_t *self, const bson_t *collation); Description ----------- Specifies a collation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_set_hint.rst000066400000000000000000000007651511661753600306470ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_set_hint mongoc_bulkwrite_updateoneopts_set_hint() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_set_hint (mongoc_bulkwrite_updateoneopts_t *self, const bson_value_t *hint); Description ----------- Specifies the index to use. Specify either the index name as a string or the index key pattern. If specified, then the query system will only consider plans using the hinted index. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_set_sort.rst000066400000000000000000000010021511661753600306550ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_set_sort mongoc_bulkwrite_updateoneopts_set_sort() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_set_sort (mongoc_bulkwrite_updateoneopts_t *self, bson_t* sort); Description ----------- ``sort`` specifies a sorting order if the query matches multiple documents. The first document matched by the sort order will be updated. This option is only sent if the caller explicitly provides a value. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_set_upsert.rst000066400000000000000000000007631511661753600312250ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_set_upsert mongoc_bulkwrite_updateoneopts_set_upsert() =========================================== Synopsis -------- .. code-block:: c void mongoc_bulkwrite_updateoneopts_set_upsert (mongoc_bulkwrite_updateoneopts_t *self, bool upsert); Description ----------- If ``upsert`` is true, creates a new document if no document matches the query. The ``upsert`` option is not sent if this function is not called. The server's default value is false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwrite_updateoneopts_t.rst000066400000000000000000000012041511661753600272620ustar00rootroot00000000000000:man_page: mongoc_bulkwrite_updateoneopts_t mongoc_bulkwrite_updateoneopts_t ================================ Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwrite_updateoneopts_t mongoc_bulkwrite_updateoneopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwrite_updateoneopts_new mongoc_bulkwrite_updateoneopts_set_arrayfilters mongoc_bulkwrite_updateoneopts_set_collation mongoc_bulkwrite_updateoneopts_set_hint mongoc_bulkwrite_updateoneopts_set_upsert mongoc_bulkwrite_updateoneopts_set_sort mongoc_bulkwrite_updateoneopts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_destroy.rst000066400000000000000000000004701511661753600274610ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_destroy mongoc_bulkwriteexception_destroy() =================================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteexception_destroy (mongoc_bulkwriteexception_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwriteexception_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_error.rst000066400000000000000000000006131511661753600271200ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_error mongoc_bulkwriteexception_error() ================================= Synopsis -------- .. code-block:: c bool mongoc_bulkwriteexception_error (const mongoc_bulkwriteexception_t *self, bson_error_t *error); Description ----------- Returns true and sets ``error`` if there was a top-level error. Returns false if there was no top-level error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_errorreply.rst000066400000000000000000000005611511661753600301760ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_errorreply mongoc_bulkwriteexception_errorreply() ====================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteexception_errorreply (const mongoc_bulkwriteexception_t *self); Description ----------- Returns a possible server reply related to the error, or an empty document. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_t.rst000066400000000000000000000007741511661753600262420ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_t mongoc_bulkwriteexception_t =========================== Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwriteexception_t mongoc_bulkwriteexception_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwriteexception_error mongoc_bulkwriteexception_writeerrors mongoc_bulkwriteexception_writeconcernerrors mongoc_bulkwriteexception_errorreply mongoc_bulkwriteexception_destroymongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_writeconcernerrors.rst000066400000000000000000000011161511661753600317250ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_writeconcernerrors mongoc_bulkwriteexception_writeconcernerrors() ============================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteexception_writeconcernerrors (const mongoc_bulkwriteexception_t *self); Description ----------- Returns a BSON array of write concern errors. Example: .. code:: json [ { "code" : 123, "message" : "foo", "details" : { } }, { "code" : 456, "message" : "bar", "details" : { } } ] Returns an empty array if there are no write concern errors. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteexception_writeerrors.rst000066400000000000000000000011101511661753600303470ustar00rootroot00000000000000:man_page: mongoc_bulkwriteexception_writeerrors mongoc_bulkwriteexception_writeerrors() ======================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteexception_writeerrors (const mongoc_bulkwriteexception_t *self); Description ----------- Returns a BSON document mapping model indexes to write errors. Example: .. code:: json { "0" : { "code" : 123, "message" : "foo", "details" : { } }, "1" : { "code" : 456, "message" : "bar", "details" : { } } } Returns an empty document if there are no write errors. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_destroy.rst000066400000000000000000000004321511661753600264460ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_destroy mongoc_bulkwriteopts_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_destroy (mongoc_bulkwriteopts_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwriteopts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_new.rst000066400000000000000000000004751511661753600255550ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_new mongoc_bulkwriteopts_new() ========================== Synopsis -------- .. code-block:: c mongoc_bulkwriteopts_t * mongoc_bulkwriteopts_new (void); Description ----------- Returns a new :symbol:`mongoc_bulkwriteopts_t`. Free with :symbol:`mongoc_bulkwriteopts_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_bypassdocumentvalidation.rst000066400000000000000000000011361511661753600327450ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_bypassdocumentvalidation mongoc_bulkwriteopts_set_bypassdocumentvalidation() =================================================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_bypassdocumentvalidation (mongoc_bulkwriteopts_t *self, bool bypassdocumentvalidation); Description ----------- If ``bypassdocumentvalidation`` is true, allows the writes to opt out of document-level validation. This option is only sent to the server if :symbol:`mongoc_bulkwriteopts_set_bypassdocumentvalidation` is called. The server's default value is false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_comment.rst000066400000000000000000000006321511661753600272740ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_comment mongoc_bulkwriteopts_set_comment() ================================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_comment (mongoc_bulkwriteopts_t *self, const bson_value_t *comment); Description ----------- Enables users to specify an arbitrary comment to help trace the operation through the database profiler, currentOp and logs. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_extra.rst000066400000000000000000000007311511661753600267550ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_extra mongoc_bulkwriteopts_set_extra() ================================ Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_extra (mongoc_bulkwriteopts_t *self, const bson_t *extra); Description ----------- Appends all fields in ``extra`` to the outgoing ``bulkWrite`` command. Intended to support future server options. Prefer other ``mongoc_bulkwriteopts_set_*`` helpers to avoid unexpected option conflicts. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_let.rst000066400000000000000000000010321511661753600264110ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_let mongoc_bulkwriteopts_set_let() ============================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_let (mongoc_bulkwriteopts_t *self, const bson_t *let); Description ----------- ``let`` is a map of parameter names and values to apply to all operations within the bulk write. Value must be constant or closed expressions that do not reference document fields. Parameters can then be accessed as variables in an aggregate expression context (e.g. "$$var"). mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_ordered.rst000066400000000000000000000010761511661753600272610ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_ordered mongoc_bulkwriteopts_set_ordered() ================================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_ordered (mongoc_bulkwriteopts_t *self, bool ordered); Description ----------- ``ordered`` specifies whether the operations in this bulk write should be executed in the order in which they were specified. If false, writes will continue to be executed if an individual write fails. If true, writes will stop executing if an individual write fails. By default, bulk writes are ordered. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_serverid.rst000066400000000000000000000006411511661753600274550ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_serverid mongoc_bulkwriteopts_set_serverid() =================================== Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_serverid (mongoc_bulkwriteopts_t *self, uint32_t serverid); Description ----------- Identifies which server to perform the operation. Intended for use by wrapping drivers that select a server before running the operation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_verboseresults.rst000066400000000000000000000012411511661753600307160ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_verboseresults mongoc_bulkwriteopts_set_verboseresults() ========================================= Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_verboseresults (mongoc_bulkwriteopts_t *self, bool verboseresults); Description ----------- If ``verboseresults`` is true, detailed results for each successful operation will be included in the returned results. By default, verbose results are not included. Verbose results can be obtained with the following: - :symbol:`mongoc_bulkwriteresult_insertresults` - :symbol:`mongoc_bulkwriteresult_updateresults` - :symbol:`mongoc_bulkwriteresult_deleteresults` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_set_writeconcern.rst000066400000000000000000000010251511661753600303310ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_set_writeconcern mongoc_bulkwriteopts_set_writeconcern() ======================================= Synopsis -------- .. code-block:: c void mongoc_bulkwriteopts_set_writeconcern (mongoc_bulkwriteopts_t *self, const mongoc_write_concern_t *writeconcern); Description ----------- ``writeconcern`` is the write concern to use for this bulk write. If a write concern is not set, defaults to the write concern set on the :symbol:`mongoc_client_t` passed in :symbol:`mongoc_client_bulkwrite_new`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteopts_t.rst000066400000000000000000000012231511661753600252170ustar00rootroot00000000000000:man_page: mongoc_bulkwriteopts_t mongoc_bulkwriteopts_t ====================== Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwriteopts_t mongoc_bulkwriteopts_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwriteopts_new mongoc_bulkwriteopts_set_ordered mongoc_bulkwriteopts_set_bypassdocumentvalidation mongoc_bulkwriteopts_set_let mongoc_bulkwriteopts_set_writeconcern mongoc_bulkwriteopts_set_comment mongoc_bulkwriteopts_set_verboseresults mongoc_bulkwriteopts_set_extra mongoc_bulkwriteopts_set_serverid mongoc_bulkwriteopts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_deletedcount.rst000066400000000000000000000005431511661753600277700ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_deletedcount mongoc_bulkwriteresult_deletedcount() ===================================== Synopsis -------- .. code-block:: c int64_t mongoc_bulkwriteresult_deletedcount (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the total number of documents deleted across all delete operations. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_deleteresults.rst000066400000000000000000000011511511661753600301710ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_deleteresults mongoc_bulkwriteresult_deleteresults() ====================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteresult_deleteresults (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the results of each individual delete operation that was successfully performed. Example: .. code:: json { "0" : { "deletedCount" : 1 }, "1" : { "deletedCount" : 2 } } Returns NULL if verbose results were not requested. Request verbose results with :symbol:`mongoc_bulkwriteopts_set_verboseresults`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_destroy.rst000066400000000000000000000004461511661753600270040ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_destroy mongoc_bulkwriteresult_destroy() ================================ Synopsis -------- .. code-block:: c void mongoc_bulkwriteresult_destroy (mongoc_bulkwriteresult_t *self); Description ----------- Frees a :symbol:`mongoc_bulkwriteresult_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_insertedcount.rst000066400000000000000000000005501511661753600301750ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_insertedcount mongoc_bulkwriteresult_insertedcount() ====================================== Synopsis -------- .. code-block:: c int64_t mongoc_bulkwriteresult_insertedcount (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the total number of documents inserted across all insert operations. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_insertresults.rst000066400000000000000000000011551511661753600302370ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_insertresults mongoc_bulkwriteresult_insertresults() ====================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteresult_insertresults (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the results of each individual insert operation that was successfully performed. Example: .. code:: json { "0" : { "insertedId" : "foo" }, "1" : { "insertedId" : "bar" } } Returns NULL if verbose results were not requested. Request verbose results with :symbol:`mongoc_bulkwriteopts_set_verboseresults`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_matchedcount.rst000066400000000000000000000005431511661753600277670ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_matchedcount mongoc_bulkwriteresult_matchedcount() ===================================== Synopsis -------- .. code-block:: c int64_t mongoc_bulkwriteresult_matchedcount (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the total number of documents matched across all update operations. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_modifiedcount.rst000066400000000000000000000005501511661753600301400ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_modifiedcount mongoc_bulkwriteresult_modifiedcount() ====================================== Synopsis -------- .. code-block:: c int64_t mongoc_bulkwriteresult_modifiedcount (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the total number of documents modified across all update operations. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_serverid.rst000066400000000000000000000011271511661753600271330ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_serverid mongoc_bulkwriteresult_serverid() ================================= Synopsis -------- .. code-block:: c uint32_t mongoc_bulkwriteresult_serverid (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the most recently selected server. The returned value may differ from a ``serverid`` previously set with :symbol:`mongoc_bulkwriteopts_set_serverid` if a retry occurred. A server ID of 0 indicates that no server was successfully selected. Intended for use by wrapping drivers that select a server before running the operation. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_t.rst000066400000000000000000000012551511661753600255550ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_t mongoc_bulkwriteresult_t ======================== Synopsis -------- .. code-block:: c typedef struct _mongoc_bulkwriteresult_t mongoc_bulkwriteresult_t; .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_bulkwriteresult_insertedcount mongoc_bulkwriteresult_upsertedcount mongoc_bulkwriteresult_matchedcount mongoc_bulkwriteresult_modifiedcount mongoc_bulkwriteresult_deletedcount mongoc_bulkwriteresult_insertresults mongoc_bulkwriteresult_updateresults mongoc_bulkwriteresult_deleteresults mongoc_bulkwriteresult_serverid mongoc_bulkwriteresult_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_updateresults.rst000066400000000000000000000012511511661753600302120ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_updateresults mongoc_bulkwriteresult_updateresults() ====================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_bulkwriteresult_updateresults (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the results of each individual update operation that was successfully performed. Example: .. code:: json { "0" : { "matchedCount" : 2, "modifiedCount" : 2 }, "1" : { "matchedCount" : 1, "modifiedCount" : 0, "upsertedId" : "foo" } } Returns NULL if verbose results were not requested. Request verbose results with :symbol:`mongoc_bulkwriteopts_set_verboseresults`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwriteresult_upsertedcount.rst000066400000000000000000000005501511661753600302130ustar00rootroot00000000000000:man_page: mongoc_bulkwriteresult_upsertedcount mongoc_bulkwriteresult_upsertedcount() ====================================== Synopsis -------- .. code-block:: c int64_t mongoc_bulkwriteresult_upsertedcount (const mongoc_bulkwriteresult_t *self); Description ----------- Returns the total number of documents upserted across all update operations. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_bulkwritereturn_t.rst000066400000000000000000000015341511661753600255560ustar00rootroot00000000000000:man_page: mongoc_bulkwritereturn_t mongoc_bulkwritereturn_t ======================== Synopsis -------- .. code-block:: c typedef struct { mongoc_bulkwriteresult_t *res; // NULL if no known successful writes or write was unacknowledged. mongoc_bulkwriteexception_t *exc; // NULL if no error. } mongoc_bulkwritereturn_t; Description ----------- :symbol:`mongoc_bulkwritereturn_t` is returned by :symbol:`mongoc_bulkwrite_execute`. ``res`` or ``exc`` may outlive the :symbol:`mongoc_bulkwrite_t` that was executed. ``res`` is NULL if the :symbol:`mongoc_bulkwrite_t` has no known successful writes or was executed with an unacknowledged write concern. ``res`` must be freed with :symbol:`mongoc_bulkwriteresult_destroy`. ``exc`` is NULL if no error occurred. ``exc`` must be freed with :symbol:`mongoc_bulkwriteexception_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_change_stream_destroy.rst000066400000000000000000000005311511661753600263300ustar00rootroot00000000000000:man_page: mongoc_change_stream_destroy mongoc_change_stream_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_change_stream_destroy (mongoc_change_stream_t *stream); Destroys a change stream and associated data. Parameters ---------- * ``stream``: An allocated :symbol:`mongoc_change_stream_t`.mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_change_stream_error_document.rst000066400000000000000000000016611511661753600276730ustar00rootroot00000000000000:man_page: mongoc_change_stream_error_document mongoc_change_stream_error_document() ===================================== Synopsis -------- .. code-block:: c bool mongoc_change_stream_error_document (mongoc_change_stream_t *stream, bson_error_t *err, const bson_t **reply); Checks if an error has occurred when creating or iterating over a change stream. Similar to :symbol:`mongoc_cursor_error_document` if the error has occurred client-side then the ``reply`` will be set to an empty BSON document. If the error occurred server-side, ``reply`` is set to the server's reply document. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. * ``err``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. * ``reply``: A location for a :symbol:`bson:bson_t`. Returns ------- A boolean indicating if there was an error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_change_stream_get_resume_token.rst000066400000000000000000000021131511661753600301740ustar00rootroot00000000000000:man_page: mongoc_change_stream_get_resume_token mongoc_change_stream_get_resume_token() ======================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_change_stream_get_resume_token (mongoc_change_stream_t *stream); This function returns the cached resume token, which may be passed as either the ``resumeAfter`` or ``startAfter`` option of a ``watch`` function to start a new change stream from the same point. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed. Returns ``NULL`` if no resume token is available. This is possible if the change stream has not been iterated and neither ``resumeAfter`` nor ``startAfter`` options were specified in the ``watch`` function. Lifecycle --------- The returned :symbol:`bson:bson_t` is valid for the lifetime of ``stream`` and its data may be updated if :symbol:`mongoc_change_stream_next` is called after this function. The value may be copied to extend its lifetime or preserve the current resume token. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_change_stream_next.rst000066400000000000000000000022071511661753600256170ustar00rootroot00000000000000:man_page: mongoc_change_stream_next mongoc_change_stream_next() =========================== Synopsis -------- .. code-block:: c bool mongoc_change_stream_next (mongoc_change_stream_t *stream, const bson_t **bson); This function iterates the underlying cursor, setting ``bson`` to the next document. This will block for a maximum of ``maxAwaitTimeMS`` milliseconds as specified in the options when created, or the default timeout if omitted. Data may be returned before the timeout. If no data is returned this function returns ``false``. Parameters ---------- * ``stream``: A :symbol:`mongoc_change_stream_t`. * ``bson``: The location for the resulting document. Returns ------- This function returns true if a valid bson document was read from the stream. Otherwise, false if there was an error or no document was available. Errors can be determined with the :symbol:`mongoc_change_stream_error_document` function. Lifecycle --------- Similar to :symbol:`mongoc_cursor_next` the lifetime of ``bson`` is until the next call to :symbol:`mongoc_change_stream_next`, so it needs to be copied to extend the lifetime. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_change_stream_t.rst000066400000000000000000000053601511661753600251070ustar00rootroot00000000000000:man_page: mongoc_change_stream_t mongoc_change_stream_t ====================== Synopsis -------- .. code-block:: c #include typedef struct _mongoc_change_stream_t mongoc_change_stream_t; :symbol:`mongoc_change_stream_t` is a handle to a change stream. A collection change stream can be obtained using :symbol:`mongoc_collection_watch`. It is recommended to use a :symbol:`mongoc_change_stream_t` and its functions instead of a raw aggregation with a ``$changeStream`` stage. For more information see the `MongoDB Manual Entry on Change Streams `_. Example ------- .. literalinclude:: ../examples/example-collection-watch.c :language: c :caption: example-collection-watch.c Starting and Resuming ````````````````````` All ``watch`` functions accept several options to indicate where a change stream should start returning changes from: ``resumeAfter``, ``startAfter``, and ``startAtOperationTime``. All changes returned by :symbol:`mongoc_change_stream_next` include a resume token in the ``_id`` field. MongoDB 4.2 also includes an additional resume token in each "aggregate" and "getMore" command response, which points to the end of that response's batch. The current token is automatically cached by libmongoc. In the event of an error, libmongoc attempts to recreate the change stream starting where it left off by passing the cached resume token. libmongoc only attempts to resume once, but client applications can access the cached resume token with :symbol:`mongoc_change_stream_get_resume_token` and use it for their own resume logic by passing it as either the ``resumeAfter`` or ``startAfter`` option. Additionally, change streams can start returning changes at an operation time by using the ``startAtOperationTime`` field. This can be the timestamp returned in the ``operationTime`` field of a command reply. ``resumeAfter``, ``startAfter``, and ``startAtOperationTime`` are mutually exclusive options. Setting more than one will result in a server error. The following example implements custom resuming logic, persisting the resume token in a file. .. literalinclude:: ../examples/example-resume.c :language: c :caption: example-resume.c The following example shows using ``startAtOperationTime`` to synchronize a change stream with another operation. .. literalinclude:: ../examples/example-start-at-optime.c :language: c :caption: example-start-at-optime.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_watch mongoc_database_watch mongoc_collection_watch mongoc_change_stream_next mongoc_change_stream_get_resume_token mongoc_change_stream_error_document mongoc_change_stream_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_check_version.rst000066400000000000000000000010511511661753600245770ustar00rootroot00000000000000:man_page: mongoc_check_version mongoc_check_version() ====================== Synopsis -------- .. code-block:: c bool mongoc_check_version (int required_major, int required_minor, int required_micro); Parameters ---------- * ``required_major``: The minimum major version required. * ``required_minor``: The minimum minor version required. * ``required_micro``: The minimum micro version required. Returns ------- True if libmongoc's version is greater than or equal to the required version. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cleanup.rst000066400000000000000000000003051511661753600234050ustar00rootroot00000000000000:man_page: mongoc_cleanup mongoc_cleanup() ================ Synopsis -------- .. code-block:: c void mongoc_cleanup (void); Description ----------- .. include:: includes/init_cleanup.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_bulkwrite_new.rst000066400000000000000000000005251511661753600262010ustar00rootroot00000000000000:man_page: mongoc_client_bulkwrite_new mongoc_client_bulkwrite_new() ============================= Synopsis -------- .. code-block:: c mongoc_bulkwrite_t * mongoc_client_bulkwrite_new (mongoc_client_t *self); Description ----------- Returns a new :symbol:`mongoc_bulkwrite_t`. Free with :symbol:`mongoc_bulkwrite_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_command_simple.rst000066400000000000000000000027611511661753600263130ustar00rootroot00000000000000:man_page: mongoc_client_command_simple mongoc_client_command_simple() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_command_simple (mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); The client's read preference, read concern, and write concern are not applied to the command. .. warning:: ``reply`` is always set, and should be released with :symbol:`bson:bson_destroy()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_command_simple_with_server_id.rst000066400000000000000000000023461511661753600314070ustar00rootroot00000000000000:man_page: mongoc_client_command_simple_with_server_id mongoc_client_command_simple_with_server_id() ============================================= Synopsis -------- .. code-block:: c bool mongoc_client_command_simple_with_server_id ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, uint32_t server_id, bson_t *reply, bson_error_t *error); This function executes a command on a specific server, using the database and command specification provided. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``server_id``: An opaque id specifying which server to use. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or a ``NULL``. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_command_with_opts.rst000066400000000000000000000035121511661753600270350ustar00rootroot00000000000000:man_page: mongoc_client_command_with_opts mongoc_client_command_with_opts() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_command_with_opts ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, interpreting ``opts`` according to the MongoDB server version. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. The reply is not parsed for a write concern timeout or write concern error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_destroy.rst000066400000000000000000000012761511661753600250150ustar00rootroot00000000000000:man_page: mongoc_client_destroy mongoc_client_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_client_destroy (mongoc_client_t *client); Release all resources associated with ``client`` and free the structure. Does nothing if ``client`` is NULL. Only call :symbol:`mongoc_client_destroy` on a single-threaded client. Do not call on a :symbol:`mongoc_client_t` obtained from a :symbol:`mongoc_client_pool_t`, which should instead be pushed back with :symbol:`mongoc_client_pool_push()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. .. seealso:: | :symbol:`mongoc_client_pool_push()` to push a multi-threaded client back onto a pool. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_enable_auto_encryption.rst000066400000000000000000000042071511661753600300510ustar00rootroot00000000000000:man_page: mongoc_client_enable_auto_encryption mongoc_client_enable_auto_encryption() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_enable_auto_encryption (mongoc_client_t *client, mongoc_auto_encryption_opts_t* opts, bson_error_t* error); Enable automatic In-Use Encryption on a :symbol:`mongoc_client_t`. Requires libmongoc to be built with support for In-Use Encryption. See `In-Use Encryption `_ for instructions to enable In-Use Encryption in libmongoc. Automatic encryption is an enterprise only feature that only applies to operations on a collection. Automatic encryption is not supported for operations on a database or view, and operations that are not bypassed will result in error. To bypass automatic encryption for all operations, bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` in ``opts``. Automatic encryption requires the authenticated user to have the `listCollections privilege action `_. Enabling automatic encryption reduces the maximum message size and may have a negative performance impact. Only applies to a single-threaded :symbol:`mongoc_client_t`. To use with client pools, see :symbol:`mongoc_client_pool_enable_auto_encryption()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A required :symbol:`mongoc_auto_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t` which is set on error. Returns ------- True on success. False on error. On error, ``error`` is set. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_t` | :symbol:`mongoc_client_pool_enable_auto_encryption()` | `In-Use Encryption `_ for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_add_key_alt_name.rst000066400000000000000000000022041511661753600310260ustar00rootroot00000000000000:man_page: mongoc_client_encryption_add_key_alt_name mongoc_client_encryption_add_key_alt_name() =========================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_add_key_alt_name ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); Add ``keyaltname`` to the set of alternate names in the key document with UUID ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: A UUID (BSON binary subtype 0x04) key ID of the key to add the key alternate name to. * ``keyaltname``: The key alternate name to add. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the value of the key document before addition of the alternate name, or an empty document if the key does not exist. Must be freed by :symbol:`bson_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_create_datakey.rst000066400000000000000000000034061511661753600305400ustar00rootroot00000000000000:man_page: mongoc_client_encryption_create_datakey mongoc_client_encryption_create_datakey() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_encryption_create_datakey ( mongoc_client_encryption_t *client_encryption, const char *kms_provider, const mongoc_client_encryption_datakey_opts_t *opts, bson_value_t *keyid, bson_error_t *error); Creates a new key document in the key vault collection and sets ``keyid`` to the UUID of the newly created key if ``keyid`` is not NULL. The new key can be used to configure automatic encryption (see :symbol:`mongoc_client_enable_auto_encryption()` and :symbol:`mongoc_client_pool_enable_auto_encryption()`) or for explicit encryption (see :symbol:`mongoc_client_encryption_encrypt()`). The created key document is inserted into the key vault collection (identified via :symbol:`mongoc_client_encryption_opts_set_keyvault_namespace()`) with majority write concern. ``keyid`` is always initialized (even on error). Caller must call :symbol:`bson_value_destroy()` on ``keyid`` to free. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``kms_provider``: A string identifying the Key Management Service (KMS) provider used to encrypt the datakey (e.g. "aws" or "local"). * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``keyid``: Optional. An uninitialized :symbol:`bson_value_t` set to the UUID (BSON binary subtype 0x04) of the newly created key. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. A :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_datakey_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_create_encrypted_collection.rst000066400000000000000000000066721511661753600333360ustar00rootroot00000000000000:man_page: mongoc_client_encryption_create_encrypted_collection mongoc_client_encryption_create_encrypted_collection() ====================================================== Synopsis -------- .. code-block:: c mongoc_collection_t* mongoc_client_encryption_create_encrypted_collection ( mongoc_client_encryption_t *enc, mongoc_database_t *database, const char *name, const bson_t *in_options, bson_t *out_options, const char *kms_provider, const bson_t *opt_masterKey, bson_error_t *error); Create a new collection with `Queryable Encryption `_ enabled. Requires a valid :symbol:`mongoc_client_encryption_t` object to operate. .. versionadded:: 1.24.0 .. seealso:: This function is a convenience API wrapping :symbol:`mongoc_database_create_collection`. Parameters ---------- * ``enc``: The :symbol:`mongoc_client_encryption_t` to be used to configure encryption for the new collection. * ``database``: The :symbol:`mongoc_database_t` in which the new collection will be created. * ``name``: The name of the new collection. * ``in_options``: The options for the new collection. (See below). * ``out_options``: An optional output option for the final create-collection options. Should point to storage for a :symbol:`bson_t`. The pointed-to object must be destroyed by the caller. If ``NULL``, has no effect. * ``kms_provider``: The name of the KMS provider to use for generating new data encryption keys for encrypted fields within the collection. * ``opt_masterKey``: If provided, used as the masterkey option when data encryption keys need to be created. (See: :doc:`mongoc_client_encryption_datakey_opts_set_masterkey`) * ``error``: Optional output parameter pointing to storage for a :symbol:`bson_error_t`. If an error occurs, will be initialized with error information. Returns ------- If successful, this function returns a new :symbol:`mongoc_collection_t` object. Upon failure, returns ``NULL`` and initializes ``*error`` with an error indicating the reason for failure. The returned collection object must be freed by the caller. Creation Options ---------------- The ``in_options`` parameter behaves similarly to the ``opts`` parameter for :symbol:`mongoc_database_create_collection`, which accepts the options for the ``create`` MongoDB command (`Documented here `_). The ``in_options`` document accepted here is different in one important way: The ``$.encryptedFields.fields`` array is *required* by this function, and, unlike the schema documented for the ``create`` command, accepts a value of ``null`` for the ``keyId`` parameter on each array element. This function has the following as-if effect: .. default-role:: math 1. A new set of options `O` will be created based on ``in_options``. 2. For each element `F` in the ``$.encryptedFields.fields`` array of `O`: 1. If `F` contains a ``"keyId": null`` element, a new data encryption key `K_f` will be created as-if by calling the :symbol:`mongoc_client_encryption_create_datakey`, using the relevant arguments that were given to ``mongoc_client_encryption_create_encrypted_collection``. 2. The ID of `K_f` will be used to replace the ``"keyId": null`` element within `F`. 3. A collection will be created using the options `O`. 4. If ``out_options`` is not ``NULL``, `O` will be written to ``out_options``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_destroy.rst000066400000000000000000000010611511661753600320260ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_destroy mongoc_client_encryption_datakey_opts_destroy() =============================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_destroy (mongoc_client_encryption_datakey_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_datakey_opts_t` created with :symbol:`mongoc_client_encryption_datakey_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t`.mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_new.rst000066400000000000000000000006621511661753600311340ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_new mongoc_client_encryption_datakey_opts_new() =========================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_datakey_opts_t * mongoc_client_encryption_datakey_opts_new (void); Returns ------- A new :symbol:`mongoc_client_encryption_datakey_opts_t` that must be freed with :symbol:`mongoc_client_encryption_datakey_opts_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_keyaltnames.rst000066400000000000000000000014301511661753600335250ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_keyaltnames mongoc_client_encryption_datakey_opts_set_keyaltnames() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_keyaltnames ( mongoc_client_encryption_datakey_opts_t *opts, char **keyaltnames, uint32_t keyaltnames_count); Sets a list of alternate name strings that can be used to identify a data key. Key alternate names must be unique. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``keyaltnames``: An array of strings. * ``keyaltnames_count``: The number of strings in ``keyaltnames``. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_keymaterial.rst000066400000000000000000000016311511661753600335220ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_keymaterial mongoc_client_encryption_datakey_opts_set_keymaterial() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_keymaterial ( mongoc_client_encryption_datakey_opts_t *opts, const uint8_t *data, uint32_t len); Sets the custom key material to be used by the data key for encryption and decryption. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``data``: A pointer to the bytes constituting the custom key material. * ``len``: The length of the bytes constituting the custom key material. Description ----------- Key material is used to encrypt and decrypt data. If custom key material is not provided, the key material for the new data key is generated from a cryptographically secure random device. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_set_masterkey.rst000066400000000000000000000045431511661753600332240ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_set_masterkey mongoc_client_encryption_datakey_opts_set_masterkey() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_datakey_opts_set_masterkey ( mongoc_client_encryption_datakey_opts_t *opts, const bson_t *masterkey); Identifies the masterkey for the Key Management Service (KMS) provider used to encrypt a new data key. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_datakey_opts_t` * ``masterkey``: A :symbol:`bson_t` document describing the KMS provider specific masterkey. Description ----------- Setting the masterkey is required when creating a data key with the KMS provider types: ``aws``, ``azure``, ``gcp``, and ``kmip``. Setting the masterkey is prohibited with the KMS provider type ``local``. The format of ``masterkey`` for the KMS provider type ``aws`` is as follows: .. code-block:: javascript { region: String, key: String, /* The Amazon Resource Name (ARN) to the AWS customer master key (CMK). */ endpoint: Optional /* An alternate host identifier to send KMS requests to. May include port number. Defaults to "kms..amazonaws.com" */ } The format of ``masterkey`` for the KMS provider type ``azure`` is as follows: .. code-block:: javascript { keyVaultEndpoint: String, /* Host with optional port. Example: "example.vault.azure.net". */ keyName: String, keyVersion: Optional /* A specific version of the named key, defaults to using the key's primary version. */ } The format of ``masterkey`` for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript { projectId: String, location: String, keyRing: String, keyName: String, keyVersion: Optional, /* A specific version of the named key, defaults to using the key's primary version. */ endpoint: Optional /* Host with optional port. Defaults to "cloudkms.googleapis.com". */ } The format of ``masterkey`` for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript { keyId: Optional, delegated: Optional, /* If true (recommended), the KMIP server must decrypt this key. Defaults to false. */ endpoint: Optional /* Host with optional port. */ } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_datakey_opts_t.rst000066400000000000000000000014131511661753600306010ustar00rootroot00000000000000:man_page: mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_datakey_opts_t ======================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_datakey_opts_t; Used to set options for :symbol:`mongoc_client_encryption_create_datakey()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_datakey_opts_new mongoc_client_encryption_datakey_opts_destroy mongoc_client_encryption_datakey_opts_set_masterkey mongoc_client_encryption_datakey_opts_set_keyaltnames mongoc_client_encryption_datakey_opts_set_keymaterial .. seealso:: | :symbol:`mongoc_client_encryption_create_datakey()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_decrypt.rst000066400000000000000000000020701511661753600272410ustar00rootroot00000000000000:man_page: mongoc_client_decryption_decrypt mongoc_client_decryption_decrypt() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_decrypt (mongoc_client_encryption_t *client_encryption, const bson_value_t *ciphertext, bson_value_t *value, bson_error_t *error); Performs explicit decryption. ``value`` is always initialized (even on failure). Caller must call :symbol:`bson_value_destroy()` to free. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``ciphertext``: The ciphertext (a BSON binary with subtype 6) to decrypt. * ``value``: A :symbol:`bson_value_t` for the resulting decrypted value. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_encrypt()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_delete_key.rst000066400000000000000000000016131511661753600277030ustar00rootroot00000000000000:man_page: mongoc_client_encryption_delete_key mongoc_client_encryption_delete_key() ===================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_delete_key ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *reply, bson_error_t *error); Delete a key document in the key vault collection that has the given ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to delete. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` | :symbol:`mongoc_client_encryption_create_datakey` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_destroy.rst000066400000000000000000000007331511661753600272640ustar00rootroot00000000000000:man_page: mongoc_client_encryption_destroy mongoc_client_encryption_destroy() ================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_destroy ( mongoc_client_encryption_t *client_encryption); Release all resources associated with ``client_encryption`` and free the structure. Does nothing if ``client_encryption`` is NULL. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt.rst000066400000000000000000000035771511661753600272700ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt mongoc_client_encryption_encrypt() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_encrypt ( mongoc_client_encryption_t *client_encryption, const bson_value_t *value, mongoc_client_encryption_encrypt_opts_t *opts, bson_value_t *ciphertext, bson_error_t *error); Performs explicit encryption. ``ciphertext`` is always initialized (even on failure). Caller must call :symbol:`bson_value_destroy()` to free. To insert or query with an "Indexed" or "Range" encrypted payload, use a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_auto_encryption_opts_t`. The :symbol:`mongoc_auto_encryption_opts_t` may be configured to bypass query analysis with :symbol:`mongoc_auto_encryption_opts_set_bypass_query_analysis`. The :symbol:`mongoc_auto_encryption_opts_t` must not be configured to bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption`. To insert with a ``Range`` payload :symbol:`mongoc_client_encryption_encrypt_range_opts_t` must be set in ``opts``. To query with a ``Range`` payload, use :symbol:`mongoc_client_encryption_encrypt_expression()` Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``value``: The value to encrypt. * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`. * ``ciphertext``: A :symbol:`bson_value_t` for the resulting ciphertext (a BSON binary with subtype 6). * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_decrypt()` | :symbol:`mongoc_client_encryption_encrypt_expression()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_expression.rst000066400000000000000000000045201511661753600315340ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_expression mongoc_client_encryption_encrypt_expression() ============================================= Synopsis -------- .. code-block:: c bool mongoc_client_encryption_encrypt_expression ( mongoc_client_encryption_t *client_encryption, const bson_t *expr, mongoc_client_encryption_encrypt_opts_t *opts, bson_t *expr_out, bson_error_t *error); .. versionadded:: 1.24.0 Encrypts a Match Expression or Aggregate Expression to query a range index. To query with a ``Range`` encrypted payload, use a :symbol:`mongoc_client_t` configured with :symbol:`mongoc_auto_encryption_opts_t`. The :symbol:`mongoc_auto_encryption_opts_t` may be configured to bypass query analysis with :symbol:`mongoc_auto_encryption_opts_set_bypass_query_analysis`. The :symbol:`mongoc_auto_encryption_opts_t` must not be configured to bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption`. To query with a ``Range`` payload, ``expr`` must be one of the following forms: #. A Match Expression of the following form: .. code-block:: javascript // $gt may also be $gte. $lt may also be $lte. // Can include one of $gt/$gte/$lt/$lte. It is not required to include both. {"$and": [{"": {"$gt": ""}}, {"": {"$lt": "" }}]} #. An Aggregation Expression of this form: .. code-block:: javascript // $gt may also be $gte. $lt may also be $lte // Can include one of $gt/$gte/$lt/$lte. It is not required to include both. {"$and": [{"$gt": ["", ""]}, {"$lt": ["", ""]}] Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t` * ``expr``: The expression to encrypt. * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`. * ``expr_out``: A :symbol:`bson_t` for the resulting encrypted expression. ``expr_out`` is always initialized (even on failure). Caller must call :symbol:`bson_destroy()` to free. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_encryption_decrypt()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_destroy.rst000066400000000000000000000010611511661753600320700ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_destroy mongoc_client_encryption_encrypt_opts_destroy() =============================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_destroy (mongoc_client_encryption_encrypt_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_encrypt_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`.mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_new.rst000066400000000000000000000006621511661753600311760ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_new mongoc_client_encryption_encrypt_opts_new() =========================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_opts_t * mongoc_client_encryption_encrypt_opts_new (void); Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_opts_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_algorithm.rst000066400000000000000000000032101511661753600332360ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_algorithm mongoc_client_encryption_encrypt_opts_set_algorithm() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_algorithm ( mongoc_client_encryption_encrypt_opts_t *opts, const char *algorithm); #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM "AEAD_AES_256_CBC_HMAC_SHA_512-Random" #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" #define MONGOC_ENCRYPT_ALGORITHM_INDEXED "Indexed" #define MONGOC_ENCRYPT_ALGORITHM_UNINDEXED "Unindexed" #define MONGOC_ENCRYPT_ALGORITHM_RANGE "Range" Identifies the algorithm to use for encryption. Valid values of ``algorithm`` are: ``"AEAD_AES_256_CBC_HMAC_SHA_512-Random"`` for randomized encryption. Specific to the `Client-Side Field Level Encryption `_ feature. ``"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"`` for deterministic (queryable) encryption. Specific to the `Client-Side Field Level Encryption `_ feature. ``"Indexed"`` for indexed encryption. Specific to the `Queryable Encryption `_ feature. ``"Unindexed"`` for unindexed encryption. Specific to the `Queryable Encryption `_ feature. ``"Range"`` for range encryption. Specific to the `Queryable Encryption `_ feature. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``algorithm``: A ``char *`` identifying the algorithm. mongoc_client_encryption_encrypt_opts_set_contention_factor.rst000066400000000000000000000016041511661753600347140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_opts_set_contention_factor mongoc_client_encryption_encrypt_opts_set_contention_factor() ============================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_contention_factor ( mongoc_client_encryption_encrypt_opts_t *opts, int64_t contention_factor); .. versionadded:: 1.22.0 Sets a contention factor for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Indexed" or "Range". It is an error to set the contention factor when algorithm is not "Indexed" or "Range". If contention factor is not supplied, it defaults to a value of 0. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``contention_factor``: A non-negative contention factor. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_keyaltname.rst000066400000000000000000000014531511661753600334110ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_keyaltname mongoc_client_encryption_encrypt_opts_set_keyaltname() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_keyaltname ( mongoc_client_encryption_encrypt_opts_t *opts, const char *keyaltname); Identifies the data key to use for encryption. This option is mutually exclusive with :symbol:`mongoc_client_encryption_encrypt_opts_set_keyid()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``keyaltname``: A string identifying a data key by alternate name. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyid` | :symbol:`mongoc_client_encryption_datakey_opts_set_keyaltnames` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_keyid.rst000066400000000000000000000013701511661753600323620ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_keyid mongoc_client_encryption_encrypt_opts_set_keyid() ================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_keyid ( mongoc_client_encryption_encrypt_opts_t *opts, const bson_value_t *keyid); Identifies the data key to use for encryption. This option is mutually exclusive with :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``keyid``: The UUID (BSON binary subtype 0x04) corresponding to the ``_id`` of the data key. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_opts_set_keyaltname` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_query_type.rst000066400000000000000000000017261511661753600334700ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_query_type mongoc_client_encryption_encrypt_opts_set_query_type() ====================================================== Synopsis -------- .. code-block:: c #define MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY "equality" #define MONGOC_ENCRYPT_QUERY_TYPE_RANGE "range" void mongoc_client_encryption_encrypt_opts_set_query_type ( mongoc_client_encryption_encrypt_opts_t *opts, const char* query_type); .. versionadded:: 1.22.0 Sets a query type for explicit encryption. Currently, the supported values for ``query_type`` are ``"equality"`` and ``"range"``. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Indexed" or "Range". It is an error to set the query type when algorithm is not "Indexed" or "Range". Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``query_type``: A query type to use for explicit encryption. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_range_opts.rst000066400000000000000000000016231511661753600334170ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_range_opts mongoc_client_encryption_encrypt_opts_set_range_opts() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_range_opts ( mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_range_opts_t *range_opts); .. versionadded:: 1.24.0 Sets the ``range_opts`` for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set ``range_opts`` when algorithm is not "Range". Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t` * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_set_text_opts.rst000066400000000000000000000020461511661753600333070ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_set_text_opts mongoc_client_encryption_encrypt_opts_set_text_opts() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_opts_set_text_opts( mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_text_opts_t *text_opts); .. versionadded:: 2.2.0 Sets the text search encryption options for explicit encryption. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_opts_t`. * ``text_opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t` specifying text search options. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_t` | :symbol:`mongoc_client_encryption_encrypt_text_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_opts_t.rst000066400000000000000000000016521511661753600306500ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_opts_t ======================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_opts_t; Used to set options for :symbol:`mongoc_client_encryption_encrypt()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_opts_new mongoc_client_encryption_encrypt_opts_destroy mongoc_client_encryption_encrypt_opts_set_keyid mongoc_client_encryption_encrypt_opts_set_keyaltname mongoc_client_encryption_encrypt_opts_set_algorithm mongoc_client_encryption_encrypt_opts_set_contention_factor mongoc_client_encryption_encrypt_opts_set_query_type mongoc_client_encryption_encrypt_opts_set_range_opts .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_destroy.rst000066400000000000000000000013271511661753600332510ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_destroy mongoc_client_encryption_encrypt_range_opts_destroy() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_destroy (mongoc_client_encryption_encrypt_range_opts_t *range_opts); .. versionadded:: 1.24.0 Frees resources of a :symbol:`mongoc_client_encryption_encrypt_range_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_range_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t`mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_new.rst000066400000000000000000000012071511661753600323460ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_new mongoc_client_encryption_encrypt_range_opts_new() ================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_range_opts_t * mongoc_client_encryption_encrypt_range_opts_new (void); .. versionadded:: 1.24.0 Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_range_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_range_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` | :symbol:`mongoc_client_encryption_encrypt_range_opts_destroy` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_max.rst000066400000000000000000000023121511661753600332130ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_max mongoc_client_encryption_encrypt_range_opts_set_max() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_max ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *max); .. versionadded:: 1.24.0 Sets the maximum value of the range for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set maximum when algorithm is not "Range". The maximum must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. For double and decimal128 fields, max/max/precision must all be set, or all be unset. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``max``: The maximum bson value of the range. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_precision` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_min` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_min.rst000066400000000000000000000023121511661753600332110ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_min mongoc_client_encryption_encrypt_range_opts_set_min() ===================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_min ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *min); .. versionadded:: 1.24.0 Sets the minimum value of the range for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set minimum when algorithm is not "Range". The minimum must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. For double and decimal128 fields, min/max/precision must all be set, or all be unset. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``min``: The minimum bson value of the range. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_precision` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_max` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_precision.rst000066400000000000000000000025611511661753600344270ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_precision mongoc_client_encryption_encrypt_range_opts_set_precision() =========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_precision ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t precision); .. versionadded:: 1.24.0 Sets precision for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set precision when algorithm is not "Range". Precision can only be set with double or decimal128 fields. It is an error to set precision if the type of the encryptedFields in the destination collection is not double or decimal128. For double and decimal128 fields, min/max/precision must all be set, or all be unset. Precision must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``precision``: A non-negative precision. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_min` | :symbol:`mongoc_client_encryption_encrypt_range_opts_set_max` | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_set_sparsity.rst000066400000000000000000000020411511661753600343030ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_set_sparsity mongoc_client_encryption_encrypt_range_opts_set_sparsity() ========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_sparsity ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, int64_t sparsity); .. versionadded:: 1.24.0 Sets sparsity for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set sparsity when algorithm is not "Range". Sparsity may be used to tune performance. When omitted, a default value is used. Sparsity must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``sparsity``: A non-negative sparsity. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongoc_client_encryption_encrypt_range_opts_set_trim_factor.rst000066400000000000000000000021061511661753600346610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_range_opts_set_trim_factor mongoc_client_encryption_encrypt_range_opts_set_trim_factor() ============================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_range_opts_set_trim_factor ( mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t trim_factor); .. versionadded:: 1.28.0 Sets trim factor for explicit encryption. Only applies when the algorithm set by :symbol:`mongoc_client_encryption_encrypt_opts_set_algorithm()` is "Range". It is an error to set trim factor when algorithm is not "Range". The trim factor may be used to tune performance. When omitted, a default value is used. Trim factor must match the value set in the encryptedFields of the destination collection. It is an error to set a different value. Parameters ---------- * ``range_opts``: A :symbol:`mongoc_client_encryption_encrypt_range_opts_t` * ``trim_factor``: A non-negative trim factor. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_range_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_range_opts_t.rst000066400000000000000000000025571511661753600320310ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_encrypt_range_opts_t ============================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_encrypt_range_opts_t; .. versionadded:: 1.24.0 RangeOpts specifies index options for a Queryable Encryption field supporting "range" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt()`. The options min, max, trim factor, sparsity, and range must match the values set in the encryptedFields of the destination collection. For double and decimal128 fields, min/max/precision must all be set, or all be unset. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_range_opts_new mongoc_client_encryption_encrypt_range_opts_destroy mongoc_client_encryption_encrypt_range_opts_set_trim_factor mongoc_client_encryption_encrypt_range_opts_set_sparsity mongoc_client_encryption_encrypt_range_opts_set_min mongoc_client_encryption_encrypt_range_opts_set_max mongoc_client_encryption_encrypt_range_opts_set_precision mongoc_client_encryption_encrypt_opts_set_range_opts .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_destroy.rst000066400000000000000000000012741511661753600331420ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_destroy mongoc_client_encryption_encrypt_text_opts_destroy() ==================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_destroy(mongoc_client_encryption_encrypt_text_opts_t *topts); .. versionadded:: 2.2.0 Frees a :symbol:`mongoc_client_encryption_encrypt_text_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_text_opts_new()`. |encrypt-text-is-experimental| Parameters ---------- * ``topts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_new.rst000066400000000000000000000014611511661753600322400ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_new mongoc_client_encryption_encrypt_text_opts_new() ================================================ Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_text_opts_t * mongoc_client_encryption_encrypt_text_opts_new(void); .. versionadded:: 2.2.0 |encrypt-text-is-experimental| Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_text_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_text_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_destroy` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongoc_client_encryption_encrypt_text_opts_set_case_sensitive.rst000066400000000000000000000013351511661753600352470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_opts_set_case_sensitive mongoc_client_encryption_encrypt_text_opts_set_case_sensitive() =============================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_set_case_sensitive( mongoc_client_encryption_encrypt_text_opts_t *opts, bool case_sensitive); .. versionadded:: 2.2.0 Sets whether text search is case sensitive. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t`. * ``case_sensitive``: If true, text search is case sensitive. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_t` mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive.rst000066400000000000000000000014051511661753600362650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive() ==================================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive( mongoc_client_encryption_encrypt_text_opts_t *opts, bool diacritic_sensitive); .. versionadded:: 2.2.0 Sets whether text search is diacritic sensitive. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t`. * ``diacritic_sensitive``: If true, text search is diacritic sensitive. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_set_prefix.rst000066400000000000000000000015341511661753600336200ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_set_prefix mongoc_client_encryption_encrypt_text_opts_set_prefix() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_set_prefix( mongoc_client_encryption_encrypt_text_opts_t *opts, mongoc_client_encryption_encrypt_text_prefix_opts_t *popts); .. versionadded:: 2.2.0 Sets the prefix options for text search encryption. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t`. * ``popts``: A :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t` to set as prefix options. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_set_substring.rst000066400000000000000000000015711511661753600343440ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_set_substring mongoc_client_encryption_encrypt_text_opts_set_substring() ========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_set_substring( mongoc_client_encryption_encrypt_text_opts_t *opts, mongoc_client_encryption_encrypt_text_substring_opts_t *ssopts); .. versionadded:: 2.2.0 Sets the substring options for text search encryption. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t`. * ``ssopts``: A :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t` to set as substring options. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_set_suffix.rst000066400000000000000000000015341511661753600336270ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_set_suffix mongoc_client_encryption_encrypt_text_opts_set_suffix() ======================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_opts_set_suffix( mongoc_client_encryption_encrypt_text_opts_t *opts, mongoc_client_encryption_encrypt_text_suffix_opts_t *sopts); .. versionadded:: 2.2.0 Sets the suffix options for text search encryption. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_opts_t`. * ``sopts``: A :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t` to set as suffix options. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_opts_t.rst000066400000000000000000000045561511661753600317220ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_opts_t mongoc_client_encryption_encrypt_text_opts_t ============================================= Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_text_opts_t mongoc_client_encryption_encrypt_text_opts_t; .. versionadded:: 2.2.0 TextOpts specifies index options for a Queryable Encryption field supporting "textPreview" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt()`. Case sensitive and diacritic sensitive must be set. If prefix or suffix are set, substring must not be set. |encrypt-text-is-experimental| .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_text_opts_new mongoc_client_encryption_encrypt_text_opts_destroy mongoc_client_encryption_encrypt_text_opts_set_case_sensitive mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive mongoc_client_encryption_encrypt_text_opts_set_prefix mongoc_client_encryption_encrypt_text_opts_set_suffix mongoc_client_encryption_encrypt_text_opts_set_substring mongoc_client_encryption_encrypt_text_prefix_opts_t mongoc_client_encryption_encrypt_text_prefix_opts_new mongoc_client_encryption_encrypt_text_prefix_opts_destroy mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_suffix_opts_t mongoc_client_encryption_encrypt_text_suffix_opts_new mongoc_client_encryption_encrypt_text_suffix_opts_destroy mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_substring_opts_t mongoc_client_encryption_encrypt_text_substring_opts_new mongoc_client_encryption_encrypt_text_substring_opts_destroy mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length mongoc_client_encryption_encrypt_opts_set_text_opts .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_prefix_opts_destroy.rst000066400000000000000000000013711511661753600345150ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_prefix_opts_destroy mongoc_client_encryption_encrypt_text_prefix_opts_destroy() =========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_prefix_opts_destroy(mongoc_client_encryption_encrypt_text_prefix_opts_t *opts); .. versionadded:: 2.2.0 Frees a :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_new()`. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_prefix_opts_new.rst000066400000000000000000000012741511661753600336170ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_prefix_opts_new mongoc_client_encryption_encrypt_text_prefix_opts_new() ======================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_text_prefix_opts_t * mongoc_client_encryption_encrypt_text_prefix_opts_new(void); .. versionadded:: 2.2.0 Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_destroy` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix` mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length.rst000066400000000000000000000016701511661753600400650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length() ============================================================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t str_max_query_length); .. versionadded:: 2.2.0 Sets the maximum query length for prefix text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t`. * ``str_max_query_length``: The maximum query length for prefix search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix` mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length.rst000066400000000000000000000016701511661753600400630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length() ============================================================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t str_min_query_length); .. versionadded:: 2.2.0 Sets the minimum query length for prefix text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_t`. * ``str_min_query_length``: The minimum query length for prefix search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_prefix_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_prefix_opts_t.rst000066400000000000000000000017611511661753600332720ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_prefix_opts_t mongoc_client_encryption_encrypt_text_prefix_opts_t =================================================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_text_prefix_opts_t mongoc_client_encryption_encrypt_text_prefix_opts_t; .. versionadded:: 2.2.0 TextPrefixOpts specifies options for a Queryable Encryption field supporting "prefixPreview" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt_text_opts_set_prefix()`. |encrypt-text-is-experimental| .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_text_prefix_opts_new mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongoc_client_encryption_encrypt_text_substring_opts_destroy.rst000066400000000000000000000014241511661753600351600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_substring_opts_destroy mongoc_client_encryption_encrypt_text_substring_opts_destroy() ============================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_substring_opts_destroy(mongoc_client_encryption_encrypt_text_substring_opts_t *opts); .. versionadded:: 2.2.0 Frees a :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new()`. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_substring_opts_new.rst000066400000000000000000000013271511661753600343410ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_substring_opts_new mongoc_client_encryption_encrypt_text_substring_opts_new() ========================================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_text_substring_opts_t * mongoc_client_encryption_encrypt_text_substring_opts_new(void); .. versionadded:: 2.2.0 Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_destroy` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length.rst000066400000000000000000000016641511661753600373660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length() ========================================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_max_length); .. versionadded:: 2.2.0 Sets the maximum string length for substring text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t`. * ``str_max_length``: The maximum string length for substring search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length.rst000066400000000000000000000017261511661753600406120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length() =============================================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_max_query_length); .. versionadded:: 2.2.0 Sets the maximum query length for substring text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t`. * ``str_max_query_length``: The maximum query length for substring search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length.rst000066400000000000000000000017261511661753600406100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length() =============================================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_min_query_length); .. versionadded:: 2.2.0 Sets the minimum query length for substring text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_t`. * ``str_min_query_length``: The minimum query length for substring search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_substring_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_substring_opts_t.rst000066400000000000000000000021361511661753600340120ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_substring_opts_t mongoc_client_encryption_encrypt_text_substring_opts_t ====================================================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_text_substring_opts_t mongoc_client_encryption_encrypt_text_substring_opts_t; .. versionadded:: 2.2.0 TextSubstringOpts specifies options for a Queryable Encryption field supporting "substringPreview" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt_text_opts_set_substring()`. |encrypt-text-is-experimental| .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_text_substring_opts_new mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_suffix_opts_destroy.rst000066400000000000000000000013711511661753600345240ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_suffix_opts_destroy mongoc_client_encryption_encrypt_text_suffix_opts_destroy() =========================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_suffix_opts_destroy(mongoc_client_encryption_encrypt_text_suffix_opts_t *opts); .. versionadded:: 2.2.0 Frees a :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t` created with :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_new()`. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t` to destroy. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_suffix_opts_new.rst000066400000000000000000000012741511661753600336260ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_suffix_opts_new mongoc_client_encryption_encrypt_text_suffix_opts_new() ======================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_encrypt_text_suffix_opts_t * mongoc_client_encryption_encrypt_text_suffix_opts_new(void); .. versionadded:: 2.2.0 Returns ------- A new :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t` that must be freed with :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_destroy()`. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_destroy` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix` mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length.rst000066400000000000000000000016701511661753600400740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length() ============================================================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t str_max_query_length); .. versionadded:: 2.2.0 Sets the maximum query length for suffix text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t`. * ``str_max_query_length``: The maximum query length for suffix search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix` mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length.rst000066400000000000000000000016701511661753600400720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length() ============================================================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t str_min_query_length); .. versionadded:: 2.2.0 Sets the minimum query length for suffix text search encryption options. |encrypt-text-is-experimental| Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_t`. * ``str_min_query_length``: The minimum query length for suffix search. Must be greater than zero. .. seealso:: | :symbol:`mongoc_client_encryption_encrypt_text_suffix_opts_new` | :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_encrypt_text_suffix_opts_t.rst000066400000000000000000000017611511661753600333010ustar00rootroot00000000000000:man_page: mongoc_client_encryption_encrypt_text_suffix_opts_t mongoc_client_encryption_encrypt_text_suffix_opts_t =================================================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_encrypt_text_suffix_opts_t mongoc_client_encryption_encrypt_text_suffix_opts_t; .. versionadded:: 2.2.0 TextSuffixOpts specifies options for a Queryable Encryption field supporting "suffixPreview" queries. Used to set options for :symbol:`mongoc_client_encryption_encrypt_text_opts_set_suffix()`. |encrypt-text-is-experimental| .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_encrypt_text_suffix_opts_new mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length .. seealso:: | :symbol:`mongoc_client_encryption_encrypt()` | :symbol:`mongoc_client_encryption_encrypt_opts_t()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_get_crypt_shared_version.rst000066400000000000000000000020751511661753600326670ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_crypt_shared_version mongoc_client_encryption_get_crypt_shared_version() =================================================== Synopsis -------- .. code-block:: c const char* mongoc_client_encryption_get_crypt_shared_version (mongoc_client_encryption_t const *enc); Obtain the version string of the crypt_shared_ that is loaded for the given explicit encryption object. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. Parameters ---------- * ``enc``: A live :symbol:`mongoc_client_encryption_t` Returns ------- A pointer to a null-terminated character array string designating the version of crypt_shared_ that was loaded for ``enc``. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. The pointed-to array must not be modified or freed. The returned pointer is only valid for the lifetime of ``enc``. .. _crypt_shared: https://www.mongodb.com/docs/manual/core/queryable-encryption/reference/shared-library/ .. seealso:: - :symbol:`mongoc_client_get_crypt_shared_version` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_get_key.rst000066400000000000000000000020301511661753600272120ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_key mongoc_client_encryption_get_key() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_get_key (mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *key_doc, bson_error_t *error); Get a key document in the key vault collection that has the given ``keyid``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to get. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the resulting key document, or an empty document value if the key does not exist. Must be freed by :symbol:`bson_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_get_key_by_alt_name.rst000066400000000000000000000017621511661753600315570ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_key_by_alt_name mongoc_client_encryption_get_key_by_alt_name() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_get_key_by_alt_name ( mongoc_client_encryption_t *client_encryption, const char *keyaltname, bson_value_t *key_doc, bson_error_t *error); Get a key document in the key vault collection that has the given ``keyaltname``. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyaltname``: The key alternate name of the key to get. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the resulting key document, or an empty document if the key does not exist. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_get_keys.rst000066400000000000000000000012731511661753600274050ustar00rootroot00000000000000:man_page: mongoc_client_encryption_get_keys mongoc_client_encryption_get_keys() =================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_client_encryption_get_keys (mongoc_client_encryption_t *client_encryption, bson_error_t *error); Get all the key documents in the key vault collection. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns the result of the internal find command if successful. Returns ``NULL`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_new.rst000066400000000000000000000013761511661753600263700ustar00rootroot00000000000000:man_page: mongoc_client_encryption_new mongoc_client_encryption_new() ============================== Synopsis -------- .. code-block:: c mongoc_client_encryption_t * mongoc_client_encryption_new (mongoc_client_encryption_opts_t *opts, bson_error_t *error); Create a new :symbol:`mongoc_client_encryption_t`. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- A new :symbol:`mongoc_client_encryption_t` that must be freed with :symbol:`mongoc_client_encryption_destroy()` if successful. Returns ``NULL`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` | :symbol:`mongoc_client_encryption_opts_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_destroy.rst000066400000000000000000000007631511661753600303340ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_destroy mongoc_client_encryption_opts_destroy() ======================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_destroy (mongoc_client_encryption_opts_t *opts); Frees resources of a :symbol:`mongoc_client_encryption_opts_t` created with :symbol:`mongoc_client_encryption_opts_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`.mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_new.rst000066400000000000000000000005721511661753600274320ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_new mongoc_client_encryption_opts_new() =================================== Synopsis -------- .. code-block:: c mongoc_client_encryption_opts_t * mongoc_client_encryption_opts_new (void); Returns ------- A new :symbol:`mongoc_client_encryption_opts_t` that must be freed with :symbol:`mongoc_client_encryption_opts_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_set_key_expiration.rst000066400000000000000000000012371511661753600325450ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_key_expiration mongoc_client_encryption_opts_set_key_expiration() ======================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_key_expiration ( mongoc_client_encryption_opts_t *opts, uint64_t cache_expiration_ms); Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``cache_expiration_ms``: The data encryption key cache expiration time in milliseconds. Defaults to 60,000. 0 means "never expire". .. seealso:: | :symbol:`mongoc_client_encryption_new()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_set_keyvault_client.rst000066400000000000000000000017411511661753600327150ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_keyvault_client mongoc_client_encryption_opts_set_keyvault_client() =================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_keyvault_client ( mongoc_client_encryption_opts_t *opts, mongoc_client_t *keyvault_client); Set the :symbol:`mongoc_client_t` to use during key creation and key lookup for encryption and decryption. This may be either a single-threaded or multi-threaded client (i.e. a client obtained from a :symbol:`mongoc_client_pool_t`). Parameters ---------- * ``opts``: A :symbol:`mongoc_client_encryption_opts_t`. * ``client``: A :symbol:`mongoc_client_t` to use for key lookup and creation. This ``client`` MUST outlive any :symbol:`mongoc_client_encryption_t` configured to use it with :symbol:`mongoc_client_encryption_new()`. .. seealso:: | :symbol:`mongoc_client_encryption_new()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_set_keyvault_namespace.rst000066400000000000000000000015301511661753600333670ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_key_vault_namespace mongoc_client_encryption_opts_set_keyvault_namespace() ====================================================== Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_keyvault_namespace ( mongoc_client_encryption_opts_t *opts, const char *db, const char *coll); Set the database and collection name of the key vault. The key vault is the specially designated collection containing encrypted data keys for `In-Use Encryption `_. Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``db``: The database name of the key vault collection. * ``coll``: The collection name of the key vault collection. .. seealso:: | :symbol:`mongoc_client_encryption_new()` | `In-Use Encryption `_ mongoc_client_encryption_opts_set_kms_credential_provider_callback.rst000066400000000000000000000044511511661753600361470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_opts_set_kms_credential_provider_callback mongoc_client_encryption_opts_set_kms_credential_provider_callback () ===================================================================== .. versionadded:: 1.23.0 Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_kms_credential_provider_callback ( mongoc_client_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); Set the user-provided callback to provide KMS credentials on-demand when they are needed. Parameters ---------- - ``opts`` - The options object to update. - ``fn`` - The provider callback to set on the options object. May be ``NULL`` to clear the callback. Refer to: :c:type:`mongoc_kms_credentials_provider_callback_fn` - ``userdata`` - An arbitrary pointer that will be passed along to the callback function when it is called by libmongoc. .. seealso:: :doc:`mongoc_auto_encryption_opts_set_kms_credential_provider_callback` .. rubric:: Related: .. c:type:: mongoc_kms_credentials_provider_callback_fn .. - The :noindexentry: prevents a one-off index entry for this item. Most entities are not documented as Sphinx objects, and thus do not generate index entries. Future changes may flip the script. .. code-block:: c typedef bool (*mongoc_kms_credentials_provider_callback_fn) (void *userdata, const bson_t *params, bson_t *out, bson_error_t *error); The type of a callback function for providing KMS providers data on-demand. :parameters: - ``userdata`` - The same userdata pointer provided to the ``userdata`` parameter when the callback was set. - ``params`` - Parameters for the requested KMS credentials. Currently empty. - ``out`` - The output :symbol:`bson:bson_t` in which to write the new KMS providers. When passed to the callback, this already points to an empty BSON document which must be populated. - ``error`` - An output parameter for indicating any errors that might occur while generating the KMS credentials. :return value: Must return ``true`` on success, ``false`` on failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_set_kms_providers.rst000066400000000000000000000051011511661753600323740ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_kms_providers mongoc_client_encryption_opts_set_kms_providers() ================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_kms_providers ( mongoc_client_encryption_opts_t *opts, const bson_t *kms_providers); Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``kms_providers``: A :symbol:`bson_t` containing configuration for an external Key Management Service (KMS). ``kms_providers`` is a BSON document containing configuration for each KMS provider. KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). At least one KMS provider must be specified. The format for the KMS provider type ``aws`` is as follows: .. code-block:: javascript aws: { accessKeyId: String, secretAccessKey: String } The format for the KMS provider type ``local`` is as follows: .. code-block:: javascript local: { key: <96 byte BSON binary of subtype 0> or String /* The master key used to encrypt/decrypt data keys. May be passed as a base64 encoded string. */ } The format for the KMS provider type ``azure`` is as follows: .. code-block:: javascript azure: { tenantId: String, clientId: String, clientSecret: String, identityPlatformEndpoint: Optional /* Defaults to login.microsoftonline.com */ } The format for the KMS provider type ``gcp`` is as follows: .. code-block:: javascript gcp: { email: String, privateKey: byte[] or String, /* May be passed as a base64 encoded string. */ endpoint: Optional /* Defaults to oauth2.googleapis.com */ } The format for the KMS provider type ``kmip`` is as follows: .. code-block:: javascript kmip: { endpoint: String } KMS providers may include an optional name suffix separate with a colon. This enables configuring multiple KMS providers with the same KMS provider type. Example: .. code-block:: javascript "aws:name1": { accessKeyId: String, secretAccessKey: String }, "aws:name2": { accessKeyId: String, secretAccessKey: String } .. seealso:: | :symbol:`mongoc_client_encryption_new()` | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_set_tls_opts.rst000066400000000000000000000034001511661753600313540ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_set_tls_opts mongoc_client_encryption_opts_set_tls_opts() ============================================ Synopsis -------- .. code-block:: c void mongoc_client_encryption_opts_set_tls_opts ( mongoc_client_encryption_opts_t *opts, const bson_t *tls_opts); Parameters ---------- * ``opts``: The :symbol:`mongoc_client_encryption_opts_t` * ``tls_opts``: A :symbol:`bson_t` mapping a Key Management Service (KMS) provider to a BSON document with TLS options. ``tls_opts`` is a BSON document of the following form: .. code-block:: javascript : { tlsCaFile: Optional tlsCertificateKeyFile: Optional tlsCertificateKeyFilePassword: Optional } KMS providers are specified as a string of the form ```` or ``:``. The supported KMS provider types are ``aws``, ``azure``, ``gcp``, ``local``, and ``kmip``. The optional name enables configuring multiple KMS providers with the same KMS provider type (e.g. ``aws:name1`` and ``aws:name2`` can refer to different AWS accounts). ``tls_opts`` maps the KMS provider to a BSON document for TLS options. The BSON document for TLS options may contain the following keys: - ``MONGOC_URI_TLSCERTIFICATEKEYFILE`` - ``MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD`` - ``MONGOC_URI_TLSCAFILE`` .. literalinclude:: ../examples/client-side-encryption-doc-snippets.c :caption: Example use :start-after: BEGIN:mongoc_client_encryption_opts_set_tls_opts :end-before: END:mongoc_client_encryption_opts_set_tls_opts :dedent: 6 See `Configuring TLS `_ for a description of the behavior of these options. .. seealso:: | `In-Use Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_opts_t.rst000066400000000000000000000015411511661753600271010ustar00rootroot00000000000000:man_page: mongoc_client_encryption_opts_t mongoc_client_encryption_opts_t =============================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_opts_t mongoc_client_encryption_opts_t; Used to set options for :symbol:`mongoc_client_encryption_new()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_opts_new mongoc_client_encryption_opts_destroy mongoc_client_encryption_opts_set_keyvault_client mongoc_client_encryption_opts_set_keyvault_namespace mongoc_client_encryption_opts_set_kms_credential_provider_callback mongoc_client_encryption_opts_set_kms_providers mongoc_client_encryption_opts_set_tls_opts mongoc_client_encryption_opts_set_key_expiration .. seealso:: | :symbol:`mongoc_client_encryption_new()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_remove_key_alt_name.rst000066400000000000000000000023701511661753600315770ustar00rootroot00000000000000:man_page: mongoc_client_encryption_remove_key_alt_name mongoc_client_encryption_remove_key_alt_name() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_remove_key_alt_name ( mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); Remove ``keyaltname`` from the set of keyAltNames in the key document with UUID ``keyid``. Also removes the ``keyAltNames`` field from the key document if it would otherwise be empty. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``keyid``: The UUID (BSON binary subtype 0x04) of the key to remove the key alternate name from. * ``keyaltname``: The key alternate name to remove. * ``key_doc``: Optional. An uninitialized :symbol:`bson_t` set to the value of the key document before removal of the key alternate name, or an empty document the key does not exist. Must be freed by :symbol:`bson_value_destroy`. * ``error``: Optional. :symbol:`bson_error_t`. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey.rst000066400000000000000000000034751511661753600316270ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey mongoc_client_encryption_rewrap_many_datakey() ============================================== Synopsis -------- .. code-block:: c bool mongoc_client_encryption_rewrap_many_datakey ( mongoc_client_encryption_t *client_encryption, const bson_t *filter, const char *provider, const bson_t *master_key, mongoc_client_encryption_rewrap_many_datakey_result_t *result, bson_error_t *error); Rewraps zero or more data keys in the key vault collection that match the provided ``filter``. A ``NULL`` argument for ``filter`` is equivalent to being given an empty document (match all). If ``provider`` is ``NULL``, rewraps matching data keys with their current KMS provider and master key. If ``provider`` is not ``NULL``, rewraps matching data keys with the new KMS provider as described by ``master_key``. The ``master_key`` document must conform to the `Client Side Encryption specification `_. Parameters ---------- * ``client_encryption``: A :symbol:`mongoc_client_encryption_t`. * ``filter``: The filter to use when finding data keys to rewrap in the key vault collection. * ``provider``: The new KMS provider to use to encrypt the data keys, or ``NULL`` to use the current KMS provider(s). * ``master_key``: The master key fields corresponding to the new KMS provider when ``provider`` is not ``NULL``. * ``result``: An optional :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. * ``error``: A :symbol:`bson_error_t` set on failure. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` mongoc_client_encryption_rewrap_many_datakey_result_destroy.rst000066400000000000000000000012571511661753600347130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_rewrap_many_datakey_result_destroy mongoc_client_encryption_rewrap_many_datakey_result_destroy() ============================================================= Synopsis -------- .. code-block:: c void mongoc_client_encryption_rewrap_many_datakey_result_destroy ( mongoc_client_encryption_rewrap_many_datakey_result_t *result); Frees resources of a :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` created with :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_new()`. Does nothing if ``NULL`` is passed. Parameters ---------- * ``result``: A :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result.rst000066400000000000000000000017231511661753600376240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result() =========================================================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result ( mongoc_client_encryption_rewrap_many_datakey_result_t *result); Get the bulk write result set by a successful call to :symbol:`mongoc_client_encryption_rewrap_many_datakey()`. Returns ``NULL`` if no bulk write operation was executed or if the bulk write operation was unacknowledged. Parameters ---------- * ``result``: A :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t`. Returns ------- A :symbol:`bson_t` that must not be modified or freed if ``result`` is not ``NULL``. Otherwise, returns ``NULL``. .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey_result_new.rst000066400000000000000000000010241511661753600340620ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey_result_new mongoc_client_encryption_rewrap_many_datakey_result_new() ========================================================= Synopsis -------- .. code-block:: c mongoc_client_encryption_rewrap_many_datakey_result_t * mongoc_client_encryption_rewrap_many_datakey_result_new (void); Returns ------- A new :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_t` that must be freed with :symbol:`mongoc_client_encryption_rewrap_many_datakey_result_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_rewrap_many_datakey_result_t.rst000066400000000000000000000014461511661753600335440ustar00rootroot00000000000000:man_page: mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_rewrap_many_datakey_result_t ===================================================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_rewrap_many_datakey_result_t; Used to access the result of :symbol:`mongoc_client_encryption_rewrap_many_datakey()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_rewrap_many_datakey_result_new mongoc_client_encryption_rewrap_many_datakey_result_destroy mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result .. seealso:: | :symbol:`mongoc_client_encryption_rewrap_many_datakey()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_encryption_t.rst000066400000000000000000000036141511661753600260370ustar00rootroot00000000000000:man_page: mongoc_client_encryption_t mongoc_client_encryption_t ========================== Synopsis -------- .. code-block:: c typedef struct _mongoc_client_encryption_t mongoc_client_encryption_t; ``mongoc_client_encryption_t`` provides utility functions for `In-Use Encryption `_. Thread Safety ------------- :symbol:`mongoc_client_encryption_t` is NOT thread-safe and should only be used in the same thread as the :symbol:`mongoc_client_t` that is configured via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`. Lifecycle --------- The key vault client, configured via :symbol:`mongoc_client_encryption_opts_set_keyvault_client()`, must outlive the :symbol:`mongoc_client_encryption_t`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_encryption_new mongoc_client_encryption_destroy mongoc_client_encryption_create_datakey mongoc_client_encryption_create_encrypted_collection mongoc_client_encryption_rewrap_many_datakey mongoc_client_encryption_delete_key mongoc_client_encryption_get_crypt_shared_version mongoc_client_encryption_get_key mongoc_client_encryption_get_keys mongoc_client_encryption_add_key_alt_name mongoc_client_encryption_remove_key_alt_name mongoc_client_encryption_get_key_by_alt_name mongoc_client_encryption_encrypt mongoc_client_encryption_encrypt_expression mongoc_client_encryption_decrypt .. seealso:: | :symbol:`mongoc_client_enable_auto_encryption()` | :symbol:`mongoc_client_pool_enable_auto_encryption()` | `In-Use Encryption `_ for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_find_databases_with_opts.rst000066400000000000000000000022331511661753600303450ustar00rootroot00000000000000:man_page: mongoc_client_find_databases_with_opts mongoc_client_find_databases_with_opts() ======================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_client_find_databases_with_opts ( mongoc_client_t *client, const bson_t *opts); Fetches a cursor containing documents, each corresponding to a database on this MongoDB server. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. .. |opts-source| replace:: ``client`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listDatabases command `_. Errors ------ Use :symbol:`mongoc_cursor_error` on the returned cursor to check for errors. Returns ------- A cursor where each result corresponds to the server's representation of a database. The cursor functions :symbol:`mongoc_cursor_set_limit`, :symbol:`mongoc_cursor_set_batch_size`, and :symbol:`mongoc_cursor_set_max_await_time_ms` have no use on the returned cursor. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_collection.rst000066400000000000000000000016551511661753600263170ustar00rootroot00000000000000:man_page: mongoc_client_get_collection mongoc_client_get_collection() ============================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_client_get_collection (mongoc_client_t *client, const char *db, const char *collection); Get a newly allocated :symbol:`mongoc_collection_t` for the collection named ``collection`` in the database named ``db``. .. tip:: Collections are automatically created on the MongoDB server upon insertion of the first document. There is no need to create a collection manually. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db``: The name of the database containing the collection. * ``collection``: The name of the collection. Returns ------- A newly allocated :symbol:`mongoc_collection_t` that should be freed with :symbol:`mongoc_collection_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_crypt_shared_version.rst000066400000000000000000000021461511661753600304140ustar00rootroot00000000000000:man_page: mongoc_client_get_crypt_shared_version mongoc_client_get_crypt_shared_version() ======================================== Synopsis -------- .. code-block:: c const char * mongoc_client_get_crypt_shared_version (const mongoc_client_t *client); Obtain the version string of the crypt_shared_ that is loaded for auto-encryption on the given ``client``. If no crypt_shared_ library is loaded, the returned pointer will be ``NULL``. Parameters ---------- * ``client``: A live :symbol:`mongoc_client_t` Returns ------- A pointer to a null-terminated character array string designating the version of crypt_shared_ that was loaded for auto-encryption with ``client``. If no crypt_shared_ library is loaded, or auto-encryption is not loaded for the given ``client``, the returned pointer will be ``NULL``. The pointed-to array must not be modified or freed. The returned pointer is only valid for the lifetime of ``client``. .. _crypt_shared: https://www.mongodb.com/docs/manual/core/queryable-encryption/reference/shared-library/ .. seealso:: - :symbol:`mongoc_client_encryption_get_crypt_shared_version` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_database.rst000066400000000000000000000014321511661753600257210ustar00rootroot00000000000000:man_page: mongoc_client_get_database mongoc_client_get_database() ============================ Synopsis -------- .. code-block:: c mongoc_database_t * mongoc_client_get_database (mongoc_client_t *client, const char *name); Get a newly allocated :symbol:`mongoc_database_t` for the database named ``name``. .. tip:: Databases are automatically created on the MongoDB server upon insertion of the first document into a collection. There is no need to create a database manually. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``name``: The name of the database. Returns ------- A newly allocated :symbol:`mongoc_database_t ` that should be freed with :symbol:`mongoc_database_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_database_names.rst000066400000000000000000000016351511661753600271110ustar00rootroot00000000000000:man_page: mongoc_client_get_database_names mongoc_client_get_database_names() ================================== .. warning:: .. deprecated:: 1.9.0 Use :symbol:`mongoc_client_get_database_names_with_opts()` instead. Synopsis -------- .. code-block:: c char ** mongoc_client_get_database_names (mongoc_client_t *client, bson_error_t *error); Description ----------- This function queries the MongoDB server for a list of known databases. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A ``NULL`` terminated vector of ``NULL-byte`` terminated strings. The result should be freed with :symbol:`bson:bson_strfreev()`. ``NULL`` is returned upon failure and ``error`` is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_database_names_with_opts.rst000066400000000000000000000031341511661753600312050ustar00rootroot00000000000000:man_page: mongoc_client_get_database_names_with_opts mongoc_client_get_database_names_with_opts() ============================================ Synopsis -------- .. code-block:: c char ** mongoc_client_get_database_names_with_opts (mongoc_client_t *client, const bson_t *opts, bson_error_t *error); This function queries the MongoDB server for a list of known databases. .. include:: includes/retryable-read.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``client`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listDatabases command `_. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A ``NULL`` terminated vector of ``NULL-byte`` terminated strings. The result should be freed with :symbol:`bson:bson_strfreev()`. ``NULL`` is returned upon failure and ``error`` is set. Examples -------- .. code-block:: c { bson_error_t error; char **strv; unsigned i; if ((strv = mongoc_client_get_database_names_with_opts (client, NULL, &error))) { for (i = 0; strv[i]; i++) printf ("%s\n", strv[i]); bson_strfreev (strv); } else { fprintf (stderr, "Command failed: %s\n", error.message); } } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_default_database.rst000066400000000000000000000023111511661753600274220ustar00rootroot00000000000000:man_page: mongoc_client_get_default_database mongoc_client_get_default_database() ==================================== Synopsis -------- .. code-block:: c mongoc_database_t * mongoc_client_get_default_database (mongoc_client_t *client); Get the database named in the MongoDB connection URI, or ``NULL`` if the URI specifies none. Useful when you want to choose which database to use based only on the URI in a configuration file. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A newly allocated :symbol:`mongoc_database_t ` that should be freed with :symbol:`mongoc_database_destroy()`. Example ------- .. code-block:: c :caption: Default Database Example /* default database is "db_name" */ mongoc_client_t *client = mongoc_client_new ("mongodb://host/db_name"); mongoc_database_t *db = mongoc_client_get_default_database (client); assert (!strcmp ("db_name", mongoc_database_get_name (db))); mongoc_database_destroy (db); mongoc_client_destroy (client); /* no default database */ client = mongoc_client_new ("mongodb://host/"); db = mongoc_client_get_default_database (client); assert (!db); mongoc_client_destroy (client); mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_gridfs.rst000066400000000000000000000022421511661753600254330ustar00rootroot00000000000000:man_page: mongoc_client_get_gridfs mongoc_client_get_gridfs() ========================== Synopsis -------- .. code-block:: c mongoc_gridfs_t * mongoc_client_get_gridfs (mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error); The ``mongoc_client_get_gridfs()`` function shall create a new :symbol:`mongoc_gridfs_t`. The ``db`` parameter is the name of the database which the gridfs instance should exist in. The ``prefix`` parameter corresponds to the gridfs collection namespacing; its default is "fs", thus the default GridFS collection names are "fs.files" and "fs.chunks". Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db``: The database name. * ``prefix``: Optional prefix for gridfs collection names or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- On success, returns a :symbol:`mongoc_gridfs_t` you must free with :symbol:`mongoc_gridfs_destroy()`. Returns ``NULL`` upon failure and sets ``error``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_handshake_description.rst000066400000000000000000000055501511661753600305130ustar00rootroot00000000000000:man_page: mongoc_client_get_handshake_description mongoc_client_get_handshake_description() ========================================= Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_get_handshake_description (mongoc_client_t *client, uint32_t server_id, bson_t *opts, bson_error_t *error); Returns a description constructed from the initial handshake response to a server. Description ----------- :symbol:`mongoc_client_get_handshake_description` is distinct from :symbol:`mongoc_client_get_server_description`. :symbol:`mongoc_client_get_server_description` returns a server description constructed from monitoring, which may differ from the server description constructed from the connection handshake. :symbol:`mongoc_client_get_handshake_description` will attempt to establish a connection to the server if a connection was not already established. It will perform the MongoDB handshake and authentication if required. Use this function only for building a language driver that wraps the C Driver. When writing applications in C, higher-level functions automatically select a suitable server. Single-threaded client behavior ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Single-threaded clients only have one active connection to each server. The one connection is used for both monitoring and application operations. However, the server description returned by :symbol:`mongoc_client_get_handshake_description` may still differ from the server description returned by :symbol:`mongoc_client_get_server_description`. Notably, if connected to a load balanced cluster, the server description returned by :symbol:`mongoc_client_get_server_description` will describe the load balancer server (:symbol:`mongoc_server_description_type` will return "LoadBalancer"). And the server description returned by :symbol:`mongoc_client_get_handshake_description` will describe the backing server. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``server_id``: The ID of the server. This can be obtained from the server description of :symbol:`mongoc_client_select_server`. * ``opts``: Unused. Pass ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If a connection has not been successfully established to a server, returns ``NULL`` and ``error`` is filled out. See Also -------- - :symbol:`mongoc_client_select_server` To select a server from read preferences. - :symbol:`mongoc_client_get_server_description` To obtain the server description from monitoring for a server. - :symbol:`mongoc_server_description_type` To obtain the type of server from a server description. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_read_concern.rst000066400000000000000000000007421511661753600266020ustar00rootroot00000000000000:man_page: mongoc_client_get_read_concern mongoc_client_get_read_concern() ================================ Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_client_get_read_concern (const mongoc_client_t *client); Retrieve the default read concern configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_read_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_read_prefs.rst000066400000000000000000000007331511661753600262720ustar00rootroot00000000000000:man_page: mongoc_client_get_read_prefs mongoc_client_get_read_prefs() ============================== Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_client_get_read_prefs (const mongoc_client_t *client); Retrieves the default read preferences configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_read_prefs_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_server_description.rst000066400000000000000000000012221511661753600300630ustar00rootroot00000000000000:man_page: mongoc_client_get_server_description mongoc_client_get_server_description() ====================================== Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_get_server_description ( mongoc_client_t *client, uint32_t server_id); Get information about the server specified by ``server_id``. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``server_id``: An opaque id specifying the server. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If the server is no longer in the topology, returns NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_server_descriptions.rst000066400000000000000000000031711511661753600302530ustar00rootroot00000000000000:man_page: mongoc_client_get_server_descriptions mongoc_client_get_server_descriptions() ======================================= Synopsis -------- .. code-block:: c mongoc_server_description_t ** mongoc_client_get_server_descriptions (const mongoc_client_t *client, size_t *n); Fetches an array of :symbol:`mongoc_server_description_t` structs for all known servers in the topology. Returns no servers until the client connects. Returns a single server if the client is directly connected, or all members of a replica set if the client's MongoDB URI includes a "replicaSet" option, or all known mongos servers if the MongoDB URI includes a list of them. .. code-block:: c void show_servers (const mongoc_client_t *client) { bson_t *b = BCON_NEW ("ping", BCON_INT32 (1)); bson_error_t error; bool r; mongoc_server_description_t **sds; size_t i, n; /* ensure client has connected */ r = mongoc_client_command_simple (client, "db", b, NULL, NULL, &error); if (!r) { MONGOC_ERROR ("could not connect: %s\n", error.message); return; } sds = mongoc_client_get_server_descriptions (client, &n); for (i = 0; i < n; ++i) { printf ("%s\n", mongoc_server_description_host (sds[i])->host_and_port); } mongoc_server_descriptions_destroy_all (sds, n); bson_destroy (&b); } Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``n``: Receives the length of the descriptions array. Returns ------- A newly allocated array that must be freed with :symbol:`mongoc_server_descriptions_destroy_all`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_uri.rst000066400000000000000000000006351511661753600247600ustar00rootroot00000000000000:man_page: mongoc_client_get_uri mongoc_client_get_uri() ======================= Synopsis -------- .. code-block:: c const mongoc_uri_t * mongoc_client_get_uri (const mongoc_client_t *client); Fetches the :symbol:`mongoc_uri_t` used to create the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_uri_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_get_write_concern.rst000066400000000000000000000007511511661753600270210ustar00rootroot00000000000000:man_page: mongoc_client_get_write_concern mongoc_client_get_write_concern() ================================= Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_client_get_write_concern (const mongoc_client_t *client); Retrieve the default write concern configured for the client instance. The result should not be modified or freed. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. Returns ------- A :symbol:`mongoc_write_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_new.rst000066400000000000000000000011441511661753600241070ustar00rootroot00000000000000:man_page: mongoc_client_new mongoc_client_new() =================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new (const char *uri_string); Creates a new :symbol:`mongoc_client_t` using the URI string provided. Parameters ---------- * ``uri_string``: A string containing the MongoDB connection URI. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and an error or warning will be logged. .. seealso:: | :symbol:`mongoc_client_new_from_uri()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_new_from_uri.rst000066400000000000000000000011701511661753600260100ustar00rootroot00000000000000:man_page: mongoc_client_new_from_uri mongoc_client_new_from_uri() ============================ Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new_from_uri (const mongoc_uri_t *uri); Creates a new :symbol:`mongoc_client_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and an error will be logged. .. seealso:: | :symbol:`mongoc_client_new_from_uri_with_error()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_new_from_uri_with_error.rst000066400000000000000000000014211511661753600302530ustar00rootroot00000000000000:man_page: mongoc_client_new_from_uri_with_error mongoc_client_new_from_uri_with_error() ======================================= Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_new_from_uri_with_error (const mongoc_uri_t *uri, bson_error_t *error); Creates a new :symbol:`mongoc_client_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A newly allocated :symbol:`mongoc_client_t` that should be freed with :symbol:`mongoc_client_destroy()` when no longer in use. On error, ``NULL`` is returned and ``error`` will be populated with the error description. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_destroy.rst000066400000000000000000000014171511661753600260430ustar00rootroot00000000000000:man_page: mongoc_client_pool_destroy mongoc_client_pool_destroy() ============================ Synopsis -------- .. code-block:: c void mongoc_client_pool_destroy (mongoc_client_pool_t *pool); Release all resources associated with ``pool``, including freeing the structure. All :symbol:`mongoc_client_t` objects obtained from :symbol:`mongoc_client_pool_pop()` from ``pool`` must be pushed back onto the pool with :symbol:`mongoc_client_pool_push()` prior to calling :symbol:`mongoc_client_pool_destroy()`. This method is NOT thread safe, and must only be called by one thread. It should be called once the application is shutting down, and after all other threads that use clients have been joined. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_enable_auto_encryption.rst000066400000000000000000000040561511661753600311040ustar00rootroot00000000000000:man_page: mongoc_client_pool_enable_auto_encryption mongoc_client_pool_enable_auto_encryption() =========================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_enable_auto_encryption (mongoc_client_pool_t *pool, mongoc_auto_encryption_opts_t* opts, bson_error_t* error); Enable automatic client side encryption on a :symbol:`mongoc_client_pool_t`. Requires libmongoc to be built with support for In-Use Encryption. See `In-Use Encryption `_ for instructions to enable In-Use Encryption in libmongoc. Automatic encryption is an enterprise-only feature that only applies to operations on a collection. Automatic encryption is not supported for operations on a database or view, and operations that are not bypassed will result in error. To bypass automatic encryption for all operations, bypass automatic encryption with :symbol:`mongoc_auto_encryption_opts_set_bypass_auto_encryption()` in ``opts``. Automatic encryption requires the authenticated user to have the `listCollections privilege action `_. Enabling automatic encryption reduces the maximum message size and may have a negative performance impact. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A required :symbol:`mongoc_auto_encryption_opts_t`. * ``error``: A :symbol:`bson_error_t` which is set on error. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` otherwise. .. seealso:: | :symbol:`mongoc_auto_encryption_opts_t` | :symbol:`mongoc_client_enable_auto_encryption()` | `In-Use Encryption `_ for libmongoc | The MongoDB Manual for `Client-Side Field Level Encryption `_ | The MongoDB Manual for `Queryable Encryption `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_max_size.rst000066400000000000000000000011221511661753600261620ustar00rootroot00000000000000:man_page: mongoc_client_pool_max_size mongoc_client_pool_max_size() ============================= Synopsis -------- .. code-block:: c void mongoc_client_pool_max_size (mongoc_client_pool_t *pool, uint32_t max_pool_size); This function sets the maximum number of pooled connections available from a :symbol:`mongoc_client_pool_t`. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``max_pool_size``: The maximum number of connections which shall be available from the pool. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_new.rst000066400000000000000000000012051511661753600251360ustar00rootroot00000000000000:man_page: mongoc_client_pool_new mongoc_client_pool_new() ======================== Synopsis -------- .. code-block:: c mongoc_client_pool_t * mongoc_client_pool_new (const mongoc_uri_t *uri); This function creates a new :symbol:`mongoc_client_pool_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Returns ------- A newly allocated :symbol:`mongoc_client_pool_t` that should be freed with :symbol:`mongoc_client_pool_destroy()` when no longer in use. On error, ``NULL`` is returned and an error may be logged. .. seealso:: | :symbol:`mongoc_client_pool_new_with_error()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_new_with_error.rst000066400000000000000000000014371511661753600274110ustar00rootroot00000000000000:man_page: mongoc_client_pool_new_with_error mongoc_client_pool_new_with_error() =================================== Synopsis -------- .. code-block:: c mongoc_client_pool_t * mongoc_client_pool_new_with_error (const mongoc_uri_t *uri, bson_error_t *error); This function creates a new :symbol:`mongoc_client_pool_t` using the :symbol:`mongoc_uri_t` provided. Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A newly allocated :symbol:`mongoc_client_pool_t` that should be freed with :symbol:`mongoc_client_pool_destroy()` when no longer in use. On error, ``NULL`` is returned and ``error`` will be populated with the error description. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_pop.rst000066400000000000000000000022321511661753600251440ustar00rootroot00000000000000:man_page: mongoc_client_pool_pop mongoc_client_pool_pop() ======================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_pool_pop (mongoc_client_pool_t *pool); Retrieve a :symbol:`mongoc_client_t` from the client pool, or create one. The total number of clients that can be created from this pool is limited by the URI option "maxPoolSize", default 100. If this number of clients has been created and all are in use, ``mongoc_client_pool_pop`` blocks until another thread returns a client with :symbol:`mongoc_client_pool_push()`. If the "waitQueueTimeoutMS" URI option was specified with a positive value, then ``mongoc_client_pool_pop`` will return ``NULL`` when the timeout expires. The returned :symbol:`mongoc_client_t` must be returned to the pool with :symbol:`mongoc_client_pool_push()`. .. note:: Return a checked out :symbol:`mongoc_client_t` to the pool with :symbol:`mongoc_client_pool_push` quickly to encourage reuse of clients among threads. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. Returns ------- A :symbol:`mongoc_client_t`. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_push.rst000066400000000000000000000007161511661753600253320ustar00rootroot00000000000000:man_page: mongoc_client_pool_push mongoc_client_pool_push() ========================= Synopsis -------- .. code-block:: c void mongoc_client_pool_push (mongoc_client_pool_t *pool, mongoc_client_t *client); This function returns a :symbol:`mongoc_client_t` back to the client pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``client``: A :symbol:`mongoc_client_t`. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_apm_callbacks.rst000066400000000000000000000022311511661753600277740ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_apm_callbacks mongoc_client_pool_set_apm_callbacks() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_apm_callbacks (mongoc_client_pool_t *pool, mongoc_apm_callbacks_t *callbacks, void *context); Register a set of callbacks to receive Application Performance Monitoring events. The ``callbacks`` are copied by the pool and may be safely destroyed by the caller after this API call completes. If a ``context`` is passed, it is the application's responsibility to ensure ``context`` remains valid for the lifetime of the pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``callbacks``: A :symbol:`mongoc_apm_callbacks_t`. * ``context``: Optional pointer to include with each event notification. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. .. include:: includes/mongoc_client_pool_call_once.txt .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_appname.rst000066400000000000000000000014001511661753600266360ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_appname mongoc_client_pool_set_appname() ================================ Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_appname (mongoc_client_pool_t *pool, const char *appname) This function is identical to :symbol:`mongoc_client_set_appname()` except for client pools. Also note that :symbol:`mongoc_client_set_appname()` cannot be called on a client retrieved from a client pool. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``appname``: The application name, of length at most ``MONGOC_HANDSHAKE_APPNAME_MAX``. Returns ------- Returns true if appname was set. If appname is too long, returns false and logs an error. .. include:: includes/mongoc_client_pool_call_once.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_error_api.rst000066400000000000000000000014121511661753600272020ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_error_api mongoc_client_pool_set_error_api() ================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_error_api (mongoc_client_pool_t *client, int32_t version); Configure how the C Driver reports errors. See :ref:`Setting the Error API Version `. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``version``: The version of the error API, either ``MONGOC_ERROR_API_VERSION_LEGACY`` or ``MONGOC_ERROR_API_VERSION_2``. Returns ------- Returns true if the error API version was set, or logs an error message and returns false if ``version`` is invalid. .. include:: includes/mongoc_client_pool_call_once.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_oidc_callback.rst000066400000000000000000000015041511661753600277540ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_oidc_callback mongoc_client_pool_set_oidc_callback() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_oidc_callback(mongoc_client_pool_t *pool, const mongoc_oidc_callback_t *callback); Register a callback for the ``MONGODB-OIDC`` authentication mechanism. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``callback``: A :symbol:`mongoc_oidc_callback_t`. Returns ------- Returns true on success. Returns false and logs on error. .. include:: includes/mongoc_client_pool_call_once.txt .. seealso:: | :doc:`mongoc_client_set_oidc_callback` for setting a callback on a single-threaded client. | :doc:`mongoc_oidc_callback_t` | :doc:`mongoc_oidc_callback_params_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_server_api.rst000066400000000000000000000015001511661753600273550ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_server_api mongoc_client_pool_set_server_api() =================================== Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_server_api (mongoc_client_pool_t *pool, const mongoc_server_api_t *api, bson_error_t *error); Set the API version to use for clients created through ``pool``. Once the API version is set on a pool, it may not be changed to a new value. Attempting to do so will cause this method to fail and set ``error``. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``api``: A :symbol:`mongoc_server_api_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- True if the version was successfully set, false if not. On failure, ``error`` will be set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_ssl_opts.rst000066400000000000000000000024611511661753600270730ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_ssl_opts mongoc_client_pool_set_ssl_opts() ================================= Synopsis -------- .. code-block:: c #ifdef MONGOC_ENABLE_SSL void mongoc_client_pool_set_ssl_opts (mongoc_client_pool_t *pool, const mongoc_ssl_opt_t *opts); #endif .. note:: |ssl:naming| This function is identical to :symbol:`mongoc_client_set_ssl_opts()` except for client pools. It ensures that all clients retrieved from :symbol:`mongoc_client_pool_pop()` or :symbol:`mongoc_client_pool_try_pop()` are configured with the same TLS settings. The :symbol:`mongoc_ssl_opt_t` struct is copied by the pool along with the strings it points to (``pem_file``, ``pem_pwd``, ``ca_file``, ``ca_dir``, and ``crl_file``) so they don't have to remain valid after the call to :symbol:`mongoc_client_pool_set_ssl_opts`. A call to :symbol:`mongoc_client_pool_set_ssl_opts` overrides all TLS options set through the connection string with which the :symbol:`mongoc_client_pool_t` was constructed. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``opts``: A :symbol:`mongoc_ssl_opt_t`. .. include:: includes/mongoc_client_pool_call_once.txt Availability ------------ This feature requires that the MongoDB C driver was compiled with ``-DENABLE_SSL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_set_structured_log_opts.rst000066400000000000000000000033321511661753600313350ustar00rootroot00000000000000:man_page: mongoc_client_pool_set_structured_log_opts mongoc_client_pool_set_structured_log_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_client_pool_set_structured_log_opts (mongoc_client_pool_t *pool, const mongoc_structured_log_opts_t *opts); Reconfigures this client pool's structured logging subsystem. See :doc:`structured_log`. The :symbol:`mongoc_structured_log_opts_t` is copied by the pool and may be safely destroyed by the caller after this API call completes. The application is responsible for ensuring any ``user_data`` referenced by ``opts`` remains valid for the lifetime of the pool. By default, the :symbol:`mongoc_client_pool_t` will have log options captured from the environment during :symbol:`mongoc_client_pool_new`. See :symbol:`mongoc_structured_log_opts_new` for a list of the supported options. The structured logging subsystem may be disabled by passing NULL as ``opts`` or equivalently by passing NULL as the :symbol:`mongoc_structured_log_func_t` in :symbol:`mongoc_structured_log_opts_set_handler`. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. * ``opts``: A :symbol:`mongoc_structured_log_opts_t` allocated with :symbol:`mongoc_structured_log_opts_new`, or NULL to disable structured logging. Returns ------- Returns true when used correctly. If called multiple times per pool or after the first client is initialized, returns false and logs a warning. .. include:: includes/mongoc_client_pool_call_once.txt Thread safety within the handler is the application's responsibility. Handlers may be invoked concurrently by multiple pool users. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_t.rst000066400000000000000000000026101511661753600246110ustar00rootroot00000000000000:man_page: mongoc_client_pool_t mongoc_client_pool_t ==================== A connection pool for multi-threaded programs. See `Connection Pooling `_. Synopsis -------- .. code-block:: c typedef struct _mongoc_client_pool_t mongoc_client_pool_t ``mongoc_client_pool_t`` is the basis for multi-threading in the MongoDB C driver. Since :symbol:`mongoc_client_t` structures are not thread-safe, this structure is used to retrieve a new :symbol:`mongoc_client_t` for a given thread. This structure *is thread-safe*, except for its destructor method, :symbol:`mongoc_client_pool_destroy`, which *is not thread-safe* and must only be called from one thread. Example ------- .. literalinclude:: ../examples/example-pool.c :language: c :caption: example-pool.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_pool_destroy mongoc_client_pool_enable_auto_encryption mongoc_client_pool_max_size mongoc_client_pool_new mongoc_client_pool_new_with_error mongoc_client_pool_pop mongoc_client_pool_push mongoc_client_pool_set_apm_callbacks mongoc_client_pool_set_appname mongoc_client_pool_set_error_api mongoc_client_pool_set_oidc_callback mongoc_client_pool_set_server_api mongoc_client_pool_set_ssl_opts mongoc_client_pool_set_structured_log_opts mongoc_client_pool_try_pop mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_pool_try_pop.rst000066400000000000000000000013671511661753600260520ustar00rootroot00000000000000:man_page: mongoc_client_pool_try_pop mongoc_client_pool_try_pop() ============================ Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_pool_try_pop (mongoc_client_pool_t *pool); This function is identical to :symbol:`mongoc_client_pool_pop()` except it will return ``NULL`` instead of blocking for a client to become available. .. note:: Return a checked out :symbol:`mongoc_client_t` to the pool with :symbol:`mongoc_client_pool_push` quickly to encourage reuse of clients among threads. Parameters ---------- * ``pool``: A :symbol:`mongoc_client_pool_t`. Returns ------- A :symbol:`mongoc_client_t` if one is immediately available, otherwise ``NULL``. .. include:: includes/mongoc_client_pool_thread_safe.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_read_command_with_opts.rst000066400000000000000000000043361511661753600300350ustar00rootroot00000000000000:man_page: mongoc_client_read_command_with_opts mongoc_client_read_command_with_opts() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_read_command_with_opts (mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that read, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/read-cmd-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. |generic-cmd| replace:: :symbol:`mongoc_client_command_with_opts` .. include:: includes/retryable-read.txt .. include:: includes/retryable-read-command.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. _mongoc_client_read_command_with_opts_example: Example ------- .. literalinclude:: ../examples/example-command-with-opts.c :language: c :caption: example-command-with-opts.c mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_read_write_command_with_opts.rst000066400000000000000000000040301511661753600312360ustar00rootroot00000000000000:man_page: mongoc_client_read_write_command_with_opts mongoc_client_read_write_command_with_opts() ============================================ Synopsis -------- .. code-block:: c bool mongoc_client_read_write_command_with_opts ( mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* UNUSED */, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic for commands that both read and write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/read-write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. (The :symbol:`mongoc_read_prefs_t` parameter was included by mistake when this function was introduced in libmongoc 1.5. A command that writes must not obey a read preference.) Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: Ignored. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_reset.rst000066400000000000000000000020131511661753600244340ustar00rootroot00000000000000:man_page: mongoc_client_reset mongoc_client_reset() ===================== Synopsis -------- .. code-block:: c void mongoc_client_reset (mongoc_client_t *client); Call this method in the child after forking to invalidate the :symbol:`mongoc_client_t`. Description ----------- Calling :symbol:`mongoc_client_reset()` prevents resource cleanup in the child process from interfering with the parent process. This method causes the client to clear its session pool without sending endSessions. It also increments an internal generation counter on the given client. After this method is called, cursors from previous generations will not issue a killCursors command when they are destroyed. Client sessions from previous generations cannot be used and should be destroyed. .. warning:: This method should only be called on single threaded clients. Calling :symbol:`mongoc_client_reset()` on a multi threaded client is a no-op and will result in a warning. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_select_server.rst000066400000000000000000000024271511661753600261700ustar00rootroot00000000000000:man_page: mongoc_client_select_server mongoc_client_select_server() ============================= Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_client_select_server (mongoc_client_t *client, bool for_writes, const mongoc_read_prefs_t *prefs, bson_error_t *error); Choose a server for an operation, according to the logic described in the Server Selection Spec. Use this function only for building a language driver that wraps the C Driver. When writing applications in C, higher-level functions automatically select a suitable server. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``for_writes``: Whether to choose a server suitable for writes or reads. * ``prefs``: An optional :symbol:`mongoc_read_prefs_t`. If ``for_writes`` is true, ``prefs`` must be NULL. Otherwise, use ``prefs`` to customize server selection, or pass NULL to use read preference PRIMARY. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Returns ------- A :symbol:`mongoc_server_description_t` that must be freed with :symbol:`mongoc_server_description_destroy`. If no suitable server is found, returns NULL and ``error`` is filled out. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_abort_transaction.rst000066400000000000000000000014431511661753600305770ustar00rootroot00000000000000:man_page: mongoc_client_session_abort_transaction mongoc_client_session_abort_transaction() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_abort_transaction (mongoc_client_session_t *session, bson_error_t *error); Abort a multi-document transaction. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was aborted. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with no transaction in progress. Network or server errors are ignored. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_advance_cluster_time.rst000066400000000000000000000020111511661753600312330ustar00rootroot00000000000000:man_page: mongoc_client_session_advance_cluster_time mongoc_client_session_advance_cluster_time() ============================================ Synopsis -------- .. code-block:: c void mongoc_client_session_advance_cluster_time (mongoc_client_session_t *session, const bson_t *cluster_time); Advance the cluster time for a session. Has an effect only if the new cluster time is greater than the session's current cluster time. Use :symbol:`mongoc_client_session_advance_operation_time` and :symbol:`mongoc_client_session_advance_cluster_time` to copy the operationTime and clusterTime from another session, ensuring subsequent operations in this session are causally consistent with the last operation in the other session Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``cluster_time``: The session's new cluster time, as a :symbol:`bson:bson_t` like `{"cluster time": }`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_advance_operation_time.rst000066400000000000000000000022371511661753600315640ustar00rootroot00000000000000:man_page: mongoc_client_session_advance_operation_time mongoc_client_session_advance_operation_time() ============================================== Synopsis -------- .. code-block:: c void mongoc_client_session_advance_operation_time (mongoc_client_session_t *session, uint32_t timestamp, uint32_t increment); Advance the session's operation time, expressed as a BSON Timestamp with timestamp and increment components. Has an effect only if the new operation time is greater than the session's current operation time. Use :symbol:`mongoc_client_session_advance_operation_time` and :symbol:`mongoc_client_session_advance_cluster_time` to copy the operationTime and clusterTime from another session, ensuring subsequent operations in this session are causally consistent with the last operation in the other session Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``timestamp``: The new operationTime's timestamp component. * ``increment``: The new operationTime's increment component. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_append.rst000066400000000000000000000020131511661753600263240ustar00rootroot00000000000000:man_page: mongoc_client_session_append mongoc_client_session_append() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_session_append (const mongoc_client_session_t *client_session, bson_t *opts, bson_error_t *error); Parameters ---------- * ``client_session``: A pointer to a :symbol:`mongoc_client_session_t`. * ``opts``: A pointer to a :symbol:`bson:bson_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function appends a logical session id to command options. Use it to configure a session for any function that takes an options document, such as :symbol:`mongoc_client_write_command_with_opts`. It is an error to use a session for unacknowledged writes. Returns ------- Returns true on success. If any arguments are invalid, returns false and fills out ``error``. Example ------- See the example code for :symbol:`mongoc_client_session_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_commit_transaction.rst000066400000000000000000000020241511661753600307540ustar00rootroot00000000000000:man_page: mongoc_client_session_commit_transaction mongoc_client_session_commit_transaction() ========================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_commit_transaction (mongoc_client_session_t *session, bson_t *reply, bson_error_t *error); Commit a multi-document transaction. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was committed. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with no transaction in progress, or if there is a server or network error. If a ``reply`` is supplied, it is always initialized and must be freed with :symbol:`bson:bson_destroy`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_destroy.rst000066400000000000000000000011621511661753600265520ustar00rootroot00000000000000:man_page: mongoc_client_session_destroy mongoc_client_session_destroy() =============================== Synopsis -------- .. code-block:: c void mongoc_client_session_destroy (mongoc_client_session_t *session); End a session, returning its session id to the pool, and free all client resources associated with the session. If a multi-document transaction is in progress, abort it. Does nothing if ``session`` is NULL. See the example code for :symbol:`mongoc_client_session_t`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_client.rst000066400000000000000000000011051511661753600271730ustar00rootroot00000000000000:man_page: mongoc_client_session_get_client mongoc_client_session_get_client() ================================== Synopsis -------- .. code-block:: c mongoc_client_t * mongoc_client_session_get_client (const mongoc_client_session_t *session); Returns the :symbol:`mongoc_client_t` from which this session was created. See :symbol:`mongoc_client_start_session()`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`mongoc_client_t` that should not be freed. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_cluster_time.rst000066400000000000000000000013021511661753600304130ustar00rootroot00000000000000:man_page: mongoc_client_session_get_cluster_time mongoc_client_session_get_cluster_time() ======================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_client_session_get_cluster_time (const mongoc_client_session_t *session); Get the session's clusterTime as a BSON document. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- If the session has not been used for any operation and :symbol:`mongoc_client_session_advance_cluster_time()` has not been called, a :symbol:`bson:bson_t` that is valid only for the lifetime of ``session``. Otherwise, ``NULL``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_dirty.rst000066400000000000000000000014301511661753600270510ustar00rootroot00000000000000:man_page: mongoc_client_session_get_dirty mongoc_client_session_get_dirty() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_get_dirty (const mongoc_client_session_t *session); Indicates whether ``session`` has been marked "dirty" as defined in the `driver sessions specification `_. Parameters ---------- * ``session``: A const :symbol:`mongoc_client_session_t`. Description ----------- This function is intended for use by drivers that wrap libmongoc. It is not useful in client applications. Returns ------- A boolean indicating whether the session has been marked "dirty". .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_lsid.rst000066400000000000000000000011061511661753600266510ustar00rootroot00000000000000:man_page: mongoc_client_session_get_lsid mongoc_client_session_get_lsid() ================================ Synopsis -------- .. code-block:: c const bson_t * mongoc_client_session_get_lsid (mongoc_client_session_t *session); Get the server-side "logical session ID" associated with this :symbol:`mongoc_client_session_t` as a BSON document. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`bson:bson_t` that is valid only for the lifetime of ``session``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_operation_time.rst000066400000000000000000000015741511661753600307450ustar00rootroot00000000000000:man_page: mongoc_client_session_get_operation_time mongoc_client_session_get_operation_time() ========================================== Synopsis -------- .. code-block:: c void mongoc_client_session_get_operation_time (const mongoc_client_session_t *session, uint32_t *timestamp, uint32_t *increment); Get the session's operationTime, expressed as a BSON Timestamp with timestamp and increment components. If the session has not been used for any operations, the timestamp and increment are 0. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``timestamp``: A pointer to a ``uint32_t`` to receive the timestamp component. * ``increment``: A pointer to a ``uint32_t`` to receive the increment component. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_opts.rst000066400000000000000000000011151511661753600267030ustar00rootroot00000000000000:man_page: mongoc_client_session_get_opts mongoc_client_session_get_opts() ================================ Synopsis -------- .. code-block:: c const mongoc_session_opt_t * mongoc_client_session_get_opts (const mongoc_client_session_t *session); Get a reference to the :symbol:`mongoc_session_opt_t` with which this session was configured. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A :symbol:`mongoc_session_opt_t` that is valid only for the lifetime of ``session``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_server_id.rst000066400000000000000000000011041511661753600276760ustar00rootroot00000000000000:man_page: mongoc_client_session_get_server_id mongoc_client_session_get_server_id() ===================================== Synopsis -------- .. code-block:: c uint32_t mongoc_client_session_get_server_id (const mongoc_client_session_t *session); Get the "server ID" of the ``mongos`` this :symbol:`mongoc_client_session_t` is pinned to. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- A server ID or ``0`` if this :symbol:`mongoc_client_session_t` is not pinned. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_get_transaction_state.rst000066400000000000000000000010431511661753600314430ustar00rootroot00000000000000:man_page: mongoc_client_session_get_transaction_state mongoc_client_session_get_transaction_state() ============================================= Synopsis -------- .. code-block:: c mongoc_transaction_state_t mongoc_client_session_get_transaction_state (const mongoc_client_session_t *session); Returns the current transaction state for this session. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Return ------ Returns a :symbol:`mongoc_transaction_state_t` that represents the current transaction state. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_in_transaction.rst000066400000000000000000000010151511661753600300710ustar00rootroot00000000000000:man_page: mongoc_client_session_in_transaction mongoc_client_session_in_transaction() ====================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_in_transaction (const mongoc_client_session_t *session); Check whether a multi-document transaction is in progress for this session. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Return ------ Returns true if a transaction was started and has not been committed or aborted, otherwise ``false``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_start_transaction.rst000066400000000000000000000037351511661753600306330ustar00rootroot00000000000000:man_page: mongoc_client_session_start_transaction mongoc_client_session_start_transaction() ========================================= Synopsis -------- .. code-block:: c bool mongoc_client_session_start_transaction (mongoc_client_session_t *session, const mongoc_transaction_opt_t *opts, bson_error_t *error); Start a multi-document transaction for all following operations in this session. Any options provided in ``opts`` override options passed to :symbol:`mongoc_session_opts_set_default_transaction_opts`, and options inherited from the :symbol:`mongoc_client_t`. The ``opts`` argument is copied and can be freed after calling this function. The transaction must be completed with :symbol:`mongoc_client_session_commit_transaction` or :symbol:`mongoc_client_session_abort_transaction`. An in-progress transaction is automatically aborted by :symbol:`mongoc_client_session_destroy`. If a command inside of the transaction fails, it may cause the transaction on the server to be aborted. An attempt to commit such transaction will be rejected with ``NoSuchTransaction`` error. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``opts``: A :symbol:`mongoc_transaction_opt_t` or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Return ------ Returns true if the transaction was started. Returns ``false`` and sets ``error`` if there are invalid arguments, such as a session with a transaction already in progress. .. _mongoc_client_session_start_transaction_example: Example ------- The following example demonstrates how to use :ref:`error labels ` to reliably execute a multi-document transaction despite network errors and other transient failures. .. literalinclude:: ../examples/example-transaction.c :language: c :caption: example-transaction.c .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_t.rst000066400000000000000000000027331511661753600253310ustar00rootroot00000000000000:man_page: mongoc_client_session_t :tags: session mongoc_client_session_t ======================= Use a session for a sequence of operations, optionally with causal consistency. See `the MongoDB Manual Entry for Causal Consistency `_. Synopsis -------- .. include:: includes/session-lifecycle.txt Fork Safety ----------- A :symbol:`mongoc_client_session_t` is only usable in the parent process after a fork. The child process must call :symbol:`mongoc_client_reset` on the ``client`` field. Example ------- .. literalinclude:: ../examples/example-session.c :language: c :caption: example-session.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_session_start_transaction mongoc_client_session_in_transaction mongoc_client_session_get_transaction_state mongoc_client_session_commit_transaction mongoc_client_session_abort_transaction mongoc_client_session_advance_cluster_time mongoc_client_session_advance_operation_time mongoc_client_session_with_transaction mongoc_client_session_append mongoc_client_session_get_client mongoc_client_session_get_cluster_time mongoc_client_session_get_dirty mongoc_client_session_get_operation_time mongoc_client_session_get_opts mongoc_client_session_get_lsid mongoc_client_session_get_server_id mongoc_client_session_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_with_transaction.rst000066400000000000000000000055651511661753600304540ustar00rootroot00000000000000:man_page: mongoc_client_session_with_transaction mongoc_client_session_with_transaction() ======================================== Synopsis -------- .. code-block:: c bool mongoc_client_session_with_transaction (mongoc_client_session_t *session, mongoc_client_session_with_transaction_cb_t cb, const mongoc_transaction_opt_t *opts, void *ctx, bson_t *reply, bson_error_t *error); This method will start a new transaction on ``session``, run ``cb``, and then commit the transaction. If it cannot commit the transaction, the entire sequence may be retried, and ``cb`` may be run multiple times. ``ctx`` will be passed to ``cb`` each time it is called. This method has an internal time limit of 120 seconds, and will retry until that time limit is reached. This timeout is not configurable. ``cb`` should not attempt to start new transactions, but should simply run operations meant to be contained within a transaction. The ``cb`` does not need to commit transactions; this is handled by the :symbol:`mongoc_client_session_with_transaction`. If ``cb`` does commit or abort a transaction, however, this method will return without taking further action. If a command inside ``cb`` fails, it may cause the transaction on the server to be aborted. This situation is normally handled transparently by the driver. However, if the application does not return that error from ``cb``, the driver will not be able to determine whether the transaction was aborted or not. The driver will then retry ``cb`` indefinitely. To avoid this situation, the application MUST NOT silently handle errors within ``cb``. If the application needs to handle errors within ``cb``, it MUST return them after doing so. The parameter ``reply`` is initialized even upon failure to simplify memory management. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``cb``: A :symbol:`mongoc_client_session_with_transaction_cb_t` callback, which will run inside of a new transaction on the session. See example below. * ``opts``: An optional :symbol:`mongoc_transaction_opt_t`. * ``ctx``: A ``void*``. This user-provided data will be passed to ``cb``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t` or ``NULL``. Return ------ Returns ``true`` if the transaction was completed successfully. Otherwise, returns ``false`` in case of failure. In cases of failure ``error`` will also be set, except if the passed-in ``cb`` fails without setting ``error``. If a non-NULL ``reply`` is passed in, ``reply`` will be set to the value of the last server response, except if the passed-in ``cb`` fails without setting a ``reply``. Example ------- .. literalinclude:: ../examples/example-with-transaction-cb.c :language: c :caption: Use with_transaction() to run a callback within a transaction mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_session_with_transaction_cb_t.rst000066400000000000000000000024111511661753600314260ustar00rootroot00000000000000:man_page: mongoc_client_session_with_transaction_cb_t mongoc_client_session_with_transaction_cb_t =========================================== Synopsis -------- .. code-block:: c typedef bool (*mongoc_client_session_with_transaction_cb_t) ( mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error); Provide this callback to :symbol:`mongoc_client_session_with_transaction`. The callback should run a sequence of operations meant to be contained within a transaction. The callback should not attempt to start or commit transactions. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. * ``ctx``: A ``void*`` set to the the user-provided ``ctx`` passed to :symbol:`mongoc_client_session_with_transaction`. * ``reply``: An optional location for a :symbol:`bson_t` or ``NULL``. The callback should set this if it runs any operations against the server and receives replies. * ``error``: A :symbol:`bson_error_t`. The callback should set this if it receives any errors while running operations against the server. Return ------ Returns ``true`` for success and ``false`` on failure. If ``cb`` returns ``false`` then it should also set ``error``. .. seealso:: | :symbol:`mongoc_client_session_with_transaction` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_apm_callbacks.rst000066400000000000000000000021511511661753600267440ustar00rootroot00000000000000:man_page: mongoc_client_set_apm_callbacks mongoc_client_set_apm_callbacks() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_set_apm_callbacks (mongoc_client_t *client, mongoc_apm_callbacks_t *callbacks, void *context); Register a set of callbacks to receive Application Performance Monitoring events. The ``callbacks`` are copied by the client and may be safely destroyed by the caller after this API call completes. If a ``context`` is passed, it is the application's responsibility to ensure ``context`` remains valid for the lifetime of the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``callbacks``: Optional :symbol:`mongoc_apm_callbacks_t`. Pass NULL to clear all callbacks. * ``context``: Optional pointer to include with each event notification. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_appname.rst000066400000000000000000000020151511661753600256100ustar00rootroot00000000000000:man_page: mongoc_client_set_appname mongoc_client_set_appname() =========================== Synopsis -------- .. code-block:: c bool mongoc_client_set_appname (mongoc_client_t *client, const char *appname) Sets the application name for this client. This string, along with other internal driver details, is sent to the server as part of the initial connection handshake (`"hello" `_). ``appname`` is copied, and doesn't have to remain valid after the call to ``mongoc_client_set_appname()``. This function will log an error and return false in the following cases: * ``appname`` is longer than ``MONGOC_HANDSHAKE_APPNAME_MAX`` * ``client`` has already initiated a handshake * ``client`` is from a :symbol:`mongoc_client_pool_t` Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``appname``: The application name, of length at most ``MONGOC_HANDSHAKE_APPNAME_MAX``. Returns ------- true if the appname is set successfully. Otherwise, false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_error_api.rst000066400000000000000000000013241511661753600261530ustar00rootroot00000000000000:man_page: mongoc_client_set_error_api mongoc_client_set_error_api() ============================= Synopsis -------- .. code-block:: c bool mongoc_client_set_error_api (mongoc_client_t *client, int32_t version); Configure how the C Driver reports errors. See :ref:`Setting the Error API Version `. Do not use this function with pooled clients, see :symbol:`mongoc_client_pool_set_error_api`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``version``: The version of the error API, either ``MONGOC_ERROR_API_VERSION_LEGACY`` or ``MONGOC_ERROR_API_VERSION_2``. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_oidc_callback.rst000066400000000000000000000013521511661753600267240ustar00rootroot00000000000000:man_page: mongoc_client_set_oidc_callback mongoc_client_set_oidc_callback() ================================= Synopsis -------- .. code-block:: c bool mongoc_client_set_oidc_callback(mongoc_client_t *client, const mongoc_oidc_callback_t *callback); Register a callback for the ``MONGODB-OIDC`` authentication mechanism. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``callback``: A :symbol:`mongoc_oidc_callback_t`. Returns ------- Returns true on success. Returns false and logs on error. .. seealso:: | :doc:`mongoc_client_pool_set_oidc_callback` for setting a callback on a pooled client. | :doc:`mongoc_oidc_callback_t` | :doc:`mongoc_oidc_callback_params_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_read_concern.rst000066400000000000000000000015771511661753600266250ustar00rootroot00000000000000:man_page: mongoc_client_set_read_concern mongoc_client_set_read_concern() ================================ Synopsis -------- .. code-block:: c void mongoc_client_set_read_concern (mongoc_client_t *client, const mongoc_read_concern_t *read_concern); Sets the read concern for the client. This only affects future operations, collections, and databases inheriting from ``client``. The default read concern is MONGOC_READ_CONCERN_LEVEL_LOCAL. This is the correct read concern for the great majority of applications. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the read concern with the :ref:`MongoDB URI ` instead. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``read_concern``: A :symbol:`mongoc_read_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_read_prefs.rst000066400000000000000000000015721511661753600263100ustar00rootroot00000000000000:man_page: mongoc_client_set_read_prefs mongoc_client_set_read_prefs() ============================== Synopsis -------- .. code-block:: c void mongoc_client_set_read_prefs (mongoc_client_t *client, const mongoc_read_prefs_t *read_prefs); Sets the default read preferences to use with future operations upon ``client``. The global default is to read from the replica set primary. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the read preferences with the :ref:`MongoDB URI ` instead. Please see the MongoDB website for a description of `Read Preferences `_. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_server_api.rst000066400000000000000000000014101511661753600263240ustar00rootroot00000000000000:man_page: mongoc_client_set_server_api mongoc_client_set_server_api() ============================== Synopsis -------- .. code-block:: c bool mongoc_client_set_server_api (mongoc_client_t *client, const mongoc_server_api_t *api, bson_error_t *error); Set the API version to use for ``client``. Once the API version is set on a client, it may not be changed to a new value. Attempting to do so will cause this method to fail and set ``error``. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``api``: A :symbol:`mongoc_server_api_t`. * ``error``: A :symbol:`bson_error_t`. Returns ------- True if the version was successfully set, false if not. On failure, ``error`` will be set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_sockettimeoutms.rst000066400000000000000000000012471511661753600274340ustar00rootroot00000000000000:man_page: mongoc_client_set_sockettimeoutms mongoc_client_set_sockettimeoutms() =================================== Synopsis -------- .. code-block:: c void mongoc_client_set_sockettimeoutms (mongoc_client_t *client, int32_t timeoutms); Change the ``sockettimeoutms`` of the :symbol:`mongoc_client_t`. If ``client`` was obtained from a :symbol:`mongoc_client_pool_t`, the socket timeout is restored to the previous value when calling :symbol:`mongoc_client_pool_push`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``timeoutms``: The requested timeout value in milliseconds. .. seealso:: | :ref:`URI Connection Options ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_ssl_opts.rst000066400000000000000000000026651511661753600260500ustar00rootroot00000000000000:man_page: mongoc_client_set_ssl_opts mongoc_client_set_ssl_opts() ============================ Synopsis -------- .. code-block:: c #ifdef MONGOC_ENABLE_SSL void mongoc_client_set_ssl_opts (mongoc_client_t *client, const mongoc_ssl_opt_t *opts); #endif .. note:: |ssl:naming| Sets the TLS (SSL) options to use when connecting to TLS enabled MongoDB servers. The :symbol:`mongoc_ssl_opt_t` struct is copied by the client along with the strings it points to (``pem_file``, ``pem_pwd``, ``ca_file``, ``ca_dir``, and ``crl_file``) so they don't have to remain valid after the call to :symbol:`mongoc_client_set_ssl_opts`. A call to :symbol:`mongoc_client_set_ssl_opts` overrides all TLS options set through the connection string with which the :symbol:`mongoc_client_t` was constructed. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. Instead, call :symbol:`mongoc_client_pool_set_ssl_opts` on the pool before popping any clients. .. versionchanged:: 2.0.0 This function logs an error and immediately returns if ``client`` is from a :symbol:`mongoc_client_pool_t`. Previously this function unsafely applied the options to the pooled client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`mongoc_ssl_opt_t`. Availability ------------ This feature requires that the MongoDB C driver was compiled with ``-DENABLE_SSL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_stream_initiator.rst000066400000000000000000000026661511661753600275600ustar00rootroot00000000000000:man_page: mongoc_client_set_stream_initiator mongoc_client_set_stream_initiator() ==================================== Synopsis -------- .. code-block:: c void mongoc_client_set_stream_initiator (mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data); The :symbol:`mongoc_client_set_stream_initiator()` function shall associate a given :symbol:`mongoc_client_t` with a new stream initiator. This will completely replace the default transport (buffered TCP, possibly with TLS). The ``initiator`` should fulfill the :symbol:`mongoc_stream_t` contract. ``user_data`` is passed through to the ``initiator`` callback and may be used for whatever run time customization is necessary. It is a programming error to call this function on a :symbol:`mongoc_client_t` from a :symbol:`mongoc_client_pool_t`. .. versionchanged:: 2.0.0 This function logs an error and immediately returns if ``client`` is from a :symbol:`mongoc_client_pool_t`. Previously this function unsafely applied the initiator to the pooled client. If ``user_data`` is passed, it is the application's responsibility to ensure ``user_data`` remains valid for the lifetime of the client. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``initiator``: A :symbol:`mongoc_stream_initiator_t `. * ``user_data``: User supplied pointer for callback function. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_structured_log_opts.rst000066400000000000000000000033131511661753600303030ustar00rootroot00000000000000:man_page: mongoc_client_set_structured_log_opts mongoc_client_set_structured_log_opts() ======================================= Synopsis -------- .. code-block:: c bool mongoc_client_set_structured_log_opts (mongoc_client_t *client, const mongoc_structured_log_opts_t *opts); Reconfigures this client's structured logging subsystem. See :doc:`structured_log`. This function must not be called on clients that are part of a :symbol:`mongoc_client_pool_t`. Structured logging for pools must be configured with :symbol:`mongoc_client_pool_set_structured_log_opts` before the first call to :symbol:`mongoc_client_pool_pop`. The :symbol:`mongoc_structured_log_opts_t` is copied by the client and may be safely destroyed by the caller after this API call completes. The application is responsible for ensuring any ``user_data`` referenced by ``opts`` remains valid for the lifetime of the client. By default, the :symbol:`mongoc_client_t` will have log options captured from the environment during :symbol:`mongoc_client_new`. See :symbol:`mongoc_structured_log_opts_new` for a list of the supported options. The structured logging subsystem may be disabled by passing NULL as ``opts`` or equivalently by passing NULL as the :symbol:`mongoc_structured_log_func_t` in :symbol:`mongoc_structured_log_opts_set_handler`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: A :symbol:`mongoc_structured_log_opts_t` allocated with :symbol:`mongoc_structured_log_opts_new`, or NULL to disable structured logging. Returns ------- Returns true when used correctly. If called on a pooled client, returns false and logs a warning. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_set_write_concern.rst000066400000000000000000000017371511661753600270420ustar00rootroot00000000000000:man_page: mongoc_client_set_write_concern mongoc_client_set_write_concern() ================================= Synopsis -------- .. code-block:: c void mongoc_client_set_write_concern (mongoc_client_t *client, const mongoc_write_concern_t *write_concern); Sets the write concern for the client. This only affects future operations, collections, and databases inheriting from ``client``. The default write concern is MONGOC_WRITE_CONCERN_W_DEFAULT: the driver blocks awaiting basic acknowledgement of write operations from MongoDB. This is the correct write concern for the great majority of applications. It is a programming error to call this function on a client from a :symbol:`mongoc_client_pool_t`. For pooled clients, set the write concern with the :ref:`MongoDB URI ` instead. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_start_session.rst000066400000000000000000000021041511661753600262130ustar00rootroot00000000000000:man_page: mongoc_client_start_session mongoc_client_start_session() ============================= Synopsis -------- .. code-block:: c mongoc_client_session_t * mongoc_client_start_session (mongoc_client_t *client, mongoc_session_opt_t *opts, bson_error_t *error) Create a session for a sequence of operations. .. include:: includes/session-lifecycle.txt Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``opts``: An optional :symbol:`mongoc_session_opt_t`. * ``error``: A :symbol:`bson:bson_error_t`. Returns ------- If successful, this function returns a newly allocated :symbol:`mongoc_client_session_t` that should be freed with :symbol:`mongoc_client_session_destroy()` when no longer in use. On error, returns NULL and sets ``error``. Errors ------ This function can fail if the driver is not built with crypto support, if ``opts`` is misconfigured, or if the session is configured with options that the server does not support. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_t.rst000066400000000000000000000061201511661753600235600ustar00rootroot00000000000000:man_page: mongoc_client_t mongoc_client_t =============== A single-threaded MongoDB connection. See `Connection Pooling `_. Synopsis -------- .. code-block:: c typedef struct _mongoc_client_t mongoc_client_t; typedef mongoc_stream_t *(*mongoc_stream_initiator_t) ( const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error); ``mongoc_client_t`` is an opaque type that provides access to a MongoDB server, replica set, or sharded cluster. It maintains management of underlying sockets and routing to individual nodes based on :symbol:`mongoc_read_prefs_t` or :symbol:`mongoc_write_concern_t`. Streams ------- The underlying transport for a given client can be customized, wrapped or replaced by any implementation that fulfills :symbol:`mongoc_stream_t`. A custom transport can be set with :symbol:`mongoc_client_set_stream_initiator()`. Thread Safety ------------- ``mongoc_client_t`` is *NOT* thread-safe and should only be used from one thread at a time. When used in multi-threaded scenarios, it is recommended that you use the thread-safe :symbol:`mongoc_client_pool_t` to retrieve a ``mongoc_client_t`` for your thread. Fork Safety ----------- A :symbol:`mongoc_client_t` is only usable in the parent process after a fork. The child process must call :symbol:`mongoc_client_reset`. Example ------- .. literalinclude:: ../examples/example-client.c :language: c :caption: example-client.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_client_bulkwrite_new mongoc_client_command_simple mongoc_client_command_simple_with_server_id mongoc_client_command_with_opts mongoc_client_destroy mongoc_client_enable_auto_encryption mongoc_client_find_databases_with_opts mongoc_client_get_collection mongoc_client_get_crypt_shared_version mongoc_client_get_database mongoc_client_get_database_names mongoc_client_get_database_names_with_opts mongoc_client_get_default_database mongoc_client_get_gridfs mongoc_client_get_handshake_description mongoc_client_get_read_concern mongoc_client_get_read_prefs mongoc_client_get_server_description mongoc_client_get_server_descriptions mongoc_client_get_uri mongoc_client_get_write_concern mongoc_client_new mongoc_client_new_from_uri mongoc_client_new_from_uri_with_error mongoc_client_read_command_with_opts mongoc_client_read_write_command_with_opts mongoc_client_reset mongoc_client_select_server mongoc_client_set_apm_callbacks mongoc_client_set_appname mongoc_client_set_error_api mongoc_client_set_oidc_callback mongoc_client_set_read_concern mongoc_client_set_read_prefs mongoc_client_set_server_api mongoc_client_set_sockettimeoutms mongoc_client_set_ssl_opts mongoc_client_set_stream_initiator mongoc_client_set_structured_log_opts mongoc_client_set_write_concern mongoc_client_start_session mongoc_client_watch mongoc_client_write_command_with_opts mongoc_handshake_data_append mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_watch.rst000066400000000000000000000031411511661753600244230ustar00rootroot00000000000000:man_page: mongoc_client_watch mongoc_client_watch() ===================== Synopsis -------- .. code-block:: c mongoc_change_stream_t* mongoc_client_watch (mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts); A helper function to create a change stream. It is preferred to call this function over using a raw aggregation to create a change stream. This function uses the read preference and read concern of the client. If the change stream needs to re-establish connection, the same read preference will be used. This may happen if the change stream encounters a resumable error. .. warning:: A change stream is only supported with majority read concern. .. include:: includes/retryable-read.txt Parameters ---------- * ``db``: A :symbol:`mongoc_client_t` specifying the client which the change stream listens to. * ``pipeline``: A :symbol:`bson:bson_t` representing an aggregation pipeline appended to the change stream. This may be an empty document. * ``opts``: A :symbol:`bson:bson_t` containing change stream options. .. include:: includes/change-stream-opts.txt Returns ------- A newly allocated :symbol:`mongoc_change_stream_t` which must be freed with :symbol:`mongoc_change_stream_destroy` when no longer in use. The returned :symbol:`mongoc_change_stream_t` is never ``NULL``. If there is an error, it can be retrieved with :symbol:`mongoc_change_stream_error_document`, and subsequent calls to :symbol:`mongoc_change_stream_next` will return ``false``. .. seealso:: | :doc:`mongoc_database_watch` | :doc:`mongoc_collection_watch` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_client_write_command_with_opts.rst000066400000000000000000000046121511661753600302510ustar00rootroot00000000000000:man_page: mongoc_client_write_command_with_opts mongoc_client_write_command_with_opts() ======================================= Synopsis -------- .. code-block:: c bool mongoc_client_write_command_with_opts (mongoc_client_t *client, const char *db_name, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``client`` .. include:: includes/write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Basic Write Operations ---------------------- Do not use this function to call the basic write commands "insert", "update", and "delete". Those commands require special logic not implemented in ``mongoc_client_write_command_with_opts``. For basic write operations use CRUD functions such as :symbol:`mongoc_collection_insert_one` and the others described in `the CRUD tutorial `_, or use the `Bulk API `_. Example ------- .. literalinclude:: ../examples/example-command-with-opts.c :language: c :caption: example-command-with-opts.c mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_aggregate.rst000066400000000000000000000107651511661753600261320ustar00rootroot00000000000000:man_page: mongoc_collection_aggregate mongoc_collection_aggregate() ============================= Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_aggregate (mongoc_collection_t *collection, mongoc_query_flags_t flags, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_query_flags_t`. Not all flag values apply. In particular, setting ``MONGOC_QUERY_EXHAUST`` results in an error. * ``pipeline``: A :symbol:`bson:bson_t`, either a BSON array or a BSON document containing an array field named "pipeline". * ``opts``: A :symbol:`bson:bson_t` containing options for the command, or ``NULL``. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/aggregate-opts.txt For a list of all options, see `the MongoDB Manual entry on the aggregate command `_. .. include:: includes/retryable-read-aggregate.txt Description ----------- This function creates a cursor which sends the aggregate command on the underlying collection upon the first call to :symbol:`mongoc_cursor_next()`. For more information on building aggregation pipelines, see `the MongoDB Manual entry on the aggregate command `_. Read preferences, read and write concern, and collation can be overridden by various sources. The highest-priority sources for these options are listed first in the following table. In a transaction, read concern and write concern are prohibited in ``opts`` and the read preference must be primary or NULL. Write concern is applied from ``opts``, or if ``opts`` has no write concern and the aggregation pipeline includes "$out", the write concern is applied from ``collection``. The write concern is omitted for MongoDB before 3.4. ================== ============== ============== ========= Read Preferences Read Concern Write Concern Collation ================== ============== ============== ========= ``read_prefs`` ``opts`` ``opts`` ``opts`` Transaction Transaction Transaction ``collection`` ``collection`` ``collection`` ================== ============== ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. Returns ------- .. include:: includes/returns-cursor.txt Example ------- .. code-block:: c #include #include static mongoc_cursor_t * pipeline_query (mongoc_collection_t *collection) { mongoc_cursor_t *cursor; bson_t *pipeline; pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "foo", BCON_UTF8 ("A"), "}", "}", "{", "$match", "{", "bar", BCON_BOOL (false), "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); return cursor; } Other Parameters ---------------- When using ``$out``, the pipeline stage that writes, the write_concern field of the :symbol:`mongoc_cursor_t` will be set to the :symbol:`mongoc_write_concern_t` parameter, if it is valid, and applied to the write command when :symbol:`mongoc_cursor_next()` is called. Pass any other parameters to the ``aggregate`` command, besides ``pipeline``, as fields in ``opts``: .. code-block:: c mongoc_write_concern_t *write_concern = mongoc_write_concern_new (); mongoc_write_concern_set_w (write_concern, 3); pipeline = BCON_NEW ("pipeline", "[", "{", "$out", BCON_UTF8 ("collection2"), "}", "]"); opts = BCON_NEW ("bypassDocumentValidation", BCON_BOOL (true)); mongoc_write_concern_append (write_concern, opts); cursor = mongoc_collection_aggregate ( collection1, MONGOC_QUERY_NONE, pipeline, opts, NULL); mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_command_simple.rst000066400000000000000000000035611511661753600271670ustar00rootroot00000000000000:man_page: mongoc_collection_command_simple mongoc_collection_command_simple() ================================== Synopsis -------- .. code-block:: c bool mongoc_collection_command_simple (mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command to execute. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- The collection's read preference, read concern, and write concern are not applied to the command. The parameter ``reply`` is initialized even upon failure to simplify memory management. This function tries to unwrap an embedded error in the command when possible. The unwrapped error will be propagated via the ``error`` parameter. Additionally, the result document is set in ``reply``. .. include:: includes/not-retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. Example ------- The following is an example of executing the ``ping`` command. .. literalinclude:: ../examples/example-collection-command.c :start-after: BEGIN:mongoc_collection_command :end-before: END:mongoc_collection_command mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_command_with_opts.rst000066400000000000000000000034261511661753600277160ustar00rootroot00000000000000:man_page: mongoc_collection_command_with_opts mongoc_collection_command_with_opts() ===================================== Synopsis -------- .. code-block:: c bool mongoc_collection_command_with_opts ( mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, interpreting ``opts`` according to the MongoDB server version. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``collection`` .. include:: includes/opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. .. include:: includes/not-retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. The reply is not parsed for a write concern timeout or write concern error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_copy.rst000066400000000000000000000015141511661753600251460ustar00rootroot00000000000000:man_page: mongoc_collection_copy mongoc_collection_copy() ======================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_collection_copy (mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Performs a deep copy of the ``collection`` struct and its configuration. Useful if you intend to call :symbol:`mongoc_collection_set_write_concern`, :symbol:`mongoc_collection_set_read_prefs`, or :symbol:`mongoc_collection_set_read_concern`, and want to preserve an unaltered copy of the struct. This function does *not* copy the contents of the collection on the MongoDB server. Returns ------- A newly allocated :symbol:`mongoc_collection_t` that should be freed with :symbol:`mongoc_collection_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_count_documents.rst000066400000000000000000000044171511661753600274120ustar00rootroot00000000000000:man_page: mongoc_collection_count_documents mongoc_collection_count_documents() =================================== Synopsis -------- .. code-block:: c int64_t mongoc_collection_count_documents (mongoc_collection_t *collection, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``filter``: A :symbol:`bson:bson_t` containing the filter. * ``opts``: A :symbol:`bson:bson_t`, ``NULL`` to ignore. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/count-document-opts.txt Other options are included in the sent ``aggregate`` command. For a list of all options, see `the MongoDB Manual entry on the aggregate command `_. Description ----------- This functions executes a count query on ``collection``. In contrast with :symbol:`mongoc_collection_estimated_document_count()`, the count returned is guaranteed to be accurate. .. include:: includes/retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Example ------- .. code-block:: c #include #include #include static void print_count (mongoc_collection_t *collection, bson_t *filter) { bson_error_t error; int64_t count; bson_t* opts = BCON_NEW ("skip", BCON_INT64(5)); count = mongoc_collection_count_documents ( collection, filter, opts, NULL, NULL, &error); bson_destroy (opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } .. seealso:: | :symbol:`mongoc_collection_estimated_document_count()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_create_bulk_operation_with_opts.rst000066400000000000000000000024061511661753600326350ustar00rootroot00000000000000:man_page: mongoc_collection_create_bulk_operation_with_opts mongoc_collection_create_bulk_operation_with_opts() =================================================== Synopsis -------- .. code-block:: c mongoc_bulk_operation_t * mongoc_collection_create_bulk_operation_with_opts ( mongoc_collection_t *collection, const bson_t *opts); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. .. |opts-source| replace:: ``collection`` .. include:: includes/bulk-opts.txt Description ----------- This function shall begin a new bulk operation. After creating this you may call various functions such as :symbol:`mongoc_bulk_operation_update()`, :symbol:`mongoc_bulk_operation_insert()` and others. After calling :symbol:`mongoc_bulk_operation_execute()` the commands will be executed in as large as batches as reasonable by the client. Errors ------ Errors are propagated when executing the bulk operation. Returns ------- A newly allocated :symbol:`mongoc_bulk_operation_t` that should be freed with :symbol:`mongoc_bulk_operation_destroy()` when no longer in use. .. warning:: Failure to handle the result of this function is a programming error. .. seealso:: | `Bulk Write Operations `_ | :symbol:`mongoc_bulk_operation_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_create_indexes_with_opts.rst000066400000000000000000000047271511661753600312670ustar00rootroot00000000000000:man_page: mongoc_collection_create_indexes_with_opts mongoc_collection_create_indexes_with_opts() ============================================ Synopsis -------- .. code-block:: c typedef struct _mongoc_index_model_t mongoc_index_model_t; mongoc_index_model_t * mongoc_index_model_new (const bson_t *keys, const bson_t *opts); void mongoc_index_model_destroy (mongoc_index_model_t *model); bool mongoc_collection_create_indexes_with_opts (mongoc_collection_t *collection, mongoc_index_model_t **models, size_t n_models, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``models``: An array of ``mongoc_index_model_t *``. * ``n_models``: The number of ``models``. * ``opts``: Optional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Additional options passed in ``opts`` are appended to the ``createIndexes`` command. See the `MongoDB Manual for createIndexes `_ for all supported options. If no write concern is provided in ``opts``, the collection's write concern is used. mongoc_index_model_t ```````````````````` Each ``mongoc_index_model_t`` represents an index to create. ``mongoc_index_model_new`` includes: * ``keys`` Expected to match the form of the ``key`` field in the `createIndexes `_ command. * ``opts`` Optional index options appended as a sibling to the ``key`` field in the `createIndexes `_ command. Description ----------- This function wraps around the `createIndexes `_ command. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. seealso:: | `Manage Collection Indexes `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_delete_many.rst000066400000000000000000000027521511661753600264670ustar00rootroot00000000000000:man_page: mongoc_collection_delete_many mongoc_collection_delete_many() =============================== Synopsis -------- .. code-block:: c bool mongoc_collection_delete_many (mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/delete-many-opts.txt Description ----------- This function removes all documents in the given ``collection`` that match ``selector``. To delete at most one matching document, use :symbol:`mongoc_collection_delete_one`. If you pass a non-NULL ``reply``, it is filled out with the field "deletedCount". If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_delete_one.rst000066400000000000000000000027441511661753600263050ustar00rootroot00000000000000:man_page: mongoc_collection_delete_one mongoc_collection_delete_one() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_delete_one (mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/delete-one-opts.txt Description ----------- This function removes at most one document in the given ``collection`` that matches ``selector``. To delete all matching documents, use :symbol:`mongoc_collection_delete_many`. If you pass a non-NULL ``reply``, it is filled out with the field "deletedCount". If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_destroy.rst000066400000000000000000000010531511661753600256630ustar00rootroot00000000000000:man_page: mongoc_collection_destroy mongoc_collection_destroy() =========================== Synopsis -------- .. code-block:: c void mongoc_collection_destroy (mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- This function shall destroy a :symbol:`mongoc_collection_t` and its associated resources. Does nothing if ``collection`` is NULL. .. warning:: Always destroy a :symbol:`mongoc_cursor_t` created from a collection before destroying the collection. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_drop.rst000066400000000000000000000010671511661753600251430ustar00rootroot00000000000000:man_page: mongoc_collection_drop mongoc_collection_drop() ======================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop (mongoc_collection_t *collection, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_collection_drop_with_opts()`. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_drop_index.rst000066400000000000000000000014151511661753600263270ustar00rootroot00000000000000:man_page: mongoc_collection_drop_index mongoc_collection_drop_index() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_index (mongoc_collection_t *collection, const char *index_name, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``index_name``: A string containing the name of the index. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_collection_drop_with_opts() `. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_drop_index_with_opts.rst000066400000000000000000000023041511661753600304250ustar00rootroot00000000000000:man_page: mongoc_collection_drop_index_with_opts mongoc_collection_drop_index_with_opts() ======================================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_index_with_opts (mongoc_collection_t *collection, const char *index_name, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``index_name``: A string containing the name of the index. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Description ----------- This function requests than an index on ``collection`` be dropped. If no write concern is provided in ``opts``, the collection's write concern is used. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. .. seealso:: | `Manage Collection Indexes `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_drop_with_opts.rst000066400000000000000000000045051511661753600272430ustar00rootroot00000000000000:man_page: mongoc_collection_drop_with_opts mongoc_collection_drop_with_opts() ================================== Synopsis -------- .. code-block:: c bool mongoc_collection_drop_with_opts (mongoc_collection_t *collection, bson_t *opts, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts.txt Description ----------- This function requests that a ``collection`` be dropped, including all indexes associated with the ``collection``. If no write concern is provided in ``opts``, the collection's write concern is used. If the collection does not exist, the server responds with an "ns not found" error. It is safe to ignore this error; set the :ref:`Error API Version ` to 2 and ignore server error code 26: .. code-block:: c mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bool r; client = mongoc_client_new (NULL); mongoc_client_set_error_api (client, 2); collection = mongoc_client_get_collection (client, "db", "collection"); r = mongoc_collection_drop_with_opts (collection, NULL /* opts */, &error); if (r) { printf ("Dropped.\n"); } else { printf ("Error message: %s\n", error.message); if (error.domain == MONGOC_ERROR_SERVER && error.code == 26) { printf ("Ignoring 'ns not found' error\n"); } else { fprintf (stderr, "Unrecognized error!\n"); } } mongoc_collection_destroy (collection); mongoc_client_destroy (client); In MongoDB 3.0 and older, the "ns not found" error code is the generic MONGOC_ERROR_QUERY_FAILURE; in this case check whether the error message is equal to the string "ns not found". The ``encryptedFields`` document in ``opts`` may be used to drop a collection for `Queryable Encryption `_. If ``encryptedFields`` is specified, the "ns not found" error is not returned. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns true if the collection was successfully dropped. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_estimated_document_count.rst000066400000000000000000000061141511661753600312620ustar00rootroot00000000000000:man_page: mongoc_collection_estimated_document_count mongoc_collection_estimated_document_count() ============================================ Synopsis -------- .. code-block:: c int64_t mongoc_collection_estimated_document_count (mongoc_collection_t *collection, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``opts``: A :symbol:`bson:bson_t`, ``NULL`` to ignore. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/read-opts.txt * ``skip``: An int specifying how many documents matching the ``query`` should be skipped before counting. * ``limit``: An int specifying the maximum number of documents to count. * ``comment``: A :symbol:`bson_value_t` specifying the comment to attach to this command. The comment will appear in log messages, profiler output, and currentOp output. Requires MongoDB 4.4 or later. For a list of all options, see `the MongoDB Manual entry on the count command `_. Description ----------- This functions executes a count query on ``collection``. In contrast with :symbol:`mongoc_collection_count_documents()`, the count returned is *not* guaranteed to be accurate. .. include:: includes/retryable-read.txt Behavior ^^^^^^^^ This method is implemented using the `count `_ command. Due to an oversight in versions 5.0.0-5.0.8 of MongoDB, the ``count`` command was not included in version "1" of the Stable API. Applications using this method with the Stable API are recommended to upgrade their server version to 5.0.9+ or disable strict mode (via `:symbol:`mongoc_server_api_strict()`) to avoid encountering errors. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- -1 on failure, otherwise the number of documents counted. Example ------- .. code-block:: c #include #include #include static void print_count (mongoc_collection_t *collection, bson_t *query) { bson_error_t error; int64_t count; bson_t* opts = BCON_NEW ("skip", BCON_INT64(5)); count = mongoc_collection_estimated_document_count ( collection, opts, NULL, NULL, &error); bson_destroy (opts); if (count < 0) { fprintf (stderr, "Count failed: %s\n", error.message); } else { printf ("%" PRId64 " documents counted.\n", count); } } .. seealso:: | :symbol:`mongoc_collection_count_documents()` | `Count: Behavior `_ in the MongoDB Manual mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_find_and_modify.rst000066400000000000000000000050261511661753600273070ustar00rootroot00000000000000:man_page: mongoc_collection_find_and_modify mongoc_collection_find_and_modify() =================================== Synopsis -------- .. code-block:: c bool mongoc_collection_find_and_modify (mongoc_collection_t *collection, const bson_t *query, const bson_t *sort, const bson_t *update, const bson_t *fields, bool _remove, bool upsert, bool _new, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``query``: A :symbol:`bson:bson_t` containing the query to locate target document(s). * ``sort``: A :symbol:`bson:bson_t` containing the sort order for ``query``. * ``update``: A :symbol:`bson:bson_t` containing an update spec. * ``fields``: An optional :symbol:`bson:bson_t` containing the fields to return or ``NULL``. * ``_remove``: If the matching documents should be removed. * ``upsert``: If an upsert should be performed. * ``_new``: If the new version of the document should be returned. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Update and return an object. This is a thin wrapper around the ``findAndModify`` command. Either ``update`` or ``_remove`` arguments are required. As of MongoDB 3.2, the :symbol:`mongoc_write_concern_t` specified on the :symbol:`mongoc_collection_t` will be used, if any. ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. On success, the output ``reply`` contains the full server reply to the ``findAndModify`` command. See the `MongoDB Manual page for findAndModify `_ for the expected server reply. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- If given invalid arguments or a server/network error occurs, returns ``false`` and sets ``error``. Otherwise, succeeds and returns ``true``. A write concern timeout or write concern error is considered a failure. .. seealso:: | :symbol:`mongoc_collection_find_and_modify_with_opts`. Example ------- .. literalinclude:: ../examples/find-and-modify.c :language: c :caption: find-and-modify.c mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_find_and_modify_with_opts.rst000066400000000000000000000033711511661753600314100ustar00rootroot00000000000000:man_page: mongoc_collection_find_and_modify_with_opts mongoc_collection_find_and_modify_with_opts() ============================================= Synopsis -------- .. code-block:: c bool mongoc_collection_find_and_modify_with_opts ( mongoc_collection_t *collection, const bson_t *query, const mongoc_find_and_modify_opts_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``query``: A :symbol:`bson:bson_t` containing the query to locate target document(s). * ``opts``: A :symbol:`find and modify options `. Must not be NULL. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Update and return an object. ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. If an unacknowledged write concern is set (through :symbol:`mongoc_find_and_modify_opts_append`), the output ``reply`` is always an empty document. On success, the output ``reply`` contains the full server reply to the ``findAndModify`` command. See the `MongoDB Manual page for findAndModify `_ for the expected server reply. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- See the example code for :ref:`mongoc_find_and_modify_opts_t `. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_find_indexes_with_opts.rst000066400000000000000000000026561511661753600307430ustar00rootroot00000000000000:man_page: mongoc_collection_find_indexes_with_opts mongoc_collection_find_indexes_with_opts() ========================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_find_indexes_with_opts (mongoc_collection_t *collection, const bson_t *opts); Fetches a cursor containing documents, each corresponding to an index on this collection. .. include:: includes/retryable-read.txt Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. .. |opts-source| replace:: ``collection`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listIndexes command `_. Errors ------ Use :symbol:`mongoc_cursor_error` on the returned cursor to check for errors. Returns ------- .. include:: includes/returns-cursor.txt In the returned cursor each result corresponds to the server's representation of an index on this collection. If the collection does not exist on the server, the cursor will be empty. The cursor functions :symbol:`mongoc_cursor_set_limit`, :symbol:`mongoc_cursor_set_batch_size`, and :symbol:`mongoc_cursor_set_max_await_time_ms` have no use on the returned cursor. .. seealso:: | `Manage Collection Indexes `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_find_with_opts.rst000066400000000000000000000170611511661753600272200ustar00rootroot00000000000000:man_page: mongoc_collection_find_with_opts mongoc_collection_find_with_opts() ================================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_collection_find_with_opts (mongoc_collection_t *collection, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``filter``: A :symbol:`bson:bson_t` containing the query to execute. * ``opts``: A :symbol:`bson:bson_t` query options, including sort order and which fields to return. Can be ``NULL``. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. Description ----------- Query on ``collection``, passing arbitrary query options to the server in ``opts``. To target a specific server, include an integer "serverId" field in ``opts`` with an id obtained first by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. .. |opts-source| replace:: ``collection`` .. include:: includes/read-opts-sources.txt .. include:: includes/retryable-read.txt Returns ------- .. include:: includes/returns-cursor.txt Examples -------- .. code-block:: c :caption: Print First Ten Documents in a Collection #include #include #include static void print_ten_documents (mongoc_collection_t *collection) { bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; char *str; /* filter by "foo": 1, order by "bar" descending */ filter = BCON_NEW ("foo", BCON_INT32 (1)); opts = BCON_NEW ( "limit", BCON_INT64 (10), "sort", "{", "bar", BCON_INT32 (-1), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "An error occurred: %s\n", error.message); } mongoc_cursor_destroy (cursor); bson_destroy (filter); bson_destroy (opts); } .. code-block:: c :caption: More examples of modifying the query with ``opts``: bson_t *filter; bson_t *opts; mongoc_read_prefs_t *read_prefs; filter = BCON_NEW ("foo", BCON_INT32 (1)); /* Include "field_name_one" and "field_name_two" in "projection", omit * others. "_id" must be specifically removed or it is included by default. */ opts = BCON_NEW ("projection", "{", "field_name_one", BCON_BOOL (true), "field_name_two", BCON_BOOL (true), "_id", BCON_BOOL (false), "}", "tailable", BCON_BOOL (true), "awaitData", BCON_BOOL (true), "sort", "{", "bar", BCON_INT32 (-1), "}", "collation", "{", "locale", BCON_UTF8("en_US"), "caseFirst", BCON_UTF8 ("lower"), "}"); read_prefs = mongoc_read_prefs_new (MONGOC_READ_SECONDARY); cursor = mongoc_collection_find_with_opts (collection, filter, opts, read_prefs); The following options are supported. ======================= ================== =================== ================== Option BSON type Option BSON type ======================= ================== =================== ================== ``projection`` document ``max`` document ``sort`` document ``maxTimeMS`` non-negative int64 ``skip`` non-negative int64 ``maxAwaitTimeMS`` non-negative int64 ``limit`` non-negative int64 ``min`` document ``batchSize`` non-negative int64 ``noCursorTimeout`` bool ``exhaust`` bool ``oplogReplay`` bool ``hint`` string or document ``readConcern`` document ``allowPartialResults`` bool ``returnKey`` bool ``awaitData`` bool ``sessionId`` (none) ``collation`` document ``showRecordId`` bool ``comment`` any ``singleBatch`` bool ``allowDiskUse`` bool ``let`` document ======================= ================== =================== ================== All options are documented in the reference page for `the "find" command`_ in the MongoDB server manual, except for "maxAwaitTimeMS", "sessionId", and "exhaust". "maxAwaitTimeMS" is the maximum amount of time for the server to wait on new documents to satisfy a query, if "tailable" and "awaitData" are both true. If no new documents are found, the tailable cursor receives an empty batch. The "maxAwaitTimeMS" option is ignored for MongoDB older than 3.4. To add a "sessionId", construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from ``collection``. Then use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. To add a "readConcern", construct a :symbol:`mongoc_read_concern_t` with :symbol:`mongoc_read_concern_new` and configure it with :symbol:`mongoc_read_concern_set_level`. Then use :symbol:`mongoc_read_concern_append` to add the read concern to ``opts``. "exhaust" requests the construction of an exhaust cursor. For some options like "collation", the driver returns an error if the server version is too old to support the feature. Any fields in ``opts`` that are not listed here are passed to the server unmodified. ``allowDiskUse`` is only supported in MongoDB 4.4+. ``comment`` only supports string values prior to MongoDB 4.4. Deprecated Options ------------------ The ``snapshot`` boolean option is removed in MongoDB 4.0. The ``maxScan`` option, a non-negative int64, is deprecated in MongoDB 4.0 and will be removed in a future MongoDB version. The ``oplogReplay`` boolean option is deprecated in MongoDB 4.4. All of these options are supported by the C Driver with older MongoDB versions. .. seealso:: | `The "find" command`_ in the MongoDB Manual. All options listed there are supported by the C Driver. For MongoDB servers before 3.2, the driver transparently converts the query to a legacy OP_QUERY message. .. _the "find" command: https://www.mongodb.com/docs/master/reference/command/find/ The "explain" command --------------------- With MongoDB before 3.2, a query with option ``$explain: true`` returns information about the query plan, instead of the query results. Beginning in MongoDB 3.2, there is a separate "explain" command. The driver will not convert "$explain" queries to "explain" commands, you must call the "explain" command explicitly: .. code-block:: c /* MongoDB 3.2+, "explain" command syntax */ command = BCON_NEW ("explain", "{", "find", BCON_UTF8 ("collection_name"), "filter", "{", "foo", BCON_INT32 (1), "}", "}"); mongoc_collection_command_simple (collection, command, NULL, &reply, &error); .. seealso:: | `The "explain" command `_ in the MongoDB Manual. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_get_name.rst000066400000000000000000000006431511661753600257550ustar00rootroot00000000000000:man_page: mongoc_collection_get_name mongoc_collection_get_name() ============================ Synopsis -------- .. code-block:: c const char * mongoc_collection_get_name (mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Fetches the name of ``collection``. Returns ------- A string which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_get_read_concern.rst000066400000000000000000000010561511661753600274560ustar00rootroot00000000000000:man_page: mongoc_collection_get_read_concern mongoc_collection_get_read_concern() ==================================== Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_collection_get_read_concern (const mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Fetches the default read concern to be used on read operations originating from ``collection``. Returns ------- A :symbol:`mongoc_read_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_get_read_prefs.rst000066400000000000000000000011061511661753600271420ustar00rootroot00000000000000:man_page: mongoc_collection_get_read_prefs mongoc_collection_get_read_prefs() ================================== Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_collection_get_read_prefs (const mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Fetches the default read preferences to use for ``collection``. Operations without specified read-preferences will default to this. Returns ------- A :symbol:`mongoc_read_prefs_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_get_write_concern.rst000066400000000000000000000011311511661753600276670ustar00rootroot00000000000000:man_page: mongoc_collection_get_write_concern mongoc_collection_get_write_concern() ===================================== Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_collection_get_write_concern (const mongoc_collection_t *collection); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. Description ----------- Fetches the default write concern to be used on write operations originating from ``collection`` and not specifying a write concern. Returns ------- A :symbol:`mongoc_write_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_insert.rst000066400000000000000000000030651511661753600255030ustar00rootroot00000000000000:man_page: mongoc_collection_insert mongoc_collection_insert() ========================== Synopsis -------- .. code-block:: c bool mongoc_collection_insert (mongoc_collection_t *collection, mongoc_insert_flags_t flags, const bson_t *document, const mongoc_write_concern_t *write_concern, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_insert_flags_t`. * ``document``: A :symbol:`bson:bson_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- .. note:: To pass additional options, use :symbol:`mongoc_collection_insert_one()` or :symbol:`mongoc_collection_insert_many()`. This function shall insert ``document`` into ``collection``. If no ``_id`` element is found in ``document``, then a :symbol:`bson:bson_oid_t` will be generated locally and added to the document. If you must know the inserted document's ``_id``, generate it in your code and include it in the ``document``. The ``_id`` you generate can be a :symbol:`bson:bson_oid_t` or any other non-array BSON type. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_insert_many.rst000066400000000000000000000037011511661753600265240ustar00rootroot00000000000000:man_page: mongoc_collection_insert_many mongoc_collection_insert_many() =============================== Synopsis -------- .. code-block:: c bool mongoc_collection_insert_many (mongoc_collection_t *collection, const bson_t **documents, size_t n_documents, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``documents``: An array of pointers to :symbol:`bson:bson_t`. * ``n_documents``: The length of ``documents``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/insert-many-opts.txt Description ----------- Insert ``documents`` into ``collection``. To insert a single document, see :symbol:`mongoc_collection_insert_one`. For any document that does not have an "_id" field, a :symbol:`bson:bson_oid_t` will be generated locally and added to the document. If you must know the inserted document's ``_id``, generate it in your code and include it in the ``document``. The ``_id`` you generate can be a :symbol:`bson:bson_oid_t` or any other non-array BSON type. If you pass a non-NULL ``reply``, it is filled out with an "insertedCount" field. If there is a server error then ``reply`` may contain a "writeErrors" array and/or a "writeConcernErrors" array (see `Bulk Write Operations `_ for examples). The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_insert_one.rst000066400000000000000000000033601511661753600263420ustar00rootroot00000000000000:man_page: mongoc_collection_insert_one mongoc_collection_insert_one() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_insert_one (mongoc_collection_t *collection, const bson_t *document, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``document``: A :symbol:`bson:bson_t`. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/insert-one-opts.txt Description ----------- This function shall insert ``document`` into ``collection``. To insert an array of documents, see :symbol:`mongoc_collection_insert_many`. If no ``_id`` element is found in ``document``, then a :symbol:`bson:bson_oid_t` will be generated locally and added to the document. If you pass a non-NULL ``reply``, it is filled out with an "insertedCount" field. If the document was successfully inserted, ``reply`` will also contain an "insertedId" field containing the inserted document's ``_id``. If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_keys_to_index_string.rst000066400000000000000000000015561511661753600304340ustar00rootroot00000000000000:man_page: mongoc_collection_keys_to_index_string mongoc_collection_keys_to_index_string() ======================================== Synopsis -------- .. code-block:: c char * mongoc_collection_keys_to_index_string (const bson_t *keys); Parameters ---------- * ``keys``: A :symbol:`bson:bson_t`. This is expected to match the form of the ``key`` field in the `createIndexes `_ command. Description ----------- This function returns the canonical stringification of a given key specification. See `Manage Collection Indexes `_ for example usage. It is a programming error to call this function on a non-standard index, such one other than a straight index with ascending and descending. Returns ------- A string that should be freed with :symbol:`bson:bson_free()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_read_command_with_opts.rst000066400000000000000000000041031511661753600307020ustar00rootroot00000000000000:man_page: mongoc_collection_read_command_with_opts mongoc_collection_read_command_with_opts() ========================================== Synopsis -------- .. code-block:: c bool mongoc_collection_read_command_with_opts (mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that read, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_collection_command_simple`. .. |opts-source| replace:: ``collection`` .. include:: includes/read-cmd-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. include:: includes/retryable-read.txt .. |generic-cmd| replace:: :symbol:`mongoc_collection_command_with_opts` .. include:: includes/retryable-read-command.txt Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_read_write_command_with_opts.rst000066400000000000000000000037471511661753600321310ustar00rootroot00000000000000:man_page: mongoc_collection_read_write_command_with_opts mongoc_collection_read_write_command_with_opts() ================================================ Synopsis -------- .. code-block:: c bool mongoc_collection_read_write_command_with_opts ( mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* UNUSED */, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic for commands that both read and write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_collection_command_simple`. .. |opts-source| replace:: ``collection`` .. include:: includes/read-write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. (The :symbol:`mongoc_read_prefs_t` parameter was included by mistake when this function was introduced in libmongoc 1.5. A command that writes must not obey a read preference.) Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: Ignored. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_remove.rst000066400000000000000000000030111511661753600254630ustar00rootroot00000000000000:man_page: mongoc_collection_remove mongoc_collection_remove() ========================== Synopsis -------- .. code-block:: c bool mongoc_collection_remove (mongoc_collection_t *collection, mongoc_remove_flags_t flags, const bson_t *selector, const mongoc_write_concern_t *write_concern, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A :symbol:`mongoc_remove_flags_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents. * ``write_concern``: A :symbol:`mongoc_write_concern_t` or ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- .. note:: To pass additional options, use :symbol:`mongoc_collection_delete_one` or :symbol:`mongoc_collection_delete_many`. This function shall remove documents in the given ``collection`` that match ``selector``. The bson ``selector`` is not validated, simply passed along as appropriate to the server. As such, compatibility and errors should be validated in the appropriate server documentation. If you want to limit deletes to a single document, provide ``MONGOC_REMOVE_SINGLE_REMOVE`` in ``flags``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_rename.rst000066400000000000000000000017041511661753600254440ustar00rootroot00000000000000:man_page: mongoc_collection_rename mongoc_collection_rename() ========================== Synopsis -------- .. code-block:: c bool mongoc_collection_rename (mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``new_db``: The name of the new database. * ``new_name``: The new name for the collection. * ``drop_target_before_rename``: If an existing collection matches the new name, drop it before the rename. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_collection_rename_with_opts()`. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_rename_with_opts.rst000066400000000000000000000046731511661753600275540ustar00rootroot00000000000000:man_page: mongoc_collection_rename_with_opts mongoc_collection_rename_with_opts() ==================================== Synopsis -------- .. code-block:: c bool mongoc_collection_rename_with_opts (mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``new_db``: The name of the new database. * ``new_name``: The new name for the collection. * ``drop_target_before_rename``: If an existing collection matches the new name, drop it before the rename. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` ``opts`` may be NULL or a BSON document with additional command options: * ``writeConcern``: Construct a :symbol:`mongoc_write_concern_t` and use :symbol:`mongoc_write_concern_append` to add the write concern to ``opts``. See the example code for :symbol:`mongoc_client_write_command_with_opts`. * ``sessionId``: First, construct a :symbol:`mongoc_client_session_t` with :symbol:`mongoc_client_start_session`. You can begin a transaction with :symbol:`mongoc_client_session_start_transaction`, optionally with a :symbol:`mongoc_transaction_opt_t` that overrides the options inherited from |opts-source|, and use :symbol:`mongoc_client_session_append` to add the session to ``opts``. See the example code for :symbol:`mongoc_client_session_t`. * ``serverId``: To target a specific server, include an int32 "serverId" field. Obtain the id by calling :symbol:`mongoc_client_select_server`, then :symbol:`mongoc_server_description_id` on its return value. Description ----------- This function is a helper to rename an existing collection on a MongoDB server. The name of the collection will also be updated internally so it is safe to continue using this collection after the rename. Additional operations will occur on renamed collection. If no write concern is provided in ``opts``, the collection's write concern is used. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_replace_one.rst000066400000000000000000000037471511661753600264620ustar00rootroot00000000000000:man_page: mongoc_collection_replace_one mongoc_collection_replace_one() =============================== Synopsis -------- .. code-block:: c bool mongoc_collection_replace_one (mongoc_collection_t *collection, const bson_t *selector, const bson_t *replacement, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match the document for updating. * ``replacement``: A :symbol:`bson:bson_t` containing the replacement document. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/replace-one-opts.txt Description ----------- This function shall replace documents in ``collection`` that match ``selector`` with ``replacement``. If provided, ``reply`` will be initialized and populated with the fields ``matchedCount``, ``modifiedCount``, ``upsertedCount``, and optionally ``upsertedId`` if applicable. If there is a server error then ``reply`` contains either a ``writeErrors`` array with one subdocument or a ``writeConcernErrors`` array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. .. seealso:: | `MongoDB update command documentation `_ for more information on the update options. | :symbol:`mongoc_collection_update_one` | :symbol:`mongoc_collection_update_many` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_set_read_concern.rst000066400000000000000000000012031511661753600274640ustar00rootroot00000000000000:man_page: mongoc_collection_set_read_concern mongoc_collection_set_read_concern() ==================================== Synopsis -------- .. code-block:: c void mongoc_collection_set_read_concern (mongoc_collection_t *collection, const mongoc_read_concern_t *read_concern); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``read_concern``: A :symbol:`mongoc_read_concern_t`. Description ----------- Sets the read concern to use for operations on ``collection``. The default read concern is empty: No readConcern is sent to the server unless explicitly configured. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_set_read_prefs.rst000066400000000000000000000015441511661753600271640ustar00rootroot00000000000000:man_page: mongoc_collection_set_read_prefs mongoc_collection_set_read_prefs() ================================== Synopsis -------- .. code-block:: c void mongoc_collection_set_read_prefs (mongoc_collection_t *collection, const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Sets the default read preferences to use for operations on ``collection`` not specifying a read preference. The global default is MONGOC_READ_PRIMARY: if the client is connected to a replica set it reads from the primary, otherwise it reads from the current MongoDB server. Please see the MongoDB website for a description of `Read Preferences `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_set_write_concern.rst000066400000000000000000000013451511661753600277120ustar00rootroot00000000000000:man_page: mongoc_collection_set_write_concern mongoc_collection_set_write_concern() ===================================== Synopsis -------- .. code-block:: c void mongoc_collection_set_write_concern ( mongoc_collection_t *collection, const mongoc_write_concern_t *write_concern); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Sets the write concern to use for operations on ``collection``. The default write concern is MONGOC_WRITE_CONCERN_W_DEFAULT: the driver blocks awaiting basic acknowledgement of write operations from MongoDB. This is the correct write concern for the great majority of applications. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_t.rst000066400000000000000000000041241511661753600244370ustar00rootroot00000000000000:man_page: mongoc_collection_t mongoc_collection_t =================== Synopsis -------- .. code-block:: c typedef struct _mongoc_collection_t mongoc_collection_t; ``mongoc_collection_t`` provides access to a MongoDB collection. This handle is useful for actions for most CRUD operations, I.e. insert, update, delete, find, etc. Read Preferences and Write Concerns ----------------------------------- Read preferences and write concerns are inherited from the parent client. They can be overridden by set_* commands if so desired. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_collection_aggregate mongoc_collection_command_simple mongoc_collection_command_with_opts mongoc_collection_copy mongoc_collection_count_documents mongoc_collection_estimated_document_count mongoc_collection_create_bulk_operation_with_opts mongoc_collection_create_indexes_with_opts mongoc_collection_delete_many mongoc_collection_delete_one mongoc_collection_destroy mongoc_collection_drop mongoc_collection_drop_index mongoc_collection_drop_index_with_opts mongoc_collection_drop_with_opts mongoc_collection_find_and_modify mongoc_collection_find_and_modify_with_opts mongoc_collection_find_indexes_with_opts mongoc_collection_find_with_opts mongoc_collection_get_name mongoc_collection_get_read_concern mongoc_collection_get_read_prefs mongoc_collection_get_write_concern mongoc_collection_insert mongoc_collection_insert_many mongoc_collection_insert_one mongoc_collection_keys_to_index_string mongoc_collection_read_command_with_opts mongoc_collection_read_write_command_with_opts mongoc_collection_remove mongoc_collection_rename mongoc_collection_rename_with_opts mongoc_collection_replace_one mongoc_collection_set_read_concern mongoc_collection_set_read_prefs mongoc_collection_set_write_concern mongoc_collection_update mongoc_collection_update_one mongoc_collection_update_many mongoc_collection_write_command_with_opts mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_update.rst000066400000000000000000000032121511661753600254530ustar00rootroot00000000000000:man_page: mongoc_collection_update mongoc_collection_update() ========================== Synopsis -------- .. code-block:: c bool mongoc_collection_update (mongoc_collection_t *collection, mongoc_update_flags_t flags, const bson_t *selector, const bson_t *update, const mongoc_write_concern_t *write_concern, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``flags``: A bitwise or of :symbol:`mongoc_update_flags_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents for updating. * ``update``: A :symbol:`bson:bson_t` containing the update to perform. If updating with a pipeline, a :symbol:`bson:bson_t` array. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- .. note:: To pass additional options, use :symbol:`mongoc_collection_update_one`, :symbol:`mongoc_collection_update_many`, or :symbol:`mongoc_collection_replace_one`. This function shall update documents in ``collection`` that match ``selector``. By default, updates only a single document. Set flags to ``MONGOC_UPDATE_MULTI_UPDATE`` to update multiple documents. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_update_many.rst000066400000000000000000000037731511661753600265130ustar00rootroot00000000000000:man_page: mongoc_collection_update_many mongoc_collection_update_many() =============================== Synopsis -------- .. code-block:: c bool mongoc_collection_update_many (mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match documents for updating. * ``update``: A :symbol:`bson:bson_t` containing the update to perform. If updating with a pipeline, a :symbol:`bson:bson_t` array. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/update-many-opts.txt Description ----------- This function updates all documents in ``collection`` that match ``selector``. To update at most one document see :symbol:`mongoc_collection_update_one`. If you pass a non-NULL ``reply``, it is filled out with fields ``matchedCount``, ``modifiedCount``, and optionally ``upsertedId`` if applicable. If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. .. seealso:: | `MongoDB update command documentation `_ for more information on the update options. | :symbol:`mongoc_collection_update_one` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_update_one.rst000066400000000000000000000042321511661753600263170ustar00rootroot00000000000000:man_page: mongoc_collection_update_one mongoc_collection_update_one() ============================== Synopsis -------- .. code-block:: c bool mongoc_collection_update_one (mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error); Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``selector``: A :symbol:`bson:bson_t` containing the query to match the document for updating. * ``update``: A :symbol:`bson:bson_t` containing the update to perform. If updating with a pipeline, a :symbol:`bson:bson_t` array. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``collection`` .. include:: includes/update-one-opts.txt Description ----------- This function updates at most one document in ``collection`` that matches ``selector``. To update multiple documents see :symbol:`mongoc_collection_update_many`. If you pass a non-NULL ``reply``, it is filled out with fields ``matchedCount``, ``modifiedCount``, and optionally ``upsertedId`` if applicable. If there is a server error then ``reply`` contains either a "writeErrors" array with one subdocument or a "writeConcernErrors" array. The reply must be freed with :symbol:`bson:bson_destroy`. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- .. literalinclude:: ../examples/example-update.c :language: c :caption: example-update.c .. seealso:: | `MongoDB update command documentation `_ for more information on the update options. | :symbol:`mongoc_collection_update_many` | :symbol:`mongoc_collection_replace_one` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_watch.rst000066400000000000000000000032131511661753600253000ustar00rootroot00000000000000:man_page: mongoc_collection_watch mongoc_collection_watch() ========================= Synopsis -------- .. code-block:: c mongoc_change_stream_t* mongoc_collection_watch (const mongoc_collection_t *coll, const bson_t *pipeline, const bson_t *opts); A helper function to create a change stream. It is preferred to call this function over using a raw aggregation to create a change stream. This function uses the read preference and read concern of the collection. If the change stream needs to re-establish connection, the same read preference will be used. This may happen if the change stream encounters a resumable error. .. warning:: A change stream is only supported with majority read concern. .. include:: includes/retryable-read.txt Parameters ---------- * ``coll``: A :symbol:`mongoc_collection_t` specifying the collection which the change stream listens to. * ``pipeline``: A :symbol:`bson:bson_t` representing an aggregation pipeline appended to the change stream. This may be an empty document. * ``opts``: A :symbol:`bson:bson_t` containing change stream options. .. include:: includes/change-stream-opts.txt Returns ------- A newly allocated :symbol:`mongoc_change_stream_t` which must be freed with :symbol:`mongoc_change_stream_destroy` when no longer in use. The returned :symbol:`mongoc_change_stream_t` is never ``NULL``. If there is an error, it can be retrieved with :symbol:`mongoc_change_stream_error_document`, and subsequent calls to :symbol:`mongoc_change_stream_next` will return ``false``. .. seealso:: | :doc:`mongoc_client_watch` | :doc:`mongoc_database_watch` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_collection_write_command_with_opts.rst000066400000000000000000000044351511661753600311310ustar00rootroot00000000000000:man_page: mongoc_collection_write_command_with_opts mongoc_collection_write_command_with_opts() =========================================== Synopsis -------- .. code-block:: c bool mongoc_collection_write_command_with_opts (mongoc_collection_t *collection, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_collection_command_simple`. .. |opts-source| replace:: ``collection`` .. include:: includes/write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``collection``: A :symbol:`mongoc_collection_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Basic Write Operations ---------------------- Do not use this function to call the basic write commands "insert", "update", and "delete". Those commands require special logic not implemented in ``mongoc_collection_write_command_with_opts``. For basic write operations use CRUD functions such as :symbol:`mongoc_collection_insert_one` and the others described in `the CRUD tutorial `_, or use the `Bulk API `_. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_clone.rst000066400000000000000000000013661511661753600244630ustar00rootroot00000000000000:man_page: mongoc_cursor_clone mongoc_cursor_clone() ===================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_cursor_clone (const mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- This function shall create a copy of a :symbol:`mongoc_cursor_t`. The cloned cursor will be reset to the beginning of the query, and therefore the query will be re-executed on the MongoDB server when :symbol:`mongoc_cursor_next()` is called. Returns ------- A newly allocated :symbol:`mongoc_cursor_t` that should be freed with :symbol:`mongoc_cursor_destroy()` when no longer in use. .. warning:: Failure to handle the result of this function is a programming error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_current.rst000066400000000000000000000007121511661753600250370ustar00rootroot00000000000000:man_page: mongoc_cursor_current mongoc_cursor_current() ======================= Synopsis -------- .. code-block:: c const bson_t * mongoc_cursor_current (const mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Fetches the cursors current document or ``NULL`` if there has been an error. Returns ------- A :symbol:`bson:bson_t` that should not be modified or freed or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_destroy.rst000066400000000000000000000007061511661753600250510ustar00rootroot00000000000000:man_page: mongoc_cursor_destroy mongoc_cursor_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_cursor_destroy (mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Frees a :symbol:`mongoc_cursor_t` and releases all associated resources. If a server-side cursor has been allocated, it will be released as well. Does nothing if ``cursor`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_error.rst000066400000000000000000000012331511661753600245050ustar00rootroot00000000000000:man_page: mongoc_cursor_error mongoc_cursor_error() ===================== Synopsis -------- .. code-block:: c bool mongoc_cursor_error (mongoc_cursor_t *cursor, bson_error_t *error); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function checks to see if an error has occurred while iterating the cursor. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- false if no error has occurred, otherwise true and error is set. .. only:: html .. include:: includes/seealso/cursor-error.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_error_document.rst000066400000000000000000000102211511661753600264000ustar00rootroot00000000000000:man_page: mongoc_cursor_error_document mongoc_cursor_error_document() ============================== Synopsis -------- .. code-block:: c bool mongoc_cursor_error_document (mongoc_cursor_t *cursor, bson_error_t *error, const bson_t **reply); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. * ``reply``: A location for a :symbol:`const bson_t * `. Description ----------- This function checks to see if an error has occurred while iterating the cursor. If an error occurred client-side, for example if there was a network error or timeout, or the cursor was created with invalid parameters, then ``reply`` is set to an empty BSON document. If an error occurred server-side, ``reply`` is set to the server's reply document with information about the error. Errors ------ Errors are propagated via the ``error`` and ``reply`` parameters. Returns ------- False if no error has occurred, otherwise true and ``error`` is set. If the function returns true and ``reply`` is not NULL, then ``reply`` is set to a pointer to a BSON document, which is either empty or the server's error response. The document is invalid after the cursor is freed with :symbol:`mongoc_cursor_destroy()`. Example ------- This example shows the difference between a client-side and server-side error. If the client cannot connect to the server, for example, the error message includes "No suitable servers found" and ``reply`` is set to an empty BSON document. On the other hand, if the client connects to the server successfully and attempts to execute an invalid query, the error message comes from the server and ``reply`` is set to the server's reply document, with fields ``errmsg`` and ``code``. .. code-block:: c void run_query (const char *uri_str, const bson_t *query) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; const bson_t *reply; char *str; client = mongoc_client_new (uri_str); mongoc_client_set_error_api (client, 2); collection = mongoc_client_get_collection (client, "db", "collection"); cursor = mongoc_collection_find_with_opts ( collection, query, NULL, /* additional options */ NULL); /* read prefs, NULL for default */ /* this loop is never run: mongoc_cursor_next immediately returns false */ while (mongoc_cursor_next (cursor, &doc)) { } if (mongoc_cursor_error_document (cursor, &error, &reply)) { str = bson_as_relaxed_extended_json (reply, NULL); fprintf (stderr, "Cursor Failure: %s\nReply: %s\n", error.message, str); bson_free (str); } mongoc_cursor_destroy (cursor); mongoc_collection_destroy (collection); mongoc_client_destroy (client); } int main (int argc, char *argv[]) { bson_t *good_query; bson_t *bad_query; mongoc_init (); /* find documents matching the query {"x": 1} */ good_query = BCON_NEW ("x", BCON_INT64 (1)); /* Cause a network error. This will print an error and empty reply document: * * Cursor Failure: No suitable servers found (`serverSelectionTryOnce` set): * [Failed to resolve 'fake-domain'] * * Reply: { } * */ run_query ("mongodb://fake-domain/?appname=cursor-example", good_query); /* invalid: {"x": {"$badOperator": 1}} */ bad_query = BCON_NEW ("x", "{", "$badOperator", BCON_INT64 (1), "}"); /* Cause a server error. This will print an error and server reply document: * * Cursor Failure: unknown operator: $badOperator * * Reply: * {"ok": 0.0, * "errmsg":"unknown operator: $badOperator", * "code": 2, * "codeName":"BadValue" * } * */ run_query ("mongodb://localhost/?appname=cursor-example", bad_query); bson_destroy (good_query); bson_destroy (bad_query); mongoc_cleanup (); return 0; } .. only:: html .. include:: includes/seealso/cursor-error.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_batch_size.rst000066400000000000000000000011401511661753600263230ustar00rootroot00000000000000:man_page: mongoc_cursor_get_batch_size mongoc_cursor_get_batch_size() ============================== Synopsis -------- .. code-block:: c uint32_t mongoc_cursor_get_batch_size (const mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Retrieve the cursor's batch size, the maximum number of documents returned per round trip to the server. A batch size of zero means the cursor accepts the server's maximum batch size. See `Cursor Batches `_ in the MongoDB Manual. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_host.rst000066400000000000000000000006711511661753600251750ustar00rootroot00000000000000:man_page: mongoc_cursor_get_host mongoc_cursor_get_host() ======================== Synopsis -------- .. code-block:: c void mongoc_cursor_get_host (mongoc_cursor_t *cursor, mongoc_host_list_t *host); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``host``: A :symbol:`mongoc_host_list_t`. Description ----------- Fetches the MongoDB host that the cursor is communicating with in the ``host`` out parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_id.rst000066400000000000000000000007431511661753600246140ustar00rootroot00000000000000:man_page: mongoc_cursor_get_id mongoc_cursor_get_id() ====================== Synopsis -------- .. code-block:: c int64_t mongoc_cursor_get_id (const mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Retrieves the cursor id used by the server to track the cursor. This number is zero until the driver actually uses a server when executing the query, and after it has fetched all results from the server. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_limit.rst000066400000000000000000000006071511661753600253350ustar00rootroot00000000000000:man_page: mongoc_cursor_get_limit mongoc_cursor_get_limit() ========================= Synopsis -------- .. code-block:: c int64_t mongoc_cursor_get_limit (mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Return the value set with :symbol:`mongoc_cursor_set_limit` or :symbol:`mongoc_collection_find_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_max_await_time_ms.rst000066400000000000000000000006301511661753600277020ustar00rootroot00000000000000:man_page: mongoc_cursor_get_max_await_time_ms mongoc_cursor_get_max_await_time_ms() ===================================== Synopsis -------- .. code-block:: c uint32_t mongoc_cursor_get_max_await_time_ms (mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Retrieve the value set with :symbol:`mongoc_cursor_set_max_await_time_ms`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_get_server_id.rst000066400000000000000000000010041511661753600261710ustar00rootroot00000000000000:man_page: mongoc_cursor_get_server_id mongoc_cursor_get_server_id() ============================= Synopsis -------- .. code-block:: c uint32_t mongoc_cursor_get_server_id (const mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- Retrieves the opaque id of the server used for the operation. This number is zero until the driver actually uses a server when executing the find operation or :symbol:`mongoc_cursor_set_server_id` is called. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_more.rst000066400000000000000000000024711511661753600243230ustar00rootroot00000000000000:man_page: mongoc_cursor_more mongoc_cursor_more() ==================== Synopsis -------- .. code-block:: c bool mongoc_cursor_more (mongoc_cursor_t *cursor); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. Description ----------- This function shall indicate if there is *potentially* more data to be read from the cursor. This is only useful with tailable cursors. Use :symbol:`mongoc_cursor_next` for regular cursors. Details: ``mongoc_cursor_more`` is unreliable because it does not contact the server to see if there are actually more documents in the result set. It simply returns true if the cursor has not begun, or if it has begun and there are buffered documents in the client-side cursor, or if it has begun and the server has not yet told the cursor it is completely iterated. This is unreliable with regular queries because it returns true for a new cursor before iteration, even if the cursor will match no documents. It is also true if the collection has been dropped on the server since the previous fetch, or if the cursor has finished its final batch and the next batch will be empty. Returns ------- true if the cursor has locally-buffered documents, or if a round-trip to the server might fetch additional documents. .. seealso:: | `Tailable Cursor Example `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_new_from_command_reply_with_opts.rst000066400000000000000000000042621511661753600322060ustar00rootroot00000000000000:man_page: mongoc_cursor_new_from_command_reply_with_opts mongoc_cursor_new_from_command_reply_with_opts() ================================================ Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_cursor_new_from_command_reply_with_opts (mongoc_client_t *client, bson_t *reply, const bson_t *opts); Parameters ---------- * ``client``: A :symbol:`mongoc_client_t`. * ``reply``: The reply to a command, such as "aggregate", "find", or "listCollections", that returns a cursor document. The reply is destroyed by ``mongoc_cursor_new_from_command_reply_with_opts`` and must not be accessed afterward. * ``opts``: A :symbol:`bson:bson_t`. ``opts`` may be NULL or a BSON document with additional options, which have the same meaning for this function as for :symbol:`mongoc_collection_find_with_opts`: * ``awaitData`` * ``batchSize`` * ``limit`` * ``maxAwaitTimeMS`` * ``serverId`` * ``sessionId`` * ``skip`` * ``tailable`` Description ----------- Some MongoDB commands return a "cursor" document. For example, given an "aggregate" command: .. code-block:: none { "aggregate" : "collection", "pipeline" : [], "cursor" : {}} The server replies: .. code-block:: none { "cursor" : { "id" : 1234, "ns" : "db.collection", "firstBatch" : [ ] }, "ok" : 1 } ``mongoc_cursor_new_from_command_reply_with_opts`` is a low-level function that initializes a :symbol:`mongoc_cursor_t` from such a reply. When synthesizing a completed cursor response that has no more batches (i.e. with cursor id 0), ``serverId`` may be 0. If the cursor response is not completed (i.e. with non-zero cursor id), pass the ``serverId`` of the server used to create the cursor. Use this function only for building a language driver that wraps the C Driver. When writing applications in C, higher-level functions such as :symbol:`mongoc_collection_aggregate` are more appropriate, and ensure compatibility with a range of MongoDB versions. Returns ------- A :symbol:`mongoc_cursor_t`. On failure, the cursor's error is set. Check for failure with :symbol:`mongoc_cursor_error`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_next.rst000066400000000000000000000017121511661753600243340ustar00rootroot00000000000000:man_page: mongoc_cursor_next mongoc_cursor_next() ==================== Synopsis -------- .. code-block:: c bool mongoc_cursor_next (mongoc_cursor_t *cursor, const bson_t **bson); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``bson``: A location for a :symbol:`const bson_t * `. Description ----------- This function shall iterate the underlying cursor, setting ``bson`` to the next document. This function is a blocking function. Returns ------- This function returns true if a valid bson document was read from the cursor. Otherwise, false if there was an error or the cursor was exhausted. Errors can be determined with the :symbol:`mongoc_cursor_error()` function. Lifecycle --------- The bson objects set in this function are ephemeral and good until the next call. This means that you must copy the returned bson if you wish to retain it beyond the lifetime of a single call to :symbol:`mongoc_cursor_next()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_set_batch_size.rst000066400000000000000000000017221511661753600263450ustar00rootroot00000000000000:man_page: mongoc_cursor_set_batch_size mongoc_cursor_set_batch_size() ============================== Synopsis -------- .. code-block:: c void mongoc_cursor_set_batch_size (mongoc_cursor_t *cursor, uint32_t batch_size); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``batch_size``: The requested number of documents per batch. Description ----------- Limits the number of documents returned in one batch. Each batch requires a round trip to the server. If the batch size is zero, the cursor uses the server-defined maximum batch size. See `Cursor Batches `_ in the MongoDB Manual. This is not applicable to all cursors. Calling :symbol:`mongoc_cursor_set_batch_size` on a cursor returned by :symbol:`mongoc_client_find_databases_with_opts`, :symbol:`mongoc_database_find_collections_with_opts`, or :symbol:`mongoc_collection_find_indexes_with_opts` will not change the results.mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_set_limit.rst000066400000000000000000000022051511661753600253450ustar00rootroot00000000000000:man_page: mongoc_cursor_set_limit mongoc_cursor_set_limit() ========================= Synopsis -------- .. code-block:: c bool mongoc_cursor_set_limit (mongoc_cursor_t *cursor, int64_t limit); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``limit``: The maximum number of documents to retrieve for this query. Description ----------- Limits the number of documents in the result set. This function is useful for setting the limit on a cursor after the cursor is created, but before any calls to :symbol:`mongoc_cursor_next`. It can also be used to pass a negative limit: The ``limit`` parameter to ``mongoc_cursor_set_limit`` is signed. Calling this function after :symbol:`mongoc_cursor_next` has no effect. This is not applicable to all cursors. Calling :symbol:`mongoc_cursor_set_limit` on a cursor returned by :symbol:`mongoc_client_find_databases_with_opts`, :symbol:`mongoc_database_find_collections_with_opts`, or :symbol:`mongoc_collection_find_indexes_with_opts` will not change the results. Returns ------- Returns true on success. If any arguments are invalid, returns false and leaves the limit unchanged. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_set_max_await_time_ms.rst000066400000000000000000000027521511661753600277250ustar00rootroot00000000000000:man_page: mongoc_cursor_set_max_await_time_ms mongoc_cursor_set_max_await_time_ms() ===================================== Synopsis -------- .. code-block:: c void mongoc_cursor_set_max_await_time_ms (mongoc_cursor_t *cursor, uint32_t max_await_time_ms); Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``max_await_time_ms``: A timeout in milliseconds. Description ----------- The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. Only applies if the cursor is created from :symbol:`mongoc_collection_find_with_opts` with "tailable" and "awaitData" options, and the server is MongoDB 3.2 or later. See `the documentation for maxTimeMS and the "getMore" command `_. The ``max_await_time_ms`` cannot be changed after the first call to :symbol:`mongoc_cursor_next`. This is not applicable to all cursors. Calling :symbol:`mongoc_cursor_set_batch_size` on a cursor returned by :symbol:`mongoc_client_find_databases_with_opts`, :symbol:`mongoc_database_find_collections_with_opts`, or :symbol:`mongoc_collection_find_indexes_with_opts` will not change the results. Note: although ``max_await_time_ms`` is a uint32_t, it is possible to set it as a uint64_t through the options arguments in some cursor returning functions like :symbol:`mongoc_collection_find_with_opts()`. .. seealso:: | `Tailable Cursors. `_ mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_set_server_id.rst000066400000000000000000000015361511661753600262170ustar00rootroot00000000000000:man_page: mongoc_cursor_set_server_id mongoc_cursor_set_server_id() ============================= Synopsis -------- .. code-block:: c bool mongoc_cursor_set_server_id (mongoc_cursor_t *cursor, uint32_t server_id) Parameters ---------- * ``cursor``: A :symbol:`mongoc_cursor_t`. * ``server_id``: An opaque id identifying the server to use. Description ----------- Specifies which server to use for the operation. This function has an effect only if called before the find operation is executed. Use ``mongoc_cursor_set_server_id`` only for building a language driver that wraps the C Driver. When writing applications in C, leave the server id unset and allow the driver to choose a suitable server from the find operation's read preference. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_cursor_t.rst000066400000000000000000000033451511661753600236250ustar00rootroot00000000000000:man_page: mongoc_cursor_t mongoc_cursor_t =============== Client-side cursor abstraction Synopsis -------- .. code-block:: c typedef struct _mongoc_cursor_t mongoc_cursor_t; ``mongoc_cursor_t`` provides access to a MongoDB query cursor. It wraps up the wire protocol negotiation required to initiate a query and retrieve an unknown number of documents. Common cursor operations include: * Determine which host we've connected to with :symbol:`mongoc_cursor_get_host()`. * Retrieve more records with repeated calls to :symbol:`mongoc_cursor_next()`. * Clone a query to repeat execution at a later point with :symbol:`mongoc_cursor_clone()`. * Test for errors with :symbol:`mongoc_cursor_error()`. Cursors are lazy, meaning that no connection is established and no network traffic occurs until the first call to :symbol:`mongoc_cursor_next()`. Thread Safety ------------- ``mongoc_cursor_t`` is *NOT* thread safe. It may only be used from within the thread in which it was created. Example ------- .. literalinclude:: ../examples/example-client.c :language: c :caption: Query MongoDB and iterate results .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_cursor_clone mongoc_cursor_current mongoc_cursor_destroy mongoc_cursor_error mongoc_cursor_error_document mongoc_cursor_get_batch_size mongoc_cursor_get_server_id mongoc_cursor_get_host mongoc_cursor_get_id mongoc_cursor_get_limit mongoc_cursor_get_max_await_time_ms mongoc_cursor_more mongoc_cursor_new_from_command_reply_with_opts mongoc_cursor_next mongoc_cursor_set_batch_size mongoc_cursor_set_server_id mongoc_cursor_set_limit mongoc_cursor_set_max_await_time_ms mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_add_user.rst000066400000000000000000000023131511661753600253710ustar00rootroot00000000000000:man_page: mongoc_database_add_user mongoc_database_add_user() ========================== Synopsis -------- .. code-block:: c bool mongoc_database_add_user (mongoc_database_t *database, const char *username, const char *password, const bson_t *roles, const bson_t *custom_data, bson_error_t *error); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``username``: The name of the user. * ``password``: The cleartext password for the user. * ``roles``: An optional :symbol:`bson:bson_t` for roles. * ``custom_data``: A optional :symbol:`bson:bson_t` for extra data. * ``error``: A location for a :symbol:`bson_error_t ` or ``NULL``. This function shall create a new user with access to ``database``. .. warning:: Do not call this function without TLS. Errors ------ Errors are returned through the ``error`` parameter and can include socket or other server side failures. Returns ------- Returns ``true`` if the user was successfully added. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_aggregate.rst000066400000000000000000000065701511661753600255420ustar00rootroot00000000000000:man_page: mongoc_database_aggregate mongoc_database_aggregate() =========================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_database_aggregate (mongoc_database_t *database, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``pipeline``: A :symbol:`bson:bson_t`, either a BSON array or a BSON document containing an array field named "pipeline". * ``opts``: A :symbol:`bson:bson_t` containing options for the command, or ``NULL``. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL``. .. |opts-source| replace:: ``database`` .. include:: includes/aggregate-opts.txt For a list of all options, see `the MongoDB Manual entry on the aggregate command `_. Description ----------- This function creates a cursor which sends the aggregate command on the underlying database upon the first call to :symbol:`mongoc_cursor_next()`. For more information on building aggregation pipelines, see `the MongoDB Manual entry on the aggregate command `_. Note that the pipeline must start with a compatible stage that does not require an underlying collection (e.g. "$currentOp", "$listLocalSessions"). Read preferences, read and write concern, and collation can be overridden by various sources. The highest-priority sources for these options are listed first in the following table. In a transaction, read concern and write concern are prohibited in ``opts`` and the read preference must be primary or NULL. Write concern is applied from ``opts``, or if ``opts`` has no write concern and the aggregation pipeline includes "$out", the write concern is applied from ``database``. ================== ============== ============== ========= Read Preferences Read Concern Write Concern Collation ================== ============== ============== ========= ``read_prefs`` ``opts`` ``opts`` ``opts`` Transaction Transaction Transaction ``database`` ``database`` ``database`` ================== ============== ============== ========= :ref:`See the example for transactions ` and for :ref:`the "distinct" command with opts `. .. include:: includes/retryable-read-aggregate.txt Returns ------- .. include:: includes/returns-cursor.txt Example ------- .. code-block:: c #include #include static mongoc_cursor_t * current_op_query (mongoc_client_t *client) { mongoc_cursor_t *cursor; mongoc_database_t *database; bson_t *pipeline; pipeline = BCON_NEW ("pipeline", "[", "{", "$currentOp", "{", "}", "}", "]"); /* $currentOp must be run on the admin database */ database = mongoc_client_get_database (client, "admin"); cursor = mongoc_database_aggregate ( database, pipeline, NULL, NULL); bson_destroy (pipeline); mongoc_database_destroy (database); return cursor; } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_command_simple.rst000066400000000000000000000026011511661753600265720ustar00rootroot00000000000000:man_page: mongoc_database_command_simple mongoc_database_command_simple() ================================ Synopsis -------- .. code-block:: c bool mongoc_database_command_simple (mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``command``: A :symbol:`bson:bson_t` containing the command. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. Otherwise, the command uses mode ``MONGOC_READ_PRIMARY``. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. The database's read preference, read concern, and write concern are not applied to the command. The parameter ``reply`` is initialized even upon failure to simplify memory management. .. include:: includes/not-retryable-read.txt Errors ------ Errors are propagated through the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. This function does not check the server response for a write concern error or write concern timeout. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_command_with_opts.rst000066400000000000000000000034041511661753600273230ustar00rootroot00000000000000:man_page: mongoc_database_command_with_opts mongoc_database_command_with_opts() =================================== Synopsis -------- .. code-block:: c bool mongoc_database_command_with_opts ( mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, interpreting ``opts`` according to the MongoDB server version. To send a raw command to the server without any of this logic, use :symbol:`mongoc_client_command_simple`. .. |opts-source| replace:: ``database`` .. include:: includes/opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. include:: includes/not-retryable-read.txt Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. The reply is not parsed for a write concern timeout or write concern error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_copy.rst000066400000000000000000000013311511661753600245540ustar00rootroot00000000000000:man_page: mongoc_database_copy mongoc_database_copy() ====================== Synopsis -------- .. code-block:: c mongoc_database_t * mongoc_database_copy (mongoc_database_t *database); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. Description ----------- Performs a deep copy of the ``database`` struct and its configuration. Useful if you intend to call :symbol:`mongoc_database_set_write_concern`, :symbol:`mongoc_database_set_read_prefs`, or :symbol:`mongoc_database_set_read_concern`, and want to preserve an unaltered copy of the struct. Returns ------- A newly allocated :symbol:`mongoc_database_t` that should be freed with :symbol:`mongoc_database_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_create_collection.rst000066400000000000000000000025661511661753600272730ustar00rootroot00000000000000:man_page: mongoc_database_create_collection mongoc_database_create_collection() =================================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_database_create_collection (mongoc_database_t *database, const char *name, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``name``: The name of the new collection. * ``opts``: An optional :symbol:`bson:bson_t` for opts to the ``create`` command. * ``error``: A location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function creates a :symbol:`mongoc_collection_t` from the given :symbol:`mongoc_database_t`. If no write concern is provided in ``opts``, the database's write concern is used. The ``encryptedFields`` document in ``opts`` may be used to create a collection used for `Queryable Encryption `_. For a list of all options, see `the MongoDB Manual entry on the create command `_. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- This function returns a newly allocated :symbol:`mongoc_collection_t` upon success, ``NULL`` upon failure and ``error`` is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_destroy.rst000066400000000000000000000006041511661753600252750ustar00rootroot00000000000000:man_page: mongoc_database_destroy mongoc_database_destroy() ========================= Synopsis -------- .. code-block:: c void mongoc_database_destroy (mongoc_database_t *database); Releases all resources associated with ``database``, including freeing the structure. Does nothing if ``database`` is NULL. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_drop.rst000066400000000000000000000010451511661753600245500ustar00rootroot00000000000000:man_page: mongoc_database_drop mongoc_database_drop() ====================== Synopsis -------- .. code-block:: c bool mongoc_database_drop (mongoc_database_t *database, bson_error_t *error); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- For more information, see :symbol:`mongoc_database_drop_with_opts()`. This function is a thin wrapper, passing ``NULL`` in as :symbol:`opts ` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_drop_with_opts.rst000066400000000000000000000021031511661753600266440ustar00rootroot00000000000000:man_page: mongoc_database_drop_with_opts mongoc_database_drop_with_opts() ================================ Synopsis -------- .. code-block:: c bool mongoc_database_drop_with_opts (mongoc_database_t *database, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``database`` .. include:: includes/write-opts.txt Description ----------- This function attempts to drop a database on the MongoDB server. If no write concern is provided in ``opts``, the database's write concern is used. The ``encryptedFields`` document in ``opts`` may be used to drop a collection used for `Queryable Encryption `_. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_find_collections_with_opts.rst000066400000000000000000000044651511661753600312330ustar00rootroot00000000000000:man_page: mongoc_database_find_collections_with_opts mongoc_database_find_collections_with_opts() ============================================ Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_database_find_collections_with_opts (mongoc_database_t *database, const bson_t *opts); Fetches a cursor containing documents, each corresponding to a collection on this database. To get collection names only, use :symbol:`mongoc_database_get_collection_names_with_opts`. .. include:: includes/retryable-read.txt Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. .. |opts-source| replace:: ``database`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listCollections command `_. Errors ------ Use :symbol:`mongoc_cursor_error` on the returned cursor to check for errors. Returns ------- .. include:: includes/returns-cursor.txt In the returned cursor each result corresponds to the server's representation of a collection in this database. The cursor functions :symbol:`mongoc_cursor_set_limit`, :symbol:`mongoc_cursor_set_batch_size`, and :symbol:`mongoc_cursor_set_max_await_time_ms` have no use on the returned cursor. Examples -------- .. code-block:: c { bson_t opts = BSON_INITIALIZER; bson_t name_filter; const bson_t *doc; bson_iter_t iter; bson_error_t error; mongoc_cursor_t *cursor; BSON_APPEND_DOCUMENT_BEGIN (&opts, "filter", &name_filter); /* find collections with names like "abbbbc" */ BSON_APPEND_REGEX (&name_filter, "name", "ab+c", NULL); bson_append_document_end (&opts, &name_filter); cursor = mongoc_database_find_collections_with_opts (database, &opts); while (mongoc_cursor_next (cursor, &doc)) { bson_iter_init_find (&iter, doc, "name"); printf ("found collection: %s\n", bson_iter_utf8 (&iter, NULL)); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "%s\n", error.message); } mongoc_cursor_destroy (cursor); bson_destroy (&opts); } .. seealso:: | :symbol:`mongoc_database_get_collection_names_with_opts()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_collection.rst000066400000000000000000000010201511661753600265670ustar00rootroot00000000000000:man_page: mongoc_database_get_collection mongoc_database_get_collection() ================================ Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_database_get_collection (mongoc_database_t *database, const char *name); Allocates a new :symbol:`mongoc_collection_t` structure for the collection named ``name`` in ``database``. Returns ------- A newly allocated :symbol:`mongoc_collection_t` that should be freed with :symbol:`mongoc_collection_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_collection_names_with_opts.rst000066400000000000000000000040061511661753600320610ustar00rootroot00000000000000:man_page: mongoc_database_get_collection_names_with_opts mongoc_database_get_collection_names_with_opts() ================================================ Synopsis -------- .. code-block:: c char ** mongoc_database_get_collection_names_with_opts (mongoc_database_t *database, const bson_t *opts, bson_error_t *error); Fetches a ``NULL`` terminated array of ``NULL-byte`` terminated ``char*`` strings containing the names of all of the collections in ``database``. .. include:: includes/retryable-read.txt Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. |opts-source| replace:: ``database`` .. include:: includes/generic-opts.txt For a list of all options, see `the MongoDB Manual entry on the listCollections command `_. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- A ``NULL`` terminated array of ``NULL`` terminated ``char*`` strings that should be freed with :symbol:`bson:bson_strfreev()`. Upon failure, ``NULL`` is returned and ``error`` is set. Examples -------- .. code-block:: c { bson_t opts = BSON_INITIALIZER; mongoc_read_concern_t *rc; bson_error_t error; char **strv; unsigned i; rc = mongoc_read_concern_new (); mongoc_read_concern_set_level (rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_read_concern_append (rc, &opts); if ((strv = mongoc_database_get_collection_names_with_opts ( database, &opts, &error))) { for (i = 0; strv[i]; i++) printf ("%s\n", strv[i]); bson_strfreev (strv); } else { fprintf (stderr, "Command failed: %s\n", error.message); } mongoc_read_concern_destroy (rc); bson_destroy (&opts); } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_name.rst000066400000000000000000000005701511661753600253650ustar00rootroot00000000000000:man_page: mongoc_database_get_name mongoc_database_get_name() ========================== Synopsis -------- .. code-block:: c const char * mongoc_database_get_name (mongoc_database_t *database); Fetches the name of the database. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. Returns ------- A string which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_read_concern.rst000066400000000000000000000010371511661753600270660ustar00rootroot00000000000000:man_page: mongoc_database_get_read_concern mongoc_database_get_read_concern() ================================== Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_database_get_read_concern (const mongoc_database_t *database); This function retrieves the default :symbol:`mongoc_read_concern_t` to use with ``database`` as configured by the client. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. Returns ------- A :symbol:`mongoc_read_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_read_prefs.rst000066400000000000000000000007331511661753600265600ustar00rootroot00000000000000:man_page: mongoc_database_get_read_prefs mongoc_database_get_read_prefs() ================================ Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_database_get_read_prefs (const mongoc_database_t *database); Fetches the default read preferences to use with ``database``. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. Returns ------- A :symbol:`mongoc_write_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_get_write_concern.rst000066400000000000000000000010461511661753600273050ustar00rootroot00000000000000:man_page: mongoc_database_get_write_concern mongoc_database_get_write_concern() =================================== Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_database_get_write_concern (const mongoc_database_t *database); This function retrieves the default :symbol:`mongoc_write_concern_t` to use with ``database`` as configured by the client. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. Returns ------- A :symbol:`mongoc_write_concern_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_has_collection.rst000066400000000000000000000017441511661753600266000ustar00rootroot00000000000000:man_page: mongoc_database_has_collection mongoc_database_has_collection() ================================ Synopsis -------- .. code-block:: c bool mongoc_database_has_collection (mongoc_database_t *database, const char *name, bson_error_t *error); This function checks to see if a collection exists on the MongoDB server within ``database``. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``name``: A string containing the name of the collection. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- If the function succeeds, it returns ``true`` if the collection exists and ``false`` if not, and in either case the fields of ``error`` are cleared, if ``error`` is not NULL. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_read_command_with_opts.rst000066400000000000000000000040431511661753600303160ustar00rootroot00000000000000:man_page: mongoc_database_read_command_with_opts mongoc_database_read_command_with_opts() ======================================== Synopsis -------- .. code-block:: c bool mongoc_database_read_command_with_opts (mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that read, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_database_command_simple`. .. |opts-source| replace:: ``database`` .. include:: includes/read-cmd-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. .. |generic-cmd| replace:: :symbol:`mongoc_database_command_with_opts` .. include:: includes/retryable-read.txt .. include:: includes/retryable-read-command.txt Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: An optional :symbol:`mongoc_read_prefs_t`. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_read_write_command_with_opts.rst000066400000000000000000000037231511661753600315340ustar00rootroot00000000000000:man_page: mongoc_database_read_write_command_with_opts mongoc_database_read_write_command_with_opts() ============================================== Synopsis -------- .. code-block:: c bool mongoc_database_read_write_command_with_opts ( mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* UNUSED */, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic for commands that both read and write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_database_command_simple`. .. |opts-source| replace:: ``database`` .. include:: includes/read-write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. (The :symbol:`mongoc_read_prefs_t` parameter was included by mistake when this function was introduced in libmongoc 1.5. A command that writes must not obey a read preference.) Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``read_prefs``: Ignored. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/read-write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_remove_all_users.rst000066400000000000000000000015051511661753600271530ustar00rootroot00000000000000:man_page: mongoc_database_remove_all_users mongoc_database_remove_all_users() ================================== Synopsis -------- .. code-block:: c bool mongoc_database_remove_all_users (mongoc_database_t *database, bson_error_t *error); This function will remove all users configured to access ``database``. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. This may fail if there are socket errors or the current user is not authorized to perform the given command. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_remove_user.rst000066400000000000000000000016431511661753600261430ustar00rootroot00000000000000:man_page: mongoc_database_remove_user mongoc_database_remove_user() ============================= Synopsis -------- .. code-block:: c bool mongoc_database_remove_user (mongoc_database_t *database, const char *username, bson_error_t *error); This function removes the user named ``username`` from ``database``. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``username``: A string containing the username of the user to remove. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Errors ------ Errors are propagated via the ``error`` parameter. This could include socket errors or others if the current user is not authorized to perform the command. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_set_read_concern.rst000066400000000000000000000013431511661753600271020ustar00rootroot00000000000000:man_page: mongoc_database_set_read_concern mongoc_database_set_read_concern() ================================== Synopsis -------- .. code-block:: c void mongoc_database_set_read_concern (mongoc_database_t *database, const mongoc_read_concern_t *read_concern); This function sets the read concern to use on operations performed with ``database``. Collections created with :symbol:`mongoc_database_get_collection()` after this call will inherit this read concern. The default read concern is empty: No readConcern is sent to the server unless explicitly configured. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``read_concern``: A :symbol:`mongoc_read_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_set_read_prefs.rst000066400000000000000000000016501511661753600265730ustar00rootroot00000000000000:man_page: mongoc_database_set_read_prefs mongoc_database_set_read_prefs() ================================ Synopsis -------- .. code-block:: c void mongoc_database_set_read_prefs (mongoc_database_t *database, const mongoc_read_prefs_t *read_prefs); This function sets the default read preferences to use on operations performed with ``database``. Collections created with :symbol:`mongoc_database_get_collection()` after this call will inherit these read preferences. The global default is MONGOC_READ_PRIMARY: if the client is connected to a replica set it reads from the primary, otherwise it reads from the current MongoDB server. Please see the MongoDB website for a description of `Read Preferences `_. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_set_write_concern.rst000066400000000000000000000015421511661753600273220ustar00rootroot00000000000000:man_page: mongoc_database_set_write_concern mongoc_database_set_write_concern() =================================== Synopsis -------- .. code-block:: c void mongoc_database_set_write_concern (mongoc_database_t *database, const mongoc_write_concern_t *write_concern); This function sets the write concern to use on operations performed with ``database``. Collections created with :symbol:`mongoc_database_get_collection()` after this call will inherit this write concern. The default write concern is MONGOC_WRITE_CONCERN_W_DEFAULT: the driver blocks awaiting basic acknowledgement of write operations from MongoDB. This is the correct write concern for the great majority of applications. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_t.rst000066400000000000000000000040001511661753600240410ustar00rootroot00000000000000:man_page: mongoc_database_t mongoc_database_t ================= MongoDB Database Abstraction Synopsis -------- .. code-block:: c typedef struct _mongoc_database_t mongoc_database_t; ``mongoc_database_t`` provides access to a MongoDB database. This handle is useful for actions a particular database object. It *is not* a container for :symbol:`mongoc_collection_t` structures. Read preferences and write concerns are inherited from the parent client. They can be overridden with :symbol:`mongoc_database_set_read_prefs()` and :symbol:`mongoc_database_set_write_concern()`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_database_add_user mongoc_database_aggregate mongoc_database_command_simple mongoc_database_command_with_opts mongoc_database_copy mongoc_database_create_collection mongoc_database_destroy mongoc_database_drop mongoc_database_drop_with_opts mongoc_database_find_collections_with_opts mongoc_database_get_collection mongoc_database_get_collection_names_with_opts mongoc_database_get_name mongoc_database_get_read_concern mongoc_database_get_read_prefs mongoc_database_get_write_concern mongoc_database_has_collection mongoc_database_read_command_with_opts mongoc_database_read_write_command_with_opts mongoc_database_remove_all_users mongoc_database_remove_user mongoc_database_set_read_concern mongoc_database_set_read_prefs mongoc_database_set_write_concern mongoc_database_watch mongoc_database_write_command_with_opts Examples -------- .. code-block:: c #include int main (int argc, char *argv[]) { mongoc_database_t *database; mongoc_client_t *client; mongoc_init (); client = mongoc_client_new ("mongodb://localhost/"); database = mongoc_client_get_database (client, "test"); mongoc_database_destroy (database); mongoc_client_destroy (client); mongoc_cleanup (); return 0; } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_watch.rst000066400000000000000000000031651511661753600247170ustar00rootroot00000000000000:man_page: mongoc_database_watch mongoc_database_watch() ======================= Synopsis -------- .. code-block:: c mongoc_change_stream_t* mongoc_database_watch (const mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts); A helper function to create a change stream. It is preferred to call this function over using a raw aggregation to create a change stream. This function uses the read preference and read concern of the database. If the change stream needs to re-establish connection, the same read preference will be used. This may happen if the change stream encounters a resumable error. .. warning:: A change stream is only supported with majority read concern. .. include:: includes/retryable-read.txt Parameters ---------- * ``db``: A :symbol:`mongoc_database_t` specifying the database which the change stream listens to. * ``pipeline``: A :symbol:`bson:bson_t` representing an aggregation pipeline appended to the change stream. This may be an empty document. * ``opts``: A :symbol:`bson:bson_t` containing change stream options. .. include:: includes/change-stream-opts.txt Returns ------- A newly allocated :symbol:`mongoc_change_stream_t` which must be freed with :symbol:`mongoc_change_stream_destroy` when no longer in use. The returned :symbol:`mongoc_change_stream_t` is never ``NULL``. If there is an error, it can be retrieved with :symbol:`mongoc_change_stream_error_document`, and subsequent calls to :symbol:`mongoc_change_stream_next` will return ``false``. .. seealso:: | :doc:`mongoc_client_watch` | :doc:`mongoc_collection_watch` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_database_write_command_with_opts.rst000066400000000000000000000044761511661753600305470ustar00rootroot00000000000000:man_page: mongoc_database_write_command_with_opts mongoc_database_write_command_with_opts() ========================================= Synopsis -------- .. code-block:: c bool mongoc_database_write_command_with_opts (mongoc_database_t *database, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); Execute a command on the server, applying logic that is specific to commands that write, and taking the MongoDB server version into account. To send a raw command to the server without any of this logic, use :symbol:`mongoc_database_command_simple`. .. |opts-source| replace:: ``database`` .. include:: includes/write-opts-sources.txt ``reply`` is always initialized, and must be freed with :symbol:`bson:bson_destroy()`. Parameters ---------- * ``database``: A :symbol:`mongoc_database_t`. * ``db_name``: The name of the database to run the command on. * ``command``: A :symbol:`bson:bson_t` containing the command specification. * ``opts``: A :symbol:`bson:bson_t` containing additional options. * ``reply``: A |bson_t-opt-storage-ptr| to contain the results. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. .. include:: includes/write-opts.txt Consult `the MongoDB Manual entry on Database Commands `_ for each command's arguments. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. A write concern timeout or write concern error is considered a failure. Basic Write Operations ---------------------- Do not use this function to call the basic write commands "insert", "update", and "delete". Those commands require special logic not implemented in ``mongoc_database_write_command_with_opts``. For basic write operations use CRUD functions such as :symbol:`mongoc_collection_insert_one` and the others described in `the CRUD tutorial `_, or use the `Bulk API `_. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_error_has_label.rst000066400000000000000000000012701511661753600251030ustar00rootroot00000000000000:man_page: mongoc_error_has_label mongoc_error_has_label() ======================== Synopsis -------- .. code-block:: c bool mongoc_error_has_label (const bson_t *reply, const char *label); Test whether a reply from a failed operation includes a specific error label. See :ref:`Error Labels ` for details, and see :symbol:`mongoc_client_session_start_transaction` for example code that demonstrates their use. Parameters ---------- * ``reply``: A |bson_t-storage-ptr| to contain the results. * ``label``: The label to test for, such as "TransientTransactionError" or "UnknownTransactionCommitResult". Returns ------- Returns true if ``reply`` contains the error label. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_append.rst000066400000000000000000000021541511661753600274670ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_append mongoc_find_and_modify_opts_append() ==================================== Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_append (mongoc_find_and_modify_opts_t *opts, const bson_t *extra); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``extra``: A :symbol:`bson:bson_t` with fields and values to append directly to `the findAndModify command`_ sent to the server. Description ----------- Adds arbitrary options to `the findAndModify command`_. ``extra`` does not have to remain valid after calling this function. .. |opts-source| replace:: ``collection`` .. include:: includes/find-and-modify-appended-opts.txt Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. Appending options to findAndModify ---------------------------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_OPTS_BEGIN */ :end-before: /* EXAMPLE_FAM_OPTS_END */ :caption: opts.c mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_destroy.rst000066400000000000000000000010041511661753600277020ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_destroy mongoc_find_and_modify_opts_destroy() ===================================== Synopsis -------- .. code-block:: c void mongoc_find_and_modify_opts_destroy ( mongoc_find_and_modify_opts_t *find_and_modify_opts); Parameters ---------- * ``find_and_modify_opts``: A :symbol:`mongoc_find_and_modify_opts_t`. Description ----------- Frees all resources associated with the find and modify builder structure. Does nothing if ``find_and_modify_opts`` is NULL. mongoc_find_and_modify_opts_get_bypass_document_validation.rst000066400000000000000000000010711511661753600344060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_find_and_modify_opts_get_bypass_document_validation mongoc_find_and_modify_opts_get_bypass_document_validation() ============================================================ Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_get_bypass_document_validation ( const mongoc_find_and_modify_opts_t *opts); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. Returns ------- Returns true if :symbol:`mongoc_find_and_modify_opts_set_bypass_document_validation` was called previously on ``opts``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_get_fields.rst000066400000000000000000000011371511661753600303250ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_get_fields mongoc_find_and_modify_opts_get_fields() ======================================== Synopsis -------- .. code-block:: c void mongoc_find_and_modify_opts_get_fields ( const mongoc_find_and_modify_opts_t *opts, bson_t *fields); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``fields``: An uninitialized :symbol:`bson:bson_t`. Description ----------- Copy to ``fields`` the BSON document that was set with :symbol:`mongoc_find_and_modify_opts_set_fields`, or initializes ``fields`` with an empty BSON document. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_get_flags.rst000066400000000000000000000007231511661753600301530ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_get_flags mongoc_find_and_modify_opts_get_flags() ======================================= Synopsis -------- .. code-block:: c mongoc_find_and_modify_flags_t mongoc_find_and_modify_opts_get_flags ( const mongoc_find_and_modify_opts_t *opts); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. Returns ------- Returns the flags set with :symbol:`mongoc_find_and_modify_opts_set_flags`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_get_max_time_ms.rst000066400000000000000000000007471511661753600313670ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_get_max_time_ms mongoc_find_and_modify_opts_get_max_time_ms() ============================================= Synopsis -------- .. code-block:: c uint32_t mongoc_find_and_modify_opts_get_max_time_ms ( const mongoc_find_and_modify_opts_t *opts); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. Returns ------- Returns the "maxTimeMS" value set with :symbol:`mongoc_find_and_modify_opts_set_max_time_ms`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_get_sort.rst000066400000000000000000000011341511661753600300430ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_get_sort mongoc_find_and_modify_opts_get_sort() ====================================== Synopsis -------- .. code-block:: c void mongoc_find_and_modify_opts_get_sort (const mongoc_find_and_modify_opts_t *opts, bson_t *sort); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``sort``: An uninitialized :symbol:`bson:bson_t`. Description ----------- Copies the sort document set with :symbol:`mongoc_find_and_modify_opts_set_sort`, or initializes ``sort`` with an empty BSON document. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_get_update.rst000066400000000000000000000011141511661753600303340ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_get_update mongoc_find_and_modify_opts_get_update() ======================================== Synopsis -------- .. code-block:: c void mongoc_find_and_modify_opts_get_update ( const mongoc_find_and_modify_opts_t *opts, bson_t *update); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``update``: An uninitialized :symbol:`bson:bson_t`. Description ----------- Copies the update document set with :symbol:`mongoc_find_and_modify_opts_set_update`, or initializes ``update`` with an empty BSON document. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_new.rst000066400000000000000000000007031511661753600270070ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_new mongoc_find_and_modify_opts_new() ================================= Synopsis -------- .. code-block:: c mongoc_find_and_modify_opts_t * mongoc_find_and_modify_opts_new (void); Returns ------- Creates a newly allocated find and modify builder structure that is used to create a findAndModify command. This should be freed with :symbol:`mongoc_find_and_modify_opts_destroy()` when no longer in use. mongoc_find_and_modify_opts_set_bypass_document_validation.rst000066400000000000000000000033471511661753600344320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_find_and_modify_opts_set_bypass_document_validation mongoc_find_and_modify_opts_set_bypass_document_validation() ============================================================ Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_bypass_document_validation ( mongoc_find_and_modify_opts_t *opts, bool bypass); This option is only available when talking to MongoDB 3.2 and later. Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``bypass``: If the schema validation rules should be ignored. Description ----------- Adds bypassDocumentValidation argument to the builder. When authentication is enabled, the authenticated user must have either the "dbadmin" or "restore" roles to bypass document validation. Returns ------- Returns ``true`` if it successfully added the option to the builder, otherwise ``false`` and logs an error. Setting bypassDocumentValidation -------------------------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_BYPASS_BEGIN */ :end-before: /* EXAMPLE_FAM_BYPASS_END */ :caption: bypass.c Outputs: .. code-block:: c { "lastErrorObject" : {"updatedExisting" : true, "n" : 1}, "value" : { "_id" : {"$oid" : "56562a99d13e6d86239c7b00"}, "age" : 34, "firstname" : "Zlatan", "goals" : 342, "lastname" : "Ibrahimovic", "profession" : "Football player", "position" : "striker" }, "ok" : 1 } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_set_fields.rst000066400000000000000000000023571511661753600303460ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_set_fields mongoc_find_and_modify_opts_set_fields() ======================================== Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_fields (mongoc_find_and_modify_opts_t *opts, const bson_t *fields); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``fields``: A subset of fields to return. Choose which fields to include by appending ``{fieldname: 1}`` for each fieldname, or excluding it with ``{fieldname: 0}``. Description ----------- Adds fields argument to the builder. ``fields`` does not have to remain valid after calling this function. Returns ------- Returns ``true`` if it successfully added the option to the builder, otherwise ``false``. Setting fields -------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_FIELDS_BEGIN */ :end-before: /* EXAMPLE_FAM_FIELDS_END */ :caption: fields.c Outputs: .. code-block:: c { "lastErrorObject" : {"updatedExisting" : true, "n" : 1}, "value" : {"_id" : {"$oid" : "56562a99d13e6d86239c7b00"}, "goals" : 343}, "ok" : 1 } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_set_flags.rst000066400000000000000000000040431511661753600301660ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_set_flags mongoc_find_and_modify_opts_set_flags() ======================================= Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_flags ( mongoc_find_and_modify_opts_t *opts, const mongoc_find_and_modify_flags_t flags); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``flags``: . Description ----------- Adds one or more flags to the builder. ================================= ============================================================================= MONGOC_FIND_AND_MODIFY_NONE Default. Doesn't add anything to the builder. MONGOC_FIND_AND_MODIFY_REMOVE Will instruct find_and_modify to remove the matching document. MONGOC_FIND_AND_MODIFY_UPSERT Update the matching document or, if no document matches, insert the document. MONGOC_FIND_AND_MODIFY_RETURN_NEW Return the resulting document. ================================= ============================================================================= Returns ------- Returns Returns ``true`` if it successfully added the option to the builder, otherwise ``false`` and logs an error. Setting flags ------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_FLAGS_BEGIN */ :end-before: /* EXAMPLE_FAM_FLAGS_END */ :caption: flags.c Outputs: .. code-block:: c { "lastErrorObject" : { "updatedExisting" : false, "n" : 1, "upserted" : {"$oid" : "56562a99d13e6d86239c7b00"} }, "value" : { "_id" : {"$oid" : "56562a99d13e6d86239c7b00"}, "age" : 34, "firstname" : "Zlatan", "goals" : 342, "lastname" : "Ibrahimovic", "profession" : "Football player", "position" : "striker" }, "ok" : 1 } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_set_max_time_ms.rst000066400000000000000000000021771511661753600314020ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_set_max_time_ms mongoc_find_and_modify_opts_set_max_time_ms() ============================================= Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_max_time_ms ( mongoc_find_and_modify_opts_t *opts, uint32_t max_time_ms); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``max_time_ms``: The maximum server-side execution time permitted, in milliseconds, or 0 to specify no maximum time (the default setting). Description ----------- Adds a maxTimeMS argument to the builder. Returns ------- Returns ``true`` if it successfully added the option to the builder, otherwise ``false`` and logs an error. Note: although ``max_time_ms`` is a uint32_t, it is possible to set it as a uint64_t through the options arguments in some cursor returning functions like :symbol:`mongoc_collection_find_with_opts()`. Setting maxTimeMS ----------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_OPTS_BEGIN */ :end-before: /* EXAMPLE_FAM_OPTS_END */ :caption: opts.c mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_set_sort.rst000066400000000000000000000032051511661753600300600ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_set_sort mongoc_find_and_modify_opts_set_sort() ====================================== Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_sort (mongoc_find_and_modify_opts_t *opts, const bson_t *sort); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``sort``: Determines which document the operation modifies if the query selects multiple documents. findAndModify modifies the first document in the sort order specified by this argument. Description ----------- Adds sort argument to the builder. ``sort`` does not have to remain valid after calling this function. Returns ------- Returns ``true`` if it successfully added the option to the builder, otherwise ``false``. Setting sort ------------ .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_SORT_BEGIN */ :end-before: /* EXAMPLE_FAM_SORT_END */ :caption: sort.c Outputs: .. code-block:: c { "lastErrorObject" : {"updatedExisting" : true, "n" : 1}, "value" : { "_id" : {"$oid" : "56562a99d13e6d86239c7b00"}, "age" : 35, "firstname" : "Zlatan", "goals" : 343, "lastname" : "Ibrahimovic", "profession" : "Football player", "position" : "striker", "author" : true }, "ok" : 1 } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_set_update.rst000066400000000000000000000030661511661753600303600ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_set_update mongoc_find_and_modify_opts_set_update() ======================================== Synopsis -------- .. code-block:: c bool mongoc_find_and_modify_opts_set_update (mongoc_find_and_modify_opts_t *opts, const bson_t *update); Parameters ---------- * ``opts``: A :symbol:`mongoc_find_and_modify_opts_t`. * ``update``: The ``update`` document is the same format as the ``update`` document passed to :symbol:`mongoc_collection_update`. Description ----------- Adds update argument to the builder. ``update`` does not have to remain valid after calling this function. Returns ------- Returns ``true`` if it successfully added the option to the builder, otherwise ``false``. Setting update -------------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_UPDATE_BEGIN */ :end-before: /* EXAMPLE_FAM_UPDATE_END */ :caption: update.c Outputs: .. code-block:: c { "lastErrorObject" : {"updatedExisting" : true, "n" : 1}, "value" : { "_id" : {"$oid" : "56562a99d13e6d86239c7b00"}, "age" : 35, "firstname" : "Zlatan", "goals" : 342, "lastname" : "Ibrahimovic", "profession" : "Football player", "position" : "striker" }, "ok" : 1 } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_find_and_modify_opts_t.rst000066400000000000000000000111011511661753600264530ustar00rootroot00000000000000:man_page: mongoc_find_and_modify_opts_t mongoc_find_and_modify_opts_t ============================= find_and_modify abstraction Synopsis -------- ``mongoc_find_and_modify_opts_t`` is a builder interface to construct `the findAndModify command`_. It was created to be able to accommodate new arguments to `the findAndModify command`_. As of MongoDB 3.2, the :symbol:`mongoc_write_concern_t` specified on the :symbol:`mongoc_collection_t` will be used, if any. .. _mongoc_collection_find_and_modify_with_opts_example: Example ------- .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_FLAGS_BEGIN */ :end-before: /* EXAMPLE_FAM_FLAGS_END */ :caption: flags.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_BYPASS_BEGIN */ :end-before: /* EXAMPLE_FAM_BYPASS_END */ :caption: bypass.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_UPDATE_BEGIN */ :end-before: /* EXAMPLE_FAM_UPDATE_END */ :caption: update.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_FIELDS_BEGIN */ :end-before: /* EXAMPLE_FAM_FIELDS_END */ :caption: fields.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_SORT_BEGIN */ :end-before: /* EXAMPLE_FAM_SORT_END */ :caption: sort.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_OPTS_BEGIN */ :end-before: /* EXAMPLE_FAM_OPTS_END */ :caption: opts.c .. literalinclude:: ../examples/find_and_modify_with_opts/fam.c :language: c :start-after: /* EXAMPLE_FAM_MAIN_BEGIN */ :end-before: /* EXAMPLE_FAM_MAIN_END */ :caption: fam.c Outputs: .. code-block:: json { "lastErrorObject": { "updatedExisting": false, "n": 1, "upserted": { "$oid": "56562a99d13e6d86239c7b00" } }, "value": { "_id": { "$oid": "56562a99d13e6d86239c7b00" }, "age": 34, "firstname": "Zlatan", "goals": 342, "lastname": "Ibrahimovic", "profession": "Football player", "position": "striker" }, "ok": 1 } { "lastErrorObject": { "updatedExisting": true, "n": 1 }, "value": { "_id": { "$oid": "56562a99d13e6d86239c7b00" }, "age": 34, "firstname": "Zlatan", "goals": 342, "lastname": "Ibrahimovic", "profession": "Football player", "position": "striker" }, "ok": 1 } { "lastErrorObject": { "updatedExisting": true, "n": 1 }, "value": { "_id": { "$oid": "56562a99d13e6d86239c7b00" }, "age": 35, "firstname": "Zlatan", "goals": 342, "lastname": "Ibrahimovic", "profession": "Football player", "position": "striker" }, "ok": 1 } { "lastErrorObject": { "updatedExisting": true, "n": 1 }, "value": { "_id": { "$oid": "56562a99d13e6d86239c7b00" }, "goals": 343 }, "ok": 1 } { "lastErrorObject": { "updatedExisting": true, "n": 1 }, "value": { "_id": { "$oid": "56562a99d13e6d86239c7b00" }, "age": 35, "firstname": "Zlatan", "goals": 343, "lastname": "Ibrahimovic", "profession": "Football player", "position": "striker", "author": true }, "ok": 1 } .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_find_and_modify_opts_append mongoc_find_and_modify_opts_destroy mongoc_find_and_modify_opts_get_bypass_document_validation mongoc_find_and_modify_opts_get_fields mongoc_find_and_modify_opts_get_flags mongoc_find_and_modify_opts_get_max_time_ms mongoc_find_and_modify_opts_get_sort mongoc_find_and_modify_opts_get_update mongoc_find_and_modify_opts_new mongoc_find_and_modify_opts_set_bypass_document_validation mongoc_find_and_modify_opts_set_fields mongoc_find_and_modify_opts_set_flags mongoc_find_and_modify_opts_set_max_time_ms mongoc_find_and_modify_opts_set_sort mongoc_find_and_modify_opts_set_update mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_get_major_version.rst000066400000000000000000000004011511661753600254670ustar00rootroot00000000000000:man_page: mongoc_get_major_version mongoc_get_major_version() ========================== Synopsis -------- .. code-block:: c int mongoc_get_major_version (void); Returns ------- The value of ``MONGOC_MAJOR_VERSION`` when libmongoc was compiled. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_get_micro_version.rst000066400000000000000000000004011511661753600254700ustar00rootroot00000000000000:man_page: mongoc_get_micro_version mongoc_get_micro_version() ========================== Synopsis -------- .. code-block:: c int mongoc_get_micro_version (void); Returns ------- The value of ``MONGOC_MICRO_VERSION`` when libmongoc was compiled. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_get_minor_version.rst000066400000000000000000000004011511661753600255030ustar00rootroot00000000000000:man_page: mongoc_get_minor_version mongoc_get_minor_version() ========================== Synopsis -------- .. code-block:: c int mongoc_get_minor_version (void); Returns ------- The value of ``MONGOC_MINOR_VERSION`` when libmongoc was compiled. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_get_version.rst000066400000000000000000000004201511661753600243000ustar00rootroot00000000000000:man_page: mongoc_get_version mongoc_get_version() ==================== Synopsis -------- .. code-block:: c const char * mongoc_get_version (void); Returns ------- A string representation of libmongoc's version, formatted something like "1.2.3" or "1.2.3-pre". mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_abort_upload.rst000066400000000000000000000013051511661753600273250ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_abort_upload mongoc_gridfs_bucket_abort_upload() =================================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_abort_upload (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t` created by :symbol:`mongoc_gridfs_bucket_open_upload_stream` or :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id`. Description ----------- Aborts the upload of a GridFS upload stream. Returns ------- True on success. False otherwise, and sets an error on ``stream``. .. seealso:: | :symbol:`mongoc_gridfs_bucket_open_upload_stream` | :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_delete_by_id.rst000066400000000000000000000013431511661753600272640ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_delete_by_id mongoc_gridfs_bucket_delete_by_id() =================================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_delete_by_id (mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``file_id``: A :symbol:`bson_value_t` of the id of the file to delete. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. Description ----------- Deletes a file and its contents from GridFS. Returns ------- True if the operation succeeded. False otherwise, and sets ``error``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_destroy.rst000066400000000000000000000006241511661753600263460ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_destroy mongoc_gridfs_bucket_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_gridfs_bucket_destroy (mongoc_gridfs_bucket_t *bucket); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t` or ``NULL``. Description ----------- Destroys a :symbol:`mongoc_gridfs_bucket_t`. Does nothing if passed ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_download_to_stream.rst000066400000000000000000000025621511661753600305440ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_download_to_stream mongoc_gridfs_bucket_download_to_stream() ========================================= Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_download_to_stream (mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, mongoc_stream_t *destination, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``file_id``: A :symbol:`bson_value_t` of the id of the file to download. * ``destination``: A :symbol:`mongoc_stream_t` which receives data from the downloaded file. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. Description ----------- Reads from the GridFS file and writes to the ``destination`` stream. Writes the full contents of the file to the ``destination`` stream. The ``destination`` stream is not closed after calling :symbol:`mongoc_gridfs_bucket_download_to_stream()`; call :symbol:`mongoc_stream_close()` after. .. include:: includes/retryable-read.txt Returns ------- True if the operation succeeded. False otherwise, and sets ``error``. .. seealso:: | :symbol:`mongoc_stream_file_new` and :symbol:`mongoc_stream_file_new_for_path`, which can be used to create a destination stream from a file. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_find.rst000066400000000000000000000015221511661753600255730ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_find mongoc_gridfs_bucket_find() =========================== Synopsis -------- .. code-block:: c mongoc_cursor_t * mongoc_gridfs_bucket_find (mongoc_gridfs_bucket_t *bucket, const bson_t *filter, const bson_t *opts); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``filter``: A :symbol:`bson_t` containing the query to execute. * ``opts``: A :symbol:`bson_t` for query options, supporting all options in :symbol:`mongoc_collection_find_with_opts()` excluding ``sessionId``. Description ----------- Finds file documents from the bucket's ``files`` collection. .. include:: includes/retryable-read.txt Returns ------- A newly allocated :symbol:`mongoc_cursor_t` that must be freed with :symbol:`mongoc_cursor_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_new.rst000066400000000000000000000017321511661753600254470ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_new mongoc_gridfs_bucket_new() ========================== Synopsis -------- .. code-block:: c mongoc_gridfs_bucket_t * mongoc_gridfs_bucket_new (mongoc_database_t *db, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_error_t* error); Parameters ---------- * ``db``: A :symbol:`mongoc_database_t`. * ``opts``: A :symbol:`bson_t` or ``NULL`` * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` used for read operations or ``NULL`` to inherit read preferences from ``db``. * ``error``: A :symbol:`bson_error_t` or ``NULL``. .. include:: includes/gridfs-bucket-opts.txt Description ----------- Creates a new :symbol:`mongoc_gridfs_bucket_t`. Use this handle to perform GridFS operations. Returns ------- A newly allocated :symbol:`mongoc_gridfs_bucket_t` that should be freed with :symbol:`mongoc_gridfs_bucket_destroy()` or ``NULL`` on failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_open_download_stream.rst000066400000000000000000000017021511661753600310560ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_open_download_stream mongoc_gridfs_bucket_open_download_stream() =========================================== Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_gridfs_bucket_open_download_stream (mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``file_id``: A :symbol:`bson_value_t` of the id of the file to download. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. Description ----------- Opens a stream for reading a file from GridFS. Returns ------- A :symbol:`mongoc_stream_t` that can be read from or ``NULL`` on failure. Errors on this stream can be retrieved with :symbol:`mongoc_gridfs_bucket_stream_error()`. .. seealso:: | :symbol:`mongoc_gridfs_bucket_stream_error()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_open_upload_stream.rst000066400000000000000000000027751511661753600305460ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_open_upload_stream mongoc_gridfs_bucket_open_upload_stream() ========================================= Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_gridfs_bucket_open_upload_stream (mongoc_gridfs_bucket_t *bucket, const char *filename, const bson_t *opts, bson_value_t *file_id, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``filename``: The name of the file to create. * ``opts``: A :symbol:`bson_t` or ``NULL``. * ``file_id``: A :symbol:`bson_value_t` to receive the generated id of the file or ``NULL``. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. .. include:: includes/gridfs-bucket-upload-opts.txt Description ----------- Opens a stream for writing to a new file in GridFS. The file id is generated automatically. To specify an explicit file id, use :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id()`. Returns ------- A :symbol:`mongoc_stream_t` that can be written to or ``NULL`` on failure. Errors on this stream can be retrieved with :symbol:`mongoc_gridfs_bucket_stream_error`. After calling :symbol:`mongoc_stream_close` the file is completely written in GridFS. .. seealso:: | :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id()` | :symbol:`mongoc_gridfs_bucket_stream_error()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_open_upload_stream_with_id.rst000066400000000000000000000030211511661753600322360ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_open_upload_stream_with_id mongoc_gridfs_bucket_open_upload_stream_with_id() ================================================= Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_gridfs_bucket_open_upload_stream_with_id (mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``file_id``: A :symbol:`bson_value_t` specifying the id of the created file. * ``filename``: The name of the file to create. * ``opts``: A :symbol:`bson_t` or ``NULL``. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. .. include:: includes/gridfs-bucket-upload-opts.txt Description ----------- Opens a stream for writing to a new file in GridFS for a specified file id. To have libmongoc generate an id, use :symbol:`mongoc_gridfs_bucket_open_upload_stream()`. Returns ------- A :symbol:`mongoc_stream_t` that can be written to or ``NULL`` on failure. Errors on this stream can be retrieved with :symbol:`mongoc_gridfs_bucket_stream_error`. After calling :symbol:`mongoc_stream_close` the file is completely written in GridFS. .. seealso:: | :symbol:`mongoc_gridfs_bucket_open_upload_stream()` | :symbol:`mongoc_gridfs_bucket_stream_error()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_stream_error.rst000066400000000000000000000017071511661753600273640ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_stream_error mongoc_gridfs_bucket_stream_error() =================================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_stream_error (mongoc_stream_t *stream, bson_error_t *error); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t` created by :symbol:`mongoc_gridfs_bucket_open_upload_stream`, :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id`, or :symbol:`mongoc_gridfs_bucket_open_download_stream`. * ``error``: A :symbol:`bson_error_t` to receive the possible error. Description ----------- Retrieves an error for a GridFS stream if one exists. Returns ------- True if an error occurred on the stream and sets ``error``. False otherwise. .. seealso:: | :symbol:`mongoc_gridfs_bucket_open_upload_stream` | :symbol:`mongoc_gridfs_bucket_open_upload_stream_with_id()` | :symbol:`mongoc_gridfs_bucket_open_download_stream` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_t.rst000066400000000000000000000033411511661753600251170ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_t mongoc_gridfs_bucket_t ====================== Synopsis -------- .. code-block:: c #include typedef struct _mongoc_gridfs_bucket_t mongoc_gridfs_bucket_t; Description ----------- ``mongoc_gridfs_bucket_t`` provides a spec-compliant MongoDB GridFS implementation, superseding :symbol:`mongoc_gridfs_t`. See the `GridFS MongoDB documentation `_. Thread Safety ------------- :symbol:`mongoc_gridfs_bucket_t` is NOT thread-safe and should only be used in the same thread as the owning :symbol:`mongoc_client_t`. Lifecycle --------- It is an error to free a :symbol:`mongoc_gridfs_bucket_t` before freeing all derived instances of :symbol:`mongoc_stream_t`. The owning :symbol:`mongoc_client_t` must outlive the :symbol:`mongoc_gridfs_bucket_t`. Example ------- .. literalinclude:: ../examples/example-gridfs-bucket.c :language: c :caption: example-gridfs-bucket.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_gridfs_bucket_abort_upload mongoc_gridfs_bucket_delete_by_id mongoc_gridfs_bucket_destroy mongoc_gridfs_bucket_download_to_stream mongoc_gridfs_bucket_find mongoc_gridfs_bucket_new mongoc_gridfs_bucket_open_download_stream mongoc_gridfs_bucket_open_upload_stream mongoc_gridfs_bucket_open_upload_stream_with_id mongoc_gridfs_bucket_stream_error mongoc_gridfs_bucket_upload_from_stream mongoc_gridfs_bucket_upload_from_stream_with_id .. seealso:: | The `MongoDB GridFS specification `_. | The non spec-compliant :symbol:`mongoc_gridfs_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_upload_from_stream.rst000066400000000000000000000034071511661753600305410ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_upload_from_stream mongoc_gridfs_bucket_upload_from_stream() ========================================= Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_upload_from_stream (mongoc_gridfs_bucket_t *bucket, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_value_t *file_id, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``filename``: The name of the file to create. * ``source``: A :symbol:`mongoc_stream_t` used as the source of the data to upload. * ``opts``: A :symbol:`bson_t` or ``NULL``. * ``file_id``: A :symbol:`bson_value_t` to receive the generated id of the file or ``NULL``. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. .. include:: includes/gridfs-bucket-upload-opts.txt Description ----------- Reads from the ``source`` stream and writes to a new file in GridFS. The file id is generated automatically. To specify an explicit file id, use :symbol:`mongoc_gridfs_bucket_upload_from_stream_with_id()`. Reads from the ``source`` stream using :symbol:`mongoc_stream_read()` until the return value indicates end-of-file. The ``source`` stream is not closed after calling :symbol:`mongoc_gridfs_bucket_upload_from_stream()`; call :symbol:`mongoc_stream_close()` after. Returns ------- True if the operation succeeded. False otherwise and sets ``error``. .. seealso:: | :symbol:`mongoc_stream_file_new` and :symbol:`mongoc_stream_file_new_for_path`, which can be used to create a source stream from a file. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_bucket_upload_from_stream_with_id.rst000066400000000000000000000034311511661753600322450ustar00rootroot00000000000000:man_page: mongoc_gridfs_bucket_upload_from_stream_with_id mongoc_gridfs_bucket_upload_from_stream_with_id() ================================================= Synopsis -------- .. code-block:: c bool mongoc_gridfs_bucket_upload_from_stream_with_id (mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``bucket``: A :symbol:`mongoc_gridfs_bucket_t`. * ``file_id``: A :symbol:`bson_value_t` specifying the id of the created file. * ``filename``: The name of the file to create. * ``source``: A :symbol:`mongoc_stream_t` used as the source of the data to upload. * ``opts``: A :symbol:`bson_t` or ``NULL``. * ``error``: A :symbol:`bson_error_t` to receive any error or ``NULL``. .. include:: includes/gridfs-bucket-upload-opts.txt Description ----------- Reads from the ``source`` stream and writes to a new file in GridFS. To have libmongoc generate an id, use :symbol:`mongoc_gridfs_bucket_upload_from_stream()`. Reads from the ``source`` stream using :symbol:`mongoc_stream_read()` until the return value indicates end-of-file. The ``source`` stream is not closed after calling :symbol:`mongoc_gridfs_bucket_upload_from_stream()`; call :symbol:`mongoc_stream_close()` after. Returns ------- True if the operation succeeded. False otherwise and sets ``error``. .. seealso:: | :symbol:`mongoc_stream_file_new` and :symbol:`mongoc_stream_file_new_for_path`, which can be used to create a source stream from a file. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_create_file.rst000066400000000000000000000013071511661753600255610ustar00rootroot00000000000000:man_page: mongoc_gridfs_create_file mongoc_gridfs_create_file() =========================== Synopsis -------- .. code-block:: c mongoc_gridfs_file_t * mongoc_gridfs_create_file (mongoc_gridfs_t *gridfs, mongoc_gridfs_file_opt_t *opt); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``opt``: A :symbol:`mongoc_gridfs_file_opt_t` to specify file options. Description ----------- This function shall create a new :symbol:`mongoc_gridfs_file_t`. Use :symbol:`mongoc_gridfs_file_writev()` to write to the file. Returns ------- Returns a newly allocated :symbol:`mongoc_gridfs_file_t` that should be freed with :symbol:`mongoc_gridfs_file_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_create_file_from_stream.rst000066400000000000000000000021151511661753600301550ustar00rootroot00000000000000:man_page: mongoc_gridfs_create_file_from_stream mongoc_gridfs_create_file_from_stream() ======================================= Synopsis -------- .. code-block:: c mongoc_gridfs_file_t * mongoc_gridfs_create_file_from_stream (mongoc_gridfs_t *gridfs, mongoc_stream_t *stream, mongoc_gridfs_file_opt_t *opt); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``stream``: A :symbol:`mongoc_stream_t`. * ``opt``: A :symbol:`mongoc_gridfs_file_opt_t` to specify file options. Description ----------- This function shall create a new :symbol:`mongoc_gridfs_file_t` and fill it with the contents of ``stream``. Note that this function will read from ``stream`` until End of File, making it best suited for file-backed streams. Returns ------- A newly allocated :symbol:`mongoc_gridfs_file_t` that should be freed with :symbol:`mongoc_gridfs_file_destroy()` when no longer in use. Returns NULL and logs an error message if there is a network or server error writing data to the MongoDB server. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_destroy.rst000066400000000000000000000006541511661753600250140ustar00rootroot00000000000000:man_page: mongoc_gridfs_destroy mongoc_gridfs_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_gridfs_destroy (mongoc_gridfs_t *gridfs); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. Description ----------- This function shall destroy the gridfs structure referenced by ``gridfs`` and any resources associated with the gridfs. Does nothing if ``gridfs`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_drop.rst000066400000000000000000000012311511661753600242570ustar00rootroot00000000000000:man_page: mongoc_gridfs_drop mongoc_gridfs_drop() ==================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_drop (mongoc_gridfs_t *gridfs, bson_error_t *error); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Requests that an entire GridFS be dropped, including all files associated with it. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_destroy.rst000066400000000000000000000006471511661753600260150ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_destroy mongoc_gridfs_file_destroy() ============================ Synopsis -------- .. code-block:: c void mongoc_gridfs_file_destroy (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Destroys the :symbol:`mongoc_gridfs_file_t` instance and any resources associated with it. Does nothing if ``file`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_error.rst000066400000000000000000000012411511661753600254440ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_error mongoc_gridfs_file_error() ========================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_file_error (mongoc_gridfs_file_t *file, bson_error_t *error); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- This function checks to see if there has been an error associated with the last operation upon ``file``. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns false if there has been no registered error, otherwise true and error is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_aliases.rst000066400000000000000000000007411511661753600265770ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_aliases mongoc_gridfs_file_get_aliases() ================================ Synopsis -------- .. code-block:: c const bson_t * mongoc_gridfs_file_get_aliases (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the aliases associated with a gridfs file. Returns ------- Returns a :symbol:`const bson_t * ` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_chunk_size.rst000066400000000000000000000006621511661753600273220ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_chunk_size mongoc_gridfs_file_get_chunk_size() =================================== Synopsis -------- .. code-block:: c int32_t mongoc_gridfs_file_get_chunk_size (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the chunk size used with the underlying gridfs file. Returns ------- A signed 32-bit integer. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_content_type.rst000066400000000000000000000007351511661753600276740ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_content_type mongoc_gridfs_file_get_content_type() ===================================== Synopsis -------- .. code-block:: c const char * mongoc_gridfs_file_get_content_type (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the content type specified for the underlying file. Returns ------- Returns a string which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_filename.rst000066400000000000000000000006711511661753600267400ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_filename mongoc_gridfs_file_get_filename() ================================= Synopsis -------- .. code-block:: c const char * mongoc_gridfs_file_get_filename (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the filename for the given gridfs file. Returns ------- A string which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_id.rst000066400000000000000000000011011511661753600255410ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_id mongoc_gridfs_file_get_id() =========================== Synopsis -------- .. code-block:: c const bson_value_t * mongoc_gridfs_file_get_id (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the id of a gridfs file. The C Driver always uses an ObjectId for ``_id``, but files created by other drivers may have any type of ``_id``. Returns ------- Returns a :symbol:`const bson_value_t * ` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_length.rst000066400000000000000000000006251511661753600264400ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_length mongoc_gridfs_file_get_length() =============================== Synopsis -------- .. code-block:: c int64_t mongoc_gridfs_file_get_length (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the length of the gridfs file in bytes. Returns ------- A 64-bit signed integer. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_md5.rst000066400000000000000000000006711511661753600256450ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_md5 mongoc_gridfs_file_get_md5() ============================ Synopsis -------- .. code-block:: c const char * mongoc_gridfs_file_get_md5 (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the pre-computed MD5 for the underlying gridfs file. Returns ------- Returns a string that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_metadata.rst000066400000000000000000000007671511661753600267460ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_metadata mongoc_gridfs_file_get_metadata() ================================= Synopsis -------- .. code-block:: c const bson_t * mongoc_gridfs_file_get_metadata (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches a bson document containing the metadata for the gridfs file. Returns ------- Returns a :symbol:`const bson_t * ` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_get_upload_date.rst000066400000000000000000000010051511661753600274310ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_get_upload_date mongoc_gridfs_file_get_upload_date() ==================================== Synopsis -------- .. code-block:: c int64_t mongoc_gridfs_file_get_upload_date (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Fetches the specified upload date of the gridfs file in milliseconds since the UNIX epoch. Returns ------- A signed int64 with the upload date in milliseconds since the UNIX epoch. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_list_destroy.rst000066400000000000000000000006671511661753600270520ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_list_destroy mongoc_gridfs_file_list_destroy() ================================= Synopsis -------- .. code-block:: c void mongoc_gridfs_file_list_destroy (mongoc_gridfs_file_list_t *list); Parameters ---------- * ``list``: A :symbol:`mongoc_gridfs_file_list_t`. Description ----------- Frees a ``mongoc_gridfs_file_list_t`` and releases any associated resources. Does nothing if ``list`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_list_error.rst000066400000000000000000000012651511661753600265050ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_list_error mongoc_gridfs_file_list_error() =============================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_file_list_error (mongoc_gridfs_file_list_t *list, bson_error_t *error); Parameters ---------- * ``list``: A :symbol:`mongoc_gridfs_file_list_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Fetches any error that has occurred while trying to retrieve the file list. Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- false if no error has been registered, otherwise true and error is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_list_next.rst000066400000000000000000000011541511661753600263270ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_list_next mongoc_gridfs_file_list_next() ============================== Synopsis -------- .. code-block:: c mongoc_gridfs_file_t * mongoc_gridfs_file_list_next (mongoc_gridfs_file_list_t *list); Parameters ---------- * ``list``: A :symbol:`mongoc_gridfs_file_list_t`. Description ----------- This function shall iterate the underlying gridfs file list, returning the next file each iteration. This is a blocking function. Returns ------- A newly allocated :symbol:`mongoc_gridfs_file_t` that should be freed with :symbol:`mongoc_gridfs_file_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_list_t.rst000066400000000000000000000020211511661753600256060ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_list_t mongoc_gridfs_file_list_t ========================= Synopsis -------- .. code-block:: c #include typedef struct _mongoc_gridfs_file_list_t mongoc_gridfs_file_list_t; Description ----------- ``mongoc_gridfs_file_list_t`` provides a gridfs file list abstraction. It provides iteration and basic marshalling on top of a regular :symbol:`mongoc_collection_find_with_opts()` style query. In interface, it's styled after :symbol:`mongoc_cursor_t`. Example ------- .. code-block:: c mongoc_gridfs_file_list_t *list; mongoc_gridfs_file_t *file; list = mongoc_gridfs_find_with_opts (gridfs, query, NULL); while ((file = mongoc_gridfs_file_list_next (list))) { do_something (file); mongoc_gridfs_file_destroy (file); } mongoc_gridfs_file_list_destroy (list); .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_gridfs_file_list_destroy mongoc_gridfs_file_list_error mongoc_gridfs_file_list_next mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_opt_t.rst000066400000000000000000000011421511661753600254400ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_opt_t mongoc_gridfs_file_opt_t ======================== Synopsis -------- .. code-block:: c typedef struct { const char *md5; const char *filename; const char *content_type; const bson_t *aliases; const bson_t *metadata; uint32_t chunk_size; } mongoc_gridfs_file_opt_t; Description ----------- This structure contains options that can be set on a :symbol:`mongoc_gridfs_file_t`. It can be used by various functions when creating a new gridfs file. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_readv.rst000066400000000000000000000017411511661753600254210ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_readv mongoc_gridfs_file_readv() ========================== Synopsis -------- .. code-block:: c ssize_t mongoc_gridfs_file_readv (mongoc_gridfs_file_t *file, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, uint32_t timeout_msec); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``iov``: An array of :symbol:`mongoc_iovec_t`. * ``iovcnt``: The number of elements in ``iov``. * ``min_bytes``: The minimum number of bytes that must be read or an error will be synthesized. * ``timeout_msec``: Unused. Description ----------- This function performs a scattered read from ``file``, potentially blocking to read from the MongoDB server. The ``timeout_msec`` parameter is unused. Returns ------- Returns the number of bytes read, or -1 on failure. Use :symbol:`mongoc_gridfs_file_error` to retrieve error details. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_remove.rst000066400000000000000000000012461511661753600256150ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_remove mongoc_gridfs_file_remove() =========================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_file_remove (mongoc_gridfs_file_t *file, bson_error_t *error); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Removes ``file`` and its data chunks from the MongoDB server. Returns ------- Returns ``true`` if successful. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. Errors ------ Errors are propagated via the ``error`` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_save.rst000066400000000000000000000012041511661753600252500ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_save mongoc_gridfs_file_save() ========================= Synopsis -------- .. code-block:: c bool mongoc_gridfs_file_save (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- Saves modifications to ``file`` to the MongoDB server. If an error occurred, false is returned and the error can be retrieved with :symbol:`mongoc_gridfs_file_error()`. Modifying GridFS files is NOT thread-safe. Only one thread or process can access a GridFS file while it is being modified. Returns ------- Returns true if successful, otherwise false. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_seek.rst000066400000000000000000000026611511661753600252510ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_seek mongoc_gridfs_file_seek() ========================= Synopsis -------- .. code-block:: c int mongoc_gridfs_file_seek (mongoc_gridfs_file_t *file, int64_t delta, int whence); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``delta``: The amount to move the file position. May be positive or negative. * ``whence``: One of SEEK_SET, SEEK_CUR or SEEK_END. Description ----------- Adjust the file position pointer in the given file by ``delta``, starting from the position ``whence``. The ``whence`` argument is interpreted as in ``fseek(2)``: ============ ===================================================== ``SEEK_SET`` Set the position relative to the start of the file. ``SEEK_CUR`` Move ``delta`` relative to the current file position. ``SEEK_END`` Move ``delta`` relative to the end of the file. ============ ===================================================== On success, the file's underlying position pointer is set appropriately. On failure, the file position is NOT changed and errno is set to indicate the error. Errors ------ ========== ======================================================== ``EINVAL`` ``whence`` is not one of SEEK_SET, SEEK_CUR or SEEK_END. ``EINVAL`` The resulting file position would be negative. ========== ======================================================== Returns ------- Returns 0 if successful; otherwise -1 and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_aliases.rst000066400000000000000000000007751511661753600266220ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_aliases mongoc_gridfs_file_set_aliases() ================================ Synopsis -------- .. code-block:: c void mongoc_gridfs_file_set_aliases (mongoc_gridfs_file_t *file, const bson_t *bson); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``bson``: A :symbol:`bson:bson_t` containing the aliases. Description ----------- Sets the aliases for a gridfs file. You need to call :symbol:`mongoc_gridfs_file_save()` to persist this change. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_content_type.rst000066400000000000000000000011521511661753600277020ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_content_type mongoc_gridfs_file_set_content_type() ===================================== Synopsis -------- .. code-block:: c void mongoc_gridfs_file_set_content_type (mongoc_gridfs_file_t *file, const char *content_type); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``str``: A string containing the content type. Description ----------- Sets the content type for the gridfs file. This should be something like ``"text/plain"``. You need to call :symbol:`mongoc_gridfs_file_save()` to persist this change. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_filename.rst000066400000000000000000000010411511661753600267440ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_filename mongoc_gridfs_file_set_filename() ================================= Synopsis -------- .. code-block:: c void mongoc_gridfs_file_set_filename (mongoc_gridfs_file_t *file, const char *filename); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``str``: A UTF-8 encoded string containing the filename. Description ----------- Sets the filename for ``file``. You need to call :symbol:`mongoc_gridfs_file_save()` to persist this change. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_id.rst000066400000000000000000000012731511661753600255670ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_id mongoc_gridfs_file_set_id() =========================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_file_set_id (mongoc_gridfs_file_t *file, const bson_value_t *id, bson_error_t error); Parameters ---------- * ``file``: A :symbol:` mongoc_gridfs_file_t `. * ``id``: A :symbol:`bson:bson_value_t`. * ``error``: A :symbol:`bson_error_t `. Description ----------- Sets the id of ``file`` to any BSON type. If an error occurred, false is returned. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_md5.rst000066400000000000000000000007421511661753600256600ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_md5 mongoc_gridfs_file_set_md5() ============================ Synopsis -------- .. code-block:: c void mongoc_gridfs_file_set_md5 (mongoc_gridfs_file_t *file, const char *md5); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``str``: A string containing the MD5 of the file. Description ----------- Sets the MD5 checksum for ``file``. You need to call :symbol:`mongoc_gridfs_file_save()` to persist this change. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_set_metadata.rst000066400000000000000000000010721511661753600267500ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_set_metadata mongoc_gridfs_file_set_metadata() ================================= Synopsis -------- .. code-block:: c void mongoc_gridfs_file_set_metadata (mongoc_gridfs_file_t *file, const bson_t *metadata); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``bson``: A :symbol:`bson:bson_t` containing metadata for ``file``. Description ----------- Sets the metadata associated with ``file``. You need to call :symbol:`mongoc_gridfs_file_save()` to persist this change. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_t.rst000066400000000000000000000031261511661753600245620ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_t mongoc_gridfs_file_t ==================== Synopsis -------- .. code-block:: c typedef struct _mongoc_gridfs_file_t mongoc_gridfs_file_t; Description ----------- This structure provides a MongoDB GridFS file abstraction. It provides several APIs. * readv, writev, seek, and tell. * General file metadata such as filename and length. * GridFS metadata such as md5, filename, content_type, aliases, metadata, chunk_size, and upload_date. Thread Safety ------------- This structure is NOT thread-safe and should only be used from one thread at a time. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_gridfs_file_destroy mongoc_gridfs_file_error mongoc_gridfs_file_get_aliases mongoc_gridfs_file_get_chunk_size mongoc_gridfs_file_get_content_type mongoc_gridfs_file_get_filename mongoc_gridfs_file_get_id mongoc_gridfs_file_get_length mongoc_gridfs_file_get_md5 mongoc_gridfs_file_get_metadata mongoc_gridfs_file_get_upload_date mongoc_gridfs_file_readv mongoc_gridfs_file_remove mongoc_gridfs_file_save mongoc_gridfs_file_seek mongoc_gridfs_file_set_aliases mongoc_gridfs_file_set_content_type mongoc_gridfs_file_set_filename mongoc_gridfs_file_set_id mongoc_gridfs_file_set_md5 mongoc_gridfs_file_set_metadata mongoc_gridfs_file_tell mongoc_gridfs_file_writev mongoc_stream_gridfs_new Related ------- * :symbol:`mongoc_client_t` * :symbol:`mongoc_gridfs_t` * :symbol:`mongoc_gridfs_file_list_t` * :symbol:`mongoc_gridfs_file_opt_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_tell.rst000066400000000000000000000006621511661753600252610ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_tell mongoc_gridfs_file_tell() ========================= Synopsis -------- .. code-block:: c uint64_t mongoc_gridfs_file_tell (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. Description ----------- This function returns the current position indicator within ``file``. Returns ------- Returns a file position as an unsigned 64-bit integer. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_file_writev.rst000066400000000000000000000016521511661753600256410ustar00rootroot00000000000000:man_page: mongoc_gridfs_file_writev mongoc_gridfs_file_writev() =========================== Synopsis -------- .. code-block:: c ssize_t mongoc_gridfs_file_writev (mongoc_gridfs_file_t *file, const mongoc_iovec_t *iov, size_t iovcnt, uint32_t timeout_msec); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. * ``iov``: An array of :symbol:`mongoc_iovec_t`. * ``iovcnt``: The number of elements in ``iov``. * ``timeout_msec``: Unused. Description ----------- Performs a gathered write to the underlying gridfs file. The ``timeout_msec`` parameter is unused. Modifying GridFS files is NOT thread-safe. Only one thread or process can access a GridFS file while it is being modified. Returns ------- Returns the number of bytes written, or -1 on failure. Use :symbol:`mongoc_gridfs_file_error` to retrieve error details. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_find_one_by_filename.rst000066400000000000000000000021611511661753600274310ustar00rootroot00000000000000:man_page: mongoc_gridfs_find_one_by_filename mongoc_gridfs_find_one_by_filename() ==================================== Synopsis -------- .. code-block:: c mongoc_gridfs_file_t * mongoc_gridfs_find_one_by_filename (mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``filename``: A UTF-8 encoded string containing the filename. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Finds the first file matching the filename specified. If there is an error, NULL is returned and ``error`` is filled out; if there is no error but no matching file is found, NULL is returned and the error code and domain are 0. .. include:: includes/retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns a newly allocated :symbol:`mongoc_gridfs_file_t` if successful. You must free the resulting file with :symbol:`mongoc_gridfs_file_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_find_one_with_opts.rst000066400000000000000000000026001511661753600271750ustar00rootroot00000000000000:man_page: mongoc_gridfs_find_one_with_opts mongoc_gridfs_find_one_with_opts() ================================== Synopsis -------- .. code-block:: c mongoc_gridfs_file_t * mongoc_gridfs_find_one_with_opts (mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts, bson_error_t *error); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``filter``: A :symbol:`bson:bson_t` containing the query to execute. * ``opts``: A :symbol:`bson:bson_t` query options, including sort order and which fields to return. Can be ``NULL``. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Find the first GridFS file matching ``filter``. If there is an error, NULL is returned and ``error`` is filled out; if there is no error but no matching file is found, NULL is returned and the error code and domain are 0. See :symbol:`mongoc_collection_find_with_opts` for a description of the ``filter`` and ``opts`` parameters. .. include:: includes/retryable-read.txt Errors ------ Errors are propagated via the ``error`` parameter. Returns ------- Returns a newly allocated :symbol:`mongoc_gridfs_file_t` if successful. You must free the resulting file with :symbol:`mongoc_gridfs_file_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_find_with_opts.rst000066400000000000000000000020311511661753600263320ustar00rootroot00000000000000:man_page: mongoc_gridfs_find_with_opts mongoc_gridfs_find_with_opts() ============================== Synopsis -------- .. code-block:: c mongoc_gridfs_file_list_t * mongoc_gridfs_find_with_opts (mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``filter``: A :symbol:`bson:bson_t` containing the query to execute. * ``opts``: A :symbol:`bson:bson_t` query options, including sort order and which fields to return. Can be ``NULL``. Description ----------- Finds all gridfs files matching ``filter``. You can iterate the matched gridfs files with the resulting file list. See :symbol:`mongoc_collection_find_with_opts` for a description of the ``filter`` and ``opts`` parameters. .. include:: includes/retryable-read.txt Returns ------- A newly allocated :symbol:`mongoc_gridfs_file_list_t` that should be freed with :symbol:`mongoc_gridfs_file_list_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_get_chunks.rst000066400000000000000000000011001511661753600254400ustar00rootroot00000000000000:man_page: mongoc_gridfs_get_chunks mongoc_gridfs_get_chunks() ========================== Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_gridfs_get_chunks (mongoc_gridfs_t *gridfs); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. Description ----------- Returns a :symbol:`mongoc_collection_t` that contains the chunks for files. This instance is owned by the :symbol:`mongoc_gridfs_t` instance and should not be modified or freed. Returns ------- Returns a :symbol:`mongoc_collection_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_get_files.rst000066400000000000000000000010741511661753600252610ustar00rootroot00000000000000:man_page: mongoc_gridfs_get_files mongoc_gridfs_get_files() ========================= Synopsis -------- .. code-block:: c mongoc_collection_t * mongoc_gridfs_get_files (mongoc_gridfs_t *gridfs); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. Description ----------- Retrieves the :symbol:`mongoc_collection_t` containing the file metadata for GridFS. This instance is owned by the :symbol:`mongoc_gridfs_t` and should not be modified or freed. Returns ------- Returns a :symbol:`mongoc_collection_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_remove_by_filename.rst000066400000000000000000000016161511661753600271510ustar00rootroot00000000000000:man_page: mongoc_gridfs_remove_by_filename mongoc_gridfs_remove_by_filename() ================================== Synopsis -------- .. code-block:: c bool mongoc_gridfs_remove_by_filename (mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error); Parameters ---------- * ``gridfs``: A :symbol:`mongoc_gridfs_t`. * ``filename``: A UTF-8 encoded string containing the filename. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Removes all files matching ``filename`` and their data chunks from the MongoDB server. Returns ------- Returns true if successful, including when no files match. Returns ``false`` and sets ``error`` if there are invalid arguments or a server or network error. Errors ------ Errors are propagated via the ``error`` parameter. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_gridfs_t.rst000066400000000000000000000046371511661753600235730ustar00rootroot00000000000000:man_page: mongoc_gridfs_t mongoc_gridfs_t =============== .. warning:: This GridFS implementation does not conform to the `MongoDB GridFS specification `_. For a spec compliant implementation, use :symbol:`mongoc_gridfs_bucket_t`. Synopsis -------- .. code-block:: c #include typedef struct _mongoc_gridfs_t mongoc_gridfs_t; Description ----------- ``mongoc_gridfs_t`` provides a MongoDB gridfs implementation. The system as a whole is made up of ``gridfs`` objects, which contain ``gridfs_files`` and ``gridfs_file_lists``. Essentially, a basic file system API. There are extensive caveats about the kind of use cases gridfs is practical for. In particular, any writing after initial file creation is likely to both break any concurrent readers and be quite expensive. That said, this implementation does allow for arbitrary writes to existing gridfs object, just use them with caution. mongoc_gridfs also integrates tightly with the :symbol:`mongoc_stream_t` abstraction, which provides some convenient wrapping for file creation and reading/writing. It can be used without, but its worth looking to see if your problem can fit that model. .. warning:: ``mongoc_gridfs_t`` does not support read preferences. In a replica set, GridFS queries are always routed to the primary. Thread Safety ------------- ``mongoc_gridfs_t`` is NOT thread-safe and should only be used in the same thread as the owning :symbol:`mongoc_client_t`. Lifecycle --------- It is an error to free a ``mongoc_gridfs_t`` before freeing all related instances of :symbol:`mongoc_gridfs_file_t` and :symbol:`mongoc_gridfs_file_list_t`. Example ------- .. literalinclude:: ../examples/example-gridfs.c :language: c :caption: example-gridfs.c .. seealso:: | The `MongoDB GridFS specification `_. | The spec-compliant :symbol:`mongoc_gridfs_bucket_t`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_gridfs_create_file mongoc_gridfs_create_file_from_stream mongoc_gridfs_destroy mongoc_gridfs_drop mongoc_gridfs_find_one_by_filename mongoc_gridfs_find_one_with_opts mongoc_gridfs_find_with_opts mongoc_gridfs_get_chunks mongoc_gridfs_get_files mongoc_gridfs_remove_by_filename mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_handshake_data_append.rst000066400000000000000000000052721511661753600262340ustar00rootroot00000000000000:man_page: mongoc_handshake_data_append mongoc_handshake_data_append() ============================== Synopsis -------- .. code-block:: c bool mongoc_handshake_data_append (const char *driver_name, const char *driver_version, const char *platform); Appends the given strings to the handshake data for the underlying C Driver. Description ----------- This function is intended for use by drivers which wrap the C Driver. Calling this function will store the given strings as handshake data about the system and driver by appending them to the handshake data for the underlying C Driver. These values, along with other handshake data collected during mongoc_init will be sent to the server as part of the initial connection handshake in the "client" document. This function must not be called more than once, or after server monitoring begins. For a single-threaded :symbol:`mongoc_client_t`, server monitoring begins on the first operation requiring a server. For a :symbol:`mongoc_client_pool_t`, server monitoring begins on the first call to `:symbol:`mongoc_client_pool_pop`. The passed in strings are copied, and don't have to remain valid after the call to :symbol:`mongoc_handshake_data_append`. The driver may store truncated versions of the passed in strings. .. note:: This function allocates memory, and therefore caution should be used when using this in conjunction with :symbol:`bson_mem_set_vtable`. If this function is called before :symbol:`bson_mem_set_vtable`, then :symbol:`bson_mem_restore_vtable` must be called before calling :symbol:`mongoc_cleanup`. Failure to do so will result in memory being freed by the wrong allocator. Parameters ---------- * ``driver_name``: An optional string storing the name of the wrapping driver * ``driver_version``: An optional string storing the version of the wrapping driver. * ``platform``: An optional string storing any information about the current platform, for example configure options or compile flags. Returns ------- ``true`` if the given fields are set successfully. Otherwise, it returns ``false`` and logs an error. The default handshake data the driver sends with "hello" looks something like: .. code-block:: c client: { driver: { name: "mongoc", version: "1.5.0" }, os: {...}, platform: "CC=gcc CFLAGS=-Wall -pedantic" } If we call :symbol:`mongoc_handshake_data_append` ("phongo", "1.1.8", "CC=clang / ") and it returns true, the driver sends handshake data like: .. code-block:: c client: { driver: { name: "mongoc / phongo", version: "1.5.0 / 1.1.8" }, os: {...}, platform: "CC=clang / gcc CFLAGS=-Wall -pedantic" } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_host_list_t.rst000066400000000000000000000011671511661753600243200ustar00rootroot00000000000000:man_page: mongoc_host_list_t mongoc_host_list_t ================== Synopsis -------- .. code-block:: c typedef struct { mongoc_host_list_t *next; char host[BSON_HOST_NAME_MAX + 1]; char host_and_port[BSON_HOST_NAME_MAX + 7]; uint16_t port; int family; void *padding[4]; } mongoc_host_list_t; Description ----------- The host and port of a MongoDB server. Can be part of a linked list: for example the return value of :symbol:`mongoc_uri_get_hosts` when multiple hosts are provided in the MongoDB URI. .. seealso:: | :symbol:`mongoc_uri_get_hosts` and :symbol:`mongoc_cursor_get_host`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_init.rst000066400000000000000000000002711511661753600227230ustar00rootroot00000000000000:man_page: mongoc_init mongoc_init() ============= Synopsis -------- .. code-block:: c void mongoc_init (void); Description ----------- .. include:: includes/init_cleanup.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_insert_flags_t.rst000066400000000000000000000024051511661753600247640ustar00rootroot00000000000000:man_page: mongoc_insert_flags_t mongoc_insert_flags_t ===================== Flags for insert operations Synopsis -------- .. code-block:: c typedef enum { MONGOC_INSERT_NONE = 0, MONGOC_INSERT_CONTINUE_ON_ERROR = 1 << 0, } mongoc_insert_flags_t; #define MONGOC_INSERT_NO_VALIDATE (1U << 31) Description ----------- These flags correspond to the MongoDB wire protocol. They may be bitwise or'd together. They may modify how an insert happens on the MongoDB server. Flag Values ----------- =============================== ====================================================================================================================================================================== MONGOC_INSERT_NONE Specify no insert flags. MONGOC_INSERT_CONTINUE_ON_ERROR Continue inserting documents from the insertion set even if one insert fails. MONGOC_INSERT_NO_VALIDATE Do not validate insertion documents before performing an insert. Validation can be expensive, so this can save some time if you know your documents are already valid. =============================== ====================================================================================================================================================================== mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_iovec_t.rst000066400000000000000000000012651511661753600234140ustar00rootroot00000000000000:man_page: mongoc_iovec_t mongoc_iovec_t ============== Synopsis -------- Synopsis -------- .. code-block:: c #include #ifdef _WIN32 typedef struct { u_long iov_len; char *iov_base; } mongoc_iovec_t; #else typedef struct iovec mongoc_iovec_t; #endif The ``mongoc_iovec_t`` structure is a portability abstraction for consumers of the :symbol:`mongoc_stream_t` interfaces. It allows for scatter/gather I/O through the socket subsystem. .. warning:: When writing portable code, beware of the ordering of ``iov_len`` and ``iov_base`` as they are different on various platforms. Therefore, you should not use C initializers for initialization. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_destroy.rst000066400000000000000000000011051511661753600262600ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_destroy mongoc_oidc_callback_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_oidc_callback_destroy (mongoc_oidc_callback_t *callback) Release all resources associated with the given :symbol:`mongoc_oidc_callback_t` object. .. warning:: The lifetime of the object pointed to by ``user_data`` is managed the user, not by :symbol:`mongoc_oidc_callback_t`! Parameters ---------- * ``callback``: a :symbol:`mongoc_oidc_callback_t` or ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_callback_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_fn_t.rst000066400000000000000000000022111511661753600255140ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_fn_t mongoc_oidc_callback_fn_t ========================= Synopsis -------- .. code-block:: c typedef mongoc_oidc_credential_t *(*mongoc_oidc_callback_fn_t) (mongoc_oidc_callback_params_t *params); The type of the function pointer stored by :symbol:`mongoc_oidc_callback_t`. Parameters ---------- * ``params``: A :symbol:`mongoc_oidc_callback_params_t` object representing in/out parameters of a :symbol:`mongoc_oidc_callback_t`. Returns ------- A :symbol:`mongoc_oidc_credential_t` object created with :symbol:`mongoc_oidc_credential_new()`, or ``NULL`` to indicate an error or timeout. * The function MUST return a :symbol:`mongoc_oidc_credential_t` object to indicate success. * The function MUST return ``NULL`` to indicate an error. * The function MUST call :symbol:`mongoc_oidc_callback_params_cancel_with_timeout()` before returning ``NULL`` to indicate a timeout instead of an error. The ``cancel_with_timeout`` out parameter is ignored if the return value is not ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_credential_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_get_fn.rst000066400000000000000000000010051511661753600260300ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_get_fn mongoc_oidc_callback_get_fn() ============================= Synopsis -------- .. code-block:: c mongoc_oidc_callback_fn_t mongoc_oidc_callback_get_fn (const mongoc_oidc_callback_t *callback); Return the stored pointer to the callback function. Parameters ---------- * ``callback``: a :symbol:`mongoc_oidc_callback_t`. Returns ------- A :symbol:`mongoc_oidc_callback_fn_t`. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_fn_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_get_user_data.rst000066400000000000000000000010121511661753600273720ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_get_user_data mongoc_oidc_callback_get_user_data() ==================================== Synopsis -------- .. code-block:: c void * mongoc_oidc_callback_get_user_data (const mongoc_oidc_callback_t *callback); Return the stored pointer to user data. Parameters ---------- * ``callback``: a :symbol:`mongoc_oidc_callback_t`. Returns ------- A pointer to user data or ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_set_user_data()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_new.rst000066400000000000000000000014421511661753600253640ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_new mongoc_oidc_callback_new() ========================== Synopsis -------- .. code-block:: c mongoc_oidc_callback_t * mongoc_oidc_callback_new (mongoc_oidc_callback_fn_t fn) Create a new :symbol:`mongoc_oidc_callback_t` object which stores the provided OIDC callback function. Equivalent to calling :symbol:`mongoc_oidc_callback_new_with_user_data()` with ``user_data`` set to ``NULL``. Parameters ---------- * ``fn``: a :symbol:`mongoc_oidc_callback_fn_t`. Must not be ``NULL``. Returns ------- A new :symbol:`mongoc_oidc_callback_t` that must be freed with :symbol:`mongoc_oidc_callback_destroy()`, or ``NULL`` when an invalid argument was given. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_new_with_user_data` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_new_with_user_data.rst000066400000000000000000000017071511661753600304520ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_new_with_user_data mongoc_oidc_callback_new_with_user_data() ========================================= Synopsis -------- .. code-block:: c mongoc_oidc_callback_t * mongoc_oidc_callback_new_with_user_data (mongoc_oidc_callback_fn_t fn, void *user_data) Create a new :symbol:`mongoc_oidc_callback_t` object which stores the provided OIDC callback function and pointer to user data. .. warning:: The lifetime of the object pointed to by ``user_data`` is managed the user, not by :symbol:`mongoc_oidc_callback_t`! Parameters ---------- * ``fn``: a :symbol:`mongoc_oidc_callback_fn_t`. Must not be ``NULL``. * ``user_data``: a pointer to user data or ``NULL``. Returns ------- A new :symbol:`mongoc_oidc_callback_t` that must be freed with :symbol:`mongoc_oidc_callback_destroy()`, or ``NULL`` when an invalid argument was given. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_new` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_cancel_with_timeout.rst000066400000000000000000000013471511661753600321700ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_cancel_with_timeout mongoc_oidc_callback_params_cancel_with_timeout() ================================================= Synopsis -------- .. code-block:: c mongoc_oidc_credential_t * mongoc_oidc_callback_params_cancel_with_timeout (mongoc_oidc_callback_params_t *params); Set the out parameter indicating cancellation of the callback function due to a timeout instead of an error. .. note:: If the callback function returns a not-null value, the value of this out parameter is ignored. Parameters ---------- * ``params``: a :symbol:`mongoc_oidc_callback_params_t`. Returns ------- ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_callback_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_get_timeout.rst000066400000000000000000000027461511661753600304730ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_get_timeout mongoc_oidc_callback_params_get_timeout() ========================================= Synopsis -------- .. code-block:: c const int64_t * mongoc_oidc_callback_params_get_timeout (const mongoc_oidc_callback_params_t *params); Return a value comparable with :symbol:`bson_get_monotonic_time()` to determine when a timeout must occur. The return value is an absolute time point, not a duration. A callback can signal a timeout error using :symbol:`mongoc_oidc_callback_params_cancel_with_timeout`. Example: .. code-block:: c mongoc_oidc_credential_t * example_callback_fn (mongoc_oidc_callback_params_t *params) { const int64_t *timeout = mongoc_oidc_callback_params_get_timeout (params); // NULL means "infinite" timeout. if (timeout && bson_get_monotonic_time () > *timeout) { return mongoc_oidc_callback_params_cancel_with_timeout (params); } // ... your code here ... } A ``NULL`` (unset) return value means "infinite" timeout. Parameters ---------- * ``params``: a :symbol:`mongoc_oidc_callback_params_t`. Returns ------- A value comparable with :symbol:`bson_get_monotonic_time()`, or ``NULL``. Lifecycle --------- The pointed-to ``int64_t`` is only valid for the duration of the invocation of the OIDC callback function. .. seealso:: - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_params_cancel_with_timeout` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_get_user_data.rst000066400000000000000000000014011511661753600307370ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_get_user_data mongoc_oidc_callback_params_get_user_data() =========================================== Synopsis -------- .. code-block:: c void * mongoc_oidc_callback_params_get_user_data (const mongoc_oidc_callback_params_t *params); Return the pointer to user data which was stored by an associated :symbol:`mongoc_oidc_callback_t` object. Parameters ---------- * ``params``: a :symbol:`mongoc_oidc_callback_params_t`. Returns ------- A pointer to user data or ``NULL``. Lifecycle --------- The lifetime of the object pointed to by ``user_data`` is managed the user. .. seealso:: - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_set_user_data()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_get_username.rst000066400000000000000000000014441511661753600306160ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_get_username mongoc_oidc_callback_params_get_username() ========================================== Synopsis -------- .. code-block:: c const char * mongoc_oidc_callback_params_get_username (const mongoc_oidc_callback_params_t *params); Return the username component of the URI of an associated :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object. Parameters ---------- * ``params``: a :symbol:`mongoc_oidc_callback_params_t`. Returns ------- A string which must not be modified or freed, or ``NULL``. Lifecycle --------- The string is only valid for the duration of the invocation of the OIDC callback function. .. seealso:: - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_uri_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_get_version.rst000066400000000000000000000010271511661753600304610ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_get_version mongoc_oidc_callback_params_get_version() ========================================= Synopsis -------- .. code-block:: c int32_t mongoc_oidc_callback_params_get_version (const mongoc_oidc_callback_params_t *params); Return the OIDC callback API version number. Parameters ---------- * ``params``: a :symbol:`mongoc_oidc_callback_params_t`. Returns ------- A positive integer. .. seealso:: - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_callback_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_params_t.rst000066400000000000000000000147131511661753600264060ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_params_t mongoc_oidc_callback_params_t ============================= Synopsis -------- .. code-block:: c typedef struct _mongoc_oidc_callback_params_t mongoc_oidc_callback_params_t; Represents the in/out parameters of a :symbol:`mongoc_oidc_callback_t`. The parameters will be passed to the :symbol:`mongoc_oidc_callback_fn_t` stored in an :symbol:`mongoc_oidc_callback_t` object when it is invoked by an :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_oidc_callback_params_get_version mongoc_oidc_callback_params_get_user_data mongoc_oidc_callback_params_get_timeout mongoc_oidc_callback_params_get_username mongoc_oidc_callback_params_cancel_with_timeout Parameters ---------- The list of currently supported parameters are: .. list-table:: :widths: auto * - Parameter - Versions - Description * - ``version`` - 1 - The current OIDC callback API version number. * - ``user_data`` - 1 - A pointer to data provided by the user. * - ``timeout`` - 1 - The timestamp after which the callback function must report a timeout. * - ``username`` - 1 - The username specified by the URI of the associated client object. * - ``cancel_with_timeout`` - 1 - An out parameter indicating cancellation of the callback function due to a timeout instead of an error. The "Version" column indicates the OIDC callback API versions for which the parameter is applicable. Version ``````` The ``version`` parameter is used to communicate backward compatible changes to the OIDC callback API (i.e. the addition of a new parameter). This parameter may be used to detect when existing usage of :symbol:`mongoc_oidc_callback_t` or a relevant callback function may need to be reviewed. For example, users may add the following check to their callback function: .. code-block:: c mongoc_oidc_credential_t * example_callback_fn (mongoc_oidc_callback_params_t *params) { // A runtime message that new features are available in the OIDC Callback API. if (mongoc_oidc_callback_params_get_version (params) > 1) { printf ("OIDC Callback API has been updated to a new version!"); } // ... } User Data ````````` The ``user_data`` parameter may be used to pass additional arguments to the callback function or to return additional values out of the callback function. This parameter must be set in advance via :symbol:`mongoc_oidc_callback_set_user_data()` before the :symbol:`mongoc_oidc_callback_t` object is associated with a :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object. .. warning:: The lifetime of the object pointed to by ``user_data`` is managed the user, not by :symbol:`mongoc_oidc_callback_t`! .. code-block:: c typedef struct { int counter; const char *error_message; } user_data_t; mongoc_oidc_credential_t * example_callback_fn (mongoc_oidc_callback_params_t *params) { user_data_t *user_data = (user_data_t *) mongoc_oidc_callback_params_get_user_data (params); user_data->counter += 1; // ... if (/* ... */) { user_data->error_message = "OIDC callback failed due to ..."; return NULL; } // ... } void example (void) { mongoc_client_t *client = /* ... */; bson_error_t error; { user_data_t *user_data = malloc (sizeof (*user_data)); *user_data = (user_data_t){.counter = 0, .error_message = NULL}; mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new_with_user_data (&example_callback_fn, (void *) user_data); BSON_ASSERT (mongoc_client_set_oidc_callback (client, callback)); mongoc_oidc_callback_destroy (callback); } // ... client operations ... { const mongoc_oidc_callback_t *callback = mongoc_client_get_oidc_callback (client); user_data_t *user_data = (user_data_t *) mongoc_oidc_callback_get_user_data (callback); if (error.code != 0) { printf ("client error message: %s\n", error.message); } if (user_data->error_message) { printf ("custom error message: %s\n", user_data->error_message); } printf ("The callback function was invoked %d times!", user_data->counter); free (user_data); } mongoc_client_destroy (client); } Timeout ``````` The ``timeout`` parameter is used to determine when the callback function should report cancellation due to a timeout. When :symbol:`bson_get_monotonic_time()` is greater than ``timeout``, the callback function must invoke :symbol:`mongoc_oidc_callback_params_cancel_with_timeout()` and return ``NULL``. Username ```````` The ``username`` parameter is the value of the username component of the URI of the associated :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object from which the callback function is invoked. Cancel With Timeout ``````````````````` The ``cancel_with_timeout`` out parameter indicates cancellation of the callback function due to a timeout instead of an error. .. important:: The callback function MUST return ``NULL``, otherwise the invocation will be interpreted as a success even when ``cancel_with_timeout`` is set. .. code-block:: c mongoc_oidc_credential_t * example_callback_fn (mongoc_oidc_callback_params_t *params) { const int64_t *timeout = mongoc_oidc_callback_params_get_timeout (params); // NULL means "infinite" timeout. if (timeout && bson_get_monotonic_time () > *timeout) { return mongoc_oidc_callback_params_cancel_with_timeout (params); } // ... } Error Handling `````````````` A ``NULL`` return value (without setting ``cancel_with_timeout``) indicates failure to provide an access token due to an error. .. important:: The callback function MUST return ``NULL``, otherwise the invocation will be interpreted as a success. .. code-block:: c mongoc_oidc_credential_t * example_callback_fn (mongoc_oidc_callback_params_t *params) { // ... if (/* ... */) { // The OIDC callback function could not provide an access token due to an error. return NULL; } // ... } .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_fn_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_set_user_data.rst000066400000000000000000000012331511661753600274130ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_set_user_data mongoc_oidc_callback_set_user_data() ==================================== Synopsis -------- .. code-block:: c void mongoc_oidc_callback_set_user_data (mongoc_oidc_callback_t *callback, void *user_data); Store the provided pointer to user data. .. warning:: The lifetime of the object pointed to by ``user_data`` is managed the user, not by :symbol:`mongoc_oidc_callback_t`! Parameters ---------- * ``callback``: a :symbol:`mongoc_oidc_callback_t`. * ``user_data``: a pointer to user data or ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_get_user_data()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_callback_t.rst000066400000000000000000000111071511661753600250350ustar00rootroot00000000000000:man_page: mongoc_oidc_callback_t mongoc_oidc_callback_t ====================== Synopsis -------- .. code-block:: c typedef struct _mongoc_oidc_callback_t mongoc_oidc_callback_t; :symbol:`mongoc_oidc_callback_t` represents a user-defined callback function :symbol:`mongoc_oidc_callback_fn_t` that returns an OIDC access token. The callback may be used to integrate with OIDC providers that are not supported by the built-in provider integrations (:ref:`Authentication Mechanism Properties `). .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_oidc_callback_new mongoc_oidc_callback_new_with_user_data mongoc_oidc_callback_destroy mongoc_oidc_callback_get_fn mongoc_oidc_callback_get_user_data mongoc_oidc_callback_set_user_data Lifecycle --------- The function and optional user data stored by :symbol:`mongoc_oidc_callback_t` must outlive any associated client or client pool object which may invoke the stored callback function. Thread Safety ------------- The callback function stored by a :symbol:`mongoc_oidc_callback_t` object will be invoked by at most one thread at a time for an associated :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object: .. code-block:: c static mongoc_oidc_credential_t * single_thread_only (mongoc_oidc_callback_params_t *params) { // This function does not need to support invocation by more than thread at a time. // ... } void with_single_client (void) { mongoc_client_t *client = /* ... */; { mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new (&single_thread_only); BSON_ASSERT (mongoc_client_set_oidc_callback (client, callback)); mongoc_oidc_callback_destroy (callback); } // ... client operations ... mongoc_client_destroy (client); } void with_single_pool (void) { mongoc_client_pool_t *pool = /* ... */; { mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new (&single_thread_only); BSON_ASSERT (mongoc_client_pool_set_oidc_callback (pool, callback)); mongoc_oidc_callback_destroy (callback); } // ... client pool operations ... mongoc_client_pool_destroy (pool); } If the callback is associated with more than one :symbol:`mongoc_client_t` object (in multiple threads), or with more than one :symbol:`mongoc_client_pool_t` object (even in a single thread), the callback function MUST support invocation by more than one thread at a time: .. code-block:: c static mongoc_oidc_credential_t * many_threads_possible (mongoc_oidc_callback_params_t *params) { // This function MUST support invocation by more than one thread at a time. // ... } void with_many_clients (void) { mongoc_client_t *client_a = /* ... */; mongoc_client_t *client_b = /* ... */; { mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new (&many_threads_possible); BSON_ASSERT (mongoc_client_set_oidc_callback (client_a, callback)); BSON_ASSERT (mongoc_client_set_oidc_callback (client_b, callback)); mongoc_oidc_callback_destroy (callback); } pthread_t thread_a; pthread_t thread_b; if (pthread_create (&thread_a, NULL, /* thread_a_fn */, client_a) != 0) { /* ... */ } if (pthread_create (&thread_b, NULL, /* thread_b_fn */, client_b) != 0) { /* ... */ } // ... client operations using multiple threads ... if (pthread_join (&thread_a, NULL) != 0) { /* ... */ } if (pthread_join (&thread_b, NULL) != 0) { /* ... */ } mongoc_client_destroy (client_a); mongoc_client_destroy (client_b); } void with_many_pools (void) { mongoc_client_pool_t *pool_a = /* ... */; mongoc_client_pool_t *pool_b = /* ... */; { mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new (&many_threads_possible); BSON_ASSERT (mongoc_client_pool_set_oidc_callback (pool_a, callback)); BSON_ASSERT (mongoc_client_pool_set_oidc_callback (pool_b, callback)); mongoc_oidc_callback_destroy (callback); } // ... client operations using multiple client pools ... mongoc_client_pool_destroy (pool_a); mongoc_client_pool_destroy (pool_b); } .. seealso:: - :symbol:`mongoc_client_t` - :symbol:`mongoc_client_pool_t` - :symbol:`mongoc_oidc_callback_fn_t` - :symbol:`mongoc_oidc_callback_params_t` - :symbol:`mongoc_oidc_credential_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_destroy.rst000066400000000000000000000007211511661753600266410ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_destroy mongoc_oidc_credential_destroy() ================================ Synopsis -------- .. code-block:: c void mongoc_oidc_credential_destroy (mongoc_oidc_credential_t *credential) Release all resources associated with the given :symbol:`mongoc_oidc_credential_t` object. Parameters ---------- * ``credential``: a :symbol:`mongoc_oidc_credential_t` or ``NULL``. .. seealso:: - :symbol:`mongoc_oidc_credential_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_get_access_token.rst000066400000000000000000000014361511661753600304540ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_get_access_token mongoc_oidc_credential_get_access_token() ========================================= Synopsis -------- .. code-block:: c const char * mongoc_oidc_credential_get_access_token (const mongoc_oidc_credential_t *cred); Return the access token stored in the :symbol:`mongoc_oidc_credential_t` object. Parameters ---------- * ``cred``: a :symbol:`mongoc_oidc_credential_t`. Returns ------- A string which must not be modified or freed. Lifecycle --------- The string is only valid for the lifetime of the :symbol:`mongoc_oidc_credential_t` object. .. seealso:: - :symbol:`mongoc_oidc_credential_t` - :symbol:`mongoc_oidc_callback_fn_t` - :symbol:`mongoc_oidc_credential_new` - :symbol:`mongoc_oidc_credential_new_with_expires_in` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_get_expires_in.rst000066400000000000000000000016141511661753600301560ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_get_expires_in mongoc_oidc_credential_get_expires_in() ======================================= Synopsis -------- .. code-block:: c const int64_t * mongoc_oidc_credential_get_expires_in (const mongoc_oidc_credential_t *cred); Return the optional expiry duration (in milliseconds) for the access token stored in :symbol:`mongoc_oidc_credential_t`. .. important:: An unset value is interpreted as an infinite expiry duration. Parameters ---------- * ``cred``: a :symbol:`mongoc_oidc_credential_t`. Returns ------- The expiry duration (in milliseconds), or ``NULL`` when unset. Lifecycle --------- The pointed-to ``int64_t`` is only valid for the lifetime of the :symbol:`mongoc_oidc_credential_t` object. .. seealso:: - :symbol:`mongoc_oidc_credential_t` - :symbol:`mongoc_oidc_credential_new_with_expires_in` - :symbol:`mongoc_oidc_callback_fn_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_new.rst000066400000000000000000000015251511661753600257440ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_new mongoc_oidc_credential_new() ============================ Synopsis -------- .. code-block:: c mongoc_oidc_credential_t * mongoc_oidc_credential_new (const char *access_token) Create a new :symbol:`mongoc_oidc_credential_t` object which stores a copy of the provided OIDC access token with an infinite expiry duration. To set a finite expiry duration, use :symbol:`mongoc_oidc_credential_new_with_expires_in()`. .. warning:: ``access_token`` is NOT directly validated by the driver. Parameters ---------- * ``access_token``: an OIDC access token. Must not be ``NULL``. Returns ------- A new :symbol:`mongoc_oidc_credential_t` that must be freed with :symbol:`mongoc_oidc_credential_destroy()`, or ``NULL`` when an invalid argument was given. .. seealso:: - :symbol:`mongoc_oidc_credential_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_new_with_expires_in.rst000066400000000000000000000021621511661753600312220ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_new_with_expires_in mongoc_oidc_credential_new_with_expires_in() ============================================ Synopsis -------- .. code-block:: c mongoc_oidc_credential_t * mongoc_oidc_credential_new_with_expires_in (const char *access_token, int64_t expires_in) Create a new :symbol:`mongoc_oidc_credential_t` object which stores a copy of the provided OIDC access token and its expiry duration (in milliseconds). The expiry duration will be evaluated relative to the value returned by :symbol:`bson_get_monotonic_time()` immediately after the callback function has returned. To set an infinite expiry duration, use :symbol:`mongoc_oidc_credential_new()`. .. warning:: ``access_token`` is NOT directly validated by the driver. Parameters ---------- * ``access_token``: an OIDC access token. Must not be ``NULL``. * ``expires_in``: a non-negative integer. Returns ------- A new :symbol:`mongoc_oidc_credential_t` that must be freed with :symbol:`mongoc_oidc_credential_destroy()`, or ``NULL`` when an invalid argument was given. .. seealso:: - :symbol:`mongoc_oidc_credential_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_oidc_credential_t.rst000066400000000000000000000031461511661753600254170ustar00rootroot00000000000000:man_page: mongoc_oidc_credential_t mongoc_oidc_credential_t ======================== Synopsis -------- .. code-block:: c typedef struct _mongoc_oidc_credential_t mongoc_oidc_credential_t; Represents the return value of a :symbol:`mongoc_oidc_callback_fn_t`. The value will be returned by the :symbol:`mongoc_oidc_callback_fn_t` stored in an :symbol:`mongoc_oidc_callback_t` object when it is invoked by an associated :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` object. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_oidc_credential_new mongoc_oidc_credential_new_with_expires_in mongoc_oidc_credential_destroy mongoc_oidc_credential_get_access_token mongoc_oidc_credential_get_expires_in Return Values ------------- The list of currently supported return values are: .. list-table:: :widths: auto * - Value - Versions - Description * - ``access_token`` - 1 - The OIDC access token. * - ``expires_in`` - 1 - An optional expiration duration (in milliseconds). The "Version" column indicates the OIDC callback API versions for which the parameter is applicable. Access Token ```````````` An OIDC access token (a signed JWT token). .. warning:: ``access_token`` is NOT directly validated by the driver. Expiry Duration ``````````````` An optional expiry duration (in milliseconds) for the access token. .. important:: An unset value is interpreted as an infinite expiry duration. .. seealso:: - :symbol:`mongoc_oidc_callback_t` - :symbol:`mongoc_oidc_callback_fn_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_copy.rst000066400000000000000000000006251511661753600246420ustar00rootroot00000000000000:man_page: mongoc_optional_copy mongoc_optional_copy() ====================== Synopsis -------- .. code-block:: c void mongoc_optional_copy (const mongoc_optional_t *source, mongoc_optional_t *copy); Creates a deep copy of ``source`` into ``copy``. Parameters ---------- * ``source``: A :symbol:`mongoc_optional_t`. * ``copy``: An empty :symbol:`mongoc_optional_t`. Values will be overwritten. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_init.rst000066400000000000000000000004471511661753600246350ustar00rootroot00000000000000:man_page: mongoc_optional_init mongoc_optional_init() ====================== Synopsis -------- .. code-block:: c void mongoc_optional_init (mongoc_optional_t *opt); Initializes values for a :symbol:`mongoc_optional_t`. Parameters ---------- * ``opt``: A :symbol:`mongoc_optional_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_is_set.rst000066400000000000000000000006211511661753600251520ustar00rootroot00000000000000:man_page: mongoc_optional_is_set mongoc_optional_is_set() ======================== Synopsis -------- .. code-block:: c bool mongoc_optional_is_set (const mongoc_optional_t *opt); Returns whether a value for a :symbol:`mongoc_optional_t` was set. Parameters ---------- * ``opt``: A :symbol:`mongoc_optional_t`. Returns ------- Returns ``true`` if a value was set, or ``false`` otherwise. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_set_value.rst000066400000000000000000000007101511661753600256520ustar00rootroot00000000000000:man_page: mongoc_optional_set_value mongoc_optional_set_value() =========================== Synopsis -------- .. code-block:: c void mongoc_optional_set_value (mongoc_optional_t *opt); Sets a value on a :symbol:`mongoc_optional_t`. Once a value has been set, it cannot be unset, i.e. `mongoc_optional_is_set` will always return ``true`` after calling `mongoc_optional_set_value`. Parameters ---------- * ``opt``: A :symbol:`mongoc_optional_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_t.rst000066400000000000000000000010021511661753600241210ustar00rootroot00000000000000:man_page: mongoc_optional_t mongoc_optional_t ================= A struct to store optional boolean values. Synopsis -------- Used to specify optional boolean flags, which may remain unset. This is used within :symbol:`mongoc_server_api_t` to track whether a flag was explicitly set. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_optional_copy mongoc_optional_init mongoc_optional_is_set mongoc_optional_set_value mongoc_optional_value mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_optional_value.rst000066400000000000000000000006611511661753600250040ustar00rootroot00000000000000:man_page: mongoc_optional_value mongoc_optional_value() ======================= Synopsis -------- .. code-block:: c bool mongoc_optional_value (const mongoc_optional_t *opt); Returns the value for a :symbol:`mongoc_optional_t`. Parameters ---------- * ``opt``: A :symbol:`mongoc_optional_t`. Returns ------- Returns the value that was set on the :symbol:`mongoc_optional_t`. If no value was set, ``false`` is returned. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_query_flags_t.rst000066400000000000000000000034221511661753600246250ustar00rootroot00000000000000:man_page: mongoc_query_flags_t mongoc_query_flags_t ==================== Flags for query operations Synopsis -------- .. code-block:: c typedef enum { MONGOC_QUERY_NONE = 0, MONGOC_QUERY_TAILABLE_CURSOR = 1 << 1, MONGOC_QUERY_SECONDARY_OK = 1 << 2, MONGOC_QUERY_OPLOG_REPLAY = 1 << 3, MONGOC_QUERY_NO_CURSOR_TIMEOUT = 1 << 4, MONGOC_QUERY_AWAIT_DATA = 1 << 5, MONGOC_QUERY_EXHAUST = 1 << 6, MONGOC_QUERY_PARTIAL = 1 << 7, } mongoc_query_flags_t; Description ----------- These flags correspond to the MongoDB wire protocol. They may be bitwise or'd together. They may modify how a query is performed in the MongoDB server. Flag Values ----------- ============================== ===================================================================================================================================================== MONGOC_QUERY_NONE Specify no query flags. MONGOC_QUERY_TAILABLE_CURSOR Cursor will not be closed when the last data is retrieved. You can resume this cursor later. MONGOC_QUERY_SECONDARY_OK Allow query of replica set secondaries. MONGOC_QUERY_OPLOG_REPLAY Used internally by MongoDB. MONGOC_QUERY_NO_CURSOR_TIMEOUT The server normally times out an idle cursor after an inactivity period (10 minutes). This prevents that. MONGOC_QUERY_AWAIT_DATA Use with MONGOC_QUERY_TAILABLE_CURSOR. Block rather than returning no data. After a period, time out. MONGOC_QUERY_EXHAUST Unused. MONGOC_QUERY_PARTIAL Get partial results from mongos if some shards are down (instead of throwing an error). ============================== ===================================================================================================================================================== mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_rand.rst000066400000000000000000000026441511661753600227120ustar00rootroot00000000000000:man_page: mongoc_rand mongoc_rand =========== MongoDB Random Number Generator Synopsis -------- .. code-block:: c void mongoc_rand_add (const void *buf, int num, double entropy); void mongoc_rand_seed (const void *buf, int num); int mongoc_rand_status (void); Description ----------- The ``mongoc_rand`` family of functions provide access to the low level randomness primitives used by the MongoDB C Driver. In particular, they control the creation of cryptographically strong pseudo-random bytes required by some security mechanisms. While we can usually pull enough entropy from the environment, you may be required to seed the PRNG manually depending on your OS, hardware and other entropy consumers running on the same system. Entropy ------- ``mongoc_rand_add`` and ``mongoc_rand_seed`` allow the user to directly provide entropy. They differ insofar as ``mongoc_rand_seed`` requires that each bit provided is fully random. ``mongoc_rand_add`` allows the user to specify the degree of randomness in the provided bytes as well. Status ------ The ``mongoc_rand_status`` function allows the user to check the status of the mongoc PRNG. This can be used to guarantee sufficient entropy at program startup, rather than waiting for runtime errors to occur. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_rand_add mongoc_rand_seed mongoc_rand_status mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_rand_add.rst000066400000000000000000000007471511661753600235240ustar00rootroot00000000000000:man_page: mongoc_rand_add mongoc_rand_add() ================= Synopsis -------- .. code-block:: c void mongoc_rand_add (const void *buf, int num, double entropy); Description ----------- Mixes num bytes of data into the mongoc random number generator. Entropy specifies a lower bound estimate of the randomness contained in buf. Parameters ---------- * ``buf``: A buffer. * ``num``: An int of number of bytes in buf. * ``entropy``: A double of randomness estimate in buf. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_rand_seed.rst000066400000000000000000000005311511661753600237030ustar00rootroot00000000000000:man_page: mongoc_rand_seed mongoc_rand_seed() ================== Synopsis -------- .. code-block:: c void mongoc_rand_seed (const void *buf, int num); Description ----------- Seeds the mongoc random number generator with num bytes of entropy. Parameters ---------- * ``buf``: A buffer. * ``num``: An int of number of bytes in buf. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_rand_status.rst000066400000000000000000000004671511661753600243160ustar00rootroot00000000000000:man_page: mongoc_rand_status mongoc_rand_status() ==================== Synopsis -------- .. code-block:: c int mongoc_rand_status (void); Description ----------- The status of the mongoc random number generator. Returns ------- Returns 1 if the PRNG has been seeded with enough data, 0 otherwise. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_append.rst000066400000000000000000000015041511661753600257310ustar00rootroot00000000000000:man_page: mongoc_read_concern_append mongoc_read_concern_append() ============================ Synopsis -------- .. code-block:: c bool mongoc_read_concern_append (mongoc_read_concern_t *read_concern, bson_t *opts); Parameters ---------- * ``read_concern``: A pointer to a :symbol:`mongoc_read_concern_t`. * ``command``: A pointer to a :symbol:`bson:bson_t`. Description ----------- This function appends a read concern to command options. It is useful for appending a read concern to command options before passing them to :symbol:`mongoc_client_read_command_with_opts` or a related function that takes an options document. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. Example ------- See the example code for :symbol:`mongoc_client_read_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_copy.rst000066400000000000000000000010261511661753600254330ustar00rootroot00000000000000:man_page: mongoc_read_concern_copy mongoc_read_concern_copy() ========================== Synopsis -------- .. code-block:: c mongoc_read_concern_t * mongoc_read_concern_copy (const mongoc_read_concern_t *read_concern); Parameters ---------- * ``read_concern``: A :symbol:`mongoc_read_concern_t`. Description ----------- Performs a deep copy of ``read_concern``. Returns ------- Returns a newly allocated copy of ``read_concern`` that should be freed with :symbol:`mongoc_read_concern_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_destroy.rst000066400000000000000000000006521511661753600261560ustar00rootroot00000000000000:man_page: mongoc_read_concern_destroy mongoc_read_concern_destroy() ============================= Synopsis -------- .. code-block:: c void mongoc_read_concern_destroy (mongoc_read_concern_t *read_concern); Parameters ---------- * ``read_concern``: A :symbol:`mongoc_read_concern_t`. Description ----------- Frees all resources associated with the read concern structure. Does nothing if ``read_concern`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_get_level.rst000066400000000000000000000007171511661753600264350ustar00rootroot00000000000000:man_page: mongoc_read_concern_get_level mongoc_read_concern_get_level() =============================== Synopsis -------- .. code-block:: c const char * mongoc_read_concern_get_level (const mongoc_read_concern_t *read_concern); Parameters ---------- * ``read_concern``: A :symbol:`mongoc_read_concern_t`. Description ----------- Returns the currently set read concern. Returns ------- Returns the current readConcern. If none is set, returns NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_is_default.rst000066400000000000000000000012551511661753600266040ustar00rootroot00000000000000:man_page: mongoc_read_concern_is_default mongoc_read_concern_is_default() ================================ Synopsis -------- .. code-block:: c bool mongoc_read_concern_is_default (mongoc_read_concern_t *read_concern); Parameters ---------- * ``read_concern``: A pointer to a :symbol:`mongoc_read_concern_t`. Description ----------- Returns true if ``read_concern`` has not been modified from the default. For example, if no "readConcern" option is set in the MongoDB URI and you have not called :symbol:`mongoc_client_set_read_concern()`, then :symbol:`mongoc_read_concern_is_default()` is true for the read concern returned by :symbol:`mongoc_client_get_read_concern()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_new.rst000066400000000000000000000005771511661753600252640ustar00rootroot00000000000000:man_page: mongoc_read_concern_new mongoc_read_concern_new() ========================= Synopsis -------- .. code-block:: c mongoc_read_concern_t * mongoc_read_concern_new (void); Returns ------- Creates a newly allocated read concern that can be configured based on user preference. This should be freed with :symbol:`mongoc_read_concern_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_set_level.rst000066400000000000000000000015451511661753600264510ustar00rootroot00000000000000:man_page: mongoc_read_concern_set_level mongoc_read_concern_set_level() =============================== Synopsis -------- .. code-block:: c bool mongoc_read_concern_set_level (mongoc_read_concern_t *read_concern, const char *level); Parameters ---------- * ``read_concern``: A :symbol:`mongoc_read_concern_t`. * ``level``: The readConcern level to use. Description ----------- Sets the read concern level. See :symbol:`mongoc_read_concern_t` for details. Beginning in version 1.9.0, this function can now alter the read concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would return ``false`` instead of altering the read concern. Returns ------- Returns ``true`` if the read concern level was set, or ``false`` otherwise. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_concern_t.rst000066400000000000000000000041771511661753600247360ustar00rootroot00000000000000:man_page: mongoc_read_concern_t mongoc_read_concern_t ===================== Read Concern abstraction Synopsis -------- New in MongoDB 3.2. The ``mongoc_read_concern_t`` allows clients to choose a level of isolation for their reads. The default, MONGOC_READ_CONCERN_LEVEL_LOCAL, is right for the great majority of applications. You can specify a read concern on connection objects, database objects, or collection objects. See `readConcern `_ on the MongoDB website for more information. Read Concern is only sent to MongoDB when it has explicitly been set by :symbol:`mongoc_read_concern_set_level` to anything other than NULL. .. _mongoc_read_concern_levels: Read Concern Levels ------------------- ====================================== =========================== ===================== Macro Description First MongoDB version ====================================== =========================== ===================== MONGOC_READ_CONCERN_LEVEL_LOCAL Level "local", the default. 3.2 MONGOC_READ_CONCERN_LEVEL_MAJORITY Level "majority". 3.2 MONGOC_READ_CONCERN_LEVEL_LINEARIZABLE Level "linearizable". 3.4 MONGOC_READ_CONCERN_LEVEL_AVAILABLE Level "available". 3.6 MONGOC_READ_CONCERN_LEVEL_SNAPSHOT Level "snapshot". 4.0 ====================================== =========================== ===================== For the sake of compatibility with future versions of MongoDB, :symbol:`mongoc_read_concern_set_level` allows any string, not just this list of known read concern levels. See `Read Concern Levels `_ in the MongoDB manual for more information about the individual read concern levels. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_read_concern_append mongoc_read_concern_copy mongoc_read_concern_destroy mongoc_read_concern_get_level mongoc_read_concern_is_default mongoc_read_concern_new mongoc_read_concern_set_level mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_mode_t.rst000066400000000000000000000012741511661753600242260ustar00rootroot00000000000000:man_page: mongoc_read_mode_t mongoc_read_mode_t ================== Read Preference Modes Synopsis -------- .. code-block:: c typedef enum { MONGOC_READ_PRIMARY = (1 << 0), MONGOC_READ_SECONDARY = (1 << 1), MONGOC_READ_PRIMARY_PREFERRED = (1 << 2) | MONGOC_READ_PRIMARY, MONGOC_READ_SECONDARY_PREFERRED = (1 << 2) | MONGOC_READ_SECONDARY, MONGOC_READ_NEAREST = (1 << 3) | MONGOC_READ_SECONDARY, } mongoc_read_mode_t; Description ----------- This enum describes how reads should be dispatched. The default is MONGOC_READ_PRIMARY. Please see the MongoDB website for a description of `Read Preferences `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_add_tag.rst000066400000000000000000000006341511661753600255400ustar00rootroot00000000000000:man_page: mongoc_read_prefs_add_tag mongoc_read_prefs_add_tag() =========================== Synopsis -------- .. code-block:: c void mongoc_read_prefs_add_tag (mongoc_read_prefs_t *read_prefs, const bson_t *tag); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``tag``: A :symbol:`bson:bson_t`. Description ----------- This function shall add a tag to a read preference. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_copy.rst000066400000000000000000000007521511661753600251300ustar00rootroot00000000000000:man_page: mongoc_read_prefs_copy mongoc_read_prefs_copy() ======================== Synopsis -------- .. code-block:: c mongoc_read_prefs_t * mongoc_read_prefs_copy (const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- This function shall deep copy a read preference. Returns ------- Returns a newly allocated read preference that should be freed with :symbol:`mongoc_read_prefs_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_destroy.rst000066400000000000000000000006161511661753600256460ustar00rootroot00000000000000:man_page: mongoc_read_prefs_destroy mongoc_read_prefs_destroy() =========================== Synopsis -------- .. code-block:: c void mongoc_read_prefs_destroy (mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Frees a read preference and all associated resources. Does nothing if ``read_prefs`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_get_hedge.rst000066400000000000000000000011531511661753600260650ustar00rootroot00000000000000:man_page: mongoc_read_prefs_get_hedge mongoc_read_prefs_get_hedge() ============================= .. deprecated:: MongoDB Server 8.0 Hedged reads are deprecated in MongoDB version 8.0 and will be removed in a future release. Synopsis -------- .. code-block:: c const bson_t * mongoc_read_prefs_get_hedge (const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Fetches any read preference hedge document that has been registered. Returns ------- Returns a :symbol:`bson:bson_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_get_max_staleness_seconds.rst000066400000000000000000000011321511661753600313720ustar00rootroot00000000000000:man_page: mongoc_read_prefs_get_max_staleness_seconds mongoc_read_prefs_get_max_staleness_seconds() ============================================= Synopsis -------- .. code-block:: c int64_t mongoc_read_prefs_get_max_staleness_seconds ( const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Clients estimate the staleness of each secondary, and select for reads only those secondaries whose estimated staleness is less than or equal to maxStalenessSeconds. The default is ``MONGOC_NO_MAX_STALENESS``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_get_mode.rst000066400000000000000000000006771511661753600257470ustar00rootroot00000000000000:man_page: mongoc_read_prefs_get_mode mongoc_read_prefs_get_mode() ============================ Synopsis -------- .. code-block:: c mongoc_read_mode_t mongoc_read_prefs_get_mode (const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Fetches the :symbol:`mongoc_read_mode_t` for the read preference. Returns ------- Returns the read preference mode. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_get_tags.rst000066400000000000000000000007311511661753600257500ustar00rootroot00000000000000:man_page: mongoc_read_prefs_get_tags mongoc_read_prefs_get_tags() ============================ Synopsis -------- .. code-block:: c const bson_t * mongoc_read_prefs_get_tags (const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Fetches any read preference tags that have been registered. Returns ------- Returns a :symbol:`bson:bson_t` that should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_is_valid.rst000066400000000000000000000010011511661753600257340ustar00rootroot00000000000000:man_page: mongoc_read_prefs_is_valid mongoc_read_prefs_is_valid() ============================ Synopsis -------- .. code-block:: c bool mongoc_read_prefs_is_valid (const mongoc_read_prefs_t *read_prefs); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Performs a consistency check of ``read_prefs`` to ensure it makes sense and can be satisfied. This only performs local consistency checks. Returns ------- Returns true if the read pref is valid. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_new.rst000066400000000000000000000007761511661753600247550ustar00rootroot00000000000000:man_page: mongoc_read_prefs_new mongoc_read_prefs_new() ======================= Synopsis -------- .. code-block:: c mongoc_read_prefs_t * mongoc_read_prefs_new (mongoc_read_mode_t read_mode); Parameters ---------- * ``read_mode``: A :symbol:`mongoc_read_mode_t`. Description ----------- Creates a new :symbol:`mongoc_read_prefs_t` using the mode specified. Returns ------- Returns a newly allocated :symbol:`mongoc_read_prefs_t` that should be freed with :symbol:`mongoc_read_prefs_destroy()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_set_hedge.rst000066400000000000000000000016511511661753600261040ustar00rootroot00000000000000:man_page: mongoc_read_prefs_set_hedge mongoc_read_prefs_set_hedge() ============================= .. deprecated:: MongoDB Server 8.0 Hedged reads are deprecated in MongoDB version 8.0 and will be removed in a future release. Synopsis -------- .. code-block:: c void mongoc_read_prefs_set_hedge (mongoc_read_prefs_t *read_prefs, const bson_t *hedge); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``hedge``: A :symbol:`bson:bson_t`. Description ----------- Sets the hedge document to be used for the read preference. Sharded clusters running MongoDB 4.4 or later can dispatch read operations in parallel, returning the result from the fastest host and cancelling the unfinished operations. For example, this is a valid hedge document .. code-block:: none { enabled: true } Appropriate values for the ``enabled`` key are ``true`` or ``false``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_set_max_staleness_seconds.rst000066400000000000000000000013761511661753600314200ustar00rootroot00000000000000:man_page: mongoc_read_prefs_set_max_staleness_seconds mongoc_read_prefs_set_max_staleness_seconds() ============================================= Synopsis -------- .. code-block:: c void mongoc_read_prefs_set_max_staleness_seconds (mongoc_read_prefs_t *read_prefs, int64_t max_staleness_seconds); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``max_staleness_seconds``: A positive integer or ``MONGOC_NO_MAX_STALENESS``. Description ----------- Sets the maxStalenessSeconds to be used for the read preference. Clients estimate the staleness of each secondary, and select for reads only those secondaries whose estimated staleness is less than or equal to maxStalenessSeconds. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_set_mode.rst000066400000000000000000000010701511661753600257470ustar00rootroot00000000000000:man_page: mongoc_read_prefs_set_mode mongoc_read_prefs_set_mode() ============================ Synopsis -------- .. code-block:: c void mongoc_read_prefs_set_mode (mongoc_read_prefs_t *read_prefs, mongoc_read_mode_t mode); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``mode``: A :symbol:`mongoc_read_mode_t`. Description ----------- Sets the read preference mode. See the MongoDB website for more information on `Read Preferences `_. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_set_tags.rst000066400000000000000000000051741511661753600257720ustar00rootroot00000000000000:man_page: mongoc_read_prefs_set_tags mongoc_read_prefs_set_tags() ============================ Synopsis -------- .. code-block:: c void mongoc_read_prefs_set_tags (mongoc_read_prefs_t *read_prefs, const bson_t *tags); Parameters ---------- * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. * ``tags``: A :symbol:`bson:bson_t`. Description ----------- Sets the tags to be used for the read preference. Only mongod instances matching these tags will be suitable for handling the request. Examples -------- .. code-block:: c #include static void run_query_with_read_prefs_tags (mongoc_collection_t *collection) { char *str; const bson_t *doc; bson_t filter = BSON_INITIALIZER; bson_error_t error; mongoc_cursor_t *cursor; mongoc_read_prefs_t *read_prefs; /* Create a tagset representing * [ * {"dc": "ny", "rack": "1" }, // Any node in rack1 in the ny datacenter * {"dc": "ny", "rack": "2" }, // Any node in rack2 in the ny datacenter * {"dc": "ny" }, // Any node in the ny datacenter * {} // If all else fails, just any available node * ] */ bson_t *tags = BCON_NEW ( "0", "{", "dc", BCON_UTF8("ny"), "rack", BCON_UTF8("1"), "}", "1", "{", "dc", BCON_UTF8("ny"), "rack", BCON_UTF8("2"), "}", "2", "{", "dc", BCON_UTF8("ny"), "}", "3", "{", "}" ); read_prefs = mongoc_read_prefs_new (MONGOC_READ_SECONDARY); mongoc_read_prefs_set_tags (read_prefs, tags); bson_destroy (tags); cursor = mongoc_collection_find_with_opts (collection, &filter, NULL, read_prefs); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "Cursor error: %s\n", error.message); } mongoc_cursor_destroy (cursor); mongoc_read_prefs_destroy (read_prefs); bson_destroy (doc); } int main (void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_init (); client = mongoc_client_new ("mongodb://localhost/?appname=rp_tags&replicaSet=foo"); mongoc_client_set_error_api (client, 2); collection = mongoc_client_get_collection (client, "dbname", "collname"); run_query_with_read_prefs_tags (collection); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup(); } mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_read_prefs_t.rst000066400000000000000000000123021511661753600244130ustar00rootroot00000000000000:man_page: mongoc_read_prefs_t mongoc_read_prefs_t =================== A read preference abstraction Synopsis -------- :symbol:`mongoc_read_prefs_t` provides an abstraction on top of the MongoDB connection read preferences. It allows for hinting to the driver which nodes in a replica set should be accessed first and how. You can specify a read preference mode on connection objects, database objects, collection objects, or per-operation. Generally, it makes the most sense to stick with the global default mode, ``MONGOC_READ_PRIMARY``. All of the other modes come with caveats that won't be covered in great detail here. Read Modes ---------- =============================== ==================================================================================================================================================== MONGOC_READ_PRIMARY Default mode. All operations read from the current replica set primary. MONGOC_READ_SECONDARY All operations read from among the nearest secondary members of the replica set. MONGOC_READ_PRIMARY_PREFERRED In most situations, operations read from the primary but if it is unavailable, operations read from secondary members. MONGOC_READ_SECONDARY_PREFERRED In most situations, operations read from among the nearest secondary members, but if no secondaries are available, operations read from the primary. MONGOC_READ_NEAREST Operations read from among the nearest members of the replica set, irrespective of the member's type. =============================== ==================================================================================================================================================== .. _mongoc-read-prefs-tag-sets: Tag Sets -------- Tag sets allow you to specify custom read preferences and write concerns so that your application can target operations to specific members. Custom read preferences and write concerns evaluate tags sets in different ways: read preferences consider the value of a tag when selecting a member to read from, while write concerns ignore the value of a tag when selecting a member, except to consider whether or not the value is unique. You can specify tag sets with the following read preference modes: * primaryPreferred * secondary * secondaryPreferred * nearest Tags are not compatible with ``MONGOC_READ_PRIMARY`` and, in general, only apply when selecting a secondary member of a set for a read operation. However, the nearest read mode, when combined with a tag set, will select the nearest member that matches the specified tag set, which may be a primary or secondary. Tag sets are represented as a comma-separated list of colon-separated key-value pairs when provided as a connection string, e.g. `dc:ny,rack:1`. To specify a list of tag sets, using multiple readPreferenceTags, e.g. .. code-block:: none readPreferenceTags=dc:ny,rack:1;readPreferenceTags=dc:ny;readPreferenceTags= Note the empty value for the last one, which means "match any secondary as a last resort". Order matters when using multiple readPreferenceTags. Tag Sets can also be configured using :symbol:`mongoc_read_prefs_set_tags`. All interfaces use the same member selection logic to choose the member to which to direct read operations, basing the choice on read preference mode and tag sets. Max Staleness ------------- When connected to replica set running MongoDB 3.4 or later, the driver estimates the staleness of each secondary based on lastWriteDate values provided in server hello responses. Max Staleness is the maximum replication lag in seconds (wall clock time) that a secondary can suffer and still be eligible for reads. The default is ``MONGOC_NO_MAX_STALENESS``, which disables staleness checks. Otherwise, it must be a positive integer at least ``MONGOC_SMALLEST_MAX_STALENESS_SECONDS`` (90 seconds). Max Staleness is also supported by sharded clusters of replica sets if all servers run MongoDB 3.4 or later. Hedged Reads ------------ .. deprecated:: MongoDB Server 8.0 Hedged reads are deprecated in MongoDB version 8.0 and will be removed in a future release. When connecting to a sharded cluster running MongoDB 4.4 or later, reads can be sent in parallel to the two "best" hosts. Once one result returns, any other outstanding operations that were part of the hedged read are cancelled. When the read preference mode is ``MONGOC_READ_NEAREST`` and the sharded cluster is running MongoDB 4.4 or later, hedged reads are enabled by default. Additionally, hedged reads may be explicitly enabled or disabled by calling :symbol:`mongoc_read_prefs_set_hedge` with a BSON document, e.g. .. code-block:: none { enabled: true } Appropriate values for the ``enabled`` key are ``true`` or ``false``. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_read_prefs_add_tag mongoc_read_prefs_copy mongoc_read_prefs_destroy mongoc_read_prefs_get_hedge mongoc_read_prefs_get_max_staleness_seconds mongoc_read_prefs_get_mode mongoc_read_prefs_get_tags mongoc_read_prefs_is_valid mongoc_read_prefs_new mongoc_read_prefs_set_hedge mongoc_read_prefs_set_max_staleness_seconds mongoc_read_prefs_set_mode mongoc_read_prefs_set_tags mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_remove_flags_t.rst000066400000000000000000000015341511661753600247570ustar00rootroot00000000000000:man_page: mongoc_remove_flags_t mongoc_remove_flags_t ===================== Flags for deletion operations Synopsis -------- .. code-block:: c typedef enum { MONGOC_REMOVE_NONE = 0, MONGOC_REMOVE_SINGLE_REMOVE = 1 << 0, } mongoc_remove_flags_t; Description ----------- These flags correspond to the MongoDB wire protocol. They may be bitwise or'd together. They may change the number of documents that are removed during a remove command. Flag Values ----------- =========================== ================================================================= MONGOC_REMOVE_NONE Specify no removal flags. All matching documents will be removed. MONGOC_REMOVE_SINGLE_REMOVE Only remove the first matching document from the selector. =========================== ================================================================= mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_copy.rst000066400000000000000000000007051511661753600251530ustar00rootroot00000000000000:man_page: mongoc_server_api_copy mongoc_server_api_copy() ======================== Synopsis -------- .. code-block:: c mongoc_server_api_t * mongoc_server_api_copy (const mongoc_server_api_t *api); Creates a deep copy of ``api``. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. Returns ------- Returns a newly allocated copy of ``api`` that must be freed with :symbol:`mongoc_server_api_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_deprecation_errors.rst000066400000000000000000000010321511661753600300640ustar00rootroot00000000000000:man_page: mongoc_server_api_deprecation_errors mongoc_server_api_deprecation_errors() ====================================== Synopsis -------- .. code-block:: c void mongoc_server_api_deprecation_errors (mongoc_server_api_t *api, bool deprecation_errors); Set whether or not to error on commands that are deprecated in this API version. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. * ``deprecation_errors``: Whether or not to error on commands that are deprecated. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_destroy.rst000066400000000000000000000004141511661753600256670ustar00rootroot00000000000000:man_page: mongoc_server_api_destroy mongoc_server_api_destroy() =========================== Synopsis -------- .. code-block:: c void mongoc_server_api_destroy (mongoc_server_api_t *api); Free a :symbol:`mongoc_server_api_t`. Does nothing if ``api`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_get_deprecation_errors.rst000066400000000000000000000010501511661753600307230ustar00rootroot00000000000000:man_page: mongoc_server_api_get_deprecation_errors mongoc_server_api_get_deprecation_errors() ========================================== Synopsis -------- .. code-block:: c const mongoc_optional_t * mongoc_server_api_get_deprecation_errors (const mongoc_server_api_t *api); Returns the value of the deprecation_errors flag for the :symbol:`mongoc_server_api_t`. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. Returns ------- Returns a :symbol:`mongoc_optional_t` indicating whether the deprecation_errors flag was set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_get_strict.rst000066400000000000000000000007401511661753600263470ustar00rootroot00000000000000:man_page: mongoc_server_api_get_strict mongoc_server_api_get_strict() ============================== Synopsis -------- .. code-block:: c const mongoc_optional_t * mongoc_server_api_get_strict (const mongoc_server_api_t *api); Returns the value of the strict flag for the :symbol:`mongoc_server_api_t`. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. Returns ------- Returns a :symbol:`mongoc_optional_t` indicating whether the strict flag was set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_get_version.rst000066400000000000000000000010031511661753600265150ustar00rootroot00000000000000:man_page: mongoc_server_api_get_version mongoc_server_api_get_version() =============================== Synopsis -------- .. code-block:: c mongoc_server_api_version_t mongoc_server_api_get_version (const mongoc_server_api_t *api); Fetch the declared API version as from a :symbol:`mongoc_server_api_t`. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. Returns ------- Returns a :symbol:`mongoc_server_api_version_t` with the API version declare in the :symbol:`mongoc_server_api_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_new.rst000066400000000000000000000005511511661753600247710ustar00rootroot00000000000000:man_page: mongoc_server_api_new mongoc_server_api_new() ======================= Synopsis -------- .. code-block:: c mongoc_server_api_t * mongoc_server_api_new (mongoc_server_api_version_t version); Create a struct to hold server API preferences. Returns ------- A new ``mongoc_server_api_t`` you must free with :symbol:`mongoc_server_api_destroy`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_strict.rst000066400000000000000000000006651511661753600255160ustar00rootroot00000000000000:man_page: mongoc_server_api_strict mongoc_server_api_strict() ========================== Synopsis -------- .. code-block:: c void mongoc_server_api_strict (mongoc_server_api_t *api, bool strict); Set whether to be strict about the list of allowed commands in this API version. Parameters ---------- * ``api``: A :symbol:`mongoc_server_api_t`. * ``strict``: Whether or not to be struct about the list of allowed API commands. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_t.rst000066400000000000000000000016621511661753600244470ustar00rootroot00000000000000:man_page: mongoc_server_api_t mongoc_server_api_t =================== A versioned API to use for connections. Synopsis -------- Used to specify which version of the MongoDB server's API to use for driver connections. The server API type takes a :symbol:`mongoc_server_api_version_t`. It can optionally be strict about the list of allowed commands in that API version, and can also optionally provide errors for deprecated commands in that API version. A :symbol:`mongoc_server_api_t` can be set on a client, and will then be sent to MongoDB for most commands run using that client. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_server_api_copy mongoc_server_api_deprecation_errors mongoc_server_api_destroy mongoc_server_api_get_deprecation_errors mongoc_server_api_get_strict mongoc_server_api_get_version mongoc_server_api_new mongoc_server_api_strict mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_version_from_string.rst000066400000000000000000000014051511661753600302750ustar00rootroot00000000000000:man_page: mongoc_server_api_version_from_string mongoc_server_api_version_from_string() ======================================= Synopsis -------- .. code-block:: c bool mongoc_server_api_version_from_string (const char *version, mongoc_server_api_version_t *out); Given a string ``version``, populates ``out`` with the equivalent :symbol:`mongoc_server_api_version_t` if ``version`` represents a valid API version. Parameters ---------- * ``version``: A string representing the version identifier. * ``out``: A pointer to a :symbol:`mongoc_server_api_version_t`. Returns ------- True on success, false on failure. On success, ``out`` is populated with the converted version string. On failure, ``out`` is not altered. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_version_t.rst000066400000000000000000000013551511661753600262130ustar00rootroot00000000000000:man_page: mongoc_server_api_version_t mongoc_server_api_version_t =========================== A representation of server API version numbers. Synopsis -------- Used to specify which version of the MongoDB server's API to use for driver connections. Supported API Versions ---------------------- The driver currently supports the following MongoDB API versions: ==================== ====================== Enum value MongoDB version string ==================== ====================== MONGOC_SERVER_API_V1 "1" ==================== ====================== .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_server_api_version_from_string mongoc_server_api_version_to_string mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_api_version_to_string.rst000066400000000000000000000010541511661753600277540ustar00rootroot00000000000000:man_page: mongoc_server_api_version_to_string mongoc_server_api_version_to_string() ===================================== Synopsis -------- .. code-block:: c const char * mongoc_server_api_version_to_string (mongoc_server_api_version_t version); Returns the string representation of ``version``, or NULL if ``version`` has no string representation. Parameters ---------- * ``version``: A :symbol:`mongoc_server_api_version_t` Returns ------- Returns the string representation of ``version`` or NULL. The returned string should not be freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_destroy.rst000066400000000000000000000007071511661753600274460ustar00rootroot00000000000000:man_page: mongoc_server_description_destroy mongoc_server_description_destroy() =================================== Synopsis -------- .. code-block:: c void mongoc_server_description_destroy (mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Frees all resources associated with the server description. Does nothing if ``description`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_hello_response.rst000066400000000000000000000015741511661753600310010ustar00rootroot00000000000000:man_page: mongoc_server_description_hello_response mongoc_server_description_hello_response() ========================================== Synopsis -------- .. code-block:: c const bson_t * mongoc_server_description_hello_response ( const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- The client or client pool periodically runs a `"hello" `_ command on each server, to update its view of the MongoDB deployment. Use :symbol:`mongoc_client_get_server_descriptions()` and ``mongoc_server_description_hello_response()`` to get the most recent "hello" response. Returns ------- A reference to a BSON document, owned by the server description. The document is empty if the driver is not connected to the server. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_host.rst000066400000000000000000000012221511661753600267230ustar00rootroot00000000000000:man_page: mongoc_server_description_host mongoc_server_description_host() ================================ Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_server_description_host (const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Return the server's host and port. This object is owned by the server description. Returns ------- .. versionchanged:: 2.0.0 The return type changed from ``mongoc_host_list_t *`` to ``const mongoc_host_list_t *``. A reference to the server description's :symbol:`mongoc_host_list_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_id.rst000066400000000000000000000006531511661753600263510ustar00rootroot00000000000000:man_page: mongoc_server_description_id mongoc_server_description_id() ============================== Synopsis -------- .. code-block:: c uint32_t mongoc_server_description_id (const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Get the server's id, an opaque identifier generated by the client or client pool. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_last_update_time.rst000066400000000000000000000012201511661753600312670ustar00rootroot00000000000000:man_page: mongoc_server_description_last_update_time mongoc_server_description_last_update_time() ============================================ Synopsis -------- .. code-block:: c int64_t mongoc_server_description_last_update_time (const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Get the last point in time when we processed a hello for this server, or, if we have not processed any hellos since creating the description, the time the server description was initialized. Returns ------- The server's last update time, in microseconds. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_new_copy.rst000066400000000000000000000012001511661753600275650ustar00rootroot00000000000000:man_page: mongoc_server_description_new_copy mongoc_server_description_new_copy() ==================================== Synopsis -------- .. code-block:: c mongoc_server_description_t * mongoc_server_description_new_copy ( const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Performs a deep copy of ``description``. Returns ------- Returns a newly allocated copy of ``description`` that should be freed with :symbol:`mongoc_server_description_destroy()` when no longer in use. Returns NULL if ``description`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_round_trip_time.rst000066400000000000000000000010131511661753600311470ustar00rootroot00000000000000:man_page: mongoc_server_description_round_trip_time mongoc_server_description_round_trip_time() =========================================== Synopsis -------- .. code-block:: c int64_t mongoc_server_description_round_trip_time ( const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- Get the server's round trip time in milliseconds. This is the client's measurement of the duration of a "hello" command. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_t.rst000066400000000000000000000023711511661753600262170ustar00rootroot00000000000000:man_page: mongoc_server_description_t mongoc_server_description_t =========================== Server description Synopsis -------- .. code-block:: c #include typedef struct _mongoc_server_description_t mongoc_server_description_t ``mongoc_server_description_t`` holds information about a mongod or mongos the driver is connected to. Lifecycle --------- Clean up a ``mongoc_server_description_t`` with :symbol:`mongoc_server_description_destroy()` when necessary. Applications receive a temporary reference to a ``mongoc_server_description_t`` as a parameter to an SDAM Monitoring callback that must not be destroyed. See :doc:`Introduction to Application Performance Monitoring `. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_server_description_destroy mongoc_server_description_hello_response mongoc_server_description_host mongoc_server_description_id mongoc_server_description_last_update_time mongoc_server_description_new_copy mongoc_server_description_round_trip_time mongoc_server_description_type mongoc_server_descriptions_destroy_all .. seealso:: | :symbol:`mongoc_client_get_server_descriptions()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_description_type.rst000066400000000000000000000011161511661753600267310ustar00rootroot00000000000000:man_page: mongoc_server_description_type mongoc_server_description_type() ================================ Synopsis -------- .. code-block:: c const char * mongoc_server_description_type (const mongoc_server_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_server_description_t`. Description ----------- This function returns a string, one of the server types defined in the Server Discovery And Monitoring Spec: * Standalone * Mongos * PossiblePrimary * LoadBalancer * RSPrimary * RSSecondary * RSArbiter * RSOther * RSGhost * Unknown mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_server_descriptions_destroy_all.rst000066400000000000000000000010461511661753600304560ustar00rootroot00000000000000:man_page: mongoc_server_descriptions_destroy_all mongoc_server_descriptions_destroy_all() ======================================== Synopsis -------- .. code-block:: c void mongoc_server_descriptions_destroy_all (mongoc_server_description_t **sds, size_t n); Frees the array of :symbol:`mongoc_server_description_t` structs returned by :symbol:`mongoc_client_get_server_descriptions`. Parameters ---------- * ``sds``: The array of server descriptions. * ``n``: The number of elements in ``sds``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opt_t.rst000066400000000000000000000014771511661753600246610ustar00rootroot00000000000000:man_page: mongoc_session_opt_t mongoc_session_opt_t ==================== .. code-block:: c #include typedef struct _mongoc_session_opt_t mongoc_session_opt_t; Synopsis -------- .. include:: includes/session-lifecycle.txt See the example code for :symbol:`mongoc_session_opts_set_causal_consistency`. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_session_opts_new mongoc_session_opts_get_causal_consistency mongoc_session_opts_set_causal_consistency mongoc_session_opts_get_default_transaction_opts mongoc_session_opts_set_default_transaction_opts mongoc_session_opts_get_snapshot mongoc_session_opts_set_snapshot mongoc_session_opts_get_transaction_opts mongoc_session_opts_clone mongoc_session_opts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_clone.rst000066400000000000000000000010051511661753600256640ustar00rootroot00000000000000:man_page: mongoc_session_opts_clone mongoc_session_opts_clone() =========================== Synopsis -------- .. code-block:: c mongoc_session_opt_t * mongoc_session_opts_clone (const mongoc_session_opt_t *opts); Create a copy of a session options struct. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. Returns ------- A new :symbol:`mongoc_session_opt_t` that must be freed with :symbol:`mongoc_session_opts_destroy()`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_destroy.rst000066400000000000000000000007741511661753600262710ustar00rootroot00000000000000:man_page: mongoc_session_opts_destroy mongoc_session_opts_destroy() ============================= Synopsis -------- .. code-block:: c void mongoc_session_opts_destroy (mongoc_session_opt_t *opts); Free a :symbol:`mongoc_session_opt_t`. Does nothing if ``opts`` is NULL. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. Example ------- See the example code for :symbol:`mongoc_session_opts_set_causal_consistency`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_get_causal_consistency.rst000066400000000000000000000010541511661753600313200ustar00rootroot00000000000000:man_page: mongoc_session_opts_get_causal_consistency mongoc_session_opts_get_causal_consistency() ============================================ Synopsis -------- .. code-block:: c bool mongoc_session_opts_get_causal_consistency (const mongoc_session_opt_t *opts); Return true if this session is configured for causal consistency (the default), else false. See :symbol:`mongoc_session_opts_set_causal_consistency()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_get_default_transaction_opts.rst000066400000000000000000000012621511661753600325260ustar00rootroot00000000000000:man_page: mongoc_session_opts_get_default_transaction_opts mongoc_session_opts_get_default_transaction_opts() ================================================== Synopsis -------- .. code-block:: c const mongoc_transaction_opt_t * mongoc_session_opts_get_default_transaction_opts (const mongoc_session_opt_t *opts); The default options for transactions started with this session. See :symbol:`mongoc_session_opts_set_default_transaction_opts()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. Returns ------- A :symbol:`mongoc_transaction_opt_t` that is valid only for the lifetime of ``opts``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_get_snapshot.rst000066400000000000000000000007551511661753600272750ustar00rootroot00000000000000:man_page: mongoc_session_opts_get_snapshot mongoc_session_opts_get_snapshot() ================================== Synopsis -------- .. code-block:: c bool mongoc_session_opts_get_snapshot (const mongoc_session_opt_t *opts); Return true if this session is configured for snapshot reads, false by default. See :symbol:`mongoc_session_opts_set_snapshot()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. .. only:: html .. include:: includes/seealso/session.txtmongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_get_transaction_opts.rst000066400000000000000000000014731511661753600310260ustar00rootroot00000000000000:man_page: mongoc_session_opts_get_transaction_opts mongoc_session_opts_get_transaction_opts() ========================================== Synopsis -------- .. code-block:: c mongoc_transaction_opt_t * mongoc_session_opts_get_transaction_opts ( const mongoc_client_session_t *session); The options for the current transaction started with this session. If this ``session`` is not in a transaction, then the returned value is ``NULL``. See :symbol:`mongoc_client_session_in_transaction()`. Parameters ---------- * ``session``: A :symbol:`mongoc_client_session_t`. Returns ------- If the session is in a transaction, a new :symbol:`mongoc_transaction_opt_t` that must be freed with :symbol:`mongoc_transaction_opts_destroy()`. Otherwise, ``NULL``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_new.rst000066400000000000000000000007541511661753600253670ustar00rootroot00000000000000:man_page: mongoc_session_opts_new mongoc_session_opts_new() ========================= Synopsis -------- .. code-block:: c mongoc_session_opt_t * mongoc_session_opts_new (void); .. include:: includes/session-lifecycle.txt See the example code for :symbol:`mongoc_session_opts_set_causal_consistency`. Returns ------- A new :symbol:`mongoc_session_opt_t` that must be freed with :symbol:`mongoc_session_opts_destroy()`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_set_causal_consistency.rst000066400000000000000000000050261511661753600313370ustar00rootroot00000000000000:man_page: mongoc_session_opts_set_causal_consistency mongoc_session_opts_set_causal_consistency() ============================================ Synopsis -------- .. code-block:: c void mongoc_session_opts_set_causal_consistency (mongoc_session_opt_t *opts, bool causal_consistency); Configure causal consistency in a session. If true (the default), each operation in the session will be causally ordered after the previous read or write operation. Set to false to disable causal consistency. See `the MongoDB Manual Entry for Causal Consistency `_. Causal consistency and snapshot reads are mutually exclusive. Attempting to set both to true will result in an error. See :symbol:`mongoc_session_opts_set_snapshot()`. Unacknowledged writes are not causally consistent. If you execute a write operation with a :symbol:`mongoc_write_concern_t` on which you have called :symbol:`mongoc_write_concern_set_w` with a value of 0, the write does not participate in causal consistency. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. * ``causal_consistency``: True or false. Example ------- .. code-block:: c mongoc_client_t *client; mongoc_session_opt_t *session_opts; mongoc_client_session_t *client_session; mongoc_collection_t *collection; bson_t insert_opts = BSON_INITIALIZER; bson_t *doc; bson_error_t error; bool r; client = mongoc_client_new ("mongodb://example/?appname=session-opts-example"); mongoc_client_set_error_api (client, 2); session_opts = mongoc_session_opts_new (); mongoc_session_opts_set_causal_consistency (session_opts, false); client_session = mongoc_client_start_session (client, session_opts, &error); mongoc_session_opts_destroy (session_opts); if (!client_session) { fprintf (stderr, "Failed to start session: %s\n", error.message); abort (); } collection = mongoc_client_get_collection (client, "test", "collection"); doc = BCON_NEW ("_id", BCON_INT32 (1)); r = mongoc_client_session_append (client_session, &insert_opts, NULL); if (!r) { fprintf (stderr, "mongoc_client_session_append failed: %s\n", error.message); abort (); } r = mongoc_collection_insert_one ( collection, doc, &insert_opts, NULL /* reply */, &error); if (!r) { fprintf (stderr, "Insert failed: %s\n", error.message); abort (); } .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_set_default_transaction_opts.rst000066400000000000000000000031251511661753600325420ustar00rootroot00000000000000:man_page: mongoc_session_opts_set_default_transaction_opts mongoc_session_opts_set_default_transaction_opts() ================================================== Synopsis -------- .. code-block:: c void mongoc_session_opts_set_default_transaction_opts ( mongoc_session_opt_t *opts, const mongoc_transaction_opt_t *txn_opts); Set the default options for transactions started with this session. The ``txn_opts`` argument is copied and can be freed after calling this function. When a session is first created with :symbol:`mongoc_client_start_session`, it inherits from the client the read concern, write concern, and read preference with which to start transactions. Each of these fields can be overridden independently. Create a :symbol:`mongoc_transaction_opt_t` with :symbol:`mongoc_transaction_opts_new`, and pass a non-NULL option to any of the :symbol:`mongoc_transaction_opt_t` setter functions: * :symbol:`mongoc_transaction_opts_set_read_concern` * :symbol:`mongoc_transaction_opts_set_write_concern` * :symbol:`mongoc_transaction_opts_set_read_prefs` Pass the resulting transaction options to :symbol:`mongoc_session_opts_set_default_transaction_opts`. Each field set in the transaction options overrides the inherited client configuration. There is an opportunity to override each one of these fields again by passing a :symbol:`mongoc_transaction_opt_t` to :symbol:`mongoc_client_session_start_transaction`. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. * ``txn_opts``: A :symbol:`mongoc_transaction_opt_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_session_opts_set_snapshot.rst000066400000000000000000000053161511661753600273070ustar00rootroot00000000000000:man_page: mongoc_session_opts_set_snapshot mongoc_session_opts_set_snapshot() ================================== Synopsis -------- .. code-block:: c void mongoc_session_opts_set_snapshot (mongoc_session_opt_t *opts, bool snapshot); Configure snapshot reads for a session. If true (false by default), each read operation in the session will be sent with a "snapshot" level read concern. After the first read operation ("find", "aggregate" or "distinct"), subsequent read operations will read from the same point in time as the first read operation. Set to true to enable snapshot reads. See `the official documentation for Read Concern "snapshot" `_. Snapshot reads and causal consistency are mutually exclusive. Attempting to set both to true will result in an error. See :symbol:`mongoc_session_opts_set_causal_consistency()`. Snapshot reads can only be used on MongoDB server version 5.0 and later and cannot be used during a transaction. A write operation in a snapshot-enabled session will also result in an error. Parameters ---------- * ``opts``: A :symbol:`mongoc_session_opt_t`. * ``snapshot``: True or false. Example ------- .. code-block:: c mongoc_client_t *client; mongoc_session_opt_t *session_opts; mongoc_client_session_t *client_session; mongoc_collection_t *collection; bson_t query_opts = BSON_INITIALIZER; bson_t filter = BSON_INITIALIZER; bson_t pipeline = BSON_INITIALIZER; client = mongoc_client_new ("mongodb://example/?appname=session-opts-example"); mongoc_client_set_error_api (client, MONGOC_ERROR_API_VERSION_2); session_opts = mongoc_session_opts_new (); mongoc_session_opts_set_snapshot (session_opts, true); client_session = mongoc_client_start_session (client, session_opts, &error); mongoc_session_opts_destroy (session_opts); if (!client_session) { fprintf (stderr, "Failed to start session: %s\n", error.message); abort (); } collection = mongoc_client_get_collection (client, "test", "collection"); r = mongoc_client_session_append (client_session, &find_opts, &error); if (!r) { fprintf (stderr, "mongoc_client_session_append failed: %s\n", error.message); abort (); } /* First read operation will set the snapshot time for subsequent reads. */ cursor = mongoc_collection_find_with_opts (collection, filter, &query_opts, NULL); /* Subsequent read operations will automatically read from the same point * in time as the first read operation. */ cursor = mongoc_collection_aggregate (collection, MONGOC_QUERY_NONE, pipeline, &query_opts, NULL); .. only:: html .. include:: includes/seealso/session.txtmongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_accept.rst000066400000000000000000000013111511661753600245630ustar00rootroot00000000000000:man_page: mongoc_socket_accept mongoc_socket_accept() ====================== Synopsis -------- .. code-block:: c mongoc_socket_t * mongoc_socket_accept (mongoc_socket_t *sock, int64_t expire_at); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``expire_at``: An int64_t containing a timeout in milliseconds. Description ----------- This function is a wrapper around the BSD socket ``accept()`` interface. It allows for more portability between UNIX-like and Microsoft Windows platforms. Returns ------- NULL upon failure to accept or timeout. A newly allocated ``mongoc_socket_t`` that should be released with :symbol:`mongoc_socket_destroy()` on success. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_bind.rst000066400000000000000000000011761511661753600242510ustar00rootroot00000000000000:man_page: mongoc_socket_bind mongoc_socket_bind() ==================== Synopsis -------- .. code-block:: c int mongoc_socket_bind (mongoc_socket_t *sock, const struct sockaddr *addr, mongoc_socklen_t addrlen); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``addr``: A struct sockaddr. * ``addrlen``: A mongoc_socklen_t. Description ----------- This function is a wrapper around the BSD socket ``bind()`` interface. It provides better portability between UNIX-like and Microsoft Windows platforms. Returns ------- 0 on success, -1 on failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_close.rst000066400000000000000000000012541511661753600244370ustar00rootroot00000000000000:man_page: mongoc_socket_close mongoc_socket_close() ===================== Synopsis -------- .. code-block:: c int mongoc_socket_close (mongoc_socket_t *socket); Parameters ---------- * ``socket``: A :symbol:`mongoc_socket_t`. Description ----------- This function is a wrapper around the BSD socket ``shutdown()`` and ``close()`` functions, and their Windows equivalents. The socket is shut down only if the current process is the same as the process that opened the socket. Regardless, the socket is then closed. Returns ------- 0 on success, -1 on failure to close the socket. On failure, the socket's errno is set; retrieve it with :symbol:`mongoc_socket_errno()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_connect.rst000066400000000000000000000020341511661753600247600ustar00rootroot00000000000000:man_page: mongoc_socket_connect mongoc_socket_connect() ======================= Synopsis -------- .. code-block:: c int mongoc_socket_connect (mongoc_socket_t *sock, const struct sockaddr *addr, mongoc_socklen_t addrlen, int64_t expire_at); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``addr``: A struct sockaddr. * ``addrlen``: A mongoc_socklen_t. * ``expire_at``: A int64_t containing the absolute timeout using the monotonic clock. Description ----------- This function is a wrapper around the BSD socket ``connect()`` interface. It provides better portability between UNIX-like and Microsoft Windows platforms. This function performs a socket connection but will fail if ``expire_at`` has been reached by the monotonic clock. Keep in mind that this is an absolute timeout in milliseconds. You should add your desired timeout to :symbol:`bson:bson_get_monotonic_time()`. Returns ------- 0 if successful, -1 on failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_destroy.rst000066400000000000000000000006771511661753600250330ustar00rootroot00000000000000:man_page: mongoc_socket_destroy mongoc_socket_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_socket_destroy (mongoc_socket_t *sock); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. Description ----------- This function releases all resources associated with a :symbol:`mongoc_socket_t`. This should be called when you are no longer using the socket. Does nothing if ``sock`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_errno.rst000066400000000000000000000010241511661753600244520ustar00rootroot00000000000000:man_page: mongoc_socket_errno mongoc_socket_errno() ===================== Synopsis -------- .. code-block:: c int mongoc_socket_errno (mongoc_socket_t *sock); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. Description ----------- This function returns the currently captured ``errno`` for a socket. This may be useful to check was the last errno was after another function call has been made that clears the threads errno variable. Returns ------- 0 if there is no error, otherwise a specific errno. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_getnameinfo.rst000066400000000000000000000007741511661753600256340ustar00rootroot00000000000000:man_page: mongoc_socket_getnameinfo mongoc_socket_getnameinfo() =========================== Synopsis -------- .. code-block:: c char * mongoc_socket_getnameinfo (mongoc_socket_t *sock); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. Description ----------- This is a helper around getting the local name of a socket. It is a wrapper around ``getpeername()`` and ``getnameinfo()``. Returns ------- A newly allocated string that should be freed with :symbol:`bson:bson_free()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_getsockname.rst000066400000000000000000000012301511661753600256240ustar00rootroot00000000000000:man_page: mongoc_socket_getsockname mongoc_socket_getsockname() =========================== Synopsis -------- .. code-block:: c int mongoc_socket_getsockname (mongoc_socket_t *sock, struct sockaddr *addr, mongoc_socklen_t *addrlen); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``addr``: A struct sockaddr. * ``addrlen``: A mongoc_socklen_t. Description ----------- Retrieves the socket name for ``sock``. The result is stored in ``addr``. ``addrlen`` should be the size of the ``addr`` when calling this. Returns ------- 0 if successful, otherwise -1 and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_listen.rst000066400000000000000000000007641511661753600246350ustar00rootroot00000000000000:man_page: mongoc_socket_listen mongoc_socket_listen() ====================== Synopsis -------- .. code-block:: c int mongoc_socket_listen (mongoc_socket_t *sock, unsigned int backlog); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``backlog``: An int containing max backlog size. Description ----------- This function is similar to the BSD sockets ``listen()`` function. It is meant for socket servers. Returns ------- 0 on success, -1 on failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_new.rst000066400000000000000000000013471511661753600241260ustar00rootroot00000000000000:man_page: mongoc_socket_new mongoc_socket_new() =================== Synopsis -------- .. code-block:: c mongoc_socket_t * mongoc_socket_new (int domain, int type, int protocol); Parameters ---------- * ``domain``: An int containing the address family such as AF_INET. * ``type``: An int containing the socket type such as SOCK_STREAM. * ``protocol``: A protocol subset, typically 0. Description ----------- Creates a new ``mongoc_socket_t`` structure. This calls ``socket()`` underneath to create a network socket. Returns ------- A new socket if successful, otherwise ``NULL`` and errno is set. The result should be freed with :symbol:`mongoc_socket_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_recv.rst000066400000000000000000000015411511661753600242700ustar00rootroot00000000000000:man_page: mongoc_socket_recv mongoc_socket_recv() ==================== Synopsis -------- .. code-block:: c ssize_t mongoc_socket_recv (mongoc_socket_t *sock, void *buf, size_t buflen, int flags, int64_t expire_at); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``buf``: A buffer to read into. * ``buflen``: A size_t with the number of bytes to receive. * ``flags``: flags for ``recv()``. * ``expire_at``: A int64_t with the time to expire in monotonic time using :symbol:`bson:bson_get_monotonic_time()`, which is in microseconds. Description ----------- This function performs a ``recv()`` on the underlying socket. Returns ------- The number of bytes received on success, 0 on stream closed, and -1 if there was a failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_send.rst000066400000000000000000000016041511661753600242620ustar00rootroot00000000000000:man_page: mongoc_socket_send mongoc_socket_send() ==================== Synopsis -------- .. code-block:: c ssize_t mongoc_socket_send (mongoc_socket_t *sock, const void *buf, size_t buflen, int64_t expire_at); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``buf``: A buffer to send. * ``buflen``: A size_t with the number of bytes in buf. * ``expire_at``: A int64_t with an absolute timeout for the operation or 0. The timeout is in monotonic time using microseconds. You can retrieve the current monotonic time with :symbol:`bson:bson_get_monotonic_time()`. Description ----------- Sends buflen bytes in buf to the destination. If a timeout expired, the number of bytes sent will be returned or -1 if no bytes were sent. Returns ------- -1 on failure and errno is set, or the number of bytes sent. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_sendv.rst000066400000000000000000000016141511661753600244510ustar00rootroot00000000000000:man_page: mongoc_socket_sendv mongoc_socket_sendv() ===================== Synopsis -------- .. code-block:: c ssize_t mongoc_socket_sendv (mongoc_socket_t *sock, mongoc_iovec_t *iov, size_t iovcnt, int64_t expire_at); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``iov``: A mongoc_iovec_t. * ``iovcnt``: A size_t containing the number of elements in iov. * ``expire_at``: A int64_t with absolute timeout in monotonic time. The monotonic clock is in microseconds and can be fetched using :symbol:`bson:bson_get_monotonic_time()`. Description ----------- Sends a vector of buffers to the destination. This uses ``sendmsg()`` when available to perform a gathered write. If IOV_MAX is reached, a fallback will be used. Returns ------- the number of bytes sent on success, or -1 on failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_setsockopt.rst000066400000000000000000000013521511661753600255270ustar00rootroot00000000000000:man_page: mongoc_socket_setsockopt mongoc_socket_setsockopt() ========================== Synopsis -------- .. code-block:: c int mongoc_socket_setsockopt (mongoc_socket_t *sock, int level, int optname, const void *optval, mongoc_socklen_t optlen); Parameters ---------- * ``sock``: A :symbol:`mongoc_socket_t`. * ``level``: A sockopt level. * ``optname``: A sockopt name. * ``optval``: A the value for the sockopt. * ``optlen``: A mongoc_socklen_t that contains the length of optval. Description ----------- This is a helper function for ``setsockopt()``. Returns ------- 0 on success, -1 on failure and errno is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_socket_t.rst000066400000000000000000000015421511661753600235750ustar00rootroot00000000000000:man_page: mongoc_socket_t mongoc_socket_t =============== Portable socket abstraction Synopsis -------- .. code-block:: c #include typedef struct _mongoc_socket_t mongoc_socket_t Synopsis -------- This structure provides a socket abstraction that is friendlier for portability than BSD sockets directly. Inconsistencies between Linux, various BSDs, Solaris, and Windows are handled here. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_socket_accept mongoc_socket_bind mongoc_socket_close mongoc_socket_connect mongoc_socket_destroy mongoc_socket_errno mongoc_socket_getnameinfo mongoc_socket_getsockname mongoc_socket_listen mongoc_socket_new mongoc_socket_recv mongoc_socket_send mongoc_socket_sendv mongoc_socket_setsockopt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_ssl_opt_get_default.rst000066400000000000000000000005151511661753600260070ustar00rootroot00000000000000:man_page: mongoc_ssl_opt_get_default mongoc_ssl_opt_get_default() ============================ Synopsis -------- .. code-block:: c const mongoc_ssl_opt_t * mongoc_ssl_opt_get_default (void); .. note:: |ssl:naming| Returns ------- Returns the default TLS options for the process. This should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_ssl_opt_t.rst000066400000000000000000000024451511661753600237730ustar00rootroot00000000000000:man_page: mongoc_ssl_opt_t mongoc_ssl_opt_t ================ Synopsis -------- .. code-block:: c typedef struct { const char *pem_file; const char *pem_pwd; const char *ca_file; const char *ca_dir; const char *crl_file; bool weak_cert_validation; bool allow_invalid_hostname; void *internal; void *padding[6]; } mongoc_ssl_opt_t; .. note:: |ssl:naming| Description ----------- This structure is used to set the TLS options for a :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t`. Beginning in version 1.2.0, once a pool or client has any TLS options set, all connections use TLS, even if ``ssl=true`` is omitted from the MongoDB URI. Before, TLS options were ignored unless ``tls=true`` was included in the URI. As of 1.4.0, the :symbol:`mongoc_client_pool_set_ssl_opts` and :symbol:`mongoc_client_set_ssl_opts` will not only shallow copy the struct, but will also copy the ``const char*``. It is therefore no longer needed to make sure the values remain valid after setting them. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_ssl_opt_get_default .. seealso:: | `Configuring TLS `_ | :doc:`mongoc_client_set_ssl_opts` | :doc:`mongoc_client_pool_set_ssl_opts` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_buffered_new.rst000066400000000000000000000017751511661753600260000ustar00rootroot00000000000000:man_page: mongoc_stream_buffered_new mongoc_stream_buffered_new() ============================ Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_buffered_new (mongoc_stream_t *base_stream, size_t buffer_size); Parameters ---------- * ``base_stream``: A :symbol:`mongoc_stream_t` to buffer. * ``buffer_size``: A size_t containing the desired buffer size. This function shall create a new :symbol:`mongoc_stream_t` that buffers bytes to and from the underlying ``base_stream``. ``buffer_size`` will be used as the initial buffer size. It may grow past this size. .. warning:: The internal buffer does not reduce in size once grown. Receiving a large message may result in a large allocation that persists until the returned :symbol:`mongoc_stream_t` is freed with :symbol:`mongoc_stream_destroy()`. Returns ------- A newly allocated :symbol:`mongoc_stream_buffered_t` on success, otherwise ``NULL``. This should be freed with :symbol:`mongoc_stream_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_buffered_t.rst000066400000000000000000000007701511661753600254440ustar00rootroot00000000000000:man_page: mongoc_stream_buffered_t mongoc_stream_buffered_t ======================== Synopsis -------- .. code-block:: c typedef struct _mongoc_stream_buffered_t mongoc_stream_buffered_t; Description ----------- ``mongoc_stream_buffered_t`` should be considered a subclass of :symbol:`mongoc_stream_t`. It performs buffering on an underlying stream. .. seealso:: | :doc:`mongoc_stream_buffered_new() ` | :doc:`mongoc_stream_destroy() ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_close.rst000066400000000000000000000007111511661753600244370ustar00rootroot00000000000000:man_page: mongoc_stream_close mongoc_stream_close() ===================== Synopsis -------- .. code-block:: c int mongoc_stream_close (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall close underlying file-descriptors of ``stream``. Returns ------- ``0`` on success, otherwise ``-1`` and ``errno`` is set. .. seealso:: | :doc:`mongoc_stream_destroy() ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_cork.rst000066400000000000000000000011531511661753600242710ustar00rootroot00000000000000:man_page: mongoc_stream_cork mongoc_stream_cork() ==================== Synopsis -------- .. code-block:: c int mongoc_stream_cork (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall prevent the writing of bytes to the underlying socket. .. note:: Not all streams implement this function. Buffering generally works better. Returns ------- ``0`` on success, ``-1`` on failure and ``errno`` is set. .. seealso:: | :doc:`mongoc_stream_buffered_new() `. | :doc:`mongoc_stream_uncork() `. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_destroy.rst000066400000000000000000000007201511661753600250230ustar00rootroot00000000000000:man_page: mongoc_stream_destroy mongoc_stream_destroy() ======================= Synopsis -------- .. code-block:: c void mongoc_stream_destroy (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall release all resources associated with a :symbol:`mongoc_stream_t`, including freeing the structure. It is invalid to use ``stream`` after calling this function. Does nothing if ``stream`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_file_get_fd.rst000066400000000000000000000011631511661753600255630ustar00rootroot00000000000000:man_page: mongoc_stream_file_get_fd mongoc_stream_file_get_fd() =========================== Synopsis -------- .. code-block:: c int mongoc_stream_file_get_fd (mongoc_stream_file_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_file_t`. This function shall return the underlying file-descriptor of a :symbol:`mongoc_stream_file_t`. .. warning:: Performing operations on the underlying file-descriptor may not be safe if used in conjunction with buffering. Avoid reading or writing from this file-descriptor. Returns ------- A file-descriptor that should not be modified by the caller. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_file_new.rst000066400000000000000000000010351511661753600251220ustar00rootroot00000000000000:man_page: mongoc_stream_file_new mongoc_stream_file_new() ======================== Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_file_new (int fd); Parameters ---------- * ``fd``: A UNIX style file-descriptor. Creates a new :symbol:`mongoc_stream_file_t` using the file-descriptor provided. Returns ------- ``NULL`` upon failure, otherwise a newly allocated :symbol:`mongoc_stream_file_t` that should be freed with :symbol:`mongoc_stream_destroy()` when no longer in use. ``errno`` is set upon failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_file_new_for_path.rst000066400000000000000000000015371511661753600270130ustar00rootroot00000000000000:man_page: mongoc_stream_file_new_for_path mongoc_stream_file_new_for_path() ================================= Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_file_new_for_path (const char *path, int flags, int mode); Parameters ---------- * ``path``: The path of the target file. * ``flags``: Flags to be passed to ``open()``. * ``mode``: An optional mode to be passed to ``open()`` when creating a file. This function shall create a new :symbol:`mongoc_stream_file_t` after opening the underlying file with ``open()`` or the platform equivalent. Returns ------- ``NULL`` on failure, otherwise a newly allocated :symbol:`mongoc_stream_file_t` that should be freed with :symbol:`mongoc_stream_destroy()` when no longer in use. ``errno`` is set upon failure. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_file_t.rst000066400000000000000000000007411511661753600245770ustar00rootroot00000000000000:man_page: mongoc_stream_file_t mongoc_stream_file_t ==================== Synopsis -------- .. code-block:: c typedef struct _mongoc_stream_file_t mongoc_stream_file_t ``mongoc_stream_file_t`` is a :symbol:`mongoc_stream_t` subclass for working with standard UNIX style file-descriptors. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_stream_file_get_fd mongoc_stream_file_new mongoc_stream_file_new_for_path mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_flush.rst000066400000000000000000000010751511661753600244570ustar00rootroot00000000000000:man_page: mongoc_stream_flush mongoc_stream_flush() ===================== Synopsis -------- .. code-block:: c int mongoc_stream_flush (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall flush any buffered bytes in the underlying stream to the physical transport. It mimics the API and semantics of ``fflush()``, forcing a write of user space buffered data. Not all stream implementations may implement this feature. Returns ------- 0 is returned on success, otherwise ``-1`` and ``errno`` is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_get_base_stream.rst000066400000000000000000000010301511661753600264510ustar00rootroot00000000000000:man_page: mongoc_stream_get_base_stream mongoc_stream_get_base_stream() =============================== Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_get_base_stream (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall fetch the underlying stream for streams that wrap a base stream. Such implementations include :symbol:`mongoc_stream_buffered_t` and :symbol:`mongoc_stream_tls_t`. Returns ------- A :symbol:`mongoc_stream_t` or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_gridfs_new.rst000066400000000000000000000016611511661753600254660ustar00rootroot00000000000000:man_page: mongoc_stream_gridfs_new mongoc_stream_gridfs_new() ========================== Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_gridfs_new (mongoc_gridfs_file_t *file); Parameters ---------- * ``file``: A :symbol:`mongoc_gridfs_file_t`. This function shall create a new :symbol:`mongoc_stream_t` to read from and write to a GridFS file. GridFS files are created with :symbol:`mongoc_gridfs_create_file` or :symbol:`mongoc_gridfs_create_file_from_stream`. This function does not transfer ownership of ``file``. Therefore, ``file`` must remain valid for the lifetime of this stream. Returns ------- A newly allocated :symbol:`mongoc_stream_t` if successful, otherwise ``NULL``. Note, the returned stream ignores read and write timeouts passed to :symbol:`mongoc_stream_readv`, :symbol:`mongoc_stream_writev`, and so on. It uses the "socketTimeoutMS" and "connectTimeoutMS" values from the MongoDB URI. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_read.rst000066400000000000000000000030171511661753600242470ustar00rootroot00000000000000:man_page: mongoc_stream_read mongoc_stream_read() ==================== Synopsis -------- .. code-block:: c ssize_t mongoc_stream_read (mongoc_stream_t *stream, void *buf, size_t count, size_t min_bytes, int32_t timeout_msec); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. * ``buf``: The buffer to read into. * ``count``: The number of bytes to read. * ``min_bytes``: The minimum number of bytes to read, or else indicate failure. * ``timeout_msec``: The number of milliseconds to wait before failure, a timeout of 0 will not block. If negative, use the default timeout. The :symbol:`mongoc_stream_read()` function shall perform a read from a :symbol:`mongoc_stream_t`. It's modeled on the API and semantics of ``read()``, though the parameters map only loosely. .. warning:: The "default timeout" indicated by a negative value is both unspecified and unrelated to the documented default values for ``*TimeoutMS`` URI options. To specify a default timeout value for a ``*TimeoutMS`` URI option, use the ``MONGOC_DEFAULT_*`` constants defined in ``mongoc-client.h``. Returns ------- The :symbol:`mongoc_stream_read` function returns the number of bytes read on success. It returns ``>= 0`` and ``< min_bytes`` when end-of-file is encountered and ``-1`` on failure. ``errno`` is set upon failure. .. seealso:: | :symbol:`mongoc_stream_readv()` | :symbol:`mongoc_stream_write()` | :symbol:`mongoc_stream_writev()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_readv.rst000066400000000000000000000025241511661753600244370ustar00rootroot00000000000000:man_page: mongoc_stream_readv mongoc_stream_readv() ===================== Synopsis -------- .. code-block:: c ssize_t mongoc_stream_readv (mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. * ``iov``: A vector of :symbol:`mongoc_iovec_t`. * ``iovcnt``: The number of items in ``iov``. * ``min_bytes``: The minimum number of bytes to read or failure will be indicated. * ``timeout_msec``: A timeout in milliseconds, or 0 to indicate non-blocking. A negative value with use the default timeout. This function is identical to :symbol:`mongoc_stream_read()` except that it takes a :symbol:`mongoc_iovec_t` to perform gathered I/O. .. warning:: The "default timeout" indicated by a negative value is both unspecified and unrelated to the documented default values for ``*TimeoutMS`` URI options. To specify a default timeout value for a ``*TimeoutMS`` URI option, use the ``MONGOC_DEFAULT_*`` constants defined in ``mongoc-client.h``. Returns ------- ``>= 0`` on success, ``-1`` on failure and ``errno`` is set. .. seealso:: | :symbol:`mongoc_stream_read()` | :symbol:`mongoc_stream_write()` | :symbol:`mongoc_stream_writev()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_setsockopt.rst000066400000000000000000000014471511661753600255370ustar00rootroot00000000000000:man_page: mongoc_stream_setsockopt mongoc_stream_setsockopt() ========================== Synopsis -------- .. code-block:: c int mongoc_stream_setsockopt (mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. * ``level``: The level to pass to ``setsockopt()``. * ``optname``: The optname to pass to ``setsockopt()``. * ``optval``: The optval to pass to ``setsockopt()``. * ``optlen``: The optlen to pass to ``setsockopt()``. This function is a wrapper around ``setsockopt()`` for streams that wrap sockets. Returns ------- ``0`` on success, otherwise ``-1`` and ``errno`` is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_should_retry.rst000066400000000000000000000006551511661753600260640ustar00rootroot00000000000000:man_page: mongoc_stream_should_retry mongoc_stream_should_retry() ============================ Synopsis -------- .. code-block:: c bool mongoc_stream_should_retry (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. Returns ------- True if the stream is open and has encountered a retryable network error such as EAGAIN or if a TLS exchange is in progress and needs more data. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_socket_get_socket.rst000066400000000000000000000007141511661753600270340ustar00rootroot00000000000000:man_page: mongoc_stream_socket_get_socket mongoc_stream_socket_get_socket() ================================= Synopsis -------- .. code-block:: c mongoc_socket_t * mongoc_stream_socket_get_socket (mongoc_stream_socket_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_socket_t`. Retrieves the underlying :symbol:`mongoc_socket_t` for a :symbol:`mongoc_stream_socket_t`. Returns ------- A :symbol:`mongoc_stream_socket_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_socket_new.rst000066400000000000000000000011461511661753600254760ustar00rootroot00000000000000:man_page: mongoc_stream_socket_new mongoc_stream_socket_new() ========================== Synopsis -------- .. code-block:: c mongoc_stream_t * mongoc_stream_socket_new (mongoc_socket_t *socket); Parameters ---------- * ``socket``: A :symbol:`mongoc_socket_t`. Creates a new :symbol:`mongoc_stream_socket_t` using the :symbol:`mongoc_socket_t` provided. .. warning:: This function transfers ownership of ``socket`` to the newly allocated stream. Returns ------- A newly allocated :symbol:`mongoc_stream_socket_t` that should be freed with :symbol:`mongoc_stream_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_socket_t.rst000066400000000000000000000007171511661753600251530ustar00rootroot00000000000000:man_page: mongoc_stream_socket_t mongoc_stream_socket_t ====================== Synopsis -------- .. code-block:: c typedef struct _mongoc_stream_socket_t mongoc_stream_socket_t ``mongoc_stream_socket_t`` should be considered a subclass of :symbol:`mongoc_stream_t` that works upon socket streams. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_stream_socket_get_socket mongoc_stream_socket_new mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_t.rst000066400000000000000000000023771511661753600236070ustar00rootroot00000000000000:man_page: mongoc_stream_t mongoc_stream_t =============== Synopsis -------- .. code-block:: c typedef struct _mongoc_stream_t mongoc_stream_t ``mongoc_stream_t`` provides a generic streaming IO abstraction based on a struct of pointers interface. The idea is to allow wrappers, perhaps other language drivers, to easily shim their IO system on top of ``mongoc_stream_t``. The API for the stream abstraction is currently private and non-extensible. Stream Types ------------ There are a number of built in stream types that come with mongoc. The default configuration is a buffered unix stream. If TLS is in use, that in turn is wrapped in a tls stream. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_stream_buffered_new mongoc_stream_close mongoc_stream_cork mongoc_stream_destroy mongoc_stream_flush mongoc_stream_get_base_stream mongoc_stream_read mongoc_stream_readv mongoc_stream_setsockopt mongoc_stream_should_retry mongoc_stream_timed_out mongoc_stream_uncork mongoc_stream_write mongoc_stream_writev .. seealso:: | :doc:`mongoc_stream_buffered_t` | :doc:`mongoc_stream_file_t` | :doc:`mongoc_stream_socket_t` | :doc:`mongoc_stream_tls_t` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_timed_out.rst000066400000000000000000000005171511661753600253270ustar00rootroot00000000000000:man_page: mongoc_stream_timed_out mongoc_stream_timed_out() ========================= Synopsis -------- .. code-block:: c bool mongoc_stream_timed_out (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. Returns ------- True if there has been a network timeout error on this stream. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_tls_t.rst000066400000000000000000000004101511661753600244530ustar00rootroot00000000000000:man_page: mongoc_stream_tls_t mongoc_stream_tls_t =================== Synopsis -------- .. code-block:: c typedef struct _mongoc_stream_tls_t mongoc_stream_tls_t ``mongoc_stream_tls_t`` is a :symbol:`mongoc_stream_t` subclass for working with TLS streams. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_uncork.rst000066400000000000000000000012011511661753600246260ustar00rootroot00000000000000:man_page: mongoc_stream_uncork mongoc_stream_uncork() ====================== Synopsis -------- .. code-block:: c int mongoc_stream_uncork (mongoc_stream_t *stream); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. This function shall allow a previously corked socket to pass bytes to the underlying socket. .. note:: Not all streams implement this function. Buffering generally works better. Returns ------- ``0`` on success, ``-1`` on failure and ``errno`` is set. .. seealso:: | :doc:`mongoc_stream_buffered_new() `. | :doc:`mongoc_stream_cork() `. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_write.rst000066400000000000000000000025241511661753600244700ustar00rootroot00000000000000:man_page: mongoc_stream_write mongoc_stream_write() ===================== Synopsis -------- .. code-block:: c ssize_t mongoc_stream_write (mongoc_stream_t *stream, void *buf, size_t count, int32_t timeout_msec); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. * ``buf``: The buffer to write. * ``count``: The number of bytes to write. * ``timeout_msec``: The number of milliseconds to wait before failure, a timeout of 0 will not block. If negative, use the default timeout. The :symbol:`mongoc_stream_write()` function shall perform a write to a :symbol:`mongoc_stream_t`. It's modeled on the API and semantics of ``write()``, though the parameters map only loosely. .. warning:: The "default timeout" indicated by a negative value is both unspecified and unrelated to the documented default values for ``*TimeoutMS`` URI options. To specify a default timeout value for a ``*TimeoutMS`` URI option, use the ``MONGOC_DEFAULT_*`` constants defined in ``mongoc-client.h``. Returns ------- The :symbol:`mongoc_stream_write` function returns the number of bytes written on success. It returns ``-1`` and sets ``errno`` upon failure. .. seealso:: | :symbol:`mongoc_stream_read()` | :symbol:`mongoc_stream_readv()` | :symbol:`mongoc_stream_writev()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_stream_writev.rst000066400000000000000000000023141511661753600246530ustar00rootroot00000000000000:man_page: mongoc_stream_writev mongoc_stream_writev() ====================== Synopsis -------- .. code-block:: c ssize_t mongoc_stream_writev (mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec); Parameters ---------- * ``stream``: A :symbol:`mongoc_stream_t`. * ``iov``: A vector of :symbol:`mongoc_iovec_t`. * ``iovcnt``: The number of items in ``iov``. * ``timeout_msec``: The number of milliseconds to block before indicating failure, or 0 for non-blocking. Negative values indicate the default timeout. The ``mongoc_stream_writev()`` function shall perform a write to a :symbol:`mongoc_stream_t`. It's modeled on the API and semantics of ``writev()``, though the parameters map only loosely. .. warning:: The "default timeout" indicated by a negative value is both unspecified and unrelated to the documented default values for ``*TimeoutMS`` URI options. To specify a default timeout value for a ``*TimeoutMS`` URI option, use the ``MONGOC_DEFAULT_*`` constants defined in ``mongoc-client.h``. Returns ------- The number of bytes written on success, or ``-1`` upon failure and ``errno`` is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_component_t.rst000066400000000000000000000016051511661753600274340ustar00rootroot00000000000000:man_page: mongoc_structured_log_component_t mongoc_structured_log_component_t ================================= Synopsis -------- .. code-block:: c typedef enum { MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND = 0, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY = 1, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION = 2, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION = 3, } mongoc_structured_log_component_t; ``mongoc_structured_log_component_t`` enumerates the structured logging components. Applications should never rely on having an exhaustive list of all log components. Instead, use :symbol:`mongoc_structured_log_opts_set_max_level_for_all_components` to set a default level if needed. Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_get_component_name mongoc_structured_log_get_named_component .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_entry_get_component.rst000066400000000000000000000010261511661753600311660ustar00rootroot00000000000000:man_page: mongoc_structured_log_entry_get_component mongoc_structured_log_entry_get_component() =========================================== Synopsis -------- .. code-block:: c mongoc_structured_log_component_t mongoc_structured_log_entry_get_component (const mongoc_structured_log_entry_t *entry); Parameters ---------- * ``entry``: A :symbol:`mongoc_structured_log_entry_t` pointer. Returns ------- The :symbol:`mongoc_structured_log_component_t` associated with this log entry. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_entry_get_level.rst000066400000000000000000000007761511661753600303060ustar00rootroot00000000000000:man_page: mongoc_structured_log_entry_get_level mongoc_structured_log_entry_get_level() ======================================= Synopsis -------- .. code-block:: c mongoc_structured_log_level_t mongoc_structured_log_entry_get_level (const mongoc_structured_log_entry_t *entry); Parameters ---------- * ``entry``: A :symbol:`mongoc_structured_log_entry_t` pointer. Returns ------- The :symbol:`mongoc_structured_log_level_t` associated with this log entry. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_entry_get_message_string.rst000066400000000000000000000015121511661753600321760ustar00rootroot00000000000000:man_page: mongoc_structured_log_entry_get_message_string mongoc_structured_log_entry_get_message_string() ================================================ Synopsis -------- .. code-block:: c const char * mongoc_structured_log_entry_get_message_string (const mongoc_structured_log_entry_t *entry); Parameters ---------- * ``entry``: A :symbol:`mongoc_structured_log_entry_t` pointer. Returns ------- A string, guaranteed to be valid only during the lifetime of the structured log handler. It should not be freed or modified. Identical to the value of the ``message`` key in the document returned by :symbol:`mongoc_structured_log_entry_message_as_bson`. This is not a complete string representation of the structured log, but rather a standardized identifier for a particular log event. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_entry_message_as_bson.rst000066400000000000000000000014241511661753600314570ustar00rootroot00000000000000:man_page: mongoc_structured_log_entry_message_as_bson mongoc_structured_log_entry_message_as_bson() ============================================= Synopsis -------- .. code-block:: c bson_t * mongoc_structured_log_entry_message_as_bson (const mongoc_structured_log_entry_t *entry); Make a new copy, as a :symbol:`bson_t`, of the log entry's standardized BSON representation. When possible, a log handler should avoid serializing log messages that will be discarded. Each call allocates an independent copy of the message that must be freed. Parameters ---------- * ``entry``: A :symbol:`mongoc_structured_log_entry_t` pointer. Returns ------- A new allocated :symbol:`bson_t` that must be freed with a call to :symbol:`bson_destroy`. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_entry_t.rst000066400000000000000000000014571511661753600266000ustar00rootroot00000000000000:man_page: mongoc_structured_log_entry_t mongoc_structured_log_entry_t ============================= Synopsis -------- .. code-block:: c typedef struct mongoc_structured_log_entry_t mongoc_structured_log_entry_t; ``mongoc_structured_log_entry_t`` is an opaque structure which represents the temporary state of an in-progress log entry. It can only be used during a :symbol:`mongoc_structured_log_func_t`, it is not valid after the log handler returns. Use the functions below to query individual aspects of the log entry. Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_entry_get_component mongoc_structured_log_entry_get_level mongoc_structured_log_entry_get_message_string mongoc_structured_log_entry_message_as_bson .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_func_t.rst000066400000000000000000000014701511661753600263650ustar00rootroot00000000000000:man_page: mongoc_structured_log_func_t mongoc_structured_log_func_t ============================ Synopsis -------- .. code-block:: c typedef void (*mongoc_structured_log_func_t) (const mongoc_structured_log_entry_t *entry, void *user_data); Callback function for :symbol:`mongoc_structured_log_opts_set_handler`. Structured log handlers must be thread-safe if they will be used with :symbol:`mongoc_client_pool_t`. Handlers must avoid unbounded recursion, preferably by avoiding the use of any ``libmongoc`` client or pool which uses the same handler. Parameters ---------- * ``entry``: A :symbol:`mongoc_structured_log_entry_t` pointer, only valid during the handler invocation. * ``user_data``: Optional user data from :symbol:`mongoc_structured_log_opts_set_handler`. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_get_component_name.rst000066400000000000000000000011151511661753600307440ustar00rootroot00000000000000:man_page: mongoc_structured_log_get_component_name mongoc_structured_log_get_component_name() ========================================== Synopsis -------- .. code-block:: c const char * mongoc_structured_log_get_component_name (mongoc_structured_log_component_t component); Parameters ---------- * ``component``: Log component as a :symbol:`mongoc_structured_log_component_t`. Returns ------- If the component is known, returns a pointer to a constant string that should not be freed. If the component has no known name, returns NULL. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_get_level_name.rst000066400000000000000000000010411511661753600300470ustar00rootroot00000000000000:man_page: mongoc_structured_log_get_level_name mongoc_structured_log_get_level_name() ====================================== Synopsis -------- .. code-block:: c const char * mongoc_structured_log_get_level_name (mongoc_structured_log_level_t level); Parameters ---------- * ``level``: Log level as a :symbol:`mongoc_structured_log_level_t`. Returns ------- If the level is known, returns a pointer to a constant string that should not be freed. If the level has no known name, returns NULL. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_get_named_component.rst000066400000000000000000000013561511661753600311170ustar00rootroot00000000000000:man_page: mongoc_structured_log_get_named_component mongoc_structured_log_get_named_component() =========================================== Synopsis -------- .. code-block:: c bool mongoc_structured_log_get_named_component (const char *name, mongoc_structured_log_component_t *out); Look up a component by name. Case insensitive. Parameters ---------- * ``name``: A name to look up as a log component. * ``out``: On success, the corresponding :symbol:`mongoc_structured_log_component_t` is written here. Returns ------- If the component name is known, returns ``true`` and writes the component enum to ``*out``. If the component name is not known, returns ``false`` and does not write ``*out``. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_get_named_level.rst000066400000000000000000000013061511661753600302170ustar00rootroot00000000000000:man_page: mongoc_structured_log_get_named_level mongoc_structured_log_get_named_level() ======================================= Synopsis -------- .. code-block:: c bool mongoc_structured_log_get_named_level (const char *name, mongoc_structured_log_level_t *out); Look up a log level by name. Case insensitive. Parameters ---------- * ``name``: A name to look up as a log level. * ``out``: On success, the corresponding :symbol:`mongoc_structured_log_level_t` is written here. Returns ------- If the level name is known, returns ``true`` and writes the level enum to ``*out``. If the level name is not known, returns ``false`` and does not write ``*out``. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_level_t.rst000066400000000000000000000015701511661753600265420ustar00rootroot00000000000000:man_page: mongoc_structured_log_level_t mongoc_structured_log_level_t ============================= Synopsis -------- .. code-block:: c typedef enum { MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY = 0, MONGOC_STRUCTURED_LOG_LEVEL_ALERT = 1, MONGOC_STRUCTURED_LOG_LEVEL_CRITICAL = 2, MONGOC_STRUCTURED_LOG_LEVEL_ERROR = 3, MONGOC_STRUCTURED_LOG_LEVEL_WARNING = 4, MONGOC_STRUCTURED_LOG_LEVEL_NOTICE = 5, MONGOC_STRUCTURED_LOG_LEVEL_INFO = 6, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG = 7, MONGOC_STRUCTURED_LOG_LEVEL_TRACE = 8, } mongoc_structured_log_level_t; ``mongoc_structured_log_level_t`` enumerates the available log levels for use with structured logging. Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_get_level_name mongoc_structured_log_get_named_level .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_destroy.rst000066400000000000000000000010471511661753600276450ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_destroy mongoc_structured_log_opts_destroy() ==================================== Synopsis -------- .. code-block:: c void mongoc_structured_log_opts_destroy (mongoc_structured_log_opts_t *opts); Parameters ---------- * ``opts``: Pointer to a :symbol:`mongoc_structured_log_opts_t` allocated with :symbol:`mongoc_structured_log_opts_new`, or NULL. Description ----------- This function releases all resources associated with a :symbol:`mongoc_structured_log_opts_t`. Does nothing if ``opts`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_get_max_document_length.rst000066400000000000000000000010701511661753600330330ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_get_max_document_length mongoc_structured_log_opts_get_max_document_length() ==================================================== Synopsis -------- .. code-block:: c size_t mongoc_structured_log_opts_get_max_document_length (const mongoc_structured_log_opts_t *opts); Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. Returns ------- Returns the current maximum document length set in ``opts``, as a ``size_t``. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_get_max_level_for_component.rst000066400000000000000000000021671511661753600337230ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_get_max_level_for_component mongoc_structured_log_opts_get_max_level_for_component() ======================================================== Synopsis -------- .. code-block:: c mongoc_structured_log_level_t mongoc_structured_log_opts_get_max_level_for_component (const mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component); Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. * ``component``: Log component as a :symbol:`mongoc_structured_log_component_t`. Returns ------- Returns the configured maximum log level for a specific component, as a :symbol:`mongoc_structured_log_level_t`. This may be the last value set with :symbol:`mongoc_structured_log_opts_set_max_level_for_component` or :symbol:`mongoc_structured_log_opts_set_max_level_for_all_components`, or it may be the default obtained from environment variables. If an invalid or unknown component enum is given, returns the lowest log level. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_new.rst000066400000000000000000000070431511661753600267470ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_new mongoc_structured_log_opts_new() ================================ Synopsis -------- .. code-block:: c mongoc_structured_log_opts_t * mongoc_structured_log_opts_new (void); Creates a new :symbol:`mongoc_structured_log_opts_t`, filled with defaults captured from the current environment. Sets a default log handler which would write a text representation of each log message to ``stderr``, ``stdout``, or another file configurable using ``MONGODB_LOG_PATH``. This setting has no effect if the default handler is replaced using :symbol:`mongoc_structured_log_opts_set_handler`. Environment variable errors are non-fatal, and result in one-time warnings delivered as an unstructured log. Per-component maximum levels are initialized equivalently to: .. code-block:: c mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_WARNING); mongoc_structured_log_opts_set_max_levels_from_env(opts); Environment Variables --------------------- This is a full list of the captured environment variables. * ``MONGODB_LOG_MAX_DOCUMENT_LENGTH``: Maximum length for JSON-serialized documents that appear within a log message. It may be a number, in bytes, or ``unlimited`` (case insensitive) to choose an implementation-specific value near the maximum representable length. By default, the limit is 1000 bytes. This limit affects interior documents like commands and replies, not the total length of a structured log message. * ``MONGODB_LOG_PATH``: A file path or one of the special strings ``stderr`` or ``stdout`` (case insensitive) specifying the destination for structured logs seen by the default handler. By default, it writes to ``stderr``. This path will be captured during ``mongoc_structured_log_opts_new()``, but it will not immediately be opened. If the file can't be opened, a warning is then written to the unstructured log and the handler writes structured logs to ``stderr`` instead. .. warning:: When a file path is given for ``MONGODB_LOG_PATH``, each log instance (one stand-alone client or pool) will separately open this file for append. The results are operating system specific. On UNIX-like platforms each instance's output will be interleaved, in most cases without splitting individual log messages. Notably on Windows the file will be opened in exclusive mode by the first instance and subsequent instances will fail, falling back on the default of ``stderr``. Applications that use multiple processes or multiple client pools will likely want to supply a log handler that annotates each message with information about its originating log instance. * ``MONGODB_LOG_COMMAND``: A log level name to set as the maximum for ``MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND``. * ``MONGODB_LOG_TOPOLOGY``: A log level name to set as the maximum for ``MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY``. * ``MONGODB_LOG_SERVER_SELECTION``: A log level name to set as the maximum for ``MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION``. * ``MONGODB_LOG_CONNECTION``: A log level name to set as the maximum for ``MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION``. * ``MONGODB_LOG_ALL``: A log level name applied to all components not otherwise specified. Note that log level names are always case insensitive. This is a full list of recognized names, including allowed aliases: * ``emergency``, ``off`` * ``alert`` * ``critical`` * ``error`` * ``warning``, ``warn`` * ``notice`` * ``informational``, ``info`` * ``debug`` * ``trace`` Returns ------- A newly allocated :symbol:`mongoc_structured_log_opts_t`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_set_handler.rst000066400000000000000000000027721511661753600304520ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_set_handler mongoc_structured_log_opts_set_handler() ======================================== Synopsis -------- .. code-block:: c void mongoc_structured_log_opts_set_handler (mongoc_structured_log_opts_t *opts, mongoc_structured_log_func_t log_func, void *user_data); Sets the function to be called to handle structured log messages, as a :symbol:`mongoc_structured_log_func_t`. The callback is given a :symbol:`mongoc_structured_log_entry_t` as a handle for obtaining additional information about the log message. This entry pointer is only valid during a callback, because it's a low cost reference to temporary data. Structured log handlers must be thread-safe if they will be used with :symbol:`mongoc_client_pool_t`. Handlers must avoid unbounded recursion, preferably by avoiding the use of any ``libmongoc`` client or pool which uses the same handler. This function always replaces the default log handler from :symbol:`mongoc_structured_log_opts_new`, if it was still set. If the ``log_func`` is set to NULL, structured logging will be disabled. Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. * ``log_func``: The handler to install, a :symbol:`mongoc_structured_log_func_t`, or NULL to disable structured logging. * ``user_data``: Optional user data, passed on to the handler. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_set_max_document_length.rst000066400000000000000000000026201511661753600330510ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_set_max_document_length mongoc_structured_log_opts_set_max_document_length() ==================================================== Synopsis -------- .. code-block:: c bool mongoc_structured_log_opts_set_max_document_length (mongoc_structured_log_opts_t *opts, size_t max_document_length); Sets a maximum length for BSON documents that appear serialized in JSON form as part of a structured log message. Serialized JSON will be truncated at this limit, interpreted as a count of UTF-8 encoded bytes. Truncation will be indicated with a ``...`` suffix, the length of which is not included in the max document length. If truncation at the exact indicated length would split a valid UTF-8 sequence, we instead truncate the document earlier at the nearest boundary between code points. Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. * ``max_document_length``: Maximum length for each embedded JSON document, in bytes, not including an ellipsis (``...``) added to indicate truncation. Values near or above ``INT_MAX`` will be rejected. Returns ------- Returns ``true`` on success, or ``false`` if the supplied maximum length is too large. .. seealso:: | :doc:`structured_log` | :symbol:`mongoc_structured_log_opts_set_max_document_length_from_env` mongoc_structured_log_opts_set_max_document_length_from_env.rst000066400000000000000000000033361511661753600346720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_structured_log_opts_set_max_document_length_from_env mongoc_structured_log_opts_set_max_document_length_from_env() ============================================================= Synopsis -------- .. code-block:: c bool mongoc_structured_log_opts_set_max_document_length_from_env (mongoc_structured_log_opts_t *opts); Sets a maximum document length from the ``MONGODB_LOG_MAX_DOCUMENT_LENGTH`` environment variable, if a valid setting is found. See :symbol:`mongoc_structured_log_opts_new` for a description of the supported environment variable formats. Parse errors may cause a warning message, delivered via unstructured logging. This happens automatically when :symbol:`mongoc_structured_log_opts_new` establishes defaults. Any subsequent programmatic modifications to the :symbol:`mongoc_structured_log_opts_t` will override the environment variable settings. For applications that desire the opposite behavior, where environment variables may override programmatic settings, they may call ``mongoc_structured_log_opts_set_max_document_length_from_env()`` after calling :symbol:`mongoc_structured_log_opts_set_max_document_length`. This will process the environment a second time, allowing it to override customized defaults. Returns ------- Returns ``true`` on success: either a valid environment setting was found, or the value is unset and ``opts`` will not be modified. If warnings are encountered in the environment, returns ``false`` and may log additional information to the unstructured logging facility. Note that, by design, these errors are by default non-fatal. When :symbol:`mongoc_structured_log_opts_new` internally calls this function, it ignores the return value. .. seealso:: | :doc:`structured_log` mongoc_structured_log_opts_set_max_level_for_all_components.rst000066400000000000000000000020131511661753600346610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc:man_page: mongoc_structured_log_opts_set_max_level_for_all_components mongoc_structured_log_opts_set_max_level_for_all_components() ============================================================= Synopsis -------- .. code-block:: c bool mongoc_structured_log_opts_set_max_level_for_all_components (mongoc_structured_log_opts_t *opts, mongoc_structured_log_level_t level); Sets all per-component maximum log levels to the same value. Only log messages at or below this severity level will be passed to :symbol:`mongoc_structured_log_func_t`. Effective even for logging components not known at compile-time. Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. * ``level``: The max log level for all components, as a :symbol:`mongoc_structured_log_level_t`. Returns ------- Returns ``true`` on success, or ``false`` if the supplied parameters were incorrect. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_set_max_level_for_component.rst000066400000000000000000000024061511661753600337330ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_set_max_level_for_component mongoc_structured_log_opts_set_max_level_for_component() ======================================================== Synopsis -------- .. code-block:: c bool mongoc_structured_log_opts_set_max_level_for_component (mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component, mongoc_structured_log_level_t level); Sets the maximum log level per-component. Only log messages at or below this severity level will be passed to :symbol:`mongoc_structured_log_func_t`. By default, each component's log level may come from environment variables. See :symbol:`mongoc_structured_log_opts_set_max_levels_from_env`. Parameters ---------- * ``opts``: Structured log options, allocated with :symbol:`mongoc_structured_log_opts_new`. * ``component``: The component to set a max log level. for, as a :symbol:`mongoc_structured_log_component_t`. * ``level``: The new max log level for this component, as a :symbol:`mongoc_structured_log_level_t`. Returns ------- Returns ``true`` on success, or ``false`` if the supplied parameters were incorrect. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_set_max_levels_from_env.rst000066400000000000000000000035341511661753600330640ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_set_max_levels_from_env mongoc_structured_log_opts_set_max_levels_from_env() ==================================================== Synopsis -------- .. code-block:: c bool mongoc_structured_log_opts_set_max_levels_from_env (mongoc_structured_log_opts_t *opts); Sets any maximum log levels requested by environment variables: ``MONGODB_LOG_ALL`` for all components, followed by per-component log levels ``MONGODB_LOG_COMMAND``, ``MONGODB_LOG_CONNECTION``, ``MONGODB_LOG_TOPOLOGY``, and ``MONGODB_LOG_SERVER_SELECTION``. Expects the value to be recognizable by :symbol:`mongoc_structured_log_get_named_level`. Parse errors may cause a warning message, delivered via unstructured logging. Component levels with no valid environment variable setting will be left unmodified. This happens automatically when :symbol:`mongoc_structured_log_opts_new` establishes defaults. Any subsequent programmatic modifications to the :symbol:`mongoc_structured_log_opts_t` will override the environment variable settings. For applications that desire the opposite behavior, where environment variables may override programmatic settings, they may call ``mongoc_structured_log_opts_set_max_levels_from_env()`` after calling :symbol:`mongoc_structured_log_opts_set_max_level_for_component` and :symbol:`mongoc_structured_log_opts_set_max_level_for_all_components`. This will process the environment a second time, allowing it to override customized defaults. Returns ------- Returns ``true`` on success. If warnings are encountered in the environment, returns ``false`` and may log additional information to the unstructured logging facility. Note that, by design, these errors are by default non-fatal. When :symbol:`mongoc_structured_log_opts_new` internally calls this function, it ignores the return value. .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_structured_log_opts_t.rst000066400000000000000000000025011511661753600264130ustar00rootroot00000000000000:man_page: mongoc_structured_log_opts_t mongoc_structured_log_opts_t ============================ Synopsis -------- .. code-block:: c typedef struct mongoc_structured_log_opts_t mongoc_structured_log_opts_t; ``mongoc_structured_log_opts_t`` is an opaque type that contains options for the structured logging subsystem: per-component log levels, a maximum logged document length, and a handler function. Create a ``mongoc_structured_log_opts_t`` with :symbol:`mongoc_structured_log_opts_new`, set options and a callback on it, then pass it to :symbol:`mongoc_client_set_structured_log_opts` or :symbol:`mongoc_client_pool_set_structured_log_opts`. Must be destroyed by calling :symbol:`mongoc_structured_log_opts_destroy`. Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_opts_new mongoc_structured_log_opts_destroy mongoc_structured_log_opts_set_handler mongoc_structured_log_opts_set_max_level_for_component mongoc_structured_log_opts_set_max_level_for_all_components mongoc_structured_log_opts_set_max_levels_from_env mongoc_structured_log_opts_get_max_level_for_component mongoc_structured_log_opts_set_max_document_length mongoc_structured_log_opts_set_max_document_length_from_env mongoc_structured_log_opts_get_max_document_length .. seealso:: | :doc:`structured_log` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_destroy.rst000066400000000000000000000007251511661753600300140ustar00rootroot00000000000000:man_page: mongoc_topology_description_destroy mongoc_topology_description_destroy() ===================================== Synopsis -------- .. code-block:: c void mongoc_topology_description_destroy (mongoc_topology_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_topology_description_t`. Description ----------- Frees all resources associated with the topology description. Does nothing if ``description`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_get_servers.rst000066400000000000000000000012371511661753600306520ustar00rootroot00000000000000:man_page: mongoc_topology_description_get_servers mongoc_topology_description_get_servers() ========================================= Synopsis -------- .. code-block:: c mongoc_server_description_t ** mongoc_topology_description_get_servers ( const mongoc_topology_description_t *td, size_t *n); Fetches an array of :symbol:`mongoc_server_description_t` structs for all known servers in the topology. Parameters ---------- * ``td``: A :symbol:`mongoc_topology_description_t`. * ``n``: Receives the length of the descriptions array. Returns ------- A newly allocated array that must be freed with :symbol:`mongoc_server_descriptions_destroy_all`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_has_readable_server.rst000066400000000000000000000020351511661753600322770ustar00rootroot00000000000000:man_page: mongoc_topology_description_has_readable_server mongoc_topology_description_has_readable_server() ================================================= Synopsis -------- .. code-block:: c bool mongoc_topology_description_has_readable_server ( const mongoc_topology_description_t *td, const mongoc_read_prefs_t *prefs); Determines if the topology has a readable server available. Servers are filtered by the given read preferences only if the driver is connected to a replica set, otherwise the read preferences are ignored. This function uses the driver's current knowledge of the state of the MongoDB server or servers it is connected to; it does no I/O and it does not block. Parameters ---------- * ``td``: A :symbol:`mongoc_topology_description_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t` or ``NULL`` for default read preferences. Returns ------- True if there is a known server matching ``prefs``. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_has_writable_server.rst000066400000000000000000000014571511661753600323600ustar00rootroot00000000000000:man_page: mongoc_topology_description_has_writable_server mongoc_topology_description_has_writable_server() ================================================= Synopsis -------- .. code-block:: c bool mongoc_topology_description_has_writable_server ( const mongoc_topology_description_t *td); Determines if the topology has a writable server available, such as a primary, mongos, or standalone. This function uses the driver's current knowledge of the state of the MongoDB server or servers it is connected to; it does no I/O and it does not block. Parameters ---------- * ``td``: A :symbol:`mongoc_topology_description_t`. Returns ------- True if there is a known writable server. .. seealso:: | :doc:`Introduction to Application Performance Monitoring ` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_new_copy.rst000066400000000000000000000012201511661753600301350ustar00rootroot00000000000000:man_page: mongoc_topology_description_new_copy mongoc_topology_description_new_copy() ====================================== Synopsis -------- .. code-block:: c mongoc_topology_description_t * mongoc_topology_description_new_copy ( const mongoc_topology_description_t *description); Parameters ---------- * ``description``: A :symbol:`mongoc_topology_description_t`. Description ----------- Performs a deep copy of ``description``. Returns ------- Returns a newly allocated copy of ``description`` that should be freed with :symbol:`mongoc_topology_description_destroy()` when no longer in use. Returns NULL if ``description`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_t.rst000066400000000000000000000022501511661753600265610ustar00rootroot00000000000000:man_page: mongoc_topology_description_t mongoc_topology_description_t ============================= Status of MongoDB Servers Synopsis -------- .. code-block:: c typedef struct _mongoc_topology_description_t mongoc_topology_description_t; ``mongoc_topology_description_t`` is an opaque type representing the driver's knowledge of the MongoDB server or servers it is connected to. Its API conforms to the `SDAM Monitoring Specification `_. Applications receive a temporary reference to a ``mongoc_topology_description_t`` as a parameter to an SDAM Monitoring callback that must not be destroyed. See :doc:`Introduction to Application Performance Monitoring `. .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_topology_description_destroy mongoc_topology_description_get_servers mongoc_topology_description_has_readable_server mongoc_topology_description_has_writable_server mongoc_topology_description_new_copy mongoc_topology_description_type mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_topology_description_type.rst000066400000000000000000000010511511661753600272750ustar00rootroot00000000000000:man_page: mongoc_topology_description_type mongoc_topology_description_type() ================================== Synopsis -------- .. code-block:: c const char * mongoc_topology_description_type (const mongoc_topology_description_t *td); Parameters ---------- * ``td``: A :symbol:`mongoc_topology_description_t`. Description ----------- This function returns a string, one of the topology types defined in the Server Discovery And Monitoring Spec: * Unknown * Single * Sharded * ReplicaSetNoPrimary * ReplicaSetWithPrimary * LoadBalanced mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opt_t.rst000066400000000000000000000033051511661753600255130ustar00rootroot00000000000000:man_page: mongoc_transaction_opt_t mongoc_transaction_opt_t ======================== .. code-block:: c #include typedef struct _mongoc_transaction_opt_t mongoc_transaction_opt_t; Synopsis -------- Options for starting a multi-document transaction. When a session is first created with :symbol:`mongoc_client_start_session`, it inherits from the client the read concern, write concern, and read preference with which to start transactions. Each of these fields can be overridden independently. Create a :symbol:`mongoc_transaction_opt_t` with :symbol:`mongoc_transaction_opts_new`, and pass a non-NULL option to any of the :symbol:`mongoc_transaction_opt_t` setter functions: * :symbol:`mongoc_transaction_opts_set_read_concern` * :symbol:`mongoc_transaction_opts_set_write_concern` * :symbol:`mongoc_transaction_opts_set_read_prefs` Pass the resulting transaction options to :symbol:`mongoc_client_session_start_transaction`. Each field set in the transaction options overrides the inherited client configuration. Example ------- .. literalinclude:: ../examples/example-transaction.c :language: c :caption: example-transaction.c .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_transaction_opts_new mongoc_transaction_opts_get_read_concern mongoc_transaction_opts_set_read_concern mongoc_transaction_opts_get_write_concern mongoc_transaction_opts_set_write_concern mongoc_transaction_opts_get_read_prefs mongoc_transaction_opts_set_read_prefs mongoc_transaction_opts_get_max_commit_time_ms mongoc_transaction_opts_set_max_commit_time_ms mongoc_transaction_opts_clone mongoc_transaction_opts_destroy mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_clone.rst000066400000000000000000000010551511661753600265330ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_clone mongoc_transaction_opts_clone() =============================== Synopsis -------- .. code-block:: c mongoc_transaction_opt_t * mongoc_transaction_opts_clone (const mongoc_transaction_opt_t *opts); Create a copy of a transaction options struct. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. Returns ------- A new :symbol:`mongoc_transaction_opt_t` that must be freed with :symbol:`mongoc_transaction_opts_destroy()`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_destroy.rst000066400000000000000000000006671511661753600271340ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_destroy mongoc_transaction_opts_destroy() ================================= Synopsis -------- .. code-block:: c void mongoc_transaction_opts_destroy (mongoc_transaction_opt_t *opts); Free a :symbol:`mongoc_transaction_opt_t`. Does nothing if ``opts`` is NULL. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_get_max_commit_time_ms.rst000066400000000000000000000010611511661753600321410ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_get_max_commit_time_ms mongoc_transaction_opts_get_max_commit_time_ms() ================================================ Synopsis -------- .. code-block:: c int64_t mongoc_transaction_opts_get_max_commit_time_ms (const mongoc_transaction_opt_t *opts); Return the transaction options' max commit time, in milliseconds. See :symbol:`mongoc_transaction_opts_set_max_commit_time_ms()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_get_read_concern.rst000066400000000000000000000012151511661753600307120ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_get_read_concern mongoc_transaction_opts_get_read_concern() ========================================== Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_transaction_opts_get_read_concern (const mongoc_transaction_opt_t *opts); Return the transaction options' :symbol:`mongoc_read_concern_t`. See :symbol:`mongoc_transaction_opts_set_read_concern()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. Returns ------- A :symbol:`mongoc_read_concern_t` that is valid only for the lifetime of ``opts``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_get_read_prefs.rst000066400000000000000000000011761511661753600304100ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_get_read_prefs mongoc_transaction_opts_get_read_prefs() ======================================== Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_transaction_opts_get_read_prefs (const mongoc_transaction_opt_t *opts); Return the transaction options' :symbol:`mongoc_read_prefs_t`. See :symbol:`mongoc_transaction_opts_set_read_prefs()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. Returns ------- A :symbol:`mongoc_read_prefs_t` that is valid only for the lifetime of ``opts``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_get_write_concern.rst000066400000000000000000000012261511661753600311330ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_get_write_concern mongoc_transaction_opts_get_write_concern() =========================================== Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_transaction_opts_get_write_concern (const mongoc_transaction_opt_t *opts); Return the transaction options' :symbol:`mongoc_write_concern_t`. See :symbol:`mongoc_transaction_opts_set_write_concern()`. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. Returns ------- A :symbol:`mongoc_write_concern_t` that is valid only for the lifetime of ``opts``. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_new.rst000066400000000000000000000007421511661753600262260ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_new mongoc_transaction_opts_new() ============================= Synopsis -------- .. code-block:: c mongoc_transaction_opt_t * mongoc_transaction_opts_new (void); Create a :symbol:`mongoc_transaction_opt_t` to configure multi-document transactions. Returns ------- A new :symbol:`mongoc_transaction_opt_t` that must be freed with :symbol:`mongoc_transaction_opts_destroy()`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_set_max_commit_time_ms.rst000066400000000000000000000011611511661753600321560ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_set_max_commit_time_ms mongoc_transaction_opts_set_max_commit_time_ms() ================================================ Synopsis -------- .. code-block:: c void mongoc_transaction_opts_set_max_commit_time_ms (mongoc_transaction_opt_t *opts, int64_t max_commit_time_ms); Configure the transaction's max commit time, in milliseconds. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. * ``int64_t``: Timeout for commitTransaction, in milliseconds. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_set_read_concern.rst000066400000000000000000000012331511661753600307260ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_set_read_concern mongoc_transaction_opts_set_read_concern() ========================================== Synopsis -------- .. code-block:: c void mongoc_transaction_opts_set_read_concern (mongoc_transaction_opt_t *opts, const mongoc_read_concern_t *read_concern); Configure the transaction's read concern. The argument is copied into the struct and can be freed after calling this function. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. * ``read_concern``: A :symbol:`mongoc_read_concern_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_set_read_prefs.rst000066400000000000000000000012141511661753600304150ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_set_read_prefs mongoc_transaction_opts_set_read_prefs() ======================================== Synopsis -------- .. code-block:: c void mongoc_transaction_opts_set_read_prefs (mongoc_transaction_opt_t *opts, const mongoc_read_prefs_t *read_prefs); Configure the transaction's read preference. The argument is copied into the struct and can be freed after calling this function. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. * ``read_prefs``: A :symbol:`mongoc_read_prefs_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_opts_set_write_concern.rst000066400000000000000000000012451511661753600311500ustar00rootroot00000000000000:man_page: mongoc_transaction_opts_set_write_concern mongoc_transaction_opts_set_write_concern() =========================================== Synopsis -------- .. code-block:: c void mongoc_transaction_opts_set_write_concern (mongoc_transaction_opt_t *opts, const mongoc_write_concern_t *write_concern); Configure the transaction's write concern. The argument is copied into the struct and can be freed after calling this function. Parameters ---------- * ``opts``: A :symbol:`mongoc_transaction_opt_t`. * ``write_concern``: A :symbol:`mongoc_write_concern_t`. .. only:: html .. include:: includes/seealso/session.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_transaction_state_t.rst000066400000000000000000000021551511661753600260330ustar00rootroot00000000000000:man_page: mongoc_transaction_state_t mongoc_transaction_state_t ========================== Constants for transaction states Synopsis -------- .. code-block:: c typedef enum { MONGOC_TRANSACTION_NONE = 0, MONGOC_TRANSACTION_STARTING = 1, MONGOC_TRANSACTION_IN_PROGRESS = 2, MONGOC_TRANSACTION_COMMITTED = 3, MONGOC_TRANSACTION_ABORTED = 4, } mongoc_transaction_state_t; Description ----------- These constants describe the current transaction state of a session. Flag Values ----------- ================================== ============================================================================= MONGOC_TRANSACTION_NONE There is no transaction in progress. MONGOC_TRANSACTION_STARTING A transaction has been started, but no operation has been sent to the server. MONGOC_TRANSACTION_IN_PROGRESS A transaction is in progress. MONGOC_TRANSACTION_COMMITTED The transaction was committed. MONGOC_TRANSACTION_ABORTED The transaction was aborted. ================================== ============================================================================= mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_update_flags_t.rst000066400000000000000000000024301511661753600247400ustar00rootroot00000000000000:man_page: mongoc_update_flags_t mongoc_update_flags_t ===================== Flags for update operations Synopsis -------- .. code-block:: c typedef enum { MONGOC_UPDATE_NONE = 0, MONGOC_UPDATE_UPSERT = 1 << 0, MONGOC_UPDATE_MULTI_UPDATE = 1 << 1, } mongoc_update_flags_t; #define MONGOC_UPDATE_NO_VALIDATE (1U << 31) Description ----------- These flags correspond to the MongoDB wire protocol. They may be bitwise or'd together. The allow for modifying the way an update is performed in the MongoDB server. Flag Values ----------- ========================== ======================================================================================================================================== MONGOC_UPDATE_NONE No update flags set. MONGOC_UPDATE_UPSERT If an upsert should be performed. MONGOC_UPDATE_MULTI_UPDATE If more than a single matching document should be updated. By default only the first document is updated. MONGOC_UPDATE_NO_VALIDATE Do not perform client side BSON validations when performing an update. This is useful if you already know your BSON documents are valid. ========================== ======================================================================================================================================== mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_copy.rst000066400000000000000000000006741511661753600236200ustar00rootroot00000000000000:man_page: mongoc_uri_copy mongoc_uri_copy() ================= Synopsis -------- .. code-block:: c mongoc_uri_t * mongoc_uri_copy (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Copies the entire contents of a URI. Returns ------- A newly allocated :symbol:`mongoc_uri_t` that should be freed with :symbol:`mongoc_uri_destroy()`. May return ``NULL`` on invalid host. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_destroy.rst000066400000000000000000000005041511661753600243270ustar00rootroot00000000000000:man_page: mongoc_uri_destroy mongoc_uri_destroy() ==================== Synopsis -------- .. code-block:: c void mongoc_uri_destroy (mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Frees all resources associated with a uri. Does nothing if ``uri`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_auth_mechanism.rst000066400000000000000000000011071511661753600264620ustar00rootroot00000000000000:man_page: mongoc_uri_get_auth_mechanism mongoc_uri_get_auth_mechanism() =============================== Synopsis -------- .. code-block:: c const char * mongoc_uri_get_auth_mechanism (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the ``authMechanism`` parameter to an URI if provided. Returns ------- A string which should not be modified or freed. Returns ``NULL`` if the ``authMechanism`` parameter was not provided to ``uri``. .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_auth_source.rst000066400000000000000000000010471511661753600260210ustar00rootroot00000000000000:man_page: mongoc_uri_get_auth_source mongoc_uri_get_auth_source() ============================ Synopsis -------- .. code-block:: c const char * mongoc_uri_get_auth_source (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the ``authSource`` parameter of an URI if provided. Returns ------- A string which should not be modified or freed if the ``authSource`` parameter is provided, otherwise ``NULL``. .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_compressors.rst000066400000000000000000000013701511661753600260560ustar00rootroot00000000000000:man_page: mongoc_uri_get_compressors mongoc_uri_get_compressors() ============================ Synopsis -------- .. code-block:: c const bson_t * mongoc_uri_get_compressors (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Returns a bson document with the enabled compressors as the keys or an empty document if no compressors were provided. Example ------- .. code-block:: c mongoc_client_t *client; mongoc_uri_t *uri; uri = mongoc_uri_new ("mongodb://localhost/?compressors=zlib,snappy,zstd"); if (bson_has_field (mongoc_uri_get_compressors (uri), "snappy")) { /* snappy enabled */ } Returns ------- A bson_t * which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_database.rst000066400000000000000000000007271511661753600252500ustar00rootroot00000000000000:man_page: mongoc_uri_get_database mongoc_uri_get_database() ========================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_database (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the database portion of an URI if provided. This is the portion after the ``/`` but before the ``?``. Returns ------- A string which should not be modified or freed or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_hosts.rst000066400000000000000000000010501511661753600246320ustar00rootroot00000000000000:man_page: mongoc_uri_get_hosts mongoc_uri_get_hosts() ====================== Synopsis -------- .. code-block:: c const mongoc_host_list_t * mongoc_uri_get_hosts (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a linked list of hosts that were defined in the URI (the comma-separated host section). Returns ------- A linked list of :symbol:`mongoc_host_list_t` structures that should not be modified or freed. Returns ``NULL`` if this URI's scheme is "mongodb+srv://". mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_mechanism_properties.rst000066400000000000000000000031731511661753600277220ustar00rootroot00000000000000:man_page: mongoc_uri_get_mechanism_properties mongoc_uri_get_mechanism_properties() ===================================== Synopsis -------- .. code-block:: c bool mongoc_uri_get_mechanism_properties (const mongoc_uri_t *uri, bson_t *properties /* OUT */); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``properties``: An uninitialized :symbol:`bson:bson_t`. Description ----------- Fetches the "authMechanismProperties" options set on this :symbol:`mongoc_uri_t`. The out-parameter ``properties`` should be an uninitialized, stack-allocated :symbol:`bson:bson_t`. It is statically initialized with :symbol:`bson:bson_init_static` to point to the internal data of ``uri``, so its contents must not be modified and it becomes invalid after ``uri`` is destroyed. Returns ------- If no "authMechanismProperties" have been set on ``uri``, this functions returns false and ``properties`` remains uninitialized. Example ------- .. code-block:: c mongoc_uri_t *uri; bson_t props; uri = mongoc_uri_new ( "mongodb://user%40DOMAIN.COM:password@localhost/?authMechanism=GSSAPI" "&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true"); if (mongoc_uri_get_mechanism_properties (uri, &props)) { char *json = bson_as_canonical_extended_json (&props, NULL); printf ("%s\n", json); bson_free (json); } else { printf ("No authMechanismProperties.\n"); } This code produces the output: .. code-block:: none { "SERVICE_NAME" : "other", "CANONICALIZE_HOST_NAME" : "true" } .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_option_as_bool.rst000066400000000000000000000012001511661753600264750ustar00rootroot00000000000000:man_page: mongoc_uri_get_option_as_bool mongoc_uri_get_option_as_bool() =============================== Synopsis -------- .. code-block:: c bool mongoc_uri_get_option_as_bool (const mongoc_uri_t *uri, const char *option, bool fallback); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``fallback``: A default value to return. Description ----------- Returns the value of the URI option if it is set and of the correct type (bool). If not set, or set to an invalid type, returns ``fallback``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_option_as_int32.rst000066400000000000000000000023431511661753600265120ustar00rootroot00000000000000:man_page: mongoc_uri_get_option_as_int32 mongoc_uri_get_option_as_int32() ================================ Synopsis -------- .. code-block:: c int32_t mongoc_uri_get_option_as_int32 (const mongoc_uri_t *uri, const char *option, int32_t fallback); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``fallback``: A default value to return. Description ----------- Returns the value of the URI option if it is set and of the correct type (integer). Returns ``fallback`` if the option is not set, set to an invalid type, or zero. Zero is considered "unset", so URIs can be constructed like so, and still accept default values: .. code-block:: c bson_strdup_printf ("mongodb://localhost/?connectTimeoutMS=%d", myvalue) If ``myvalue`` is non-zero it is the connection timeout; if it is zero the driver uses the default timeout. When reading an option that is an int64, this function will return the value as ``int32_t``. If the value is outside the range of a 32-bit integer, a warning will be emitted and ``fallback`` is returned instead. .. seealso:: | :symbol:`mongoc_uri_get_option_as_int64()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_option_as_int64.rst000066400000000000000000000020211511661753600265100ustar00rootroot00000000000000:man_page: mongoc_uri_get_option_as_int64 mongoc_uri_get_option_as_int64() ================================ Synopsis -------- .. code-block:: c int64_t mongoc_uri_get_option_as_int64 (const mongoc_uri_t *uri, const char *option, int64_t fallback); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``fallback``: A default value to return. Description ----------- Returns the value of the URI option if it is set and of the correct type (integer). Returns ``fallback`` if the option is not set, set to an invalid type, or zero. Zero is considered "unset", so URIs can be constructed like so, and still accept default values: .. code-block:: c bson_strdup_printf ("mongodb://localhost/?wTimeoutMS=%" PRId64, myvalue) If ``myvalue`` is non-zero it is the write concern timeout; if it is zero the driver uses the default timeout. .. seealso:: | :symbol:`mongoc_uri_get_option_as_int32()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_option_as_utf8.rst000066400000000000000000000014151511661753600264400ustar00rootroot00000000000000:man_page: mongoc_uri_get_option_as_utf8 mongoc_uri_get_option_as_utf8() =============================== Synopsis -------- .. code-block:: c const char * mongoc_uri_get_option_as_utf8 (const mongoc_uri_t *uri, const char *option, const char *fallback); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``fallback``: A default value to return. Description ----------- Returns the value of the URI option if it is set and of the correct type (string). This value is a pointer into the URI's internal buffer, and is only valid until the URI is modified or freed. If the option is not set, or set to an invalid type, returns ``fallback``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_options.rst000066400000000000000000000007671511661753600252030ustar00rootroot00000000000000:man_page: mongoc_uri_get_options mongoc_uri_get_options() ======================== Synopsis -------- .. code-block:: c const bson_t * mongoc_uri_get_options (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a bson document containing all of the options provided after the ``?`` of a URI. Returns ------- A :symbol:`bson:bson_t` which should not be modified or freed if ``uri`` has options provided, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_password.rst000066400000000000000000000006751511661753600253500ustar00rootroot00000000000000:man_page: mongoc_uri_get_password mongoc_uri_get_password() ========================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_password (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the password portion of an URI. Returns ------- A string which should not be modified or freed if ``uri`` has a password specified, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_read_concern.rst000066400000000000000000000011161511661753600261170ustar00rootroot00000000000000:man_page: mongoc_uri_get_read_concern mongoc_uri_get_read_concern() ============================= Synopsis -------- .. code-block:: c const mongoc_read_concern_t * mongoc_uri_get_read_concern (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a read concern that is owned by the URI instance. This read concern is configured based on URI parameters. Returns ------- Returns a :symbol:`mongoc_read_concern_t` that should not be modified or freed if a read concern is provided to ``uri``, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_read_prefs_t.rst000066400000000000000000000011171511661753600261330ustar00rootroot00000000000000:man_page: mongoc_uri_get_read_prefs_t mongoc_uri_get_read_prefs_t() ============================= Synopsis -------- .. code-block:: c const mongoc_read_prefs_t * mongoc_uri_get_read_prefs_t (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a read preference that is owned by the URI instance. This read preference concern is configured based on URI parameters. Returns ------- Returns a :symbol:`mongoc_read_prefs_t` that should not be modified or freed if ``uri`` has read preferences, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_replica_set.rst000066400000000000000000000007571511661753600260010ustar00rootroot00000000000000:man_page: mongoc_uri_get_replica_set mongoc_uri_get_replica_set() ============================ Synopsis -------- .. code-block:: c const char * mongoc_uri_get_replica_set (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the ``replicaSet`` parameter of an URI. Returns ------- Returns a string which should not be modified or freed. Returns ``NULL`` if the ``replicaSet`` parameter was not provided to ``uri``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_server_monitoring_mode.rst000066400000000000000000000010611511661753600302530ustar00rootroot00000000000000:man_page: mongoc_uri_get_server_monitoring_mode mongoc_uri_get_server_monitoring_mode() ======================================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_server_monitoring_mode (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the ``serverMonitoringMode`` parameter to an URI if provided. Returns ------- A string which should not be modified or freed. Returns "auto" if the ``serverMonitoringMode`` parameter was not provided to ``uri``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_srv_hostname.rst000066400000000000000000000007151511661753600262110ustar00rootroot00000000000000:man_page: mongoc_uri_get_srv_hostname mongoc_uri_get_srv_hostname() ============================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_srv_hostname (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Returns the SRV host and domain name of a MongoDB URI. Returns ------- A string if this URI's scheme is "mongodb+srv://", or NULL if the scheme is "mongodb://". mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_srv_service_name.rst000066400000000000000000000007641511661753600270370ustar00rootroot00000000000000:man_page: mongoc_uri_get_srv_service_name mongoc_uri_get_srv_service_name() ================================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_srv_service_name (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Returns the SRV service name of a MongoDB URI. Returns ------- A string corresponding to the value of the srvServiceName URI option if present. Otherwise, the default value "mongodb". mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_string.rst000066400000000000000000000005721511661753600250100ustar00rootroot00000000000000:man_page: mongoc_uri_get_string mongoc_uri_get_string() ======================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_string (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the URI as a string. Returns ------- Returns a string which should not be modified or freed. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_tls.rst000066400000000000000000000007341511661753600243040ustar00rootroot00000000000000:man_page: mongoc_uri_get_tls mongoc_uri_get_tls() ==================== Synopsis -------- .. code-block:: c bool mongoc_uri_get_tls (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a boolean indicating if TLS was specified for use in the URI. Returns ------- Returns a boolean, true indicating that TLS should be used. This returns true if *any* :ref:`TLS option ` is specified. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_username.rst000066400000000000000000000007031511661753600253150ustar00rootroot00000000000000:man_page: mongoc_uri_get_username mongoc_uri_get_username() ========================= Synopsis -------- .. code-block:: c const char * mongoc_uri_get_username (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches the username portion of a URI. Returns ------- Returns a string which should not be modified or freed if ``uri`` has a username provided, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_get_write_concern.rst000066400000000000000000000011251511661753600263360ustar00rootroot00000000000000:man_page: mongoc_uri_get_write_concern mongoc_uri_get_write_concern() ============================== Synopsis -------- .. code-block:: c const mongoc_write_concern_t * mongoc_uri_get_write_concern (const mongoc_uri_t *uri); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. Description ----------- Fetches a write concern that is owned by the URI instance. This write concern is configured based on URI parameters. Returns ------- Returns a :symbol:`mongoc_write_concern_t` that should not be modified or freed if ``uri`` has a write concern provided, otherwise ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_has_option.rst000066400000000000000000000006311511661753600250020ustar00rootroot00000000000000:man_page: mongoc_uri_has_option mongoc_uri_has_option() ======================= Synopsis -------- .. code-block:: c bool mongoc_uri_has_option (const mongoc_uri_t *uri, const char *option); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. Description ----------- Returns true if the option was present in the initial MongoDB URI. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_new.rst000066400000000000000000000007771511661753600234430ustar00rootroot00000000000000:man_page: mongoc_uri_new mongoc_uri_new() ================ Synopsis -------- .. code-block:: c mongoc_uri_t * mongoc_uri_new (const char *uri_string); Parameters ---------- * ``uri_string``: A string containing a URI. Description ----------- Calls :symbol:`mongoc_uri_new_with_error`. Returns ------- A newly allocated :symbol:`mongoc_uri_t` if successful. Otherwise ``NULL``, using MONGOC_WARNING on error. .. warning:: Failure to handle the result of this function is a programming error. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_new_for_host_port.rst000066400000000000000000000011031511661753600263720ustar00rootroot00000000000000:man_page: mongoc_uri_new_for_host_port mongoc_uri_new_for_host_port() ============================== Synopsis -------- .. code-block:: c mongoc_uri_t * mongoc_uri_new_for_host_port (const char *hostname, uint16_t port); Parameters ---------- * ``hostname``: A string containing the hostname. * ``port``: A uint16_t. Description ----------- Creates a new :symbol:`mongoc_uri_t` based on the hostname and port provided. Returns ------- Returns a newly allocated :symbol:`mongoc_uri_t` that should be freed with :symbol:`mongoc_uri_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_new_with_error.rst000066400000000000000000000023651511661753600257020ustar00rootroot00000000000000:man_page: mongoc_uri_new_with_error mongoc_uri_new_with_error() =========================== Synopsis -------- .. code-block:: c mongoc_uri_t * mongoc_uri_new_with_error (const char *uri_string, bson_error_t *error); Parameters ---------- * ``uri_string``: A string containing a URI. * ``error``: An optional location for a :symbol:`bson_error_t ` or ``NULL``. Description ----------- Parses a string containing a MongoDB style URI connection string. Returns ------- A newly allocated :symbol:`mongoc_uri_t` if successful. Otherwise ``NULL`` populating ``error`` with the error description. .. warning:: Failure to handle the result of this function is a programming error. Examples -------- Examples of some valid MongoDB connection strings can be seen below. ``"mongodb://localhost/"`` ``"mongodb://localhost/?replicaSet=myreplset"`` ``"mongodb://myuser:mypass@localhost/"`` ``"mongodb://kerberosuser%40EXAMPLE.COM@example.com/?authMechanism=GSSAPI"`` ``"mongodb://[::1]:27017/"`` ``"mongodb://10.0.0.1:27017,10.0.0.1:27018,[::1]:27019/?tls=true"`` ``"mongodb://%2Ftmp%2Fmongodb-27017.sock"`` ``"mongodb://user:pass@%2Ftmp%2Fmongodb-27017.sock"`` ``"mongodb://localhost,[::1]/mydb?authSource=mydb"`` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_option_is_bool.rst000066400000000000000000000007341511661753600256610ustar00rootroot00000000000000:man_page: mongoc_uri_option_is_bool mongoc_uri_option_is_bool() =========================== Synopsis -------- .. code-block:: c bool mongoc_uri_option_is_bool (const char *option); Parameters ---------- * ``option``: The name of an option, case insensitive. Description ----------- Returns true if the option is a known MongoDB URI option of boolean type. For example, "tls=false" is a valid MongoDB URI option, so ``mongoc_uri_option_is_bool ("tls")`` is true. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_option_is_int32.rst000066400000000000000000000011741511661753600256640ustar00rootroot00000000000000:man_page: mongoc_uri_option_is_int32 mongoc_uri_option_is_int32() ============================ Synopsis -------- .. code-block:: c bool mongoc_uri_option_is_int32 (const char *option); Parameters ---------- * ``option``: The name of an option, case insensitive. Description ----------- Returns true if the option is a known MongoDB URI option of integer type. For example, "zlibCompressionLevel=5" is a valid integer MongoDB URI option, so ``mongoc_uri_option_is_int32 ("zlibCompressionLevel")`` is true. This will also return true for all 64-bit integer options. .. seealso:: | :symbol:`mongoc_uri_option_is_int64()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_option_is_int64.rst000066400000000000000000000010751511661753600256710ustar00rootroot00000000000000:man_page: mongoc_uri_option_is_int64 mongoc_uri_option_is_int64() ============================ Synopsis -------- .. code-block:: c bool mongoc_uri_option_is_int64 (const char *option); Parameters ---------- * ``option``: The name of an option, case insensitive. Description ----------- Returns true if the option is a known MongoDB URI option of 64-bit integer type. For example, "wTimeoutMS=100" is a valid 64-bit integer MongoDB URI option, so ``mongoc_uri_option_is_int64 ("wTimeoutMS")`` is true. .. seealso:: | :symbol:`mongoc_uri_option_is_int32()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_option_is_utf8.rst000066400000000000000000000007511511661753600256130ustar00rootroot00000000000000:man_page: mongoc_uri_option_is_utf8 mongoc_uri_option_is_utf8() =========================== Synopsis -------- .. code-block:: c bool mongoc_uri_option_is_utf8 (const char *option); Parameters ---------- * ``option``: The name of an option, case insensitive. Description ----------- Returns true if the option is a known MongoDB URI option of string type. For example, "replicaSet=my_rs" is a valid MongoDB URI option, so ``mongoc_uri_option_is_utf8 ("replicaSet")`` is true. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_auth_mechanism.rst000066400000000000000000000013661511661753600265050ustar00rootroot00000000000000:man_page: mongoc_uri_set_auth_mechanism mongoc_uri_set_auth_mechanism() =============================== Synopsis -------- .. code-block:: c bool mongoc_uri_set_auth_mechanism (mongoc_uri_t *uri, const char *value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``value``: The new "authMechanism" value. Description ----------- Sets the "authMechanism" URI option, such as "SCRAM-SHA-1" or "GSSAPI", after the URI has been parsed from a string. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- Returns false if the option cannot be set, for example if ``value`` is not valid UTF-8. .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_auth_source.rst000066400000000000000000000013011511661753600260260ustar00rootroot00000000000000:man_page: mongoc_uri_set_auth_source mongoc_uri_set_auth_source() ============================ Synopsis -------- .. code-block:: c bool mongoc_uri_set_auth_source (mongoc_uri_t *uri, const char *value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``value``: The new "authSource" value. Description ----------- Sets the "authSource" URI option, after the URI has been parsed from a string. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- Returns false if the option cannot be set, for example if ``value`` is not valid UTF-8. .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_compressors.rst000066400000000000000000000021661511661753600260760ustar00rootroot00000000000000:man_page: mongoc_uri_set_compressors mongoc_uri_set_compressors() ============================ Synopsis -------- .. code-block:: c bool mongoc_uri_set_compressors (mongoc_uri_t *uri, const char *compressors); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``compressors``: A string consisting of one or more comma (,) separated compressors names (e.g. "snappy,zlib") or ``NULL``. Passing ``NULL`` or an empty string clears any existing compressors set on ``uri``. Description ----------- Sets the URI's compressors, after the URI has been parsed from a string. Will overwrite any previously set value. Example ------- .. code-block:: c mongoc_client_t *client; mongoc_uri_t *uri; uri = mongoc_uri_new ("mongodb://localhost/"); mongoc_uri_set_compressors (uri, "snappy,zlib,zstd"); mongoc_client_new_from_uri (uri); /* Snappy & zlib & zstd compressors are enabled */ Returns ------- Returns false if the option cannot be set, for example if ``compressors`` is not valid UTF-8. Logs a warning to stderr with the :doc:`MONGOC_WARNING ` macro if compressor is not available. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_database.rst000066400000000000000000000012761511661753600252640ustar00rootroot00000000000000:man_page: mongoc_uri_set_database mongoc_uri_set_database() ========================= Synopsis -------- .. code-block:: c bool mongoc_uri_set_database (mongoc_uri_t *uri, const char *database); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``database``: The new database name. Description ----------- Sets the URI's database, after the URI has been parsed from a string. The driver authenticates to this database if the connection string includes authentication credentials. This database is also the return value of :symbol:`mongoc_client_get_default_database`. Returns ------- Returns false if the option cannot be set, for example if ``database`` is not valid UTF-8. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_mechanism_properties.rst000066400000000000000000000023641511661753600277370ustar00rootroot00000000000000:man_page: mongoc_uri_set_mechanism_properties mongoc_uri_set_mechanism_properties() ===================================== Synopsis -------- .. code-block:: c bool mongoc_uri_set_mechanism_properties (mongoc_uri_t *uri, const bson_t *properties); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``properties``: A :symbol:`bson:bson_t` . Description ----------- Replaces all the options in URI's "authMechanismProperties" after the URI has been parsed from a string. Returns ------- Returns false if the option cannot be set, for example if ``properties`` is not valid BSON data. Example ------- .. code-block:: c mongoc_uri_t *uri; bson_t props = BSON_INITIALIZER; uri = mongoc_uri_new ( "mongodb://user%40DOMAIN.COM:password@localhost/?authMechanism=GSSAPI" "&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:true"); /* replace all options: replace service name "other" with "my_service", unset * "CANONICALIZE_HOST_NAME" and accept its default. */ BSON_APPEND_UTF8 (&props, "SERVICE_NAME", "my_service"); mongoc_uri_set_mechanism_properties (uri, &props); bson_destroy (&props); .. only:: html .. include:: includes/seealso/authmechanism.txt mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_option_as_bool.rst000066400000000000000000000014501511661753600265200ustar00rootroot00000000000000:man_page: mongoc_uri_set_option_as_bool mongoc_uri_set_option_as_bool() =============================== Synopsis -------- .. code-block:: c bool mongoc_uri_set_option_as_bool (const mongoc_uri_t *uri, const char *option, bool value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``value``: The new value. Description ----------- Sets an individual URI option, after the URI has been parsed from a string. Only known options of type bool can be set. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- True if successfully set (the named option is a known option of type bool). mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_option_as_int32.rst000066400000000000000000000017521511661753600265310ustar00rootroot00000000000000:man_page: mongoc_uri_set_option_as_int32 mongoc_uri_set_option_as_int32() ================================ Synopsis -------- .. code-block:: c bool mongoc_uri_set_option_as_int32 (const mongoc_uri_t *uri, const char *option, int32_t value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``value``: The new value. Description ----------- Sets an individual URI option, after the URI has been parsed from a string. Only known options of type integer can be set. Some integer options, such as :ref:`minHeartbeatFrequencyMS `, have additional constraints. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- True if successfully set (the named option is a known option of type int32 or int64). .. seealso:: | :symbol:`mongoc_uri_set_option_as_int64()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_option_as_int64.rst000066400000000000000000000022221511661753600265270ustar00rootroot00000000000000:man_page: mongoc_uri_set_option_as_int64 mongoc_uri_set_option_as_int64() ================================ Synopsis -------- .. code-block:: c bool mongoc_uri_set_option_as_int64 (const mongoc_uri_t *uri, const char *option, int64_t value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``value``: The new value. Description ----------- Sets an individual URI option, after the URI has been parsed from a string. Only known options of type int32 or int64 can be set. For 32-bit integer options, the function returns ``false`` when trying to set a 64-bit value that exceeds the range of an ``int32_t``. Values that fit into an ``int32_t`` will be set correctly. In both cases, a warning will be emitted. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- True if successfully set (the named option is a known option of type int64). .. seealso:: | :symbol:`mongoc_uri_option_is_int64()` | :symbol:`mongoc_uri_set_option_as_int32()` mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_option_as_utf8.rst000066400000000000000000000014511511661753600264540ustar00rootroot00000000000000:man_page: mongoc_uri_set_option_as_utf8 mongoc_uri_set_option_as_utf8() =============================== Synopsis -------- .. code-block:: c bool mongoc_uri_set_option_as_utf8 (const mongoc_uri_t *uri, const char *option, utf8 value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``option``: The name of an option, case insensitive. * ``value``: The new value. Description ----------- Sets an individual URI option, after the URI has been parsed from a string. Only known string-type options can be set. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- True if successfully set (the named option is a known option of string type). mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_password.rst000066400000000000000000000011011511661753600253450ustar00rootroot00000000000000:man_page: mongoc_uri_set_password mongoc_uri_set_password() ========================= Synopsis -------- .. code-block:: c bool mongoc_uri_set_password (mongoc_uri_t *uri, const char *password); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``password``: The new password. Description ----------- Sets the URI's password, after the URI has been parsed from a string. The driver authenticates with this password if the username is also set. Returns ------- Returns false if the option cannot be set, for example if ``password`` is not valid UTF-8. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_read_concern.rst000066400000000000000000000007411511661753600261360ustar00rootroot00000000000000:man_page: mongoc_uri_set_read_concern mongoc_uri_set_read_concern() ============================= Synopsis -------- .. code-block:: c void mongoc_uri_set_read_concern (mongoc_uri_t *uri, const mongoc_read_concern_t *rc); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``rc``: A :symbol:`mongoc_read_concern_t`. Description ----------- Sets a MongoDB URI's read concern option, after the URI has been parsed from a string. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_read_prefs_t.rst000066400000000000000000000007351511661753600261540ustar00rootroot00000000000000:man_page: mongoc_uri_set_read_prefs_t mongoc_uri_set_read_prefs_t() ============================= Synopsis -------- .. code-block:: c void mongoc_uri_set_read_prefs_t (mongoc_uri_t *uri, const mongoc_read_prefs_t *prefs); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``rc``: A :symbol:`mongoc_read_prefs_t`. Description ----------- Sets a MongoDB URI's read preferences, after the URI has been parsed from a string. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_server_monitoring_mode.rst000066400000000000000000000012721511661753600302730ustar00rootroot00000000000000:man_page: mongoc_uri_set_server_monitoring_mode mongoc_uri_set_server_monitoring_mode() ======================================= Synopsis -------- .. code-block:: c bool mongoc_uri_set_server_monitoring_mode (mongoc_uri_t *uri, const char *value); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``value``: The new ``serverMonitoringMode`` value. Description ----------- Sets the ``serverMonitoringMode`` URI option to ``value`` after the URI has been parsed from a string. Updates the option in-place if already set, otherwise appends it to the URI's :symbol:`bson:bson_t` of options. Returns ------- Returns false if the ``value`` is not "auto", "poll", or "stream". mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_username.rst000066400000000000000000000011011511661753600253220ustar00rootroot00000000000000:man_page: mongoc_uri_set_username mongoc_uri_set_username() ========================= Synopsis -------- .. code-block:: c bool mongoc_uri_set_username (mongoc_uri_t *uri, const char *username); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``username``: The new username. Description ----------- Sets the URI's username, after the URI has been parsed from a string. The driver authenticates with this username if the password is also set. Returns ------- Returns false if the option cannot be set, for example if ``username`` is not valid UTF-8. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_set_write_concern.rst000066400000000000000000000007511511661753600263560ustar00rootroot00000000000000:man_page: mongoc_uri_set_write_concern mongoc_uri_set_write_concern() ============================== Synopsis -------- .. code-block:: c void mongoc_uri_set_write_concern (mongoc_uri_t *uri, const mongoc_write_concern_t *wc); Parameters ---------- * ``uri``: A :symbol:`mongoc_uri_t`. * ``rc``: A :symbol:`mongoc_write_concern_t`. Description ----------- Sets a MongoDB URI's write concern option, after the URI has been parsed from a string. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_t.rst000066400000000000000000001030231511661753600231010ustar00rootroot00000000000000:man_page: mongoc_uri_t mongoc_uri_t ============ Synopsis -------- .. code-block:: c typedef struct _mongoc_uri_t mongoc_uri_t; Description ----------- ``mongoc_uri_t`` provides an abstraction on top of the MongoDB connection URI format. It provides standardized parsing as well as convenience methods for extracting useful information such as replica hosts or authorization information. See `Connection String URI Reference `_ on the MongoDB website for more information. Format ------ .. code-block:: none mongodb[+srv]:// <1> [username:password@] <2> host1 <3> [:port1] <4> [,host2[:port2],...[,hostN[:portN]]] <5> [/[database] <6> [?options]] <7> #. "mongodb" is the specifier of the MongoDB protocol. Use "mongodb+srv" with a single service name in place of "host1" to specify the initial list of servers with an SRV record. #. An optional username and password. #. The only required part of the uri. This specifies either a hostname, IPv4 address, IPv6 address enclosed in "[" and "]", or UNIX domain socket. #. An optional port number. Defaults to :27017. #. Extra optional hosts and ports. You would specify multiple hosts, for example, for connections to replica sets. #. The name of the database to authenticate if the connection string includes authentication credentials. If /database is not specified and the connection string includes credentials, defaults to the 'admin' database. #. Connection specific options. .. note:: Option names are case-insensitive. Do not repeat the same option (e.g. "mongodb://localhost/db?opt=value1&OPT=value2") since this may have unexpected results. The MongoDB C Driver exposes constants for each supported connection option. These constants make it easier to discover connection options, but their string values can be used as well. For example, the following calls are equal. .. code-block:: c uri = mongoc_uri_new ("mongodb://localhost/?" MONGOC_URI_APPNAME "=applicationName"); uri = mongoc_uri_new ("mongodb://localhost/?appname=applicationName"); uri = mongoc_uri_new ("mongodb://localhost/?appName=applicationName"); Replica Set Example ------------------- To describe a connection to a replica set named 'test' with the following mongod hosts: * ``db1.example.com`` on port ``27017`` * ``db2.example.com`` on port ``2500`` You would use a connection string that resembles the following. .. code-block:: none mongodb://db1.example.com,db2.example.com:2500/?replicaSet=test SRV Example ----------- If you have configured an `SRV record `_ with a name like "_mongodb._tcp.server.example.com" whose records are a list of one or more MongoDB server hostnames, use a connection string like this: .. code-block:: c uri = mongoc_uri_new ("mongodb+srv://server.example.com/?replicaSet=rs&appName=applicationName"); The driver prefixes the service name with "_mongodb._tcp.", then performs a DNS SRV query to resolve the service name to one or more hostnames. If this query succeeds, the driver performs a DNS TXT query on the service name (without the "_mongodb._tcp" prefix) for additional URI options configured as TXT records. On Unix, the MongoDB C Driver relies on libresolv to look up SRV and TXT records. If libresolv is unavailable, then using a "mongodb+srv" URI will cause an error. If your libresolv lacks ``res_nsearch`` then the driver will fall back to ``res_search``, which is not thread-safe. Set the environment variable ``MONGOC_EXPERIMENTAL_SRV_PREFER_TCP`` to prefer TCP for the initial queries. The environment variable is ignored for ``res_search``. Large DNS responses over UDP may be truncated due to UDP size limitations. DNS resolvers are expected to retry over TCP if the UDP response indicates truncation. Some observed DNS environments do not set the truncation flag (TC), preventing the TCP retry. This environment variable is currently experimental and subject to change. IPv4 and IPv6 ------------- .. include:: includes/ipv4-and-ipv6.txt .. _connection_options: Connection Options ------------------ ========================================== ================================= ================================= ============================================================================================================================================================================================================================================ Constant Key Default Description ========================================== ================================= ================================= ============================================================================================================================================================================================================================================ MONGOC_URI_RETRYREADS retryreads true If "true" and the server is a MongoDB 3.6+ standalone, replica set, or sharded cluster, the driver safely retries a read that failed due to a network error or replica set failover. MONGOC_URI_RETRYWRITES retrywrites true if driver built w/ TLS If "true" and the server is a MongoDB 3.6+ replica set or sharded cluster, the driver safely retries a write that failed due to a network error or replica set failover. Only inserts, updates of single documents, or deletes of single documents are retried. MONGOC_URI_APPNAME appname Empty (no appname) The client application name. This value is used by MongoDB when it logs connection information and profile information, such as slow queries. MONGOC_URI_TLS tls Empty (not set, same as false) {true|false}, indicating if TLS must be used. (See also :symbol:`mongoc_client_set_ssl_opts` and :symbol:`mongoc_client_pool_set_ssl_opts`.) MONGOC_URI_COMPRESSORS compressors Empty (no compressors) Comma separated list of compressors, if any, to use to compress the wire protocol messages. Snappy, zlib, and zstd are optional build time dependencies, and enable the "snappy", "zlib", and "zstd" values respectively. MONGOC_URI_CONNECTTIMEOUTMS connecttimeoutms 10,000 ms (10 seconds) This setting applies to new server connections. It is also used as the socket timeout for server discovery and monitoring operations. MONGOC_URI_SOCKETTIMEOUTMS sockettimeoutms 300,000 ms (5 minutes) The time in milliseconds to attempt to send or receive on a socket before the attempt times out. MONGOC_URI_REPLICASET replicaset Empty (no replicaset) The name of the Replica Set that the driver should connect to. MONGOC_URI_ZLIBCOMPRESSIONLEVEL zlibcompressionlevel -1 When the MONGOC_URI_COMPRESSORS includes "zlib" this options configures the zlib compression level, when the zlib compressor is used to compress client data. MONGOC_URI_LOADBALANCED loadbalanced false If true, this indicates the driver is connecting to a MongoDB cluster behind a load balancer. MONGOC_URI_SRVMAXHOSTS srvmaxhosts 0 If zero, the number of hosts in DNS results is unlimited. If greater than zero, the number of hosts in DNS results is limited to being less than or equal to the given value. ========================================== ================================= ================================= ============================================================================================================================================================================================================================================ .. warning:: Setting any of the \*timeoutMS options above to either ``0`` or a negative value is discouraged due to unspecified and inconsistent behavior. The "default value" historically specified as a fallback for ``0`` or a negative value is NOT related to the default values for the \*timeoutMS options documented above. The meaning of a timeout of ``0`` or a negative value may vary depending on the operation being executed, even when specified by the same URI option. To specify the documented default value for a \*timeoutMS option, use the `MONGOC_DEFAULT_*` constants defined in ``mongoc-client.h`` instead. Authentication Options ---------------------- ========================================== ================================= ========================================================================================================================================================================================================================= Constant Key Description ========================================== ================================= ========================================================================================================================================================================================================================= MONGOC_URI_AUTHMECHANISM authmechanism Specifies the mechanism to use when authenticating as the provided user. See `Authentication `_ for supported values. MONGOC_URI_AUTHMECHANISMPROPERTIES authmechanismproperties Additional properties for the specified mechanism using key-value pair format, e.g. ``key1:value1,key2:value2``. MONGOC_URI_AUTHSOURCE authsource The name of the database to which authentication commands are sent or ``$external`` depending on the specified mechanism. Overrides the auth database in the URI when applicable. ========================================== ================================= ========================================================================================================================================================================================================================= .. _authentication_mechanism_properties: Mechanism Properties ~~~~~~~~~~~~~~~~~~~~ The following properties may be specified as key-value pairs for the ``MONGOC_URI_AUTHMECHANISMPROPERTIES`` option. Invalid or unsupported properties may be reported as a client error when a corresponding authentication mechanism is also specified. MONGODB-OIDC ^^^^^^^^^^^^ ============== ========================================================================================= Key Value ============== ========================================================================================= ENVIRONMENT The name of a built-in OIDC provider integration. Must be one of ["azure", "gcp", "k8s"]. TOKEN_RESOURCE The URI of the target resource. ``ENVIRONMENT`` must be one of ["azure", "gcp"]. ============== ========================================================================================= .. warning:: A ``TOKEN_RESOURCE`` property value MUST NOT contain the comma character "," when specified as a connection string query option, even when percent-encoded. A value containing a comma character may be set using :symbol:`mongoc_uri_set_mechanism_properties()` instead. However, the value MAY contain the colon character ":", as only the first colon is interpreted as a key-value delimiter. GSSAPI ^^^^^^ ====================== =================================================================================================================================================================================================================================== Key Value ====================== =================================================================================================================================================================================================================================== SERVICE_NAME Optional. Defaults to "mongodb". CANONICALIZE_HOST_NAME Optional. Must be one of ["false", "true"]. "false" performs no canonicalization (aka "none"). "true" performs a forward DNS lookup and then a reverse lookup on that value to canonicalize the hostname (aka "forwardAndReverse"). SERVICE_REALM Optional. May be needed for cross-realm authentication where the user and service exist in different realms. SERVICE_HOST Optional. May be needed to use a service host that differs from the initial role. ====================== =================================================================================================================================================================================================================================== MONGODB-AWS ^^^^^^^^^^^ ================= ==================================================================================== Key Value ================= ==================================================================================== AWS_SESSION_TOKEN Optional. An AWS session token to use for authentication with temporary credentials. ================= ==================================================================================== Deprecated Mechanism Property Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following options have been deprecated and may be removed from future releases of libmongoc. ========================================== ================================= ==================================================================== ======================= Constant Key Deprecated For Key ========================================== ================================= ==================================================================== ======================= MONGOC_URI_CANONICALIZEHOSTNAME canonicalizehostname MONGOC_URI_AUTHMECHANISMPROPERTIES (CANONICALIZE_HOST_NAME) authmechanismproperties MONGOC_URI_GSSAPISERVICENAME gssapiservicename MONGOC_URI_AUTHMECHANISMPROPERTIES (SERVICE_NAME) authmechanismproperties ========================================== ================================= ==================================================================== ======================= .. _tls_options: TLS Options ----------- .. include:: includes/tls-options.txt See `Configuring TLS `_ for details about these options and about building libmongoc with TLS support. Deprecated SSL Options ---------------------- The following options have been deprecated and may be removed from future releases of libmongoc. ========================================== ================================= =========================================== ================================= Constant Key Deprecated For Key ========================================== ================================= =========================================== ================================= MONGOC_URI_SSL ssl MONGOC_URI_TLS tls MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE sslclientcertificatekeyfile MONGOC_URI_TLSCERTIFICATEKEYFILE tlscertificatekeyfile MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD sslclientcertificatekeypassword MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD tlscertificatekeypassword MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE sslcertificateauthorityfile MONGOC_URI_TLSCAFILE tlscafile MONGOC_URI_SSLALLOWINVALIDCERTIFICATES sslallowinvalidcertificates MONGOC_URI_TLSALLOWINVALIDCERTIFICATES tlsallowinvalidcertificates MONGOC_URI_SSLALLOWINVALIDHOSTNAMES sslallowinvalidhostnames MONGOC_URI_TLSALLOWINVALIDHOSTNAMES tlsallowinvalidhostnames ========================================== ================================= =========================================== ================================= .. _sdam_uri_options: Server Discovery, Monitoring, and Selection Options --------------------------------------------------- Clients in a :symbol:`mongoc_client_pool_t` share a topology scanner that runs on a background thread. The thread wakes every ``heartbeatFrequencyMS`` (default 10 seconds) to scan all MongoDB servers in parallel. Whenever an application operation requires a server that is not known--for example, if there is no known primary and your application attempts an insert--the thread rescans all servers every half-second. In this situation the pooled client waits up to ``serverSelectionTimeoutMS`` (default 30 seconds) for the thread to find a server suitable for the operation, then returns an error with domain ``MONGOC_ERROR_SERVER_SELECTION``. Technically, the total time an operation may wait while a pooled client scans the topology is controlled both by ``serverSelectionTimeoutMS`` and ``connectTimeoutMS``. The longest wait occurs if the last scan begins just at the end of the selection timeout, and a slow or down server requires the full connection timeout before the client gives up. A non-pooled client is single-threaded. Every ``heartbeatFrequencyMS``, it blocks the next application operation while it does a parallel scan. This scan takes as long as needed to check the slowest server: roughly ``connectTimeoutMS``. Therefore the default ``heartbeatFrequencyMS`` for single-threaded clients is greater than for pooled clients: 60 seconds. By default, single-threaded (non-pooled) clients scan only once when an operation requires a server that is not known. If you attempt an insert and there is no known primary, the client checks all servers once trying to find it, then succeeds or returns an error with domain ``MONGOC_ERROR_SERVER_SELECTION``. But if you set ``serverSelectionTryOnce`` to "false", the single-threaded client loops, checking all servers every half-second, until ``serverSelectionTimeoutMS``. The total time an operation may wait for a single-threaded client to scan the topology is determined by ``connectTimeoutMS`` in the try-once case, or ``serverSelectionTimeoutMS`` and ``connectTimeoutMS`` if ``serverSelectionTryOnce`` is set "false". ========================================== ================================= ========================================================================================================================================================================================================================= Constant Key Description ========================================== ================================= ========================================================================================================================================================================================================================= MONGOC_URI_HEARTBEATFREQUENCYMS heartbeatfrequencyms The interval between server monitoring checks. Defaults to 10,000ms (10 seconds) in pooled (multi-threaded) mode, 60,000ms (60 seconds) in non-pooled mode (single-threaded). MONGOC_URI_SERVERSELECTIONTIMEOUTMS serverselectiontimeoutms A timeout in milliseconds to block for server selection before throwing an exception. The default is 30,0000ms (30 seconds). MONGOC_URI_SERVERSELECTIONTRYONCE serverselectiontryonce If "true", the driver scans the topology exactly once after server selection fails, then either selects a server or returns an error. If it is false, then the driver repeatedly searches for a suitable server for up to ``serverSelectionTimeoutMS`` milliseconds (pausing a half second between attempts). The default for ``serverSelectionTryOnce`` is "false" for pooled clients, otherwise "true". Pooled clients ignore serverSelectionTryOnce; they signal the thread to rescan the topology every half-second until serverSelectionTimeoutMS expires. MONGOC_URI_SOCKETCHECKINTERVALMS socketcheckintervalms Only applies to single threaded clients. If a socket has not been used within this time, its connection is checked with a quick "hello" call before it is used again. Defaults to 5,000ms (5 seconds). MONGOC_URI_DIRECTCONNECTION directconnection If "true", the driver connects to a single server directly and will not monitor additional servers. If "false", the driver connects based on the presence and value of the ``replicaSet`` option. ========================================== ================================= ========================================================================================================================================================================================================================= Setting any of the \*TimeoutMS options above to ``0`` will be interpreted as "use the default value". .. _connection_pool_options: Connection Pool Options ----------------------- These options govern the behavior of a :symbol:`mongoc_client_pool_t`. They are ignored by a non-pooled :symbol:`mongoc_client_t`. ========================================== ================================= ========================================================================================================================================================================================================================= Constant Key Description ========================================== ================================= ========================================================================================================================================================================================================================= MONGOC_URI_MAXPOOLSIZE maxpoolsize The maximum number of clients created by a :symbol:`mongoc_client_pool_t` total (both in the pool and checked out). The default value is 100. Once it is reached, :symbol:`mongoc_client_pool_pop` blocks until another thread pushes a client. MONGOC_URI_WAITQUEUETIMEOUTMS waitqueuetimeoutms The maximum time to wait for a client to become available from the pool. ========================================== ================================= ========================================================================================================================================================================================================================= .. _mongoc_uri_t_write_concern_options: Write Concern Options --------------------- ========================================== ================================= ======================================================================================================================================================================= Constant Key Description ========================================== ================================= ======================================================================================================================================================================= MONGOC_URI_W w Determines the write concern (guarantee). Valid values: * 0 = The driver will not acknowledge write operations but will pass or handle any network and socket errors that it receives to the client. If you disable write concern but enable the getLastError command’s w option, w overrides the w option. * 1 = Provides basic acknowledgement of write operations. By specifying 1, you require that a standalone mongod instance, or the primary for replica sets, acknowledge all write operations. For drivers released after the default write concern change, this is the default write concern setting. * majority = For replica sets, if you specify the special majority value to w option, write operations will only return successfully after a majority of the configured replica set members have acknowledged the write operation. * n = For replica sets, if you specify a number n greater than 1, operations with this write concern return only after n members of the set have acknowledged the write. If you set n to a number that is greater than the number of available set members or members that hold data, MongoDB will wait, potentially indefinitely, for these members to become available. * tags = For replica sets, you can specify a tag set to require that all members of the set that have these tags configured return confirmation of the write operation. MONGOC_URI_WTIMEOUTMS wtimeoutms The time in milliseconds to wait for replication to succeed, as specified in the w option, before timing out. When wtimeoutMS is 0, write operations will never time out. MONGOC_URI_JOURNAL journal Controls whether write operations will wait until the mongod acknowledges the write operations and commits the data to the on disk journal. * true = Enables journal commit acknowledgement write concern. Equivalent to specifying the getLastError command with the j option enabled. * false = Does not require that mongod commit write operations to the journal before acknowledging the write operation. This is the default option for the journal parameter. ========================================== ================================= ======================================================================================================================================================================= .. _mongoc_uri_t_read_concern_options: Read Concern Options -------------------- ========================================== ================================= ========================================================================================================================================================================================================================= Constant Key Description ========================================== ================================= ========================================================================================================================================================================================================================= MONGOC_URI_READCONCERNLEVEL readconcernlevel The level of isolation for read operations. If the level is left unspecified, the server default will be used. See `readConcern in the MongoDB Manual `_ for details. ========================================== ================================= ========================================================================================================================================================================================================================= .. _mongoc_uri_t_read_prefs_options: Read Preference Options ----------------------- When connected to a replica set, the driver chooses which member to query using the read preference: #. Choose members whose type matches "readPreference". #. From these, if there are any tags sets configured, choose members matching the first tag set. If there are none, fall back to the next tag set and so on, until some members are chosen or the tag sets are exhausted. #. From the chosen servers, distribute queries randomly among the server with the fastest round-trip times. These include the server with the fastest time and any whose round-trip time is no more than "localThresholdMS" slower. ========================================== ================================= ======================================================================================================================================================================= Constant Key Description ========================================== ================================= ======================================================================================================================================================================= MONGOC_URI_READPREFERENCE readpreference Specifies the replica set read preference for this connection. This setting overrides any secondaryOk value. The read preference values are the following: * primary (default) * primaryPreferred * secondary * secondaryPreferred * nearest MONGOC_URI_READPREFERENCETAGS readpreferencetags A representation of a tag set. See also :ref:`mongoc-read-prefs-tag-sets`. MONGOC_URI_LOCALTHRESHOLDMS localthresholdms How far to distribute queries, beyond the server with the fastest round-trip time. By default, only servers within 15ms of the fastest round-trip time receive queries. MONGOC_URI_MAXSTALENESSSECONDS maxstalenessseconds The maximum replication lag, in wall clock time, that a secondary can suffer and still be eligible. The smallest allowed value for maxStalenessSeconds is 90 seconds. ========================================== ================================= ======================================================================================================================================================================= .. note:: When connecting to more than one mongos, libmongoc's localThresholdMS applies only to the selection of mongos servers. The threshold for selecting among replica set members in shards is controlled by the `mongos's localThreshold command line option `_. Legacy Options -------------- For historical reasons, the following options are available. They should however not be used. ========================================== ================================= ======================================================================================================================================================================= Constant Key Description ========================================== ================================= ======================================================================================================================================================================= MONGOC_URI_SAFE safe {true|false} Same as w={1|0} ========================================== ================================= ======================================================================================================================================================================= .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_uri_copy mongoc_uri_destroy mongoc_uri_get_auth_mechanism mongoc_uri_get_auth_source mongoc_uri_get_compressors mongoc_uri_get_database mongoc_uri_get_hosts mongoc_uri_get_mechanism_properties mongoc_uri_get_option_as_bool mongoc_uri_get_option_as_int32 mongoc_uri_get_option_as_int64 mongoc_uri_get_option_as_utf8 mongoc_uri_get_options mongoc_uri_get_password mongoc_uri_get_read_concern mongoc_uri_get_read_prefs_t mongoc_uri_get_replica_set mongoc_uri_get_server_monitoring_mode mongoc_uri_get_string mongoc_uri_get_srv_hostname mongoc_uri_get_srv_service_name mongoc_uri_get_tls mongoc_uri_get_username mongoc_uri_get_write_concern mongoc_uri_has_option mongoc_uri_new mongoc_uri_new_for_host_port mongoc_uri_new_with_error mongoc_uri_option_is_bool mongoc_uri_option_is_int32 mongoc_uri_option_is_int64 mongoc_uri_option_is_utf8 mongoc_uri_set_auth_mechanism mongoc_uri_set_auth_source mongoc_uri_set_compressors mongoc_uri_set_database mongoc_uri_set_mechanism_properties mongoc_uri_set_option_as_bool mongoc_uri_set_option_as_int32 mongoc_uri_set_option_as_int64 mongoc_uri_set_option_as_utf8 mongoc_uri_set_password mongoc_uri_set_read_concern mongoc_uri_set_read_prefs_t mongoc_uri_set_server_monitoring_mode mongoc_uri_set_username mongoc_uri_set_write_concern mongoc_uri_unescape mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_uri_unescape.rst000066400000000000000000000010521511661753600244400ustar00rootroot00000000000000:man_page: mongoc_uri_unescape mongoc_uri_unescape() ===================== Synopsis -------- .. code-block:: c char * mongoc_uri_unescape (const char *escaped_string); Parameters ---------- * ``escaped_string``: A utf8 encoded string. Description ----------- Unescapes an URI encoded string. For example, "%40" would become "@". Returns ------- Returns a newly allocated string that should be freed with :symbol:`bson:bson_free()`. If ``escaped_string`` contains an invalid UTF-8 character or an invalid escape sequence, returns ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_version.rst000066400000000000000000000021161511661753600234450ustar00rootroot00000000000000:man_page: mongoc_version Version Checks ============== Conditional compilation based on mongoc version Description ----------- The following preprocessor macros can be used to perform various checks based on the version of the library you are compiling against. This may be useful if you only want to enable a feature on a certain version of the library. .. parsed-literal:: #include #define MONGOC_MAJOR_VERSION (x) #define MONGOC_MINOR_VERSION (y) #define MONGOC_MICRO_VERSION (z) #define MONGOC_VERSION_S "x.y.z" #define MONGOC_VERSION_HEX ((1 << 24) | (0 << 16) | (0 << 8) | 0) #define MONGOC_CHECK_VERSION(major, minor, micro) Only compile a block on MongoDB C Driver 1.1.0 and newer. .. code-block:: c #if MONGOC_CHECK_VERSION(1, 1, 0) static void do_something (void) { } #endif .. only:: html Run-Time Version Checks ----------------------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_check_version mongoc_get_major_version mongoc_get_micro_version mongoc_get_minor_version mongoc_get_version mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_append.rst000066400000000000000000000015621511661753600261540ustar00rootroot00000000000000:man_page: mongoc_write_concern_append mongoc_write_concern_append() ============================= Synopsis -------- .. code-block:: c bool mongoc_write_concern_append (mongoc_write_concern_t *write_concern, bson_t *command); Parameters ---------- * ``write_concern``: A pointer to a :symbol:`mongoc_write_concern_t`. * ``command``: A pointer to a :symbol:`bson:bson_t`. Description ----------- This function appends a write concern to command options. It is useful for appending a write concern to command options before passing them to :symbol:`mongoc_client_write_command_with_opts` or a related function that takes an options document. Returns ------- Returns true on success. If any arguments are invalid, returns false and logs an error. Example ------- See the example code for :symbol:`mongoc_client_write_command_with_opts`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_copy.rst000066400000000000000000000010421511661753600256500ustar00rootroot00000000000000:man_page: mongoc_write_concern_copy mongoc_write_concern_copy() =========================== Synopsis -------- .. code-block:: c mongoc_write_concern_t * mongoc_write_concern_copy (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Performs a deep copy of ``write_concern``. Returns ------- Returns a newly allocated copy of ``write_concern`` that should be freed with :symbol:`mongoc_write_concern_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_destroy.rst000066400000000000000000000006641511661753600264000ustar00rootroot00000000000000:man_page: mongoc_write_concern_destroy mongoc_write_concern_destroy() ============================== Synopsis -------- .. code-block:: c void mongoc_write_concern_destroy (mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Frees all resources associated with the write concern structure. Does nothing if ``write_concern`` is NULL. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_journal.rst000066400000000000000000000007441511661753600272170ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_journal mongoc_write_concern_get_journal() ================================== Synopsis -------- .. code-block:: c bool mongoc_write_concern_get_journal (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Fetches if the write should be journaled before indicating success. Returns ------- Returns true if the write should be journaled. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_w.rst000066400000000000000000000010051511661753600260020ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_w mongoc_write_concern_get_w() ============================ Synopsis -------- .. code-block:: c int32_t mongoc_write_concern_get_w (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Fetches the ``w`` parameter of the write concern. Returns ------- Returns an integer containing the ``w`` value. If wmajority is set, this would be ``MONGOC_WRITE_CONCERN_W_MAJORITY``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_wmajority.rst000066400000000000000000000007721511661753600275730ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_wmajority mongoc_write_concern_get_wmajority() ==================================== Synopsis -------- .. code-block:: c bool mongoc_write_concern_get_wmajority ( const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Fetches if the write should be written to a majority of nodes before indicating success. Returns ------- Returns true if wmajority is set. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_wtag.rst000066400000000000000000000010071511661753600265000ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_wtag mongoc_write_concern_get_wtag() =============================== Synopsis -------- .. code-block:: c const char * mongoc_write_concern_get_wtag (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- A string containing the wtag setting if it has been set. Otherwise returns ``NULL``. Returns ------- Returns a string which should not be modified or freed, or ``NULL``. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_wtimeout.rst000066400000000000000000000012741511661753600274210ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_wtimeout mongoc_write_concern_get_wtimeout() =================================== Synopsis -------- .. code-block:: c int32_t mongoc_write_concern_get_wtimeout (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Get the timeout in milliseconds that the server should wait before returning with a write concern timeout. A value of 0 indicates no write timeout. Returns ------- Returns an 32-bit signed integer containing the timeout. .. seealso:: | :symbol:`mongoc_write_concern_set_wtimeout` and :symbol:`mongoc_write_concern_get_wtimeout_int64`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_get_wtimeout_int64.rst000066400000000000000000000012431511661753600304410ustar00rootroot00000000000000:man_page: mongoc_write_concern_get_wtimeout_int64 mongoc_write_concern_get_wtimeout_int64() ========================================= Synopsis -------- .. code-block:: c int64_t mongoc_write_concern_get_wtimeout_int64 (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Get the timeout in milliseconds that the server should wait before returning with a write concern timeout. A value of 0 indicates no write timeout. Returns ------- Returns a 64-bit signed integer containing the timeout. .. seealso:: | :symbol:`mongoc_write_concern_set_wtimeout_int64`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_is_acknowledged.rst000066400000000000000000000010311511661753600300160ustar00rootroot00000000000000:man_page: mongoc_write_concern_is_acknowledged mongoc_write_concern_is_acknowledged() ====================================== Synopsis -------- .. code-block:: c bool mongoc_write_concern_is_acknowledged ( const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Test if this is an acknowledged or unacknowledged write concern. If ``write_concern`` is NULL, returns true. (In other words, writes are acknowledged by default.) mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_is_default.rst000066400000000000000000000012601511661753600270170ustar00rootroot00000000000000:man_page: mongoc_write_concern_is_default mongoc_write_concern_is_default() ================================= Synopsis -------- .. code-block:: c bool mongoc_write_concern_is_default (mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A pointer to a :symbol:`mongoc_write_concern_t`. Description ----------- Returns true if ``write_concern`` has not been modified from the default. For example, if no "w" option is set in the MongoDB URI and you have not called :symbol:`mongoc_client_set_write_concern()`, then :symbol:`mongoc_write_concern_is_default()` is true for the write concern returned by :symbol:`mongoc_client_get_write_concern()`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_is_valid.rst000066400000000000000000000006261511661753600264770ustar00rootroot00000000000000:man_page: mongoc_write_concern_is_valid mongoc_write_concern_is_valid() =============================== Synopsis -------- .. code-block:: c bool mongoc_write_concern_is_valid (const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Test if this write concern uses an invalid combination of options. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_journal_is_set.rst000066400000000000000000000007241511661753600277240ustar00rootroot00000000000000:man_page: mongoc_write_concern_journal_is_set mongoc_write_concern_journal_is_set() ===================================== Synopsis -------- .. code-block:: c bool mongoc_write_concern_journal_is_set ( const mongoc_write_concern_t *write_concern); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. Description ----------- Test whether this write concern's "journal" option was explicitly set or uses the default setting. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_new.rst000066400000000000000000000006061511661753600254740ustar00rootroot00000000000000:man_page: mongoc_write_concern_new mongoc_write_concern_new() ========================== Synopsis -------- .. code-block:: c mongoc_write_concern_t * mongoc_write_concern_new (void); Returns ------- Creates a newly allocated write concern that can be configured based on user preference. This should be freed with :symbol:`mongoc_write_concern_destroy()` when no longer in use. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_journal.rst000066400000000000000000000014031511661753600272240ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_journal mongoc_write_concern_set_journal() ================================== Synopsis -------- .. code-block:: c void mongoc_write_concern_set_journal (mongoc_write_concern_t *write_concern, bool journal); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``journal``: A boolean. Description ----------- Sets if the write must have been journaled before indicating success. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_w.rst000066400000000000000000000023341511661753600260240ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_w mongoc_write_concern_set_w() ============================ Synopsis -------- .. code-block:: c void mongoc_write_concern_set_w (mongoc_write_concern_t *write_concern, int32_t w); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``w``: Use ``MONGOC_WRITE_CONCERN_W_DEFAULT``, ``MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED``, ``MONGOC_WRITE_CONCERN_W_MAJORITY``, or a positive integer. Description ----------- Sets the ``w`` value for the write concern. See :symbol:`mongoc_write_concern_t` for more information on this setting. Unacknowledged writes are not causally consistent. If you execute a write operation with a :symbol:`mongoc_write_concern_t` on which you have called :symbol:`mongoc_write_concern_set_w` with a value of ``MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED``, the write does not participate in causal consistency, even when executed with a :symbol:`mongoc_client_session_t`. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_wmajority.rst000066400000000000000000000022131511661753600275770ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_wmajority mongoc_write_concern_set_wmajority() ==================================== Synopsis -------- .. code-block:: c void mongoc_write_concern_set_wmajority (mongoc_write_concern_t *write_concern, int32_t wtimeout_msec); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``wtimeout_msec``: A positive ``int32_t`` or zero. If you need to set wtimeout with an ``int64_t``, use :symbol:`mongoc_write_concern_set_wtimeout_int64`. Description ----------- Sets if the write must have been propagated to a majority of nodes before indicating write success. The timeout specifies how long, in milliseconds, the server should wait before indicating that the write has failed. This is not the same as a socket timeout. A value of zero may be used to indicate no timeout. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_wtag.rst000066400000000000000000000016451511661753600265240ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_wtag mongoc_write_concern_set_wtag() =============================== Synopsis -------- .. code-block:: c void mongoc_write_concern_set_wtag (mongoc_write_concern_t *write_concern, const char *tag); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``tag``: A string containing the write tag. Description ----------- Sets the write tag that must be satisfied for the write to indicate success. Write tags are preset write concerns configured on your MongoDB server. See :symbol:`mongoc_write_concern_t` for more information on this setting. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_wtimeout.rst000066400000000000000000000020631511661753600274320ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_wtimeout mongoc_write_concern_set_wtimeout() =================================== Synopsis -------- .. code-block:: c void mongoc_write_concern_set_wtimeout (mongoc_write_concern_t *write_concern, int32_t wtimeout_msec); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``wtimeout_msec``: A positive ``int32_t`` or zero. Description ----------- Set the timeout in milliseconds that the server should wait before returning with a write concern timeout. This is not the same as a socket timeout. A value of zero may be used to indicate no write concern timeout. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. .. seealso:: | :symbol:`mongoc_write_concern_get_wtimeout` and :symbol:`mongoc_write_concern_set_wtimeout_int64`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_set_wtimeout_int64.rst000066400000000000000000000020421511661753600304530ustar00rootroot00000000000000:man_page: mongoc_write_concern_set_wtimeout_int64 mongoc_write_concern_set_wtimeout_int64() ========================================= Synopsis -------- .. code-block:: c void mongoc_write_concern_set_wtimeout_int64 (mongoc_write_concern_t *write_concern, int64_t wtimeout_msec); Parameters ---------- * ``write_concern``: A :symbol:`mongoc_write_concern_t`. * ``wtimeout_msec``: A positive ``int64_t`` or zero. Description ----------- Set the timeout in milliseconds that the server should wait before returning with a write concern timeout. This is not the same as a socket timeout. A value of zero may be used to indicate no write concern timeout. Beginning in version 1.9.0, this function can now alter the write concern after it has been used in an operation. Previously, using the struct with an operation would mark it as "frozen" and calling this function would log a warning instead instead of altering the write concern. .. seealso:: | :symbol:`mongoc_write_concern_get_wtimeout_int64`. mongo-c-driver-2.2.1/src/libmongoc/doc/mongoc_write_concern_t.rst000066400000000000000000000065211511661753600251500ustar00rootroot00000000000000:man_page: mongoc_write_concern_t mongoc_write_concern_t ====================== Write Concern abstraction Synopsis -------- ``mongoc_write_concern_t`` tells the driver what level of acknowledgement to await from the server. The default, MONGOC_WRITE_CONCERN_W_DEFAULT, is right for the great majority of applications. You can specify a write concern on connection objects, database objects, collection objects, or per-operation. Data-modifying operations typically use the write concern of the object they operate on, and check the server response for a write concern error or write concern timeout. For example, :symbol:`mongoc_collection_drop_index` uses the collection's write concern, and a write concern error or timeout in the response is considered a failure. Exceptions to this principle are the generic command functions: * :symbol:`mongoc_client_command_simple` * :symbol:`mongoc_database_command_simple` * :symbol:`mongoc_collection_command_simple` These generic command functions do not automatically apply a write concern, and they do not check the server response for a write concern error or write concern timeout. See `Write Concern `_ on the MongoDB website for more information. Write Concern Levels -------------------- Set the write concern level with :symbol:`mongoc_write_concern_set_w`. ========================================== =============================================================================================================================================================================================================== MONGOC_WRITE_CONCERN_W_DEFAULT (1) By default, writes block awaiting acknowledgement from MongoDB. Acknowledged write concern allows clients to catch network, duplicate key, and other errors. MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED (0) With this write concern, MongoDB does not acknowledge the receipt of write operation. Unacknowledged is similar to errors ignored; however, mongoc attempts to receive and handle network errors when possible. MONGOC_WRITE_CONCERN_W_MAJORITY (majority) Block until a write has been propagated to a majority of the nodes in the replica set. n Block until a write has been propagated to at least ``n`` nodes in the replica set. ========================================== =============================================================================================================================================================================================================== .. only:: html Functions --------- .. toctree:: :titlesonly: :maxdepth: 1 mongoc_write_concern_append mongoc_write_concern_copy mongoc_write_concern_destroy mongoc_write_concern_get_journal mongoc_write_concern_get_w mongoc_write_concern_get_wmajority mongoc_write_concern_get_wtag mongoc_write_concern_get_wtimeout mongoc_write_concern_get_wtimeout_int64 mongoc_write_concern_is_acknowledged mongoc_write_concern_is_default mongoc_write_concern_is_valid mongoc_write_concern_journal_is_set mongoc_write_concern_new mongoc_write_concern_set_journal mongoc_write_concern_set_w mongoc_write_concern_set_wmajority mongoc_write_concern_set_wtag mongoc_write_concern_set_wtimeout mongoc_write_concern_set_wtimeout_int64 mongo-c-driver-2.2.1/src/libmongoc/doc/static/000077500000000000000000000000001511661753600211535ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/doc/static/styles.css000066400000000000000000000053011511661753600232070ustar00rootroot00000000000000/** * Propagate admonition colors into the styled element via a custom property */ .admonition.caution { --admon-title-color: var(--color-admonition-title--caution); } .admonition.warning { --admon-title-color: var(--color-admonition-title--warning); } .admonition.danger { --admon-title-color: var(--color-admonition-title--danger); } .admonition.attention { --admon-title-color: var(--color-admonition-title--attention); } .admonition.error { --admon-title-color: var(--color-admonition-title--error); } .admonition.hint { --admon-title-color: var(--color-admonition-title--hint); } .admonition.tip { --admon-title-color: var(--color-admonition-title--tip); } .admonition.important { --admon-title-color: var(--color-admonition-title--important); } .admonition.note { --admon-title-color: var(--color-admonition-title--note); } .admonition.seealso { --admon-title-color: var(--color-admonition-title--seealso); } .admonition.todo { --admon-title-color: var(--color-admonition-title--todo); } /* Style for "bolded name" inline spans */ code.bolded-name.literal>span.pre { font-weight: bold; font-size: 110%; } /* Prevent word breaks within inline code, which makes it very difficult to read */ p .sig-inline, p code.literal { white-space: nowrap; } /* Allow styling of dropdowns as admonitions */ details.sd-dropdown.sd-card.admonition { padding: 0; /* Override the border: none for closed dropdowns */ border-left: 0.2rem solid var(--admon-title-color) !important; /* Inset dropdowns to visually distinguish them from regular admonitions */ margin: 0 1rem; } details.sd-dropdown.admonition>summary.sd-summary-title { padding: 0.5rem 2rem; } details.sd-dropdown.admonition>summary.sd-summary-title>div:is(.sd-summary-down, .sd-summary-up) { height: 1rem; position: absolute; width: 1rem; top: 0.75em } /* Replicate the style that causes admonition icons from Furo, onto the dropdown headers */ details.sd-dropdown.admonition>summary.sd-summary-title::before { content: ""; height: 1rem; left: .5rem; position: absolute; width: 1rem; } /* Fix: sphinx-design is doing nonsense with the cursor property */ details.sd-dropdown { cursor: initial; } details.sd-dropdown>.sd-card-header { cursor: pointer; } details.sd-dropdown>.sd-card-body.sd-summary-content { cursor: initial; } /* Fix: Furo doesn't indent footnote elements other than 'p' */ aside.footnote> :not(:first-child) { margin-left: 2rem; } /* Pygments does not set an .nv color for body[data-theme="light"], which makes them a bit indistinguishable. */ body[data-theme="light"] .highlight .nv { color: #0004ff; } a.reference.external::after { content: "⇗"; font-weight: bolder; font-size: 80%; }mongo-c-driver-2.2.1/src/libmongoc/doc/structured_log.rst000066400000000000000000000117331511661753600234700ustar00rootroot00000000000000:man_page: mongoc_structured_log Structured Logging ================== This document describes a newer "structured" logging facility which reports messages from the driver itself using a BSON format defined across driver implementations by the `MongoDB Logging Specification `_. See :doc:`unstructured_log` for the original freeform logging facility. These two systems are configured and used independently. Unstructured logging is global to the entire process, but structured logging is configured separately for each :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t`. See :symbol:`mongoc_client_set_structured_log_opts` and :symbol:`mongoc_client_pool_set_structured_log_opts`. Options ------- Structured log settings are tracked explicitly by a :symbol:`mongoc_structured_log_opts_t` instance. Like other drivers supporting structured logging, we take default settings from environment variables and offer additional optional programmatic configuration. Environment variables are captured during :symbol:`mongoc_structured_log_opts_new`, refer there for a full list of the supported variables. Normally environment variables provide defaults that can be overridden programmatically. To request the opposite behavior, where your programmatic defaults can be overridden by the environment, see :symbol:`mongoc_structured_log_opts_set_max_levels_from_env`. Structured log messages may be filtered in arbitrary ways by the handler, but as both a performance optimization and a convenience, a built-in filter limits the maximum log level of reported messages with a per-component setting. .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_opts_t Levels and Components --------------------- Log levels and components are defined as :symbol:`mongoc_structured_log_level_t` and :symbol:`mongoc_structured_log_component_t` enumerations. Utilities are provided to convert between these values and their standard string representations. The string values are case-insensitive. .. code-block:: c typedef enum { MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY = 0, // "Emergency" ("off" also accepted) MONGOC_STRUCTURED_LOG_LEVEL_ALERT = 1, // "Alert" MONGOC_STRUCTURED_LOG_LEVEL_CRITICAL = 2, // "Critical" MONGOC_STRUCTURED_LOG_LEVEL_ERROR = 3, // "Error" MONGOC_STRUCTURED_LOG_LEVEL_WARNING = 4, // "Warning" ("warn" also accepted) MONGOC_STRUCTURED_LOG_LEVEL_NOTICE = 5, // "Notice" MONGOC_STRUCTURED_LOG_LEVEL_INFO = 6, // "Informational" ("info" also accepted) MONGOC_STRUCTURED_LOG_LEVEL_DEBUG = 7, // "Debug" MONGOC_STRUCTURED_LOG_LEVEL_TRACE = 8, // "Trace" } mongoc_structured_log_level_t; typedef enum { MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND = 0, // "command" MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY = 1, // "topology" MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION = 2, // "serverSelection" MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION = 3, // "connection" } mongoc_structured_log_component_t; .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_level_t mongoc_structured_log_component_t .. seealso:: mongoc_structured_log_get_level_name mongoc_structured_log_get_named_level mongoc_structured_log_get_component_name mongoc_structured_log_get_named_component Log Handlers ------------ Each :symbol:`mongoc_client_pool_t` or standalone :symbol:`mongoc_client_t` has its own instance of the structured logging subsystem, with its own settings and handler. When using :symbol:`mongoc_client_pool_t`, the pooled clients all share a common logging instance. Handlers must be thread-safe. The handler is called for each log entry with a level no greater than its component's maximum. A :symbol:`mongoc_structured_log_entry_t` pointer provides access to further details, during the handler only. Handlers must take care not to re-enter ``libmongoc`` with the same :symbol:`mongoc_client_t` or :symbol:`mongoc_client_pool_t` that the handler has been called by. .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_func_t Log Entries ----------- Each log entry is represented within the handler by a short-lived :symbol:`mongoc_structured_log_entry_t` pointer. During the handler, this pointer can be used to access the individual properties of an entry: its level, component, and message. The message will be assembled as a :symbol:`bson_t` only when explicitly requested by a call to :symbol:`mongoc_structured_log_entry_message_as_bson`. This results in a standalone document that may be retained for any amount of time and must be explicitly destroyed. .. toctree:: :titlesonly: :maxdepth: 1 mongoc_structured_log_entry_t Example ------- .. literalinclude:: ../examples/example-structured-log.c :language: c :caption: example-structured-log.c .. seealso:: mongoc_structured_log_entry_get_component mongoc_structured_log_entry_get_level mongoc_structured_log_entry_message_as_bson mongo-c-driver-2.2.1/src/libmongoc/doc/unstructured_log.rst000066400000000000000000000100761511661753600240320ustar00rootroot00000000000000:man_page: mongoc_unstructured_log Unstructured Logging ==================== This is the original logging facility that supports freeform string messages originating from the driver itself or from application code. This has been retroactively termed "unstructured logging". See :doc:`structured_log` for the newer standardized logging facility. .. code-block:: c typedef enum { MONGOC_LOG_LEVEL_ERROR, MONGOC_LOG_LEVEL_CRITICAL, MONGOC_LOG_LEVEL_WARNING, MONGOC_LOG_LEVEL_MESSAGE, MONGOC_LOG_LEVEL_INFO, MONGOC_LOG_LEVEL_DEBUG, MONGOC_LOG_LEVEL_TRACE, } mongoc_log_level_t; #define MONGOC_ERROR(...) #define MONGOC_CRITICAL(...) #define MONGOC_WARNING(...) #define MONGOC_MESSAGE(...) #define MONGOC_INFO(...) #define MONGOC_DEBUG(...) typedef void (*mongoc_log_func_t) (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); void mongoc_log_set_handler (mongoc_log_func_t log_func, void *user_data); void mongoc_log (mongoc_log_level_t log_level, const char *log_domain, const char *format, ...); const char * mongoc_log_level_str (mongoc_log_level_t log_level); void mongoc_log_default_handler (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); void mongoc_log_trace_enable (void); void mongoc_log_trace_disable (void); This abstraction can be used for logging in your application, or you can integrate the driver with an existing logging system. Macros ------ To make logging a little less painful, various helper macros are provided. See the following example. .. code-block:: c #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "my-custom-domain" MONGOC_WARNING ("An error occurred: %s", strerror (errno)); .. _custom_log_handlers: Custom Log Handlers ------------------- The default log handler prints a timestamp and the log message to ``stdout``, or to ``stderr`` for warnings, critical messages, and errors. You can override the handler with ``mongoc_log_set_handler()``. Your handler function is called in a mutex for thread safety. For example, you could register a custom handler to suppress messages at INFO level and below: .. code-block:: c void my_logger (mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { /* smaller values are more important */ if (log_level < MONGOC_LOG_LEVEL_INFO) { mongoc_log_default_handler (log_level, log_domain, message, user_data); } } int main (int argc, char *argv[]) { mongoc_log_set_handler (my_logger, NULL); mongoc_init (); /* ... your code ... */ mongoc_cleanup (); return 0; } Note that in the example above ``mongoc_log_set_handler()`` is called before ``mongoc_init()``. Otherwise, some log traces could not be processed by the log handler. To restore the default handler: .. code-block:: c mongoc_log_set_handler (mongoc_log_default_handler, NULL); Disable logging --------------- To disable all logging, including warnings, critical messages and errors, provide an empty log handler: .. code-block:: c mongoc_log_set_handler (NULL, NULL); Tracing ------- If compiling your own copy of the MongoDB C driver, consider configuring with ``-DENABLE_TRACING=ON`` to enable function tracing and hex dumps of network packets to ``STDERR`` and ``STDOUT`` during development and debugging. This is especially useful when debugging what may be going on internally in the driver. Trace messages can be enabled and disabled by calling ``mongoc_log_trace_enable()`` and ``mongoc_log_trace_disable()`` .. note:: Compiling the driver with ``-DENABLE_TRACING=ON`` will affect its performance. Disabling tracing with ``mongoc_log_trace_disable()`` significantly reduces the overhead, but cannot remove it completely. mongo-c-driver-2.2.1/src/libmongoc/etc/000077500000000000000000000000001511661753600176725ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/etc/mongocConfig.cmake.in000066400000000000000000000122441511661753600237140ustar00rootroot00000000000000#[[ CMake package file for the mongoc library. This file globs and includes all "*-targets.cmake" files in the containing directory, and intends that those files define the actual mongoc targets. This file also defines a `mongoc::mongoc` target, which redirects to either `mongoc::static` or `mongoc::shared` depending on what type of library is available and can be controlled with an import-time CMake setting. If the installation has a static library, it is named `mongoc::static`. If the installation has a shared (dynamic) library, it is named `mongoc::shared`. ]] # The version of the mongoc package (comes from the project() call in the orginal project) set(__mongoc_package_version [[@PROJECT_VERSION@]]) set(__mongoc_sasl_backend [[@SASL_BACKEND@]]) set(__mongoc_tls_package [[@TLS_IMPORT_PACKAGE@]]) set(__mongoc_uses_bundled_utf8proc "@USE_BUNDLED_UTF8PROC@") # Announce this one as a public var: set(MONGOC_TLS_BACKEND [[@TLS_BACKEND@]]) # Check for missing components before proceeding. We don't provide any, so we # should generate an error if the caller requests any *required* components. set(missing_required_components) foreach(comp IN LISTS mongoc_FIND_COMPONENTS) if(mongoc_FIND_REQUIRED_${comp}) list(APPEND missing_required_components "${comp}") endif() endforeach() if(missing_required_components) list(JOIN missing_required_components ", " components) set(mongoc_FOUND FALSE) set(mongoc_NOT_FOUND_MESSAGE "The package version is compatible, but is missing required components: ${components}") # Stop now. Don't generate any imported targets return() endif() # d8888b. d88888b d8888b. d88888b d8b db d8888b. d88888b d8b db .o88b. d888888b d88888b .d8888. # 88 `8D 88' 88 `8D 88' 888o 88 88 `8D 88' 888o 88 d8P Y8 `88' 88' 88' YP # 88 88 88ooooo 88oodD' 88ooooo 88V8o 88 88 88 88ooooo 88V8o 88 8P 88 88ooooo `8bo. # 88 88 88~~~~~ 88~~~ 88~~~~~ 88 V8o88 88 88 88~~~~~ 88 V8o88 8b 88 88~~~~~ `Y8b. # 88 .8D 88. 88 88. 88 V888 88 .8D 88. 88 V888 Y8b d8 .88. 88. db 8D # Y8888D' Y88888P 88 Y88888P VP V8P Y8888D' Y88888P VP V8P `Y88P' Y888888P Y88888P `8888Y' # Import dependencies include(CMakeFindDependencyMacro) get_filename_component(__parent_dir "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) # Also import the `bson` package, to ensure its targets are also available find_dependency(bson "${__mongoc_package_version}" HINTS ${__parent_dir}) # QUIET arg for finding dependencies: unset(__quiet) if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) set(__quiet QUIET) endif() # Find libutf8proc (if we linked to an external library) if(NOT __mongoc_uses_bundled_utf8proc AND NOT TARGET PkgConfig::PC_UTF8PROC) # libmongoc was compiled against an external utf8proc and links against a # FindPkgConfig-generated IMPORTED target. Find that package and generate that # imported target here: find_dependency(PkgConfig) pkg_check_modules(PC_UTF8PROC ${__quiet} libutf8proc IMPORTED_TARGET GLOBAL) if(NOT PC_UTF8PROC_FOUND) # Handle if it wasn't found (find_dependency would usually do this for us, # but pkg_check_modules() does not) set(mongoc_FOUND FALSE) set(mongoc_NOT_FOUND_MESSAGE "We were unable to find the required libutf8proc package with pkg-config") return() endif() endif() # If we need to import a TLS package for our imported targets, do that now: if(__mongoc_tls_package) find_dependency("${__mongoc_tls_package}") endif() # Find dependencies for SASL if(__mongoc_sasl_backend STREQUAL "Cyrus") # We need libsasl2. The find-module should be installed within this package. # temporarily place it on the module search path: set(__prev_path "${CMAKE_MODULE_PATH}") list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/3rdParty") find_dependency(SASL2 2.0) set(CMAKE_MODULE_PATH "${__prev_path}") endif() # Import the target files that will be installed alongside this file. Only the # targets of libraries that were actually installed alongside this file will be imported file(GLOB __targets_files "${CMAKE_CURRENT_LIST_DIR}/*-targets.cmake") foreach(__file IN LISTS __targets_files) include("${__file}") endforeach() # The library type that is linked with `mongoc::mongoc` set(__default_lib_type SHARED) if(TARGET mongoc::static) # If static is available, set it as the default library type set(__default_lib_type STATIC) endif() # Allow the user to tweak what library type is linked for `mongoc::mongoc` set(MONGOC_DEFAULT_IMPORTED_LIBRARY_TYPE "${__default_lib_type}" CACHE STRING "The default library type that is used when linking against 'mongoc::mongoc' (either SHARED or STATIC, requires that the package was built with the appropriate library type)") set_property(CACHE MONGOC_DEFAULT_IMPORTED_LIBRARY_TYPE PROPERTY STRINGS SHARED STATIC) if(NOT TARGET mongoc::mongoc) # Don't redefine the target if we were already included string(TOLOWER "${MONGOC_DEFAULT_IMPORTED_LIBRARY_TYPE}" __type) add_library(mongoc::mongoc IMPORTED INTERFACE) set_property(TARGET mongoc::mongoc APPEND PROPERTY INTERFACE_LINK_LIBRARIES mongoc::${__type}) endif() mongo-c-driver-2.2.1/src/libmongoc/examples/000077500000000000000000000000001511661753600207355ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/.gitignore000066400000000000000000000000471511661753600227260ustar00rootroot00000000000000cmake_install.cmake hello_mongoc build mongo-c-driver-2.2.1/src/libmongoc/examples/aggregation/000077500000000000000000000000001511661753600232245ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/aggregation/aggregation1.c000066400000000000000000000044131511661753600257420ustar00rootroot00000000000000#include #include static void print_pipeline(mongoc_collection_t *collection) { mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; bson_t *pipeline; char *str; pipeline = BCON_NEW("pipeline", "[", "{", "$group", "{", "_id", "$state", "total_pop", "{", "$sum", "$pop", "}", "}", "}", "{", "$match", "{", "total_pop", "{", "$gte", BCON_INT32(10000000), "}", "}", "}", "]"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); while (mongoc_cursor_next(cursor, &doc)) { str = bson_as_canonical_extended_json(doc, NULL); printf("%s\n", str); bson_free(str); } if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "Cursor Failure: %s\n", error.message); } mongoc_cursor_destroy(cursor); bson_destroy(pipeline); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost:27017/?appname=aggregation-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "zipcodes"); print_pipeline(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/000077500000000000000000000000001511661753600243655ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/basic-aggregation.c000066400000000000000000000060351511661753600301030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "../doc-common-insert.c" #include "./constants.c" #include "./distinct.c" #include "./map-reduce-advanced.c" #include "./map-reduce-basic.c" #include #include int main(int argc, char *argv[]) { mongoc_database_t *database = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *collection = NULL; mongoc_uri_t *uri = NULL; bson_error_t error; char *host_and_port = NULL; int exit_code = EXIT_FAILURE; if (argc != 2) { fprintf(stderr, "usage: %s CONNECTION-STRING\n", argv[0]); fprintf(stderr, "the connection string can be of the following forms:\n"); fprintf(stderr, "localhost\t\t\t\tlocal machine\n"); fprintf(stderr, "localhost:27018\t\t\t\tlocal machine on port 27018\n"); fprintf(stderr, "mongodb://user:pass@localhost:27017\t" "local machine on port 27017, and authenticate with username " "user and password pass\n"); return exit_code; } mongoc_init(); if (strncmp(argv[1], "mongodb://", 10) == 0) { host_and_port = bson_strdup(argv[1]); } else { host_and_port = bson_strdup_printf("mongodb://%s", argv[1]); } uri = mongoc_uri_new_with_error(host_and_port, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", host_and_port, error.message); goto cleanup; } client = mongoc_client_new_from_uri(uri); if (!client) { goto cleanup; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "test"); collection = mongoc_database_get_collection(database, COLLECTION_NAME); printf("Inserting data\n"); if (!insert_data(collection)) { goto cleanup; } printf("distinct\n"); if (!distinct(database)) { goto cleanup; } printf("map reduce\n"); if (!map_reduce_basic(database)) { goto cleanup; } printf("more complicated map reduce\n"); if (!map_reduce_advanced(database)) { goto cleanup; } exit_code = EXIT_SUCCESS; cleanup: if (collection) { mongoc_collection_destroy(collection); } if (database) { mongoc_database_destroy(database); } if (client) { mongoc_client_destroy(client); } if (uri) { mongoc_uri_destroy(uri); } if (host_and_port) { bson_free(host_and_port); } mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/constants.c000066400000000000000000000016031511661753600265450ustar00rootroot00000000000000const char *const COLLECTION_NAME = "things"; /* Our map function just emits a single (key, 1) pair for each tag in the array: */ const char *const MAPPER = "function () {" "this.tags.forEach(function(z) {" "emit(z, 1);" "});" "}"; /* The reduce function sums over all of the emitted values for a given key: */ const char *const REDUCER = "function (key, values) {" "var total = 0;" "for (var i = 0; i < values.length; i++) {" "total += values[i];" "}" "return total;" "}"; /* Note We can't just return values.length as the reduce function might be called iteratively on the results of other reduce steps. */ mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/distinct.c000066400000000000000000000025231511661753600263540ustar00rootroot00000000000000bool distinct(mongoc_database_t *database) { bson_t *command; bson_t reply; bson_error_t error; bool res; bson_iter_t iter; bson_iter_t array_iter; double val; command = BCON_NEW("distinct", BCON_UTF8(COLLECTION_NAME), "key", BCON_UTF8("x"), "query", "{", "x", "{", "$gt", BCON_DOUBLE(1.0), "}", "}"); res = mongoc_database_command_simple(database, command, NULL, &reply, &error); if (!res) { fprintf(stderr, "Error with distinct: %s\n", error.message); goto cleanup; } /* Do something with reply (in this case iterate through the values) */ if (!(bson_iter_init_find(&iter, &reply, "values") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &array_iter))) { fprintf(stderr, "Couldn't extract \"values\" field from response\n"); goto cleanup; } while (bson_iter_next(&array_iter)) { if (BSON_ITER_HOLDS_DOUBLE(&array_iter)) { val = bson_iter_double(&array_iter); printf("Next double: %f\n", val); } } cleanup: /* cleanup */ bson_destroy(command); bson_destroy(&reply); return res; } mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/map-reduce-advanced.c000066400000000000000000000021311511661753600303130ustar00rootroot00000000000000bool map_reduce_advanced(mongoc_database_t *database) { bson_t *command; bson_error_t error; bool res = true; mongoc_read_prefs_t *read_pref; bson_t doc; /* Construct the mapReduce command */ /* Other arguments can also be specified here, like "query" or "limit" and so on */ /* Read the results inline from a secondary replica */ command = BCON_NEW("mapReduce", BCON_UTF8(COLLECTION_NAME), "map", BCON_CODE(MAPPER), "reduce", BCON_CODE(REDUCER), "out", "{", "inline", BCON_INT32(1), "}"); read_pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); if (mongoc_database_command_simple(database, command, read_pref, &doc, &error)) { print_res(&doc); } else { fprintf(stderr, "ERROR: %s\n", error.message); res = false; } mongoc_read_prefs_destroy(read_pref); bson_destroy(command); bson_destroy(&doc); return res; } mongo-c-driver-2.2.1/src/libmongoc/examples/basic_aggregation/map-reduce-basic.c000066400000000000000000000036421511661753600276370ustar00rootroot00000000000000bool map_reduce_basic(mongoc_database_t *database) { bson_t reply; bool res = false; bson_error_t error; mongoc_cursor_t *cursor = NULL; bool query_done = false; const char *out_collection_name = "outCollection"; mongoc_collection_t *out_collection = NULL; /* Empty find query */ bson_t find_query = BSON_INITIALIZER; /* Construct the mapReduce command */ /* Other arguments can also be specified here, like "query" or "limit" and so on */ bson_t *const command = BCON_NEW("mapReduce", BCON_UTF8(COLLECTION_NAME), "map", BCON_CODE(MAPPER), "reduce", BCON_CODE(REDUCER), "out", BCON_UTF8(out_collection_name)); res = mongoc_database_command_simple(database, command, NULL, &reply, &error); if (!res) { fprintf(stderr, "MapReduce failed: %s\n", error.message); goto cleanup; } /* Do something with the reply (it doesn't contain the mapReduce results) */ print_res(&reply); /* Now we'll query outCollection to see what the results are */ out_collection = mongoc_database_get_collection(database, out_collection_name); cursor = mongoc_collection_find_with_opts(out_collection, &find_query, NULL, NULL); query_done = true; /* Do something with the results */ const bson_t *doc = NULL; while (mongoc_cursor_next(cursor, &doc)) { print_res(doc); } if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "ERROR: %s\n", error.message); res = false; goto cleanup; } cleanup: /* cleanup */ if (query_done) { mongoc_cursor_destroy(cursor); mongoc_collection_destroy(out_collection); } bson_destroy(&reply); bson_destroy(command); return res; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/000077500000000000000000000000001511661753600216725ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk-collation.c000066400000000000000000000044631511661753600247640ustar00rootroot00000000000000#include #include static void bulk_collation(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; bson_t *opts; bson_t *doc; bson_t *selector; bson_t *update; bson_error_t error; bson_t reply; char *str; uint32_t ret; /* insert {_id: "one"} and {_id: "One"} */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); doc = BCON_NEW("_id", BCON_UTF8("one")); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); doc = BCON_NEW("_id", BCON_UTF8("One")); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); /* "One" normally sorts before "one"; make "one" come first */ opts = BCON_NEW("collation", "{", "locale", BCON_UTF8("en_US"), "caseFirst", BCON_UTF8("lower"), "}"); /* set x=1 on the document with _id "One", which now sorts after "one" */ update = BCON_NEW("$set", "{", "x", BCON_INT64(1), "}"); selector = BCON_NEW("_id", "{", "$gt", BCON_UTF8("one"), "}"); mongoc_bulk_operation_update_one_with_opts(bulk, selector, update, opts, &error); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); bson_destroy(update); bson_destroy(selector); bson_destroy(opts); mongoc_bulk_operation_destroy(bulk); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk-collation"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "db", "collection"); bulk_collation(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk1.c000066400000000000000000000031741511661753600230610ustar00rootroot00000000000000#include #include #include static void bulk1(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *doc; bson_t reply; char *str; bool ret; int i; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); for (i = 0; i < 10000; i++) { doc = BCON_NEW("i", BCON_INT32(i)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); } ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { fprintf(stderr, "Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk1-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); bulk1(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk2.c000066400000000000000000000052071511661753600230610ustar00rootroot00000000000000#include #include #include static void bulk2(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *query; bson_t *doc; bson_t *opts; bson_t reply; char *str; bool ret; int i; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* Remove everything */ query = bson_new(); mongoc_bulk_operation_remove(bulk, query); bson_destroy(query); /* Add a few documents */ for (i = 1; i < 4; i++) { doc = BCON_NEW("_id", BCON_INT32(i)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); } /* {_id: 1} => {$set: {foo: "bar"}} */ query = BCON_NEW("_id", BCON_INT32(1)); doc = BCON_NEW("$set", "{", "foo", BCON_UTF8("bar"), "}"); mongoc_bulk_operation_update_many_with_opts(bulk, query, doc, NULL, &error); bson_destroy(query); bson_destroy(doc); /* {_id: 4} => {'$inc': {'j': 1}} (upsert) */ opts = BCON_NEW("upsert", BCON_BOOL(true)); query = BCON_NEW("_id", BCON_INT32(4)); doc = BCON_NEW("$inc", "{", "j", BCON_INT32(1), "}"); mongoc_bulk_operation_update_many_with_opts(bulk, query, doc, opts, &error); bson_destroy(query); bson_destroy(doc); bson_destroy(opts); /* replace {j:1} with {j:2} */ query = BCON_NEW("j", BCON_INT32(1)); doc = BCON_NEW("j", BCON_INT32(2)); mongoc_bulk_operation_replace_one_with_opts(bulk, query, doc, NULL, &error); bson_destroy(query); bson_destroy(doc); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk2-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); bulk2(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk3.c000066400000000000000000000044011511661753600230550ustar00rootroot00000000000000#include #include #include static void bulk3(mongoc_collection_t *collection) { bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *query; bson_t *doc; bson_t reply; char *str; bool ret; /* false indicates unordered */ BSON_APPEND_BOOL(&opts, "ordered", false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); bson_destroy(&opts); /* Add a document */ doc = BCON_NEW("_id", BCON_INT32(1)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); /* remove {_id: 2} */ query = BCON_NEW("_id", BCON_INT32(2)); mongoc_bulk_operation_remove_one(bulk, query); bson_destroy(query); /* insert {_id: 3} */ doc = BCON_NEW("_id", BCON_INT32(3)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); /* replace {_id:4} {'i': 1} */ query = BCON_NEW("_id", BCON_INT32(4)); doc = BCON_NEW("i", BCON_INT32(1)); mongoc_bulk_operation_replace_one(bulk, query, doc, false); bson_destroy(query); bson_destroy(doc); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk3-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); bulk3(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk4.c000066400000000000000000000037751511661753600230730ustar00rootroot00000000000000#include #include #include static void bulk4(mongoc_collection_t *collection) { bson_t opts = BSON_INITIALIZER; mongoc_write_concern_t *wc; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *doc; bson_t reply; char *str; bool ret; wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 4); mongoc_write_concern_set_wtimeout_int64(wc, 100); /* milliseconds */ mongoc_write_concern_append(wc, &opts); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* Two inserts */ doc = BCON_NEW("_id", BCON_INT32(10)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); doc = BCON_NEW("_id", BCON_INT32(11)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_write_concern_destroy(wc); bson_destroy(&opts); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk4-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); bulk4(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk5.c000066400000000000000000000065341511661753600230700ustar00rootroot00000000000000#include #include #include static void bulk5_fail(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *doc; bson_t reply; char *str; bool ret; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* Two inserts */ doc = BCON_NEW("_id", BCON_INT32(31)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); doc = BCON_NEW("_id", BCON_INT32(32)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); /* The above documents do not comply to the schema validation rules * we created previously, so this will result in an error */ ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); } static void bulk5_success(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *doc; bson_t reply; char *str; bool ret; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* Allow this document to bypass document validation. * NOTE: When authentication is enabled, the authenticated user must have * either the "dbadmin" or "restore" roles to bypass document validation */ mongoc_bulk_operation_set_bypass_document_validation(bulk, true); /* Two inserts */ doc = BCON_NEW("_id", BCON_INT32(31)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); doc = BCON_NEW("_id", BCON_INT32(32)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); } int main(void) { bson_t *options; bson_error_t error; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_database_t *database; const char *uri_string = "mongodb://localhost/?appname=bulk5-example"; mongoc_uri_t *uri; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "testasdf"); /* Create schema validator */ options = BCON_NEW("validator", "{", "number", "{", "$gte", BCON_INT32(5), "}", "}"); collection = mongoc_database_create_collection(database, "collname", options, &error); if (collection) { bulk5_fail(collection); bulk5_success(collection); mongoc_collection_destroy(collection); } else { fprintf(stderr, "Couldn't create collection: '%s'\n", error.message); } bson_free(options); mongoc_uri_destroy(uri); mongoc_database_destroy(database); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/bulk/bulk6.c000066400000000000000000000036641511661753600230720ustar00rootroot00000000000000#include #include static void bulk6(mongoc_collection_t *collection) { bson_t opts = BSON_INITIALIZER; mongoc_write_concern_t *wc; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t *doc; bson_t *selector; bson_t reply; char *str; bool ret; wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_append(wc, &opts); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); doc = BCON_NEW("_id", BCON_INT32(10)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); selector = BCON_NEW("_id", BCON_INT32(11)); mongoc_bulk_operation_remove_one(bulk, selector); bson_destroy(selector); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); if (!ret) { printf("Error: %s\n", error.message); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_write_concern_destroy(wc); bson_destroy(&opts); } int main(void) { mongoc_client_t *client; mongoc_collection_t *collection; const char *uri_string = "mongodb://localhost/?appname=bulk6-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); bulk6(collection); mongoc_uri_destroy(uri); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-auto-decryption.c000066400000000000000000000202071511661753600306160ustar00rootroot00000000000000#include "./client-side-encryption-helpers.h" #include #include #include /* This example demonstrates how to set up automatic decryption without * automatic encryption using the community version of MongoDB */ int main(void) { /* The collection used to store the encryption data keys. */ #define KEYVAULT_DB "encryption" #define KEYVAULT_COLL "__libmongocTestKeyVault" /* The collection used to store the encrypted documents in this example. */ #define ENCRYPTED_DB "test" #define ENCRYPTED_COLL "coll" int exit_status = EXIT_FAILURE; bool ret; uint8_t *local_masterkey = NULL; uint32_t local_masterkey_len; bson_t *kms_providers = NULL; bson_error_t error = {0}; bson_t *index_keys = NULL; bson_t *index_opts = NULL; mongoc_index_model_t *index_model = NULL; bson_t *schema = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; mongoc_collection_t *keyvault_coll = NULL; bson_t *to_insert = NULL; bson_t *create_cmd = NULL; bson_t *create_cmd_opts = NULL; mongoc_write_concern_t *wc = NULL; mongoc_client_encryption_t *client_encryption = NULL; mongoc_client_encryption_opts_t *client_encryption_opts = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts = NULL; char *keyaltnames[] = {"mongoc_encryption_example_4"}; bson_value_t datakey_id = {0}; bson_value_t encrypted_field = {0}; bson_value_t to_encrypt = {0}; mongoc_client_encryption_encrypt_opts_t *encrypt_opts = NULL; bson_value_t decrypted = {0}; mongoc_auto_encryption_opts_t *auto_encryption_opts = NULL; mongoc_client_t *unencrypted_client = NULL; mongoc_collection_t *unencrypted_coll = NULL; mongoc_init(); /* Configure the master key. This must be the same master key that was used * to create the encryption key. */ local_masterkey = hex_to_bin(getenv("LOCAL_MASTERKEY"), &local_masterkey_len); if (!local_masterkey || local_masterkey_len != 96) { fprintf(stderr, "Specify LOCAL_MASTERKEY environment variable as a " "secure random 96 byte hex value.\n"); goto fail; } kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(0, local_masterkey, local_masterkey_len), "}"); client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption"); auto_encryption_opts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, KEYVAULT_DB, KEYVAULT_COLL); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); /* Setting bypass_auto_encryption to true disables automatic encryption but * keeps the automatic decryption behavior. bypass_auto_encryption will also * disable spawning mongocryptd */ mongoc_auto_encryption_opts_set_bypass_auto_encryption(auto_encryption_opts, true); /* Once bypass_auto_encryption is set, community users can enable auto * encryption on the client. This will, in fact, only perform automatic * decryption. */ ret = mongoc_client_enable_auto_encryption(client, auto_encryption_opts, &error); if (!ret) { goto fail; } /* Now that automatic decryption is on, we can test it by inserting a * document with an explicitly encrypted value into the collection. When we * look up the document later, it should be automatically decrypted for us. */ coll = mongoc_client_get_collection(client, ENCRYPTED_DB, ENCRYPTED_COLL); /* Clear old data */ mongoc_collection_drop(coll, NULL); /* Set up the key vault for this example. */ keyvault_coll = mongoc_client_get_collection(client, KEYVAULT_DB, KEYVAULT_COLL); mongoc_collection_drop(keyvault_coll, NULL); /* Create a unique index to ensure that two data keys cannot share the same * keyAltName. This is recommended practice for the key vault. */ index_keys = BCON_NEW("keyAltNames", BCON_INT32(1)); index_opts = BCON_NEW("unique", BCON_BOOL(true), "partialFilterExpression", "{", "keyAltNames", "{", "$exists", BCON_BOOL(true), "}", "}"); index_model = mongoc_index_model_new(index_keys, index_opts); ret = mongoc_collection_create_indexes_with_opts( keyvault_coll, &index_model, 1, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, KEYVAULT_DB, KEYVAULT_COLL); /* The key vault client is used for reading to/from the key vault. This can * be the same mongoc_client_t used by the application. */ mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); if (!client_encryption) { goto fail; } /* Create a new data key for the encryptedField. * https://dochub.mongodb.org/core/client-side-field-level-encryption-automatic-encryption-rules */ datakey_opts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_keyaltnames(datakey_opts, keyaltnames, 1); ret = mongoc_client_encryption_create_datakey(client_encryption, "local", datakey_opts, &datakey_id, &error); if (!ret) { goto fail; } /* Explicitly encrypt a field. */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); mongoc_client_encryption_encrypt_opts_set_keyaltname(encrypt_opts, "mongoc_encryption_example_4"); to_encrypt.value_type = BSON_TYPE_UTF8; to_encrypt.value.v_utf8.str = "123456789"; const size_t len = strlen(to_encrypt.value.v_utf8.str); BSON_ASSERT(len <= UINT32_MAX); to_encrypt.value.v_utf8.len = (uint32_t)len; ret = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted_field, &error); if (!ret) { goto fail; } to_insert = bson_new(); BSON_APPEND_VALUE(to_insert, "encryptedField", &encrypted_field); ret = mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } /* When we retrieve the document, any encrypted fields will get automatically * decrypted by the driver. */ printf("decrypted document: "); if (!print_one_document(coll, &error)) { goto fail; } printf("\n"); unencrypted_client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption"); unencrypted_coll = mongoc_client_get_collection(unencrypted_client, ENCRYPTED_DB, ENCRYPTED_COLL); printf("encrypted document: "); if (!print_one_document(unencrypted_coll, &error)) { goto fail; } printf("\n"); exit_status = EXIT_SUCCESS; fail: if (error.code) { fprintf(stderr, "error: %s\n", error.message); } bson_free(local_masterkey); bson_destroy(kms_providers); mongoc_collection_destroy(keyvault_coll); mongoc_index_model_destroy(index_model); bson_destroy(index_opts); bson_destroy(index_keys); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_destroy(to_insert); bson_destroy(schema); bson_destroy(create_cmd); bson_destroy(create_cmd_opts); mongoc_write_concern_destroy(wc); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_value_destroy(&encrypted_field); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); bson_value_destroy(&decrypted); bson_value_destroy(&datakey_id); mongoc_collection_destroy(unencrypted_coll); mongoc_client_destroy(unencrypted_client); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_cleanup(); return exit_status; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-doc-snippets.c000066400000000000000000000024631511661753600301040ustar00rootroot00000000000000#include #include #include /* Includes code snippets for RST documentation. */ int main(void) { mongoc_init(); { /* BEGIN:mongoc_auto_encryption_opts_set_tls_opts. */ mongoc_auto_encryption_opts_t *ae_opts = mongoc_auto_encryption_opts_new(); bson_t *tls_opts = bson_new(); BCON_APPEND(tls_opts, "kmip", "{", MONGOC_URI_TLSCAFILE, "ca1.pem", "}"); BCON_APPEND(tls_opts, "aws", "{", MONGOC_URI_TLSCAFILE, "ca2.pem", "}"); mongoc_auto_encryption_opts_set_tls_opts(ae_opts, tls_opts); /* END:mongoc_auto_encryption_opts_set_tls_opts. */ bson_destroy(tls_opts); mongoc_auto_encryption_opts_destroy(ae_opts); } { /* BEGIN:mongoc_client_encryption_opts_set_tls_opts. */ mongoc_client_encryption_opts_t *ce_opts = mongoc_client_encryption_opts_new(); bson_t *tls_opts = bson_new(); BCON_APPEND(tls_opts, "kmip", "{", MONGOC_URI_TLSCAFILE, "ca1.pem", "}"); BCON_APPEND(tls_opts, "aws", "{", MONGOC_URI_TLSCAFILE, "ca2.pem", "}"); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tls_opts); /* END:mongoc_client_encryption_opts_set_tls_opts. */ bson_destroy(tls_opts); mongoc_client_encryption_opts_destroy(ce_opts); } mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-explicit.c000066400000000000000000000151371511661753600273170ustar00rootroot00000000000000#include "./client-side-encryption-helpers.h" #include #include #include /* This example demonstrates how to use explicit encryption and decryption using * the community version of MongoDB */ int main(void) { /* The collection used to store the encryption data keys. */ #define KEYVAULT_DB "encryption" #define KEYVAULT_COLL "__libmongocTestKeyVault" /* The collection used to store the encrypted documents in this example. */ #define ENCRYPTED_DB "test" #define ENCRYPTED_COLL "coll" int exit_status = EXIT_FAILURE; bool ret; uint8_t *local_masterkey = NULL; uint32_t local_masterkey_len; bson_t *kms_providers = NULL; bson_error_t error = {0}; bson_t *index_keys = NULL; bson_t *index_opts = NULL; mongoc_index_model_t *index_model = NULL; bson_t *schema = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; mongoc_collection_t *keyvault_coll = NULL; bson_t *to_insert = NULL; bson_t *create_cmd = NULL; bson_t *create_cmd_opts = NULL; mongoc_write_concern_t *wc = NULL; mongoc_client_encryption_t *client_encryption = NULL; mongoc_client_encryption_opts_t *client_encryption_opts = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts = NULL; char *keyaltnames[] = {"mongoc_encryption_example_3"}; bson_value_t datakey_id = {0}; bson_value_t encrypted_field = {0}; bson_value_t to_encrypt = {0}; mongoc_client_encryption_encrypt_opts_t *encrypt_opts = NULL; bson_value_t decrypted = {0}; mongoc_init(); /* Configure the master key. This must be the same master key that was used * to create the encryption key. */ local_masterkey = hex_to_bin(getenv("LOCAL_MASTERKEY"), &local_masterkey_len); if (!local_masterkey || local_masterkey_len != 96) { fprintf(stderr, "Specify LOCAL_MASTERKEY environment variable as a " "secure random 96 byte hex value.\n"); goto fail; } kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(0, local_masterkey, local_masterkey_len), "}"); /* The mongoc_client_t used to read/write application data. */ client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption"); coll = mongoc_client_get_collection(client, ENCRYPTED_DB, ENCRYPTED_COLL); /* Clear old data */ mongoc_collection_drop(coll, NULL); /* Set up the key vault for this example. */ keyvault_coll = mongoc_client_get_collection(client, KEYVAULT_DB, KEYVAULT_COLL); mongoc_collection_drop(keyvault_coll, NULL); /* Create a unique index to ensure that two data keys cannot share the same * keyAltName. This is recommended practice for the key vault. */ index_keys = BCON_NEW("keyAltNames", BCON_INT32(1)); index_opts = BCON_NEW("unique", BCON_BOOL(true), "partialFilterExpression", "{", "keyAltNames", "{", "$exists", BCON_BOOL(true), "}", "}"); index_model = mongoc_index_model_new(index_keys, index_opts); ret = mongoc_collection_create_indexes_with_opts( keyvault_coll, &index_model, 1, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, KEYVAULT_DB, KEYVAULT_COLL); /* Set a mongoc_client_t to use for reading/writing to the key vault. This * can be the same mongoc_client_t used by the main application. */ mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); if (!client_encryption) { goto fail; } /* Create a new data key for the encryptedField. * https://dochub.mongodb.org/core/client-side-field-level-encryption-automatic-encryption-rules */ datakey_opts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_keyaltnames(datakey_opts, keyaltnames, 1); if (!mongoc_client_encryption_create_datakey(client_encryption, "local", datakey_opts, &datakey_id, &error)) { goto fail; } /* Explicitly encrypt a field */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &datakey_id); to_encrypt.value_type = BSON_TYPE_UTF8; to_encrypt.value.v_utf8.str = "123456789"; const size_t len = strlen(to_encrypt.value.v_utf8.str); BSON_ASSERT(len <= UINT32_MAX); to_encrypt.value.v_utf8.len = (uint32_t)len; ret = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted_field, &error); if (!ret) { goto fail; } to_insert = bson_new(); BSON_APPEND_VALUE(to_insert, "encryptedField", &encrypted_field); ret = mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } printf("encrypted document: "); if (!print_one_document(coll, &error)) { goto fail; } printf("\n"); /* Explicitly decrypt a field */ ret = mongoc_client_encryption_decrypt(client_encryption, &encrypted_field, &decrypted, &error); if (!ret) { goto fail; } printf("decrypted value: %s\n", decrypted.value.v_utf8.str); exit_status = EXIT_SUCCESS; fail: if (error.code) { fprintf(stderr, "error: %s\n", error.message); } bson_free(local_masterkey); bson_destroy(kms_providers); mongoc_collection_destroy(keyvault_coll); mongoc_index_model_destroy(index_model); bson_destroy(index_opts); bson_destroy(index_keys); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_destroy(to_insert); bson_destroy(schema); bson_destroy(create_cmd); bson_destroy(create_cmd_opts); mongoc_write_concern_destroy(wc); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_value_destroy(&encrypted_field); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); bson_value_destroy(&decrypted); bson_value_destroy(&datakey_id); mongoc_cleanup(); return exit_status; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-helpers.c000066400000000000000000000026471511661753600271420ustar00rootroot00000000000000#include "./client-side-encryption-helpers.h" uint8_t * hex_to_bin(const char *hex, uint32_t *len) { if (!hex) { *len = 0; return NULL; } const size_t hex_len = strlen(hex); if (hex_len % 2 != 0) { *len = 0; return NULL; } size_t num_bytes = hex_len / 2u; if (num_bytes >= UINT32_MAX) { return NULL; } *len = (uint32_t)(hex_len / 2u); uint8_t *const out = bson_malloc0(*len); for (size_t i = 0u; i < hex_len; i += 2u) { uint32_t hex_char; if (1 != sscanf(hex + i, "%2x", &hex_char)) { bson_free(out); *len = 0; return NULL; } out[i / 2u] = (uint8_t)hex_char; } return out; } bool print_one_document(mongoc_collection_t *coll, bson_error_t *error) { bool ret = false; mongoc_cursor_t *cursor = NULL; const bson_t *found; bson_t *filter = NULL; char *as_string = NULL; filter = bson_new(); cursor = mongoc_collection_find_with_opts(coll, filter, NULL /* opts */, NULL /* read prefs */); if (!mongoc_cursor_next(cursor, &found)) { fprintf(stderr, "error: did not find inserted document\n"); goto fail; } if (mongoc_cursor_error(cursor, error)) { goto fail; } as_string = bson_as_canonical_extended_json(found, NULL); printf("%s", as_string); ret = true; fail: bson_destroy(filter); mongoc_cursor_destroy(cursor); bson_free(as_string); return ret; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-helpers.h000066400000000000000000000007401511661753600271370ustar00rootroot00000000000000#ifndef CLIENT_SIDE_ENCRYPTION_HELPERS #define CLIENT_SIDE_ENCRYPTION_HELPERS #include /* Helper method to find a single document in the given collection and print it to stdout */ bool print_one_document(mongoc_collection_t *coll, bson_error_t *error); /* hex_to_bin parses a hexadecimal string to an array of bytes. `NULL` is * returned on error. `len` is set to the number of bytes written. */ uint8_t * hex_to_bin(const char *hex, uint32_t *len); #endif mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-schema-map.c000066400000000000000000000221031511661753600275000ustar00rootroot00000000000000#include "./client-side-encryption-helpers.h" #include #include #include /* Helper method to create a new data key in the key vault, a schema to use that * key, and writes the schema to a file for later use. */ static bool create_schema_file(bson_t *kms_providers, const char *keyvault_db, const char *keyvault_coll, mongoc_client_t *keyvault_client, bson_error_t *error) { mongoc_client_encryption_t *client_encryption = NULL; mongoc_client_encryption_opts_t *client_encryption_opts = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts = NULL; bson_value_t datakey_id = {0}; char *keyaltnames[] = {"mongoc_encryption_example_1"}; bson_t *schema = NULL; char *schema_string = NULL; size_t schema_string_len; FILE *outfile = NULL; bool ret = false; client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, keyvault_db, keyvault_coll); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, keyvault_client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, error); if (!client_encryption) { goto fail; } /* Create a new data key and json schema for the encryptedField. * https://dochub.mongodb.org/core/client-side-field-level-encryption-automatic-encryption-rules */ datakey_opts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_keyaltnames(datakey_opts, keyaltnames, 1); if (!mongoc_client_encryption_create_datakey(client_encryption, "local", datakey_opts, &datakey_id, error)) { goto fail; } /* Create a schema describing that "encryptedField" is a string encrypted * with the newly created data key using deterministic encryption. */ schema = BCON_NEW( "properties", "{", "encryptedField", "{", "encrypt", "{", "keyId", "[", BCON_BIN(datakey_id.value.v_binary.subtype, datakey_id.value.v_binary.data, datakey_id.value.v_binary.data_len), "]", "bsonType", "string", "algorithm", MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, "}", "}", "}", "bsonType", "object"); /* Use canonical JSON so that other drivers and tools will be * able to parse the MongoDB extended JSON file. */ schema_string = bson_as_canonical_extended_json(schema, &schema_string_len); outfile = fopen("jsonSchema.json", "w"); if (0 == fwrite(schema_string, sizeof(char), schema_string_len, outfile)) { fprintf(stderr, "failed to write to file\n"); goto fail; } ret = true; fail: mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_free(schema_string); bson_destroy(schema); bson_value_destroy(&datakey_id); if (outfile) { fclose(outfile); } return ret; } /* This example demonstrates how to use automatic encryption with a client-side * schema map using the enterprise version of MongoDB */ int main(void) { /* The collection used to store the encryption data keys. */ #define KEYVAULT_DB "encryption" #define KEYVAULT_COLL "__libmongocTestKeyVault" /* The collection used to store the encrypted documents in this example. */ #define ENCRYPTED_DB "test" #define ENCRYPTED_COLL "coll" int exit_status = EXIT_FAILURE; bool ret; uint8_t *local_masterkey = NULL; uint32_t local_masterkey_len; bson_t *kms_providers = NULL; bson_error_t error = {0}; bson_t *index_keys = NULL; bson_t *index_opts = NULL; mongoc_index_model_t *index_model = NULL; bson_json_reader_t *reader = NULL; bson_t schema = BSON_INITIALIZER; bson_t *schema_map = NULL; /* The MongoClient used to access the key vault (keyvault_namespace). */ mongoc_client_t *keyvault_client = NULL; mongoc_collection_t *keyvault_coll = NULL; mongoc_auto_encryption_opts_t *auto_encryption_opts = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; bson_t *to_insert = NULL; mongoc_client_t *unencrypted_client = NULL; mongoc_collection_t *unencrypted_coll = NULL; mongoc_init(); /* Configure the master key. This must be the same master key that was used * to create the encryption key. */ local_masterkey = hex_to_bin(getenv("LOCAL_MASTERKEY"), &local_masterkey_len); if (!local_masterkey || local_masterkey_len != 96) { fprintf(stderr, "Specify LOCAL_MASTERKEY environment variable as a " "secure random 96 byte hex value.\n"); goto fail; } kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(0, local_masterkey, local_masterkey_len), "}"); /* Set up the key vault for this example. */ keyvault_client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption-keyvault"); BSON_ASSERT(keyvault_client); keyvault_coll = mongoc_client_get_collection(keyvault_client, KEYVAULT_DB, KEYVAULT_COLL); mongoc_collection_drop(keyvault_coll, NULL); /* Create a unique index to ensure that two data keys cannot share the same * keyAltName. This is recommended practice for the key vault. */ index_keys = BCON_NEW("keyAltNames", BCON_INT32(1)); index_opts = BCON_NEW("unique", BCON_BOOL(true), "partialFilterExpression", "{", "keyAltNames", "{", "$exists", BCON_BOOL(true), "}", "}"); index_model = mongoc_index_model_new(index_keys, index_opts); ret = mongoc_collection_create_indexes_with_opts( keyvault_coll, &index_model, 1, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } /* Create a new data key and a schema using it for encryption. Save the * schema to the file jsonSchema.json */ ret = create_schema_file(kms_providers, KEYVAULT_DB, KEYVAULT_COLL, keyvault_client, &error); if (!ret) { goto fail; } /* Load the JSON Schema and construct the local schema_map option. */ reader = bson_json_reader_new_from_file("jsonSchema.json", &error); if (!reader) { goto fail; } bson_json_reader_read(reader, &schema, &error); /* Construct the schema map, mapping the namespace of the collection to the * schema describing encryption. */ schema_map = BCON_NEW(ENCRYPTED_DB "." ENCRYPTED_COLL, BCON_DOCUMENT(&schema)); auto_encryption_opts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_keyvault_client(auto_encryption_opts, keyvault_client); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, KEYVAULT_DB, KEYVAULT_COLL); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption"); BSON_ASSERT(client); /* Enable automatic encryption. It will determine that encryption is * necessary from the schema map instead of relying on the server to provide * a schema. */ ret = mongoc_client_enable_auto_encryption(client, auto_encryption_opts, &error); if (!ret) { goto fail; } coll = mongoc_client_get_collection(client, ENCRYPTED_DB, ENCRYPTED_COLL); /* Clear old data */ mongoc_collection_drop(coll, NULL); to_insert = BCON_NEW("encryptedField", "123456789"); ret = mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } printf("decrypted document: "); if (!print_one_document(coll, &error)) { goto fail; } printf("\n"); unencrypted_client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption-unencrypted"); BSON_ASSERT(unencrypted_client); unencrypted_coll = mongoc_client_get_collection(unencrypted_client, ENCRYPTED_DB, ENCRYPTED_COLL); printf("encrypted document: "); if (!print_one_document(unencrypted_coll, &error)) { goto fail; } printf("\n"); exit_status = EXIT_SUCCESS; fail: if (error.code) { fprintf(stderr, "error: %s\n", error.message); } bson_free(local_masterkey); bson_destroy(kms_providers); mongoc_collection_destroy(keyvault_coll); mongoc_index_model_destroy(index_model); bson_destroy(index_opts); bson_destroy(index_keys); bson_json_reader_destroy(reader); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_destroy(to_insert); mongoc_collection_destroy(unencrypted_coll); mongoc_client_destroy(unencrypted_client); mongoc_client_destroy(keyvault_client); bson_destroy(&schema); bson_destroy(schema_map); mongoc_cleanup(); return exit_status; } mongo-c-driver-2.2.1/src/libmongoc/examples/client-side-encryption-server-schema.c000066400000000000000000000212611511661753600302350ustar00rootroot00000000000000#include "./client-side-encryption-helpers.h" #include #include #include /* Helper method to create and return a JSON schema to use for encryption. The caller will use the returned schema for server-side encryption validation. */ static bson_t * create_schema(bson_t *kms_providers, const char *keyvault_db, const char *keyvault_coll, mongoc_client_t *keyvault_client, bson_error_t *error) { mongoc_client_encryption_t *client_encryption = NULL; mongoc_client_encryption_opts_t *client_encryption_opts = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts = NULL; bson_value_t datakey_id = {0}; char *keyaltnames[] = {"mongoc_encryption_example_2"}; bson_t *schema = NULL; client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, keyvault_db, keyvault_coll); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, keyvault_client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, error); if (!client_encryption) { goto fail; } /* Create a new data key and json schema for the encryptedField. * https://dochub.mongodb.org/core/client-side-field-level-encryption-automatic-encryption-rules */ datakey_opts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_keyaltnames(datakey_opts, keyaltnames, 1); if (!mongoc_client_encryption_create_datakey(client_encryption, "local", datakey_opts, &datakey_id, error)) { goto fail; } /* Create a schema describing that "encryptedField" is a string encrypted * with the newly created data key using deterministic encryption. */ schema = BCON_NEW( "properties", "{", "encryptedField", "{", "encrypt", "{", "keyId", "[", BCON_BIN(datakey_id.value.v_binary.subtype, datakey_id.value.v_binary.data, datakey_id.value.v_binary.data_len), "]", "bsonType", "string", "algorithm", MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC, "}", "}", "}", "bsonType", "object"); fail: mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_value_destroy(&datakey_id); return schema; } /* This example demonstrates how to use automatic encryption with a server-side * schema using the enterprise version of MongoDB */ int main(void) { /* The collection used to store the encryption data keys. */ #define KEYVAULT_DB "encryption" #define KEYVAULT_COLL "__libmongocTestKeyVault" /* The collection used to store the encrypted documents in this example. */ #define ENCRYPTED_DB "test" #define ENCRYPTED_COLL "coll" int exit_status = EXIT_FAILURE; bool ret; uint8_t *local_masterkey = NULL; uint32_t local_masterkey_len; bson_t *kms_providers = NULL; bson_error_t error = {0}; bson_t *index_keys = NULL; bson_t *index_opts = NULL; mongoc_index_model_t *index_model = NULL; bson_json_reader_t *reader = NULL; bson_t *schema = NULL; /* The MongoClient used to access the key vault (keyvault_namespace). */ mongoc_client_t *keyvault_client = NULL; mongoc_collection_t *keyvault_coll = NULL; mongoc_auto_encryption_opts_t *auto_encryption_opts = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; bson_t *to_insert = NULL; mongoc_client_t *unencrypted_client = NULL; mongoc_collection_t *unencrypted_coll = NULL; bson_t *create_cmd = NULL; bson_t *create_cmd_opts = NULL; mongoc_write_concern_t *wc = NULL; mongoc_init(); /* Configure the master key. This must be the same master key that was used * to create * the encryption key. */ local_masterkey = hex_to_bin(getenv("LOCAL_MASTERKEY"), &local_masterkey_len); if (!local_masterkey || local_masterkey_len != 96) { fprintf(stderr, "Specify LOCAL_MASTERKEY environment variable as a " "secure random 96 byte hex value.\n"); goto fail; } kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(0, local_masterkey, local_masterkey_len), "}"); /* Set up the key vault for this example. */ keyvault_client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption-keyvault"); BSON_ASSERT(keyvault_client); keyvault_coll = mongoc_client_get_collection(keyvault_client, KEYVAULT_DB, KEYVAULT_COLL); mongoc_collection_drop(keyvault_coll, NULL); /* Create a unique index to ensure that two data keys cannot share the same * keyAltName. This is recommended practice for the key vault. */ index_keys = BCON_NEW("keyAltNames", BCON_INT32(1)); index_opts = BCON_NEW("unique", BCON_BOOL(true), "partialFilterExpression", "{", "keyAltNames", "{", "$exists", BCON_BOOL(true), "}", "}"); index_model = mongoc_index_model_new(index_keys, index_opts); ret = mongoc_collection_create_indexes_with_opts( keyvault_coll, &index_model, 1, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } auto_encryption_opts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_keyvault_client(auto_encryption_opts, keyvault_client); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, KEYVAULT_DB, KEYVAULT_COLL); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); schema = create_schema(kms_providers, KEYVAULT_DB, KEYVAULT_COLL, keyvault_client, &error); if (!schema) { goto fail; } client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption"); BSON_ASSERT(client); ret = mongoc_client_enable_auto_encryption(client, auto_encryption_opts, &error); if (!ret) { goto fail; } coll = mongoc_client_get_collection(client, ENCRYPTED_DB, ENCRYPTED_COLL); /* Clear old data */ mongoc_collection_drop(coll, NULL); /* Create the collection with the encryption JSON Schema. */ create_cmd = BCON_NEW("create", ENCRYPTED_COLL, "validator", "{", "$jsonSchema", BCON_DOCUMENT(schema), "}"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); create_cmd_opts = bson_new(); mongoc_write_concern_append(wc, create_cmd_opts); ret = mongoc_client_command_with_opts( client, ENCRYPTED_DB, create_cmd, NULL /* read prefs */, create_cmd_opts, NULL /* reply */, &error); if (!ret) { goto fail; } to_insert = BCON_NEW("encryptedField", "123456789"); ret = mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error); if (!ret) { goto fail; } printf("decrypted document: "); if (!print_one_document(coll, &error)) { goto fail; } printf("\n"); unencrypted_client = mongoc_client_new("mongodb://localhost/?appname=client-side-encryption-unencrypted"); BSON_ASSERT(unencrypted_client); unencrypted_coll = mongoc_client_get_collection(unencrypted_client, ENCRYPTED_DB, ENCRYPTED_COLL); printf("encrypted document: "); if (!print_one_document(unencrypted_coll, &error)) { goto fail; } printf("\n"); /* Expect a server-side error if inserting with the unencrypted collection. */ ret = mongoc_collection_insert_one(unencrypted_coll, to_insert, NULL /* opts */, NULL /* reply */, &error); if (!ret) { printf("insert with unencrypted collection failed: %s\n", error.message); memset(&error, 0, sizeof(error)); } exit_status = EXIT_SUCCESS; fail: if (error.code) { fprintf(stderr, "error: %s\n", error.message); } bson_free(local_masterkey); bson_destroy(kms_providers); mongoc_collection_destroy(keyvault_coll); mongoc_index_model_destroy(index_model); bson_destroy(index_opts); bson_destroy(index_keys); bson_json_reader_destroy(reader); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_destroy(to_insert); mongoc_collection_destroy(unencrypted_coll); mongoc_client_destroy(unencrypted_client); mongoc_client_destroy(keyvault_client); bson_destroy(schema); bson_destroy(create_cmd); bson_destroy(create_cmd_opts); mongoc_write_concern_destroy(wc); mongoc_cleanup(); return exit_status; } mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/000077500000000000000000000000001511661753600220155ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/find_package/000077500000000000000000000000001511661753600244105ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/find_package/CMakeLists.txt000066400000000000000000000023151511661753600271510ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libmongoc. cmake_minimum_required (VERSION 3.15...4.0) project (hello_mongoc LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libmongoc. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (mongoc 2.0 REQUIRED) # The "hello_mongoc.c" sample program is shared among four tests. add_executable (hello_mongoc ../../hello_mongoc.c) target_link_libraries (hello_mongoc PRIVATE mongoc::mongoc) mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/find_package_static/000077500000000000000000000000001511661753600257575ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/find_package_static/CMakeLists.txt000066400000000000000000000023151511661753600305200ustar00rootroot00000000000000# Copyright 2009-present MongoDB, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Demonstrates how to use the CMake 'find_package' mechanism to locate # and build against libmongoc. cmake_minimum_required (VERSION 3.15...4.0) project (hello_mongoc LANGUAGES C) # NOTE: For this to work, the CMAKE_PREFIX_PATH variable must be set to point to # the directory that was used as the argument to CMAKE_INSTALL_PREFIX when # building libmongoc. # -- sphinx-include-start -- # Specify the minimum version you require. find_package (mongoc 2.0 REQUIRED) # The "hello_mongoc.c" sample program is shared among four tests. add_executable (hello_mongoc ../../hello_mongoc.c) target_link_libraries (hello_mongoc PRIVATE mongoc::static) mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/vcpkg/000077500000000000000000000000001511661753600231275ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/vcpkg/CMakeLists.txt000066400000000000000000000006401511661753600256670ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) project(vcpkg-example-project) find_package(mongoc CONFIG REQUIRED) message(STATUS "Found libmongoc: ${mongoc_DIR}") enable_testing() add_executable(my-app app.c) target_link_libraries(my-app PRIVATE mongoc::static) add_test(my-app my-app) set_property( TEST my-app PROPERTY PASS_REGULAR_EXPRESSION "^Linked with libmongoc [1-9]+\\.[0-9]+\\.[0-9]+\r?\n$" ) mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/vcpkg/Makefile000066400000000000000000000014241511661753600245700ustar00rootroot00000000000000.SILENT: THIS_FILE := $(realpath $(lastword $(MAKEFILE_LIST))) THIS_DIR := $(dir $(THIS_FILE)) VCPKG_ROOT ?= /opt/vcpkg .PHONY: test-classic test-classic: vcpkg install mongo-c-driver rm -rf -- $(THIS_DIR)/_build cmake \ -S . \ -B _build \ -D CMAKE_PROJECT_INCLUDE=$(VCPKG_ROOT)/scripts/buildsystems/vcpkg.cmake cmake --build _build --config=Debug cmake --build _build --config=Debug --target test .PHONY: test-manifest-mode test-manifest-mode: test -f vcpkg.json \ || (echo "Expects a vcpkg.json file in the project directory before running this target." 1>&2 \ && false) cmake \ -S . \ -B _build \ -D CMAKE_PROJECT_INCLUDE=$(VCPKG_ROOT)/scripts/buildsystems/vcpkg.cmake cmake --build _build --config=Debug cmake --build _build --config=Debug --target test mongo-c-driver-2.2.1/src/libmongoc/examples/cmake/vcpkg/app.c000066400000000000000000000002771511661753600240610ustar00rootroot00000000000000#include #include int main(void) { mongoc_init(); fprintf(stdout, "Linked with libmongoc %s\n", mongoc_get_version()); mongoc_cleanup(); return 0; } mongo-c-driver-2.2.1/src/libmongoc/examples/common_operations/000077500000000000000000000000001511661753600244705ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/common_operations/common-operations.c000066400000000000000000000056651511661753600303210ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include const char *COLLECTION_NAME = "things"; #include "../doc-common-insert.c" #include "./explain.c" int main(int argc, char *argv[]) { mongoc_database_t *database = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *collection = NULL; mongoc_uri_t *uri = NULL; bson_error_t error; char *host_and_port; int res = 0; if (argc < 2 || argc > 3) { fprintf(stderr, "usage: %s MONGOD-1-CONNECTION-STRING " "[MONGOD-2-HOST-NAME:MONGOD-2-PORT]\n", argv[0]); fprintf(stderr, "MONGOD-1-CONNECTION-STRING can be " "of the following forms:\n"); fprintf(stderr, "localhost\t\t\t\tlocal machine\n"); fprintf(stderr, "localhost:27018\t\t\t\tlocal machine on port 27018\n"); fprintf(stderr, "mongodb://user:pass@localhost:27017\t" "local machine on port 27017, and authenticate with username " "user and password pass\n"); return EXIT_FAILURE; } mongoc_init(); if (strncmp(argv[1], "mongodb://", 10) == 0) { host_and_port = bson_strdup(argv[1]); } else { host_and_port = bson_strdup_printf("mongodb://%s", argv[1]); } uri = mongoc_uri_new_with_error(host_and_port, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", host_and_port, error.message); res = EXIT_FAILURE; goto cleanup; } client = mongoc_client_new_from_uri(uri); if (!client) { res = EXIT_FAILURE; goto cleanup; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "test"); collection = mongoc_database_get_collection(database, COLLECTION_NAME); printf("Inserting data\n"); if (!insert_data(collection)) { res = EXIT_FAILURE; goto cleanup; } printf("explain\n"); if (!explain(collection)) { res = EXIT_FAILURE; goto cleanup; } cleanup: if (collection) { mongoc_collection_destroy(collection); } if (database) { mongoc_database_destroy(database); } if (client) { mongoc_client_destroy(client); } if (uri) { mongoc_uri_destroy(uri); } bson_free(host_and_port); mongoc_cleanup(); return res; } mongo-c-driver-2.2.1/src/libmongoc/examples/common_operations/explain.c000066400000000000000000000010741511661753600262760ustar00rootroot00000000000000bool explain(mongoc_collection_t *collection) { bson_t *command; bson_t reply; bson_error_t error; bool res; command = BCON_NEW("explain", "{", "find", BCON_UTF8(COLLECTION_NAME), "filter", "{", "x", BCON_INT32(1), "}", "}"); res = mongoc_collection_command_simple(collection, command, NULL, &reply, &error); if (!res) { fprintf(stderr, "Error with explain: %s\n", error.message); goto cleanup; } /* Do something with the reply */ print_res(&reply); cleanup: bson_destroy(&reply); bson_destroy(command); return res; } mongo-c-driver-2.2.1/src/libmongoc/examples/compile-with-pkg-config-static.sh000077500000000000000000000002071511661753600272030ustar00rootroot00000000000000#!/usr/bin/env bash # -- sphinx-include-start -- gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags mongoc$major-static) mongo-c-driver-2.2.1/src/libmongoc/examples/compile-with-pkg-config.sh000077500000000000000000000002001511661753600257070ustar00rootroot00000000000000#!/usr/bin/env bash # -- sphinx-include-start -- gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags mongoc$major) mongo-c-driver-2.2.1/src/libmongoc/examples/doc-common-insert.c000066400000000000000000000024411511661753600244370ustar00rootroot00000000000000#include #include /* Don't try to compile this file on its own. It's meant to be #included by example code */ /* Insert some sample data */ bool insert_data(mongoc_collection_t *collection) { mongoc_bulk_operation_t *bulk; enum N { ndocs = 4 }; bson_t *docs[ndocs]; bson_error_t error; int i = 0; bool ret; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); docs[0] = BCON_NEW("x", BCON_DOUBLE(1.0), "tags", "[", "dog", "cat", "]"); docs[1] = BCON_NEW("x", BCON_DOUBLE(2.0), "tags", "[", "cat", "]"); docs[2] = BCON_NEW("x", BCON_DOUBLE(2.0), "tags", "[", "mouse", "cat", "dog", "]"); docs[3] = BCON_NEW("x", BCON_DOUBLE(3.0), "tags", "[", "]"); for (i = 0; i < ndocs; i++) { mongoc_bulk_operation_insert(bulk, docs[i]); bson_destroy(docs[i]); docs[i] = NULL; } ret = mongoc_bulk_operation_execute(bulk, NULL, &error); if (!ret) { fprintf(stderr, "Error inserting data: %s\n", error.message); } mongoc_bulk_operation_destroy(bulk); return ret; } /* A helper which we'll use a lot later on */ void print_res(const bson_t *reply) { char *str; BSON_ASSERT(reply); str = bson_as_canonical_extended_json(reply, NULL); printf("%s\n", str); bson_free(str); } mongo-c-driver-2.2.1/src/libmongoc/examples/example-bulkwrite.c000066400000000000000000000060261511661753600245460ustar00rootroot00000000000000// example-bulkwrite shows use of `mongoc_client_bulkwrite`. #include #define HANDLE_ERROR(...) \ if (1) { \ fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, "\n"); \ goto fail; \ } else \ (void)0 int main(void) { bool ok = false; mongoc_init(); bson_error_t error; mongoc_client_t *client = mongoc_client_new("mongodb://localhost:27017"); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(bwo, true); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); // Insert a document to `db.coll1` { bson_t *doc = BCON_NEW("foo", "bar"); if (!mongoc_bulkwrite_append_insertone(bw, "db.coll1", doc, NULL, &error)) { HANDLE_ERROR("Error appending insert one: %s", error.message); } bson_destroy(doc); } // Insert a document to `db.coll2` { bson_t *doc = BCON_NEW("foo", "baz"); if (!mongoc_bulkwrite_append_insertone(bw, "db.coll2", doc, NULL, &error)) { HANDLE_ERROR("Error appending insert one: %s", error.message); } bson_destroy(doc); } mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bwo); // Print results. { BSON_ASSERT(bwr.res); // Has results. NULL only returned for unacknowledged writes. printf("Insert count : %" PRId64 "\n", mongoc_bulkwriteresult_insertedcount(bwr.res)); const bson_t *ir = mongoc_bulkwriteresult_insertresults(bwr.res); BSON_ASSERT(ir); // Has verbose results. NULL only returned if verbose results not requested. char *ir_str = bson_as_relaxed_extended_json(ir, NULL); printf("Insert results : %s\n", ir_str); bson_free(ir_str); } // Print all error information. To observe: try setting the `_id` fields to cause a duplicate key error. if (bwr.exc) { const char *msg = "(none)"; if (mongoc_bulkwriteexception_error(bwr.exc, &error)) { msg = error.message; } const bson_t *we = mongoc_bulkwriteexception_writeerrors(bwr.exc); char *we_str = bson_as_relaxed_extended_json(we, NULL); const bson_t *wce = mongoc_bulkwriteexception_writeconcernerrors(bwr.exc); char *wce_str = bson_as_relaxed_extended_json(wce, NULL); const bson_t *er = mongoc_bulkwriteexception_errorreply(bwr.exc); char *er_str = bson_as_relaxed_extended_json(er, NULL); printf("Top-level error : %s\n", msg); printf("Write errors : %s\n", we_str); printf("Write concern errors : %s\n", wce_str); printf("Error reply : %s\n", er_str); bson_free(er_str); bson_free(wce_str); bson_free(we_str); } mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwrite_destroy(bw); ok = true; fail: mongoc_client_destroy(client); mongoc_bulkwriteopts_destroy(bwo); mongoc_cleanup(); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-client.c000066400000000000000000000037131511661753600240140ustar00rootroot00000000000000/* gcc example-client.c -o example-client $(pkg-config --cflags --libs * libmongoc-1.0) */ /* ./example-client [CONNECTION_STRING [COLLECTION_NAME]] */ #include #include #include int main(int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; const char *collection_name = "test"; bson_t query; char *str; const char *uri_string = "mongodb://127.0.0.1/?appname=client-example"; mongoc_uri_t *uri; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } if (argc > 2) { collection_name = argv[2]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); bson_init(&query); collection = mongoc_client_get_collection(client, "test", collection_name); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, /* additional options */ NULL); /* read prefs, NULL for default */ while (mongoc_cursor_next(cursor, &doc)) { str = bson_as_canonical_extended_json(doc, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "Cursor Failure: %s\n", error.message); return EXIT_FAILURE; } bson_destroy(&query); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-collection-command.c000066400000000000000000000032161511661753600263030ustar00rootroot00000000000000// BEGIN:mongoc_collection_command_simple #include #include #include static void do_ping(mongoc_collection_t *collection) { bson_error_t error; bson_t *cmd; bson_t reply; char *str; cmd = BCON_NEW("ping", BCON_INT32(1)); if (mongoc_collection_command_simple(collection, cmd, NULL, &reply, &error)) { str = bson_as_canonical_extended_json(&reply, NULL); printf("Got reply: %s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: %s\n", error.message); } bson_destroy(&reply); bson_destroy(cmd); } // END:mongoc_collection_command_simple int main(int argc, char **argv) { bson_error_t error; char *uri_string; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_init(); if (argc != 2) { MONGOC_ERROR("Error: expected URI argument.\n" "Usage: %s \n" "Example: %s mongodb://localhost:27017", argv[0], argv[0]); return EXIT_FAILURE; } uri_string = argv[1]; uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { MONGOC_ERROR("failed to parse URI: %s\nError: %s", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { MONGOC_ERROR("failed to create client"); return EXIT_FAILURE; } coll = mongoc_client_get_collection(client, "db", "coll"); do_ping(coll); mongoc_collection_destroy(coll); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-collection-watch.c000066400000000000000000000041531511661753600257740ustar00rootroot00000000000000#include int main(void) { bson_t empty = BSON_INITIALIZER; const bson_t *doc; bson_t *to_insert = BCON_NEW("x", BCON_INT32(1)); const bson_t *err_doc; bson_error_t error; const char *uri_string; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; bool r; mongoc_init(); uri_string = "mongodb://" "localhost:27017,localhost:27018,localhost:" "27019/db?replicaSet=rs0"; uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } coll = mongoc_client_get_collection(client, "db", "coll"); stream = mongoc_collection_watch(coll, &empty, NULL); mongoc_write_concern_set_wmajority(wc, 10000); mongoc_write_concern_append(wc, &opts); r = mongoc_collection_insert_one(coll, to_insert, &opts, NULL, &error); if (!r) { fprintf(stderr, "Error: %s\n", error.message); return EXIT_FAILURE; } while (mongoc_change_stream_next(stream, &doc)) { char *as_json = bson_as_relaxed_extended_json(doc, NULL); fprintf(stderr, "Got document: %s\n", as_json); bson_free(as_json); } if (mongoc_change_stream_error_document(stream, &error, &err_doc)) { if (!bson_empty(err_doc)) { fprintf(stderr, "Server Error: %s\n", bson_as_relaxed_extended_json(err_doc, NULL)); } else { fprintf(stderr, "Client Error: %s\n", error.message); } return EXIT_FAILURE; } bson_destroy(to_insert); mongoc_write_concern_destroy(wc); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-command-monitoring.c000066400000000000000000000065231511661753600263410ustar00rootroot00000000000000/* gcc example-command-monitoring.c -o example-command-monitoring \ * $(pkg-config --cflags --libs libmongoc-1.0) */ /* ./example-command-monitoring [CONNECTION_STRING] */ #include #include typedef struct { int started; int succeeded; int failed; } stats_t; void command_started(const mongoc_apm_command_started_t *event) { char *s; s = bson_as_relaxed_extended_json(mongoc_apm_command_started_get_command(event), NULL); printf("Command %s started on %s:\n%s\n\n", mongoc_apm_command_started_get_command_name(event), mongoc_apm_command_started_get_host(event)->host, s); ((stats_t *)mongoc_apm_command_started_get_context(event))->started++; bson_free(s); } void command_succeeded(const mongoc_apm_command_succeeded_t *event) { char *s; s = bson_as_relaxed_extended_json(mongoc_apm_command_succeeded_get_reply(event), NULL); printf("Command %s succeeded:\n%s\n\n", mongoc_apm_command_succeeded_get_command_name(event), s); ((stats_t *)mongoc_apm_command_succeeded_get_context(event))->succeeded++; bson_free(s); } void command_failed(const mongoc_apm_command_failed_t *event) { bson_error_t error; mongoc_apm_command_failed_get_error(event, &error); printf("Command %s failed:\n\"%s\"\n\n", mongoc_apm_command_failed_get_command_name(event), error.message); ((stats_t *)mongoc_apm_command_failed_get_context(event))->failed++; } int main(int argc, char *argv[]) { mongoc_client_t *client; mongoc_apm_callbacks_t *callbacks; stats_t stats = {0}; mongoc_collection_t *collection; bson_error_t error; const char *uri_string = "mongodb://127.0.0.1/?appname=cmd-monitoring-example"; mongoc_uri_t *uri; const char *collection_name = "test"; bson_t *docs[2]; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, command_started); mongoc_apm_set_command_succeeded_cb(callbacks, command_succeeded); mongoc_apm_set_command_failed_cb(callbacks, command_failed); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&stats /* context pointer */); collection = mongoc_client_get_collection(client, "test", collection_name); mongoc_collection_drop(collection, NULL); docs[0] = BCON_NEW("_id", BCON_INT32(0)); docs[1] = BCON_NEW("_id", BCON_INT32(1)); mongoc_collection_insert_many(collection, (const bson_t **)docs, 2, NULL, NULL, NULL); /* duplicate key error on the second insert */ mongoc_collection_insert_one(collection, docs[0], NULL, NULL, NULL); mongoc_collection_destroy(collection); mongoc_apm_callbacks_destroy(callbacks); mongoc_uri_destroy(uri); mongoc_client_destroy(client); printf("started: %d\nsucceeded: %d\nfailed: %d\n", stats.started, stats.succeeded, stats.failed); bson_destroy(docs[0]); bson_destroy(docs[1]); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-command-with-opts.c000066400000000000000000000100511511661753600261010ustar00rootroot00000000000000/* Demonstrates how to prepare options for mongoc_client_read_command_with_opts and mongoc_client_write_command_with_opts. First it calls "cloneCollectionAsCapped" command with "writeConcern" option, then "distinct" command with "collation" and "readConcern" options, Start a MongoDB 3.4 replica set with --enableMajorityReadConcern and insert two documents: $ mongo MongoDB Enterprise replset:PRIMARY> db.my_collection.insert({x: 1, y: "One"}) WriteResult({ "nInserted" : 1 }) MongoDB Enterprise replset:PRIMARY> db.my_collection.insert({x: 2, y: "Two"}) WriteResult({ "nInserted" : 1 }) Build and run the example: gcc example-command-with-opts.c -o example-command-with-opts $(pkg-config --cflags --libs libmongoc-1.0) ./example-command-with-opts [CONNECTION_STRING] cloneCollectionAsCapped: { "ok" : 1 } distinct: { "values" : [ 1, 2 ], "ok" : 1 } */ #include #include #include int main(int argc, char *argv[]) { mongoc_client_t *client; const char *uri_string = "mongodb://127.0.0.1/?appname=client-example"; mongoc_uri_t *uri; bson_t *cmd; bson_t *opts; mongoc_write_concern_t *write_concern; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; bson_t reply; bson_error_t error; char *json; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); cmd = BCON_NEW("cloneCollectionAsCapped", BCON_UTF8("my_collection"), "toCollection", BCON_UTF8("my_capped_collection"), "size", BCON_INT64(1024 * 1024)); /* include write concern "majority" in command options */ write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_wmajority(write_concern, 10000 /* wtimeoutMS */); opts = bson_new(); mongoc_write_concern_append(write_concern, opts); if (mongoc_client_write_command_with_opts(client, "test", cmd, opts, &reply, &error)) { json = bson_as_canonical_extended_json(&reply, NULL); printf("cloneCollectionAsCapped: %s\n", json); bson_free(json); } else { fprintf(stderr, "cloneCollectionAsCapped: %s\n", error.message); } bson_free(cmd); bson_free(opts); /* distinct values of "x" in "my_collection" where "y" sorts after "one" */ cmd = BCON_NEW("distinct", BCON_UTF8("my_collection"), "key", BCON_UTF8("x"), "query", "{", "y", "{", "$gt", BCON_UTF8("one"), "}", "}"); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); /* "One" normally sorts before "one"; make "One" sort after "one" */ opts = BCON_NEW("collation", "{", "locale", BCON_UTF8("en_US"), "caseFirst", BCON_UTF8("lower"), "}"); /* add a read concern to "opts" */ read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_read_concern_append(read_concern, opts); if (mongoc_client_read_command_with_opts(client, "test", cmd, read_prefs, opts, &reply, &error)) { json = bson_as_canonical_extended_json(&reply, NULL); printf("distinct: %s\n", json); bson_free(json); } else { fprintf(stderr, "distinct: %s\n", error.message); } bson_destroy(cmd); bson_destroy(opts); bson_destroy(&reply); mongoc_read_prefs_destroy(read_prefs); mongoc_read_concern_destroy(read_concern); mongoc_write_concern_destroy(write_concern); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-gridfs-bucket.c000066400000000000000000000051271511661753600252700ustar00rootroot00000000000000#include #include #include int main(int argc, char *argv[]) { const char *uri_string = "mongodb://localhost:27017/?appname=new-gridfs-example"; mongoc_client_t *client; mongoc_database_t *db; mongoc_stream_t *file_stream; mongoc_gridfs_bucket_t *bucket; mongoc_cursor_t *cursor; bson_t filter; bool res; bson_value_t file_id; bson_error_t error; const bson_t *doc; char *str; mongoc_init(); if (argc != 3) { fprintf(stderr, "usage: %s SOURCE_FILE_PATH FILE_COPY_PATH\n", argv[0]); return EXIT_FAILURE; } /* 1. Make a bucket. */ client = mongoc_client_new(uri_string); db = mongoc_client_get_database(client, "test"); bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); if (!bucket) { printf("Error creating gridfs bucket: %s\n", error.message); return EXIT_FAILURE; } /* 2. Insert a file. */ file_stream = mongoc_stream_file_new_for_path(argv[1], O_RDONLY, 0); res = mongoc_gridfs_bucket_upload_from_stream(bucket, "my-file", file_stream, NULL, &file_id, &error); if (!res) { printf("Error uploading file: %s\n", error.message); return EXIT_FAILURE; } mongoc_stream_close(file_stream); mongoc_stream_destroy(file_stream); /* 3. Download the file in GridFS to a local file. */ file_stream = mongoc_stream_file_new_for_path(argv[2], O_CREAT | O_RDWR, 0); if (!file_stream) { perror("Error opening file stream"); return EXIT_FAILURE; } res = mongoc_gridfs_bucket_download_to_stream(bucket, &file_id, file_stream, &error); if (!res) { printf("Error downloading file to stream: %s\n", error.message); return EXIT_FAILURE; } mongoc_stream_close(file_stream); mongoc_stream_destroy(file_stream); /* 4. List what files are available in GridFS. */ bson_init(&filter); cursor = mongoc_gridfs_bucket_find(bucket, &filter, NULL); while (mongoc_cursor_next(cursor, &doc)) { str = bson_as_canonical_extended_json(doc, NULL); printf("%s\n", str); bson_free(str); } /* 5. Delete the file that we added. */ res = mongoc_gridfs_bucket_delete_by_id(bucket, &file_id, &error); if (!res) { printf("Error deleting the file: %s\n", error.message); return EXIT_FAILURE; } /* 6. Cleanup. */ mongoc_stream_close(file_stream); mongoc_stream_destroy(file_stream); mongoc_cursor_destroy(cursor); bson_destroy(&filter); mongoc_gridfs_bucket_destroy(bucket); mongoc_database_destroy(db); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-gridfs.c000066400000000000000000000077111511661753600240160ustar00rootroot00000000000000#include #include #include #include #include int main(int argc, char *argv[]) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_gridfs_file_list_t *list; mongoc_gridfs_file_opt_t opt = {0}; mongoc_client_t *client; const char *uri_string = "mongodb://127.0.0.1:27017/?appname=gridfs-example"; mongoc_uri_t *uri; mongoc_stream_t *stream; bson_t filter; bson_t opts; bson_t child; bson_error_t error; ssize_t r; char buf[4096]; mongoc_iovec_t iov; const char *filename; const char *command; bson_value_t id; if (argc < 2) { fprintf(stderr, "usage - %s command ...\n", argv[0]); return EXIT_FAILURE; } mongoc_init(); iov.iov_base = (void *)buf; iov.iov_len = sizeof buf; /* connect to localhost client */ uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); assert(client); mongoc_client_set_error_api(client, 2); /* grab a gridfs handle in test prefixed by fs */ gridfs = mongoc_client_get_gridfs(client, "test", "fs", &error); assert(gridfs); command = argv[1]; filename = argv[2]; if (strcmp(command, "read") == 0) { if (argc != 3) { fprintf(stderr, "usage - %s read filename\n", argv[0]); return EXIT_FAILURE; } file = mongoc_gridfs_find_one_by_filename(gridfs, filename, &error); assert(file); stream = mongoc_stream_gridfs_new(file); assert(stream); for (;;) { r = mongoc_stream_readv(stream, &iov, 1, -1, 0); assert(r >= 0); if (r == 0) { break; } if (fwrite(iov.iov_base, 1, r, stdout) != (size_t)r) { MONGOC_ERROR("Failed to write to stdout. Exiting.\n"); exit(1); } } mongoc_stream_destroy(stream); mongoc_gridfs_file_destroy(file); } else if (strcmp(command, "list") == 0) { bson_init(&filter); bson_init(&opts); bson_append_document_begin(&opts, "sort", -1, &child); BSON_APPEND_INT32(&child, "filename", 1); bson_append_document_end(&opts, &child); list = mongoc_gridfs_find_with_opts(gridfs, &filter, &opts); bson_destroy(&filter); bson_destroy(&opts); while ((file = mongoc_gridfs_file_list_next(list))) { const char *name = mongoc_gridfs_file_get_filename(file); printf("%s\n", name ? name : "?"); mongoc_gridfs_file_destroy(file); } mongoc_gridfs_file_list_destroy(list); } else if (strcmp(command, "write") == 0) { if (argc != 4) { fprintf(stderr, "usage - %s write filename input_file\n", argv[0]); return EXIT_FAILURE; } stream = mongoc_stream_file_new_for_path(argv[3], O_RDONLY, 0); assert(stream); opt.filename = filename; /* the driver generates a file_id for you */ file = mongoc_gridfs_create_file_from_stream(gridfs, stream, &opt); assert(file); id.value_type = BSON_TYPE_INT32; id.value.v_int32 = 1; /* optional: the following method specifies a file_id of any BSON type */ if (!mongoc_gridfs_file_set_id(file, &id, &error)) { fprintf(stderr, "%s\n", error.message); return EXIT_FAILURE; } if (!mongoc_gridfs_file_save(file)) { mongoc_gridfs_file_error(file, &error); fprintf(stderr, "Could not save: %s\n", error.message); return EXIT_FAILURE; } mongoc_gridfs_file_destroy(file); } else { fprintf(stderr, "Unknown command"); return EXIT_FAILURE; } mongoc_gridfs_destroy(gridfs); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-manage-collection-indexes.c000066400000000000000000000065641511661753600275630ustar00rootroot00000000000000// example-manage-collection-indexes creates, lists and deletes an index from // the `test.test` collection. #include #include // abort #define HANDLE_ERROR(...) \ if (1) { \ fprintf(stderr, "Failure at %s:%d\n", __FILE__, (int)(__LINE__)); \ fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, "\n"); \ goto fail; \ } else \ (void)0 int main(int argc, char *argv[]) { mongoc_client_t *client = NULL; const char *uri_string = "mongodb://127.0.0.1/?appname=create-indexes-example"; mongoc_uri_t *uri = NULL; mongoc_collection_t *coll = NULL; bson_error_t error; bool ok = false; mongoc_init(); if (argc > 2) { HANDLE_ERROR("Unexpected arguments. Expected usage: %s [CONNECTION_STRING]", argv[0]); } if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { HANDLE_ERROR("Failed to parse URI: %s", error.message); } client = mongoc_client_new_from_uri_with_error(uri, &error); if (!client) { HANDLE_ERROR("Failed to create client: %s", error.message); } coll = mongoc_client_get_collection(client, "test", "test"); { // Create an index ... begin // `keys` represents an ascending index on field `x`. bson_t *keys = BCON_NEW("x", BCON_INT32(1)); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL /* opts */); if (mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error)) { printf("Successfully created index\n"); } else { bson_destroy(keys); HANDLE_ERROR("Failed to create index: %s", error.message); } bson_destroy(keys); // Create an index ... end } { // List indexes ... begin mongoc_cursor_t *cursor = mongoc_collection_find_indexes_with_opts(coll, NULL /* opts */); printf("Listing indexes:\n"); const bson_t *got; while (mongoc_cursor_next(cursor, &got)) { char *got_str = bson_as_canonical_extended_json(got, NULL); printf(" %s\n", got_str); bson_free(got_str); } if (mongoc_cursor_error(cursor, &error)) { mongoc_cursor_destroy(cursor); HANDLE_ERROR("Failed to list indexes: %s", error.message); } mongoc_cursor_destroy(cursor); // List indexes ... end } { // Drop an index ... begin bson_t *keys = BCON_NEW("x", BCON_INT32(1)); char *index_name = mongoc_collection_keys_to_index_string(keys); if (mongoc_collection_drop_index_with_opts(coll, index_name, NULL /* opts */, &error)) { printf("Successfully dropped index\n"); } else { bson_free(index_name); bson_destroy(keys); HANDLE_ERROR("Failed to drop index: %s", error.message); } bson_free(index_name); bson_destroy(keys); // Drop an index ... end } ok = true; fail: mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mongoc_cleanup(); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-manage-search-indexes.c000066400000000000000000000163071511661753600266710ustar00rootroot00000000000000// example-manage-search-indexes creates, lists, updates, and deletes an Atlas // search index from the `test.test` collection. // Example is expected to be run against a MongoDB Atlas cluster. #include #include // abort #define HANDLE_ERROR(...) \ if (1) { \ fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, "\n"); \ goto fail; \ } else \ (void)0 #define ASSERT(stmt) \ if (!stmt) { \ fprintf(stderr, "assertion failed on line: %d, statement: %s\n", (int)(__LINE__), #stmt); \ abort(); \ } else \ (void)0 int main(int argc, char *argv[]) { mongoc_client_t *client = NULL; const char *uri_string = "mongodb://127.0.0.1/?appname=create-search-indexes-example"; mongoc_uri_t *uri = NULL; mongoc_collection_t *coll = NULL; bson_error_t error; bool ok = false; mongoc_init(); if (argc > 2) { HANDLE_ERROR("Unexpected arguments. Expected usage: %s [CONNECTION_STRING]", argv[0]); } if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { HANDLE_ERROR("Failed to parse URI: %s", error.message); } client = mongoc_client_new_from_uri_with_error(uri, &error); if (!client) { HANDLE_ERROR("Failed to create client: %s", error.message); } // Create a random collection name. char collname[25]; { // There is a server-side limitation that prevents multiple search indexes // from being created with the same name, definition and collection name. // Atlas search index management operations are asynchronous. Dropping a // collection may not result in the index being dropped immediately. Use a // randomly generated collection name to avoid errors. bson_oid_t oid; bson_oid_init(&oid, NULL); bson_oid_to_string(&oid, collname); } // Create collection object. { // Create the collection server-side to avoid the server error: // "Collection 'test.' does not exist." mongoc_database_t *db = mongoc_client_get_database(client, "test"); coll = mongoc_database_create_collection(db, collname, NULL /* options */, &error); if (!coll) { mongoc_database_destroy(db); HANDLE_ERROR("Failed to create collection: %s", error.message); } mongoc_database_destroy(db); } // Check that $listSearchIndexes pipeline stage is supported. // This is intended to check that a MongoDB Atlas cluster is used. { const char *pipeline_str = BSON_STR({"pipeline" : [ {"$listSearchIndexes" : {}} ]}); bson_t pipeline; ASSERT(bson_init_from_json(&pipeline, pipeline_str, -1, &error)); mongoc_cursor_t *cursor = mongoc_collection_aggregate(coll, MONGOC_QUERY_NONE, &pipeline, NULL /* opts */, NULL /* read_prefs */); const bson_t *got; while (mongoc_cursor_next(cursor, &got)) ; if (mongoc_cursor_error(cursor, &error)) { bson_destroy(&pipeline); mongoc_cursor_destroy(cursor); HANDLE_ERROR("Failed to run $listSearchIndexes with error: %s\n" "Does the URI point to a MongoDB Atlas cluster? %s", error.message, uri_string); } bson_destroy(&pipeline); mongoc_cursor_destroy(cursor); } { // Create an Atlas Search Index ... begin bson_t cmd; // Create command. { char *cmd_str = bson_strdup_printf( BSON_STR({ "createSearchIndexes" : "%s", "indexes" : [ {"definition" : {"mappings" : {"dynamic" : false}}, "name" : "test-index"} ] }), collname); ASSERT(bson_init_from_json(&cmd, cmd_str, -1, &error)); bson_free(cmd_str); } if (!mongoc_collection_command_simple(coll, &cmd, NULL /* read_prefs */, NULL /* reply */, &error)) { bson_destroy(&cmd); HANDLE_ERROR("Failed to run createSearchIndexes: %s", error.message); } printf("Created index: \"test-index\"\n"); bson_destroy(&cmd); // Create an Atlas Search Index ... end } { // List Atlas Search Indexes ... begin const char *pipeline_str = BSON_STR({"pipeline" : [ {"$listSearchIndexes" : {}} ]}); bson_t pipeline; ASSERT(bson_init_from_json(&pipeline, pipeline_str, -1, &error)); mongoc_cursor_t *cursor = mongoc_collection_aggregate(coll, MONGOC_QUERY_NONE, &pipeline, NULL /* opts */, NULL /* read_prefs */); printf("Listing indexes:\n"); const bson_t *got; while (mongoc_cursor_next(cursor, &got)) { char *got_str = bson_as_canonical_extended_json(got, NULL); printf(" %s\n", got_str); bson_free(got_str); } if (mongoc_cursor_error(cursor, &error)) { bson_destroy(&pipeline); mongoc_cursor_destroy(cursor); HANDLE_ERROR("Failed to run $listSearchIndexes: %s", error.message); } bson_destroy(&pipeline); mongoc_cursor_destroy(cursor); // List Atlas Search Indexes ... end } { // Update an Atlas Search Index ... begin bson_t cmd; // Create command. { char *cmd_str = bson_strdup_printf( BSON_STR( {"updateSearchIndex" : "%s", "definition" : {"mappings" : {"dynamic" : true}}, "name" : "test-index"}), collname); ASSERT(bson_init_from_json(&cmd, cmd_str, -1, &error)); bson_free(cmd_str); } if (!mongoc_collection_command_simple(coll, &cmd, NULL /* read_prefs */, NULL /* reply */, &error)) { bson_destroy(&cmd); HANDLE_ERROR("Failed to run updateSearchIndex: %s", error.message); } printf("Updated index: \"test-index\"\n"); bson_destroy(&cmd); // Update an Atlas Search Index ... end } { // Drop an Atlas Search Index ... begin bson_t cmd; // Create command. { char *cmd_str = bson_strdup_printf(BSON_STR({"dropSearchIndex" : "%s", "name" : "test-index"}), collname); ASSERT(bson_init_from_json(&cmd, cmd_str, -1, &error)); bson_free(cmd_str); } if (!mongoc_collection_command_simple(coll, &cmd, NULL /* read_prefs */, NULL /* reply */, &error)) { bson_destroy(&cmd); HANDLE_ERROR("Failed to run dropSearchIndex: %s", error.message); } printf("Dropped index: \"test-index\"\n"); bson_destroy(&cmd); // Drop an Atlas Search Index ... end } // Drop created collection. { if (!mongoc_collection_drop(coll, &error)) { HANDLE_ERROR("Failed to drop collection '%s': %s", collname, error.message); } } ok = true; fail: mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mongoc_cleanup(); return ok ? EXIT_SUCCESS : EXIT_FAILURE; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-pool.c000066400000000000000000000043071511661753600235070ustar00rootroot00000000000000/* gcc example-pool.c -o example-pool $(pkg-config --cflags --libs * libmongoc-1.0) */ /* ./example-pool [CONNECTION_STRING] */ #include #include #include static pthread_mutex_t mutex; static bool in_shutdown = false; static void * worker(void *data) { mongoc_client_pool_t *pool = data; mongoc_client_t *client; bson_t ping = BSON_INITIALIZER; bson_error_t error; bool r; BSON_APPEND_INT32(&ping, "ping", 1); while (true) { client = mongoc_client_pool_pop(pool); /* Do something with client. If you are writing an HTTP server, you * probably only want to hold onto the client for the portion of the * request performing database queries. */ r = mongoc_client_command_simple(client, "admin", &ping, NULL, NULL, &error); if (!r) { fprintf(stderr, "%s\n", error.message); } mongoc_client_pool_push(pool, client); pthread_mutex_lock(&mutex); if (in_shutdown || !r) { pthread_mutex_unlock(&mutex); break; } pthread_mutex_unlock(&mutex); } bson_destroy(&ping); return NULL; } int main(int argc, char *argv[]) { const char *uri_string = "mongodb://127.0.0.1/?appname=pool-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_client_pool_t *pool; pthread_t threads[10]; unsigned i; void *ret; pthread_mutex_init(&mutex, NULL); mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } pool = mongoc_client_pool_new(uri); mongoc_client_pool_set_error_api(pool, 2); for (i = 0; i < 10; i++) { pthread_create(&threads[i], NULL, worker, pool); } sleep(10); pthread_mutex_lock(&mutex); in_shutdown = true; pthread_mutex_unlock(&mutex); for (i = 0; i < 10; i++) { pthread_join(threads[i], &ret); } mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-resume.c000066400000000000000000000105131511661753600240320ustar00rootroot00000000000000#include /* An example implementation of custom resume logic in a change stream. * example-resume starts a client-wide change stream and persists the resume * token in a file "resume-token.json". On restart, if "resume-token.json" * exists, the change stream starts watching after the persisted resume token. * * This behavior allows a user to exit example-resume, and restart it later * without missing any change events. */ #include static const char *RESUME_TOKEN_PATH = "resume-token.json"; static bool _save_resume_token(const bson_t *doc) { FILE *file_stream; bson_iter_t iter; bson_t resume_token_doc; char *as_json = NULL; size_t as_json_len; const bson_value_t *resume_token; if (!bson_iter_init_find(&iter, doc, "_id")) { fprintf(stderr, "reply does not contain operationTime."); return false; } resume_token = bson_iter_value(&iter); /* store the resume token in a document, { resumeAfter: } * which we can later append easily. */ file_stream = fopen(RESUME_TOKEN_PATH, "w+"); if (!file_stream) { fprintf(stderr, "failed to open %s for writing\n", RESUME_TOKEN_PATH); return false; } bson_init(&resume_token_doc); BSON_APPEND_VALUE(&resume_token_doc, "resumeAfter", resume_token); as_json = bson_as_canonical_extended_json(&resume_token_doc, &as_json_len); bson_destroy(&resume_token_doc); size_t n_written = 0; while (n_written < as_json_len) { ssize_t r = fwrite((void *)(as_json + n_written), sizeof(char), as_json_len - n_written, file_stream); if (r == -1) { fprintf(stderr, "failed to write to %s\n", RESUME_TOKEN_PATH); bson_free(as_json); fclose(file_stream); return false; } n_written += r; } bson_free(as_json); fclose(file_stream); return true; } bool _load_resume_token(bson_t *opts) { bson_error_t error; bson_json_reader_t *reader; bson_t doc; /* if the file does not exist, skip. */ if (-1 == access(RESUME_TOKEN_PATH, R_OK)) { return true; } reader = bson_json_reader_new_from_file(RESUME_TOKEN_PATH, &error); if (!reader) { fprintf(stderr, "failed to open %s for reading: %s\n", RESUME_TOKEN_PATH, error.message); return false; } bson_init(&doc); if (-1 == bson_json_reader_read(reader, &doc, &error)) { fprintf(stderr, "failed to read doc from %s\n", RESUME_TOKEN_PATH); bson_destroy(&doc); bson_json_reader_destroy(reader); return false; } printf("found cached resume token in %s, resuming change stream.\n", RESUME_TOKEN_PATH); bson_concat(opts, &doc); bson_destroy(&doc); bson_json_reader_destroy(reader); return true; } int main(void) { int exit_code = EXIT_FAILURE; const char *uri_string; mongoc_uri_t *uri = NULL; bson_error_t error; mongoc_client_t *client = NULL; bson_t pipeline = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; mongoc_change_stream_t *stream = NULL; const bson_t *doc; const int max_time = 30; /* max amount of time, in seconds, that mongoc_change_stream_next can block. */ mongoc_init(); uri_string = "mongodb://localhost:27017/db?replicaSet=rs0"; uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto cleanup; } client = mongoc_client_new_from_uri(uri); if (!client) { goto cleanup; } if (!_load_resume_token(&opts)) { goto cleanup; } BSON_APPEND_INT64(&opts, "maxAwaitTimeMS", max_time * 1000); printf("listening for changes on the client (max %d seconds).\n", max_time); stream = mongoc_client_watch(client, &pipeline, &opts); while (mongoc_change_stream_next(stream, &doc)) { char *as_json; as_json = bson_as_canonical_extended_json(doc, NULL); printf("change received: %s\n", as_json); bson_free(as_json); if (!_save_resume_token(doc)) { goto cleanup; } } exit_code = EXIT_SUCCESS; cleanup: mongoc_uri_destroy(uri); bson_destroy(&pipeline); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-scram.c000066400000000000000000000052031511661753600236370ustar00rootroot00000000000000/* gcc example.c -o example $(pkg-config --cflags --libs libmongoc-1.0) */ /* ./example-scram */ #include #include #include int main(int argc, char *argv[]) { mongoc_client_t *client = NULL; mongoc_database_t *database = NULL; mongoc_collection_t *collection = NULL; mongoc_cursor_t *cursor = NULL; bson_error_t error; const char *uri_string = "mongodb://127.0.0.1/"; mongoc_uri_t *uri = NULL; const char *authuristr; bson_t roles; bson_t query; const bson_t *doc; int exit_code = EXIT_FAILURE; if (argc != 2) { printf("%s - [implicit|scram]\n", argv[0]); return exit_code; } if (strcmp(argv[1], "implicit") == 0) { authuristr = "mongodb://user,=:pass@127.0.0.1/test?appname=scram-example"; } else if (strcmp(argv[1], "scram") == 0) { authuristr = "mongodb://user,=:pass@127.0.0.1/" "test?appname=scram-example&authMechanism=SCRAM-SHA-1"; } else { printf("%s - [implicit|scram]\n", argv[0]); return exit_code; } mongoc_init(); bson_init(&roles); bson_init(&query); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto CLEANUP; } client = mongoc_client_new_from_uri(uri); if (!client) { goto CLEANUP; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "test"); BCON_APPEND(&roles, "0", "{", "role", "root", "db", "admin", "}"); mongoc_database_add_user(database, "user,=", "pass", &roles, NULL, &error); mongoc_database_destroy(database); mongoc_client_destroy(client); client = mongoc_client_new(authuristr); if (!client) { fprintf(stderr, "failed to parse SCRAM uri\n"); goto CLEANUP; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); mongoc_cursor_next(cursor, &doc); if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "Auth error: %s\n", error.message); goto CLEANUP; } exit_code = EXIT_SUCCESS; CLEANUP: bson_destroy(&roles); bson_destroy(&query); if (collection) { mongoc_collection_destroy(collection); } if (uri) { mongoc_uri_destroy(uri); } if (client) { mongoc_client_destroy(client); } if (cursor) { mongoc_cursor_destroy(cursor); } mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-sdam-monitoring.c000066400000000000000000000177721511661753600256570ustar00rootroot00000000000000/* gcc example-sdam-monitoring.c -o example-sdam-monitoring \ * $(pkg-config --cflags --libs libmongoc-1.0) */ /* ./example-sdam-monitoring [CONNECTION_STRING] */ #include #include typedef struct { int server_changed_events; int server_opening_events; int server_closed_events; int topology_changed_events; int topology_opening_events; int topology_closed_events; int heartbeat_started_events; int heartbeat_succeeded_events; int heartbeat_failed_events; } stats_t; static void server_changed(const mongoc_apm_server_changed_t *event) { stats_t *context; const mongoc_server_description_t *prev_sd, *new_sd; context = (stats_t *)mongoc_apm_server_changed_get_context(event); context->server_changed_events++; prev_sd = mongoc_apm_server_changed_get_previous_description(event); new_sd = mongoc_apm_server_changed_get_new_description(event); printf("server changed: %s %s -> %s\n", mongoc_apm_server_changed_get_host(event)->host_and_port, mongoc_server_description_type(prev_sd), mongoc_server_description_type(new_sd)); } static void server_opening(const mongoc_apm_server_opening_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_opening_get_context(event); context->server_opening_events++; printf("server opening: %s\n", mongoc_apm_server_opening_get_host(event)->host_and_port); } static void server_closed(const mongoc_apm_server_closed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_closed_get_context(event); context->server_closed_events++; printf("server closed: %s\n", mongoc_apm_server_closed_get_host(event)->host_and_port); } static void topology_changed(const mongoc_apm_topology_changed_t *event) { stats_t *context; const mongoc_topology_description_t *prev_td; const mongoc_topology_description_t *new_td; mongoc_server_description_t **prev_sds; size_t n_prev_sds; mongoc_server_description_t **new_sds; size_t n_new_sds; size_t i; mongoc_read_prefs_t *prefs; context = (stats_t *)mongoc_apm_topology_changed_get_context(event); context->topology_changed_events++; prev_td = mongoc_apm_topology_changed_get_previous_description(event); prev_sds = mongoc_topology_description_get_servers(prev_td, &n_prev_sds); new_td = mongoc_apm_topology_changed_get_new_description(event); new_sds = mongoc_topology_description_get_servers(new_td, &n_new_sds); printf("topology changed: %s -> %s\n", mongoc_topology_description_type(prev_td), mongoc_topology_description_type(new_td)); if (n_prev_sds) { printf(" previous servers:\n"); for (i = 0; i < n_prev_sds; i++) { printf(" %s %s\n", mongoc_server_description_type(prev_sds[i]), mongoc_server_description_host(prev_sds[i])->host_and_port); } } if (n_new_sds) { printf(" new servers:\n"); for (i = 0; i < n_new_sds; i++) { printf(" %s %s\n", mongoc_server_description_type(new_sds[i]), mongoc_server_description_host(new_sds[i])->host_and_port); } } prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); if (mongoc_topology_description_has_readable_server(new_td, prefs)) { printf(" secondary AVAILABLE\n"); } else { printf(" secondary UNAVAILABLE\n"); } if (mongoc_topology_description_has_writable_server(new_td)) { printf(" primary AVAILABLE\n"); } else { printf(" primary UNAVAILABLE\n"); } mongoc_read_prefs_destroy(prefs); mongoc_server_descriptions_destroy_all(prev_sds, n_prev_sds); mongoc_server_descriptions_destroy_all(new_sds, n_new_sds); } static void topology_opening(const mongoc_apm_topology_opening_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_topology_opening_get_context(event); context->topology_opening_events++; printf("topology opening\n"); } static void topology_closed(const mongoc_apm_topology_closed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_topology_closed_get_context(event); context->topology_closed_events++; printf("topology closed\n"); } static void server_heartbeat_started(const mongoc_apm_server_heartbeat_started_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_heartbeat_started_get_context(event); context->heartbeat_started_events++; printf("%s heartbeat started\n", mongoc_apm_server_heartbeat_started_get_host(event)->host_and_port); } static void server_heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { stats_t *context; char *reply; context = (stats_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); context->heartbeat_succeeded_events++; reply = bson_as_canonical_extended_json(mongoc_apm_server_heartbeat_succeeded_get_reply(event), NULL); printf("%s heartbeat succeeded: %s\n", mongoc_apm_server_heartbeat_succeeded_get_host(event)->host_and_port, reply); bson_free(reply); } static void server_heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *event) { stats_t *context; bson_error_t error; context = (stats_t *)mongoc_apm_server_heartbeat_failed_get_context(event); context->heartbeat_failed_events++; mongoc_apm_server_heartbeat_failed_get_error(event, &error); printf( "%s heartbeat failed: %s\n", mongoc_apm_server_heartbeat_failed_get_host(event)->host_and_port, error.message); } int main(int argc, char *argv[]) { mongoc_client_t *client; mongoc_apm_callbacks_t *cbs; stats_t stats = {0}; const char *uri_string = "mongodb://127.0.0.1/?appname=sdam-monitoring-example"; mongoc_uri_t *uri; bson_t cmd = BSON_INITIALIZER; bson_t reply; bson_error_t error; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_server_changed_cb(cbs, server_changed); mongoc_apm_set_server_opening_cb(cbs, server_opening); mongoc_apm_set_server_closed_cb(cbs, server_closed); mongoc_apm_set_topology_changed_cb(cbs, topology_changed); mongoc_apm_set_topology_opening_cb(cbs, topology_opening); mongoc_apm_set_topology_closed_cb(cbs, topology_closed); mongoc_apm_set_server_heartbeat_started_cb(cbs, server_heartbeat_started); mongoc_apm_set_server_heartbeat_succeeded_cb(cbs, server_heartbeat_succeeded); mongoc_apm_set_server_heartbeat_failed_cb(cbs, server_heartbeat_failed); mongoc_client_set_apm_callbacks(client, cbs, (void *)&stats /* context pointer */); /* the driver connects on demand to perform first operation */ BSON_APPEND_INT32(&cmd, "buildinfo", 1); mongoc_client_command_simple(client, "admin", &cmd, NULL, &reply, &error); mongoc_uri_destroy(uri); mongoc_client_destroy(client); printf("Events:\n" " server changed: %d\n" " server opening: %d\n" " server closed: %d\n" " topology changed: %d\n" " topology opening: %d\n" " topology closed: %d\n" " heartbeat started: %d\n" " heartbeat succeeded: %d\n" " heartbeat failed: %d\n", stats.server_changed_events, stats.server_opening_events, stats.server_closed_events, stats.topology_changed_events, stats.topology_opening_events, stats.topology_closed_events, stats.heartbeat_started_events, stats.heartbeat_succeeded_events, stats.heartbeat_failed_events); bson_destroy(&cmd); bson_destroy(&reply); mongoc_apm_callbacks_destroy(cbs); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-session.c000066400000000000000000000074461511661753600242300ustar00rootroot00000000000000/* gcc example-session.c -o example-session \ * $(pkg-config --cflags --libs libmongoc-1.0) */ /* ./example-session [CONNECTION_STRING] */ #include #include int main(int argc, char *argv[]) { int exit_code = EXIT_FAILURE; mongoc_client_t *client = NULL; const char *uri_string = "mongodb://127.0.0.1/?appname=session-example"; mongoc_uri_t *uri = NULL; mongoc_client_session_t *client_session = NULL; mongoc_collection_t *collection = NULL; bson_error_t error; bson_t *selector = NULL; bson_t *update = NULL; bson_t *update_opts = NULL; bson_t *find_opts = NULL; mongoc_read_prefs_t *secondary = NULL; mongoc_cursor_t *cursor = NULL; const bson_t *doc; char *str; bool r; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto done; } client = mongoc_client_new_from_uri(uri); if (!client) { goto done; } mongoc_client_set_error_api(client, 2); /* pass NULL for options - by default the session is causally consistent */ client_session = mongoc_client_start_session(client, NULL, &error); if (!client_session) { fprintf(stderr, "Failed to start session: %s\n", error.message); goto done; } collection = mongoc_client_get_collection(client, "test", "collection"); selector = BCON_NEW("_id", BCON_INT32(1)); update = BCON_NEW("$inc", "{", "x", BCON_INT32(1), "}"); update_opts = bson_new(); if (!mongoc_client_session_append(client_session, update_opts, &error)) { fprintf(stderr, "Could not add session to opts: %s\n", error.message); goto done; } r = mongoc_collection_update_one(collection, selector, update, update_opts, NULL /* reply */, &error); if (!r) { fprintf(stderr, "Update failed: %s\n", error.message); goto done; } bson_destroy(selector); selector = BCON_NEW("_id", BCON_INT32(1)); secondary = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); find_opts = BCON_NEW("maxTimeMS", BCON_INT32(2000)); if (!mongoc_client_session_append(client_session, find_opts, &error)) { fprintf(stderr, "Could not add session to opts: %s\n", error.message); goto done; } /* read from secondary. since we're in a causally consistent session, the * data is guaranteed to reflect the update we did on the primary. the query * blocks waiting for the secondary to catch up, if necessary, or times out * and fails after 2000 ms. */ cursor = mongoc_collection_find_with_opts(collection, selector, find_opts, secondary); while (mongoc_cursor_next(cursor, &doc)) { str = bson_as_relaxed_extended_json(doc, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "Cursor Failure: %s\n", error.message); goto done; } exit_code = EXIT_SUCCESS; done: if (find_opts) { bson_destroy(find_opts); } if (update) { bson_destroy(update); } if (selector) { bson_destroy(selector); } if (update_opts) { bson_destroy(update_opts); } if (secondary) { mongoc_read_prefs_destroy(secondary); } /* destroy cursor, collection, session before the client they came from */ if (cursor) { mongoc_cursor_destroy(cursor); } if (collection) { mongoc_collection_destroy(collection); } if (client_session) { mongoc_client_session_destroy(client_session); } if (uri) { mongoc_uri_destroy(uri); } if (client) { mongoc_client_destroy(client); } mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-start-at-optime.c000066400000000000000000000054661511661753600255770ustar00rootroot00000000000000/* An example of starting a change stream with startAtOperationTime. */ #include int main(void) { int exit_code = EXIT_FAILURE; const char *uri_string; mongoc_uri_t *uri = NULL; bson_error_t error; mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; bson_t pipeline = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; mongoc_change_stream_t *stream = NULL; bson_iter_t iter; const bson_t *doc; bson_value_t cached_operation_time = {0}; int i; bool r; mongoc_init(); uri_string = "mongodb://localhost:27017/db?replicaSet=rs0"; uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto cleanup; } client = mongoc_client_new_from_uri(uri); if (!client) { goto cleanup; } /* insert five documents. */ coll = mongoc_client_get_collection(client, "db", "coll"); for (i = 0; i < 5; i++) { bson_t reply; bson_t *insert_cmd = BCON_NEW("insert", "coll", "documents", "[", "{", "x", BCON_INT64(i), "}", "]"); r = mongoc_collection_write_command_with_opts(coll, insert_cmd, NULL, &reply, &error); bson_destroy(insert_cmd); if (!r) { bson_destroy(&reply); fprintf(stderr, "failed to insert: %s\n", error.message); goto cleanup; } if (i == 0) { /* cache the operation time in the first reply. */ if (bson_iter_init_find(&iter, &reply, "operationTime")) { bson_value_copy(bson_iter_value(&iter), &cached_operation_time); } else { fprintf(stderr, "reply does not contain operationTime."); bson_destroy(&reply); goto cleanup; } } bson_destroy(&reply); } /* start a change stream at the first returned operationTime. */ BSON_APPEND_VALUE(&opts, "startAtOperationTime", &cached_operation_time); stream = mongoc_collection_watch(coll, &pipeline, &opts); /* since the change stream started at the operation time of the first * insert, the five inserts are returned. */ printf("listening for changes on db.coll:\n"); while (mongoc_change_stream_next(stream, &doc)) { char *as_json; as_json = bson_as_canonical_extended_json(doc, NULL); printf("change received: %s\n", as_json); bson_free(as_json); } exit_code = EXIT_SUCCESS; cleanup: mongoc_uri_destroy(uri); bson_destroy(&pipeline); bson_destroy(&opts); if (cached_operation_time.value_type) { bson_value_destroy(&cached_operation_time); } mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-structured-log.c000066400000000000000000000125401511661753600255170ustar00rootroot00000000000000/* gcc example-structured-log.c -o example-structured-log \ * $(pkg-config --cflags --libs libmongoc-1.0) */ #include #include #include #include static pthread_mutex_t handler_mutex; static void example_handler(const mongoc_structured_log_entry_t *entry, void *user_data) { (void)user_data; mongoc_structured_log_component_t component = mongoc_structured_log_entry_get_component(entry); mongoc_structured_log_level_t level = mongoc_structured_log_entry_get_level(entry); const char *message_string = mongoc_structured_log_entry_get_message_string(entry); /* * With a single-threaded mongoc_client_t, handlers will always be called * by the thread that owns the client. On a mongoc_client_pool_t, handlers * are shared by multiple threads and must be reentrant. * * Note that unstructured logging includes a global mutex in the API, * but structured logging allows applications to avoid lock contention * even when multiple threads are issuing commands simultaneously. * * Simple apps like this example can achieve thread safety by adding their * own global mutex. For other apps, this would be a performance bottleneck * and it would be more appropriate for handlers to process their log * messages concurrently. * * In this example, our mutex protects access to a global log counter. * In a real application, you may need to protect access to a shared stream * or queue. */ pthread_mutex_lock(&handler_mutex); static unsigned log_serial_number = 0; printf("%u. Log entry with component=%s level=%s message_string='%s'\n", ++log_serial_number, mongoc_structured_log_get_component_name(component), mongoc_structured_log_get_level_name(level), message_string); /* * At this point, the handler might make additional filtering decisions * before asking for a bson_t. As an example, let's log the component and * level for all messages but only show contents for command logs. */ if (component == MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND) { bson_t *message = mongoc_structured_log_entry_message_as_bson(entry); char *json = bson_as_relaxed_extended_json(message, NULL); printf("Full log message, as json: %s\n", json); bson_destroy(message); bson_free(json); } pthread_mutex_unlock(&handler_mutex); } int main(void) { const char *uri_string = "mongodb://localhost:27017"; int result = EXIT_FAILURE; bson_error_t error; mongoc_uri_t *uri = NULL; mongoc_structured_log_opts_t *log_opts = NULL; mongoc_client_t *client = NULL; mongoc_client_pool_t *pool = NULL; /* * Note that structured logging only applies per-client or per-pool, * and it won't be used during or before mongoc_init. */ mongoc_init(); /* * Logging options are represented by a mongoc_structured_log_opts_t, * which can be copied into a mongoc_client_t or mongoc_client_pool_t * using mongoc_client_set_structured_log_opts() or * mongoc_client_pool_set_structured_log_opts(), respectively. * * Default settings are captured from the environment into * this structure when it's constructed. */ log_opts = mongoc_structured_log_opts_new(); /* * For demonstration purposes, set up a handler that receives all possible log messages. */ pthread_mutex_init(&handler_mutex, NULL); mongoc_structured_log_opts_set_max_level_for_all_components(log_opts, MONGOC_STRUCTURED_LOG_LEVEL_TRACE); mongoc_structured_log_opts_set_handler(log_opts, example_handler, NULL); /* * By default libmongoc processes log options from the environment first, * and then allows you to apply programmatic overrides. To request the * opposite behavior, allowing the environment to override programmatic * defaults, you can ask for the environment to be re-read after setting * your own defaults. */ mongoc_structured_log_opts_set_max_levels_from_env(log_opts); /* * Create a MongoDB URI object. This example assumes a local server. */ uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "URI parse error: %s\n", error.message); goto done; } /* * Create a new client pool. */ pool = mongoc_client_pool_new(uri); if (!pool) { goto done; } /* * Set the client pool's log options. * This must happen only once, and only before the first mongoc_client_pool_pop. * There's no need to keep log_opts after this point. */ mongoc_client_pool_set_structured_log_opts(pool, log_opts); /* * Check out a client, and do some work that we'll see logs from. * This example just sends a 'ping' command. */ client = mongoc_client_pool_pop(pool); if (!client) { goto done; } bson_t *command = BCON_NEW("ping", BCON_INT32(1)); bson_t reply; bool command_ret = mongoc_client_command_simple(client, "admin", command, NULL, &reply, &error); bson_destroy(command); bson_destroy(&reply); mongoc_client_pool_push(pool, client); if (!command_ret) { fprintf(stderr, "Command error: %s\n", error.message); goto done; } result = EXIT_SUCCESS; done: mongoc_uri_destroy(uri); mongoc_structured_log_opts_destroy(log_opts); mongoc_client_pool_destroy(pool); mongoc_cleanup(); return result; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-transaction.c000066400000000000000000000133021511661753600250560ustar00rootroot00000000000000/* gcc example-transaction.c -o example-transaction \ * $(pkg-config --cflags --libs libmongoc-1.0) */ /* ./example-transaction [CONNECTION_STRING] */ #include #include int main(int argc, char *argv[]) { int exit_code = EXIT_FAILURE; mongoc_client_t *client = NULL; mongoc_database_t *database = NULL; mongoc_collection_t *collection = NULL; mongoc_client_session_t *session = NULL; mongoc_session_opt_t *session_opts = NULL; mongoc_transaction_opt_t *default_txn_opts = NULL; mongoc_transaction_opt_t *txn_opts = NULL; mongoc_read_concern_t *read_concern = NULL; mongoc_write_concern_t *write_concern = NULL; const char *uri_string = "mongodb://127.0.0.1/?appname=transaction-example"; mongoc_uri_t *uri; bson_error_t error; bson_t *doc = NULL; bson_t *insert_opts = NULL; int32_t i; int64_t start; bson_t reply = BSON_INITIALIZER; char *reply_json; bool r; mongoc_init(); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { MONGOC_ERROR("failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto done; } client = mongoc_client_new_from_uri(uri); if (!client) { goto done; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "example-transaction"); /* inserting into a nonexistent collection normally creates it, but a * collection can't be created in a transaction; create it now */ collection = mongoc_database_create_collection(database, "collection", NULL, &error); if (!collection) { /* code 48 is NamespaceExists, see error_codes.err in mongodb source */ if (error.code == 48) { collection = mongoc_database_get_collection(database, "collection"); } else { MONGOC_ERROR("Failed to create collection: %s", error.message); goto done; } } /* a transaction's read preferences, read concern, and write concern can be * set on the client, on the default transaction options, or when starting * the transaction. for the sake of this example, set read concern on the * default transaction options. */ default_txn_opts = mongoc_transaction_opts_new(); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, "snapshot"); mongoc_transaction_opts_set_read_concern(default_txn_opts, read_concern); session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_default_transaction_opts(session_opts, default_txn_opts); session = mongoc_client_start_session(client, session_opts, &error); if (!session) { MONGOC_ERROR("Failed to start session: %s", error.message); goto done; } /* in this example, set write concern when starting the transaction */ txn_opts = mongoc_transaction_opts_new(); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_wmajority(write_concern, 1000 /* wtimeout */); mongoc_transaction_opts_set_write_concern(txn_opts, write_concern); insert_opts = bson_new(); if (!mongoc_client_session_append(session, insert_opts, &error)) { MONGOC_ERROR("Could not add session to opts: %s", error.message); goto done; } retry_transaction: r = mongoc_client_session_start_transaction(session, txn_opts, &error); if (!r) { MONGOC_ERROR("Failed to start transaction: %s", error.message); goto done; } /* insert two documents - on error, retry the whole transaction */ for (i = 0; i < 2; i++) { doc = BCON_NEW("_id", BCON_INT32(i)); bson_destroy(&reply); r = mongoc_collection_insert_one(collection, doc, insert_opts, &reply, &error); bson_destroy(doc); if (!r) { MONGOC_ERROR("Insert failed: %s", error.message); mongoc_client_session_abort_transaction(session, NULL); /* a network error, primary failover, or other temporary error in a * transaction includes {"errorLabels": ["TransientTransactionError"]}, * meaning that trying the entire transaction again may succeed */ if (mongoc_error_has_label(&reply, "TransientTransactionError")) { goto retry_transaction; } goto done; } reply_json = bson_as_relaxed_extended_json(&reply, NULL); printf("%s\n", reply_json); bson_free(reply_json); } /* in case of transient errors, retry for 5 seconds to commit transaction */ start = bson_get_monotonic_time(); while (bson_get_monotonic_time() - start < 5 * 1000 * 1000) { bson_destroy(&reply); r = mongoc_client_session_commit_transaction(session, &reply, &error); if (r) { /* success */ break; } else { MONGOC_ERROR("Warning: commit failed: %s", error.message); if (mongoc_error_has_label(&reply, "TransientTransactionError")) { goto retry_transaction; } else if (mongoc_error_has_label(&reply, "UnknownTransactionCommitResult")) { /* try again to commit */ continue; } /* unrecoverable error trying to commit */ break; } } exit_code = EXIT_SUCCESS; done: bson_destroy(&reply); bson_destroy(insert_opts); mongoc_write_concern_destroy(write_concern); mongoc_read_concern_destroy(read_concern); mongoc_transaction_opts_destroy(txn_opts); mongoc_transaction_opts_destroy(default_txn_opts); mongoc_client_session_destroy(session); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-update.c000066400000000000000000000040271511661753600240170ustar00rootroot00000000000000#include int main(void) { mongoc_init(); bson_t *to_insert = BCON_NEW("_id", BCON_INT32(1)); bson_t *selector = BCON_NEW("_id", "{", "$gt", BCON_INT32(0), "}"); bson_t *update = BCON_NEW("$set", "{", "x", BCON_INT32(1), "}"); const bson_t *next_doc; char *to_str; bson_error_t error = {0}; mongoc_cursor_t *cursor; mongoc_client_t *client; mongoc_collection_t *coll; const char *uri_string = "mongodb://localhost:27017/?appname=example-update"; mongoc_uri_t *uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } coll = mongoc_client_get_collection(client, "db", "example_coll"); mongoc_client_set_error_api(client, 2); /* insert a document */ if (!mongoc_collection_insert_one(coll, to_insert, NULL, NULL, &error)) { fprintf(stderr, "insert failed: %s\n", error.message); return EXIT_FAILURE; } if (!mongoc_collection_update_one(coll, selector, update, NULL, NULL, &error)) { fprintf(stderr, "update failed: %s\n", error.message); return EXIT_FAILURE; } to_str = bson_as_relaxed_extended_json(to_insert, NULL); printf("inserted: %s\n", to_str); bson_free(to_str); cursor = mongoc_collection_find_with_opts(coll, selector, NULL, NULL); BSON_ASSERT(mongoc_cursor_next(cursor, &next_doc)); printf("after update, collection has the following document:\n"); to_str = bson_as_relaxed_extended_json(next_doc, NULL); printf("%s\n", to_str); bson_free(to_str); BSON_ASSERT(mongoc_collection_drop(coll, NULL)); bson_destroy(to_insert); bson_destroy(update); bson_destroy(selector); mongoc_collection_destroy(coll); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/example-with-transaction-cb.c000066400000000000000000000116041511661753600264140ustar00rootroot00000000000000/* gcc example-with-transaction-cb.c -o example-with-transaction-cb $(pkg-config * --cflags --libs libmongoc-1.0) */ /* ./example-with-transaction-cb [CONNECTION_STRING] */ #include #include #include /* * We pass this context object to mongoc_client_session_with_transaction() along * with our callback function. The context object will be passed to our callback * function when it runs, so we can access it. */ typedef struct { mongoc_collection_t *collection; bson_t *insert_opts; } ctx_t; /* * We pass this method as the callback to * mongoc_client_session_with_transaction(). The insert that this method * performs will happen inside of a new transaction. */ bool create_and_insert_doc(mongoc_client_session_t *session, void *ctx, bson_t **reply, /* out param for our server reply */ bson_error_t *error) { /* * mongoc_collection_insert_one requires an uninitialized, stack-allocated * bson_t to receive the update result */ bson_t local_reply; bson_t *doc = NULL; ctx_t *data = NULL; bool retval; /* * Create a new bson document - { id: 1 } */ doc = BCON_NEW("_id", BCON_INT32(1)); printf("Running the user-defined callback in a newly created transaction...\n"); data = (ctx_t *)ctx; retval = mongoc_collection_insert_one(data->collection, doc, data->insert_opts, &local_reply, error); /* * To return to the mongoc_client_session_with_transaction() method, set * *reply to a new copy of our local_reply before destroying it. */ *reply = bson_copy(&local_reply); bson_destroy(&local_reply); bson_destroy(doc); return retval; } int main(int argc, char *argv[]) { int exit_code = EXIT_FAILURE; mongoc_uri_t *uri = NULL; const char *uri_string = "mongodb://127.0.0.1/?appname=with-txn-cb-example"; mongoc_client_t *client = NULL; mongoc_database_t *database = NULL; mongoc_collection_t *collection = NULL; mongoc_client_session_t *session = NULL; bson_t *insert_opts = NULL; bson_t reply; ctx_t ctx; char *str; bson_error_t error; /* * Required to initialize libmongoc's internals */ mongoc_init(); /* * Optionally get MongoDB URI from command line */ if (argc > 1) { uri_string = argv[1]; } /* * Safely create a MongoDB URI object from the given string */ uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { MONGOC_ERROR("failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); goto done; } /* * Create a new client instance */ client = mongoc_client_new_from_uri(uri); if (!client) { goto done; } mongoc_client_set_error_api(client, 2); /* * Get a handle on the database "example-with-txn-cb" */ database = mongoc_client_get_database(client, "example-with-txn-cb"); /* * Inserting into a nonexistent collection normally creates it, but a * collection can't be created in a transaction; create it now */ collection = mongoc_database_create_collection(database, "collection", NULL, &error); if (!collection) { /* code 48 is NamespaceExists, see error_codes.err in mongodb source */ if (error.code == 48) { collection = mongoc_database_get_collection(database, "collection"); } else { MONGOC_ERROR("Failed to create collection: %s", error.message); goto done; } } /* * Pass NULL for options - by default the session is causally consistent */ session = mongoc_client_start_session(client, NULL, &error); if (!session) { MONGOC_ERROR("Failed to start session: %s", error.message); goto done; } /* * Append a logical session id to command options */ insert_opts = bson_new(); if (!mongoc_client_session_append(session, insert_opts, &error)) { MONGOC_ERROR("Could not add session to opts: %s", error.message); goto done; } ctx.collection = collection; ctx.insert_opts = insert_opts; /* * This method will start a new transaction on session, run our callback * function, i.e., &create_and_insert_doc, passing &ctx as an argument and * commit the transaction. */ if (!mongoc_client_session_with_transaction(session, &create_and_insert_doc, NULL, &ctx, &reply, &error)) { MONGOC_ERROR("Insert failed: %s", error.message); goto done; } str = bson_as_relaxed_extended_json(&reply, NULL); printf("%s\n", str); exit_code = EXIT_SUCCESS; done: bson_free(str); bson_destroy(&reply); bson_destroy(insert_opts); mongoc_client_session_destroy(session); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mongoc_cleanup(); return exit_code; } mongo-c-driver-2.2.1/src/libmongoc/examples/find-and-modify.c000066400000000000000000000033011511661753600240430ustar00rootroot00000000000000#include #include int main(void) { mongoc_collection_t *collection; mongoc_client_t *client; const char *uri_string = "mongodb://127.0.0.1:27017/?appname=find-and-modify-example"; mongoc_uri_t *uri; bson_error_t error; bson_t *query; bson_t *update; bson_t reply; char *str; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "test", "test"); /* * Build our query, {"cmpxchg": 1} */ query = BCON_NEW("cmpxchg", BCON_INT32(1)); /* * Build our update. {"$set": {"cmpxchg": 2}} */ update = BCON_NEW("$set", "{", "cmpxchg", BCON_INT32(2), "}"); /* * Submit the findAndModify. */ if (!mongoc_collection_find_and_modify(collection, query, NULL, update, NULL, false, false, true, &reply, &error)) { fprintf(stderr, "find_and_modify() failure: %s\n", error.message); return EXIT_FAILURE; } /* * Print the result as JSON. */ str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); /* * Cleanup. */ bson_destroy(query); bson_destroy(update); bson_destroy(&reply); mongoc_collection_destroy(collection); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/find_and_modify_with_opts/000077500000000000000000000000001511661753600261465ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/find_and_modify_with_opts/fam.c000066400000000000000000000241671511661753600270670ustar00rootroot00000000000000#include /* EXAMPLE_FAM_BYPASS_BEGIN */ void fam_bypass(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t reply; bson_t *update; bson_error_t error; bson_t query = BSON_INITIALIZER; bool success; /* Find Zlatan Ibrahimovic, the striker */ BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); BSON_APPEND_UTF8(&query, "profession", "Football player"); /* Bump his age */ update = BCON_NEW("$inc", "{", "age", BCON_INT32(1), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); /* He can still play, even though he is pretty old. */ mongoc_find_and_modify_opts_set_bypass_document_validation(opts, true); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(update); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_BYPASS_END */ /* EXAMPLE_FAM_FLAGS_BEGIN */ void fam_flags(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t reply; bson_error_t error; bson_t query = BSON_INITIALIZER; bson_t *update; bool success; /* Find Zlatan Ibrahimovic, the striker */ BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); BSON_APPEND_UTF8(&query, "profession", "Football player"); BSON_APPEND_INT32(&query, "age", 34); BSON_APPEND_INT32(&query, "goals", (16 + 35 + 23 + 57 + 16 + 14 + 28 + 84) + (1 + 6 + 62)); /* Add his football position */ update = BCON_NEW("$set", "{", "position", BCON_UTF8("striker"), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); /* Create the document if it didn't exist, and return the updated document */ mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_UPSERT | MONGOC_FIND_AND_MODIFY_RETURN_NEW); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(update); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_FLAGS_END */ /* EXAMPLE_FAM_UPDATE_BEGIN */ void fam_update(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t *update; bson_t reply; bson_error_t error; bson_t query = BSON_INITIALIZER; bool success; /* Find Zlatan Ibrahimovic */ BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); /* Make him a book author */ update = BCON_NEW("$set", "{", "author", BCON_BOOL(true), "}"); opts = mongoc_find_and_modify_opts_new(); /* Note that the document returned is the _previous_ version of the document * To fetch the modified new version, use * mongoc_find_and_modify_opts_set_flags (opts, * MONGOC_FIND_AND_MODIFY_RETURN_NEW); */ mongoc_find_and_modify_opts_set_update(opts, update); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(update); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_UPDATE_END */ /* EXAMPLE_FAM_FIELDS_BEGIN */ void fam_fields(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t fields = BSON_INITIALIZER; bson_t *update; bson_t reply; bson_error_t error; bson_t query = BSON_INITIALIZER; bool success; /* Find Zlatan Ibrahimovic */ BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); /* Return his goal tally */ BSON_APPEND_INT32(&fields, "goals", 1); /* Bump his goal tally */ update = BCON_NEW("$inc", "{", "goals", BCON_INT32(1), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_set_fields(opts, &fields); /* Return the new tally */ mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_RETURN_NEW); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(update); bson_destroy(&fields); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_FIELDS_END */ /* EXAMPLE_FAM_OPTS_BEGIN */ void fam_opts(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t reply; bson_t *update; bson_error_t error; bson_t query = BSON_INITIALIZER; mongoc_write_concern_t *wc; bson_t extra = BSON_INITIALIZER; bool success; /* Find Zlatan Ibrahimovic, the striker */ BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); BSON_APPEND_UTF8(&query, "profession", "Football player"); /* Bump his age */ update = BCON_NEW("$inc", "{", "age", BCON_INT32(1), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); /* Abort if the operation takes too long. */ mongoc_find_and_modify_opts_set_max_time_ms(opts, 100); /* Set write concern w: 2 */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_write_concern_append(wc, &extra); /* Some future findAndModify option the driver doesn't support conveniently */ BSON_APPEND_INT32(&extra, "futureOption", 42); mongoc_find_and_modify_opts_append(opts, &extra); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(&extra); bson_destroy(update); bson_destroy(&query); mongoc_write_concern_destroy(wc); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_OPTS_END */ /* EXAMPLE_FAM_SORT_BEGIN */ void fam_sort(mongoc_collection_t *collection) { mongoc_find_and_modify_opts_t *opts; bson_t *update; bson_t sort = BSON_INITIALIZER; bson_t reply; bson_error_t error; bson_t query = BSON_INITIALIZER; bool success; /* Find all users with the lastname Ibrahimovic */ BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); /* Sort by age (descending) */ BSON_APPEND_INT32(&sort, "age", -1); /* Bump his goal tally */ update = BCON_NEW("$set", "{", "oldest", BCON_BOOL(true), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_set_sort(opts, &sort); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); if (success) { char *str; str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); } bson_destroy(&reply); bson_destroy(update); bson_destroy(&sort); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); } /* EXAMPLE_FAM_SORT_END */ /* EXAMPLE_FAM_MAIN_BEGIN */ int main(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; const char *uri_string = "mongodb://localhost:27017/admin?appname=find-and-modify-opts-example"; mongoc_uri_t *uri; bson_error_t error; bson_t *options; mongoc_init(); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); database = mongoc_client_get_database(client, "databaseName"); options = BCON_NEW("validator", "{", "age", "{", "$lte", BCON_INT32(34), "}", "}", "validationAction", BCON_UTF8("error"), "validationLevel", BCON_UTF8("moderate")); collection = mongoc_database_create_collection(database, "collectionName", options, &error); if (!collection) { fprintf(stderr, "Got error: \"%s\" on line %d\n", error.message, (int)(__LINE__)); return EXIT_FAILURE; } fam_flags(collection); fam_bypass(collection); fam_update(collection); fam_fields(collection); fam_opts(collection); fam_sort(collection); mongoc_collection_drop(collection, NULL); bson_destroy(options); mongoc_uri_destroy(uri); mongoc_database_destroy(database); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } /* EXAMPLE_FAM_MAIN_END */ mongo-c-driver-2.2.1/src/libmongoc/examples/hello_mongoc.c000066400000000000000000000057671511661753600235650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* -- sphinx-include-start -- */ #include int main(int argc, char *argv[]) { const char *uri_string = "mongodb://localhost:27017"; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_database_t *database; mongoc_collection_t *collection; bson_t *command, reply, *insert; bson_error_t error; char *str; bool retval; /* * Required to initialize libmongoc's internals */ mongoc_init(); /* * Optionally get MongoDB URI from command line */ if (argc > 1) { uri_string = argv[1]; } /* * Safely create a MongoDB URI object from the given string */ uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } /* * Create a new client instance */ client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } /* * Register the application name so we can track it in the profile logs * on the server. This can also be done from the URI (see other examples). */ mongoc_client_set_appname(client, "connect-example"); /* * Get a handle on the database "db_name" and collection "coll_name" */ database = mongoc_client_get_database(client, "db_name"); collection = mongoc_client_get_collection(client, "db_name", "coll_name"); /* * Do work. This example pings the database, prints the result as JSON and * performs an insert */ command = BCON_NEW("ping", BCON_INT32(1)); retval = mongoc_client_command_simple(client, "admin", command, NULL, &reply, &error); if (!retval) { fprintf(stderr, "%s\n", error.message); return EXIT_FAILURE; } str = bson_as_relaxed_extended_json(&reply, NULL); printf("%s\n", str); insert = BCON_NEW("hello", BCON_UTF8("world")); if (!mongoc_collection_insert_one(collection, insert, NULL, NULL, &error)) { fprintf(stderr, "%s\n", error.message); } bson_destroy(insert); bson_destroy(&reply); bson_destroy(command); bson_free(str); /* * Release our handles and clean up libmongoc */ mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/mongoc-dump.c000066400000000000000000000142731511661753600233350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include static bool mongoc_dump_mkdir_p(const char *path, int mode) { int r; #ifdef _WIN32 (void)mode; r = _mkdir(path); #else r = mkdir(path, mode); #endif return (r == 0 || errno == EEXIST); } static int mongoc_dump_collection(mongoc_client_t *client, const char *database, const char *collection) { mongoc_collection_t *col; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bson_t query = BSON_INITIALIZER; FILE *stream; char *path; int ret = EXIT_SUCCESS; path = bson_strdup_printf("dump/%s/%s.bson", database, collection); #ifdef _WIN32 _unlink(path); #else unlink(path); #endif stream = fopen(path, "w"); if (!stream) { fprintf(stderr, "Failed to open \"%s\", aborting.\n", path); exit(EXIT_FAILURE); } col = mongoc_client_get_collection(client, database, collection); cursor = mongoc_collection_find_with_opts(col, &query, NULL, NULL); while (mongoc_cursor_next(cursor, &doc)) { if (BSON_UNLIKELY(doc->len != fwrite(bson_get_data(doc), 1, doc->len, stream))) { fprintf(stderr, "Failed to write %u bytes to %s\n", doc->len, path); ret = EXIT_FAILURE; goto cleanup; } } if (mongoc_cursor_error(cursor, &error)) { fprintf(stderr, "ERROR: %s\n", error.message); ret = EXIT_FAILURE; } cleanup: bson_free(path); fclose(stream); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(col); return ret; } static int mongoc_dump_database(mongoc_client_t *client, const char *database, const char *collection) { mongoc_database_t *db; bson_error_t error; char *path; char **str; int ret = EXIT_SUCCESS; int i; BSON_ASSERT_PARAM(client); BSON_ASSERT(database); path = bson_strdup_printf("dump/%s", database); if (!mongoc_dump_mkdir_p(path, 0750)) { fprintf(stderr, "failed to create directory \"%s\"", path); bson_free(path); return EXIT_FAILURE; } bson_free(path); if (collection) { return mongoc_dump_collection(client, database, collection); } db = mongoc_client_get_database(client, database); str = mongoc_database_get_collection_names_with_opts(db, NULL, &error); for (i = 0; str[i]; i++) { if (EXIT_SUCCESS != mongoc_dump_collection(client, database, str[i])) { ret = EXIT_FAILURE; goto cleanup; } } cleanup: mongoc_database_destroy(db); bson_strfreev(str); return ret; } static int mongoc_dump(mongoc_client_t *client, const char *database, const char *collection) { bson_error_t error; char **str; int i; BSON_ASSERT_PARAM(client); if (!mongoc_dump_mkdir_p("dump", 0750)) { perror("Failed to create directory \"dump\""); return EXIT_FAILURE; } if (database) { return mongoc_dump_database(client, database, collection); } if (!(str = mongoc_client_get_database_names_with_opts(client, NULL, &error))) { fprintf(stderr, "Failed to fetch database names: %s\n", error.message); return EXIT_FAILURE; } for (i = 0; str[i]; i++) { if (EXIT_SUCCESS != mongoc_dump_database(client, str[i], NULL)) { bson_strfreev(str); return EXIT_FAILURE; } } bson_strfreev(str); return EXIT_SUCCESS; } static void usage(FILE *stream) { fprintf(stream, "Usage: mongoc-dump [OPTIONS]\n" "\n" "Options:\n" "\n" " -h HOST Optional hostname to connect to [127.0.0.1].\n" " -p PORT Optional port to connect to [27017].\n" " -d DBNAME Optional database name to dump.\n" " -c COLNAME Optional collection name to dump.\n" " --ssl Use SSL when connecting to server.\n" "\n"); } int main(int argc, char *argv[]) { mongoc_client_t *client; const char *collection = NULL; const char *database = NULL; const char *host = "127.0.0.1"; uint16_t port = 27017; bool ssl = false; char *uri_string; mongoc_uri_t *uri; bson_error_t error; int ret; int i; mongoc_init(); for (i = 1; i < argc; i++) { if (0 == strcmp(argv[i], "-c") && ((i + 1) < argc)) { collection = argv[++i]; } else if (0 == strcmp(argv[i], "-d") && ((i + 1) < argc)) { database = argv[++i]; } else if (0 == strcmp(argv[i], "--help")) { usage(stdout); return EXIT_SUCCESS; } else if (0 == strcmp(argv[i], "-h") && ((i + 1) < argc)) { host = argv[++i]; } else if (0 == strcmp(argv[i], "--ssl")) { ssl = true; } else if (0 == strcmp(argv[i], "-p") && ((i + 1) < argc)) { port = atoi(argv[++i]); if (!port) { fprintf(stderr, "Invalid port \"%s\"", argv[i]); return EXIT_FAILURE; } } else { fprintf(stderr, "Unknown argument \"%s\"\n", argv[i]); return EXIT_FAILURE; } } uri_string = bson_strdup_printf( "mongodb://%s:%hu/%s?appname=dump-example&ssl=%s", host, port, database ? database : "", ssl ? "true" : "false"); uri = mongoc_uri_new_with_error(uri_string, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } if (!(client = mongoc_client_new_from_uri(uri))) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); ret = mongoc_dump(client, database, collection); mongoc_uri_destroy(uri); mongoc_client_destroy(client); return ret; } mongo-c-driver-2.2.1/src/libmongoc/examples/mongoc-ping.c000066400000000000000000000044551511661753600233260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include int main(int argc, char *argv[]) { mongoc_database_t *database; mongoc_client_t *client; bson_t reply; uint16_t port; bson_error_t error; bson_t ping; char *host_and_port; mongoc_uri_t *uri; char *str; bool r; if (argc < 2 || argc > 3) { fprintf(stderr, "usage: %s HOSTNAME [PORT]\n", argv[0]); return EXIT_FAILURE; } mongoc_init(); port = (argc == 3) ? atoi(argv[2]) : 27017; if (!strncmp(argv[1], "mongodb://", 10) || !strncmp(argv[1], "mongodb+srv://", 14)) { host_and_port = bson_strdup(argv[1]); } else { host_and_port = bson_strdup_printf("mongodb://%s:%hu", argv[1], port); } uri = mongoc_uri_new_with_error(host_and_port, &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", host_and_port, error.message); return EXIT_FAILURE; } bson_free(host_and_port); client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); bson_init(&ping); bson_append_int32(&ping, "ping", 4, 1); database = mongoc_client_get_database(client, "test"); r = mongoc_database_command_with_opts(database, &ping, NULL, NULL, &reply, &error); if (r) { str = bson_as_canonical_extended_json(&reply, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } else { fprintf(stderr, "Ping failure: %s\n", error.message); } bson_destroy(&ping); bson_destroy(&reply); mongoc_database_destroy(database); mongoc_uri_destroy(uri); mongoc_client_destroy(client); return r ? 0 : 3; } mongo-c-driver-2.2.1/src/libmongoc/examples/mongoc-tail.c000066400000000000000000000053511511661753600233160ustar00rootroot00000000000000#include #include #include #include #ifdef _WIN32 #define sleep(_n) Sleep((_n) * 1000) #endif static void print_bson(const bson_t *b) { char *str; str = bson_as_canonical_extended_json(b, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } static mongoc_cursor_t * query_collection(mongoc_collection_t *collection, uint32_t last_time) { mongoc_cursor_t *cursor; bson_t query; bson_t gt; bson_t opts; BSON_ASSERT(collection); bson_init(&query); BSON_APPEND_DOCUMENT_BEGIN(&query, "ts", >); BSON_APPEND_TIMESTAMP(>, "$gt", last_time, 0); bson_append_document_end(&query, >); bson_init(&opts); BSON_APPEND_BOOL(&opts, "tailable", true); BSON_APPEND_BOOL(&opts, "awaitData", true); cursor = mongoc_collection_find_with_opts(collection, &query, &opts, NULL); bson_destroy(&query); bson_destroy(&opts); return cursor; } static void tail_collection(mongoc_collection_t *collection) { mongoc_cursor_t *cursor; uint32_t last_time; const bson_t *doc; bson_error_t error; bson_iter_t iter; BSON_ASSERT(collection); last_time = (uint32_t)time(NULL); while (true) { cursor = query_collection(collection, last_time); while (!mongoc_cursor_error(cursor, &error) && mongoc_cursor_more(cursor)) { if (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init_find(&iter, doc, "ts") && BSON_ITER_HOLDS_TIMESTAMP(&iter)) { bson_iter_timestamp(&iter, &last_time, NULL); } print_bson(doc); } } if (mongoc_cursor_error(cursor, &error)) { if (error.domain == MONGOC_ERROR_SERVER) { fprintf(stderr, "%s\n", error.message); exit(1); } } mongoc_cursor_destroy(cursor); sleep(1); } } int main(int argc, char *argv[]) { mongoc_collection_t *collection; mongoc_client_t *client; mongoc_uri_t *uri; bson_error_t error; if (argc != 2) { fprintf(stderr, "usage: %s MONGO_URI\n", argv[0]); return EXIT_FAILURE; } mongoc_init(); uri = mongoc_uri_new_with_error(argv[1], &error); if (!uri) { fprintf(stderr, "failed to parse URI: %s\n" "error message: %s\n", argv[1], error.message); return EXIT_FAILURE; } client = mongoc_client_new_from_uri(uri); if (!client) { return EXIT_FAILURE; } mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "local", "oplog.rs"); tail_collection(collection); mongoc_collection_destroy(collection); mongoc_uri_destroy(uri); mongoc_client_destroy(client); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/examples/parse_handshake_cfg.py000066400000000000000000000051441511661753600252520ustar00rootroot00000000000000import sys # `MD_FLAGS` maps the flag to its bit position. # The bit positions must match those defined in src/mongoc/mongoc-handshake-private.h MD_FLAGS = { 'MONGOC_MD_FLAG_ENABLE_CRYPTO': 0, 'MONGOC_MD_FLAG_ENABLE_CRYPTO_CNG': 1, 'MONGOC_MD_FLAG_ENABLE_CRYPTO_COMMON_CRYPTO': 2, 'MONGOC_MD_FLAG_ENABLE_CRYPTO_LIBCRYPTO': 3, 'MONGOC_MD_FLAG_ENABLE_CRYPTO_SYSTEM_PROFILE': 4, 'MONGOC_MD_FLAG_ENABLE_SASL': 5, 'MONGOC_MD_FLAG_ENABLE_SSL': 6, 'MONGOC_MD_FLAG_ENABLE_SSL_OPENSSL': 7, 'MONGOC_MD_FLAG_ENABLE_SSL_SECURE_CHANNEL': 8, 'MONGOC_MD_FLAG_ENABLE_SSL_SECURE_TRANSPORT': 9, 'MONGOC_MD_FLAG_EXPERIMENTAL_FEATURES': 10, 'MONGOC_MD_FLAG_HAVE_SASL_CLIENT_DONE': 11, 'MONGOC_MD_FLAG_HAVE_WEAK_SYMBOLS': 12, 'MONGOC_MD_FLAG_NO_AUTOMATIC_GLOBALS': 13, # Removed in CDRIVER-1330. 'MONGOC_MD_FLAG_ENABLE_SSL_LIBRESSL': 14, # Removed in CDRIVER-5693. 'MONGOC_MD_FLAG_ENABLE_SASL_CYRUS': 15, 'MONGOC_MD_FLAG_ENABLE_SASL_SSPI': 16, 'MONGOC_MD_FLAG_HAVE_SOCKLEN': 17, 'MONGOC_MD_FLAG_ENABLE_COMPRESSION': 18, 'MONGOC_MD_FLAG_ENABLE_COMPRESSION_SNAPPY': 19, 'MONGOC_MD_FLAG_ENABLE_COMPRESSION_ZLIB': 20, 'MONGOC_MD_FLAG_ENABLE_SASL_GSSAPI': 21, 'MONGOC_MD_FLAG_ENABLE_RES_NSEARCH': 22, 'MONGOC_MD_FLAG_ENABLE_RES_NDESTROY': 23, 'MONGOC_MD_FLAG_ENABLE_RES_NCLOSE': 24, 'MONGOC_MD_FLAG_ENABLE_RES_SEARCH': 25, 'MONGOC_MD_FLAG_ENABLE_DNSAPI': 26, 'MONGOC_MD_FLAG_ENABLE_RDTSCP': 27, 'MONGOC_MD_FLAG_HAVE_SCHED_GETCPU': 28, 'MONGOC_MD_FLAG_ENABLE_SHM_COUNTERS': 29, 'MONGOC_MD_FLAG_TRACE': 30, # `MONGOC_MD_FLAG_ENABLE_ICU` was accidentally removed in libmongoc 1.25.0-1.25.3. # If parsing a config-bitfield produced by libmongoc 1.25.0-1.25.3, use the version of `parse_handshake_cfg.py` from the git tag 1.25.0. 'MONGOC_MD_FLAG_ENABLE_ICU': 31, 'MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION': 32, 'MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH': 33, 'MONGOC_MD_FLAG_ENABLE_SRV': 34, 'MONGOC_MD_FLAG_HAVE_BCRYPT_PBKDF2': 35, } def main(): flag_to_number = {s: 2**i for s, i in MD_FLAGS.items()} if len(sys.argv) < 2: print('Usage: python {0} config-bitfield'.format(sys.argv[0])) print('Example: python parse_handshake_cfg.py 0x3e65') return config_bitfield_string = sys.argv[1] config_bitfield_num = int(config_bitfield_string, 0) print('Decimal value: {}'.format(config_bitfield_num)) for flag, num in flag_to_number.items(): v = 'true' if config_bitfield_num & num else 'false' print('{:<50}: {}'.format(flag, v)) if __name__ == '__main__': main() mongo-c-driver-2.2.1/src/libmongoc/examples/tutorial/000077500000000000000000000000001511661753600226005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/examples/tutorial/appending.c000066400000000000000000000044401511661753600247130ustar00rootroot00000000000000#include int main(void) { struct tm born = {0}; struct tm died = {0}; const char *lang_names[] = {"MATH-MATIC", "FLOW-MATIC", "COBOL"}; const char *schools[] = {"Vassar", "Yale"}; const char *degrees[] = {"BA", "PhD"}; uint32_t i; bson_t *document; bson_t child; bson_array_builder_t *bab; char *str; document = bson_new(); /* * Append { "born" : ISODate("1906-12-09") } to the document. * Passing -1 for the length argument tells libbson to calculate the * string length. */ born.tm_year = 6; /* years are 1900-based */ born.tm_mon = 11; /* months are 0-based */ born.tm_mday = 9; bson_append_date_time(document, "born", -1, mktime(&born) * 1000); /* * Append { "died" : ISODate("1992-01-01") } to the document. */ died.tm_year = 92; died.tm_mon = 0; died.tm_mday = 1; /* * For convenience, this macro passes length -1 by default. */ BSON_APPEND_DATE_TIME(document, "died", mktime(&died) * 1000); /* * Append a subdocument. */ BSON_APPEND_DOCUMENT_BEGIN(document, "name", &child); BSON_APPEND_UTF8(&child, "first", "Grace"); BSON_APPEND_UTF8(&child, "last", "Hopper"); bson_append_document_end(document, &child); /* * Append array of strings. Generate keys "0", "1", "2". */ BSON_APPEND_ARRAY_BUILDER_BEGIN(document, "languages", &bab); for (i = 0; i < sizeof lang_names / sizeof(char *); ++i) { bson_array_builder_append_utf8(bab, lang_names[i], -1); } bson_append_array_builder_end(document, bab); /* * Array of subdocuments: * degrees: [ { degree: "BA", school: "Vassar" }, ... ] */ BSON_APPEND_ARRAY_BUILDER_BEGIN(document, "degrees", &bab); for (i = 0; i < sizeof degrees / sizeof(char *); ++i) { bson_array_builder_append_document_begin(bab, &child); BSON_APPEND_UTF8(&child, "degree", degrees[i]); BSON_APPEND_UTF8(&child, "school", schools[i]); bson_array_builder_append_document_end(bab, &child); } bson_append_array_builder_end(document, bab); /* * Print the document as a JSON string. */ str = bson_as_canonical_extended_json(document, NULL); printf("%s\n", str); bson_free(str); /* * Clean up allocated bson documents. */ bson_destroy(document); return 0; } mongo-c-driver-2.2.1/src/libmongoc/examples/tutorial/executing.c000066400000000000000000000013541511661753600247420ustar00rootroot00000000000000#include #include #include int main(void) { mongoc_client_t *client; bson_error_t error; bson_t *command; bson_t reply; char *str; mongoc_init(); client = mongoc_client_new("mongodb://localhost:27017/?appname=executing-example"); command = BCON_NEW("ping", BCON_INT32(1)); if (mongoc_client_command_simple(client, "mydb", command, NULL, &reply, &error)) { str = bson_as_canonical_extended_json(&reply, NULL); printf("%s\n", str); bson_free(str); } else { fprintf(stderr, "Failed to run command: %s\n", error.message); } bson_destroy(command); bson_destroy(&reply); mongoc_client_destroy(client); mongoc_cleanup(); return 0; } mongo-c-driver-2.2.1/src/libmongoc/libmongoc.rc.in000066400000000000000000000032731511661753600220300ustar00rootroot00000000000000// Defines Version Information to include in DLL on Windows. // Refer: https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource #include // Defines VS_VERSION_INFO #include // Defines MONGOC_MAJOR_VERSION and other version macros. #define MONGOC_OUTPUT_BASENAME "@MONGOC_OUTPUT_BASENAME@" VS_VERSION_INFO VERSIONINFO FILEVERSION MONGOC_MAJOR_VERSION,MONGOC_MINOR_VERSION,MONGOC_MICRO_VERSION,0 PRODUCTVERSION MONGOC_MAJOR_VERSION,MONGOC_MINOR_VERSION,MONGOC_MICRO_VERSION,0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0L #endif // Set FILEOS to VOS_UNKNOWN. There is no documented value for 64-bit builds. FILEOS VOS_UNKNOWN FILETYPE VFT_DLL // Set FILESUBTYPE to VFT2_UNKNOWN. There is no applicable value. FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN // Use langID `0409` for "US English". Use charsetID `04b0` for "Unicode" BLOCK "040904b0" BEGIN VALUE "CompanyName", "MongoDB, Inc" VALUE "FileDescription", "MongoDB Client Library for C" VALUE "FileVersion", MONGOC_VERSION_S VALUE "InternalName", MONGOC_OUTPUT_BASENAME "@PROJECT_VERSION_MAJOR@" VALUE "OriginalFilename", MONGOC_OUTPUT_BASENAME "@PROJECT_VERSION_MAJOR@.dll" VALUE "ProductName", "MongoDB C Driver" VALUE "ProductVersion", MONGOC_VERSION_S VALUE "LegalCopyright", "Copyright 2009-present MongoDB, Inc." END END BLOCK "VarFileInfo" BEGIN // Use langID `0x0409` for "U.S. English". Use charsetID `1200` for "Unicode". VALUE "Translation", 0x409, 1200 END END mongo-c-driver-2.2.1/src/libmongoc/src/000077500000000000000000000000001511661753600177065ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/000077500000000000000000000000001511661753600211705ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/.gitignore000066400000000000000000000000411511661753600231530ustar00rootroot00000000000000mongoc-config.h mongoc-version.h mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-azure.c000066400000000000000000000202431511661753600232240ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #define AZURE_API_VERSION "2018-02-01" static const char *const DEFAULT_METADATA_PATH = "/metadata/identity/oauth2/token?api-version=" AZURE_API_VERSION; bool mcd_azure_imds_request_init(mcd_azure_imds_request *req, const char *token_resource, const char *const opt_imds_host, int opt_port, const char *const opt_extra_headers, const char *const opt_client_id) { BSON_ASSERT_PARAM(req); BSON_ASSERT_PARAM(token_resource); bool ok = false; char *encoded_token_resource = NULL; mcommon_string_append_t path = {0}; _mongoc_http_request_init(&req->req); // The HTTP host of the IMDS server req->req.host = req->_owned_host = bson_strdup(opt_imds_host ? opt_imds_host : "169.254.169.254"); if (opt_port) { req->req.port = opt_port; } else { req->req.port = 80; } // No body req->req.body = ""; // We GET req->req.method = "GET"; // 'Metadata: true' is required req->req.extra_headers = req->_owned_headers = bson_strdup_printf("Metadata: true\r\n" "Accept: application/json\r\n%s", opt_extra_headers ? opt_extra_headers : ""); // Build the path with query parameters. encoded_token_resource = mongoc_percent_encode(token_resource); if (!encoded_token_resource) { goto fail; } mcommon_string_new_as_append(&path); if (!mcommon_string_append(&path, DEFAULT_METADATA_PATH) || !mcommon_string_append_printf(&path, "&resource=%s", encoded_token_resource)) { goto fail; } if (opt_client_id) { if (!mcommon_string_append_printf(&path, "&client_id=%s", opt_client_id)) { goto fail; } } req->req.path = req->_owned_path = mcommon_string_from_append_destroy_with_steal(&path); path = (mcommon_string_append_t){0}; ok = true; fail: bson_free(encoded_token_resource); mcommon_string_from_append_destroy(&path); return ok; } void mcd_azure_imds_request_destroy(mcd_azure_imds_request *req) { BSON_ASSERT_PARAM(req); bson_free(req->_owned_path); bson_free(req->_owned_host); bson_free(req->_owned_headers); *req = MCD_AZURE_IMDS_REQUEST_INIT; } bool mcd_azure_access_token_try_init_from_json_str(mcd_azure_access_token *out, const char *json, int len, bson_error_t *error) { BSON_ASSERT_PARAM(out); BSON_ASSERT_PARAM(json); bool okay = false; if (len < 0) { // Detect from a null-terminated string len = (int)strlen(json); } // Zero the output *out = (mcd_azure_access_token){0}; // Parse the JSON data bson_t bson; if (!bson_init_from_json(&bson, json, len, error)) { return false; } bson_iter_t iter; // access_token bool found = bson_iter_init_find(&iter, &bson, "access_token"); const char *const access_token = !found ? NULL : bson_iter_utf8(&iter, NULL); // resource found = bson_iter_init_find(&iter, &bson, "resource"); const char *const resource = !found ? NULL : bson_iter_utf8(&iter, NULL); // token_type found = bson_iter_init_find(&iter, &bson, "token_type"); const char *const token_type = !found ? NULL : bson_iter_utf8(&iter, NULL); // expires_in found = bson_iter_init_find(&iter, &bson, "expires_in"); uint32_t expires_in_len = 0; const char *const expires_in_str = !found ? NULL : bson_iter_utf8(&iter, &expires_in_len); if (!(access_token && resource && token_type && expires_in_str)) { _mongoc_set_error(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_BAD_JSON, "One or more required JSON properties are missing/invalid: data: %.*s", len, json); } else { // Set the output, duplicate each string *out = (mcd_azure_access_token){ .access_token = bson_strdup(access_token), .resource = bson_strdup(resource), .token_type = bson_strdup(token_type), }; // "expires_in" encodes the number of seconds since the issue time for // which the token will be valid. strtoll() will saturate on range errors // and return zero on parse errors. char *parse_end; const long long expires_in = strtoll(expires_in_str, &parse_end, 0); if (parse_end != expires_in_str + expires_in_len) { // Did not parse the entire string. Bad _mongoc_set_error(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_BAD_JSON, "Invalid 'expires_in' string \"%.*s\" from IMDS server", mlib_in_range(int, expires_in_len) ? (int)expires_in_len : INT_MAX, expires_in_str); } else { out->expires_in = mlib_duration(expires_in, s); okay = true; } } bson_destroy(&bson); return okay; } void mcd_azure_access_token_destroy(mcd_azure_access_token *c) { bson_free(c->access_token); bson_free(c->resource); bson_free(c->token_type); c->access_token = NULL; c->resource = NULL; c->token_type = NULL; } bool mcd_azure_access_token_from_imds(mcd_azure_access_token *const out, const char *token_resource, const char *const opt_imds_host, int opt_port, const char *opt_extra_headers, mlib_timer opt_timer, const char *opt_client_id, bson_error_t *error) { BSON_ASSERT_PARAM(token_resource); BSON_ASSERT_PARAM(out); bool okay = false; // Clear the output *out = (mcd_azure_access_token){0}; mongoc_http_response_t resp; _mongoc_http_response_init(&resp); mcd_azure_imds_request req = MCD_AZURE_IMDS_REQUEST_INIT; if (!mcd_azure_imds_request_init(&req, token_resource, opt_imds_host, opt_port, opt_extra_headers, opt_client_id)) { _mongoc_set_error(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_HTTP, "Failed to initialize request"); goto fail; } mlib_timer timer = mlib_time_cmp(opt_timer.expires_at, !=, (mlib_time_point){0}) ? opt_timer : mlib_expires_after(mlib_duration(3, s)); // Default 3 second timeout. if (!_mongoc_http_send(&req.req, timer, false, NULL, &resp, error)) { goto fail; } // We only accept an HTTP 200 as a success if (resp.status != 200) { _mongoc_set_error(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_HTTP, "Error from Azure IMDS server while looking for " "Managed Identity access token: %.*s", resp.body_len, resp.body); goto fail; } // Parse the token from the response JSON if (!mcd_azure_access_token_try_init_from_json_str(out, resp.body, resp.body_len, error)) { goto fail; } okay = true; fail: mcd_azure_imds_request_destroy(&req); _mongoc_http_response_cleanup(&resp); return okay; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-azure.h000066400000000000000000000126631511661753600232400ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MCD_AZURE_H_INCLUDED #define MCD_AZURE_H_INCLUDED #include #include #include #include #include #define MCD_TOKEN_RESOURCE_VAULT "https://vault.azure.net" /** * @brief An Azure OAuth2 access token obtained from the Azure API */ typedef struct mcd_azure_access_token { /// The access token string char *access_token; /// The resource of the token (the Azure resource for which it is valid) char *resource; /// The HTTP type of the token char *token_type; /// The duration after which it will the token will expires. This is relative /// to the "issue time" of the token. mlib_duration expires_in; } mcd_azure_access_token; /** * @brief Try to parse an Azure access token from an IMDS metadata JSON response * * @param out Overwritten with the obtained token. Must later be destroyed. * @pre `*out` must be in a non-owning state (e.g. uninitialized or zero-initialized). * @param json The JSON string body * @param len The length of 'body' * @param error An output parameter for errors * @retval true If 'out' was successfully initialized to a token. * @retval false Otherwise * * @note The 'out' token must later be given to @ref * mcd_azure_access_token_destroy */ bool mcd_azure_access_token_try_init_from_json_str(mcd_azure_access_token *out, const char *json, int len, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; /** * @brief Destroy and zero-fill an access token object * * @param token The access token to destroy */ void mcd_azure_access_token_destroy(mcd_azure_access_token *token); /** * @brief An Azure IMDS HTTP request */ typedef struct mcd_azure_imds_request { /// The underlying HTTP request object to be sent mongoc_http_request_t req; char *_owned_path; char *_owned_host; char *_owned_headers; } mcd_azure_imds_request; #define MCD_AZURE_IMDS_REQUEST_INIT \ (mcd_azure_imds_request) \ { \ .req = {0}, ._owned_path = NULL, ._owned_host = NULL, ._owned_headers = NULL, \ } /** * @brief Initialize a new IMDS HTTP request * * @param out The object to initialize * @param token_resource Will be percent encoded and passed as the "resource" query parameter. * @param opt_imds_host (Optional) the IP host of the IMDS server * @param opt_port (Optional) The port of the IMDS HTTP server (default is 80) * @param opt_extra_headers (Optional) Set extra HTTP headers for the request * @param opt_client_id (Optional) Added as the "client_id" query parameter. * * @note the request must later be destroyed with mcd_azure_imds_request_destroy, even on error. * * @retval true Upon success. * @retval false Otherwise. */ bool mcd_azure_imds_request_init(mcd_azure_imds_request *req, const char *token_resource, const char *const opt_imds_host, int opt_port, const char *const opt_extra_headers, const char *opt_client_id); /** * @brief Destroy an IMDS request created with mcd_azure_imds_request_init() * * @param req */ void mcd_azure_imds_request_destroy(mcd_azure_imds_request *req); /** * @brief Attempt to obtain a new OAuth2 access token from an Azure IMDS HTTP * server. * * @param out Overwritten with the obtained token. Must later be destroyed. * @pre `*out` must be in a non-owning state (e.g. uninitialized or zero-initialized). * @param token_resource Will be percent encoded and passed as the "resource" query parameter. * @param opt_imds_host (Optional) Override the IP host of the IMDS server * @param opt_port (Optional) The port of the IMDS HTTP server (default is 80) * @param opt_extra_headers (Optional) Set extra HTTP headers for the request * @param opt_timer (Optional) The timer for the request. * @param opt_client_id (Optional) Added as the "client_id" query parameter. * @param error Output parameter for errors * @retval true Upon success * @retval false Otherwise. Sets an error via `error` * */ bool mcd_azure_access_token_from_imds(mcd_azure_access_token *const out, const char *token_resource, const char *const opt_imds_host, int opt_port, const char *opt_extra_headers, mlib_timer opt_timer, const char *opt_client_id, bson_error_t *error); #endif // MCD_AZURE_H_INCLUDED mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-integer.h000066400000000000000000000260731511661753600235470ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MCD_INTEGER_H_INCLUDED #define MCD_INTEGER_H_INCLUDED #include #include #include #include /// Return 'true' iff (left * right) would overflow with int64 static BSON_INLINE bool _mcd_i64_mul_would_overflow(int64_t left, int64_t right) { if (right == -1) { // We will perform an integer division, and only (MIN / -1) is undefined // for integer division. return left == INT64_MIN; } if (right == 0) { // Multiplication by zero never overflows, and we cannot divide by zero return false; } // From here on, all integer division by 'right' is well-defined if (left > 0) { if (right > 0) { /** Given: left > 0 and: right > 0 then: left * right > 0 THEN: left * right > MIN Define: max_fac = MAX / right then: max_fac * right = (MAX / right) * right then: max_fac * right = MAX */ const int64_t max_fac = INT64_MAX / right; if (left > max_fac) { /** Given: left > max_fac then: left * right > max_fac * right with: MAX = max_fac * right then: left * right > MAX */ return true; } else { /** Given: left <= max_fac then: left * right <= max_fac * right with: MAX = max_fac * right THEN: left * right <= MAX */ return false; } } else { /** Given: left > 0 and: right <= 0 then: left * right < 0 THEN: left * right < MAX Define: min_fac = MIN / left then: min_Fac * left = (MIN / left) * left then: min_Fac * left = MIN */ const int64_t min_fac = INT64_MIN / left; if (right < min_fac) { /** Given: right < min_fac then: right * left < min_fac * left with: min_fac * left = MIN then: right * left < MIN */ return true; } else { /** Given: right >= min_fac then: right * left >= min_fac * left with: min_fac * left = MIN then: right * left >= MIN */ return false; } } } else { if (right > 0) { /** Given: left <= 0 and: right > 0 then: left * right <= 0 THEN: left * right < MAX Define: min_fac = MIN / right then: min_fac * right = (MIN / right) * right then: min_fac * right = MIN */ const int64_t min_fac = INT64_MIN / right; if (left < min_fac) { /** Given: left < min_fac then: left * right < min_fac * right with: MIN = min_fac * right then: left * right < MIN */ return true; } else { /** Given: left >= min_fac then: left * right >= min_fac * right with: MIN = min_fac * right then: left * right >= MIN */ return false; } } else { /** Given: left <= 0 and: right <= 0 then: left * right >= 0 THEN: left * right > MIN */ if (left == 0) { // Multiplication by zero will never overflow return false; } else { /** Given: left <= 0 and: left != 0 then: left < 0 Define: max_fac = MAX / left then: max_fac * left = (MAX / left) * left then: max_fac * left = MAX Given: left < 0 and: MAX > 0 and: max_fac = MAX / left then: max_fac < 0 [pos/neg -> neg] */ const int64_t max_fac = INT64_MAX / left; if (right < max_fac) { /* Given: right < max_fac and: left < 0 then: left * right > max_fac * left then: left * right > (MAX / left) * left then: left * right > MAX */ return true; } else { /* Given: right >= max_fac and: left < 0 then: left * right <= max_fac * left then: left * right <= (MAX / left) * left then: left * right <= MAX */ return false; } } } } } /// Return 'true' iff (left + right) would overflow with int64 static BSON_INLINE bool _mcd_i64_add_would_overflow(int64_t left, int64_t right) { /** * Context: * * - MAX, MIN, left: right: ℤ * - left >= MIN * - left <= MAX * - right >= MIN * - right <= MAX * - forall (N, M, Q : ℤ) . * if N = M then * M = N (Symmetry) * N + 0 = N (Zero is neutral) * N + M = M + N (Addition is commutative) * if N < M then * 0 - N > 0 - M (Order inversion) * M > N (Symmetry inversion) * 0 - M < 0 - N (order+symmetry inversion) * if M < Q or M = Q then * N < Q (Order transitivity) * 0 - M = -M (Negation is subtraction) * N - M = N + (-M) * Ord(N, M) = Ord(N+Q, M+Q) (Addition preserves ordering) */ // MAX, MIN, left, right: ℤ //* Given: right <= MAX //* Given: left <= MAX if (right < 0) { /** Given: right < 0 then: left + right < left + 0 then: left + right < left then: left + right <= left [Weakening] Given: left <= MAX and: left + right <= left then: left + right <= MAX THEN: left + right CANNOT overflow MAX */ /** Given: right >= MIN then: 0 - right <= 0 - MIN then: -right <= -MIN Given: -right <= -MIN then: MIN + -right <= MIN + -MIN then: MIN + -right <= 0 then: MIN - right <= 0 then: MIN - right <= MAX THEN: MIN - right CANNOT overflow MAX Given: right < 0 then: 0 - right > 0 - 0 then: 0 - right > 0 then: -right > 0 Given: -right > 0 then: MIN + (-right) > MIN + 0 then: MIN - right > MIN + 0 then: MIN - right > MIN THEN: MIN - right CANNOT overflow MIN Define: legroom = MIN - right Given: legroom = MIN - right then: legroom + right = MIN - right + right then: legroom + right = MIN */ const int64_t legroom = INT64_MIN - right; if (left < legroom) { /** Given: left < legroom then: left + right < legroom + right Given: legroom + right = MIN and: left + right < legroom + right then: left + right < MIN THEN: left + right WILL overflow MIN! */ return true; } else { /** Given: left >= legroom then: left + right >= legroom + right Given: legroom + right = MIN and: left + right >= legroom + right THEN: left + right >= MIN Given: left + right <= MAX and: left + right >= MIN THEN: left + right is in [MIN, MAX] */ return false; } } else if (right > 0) { /** Given: right > 0 then: left + right > left + 0 then: left + right > left then: left + right >= left [Weakening] Given: left >= MIN and: left + right >= left then: left + right >= MIN THEN: left + right cannot overflow MIN */ /** Given: right <= MAX then: 0 - right >= 0 - MAX then: -right >= -MAX Given: -right >= -MAX then: MAX + -right >= MAX + -MAX then: MAX + -right >= 0 then: MAX - right >= 0 then: MAX - right >= MIN THEN: MAX - right CANNOT overflow MIN Given: right > 0 then: 0 - right < 0 - 0 then: -right < 0 then: MAX + (-right) < MAX + 0 then: MAX + (-right) < MAX then: MAX - right < MAX THEN: MAX - right CANNOT overflow MAX Define: headroom = MAX - right Given: headroom = MAX - right; then: headroom + right = MAX - right + right then: headroom + right = MAX */ int64_t headroom = INT64_MAX - right; if (left > headroom) { /** Given: left > headroom then: left + right > headroom + right Given: left + right > headroom + right and: headroom + right = MAX then: left + right > MAX THEN: left + right WILL overflow MAX! */ return true; } else { /** Given: left <= headroom then: left + rigth <= headroom + right Given: left + right <= headroom + right and: headroom + right = MAX then: left + right <= MAX THEN: left + right CANNOT overflow MAX */ return false; } } else { /** Given: right = 0 and: left + right = left + 0 then: left + right = left Given: left <= MAX and: left >= MIN and: left + right = left then: left + right <= MAX and: left + right >= MIN THEN: left + right is in [MIN, MAX] */ return false; } } /// Return 'true' iff (left - right) would overflow with int64 static BSON_INLINE bool _mcd_i64_sub_would_overflow(int64_t left, int64_t right) { // Lemma: N - M = N + (-M), therefore (N - M) is bounded iff (N + -M) // is bounded. if (right > 0) { return _mcd_i64_add_would_overflow(left, -right); } else if (right < 0) { if (left > 0) { return _mcd_i64_add_would_overflow(-left, right); } else { // Both negative. Subtracting two negatives will never overflow return false; } } else { // Given: right = 0 // then: left - right = left - 0 // then: left - right = left //? THEN: left - right is bounded return false; } } #endif // MCD_INTEGER_H_INCLUDED mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-nsinfo.c000066400000000000000000000070631511661753600233770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include typedef struct { char *ns; // Hash key. int32_t index; UT_hash_handle hh; } ns_to_index_t; struct _mcd_nsinfo_t { ns_to_index_t *n2i; int32_t count; mongoc_buffer_t payload; }; mcd_nsinfo_t * mcd_nsinfo_new(void) { mcd_nsinfo_t *self = bson_malloc0(sizeof(*self)); _mongoc_buffer_init(&self->payload, NULL, 0, NULL, NULL); return self; } void mcd_nsinfo_destroy(mcd_nsinfo_t *self) { if (!self) { return; } // Delete hash table. ns_to_index_t *entry, *tmp; HASH_ITER(hh, self->n2i, entry, tmp) { HASH_DEL(self->n2i, entry); bson_free(entry->ns); bson_free(entry); } _mongoc_buffer_destroy(&self->payload); bson_free(self); } mlib_diagnostic_push(); mlib_msvc_warning(disable : 4702); // HASH_ADD_KEYPTR int32_t mcd_nsinfo_append(mcd_nsinfo_t *self, const char *ns, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_OPTIONAL_PARAM(error); const int32_t ns_index = self->count; if (self->count == INT32_MAX) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Only %" PRId32 " distinct collections may be used", INT32_MAX); return -1; } self->count++; // Add to hash table. ns_to_index_t *entry = bson_malloc(sizeof(*entry)); *entry = (ns_to_index_t){.index = ns_index, .ns = bson_strdup(ns), .hh = {0}}; mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); HASH_ADD_KEYPTR(hh, self->n2i, entry->ns, strlen(entry->ns), entry); mlib_diagnostic_pop(); // Append to buffer. bson_t mcd_nsinfo_bson = BSON_INITIALIZER; BSON_ASSERT(bson_append_utf8(&mcd_nsinfo_bson, "ns", 2, ns, -1)); BSON_ASSERT(_mongoc_buffer_append(&self->payload, bson_get_data(&mcd_nsinfo_bson), mcd_nsinfo_bson.len)); bson_destroy(&mcd_nsinfo_bson); return ns_index; } mlib_diagnostic_pop(); int32_t mcd_nsinfo_find(const mcd_nsinfo_t *self, const char *ns) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); ns_to_index_t *found; mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); HASH_FIND_STR(self->n2i, ns, found); mlib_diagnostic_pop(); if (found == NULL) { return -1; } return found->index; } uint32_t mcd_nsinfo_get_bson_size(const char *ns) { BSON_ASSERT_PARAM(ns); // Calculate overhead of the BSON document { "ns": "" }. See BSON specification. bson_t as_bson = BSON_INITIALIZER; BSON_ASSERT(bson_append_utf8(&as_bson, "ns", 2, ns, -1)); uint32_t size = as_bson.len; bson_destroy(&as_bson); return size; } const mongoc_buffer_t * mcd_nsinfo_as_document_sequence(const mcd_nsinfo_t *self) { BSON_ASSERT_PARAM(self); return &self->payload; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-nsinfo.h000066400000000000000000000035361511661753600234050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MCD_NSINFO_H #define MCD_NSINFO_H #include #include // `mcd_nsinfo_t` builds the `nsInfo` payload for a `bulkWrite` command. typedef struct _mcd_nsinfo_t mcd_nsinfo_t; mcd_nsinfo_t * mcd_nsinfo_new(void); void mcd_nsinfo_destroy(mcd_nsinfo_t *self); // `mcd_nsinfo_append` adds `ns`. It is the callers responsibility to ensure duplicates are not inserted. // Namespaces are assigned indexes in order of insertion, starting at 0. // Returns the resulting non-negative index on success. Returns -1 on error. int32_t mcd_nsinfo_append(mcd_nsinfo_t *self, const char *ns, bson_error_t *error); // `mcd_nsinfo_find` returns the non-negative index if found. Returns -1 if not found. int32_t mcd_nsinfo_find(const mcd_nsinfo_t *self, const char *ns); // `mcd_nsinfo_get_bson_size` returns the size of the BSON document { "ns": "" } // Useful for checking whether a namespace can be added without exceeding a size limit. uint32_t mcd_nsinfo_get_bson_size(const char *ns); // `mcd_nsinfo_as_document_sequence` returns a document sequence. // Useful for constructing an OP_MSG Section with payloadType=1. const mongoc_buffer_t * mcd_nsinfo_as_document_sequence(const mcd_nsinfo_t *self); #endif // MCD_NSINFO_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-rpc.c000066400000000000000000002241601511661753600226660ustar00rootroot00000000000000#include #include // Header-only dependency. Does NOT require linking with libmongoc. #define MONGOC_INSIDE #include #undef MONGOC_INSIDE #include #include typedef struct _mcd_rpc_message_header mcd_rpc_message_header; typedef struct _mcd_rpc_op_compressed mcd_rpc_op_compressed; typedef struct _mcd_rpc_op_msg_section mcd_rpc_op_msg_section; typedef struct _mcd_rpc_op_msg mcd_rpc_op_msg; typedef struct _mcd_rpc_op_reply mcd_rpc_op_reply; typedef struct _mcd_rpc_op_update mcd_rpc_op_update; typedef struct _mcd_rpc_op_insert mcd_rpc_op_insert; typedef struct _mcd_rpc_op_query mcd_rpc_op_query; typedef struct _mcd_rpc_op_get_more mcd_rpc_op_get_more; typedef struct _mcd_rpc_op_delete mcd_rpc_op_delete; typedef struct _mcd_rpc_op_kill_cursors mcd_rpc_op_kill_cursors; // See: https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol struct _mcd_rpc_message_header { int32_t message_length; int32_t request_id; int32_t response_to; int32_t op_code; bool is_in_iovecs_state; // Not part of actual message. }; struct _mcd_rpc_op_compressed { mcd_rpc_message_header header; int32_t original_opcode; int32_t uncompressed_size; uint8_t compressor_id; const void *compressed_message; // Non-owning. size_t compressed_message_len; // Not part of actual message. }; struct _mcd_rpc_op_msg_section { uint8_t kind; union payload { // Kind 0. struct body { int32_t section_len; // Not part of actual message. const void *bson; // bson_t data, non-owning. } body; // Kind 1. struct document_sequence { int32_t section_len; const char *identifier; // Non-owning. size_t identifier_len; // Not part of actual message. const void *bson_objects; // Array of bson_t data, non-owning. size_t bson_objects_len; // Not part of actual message. } document_sequence; } payload; }; struct _mcd_rpc_op_msg { mcd_rpc_message_header header; uint32_t flag_bits; mcd_rpc_op_msg_section *sections; // Owning. size_t sections_count; // Not part of actual message. uint32_t checksum; // Optional, ignored by Drivers. bool checksum_set; // Not part of actual message. }; struct _mcd_rpc_op_reply { mcd_rpc_message_header header; int32_t response_flags; int64_t cursor_id; int32_t starting_from; int32_t number_returned; const void *documents; // Array of bson_t data, non-owning. size_t documents_len; // Not part of actual message. }; struct _mcd_rpc_op_update { mcd_rpc_message_header header; const char *full_collection_name; // Non-owning. size_t full_collection_name_len; // Not part of actual message. int32_t flags; const void *selector; // bson_t data, non-owning. const void *update; // bson_t data, non-owning. }; struct _mcd_rpc_op_insert { mcd_rpc_message_header header; int32_t flags; const char *full_collection_name; // Non-owning. size_t full_collection_name_len; // Not part of actual message. const void *documents; // Array of bson_t data, non-owning. size_t documents_len; // Not part of actual message. }; struct _mcd_rpc_op_query { mcd_rpc_message_header header; int32_t flags; const char *full_collection_name; // Non-owning. size_t full_collection_name_len; // Not part of actual message. int32_t number_to_skip; int32_t number_to_return; const void *query; // bson_t, non-owning. const void *return_fields_selector; // Optional bson_t, non-owning. }; struct _mcd_rpc_op_get_more { mcd_rpc_message_header header; const char *full_collection_name; // Non-owning. size_t full_collection_name_len; // Not part of actual message. int32_t number_to_return; int64_t cursor_id; }; struct _mcd_rpc_op_delete { mcd_rpc_message_header header; const char *full_collection_name; size_t full_collection_name_len; // Not part of actual message. int32_t flags; const void *selector; // bson_t data, non-owning. }; struct _mcd_rpc_op_kill_cursors { mcd_rpc_message_header header; int32_t zero; // Reserved. int32_t number_of_cursor_ids; int64_t *cursor_ids; // Array of int64_t, owning. }; union _mcd_rpc_message { mcd_rpc_message_header msg_header; // Common initial sequence. mcd_rpc_op_compressed op_compressed; mcd_rpc_op_msg op_msg; mcd_rpc_op_reply op_reply; mcd_rpc_op_update op_update; mcd_rpc_op_insert op_insert; mcd_rpc_op_query op_query; mcd_rpc_op_get_more op_get_more; mcd_rpc_op_delete op_delete; mcd_rpc_op_kill_cursors op_kill_cursors; }; // The minimum byte length of a valid RPC message is 16 bytes (messageHeader is // the common initial sequence for all opcodes). RPC message lengths less than // 16 may be encountered parsing due to invalid or malformed input. #define MONGOC_RPC_MINIMUM_MESSAGE_LENGTH INT32_C(16) // The minimum byte length of a valid BSON document is 5 bytes (empty document): // - length (int32): total document length (including itself). // - "\x00": document terminator. // BSON document lengths less than 5 may be encountered during parsing due to // invalid or malformed input. #define MONGOC_RPC_MINIMUM_BSON_LENGTH INT32_C(5) // To avoid unexpected behavior on big endian targets after // `mcd_rpc_message_to_iovecs` due to fields being converted to little endian, // forbid use of accessors unless the RPC message has been reset to an // initialized state by asserting `!is_in_iovecs_state` even on little endian // targets. #define ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS \ if (1) { \ BSON_ASSERT_PARAM(rpc); \ BSON_ASSERT(!rpc->msg_header.is_in_iovecs_state); \ } else \ (void)0 // In addition to validating expected size against remaining bytes, ensure // proper conversion from little endian format. #define MONGOC_RPC_CONSUME(type, raw_type, from_le) \ static bool _consume_##type(type *target, const uint8_t **ptr, size_t *remaining_bytes) \ { \ BSON_ASSERT_PARAM(target); \ BSON_ASSERT_PARAM(ptr); \ BSON_ASSERT_PARAM(remaining_bytes); \ \ if (*remaining_bytes < sizeof(type)) { \ return false; \ } \ \ raw_type raw; \ memcpy(&raw, *ptr, sizeof(type)); \ \ const raw_type native = from_le(raw); \ memcpy(target, &native, sizeof(type)); \ \ *ptr += sizeof(type); \ *remaining_bytes -= sizeof(type); \ \ return true; \ } MONGOC_RPC_CONSUME(uint8_t, uint8_t, (uint8_t)) MONGOC_RPC_CONSUME(int32_t, uint32_t, BSON_UINT32_FROM_LE) MONGOC_RPC_CONSUME(uint32_t, uint32_t, BSON_UINT32_FROM_LE) MONGOC_RPC_CONSUME(int64_t, uint64_t, BSON_UINT64_FROM_LE) static bool _consume_utf8(const char **target, size_t *length, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(target); BSON_ASSERT_PARAM(length); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); *target = (const char *)*ptr; const uint8_t *iter = *ptr; size_t rem = *remaining_bytes; while (rem > 0u && *iter != '\0') { iter += 1u; rem -= 1u; } if (rem == 0u) { return false; } // Consume string including the null terminator. iter += 1u; rem -= 1u; *length = *remaining_bytes - rem; *ptr = iter; *remaining_bytes = rem; return true; } static bool _consume_reserved_zero(const uint8_t **ptr, size_t *remaining_bytes) { int32_t zero; if (!_consume_int32_t(&zero, ptr, remaining_bytes)) { return false; } if (zero != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // ZERO as invalid input. return false; } return true; } static bool _consume_bson_objects(const uint8_t **ptr, size_t *remaining_bytes, int32_t *num_parsed, int32_t limit) { BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); BSON_OPTIONAL_PARAM(num_parsed); int32_t count = 0; // Validate document count and lengths. while ((count < limit) && (*remaining_bytes > 0u)) { int32_t doc_len; if (!_consume_int32_t(&doc_len, ptr, remaining_bytes)) { return false; } if (doc_len < MONGOC_RPC_MINIMUM_BSON_LENGTH || mlib_cmp(doc_len, >, *remaining_bytes + sizeof(int32_t))) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // document as invalid input. return false; } // Consume rest of document without validation. *ptr += (size_t)doc_len - sizeof(int32_t); *remaining_bytes -= (size_t)doc_len - sizeof(int32_t); count += 1; } if (num_parsed) { *num_parsed = count; } return true; } static bool _consume_op_compressed(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_compressed *const op_compressed = &rpc->op_compressed; if (!_consume_int32_t(&op_compressed->original_opcode, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_compressed->uncompressed_size, ptr, remaining_bytes)) { return false; } if (!_consume_uint8_t(&op_compressed->compressor_id, ptr, remaining_bytes)) { return false; } // Consume compressedMessage without validation. op_compressed->compressed_message = *ptr; op_compressed->compressed_message_len = *remaining_bytes; *ptr += *remaining_bytes; *remaining_bytes = 0u; return true; } static bool _consume_op_msg_section( mcd_rpc_op_msg *op_msg, const uint8_t **ptr, size_t *remaining_bytes, size_t *capacity, bool *found_kind_0) { BSON_ASSERT_PARAM(op_msg); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(found_kind_0); mcd_rpc_op_msg_section section; if (!_consume_uint8_t(§ion.kind, ptr, remaining_bytes)) { return false; } // There is no ordering implied by payload types. A section with payload type // 1 can be serialized before payload type 0. if (section.kind == 0) { if (*found_kind_0) { *ptr -= sizeof(uint8_t); // Revert so *data_end points to start of // section as invalid input. return false; } *found_kind_0 = true; } switch (section.kind) { case 0: { // Body section.payload.body.section_len = mlib_read_i32le(*ptr); section.payload.body.bson = *ptr; int32_t num_parsed = 0; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1) || num_parsed != 1) { return false; } break; } case 1: { // Document Sequence if (!_consume_int32_t(§ion.payload.document_sequence.section_len, ptr, remaining_bytes)) { return false; } // Minimum byte length of a valid document sequence section is 4 bytes // (section length). Actual minimum length would also account for the // identifier field, but 4 bytes is sufficient to avoid unsigned integer // overflow when computing `remaining_section_bytes` and to encourage as // much progress is made parsing input data as able. if (mlib_cmp(section.payload.document_sequence.section_len, <, sizeof(int32_t))) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // document sequence as invalid input. return false; } size_t remaining_section_bytes = (size_t)section.payload.document_sequence.section_len - sizeof(int32_t); // Section length exceeds remaining data. if (remaining_section_bytes > *remaining_bytes) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // document sequence as invalid input. return false; } // Consume identifier without validating uniqueness. { const uint8_t *const identifier_begin = *ptr; if (!_consume_utf8(§ion.payload.document_sequence.identifier, §ion.payload.document_sequence.identifier_len, ptr, &remaining_section_bytes)) { return false; } *remaining_bytes -= (size_t)(*ptr - identifier_begin); } section.payload.document_sequence.bson_objects = *ptr; section.payload.document_sequence.bson_objects_len = remaining_section_bytes; _consume_bson_objects(ptr, &remaining_section_bytes, NULL, INT32_MAX); // Should have exhausted all bytes in the section. if (remaining_section_bytes != 0u) { return false; } *remaining_bytes -= (size_t)(*ptr - (const uint8_t *)section.payload.document_sequence.bson_objects); break; } default: *ptr -= sizeof(uint8_t); // Revert so *data_end points to start of kind // as invalid input. return false; } // Expand sections capacity if required. if (op_msg->sections_count >= *capacity) { *capacity *= 2u; op_msg->sections = bson_realloc(op_msg->sections, *capacity * sizeof(mcd_rpc_op_msg_section)); } // Append the valid section. op_msg->sections[op_msg->sections_count++] = section; return true; } static bool _consume_op_msg(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_msg *const op_msg = &rpc->op_msg; if (!_consume_uint32_t(&op_msg->flag_bits, ptr, remaining_bytes)) { return false; } { const uint32_t defined_bits = MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT | MONGOC_OP_MSG_FLAG_MORE_TO_COME | MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED; // Clients MUST error if any unsupported or undefined required bits are // set to 1 and MUST ignore all undefined optional bits. if (((op_msg->flag_bits & UINT32_C(0x0000FFFF)) & ~defined_bits) != 0u) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flagBits as invalid input. return false; } } // Each message contains one or more sections. Preallocate space for two // sections, which should cover the most frequent cases. size_t capacity = 2u; op_msg->sections = bson_malloc(capacity * sizeof(mcd_rpc_op_msg_section)); op_msg->sections_count = 0u; // A fully constructed OP_MSG MUST contain exactly one Payload Type 0, and // optionally any number of Payload Type 1 where each identifier MUST be // unique per message. { bool found_kind_0 = false; // A section requires at least 5 bytes for kind (1) + length (4). while (*remaining_bytes > 4u) { if (!_consume_op_msg_section(op_msg, ptr, remaining_bytes, &capacity, &found_kind_0)) { return false; } } if (!found_kind_0) { return false; } } if ((op_msg->flag_bits & MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT) != 0u) { if (!_consume_uint32_t(&op_msg->checksum, ptr, remaining_bytes)) { return false; } op_msg->checksum_set = true; } return true; } static bool _consume_op_reply(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_reply *const op_reply = &rpc->op_reply; if (!_consume_int32_t(&op_reply->response_flags, ptr, remaining_bytes)) { return false; } if (!_consume_int64_t(&op_reply->cursor_id, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_reply->starting_from, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_reply->number_returned, ptr, remaining_bytes)) { return false; } if (op_reply->number_returned < 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // numberReturned as invalid input. return false; } if (op_reply->number_returned > 0) { op_reply->documents = *ptr; op_reply->documents_len = *remaining_bytes; } else { op_reply->documents = NULL; op_reply->documents_len = 0u; } int32_t num_parsed = 0; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, op_reply->number_returned) || num_parsed != op_reply->number_returned) { return false; } return true; } static bool _consume_op_update(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_update *const op_update = &rpc->op_update; if (!_consume_reserved_zero(ptr, remaining_bytes)) { return false; } if (!_consume_utf8(&op_update->full_collection_name, &op_update->full_collection_name_len, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_update->flags, ptr, remaining_bytes)) { return false; } // Bits 2-31 are reserved. Must be set to 0. if ((op_update->flags & ~(0x00000003)) != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flags as invalid input. return false; } int32_t num_parsed = 0; op_update->selector = *ptr; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1) || num_parsed != 1) { return false; } op_update->update = *ptr; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1) || num_parsed != 1) { return false; } return true; } static bool _consume_op_insert(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_insert *const op_insert = &rpc->op_insert; if (!_consume_int32_t(&op_insert->flags, ptr, remaining_bytes)) { return false; } // Bits 1-31 are reserved. Must be set to 0. if ((op_insert->flags & ~(0x00000001)) != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flags as invalid input. return false; } if (!_consume_utf8(&op_insert->full_collection_name, &op_insert->full_collection_name_len, ptr, remaining_bytes)) { return false; } op_insert->documents = *ptr; op_insert->documents_len = *remaining_bytes; int32_t num_parsed = 0; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, INT32_MAX) || num_parsed == 0) { return false; } return true; } static bool _consume_op_query(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_query *const op_query = &rpc->op_query; if (!_consume_int32_t(&op_query->flags, ptr, remaining_bytes)) { return false; } // Bit 0 is reserved. Must be set to 0. if ((op_query->flags & 0x01) != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flags as invalid input. return false; } // Bits 8-31 are reserved. Must be set to 0. if ((op_query->flags & ~(0x0000007F)) != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flags as invalid input. return false; } if (!_consume_utf8(&op_query->full_collection_name, &op_query->full_collection_name_len, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_query->number_to_skip, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_query->number_to_return, ptr, remaining_bytes)) { return false; } int32_t num_parsed = 0; op_query->query = *ptr; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1) || num_parsed != 1) { return false; } op_query->return_fields_selector = *ptr; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1)) { return false; } // returnFieldsSelector is optional. if (num_parsed == 0) { op_query->return_fields_selector = NULL; } return true; } static bool _consume_op_get_more(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_get_more *const op_get_more = &rpc->op_get_more; if (!_consume_reserved_zero(ptr, remaining_bytes)) { return false; } if (!_consume_utf8( &op_get_more->full_collection_name, &op_get_more->full_collection_name_len, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_get_more->number_to_return, ptr, remaining_bytes)) { return false; } if (!_consume_int64_t(&op_get_more->cursor_id, ptr, remaining_bytes)) { return false; } return true; } static bool _consume_op_delete(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_delete *const op_delete = &rpc->op_delete; if (!_consume_reserved_zero(ptr, remaining_bytes)) { return false; } if (!_consume_utf8(&op_delete->full_collection_name, &op_delete->full_collection_name_len, ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_delete->flags, ptr, remaining_bytes)) { return false; } // Bits 1-31 are reserved. Must be set to 0. if ((op_delete->flags & ~(0x00000001)) != 0) { *ptr -= sizeof(int32_t); // Revert so *data_end points to start of // flags as invalid input. return false; } op_delete->selector = *ptr; int32_t num_parsed = 0; if (!_consume_bson_objects(ptr, remaining_bytes, &num_parsed, 1) || num_parsed != 1) { return false; } return true; } static bool _consume_op_kill_cursors(mcd_rpc_message *rpc, const uint8_t **ptr, size_t *remaining_bytes) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(ptr); BSON_ASSERT_PARAM(remaining_bytes); mcd_rpc_op_kill_cursors *op_kill_cursors = &rpc->op_kill_cursors; if (!_consume_reserved_zero(ptr, remaining_bytes)) { return false; } if (!_consume_int32_t(&op_kill_cursors->number_of_cursor_ids, ptr, remaining_bytes)) { return false; } if (op_kill_cursors->number_of_cursor_ids < 0 || // Truncation may (deliberately) leave unparsed bytes that will later // trigger validation failure due to unexpected remaining bytes. mlib_cmp(op_kill_cursors->number_of_cursor_ids, >, *remaining_bytes / sizeof(int64_t))) { *ptr -= sizeof(int32_t); // Revert so *data_len points to start of // numberOfCursorIds as invalid input. return false; } const size_t cursor_ids_length = (size_t)op_kill_cursors->number_of_cursor_ids * sizeof(int64_t); bson_free(op_kill_cursors->cursor_ids); if (op_kill_cursors->number_of_cursor_ids > 0) { op_kill_cursors->cursor_ids = bson_malloc(cursor_ids_length); for (int32_t i = 0; i < op_kill_cursors->number_of_cursor_ids; ++i) { if (!_consume_int64_t(op_kill_cursors->cursor_ids + i, ptr, remaining_bytes)) { return false; } } } else { op_kill_cursors->cursor_ids = NULL; } return true; } mcd_rpc_message * mcd_rpc_message_from_data(const void *data, size_t length, const void **data_end) { BSON_ASSERT_PARAM(data); BSON_OPTIONAL_PARAM(data_end); mcd_rpc_message *rpc = bson_malloc(sizeof(mcd_rpc_message)); mcd_rpc_message *ret = NULL; *rpc = (mcd_rpc_message){.msg_header = {0}}; if (!mcd_rpc_message_from_data_in_place(rpc, data, length, data_end)) { goto fail; } ret = rpc; rpc = NULL; fail: mcd_rpc_message_destroy(rpc); return ret; } bool mcd_rpc_message_from_data_in_place(mcd_rpc_message *rpc, const void *data, size_t length, const void **data_end) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT_PARAM(data); BSON_OPTIONAL_PARAM(data_end); bool ret = false; size_t remaining_bytes = length; const uint8_t *ptr = data; if (!_consume_int32_t(&rpc->msg_header.message_length, &ptr, &remaining_bytes)) { goto fail; } if (rpc->msg_header.message_length < MONGOC_RPC_MINIMUM_MESSAGE_LENGTH || mlib_cmp(rpc->msg_header.message_length, >, remaining_bytes + sizeof(int32_t))) { ptr -= sizeof(int32_t); // Revert so *data_end points to start of // messageLength as invalid input. goto fail; } // Use reported message length as upper bound. remaining_bytes = (size_t)rpc->msg_header.message_length - sizeof(int32_t); if (!_consume_int32_t(&rpc->msg_header.request_id, &ptr, &remaining_bytes)) { goto fail; } if (!_consume_int32_t(&rpc->msg_header.response_to, &ptr, &remaining_bytes)) { goto fail; } if (!_consume_int32_t(&rpc->msg_header.op_code, &ptr, &remaining_bytes)) { goto fail; } switch (rpc->msg_header.op_code) { case MONGOC_OP_CODE_COMPRESSED: if (!_consume_op_compressed(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_MSG: if (!_consume_op_msg(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_REPLY: if (!_consume_op_reply(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_UPDATE: if (!_consume_op_update(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_INSERT: if (!_consume_op_insert(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_QUERY: if (!_consume_op_query(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_GET_MORE: if (!_consume_op_get_more(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_DELETE: if (!_consume_op_delete(rpc, &ptr, &remaining_bytes)) { goto fail; } break; case MONGOC_OP_CODE_KILL_CURSORS: if (!_consume_op_kill_cursors(rpc, &ptr, &remaining_bytes)) { goto fail; } break; default: ptr -= sizeof(int32_t); // Revert so *data_end points to start of opCode // as invalid input. goto fail; } // Number of bytes parsed do not match the reported message length. if (remaining_bytes > 0) { goto fail; } ret = true; fail: if (data_end) { *data_end = ptr; } return ret; } static void _append_iovec_reserve_space_for(mongoc_iovec_t **iovecs, size_t *capacity, const mongoc_iovec_t *header_iovecs, size_t additional_capacity) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(header_iovecs); // Expect this function to be invoked only once after initializing the // `header_iovecs` array. BSON_ASSERT(*capacity == 4u); *capacity += additional_capacity; *iovecs = BSON_ARRAY_ALLOC(*capacity, mongoc_iovec_t); memcpy(*iovecs, header_iovecs, 4u * sizeof(mongoc_iovec_t)); } static bool _append_iovec(mongoc_iovec_t *iovecs, size_t *capacity, size_t *count, mongoc_iovec_t iovec) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); if (!iovec.iov_base || iovec.iov_len == 0u) { return false; } // Expect iovecs array capacity to have been reserved upfront according to // the upper bound of potential iovec objects required for the opcode being // converted. This is to minimize (re)allocations. BSON_ASSERT(*count < *capacity); iovecs[*count] = iovec; *count += 1u; return true; } #define MONGOC_RPC_APPEND_IOVEC(type, raw_type, to_le) \ static bool _append_iovec_##type(mongoc_iovec_t *iovecs, size_t *capacity, size_t *count, type *value) \ { \ raw_type storage; \ memcpy(&storage, value, sizeof(raw_type)); \ storage = to_le(storage); \ memcpy(value, &storage, sizeof(raw_type)); \ return _append_iovec(iovecs, \ capacity, \ count, \ (mongoc_iovec_t){ \ .iov_base = (void *)value, \ .iov_len = sizeof(type), \ }); \ } MONGOC_RPC_APPEND_IOVEC(uint8_t, uint8_t, (uint8_t)) MONGOC_RPC_APPEND_IOVEC(int32_t, uint32_t, BSON_UINT32_TO_LE) MONGOC_RPC_APPEND_IOVEC(uint32_t, uint32_t, BSON_UINT32_TO_LE) MONGOC_RPC_APPEND_IOVEC(int64_t, uint64_t, BSON_UINT64_TO_LE) static bool _append_iovec_data(mongoc_iovec_t *iovecs, size_t *capacity, size_t *count, const void *data, size_t length) { return _append_iovec(iovecs, capacity, count, (mongoc_iovec_t){ .iov_base = (void *)data, .iov_len = length, }); } static bool _append_iovec_reserved_zero(mongoc_iovec_t *iovecs, size_t *capacity, size_t *count) { static int32_t zero = 0u; return _append_iovec(iovecs, capacity, count, (mongoc_iovec_t){ .iov_base = (void *)&zero, .iov_len = sizeof(zero), }); } static bool _append_iovec_op_compressed(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_compressed *op_compressed, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_compressed); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 4u); if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_compressed->original_opcode)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_compressed->uncompressed_size)) { return false; } if (!_append_iovec_uint8_t(*iovecs, capacity, count, &op_compressed->compressor_id)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_compressed->compressed_message, op_compressed->compressed_message_len)) { return false; } return true; } static bool _count_section_iovecs(const mcd_rpc_op_msg *op_msg, size_t *section_iovecs) { BSON_ASSERT_PARAM(op_msg); BSON_ASSERT_PARAM(section_iovecs); for (size_t i = 0u; i < op_msg->sections_count; ++i) { *section_iovecs += 1u; switch (op_msg->sections[i].kind) { case 0: // Body. *section_iovecs += 1u; break; case 1: // Document Sequence. *section_iovecs += 3u; break; default: return false; } } return true; } static bool _append_iovec_op_msg(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_msg *op_msg, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_msg); BSON_ASSERT_PARAM(header_iovecs); size_t section_iovecs = 0u; if (!_count_section_iovecs(op_msg, §ion_iovecs)) { return false; } _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 2u + section_iovecs); if (!_append_iovec_uint32_t(*iovecs, capacity, count, &op_msg->flag_bits)) { return false; } for (size_t i = 0u; i < op_msg->sections_count; ++i) { mcd_rpc_op_msg_section *section = &op_msg->sections[i]; if (!section) { return false; } if (!_append_iovec_uint8_t(*iovecs, capacity, count, §ion->kind)) { return false; } switch (section->kind) { case 0: // Body if (!_append_iovec_data( *iovecs, capacity, count, section->payload.body.bson, (size_t)section->payload.body.section_len)) { return false; } break; case 1: // Document Sequence if (!_append_iovec_int32_t(*iovecs, capacity, count, §ion->payload.document_sequence.section_len)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, section->payload.document_sequence.identifier, section->payload.document_sequence.identifier_len)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, section->payload.document_sequence.bson_objects, section->payload.document_sequence.bson_objects_len)) { return false; } break; default: return false; } } if (op_msg->checksum_set) { if (!_append_iovec_uint32_t(*iovecs, capacity, count, &op_msg->checksum)) { return false; } } return true; } static bool _append_iovec_op_reply(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_reply *op_reply, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_reply); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 5u); if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_reply->response_flags)) { return false; } if (!_append_iovec_int64_t(*iovecs, capacity, count, &op_reply->cursor_id)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_reply->starting_from)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_reply->number_returned)) { return false; } if (op_reply->number_returned > 0 && !_append_iovec_data(*iovecs, capacity, count, op_reply->documents, op_reply->documents_len)) { return false; } return true; } static bool _append_iovec_op_update(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_update *op_update, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_update); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 5u); if (!_append_iovec_reserved_zero(*iovecs, capacity, count)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_update->full_collection_name, op_update->full_collection_name_len)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_update->flags)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, op_update->selector, mlib_read_u32le(op_update->selector))) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, op_update->update, mlib_read_u32le(op_update->update))) { return false; } return true; } static bool _append_iovec_op_insert(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_insert *op_insert, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_insert); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 3u); if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_insert->flags)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_insert->full_collection_name, op_insert->full_collection_name_len)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, op_insert->documents, op_insert->documents_len)) { return false; } return true; } static bool _append_iovec_op_query(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_query *op_query, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_query); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 5u + (size_t)(!!op_query->return_fields_selector)); if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_query->flags)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_query->full_collection_name, op_query->full_collection_name_len)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_query->number_to_skip)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_query->number_to_return)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, op_query->query, mlib_read_u32le(op_query->query))) { return false; } if (op_query->return_fields_selector) { if (!_append_iovec_data(*iovecs, capacity, count, op_query->return_fields_selector, mlib_read_u32le(op_query->return_fields_selector))) { return false; } } return true; } static bool _append_iovec_op_get_more(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_get_more *op_get_more, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(op_get_more); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 4u); if (!_append_iovec_reserved_zero(*iovecs, capacity, count)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_get_more->full_collection_name, op_get_more->full_collection_name_len)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_get_more->number_to_return)) { return false; } if (!_append_iovec_int64_t(*iovecs, capacity, count, &op_get_more->cursor_id)) { return false; } return true; } static bool _append_iovec_op_delete(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_delete *op_delete, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_delete); BSON_ASSERT_PARAM(header_iovecs); _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 4u); if (!_append_iovec_reserved_zero(*iovecs, capacity, count)) { return false; } if (!_append_iovec_data( *iovecs, capacity, count, op_delete->full_collection_name, op_delete->full_collection_name_len)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_delete->flags)) { return false; } if (!_append_iovec_data(*iovecs, capacity, count, op_delete->selector, mlib_read_u32le(op_delete->selector))) { return false; } return true; } static bool _append_iovec_op_kill_cursors(mongoc_iovec_t **iovecs, size_t *capacity, size_t *count, mcd_rpc_op_kill_cursors *op_kill_cursors, const mongoc_iovec_t *header_iovecs) { BSON_ASSERT_PARAM(iovecs); BSON_ASSERT_PARAM(capacity); BSON_ASSERT_PARAM(count); BSON_ASSERT_PARAM(op_kill_cursors); BSON_ASSERT_PARAM(header_iovecs); // Store value before conversion to little endian. const int32_t number_of_cursor_ids = op_kill_cursors->number_of_cursor_ids; _append_iovec_reserve_space_for(iovecs, capacity, header_iovecs, 3u); if (!_append_iovec_reserved_zero(*iovecs, capacity, count)) { return false; } if (!_append_iovec_int32_t(*iovecs, capacity, count, &op_kill_cursors->number_of_cursor_ids)) { return false; } // Each cursorID must be converted to little endian. for (int32_t i = 0; i < number_of_cursor_ids; ++i) { int64_t *const cursor_id = op_kill_cursors->cursor_ids + i; uint64_t storage; memcpy(&storage, cursor_id, sizeof(int64_t)); storage = BSON_UINT64_TO_LE(storage); memcpy(cursor_id, &storage, sizeof(int64_t)); } if (number_of_cursor_ids > 0 && !_append_iovec_data( *iovecs, capacity, count, op_kill_cursors->cursor_ids, (size_t)number_of_cursor_ids * sizeof(int64_t))) { return false; } return true; } void * mcd_rpc_message_to_iovecs(mcd_rpc_message *rpc, size_t *count) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT_PARAM(count); const int32_t op_code = rpc->msg_header.op_code; // Preallocated space for msgHeader fields. mongoc_iovec_t header_iovecs[4]; size_t capacity = 4u; *count = 0u; (void)_append_iovec_int32_t(header_iovecs, &capacity, count, &rpc->msg_header.message_length); (void)_append_iovec_int32_t(header_iovecs, &capacity, count, &rpc->msg_header.request_id); (void)_append_iovec_int32_t(header_iovecs, &capacity, count, &rpc->msg_header.response_to); (void)_append_iovec_int32_t(header_iovecs, &capacity, count, &rpc->msg_header.op_code); mongoc_iovec_t *iovecs = NULL; mongoc_iovec_t *ret = NULL; // Fields may be converted to little endian even on failure, so consider the // RPC object to be in an iovecs state from this point forward regardless of // success or failure. rpc->msg_header.is_in_iovecs_state = true; switch (op_code) { case MONGOC_OP_CODE_COMPRESSED: if (!_append_iovec_op_compressed(&iovecs, &capacity, count, &rpc->op_compressed, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_MSG: { if (!_append_iovec_op_msg(&iovecs, &capacity, count, &rpc->op_msg, header_iovecs)) { goto fail; } break; } case MONGOC_OP_CODE_REPLY: if (!_append_iovec_op_reply(&iovecs, &capacity, count, &rpc->op_reply, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_UPDATE: if (!_append_iovec_op_update(&iovecs, &capacity, count, &rpc->op_update, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_INSERT: if (!_append_iovec_op_insert(&iovecs, &capacity, count, &rpc->op_insert, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_QUERY: if (!_append_iovec_op_query(&iovecs, &capacity, count, &rpc->op_query, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_GET_MORE: if (!_append_iovec_op_get_more(&iovecs, &capacity, count, &rpc->op_get_more, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_DELETE: if (!_append_iovec_op_delete(&iovecs, &capacity, count, &rpc->op_delete, header_iovecs)) { goto fail; } break; case MONGOC_OP_CODE_KILL_CURSORS: if (!_append_iovec_op_kill_cursors(&iovecs, &capacity, count, &rpc->op_kill_cursors, header_iovecs)) { goto fail; } break; default: goto fail; } ret = iovecs; iovecs = NULL; fail: bson_free(iovecs); return ret; } mcd_rpc_message * mcd_rpc_message_new(void) { mcd_rpc_message *const rpc = bson_malloc(sizeof(mcd_rpc_message)); *rpc = (mcd_rpc_message){.msg_header = {0}}; return rpc; } static int32_t _mcd_rpc_header_get_op_code_maybe_le(const mcd_rpc_message *rpc) { BSON_ASSERT_PARAM(rpc); int32_t op_code = rpc->msg_header.op_code; // May already be in native endian. switch (op_code) { case MONGOC_OP_CODE_COMPRESSED: case MONGOC_OP_CODE_MSG: case MONGOC_OP_CODE_REPLY: case MONGOC_OP_CODE_UPDATE: case MONGOC_OP_CODE_INSERT: case MONGOC_OP_CODE_QUERY: case MONGOC_OP_CODE_GET_MORE: case MONGOC_OP_CODE_DELETE: case MONGOC_OP_CODE_KILL_CURSORS: return op_code; default: // May be in little endian. op_code = mlib_read_i32le(&op_code); switch (op_code) { case MONGOC_OP_CODE_COMPRESSED: case MONGOC_OP_CODE_MSG: case MONGOC_OP_CODE_REPLY: case MONGOC_OP_CODE_UPDATE: case MONGOC_OP_CODE_INSERT: case MONGOC_OP_CODE_QUERY: case MONGOC_OP_CODE_GET_MORE: case MONGOC_OP_CODE_DELETE: case MONGOC_OP_CODE_KILL_CURSORS: return op_code; default: // Doesn't seem to have been a valid opCode. return rpc->msg_header.op_code; } } } static void _mcd_rpc_message_free_owners(mcd_rpc_message *rpc) { BSON_ASSERT_PARAM(rpc); switch (_mcd_rpc_header_get_op_code_maybe_le(rpc)) { case MONGOC_OP_CODE_MSG: bson_free(rpc->op_msg.sections); rpc->op_msg.sections = NULL; return; case MONGOC_OP_CODE_KILL_CURSORS: bson_free(rpc->op_kill_cursors.cursor_ids); rpc->op_kill_cursors.cursor_ids = NULL; return; case MONGOC_OP_CODE_COMPRESSED: case MONGOC_OP_CODE_REPLY: case MONGOC_OP_CODE_UPDATE: case MONGOC_OP_CODE_INSERT: case MONGOC_OP_CODE_QUERY: case MONGOC_OP_CODE_GET_MORE: case MONGOC_OP_CODE_DELETE: return; default: return; } } void mcd_rpc_message_destroy(mcd_rpc_message *rpc) { if (!rpc) { return; } _mcd_rpc_message_free_owners(rpc); bson_free((void *)rpc); } void mcd_rpc_message_reset(mcd_rpc_message *rpc) { BSON_ASSERT_PARAM(rpc); _mcd_rpc_message_free_owners(rpc); *rpc = (mcd_rpc_message){.msg_header = {0}}; } void mcd_rpc_message_set_length(mcd_rpc_message *rpc, int32_t value) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->msg_header.message_length = value; } int32_t mcd_rpc_header_get_message_length(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; return rpc->msg_header.message_length; } int32_t mcd_rpc_header_get_request_id(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; return rpc->msg_header.request_id; } int32_t mcd_rpc_header_get_response_to(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; return rpc->msg_header.response_to; } int32_t mcd_rpc_header_get_op_code(const mcd_rpc_message *rpc) { BSON_ASSERT_PARAM(rpc); // Permit read access even if the RPC message object // is in an iovecs state. return rpc->msg_header.op_code; } int32_t mcd_rpc_header_set_message_length(mcd_rpc_message *rpc, int32_t message_length) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->msg_header.message_length = message_length; return sizeof(message_length); } int32_t mcd_rpc_header_set_request_id(mcd_rpc_message *rpc, int32_t request_id) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->msg_header.request_id = request_id; return sizeof(request_id); } int32_t mcd_rpc_header_set_response_to(mcd_rpc_message *rpc, int32_t response_to) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->msg_header.response_to = response_to; return sizeof(response_to); } int32_t mcd_rpc_header_set_op_code(mcd_rpc_message *rpc, int32_t op_code) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; _mcd_rpc_message_free_owners(rpc); rpc->msg_header.op_code = op_code; return sizeof(op_code); } int32_t mcd_rpc_op_compressed_get_original_opcode(const mcd_rpc_message *rpc) { BSON_ASSERT_PARAM(rpc); // Permit read access even if the RPC message object // is in an iovecs state. BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); return rpc->op_compressed.original_opcode; } int32_t mcd_rpc_op_compressed_get_uncompressed_size(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); return rpc->op_compressed.uncompressed_size; } uint8_t mcd_rpc_op_compressed_get_compressor_id(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); return rpc->op_compressed.compressor_id; } const void * mcd_rpc_op_compressed_get_compressed_message(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); return rpc->op_compressed.compressed_message; } size_t mcd_rpc_op_compressed_get_compressed_message_length(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); return rpc->op_compressed.compressed_message_len; } int32_t mcd_rpc_op_compressed_set_original_opcode(mcd_rpc_message *rpc, int32_t original_opcode) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); rpc->op_compressed.original_opcode = original_opcode; return sizeof(original_opcode); } int32_t mcd_rpc_op_compressed_set_uncompressed_size(mcd_rpc_message *rpc, int32_t uncompressed_size) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); rpc->op_compressed.uncompressed_size = uncompressed_size; return sizeof(uncompressed_size); } int32_t mcd_rpc_op_compressed_set_compressor_id(mcd_rpc_message *rpc, uint8_t compressor_id) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); rpc->op_compressed.compressor_id = compressor_id; return sizeof(compressor_id); } int32_t mcd_rpc_op_compressed_set_compressed_message(mcd_rpc_message *rpc, const void *compressed_message, size_t compressed_message_length) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_COMPRESSED); BSON_ASSERT(mlib_in_range(int32_t, compressed_message_length)); rpc->op_compressed.compressed_message = compressed_message; rpc->op_compressed.compressed_message_len = compressed_message_length; return (int32_t)compressed_message_length; } uint8_t mcd_rpc_op_msg_section_get_kind(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); return rpc->op_msg.sections[index].kind; } int32_t mcd_rpc_op_msg_section_get_length(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); const mcd_rpc_op_msg_section *const section = &rpc->op_msg.sections[index]; switch (section->kind) { case 0: { // Body return mlib_read_i32le(section->payload.body.bson); } case 1: { // Document Sequence return section->payload.document_sequence.section_len; } default: BSON_UNREACHABLE("invalid section kind"); } } const char * mcd_rpc_op_msg_section_get_identifier(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); const mcd_rpc_op_msg_section *const section = &rpc->op_msg.sections[index]; BSON_ASSERT(section->kind == 1); return section->payload.document_sequence.identifier; } const void * mcd_rpc_op_msg_section_get_body(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); const mcd_rpc_op_msg_section *const section = &rpc->op_msg.sections[index]; BSON_ASSERT(section->kind == 0); return section->payload.body.bson; } const void * mcd_rpc_op_msg_section_get_document_sequence(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); const mcd_rpc_op_msg_section *const section = &rpc->op_msg.sections[index]; BSON_ASSERT(section->kind == 1); return section->payload.document_sequence.bson_objects; } size_t mcd_rpc_op_msg_section_get_document_sequence_length(const mcd_rpc_message *rpc, size_t index) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); const mcd_rpc_op_msg_section *const section = &rpc->op_msg.sections[index]; BSON_ASSERT(section->kind == 1); return section->payload.document_sequence.bson_objects_len; } int32_t mcd_rpc_op_msg_section_set_kind(mcd_rpc_message *rpc, size_t index, uint8_t kind) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); rpc->op_msg.sections[index].kind = kind; return sizeof(kind); } int32_t mcd_rpc_op_msg_section_set_length(mcd_rpc_message *rpc, size_t index, int32_t length) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); BSON_ASSERT(rpc->op_msg.sections[index].kind == 1); rpc->op_msg.sections[index].payload.document_sequence.section_len = length; return sizeof(length); } int32_t mcd_rpc_op_msg_section_set_identifier(mcd_rpc_message *rpc, size_t index, const char *identifier) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); BSON_ASSERT(rpc->op_msg.sections[index].kind == 1); const size_t identifier_len = identifier ? strlen(identifier) + 1u : 0u; rpc->op_msg.sections[index].payload.document_sequence.identifier = identifier; rpc->op_msg.sections[index].payload.document_sequence.identifier_len = identifier_len; BSON_ASSERT(mlib_in_range(int32_t, identifier_len)); return (int32_t)identifier_len; } int32_t mcd_rpc_op_msg_section_set_body(mcd_rpc_message *rpc, size_t index, const void *body) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); BSON_ASSERT(rpc->op_msg.sections[index].kind == 0); const int32_t section_len = body ? mlib_read_i32le(body) : 0; rpc->op_msg.sections[index].payload.body.bson = body; rpc->op_msg.sections[index].payload.body.section_len = section_len; return section_len; } int32_t mcd_rpc_op_msg_section_set_document_sequence(mcd_rpc_message *rpc, size_t index, const void *document_sequence, size_t document_sequence_length) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); BSON_ASSERT(index < rpc->op_msg.sections_count); BSON_ASSERT(rpc->op_msg.sections[index].kind == 1); const size_t bson_objects_len = document_sequence ? document_sequence_length : 0u; rpc->op_msg.sections[index].payload.document_sequence.bson_objects = document_sequence; rpc->op_msg.sections[index].payload.document_sequence.bson_objects_len = bson_objects_len; BSON_ASSERT(mlib_in_range(int32_t, document_sequence_length)); return (int32_t)bson_objects_len; } uint32_t mcd_rpc_op_msg_get_flag_bits(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); return rpc->op_msg.flag_bits; } size_t mcd_rpc_op_msg_get_sections_count(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); return rpc->op_msg.sections_count; } const uint32_t * mcd_rpc_op_msg_get_checksum(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); return rpc->op_msg.checksum_set ? &rpc->op_msg.checksum : NULL; } int32_t mcd_rpc_op_msg_set_flag_bits(mcd_rpc_message *rpc, uint32_t flag_bits) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); rpc->op_msg.flag_bits = flag_bits; return sizeof(flag_bits); } void mcd_rpc_op_msg_set_sections_count(mcd_rpc_message *rpc, size_t section_count) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); rpc->op_msg.sections = bson_realloc(rpc->op_msg.sections, section_count * sizeof(mcd_rpc_op_msg_section)); rpc->op_msg.sections_count = section_count; } int32_t mcd_rpc_op_msg_set_checksum(mcd_rpc_message *rpc, uint32_t checksum) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_MSG); rpc->op_msg.checksum = checksum; rpc->op_msg.checksum_set = true; return sizeof(checksum); } int32_t mcd_rpc_op_reply_get_response_flags(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.response_flags; } int64_t mcd_rpc_op_reply_get_cursor_id(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.cursor_id; } int32_t mcd_rpc_op_reply_get_starting_from(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.starting_from; } int32_t mcd_rpc_op_reply_get_number_returned(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.number_returned; } const void * mcd_rpc_op_reply_get_documents(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.documents_len > 0 ? rpc->op_reply.documents : NULL; } size_t mcd_rpc_op_reply_get_documents_len(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_REPLY); return rpc->op_reply.documents_len; } int32_t mcd_rpc_op_reply_set_response_flags(mcd_rpc_message *rpc, int32_t response_flags) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_reply.response_flags = response_flags; return sizeof(response_flags); } int32_t mcd_rpc_op_reply_set_cursor_id(mcd_rpc_message *rpc, int64_t cursor_id) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_reply.cursor_id = cursor_id; return sizeof(cursor_id); } int32_t mcd_rpc_op_reply_set_starting_from(mcd_rpc_message *rpc, int32_t starting_from) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_reply.starting_from = starting_from; return sizeof(starting_from); } int32_t mcd_rpc_op_reply_set_number_returned(mcd_rpc_message *rpc, int32_t number_returned) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_reply.number_returned = number_returned; return sizeof(number_returned); } int32_t mcd_rpc_op_reply_set_documents(mcd_rpc_message *rpc, const void *documents, size_t documents_len) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_reply.documents = documents; rpc->op_reply.documents_len = documents_len; BSON_ASSERT(mlib_in_range(int32_t, documents_len)); return (int32_t)documents_len; } const char * mcd_rpc_op_update_get_full_collection_name(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_UPDATE); return rpc->op_update.full_collection_name; } int32_t mcd_rpc_op_update_get_flags(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_UPDATE); return rpc->op_update.flags; } const void * mcd_rpc_op_update_get_selector(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_UPDATE); return rpc->op_update.selector; } const void * mcd_rpc_op_update_get_update(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_UPDATE); return rpc->op_update.update; } int32_t mcd_rpc_op_update_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; const size_t length = full_collection_name ? strlen(full_collection_name) + 1u : 0u; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_UPDATE); rpc->op_update.full_collection_name = full_collection_name; rpc->op_update.full_collection_name_len = length; BSON_ASSERT(mlib_in_range(int32_t, length)); return (int32_t)length; } int32_t mcd_rpc_op_update_set_flags(mcd_rpc_message *rpc, int32_t flags) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_update.flags = flags; return sizeof(flags); } int32_t mcd_rpc_op_update_set_selector(mcd_rpc_message *rpc, const void *selector) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_update.selector = selector; return selector ? mlib_read_i32le(selector) : 0; } int32_t mcd_rpc_op_update_set_update(mcd_rpc_message *rpc, const void *update) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; rpc->op_update.update = update; return update ? mlib_read_i32le(update) : 0; } int32_t mcd_rpc_op_insert_get_flags(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); return rpc->op_insert.flags; } const char * mcd_rpc_op_insert_get_full_collection_name(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); return rpc->op_insert.full_collection_name; } const void * mcd_rpc_op_insert_get_documents(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); return rpc->op_insert.documents; } size_t mcd_rpc_op_insert_get_documents_len(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); return rpc->op_insert.documents_len; } int32_t mcd_rpc_op_insert_set_flags(mcd_rpc_message *rpc, int32_t flags) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); rpc->op_insert.flags = flags; return sizeof(flags); } int32_t mcd_rpc_op_insert_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); const size_t length = full_collection_name ? strlen(full_collection_name) + 1u : 0u; rpc->op_insert.full_collection_name = full_collection_name; rpc->op_insert.full_collection_name_len = length; BSON_ASSERT(mlib_in_range(int32_t, length)); return (int32_t)length; } int32_t mcd_rpc_op_insert_set_documents(mcd_rpc_message *rpc, const void *documents, size_t documents_len) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_INSERT); rpc->op_insert.documents = documents; rpc->op_insert.documents_len = documents_len; BSON_ASSERT(mlib_in_range(int32_t, documents_len)); return (int32_t)documents_len; } int32_t mcd_rpc_op_query_get_flags(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.flags; } const char * mcd_rpc_op_query_get_full_collection_name(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.full_collection_name; } int32_t mcd_rpc_op_query_get_number_to_skip(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.number_to_skip; } int32_t mcd_rpc_op_query_get_number_to_return(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.number_to_return; } const void * mcd_rpc_op_query_get_query(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.query; } const void * mcd_rpc_op_query_get_return_fields_selector(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); return rpc->op_query.return_fields_selector; } int32_t mcd_rpc_op_query_set_flags(mcd_rpc_message *rpc, int32_t flags) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); rpc->op_query.flags = flags; return sizeof(flags); } int32_t mcd_rpc_op_query_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); const size_t length = full_collection_name ? strlen(full_collection_name) + 1u : 0u; rpc->op_query.full_collection_name = full_collection_name; rpc->op_query.full_collection_name_len = length; BSON_ASSERT(mlib_in_range(int32_t, length)); return (int32_t)length; } int32_t mcd_rpc_op_query_set_number_to_skip(mcd_rpc_message *rpc, int32_t number_to_skip) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); rpc->op_query.number_to_skip = number_to_skip; return sizeof(number_to_skip); } int32_t mcd_rpc_op_query_set_number_to_return(mcd_rpc_message *rpc, int32_t number_to_return) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); rpc->op_query.number_to_return = number_to_return; return sizeof(number_to_return); } int32_t mcd_rpc_op_query_set_query(mcd_rpc_message *rpc, const void *query) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); rpc->op_query.query = query; return mlib_read_i32le(query); } int32_t mcd_rpc_op_query_set_return_fields_selector(mcd_rpc_message *rpc, const void *return_fields_selector) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_QUERY); rpc->op_query.return_fields_selector = return_fields_selector; return return_fields_selector ? mlib_read_i32le(return_fields_selector) : 0; } const char * mcd_rpc_op_get_more_get_full_collection_name(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); return rpc->op_get_more.full_collection_name; } int32_t mcd_rpc_op_get_more_get_number_to_return(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); return rpc->op_get_more.number_to_return; } int64_t mcd_rpc_op_get_more_get_cursor_id(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); return rpc->op_get_more.cursor_id; } int32_t mcd_rpc_op_get_more_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); const size_t length = full_collection_name ? strlen(full_collection_name) + 1u : 0u; rpc->op_get_more.full_collection_name = full_collection_name; rpc->op_get_more.full_collection_name_len = length; BSON_ASSERT(mlib_in_range(int32_t, length)); return (int32_t)length; } int32_t mcd_rpc_op_get_more_set_number_to_return(mcd_rpc_message *rpc, int32_t number_to_return) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); rpc->op_get_more.number_to_return = number_to_return; return sizeof(number_to_return); } int32_t mcd_rpc_op_get_more_set_cursor_id(mcd_rpc_message *rpc, int64_t cursor_id) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_GET_MORE); rpc->op_get_more.cursor_id = cursor_id; return sizeof(cursor_id); } const char * mcd_rpc_op_delete_get_full_collection_name(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); return rpc->op_delete.full_collection_name; } int32_t mcd_rpc_op_delete_get_flags(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); return rpc->op_delete.flags; } const void * mcd_rpc_op_delete_get_selector(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); return rpc->op_delete.selector; } int32_t mcd_rpc_op_delete_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); const size_t length = full_collection_name ? strlen(full_collection_name) + 1u : 0u; rpc->op_delete.full_collection_name = full_collection_name; rpc->op_delete.full_collection_name_len = length; BSON_ASSERT(mlib_in_range(int32_t, length)); return (int32_t)length; } int32_t mcd_rpc_op_delete_set_flags(mcd_rpc_message *rpc, int32_t flags) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); rpc->op_delete.flags = flags; return sizeof(flags); } int32_t mcd_rpc_op_delete_set_selector(mcd_rpc_message *rpc, const void *selector) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_DELETE); rpc->op_delete.selector = selector; return selector ? mlib_read_i32le(selector) : 0; } int32_t mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_KILL_CURSORS); return rpc->op_kill_cursors.number_of_cursor_ids; } const int64_t * mcd_rpc_op_kill_cursors_get_cursor_ids(const mcd_rpc_message *rpc) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_KILL_CURSORS); return rpc->op_kill_cursors.number_of_cursor_ids > 0 ? rpc->op_kill_cursors.cursor_ids : NULL; } int32_t mcd_rpc_op_kill_cursors_set_cursor_ids(mcd_rpc_message *rpc, const int64_t *cursor_ids, int32_t number_of_cursor_ids) { ASSERT_MCD_RPC_ACCESSOR_PRECONDITIONS; BSON_ASSERT(rpc->msg_header.op_code == MONGOC_OP_CODE_KILL_CURSORS); BSON_ASSERT(mlib_cmp(number_of_cursor_ids, <, (size_t)INT32_MAX / sizeof(int64_t))); const size_t cursor_ids_length = (size_t)number_of_cursor_ids * sizeof(int64_t); rpc->op_kill_cursors.number_of_cursor_ids = number_of_cursor_ids; bson_free(rpc->op_kill_cursors.cursor_ids); if (number_of_cursor_ids > 0) { rpc->op_kill_cursors.cursor_ids = bson_malloc(cursor_ids_length); memcpy(rpc->op_kill_cursors.cursor_ids, cursor_ids, cursor_ids_length); } else { rpc->op_kill_cursors.cursor_ids = NULL; } return (int32_t)sizeof(int32_t) + (int32_t)cursor_ids_length; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mcd-rpc.h000066400000000000000000000623341511661753600226760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MCD_RPC_H_INCLUDED) #define MCD_RPC_H_INCLUDED #include #include #include #ifdef __cplusplus extern "C" { #endif typedef union _mcd_rpc_message mcd_rpc_message; // See: https://www.mongodb.com/docs/manual/reference/mongodb-wire-protocol #define MONGOC_OP_CODE_NONE INT32_C(0) #define MONGOC_OP_CODE_COMPRESSED INT32_C(2012) #define MONGOC_OP_CODE_MSG INT32_C(2013) #define MONGOC_OP_COMPRESSED_COMPRESSOR_ID_NOOP UINT8_C(0) #define MONGOC_OP_COMPRESSED_COMPRESSOR_ID_SNAPPY UINT8_C(1) #define MONGOC_OP_COMPRESSED_COMPRESSOR_ID_ZLIB UINT8_C(2) #define MONGOC_OP_COMPRESSED_COMPRESSOR_ID_ZSTD UINT8_C(3) #define MONGOC_OP_MSG_FLAG_NONE UINT32_C(0) #define MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT (UINT32_C(0x01) << 0) #define MONGOC_OP_MSG_FLAG_MORE_TO_COME (UINT32_C(0x01) << 1) #define MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED (UINT32_C(0x01) << 16) // See: https://www.mongodb.com/docs/manual/legacy-opcodes/ #define MONGOC_OP_CODE_REPLY INT32_C(1) #define MONGOC_OP_CODE_UPDATE INT32_C(2001) #define MONGOC_OP_CODE_INSERT INT32_C(2002) #define MONGOC_OP_CODE_QUERY INT32_C(2004) #define MONGOC_OP_CODE_GET_MORE INT32_C(2005) #define MONGOC_OP_CODE_DELETE INT32_C(2006) #define MONGOC_OP_CODE_KILL_CURSORS INT32_C(2007) #define MONGOC_OP_REPLY_RESPONSE_FLAG_NONE INT32_C(0) #define MONGOC_OP_REPLY_RESPONSE_FLAG_CURSOR_NOT_FOUND (INT32_C(0x01) << 0) #define MONGOC_OP_REPLY_RESPONSE_FLAG_QUERY_FAILURE (INT32_C(0x01) << 1) #define MONGOC_OP_REPLY_RESPONSE_FLAG_SHARD_CONFIG_STALE (INT32_C(0x01) << 2) #define MONGOC_OP_REPLY_RESPONSE_FLAG_AWAIT_CAPABLE (INT32_C(0x01) << 3) #define MONGOC_OP_UPDATE_FLAG_NONE INT32_C(0) #define MONGOC_OP_UPDATE_FLAG_UPSERT (INT32_C(0x01) << 0) #define MONGOC_OP_UPDATE_FLAG_MULTI_UPDATE (INT32_C(0x01) << 1) #define MONGOC_OP_INSERT_FLAG_NONE INT32_C(0) #define MONGOC_OP_INSERT_FLAG_CONTINUE_ON_ERROR (INT32_C(0x01) << 0) #define MONGOC_OP_QUERY_FLAG_NONE INT32_C(0) #define MONGOC_OP_QUERY_FLAG_TAILABLE_CURSOR (INT32_C(0x01) << 1) #define MONGOC_OP_QUERY_FLAG_SECONDARY_OK (INT32_C(0x01) << 2) #define MONGOC_OP_QUERY_FLAG_OPLOG_REPLAY (INT32_C(0x01) << 3) #define MONGOC_OP_QUERY_FLAG_NO_CURSOR_TIMEOUT (INT32_C(0x01) << 4) #define MONGOC_OP_QUERY_FLAG_AWAIT_DATA (INT32_C(0x01) << 5) #define MONGOC_OP_QUERY_FLAG_EXHAUST (INT32_C(0x01) << 6) #define MONGOC_OP_QUERY_FLAG_PARTIAL (INT32_C(0x01) << 7) #define MONGOC_OP_DELETE_FLAG_NONE INT32_C(0) #define MONGOC_OP_DELETE_FLAG_SINGLE_REMOVE (INT32_C(0x01) << 0) // Convert the given array of bytes into an RPC message object. The RPC message // object must be freed by `mcd_rpc_message_destroy`. // // data: an array of `length` bytes. // data_end: if not `NULL`, `*data_end` is set to one past the last byte of // valid input data. Useful for diagnosing failures. // // Note: the fields of the RPC message object are automatically converted from // little endian to native endian. // // Returns the new RPC message object on success. Returns `NULL` on failure. mcd_rpc_message * mcd_rpc_message_from_data(const void *data, size_t length, const void **data_end); // The in-place version of `mcd_rpc_message_from_data`. // // rpc: an RPC message object in an initialized state. // // Returns `true` on success. Returns `false` on failure. bool mcd_rpc_message_from_data_in_place(mcd_rpc_message *rpc, const void *data, size_t length, const void **data_end); // Convert the given RPC message object into an array of iovec structures, // putting the RPC message object in an iovecs state. The return value must be // freed by `bson_free`. // // Unless otherwise specified, it is undefined behavior to access any RPC // message field when the object is in an iovecs state. Use // `mcd_rpc_message_reset` to return the object to an initialized state before // further reuse. // // The data layout of the iovec structures is consistent with the definition of // `mongoc_iovec_t` as defined in ``. // // rpc: a valid RPC message object whose fields are in native endian. // length: if not `NULL`, `*length` is set to the number of iovec structures in // the array. // // Returns the array of iovec structures on success. Returns `NULL` on failure. void * mcd_rpc_message_to_iovecs(mcd_rpc_message *rpc, size_t *count); // Return an RPC message object in an initialized state whose fields will be set // manually. The return value must be freed by `mcd_rpc_message_destroy`. mcd_rpc_message * mcd_rpc_message_new(void); // Destroy the given RPC message object. void mcd_rpc_message_destroy(mcd_rpc_message *rpc); // Restore the given RPC message object to an initialized state. void mcd_rpc_message_reset(mcd_rpc_message *rpc); // Set the message length for the given RPC message object. Expected to be used // in conjunction with the return values of setters. void mcd_rpc_message_set_length(mcd_rpc_message *rpc, int32_t value); // Get the msgHeader.messageLength field. int32_t mcd_rpc_header_get_message_length(const mcd_rpc_message *rpc); // Get the msgHeader.requestId field. int32_t mcd_rpc_header_get_request_id(const mcd_rpc_message *rpc); // Get the msgHeader.responseTo field. int32_t mcd_rpc_header_get_response_to(const mcd_rpc_message *rpc); // Get the msgHeader.opCode field. // // This function may be called even if the RPC message is in an iovecs state. int32_t mcd_rpc_header_get_op_code(const mcd_rpc_message *rpc); // Set the msgHeader.messageLength field. // // Returns the length of the field as part of msgHeader.messageLength. int32_t mcd_rpc_header_set_message_length(mcd_rpc_message *rpc, int32_t message_length); // Set the msgHeader.requestId field. // // Returns the length of the field as part of msgHeader.messageLength. int32_t mcd_rpc_header_set_request_id(mcd_rpc_message *rpc, int32_t request_id); // Set the msgHeader.responseTo field. // // Returns the length of the field as part of msgHeader.messageLength. int32_t mcd_rpc_header_set_response_to(mcd_rpc_message *rpc, int32_t response_to); // Set the msgHeader.opCode field. // // Note: the msgHeader.opCode field may be set more than once. // // Returns the length of the field as part of msgHeader.messageLength. int32_t mcd_rpc_header_set_op_code(mcd_rpc_message *rpc, int32_t op_code); // Get the OP_COMPRESSED originalOpcode field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. // // This function may be called even if the RPC message is in an iovecs state. int32_t mcd_rpc_op_compressed_get_original_opcode(const mcd_rpc_message *rpc); // Get the OP_COMPRESSED uncompressedSize field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. int32_t mcd_rpc_op_compressed_get_uncompressed_size(const mcd_rpc_message *rpc); // Get the OP_COMPRESSED compressorId field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. uint8_t mcd_rpc_op_compressed_get_compressor_id(const mcd_rpc_message *rpc); // Get the OP_COMPRESSED compressedMessage field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. const void * mcd_rpc_op_compressed_get_compressed_message(const mcd_rpc_message *rpc); // Get the length of the OP_COMPRESSED compressedMessage field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. size_t mcd_rpc_op_compressed_get_compressed_message_length(const mcd_rpc_message *rpc); // Set the OP_COMPRESSED originalOpcode field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. int32_t mcd_rpc_op_compressed_set_original_opcode(mcd_rpc_message *rpc, int32_t original_opcode); // Set the OP_COMPRESSED uncompressedSize field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. int32_t mcd_rpc_op_compressed_set_uncompressed_size(mcd_rpc_message *rpc, int32_t uncompressed_size); // Set the OP_COMPRESSED compressorId field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. int32_t mcd_rpc_op_compressed_set_compressor_id(mcd_rpc_message *rpc, uint8_t compressor_id); // Set the OP_COMPRESSED compressedMessage field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_COMPRESSED. int32_t mcd_rpc_op_compressed_set_compressed_message(mcd_rpc_message *rpc, const void *compressed_message, size_t compressed_message_length); // Get the kind byte for the OP_MSG section at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. uint8_t mcd_rpc_op_msg_section_get_kind(const mcd_rpc_message *rpc, size_t index); // Get the length of the OP_MSG section at the given index. // // If the section kind is 0, returns the length of the single BSON object. // If the section kind is 1, returns the total length of the section. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. int32_t mcd_rpc_op_msg_section_get_length(const mcd_rpc_message *rpc, size_t index); // Get the document sequence identifier of the OP_MSG document sequence section // at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. const char * mcd_rpc_op_msg_section_get_identifier(const mcd_rpc_message *rpc, size_t index); // Get a pointer to the beginning of the single BSON object of the OP_MSG body // section at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 0. const void * mcd_rpc_op_msg_section_get_body(const mcd_rpc_message *rpc, size_t index); // Get a pointer to the beginning of the document sequence of the OP_MSG // document sequence section at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. const void * mcd_rpc_op_msg_section_get_document_sequence(const mcd_rpc_message *rpc, size_t index); // Get the length of the document sequence of the OP_MSG document sequence // section at the given index. // // Note: the length is the number of bytes, NOT the number of documents. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. size_t mcd_rpc_op_msg_section_get_document_sequence_length(const mcd_rpc_message *rpc, size_t index); // Set the kind byte for the OP_MSG section at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. int32_t mcd_rpc_op_msg_section_set_kind(mcd_rpc_message *rpc, size_t index, uint8_t kind); // Set the length of the OP_MSG document sequence section at the given index. // // Note: the section length of an OP_MSG body section is equal to the length // of the single BSON object, thus does not require a seperate setter. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. int32_t mcd_rpc_op_msg_section_set_length(mcd_rpc_message *rpc, size_t index, int32_t length); // Set the document sequence identifier of the OP_MSG document sequence section // at the given index. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. int32_t mcd_rpc_op_msg_section_set_identifier(mcd_rpc_message *rpc, size_t index, const char *identifier); // Set the BSON object for the OP_MSG body section at the given index. // // Note: the section length of an OP_MSG body section is equal to the length // of the single BSON object, thus does not require a seperate setter. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 0. int32_t mcd_rpc_op_msg_section_set_body(mcd_rpc_message *rpc, size_t index, const void *body); // Set the document sequence for the OP_MSG document sequence section at the // given index. // // `document_sequence_length` MUST equal the length in bytes of the document // sequence. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. // The given index MUST be a valid index into the OP_MSG sections array. // The section kind at the given index MUST equal 1. int32_t mcd_rpc_op_msg_section_set_document_sequence(mcd_rpc_message *rpc, size_t index, const void *document_sequence, size_t document_sequence_length); // Get the OP_MSG flagBits field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. uint32_t mcd_rpc_op_msg_get_flag_bits(const mcd_rpc_message *rpc); // Get the number of sections in the OP_MSG sections array. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. size_t mcd_rpc_op_msg_get_sections_count(const mcd_rpc_message *rpc); // Get the OP_MSG checksum field. // // Returns `NULL` if the field is not set. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. const uint32_t * mcd_rpc_op_msg_get_checksum(const mcd_rpc_message *rpc); // Set the OP_MSG flagBits field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. int32_t mcd_rpc_op_msg_set_flag_bits(mcd_rpc_message *rpc, uint32_t flag_bits); // Set the number of sections in the OP_MSG section array. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. void mcd_rpc_op_msg_set_sections_count(mcd_rpc_message *rpc, size_t section_count); // Set the OP_MSG checksum field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_MSG. int32_t mcd_rpc_op_msg_set_checksum(mcd_rpc_message *rpc, uint32_t checksum); // Get the OP_REPLY responseFlags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_get_response_flags(const mcd_rpc_message *rpc); // Get the OP_REPLY cursorID field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int64_t mcd_rpc_op_reply_get_cursor_id(const mcd_rpc_message *rpc); // Get the OP_REPLY startingFrom field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_get_starting_from(const mcd_rpc_message *rpc); // Get the OP_REPLY numberReturned field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_get_number_returned(const mcd_rpc_message *rpc); // Get a pointer to the beginning of the OP_REPLY documents array. // // Returns `NULL` if the OP_REPLY numberReturned field equals 0. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. const void * mcd_rpc_op_reply_get_documents(const mcd_rpc_message *rpc); // Get the length of the OP_REPLY documents array. // // Note: the length is the number of bytes, NOT the number of documents. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. size_t mcd_rpc_op_reply_get_documents_len(const mcd_rpc_message *rpc); // Set the OP_REPLY responseFlags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_set_response_flags(mcd_rpc_message *rpc, int32_t response_flags); // Set the OP_REPLY cursorID field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_set_cursor_id(mcd_rpc_message *rpc, int64_t cursor_id); // Set the OP_REPLY startingFrom field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_set_starting_from(mcd_rpc_message *rpc, int32_t starting_from); // Set the OP_REPLY numberReturned field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_set_number_returned(mcd_rpc_message *rpc, int32_t number_returned); // Set the OP_REPLY documents field. // // `documents_len` MUST equal the length in bytes of the documents array. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_REPLY. int32_t mcd_rpc_op_reply_set_documents(mcd_rpc_message *rpc, const void *documents, size_t documents_len); // Get the OP_UPDATE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. const char * mcd_rpc_op_update_get_full_collection_name(const mcd_rpc_message *rpc); // Get the OP_UPDATE flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. int32_t mcd_rpc_op_update_get_flags(const mcd_rpc_message *rpc); // Get the OP_UPDATE selector field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. const void * mcd_rpc_op_update_get_selector(const mcd_rpc_message *rpc); // Get the OP_UPDATE update field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. const void * mcd_rpc_op_update_get_update(const mcd_rpc_message *rpc); // Set the OP_UPDATE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. int32_t mcd_rpc_op_update_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name); // Set the OP_UPDATE flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. int32_t mcd_rpc_op_update_set_flags(mcd_rpc_message *rpc, int32_t flags); // Set the OP_UPDATE selector field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. int32_t mcd_rpc_op_update_set_selector(mcd_rpc_message *rpc, const void *selector); // Set the OP_UPDATE update field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_UPDATE. int32_t mcd_rpc_op_update_set_update(mcd_rpc_message *rpc, const void *update); // Get the OP_INSERT flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. int32_t mcd_rpc_op_insert_get_flags(const mcd_rpc_message *rpc); // Get the OP_INSERT fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. const char * mcd_rpc_op_insert_get_full_collection_name(const mcd_rpc_message *rpc); // Get a pointer to the beginning of the OP_INSERT documents array. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. const void * mcd_rpc_op_insert_get_documents(const mcd_rpc_message *rpc); // Get the length of the OP_INSERT documents array. // // Note: the length is the number of bytes, NOT the number of documents. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. size_t mcd_rpc_op_insert_get_documents_len(const mcd_rpc_message *rpc); // Set the OP_INSERT flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. int32_t mcd_rpc_op_insert_set_flags(mcd_rpc_message *rpc, int32_t flags); // Set the OP_INSERT fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. int32_t mcd_rpc_op_insert_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name); // Set the OP_INSERT documents array. // // `documents_len` MUST equal the length in bytes of the documents array. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_INSERT. int32_t mcd_rpc_op_insert_set_documents(mcd_rpc_message *rpc, const void *documents, size_t documents_len); // Get the OP_QUERY flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_get_flags(const mcd_rpc_message *rpc); // Get the OP_QUERY fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. const char * mcd_rpc_op_query_get_full_collection_name(const mcd_rpc_message *rpc); // Get the OP_QUERY numberToSkip field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_get_number_to_skip(const mcd_rpc_message *rpc); // Get the OP_QUERY numberToReturn field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_get_number_to_return(const mcd_rpc_message *rpc); // Get the OP_QUERY query field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. const void * mcd_rpc_op_query_get_query(const mcd_rpc_message *rpc); // Get the OP_QUERY returnFieldsSelector field. // // Returns `NULL` if the field is not set. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. const void * mcd_rpc_op_query_get_return_fields_selector(const mcd_rpc_message *rpc); // Set the OP_QUERY flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_flags(mcd_rpc_message *rpc, int32_t flags); // Set the OP_QUERY fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name); // Set the OP_QUERY numberToSkip field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_number_to_skip(mcd_rpc_message *rpc, int32_t number_to_skip); // Set the OP_QUERY numberToReturn field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_number_to_return(mcd_rpc_message *rpc, int32_t number_to_return); // Set the OP_QUERY query field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_query(mcd_rpc_message *rpc, const void *query); // Set the OP_QUERY returnFieldsSelector field. // // Note: `return_fields_selector` may be `NULL` to unset the field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_QUERY. int32_t mcd_rpc_op_query_set_return_fields_selector(mcd_rpc_message *rpc, const void *return_fields_selector); // Get the OP_GET_MORE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. const char * mcd_rpc_op_get_more_get_full_collection_name(const mcd_rpc_message *rpc); // Get the OP_GET_MORE numberToReturn field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. int32_t mcd_rpc_op_get_more_get_number_to_return(const mcd_rpc_message *rpc); // Get the OP_GET_MORE cursorID field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. int64_t mcd_rpc_op_get_more_get_cursor_id(const mcd_rpc_message *rpc); // Set the OP_GET_MORE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. int32_t mcd_rpc_op_get_more_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name); // Set the OP_GET_MORE numberToReturn field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. int32_t mcd_rpc_op_get_more_set_number_to_return(mcd_rpc_message *rpc, int32_t number_to_return); // Set the OP_GET_MORE cursorID field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_GET_MORE. int32_t mcd_rpc_op_get_more_set_cursor_id(mcd_rpc_message *rpc, int64_t cursor_id); // Get the OP_DELETE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. const char * mcd_rpc_op_delete_get_full_collection_name(const mcd_rpc_message *rpc); // Get the OP_DELETE flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. int32_t mcd_rpc_op_delete_get_flags(const mcd_rpc_message *rpc); // Get the OP_DELETE selector field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. const void * mcd_rpc_op_delete_get_selector(const mcd_rpc_message *rpc); // Set the OP_DELETE fullCollectionName field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. int32_t mcd_rpc_op_delete_set_full_collection_name(mcd_rpc_message *rpc, const char *full_collection_name); // Set the OP_DELETE flags field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. int32_t mcd_rpc_op_delete_set_flags(mcd_rpc_message *rpc, int32_t flags); // Set the OP_DELETE selector field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_DELETE. int32_t mcd_rpc_op_delete_set_selector(mcd_rpc_message *rpc, const void *selector); // Get the OP_KILL_CURSORS numberOfCursorIDs field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_KILL_CURSORS. int32_t mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(const mcd_rpc_message *rpc); // Get the OP_KILL_CURSORS cursorIDs field. // // Returns `NULL` if the OP_KILL_CURSORS numberOfCursorIDs field equals 0. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_KILL_CURSORS. const int64_t * mcd_rpc_op_kill_cursors_get_cursor_ids(const mcd_rpc_message *rpc); // Set the OP_KILL_CURSORS cursorIDs field. // // The msgHeader.opCode field MUST equal MONGOC_OP_CODE_KILL_CURSORS. int32_t mcd_rpc_op_kill_cursors_set_cursor_ids(mcd_rpc_message *rpc, const int64_t *cursor_ids, int32_t number_of_cursor_ids); #ifdef __cplusplus } #endif #endif // !defined(MCD_RPC_H_INCLUDED) mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-aggregate-private.h000066400000000000000000000027251511661753600262250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_AGGREGATE_PRIVATE_H #define MONGOC_AGGREGATE_PRIVATE_H #include #include #include #include #include #include BSON_BEGIN_DECLS mongoc_cursor_t * _mongoc_aggregate(mongoc_client_t *client, const char *ns, mongoc_query_flags_t flags, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *user_rp, const mongoc_read_prefs_t *default_rp, const mongoc_read_concern_t *default_rc, const mongoc_write_concern_t *default_wc); bool _has_write_key(bson_iter_t *iter); BSON_END_DECLS #endif /* MONGOC_AGGREGATE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-aggregate.c000066400000000000000000000250531511661753600245470ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include /*-------------------------------------------------------------------------- * * _has_write_key -- * * Returns true if the aggregation pipeline's last stage is "$out" * or "$merge"; otherwise returns false. * * Side effects: * Advances @iter to the last element. * *-------------------------------------------------------------------------- */ bool _has_write_key(bson_iter_t *iter) { bson_iter_t stage; bson_iter_t next; memcpy(&next, iter, sizeof(bson_iter_t)); if (!bson_iter_next(&next)) { /* default to false when iter is emtpy */ return false; } while (bson_iter_next(iter)) { if (!bson_iter_next(&next) && BSON_ITER_HOLDS_DOCUMENT(iter)) { bson_iter_recurse(iter, &stage); if (bson_iter_find(&stage, "$out")) { return true; } bson_iter_recurse(iter, &stage); if (bson_iter_find(&stage, "$merge")) { return true; } } } return false; } /*-------------------------------------------------------------------------- * * _make_agg_cmd -- * * Constructs an aggregate command. If @ns does not include a collection * name, 1 will be used in its place for the value of "aggregate" in the * command document. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * @command is always initialized. * @error is set if there is a failure. * *-------------------------------------------------------------------------- */ static bool _make_agg_cmd(const char *ns, const bson_t *pipeline, mongoc_aggregate_opts_t *opts, bson_t *command, bson_error_t *err) { const char *const dot = strstr(ns, "."); const char *error = NULL; const char *error_hint = NULL; bsonBuild(*command, kv("aggregate", if (dot, /* Note: we're not validating that the collection name's length is one or more characters, as functions such as mongoc_client_get_collection also do not validate. */ // If 'ns' contains a dot, insert the string after the dot: then(cstr(dot + 1)), // Otherwise just an integer 1: else(int32(1))))); if ((error = bsonBuildError)) { error_hint = "append-aggregate"; goto fail; } /* * The following will allow @pipeline to be either an array of * items for the pipeline, or {"pipeline": [...]}. */ bsonParse(*pipeline, find(keyWithType("pipeline", array), // There is a "pipeline" array in the document append(*command, kv("pipeline", iterValue(bsonVisitIter)))), else( // We did not find a "pipeline" array. copy the pipeline as // an array into the command append(*command, kv("pipeline", array(insert(*pipeline, always)))))); if ((error = bsonParseError)) { error_hint = "append-pipeline"; goto fail; } // Check if there is a $merge or $out in the pipeline for the command bool has_write_key = false; bsonParse(*command, find( // Find the "pipeline" array keyWithType("pipeline", array), parse( // Find the last element of the pipeline array find(lastElement, // If it has an "$out" or "$merge" key, it is a // writing aggregate command. parse(find(key("$out", "$merge"), do(has_write_key = true))))))); if ((error = bsonParseError)) { error_hint = "parse-pipeline"; goto fail; } bsonBuildAppend(*command, kv("cursor", // If batchSize is set, and if we are not a writing command with zero // batchSize, append 'batchSize' to the cursor, otherwise leave the // 'cursor' as an empty subdocument. doc(if (opts->batchSize_is_set && !(has_write_key && opts->batchSize == 0), then(kv("batchSize", int32(opts->batchSize))))))); if ((error = bsonBuildError)) { error_hint = "build-cursor"; goto fail; } return true; fail: _mongoc_set_error(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Error while building aggregate command [%s]: %s", error_hint, error); return false; } /* *-------------------------------------------------------------------------- * * _mongoc_aggregate -- * * Constructs a mongoc_cursor_t for an "aggregate" command. * * This function will always return a new mongoc_cursor_t that should * be freed with mongoc_cursor_destroy(). * * The cursor may fail once iterated upon, so check * mongoc_cursor_error() if mongoc_cursor_next() returns false. * * See https://www.mongodb.com/docs/manual/aggregation/ for more * information on how to build aggregation pipelines. * * Parameters: * @ns: Namespace (or database name for database-level aggregation). * @flags: Bitwise or of mongoc_query_flags_t or 0. * @pipeline: A bson_t containing the pipeline request. @pipeline * will be sent as an array type in the request. * @opts: A bson_t containing aggregation options, such as * bypassDocumentValidation (used with $out and $merge), maxTimeMS * (declaring maximum server execution time) and explain (return * information on the processing of the pipeline). * @user_rp: Optional read preferences for the command. * @default_rp: Default read preferences from the collection or database. * @default_rc: Default read concern from the collection or database. * @default_wc: Default write concern from the collection or database. * * Returns: * A newly allocated mongoc_cursor_t that should be freed with * mongoc_cursor_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_cursor_t * _mongoc_aggregate(mongoc_client_t *client, const char *ns, mongoc_query_flags_t flags, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *user_rp, const mongoc_read_prefs_t *default_rp, const mongoc_read_concern_t *default_rc, const mongoc_write_concern_t *default_wc) { mongoc_server_stream_t *server_stream = NULL; bool has_write_key; bson_iter_t ar; mongoc_cursor_t *cursor; bson_iter_t iter; bson_t command = BSON_INITIALIZER; bson_t cursor_opts; bool created_command; bson_error_t create_cmd_err = {0}; mongoc_aggregate_opts_t aggregate_opts; bson_error_t opts_err = {0}; bool parsed_opts; ENTRY; BSON_ASSERT(client); BSON_ASSERT(ns); BSON_ASSERT(pipeline); bson_init(&cursor_opts); _mongoc_cursor_flags_to_opts(flags, &cursor_opts, NULL); if (opts) { bson_concat(&cursor_opts /* destination */, opts /* source */); } parsed_opts = _mongoc_aggregate_opts_parse(client, opts, &aggregate_opts, &opts_err); if (parsed_opts) { created_command = _make_agg_cmd(ns, pipeline, &aggregate_opts, &command, &create_cmd_err); } else { created_command = false; } cursor = _mongoc_cursor_cmd_new( client, ns, created_command ? &command : NULL, &cursor_opts, user_rp, default_rp, default_rc); bson_destroy(&command); bson_destroy(&cursor_opts); if (!parsed_opts) { memcpy(&cursor->error, &opts_err, sizeof(bson_error_t)); GOTO(done); } if (!created_command) { /* copy error back to cursor. */ memcpy(&cursor->error, &create_cmd_err, sizeof(bson_error_t)); GOTO(done); } if (mongoc_cursor_error(cursor, NULL)) { GOTO(done); } if (!_mongoc_read_prefs_validate(cursor->read_prefs, &cursor->error)) { GOTO(done); } /* pipeline could be like {pipeline: [{$out: 'test'}]} or [{$out: 'test'}] */ if (bson_iter_init_find(&iter, pipeline, "pipeline") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &ar)) { has_write_key = _has_write_key(&ar); } else { if (!bson_iter_init(&iter, pipeline)) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Pipeline is invalid BSON"); GOTO(done); } has_write_key = _has_write_key(&iter); } /* This has an important effect on server selection when * readPreferences=secondary. Keep track of this fact for later use. */ cursor->is_aggr_with_write_stage = has_write_key; /* server id isn't enough. ensure we're connected & know wire version */ const mongoc_ss_log_context_t ss_log_context = {.operation = "aggregate"}; server_stream = _mongoc_cursor_fetch_stream(cursor, &ss_log_context); if (!server_stream) { GOTO(done); } /* Only inherit WriteConcern when aggregate has $out or $merge */ if (!aggregate_opts.write_concern_owned && has_write_key) { mongoc_write_concern_destroy(cursor->write_concern); cursor->write_concern = mongoc_write_concern_copy(default_wc); } done: _mongoc_aggregate_opts_cleanup(&aggregate_opts); mongoc_server_stream_cleanup(server_stream); /* null ok */ /* we always return the cursor, even if it fails; users can detect the * failure on performing a cursor operation. see CDRIVER-880. */ RETURN(cursor); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-apm-private.h000066400000000000000000000160431511661753600250520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_APM_PRIVATE_H #define MONGOC_APM_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS /* forward decl */ struct _mongoc_cmd_t; struct _mongoc_apm_callbacks_t { mongoc_apm_command_started_cb_t started; mongoc_apm_command_succeeded_cb_t succeeded; mongoc_apm_command_failed_cb_t failed; mongoc_apm_server_changed_cb_t server_changed; mongoc_apm_server_opening_cb_t server_opening; mongoc_apm_server_closed_cb_t server_closed; mongoc_apm_topology_changed_cb_t topology_changed; mongoc_apm_topology_opening_cb_t topology_opening; mongoc_apm_topology_closed_cb_t topology_closed; mongoc_apm_server_heartbeat_started_cb_t server_heartbeat_started; mongoc_apm_server_heartbeat_succeeded_cb_t server_heartbeat_succeeded; mongoc_apm_server_heartbeat_failed_cb_t server_heartbeat_failed; }; /* * command monitoring events */ struct _mongoc_apm_command_started_t { bson_t *command; bool command_owned; const char *database_name; const char *command_name; int64_t request_id; int64_t operation_id; const mongoc_host_list_t *host; uint32_t server_id; bson_oid_t service_id; int64_t server_connection_id; void *context; }; struct _mongoc_apm_command_succeeded_t { int64_t duration; bson_t *reply; bool reply_owned; const char *command_name; const char *database_name; int64_t request_id; int64_t operation_id; const mongoc_host_list_t *host; uint32_t server_id; bson_oid_t service_id; int64_t server_connection_id; void *context; }; struct _mongoc_apm_command_failed_t { int64_t duration; const char *command_name; const char *database_name; const bson_error_t *error; bson_t *reply; bool reply_owned; int64_t request_id; int64_t operation_id; const mongoc_host_list_t *host; uint32_t server_id; bson_oid_t service_id; int64_t server_connection_id; void *context; }; /* * SDAM monitoring events */ struct _mongoc_apm_server_changed_t { const mongoc_host_list_t *host; bson_oid_t topology_id; const mongoc_server_description_t *previous_description; const mongoc_server_description_t *new_description; void *context; }; struct _mongoc_apm_server_opening_t { const mongoc_host_list_t *host; bson_oid_t topology_id; void *context; }; struct _mongoc_apm_server_closed_t { const mongoc_host_list_t *host; bson_oid_t topology_id; void *context; }; struct _mongoc_apm_topology_changed_t { bson_oid_t topology_id; const mongoc_topology_description_t *previous_description; const mongoc_topology_description_t *new_description; void *context; }; struct _mongoc_apm_topology_opening_t { bson_oid_t topology_id; void *context; }; struct _mongoc_apm_topology_closed_t { bson_oid_t topology_id; void *context; }; struct _mongoc_apm_server_heartbeat_started_t { const mongoc_host_list_t *host; void *context; bool awaited; }; struct _mongoc_apm_server_heartbeat_succeeded_t { int64_t duration_usec; const bson_t *reply; const mongoc_host_list_t *host; void *context; bool awaited; }; struct _mongoc_apm_server_heartbeat_failed_t { int64_t duration_usec; const bson_error_t *error; const mongoc_host_list_t *host; void *context; bool awaited; }; void mongoc_apm_command_started_init(mongoc_apm_command_started_t *event, const bson_t *command, const char *database_name, const char *command_name, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool *is_redacted, /* out */ void *context); void mongoc_apm_command_started_init_with_cmd(mongoc_apm_command_started_t *event, struct _mongoc_cmd_t *cmd, int64_t request_id, bool *is_redacted, /* out */ void *context); void mongoc_apm_command_started_cleanup(mongoc_apm_command_started_t *event); void mongoc_apm_command_succeeded_init(mongoc_apm_command_succeeded_t *event, int64_t duration, const bson_t *reply, const char *command_name, const char *database_name, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool force_redaction, void *context); void mongoc_apm_command_succeeded_cleanup(mongoc_apm_command_succeeded_t *event); void mongoc_apm_command_failed_init(mongoc_apm_command_failed_t *event, int64_t duration, const char *command_name, const char *database_name, const bson_error_t *error, const bson_t *reply, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool force_redaction, void *context); void mongoc_apm_command_failed_cleanup(mongoc_apm_command_failed_t *event); /** * @brief Determine whether the given command-related message is a "sensitive * command." * * @param command_name The name of the command being checked * @param body The body of the command request, reply, or failure. */ bool mongoc_apm_is_sensitive_command_message(const char *command_name, const bson_t *body); BSON_END_DECLS #endif /* MONGOC_APM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-apm.c000066400000000000000000000600631511661753600233760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include /* * An Application Performance Management (APM) implementation, complying with * MongoDB's Command Logging and Monitoring Spec: * * https://github.com/mongodb/specifications/tree/master/source/command-logging-and-monitoring */ static void append_documents_from_cmd(const mongoc_cmd_t *cmd, mongoc_apm_command_started_t *event) { // If there are no document sequences (OP_MSG Section with payloadType=1), return the command unchanged. if (cmd->payloads_count == 0) { return; } if (!event->command_owned) { event->command = bson_copy(event->command); event->command_owned = true; } _mongoc_cmd_append_payload_as_array(cmd, event->command); } /* * Private initializer / cleanup functions. */ static void mongoc_apm_redact_command(bson_t *command); static void mongoc_apm_redact_reply(bson_t *reply); /*-------------------------------------------------------------------------- * * mongoc_apm_command_started_init -- * * Initialises the command started event. * * Side effects: * If provided, is_redacted indicates whether the command document was * redacted to hide sensitive information. * *-------------------------------------------------------------------------- */ void mongoc_apm_command_started_init(mongoc_apm_command_started_t *event, const bson_t *command, const char *database_name, const char *command_name, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool *is_redacted, /* out */ void *context) { bson_iter_t iter; uint32_t len; const uint8_t *data; /* Command Monitoring Spec: * * In cases where queries or commands are embedded in a $query parameter * when a read preference is provided, they MUST be unwrapped and the value * of the $query attribute becomes the filter or the command in the started * event. The read preference will subsequently be dropped as it is * considered metadata and metadata is not currently provided in the command * events. */ if (bson_has_field(command, "$readPreference")) { if (bson_iter_init_find(&iter, command, "$query") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { bson_iter_document(&iter, &len, &data); event->command = bson_new_from_data(data, len); event->command_owned = true; } else { /* Got $readPreference without $query, probably OP_MSG */ event->command = (bson_t *)command; event->command_owned = false; } } else { /* discard "const", we promise not to modify "command" */ event->command = (bson_t *)command; event->command_owned = false; } if (mongoc_apm_is_sensitive_command_message(command_name, command)) { if (!event->command_owned) { event->command = bson_copy(event->command); event->command_owned = true; } if (is_redacted) { *is_redacted = true; } mongoc_apm_redact_command(event->command); } else if (is_redacted) { *is_redacted = false; } event->database_name = database_name; event->command_name = command_name; event->request_id = request_id; event->operation_id = operation_id; event->host = host; event->server_id = server_id; event->context = context; event->server_connection_id = server_connection_id; bson_oid_copy_unsafe(service_id, &event->service_id); } /*-------------------------------------------------------------------------- * * mongoc_apm_command_started_init_with_cmd -- * * Initialises the command started event from a mongoc_cmd_t. * * Side effects: * If provided, is_redacted indicates whether the command document was * redacted to hide sensitive information. * *-------------------------------------------------------------------------- */ void mongoc_apm_command_started_init_with_cmd(mongoc_apm_command_started_t *event, mongoc_cmd_t *cmd, int64_t request_id, bool *is_redacted, /* out */ void *context) { mongoc_apm_command_started_init(event, cmd->command, cmd->db_name, cmd->command_name, request_id, cmd->operation_id, &cmd->server_stream->sd->host, cmd->server_stream->sd->id, &cmd->server_stream->sd->service_id, cmd->server_stream->sd->server_connection_id, is_redacted, context); /* OP_MSG document sequence for insert, update, or delete? */ append_documents_from_cmd(cmd, event); } void mongoc_apm_command_started_cleanup(mongoc_apm_command_started_t *event) { if (event->command_owned) { bson_destroy(event->command); } } /*-------------------------------------------------------------------------- * * mongoc_apm_command_succeeded_init -- * * Initialises the command succeeded event. * * Parameters: * @force_redaction: If true, the reply document is always redacted, * regardless of whether the command contains sensitive information. * *-------------------------------------------------------------------------- */ void mongoc_apm_command_succeeded_init(mongoc_apm_command_succeeded_t *event, int64_t duration, const bson_t *reply, const char *command_name, const char *database_name, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool force_redaction, void *context) { BSON_ASSERT(reply); if (force_redaction || mongoc_apm_is_sensitive_command_message(command_name, reply)) { event->reply = bson_copy(reply); event->reply_owned = true; mongoc_apm_redact_reply(event->reply); } else { /* discard "const", we promise not to modify "reply" */ event->reply = (bson_t *)reply; event->reply_owned = false; } event->duration = duration; event->command_name = command_name; event->database_name = database_name; event->request_id = request_id; event->operation_id = operation_id; event->host = host; event->server_id = server_id; event->server_connection_id = server_connection_id; event->context = context; bson_oid_copy_unsafe(service_id, &event->service_id); } void mongoc_apm_command_succeeded_cleanup(mongoc_apm_command_succeeded_t *event) { if (event->reply_owned) { bson_destroy(event->reply); } } /*-------------------------------------------------------------------------- * * mongoc_apm_command_failed_init -- * * Initialises the command failed event. * * Parameters: * @force_redaction: If true, the reply document is always redacted, * regardless of whether the command contains sensitive information. * *-------------------------------------------------------------------------- */ void mongoc_apm_command_failed_init(mongoc_apm_command_failed_t *event, int64_t duration, const char *command_name, const char *database_name, const bson_error_t *error, const bson_t *reply, int64_t request_id, int64_t operation_id, const mongoc_host_list_t *host, uint32_t server_id, const bson_oid_t *service_id, int64_t server_connection_id, bool force_redaction, void *context) { BSON_ASSERT(reply); if (force_redaction || mongoc_apm_is_sensitive_command_message(command_name, reply)) { event->reply = bson_copy(reply); event->reply_owned = true; mongoc_apm_redact_reply(event->reply); } else { /* discard "const", we promise not to modify "reply" */ event->reply = (bson_t *)reply; event->reply_owned = false; } event->duration = duration; event->command_name = command_name; event->database_name = database_name; event->error = error; event->request_id = request_id; event->operation_id = operation_id; event->host = host; event->server_id = server_id; event->server_connection_id = server_connection_id; event->context = context; bson_oid_copy_unsafe(service_id, &event->service_id); } void mongoc_apm_command_failed_cleanup(mongoc_apm_command_failed_t *event) { if (event->reply_owned) { bson_destroy(event->reply); } } /* * event field accessors */ /* command-started event fields */ const bson_t * mongoc_apm_command_started_get_command(const mongoc_apm_command_started_t *event) { return event->command; } const char * mongoc_apm_command_started_get_database_name(const mongoc_apm_command_started_t *event) { return event->database_name; } const char * mongoc_apm_command_started_get_command_name(const mongoc_apm_command_started_t *event) { return event->command_name; } int64_t mongoc_apm_command_started_get_request_id(const mongoc_apm_command_started_t *event) { return event->request_id; } int64_t mongoc_apm_command_started_get_operation_id(const mongoc_apm_command_started_t *event) { return event->operation_id; } const mongoc_host_list_t * mongoc_apm_command_started_get_host(const mongoc_apm_command_started_t *event) { return event->host; } uint32_t mongoc_apm_command_started_get_server_id(const mongoc_apm_command_started_t *event) { return event->server_id; } const bson_oid_t * mongoc_apm_command_started_get_service_id(const mongoc_apm_command_started_t *event) { if (mcommon_oid_is_zero(&event->service_id)) { /* serviceId is unset. */ return NULL; } return &event->service_id; } int64_t mongoc_apm_command_started_get_server_connection_id_int64(const mongoc_apm_command_started_t *event) { return event->server_connection_id; } void * mongoc_apm_command_started_get_context(const mongoc_apm_command_started_t *event) { return event->context; } /* command-succeeded event fields */ int64_t mongoc_apm_command_succeeded_get_duration(const mongoc_apm_command_succeeded_t *event) { return event->duration; } const bson_t * mongoc_apm_command_succeeded_get_reply(const mongoc_apm_command_succeeded_t *event) { return event->reply; } const char * mongoc_apm_command_succeeded_get_command_name(const mongoc_apm_command_succeeded_t *event) { return event->command_name; } const char * mongoc_apm_command_succeeded_get_database_name(const mongoc_apm_command_succeeded_t *event) { return event->database_name; } int64_t mongoc_apm_command_succeeded_get_request_id(const mongoc_apm_command_succeeded_t *event) { return event->request_id; } int64_t mongoc_apm_command_succeeded_get_operation_id(const mongoc_apm_command_succeeded_t *event) { return event->operation_id; } const mongoc_host_list_t * mongoc_apm_command_succeeded_get_host(const mongoc_apm_command_succeeded_t *event) { return event->host; } uint32_t mongoc_apm_command_succeeded_get_server_id(const mongoc_apm_command_succeeded_t *event) { return event->server_id; } const bson_oid_t * mongoc_apm_command_succeeded_get_service_id(const mongoc_apm_command_succeeded_t *event) { if (mcommon_oid_is_zero(&event->service_id)) { /* serviceId is unset. */ return NULL; } return &event->service_id; } int64_t mongoc_apm_command_succeeded_get_server_connection_id_int64(const mongoc_apm_command_succeeded_t *event) { return event->server_connection_id; } void * mongoc_apm_command_succeeded_get_context(const mongoc_apm_command_succeeded_t *event) { return event->context; } /* command-failed event fields */ int64_t mongoc_apm_command_failed_get_duration(const mongoc_apm_command_failed_t *event) { return event->duration; } const char * mongoc_apm_command_failed_get_command_name(const mongoc_apm_command_failed_t *event) { return event->command_name; } void mongoc_apm_command_failed_get_error(const mongoc_apm_command_failed_t *event, bson_error_t *error) { memcpy(error, event->error, sizeof *event->error); } const bson_t * mongoc_apm_command_failed_get_reply(const mongoc_apm_command_failed_t *event) { return event->reply; } int64_t mongoc_apm_command_failed_get_request_id(const mongoc_apm_command_failed_t *event) { return event->request_id; } int64_t mongoc_apm_command_failed_get_operation_id(const mongoc_apm_command_failed_t *event) { return event->operation_id; } const mongoc_host_list_t * mongoc_apm_command_failed_get_host(const mongoc_apm_command_failed_t *event) { return event->host; } uint32_t mongoc_apm_command_failed_get_server_id(const mongoc_apm_command_failed_t *event) { return event->server_id; } const bson_oid_t * mongoc_apm_command_failed_get_service_id(const mongoc_apm_command_failed_t *event) { if (mcommon_oid_is_zero(&event->service_id)) { /* serviceId is unset. */ return NULL; } return &event->service_id; } int64_t mongoc_apm_command_failed_get_server_connection_id_int64(const mongoc_apm_command_failed_t *event) { return event->server_connection_id; } void * mongoc_apm_command_failed_get_context(const mongoc_apm_command_failed_t *event) { return event->context; } const char * mongoc_apm_command_failed_get_database_name(const mongoc_apm_command_failed_t *event) { return event->database_name; } /* server-changed event fields */ const mongoc_host_list_t * mongoc_apm_server_changed_get_host(const mongoc_apm_server_changed_t *event) { return event->host; } void mongoc_apm_server_changed_get_topology_id(const mongoc_apm_server_changed_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } const mongoc_server_description_t * mongoc_apm_server_changed_get_previous_description(const mongoc_apm_server_changed_t *event) { return event->previous_description; } const mongoc_server_description_t * mongoc_apm_server_changed_get_new_description(const mongoc_apm_server_changed_t *event) { return event->new_description; } void * mongoc_apm_server_changed_get_context(const mongoc_apm_server_changed_t *event) { return event->context; } /* server-opening event fields */ const mongoc_host_list_t * mongoc_apm_server_opening_get_host(const mongoc_apm_server_opening_t *event) { return event->host; } void mongoc_apm_server_opening_get_topology_id(const mongoc_apm_server_opening_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } void * mongoc_apm_server_opening_get_context(const mongoc_apm_server_opening_t *event) { return event->context; } /* server-closed event fields */ const mongoc_host_list_t * mongoc_apm_server_closed_get_host(const mongoc_apm_server_closed_t *event) { return event->host; } void mongoc_apm_server_closed_get_topology_id(const mongoc_apm_server_closed_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } void * mongoc_apm_server_closed_get_context(const mongoc_apm_server_closed_t *event) { return event->context; } /* topology-changed event fields */ void mongoc_apm_topology_changed_get_topology_id(const mongoc_apm_topology_changed_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } const mongoc_topology_description_t * mongoc_apm_topology_changed_get_previous_description(const mongoc_apm_topology_changed_t *event) { return event->previous_description; } const mongoc_topology_description_t * mongoc_apm_topology_changed_get_new_description(const mongoc_apm_topology_changed_t *event) { return event->new_description; } void * mongoc_apm_topology_changed_get_context(const mongoc_apm_topology_changed_t *event) { return event->context; } /* topology-opening event field */ void mongoc_apm_topology_opening_get_topology_id(const mongoc_apm_topology_opening_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } void * mongoc_apm_topology_opening_get_context(const mongoc_apm_topology_opening_t *event) { return event->context; } /* topology-closed event field */ void mongoc_apm_topology_closed_get_topology_id(const mongoc_apm_topology_closed_t *event, bson_oid_t *topology_id) { bson_oid_copy(&event->topology_id, topology_id); } void * mongoc_apm_topology_closed_get_context(const mongoc_apm_topology_closed_t *event) { return event->context; } /* heartbeat-started event field */ const mongoc_host_list_t * mongoc_apm_server_heartbeat_started_get_host(const mongoc_apm_server_heartbeat_started_t *event) { return event->host; } void * mongoc_apm_server_heartbeat_started_get_context(const mongoc_apm_server_heartbeat_started_t *event) { return event->context; } bool mongoc_apm_server_heartbeat_started_get_awaited(const mongoc_apm_server_heartbeat_started_t *event) { return event->awaited; } /* heartbeat-succeeded event fields */ int64_t mongoc_apm_server_heartbeat_succeeded_get_duration(const mongoc_apm_server_heartbeat_succeeded_t *event) { return event->duration_usec; } const bson_t * mongoc_apm_server_heartbeat_succeeded_get_reply(const mongoc_apm_server_heartbeat_succeeded_t *event) { return event->reply; } const mongoc_host_list_t * mongoc_apm_server_heartbeat_succeeded_get_host(const mongoc_apm_server_heartbeat_succeeded_t *event) { return event->host; } void * mongoc_apm_server_heartbeat_succeeded_get_context(const mongoc_apm_server_heartbeat_succeeded_t *event) { return event->context; } bool mongoc_apm_server_heartbeat_succeeded_get_awaited(const mongoc_apm_server_heartbeat_succeeded_t *event) { return event->awaited; } /* heartbeat-failed event fields */ int64_t mongoc_apm_server_heartbeat_failed_get_duration(const mongoc_apm_server_heartbeat_failed_t *event) { return event->duration_usec; } void mongoc_apm_server_heartbeat_failed_get_error(const mongoc_apm_server_heartbeat_failed_t *event, bson_error_t *error) { memcpy(error, event->error, sizeof *event->error); } const mongoc_host_list_t * mongoc_apm_server_heartbeat_failed_get_host(const mongoc_apm_server_heartbeat_failed_t *event) { return event->host; } void * mongoc_apm_server_heartbeat_failed_get_context(const mongoc_apm_server_heartbeat_failed_t *event) { return event->context; } bool mongoc_apm_server_heartbeat_failed_get_awaited(const mongoc_apm_server_heartbeat_failed_t *event) { return event->awaited; } /* * registering callbacks */ mongoc_apm_callbacks_t * mongoc_apm_callbacks_new(void) { size_t s = sizeof(mongoc_apm_callbacks_t); return (mongoc_apm_callbacks_t *)bson_malloc0(s); } void mongoc_apm_callbacks_destroy(mongoc_apm_callbacks_t *callbacks) { bson_free(callbacks); } void mongoc_apm_set_command_started_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_started_cb_t cb) { callbacks->started = cb; } void mongoc_apm_set_command_succeeded_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_succeeded_cb_t cb) { callbacks->succeeded = cb; } void mongoc_apm_set_command_failed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_failed_cb_t cb) { callbacks->failed = cb; } void mongoc_apm_set_server_changed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_changed_cb_t cb) { callbacks->server_changed = cb; } void mongoc_apm_set_server_opening_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_opening_cb_t cb) { callbacks->server_opening = cb; } void mongoc_apm_set_server_closed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_closed_cb_t cb) { callbacks->server_closed = cb; } void mongoc_apm_set_topology_changed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_changed_cb_t cb) { callbacks->topology_changed = cb; } void mongoc_apm_set_topology_opening_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_opening_cb_t cb) { callbacks->topology_opening = cb; } void mongoc_apm_set_topology_closed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_closed_cb_t cb) { callbacks->topology_closed = cb; } void mongoc_apm_set_server_heartbeat_started_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_started_cb_t cb) { callbacks->server_heartbeat_started = cb; } void mongoc_apm_set_server_heartbeat_succeeded_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_succeeded_cb_t cb) { callbacks->server_heartbeat_succeeded = cb; } void mongoc_apm_set_server_heartbeat_failed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_failed_cb_t cb) { callbacks->server_heartbeat_failed = cb; } static bool _mongoc_apm_is_sensitive_command_name(const char *command_name) { return 0 == strcasecmp(command_name, "authenticate") || 0 == strcasecmp(command_name, "saslStart") || 0 == strcasecmp(command_name, "saslContinue") || 0 == strcasecmp(command_name, "getnonce") || 0 == strcasecmp(command_name, "createUser") || 0 == strcasecmp(command_name, "updateUser") || 0 == strcasecmp(command_name, "copydbgetnonce") || 0 == strcasecmp(command_name, "copydbsaslstart") || 0 == strcasecmp(command_name, "copydb"); } static bool _mongoc_apm_is_sensitive_hello_message(const char *command_name, const bson_t *body) { const bool is_hello = (0 == strcasecmp(command_name, "hello") || 0 == strcasecmp(command_name, HANDSHAKE_CMD_LEGACY_HELLO)); if (!is_hello) { return false; } if (bson_empty(body)) { /* An empty message body means that it has been redacted */ return true; } else if (bson_has_field(body, "speculativeAuthenticate")) { /* "hello" messages are only sensitive if they contain * 'speculativeAuthenticate' */ return true; } else { /* Other "hello" messages are okay */ return false; } } bool mongoc_apm_is_sensitive_command_message(const char *command_name, const bson_t *body) { BSON_ASSERT(body); return _mongoc_apm_is_sensitive_command_name(command_name) || _mongoc_apm_is_sensitive_hello_message(command_name, body); } void mongoc_apm_redact_command(bson_t *command) { BSON_ASSERT(command); /* Reinit the command to have an empty document */ bson_reinit(command); } void mongoc_apm_redact_reply(bson_t *reply) { BSON_ASSERT(reply); /* Reinit the reply to have an empty document */ bson_reinit(reply); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-apm.h000066400000000000000000000335121511661753600234020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_APM_H #define MONGOC_APM_H #include #include #include #include #include BSON_BEGIN_DECLS /* * Application Performance Management (APM) interface, complies with two specs. * MongoDB's Command Logging and Monitoring Spec: * * https://github.com/mongodb/specifications/tree/master/source/command-logging-and-monitoring * * MongoDB's Spec for Monitoring Server Discovery and Monitoring (SDAM) events: * * https://github.com/mongodb/specifications/tree/master/source/server-discovery-and-monitoring * */ /* * callbacks to receive APM events */ typedef struct _mongoc_apm_callbacks_t mongoc_apm_callbacks_t; /* * command monitoring events */ typedef struct _mongoc_apm_command_started_t mongoc_apm_command_started_t; typedef struct _mongoc_apm_command_succeeded_t mongoc_apm_command_succeeded_t; typedef struct _mongoc_apm_command_failed_t mongoc_apm_command_failed_t; /* * SDAM monitoring events */ typedef struct _mongoc_apm_server_changed_t mongoc_apm_server_changed_t; typedef struct _mongoc_apm_server_opening_t mongoc_apm_server_opening_t; typedef struct _mongoc_apm_server_closed_t mongoc_apm_server_closed_t; typedef struct _mongoc_apm_topology_changed_t mongoc_apm_topology_changed_t; typedef struct _mongoc_apm_topology_opening_t mongoc_apm_topology_opening_t; typedef struct _mongoc_apm_topology_closed_t mongoc_apm_topology_closed_t; typedef struct _mongoc_apm_server_heartbeat_started_t mongoc_apm_server_heartbeat_started_t; typedef struct _mongoc_apm_server_heartbeat_succeeded_t mongoc_apm_server_heartbeat_succeeded_t; typedef struct _mongoc_apm_server_heartbeat_failed_t mongoc_apm_server_heartbeat_failed_t; /* * event field accessors */ /* command-started event fields */ MONGOC_EXPORT(const bson_t *) mongoc_apm_command_started_get_command(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_started_get_database_name(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_started_get_command_name(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_started_get_request_id(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_started_get_operation_id(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_command_started_get_host(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(uint32_t) mongoc_apm_command_started_get_server_id(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(const bson_oid_t *) mongoc_apm_command_started_get_service_id(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_started_get_server_connection_id_int64(const mongoc_apm_command_started_t *event); MONGOC_EXPORT(void *) mongoc_apm_command_started_get_context(const mongoc_apm_command_started_t *event); /* command-succeeded event fields */ MONGOC_EXPORT(int64_t) mongoc_apm_command_succeeded_get_duration(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(const bson_t *) mongoc_apm_command_succeeded_get_reply(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_succeeded_get_command_name(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_succeeded_get_database_name(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_succeeded_get_request_id(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_succeeded_get_operation_id(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_command_succeeded_get_host(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(uint32_t) mongoc_apm_command_succeeded_get_server_id(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(const bson_oid_t *) mongoc_apm_command_succeeded_get_service_id(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_succeeded_get_server_connection_id_int64(const mongoc_apm_command_succeeded_t *event); MONGOC_EXPORT(void *) mongoc_apm_command_succeeded_get_context(const mongoc_apm_command_succeeded_t *event); /* command-failed event fields */ MONGOC_EXPORT(int64_t) mongoc_apm_command_failed_get_duration(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_failed_get_command_name(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(const char *) mongoc_apm_command_failed_get_database_name(const mongoc_apm_command_failed_t *event); /* retrieve the error by filling out the passed-in "error" struct */ MONGOC_EXPORT(void) mongoc_apm_command_failed_get_error(const mongoc_apm_command_failed_t *event, bson_error_t *error); MONGOC_EXPORT(const bson_t *) mongoc_apm_command_failed_get_reply(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_failed_get_request_id(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_failed_get_operation_id(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_command_failed_get_host(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(uint32_t) mongoc_apm_command_failed_get_server_id(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(const bson_oid_t *) mongoc_apm_command_failed_get_service_id(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(int64_t) mongoc_apm_command_failed_get_server_connection_id_int64(const mongoc_apm_command_failed_t *event); MONGOC_EXPORT(void *) mongoc_apm_command_failed_get_context(const mongoc_apm_command_failed_t *event); /* server-changed event fields */ MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_changed_get_host(const mongoc_apm_server_changed_t *event); MONGOC_EXPORT(void) mongoc_apm_server_changed_get_topology_id(const mongoc_apm_server_changed_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(const mongoc_server_description_t *) mongoc_apm_server_changed_get_previous_description(const mongoc_apm_server_changed_t *event); MONGOC_EXPORT(const mongoc_server_description_t *) mongoc_apm_server_changed_get_new_description(const mongoc_apm_server_changed_t *event); MONGOC_EXPORT(void *) mongoc_apm_server_changed_get_context(const mongoc_apm_server_changed_t *event); /* server-opening event fields */ MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_opening_get_host(const mongoc_apm_server_opening_t *event); MONGOC_EXPORT(void) mongoc_apm_server_opening_get_topology_id(const mongoc_apm_server_opening_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(void *) mongoc_apm_server_opening_get_context(const mongoc_apm_server_opening_t *event); /* server-closed event fields */ MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_closed_get_host(const mongoc_apm_server_closed_t *event); MONGOC_EXPORT(void) mongoc_apm_server_closed_get_topology_id(const mongoc_apm_server_closed_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(void *) mongoc_apm_server_closed_get_context(const mongoc_apm_server_closed_t *event); /* topology-changed event fields */ MONGOC_EXPORT(void) mongoc_apm_topology_changed_get_topology_id(const mongoc_apm_topology_changed_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(const mongoc_topology_description_t *) mongoc_apm_topology_changed_get_previous_description(const mongoc_apm_topology_changed_t *event); MONGOC_EXPORT(const mongoc_topology_description_t *) mongoc_apm_topology_changed_get_new_description(const mongoc_apm_topology_changed_t *event); MONGOC_EXPORT(void *) mongoc_apm_topology_changed_get_context(const mongoc_apm_topology_changed_t *event); /* topology-opening event field */ MONGOC_EXPORT(void) mongoc_apm_topology_opening_get_topology_id(const mongoc_apm_topology_opening_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(void *) mongoc_apm_topology_opening_get_context(const mongoc_apm_topology_opening_t *event); /* topology-closed event field */ MONGOC_EXPORT(void) mongoc_apm_topology_closed_get_topology_id(const mongoc_apm_topology_closed_t *event, bson_oid_t *topology_id); MONGOC_EXPORT(void *) mongoc_apm_topology_closed_get_context(const mongoc_apm_topology_closed_t *event); /* heartbeat-started event field */ MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_heartbeat_started_get_host(const mongoc_apm_server_heartbeat_started_t *event); MONGOC_EXPORT(void *) mongoc_apm_server_heartbeat_started_get_context(const mongoc_apm_server_heartbeat_started_t *event); MONGOC_EXPORT(bool) mongoc_apm_server_heartbeat_started_get_awaited(const mongoc_apm_server_heartbeat_started_t *event); /* heartbeat-succeeded event fields */ MONGOC_EXPORT(int64_t) mongoc_apm_server_heartbeat_succeeded_get_duration(const mongoc_apm_server_heartbeat_succeeded_t *event); MONGOC_EXPORT(const bson_t *) mongoc_apm_server_heartbeat_succeeded_get_reply(const mongoc_apm_server_heartbeat_succeeded_t *event); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_heartbeat_succeeded_get_host(const mongoc_apm_server_heartbeat_succeeded_t *event); MONGOC_EXPORT(void *) mongoc_apm_server_heartbeat_succeeded_get_context(const mongoc_apm_server_heartbeat_succeeded_t *event); MONGOC_EXPORT(bool) mongoc_apm_server_heartbeat_succeeded_get_awaited(const mongoc_apm_server_heartbeat_succeeded_t *event); /* heartbeat-failed event fields */ MONGOC_EXPORT(int64_t) mongoc_apm_server_heartbeat_failed_get_duration(const mongoc_apm_server_heartbeat_failed_t *event); MONGOC_EXPORT(void) mongoc_apm_server_heartbeat_failed_get_error(const mongoc_apm_server_heartbeat_failed_t *event, bson_error_t *error); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_apm_server_heartbeat_failed_get_host(const mongoc_apm_server_heartbeat_failed_t *event); MONGOC_EXPORT(void *) mongoc_apm_server_heartbeat_failed_get_context(const mongoc_apm_server_heartbeat_failed_t *event); MONGOC_EXPORT(bool) mongoc_apm_server_heartbeat_failed_get_awaited(const mongoc_apm_server_heartbeat_failed_t *event); /* * callbacks */ typedef void(BSON_CALL *mongoc_apm_command_started_cb_t)(const mongoc_apm_command_started_t *event); typedef void(BSON_CALL *mongoc_apm_command_succeeded_cb_t)(const mongoc_apm_command_succeeded_t *event); typedef void(BSON_CALL *mongoc_apm_command_failed_cb_t)(const mongoc_apm_command_failed_t *event); typedef void(BSON_CALL *mongoc_apm_server_changed_cb_t)(const mongoc_apm_server_changed_t *event); typedef void(BSON_CALL *mongoc_apm_server_opening_cb_t)(const mongoc_apm_server_opening_t *event); typedef void(BSON_CALL *mongoc_apm_server_closed_cb_t)(const mongoc_apm_server_closed_t *event); typedef void(BSON_CALL *mongoc_apm_topology_changed_cb_t)(const mongoc_apm_topology_changed_t *event); typedef void(BSON_CALL *mongoc_apm_topology_opening_cb_t)(const mongoc_apm_topology_opening_t *event); typedef void(BSON_CALL *mongoc_apm_topology_closed_cb_t)(const mongoc_apm_topology_closed_t *event); typedef void(BSON_CALL *mongoc_apm_server_heartbeat_started_cb_t)(const mongoc_apm_server_heartbeat_started_t *event); typedef void(BSON_CALL *mongoc_apm_server_heartbeat_succeeded_cb_t)( const mongoc_apm_server_heartbeat_succeeded_t *event); typedef void(BSON_CALL *mongoc_apm_server_heartbeat_failed_cb_t)(const mongoc_apm_server_heartbeat_failed_t *event); /* * registering callbacks */ MONGOC_EXPORT(mongoc_apm_callbacks_t *) mongoc_apm_callbacks_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_apm_callbacks_destroy(mongoc_apm_callbacks_t *callbacks); MONGOC_EXPORT(void) mongoc_apm_set_command_started_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_started_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_command_succeeded_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_succeeded_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_command_failed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_command_failed_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_changed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_changed_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_opening_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_opening_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_closed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_closed_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_topology_changed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_changed_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_topology_opening_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_opening_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_topology_closed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_topology_closed_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_heartbeat_started_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_started_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_heartbeat_succeeded_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_succeeded_cb_t cb); MONGOC_EXPORT(void) mongoc_apm_set_server_heartbeat_failed_cb(mongoc_apm_callbacks_t *callbacks, mongoc_apm_server_heartbeat_failed_cb_t cb); BSON_END_DECLS #endif /* MONGOC_APM_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-array-private.h000066400000000000000000000034421511661753600254120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_ARRAY_PRIVATE_H #define MONGOC_ARRAY_PRIVATE_H #include BSON_BEGIN_DECLS // mongoc_array_t stores an array of objects of type T. // // T must be trivially relocatable. In particular, `bson_t` is not trivially relocatable (CDRIVER-6113). typedef struct _mongoc_array_t mongoc_array_t; struct _mongoc_array_t { size_t len; size_t element_alignment; size_t element_size; size_t allocated; void *data; }; #define mongoc_array_aligned_init(a, Type) _mongoc_array_aligned_init(a, BSON_ALIGNOF(Type), sizeof(Type)) #define _mongoc_array_append_val(a, v) _mongoc_array_append_vals(a, &v, 1) #define _mongoc_array_index(a, t, i) (((t *)(a)->data)[i]) #define _mongoc_array_clear(a) (a)->len = 0 void _mongoc_array_aligned_init(mongoc_array_t *array, size_t element_alignment, size_t element_size); void _mongoc_array_init(mongoc_array_t *array, size_t element_size); void _mongoc_array_copy(mongoc_array_t *dst, const mongoc_array_t *src); void _mongoc_array_append_vals(mongoc_array_t *array, const void *data, uint32_t n_elements); void _mongoc_array_destroy(mongoc_array_t *array); BSON_END_DECLS #endif /* MONGOC_ARRAY_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-array.c000066400000000000000000000062321511661753600237350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include void _mongoc_array_init(mongoc_array_t *array, size_t element_size) { BSON_ASSERT_PARAM(array); BSON_ASSERT(element_size > 0); array->len = 0; array->element_alignment = 0; array->element_size = element_size; array->allocated = 128; array->data = (void *)bson_malloc0(array->allocated); } void _mongoc_array_aligned_init(mongoc_array_t *array, size_t element_alignment, size_t element_size) { BSON_ASSERT_PARAM(array); BSON_ASSERT(element_alignment > 0); BSON_ASSERT(element_size > 0); array->len = 0; array->element_alignment = element_alignment; array->element_size = element_size; array->allocated = 128; array->data = bson_aligned_alloc0(element_alignment, array->allocated); } /* *-------------------------------------------------------------------------- * * _mongoc_array_copy -- * * Destroy dst and copy src into it. Both arrays must be initialized. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void _mongoc_array_copy(mongoc_array_t *dst, const mongoc_array_t *src) { _mongoc_array_destroy(dst); dst->len = src->len; dst->element_alignment = src->element_alignment; dst->element_size = src->element_size; dst->allocated = src->allocated; if (dst->element_alignment == 0) { dst->data = bson_malloc(dst->allocated); } else { dst->data = bson_aligned_alloc(dst->element_alignment, dst->allocated); } memcpy(dst->data, src->data, dst->allocated); } void _mongoc_array_destroy(mongoc_array_t *array) { if (array && array->data) { bson_free(array->data); } } void _mongoc_array_append_vals(mongoc_array_t *array, const void *data, uint32_t n_elements) { size_t len; size_t off; size_t next_size; BSON_ASSERT(array); BSON_ASSERT(data); off = array->element_size * array->len; len = (size_t)n_elements * array->element_size; if ((off + len) > array->allocated) { next_size = bson_next_power_of_two(off + len); if (array->element_alignment == 0) { array->data = bson_realloc(array->data, next_size); array->allocated = next_size; } else { void *const old_data = array->data; array->data = bson_aligned_alloc(array->element_alignment, next_size); memmove(array->data, old_data, array->allocated); array->allocated = next_size; bson_free(old_data); } } memcpy((uint8_t *)array->data + off, data, len); array->len += n_elements; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-async-cmd-private.h000066400000000000000000000313101511661753600261450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_ASYNC_CMD_PRIVATE_H #define MONGOC_ASYNC_CMD_PRIVATE_H #include #include #include #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS typedef enum { // The command has no stream and needs to connect to a peer MONGOC_ASYNC_CMD_PENDING_CONNECT, // The command has connected and has a stream, but needs to run stream setup (e.g. TLS handshake) MONGOC_ASYNC_CMD_STREAM_SETUP, // The command has data to send to the peer MONGOC_ASYNC_CMD_SEND, // The command is ready to receive the response length header MONGOC_ASYNC_CMD_RECV_LEN, // The command is ready to receive the RPC message MONGOC_ASYNC_CMD_RECV_RPC, // The command is in an invalid error state MONGOC_ASYNC_CMD_ERROR_STATE, // The command has been cancelled. MONGOC_ASYNC_CMD_CANCELLED_STATE, } mongoc_async_cmd_state_t; /** * @brief Command callback/state result code */ typedef enum { MONGOC_ASYNC_CMD_CONNECTED, MONGOC_ASYNC_CMD_IN_PROGRESS, MONGOC_ASYNC_CMD_SUCCESS, MONGOC_ASYNC_CMD_ERROR, MONGOC_ASYNC_CMD_TIMEOUT, } mongoc_async_cmd_result_t; /** * @brief Callback type associated with an asynchronous command object. * * The callback will be invoked after a new connection is established, and * again when the command completes. * * @param acmd Pointer to the async command object that invoked the callback * @param result The result/state of the asynchronous command object * @param bson Result data associated with the command's state, if any. * @param duration The elapsed duration that the command object has been running. * This will be zero when the CONNECTED state is invoked. */ typedef void (*mongoc_async_cmd_event_cb)(struct _mongoc_async_cmd *acmd, mongoc_async_cmd_result_t result, const bson_t *bson, mlib_duration duration); /** * @brief Callback that is used to open a new stream for a command object. * * If the function returns a null pointer, it is considered to have failed. */ typedef mongoc_stream_t *(*mongoc_async_cmd_connect_cb)(struct _mongoc_async_cmd *); /** * @brief Stream setup callback for asynchronous commands * * This callback will be invoked by the async command runner after a stream has * been opened, allowing the command creator time to do setup on the stream * before the command tries to use it. * * @param stream Pointer to the valid stream object that was just created * @param events Pointer to a poll() events bitmask. The function can modify this * value to change what the stream will await on next * @param ctx Pointer to arbitrary user data for the setup function. * @param timeout A timer that gives a deadline for the setup operation * @return int The function should return -1 on failure, 1 if the stream * immediately has data to send, or 0 for generic success. */ typedef int (*mongoc_async_cmd_stream_setup_cb)( mongoc_stream_t *stream, int *events, void *ctx, mlib_timer timeout, bson_error_t *error); typedef struct _mongoc_async_cmd { /** * @brief The stream that is associated with an in-progress command. * * This may start as a null pointer, but is updated when a connection is * established. */ mongoc_stream_t *stream; // Non-owning pointer to the asynchrony engine associated with this command mongoc_async_t *async; /** * @brief The current state of the asynchronous command. * * Used to control the state machine that is executed with async_cmd_run() */ mongoc_async_cmd_state_t state; // Bitmask of poll() events that this command is waiting to see int events; /** * @brief User-provided callback that will be used to lazily create the I/O stream * for the command. */ mongoc_async_cmd_connect_cb _stream_connect; /** * @brief User-provided callback function to do setup on the command's stream * after the stream has been created automatically. */ mongoc_async_cmd_stream_setup_cb _stream_setup; // Arbitrary userdata pointer passed to the stream setup function void *_stream_setup_userdata; /** * @brief User-provided command event callback. Invoked after a new * connection is established, and again when the command completes. */ mongoc_async_cmd_event_cb _event_callback; // Arbitrary userdata passed when the object was created void *_userdata; /** * @brief Timer to when the command should attempt to lazily initiate a new * connection with the _stream_connect callback. This does not apply if the * command was given a stream upon construction. */ mlib_timer _connect_delay_timer; /** * @brief The "start" reference point-in-time for the command object * * This is used to determine how long the command has been in progress, * including for when to consider the command to have timed-out. * * NOTE: This value can change! See: `_acmd_reset_elapsed` */ mlib_time_point _start_time; /** * @brief The timeout duration allotted to the command object. * * We need to store it as a duration rather than a timer, because we need to * reset the timeout at certain points (see: `_acmd_reset_elapsed`) */ mlib_duration _timeout; bson_error_t error; /** * @brief The BSON document of the command to be executed on the server. */ bson_t _command; mongoc_buffer_t buffer; mongoc_iovec_t *iovec; size_t niovec; size_t bytes_written; size_t bytes_to_read; mcd_rpc_message *rpc; /** * @brief The response data from the peer. * * Initialized with BSON_INITIALIZER, so safe to pass/destroy upon construction. */ bson_t _response_data; char *ns; /** * @brief The DNS address info that was associated with the command when * it was created. May be null if no DNS result was provided. */ struct addrinfo *dns_result; struct _mongoc_async_cmd *next; struct _mongoc_async_cmd *prev; } mongoc_async_cmd_t; /** * @brief Create a new asynchronous command object associated with a collection * of async commands * * @param async The async engine that will own this new command * @param stream (Optional) a stream to be associated with the new command. If * NULL, then a stream will be created lazily for the command object. * @param dns_result Pointer to a DNS result associated with the command * @param connect_callback Callback function that will be used to establish a * new stream for the command object if `stream` is null. * @param connect_delay The amount of time that the command should wait before * we try to connect the deferred stream for the command. * @param setup The stream setup callback for the command object. * @param setup_ctx Arbitrary data passed to the `setup` callback. * @param dbname The database name associated with the command. Required for OP_MSG * @param cmd The BSON data that will be sent in the command message * @param cmd_opcode The wire protocol opcode for the command * @param cb A callback that is invoked during events associated with the command. * @param userdata Arbitrary data pointer associated with the command object * @param timeout A timeout for the command. @see _acmd_reset_elapsed * @return mongoc_async_cmd_t* A newly created asynchronous command object */ mongoc_async_cmd_t * mongoc_async_cmd_new(mongoc_async_t *async, mongoc_stream_t *stream, bool is_setup_done, struct addrinfo *dns_result, mongoc_async_cmd_connect_cb connect_callback, mlib_duration connect_delay, mongoc_async_cmd_stream_setup_cb setup, void *setup_ctx, const char *dbname, const bson_t *cmd, const int32_t cmd_opcode, mongoc_async_cmd_event_cb cb, void *userdata, mlib_duration timeout); /** * @brief Obtain a deadline timer that will expire when the given async command * will time out. * * Note that the initiation time of the command can be changed, which will also * adjust the point-in-time at which it expires. */ static inline mlib_timer _acmd_deadline(const mongoc_async_cmd_t *self) { BSON_ASSERT_PARAM(self); return mlib_expires_at(mlib_time_add(self->_start_time, self->_timeout)); } /** * @brief Determine whether the given async command object has timed out */ static inline bool _acmd_has_timed_out(const mongoc_async_cmd_t *self) { return mlib_timer_is_expired(_acmd_deadline(self)); } /** * @brief Cancel an in-progress command. * * This doesn't immediately destroy any resources or perform I/O, it just marks * the command to abort the next time it is polled. */ static inline void _acmd_cancel(mongoc_async_cmd_t *self) { BSON_ASSERT_PARAM(self); // Don't attempt to cancel a command in the error state, as it already has a // completion state waiting to be delivered. if (self->state != MONGOC_ASYNC_CMD_ERROR_STATE) { self->state = MONGOC_ASYNC_CMD_CANCELLED_STATE; } } /** * @brief Adjust the connect-delay timer for an async command by the given duration * * @param d A duration to be added/removed to the command's connect wait. * * This only effects commands that don't have an open stream and are pending a * connect. If this causes the connect-delay timer to expire, then the command * will attempt to connect the next time it is polled. */ static inline void _acmd_adjust_connect_delay(mongoc_async_cmd_t *self, const mlib_duration d) { BSON_ASSERT_PARAM(self); self->_connect_delay_timer.expires_at = mlib_time_add(self->_connect_delay_timer.expires_at, d); } /** * @brief Reset the elapsed time for the command, changing when it will timeout * * XXX: This is a HACK to fix CDRIVER-1571. The problem is that the provided deferred * connect (_stream_setup and/or _stream_connect) callbacks can perform blocking * I/O that delays everyone in the async pool, which can cause other commands * to exceed their timeout because one operation is blocking the entire pool. * * This function has the side effect that a command can exceed its allotted timeout * because this function is called multiple times, so only a single individual I/O * operation can actually timeout, rather than the entire composed operation. * * The proper fix is to force `_stream_setup` and `_stream_connect` to be * non-blocking, and the reference start time for the command can remain fixed. */ static inline void _acmd_reset_elapsed(mongoc_async_cmd_t *self) { self->_start_time = mlib_now(); } /** * @brief Obtain the amount of time that the command has been running */ static inline mlib_duration _acmd_elapsed(mongoc_async_cmd_t const *self) { return mlib_elapsed_since(self->_start_time); } /** * @brief Obtain the userdata pointer associated with the given async command * object * * @param T The type to read from the pointer * @param Command Pointer to a command object */ #define _acmd_userdata(T, Command) ((T *)((Command)->_userdata)) void mongoc_async_cmd_destroy(mongoc_async_cmd_t *acmd); /** * @brief Pump the asynchronous command object state machine. * * If this function completes the command, it will destroy the async command * object and return `false`. Otherwise, it will return `true`. */ bool mongoc_async_cmd_run(mongoc_async_cmd_t *acmd); #ifdef MONGOC_ENABLE_SSL /** * @brief Stream setup callback. Initializes TLS on the stream before the command runner tries to use it. * * @param ctx The userdata for the TLS setup is the hostname string for the peer. * * Refer to `mongoc_async_cmd_stream_setup_cb` for signature details */ int mongoc_async_cmd_tls_setup(mongoc_stream_t *stream, int *events, void *ctx, mlib_timer deadline, bson_error_t *error); #endif BSON_END_DECLS #endif /* MONGOC_ASYNC_CMD_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-async-cmd.c000066400000000000000000000370421511661753600245000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif typedef mongoc_async_cmd_result_t (*_mongoc_async_cmd_phase_t)(mongoc_async_cmd_t *cmd); static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_connect(mongoc_async_cmd_t *cmd); static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_stream_setup(mongoc_async_cmd_t *cmd); static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_send(mongoc_async_cmd_t *cmd); static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_recv_len(mongoc_async_cmd_t *cmd); static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_recv_rpc(mongoc_async_cmd_t *cmd); static const _mongoc_async_cmd_phase_t gMongocCMDPhases[] = { _mongoc_async_cmd_phase_connect, _mongoc_async_cmd_phase_stream_setup, _mongoc_async_cmd_phase_send, _mongoc_async_cmd_phase_recv_len, _mongoc_async_cmd_phase_recv_rpc, NULL, /* no callback for MONGOC_ASYNC_CMD_ERROR_STATE */ NULL, /* no callback for MONGOC_ASYNC_CMD_CANCELED_STATE */ }; #ifdef MONGOC_ENABLE_SSL int mongoc_async_cmd_tls_setup(mongoc_stream_t *stream, int *events, void *ctx, mlib_timer deadline, bson_error_t *error) { mongoc_stream_t *tls_stream; const char *host = (const char *)ctx; int retry_events = 0; for (tls_stream = stream; tls_stream->type != MONGOC_STREAM_TLS; tls_stream = mongoc_stream_get_base_stream(tls_stream)) { } const bool use_non_blocking = #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) true #else false #endif ; // Try to do a non-blocking operation, if our backend allows it const mlib_duration_rep_t remain_ms = // use_non_blocking // Pass 0 for the timeout to begin / continue a non-blocking handshake ? 0 // Otherwise, use the deadline : mlib_milliseconds_count(mlib_timer_remaining(deadline)); if (mongoc_stream_tls_handshake(tls_stream, host, mlib_assert_narrow(int32_t, remain_ms), &retry_events, error)) { return 1; } if (retry_events) { *events = retry_events; return 0; } return -1; } #endif bool mongoc_async_cmd_run(mongoc_async_cmd_t *acmd) { BSON_ASSERT_PARAM(acmd); /* if we have successfully connected to the node, call the callback. */ if (acmd->state == MONGOC_ASYNC_CMD_SEND) { acmd->_event_callback(acmd, MONGOC_ASYNC_CMD_CONNECTED, NULL, _acmd_elapsed(acmd)); } _mongoc_async_cmd_phase_t const phase_callback = gMongocCMDPhases[acmd->state]; mongoc_async_cmd_result_t const result = phase_callback // ? phase_callback(acmd) : MONGOC_ASYNC_CMD_ERROR; switch (result) { case MONGOC_ASYNC_CMD_IN_PROGRESS: // No callback on progress events. Just return true to tell the caller // that there's more work to do. return true; case MONGOC_ASYNC_CMD_CONNECTED: mlib_check(false, because, "We should not reach this state"); abort(); case MONGOC_ASYNC_CMD_SUCCESS: case MONGOC_ASYNC_CMD_ERROR: case MONGOC_ASYNC_CMD_TIMEOUT: acmd->_event_callback(acmd, result, &acmd->_response_data, _acmd_elapsed(acmd)); // No more work on this command. Destroy the object and tell the caller // it's been removed mongoc_async_cmd_destroy(acmd); return false; default: mlib_check(false, because, "Invalid async command state"); abort(); } } static void _mongoc_async_cmd_init_send(const int32_t cmd_opcode, mongoc_async_cmd_t *acmd, const char *dbname) { BSON_ASSERT(cmd_opcode == MONGOC_OP_CODE_QUERY || cmd_opcode == MONGOC_OP_CODE_MSG); int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(acmd->rpc, 0); message_length += mcd_rpc_header_set_request_id(acmd->rpc, ++acmd->async->request_id); message_length += mcd_rpc_header_set_response_to(acmd->rpc, 0); message_length += mcd_rpc_header_set_op_code(acmd->rpc, cmd_opcode); if (cmd_opcode == MONGOC_OP_CODE_QUERY) { acmd->ns = bson_strdup_printf("%s.$cmd", dbname); message_length += mcd_rpc_op_query_set_flags(acmd->rpc, MONGOC_OP_QUERY_FLAG_SECONDARY_OK); message_length += mcd_rpc_op_query_set_full_collection_name(acmd->rpc, acmd->ns); message_length += mcd_rpc_op_query_set_number_to_skip(acmd->rpc, 0); message_length += mcd_rpc_op_query_set_number_to_return(acmd->rpc, -1); message_length += mcd_rpc_op_query_set_query(acmd->rpc, bson_get_data(&acmd->_command)); } else { mcd_rpc_op_msg_set_sections_count(acmd->rpc, 1u); message_length += mcd_rpc_op_msg_set_flag_bits(acmd->rpc, MONGOC_OP_MSG_FLAG_NONE); message_length += mcd_rpc_op_msg_section_set_kind(acmd->rpc, 0u, 0); message_length += mcd_rpc_op_msg_section_set_body(acmd->rpc, 0u, bson_get_data(&acmd->_command)); } mcd_rpc_message_set_length(acmd->rpc, message_length); /* This will always be hello, which are not allowed to be compressed */ acmd->iovec = mcd_rpc_message_to_iovecs(acmd->rpc, &acmd->niovec); BSON_ASSERT(acmd->iovec); acmd->bytes_written = 0; } void _mongoc_async_cmd_state_start(mongoc_async_cmd_t *acmd, bool is_setup_done) { if (!acmd->stream) { // No stream yet associated, so we need to initiate a new connection acmd->state = MONGOC_ASYNC_CMD_PENDING_CONNECT; } else if (acmd->_stream_setup && !is_setup_done) { // We have a stream, and a setup callback, so call that setup callback next acmd->state = MONGOC_ASYNC_CMD_STREAM_SETUP; } else { // We have a stream, and no setup required. We're ready to send immediately. acmd->state = MONGOC_ASYNC_CMD_SEND; } acmd->events = POLLOUT; } mongoc_async_cmd_t * mongoc_async_cmd_new(mongoc_async_t *async, mongoc_stream_t *stream, bool is_setup_done, struct addrinfo *dns_result, mongoc_async_cmd_connect_cb connect_cb, mlib_duration connect_delay, mongoc_async_cmd_stream_setup_cb stream_setup, void *setup_userdata, const char *dbname, const bson_t *cmd, const int32_t cmd_opcode, /* OP_QUERY or OP_MSG */ mongoc_async_cmd_event_cb event_cb, void *userdata, mlib_duration timeout) { BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(dbname); mongoc_async_cmd_t *const acmd = BSON_ALIGNED_ALLOC0(mongoc_async_cmd_t); acmd->_start_time = mlib_now(); acmd->_connect_delay_timer = mlib_expires_at(mlib_time_add(acmd->_start_time, connect_delay)); acmd->async = async; acmd->dns_result = dns_result; acmd->_timeout = timeout; acmd->stream = stream; acmd->_stream_connect = connect_cb; acmd->_stream_setup = stream_setup; acmd->_stream_setup_userdata = setup_userdata; acmd->_event_callback = event_cb; acmd->_userdata = userdata; acmd->state = MONGOC_ASYNC_CMD_PENDING_CONNECT; acmd->_response_data = (bson_t)BSON_INITIALIZER; bson_copy_to(cmd, &acmd->_command); if (MONGOC_OP_CODE_MSG == cmd_opcode) { /* If we're sending an OP_MSG, we need to add the "db" field: */ bson_append_utf8(&acmd->_command, "$db", 3, "admin", 5); } acmd->rpc = mcd_rpc_message_new(); acmd->iovec = NULL; _mongoc_buffer_init(&acmd->buffer, NULL, 0, NULL, NULL); _mongoc_async_cmd_init_send(cmd_opcode, acmd, dbname); _mongoc_async_cmd_state_start(acmd, is_setup_done); async->ncmds++; DL_APPEND(async->cmds, acmd); return acmd; } void mongoc_async_cmd_destroy(mongoc_async_cmd_t *acmd) { BSON_ASSERT(acmd); DL_DELETE(acmd->async->cmds, acmd); acmd->async->ncmds--; bson_destroy(&acmd->_command); bson_destroy(&acmd->_response_data); bson_free(acmd->iovec); _mongoc_buffer_destroy(&acmd->buffer); mcd_rpc_message_destroy(acmd->rpc); bson_free(acmd->ns); bson_free(acmd); } mongoc_async_cmd_result_t _mongoc_async_cmd_phase_connect(mongoc_async_cmd_t *acmd) { acmd->stream = acmd->_stream_connect(acmd); if (!acmd->stream) { return MONGOC_ASYNC_CMD_ERROR; } _acmd_reset_elapsed(acmd); if (acmd->_stream_setup) { // There is a setup callback that we need to call acmd->state = MONGOC_ASYNC_CMD_STREAM_SETUP; } else { // There is no setup callback, so we can send data immediately acmd->state = MONGOC_ASYNC_CMD_SEND; } return MONGOC_ASYNC_CMD_IN_PROGRESS; } static mongoc_async_cmd_result_t _mongoc_async_cmd_phase_stream_setup(mongoc_async_cmd_t *acmd) { int const retval = acmd->_stream_setup( acmd->stream, &acmd->events, acmd->_stream_setup_userdata, _acmd_deadline(acmd), &acmd->error); switch (retval) { case -1: return MONGOC_ASYNC_CMD_ERROR; case 0: break; case 1: acmd->state = MONGOC_ASYNC_CMD_SEND; acmd->events = POLLOUT; break; default: abort(); } return MONGOC_ASYNC_CMD_IN_PROGRESS; } mongoc_async_cmd_result_t _mongoc_async_cmd_phase_send(mongoc_async_cmd_t *acmd) { size_t total_bytes = 0; size_t offset; ssize_t bytes; /* if a continued write, then iovec will be set to a temporary copy */ bool used_temp_iovec = false; mongoc_iovec_t *iovec = acmd->iovec; size_t niovec = acmd->niovec; for (size_t i = 0u; i < acmd->niovec; i++) { total_bytes += acmd->iovec[i].iov_len; } if (acmd->bytes_written > 0) { BSON_ASSERT(acmd->bytes_written < total_bytes); /* if bytes have been written before, compute the offset in the next * iovec entry to be written. */ offset = acmd->bytes_written; size_t i = 0u; /* subtract the lengths of all iovec entries written so far. */ for (i = 0u; i < acmd->niovec; i++) { if (offset < acmd->iovec[i].iov_len) { break; } offset -= acmd->iovec[i].iov_len; } BSON_ASSERT(i < acmd->niovec); /* create a new iovec with the remaining data to be written. */ niovec = acmd->niovec - i; iovec = BSON_ARRAY_ALLOC(niovec, mongoc_iovec_t); memcpy(iovec, acmd->iovec + i, niovec * sizeof(mongoc_iovec_t)); iovec[0].iov_base = (char *)iovec[0].iov_base + offset; iovec[0].iov_len -= offset; used_temp_iovec = true; } mcd_rpc_message_egress(acmd->rpc); bytes = mongoc_stream_writev(acmd->stream, iovec, niovec, 0); if (used_temp_iovec) { bson_free(iovec); } if (bytes <= 0 && mongoc_stream_should_retry(acmd->stream)) { return MONGOC_ASYNC_CMD_IN_PROGRESS; } if (bytes < 0) { _mongoc_set_error(&acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to write rpc bytes."); return MONGOC_ASYNC_CMD_ERROR; } acmd->bytes_written += bytes; if (acmd->bytes_written < total_bytes) { return MONGOC_ASYNC_CMD_IN_PROGRESS; } acmd->state = MONGOC_ASYNC_CMD_RECV_LEN; acmd->bytes_to_read = 4; acmd->events = POLLIN; _acmd_reset_elapsed(acmd); return MONGOC_ASYNC_CMD_IN_PROGRESS; } mongoc_async_cmd_result_t _mongoc_async_cmd_phase_recv_len(mongoc_async_cmd_t *acmd) { ssize_t bytes = _mongoc_buffer_try_append_from_stream(&acmd->buffer, acmd->stream, acmd->bytes_to_read, 0); if (bytes <= 0 && mongoc_stream_should_retry(acmd->stream)) { return MONGOC_ASYNC_CMD_IN_PROGRESS; } if (bytes < 0) { _mongoc_set_error( &acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to receive length header from server."); return MONGOC_ASYNC_CMD_ERROR; } if (bytes == 0) { _mongoc_set_error(&acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Server closed connection."); return MONGOC_ASYNC_CMD_ERROR; } acmd->bytes_to_read = (size_t)(acmd->bytes_to_read - bytes); if (!acmd->bytes_to_read) { const uint32_t msg_len = mlib_read_u32le(acmd->buffer.data); if (msg_len < 16 || msg_len > MONGOC_DEFAULT_MAX_MSG_SIZE || msg_len < acmd->buffer.len) { _mongoc_set_error( &acmd->error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Invalid reply from server."); return MONGOC_ASYNC_CMD_ERROR; } acmd->bytes_to_read = msg_len - acmd->buffer.len; acmd->state = MONGOC_ASYNC_CMD_RECV_RPC; return _mongoc_async_cmd_phase_recv_rpc(acmd); } return MONGOC_ASYNC_CMD_IN_PROGRESS; } mongoc_async_cmd_result_t _mongoc_async_cmd_phase_recv_rpc(mongoc_async_cmd_t *acmd) { ssize_t bytes = _mongoc_buffer_try_append_from_stream(&acmd->buffer, acmd->stream, acmd->bytes_to_read, 0); if (bytes <= 0 && mongoc_stream_should_retry(acmd->stream)) { return MONGOC_ASYNC_CMD_IN_PROGRESS; } if (bytes < 0) { _mongoc_set_error( &acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to receive rpc bytes from server."); return MONGOC_ASYNC_CMD_ERROR; } if (bytes == 0) { _mongoc_set_error(&acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Server closed connection."); return MONGOC_ASYNC_CMD_ERROR; } acmd->bytes_to_read = (size_t)(acmd->bytes_to_read - bytes); if (!acmd->bytes_to_read) { mcd_rpc_message_reset(acmd->rpc); if (!mcd_rpc_message_from_data_in_place(acmd->rpc, acmd->buffer.data, acmd->buffer.len, NULL)) { _mongoc_set_error( &acmd->error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Invalid reply from server."); return MONGOC_ASYNC_CMD_ERROR; } mcd_rpc_message_ingress(acmd->rpc); void *decompressed_data; size_t decompressed_data_len; if (!mcd_rpc_message_decompress_if_necessary(acmd->rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error(&acmd->error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Could not decompress server reply"); return MONGOC_ASYNC_CMD_ERROR; } if (decompressed_data) { _mongoc_buffer_destroy(&acmd->buffer); _mongoc_buffer_init(&acmd->buffer, decompressed_data, decompressed_data_len, NULL, NULL); } if (!mcd_rpc_message_get_body(acmd->rpc, &acmd->_response_data)) { _mongoc_set_error( &acmd->error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Invalid reply from server"); return MONGOC_ASYNC_CMD_ERROR; } return MONGOC_ASYNC_CMD_SUCCESS; } return MONGOC_ASYNC_CMD_IN_PROGRESS; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-async-private.h000066400000000000000000000022321511661753600254050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_ASYNC_PRIVATE_H #define MONGOC_ASYNC_PRIVATE_H #include #include #include #include #include BSON_BEGIN_DECLS struct _mongoc_async_cmd; typedef struct _mongoc_async { struct _mongoc_async_cmd *cmds; size_t ncmds; uint32_t request_id; } mongoc_async_t; mongoc_async_t * mongoc_async_new(void); void mongoc_async_destroy(mongoc_async_t *async); void mongoc_async_run(mongoc_async_t *async); BSON_END_DECLS #endif /* MONGOC_ASYNC_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-async.c000066400000000000000000000144431511661753600237370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include mongoc_async_t * mongoc_async_new(void) { mongoc_async_t *async = (mongoc_async_t *)bson_malloc0(sizeof(*async)); return async; } void mongoc_async_destroy(mongoc_async_t *async) { mongoc_async_cmd_t *acmd, *tmp; DL_FOREACH_SAFE(async->cmds, acmd, tmp) { mongoc_async_cmd_destroy(acmd); } bson_free(async); } void mongoc_async_run(mongoc_async_t *async) { mongoc_async_cmd_t *acmd, *tmp; mongoc_async_cmd_t **acmds_polled = NULL; mongoc_stream_poll_t *poller = NULL; ssize_t nactive = 0; size_t poll_size = 0; DL_FOREACH(async->cmds, acmd) { // CDRIVER-1571: See _acmd_reset_elapsed doc comment to explain this hack _acmd_reset_elapsed(acmd); } while (async->ncmds) { /* ncmds grows if we discover a replica & start calling hello on it */ if (poll_size < async->ncmds) { poller = (mongoc_stream_poll_t *)bson_realloc(poller, sizeof(*poller) * async->ncmds); acmds_polled = (mongoc_async_cmd_t **)bson_realloc(acmds_polled, sizeof(*acmds_polled) * async->ncmds); poll_size = async->ncmds; } // Number of streams in the poller object unsigned nstreams = 0; // The timer to wake up the poll() mlib_timer poll_timer = mlib_expires_never(); /* check if any cmds are ready to be initiated. */ DL_FOREACH_SAFE(async->cmds, acmd, tmp) { if (acmd->state == MONGOC_ASYNC_CMD_PENDING_CONNECT) { // Command is waiting to be initiated. // Timer for when the command should be initiated: // Should not yet have an associated stream BSON_ASSERT(!acmd->stream); if (mlib_timer_is_expired(acmd->_connect_delay_timer)) { /* time to initiate. */ if (mongoc_async_cmd_run(acmd)) { // We should now have an associated stream BSON_ASSERT(acmd->stream); } else { /* this command was removed. */ continue; } } else { // Wake up poll() when the initiation timeout is hit poll_timer = mlib_soonest_timer(poll_timer, acmd->_connect_delay_timer); } } if (acmd->stream) { acmds_polled[nstreams] = acmd; poller[nstreams].stream = acmd->stream; poller[nstreams].events = acmd->events; poller[nstreams].revents = 0; // Wake up poll() if the object's overall timeout is hit poll_timer = mlib_soonest_timer(poll_timer, _acmd_deadline(acmd)); ++nstreams; } } if (async->ncmds == 0) { /* all cmds failed to initiate and removed themselves. */ break; } if (nstreams > 0) { /* we need at least one stream to poll. */ nactive = _mongoc_stream_poll_internal(poller, nstreams, poll_timer); } else { /* currently this does not get hit. we always have at least one command * initialized with a stream. */ mlib_sleep_until(poll_timer.expires_at); } if (nactive > 0) { mlib_foreach_urange (i, nstreams) { mongoc_async_cmd_t *const iter = acmds_polled[i]; if (poller[i].revents & (POLLERR | POLLHUP)) { int hup = poller[i].revents & POLLHUP; if (iter->state == MONGOC_ASYNC_CMD_SEND) { _mongoc_set_error(&iter->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, hup ? "connection refused" : "unknown connection error"); } else { _mongoc_set_error(&iter->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, hup ? "connection closed" : "unknown socket error"); } iter->state = MONGOC_ASYNC_CMD_ERROR_STATE; } if ((poller[i].revents & poller[i].events) || iter->state == MONGOC_ASYNC_CMD_ERROR_STATE) { (void)mongoc_async_cmd_run(iter); nactive--; } if (!nactive) { break; } } } DL_FOREACH_SAFE(async->cmds, acmd, tmp) { /* check if an initiated cmd has passed the connection timeout. */ if (acmd->state != MONGOC_ASYNC_CMD_PENDING_CONNECT && _acmd_has_timed_out(acmd)) { _mongoc_set_error(&acmd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, acmd->state == MONGOC_ASYNC_CMD_SEND ? "connection timeout" : "socket timeout"); acmd->_event_callback(acmd, MONGOC_ASYNC_CMD_TIMEOUT, NULL, _acmd_elapsed(acmd)); /* Remove acmd from the async->cmds doubly-linked list */ mongoc_async_cmd_destroy(acmd); } else if (acmd->state == MONGOC_ASYNC_CMD_CANCELLED_STATE) { acmd->_event_callback(acmd, MONGOC_ASYNC_CMD_ERROR, NULL, _acmd_elapsed(acmd)); /* Remove acmd from the async->cmds doubly-linked list */ mongoc_async_cmd_destroy(acmd); } } } bson_free(poller); bson_free(acmds_polled); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-buffer-private.h000066400000000000000000000036031511661753600255440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_BUFFER_PRIVATE_H #define MONGOC_BUFFER_PRIVATE_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_buffer_t mongoc_buffer_t; struct _mongoc_buffer_t { uint8_t *data; size_t datalen; size_t len; bson_realloc_func realloc_func; void *realloc_data; }; void _mongoc_buffer_init( mongoc_buffer_t *buffer, uint8_t *buf, size_t buflen, bson_realloc_func realloc_func, void *realloc_data); bool _mongoc_buffer_append(mongoc_buffer_t *buffer, const uint8_t *data, size_t data_size); bool _mongoc_buffer_append_from_stream( mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t size, int64_t timeout_msec, bson_error_t *error); ssize_t _mongoc_buffer_try_append_from_stream(mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t size, int64_t timeout_msec); ssize_t _mongoc_buffer_fill( mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t min_bytes, int64_t timeout_msec, bson_error_t *error); void _mongoc_buffer_destroy(mongoc_buffer_t *buffer); void _mongoc_buffer_clear(mongoc_buffer_t *buffer, bool zero); BSON_END_DECLS #endif /* MONGOC_BUFFER_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-buffer.c000066400000000000000000000211761511661753600240740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "buffer" #ifndef MONGOC_BUFFER_DEFAULT_SIZE #define MONGOC_BUFFER_DEFAULT_SIZE 1024 #endif static void make_space_for(mongoc_buffer_t *buffer, size_t data_size) { if (buffer->len + data_size > buffer->datalen) { buffer->datalen = bson_next_power_of_two(buffer->len + data_size); buffer->data = (uint8_t *)buffer->realloc_func(buffer->data, buffer->datalen, buffer->realloc_data); } } /** * _mongoc_buffer_init: * @buffer: A mongoc_buffer_t to initialize. * @buf: A data buffer to attach to @buffer. * @buflen: The size of @buflen. * @realloc_func: A function to resize @buf. * * Initializes @buffer for use. If additional space is needed by @buffer, then * @realloc_func will be called to resize @buf. * * @buffer takes ownership of @buf and will realloc it to zero bytes when * cleaning up the data structure. */ void _mongoc_buffer_init( mongoc_buffer_t *buffer, uint8_t *buf, size_t buflen, bson_realloc_func realloc_func, void *realloc_data) { BSON_ASSERT_PARAM(buffer); BSON_ASSERT(buflen || !buf); if (!realloc_func) { realloc_func = bson_realloc_ctx; } if (!buflen) { buflen = MONGOC_BUFFER_DEFAULT_SIZE; } if (!buf) { buf = (uint8_t *)realloc_func(NULL, buflen, NULL); } memset(buffer, 0, sizeof *buffer); buffer->data = buf; buffer->datalen = buflen; buffer->len = 0; buffer->realloc_func = realloc_func; buffer->realloc_data = realloc_data; } /** * _mongoc_buffer_destroy: * @buffer: A mongoc_buffer_t. * * Cleanup after @buffer and release any allocated resources. */ void _mongoc_buffer_destroy(mongoc_buffer_t *buffer) { BSON_ASSERT_PARAM(buffer); if (buffer->data && buffer->realloc_func) { buffer->realloc_func(buffer->data, 0, buffer->realloc_data); } memset(buffer, 0, sizeof *buffer); } /** * _mongoc_buffer_clear: * @buffer: A mongoc_buffer_t. * @zero: If the memory should be zeroed. * * Clears a buffers contents and resets it to initial state. You can request * that the memory is zeroed, which might be useful if you know the contents * contain security related information. */ void _mongoc_buffer_clear(mongoc_buffer_t *buffer, bool zero) { BSON_ASSERT_PARAM(buffer); if (zero) { memset(buffer->data, 0, buffer->datalen); } buffer->len = 0; } bool _mongoc_buffer_append(mongoc_buffer_t *buffer, const uint8_t *data, size_t data_size) { uint8_t *buf; ENTRY; BSON_ASSERT_PARAM(buffer); BSON_ASSERT(data_size); BSON_ASSERT(buffer->datalen); make_space_for(buffer, data_size); buf = &buffer->data[buffer->len]; BSON_ASSERT((buffer->len + data_size) <= buffer->datalen); memcpy(buf, data, data_size); buffer->len += data_size; RETURN(true); } /** * mongoc_buffer_append_from_stream: * @buffer; A mongoc_buffer_t. * @stream: The stream to read from. * @size: The number of bytes to read. * @timeout_msec: The number of milliseconds to wait or -1 for the default * @error: A location for a bson_error_t, or NULL. * * Reads from stream @size bytes and stores them in @buffer. This can be used * in conjunction with reading RPCs from a stream. You read from the stream * into this buffer and then scatter the buffer into the RPC. * * Returns: true if successful; otherwise false and @error is set. */ bool _mongoc_buffer_append_from_stream( mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t size, int64_t timeout_msec, bson_error_t *error) { uint8_t *buf; ssize_t ret; ENTRY; BSON_ASSERT_PARAM(buffer); BSON_ASSERT_PARAM(stream); BSON_ASSERT(size); BSON_ASSERT(buffer->datalen); make_space_for(buffer, size); buf = &buffer->data[buffer->len]; BSON_ASSERT((buffer->len + size) <= buffer->datalen); if (BSON_UNLIKELY(!mlib_in_range(int32_t, timeout_msec))) { // CDRIVER-4589 _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "timeout_msec value %" PRId64 " exceeds supported 32-bit range", timeout_msec); RETURN(false); } ret = mongoc_stream_read(stream, buf, size, size, (int32_t)timeout_msec); if (mlib_cmp(ret, !=, size)) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to read %zu bytes: socket error or timeout", size); RETURN(false); } buffer->len += (size_t)ret; RETURN(true); } /** * _mongoc_buffer_fill: * @buffer: A mongoc_buffer_t. * @stream: A stream to read from. * @min_bytes: The minimum number of bytes to read. * @error: A location for a bson_error_t or NULL. * * Attempts to fill the entire buffer, or at least @min_bytes. * * Returns: The number of buffered bytes, or -1 on failure. */ ssize_t _mongoc_buffer_fill( mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t min_bytes, int64_t timeout_msec, bson_error_t *error) { ssize_t ret; size_t avail_bytes; ENTRY; BSON_ASSERT_PARAM(buffer); BSON_ASSERT_PARAM(stream); BSON_ASSERT(buffer->data); BSON_ASSERT(buffer->datalen); if (min_bytes <= buffer->len) { BSON_ASSERT(mlib_in_range(ssize_t, buffer->len)); RETURN((ssize_t)buffer->len); } min_bytes -= buffer->len; make_space_for(buffer, min_bytes); avail_bytes = buffer->datalen - buffer->len; if (BSON_UNLIKELY(!mlib_in_range(int32_t, timeout_msec))) { // CDRIVER-4589 _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "timeout_msec value %" PRId64 " exceeds supported 32-bit range", timeout_msec); RETURN(false); } ret = mongoc_stream_read(stream, &buffer->data[buffer->len], avail_bytes, min_bytes, (int32_t)timeout_msec); if (ret < 0) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to buffer %zu bytes", min_bytes); RETURN(-1); } buffer->len += (size_t)ret; if (buffer->len < min_bytes) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Could only buffer %zu of %zu bytes", buffer->len, min_bytes); RETURN(-1); } BSON_ASSERT(mlib_in_range(ssize_t, buffer->len)); RETURN((ssize_t)buffer->len); } /** * mongoc_buffer_try_append_from_stream: * @buffer; A mongoc_buffer_t. * @stream: The stream to read from. * @size: The number of bytes to read. * @timeout_msec: The number of milliseconds to wait or -1 for the default * * Reads from stream @size bytes and stores them in @buffer. This can be used * in conjunction with reading RPCs from a stream. You read from the stream * into this buffer and then scatter the buffer into the RPC. * * Returns: bytes read if successful; otherwise 0 or -1. */ ssize_t _mongoc_buffer_try_append_from_stream(mongoc_buffer_t *buffer, mongoc_stream_t *stream, size_t size, int64_t timeout_msec) { uint8_t *buf; ssize_t ret; ENTRY; BSON_ASSERT_PARAM(buffer); BSON_ASSERT_PARAM(stream); BSON_ASSERT(size); BSON_ASSERT(buffer->datalen); make_space_for(buffer, size); buf = &buffer->data[buffer->len]; BSON_ASSERT((buffer->len + size) <= buffer->datalen); if (BSON_UNLIKELY(!mlib_in_range(int32_t, timeout_msec))) { // CDRIVER-4589 MONGOC_ERROR("timeout_msec value %" PRId64 " exceeds supported 32-bit range", timeout_msec); RETURN(-1); } ret = mongoc_stream_read(stream, buf, size, 0, (int32_t)timeout_msec); if (ret > 0) { buffer->len += (size_t)ret; } RETURN(ret); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-bulk-operation-private.h000066400000000000000000000032441511661753600272270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_BULK_OPERATION_PRIVATE_H #define MONGOC_BULK_OPERATION_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS struct _mongoc_bulk_operation_t { char *database; char *collection; mongoc_client_t *client; mongoc_client_session_t *session; mongoc_write_concern_t *write_concern; mongoc_bulk_write_flags_t flags; bson_value_t comment; bson_t let; uint32_t server_id; mongoc_array_t commands; mongoc_write_result_t result; bool executed; int64_t operation_id; }; mongoc_bulk_operation_t * _mongoc_bulk_operation_new(mongoc_client_t *client, const char *database, const char *collection, mongoc_bulk_write_flags_t flags, const mongoc_write_concern_t *write_concern); BSON_END_DECLS #endif /* MONGOC_BULK_OPERATION_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-bulk-operation.c000066400000000000000000000723371511661753600255630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include /* * This is the implementation of both write commands and bulk write commands. * They are all implemented as one contiguous set since we'd like to cut down * on code duplication here. * * This implementation is currently naive. * * Some interesting optimizations might be: * * - If unordered mode, send operations as we get them instead of waiting * for execute() to be called. This could save us memcpy()'s too. * - If there is no acknowledgement desired, keep a count of how many * replies we need and ask the socket layer to skip that many bytes * when reading. * - Try to use iovec to send write commands with subdocuments rather than * copying them into the write command document. */ mongoc_bulk_operation_t * mongoc_bulk_operation_new(bool ordered) { mongoc_bulk_operation_t *bulk; bulk = BSON_ALIGNED_ALLOC0(mongoc_bulk_operation_t); bulk->flags.bypass_document_validation = false; bulk->flags.ordered = ordered; bulk->server_id = 0; bson_init(&bulk->let); mongoc_array_aligned_init(&bulk->commands, mongoc_write_command_t); _mongoc_write_result_init(&bulk->result); return bulk; } mongoc_bulk_operation_t * _mongoc_bulk_operation_new(mongoc_client_t *client, /* IN */ const char *database, /* IN */ const char *collection, /* IN */ mongoc_bulk_write_flags_t flags, /* IN */ const mongoc_write_concern_t *write_concern) /* IN */ { mongoc_bulk_operation_t *bulk; BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(collection); bulk = mongoc_bulk_operation_new(flags.ordered); bulk->client = client; bulk->database = bson_strdup(database); bulk->collection = bson_strdup(collection); bulk->write_concern = mongoc_write_concern_copy(write_concern); bulk->executed = false; bulk->flags = flags; bulk->operation_id = ++client->cluster.operation_id; return bulk; } void mongoc_bulk_operation_destroy(mongoc_bulk_operation_t *bulk) /* IN */ { mongoc_write_command_t *command; if (bulk) { for (size_t i = 0; i < bulk->commands.len; i++) { command = &_mongoc_array_index(&bulk->commands, mongoc_write_command_t, i); _mongoc_write_command_destroy(command); } bson_free(bulk->database); bson_free(bulk->collection); bson_value_destroy(&bulk->comment); bson_destroy(&bulk->let); mongoc_write_concern_destroy(bulk->write_concern); _mongoc_array_destroy(&bulk->commands); _mongoc_write_result_destroy(&bulk->result); bson_free(bulk); } } /* already failed, e.g. a bad call to mongoc_bulk_operation_insert? */ #define BULK_EXIT_IF_PRIOR_ERROR \ do { \ if (bulk->result.error.domain) { \ EXIT; \ } \ } while (0) #define BULK_RETURN_IF_PRIOR_ERROR \ do { \ if (bulk->result.error.domain) { \ if (error != &bulk->result.error) { \ _mongoc_set_error(error, \ MONGOC_ERROR_COMMAND, \ MONGOC_ERROR_COMMAND_INVALID_ARG, \ "Bulk operation is invalid from prior error: %s", \ bulk->result.error.message); \ }; \ return false; \ }; \ } while (0) static bool _mongoc_bulk_operation_remove_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const mongoc_bulk_remove_opts_t *remove_opts, int32_t limit, bson_error_t *error) /* OUT */ { mongoc_write_command_t command = {0}; mongoc_write_command_t *last; bson_t cmd_opts = BSON_INITIALIZER; bson_t opts; bool has_collation; bool ret = false; bool has_delete_hint; ENTRY; BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(selector); bson_init(&opts); /* allow "limit" in opts, but it must be the correct limit */ if (remove_opts->limit != limit) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid \"limit\" in opts: %" PRId32 "." " The value must be %" PRId32 ", or omitted.", remove_opts->limit, limit); GOTO(done); } bson_append_int32(&opts, "limit", 5, limit); has_collation = !bson_empty(&remove_opts->collation); if (has_collation) { bson_append_document(&opts, "collation", 9, &remove_opts->collation); } has_delete_hint = !!(remove_opts->hint.value_type); if (has_delete_hint) { bson_append_value(&opts, "hint", 4, &remove_opts->hint); } if (bulk->commands.len) { last = &_mongoc_array_index(&bulk->commands, mongoc_write_command_t, bulk->commands.len - 1); if (last->type == MONGOC_WRITE_COMMAND_DELETE) { last->flags.has_collation |= has_collation; last->flags.has_delete_hint |= has_delete_hint; last->flags.has_multi_write |= (remove_opts->limit == 0); _mongoc_write_command_delete_append(last, selector, &opts); ret = true; GOTO(done); } } if (bulk->comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &bulk->comment); } if (!bson_empty(&bulk->let)) { bson_append_document(&cmd_opts, "let", 3, &bulk->let); } _mongoc_write_command_init_delete(&command, selector, &cmd_opts, &opts, bulk->flags, bulk->operation_id); command.flags.has_collation = has_collation; command.flags.has_delete_hint = has_delete_hint; command.flags.has_multi_write = (remove_opts->limit == 0); _mongoc_array_append_val(&bulk->commands, command); ret = true; done: bson_destroy(&cmd_opts); bson_destroy(&opts); RETURN(ret); } bool mongoc_bulk_operation_remove_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error) /* OUT */ { mongoc_bulk_remove_one_opts_t remove_opts; bool ret; ENTRY; BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_remove_one_opts_parse(bulk->client, opts, &remove_opts, error)) { _mongoc_bulk_remove_one_opts_cleanup(&remove_opts); RETURN(false); } ret = _mongoc_bulk_operation_remove_with_opts(bulk, selector, &remove_opts.remove, 1, error); _mongoc_bulk_remove_one_opts_cleanup(&remove_opts); RETURN(ret); } bool mongoc_bulk_operation_remove_many_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error) /* OUT */ { mongoc_bulk_remove_many_opts_t remove_opts; bool ret; ENTRY; BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_remove_many_opts_parse(bulk->client, opts, &remove_opts, error)) { _mongoc_bulk_remove_many_opts_cleanup(&remove_opts); RETURN(false); } ret = _mongoc_bulk_operation_remove_with_opts(bulk, selector, &remove_opts.remove, 0, error); _mongoc_bulk_remove_many_opts_cleanup(&remove_opts); RETURN(ret); } void mongoc_bulk_operation_remove(mongoc_bulk_operation_t *bulk, /* IN */ const bson_t *selector) /* IN */ { bson_error_t *error = &bulk->result.error; ENTRY; BULK_EXIT_IF_PRIOR_ERROR; if (!mongoc_bulk_operation_remove_many_with_opts(bulk, selector, NULL, error)) { MONGOC_WARNING("%s", error->message); } if (error->domain) { MONGOC_WARNING("%s", error->message); } EXIT; } void mongoc_bulk_operation_remove_one(mongoc_bulk_operation_t *bulk, /* IN */ const bson_t *selector) /* IN */ { bson_error_t *error = &bulk->result.error; ENTRY; BULK_EXIT_IF_PRIOR_ERROR; if (!mongoc_bulk_operation_remove_one_with_opts(bulk, selector, NULL, error)) { MONGOC_WARNING("%s", error->message); } if (error->domain) { MONGOC_WARNING("%s", error->message); } EXIT; } void mongoc_bulk_operation_insert(mongoc_bulk_operation_t *bulk, const bson_t *document) { ENTRY; BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(document); if (!mongoc_bulk_operation_insert_with_opts(bulk, document, NULL /* opts */, &bulk->result.error)) { MONGOC_WARNING("%s", bulk->result.error.message); } EXIT; } bool mongoc_bulk_operation_insert_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *document, const bson_t *opts, bson_error_t *error) { mongoc_bulk_insert_opts_t insert_opts; mongoc_write_command_t command = {0}; mongoc_write_command_t *last; bson_t cmd_opts = BSON_INITIALIZER; bool ret = false; ENTRY; BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(document); BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_insert_opts_parse(bulk->client, opts, &insert_opts, error)) { GOTO(done); } if (!_mongoc_validate_new_document(document, insert_opts.validate, error)) { GOTO(done); } /* Note: mongoc_bulk_insert_opts_t specifies allow_extra=False, so there is * no reason to concatenate cmd_opts with &insert_opts.extra. */ if (bulk->commands.len) { last = &_mongoc_array_index(&bulk->commands, mongoc_write_command_t, bulk->commands.len - 1); if (last->type == MONGOC_WRITE_COMMAND_INSERT) { _mongoc_write_command_insert_append(last, document); ret = true; GOTO(done); } } if (bulk->comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &bulk->comment); } _mongoc_write_command_init_insert(&command, document, &cmd_opts, bulk->flags, bulk->operation_id); _mongoc_array_append_val(&bulk->commands, command); ret = true; done: _mongoc_bulk_insert_opts_cleanup(&insert_opts); bson_destroy(&cmd_opts); RETURN(ret); } static void _mongoc_bulk_operation_update_append(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const mongoc_bulk_update_opts_t *update_opts, const bson_t *array_filters, const bson_t *extra_opts, const bson_t *sort) { mongoc_write_command_t command = {0}; mongoc_write_command_t *last; bson_t cmd_opts = BSON_INITIALIZER; bson_t opts; bool has_collation; bool has_array_filters; bool has_update_hint; bson_init(&opts); bson_append_bool(&opts, "upsert", 6, update_opts->upsert); bson_append_bool(&opts, "multi", 5, update_opts->multi); has_array_filters = !bson_empty0(array_filters); if (has_array_filters) { bson_append_array(&opts, "arrayFilters", 12, array_filters); } has_collation = !bson_empty(&update_opts->collation); if (has_collation) { bson_append_document(&opts, "collation", 9, &update_opts->collation); } has_update_hint = !!(update_opts->hint.value_type); if (has_update_hint) { bson_append_value(&opts, "hint", 4, &update_opts->hint); } if (!bson_empty0(sort)) { bson_append_document(&opts, "sort", 4, sort); } if (extra_opts) { bson_concat(&opts, extra_opts); } if (bulk->commands.len) { last = &_mongoc_array_index(&bulk->commands, mongoc_write_command_t, bulk->commands.len - 1); if (last->type == MONGOC_WRITE_COMMAND_UPDATE) { last->flags.has_array_filters |= has_array_filters; last->flags.has_collation |= has_collation; last->flags.has_update_hint |= has_update_hint; last->flags.has_multi_write |= update_opts->multi; _mongoc_write_command_update_append(last, selector, document, &opts); GOTO(done); } } if (bulk->comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &bulk->comment); } if (!bson_empty(&bulk->let)) { bson_append_document(&cmd_opts, "let", 3, &bulk->let); } _mongoc_write_command_init_update(&command, selector, document, &cmd_opts, &opts, bulk->flags, bulk->operation_id); command.flags.has_array_filters = has_array_filters; command.flags.has_collation = has_collation; command.flags.has_update_hint = has_update_hint; command.flags.has_multi_write = update_opts->multi; _mongoc_array_append_val(&bulk->commands, command); done: bson_destroy(&cmd_opts); bson_destroy(&opts); } static bool _mongoc_bulk_operation_update_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const mongoc_bulk_update_opts_t *update_opts, const bson_t *array_filters, const bson_t *extra_opts, bool multi, const bson_t *sort, bson_error_t *error) /* OUT */ { ENTRY; BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(selector); BSON_ASSERT_PARAM(document); if (!_mongoc_validate_update(document, update_opts->validate, error)) { RETURN(false); } /* allow "multi" in opts, but it must be the correct multi */ if (update_opts->multi != multi) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid \"multi\" in opts: %s." " The value must be %s, or omitted.", update_opts->multi ? "true" : "false", multi ? "true" : "false"); RETURN(false); } _mongoc_bulk_operation_update_append(bulk, selector, document, update_opts, array_filters, extra_opts, sort); RETURN(true); } bool mongoc_bulk_operation_update_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error) /* OUT */ { mongoc_bulk_update_one_opts_t update_opts; bool ret; ENTRY; BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_update_one_opts_parse(bulk->client, opts, &update_opts, error)) { _mongoc_bulk_update_one_opts_cleanup(&update_opts); RETURN(false); } ret = _mongoc_bulk_operation_update_with_opts(bulk, selector, document, &update_opts.update, &update_opts.arrayFilters, &update_opts.extra, false /* multi */, &update_opts.sort, error); _mongoc_bulk_update_one_opts_cleanup(&update_opts); RETURN(ret); } bool mongoc_bulk_operation_update_many_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error) /* OUT */ { mongoc_bulk_update_many_opts_t update_opts; bool ret; ENTRY; BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_update_many_opts_parse(bulk->client, opts, &update_opts, error)) { _mongoc_bulk_update_many_opts_cleanup(&update_opts); RETURN(false); } ret = _mongoc_bulk_operation_update_with_opts(bulk, selector, document, &update_opts.update, &update_opts.arrayFilters, &update_opts.extra, true /* multi */, NULL /* sort */, error); _mongoc_bulk_update_many_opts_cleanup(&update_opts); RETURN(ret); } void mongoc_bulk_operation_update(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert) { bson_t opts; bson_error_t *error = &bulk->result.error; ENTRY; BULK_EXIT_IF_PRIOR_ERROR; bson_init(&opts); if (upsert) { BSON_APPEND_BOOL(&opts, "upsert", upsert); } if (!mongoc_bulk_operation_update_many_with_opts(bulk, selector, document, &opts, error)) { MONGOC_WARNING("%s", error->message); } bson_destroy(&opts); if (error->domain) { MONGOC_WARNING("%s", error->message); } EXIT; } void mongoc_bulk_operation_update_one(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert) { bson_t opts; bson_error_t *error = &bulk->result.error; ENTRY; BULK_EXIT_IF_PRIOR_ERROR; bson_init(&opts); BSON_APPEND_BOOL(&opts, "upsert", upsert); if (!mongoc_bulk_operation_update_one_with_opts(bulk, selector, document, &opts, error)) { MONGOC_WARNING("%s", error->message); } bson_destroy(&opts); if (error->domain) { MONGOC_WARNING("%s", error->message); } EXIT; } bool mongoc_bulk_operation_replace_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error) /* OUT */ { mongoc_bulk_replace_one_opts_t repl_opts; mongoc_bulk_update_opts_t *update_opts = &repl_opts.update; bool ret = false; ENTRY; BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(selector); BSON_ASSERT_PARAM(document); BULK_RETURN_IF_PRIOR_ERROR; if (!_mongoc_bulk_replace_one_opts_parse(bulk->client, opts, &repl_opts, error)) { GOTO(done); } if (!_mongoc_validate_replace(document, update_opts->validate, error)) { GOTO(done); } /* allow "multi" in opts, but it must be the correct multi */ if (update_opts->multi) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid \"multi\": true in opts for" " mongoc_bulk_operation_replace_one_with_opts." " The value must be true, or omitted."); GOTO(done); } _mongoc_bulk_operation_update_append(bulk, selector, document, update_opts, NULL, &repl_opts.extra, &repl_opts.sort); ret = true; done: _mongoc_bulk_replace_one_opts_cleanup(&repl_opts); RETURN(ret); } void mongoc_bulk_operation_replace_one(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert) { bson_t opts = BSON_INITIALIZER; bson_error_t *error = &bulk->result.error; ENTRY; BSON_APPEND_BOOL(&opts, "upsert", upsert); if (!mongoc_bulk_operation_replace_one_with_opts(bulk, selector, document, &opts, error)) { MONGOC_WARNING("%s", error->message); } bson_destroy(&opts); EXIT; } uint32_t mongoc_bulk_operation_execute(mongoc_bulk_operation_t *bulk, /* IN */ bson_t *reply, /* OUT */ bson_error_t *error) /* OUT */ { mongoc_cluster_t *cluster; mongoc_write_command_t *command; mongoc_server_stream_t *server_stream; bool ret; uint32_t offset = 0; ENTRY; BSON_ASSERT_PARAM(bulk); if (!bulk->client) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "mongoc_bulk_operation_execute() requires a client " "and one has not been set."); GOTO(err); } cluster = &bulk->client->cluster; if (bulk->executed) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); GOTO(err); } bulk->executed = true; if (!bulk->database) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "mongoc_bulk_operation_execute() requires a database " "and one has not been set."); GOTO(err); } else if (!bulk->collection) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "mongoc_bulk_operation_execute() requires a collection " "and one has not been set."); GOTO(err); } /* error stored by functions like mongoc_bulk_operation_insert that * can't report errors immediately */ if (bulk->result.error.domain) { if (error) { memcpy(error, &bulk->result.error, sizeof(bson_error_t)); } GOTO(err); } if (!bulk->commands.len) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot do an empty bulk write"); GOTO(err); } for (size_t i = 0u; i < bulk->commands.len; i++) { command = &_mongoc_array_index(&bulk->commands, mongoc_write_command_t, i); if (bulk->server_id) { server_stream = mongoc_cluster_stream_for_server( cluster, bulk->server_id, true /* reconnect_ok */, bulk->session, reply, error); } else { const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(command), .has_operation_id = true, .operation_id = command->operation_id}; server_stream = mongoc_cluster_stream_for_writes(cluster, &ss_log_context, bulk->session, NULL, reply, error); } if (!server_stream) { /* stream_for_server and stream_for_writes initialize reply on error */ RETURN(false); } _mongoc_write_command_execute(command, bulk->client, server_stream, bulk->database, bulk->collection, bulk->write_concern, offset, bulk->session, &bulk->result); bulk->server_id = server_stream->sd->id; /* If a retryable error occurred and a new primary was selected, use it in * subsequent commands. */ if (bulk->result.retry_server_id) { bulk->server_id = bulk->result.retry_server_id; } if (bulk->result.failed && (bulk->flags.ordered || bulk->result.must_stop)) { mongoc_server_stream_cleanup(server_stream); GOTO(cleanup); } offset += command->n_documents; mongoc_server_stream_cleanup(server_stream); } cleanup: _mongoc_bson_init_if_set(reply); ret = MONGOC_WRITE_RESULT_COMPLETE(&bulk->result, bulk->client->error_api_version, bulk->write_concern, MONGOC_ERROR_COMMAND /* err domain */, reply, error); RETURN(ret ? bulk->server_id : 0); err: _mongoc_bson_init_if_set(reply); RETURN(false); } void mongoc_bulk_operation_set_write_concern(mongoc_bulk_operation_t *bulk, const mongoc_write_concern_t *write_concern) { BSON_ASSERT_PARAM(bulk); if (bulk->write_concern) { mongoc_write_concern_destroy(bulk->write_concern); } if (write_concern) { bulk->write_concern = mongoc_write_concern_copy(write_concern); } else { bulk->write_concern = mongoc_write_concern_new(); } } const mongoc_write_concern_t * mongoc_bulk_operation_get_write_concern(const mongoc_bulk_operation_t *bulk) { BSON_ASSERT_PARAM(bulk); return bulk->write_concern; } void mongoc_bulk_operation_set_database(mongoc_bulk_operation_t *bulk, const char *database) { BSON_ASSERT_PARAM(bulk); if (bulk->database) { bson_free(bulk->database); } bulk->database = bson_strdup(database); } void mongoc_bulk_operation_set_collection(mongoc_bulk_operation_t *bulk, const char *collection) { BSON_ASSERT_PARAM(bulk); if (bulk->collection) { bson_free(bulk->collection); } bulk->collection = bson_strdup(collection); } void mongoc_bulk_operation_set_client(mongoc_bulk_operation_t *bulk, void *client) { BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(client); if (bulk->session) { BSON_ASSERT(bulk->session->client == client); } /* NOP if the client is not changing; otherwise, assign it and increment and * fetch its operation_id. */ if ((void *)bulk->client == client) { return; } bulk->client = (mongoc_client_t *)client; bulk->operation_id = ++bulk->client->cluster.operation_id; } void mongoc_bulk_operation_set_client_session(mongoc_bulk_operation_t *bulk, struct _mongoc_client_session_t *client_session) { BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(client_session); if (bulk->client) { BSON_ASSERT(bulk->client == client_session->client); } bulk->session = client_session; } uint32_t mongoc_bulk_operation_get_server_id(const mongoc_bulk_operation_t *bulk) { BSON_ASSERT_PARAM(bulk); return bulk->server_id; } void mongoc_bulk_operation_set_server_id(mongoc_bulk_operation_t *bulk, uint32_t server_id) { BSON_ASSERT_PARAM(bulk); bulk->server_id = server_id; } void mongoc_bulk_operation_set_bypass_document_validation(mongoc_bulk_operation_t *bulk, bool bypass) { BSON_ASSERT_PARAM(bulk); bulk->flags.bypass_document_validation = bypass; } void mongoc_bulk_operation_set_comment(mongoc_bulk_operation_t *bulk, const bson_value_t *comment) { BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(comment); BSON_ASSERT(comment->value_type != BSON_TYPE_EOD); /* This method cannot be called after appending operations, as the CRUD spec * states the option should apply to all commands. Since commands are * initialized as operations are added, allowing "comment" to be changed at * any time could violate that contract. */ BSON_ASSERT(bulk->commands.len == 0); bson_value_destroy(&bulk->comment); bson_value_copy(comment, &bulk->comment); } void mongoc_bulk_operation_set_let(mongoc_bulk_operation_t *bulk, const bson_t *let) { BSON_ASSERT_PARAM(bulk); BSON_ASSERT_PARAM(let); /* This method cannot be called after appending operations, as the CRUD spec * states the option should apply to all commands (excluding insert). Since * commands are initialized as operations are added, allowing "let" to be * changed at any time could violate that contract. */ BSON_ASSERT(bulk->commands.len == 0); bson_destroy(&bulk->let); bson_copy_to(let, &bulk->let); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-bulk-operation.h000066400000000000000000000136261511661753600255640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_BULK_OPERATION_H #define MONGOC_BULK_OPERATION_H #include #include #include /* ordered, bypass_document_validation, has_collation, multi */ #define MONGOC_BULK_WRITE_FLAGS_INIT {true, false, 0} BSON_BEGIN_DECLS /* forward decl */ struct _mongoc_client_session_t; typedef struct _mongoc_bulk_operation_t mongoc_bulk_operation_t; typedef struct _mongoc_bulk_write_flags_t mongoc_bulk_write_flags_t; MONGOC_EXPORT(void) mongoc_bulk_operation_destroy(mongoc_bulk_operation_t *bulk); MONGOC_EXPORT(uint32_t) mongoc_bulk_operation_execute(mongoc_bulk_operation_t *bulk, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(void) mongoc_bulk_operation_insert(mongoc_bulk_operation_t *bulk, const bson_t *document); MONGOC_EXPORT(bool) mongoc_bulk_operation_insert_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_remove(mongoc_bulk_operation_t *bulk, const bson_t *selector); MONGOC_EXPORT(bool) mongoc_bulk_operation_remove_many_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_remove_one(mongoc_bulk_operation_t *bulk, const bson_t *selector); MONGOC_EXPORT(bool) mongoc_bulk_operation_remove_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_replace_one(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); MONGOC_EXPORT(bool) mongoc_bulk_operation_replace_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_update(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); MONGOC_EXPORT(bool) mongoc_bulk_operation_update_many_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_update_one(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); MONGOC_EXPORT(bool) mongoc_bulk_operation_update_one_with_opts(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); /* OUT */ MONGOC_EXPORT(void) mongoc_bulk_operation_set_bypass_document_validation(mongoc_bulk_operation_t *bulk, bool bypass); MONGOC_EXPORT(void) mongoc_bulk_operation_set_comment(mongoc_bulk_operation_t *bulk, const bson_value_t *comment); MONGOC_EXPORT(void) mongoc_bulk_operation_set_let(mongoc_bulk_operation_t *bulk, const bson_t *let); /* * The following functions are really only useful by language bindings and * those wanting to replay a bulk operation to a number of clients or * collections. */ MONGOC_EXPORT(mongoc_bulk_operation_t *) mongoc_bulk_operation_new(bool ordered) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_bulk_operation_set_write_concern(mongoc_bulk_operation_t *bulk, const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_bulk_operation_set_database(mongoc_bulk_operation_t *bulk, const char *database); MONGOC_EXPORT(void) mongoc_bulk_operation_set_collection(mongoc_bulk_operation_t *bulk, const char *collection); MONGOC_EXPORT(void) mongoc_bulk_operation_set_client(mongoc_bulk_operation_t *bulk, void *client); MONGOC_EXPORT(void) mongoc_bulk_operation_set_client_session(mongoc_bulk_operation_t *bulk, struct _mongoc_client_session_t *client_session); MONGOC_EXPORT(void) mongoc_bulk_operation_set_server_id(mongoc_bulk_operation_t *bulk, uint32_t server_id); MONGOC_EXPORT(uint32_t) mongoc_bulk_operation_get_server_id(const mongoc_bulk_operation_t *bulk); MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_bulk_operation_get_write_concern(const mongoc_bulk_operation_t *bulk); BSON_END_DECLS #endif /* MONGOC_BULK_OPERATION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-bulkwrite.c000066400000000000000000002044741511661753600246370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include // MC_ENABLE_CONVERSION_WARNING_BEGIN #include #include #include #include #include #include #include // _mongoc_iter_document_as_bson #include #include #include #include #include MC_ENABLE_CONVERSION_WARNING_BEGIN struct _mongoc_bulkwriteopts_t { mongoc_optional_t ordered; mongoc_optional_t bypassdocumentvalidation; bson_t *let; mongoc_write_concern_t *writeconcern; mongoc_optional_t verboseresults; bson_value_t comment; bson_t *extra; uint32_t serverid; }; // `set_bson_opt` sets `*dst` by copying `src`. If `src` is NULL, `dst` is cleared. static void set_bson_opt(bson_t **dst, const bson_t *src) { BSON_ASSERT_PARAM(dst); bson_destroy(*dst); *dst = NULL; if (src) { *dst = bson_copy(src); } } static void set_bson_value_opt(bson_value_t *dst, const bson_value_t *src) { BSON_ASSERT_PARAM(dst); bson_value_destroy(dst); *dst = (bson_value_t){0}; if (src) { bson_value_copy(src, dst); } } mongoc_bulkwriteopts_t * mongoc_bulkwriteopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwriteopts_t)); } void mongoc_bulkwriteopts_set_ordered(mongoc_bulkwriteopts_t *self, bool ordered) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->ordered, ordered); } void mongoc_bulkwriteopts_set_bypassdocumentvalidation(mongoc_bulkwriteopts_t *self, bool bypassdocumentvalidation) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->bypassdocumentvalidation, bypassdocumentvalidation); } void mongoc_bulkwriteopts_set_let(mongoc_bulkwriteopts_t *self, const bson_t *let) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(let); set_bson_opt(&self->let, let); } void mongoc_bulkwriteopts_set_writeconcern(mongoc_bulkwriteopts_t *self, const mongoc_write_concern_t *writeconcern) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(writeconcern); mongoc_write_concern_destroy(self->writeconcern); self->writeconcern = mongoc_write_concern_copy(writeconcern); } void mongoc_bulkwriteopts_set_verboseresults(mongoc_bulkwriteopts_t *self, bool verboseresults) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->verboseresults, verboseresults); } void mongoc_bulkwriteopts_set_comment(mongoc_bulkwriteopts_t *self, const bson_value_t *comment) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(comment); set_bson_value_opt(&self->comment, comment); } void mongoc_bulkwriteopts_set_extra(mongoc_bulkwriteopts_t *self, const bson_t *extra) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(extra); set_bson_opt(&self->extra, extra); } void mongoc_bulkwriteopts_set_serverid(mongoc_bulkwriteopts_t *self, uint32_t serverid) { BSON_ASSERT_PARAM(self); self->serverid = serverid; } void mongoc_bulkwriteopts_destroy(mongoc_bulkwriteopts_t *self) { if (!self) { return; } bson_destroy(self->extra); bson_value_destroy(&self->comment); mongoc_write_concern_destroy(self->writeconcern); bson_destroy(self->let); bson_free(self); } typedef enum { MODEL_OP_INSERT, MODEL_OP_UPDATE, MODEL_OP_DELETE } model_op_t; typedef struct { model_op_t op; // `id_loc` locates the "_id" field of an insert document. struct { size_t op_start; // Offset in `mongoc_bulkwrite_t::ops` to the BSON for the insert op: { "document": ... } size_t op_len; // Length of insert op. uint32_t id_offset; // Offset in the insert op to the "_id" field. } id_loc; char *ns; } modeldata_t; struct _mongoc_bulkwrite_t { mongoc_client_t *client; // `executed` is set to true once `mongoc_bulkwrite_execute` is called. // `mongoc_bulkwrite_t` may not be executed more than once. bool executed; // `serverid` is set in `mongoc_bulkwrite_execute` to identify the last used serverid. For acknowledged writes, this // will be the same as `mongoc_bulkwriteresult_serverid`. struct { bool is_set; uint32_t value; } serverid; // `is_acknowledged` is set in `mongoc_bulkwrite_execute` based on the chosen write concern. mongoc_optional_t is_acknowledged; // `ops` is a document sequence. mongoc_buffer_t ops; size_t n_ops; // `arrayof_modeldata` is an array of `modeldata_t` sized to the number of models. It stores per-model data. mongoc_array_t arrayof_modeldata; // `max_insert_len` tracks the maximum length of any document to-be inserted. uint32_t max_insert_len; // `has_multi_write` is true if there are any multi-document update or delete operations. Multi-document // writes are ineligible for retryable writes. bool has_multi_write; int64_t operation_id; mongoc_client_session_t *session; }; // `mongoc_client_bulkwrite_new` creates a new bulk write operation. mongoc_bulkwrite_t * mongoc_client_bulkwrite_new(mongoc_client_t *self) { BSON_ASSERT_PARAM(self); mongoc_bulkwrite_t *bw = mongoc_bulkwrite_new(); bw->client = self; bw->operation_id = ++self->cluster.operation_id; return bw; } mongoc_bulkwrite_t * mongoc_bulkwrite_new(void) { mongoc_bulkwrite_t *bw = bson_malloc0(sizeof(mongoc_bulkwrite_t)); mongoc_optional_init(&bw->is_acknowledged); _mongoc_buffer_init(&bw->ops, NULL, 0, NULL, NULL); _mongoc_array_init(&bw->arrayof_modeldata, sizeof(modeldata_t)); return bw; } void mongoc_bulkwrite_destroy(mongoc_bulkwrite_t *self) { if (!self) { return; } for (size_t i = 0; i < self->arrayof_modeldata.len; i++) { modeldata_t md = _mongoc_array_index(&self->arrayof_modeldata, modeldata_t, i); bson_free(md.ns); } _mongoc_array_destroy(&self->arrayof_modeldata); _mongoc_buffer_destroy(&self->ops); bson_free(self); } struct _mongoc_bulkwrite_insertoneopts_t { // No fields yet. Include an unused placeholder to prevent compile errors due to an empty struct. int unused; }; mongoc_bulkwrite_insertoneopts_t * mongoc_bulkwrite_insertoneopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_insertoneopts_t)); } void mongoc_bulkwrite_insertoneopts_destroy(mongoc_bulkwrite_insertoneopts_t *self) { if (!self) { return; } bson_free(self); } #define ERROR_IF_EXECUTED \ if (self->executed) { \ _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); \ return false; \ } else \ (void)0 bool mongoc_bulkwrite_append_insertone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *document, const mongoc_bulkwrite_insertoneopts_t *opts, // may be NULL bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(document); BSON_ASSERT(document->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "insert", -1)); // Append -1 as a placeholder. Will be overwritten later. // `persisted_id_offset` is the byte offset the `_id` in `op`. uint32_t persisted_id_offset = 0; { // Refer: bsonspec.org for BSON format. persisted_id_offset += 4; // Document length. persisted_id_offset += 1; // BSON type for int32. persisted_id_offset += (uint32_t)strlen("insert") + 1u; // Key + 1 for NULL byte. persisted_id_offset += 4; // int32 value. persisted_id_offset += 1; // BSON type for document. persisted_id_offset += (uint32_t)strlen("document") + 1u; // Key + 1 for NULL byte. } // If `document` does not contain `_id`, add one in the beginning. bson_iter_t existing_id_iter; if (!bson_iter_init_find(&existing_id_iter, document, "_id")) { bson_t tmp = BSON_INITIALIZER; bson_oid_t oid; bson_oid_init(&oid, NULL); BSON_ASSERT(BSON_APPEND_OID(&tmp, "_id", &oid)); BSON_ASSERT(bson_concat(&tmp, document)); BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "document", &tmp)); self->max_insert_len = BSON_MAX(self->max_insert_len, tmp.len); bson_destroy(&tmp); persisted_id_offset += 4; // Document length. } else { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "document", document)); self->max_insert_len = BSON_MAX(self->max_insert_len, document->len); // `existing_id_offset` is offset of `_id` in the input `document`. const uint32_t existing_id_offset = bson_iter_offset(&existing_id_iter); BSON_ASSERT(persisted_id_offset <= UINT32_MAX - existing_id_offset); persisted_id_offset += existing_id_offset; } size_t op_start = self->ops.len; // Save location of `op` to retrieve `_id` later. BSON_ASSERT(mlib_in_range(size_t, op.len)); BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), (size_t)op.len)); self->n_ops++; modeldata_t md = {.op = MODEL_OP_INSERT, .id_loc = {.op_start = op_start, .op_len = (size_t)op.len, .id_offset = persisted_id_offset}, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } static bool validate_update(const bson_t *update, bool *is_pipeline, bson_error_t *error) { BSON_ASSERT_PARAM(update); BSON_ASSERT_PARAM(is_pipeline); BSON_OPTIONAL_PARAM(error); bson_iter_t iter; *is_pipeline = _mongoc_document_is_pipeline(update); if (*is_pipeline) { return true; } BSON_ASSERT(bson_iter_init(&iter, update)); if (bson_iter_next(&iter)) { const char *key = bson_iter_key(&iter); if (key[0] != '$') { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '%s': update only works with $ operators" " and pipelines", key); return false; } } return true; } struct _mongoc_bulkwrite_updateoneopts_t { bson_t *arrayfilters; bson_t *collation; bson_value_t hint; mongoc_optional_t upsert; bson_t *sort; }; mongoc_bulkwrite_updateoneopts_t * mongoc_bulkwrite_updateoneopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_updateoneopts_t)); } void mongoc_bulkwrite_updateoneopts_set_arrayfilters(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *arrayfilters) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(arrayfilters); set_bson_opt(&self->arrayfilters, arrayfilters); } void mongoc_bulkwrite_updateoneopts_set_collation(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *collation) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(collation); set_bson_opt(&self->collation, collation); } void mongoc_bulkwrite_updateoneopts_set_hint(mongoc_bulkwrite_updateoneopts_t *self, const bson_value_t *hint) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(hint); set_bson_value_opt(&self->hint, hint); } void mongoc_bulkwrite_updateoneopts_set_upsert(mongoc_bulkwrite_updateoneopts_t *self, bool upsert) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->upsert, upsert); } void mongoc_bulkwrite_updateoneopts_set_sort(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *sort) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(sort); set_bson_opt(&self->sort, sort); } void mongoc_bulkwrite_updateoneopts_destroy(mongoc_bulkwrite_updateoneopts_t *self) { if (!self) { return; } bson_destroy(self->arrayfilters); bson_destroy(self->collation); bson_value_destroy(&self->hint); bson_destroy(self->sort); bson_free(self); } bool mongoc_bulkwrite_append_updateone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updateoneopts_t *opts /* May be NULL */, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(filter); BSON_ASSERT(filter->len >= 5); BSON_ASSERT_PARAM(update); BSON_ASSERT(update->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; mongoc_bulkwrite_updateoneopts_t defaults = {0}; if (!opts) { opts = &defaults; } bool is_pipeline = false; if (!validate_update(update, &is_pipeline, error)) { return false; } bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "update", -1)); // Append -1 as a placeholder. Will be overwritten later. BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "filter", filter)); if (is_pipeline) { BSON_ASSERT(BSON_APPEND_ARRAY(&op, "updateMods", update)); } else { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "updateMods", update)); } BSON_ASSERT(BSON_APPEND_BOOL(&op, "multi", false)); if (opts->arrayfilters) { BSON_ASSERT(BSON_APPEND_ARRAY(&op, "arrayFilters", opts->arrayfilters)); } if (opts->collation) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "collation", opts->collation)); } if (opts->hint.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&op, "hint", &opts->hint)); } if (mongoc_optional_is_set(&opts->upsert)) { BSON_ASSERT(BSON_APPEND_BOOL(&op, "upsert", mongoc_optional_value(&opts->upsert))); } if (opts->sort) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "sort", opts->sort)); } BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), op.len)); self->n_ops++; modeldata_t md = {.op = MODEL_OP_UPDATE, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } struct _mongoc_bulkwrite_replaceoneopts_t { bson_t *collation; bson_value_t hint; mongoc_optional_t upsert; bson_t *sort; }; mongoc_bulkwrite_replaceoneopts_t * mongoc_bulkwrite_replaceoneopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_replaceoneopts_t)); } void mongoc_bulkwrite_replaceoneopts_set_collation(mongoc_bulkwrite_replaceoneopts_t *self, const bson_t *collation) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(collation); set_bson_opt(&self->collation, collation); } void mongoc_bulkwrite_replaceoneopts_set_hint(mongoc_bulkwrite_replaceoneopts_t *self, const bson_value_t *hint) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(hint); set_bson_value_opt(&self->hint, hint); } void mongoc_bulkwrite_replaceoneopts_set_upsert(mongoc_bulkwrite_replaceoneopts_t *self, bool upsert) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->upsert, upsert); } void mongoc_bulkwrite_replaceoneopts_set_sort(mongoc_bulkwrite_replaceoneopts_t *self, const bson_t *sort) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(sort); set_bson_opt(&self->sort, sort); } void mongoc_bulkwrite_replaceoneopts_destroy(mongoc_bulkwrite_replaceoneopts_t *self) { if (!self) { return; } bson_destroy(self->collation); bson_value_destroy(&self->hint); bson_destroy(self->sort); bson_free(self); } bool validate_replace(const bson_t *doc, bson_error_t *error) { BSON_OPTIONAL_PARAM(doc); BSON_OPTIONAL_PARAM(error); bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, doc)); if (bson_iter_next(&iter)) { const char *key = bson_iter_key(&iter); if (key[0] == '$') { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '%s': replace prohibits $ operators", key); return false; } } return true; } bool mongoc_bulkwrite_append_replaceone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *replacement, const mongoc_bulkwrite_replaceoneopts_t *opts /* May be NULL */, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(filter); BSON_ASSERT(filter->len >= 5); BSON_ASSERT_PARAM(replacement); BSON_ASSERT(replacement->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; mongoc_bulkwrite_replaceoneopts_t defaults = {0}; if (!opts) { opts = &defaults; } if (!validate_replace(replacement, error)) { return false; } bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "update", -1)); // Append -1 as a placeholder. Will be overwritten later. BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "filter", filter)); BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "updateMods", replacement)); BSON_ASSERT(BSON_APPEND_BOOL(&op, "multi", false)); if (opts->collation) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "collation", opts->collation)); } if (opts->hint.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&op, "hint", &opts->hint)); } if (mongoc_optional_is_set(&opts->upsert)) { BSON_ASSERT(BSON_APPEND_BOOL(&op, "upsert", mongoc_optional_value(&opts->upsert))); } if (opts->sort) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "sort", opts->sort)); } BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), op.len)); self->n_ops++; self->max_insert_len = BSON_MAX(self->max_insert_len, replacement->len); modeldata_t md = {.op = MODEL_OP_UPDATE, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } struct _mongoc_bulkwrite_updatemanyopts_t { bson_t *arrayfilters; bson_t *collation; bson_value_t hint; mongoc_optional_t upsert; }; mongoc_bulkwrite_updatemanyopts_t * mongoc_bulkwrite_updatemanyopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_updatemanyopts_t)); } void mongoc_bulkwrite_updatemanyopts_set_arrayfilters(mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *arrayfilters) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(arrayfilters); set_bson_opt(&self->arrayfilters, arrayfilters); } void mongoc_bulkwrite_updatemanyopts_set_collation(mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *collation) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(collation); set_bson_opt(&self->collation, collation); } void mongoc_bulkwrite_updatemanyopts_set_hint(mongoc_bulkwrite_updatemanyopts_t *self, const bson_value_t *hint) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(hint); set_bson_value_opt(&self->hint, hint); } void mongoc_bulkwrite_updatemanyopts_set_upsert(mongoc_bulkwrite_updatemanyopts_t *self, bool upsert) { BSON_ASSERT_PARAM(self); mongoc_optional_set_value(&self->upsert, upsert); } void mongoc_bulkwrite_updatemanyopts_destroy(mongoc_bulkwrite_updatemanyopts_t *self) { if (!self) { return; } bson_destroy(self->arrayfilters); bson_destroy(self->collation); bson_value_destroy(&self->hint); bson_free(self); } bool mongoc_bulkwrite_append_updatemany(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updatemanyopts_t *opts /* May be NULL */, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(filter); BSON_ASSERT(filter->len >= 5); BSON_ASSERT_PARAM(update); BSON_ASSERT(update->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; mongoc_bulkwrite_updatemanyopts_t defaults = {0}; if (!opts) { opts = &defaults; } bool is_pipeline = false; if (!validate_update(update, &is_pipeline, error)) { return false; } bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "update", -1)); // Append -1 as a placeholder. Will be overwritten later. BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "filter", filter)); if (is_pipeline) { BSON_ASSERT(BSON_APPEND_ARRAY(&op, "updateMods", update)); } else { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "updateMods", update)); } BSON_ASSERT(BSON_APPEND_BOOL(&op, "multi", true)); if (opts->arrayfilters) { BSON_ASSERT(BSON_APPEND_ARRAY(&op, "arrayFilters", opts->arrayfilters)); } if (opts->collation) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "collation", opts->collation)); } if (opts->hint.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&op, "hint", &opts->hint)); } if (mongoc_optional_is_set(&opts->upsert)) { BSON_ASSERT(BSON_APPEND_BOOL(&op, "upsert", mongoc_optional_value(&opts->upsert))); } BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), op.len)); self->has_multi_write = true; self->n_ops++; modeldata_t md = {.op = MODEL_OP_UPDATE, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } struct _mongoc_bulkwrite_deleteoneopts_t { bson_t *collation; bson_value_t hint; }; mongoc_bulkwrite_deleteoneopts_t * mongoc_bulkwrite_deleteoneopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_deleteoneopts_t)); } void mongoc_bulkwrite_deleteoneopts_set_collation(mongoc_bulkwrite_deleteoneopts_t *self, const bson_t *collation) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(collation); set_bson_opt(&self->collation, collation); } void mongoc_bulkwrite_deleteoneopts_set_hint(mongoc_bulkwrite_deleteoneopts_t *self, const bson_value_t *hint) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(hint); set_bson_value_opt(&self->hint, hint); } void mongoc_bulkwrite_deleteoneopts_destroy(mongoc_bulkwrite_deleteoneopts_t *self) { if (!self) { return; } bson_value_destroy(&self->hint); bson_destroy(self->collation); bson_free(self); } bool mongoc_bulkwrite_append_deleteone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deleteoneopts_t *opts /* May be NULL */, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(filter); BSON_ASSERT(filter->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; mongoc_bulkwrite_deleteoneopts_t defaults = {0}; if (!opts) { opts = &defaults; } bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "delete", -1)); // Append -1 as a placeholder. Will be overwritten later. BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "filter", filter)); BSON_ASSERT(BSON_APPEND_BOOL(&op, "multi", false)); if (opts->collation) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "collation", opts->collation)); } if (opts->hint.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&op, "hint", &opts->hint)); } BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), op.len)); self->n_ops++; modeldata_t md = {.op = MODEL_OP_DELETE, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } struct _mongoc_bulkwrite_deletemanyopts_t { bson_t *collation; bson_value_t hint; }; mongoc_bulkwrite_deletemanyopts_t * mongoc_bulkwrite_deletemanyopts_new(void) { return bson_malloc0(sizeof(mongoc_bulkwrite_deletemanyopts_t)); } void mongoc_bulkwrite_deletemanyopts_set_collation(mongoc_bulkwrite_deletemanyopts_t *self, const bson_t *collation) { BSON_ASSERT_PARAM(self); set_bson_opt(&self->collation, collation); } void mongoc_bulkwrite_deletemanyopts_set_hint(mongoc_bulkwrite_deletemanyopts_t *self, const bson_value_t *hint) { BSON_ASSERT_PARAM(self); set_bson_value_opt(&self->hint, hint); } void mongoc_bulkwrite_deletemanyopts_destroy(mongoc_bulkwrite_deletemanyopts_t *self) { if (!self) { return; } bson_value_destroy(&self->hint); bson_destroy(self->collation); bson_free(self); } bool mongoc_bulkwrite_append_deletemany(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deletemanyopts_t *opts /* May be NULL */, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(ns); BSON_ASSERT_PARAM(filter); BSON_ASSERT(filter->len >= 5); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); ERROR_IF_EXECUTED; mongoc_bulkwrite_deletemanyopts_t defaults = {0}; if (!opts) { opts = &defaults; } bson_t op = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_INT32(&op, "delete", -1)); // Append -1 as a placeholder. Will be overwritten later. BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "filter", filter)); BSON_ASSERT(BSON_APPEND_BOOL(&op, "multi", true)); if (opts->collation) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&op, "collation", opts->collation)); } if (opts->hint.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&op, "hint", &opts->hint)); } BSON_ASSERT(_mongoc_buffer_append(&self->ops, bson_get_data(&op), op.len)); self->has_multi_write = true; self->n_ops++; modeldata_t md = {.op = MODEL_OP_DELETE, .ns = bson_strdup(ns)}; _mongoc_array_append_val(&self->arrayof_modeldata, md); bson_destroy(&op); return true; } struct _mongoc_bulkwriteresult_t { int64_t insertedcount; int64_t upsertedcount; int64_t matchedcount; int64_t modifiedcount; int64_t deletedcount; int64_t errorscount; // sum of all `nErrors`. struct { bool isset; int64_t index; } first_error_index; uint32_t serverid; bson_t insertresults; bson_t updateresults; bson_t deleteresults; bool verboseresults; // `parsed_some_results` becomes true if an ok:1 reply to `bulkWrite` is successfully parsed. // Used to determine whether some writes were successful. bool parsed_some_results; }; int64_t mongoc_bulkwriteresult_insertedcount(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->insertedcount; } int64_t mongoc_bulkwriteresult_upsertedcount(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->upsertedcount; } int64_t mongoc_bulkwriteresult_matchedcount(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->matchedcount; } int64_t mongoc_bulkwriteresult_modifiedcount(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->modifiedcount; } int64_t mongoc_bulkwriteresult_deletedcount(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->deletedcount; } const bson_t * mongoc_bulkwriteresult_insertresults(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); if (!self->verboseresults) { return NULL; } return &self->insertresults; } const bson_t * mongoc_bulkwriteresult_updateresults(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); if (!self->verboseresults) { return NULL; } return &self->updateresults; } const bson_t * mongoc_bulkwriteresult_deleteresults(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); if (!self->verboseresults) { return NULL; } return &self->deleteresults; } uint32_t mongoc_bulkwriteresult_serverid(const mongoc_bulkwriteresult_t *self) { BSON_ASSERT_PARAM(self); return self->serverid; } void mongoc_bulkwriteresult_destroy(mongoc_bulkwriteresult_t *self) { if (!self) { return; } bson_destroy(&self->deleteresults); bson_destroy(&self->updateresults); bson_destroy(&self->insertresults); bson_free(self); } static mongoc_bulkwriteresult_t * _bulkwriteresult_new(void) { mongoc_bulkwriteresult_t *self = bson_malloc0(sizeof(*self)); bson_init(&self->insertresults); bson_init(&self->updateresults); bson_init(&self->deleteresults); return self; } static void _bulkwriteresult_set_updateresult( mongoc_bulkwriteresult_t *self, int64_t n, int64_t nModified, const bson_value_t *upserted_id, size_t models_idx) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(upserted_id); bson_t updateresult; { char *key = bson_strdup_printf("%zu", models_idx); BSON_APPEND_DOCUMENT_BEGIN(&self->updateresults, key, &updateresult); bson_free(key); } BSON_ASSERT(BSON_APPEND_INT64(&updateresult, "matchedCount", n)); BSON_ASSERT(BSON_APPEND_INT64(&updateresult, "modifiedCount", nModified)); if (upserted_id) { BSON_ASSERT(BSON_APPEND_VALUE(&updateresult, "upsertedId", upserted_id)); } BSON_ASSERT(bson_append_document_end(&self->updateresults, &updateresult)); } static void _bulkwriteresult_set_deleteresult(mongoc_bulkwriteresult_t *self, int64_t n, size_t models_idx) { BSON_ASSERT_PARAM(self); bson_t deleteresult; { char *key = bson_strdup_printf("%zu", models_idx); BSON_APPEND_DOCUMENT_BEGIN(&self->deleteresults, key, &deleteresult); bson_free(key); } BSON_ASSERT(BSON_APPEND_INT64(&deleteresult, "deletedCount", n)); BSON_ASSERT(bson_append_document_end(&self->deleteresults, &deleteresult)); } static void _bulkwriteresult_set_insertresult(mongoc_bulkwriteresult_t *self, const bson_iter_t *id_iter, size_t models_idx) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(id_iter); bson_t insertresult; { char *key = bson_strdup_printf("%zu", models_idx); BSON_APPEND_DOCUMENT_BEGIN(&self->insertresults, key, &insertresult); bson_free(key); } BSON_ASSERT(BSON_APPEND_ITER(&insertresult, "insertedId", id_iter)); BSON_ASSERT(bson_append_document_end(&self->insertresults, &insertresult)); } struct _mongoc_bulkwriteexception_t { bson_error_t error; bson_t error_reply; bson_t write_concern_errors; size_t write_concern_errors_len; bson_t write_errors; // If `has_any_error` is false, the bulk write exception is not returned. bool has_any_error; }; static mongoc_bulkwriteexception_t * _bulkwriteexception_new(void) { mongoc_bulkwriteexception_t *self = bson_malloc0(sizeof(*self)); bson_init(&self->write_concern_errors); bson_init(&self->write_errors); bson_init(&self->error_reply); return self; } // Returns true if there was a top-level error. bool mongoc_bulkwriteexception_error(const mongoc_bulkwriteexception_t *self, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(error); if (self->error.code != 0) { memcpy(error, &self->error, sizeof(*error)); return true; } return false; // No top-level error. } const bson_t * mongoc_bulkwriteexception_writeerrors(const mongoc_bulkwriteexception_t *self) { BSON_ASSERT_PARAM(self); return &self->write_errors; } const bson_t * mongoc_bulkwriteexception_writeconcernerrors(const mongoc_bulkwriteexception_t *self) { BSON_ASSERT_PARAM(self); return &self->write_concern_errors; } const bson_t * mongoc_bulkwriteexception_errorreply(const mongoc_bulkwriteexception_t *self) { BSON_ASSERT_PARAM(self); return &self->error_reply; } void mongoc_bulkwriteexception_destroy(mongoc_bulkwriteexception_t *self) { if (!self) { return; } bson_destroy(&self->write_errors); bson_destroy(&self->write_concern_errors); bson_destroy(&self->error_reply); bson_free(self); } static void _bulkwriteexception_set_error(mongoc_bulkwriteexception_t *self, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(error); BSON_ASSERT(error->code != 0); memcpy(&self->error, error, sizeof(*error)); self->has_any_error = true; } static void _bulkwriteexception_set_error_reply(mongoc_bulkwriteexception_t *self, const bson_t *error_reply) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(error_reply); bson_copy_to(error_reply, &self->error_reply); self->has_any_error = true; } static void _bulkwriteexception_append_writeconcernerror(mongoc_bulkwriteexception_t *self, int32_t code, const char *errmsg, const bson_t *errInfo) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(errmsg); BSON_ASSERT_PARAM(errInfo); char *key = bson_strdup_printf("%zu", self->write_concern_errors_len); self->write_concern_errors_len++; bson_t write_concern_error; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(&self->write_concern_errors, key, &write_concern_error)); BSON_ASSERT(BSON_APPEND_INT32(&write_concern_error, "code", code)); BSON_ASSERT(BSON_APPEND_UTF8(&write_concern_error, "message", errmsg)); BSON_ASSERT(BSON_APPEND_DOCUMENT(&write_concern_error, "details", errInfo)); BSON_ASSERT(bson_append_document_end(&self->write_concern_errors, &write_concern_error)); self->has_any_error = true; bson_free(key); } static void _bulkwriteexception_set_writeerror( mongoc_bulkwriteexception_t *self, int32_t code, const char *errmsg, const bson_t *errInfo, size_t models_idx) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(errmsg); BSON_ASSERT_PARAM(errInfo); bson_t write_error; { char *key = bson_strdup_printf("%zu", models_idx); BSON_APPEND_DOCUMENT_BEGIN(&self->write_errors, key, &write_error); bson_free(key); } BSON_ASSERT(BSON_APPEND_INT32(&write_error, "code", code)); BSON_ASSERT(BSON_APPEND_UTF8(&write_error, "message", errmsg)); BSON_ASSERT(BSON_APPEND_DOCUMENT(&write_error, "details", errInfo)); BSON_ASSERT(bson_append_document_end(&self->write_errors, &write_error)); self->has_any_error = true; } static bool lookup_int32(const bson_t *bson, const char *key, int32_t *out, const char *source, mongoc_bulkwriteexception_t *exc) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(out); BSON_OPTIONAL_PARAM(source); BSON_ASSERT_PARAM(exc); bson_iter_t iter; if (bson_iter_init_find(&iter, bson, key) && BSON_ITER_HOLDS_INT32(&iter)) { *out = bson_iter_int32(&iter); return true; } bson_error_t error; if (source) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find int32 `%s` in %s, but did not", key, source); } else { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find int32 `%s`, but did not", key); } _bulkwriteexception_set_error(exc, &error); return false; } // `lookup_as_int64` looks for `key` as a BSON int32, int64, or double and returns as an int64_t. Doubles are truncated. static int64_t lookup_as_int64(const bson_t *bson, const char *key, int64_t *out, const char *source, mongoc_bulkwriteexception_t *exc) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(out); BSON_OPTIONAL_PARAM(source); BSON_ASSERT_PARAM(exc); bson_iter_t iter; if (bson_iter_init_find(&iter, bson, key) && BSON_ITER_HOLDS_NUMBER(&iter)) { *out = bson_iter_as_int64(&iter); return true; } bson_error_t error; if (source) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find int32, int64, or double `%s` in %s, but did not", key, source); } else { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find int32, int64, or double `%s`, but did not", key); } _bulkwriteexception_set_error(exc, &error); return false; } static bool lookup_string( const bson_t *bson, const char *key, const char **out, const char *source, mongoc_bulkwriteexception_t *exc) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(key); BSON_ASSERT_PARAM(out); BSON_OPTIONAL_PARAM(source); BSON_ASSERT_PARAM(exc); bson_iter_t iter; if (bson_iter_init_find(&iter, bson, key) && BSON_ITER_HOLDS_UTF8(&iter)) { *out = bson_iter_utf8(&iter, NULL); return true; } bson_error_t error; if (source) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find string `%s` in %s, but did not", key, source); } else { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find string `%s`, but did not", key); } _bulkwriteexception_set_error(exc, &error); return false; } // `_bulkwritereturn_apply_reply` applies the top-level fields of a server reply to the returned results. static bool _bulkwritereturn_apply_reply(mongoc_bulkwritereturn_t *self, const bson_t *cmd_reply) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(cmd_reply); // Parse top-level fields. // These fields are expected to be int32 as of server 8.0. However, drivers return the values as int64. // Use `lookup_as_int64` to support other numeric types to future-proof. int64_t nInserted; if (!lookup_as_int64(cmd_reply, "nInserted", &nInserted, NULL, self->exc)) { return false; } self->res->insertedcount += nInserted; int64_t nMatched; if (!lookup_as_int64(cmd_reply, "nMatched", &nMatched, NULL, self->exc)) { return false; } self->res->matchedcount += nMatched; int64_t nModified; if (!lookup_as_int64(cmd_reply, "nModified", &nModified, NULL, self->exc)) { return false; } self->res->modifiedcount += nModified; int64_t nDeleted; if (!lookup_as_int64(cmd_reply, "nDeleted", &nDeleted, NULL, self->exc)) { return false; } self->res->deletedcount += nDeleted; int64_t nUpserted; if (!lookup_as_int64(cmd_reply, "nUpserted", &nUpserted, NULL, self->exc)) { return false; } self->res->upsertedcount += nUpserted; int64_t nErrors; if (!lookup_as_int64(cmd_reply, "nErrors", &nErrors, NULL, self->exc)) { return false; } self->res->errorscount += nErrors; bson_error_t error; bson_iter_t iter; if (bson_iter_init_find(&iter, cmd_reply, "writeConcernError")) { bson_iter_t wce_iter; bson_t wce_bson; if (!_mongoc_iter_document_as_bson(&iter, &wce_bson, &error)) { _bulkwriteexception_set_error(self->exc, &error); _bulkwriteexception_set_error_reply(self->exc, cmd_reply); return false; } // Parse `code`. int32_t code; if (!lookup_int32(&wce_bson, "code", &code, "writeConcernError", self->exc)) { return false; } // Parse `errmsg`. const char *errmsg; if (!lookup_string(&wce_bson, "errmsg", &errmsg, "writeConcernError", self->exc)) { return false; } // Parse optional `errInfo`. bson_t errInfo = BSON_INITIALIZER; if (bson_iter_init_find(&wce_iter, &wce_bson, "errInfo")) { if (!_mongoc_iter_document_as_bson(&wce_iter, &errInfo, &error)) { _bulkwriteexception_set_error(self->exc, &error); _bulkwriteexception_set_error_reply(self->exc, cmd_reply); return false; } } _bulkwriteexception_append_writeconcernerror(self->exc, code, errmsg, &errInfo); } self->res->parsed_some_results = true; return true; } // `_bulkwritereturn_apply_result` applies an individual cursor result to the returned results. static bool _bulkwritereturn_apply_result(mongoc_bulkwritereturn_t *self, const bson_t *result, size_t ops_doc_offset, const mongoc_array_t *arrayof_modeldata, const mongoc_buffer_t *ops) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(result); BSON_ASSERT_PARAM(arrayof_modeldata); bson_error_t error; // Parse for `ok`. int64_t ok; if (!lookup_as_int64(result, "ok", &ok, "result", self->exc)) { return false; } // Parse `idx`. int64_t idx; { if (!lookup_as_int64(result, "idx", &idx, "result", self->exc)) { return false; } if (idx < 0) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected to find non-negative int64 `idx` in " "result, but did not"); _bulkwriteexception_set_error(self->exc, &error); return false; } } BSON_ASSERT(mlib_in_range(size_t, idx)); // `models_idx` is the index of the model that produced this result. size_t models_idx = (size_t)idx + ops_doc_offset; if (ok == 0) { if (!self->res->first_error_index.isset) { self->res->first_error_index.isset = true; self->res->first_error_index.index = idx; } bson_iter_t result_iter; // Parse `code`. int32_t code; if (!lookup_int32(result, "code", &code, "result", self->exc)) { return false; } // Parse `errmsg`. const char *errmsg; if (!lookup_string(result, "errmsg", &errmsg, "result", self->exc)) { return false; } // Parse optional `errInfo`. bson_t errInfo = BSON_INITIALIZER; if (bson_iter_init_find(&result_iter, result, "errInfo")) { if (!_mongoc_iter_document_as_bson(&result_iter, &errInfo, &error)) { _bulkwriteexception_set_error(self->exc, &error); return false; } } // Store a copy of the write error. _bulkwriteexception_set_writeerror(self->exc, code, errmsg, &errInfo, models_idx); } else { // This is a successful result of an individual operation. // Server only reports successful results of individual // operations when verbose results are requested // (`errorsOnly: false` is sent). modeldata_t *md = &_mongoc_array_index(arrayof_modeldata, modeldata_t, models_idx); // Check if model is an update. switch (md->op) { case MODEL_OP_UPDATE: { bson_iter_t result_iter; // Parse `n`. int64_t n; if (!lookup_as_int64(result, "n", &n, "result", self->exc)) { return false; } // Parse `nModified`. int64_t nModified; bson_iter_t nModified_iter; if (!bson_iter_init_find(&nModified_iter, result, "nModified")) { // `nModified` is expected for update results, but may be missing due to SERVER-113026. Default to 0. nModified = 0; } else if (!lookup_as_int64(result, "nModified", &nModified, "result", self->exc)) { return false; } // Check for an optional `upserted._id`. const bson_value_t *upserted_id = NULL; bson_iter_t id_iter; if (bson_iter_init_find(&result_iter, result, "upserted")) { BSON_ASSERT(bson_iter_init(&result_iter, result)); if (!bson_iter_find_descendant(&result_iter, "upserted._id", &id_iter)) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected `upserted` to be a document " "containing `_id`, but did not find `_id`"); _bulkwriteexception_set_error(self->exc, &error); return false; } upserted_id = bson_iter_value(&id_iter); } _bulkwriteresult_set_updateresult(self->res, n, nModified, upserted_id, models_idx); break; } case MODEL_OP_DELETE: { // Parse `n`. int64_t n; if (!lookup_as_int64(result, "n", &n, "result", self->exc)) { return false; } _bulkwriteresult_set_deleteresult(self->res, n, models_idx); break; } case MODEL_OP_INSERT: { bson_iter_t id_iter; BSON_ASSERT(bson_iter_init_from_data_at_offset( &id_iter, ops->data + md->id_loc.op_start, md->id_loc.op_len, md->id_loc.id_offset, strlen("_id"))); _bulkwriteresult_set_insertresult(self->res, &id_iter, models_idx); break; } default: // Add an unreachable default case to silence `switch-default` warnings. BSON_UNREACHABLE("unexpected default"); } } return true; } void mongoc_bulkwrite_set_client(mongoc_bulkwrite_t *self, mongoc_client_t *client) { BSON_ASSERT_PARAM(self); BSON_ASSERT_PARAM(client); if (self->session) { BSON_ASSERT(self->session->client == client); } /* NOP if the client is not changing; otherwise, assign it and increment and * fetch its operation_id. */ if (self->client == client) { return; } self->client = client; self->operation_id = ++client->cluster.operation_id; } void mongoc_bulkwrite_set_session(mongoc_bulkwrite_t *self, mongoc_client_session_t *session) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(session); if (self->client && session) { BSON_ASSERT(self->client == session->client); } self->session = session; } mongoc_bulkwritereturn_t mongoc_bulkwrite_execute(mongoc_bulkwrite_t *self, const mongoc_bulkwriteopts_t *opts) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(opts); // `has_successful_results` is set to true if any `bulkWrite` reply indicates some writes succeeded. bool has_successful_results = false; mongoc_bulkwritereturn_t ret = {0}; bson_error_t error = {0}; mongoc_server_stream_t *ss = NULL; bson_t cmd = BSON_INITIALIZER; mongoc_cmd_parts_t parts = {{0}}; mongoc_bulkwriteopts_t defaults = {{0}}; if (!opts) { opts = &defaults; } bool is_ordered = mongoc_optional_is_set(&opts->ordered) ? mongoc_optional_value(&opts->ordered) : true; // default. // Create empty result and exception to collect results/errors from batches. ret.res = _bulkwriteresult_new(); ret.exc = _bulkwriteexception_new(); if (!self->client) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write requires a client and one has not been set"); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } if (self->executed) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } self->executed = true; if (self->n_ops == 0) { _mongoc_set_error( &error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "cannot do `bulkWrite` with no models"); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } const mongoc_ss_log_context_t ss_log_context = { .operation = "bulkWrite", .has_operation_id = true, .operation_id = self->operation_id}; // Select a stream. { bson_t reply; if (opts->serverid) { ss = mongoc_cluster_stream_for_server( &self->client->cluster, opts->serverid, true /* reconnect_ok */, self->session, &reply, &error); } else { ss = mongoc_cluster_stream_for_writes( &self->client->cluster, &ss_log_context, self->session, NULL /* deprioritized servers */, &reply, &error); } if (!ss) { _bulkwriteexception_set_error(ret.exc, &error); _bulkwriteexception_set_error_reply(ret.exc, &reply); bson_destroy(&reply); goto fail; } } bool verboseresults = mongoc_optional_is_set(&opts->verboseresults) ? mongoc_optional_value(&opts->verboseresults) : false; ret.res->verboseresults = verboseresults; int32_t maxBsonObjectSize = mongoc_server_stream_max_bson_obj_size(ss); // Create the payload 0. { BSON_ASSERT(BSON_APPEND_INT32(&cmd, "bulkWrite", 1)); // errorsOnly is default true. Set to false if verboseResults requested. BSON_ASSERT(BSON_APPEND_BOOL(&cmd, "errorsOnly", !verboseresults)); // ordered is default true. BSON_ASSERT(BSON_APPEND_BOOL(&cmd, "ordered", is_ordered)); if (opts->comment.value_type != BSON_TYPE_EOD) { BSON_ASSERT(BSON_APPEND_VALUE(&cmd, "comment", &opts->comment)); } if (mongoc_optional_is_set(&opts->bypassdocumentvalidation)) { BSON_ASSERT( BSON_APPEND_BOOL(&cmd, "bypassDocumentValidation", mongoc_optional_value(&opts->bypassdocumentvalidation))); } if (opts->let) { BSON_ASSERT(BSON_APPEND_DOCUMENT(&cmd, "let", opts->let)); } // Add optional extra fields. if (opts->extra) { BSON_ASSERT(bson_concat(&cmd, opts->extra)); } mongoc_cmd_parts_init(&parts, self->client, "admin", MONGOC_QUERY_NONE, &cmd); parts.assembled.operation_id = self->operation_id; parts.allow_txn_number = MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_YES; // To append `lsid`. if (self->has_multi_write) { // Write commands that include multi-document operations are not // retryable. parts.allow_txn_number = MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_NO; } parts.is_write_command = true; // To append `txnNumber`. if (self->session) { mongoc_cmd_parts_set_session(&parts, self->session); } // Apply write concern: { const mongoc_write_concern_t *wc = self->client->write_concern; // Default to client. if (opts->writeconcern) { if (_mongoc_client_session_in_txn(self->session)) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting a transaction."); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } wc = opts->writeconcern; } if (!mongoc_cmd_parts_set_write_concern(&parts, wc, &error)) { _bulkwriteexception_set_error(ret.exc, &error); goto fail; } if (!mongoc_write_concern_is_acknowledged(wc) && mlib_cmp(self->max_insert_len, >, maxBsonObjectSize)) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unacknowledged `bulkWrite` includes insert of size: %" PRIu32 ", exceeding maxBsonObjectSize: %" PRId32, self->max_insert_len, maxBsonObjectSize); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } mongoc_optional_set_value(&self->is_acknowledged, mongoc_write_concern_is_acknowledged(wc)); } if (verboseresults && !mongoc_optional_value(&self->is_acknowledged)) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot request unacknowledged write concern and verbose results."); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } if (is_ordered && !mongoc_optional_value(&self->is_acknowledged)) { _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot request unacknowledged write concern and ordered writes."); _bulkwriteexception_set_error(ret.exc, &error); goto fail; } if (!mongoc_cmd_parts_assemble(&parts, ss, &error)) { _bulkwriteexception_set_error(ret.exc, &error); goto fail; } } const int32_t maxWriteBatchSize = mongoc_server_stream_max_write_batch_size(ss); int32_t maxMessageSizeBytes = mongoc_server_stream_max_msg_size(ss); if (_mongoc_cse_is_enabled(self->client)) { maxMessageSizeBytes = MONGOC_REDUCED_MAX_MSG_SIZE_FOR_FLE; } // `ops_doc_offset` is an offset into the `ops` document sequence. Counts the number of documents sent. size_t ops_doc_offset = 0; // `ops_byte_offset` is an offset into the `ops` document sequence. Counts the number of bytes sent. size_t ops_byte_offset = 0; // Calculate overhead of OP_MSG and the `bulkWrite` command. See bulk write specification for explanation. size_t opmsg_overhead = 0; { opmsg_overhead += 1000; // Add size of `bulkWrite` command. Exclude command-agnostic fields added in `mongoc_cmd_parts_assemble` (e.g. // `txnNumber` and `lsid`). opmsg_overhead += cmd.len; } // Send one or more `bulkWrite` commands. Split input payload if necessary to satisfy server size limits. while (true) { bool has_write_errors = false; bool batch_ok = false; bson_t cmd_reply = BSON_INITIALIZER; mongoc_cursor_t *reply_cursor = NULL; // `ops_byte_len` is the number of bytes from `ops` to send in this batch. size_t ops_byte_len = 0; // `ops_doc_len` is the number of documents from `ops` to send in this batch. size_t ops_doc_len = 0; if (ops_byte_offset == self->ops.len) { // All write models were sent. break; } // Track the nsInfo entries to include in this batch. mcd_nsinfo_t *nsinfo = mcd_nsinfo_new(); // Read as many documents from payload as possible. while (true) { if (ops_byte_offset + ops_byte_len >= self->ops.len) { // All remaining ops are readied. break; } if (mlib_cmp(ops_doc_len, >=, maxWriteBatchSize)) { // Maximum number of operations are readied. break; } // Read length of next document. const uint32_t doc_len = mlib_read_u32le(self->ops.data + ops_byte_offset + ops_byte_len); // Check if adding this operation requires adding an `nsInfo` entry. // `models_idx` is the index of the model that produced this result. size_t models_idx = ops_doc_len + ops_doc_offset; modeldata_t *md = &_mongoc_array_index(&self->arrayof_modeldata, modeldata_t, models_idx); uint32_t nsinfo_bson_size = 0; int32_t ns_index = mcd_nsinfo_find(nsinfo, md->ns); if (ns_index == -1) { // Need to append `nsInfo` entry. Append after checking that both the document and the `nsInfo` entry fit. nsinfo_bson_size = mcd_nsinfo_get_bson_size(md->ns); } if (mlib_cmp(opmsg_overhead + ops_byte_len + doc_len + nsinfo_bson_size, >, maxMessageSizeBytes)) { if (ops_byte_len == 0) { // Could not even fit one document within an OP_MSG. _mongoc_set_error(&error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to send document at index %zu. Sending " "would exceed maxMessageSizeBytes=%" PRId32, ops_doc_len, maxMessageSizeBytes); _bulkwriteexception_set_error(ret.exc, &error); goto batch_fail; } break; } // Check if a new `nsInfo` entry is needed. if (ns_index == -1) { ns_index = mcd_nsinfo_append(nsinfo, md->ns, &error); if (ns_index == -1) { _bulkwriteexception_set_error(ret.exc, &error); goto batch_fail; } } // Overwrite the placeholder to the index of the `nsInfo` entry. { bson_iter_t nsinfo_iter; bson_t doc; BSON_ASSERT(bson_init_static(&doc, self->ops.data + ops_byte_offset + ops_byte_len, doc_len)); // Find the index. BSON_ASSERT(bson_iter_init(&nsinfo_iter, &doc)); BSON_ASSERT(bson_iter_next(&nsinfo_iter)); bson_iter_overwrite_int32(&nsinfo_iter, ns_index); } // Include document. { ops_byte_len += doc_len; ops_doc_len += 1; } } // Send batch. { parts.assembled.payloads_count = 2; // Create the `nsInfo` payload. { mongoc_cmd_payload_t *payload = &parts.assembled.payloads[0]; const mongoc_buffer_t *nsinfo_docseq = mcd_nsinfo_as_document_sequence(nsinfo); payload->documents = nsinfo_docseq->data; BSON_ASSERT(mlib_in_range(int32_t, nsinfo_docseq->len)); payload->size = (int32_t)nsinfo_docseq->len; payload->identifier = "nsInfo"; } // Create the `ops` payload. { mongoc_cmd_payload_t *payload = &parts.assembled.payloads[1]; payload->identifier = "ops"; payload->documents = self->ops.data + ops_byte_offset; BSON_ASSERT(mlib_in_range(int32_t, ops_byte_len)); payload->size = (int32_t)ops_byte_len; } // Check if stream is valid. A previous call to `mongoc_cluster_run_retryable_write` may have invalidated // stream (e.g. due to processing an error). If invalid, select a new stream before processing more batches. if (!mongoc_cluster_stream_valid(&self->client->cluster, parts.assembled.server_stream)) { bson_t reply; // Select a server and create a stream again. mongoc_server_stream_cleanup(ss); ss = mongoc_cluster_stream_for_writes(&self->client->cluster, &ss_log_context, NULL /* session */, NULL /* deprioritized servers */, &reply, &error); if (ss) { parts.assembled.server_stream = ss; } else { _bulkwriteexception_set_error(ret.exc, &error); _bulkwriteexception_set_error_reply(ret.exc, &reply); bson_destroy(&reply); goto batch_fail; } } // Send command. { mongoc_server_stream_t *new_ss = NULL; bool ok = mongoc_cluster_run_retryable_write( &self->client->cluster, &parts.assembled, parts.is_retryable_write, &new_ss, &cmd_reply, &error); if (new_ss) { // A retry occurred. Save the newly created stream to use for subsequent commands. mongoc_server_stream_cleanup(ss); ss = new_ss; parts.assembled.server_stream = ss; } // Check for a command ('ok': 0) error. if (!ok) { if (error.code != 0) { // The original error was a command ('ok': 0) error. _bulkwriteexception_set_error(ret.exc, &error); } _bulkwriteexception_set_error_reply(ret.exc, &cmd_reply); goto batch_fail; } } // Add to result and/or exception. if (mongoc_optional_value(&self->is_acknowledged)) { // Parse top-level fields. if (!_bulkwritereturn_apply_reply(&ret, &cmd_reply)) { goto batch_fail; } // Construct reply cursor and read individual results. { bson_t cursor_opts = BSON_INITIALIZER; { uint32_t serverid = parts.assembled.server_stream->sd->id; BSON_ASSERT(mlib_in_range(int32_t, serverid)); int32_t serverid_i32 = (int32_t)serverid; BSON_ASSERT(BSON_APPEND_INT32(&cursor_opts, "serverId", serverid_i32)); // Use same session if one was applied. if (parts.assembled.session && !mongoc_client_session_append(parts.assembled.session, &cursor_opts, &error)) { _bulkwriteexception_set_error(ret.exc, &error); _bulkwriteexception_set_error_reply(ret.exc, &cmd_reply); goto batch_fail; } } // Construct the reply cursor. reply_cursor = mongoc_cursor_new_from_command_reply_with_opts(self->client, &cmd_reply, &cursor_opts); bson_destroy(&cursor_opts); // `cmd_reply` is stolen. Clear it. bson_init(&cmd_reply); // Ensure constructing cursor did not error. { const bson_t *error_document; if (mongoc_cursor_error_document(reply_cursor, &error, &error_document)) { _bulkwriteexception_set_error(ret.exc, &error); if (error_document) { _bulkwriteexception_set_error_reply(ret.exc, error_document); } goto batch_fail; } } // Iterate over cursor results. const bson_t *result; while (mongoc_cursor_next(reply_cursor, &result)) { if (!_bulkwritereturn_apply_result( &ret, result, ops_doc_offset, &self->arrayof_modeldata, &self->ops)) { goto batch_fail; } } has_write_errors = !bson_empty(&ret.exc->write_errors); // Ensure iterating cursor did not error. { const bson_t *error_document; if (mongoc_cursor_error_document(reply_cursor, &error, &error_document)) { _bulkwriteexception_set_error(ret.exc, &error); if (error_document) { _bulkwriteexception_set_error_reply(ret.exc, error_document); } goto batch_fail; } } } } } ops_doc_offset += ops_doc_len; ops_byte_offset += ops_byte_len; batch_ok = true; batch_fail: mcd_nsinfo_destroy(nsinfo); mongoc_cursor_destroy(reply_cursor); bson_destroy(&cmd_reply); if (!batch_ok) { goto fail; } if (has_write_errors && is_ordered) { // Ordered writes must not continue to send batches once an error is // occurred. An individual write error is not a top-level error. break; } } fail: if (ret.res->parsed_some_results) { if (is_ordered) { // Ordered writes stop on first error. If the error reported is for an index > 0, assume some writes suceeded. if (ret.res->errorscount == 0 || (ret.res->first_error_index.isset && ret.res->first_error_index.index > 0)) { has_successful_results = true; } } else { BSON_ASSERT(mlib_in_range(size_t, ret.res->errorscount)); size_t errorscount_sz = (size_t)ret.res->errorscount; if (errorscount_sz < self->n_ops) { has_successful_results = true; } } } if (!(mongoc_optional_is_set(&self->is_acknowledged) && mongoc_optional_value(&self->is_acknowledged) && has_successful_results)) { mongoc_bulkwriteresult_destroy(ret.res); ret.res = NULL; } if (parts.body) { // Only clean-up if initialized. mongoc_cmd_parts_cleanup(&parts); } bson_destroy(&cmd); if (ss) { self->serverid.value = ss->sd->id; self->serverid.is_set = true; if (ret.res) { ret.res->serverid = self->serverid.value; } } mongoc_server_stream_cleanup(ss); if (!ret.exc->has_any_error) { mongoc_bulkwriteexception_destroy(ret.exc); ret.exc = NULL; } return ret; } MONGOC_EXPORT(mongoc_bulkwrite_check_acknowledged_t) mongoc_bulkwrite_check_acknowledged(mongoc_bulkwrite_t const *self, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(error); mongoc_bulkwrite_check_acknowledged_t result = {.is_ok = mongoc_optional_is_set(&self->is_acknowledged), .is_acknowledged = false}; if (result.is_ok) { result.is_acknowledged = mongoc_optional_value(&self->is_acknowledged); } else { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write has not been executed or execution failed"); } return result; } mongoc_bulkwrite_serverid_t mongoc_bulkwrite_serverid(mongoc_bulkwrite_t const *self, bson_error_t *error) { BSON_ASSERT_PARAM(self); BSON_OPTIONAL_PARAM(error); mongoc_bulkwrite_serverid_t const result = {.is_ok = self->serverid.is_set, .serverid = self->serverid.value}; if (!result.is_ok) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write has not been executed or execution failed"); } return result; } MC_ENABLE_CONVERSION_WARNING_END mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-bulkwrite.h000066400000000000000000000341231511661753600246340ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_BULKWRITE_H #define MONGOC_BULKWRITE_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_bulkwriteopts_t mongoc_bulkwriteopts_t; MONGOC_EXPORT(mongoc_bulkwriteopts_t *) mongoc_bulkwriteopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_ordered(mongoc_bulkwriteopts_t *self, bool ordered); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_bypassdocumentvalidation(mongoc_bulkwriteopts_t *self, bool bypassdocumentvalidation); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_let(mongoc_bulkwriteopts_t *self, const bson_t *let); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_writeconcern(mongoc_bulkwriteopts_t *self, const mongoc_write_concern_t *writeconcern); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_comment(mongoc_bulkwriteopts_t *self, const bson_value_t *comment); MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_verboseresults(mongoc_bulkwriteopts_t *self, bool verboseresults); // `mongoc_bulkwriteopts_set_extra` appends `extra` to bulkWrite command. // It is intended to support future server options. MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_extra(mongoc_bulkwriteopts_t *self, const bson_t *extra); // `mongoc_bulkwriteopts_set_serverid` identifies which server to perform the operation. This is intended for use by // wrapping drivers that select a server before running the operation. MONGOC_EXPORT(void) mongoc_bulkwriteopts_set_serverid(mongoc_bulkwriteopts_t *self, uint32_t serverid); MONGOC_EXPORT(void) mongoc_bulkwriteopts_destroy(mongoc_bulkwriteopts_t *self); typedef struct _mongoc_bulkwriteresult_t mongoc_bulkwriteresult_t; MONGOC_EXPORT(int64_t) mongoc_bulkwriteresult_insertedcount(const mongoc_bulkwriteresult_t *self); MONGOC_EXPORT(int64_t) mongoc_bulkwriteresult_upsertedcount(const mongoc_bulkwriteresult_t *self); MONGOC_EXPORT(int64_t) mongoc_bulkwriteresult_matchedcount(const mongoc_bulkwriteresult_t *self); MONGOC_EXPORT(int64_t) mongoc_bulkwriteresult_modifiedcount(const mongoc_bulkwriteresult_t *self); MONGOC_EXPORT(int64_t) mongoc_bulkwriteresult_deletedcount(const mongoc_bulkwriteresult_t *self); // `mongoc_bulkwriteresult_insertresults` returns a BSON document mapping model indexes to insert results. // Example: // { // "0" : { "insertedId" : "foo" }, // "1" : { "insertedId" : "bar" } // } // Returns NULL if verbose results were not requested. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteresult_insertresults(const mongoc_bulkwriteresult_t *self); // `mongoc_bulkwriteresult_updateresults` returns a BSON document mapping model indexes to update results. // Example: // { // "0" : { "matchedCount" : 2, "modifiedCount" : 2 }, // "1" : { "matchedCount" : 1, "modifiedCount" : 0, "upsertedId" : "foo" } // } // Returns NULL if verbose results were not requested. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteresult_updateresults(const mongoc_bulkwriteresult_t *self); // `mongoc_bulkwriteresult_deleteresults` returns a BSON document mapping model indexes to delete results. // Example: // { // "0" : { "deletedCount" : 1 }, // "1" : { "deletedCount" : 2 } // } // Returns NULL if verbose results were not requested. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteresult_deleteresults(const mongoc_bulkwriteresult_t *self); // `mongoc_bulkwriteresult_serverid` identifies the most recently selected server. This may differ from a // previously set serverid if a retry occurred. A server ID of 0 indicates that no server was successfully selected. // This is intended for use by wrapping drivers that select a server before running the operation. MONGOC_EXPORT(uint32_t) mongoc_bulkwriteresult_serverid(const mongoc_bulkwriteresult_t *self); MONGOC_EXPORT(void) mongoc_bulkwriteresult_destroy(mongoc_bulkwriteresult_t *self); typedef struct _mongoc_bulkwriteexception_t mongoc_bulkwriteexception_t; // Returns true if there was a top-level error. MONGOC_EXPORT(bool) mongoc_bulkwriteexception_error(const mongoc_bulkwriteexception_t *self, bson_error_t *error); // `mongoc_bulkwriteexception_writeerrors` returns a BSON document mapping model indexes to write errors. // Example: // { // "0" : { "code" : 123, "message" : "foo", "details" : { } }, // "1" : { "code" : 456, "message" : "bar", "details" : { } } // } // Returns an empty document if there are no write errors. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteexception_writeerrors(const mongoc_bulkwriteexception_t *self); // `mongoc_bulkwriteexception_writeconcernerrors` returns a BSON array of write concern errors. // Example: // [ // { "code" : 123, "message" : "foo", "details" : { } }, // { "code" : 456, "message" : "bar", "details" : { } } // ] // Returns an empty array if there are no write concern errors. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteexception_writeconcernerrors(const mongoc_bulkwriteexception_t *self); // `mongoc_bulkwriteexception_errorreply` returns a possible server reply related to the error, or an empty document. MONGOC_EXPORT(const bson_t *) mongoc_bulkwriteexception_errorreply(const mongoc_bulkwriteexception_t *self); MONGOC_EXPORT(void) mongoc_bulkwriteexception_destroy(mongoc_bulkwriteexception_t *self); typedef struct _mongoc_bulkwrite_t mongoc_bulkwrite_t; MONGOC_EXPORT(mongoc_bulkwrite_t *) mongoc_client_bulkwrite_new(mongoc_client_t *self); typedef struct _mongoc_bulkwrite_insertoneopts_t mongoc_bulkwrite_insertoneopts_t; MONGOC_EXPORT(mongoc_bulkwrite_insertoneopts_t *) mongoc_bulkwrite_insertoneopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_insertoneopts_destroy(mongoc_bulkwrite_insertoneopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_insertone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *document, const mongoc_bulkwrite_insertoneopts_t *opts /* May be NULL */, bson_error_t *error); typedef struct _mongoc_bulkwrite_updateoneopts_t mongoc_bulkwrite_updateoneopts_t; MONGOC_EXPORT(mongoc_bulkwrite_updateoneopts_t *) mongoc_bulkwrite_updateoneopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_set_arrayfilters(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *arrayfilters); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_set_collation(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *collation); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_set_hint(mongoc_bulkwrite_updateoneopts_t *self, const bson_value_t *hint); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_set_upsert(mongoc_bulkwrite_updateoneopts_t *self, bool upsert); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_set_sort(mongoc_bulkwrite_updateoneopts_t *self, const bson_t *sort); MONGOC_EXPORT(void) mongoc_bulkwrite_updateoneopts_destroy(mongoc_bulkwrite_updateoneopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_updateone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updateoneopts_t *opts /* May be NULL */, bson_error_t *error); typedef struct _mongoc_bulkwrite_updatemanyopts_t mongoc_bulkwrite_updatemanyopts_t; MONGOC_EXPORT(mongoc_bulkwrite_updatemanyopts_t *) mongoc_bulkwrite_updatemanyopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_updatemanyopts_set_arrayfilters(mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *arrayfilters); MONGOC_EXPORT(void) mongoc_bulkwrite_updatemanyopts_set_collation(mongoc_bulkwrite_updatemanyopts_t *self, const bson_t *collation); MONGOC_EXPORT(void) mongoc_bulkwrite_updatemanyopts_set_hint(mongoc_bulkwrite_updatemanyopts_t *self, const bson_value_t *hint); MONGOC_EXPORT(void) mongoc_bulkwrite_updatemanyopts_set_upsert(mongoc_bulkwrite_updatemanyopts_t *self, bool upsert); MONGOC_EXPORT(void) mongoc_bulkwrite_updatemanyopts_destroy(mongoc_bulkwrite_updatemanyopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_updatemany(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *update, const mongoc_bulkwrite_updatemanyopts_t *opts /* May be NULL */, bson_error_t *error); typedef struct _mongoc_bulkwrite_replaceoneopts_t mongoc_bulkwrite_replaceoneopts_t; MONGOC_EXPORT(mongoc_bulkwrite_replaceoneopts_t *) mongoc_bulkwrite_replaceoneopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_replaceoneopts_set_collation(mongoc_bulkwrite_replaceoneopts_t *self, const bson_t *collation); MONGOC_EXPORT(void) mongoc_bulkwrite_replaceoneopts_set_hint(mongoc_bulkwrite_replaceoneopts_t *self, const bson_value_t *hint); MONGOC_EXPORT(void) mongoc_bulkwrite_replaceoneopts_set_upsert(mongoc_bulkwrite_replaceoneopts_t *self, bool upsert); MONGOC_EXPORT(void) mongoc_bulkwrite_replaceoneopts_set_sort(mongoc_bulkwrite_replaceoneopts_t *self, const bson_t *sort); MONGOC_EXPORT(void) mongoc_bulkwrite_replaceoneopts_destroy(mongoc_bulkwrite_replaceoneopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_replaceone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const bson_t *replacement, const mongoc_bulkwrite_replaceoneopts_t *opts /* May be NULL */, bson_error_t *error); typedef struct _mongoc_bulkwrite_deleteoneopts_t mongoc_bulkwrite_deleteoneopts_t; MONGOC_EXPORT(mongoc_bulkwrite_deleteoneopts_t *) mongoc_bulkwrite_deleteoneopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_deleteoneopts_set_collation(mongoc_bulkwrite_deleteoneopts_t *self, const bson_t *collation); MONGOC_EXPORT(void) mongoc_bulkwrite_deleteoneopts_set_hint(mongoc_bulkwrite_deleteoneopts_t *self, const bson_value_t *hint); MONGOC_EXPORT(void) mongoc_bulkwrite_deleteoneopts_destroy(mongoc_bulkwrite_deleteoneopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_deleteone(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deleteoneopts_t *opts /* May be NULL */, bson_error_t *error); typedef struct _mongoc_bulkwrite_deletemanyopts_t mongoc_bulkwrite_deletemanyopts_t; MONGOC_EXPORT(mongoc_bulkwrite_deletemanyopts_t *) mongoc_bulkwrite_deletemanyopts_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_deletemanyopts_set_collation(mongoc_bulkwrite_deletemanyopts_t *self, const bson_t *collation); MONGOC_EXPORT(void) mongoc_bulkwrite_deletemanyopts_set_hint(mongoc_bulkwrite_deletemanyopts_t *self, const bson_value_t *hint); MONGOC_EXPORT(void) mongoc_bulkwrite_deletemanyopts_destroy(mongoc_bulkwrite_deletemanyopts_t *self); MONGOC_EXPORT(bool) mongoc_bulkwrite_append_deletemany(mongoc_bulkwrite_t *self, const char *ns, const bson_t *filter, const mongoc_bulkwrite_deletemanyopts_t *opts /* May be NULL */, bson_error_t *error); // `mongoc_bulkwritereturn_t` may outlive `mongoc_bulkwrite_t`. typedef struct { mongoc_bulkwriteresult_t *res; // NULL if no known successful writes or write was unacknowledged. mongoc_bulkwriteexception_t *exc; // NULL if no error. } mongoc_bulkwritereturn_t; // `mongoc_bulkwrite_new` and `mongoc_bulkwrite_set_client` may be used by // language bindings that want to assemble a `mongoc_bulkwrite_t` and defer // `mongoc_client_t` assignment to execution time. MONGOC_EXPORT(mongoc_bulkwrite_t *) mongoc_bulkwrite_new(void); MONGOC_EXPORT(void) mongoc_bulkwrite_set_client(mongoc_bulkwrite_t *self, mongoc_client_t *client); // `mongoc_bulkwrite_set_session` sets an optional explicit session. // `*session` may be modified when `mongoc_bulkwrite_execute` is called. MONGOC_EXPORT(void) mongoc_bulkwrite_set_session(mongoc_bulkwrite_t *self, mongoc_client_session_t *session); // `mongoc_bulkwrite_execute` executes a bulk write operation. MONGOC_EXPORT(mongoc_bulkwritereturn_t) mongoc_bulkwrite_execute(mongoc_bulkwrite_t *self, const mongoc_bulkwriteopts_t *opts); typedef struct { bool is_ok; // true if no error bool is_acknowledged; // true if the previous call to `mongoc_bulkwrite_execute` used an acknowledged write concern } mongoc_bulkwrite_check_acknowledged_t; // `mongoc_bulkwrite_check_acknowledged` checks whether or not the previous call to `mongoc_bulkwrite_execute` used an // acknowledged write concern. MONGOC_EXPORT(mongoc_bulkwrite_check_acknowledged_t) mongoc_bulkwrite_check_acknowledged(mongoc_bulkwrite_t const *self, bson_error_t *error); typedef struct { bool is_ok; // true if no error uint32_t serverid; // the server ID last used in `mongoc_bulkwrite_execute` } mongoc_bulkwrite_serverid_t; // `mongoc_bulkwrite_serverid` identifies the most recently selected server. This may differ from a previously set // serverid if a retry occurred. Unlike `mongoc_bulkwriteresult_serverid`, this can be used for unacknowledged writes. // For acknowledged writes, `mongoc_bulkwrite_serverid` and `mongoc_bulkwriteresult_serverid` report the same server // ID. MONGOC_EXPORT(mongoc_bulkwrite_serverid_t) mongoc_bulkwrite_serverid(mongoc_bulkwrite_t const *self, bson_error_t *error); MONGOC_EXPORT(void) mongoc_bulkwrite_destroy(mongoc_bulkwrite_t *self); BSON_END_DECLS #endif // MONGOC_BULKWRITE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-change-stream-private.h000066400000000000000000000047411511661753600270150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CHANGE_STREAM_PRIVATE_H #define MONGOC_CHANGE_STREAM_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include typedef enum { MONGOC_CHANGE_STREAM_COLLECTION, MONGOC_CHANGE_STREAM_DATABASE, MONGOC_CHANGE_STREAM_CLIENT } mongoc_change_stream_type_t; struct _mongoc_change_stream_t { mongoc_change_stream_opts_t opts; mongoc_timestamp_t operation_time; bson_t pipeline_to_append; bson_t resume_token; bson_t *full_document; bson_t *full_document_before_change; bool show_expanded_events; bson_error_t err; bson_t err_doc; mongoc_cursor_t *cursor; mongoc_client_t *client; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; mongoc_change_stream_type_t change_stream_type; char *db; char *coll; int64_t max_await_time_ms; int32_t batch_size; bool has_returned_results; /* Track whether the change stream has resumed after an error, as this * determines how we construct an initial or resuming aggregate command. */ bool resumed; mongoc_client_session_t *implicit_session; /* The max_wire_version of the server the change stream is tied to. */ uint32_t max_wire_version; }; mongoc_change_stream_t * _mongoc_change_stream_new_from_collection(const mongoc_collection_t *coll, const bson_t *pipeline, const bson_t *opts); mongoc_change_stream_t * _mongoc_change_stream_new_from_database(const mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts); mongoc_change_stream_t * _mongoc_change_stream_new_from_client(mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts); #endif /* MONGOC_CHANGE_STREAM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-change-stream.c000066400000000000000000000545671511661753600253530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #define CHANGE_STREAM_ERR(_str) \ _mongoc_set_error(&stream->err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_BSON, "Could not set " _str) /* the caller knows either a client or server error has occurred. * `reply` contains the server reply or an empty document. */ static bool _is_resumable_error(mongoc_change_stream_t *stream, const bson_t *reply) { bson_error_t error = {0}; /* Change Streams Spec resumable criteria: "any error encountered which is * not a server error (e.g. a timeout error or network error)" */ if (bson_empty(reply)) { return true; } if (_mongoc_cmd_check_ok(reply, MONGOC_ERROR_API_VERSION_2, &error)) { return true; } if (error.code == MONGOC_SERVER_ERR_CURSOR_NOT_FOUND) { return true; } if (stream->max_wire_version >= WIRE_VERSION_4_4) { return mongoc_error_has_label(reply, "ResumableChangeStreamError"); } switch (error.code) { case MONGOC_SERVER_ERR_HOSTUNREACHABLE: case MONGOC_SERVER_ERR_HOSTNOTFOUND: case MONGOC_SERVER_ERR_NETWORKTIMEOUT: case MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS: case MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN: case MONGOC_SERVER_ERR_EXCEEDEDTIMELIMIT: case MONGOC_SERVER_ERR_SOCKETEXCEPTION: case MONGOC_SERVER_ERR_NOTPRIMARY: case MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN: case MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE: case MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK: case MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY: case MONGOC_SERVER_ERR_STALESHARDVERSION: case MONGOC_SERVER_ERR_STALEEPOCH: case MONGOC_SERVER_ERR_STALECONFIG: case MONGOC_SERVER_ERR_RETRYCHANGESTREAM: case MONGOC_SERVER_ERR_FAILEDTOSATISFYREADPREFERENCE: return true; default: return false; } } static void _set_resume_token(mongoc_change_stream_t *stream, const bson_t *resume_token) { BSON_ASSERT(stream); BSON_ASSERT(resume_token); bson_destroy(&stream->resume_token); bson_copy_to(resume_token, &stream->resume_token); } /* construct the aggregate command in cmd. looks like one of the following: * for a collection change stream: * { aggregate: collname, pipeline: [], cursor: { batchSize: x } } * for a database change stream: * { aggregate: 1, pipeline: [], cursor: { batchSize: x } } * for a client change stream: * { aggregate: 1, pipeline: [{$changeStream: {allChangesForCluster: true}}], * cursor: { batchSize: x } } */ static void _make_command(mongoc_change_stream_t *stream, bson_t *command) { bson_iter_t iter; bson_t change_stream_stage; /* { $changeStream: } */ bson_t change_stream_doc; bson_array_builder_t *pipeline; bson_t cursor_doc; if (stream->change_stream_type == MONGOC_CHANGE_STREAM_COLLECTION) { bson_append_utf8(command, "aggregate", 9, stream->coll, (int)strlen(stream->coll)); } else { bson_append_int32(command, "aggregate", 9, 1); } bson_append_array_builder_begin(command, "pipeline", 8, &pipeline); /* append the $changeStream stage. */ bson_array_builder_append_document_begin(pipeline, &change_stream_stage); bson_append_document_begin(&change_stream_stage, "$changeStream", 13, &change_stream_doc); if (stream->full_document) { bson_concat(&change_stream_doc, stream->full_document); } if (stream->full_document_before_change) { bson_concat(&change_stream_doc, stream->full_document_before_change); } if (stream->show_expanded_events) { BSON_APPEND_BOOL(&change_stream_doc, "showExpandedEvents", stream->show_expanded_events); } if (stream->resumed) { /* Change stream spec: Resume Process */ /* If there is a cached resumeToken: */ if (!bson_empty(&stream->resume_token)) { /* If the ChangeStream was started with startAfter and has yet to return a result document: */ if (!bson_empty(&stream->opts.startAfter) && !stream->has_returned_results) { /* The driver MUST set startAfter to the cached resumeToken */ BSON_APPEND_DOCUMENT(&change_stream_doc, "startAfter", &stream->resume_token); } else { /* The driver MUST set resumeAfter to the cached resumeToken */ BSON_APPEND_DOCUMENT(&change_stream_doc, "resumeAfter", &stream->resume_token); } } else if (!_mongoc_timestamp_empty(&stream->operation_time)) { /* Else if there is no cached resumeToken and the ChangeStream has a saved operation time and the max wire version is >= 7, the driver MUST set startAtOperationTime */ _mongoc_timestamp_append(&stream->operation_time, &change_stream_doc, "startAtOperationTime"); } } else { /* Change streams spec: "startAtOperationTime, resumeAfter, and startAfter * are all mutually exclusive; if any two are set, the server will return * an error. Drivers MUST NOT throw a custom error, and MUST defer to the * server error." */ if (!bson_empty(&stream->opts.resumeAfter)) { BSON_APPEND_DOCUMENT(&change_stream_doc, "resumeAfter", &stream->opts.resumeAfter); /* Update the cached resume token */ _set_resume_token(stream, &stream->opts.resumeAfter); } if (!bson_empty(&stream->opts.startAfter)) { BSON_APPEND_DOCUMENT(&change_stream_doc, "startAfter", &stream->opts.startAfter); /* Update the cached resume token (take precedence over resumeAfter) */ _set_resume_token(stream, &stream->opts.startAfter); } if (!_mongoc_timestamp_empty(&stream->operation_time)) { _mongoc_timestamp_append(&stream->operation_time, &change_stream_doc, "startAtOperationTime"); } } if (stream->change_stream_type == MONGOC_CHANGE_STREAM_CLIENT) { bson_append_bool(&change_stream_doc, "allChangesForCluster", 20, true); } bson_append_document_end(&change_stream_stage, &change_stream_doc); bson_array_builder_append_document_end(pipeline, &change_stream_stage); /* Append user pipeline if it exists */ if (bson_iter_init_find(&iter, &stream->pipeline_to_append, "pipeline") && BSON_ITER_HOLDS_ARRAY(&iter)) { bson_iter_t child_iter; BSON_ASSERT(bson_iter_recurse(&iter, &child_iter)); while (bson_iter_next(&child_iter)) { /* the user pipeline may consist of invalid stages or non-documents. * append anyway, and rely on the server error. */ bson_array_builder_append_value(pipeline, bson_iter_value(&child_iter)); } } bson_append_array_builder_end(command, pipeline); /* Add batch size if needed */ bson_append_document_begin(command, "cursor", 6, &cursor_doc); if (stream->batch_size >= 0) { // `batchSize:0` is supported and applied to `aggregate`. `batchSize:0` requests an immediate cursor. This is // useful to avoid a long-running server-side aggregate. Once created, `mongoc_change_stream_destroy` can use // `killCursors` to kill the server-side cursor. bson_append_int32(&cursor_doc, "batchSize", 9, stream->batch_size); } bson_append_document_end(command, &cursor_doc); } /*--------------------------------------------------------------------------- * * _make_cursor -- * * Construct and send the aggregate command and create the resulting * cursor. On error, stream->cursor remains NULL, otherwise it is * created and must be destroyed. * * Return: * False on error and sets stream->err. * *-------------------------------------------------------------------------- */ static bool _make_cursor(mongoc_change_stream_t *stream) { mongoc_client_session_t *cs = NULL; bson_t command_opts; bson_t command; /* { aggregate: "coll", pipeline: [], ... } */ bson_t reply; bson_t getmore_opts = BSON_INITIALIZER; bson_iter_t iter; mongoc_server_stream_t *server_stream; BSON_ASSERT(stream); BSON_ASSERT(!stream->cursor); bson_init(&command); bson_copy_to(&(stream->opts.extra), &command_opts); if (stream->opts.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&command_opts, "comment", 7, &stream->opts.comment); bson_append_value(&getmore_opts, "comment", 7, &stream->opts.comment); } if (bson_iter_init_find(&iter, &command_opts, "sessionId")) { if (!_mongoc_client_session_from_iter(stream->client, &iter, &cs, &stream->err)) { goto cleanup; } } else if (stream->implicit_session) { /* If an implicit session was created before, and this cursor is now * being recreated after resuming, then use the same session as before. */ cs = stream->implicit_session; if (!mongoc_client_session_append(cs, &command_opts, &stream->err)) { goto cleanup; } } else { /* Create an implicit session. This session lsid must be the same for the * agg command and the subsequent getMores. Thus, this implicit session is * passed as if it were an explicit session to * mongoc_client_read_command_with_opts and * _mongoc_cursor_change_stream_new, but it is still implicit and its * lifetime is owned by this change_stream_t. */ mongoc_session_opt_t *session_opts; session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(session_opts, false); /* returns NULL if sessions aren't supported. ignore errors. */ cs = mongoc_client_start_session(stream->client, session_opts, NULL); stream->implicit_session = cs; mongoc_session_opts_destroy(session_opts); if (cs && !mongoc_client_session_append(cs, &command_opts, &stream->err)) { goto cleanup; } } if (cs && !mongoc_client_session_append(cs, &getmore_opts, &stream->err)) { goto cleanup; } const mongoc_ss_log_context_t ss_log_context = {.operation = "aggregate"}; server_stream = mongoc_cluster_stream_for_reads( &stream->client->cluster, &ss_log_context, stream->read_prefs, cs, NULL, &reply, &stream->err); if (!server_stream) { bson_destroy(&stream->err_doc); bson_copy_to(&reply, &stream->err_doc); bson_destroy(&reply); goto cleanup; } bson_append_int32(&command_opts, "serverId", 8, server_stream->sd->id); bson_append_int32(&getmore_opts, "serverId", 8, server_stream->sd->id); stream->max_wire_version = server_stream->sd->max_wire_version; mongoc_server_stream_cleanup(server_stream); if (stream->read_concern && !bson_has_field(&command_opts, "readConcern")) { mongoc_read_concern_append(stream->read_concern, &command_opts); } _make_command(stream, &command); /* even though serverId has already been set, still pass the read prefs. * they are necessary for OP_MSG if sending to a secondary. */ if (!mongoc_client_read_command_with_opts( stream->client, stream->db, &command, stream->read_prefs, &command_opts, &reply, &stream->err)) { bson_destroy(&stream->err_doc); bson_copy_to(&reply, &stream->err_doc); bson_destroy(&reply); goto cleanup; } bson_append_bool(&getmore_opts, MONGOC_CURSOR_TAILABLE, MONGOC_CURSOR_TAILABLE_LEN, true); bson_append_bool(&getmore_opts, MONGOC_CURSOR_AWAIT_DATA, MONGOC_CURSOR_AWAIT_DATA_LEN, true); /* maxTimeMS is only appended to getMores if these are set in cursor opts. */ if (stream->max_await_time_ms > 0) { bson_append_int64(&getmore_opts, MONGOC_CURSOR_MAX_AWAIT_TIME_MS, MONGOC_CURSOR_MAX_AWAIT_TIME_MS_LEN, stream->max_await_time_ms); } if (stream->batch_size > 0) { bson_append_int32(&getmore_opts, MONGOC_CURSOR_BATCH_SIZE, MONGOC_CURSOR_BATCH_SIZE_LEN, stream->batch_size); } /* steals reply. */ stream->cursor = _mongoc_cursor_change_stream_new(stream->client, &reply, &getmore_opts); if (mongoc_cursor_error(stream->cursor, NULL)) { goto cleanup; } /* Change stream spec: "When aggregate or getMore returns: If an empty batch * was returned and a postBatchResumeToken was included, cache it." */ if (_mongoc_cursor_change_stream_end_of_batch(stream->cursor) && _mongoc_cursor_change_stream_has_post_batch_resume_token(stream->cursor)) { _set_resume_token(stream, _mongoc_cursor_change_stream_get_post_batch_resume_token(stream->cursor)); } /* Change stream spec: startAtOperationTime */ if (bson_empty(&stream->opts.resumeAfter) && bson_empty(&stream->opts.startAfter) && _mongoc_timestamp_empty(&stream->operation_time) && bson_empty(&stream->resume_token) && bson_iter_init_find(&iter, _mongoc_cursor_change_stream_get_reply(stream->cursor), "operationTime") && BSON_ITER_HOLDS_TIMESTAMP(&iter)) { _mongoc_timestamp_set_from_bson(&stream->operation_time, &iter); } cleanup: bson_destroy(&command); bson_destroy(&command_opts); bson_destroy(&getmore_opts); return stream->err.code == 0; } /*--------------------------------------------------------------------------- * * _change_stream_init -- * * Called after @stream has the collection name, database name, read * preferences, and read concern set. Creates the change streams * cursor. * *-------------------------------------------------------------------------- */ void _change_stream_init(mongoc_change_stream_t *stream, const bson_t *pipeline, const bson_t *opts) { BSON_ASSERT(pipeline); stream->max_await_time_ms = -1; stream->batch_size = -1; bson_init(&stream->pipeline_to_append); bson_init(&stream->resume_token); bson_init(&stream->err_doc); if (!_mongoc_change_stream_opts_parse(stream->client, opts, &stream->opts, &stream->err)) { return; } if (stream->opts.fullDocument) { stream->full_document = BCON_NEW("fullDocument", stream->opts.fullDocument); } if (stream->opts.fullDocumentBeforeChange) { stream->full_document_before_change = BCON_NEW("fullDocumentBeforeChange", stream->opts.fullDocumentBeforeChange); } _mongoc_timestamp_set(&stream->operation_time, &stream->opts.startAtOperationTime); stream->batch_size = stream->opts.batchSize; // `stream->opts.batchSize` is -1 if not present in `opts`. stream->max_await_time_ms = stream->opts.maxAwaitTimeMS; stream->show_expanded_events = stream->opts.showExpandedEvents; /* Accept two forms of user pipeline: * 1. A document like: { "pipeline": [...] } * 2. An array-like document: { "0": {}, "1": {}, ... } * If the passed pipeline is invalid, we pass it along and let the server * error instead. */ if (!bson_empty(pipeline)) { bson_iter_t iter; if (bson_iter_init_find(&iter, pipeline, "pipeline") && BSON_ITER_HOLDS_ARRAY(&iter)) { if (!BSON_APPEND_VALUE(&stream->pipeline_to_append, "pipeline", bson_iter_value(&iter))) { CHANGE_STREAM_ERR("pipeline"); } } else { if (!BSON_APPEND_ARRAY(&stream->pipeline_to_append, "pipeline", pipeline)) { CHANGE_STREAM_ERR("pipeline"); } } } if (stream->err.code == 0) { (void)_make_cursor(stream); } } mongoc_change_stream_t * _mongoc_change_stream_new_from_collection(const mongoc_collection_t *coll, const bson_t *pipeline, const bson_t *opts) { mongoc_change_stream_t *stream; BSON_ASSERT(coll); stream = BSON_ALIGNED_ALLOC0(mongoc_change_stream_t); stream->db = bson_strdup(coll->db); stream->coll = bson_strdup(coll->collection); stream->read_prefs = mongoc_read_prefs_copy(coll->read_prefs); stream->read_concern = mongoc_read_concern_copy(coll->read_concern); stream->client = coll->client; stream->change_stream_type = MONGOC_CHANGE_STREAM_COLLECTION; _change_stream_init(stream, pipeline, opts); return stream; } mongoc_change_stream_t * _mongoc_change_stream_new_from_database(const mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts) { mongoc_change_stream_t *stream; BSON_ASSERT(db); stream = BSON_ALIGNED_ALLOC0(mongoc_change_stream_t); stream->db = bson_strdup(db->name); stream->coll = NULL; stream->read_prefs = mongoc_read_prefs_copy(db->read_prefs); stream->read_concern = mongoc_read_concern_copy(db->read_concern); stream->client = db->client; stream->change_stream_type = MONGOC_CHANGE_STREAM_DATABASE; _change_stream_init(stream, pipeline, opts); return stream; } mongoc_change_stream_t * _mongoc_change_stream_new_from_client(mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts) { mongoc_change_stream_t *stream; BSON_ASSERT(client); stream = BSON_ALIGNED_ALLOC0(mongoc_change_stream_t); stream->db = bson_strdup("admin"); stream->coll = NULL; stream->read_prefs = mongoc_read_prefs_copy(client->read_prefs); stream->read_concern = mongoc_read_concern_copy(client->read_concern); stream->client = client; stream->change_stream_type = MONGOC_CHANGE_STREAM_CLIENT; _change_stream_init(stream, pipeline, opts); return stream; } const bson_t * mongoc_change_stream_get_resume_token(mongoc_change_stream_t *stream) { if (!bson_empty(&stream->resume_token)) { return &stream->resume_token; } return NULL; } bool mongoc_change_stream_next(mongoc_change_stream_t *stream, const bson_t **bson) { bson_iter_t iter; bson_t doc_resume_token; uint32_t len; const uint8_t *data; bool ret = false; BSON_ASSERT(stream); BSON_ASSERT(bson); if (stream->err.code != 0) { goto end; } BSON_ASSERT(stream->cursor); if (!mongoc_cursor_next(stream->cursor, bson)) { const bson_t *err_doc; bson_error_t err; bool resumable = false; if (!mongoc_cursor_error_document(stream->cursor, &err, &err_doc)) { /* no error occurred, just no documents left. */ goto end; } /* the cursor is closed. */ if (stream->cursor->cursor_id == 0) { _mongoc_set_error(&stream->err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance a closed change stream."); goto end; } resumable = _is_resumable_error(stream, err_doc); while (resumable) { /* recreate the cursor. */ mongoc_cursor_destroy(stream->cursor); stream->cursor = NULL; stream->resumed = true; if (!_make_cursor(stream)) { goto end; } if (mongoc_cursor_next(stream->cursor, bson)) { break; } if (!mongoc_cursor_error_document(stream->cursor, &err, &err_doc)) { goto end; } if (err_doc) { resumable = _is_resumable_error(stream, err_doc); } else { resumable = false; } } if (!resumable) { stream->err = err; bson_destroy(&stream->err_doc); bson_copy_to(err_doc, &stream->err_doc); goto end; } } /* we have received documents, either from the first call to next or after a * resume. */ stream->has_returned_results = true; if (!bson_iter_init_find(&iter, *bson, "_id") || !BSON_ITER_HOLDS_DOCUMENT(&iter)) { _mongoc_set_error(&stream->err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN, "Cannot provide resume functionality when the resume " "token is missing"); goto end; } /* copy the resume token. */ bson_iter_document(&iter, &len, &data); BSON_ASSERT(bson_init_static(&doc_resume_token, data, len)); _set_resume_token(stream, &doc_resume_token); /* clear out the operation time, since we no longer need it to resume. */ _mongoc_timestamp_clear(&stream->operation_time); ret = true; end: /* Change stream spec: Updating the Cached Resume Token */ if (stream->cursor && !mongoc_cursor_error(stream->cursor, NULL) && _mongoc_cursor_change_stream_end_of_batch(stream->cursor) && _mongoc_cursor_change_stream_has_post_batch_resume_token(stream->cursor)) { _set_resume_token(stream, _mongoc_cursor_change_stream_get_post_batch_resume_token(stream->cursor)); } /* Driver Sessions Spec: "When an implicit session is associated with a * cursor for use with getMore operations, the session MUST be returned to * the pool immediately following a getMore operation that indicates that the * cursor has been exhausted." */ if (stream->implicit_session) { /* if creating the change stream cursor errored, it may be null. */ if (!stream->cursor || stream->cursor->cursor_id == 0) { mongoc_client_session_destroy(stream->implicit_session); stream->implicit_session = NULL; } } return ret; } bool mongoc_change_stream_error_document(const mongoc_change_stream_t *stream, bson_error_t *err, const bson_t **bson) { BSON_ASSERT(stream); if (stream->err.code != 0) { if (err) { *err = stream->err; } if (bson) { *bson = &stream->err_doc; } return true; } if (bson) { *bson = NULL; } return false; } void mongoc_change_stream_destroy(mongoc_change_stream_t *stream) { if (!stream) { return; } bson_destroy(&stream->pipeline_to_append); bson_destroy(&stream->resume_token); bson_destroy(stream->full_document); bson_destroy(stream->full_document_before_change); bson_destroy(&stream->err_doc); _mongoc_change_stream_opts_cleanup(&stream->opts); mongoc_cursor_destroy(stream->cursor); mongoc_client_session_destroy(stream->implicit_session); mongoc_read_prefs_destroy(stream->read_prefs); mongoc_read_concern_destroy(stream->read_concern); bson_free(stream->db); bson_free(stream->coll); bson_free(stream); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-change-stream.h000066400000000000000000000024031511661753600253360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CHANGE_STREAM_H #define MONGOC_CHANGE_STREAM_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_change_stream_t mongoc_change_stream_t; MONGOC_EXPORT(void) mongoc_change_stream_destroy(mongoc_change_stream_t *); MONGOC_EXPORT(const bson_t *) mongoc_change_stream_get_resume_token(mongoc_change_stream_t *); MONGOC_EXPORT(bool) mongoc_change_stream_next(mongoc_change_stream_t *, const bson_t **); MONGOC_EXPORT(bool) mongoc_change_stream_error_document(const mongoc_change_stream_t *, bson_error_t *, const bson_t **); BSON_END_DECLS #endif /* MONGOC_CHANGE_STREAM_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-pool-private.h000066400000000000000000000024601511661753600265200ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_POOL_PRIVATE_H #define MONGOC_CLIENT_POOL_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS /* for tests */ void _mongoc_client_pool_set_stream_initiator(mongoc_client_pool_t *pool, mongoc_stream_initiator_t si, void *user_data); size_t mongoc_client_pool_get_size(mongoc_client_pool_t *pool); size_t mongoc_client_pool_num_pushed(mongoc_client_pool_t *pool); mongoc_topology_t * _mongoc_client_pool_get_topology(mongoc_client_pool_t *pool); BSON_END_DECLS #endif /* MONGOC_CLIENT_POOL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-pool.c000066400000000000000000000505711511661753600250510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L #include #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include #endif struct _mongoc_client_pool_t { bson_mutex_t mutex; mongoc_cond_t cond; mongoc_queue_t queue; mongoc_topology_t *topology; mongoc_uri_t *uri; uint32_t max_pool_size; uint32_t size; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t ssl_opts; bool ssl_opts_set; #endif bool apm_callbacks_set; bool error_api_set; bool structured_log_opts_set; bool client_initialized; int32_t error_api_version; mongoc_server_api_t *api; // `last_known_serverids` is a sorted array of uint32_t. mongoc_array_t last_known_serverids; }; #ifdef MONGOC_ENABLE_SSL void mongoc_client_pool_set_ssl_opts(mongoc_client_pool_t *pool, const mongoc_ssl_opt_t *opts) { BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); _mongoc_ssl_opts_cleanup(&pool->ssl_opts, false /* don't free internal opts. */); pool->ssl_opts_set = false; if (opts) { _mongoc_ssl_opts_copy_to(opts, &pool->ssl_opts, false /* don't overwrite internal opts. */); pool->ssl_opts_set = true; /* Update the OpenSSL context associated with this client pool to match new ssl opts. */ /* All future clients popped from pool inherit this OpenSSL context. */ #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX_free(pool->topology->scanner->openssl_ctx); pool->topology->scanner->openssl_ctx = _mongoc_openssl_ctx_new(&pool->ssl_opts); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) // Access to secure_channel_cred_ptr does not need the thread-safe `mongoc_atomic_*` functions. // secure_channel_cred_ptr is not expected to be modified by multiple threads. // mongoc_client_pool_set_ssl_opts documentation prohibits calling after threads start. mongoc_shared_ptr_reset(&pool->topology->scanner->secure_channel_cred_ptr, mongoc_secure_channel_cred_new(&pool->ssl_opts), mongoc_secure_channel_cred_deleter); #endif } mongoc_topology_scanner_set_ssl_opts(pool->topology->scanner, &pool->ssl_opts); bson_mutex_unlock(&pool->mutex); } void _mongoc_client_pool_set_internal_tls_opts(mongoc_client_pool_t *pool, _mongoc_internal_tls_opts_t *internal) { BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); if (!pool->ssl_opts_set) { bson_mutex_unlock(&pool->mutex); return; } pool->ssl_opts.internal = bson_malloc(sizeof(_mongoc_internal_tls_opts_t)); memcpy(pool->ssl_opts.internal, internal, sizeof(_mongoc_internal_tls_opts_t)); bson_mutex_unlock(&pool->mutex); } #endif mongoc_client_pool_t * mongoc_client_pool_new(const mongoc_uri_t *uri) { mongoc_client_pool_t *pool; bson_error_t error = {0}; if (!(pool = mongoc_client_pool_new_with_error(uri, &error))) { MONGOC_ERROR("%s", error.message); } return pool; } // Defined in mongoc-init.c. extern bool mongoc_get_init_called(void); mongoc_client_pool_t * mongoc_client_pool_new_with_error(const mongoc_uri_t *uri, bson_error_t *error) { mongoc_topology_t *topology; mongoc_client_pool_t *pool; const bson_t *b; bson_iter_t iter; const char *appname; ENTRY; BSON_ASSERT(uri); if (!mongoc_get_init_called()) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_NOT_READY, "Attempting to create client pool, but libmongoc not initialized. Call mongoc_init"); return NULL; } #ifndef MONGOC_ENABLE_SSL if (mongoc_uri_get_tls(uri)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Can't create SSL client pool, SSL not enabled in this " "build."); return NULL; } #endif topology = mongoc_topology_new(uri, false); if (!topology->valid) { if (error) { memcpy(error, &topology->scanner->error, sizeof(bson_error_t)); } mongoc_topology_destroy(topology); RETURN(NULL); } pool = (mongoc_client_pool_t *)bson_malloc0(sizeof *pool); _mongoc_array_init(&pool->last_known_serverids, sizeof(uint32_t)); bson_mutex_init(&pool->mutex); mongoc_cond_init(&pool->cond); _mongoc_queue_init(&pool->queue); pool->uri = mongoc_uri_copy(uri); pool->max_pool_size = 100; pool->size = 0; pool->topology = topology; pool->error_api_version = MONGOC_ERROR_API_VERSION_LEGACY; b = mongoc_uri_get_options(pool->uri); if (bson_iter_init_find_case(&iter, b, MONGOC_URI_MAXPOOLSIZE)) { if (BSON_ITER_HOLDS_INT32(&iter)) { pool->max_pool_size = BSON_MAX(1, bson_iter_int32(&iter)); } } appname = mongoc_uri_get_option_as_utf8(pool->uri, MONGOC_URI_APPNAME, NULL); if (appname) { /* the appname should have already been validated */ BSON_ASSERT(mongoc_client_pool_set_appname(pool, appname)); } #ifdef MONGOC_ENABLE_SSL if (mongoc_uri_get_tls(pool->uri)) { mongoc_ssl_opt_t ssl_opt = {0}; _mongoc_internal_tls_opts_t internal_tls_opts = {0}; _mongoc_ssl_opts_from_uri(&ssl_opt, &internal_tls_opts, pool->uri); /* sets use_ssl = true */ mongoc_client_pool_set_ssl_opts(pool, &ssl_opt); _mongoc_client_pool_set_internal_tls_opts(pool, &internal_tls_opts); } #endif mongoc_counter_client_pools_active_inc(); RETURN(pool); } void mongoc_client_pool_destroy(mongoc_client_pool_t *pool) { mongoc_client_t *client; ENTRY; if (!pool) { EXIT; } if (!mongoc_server_session_pool_is_empty(pool->topology->session_pool)) { client = mongoc_client_pool_pop(pool); _mongoc_client_end_sessions(client); mongoc_client_pool_push(pool, client); } while ((client = (mongoc_client_t *)_mongoc_queue_pop_head(&pool->queue))) { mongoc_client_destroy(client); } mongoc_topology_destroy(pool->topology); mongoc_uri_destroy(pool->uri); bson_mutex_destroy(&pool->mutex); mongoc_cond_destroy(&pool->cond); mongoc_server_api_destroy(pool->api); #ifdef MONGOC_ENABLE_SSL _mongoc_ssl_opts_cleanup(&pool->ssl_opts, true); #endif _mongoc_array_destroy(&pool->last_known_serverids); bson_free(pool); mongoc_counter_client_pools_active_dec(); mongoc_counter_client_pools_disposed_inc(); EXIT; } /* * Start the background topology scanner. * * This function assumes the pool's mutex is locked */ static void _start_scanner_if_needed(mongoc_client_pool_t *pool) { BSON_ASSERT_PARAM(pool); if (!pool->topology->single_threaded) { _mongoc_topology_background_monitoring_start(pool->topology); } } static void _initialize_new_client(mongoc_client_pool_t *pool, mongoc_client_t *client) { BSON_ASSERT_PARAM(pool); BSON_ASSERT_PARAM(client); /* for tests */ _mongoc_client_set_stream_initiator_single_or_pooled( client, pool->topology->scanner->initiator, pool->topology->scanner->initiator_context); pool->client_initialized = true; client->error_api_version = pool->error_api_version; client->api = mongoc_server_api_copy(pool->api); #ifdef MONGOC_ENABLE_SSL if (pool->ssl_opts_set) { _mongoc_client_set_ssl_opts_for_single_or_pooled(client, &pool->ssl_opts); } #endif } mongoc_client_t * mongoc_client_pool_pop(mongoc_client_pool_t *pool) { mongoc_client_t *client; int r; ENTRY; BSON_ASSERT_PARAM(pool); mlib_timer expires_at = mlib_expires_never(); const int32_t wait_queue_timeout_ms = mongoc_uri_get_option_as_int32(pool->uri, MONGOC_URI_WAITQUEUETIMEOUTMS, -1); if (wait_queue_timeout_ms > 0) { expires_at = mlib_expires_after(wait_queue_timeout_ms, ms); } bson_mutex_lock(&pool->mutex); again: if (!(client = (mongoc_client_t *)_mongoc_queue_pop_head(&pool->queue))) { if (pool->size < pool->max_pool_size) { client = _mongoc_client_new_from_topology(pool->topology); BSON_ASSERT(client); _initialize_new_client(pool, client); pool->size++; } else { if (wait_queue_timeout_ms > 0) { if (!mlib_timer_is_expired(expires_at)) { const mlib_duration remain = mlib_timer_remaining(expires_at); r = mongoc_cond_timedwait(&pool->cond, &pool->mutex, mlib_milliseconds_count(remain)); if (mongo_cond_ret_is_timedout(r)) { GOTO(done); } } else { GOTO(done); } } else { mongoc_cond_wait(&pool->cond, &pool->mutex); } GOTO(again); } } _start_scanner_if_needed(pool); done: bson_mutex_unlock(&pool->mutex); RETURN(client); } mongoc_client_t * mongoc_client_pool_try_pop(mongoc_client_pool_t *pool) { mongoc_client_t *client; ENTRY; BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); if (!(client = (mongoc_client_t *)_mongoc_queue_pop_head(&pool->queue))) { if (pool->size < pool->max_pool_size) { client = _mongoc_client_new_from_topology(pool->topology); BSON_ASSERT(client); _initialize_new_client(pool, client); pool->size++; } } if (client) { _start_scanner_if_needed(pool); } bson_mutex_unlock(&pool->mutex); RETURN(client); } typedef struct { mongoc_array_t *known_server_ids; mongoc_cluster_t *cluster; } prune_ctx; static int server_id_cmp(const void *a_, const void *b_) { const uint32_t *const a = (const uint32_t *)a_; const uint32_t *const b = (const uint32_t *)b_; if (*a == *b) { return 0; } return *a < *b ? -1 : 1; } // `maybe_prune` removes a `mongoc_cluster_node_t` if the node refers to a removed server. static bool maybe_prune(void *item, void *ctx_) { mongoc_cluster_node_t *cn = (mongoc_cluster_node_t *)item; prune_ctx *ctx = (prune_ctx *)ctx_; // Get the server ID from the cluster node. uint32_t server_id = cn->handshake_sd->id; // Check if the cluster node's server ID references a removed server. if (!bsearch(&server_id, ctx->known_server_ids->data, ctx->known_server_ids->len, sizeof(uint32_t), server_id_cmp)) { mongoc_cluster_disconnect_node(ctx->cluster, server_id); } return true; } // `prune_client` closes connections from `client` to servers not contained in `known_server_ids`. static void prune_client(mongoc_client_t *client, mongoc_array_t *known_server_ids) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(known_server_ids); mongoc_cluster_t *cluster = &client->cluster; prune_ctx ctx = {.cluster = cluster, .known_server_ids = known_server_ids}; mongoc_set_for_each(cluster->nodes, maybe_prune, &ctx); } void mongoc_client_pool_push(mongoc_client_pool_t *pool, mongoc_client_t *client) { ENTRY; BSON_ASSERT_PARAM(pool); BSON_ASSERT_PARAM(client); /* reset sockettimeoutms to the default in case it was changed with mongoc_client_set_sockettimeoutms() */ mongoc_cluster_reset_sockettimeoutms(&client->cluster); bson_mutex_lock(&pool->mutex); // Check if `last_known_server_ids` needs update. bool serverids_have_changed = false; { mongoc_array_t current_serverids; _mongoc_array_init(¤t_serverids, sizeof(uint32_t)); { mc_shared_tpld td = mc_tpld_take_ref(pool->topology); const mongoc_set_t *servers = mc_tpld_servers_const(td.ptr); for (size_t i = 0; i < servers->items_len; i++) { _mongoc_array_append_val(¤t_serverids, servers->items[i].id); } mc_tpld_drop_ref(&td); } serverids_have_changed = (current_serverids.len != pool->last_known_serverids.len) || memcmp(current_serverids.data, pool->last_known_serverids.data, current_serverids.len * current_serverids.element_size) != 0; if (serverids_have_changed) { _mongoc_array_destroy(&pool->last_known_serverids); pool->last_known_serverids = current_serverids; // Ownership transfer. } else { _mongoc_array_destroy(¤t_serverids); } } // Check if pooled clients need to be pruned. if (serverids_have_changed) { // The set of last known server IDs has changed. Prune all clients in pool. mongoc_queue_item_t *ptr = pool->queue.head; while (ptr != NULL) { prune_client((mongoc_client_t *)ptr->data, &pool->last_known_serverids); ptr = ptr->next; } } // Always prune incoming client. The topology may have changed while client was checked out. prune_client(client, &pool->last_known_serverids); // Push client back into pool. _mongoc_queue_push_head(&pool->queue, client); mongoc_cond_signal(&pool->cond); bson_mutex_unlock(&pool->mutex); EXIT; } /* for tests */ void _mongoc_client_pool_set_stream_initiator(mongoc_client_pool_t *pool, mongoc_stream_initiator_t si, void *context) { BSON_ASSERT_PARAM(pool); // Do not permit overriding initializer after calls to `mongoc_client_pool_pop`. BSON_ASSERT(!pool->client_initialized); mongoc_topology_scanner_set_stream_initiator(pool->topology->scanner, si, context); } /* for tests */ size_t mongoc_client_pool_get_size(mongoc_client_pool_t *pool) { size_t size = 0; ENTRY; BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); size = pool->size; bson_mutex_unlock(&pool->mutex); RETURN(size); } size_t mongoc_client_pool_num_pushed(mongoc_client_pool_t *pool) { size_t num_pushed = 0; ENTRY; BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); num_pushed = pool->queue.length; bson_mutex_unlock(&pool->mutex); RETURN(num_pushed); } mongoc_topology_t * _mongoc_client_pool_get_topology(mongoc_client_pool_t *pool) { BSON_ASSERT_PARAM(pool); return pool->topology; } void mongoc_client_pool_max_size(mongoc_client_pool_t *pool, uint32_t max_pool_size) { ENTRY; BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); pool->max_pool_size = max_pool_size; bson_mutex_unlock(&pool->mutex); EXIT; } bool mongoc_client_pool_set_apm_callbacks(mongoc_client_pool_t *pool, mongoc_apm_callbacks_t *callbacks, void *context) { BSON_ASSERT_PARAM(pool); BSON_OPTIONAL_PARAM(callbacks); BSON_OPTIONAL_PARAM(context); // Enforce documented thread-safety restrictions if (pool->apm_callbacks_set) { MONGOC_ERROR("mongoc_client_pool_set_apm_callbacks can only be called once per pool"); return false; } else if (pool->client_initialized) { MONGOC_ERROR("mongoc_client_pool_set_apm_callbacks can only be called before mongoc_client_pool_pop"); /* @todo Since 2017 this requirement has been documented but not actually enforced. For now we are leaving it * unenforced, for backward compatibility. This usage remains unsafe and incorrect. When possible, this should be * modified to return false without modifying the APM callbacks. */ mongoc_log_and_monitor_instance_set_apm_callbacks(&pool->topology->log_and_monitor, callbacks, context); pool->apm_callbacks_set = true; return true; } else { // Now we can be sure no other threads are relying on concurrent access to the instance yet. mongoc_log_and_monitor_instance_set_apm_callbacks(&pool->topology->log_and_monitor, callbacks, context); pool->apm_callbacks_set = true; return true; } } bool mongoc_client_pool_set_structured_log_opts(mongoc_client_pool_t *pool, const mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(pool); BSON_OPTIONAL_PARAM(opts); /* The documented restriction for most pool options: They can be set at most once, * and only before the first client is initialized. Structured logging is generally * expected to warn but not quit when encountering initialization errors. */ if (pool->structured_log_opts_set) { MONGOC_ERROR("mongoc_client_pool_set_structured_log_opts can only be called once per pool"); return false; } else if (pool->client_initialized) { MONGOC_ERROR("mongoc_client_pool_set_structured_log_opts can only be called before mongoc_client_pool_pop"); return false; } else { // Now we can be sure no other threads are relying on concurrent access to the instance yet. mongoc_log_and_monitor_instance_set_structured_log_opts(&pool->topology->log_and_monitor, opts); pool->structured_log_opts_set = true; return true; } } bool mongoc_client_pool_set_error_api(mongoc_client_pool_t *pool, int32_t version) { if (version != MONGOC_ERROR_API_VERSION_LEGACY && version != MONGOC_ERROR_API_VERSION_2) { MONGOC_ERROR("Unsupported Error API Version: %" PRId32, version); return false; } BSON_ASSERT_PARAM(pool); if (pool->error_api_set) { MONGOC_ERROR("Can only set Error API Version once"); return false; } pool->error_api_version = version; pool->error_api_set = true; return true; } bool mongoc_client_pool_set_appname(mongoc_client_pool_t *pool, const char *appname) { bool ret; BSON_ASSERT_PARAM(pool); bson_mutex_lock(&pool->mutex); ret = _mongoc_topology_set_appname(pool->topology, appname); bson_mutex_unlock(&pool->mutex); return ret; } bool mongoc_client_pool_enable_auto_encryption(mongoc_client_pool_t *pool, mongoc_auto_encryption_opts_t *opts, bson_error_t *error) { BSON_ASSERT_PARAM(pool); return _mongoc_cse_client_pool_enable_auto_encryption(pool->topology, opts, error); } bool mongoc_client_pool_set_server_api(mongoc_client_pool_t *pool, const mongoc_server_api_t *api, bson_error_t *error) { BSON_ASSERT_PARAM(pool); BSON_ASSERT_PARAM(api); if (pool->api) { _mongoc_set_error( error, MONGOC_ERROR_POOL, MONGOC_ERROR_POOL_API_ALREADY_SET, "Cannot set server api more than once per pool"); return false; } if (pool->client_initialized) { _mongoc_set_error(error, MONGOC_ERROR_POOL, MONGOC_ERROR_POOL_API_TOO_LATE, "Cannot set server api after a client has been created"); return false; } pool->api = mongoc_server_api_copy(api); _mongoc_topology_scanner_set_server_api(pool->topology->scanner, api); return true; } bool mongoc_client_pool_set_oidc_callback(mongoc_client_pool_t *pool, const mongoc_oidc_callback_t *callback) { BSON_ASSERT_PARAM(pool); BSON_ASSERT_PARAM(callback); if (mongoc_oidc_cache_has_user_callback(pool->topology->oidc_cache)) { MONGOC_ERROR("mongoc_client_pool_set_oidc_callback can only be called once per pool"); return false; } if (pool->client_initialized) { MONGOC_ERROR("mongoc_client_pool_set_oidc_callback can only be called before mongoc_client_pool_pop"); return false; } mongoc_oidc_cache_set_user_callback(pool->topology->oidc_cache, callback); return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-pool.h000066400000000000000000000057131511661753600250540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_POOL_H #define MONGOC_CLIENT_POOL_H #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #include #include BSON_BEGIN_DECLS typedef struct _mongoc_client_pool_t mongoc_client_pool_t; MONGOC_EXPORT(mongoc_client_pool_t *) mongoc_client_pool_new(const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_client_pool_t *) mongoc_client_pool_new_with_error(const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_pool_destroy(mongoc_client_pool_t *pool); MONGOC_EXPORT(mongoc_client_t *) mongoc_client_pool_pop(mongoc_client_pool_t *pool) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_pool_push(mongoc_client_pool_t *pool, mongoc_client_t *client); MONGOC_EXPORT(mongoc_client_t *) mongoc_client_pool_try_pop(mongoc_client_pool_t *pool) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_pool_max_size(mongoc_client_pool_t *pool, uint32_t max_pool_size); #ifdef MONGOC_ENABLE_SSL MONGOC_EXPORT(void) mongoc_client_pool_set_ssl_opts(mongoc_client_pool_t *pool, const mongoc_ssl_opt_t *opts); #endif MONGOC_EXPORT(bool) mongoc_client_pool_set_apm_callbacks(mongoc_client_pool_t *pool, mongoc_apm_callbacks_t *callbacks, void *context); MONGOC_EXPORT(bool) mongoc_client_pool_set_error_api(mongoc_client_pool_t *pool, int32_t version); MONGOC_EXPORT(bool) mongoc_client_pool_set_appname(mongoc_client_pool_t *pool, const char *appname); MONGOC_EXPORT(bool) mongoc_client_pool_enable_auto_encryption(mongoc_client_pool_t *pool, mongoc_auto_encryption_opts_t *opts, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_pool_set_server_api(mongoc_client_pool_t *pool, const mongoc_server_api_t *api, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_pool_set_structured_log_opts(mongoc_client_pool_t *pool, const mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(bool) mongoc_client_pool_set_oidc_callback(mongoc_client_pool_t *pool, const mongoc_oidc_callback_t *callback); BSON_END_DECLS #endif /* MONGOC_CLIENT_POOL_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-private.h000066400000000000000000000207001511661753600255460ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_PRIVATE_H #define MONGOC_CLIENT_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #include #include #include #include #include BSON_BEGIN_DECLS /* first version to support hint for "update" command */ #define WIRE_VERSION_UPDATE_HINT 8 /* version corresponding to server 4.2 release */ #define WIRE_VERSION_4_2 8 /* version corresponding to client side field level encryption support. */ #define WIRE_VERSION_CSE 8 /* first version to throw server-side errors for unsupported hint in * "findAndModify" command */ #define WIRE_VERSION_FIND_AND_MODIFY_HINT_SERVER_SIDE_ERROR 8 /* first version to support hint for "delete" command */ #define WIRE_VERSION_DELETE_HINT 9 /* first version to support hint for "findAndModify" command */ #define WIRE_VERSION_FIND_AND_MODIFY_HINT 9 /* version corresponding to server 4.4 release */ #define WIRE_VERSION_4_4 9 /* version corresponding to retryable writes error label */ #define WIRE_VERSION_RETRYABLE_WRITE_ERROR_LABEL 9 /* first version to support server hedged reads */ #define WIRE_VERSION_HEDGED_READS 9 /* first version to support estimatedDocumentCount with collStats */ #define WIRE_VERSION_4_9 12 /* version corresponding to server 5.0 release */ #define WIRE_VERSION_5_0 13 /* first version to support snapshot reads */ #define WIRE_VERSION_SNAPSHOT_READS 13 /* version corresponding to server 5.1 release */ #define WIRE_VERSION_5_1 14 /* version corresponding to server 6.0 release */ #define WIRE_VERSION_6_0 17 /* version corresponding to server 7.0 release */ #define WIRE_VERSION_7_0 21 /* version corresponding to server 7.1 release */ #define WIRE_VERSION_7_1 22 #define WIRE_VERSION_MONGOS_EXHAUST 22 /* version corresponding to server 8.0 release */ #define WIRE_VERSION_8_0 25 /* Range of wire protocol versions this driver supports. Bumping * WIRE_VERSION_MAX must be accompanied by an update to * `_mongoc_wire_version_to_server_version`. */ #define WIRE_VERSION_MIN WIRE_VERSION_4_2 /* a.k.a. minWireVersion */ #define WIRE_VERSION_MAX WIRE_VERSION_8_0 /* a.k.a. maxWireVersion */ struct _mongoc_collection_t; struct _mongoc_client_t { mongoc_uri_t *uri; mongoc_cluster_t cluster; bool in_exhaust; mongoc_stream_initiator_t initiator; void *initiator_data; #ifdef MONGOC_ENABLE_SSL bool use_ssl; mongoc_ssl_opt_t ssl_opts; #endif mongoc_topology_t *topology; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; int32_t error_api_version; bool error_api_set; mongoc_server_api_t *api; /* mongoc_client_session_t's in use, to look up lsids and clusterTimes */ mongoc_set_t *client_sessions; unsigned int csid_rand_seed; uint32_t generation; }; /* Defines whether _mongoc_client_command_with_opts() is acting as a read * command helper for a command like "distinct", or a write command helper for * a command like "createRole", or both, like "aggregate" with "$out". */ typedef enum { MONGOC_CMD_RAW = 0, MONGOC_CMD_READ = 1, MONGOC_CMD_WRITE = 2, MONGOC_CMD_RW = 3, } mongoc_command_mode_t; BSON_STATIC_ASSERT2(mongoc_cmd_rw, MONGOC_CMD_RW == (MONGOC_CMD_READ | MONGOC_CMD_WRITE)); /* TODO (CDRIVER-4052): Move MONGOC_RR_DEFAULT_BUFFER_SIZE and * _mongoc_client_get_rr to mongoc-topology-private.h or in a separate file. * There is no reason these should be in mongoc-client. */ #define MONGOC_RR_DEFAULT_BUFFER_SIZE 1024 bool _mongoc_client_get_rr(const char *hostname, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error); mongoc_client_t * _mongoc_client_new_from_topology(mongoc_topology_t *topology); mongoc_stream_t * mongoc_client_default_stream_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error); mongoc_stream_t * _mongoc_client_create_stream(mongoc_client_t *client, const mongoc_host_list_t *host, bson_error_t *error); bool _mongoc_client_recv(mongoc_client_t *client, mcd_rpc_message *rpc, mongoc_buffer_t *buffer, mongoc_server_stream_t *server_stream, bson_error_t *error); void _mongoc_client_kill_cursor(mongoc_client_t *client, uint32_t server_id, int64_t cursor_id, const char *db, const char *collection, mongoc_client_session_t *cs); bool _mongoc_client_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, mongoc_command_mode_t mode, const bson_t *opts, mongoc_query_flags_t flags, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, mongoc_read_concern_t *default_rc, mongoc_write_concern_t *default_wc, bson_t *reply, bson_error_t *error); mongoc_server_session_t * _mongoc_client_pop_server_session(mongoc_client_t *client, const mongoc_ss_log_context_t *log_context, bson_error_t *error); bool _mongoc_client_lookup_session(const mongoc_client_t *client, uint32_t client_session_id, mongoc_client_session_t **cs, bson_error_t *error); void _mongoc_client_unregister_session(mongoc_client_t *client, mongoc_client_session_t *session); void _mongoc_client_push_server_session(mongoc_client_t *client, mongoc_server_session_t *server_session); void _mongoc_client_end_sessions(mongoc_client_t *client); mongoc_stream_t * mongoc_client_connect_tcp(int32_t connecttimeoutms, const mongoc_host_list_t *host, bson_error_t *error); mongoc_stream_t * mongoc_client_connect(bool use_ssl, void *ssl_opts_void, const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *openssl_ctx_void, mongoc_shared_ptr secure_channel_cred_ptr, bson_error_t *error); /* Returns true if a versioned server API has been selected, otherwise returns * false. */ bool mongoc_client_uses_server_api(const mongoc_client_t *client); /* Returns true if load balancing mode has been selected, otherwise returns * false. */ bool mongoc_client_uses_loadbalanced(const mongoc_client_t *client); void _mongoc_client_set_ssl_opts_for_single_or_pooled(mongoc_client_t *client, const mongoc_ssl_opt_t *opts); void _mongoc_client_set_stream_initiator_single_or_pooled(mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data); BSON_END_DECLS #endif /* MONGOC_CLIENT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-session-private.h000066400000000000000000000116071511661753600272350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_SESSION_PRIVATE_H #define MONGOC_CLIENT_SESSION_PRIVATE_H #include // IWYU pragma: export // #include /* error labels: see Transactions Spec */ #define TRANSIENT_TXN_ERR "TransientTransactionError" #define UNKNOWN_COMMIT_RESULT "UnknownTransactionCommitResult" #define MAX_TIME_MS_EXPIRED "MaxTimeMSExpired" #define DEFAULT_MAX_COMMIT_TIME_MS 0 #define SESSION_NEVER_USED (-1) #define MONGOC_DEFAULT_WTIMEOUT_FOR_COMMIT_RETRY 10000 struct _mongoc_transaction_opt_t { mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; mongoc_read_prefs_t *read_prefs; int64_t max_commit_time_ms; }; struct _mongoc_session_opt_t { mongoc_optional_t causal_consistency; mongoc_optional_t snapshot; mongoc_transaction_opt_t default_txn_opts; }; typedef struct _mongoc_server_session_t { int64_t last_used_usec; bson_t lsid; /* logical session id */ int64_t txn_number; /* transaction number */ bool dirty; } mongoc_server_session_t; typedef enum { MONGOC_INTERNAL_TRANSACTION_NONE, MONGOC_INTERNAL_TRANSACTION_STARTING, MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS, MONGOC_INTERNAL_TRANSACTION_ENDING, MONGOC_INTERNAL_TRANSACTION_COMMITTED, MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY, MONGOC_INTERNAL_TRANSACTION_ABORTED, } mongoc_internal_transaction_state_t; typedef struct _mongoc_transaction_t { mongoc_internal_transaction_state_t state; mongoc_transaction_opt_t opts; } mongoc_transaction_t; struct _mongoc_client_session_t { mongoc_client_t *client; mongoc_session_opt_t opts; mongoc_server_session_t *server_session; mongoc_transaction_t txn; uint32_t client_session_id; bson_t cluster_time; uint32_t operation_timestamp; uint32_t operation_increment; uint32_t client_generation; uint32_t server_id; bson_t *recovery_token; uint32_t snapshot_time_timestamp; uint32_t snapshot_time_increment; bool snapshot_time_set; /* For testing only */ int64_t with_txn_timeout_ms; const char *fail_commit_label; }; bool _mongoc_parse_cluster_time(const bson_t *cluster_time, uint32_t *timestamp, uint32_t *increment); bool _mongoc_cluster_time_greater(const bson_t *new, const bson_t *old); void _mongoc_client_session_handle_reply(mongoc_client_session_t *session, bool is_acknowledged, const char *cmd_name, const bson_t *reply); bool _mongoc_server_session_init(mongoc_server_session_t *session, bson_error_t *error); void _mongoc_server_session_destroy(mongoc_server_session_t *session); bool _mongoc_server_session_timed_out(const mongoc_server_session_t *server_session, int64_t session_timeout_minutes); mongoc_client_session_t * _mongoc_client_session_new(mongoc_client_t *client, mongoc_server_session_t *server_session, const mongoc_session_opt_t *opts, uint32_t client_session_id); bool _mongoc_client_session_from_iter(mongoc_client_t *client, const bson_iter_t *iter, mongoc_client_session_t **cs, bson_error_t *error); bool _mongoc_client_session_in_txn(const mongoc_client_session_t *session); bool _mongoc_client_session_in_txn_or_ending(const mongoc_client_session_t *session); bool _mongoc_client_session_txn_in_progress(const mongoc_client_session_t *session); bool _mongoc_client_session_append_txn(mongoc_client_session_t *session, bson_t *cmd, bson_error_t *error); void _mongoc_client_session_append_read_concern(const mongoc_client_session_t *cs, const bson_t *user_read_concern, bool is_read_command, bson_t *cmd); void _mongoc_client_session_unpin(mongoc_client_session_t *session); void _mongoc_client_session_pin(mongoc_client_session_t *session, uint32_t server_id); void _mongoc_client_session_set_snapshot_time(mongoc_client_session_t *session, uint32_t t, uint32_t i); void _mongoc_client_session_clear_snapshot_time(mongoc_client_session_t *session); #endif /* MONGOC_CLIENT_SESSION_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-session.c000066400000000000000000001425511511661753600255630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #define WITH_TXN_TIMEOUT_MS (120 * 1000) static void txn_opts_set(mongoc_transaction_opt_t *opts, const mongoc_read_concern_t *read_concern, const mongoc_write_concern_t *write_concern, const mongoc_read_prefs_t *read_prefs, int64_t max_commit_time_ms) { if (read_concern) { mongoc_transaction_opts_set_read_concern(opts, read_concern); } if (write_concern) { mongoc_transaction_opts_set_write_concern(opts, write_concern); } if (read_prefs) { mongoc_transaction_opts_set_read_prefs(opts, read_prefs); } if (max_commit_time_ms != DEFAULT_MAX_COMMIT_TIME_MS) { mongoc_transaction_opts_set_max_commit_time_ms(opts, max_commit_time_ms); } } static void txn_opts_cleanup(mongoc_transaction_opt_t *opts) { /* null inputs are ok */ mongoc_read_concern_destroy(opts->read_concern); mongoc_write_concern_destroy(opts->write_concern); mongoc_read_prefs_destroy(opts->read_prefs); /* prepare opts for reuse */ opts->read_concern = NULL; opts->write_concern = NULL; opts->read_prefs = NULL; opts->max_commit_time_ms = DEFAULT_MAX_COMMIT_TIME_MS; } static void txn_opts_copy(const mongoc_transaction_opt_t *src, mongoc_transaction_opt_t *dst) { txn_opts_cleanup(dst); /* null inputs are ok for these copy functions */ dst->read_concern = mongoc_read_concern_copy(src->read_concern); dst->write_concern = mongoc_write_concern_copy(src->write_concern); dst->read_prefs = mongoc_read_prefs_copy(src->read_prefs); dst->max_commit_time_ms = src->max_commit_time_ms; } static bool txn_abort(mongoc_client_session_t *session, bson_t *reply, bson_error_t *error) { bson_t cmd = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; bson_error_t err_local; bson_error_t *err_ptr = error ? error : &err_local; bson_t reply_local = BSON_INITIALIZER; bool r = false; _mongoc_bson_init_if_set(reply); if (!mongoc_client_session_append(session, &opts, err_ptr)) { GOTO(done); } if (session->txn.opts.write_concern) { if (!mongoc_write_concern_append(session->txn.opts.write_concern, &opts)) { _mongoc_set_error(err_ptr, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Invalid transaction write concern"); GOTO(done); } } BSON_APPEND_INT32(&cmd, "abortTransaction", 1); if (session->recovery_token) { BSON_APPEND_DOCUMENT(&cmd, "recoveryToken", session->recovery_token); } /* will be reinitialized by mongoc_client_write_command_with_opts */ bson_destroy(&reply_local); r = mongoc_client_write_command_with_opts(session->client, "admin", &cmd, &opts, &reply_local, err_ptr); /* Transactions Spec: "Drivers MUST retry the commitTransaction command once * after it fails with a retryable error", same for abort. Note that a * RetryableWriteError label has already been appended here. */ if (mongoc_error_has_label(&reply_local, RETRYABLE_WRITE_ERROR)) { _mongoc_client_session_unpin(session); bson_destroy(&reply_local); r = mongoc_client_write_command_with_opts(session->client, "admin", &cmd, &opts, &reply_local, err_ptr); } if (!r) { /* we won't return an error from abortTransaction, so warn */ MONGOC_WARNING("Error in abortTransaction: %s", err_ptr->message); _mongoc_client_session_unpin(session); } done: bson_destroy(&reply_local); bson_destroy(&cmd); bson_destroy(&opts); return r; } static mongoc_write_concern_t * create_commit_retry_wc(const mongoc_write_concern_t *existing_wc) { mongoc_write_concern_t *wc; wc = existing_wc ? mongoc_write_concern_copy(existing_wc) : mongoc_write_concern_new(); /* Transactions spec: "If the modified write concern does not include a * wtimeout value, drivers MUST also apply wtimeout: 10000 to the write * concern in order to avoid waiting forever if the majority write concern * cannot be satisfied." */ if (mongoc_write_concern_get_wtimeout_int64(wc) <= 0) { mongoc_write_concern_set_wtimeout_int64(wc, MONGOC_DEFAULT_WTIMEOUT_FOR_COMMIT_RETRY); } /* Transactions spec: "If the transaction is using a write concern that is * not the server default, any other write concern options MUST be left as-is * when applying w:majority. */ mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); return wc; } static bool txn_commit(mongoc_client_session_t *session, bool explicitly_retrying, bson_t *reply, bson_error_t *error) { bson_t cmd = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; bson_error_t err_local = {0}; bson_error_t *err_ptr = error ? error : &err_local; bson_t reply_local = BSON_INITIALIZER; mongoc_write_err_type_t error_type; bool r = false; bool retrying_after_error = false; mongoc_write_concern_t *retry_wc = NULL; _mongoc_bson_init_if_set(reply); BSON_APPEND_INT32(&cmd, "commitTransaction", 1); if (session->recovery_token) { BSON_APPEND_DOCUMENT(&cmd, "recoveryToken", session->recovery_token); } retry: if (!mongoc_client_session_append(session, &opts, err_ptr)) { GOTO(done); } if (session->txn.opts.max_commit_time_ms != DEFAULT_MAX_COMMIT_TIME_MS) { if (!bson_append_int64(&opts, "maxTimeMS", -1, session->txn.opts.max_commit_time_ms)) { _mongoc_set_error(err_ptr, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "error appending maxCommitTimeMS"); GOTO(done); } } /* Transactions Spec: "When commitTransaction is retried, either by the * driver's internal retry-once logic or explicitly by the user calling * commitTransaction again, drivers MUST apply w:majority to the write * concern of the commitTransaction command." */ if (!retry_wc && (retrying_after_error || explicitly_retrying)) { retry_wc = create_commit_retry_wc(session->txn.opts.write_concern ? session->txn.opts.write_concern : session->client->write_concern); } if (retry_wc || session->txn.opts.write_concern) { if (!mongoc_write_concern_append(retry_wc ? retry_wc : session->txn.opts.write_concern, &opts)) { _mongoc_set_error(err_ptr, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Invalid transaction write concern"); GOTO(done); } } /* will be reinitialized by mongoc_client_write_command_with_opts */ bson_destroy(&reply_local); r = mongoc_client_write_command_with_opts(session->client, "admin", &cmd, &opts, &reply_local, err_ptr); /* Transactions Spec: "Drivers MUST retry the commitTransaction command once * after it fails with a retryable error", same for abort. Note that a * RetryableWriteError label has already been appended here. */ error_type = _mongoc_write_error_get_type(&reply_local); if (!retrying_after_error && error_type == MONGOC_WRITE_ERR_RETRY) { retrying_after_error = true; /* retry after error only once */ _mongoc_client_session_unpin(session); bson_reinit(&opts); GOTO(retry); } /* Transactions Spec: "add the UnknownTransactionCommitResult error label * when commitTransaction fails with a network error, server selection * error, MaxTimeMSExpired error, or write concern failed / timeout." */ if (!r && (err_ptr->domain == MONGOC_ERROR_SERVER_SELECTION || error_type == MONGOC_WRITE_ERR_RETRY || error_type == MONGOC_WRITE_ERR_WRITE_CONCERN || err_ptr->code == MONGOC_ERROR_MAX_TIME_MS_EXPIRED)) { /* Drivers MUST unpin a ClientSession when any individual * commitTransaction command attempt fails with an * UnknownTransactionCommitResult error label. Do this even if we won't * actually apply the error label due to reply being NULL */ _mongoc_client_session_unpin(session); if (reply) { bsonBuildAppend(*reply, insert(reply_local, not(key("errorLabels")))); _mongoc_error_copy_labels_and_upsert(&reply_local, reply, UNKNOWN_COMMIT_RESULT); } } else if (reply) { /* maintain invariants: reply & reply_local are valid until the end */ bson_destroy(reply); bson_steal(reply, &reply_local); bson_init(&reply_local); } done: bson_destroy(&reply_local); bson_destroy(&cmd); bson_destroy(&opts); if (retry_wc) { mongoc_write_concern_destroy(retry_wc); } return r; } mongoc_transaction_opt_t * mongoc_transaction_opts_new(void) { mongoc_transaction_opt_t *opts; opts = (mongoc_transaction_opt_t *)bson_malloc0(sizeof(mongoc_transaction_opt_t)); opts->max_commit_time_ms = DEFAULT_MAX_COMMIT_TIME_MS; return opts; } mongoc_transaction_opt_t * mongoc_transaction_opts_clone(const mongoc_transaction_opt_t *opts) { mongoc_transaction_opt_t *cloned_opts; ENTRY; BSON_ASSERT(opts); cloned_opts = mongoc_transaction_opts_new(); txn_opts_copy(opts, cloned_opts); RETURN(cloned_opts); } void mongoc_transaction_opts_destroy(mongoc_transaction_opt_t *opts) { ENTRY; if (!opts) { EXIT; } txn_opts_cleanup(opts); bson_free(opts); EXIT; } void mongoc_transaction_opts_set_max_commit_time_ms(mongoc_transaction_opt_t *opts, int64_t max_commit_time_ms) { BSON_ASSERT(opts); opts->max_commit_time_ms = max_commit_time_ms; } int64_t mongoc_transaction_opts_get_max_commit_time_ms(mongoc_transaction_opt_t *opts) { BSON_ASSERT(opts); return opts->max_commit_time_ms; } void mongoc_transaction_opts_set_read_concern(mongoc_transaction_opt_t *opts, const mongoc_read_concern_t *read_concern) { BSON_ASSERT(opts); mongoc_read_concern_destroy(opts->read_concern); opts->read_concern = mongoc_read_concern_copy(read_concern); } const mongoc_read_concern_t * mongoc_transaction_opts_get_read_concern(const mongoc_transaction_opt_t *opts) { BSON_ASSERT(opts); return opts->read_concern; } void mongoc_transaction_opts_set_write_concern(mongoc_transaction_opt_t *opts, const mongoc_write_concern_t *write_concern) { BSON_ASSERT(opts); mongoc_write_concern_destroy(opts->write_concern); opts->write_concern = mongoc_write_concern_copy(write_concern); } const mongoc_write_concern_t * mongoc_transaction_opts_get_write_concern(const mongoc_transaction_opt_t *opts) { BSON_ASSERT(opts); return opts->write_concern; } void mongoc_transaction_opts_set_read_prefs(mongoc_transaction_opt_t *opts, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT(opts); mongoc_read_prefs_destroy(opts->read_prefs); opts->read_prefs = mongoc_read_prefs_copy(read_prefs); } const mongoc_read_prefs_t * mongoc_transaction_opts_get_read_prefs(const mongoc_transaction_opt_t *opts) { BSON_ASSERT(opts); return opts->read_prefs; } bool mongoc_session_opts_get_causal_consistency(const mongoc_session_opt_t *opts) { ENTRY; BSON_ASSERT(opts); /* Causal Consistency spec: If no value is provided for causalConsistency * and snapshot reads are not requested a value of true is implied. */ if (!mongoc_optional_is_set(&opts->causal_consistency) && !mongoc_optional_value(&opts->snapshot)) { RETURN(true); } RETURN(mongoc_optional_value(&opts->causal_consistency)); } bool mongoc_session_opts_get_snapshot(const mongoc_session_opt_t *opts) { ENTRY; BSON_ASSERT(opts); RETURN(mongoc_optional_value(&opts->snapshot)); } void mongoc_session_opts_set_causal_consistency(mongoc_session_opt_t *opts, bool causal_consistency) { ENTRY; BSON_ASSERT(opts); mongoc_optional_set_value(&opts->causal_consistency, causal_consistency); EXIT; } void mongoc_session_opts_set_snapshot(mongoc_session_opt_t *opts, bool snapshot) { ENTRY; BSON_ASSERT(opts); mongoc_optional_set_value(&opts->snapshot, snapshot); EXIT; } mongoc_session_opt_t * mongoc_session_opts_new(void) { mongoc_session_opt_t *opts = bson_malloc0(sizeof(mongoc_session_opt_t)); mongoc_optional_init(&opts->causal_consistency); mongoc_optional_init(&opts->snapshot); return opts; } void mongoc_session_opts_set_default_transaction_opts(mongoc_session_opt_t *opts, const mongoc_transaction_opt_t *txn_opts) { ENTRY; BSON_ASSERT(opts); BSON_ASSERT(txn_opts); txn_opts_set(&opts->default_txn_opts, txn_opts->read_concern, txn_opts->write_concern, txn_opts->read_prefs, txn_opts->max_commit_time_ms); EXIT; } const mongoc_transaction_opt_t * mongoc_session_opts_get_default_transaction_opts(const mongoc_session_opt_t *opts) { ENTRY; BSON_ASSERT(opts); RETURN(&opts->default_txn_opts); } mongoc_transaction_opt_t * mongoc_session_opts_get_transaction_opts(const mongoc_client_session_t *session) { ENTRY; BSON_ASSERT(session); if (mongoc_client_session_in_transaction(session)) { RETURN(mongoc_transaction_opts_clone(&session->txn.opts)); } RETURN(NULL); } static void _mongoc_session_opts_copy(const mongoc_session_opt_t *src, mongoc_session_opt_t *dst) { mongoc_optional_copy(&src->causal_consistency, &dst->causal_consistency); mongoc_optional_copy(&src->snapshot, &dst->snapshot); txn_opts_copy(&src->default_txn_opts, &dst->default_txn_opts); } mongoc_session_opt_t * mongoc_session_opts_clone(const mongoc_session_opt_t *opts) { mongoc_session_opt_t *cloned_opts; ENTRY; BSON_ASSERT(opts); cloned_opts = bson_malloc0(sizeof(mongoc_session_opt_t)); _mongoc_session_opts_copy(opts, cloned_opts); RETURN(cloned_opts); } void mongoc_session_opts_destroy(mongoc_session_opt_t *opts) { ENTRY; if (!opts) { EXIT; } txn_opts_cleanup(&opts->default_txn_opts); bson_free(opts); EXIT; } static bool _mongoc_server_session_uuid(uint8_t *data /* OUT */, bson_error_t *error) { #ifdef MONGOC_ENABLE_CRYPTO /* https://tools.ietf.org/html/rfc4122#page-14 * o Set the two most significant bits (bits 6 and 7) of the * clock_seq_hi_and_reserved to zero and one, respectively. * * o Set the four most significant bits (bits 12 through 15) of the * time_hi_and_version field to the 4-bit version number from * Section 4.1.3. * * o Set all the other bits to randomly (or pseudo-randomly) chosen * values. */ if (!_mongoc_rand_bytes(data, 16)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Could not generate UUID for logical session id"); return false; } data[6] = (uint8_t)(0x40 | (data[6] & 0xf)); data[8] = (uint8_t)(0x80 | (data[8] & 0x3f)); return true; #else /* no _mongoc_rand_bytes without a crypto library */ _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Could not generate UUID for logical session id, we need a" " cryptography library like libcrypto, Common Crypto, or" " CNG"); return false; #endif } bool _mongoc_parse_cluster_time(const bson_t *cluster_time, uint32_t *timestamp, uint32_t *increment) { bson_iter_t iter; char *s; if (!cluster_time || !bson_iter_init_find(&iter, cluster_time, "clusterTime") || !BSON_ITER_HOLDS_TIMESTAMP(&iter)) { s = bson_as_relaxed_extended_json(cluster_time, NULL); MONGOC_ERROR("Cannot parse cluster time from %s\n", s); bson_free(s); return false; } bson_iter_timestamp(&iter, timestamp, increment); return true; } bool _mongoc_cluster_time_greater(const bson_t *new, const bson_t *old) { uint32_t new_t, new_i, old_t, old_i; if (!_mongoc_parse_cluster_time(new, &new_t, &new_i) || !_mongoc_parse_cluster_time(old, &old_t, &old_i)) { return false; } return (new_t > old_t) || (new_t == old_t && new_i > old_i); } void _mongoc_client_session_handle_reply(mongoc_client_session_t *session, bool is_acknowledged, const char *cmd_name, const bson_t *reply) { bson_iter_t iter; bson_iter_t cursor_iter; uint32_t len; const uint8_t *data; bson_t cluster_time; uint32_t operation_t; uint32_t operation_i; uint32_t snapshot_t; uint32_t snapshot_i; bool is_find_aggregate_distinct; BSON_ASSERT(session); if (!reply || !bson_iter_init(&iter, reply)) { return; } is_find_aggregate_distinct = (!strcmp(cmd_name, "find") || !strcmp(cmd_name, "aggregate") || !strcmp(cmd_name, "distinct")); if (mongoc_error_has_label(reply, "TransientTransactionError")) { /* Transaction Spec: "Drivers MUST unpin a ClientSession when a command * within a transaction, including commitTransaction and abortTransaction, * fails with a TransientTransactionError". If the server reply included * a TransientTransactionError, we unpin here. If a network error caused * us to add a label client-side, we unpin in network_error_reply. */ _mongoc_client_session_unpin(session); } while (bson_iter_next(&iter)) { if (!strcmp(bson_iter_key(&iter), "$clusterTime") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { bson_iter_document(&iter, &len, &data); BSON_ASSERT(bson_init_static(&cluster_time, data, (size_t)len)); mongoc_client_session_advance_cluster_time(session, &cluster_time); } else if (!strcmp(bson_iter_key(&iter), "operationTime") && BSON_ITER_HOLDS_TIMESTAMP(&iter) && is_acknowledged) { bson_iter_timestamp(&iter, &operation_t, &operation_i); mongoc_client_session_advance_operation_time(session, operation_t, operation_i); } else if (is_find_aggregate_distinct && !strcmp(bson_iter_key(&iter), "atClusterTime") && mongoc_session_opts_get_snapshot(&session->opts) && !session->snapshot_time_set) { /* If command is "find", "aggregate" or "distinct", atClusterTime is on * top level of reply, snapshot is enabled for the session, and * snapshot_time has not already been set, set it. */ bson_iter_timestamp(&iter, &snapshot_t, &snapshot_i); _mongoc_client_session_set_snapshot_time(session, snapshot_t, snapshot_i); } else if (is_find_aggregate_distinct && !strcmp(bson_iter_key(&iter), "cursor") && mongoc_session_opts_get_snapshot(&session->opts) && !session->snapshot_time_set) { /* If command is "find", "aggregate" or "distinct", cursor is present, * snapshot is enabled for the session, and snapshot_time has not * already been set, try to find atClusterTime in cursor field to set * snapshot_time. */ bson_iter_recurse(&iter, &cursor_iter); while (bson_iter_next(&cursor_iter)) { /* If atClusterTime is in cursor and is a valid timestamp, use it to * set snapshot_time. */ if (!strcmp(bson_iter_key(&cursor_iter), "atClusterTime") && BSON_ITER_HOLDS_TIMESTAMP(&cursor_iter)) { bson_iter_timestamp(&cursor_iter, &snapshot_t, &snapshot_i); _mongoc_client_session_set_snapshot_time(session, snapshot_t, snapshot_i); } } } } } bool _mongoc_server_session_init(mongoc_server_session_t *self, bson_error_t *error) { uint8_t uuid_data[16]; ENTRY; BSON_ASSERT(self); if (!_mongoc_server_session_uuid(uuid_data, error)) { RETURN(false); } /* transaction number is a positive integer and will be incremented before * each use, so ensure it is initialized to zero. */ self->txn_number = 0; self->last_used_usec = SESSION_NEVER_USED; bson_init(&self->lsid); BSON_APPEND_BINARY(&self->lsid, "id", BSON_SUBTYPE_UUID, uuid_data, sizeof uuid_data); RETURN(true); } bool _mongoc_server_session_timed_out(const mongoc_server_session_t *server_session, int64_t session_timeout_minutes) { int64_t timeout_usec; const int64_t minute_to_usec = 60 * 1000 * 1000; ENTRY; if (session_timeout_minutes == MONGOC_NO_SESSIONS) { /* not connected right now; keep the session */ return false; } if (server_session->last_used_usec == SESSION_NEVER_USED) { return false; } /* Driver Sessions Spec: if a session has less than one minute left before * becoming stale, discard it */ timeout_usec = server_session->last_used_usec + session_timeout_minutes * minute_to_usec; RETURN(timeout_usec - bson_get_monotonic_time() < 1 * minute_to_usec); } void _mongoc_server_session_destroy(mongoc_server_session_t *self) { bson_destroy(&self->lsid); } mongoc_client_session_t * _mongoc_client_session_new(mongoc_client_t *client, mongoc_server_session_t *server_session, const mongoc_session_opt_t *opts, uint32_t client_session_id) { mongoc_client_session_t *session; ENTRY; BSON_ASSERT(client); BSON_ASSERT(server_session); session = BSON_ALIGNED_ALLOC0(mongoc_client_session_t); session->client = client; session->client_generation = client->generation; session->server_session = server_session; session->client_session_id = client_session_id; bson_init(&session->cluster_time); mongoc_optional_init(&session->opts.causal_consistency); mongoc_optional_init(&session->opts.snapshot); txn_opts_set(&session->opts.default_txn_opts, client->read_concern, client->write_concern, client->read_prefs, DEFAULT_MAX_COMMIT_TIME_MS); if (opts) { mongoc_optional_copy(&opts->causal_consistency, &session->opts.causal_consistency); mongoc_optional_copy(&opts->snapshot, &session->opts.snapshot); txn_opts_set(&session->opts.default_txn_opts, opts->default_txn_opts.read_concern, opts->default_txn_opts.write_concern, opts->default_txn_opts.read_prefs, opts->default_txn_opts.max_commit_time_ms); } /* snapshot_time_set is false by default */ _mongoc_client_session_clear_snapshot_time(session); /* these values are used for testing only. */ session->with_txn_timeout_ms = 0; session->fail_commit_label = NULL; RETURN(session); } mongoc_client_t * mongoc_client_session_get_client(const mongoc_client_session_t *session) { BSON_ASSERT(session); return session->client; } const mongoc_session_opt_t * mongoc_client_session_get_opts(const mongoc_client_session_t *session) { BSON_ASSERT(session); return &session->opts; } const bson_t * mongoc_client_session_get_lsid(const mongoc_client_session_t *session) { BSON_ASSERT(session); return &session->server_session->lsid; } const bson_t * mongoc_client_session_get_cluster_time(const mongoc_client_session_t *session) { BSON_ASSERT(session); if (bson_empty(&session->cluster_time)) { return NULL; } return &session->cluster_time; } uint32_t mongoc_client_session_get_server_id(const mongoc_client_session_t *session) { BSON_ASSERT(session); return session->server_id; } void mongoc_client_session_advance_cluster_time(mongoc_client_session_t *session, const bson_t *cluster_time) { uint32_t t, i; ENTRY; if (bson_empty(&session->cluster_time) && _mongoc_parse_cluster_time(cluster_time, &t, &i)) { bson_destroy(&session->cluster_time); bson_copy_to(cluster_time, &session->cluster_time); EXIT; } if (_mongoc_cluster_time_greater(cluster_time, &session->cluster_time)) { bson_destroy(&session->cluster_time); bson_copy_to(cluster_time, &session->cluster_time); } EXIT; } void mongoc_client_session_get_operation_time(const mongoc_client_session_t *session, uint32_t *timestamp, uint32_t *increment) { BSON_ASSERT(session); BSON_ASSERT(timestamp); BSON_ASSERT(increment); *timestamp = session->operation_timestamp; *increment = session->operation_increment; } void mongoc_client_session_advance_operation_time(mongoc_client_session_t *session, uint32_t timestamp, uint32_t increment) { ENTRY; BSON_ASSERT(session); if (timestamp > session->operation_timestamp || (timestamp == session->operation_timestamp && increment > session->operation_increment)) { session->operation_timestamp = timestamp; session->operation_increment = increment; } EXIT; } static bool timeout_exceeded(int64_t expire_at) { int64_t current_time = bson_get_monotonic_time(); return current_time >= expire_at; } static bool _max_time_ms_failure(bson_t *reply) { bson_iter_t iter; bson_iter_t descendant; if (!reply) { return false; } /* We can fail with a maxTimeMS error with the error code at the top level, or nested within a writeConcernError. */ if (bson_iter_init_find(&iter, reply, "codeName") && BSON_ITER_HOLDS_UTF8(&iter) && 0 == strcmp(bson_iter_utf8(&iter, NULL), MAX_TIME_MS_EXPIRED)) { return true; } if (!bson_iter_init(&iter, reply)) { return false; } if (bson_iter_find_descendant(&iter, "writeConcernError.codeName", &descendant) && BSON_ITER_HOLDS_UTF8(&descendant) && 0 == strcmp(bson_iter_utf8(&descendant, NULL), MAX_TIME_MS_EXPIRED)) { return true; } return false; } bool mongoc_client_session_with_transaction(mongoc_client_session_t *session, mongoc_client_session_with_transaction_cb_t cb, const mongoc_transaction_opt_t *opts, void *ctx, bson_t *reply, bson_error_t *error) { mongoc_internal_transaction_state_t state; int64_t timeout; int64_t expire_at; bson_t local_reply; bson_t *active_reply = NULL; bool res; ENTRY; timeout = session->with_txn_timeout_ms > 0 ? session->with_txn_timeout_ms : WITH_TXN_TIMEOUT_MS; expire_at = bson_get_monotonic_time() + ((int64_t)timeout * 1000); /* Attempt to wrap a user callback in start- and end- transaction semantics. If this fails for transient reasons, restart, either from the very beginning, or just retry committing the transaction. Will retry until the timeout WITH_TXN_TIMEOUT_MS is exhausted. At the top of this loop, active_reply should always be NULL, and local_reply should always be uninitialized. */ while (true) { res = mongoc_client_session_start_transaction(session, opts, error); if (!res) { GOTO(done); } res = cb(session, ctx, &active_reply, error); state = session->txn.state; /* If the user cb set a reply, use it. Otherwise, sub in local_reply since we must have an active reply object one way or another. */ if (!active_reply) { bson_init(&local_reply); active_reply = &local_reply; } if (!res) { if (state == MONGOC_INTERNAL_TRANSACTION_STARTING || state == MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS) { BSON_ASSERT(mongoc_client_session_abort_transaction(session, NULL)); } if (mongoc_error_has_label(active_reply, TRANSIENT_TXN_ERR) && !timeout_exceeded(expire_at)) { bson_destroy(active_reply); active_reply = NULL; continue; } /* Unknown error running callback, fail. */ GOTO(done); } if (state == MONGOC_INTERNAL_TRANSACTION_ABORTED || state == MONGOC_INTERNAL_TRANSACTION_NONE || state == MONGOC_INTERNAL_TRANSACTION_COMMITTED || state == MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY) { GOTO(done); } /* Whether or not we used local_reply above, use it now, but access it * through active_reply so cleanup in DONE is simpler. */ bson_destroy(active_reply); active_reply = &local_reply; /* Commit the transaction, retrying either from here or from the outer loop on error. At the top of this loop, active_reply should always be pointing to an uninitialized stack-allocated bson_t, so we can pass it into commit_transaction, which requires this like our other public functions that take a bson_t reply. */ while (true) { res = mongoc_client_session_commit_transaction(session, active_reply, error); if (!res) { /* If we have a MaxTimeMsExpired error, fail and propogate the error to the caller. */ if (_max_time_ms_failure(active_reply)) { GOTO(done); } if (mongoc_error_has_label(active_reply, UNKNOWN_COMMIT_RESULT) && !timeout_exceeded(expire_at)) { /* Commit_transaction applies majority write concern on retry * attempts. * * Here, we don't want to set active_reply = NULL when we * destroy, because we want it to point to an uninitialized * bson_t at the top of this loop every time.*/ bson_destroy(active_reply); continue; } if (mongoc_error_has_label(active_reply, TRANSIENT_TXN_ERR) && !timeout_exceeded(expire_at)) { /* In the case of a transient txn error, go back to outside loop. We must set the reply to NULL so it may be used by the cb. */ bson_destroy(active_reply); active_reply = NULL; break; } /* Unknown error committing transaction, fail. */ GOTO(done); } /* Transaction successfully committed! */ GOTO(done); } } done: /* At this point, active_reply is either pointing to the user's reply object, or our local one on the stack, or is NULL. */ if (reply && active_reply) { bson_copy_to(active_reply, reply); } else if (reply) { bson_init(reply); } bson_destroy(active_reply); RETURN(res); } bool mongoc_client_session_start_transaction(mongoc_client_session_t *session, const mongoc_transaction_opt_t *opts, bson_error_t *error) { mongoc_server_stream_t *server_stream = NULL; bool ret; ENTRY; BSON_ASSERT(session); ret = true; const mongoc_ss_log_context_t ss_log_context = {.operation = "mongoc_client_session_start_transaction"}; server_stream = mongoc_cluster_stream_for_writes( &session->client->cluster, &ss_log_context, session, NULL /* deprioritized servers */, NULL /* reply */, error); if (!server_stream) { ret = false; GOTO(done); } if (mongoc_session_opts_get_snapshot(&session->opts)) { _mongoc_set_error(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Transactions are not supported in snapshot sessions"); ret = false; GOTO(done); } /* use "switch" so that static checkers ensure we handle all states */ switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_STARTING: case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: _mongoc_set_error( error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Transaction already in progress"); ret = false; GOTO(done); case MONGOC_INTERNAL_TRANSACTION_ENDING: MONGOC_ERROR("starting txn in invalid state MONGOC_INTERNAL_TRANSACTION_ENDING"); abort(); case MONGOC_INTERNAL_TRANSACTION_COMMITTED: case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: case MONGOC_INTERNAL_TRANSACTION_ABORTED: case MONGOC_INTERNAL_TRANSACTION_NONE: default: break; } session->server_session->txn_number++; txn_opts_set(&session->txn.opts, session->opts.default_txn_opts.read_concern, session->opts.default_txn_opts.write_concern, session->opts.default_txn_opts.read_prefs, session->opts.default_txn_opts.max_commit_time_ms); if (opts) { txn_opts_set( &session->txn.opts, opts->read_concern, opts->write_concern, opts->read_prefs, opts->max_commit_time_ms); } if (!mongoc_write_concern_is_acknowledged(session->txn.opts.write_concern)) { _mongoc_set_error(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Transactions do not support unacknowledged write concern"); ret = false; GOTO(done); } /* Transactions Spec: Starting a new transaction on a pinned ClientSession * MUST unpin the session. */ _mongoc_client_session_unpin(session); session->txn.state = MONGOC_INTERNAL_TRANSACTION_STARTING; /* Transactions spec: "Drivers MUST clear a session's cached * 'recoveryToken' when transitioning to the 'no transaction' or * 'starting transaction' state." */ bson_destroy(session->recovery_token); session->recovery_token = NULL; done: mongoc_server_stream_cleanup(server_stream); return ret; } bool mongoc_client_session_in_transaction(const mongoc_client_session_t *session) { ENTRY; BSON_ASSERT(session); /* call the internal function, which would allow a NULL session */ RETURN(_mongoc_client_session_in_txn(session)); } mongoc_transaction_state_t mongoc_client_session_get_transaction_state(const mongoc_client_session_t *session) { ENTRY; BSON_ASSERT(session); switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_NONE: RETURN(MONGOC_TRANSACTION_NONE); case MONGOC_INTERNAL_TRANSACTION_STARTING: RETURN(MONGOC_TRANSACTION_STARTING); case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: RETURN(MONGOC_TRANSACTION_IN_PROGRESS); case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: case MONGOC_INTERNAL_TRANSACTION_COMMITTED: RETURN(MONGOC_TRANSACTION_COMMITTED); case MONGOC_INTERNAL_TRANSACTION_ABORTED: RETURN(MONGOC_TRANSACTION_ABORTED); case MONGOC_INTERNAL_TRANSACTION_ENDING: MONGOC_ERROR("invalid state MONGOC_INTERNAL_TRANSACTION_ENDING when " "getting transaction state"); abort(); default: MONGOC_ERROR("invalid state %d when getting transaction state", (int)session->txn.state); abort(); } } bool mongoc_client_session_commit_transaction(mongoc_client_session_t *session, bson_t *reply, bson_error_t *error) { bool r = false; ENTRY; BSON_ASSERT(session); /* For testing only, mock out certain kinds of errors. */ if (session->fail_commit_label) { bson_array_builder_t *labels; BSON_ASSERT(reply); bson_init(reply); BSON_APPEND_ARRAY_BUILDER_BEGIN(reply, "errorLabels", &labels); bson_array_builder_append_utf8(labels, session->fail_commit_label, -1); bson_append_array_builder_end(reply, labels); /* Waste the test timeout, if there is one set. */ if (session->with_txn_timeout_ms) { mlib_sleep_for(session->with_txn_timeout_ms, ms); } RETURN(r); } /* See Transactions Spec for state diagram. In COMMITTED state, user can call * commit again to retry after network error */ switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_NONE: _mongoc_set_error( error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "No transaction started"); _mongoc_bson_init_if_set(reply); break; case MONGOC_INTERNAL_TRANSACTION_STARTING: case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: /* we sent no commands, not actually started on server */ session->txn.state = MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY; _mongoc_bson_init_if_set(reply); r = true; break; case MONGOC_INTERNAL_TRANSACTION_COMMITTED: case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: { bool explicitly_retrying = (session->txn.state == MONGOC_INTERNAL_TRANSACTION_COMMITTED); /* in MONGOC_INTERNAL_TRANSACTION_ENDING we add txnNumber and autocommit: * false to the commitTransaction command, but if it fails with network * error we add UnknownTransactionCommitResult not * TransientTransactionError */ session->txn.state = MONGOC_INTERNAL_TRANSACTION_ENDING; r = txn_commit(session, explicitly_retrying, reply, error); session->txn.state = MONGOC_INTERNAL_TRANSACTION_COMMITTED; break; } case MONGOC_INTERNAL_TRANSACTION_ENDING: MONGOC_ERROR("commit called in invalid state MONGOC_INTERNAL_TRANSACTION_ENDING"); abort(); case MONGOC_INTERNAL_TRANSACTION_ABORTED: default: _mongoc_set_error(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Cannot call commitTransaction after calling abortTransaction"); _mongoc_bson_init_if_set(reply); break; } RETURN(r); } bool mongoc_client_session_abort_transaction(mongoc_client_session_t *session, bson_error_t *error) { ENTRY; BSON_ASSERT(session); switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_STARTING: /* we sent no commands, not actually started on server */ session->txn.state = MONGOC_INTERNAL_TRANSACTION_ABORTED; /* Transactions Spec: aborting a transaction MUST unpin the session. * It's likely the transaction is already unpinned if TRANSACTION_STARTING * was just assigned, but there is no harm in doing so again. */ _mongoc_client_session_unpin(session); txn_opts_cleanup(&session->txn.opts); RETURN(true); case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: session->txn.state = MONGOC_INTERNAL_TRANSACTION_ENDING; /* Transactions Spec: ignore errors from abortTransaction command */ txn_abort(session, NULL, NULL); session->txn.state = MONGOC_INTERNAL_TRANSACTION_ABORTED; /* Transactions Spec: aborting a transaction MUST unpin the session. */ _mongoc_client_session_unpin(session); RETURN(true); case MONGOC_INTERNAL_TRANSACTION_COMMITTED: case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: _mongoc_set_error(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Cannot call abortTransaction after calling commitTransaction"); RETURN(false); case MONGOC_INTERNAL_TRANSACTION_ABORTED: _mongoc_set_error( error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Cannot call abortTransaction twice"); RETURN(false); case MONGOC_INTERNAL_TRANSACTION_ENDING: MONGOC_ERROR("abort called in invalid state MONGOC_INTERNAL_TRANSACTION_ENDING"); abort(); case MONGOC_INTERNAL_TRANSACTION_NONE: default: _mongoc_set_error( error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "No transaction started"); RETURN(false); } } bool _mongoc_client_session_from_iter(mongoc_client_t *client, const bson_iter_t *iter, mongoc_client_session_t **cs, bson_error_t *error) { ENTRY; BSON_ASSERT_PARAM(client); /* must be int64 that fits in uint32 */ if (!BSON_ITER_HOLDS_INT64(iter) || bson_iter_int64(iter) > 0xffffffff) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid sessionId"); RETURN(false); } RETURN(_mongoc_client_lookup_session(client, (uint32_t)bson_iter_int64(iter), cs, error)); } /* Returns true if in the middle of a transaction. Note: this returns false if * the commit/abort is running. */ bool _mongoc_client_session_in_txn(const mongoc_client_session_t *session) { if (!session) { return false; } /* use "switch" so that static checkers ensure we handle all states */ switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_STARTING: case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: return true; case MONGOC_INTERNAL_TRANSACTION_NONE: case MONGOC_INTERNAL_TRANSACTION_ENDING: case MONGOC_INTERNAL_TRANSACTION_COMMITTED: case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: case MONGOC_INTERNAL_TRANSACTION_ABORTED: default: return false; } } /* Like _mongoc_client_session_in_txn, but also returns true if running the * commit/abort for this transaction. */ bool _mongoc_client_session_in_txn_or_ending(const mongoc_client_session_t *session) { if (!session) { return false; } /* use "switch" so that static checkers ensure we handle all states */ switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_STARTING: case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: case MONGOC_INTERNAL_TRANSACTION_ENDING: return true; case MONGOC_INTERNAL_TRANSACTION_NONE: case MONGOC_INTERNAL_TRANSACTION_COMMITTED: case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: case MONGOC_INTERNAL_TRANSACTION_ABORTED: default: return false; } } bool _mongoc_client_session_txn_in_progress(const mongoc_client_session_t *session) { if (!session) { return false; } return session->txn.state == MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS; } /* *-------------------------------------------------------------------------- * * _mongoc_client_session_append_txn -- * * Add transaction fields besides "readConcern" to @cmd. * * Returns: * Returns false and sets @error if @cmd is empty, otherwise returns * true. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool _mongoc_client_session_append_txn(mongoc_client_session_t *session, bson_t *cmd, bson_error_t *error) { mongoc_transaction_t *txn; ENTRY; if (!session) { RETURN(true); } if (bson_empty0(cmd)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command in transaction"); RETURN(false); } txn = &session->txn; /* See Transactions Spec for state transitions. In COMMITTED / ABORTED, the * next operation resets the session and moves to TRANSACTION_NONE */ switch (session->txn.state) { case MONGOC_INTERNAL_TRANSACTION_STARTING: txn->state = MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS; bson_append_bool(cmd, "startTransaction", 16, true); /* FALL THROUGH */ case MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS: case MONGOC_INTERNAL_TRANSACTION_ENDING: bson_append_int64(cmd, "txnNumber", 9, session->server_session->txn_number); bson_append_bool(cmd, "autocommit", 10, false); RETURN(true); case MONGOC_INTERNAL_TRANSACTION_COMMITTED: if (!strcmp(_mongoc_get_command_name(cmd), "commitTransaction")) { /* send commitTransaction again */ bson_append_int64(cmd, "txnNumber", 9, session->server_session->txn_number); bson_append_bool(cmd, "autocommit", 10, false); RETURN(true); } /* FALL THROUGH */ case MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY: case MONGOC_INTERNAL_TRANSACTION_ABORTED: txn_opts_cleanup(&session->txn.opts); txn->state = MONGOC_INTERNAL_TRANSACTION_NONE; /* Transactions spec: "Drivers MUST clear a session's cached * 'recoveryToken' when transitioning to the 'no transaction' or * 'starting transaction' state." */ bson_destroy(session->recovery_token); session->recovery_token = NULL; RETURN(true); case MONGOC_INTERNAL_TRANSACTION_NONE: default: RETURN(true); } } /* *-------------------------------------------------------------------------- * * _mongoc_client_session_append_read_concern -- * * Add read concern if we're doing a read outside a transaction, or if * we're starting a transaction, or if the user explicitly passed a read * concern in some function's "opts". The contents of the read concern * are "level" and/or "afterClusterTime" - if both are empty, don't add * read concern. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void _mongoc_client_session_append_read_concern(const mongoc_client_session_t *cs, const bson_t *rc, bool is_read_command, bson_t *cmd) { const mongoc_read_concern_t *txn_rc; mongoc_internal_transaction_state_t txn_state; bool user_rc_has_level; bool txn_has_level; bool has_timestamp; bool is_snapshot; bool has_level; bson_t child; ENTRY; BSON_ASSERT(cs); txn_state = cs->txn.state; txn_rc = cs->txn.opts.read_concern; if (txn_state == MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS) { return; } has_timestamp = (txn_state == MONGOC_INTERNAL_TRANSACTION_STARTING || is_read_command) && mongoc_session_opts_get_causal_consistency(&cs->opts) && cs->operation_timestamp; is_snapshot = mongoc_session_opts_get_snapshot(&cs->opts); user_rc_has_level = rc && bson_has_field(rc, "level"); txn_has_level = txn_state == MONGOC_INTERNAL_TRANSACTION_STARTING && !mongoc_read_concern_is_default(txn_rc); has_level = user_rc_has_level || txn_has_level; /* do not append read concern if no causal consistency, snapshot disabled and * no read concern is provided. */ if (!has_timestamp && !is_snapshot && !has_level) { return; } bson_append_document_begin(cmd, "readConcern", 11, &child); if (rc) { bson_concat(&child, rc); } if (txn_state == MONGOC_INTERNAL_TRANSACTION_STARTING) { /* add transaction's read concern level unless user overrides or snapshot * is enabled. */ if (txn_has_level && !user_rc_has_level && !is_snapshot) { bson_append_utf8(&child, "level", 5, txn_rc->level, -1); } } if (is_snapshot) { bson_append_utf8(&child, "level", 5, MONGOC_READ_CONCERN_LEVEL_SNAPSHOT, -1); } /* append afterClusterTime if causal consistency and operation_time is set. * otherwise append atClusterTime if snapshot enabled and snapshot_time is * set. */ if (has_timestamp) { bson_append_timestamp(&child, "afterClusterTime", 16, cs->operation_timestamp, cs->operation_increment); } else if (is_snapshot && cs->snapshot_time_set) { bson_append_timestamp(&child, "atClusterTime", 13, cs->snapshot_time_timestamp, cs->snapshot_time_increment); } bson_append_document_end(cmd, &child); } bool mongoc_client_session_append(const mongoc_client_session_t *client_session, bson_t *opts, bson_error_t *error) { ENTRY; BSON_ASSERT(client_session); BSON_ASSERT(opts); if (!bson_append_int64(opts, "sessionId", 9, client_session->client_session_id)) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "invalid opts"); RETURN(false); } RETURN(true); } void mongoc_client_session_destroy(mongoc_client_session_t *session) { ENTRY; if (!session) { EXIT; } if (session->client_generation == session->client->generation) { if (mongoc_client_session_in_transaction(session)) { mongoc_client_session_abort_transaction(session, NULL); } _mongoc_client_unregister_session(session->client, session); _mongoc_client_push_server_session(session->client, session->server_session); } else { /** If the client has been reset, destroy the server session instead of * pushing it back into the topology's pool. */ mongoc_server_session_pool_drop(session->client->topology->session_pool, session->server_session); } txn_opts_cleanup(&session->opts.default_txn_opts); txn_opts_cleanup(&session->txn.opts); bson_destroy(&session->cluster_time); bson_destroy(session->recovery_token); bson_free(session); EXIT; } void _mongoc_client_session_unpin(mongoc_client_session_t *session) { BSON_ASSERT(session); session->server_id = 0; } void _mongoc_client_session_pin(mongoc_client_session_t *session, uint32_t server_id) { BSON_ASSERT(session); session->server_id = server_id; } void _mongoc_client_session_set_snapshot_time(mongoc_client_session_t *session, uint32_t t, uint32_t i) { BSON_ASSERT(session); BSON_ASSERT(!session->snapshot_time_set); session->snapshot_time_set = true; session->snapshot_time_timestamp = t; session->snapshot_time_increment = i; } void _mongoc_client_session_clear_snapshot_time(mongoc_client_session_t *session) { BSON_ASSERT(session); session->snapshot_time_set = false; } bool mongoc_client_session_get_dirty(mongoc_client_session_t *session) { BSON_ASSERT_PARAM(session); return session->server_session->dirty; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-session.h000066400000000000000000000154061511661753600255660ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_SESSION_H #define MONGOC_CLIENT_SESSION_H #include #include /* mongoc_client_session_t, mongoc_transaction_opt_t, and mongoc_session_opt_t are typedef'ed here */ #include BSON_BEGIN_DECLS typedef bool(BSON_CALL *mongoc_client_session_with_transaction_cb_t)(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error); typedef enum { MONGOC_TRANSACTION_NONE = 0, MONGOC_TRANSACTION_STARTING = 1, MONGOC_TRANSACTION_IN_PROGRESS = 2, MONGOC_TRANSACTION_COMMITTED = 3, MONGOC_TRANSACTION_ABORTED = 4, } mongoc_transaction_state_t; /* these options types are named "opt_t" but their functions are named with * "opts", for consistency with the older mongoc_ssl_opt_t */ MONGOC_EXPORT(mongoc_transaction_opt_t *) mongoc_transaction_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_transaction_opt_t *) mongoc_transaction_opts_clone(const mongoc_transaction_opt_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_transaction_opts_destroy(mongoc_transaction_opt_t *opts); MONGOC_EXPORT(void) mongoc_transaction_opts_set_max_commit_time_ms(mongoc_transaction_opt_t *opts, int64_t max_commit_time_ms); MONGOC_EXPORT(int64_t) mongoc_transaction_opts_get_max_commit_time_ms(mongoc_transaction_opt_t *opts); MONGOC_EXPORT(void) mongoc_transaction_opts_set_read_concern(mongoc_transaction_opt_t *opts, const mongoc_read_concern_t *read_concern); MONGOC_EXPORT(const mongoc_read_concern_t *) mongoc_transaction_opts_get_read_concern(const mongoc_transaction_opt_t *opts); MONGOC_EXPORT(void) mongoc_transaction_opts_set_write_concern(mongoc_transaction_opt_t *opts, const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_transaction_opts_get_write_concern(const mongoc_transaction_opt_t *opts); MONGOC_EXPORT(void) mongoc_transaction_opts_set_read_prefs(mongoc_transaction_opt_t *opts, const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(const mongoc_read_prefs_t *) mongoc_transaction_opts_get_read_prefs(const mongoc_transaction_opt_t *opts); MONGOC_EXPORT(mongoc_session_opt_t *) mongoc_session_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_session_opts_set_causal_consistency(mongoc_session_opt_t *opts, bool causal_consistency); MONGOC_EXPORT(bool) mongoc_session_opts_get_causal_consistency(const mongoc_session_opt_t *opts); MONGOC_EXPORT(void) mongoc_session_opts_set_snapshot(mongoc_session_opt_t *opts, bool snapshot); MONGOC_EXPORT(bool) mongoc_session_opts_get_snapshot(const mongoc_session_opt_t *opts); MONGOC_EXPORT(void) mongoc_session_opts_set_default_transaction_opts(mongoc_session_opt_t *opts, const mongoc_transaction_opt_t *txn_opts); MONGOC_EXPORT(const mongoc_transaction_opt_t *) mongoc_session_opts_get_default_transaction_opts(const mongoc_session_opt_t *opts); MONGOC_EXPORT(mongoc_transaction_opt_t *) mongoc_session_opts_get_transaction_opts(const mongoc_client_session_t *session) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_session_opt_t *) mongoc_session_opts_clone(const mongoc_session_opt_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_session_opts_destroy(mongoc_session_opt_t *opts); MONGOC_EXPORT(mongoc_client_t *) mongoc_client_session_get_client(const mongoc_client_session_t *session); MONGOC_EXPORT(const mongoc_session_opt_t *) mongoc_client_session_get_opts(const mongoc_client_session_t *session); MONGOC_EXPORT(const bson_t *) mongoc_client_session_get_lsid(const mongoc_client_session_t *session); MONGOC_EXPORT(const bson_t *) mongoc_client_session_get_cluster_time(const mongoc_client_session_t *session); MONGOC_EXPORT(void) mongoc_client_session_advance_cluster_time(mongoc_client_session_t *session, const bson_t *cluster_time); MONGOC_EXPORT(void) mongoc_client_session_get_operation_time(const mongoc_client_session_t *session, uint32_t *timestamp, uint32_t *increment); MONGOC_EXPORT(uint32_t) mongoc_client_session_get_server_id(const mongoc_client_session_t *session); MONGOC_EXPORT(void) mongoc_client_session_advance_operation_time(mongoc_client_session_t *session, uint32_t timestamp, uint32_t increment); MONGOC_EXPORT(bool) mongoc_client_session_with_transaction(mongoc_client_session_t *session, mongoc_client_session_with_transaction_cb_t cb, const mongoc_transaction_opt_t *opts, void *ctx, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_session_start_transaction(mongoc_client_session_t *session, const mongoc_transaction_opt_t *opts, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_session_in_transaction(const mongoc_client_session_t *session); MONGOC_EXPORT(mongoc_transaction_state_t) mongoc_client_session_get_transaction_state(const mongoc_client_session_t *session); MONGOC_EXPORT(bool) mongoc_client_session_commit_transaction(mongoc_client_session_t *session, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_session_abort_transaction(mongoc_client_session_t *session, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_session_append(const mongoc_client_session_t *client_session, bson_t *opts, bson_error_t *error); /* There is no mongoc_client_session_end, only mongoc_client_session_destroy. * Driver Sessions Spec: "In languages that have idiomatic ways of disposing of * resources, drivers SHOULD support that in addition to or instead of * endSession." */ MONGOC_EXPORT(void) mongoc_client_session_destroy(mongoc_client_session_t *session); MONGOC_EXPORT(bool) mongoc_client_session_get_dirty(mongoc_client_session_t *session); BSON_END_DECLS #endif /* MONGOC_CLIENT_SESSION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-side-encryption-private.h000066400000000000000000000072351511661753600306700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_SIDE_ENCRYPTION_PRIVATE_H #define MONGOC_CLIENT_SIDE_ENCRYPTION_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include /* cse is an abbreviation for "Client Side Encryption" */ bool _mongoc_cse_auto_encrypt(mongoc_client_t *client, const mongoc_cmd_t *cmd, mongoc_cmd_t *encrypted_cmd, bson_t *encrypted, bson_error_t *error); bool _mongoc_cse_auto_decrypt( mongoc_client_t *client, const char *db_name, const bson_t *reply, bson_t *decrypted, bson_error_t *error); bool _mongoc_cse_client_enable_auto_encryption(mongoc_client_t *client, mongoc_auto_encryption_opts_t *opts /* may be NULL */, bson_error_t *error); bool _mongoc_cse_client_pool_enable_auto_encryption(mongoc_topology_t *topology, mongoc_auto_encryption_opts_t *opts /* may be NULL */, bson_error_t *error); /* If this returns true, client side encryption is enabled * on the client (or it's parent client pool), and cannot * be disabled. This check is done while holding the * topology lock. So if this returns true, callers are * guaranteed that CSE remains enabled afterwards. */ bool _mongoc_cse_is_enabled(mongoc_client_t *client); /** * @brief The context for the automatic creation of a datakey */ struct auto_datakey_context { /// The output destination for the new key ID. Never NULL. bson_value_t *out_keyid; /// An error output destination for the key generation. May be NULL. bson_error_t *out_error; /// The userdata pointer given to @ref /// _mongoc_encryptedFields_fill_auto_datakeys void *userdata; }; /** * @brief The type of a datakey-creating callback. * * @param ctx The context of the keyId request. @sa auto_datakey_context * @retval true Upon success * @retval false Otherwise. * * @note Errors should be written into `ctx->out_error`. */ typedef bool (*auto_datakey_factory)(struct auto_datakey_context *ctx); /** * @brief Process an array of encryptedFields.fields, automatically filling null * keyId elements by calling the given factory function. * * @param[out] out_fields The modified encryptedFields.fields. Must be destroyed * by the caller. * @param[in] in_fields The input encryptedFields.fields * @param factory A keyId factory. @see auto_datakey_factory * @param userdata The userdata pointer for `factory` * @param[out] error An error output parameter * @retval true On success * @retval false Otherwise */ bool _mongoc_encryptedFields_fill_auto_datakeys( bson_t *out_fields, const bson_t *in_fields, auto_datakey_factory factory, void *userdata, bson_error_t *error); #endif /* MONGOC_CLIENT_SIDE_ENCRYPTION_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-side-encryption.c000066400000000000000000003253111511661753600272110ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef _WIN32 #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include /*-------------------------------------------------------------------------- * Auto Encryption options. *-------------------------------------------------------------------------- */ struct _mongoc_auto_encryption_opts_t { /* keyvault_client and keyvault_client_pool are not owned and must outlive * auto encrypted client/pool. */ mongoc_client_t *keyvault_client; mongoc_client_pool_t *keyvault_client_pool; char *keyvault_db; char *keyvault_coll; bson_t *kms_providers; bson_t *tls_opts; bson_t *schema_map; bson_t *encrypted_fields_map; bool bypass_auto_encryption; bool bypass_query_analysis; mc_kms_credentials_callback creds_cb; bson_t *extra; mcd_optional_u64_t cache_expiration_ms; }; static void _set_creds_callback(mc_kms_credentials_callback *cb, mongoc_kms_credentials_provider_callback_fn fn, void *userdata) { BSON_ASSERT(cb); cb->fn = fn; cb->userdata = userdata; } mongoc_auto_encryption_opts_t * mongoc_auto_encryption_opts_new(void) { return bson_malloc0(sizeof(mongoc_auto_encryption_opts_t)); } void mongoc_auto_encryption_opts_destroy(mongoc_auto_encryption_opts_t *opts) { if (!opts) { return; } bson_destroy(opts->extra); bson_destroy(opts->kms_providers); bson_destroy(opts->schema_map); bson_destroy(opts->encrypted_fields_map); bson_free(opts->keyvault_db); bson_free(opts->keyvault_coll); bson_destroy(opts->tls_opts); bson_free(opts); } void mongoc_auto_encryption_opts_set_keyvault_client(mongoc_auto_encryption_opts_t *opts, mongoc_client_t *client) { if (!opts) { return; } /* Does not own. */ opts->keyvault_client = client; } void mongoc_auto_encryption_opts_set_keyvault_client_pool(mongoc_auto_encryption_opts_t *opts, mongoc_client_pool_t *pool) { if (!opts) { return; } /* Does not own. */ opts->keyvault_client_pool = pool; } void mongoc_auto_encryption_opts_set_keyvault_namespace(mongoc_auto_encryption_opts_t *opts, const char *db, const char *coll) { if (!opts) { return; } bson_free(opts->keyvault_db); opts->keyvault_db = NULL; opts->keyvault_db = bson_strdup(db); bson_free(opts->keyvault_coll); opts->keyvault_coll = NULL; opts->keyvault_coll = bson_strdup(coll); } void mongoc_auto_encryption_opts_set_kms_providers(mongoc_auto_encryption_opts_t *opts, const bson_t *providers) { if (!opts) { return; } bson_destroy(opts->kms_providers); opts->kms_providers = NULL; if (providers) { opts->kms_providers = bson_copy(providers); } } void mongoc_auto_encryption_opts_set_key_expiration(mongoc_auto_encryption_opts_t *opts, uint64_t expiration) { if (!opts) { return; } opts->cache_expiration_ms.set = true; opts->cache_expiration_ms.value = expiration; } /* _bson_copy_or_null returns a copy of @bson or NULL if @bson is NULL */ static bson_t * _bson_copy_or_null(const bson_t *bson) { if (bson) { return bson_copy(bson); } return NULL; } void mongoc_auto_encryption_opts_set_tls_opts(mongoc_auto_encryption_opts_t *opts, const bson_t *tls_opts) { if (!opts) { return; } bson_destroy(opts->tls_opts); opts->tls_opts = _bson_copy_or_null(tls_opts); } void mongoc_auto_encryption_opts_set_schema_map(mongoc_auto_encryption_opts_t *opts, const bson_t *schema_map) { if (!opts) { return; } bson_destroy(opts->schema_map); opts->schema_map = NULL; if (schema_map) { opts->schema_map = bson_copy(schema_map); } } void mongoc_auto_encryption_opts_set_encrypted_fields_map(mongoc_auto_encryption_opts_t *opts, const bson_t *encrypted_fields_map) { if (!opts) { return; } bson_destroy(opts->encrypted_fields_map); opts->encrypted_fields_map = NULL; if (encrypted_fields_map) { opts->encrypted_fields_map = bson_copy(encrypted_fields_map); } } void mongoc_auto_encryption_opts_set_bypass_auto_encryption(mongoc_auto_encryption_opts_t *opts, bool bypass_auto_encryption) { if (!opts) { return; } opts->bypass_auto_encryption = bypass_auto_encryption; } void mongoc_auto_encryption_opts_set_bypass_query_analysis(mongoc_auto_encryption_opts_t *opts, bool bypass_query_analysis) { if (!opts) { return; } opts->bypass_query_analysis = bypass_query_analysis; } void mongoc_auto_encryption_opts_set_extra(mongoc_auto_encryption_opts_t *opts, const bson_t *extra) { if (!opts) { return; } bson_destroy(opts->extra); opts->extra = NULL; if (extra) { opts->extra = bson_copy(extra); } } void mongoc_auto_encryption_opts_set_kms_credential_provider_callback(mongoc_auto_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata) { _set_creds_callback(&opts->creds_cb, fn, userdata); } /*-------------------------------------------------------------------------- * Client Encryption options. *-------------------------------------------------------------------------- */ struct _mongoc_client_encryption_opts_t { mongoc_client_t *keyvault_client; char *keyvault_db; char *keyvault_coll; bson_t *kms_providers; bson_t *tls_opts; mc_kms_credentials_callback creds_cb; mcd_optional_u64_t cache_expiration_ms; }; mongoc_client_encryption_opts_t * mongoc_client_encryption_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_opts_t)); } void mongoc_client_encryption_opts_destroy(mongoc_client_encryption_opts_t *opts) { if (!opts) { return; } _set_creds_callback(&opts->creds_cb, NULL, NULL); bson_free(opts->keyvault_db); bson_free(opts->keyvault_coll); bson_destroy(opts->kms_providers); bson_destroy(opts->tls_opts); bson_free(opts); } void mongoc_client_encryption_opts_set_keyvault_client(mongoc_client_encryption_opts_t *opts, mongoc_client_t *keyvault_client) { if (!opts) { return; } opts->keyvault_client = keyvault_client; } void mongoc_client_encryption_opts_set_keyvault_namespace(mongoc_client_encryption_opts_t *opts, const char *db, const char *coll) { if (!opts) { return; } bson_free(opts->keyvault_db); opts->keyvault_db = NULL; opts->keyvault_db = bson_strdup(db); bson_free(opts->keyvault_coll); opts->keyvault_coll = NULL; opts->keyvault_coll = bson_strdup(coll); } void mongoc_client_encryption_opts_set_kms_providers(mongoc_client_encryption_opts_t *opts, const bson_t *kms_providers) { if (!opts) { return; } bson_destroy(opts->kms_providers); opts->kms_providers = NULL; if (kms_providers) { opts->kms_providers = bson_copy(kms_providers); } } void mongoc_client_encryption_opts_set_tls_opts(mongoc_client_encryption_opts_t *opts, const bson_t *tls_opts) { if (!opts) { return; } bson_destroy(opts->tls_opts); opts->tls_opts = _bson_copy_or_null(tls_opts); } void mongoc_client_encryption_opts_set_kms_credential_provider_callback(mongoc_client_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata) { BSON_ASSERT_PARAM(opts); opts->creds_cb.fn = fn; opts->creds_cb.userdata = userdata; } void mongoc_client_encryption_opts_set_key_expiration(mongoc_client_encryption_opts_t *opts, uint64_t cache_expiration_ms) { BSON_ASSERT_PARAM(opts); opts->cache_expiration_ms.set = true; opts->cache_expiration_ms.value = cache_expiration_ms; } /*-------------------------------------------------------------------------- * Data key options. *-------------------------------------------------------------------------- */ struct _mongoc_client_encryption_datakey_opts_t { bson_t *masterkey; char **keyaltnames; uint32_t keyaltnames_count; uint8_t *keymaterial; uint32_t keymaterial_len; }; mongoc_client_encryption_datakey_opts_t * mongoc_client_encryption_datakey_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_datakey_opts_t)); } static void _clear_datakey_keyaltnames(mongoc_client_encryption_datakey_opts_t *opts) { if (opts->keyaltnames) { for (uint32_t i = 0u; i < opts->keyaltnames_count; i++) { bson_free(opts->keyaltnames[i]); } bson_free(opts->keyaltnames); opts->keyaltnames = NULL; opts->keyaltnames_count = 0; } } void mongoc_client_encryption_datakey_opts_destroy(mongoc_client_encryption_datakey_opts_t *opts) { if (!opts) { return; } bson_destroy(opts->masterkey); _clear_datakey_keyaltnames(opts); bson_free(opts->keymaterial); bson_free(opts); } void mongoc_client_encryption_datakey_opts_set_masterkey(mongoc_client_encryption_datakey_opts_t *opts, const bson_t *masterkey) { if (!opts) { return; } bson_destroy(opts->masterkey); opts->masterkey = NULL; if (masterkey) { opts->masterkey = bson_copy(masterkey); } } void mongoc_client_encryption_datakey_opts_set_keyaltnames(mongoc_client_encryption_datakey_opts_t *opts, char **keyaltnames, uint32_t keyaltnames_count) { if (!opts) { return; } /* Free all first (if any have been set before). */ _clear_datakey_keyaltnames(opts); BSON_ASSERT(!opts->keyaltnames); if (keyaltnames_count) { opts->keyaltnames = BSON_ARRAY_ALLOC(keyaltnames_count, char *); for (uint32_t i = 0u; i < keyaltnames_count; i++) { opts->keyaltnames[i] = bson_strdup(keyaltnames[i]); } opts->keyaltnames_count = keyaltnames_count; } } void mongoc_client_encryption_datakey_opts_set_keymaterial(mongoc_client_encryption_datakey_opts_t *opts, const uint8_t *data, uint32_t len) { if (!opts) { return; } if (opts->keymaterial) { bson_free(opts->keymaterial); } opts->keymaterial = bson_malloc(len); memcpy(opts->keymaterial, data, len); opts->keymaterial_len = len; } /*-------------------------------------------------------------------------- * Explicit Encryption options. *-------------------------------------------------------------------------- */ struct _mongoc_client_encryption_encrypt_range_opts_t { struct { bson_value_t value; bool set; } min; struct { bson_value_t value; bool set; } max; struct { int32_t value; bool set; } trim_factor; struct { int64_t value; bool set; } sparsity; struct { int32_t value; bool set; } precision; }; typedef struct { bool set; int32_t value; } mcd_optional_int32_t; struct _encrypt_text_per_index_opts_t { mcd_optional_int32_t str_max_length; mcd_optional_int32_t str_max_query_length; mcd_optional_int32_t str_min_query_length; }; struct _encrypt_text_prefix_opts_t { struct _encrypt_text_per_index_opts_t per_index_opts; }; struct _encrypt_text_suffix_opts_t { struct _encrypt_text_per_index_opts_t per_index_opts; }; struct _encrypt_text_substring_opts_t { struct _encrypt_text_per_index_opts_t per_index_opts; }; struct _mongoc_client_encryption_encrypt_text_opts_t { mongoc_optional_t case_sensitive; mongoc_optional_t diacritic_sensitive; mongoc_client_encryption_encrypt_text_substring_opts_t *substring; mongoc_client_encryption_encrypt_text_prefix_opts_t *prefix; mongoc_client_encryption_encrypt_text_suffix_opts_t *suffix; }; struct _mongoc_client_encryption_encrypt_opts_t { bson_value_t keyid; char *algorithm; char *keyaltname; struct { int64_t value; bool set; } contention_factor; char *query_type; mongoc_client_encryption_encrypt_range_opts_t *range_opts; mongoc_client_encryption_encrypt_text_opts_t *text_opts; }; mongoc_client_encryption_encrypt_opts_t * mongoc_client_encryption_encrypt_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_opts_t)); } mongoc_client_encryption_encrypt_text_prefix_opts_t * mongoc_client_encryption_encrypt_text_prefix_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_text_prefix_opts_t)); } void mongoc_client_encryption_encrypt_text_prefix_opts_destroy(mongoc_client_encryption_encrypt_text_prefix_opts_t *opts) { bson_free(opts); } void mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_max_query_length.set = true; opts->per_index_opts.str_max_query_length.value = val; } void mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_min_query_length.set = true; opts->per_index_opts.str_min_query_length.value = val; } // Suffix opts mongoc_client_encryption_encrypt_text_suffix_opts_t * mongoc_client_encryption_encrypt_text_suffix_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_text_suffix_opts_t)); } void mongoc_client_encryption_encrypt_text_suffix_opts_destroy(mongoc_client_encryption_encrypt_text_suffix_opts_t *opts) { bson_free(opts); } void mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_max_query_length.set = true; opts->per_index_opts.str_max_query_length.value = val; } void mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_min_query_length.set = true; opts->per_index_opts.str_min_query_length.value = val; } // Substring opts mongoc_client_encryption_encrypt_text_substring_opts_t * mongoc_client_encryption_encrypt_text_substring_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_text_substring_opts_t)); } void mongoc_client_encryption_encrypt_text_substring_opts_destroy( mongoc_client_encryption_encrypt_text_substring_opts_t *opts) { bson_free(opts); } void mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_max_length.set = true; opts->per_index_opts.str_max_length.value = val; } void mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_max_query_length.set = true; opts->per_index_opts.str_max_query_length.value = val; } void mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t val) { BSON_ASSERT_PARAM(opts); opts->per_index_opts.str_min_query_length.set = true; opts->per_index_opts.str_min_query_length.value = val; } // Setters for text opts void mongoc_client_encryption_encrypt_text_opts_set_prefix(mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_prefix_opts_t *popts) { BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(popts); opts->prefix = mongoc_client_encryption_encrypt_text_prefix_opts_new(); *opts->prefix = *popts; } void mongoc_client_encryption_encrypt_text_opts_set_suffix(mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_suffix_opts_t *sopts) { BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(sopts); opts->suffix = mongoc_client_encryption_encrypt_text_suffix_opts_new(); *opts->suffix = *sopts; } void mongoc_client_encryption_encrypt_text_opts_set_substring( mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_substring_opts_t *ssopts) { BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(ssopts); opts->substring = mongoc_client_encryption_encrypt_text_substring_opts_new(); *opts->substring = *ssopts; } mongoc_client_encryption_encrypt_text_opts_t * mongoc_client_encryption_encrypt_text_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_text_opts_t)); } void mongoc_client_encryption_encrypt_text_opts_destroy(mongoc_client_encryption_encrypt_text_opts_t *topts) { if (!topts) { return; } mongoc_client_encryption_encrypt_text_prefix_opts_destroy(topts->prefix); mongoc_client_encryption_encrypt_text_suffix_opts_destroy(topts->suffix); mongoc_client_encryption_encrypt_text_substring_opts_destroy(topts->substring); bson_free(topts); } void mongoc_client_encryption_encrypt_range_opts_destroy(mongoc_client_encryption_encrypt_range_opts_t *range_opts) { if (!range_opts) { return; } if (range_opts->min.set) { bson_value_destroy(&range_opts->min.value); } if (range_opts->max.set) { bson_value_destroy(&range_opts->max.value); } bson_free(range_opts); } void mongoc_client_encryption_encrypt_opts_destroy(mongoc_client_encryption_encrypt_opts_t *opts) { if (!opts) { return; } mongoc_client_encryption_encrypt_range_opts_destroy(opts->range_opts); mongoc_client_encryption_encrypt_text_opts_destroy(opts->text_opts); bson_value_destroy(&opts->keyid); bson_free(opts->algorithm); bson_free(opts->keyaltname); bson_free(opts->query_type); bson_free(opts); } void mongoc_client_encryption_encrypt_opts_set_keyid(mongoc_client_encryption_encrypt_opts_t *opts, const bson_value_t *keyid) { if (!opts) { return; } bson_value_destroy(&opts->keyid); memset(&opts->keyid, 0, sizeof(opts->keyid)); if (keyid) { bson_value_copy(keyid, &opts->keyid); } } void mongoc_client_encryption_encrypt_opts_set_keyaltname(mongoc_client_encryption_encrypt_opts_t *opts, const char *keyaltname) { if (!opts) { return; } bson_free(opts->keyaltname); opts->keyaltname = NULL; opts->keyaltname = bson_strdup(keyaltname); } void mongoc_client_encryption_encrypt_opts_set_algorithm(mongoc_client_encryption_encrypt_opts_t *opts, const char *algorithm) { if (!opts) { return; } bson_free(opts->algorithm); opts->algorithm = NULL; opts->algorithm = bson_strdup(algorithm); } void mongoc_client_encryption_encrypt_opts_set_contention_factor(mongoc_client_encryption_encrypt_opts_t *opts, int64_t contention_factor) { if (!opts) { return; } opts->contention_factor.value = contention_factor; opts->contention_factor.set = true; } void mongoc_client_encryption_encrypt_opts_set_query_type(mongoc_client_encryption_encrypt_opts_t *opts, const char *query_type) { if (!opts) { return; } bson_free(opts->query_type); opts->query_type = query_type ? bson_strdup(query_type) : NULL; } /*-------------------------------------------------------------------------- * Explicit Encryption Range Options *-------------------------------------------------------------------------- */ mongoc_client_encryption_encrypt_range_opts_t * mongoc_client_encryption_encrypt_range_opts_new(void) { return bson_malloc0(sizeof(mongoc_client_encryption_encrypt_range_opts_t)); } void mongoc_client_encryption_encrypt_range_opts_set_trim_factor(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t trim_factor) { BSON_ASSERT_PARAM(range_opts); range_opts->trim_factor.set = true; range_opts->trim_factor.value = trim_factor; } void mongoc_client_encryption_encrypt_range_opts_set_sparsity(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int64_t sparsity) { BSON_ASSERT_PARAM(range_opts); range_opts->sparsity.set = true; range_opts->sparsity.value = sparsity; } void mongoc_client_encryption_encrypt_range_opts_set_min(mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *min) { BSON_ASSERT_PARAM(range_opts); BSON_ASSERT_PARAM(min); if (range_opts->min.set) { bson_value_destroy(&range_opts->min.value); } range_opts->min.set = true; bson_value_copy(min, &range_opts->min.value); } void mongoc_client_encryption_encrypt_range_opts_set_max(mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *max) { BSON_ASSERT_PARAM(range_opts); BSON_ASSERT_PARAM(max); if (range_opts->max.set) { bson_value_destroy(&range_opts->max.value); } range_opts->max.set = true; bson_value_copy(max, &range_opts->max.value); } void mongoc_client_encryption_encrypt_range_opts_set_precision(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t precision) { BSON_ASSERT_PARAM(range_opts); range_opts->precision.set = true; range_opts->precision.value = precision; } static mongoc_client_encryption_encrypt_range_opts_t * copy_range_opts(const mongoc_client_encryption_encrypt_range_opts_t *opts) { BSON_ASSERT_PARAM(opts); mongoc_client_encryption_encrypt_range_opts_t *opts_new = mongoc_client_encryption_encrypt_range_opts_new(); if (opts->min.set) { bson_value_copy(&opts->min.value, &opts_new->min.value); opts_new->min.set = true; } if (opts->max.set) { bson_value_copy(&opts->max.value, &opts_new->max.value); opts_new->max.set = true; } if (opts->precision.set) { opts_new->precision.value = opts->precision.value; opts_new->precision.set = true; } opts_new->sparsity = opts->sparsity; opts_new->trim_factor = opts->trim_factor; return opts_new; } void mongoc_client_encryption_encrypt_opts_set_range_opts(mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_range_opts_t *range_opts) { BSON_ASSERT_PARAM(opts); if (opts->range_opts) { mongoc_client_encryption_encrypt_range_opts_destroy(opts->range_opts); opts->range_opts = NULL; } opts->range_opts = copy_range_opts(range_opts); } /*-------------------------------------------------------------------------- * Explicit Encryption TextPreview Options *-------------------------------------------------------------------------- */ void mongoc_client_encryption_encrypt_opts_set_text_opts(mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_text_opts_t *text_opts) { BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(text_opts); mongoc_client_encryption_encrypt_text_opts_t *t = mongoc_client_encryption_encrypt_text_opts_new(); *t = *text_opts; if (text_opts->substring) { t->substring = mongoc_client_encryption_encrypt_text_substring_opts_new(); *t->substring = *text_opts->substring; } if (text_opts->prefix) { t->prefix = mongoc_client_encryption_encrypt_text_prefix_opts_new(); *t->prefix = *text_opts->prefix; } if (text_opts->suffix) { t->suffix = mongoc_client_encryption_encrypt_text_suffix_opts_new(); *t->suffix = *text_opts->suffix; } opts->text_opts = t; } void mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(mongoc_client_encryption_encrypt_text_opts_t *opts, bool case_sensitive) { BSON_ASSERT_PARAM(opts); opts->case_sensitive.is_set = true; opts->case_sensitive.value = case_sensitive; } void mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(mongoc_client_encryption_encrypt_text_opts_t *opts, bool diacritic_sensitive) { BSON_ASSERT_PARAM(opts); opts->diacritic_sensitive.is_set = true; opts->diacritic_sensitive.value = diacritic_sensitive; } /*-------------------------------------------------------------------------- * RewrapManyDataKeyResult. *-------------------------------------------------------------------------- */ struct _mongoc_client_encryption_rewrap_many_datakey_result_t { bson_t bulk_write_result; }; mongoc_client_encryption_rewrap_many_datakey_result_t * mongoc_client_encryption_rewrap_many_datakey_result_new(void) { mongoc_client_encryption_rewrap_many_datakey_result_t *const res = BSON_ALIGNED_ALLOC0(mongoc_client_encryption_rewrap_many_datakey_result_t); bson_init(&res->bulk_write_result); return res; } void mongoc_client_encryption_rewrap_many_datakey_result_destroy( mongoc_client_encryption_rewrap_many_datakey_result_t *result) { if (!result) { return; } bson_destroy(&result->bulk_write_result); bson_free(result); } const bson_t * mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result( mongoc_client_encryption_rewrap_many_datakey_result_t *result) { if (!result) { return NULL; } /* bulkWriteResult may be empty if no result of a bulk write operation has * been assigned to it. Treat as equivalent to an unset optional state. */ if (bson_empty(&result->bulk_write_result)) { return NULL; } return &result->bulk_write_result; } #ifndef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION static bool _disabled_error(bson_error_t *error) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "libmongoc is not built with support for Client-Side Field " "Level Encryption. Configure with " "ENABLE_CLIENT_SIDE_ENCRYPTION=ON."); return false; } bool _mongoc_cse_auto_encrypt(mongoc_client_t *client, const mongoc_cmd_t *cmd, mongoc_cmd_t *encrypted_cmd, bson_t *encrypted, bson_error_t *error) { BSON_UNUSED(client); BSON_UNUSED(cmd); BSON_UNUSED(encrypted_cmd); bson_init(encrypted); return _disabled_error(error); } bool _mongoc_cse_auto_decrypt( mongoc_client_t *client, const char *db_name, const bson_t *reply, bson_t *decrypted, bson_error_t *error) { BSON_UNUSED(client); BSON_UNUSED(db_name); BSON_UNUSED(reply); bson_init(decrypted); return _disabled_error(error); } bool _mongoc_cse_client_enable_auto_encryption(mongoc_client_t *client, mongoc_auto_encryption_opts_t *opts /* may be NULL */, bson_error_t *error) { BSON_UNUSED(client); BSON_UNUSED(opts); return _disabled_error(error); } bool _mongoc_cse_client_pool_enable_auto_encryption(mongoc_topology_t *topology, mongoc_auto_encryption_opts_t *opts /* may be NULL */, bson_error_t *error) { BSON_UNUSED(topology); BSON_UNUSED(opts); return _disabled_error(error); } bool mongoc_client_encryption_create_datakey(mongoc_client_encryption_t *client_encryption, const char *kms_provider, const mongoc_client_encryption_datakey_opts_t *opts, bson_value_t *keyid, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(kms_provider); BSON_UNUSED(opts); if (keyid) { memset(keyid, 0, sizeof(*keyid)); } return _disabled_error(error); } bool mongoc_client_encryption_rewrap_many_datakey(mongoc_client_encryption_t *client_encryption, const bson_t *filter, const char *provider, const bson_t *master_key, mongoc_client_encryption_rewrap_many_datakey_result_t *result, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(filter); BSON_UNUSED(provider); BSON_UNUSED(master_key); BSON_UNUSED(result); return _disabled_error(error); } bool mongoc_client_encryption_delete_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *reply, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(keyid); _mongoc_bson_init_if_set(reply); return _disabled_error(error); } bool mongoc_client_encryption_get_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *key_doc, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(keyid); _mongoc_bson_init_if_set(key_doc); return _disabled_error(error); } mongoc_cursor_t * mongoc_client_encryption_get_keys(mongoc_client_encryption_t *client_encryption, bson_error_t *error) { BSON_UNUSED(client_encryption); _disabled_error(error); return NULL; } bool mongoc_client_encryption_add_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(keyid); BSON_UNUSED(keyaltname); _mongoc_bson_init_if_set(key_doc); return _disabled_error(error); } bool mongoc_client_encryption_remove_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(keyid); BSON_UNUSED(keyaltname); _mongoc_bson_init_if_set(key_doc); return _disabled_error(error); } bool mongoc_client_encryption_get_key_by_alt_name(mongoc_client_encryption_t *client_encryption, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(keyaltname); _mongoc_bson_init_if_set(key_doc); return _disabled_error(error); } mongoc_client_encryption_t * mongoc_client_encryption_new(mongoc_client_encryption_opts_t *opts, bson_error_t *error) { BSON_UNUSED(opts); _disabled_error(error); return NULL; } void mongoc_client_encryption_destroy(mongoc_client_encryption_t *client_encryption) { BSON_UNUSED(client_encryption); } bool mongoc_client_encryption_encrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *value, mongoc_client_encryption_encrypt_opts_t *opts, bson_value_t *ciphertext, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(value); BSON_UNUSED(opts); if (ciphertext) { memset(ciphertext, 0, sizeof(*ciphertext)); } return _disabled_error(error); } bool mongoc_client_encryption_encrypt_expression(mongoc_client_encryption_t *client_encryption, const bson_t *expr, mongoc_client_encryption_encrypt_opts_t *opts, bson_t *expr_encrypted, bson_error_t *error) { BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(expr); BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(expr_encrypted); BSON_OPTIONAL_PARAM(error); bson_init(expr_encrypted); return _disabled_error(error); } bool mongoc_client_encryption_decrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *ciphertext, bson_value_t *value, bson_error_t *error) { BSON_UNUSED(client_encryption); BSON_UNUSED(ciphertext); if (value) { memset(value, 0, sizeof(*value)); } return _disabled_error(error); } bool _mongoc_cse_is_enabled(mongoc_client_t *client) { BSON_UNUSED(client); return false; } mongoc_collection_t * mongoc_client_encryption_create_encrypted_collection(mongoc_client_encryption_t *enc, struct _mongoc_database_t *database, const char *name, const bson_t *in_options, bson_t *opt_out_options, const char *const kms_provider, const bson_t *opt_masterkey, bson_error_t *error) { BSON_UNUSED(enc); BSON_UNUSED(database); BSON_UNUSED(name); BSON_UNUSED(in_options); BSON_UNUSED(opt_out_options); BSON_UNUSED(kms_provider); BSON_UNUSED(opt_masterkey); _disabled_error(error); return NULL; } #else /* Appends the range opts set by the user into a bson_t that can be passed to * libmongocrypt. */ static void append_bson_range_opts(bson_t *bson_range_opts, const mongoc_client_encryption_encrypt_opts_t *opts) { BSON_ASSERT_PARAM(bson_range_opts); BSON_ASSERT_PARAM(opts); if (opts->range_opts->min.set) { BSON_ASSERT(BSON_APPEND_VALUE(bson_range_opts, "min", &opts->range_opts->min.value)); } if (opts->range_opts->max.set) { BSON_ASSERT(BSON_APPEND_VALUE(bson_range_opts, "max", &opts->range_opts->max.value)); } if (opts->range_opts->precision.set) { BSON_ASSERT(BSON_APPEND_INT32(bson_range_opts, "precision", opts->range_opts->precision.value)); } if (opts->range_opts->sparsity.set) { BSON_ASSERT(BSON_APPEND_INT64(bson_range_opts, "sparsity", opts->range_opts->sparsity.value)); } if (opts->range_opts->trim_factor.set) { BSON_ASSERT(BSON_APPEND_INT32(bson_range_opts, "trimFactor", opts->range_opts->trim_factor.value)); } } static void append_bson_text_per_index_opts(bson_t *out, const struct _encrypt_text_per_index_opts_t *opts) { BSON_ASSERT_PARAM(out); BSON_ASSERT_PARAM(opts); if (opts->str_max_length.set) { BSON_ASSERT(bson_append_int32(out, "strMaxLength", -1, opts->str_max_length.value)); } if (opts->str_max_query_length.set) { BSON_ASSERT(bson_append_int32(out, "strMaxQueryLength", -1, opts->str_max_query_length.value)); } if (opts->str_min_query_length.set) { BSON_ASSERT(bson_append_int32(out, "strMinQueryLength", -1, opts->str_min_query_length.value)); } } static void append_bson_text_opts(bson_t *bson_text_opts, const mongoc_client_encryption_encrypt_text_opts_t *opts) { BSON_ASSERT_PARAM(bson_text_opts); BSON_ASSERT_PARAM(opts); if (opts->case_sensitive.is_set) { BSON_ASSERT(BSON_APPEND_BOOL(bson_text_opts, "caseSensitive", opts->case_sensitive.value)); } if (opts->diacritic_sensitive.is_set) { BSON_ASSERT(BSON_APPEND_BOOL(bson_text_opts, "diacriticSensitive", opts->diacritic_sensitive.value)); } if (opts->prefix) { bson_t per_index_spec; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(bson_text_opts, "prefix", &per_index_spec)); append_bson_text_per_index_opts(&per_index_spec, &opts->prefix->per_index_opts); BSON_ASSERT(bson_append_document_end(bson_text_opts, &per_index_spec)); } if (opts->suffix) { bson_t per_index_spec; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(bson_text_opts, "suffix", &per_index_spec)); append_bson_text_per_index_opts(&per_index_spec, &opts->suffix->per_index_opts); BSON_ASSERT(bson_append_document_end(bson_text_opts, &per_index_spec)); } if (opts->substring) { bson_t per_index_spec; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(bson_text_opts, "substring", &per_index_spec)); append_bson_text_per_index_opts(&per_index_spec, &opts->substring->per_index_opts); BSON_ASSERT(bson_append_document_end(bson_text_opts, &per_index_spec)); } } /*-------------------------------------------------------------------------- * * _prep_for_auto_encryption -- * If @cmd contains a type=1 payload (document sequence), convert it into * a type=0 payload (array payload). See OP_MSG spec for details. * Place the command BSON that should be encrypted into @out. * * Post-conditions: * @out is initialized and set to the full payload. If @cmd did not include * a type=1 payload, @out is statically initialized. Caller must not modify * @out after, but must call bson_destroy. * * -------------------------------------------------------------------------- */ static void _prep_for_auto_encryption(const mongoc_cmd_t *cmd, bson_t *out) { // If there are no document sequences (OP_MSG Section with payloadType=1), return the command unchanged. if (cmd->payloads_count == 0) { BSON_ASSERT(bson_init_static(out, bson_get_data(cmd->command), cmd->command->len)); return; } /* Otherwise, append the type=1 payload as an array. */ bson_copy_to(cmd->command, out); _mongoc_cmd_append_payload_as_array(cmd, out); } /* Return the mongocryptd client to use on a client with automatic encryption * enabled. * If @client_encrypted is single-threaded, use the client to mongocryptd. * If @client_encrypted is multi-threaded, use the client pool to mongocryptd. */ mongoc_client_t * _get_mongocryptd_client(mongoc_client_t *client_encrypted) { BSON_ASSERT_PARAM(client_encrypted); if (client_encrypted->topology->single_threaded) { return client_encrypted->topology->mongocryptd_client; } return mongoc_client_pool_pop(client_encrypted->topology->mongocryptd_client_pool); } void _release_mongocryptd_client(mongoc_client_t *client_encrypted, mongoc_client_t *mongocryptd_client) { BSON_ASSERT_PARAM(client_encrypted); if (!mongocryptd_client) { return; } if (!client_encrypted->topology->single_threaded) { mongoc_client_pool_push(client_encrypted->topology->mongocryptd_client_pool, mongocryptd_client); } } /* Return the key vault collection to use on a client with automatic encryption * enabled. * If no custom key vault client/pool is set, create a collection from the * @client_encrypted itself. * If @client_encrypted is single-threaded, use the client to mongocryptd to * create the collection. * If @client_encrypted is multi-threaded, use the client pool to mongocryptd * to create the collection. */ mongoc_collection_t * _get_keyvault_coll(mongoc_client_t *client_encrypted) { BSON_ASSERT_PARAM(client_encrypted); mongoc_write_concern_t *const wc = mongoc_write_concern_new(); mongoc_read_concern_t *const rc = mongoc_read_concern_new(); mongoc_client_t *keyvault_client; const char *db; const char *coll; mongoc_collection_t *res = NULL; db = client_encrypted->topology->keyvault_db; coll = client_encrypted->topology->keyvault_coll; if (client_encrypted->topology->single_threaded) { if (client_encrypted->topology->keyvault_client) { keyvault_client = client_encrypted->topology->keyvault_client; } else { keyvault_client = client_encrypted; } } else { if (client_encrypted->topology->keyvault_client_pool) { keyvault_client = mongoc_client_pool_pop(client_encrypted->topology->keyvault_client_pool); } else { keyvault_client = client_encrypted; } } res = mongoc_client_get_collection(keyvault_client, db, coll); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(res, wc); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_collection_set_read_concern(res, rc); mongoc_write_concern_destroy(wc); mongoc_read_concern_destroy(rc); return res; } void _release_keyvault_coll(mongoc_client_t *client_encrypted, mongoc_collection_t *keyvault_coll) { mongoc_client_t *keyvault_client; BSON_ASSERT_PARAM(client_encrypted); if (!keyvault_coll) { return; } keyvault_client = keyvault_coll->client; mongoc_collection_destroy(keyvault_coll); if (!client_encrypted->topology->single_threaded && client_encrypted->topology->keyvault_client_pool) { mongoc_client_pool_push(client_encrypted->topology->keyvault_client_pool, keyvault_client); } } static bool _spawn_mongocryptd(const char *mongocryptd_spawn_path, const bson_t *mongocryptd_spawn_args, bson_error_t *error); /*-------------------------------------------------------------------------- * * _mongoc_cse_auto_encrypt -- * * Perform automatic encryption if enabled. * * Return: * True on success, false on error. * * Pre-conditions: * CSE is enabled on client or its associated client pool. * * Post-conditions: * If return false, @error is set. @encrypted is always initialized. * @encrypted_cmd is set to the mongoc_cmd_t to send, which may refer * to @encrypted. * If automatic encryption was bypassed, @encrypted is set to an empty * document, but @encrypted_cmd is a copy of @cmd. Caller must always * bson_destroy @encrypted. * *-------------------------------------------------------------------------- */ bool _mongoc_cse_auto_encrypt(mongoc_client_t *client_encrypted, const mongoc_cmd_t *cmd, mongoc_cmd_t *encrypted_cmd, bson_t *encrypted, bson_error_t *error) { bool ret = false; bson_t cmd_bson = BSON_INITIALIZER; bson_t *result = NULL; bson_iter_t iter; mongoc_client_t *mongocryptd_client = NULL; mongoc_collection_t *keyvault_coll = NULL; bool retried = false; ENTRY; BSON_ASSERT_PARAM(client_encrypted); bson_init(encrypted); if (client_encrypted->topology->bypass_auto_encryption) { memcpy(encrypted_cmd, cmd, sizeof(mongoc_cmd_t)); bson_destroy(&cmd_bson); RETURN(true); } if (cmd->server_stream->sd->max_wire_version < WIRE_VERSION_CSE) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "%s", "Auto-encryption requires a minimum MongoDB version of 4.2"); GOTO(fail); } /* Construct the command we're sending to libmongocrypt. If cmd includes a * type 1 payload, convert it to a type 0 payload. */ bson_destroy(&cmd_bson); _prep_for_auto_encryption(cmd, &cmd_bson); keyvault_coll = _get_keyvault_coll(client_encrypted); mongocryptd_client = _get_mongocryptd_client(client_encrypted); retry: bson_destroy(encrypted); if (!_mongoc_crypt_auto_encrypt(client_encrypted->topology->crypt, keyvault_coll, mongocryptd_client, client_encrypted, cmd->db_name, &cmd_bson, encrypted, error)) { /* From the Client-Side Encryption spec: If spawning is necessary, the * driver MUST spawn mongocryptd whenever server selection on the * MongoClient to mongocryptd fails. If the MongoClient fails to connect * after spawning, the server selection error is propagated to the user. */ if (!client_encrypted->topology->mongocryptd_bypass_spawn && error->domain == MONGOC_ERROR_SERVER_SELECTION && !retried) { if (!_spawn_mongocryptd(client_encrypted->topology->mongocryptd_spawn_path, client_encrypted->topology->mongocryptd_spawn_args, error)) { GOTO(fail); } /* Respawn and retry. */ memset(error, 0, sizeof(*error)); retried = true; GOTO(retry); } GOTO(fail); } /* Re-append $db if encryption stripped it. */ if (!bson_iter_init_find(&iter, encrypted, "$db")) { BSON_APPEND_UTF8(encrypted, "$db", cmd->db_name); } /* Create the modified cmd_t. */ memcpy(encrypted_cmd, cmd, sizeof(mongoc_cmd_t)); /* Modify the mongoc_cmd_t and clear the payloads, since * _mongoc_cse_auto_encrypt converted the payloads into an embedded array. */ encrypted_cmd->payloads_count = 0; encrypted_cmd->command = encrypted; ret = true; fail: bson_destroy(result); bson_destroy(&cmd_bson); _release_mongocryptd_client(client_encrypted, mongocryptd_client); _release_keyvault_coll(client_encrypted, keyvault_coll); RETURN(ret); } /*-------------------------------------------------------------------------- * * _mongoc_cse_auto_decrypt -- * * Perform automatic decryption. * * Return: * True on success, false on error. * * Pre-conditions: * FLE is enabled on client or its associated client pool. * * Post-conditions: * If return false, @error is set. @decrypted is always initialized. * *-------------------------------------------------------------------------- */ bool _mongoc_cse_auto_decrypt( mongoc_client_t *client_encrypted, const char *db_name, const bson_t *reply, bson_t *decrypted, bson_error_t *error) { bool ret = false; mongoc_collection_t *keyvault_coll = NULL; ENTRY; BSON_ASSERT_PARAM(client_encrypted); BSON_UNUSED(db_name); keyvault_coll = _get_keyvault_coll(client_encrypted); if (!_mongoc_crypt_auto_decrypt(client_encrypted->topology->crypt, keyvault_coll, reply, decrypted, error)) { GOTO(fail); } ret = true; fail: _release_keyvault_coll(client_encrypted, keyvault_coll); RETURN(ret); } static void _uri_construction_error(bson_error_t *error) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Error constructing URI to mongocryptd"); } #ifdef _WIN32 static bool _do_spawn(const char *path, char **args, bson_error_t *error) { mcommon_string_append_t command; char **arg; PROCESS_INFORMATION process_information; STARTUPINFO startup_info; /* Construct the full command, quote path and arguments. */ mcommon_string_new_as_append(&command); mcommon_string_append(&command, "\""); if (path) { mcommon_string_append(&command, path); } mcommon_string_append(&command, "mongocryptd.exe"); mcommon_string_append(&command, "\""); /* skip the "mongocryptd" first arg. */ arg = args + 1; while (*arg) { mcommon_string_append(&command, " \""); mcommon_string_append(&command, *arg); mcommon_string_append(&command, "\""); arg++; } ZeroMemory(&process_information, sizeof(process_information)); ZeroMemory(&startup_info, sizeof(startup_info)); startup_info.cb = sizeof(startup_info); if (!CreateProcessA(NULL, mcommon_str_from_append(&command), NULL, NULL, false /* inherit descriptors */, DETACHED_PROCESS /* FLAGS */, NULL /* environment */, NULL /* current directory */, &startup_info, &process_information)) { char *message = mongoc_winerr_to_string(GetLastError()); _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "failed to spawn mongocryptd: %s", message); bson_free(message); mcommon_string_from_append_destroy(&command); return false; } mcommon_string_from_append_destroy(&command); return true; } #else /*-------------------------------------------------------------------------- * * _do_spawn -- * * Spawn process defined by arg[0] on POSIX systems. * * Note, if mongocryptd fails to spawn (due to not being found on the path), * an error is not reported and true is returned. Users will get an error * later, upon first attempt to use mongocryptd. * * These comments refer to three distinct processes: parent, child, and * mongocryptd. * - parent is initial calling process * - child is the first forked child. It fork-execs mongocryptd then * terminates. This makes mongocryptd an orphan, making it immediately * adopted by the init process. * - mongocryptd is the final background daemon (grandchild process). * * Return: * False if an error definitely occurred. Returns true if no reportable * error occurred (though an error may have occurred in starting * mongocryptd, resulting in the process not running). * * Arguments: * args - A NULL terminated list of arguments. The first argument MUST * be the name of the process to execute, and the last argument MUST be * NULL. * * Post-conditions: * If return false, @error is set. * *-------------------------------------------------------------------------- */ static bool _do_spawn(const char *path, char **args, bson_error_t *error) { pid_t pid; int fd; char *to_exec; // String allocation must be done up-front, as allocation is not fork-safe. if (path) { to_exec = bson_strdup_printf("%s%s", path, args[0]); } else { to_exec = bson_strdup(args[0]); } /* Fork. The child will terminate immediately (after fork-exec'ing * mongocryptd). This orphans mongocryptd, and allows parent to wait on * child. */ pid = fork(); if (pid < 0) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "failed to fork (errno=%d) '%s'", errno, strerror(errno)); bson_free(to_exec); return false; } else if (pid > 0) { int child_status; /* Child will spawn mongocryptd and immediately terminate to turn * mongocryptd into an orphan. */ if (waitpid(pid, &child_status, 0 /* options */) < 0) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "failed to wait for child (errno=%d) '%s'", errno, strerror(errno)); bson_free(to_exec); return false; } /* parent is done at this point, return. */ bson_free(to_exec); return true; } /* We're no longer in the parent process. Errors encountered result in an * exit. * Note, we're not logging here, because that would require the user's log * callback to be fork-safe. */ /* Start a new session for the child, so it is not bound to the current * session (e.g. terminal session). */ if (setsid() < 0) { _exit(EXIT_FAILURE); } /* Fork again. Child terminates so mongocryptd gets orphaned and immedately * adopted by init. */ signal(SIGHUP, SIG_IGN); pid = fork(); if (pid < 0) { _exit(EXIT_FAILURE); } else if (pid > 0) { /* Child terminates immediately. */ _exit(EXIT_SUCCESS); } /* If we later decide to change the working directory for the pid file path, * possibly change the process's working directory with chdir like: `chdir * (default_pid_path)`. Currently pid file ends up in application's working * directory. */ /* Set the user file creation mask to zero. */ umask(0); /* Close and reopen stdin. */ fd = open("/dev/null", O_RDONLY); if (fd < 0) { _exit(EXIT_FAILURE); } dup2(fd, STDIN_FILENO); close(fd); /* Close and reopen stdout. */ fd = open("/dev/null", O_WRONLY); if (fd < 0) { _exit(EXIT_FAILURE); } if (dup2(fd, STDOUT_FILENO) < 0 || close(fd) < 0) { _exit(EXIT_FAILURE); } /* Close and reopen stderr. */ fd = open("/dev/null", O_RDWR); if (fd < 0) { _exit(EXIT_FAILURE); } if (dup2(fd, STDERR_FILENO) < 0 || close(fd) < 0) { _exit(EXIT_FAILURE); } if (execvp(to_exec, args) < 0) { /* Need to exit. */ _exit(EXIT_FAILURE); } /* Will never execute. */ return false; } #endif /*-------------------------------------------------------------------------- * * _spawn_mongocryptd -- * * Attempt to spawn mongocryptd as a background process. * * Return: * False if an error definitely occurred. Returns true if no reportable * error occurred (though an error may have occurred in starting * mongocryptd, resulting in the process not running). * * Arguments: * mongocryptd_spawn_path May be NULL, otherwise the path to mongocryptd. * mongocryptd_spawn_args May be NULL, otherwise a bson_iter_t to the * value "mongocryptdSpawnArgs" in AutoEncryptionOpts.extraOptions * (see spec). * * Post-conditions: * If return false, @error is set. * *-------------------------------------------------------------------------- */ static bool _spawn_mongocryptd(const char *mongocryptd_spawn_path, const bson_t *mongocryptd_spawn_args, bson_error_t *error) { char **args = NULL; bson_iter_t iter; bool passed_idle_shutdown_timeout_secs = false; int num_args = 2; /* for leading "mongocrypt" and trailing NULL */ int i; bool ret; /* iterate once to get length and validate all are strings */ if (mongocryptd_spawn_args) { bson_iter_init(&iter, mongocryptd_spawn_args); while (bson_iter_next(&iter)) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "invalid argument for mongocryptd, must be string"); return false; } /* Check if the arg starts with --idleShutdownTimeoutSecs= or is equal * to --idleShutdownTimeoutSecs */ if (0 == strncmp("--idleShutdownTimeoutSecs=", bson_iter_utf8(&iter, NULL), 26) || 0 == strcmp("--idleShutdownTimeoutSecs", bson_iter_utf8(&iter, NULL))) { passed_idle_shutdown_timeout_secs = true; } num_args++; } } if (!passed_idle_shutdown_timeout_secs) { /* add one more */ num_args++; } args = BSON_ARRAY_ALLOC(num_args, char *); i = 0; args[i++] = "mongocryptd"; if (mongocryptd_spawn_args) { bson_iter_init(&iter, mongocryptd_spawn_args); while (bson_iter_next(&iter)) { args[i++] = (char *)bson_iter_utf8(&iter, NULL); } } if (!passed_idle_shutdown_timeout_secs) { args[i++] = "--idleShutdownTimeoutSecs=60"; } BSON_ASSERT(i == num_args - 1); args[i++] = NULL; ret = _do_spawn(mongocryptd_spawn_path, args, error); bson_free(args); return ret; } static bool _parse_extra(const bson_t *extra, mongoc_topology_t *topology, mongoc_uri_t **uri, bson_error_t *error) { bson_iter_t iter; bool ret = false; ENTRY; *uri = NULL; if (extra) { if (bson_iter_init_find(&iter, extra, "mongocryptdBypassSpawn")) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected bool for option 'mongocryptdBypassSpawn'"); GOTO(fail); } topology->mongocryptd_bypass_spawn = bson_iter_bool(&iter); } if (bson_iter_init_find(&iter, extra, "mongocryptdSpawnPath")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected string for option 'mongocryptdSpawnPath'"); GOTO(fail); } topology->mongocryptd_spawn_path = bson_strdup(bson_iter_utf8(&iter, NULL)); } if (bson_iter_init_find(&iter, extra, "mongocryptdSpawnArgs")) { uint32_t array_len; const uint8_t *array_data; if (!BSON_ITER_HOLDS_ARRAY(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected array for option 'mongocryptdSpawnArgs'"); GOTO(fail); } bson_iter_array(&iter, &array_len, &array_data); topology->mongocryptd_spawn_args = bson_new_from_data(array_data, array_len); } if (bson_iter_init_find(&iter, extra, "mongocryptdURI")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected string for option 'mongocryptdURI'"); GOTO(fail); } *uri = mongoc_uri_new_with_error(bson_iter_utf8(&iter, NULL), error); if (!*uri) { GOTO(fail); } } if (bson_iter_init_find(&iter, extra, "cryptSharedLibPath")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected a string for 'cryptSharedLibPath'"); GOTO(fail); } size_t len; const char *ptr = bson_iter_utf8_unsafe(&iter, &len); bson_free(topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibPath); topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibPath = bson_strdup(ptr); } if (bson_iter_init_find(&iter, extra, "cryptSharedLibRequired")) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected a bool for 'cryptSharedLibRequired'"); GOTO(fail); } topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibRequired = bson_iter_bool_unsafe(&iter); } } if (!*uri) { *uri = mongoc_uri_new_with_error("mongodb://localhost:27020", error); if (!*uri) { GOTO(fail); } if (!mongoc_uri_set_option_as_int32(*uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 10000)) { _uri_construction_error(error); GOTO(fail); } } ret = true; fail: RETURN(ret); } bool _mongoc_cse_client_enable_auto_encryption(mongoc_client_t *client, mongoc_auto_encryption_opts_t *opts, bson_error_t *error) { bool ret = false; mongoc_uri_t *mongocryptd_uri = NULL; ENTRY; BSON_ASSERT(client); if (!client->topology->single_threaded) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Automatic encryption on pooled clients must be set on the pool"); GOTO(fail); } if (!opts) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Auto encryption options required"); GOTO(fail); } if (opts->keyvault_client_pool) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client pool only applies to a client " "pool, not a single threaded client"); GOTO(fail); } if (opts->keyvault_client && !opts->keyvault_client->topology->single_threaded) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client must be single threaded, not be " "from a client pool"); GOTO(fail); } /* Check for required options */ if (!opts->keyvault_db || !opts->keyvault_coll) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Key vault namespace option required"); GOTO(fail); } if (!opts->kms_providers) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "KMS providers option required"); GOTO(fail); } if (client->topology->cse_state != MONGOC_CSE_DISABLED) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Automatic encryption already set"); GOTO(fail); } else { client->topology->cse_state = MONGOC_CSE_ENABLED; } if (!_parse_extra(opts->extra, client->topology, &mongocryptd_uri, error)) { GOTO(fail); } client->topology->crypt = _mongoc_crypt_new(opts->kms_providers, opts->schema_map, opts->encrypted_fields_map, opts->tls_opts, client->topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibPath, client->topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibRequired, opts->bypass_auto_encryption, opts->bypass_query_analysis, opts->creds_cb, opts->cache_expiration_ms, error); if (!client->topology->crypt) { GOTO(fail); } const bool have_crypt_shared = _mongoc_crypt_get_crypt_shared_version(client->topology->crypt) != NULL; client->topology->bypass_auto_encryption = opts->bypass_auto_encryption; client->topology->bypass_query_analysis = opts->bypass_query_analysis; if (!client->topology->bypass_auto_encryption && !client->topology->bypass_query_analysis && !have_crypt_shared) { if (!client->topology->mongocryptd_bypass_spawn) { if (!_spawn_mongocryptd( client->topology->mongocryptd_spawn_path, client->topology->mongocryptd_spawn_args, error)) { GOTO(fail); } } /* By default, single threaded clients set serverSelectionTryOnce to * true, which means server selection fails if a topology scan fails * the first time (i.e. it will not make repeat attempts until * serverSelectionTimeoutMS expires). Override this, since the first * attempt to connect to mongocryptd may fail when spawning, as it * takes some time for mongocryptd to listen on sockets. */ if (!mongoc_uri_set_option_as_bool(mongocryptd_uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false)) { _uri_construction_error(error); GOTO(fail); } client->topology->mongocryptd_client = mongoc_client_new_from_uri(mongocryptd_uri); if (!client->topology->mongocryptd_client) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Unable to create client to mongocryptd"); GOTO(fail); } /* Similarly, single threaded clients will by default wait for 5 second * cooldown period after failing to connect to a server before making * another attempt. Meaning if the first attempt to mongocryptd fails * to connect, then the user observes a 5 second delay. This is not * configurable in the URI, so override. */ _mongoc_topology_bypass_cooldown(client->topology->mongocryptd_client->topology); /* Also, since single threaded server selection can foreseeably take * connectTimeoutMS (which by default is longer than 10 seconds), reduce * this as well. */ if (!mongoc_uri_set_option_as_int32(mongocryptd_uri, MONGOC_URI_CONNECTTIMEOUTMS, 10000)) { _uri_construction_error(error); GOTO(fail); } } client->topology->keyvault_db = bson_strdup(opts->keyvault_db); client->topology->keyvault_coll = bson_strdup(opts->keyvault_coll); if (opts->keyvault_client) { client->topology->keyvault_client = opts->keyvault_client; } if (opts->encrypted_fields_map) { client->topology->encrypted_fields_map = bson_copy(opts->encrypted_fields_map); } ret = true; fail: mongoc_uri_destroy(mongocryptd_uri); RETURN(ret); } bool _mongoc_cse_client_pool_enable_auto_encryption(mongoc_topology_t *topology, mongoc_auto_encryption_opts_t *opts, bson_error_t *error) { bool setup_okay = false; mongoc_uri_t *mongocryptd_uri = NULL; mongoc_topology_cse_state_t prev_cse_state = MONGOC_CSE_STARTING; BSON_ASSERT(topology); if (!opts) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Auto encryption options required"); GOTO(fail); } if (opts->keyvault_client) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client only applies to a single threaded " "client not a client pool. Set a key vault client pool"); GOTO(fail); } /* Check for required options */ if (!opts->keyvault_db || !opts->keyvault_coll) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Key vault namespace option required"); GOTO(fail); } if (!opts->kms_providers) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "KMS providers option required"); GOTO(fail); } prev_cse_state = mcommon_atomic_int_compare_exchange_strong( (int *)&topology->cse_state, MONGOC_CSE_DISABLED, MONGOC_CSE_STARTING, mcommon_memory_order_acquire); while (prev_cse_state == MONGOC_CSE_STARTING) { /* Another thread is starting client-side encryption. It may take some * time to start, but don't continue until it is finished. */ mcommon_thrd_yield(); prev_cse_state = mcommon_atomic_int_compare_exchange_strong( (int *)&topology->cse_state, MONGOC_CSE_DISABLED, MONGOC_CSE_STARTING, mcommon_memory_order_acquire); } if (prev_cse_state == MONGOC_CSE_ENABLED) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Automatic encryption already set"); GOTO(fail); } /* We just set the CSE state from DISABLED to STARTING. Start it up now. */ if (!_parse_extra(opts->extra, topology, &mongocryptd_uri, error)) { GOTO(fail); } topology->crypt = _mongoc_crypt_new(opts->kms_providers, opts->schema_map, opts->encrypted_fields_map, opts->tls_opts, topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibPath, topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibRequired, opts->bypass_auto_encryption, opts->bypass_query_analysis, opts->creds_cb, opts->cache_expiration_ms, error); if (!topology->crypt) { GOTO(fail); } topology->bypass_auto_encryption = opts->bypass_auto_encryption; topology->bypass_query_analysis = opts->bypass_query_analysis; if (!topology->bypass_auto_encryption && !topology->bypass_query_analysis) { if (!topology->mongocryptd_bypass_spawn) { if (!_spawn_mongocryptd(topology->mongocryptd_spawn_path, topology->mongocryptd_spawn_args, error)) { GOTO(fail); } } topology->mongocryptd_client_pool = mongoc_client_pool_new(mongocryptd_uri); if (!topology->mongocryptd_client_pool) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Unable to create client pool to mongocryptd"); GOTO(fail); } } topology->keyvault_db = bson_strdup(opts->keyvault_db); topology->keyvault_coll = bson_strdup(opts->keyvault_coll); if (opts->keyvault_client_pool) { topology->keyvault_client_pool = opts->keyvault_client_pool; } if (opts->encrypted_fields_map) { topology->encrypted_fields_map = bson_copy(opts->encrypted_fields_map); } setup_okay = true; BSON_ASSERT(prev_cse_state == MONGOC_CSE_DISABLED); fail: if (prev_cse_state == MONGOC_CSE_DISABLED) { /* We need to set the new CSE state. */ mongoc_topology_cse_state_t new_state = setup_okay ? MONGOC_CSE_ENABLED : MONGOC_CSE_DISABLED; mcommon_atomic_int_exchange((int *)&topology->cse_state, new_state, mcommon_memory_order_release); } mongoc_uri_destroy(mongocryptd_uri); RETURN(setup_okay); } struct _mongoc_client_encryption_t { _mongoc_crypt_t *crypt; mongoc_collection_t *keyvault_coll; bson_t *kms_providers; }; mongoc_client_encryption_t * mongoc_client_encryption_new(mongoc_client_encryption_opts_t *opts, bson_error_t *error) { mongoc_client_encryption_t *client_encryption = NULL; bool success = false; mongoc_write_concern_t *wc = NULL; mongoc_read_concern_t *rc = NULL; /* Check for required options */ if (!opts || !opts->keyvault_client || !opts->keyvault_db || !opts->keyvault_coll) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Key vault client and namespace option required"); goto fail; } if (!opts->kms_providers) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "KMS providers option required"); goto fail; } client_encryption = bson_malloc0(sizeof(*client_encryption)); client_encryption->keyvault_coll = mongoc_client_get_collection(opts->keyvault_client, opts->keyvault_db, opts->keyvault_coll); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(client_encryption->keyvault_coll, wc); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_collection_set_read_concern(client_encryption->keyvault_coll, rc); client_encryption->kms_providers = bson_copy(opts->kms_providers); client_encryption->crypt = _mongoc_crypt_new(opts->kms_providers, NULL /* schema_map */, NULL /* encrypted_fields_map */, opts->tls_opts, NULL /* No crypt_shared path */, false /* crypt_shared not requried */, true, /* bypassAutoEncryption (We are explicit) */ false, /* bypass_query_analysis. Not applicable. */ opts->creds_cb, opts->cache_expiration_ms, error); if (!client_encryption->crypt) { goto fail; } success = true; fail: mongoc_write_concern_destroy(wc); mongoc_read_concern_destroy(rc); if (!success) { mongoc_client_encryption_destroy(client_encryption); return NULL; } return client_encryption; } void mongoc_client_encryption_destroy(mongoc_client_encryption_t *client_encryption) { if (!client_encryption) { return; } _mongoc_crypt_destroy(client_encryption->crypt); mongoc_collection_destroy(client_encryption->keyvault_coll); bson_destroy(client_encryption->kms_providers); bson_free(client_encryption); } static bool _coll_has_write_concern_majority(const mongoc_collection_t *coll) { const mongoc_write_concern_t *const wc = mongoc_collection_get_write_concern(coll); return wc && mongoc_write_concern_get_wmajority(wc); } static bool _coll_has_read_concern_majority(const mongoc_collection_t *coll) { const mongoc_read_concern_t *const rc = mongoc_collection_get_read_concern(coll); const char *const level = rc ? mongoc_read_concern_get_level(rc) : NULL; return level && strcmp(level, MONGOC_READ_CONCERN_LEVEL_MAJORITY) == 0; } bool mongoc_client_encryption_create_datakey(mongoc_client_encryption_t *client_encryption, const char *kms_provider, const mongoc_client_encryption_datakey_opts_t *opts, bson_value_t *keyid, bson_error_t *error) { bool ret = false; bson_t datakey = BSON_INITIALIZER; bson_t insert_opts = BSON_INITIALIZER; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); if (!opts) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "required 'opts' unset"); GOTO(fail); } /* reset, so it is safe for caller to call bson_value_destroy on error or * success. */ if (keyid) { keyid->value_type = BSON_TYPE_EOD; } bson_destroy(&datakey); if (!_mongoc_crypt_create_datakey(client_encryption->crypt, kms_provider, opts->masterkey, opts->keyaltnames, opts->keyaltnames_count, opts->keymaterial, opts->keymaterial_len, &datakey, error)) { GOTO(fail); } if (!mongoc_collection_insert_one( client_encryption->keyvault_coll, &datakey, NULL /* opts */, NULL /* reply */, error)) { GOTO(fail); } if (keyid) { bson_iter_t iter; const bson_value_t *id_value; if (!bson_iter_init_find(&iter, &datakey, "_id")) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "data key not did not contain _id"); GOTO(fail); } else if (!BSON_ITER_HOLDS_BINARY(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "data key _id does not contain binary"); GOTO(fail); } else { id_value = bson_iter_value(&iter); bson_value_copy(id_value, keyid); } } ret = true; fail: bson_destroy(&insert_opts); bson_destroy(&datakey); RETURN(ret); } bool mongoc_client_encryption_rewrap_many_datakey(mongoc_client_encryption_t *client_encryption, const bson_t *filter, const char *provider, const bson_t *master_key, mongoc_client_encryption_rewrap_many_datakey_result_t *result, bson_error_t *error) { bson_t keys = BSON_INITIALIZER; bson_t local_result = BSON_INITIALIZER; bson_t *const bulk_write_result = result ? &result->bulk_write_result : &local_result; mongoc_bulk_operation_t *bulk = NULL; bson_iter_t iter; bool ret = false; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT(_coll_has_read_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); bson_reinit(bulk_write_result); if (master_key && !provider) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "expected 'provider' to be set to identify type of 'master_key'"); GOTO(fail); } if (!_mongoc_crypt_rewrap_many_datakey( client_encryption->crypt, client_encryption->keyvault_coll, filter, provider, master_key, &keys, error)) { GOTO(fail); } /* No keys rewrapped, no key documents to update. */ if (bson_empty(&keys)) { bson_destroy(&keys); bson_destroy(&local_result); return true; } bulk = mongoc_collection_create_bulk_operation_with_opts(client_encryption->keyvault_coll, NULL); BSON_ASSERT(bulk); if (!bson_iter_init_find(&iter, &keys, "v")) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "result did not contain expected field 'v'"); GOTO(fail); } if (!BSON_ITER_HOLDS_ARRAY(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "result did not return an array as expected"); GOTO(fail); } BSON_ASSERT(bson_iter_recurse(&iter, &iter)); while (bson_iter_next(&iter)) { const uint8_t *data = NULL; uint32_t len = 0u; bson_t key; bson_iter_t key_iter; bson_subtype_t subtype; bson_t selector = BSON_INITIALIZER; bson_t document = BSON_INITIALIZER; bool doc_success = false; bson_iter_document(&iter, &len, &data); if (!data || !bson_init_static(&key, data, len)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "element is not a valid BSON document"); goto doc_done; } /* Find _id and use as selector. */ { if (!bson_iter_init_find(&key_iter, &key, "_id")) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "could not find _id in key document"); goto doc_done; } bson_iter_binary(&key_iter, &subtype, &len, &data); if (!data || subtype != BSON_SUBTYPE_UUID) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "expected _id in key document to be a UUID"); goto doc_done; } BSON_ASSERT(bson_append_iter(&selector, "_id", 3, &key_iter)); } /* Find and include potentially updated fields. */ { bson_t child; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(&document, "$set", &child)); { if (bson_iter_init_find(&key_iter, &key, "masterKey")) { BSON_ASSERT(bson_append_iter(&child, "masterKey", -1, &key_iter)); } if (bson_iter_init_find(&key_iter, &key, "keyMaterial")) { BSON_ASSERT(bson_append_iter(&child, "keyMaterial", -1, &key_iter)); } } BSON_ASSERT(bson_append_document_end(&document, &child)); } /* Update updateDate field. */ BCON_APPEND(&document, "$currentDate", "{", "updateDate", BCON_BOOL(true), "}"); if (!mongoc_bulk_operation_update_one_with_opts(bulk, &selector, &document, NULL, error)) { goto doc_done; } doc_success = true; doc_done: bson_destroy(&key); bson_destroy(&selector); bson_destroy(&document); if (!doc_success) { GOTO(fail); } } if (!mongoc_bulk_operation_execute(bulk, bulk_write_result, error)) { GOTO(fail); } ret = true; fail: bson_destroy(&keys); bson_destroy(&local_result); mongoc_bulk_operation_destroy(bulk); RETURN(ret); } bool mongoc_client_encryption_delete_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *reply, bson_error_t *error) { bool ret = false; bson_t selector = BSON_INITIALIZER; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(keyid); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(keyid->value_type == BSON_TYPE_BINARY); BSON_ASSERT(keyid->value.v_binary.subtype == BSON_SUBTYPE_UUID); BSON_ASSERT(keyid->value.v_binary.data_len > 0u); BSON_ASSERT(BSON_APPEND_BINARY( &selector, "_id", keyid->value.v_binary.subtype, keyid->value.v_binary.data, keyid->value.v_binary.data_len)); ret = mongoc_collection_delete_one(client_encryption->keyvault_coll, &selector, NULL, reply, error); bson_destroy(&selector); RETURN(ret); } bool mongoc_client_encryption_get_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *key_doc, bson_error_t *error) { bson_t filter = BSON_INITIALIZER; mongoc_cursor_t *cursor = NULL; bool ret = false; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(keyid); BSON_ASSERT(keyid->value_type == BSON_TYPE_BINARY); BSON_ASSERT(keyid->value.v_binary.subtype == BSON_SUBTYPE_UUID); BSON_ASSERT(keyid->value.v_binary.data_len > 0u); BSON_ASSERT(BSON_APPEND_BINARY( &filter, "_id", keyid->value.v_binary.subtype, keyid->value.v_binary.data, keyid->value.v_binary.data_len)); BSON_ASSERT(_coll_has_read_concern_majority(client_encryption->keyvault_coll)); _mongoc_bson_init_if_set(key_doc); cursor = mongoc_collection_find_with_opts(client_encryption->keyvault_coll, &filter, NULL, NULL); ret = !mongoc_cursor_error(cursor, error); if (ret && key_doc) { const bson_t *bson = NULL; if (mongoc_cursor_next(cursor, &bson)) { bson_copy_to(bson, key_doc); } else if (mongoc_cursor_error(cursor, error)) { ret = false; } } bson_destroy(&filter); mongoc_cursor_destroy(cursor); RETURN(ret); } mongoc_cursor_t * mongoc_client_encryption_get_keys(mongoc_client_encryption_t *client_encryption, bson_error_t *error) { mongoc_cursor_t *cursor = NULL; bson_t filter = BSON_INITIALIZER; ENTRY; BSON_UNUSED(error); BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT(_coll_has_read_concern_majority(client_encryption->keyvault_coll)); /* If an error occurred, user should query cursor error. */ cursor = mongoc_collection_find_with_opts(client_encryption->keyvault_coll, &filter, NULL, NULL); bson_destroy(&filter); RETURN(cursor); } bool mongoc_client_encryption_add_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { mongoc_find_and_modify_opts_t *const opts = mongoc_find_and_modify_opts_new(); bson_t query = BSON_INITIALIZER; bool ret = false; bson_t local_reply; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(keyid); BSON_ASSERT_PARAM(keyaltname); BSON_ASSERT(_coll_has_read_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(keyid->value_type == BSON_TYPE_BINARY); BSON_ASSERT(keyid->value.v_binary.subtype == BSON_SUBTYPE_UUID); BSON_ASSERT(keyid->value.v_binary.data_len > 0u); BSON_ASSERT(BSON_APPEND_BINARY( &query, "_id", keyid->value.v_binary.subtype, keyid->value.v_binary.data, keyid->value.v_binary.data_len)); _mongoc_bson_init_if_set(key_doc); { bson_t *const update = BCON_NEW("$addToSet", "{", "keyAltNames", BCON_UTF8(keyaltname), "}"); BSON_ASSERT(mongoc_find_and_modify_opts_set_update(opts, update)); bson_destroy(update); } ret = mongoc_collection_find_and_modify_with_opts(client_encryption->keyvault_coll, &query, opts, &local_reply, error); if (ret && key_doc) { bson_iter_t iter; if (bson_iter_init_find(&iter, &local_reply, "value")) { const bson_value_t *const value = bson_iter_value(&iter); if (value->value_type == BSON_TYPE_DOCUMENT) { bson_t bson; BSON_ASSERT(bson_init_static(&bson, value->value.v_doc.data, value->value.v_doc.data_len)); bson_copy_to(&bson, key_doc); bson_destroy(&bson); } else if (value->value_type == BSON_TYPE_NULL) { bson_t bson = BSON_INITIALIZER; bson_copy_to(&bson, key_doc); bson_destroy(&bson); } else { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "expected field value to be a document or null"); ret = false; } } } mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&query); bson_destroy(&local_reply); RETURN(ret); } bool mongoc_client_encryption_remove_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { bson_t query = BSON_INITIALIZER; bool ret = false; bson_t local_reply; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(keyid); BSON_ASSERT_PARAM(keyaltname); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(keyid->value_type == BSON_TYPE_BINARY); BSON_ASSERT(keyid->value.v_binary.subtype == BSON_SUBTYPE_UUID); BSON_ASSERT(keyid->value.v_binary.data_len > 0u); BSON_ASSERT(BSON_APPEND_BINARY( &query, "_id", keyid->value.v_binary.subtype, keyid->value.v_binary.data, keyid->value.v_binary.data_len)); _mongoc_bson_init_if_set(key_doc); { mongoc_find_and_modify_opts_t *const opts = mongoc_find_and_modify_opts_new(); /* clang-format off */ bson_t *const update = BCON_NEW ( "0", "{", "$set", "{", "keyAltNames", "{", "$cond", "[", "{", "$eq", "[", "$keyAltNames", "[", keyaltname, "]", "]", "}", "$$REMOVE", "{", "$filter", "{", "input", "$keyAltNames", "cond", "{", "$ne", "[", "$$this", keyaltname, "]", "}", "}", "}", "]", "}", "}", "}"); /* clang-format on */ BSON_ASSERT(mongoc_find_and_modify_opts_set_update(opts, update)); ret = mongoc_collection_find_and_modify_with_opts( client_encryption->keyvault_coll, &query, opts, &local_reply, error); bson_destroy(update); mongoc_find_and_modify_opts_destroy(opts); } if (ret && key_doc) { bson_iter_t iter; if (bson_iter_init_find(&iter, &local_reply, "value")) { const bson_value_t *const value = bson_iter_value(&iter); if (value->value_type == BSON_TYPE_DOCUMENT) { bson_t bson; BSON_ASSERT(bson_init_static(&bson, value->value.v_doc.data, value->value.v_doc.data_len)); bson_copy_to(&bson, key_doc); bson_destroy(&bson); } else if (value->value_type == BSON_TYPE_NULL) { bson_t bson = BSON_INITIALIZER; bson_copy_to(&bson, key_doc); bson_destroy(&bson); } else { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "expected field value to be a document or null"); ret = false; } } } bson_destroy(&query); bson_destroy(&local_reply); RETURN(ret); } bool mongoc_client_encryption_get_key_by_alt_name(mongoc_client_encryption_t *client_encryption, const char *keyaltname, bson_t *key_doc, bson_error_t *error) { bson_t filter = BSON_INITIALIZER; mongoc_cursor_t *cursor = NULL; bool ret = false; ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(keyaltname); BSON_ASSERT(_coll_has_write_concern_majority(client_encryption->keyvault_coll)); BSON_ASSERT(BSON_APPEND_UTF8(&filter, "keyAltNames", keyaltname)); _mongoc_bson_init_if_set(key_doc); cursor = mongoc_collection_find_with_opts(client_encryption->keyvault_coll, &filter, NULL, NULL); ret = !mongoc_cursor_error(cursor, error); if (ret && key_doc) { const bson_t *bson = NULL; if (mongoc_cursor_next(cursor, &bson)) { bson_copy_to(bson, key_doc); } else if (mongoc_cursor_error(cursor, error)) { ret = false; } } bson_destroy(&filter); mongoc_cursor_destroy(cursor); RETURN(ret); } bool mongoc_client_encryption_encrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *value, mongoc_client_encryption_encrypt_opts_t *opts, bson_value_t *ciphertext, bson_error_t *error) { bool ret = false; bson_t *range_opts = NULL, *text_opts = NULL; ENTRY; BSON_ASSERT(client_encryption); if (!ciphertext) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "required 'ciphertext' unset"); GOTO(fail); } /* reset, so it is safe for caller to call bson_value_destroy on error or * success. */ ciphertext->value_type = BSON_TYPE_EOD; if (!opts) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "required 'opts' unset"); GOTO(fail); } if (opts->range_opts) { range_opts = bson_new(); append_bson_range_opts(range_opts, opts); } if (opts->text_opts) { text_opts = bson_new(); append_bson_text_opts(text_opts, opts->text_opts); } if (!_mongoc_crypt_explicit_encrypt(client_encryption->crypt, client_encryption->keyvault_coll, opts->algorithm, &opts->keyid, opts->keyaltname, opts->query_type, opts->contention_factor.set ? &opts->contention_factor.value : NULL, range_opts, text_opts, value, ciphertext, error)) { GOTO(fail); } ret = true; fail: bson_destroy(text_opts); bson_destroy(range_opts); RETURN(ret); } bool mongoc_client_encryption_encrypt_expression(mongoc_client_encryption_t *client_encryption, const bson_t *expr, mongoc_client_encryption_encrypt_opts_t *opts, bson_t *expr_out, bson_error_t *error) { ENTRY; BSON_ASSERT_PARAM(client_encryption); BSON_ASSERT_PARAM(expr); BSON_ASSERT_PARAM(opts); BSON_ASSERT_PARAM(expr_out); BSON_OPTIONAL_PARAM(error); bson_init(expr_out); bson_t *range_opts = NULL; if (opts->range_opts) { range_opts = bson_new(); append_bson_range_opts(range_opts, opts); } bson_t *text_opts = NULL; if (opts->text_opts) { text_opts = bson_new(); append_bson_text_opts(text_opts, opts->text_opts); } if (!_mongoc_crypt_explicit_encrypt_expression(client_encryption->crypt, client_encryption->keyvault_coll, opts->algorithm, &opts->keyid, opts->keyaltname, opts->query_type, opts->contention_factor.set ? &opts->contention_factor.value : NULL, range_opts, text_opts, expr, expr_out, error)) { bson_destroy(range_opts); RETURN(false); } bson_destroy(range_opts); RETURN(true); } bool mongoc_client_encryption_decrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *ciphertext, bson_value_t *value, bson_error_t *error) { bool ret = false; ENTRY; BSON_ASSERT(client_encryption); if (!value) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "required 'value' unset"); GOTO(fail); } /* reset, so it is safe for caller to call bson_value_destroy on error or * success. */ value->value_type = BSON_TYPE_EOD; if (ciphertext->value_type != BSON_TYPE_BINARY || ciphertext->value.v_binary.subtype != BSON_SUBTYPE_ENCRYPTED) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "ciphertext must be BSON binary subtype 6"); GOTO(fail); } if (!_mongoc_crypt_explicit_decrypt( client_encryption->crypt, client_encryption->keyvault_coll, ciphertext, value, error)) { GOTO(fail); } ret = true; fail: RETURN(ret); } bool _mongoc_cse_is_enabled(mongoc_client_t *client) { BSON_ASSERT_PARAM(client); while (1) { mongoc_topology_cse_state_t state = mcommon_atomic_int_fetch((int *)&client->topology->cse_state, mcommon_memory_order_relaxed); if (state != MONGOC_CSE_STARTING) { return state == MONGOC_CSE_ENABLED; } /* CSE is starting up. Wait until that succeeds or fails. */ mcommon_thrd_yield(); } } /// Context for creating a new datakey using an existing ClientEncryption state struct cec_context { mongoc_client_encryption_t *enc; const mongoc_client_encryption_datakey_opts_t *dk_opts; const char *kms_provider; }; /// Automatically create a new datakey. @see auto_datakey_factory static bool _auto_datakey(struct auto_datakey_context *ctx) { struct cec_context *cec = ctx->userdata; return mongoc_client_encryption_create_datakey( cec->enc, cec->kms_provider, cec->dk_opts, ctx->out_keyid, ctx->out_error); } mongoc_collection_t * mongoc_client_encryption_create_encrypted_collection(mongoc_client_encryption_t *enc, struct _mongoc_database_t *database, const char *name, const bson_t *in_options, bson_t *opt_out_options, const char *const kms_provider, const bson_t *opt_masterkey, bson_error_t *error) { BSON_ASSERT_PARAM(enc); BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(name); BSON_ASSERT_PARAM(in_options); BSON_OPTIONAL_PARAM(opt_out_options); BSON_ASSERT_PARAM(kms_provider); BSON_OPTIONAL_PARAM(error); mongoc_collection_t *ret = NULL; bson_t in_encryptedFields = BSON_INITIALIZER; bson_t new_encryptedFields = BSON_INITIALIZER; bson_t local_new_options = BSON_INITIALIZER; mongoc_client_encryption_datakey_opts_t *dk_opts = mongoc_client_encryption_datakey_opts_new(); if (opt_masterkey) { mongoc_client_encryption_datakey_opts_set_masterkey(dk_opts, opt_masterkey); } if (!opt_out_options) { // We'll use our own storage for the new options opt_out_options = &local_new_options; } // Init the storage. Either inits the caller's copy, or our local version. bson_init(opt_out_options); // Look up the encryptedfields that we should use for this collection. They // may be in the given options, or they may be in the encryptedFieldsMap. if (!_mongoc_get_collection_encryptedFields(database->client, mongoc_database_get_name(database), name, in_options, false /* checkEncryptedFieldsMap */, &in_encryptedFields, error)) { // Error finding the encryptedFields goto done; } if (bson_empty(&in_encryptedFields)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "No 'encryptedFields' are defined for the creation of " "the '%s' collection", name); goto done; } // Add the keyIds to the encryptedFields. // Context for the creation of new datakeys: struct cec_context ctx = { .enc = enc, .dk_opts = dk_opts, .kms_provider = kms_provider, }; bson_t fields_ref; bsonVisitEach(in_encryptedFields, case ( // We only care about the "fields" array when(not(key("fields")), appendTo(new_encryptedFields)), // Automaticall fill in the "keyId" no each field: else(storeDocRef(fields_ref), do({ bson_t new_fields = BSON_INITIALIZER; // Create the new fields, filling out the 'keyId' // automatically: if (!_mongoc_encryptedFields_fill_auto_datakeys( &new_fields, &fields_ref, _auto_datakey, &ctx, error)) { bsonParseError = "Error creating datakeys"; } else { BSON_APPEND_ARRAY(&new_encryptedFields, "fields", &new_fields); bson_destroy(&new_fields); } })))); if (bsonParseError) { // Error creating the new datakeys. // `error` was set by _mongoc_encryptedFields_fill_auto_datakeys goto done; } // We've successfully filled out all null keyIds. Now create the collection // with our new options: bsonBuild(*opt_out_options, insert(*in_options, not(key("encryptedFields"))), kv("encryptedFields", bson(new_encryptedFields))); if (bsonBuildError) { // Error while building the new options. _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error while building new createCollection options: %s", bsonBuildError); goto done; } ret = mongoc_database_create_collection(database, name, opt_out_options, error); done: bson_destroy(&new_encryptedFields); bson_destroy(&in_encryptedFields); mongoc_client_encryption_datakey_opts_destroy(dk_opts); // Destroy the local options, which may or may not have been used. If unused, // the new options are now owned by the caller and this is a no-op. bson_destroy(&local_new_options); // The resulting collection, or NULL on error: return ret; } #endif /* MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION */ /// Generate one encryptedField element. static void _init_1_encryptedField( bson_t *out_field, const bson_t *in_field, auto_datakey_factory fac, void *fac_userdata, bson_error_t *error) { BSON_ASSERT_PARAM(out_field); BSON_ASSERT_PARAM(in_field); BSON_ASSERT_PARAM(fac); BSON_OPTIONAL_PARAM(fac_userdata); BSON_OPTIONAL_PARAM(error); bsonVisitEach(*in_field, // If it is not a "keyId":null element, just copy it to the output. if (not(keyWithType("keyId", null)), then(appendTo(*out_field), continue)), // Otherwise: do({ // Set up factory context bson_value_t new_key = {0}; struct auto_datakey_context ctx = { .out_keyid = &new_key, .out_error = error, .userdata = fac_userdata, }; // Call the callback to create the new key if (!fac(&ctx)) { bsonParseError = "Factory function indicated failure"; } else { // Append to the field BSON_APPEND_VALUE(out_field, "keyId", &new_key); } bson_value_destroy(&new_key); })); } /// Generate the "encryptedFields" output for auto-datakeys static void _init_encryptedFields( bson_t *out_fields, const bson_t *in_fields, auto_datakey_factory fac, void *fac_userdata, bson_error_t *error) { BSON_ASSERT_PARAM(out_fields); BSON_ASSERT_PARAM(in_fields); BSON_ASSERT_PARAM(fac); BSON_OPTIONAL_PARAM(fac_userdata); BSON_OPTIONAL_PARAM(error); // Ref to one encyrptedField bson_t cur_field; bsonVisitEach( *in_fields, // Each field must be a document element if (not(type(doc)), then(error("Each 'encryptedFields' element must be a document"))), // Append a new element with the same name as the field: storeDocRef(cur_field), append(*out_fields, kv(bson_iter_key(&bsonVisitIter), // Construct the encryptedField document from the input: doc(do(_init_1_encryptedField(bsonBuildContext.doc, &cur_field, fac, fac_userdata, error)))))); if (error && error->code == 0) { // The factory/internal code did not set error, so we may have to set it // for an error while BSON parsing/generating. if (bsonParseError) { _mongoc_set_error( error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error while generating datakeys: %s", bsonParseError); } if (bsonBuildError) { _mongoc_set_error( error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error while generating datakeys: %s", bsonBuildError); } } } bool _mongoc_encryptedFields_fill_auto_datakeys( bson_t *out_fields, const bson_t *in_fields, auto_datakey_factory factory, void *userdata, bson_error_t *error) { BSON_ASSERT_PARAM(in_fields); BSON_ASSERT_PARAM(out_fields); BSON_ASSERT_PARAM(factory); if (error) { *error = (bson_error_t){0}; } bson_init(out_fields); _init_encryptedFields(out_fields, in_fields, factory, userdata, error); // DSL errors will be set in case of failure return bsonParseError == NULL && bsonBuildError == NULL; } const char * mongoc_client_encryption_get_crypt_shared_version(const mongoc_client_encryption_t *enc) { #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION return _mongoc_crypt_get_crypt_shared_version(enc->crypt); #else BSON_UNUSED(enc); return NULL; #endif } const char * mongoc_client_get_crypt_shared_version(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION if (!client->topology->crypt) { return NULL; } return _mongoc_crypt_get_crypt_shared_version(client->topology->crypt); #else BSON_UNUSED(client); return NULL; #endif } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client-side-encryption.h000066400000000000000000000466241511661753600272250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_SIDE_ENCRYPTION_H #define MONGOC_CLIENT_SIDE_ENCRYPTION_H #include #include /* Forward declare */ struct _mongoc_client_t; struct _mongoc_client_pool_t; struct _mongoc_cursor_t; struct _mongoc_collection_t; struct _mongoc_database_t; #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM "AEAD_AES_256_CBC_HMAC_SHA_512-Random" #define MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" #define MONGOC_ENCRYPT_ALGORITHM_INDEXED "Indexed" #define MONGOC_ENCRYPT_ALGORITHM_UNINDEXED "Unindexed" #define MONGOC_ENCRYPT_ALGORITHM_RANGE "Range" #define MONGOC_ENCRYPT_ALGORITHM_RANGEPREVIEW "RangePreview" #define MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW "TextPreview" #define MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY "equality" #define MONGOC_ENCRYPT_QUERY_TYPE_RANGE "range" #define MONGOC_ENCRYPT_QUERY_TYPE_RANGEPREVIEW "rangePreview" #define MONGOC_ENCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW "substringPreview" #define MONGOC_ENCRYPT_QUERY_TYPE_PREFIXPREVIEW "prefixPreview" #define MONGOC_ENCRYPT_QUERY_TYPE_SUFFIXPREVIEW "suffixPreview" BSON_BEGIN_DECLS typedef struct _mongoc_auto_encryption_opts_t mongoc_auto_encryption_opts_t; typedef bool(BSON_CALL *mongoc_kms_credentials_provider_callback_fn)(void *userdata, const bson_t *params, bson_t *out, bson_error_t *error); MONGOC_EXPORT(mongoc_auto_encryption_opts_t *) mongoc_auto_encryption_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_auto_encryption_opts_destroy(mongoc_auto_encryption_opts_t *opts); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_keyvault_client(mongoc_auto_encryption_opts_t *opts, struct _mongoc_client_t *client); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_keyvault_client_pool(mongoc_auto_encryption_opts_t *opts, struct _mongoc_client_pool_t *pool); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_keyvault_namespace(mongoc_auto_encryption_opts_t *opts, const char *db, const char *coll); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_kms_providers(mongoc_auto_encryption_opts_t *opts, const bson_t *kms_providers); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_key_expiration(mongoc_auto_encryption_opts_t *opts, uint64_t expiration); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_tls_opts(mongoc_auto_encryption_opts_t *opts, const bson_t *tls_opts); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_schema_map(mongoc_auto_encryption_opts_t *opts, const bson_t *schema_map); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_encrypted_fields_map(mongoc_auto_encryption_opts_t *opts, const bson_t *encrypted_fields_map); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_bypass_auto_encryption(mongoc_auto_encryption_opts_t *opts, bool bypass_auto_encryption); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_bypass_query_analysis(mongoc_auto_encryption_opts_t *opts, bool bypass_query_analysis); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_extra(mongoc_auto_encryption_opts_t *opts, const bson_t *extra); MONGOC_EXPORT(void) mongoc_auto_encryption_opts_set_kms_credential_provider_callback(mongoc_auto_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); typedef struct _mongoc_client_encryption_opts_t mongoc_client_encryption_opts_t; typedef struct _mongoc_client_encryption_t mongoc_client_encryption_t; typedef struct _mongoc_client_encryption_encrypt_range_opts_t mongoc_client_encryption_encrypt_range_opts_t; typedef struct _encrypt_text_prefix_opts_t mongoc_client_encryption_encrypt_text_prefix_opts_t; typedef struct _encrypt_text_suffix_opts_t mongoc_client_encryption_encrypt_text_suffix_opts_t; typedef struct _encrypt_text_substring_opts_t mongoc_client_encryption_encrypt_text_substring_opts_t; typedef struct _mongoc_client_encryption_encrypt_text_opts_t mongoc_client_encryption_encrypt_text_opts_t; typedef struct _mongoc_client_encryption_encrypt_opts_t mongoc_client_encryption_encrypt_opts_t; typedef struct _mongoc_client_encryption_datakey_opts_t mongoc_client_encryption_datakey_opts_t; typedef struct _mongoc_client_encryption_rewrap_many_datakey_result_t mongoc_client_encryption_rewrap_many_datakey_result_t; MONGOC_EXPORT(mongoc_client_encryption_opts_t *) mongoc_client_encryption_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_encryption_opts_destroy(mongoc_client_encryption_opts_t *opts); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_keyvault_client(mongoc_client_encryption_opts_t *opts, struct _mongoc_client_t *keyvault_client); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_keyvault_namespace(mongoc_client_encryption_opts_t *opts, const char *db, const char *coll); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_kms_providers(mongoc_client_encryption_opts_t *opts, const bson_t *kms_providers); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_tls_opts(mongoc_client_encryption_opts_t *opts, const bson_t *tls_opts); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_kms_credential_provider_callback(mongoc_client_encryption_opts_t *opts, mongoc_kms_credentials_provider_callback_fn fn, void *userdata); MONGOC_EXPORT(void) mongoc_client_encryption_opts_set_key_expiration(mongoc_client_encryption_opts_t *opts, uint64_t cache_expiration_ms); MONGOC_EXPORT(mongoc_client_encryption_rewrap_many_datakey_result_t *) mongoc_client_encryption_rewrap_many_datakey_result_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_encryption_rewrap_many_datakey_result_destroy( mongoc_client_encryption_rewrap_many_datakey_result_t *result); MONGOC_EXPORT(const bson_t *) mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result( mongoc_client_encryption_rewrap_many_datakey_result_t *result) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_client_encryption_t *) mongoc_client_encryption_new(mongoc_client_encryption_opts_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_encryption_destroy(mongoc_client_encryption_t *client_encryption); MONGOC_EXPORT(bool) mongoc_client_encryption_create_datakey(mongoc_client_encryption_t *client_encryption, const char *kms_provider, const mongoc_client_encryption_datakey_opts_t *opts, bson_value_t *keyid, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_rewrap_many_datakey(mongoc_client_encryption_t *client_encryption, const bson_t *filter, const char *provider, const bson_t *master_key, mongoc_client_encryption_rewrap_many_datakey_result_t *result, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_delete_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_get_key(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, bson_t *key_doc, bson_error_t *error); MONGOC_EXPORT(mongoc_client_encryption_encrypt_text_prefix_opts_t *) mongoc_client_encryption_encrypt_text_prefix_opts_new(void); MONGOC_EXPORT(mongoc_client_encryption_encrypt_text_suffix_opts_t *) mongoc_client_encryption_encrypt_text_suffix_opts_new(void); MONGOC_EXPORT(mongoc_client_encryption_encrypt_text_substring_opts_t *) mongoc_client_encryption_encrypt_text_substring_opts_new(void); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_prefix_opts_destroy(mongoc_client_encryption_encrypt_text_prefix_opts_t *); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_suffix_opts_destroy(mongoc_client_encryption_encrypt_text_suffix_opts_t *); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_substring_opts_destroy(mongoc_client_encryption_encrypt_text_substring_opts_t *); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t str_max_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_prefix_opts_t *opts, int32_t str_min_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t str_max_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_suffix_opts_t *opts, int32_t str_min_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_max_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_max_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length( mongoc_client_encryption_encrypt_text_substring_opts_t *opts, int32_t str_min_query_length); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_set_prefix(mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_prefix_opts_t *popts); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_set_suffix(mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_suffix_opts_t *sopts); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_set_substring( mongoc_client_encryption_encrypt_text_opts_t *opts, const mongoc_client_encryption_encrypt_text_substring_opts_t *ssopts); MONGOC_EXPORT(mongoc_client_encryption_encrypt_text_opts_t *) mongoc_client_encryption_encrypt_text_opts_new(void); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_destroy(mongoc_client_encryption_encrypt_text_opts_t *topts); MONGOC_EXPORT(struct _mongoc_cursor_t *) mongoc_client_encryption_get_keys(mongoc_client_encryption_t *client_encryption, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_add_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_remove_key_alt_name(mongoc_client_encryption_t *client_encryption, const bson_value_t *keyid, const char *keyaltname, bson_t *key_doc, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_get_key_by_alt_name(mongoc_client_encryption_t *client_encryption, const char *keyaltname, bson_t *key_doc, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_encrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *value, mongoc_client_encryption_encrypt_opts_t *opts, bson_value_t *ciphertext, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_encrypt_expression(mongoc_client_encryption_t *client_encryption, const bson_t *expr, mongoc_client_encryption_encrypt_opts_t *opts, bson_t *expr_out, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_encryption_decrypt(mongoc_client_encryption_t *client_encryption, const bson_value_t *ciphertext, bson_value_t *value, bson_error_t *error); MONGOC_EXPORT(mongoc_client_encryption_encrypt_opts_t *) mongoc_client_encryption_encrypt_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_destroy(mongoc_client_encryption_encrypt_opts_t *opts); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_keyid(mongoc_client_encryption_encrypt_opts_t *opts, const bson_value_t *keyid); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_keyaltname(mongoc_client_encryption_encrypt_opts_t *opts, const char *keyaltname); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_algorithm(mongoc_client_encryption_encrypt_opts_t *opts, const char *algorithm); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_contention_factor(mongoc_client_encryption_encrypt_opts_t *opts, int64_t contention_factor); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_text_opts(mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_text_opts_t *text_opts); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(mongoc_client_encryption_encrypt_text_opts_t *opts, bool case_sensitive); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(mongoc_client_encryption_encrypt_text_opts_t *opts, bool diacritic_sensitive); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_query_type(mongoc_client_encryption_encrypt_opts_t *opts, const char *query_type); MONGOC_EXPORT(mongoc_client_encryption_encrypt_range_opts_t *) mongoc_client_encryption_encrypt_range_opts_new(void); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_destroy(mongoc_client_encryption_encrypt_range_opts_t *range_opts); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_set_trim_factor(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t trim_factor); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_set_sparsity(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int64_t sparsity); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_set_min(mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *min); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_set_max(mongoc_client_encryption_encrypt_range_opts_t *range_opts, const bson_value_t *max); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_range_opts_set_precision(mongoc_client_encryption_encrypt_range_opts_t *range_opts, int32_t precision); MONGOC_EXPORT(void) mongoc_client_encryption_encrypt_opts_set_range_opts(mongoc_client_encryption_encrypt_opts_t *opts, const mongoc_client_encryption_encrypt_range_opts_t *range_opts); MONGOC_EXPORT(mongoc_client_encryption_datakey_opts_t *) mongoc_client_encryption_datakey_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_encryption_datakey_opts_destroy(mongoc_client_encryption_datakey_opts_t *opts); MONGOC_EXPORT(void) mongoc_client_encryption_datakey_opts_set_masterkey(mongoc_client_encryption_datakey_opts_t *opts, const bson_t *masterkey); MONGOC_EXPORT(void) mongoc_client_encryption_datakey_opts_set_keyaltnames(mongoc_client_encryption_datakey_opts_t *opts, char **keyaltnames, uint32_t keyaltnames_count); MONGOC_EXPORT(void) mongoc_client_encryption_datakey_opts_set_keymaterial(mongoc_client_encryption_datakey_opts_t *opts, const uint8_t *data, uint32_t len); MONGOC_EXPORT(const char *) mongoc_client_encryption_get_crypt_shared_version(mongoc_client_encryption_t const *enc) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(struct _mongoc_collection_t *) mongoc_client_encryption_create_encrypted_collection(mongoc_client_encryption_t *enc, struct _mongoc_database_t *database, const char *name, const bson_t *in_options, bson_t *opt_out_options, const char *const kms_provider, const bson_t *opt_masterkey, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_CLIENT_SIDE_ENCRYPTION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client.c000066400000000000000000002456751511661753600241150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifdef MONGOC_HAVE_DNSAPI /* for DnsQuery_UTF8 */ #include #include #include #else #if defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH) #include #include #include #include #include #endif #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #include #include #include #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L #include #include #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include #include #endif #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "client" static void _mongoc_client_killcursors_command(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream, int64_t cursor_id, const char *db, const char *collection, mongoc_client_session_t *cs); #define DNS_ERROR(_msg, ...) \ do { \ _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, _msg, __VA_ARGS__); \ GOTO(done); \ } while (0) #if MONGOC_ENABLE_SRV == 0 // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ENABLE_SRV disabled /* SRV support is disabled */ #elif defined(MONGOC_HAVE_DNSAPI) // ↑↑↑ ENABLE_SRV disabled / Win32 Dnsapi ↓↓↓↓ typedef bool (*mongoc_rr_callback_t)(const char *hostname, PDNS_RECORD pdns, mongoc_rr_data_t *rr_data, bson_error_t *error); static bool srv_callback(const char *hostname, PDNS_RECORD pdns, mongoc_rr_data_t *rr_data, bson_error_t *error) { BSON_UNUSED(hostname); mongoc_host_list_t new_host; if (rr_data && rr_data->hosts) { _mongoc_host_list_remove_host(&(rr_data->hosts), pdns->Data.SRV.pNameTarget, pdns->Data.SRV.wPort); } if (!_mongoc_host_list_from_hostport_with_err( &new_host, mstr_cstring(pdns->Data.SRV.pNameTarget), pdns->Data.SRV.wPort, error)) { return false; } _mongoc_host_list_upsert(&rr_data->hosts, &new_host); return true; } /* rr_data is unused, but here to match srv_callback signature */ static bool txt_callback(const char *hostname, PDNS_RECORD pdns, mongoc_rr_data_t *rr_data, bson_error_t *error) { BSON_UNUSED(hostname); BSON_UNUSED(error); DWORD i; mcommon_string_append_t txt; mcommon_string_new_with_capacity_as_append(&txt, pdns->wDataLength); for (i = 0; i < pdns->Data.TXT.dwStringCount; i++) { mcommon_string_append(&txt, pdns->Data.TXT.pStringArray[i]); } rr_data->txt_record_opts = mcommon_string_from_append_destroy_with_steal(&txt); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_get_rr_dnsapi -- * * Fetch SRV or TXT resource records using the Windows DNS API and * put results in @rr_data. * * Returns: * Success or failure. * * For an SRV lookup, returns false if there is any error. * * For TXT lookup, ignores any error fetching the resource record and * always returns true. * * Side effects: * @error is set if there is a failure. * @rr_data->hosts may be set if querying SRV. Caller must destroy. * @rr_data->txt_record_opts may be set if querying TXT. Caller must * free. * *-------------------------------------------------------------------------- */ static bool _mongoc_get_rr_dnsapi( const char *hostname, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, bool prefer_tcp, bson_error_t *error) { const char *rr_type_name; WORD nst; mongoc_rr_callback_t callback; PDNS_RECORD pdns = NULL; DNS_STATUS res; LPVOID lpMsgBuf = NULL; bool dns_success; bool callback_success = true; int i; ENTRY; if (rr_type == MONGOC_RR_SRV) { /* return true only if DNS succeeds */ dns_success = false; rr_type_name = "SRV"; nst = DNS_TYPE_SRV; callback = srv_callback; } else { /* return true whether or not DNS succeeds */ dns_success = true; rr_type_name = "TXT"; nst = DNS_TYPE_TEXT; callback = txt_callback; } DWORD options = DNS_QUERY_BYPASS_CACHE; if (prefer_tcp) { options |= DNS_QUERY_USE_TCP_ONLY; } res = DnsQuery_UTF8(hostname, nst, options, NULL /* IP Address */, &pdns, 0 /* reserved */); if (res) { // Cast signed DNS_STATUS to unsigned DWORD. FormatMessage expects DWORD. char *msg = mongoc_winerr_to_string((DWORD)res); DNS_ERROR("Failed to look up %s record \"%s\": %s", rr_type_name, hostname, msg); bson_free(msg); } if (!pdns) { DNS_ERROR("No %s records for \"%s\"", rr_type_name, hostname); } i = 0; do { /* DnsQuery can return additional records not of the requested type */ if ((rr_type == MONGOC_RR_TXT && pdns->wType == DNS_TYPE_TEXT) || (rr_type == MONGOC_RR_SRV && pdns->wType == DNS_TYPE_SRV)) { if (i > 0 && rr_type == MONGOC_RR_TXT) { /* Initial DNS Seedlist Discovery Spec: a client "MUST raise an error when multiple TXT records are encountered". */ callback_success = false; DNS_ERROR("Multiple TXT records for \"%s\"", hostname); } if (rr_data) { if ((i == 0) || (pdns->dwTtl < rr_data->min_ttl)) { rr_data->min_ttl = pdns->dwTtl; } } if (!callback(hostname, pdns, rr_data, error)) { callback_success = false; GOTO(done); } i++; } pdns = pdns->pNext; } while (pdns); rr_data->count = i; if (i == 0) { DNS_ERROR("No matching %s records for \"%s\"", rr_type_name, hostname); } dns_success = true; done: if (pdns) { DnsRecordListFree(pdns, DnsFreeRecordList); } if (lpMsgBuf) { LocalFree(lpMsgBuf); } RETURN(dns_success && callback_success); } #elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH)) // ↑↑↑↑↑↑↑ Win32 Dnsapi / resolv ↓↓↓↓↓↓↓↓ typedef bool (*mongoc_rr_callback_t)( const char *hostname, ns_msg *ns_answer, ns_rr *rr, mongoc_rr_data_t *rr_data, bson_error_t *error); static const char * _mongoc_hstrerror(int code) { switch (code) { case HOST_NOT_FOUND: return "The specified host is unknown."; case NO_ADDRESS: return "The requested name is valid but does not have an IP address."; case NO_RECOVERY: return "A nonrecoverable name server error occurred."; case TRY_AGAIN: return "A temporary error occurred on an authoritative name server. Try " "again later."; default: return "An unknown error occurred."; } } static bool srv_callback(const char *hostname, ns_msg *ns_answer, ns_rr *rr, mongoc_rr_data_t *rr_data, bson_error_t *error) { const uint8_t *data; char name[1024]; uint16_t port; int size; bool ret = false; mongoc_host_list_t new_host; data = ns_rr_rdata(*rr); /* memcpy the network endian port before converting to host endian. we cannot * cast (data + 4) directly as a uint16_t*, because it may not align on an * 2-byte boundary. */ memcpy(&port, data + 4, sizeof(port)); port = ntohs(port); size = dn_expand(ns_msg_base(*ns_answer), ns_msg_end(*ns_answer), data + 6, name, sizeof(name)); if (size < 1) { DNS_ERROR("Invalid record in SRV answer for \"%s\": \"%s\"", hostname, _mongoc_hstrerror(h_errno)); } if (!_mongoc_host_list_from_hostport_with_err(&new_host, mstr_cstring(name), port, error)) { GOTO(done); } _mongoc_host_list_upsert(&rr_data->hosts, &new_host); ret = true; done: return ret; } static bool txt_callback(const char *hostname, ns_msg *ns_answer, ns_rr *rr, mongoc_rr_data_t *rr_data, bson_error_t *error) { bool ret = false; BSON_UNUSED(ns_answer); uint16_t total = (uint16_t)ns_rr_rdlen(*rr); if (total < 1 || total > 255) { DNS_ERROR("Invalid TXT record size %hu for \"%s\"", total, hostname); } /* a TXT record has one or more strings, each up to 255 chars, each is prefixed by its length as 1 byte. * In this usage, they are all concatenated without any spacers. */ mcommon_string_append_t txt; mcommon_string_new_with_capacity_as_append(&txt, total); uint16_t pos = 0; const uint8_t *data = ns_rr_rdata(*rr); while (pos < total) { uint8_t len = data[pos++]; if (total - pos < (uint16_t)len) { mcommon_string_destroy(mcommon_string_from_append(&txt)); DNS_ERROR("Invalid TXT string size %hu at %hu in %hu-byte TXT record for \"%s\"", (uint16_t)len, pos, total, hostname); } mcommon_string_append_bytes(&txt, (const char *)(data + pos), (uint32_t)len); pos += len; } rr_data->txt_record_opts = mcommon_string_from_append_destroy_with_steal(&txt); ret = true; done: return ret; } /* *-------------------------------------------------------------------------- * * _mongoc_get_rr_search -- * * Fetch SRV or TXT resource records using libresolv and put results in * @rr_data. * * Returns: * Success or failure. * * For an SRV lookup, returns false if there is any error. * * For TXT lookup, ignores any error fetching the resource record and * always returns true. * * Side effects: * @error is set if there is a failure. * @rr_data->hosts may be set if querying SRV. Caller must destroy. * @rr_data->txt_record_opts may be set if querying TXT. Caller must * free. * *-------------------------------------------------------------------------- */ static bool _mongoc_get_rr_search(const char *hostname, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { #ifdef MONGOC_HAVE_RES_NSEARCH struct __res_state state = {0}; #endif int size = 0; unsigned char *search_buf = NULL; size_t buffer_size = initial_buffer_size; ns_msg ns_answer; int n; int i; const char *rr_type_name; ns_type nst; mongoc_rr_callback_t callback; ns_rr resource_record; bool dns_success; bool callback_success = true; int num_matching_records; uint32_t ttl; ENTRY; if (rr_type == MONGOC_RR_SRV) { /* return true only if DNS succeeds */ dns_success = false; rr_type_name = "SRV"; nst = ns_t_srv; callback = srv_callback; } else { /* return true whether or not DNS succeeds */ dns_success = true; rr_type_name = "TXT"; nst = ns_t_txt; callback = txt_callback; } do { if (search_buf) { bson_free(search_buf); /* increase buffer size by the previous response size. This ensures * that even if a subsequent response is larger, we'll still be able * to fit it in the response buffer */ buffer_size = buffer_size + size; } search_buf = (unsigned char *)bson_malloc(buffer_size); BSON_ASSERT(search_buf); #ifdef MONGOC_HAVE_RES_NSEARCH /* thread-safe */ res_ninit(&state); if (prefer_tcp) { state.options |= RES_USEVC; } size = res_nsearch(&state, hostname, ns_c_in, nst, search_buf, buffer_size); #elif defined(MONGOC_HAVE_RES_SEARCH) size = res_search(hostname, ns_c_in, nst, search_buf, buffer_size); #endif if (size < 0) { DNS_ERROR("Failed to look up %s record \"%s\": %s", rr_type_name, hostname, _mongoc_hstrerror(h_errno)); } } while (mlib_cmp(size, >=, buffer_size)); if (ns_initparse(search_buf, size, &ns_answer)) { DNS_ERROR("Invalid %s answer for \"%s\"", rr_type_name, hostname); } n = ns_msg_count(ns_answer, ns_s_an); if (!n) { DNS_ERROR("No %s records for \"%s\"", rr_type_name, hostname); } rr_data->count = n; num_matching_records = 0; for (i = 0; i < n; i++) { if (ns_parserr(&ns_answer, ns_s_an, i, &resource_record)) { DNS_ERROR( "Invalid record %d of %s answer for \"%s\": \"%s\"", i, rr_type_name, hostname, _mongoc_hstrerror(h_errno)); } /* Skip records that don't match the ones we requested. CDRIVER-3628 shows * that we can receive records that were not requested. */ if (rr_type == MONGOC_RR_TXT) { if (ns_rr_type(resource_record) != ns_t_txt) { continue; } } else if (rr_type == MONGOC_RR_SRV) { if (ns_rr_type(resource_record) != ns_t_srv) { continue; } } if (num_matching_records > 0 && rr_type == MONGOC_RR_TXT) { /* Initial DNS Seedlist Discovery Spec: a client "MUST raise an error * when multiple TXT records are encountered". */ callback_success = false; DNS_ERROR("Multiple TXT records for \"%s\"", hostname); } num_matching_records++; ttl = ns_rr_ttl(resource_record); if ((i == 0) || (ttl < rr_data->min_ttl)) { rr_data->min_ttl = ttl; } if (!callback(hostname, &ns_answer, &resource_record, rr_data, error)) { callback_success = false; GOTO(done); } } if (num_matching_records == 0) { DNS_ERROR("No matching %s records for \"%s\"", rr_type_name, hostname); } dns_success = true; done: bson_free(search_buf); #ifdef MONGOC_HAVE_RES_NDESTROY /* defined on BSD/Darwin, and only if MONGOC_HAVE_RES_NSEARCH is defined */ res_ndestroy(&state); #elif defined(MONGOC_HAVE_RES_NCLOSE) /* defined on Linux, and only if MONGOC_HAVE_RES_NSEARCH is defined */ res_nclose(&state); #endif RETURN(dns_success && callback_success); } #endif // ↑↑↑↑↑↑↑↑↑↑↑↑↑ resolv /* *-------------------------------------------------------------------------- * * _mongoc_client_get_rr -- * * Fetch an SRV or TXT resource record and update put results in * @rr_data. * * See RFCs 1464 and 2782, MongoDB's "Initial DNS Seedlist Discovery" * spec, and MongoDB's "Polling SRV Records for Mongos Discovery" * spec. * * Returns: * Success or failure. * * Side effects: * @error is set if there is a failure. Errors fetching TXT are * ignored. * @rr_data->hosts may be set if querying SRV. Caller must destroy. * @rr_data->txt_record_opts may be set if querying TXT. Caller must * free. * *-------------------------------------------------------------------------- */ bool _mongoc_client_get_rr(const char *hostname, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_ASSERT(rr_data); #if MONGOC_ENABLE_SRV == 0 BSON_UNUSED(hostname); BSON_UNUSED(rr_type); BSON_UNUSED(rr_data); BSON_UNUSED(initial_buffer_size); BSON_UNUSED(prefer_tcp); // Disabled _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "libresolv unavailable, cannot use mongodb+srv URI"); return false; #elif defined(MONGOC_HAVE_DNSAPI) BSON_UNUSED(hostname); BSON_UNUSED(initial_buffer_size); return _mongoc_get_rr_dnsapi(hostname, rr_type, rr_data, prefer_tcp, error); #elif (defined(MONGOC_HAVE_RES_NSEARCH) || defined(MONGOC_HAVE_RES_SEARCH)) return _mongoc_get_rr_search(hostname, rr_type, rr_data, initial_buffer_size, prefer_tcp, error); #else #error No SRV library is available, but ENABLE_SRV is true! #endif } #undef DNS_ERROR /* *-------------------------------------------------------------------------- * * mongoc_client_connect_tcp -- * * Connect to a host using a TCP socket. * * This will be performed synchronously and return a mongoc_stream_t * that can be used to connect with the remote host. * * Returns: * A newly allocated mongoc_stream_t if successful; otherwise * NULL and @error is set. * * Side effects: * @error is set if return value is NULL. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_client_connect_tcp(int32_t connecttimeoutms, const mongoc_host_list_t *host, bson_error_t *error) { mongoc_socket_t *sock = NULL; struct addrinfo hints; struct addrinfo *result, *rp; int64_t expire_at; char portstr[8]; int s; ENTRY; BSON_ASSERT(connecttimeoutms); BSON_ASSERT(host); // Expect no truncation. int req = bson_snprintf(portstr, sizeof portstr, "%hu", host->port); BSON_ASSERT(mlib_cmp(req, <, sizeof portstr)); memset(&hints, 0, sizeof hints); hints.ai_family = host->family; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; TRACE("DNS lookup for %s", host->host); s = getaddrinfo(host->host, portstr, &hints, &result); if (s != 0) { mongoc_counter_dns_failure_inc(); TRACE("Failed to resolve %s", host->host); _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve %s", host->host); RETURN(NULL); } mongoc_counter_dns_success_inc(); for (rp = result; rp; rp = rp->ai_next) { /* * Create a new non-blocking socket. */ if (!(sock = mongoc_socket_new(rp->ai_family, rp->ai_socktype, rp->ai_protocol))) { continue; } /* * Try to connect to the peer. */ expire_at = bson_get_monotonic_time() + (connecttimeoutms * 1000L); if (0 != mongoc_socket_connect(sock, rp->ai_addr, (mongoc_socklen_t)rp->ai_addrlen, expire_at)) { mongoc_socket_destroy(sock); sock = NULL; continue; } break; } if (!sock) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "Failed to connect to target host: %s", host->host_and_port); freeaddrinfo(result); RETURN(NULL); } freeaddrinfo(result); return mongoc_stream_socket_new(sock); } /* *-------------------------------------------------------------------------- * * mongoc_client_connect_unix -- * * Connect to a MongoDB server using a UNIX domain socket. * * Returns: * A newly allocated mongoc_stream_t if successful; otherwise * NULL and @error is set. * * Side effects: * @error is set if return value is NULL. * *-------------------------------------------------------------------------- */ static mongoc_stream_t * mongoc_client_connect_unix(const mongoc_host_list_t *host, bson_error_t *error) { #ifdef _WIN32 ENTRY; BSON_UNUSED(host); _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "UNIX domain sockets not supported on win32."); RETURN(NULL); #else struct sockaddr_un saddr; mongoc_socket_t *sock; mongoc_stream_t *ret = NULL; ENTRY; BSON_ASSERT(host); memset(&saddr, 0, sizeof saddr); saddr.sun_family = AF_UNIX; // Expect no truncation. int req = bson_snprintf(saddr.sun_path, sizeof saddr.sun_path - 1, "%s", host->host); if (mlib_cmp(req, >=, sizeof saddr.sun_path - 1)) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to define socket address path."); RETURN(NULL); } sock = mongoc_socket_new(AF_UNIX, SOCK_STREAM, 0); if (sock == NULL) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to create socket."); RETURN(NULL); } if (-1 == mongoc_socket_connect(sock, (struct sockaddr *)&saddr, sizeof saddr, -1)) { mongoc_socket_destroy(sock); _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "Failed to connect to UNIX domain socket."); RETURN(NULL); } ret = mongoc_stream_socket_new(sock); RETURN(ret); #endif } mongoc_stream_t * mongoc_client_connect(bool use_ssl, void *ssl_opts_void, const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *openssl_ctx_void, mongoc_shared_ptr secure_channel_cred_ptr, bson_error_t *error) { mongoc_stream_t *base_stream = NULL; int32_t connecttimeoutms; BSON_ASSERT(uri); BSON_ASSERT(host); BSON_UNUSED(openssl_ctx_void); BSON_UNUSED(secure_channel_cred_ptr); #ifndef MONGOC_ENABLE_SSL if (ssl_opts_void || mongoc_uri_get_tls(uri)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER, "TLS is not enabled in this build of mongo-c-driver."); return NULL; } #endif connecttimeoutms = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, MONGOC_DEFAULT_CONNECTTIMEOUTMS); switch (host->family) { case AF_UNSPEC: #if defined(AF_INET6) case AF_INET6: #endif case AF_INET: base_stream = mongoc_client_connect_tcp(connecttimeoutms, host, error); break; case AF_UNIX: base_stream = mongoc_client_connect_unix(host, error); break; default: _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_INVALID_TYPE, "Invalid address family: 0x%02x", (unsigned int)host->family); break; } #ifdef MONGOC_ENABLE_SSL if (base_stream) { mongoc_ssl_opt_t *ssl_opts; const char *mechanism; ssl_opts = (mongoc_ssl_opt_t *)ssl_opts_void; mechanism = mongoc_uri_get_auth_mechanism(uri); if (use_ssl || (mechanism && (0 == strcmp(mechanism, "MONGODB-X509")))) { mongoc_stream_t *original = base_stream; #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L // Use shared OpenSSL context. base_stream = mongoc_stream_tls_new_with_hostname_and_openssl_context( base_stream, host->host, ssl_opts, true, (SSL_CTX *)openssl_ctx_void); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) // Use shared Secure Channel credentials. base_stream = mongoc_stream_tls_new_with_secure_channel_cred(base_stream, host->host, ssl_opts, secure_channel_cred_ptr); #else base_stream = mongoc_stream_tls_new_with_hostname(base_stream, host->host, ssl_opts, true); #endif if (!base_stream) { mongoc_stream_destroy(original); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed initialize TLS state."); return NULL; } if (!mongoc_stream_tls_handshake_block(base_stream, host->host, connecttimeoutms, error)) { mongoc_stream_destroy(base_stream); return NULL; } } } #endif if (!base_stream) { return NULL; } return base_stream; } /* *-------------------------------------------------------------------------- * * mongoc_client_default_stream_initiator -- * * A mongoc_stream_initiator_t that will handle the various type * of supported sockets by MongoDB including TCP and UNIX. * * Also supports sharing of OpenSSL context owned by a client. * * Language binding authors may want to implement an alternate * version of this method to use their native stream format. * * Returns: * A mongoc_stream_t if successful; otherwise NULL and @error is set. * * Side effects: * @error is set if return value is NULL. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_client_default_stream_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { void *ssl_opts_void = NULL; bool use_ssl = false; #ifdef MONGOC_ENABLE_SSL mongoc_client_t *client = (mongoc_client_t *)user_data; use_ssl = client->use_ssl; ssl_opts_void = (void *)&client->ssl_opts; #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX *ssl_ctx = client->topology->scanner->openssl_ctx; return mongoc_client_connect(use_ssl, ssl_opts_void, uri, host, (void *)ssl_ctx, MONGOC_SHARED_PTR_NULL, error); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) return mongoc_client_connect( use_ssl, ssl_opts_void, uri, host, NULL, client->topology->scanner->secure_channel_cred_ptr, error); #else return mongoc_client_connect(use_ssl, ssl_opts_void, uri, host, NULL, MONGOC_SHARED_PTR_NULL, error); #endif } /* *-------------------------------------------------------------------------- * * _mongoc_client_create_stream -- * * INTERNAL API * * This function is used by the mongoc_cluster_t to initiate a * new stream. This is done because cluster is private API and * those using mongoc_client_t may need to override this process. * * This function calls the default initiator for new streams. * * Returns: * A newly allocated mongoc_stream_t if successful; otherwise * NULL and @error is set. * * Side effects: * @error is set if return value is NULL. * *-------------------------------------------------------------------------- */ mongoc_stream_t * _mongoc_client_create_stream(mongoc_client_t *client, const mongoc_host_list_t *host, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_ASSERT(host); return client->initiator(client->uri, host, client->initiator_data, error); } bool _mongoc_client_recv(mongoc_client_t *client, mcd_rpc_message *rpc, mongoc_buffer_t *buffer, mongoc_server_stream_t *server_stream, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_ASSERT(rpc); BSON_ASSERT(buffer); BSON_ASSERT(server_stream); BSON_ASSERT_PARAM(error); return mongoc_cluster_try_recv(&client->cluster, rpc, buffer, server_stream, error); } mongoc_client_t * mongoc_client_new(const char *uri_string) { mongoc_client_t *client; mongoc_uri_t *uri; bson_error_t error = {0}; if (!uri_string) { uri_string = "mongodb://127.0.0.1/"; } if (!(uri = mongoc_uri_new_with_error(uri_string, &error))) { /* Log URI errors as a warning for consistency with mongoc_uri_new */ MONGOC_WARNING("Error parsing URI: '%s'", error.message); return NULL; } if (!(client = mongoc_client_new_from_uri_with_error(uri, &error))) { MONGOC_ERROR("%s", error.message); } mongoc_uri_destroy(uri); return client; } /* *-------------------------------------------------------------------------- * * mongoc_client_set_ssl_opts * * set ssl opts for a client * * Returns: * Nothing * * Side effects: * None. * *-------------------------------------------------------------------------- */ #ifdef MONGOC_ENABLE_SSL /* Only called internally. Caller must ensure opts->internal is valid. */ void _mongoc_client_set_internal_tls_opts(mongoc_client_t *client, _mongoc_internal_tls_opts_t *internal) { BSON_ASSERT_PARAM(client); if (!client->use_ssl) { return; } client->ssl_opts.internal = bson_malloc(sizeof(_mongoc_internal_tls_opts_t)); memcpy(client->ssl_opts.internal, internal, sizeof(_mongoc_internal_tls_opts_t)); } void mongoc_client_set_ssl_opts(mongoc_client_t *client, const mongoc_ssl_opt_t *opts) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(opts); if (!client->topology->single_threaded) { MONGOC_ERROR( "mongoc_client_set_ssl_opts cannot be called on a pooled client. Use mongoc_client_pool_set_ssl_opts."); return; } _mongoc_client_set_ssl_opts_for_single_or_pooled(client, opts); } void _mongoc_client_set_ssl_opts_for_single_or_pooled(mongoc_client_t *client, const mongoc_ssl_opt_t *opts) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(opts); _mongoc_ssl_opts_cleanup(&client->ssl_opts, false /* don't free internal opts */); client->use_ssl = true; _mongoc_ssl_opts_copy_to(opts, &client->ssl_opts, false /* don't overwrite internal opts */); if (client->topology->single_threaded) { mongoc_topology_scanner_set_ssl_opts(client->topology->scanner, &client->ssl_opts); /* Update the OpenSSL context associated with this client to match new ssl opts. */ /* Active connections previously made by client can still access original OpenSSL context. */ #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX_free(client->topology->scanner->openssl_ctx); client->topology->scanner->openssl_ctx = _mongoc_openssl_ctx_new(&client->ssl_opts); #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) mongoc_shared_ptr_reset(&client->topology->scanner->secure_channel_cred_ptr, mongoc_secure_channel_cred_new(&client->ssl_opts), mongoc_secure_channel_cred_deleter); #endif } } #endif // MONGOC_ENABLE_SSL mongoc_client_t * mongoc_client_new_from_uri(const mongoc_uri_t *uri) { mongoc_client_t *client; bson_error_t error = {0}; if (!(client = mongoc_client_new_from_uri_with_error(uri, &error))) { MONGOC_ERROR("%s", error.message); } return client; } // Defined in mongoc-init.c. extern bool mongoc_get_init_called(void); mongoc_client_t * mongoc_client_new_from_uri_with_error(const mongoc_uri_t *uri, bson_error_t *error) { mongoc_client_t *client; mongoc_topology_t *topology; ENTRY; BSON_ASSERT(uri); if (!mongoc_get_init_called()) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_NOT_READY, "Attempting to create client, but libmongoc not initialized. Call mongoc_init"); return NULL; } #ifndef MONGOC_ENABLE_SSL if (mongoc_uri_get_tls(uri)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Can't create SSL client, SSL not enabled in this build."); RETURN(NULL); } #endif topology = mongoc_topology_new(uri, true); if (!topology->valid) { if (error) { memcpy(error, &topology->scanner->error, sizeof(bson_error_t)); } mongoc_topology_destroy(topology); RETURN(NULL); } client = _mongoc_client_new_from_topology(topology); BSON_ASSERT(client); RETURN(client); } /* precondition: topology is valid */ mongoc_client_t * _mongoc_client_new_from_topology(mongoc_topology_t *topology) { mongoc_client_t *client; const mongoc_read_prefs_t *read_prefs; const mongoc_read_concern_t *read_concern; const mongoc_write_concern_t *write_concern; const char *appname; BSON_ASSERT(topology); BSON_ASSERT(topology->valid); client = (mongoc_client_t *)bson_malloc0(sizeof *client); client->uri = mongoc_uri_copy(topology->uri); client->initiator = mongoc_client_default_stream_initiator; client->initiator_data = client; client->topology = topology; client->error_api_version = MONGOC_ERROR_API_VERSION_LEGACY; client->error_api_set = false; client->client_sessions = mongoc_set_new(8, NULL, NULL); client->csid_rand_seed = (unsigned int)bson_get_monotonic_time(); write_concern = mongoc_uri_get_write_concern(client->uri); client->write_concern = mongoc_write_concern_copy(write_concern); read_concern = mongoc_uri_get_read_concern(client->uri); client->read_concern = mongoc_read_concern_copy(read_concern); read_prefs = mongoc_uri_get_read_prefs_t(client->uri); client->read_prefs = mongoc_read_prefs_copy(read_prefs); appname = mongoc_uri_get_option_as_utf8(client->uri, MONGOC_URI_APPNAME, NULL); if (appname && client->topology->single_threaded) { /* the appname should have already been validated */ BSON_ASSERT(mongoc_client_set_appname(client, appname)); } mongoc_cluster_init(&client->cluster, client->uri, client); #ifdef MONGOC_ENABLE_SSL client->use_ssl = false; if (mongoc_uri_get_tls(client->uri)) { mongoc_ssl_opt_t ssl_opt = {0}; _mongoc_internal_tls_opts_t internal_tls_opts = {0}; _mongoc_ssl_opts_from_uri(&ssl_opt, &internal_tls_opts, client->uri); /* sets use_ssl = true */ /* this call creates an ssl ctx only if single-threaded, otherwise client inherits from pool */ _mongoc_client_set_ssl_opts_for_single_or_pooled(client, &ssl_opt); _mongoc_client_set_internal_tls_opts(client, &internal_tls_opts); } #endif mongoc_structured_log(topology->log_and_monitor.structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION, "Client created"); mongoc_counter_clients_active_inc(); return client; } /* *-------------------------------------------------------------------------- * * mongoc_client_destroy -- * * Destroys a mongoc_client_t and cleans up all resources associated * with the client instance. * * Returns: * None. * * Side effects: * @client is destroyed. * *-------------------------------------------------------------------------- */ void mongoc_client_destroy(mongoc_client_t *client) { if (client) { if (client->topology->single_threaded) { _mongoc_client_end_sessions(client); mongoc_topology_destroy(client->topology); } mongoc_write_concern_destroy(client->write_concern); mongoc_read_concern_destroy(client->read_concern); mongoc_read_prefs_destroy(client->read_prefs); mongoc_cluster_destroy(&client->cluster); mongoc_uri_destroy(client->uri); mongoc_set_destroy(client->client_sessions); mongoc_server_api_destroy(client->api); #ifdef MONGOC_ENABLE_SSL _mongoc_ssl_opts_cleanup(&client->ssl_opts, true); #endif bson_free(client); mongoc_counter_clients_active_dec(); mongoc_counter_clients_disposed_inc(); } } void mongoc_client_set_sockettimeoutms(mongoc_client_t *client, int32_t timeoutms) { BSON_ASSERT_PARAM(client); mongoc_cluster_set_sockettimeoutms(&client->cluster, timeoutms); } /* *-------------------------------------------------------------------------- * * mongoc_client_get_uri -- * * Fetch the URI used for @client. * * Returns: * A mongoc_uri_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_uri_t * mongoc_client_get_uri(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return client->uri; } /* *-------------------------------------------------------------------------- * * mongoc_client_start_session -- * * Creates a structure to communicate in a session over @client. * * This structure should be freed when the caller is done with it * using mongoc_client_session_destroy(). * * Returns: * A newly allocated mongoc_client_session_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_session_t * mongoc_client_start_session(mongoc_client_t *client, const mongoc_session_opt_t *opts, bson_error_t *error) { BSON_ASSERT_PARAM(client); mongoc_server_session_t *ss; mongoc_client_session_t *cs; uint32_t csid; ENTRY; const mongoc_ss_log_context_t ss_log_context = {.operation = "startSession"}; ss = _mongoc_client_pop_server_session(client, &ss_log_context, error); if (!ss) { RETURN(NULL); } /* get a random internal id for the session, retrying on collision */ do { csid = (uint32_t)_mongoc_rand_simple(&client->csid_rand_seed); } while (mongoc_set_get(client->client_sessions, csid)); /* causal consistency and snapshot cannot both be set. */ if (opts && mongoc_session_opts_get_causal_consistency(opts) && mongoc_session_opts_get_snapshot(opts)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Only one of causal consistency and snapshot can be enabled."); _mongoc_client_push_server_session(client, ss); RETURN(NULL); } cs = _mongoc_client_session_new(client, ss, opts, csid); /* remember session so if we see its client_session_id in a command, we can * find its lsid and clusterTime */ mongoc_set_add(client->client_sessions, csid, cs); RETURN(cs); } /* *-------------------------------------------------------------------------- * * mongoc_client_get_database -- * * Fetches a newly allocated database structure to communicate with * a database over @client. * * @database should be a db name such as "test". * * This structure should be freed when the caller is done with it * using mongoc_database_destroy(). * * Returns: * A newly allocated mongoc_database_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_database_t * mongoc_client_get_database(mongoc_client_t *client, const char *name) { BSON_ASSERT_PARAM(client); BSON_ASSERT(name); return _mongoc_database_new(client, name, client->read_prefs, client->read_concern, client->write_concern); } /* *-------------------------------------------------------------------------- * * mongoc_client_get_default_database -- * * Get the database named in the MongoDB connection URI, or NULL * if none was specified in the URI. * * This structure should be freed when the caller is done with it * using mongoc_database_destroy(). * * Returns: * A newly allocated mongoc_database_t or NULL. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_database_t * mongoc_client_get_default_database(mongoc_client_t *client) { const char *db; BSON_ASSERT_PARAM(client); db = mongoc_uri_get_database(client->uri); if (db) { return mongoc_client_get_database(client, db); } return NULL; } /* *-------------------------------------------------------------------------- * * mongoc_client_get_collection -- * * This function returns a newly allocated collection structure. * * @db should be the name of the database, such as "test". * @collection should be the name of the collection such as "test". * * The above would result in the namespace "test.test". * * You should free this structure when you are done with it using * mongoc_collection_destroy(). * * Returns: * A newly allocated mongoc_collection_t that should be freed with * mongoc_collection_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_collection_t * mongoc_client_get_collection(mongoc_client_t *client, const char *db, const char *collection) { BSON_ASSERT_PARAM(client); BSON_ASSERT(db); BSON_ASSERT(collection); return _mongoc_collection_new( client, db, collection, client->read_prefs, client->read_concern, client->write_concern); } /* *-------------------------------------------------------------------------- * * mongoc_client_get_gridfs -- * * This function returns a newly allocated collection structure. * * @db should be the name of the database, such as "test". * * @prefix optional prefix for GridFS collection names, or NULL. Default * is "fs", thus the default collection names for GridFS are "fs.files" * and "fs.chunks". * * Returns: * A newly allocated mongoc_gridfs_t that should be freed with * mongoc_gridfs_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_gridfs_t * mongoc_client_get_gridfs(mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_ASSERT(db); if (!prefix) { prefix = "fs"; } return _mongoc_gridfs_new(client, db, prefix, error); } /* *-------------------------------------------------------------------------- * * mongoc_client_get_write_concern -- * * Fetches the default write concern for @client. * * Returns: * A mongoc_write_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_write_concern_t * mongoc_client_get_write_concern(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return client->write_concern; } /* *-------------------------------------------------------------------------- * * mongoc_client_set_write_concern -- * * Sets the default write concern for @client. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_client_set_write_concern(mongoc_client_t *client, const mongoc_write_concern_t *write_concern) { BSON_ASSERT_PARAM(client); if (write_concern != client->write_concern) { if (client->write_concern) { mongoc_write_concern_destroy(client->write_concern); } client->write_concern = write_concern ? mongoc_write_concern_copy(write_concern) : mongoc_write_concern_new(); } } /* *-------------------------------------------------------------------------- * * mongoc_client_get_read_concern -- * * Fetches the default read concern for @client. * * Returns: * A mongoc_read_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_concern_t * mongoc_client_get_read_concern(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return client->read_concern; } /* *-------------------------------------------------------------------------- * * mongoc_client_set_read_concern -- * * Sets the default read concern for @client. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_client_set_read_concern(mongoc_client_t *client, const mongoc_read_concern_t *read_concern) { BSON_ASSERT_PARAM(client); if (read_concern != client->read_concern) { if (client->read_concern) { mongoc_read_concern_destroy(client->read_concern); } client->read_concern = read_concern ? mongoc_read_concern_copy(read_concern) : mongoc_read_concern_new(); } } /* *-------------------------------------------------------------------------- * * mongoc_client_get_read_prefs -- * * Fetch the default read preferences for @client. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_prefs_t * mongoc_client_get_read_prefs(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return client->read_prefs; } /* *-------------------------------------------------------------------------- * * mongoc_client_set_read_prefs -- * * Set the default read preferences for @client. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_client_set_read_prefs(mongoc_client_t *client, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT_PARAM(client); if (read_prefs != client->read_prefs) { if (client->read_prefs) { mongoc_read_prefs_destroy(client->read_prefs); } client->read_prefs = read_prefs ? mongoc_read_prefs_copy(read_prefs) : mongoc_read_prefs_new(MONGOC_READ_PRIMARY); } } static bool _mongoc_client_retryable_read_command_with_stream(mongoc_client_t *client, mongoc_cmd_parts_t *parts, mongoc_server_stream_t *server_stream, bson_t *reply, bson_error_t *error) { mongoc_server_stream_t *retry_server_stream = NULL; bool is_retryable = true; bool ret; bson_t reply_local; BSON_ASSERT_PARAM(client); BSON_UNUSED(server_stream); if (reply == NULL) { reply = &reply_local; } ENTRY; BSON_ASSERT(parts->is_retryable_read); retry: ret = mongoc_cluster_run_command_monitored(&client->cluster, &parts->assembled, reply, error); /* If a retryable error is encountered and the read is retryable, select * a new readable stream and retry. If server selection fails or the selected * server does not support retryable reads, fall through and allow the * original error to be reported. */ if (is_retryable && _mongoc_read_error_get_type(ret, error, reply) == MONGOC_READ_ERR_RETRY) { /* each read command may be retried at most once */ is_retryable = false; { mongoc_deprioritized_servers_t *const ds = mongoc_deprioritized_servers_new(); if (retry_server_stream) { mongoc_deprioritized_servers_add_if_sharded( ds, retry_server_stream->topology_type, retry_server_stream->sd); mongoc_server_stream_cleanup(retry_server_stream); } else { mongoc_deprioritized_servers_add_if_sharded(ds, server_stream->topology_type, server_stream->sd); } const mongoc_ss_log_context_t ss_log_context = { .operation = parts->assembled.command_name, .has_operation_id = true, .operation_id = parts->assembled.operation_id, }; retry_server_stream = mongoc_cluster_stream_for_reads(&client->cluster, &ss_log_context, parts->read_prefs, parts->assembled.session, ds, NULL /* reply */, NULL /* error */); mongoc_deprioritized_servers_destroy(ds); } if (retry_server_stream) { parts->assembled.server_stream = retry_server_stream; bson_destroy(reply); GOTO(retry); } } if (retry_server_stream) { mongoc_server_stream_cleanup(retry_server_stream); } if (ret && error) { /* if a retry succeeded, clear the initial error */ memset(error, 0, sizeof(bson_error_t)); } RETURN(ret); } static bool _mongoc_client_command_with_stream(mongoc_client_t *client, mongoc_cmd_parts_t *parts, const mongoc_read_prefs_t *read_prefs, mongoc_server_stream_t *server_stream, bson_t *reply, bson_error_t *error) { ENTRY; BSON_ASSERT_PARAM(client); BSON_UNUSED(read_prefs); parts->assembled.operation_id = ++client->cluster.operation_id; if (!mongoc_cmd_parts_assemble(parts, server_stream, error)) { _mongoc_bson_init_if_set(reply); return false; } if (parts->is_retryable_write) { mongoc_server_stream_t *retry_server_stream = NULL; bool ret = mongoc_cluster_run_retryable_write( &client->cluster, &parts->assembled, true /* is_retryable */, &retry_server_stream, reply, error); if (retry_server_stream) { mongoc_server_stream_cleanup(retry_server_stream); parts->assembled.server_stream = NULL; } RETURN(ret); } if (parts->is_retryable_read) { RETURN(_mongoc_client_retryable_read_command_with_stream(client, parts, server_stream, reply, error)); } RETURN(mongoc_cluster_run_command_monitored(&client->cluster, &parts->assembled, reply, error)); } bool mongoc_client_command_simple(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) { mongoc_cluster_t *cluster; mongoc_server_stream_t *server_stream = NULL; mongoc_cmd_parts_t parts; bool ret; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT(db_name); BSON_ASSERT(command); if (!_mongoc_read_prefs_validate(read_prefs, error)) { RETURN(false); } cluster = &client->cluster; mongoc_cmd_parts_init(&parts, client, db_name, MONGOC_QUERY_NONE, command); parts.read_prefs = read_prefs; /* Server Selection Spec: "The generic command method has a default read * preference of mode 'primary'. The generic command method MUST ignore any * default read preference from client, database or collection * configuration. The generic command method SHOULD allow an optional read * preference argument." */ const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_get_command_name(command)}; server_stream = mongoc_cluster_stream_for_reads(cluster, &ss_log_context, read_prefs, NULL, NULL, reply, error); if (server_stream) { ret = _mongoc_client_command_with_stream(client, &parts, read_prefs, server_stream, reply, error); } else { /* reply initialized by mongoc_cluster_stream_for_reads */ ret = false; } mongoc_cmd_parts_cleanup(&parts); mongoc_server_stream_cleanup(server_stream); RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_client_command_with_opts -- * * Execute a command on the server. If mode is MONGOC_CMD_READ or * MONGOC_CMD_RW, then read concern is applied from @opts, or else from * @default_rc, and read preferences are applied from @user_prefs, or else * from @default_prefs. If mode is MONGOC_CMD_WRITE or MONGOC_CMD_RW, then * write concern is applied from @opts if present, or else @default_wc. * * If mode is MONGOC_CMD_RAW, then read concern and write concern are * applied from @opts only. Read preferences are applied from * @user_prefs. * * The mongoc_client_t's read preference, read concern, and write concern * are *NOT* applied. * * Returns: * Success or failure. * A write concern timeout or write concern error is considered a failure. * * Side effects: * @reply is always initialized. * @error is filled out if the command fails. * *-------------------------------------------------------------------------- */ bool _mongoc_client_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, mongoc_command_mode_t mode, const bson_t *opts, mongoc_query_flags_t flags, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, mongoc_read_concern_t *default_rc, mongoc_write_concern_t *default_wc, bson_t *reply, bson_error_t *error) { mongoc_read_write_opts_t read_write_opts; mongoc_cmd_parts_t parts; const char *command_name; const mongoc_read_prefs_t *prefs = COALESCE(user_prefs, default_prefs); mongoc_server_stream_t *server_stream = NULL; mongoc_cluster_t *cluster; mongoc_client_session_t *cs; bson_t reply_local; bson_t *reply_ptr; bool reply_initialized = false; bool ret = false; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT(db_name); BSON_ASSERT(command); command_name = _mongoc_get_command_name(command); cluster = &client->cluster; reply_ptr = reply ? reply : &reply_local; mongoc_cmd_parts_init(&parts, client, db_name, flags, command); parts.is_read_command = (mode & MONGOC_CMD_READ); parts.is_write_command = (mode & MONGOC_CMD_WRITE); if (!_mongoc_read_write_opts_parse(client, opts, &read_write_opts, error)) { GOTO(done); } cs = read_write_opts.client_session; if (!command_name) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command document"); GOTO(done); } if (_mongoc_client_session_in_txn(read_write_opts.client_session)) { if ((mode == MONGOC_CMD_READ || mode == MONGOC_CMD_RAW) && !IS_PREF_PRIMARY(user_prefs)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Read preference in a transaction must be primary"); GOTO(done); } if (!bson_empty(&read_write_opts.readConcern)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set read concern after starting transaction"); GOTO(done); } if (read_write_opts.writeConcern && strcmp(command_name, "commitTransaction") != 0 && strcmp(command_name, "abortTransaction") != 0) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting transaction"); GOTO(done); } } if (mode == MONGOC_CMD_READ || mode == MONGOC_CMD_RAW) { /* NULL read pref is ok */ if (!_mongoc_read_prefs_validate(prefs, error)) { GOTO(done); } parts.read_prefs = prefs; } else { /* this is a command that writes */ prefs = NULL; } const mongoc_ss_log_context_t ss_log_context = {.operation = command_name}; if (read_write_opts.serverId) { /* "serverId" passed in opts */ server_stream = mongoc_cluster_stream_for_server( cluster, read_write_opts.serverId, true /* reconnect ok */, cs, reply_ptr, error); if (server_stream && server_stream->sd->type != MONGOC_SERVER_MONGOS) { parts.user_query_flags |= MONGOC_QUERY_SECONDARY_OK; } } else if (parts.is_write_command) { server_stream = mongoc_cluster_stream_for_writes(cluster, &ss_log_context, cs, NULL, reply_ptr, error); } else { server_stream = mongoc_cluster_stream_for_reads(cluster, &ss_log_context, prefs, cs, NULL, reply_ptr, error); } if (!server_stream) { /* stream_for_reads/writes/server has initialized reply */ reply_initialized = true; GOTO(done); } if (!mongoc_cmd_parts_append_read_write(&parts, &read_write_opts, error)) { GOTO(done); } if (mode & MONGOC_CMD_WRITE) { /* use default write concern unless it's in opts */ if (!mongoc_write_concern_is_default(default_wc) && !read_write_opts.write_concern_owned) { if (!mongoc_cmd_parts_set_write_concern(&parts, default_wc, error)) { GOTO(done); } } } /* use default read concern for read command, unless it's in opts */ if ((mode & MONGOC_CMD_READ) && bson_empty(&read_write_opts.readConcern)) { if (!mongoc_cmd_parts_set_read_concern(&parts, default_rc, error)) { GOTO(done); } } ret = _mongoc_client_command_with_stream(client, &parts, user_prefs, server_stream, reply_ptr, error); reply_initialized = true; if (ret && (mode & MONGOC_CMD_WRITE)) { ret = !_mongoc_parse_wc_err(reply_ptr, error); } done: if (reply_ptr == &reply_local) { if (reply_initialized) { bson_destroy(reply_ptr); } } else if (!reply_initialized) { _mongoc_bson_init_if_set(reply); } if (server_stream) { mongoc_server_stream_cleanup(server_stream); } mongoc_cmd_parts_cleanup(&parts); _mongoc_read_write_opts_cleanup(&read_write_opts); RETURN(ret); } bool mongoc_client_read_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(client, db_name, command, MONGOC_CMD_READ, opts, MONGOC_QUERY_NONE, read_prefs, client->read_prefs, client->read_concern, client->write_concern, reply, error); } bool mongoc_client_write_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(client, db_name, command, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, client->read_prefs, client->read_concern, client->write_concern, reply, error); } bool mongoc_client_read_write_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(client, db_name, command, MONGOC_CMD_RW, opts, MONGOC_QUERY_NONE, read_prefs, client->read_prefs, client->read_concern, client->write_concern, reply, error); } bool mongoc_client_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(client, db_name, command, MONGOC_CMD_RAW, opts, MONGOC_QUERY_NONE, read_prefs, NULL, client->read_concern, client->write_concern, reply, error); } bool mongoc_client_command_simple_with_server_id(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, uint32_t server_id, bson_t *reply, bson_error_t *error) { mongoc_server_stream_t *server_stream; mongoc_cmd_parts_t parts; bool ret; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT(db_name); BSON_ASSERT(command); if (!_mongoc_read_prefs_validate(read_prefs, error)) { RETURN(false); } server_stream = mongoc_cluster_stream_for_server(&client->cluster, server_id, true /* reconnect ok */, NULL, reply, error); if (server_stream) { mongoc_cmd_parts_init(&parts, client, db_name, MONGOC_QUERY_NONE, command); parts.read_prefs = read_prefs; ret = _mongoc_client_command_with_stream(client, &parts, read_prefs, server_stream, reply, error); mongoc_cmd_parts_cleanup(&parts); mongoc_server_stream_cleanup(server_stream); RETURN(ret); } else { /* stream_for_server initialized reply */ RETURN(false); } } static void _mongoc_client_prepare_killcursors_command(int64_t cursor_id, const char *collection, bson_t *command) { bson_array_builder_t *child; bson_append_utf8(command, "killCursors", 11, collection, -1); bson_append_array_builder_begin(command, "cursors", 7, &child); bson_array_builder_append_int64(child, cursor_id); bson_append_array_builder_end(command, child); } void _mongoc_client_kill_cursor(mongoc_client_t *client, uint32_t server_id, int64_t cursor_id, const char *db, const char *collection, mongoc_client_session_t *cs) { mongoc_server_stream_t *server_stream; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(db); BSON_ASSERT_PARAM(collection); BSON_ASSERT(cursor_id); /* don't attempt reconnect if server unavailable, and ignore errors */ server_stream = mongoc_cluster_stream_for_server(&client->cluster, server_id, false /* reconnect_ok */, NULL, NULL, NULL); if (!server_stream) { return; } _mongoc_client_killcursors_command(&client->cluster, server_stream, cursor_id, db, collection, cs); mongoc_server_stream_cleanup(server_stream); EXIT; } static void _mongoc_client_killcursors_command(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream, int64_t cursor_id, const char *db, const char *collection, mongoc_client_session_t *cs) { bson_t command = BSON_INITIALIZER; mongoc_cmd_parts_t parts; ENTRY; _mongoc_client_prepare_killcursors_command(cursor_id, collection, &command); mongoc_cmd_parts_init(&parts, cluster->client, db, MONGOC_QUERY_SECONDARY_OK, &command); parts.assembled.operation_id = ++cluster->operation_id; mongoc_cmd_parts_set_session(&parts, cs); if (mongoc_cmd_parts_assemble(&parts, server_stream, NULL)) { /* Find, getMore And killCursors Commands Spec: "The result from the * killCursors command MAY be safely ignored." */ (void)mongoc_cluster_run_command_monitored(cluster, &parts.assembled, NULL, NULL); } mongoc_cmd_parts_cleanup(&parts); bson_destroy(&command); EXIT; } char ** mongoc_client_get_database_names(mongoc_client_t *client, bson_error_t *error) { return mongoc_client_get_database_names_with_opts(client, NULL, error); } char ** mongoc_client_get_database_names_with_opts(mongoc_client_t *client, const bson_t *opts, bson_error_t *error) { bson_iter_t iter; const char *name; char **ret = NULL; int i = 0; mongoc_cursor_t *cursor; const bson_t *doc; bson_t cmd = BSON_INITIALIZER; BSON_ASSERT_PARAM(client); BSON_APPEND_INT32(&cmd, "listDatabases", 1); BSON_APPEND_BOOL(&cmd, "nameOnly", true); /* ignore client read prefs */ cursor = _mongoc_cursor_array_new(client, "admin", &cmd, opts, "databases"); bson_destroy(&cmd); while (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init(&iter, doc) && bson_iter_find(&iter, "name") && BSON_ITER_HOLDS_UTF8(&iter) && (name = bson_iter_utf8(&iter, NULL))) { ret = (char **)bson_realloc(ret, sizeof(char *) * (i + 2)); ret[i] = bson_strdup(name); ret[++i] = NULL; } } if (!ret && !mongoc_cursor_error(cursor, error)) { ret = (char **)bson_malloc0(sizeof(void *)); } mongoc_cursor_destroy(cursor); return ret; } mongoc_cursor_t * mongoc_client_find_databases(mongoc_client_t *client, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_UNUSED(error); /* existing bug in this deprecated API: error pointer is unused */ return mongoc_client_find_databases_with_opts(client, NULL); } mongoc_cursor_t * mongoc_client_find_databases_with_opts(mongoc_client_t *client, const bson_t *opts) { bson_t cmd = BSON_INITIALIZER; mongoc_cursor_t *cursor; BSON_ASSERT_PARAM(client); BSON_APPEND_INT32(&cmd, "listDatabases", 1); cursor = _mongoc_cursor_array_new(client, "admin", &cmd, opts, "databases"); bson_destroy(&cmd); return cursor; } void mongoc_client_set_stream_initiator(mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { MONGOC_ERROR("mongoc_client_set_stream_initiator cannot be called on a pooled client."); return; } _mongoc_client_set_stream_initiator_single_or_pooled(client, initiator, user_data); } void _mongoc_client_set_stream_initiator_single_or_pooled(mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data) { BSON_ASSERT_PARAM(client); if (!initiator) { initiator = mongoc_client_default_stream_initiator; user_data = client; } else { MONGOC_DEBUG("Using custom stream initiator."); } client->initiator = initiator; client->initiator_data = user_data; if (client->topology->single_threaded) { mongoc_topology_scanner_set_stream_initiator(client->topology->scanner, initiator, user_data); } } bool mongoc_client_set_apm_callbacks(mongoc_client_t *client, mongoc_apm_callbacks_t *callbacks, void *context) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { MONGOC_ERROR("Cannot set callbacks on a pooled client, use " "mongoc_client_pool_set_apm_callbacks"); return false; } mongoc_log_and_monitor_instance_set_apm_callbacks(&client->topology->log_and_monitor, callbacks, context); return true; } bool mongoc_client_set_structured_log_opts(mongoc_client_t *client, const mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(client); BSON_OPTIONAL_PARAM(opts); if (client->topology->single_threaded) { mongoc_log_and_monitor_instance_set_structured_log_opts(&client->topology->log_and_monitor, opts); return true; } else { MONGOC_WARNING("Cannot set structured log options on a pooled client, use " "mongoc_client_pool_set_structured_log_opts before the first mongoc_client_pool_pop"); return false; } } mongoc_server_description_t * mongoc_client_get_server_description(mongoc_client_t *client, uint32_t server_id) { BSON_ASSERT_PARAM(client); mongoc_server_description_t *ret; mc_shared_tpld td = mc_tpld_take_ref(client->topology); mongoc_server_description_t const *sd = mongoc_topology_description_server_by_id_const(td.ptr, server_id, NULL /* <- the error info isn't useful */); ret = mongoc_server_description_new_copy(sd); mc_tpld_drop_ref(&td); return ret; } mongoc_server_description_t ** mongoc_client_get_server_descriptions(const mongoc_client_t *client, size_t *n /* OUT */) { BSON_ASSERT_PARAM(client); mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(client)->topology); mongoc_server_description_t **const sds = mongoc_topology_description_get_servers(td.ptr, BSON_ASSERT_PTR_INLINE(n)); mc_tpld_drop_ref(&td); return sds; } void mongoc_server_descriptions_destroy_all(mongoc_server_description_t **sds, size_t n) { size_t i; for (i = 0; i < n; ++i) { mongoc_server_description_destroy(sds[i]); } bson_free(sds); } mongoc_server_description_t * mongoc_client_select_server(mongoc_client_t *client, bool for_writes, const mongoc_read_prefs_t *prefs, bson_error_t *error) { BSON_ASSERT_PARAM(client); mongoc_ss_optype_t optype = for_writes ? MONGOC_SS_WRITE : MONGOC_SS_READ; mongoc_server_description_t *sd; if (for_writes && prefs) { _mongoc_set_error(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "Cannot use read preferences with for_writes = true"); return NULL; } if (!_mongoc_read_prefs_validate(prefs, error)) { return NULL; } const mongoc_ss_log_context_t ss_log_context = {.operation = "mongoc_client_select_server"}; sd = mongoc_topology_select(client->topology, optype, &ss_log_context, prefs, NULL /* chosen read mode */, error); if (!sd) { return NULL; } if (mongoc_cluster_check_interval(&client->cluster, sd->id)) { /* check not required, or it succeeded */ return sd; } /* check failed, retry once */ mongoc_server_description_destroy(sd); sd = mongoc_topology_select(client->topology, optype, &ss_log_context, prefs, NULL /* chosen read mode */, error); if (sd) { return sd; } return NULL; } bool mongoc_client_set_error_api(mongoc_client_t *client, int32_t version) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { MONGOC_ERROR("Cannot set Error API Version on a pooled client, use " "mongoc_client_pool_set_error_api"); return false; } if (version != MONGOC_ERROR_API_VERSION_LEGACY && version != MONGOC_ERROR_API_VERSION_2) { MONGOC_ERROR("Unsupported Error API Version: %" PRId32, version); return false; } if (client->error_api_set) { MONGOC_ERROR("Can only set Error API Version once"); return false; } client->error_api_version = version; client->error_api_set = true; return true; } bool mongoc_client_set_appname(mongoc_client_t *client, const char *appname) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { MONGOC_ERROR("Cannot call set_appname on a client from a pool"); return false; } return _mongoc_topology_set_appname(client->topology, appname); } mongoc_server_session_t * _mongoc_client_pop_server_session(mongoc_client_t *client, const mongoc_ss_log_context_t *log_context, bson_error_t *error) { BSON_ASSERT_PARAM(client); return _mongoc_topology_pop_server_session(client->topology, log_context, error); } /* *-------------------------------------------------------------------------- * * _mongoc_client_lookup_session -- * * Retrieve a mongoc_client_session_t associated with @client_session_id. * Use this to find the "lsid" and "$clusterTime" to send in the server * command. * * Returns: * True on success, false on error and @error is set. Will return false * if the session is from an outdated client generation, a holdover * from before a call to mongoc_client_reset. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool _mongoc_client_lookup_session(const mongoc_client_t *client, uint32_t client_session_id, mongoc_client_session_t **cs /* OUT */, bson_error_t *error /* OUT */) { ENTRY; BSON_ASSERT_PARAM(client); *cs = mongoc_set_get(client->client_sessions, client_session_id); if (*cs) { RETURN(true); } _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid sessionId"); RETURN(false); } void _mongoc_client_unregister_session(mongoc_client_t *client, mongoc_client_session_t *session) { BSON_ASSERT_PARAM(client); mongoc_set_rm(client->client_sessions, session->client_session_id); } void _mongoc_client_push_server_session(mongoc_client_t *client, mongoc_server_session_t *server_session) { BSON_ASSERT_PARAM(client); _mongoc_topology_push_server_session(client->topology, server_session); } /* *-------------------------------------------------------------------------- * * mongoc_client_end_sessions -- * * End all server sessions in the topology's server session pool. * Don't block long: if server selection or connecting fails, quit. * * The server session pool becomes invalid, but may not be empty. * Destroy the topology after this without using any sessions. * *-------------------------------------------------------------------------- */ void _mongoc_client_end_sessions(mongoc_client_t *client) { mongoc_topology_t *t = client->topology; mongoc_read_prefs_t *prefs; bson_error_t error; uint32_t server_id; bson_t cmd; mongoc_server_stream_t *stream; mongoc_cmd_parts_t parts; mongoc_cluster_t *cluster = &client->cluster; bool r; BSON_ASSERT_PARAM(client); while (!mongoc_server_session_pool_is_empty(t->session_pool)) { prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED); const mongoc_ss_log_context_t ss_log_context = { .operation = "endSessions", .has_operation_id = true, .operation_id = 1 + cluster->operation_id}; server_id = mongoc_topology_select_server_id(t, MONGOC_SS_READ, &ss_log_context, prefs, NULL /* chosen read mode */, NULL /* deprioritized servers */, &error); mongoc_read_prefs_destroy(prefs); if (!server_id) { MONGOC_WARNING("Couldn't send \"endSessions\": %s", error.message); return; } stream = mongoc_cluster_stream_for_server(cluster, server_id, false /* reconnect_ok */, NULL, NULL, &error); if (!stream) { MONGOC_WARNING("Couldn't send \"endSessions\": %s", error.message); return; } /* end sessions in chunks */ while (_mongoc_topology_end_sessions_cmd(t, &cmd)) { mongoc_cmd_parts_init(&parts, client, "admin", MONGOC_QUERY_SECONDARY_OK, &cmd); parts.assembled.operation_id = ++cluster->operation_id; parts.prohibit_lsid = true; r = mongoc_cmd_parts_assemble(&parts, stream, &error); if (!r) { MONGOC_WARNING("Couldn't construct \"endSessions\" command: %s", error.message); } else { r = mongoc_cluster_run_command_monitored(cluster, &parts.assembled, NULL, &error); if (!r) { MONGOC_WARNING("Couldn't send \"endSessions\": %s", error.message); } } mongoc_cmd_parts_cleanup(&parts); if (!mongoc_cluster_stream_valid(cluster, stream)) { /* The stream was invalidated as a result of a network error, so we * stop sending commands. */ break; } bson_destroy(&cmd); } bson_destroy(&cmd); mongoc_server_stream_cleanup(stream); } } void mongoc_client_reset(mongoc_client_t *client) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { MONGOC_WARNING("mongoc_client_reset called on a pooled client, this is a no-op."); return; } client->generation++; /* Client sessions are owned and destroyed by the user, but we keep local pointers to them for reference. On reset, clear our local set without destroying the sessions or calling endSessions. client_sessions has no dtor, so it won't destroy its items. Destroying the local cache of client sessions here ensures they cannot be used by future operations--lookup for them will fail. */ mongoc_set_destroy(client->client_sessions); client->client_sessions = mongoc_set_new(8, NULL, NULL); /* Server sessions are owned by us, so we clear the pool on reset. */ mongoc_server_session_pool_clear(client->topology->session_pool); } mongoc_change_stream_t * mongoc_client_watch(mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts) { return _mongoc_change_stream_new_from_client(client, pipeline, opts); } bool mongoc_client_enable_auto_encryption(mongoc_client_t *client, mongoc_auto_encryption_opts_t *opts, bson_error_t *error) { BSON_ASSERT_PARAM(client); if (!client->topology->single_threaded) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Cannot enable auto encryption on a pooled client, use " "mongoc_client_pool_enable_auto_encryption"); return false; } return _mongoc_cse_client_enable_auto_encryption(client, opts, error); } bool mongoc_client_set_server_api(mongoc_client_t *client, const mongoc_server_api_t *api, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(api); if (!client->topology->single_threaded) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_API_FROM_POOL, "Cannot set server api on a client checked out from a pool"); return false; } if (mongoc_client_uses_server_api(client)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_API_ALREADY_SET, "Cannot set server api more than once per client"); return false; } client->api = mongoc_server_api_copy(api); _mongoc_topology_scanner_set_server_api(client->topology->scanner, api); return true; } mongoc_server_description_t * mongoc_client_get_handshake_description(mongoc_client_t *client, uint32_t server_id, bson_t *opts, bson_error_t *error) { mongoc_server_stream_t *server_stream; mongoc_server_description_t *sd; BSON_ASSERT_PARAM(client); BSON_UNUSED(opts); server_stream = mongoc_cluster_stream_for_server( &client->cluster, server_id, true /* reconnect */, NULL /* client session */, NULL /* reply */, error); if (!server_stream) { return NULL; } sd = mongoc_server_description_new_copy(server_stream->sd); mongoc_server_stream_cleanup(server_stream); return sd; } bool mongoc_client_uses_server_api(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return mongoc_topology_uses_server_api(client->topology); } bool mongoc_client_uses_loadbalanced(const mongoc_client_t *client) { BSON_ASSERT_PARAM(client); return mongoc_topology_uses_loadbalanced(client->topology); } bool mongoc_client_set_oidc_callback(mongoc_client_t *client, const mongoc_oidc_callback_t *callback) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(callback); if (mongoc_oidc_cache_has_user_callback(client->topology->oidc_cache)) { MONGOC_ERROR("mongoc_client_set_oidc_callback can only be called once per client"); return false; } if (!client->topology->single_threaded) { MONGOC_ERROR("mongoc_client_set_oidc_callback must only be used for single threaded clients. " "For client pools, use mongoc_client_pool_set_oidc_callback instead."); return false; } mongoc_oidc_cache_set_user_callback(client->topology->oidc_cache, callback); return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-client.h000066400000000000000000000257461511661753600241150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLIENT_H #define MONGOC_CLIENT_H #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #include #include #include #include #include #include #include BSON_BEGIN_DECLS /* This define is part of our public API. But per MongoDB 4.4, there is no * longer a size limit on collection names. */ #define MONGOC_NAMESPACE_MAX 128 #ifndef MONGOC_DEFAULT_CONNECTTIMEOUTMS #define MONGOC_DEFAULT_CONNECTTIMEOUTMS (10 * 1000L) #endif #ifndef MONGOC_DEFAULT_SOCKETTIMEOUTMS /* * NOTE: The default socket timeout for connections is 5 minutes. This * means that if your MongoDB server dies or becomes unavailable * it will take 5 minutes to detect this. * * You can change this by providing sockettimeoutms= in your * connection URI. */ #define MONGOC_DEFAULT_SOCKETTIMEOUTMS (1000L * 60L * 5L) #endif /** * mongoc_client_t: * * The mongoc_client_t structure maintains information about a connection to * a MongoDB server. */ typedef struct _mongoc_client_t mongoc_client_t; typedef struct _mongoc_client_session_t mongoc_client_session_t; typedef struct _mongoc_session_opt_t mongoc_session_opt_t; typedef struct _mongoc_transaction_opt_t mongoc_transaction_opt_t; /** * mongoc_stream_initiator_t: * @uri: The uri and options for the stream. * @host: The host and port (or UNIX domain socket path) to connect to. * @user_data: The pointer passed to mongoc_client_set_stream_initiator. * @error: A location for an error. * * Creates a new mongoc_stream_t for the host and port. Begin a * non-blocking connect and return immediately. * * This can be used by language bindings to create network transports other * than those built into libmongoc. An example of such would be the streams * API provided by PHP. * * Returns: A newly allocated mongoc_stream_t or NULL on failure. */ typedef mongoc_stream_t *(BSON_CALL *mongoc_stream_initiator_t)(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error); MONGOC_EXPORT(mongoc_client_t *) mongoc_client_new(const char *uri_string) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_client_t *) mongoc_client_new_from_uri(const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_client_t *) mongoc_client_new_from_uri_with_error(const mongoc_uri_t *uri, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_set_sockettimeoutms(mongoc_client_t *client, int32_t timeoutms); MONGOC_EXPORT(const mongoc_uri_t *) mongoc_client_get_uri(const mongoc_client_t *client); MONGOC_EXPORT(void) mongoc_client_set_stream_initiator(mongoc_client_t *client, mongoc_stream_initiator_t initiator, void *user_data); MONGOC_EXPORT(bool) mongoc_client_command_simple(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_read_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_write_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_read_write_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_command_with_opts(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_client_command_simple_with_server_id(mongoc_client_t *client, const char *db_name, const bson_t *command, const mongoc_read_prefs_t *read_prefs, uint32_t server_id, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(void) mongoc_client_destroy(mongoc_client_t *client); MONGOC_EXPORT(mongoc_client_session_t *) mongoc_client_start_session(mongoc_client_t *client, const mongoc_session_opt_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_database_t *) mongoc_client_get_database(mongoc_client_t *client, const char *name) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_database_t *) mongoc_client_get_default_database(mongoc_client_t *client) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_gridfs_t *) mongoc_client_get_gridfs(mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_collection_t *) mongoc_client_get_collection(mongoc_client_t *client, const char *db, const char *collection) BSON_GNUC_WARN_UNUSED_RESULT; BSON_DEPRECATED_FOR(mongoc_client_get_database_names_with_opts) MONGOC_EXPORT(char **) mongoc_client_get_database_names(mongoc_client_t *client, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(char **) mongoc_client_get_database_names_with_opts(mongoc_client_t *client, const bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; BSON_DEPRECATED_FOR(mongoc_client_find_databases_with_opts) MONGOC_EXPORT(mongoc_cursor_t *) mongoc_client_find_databases(mongoc_client_t *client, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_cursor_t *) mongoc_client_find_databases_with_opts(mongoc_client_t *client, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_client_get_write_concern(const mongoc_client_t *client); MONGOC_EXPORT(void) mongoc_client_set_write_concern(mongoc_client_t *client, const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(const mongoc_read_concern_t *) mongoc_client_get_read_concern(const mongoc_client_t *client); MONGOC_EXPORT(void) mongoc_client_set_read_concern(mongoc_client_t *client, const mongoc_read_concern_t *read_concern); MONGOC_EXPORT(const mongoc_read_prefs_t *) mongoc_client_get_read_prefs(const mongoc_client_t *client); MONGOC_EXPORT(void) mongoc_client_set_read_prefs(mongoc_client_t *client, const mongoc_read_prefs_t *read_prefs); #ifdef MONGOC_ENABLE_SSL MONGOC_EXPORT(void) mongoc_client_set_ssl_opts(mongoc_client_t *client, const mongoc_ssl_opt_t *opts); #endif MONGOC_EXPORT(bool) mongoc_client_set_apm_callbacks(mongoc_client_t *client, mongoc_apm_callbacks_t *callbacks, void *context); MONGOC_EXPORT(bool) mongoc_client_set_structured_log_opts(mongoc_client_t *client, const mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(mongoc_server_description_t *) mongoc_client_get_server_description(mongoc_client_t *client, uint32_t server_id) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_server_description_t **) mongoc_client_get_server_descriptions(const mongoc_client_t *client, size_t *n) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_server_descriptions_destroy_all(mongoc_server_description_t **sds, size_t n); MONGOC_EXPORT(mongoc_server_description_t *) mongoc_client_select_server(mongoc_client_t *client, bool for_writes, const mongoc_read_prefs_t *prefs, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_client_set_error_api(mongoc_client_t *client, int32_t version); MONGOC_EXPORT(bool) mongoc_client_set_appname(mongoc_client_t *client, const char *appname); MONGOC_EXPORT(mongoc_change_stream_t *) mongoc_client_watch(mongoc_client_t *client, const bson_t *pipeline, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_client_reset(mongoc_client_t *client); MONGOC_EXPORT(bool) mongoc_client_enable_auto_encryption(mongoc_client_t *client, mongoc_auto_encryption_opts_t *opts, bson_error_t *error); MONGOC_EXPORT(const char *) mongoc_client_get_crypt_shared_version(const mongoc_client_t *client) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_client_set_server_api(mongoc_client_t *client, const mongoc_server_api_t *api, bson_error_t *error); MONGOC_EXPORT(mongoc_server_description_t *) mongoc_client_get_handshake_description(mongoc_client_t *client, uint32_t server_id, bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_client_set_oidc_callback(mongoc_client_t *client, const mongoc_oidc_callback_t *callback); BSON_END_DECLS #endif /* MONGOC_CLIENT_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-aws-private.h000066400000000000000000000113251511661753600265440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLUSTER_AWS_PRIVATE_H #define MONGOC_CLUSTER_AWS_PRIVATE_H #include // bson_mutex_t #include #include #include #include bool _mongoc_cluster_auth_node_aws(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error); /* The following are declared in the private header for testing. It is only used * in test-mongoc-aws.c, mongoc-cluster-aws.c, and test-awsauth.c */ typedef struct { char *access_key_id; char *secret_access_key; char *session_token; // expiration is the time when these credentials expire. // If expiration.set is false, the credentials do not have a known // expiration. struct { mlib_timer value; bool set; } expiration; } _mongoc_aws_credentials_t; #define MONGOC_AWS_CREDENTIALS_INIT \ (_mongoc_aws_credentials_t) \ { \ .access_key_id = NULL, .secret_access_key = NULL, .session_token = NULL, \ .expiration = {.value = (mlib_timer){0}, .set = false}, \ } #define MONGOC_AWS_CREDENTIALS_EXPIRATION_WINDOW mlib_duration(5, mn) // _mongoc_aws_credentials_cache_t is a thread-safe global cache of AWS // credentials. typedef struct { struct { _mongoc_aws_credentials_t value; bool set; } cached; bson_mutex_t mutex; // guards cached. } _mongoc_aws_credentials_cache_t; extern _mongoc_aws_credentials_cache_t mongoc_aws_credentials_cache; // _mongoc_aws_credentials_cache_init initializes the global // `mongoc_aws_credentials_cache. It is expected to be called by mongoc_init. void _mongoc_aws_credentials_cache_init(void); // _mongoc_aws_credentials_cache_lock exclusively locks the cache. void _mongoc_aws_credentials_cache_lock(void); // _mongoc_aws_credentials_cache_unlock unlocks the cache. void _mongoc_aws_credentials_cache_unlock(void); // _mongoc_aws_credentials_cache_put_nolock is a non-locking variant of // _mongoc_aws_credentials_cache_put. void _mongoc_aws_credentials_cache_put_nolock(const _mongoc_aws_credentials_t *creds); // _mongoc_aws_credentials_cache_put adds credentials into the global cache. void _mongoc_aws_credentials_cache_put(const _mongoc_aws_credentials_t *creds); // _mongoc_aws_credentials_cache_get_nolock is a non-locking variant of // _mongoc_aws_credentials_cache_get. bool _mongoc_aws_credentials_cache_get_nolock(_mongoc_aws_credentials_t *creds); // _mongoc_aws_credentials_cache_get returns true if cached credentials were // retrieved. // The passed `creds` is expected to be initialized with // MONGOC_AWS_CREDENTIALS_INIT. Returns true if there are valid cached // credentials. Retrieved credentials are copied to `creds`. Callers are // expected to call // `_mongoc_aws_credentials_cleanup` on `creds`. // Returns false and zeroes `creds` if there are no valid cached credentials. bool _mongoc_aws_credentials_cache_get(_mongoc_aws_credentials_t *creds); // _mongoc_aws_credentials_cache_clear_nolock is the non-locking variant of // _mongoc_aws_credentials_cache_clear void _mongoc_aws_credentials_cache_clear_nolock(void); // _mongoc_aws_credentials_cache_clear clears credentials in the global cache void _mongoc_aws_credentials_cache_clear(void); // _mongoc_aws_credentials_cache_cleanup frees data for the global cache. // It is expected to be called by mongoc_cleanup. void _mongoc_aws_credentials_cache_cleanup(void); bool _mongoc_aws_credentials_obtain(mongoc_uri_t *uri, _mongoc_aws_credentials_t *creds, bson_error_t *error); void _mongoc_aws_credentials_copy_to(const _mongoc_aws_credentials_t *src, _mongoc_aws_credentials_t *dst); void _mongoc_aws_credentials_cleanup(_mongoc_aws_credentials_t *creds); bool _mongoc_validate_and_derive_region(char *sts_fqdn, size_t sts_fqdn_len, char **region, bson_error_t *error); #endif /* MONGOC_CLUSTER_AWS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-aws.c000066400000000000000000001317221511661753600250730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* All interaction with kms_message is limited to this file. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "aws_auth" #define AUTH_ERROR_AND_FAIL(...) \ do { \ _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, __VA_ARGS__); \ goto fail; \ } while (0) #ifdef MONGOC_ENABLE_MONGODB_AWS_AUTH #include /* * Run a single command on a stream. * * On success, returns true. * On failure, returns false and sets error. * reply is always initialized. */ static bool _run_command(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_t *command, bson_t *reply, bson_error_t *error) { mongoc_cmd_parts_t parts; mongoc_server_stream_t *server_stream; bool ret; mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_NONE /* unused for OP_MSG */, command); /* Drivers must not append session ids to auth commands per sessions spec. */ parts.prohibit_lsid = true; server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); mc_tpld_drop_ref(&td); ret = mongoc_cluster_run_command_parts(cluster, server_stream, &parts, reply, error); mongoc_server_stream_cleanup(server_stream); return ret; } /* * Utility function to parse out a server reply's payload. * * Given a server reply like { ok: 1, payload: , ... } parse out the * payload into a bson_t. * On success, returns true. * On failure, returns false and sets error. * payload is always initialized. */ static bool _sasl_reply_parse_payload_as_bson(const bson_t *reply, bson_t *payload, bson_error_t *error) { bson_iter_t iter; bson_subtype_t payload_subtype; const uint8_t *payload_data; uint32_t payload_len; bool ret = false; bson_init(payload); if (!bson_iter_init_find(&iter, reply, "payload") || !BSON_ITER_HOLDS_BINARY(&iter)) { AUTH_ERROR_AND_FAIL("server reply did not contain binary payload"); } bson_iter_binary(&iter, &payload_subtype, &payload_len, &payload_data); if (payload_subtype != BSON_SUBTYPE_BINARY) { AUTH_ERROR_AND_FAIL("server reply contained unexpected binary subtype"); } bson_destroy(payload); if (!bson_init_static(payload, payload_data, payload_len)) { AUTH_ERROR_AND_FAIL("server payload is invalid BSON"); } ret = true; fail: return ret; } /* * Send an HTTP request and get a response. * On success, returns true. * On failure, returns false and sets error. * headers is a \r\n delimitted list of headers (or an empty string). * http_response_body is always set, and must be freed. * http_response_headers is always set, and must be freed. This may be used for * error reporting since the response headers should not include sensitive * credentials. */ static bool _send_http_request(bool use_tls, const char *ip, int port, const char *method, const char *path, const char *headers, char **http_response_body, char **http_response_headers, bson_error_t *error) { mongoc_http_request_t req; mongoc_http_response_t res; const mlib_duration socket_timeout = mlib_duration(10, s); bool ret; mongoc_ssl_opt_t ssl_opt = {0}; *http_response_body = NULL; *http_response_headers = NULL; _mongoc_http_request_init(&req); _mongoc_http_response_init(&res); req.host = ip; req.port = port; req.method = method; req.path = path; req.extra_headers = headers; if (use_tls) { _mongoc_ssl_opts_copy_to(mongoc_ssl_opt_get_default(), &ssl_opt, true /* copy_internal */); } ret = _mongoc_http_send( &req, mlib_expires_after(socket_timeout), use_tls /* use_tls */, use_tls ? &ssl_opt : NULL, &res, error); if (ret) { *http_response_headers = bson_strndup(res.headers, res.headers_len); *http_response_body = (char *)bson_malloc0(res.body_len + 1); memcpy(*http_response_body, res.body, res.body_len); } _mongoc_http_response_cleanup(&res); _mongoc_ssl_opts_cleanup(&ssl_opt, true); return ret; } static bool _creds_empty(_mongoc_aws_credentials_t *creds) { return creds->access_key_id == NULL && creds->secret_access_key == NULL && creds->session_token == NULL; } /* * Helper to validate and possibly set credentials. * * On success, returns true. * On failure, returns false and sets error. * Caller should use _creds_empty to determine whether credentials have been * set. */ static bool _validate_and_set_creds(const char *access_key_id, const char *secret_access_key, const char *session_token, _mongoc_aws_credentials_t *creds, bson_error_t *error) { bool has_access_key_id = access_key_id && strlen(access_key_id) != 0; bool has_secret_access_key = secret_access_key && strlen(secret_access_key) != 0; bool has_session_token = session_token && strlen(session_token) != 0; bool ret = false; /* Check for invalid combinations of URI parameters. */ if (has_access_key_id && !has_secret_access_key) { AUTH_ERROR_AND_FAIL("ACCESS_KEY_ID is set, but SECRET_ACCESS_KEY is missing"); } if (!has_access_key_id && has_secret_access_key) { AUTH_ERROR_AND_FAIL("SECRET_ACCESS_KEY is set, but ACCESS_KEY_ID is missing"); } if (!has_access_key_id && !has_secret_access_key && has_session_token) { AUTH_ERROR_AND_FAIL("AWS_SESSION_TOKEN is set, but ACCESS_KEY_ID and " "SECRET_ACCESS_KEY are missing"); } creds->access_key_id = bson_strdup(access_key_id); creds->secret_access_key = bson_strdup(secret_access_key); creds->session_token = session_token ? bson_strdup(session_token) : NULL; ret = true; fail: return ret; } /* * Validate and possibly set credentials. * * On success, returns true. * On failure, returns false and sets error. * Caller should use _creds_empty to determine whether credentials have been * set. */ static bool _obtain_creds_from_uri(_mongoc_aws_credentials_t *creds, mongoc_uri_t *uri, bson_error_t *error) { bool ret = false; bson_t auth_mechanism_props; const char *uri_session_token = NULL; if (mongoc_uri_get_mechanism_properties(uri, &auth_mechanism_props)) { bson_iter_t iter; if (bson_iter_init_find_case(&iter, &auth_mechanism_props, "AWS_SESSION_TOKEN") && BSON_ITER_HOLDS_UTF8(&iter)) { uri_session_token = bson_iter_utf8(&iter, NULL); } } if (!_validate_and_set_creds( mongoc_uri_get_username(uri), mongoc_uri_get_password(uri), uri_session_token, creds, error)) { goto fail; } ret = true; fail: return ret; } static bool _obtain_creds_from_env(_mongoc_aws_credentials_t *creds, bson_error_t *error) { bool ret = false; char *env_access_key_id = NULL; char *env_secret_access_key = NULL; char *env_session_token = NULL; /* Check environment variables. */ env_access_key_id = _mongoc_getenv("AWS_ACCESS_KEY_ID"); env_secret_access_key = _mongoc_getenv("AWS_SECRET_ACCESS_KEY"); env_session_token = _mongoc_getenv("AWS_SESSION_TOKEN"); if (!_validate_and_set_creds(env_access_key_id, env_secret_access_key, env_session_token, creds, error)) { goto fail; } ret = true; fail: bson_free(env_access_key_id); bson_free(env_secret_access_key); bson_free(env_session_token); return ret; } // expiration_ms_to_timer converts milliseconds since Unix Epoch into the // mlib_timer `expiration_timer`. static bool expiration_ms_to_timer(int64_t expiration_ms, mlib_timer *expiration_timer, bson_error_t *error) { bool ret = false; mlib_duration since_unix_epoch; { struct timeval tv; if (0 != bson_gettimeofday(&tv)) { AUTH_ERROR_AND_FAIL("bson_gettimeofday returned failure. Unable to " "determine expiration."); } else { since_unix_epoch = mlib_duration((tv.tv_sec, s), plus, (tv.tv_usec, us)); } } const mlib_duration expires_in = mlib_duration((expiration_ms, ms), minus, since_unix_epoch); *expiration_timer = mlib_expires_after(expires_in, minus, MONGOC_AWS_CREDENTIALS_EXPIRATION_WINDOW); ret = true; fail: return ret; } // expiration_iso8601_to_timer parses the "Expiration" string value returned // from an ECS or EC2 response. "Expiration" is expected to be an ISO-8601 // string. Example: "2023-02-07T20:04:27Z". On success, `expiration_timer` is // set to the expiration time. static bool expiration_iso8601_to_timer(const char *expiration_str, mlib_timer *expiration_timer, bson_error_t *error) { bool ret = false; // get expiration time in milliseconds since Unix Epoch. int64_t expiration_ms; { bson_error_t json_err; bson_t date_doc; bson_iter_t date_iter; char *date_doc_str; // libbson has private API `_bson_iso8601_date_parse` to parse ISO-8601 // strings. The private API is inaccessible to libmongoc. // Create a temporary bson document with a $date to parse. date_doc_str = bson_strdup_printf("{\"Expiration\" : {\"$date\" : \"%s\"}}", expiration_str); if (!bson_init_from_json(&date_doc, date_doc_str, -1, &json_err)) { bson_free(date_doc_str); AUTH_ERROR_AND_FAIL("failed to parse Expiration: %s", json_err.message); } BSON_ASSERT(bson_iter_init_find(&date_iter, &date_doc, "Expiration")); expiration_ms = bson_iter_date_time(&date_iter); bson_free(date_doc_str); bson_destroy(&date_doc); } if (!expiration_ms_to_timer(expiration_ms, expiration_timer, error)) { goto fail; } ret = true; fail: return ret; } // generate_AWS_ROLE_SESSION_NAME generates a 16 byte hex string (32 characters) // to use as the AWS_ROLE_SESSION_NAME. static char * generate_AWS_ROLE_SESSION_NAME(bson_error_t *error) { #define NUM_BYTES 16 bool ok = false; uint8_t data[NUM_BYTES]; char *out = bson_malloc(NUM_BYTES * 2 + 1); if (!_mongoc_rand_bytes(data, NUM_BYTES)) { AUTH_ERROR_AND_FAIL("unable to generate random bytes for AWS_ROLE_SESSION_NAME"); } size_t i; for (i = 0; i < NUM_BYTES; i++) { // Expect no truncation. int req = bson_snprintf(out + (2 * i), 3, "%02x", data[i]); BSON_ASSERT(req < 3); } out[NUM_BYTES * 2] = '\0'; ok = true; fail: if (!ok) { bson_free(out); out = NULL; } return out; #undef NUM_BYTES } static bool _obtain_creds_from_ecs(_mongoc_aws_credentials_t *creds, bson_error_t *error) { bool ret = false; char *http_response_headers = NULL; char *http_response_body = NULL; char *relative_ecs_uri = NULL; bson_t *response_json = NULL; bson_iter_t iter; const char *ecs_access_key_id = NULL; const char *ecs_secret_access_key = NULL; const char *ecs_session_token = NULL; bson_error_t http_error; relative_ecs_uri = _mongoc_getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"); if (!relative_ecs_uri || strlen(relative_ecs_uri) == 0) { bson_free(relative_ecs_uri); return true; } if (!_send_http_request(false /* use_tls */, "169.254.170.2", 80, "GET", relative_ecs_uri, "", &http_response_body, &http_response_headers, &http_error)) { AUTH_ERROR_AND_FAIL("failed to contact ECS link local server: %s", http_error.message); } response_json = bson_new_from_json((const uint8_t *)http_response_body, strlen(http_response_body), error); if (!response_json) { AUTH_ERROR_AND_FAIL("invalid JSON in ECS response. Response headers: %s", http_response_headers); } if (bson_iter_init_find_case(&iter, response_json, "AccessKeyId") && BSON_ITER_HOLDS_UTF8(&iter)) { ecs_access_key_id = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "SecretAccessKey") && BSON_ITER_HOLDS_UTF8(&iter)) { ecs_secret_access_key = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "Token") && BSON_ITER_HOLDS_UTF8(&iter)) { ecs_session_token = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "Expiration") && BSON_ITER_HOLDS_UTF8(&iter)) { if (!expiration_iso8601_to_timer(bson_iter_utf8(&iter, NULL), &creds->expiration.value, error)) { goto fail; } creds->expiration.set = true; } if (!_validate_and_set_creds(ecs_access_key_id, ecs_secret_access_key, ecs_session_token, creds, error)) { goto fail; } ret = true; fail: bson_destroy(response_json); bson_free(http_response_headers); bson_free(http_response_body); bson_free(relative_ecs_uri); return ret; } static bool _obtain_creds_from_assumerolewithwebidentity(_mongoc_aws_credentials_t *creds, bson_error_t *error) { bool ret = false; char *http_response_headers = NULL; char *http_response_body = NULL; char *aws_web_identity_token_file = NULL; char *aws_role_arn = NULL; char *aws_role_session_name = NULL; bson_t *response_bson = NULL; bson_iter_t iter; const char *access_key_id = NULL; const char *secret_access_key = NULL; const char *session_token = NULL; bson_error_t http_error; mongoc_stream_t *fstream = NULL; mcommon_string_t *token_file_contents = NULL; char *path_and_query = NULL; aws_web_identity_token_file = _mongoc_getenv("AWS_WEB_IDENTITY_TOKEN_FILE"); aws_role_arn = _mongoc_getenv("AWS_ROLE_ARN"); if (!aws_web_identity_token_file || strlen(aws_web_identity_token_file) == 0 || !aws_role_arn || strlen(aws_role_arn) == 0) { bson_free(aws_role_arn); bson_free(aws_web_identity_token_file); // Not an error. May need to obtain credentials another way. return true; } aws_role_session_name = _mongoc_getenv("AWS_ROLE_SESSION_NAME"); if (!aws_role_session_name) { aws_role_session_name = generate_AWS_ROLE_SESSION_NAME(error); if (!aws_role_session_name) { goto fail; } } // Read the contents of the file given by ``AWS_WEB_IDENTITY_TOKEN_FILE``. { fstream = mongoc_stream_file_new_for_path(aws_web_identity_token_file, O_RDONLY, 0); if (!fstream) { AUTH_ERROR_AND_FAIL( "failed to open AWS_WEB_IDENTITY_TOKEN_FILE: %s. Reason: %s", aws_web_identity_token_file, strerror(errno)); } mcommon_string_append_t append; mcommon_string_new_as_append(&append); for (;;) { char buf[128]; ssize_t got = mongoc_stream_read(fstream, buf, sizeof(buf) - 1 /* leave space for null terminator */, 0 /* min_bytes */, 0 /* timeout_msec. Unused for file stream. */); if (got > 0) { mcommon_string_append_bytes(&append, (const char *)buf, (uint32_t)got); } else if (got == 0) { // EOF. break; } else { mcommon_string_destroy(mcommon_string_from_append(&append)); AUTH_ERROR_AND_FAIL("failed to read AWS_WEB_IDENTITY_TOKEN_FILE: %s. Reason: %s", aws_web_identity_token_file, strerror(errno)); } } token_file_contents = mcommon_string_from_append(&append); } path_and_query = bson_strdup_printf("/?Action=AssumeRoleWithWebIdentity" "&RoleSessionName=%s" "&RoleArn=%s" "&WebIdentityToken=%s&Version=2011-06-15", aws_role_session_name, aws_role_arn, token_file_contents->str); // send an HTTP request to sts.amazonaws.com. if (!_send_http_request(true /* use_tls */, "sts.amazonaws.com", 443, "POST", path_and_query, "Accept: application/json\r\n", &http_response_body, &http_response_headers, &http_error)) { AUTH_ERROR_AND_FAIL("failed to contact sts.amazonaws.com: %s", http_error.message); } response_bson = bson_new_from_json((const uint8_t *)http_response_body, strlen(http_response_body), error); if (!response_bson) { AUTH_ERROR_AND_FAIL("invalid JSON in response from sts.amazonaws.com. " "Response headers: %s", http_response_headers); } if (!bson_iter_init(&iter, response_bson)) { AUTH_ERROR_AND_FAIL("failed to initialize BSON iterator to response: %s", http_response_body); } // If the response contains "Error", return only the "Error" document. // Do not include http_response_body in subsequent errors to limit risk of // including credentials in error messages. bson_iter_t Error_iter; if (bson_iter_init_find(&Error_iter, response_bson, "Error")) { bson_t Error_bson; if (!_mongoc_iter_document_as_bson(&Error_iter, &Error_bson, error)) { goto fail; } char *Error_json = bson_as_relaxed_extended_json(&Error_bson, NULL); _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Response to AssumeRoleWithWebIdentity contains 'Error': %s", Error_json); bson_free(Error_json); goto fail; } bson_iter_t Credentials_iter; if (!bson_iter_find_descendant(&iter, "AssumeRoleWithWebIdentityResponse.AssumeRoleWithWebIdentityResult." "Credentials", &iter)) { AUTH_ERROR_AND_FAIL("did not find " "AssumeRoleWithWebIdentityResponse.AssumeRoleWithWebIdentityResult." "Credentials in response from sts.amazonaws.com."); } if (!bson_iter_recurse(&iter, &Credentials_iter)) { AUTH_ERROR_AND_FAIL("Unable to recurse in Credentials in response from sts.amazonaws.com"); } iter = Credentials_iter; if (bson_iter_find(&iter, "AccessKeyId") && BSON_ITER_HOLDS_UTF8(&iter)) { access_key_id = bson_iter_utf8(&iter, NULL); } else { AUTH_ERROR_AND_FAIL("did not find AccessKeyId in response from sts.amazonaws.com"); } iter = Credentials_iter; if (bson_iter_find(&iter, "SecretAccessKey") && BSON_ITER_HOLDS_UTF8(&iter)) { secret_access_key = bson_iter_utf8(&iter, NULL); } else { AUTH_ERROR_AND_FAIL("did not find SecretAccessKey in response from sts.amazonaws.com"); } iter = Credentials_iter; if (bson_iter_find(&iter, "SessionToken") && BSON_ITER_HOLDS_UTF8(&iter)) { session_token = bson_iter_utf8(&iter, NULL); } else { AUTH_ERROR_AND_FAIL("did not find SessionToken in response from sts.amazonaws.com"); } iter = Credentials_iter; if (bson_iter_find(&iter, "Expiration") && BSON_ITER_HOLDS_DOUBLE(&iter)) { // "Expiration" is returned as a double representing the number of seconds // since Unix Epoch. This differs from the ISO-8601 string returned in EC2 // and ECS responses. int64_t expiration_ms = (int64_t)(1000.0 * bson_iter_double(&iter)); if (!expiration_ms_to_timer(expiration_ms, &creds->expiration.value, error)) { goto fail; } creds->expiration.set = true; } else { AUTH_ERROR_AND_FAIL("did not find Expiration in response from sts.amazonaws.com"); } if (!_validate_and_set_creds(access_key_id, secret_access_key, session_token, creds, error)) { goto fail; } ret = true; fail: bson_free(path_and_query); bson_destroy(response_bson); bson_free(http_response_headers); bson_free(http_response_body); mcommon_string_destroy(token_file_contents); mongoc_stream_destroy(fstream); bson_free(aws_role_session_name); bson_free(aws_role_arn); bson_free(aws_web_identity_token_file); return ret; } static bool _obtain_creds_from_ec2(_mongoc_aws_credentials_t *creds, bson_error_t *error) { bool ret = false; char *http_response_headers = NULL; char *http_response_body = NULL; char *token_header = NULL; char *token = NULL; char *role_name = NULL; char *relative_ecs_uri = NULL; char *path_with_role = NULL; bson_t *response_json = NULL; bson_iter_t iter; const char *ec2_access_key_id = NULL; const char *ec2_secret_access_key = NULL; const char *ec2_session_token = NULL; bson_error_t http_error; const char *ip = "169.254.169.254"; /* Get the token. */ if (!_send_http_request(false /* use_tls */, ip, 80, "PUT", "/latest/api/token", "X-aws-ec2-metadata-token-ttl-seconds: 30\r\n", &token, &http_response_headers, &http_error)) { AUTH_ERROR_AND_FAIL("failed to contact EC2 link local server: %s", http_error.message); } if (0 == strlen(token)) { AUTH_ERROR_AND_FAIL("unable to retrieve token from EC2 metadata. Headers: %s", http_response_headers); } bson_free(http_response_headers); http_response_headers = NULL; token_header = bson_strdup_printf("X-aws-ec2-metadata-token: %s\r\n", token); /* Get the role name. */ if (!_send_http_request(false /* use_tls */, ip, 80, "GET", "/latest/meta-data/iam/security-credentials/", token_header, &role_name, &http_response_headers, &http_error)) { AUTH_ERROR_AND_FAIL("failed to contact EC2 link local server: %s", http_error.message); } if (0 == strlen(role_name)) { AUTH_ERROR_AND_FAIL("unable to retrieve role_name from EC2 metadata. Headers: %s", http_response_headers); } /* Get the creds. */ path_with_role = bson_strdup_printf("/latest/meta-data/iam/security-credentials/%s", role_name); bson_free(http_response_headers); http_response_headers = NULL; if (!_send_http_request(false /* use_tls */, ip, 80, "GET", path_with_role, token_header, &http_response_body, &http_response_headers, &http_error)) { AUTH_ERROR_AND_FAIL("failed to contact EC2 link local server: %s", http_error.message); } response_json = bson_new_from_json((const uint8_t *)http_response_body, strlen(http_response_body), error); if (!response_json) { AUTH_ERROR_AND_FAIL("invalid JSON in EC2 response. Response headers: %s", http_response_headers); } if (bson_iter_init_find_case(&iter, response_json, "AccessKeyId") && BSON_ITER_HOLDS_UTF8(&iter)) { ec2_access_key_id = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "SecretAccessKey") && BSON_ITER_HOLDS_UTF8(&iter)) { ec2_secret_access_key = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "Token") && BSON_ITER_HOLDS_UTF8(&iter)) { ec2_session_token = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, response_json, "Expiration") && BSON_ITER_HOLDS_UTF8(&iter)) { if (!expiration_iso8601_to_timer(bson_iter_utf8(&iter, NULL), &creds->expiration.value, error)) { goto fail; } creds->expiration.set = true; } if (!_validate_and_set_creds(ec2_access_key_id, ec2_secret_access_key, ec2_session_token, creds, error)) { goto fail; } ret = true; fail: bson_destroy(response_json); bson_free(http_response_headers); bson_free(http_response_body); bson_free(token); bson_free(role_name); bson_free(token_header); bson_free(relative_ecs_uri); bson_free(path_with_role); return ret; } /* * Attempt to obtain AWS credentials. * * Credentials may be passed in multiple ways. The precedence is as follows: * 1. Username/password in the URI (and authMechanismProperty for session token) * 2. From environment variables. * 3. From querying the ECS local HTTP server. * 4. From querying the EC2 local HTTP server. * * On success, returns true. * On failure, returns false and sets error. */ bool _mongoc_aws_credentials_obtain(mongoc_uri_t *uri, _mongoc_aws_credentials_t *creds, bson_error_t *error) { bool ret = false; BSON_ASSERT_PARAM(creds); *creds = MONGOC_AWS_CREDENTIALS_INIT; // Check cache before enviroment variables. This is required by the // specification: "Even if the environment variables are present in // subsequent authorization attempts, the driver MUST use the cached // credentials" if (_mongoc_aws_credentials_cache_get(creds)) { goto succeed; } if (uri) { TRACE("%s", "checking URI for credentials"); if (!_obtain_creds_from_uri(creds, uri, error)) { goto fail; } if (!_creds_empty(creds)) { goto succeed; } } TRACE("%s", "checking environment variables for credentials"); if (!_obtain_creds_from_env(creds, error)) { goto fail; } if (!_creds_empty(creds)) { goto succeed; } // Try to fetch credentials from cacheable sources: // AssumeRoleWithWebIdentity, ECS or EC2. Lock the cache to prevent duplicate // requests. { _mongoc_aws_credentials_cache_lock(); // Check again if credentials have been cached. if (_mongoc_aws_credentials_cache_get_nolock(creds)) { _mongoc_aws_credentials_cache_unlock(); goto succeed; } TRACE("%s", "checking AssumeRoleWithWebIdentity for credentials"); if (!_obtain_creds_from_assumerolewithwebidentity(creds, error)) { _mongoc_aws_credentials_cache_unlock(); goto fail; } if (!_creds_empty(creds)) { if (creds->expiration.set) { // Only try to cache credentials if an expiration time is included. _mongoc_aws_credentials_cache_put_nolock(creds); } _mongoc_aws_credentials_cache_unlock(); goto succeed; } TRACE("%s", "checking ECS metadata for credentials"); if (!_obtain_creds_from_ecs(creds, error)) { _mongoc_aws_credentials_cache_unlock(); goto fail; } if (!_creds_empty(creds)) { if (creds->expiration.set) { // Only try to cache credentials if an expiration time is included. _mongoc_aws_credentials_cache_put_nolock(creds); } _mongoc_aws_credentials_cache_unlock(); goto succeed; } TRACE("%s", "checking EC2 metadata for credentials"); if (!_obtain_creds_from_ec2(creds, error)) { _mongoc_aws_credentials_cache_unlock(); goto fail; } if (!_creds_empty(creds)) { if (creds->expiration.set) { // Only try to cache credentials if an expiration time is included. _mongoc_aws_credentials_cache_put_nolock(creds); } _mongoc_aws_credentials_cache_unlock(); goto succeed; } _mongoc_aws_credentials_cache_unlock(); } AUTH_ERROR_AND_FAIL("unable to get credentials\n"); succeed: ret = true; fail: return ret; } /* * Validate the STS host returned by the server and derive the region. * * On success, returns true. * On failure, returns false and sets error. * region is always set and must be freed by caller. */ bool _mongoc_validate_and_derive_region(char *sts_fqdn, size_t sts_fqdn_len, char **region, bson_error_t *error) { bool ret = false; char *ptr; char *ptr_prev; char *second_part = NULL; /* Default to us-east-1. */ *region = bson_strdup("us-east-1"); /* Drivers must also validate that the host is greater than 0 and less than * or equal to 255 bytes per RFC 1035 */ if (sts_fqdn_len == 0u) { AUTH_ERROR_AND_FAIL("invalid STS host: empty"); } if (sts_fqdn_len > 255u) { AUTH_ERROR_AND_FAIL("invalid STS host: too large"); } /* If sts.amazonaws.com, then use default region. */ if (0 == bson_strcasecmp("sts.amazonaws.com", sts_fqdn)) { goto succeed; } /* Drivers MUST reject FQDN names with empty labels, e.g., "abc..def" */ ptr_prev = sts_fqdn; ptr = strstr(sts_fqdn, "."); if (ptr) { second_part = ptr + 1; } if (0 == ptr - sts_fqdn) { AUTH_ERROR_AND_FAIL("invalid STS host: empty part"); } while (ptr) { if (1 == ptr - ptr_prev) { AUTH_ERROR_AND_FAIL("invalid STS host: empty part"); } ptr_prev = ptr; ptr = strstr(ptr + 1, "."); } if (strlen(ptr_prev + 1) == 0) { AUTH_ERROR_AND_FAIL("invalid STS host: empty part"); } if (second_part) { char *second_part_end; second_part_end = strstr(second_part, "."); bson_free(*region); if (!second_part_end) { *region = bson_strdup(second_part); } else { *region = bson_strndup(second_part, second_part_end - second_part); } } succeed: ret = true; fail: return ret; } /* -------------------------------------------------------------------------- * Step 1 * -------------------------------------------------------------------------- * Client sends BSON payload: * { * "r": <32 byte client nonce>, * "p": 110 * } * Server responds with BSON payload: * { * "s": <32 byte client nonce + 32 byte server nonce>, * "h": * } * * Payloads are wrapped in SASL commands. The command a client sends is like: * { "saslStart": 1, "mechanism": "MONGODB-AWS", "payload": } * And similar for server responses: * { "ok": 1, "conversationId": 1, "done": false, "payload": } * * On success, returns true. * On failure, returns false and sets error. * -------------------------------------------------------------------------- */ static bool _client_first(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, uint8_t *server_nonce, char **sts_fqdn, char **region, int *conv_id, bson_error_t *error) { bool ret = false; uint8_t client_nonce[32]; bson_t client_payload = BSON_INITIALIZER; bson_t client_command = BSON_INITIALIZER; bson_t server_payload = BSON_INITIALIZER; bson_t server_reply = BSON_INITIALIZER; bson_iter_t iter; bson_subtype_t reply_nonce_subtype; const uint8_t *reply_nonce_data; uint32_t reply_nonce_len; uint32_t sts_fqdn_len; /* Reset out params. */ memset(server_nonce, 0, 32); *sts_fqdn = NULL; *region = NULL; *conv_id = 0; #ifdef MONGOC_ENABLE_CRYPTO /* Generate secure random nonce. */ if (!_mongoc_rand_bytes(client_nonce, 32)) { AUTH_ERROR_AND_FAIL("Could not generate client nonce"); } #else AUTH_ERROR_AND_FAIL("libmongoc requires a cryptography library (libcrypto, " "Common Crypto, or cng) to support MONGODB-AWS"); #endif BCON_APPEND(&client_payload, "r", BCON_BIN(BSON_SUBTYPE_BINARY, client_nonce, 32), "p", BCON_INT32(110)); BCON_APPEND(&client_command, "saslStart", BCON_INT32(1), "mechanism", "MONGODB-AWS", "payload", BCON_BIN(BSON_SUBTYPE_BINARY, bson_get_data(&client_payload), client_payload.len)); bson_destroy(&server_reply); if (!_run_command(cluster, stream, sd, &client_command, &server_reply, error)) { goto fail; } *conv_id = _mongoc_cluster_get_conversation_id(&server_reply); if (!*conv_id) { AUTH_ERROR_AND_FAIL("server reply did not contain conversationId"); } bson_destroy(&server_payload); if (!_sasl_reply_parse_payload_as_bson(&server_reply, &server_payload, error)) { goto fail; } if (!bson_iter_init_find(&iter, &server_payload, "h") || !BSON_ITER_HOLDS_UTF8(&iter)) { AUTH_ERROR_AND_FAIL("server payload did not contain string STS FQDN"); } *sts_fqdn = bson_strdup(bson_iter_utf8(&iter, &sts_fqdn_len)); if (!_mongoc_validate_and_derive_region(*sts_fqdn, sts_fqdn_len, region, error)) { goto fail; } if (!bson_iter_init_find(&iter, &server_payload, "s") || !BSON_ITER_HOLDS_BINARY(&iter)) { AUTH_ERROR_AND_FAIL("server payload did not contain nonce"); } bson_iter_binary(&iter, &reply_nonce_subtype, &reply_nonce_len, &reply_nonce_data); if (reply_nonce_len != 64) { AUTH_ERROR_AND_FAIL("server reply nonce was not 64 bytes"); } if (0 != memcmp(reply_nonce_data, client_nonce, 32)) { AUTH_ERROR_AND_FAIL("server reply nonce prefix did not match client nonce"); } /* Drivers MUST error on any additional fields */ bson_iter_init(&iter, &server_payload); while (bson_iter_next(&iter)) { const char *field; field = bson_iter_key(&iter); if (0 == strcmp(field, "h")) { continue; } if (0 == strcmp(field, "s")) { continue; } AUTH_ERROR_AND_FAIL("unexpected field from server's reply: %s", field); } memcpy(server_nonce, reply_nonce_data, 64); ret = true; fail: bson_destroy(&client_payload); bson_destroy(&client_command); bson_destroy(&server_reply); bson_destroy(&server_payload); return ret; } #define KMS_REQUEST_ADD_HEADER(key, value) \ do { \ if (!kms_request_add_header_field(request, key, value)) { \ AUTH_ERROR_AND_FAIL("Failed to add header '%s'", key); \ } \ } while (0) #define KMS_REQUEST_SET(fn, name, value) \ do { \ if (!fn(request, value)) { \ AUTH_ERROR_AND_FAIL("Failed to set %s", name); \ } \ } while (0) /* -------------------------------------------------------------------------- * Step 2 * -------------------------------------------------------------------------- * Client sends BSON payload: * { * "a": , * "d": * "t": * } * * Server responds with final result. * * On success, returns true. * On failure, returns false and sets error. * -------------------------------------------------------------------------- */ static bool _client_second(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, _mongoc_aws_credentials_t *creds, const uint8_t *server_nonce, const char *sts_fqdn, const char *region, int conv_id, bson_error_t *error) { bool ret = false; kms_request_t *request = NULL; char *signature = NULL; const char *date = NULL; const size_t server_nonce_str_len = mcommon_b64_ntop_calculate_target_size(64); char *server_nonce_str = NULL; const char *body = "Action=GetCallerIdentity&Version=2011-06-15"; bson_t client_payload = BSON_INITIALIZER; bson_t client_command = BSON_INITIALIZER; bson_t server_reply = BSON_INITIALIZER; BSON_ASSERT(cluster); BSON_ASSERT(stream); BSON_ASSERT(sd); BSON_ASSERT(creds); BSON_ASSERT(server_nonce); BSON_ASSERT(sts_fqdn); BSON_ASSERT(conv_id); BSON_ASSERT(creds->access_key_id); BSON_ASSERT(creds->secret_access_key); server_nonce_str = bson_malloc(server_nonce_str_len); request = kms_request_new("POST", "/", NULL); if (kms_request_get_error(request)) { AUTH_ERROR_AND_FAIL("Failed to create new KMS request: %s", kms_request_get_error(request)); } if (mcommon_b64_ntop(server_nonce, 64, server_nonce_str, server_nonce_str_len) == -1) { AUTH_ERROR_AND_FAIL("Failed to parse server nonce"); } if (!kms_request_append_payload(request, body, strlen(body))) { AUTH_ERROR_AND_FAIL("Failed to append payload"); } KMS_REQUEST_SET(kms_request_set_access_key_id, "access key ID", creds->access_key_id); KMS_REQUEST_SET(kms_request_set_secret_key, "secret key", creds->secret_access_key); KMS_REQUEST_SET(kms_request_set_date, "date", NULL /* use current time */); KMS_REQUEST_SET(kms_request_set_region, "region", region); KMS_REQUEST_SET(kms_request_set_service, "service", "sts"); KMS_REQUEST_ADD_HEADER("Content-Type", "application/x-www-form-urlencoded"); KMS_REQUEST_ADD_HEADER("Host", sts_fqdn); KMS_REQUEST_ADD_HEADER("X-MongoDB-Server-Nonce", server_nonce_str); KMS_REQUEST_ADD_HEADER("X-MongoDB-GS2-CB-Flag", "n"); if (creds->session_token) { KMS_REQUEST_ADD_HEADER("X-Amz-Security-Token", creds->session_token); } signature = kms_request_get_signature(request); if (kms_request_get_error(request)) { AUTH_ERROR_AND_FAIL("Failed to get signature: %s", kms_request_get_error(request)); } date = kms_request_get_canonical_header(request, "X-Amz-Date"); if (kms_request_get_error(request)) { AUTH_ERROR_AND_FAIL("Failed to get canonical header: %s", kms_request_get_error(request)); } BCON_APPEND(&client_payload, "a", BCON_UTF8(signature), "d", BCON_UTF8(date)); if (creds->session_token) { BCON_APPEND(&client_payload, "t", BCON_UTF8(creds->session_token)); } BCON_APPEND(&client_command, "saslContinue", BCON_INT32(1), "conversationId", BCON_INT32(conv_id), "payload", BCON_BIN(BSON_SUBTYPE_BINARY, bson_get_data(&client_payload), client_payload.len)); bson_destroy(&server_reply); if (!_run_command(cluster, stream, sd, &client_command, &server_reply, error)) { goto fail; } ret = true; fail: bson_destroy(&client_payload); bson_destroy(&client_command); bson_destroy(&server_reply); kms_request_destroy(request); bson_free(signature); bson_free(server_nonce_str); return ret; } bool _mongoc_cluster_auth_node_aws(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { bool ret = false; uint8_t server_nonce[64]; char *sts_fqdn = NULL; char *region = NULL; int conv_id = 0; _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; if (!_mongoc_aws_credentials_obtain(cluster->client->uri, &creds, error)) { goto fail; } if (!_client_first(cluster, stream, sd, server_nonce, &sts_fqdn, ®ion, &conv_id, error)) { goto fail; } if (!_client_second(cluster, stream, sd, &creds, server_nonce, sts_fqdn, region, conv_id, error)) { goto fail; } ret = true; fail: if (!ret) { _mongoc_aws_credentials_cache_clear(); } _mongoc_aws_credentials_cleanup(&creds); bson_free(sts_fqdn); bson_free(region); return ret; } #else bool _mongoc_cluster_auth_node_aws(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { AUTH_ERROR_AND_FAIL("AWS auth not supported, configure libmongoc with " "ENABLE_MONGODB_AWS_AUTH=ON"); fail: return false; } bool _mongoc_aws_credentials_obtain(mongoc_uri_t *uri, _mongoc_aws_credentials_t *creds, bson_error_t *error) { AUTH_ERROR_AND_FAIL("AWS auth not supported, configure libmongoc with " "ENABLE_MONGODB_AWS_AUTH=ON"); fail: return false; } bool _mongoc_validate_and_derive_region(char *sts_fqdn, size_t sts_fqdn_len, char **region, bson_error_t *error) { AUTH_ERROR_AND_FAIL("AWS auth not supported, configure libmongoc with " "ENABLE_MONGODB_AWS_AUTH=ON"); fail: return false; } #endif /* MONGOC_ENABLE_MONGODB_AWS_AUTH */ void _mongoc_aws_credentials_cleanup(_mongoc_aws_credentials_t *creds) { bson_free(creds->access_key_id); bson_free(creds->secret_access_key); bson_free(creds->session_token); } void _mongoc_aws_credentials_copy_to(const _mongoc_aws_credentials_t *src, _mongoc_aws_credentials_t *dst) { BSON_ASSERT_PARAM(src); BSON_ASSERT_PARAM(dst); dst->access_key_id = bson_strdup(src->access_key_id); dst->secret_access_key = bson_strdup(src->secret_access_key); dst->session_token = bson_strdup(src->session_token); dst->expiration = src->expiration; } _mongoc_aws_credentials_cache_t mongoc_aws_credentials_cache; void _mongoc_aws_credentials_cache_init(void) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; bson_mutex_init(&cache->mutex); } static bool check_expired(const _mongoc_aws_credentials_t *creds) { if (!creds->expiration.set) { return true; } return mlib_timer_is_expired(creds->expiration.value); } void _mongoc_aws_credentials_cache_lock(void) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; bson_mutex_lock(&cache->mutex); } void _mongoc_aws_credentials_cache_unlock(void) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; bson_mutex_unlock(&cache->mutex); } void _mongoc_aws_credentials_cache_put_nolock(const _mongoc_aws_credentials_t *creds) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; BSON_ASSERT_PARAM(creds); if (check_expired(creds)) { // Do not add expired credentials. return; } _mongoc_aws_credentials_cache_clear_nolock(); _mongoc_aws_credentials_copy_to(creds, &cache->cached.value); cache->cached.set = true; } void _mongoc_aws_credentials_cache_put(const _mongoc_aws_credentials_t *creds) { _mongoc_aws_credentials_cache_lock(); _mongoc_aws_credentials_cache_put_nolock(creds); _mongoc_aws_credentials_cache_unlock(); } bool _mongoc_aws_credentials_cache_get_nolock(_mongoc_aws_credentials_t *creds) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; BSON_ASSERT_PARAM(creds); bool found_valid = false; bool expired = false; if (cache->cached.set) { expired = check_expired(&cache->cached.value); if (!expired) { found_valid = true; _mongoc_aws_credentials_copy_to(&cache->cached.value, creds); } } if (expired) { _mongoc_aws_credentials_cache_clear_nolock(); return false; } return found_valid; } bool _mongoc_aws_credentials_cache_get(_mongoc_aws_credentials_t *creds) { _mongoc_aws_credentials_cache_lock(); bool got = _mongoc_aws_credentials_cache_get_nolock(creds); _mongoc_aws_credentials_cache_unlock(); return got; } void _mongoc_aws_credentials_cache_clear_nolock(void) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; if (cache->cached.set) { _mongoc_aws_credentials_cleanup(&cache->cached.value); } cache->cached.set = false; } void _mongoc_aws_credentials_cache_clear(void) { _mongoc_aws_credentials_cache_lock(); _mongoc_aws_credentials_cache_clear_nolock(); _mongoc_aws_credentials_cache_unlock(); } void _mongoc_aws_credentials_cache_cleanup(void) { _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; if (cache->cached.set) { _mongoc_aws_credentials_cleanup(&cache->cached.value); } bson_mutex_destroy(&cache->mutex); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-cyrus-private.h000066400000000000000000000021221511661753600271120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLUSTER_CYRUS_PRIVATE_H #define MONGOC_CLUSTER_CYRUS_PRIVATE_H #include #include #include bool _mongoc_cluster_auth_node_cyrus(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error); #endif /* MONGOC_CLUSTER_CYRUS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-cyrus.c000066400000000000000000000103051511661753600254370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SASL_CYRUS #include #include #include #include #include bool _mongoc_cluster_auth_node_cyrus(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { mongoc_cmd_parts_t parts; mongoc_cyrus_t sasl; bson_iter_t iter; bool ret = false; const char *tmpstr; /* input into cyrus */ uint8_t *inbuf = NULL; uint32_t inbuf_len = 0; /* output from cyrus */ uint8_t *outbuf = NULL; uint32_t outbuf_len = 0; mc_shared_tpld td = MC_SHARED_TPLD_NULL; bson_t cmd; bson_t reply; int conv_id = 0; mongoc_server_stream_t *server_stream; BSON_ASSERT(cluster); BSON_ASSERT(stream); if (!_mongoc_cyrus_new_from_cluster(&sasl, cluster, stream, sd->host.host, error)) { return false; } for (;;) { mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_SECONDARY_OK, &cmd); parts.prohibit_lsid = true; /* If this is the first step, input buffer is NULL. */ bson_free(outbuf); outbuf = NULL; outbuf_len = 0; if (!_mongoc_cyrus_step(&sasl, inbuf, inbuf_len, &outbuf, &outbuf_len, error)) { goto failure; } bson_init(&cmd); if (sasl.step == 1) { _mongoc_cluster_build_sasl_start(&cmd, sasl.credentials.mechanism, (const char *)outbuf, outbuf_len); } else { _mongoc_cluster_build_sasl_continue(&cmd, conv_id, (const char *)outbuf, outbuf_len); } TRACE("SASL: authenticating (step %d)", sasl.step); mc_tpld_renew_ref(&td, cluster->client->topology); server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); if (!mongoc_cmd_parts_assemble(&parts, server_stream, error)) { mongoc_server_stream_cleanup(server_stream); bson_destroy(&cmd); goto failure; } if (!mongoc_cluster_run_command_private(cluster, &parts.assembled, &reply, error)) { mongoc_server_stream_cleanup(server_stream); bson_destroy(&cmd); bson_destroy(&reply); goto failure; } mongoc_server_stream_cleanup(server_stream); bson_destroy(&cmd); if (bson_iter_init_find(&iter, &reply, "done") && bson_iter_as_bool(&iter)) { bson_destroy(&reply); break; } conv_id = _mongoc_cluster_get_conversation_id(&reply); if (!bson_iter_init_find(&iter, &reply, "payload") || !BSON_ITER_HOLDS_UTF8(&iter)) { MONGOC_DEBUG("SASL: authentication failed"); bson_destroy(&reply); _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Received invalid SASL reply from MongoDB server."); goto failure; } tmpstr = bson_iter_utf8(&iter, &inbuf_len); bson_free(inbuf); /* include the trailing NULL byte, since base64 decoding expects a NULL * terminates string. */ inbuf = bson_malloc(inbuf_len + 1); memcpy(inbuf, tmpstr, inbuf_len + 1); bson_destroy(&reply); mongoc_cmd_parts_cleanup(&parts); } TRACE("%s", "SASL: authenticated"); ret = true; failure: bson_free(inbuf); bson_free(outbuf); _mongoc_cyrus_destroy(&sasl); mongoc_cmd_parts_cleanup(&parts); mc_tpld_drop_ref(&td); return ret; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-oidc-private.h000066400000000000000000000032761511661753600266760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_CLUSTER_OIDC_PRIVATE_H #define MONGOC_CLUSTER_OIDC_PRIVATE_H #include #include #include struct _mongoc_cluster_t; // Forward declare. #include bool mongoc_oidc_append_speculative_auth(const char *access_token, uint32_t server_id, bson_t *cmd, bson_error_t *error); bool _mongoc_cluster_auth_node_oidc(struct _mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *conn_cache, const mongoc_server_description_t *sd, bson_error_t *error); bool _mongoc_cluster_reauth_node_oidc(struct _mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *conn_cache, const mongoc_server_description_t *sd, bson_error_t *error); #endif /* MONGOC_CLUSTER_OIDC_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-oidc.c000066400000000000000000000146651511661753600252250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #define SET_ERROR(...) _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, __VA_ARGS__) bool mongoc_oidc_append_speculative_auth(const char *access_token, uint32_t server_id, bson_t *cmd, bson_error_t *error) { BSON_ASSERT_PARAM(access_token); BSON_ASSERT_PARAM(cmd); BSON_OPTIONAL_PARAM(error); bool ok = false; // Build `saslStart` command: { bsonBuildDecl(jwt_doc, kv("jwt", cstr(access_token))); if (bsonBuildError) { SET_ERROR("BSON error: %s", bsonBuildError); goto fail; } bson_init(cmd); bsonBuild(*cmd, kv("saslStart", int32(1)), kv("mechanism", cstr("MONGODB-OIDC")), kv("payload", binary(BSON_SUBTYPE_BINARY, bson_get_data(&jwt_doc), jwt_doc.len)), kv("db", cstr("$external"))); if (bsonBuildError) { SET_ERROR("BSON error: %s", bsonBuildError); bson_destroy(&jwt_doc); goto fail; } bson_destroy(&jwt_doc); } ok = true; fail: return ok; } static bool run_sasl_start(mongoc_cluster_t *cluster, mongoc_stream_t *stream, const mongoc_server_description_t *sd, const char *access_token, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(sd); BSON_ASSERT_PARAM(access_token); BSON_OPTIONAL_PARAM(error); mongoc_server_stream_t *server_stream = NULL; bson_t cmd = BSON_INITIALIZER; bson_t reply = BSON_INITIALIZER; bool ok = false; // Build `saslStart` command: { bsonBuildDecl(jwt_doc, kv("jwt", cstr(access_token))); if (bsonBuildError) { SET_ERROR("BSON error: %s", bsonBuildError); goto fail; } bsonBuild(cmd, kv("saslStart", int32(1)), kv("mechanism", cstr("MONGODB-OIDC")), kv("payload", binary(BSON_SUBTYPE_BINARY, bson_get_data(&jwt_doc), jwt_doc.len))); if (bsonBuildError) { SET_ERROR("BSON error: %s", bsonBuildError); bson_destroy(&jwt_doc); goto fail; } bson_destroy(&jwt_doc); } // Send command: { mongoc_cmd_parts_t parts; mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_NONE /* unused for OP_MSG */, &cmd); parts.prohibit_lsid = true; // Do not append session ids to auth commands per session spec. server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); mc_tpld_drop_ref(&td); if (!mongoc_cluster_run_command_parts(cluster, server_stream, &parts, &reply, error)) { goto fail; } } // Expect successful reply to include `done: true`: { bsonParse(reply, require(allOf(key("done"), isTrue), nop)); if (bsonParseError) { SET_ERROR("Error in OIDC reply: %s", bsonParseError); goto fail; } } ok = true; fail: bson_destroy(&reply); mongoc_server_stream_cleanup(server_stream); bson_destroy(&cmd); return ok; } bool _mongoc_cluster_auth_node_oidc(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *conn_cache, const mongoc_server_description_t *sd, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(sd); BSON_ASSERT_PARAM(error); bool ok = false; char *access_token = NULL; bool is_cache = false; access_token = mongoc_oidc_cache_get_token(cluster->client->topology->oidc_cache, &is_cache, error); if (!access_token) { goto done; } if (is_cache) { mongoc_oidc_connection_cache_set(conn_cache, access_token); if (!run_sasl_start(cluster, stream, sd, access_token, error)) { if (error->code != MONGOC_SERVER_ERR_AUTHENTICATION) { goto done; } // Retry getting the access token once: mongoc_oidc_cache_invalidate_token(cluster->client->topology->oidc_cache, access_token); bson_free(access_token); access_token = mongoc_oidc_cache_get_token(cluster->client->topology->oidc_cache, &is_cache, error); } else { ok = true; goto done; } } if (!access_token) { goto done; } mongoc_oidc_connection_cache_set(conn_cache, access_token); if (!run_sasl_start(cluster, stream, sd, access_token, error)) { goto done; } ok = true; done: bson_free(access_token); return ok; } bool _mongoc_cluster_reauth_node_oidc(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *oidc_connection_cache, const mongoc_server_description_t *sd, bson_error_t *error) { char *connection_cached_token = mongoc_oidc_connection_cache_get(oidc_connection_cache); if (connection_cached_token) { // Invalidate shared cache: mongoc_oidc_cache_invalidate_token(cluster->client->topology->oidc_cache, connection_cached_token); // Does nothing if token was already invalidated. // Clear connection cached: mongoc_oidc_connection_cache_set(oidc_connection_cache, NULL); } bson_free(connection_cached_token); return _mongoc_cluster_auth_node_oidc(cluster, stream, oidc_connection_cache, sd, error); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-private.h000066400000000000000000000237131511661753600257600ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLUSTER_PRIVATE_H #define MONGOC_CLUSTER_PRIVATE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_cluster_node_t { mongoc_stream_t *stream; char *connection_address; /* handshake_sd is a server description created from the handshake on the * stream. */ mongoc_server_description_t *handshake_sd; mongoc_oidc_connection_cache_t *oidc_connection_cache; } mongoc_cluster_node_t; typedef struct _mongoc_cluster_t { int64_t operation_id; int32_t request_id; int32_t sockettimeoutms; int32_t socketcheckintervalms; mongoc_uri_t *uri; unsigned requires_auth : 1; mongoc_client_t *client; mongoc_set_t *nodes; mongoc_array_t iov; } mongoc_cluster_t; void mongoc_cluster_init(mongoc_cluster_t *cluster, const mongoc_uri_t *uri, void *client); void mongoc_cluster_destroy(mongoc_cluster_t *cluster); void mongoc_cluster_set_sockettimeoutms(mongoc_cluster_t *cluster, int32_t sockettimeoutms); void mongoc_cluster_reset_sockettimeoutms(mongoc_cluster_t *cluster); void mongoc_cluster_disconnect_node(mongoc_cluster_t *cluster, uint32_t id); int32_t mongoc_cluster_get_max_bson_obj_size(mongoc_cluster_t *cluster); int32_t mongoc_cluster_get_max_msg_size(mongoc_cluster_t *cluster); size_t _mongoc_cluster_buffer_iovec(mongoc_iovec_t *iov, size_t iovcnt, int skip, char *buffer); bool mongoc_cluster_check_interval(mongoc_cluster_t *cluster, uint32_t server_id); bool mongoc_cluster_legacy_rpc_sendv_to_server(mongoc_cluster_t *cluster, mcd_rpc_message *rpc, mongoc_server_stream_t *server_stream, bson_error_t *error); bool mongoc_cluster_try_recv(mongoc_cluster_t *cluster, mcd_rpc_message *rpc, mongoc_buffer_t *buffer, mongoc_server_stream_t *server_stream, bson_error_t *error); /** * @brief Obtain a server stream appropriate for read operations on the * cluster. * * Returns a new stream (that must be freed) or NULL and sets an error via * `error`. * * @note The returned stream must be released via * `mongoc_server_stream_cleanup`. * * @note May add nodes and/or update the cluster's topology. */ mongoc_server_stream_t * mongoc_cluster_stream_for_reads(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, mongoc_client_session_t *cs, const mongoc_deprioritized_servers_t *ds, bson_t *reply, bson_error_t *error); /** * @brief Obtain a server stream appropriate for write operations on the * cluster. * * Returns a new stream (that must be freed) or NULL and sets an error via * `error`. * * @note The returned stream must be released via `mongoc_server_stream_cleanup` * * @note May add nodes and/or update the cluster's topology. */ mongoc_server_stream_t * mongoc_cluster_stream_for_writes(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, mongoc_client_session_t *cs, const mongoc_deprioritized_servers_t *ds, bson_t *reply, bson_error_t *error); /** * @brief Obtain a server stream appropriate for aggregate operations with * writes on the cluster. * * Returns a new stream (that must be freed) or NULL and sets an error via * `error`. * * @note The returned stream must be released via * `mongoc_server_stream_cleanup`. * * @note May add nodes and/or update the cluster's topology. */ mongoc_server_stream_t * mongoc_cluster_stream_for_aggr_with_write(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error); /** * @brief Obtain a server stream associated with the cluster node associated * with the given server ID. * * Returns a new server stream (that must be freed) or NULL and sets `error`. * * @param server_id The ID of a server in the cluster topology. * @param reconnect_ok If `true`, the server exists in the topology but is not * connected, then attempt to reconnect with the server. If `false`, then only * create a stream if the server is connected and ready. * * @note The returned stream must be released via `mongoc_server_stream_cleanup` * * @note May update the cluster's topology. */ mongoc_server_stream_t * mongoc_cluster_stream_for_server(mongoc_cluster_t *cluster, uint32_t server_id, bool reconnect_ok, mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error); bool mongoc_cluster_stream_valid(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream); bool mongoc_cluster_run_command_monitored(mongoc_cluster_t *cluster, mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error); // `mongoc_cluster_run_retryable_write` executes a write command and may apply retryable writes behavior. // `cmd->server_stream` is set to `*retry_server_stream` on retry. Otherwise, it is unmodified. // `*retry_server_stream` is set to a new stream on retry. The caller must call `mongoc_server_stream_cleanup`. // `*reply` must be uninitialized and is always initialized upon return. The caller must call `bson_destroy`. bool mongoc_cluster_run_retryable_write(mongoc_cluster_t *cluster, mongoc_cmd_t *cmd, bool is_retryable_write, mongoc_server_stream_t **retry_server_stream, bson_t *reply, bson_error_t *error); bool mongoc_cluster_run_command_parts(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream, mongoc_cmd_parts_t *parts, bson_t *reply, bson_error_t *error); bool mongoc_cluster_run_command_private(mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error); void _mongoc_cluster_build_sasl_start(bson_t *cmd, const char *mechanism, const char *buf, uint32_t buflen); void _mongoc_cluster_build_sasl_continue(bson_t *cmd, int conv_id, const char *buf, uint32_t buflen); int _mongoc_cluster_get_conversation_id(const bson_t *reply); mongoc_server_stream_t * _mongoc_cluster_create_server_stream(const mongoc_topology_description_t *td, const mongoc_server_description_t *sd, mongoc_stream_t *stream); bool _mongoc_cluster_get_auth_cmd_x509(const mongoc_uri_t *uri, bson_t *cmd /* OUT */, bson_error_t *error /* OUT */); /* Returns true if a versioned server API has been selected, otherwise returns * false. */ bool mongoc_cluster_uses_server_api(const mongoc_cluster_t *cluster); /* Returns true if load balancing mode has been selected, otherwise returns * false. */ bool mongoc_cluster_uses_loadbalanced(const mongoc_cluster_t *cluster); #ifdef MONGOC_ENABLE_CRYPTO void _mongoc_cluster_init_scram(const mongoc_cluster_t *cluster, mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo); bool _mongoc_cluster_get_auth_cmd_scram(mongoc_crypto_hash_algorithm_t algo, mongoc_scram_t *scram, bson_t *cmd /* OUT */, bson_error_t *error /* OUT */); #endif /* MONGOC_ENABLE_CRYPTO */ bool mcd_rpc_message_compress(mcd_rpc_message *rpc, int32_t compressor_id, int32_t compression_level, void **compressed_data, size_t *compressed_data_len, bson_error_t *error); bool mcd_rpc_message_decompress(mcd_rpc_message *rpc, void **data, size_t *data_len); bool mcd_rpc_message_decompress_if_necessary(mcd_rpc_message *rpc, void **data, size_t *data_len); BSON_END_DECLS #endif /* MONGOC_CLUSTER_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-sasl-private.h000066400000000000000000000021131511661753600267070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLUSTER_SASL_PRIVATE_H #define MONGOC_CLUSTER_SASL_PRIVATE_H #include #include #include bool _mongoc_cluster_auth_node_sasl(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error); #endif /* MONGOC_CLUSTER_SASL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-sasl.c000066400000000000000000000061641511661753600252440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* for size_t */ #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SASL #ifdef MONGOC_ENABLE_SASL_CYRUS #include #endif #ifdef MONGOC_ENABLE_SASL_SSPI #include #endif #endif void _mongoc_cluster_build_sasl_start(bson_t *cmd, const char *mechanism, const char *buf, uint32_t buflen) { BSON_APPEND_INT32(cmd, "saslStart", 1); BSON_APPEND_UTF8(cmd, "mechanism", mechanism); bson_append_utf8(cmd, "payload", 7, buf, buflen); BSON_APPEND_INT32(cmd, "autoAuthorize", 1); } void _mongoc_cluster_build_sasl_continue(bson_t *cmd, int conv_id, const char *buf, uint32_t buflen) { BSON_APPEND_INT32(cmd, "saslContinue", 1); BSON_APPEND_INT32(cmd, "conversationId", conv_id); bson_append_utf8(cmd, "payload", 7, buf, buflen); } int _mongoc_cluster_get_conversation_id(const bson_t *reply) { bson_iter_t iter; if (bson_iter_init_find(&iter, reply, "conversationId") && BSON_ITER_HOLDS_INT32(&iter)) { return bson_iter_int32(&iter); } return 0; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_node_sasl -- * * Perform authentication for a cluster node using SASL. This is * only supported for GSSAPI at the moment. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * error may be set. * *-------------------------------------------------------------------------- */ bool _mongoc_cluster_auth_node_sasl(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { #ifndef MONGOC_ENABLE_SASL _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "The GSSAPI authentication mechanism requires libmongoc " "built with ENABLE_SASL"); return false; #elif defined(MONGOC_ENABLE_SASL_CYRUS) return _mongoc_cluster_auth_node_cyrus(cluster, stream, sd, error); #elif defined(MONGOC_ENABLE_SASL_SSPI) return _mongoc_cluster_auth_node_sspi(cluster, stream, sd, error); #endif } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-sspi-private.h000066400000000000000000000021131511661753600267230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CLUSTER_SSPI_PRIVATE_H #define MONGOC_CLUSTER_SSPI_PRIVATE_H #include #include #include bool _mongoc_cluster_auth_node_sspi(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error); #endif /* MONGOC_CLUSTER_SSPI_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster-sspi.c000066400000000000000000000175511511661753600252620ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SASL_SSPI #include #include #include #include #include #include #include static mongoc_sspi_client_state_t * _mongoc_cluster_sspi_new(mongoc_uri_t *uri, mongoc_stream_t *stream, const char *hostname) { WCHAR *service; /* L"serviceName@hostname@REALM" */ const char *service_name = "mongodb"; ULONG flags = ISC_REQ_MUTUAL_AUTH; const char *service_realm = NULL; char *service_ascii = NULL; mongoc_sspi_client_state_t *state; size_t service_ascii_len; size_t tmp_creds_len; bson_t properties; bson_iter_t iter; char real_name[BSON_HOST_NAME_MAX + 1]; int service_len; WCHAR *pass = NULL; WCHAR *user = NULL; size_t user_len = 0; size_t pass_len = 0; int res; state = (mongoc_sspi_client_state_t *)bson_malloc0(sizeof *state); _mongoc_sasl_set_properties(&state->sasl, uri); if (state->sasl.canonicalize_host_name && _mongoc_sasl_get_canonicalized_name(stream, real_name, sizeof real_name)) { hostname = real_name; } /* service realm is an SSPI-specific feature */ if (mongoc_uri_get_mechanism_properties(uri, &properties) && bson_iter_init_find_case(&iter, &properties, "SERVICE_REALM") && BSON_ITER_HOLDS_UTF8(&iter)) { service_realm = bson_iter_utf8(&iter, NULL); service_ascii = bson_strdup_printf("%s@%s@%s", service_name, hostname, service_realm); } else { service_ascii = bson_strdup_printf("%s@%s", service_name, hostname); } service_ascii_len = strlen(service_ascii); /* this is donated to the sspi */ service = BSON_ARRAY_ALLOC0((service_ascii_len + 1), WCHAR); service_len = MultiByteToWideChar(CP_UTF8, 0, service_ascii, (int)service_ascii_len, service, (int)service_ascii_len); service[service_len] = L'\0'; bson_free(service_ascii); if (state->sasl.pass) { tmp_creds_len = strlen(state->sasl.pass); /* this is donated to the sspi */ pass = BSON_ARRAY_ALLOC0((tmp_creds_len + 1), WCHAR); pass_len = MultiByteToWideChar(CP_UTF8, 0, state->sasl.pass, (int)tmp_creds_len, pass, (int)tmp_creds_len); pass[pass_len] = L'\0'; } if (state->sasl.user) { tmp_creds_len = strlen(state->sasl.user); /* this is donated to the sspi */ user = BSON_ARRAY_ALLOC0((tmp_creds_len + 1), WCHAR); user_len = MultiByteToWideChar(CP_UTF8, 0, state->sasl.user, (int)tmp_creds_len, user, (int)tmp_creds_len); user[user_len] = L'\0'; } res = _mongoc_sspi_auth_sspi_client_init(service, flags, user, (ULONG)user_len, NULL, 0, pass, (ULONG)pass_len, state); if (res != MONGOC_SSPI_AUTH_GSS_ERROR) { return state; } bson_free(state); return NULL; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_node_sspi -- * * Perform authentication for a cluster node using SSPI * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * error may be set. * *-------------------------------------------------------------------------- */ bool _mongoc_cluster_auth_node_sspi(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { mongoc_cmd_parts_t parts; mongoc_sspi_client_state_t *state; SEC_CHAR *buf = NULL; bson_iter_t iter; uint32_t buflen; bson_t reply; const char *tmpstr; int conv_id = 0; bson_t cmd; int res = MONGOC_SSPI_AUTH_GSS_CONTINUE; int step; mongoc_server_stream_t *server_stream; bool ret = false; mc_shared_tpld td = MC_SHARED_TPLD_NULL; state = _mongoc_cluster_sspi_new(cluster->uri, stream, sd->host.host); if (!state) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Couldn't initialize SSPI service."); goto failure; } for (step = 0;; step++) { mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_SECONDARY_OK, &cmd); parts.prohibit_lsid = true; bson_init(&cmd); if (res == MONGOC_SSPI_AUTH_GSS_CONTINUE) { res = _mongoc_sspi_auth_sspi_client_step(state, buf); } else if (res == MONGOC_SSPI_AUTH_GSS_COMPLETE) { char *response; size_t tmp_creds_len = strlen(state->sasl.user); res = _mongoc_sspi_auth_sspi_client_unwrap(state, buf); response = bson_strdup(state->response); _mongoc_sspi_auth_sspi_client_wrap(state, response, (SEC_CHAR *)state->sasl.user, (ULONG)tmp_creds_len, 0); bson_free(response); } if (res == MONGOC_SSPI_AUTH_GSS_ERROR) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Received invalid SSPI data."); mongoc_cmd_parts_cleanup(&parts); bson_destroy(&cmd); goto failure; } if (step == 0) { _mongoc_cluster_build_sasl_start(&cmd, "GSSAPI", state->response, (uint32_t)strlen(state->response)); } else { // `conv_id` is set during step 0 below by invoking `_mongoc_cluster_get_conversation_id` and guarded by `step // > 0`. if (state->response) { _mongoc_cluster_build_sasl_continue(&cmd, conv_id, state->response, (uint32_t)strlen(state->response)); } else { _mongoc_cluster_build_sasl_continue(&cmd, conv_id, "", 0); } } mc_tpld_renew_ref(&td, cluster->client->topology); server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); if (!mongoc_cmd_parts_assemble(&parts, server_stream, error)) { mongoc_server_stream_cleanup(server_stream); mongoc_cmd_parts_cleanup(&parts); bson_destroy(&cmd); goto failure; } if (!mongoc_cluster_run_command_private(cluster, &parts.assembled, &reply, error)) { mongoc_server_stream_cleanup(server_stream); mongoc_cmd_parts_cleanup(&parts); bson_destroy(&cmd); bson_destroy(&reply); goto failure; } mongoc_server_stream_cleanup(server_stream); mongoc_cmd_parts_cleanup(&parts); bson_destroy(&cmd); if (bson_iter_init_find(&iter, &reply, "done") && bson_iter_as_bool(&iter)) { bson_destroy(&reply); break; } conv_id = _mongoc_cluster_get_conversation_id(&reply); if (!bson_iter_init_find(&iter, &reply, "payload") || !BSON_ITER_HOLDS_UTF8(&iter)) { bson_destroy(&reply); _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Received invalid SASL reply from MongoDB server."); goto failure; } tmpstr = bson_iter_utf8(&iter, &buflen); bson_free(buf); buf = BSON_ARRAY_ALLOC((buflen + 1), SEC_CHAR); memcpy(buf, tmpstr, buflen); buf[buflen] = (SEC_CHAR)0; bson_destroy(&reply); } ret = true; failure: mc_tpld_drop_ref(&td); bson_free(buf); bson_free(state); return ret; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cluster.c000066400000000000000000003660621511661753600243120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "cluster" #define CHECK_CLOSED_DURATION_MSEC 1000 #define IS_NOT_COMMAND(_name) (!!strcasecmp(cmd->command_name, _name)) static mongoc_server_stream_t * _cluster_fetch_stream_single(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bool reconnect_ok, bson_error_t *error); static mongoc_server_stream_t * _cluster_fetch_stream_pooled(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bool reconnect_ok, bson_error_t *error); static bool mongoc_cluster_run_opmsg(mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error); static void _bson_error_message_printf(bson_error_t *error, const char *format, ...) BSON_GNUC_PRINTF(2, 3); static void _handle_not_primary_error(mongoc_cluster_t *cluster, const mongoc_server_stream_t *server_stream, const bson_t *reply) { uint32_t server_id; server_id = server_stream->sd->id; if (_mongoc_topology_handle_app_error(cluster->client->topology, server_id, true /* handshake complete */, MONGOC_SDAM_APP_ERROR_COMMAND, reply, NULL, server_stream->sd->generation, &server_stream->sd->service_id)) { mongoc_cluster_disconnect_node(cluster, server_id); } } /* Called when a network error occurs on an application socket. */ static void _handle_network_error(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream, const bson_error_t *why) { mongoc_topology_t *topology; uint32_t server_id; _mongoc_sdam_app_error_type_t type; BSON_ASSERT(server_stream); ENTRY; topology = cluster->client->topology; server_id = server_stream->sd->id; type = MONGOC_SDAM_APP_ERROR_NETWORK; if (mongoc_stream_timed_out(server_stream->stream)) { type = MONGOC_SDAM_APP_ERROR_TIMEOUT; } _mongoc_topology_handle_app_error(topology, server_id, true, // handshake_complete type, NULL, why, server_stream->sd->generation, &server_stream->sd->service_id); /* Always disconnect the current connection on network error. */ mongoc_cluster_disconnect_node(cluster, server_id); EXIT; } static int32_t _compression_level_from_uri(int32_t compressor_id, const mongoc_uri_t *uri) { if (compressor_id == MONGOC_COMPRESSOR_ZLIB_ID) { return mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, -1); } return -1; } size_t _mongoc_cluster_buffer_iovec(mongoc_iovec_t *iov, size_t iovcnt, int skip, char *buffer) { size_t buffer_offset = 0; int total_iov_len = 0; size_t difference = 0; for (size_t n = 0u; n < iovcnt; n++) { BSON_ASSERT(mlib_in_range(int, iov[n].iov_len)); const int iov_len = (int)iov[n].iov_len; total_iov_len += iov_len; if (total_iov_len <= skip) { continue; } /* If this iovec starts before the skip, and takes the total count * beyond the skip, we need to figure out the portion of the iovec * we should skip passed */ const int remaining = total_iov_len - iov_len; if (remaining < skip) { difference = (size_t)(skip - remaining); } else { difference = 0u; } memcpy(buffer + buffer_offset, ((char *)iov[n].iov_base) + difference, iov[n].iov_len - difference); buffer_offset += iov[n].iov_len - difference; } return buffer_offset; } /* Allows caller to safely overwrite error->message with a formatted string, * even if the formatted string includes original error->message. */ static void _bson_error_message_printf(bson_error_t *error, const char *format, ...) { va_list args; char error_message[sizeof error->message]; if (error) { va_start(args, format); bson_vsnprintf(error_message, sizeof error->message, format, args); va_end(args); bson_strncpy(error->message, error_message, sizeof error->message); } } #define RUN_CMD_ERR_DECORATE \ do { \ _bson_error_message_printf(error, \ "Failed to send \"%s\" command with database \"%s\": %s", \ cmd->command_name, \ cmd->db_name, \ error->message); \ } while (0) #define RUN_CMD_ERR(_domain, _code, ...) \ do { \ _mongoc_set_error(error, _domain, _code, __VA_ARGS__); \ RUN_CMD_ERR_DECORATE; \ } while (0) // msgHeader consists of four int32 fields. static const int32_t message_header_length = 4u * sizeof(int32_t); static bool _mongoc_cluster_run_command_opquery_send( mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, int32_t compressor_id, mcd_rpc_message *rpc, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(error); bool ret = false; mongoc_stream_t *const stream = cmd->server_stream->stream; char *const ns = bson_strdup_printf("%s.$cmd", cmd->db_name); const int32_t request_id = ++cluster->request_id; // Find, getMore And killCursors Commands Spec: "When sending a find command // rather than a legacy OP_QUERY find, only the secondaryOk flag is honored." // For other cursor-typed commands like aggregate, only secondaryOk can be // set. Clear bits except secondaryOk; leave secondaryOk set only if it is // already. const int32_t flags = (int32_t)cmd->query_flags & MONGOC_OP_QUERY_FLAG_SECONDARY_OK; { int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(rpc, 0); message_length += mcd_rpc_header_set_request_id(rpc, request_id); message_length += mcd_rpc_header_set_response_to(rpc, 0); message_length += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_QUERY); message_length += mcd_rpc_op_query_set_flags(rpc, flags); message_length += mcd_rpc_op_query_set_full_collection_name(rpc, ns); message_length += mcd_rpc_op_query_set_number_to_skip(rpc, 0); message_length += mcd_rpc_op_query_set_number_to_return(rpc, -1); message_length += mcd_rpc_op_query_set_query(rpc, bson_get_data(cmd->command)); mcd_rpc_message_set_length(rpc, message_length); } size_t num_iovecs = 0u; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); const bool is_compressible = compressor_id != -1 && IS_NOT_COMMAND(HANDSHAKE_CMD_LEGACY_HELLO) && IS_NOT_COMMAND("hello") && IS_NOT_COMMAND("saslstart") && IS_NOT_COMMAND("saslcontinue") && IS_NOT_COMMAND("getnonce") && IS_NOT_COMMAND("authenticate") && IS_NOT_COMMAND("createuser") && IS_NOT_COMMAND("updateuser"); void *compressed_data = NULL; size_t compressed_data_len = 0u; if (is_compressible && !mcd_rpc_message_compress(rpc, compressor_id, _compression_level_from_uri(compressor_id, cluster->uri), &compressed_data, &compressed_data_len, error)) { goto done; } if (cluster->client->in_exhaust) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_IN_EXHAUST, "a cursor derived from this client is in exhaust"); goto done; } mcd_rpc_message_egress(rpc); if (!_mongoc_stream_writev_full(stream, iovecs, num_iovecs, cluster->sockettimeoutms, error)) { RUN_CMD_ERR_DECORATE; _handle_network_error(cluster, cmd->server_stream, error); goto done; } ret = true; done: bson_free(compressed_data); bson_free(iovecs); bson_free(ns); return ret; } static bool _mongoc_cluster_run_command_opquery_recv( mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, mcd_rpc_message *rpc, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(reply); BSON_ASSERT_PARAM(error); bool ret = false; mongoc_stream_t *const stream = cmd->server_stream->stream; mongoc_buffer_t buffer; _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; if (!_mongoc_buffer_append_from_stream(&buffer, stream, sizeof(int32_t), cluster->sockettimeoutms, error)) { RUN_CMD_ERR(MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); _handle_network_error(cluster, cmd->server_stream, error); goto done; } const int32_t message_length = mlib_read_i32le(buffer.data); if (message_length < message_header_length || message_length > MONGOC_DEFAULT_MAX_MSG_SIZE) { RUN_CMD_ERR(MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "invalid message length"); _handle_network_error(cluster, cmd->server_stream, error); goto done; } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); if (!_mongoc_buffer_append_from_stream(&buffer, stream, remaining_bytes, cluster->sockettimeoutms, error)) { RUN_CMD_ERR(MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); _handle_network_error(cluster, cmd->server_stream, error); goto done; } if (!mcd_rpc_message_from_data_in_place(rpc, buffer.data, buffer.len, NULL)) { RUN_CMD_ERR(MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "malformed reply from server"); goto done; } mcd_rpc_message_ingress(rpc); if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { RUN_CMD_ERR(MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "could not decompress server reply"); goto done; } { bson_t body; if (!mcd_rpc_message_get_body(rpc, &body)) { RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed reply from server"); goto done; } bson_copy_to(&body, reply); bson_destroy(&body); } if (!_mongoc_cmd_check_ok(reply, cluster->client->error_api_version, error)) { goto done; } ret = true; done: bson_free(decompressed_data); _mongoc_buffer_destroy(&buffer); return ret; } static bool mongoc_cluster_run_command_opquery( mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, int32_t compressor_id, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(cmd->server_stream); BSON_ASSERT_PARAM(reply); BSON_ASSERT_PARAM(error); ENTRY; bool ret = false; bson_init(reply); error->code = 0; mcd_rpc_message *const rpc = mcd_rpc_message_new(); if (!_mongoc_cluster_run_command_opquery_send(cluster, cmd, compressor_id, rpc, error)) { GOTO(done); } mcd_rpc_message_reset(rpc); if (!_mongoc_cluster_run_command_opquery_recv(cluster, cmd, rpc, reply, error)) { GOTO(done); } ret = true; done: if (!ret && error->code == 0) { /* generic error */ RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server"); } mcd_rpc_message_destroy(rpc); RETURN(ret); } static bool _in_sharded_txn(const mongoc_client_session_t *session) { return session && _mongoc_client_session_in_txn_or_ending(session) && _mongoc_topology_get_type(session->client->topology) == MONGOC_TOPOLOGY_SHARDED; } static bool _in_sharded_or_loadbalanced_txn(const mongoc_client_session_t *session) { if (!session) { return false; } if (!_mongoc_client_session_in_txn_or_ending(session)) { return false; } mongoc_topology_description_type_t type = _mongoc_topology_get_type(session->client->topology); return (type == MONGOC_TOPOLOGY_SHARDED) || (type == MONGOC_TOPOLOGY_LOAD_BALANCED); } static void _handle_txn_error_labels(bool cmd_ret, const bson_error_t *cmd_err, const mongoc_cmd_t *cmd, bson_t *reply) { if (!cmd->is_txn_finish) { return; } _mongoc_write_error_handle_labels(cmd_ret, cmd_err, reply, cmd->server_stream->sd); } // run_command_monitored is an internal helper to run a command with APM monitoring. static bool run_command_monitored(mongoc_cluster_t *cluster, mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error) { bool retval; const int32_t request_id = ++cluster->request_id; uint32_t server_id; mongoc_apm_command_started_t started_event; mongoc_apm_command_succeeded_t succeeded_event; mongoc_apm_command_failed_t failed_event; int64_t started = bson_get_monotonic_time(); const mongoc_server_stream_t *server_stream; bson_t reply_local; bson_iter_t iter; bson_t encrypted = BSON_INITIALIZER; bson_t decrypted = BSON_INITIALIZER; mongoc_cmd_t encrypted_cmd; bool is_redacted_by_apm = false; server_stream = cmd->server_stream; server_id = server_stream->sd->id; const mongoc_log_and_monitor_instance_t *log_and_monitor = &cluster->client->topology->log_and_monitor; if (!reply) { reply = &reply_local; } bson_error_reset(error); if (_mongoc_cse_is_enabled(cluster->client)) { bson_destroy(&encrypted); retval = _mongoc_cse_auto_encrypt(cluster->client, cmd, &encrypted_cmd, &encrypted, error); cmd = &encrypted_cmd; if (!retval) { bson_init(reply); goto fail_no_events; } } mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Command started", int32("requestId", request_id), server_description(server_stream->sd, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID, SERVICE_ID), cmd(cmd, DATABASE_NAME, COMMAND_NAME, OPERATION_ID, COMMAND)); if (log_and_monitor->apm_callbacks.started) { mongoc_apm_command_started_init_with_cmd( &started_event, cmd, request_id, &is_redacted_by_apm, log_and_monitor->apm_context); log_and_monitor->apm_callbacks.started(&started_event); mongoc_apm_command_started_cleanup(&started_event); } retval = mongoc_cluster_run_opmsg(cluster, cmd, reply, error); if (retval) { bson_t fake_reply = BSON_INITIALIZER; int64_t duration = bson_get_monotonic_time() - started; /* * Unacknowledged writes must provide a CommandSucceededEvent with an * {ok: 1} reply. * https://github.com/mongodb/specifications/blob/master/source/command-logging-and-monitoring/command-logging-and-monitoring.md#unacknowledgedacknowledged-writes */ if (!cmd->is_acknowledged) { bson_append_int32(&fake_reply, "ok", 2, 1); } mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Command succeeded", int32("requestId", request_id), monotonic_time_duration(duration), server_description(server_stream->sd, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID, SERVICE_ID), cmd(cmd, DATABASE_NAME, COMMAND_NAME, OPERATION_ID), cmd_reply(cmd, cmd->is_acknowledged ? reply : &fake_reply)); if (log_and_monitor->apm_callbacks.succeeded) { mongoc_apm_command_succeeded_init(&succeeded_event, duration, cmd->is_acknowledged ? reply : &fake_reply, cmd->command_name, cmd->db_name, request_id, cmd->operation_id, &server_stream->sd->host, server_id, &server_stream->sd->service_id, server_stream->sd->server_connection_id, is_redacted_by_apm, log_and_monitor->apm_context); log_and_monitor->apm_callbacks.succeeded(&succeeded_event); mongoc_apm_command_succeeded_cleanup(&succeeded_event); } bson_destroy(&fake_reply); } else { int64_t duration = bson_get_monotonic_time() - started; mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Command failed", int32("requestId", request_id), monotonic_time_duration(duration), server_description(server_stream->sd, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID, SERVICE_ID), cmd(cmd, DATABASE_NAME, COMMAND_NAME, OPERATION_ID), cmd_failure(cmd, reply, error)); if (log_and_monitor->apm_callbacks.failed) { mongoc_apm_command_failed_init(&failed_event, duration, cmd->command_name, cmd->db_name, error, reply, request_id, cmd->operation_id, &server_stream->sd->host, server_id, &server_stream->sd->service_id, server_stream->sd->server_connection_id, is_redacted_by_apm, log_and_monitor->apm_context); log_and_monitor->apm_callbacks.failed(&failed_event); mongoc_apm_command_failed_cleanup(&failed_event); } } if (retval && _mongoc_cse_is_enabled(cluster->client)) { bson_destroy(&decrypted); retval = _mongoc_cse_auto_decrypt(cluster->client, cmd->db_name, reply, &decrypted, error); bson_destroy(reply); bson_steal(reply, &decrypted); bson_init(&decrypted); if (!retval) { goto fail_no_events; } } _handle_not_primary_error(cluster, server_stream, reply); _handle_txn_error_labels(retval, error, cmd, reply); if (retval && _in_sharded_or_loadbalanced_txn(cmd->session) && bson_iter_init_find(&iter, reply, "recoveryToken")) { bson_destroy(cmd->session->recovery_token); if (BSON_ITER_HOLDS_DOCUMENT(&iter)) { cmd->session->recovery_token = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); } else { MONGOC_ERROR("Malformed recovery token from server"); cmd->session->recovery_token = NULL; } } fail_no_events: if (reply == &reply_local) { bson_destroy(&reply_local); } bson_destroy(&encrypted); bson_destroy(&decrypted); _mongoc_topology_update_last_used(cluster->client->topology, server_id); return retval; } // _try_get_oidc_connection_cache returns the OIDC connection cache (for either a single or pooled client). // Returns NULL if server is not found. static mongoc_oidc_connection_cache_t * _try_get_oidc_connection_cache(mongoc_cluster_t *cluster, uint32_t server_id, bson_error_t *error) { mongoc_oidc_connection_cache_t *ret = NULL; if (cluster->client->topology->single_threaded) { mongoc_topology_scanner_node_t *scanner_node = mongoc_topology_scanner_get_node(cluster->client->topology->scanner, server_id); if (scanner_node) { ret = scanner_node->oidc_connection_cache; } } else { mongoc_cluster_node_t *cluster_node = (mongoc_cluster_node_t *)mongoc_set_get(cluster->nodes, server_id); if (cluster_node) { ret = cluster_node->oidc_connection_cache; } } if (!ret) { // Possible on bad server_id or if server was removed. Unexpected with current call paths. _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Could not find server with id: %" PRIu32, server_id); } return ret; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_run_command_monitored -- * * Internal function to run a command on a given stream. * @error and @reply are optional out-pointers. * If the server returns a ReauthenticationRequired error, auth * may be re-attempted. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * If the client's APM callbacks are set, they are executed. * @reply is set and should ALWAYS be released with bson_destroy(). * *-------------------------------------------------------------------------- */ bool mongoc_cluster_run_command_monitored(mongoc_cluster_t *cluster, mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error) { if (run_command_monitored(cluster, cmd, reply, error)) { return true; } const char *mechanism = mongoc_uri_get_auth_mechanism(cluster->uri); bool using_oidc = mechanism && 0 == strcasecmp(mechanism, "MONGODB-OIDC"); // From auth spec: // > If any operation fails with `ReauthenticationRequired` (error code 391) and MONGODB-OIDC is in use, the // > driver MUST reauthenticate the connection. if (using_oidc && _mongoc_error_is_reauth(error, cluster->client->error_api_version)) { if (reply) { bson_destroy(reply); bson_init(reply); } mongoc_oidc_connection_cache_t *oidc_connection_cache = _try_get_oidc_connection_cache(cluster, cmd->server_stream->sd->id, error); if (!oidc_connection_cache) { return false; } if (!_mongoc_cluster_reauth_node_oidc( cluster, cmd->server_stream->stream, oidc_connection_cache, cmd->server_stream->sd, error)) { return false; } return run_command_monitored(cluster, cmd, reply, error); } return false; } static bool _should_use_op_msg(const mongoc_cluster_t *cluster) { return mongoc_cluster_uses_server_api(cluster) || mongoc_cluster_uses_loadbalanced(cluster); } /* *-------------------------------------------------------------------------- * * mongoc_cluster_run_command_private -- * * Internal function to run a command on a given stream. * @error and @reply are optional out-pointers. * The client's APM callbacks are not executed. * Automatic encryption/decryption is not performed. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * @reply is set and should ALWAYS be released with bson_destroy(). * *-------------------------------------------------------------------------- */ bool mongoc_cluster_run_command_private(mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error) { bool retval; const mongoc_server_stream_t *server_stream; bson_t reply_local; bson_error_t error_local; if (!error) { error = &error_local; } /* If NULL was passed, we use our local variable as a temporary sink: */ if (!reply) { reply = &reply_local; } server_stream = cmd->server_stream; if (_should_use_op_msg(cluster) || server_stream->sd->max_wire_version >= WIRE_VERSION_MIN) { retval = mongoc_cluster_run_opmsg(cluster, cmd, reply, error); } else { retval = mongoc_cluster_run_command_opquery(cluster, cmd, -1, reply, error); } _handle_not_primary_error(cluster, server_stream, reply); if (reply == &reply_local) { bson_destroy(&reply_local); } _mongoc_topology_update_last_used(cluster->client->topology, server_stream->sd->id); return retval; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_run_command_parts -- * * Internal function to assemble command parts and run a command * on a given stream. @error and @reply are optional out-pointers. * The client's APM callbacks are not executed. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * @reply is set and should ALWAYS be released with bson_destroy(). * mongoc_cmd_parts_cleanup will be always be called on parts. The * caller should *not* call cleanup on the parts. * *-------------------------------------------------------------------------- */ bool mongoc_cluster_run_command_parts(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream, mongoc_cmd_parts_t *parts, bson_t *reply, bson_error_t *error) { bool ret; if (!mongoc_cmd_parts_assemble(parts, server_stream, error)) { _mongoc_bson_init_if_set(reply); mongoc_cmd_parts_cleanup(parts); return false; } ret = mongoc_cluster_run_command_private(cluster, &parts->assembled, reply, error); mongoc_cmd_parts_cleanup(parts); return ret; } /* *-------------------------------------------------------------------------- * * _stream_run_hello -- * * Run a hello command on the given stream. If * @negotiate_sasl_supported_mechs is true, then saslSupportedMechs is * added to the hello command. * * Returns: * A mongoc_server_description_t you must destroy or NULL. If the call * failed its error is set and its type is MONGOC_SERVER_UNKNOWN. * *-------------------------------------------------------------------------- */ static mongoc_server_description_t * _stream_run_hello(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *oidc_connection_cache, const char *address, uint32_t server_id, bool negotiate_sasl_supported_mechs, mongoc_scram_t *scram, bson_t *speculative_auth_response /* OUT */, bson_error_t *error) { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); ENTRY; BSON_ASSERT(stream); bson_t handshake_command; _mongoc_topology_dup_handshake_cmd(cluster->client->topology, &handshake_command); if (cluster->requires_auth && speculative_auth_response) { char *oidc_access_token = mongoc_oidc_cache_get_cached_token(cluster->client->topology->oidc_cache); _mongoc_topology_scanner_add_speculative_authentication( &handshake_command, cluster->uri, oidc_access_token, server_id, scram); mongoc_oidc_connection_cache_set(oidc_connection_cache, oidc_access_token); bson_free(oidc_access_token); } if (negotiate_sasl_supported_mechs) { _mongoc_handshake_append_sasl_supported_mechs(cluster->uri, &handshake_command); } const int64_t start = bson_get_monotonic_time(); /* TODO CDRIVER-3654: do not use a mongoc_server_stream here. * Instead, use a plain stream. If a network error occurs, check the cluster * node's generation (which is the generation of the created connection) to * determine if the error should be handled. * The current behavior may double invalidate. * If a network error occurs in mongoc_cluster_run_command_private below, * that invalidates (thinking the error is a post-handshake network error). * Then _mongoc_cluster_stream_for_server also handles the error, and * invalidates again. */ mongoc_server_description_t empty_sd; mongoc_server_description_init(&empty_sd, address, server_id); mongoc_server_stream_t *const server_stream = _mongoc_cluster_create_server_stream(td.ptr, &empty_sd, stream); mongoc_server_description_cleanup(&empty_sd); mongoc_query_flags_t query_flags = MONGOC_QUERY_NONE; /* Use OP_QUERY for the handshake, unless the user has specified an * API version; the correct hello_cmd has already been selected: */ if (!_should_use_op_msg(cluster)) { /* Complete OPCODE_QUERY setup: */ query_flags |= MONGOC_QUERY_SECONDARY_OK; } else { /* We're using OP_MSG, and require some additional doctoring: */ bson_append_utf8(&handshake_command, "$db", 3, "admin", 5); } /* Set up the shared parts of the mongo_cmd_t, which will later be converted to either an op_msg or op_query: */ const mongoc_cmd_t hello_cmd = { .db_name = "admin", .command = &handshake_command, .command_name = _mongoc_get_command_name(&handshake_command), .server_stream = server_stream, .is_acknowledged = true, .query_flags = query_flags, }; bson_t reply; // The final resulting server description mongoc_server_description_t *ret_handshake_sd = NULL; if (!mongoc_cluster_run_command_private(cluster, &hello_cmd, &reply, error)) { // Command execution failed. if (negotiate_sasl_supported_mechs) { // Negotiating a new SASL mechanism bsonParse(reply, find(allOf(key("ok"), isFalse), // do({ /* hello response returned ok: 0. According to * auth spec: "If the hello of the MongoDB * Handshake fails with an error, drivers MUST * treat this an authentication error." */ error->domain = MONGOC_ERROR_CLIENT; error->code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); }))); } } else { // "hello" succeeded // Round-trip time for the hello command const int64_t rtt_msec = (bson_get_monotonic_time() - start) / 1000; ret_handshake_sd = BSON_ALIGNED_ALLOC0(mongoc_server_description_t); mongoc_server_description_init(ret_handshake_sd, address, server_id); /* send the error from run_command IN to handle_hello */ mongoc_server_description_handle_hello(ret_handshake_sd, &reply, rtt_msec, error); if (cluster->requires_auth && speculative_auth_response) { _mongoc_topology_scanner_parse_speculative_authentication(&reply, speculative_auth_response); } /* Note: This call will render our copy of the topology description to be * stale */ const bool update_okay = _mongoc_topology_update_from_handshake(cluster->client->topology, ret_handshake_sd); if (!update_okay) { mongoc_server_description_reset(ret_handshake_sd); _mongoc_set_error(&ret_handshake_sd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "\"%s\" removed from topology", address); } } mongoc_server_stream_cleanup(server_stream); bson_destroy(&handshake_command); bson_destroy(&reply); mc_tpld_drop_ref(&td); RETURN(ret_handshake_sd); } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_run_hello -- * * Run an initial hello command for the given node and handle result. * * Returns: * mongoc_server_description_t on success, NULL otherwise. * the mongoc_server_description_t MUST BE DESTROYED BY THE CALLER. * * Side effects: * Makes a blocking I/O call, updates cluster->topology->description * with hello result. * *-------------------------------------------------------------------------- */ static mongoc_server_description_t * _cluster_run_hello(mongoc_cluster_t *cluster, mongoc_cluster_node_t *node, uint32_t server_id, mongoc_scram_t *scram /* OUT */, bson_t *speculative_auth_response /* OUT */, bson_error_t *error /* OUT */) { mongoc_server_description_t *sd; ENTRY; BSON_ASSERT(cluster); BSON_ASSERT(node); BSON_ASSERT(node->stream); sd = _stream_run_hello(cluster, node->stream, node->oidc_connection_cache, node->connection_address, server_id, _mongoc_uri_requires_auth_negotiation(cluster->uri), scram, speculative_auth_response, error); if (!sd) { return NULL; } if (sd->type == MONGOC_SERVER_UNKNOWN) { memcpy(error, &sd->error, sizeof(bson_error_t)); mongoc_server_description_destroy(sd); return NULL; } return sd; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_node_plain -- * * Perform SASL PLAIN authentication for @node. We do this manually * instead of using the SASL module because it is rather simplistic. * * Returns: * true if successful; otherwise false and error is set. * * Side effects: * error may be set. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_auth_node_plain(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { mongoc_cmd_parts_t parts; char buf[4096]; int buflen = 0; const char *username; const char *password; bson_t b = BSON_INITIALIZER; bson_t reply; size_t len; char *str; bool ret; mongoc_server_stream_t *server_stream; mc_shared_tpld td; BSON_ASSERT(cluster); BSON_ASSERT(stream); username = mongoc_uri_get_username(cluster->uri); if (!username) { username = ""; } password = mongoc_uri_get_password(cluster->uri); if (!password) { password = ""; } str = bson_strdup_printf("%c%s%c%s", '\0', username, '\0', password); len = strlen(username) + strlen(password) + 2; buflen = mcommon_b64_ntop((const uint8_t *)str, len, buf, sizeof buf); bson_free(str); if (buflen == -1) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "failed base64 encoding message"); return false; } BSON_APPEND_INT32(&b, "saslStart", 1); BSON_APPEND_UTF8(&b, "mechanism", "PLAIN"); bson_append_utf8(&b, "payload", 7, (const char *)buf, buflen); BSON_APPEND_INT32(&b, "autoAuthorize", 1); mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_SECONDARY_OK, &b); parts.prohibit_lsid = true; td = mc_tpld_take_ref(cluster->client->topology); server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); mc_tpld_drop_ref(&td); ret = mongoc_cluster_run_command_parts(cluster, server_stream, &parts, &reply, error); mongoc_server_stream_cleanup(server_stream); if (!ret) { /* error->message is already set */ error->domain = MONGOC_ERROR_CLIENT; error->code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); } bson_destroy(&b); bson_destroy(&reply); return ret; } bool _mongoc_cluster_get_auth_cmd_x509(const mongoc_uri_t *uri, bson_t *cmd /* OUT */, bson_error_t *error /* OUT */) { #ifndef MONGOC_ENABLE_SSL _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "The MONGODB-X509 authentication mechanism requires " "libmongoc built with ENABLE_SSL"); return false; #else const char *username_from_uri = NULL; BSON_ASSERT(uri); BSON_UNUSED(error); username_from_uri = mongoc_uri_get_username(uri); if (username_from_uri) { TRACE("%s", "X509: got username from URI"); } bson_init(cmd); BSON_APPEND_INT32(cmd, "authenticate", 1); BSON_APPEND_UTF8(cmd, "mechanism", "MONGODB-X509"); if (username_from_uri) { BSON_APPEND_UTF8(cmd, "user", username_from_uri); } return true; #endif } static bool _mongoc_cluster_auth_node_x509(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { #ifndef MONGOC_ENABLE_SSL _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "The MONGODB-X509 authentication mechanism requires " "libmongoc built with ENABLE_SSL"); return false; #else mongoc_cmd_parts_t parts; bson_t cmd; bson_t reply; bool ret; mongoc_server_stream_t *server_stream; mc_shared_tpld td; BSON_ASSERT(cluster); BSON_ASSERT(stream); if (!_mongoc_cluster_get_auth_cmd_x509(cluster->uri, &cmd, error)) { return false; } mongoc_cmd_parts_init(&parts, cluster->client, "$external", MONGOC_QUERY_SECONDARY_OK, &cmd); parts.prohibit_lsid = true; td = mc_tpld_take_ref(cluster->client->topology); server_stream = _mongoc_cluster_create_server_stream(td.ptr, sd, stream); mc_tpld_drop_ref(&td); ret = mongoc_cluster_run_command_parts(cluster, server_stream, &parts, &reply, error); mongoc_server_stream_cleanup(server_stream); if (!ret) { /* error->message is already set */ error->domain = MONGOC_ERROR_CLIENT; error->code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); } bson_destroy(&cmd); bson_destroy(&reply); return ret; #endif } bool mongoc_cluster_uses_server_api(const mongoc_cluster_t *cluster) { BSON_ASSERT_PARAM(cluster); return mongoc_client_uses_server_api(cluster->client); } bool mongoc_cluster_uses_loadbalanced(const mongoc_cluster_t *cluster) { BSON_ASSERT_PARAM(cluster); return mongoc_client_uses_loadbalanced(cluster->client); } #ifdef MONGOC_ENABLE_CRYPTO void _mongoc_cluster_init_scram(const mongoc_cluster_t *cluster, mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo) { _mongoc_uri_init_scram(cluster->uri, scram, algo); } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_get_auth_cmd_scram -- * * Generates the saslStart command for scram authentication. Used * during explicit authentication as well as speculative * authentication during hello. * * * Returns: * true if the command could be generated, false otherwise * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ bool _mongoc_cluster_get_auth_cmd_scram(mongoc_crypto_hash_algorithm_t algo, mongoc_scram_t *scram, bson_t *cmd /* OUT */, bson_error_t *error /* OUT */) { uint8_t buf[4096] = {0}; uint32_t buflen = 0; bson_t options; if (!_mongoc_scram_step(scram, buf, buflen, buf, sizeof buf, &buflen, error)) { return false; } BSON_ASSERT(scram->step == 1); bson_init(cmd); BSON_APPEND_INT32(cmd, "saslStart", 1); if (algo == MONGOC_CRYPTO_ALGORITHM_SHA_1) { BSON_APPEND_UTF8(cmd, "mechanism", "SCRAM-SHA-1"); } else if (algo == MONGOC_CRYPTO_ALGORITHM_SHA_256) { BSON_APPEND_UTF8(cmd, "mechanism", "SCRAM-SHA-256"); } else { BSON_ASSERT(false); } bson_append_binary(cmd, "payload", 7, BSON_SUBTYPE_BINARY, buf, buflen); BSON_APPEND_INT32(cmd, "autoAuthorize", 1); BSON_APPEND_DOCUMENT_BEGIN(cmd, "options", &options); BSON_APPEND_BOOL(&options, "skipEmptyExchange", true); bson_append_document_end(cmd, &options); bson_destroy(&options); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_run_scram_command -- * * Runs a scram authentication command, handling auth_source and * errors during the command. * * * Returns: * true if the command was successful, false otherwise * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_run_scram_command(mongoc_cluster_t *cluster, mongoc_stream_t *stream, const mongoc_server_description_t *handshake_sd, const bson_t *cmd, bson_t *reply, bson_error_t *error) { mongoc_cmd_parts_t parts; mongoc_server_stream_t *server_stream; const char *auth_source; mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); if (!(auth_source = mongoc_uri_get_auth_source(cluster->uri)) || (*auth_source == '\0')) { auth_source = "admin"; } mongoc_cmd_parts_init(&parts, cluster->client, auth_source, MONGOC_QUERY_SECONDARY_OK, cmd); parts.prohibit_lsid = true; server_stream = _mongoc_cluster_create_server_stream(td.ptr, handshake_sd, stream); mc_tpld_drop_ref(&td); if (!mongoc_cluster_run_command_parts(cluster, server_stream, &parts, reply, error)) { mongoc_server_stream_cleanup(server_stream); bson_destroy(reply); /* error->message is already set */ error->domain = MONGOC_ERROR_CLIENT; error->code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); return false; } mongoc_server_stream_cleanup(server_stream); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_scram_start -- * * Starts scram authentication by generating and sending the saslStart * command. The conversation can then be resumed using * _mongoc_cluster_auth_scram_continue. * * * Returns: * true if the saslStart command was successful, false otherwise * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_auth_scram_start(mongoc_cluster_t *cluster, mongoc_stream_t *stream, const mongoc_server_description_t *handshake_sd, mongoc_crypto_hash_algorithm_t algo, mongoc_scram_t *scram, bson_t *reply, bson_error_t *error) { bson_t cmd; BSON_ASSERT(scram->step == 0); if (!_mongoc_cluster_get_auth_cmd_scram(algo, scram, &cmd, error)) { /* error->message is already set */ error->domain = MONGOC_ERROR_CLIENT; error->code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); return false; } if (!_mongoc_cluster_run_scram_command(cluster, stream, handshake_sd, &cmd, reply, error)) { bson_destroy(&cmd); return false; } bson_destroy(&cmd); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_scram_handle_reply -- * * Handles replies from _mongoc_cluster_run_scram_command. The @done * argument will be set to true if the scram conversation was * completed successfully. * * * Returns: * true if the reply was handled successfully, false if there was an * error. Note that the return value itself does not indicate whether * authentication was completed successfully. * * Side effects: * @error is set on failure. @done, @conv_id, @buf, and @buflen are * set for use in the next scram step. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_scram_handle_reply(mongoc_scram_t *scram, const bson_t *reply, bool *done /* OUT */, int *conv_id /* OUT */, uint8_t *buf /* OUT */, uint32_t bufmax, uint32_t *buflen /* OUT */, bson_error_t *error) { bson_iter_t iter; bson_subtype_t btype; const char *tmpstr; BSON_ASSERT(scram); bool is_done = false; bsonParse(*reply, find(key("done"), storeBool(is_done))); if (is_done) { if (scram->step < 2) { /* Prior to step 2, we haven't even received server proof. */ _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Incorrect step for 'done'"); return false; } *done = true; if (scram->step >= 3) { return true; } } if (!bson_iter_init_find(&iter, reply, "conversationId") || !BSON_ITER_HOLDS_INT32(&iter) || !(*conv_id = bson_iter_int32(&iter)) || !bson_iter_init_find(&iter, reply, "payload") || !BSON_ITER_HOLDS_BINARY(&iter)) { const char *errmsg = "Received invalid SCRAM reply from MongoDB server."; MONGOC_DEBUG("SCRAM: authentication failed"); if (bson_iter_init_find(&iter, reply, "errmsg") && BSON_ITER_HOLDS_UTF8(&iter)) { errmsg = bson_iter_utf8(&iter, NULL); } _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "%s", errmsg); return false; } bson_iter_binary(&iter, &btype, buflen, (const uint8_t **)&tmpstr); if (*buflen > bufmax) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "SCRAM reply from MongoDB is too large."); return false; } memcpy(buf, tmpstr, *buflen); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_scram_continue -- * * Continues the scram conversation from the reply to a saslStart * command, either sent explicitly or received through speculative * authentication during hello. * * * Returns: * true if authenticated. false on failure and @error is set. * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_auth_scram_continue(mongoc_cluster_t *cluster, mongoc_stream_t *stream, const mongoc_server_description_t *handshake_sd, mongoc_scram_t *scram, const bson_t *sasl_start_reply, bson_error_t *error) { bson_t cmd; uint8_t buf[4096] = {0}; uint32_t buflen = 0; int conv_id = 0; bool done = false; bson_t reply_local; if (!_mongoc_cluster_scram_handle_reply(scram, sasl_start_reply, &done, &conv_id, buf, sizeof buf, &buflen, error)) { return false; } for (;;) { if (!_mongoc_scram_step(scram, buf, buflen, buf, sizeof buf, &buflen, error)) { return false; } if (done && (scram->step >= 3)) { break; } bson_init(&cmd); BSON_APPEND_INT32(&cmd, "saslContinue", 1); BSON_APPEND_INT32(&cmd, "conversationId", conv_id); bson_append_binary(&cmd, "payload", 7, BSON_SUBTYPE_BINARY, buf, buflen); TRACE("SCRAM: authenticating (step %d)", scram->step); if (!_mongoc_cluster_run_scram_command(cluster, stream, handshake_sd, &cmd, &reply_local, error)) { bson_destroy(&cmd); return false; } bson_destroy(&cmd); if (!_mongoc_cluster_scram_handle_reply(scram, &reply_local, &done, &conv_id, buf, sizeof buf, &buflen, error)) { bson_destroy(&reply_local); return false; } bson_destroy(&reply_local); if (done && (scram->step >= 3)) { break; } } TRACE("%s", "SCRAM: authenticated"); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_node_scram -- * * Invokes scram authentication by sending a saslStart command and * handling all replies. * * * Returns: * true if authenticated. false on failure and @error is set. * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_auth_node_scram(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *handshake_sd, mongoc_crypto_hash_algorithm_t algo, bson_error_t *error) { mongoc_scram_t scram; bool ret = false; bson_t reply; BSON_ASSERT(cluster); _mongoc_cluster_init_scram(cluster, &scram, algo); if (!_mongoc_cluster_auth_scram_start(cluster, stream, handshake_sd, algo, &scram, &reply, error)) { goto failure; } if (!_mongoc_cluster_auth_scram_continue(cluster, stream, handshake_sd, &scram, &reply, error)) { bson_destroy(&reply); goto failure; } TRACE("%s", "SCRAM: authenticated"); ret = true; bson_destroy(&reply); failure: _mongoc_scram_destroy(&scram); return ret; } #endif static bool _mongoc_cluster_auth_node_scram_sha_1(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { #ifndef MONGOC_ENABLE_CRYPTO _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "The SCRAM_SHA_1 authentication mechanism requires " "libmongoc built with ENABLE_SSL"); return false; #else return _mongoc_cluster_auth_node_scram(cluster, stream, sd, MONGOC_CRYPTO_ALGORITHM_SHA_1, error); #endif } static bool _mongoc_cluster_auth_node_scram_sha_256(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *sd, bson_error_t *error) { #ifndef MONGOC_ENABLE_CRYPTO _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "The SCRAM_SHA_256 authentication mechanism requires " "libmongoc built with ENABLE_SSL"); return false; #else return _mongoc_cluster_auth_node_scram(cluster, stream, sd, MONGOC_CRYPTO_ALGORITHM_SHA_256, error); #endif } /* *-------------------------------------------------------------------------- * * _mongoc_cluster_auth_node -- * * Authenticate a cluster node depending on the required mechanism. * * Returns: * true if authenticated. false on failure and @error is set. * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_cluster_auth_node(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_oidc_connection_cache_t *oidc_connection_cache, mongoc_server_description_t *sd, const mongoc_handshake_sasl_supported_mechs_t *sasl_supported_mechs, bson_error_t *error) { bool ret = false; const char *mechanism; ENTRY; BSON_ASSERT(cluster); BSON_ASSERT(stream); mechanism = mongoc_uri_get_auth_mechanism(cluster->uri); if (!mechanism) { if (sasl_supported_mechs->scram_sha_256) { /* Auth spec: "If SCRAM-SHA-256 is present in the list of mechanisms, * then it MUST be used as the default; otherwise, SCRAM-SHA-1 MUST be * used as the default, regardless of whether SCRAM-SHA-1 is in the * list. Drivers MUST NOT attempt to use any other mechanism (e.g. * PLAIN) as the default." [...] "If saslSupportedMechs is not present * in the hello results for mechanism negotiation, then SCRAM-SHA-1 * MUST be used when talking to servers >= 3.0." */ mechanism = "SCRAM-SHA-256"; } else { mechanism = "SCRAM-SHA-1"; } } if (0 == strcasecmp(mechanism, "MONGODB-X509")) { ret = _mongoc_cluster_auth_node_x509(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "SCRAM-SHA-1")) { ret = _mongoc_cluster_auth_node_scram_sha_1(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "SCRAM-SHA-256")) { ret = _mongoc_cluster_auth_node_scram_sha_256(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "GSSAPI")) { ret = _mongoc_cluster_auth_node_sasl(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "PLAIN")) { ret = _mongoc_cluster_auth_node_plain(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "MONGODB-AWS")) { ret = _mongoc_cluster_auth_node_aws(cluster, stream, sd, error); } else if (0 == strcasecmp(mechanism, "MONGODB-OIDC")) { ret = _mongoc_cluster_auth_node_oidc(cluster, stream, oidc_connection_cache, sd, error); } else { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Unknown authentication mechanism \"%s\".", mechanism); } if (!ret) { mongoc_counter_auth_failure_inc(); MONGOC_ERROR("Authentication failed: %s", error->message); } else { mongoc_counter_auth_success_inc(); TRACE("%s", "Authentication succeeded"); } RETURN(ret); } /* * Close the connection associated with this server. * * Called when a network error occurs, or to close connection tied to an exhaust * cursor. * If the cluster is pooled, removes the node from cluster's set of nodes. * WARNING: pointers to a disconnected mongoc_cluster_node_t or its stream are * now invalid, be careful of dangling pointers. */ void mongoc_cluster_disconnect_node(mongoc_cluster_t *cluster, uint32_t server_id) { mongoc_topology_t *topology = cluster->client->topology; ENTRY; if (topology->single_threaded) { mongoc_topology_scanner_node_t *scanner_node; scanner_node = mongoc_topology_scanner_get_node(topology->scanner, server_id); /* might never actually have connected */ if (scanner_node && scanner_node->stream) { mongoc_topology_scanner_node_disconnect(scanner_node, true); } } else { mongoc_set_rm(cluster->nodes, server_id); } EXIT; } static void _mongoc_cluster_node_destroy(mongoc_cluster_node_t *node) { /* Failure, or Replica Set reconfigure without this node */ mongoc_stream_failed(node->stream); bson_free(node->connection_address); mongoc_server_description_destroy(node->handshake_sd); mongoc_oidc_connection_cache_destroy(node->oidc_connection_cache); bson_free(node); } static void _mongoc_cluster_node_dtor(void *data_, void *ctx_) { mongoc_cluster_node_t *node = (mongoc_cluster_node_t *)data_; BSON_UNUSED(ctx_); _mongoc_cluster_node_destroy(node); } static mongoc_cluster_node_t * _mongoc_cluster_node_new(mongoc_stream_t *stream, const char *connection_address) { mongoc_cluster_node_t *node; if (!stream) { return NULL; } node = (mongoc_cluster_node_t *)bson_malloc0(sizeof *node); node->stream = stream; node->connection_address = bson_strdup(connection_address); /* Note that the node->sd field is set to NULL by bson_malloc0(), rather than being explicitly initialized. */ return node; } static bool _mongoc_cluster_finish_speculative_auth(mongoc_cluster_t *cluster, mongoc_stream_t *stream, mongoc_server_description_t *handshake_sd, bson_t *speculative_auth_response, mongoc_scram_t *scram, bson_error_t *error) { const char *mechanism = _mongoc_topology_scanner_get_speculative_auth_mechanism(cluster->uri); bool ret = false; bool auth_handled = false; BSON_ASSERT(handshake_sd); BSON_ASSERT(speculative_auth_response); if (!mechanism) { return false; } if (bson_empty(speculative_auth_response)) { return false; } #ifdef MONGOC_ENABLE_SSL if (strcasecmp(mechanism, "MONGODB-X509") == 0) { /* For X509, a successful hello with speculativeAuthenticate field * indicates successful auth */ ret = true; auth_handled = true; } #endif #ifdef MONGOC_ENABLE_CRYPTO if (strcasecmp(mechanism, "SCRAM-SHA-1") == 0 || strcasecmp(mechanism, "SCRAM-SHA-256") == 0) { /* Don't attempt authentication if scram objects have advanced past * saslStart */ if (scram->step != 1) { return false; } auth_handled = true; ret = _mongoc_cluster_auth_scram_continue(cluster, stream, handshake_sd, scram, speculative_auth_response, error); } #endif if (strcasecmp(mechanism, "MONGODB-OIDC") == 0) { // Expect successful reply to include `done: true`: auth_handled = true; bsonParse(*speculative_auth_response, require(allOf(key("done"), isTrue), nop)); if (bsonParseError) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Error in OIDC reply: %s", bsonParseError); ret = false; } else { ret = true; } } if (auth_handled) { if (!ret) { mongoc_counter_auth_failure_inc(); MONGOC_DEBUG("Speculative authentication failed: %s", error->message); } else { mongoc_counter_auth_success_inc(); TRACE("%s", "Speculative authentication succeeded"); } } bson_reinit(speculative_auth_response); return ret; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_add_node -- * * Add a new node to this cluster for the given server description. * * NOTE: does NOT check if this server is already in the cluster. * * Returns: * A stream connected to the server, or NULL on failure. * * Side effects: * Adds a cluster node, or sets error on failure. * *-------------------------------------------------------------------------- */ static mongoc_cluster_node_t * _cluster_add_node(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bson_error_t *error /* OUT */) { mongoc_host_list_t *host = NULL; mongoc_cluster_node_t *cluster_node = NULL; mongoc_stream_t *stream; mongoc_server_description_t *handshake_sd; mongoc_handshake_sasl_supported_mechs_t sasl_supported_mechs; mongoc_scram_t scram = {0}; bson_t speculative_auth_response = BSON_INITIALIZER; ENTRY; BSON_ASSERT(!cluster->client->topology->single_threaded); host = _mongoc_topology_host_by_id(td, server_id, error); if (!host) { GOTO(error); } TRACE("Adding new server to cluster: %s", host->host_and_port); stream = _mongoc_client_create_stream(cluster->client, host, error); if (!stream) { MONGOC_WARNING("Failed connection to %s (%s)", host->host_and_port, error->message); GOTO(error); /* TODO CDRIVER-3654: if this is a non-timeout network error and the * generation is not stale, mark the server unknown and increment the * generation. */ } /* take critical fields from a fresh hello */ cluster_node = _mongoc_cluster_node_new(stream, host->host_and_port); cluster_node->oidc_connection_cache = mongoc_oidc_connection_cache_new(); handshake_sd = _cluster_run_hello(cluster, cluster_node, server_id, &scram, &speculative_auth_response, error); if (!handshake_sd) { GOTO(error); } _mongoc_handshake_parse_sasl_supported_mechs(&handshake_sd->last_hello_response, &sasl_supported_mechs); if (cluster->requires_auth) { /* Complete speculative authentication */ bool is_auth = _mongoc_cluster_finish_speculative_auth( cluster, stream, handshake_sd, &speculative_auth_response, &scram, error); if (!is_auth && !_mongoc_cluster_auth_node(cluster, cluster_node->stream, cluster_node->oidc_connection_cache, handshake_sd, &sasl_supported_mechs, error)) { MONGOC_WARNING("Failed authentication to %s (%s)", host->host_and_port, error->message); mongoc_server_description_destroy(handshake_sd); GOTO(error); } } /* Transfer ownership of the server description into the cluster node. */ cluster_node->handshake_sd = handshake_sd; /* Copy the latest connection pool generation. * TODO (CDRIVER-4078) do not store the generation counter on the server * description */ handshake_sd->generation = _mongoc_topology_get_connection_pool_generation(td, server_id, &handshake_sd->service_id); bson_destroy(&speculative_auth_response); mongoc_set_add(cluster->nodes, server_id, cluster_node); _mongoc_host_list_destroy_all(host); #ifdef MONGOC_ENABLE_CRYPTO _mongoc_scram_destroy(&scram); #endif RETURN(cluster_node); error: bson_destroy(&speculative_auth_response); _mongoc_host_list_destroy_all(host); /* null ok */ #ifdef MONGOC_ENABLE_CRYPTO _mongoc_scram_destroy(&scram); #endif if (cluster_node) { _mongoc_cluster_node_destroy(cluster_node); /* also destroys stream */ } RETURN(NULL); } static void node_not_found(const mongoc_topology_description_t *td, uint32_t server_id, bson_error_t *error /* OUT */) { mongoc_server_description_t const *sd; if (!error) { return; } sd = mongoc_topology_description_server_by_id_const(td, server_id, error); if (!sd) { return; } if (sd->error.code) { memcpy(error, &sd->error, sizeof *error); } else { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not find node %s", sd->host.host_and_port); } } static void stream_not_found(const mongoc_topology_description_t *td, uint32_t server_id, const char *connection_address, bson_error_t *error /* OUT */) { mongoc_server_description_t const *sd; sd = mongoc_topology_description_server_by_id_const(td, server_id, error); if (error) { if (sd && sd->error.code) { memcpy(error, &sd->error, sizeof *error); } else { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not find stream for node %s", connection_address); } } } static mongoc_server_stream_t * _try_get_server_stream(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bool reconnect_ok, bson_error_t *error) { if (cluster->client->topology->single_threaded) { /* in the single-threaded use case we share topology's streams */ return _cluster_fetch_stream_single(cluster, td, server_id, reconnect_ok, error); } else { return _cluster_fetch_stream_pooled(cluster, td, server_id, reconnect_ok, error); } } static mongoc_server_stream_t * _mongoc_cluster_stream_for_server(mongoc_cluster_t *cluster, uint32_t server_id, bool reconnect_ok, const mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error /* OUT */) { mongoc_topology_t *const topology = BSON_ASSERT_PTR_INLINE(cluster)->client->topology; mongoc_server_stream_t *ret_server_stream; bson_error_t err_local; /* if fetch_stream fails we need a place to receive error details and pass * them to mongoc_topology_description_invalidate_server. */ bson_error_t *err_ptr = error ? error : &err_local; mc_tpld_modification tdmod; mc_shared_tpld td; ENTRY; td = mc_tpld_take_ref(topology); ret_server_stream = _try_get_server_stream(cluster, td.ptr, server_id, reconnect_ok, err_ptr); if (!ret_server_stream) { /* TODO CDRIVER-3654. A null server stream could be due to: * 1. Network error during handshake. * 2. Failure to retrieve server description (if it was removed from * topology). * 3. Auth error during handshake. * Only (1) should mark the server unknown and clear the pool. * Network errors should be checked at a lower layer than this, when an * operation on a stream fails, and should take the connection generation * into account. */ _mongoc_bson_init_if_set(reply); // Add a transient transaction label if applicable. _mongoc_add_transient_txn_error(cs, reply); /* Update the topology */ tdmod = mc_tpld_modify_begin(topology); /* When establishing a new connection in load balanced mode, drivers MUST * NOT perform SDAM error handling for any errors that occur before the * MongoDB Handshake. */ if (tdmod.new_td->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { mc_tpld_modify_drop(tdmod); ret_server_stream = NULL; goto done; } mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, err_ptr); mongoc_cluster_disconnect_node(cluster, server_id); /* This is not load balanced mode, so there are no service IDs associated * with connections. Pass kZeroObjectId to clear the entire connection * pool to this server. */ _mongoc_topology_description_clear_connection_pool(tdmod.new_td, server_id, &kZeroObjectId); if (!topology->single_threaded) { _mongoc_topology_background_monitoring_cancel_check(topology, server_id); } mc_tpld_modify_commit(tdmod); ret_server_stream = NULL; goto done; } /* If this is a load balanced topology and the server stream does not have a * service id, disconnect and return an error. */ if (td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { if (!mongoc_server_description_has_service_id(ret_server_stream->sd)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER, "Driver attempted to initialize in load balancing " "mode, but the server does not support this mode."); mongoc_server_stream_cleanup(ret_server_stream); mongoc_cluster_disconnect_node(cluster, server_id); _mongoc_bson_init_if_set(reply); ret_server_stream = NULL; goto done; } } done: mc_tpld_drop_ref(&td); RETURN(ret_server_stream); } mongoc_server_stream_t * mongoc_cluster_stream_for_server(mongoc_cluster_t *cluster, uint32_t server_id, bool reconnect_ok, mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_OPTIONAL_PARAM(cs); BSON_OPTIONAL_PARAM(reply); BSON_OPTIONAL_PARAM(error); ENTRY; BSON_ASSERT(cluster); if (cs && cs->server_id && cs->server_id != server_id) { _mongoc_bson_init_if_set(reply); _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_SERVER_SELECTION_INVALID_ID, "Requested server id does not matched pinned server id"); RETURN(NULL); } mongoc_server_stream_t *const server_stream = _mongoc_cluster_stream_for_server(cluster, server_id, reconnect_ok, cs, reply, error); if (_in_sharded_txn(cs)) { _mongoc_client_session_pin(cs, server_id); } else { /* Transactions Spec: Additionally, any non-transaction operation using * a pinned ClientSession MUST unpin the session and the operation MUST * perform normal server selection. */ if (cs && !_mongoc_client_session_in_txn_or_ending(cs)) { _mongoc_client_session_unpin(cs); } } RETURN(server_stream); } static mongoc_server_stream_t * _cluster_fetch_stream_single(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bool reconnect_ok, bson_error_t *error /* OUT */) { mongoc_server_description_t *handshake_sd; mongoc_topology_scanner_node_t *scanner_node; char *address; scanner_node = mongoc_topology_scanner_get_node(cluster->client->topology->scanner, server_id); /* This could happen if a user explicitly passes a bad server id. */ if (!scanner_node) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Could not find server with id: %" PRIu32, server_id); return NULL; } /* Retired scanner nodes are removed at the end of a scan. If the node was * retired, that would indicate a bug. */ if (scanner_node->retired) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unexpected, selecting server marked for removal: %s", scanner_node->host.host_and_port); return NULL; } if (scanner_node->stream) { handshake_sd = mongoc_server_description_new_copy(scanner_node->handshake_sd); } else { if (!reconnect_ok) { stream_not_found(td, server_id, scanner_node->host.host_and_port, error); return NULL; } /* save the scanner node address in case it is removed during the scan. */ address = bson_strdup(scanner_node->host.host_and_port); _mongoc_topology_do_blocking_scan(cluster->client->topology, error); if (error->code) { bson_free(address); return NULL; } scanner_node = mongoc_topology_scanner_get_node(cluster->client->topology->scanner, server_id); if (!scanner_node || !scanner_node->stream) { stream_not_found(td, server_id, address, error); bson_free(address); return NULL; } bson_free(address); handshake_sd = mongoc_server_description_new_copy(scanner_node->handshake_sd); } if (handshake_sd->type == MONGOC_SERVER_UNKNOWN) { *error = handshake_sd->error; mongoc_server_description_destroy(handshake_sd); return NULL; } /* stream open but not auth'ed: first use since connect or reconnect */ if (cluster->requires_auth && !scanner_node->has_auth) { /* Complete speculative authentication */ bool has_speculative_auth = _mongoc_cluster_finish_speculative_auth(cluster, scanner_node->stream, handshake_sd, &scanner_node->speculative_auth_response, &scanner_node->scram, &handshake_sd->error); #ifdef MONGOC_ENABLE_CRYPTO _mongoc_scram_destroy(&scanner_node->scram); #endif if (!scanner_node->stream) { *error = handshake_sd->error; mongoc_server_description_destroy(handshake_sd); return NULL; } if (!has_speculative_auth && !_mongoc_cluster_auth_node(cluster, scanner_node->stream, scanner_node->oidc_connection_cache, handshake_sd, &scanner_node->sasl_supported_mechs, &handshake_sd->error)) { *error = handshake_sd->error; mongoc_server_description_destroy(handshake_sd); return NULL; } scanner_node->has_auth = true; } /* Copy the latest connection pool generation. * TODO (CDRIVER-4078) do not store the generation counter on the server * description */ handshake_sd->generation = _mongoc_topology_get_connection_pool_generation(td, server_id, &handshake_sd->service_id); return mongoc_server_stream_new(td, handshake_sd, scanner_node->stream); } /* *-------------------------------------------------------------------------- * * mongoc_cluster_stream_valid -- * * Internal function to determine if @server_stream is valid and * associated with the given cluster. * * Returns: * true if @server_stream is not NULL, hasn't been freed or changed; * otherwise false. * *-------------------------------------------------------------------------- */ bool mongoc_cluster_stream_valid(mongoc_cluster_t *cluster, mongoc_server_stream_t *server_stream) { mongoc_server_stream_t *tmp_stream = NULL; mongoc_topology_t *topology = BSON_ASSERT_PTR_INLINE(cluster)->client->topology; const mongoc_server_description_t *sd; bool ret = false; bson_error_t error; mc_shared_tpld td = mc_tpld_take_ref(topology); if (!server_stream) { goto done; } tmp_stream = mongoc_cluster_stream_for_server(cluster, server_stream->sd->id, false, NULL, NULL, NULL); if (!tmp_stream || tmp_stream->stream != server_stream->stream) { /* stream was freed, or has changed. */ goto done; } /* Check that the server stream is still valid for the given server, and that * the server is still registered. */ sd = mongoc_topology_description_server_by_id_const(td.ptr, server_stream->sd->id, &error); if (!sd || server_stream->sd->generation < _mongoc_topology_get_connection_pool_generation( td.ptr, server_stream->sd->id, &server_stream->sd->service_id)) { /* No server description, or the pool has been cleared. */ goto done; } ret = true; done: mc_tpld_drop_ref(&td); mongoc_server_stream_cleanup(tmp_stream); return ret; } mongoc_server_stream_t * _mongoc_cluster_create_server_stream(mongoc_topology_description_t const *td, const mongoc_server_description_t *handshake_sd, mongoc_stream_t *stream) { mongoc_server_description_t *const sd = mongoc_server_description_new_copy(handshake_sd); /* can't just use mongoc_topology_server_by_id(), since we must hold the * lock while copying topology->shared_descr.ptr->logical_time below */ return mongoc_server_stream_new(td, sd, stream); } static mongoc_server_stream_t * _cluster_fetch_stream_pooled(mongoc_cluster_t *cluster, const mongoc_topology_description_t *td, uint32_t server_id, bool reconnect_ok, bson_error_t *error /* OUT */) { mongoc_cluster_node_t *cluster_node; mongoc_server_description_t const *sd; bool has_server_description = false; cluster_node = (mongoc_cluster_node_t *)mongoc_set_get(cluster->nodes, server_id); sd = mongoc_topology_description_server_by_id_const(td, server_id, error); if (sd) { has_server_description = true; } if (cluster_node) { uint32_t connection_pool_generation = 0; BSON_ASSERT(cluster_node->stream); connection_pool_generation = _mongoc_topology_get_connection_pool_generation(td, server_id, &cluster_node->handshake_sd->service_id); if (!has_server_description || cluster_node->handshake_sd->generation < connection_pool_generation) { /* Since the stream was created, connections to this server were * invalidated. * This may have happened if: * - A background scan removed the server description. * - A network error or a "not primary"/"node is recovering" error * occurred on an app connection. * - A network error occurred on the monitor connection. */ mongoc_cluster_disconnect_node(cluster, server_id); } else { return _mongoc_cluster_create_server_stream(td, cluster_node->handshake_sd, cluster_node->stream); } } /* no node, or out of date */ if (!reconnect_ok) { node_not_found(td, server_id, error); return NULL; } cluster_node = _cluster_add_node(cluster, td, server_id, error); if (cluster_node) { return _mongoc_cluster_create_server_stream(td, cluster_node->handshake_sd, cluster_node->stream); } else { return NULL; } } /* *-------------------------------------------------------------------------- * * mongoc_cluster_init -- * * Initializes @cluster using the @uri and @client provided. The * @uri is used to determine the "mode" of the cluster. Based on the * uri we can determine if we are connected to a single host, a * replicaSet, or a shardedCluster. * * Returns: * None. * * Side effects: * @cluster is initialized. * *-------------------------------------------------------------------------- */ void mongoc_cluster_init(mongoc_cluster_t *cluster, const mongoc_uri_t *uri, void *client) { ENTRY; BSON_ASSERT(cluster); BSON_ASSERT(uri); memset(cluster, 0, sizeof *cluster); cluster->uri = mongoc_uri_copy(uri); cluster->client = (mongoc_client_t *)client; cluster->requires_auth = (mongoc_uri_get_username(uri) || mongoc_uri_get_auth_mechanism(uri)); mongoc_cluster_reset_sockettimeoutms(cluster); cluster->socketcheckintervalms = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, MONGOC_TOPOLOGY_SOCKET_CHECK_INTERVAL_MS); /* TODO for single-threaded case we don't need this */ cluster->nodes = mongoc_set_new(8, _mongoc_cluster_node_dtor, NULL); _mongoc_array_init(&cluster->iov, sizeof(mongoc_iovec_t)); cluster->operation_id = _mongoc_simple_rand_uint64_t(); EXIT; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_destroy -- * * Clean up after @cluster and destroy all active connections. * All resources for @cluster are released. * * Returns: * None. * * Side effects: * Everything. * *-------------------------------------------------------------------------- */ void mongoc_cluster_destroy(mongoc_cluster_t *cluster) /* INOUT */ { ENTRY; BSON_ASSERT(cluster); mongoc_uri_destroy(cluster->uri); mongoc_set_destroy(cluster->nodes); _mongoc_array_destroy(&cluster->iov); EXIT; } void mongoc_cluster_set_sockettimeoutms(mongoc_cluster_t *cluster, int32_t timeoutms) { BSON_ASSERT_PARAM(cluster); cluster->sockettimeoutms = timeoutms; } void mongoc_cluster_reset_sockettimeoutms(mongoc_cluster_t *cluster) { BSON_ASSERT_PARAM(cluster); cluster->sockettimeoutms = mongoc_uri_get_option_as_int32(cluster->uri, MONGOC_URI_SOCKETTIMEOUTMS, MONGOC_DEFAULT_SOCKETTIMEOUTMS); } static uint32_t _mongoc_cluster_select_server_id(mongoc_client_session_t *cs, mongoc_topology_t *topology, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, bson_error_t *error) { BSON_OPTIONAL_PARAM(cs); BSON_ASSERT_PARAM(topology); BSON_OPTIONAL_PARAM(read_prefs); BSON_ASSERT_PARAM(must_use_primary); BSON_OPTIONAL_PARAM(error); uint32_t server_id; if (_in_sharded_txn(cs)) { server_id = cs->server_id; if (!server_id) { server_id = mongoc_topology_select_server_id(topology, optype, log_context, read_prefs, must_use_primary, ds, error); if (server_id) { _mongoc_client_session_pin(cs, server_id); } } } else { server_id = mongoc_topology_select_server_id(topology, optype, log_context, read_prefs, must_use_primary, ds, error); /* Transactions Spec: Additionally, any non-transaction operation using a * pinned ClientSession MUST unpin the session and the operation MUST * perform normal server selection. */ if (cs && !_mongoc_client_session_in_txn_or_ending(cs)) { _mongoc_client_session_unpin(cs); } } return server_id; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_stream_for_optype -- * * Internal server selection. * * Returns: * A mongoc_server_stream_t on which you must call * mongoc_server_stream_cleanup, or NULL on failure (sets @error) * * Side effects: * May add or disconnect nodes in @cluster->nodes. * Sets @error and initializes @reply on error. * *-------------------------------------------------------------------------- */ static mongoc_server_stream_t * _mongoc_cluster_stream_for_optype(mongoc_cluster_t *cluster, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, mongoc_client_session_t *cs, bool is_retryable, const mongoc_deprioritized_servers_t *ds, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_OPTIONAL_PARAM(read_prefs); BSON_OPTIONAL_PARAM(cs); BSON_OPTIONAL_PARAM(reply); BSON_OPTIONAL_PARAM(error); mongoc_server_stream_t *server_stream; uint32_t server_id; mongoc_topology_t *topology = cluster->client->topology; bool must_use_primary = false; ENTRY; BSON_ASSERT(cluster); server_id = _mongoc_cluster_select_server_id(cs, topology, optype, log_context, read_prefs, &must_use_primary, ds, error); if (!server_id) { if (reply) { bson_init(reply); _mongoc_add_transient_txn_error(cs, reply); } RETURN(NULL); } if (!mongoc_cluster_check_interval(cluster, server_id)) { /* Server Selection Spec: try once more */ server_id = _mongoc_cluster_select_server_id(cs, topology, optype, log_context, read_prefs, &must_use_primary, ds, error); if (!server_id) { if (reply) { bson_init(reply); _mongoc_add_transient_txn_error(cs, reply); } RETURN(NULL); } } bson_t first_reply; bson_error_t first_error = {0}; server_stream = _mongoc_cluster_stream_for_server(cluster, server_id, true /* reconnect_ok */, cs, &first_reply, &first_error); if (server_stream) { server_stream->must_use_primary = must_use_primary; RETURN(server_stream); } // Important: authentication errors are also considered retryable even if // they not considered a network error. const bool retryable_error = _mongoc_error_is_network(&first_error) || _mongoc_error_is_auth(&first_error); if (is_retryable && retryable_error) { bson_t retry_reply; bson_error_t retry_error = {0}; server_stream = _mongoc_cluster_stream_for_server(cluster, server_id, true /* reconnect_ok */, cs, &retry_reply, &retry_error); if (server_stream) { server_stream->must_use_primary = must_use_primary; server_stream->retry_attempted = true; bson_destroy(&first_reply); RETURN(server_stream); } if (optype != MONGOC_SS_READ) { // Retryable Writes Spec: When the driver encounters a network error // establishing an initial connection to a server, it MUST add a // RetryableWriteError label to that error if the MongoClient // performing the operation has the retryWrites configuration option // set to true. _mongoc_write_error_append_retryable_label(&first_reply); } bson_destroy(&retry_reply); } // Retryable Writes Spec: If the driver cannot select a server for the retry // attempt [...], retrying is not possible and drivers MUST raise the // original retryable error. { if (reply) { bson_copy_to(&first_reply, reply); } bson_destroy(&first_reply); if (error) { *error = first_error; } } RETURN(NULL); } mongoc_server_stream_t * mongoc_cluster_stream_for_reads(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, mongoc_client_session_t *cs, const mongoc_deprioritized_servers_t *ds, bson_t *reply, bson_error_t *error) { const mongoc_read_prefs_t *const prefs_override = _mongoc_client_session_in_txn(cs) ? cs->txn.opts.read_prefs : read_prefs; // Retryable Reads Spec: This boolean option determines whether retryable // behavior will be applied to all read operations executed within the // MongoClient. const bool is_retryable = mongoc_uri_get_option_as_bool(cluster->uri, MONGOC_URI_RETRYREADS, MONGOC_DEFAULT_RETRYREADS); return _mongoc_cluster_stream_for_optype( cluster, MONGOC_SS_READ, log_context, prefs_override, cs, is_retryable, ds, reply, error); } mongoc_server_stream_t * mongoc_cluster_stream_for_writes(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, mongoc_client_session_t *cs, const mongoc_deprioritized_servers_t *ds, bson_t *reply, bson_error_t *error) { const bool is_retryable = mongoc_uri_get_option_as_bool(cluster->uri, MONGOC_URI_RETRYWRITES, MONGOC_DEFAULT_RETRYWRITES); return _mongoc_cluster_stream_for_optype( cluster, MONGOC_SS_WRITE, log_context, NULL, cs, is_retryable, ds, reply, error); } mongoc_server_stream_t * mongoc_cluster_stream_for_aggr_with_write(mongoc_cluster_t *cluster, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error) { const mongoc_read_prefs_t *const prefs_override = _mongoc_client_session_in_txn(cs) ? cs->txn.opts.read_prefs : read_prefs; const bool is_retryable = mongoc_uri_get_option_as_bool(cluster->uri, MONGOC_URI_RETRYWRITES, MONGOC_DEFAULT_RETRYWRITES); return _mongoc_cluster_stream_for_optype( cluster, MONGOC_SS_AGGREGATE_WITH_WRITE, log_context, prefs_override, cs, is_retryable, NULL, reply, error); } static bool _mongoc_cluster_min_of_max_obj_size_sds(const void *item, void *ctx) { const mongoc_server_description_t *sd = item; int32_t *current_min = (int32_t *)ctx; if (sd->max_bson_obj_size < *current_min) { *current_min = sd->max_bson_obj_size; } return true; } static bool _mongoc_cluster_min_of_max_obj_size_nodes(void *item, void *ctx) { mongoc_cluster_node_t *node = (mongoc_cluster_node_t *)item; int32_t *current_min = (int32_t *)ctx; if (node->handshake_sd->max_bson_obj_size < *current_min) { *current_min = node->handshake_sd->max_bson_obj_size; } return true; } static bool _mongoc_cluster_min_of_max_msg_size_sds(const void *item, void *ctx) { const mongoc_server_description_t *sd = item; int32_t *current_min = (int32_t *)ctx; if (sd->max_msg_size < *current_min) { *current_min = sd->max_msg_size; } return true; } static bool _mongoc_cluster_min_of_max_msg_size_nodes(void *item, void *ctx) { mongoc_cluster_node_t *node = (mongoc_cluster_node_t *)item; int32_t *current_min = (int32_t *)ctx; if (node->handshake_sd->max_msg_size < *current_min) { *current_min = node->handshake_sd->max_msg_size; } return true; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_get_max_bson_obj_size -- * * Return the minimum max_bson_obj_size across all servers in cluster. * * Returns: * The minimum max_bson_obj_size. * * Side effects: * None * *-------------------------------------------------------------------------- */ int32_t mongoc_cluster_get_max_bson_obj_size(mongoc_cluster_t *cluster) { int32_t max_bson_obj_size = -1; max_bson_obj_size = MONGOC_DEFAULT_BSON_OBJ_SIZE; if (!cluster->client->topology->single_threaded) { mongoc_set_for_each(cluster->nodes, _mongoc_cluster_min_of_max_obj_size_nodes, &max_bson_obj_size); } else { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); mongoc_set_for_each_const( mc_tpld_servers_const(td.ptr), _mongoc_cluster_min_of_max_obj_size_sds, &max_bson_obj_size); mc_tpld_drop_ref(&td); } return max_bson_obj_size; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_get_max_msg_size -- * * Return the minimum max msg size across all servers in cluster. * * Returns: * The minimum max_msg_size * * Side effects: * None * *-------------------------------------------------------------------------- */ int32_t mongoc_cluster_get_max_msg_size(mongoc_cluster_t *cluster) { int32_t max_msg_size = MONGOC_DEFAULT_MAX_MSG_SIZE; if (!cluster->client->topology->single_threaded) { mongoc_set_for_each(cluster->nodes, _mongoc_cluster_min_of_max_msg_size_nodes, &max_msg_size); } else { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(cluster)->client->topology); mongoc_set_for_each_const(mc_tpld_servers_const(td.ptr), _mongoc_cluster_min_of_max_msg_size_sds, &max_msg_size); mc_tpld_drop_ref(&td); } return max_msg_size; } /* *-------------------------------------------------------------------------- * * mongoc_cluster_check_interval -- * * Server Selection Spec: * * Only for single-threaded drivers. * * If a server is selected that has an existing connection that has been * idle for socketCheckIntervalMS, the driver MUST check the connection * with the "ping" command. If the ping succeeds, use the selected * connection. If not, set the server's type to Unknown and update the * Topology Description according to the Server Discovery and Monitoring * Spec, and attempt once more to select a server. * * Returns: * True if the check succeeded or no check was required, false if the * check failed. * * Side effects: * If a check fails, closes stream and may set server type Unknown. * *-------------------------------------------------------------------------- */ bool mongoc_cluster_check_interval(mongoc_cluster_t *cluster, uint32_t server_id) { mongoc_cmd_parts_t parts; mongoc_topology_t *topology; mongoc_topology_scanner_node_t *scanner_node; mongoc_stream_t *stream; int64_t now; bson_t command; bson_error_t error; bool r = true; mongoc_server_stream_t *server_stream; mongoc_server_description_t *handshake_sd; topology = cluster->client->topology; if (!topology->single_threaded) { return true; } scanner_node = mongoc_topology_scanner_get_node(topology->scanner, server_id); if (!scanner_node) { return false; } BSON_ASSERT(!scanner_node->retired); stream = scanner_node->stream; if (!stream) { return false; } handshake_sd = scanner_node->handshake_sd; BSON_ASSERT(handshake_sd); now = bson_get_monotonic_time(); if (scanner_node->last_used + (1000 * CHECK_CLOSED_DURATION_MSEC) < now) { if (mongoc_stream_check_closed(stream)) { mc_tpld_modification tdmod; _mongoc_set_error(&error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "connection closed"); mongoc_cluster_disconnect_node(cluster, server_id); tdmod = mc_tpld_modify_begin(topology); /* invalidate_server() is okay if 'server_id' was already removed. */ mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, &error); mc_tpld_modify_commit(tdmod); return false; } } if (scanner_node->last_used + (1000 * cluster->socketcheckintervalms) < now) { mc_shared_tpld td; bson_init(&command); BSON_APPEND_INT32(&command, "ping", 1); mongoc_cmd_parts_init(&parts, cluster->client, "admin", MONGOC_QUERY_SECONDARY_OK, &command); parts.prohibit_lsid = true; td = mc_tpld_take_ref(topology); server_stream = _mongoc_cluster_create_server_stream(td.ptr, handshake_sd, stream); mc_tpld_drop_ref(&td); if (!server_stream) { bson_destroy(&command); return false; } r = mongoc_cluster_run_command_parts(cluster, server_stream, &parts, NULL, &error); mongoc_server_stream_cleanup(server_stream); bson_destroy(&command); if (!r) { mc_tpld_modification tdmod; mongoc_cluster_disconnect_node(cluster, server_id); tdmod = mc_tpld_modify_begin(topology); /* invalidate_server() is okay if 'server_id' was already removed. */ mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, &error); mc_tpld_modify_commit(tdmod); } } return r; } bool mongoc_cluster_legacy_rpc_sendv_to_server(mongoc_cluster_t *cluster, mcd_rpc_message *rpc, mongoc_server_stream_t *server_stream, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(server_stream); BSON_ASSERT_PARAM(error); ENTRY; bool ret = false; void *compressed_data = NULL; size_t compressed_data_len = 0u; mongoc_iovec_t *iovecs = NULL; size_t num_iovecs = 0u; if (cluster->client->in_exhaust) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_IN_EXHAUST, "a cursor derived from this client is in exhaust"); GOTO(done); } const int32_t compressor_id = mongoc_server_description_compressor_id(server_stream->sd); if (compressor_id != -1 && !mcd_rpc_message_compress(rpc, compressor_id, _compression_level_from_uri(compressor_id, cluster->uri), &compressed_data, &compressed_data_len, error)) { GOTO(done); } const uint32_t server_id = server_stream->sd->id; const int32_t max_msg_size = mongoc_server_stream_max_msg_size(server_stream); const int32_t message_length = mcd_rpc_header_get_message_length(rpc); if (message_length > max_msg_size) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_TOO_BIG, "attempted to send an RPC message with length %" PRId32 " which exceeds the maximum allowed length %" PRId32, message_length, max_msg_size); GOTO(done); } iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); mcd_rpc_message_egress(rpc); if (!_mongoc_stream_writev_full(server_stream->stream, iovecs, num_iovecs, cluster->sockettimeoutms, error)) { GOTO(done); } _mongoc_topology_update_last_used(cluster->client->topology, server_id); ret = true; done: bson_free(iovecs); bson_free(compressed_data); RETURN(ret); } bool mongoc_cluster_try_recv(mongoc_cluster_t *cluster, mcd_rpc_message *rpc, mongoc_buffer_t *buffer, mongoc_server_stream_t *server_stream, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(server_stream); BSON_ASSERT_PARAM(error); ENTRY; bool ret = false; TRACE("Waiting for reply from server_id \"%u\"", server_stream->sd->id); const size_t offset = buffer->len; if (!_mongoc_buffer_append_from_stream( buffer, server_stream->stream, sizeof(int32_t), cluster->sockettimeoutms, error)) { MONGOC_DEBUG("could not read message length, stream probably closed or timed out"); mongoc_counter_protocol_ingress_error_inc(); _handle_network_error(cluster, server_stream, error); GOTO(done); } const int32_t message_length = mlib_read_i32le(buffer->data + offset); const int32_t max_msg_size = mongoc_server_stream_max_msg_size(server_stream); if (message_length < message_header_length || message_length > max_msg_size) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "message length %" PRId32 " is not within valid range of %" PRId32 "-%" PRId32 " bytes", message_header_length, message_length, server_stream->sd->max_msg_size); _handle_network_error(cluster, server_stream, error); mongoc_counter_protocol_ingress_error_inc(); GOTO(done); } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); if (!_mongoc_buffer_append_from_stream( buffer, server_stream->stream, remaining_bytes, cluster->sockettimeoutms, error)) { _handle_network_error(cluster, server_stream, error); mongoc_counter_protocol_ingress_error_inc(); GOTO(done); } if (!mcd_rpc_message_from_data_in_place(rpc, buffer->data + offset, (size_t)message_length, NULL)) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "failed to decode reply from server"); _handle_network_error(cluster, server_stream, error); mongoc_counter_protocol_ingress_error_inc(); GOTO(done); } mcd_rpc_message_ingress(rpc); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "could not decompress server reply"); GOTO(done); } if (decompressed_data) { _mongoc_buffer_destroy(buffer); _mongoc_buffer_init(buffer, decompressed_data, decompressed_data_len, NULL, NULL); } ret = true; done: return ret; } static void network_error_reply(bson_t *reply, const mongoc_cmd_t *cmd) { bson_array_builder_t *labels; if (reply) { bson_init(reply); } if (cmd->session) { if (cmd->session->server_session) { cmd->session->server_session->dirty = true; } /* Transactions Spec defines TransientTransactionError: "Any * network error or server selection error encountered running any * command besides commitTransaction in a transaction. In the case * of command errors, the server adds the label; in the case of * network errors or server selection errors where the client * receives no server reply, the client adds the label." */ if (_mongoc_client_session_in_txn(cmd->session) && !cmd->is_txn_finish) { /* Transaction Spec: "Drivers MUST unpin a ClientSession when a command * within a transaction, including commitTransaction and * abortTransaction, * fails with a TransientTransactionError". If we're about to add * a TransientTransactionError label due to a client side error then we * unpin. If commitTransaction/abortTransation includes a label in the * server reply, we unpin in _mongoc_client_session_handle_reply. */ cmd->session->server_id = 0; if (!reply) { return; } BSON_APPEND_ARRAY_BUILDER_BEGIN(reply, "errorLabels", &labels); bson_array_builder_append_utf8(labels, TRANSIENT_TXN_ERR, -1); bson_append_array_builder_end(reply, labels); } } } static bool _mongoc_cluster_run_opmsg_send( mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, mcd_rpc_message *rpc, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(reply); BSON_ASSERT_PARAM(error); mongoc_server_stream_t *const server_stream = cmd->server_stream; const uint32_t flags = (cmd->is_acknowledged ? MONGOC_OP_MSG_FLAG_NONE : MONGOC_OP_MSG_FLAG_MORE_TO_COME) | (cmd->op_msg_is_exhaust ? MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED : MONGOC_OP_MSG_FLAG_NONE); { int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(rpc, 0); message_length += mcd_rpc_header_set_request_id(rpc, ++cluster->request_id); message_length += mcd_rpc_header_set_response_to(rpc, 0); message_length += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_MSG); BSON_ASSERT(cmd->payloads_count <= MONGOC_CMD_PAYLOADS_COUNT_MAX); // Reserve one section for the body (kind 0) and any needed sections for document sequences (kind 1) mcd_rpc_op_msg_set_sections_count(rpc, 1u + cmd->payloads_count); message_length += mcd_rpc_op_msg_set_flag_bits(rpc, flags); message_length += mcd_rpc_op_msg_section_set_kind(rpc, 0u, 0); message_length += mcd_rpc_op_msg_section_set_body(rpc, 0u, bson_get_data(cmd->command)); for (size_t i = 0; i < cmd->payloads_count; i++) { const mongoc_cmd_payload_t payload = cmd->payloads[i]; BSON_ASSERT(mlib_in_range(size_t, payload.size)); const size_t section_length = sizeof(int32_t) + strlen(payload.identifier) + 1u + (size_t)payload.size; BSON_ASSERT(mlib_in_range(int32_t, section_length)); size_t section_idx = 1u + i; message_length += mcd_rpc_op_msg_section_set_kind(rpc, section_idx, 1); message_length += mcd_rpc_op_msg_section_set_length(rpc, section_idx, (int32_t)section_length); message_length += mcd_rpc_op_msg_section_set_identifier(rpc, section_idx, payload.identifier); message_length += mcd_rpc_op_msg_section_set_document_sequence(rpc, section_idx, payload.documents, (size_t)payload.size); } mcd_rpc_message_set_length(rpc, message_length); } void *compressed_data = NULL; size_t compressed_data_len = 0u; if (mongoc_cmd_is_compressible(cmd)) { const int32_t compressor_id = mongoc_server_description_compressor_id(server_stream->sd); TRACE("Function '%s' is compressible: %d", cmd->command_name, compressor_id); if (compressor_id != -1 && !mcd_rpc_message_compress(rpc, compressor_id, _compression_level_from_uri(compressor_id, cluster->uri), &compressed_data, &compressed_data_len, error)) { RUN_CMD_ERR_DECORATE; _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); return false; } } size_t num_iovecs = 0u; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); mcd_rpc_message_egress(rpc); const bool res = _mongoc_stream_writev_full(server_stream->stream, iovecs, num_iovecs, cluster->sockettimeoutms, error); if (!res) { RUN_CMD_ERR_DECORATE; _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); } bson_free(iovecs); bson_free(compressed_data); return res; } static bool _mongoc_cluster_run_opmsg_recv( mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, mcd_rpc_message *rpc, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(reply); BSON_ASSERT_PARAM(error); bool ret = false; mongoc_server_stream_t *const server_stream = cmd->server_stream; mongoc_buffer_t buffer; _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); if (!_mongoc_buffer_append_from_stream( &buffer, server_stream->stream, sizeof(int32_t), cluster->sockettimeoutms, error)) { MONGOC_DEBUG("could not read message length, stream probably closed or timed out"); RUN_CMD_ERR_DECORATE; _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } const int32_t message_length = mlib_read_i32le(buffer.data); if (message_length < message_header_length || message_length > server_stream->sd->max_msg_size) { RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "message length %" PRId32 " is not within valid range of %" PRId32 "-%" PRId32 " bytes", message_header_length, message_length, server_stream->sd->max_msg_size); _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); if (!_mongoc_buffer_append_from_stream( &buffer, server_stream->stream, remaining_bytes, cluster->sockettimeoutms, error)) { RUN_CMD_ERR_DECORATE; _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } if (!mcd_rpc_message_from_data_in_place(rpc, buffer.data, buffer.len, NULL)) { RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed server message"); _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } mcd_rpc_message_ingress(rpc); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "could not decompress message from server"); _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); GOTO(done); } if (decompressed_data) { _mongoc_buffer_destroy(&buffer); _mongoc_buffer_init(&buffer, decompressed_data, decompressed_data_len, NULL, NULL); } // CDRIVER-5584 { const int32_t op_code = mcd_rpc_header_get_op_code(rpc); if (op_code != MONGOC_OP_CODE_MSG) { RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed message from server: expected opCode %" PRId32 ", got %" PRId32, MONGOC_OP_CODE_MSG, op_code); _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } } bson_t body; if (!mcd_rpc_message_get_body(rpc, &body)) { RUN_CMD_ERR(MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed message from server"); _handle_network_error(cluster, server_stream, error); server_stream->stream = NULL; network_error_reply(reply, cmd); goto done; } cluster->client->in_exhaust = (mcd_rpc_op_msg_get_flag_bits(rpc) & MONGOC_OP_MSG_FLAG_MORE_TO_COME) != 0u; _mongoc_topology_update_cluster_time(cluster->client->topology, &body); ret = _mongoc_cmd_check_ok(&body, cluster->client->error_api_version, error); if (cmd->session) { _mongoc_client_session_handle_reply(cmd->session, cmd->is_acknowledged, cmd->command_name, &body); } bson_copy_to(&body, reply); bson_destroy(&body); done: _mongoc_buffer_destroy(&buffer); return ret; } static bool mongoc_cluster_run_opmsg(mongoc_cluster_t *cluster, const mongoc_cmd_t *cmd, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(reply); BSON_ASSERT_PARAM(error); if (!cmd->command_name) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty command document"); bson_init(reply); return false; } if (!cmd->op_msg_is_exhaust && cluster->client->in_exhaust) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_IN_EXHAUST, "another cursor derived from this client is in exhaust"); bson_init(reply); return false; } bool ret = false; mcd_rpc_message *const rpc = mcd_rpc_message_new(); if (!cluster->client->in_exhaust && !_mongoc_cluster_run_opmsg_send(cluster, cmd, rpc, reply, error)) { goto done; } if (!cmd->is_acknowledged) { // Nothing more to do. bson_init(reply); ret = true; goto done; } mcd_rpc_message_reset(rpc); if (!_mongoc_cluster_run_opmsg_recv(cluster, cmd, rpc, reply, error)) { goto done; } ret = true; done: mcd_rpc_message_destroy(rpc); return ret; } bool mcd_rpc_message_compress(mcd_rpc_message *rpc, int32_t compressor_id, int32_t compression_level, void **data, size_t *data_len, bson_error_t *error) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(data_len); bool ret = false; char *uncompressed_message = NULL; char *compressed_message = NULL; mongoc_iovec_t *iovecs = NULL; const int32_t original_message_length = mcd_rpc_header_get_message_length(rpc); // compressedMessage does not include msgHeader fields. BSON_ASSERT(original_message_length >= message_header_length); const size_t uncompressed_size = (size_t)(original_message_length - message_header_length); BSON_ASSERT(mlib_in_range(int32_t, uncompressed_size)); const size_t estimated_compressed_size = mongoc_compressor_max_compressed_length(compressor_id, uncompressed_size); if (estimated_compressed_size == 0u) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Could not determine compression bounds for %s", mongoc_compressor_id_to_name(compressor_id)); goto fail; } // Store values before they are converted to little endian. const int32_t request_id = mcd_rpc_header_get_request_id(rpc); const int32_t response_to = mcd_rpc_header_get_response_to(rpc); const int32_t op_code = mcd_rpc_header_get_op_code(rpc); size_t num_iovecs; iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); uncompressed_message = bson_malloc(uncompressed_size); BSON_ASSERT(_mongoc_cluster_buffer_iovec(iovecs, num_iovecs, message_header_length, uncompressed_message) == uncompressed_size); compressed_message = bson_malloc(estimated_compressed_size); // This value may be passed as an argument to an in-out parameter depending // on the compressor, not just an out-parameter. size_t compressed_size = estimated_compressed_size; if (!mongoc_compress(compressor_id, compression_level, uncompressed_message, uncompressed_size, compressed_message, &compressed_size)) { MONGOC_WARNING("Could not compress data with %s", mongoc_compressor_id_to_name(compressor_id)); goto fail; } mcd_rpc_message_reset(rpc); { int32_t message_len = 0; message_len += mcd_rpc_header_set_message_length(rpc, 0); message_len += mcd_rpc_header_set_request_id(rpc, request_id); message_len += mcd_rpc_header_set_response_to(rpc, response_to); message_len += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_COMPRESSED); message_len += mcd_rpc_op_compressed_set_original_opcode(rpc, op_code); message_len += mcd_rpc_op_compressed_set_uncompressed_size(rpc, (int32_t)uncompressed_size); message_len += mcd_rpc_op_compressed_set_compressor_id(rpc, (uint8_t)compressor_id); message_len += mcd_rpc_op_compressed_set_compressed_message(rpc, compressed_message, compressed_size); mcd_rpc_message_set_length(rpc, message_len); } *data = compressed_message; *data_len = compressed_size; compressed_message = NULL; ret = true; fail: bson_free(compressed_message); bson_free(uncompressed_message); bson_free(iovecs); return ret; } bool mcd_rpc_message_decompress(mcd_rpc_message *rpc, void **data, size_t *data_len) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(data_len); BSON_ASSERT(mcd_rpc_header_get_op_code(rpc) == MONGOC_OP_CODE_COMPRESSED); const int32_t uncompressed_size_raw = mcd_rpc_op_compressed_get_uncompressed_size(rpc); // Malformed message: invalid uncompressedSize. if (BSON_UNLIKELY(uncompressed_size_raw < 0)) { return false; } const size_t uncompressed_size = (size_t)uncompressed_size_raw; // Malformed message: original message length is not representable. if (BSON_UNLIKELY(uncompressed_size > SIZE_MAX - message_header_length)) { return false; } // uncompressedSize does not include msgHeader fields. const size_t original_message_length = message_header_length + uncompressed_size; uint8_t *const ptr = bson_malloc(original_message_length); const int32_t message_length = original_message_length; const int32_t request_id = mcd_rpc_header_get_request_id(rpc); const int32_t response_to = mcd_rpc_header_get_response_to(rpc); const int32_t op_code = mcd_rpc_op_compressed_get_original_opcode(rpc); // Populate the msgHeader fields. uint8_t *out = ptr; out = mlib_write_i32le(out, message_length); out = mlib_write_i32le(out, request_id); out = mlib_write_i32le(out, response_to); mlib_write_i32le(out, op_code); // This value may be passed as an argument to an in-out parameter depending // on the compressor, not just an out-parameter. size_t actual_uncompressed_size = uncompressed_size; // Populate the rest of the uncompressed message. if (!mongoc_uncompress(mcd_rpc_op_compressed_get_compressor_id(rpc), mcd_rpc_op_compressed_get_compressed_message(rpc), mcd_rpc_op_compressed_get_compressed_message_length(rpc), ptr + message_header_length, &actual_uncompressed_size)) { bson_free(ptr); return false; } // Malformed message: size inconsistency. if (BSON_UNLIKELY(uncompressed_size != actual_uncompressed_size)) { bson_free(ptr); return false; } *data_len = original_message_length; *data = ptr; // Ownership transfer. mcd_rpc_message_reset(rpc); return mcd_rpc_message_from_data_in_place(rpc, *data, *data_len, NULL); } bool mcd_rpc_message_decompress_if_necessary(mcd_rpc_message *rpc, void **data, size_t *data_len) { BSON_ASSERT_PARAM(rpc); BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(data_len); if (mcd_rpc_header_get_op_code(rpc) != MONGOC_OP_CODE_COMPRESSED) { // Nothing to do. *data = NULL; *data_len = 0u; return true; } return mcd_rpc_message_decompress(rpc, data, data_len); } bool mongoc_cluster_run_retryable_write(mongoc_cluster_t *cluster, mongoc_cmd_t *cmd, bool is_retryable_write, mongoc_server_stream_t **retry_server_stream, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(cluster); BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(retry_server_stream); BSON_ASSERT_PARAM(reply); BSON_OPTIONAL_PARAM(error); bool ret; // `can_retry` is set to false on retry. A retry may only happen once. bool can_retry = is_retryable_write; // Increment the transaction number for the first attempt of each retryable write command. if (is_retryable_write) { bson_iter_t txn_number_iter; BSON_ASSERT(bson_iter_init_find(&txn_number_iter, cmd->command, "txnNumber")); bson_iter_overwrite_int64(&txn_number_iter, ++cmd->session->server_session->txn_number); } // Store the original error and reply if needed. struct { bson_t reply; bson_error_t error; bool set; } original_error = {.reply = {0}, .error = {0}, .set = false}; // Ensure `*retry_server_stream` is always valid or null. *retry_server_stream = NULL; retry: ret = mongoc_cluster_run_command_monitored(cluster, cmd, reply, error); if (is_retryable_write) { _mongoc_write_error_handle_labels(ret, error, reply, cmd->server_stream->sd); _mongoc_write_error_update_if_unsupported_storage_engine(ret, error, reply); } // If a retryable error is encountered and the write is retryable, select a new writable stream and retry. If server // selection fails or the selected server does not support retryable writes, fall through and allow the original // error to be reported. if (can_retry && _mongoc_write_error_get_type(reply) == MONGOC_WRITE_ERR_RETRY) { can_retry = false; // Only retry once. // Select a server. { mongoc_deprioritized_servers_t *const ds = mongoc_deprioritized_servers_new(); // If talking to a sharded cluster, deprioritize the just-used mongos to prefer a new mongos for the retry. mongoc_deprioritized_servers_add_if_sharded(ds, cmd->server_stream->topology_type, cmd->server_stream->sd); const mongoc_ss_log_context_t ss_log_context = { .operation = cmd->command_name, .has_operation_id = true, .operation_id = cmd->operation_id}; *retry_server_stream = mongoc_cluster_stream_for_writes( cluster, &ss_log_context, cmd->session, ds, NULL /* reply */, NULL /* error */); mongoc_deprioritized_servers_destroy(ds); } if (*retry_server_stream) { cmd->server_stream = *retry_server_stream; // Non-owning. { // Store the original error and reply before retry. BSON_ASSERT(!original_error.set); // Retry only happens once. original_error.set = true; bson_copy_to(reply, &original_error.reply); if (error) { original_error.error = *error; } } bson_destroy(reply); GOTO(retry); } } // If a retry attempt fails with an error labeled NoWritesPerformed, drivers MUST return the original error. if (original_error.set && mongoc_error_has_label(reply, "NoWritesPerformed")) { if (error) { *error = original_error.error; } bson_destroy(reply); bson_copy_to(&original_error.reply, reply); } if (original_error.set) { bson_destroy(&original_error.reply); } RETURN(ret); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cmd-private.h000066400000000000000000000107361511661753600250430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include /* * Internal struct to represent a command we will send to the server - command * parameters are collected in a mongoc_cmd_parts_t until we know the server's * wire version and whether it is mongos, then we collect the parts into a * mongoc_cmd_t, and gather that into an RPC message. */ #ifndef MONGOC_CMD_PRIVATE_H #define MONGOC_CMD_PRIVATE_H #include #include #include #include #include #include BSON_BEGIN_DECLS #define MONGOC_DEFAULT_RETRYREADS true /* retryWrites requires sessions, which require crypto */ #ifdef MONGOC_ENABLE_CRYPTO #define MONGOC_DEFAULT_RETRYWRITES true #else #define MONGOC_DEFAULT_RETRYWRITES false #endif typedef enum { MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_UNKNOWN, MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_YES, MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_NO } mongoc_cmd_parts_allow_txn_number_t; // `mongoc_cmd_payload_t` represents a document sequence (OP_MSG Section with payloadType=1). typedef struct { int32_t size; const char *identifier; const uint8_t *documents; } mongoc_cmd_payload_t; // OP_MSG supports any number of document sequences. Increase array size to support more document sequences. #define MONGOC_CMD_PAYLOADS_COUNT_MAX 2 typedef struct _mongoc_cmd_t { const char *db_name; mongoc_query_flags_t query_flags; const bson_t *command; const char *command_name; size_t payloads_count; // `payloads[i]` may be read only when `0 <= i < payloads_count`. mongoc_cmd_payload_t payloads[MONGOC_CMD_PAYLOADS_COUNT_MAX]; mongoc_server_stream_t *server_stream; int64_t operation_id; mongoc_client_session_t *session; mongoc_server_api_t *api; bool is_acknowledged; bool is_txn_finish; bool op_msg_is_exhaust; } mongoc_cmd_t; typedef struct _mongoc_cmd_parts_t { mongoc_cmd_t assembled; mongoc_query_flags_t user_query_flags; const bson_t *body; bson_t read_concern_document; bson_t write_concern_document; bson_t extra; const mongoc_read_prefs_t *read_prefs; bson_t assembled_body; bool is_read_command; bool is_write_command; bool prohibit_lsid; mongoc_cmd_parts_allow_txn_number_t allow_txn_number; bool is_retryable_read; bool is_retryable_write; bool has_temp_session; mongoc_client_t *client; mongoc_server_api_t *api; } mongoc_cmd_parts_t; void mongoc_cmd_parts_init(mongoc_cmd_parts_t *op, mongoc_client_t *client, const char *db_name, mongoc_query_flags_t user_query_flags, const bson_t *command_body); void mongoc_cmd_parts_set_session(mongoc_cmd_parts_t *parts, mongoc_client_session_t *cs); void mongoc_cmd_parts_set_server_api(mongoc_cmd_parts_t *parts, mongoc_server_api_t *api); bool mongoc_cmd_parts_append_opts(mongoc_cmd_parts_t *parts, bson_iter_t *iter, bson_error_t *error); bool mongoc_cmd_parts_set_read_concern(mongoc_cmd_parts_t *parts, const mongoc_read_concern_t *rc, bson_error_t *error); bool mongoc_cmd_parts_set_write_concern(mongoc_cmd_parts_t *parts, const mongoc_write_concern_t *wc, bson_error_t *error); bool mongoc_cmd_parts_append_read_write(mongoc_cmd_parts_t *parts, mongoc_read_write_opts_t *rw_opts, bson_error_t *error); bool mongoc_cmd_parts_assemble(mongoc_cmd_parts_t *parts, mongoc_server_stream_t *server_stream, bson_error_t *error); bool mongoc_cmd_is_compressible(const mongoc_cmd_t *cmd); void mongoc_cmd_parts_cleanup(mongoc_cmd_parts_t *op); bool _is_retryable_read(const mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream); void _mongoc_cmd_append_payload_as_array(const mongoc_cmd_t *cmd, bson_t *out); void _mongoc_cmd_append_server_api(bson_t *command_body, const mongoc_server_api_t *api); BSON_END_DECLS #endif /* MONGOC_CMD_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cmd.c000066400000000000000000001042701511661753600233630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include /* For strcasecmp on Windows */ #include void mongoc_cmd_parts_init(mongoc_cmd_parts_t *parts, mongoc_client_t *client, const char *db_name, mongoc_query_flags_t user_query_flags, const bson_t *command_body) { BSON_ASSERT_PARAM(client); parts->body = command_body; parts->user_query_flags = user_query_flags; parts->read_prefs = NULL; parts->is_read_command = false; parts->is_write_command = false; parts->prohibit_lsid = false; parts->allow_txn_number = MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_UNKNOWN; parts->is_retryable_read = false; parts->is_retryable_write = false; parts->has_temp_session = false; parts->client = client; bson_init(&parts->read_concern_document); bson_init(&parts->write_concern_document); bson_init(&parts->extra); bson_init(&parts->assembled_body); parts->assembled.db_name = db_name; parts->assembled.command = NULL; parts->assembled.query_flags = MONGOC_QUERY_NONE; parts->assembled.op_msg_is_exhaust = false; parts->assembled.payloads_count = 0; memset(parts->assembled.payloads, 0, sizeof parts->assembled.payloads); parts->assembled.session = NULL; parts->assembled.is_acknowledged = true; parts->assembled.is_txn_finish = false; } /* *-------------------------------------------------------------------------- * * mongoc_cmd_parts_set_session -- * * Set the client session field. * * Side effects: * Aborts if the command is assembled or if mongoc_cmd_parts_append_opts * was called before. * *-------------------------------------------------------------------------- */ void mongoc_cmd_parts_set_session(mongoc_cmd_parts_t *parts, mongoc_client_session_t *cs) { BSON_ASSERT(parts); BSON_ASSERT(!parts->assembled.command); BSON_ASSERT(!parts->assembled.session); parts->assembled.session = cs; } /* *-------------------------------------------------------------------------- * * mongoc_cmd_parts_append_opts -- * * Take an iterator over user-supplied options document and append the * options to @parts->command_extra, taking the selected server's max * wire version into account. * * Return: * True if the options were successfully applied. If any options are * invalid, returns false and fills out @error. In that case @parts is * invalid and must not be used. * * Side effects: * May partly apply options before returning an error. * *-------------------------------------------------------------------------- */ bool mongoc_cmd_parts_append_opts(mongoc_cmd_parts_t *parts, bson_iter_t *iter, bson_error_t *error) { mongoc_client_session_t *cs = NULL; mongoc_write_concern_t *wc; uint32_t len; const uint8_t *data; bson_t read_concern; const char *to_append; ENTRY; /* not yet assembled */ BSON_ASSERT(!parts->assembled.command); while (bson_iter_next(iter)) { if (BSON_ITER_IS_KEY(iter, "writeConcern")) { wc = _mongoc_write_concern_new_from_iter(iter, error); if (!wc) { RETURN(false); } if (!mongoc_cmd_parts_set_write_concern(parts, wc, error)) { mongoc_write_concern_destroy(wc); RETURN(false); } mongoc_write_concern_destroy(wc); continue; } else if (BSON_ITER_IS_KEY(iter, "readConcern")) { if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Invalid readConcern"); RETURN(false); } /* add readConcern later, once we know about causal consistency */ bson_iter_document(iter, &len, &data); BSON_ASSERT(bson_init_static(&read_concern, data, (size_t)len)); bson_destroy(&parts->read_concern_document); bson_copy_to(&read_concern, &parts->read_concern_document); continue; } else if (BSON_ITER_IS_KEY(iter, "sessionId")) { BSON_ASSERT(!parts->assembled.session); if (!_mongoc_client_session_from_iter(parts->client, iter, &cs, error)) { RETURN(false); } parts->assembled.session = cs; continue; } else if (BSON_ITER_IS_KEY(iter, "serverId") || BSON_ITER_IS_KEY(iter, "maxAwaitTimeMS") || BSON_ITER_IS_KEY(iter, "exhaust")) { continue; } to_append = bson_iter_key(iter); if (!bson_append_iter(&parts->extra, to_append, -1, iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Failed to append \"%s\" to create command.", to_append); RETURN(false); } } RETURN(true); } #define OPTS_ERR(_code, ...) \ do { \ _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_##_code, __VA_ARGS__); \ RETURN(false); \ } while (0) /* set readConcern if allowed, otherwise error */ bool mongoc_cmd_parts_set_read_concern(mongoc_cmd_parts_t *parts, const mongoc_read_concern_t *rc, bson_error_t *error) { const char *command_name; ENTRY; /* In a txn, set read concern in mongoc_cmd_parts_assemble, not here. * * Transactions Spec: "The readConcern MUST NOT be inherited from the * collection, database, or client associated with the driver method that * invokes the first command." */ if (_mongoc_client_session_in_txn(parts->assembled.session)) { RETURN(true); } command_name = _mongoc_get_command_name(parts->body); if (!command_name) { OPTS_ERR(COMMAND_INVALID_ARG, "Empty command document"); } if (mongoc_read_concern_is_default(rc)) { RETURN(true); } bson_destroy(&parts->read_concern_document); bson_copy_to(_mongoc_read_concern_get_bson((mongoc_read_concern_t *)rc), &parts->read_concern_document); RETURN(true); } /* set writeConcern if allowed, otherwise ignore - unlike set_read_concern, it's * the caller's responsibility to check if writeConcern is supported */ bool mongoc_cmd_parts_set_write_concern(mongoc_cmd_parts_t *parts, const mongoc_write_concern_t *wc, bson_error_t *error) { ENTRY; if (!wc) { RETURN(true); } const char *const command_name = _mongoc_get_command_name(parts->body); if (!command_name) { OPTS_ERR(COMMAND_INVALID_ARG, "Empty command document"); } parts->assembled.is_acknowledged = mongoc_write_concern_is_acknowledged(wc); bson_destroy(&parts->write_concern_document); bson_copy_to(_mongoc_write_concern_get_bson((mongoc_write_concern_t *)wc), &parts->write_concern_document); RETURN(true); } /* *-------------------------------------------------------------------------- * * mongoc_cmd_parts_append_read_write -- * * Append user-supplied options to @parts->command_extra, taking the * selected server's max wire version into account. * * Return: * True if the options were successfully applied. If any options are * invalid, returns false and fills out @error. In that case @parts is * invalid and must not be used. * * Side effects: * May partly apply options before returning an error. * *-------------------------------------------------------------------------- */ bool mongoc_cmd_parts_append_read_write(mongoc_cmd_parts_t *parts, mongoc_read_write_opts_t *rw_opts, bson_error_t *error) { ENTRY; /* not yet assembled */ BSON_ASSERT(!parts->assembled.command); if (!bson_empty(&rw_opts->collation)) { if (!bson_append_document(&parts->extra, "collation", 9, &rw_opts->collation)) { OPTS_ERR(COMMAND_INVALID_ARG, "'opts' with 'collation' is too large"); } } if (!mongoc_cmd_parts_set_write_concern(parts, rw_opts->writeConcern, error)) { RETURN(false); } /* process explicit read concern */ if (!bson_empty(&rw_opts->readConcern)) { /* save readConcern for later, once we know about causal consistency */ bson_destroy(&parts->read_concern_document); bson_copy_to(&rw_opts->readConcern, &parts->read_concern_document); } if (rw_opts->client_session) { BSON_ASSERT(!parts->assembled.session); parts->assembled.session = rw_opts->client_session; } if (!bson_concat(&parts->extra, &rw_opts->extra)) { OPTS_ERR(COMMAND_INVALID_ARG, "'opts' with extra fields is too large"); } RETURN(true); } #undef OPTS_ERR static void _mongoc_cmd_parts_ensure_copied(mongoc_cmd_parts_t *parts) { if (parts->assembled.command == parts->body) { bson_concat(&parts->assembled_body, parts->body); bson_concat(&parts->assembled_body, &parts->extra); parts->assembled.command = &parts->assembled_body; } } static void _mongoc_cmd_parts_add_write_concern(mongoc_cmd_parts_t *parts) { if (!bson_empty(&parts->write_concern_document)) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "writeConcern", 12, &parts->write_concern_document); } } /* The server type must be mongos, or message must be OP_MSG. */ static void _mongoc_cmd_parts_add_read_prefs(bson_t *query, const mongoc_read_prefs_t *prefs) { bson_t child; bson_append_document_begin(query, "$readPreference", 15, &child); mongoc_read_prefs_append_contents_to_bson(prefs, &child, MONGOC_READ_PREFS_CONTENT_FLAG_MODE | MONGOC_READ_PREFS_CONTENT_FLAG_TAGS | MONGOC_READ_PREFS_CONTENT_FLAG_MAX_STALENESS_SECONDS | MONGOC_READ_PREFS_CONTENT_FLAG_HEDGE); bson_append_document_end(query, &child); } static void _iter_concat(bson_t *dst, bson_iter_t *iter) { uint32_t len; const uint8_t *data; bson_t src; bson_iter_document(iter, &len, &data); BSON_ASSERT(bson_init_static(&src, data, len)); BSON_ASSERT(bson_concat(dst, &src)); } /* Update result with the read prefs. Server must be mongos. */ static void _mongoc_cmd_parts_assemble_mongos(mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream) { mongoc_read_mode_t mode; const bson_t *tags = NULL; int64_t max_staleness_seconds = MONGOC_NO_MAX_STALENESS; const bson_t *hedge = NULL; bool add_read_prefs = false; bson_t query; bson_iter_t dollar_query; bool has_dollar_query = false; bool requires_read_concern; bool requires_write_concern; ENTRY; mode = mongoc_read_prefs_get_mode(parts->read_prefs); if (parts->read_prefs) { max_staleness_seconds = mongoc_read_prefs_get_max_staleness_seconds(parts->read_prefs); tags = mongoc_read_prefs_get_tags(parts->read_prefs); mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); hedge = mongoc_read_prefs_get_hedge(parts->read_prefs); mlib_diagnostic_pop(); } if (server_stream->must_use_primary) { /* Server selection has overriden the read mode used to generate this * server stream. This has effects on the body of the message that we send * to the server */ mode = MONGOC_READ_PRIMARY; } /* Server Selection Spec says: * * For mode 'primary', drivers MUST NOT set the secondaryOk wire protocol * flag and MUST NOT use $readPreference * * For mode 'secondary', drivers MUST set the secondaryOk wire protocol flag * and MUST also use $readPreference * * For mode 'primaryPreferred', drivers MUST set the secondaryOk wire * protocol flag and MUST also use $readPreference * * For mode 'secondaryPreferred', drivers MUST set the secondaryOk wire * protocol flag. If the read preference contains a non-empty tag_sets * parameter, maxStalenessSeconds is a positive integer, or the hedge * parameter is non-empty, drivers MUST use $readPreference; otherwise, * drivers MUST NOT use $readPreference * * For mode 'nearest', drivers MUST set the secondaryOk wire protocol flag * and MUST also use $readPreference */ switch (mode) { case MONGOC_READ_PRIMARY: break; case MONGOC_READ_SECONDARY_PREFERRED: if (!bson_empty0(tags) || max_staleness_seconds > 0 || !bson_empty0(hedge)) { add_read_prefs = true; } parts->assembled.query_flags |= MONGOC_QUERY_SECONDARY_OK; break; case MONGOC_READ_PRIMARY_PREFERRED: case MONGOC_READ_SECONDARY: case MONGOC_READ_NEAREST: default: parts->assembled.query_flags |= MONGOC_QUERY_SECONDARY_OK; add_read_prefs = true; } requires_read_concern = !bson_empty(&parts->read_concern_document) && strcmp(parts->assembled.command_name, "getMore") != 0; requires_write_concern = !bson_empty(&parts->write_concern_document); if (add_read_prefs) { /* produce {$query: {user query, readConcern}, $readPreference: ... } */ bson_append_document_begin(&parts->assembled_body, "$query", 6, &query); if (bson_iter_init_find(&dollar_query, parts->body, "$query")) { /* user provided something like {$query: {key: "x"}} */ has_dollar_query = true; _iter_concat(&query, &dollar_query); } else { bson_concat(&query, parts->body); } bson_concat(&query, &parts->extra); if (requires_read_concern) { bson_append_document(&query, "readConcern", 11, &parts->read_concern_document); } if (requires_write_concern) { bson_append_document(&query, "writeConcern", 12, &parts->write_concern_document); } bson_append_document_end(&parts->assembled_body, &query); _mongoc_cmd_parts_add_read_prefs(&parts->assembled_body, parts->read_prefs); if (has_dollar_query) { /* copy anything that isn't in user's $query */ bson_copy_to_excluding_noinit(parts->body, &parts->assembled_body, "$query", NULL); } parts->assembled.command = &parts->assembled_body; } else if (bson_iter_init_find(&dollar_query, parts->body, "$query")) { /* user provided $query, we have no read prefs */ bson_append_document_begin(&parts->assembled_body, "$query", 6, &query); _iter_concat(&query, &dollar_query); bson_concat(&query, &parts->extra); if (requires_read_concern) { bson_append_document(&query, "readConcern", 11, &parts->read_concern_document); } if (requires_write_concern) { bson_append_document(&query, "writeConcern", 12, &parts->write_concern_document); } bson_append_document_end(&parts->assembled_body, &query); /* copy anything that isn't in user's $query */ bson_copy_to_excluding_noinit(parts->body, &parts->assembled_body, "$query", NULL); parts->assembled.command = &parts->assembled_body; } else { if (requires_read_concern) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "readConcern", 11, &parts->read_concern_document); } _mongoc_cmd_parts_add_write_concern(parts); } if (!bson_empty(&parts->extra)) { /* if none of the above logic has merged "extra", do it now */ _mongoc_cmd_parts_ensure_copied(parts); } EXIT; } static void _mongoc_cmd_parts_assemble_mongod(mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream) { ENTRY; if (!parts->is_write_command) { switch (server_stream->topology_type) { case MONGOC_TOPOLOGY_SINGLE: /* Server Selection Spec: for topology type single and server types * besides mongos, "clients MUST always set the secondaryOk wire * protocol flag on reads to ensure that any server type can handle * the request." */ parts->assembled.query_flags |= MONGOC_QUERY_SECONDARY_OK; break; case MONGOC_TOPOLOGY_RS_NO_PRIMARY: case MONGOC_TOPOLOGY_RS_WITH_PRIMARY: /* Server Selection Spec: for RS topology types, "For all read * preferences modes except primary, clients MUST set the secondaryOk * wire protocol flag to ensure that any suitable server can handle the * request. Clients MUST NOT set the secondaryOk wire protocol flag if * the read preference mode is primary. */ if (parts->read_prefs && parts->read_prefs->mode != MONGOC_READ_PRIMARY) { parts->assembled.query_flags |= MONGOC_QUERY_SECONDARY_OK; } break; case MONGOC_TOPOLOGY_SHARDED: case MONGOC_TOPOLOGY_UNKNOWN: case MONGOC_TOPOLOGY_LOAD_BALANCED: case MONGOC_TOPOLOGY_DESCRIPTION_TYPES: default: /* must not call this function w/ sharded, load balanced, or unknown * topology type */ BSON_ASSERT(false); } } /* if (!parts->is_write_command) */ if (!bson_empty(&parts->extra)) { _mongoc_cmd_parts_ensure_copied(parts); } if (!bson_empty(&parts->read_concern_document) && strcmp(parts->assembled.command_name, "getMore") != 0) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "readConcern", 11, &parts->read_concern_document); } _mongoc_cmd_parts_add_write_concern(parts); EXIT; } static const bson_t * _largest_cluster_time(const bson_t *a, const bson_t *b) { if (!a) { return b; } if (!b) { return a; } if (_mongoc_cluster_time_greater(a, b)) { return a; } return b; } /* Check if the command should allow a transaction number if that has not * already been determined. * * This should only return true for write commands that are always retryable for * the server stream's wire version. * * The basic write commands (i.e. insert, update, delete) are intentionally * excluded here. While insert is always retryable, update and delete are only * retryable if they include no multi-document writes. Since it would be costly * to inspect the command document here, the bulk operation API explicitly sets * allow_txn_number for us. This means that insert, update, and delete are not * retryable if executed via mongoc_client_write_command_with_opts(); however, * documentation already instructs users not to use that for basic writes. */ static bool _allow_txn_number(const mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream) { /* There is no reason to call this function if allow_txn_number is set */ BSON_ASSERT(parts->allow_txn_number == MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_UNKNOWN); if (!parts->is_write_command) { return false; } if (server_stream->retry_attempted) { return false; } if (!parts->assembled.is_acknowledged) { return false; } if (!strcasecmp(parts->assembled.command_name, "findandmodify")) { return true; } return false; } /* Check if the write command should support retryable behavior. */ static bool _is_retryable_write(const mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream) { if (!parts->assembled.session) { return false; } if (!parts->is_write_command) { return false; } if (parts->allow_txn_number != MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_YES) { return false; } if (server_stream->retry_attempted) { return false; } if (server_stream->sd->type == MONGOC_SERVER_STANDALONE) { return false; } if (_mongoc_client_session_in_txn(parts->assembled.session)) { return false; } if (!mongoc_uri_get_option_as_bool(parts->client->uri, MONGOC_URI_RETRYWRITES, MONGOC_DEFAULT_RETRYWRITES)) { return false; } return true; } /* Check if the read command should support retryable behavior. */ bool _is_retryable_read(const mongoc_cmd_parts_t *parts, const mongoc_server_stream_t *server_stream) { if (!parts->is_read_command) { return false; } /* Commands that go through read_write_command helpers are also write * commands. Prohibit from read retry. */ if (parts->is_write_command) { return false; } if (server_stream->retry_attempted) { return false; } if (_mongoc_client_session_in_txn(parts->assembled.session)) { return false; } if (!mongoc_uri_get_option_as_bool(parts->client->uri, MONGOC_URI_RETRYREADS, MONGOC_DEFAULT_RETRYREADS)) { return false; } return true; } /* *-------------------------------------------------------------------------- * * mongoc_cmd_parts_assemble -- * * Assemble the command body, options, and read preference into one * command. * * Return: * True if the options were successfully applied. If any options are * invalid, returns false and fills out @error. In that case @parts is * invalid and must not be used. * * Side effects: * May partly assemble before returning an error. * mongoc_cmd_parts_cleanup should be called in all cases. * *-------------------------------------------------------------------------- */ bool mongoc_cmd_parts_assemble(mongoc_cmd_parts_t *parts, mongoc_server_stream_t *server_stream, bson_error_t *error) { mongoc_server_description_type_t server_type; mongoc_client_session_t *cs; const bson_t *cluster_time = NULL; mongoc_read_prefs_t *prefs = NULL; const char *cmd_name; bool is_get_more; const mongoc_read_prefs_t *prefs_ptr; mongoc_read_mode_t mode; bool ret = false; ENTRY; BSON_ASSERT(parts); BSON_ASSERT(server_stream); server_type = server_stream->sd->type; cs = parts->prohibit_lsid ? NULL : parts->assembled.session; /* Assembling the command depends on the type of server. If the server has * been invalidated, error. */ if (server_type == MONGOC_SERVER_UNKNOWN) { if (error) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot assemble command for invalidated server: %s", server_stream->sd->error.message); } RETURN(false); } /* must not be assembled already */ BSON_ASSERT(!parts->assembled.command); BSON_ASSERT(bson_empty(&parts->assembled_body)); /* begin with raw flags/cmd as assembled flags/cmd, might change below */ parts->assembled.command = parts->body; /* unused in OP_MSG: */ parts->assembled.query_flags = parts->user_query_flags; parts->assembled.server_stream = server_stream; cmd_name = parts->assembled.command_name = _mongoc_get_command_name(parts->assembled.command); if (!parts->assembled.command_name) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command document"); GOTO(done); } TRACE("Preparing '%s'", cmd_name); is_get_more = !strcmp(cmd_name, "getMore"); parts->assembled.is_txn_finish = !strcmp(cmd_name, "commitTransaction") || !strcmp(cmd_name, "abortTransaction"); if (!parts->is_write_command && IS_PREF_PRIMARY(parts->read_prefs) && server_stream->topology_type == MONGOC_TOPOLOGY_SINGLE && server_type != MONGOC_SERVER_MONGOS) { prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED); prefs_ptr = prefs; } else { prefs_ptr = parts->read_prefs; } mode = mongoc_read_prefs_get_mode(prefs_ptr); if (server_stream->must_use_primary) { /* Server selection may have overriden the read mode used to generate this * server stream. This has effects on the body of the message that we send * to the server */ mode = MONGOC_READ_PRIMARY; } if (mongoc_client_uses_server_api(parts->client) || mongoc_client_uses_loadbalanced(parts->client) || server_stream->sd->max_wire_version >= WIRE_VERSION_MIN) { if (!bson_has_field(parts->body, "$db")) { BSON_APPEND_UTF8(&parts->extra, "$db", parts->assembled.db_name); } if (cs && _mongoc_client_session_in_txn(cs)) { if (!IS_PREF_PRIMARY(cs->txn.opts.read_prefs) && !parts->is_write_command) { _mongoc_set_error(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Read preference in a transaction must be primary"); GOTO(done); } } else if (mode != MONGOC_READ_PRIMARY && server_type != MONGOC_SERVER_STANDALONE) { /* "Type Standalone: clients MUST NOT send the read preference to the * server" */ _mongoc_cmd_parts_add_read_prefs(&parts->extra, prefs_ptr); } if (!bson_empty(&parts->extra)) { _mongoc_cmd_parts_ensure_copied(parts); } /* If an explicit session was not provided and lsid is not prohibited, * attempt to create an implicit session (ignoring any errors). */ if (!cs && !parts->prohibit_lsid && parts->assembled.is_acknowledged) { cs = mongoc_client_start_session(parts->client, NULL, NULL); if (cs) { parts->assembled.session = cs; parts->has_temp_session = true; } } /* Driver Sessions Spec: "For unacknowledged writes with an explicit * session, drivers SHOULD raise an error.... Without an explicit * session, drivers SHOULD NOT use an implicit session." We intentionally * do not restrict this logic to parts->is_write_command, since * mongoc_client_command_with_opts() does not identify as a write * command but may still include a write concern. */ if (cs) { if (!parts->assembled.is_acknowledged) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use client session with unacknowledged command"); GOTO(done); } _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "lsid", 4, mongoc_client_session_get_lsid(cs)); cs->server_session->last_used_usec = bson_get_monotonic_time(); cluster_time = mongoc_client_session_get_cluster_time(cs); } /* Ensure we know if the write command allows a transaction number */ if (!_mongoc_client_session_txn_in_progress(cs) && parts->is_write_command && parts->allow_txn_number == MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_UNKNOWN) { parts->allow_txn_number = _allow_txn_number(parts, server_stream) ? MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_YES : MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_NO; } /* Determine if the command is retryable. If so, append txnNumber now * for future use and mark the command as such. */ if (_is_retryable_write(parts, server_stream)) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_int64(&parts->assembled_body, "txnNumber", 9, 0); parts->is_retryable_write = true; } /* Conversely, check if the command is retryable if it is a read. */ if (_is_retryable_read(parts, server_stream) && !is_get_more) { parts->is_retryable_read = true; } if (!bson_empty(&server_stream->cluster_time)) { cluster_time = _largest_cluster_time(&server_stream->cluster_time, cluster_time); } if (cluster_time && server_type != MONGOC_SERVER_STANDALONE) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "$clusterTime", 12, cluster_time); } /* Add versioned server api, if it is set. */ if (mongoc_client_uses_server_api(parts->client)) { _mongoc_cmd_append_server_api(&parts->assembled_body, parts->client->api); } if (!is_get_more) { if (cs) { /* Snapshot Sessions Spec: "Snapshot reads require MongoDB 5.0+." * Throw an error if snapshot is enabled and wire version is less * than 13 before potentially appending "snapshot" read concern. */ if (mongoc_session_opts_get_snapshot(&cs->opts) && server_stream->sd->max_wire_version < WIRE_VERSION_SNAPSHOT_READS) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Snapshot reads require MongoDB 5.0 or later"); GOTO(done); } _mongoc_cmd_parts_ensure_copied(parts); _mongoc_client_session_append_read_concern( cs, &parts->read_concern_document, parts->is_read_command, &parts->assembled_body); } else if (!bson_empty(&parts->read_concern_document)) { _mongoc_cmd_parts_ensure_copied(parts); bson_append_document(&parts->assembled_body, "readConcern", 11, &parts->read_concern_document); } } /* if transaction is in progress do not inherit write concern */ if (parts->assembled.is_txn_finish || !_mongoc_client_session_in_txn(cs)) { _mongoc_cmd_parts_add_write_concern(parts); } _mongoc_cmd_parts_ensure_copied(parts); if (!_mongoc_client_session_append_txn(cs, &parts->assembled_body, error)) { GOTO(done); } ret = true; } else if (server_type == MONGOC_SERVER_MONGOS || server_stream->topology_type == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* TODO (CDRIVER-4117) remove the check of the topology description type. */ _mongoc_cmd_parts_assemble_mongos(parts, server_stream); ret = true; } else { _mongoc_cmd_parts_assemble_mongod(parts, server_stream); ret = true; } done: mongoc_read_prefs_destroy(prefs); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_cmd_parts_cleanup -- * * Free memory associated with a stack-allocated mongoc_cmd_parts_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_cmd_parts_cleanup(mongoc_cmd_parts_t *parts) { bson_destroy(&parts->read_concern_document); bson_destroy(&parts->write_concern_document); bson_destroy(&parts->extra); bson_destroy(&parts->assembled_body); if (parts->has_temp_session) { /* client session returns its server session to server session pool */ mongoc_client_session_destroy(parts->assembled.session); } } bool mongoc_cmd_is_compressible(const mongoc_cmd_t *cmd) { BSON_ASSERT(cmd); BSON_ASSERT(cmd->command_name); return !!strcasecmp(cmd->command_name, "hello") && !!strcasecmp(cmd->command_name, HANDSHAKE_CMD_LEGACY_HELLO) && !!strcasecmp(cmd->command_name, "authenticate") && !!strcasecmp(cmd->command_name, "getnonce") && !!strcasecmp(cmd->command_name, "saslstart") && !!strcasecmp(cmd->command_name, "saslcontinue") && !!strcasecmp(cmd->command_name, "createuser") && !!strcasecmp(cmd->command_name, "updateuser"); } //`_mongoc_cmd_append_payload_as_array` appends document seqence payloads as BSON arrays. // `cmd` must contain one or more document sequence payloads (`cmd->payloads_count` > 0). // `out` must be initialized by the caller. // Used by APM and In-Use Encryption (document sequences are not supported for auto encryption). void _mongoc_cmd_append_payload_as_array(const mongoc_cmd_t *cmd, bson_t *out) { bson_t doc; const uint8_t *pos; const char *field_name; bson_array_builder_t *bson; BSON_ASSERT(cmd->payloads_count > 0); BSON_ASSERT(cmd->payloads_count <= MONGOC_CMD_PAYLOADS_COUNT_MAX); for (size_t i = 0; i < cmd->payloads_count; i++) { BSON_ASSERT(cmd->payloads[i].documents && cmd->payloads[i].size); // Create a BSON array from a document sequence (OP_MSG Section with payloadType=1). field_name = cmd->payloads[i].identifier; BSON_ASSERT(field_name); BSON_ASSERT(BSON_APPEND_ARRAY_BUILDER_BEGIN(out, field_name, &bson)); pos = cmd->payloads[i].documents; while (pos < cmd->payloads[i].documents + cmd->payloads[i].size) { const int32_t doc_len = mlib_read_i32le(pos); BSON_ASSERT(bson_init_static(&doc, pos, (size_t)doc_len)); bson_array_builder_append_document(bson, &doc); pos += doc_len; } bson_append_array_builder_end(out, bson); } } /*-------------------------------------------------------------------------- * * _mongoc_cmd_append_server_api -- * Append versioned API fields to a mongoc_cmd_t * * Arguments: * cmd The mongoc_cmd_t, which will have versioned API fields added * api A mongoc_server_api_t holding server API information * * Pre-conditions: * - @api is initialized. * - @command_body is initialised * *-------------------------------------------------------------------------- */ void _mongoc_cmd_append_server_api(bson_t *command_body, const mongoc_server_api_t *api) { const char *string_version; BSON_ASSERT(command_body); BSON_ASSERT(api); string_version = mongoc_server_api_version_to_string(api->version); BSON_ASSERT(string_version); bson_append_utf8(command_body, "apiVersion", -1, string_version, -1); if (api->strict.is_set) { bson_append_bool(command_body, "apiStrict", -1, api->strict.value); } if (api->deprecation_errors.is_set) { bson_append_bool(command_body, "apiDeprecationErrors", -1, api->deprecation_errors.value); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-collection-private.h000066400000000000000000000034641511661753600264330ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_COLLECTION_PRIVATE_H #define MONGOC_COLLECTION_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS struct _mongoc_collection_t { mongoc_client_t *client; char *ns; uint32_t nslen; char *db; char *collection; uint32_t collectionlen; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; bson_t *gle; }; mongoc_collection_t * _mongoc_collection_new(mongoc_client_t *client, const char *db, const char *collection, const mongoc_read_prefs_t *read_prefs, const mongoc_read_concern_t *read_concern, const mongoc_write_concern_t *write_concern); bool _mongoc_collection_create_index_if_not_exists(mongoc_collection_t *collection, const bson_t *keys, const bson_t *opts, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_COLLECTION_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-collection.c000066400000000000000000002532421511661753600247570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "collection" static void _mongoc_collection_write_command_execute(mongoc_write_command_t *command, const mongoc_collection_t *collection, const mongoc_write_concern_t *write_concern, mongoc_client_session_t *cs, mongoc_write_result_t *result) { mongoc_server_stream_t *server_stream; ENTRY; const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(command), .has_operation_id = true, .operation_id = command->operation_id}; server_stream = mongoc_cluster_stream_for_writes(&collection->client->cluster, &ss_log_context, cs, NULL, NULL, &result->error); if (!server_stream) { /* result->error has been filled out */ EXIT; } _mongoc_write_command_execute(command, collection->client, server_stream, collection->db, collection->collection, write_concern, 0 /* offset */, cs, result); mongoc_server_stream_cleanup(server_stream); EXIT; } static void _mongoc_collection_write_command_execute_idl(mongoc_write_command_t *command, const mongoc_collection_t *collection, mongoc_crud_opts_t *crud, mongoc_write_result_t *result) { mongoc_server_stream_t *server_stream; bson_t reply; ENTRY; const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(command), .has_operation_id = true, .operation_id = command->operation_id}; server_stream = mongoc_cluster_stream_for_writes( &collection->client->cluster, &ss_log_context, crud->client_session, NULL, &reply, &result->error); if (!server_stream) { /* result->error and reply have been filled out */ _mongoc_bson_array_copy_labels_to(&reply, &result->errorLabels); bson_destroy(&reply); EXIT; } if (_mongoc_client_session_in_txn(crud->client_session) && crud->writeConcern) { _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting transaction"); mongoc_server_stream_cleanup(server_stream); EXIT; } if (!crud->writeConcern && !_mongoc_client_session_in_txn(crud->client_session)) { crud->writeConcern = collection->write_concern; crud->write_concern_owned = false; } _mongoc_write_command_execute_idl( command, collection->client, server_stream, collection->db, collection->collection, 0 /* offset */, crud, result); mongoc_server_stream_cleanup(server_stream); EXIT; } /* *-------------------------------------------------------------------------- * * _mongoc_collection_new -- * * INTERNAL API * * Create a new mongoc_collection_t structure for the given client. * * @client must remain valid during the lifetime of this structure. * @db is the db name of the collection. * @collection is the name of the collection. * @read_prefs is the default read preferences to apply or NULL. * @read_concern is the default read concern to apply or NULL. * @write_concern is the default write concern to apply or NULL. * * Returns: * A newly allocated mongoc_collection_t that should be freed with * mongoc_collection_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_collection_t * _mongoc_collection_new(mongoc_client_t *client, const char *db, const char *collection, const mongoc_read_prefs_t *read_prefs, const mongoc_read_concern_t *read_concern, const mongoc_write_concern_t *write_concern) { mongoc_collection_t *col; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(db); BSON_ASSERT_PARAM(collection); col = (mongoc_collection_t *)bson_malloc0(sizeof *col); col->client = client; col->write_concern = write_concern ? mongoc_write_concern_copy(write_concern) : mongoc_write_concern_new(); col->read_concern = read_concern ? mongoc_read_concern_copy(read_concern) : mongoc_read_concern_new(); col->read_prefs = read_prefs ? mongoc_read_prefs_copy(read_prefs) : mongoc_read_prefs_new(MONGOC_READ_PRIMARY); col->ns = bson_strdup_printf("%s.%s", db, collection); col->db = bson_strdup(db); col->collection = bson_strdup(collection); col->collectionlen = (uint32_t)strlen(col->collection); col->nslen = (uint32_t)strlen(col->ns); col->gle = NULL; RETURN(col); } /* *-------------------------------------------------------------------------- * * mongoc_collection_destroy -- * * Release resources associated with @collection and frees the * structure. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_collection_destroy(mongoc_collection_t *collection) /* IN */ { ENTRY; if (!collection) { EXIT; } bson_clear(&collection->gle); if (collection->read_prefs) { mongoc_read_prefs_destroy(collection->read_prefs); collection->read_prefs = NULL; } if (collection->read_concern) { mongoc_read_concern_destroy(collection->read_concern); collection->read_concern = NULL; } if (collection->write_concern) { mongoc_write_concern_destroy(collection->write_concern); collection->write_concern = NULL; } bson_free(collection->collection); bson_free(collection->db); bson_free(collection->ns); bson_free(collection); EXIT; } /* *-------------------------------------------------------------------------- * * mongoc_collection_copy -- * * Returns a copy of @collection that needs to be freed by calling * mongoc_collection_destroy. * * Returns: * A copy of this collection. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_collection_t * mongoc_collection_copy(mongoc_collection_t *collection) /* IN */ { ENTRY; BSON_ASSERT_PARAM(collection); RETURN(_mongoc_collection_new(collection->client, collection->db, collection->collection, collection->read_prefs, collection->read_concern, collection->write_concern)); } mongoc_cursor_t * mongoc_collection_aggregate(mongoc_collection_t *collection, /* IN */ mongoc_query_flags_t flags, /* IN */ const bson_t *pipeline, /* IN */ const bson_t *opts, /* IN */ const mongoc_read_prefs_t *read_prefs) /* IN */ { return _mongoc_aggregate(collection->client, collection->ns, flags, pipeline, opts, read_prefs, collection->read_prefs, collection->read_concern, collection->write_concern); } /* *-------------------------------------------------------------------------- * * mongoc_collection_find_with_opts -- * * Create a cursor with a query filter. All other options are * specified in a free-form BSON document. * * Parameters: * @collection: A mongoc_collection_t. * @filter: The query to locate matching documents. * @opts: Other options. * @read_prefs: Optional read preferences to choose cluster node. * * Returns: * A newly allocated mongoc_cursor_t that should be freed with * mongoc_cursor_destroy(). * * The client used by mongoc_collection_t must be valid for the * lifetime of the resulting mongoc_cursor_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_cursor_t * mongoc_collection_find_with_opts(mongoc_collection_t *collection, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(filter); bson_clear(&collection->gle); return _mongoc_cursor_find_new( collection->client, collection->ns, filter, opts, read_prefs, collection->read_prefs, collection->read_concern); } bool mongoc_collection_read_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); return _mongoc_client_command_with_opts(collection->client, collection->db, command, MONGOC_CMD_READ, opts, MONGOC_QUERY_NONE, read_prefs, collection->read_prefs, collection->read_concern, collection->write_concern, reply, error); } bool mongoc_collection_write_command_with_opts( mongoc_collection_t *collection, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); return _mongoc_client_command_with_opts(collection->client, collection->db, command, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, collection->read_prefs, collection->read_concern, collection->write_concern, reply, error); } bool mongoc_collection_read_write_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); return _mongoc_client_command_with_opts(collection->client, collection->db, command, MONGOC_CMD_RW, opts, MONGOC_QUERY_NONE, read_prefs, collection->read_prefs, collection->read_concern, collection->write_concern, reply, error); } bool mongoc_collection_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); /* Server Selection Spec: "The generic command method has a default read * preference of mode 'primary'. The generic command method MUST ignore any * default read preference from client, database or collection * configuration. The generic command method SHOULD allow an optional read * preference argument." */ return _mongoc_client_command_with_opts(collection->client, collection->db, command, MONGOC_CMD_RAW, opts, MONGOC_QUERY_NONE, read_prefs, NULL /* default prefs */, collection->read_concern, collection->write_concern, reply, error); } bool mongoc_collection_command_simple(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(command); bson_clear(&collection->gle); /* Server Selection Spec: "The generic command method has a default read * preference of mode 'primary'. The generic command method MUST ignore any * default read preference from client, database or collection * configuration. The generic command method SHOULD allow an optional read * preference argument." */ return _mongoc_client_command_with_opts(collection->client, collection->db, command, MONGOC_CMD_RAW, NULL /* opts */, MONGOC_QUERY_NONE, read_prefs, NULL /* default prefs */, NULL /* read concern */, NULL /* write concern */, reply, error); } int64_t mongoc_collection_estimated_document_count(mongoc_collection_t *coll, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) { ENTRY; BSON_ASSERT_PARAM(coll); // No sessionId allowed if (opts && bson_has_field(opts, "sessionId")) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Collection count must not specify explicit session"); RETURN(-1); } // Storage for the reply if no storage was given by caller bson_t reply_local = BSON_INITIALIZER; // Write the reply to either the caller's storage or a local variable bson_t *const reply_ptr = reply ? reply : &reply_local; // Create and execute a "count" command bsonBuildDecl(cmd, kv("count", cstr(coll->collection))); const bool command_ok = _mongoc_client_command_with_opts(coll->client, coll->db, &cmd, MONGOC_CMD_READ, opts, MONGOC_QUERY_NONE, read_prefs, coll->read_prefs, coll->read_concern, coll->write_concern, reply_ptr, error); bson_destroy(&cmd); // Extract the "n" field from the response int64_t ret_count = -1; if (command_ok) { bsonParse(*reply_ptr, find(key("n"), do(ret_count = bson_iter_as_int64(&bsonVisitIter)))); } // Destroy the local storage. This is a no-op if we used the caller's storage. bson_destroy(&reply_local); RETURN(ret_count); } /* -------------------------------------------------------------------------- * * _make_aggregate_for_count -- * * Construct an aggregate pipeline with the following form: * { pipeline: [ * { $match: {...} }, * { $group: { _id: 1, n: { sum: 1 } } }, * { $skip: ... }, * { $limit: ... } * ] * } * *-------------------------------------------------------------------------- */ static void _make_aggregate_for_count(const mongoc_collection_t *coll, const bson_t *filter, mongoc_count_document_opts_t *opts, bson_t *out) { bson_array_builder_t *pipeline; bson_t match_stage; bson_t group_stage; bson_t group_stage_doc; bson_t sum; bson_t empty; bson_init(out); bson_append_utf8(out, "aggregate", 9, coll->collection, coll->collectionlen); bson_append_document_begin(out, "cursor", 6, &empty); bson_append_document_end(out, &empty); bson_append_array_builder_begin(out, "pipeline", 8, &pipeline); bson_array_builder_append_document_begin(pipeline, &match_stage); bson_append_document(&match_stage, "$match", 6, filter); bson_array_builder_append_document_end(pipeline, &match_stage); /* if @opts includes "skip", or "limit", append $skip and $limit stages to * the aggregate pipeline. */ if (opts->skip.value_type != BSON_TYPE_EOD) { bson_t skip_stage; bson_array_builder_append_document_begin(pipeline, &skip_stage); bson_append_value(&skip_stage, "$skip", 5, &opts->skip); bson_array_builder_append_document_end(pipeline, &skip_stage); } if (opts->limit.value_type != BSON_TYPE_EOD) { bson_t limit_stage; bson_array_builder_append_document_begin(pipeline, &limit_stage); bson_append_value(&limit_stage, "$limit", 6, &opts->limit); bson_array_builder_append_document_end(pipeline, &limit_stage); } bson_array_builder_append_document_begin(pipeline, &group_stage); bson_append_document_begin(&group_stage, "$group", 6, &group_stage_doc); bson_append_int32(&group_stage_doc, "_id", 3, 1); bson_append_document_begin(&group_stage_doc, "n", 1, &sum); bson_append_int32(&sum, "$sum", 4, 1); bson_append_document_end(&group_stage_doc, &sum); bson_append_document_end(&group_stage, &group_stage_doc); bson_array_builder_append_document_end(pipeline, &group_stage); bson_append_array_builder_end(out, pipeline); } int64_t mongoc_collection_count_documents(mongoc_collection_t *coll, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) { bson_t aggregate_cmd; bson_t aggregate_opts; bool ret; const bson_t *result; mongoc_cursor_t *cursor = NULL; int64_t count = -1; bson_t cmd_reply; bson_iter_t iter; ENTRY; BSON_ASSERT_PARAM(coll); BSON_ASSERT_PARAM(filter); // Parse options to validate. mongoc_count_document_opts_t cd_opts; if (!_mongoc_count_document_opts_parse(coll->client, opts, &cd_opts, error)) { GOTO(done); } _make_aggregate_for_count(coll, filter, &cd_opts, &aggregate_cmd); bson_init(&aggregate_opts); if (opts) { bsonBuildAppend(aggregate_opts, insert(*opts, not(key("skip", "limit")))); } ret = mongoc_collection_read_command_with_opts(coll, &aggregate_cmd, read_prefs, &aggregate_opts, &cmd_reply, error); bson_destroy(&aggregate_cmd); bson_destroy(&aggregate_opts); if (reply) { bson_copy_to(&cmd_reply, reply); } if (!ret) { bson_destroy(&cmd_reply); GOTO(done); } /* steals reply */ cursor = mongoc_cursor_new_from_command_reply_with_opts(coll->client, &cmd_reply, NULL); BSON_ASSERT(mongoc_cursor_get_id(cursor) == 0); ret = mongoc_cursor_next(cursor, &result); if (!ret) { if (mongoc_cursor_error(cursor, error)) { GOTO(done); } else { count = 0; GOTO(done); } } if (bson_iter_init_find(&iter, result, "n") && BSON_ITER_HOLDS_INT(&iter)) { count = bson_iter_as_int64(&iter); } done: _mongoc_count_document_opts_cleanup(&cd_opts); if (cursor) { mongoc_cursor_destroy(cursor); } RETURN(count); } /* *-------------------------------------------------------------------------- * * mongoc_collection_drop -- * * Request the MongoDB server drop the collection. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * @error is set upon failure. * *-------------------------------------------------------------------------- */ bool mongoc_collection_drop(mongoc_collection_t *collection, /* IN */ bson_error_t *error) /* OUT */ { return mongoc_collection_drop_with_opts(collection, NULL, error); } static bool drop_with_opts(mongoc_collection_t *collection, const bson_t *opts, bson_error_t *error) { bool ret; bson_t cmd; BSON_ASSERT_PARAM(collection); bson_init(&cmd); bson_append_utf8(&cmd, "drop", 4, collection->collection, collection->collectionlen); ret = _mongoc_client_command_with_opts(collection->client, collection->db, &cmd, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ collection->read_prefs, collection->read_concern, collection->write_concern, NULL, /* reply */ error); bson_destroy(&cmd); return ret; } static bool drop_with_opts_with_encryptedFields(mongoc_collection_t *collection, const bson_t *opts, const bson_t *encryptedFields, bson_error_t *error) { char *escName = NULL; char *ecocName = NULL; mongoc_collection_t *escCollection = NULL; mongoc_collection_t *ecocCollection = NULL; bool ok = false; const char *name = mongoc_collection_get_name(collection); bson_error_reset(error); /* Drop ESC collection. */ escName = _mongoc_get_encryptedField_state_collection(encryptedFields, name, "esc", error); if (!escName) { goto fail; } escCollection = mongoc_client_get_collection(collection->client, collection->db, escName); if (!drop_with_opts(escCollection, NULL /* opts */, error)) { if (error->code == MONGOC_SERVER_ERR_NS_NOT_FOUND) { memset(error, 0, sizeof(bson_error_t)); } else { goto fail; } } /* Drop ECOC collection. */ ecocName = _mongoc_get_encryptedField_state_collection(encryptedFields, name, "ecoc", error); if (!ecocName) { goto fail; } ecocCollection = mongoc_client_get_collection(collection->client, collection->db, ecocName); if (!drop_with_opts(ecocCollection, NULL /* opts */, error)) { if (error->code == MONGOC_SERVER_ERR_NS_NOT_FOUND) { memset(error, 0, sizeof(bson_error_t)); } else { goto fail; } } /* Drop data collection. */ if (!drop_with_opts(collection, opts, error)) { if (error->code == MONGOC_SERVER_ERR_NS_NOT_FOUND) { memset(error, 0, sizeof(bson_error_t)); } else { goto fail; } } ok = true; fail: mongoc_collection_destroy(ecocCollection); bson_free(ecocName); mongoc_collection_destroy(escCollection); bson_free(escName); return ok; } bool mongoc_collection_drop_with_opts(mongoc_collection_t *collection, const bson_t *opts, bson_error_t *error) { // The encryptedFields for the collection. bson_t encryptedFields = BSON_INITIALIZER; bson_t opts_without_encryptedFields = BSON_INITIALIZER; bool okay = false; // Try to find the encryptedFields from the collection options or from the // encryptedFieldsMap. if (!_mongoc_get_collection_encryptedFields(collection->client, collection->db, mongoc_collection_get_name(collection), opts, true /* checkEncryptedFieldsMap */, &encryptedFields, error)) { goto done; } if (bson_empty(&encryptedFields)) { // We didn't find the encryptedFields (yet) if (collection->client->topology->encrypted_fields_map != NULL) { // but we can ask the server for them: if (!_mongoc_get_encryptedFields_from_server( collection->client, collection->db, mongoc_collection_get_name(collection), &encryptedFields, error)) { goto done; } } } if (bson_empty(&encryptedFields)) { // There are no encryptedFields with this collection, so we can just do a // regular drop okay = drop_with_opts(collection, opts, error); goto done; } // We've found the encryptedFields, so we need to do something different // to drop this collection: bsonBuildAppend(opts_without_encryptedFields, if (opts, then(insert(*opts, not(key("encryptedFields")))))); if (bsonBuildError) { _mongoc_set_error( error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error while updating drop options: %s", bsonBuildError); goto done; } okay = drop_with_opts_with_encryptedFields(collection, &opts_without_encryptedFields, &encryptedFields, error); done: bson_destroy(&opts_without_encryptedFields); bson_destroy(&encryptedFields); return okay; } /* *-------------------------------------------------------------------------- * * mongoc_collection_drop_index -- * * Request the MongoDB server drop the named index. * * Returns: * true if successful; otherwise false and @error is set. * * Side effects: * @error is setup upon failure if non-NULL. * *-------------------------------------------------------------------------- */ bool mongoc_collection_drop_index(mongoc_collection_t *collection, /* IN */ const char *index_name, /* IN */ bson_error_t *error) /* OUT */ { return mongoc_collection_drop_index_with_opts(collection, index_name, NULL, error); } bool mongoc_collection_drop_index_with_opts(mongoc_collection_t *collection, const char *index_name, const bson_t *opts, bson_error_t *error) { bool ret; bson_t cmd; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(index_name); bson_init(&cmd); bson_append_utf8(&cmd, "dropIndexes", -1, collection->collection, collection->collectionlen); bson_append_utf8(&cmd, "index", -1, index_name, -1); ret = _mongoc_client_command_with_opts(collection->client, collection->db, &cmd, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ collection->read_prefs, collection->read_concern, collection->write_concern, NULL, /* reply */ error); bson_destroy(&cmd); return ret; } char * mongoc_collection_keys_to_index_string(const bson_t *keys) { mcommon_string_append_t append; bson_iter_t iter; bson_type_t type; int i = 0; BSON_ASSERT_PARAM(keys); if (!bson_iter_init(&iter, keys)) { return NULL; } mcommon_string_new_as_append(&append); while (bson_iter_next(&iter)) { /* Index type can be specified as a string ("2d") or as an integer * representing direction */ type = bson_iter_type(&iter); if (type == BSON_TYPE_UTF8) { mcommon_string_append_printf( &append, (i++ ? "_%s_%s" : "%s_%s"), bson_iter_key(&iter), bson_iter_utf8(&iter, NULL)); } else if (type == BSON_TYPE_INT32) { mcommon_string_append_printf( &append, (i++ ? "_%s_%d" : "%s_%d"), bson_iter_key(&iter), bson_iter_int32(&iter)); } else if (type == BSON_TYPE_INT64) { mcommon_string_append_printf( &append, (i++ ? "_%s_%" PRId64 : "%s_%" PRId64), bson_iter_key(&iter), bson_iter_int64(&iter)); } else { mcommon_string_from_append_destroy(&append); return NULL; } } return mcommon_string_from_append_destroy_with_steal(&append); } static bool _mongoc_collection_index_keys_equal(const bson_t *expected, const bson_t *actual) { bson_iter_t iter_expected; bson_iter_t iter_actual; if (!bson_iter_init(&iter_expected, expected)) { return false; } if (!bson_iter_init(&iter_actual, actual)) { return false; } while (bson_iter_next(&iter_expected)) { /* If the key document has fewer items than expected, indexes are unequal */ if (!bson_iter_next(&iter_actual)) { return false; } /* If key order does not match, indexes are unequal */ if (strcmp(bson_iter_key(&iter_expected), bson_iter_key(&iter_actual)) != 0) { return false; } if (BSON_ITER_HOLDS_NUMBER(&iter_expected) && BSON_ITER_HOLDS_NUMBER(&iter_actual)) { if (bson_iter_as_int64(&iter_expected) != bson_iter_as_int64(&iter_actual)) { return false; } } else if (BSON_ITER_HOLDS_UTF8(&iter_expected) && BSON_ITER_HOLDS_UTF8(&iter_actual)) { if (strcmp(bson_iter_utf8(&iter_expected, NULL), bson_iter_utf8(&iter_actual, NULL)) != 0) { return false; } } else { return false; } } /* If our expected document is exhausted, make sure there are no extra keys * in the actual key document */ if (bson_iter_next(&iter_actual)) { return false; } return true; } bool _mongoc_collection_create_index_if_not_exists(mongoc_collection_t *collection, const bson_t *keys, const bson_t *opts, bson_error_t *error) { mongoc_cursor_t *cursor; bool index_exists; bool r = false; const bson_t *doc; bson_iter_t iter; bson_t inner_doc; uint32_t data_len; const uint8_t *data; bson_t index; bson_t command; BSON_ASSERT(collection); BSON_ASSERT(keys); cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); index_exists = false; while (mongoc_cursor_next(cursor, &doc) && !index_exists) { r = bson_iter_init_find(&iter, doc, "key"); if (!r) { continue; } bson_iter_document(&iter, &data_len, &data); BSON_ASSERT(bson_init_static(&inner_doc, data, data_len)); if (_mongoc_collection_index_keys_equal(keys, &inner_doc)) { index_exists = true; } bson_destroy(&inner_doc); } if (mongoc_cursor_error(cursor, error)) { mongoc_cursor_destroy(cursor); return false; } mongoc_cursor_destroy(cursor); if (index_exists) { return true; } if (opts) { bson_copy_to(opts, &index); } else { bson_init(&index); } BSON_APPEND_DOCUMENT(&index, "key", keys); if (!bson_has_field(&index, "name")) { char *alloc_name = mongoc_collection_keys_to_index_string(keys); if (!alloc_name) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Cannot generate index name from invalid `keys` argument"); GOTO(done); } BSON_APPEND_UTF8(&index, "name", alloc_name); bson_free(alloc_name); } bson_init(&command); BCON_APPEND(&command, "createIndexes", BCON_UTF8(mongoc_collection_get_name(collection)), "indexes", "[", BCON_DOCUMENT(&index), "]"); r = mongoc_collection_write_command_with_opts(collection, &command, NULL, NULL, error); done: bson_destroy(&index); bson_destroy(&command); return r; } mongoc_cursor_t * mongoc_collection_find_indexes(mongoc_collection_t *collection, bson_error_t *error) { mongoc_cursor_t *cursor; cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); (void)mongoc_cursor_error(cursor, error); return cursor; } mongoc_cursor_t * mongoc_collection_find_indexes_with_opts(mongoc_collection_t *collection, const bson_t *opts) { mongoc_cursor_t *cursor; bson_t cmd = BSON_INITIALIZER; bson_t child; bson_error_t error; BSON_ASSERT_PARAM(collection); bson_append_utf8(&cmd, "listIndexes", -1, collection->collection, collection->collectionlen); BSON_APPEND_DOCUMENT_BEGIN(&cmd, "cursor", &child); bson_append_document_end(&cmd, &child); /* No read preference. Index Enumeration Spec: "run listIndexes on the * primary node in replicaSet mode". */ cursor = _mongoc_cursor_cmd_new(collection->client, collection->ns, &cmd, opts, NULL, NULL, NULL); if (!mongoc_cursor_error(cursor, &error)) { _mongoc_cursor_prime(cursor); } if (mongoc_cursor_error(cursor, &error) && error.code == MONGOC_ERROR_COLLECTION_DOES_NOT_EXIST) { /* collection does not exist. from spec: return no documents but no err: * https://github.com/mongodb/specifications/blob/master/source/enumerate-collections/enumerate-collections.md#getting-full-collection-information */ _mongoc_cursor_set_empty(cursor); } bson_destroy(&cmd); return cursor; } bool mongoc_collection_insert(mongoc_collection_t *collection, mongoc_insert_flags_t flags, const bson_t *document, const mongoc_write_concern_t *write_concern, bson_error_t *error) { bson_t opts = BSON_INITIALIZER; bson_t reply; bool r; bson_clear(&collection->gle); if (flags & MONGOC_INSERT_NO_VALIDATE) { bson_append_bool(&opts, "validate", 8, false); } if (write_concern) { mongoc_write_concern_append((mongoc_write_concern_t *)write_concern, &opts); } r = mongoc_collection_insert_one(collection, document, &opts, &reply, error); collection->gle = bson_copy(&reply); bson_destroy(&reply); bson_destroy(&opts); return r; } /* *-------------------------------------------------------------------------- * * mongoc_collection_insert_one -- * * Insert a document into a MongoDB collection. * * Parameters: * @collection: A mongoc_collection_t. * @document: The document to insert. * @opts: Standard command options. * @reply: Optional. Uninitialized doc to receive the update result. * @error: A location for an error or NULL. * * Returns: * true if successful; otherwise false and @error is set. * * If the write concern does not dictate checking the result of the * insert, then true may be returned even though the document was * not actually inserted on the MongoDB server or cluster. * *-------------------------------------------------------------------------- */ bool mongoc_collection_insert_one( mongoc_collection_t *collection, const bson_t *document, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_insert_one_opts_t insert_one_opts; mongoc_write_command_t command; mongoc_write_result_t result; bson_t insert_id = BSON_INITIALIZER; bson_t cmd_opts = BSON_INITIALIZER; bool ret = false; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(document); _mongoc_bson_init_if_set(reply); if (!_mongoc_insert_one_opts_parse(collection->client, opts, &insert_one_opts, error)) { GOTO(done); } if (!bson_empty(&insert_one_opts.extra)) { bson_concat(&cmd_opts, &insert_one_opts.extra); } if (insert_one_opts.crud.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &insert_one_opts.crud.comment); } if (!_mongoc_validate_new_document(document, insert_one_opts.crud.validate, error)) { GOTO(done); } _mongoc_write_result_init(&result); _mongoc_write_command_init_insert_one_idl( &command, document, &cmd_opts, &insert_id, ++collection->client->cluster.operation_id); command.flags.bypass_document_validation = insert_one_opts.bypass; _mongoc_collection_write_command_execute_idl(&command, collection, &insert_one_opts.crud, &result); ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, insert_one_opts.crud.writeConcern, /* no error domain override */ (mongoc_error_domain_t)0, reply, error, "insertedCount"); // Only record _id of document if it was actually inserted and reply is non-NULL. if (reply && result.nInserted > 0) { bson_concat(reply, &insert_id); } _mongoc_write_result_destroy(&result); _mongoc_write_command_destroy(&command); done: _mongoc_insert_one_opts_cleanup(&insert_one_opts); bson_destroy(&insert_id); bson_destroy(&cmd_opts); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_collection_insert_many -- * * Insert documents into a MongoDB collection. * * Parameters: * @collection: A mongoc_collection_t. * @documents: The documents to insert. * @n_documents: Length of @documents array. * @opts: Standard command options. * @reply: Optional. Uninitialized doc to receive the update result. * @error: A location for an error or NULL. * * Returns: * true if successful; otherwise false and @error is set. * * If the write concern does not dictate checking the result of the * insert, then true may be returned even though the document was * not actually inserted on the MongoDB server or cluster. * *-------------------------------------------------------------------------- */ bool mongoc_collection_insert_many(mongoc_collection_t *collection, const bson_t **documents, size_t n_documents, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_insert_many_opts_t insert_many_opts; mongoc_write_command_t command; mongoc_write_result_t result; bson_t cmd_opts = BSON_INITIALIZER; size_t i; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(documents); _mongoc_bson_init_if_set(reply); if (!_mongoc_insert_many_opts_parse(collection->client, opts, &insert_many_opts, error)) { _mongoc_insert_many_opts_cleanup(&insert_many_opts); return false; } if (insert_many_opts.crud.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &insert_many_opts.crud.comment); } if (!bson_empty(&insert_many_opts.extra)) { bson_concat(&cmd_opts, &insert_many_opts.extra); } _mongoc_write_result_init(&result); _mongoc_write_command_init_insert_idl(&command, NULL, &cmd_opts, ++collection->client->cluster.operation_id); command.flags.ordered = insert_many_opts.ordered; command.flags.bypass_document_validation = insert_many_opts.bypass; for (i = 0; i < n_documents; i++) { if (!_mongoc_validate_new_document(documents[i], insert_many_opts.crud.validate, error)) { ret = false; GOTO(done); } _mongoc_write_command_insert_append(&command, documents[i]); } _mongoc_collection_write_command_execute_idl(&command, collection, &insert_many_opts.crud, &result); ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, insert_many_opts.crud.writeConcern, /* no error domain override */ (mongoc_error_domain_t)0, reply, error, "insertedCount"); done: _mongoc_write_result_destroy(&result); _mongoc_write_command_destroy(&command); _mongoc_insert_many_opts_cleanup(&insert_many_opts); bson_destroy(&cmd_opts); RETURN(ret); } bool mongoc_collection_update(mongoc_collection_t *collection, mongoc_update_flags_t uflags, const bson_t *selector, const bson_t *update, const mongoc_write_concern_t *write_concern, bson_error_t *error) { mongoc_bulk_write_flags_t write_flags = MONGOC_BULK_WRITE_FLAGS_INIT; mongoc_write_command_t command; mongoc_write_result_t result; bson_iter_t iter; bool ret; int flags = uflags; bson_t opts; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); BSON_ASSERT_PARAM(update); bson_clear(&collection->gle); if (!write_concern) { write_concern = collection->write_concern; } if (!((uint32_t)flags & MONGOC_UPDATE_NO_VALIDATE) && bson_iter_init(&iter, update) && bson_iter_next(&iter)) { if (bson_iter_key(&iter)[0] == '$') { /* update document, all keys must be $-operators */ if (!_mongoc_validate_update(update, _mongoc_default_update_vflags, error)) { return false; } } else { if (!_mongoc_validate_replace(update, _mongoc_default_replace_vflags, error)) { return false; } } } bson_init(&opts); BSON_APPEND_BOOL(&opts, "upsert", !!(flags & MONGOC_UPDATE_UPSERT)); BSON_APPEND_BOOL(&opts, "multi", !!(flags & MONGOC_UPDATE_MULTI_UPDATE)); _mongoc_write_result_init(&result); _mongoc_write_command_init_update(&command, selector, update, NULL, /* cmd_opts */ &opts, write_flags, ++collection->client->cluster.operation_id); bson_destroy(&opts); command.flags.has_multi_write = !!(flags & MONGOC_UPDATE_MULTI_UPDATE); _mongoc_collection_write_command_execute(&command, collection, write_concern, NULL, &result); collection->gle = bson_new(); ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, write_concern, /* no error domain override */ (mongoc_error_domain_t)0, collection->gle, error); _mongoc_write_result_destroy(&result); _mongoc_write_command_destroy(&command); RETURN(ret); } static bool _mongoc_collection_update_or_replace(mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, mongoc_update_opts_t *update_opts, bool multi, bool bypass, const bson_t *array_filters, const bson_t *sort, bson_t *extra, bson_t *reply, bson_error_t *error) { mongoc_write_command_t command; mongoc_write_result_t result; mongoc_server_stream_t *server_stream = NULL; bson_t cmd_opts = BSON_INITIALIZER; bool reply_initialized = false; bool ret = false; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); BSON_ASSERT_PARAM(update); if (!bson_empty(&update_opts->let)) { bson_append_document(&cmd_opts, "let", 3, &update_opts->let); } if (update_opts->crud.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &update_opts->crud.comment); } if (update_opts->upsert) { bson_append_bool(extra, "upsert", 6, true); } if (!bson_empty(&update_opts->collation)) { bson_append_document(extra, "collation", 9, &update_opts->collation); } if (update_opts->hint.value_type) { bson_append_value(extra, "hint", 4, &update_opts->hint); } if (!bson_empty0(array_filters)) { bson_append_array(extra, "arrayFilters", 12, array_filters); } if (!bson_empty0(sort)) { bson_append_document(extra, "sort", 4, sort); } if (multi) { bson_append_bool(extra, "multi", 5, true); } _mongoc_write_result_init(&result); _mongoc_write_command_init_update_idl( &command, selector, update, &cmd_opts, extra, ++collection->client->cluster.operation_id); command.flags.has_multi_write = multi; command.flags.bypass_document_validation = bypass; if (!bson_empty(&update_opts->collation)) { command.flags.has_collation = true; } if (update_opts->hint.value_type) { command.flags.has_update_hint = true; } const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(&command), .has_operation_id = true, .operation_id = command.operation_id}; server_stream = mongoc_cluster_stream_for_writes( &collection->client->cluster, &ss_log_context, update_opts->crud.client_session, NULL, reply, error); if (!server_stream) { /* mongoc_cluster_stream_for_writes inits reply on error */ reply_initialized = true; GOTO(done); } if (!bson_empty0(array_filters)) { if (!mongoc_write_concern_is_acknowledged(update_opts->crud.writeConcern)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Cannot use array filters with unacknowledged writes"); GOTO(done); } } if (_mongoc_client_session_in_txn(update_opts->crud.client_session) && update_opts->crud.writeConcern) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting transaction"); GOTO(done); } if (!update_opts->crud.writeConcern && !_mongoc_client_session_in_txn(update_opts->crud.client_session)) { update_opts->crud.writeConcern = collection->write_concern; update_opts->crud.write_concern_owned = false; } _mongoc_write_command_execute_idl(&command, collection->client, server_stream, collection->db, collection->collection, 0 /* offset */, &update_opts->crud, &result); _mongoc_bson_init_if_set(reply); reply_initialized = true; /* set fields described in CRUD spec for the UpdateResult */ ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, update_opts->crud.writeConcern, /* no error domain override */ (mongoc_error_domain_t)0, reply, error, "modifiedCount", "matchedCount", "upsertedCount", "upsertedId"); done: _mongoc_write_result_destroy(&result); mongoc_server_stream_cleanup(server_stream); _mongoc_write_command_destroy(&command); bson_destroy(&cmd_opts); if (!reply_initialized) { _mongoc_bson_init_if_set(reply); } RETURN(ret); } bool mongoc_collection_update_one(mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_update_one_opts_t update_one_opts; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(update); if (!_mongoc_update_one_opts_parse(collection->client, opts, &update_one_opts, error)) { _mongoc_update_one_opts_cleanup(&update_one_opts); _mongoc_bson_init_if_set(reply); return false; } if (!_mongoc_validate_update(update, update_one_opts.update.crud.validate, error)) { _mongoc_update_one_opts_cleanup(&update_one_opts); _mongoc_bson_init_if_set(reply); return false; } ret = _mongoc_collection_update_or_replace(collection, selector, update, &update_one_opts.update, false /* multi */, update_one_opts.update.bypass, &update_one_opts.arrayFilters, &update_one_opts.sort, &update_one_opts.extra, reply, error); _mongoc_update_one_opts_cleanup(&update_one_opts); RETURN(ret); } bool mongoc_collection_update_many(mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_update_many_opts_t update_many_opts; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(update); if (!_mongoc_update_many_opts_parse(collection->client, opts, &update_many_opts, error)) { _mongoc_update_many_opts_cleanup(&update_many_opts); _mongoc_bson_init_if_set(reply); return false; } if (!_mongoc_validate_update(update, update_many_opts.update.crud.validate, error)) { _mongoc_update_many_opts_cleanup(&update_many_opts); _mongoc_bson_init_if_set(reply); return false; } ret = _mongoc_collection_update_or_replace(collection, selector, update, &update_many_opts.update, true /* multi */, update_many_opts.update.bypass, &update_many_opts.arrayFilters, NULL /* sort */, &update_many_opts.extra, reply, error); _mongoc_update_many_opts_cleanup(&update_many_opts); RETURN(ret); } bool mongoc_collection_replace_one(mongoc_collection_t *collection, const bson_t *selector, const bson_t *replacement, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_replace_one_opts_t replace_one_opts; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(replacement); if (!_mongoc_replace_one_opts_parse(collection->client, opts, &replace_one_opts, error)) { _mongoc_replace_one_opts_cleanup(&replace_one_opts); _mongoc_bson_init_if_set(reply); return false; } if (!_mongoc_validate_replace(replacement, replace_one_opts.update.crud.validate, error)) { _mongoc_replace_one_opts_cleanup(&replace_one_opts); _mongoc_bson_init_if_set(reply); return false; } ret = _mongoc_collection_update_or_replace(collection, selector, replacement, &replace_one_opts.update, false /* multi */, replace_one_opts.update.bypass, NULL, &replace_one_opts.sort, &replace_one_opts.extra, reply, error); _mongoc_replace_one_opts_cleanup(&replace_one_opts); RETURN(ret); } bool mongoc_collection_remove(mongoc_collection_t *collection, mongoc_remove_flags_t flags, const bson_t *selector, const mongoc_write_concern_t *write_concern, bson_error_t *error) { mongoc_bulk_write_flags_t write_flags = MONGOC_BULK_WRITE_FLAGS_INIT; mongoc_write_command_t command; mongoc_write_result_t result; bson_t opts; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); bson_clear(&collection->gle); if (!write_concern) { write_concern = collection->write_concern; } bson_init(&opts); BSON_APPEND_INT32(&opts, "limit", flags & MONGOC_REMOVE_SINGLE_REMOVE ? 1 : 0); _mongoc_write_result_init(&result); ++collection->client->cluster.operation_id; _mongoc_write_command_init_delete( &command, selector, NULL, &opts, write_flags, collection->client->cluster.operation_id); bson_destroy(&opts); command.flags.has_multi_write = !(flags & MONGOC_REMOVE_SINGLE_REMOVE); _mongoc_collection_write_command_execute(&command, collection, write_concern, NULL, &result); collection->gle = bson_new(); ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, write_concern, 0 /* no error domain override */, collection->gle, error); _mongoc_write_result_destroy(&result); _mongoc_write_command_destroy(&command); RETURN(ret); } static bool _mongoc_delete_one_or_many(mongoc_collection_t *collection, bool multi, const bson_t *selector, mongoc_delete_opts_t *delete_opts, const bson_t *extra, bson_t *reply, bson_error_t *error) { mongoc_write_command_t command; mongoc_write_result_t result; bson_t cmd_opts = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); BSON_ASSERT(bson_empty0(reply)); /* TODO: This function has historically used `extra` for top-level, command * options. That is inconsistent with the update function, which uses `extra` * for statement-level options. We will keep the original behavior for BC * reasons, but this should ultimately be addressed by CDRIVER-4306. */ if (!bson_empty0(extra)) { bson_concat(&cmd_opts, extra); } if (!bson_empty(&delete_opts->let)) { bson_append_document(&cmd_opts, "let", 3, &delete_opts->let); } if (delete_opts->crud.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&cmd_opts, "comment", 7, &delete_opts->crud.comment); } _mongoc_write_result_init(&result); bson_append_int32(&opts, "limit", 5, multi ? 0 : 1); if (!bson_empty(&delete_opts->collation)) { bson_append_document(&opts, "collation", 9, &delete_opts->collation); } if (delete_opts->hint.value_type) { bson_append_value(&opts, "hint", 4, &delete_opts->hint); } _mongoc_write_command_init_delete_idl( &command, selector, &cmd_opts, &opts, ++collection->client->cluster.operation_id); command.flags.has_multi_write = multi; if (!bson_empty(&delete_opts->collation)) { command.flags.has_collation = true; } if (delete_opts->hint.value_type) { command.flags.has_delete_hint = true; } _mongoc_collection_write_command_execute_idl(&command, collection, &delete_opts->crud, &result); /* set field described in CRUD spec for the DeleteResult */ ret = MONGOC_WRITE_RESULT_COMPLETE(&result, collection->client->error_api_version, delete_opts->crud.writeConcern, /* no error domain override */ (mongoc_error_domain_t)0, reply, error, "deletedCount"); _mongoc_write_result_destroy(&result); _mongoc_write_command_destroy(&command); bson_destroy(&cmd_opts); bson_destroy(&opts); RETURN(ret); } bool mongoc_collection_delete_one( mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_delete_one_opts_t delete_one_opts; bool ret = false; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); _mongoc_bson_init_if_set(reply); if (!_mongoc_delete_one_opts_parse(collection->client, opts, &delete_one_opts, error)) { GOTO(done); } ret = _mongoc_delete_one_or_many( collection, false /* multi */, selector, &delete_one_opts.delete, &delete_one_opts.extra, reply, error); done: _mongoc_delete_one_opts_cleanup(&delete_one_opts); RETURN(ret); } bool mongoc_collection_delete_many( mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error) { mongoc_delete_many_opts_t delete_many_opts; bool ret = false; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(selector); _mongoc_bson_init_if_set(reply); if (!_mongoc_delete_many_opts_parse(collection->client, opts, &delete_many_opts, error)) { GOTO(done); } ret = _mongoc_delete_one_or_many( collection, true /* multi */, selector, &delete_many_opts.delete, &delete_many_opts.extra, reply, error); done: _mongoc_delete_many_opts_cleanup(&delete_many_opts); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_collection_get_read_prefs -- * * Fetch the default read preferences for the collection. * * Returns: * A mongoc_read_prefs_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_prefs_t * mongoc_collection_get_read_prefs(const mongoc_collection_t *collection) { BSON_ASSERT_PARAM(collection); return collection->read_prefs; } /* *-------------------------------------------------------------------------- * * mongoc_collection_set_read_prefs -- * * Sets the default read preferences for the collection instance. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_collection_set_read_prefs(mongoc_collection_t *collection, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT_PARAM(collection); if (collection->read_prefs) { mongoc_read_prefs_destroy(collection->read_prefs); collection->read_prefs = NULL; } if (read_prefs) { collection->read_prefs = mongoc_read_prefs_copy(read_prefs); } } /* *-------------------------------------------------------------------------- * * mongoc_collection_get_read_concern -- * * Fetches the default read concern for the collection instance. * * Returns: * A mongoc_read_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_concern_t * mongoc_collection_get_read_concern(const mongoc_collection_t *collection) { BSON_ASSERT_PARAM(collection); return collection->read_concern; } /* *-------------------------------------------------------------------------- * * mongoc_collection_set_read_concern -- * * Sets the default read concern for the collection instance. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_collection_set_read_concern(mongoc_collection_t *collection, const mongoc_read_concern_t *read_concern) { BSON_ASSERT_PARAM(collection); if (collection->read_concern) { mongoc_read_concern_destroy(collection->read_concern); collection->read_concern = NULL; } if (read_concern) { collection->read_concern = mongoc_read_concern_copy(read_concern); } } /* *-------------------------------------------------------------------------- * * mongoc_collection_get_write_concern -- * * Fetches the default write concern for the collection instance. * * Returns: * A mongoc_write_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_write_concern_t * mongoc_collection_get_write_concern(const mongoc_collection_t *collection) { BSON_ASSERT_PARAM(collection); return collection->write_concern; } /* *-------------------------------------------------------------------------- * * mongoc_collection_set_write_concern -- * * Sets the default write concern for the collection instance. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_collection_set_write_concern(mongoc_collection_t *collection, const mongoc_write_concern_t *write_concern) { BSON_ASSERT_PARAM(collection); if (collection->write_concern) { mongoc_write_concern_destroy(collection->write_concern); collection->write_concern = NULL; } if (write_concern) { collection->write_concern = mongoc_write_concern_copy(write_concern); } } /* *-------------------------------------------------------------------------- * * mongoc_collection_get_name -- * * Returns the name of the collection, excluding the database name. * * Returns: * A string which should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * mongoc_collection_get_name(mongoc_collection_t *collection) { BSON_ASSERT_PARAM(collection); return collection->collection; } /* *-------------------------------------------------------------------------- * * mongoc_collection_rename -- * * Rename the collection to @new_name. * * If @new_db is NULL, the same db will be used. * * If @drop_target_before_rename is true, then a collection named * @new_name will be dropped before renaming @collection to * @new_name. * * Returns: * true on success; false on failure and @error is set. * * Side effects: * @error is set on failure. * *-------------------------------------------------------------------------- */ bool mongoc_collection_rename(mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, bson_error_t *error) { return mongoc_collection_rename_with_opts(collection, new_db, new_name, drop_target_before_rename, NULL, error); } bool mongoc_collection_rename_with_opts(mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, const bson_t *opts, bson_error_t *error) { bson_t cmd = BSON_INITIALIZER; char *newns; bool ret; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(new_name); if (strchr(new_name, '$')) { _mongoc_set_error(error, MONGOC_ERROR_NAMESPACE, MONGOC_ERROR_NAMESPACE_INVALID, "\"%s\" is an invalid collection name.", new_name); return false; } newns = bson_strdup_printf("%s.%s", new_db ? new_db : collection->db, new_name); BSON_APPEND_UTF8(&cmd, "renameCollection", collection->ns); BSON_APPEND_UTF8(&cmd, "to", newns); if (drop_target_before_rename) { BSON_APPEND_BOOL(&cmd, "dropTarget", true); } ret = _mongoc_client_command_with_opts(collection->client, "admin", &cmd, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ collection->read_prefs, collection->read_concern, collection->write_concern, NULL, /* reply */ error); if (ret) { if (new_db) { bson_free(collection->db); collection->db = bson_strdup(new_db); } bson_free(collection->collection); collection->collection = bson_strdup(new_name); collection->collectionlen = (int)strlen(collection->collection); bson_free(collection->ns); collection->ns = bson_strdup_printf("%s.%s", collection->db, new_name); collection->nslen = (int)strlen(collection->ns); } bson_free(newns); bson_destroy(&cmd); return ret; } mongoc_bulk_operation_t * mongoc_collection_create_bulk_operation_with_opts(mongoc_collection_t *collection, const bson_t *opts) { mongoc_bulk_opts_t bulk_opts; mongoc_bulk_write_flags_t write_flags = MONGOC_BULK_WRITE_FLAGS_INIT; mongoc_write_concern_t *wc = NULL; mongoc_bulk_operation_t *bulk; bson_error_t err = {0}; BSON_ASSERT_PARAM(collection); (void)_mongoc_bulk_opts_parse(collection->client, opts, &bulk_opts, &err); if (!_mongoc_client_session_in_txn(bulk_opts.client_session)) { wc = COALESCE(bulk_opts.writeConcern, collection->write_concern); } write_flags.ordered = bulk_opts.ordered; bulk = _mongoc_bulk_operation_new(collection->client, collection->db, collection->collection, write_flags, wc); if (!bson_empty(&bulk_opts.let)) { mongoc_bulk_operation_set_let(bulk, &bulk_opts.let); } if (bulk_opts.comment.value_type != BSON_TYPE_EOD) { mongoc_bulk_operation_set_comment(bulk, &bulk_opts.comment); } bulk->session = bulk_opts.client_session; if (err.domain) { /* _mongoc_bulk_opts_parse failed, above */ memcpy(&bulk->result.error, &err, sizeof(bson_error_t)); } else if (_mongoc_client_session_in_txn(bulk_opts.client_session) && !mongoc_write_concern_is_default(bulk_opts.writeConcern)) { _mongoc_set_error(&bulk->result.error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting transaction"); } _mongoc_bulk_opts_cleanup(&bulk_opts); return bulk; } /* *-------------------------------------------------------------------------- * * mongoc_collection_find_and_modify_with_opts -- * * Find a document in @collection matching @query, applying @opts. * * If @reply is not NULL, then the result document will be placed * in reply and should be released with bson_destroy(). * * See for more information: * https://www.mongodb.com/docs/manual/reference/command/findAndModify/ * * Returns: * true on success; false on failure. * * Side effects: * reply is initialized. * error is set if false is returned. * *-------------------------------------------------------------------------- */ bool mongoc_collection_find_and_modify_with_opts(mongoc_collection_t *collection, const bson_t *query, const mongoc_find_and_modify_opts_t *opts, bson_t *reply, bson_error_t *error) { mongoc_cluster_t *cluster; mongoc_cmd_parts_t parts; bson_iter_t iter; bson_iter_t inner; const char *name; bson_t ss_reply; bson_t reply_local = BSON_INITIALIZER; bool ret = false; bson_t command = BSON_INITIALIZER; mongoc_server_stream_t *server_stream = NULL; mongoc_server_stream_t *retry_server_stream = NULL; mongoc_find_and_modify_appended_opts_t appended_opts; mongoc_write_concern_t *write_concern = NULL; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(query); BSON_ASSERT_PARAM(opts); if (reply) { bson_init(reply); } else { // Caller did not pass an output `reply`. Use a local `reply` to determine if a server error is retryable. reply = &reply_local; } cluster = &collection->client->cluster; mongoc_cmd_parts_init(&parts, collection->client, collection->db, MONGOC_QUERY_NONE, &command); parts.is_read_command = true; parts.is_write_command = true; if (!_mongoc_find_and_modify_appended_opts_parse(cluster->client, &opts->extra, &appended_opts, error)) { GOTO(done); } const mongoc_ss_log_context_t ss_log_context = {.operation = "findAndModify"}; server_stream = mongoc_cluster_stream_for_writes(cluster, &ss_log_context, appended_opts.client_session, NULL, &ss_reply, error); if (!server_stream) { bson_concat(reply, &ss_reply); bson_destroy(&ss_reply); GOTO(done); } name = mongoc_collection_get_name(collection); BSON_APPEND_UTF8(&command, "findAndModify", name); BSON_APPEND_DOCUMENT(&command, "query", query); if (opts->sort) { BSON_APPEND_DOCUMENT(&command, "sort", opts->sort); } if (opts->update) { if (_mongoc_document_is_pipeline(opts->update)) { BSON_APPEND_ARRAY(&command, "update", opts->update); } else { BSON_APPEND_DOCUMENT(&command, "update", opts->update); } } if (opts->fields) { BSON_APPEND_DOCUMENT(&command, "fields", opts->fields); } if (opts->flags & MONGOC_FIND_AND_MODIFY_REMOVE) { BSON_APPEND_BOOL(&command, "remove", true); } if (opts->flags & MONGOC_FIND_AND_MODIFY_UPSERT) { BSON_APPEND_BOOL(&command, "upsert", true); } if (opts->flags & MONGOC_FIND_AND_MODIFY_RETURN_NEW) { BSON_APPEND_BOOL(&command, "new", true); } if (opts->bypass_document_validation) { BSON_APPEND_BOOL(&command, "bypassDocumentValidation", opts->bypass_document_validation); } if (opts->max_time_ms > 0) { BSON_APPEND_INT32(&command, "maxTimeMS", opts->max_time_ms); } /* Some options set via mongoc_find_and_modify_opts_append were parsed. Set * them on the command parts. */ if (appended_opts.client_session) { mongoc_cmd_parts_set_session(&parts, appended_opts.client_session); } if (appended_opts.writeConcern) { if (_mongoc_client_session_in_txn(parts.assembled.session)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set write concern after starting transaction"); GOTO(done); } write_concern = appended_opts.writeConcern; } /* inherit write concern from collection if not in transaction */ else if (!_mongoc_client_session_in_txn(parts.assembled.session)) { if (!mongoc_write_concern_is_valid(collection->write_concern)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The write concern is invalid."); GOTO(done); } write_concern = collection->write_concern; } if (appended_opts.hint.value_type) { int max_wire_version = mongoc_write_concern_is_acknowledged(write_concern) ? WIRE_VERSION_FIND_AND_MODIFY_HINT_SERVER_SIDE_ERROR : WIRE_VERSION_FIND_AND_MODIFY_HINT; if (server_stream->sd->max_wire_version < max_wire_version) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support hint for findAndModify"); GOTO(done); } bson_append_value(&parts.extra, "hint", 4, &appended_opts.hint); } if (!bson_empty(&appended_opts.let)) { bson_append_document(&parts.extra, "let", 3, &appended_opts.let); } if (appended_opts.comment.value_type != BSON_TYPE_EOD) { bson_append_value(&parts.extra, "comment", 7, &appended_opts.comment); } /* Append any remaining unparsed options set via * mongoc_find_and_modify_opts_append to the command part. */ if (bson_iter_init(&iter, &appended_opts.extra)) { if (!mongoc_cmd_parts_append_opts(&parts, &iter, error)) { GOTO(done); } } /* An empty write concern amounts to a no-op, so there's no need to guard * against it. */ if (!mongoc_cmd_parts_set_write_concern(&parts, write_concern, error)) { GOTO(done); } parts.assembled.operation_id = ++cluster->operation_id; if (!mongoc_cmd_parts_assemble(&parts, server_stream, error)) { GOTO(done); } bson_destroy(reply); ret = mongoc_cluster_run_retryable_write( cluster, &parts.assembled, parts.is_retryable_write, &retry_server_stream, reply, error); if (bson_iter_init_find(&iter, reply, "writeConcernError") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { const char *errmsg = NULL; uint32_t code = 0; BSON_ASSERT(bson_iter_recurse(&iter, &inner)); while (bson_iter_next(&inner)) { if (BSON_ITER_IS_KEY(&inner, "code")) { code = (uint32_t)bson_iter_as_int64(&inner); } else if (BSON_ITER_IS_KEY(&inner, "errmsg")) { errmsg = bson_iter_utf8(&inner, NULL); } } _mongoc_set_error_with_category( error, MONGOC_ERROR_CATEGORY_SERVER, MONGOC_ERROR_WRITE_CONCERN, code, "Write Concern error: %s", errmsg); ret = false; } done: mongoc_server_stream_cleanup(server_stream); mongoc_server_stream_cleanup(retry_server_stream); if (ret && error) { /* if a retry succeeded, clear the initial error */ memset(error, 0, sizeof(bson_error_t)); } mongoc_cmd_parts_cleanup(&parts); bson_destroy(&command); bson_destroy(&reply_local); _mongoc_find_and_modify_appended_opts_cleanup(&appended_opts); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_collection_find_and_modify -- * * Find a document in @collection matching @query and update it with * the update document @update. * * If @reply is not NULL, then the result document will be placed * in reply and should be released with bson_destroy(). * * If @remove is true, then the matching documents will be removed. * * If @fields is not NULL, it will be used to select the desired * resulting fields. * * If @_new is true, then the new version of the document is returned * instead of the old document. * * See for more information: * https://www.mongodb.com/docs/manual/reference/command/findAndModify/ * * Returns: * true on success; false on failure. * * Side effects: * reply is initialized. * error is set if false is returned. * *-------------------------------------------------------------------------- */ bool mongoc_collection_find_and_modify(mongoc_collection_t *collection, const bson_t *query, const bson_t *sort, const bson_t *update, const bson_t *fields, bool _remove, bool upsert, bool _new, bson_t *reply, bson_error_t *error) { mongoc_find_and_modify_opts_t *opts; int flags = 0; bool ret; ENTRY; BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(query); BSON_ASSERT(update || _remove); if (_remove) { flags |= MONGOC_FIND_AND_MODIFY_REMOVE; } if (upsert) { flags |= MONGOC_FIND_AND_MODIFY_UPSERT; } if (_new) { flags |= MONGOC_FIND_AND_MODIFY_RETURN_NEW; } opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_sort(opts, sort); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_set_fields(opts, fields); mongoc_find_and_modify_opts_set_flags(opts, flags); ret = mongoc_collection_find_and_modify_with_opts(collection, query, opts, reply, error); mongoc_find_and_modify_opts_destroy(opts); return ret; } mongoc_change_stream_t * mongoc_collection_watch(const mongoc_collection_t *coll, const bson_t *pipeline, const bson_t *opts) { return _mongoc_change_stream_new_from_collection(coll, pipeline, opts); } struct _mongoc_index_model_t { bson_t *keys; bson_t *opts; }; mongoc_index_model_t * mongoc_index_model_new(const bson_t *keys, const bson_t *opts) { BSON_ASSERT_PARAM(keys); // `opts` may be NULL. mongoc_index_model_t *im = bson_malloc(sizeof(mongoc_index_model_t)); im->keys = bson_copy(keys); im->opts = opts ? bson_copy(opts) : NULL; return im; } void mongoc_index_model_destroy(mongoc_index_model_t *im) { if (!im) { return; } bson_destroy(im->keys); bson_destroy(im->opts); bson_free(im); } bool mongoc_collection_create_indexes_with_opts(mongoc_collection_t *collection, mongoc_index_model_t *const *models, size_t n_models, const bson_t *opts, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(collection); BSON_ASSERT_PARAM(models); // `opts` may be NULL. // `reply` may be NULL. // `error` may be NULL. bson_t reply_local = BSON_INITIALIZER; bson_t *reply_ptr; mongoc_server_stream_t *server_stream = NULL; bool ok = false; bson_t cmd = BSON_INITIALIZER; reply_ptr = reply ? reply : &reply_local; // Always initialize `reply` if set. Caller is expected to `bson_destroy // (reply)`. bson_init(reply_ptr); // Check for commitQuorum option. if (opts && bson_has_field(opts, "commitQuorum")) { const mongoc_ss_log_context_t ss_log_context = {.operation = "createIndexes"}; server_stream = mongoc_cluster_stream_for_writes(&collection->client->cluster, &ss_log_context, NULL /* mongoc_client_session_t */, NULL /* deprioritized servers */, reply_ptr, error); if (server_stream->sd->max_wire_version < WIRE_VERSION_4_4) { // Raise an error required by the specification: // "Drivers MUST manually raise an error if this option is specified // when creating an index on a pre 4.4 server." _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support the commitQuorum option"); GOTO(fail); } } // Build the createIndexes command. BSON_ASSERT(BSON_APPEND_UTF8(&cmd, "createIndexes", collection->collection)); bson_array_builder_t *indexes; BSON_ASSERT(BSON_APPEND_ARRAY_BUILDER_BEGIN(&cmd, "indexes", &indexes)); for (uint32_t idx = 0; idx < n_models; idx++) { /* Append a document of this form: : { key: { , , ... }, name: , , , ... }, */ bson_t index; BSON_ASSERT(bson_array_builder_append_document_begin(indexes, &index)); BSON_ASSERT(BSON_APPEND_DOCUMENT(&index, "key", models[idx]->keys)); bson_iter_t name_iter; if (models[idx]->opts && bson_iter_init_find(&name_iter, models[idx]->opts, "name")) { // `name` was specified as an index option. } else { // No `name` was specified. Create index `name` from keys. char *name = mongoc_collection_keys_to_index_string(models[idx]->keys); BSON_ASSERT(name); BSON_ASSERT(BSON_APPEND_UTF8(&index, "name", name)); bson_free(name); } if (models[idx]->opts) { BSON_ASSERT(bson_concat(&index, models[idx]->opts)); } BSON_ASSERT(bson_array_builder_append_document_end(indexes, &index)); } BSON_ASSERT(bson_append_array_builder_end(&cmd, indexes)); ok = mongoc_collection_write_command_with_opts(collection, &cmd, opts, reply_ptr, error); fail: mongoc_server_stream_cleanup(server_stream); bson_destroy(&cmd); bson_destroy(&reply_local); return ok; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-collection.h000066400000000000000000000267071511661753600247700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_COLLECTION_H #define MONGOC_COLLECTION_H #include #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_collection_t mongoc_collection_t; MONGOC_EXPORT(mongoc_cursor_t *) mongoc_collection_aggregate(mongoc_collection_t *collection, mongoc_query_flags_t flags, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_collection_destroy(mongoc_collection_t *collection); MONGOC_EXPORT(mongoc_collection_t *) mongoc_collection_copy(mongoc_collection_t *collection) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_collection_read_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_write_command_with_opts( mongoc_collection_t *collection, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_read_write_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_command_with_opts(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_command_simple(mongoc_collection_t *collection, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_drop(mongoc_collection_t *collection, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_drop_with_opts(mongoc_collection_t *collection, const bson_t *opts, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_drop_index(mongoc_collection_t *collection, const char *index_name, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_drop_index_with_opts(mongoc_collection_t *collection, const char *index_name, const bson_t *opts, bson_error_t *error); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_collection_find_indexes_with_opts(mongoc_collection_t *collection, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; typedef struct _mongoc_index_model_t mongoc_index_model_t; MONGOC_EXPORT(mongoc_index_model_t *) mongoc_index_model_new(const bson_t *keys, const bson_t *opts); MONGOC_EXPORT(void) mongoc_index_model_destroy(mongoc_index_model_t *model); MONGOC_EXPORT(bool) mongoc_collection_create_indexes_with_opts(mongoc_collection_t *collection, mongoc_index_model_t *const *models, size_t n_models, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_collection_find_with_opts(mongoc_collection_t *collection, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_collection_insert(mongoc_collection_t *collection, mongoc_insert_flags_t flags, const bson_t *document, const mongoc_write_concern_t *write_concern, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_insert_one( mongoc_collection_t *collection, const bson_t *document, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_insert_many(mongoc_collection_t *collection, const bson_t **documents, size_t n_documents, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_update(mongoc_collection_t *collection, mongoc_update_flags_t flags, const bson_t *selector, const bson_t *update, const mongoc_write_concern_t *write_concern, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_update_one(mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_update_many(mongoc_collection_t *collection, const bson_t *selector, const bson_t *update, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_replace_one(mongoc_collection_t *collection, const bson_t *selector, const bson_t *replacement, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_remove(mongoc_collection_t *collection, mongoc_remove_flags_t flags, const bson_t *selector, const mongoc_write_concern_t *write_concern, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_delete_one( mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_delete_many( mongoc_collection_t *collection, const bson_t *selector, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_rename(mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_rename_with_opts(mongoc_collection_t *collection, const char *new_db, const char *new_name, bool drop_target_before_rename, const bson_t *opts, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_find_and_modify_with_opts(mongoc_collection_t *collection, const bson_t *query, const mongoc_find_and_modify_opts_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_collection_find_and_modify(mongoc_collection_t *collection, const bson_t *query, const bson_t *sort, const bson_t *update, const bson_t *fields, bool _remove, bool upsert, bool _new, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(mongoc_bulk_operation_t *) mongoc_collection_create_bulk_operation_with_opts(mongoc_collection_t *collection, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(const mongoc_read_prefs_t *) mongoc_collection_get_read_prefs(const mongoc_collection_t *collection); MONGOC_EXPORT(void) mongoc_collection_set_read_prefs(mongoc_collection_t *collection, const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(const mongoc_read_concern_t *) mongoc_collection_get_read_concern(const mongoc_collection_t *collection); MONGOC_EXPORT(void) mongoc_collection_set_read_concern(mongoc_collection_t *collection, const mongoc_read_concern_t *read_concern); MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_collection_get_write_concern(const mongoc_collection_t *collection); MONGOC_EXPORT(void) mongoc_collection_set_write_concern(mongoc_collection_t *collection, const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(const char *) mongoc_collection_get_name(mongoc_collection_t *collection); MONGOC_EXPORT(char *) mongoc_collection_keys_to_index_string(const bson_t *keys) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_change_stream_t *) mongoc_collection_watch(const mongoc_collection_t *coll, const bson_t *pipeline, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(int64_t) mongoc_collection_count_documents(mongoc_collection_t *coll, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(int64_t) mongoc_collection_estimated_document_count(mongoc_collection_t *coll, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_COLLECTION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-compression-private.h000066400000000000000000000035251511661753600266370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_COMPRESSION_PRIVATE_H #define MONGOC_COMPRESSION_PRIVATE_H #include #include /* Compressor IDs */ #define MONGOC_COMPRESSOR_NOOP_ID 0 #define MONGOC_COMPRESSOR_NOOP_STR "noop" #define MONGOC_COMPRESSOR_SNAPPY_ID 1 #define MONGOC_COMPRESSOR_SNAPPY_STR "snappy" #define MONGOC_COMPRESSOR_ZLIB_ID 2 #define MONGOC_COMPRESSOR_ZLIB_STR "zlib" #define MONGOC_COMPRESSOR_ZSTD_ID 3 #define MONGOC_COMPRESSOR_ZSTD_STR "zstd" BSON_BEGIN_DECLS size_t mongoc_compressor_max_compressed_length(int32_t compressor_id, size_t size); bool mongoc_compressor_supported(mstr_view compressor); const char * mongoc_compressor_id_to_name(int32_t compressor_id); int mongoc_compressor_name_to_id(const char *compressor); bool mongoc_uncompress(int32_t compressor_id, const uint8_t *compressed, size_t compressed_len, uint8_t *uncompressed, size_t *uncompressed_size); bool mongoc_compress(int32_t compressor_id, int32_t compression_level, char *uncompressed, size_t uncompressed_len, char *compressed, size_t *compressed_len); BSON_END_DECLS #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-compression.c000066400000000000000000000204271511661753600251620ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifdef MONGOC_ENABLE_COMPRESSION #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB #include #endif #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY #include #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD #include #endif #endif size_t mongoc_compressor_max_compressed_length(int32_t compressor_id, size_t len) { TRACE("Getting compression length for '%s' (%d)", mongoc_compressor_id_to_name(compressor_id), compressor_id); switch (compressor_id) { #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY case MONGOC_COMPRESSOR_SNAPPY_ID: return snappy_max_compressed_length(len); #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB case MONGOC_COMPRESSOR_ZLIB_ID: BSON_ASSERT(mlib_in_range(unsigned long, len)); return compressBound((unsigned long)len); #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD case MONGOC_COMPRESSOR_ZSTD_ID: return ZSTD_compressBound(len); #endif case MONGOC_COMPRESSOR_NOOP_ID: return len; default: return 0; } } bool mongoc_compressor_supported(mstr_view compressor) { bool have_snappy = false, have_zlib = false, have_zstd = false; #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY have_snappy = true; #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB have_zlib = true; #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD have_zstd = true; #endif if (mstr_latin_casecmp(compressor, ==, mstr_cstring("snappy"))) { return have_snappy; } if (mstr_latin_casecmp(compressor, ==, mstr_cstring("zlib"))) { return have_zlib; } if (mstr_latin_casecmp(compressor, ==, mstr_cstring("zstd"))) { return have_zstd; } if (mstr_latin_casecmp(compressor, ==, mstr_cstring("noop"))) { return true; // We always have "noop" } // Any other compressor name is unrecognized return false; } const char * mongoc_compressor_id_to_name(int32_t compressor_id) { switch (compressor_id) { case MONGOC_COMPRESSOR_SNAPPY_ID: return MONGOC_COMPRESSOR_SNAPPY_STR; case MONGOC_COMPRESSOR_ZLIB_ID: return MONGOC_COMPRESSOR_ZLIB_STR; case MONGOC_COMPRESSOR_ZSTD_ID: return MONGOC_COMPRESSOR_ZSTD_STR; case MONGOC_COMPRESSOR_NOOP_ID: return MONGOC_COMPRESSOR_NOOP_STR; default: return "unknown"; } } int mongoc_compressor_name_to_id(const char *compressor) { #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY if (strcasecmp(MONGOC_COMPRESSOR_SNAPPY_STR, compressor) == 0) { return MONGOC_COMPRESSOR_SNAPPY_ID; } #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB if (strcasecmp(MONGOC_COMPRESSOR_ZLIB_STR, compressor) == 0) { return MONGOC_COMPRESSOR_ZLIB_ID; } #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD if (strcasecmp(MONGOC_COMPRESSOR_ZSTD_STR, compressor) == 0) { return MONGOC_COMPRESSOR_ZSTD_ID; } #endif if (strcasecmp(MONGOC_COMPRESSOR_NOOP_STR, compressor) == 0) { return MONGOC_COMPRESSOR_NOOP_ID; } return -1; } // To support unchecked casts from `unsigned long` to `size_t`. BSON_STATIC_ASSERT2(size_t_gte_ulong, SIZE_MAX >= ULONG_MAX); bool mongoc_uncompress(int32_t compressor_id, const uint8_t *compressed, size_t compressed_len, uint8_t *uncompressed, size_t *uncompressed_len) { BSON_ASSERT_PARAM(compressed); BSON_ASSERT_PARAM(uncompressed); BSON_ASSERT_PARAM(uncompressed_len); TRACE("Uncompressing with '%s' (%d)", mongoc_compressor_id_to_name(compressor_id), compressor_id); switch (compressor_id) { case MONGOC_COMPRESSOR_SNAPPY_ID: { #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY const snappy_status status = snappy_uncompress((const char *)compressed, compressed_len, (char *)uncompressed, uncompressed_len); return status == SNAPPY_OK; #else MONGOC_WARNING("Received snappy compressed opcode, but snappy " "compression is not compiled in"); return false; #endif } case MONGOC_COMPRESSOR_ZLIB_ID: { #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB // Malformed message: unrepresentable. if (BSON_UNLIKELY(!mlib_in_range(unsigned long, compressed_len))) { return false; } // Malformed message: unrepresentable. if (BSON_UNLIKELY(!mlib_in_range(unsigned long, *uncompressed_len))) { return false; } uLong actual_uncompressed_len = (uLong)*uncompressed_len; const int res = uncompress(uncompressed, &actual_uncompressed_len, (const Bytef *)compressed, (uLong)compressed_len); if (BSON_UNLIKELY(res != Z_OK)) { return false; } *uncompressed_len = (size_t)actual_uncompressed_len; return true; #else MONGOC_WARNING("Received zlib compressed opcode, but zlib " "compression is not compiled in"); return false; #endif } case MONGOC_COMPRESSOR_ZSTD_ID: { #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD const size_t res = ZSTD_decompress(uncompressed, *uncompressed_len, compressed, compressed_len); if (BSON_UNLIKELY(ZSTD_isError(res))) { return false; } *uncompressed_len = res; return true; #else MONGOC_WARNING("Received zstd compressed opcode, but zstd " "compression is not compiled in"); return false; #endif } case MONGOC_COMPRESSOR_NOOP_ID: // Malformed message: not enough space. if (BSON_UNLIKELY(*uncompressed_len < compressed_len)) { return false; } memcpy(uncompressed, compressed, compressed_len); *uncompressed_len = compressed_len; return true; default: MONGOC_WARNING("Unknown compressor ID %d", compressor_id); } return false; } bool mongoc_compress(int32_t compressor_id, int32_t compression_level, char *uncompressed, size_t uncompressed_len, char *compressed, size_t *compressed_len) { TRACE("Compressing with '%s' (%d)", mongoc_compressor_id_to_name(compressor_id), compressor_id); switch (compressor_id) { case MONGOC_COMPRESSOR_SNAPPY_ID: #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY /* No compression_level option for snappy */ return snappy_compress(uncompressed, uncompressed_len, compressed, compressed_len) == SNAPPY_OK; #else MONGOC_ERROR("Client attempting to use compress with snappy, but snappy " "compression is not compiled in"); return false; #endif case MONGOC_COMPRESSOR_ZLIB_ID: #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB BSON_ASSERT(mlib_in_range(unsigned long, uncompressed_len)); return compress2((unsigned char *)compressed, (unsigned long *)compressed_len, (unsigned char *)uncompressed, (unsigned long)uncompressed_len, compression_level) == Z_OK; #else MONGOC_ERROR("Client attempting to use compress with zlib, but zlib " "compression is not compiled in"); return false; #endif case MONGOC_COMPRESSOR_ZSTD_ID: { #ifdef MONGOC_ENABLE_COMPRESSION_ZSTD int ok; ok = ZSTD_compress((void *)compressed, *compressed_len, (const void *)uncompressed, uncompressed_len, 0); if (!ZSTD_isError(ok)) { *compressed_len = ok; } return !ZSTD_isError(ok); #else MONGOC_ERROR("Client attempting to use compress with zstd, but zstd " "compression is not compiled in"); return false; #endif } case MONGOC_COMPRESSOR_NOOP_ID: memcpy(compressed, uncompressed, uncompressed_len); *compressed_len = uncompressed_len; return true; default: return false; } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-config-private.h.in000066400000000000000000000016731511661753600261520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_CONFIG_PRIVATE_H #define MONGOC_CONFIG_PRIVATE_H // clang-format off // MONGOC_CXX_COMPILER_ID identifies the (optional) C++ compiler detected by CMake. #define MONGOC_CXX_COMPILER_ID "@MONGOC_CXX_COMPILER_ID@" #define MONGOC_CXX_COMPILER_VERSION "@MONGOC_CXX_COMPILER_VERSION@" // clang-format on #endif // MONGOC_CONFIG_PRIVATE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-config.h.in000066400000000000000000000236351511661753600245040ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION) #error "Only can be included directly." #endif #ifndef MONGOC_CONFIG_H #define MONGOC_CONFIG_H /* clang-format off */ /* * NOTICE: * If you're about to update this file and add a config flag, make sure to * update: * o The bitfield in mongoc-handshake-private.h * o _mongoc_handshake_get_config_hex_string() in mongoc-handshake.c * o examples/parse_handshake_cfg.py * o test_handshake_platform_config in test-mongoc-handshake.c */ /* MONGOC_USER_SET_CFLAGS is set from config based on what compiler flags were * used to compile mongoc */ #define MONGOC_USER_SET_CFLAGS "@MONGOC_USER_SET_CFLAGS@" #define MONGOC_USER_SET_LDFLAGS "@MONGOC_USER_SET_LDFLAGS@" /* MONGOC_CC is used to determine what C compiler was used to compile mongoc */ #define MONGOC_CC "@MONGOC_CC@" /* * MONGOC_ENABLE_SSL_SECURE_CHANNEL is set from configure to determine if we are * compiled with Native SSL support on Windows */ #define MONGOC_ENABLE_SSL_SECURE_CHANNEL @MONGOC_ENABLE_SSL_SECURE_CHANNEL@ #if MONGOC_ENABLE_SSL_SECURE_CHANNEL != 1 # undef MONGOC_ENABLE_SSL_SECURE_CHANNEL #endif /* * MONGOC_ENABLE_CRYPTO_CNG is set from configure to determine if we are * compiled with Native Crypto support on Windows */ #define MONGOC_ENABLE_CRYPTO_CNG @MONGOC_ENABLE_CRYPTO_CNG@ #if MONGOC_ENABLE_CRYPTO_CNG != 1 # undef MONGOC_ENABLE_CRYPTO_CNG #endif /* * MONGOC_HAVE_BCRYPT_PBKDF2 is set from configure to determine if * our Bcrypt Windows library supports PBKDF2 */ #define MONGOC_HAVE_BCRYPT_PBKDF2 @MONGOC_HAVE_BCRYPT_PBKDF2@ #if MONGOC_HAVE_BCRYPT_PBKDF2 != 1 # undef MONGOC_HAVE_BCRYPT_PBKDF2 #endif /* * MONGOC_ENABLE_SSL_SECURE_TRANSPORT is set from configure to determine if we are * compiled with Native SSL support on Darwin */ #define MONGOC_ENABLE_SSL_SECURE_TRANSPORT @MONGOC_ENABLE_SSL_SECURE_TRANSPORT@ #if MONGOC_ENABLE_SSL_SECURE_TRANSPORT != 1 # undef MONGOC_ENABLE_SSL_SECURE_TRANSPORT #endif /* * MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO is set from configure to determine if we are * compiled with Native Crypto support on Darwin */ #define MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO @MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO@ #if MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO != 1 # undef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO #endif /* * MONGOC_ENABLE_SSL_OPENSSL is set from configure to determine if we are * compiled with OpenSSL support. */ #define MONGOC_ENABLE_SSL_OPENSSL @MONGOC_ENABLE_SSL_OPENSSL@ #if MONGOC_ENABLE_SSL_OPENSSL != 1 # undef MONGOC_ENABLE_SSL_OPENSSL #endif /* * MONGOC_ENABLE_CRYPTO_LIBCRYPTO is set from configure to determine if we are * compiled with OpenSSL support. */ #define MONGOC_ENABLE_CRYPTO_LIBCRYPTO @MONGOC_ENABLE_CRYPTO_LIBCRYPTO@ #if MONGOC_ENABLE_CRYPTO_LIBCRYPTO != 1 # undef MONGOC_ENABLE_CRYPTO_LIBCRYPTO #endif /* * MONGOC_ENABLE_SSL is set from configure to determine if we are * compiled with any SSL support. */ #define MONGOC_ENABLE_SSL @MONGOC_ENABLE_SSL@ #if MONGOC_ENABLE_SSL != 1 # undef MONGOC_ENABLE_SSL #endif /* * MONGOC_ENABLE_CRYPTO is set from configure to determine if we are * compiled with any crypto support. */ #define MONGOC_ENABLE_CRYPTO @MONGOC_ENABLE_CRYPTO@ #if MONGOC_ENABLE_CRYPTO != 1 # undef MONGOC_ENABLE_CRYPTO #endif /* * Use system crypto profile */ #define MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE @MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE@ #if MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE != 1 # undef MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE #endif /* * Use ASN1_STRING_get0_data () rather than the deprecated ASN1_STRING_data */ #define MONGOC_HAVE_ASN1_STRING_GET0_DATA @MONGOC_HAVE_ASN1_STRING_GET0_DATA@ #if MONGOC_HAVE_ASN1_STRING_GET0_DATA != 1 # undef MONGOC_HAVE_ASN1_STRING_GET0_DATA #endif /* * MONGOC_ENABLE_SASL is set from configure to determine if we are * compiled with SASL support. */ #define MONGOC_ENABLE_SASL @MONGOC_ENABLE_SASL@ #if MONGOC_ENABLE_SASL != 1 # undef MONGOC_ENABLE_SASL #endif /* * MONGOC_ENABLE_SASL_CYRUS is set from configure to determine if we are * compiled with Cyrus SASL support. */ #define MONGOC_ENABLE_SASL_CYRUS @MONGOC_ENABLE_SASL_CYRUS@ #if MONGOC_ENABLE_SASL_CYRUS != 1 # undef MONGOC_ENABLE_SASL_CYRUS #endif /* * MONGOC_ENABLE_SASL_SSPI is set from configure to determine if we are * compiled with SSPI support. */ #define MONGOC_ENABLE_SASL_SSPI @MONGOC_ENABLE_SASL_SSPI@ #if MONGOC_ENABLE_SASL_SSPI != 1 # undef MONGOC_ENABLE_SASL_SSPI #endif /* * MONGOC_HAVE_SASL_CLIENT_DONE is set from configure to determine if we * have SASL and its version is new enough to use sasl_client_done (), * which supersedes sasl_done (). */ #define MONGOC_HAVE_SASL_CLIENT_DONE @MONGOC_HAVE_SASL_CLIENT_DONE@ #if MONGOC_HAVE_SASL_CLIENT_DONE != 1 # undef MONGOC_HAVE_SASL_CLIENT_DONE #endif /* * MONGOC_HAVE_SOCKLEN is set from configure to determine if we * need to emulate the type. */ #define MONGOC_HAVE_SOCKLEN @MONGOC_HAVE_SOCKLEN@ #if MONGOC_HAVE_SOCKLEN != 1 # undef MONGOC_HAVE_SOCKLEN #endif /** * @brief Defined to 0/1 for whether we were configured with ENABLE_SRV */ #define MONGOC_ENABLE_SRV @MONGOC_ENABLE_SRV@ /* * MONGOC_HAVE_DNSAPI is set from configure to determine if we should use the * Windows dnsapi for SRV record lookups. */ #define MONGOC_HAVE_DNSAPI @MONGOC_HAVE_DNSAPI@ #if MONGOC_HAVE_DNSAPI != 1 # undef MONGOC_HAVE_DNSAPI #endif /* * MONGOC_HAVE_RES_NSEARCH is set from configure to determine if we * have thread-safe res_nsearch(). */ #define MONGOC_HAVE_RES_NSEARCH @MONGOC_HAVE_RES_NSEARCH@ #if MONGOC_HAVE_RES_NSEARCH != 1 # undef MONGOC_HAVE_RES_NSEARCH #endif /* * MONGOC_HAVE_RES_NDESTROY is set from configure to determine if we * have BSD / Darwin's res_ndestroy(). */ #define MONGOC_HAVE_RES_NDESTROY @MONGOC_HAVE_RES_NDESTROY@ #if MONGOC_HAVE_RES_NDESTROY != 1 # undef MONGOC_HAVE_RES_NDESTROY #endif /* * MONGOC_HAVE_RES_NCLOSE is set from configure to determine if we * have Linux's res_nclose(). */ #define MONGOC_HAVE_RES_NCLOSE @MONGOC_HAVE_RES_NCLOSE@ #if MONGOC_HAVE_RES_NCLOSE != 1 # undef MONGOC_HAVE_RES_NCLOSE #endif /* * MONGOC_HAVE_RES_SEARCH is set from configure to determine if we * have thread-unsafe res_search(). It's unset if we have the preferred * res_nsearch(). */ #define MONGOC_HAVE_RES_SEARCH @MONGOC_HAVE_RES_SEARCH@ #if MONGOC_HAVE_RES_SEARCH != 1 # undef MONGOC_HAVE_RES_SEARCH #endif /* * Set from configure, see * https://curl.haxx.se/mail/lib-2009-04/0287.html */ #define MONGOC_SOCKET_ARG2 @MONGOC_SOCKET_ARG2@ #define MONGOC_SOCKET_ARG3 @MONGOC_SOCKET_ARG3@ /* * Enable wire protocol compression negotiation * */ #define MONGOC_ENABLE_COMPRESSION @MONGOC_ENABLE_COMPRESSION@ #if MONGOC_ENABLE_COMPRESSION != 1 # undef MONGOC_ENABLE_COMPRESSION #endif /* * Set if we have snappy compression support * */ #define MONGOC_ENABLE_COMPRESSION_SNAPPY @MONGOC_ENABLE_COMPRESSION_SNAPPY@ #if MONGOC_ENABLE_COMPRESSION_SNAPPY != 1 # undef MONGOC_ENABLE_COMPRESSION_SNAPPY #endif /* * Set if we have zlib compression support * */ #define MONGOC_ENABLE_COMPRESSION_ZLIB @MONGOC_ENABLE_COMPRESSION_ZLIB@ #if MONGOC_ENABLE_COMPRESSION_ZLIB != 1 # undef MONGOC_ENABLE_COMPRESSION_ZLIB #endif /* * Set if we have zstd compression support * */ #define MONGOC_ENABLE_COMPRESSION_ZSTD @MONGOC_ENABLE_COMPRESSION_ZSTD@ #if MONGOC_ENABLE_COMPRESSION_ZSTD != 1 # undef MONGOC_ENABLE_COMPRESSION_ZSTD #endif /* * Set if performance counters are available and not disabled. * */ #define MONGOC_ENABLE_SHM_COUNTERS @MONGOC_ENABLE_SHM_COUNTERS@ #if MONGOC_ENABLE_SHM_COUNTERS != 1 # undef MONGOC_ENABLE_SHM_COUNTERS #endif /* * Set if we have enabled fast counters on Intel using the RDTSCP instruction * */ #define MONGOC_ENABLE_RDTSCP @MONGOC_ENABLE_RDTSCP@ #if MONGOC_ENABLE_RDTSCP != 1 # undef MONGOC_ENABLE_RDTSCP #endif /* * Set if we have the sched_getcpu() function for use with counters * */ #define MONGOC_HAVE_SCHED_GETCPU @MONGOC_HAVE_SCHED_GETCPU@ #if MONGOC_HAVE_SCHED_GETCPU != 1 # undef MONGOC_HAVE_SCHED_GETCPU #endif /* * Set if tracing is enabled. Logs things like network communication and * entry/exit of certain functions. */ #define MONGOC_TRACE @MONGOC_TRACE@ /* * Set if we have Client Side Encryption support. */ #define MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION @MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION@ #if MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION != 1 # undef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION #endif /* * Set if struct sockaddr_storage has __ss_family (instead of ss_family) */ #define MONGOC_HAVE_SS_FAMILY @MONGOC_HAVE_SS_FAMILY@ #if MONGOC_HAVE_SS_FAMILY != 1 # undef MONGOC_HAVE_SS_FAMILY #endif /* * Set if building with AWS IAM support. */ #define MONGOC_ENABLE_MONGODB_AWS_AUTH @MONGOC_ENABLE_MONGODB_AWS_AUTH@ #if MONGOC_ENABLE_MONGODB_AWS_AUTH != 1 # undef MONGOC_ENABLE_MONGODB_AWS_AUTH #endif enum { /** * @brief Compile-time constant determining whether the mongoc library was * compiled with tracing enabled. * * Can be controlled with the “ENABLE_TRACING†configure-time boolean option */ MONGOC_TRACE_ENABLED = MONGOC_TRACE, /** * @brief Compile-time constant indicating whether the mongoc library was * compiled with SRV server discovery support. * * Can be controled with the “ENABLE_SRV†configure-time boolean option. */ MONGOC_SRV_ENABLED = MONGOC_ENABLE_SRV, }; /* clang-format on */ #endif /* MONGOC_CONFIG_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-counters-private.h000066400000000000000000000220221511661753600261310ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_COUNTERS_PRIVATE_H #define MONGOC_COUNTERS_PRIVATE_H #include #include #include #ifdef __linux__ #include #include #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) #include #include #include #include #elif defined(__hpux__) #include #endif BSON_BEGIN_DECLS void _mongoc_counters_init(void); void _mongoc_counters_cleanup(void); static BSON_INLINE unsigned _mongoc_get_cpu_count(void) { #if defined(__linux__) && defined(_SC_NPROCESSORS_CONF) long count = sysconf(_SC_NPROCESSORS_CONF); if (count < 1) { return 1; } return count; #elif defined(__hpux__) struct pst_dynamic psd; if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) != -1) { return psd.psd_max_proc_cnt; } return 1; #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) int mib[2]; int maxproc; size_t len; mib[0] = CTL_HW; mib[1] = HW_NCPU; len = sizeof(maxproc); if (-1 == sysctl(mib, 2, &maxproc, &len, NULL, 0)) { return 1; } return len; #elif defined(__APPLE__) || defined(_AIX) int ncpu; ncpu = (int)sysconf(_SC_NPROCESSORS_ONLN); return (ncpu > 0) ? ncpu : 1; #elif defined(_MSC_VER) || defined(_WIN32) SYSTEM_INFO si; GetSystemInfo(&si); return si.dwNumberOfProcessors; #else #warning "_mongoc_get_cpu_count() not supported, defaulting to 1." return 1; #endif } #if defined(MONGOC_ENABLE_RDTSCP) static BSON_INLINE unsigned _mongoc_sched_getcpu(void) { volatile uint32_t rax, rdx, rcx; __asm__ volatile("rdtscp\n" : "=a"(rax), "=d"(rdx), "=c"(rcx) : :); unsigned core_id; core_id = rcx & 0xFFF; return core_id; } #elif defined(MONGOC_HAVE_SCHED_GETCPU) #define _mongoc_sched_getcpu sched_getcpu #elif defined(__APPLE__) && defined(__aarch64__) static BSON_INLINE unsigned _mongoc_sched_getcpu(void) { uintptr_t tls; unsigned core_id; /* Get the current thread ID, not the core ID. * Getting the core ID requires privileged execution. */ __asm__ volatile("mrs %x0, tpidrro_el0" : "=r"(tls)); /* In ARM, only 8 cores are manageable. */ core_id = tls & 0x07u; return core_id; } #else #define _mongoc_sched_getcpu() (0) #endif #ifndef SLOTS_PER_CACHELINE #define SLOTS_PER_CACHELINE 8 #endif typedef struct { int64_t slots[SLOTS_PER_CACHELINE]; } mongoc_counter_slots_t; typedef struct { mongoc_counter_slots_t *cpus; } mongoc_counter_t; #define COUNTER(ident, Category, Name, Description) extern mongoc_counter_t __mongoc_counter_##ident; #include #undef COUNTER enum { #define COUNTER(ident, Category, Name, Description) COUNTER_##ident, #include #undef COUNTER LAST_COUNTER }; #ifdef MONGOC_ENABLE_SHM_COUNTERS #define COUNTER(ident, Category, Name, Description) \ static BSON_INLINE void mongoc_counter_##ident##_add(int64_t val) \ { \ int64_t *counter = &BSON_CONCAT(__mongoc_counter_, ident) \ .cpus[_mongoc_sched_getcpu()] \ .slots[BSON_CONCAT(COUNTER_, ident) % SLOTS_PER_CACHELINE]; \ mcommon_atomic_int64_fetch_add(counter, val, mcommon_memory_order_seq_cst); \ } \ static BSON_INLINE void mongoc_counter_##ident##_inc(void) \ { \ mongoc_counter_##ident##_add(1); \ } \ static BSON_INLINE void mongoc_counter_##ident##_dec(void) \ { \ mongoc_counter_##ident##_add(-1); \ } \ static BSON_INLINE void mongoc_counter_##ident##_reset(void) \ { \ uint32_t i; \ for (i = 0; i < _mongoc_get_cpu_count(); i++) { \ int64_t *counter = &__mongoc_counter_##ident.cpus[i].slots[COUNTER_##ident % SLOTS_PER_CACHELINE]; \ mcommon_atomic_int64_exchange(counter, 0, mcommon_memory_order_seq_cst); \ } \ mcommon_atomic_thread_fence(); \ } \ static BSON_INLINE int32_t mongoc_counter_##ident##_count(void) \ { \ int32_t _sum = 0; \ uint32_t _i; \ for (_i = 0; _i < _mongoc_get_cpu_count(); _i++) { \ const int64_t *counter = \ &BSON_CONCAT(__mongoc_counter_, ident).cpus[_i].slots[BSON_CONCAT(COUNTER_, ident) % SLOTS_PER_CACHELINE]; \ _sum += mcommon_atomic_int64_fetch(counter, mcommon_memory_order_seq_cst); \ } \ return _sum; \ } #include #undef COUNTER #else /* when counters are disabled, these functions are no-ops */ #define COUNTER(ident, Category, Name, Description) \ static BSON_INLINE void mongoc_counter_##ident##_add(int64_t val) \ { \ (void)val; \ } \ static BSON_INLINE void mongoc_counter_##ident##_inc(void) \ { \ } \ static BSON_INLINE void mongoc_counter_##ident##_dec(void) \ { \ } \ static BSON_INLINE void mongoc_counter_##ident##_reset(void) \ { \ } \ static BSON_INLINE void mongoc_counter_##ident##_count(void) \ { \ } #include #undef COUNTER #endif BSON_END_DECLS #endif /* MONGOC_COUNTERS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-counters.c000066400000000000000000000203221511661753600244550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifdef BSON_OS_UNIX #include #include #include #endif #ifdef _MSC_VER #include #endif #include #include #include #pragma pack(1) typedef struct { uint32_t offset; uint32_t slot; char category[24]; char name[32]; char description[64]; } mongoc_counter_info_t; #pragma pack() BSON_STATIC_ASSERT2(counter_info_t, sizeof(mongoc_counter_info_t) == 128); #pragma pack(1) typedef struct { uint32_t size; uint32_t n_cpu; uint32_t n_counters; uint32_t infos_offset; uint32_t values_offset; uint8_t padding[44]; } mongoc_counters_t; #pragma pack() BSON_STATIC_ASSERT2(counters_t, sizeof(mongoc_counters_t) == 64); #ifdef MONGOC_ENABLE_SHM_COUNTERS /* When counters are enabled at compile time but fail to initiate a shared * memory segment, then fall back to a malloc'd segment. This malloc'd segment * isn't useful to anyone. But by using this fallback, the counter increment * functions can behave the same. I.e. they do not need to have a runtime check * for whether or not initiating the shared memory segment succeeded. */ static void *gCounterFallback = NULL; #define COUNTER(ident, Category, Name, Description) mongoc_counter_t __mongoc_counter_##ident; #include #undef COUNTER /** * mongoc_counters_use_shm: * * Checks to see if counters should be exported over a shared memory segment. * * Returns: true if SHM is to be used. */ static bool mongoc_counters_use_shm(void) { return !getenv("MONGOC_DISABLE_SHM"); } /** * mongoc_counters_calc_size: * * Returns the number of bytes required for the shared memory segment of * the process. This segment contains the various statistical counters for * the process. * * Returns: The number of bytes required. */ static size_t mongoc_counters_calc_size(void) { size_t n_cpu; size_t n_groups; size_t size; n_cpu = _mongoc_get_cpu_count(); n_groups = (LAST_COUNTER / SLOTS_PER_CACHELINE) + 1; size = (sizeof(mongoc_counters_t) + (LAST_COUNTER * sizeof(mongoc_counter_info_t)) + (n_cpu * n_groups * sizeof(mongoc_counter_slots_t))); #ifdef BSON_OS_UNIX const long pg_sz = sysconf(_SC_PAGESIZE); if (mlib_cmp(size, >, pg_sz)) { return size; } else { BSON_ASSERT(pg_sz > 0); return (size_t)pg_sz; } #else return size; #endif } #endif /** * mongoc_counters_destroy: * * Removes the shared memory segment for the current processes counters. */ void _mongoc_counters_cleanup(void) { #ifdef MONGOC_ENABLE_SHM_COUNTERS if (gCounterFallback) { bson_free(gCounterFallback); gCounterFallback = NULL; #if defined(BSON_OS_UNIX) && defined(MONGOC_ENABLE_SHM_COUNTERS) } else { char name[32]; int pid; pid = getpid(); // Truncation is OK. int req = bson_snprintf(name, sizeof name, "/mongoc-%d", pid); BSON_ASSERT(req > 0); shm_unlink(name); #endif } #endif } #ifdef MONGOC_ENABLE_SHM_COUNTERS /** * mongoc_counters_alloc: * @size: The size of the shared memory segment. * * This function allocates the shared memory segment for use by counters * within the process. * * Returns: A shared memory segment, or malloc'd memory on failure. */ static void * mongoc_counters_alloc(size_t size) { #if defined(BSON_OS_UNIX) && defined(MONGOC_ENABLE_SHM_COUNTERS) void *mem; char name[32]; int pid; int fd; if (!mongoc_counters_use_shm()) { goto skip_shm; } pid = getpid(); // Truncation is OK. int req = bson_snprintf(name, sizeof name, "/mongoc-%d", pid); BSON_ASSERT(req > 0); #ifndef O_NOFOLLOW #define O_NOFOLLOW 0 #endif if (-1 == (fd = shm_open(name, O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR | O_NOFOLLOW))) { goto fail_noclean; } #if defined(__APPLE__) // macOS does not have posix_fallocate available. if (-1 == ftruncate(fd, size)) { goto fail_cleanup; } #else // Prefer posix_fallocate on Linux. posix_fallocate ensures that disk space // is allocated. if (0 != posix_fallocate(fd, 0, size)) { goto fail_cleanup; } #endif // __APPLE__ mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (mem == MAP_FAILED) { goto fail_cleanup; } close(fd); memset(mem, 0, size); return mem; fail_cleanup: shm_unlink(name); close(fd); fail_noclean: MONGOC_WARNING("Falling back to malloc for counters."); skip_shm: #endif gCounterFallback = (void *)bson_malloc0(size); return gCounterFallback; } /** * mongoc_counters_register: * @counters: A mongoc_counter_t. * @num: The counter number. * @category: The counter category. * @name: THe counter name. * @description The counter description. * * Registers a new counter in the memory segment for counters. If the counters * are exported over shared memory, it will be made available. * * Returns: The offset to the data for the counters values. */ static size_t mongoc_counters_register( mongoc_counters_t *counters, uint32_t num, const char *category, const char *name, const char *description) { mongoc_counter_info_t *infos; char *segment; int n_cpu; BSON_ASSERT(counters); BSON_ASSERT(category); BSON_ASSERT(name); BSON_ASSERT(description); /* * Implementation Note: * * The memory barrier is required so that all of the above has been * completed. Then increment the n_counters so that a reading application * only knows about the counter after we have initialized it. */ n_cpu = _mongoc_get_cpu_count(); segment = (char *)counters; infos = (mongoc_counter_info_t *)(segment + counters->infos_offset); infos = &infos[counters->n_counters]; infos->slot = num % SLOTS_PER_CACHELINE; infos->offset = (counters->values_offset + ((num / SLOTS_PER_CACHELINE) * n_cpu * sizeof(mongoc_counter_slots_t))); bson_strncpy(infos->category, category, sizeof infos->category); bson_strncpy(infos->name, name, sizeof infos->name); bson_strncpy(infos->description, description, sizeof infos->description); mcommon_atomic_thread_fence(); counters->n_counters++; return infos->offset; } #endif /** * mongoc_counters_init: * * Initializes the mongoc counters system. This should be run on library * initialization using the GCC constructor attribute. */ void _mongoc_counters_init(void) { #ifdef MONGOC_ENABLE_SHM_COUNTERS mongoc_counter_info_t *info; mongoc_counters_t *counters; size_t infos_size; size_t off; size_t size; char *segment; size = mongoc_counters_calc_size(); segment = (char *)mongoc_counters_alloc(size); infos_size = LAST_COUNTER * sizeof *info; counters = (mongoc_counters_t *)segment; counters->n_cpu = _mongoc_get_cpu_count(); counters->n_counters = 0; counters->infos_offset = sizeof *counters; counters->values_offset = (uint32_t)(counters->infos_offset + infos_size); BSON_ASSERT((counters->values_offset % 64) == 0); #define COUNTER(ident, Category, Name, Desc) \ off = mongoc_counters_register(counters, COUNTER_##ident, Category, Name, Desc); \ __mongoc_counter_##ident.cpus = (mongoc_counter_slots_t *)(segment + off); #include #undef COUNTER /* * NOTE: * * Only update the size of the shared memory area for the client after * we have initialized the rest of the counters. Don't forget our memory * barrier to prevent compiler reordering. */ mcommon_atomic_thread_fence(); counters->size = (uint32_t)size; #endif } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-counters.defs000066400000000000000000000073721511661753600251660ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ COUNTER(op_egress_total, "Operations", "Egress Total", "The number of sent operations.") COUNTER(op_ingress_total, "Operations", "Ingress Total", "The number of received operations.") COUNTER(op_egress_msg, "Operations", "Egress Messages", "The number of sent messages operations.") COUNTER(op_ingress_msg, "Operations", "Ingress Messages", "The number of received messages operations.") COUNTER(op_egress_compressed, "Operations", "Egress Compressed", "The number of sent compressed operations.") COUNTER(op_ingress_compressed, "Operations", "Ingress Compressed", "The number of received compressed operations.") COUNTER(op_egress_query, "Operations", "Egress Queries", "The number of sent Query operations.") COUNTER(op_ingress_reply, "Operations", "Ingress Reply", "The number of received Reply operations.") COUNTER(op_egress_getmore, "Operations", "Egress GetMore", "The number of sent GetMore operations.") COUNTER(op_egress_insert, "Operations", "Egress Insert", "The number of sent Insert operations.") COUNTER(op_egress_delete, "Operations", "Egress Delete", "The number of sent Delete operations.") COUNTER(op_egress_update, "Operations", "Egress Update", "The number of sent Update operations.") COUNTER(op_egress_killcursors, "Operations", "Egress KillCursors", "The number of sent KillCursors operations.") COUNTER(cursors_active, "Cursors", "Active", "The number of active cursors.") COUNTER(cursors_disposed, "Cursors", "Disposed", "The number of disposed cursors.") COUNTER(clients_active, "Clients", "Active", "The number of active clients.") COUNTER(clients_disposed, "Clients", "Disposed", "The number of disposed clients.") COUNTER(streams_active, "Streams", "Active", "The number of active streams.") COUNTER(streams_disposed, "Streams", "Disposed", "The number of disposed streams.") COUNTER(streams_egress, "Streams", "Egress Bytes", "The number of bytes sent.") COUNTER(streams_ingress, "Streams", "Ingress Bytes", "The number of bytes received.") COUNTER(streams_timeout, "Streams", "N Socket Timeouts", "The number of socket timeouts.") COUNTER(client_pools_active, "Client Pools", "Active", "The number of active client pools.") COUNTER(client_pools_disposed, "Client Pools", "Disposed", "The number of disposed client pools.") COUNTER(protocol_ingress_error, "Protocol", "Ingress Errors", "The number of protocol errors on ingress.") COUNTER(auth_failure, "Auth", "Failures", "The number of failed authentication requests.") COUNTER(auth_success, "Auth", "Success", "The number of successful authentication requests.") COUNTER(dns_failure, "DNS", "Failure", "The number of failed DNS requests.") COUNTER(dns_success, "DNS", "Success", "The number of successful DNS requests.") mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypt-private.h000066400000000000000000000151261511661753600254370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CRYPT_PRIVATE_H #define MONGOC_CRYPT_PRIVATE_H #include #include #include typedef struct mc_kms_credentials_callback { mongoc_kms_credentials_provider_callback_fn fn; void *userdata; } mc_kms_credentials_callback; #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION /* For interacting with libmongocrypt */ typedef struct __mongoc_crypt_t _mongoc_crypt_t; // `_mongoc_crypt_libmongocrypt_version` returns the version of the loaded libmongocrypt. const char * _mongoc_crypt_get_libmongocrypt_version(void); /* Creates a new handle into libmongocrypt. - schema_map may be NULL. - may return NULL and set error. */ _mongoc_crypt_t * _mongoc_crypt_new(const bson_t *kms_providers, const bson_t *schema_map, const bson_t *encrypted_fields_map, const bson_t *tls_opts, const char *crypt_shared_lib_path, bool crypt_shared_lib_required, bool bypass_auto_encryption, bool bypass_query_analysis, mc_kms_credentials_callback creds_cb, mcd_optional_u64_t cache_expiration_ms, bson_error_t *error); void _mongoc_crypt_destroy(_mongoc_crypt_t *crypt); /* Perform auto encryption. - cmd_out is always initialized. - may return false and set error. */ bool _mongoc_crypt_auto_encrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *key_vault_coll, mongoc_client_t *mongocryptd_client, mongoc_client_t *collinfo_client, const char *db_name, const bson_t *cmd_in, bson_t *cmd_out, bson_error_t *error); /* Perform auto decryption. - doc_out is always initialized. - may return false and set error. */ bool _mongoc_crypt_auto_decrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *key_vault_coll, const bson_t *doc_in, bson_t *doc_out, bson_error_t *error); /* Perform explicit encryption. Return false on error and sets `error`. */ bool _mongoc_crypt_explicit_encrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *key_vault_coll, const char *algorithm /* may be NULL */, const bson_value_t *keyid /* may be NULL */, const char *keyaltname /* may be NULL */, const char *query_type /* may be NULL */, const int64_t *contention_factor /* may be NULL */, const bson_t *range_opts /* may be NULL */, const bson_t *text_opts /* may be NULL */, const bson_value_t *value_in, bson_value_t *value_out, bson_error_t *error); /* Perform explicit encryption on an expression. Return false on error and sets `error`. */ bool _mongoc_crypt_explicit_encrypt_expression(_mongoc_crypt_t *crypt, mongoc_collection_t *key_vault_coll, const char *algorithm /* may be NULL */, const bson_value_t *keyid /* may be NULL */, const char *keyaltname /* may be NULL */, const char *query_type /* may be NULL */, const int64_t *contention_factor /* may be NULL */, const bson_t *range_opts /* may be NULL */, const bson_t *text_opts /* may be NULL */, const bson_t *expr_in, bson_t *expr_out, bson_error_t *error); /* Perform explicit decryption. - value_out is always initialized. - may return false and set error. */ bool _mongoc_crypt_explicit_decrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *key_vault_coll, const bson_value_t *value_in, bson_value_t *value_out, bson_error_t *error); /* Create a data key document (does not insert into key vault). - keyaltnames may be NULL. - doc_out is always initialized. - may return false and set error. */ bool _mongoc_crypt_create_datakey(_mongoc_crypt_t *crypt, const char *kms_provider, const bson_t *masterkey, char **keyaltnames, uint32_t keyaltnames_count, const uint8_t *keymaterial, uint32_t keymaterial_len, bson_t *doc_out, bson_error_t *error); /* Rewrap datakeys in keyvault_coll matching the given filter with a new KMS provider (does not bulk-update into key vault). - filter may be NULL (equivalent to an empty document). - kms_provider may be NULL. - masterkey may be NULL if kms_provider is NULL. - doc_out is always initialized. - may return false and set error. */ bool _mongoc_crypt_rewrap_many_datakey(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const bson_t *filter, const char *provider, const bson_t *master_key, bson_t *doc_out, bson_error_t *error); const char * _mongoc_crypt_get_crypt_shared_version(const _mongoc_crypt_t *crypt); #endif /* MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION */ #endif /* MONGOC_CRYPT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypt.c000066400000000000000000002143301511661753600237600ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #define MONGOC_LOG_DOMAIN "client-side-encryption" #include #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const char * _mongoc_crypt_get_libmongocrypt_version(void) { return mongocrypt_version(NULL); } // `mcd_mapof_kmsid_to_tlsopts` maps a KMS ID (e.g. `aws` or `aws:myname`) to a // `mongoc_ssl_opt_t`. The acryonym TLS is preferred over SSL for // consistency with the CSE and URI specifications. typedef struct { mongoc_array_t entries; } mcd_mapof_kmsid_to_tlsopts; typedef struct { char *kmsid; mongoc_ssl_opt_t tlsopts; } mcd_mapof_kmsid_to_tlsopts_entry; mcd_mapof_kmsid_to_tlsopts * mcd_mapof_kmsid_to_tlsopts_new(void) { mcd_mapof_kmsid_to_tlsopts *k2t = bson_malloc0(sizeof(mcd_mapof_kmsid_to_tlsopts)); _mongoc_array_init(&k2t->entries, sizeof(mcd_mapof_kmsid_to_tlsopts_entry)); return k2t; } void mcd_mapof_kmsid_to_tlsopts_destroy(mcd_mapof_kmsid_to_tlsopts *k2t) { if (!k2t) { return; } for (size_t i = 0; i < k2t->entries.len; i++) { mcd_mapof_kmsid_to_tlsopts_entry *e = &_mongoc_array_index(&k2t->entries, mcd_mapof_kmsid_to_tlsopts_entry, i); bson_free(e->kmsid); _mongoc_ssl_opts_cleanup(&e->tlsopts, true /* free_internal */); } _mongoc_array_destroy(&k2t->entries); bson_free(k2t); } // `mcd_mapof_kmsid_to_tlsopts_insert` adds an entry into the map. // `kmsid` and `tlsopts` are copied. // No checking is done to prohibit duplicate entries. void mcd_mapof_kmsid_to_tlsopts_insert(mcd_mapof_kmsid_to_tlsopts *k2t, const char *kmsid, const mongoc_ssl_opt_t *tlsopts) { BSON_ASSERT_PARAM(k2t); BSON_ASSERT_PARAM(kmsid); BSON_ASSERT_PARAM(tlsopts); mcd_mapof_kmsid_to_tlsopts_entry e = {.kmsid = bson_strdup(kmsid)}; _mongoc_ssl_opts_copy_to(tlsopts, &e.tlsopts, true /* copy_internal */); _mongoc_array_append_val(&k2t->entries, e); } // `mcd_mapof_kmsid_to_tlsopts_get` returns the TLS options for a KMS ID, or // NULL. const mongoc_ssl_opt_t * mcd_mapof_kmsid_to_tlsopts_get(const mcd_mapof_kmsid_to_tlsopts *k2t, const char *kmsid) { BSON_ASSERT_PARAM(k2t); BSON_ASSERT_PARAM(kmsid); for (size_t i = 0; i < k2t->entries.len; i++) { mcd_mapof_kmsid_to_tlsopts_entry *e = &_mongoc_array_index(&k2t->entries, mcd_mapof_kmsid_to_tlsopts_entry, i); if (0 == strcmp(e->kmsid, kmsid)) { return &e->tlsopts; } } return NULL; } bool mcd_mapof_kmsid_to_tlsopts_has(const mcd_mapof_kmsid_to_tlsopts *k2t, const char *kmsid) { return NULL != mcd_mapof_kmsid_to_tlsopts_get(k2t, kmsid); } struct __mongoc_crypt_t { mongocrypt_t *handle; mongoc_ssl_opt_t kmip_tls_opt; mongoc_ssl_opt_t aws_tls_opt; mongoc_ssl_opt_t azure_tls_opt; mongoc_ssl_opt_t gcp_tls_opt; mcd_mapof_kmsid_to_tlsopts *kmsid_to_tlsopts; /// The kmsProviders that were provided by the user when encryption was /// initiated. We need to remember this in case we need to load on-demand /// credentials. bson_t kms_providers; mc_kms_credentials_callback creds_cb; /// The most recently auto-acquired Azure token, on null if it was destroyed /// or not yet acquired. mcd_azure_access_token azure_token; /// The time point at which the `azure_token` was acquired. mlib_time_point azure_token_issued_at; }; static void _log_callback(mongocrypt_log_level_t mongocrypt_log_level, const char *message, uint32_t message_len, void *ctx) { mongoc_log_level_t log_level = MONGOC_LOG_LEVEL_ERROR; BSON_UNUSED(message_len); BSON_UNUSED(ctx); switch (mongocrypt_log_level) { case MONGOCRYPT_LOG_LEVEL_FATAL: log_level = MONGOC_LOG_LEVEL_CRITICAL; break; case MONGOCRYPT_LOG_LEVEL_ERROR: log_level = MONGOC_LOG_LEVEL_ERROR; break; case MONGOCRYPT_LOG_LEVEL_WARNING: log_level = MONGOC_LOG_LEVEL_WARNING; break; case MONGOCRYPT_LOG_LEVEL_INFO: log_level = MONGOC_LOG_LEVEL_INFO; break; case MONGOCRYPT_LOG_LEVEL_TRACE: log_level = MONGOC_LOG_LEVEL_TRACE; break; default: log_level = MONGOC_LOG_LEVEL_CRITICAL; break; } mongoc_log(log_level, MONGOC_LOG_DOMAIN, "%s", message); } static void _prefix_mongocryptd_error(bson_error_t *error) { char buf[sizeof(error->message)]; // Truncation is OK. int req = bson_snprintf(buf, sizeof(buf), "mongocryptd error: %s", error->message); BSON_ASSERT(req > 0); memcpy(error->message, buf, sizeof(buf)); } static void _prefix_keyvault_error(bson_error_t *error) { char buf[sizeof(error->message)]; // Truncation is OK. int req = bson_snprintf(buf, sizeof(buf), "key vault error: %s", error->message); BSON_ASSERT(req > 0); memcpy(error->message, buf, sizeof(buf)); } static void _status_to_error(mongocrypt_status_t *status, bson_error_t *error) { _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_CRYPT, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_status_code(status), "%s", mongocrypt_status_message(status, NULL)); } /* Checks for an error on mongocrypt context. * If error_expected, then we expect mongocrypt_ctx_status to report a failure * status (due to a previous failed function call). If it did not, return a * generic error. * Returns true if ok, and does not modify @error. * Returns false if error, and sets @error. */ bool _ctx_check_error(mongocrypt_ctx_t *ctx, bson_error_t *error, bool error_expected) { mongocrypt_status_t *status; status = mongocrypt_status_new(); if (!mongocrypt_ctx_status(ctx, status)) { _status_to_error(status, error); mongocrypt_status_destroy(status); return false; } else if (error_expected) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "generic error from libmongocrypt operation"); mongocrypt_status_destroy(status); return false; } mongocrypt_status_destroy(status); return true; } bool _kms_ctx_check_error(mongocrypt_kms_ctx_t *kms_ctx, bson_error_t *error, bool error_expected) { mongocrypt_status_t *status; status = mongocrypt_status_new(); if (!mongocrypt_kms_ctx_status(kms_ctx, status)) { _status_to_error(status, error); mongocrypt_status_destroy(status); return false; } else if (error_expected) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "generic error from libmongocrypt KMS operation"); mongocrypt_status_destroy(status); return false; } mongocrypt_status_destroy(status); return true; } bool _crypt_check_error(mongocrypt_t *crypt, bson_error_t *error, bool error_expected) { mongocrypt_status_t *status; status = mongocrypt_status_new(); if (!mongocrypt_status(crypt, status)) { _status_to_error(status, error); mongocrypt_status_destroy(status); return false; } else if (error_expected) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "generic error from libmongocrypt handle"); mongocrypt_status_destroy(status); return false; } mongocrypt_status_destroy(status); return true; } /* Convert a mongocrypt_binary_t to a static bson_t */ static bool _bin_to_static_bson(mongocrypt_binary_t *bin, bson_t *out, bson_error_t *error) { /* Copy bin into bson_t result. */ if (!bson_init_static(out, mongocrypt_binary_data(bin), mongocrypt_binary_len(bin))) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "invalid returned bson"); return false; } return true; } typedef struct { mongocrypt_ctx_t *ctx; mongoc_collection_t *keyvault_coll; mongoc_client_t *mongocryptd_client; mongoc_client_t *collinfo_client; const char *db_name; _mongoc_crypt_t *crypt; } _state_machine_t; _state_machine_t * _state_machine_new(_mongoc_crypt_t *crypt) { _state_machine_t *sm = bson_malloc0(sizeof(_state_machine_t)); sm->crypt = crypt; return sm; } void _state_machine_destroy(_state_machine_t *state_machine) { if (!state_machine) { return; } mongocrypt_ctx_destroy(state_machine->ctx); bson_free(state_machine); } /* State handler MONGOCRYPT_CTX_NEED_MONGO_COLLINFO{_WITH_DB} */ static bool _state_need_mongo_collinfo(_state_machine_t *state_machine, const char *db_name, bson_error_t *error) { mongoc_database_t *db = NULL; mongoc_cursor_t *cursor = NULL; bson_t filter_bson; const bson_t *collinfo_bson = NULL; bson_t opts = BSON_INITIALIZER; mongocrypt_binary_t *filter_bin = NULL; mongocrypt_binary_t *collinfo_bin = NULL; bool ret = false; /* 1. Run listCollections on the encrypted MongoClient with the filter * provided by mongocrypt_ctx_mongo_op */ filter_bin = mongocrypt_binary_new(); if (!mongocrypt_ctx_mongo_op(state_machine->ctx, filter_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (!_bin_to_static_bson(filter_bin, &filter_bson, error)) { goto fail; } bson_append_document(&opts, "filter", -1, &filter_bson); if (!db_name) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } db = mongoc_client_get_database(state_machine->collinfo_client, db_name); cursor = mongoc_database_find_collections_with_opts(db, &opts); if (mongoc_cursor_error(cursor, error)) { goto fail; } /* 2. Return all results (if any) with mongocrypt_ctx_mongo_feed or * proceed to the next step if nothing was returned. */ while (mongoc_cursor_next(cursor, &collinfo_bson)) { collinfo_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(collinfo_bson), collinfo_bson->len); if (!mongocrypt_ctx_mongo_feed(state_machine->ctx, collinfo_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } mongocrypt_binary_destroy(collinfo_bin); collinfo_bin = NULL; } if (mongoc_cursor_error(cursor, error)) { goto fail; } /* 3. Call mongocrypt_ctx_mongo_done */ if (!mongocrypt_ctx_mongo_done(state_machine->ctx)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } ret = true; fail: bson_destroy(&opts); mongocrypt_binary_destroy(filter_bin); mongocrypt_binary_destroy(collinfo_bin); mongoc_cursor_destroy(cursor); mongoc_database_destroy(db); return ret; } static bool _state_need_mongo_markings(_state_machine_t *state_machine, bson_error_t *error) { bool ret = false; mongocrypt_binary_t *mongocryptd_cmd_bin = NULL; mongocrypt_binary_t *mongocryptd_reply_bin = NULL; bson_t mongocryptd_cmd_bson; bson_t reply = BSON_INITIALIZER; mongocryptd_cmd_bin = mongocrypt_binary_new(); if (!mongocrypt_ctx_mongo_op(state_machine->ctx, mongocryptd_cmd_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (!_bin_to_static_bson(mongocryptd_cmd_bin, &mongocryptd_cmd_bson, error)) { goto fail; } /* 1. Use db.runCommand to run the command provided by * mongocrypt_ctx_mongo_op on the MongoClient connected to mongocryptd. */ bson_destroy(&reply); if (!mongoc_client_command_simple(state_machine->mongocryptd_client, state_machine->db_name, &mongocryptd_cmd_bson, NULL /* read_prefs */, &reply, error)) { _prefix_mongocryptd_error(error); goto fail; } /* 2. Feed the reply back with mongocrypt_ctx_mongo_feed. */ mongocryptd_reply_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(&reply), reply.len); if (!mongocrypt_ctx_mongo_feed(state_machine->ctx, mongocryptd_reply_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } /* 3. Call mongocrypt_ctx_mongo_done. */ if (!mongocrypt_ctx_mongo_done(state_machine->ctx)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } ret = true; fail: bson_destroy(&reply); mongocrypt_binary_destroy(mongocryptd_cmd_bin); mongocrypt_binary_destroy(mongocryptd_reply_bin); return ret; } static bool _state_need_mongo_keys(_state_machine_t *state_machine, bson_error_t *error) { bool ret = false; mongocrypt_binary_t *filter_bin = NULL; bson_t filter_bson; bson_t opts = BSON_INITIALIZER; mongocrypt_binary_t *key_bin = NULL; const bson_t *key_bson; mongoc_cursor_t *cursor = NULL; /* 1. Use MongoCollection.find on the MongoClient connected to the key vault * client (which may be the same as the encrypted client). Use the filter * provided by mongocrypt_ctx_mongo_op. */ filter_bin = mongocrypt_binary_new(); if (!mongocrypt_ctx_mongo_op(state_machine->ctx, filter_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (!_bin_to_static_bson(filter_bin, &filter_bson, error)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } { const mongoc_read_concern_t *const rc = mongoc_collection_get_read_concern(state_machine->keyvault_coll); const char *const level = rc ? mongoc_read_concern_get_level(rc) : NULL; BSON_ASSERT(level && strcmp(level, MONGOC_READ_CONCERN_LEVEL_MAJORITY) == 0); } cursor = mongoc_collection_find_with_opts(state_machine->keyvault_coll, &filter_bson, &opts, NULL /* read prefs */); /* 2. Feed all resulting documents back (if any) with repeated calls to * mongocrypt_ctx_mongo_feed. */ while (mongoc_cursor_next(cursor, &key_bson)) { mongocrypt_binary_destroy(key_bin); key_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(key_bson), key_bson->len); if (!mongocrypt_ctx_mongo_feed(state_machine->ctx, key_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } } if (mongoc_cursor_error(cursor, error)) { _prefix_keyvault_error(error); goto fail; } /* 3. Call mongocrypt_ctx_mongo_done. */ if (!mongocrypt_ctx_mongo_done(state_machine->ctx)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } ret = true; fail: mongocrypt_binary_destroy(filter_bin); mongoc_cursor_destroy(cursor); bson_destroy(&opts); mongocrypt_binary_destroy(key_bin); return ret; } static mongoc_stream_t * _get_stream(const char *endpoint, int32_t connecttimeoutms, const mongoc_ssl_opt_t *ssl_opt, bson_error_t *error) { mongoc_stream_t *base_stream = NULL; mongoc_stream_t *tls_stream = NULL; bool ret = false; mongoc_ssl_opt_t ssl_opt_copy = {0}; mongoc_host_list_t host; if (!_mongoc_host_list_from_string_with_err(&host, endpoint, error)) { goto fail; } base_stream = mongoc_client_connect_tcp(connecttimeoutms, &host, error); if (!base_stream) { goto fail; } /* Wrap in a tls_stream. */ _mongoc_ssl_opts_copy_to(ssl_opt, &ssl_opt_copy, true /* copy_internal */); tls_stream = mongoc_stream_tls_new_with_hostname(base_stream, host.host, &ssl_opt_copy, 1 /* client */); if (!tls_stream) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to create TLS stream to: %s", endpoint); goto fail; } if (!mongoc_stream_tls_handshake_block(tls_stream, host.host, connecttimeoutms, error)) { goto fail; } ret = true; fail: _mongoc_ssl_opts_cleanup(&ssl_opt_copy, true /* free_internal */); if (!ret) { if (tls_stream) { /* destroys base_stream too */ mongoc_stream_destroy(tls_stream); } else if (base_stream) { mongoc_stream_destroy(base_stream); } return NULL; } return tls_stream; } static bool _state_need_kms(_state_machine_t *state_machine, bson_error_t *error) { mongocrypt_kms_ctx_t *kms_ctx = NULL; mongoc_stream_t *tls_stream = NULL; bool ret = false; mongocrypt_binary_t *http_req = NULL; mongocrypt_binary_t *http_reply = NULL; const char *endpoint; const int32_t sockettimeout = MONGOC_DEFAULT_SOCKETTIMEOUTMS; int64_t sleep_usec = 0; while ((kms_ctx = mongocrypt_ctx_next_kms_ctx(state_machine->ctx))) { mongoc_iovec_t iov; const mongoc_ssl_opt_t *ssl_opt; const char *provider; provider = mongocrypt_kms_ctx_get_kms_provider(kms_ctx, NULL); if (0 == strcmp("kmip", provider)) { ssl_opt = &state_machine->crypt->kmip_tls_opt; } else if (0 == strcmp("aws", provider)) { ssl_opt = &state_machine->crypt->aws_tls_opt; } else if (0 == strcmp("azure", provider)) { ssl_opt = &state_machine->crypt->azure_tls_opt; } else if (0 == strcmp("gcp", provider)) { ssl_opt = &state_machine->crypt->gcp_tls_opt; } else if (mcd_mapof_kmsid_to_tlsopts_has(state_machine->crypt->kmsid_to_tlsopts, provider)) { ssl_opt = mcd_mapof_kmsid_to_tlsopts_get(state_machine->crypt->kmsid_to_tlsopts, provider); } else { ssl_opt = mongoc_ssl_opt_get_default(); } mongocrypt_binary_destroy(http_req); http_req = mongocrypt_binary_new(); if (!mongocrypt_kms_ctx_message(kms_ctx, http_req)) { _kms_ctx_check_error(kms_ctx, error, true); goto fail; } if (!mongocrypt_kms_ctx_endpoint(kms_ctx, &endpoint)) { _kms_ctx_check_error(kms_ctx, error, true); goto fail; } sleep_usec = mongocrypt_kms_ctx_usleep(kms_ctx); mlib_sleep_for(sleep_usec, us); mongoc_stream_destroy(tls_stream); tls_stream = _get_stream(endpoint, sockettimeout, ssl_opt, error); #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL /* Retry once with schannel as a workaround for CDRIVER-3566. */ if (!tls_stream) { tls_stream = _get_stream(endpoint, sockettimeout, ssl_opt, error); } #endif if (!tls_stream) { if (mongocrypt_kms_ctx_fail(kms_ctx)) { continue; } else { /* TLS errors are set in _get_stream */ goto fail; } } iov.iov_base = (char *)mongocrypt_binary_data(http_req); iov.iov_len = mongocrypt_binary_len(http_req); if (!_mongoc_stream_writev_full(tls_stream, &iov, 1, sockettimeout, error)) { if (mongocrypt_kms_ctx_fail(kms_ctx)) { continue; } else { bson_error_t kms_error; BSON_ASSERT(!_kms_ctx_check_error(kms_ctx, &kms_error, true)); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "%s. Failed to write to KMS stream: %s", kms_error.message, endpoint); goto fail; } } /* Read and feed reply. */ while (mongocrypt_kms_ctx_bytes_needed(kms_ctx) > 0) { #define BUFFER_SIZE 1024 uint8_t buf[BUFFER_SIZE]; uint32_t bytes_needed = mongocrypt_kms_ctx_bytes_needed(kms_ctx); ssize_t read_ret; /* Cap the bytes requested at the buffer size. */ if (bytes_needed > BUFFER_SIZE) { bytes_needed = BUFFER_SIZE; } read_ret = mongoc_stream_read(tls_stream, buf, bytes_needed, 1 /* min_bytes. */, sockettimeout); if (read_ret <= 0) { if (mongocrypt_kms_ctx_fail(kms_ctx)) { break; // Stop reading reply. } else { bson_error_t kms_error; BSON_ASSERT(!_kms_ctx_check_error(kms_ctx, &kms_error, true)); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "%s. Failed to read from KMS stream to: %s", kms_error.message, endpoint); goto fail; } } mongocrypt_binary_destroy(http_reply); BSON_ASSERT(mlib_in_range(uint32_t, read_ret)); http_reply = mongocrypt_binary_new_from_data(buf, (uint32_t)read_ret); if (!mongocrypt_kms_ctx_feed(kms_ctx, http_reply)) { _kms_ctx_check_error(kms_ctx, error, true); goto fail; } } } /* When NULL is returned by mongocrypt_ctx_next_kms_ctx, this can either be * an error or end-of-list. */ if (!_ctx_check_error(state_machine->ctx, error, false)) { goto fail; } if (!mongocrypt_ctx_kms_done(state_machine->ctx)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } ret = true; fail: mongoc_stream_destroy(tls_stream); mongocrypt_binary_destroy(http_req); mongocrypt_binary_destroy(http_reply); return ret; #undef BUFFER_SIZE } /** * @brief Determine whether the given kmsProviders has an empty 'aws' * subdocument * * @param kms_providers The user-provided kmsProviders * @param error Output parameter for possible errors. * @retval true If 'aws' is present and an empty subdocument * @retval false Otherwise or on error */ static bool _needs_on_demand_aws_kms(bson_t const *kms_providers) { bson_iter_t iter; if (!bson_iter_init_find(&iter, kms_providers, "aws")) { // No "aws" subdocument return false; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { // "aws" is not a document? Should be validated by libmongocrypt return false; } const uint8_t *dataptr; uint32_t datalen; bson_iter_document(&iter, &datalen, &dataptr); bson_t subdoc; if (!bson_init_static(&subdoc, dataptr, datalen)) { // Invalid "aws" document? Should be validated by libmongocrypt return false; } if (bson_empty(&subdoc)) { // "aws" is present and is an empty subdocument, which means that the user // requests that the AWS credentials be loaded on-demand from the // environment. return true; } else { // "aws" is present and is non-empty, which means that the user has // already provided credentials for AWS. return false; } } /** * @brief Check whether the given kmsProviders object requests automatic Azure * credentials * * @param kmsprov The input kmsProviders that may have an "azure" property * @param error An output error * @retval true If success AND `kmsprov` requests automatic Azure credentials * @retval false Otherwise. Check error->code for failure. */ static bool _check_azure_kms_auto(const bson_t *kmsprov, bson_error_t *error) { if (error) { *error = (bson_error_t){0}; } bson_iter_t iter; if (!bson_iter_init_find(&iter, kmsprov, "azure")) { return false; } bson_t azure_subdoc; if (!_mongoc_iter_document_as_bson(&iter, &azure_subdoc, error)) { return false; } return bson_empty(&azure_subdoc); } /** * @brief Attempt to load AWS credentials from the environment and insert them * into the given kmsProviders bson document on the "aws" property. * * @param out A kmsProviders object to update * @param error An error-out parameter * @retval true If there was no error and we successfully loaded credentials. * @retval false If there was an error while updating the BSON data or obtaining * credentials. */ static bool _try_add_aws_from_env(bson_t *out, bson_error_t *error) { // Attempt to obtain AWS credentials from the environment. _mongoc_aws_credentials_t creds; if (!_mongoc_aws_credentials_obtain(NULL, &creds, error)) { // Error while obtaining credentials return false; } // Build the new "aws" subdoc bson_t aws; bool okay = BSON_APPEND_DOCUMENT_BEGIN(out, "aws", &aws) // Add the accessKeyId and the secretAccessKey && BSON_APPEND_UTF8(&aws, "accessKeyId", creds.access_key_id) // && BSON_APPEND_UTF8(&aws, "secretAccessKey", creds.secret_access_key) // // Add the sessionToken, if we got one: && (!creds.session_token || BSON_APPEND_UTF8(&aws, "sessionToken", creds.session_token)) // // Finish the document && bson_append_document_end(out, &aws); BSON_ASSERT(okay && "Failed to build aws credentials document"); // Good! _mongoc_aws_credentials_cleanup(&creds); return true; } /** * @brief Attempt to request a new Azure access token from the IMDS HTTP server * * @param out The token to populate. Must later be destroyed by the caller. * @param error An output parameter to capture any errors * @retval true Upon successfully obtaining and parsing a token * @retval false If any error occurs. */ static bool _request_new_azure_token(mcd_azure_access_token *out, bson_error_t *error) { return mcd_azure_access_token_from_imds(out, MCD_TOKEN_RESOURCE_VAULT, NULL, // Use the default host 0, // Default port as well NULL, // No extra headers (mlib_timer){0}, // Default timer. NULL, // No client ID. error); } /** * @brief Attempt to load an Azure access token from the environment and append * them to the kmsProviders * * @param out A kmsProviders object to update * @param error An error-out parameter * @retval true If there was no error and we loaded credentials * @retval false If there was an error obtaining or appending credentials */ static bool _try_add_azure_from_env(_mongoc_crypt_t *crypt, bson_t *out, bson_error_t *error) { if (crypt->azure_token.access_token) { // The access-token is non-null, so we may have one cached. const mlib_time_point one_min_from_now = mlib_time_add(mlib_now(), mlib_duration(1, mn)); const mlib_time_point expires_at = mlib_time_add(crypt->azure_token_issued_at, crypt->azure_token.expires_in); if (mlib_time_cmp(expires_at, >=, one_min_from_now)) { // The token is still valid for at least another minute } else { // The token will expire soon. Destroy it, and below we will below ask // IMDS for a new one. mcd_azure_access_token_destroy(&crypt->azure_token); } } if (crypt->azure_token.access_token == NULL) { // There is no access token in our cache. // Save the current time point as the "issue time" of the token, even // though it will take some time for the HTTP request to hit the metadata // server. This time is only used to track token expiry. IMDS gives us a // number of seconds that the token will be valid relative to its issue // time. Avoid reliance on system clocks by comparing the issue time to an // abstract monotonic "now" crypt->azure_token_issued_at = mlib_now(); // Get the token: if (!_request_new_azure_token(&crypt->azure_token, error)) { return false; } } // Build the new KMS credentials bson_t new_azure_creds = BSON_INITIALIZER; const bool okay = BSON_APPEND_UTF8(&new_azure_creds, "accessToken", crypt->azure_token.access_token) && BSON_APPEND_DOCUMENT(out, "azure", &new_azure_creds); bson_destroy(&new_azure_creds); if (!okay) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_BSON_INVALID, "Failed to build new 'azure' credentials"); } return okay; } /** * @brief Check whether the given kmsProviders object requests automatic GCP * credentials * * @param kmsprov The input kmsProviders that may have an "gcp" property * @param error An output error * @retval true If success AND `kmsprov` requests automatic GCP credentials * @retval false Otherwise. Check error->code for failure. */ static bool _check_gcp_kms_auto(const bson_t *kmsprov, bson_error_t *error) { if (error) { *error = (bson_error_t){0}; } bson_iter_t iter; if (!bson_iter_init_find(&iter, kmsprov, "gcp")) { return false; } bson_t gcp_subdoc; if (!_mongoc_iter_document_as_bson(&iter, &gcp_subdoc, error)) { return false; } return bson_empty(&gcp_subdoc); } /** * @brief Attempt to request a new GCP access token from the HTTP server * * @param out The token to populate. Must later be destroyed by the caller. * @param error An output parameter to capture any errors * @retval true Upon successfully obtaining and parsing a token * @retval false If any error occurs. */ static bool _request_new_gcp_token(gcp_service_account_token *out, bson_error_t *error) { return (gcp_access_token_from_gcp_server(out, NULL, 0, NULL, error)); } /** * @brief Attempt to load an GCP access token from the environment and append * them to the kmsProviders * * @param out A kmsProviders object to update * @param error An error-out parameter * @retval true If there was no error and we loaded credentials * @retval false If there was an error obtaining or appending credentials */ static bool _try_add_gcp_from_env(bson_t *out, bson_error_t *error) { // Not caching gcp tokens, so we will always request a new one from the gcp // server. gcp_service_account_token gcp_token; if (!_request_new_gcp_token(&gcp_token, error)) { return false; } // Build the new KMS credentials bson_t new_gcp_creds = BSON_INITIALIZER; const bool okay = BSON_APPEND_UTF8(&new_gcp_creds, "accessToken", gcp_token.access_token) && BSON_APPEND_DOCUMENT(out, "gcp", &new_gcp_creds); bson_destroy(&new_gcp_creds); gcp_access_token_destroy(&gcp_token); if (!okay) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_BSON_INVALID, "Failed to build new 'gcp' credentials"); } return okay; } static bool _state_need_kms_credentials(_state_machine_t *sm, bson_error_t *error) { bson_t creds = BSON_INITIALIZER; const bson_t empty = BSON_INITIALIZER; bool okay = false; if (sm->crypt->creds_cb.fn) { // We have a user-provided credentials callback. Try it. if (!sm->crypt->creds_cb.fn(sm->crypt->creds_cb.userdata, &empty, &creds, error)) { // User-provided callback indicated failure if (!error->code) { // The callback did not set an error, so we'll provide a default // one. _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The user-provided callback for on-demand KMS " "credentials failed."); } goto fail; } // The user's callback reported success } bson_iter_t iter; const bool callback_provided_aws = bson_iter_init_find(&iter, &creds, "aws"); if (!callback_provided_aws && _needs_on_demand_aws_kms(&sm->crypt->kms_providers)) { // The original kmsProviders had an empty "aws" property, and the // user-provided callback did not fill in a new "aws" property for us. // Attempt instead to load the AWS credentials from the environment: if (!_try_add_aws_from_env(&creds, error)) { // Error while trying to add AWS credentials goto fail; } } // Whether the callback provided Azure credentials const bool cb_provided_azure = bson_iter_init_find(&iter, &creds, "azure"); // Whether the original kmsProviders requested auto-Azure credentials: const bool orig_wants_auto_azure = _check_azure_kms_auto(&sm->crypt->kms_providers, error); if (error->code) { // _check_azure_kms_auto failed goto fail; } const bool wants_auto_azure = orig_wants_auto_azure && !cb_provided_azure; if (wants_auto_azure) { if (!_try_add_azure_from_env(sm->crypt, &creds, error)) { goto fail; } } // Whether the callback provided GCP credentials const bool cb_provided_gcp = bson_iter_init_find(&iter, &creds, "gcp"); // Whether the original kmsProviders requested auto-GCP credentials: const bool orig_wants_auto_gcp = _check_gcp_kms_auto(&sm->crypt->kms_providers, error); if (error->code) { // _check_gcp_kms_auto failed goto fail; } const bool wants_auto_gcp = orig_wants_auto_gcp && !cb_provided_gcp; if (wants_auto_gcp) { if (!_try_add_gcp_from_env(&creds, error)) { goto fail; } } // Now actually send that data to libmongocrypt mongocrypt_binary_t *const def = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(&creds), creds.len); okay = mongocrypt_ctx_provide_kms_providers(sm->ctx, def); if (!okay) { _ctx_check_error(sm->ctx, error, true); } mongocrypt_binary_destroy(def); fail: bson_destroy(&creds); return okay; } static bool _state_ready(_state_machine_t *state_machine, bson_t *result, bson_error_t *error) { mongocrypt_binary_t *result_bin = NULL; bson_t tmp; bool ret = false; bson_init(result); result_bin = mongocrypt_binary_new(); if (!mongocrypt_ctx_finalize(state_machine->ctx, result_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (!_bin_to_static_bson(result_bin, &tmp, error)) { goto fail; } bson_destroy(result); bson_copy_to(&tmp, result); ret = true; fail: mongocrypt_binary_destroy(result_bin); return ret; } /*-------------------------------------------------------------------------- * * _mongoc_cse_run_state_machine -- * Run the mongocrypt_ctx state machine. * * Post-conditions: * *result may be set to a new bson_t, or NULL otherwise. Caller should * not assume return value of true means *result is set. If false returned, * @error is set. * * -------------------------------------------------------------------------- */ bool _state_machine_run(_state_machine_t *state_machine, bson_t *result, bson_error_t *error) { bool ret = false; mongocrypt_binary_t *bin = NULL; bson_init(result); while (true) { switch (mongocrypt_ctx_state(state_machine->ctx)) { default: case MONGOCRYPT_CTX_ERROR: _ctx_check_error(state_machine->ctx, error, true); goto fail; case MONGOCRYPT_CTX_NEED_MONGO_COLLINFO: if (!_state_need_mongo_collinfo(state_machine, state_machine->db_name, error)) { goto fail; } break; case MONGOCRYPT_CTX_NEED_MONGO_MARKINGS: if (!_state_need_mongo_markings(state_machine, error)) { goto fail; } break; case MONGOCRYPT_CTX_NEED_MONGO_KEYS: if (!_state_need_mongo_keys(state_machine, error)) { goto fail; } break; case MONGOCRYPT_CTX_NEED_KMS: if (!_state_need_kms(state_machine, error)) { goto fail; } break; case MONGOCRYPT_CTX_NEED_KMS_CREDENTIALS: if (!_state_need_kms_credentials(state_machine, error)) { goto fail; } break; case MONGOCRYPT_CTX_READY: bson_destroy(result); if (!_state_ready(state_machine, result, error)) { goto fail; } break; case MONGOCRYPT_CTX_DONE: goto success; break; case MONGOCRYPT_CTX_NEED_MONGO_COLLINFO_WITH_DB: { const char *db_name = mongocrypt_ctx_mongo_db(state_machine->ctx); if (!db_name) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (!_state_need_mongo_collinfo(state_machine, db_name, error)) { goto fail; } } break; } } success: ret = true; fail: mongocrypt_binary_destroy(bin); return ret; } /* _parse_one_tls_opts parses one TLS document. * Pre-conditions: * - @iter is an iterator at the start of a KMS provider key/value pair. * - @out_opt must not be initialized. * Post-conditions: * - @out_opt is always initialized. * Returns false and sets @error on error. */ static bool _parse_one_tls_opts(bson_iter_t *iter, mongoc_ssl_opt_t *out_opt, bson_error_t *error) { bool ok = false; const char *kms_provider; bson_t tls_opts_doc; const uint8_t *data; uint32_t len; mcommon_string_append_t errmsg; bson_iter_t permitted_iter; mcommon_string_new_as_append(&errmsg); kms_provider = bson_iter_key(iter); memset(out_opt, 0, sizeof(mongoc_ssl_opt_t)); if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Expected TLS options for %s to be a document, got: %s", kms_provider, _mongoc_bson_type_to_str(bson_iter_type(iter))); goto fail; } bson_iter_document(iter, &len, &data); if (!bson_init_static(&tls_opts_doc, data, len) || !bson_iter_init(&permitted_iter, &tls_opts_doc)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error iterating into TLS options document for %s", kms_provider); goto fail; } while (bson_iter_next(&permitted_iter)) { const char *key = bson_iter_key(&permitted_iter); if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD)) { continue; } if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILE)) { continue; } if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCAFILE)) { continue; } if (0 == bson_strcasecmp(key, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK)) { continue; } _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error setting TLS option %s for %s. Insecure TLS options prohibited.", key, kms_provider); goto fail; } if (!_mongoc_ssl_opts_from_bson(out_opt, &tls_opts_doc, &errmsg)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing TLS options for %s: %s", kms_provider, mcommon_str_from_append(&errmsg)); goto fail; } ok = true; fail: mcommon_string_from_append_destroy(&errmsg); return ok; } /* _parse_all_tls_opts initializes TLS options for all KMS providers. * @tls_opts is the BSON document passed through * mongoc_client_encryption_opts_set_tls_opts or * mongoc_auto_encryption_opts_set_tls_opts. * Defaults to using mongoc_ssl_opt_get_default() if options are not passed for * a provider. Returns false and sets @error on error. */ static bool _parse_all_tls_opts(_mongoc_crypt_t *crypt, const bson_t *tls_opts, bson_error_t *error) { bson_iter_t iter; bool ok = false; bool has_aws = false; bool has_azure = false; bool has_gcp = false; bool has_kmip = false; if (!tls_opts) { return true; } if (!bson_iter_init(&iter, tls_opts)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error starting iteration of TLS options"); goto fail; } while (bson_iter_next(&iter)) { const char *key; key = bson_iter_key(&iter); if (0 == strcmp(key, "aws")) { if (has_aws) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for %s", key); goto fail; } has_aws = true; if (!_parse_one_tls_opts(&iter, &crypt->aws_tls_opt, error)) { goto fail; } continue; } if (0 == strcmp(key, "azure")) { if (has_azure) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for %s", key); goto fail; } has_azure = true; if (!_parse_one_tls_opts(&iter, &crypt->azure_tls_opt, error)) { goto fail; } continue; } if (0 == strcmp(key, "gcp")) { if (has_gcp) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for %s", key); goto fail; } has_gcp = true; if (!_parse_one_tls_opts(&iter, &crypt->gcp_tls_opt, error)) { goto fail; } continue; } if (0 == strcmp(key, "kmip")) { if (has_kmip) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for %s", key); goto fail; } has_kmip = true; if (!_parse_one_tls_opts(&iter, &crypt->kmip_tls_opt, error)) { goto fail; } continue; } const char *colon_pos = strstr(key, ":"); if (colon_pos != NULL) { // Parse TLS options for a named KMS provider. if (mcd_mapof_kmsid_to_tlsopts_has(crypt->kmsid_to_tlsopts, key)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for %s", key); goto fail; } mongoc_ssl_opt_t tlsopts = {0}; if (!_parse_one_tls_opts(&iter, &tlsopts, error)) { _mongoc_ssl_opts_cleanup(&tlsopts, true /* free_internal */); goto fail; } mcd_mapof_kmsid_to_tlsopts_insert(crypt->kmsid_to_tlsopts, key, &tlsopts); _mongoc_ssl_opts_cleanup(&tlsopts, true /* free_internal */); continue; } _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Cannot configure TLS options for KMS provider: %s", key); goto fail; } /* Configure with default TLS options. The mongoc_ssl_opt_t returned by * mongoc_ssl_opt_get_default may contain non-NULL fields if * MONGOC_SSL_DEFAULT_TRUST_FILE or MONGOC_SSL_DEFAULT_TRUST_DIR are defined. */ if (!has_aws) { _mongoc_ssl_opts_copy_to(mongoc_ssl_opt_get_default(), &crypt->aws_tls_opt, false /* copy internal */); } if (!has_azure) { _mongoc_ssl_opts_copy_to(mongoc_ssl_opt_get_default(), &crypt->azure_tls_opt, false /* copy internal */); } if (!has_gcp) { _mongoc_ssl_opts_copy_to(mongoc_ssl_opt_get_default(), &crypt->gcp_tls_opt, false /* copy internal */); } if (!has_kmip) { _mongoc_ssl_opts_copy_to(mongoc_ssl_opt_get_default(), &crypt->kmip_tls_opt, false /* copy internal */); } ok = true; fail: return ok; } /* Note, _mongoc_crypt_t only has one member, to the top-level handle of libmongocrypt, mongocrypt_t. The purpose of defining _mongoc_crypt_t is to limit all interaction with libmongocrypt to this one file. */ _mongoc_crypt_t * _mongoc_crypt_new(const bson_t *kms_providers, const bson_t *schema_map, const bson_t *encrypted_fields_map, const bson_t *tls_opts, const char *crypt_shared_lib_path, bool crypt_shared_lib_required, bool bypass_auto_encryption, bool bypass_query_analysis, mc_kms_credentials_callback creds_cb, mcd_optional_u64_t cache_expiration_ms, bson_error_t *error) { _mongoc_crypt_t *crypt; mongocrypt_binary_t *local_masterkey_bin = NULL; mongocrypt_binary_t *schema_map_bin = NULL; mongocrypt_binary_t *encrypted_fields_map_bin = NULL; mongocrypt_binary_t *kms_providers_bin = NULL; bool success = false; /* Create the handle to libmongocrypt. */ crypt = bson_malloc0(sizeof(*crypt)); crypt->kmsid_to_tlsopts = mcd_mapof_kmsid_to_tlsopts_new(); crypt->handle = mongocrypt_new(); mongocrypt_setopt_retry_kms(crypt->handle, true); mongocrypt_setopt_use_need_mongo_collinfo_with_db_state(crypt->handle); if (!mongocrypt_setopt_enable_multiple_collinfo(crypt->handle)) { _crypt_check_error(crypt->handle, error, true); goto fail; } // Stash away a copy of the user's kmsProviders in case we need to lazily // load credentials. bson_copy_to(kms_providers, &crypt->kms_providers); if (!_parse_all_tls_opts(crypt, tls_opts, error)) { goto fail; } mongocrypt_setopt_log_handler(crypt->handle, _log_callback, NULL /* context */); kms_providers_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(kms_providers), kms_providers->len); if (!mongocrypt_setopt_kms_providers(crypt->handle, kms_providers_bin)) { _crypt_check_error(crypt->handle, error, true); goto fail; } if (schema_map) { schema_map_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(schema_map), schema_map->len); if (!mongocrypt_setopt_schema_map(crypt->handle, schema_map_bin)) { _crypt_check_error(crypt->handle, error, true); goto fail; } } if (encrypted_fields_map) { encrypted_fields_map_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(encrypted_fields_map), encrypted_fields_map->len); if (!mongocrypt_setopt_encrypted_field_config_map(crypt->handle, encrypted_fields_map_bin)) { _crypt_check_error(crypt->handle, error, true); goto fail; } } if (!bypass_auto_encryption) { mongocrypt_setopt_append_crypt_shared_lib_search_path(crypt->handle, "$SYSTEM"); if (!_crypt_check_error(crypt->handle, error, false)) { goto fail; } if (crypt_shared_lib_path != NULL) { mongocrypt_setopt_set_crypt_shared_lib_path_override(crypt->handle, crypt_shared_lib_path); if (!_crypt_check_error(crypt->handle, error, false)) { goto fail; } } } if (bypass_query_analysis) { mongocrypt_setopt_bypass_query_analysis(crypt->handle); if (!_crypt_check_error(crypt->handle, error, false)) { goto fail; } } // Enable the NEEDS_CREDENTIALS state for on-demand credential loading mongocrypt_setopt_use_need_kms_credentials_state(crypt->handle); if (!mongocrypt_setopt_use_range_v2(crypt->handle)) { _crypt_check_error(crypt->handle, error, true); goto fail; } if (cache_expiration_ms.set) { mongocrypt_setopt_key_expiration(crypt->handle, cache_expiration_ms.value); if (!_crypt_check_error(crypt->handle, error, false)) { goto fail; } } if (!mongocrypt_init(crypt->handle)) { _crypt_check_error(crypt->handle, error, true); goto fail; } if (crypt_shared_lib_required) { uint32_t len = 0; const char *s = mongocrypt_crypt_shared_lib_version_string(crypt->handle, &len); if (!s || len == 0) { // empty/null version string indicates that crypt_shared was not loaded // by libmongocrypt _mongoc_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Option 'cryptSharedLibRequired' is 'true', but failed to " "load the crypt_shared runtime library"); goto fail; } mongoc_log( MONGOC_LOG_LEVEL_DEBUG, MONGOC_LOG_DOMAIN, "crypt_shared library version '%s' was found and loaded", s); } crypt->creds_cb = creds_cb; success = true; fail: mongocrypt_binary_destroy(local_masterkey_bin); mongocrypt_binary_destroy(encrypted_fields_map_bin); mongocrypt_binary_destroy(schema_map_bin); mongocrypt_binary_destroy(kms_providers_bin); if (!success) { _mongoc_crypt_destroy(crypt); return NULL; } return crypt; } void _mongoc_crypt_destroy(_mongoc_crypt_t *crypt) { if (!crypt) { return; } mongocrypt_destroy(crypt->handle); _mongoc_ssl_opts_cleanup(&crypt->kmip_tls_opt, true /* free_internal */); _mongoc_ssl_opts_cleanup(&crypt->aws_tls_opt, true /* free_internal */); _mongoc_ssl_opts_cleanup(&crypt->azure_tls_opt, true /* free_internal */); _mongoc_ssl_opts_cleanup(&crypt->gcp_tls_opt, true /* free_internal */); bson_destroy(&crypt->kms_providers); mcd_azure_access_token_destroy(&crypt->azure_token); mcd_mapof_kmsid_to_tlsopts_destroy(crypt->kmsid_to_tlsopts); bson_free(crypt); } bool _mongoc_crypt_auto_encrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, mongoc_client_t *mongocryptd_client, mongoc_client_t *collinfo_client, const char *db_name, const bson_t *cmd_in, bson_t *cmd_out, bson_error_t *error) { _state_machine_t *state_machine = NULL; mongocrypt_binary_t *cmd_bin = NULL; bool ret = false; BSON_ASSERT_PARAM(collinfo_client); bson_init(cmd_out); state_machine = _state_machine_new(crypt); state_machine->keyvault_coll = keyvault_coll; state_machine->mongocryptd_client = mongocryptd_client; state_machine->collinfo_client = collinfo_client; state_machine->db_name = db_name; state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } cmd_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(cmd_in), cmd_in->len); if (!mongocrypt_ctx_encrypt_init(state_machine->ctx, db_name, -1, cmd_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(cmd_out); if (!_state_machine_run(state_machine, cmd_out, error)) { goto fail; } ret = true; fail: mongocrypt_binary_destroy(cmd_bin); _state_machine_destroy(state_machine); return ret; } bool _mongoc_crypt_auto_decrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const bson_t *doc_in, bson_t *doc_out, bson_error_t *error) { bool ret = false; _state_machine_t *state_machine = NULL; mongocrypt_binary_t *doc_bin = NULL; bson_init(doc_out); state_machine = _state_machine_new(crypt); state_machine->keyvault_coll = keyvault_coll; state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } doc_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(doc_in), doc_in->len); if (!mongocrypt_ctx_decrypt_init(state_machine->ctx, doc_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(doc_out); if (!_state_machine_run(state_machine, doc_out, error)) { goto fail; } ret = true; fail: mongocrypt_binary_destroy(doc_bin); _state_machine_destroy(state_machine); return ret; } // _create_explicit_state_machine_t creates a _state_machine_t for explicit // encryption. The returned state machine may be used encrypting a value or // encrypting an expression. static _state_machine_t * _create_explicit_state_machine(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const char *algorithm, const bson_value_t *keyid, const char *keyaltname, const char *query_type, const int64_t *contention_factor, const bson_t *range_opts, const bson_t *text_opts, bson_error_t *error) { BSON_ASSERT_PARAM(crypt); BSON_ASSERT_PARAM(keyvault_coll); BSON_OPTIONAL_PARAM(algorithm); BSON_OPTIONAL_PARAM(keyid); BSON_OPTIONAL_PARAM(keyaltname); BSON_OPTIONAL_PARAM(query_type); BSON_OPTIONAL_PARAM(range_opts); BSON_OPTIONAL_PARAM(text_opts); BSON_OPTIONAL_PARAM(error); _state_machine_t *state_machine = NULL; bool ok = false; /* Create the context for the operation. */ state_machine = _state_machine_new(crypt); state_machine->keyvault_coll = keyvault_coll; state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } if (!mongocrypt_ctx_setopt_algorithm(state_machine->ctx, algorithm, -1)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (range_opts != NULL) { /* mongocrypt error checks and parses range options */ mongocrypt_binary_t *binary_range_opts = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(range_opts), range_opts->len); if (!mongocrypt_ctx_setopt_algorithm_range(state_machine->ctx, binary_range_opts)) { mongocrypt_binary_destroy(binary_range_opts); _ctx_check_error(state_machine->ctx, error, true); goto fail; } mongocrypt_binary_destroy(binary_range_opts); } if (text_opts != NULL) { /* mongocrypt error checks and parses text options */ mongocrypt_binary_t *binary_text_opts = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(text_opts), text_opts->len); if (!mongocrypt_ctx_setopt_algorithm_text(state_machine->ctx, binary_text_opts)) { mongocrypt_binary_destroy(binary_text_opts); _ctx_check_error(state_machine->ctx, error, true); goto fail; } mongocrypt_binary_destroy(binary_text_opts); } if (query_type != NULL) { if (!mongocrypt_ctx_setopt_query_type(state_machine->ctx, query_type, -1)) { goto fail; } } if (contention_factor != NULL) { if (!mongocrypt_ctx_setopt_contention_factor(state_machine->ctx, *contention_factor)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } } if (keyaltname) { bool keyaltname_ret; mongocrypt_binary_t *keyaltname_bin; bson_t *keyaltname_doc; keyaltname_doc = BCON_NEW("keyAltName", keyaltname); keyaltname_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(keyaltname_doc), keyaltname_doc->len); keyaltname_ret = mongocrypt_ctx_setopt_key_alt_name(state_machine->ctx, keyaltname_bin); mongocrypt_binary_destroy(keyaltname_bin); bson_destroy(keyaltname_doc); if (!keyaltname_ret) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } } if (keyid && keyid->value_type == BSON_TYPE_BINARY) { mongocrypt_binary_t *keyid_bin; bool keyid_ret; if (keyid->value.v_binary.subtype != BSON_SUBTYPE_UUID) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "keyid must be a UUID"); goto fail; } keyid_bin = mongocrypt_binary_new_from_data(keyid->value.v_binary.data, keyid->value.v_binary.data_len); keyid_ret = mongocrypt_ctx_setopt_key_id(state_machine->ctx, keyid_bin); mongocrypt_binary_destroy(keyid_bin); if (!keyid_ret) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } } ok = true; fail: if (!ok) { _state_machine_destroy(state_machine); state_machine = NULL; } return state_machine; } bool _mongoc_crypt_explicit_encrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const char *algorithm, const bson_value_t *keyid, const char *keyaltname, const char *query_type, const int64_t *contention_factor, const bson_t *range_opts, const bson_t *text_opts, const bson_value_t *value_in, bson_value_t *value_out, bson_error_t *error) { BSON_ASSERT_PARAM(crypt); BSON_ASSERT_PARAM(keyvault_coll); BSON_OPTIONAL_PARAM(algorithm); BSON_OPTIONAL_PARAM(keyid); BSON_OPTIONAL_PARAM(keyaltname); BSON_OPTIONAL_PARAM(query_type); BSON_OPTIONAL_PARAM(range_opts); BSON_ASSERT_PARAM(value_in); BSON_ASSERT_PARAM(value_out); BSON_OPTIONAL_PARAM(error); _state_machine_t *state_machine = NULL; bson_t *to_encrypt_doc = NULL; mongocrypt_binary_t *to_encrypt_bin = NULL; bson_iter_t iter; bool ret = false; bson_t result = BSON_INITIALIZER; value_out->value_type = BSON_TYPE_EOD; state_machine = _create_explicit_state_machine( crypt, keyvault_coll, algorithm, keyid, keyaltname, query_type, contention_factor, range_opts, text_opts, error); if (!state_machine) { goto fail; } to_encrypt_doc = bson_new(); BSON_APPEND_VALUE(to_encrypt_doc, "v", value_in); to_encrypt_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(to_encrypt_doc), to_encrypt_doc->len); if (!mongocrypt_ctx_explicit_encrypt_init(state_machine->ctx, to_encrypt_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(&result); if (!_state_machine_run(state_machine, &result, error)) { goto fail; } /* extract value */ if (!bson_iter_init_find(&iter, &result, "v")) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "encrypted result unexpected: no 'v' found"); goto fail; } else { const bson_value_t *tmp; tmp = bson_iter_value(&iter); bson_value_copy(tmp, value_out); } ret = true; fail: _state_machine_destroy(state_machine); mongocrypt_binary_destroy(to_encrypt_bin); bson_destroy(to_encrypt_doc); bson_destroy(&result); return ret; } bool _mongoc_crypt_explicit_encrypt_expression(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const char *algorithm, const bson_value_t *keyid, const char *keyaltname, const char *query_type, const int64_t *contention_factor, const bson_t *range_opts, const bson_t *text_opts, const bson_t *expr_in, bson_t *expr_out, bson_error_t *error) { BSON_ASSERT_PARAM(crypt); BSON_ASSERT_PARAM(keyvault_coll); BSON_OPTIONAL_PARAM(algorithm); BSON_OPTIONAL_PARAM(keyid); BSON_OPTIONAL_PARAM(keyaltname); BSON_OPTIONAL_PARAM(query_type); BSON_OPTIONAL_PARAM(range_opts); BSON_OPTIONAL_PARAM(text_opts); BSON_ASSERT_PARAM(expr_in); BSON_ASSERT_PARAM(expr_out); BSON_OPTIONAL_PARAM(error); _state_machine_t *state_machine = NULL; bson_t *to_encrypt_doc = NULL; mongocrypt_binary_t *to_encrypt_bin = NULL; bson_iter_t iter; bool ret = false; bson_t result = BSON_INITIALIZER; bson_init(expr_out); state_machine = _create_explicit_state_machine( crypt, keyvault_coll, algorithm, keyid, keyaltname, query_type, contention_factor, range_opts, text_opts, error); if (!state_machine) { goto fail; } to_encrypt_doc = bson_new(); BSON_APPEND_DOCUMENT(to_encrypt_doc, "v", expr_in); to_encrypt_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(to_encrypt_doc), to_encrypt_doc->len); if (!mongocrypt_ctx_explicit_encrypt_expression_init(state_machine->ctx, to_encrypt_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(&result); if (!_state_machine_run(state_machine, &result, error)) { goto fail; } /* extract document */ if (!bson_iter_init_find(&iter, &result, "v")) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "encrypted result unexpected: no 'v' found"); goto fail; } else { bson_t tmp; if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "encrypted result unexpected: 'v' is not a document, got: %s", _mongoc_bson_type_to_str(bson_iter_type(&iter))); goto fail; } if (!_mongoc_iter_document_as_bson(&iter, &tmp, error)) { goto fail; } bson_copy_to(&tmp, expr_out); } ret = true; fail: _state_machine_destroy(state_machine); mongocrypt_binary_destroy(to_encrypt_bin); bson_destroy(to_encrypt_doc); bson_destroy(&result); return ret; } bool _mongoc_crypt_explicit_decrypt(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const bson_value_t *value_in, bson_value_t *value_out, bson_error_t *error) { _state_machine_t *state_machine = NULL; bson_t *to_decrypt_doc = NULL; mongocrypt_binary_t *to_decrypt_bin = NULL; bson_iter_t iter; bool ret = false; bson_t result = BSON_INITIALIZER; state_machine = _state_machine_new(crypt); state_machine->keyvault_coll = keyvault_coll; state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } to_decrypt_doc = bson_new(); BSON_APPEND_VALUE(to_decrypt_doc, "v", value_in); to_decrypt_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(to_decrypt_doc), to_decrypt_doc->len); if (!mongocrypt_ctx_explicit_decrypt_init(state_machine->ctx, to_decrypt_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(&result); if (!_state_machine_run(state_machine, &result, error)) { goto fail; } /* extract value */ if (!bson_iter_init_find(&iter, &result, "v")) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "decrypted result unexpected"); goto fail; } else { const bson_value_t *tmp; tmp = bson_iter_value(&iter); bson_value_copy(tmp, value_out); } ret = true; fail: _state_machine_destroy(state_machine); mongocrypt_binary_destroy(to_decrypt_bin); bson_destroy(to_decrypt_doc); bson_destroy(&result); return ret; } bool _mongoc_crypt_create_datakey(_mongoc_crypt_t *crypt, const char *kms_provider, const bson_t *masterkey, char **keyaltnames, uint32_t keyaltnames_count, const uint8_t *keymaterial, uint32_t keymaterial_len, bson_t *doc_out, bson_error_t *error) { _state_machine_t *state_machine = NULL; bool ret = false; bson_t masterkey_w_provider = BSON_INITIALIZER; mongocrypt_binary_t *masterkey_w_provider_bin = NULL; bson_init(doc_out); state_machine = _state_machine_new(crypt); state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } BSON_APPEND_UTF8(&masterkey_w_provider, "provider", kms_provider); if (masterkey) { bson_concat(&masterkey_w_provider, masterkey); } masterkey_w_provider_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(&masterkey_w_provider), masterkey_w_provider.len); if (!mongocrypt_ctx_setopt_key_encryption_key(state_machine->ctx, masterkey_w_provider_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } if (keyaltnames) { for (uint32_t i = 0u; i < keyaltnames_count; i++) { bool keyaltname_ret; mongocrypt_binary_t *keyaltname_bin; bson_t *keyaltname_doc; keyaltname_doc = BCON_NEW("keyAltName", keyaltnames[i]); keyaltname_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(keyaltname_doc), keyaltname_doc->len); keyaltname_ret = mongocrypt_ctx_setopt_key_alt_name(state_machine->ctx, keyaltname_bin); mongocrypt_binary_destroy(keyaltname_bin); bson_destroy(keyaltname_doc); if (!keyaltname_ret) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } } } if (keymaterial) { bson_t *const bson = BCON_NEW("keyMaterial", BCON_BIN(BSON_SUBTYPE_BINARY, keymaterial, keymaterial_len)); mongocrypt_binary_t *const bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(bson), bson->len); mongocrypt_ctx_setopt_key_material(state_machine->ctx, bin); bson_destroy(bson); mongocrypt_binary_destroy(bin); } if (!mongocrypt_ctx_datakey_init(state_machine->ctx)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(doc_out); if (!_state_machine_run(state_machine, doc_out, error)) { goto fail; } ret = true; fail: bson_destroy(&masterkey_w_provider); mongocrypt_binary_destroy(masterkey_w_provider_bin); _state_machine_destroy(state_machine); return ret; } bool _mongoc_crypt_rewrap_many_datakey(_mongoc_crypt_t *crypt, mongoc_collection_t *keyvault_coll, const bson_t *filter, const char *provider, const bson_t *master_key, bson_t *doc_out, bson_error_t *error) { _state_machine_t *state_machine = NULL; const bson_t empty_bson = BSON_INITIALIZER; mongocrypt_binary_t *filter_bin = NULL; bool ret = false; // Caller must ensure `provider` is provided alongside `master_key`. BSON_ASSERT(!master_key || provider); bson_init(doc_out); state_machine = _state_machine_new(crypt); state_machine->keyvault_coll = keyvault_coll; state_machine->ctx = mongocrypt_ctx_new(crypt->handle); if (!state_machine->ctx) { _crypt_check_error(crypt->handle, error, true); goto fail; } { bson_t new_provider = BSON_INITIALIZER; mongocrypt_binary_t *new_provider_bin = NULL; bool success = true; if (provider) { BSON_APPEND_UTF8(&new_provider, "provider", provider); if (master_key) { bson_concat(&new_provider, master_key); } new_provider_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(&new_provider), new_provider.len); if (!mongocrypt_ctx_setopt_key_encryption_key(state_machine->ctx, new_provider_bin)) { _ctx_check_error(state_machine->ctx, error, true); success = false; } mongocrypt_binary_destroy(new_provider_bin); } bson_destroy(&new_provider); if (!success) { goto fail; } } if (!filter) { filter = &empty_bson; } filter_bin = mongocrypt_binary_new_from_data((uint8_t *)bson_get_data(filter), filter->len); if (!mongocrypt_ctx_rewrap_many_datakey_init(state_machine->ctx, filter_bin)) { _ctx_check_error(state_machine->ctx, error, true); goto fail; } bson_destroy(doc_out); if (!_state_machine_run(state_machine, doc_out, error)) { goto fail; } ret = true; fail: mongocrypt_binary_destroy(filter_bin); _state_machine_destroy(state_machine); return ret; } const char * _mongoc_crypt_get_crypt_shared_version(const _mongoc_crypt_t *crypt) { return mongocrypt_crypt_shared_lib_version_string(crypt->handle, NULL); } #else /* ensure the translation unit is not empty */ extern int no_mongoc_client_side_encryption; #endif /* MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-cng-private.h000066400000000000000000000057711511661753600263700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include // IWYU pragma: export #include #include #include #include #ifdef MONGOC_ENABLE_CRYPTO_CNG #ifndef MONGOC_CRYPTO_CNG_PRIVATE_H #define MONGOC_CRYPTO_CNG_PRIVATE_H #include BSON_BEGIN_DECLS void mongoc_crypto_cng_init(void); void mongoc_crypto_cng_cleanup(void); bool mongoc_crypto_cng_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_cng_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_cng_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); bool mongoc_crypto_cng_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_cng_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_cng_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); BSON_END_DECLS #endif /* MONGOC_CRYPTO_CNG_PRIVATE_H */ #endif /* MONGOC_ENABLE_CRYPTO_CNG */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-cng.c000066400000000000000000000265041511661753600247100ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO_CNG #include #include #include #include #include #include #include #include #include #include #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) static BCRYPT_ALG_HANDLE _sha1_hash_algo; static BCRYPT_ALG_HANDLE _sha1_hmac_algo; static BCRYPT_ALG_HANDLE _sha256_hash_algo; static BCRYPT_ALG_HANDLE _sha256_hmac_algo; void mongoc_crypto_cng_init(void) { NTSTATUS status = STATUS_UNSUCCESSFUL; _sha1_hash_algo = 0; status = BCryptOpenAlgorithmProvider(&_sha1_hash_algo, BCRYPT_SHA1_ALGORITHM, NULL, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptOpenAlgorithmProvider(SHA1): %ld", status); } _sha1_hmac_algo = 0; status = BCryptOpenAlgorithmProvider(&_sha1_hmac_algo, BCRYPT_SHA1_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptOpenAlgorithmProvider(SHA1 HMAC): %ld", status); } _sha256_hash_algo = 0; status = BCryptOpenAlgorithmProvider(&_sha256_hash_algo, BCRYPT_SHA256_ALGORITHM, NULL, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptOpenAlgorithmProvider(SHA256): %ld", status); } _sha256_hmac_algo = 0; status = BCryptOpenAlgorithmProvider(&_sha256_hmac_algo, BCRYPT_SHA256_ALGORITHM, NULL, BCRYPT_ALG_HANDLE_HMAC_FLAG); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptOpenAlgorithmProvider(SHA256 HMAC): %ld", status); } } void mongoc_crypto_cng_cleanup(void) { if (_sha1_hash_algo) { BCryptCloseAlgorithmProvider(&_sha1_hash_algo, 0); } if (_sha1_hmac_algo) { BCryptCloseAlgorithmProvider(&_sha1_hmac_algo, 0); } if (_sha256_hash_algo) { BCryptCloseAlgorithmProvider(&_sha256_hash_algo, 0); } if (_sha256_hmac_algo) { BCryptCloseAlgorithmProvider(&_sha256_hmac_algo, 0); } } bool _mongoc_crypto_cng_hmac_or_hash( BCRYPT_ALG_HANDLE algorithm, const void *key, size_t key_length, void *data, size_t data_length, void *output) { unsigned char *hash_object_buffer = 0; ULONG hash_object_length = 0; BCRYPT_HASH_HANDLE hash = 0; ULONG mac_length = 0; NTSTATUS status = STATUS_UNSUCCESSFUL; bool retval = false; ULONG noop = 0; status = BCryptGetProperty( algorithm, BCRYPT_OBJECT_LENGTH, (unsigned char *)&hash_object_length, sizeof hash_object_length, &noop, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptGetProperty(): OBJECT_LENGTH %ld", status); return false; } status = BCryptGetProperty(algorithm, BCRYPT_HASH_LENGTH, (unsigned char *)&mac_length, sizeof mac_length, &noop, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptGetProperty(): HASH_LENGTH %ld", status); return false; } hash_object_buffer = bson_malloc(hash_object_length); status = BCryptCreateHash(algorithm, &hash, hash_object_buffer, hash_object_length, (PUCHAR)key, (ULONG)key_length, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptCreateHash(): %ld", status); goto cleanup; } status = BCryptHashData(hash, data, (ULONG)data_length, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptHashData(): %ld", status); goto cleanup; } status = BCryptFinishHash(hash, output, mac_length, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptFinishHash(): %ld", status); goto cleanup; } retval = true; cleanup: if (hash) { (void)BCryptDestroyHash(hash); } bson_free(hash_object_buffer); return retval; } #if defined(MONGOC_HAVE_BCRYPT_PBKDF2) // Ensure lossless conversion between `uint64_t` and `ULONGLONG` below. BSON_STATIC_ASSERT2(sizeof_ulonglong_uint64_t, sizeof(ULONGLONG) == sizeof(uint64_t)); /* Wrapper for BCryptDeriveKeyPBKDF2 */ static bool _bcrypt_derive_key_pbkdf2(BCRYPT_ALG_HANDLE prf, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { if (BSON_UNLIKELY(mlib_cmp(password_len, >, ULONG_MAX))) { MONGOC_ERROR("PBDKF2 HMAC password length exceeds ULONG_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(salt_len, >, ULONG_MAX))) { MONGOC_ERROR("PBDKF2 HMAC salt length exceeds ULONG_MAX"); return false; } // `(ULONGLONG) iterations` is statically asserted above. if (BSON_UNLIKELY(mlib_cmp(output_len, >, ULONG_MAX))) { MONGOC_ERROR("PBDKF2 HMAC output length exceeds ULONG_MAX"); return false; } // Make non-const versions of password and salt. unsigned char *password_copy = bson_malloc(password_len); memcpy(password_copy, password, password_len); unsigned char *salt_copy = bson_malloc(salt_len); memcpy(salt_copy, salt, salt_len); NTSTATUS status = BCryptDeriveKeyPBKDF2(prf, password_copy, (ULONG)password_len, salt_copy, (ULONG)salt_len, (ULONGLONG)iterations, output, (ULONG)output_len, 0); bson_free(password_copy); bson_free(salt_copy); if (!NT_SUCCESS(status)) { MONGOC_ERROR("_bcrypt_derive_key_pbkdf2(): %ld", status); return false; } return true; } #else static size_t _crypto_hash_size(mongoc_crypto_t *crypto) { if (crypto->algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_1) { return MONGOC_SCRAM_SHA_1_HASH_SIZE; } else if (crypto->algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_256) { return MONGOC_SCRAM_SHA_256_HASH_SIZE; } else { BSON_UNREACHABLE("Unexpected crypto algorithm"); } } /* Manually salts password if BCryptDeriveKeyPBKDF2 is unavailable */ static bool _bcrypt_derive_key_pbkdf2(BCRYPT_ALG_HANDLE algorithm, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t hash_size, unsigned char *output) { uint8_t intermediate_digest[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t start_key[MONGOC_SCRAM_HASH_MAX_SIZE]; memcpy(start_key, salt, salt_len); start_key[salt_len] = 0; start_key[salt_len + 1] = 0; start_key[salt_len + 2] = 0; start_key[salt_len + 3] = 1; if (!_mongoc_crypto_cng_hmac_or_hash(algorithm, password, password_len, start_key, hash_size, output)) { return false; } memcpy(intermediate_digest, output, hash_size); for (uint32_t i = 2u; i <= iterations; i++) { if (!_mongoc_crypto_cng_hmac_or_hash(algorithm, password, password_len, intermediate_digest, hash_size, output)) { return false; } for (size_t k = 0; k < hash_size; k++) { output[k] ^= intermediate_digest[k]; } } return true; } #endif bool mongoc_crypto_cng_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { #if defined(MONGOC_HAVE_BCRYPT_PBKDF2) BSON_UNUSED(crypto); return _bcrypt_derive_key_pbkdf2( _sha1_hmac_algo, password, password_len, salt, salt_len, iterations, output_len, output); #else return _bcrypt_derive_key_pbkdf2( _sha1_hmac_algo, password, password_len, salt, salt_len, iterations, _crypto_hash_size(crypto), output); #endif } void mongoc_crypto_cng_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { BSON_UNUSED(crypto); if (!_sha1_hmac_algo) { return; } _mongoc_crypto_cng_hmac_or_hash(_sha1_hmac_algo, key, key_len, (void *)data, data_len, hmac_out); } bool mongoc_crypto_cng_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { BSON_UNUSED(crypto); bool res; if (!_sha1_hash_algo) { return false; } res = _mongoc_crypto_cng_hmac_or_hash(_sha1_hash_algo, NULL, 0, (void *)input, input_len, hash_out); return res; } bool mongoc_crypto_cng_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { #if defined(MONGOC_HAVE_BCRYPT_PBKDF2) BSON_UNUSED(crypto); return _bcrypt_derive_key_pbkdf2( _sha256_hmac_algo, password, password_len, salt, salt_len, iterations, output_len, output); #else BSON_UNUSED(output_len); return _bcrypt_derive_key_pbkdf2( _sha256_hmac_algo, password, password_len, salt, salt_len, iterations, _crypto_hash_size(crypto), output); #endif } void mongoc_crypto_cng_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { BSON_UNUSED(crypto); if (!_sha256_hmac_algo) { return; } _mongoc_crypto_cng_hmac_or_hash(_sha256_hmac_algo, key, key_len, (void *)data, data_len, hmac_out); } bool mongoc_crypto_cng_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { BSON_UNUSED(crypto); bool res; if (!_sha256_hash_algo) { return false; } res = _mongoc_crypto_cng_hmac_or_hash(_sha256_hash_algo, NULL, 0, (void *)input, input_len, hash_out); return res; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-common-crypto-private.h000066400000000000000000000063641511661753600304260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO #ifndef MONGOC_CRYPTO_COMMON_CRYPTO_PRIVATE_H #define MONGOC_CRYPTO_COMMON_CRYPTO_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS bool mongoc_crypto_common_crypto_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_common_crypto_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_common_crypto_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); bool mongoc_crypto_common_crypto_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_common_crypto_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_common_crypto_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); BSON_END_DECLS #endif /* MONGOC_CRYPTO_COMMON_CRYPTO_PRIVATE_H */ #endif /* MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-common-crypto.c000066400000000000000000000114411511661753600267410ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifdef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO #include #include #include #include #include // Ensure lossless conversion between `uint32_t` and `uint` below. BSON_STATIC_ASSERT2(sizeof_uint_uint32_t, sizeof(uint) == sizeof(uint32_t)); bool mongoc_crypto_common_crypto_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { BSON_UNUSED(crypto); return kCCSuccess == CCKeyDerivationPBKDF(kCCPBKDF2, password, password_len, salt, salt_len, kCCPRFHmacAlgSHA1, (uint)iterations, output, output_len); } void mongoc_crypto_common_crypto_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { /* U1 = HMAC(input, salt + 0001) */ CCHmac(kCCHmacAlgSHA1, key, (size_t)key_len, data, (size_t)data_len, hmac_out); } bool mongoc_crypto_common_crypto_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { if (CC_SHA1(input, (CC_LONG)input_len, hash_out)) { return true; } return false; } bool mongoc_crypto_common_crypto_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { BSON_UNUSED(crypto); return kCCSuccess == CCKeyDerivationPBKDF(kCCPBKDF2, password, password_len, salt, salt_len, kCCPRFHmacAlgSHA256, (uint)iterations, output, output_len); } void mongoc_crypto_common_crypto_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { CCHmac(kCCHmacAlgSHA256, key, (size_t)key_len, data, (size_t)data_len, hmac_out); } bool mongoc_crypto_common_crypto_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { if (CC_SHA256(input, (CC_LONG)input_len, hash_out)) { return true; } return false; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-openssl-private.h000066400000000000000000000060251511661753600272750ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO #ifndef MONGOC_CRYPTO_OPENSSL_PRIVATE_H #define MONGOC_CRYPTO_OPENSSL_PRIVATE_H #include // IWYU pragma: export BSON_BEGIN_DECLS bool mongoc_crypto_openssl_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_openssl_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_openssl_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); bool mongoc_crypto_openssl_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_openssl_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_openssl_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); BSON_END_DECLS #endif /* MONGOC_CRYPTO_OPENSSL_PRIVATE_H */ #endif /* MONGOC_ENABLE_CRYPTO_LIBCRYPTO */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-openssl.c000066400000000000000000000135621511661753600256240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO #include #include #include #include #include #include #include bool mongoc_crypto_openssl_pbkdf2_hmac_sha1(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { BSON_UNUSED(crypto); if (BSON_UNLIKELY(mlib_cmp(password_len, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC password length exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(salt_len, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC salt length exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(iterations, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC iteration count exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(iterations, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC output buffer length exceeds INT_MAX"); return false; } return 0 != PKCS5_PBKDF2_HMAC( password, (int)password_len, salt, (int)salt_len, (int)iterations, EVP_sha1(), (int)output_len, output); } void mongoc_crypto_openssl_hmac_sha1(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { BSON_UNUSED(crypto); /* U1 = HMAC(input, salt + 0001) */ HMAC(EVP_sha1(), key, key_len, data, data_len, hmac_out, NULL); } #if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) static EVP_MD_CTX * EVP_MD_CTX_new(void) { return bson_malloc0(sizeof(EVP_MD_CTX)); } static void EVP_MD_CTX_free(EVP_MD_CTX *ctx) { EVP_MD_CTX_cleanup(ctx); bson_free(ctx); } #endif bool mongoc_crypto_openssl_sha1(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { EVP_MD_CTX *digest_ctxp = EVP_MD_CTX_new(); bool rval = false; BSON_UNUSED(crypto); if (1 != EVP_DigestInit_ex(digest_ctxp, EVP_sha1(), NULL)) { goto cleanup; } if (1 != EVP_DigestUpdate(digest_ctxp, input, input_len)) { goto cleanup; } rval = (1 == EVP_DigestFinal_ex(digest_ctxp, hash_out, NULL)); cleanup: EVP_MD_CTX_free(digest_ctxp); return rval; } bool mongoc_crypto_openssl_pbkdf2_hmac_sha256(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { BSON_UNUSED(crypto); if (BSON_UNLIKELY(mlib_cmp(password_len, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC password length exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(salt_len, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC salt length exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(iterations, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC iteration count exceeds INT_MAX"); return false; } if (BSON_UNLIKELY(mlib_cmp(iterations, >, INT_MAX))) { MONGOC_ERROR("PBKDF2 HMAC output buffer length exceeds INT_MAX"); return false; } return 0 != PKCS5_PBKDF2_HMAC( password, (int)password_len, salt, (int)salt_len, (int)iterations, EVP_sha256(), (int)output_len, output); } void mongoc_crypto_openssl_hmac_sha256(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { BSON_UNUSED(crypto); /* U1 = HMAC(input, salt + 0001) */ HMAC(EVP_sha256(), key, key_len, data, data_len, hmac_out, NULL); } bool mongoc_crypto_openssl_sha256(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out) { EVP_MD_CTX *digest_ctxp = EVP_MD_CTX_new(); bool rval = false; BSON_UNUSED(crypto); if (1 != EVP_DigestInit_ex(digest_ctxp, EVP_sha256(), NULL)) { goto cleanup; } if (1 != EVP_DigestUpdate(digest_ctxp, input, input_len)) { goto cleanup; } rval = (1 == EVP_DigestFinal_ex(digest_ctxp, hash_out, NULL)); cleanup: EVP_MD_CTX_free(digest_ctxp); return rval; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto-private.h000066400000000000000000000051061511661753600256130ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #ifdef MONGOC_ENABLE_CRYPTO #ifndef MONGOC_CRYPTO_PRIVATE_H #define MONGOC_CRYPTO_PRIVATE_H BSON_BEGIN_DECLS typedef struct _mongoc_crypto_t mongoc_crypto_t; typedef enum { MONGOC_CRYPTO_ALGORITHM_SHA_1, MONGOC_CRYPTO_ALGORITHM_SHA_256 } mongoc_crypto_hash_algorithm_t; struct _mongoc_crypto_t { void (*hmac)(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool (*hash)(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); bool (*pbkdf)(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); mongoc_crypto_hash_algorithm_t algorithm; }; void mongoc_crypto_init(mongoc_crypto_t *crypto, mongoc_crypto_hash_algorithm_t algo); bool mongoc_crypto_pbkdf(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output); void mongoc_crypto_hmac(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out); bool mongoc_crypto_hash(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *hash_out); BSON_END_DECLS #endif /* MONGOC_CRYPTO_PRIVATE_H */ #endif /* MONGOC_ENABLE_CRYPTO */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-crypto.c000066400000000000000000000071501511661753600241370ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO #include #include #include #if defined(MONGOC_ENABLE_CRYPTO_LIBCRYPTO) #include #elif defined(MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO) #include #elif defined(MONGOC_ENABLE_CRYPTO_CNG) #include #endif void mongoc_crypto_init(mongoc_crypto_t *crypto, mongoc_crypto_hash_algorithm_t algo) { crypto->pbkdf = NULL; crypto->hmac = NULL; crypto->hash = NULL; if (algo == MONGOC_CRYPTO_ALGORITHM_SHA_1) { #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO crypto->pbkdf = mongoc_crypto_openssl_pbkdf2_hmac_sha1; crypto->hmac = mongoc_crypto_openssl_hmac_sha1; crypto->hash = mongoc_crypto_openssl_sha1; #elif defined(MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO) crypto->pbkdf = mongoc_crypto_common_crypto_pbkdf2_hmac_sha1; crypto->hmac = mongoc_crypto_common_crypto_hmac_sha1; crypto->hash = mongoc_crypto_common_crypto_sha1; #elif defined(MONGOC_ENABLE_CRYPTO_CNG) crypto->pbkdf = mongoc_crypto_cng_pbkdf2_hmac_sha1; crypto->hmac = mongoc_crypto_cng_hmac_sha1; crypto->hash = mongoc_crypto_cng_sha1; #endif } else if (algo == MONGOC_CRYPTO_ALGORITHM_SHA_256) { #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO crypto->pbkdf = mongoc_crypto_openssl_pbkdf2_hmac_sha256; crypto->hmac = mongoc_crypto_openssl_hmac_sha256; crypto->hash = mongoc_crypto_openssl_sha256; #elif defined(MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO) crypto->pbkdf = mongoc_crypto_common_crypto_pbkdf2_hmac_sha256; crypto->hmac = mongoc_crypto_common_crypto_hmac_sha256; crypto->hash = mongoc_crypto_common_crypto_sha256; #elif defined(MONGOC_ENABLE_CRYPTO_CNG) crypto->pbkdf = mongoc_crypto_cng_pbkdf2_hmac_sha256; crypto->hmac = mongoc_crypto_cng_hmac_sha256; crypto->hash = mongoc_crypto_cng_sha256; #endif } BSON_ASSERT(crypto->pbkdf); BSON_ASSERT(crypto->hmac); BSON_ASSERT(crypto->hash); crypto->algorithm = algo; } bool mongoc_crypto_pbkdf(mongoc_crypto_t *crypto, const char *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint32_t iterations, size_t output_len, unsigned char *output) { return crypto->pbkdf(crypto, password, password_len, salt, salt_len, iterations, output_len, output); } void mongoc_crypto_hmac(mongoc_crypto_t *crypto, const void *key, int key_len, const unsigned char *data, int data_len, unsigned char *hmac_out) { crypto->hmac(crypto, key, key_len, data, data_len, hmac_out); } bool mongoc_crypto_hash(mongoc_crypto_t *crypto, const unsigned char *input, const size_t input_len, unsigned char *output) { return crypto->hash(crypto, input, input_len, output); } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-array.c000066400000000000000000000061631511661753600252530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include typedef struct _data_array_t { bson_t cmd; bson_t array; bson_iter_t iter; bson_t bson; /* current document */ char *field_name; } data_array_t; static mongoc_cursor_state_t _prime(mongoc_cursor_t *cursor) { bson_iter_t iter; data_array_t *data = (data_array_t *)cursor->impl.data; bson_destroy(&data->array); /* this cursor is only used with the listDatabases command. it iterates * over the array in the response's "databases" field. */ if (_mongoc_cursor_run_command(cursor, &data->cmd, &cursor->opts, &data->array, false) && bson_iter_init_find(&iter, &data->array, data->field_name) && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &data->iter)) { return IN_BATCH; } return DONE; } static mongoc_cursor_state_t _pop_from_batch(mongoc_cursor_t *cursor) { uint32_t document_len; const uint8_t *document; data_array_t *data = (data_array_t *)cursor->impl.data; if (bson_iter_next(&data->iter)) { bson_iter_document(&data->iter, &document_len, &document); BSON_ASSERT(bson_init_static(&data->bson, document, document_len)); cursor->current = &data->bson; return IN_BATCH; } return DONE; } static void _clone(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src) { data_array_t *data_dst = BSON_ALIGNED_ALLOC0(data_array_t); data_array_t *data_src = (data_array_t *)src->data; bson_init(&data_dst->array); bson_copy_to(&data_src->cmd, &data_dst->cmd); data_dst->field_name = bson_strdup(data_src->field_name); dst->data = data_dst; } static void _destroy(mongoc_cursor_impl_t *impl) { data_array_t *data = (data_array_t *)impl->data; bson_destroy(&data->array); bson_destroy(&data->cmd); bson_free(data->field_name); bson_free(data); } mongoc_cursor_t * _mongoc_cursor_array_new( mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const bson_t *opts, const char *field_name) { BSON_ASSERT_PARAM(client); mongoc_cursor_t *cursor = _mongoc_cursor_new_with_opts(client, db_and_coll, opts, NULL, NULL, NULL); data_array_t *data = BSON_ALIGNED_ALLOC0(data_array_t); bson_copy_to(cmd, &data->cmd); bson_init(&data->array); data->field_name = bson_strdup(field_name); cursor->impl.prime = _prime; cursor->impl.pop_from_batch = _pop_from_batch; cursor->impl.destroy = _destroy; cursor->impl.clone = _clone; cursor->impl.data = (void *)data; return cursor; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-change-stream.c000066400000000000000000000122721511661753600266510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include typedef struct _data_change_stream_t { mongoc_cursor_response_t response; bson_t post_batch_resume_token; } _data_change_stream_t; static void _update_post_batch_resume_token(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; bson_iter_t iter, child; if (mongoc_cursor_error(cursor, NULL)) { return; } if (bson_iter_init(&iter, &data->response.reply) && bson_iter_find_descendant(&iter, "cursor.postBatchResumeToken", &child) && BSON_ITER_HOLDS_DOCUMENT(&child)) { uint32_t len; const uint8_t *buf; bson_t post_batch_resume_token; bson_iter_document(&child, &len, &buf); BSON_ASSERT(bson_init_static(&post_batch_resume_token, buf, len)); bson_destroy(&data->post_batch_resume_token); bson_copy_to(&post_batch_resume_token, &data->post_batch_resume_token); } } static mongoc_cursor_state_t _prime(mongoc_cursor_t *cursor) { BSON_UNUSED(cursor); fprintf(stderr, "Prime unsupported on change stream cursor."); BSON_ASSERT(false); return IN_BATCH; } static mongoc_cursor_state_t _pop_from_batch(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; _mongoc_cursor_response_read(cursor, &data->response, &cursor->current); if (cursor->current) { return IN_BATCH; } else { return cursor->cursor_id ? END_OF_BATCH : DONE; } } mongoc_cursor_state_t _get_next_batch(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; bson_t getmore_cmd; _mongoc_cursor_prepare_getmore_command(cursor, &getmore_cmd); _mongoc_cursor_response_refresh(cursor, &getmore_cmd, NULL /* opts */, &data->response); bson_destroy(&getmore_cmd); _update_post_batch_resume_token(cursor); return IN_BATCH; } static void _destroy(mongoc_cursor_impl_t *impl) { _data_change_stream_t *data = (_data_change_stream_t *)impl->data; bson_destroy(&data->response.reply); bson_destroy(&data->post_batch_resume_token); bson_free(data); } static void _clone(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src) { BSON_UNUSED(dst); BSON_UNUSED(src); fprintf(stderr, "Clone unsupported on change stream cursor."); BSON_ASSERT(false); } mongoc_cursor_t * _mongoc_cursor_change_stream_new(mongoc_client_t *client, bson_t *reply, const bson_t *getmore_opts) { mongoc_cursor_t *cursor; _data_change_stream_t *data; BSON_ASSERT_PARAM(client); BSON_ASSERT(reply); data = BSON_ALIGNED_ALLOC0(_data_change_stream_t); /* _mongoc_cursor_response_t.reply is already uninitialized and we can trust * that reply comes from mongoc_client_read_command_with_opts() */ BSON_ASSERT(bson_steal(&data->response.reply, reply)); bson_init(&data->post_batch_resume_token); cursor = _mongoc_cursor_new_with_opts(client, NULL, getmore_opts, NULL, NULL, NULL); cursor->impl.prime = _prime; cursor->impl.pop_from_batch = _pop_from_batch; cursor->impl.get_next_batch = _get_next_batch; cursor->impl.destroy = _destroy; cursor->impl.clone = _clone; cursor->impl.data = (void *)data; cursor->state = IN_BATCH; if (!_mongoc_cursor_start_reading_response(cursor, &data->response)) { _mongoc_set_error( &cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Couldn't parse cursor document"); } _update_post_batch_resume_token(cursor); return cursor; } static bool _bson_iter_has_next(bson_iter_t *iter) { bson_iter_t iter_copy = {0}; memcpy(&iter_copy, iter, sizeof(bson_iter_t)); return bson_iter_next(&iter_copy); } bool _mongoc_cursor_change_stream_end_of_batch(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; return !_bson_iter_has_next(&data->response.batch_iter); } const bson_t * _mongoc_cursor_change_stream_get_post_batch_resume_token(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; return &data->post_batch_resume_token; } bool _mongoc_cursor_change_stream_has_post_batch_resume_token(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; return !bson_empty(&data->post_batch_resume_token); } const bson_t * _mongoc_cursor_change_stream_get_reply(mongoc_cursor_t *cursor) { _data_change_stream_t *data = (_data_change_stream_t *)cursor->impl.data; return &data->response.reply; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-cmd-deprecated.c000066400000000000000000000063061511661753600267750ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* This cursor is returned by the deprecated functions mongoc_client_command, * mongoc_database_command, and mongoc_collection_command. It runs the command * on the first call to mongoc_cursor_next and returns the only result. */ typedef struct _data_cmd_deprecated_t { bson_t cmd; bson_t reply; } data_cmd_deprecated_t; static mongoc_cursor_state_t _prime(mongoc_cursor_t *cursor) { data_cmd_deprecated_t *data = (data_cmd_deprecated_t *)cursor->impl.data; bson_destroy(&data->reply); if (_mongoc_cursor_run_command(cursor, &data->cmd, &cursor->opts, &data->reply, true)) { return IN_BATCH; } else { return DONE; } } static mongoc_cursor_state_t _pop_from_batch(mongoc_cursor_t *cursor) { data_cmd_deprecated_t *data = (data_cmd_deprecated_t *)cursor->impl.data; cursor->current = &data->reply; /* don't return DONE here. a cursor is marked DONE when it returns NULL. */ return END_OF_BATCH; } static mongoc_cursor_state_t _get_next_batch(mongoc_cursor_t *cursor) { BSON_UNUSED(cursor); /* there's no next batch to get, return DONE immediately. */ return DONE; } static void _clone(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src) { data_cmd_deprecated_t *data_src = (data_cmd_deprecated_t *)src->data; data_cmd_deprecated_t *data_dst = BSON_ALIGNED_ALLOC0(data_cmd_deprecated_t); bson_init(&data_dst->reply); bson_copy_to(&data_src->cmd, &data_dst->cmd); dst->data = data_dst; } static void _destroy(mongoc_cursor_impl_t *impl) { data_cmd_deprecated_t *data = (data_cmd_deprecated_t *)impl->data; bson_destroy(&data->reply); bson_destroy(&data->cmd); bson_free(data); } mongoc_cursor_t * _mongoc_cursor_cmd_deprecated_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT_PARAM(client); mongoc_cursor_t *cursor = _mongoc_cursor_new_with_opts( client, db_and_coll, NULL, read_prefs /* user prefs */, NULL /* default prefs */, NULL); data_cmd_deprecated_t *data = BSON_ALIGNED_ALLOC0(data_cmd_deprecated_t); _mongoc_cursor_check_and_copy_to(cursor, "command", cmd, &data->cmd); bson_init(&data->reply); cursor->impl.prime = _prime; cursor->impl.pop_from_batch = _pop_from_batch; cursor->impl.get_next_batch = _get_next_batch; cursor->impl.data = data; cursor->impl.clone = _clone; cursor->impl.destroy = _destroy; return cursor; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-cmd.c000066400000000000000000000126301511661753600246740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include typedef struct _data_cmd_t { mongoc_cursor_response_t response; bson_t cmd; } data_cmd_t; static mongoc_cursor_state_t _prime(mongoc_cursor_t *cursor) { data_cmd_t *data = (data_cmd_t *)cursor->impl.data; bson_t copied_opts; bson_init(&copied_opts); cursor->operation_id = ++cursor->client->cluster.operation_id; /* commands like agg have a cursor field, so copy opts without "batchSize" */ bson_copy_to_excluding_noinit(&cursor->opts, &copied_opts, "batchSize", "tailable", NULL); /* server replies to aggregate/listIndexes/listCollections with: * {cursor: {id: N, firstBatch: []}} */ _mongoc_cursor_response_refresh(cursor, &data->cmd, &copied_opts, &data->response); bson_destroy(&copied_opts); return IN_BATCH; } static mongoc_cursor_state_t _pop_from_batch(mongoc_cursor_t *cursor) { data_cmd_t *data = (data_cmd_t *)cursor->impl.data; _mongoc_cursor_response_read(cursor, &data->response, &cursor->current); if (cursor->current) { return IN_BATCH; } else { return cursor->cursor_id ? END_OF_BATCH : DONE; } } static mongoc_cursor_state_t _get_next_batch(mongoc_cursor_t *cursor) { data_cmd_t *data = (data_cmd_t *)cursor->impl.data; bson_t getmore_cmd; _mongoc_cursor_prepare_getmore_command(cursor, &getmore_cmd); _mongoc_cursor_response_refresh(cursor, &getmore_cmd, NULL /* opts */, &data->response); bson_destroy(&getmore_cmd); return IN_BATCH; } static void _destroy(mongoc_cursor_impl_t *impl) { data_cmd_t *data = (data_cmd_t *)impl->data; bson_destroy(&data->response.reply); bson_destroy(&data->cmd); bson_free(data); } static void _clone(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src) { data_cmd_t *data_src = (data_cmd_t *)src->data; data_cmd_t *data_dst = BSON_ALIGNED_ALLOC0(data_cmd_t); bson_init(&data_dst->response.reply); bson_copy_to(&data_src->cmd, &data_dst->cmd); dst->data = data_dst; } mongoc_cursor_t * _mongoc_cursor_cmd_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern) { BSON_ASSERT_PARAM(client); mongoc_cursor_t *cursor; data_cmd_t *data = BSON_ALIGNED_ALLOC0(data_cmd_t); cursor = _mongoc_cursor_new_with_opts(client, db_and_coll, opts, user_prefs, default_prefs, read_concern); _mongoc_cursor_check_and_copy_to(cursor, "command", cmd, &data->cmd); bson_init(&data->response.reply); cursor->impl.prime = _prime; cursor->impl.pop_from_batch = _pop_from_batch; cursor->impl.get_next_batch = _get_next_batch; cursor->impl.destroy = _destroy; cursor->impl.clone = _clone; cursor->impl.data = (void *)data; return cursor; } mongoc_cursor_t * _mongoc_cursor_cmd_new_from_reply(mongoc_client_t *client, const bson_t *cmd, const bson_t *opts, bson_t *reply) { BSON_ASSERT_PARAM(client); mongoc_cursor_t *cursor = _mongoc_cursor_cmd_new(client, NULL, cmd, opts, NULL, NULL, NULL); data_cmd_t *data = (data_cmd_t *)cursor->impl.data; cursor->state = IN_BATCH; bson_destroy(&data->response.reply); if (!bson_steal(&data->response.reply, reply)) { bson_destroy(&data->response.reply); BSON_ASSERT(bson_steal(&data->response.reply, bson_copy(reply))); } if (!_mongoc_cursor_start_reading_response(cursor, &data->response)) { _mongoc_set_error( &cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Couldn't parse cursor document"); } if (0 != cursor->cursor_id && 0 == cursor->server_id) { // A non-zero cursor_id means the cursor is still open on the server. // Expect the "serverId" option to have been passed. The "serverId" option // identifies the server with the cursor. // The server with the cursor is required to send a "getMore" or // "killCursors" command. _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Expected `serverId` option to identify server with open cursor " "(cursor ID is %" PRId64 "). " "Consider using `mongoc_client_select_server` and using the " "resulting server ID to create the cursor.", cursor->cursor_id); // Reset cursor_id to 0 to avoid an assertion error in // `mongoc_cursor_destroy` when attempting to send "killCursors". cursor->cursor_id = 0; } return cursor; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-find.c000066400000000000000000000070141511661753600250510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include typedef struct _data_find_t { mongoc_cursor_response_t response; bson_t filter; } data_find_t; static mongoc_cursor_state_t _prime(mongoc_cursor_t *cursor) { data_find_t *data = (data_find_t *)cursor->impl.data; bson_t find_cmd; bson_init(&find_cmd); cursor->operation_id = ++cursor->client->cluster.operation_id; /* construct { find: "", filter: {} } */ _mongoc_cursor_prepare_find_command(cursor, &data->filter, &find_cmd); _mongoc_cursor_response_refresh(cursor, &find_cmd, &cursor->opts, &data->response); bson_destroy(&find_cmd); return IN_BATCH; } static mongoc_cursor_state_t _pop_from_batch(mongoc_cursor_t *cursor) { data_find_t *data = (data_find_t *)cursor->impl.data; _mongoc_cursor_response_read(cursor, &data->response, &cursor->current); if (cursor->current) { return IN_BATCH; } else { return cursor->cursor_id ? END_OF_BATCH : DONE; } } static mongoc_cursor_state_t _get_next_batch(mongoc_cursor_t *cursor) { data_find_t *data = (data_find_t *)cursor->impl.data; bson_t getmore_cmd; if (!cursor->cursor_id) { return DONE; } _mongoc_cursor_prepare_getmore_command(cursor, &getmore_cmd); _mongoc_cursor_response_refresh(cursor, &getmore_cmd, NULL /* opts */, &data->response); bson_destroy(&getmore_cmd); return IN_BATCH; } static void _destroy(mongoc_cursor_impl_t *impl) { data_find_t *data = (data_find_t *)impl->data; bson_destroy(&data->filter); bson_destroy(&data->response.reply); bson_free(data); } static void _clone(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src) { data_find_t *data_src = (data_find_t *)src->data; data_find_t *data_dst = BSON_ALIGNED_ALLOC0(data_find_t); bson_init(&data_dst->response.reply); bson_copy_to(&data_src->filter, &data_dst->filter); dst->data = data_dst; } mongoc_cursor_t * _mongoc_cursor_find_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern) { BSON_ASSERT_PARAM(client); mongoc_cursor_t *cursor; data_find_t *data = BSON_ALIGNED_ALLOC0(data_find_t); bson_init(&data->response.reply); cursor = _mongoc_cursor_new_with_opts(client, db_and_coll, opts, user_prefs, default_prefs, read_concern); _mongoc_cursor_check_and_copy_to(cursor, "filter", filter, &data->filter); cursor->impl.prime = _prime; cursor->impl.pop_from_batch = _pop_from_batch; cursor->impl.get_next_batch = _get_next_batch; cursor->impl.destroy = _destroy; cursor->impl.clone = _clone; cursor->impl.data = (void *)data; return cursor; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor-private.h000066400000000000000000000232521511661753600256120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CURSOR_PRIVATE_H #define MONGOC_CURSOR_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include #include BSON_BEGIN_DECLS #define MONGOC_CURSOR_ALLOW_PARTIAL_RESULTS "allowPartialResults" #define MONGOC_CURSOR_ALLOW_PARTIAL_RESULTS_LEN 19 #define MONGOC_CURSOR_AWAIT_DATA "awaitData" #define MONGOC_CURSOR_AWAIT_DATA_LEN 9 #define MONGOC_CURSOR_BATCH_SIZE "batchSize" #define MONGOC_CURSOR_BATCH_SIZE_LEN 9 #define MONGOC_CURSOR_COLLATION "collation" #define MONGOC_CURSOR_COLLATION_LEN 9 #define MONGOC_CURSOR_COMMENT "comment" #define MONGOC_CURSOR_COMMENT_LEN 7 #define MONGOC_CURSOR_EXHAUST "exhaust" #define MONGOC_CURSOR_EXHAUST_LEN 7 #define MONGOC_CURSOR_FILTER "filter" #define MONGOC_CURSOR_FILTER_LEN 6 #define MONGOC_CURSOR_FIND "find" #define MONGOC_CURSOR_FIND_LEN 4 #define MONGOC_CURSOR_HINT "hint" #define MONGOC_CURSOR_HINT_LEN 4 #define MONGOC_CURSOR_LIMIT "limit" #define MONGOC_CURSOR_LIMIT_LEN 5 #define MONGOC_CURSOR_MAX "max" #define MONGOC_CURSOR_MAX_LEN 3 #define MONGOC_CURSOR_MAX_AWAIT_TIME_MS "maxAwaitTimeMS" #define MONGOC_CURSOR_MAX_AWAIT_TIME_MS_LEN 14 #define MONGOC_CURSOR_MAX_SCAN "maxScan" #define MONGOC_CURSOR_MAX_SCAN_LEN 7 #define MONGOC_CURSOR_MAX_TIME_MS "maxTimeMS" #define MONGOC_CURSOR_MAX_TIME_MS_LEN 9 #define MONGOC_CURSOR_MIN "min" #define MONGOC_CURSOR_MIN_LEN 3 #define MONGOC_CURSOR_NO_CURSOR_TIMEOUT "noCursorTimeout" #define MONGOC_CURSOR_NO_CURSOR_TIMEOUT_LEN 15 #define MONGOC_CURSOR_OPLOG_REPLAY "oplogReplay" #define MONGOC_CURSOR_OPLOG_REPLAY_LEN 11 #define MONGOC_CURSOR_ORDERBY "orderby" #define MONGOC_CURSOR_ORDERBY_LEN 7 #define MONGOC_CURSOR_PROJECTION "projection" #define MONGOC_CURSOR_PROJECTION_LEN 10 #define MONGOC_CURSOR_QUERY "query" #define MONGOC_CURSOR_QUERY_LEN 5 #define MONGOC_CURSOR_READ_CONCERN "readConcern" #define MONGOC_CURSOR_READ_CONCERN_LEN 11 #define MONGOC_CURSOR_RETURN_KEY "returnKey" #define MONGOC_CURSOR_RETURN_KEY_LEN 9 #define MONGOC_CURSOR_SHOW_DISK_LOC "showDiskLoc" #define MONGOC_CURSOR_SHOW_DISK_LOC_LEN 11 #define MONGOC_CURSOR_SHOW_RECORD_ID "showRecordId" #define MONGOC_CURSOR_SHOW_RECORD_ID_LEN 12 #define MONGOC_CURSOR_SINGLE_BATCH "singleBatch" #define MONGOC_CURSOR_SINGLE_BATCH_LEN 11 #define MONGOC_CURSOR_SKIP "skip" #define MONGOC_CURSOR_SKIP_LEN 4 #define MONGOC_CURSOR_SNAPSHOT "snapshot" #define MONGOC_CURSOR_SNAPSHOT_LEN 8 #define MONGOC_CURSOR_SORT "sort" #define MONGOC_CURSOR_SORT_LEN 4 #define MONGOC_CURSOR_TAILABLE "tailable" #define MONGOC_CURSOR_TAILABLE_LEN 8 typedef struct _mongoc_cursor_impl_t mongoc_cursor_impl_t; typedef enum { UNPRIMED, IN_BATCH, END_OF_BATCH, DONE } mongoc_cursor_state_t; typedef mongoc_cursor_state_t (*_mongoc_cursor_impl_transition_t)(mongoc_cursor_t *cursor); struct _mongoc_cursor_impl_t { void (*clone)(mongoc_cursor_impl_t *dst, const mongoc_cursor_impl_t *src); void (*destroy)(mongoc_cursor_impl_t *ctx); _mongoc_cursor_impl_transition_t prime; _mongoc_cursor_impl_transition_t pop_from_batch; _mongoc_cursor_impl_transition_t get_next_batch; void *data; }; /* 3.2+ responses -- read batch docs like {cursor:{id: 123, firstBatch: []}} */ typedef struct _mongoc_cursor_response_t { bson_t reply; /* the entire command reply */ bson_iter_t batch_iter; /* iterates over the batch array */ bson_t current_doc; /* the current doc inside the batch array */ } mongoc_cursor_response_t; struct _mongoc_cursor_t { mongoc_client_t *client; uint32_t client_generation; uint32_t server_id; bool secondary_ok; mongoc_cursor_state_t state; bool in_exhaust; bson_t opts; mongoc_read_concern_t *read_concern; mongoc_read_prefs_t *read_prefs; mongoc_write_concern_t *write_concern; /** If the cursor was created for an operation that might have overridden the * user's read preferences' read mode, then server selection forced the * cursor to use a read preference mode of 'primary' server. Whether this * force occurred is stored here: */ bool must_use_primary; /** Whether this cursor corresponds to an aggregate command that contains a * writing-stage */ bool is_aggr_with_write_stage; bool explicit_session; mongoc_client_session_t *client_session; uint32_t count; char *ns; uint32_t nslen; uint32_t dblen; bson_error_t error; bson_t error_doc; /* always initialized, and set with server errors. */ const bson_t *current; mongoc_cursor_impl_t impl; int64_t operation_id; int64_t cursor_id; }; int32_t _mongoc_n_return(mongoc_cursor_t *cursor); void _mongoc_set_cursor_ns(mongoc_cursor_t *cursor, const char *ns, uint32_t nslen); bool _mongoc_cursor_get_opt_bool(const mongoc_cursor_t *cursor, const char *option); void _mongoc_cursor_flags_to_opts(mongoc_query_flags_t qflags, bson_t *opts, bool *secondary_ok); bool _mongoc_cursor_translate_dollar_query_opts(const bson_t *query, bson_t *opts, bson_t *unwrapped, bson_error_t *error); mongoc_server_stream_t * _mongoc_cursor_fetch_stream(mongoc_cursor_t *cursor, const mongoc_ss_log_context_t *log_context); void _mongoc_cursor_collection(const mongoc_cursor_t *cursor, const char **collection, int *collection_len); bool _mongoc_cursor_run_command( mongoc_cursor_t *cursor, const bson_t *command, const bson_t *opts, bson_t *reply, bool retry_prohibited); bool _mongoc_cursor_more(mongoc_cursor_t *cursor); bool _mongoc_cursor_set_opt_int64(mongoc_cursor_t *cursor, const char *option, int64_t value); void _mongoc_cursor_prepare_find_command(mongoc_cursor_t *cursor, const bson_t *filter, bson_t *command); const bson_t * _mongoc_cursor_initial_query(mongoc_cursor_t *cursor); const bson_t * _mongoc_cursor_get_more(mongoc_cursor_t *cursor); /* start iterating a reply like * {cursor: {id: 1234, ns: "db.collection", firstBatch: [...]}} or * {cursor: {id: 1234, ns: "db.collection", nextBatch: [...]}} */ void _mongoc_cursor_response_refresh(mongoc_cursor_t *cursor, const bson_t *command, const bson_t *opts, mongoc_cursor_response_t *response); bool _mongoc_cursor_start_reading_response(mongoc_cursor_t *cursor, mongoc_cursor_response_t *response); void _mongoc_cursor_response_read(mongoc_cursor_t *cursor, mongoc_cursor_response_t *response, const bson_t **bson); void _mongoc_cursor_prepare_getmore_command(mongoc_cursor_t *cursor, bson_t *command); void _mongoc_cursor_set_empty(mongoc_cursor_t *cursor); bool _mongoc_cursor_check_and_copy_to(mongoc_cursor_t *cursor, const char *err_prefix, const bson_t *src, bson_t *dst); void _mongoc_cursor_prime(mongoc_cursor_t *cursor); bool _mongoc_cursor_next(mongoc_cursor_t *cursor, const bson_t **bson); mongoc_cursor_t * _mongoc_cursor_new_with_opts(mongoc_client_t *client, const char *db_and_collection, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern); /* cursor constructors. */ mongoc_cursor_t * _mongoc_cursor_find_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *filter, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern); mongoc_cursor_t * _mongoc_cursor_cmd_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern); mongoc_cursor_t * _mongoc_cursor_cmd_new_from_reply(mongoc_client_t *client, const bson_t *cmd, const bson_t *opts, bson_t *reply); mongoc_cursor_t * _mongoc_cursor_cmd_deprecated_new(mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const mongoc_read_prefs_t *read_prefs); mongoc_cursor_t * _mongoc_cursor_array_new( mongoc_client_t *client, const char *db_and_coll, const bson_t *cmd, const bson_t *opts, const char *field_name); mongoc_cursor_t * _mongoc_cursor_change_stream_new(mongoc_client_t *client, bson_t *reply, const bson_t *opts); bool _mongoc_cursor_change_stream_end_of_batch(mongoc_cursor_t *cursor); const bson_t * _mongoc_cursor_change_stream_get_post_batch_resume_token(mongoc_cursor_t *cursor); bool _mongoc_cursor_change_stream_has_post_batch_resume_token(mongoc_cursor_t *cursor); const bson_t * _mongoc_cursor_change_stream_get_reply(mongoc_cursor_t *cursor); BSON_END_DECLS #endif /* MONGOC_CURSOR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor.c000066400000000000000000001340551511661753600241410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "cursor" #define CURSOR_FAILED(cursor_) ((cursor_)->error.domain != 0) static bool _translate_query_opt(const char *query_field, const char **cmd_field, int *len); bool _mongoc_cursor_set_opt_int64(mongoc_cursor_t *cursor, const char *option, int64_t value) { bson_iter_t iter; if (bson_iter_init_find(&iter, &cursor->opts, option)) { if (!BSON_ITER_HOLDS_INT64(&iter)) { return false; } bson_iter_overwrite_int64(&iter, value); return true; } return BSON_APPEND_INT64(&cursor->opts, option, value); } static int64_t _mongoc_cursor_get_opt_int64(const mongoc_cursor_t *cursor, const char *option, int64_t default_value) { bson_iter_t iter; if (bson_iter_init_find(&iter, &cursor->opts, option)) { return bson_iter_as_int64(&iter); } return default_value; } static bool _mongoc_cursor_set_opt_bool(mongoc_cursor_t *cursor, const char *option, bool value) { bson_iter_t iter; if (bson_iter_init_find(&iter, &cursor->opts, option)) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { return false; } bson_iter_overwrite_bool(&iter, value); return true; } return BSON_APPEND_BOOL(&cursor->opts, option, value); } bool _mongoc_cursor_get_opt_bool(const mongoc_cursor_t *cursor, const char *option) { bson_iter_t iter; if (bson_iter_init_find(&iter, &cursor->opts, option)) { return bson_iter_as_bool(&iter); } return false; } int32_t _mongoc_n_return(mongoc_cursor_t *cursor) { int64_t limit; int64_t batch_size; int64_t n_return; /* calculate numberToReturn according to: * https://github.com/mongodb/specifications/blob/master/source/crud/crud.md#combining-limit-and-batch-size-for-the-wire-protocol */ limit = mongoc_cursor_get_limit(cursor); batch_size = mongoc_cursor_get_batch_size(cursor); if (limit < 0) { n_return = limit; } else if (limit == 0) { n_return = batch_size; } else if (batch_size == 0) { n_return = limit; } else if (limit < batch_size) { n_return = limit; } else { n_return = batch_size; } /* if a specified limit exists, account for documents already returned. */ if (limit > 0 && cursor->count) { int64_t remaining = limit - cursor->count; /* remaining can be 0 if we have retrieved "limit" documents, but still * have a cursor id: SERVER-21086. use nonzero batchSize to fetch final * empty batch and trigger server to close cursor. */ if (remaining <= 0) { return 1; } n_return = BSON_MIN(n_return, remaining); } /* check boundary conditions */ if (n_return < INT32_MIN) { return INT32_MIN; } else if (n_return > INT32_MAX) { return INT32_MAX; } else { return (int32_t)n_return; } } void _mongoc_set_cursor_ns(mongoc_cursor_t *cursor, const char *ns, uint32_t nslen) { const char *dot; bson_free(cursor->ns); cursor->ns = bson_strndup(ns, nslen); cursor->nslen = nslen; dot = strstr(cursor->ns, "."); if (dot) { cursor->dblen = (uint32_t)(dot - cursor->ns); } else { /* a database name with no collection name */ cursor->dblen = cursor->nslen; } } /* return first key beginning with $, or NULL. precondition: bson is valid. */ static const char * _first_dollar_field(const bson_t *bson) { bson_iter_t iter; const char *key; BSON_ASSERT(bson_iter_init(&iter, bson)); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (key[0] == '$') { return key; } } return NULL; } /* if src is non-NULL, it is validated and copied to dst. returns false and * sets the cursor error if validation fails. */ bool _mongoc_cursor_check_and_copy_to(mongoc_cursor_t *cursor, const char *err_prefix, const bson_t *src, bson_t *dst) { bson_error_t validate_err; bson_init(dst); if (src) { if (!bson_validate_with_error(src, BSON_VALIDATE_EMPTY_KEYS, &validate_err)) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Invalid %s: %s", err_prefix, validate_err.message); return false; } bson_destroy(dst); bson_copy_to(src, dst); } return true; } // Get "serverId" from opts. Sets *server_id to the serverId from "opts" or 0 if absent. // On error, fills out *error and return false. static bool _mongoc_get_server_id_from_opts(const bson_t *opts, uint32_t *server_id, bson_error_t *error) { bson_iter_t iter; ENTRY; BSON_ASSERT(server_id); *server_id = 0; if (!opts || !bson_iter_init_find(&iter, opts, "serverId")) { RETURN(true); } if (!BSON_ITER_HOLDS_INT(&iter)) { _mongoc_set_error( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "The serverId option must be an integer"); RETURN(false); } if (bson_iter_as_int64(&iter) <= 0) { _mongoc_set_error( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "The serverId option must be >= 1"); RETURN(false); } *server_id = (uint32_t)bson_iter_as_int64(&iter); RETURN(true); } mongoc_cursor_t * _mongoc_cursor_new_with_opts(mongoc_client_t *client, const char *db_and_collection, const bson_t *opts, const mongoc_read_prefs_t *user_prefs, const mongoc_read_prefs_t *default_prefs, const mongoc_read_concern_t *read_concern) { mongoc_cursor_t *cursor; uint32_t server_id; mongoc_read_concern_t *read_concern_local = NULL; bson_error_t validate_err; const char *dollar_field; bson_iter_t iter; ENTRY; BSON_ASSERT_PARAM(client); cursor = BSON_ALIGNED_ALLOC0(mongoc_cursor_t); cursor->client = client; cursor->state = UNPRIMED; cursor->client_generation = client->generation; cursor->is_aggr_with_write_stage = false; bson_init(&cursor->opts); bson_init(&cursor->error_doc); if (opts) { if (!bson_validate_with_error(opts, BSON_VALIDATE_EMPTY_KEYS, &validate_err)) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Invalid opts: %s", validate_err.message); GOTO(finish); } dollar_field = _first_dollar_field(opts); if (dollar_field) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot use $-modifiers in opts: \"%s\"", dollar_field); GOTO(finish); } if (bson_iter_init_find(&iter, opts, "sessionId")) { if (!_mongoc_client_session_from_iter(client, &iter, &cursor->client_session, &cursor->error)) { GOTO(finish); } cursor->explicit_session = true; } if (bson_iter_init_find(&iter, opts, "readConcern")) { read_concern_local = _mongoc_read_concern_new_from_iter(&iter, &cursor->error); if (!read_concern_local) { /* invalid read concern */ GOTO(finish); } read_concern = read_concern_local; } /* true if there's a valid serverId or no serverId, false on err */ if (!_mongoc_get_server_id_from_opts(opts, &server_id, &cursor->error)) { GOTO(finish); } if (server_id) { (void)mongoc_cursor_set_server_id(cursor, server_id); } // Selectively copy the options: bsonBuildAppend(cursor->opts, insert(*opts, not(key("serverId", "sessionId"), // Drop bypassDocumentValidation if it isn't true: allOf(key("bypassDocumentValidation"), isFalse)))); } if (_mongoc_client_session_in_txn(cursor->client_session)) { if (!IS_PREF_PRIMARY(user_prefs)) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Read preference in a transaction must be primary"); GOTO(finish); } cursor->read_prefs = mongoc_read_prefs_copy(cursor->client_session->txn.opts.read_prefs); if (bson_has_field(opts, "readConcern")) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot set read concern after starting transaction"); GOTO(finish); } } else if (user_prefs) { cursor->read_prefs = mongoc_read_prefs_copy(user_prefs); } else if (default_prefs) { cursor->read_prefs = mongoc_read_prefs_copy(default_prefs); } else { cursor->read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); } cursor->read_concern = read_concern ? mongoc_read_concern_copy(read_concern) : mongoc_read_concern_new(); if (db_and_collection) { _mongoc_set_cursor_ns(cursor, db_and_collection, (uint32_t)strlen(db_and_collection)); } if (_mongoc_cursor_get_opt_bool(cursor, MONGOC_CURSOR_EXHAUST)) { if (_mongoc_cursor_get_opt_int64(cursor, MONGOC_CURSOR_LIMIT, 0)) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot specify both 'exhaust' and 'limit'."); GOTO(finish); } } (void)_mongoc_read_prefs_validate(cursor->read_prefs, &cursor->error); finish: mongoc_read_concern_destroy(read_concern_local); mongoc_counter_cursors_active_inc(); RETURN(cursor); } static bool _translate_query_opt(const char *query_field, const char **cmd_field, int *len) { if (query_field[0] != '$') { *cmd_field = query_field; *len = -1; return true; } /* strip the leading '$' */ query_field++; if (!strcmp(MONGOC_CURSOR_ORDERBY, query_field)) { *cmd_field = MONGOC_CURSOR_SORT; *len = MONGOC_CURSOR_SORT_LEN; } else if (!strcmp(MONGOC_CURSOR_SHOW_DISK_LOC, query_field)) { /* <= MongoDb 3.0 */ *cmd_field = MONGOC_CURSOR_SHOW_RECORD_ID; *len = MONGOC_CURSOR_SHOW_RECORD_ID_LEN; } else if (!strcmp(MONGOC_CURSOR_HINT, query_field)) { *cmd_field = MONGOC_CURSOR_HINT; *len = MONGOC_CURSOR_HINT_LEN; } else if (!strcmp(MONGOC_CURSOR_COMMENT, query_field)) { *cmd_field = MONGOC_CURSOR_COMMENT; *len = MONGOC_CURSOR_COMMENT_LEN; } else if (!strcmp(MONGOC_CURSOR_MAX_SCAN, query_field)) { *cmd_field = MONGOC_CURSOR_MAX_SCAN; *len = MONGOC_CURSOR_MAX_SCAN_LEN; } else if (!strcmp(MONGOC_CURSOR_MAX_TIME_MS, query_field)) { *cmd_field = MONGOC_CURSOR_MAX_TIME_MS; *len = MONGOC_CURSOR_MAX_TIME_MS_LEN; } else if (!strcmp(MONGOC_CURSOR_MAX, query_field)) { *cmd_field = MONGOC_CURSOR_MAX; *len = MONGOC_CURSOR_MAX_LEN; } else if (!strcmp(MONGOC_CURSOR_MIN, query_field)) { *cmd_field = MONGOC_CURSOR_MIN; *len = MONGOC_CURSOR_MIN_LEN; } else if (!strcmp(MONGOC_CURSOR_RETURN_KEY, query_field)) { *cmd_field = MONGOC_CURSOR_RETURN_KEY; *len = MONGOC_CURSOR_RETURN_KEY_LEN; } else if (!strcmp(MONGOC_CURSOR_SNAPSHOT, query_field)) { *cmd_field = MONGOC_CURSOR_SNAPSHOT; *len = MONGOC_CURSOR_SNAPSHOT_LEN; } else { /* not a special command field, must be a query operator like $or */ return false; } return true; } /* set up a new opt bson from older ways of specifying options. * secondary_ok may be NULL. * error may be NULL. */ void _mongoc_cursor_flags_to_opts(mongoc_query_flags_t qflags, bson_t *opts, /* IN/OUT */ bool *secondary_ok /* OUT */) { ENTRY; BSON_ASSERT(opts); if (secondary_ok) { *secondary_ok = !!(qflags & MONGOC_QUERY_SECONDARY_OK); } if (qflags & MONGOC_QUERY_TAILABLE_CURSOR) { bson_append_bool(opts, MONGOC_CURSOR_TAILABLE, MONGOC_CURSOR_TAILABLE_LEN, true); } if (qflags & MONGOC_QUERY_OPLOG_REPLAY) { bson_append_bool(opts, MONGOC_CURSOR_OPLOG_REPLAY, MONGOC_CURSOR_OPLOG_REPLAY_LEN, true); } if (qflags & MONGOC_QUERY_NO_CURSOR_TIMEOUT) { bson_append_bool(opts, MONGOC_CURSOR_NO_CURSOR_TIMEOUT, MONGOC_CURSOR_NO_CURSOR_TIMEOUT_LEN, true); } if (qflags & MONGOC_QUERY_AWAIT_DATA) { bson_append_bool(opts, MONGOC_CURSOR_AWAIT_DATA, MONGOC_CURSOR_AWAIT_DATA_LEN, true); } if (qflags & MONGOC_QUERY_EXHAUST) { bson_append_bool(opts, MONGOC_CURSOR_EXHAUST, MONGOC_CURSOR_EXHAUST_LEN, true); } if (qflags & MONGOC_QUERY_PARTIAL) { bson_append_bool(opts, MONGOC_CURSOR_ALLOW_PARTIAL_RESULTS, MONGOC_CURSOR_ALLOW_PARTIAL_RESULTS_LEN, true); } } /* Checks if the passed query was wrapped in a $query, and if so, parses the * query modifiers: * https://www.mongodb.com/docs/manual/reference/operator/query-modifier/ * and translates them to find command options: * https://www.mongodb.com/docs/manual/reference/command/find/ * opts must be initialized, and may already have options set. * unwrapped must be uninitialized, and will be initialized at return. * Returns true if query was unwrapped. */ bool _mongoc_cursor_translate_dollar_query_opts(const bson_t *query, bson_t *opts, bson_t *unwrapped, bson_error_t *error) { bool has_filter = false; const char *key; bson_iter_t iter; const char *opt_key; int len; uint32_t data_len; const uint8_t *data; bson_error_t error_local = {0}; ENTRY; BSON_ASSERT(query); BSON_ASSERT(opts); /* If the query is explicitly specified wrapped in $query, unwrap it and * translate the options to new options. */ if (bson_has_field(query, "$query")) { /* like "{$query: {a: 1}, $orderby: {b: 1}, $otherModifier: true}" */ if (!bson_iter_init(&iter, query)) { _mongoc_set_error( &error_local, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid BSON in query document"); GOTO(done); } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (key[0] != '$') { _mongoc_set_error(&error_local, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot mix $query with non-dollar field '%s'", key); GOTO(done); } if (!strcmp(key, "$query")) { /* set "filter" to the incoming document's "$query" */ bson_iter_document(&iter, &data_len, &data); if (!bson_init_static(unwrapped, data, (size_t)data_len)) { _mongoc_set_error( &error_local, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid BSON in $query subdocument"); GOTO(done); } has_filter = true; } else if (_translate_query_opt(key, &opt_key, &len)) { /* "$orderby" becomes "sort", etc., "$unknown" -> "unknown" */ if (!bson_append_iter(opts, opt_key, len, &iter)) { _mongoc_set_error( &error_local, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error adding \"%s\" to query", opt_key); } } else { /* strip leading "$" */ if (!bson_append_iter(opts, key + 1, -1, &iter)) { _mongoc_set_error( &error_local, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Error adding \"%s\" to query", key); } } } } done: if (error) { memcpy(error, &error_local, sizeof(bson_error_t)); } if (!has_filter) { bson_init(unwrapped); } RETURN(has_filter); } void mongoc_cursor_destroy(mongoc_cursor_t *cursor) { char *db; ENTRY; if (!cursor) { EXIT; } if (cursor->impl.destroy) { cursor->impl.destroy(&cursor->impl); } /* Always close the socket for an exhaust cursor, even if the client was * reset with mongoc_client_reset. That prevents further use of that socket. */ if (cursor->in_exhaust) { cursor->client->in_exhaust = false; if (cursor->state != DONE) { /* The only way to stop an exhaust cursor is to kill the connection */ mongoc_cluster_disconnect_node(&cursor->client->cluster, cursor->server_id); } } else if (cursor->client_generation == cursor->client->generation) { if (cursor->cursor_id) { db = bson_strndup(cursor->ns, cursor->dblen); _mongoc_client_kill_cursor(cursor->client, cursor->server_id, cursor->cursor_id, db, cursor->ns + cursor->dblen + 1, cursor->client_session); bson_free(db); } } if (cursor->client_session && !cursor->explicit_session) { mongoc_client_session_destroy(cursor->client_session); } mongoc_read_prefs_destroy(cursor->read_prefs); mongoc_read_concern_destroy(cursor->read_concern); mongoc_write_concern_destroy(cursor->write_concern); bson_destroy(&cursor->opts); bson_destroy(&cursor->error_doc); bson_free(cursor->ns); bson_free(cursor); mongoc_counter_cursors_active_dec(); mongoc_counter_cursors_disposed_inc(); EXIT; } mongoc_server_stream_t * _mongoc_cursor_fetch_stream(mongoc_cursor_t *cursor, const mongoc_ss_log_context_t *log_context) { mongoc_server_stream_t *server_stream; bson_t reply; ENTRY; if (cursor->server_id) { /* We already did server selection once before. Reuse the prior * selection to create a new stream on the same server. */ server_stream = mongoc_cluster_stream_for_server(&cursor->client->cluster, cursor->server_id, true /* reconnect_ok */, cursor->client_session, &reply, &cursor->error); if (server_stream) { /* Also restore whether primary read preference was forced by server * selection */ server_stream->must_use_primary = cursor->must_use_primary; } } else { server_stream = cursor->is_aggr_with_write_stage ? mongoc_cluster_stream_for_aggr_with_write(&cursor->client->cluster, log_context, cursor->read_prefs, cursor->client_session, &reply, &cursor->error) : mongoc_cluster_stream_for_reads(&cursor->client->cluster, log_context, cursor->read_prefs, cursor->client_session, NULL, &reply, &cursor->error); if (server_stream) { /* Remember the selected server_id and whether primary read mode was * forced so that we can re-create an equivalent server_stream at a * later time */ cursor->server_id = server_stream->sd->id; cursor->must_use_primary = server_stream->must_use_primary; } } if (!server_stream) { bson_destroy(&cursor->error_doc); bson_copy_to(&reply, &cursor->error_doc); bson_destroy(&reply); } RETURN(server_stream); } #define ADD_FLAG(_flags, _value) \ do { \ if (!BSON_ITER_HOLDS_BOOL(&iter)) { \ _mongoc_set_error(&cursor->error, \ MONGOC_ERROR_COMMAND, \ MONGOC_ERROR_COMMAND_INVALID_ARG, \ "invalid option %s, should be type bool", \ key); \ return false; \ } \ if (bson_iter_as_bool(&iter)) { \ *_flags |= _value; \ } \ } while (false) bool _mongoc_cursor_secondary_ok(mongoc_cursor_t *cursor, mongoc_server_stream_t *stream) { return cursor->secondary_ok || (cursor->server_id != 0 && (stream->topology_type == MONGOC_TOPOLOGY_RS_WITH_PRIMARY || stream->topology_type == MONGOC_TOPOLOGY_RS_NO_PRIMARY) && stream->sd->type != MONGOC_SERVER_RS_PRIMARY); } bool _mongoc_cursor_run_command( mongoc_cursor_t *cursor, const bson_t *command, const bson_t *opts, bson_t *reply, bool retry_prohibited) { mongoc_server_stream_t *server_stream; bson_iter_t iter; mongoc_cmd_parts_t parts; bool is_primary; mongoc_read_prefs_t *prefs = NULL; char *db = NULL; mongoc_session_opt_t *session_opts; bool ret = false; bool is_retryable = true; ENTRY; const char *cmd_name = _mongoc_get_command_name(command); mongoc_cmd_parts_init(&parts, cursor->client, db, MONGOC_QUERY_NONE, command); parts.is_read_command = true; parts.read_prefs = cursor->read_prefs; parts.assembled.operation_id = cursor->operation_id; const mongoc_ss_log_context_t ss_log_context = { .operation = cmd_name, .has_operation_id = true, .operation_id = parts.assembled.operation_id}; server_stream = _mongoc_cursor_fetch_stream(cursor, &ss_log_context); if (!server_stream) { _mongoc_bson_init_if_set(reply); GOTO(done); } if (opts) { if (!bson_iter_init(&iter, opts)) { _mongoc_bson_init_if_set(reply); _mongoc_set_error( &cursor->error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid BSON in opts document"); GOTO(done); } if (!mongoc_cmd_parts_append_opts(&parts, &iter, &cursor->error)) { _mongoc_bson_init_if_set(reply); GOTO(done); } } if (parts.assembled.session) { /* initial query/aggregate/etc, and opts contains "sessionId" */ BSON_ASSERT(!cursor->client_session); BSON_ASSERT(!cursor->explicit_session); cursor->client_session = parts.assembled.session; cursor->explicit_session = true; } else if (cursor->client_session) { /* a getMore with implicit or explicit session already acquired */ mongoc_cmd_parts_set_session(&parts, cursor->client_session); } else { /* try to create an implicit session. not causally consistent. we keep * the session but leave cursor->explicit_session as 0, so we use the * same lsid for getMores but destroy the session when the cursor dies. */ session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(session_opts, false); /* returns NULL if sessions aren't supported. ignore errors. */ cursor->client_session = mongoc_client_start_session(cursor->client, session_opts, NULL); mongoc_cmd_parts_set_session(&parts, cursor->client_session); mongoc_session_opts_destroy(session_opts); } if (!mongoc_cmd_parts_set_read_concern(&parts, cursor->read_concern, &cursor->error)) { _mongoc_bson_init_if_set(reply); GOTO(done); } db = bson_strndup(cursor->ns, cursor->dblen); parts.assembled.db_name = db; if (_mongoc_cursor_get_opt_bool(cursor, MONGOC_CURSOR_EXHAUST)) { const bool sharded = _mongoc_topology_get_type(cursor->client->topology) == MONGOC_TOPOLOGY_SHARDED; const int32_t wire_version = server_stream->sd->max_wire_version; if (sharded && wire_version < WIRE_VERSION_MONGOS_EXHAUST) { /* Return error since mongos < 7.2 doesn't support exhaust cursors */ _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "exhaust cursors require mongos with wire version: " "%d, but mongos has wire version: %d.", wire_version, WIRE_VERSION_MONGOS_EXHAUST); _mongoc_bson_init_if_set(reply); GOTO(done); } parts.assembled.op_msg_is_exhaust = true; } /* we might use mongoc_cursor_set_hint to target a secondary but have no * read preference, so the secondary rejects the read. same if we have a * direct connection to a secondary (topology type "single"). */ is_primary = !cursor->read_prefs || cursor->read_prefs->mode == MONGOC_READ_PRIMARY; if (strcmp(cmd_name, "getMore") != 0 && is_primary && _mongoc_cursor_secondary_ok(cursor, server_stream)) { parts.read_prefs = prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED); } else { parts.read_prefs = cursor->read_prefs; } is_retryable = _is_retryable_read(&parts, server_stream); if (!strcmp(cmd_name, "getMore")) { is_retryable = false; } if (!strcmp(cmd_name, "aggregate")) { bson_iter_t pipeline_iter; if (bson_iter_init_find(&pipeline_iter, command, "pipeline") && BSON_ITER_HOLDS_ARRAY(&pipeline_iter) && bson_iter_recurse(&pipeline_iter, &pipeline_iter)) { if (_has_write_key(&pipeline_iter)) { is_retryable = false; } } } if (is_retryable && retry_prohibited) { is_retryable = false; } if (cursor->write_concern && !mongoc_write_concern_is_default(cursor->write_concern)) { parts.assembled.is_acknowledged = mongoc_write_concern_is_acknowledged(cursor->write_concern); mongoc_write_concern_append(cursor->write_concern, &parts.extra); } if (!mongoc_cmd_parts_assemble(&parts, server_stream, &cursor->error)) { _mongoc_bson_init_if_set(reply); GOTO(done); } retry: ret = mongoc_cluster_run_command_monitored(&cursor->client->cluster, &parts.assembled, reply, &cursor->error); if (ret) { memset(&cursor->error, 0, sizeof(bson_error_t)); } if (is_retryable && _mongoc_read_error_get_type(ret, &cursor->error, reply) == MONGOC_READ_ERR_RETRY) { is_retryable = false; { mongoc_deprioritized_servers_t *const ds = mongoc_deprioritized_servers_new(); mongoc_deprioritized_servers_add_if_sharded(ds, server_stream->topology_type, server_stream->sd); mongoc_server_stream_cleanup(server_stream); BSON_ASSERT(!cursor->is_aggr_with_write_stage && "Cannot attempt a retry on an aggregate operation that " "contains write stages"); server_stream = mongoc_cluster_stream_for_reads(&cursor->client->cluster, &ss_log_context, cursor->read_prefs, cursor->client_session, ds, reply, &cursor->error); mongoc_deprioritized_servers_destroy(ds); } if (server_stream) { cursor->server_id = server_stream->sd->id; parts.assembled.server_stream = server_stream; bson_destroy(reply); GOTO(retry); } } if (cursor->error.domain) { bson_destroy(&cursor->error_doc); bson_copy_to(reply, &cursor->error_doc); } /* Read and Write Concern Spec: "Drivers SHOULD parse server replies for a * "writeConcernError" field and report the error only in command-specific * helper methods that take a separate write concern parameter or an options * parameter that may contain a write concern option. * * Only command helpers with names like "_with_write_concern" can create * cursors with a non-NULL write_concern field. */ if (ret && cursor->write_concern) { ret = !_mongoc_parse_wc_err(reply, &cursor->error); } done: mongoc_server_stream_cleanup(server_stream); mongoc_cmd_parts_cleanup(&parts); mongoc_read_prefs_destroy(prefs); bson_free(db); return ret; } void _mongoc_cursor_collection(const mongoc_cursor_t *cursor, const char **collection, int *collection_len) { /* ns is like "db.collection". Collection name is located past the ".". */ *collection = cursor->ns + (cursor->dblen + 1); /* Collection name's length is ns length, minus length of db name and ".". */ *collection_len = cursor->nslen - cursor->dblen - 1; BSON_ASSERT(*collection_len > 0); } void _mongoc_cursor_prepare_find_command(mongoc_cursor_t *cursor, const bson_t *filter, bson_t *command) { const char *collection; int collection_len; _mongoc_cursor_collection(cursor, &collection, &collection_len); bson_append_utf8(command, MONGOC_CURSOR_FIND, MONGOC_CURSOR_FIND_LEN, collection, collection_len); bson_append_document(command, MONGOC_CURSOR_FILTER, MONGOC_CURSOR_FILTER_LEN, filter); } bool mongoc_cursor_error(mongoc_cursor_t *cursor, bson_error_t *error) { ENTRY; RETURN(mongoc_cursor_error_document(cursor, error, NULL)); } bool mongoc_cursor_error_document(mongoc_cursor_t *cursor, bson_error_t *error, const bson_t **doc) { ENTRY; BSON_ASSERT(cursor); if (BSON_UNLIKELY(CURSOR_FAILED(cursor))) { if (error) { *error = cursor->error; } if (doc) { *doc = &cursor->error_doc; } RETURN(true); } if (doc) { *doc = NULL; } RETURN(false); } static mongoc_cursor_state_t _call_transition(mongoc_cursor_t *cursor) { mongoc_cursor_state_t state = cursor->state; _mongoc_cursor_impl_transition_t fn = NULL; switch (state) { case UNPRIMED: fn = cursor->impl.prime; break; case IN_BATCH: fn = cursor->impl.pop_from_batch; break; case END_OF_BATCH: fn = cursor->impl.get_next_batch; break; case DONE: default: fn = NULL; break; } if (!fn) { return DONE; } state = fn(cursor); if (cursor->error.domain) { state = DONE; } return state; } bool mongoc_cursor_next(mongoc_cursor_t *cursor, const bson_t **bson) { bool ret = false; bool attempted_refresh = false; ENTRY; BSON_ASSERT(cursor); BSON_ASSERT(bson); TRACE("cursor_id(%" PRId64 ")", cursor->cursor_id); if (cursor->client_generation != cursor->client->generation) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance cursor after client reset"); RETURN(false); } if (bson) { *bson = NULL; } if (CURSOR_FAILED(cursor)) { RETURN(false); } if (cursor->state == DONE) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance a completed or failed cursor."); RETURN(false); } /* * We cannot proceed if another cursor is receiving results in exhaust mode. */ if (cursor->client->in_exhaust && !cursor->in_exhaust) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_IN_EXHAUST, "Another cursor derived from this client is in exhaust."); RETURN(false); } cursor->current = NULL; /* if an error was set on this cursor before calling next, transition to DONE * immediately. */ if (cursor->error.domain) { cursor->state = DONE; GOTO(done); } while (cursor->state != DONE) { /* even when there is no data to return, some cursors remain open and * continue sending empty batches (e.g. a tailable or change stream * cursor). in that case, do not attempt to get another batch. */ if (cursor->state == END_OF_BATCH) { if (attempted_refresh) { RETURN(false); } attempted_refresh = true; } cursor->state = _call_transition(cursor); /* check if we received a document. */ if (cursor->current) { *bson = cursor->current; ret = true; GOTO(done); } if (cursor->state == DONE) { GOTO(done); } } done: cursor->count++; RETURN(ret); } bool mongoc_cursor_more(mongoc_cursor_t *cursor) { ENTRY; BSON_ASSERT(cursor); if (CURSOR_FAILED(cursor)) { RETURN(false); } RETURN(cursor->state != DONE); } void mongoc_cursor_get_host(mongoc_cursor_t *cursor, mongoc_host_list_t *host) { mongoc_server_description_t const *description; mc_shared_tpld td; BSON_ASSERT(cursor); BSON_ASSERT(host); memset(host, 0, sizeof *host); if (!cursor->server_id) { MONGOC_WARNING("%s(): Must send query before fetching peer.", BSON_FUNC); return; } td = mc_tpld_take_ref(cursor->client->topology); description = mongoc_topology_description_server_by_id_const(td.ptr, cursor->server_id, &cursor->error); if (description) { *host = description->host; } mc_tpld_drop_ref(&td); EXIT; } mongoc_cursor_t * mongoc_cursor_clone(const mongoc_cursor_t *cursor) { mongoc_cursor_t *_clone; BSON_ASSERT(cursor); _clone = BSON_ALIGNED_ALLOC0(mongoc_cursor_t); _clone->client = cursor->client; _clone->nslen = cursor->nslen; _clone->dblen = cursor->dblen; _clone->explicit_session = cursor->explicit_session; if (cursor->read_prefs) { _clone->read_prefs = mongoc_read_prefs_copy(cursor->read_prefs); } if (cursor->read_concern) { _clone->read_concern = mongoc_read_concern_copy(cursor->read_concern); } if (cursor->write_concern) { _clone->write_concern = mongoc_write_concern_copy(cursor->write_concern); } if (cursor->explicit_session) { _clone->client_session = cursor->client_session; } bson_copy_to(&cursor->opts, &_clone->opts); bson_init(&_clone->error_doc); _clone->ns = bson_strdup(cursor->ns); /* copy the context functions by default. */ memcpy(&_clone->impl, &cursor->impl, sizeof(cursor->impl)); if (cursor->impl.clone) { cursor->impl.clone(&_clone->impl, &cursor->impl); } mongoc_counter_cursors_active_inc(); RETURN(_clone); } const bson_t * mongoc_cursor_current(const mongoc_cursor_t *cursor) /* IN */ { BSON_ASSERT(cursor); return cursor->current; } void mongoc_cursor_set_batch_size(mongoc_cursor_t *cursor, uint32_t batch_size) { BSON_ASSERT(cursor); bson_iter_t iter; if (!bson_iter_init_find(&iter, &cursor->opts, MONGOC_CURSOR_BATCH_SIZE)) { bson_append_int64(&cursor->opts, MONGOC_CURSOR_BATCH_SIZE, MONGOC_CURSOR_BATCH_SIZE_LEN, batch_size); } else if (BSON_ITER_HOLDS_INT64(&iter)) { bson_iter_overwrite_int64(&iter, (int64_t)batch_size); } else if (BSON_ITER_HOLDS_INT32(&iter)) { if (!mlib_in_range(int32_t, batch_size)) { MONGOC_WARNING("unable to overwrite stored int32 batchSize with " "out-of-range value %" PRIu32, batch_size); return; } bson_iter_overwrite_int32(&iter, (int32_t)batch_size); } else if (BSON_ITER_HOLDS_DOUBLE(&iter)) { bson_iter_overwrite_double(&iter, (double)batch_size); } else if (BSON_ITER_HOLDS_DECIMAL128(&iter)) { bson_decimal128_t val; val.high = 0x3040000000000000; val.low = (uint64_t)batch_size; bson_iter_overwrite_decimal128(&iter, &val); } else { MONGOC_WARNING("unable to overwrite non-numeric stored batchSize"); } } uint32_t mongoc_cursor_get_batch_size(const mongoc_cursor_t *cursor) { BSON_ASSERT(cursor); return (uint32_t)_mongoc_cursor_get_opt_int64(cursor, MONGOC_CURSOR_BATCH_SIZE, 0); } bool mongoc_cursor_set_limit(mongoc_cursor_t *cursor, int64_t limit) { BSON_ASSERT(cursor); if (cursor->state == UNPRIMED) { if (limit < 0) { return _mongoc_cursor_set_opt_int64(cursor, MONGOC_CURSOR_LIMIT, -limit) && _mongoc_cursor_set_opt_bool(cursor, MONGOC_CURSOR_SINGLE_BATCH, true); } else { return _mongoc_cursor_set_opt_int64(cursor, MONGOC_CURSOR_LIMIT, limit); } } else { return false; } } int64_t mongoc_cursor_get_limit(const mongoc_cursor_t *cursor) { int64_t limit; bool single_batch; BSON_ASSERT(cursor); limit = _mongoc_cursor_get_opt_int64(cursor, MONGOC_CURSOR_LIMIT, 0); single_batch = _mongoc_cursor_get_opt_bool(cursor, MONGOC_CURSOR_SINGLE_BATCH); if (limit > 0 && single_batch) { limit = -limit; } return limit; } bool mongoc_cursor_set_server_id(mongoc_cursor_t *cursor, uint32_t server_id) { BSON_ASSERT(cursor); if (cursor->server_id) { MONGOC_ERROR("mongoc_cursor_set_server_id: server_id already set"); return false; } if (!server_id) { MONGOC_ERROR("mongoc_cursor_set_server_id: cannot set server_id to 0"); return false; } cursor->server_id = server_id; return true; } uint32_t mongoc_cursor_get_server_id(const mongoc_cursor_t *cursor) { BSON_ASSERT(cursor); return cursor->server_id; } int64_t mongoc_cursor_get_id(const mongoc_cursor_t *cursor) { BSON_ASSERT(cursor); return cursor->cursor_id; } void mongoc_cursor_set_max_await_time_ms(mongoc_cursor_t *cursor, uint32_t max_await_time_ms) { BSON_ASSERT(cursor); if (cursor->state == UNPRIMED) { _mongoc_cursor_set_opt_int64(cursor, MONGOC_CURSOR_MAX_AWAIT_TIME_MS, (int64_t)max_await_time_ms); } } uint32_t mongoc_cursor_get_max_await_time_ms(const mongoc_cursor_t *cursor) { bson_iter_t iter; BSON_ASSERT(cursor); if (bson_iter_init_find(&iter, &cursor->opts, MONGOC_CURSOR_MAX_AWAIT_TIME_MS)) { return (uint32_t)bson_iter_as_int64(&iter); } return 0; } mongoc_cursor_t * mongoc_cursor_new_from_command_reply_with_opts(mongoc_client_t *client, bson_t *reply, const bson_t *opts) { mongoc_cursor_t *cursor; bson_t cmd = BSON_INITIALIZER; BSON_ASSERT_PARAM(client); BSON_ASSERT(reply); cursor = _mongoc_cursor_cmd_new_from_reply(client, &cmd, opts, reply); bson_destroy(&cmd); return cursor; } bool _mongoc_cursor_start_reading_response(mongoc_cursor_t *cursor, mongoc_cursor_response_t *response) { bson_iter_t iter; bson_iter_t child; const char *ns; uint32_t nslen; bool in_batch = false; if (bson_iter_init_find(&iter, &response->reply, "cursor") && BSON_ITER_HOLDS_DOCUMENT(&iter) && bson_iter_recurse(&iter, &child)) { while (bson_iter_next(&child)) { if (BSON_ITER_IS_KEY(&child, "id")) { cursor->cursor_id = bson_iter_as_int64(&child); } else if (BSON_ITER_IS_KEY(&child, "ns")) { ns = bson_iter_utf8(&child, &nslen); _mongoc_set_cursor_ns(cursor, ns, nslen); } else if (BSON_ITER_IS_KEY(&child, "firstBatch") || BSON_ITER_IS_KEY(&child, "nextBatch")) { if (BSON_ITER_HOLDS_ARRAY(&child) && bson_iter_recurse(&child, &response->batch_iter)) { in_batch = true; } } } } /* Driver Sessions Spec: "When an implicit session is associated with a * cursor for use with getMore operations, the session MUST be returned to * the pool immediately following a getMore operation that indicates that the * cursor has been exhausted." */ if (cursor->cursor_id == 0 && cursor->client_session && !cursor->explicit_session) { mongoc_client_session_destroy(cursor->client_session); cursor->client_session = NULL; } return in_batch; } void _mongoc_cursor_response_read(mongoc_cursor_t *cursor, mongoc_cursor_response_t *response, const bson_t **bson) { const uint8_t *data = NULL; uint32_t data_len = 0; ENTRY; BSON_UNUSED(cursor); if (bson_iter_next(&response->batch_iter) && BSON_ITER_HOLDS_DOCUMENT(&response->batch_iter)) { bson_iter_document(&response->batch_iter, &data_len, &data); /* bson_iter_next guarantees valid BSON, so this must succeed */ BSON_ASSERT(bson_init_static(&response->current_doc, data, data_len)); *bson = &response->current_doc; } } /* sets cursor error if could not get the next batch. */ void _mongoc_cursor_response_refresh(mongoc_cursor_t *cursor, const bson_t *command, const bson_t *opts, mongoc_cursor_response_t *response) { ENTRY; bson_destroy(&response->reply); /* server replies to find / aggregate with {cursor: {id: N, firstBatch: []}}, * to getMore command with {cursor: {id: N, nextBatch: []}}. */ if (_mongoc_cursor_run_command(cursor, command, opts, &response->reply, false)) { if (_mongoc_cursor_start_reading_response(cursor, response)) { cursor->in_exhaust = cursor->client->in_exhaust; return; } } if (!cursor->error.domain) { _mongoc_set_error(&cursor->error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Invalid reply to %s command.", _mongoc_get_command_name(command)); } } void _mongoc_cursor_prepare_getmore_command(mongoc_cursor_t *cursor, bson_t *command) { const char *collection; int collection_len; int64_t batch_size; bson_iter_t iter; bool await_data; int64_t max_await_time_ms; ENTRY; _mongoc_cursor_collection(cursor, &collection, &collection_len); bson_init(command); bson_append_int64(command, "getMore", 7, mongoc_cursor_get_id(cursor)); bson_append_utf8(command, "collection", 10, collection, collection_len); batch_size = mongoc_cursor_get_batch_size(cursor); /* See find, getMore, and killCursors Spec for batchSize rules */ if (batch_size) { bson_append_int64(command, MONGOC_CURSOR_BATCH_SIZE, MONGOC_CURSOR_BATCH_SIZE_LEN, abs(_mongoc_n_return(cursor))); } if (bson_iter_init_find(&iter, &cursor->opts, MONGOC_CURSOR_COMMENT) && bson_iter_value(&iter)->value_type != BSON_TYPE_EOD) { const bson_value_t *comment = bson_iter_value(&iter); mongoc_server_stream_t *server_stream; /* CRUD spec: If a comment is provided, drivers MUST attach this comment * to all subsequent getMore commands run on the same cursor for server * versions 4.4 and above. For server versions below 4.4 drivers MUST NOT * attach a comment to getMore commands. * * Since this function has no error reporting, we also no-op if we cannot * fetch a stream. */ const mongoc_ss_log_context_t ss_log_context = {.operation = "getMore"}; server_stream = _mongoc_cursor_fetch_stream(cursor, &ss_log_context); if (server_stream != NULL && server_stream->sd->max_wire_version >= WIRE_VERSION_4_4) { bson_append_value(command, MONGOC_CURSOR_COMMENT, MONGOC_CURSOR_COMMENT_LEN, comment); } mongoc_server_stream_cleanup(server_stream); } /* Find, getMore And killCursors Commands Spec: "In the case of a tailable cursor with awaitData == true the driver MUST provide a Cursor level option named maxAwaitTimeMS (See CRUD specification for details). The maxTimeMS option on the getMore command MUST be set to the value of the option maxAwaitTimeMS. If no maxAwaitTimeMS is specified, the driver SHOULD not set maxTimeMS on the getMore command." */ await_data = _mongoc_cursor_get_opt_bool(cursor, MONGOC_CURSOR_TAILABLE) && _mongoc_cursor_get_opt_bool(cursor, MONGOC_CURSOR_AWAIT_DATA); if (await_data) { max_await_time_ms = _mongoc_cursor_get_opt_int64(cursor, MONGOC_CURSOR_MAX_AWAIT_TIME_MS, 0); if (max_await_time_ms) { bson_append_int64(command, MONGOC_CURSOR_MAX_TIME_MS, MONGOC_CURSOR_MAX_TIME_MS_LEN, max_await_time_ms); } } } /* sets the cursor to be empty so it returns NULL on the first call to * cursor_next but does not return an error. */ void _mongoc_cursor_set_empty(mongoc_cursor_t *cursor) { memset(&cursor->error, 0, sizeof(bson_error_t)); bson_reinit(&cursor->error_doc); cursor->state = IN_BATCH; } void _mongoc_cursor_prime(mongoc_cursor_t *cursor) { cursor->state = cursor->impl.prime(cursor); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cursor.h000066400000000000000000000060561511661753600241450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CURSOR_H #define MONGOC_CURSOR_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_cursor_t mongoc_cursor_t; /* forward decl */ struct _mongoc_client_t; MONGOC_EXPORT(mongoc_cursor_t *) mongoc_cursor_clone(const mongoc_cursor_t *cursor) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_cursor_destroy(mongoc_cursor_t *cursor); MONGOC_EXPORT(bool) mongoc_cursor_more(mongoc_cursor_t *cursor); MONGOC_EXPORT(bool) mongoc_cursor_next(mongoc_cursor_t *cursor, const bson_t **bson); MONGOC_EXPORT(bool) mongoc_cursor_error(mongoc_cursor_t *cursor, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_cursor_error_document(mongoc_cursor_t *cursor, bson_error_t *error, const bson_t **doc); MONGOC_EXPORT(void) mongoc_cursor_get_host(mongoc_cursor_t *cursor, mongoc_host_list_t *host); MONGOC_EXPORT(const bson_t *) mongoc_cursor_current(const mongoc_cursor_t *cursor); MONGOC_EXPORT(void) mongoc_cursor_set_batch_size(mongoc_cursor_t *cursor, uint32_t batch_size); MONGOC_EXPORT(uint32_t) mongoc_cursor_get_batch_size(const mongoc_cursor_t *cursor); MONGOC_EXPORT(bool) mongoc_cursor_set_limit(mongoc_cursor_t *cursor, int64_t limit); MONGOC_EXPORT(int64_t) mongoc_cursor_get_limit(const mongoc_cursor_t *cursor); // `mongoc_cursor_set_hint` is deprecated for more aptly named `mongoc_cursor_set_server_id`. BSON_DEPRECATED_FOR(mongoc_cursor_set_server_id) MONGOC_EXPORT(bool) mongoc_cursor_set_hint(mongoc_cursor_t *cursor, uint32_t server_id); MONGOC_EXPORT(bool) mongoc_cursor_set_server_id(mongoc_cursor_t *cursor, uint32_t server_id); // `mongoc_cursor_get_hint` is deprecated for more aptly named `mongoc_cursor_get_server_id`. BSON_DEPRECATED_FOR(mongoc_cursor_get_server_id) MONGOC_EXPORT(uint32_t) mongoc_cursor_get_hint(const mongoc_cursor_t *cursor); MONGOC_EXPORT(uint32_t) mongoc_cursor_get_server_id(const mongoc_cursor_t *cursor); MONGOC_EXPORT(int64_t) mongoc_cursor_get_id(const mongoc_cursor_t *cursor); MONGOC_EXPORT(void) mongoc_cursor_set_max_await_time_ms(mongoc_cursor_t *cursor, uint32_t max_await_time_ms); MONGOC_EXPORT(uint32_t) mongoc_cursor_get_max_await_time_ms(const mongoc_cursor_t *cursor); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_cursor_new_from_command_reply_with_opts(struct _mongoc_client_t *client, bson_t *reply, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_CURSOR_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cyrus-private.h000066400000000000000000000036131511661753600254410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_CYRUS_PRIVATE_H #define MONGOC_CYRUS_PRIVATE_H #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_cyrus_t mongoc_cyrus_t; struct _mongoc_cyrus_t { mongoc_sasl_t credentials; sasl_callback_t callbacks[6]; sasl_conn_t *conn; bool done; int step; sasl_interact_t *interact; }; #ifndef SASL_CALLBACK_FN #define SASL_CALLBACK_FN(_f) ((int (*)(void))((void (*)(void))(_f))) #endif int _mongoc_cyrus_verifyfile_cb(void *context, const char *file, sasl_verify_type_t type); void _mongoc_cyrus_init(mongoc_cyrus_t *sasl); bool _mongoc_cyrus_new_from_cluster( mongoc_cyrus_t *sasl, mongoc_cluster_t *cluster, mongoc_stream_t *stream, const char *hostname, bson_error_t *error); int _mongoc_cyrus_log(mongoc_cyrus_t *sasl, int level, const char *message); void _mongoc_cyrus_destroy(mongoc_cyrus_t *sasl); bool _mongoc_cyrus_step(mongoc_cyrus_t *sasl, const uint8_t *inbuf, uint32_t inbuflen, uint8_t **outbuf, uint32_t *outbuflen, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_CYRUS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-cyrus.c000066400000000000000000000363051511661753600237700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SASL_CYRUS #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "CYRUS-SASL" // CDRIVER-2722: Cyrus SASL is deprecated on MacOS. #if defined(__APPLE__) BEGIN_IGNORE_DEPRECATIONS #endif // defined(__APPLE__) bool _mongoc_cyrus_set_mechanism(mongoc_cyrus_t *sasl, const char *mechanism, bson_error_t *error) { mcommon_string_append_t available_mechs_str; mcommon_string_new_as_append(&available_mechs_str); const char **mechs = sasl_global_listmech(); int i = 0; bool ok = false; BSON_ASSERT(sasl); for (i = 0; mechs[i]; i++) { if (!strcmp(mechs[i], mechanism)) { ok = true; break; } mcommon_string_append(&available_mechs_str, mechs[i]); if (mechs[i + 1]) { mcommon_string_append(&available_mechs_str, ","); } } if (ok) { bson_free(sasl->credentials.mechanism); sasl->credentials.mechanism = mechanism ? bson_strdup(mechanism) : NULL; } else { _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)SASL_NOMECH, "SASL Failure: Unsupported mechanism by client: %s. " "Available mechanisms: %s", mechanism, mcommon_str_from_append(&available_mechs_str)); } mcommon_string_from_append_destroy(&available_mechs_str); return ok; } static int _mongoc_cyrus_get_pass(mongoc_cyrus_t *sasl, int param_id, const char **result, unsigned *result_len) { BSON_ASSERT(sasl); BSON_ASSERT(param_id == SASL_CB_PASS); if (result) { *result = sasl->credentials.pass; } if (result_len) { *result_len = sasl->credentials.pass ? (unsigned)strlen(sasl->credentials.pass) : 0; } return (sasl->credentials.pass != NULL) ? SASL_OK : SASL_FAIL; } static int _mongoc_cyrus_canon_user(sasl_conn_t *conn, mongoc_cyrus_t *sasl, const char *in, unsigned inlen, unsigned flags, const char *user_realm, char *out, unsigned out_max, unsigned *out_len) { BSON_UNUSED(conn); BSON_UNUSED(sasl); BSON_UNUSED(flags); BSON_UNUSED(user_realm); // `inlen` is a string length (excluding trailing NULL). // Cyrus-SASL passes an `out` buffer of size `out_max + 1`. Assume `out_max` is the max to be safe. unsigned inlen_1 = 0; if (mlib_add(&inlen_1, inlen, 1) || inlen_1 + 1 >= out_max) { MONGOC_ERROR("SASL username too large"); return SASL_BUFOVER; } TRACE("Canonicalizing %s (%" PRIu32 ")\n", in, inlen); // Use memmove in case buffers overlap. From Cyrus-SASL: "output buffers and the input buffers may be the same" memmove(out, in, inlen); out[inlen] = '\0'; *out_len = inlen; return SASL_OK; } static int _mongoc_cyrus_get_user(mongoc_cyrus_t *sasl, int param_id, const char **result, unsigned *result_len) { BSON_ASSERT(sasl); BSON_ASSERT((param_id == SASL_CB_USER) || (param_id == SASL_CB_AUTHNAME)); if (result) { *result = sasl->credentials.user; } if (result_len) { *result_len = sasl->credentials.user ? (unsigned)strlen(sasl->credentials.user) : 0; } return (sasl->credentials.user != NULL) ? SASL_OK : SASL_FAIL; } void _mongoc_cyrus_init(mongoc_cyrus_t *sasl) { MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_BEGIN sasl_callback_t callbacks[] = {{SASL_CB_AUTHNAME, SASL_CALLBACK_FN(_mongoc_cyrus_get_user), sasl}, {SASL_CB_USER, SASL_CALLBACK_FN(_mongoc_cyrus_get_user), sasl}, {SASL_CB_PASS, SASL_CALLBACK_FN(_mongoc_cyrus_get_pass), sasl}, {SASL_CB_CANON_USER, SASL_CALLBACK_FN(_mongoc_cyrus_canon_user), sasl}, {SASL_CB_LIST_END}}; MC_DISABLE_CAST_FUNCTION_TYPE_STRICT_WARNING_END BSON_ASSERT(sasl); memset(sasl, 0, sizeof *sasl); memcpy(&sasl->callbacks, callbacks, sizeof callbacks); sasl->done = false; sasl->step = 0; sasl->conn = NULL; sasl->interact = NULL; sasl->credentials.mechanism = NULL; sasl->credentials.user = NULL; sasl->credentials.pass = NULL; sasl->credentials.service_name = NULL; sasl->credentials.service_host = NULL; } bool _mongoc_cyrus_new_from_cluster( mongoc_cyrus_t *sasl, mongoc_cluster_t *cluster, mongoc_stream_t *stream, const char *hostname, bson_error_t *error) { const char *mechanism; char real_name[BSON_HOST_NAME_MAX + 1]; _mongoc_cyrus_init(sasl); mechanism = mongoc_uri_get_auth_mechanism(cluster->uri); if (!mechanism) { mechanism = "GSSAPI"; } if (!_mongoc_cyrus_set_mechanism(sasl, mechanism, error)) { _mongoc_cyrus_destroy(sasl); return false; } _mongoc_sasl_set_pass((mongoc_sasl_t *)sasl, mongoc_uri_get_password(cluster->uri)); _mongoc_sasl_set_user((mongoc_sasl_t *)sasl, mongoc_uri_get_username(cluster->uri)); _mongoc_sasl_set_properties((mongoc_sasl_t *)sasl, cluster->uri); /* * If the URI requested canonicalizeHostname, we need to resolve the real * hostname for the IP Address and pass that to the SASL layer. Some * underlying GSSAPI layers will do this for us, but can be disabled in * their config (krb.conf). * * This allows the consumer to specify canonicalizeHostname=true in the URI * and have us do that for them. * * See CDRIVER-323 for more information. */ if (sasl->credentials.canonicalize_host_name && _mongoc_sasl_get_canonicalized_name(stream, real_name, sizeof real_name)) { _mongoc_sasl_set_service_host((mongoc_sasl_t *)sasl, real_name); } else { _mongoc_sasl_set_service_host((mongoc_sasl_t *)sasl, hostname); } return true; } void _mongoc_cyrus_destroy(mongoc_cyrus_t *sasl) { BSON_ASSERT(sasl); if (sasl->conn) { sasl_dispose(&sasl->conn); } bson_free(sasl->credentials.user); bson_free(sasl->credentials.pass); bson_free(sasl->credentials.mechanism); bson_free(sasl->credentials.service_name); bson_free(sasl->credentials.service_host); } static bool _mongoc_cyrus_is_failure(int status, bson_error_t *error) { bool ret = (status < 0); TRACE("Got status: %d ok is %d, continue=%d interact=%d\n", status, SASL_OK, SASL_CONTINUE, SASL_INTERACT); if (ret) { switch (status) { case SASL_NOMEM: _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)status, "SASL Failure: insufficient memory."); break; case SASL_NOMECH: { mcommon_string_append_t available_mechs_str; mcommon_string_new_as_append(&available_mechs_str); const char **mechs = sasl_global_listmech(); int i = 0; for (i = 0; mechs[i]; i++) { mcommon_string_append(&available_mechs_str, mechs[i]); if (mechs[i + 1]) { mcommon_string_append(&available_mechs_str, ","); } } _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)status, "SASL Failure: failure to negotiate mechanism (available mechanisms: %s)", mcommon_str_from_append(&available_mechs_str)); mcommon_string_from_append_destroy(&available_mechs_str); } break; case SASL_BADPARAM: _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)status, "Bad parameter supplied. Please file a bug " "with mongo-c-driver."); break; default: _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)status, "SASL Failure: (%d): %s", status, sasl_errstring(status, NULL, NULL)); break; } } return ret; } static bool _mongoc_cyrus_start(mongoc_cyrus_t *sasl, uint8_t **outbuf, uint32_t *outbuflen, bson_error_t *error) { const char *service_name = "mongodb"; const char *service_host = ""; const char *mechanism = NULL; const char *raw = NULL; unsigned raw_len = 0; int status; BSON_ASSERT(sasl); BSON_ASSERT(outbuf); BSON_ASSERT(outbuflen); if (sasl->credentials.service_name) { service_name = sasl->credentials.service_name; } if (sasl->credentials.service_host) { service_host = sasl->credentials.service_host; } status = sasl_client_new(service_name, service_host, NULL, NULL, sasl->callbacks, 0, &sasl->conn); TRACE("Created new sasl client %s", status == SASL_OK ? "successfully" : "UNSUCCESSFULLY"); if (_mongoc_cyrus_is_failure(status, error)) { return false; } status = sasl_client_start(sasl->conn, sasl->credentials.mechanism, &sasl->interact, &raw, &raw_len, &mechanism); TRACE("Started the sasl client %s", status == SASL_CONTINUE ? "successfully" : "UNSUCCESSFULLY"); if (_mongoc_cyrus_is_failure(status, error)) { return false; } if ((0 != strcasecmp(mechanism, "GSSAPI")) && (0 != strcasecmp(mechanism, "PLAIN"))) { _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)SASL_NOMECH, "SASL Failure: invalid mechanism \"%s\"", mechanism); return false; } *outbuflen = 0; const size_t outbuf_capacity = mcommon_b64_ntop_calculate_target_size(raw_len); *outbuf = bson_malloc(outbuf_capacity); const int b64_ret = mcommon_b64_ntop((uint8_t *)raw, raw_len, (char *)*outbuf, outbuf_capacity); if (b64_ret < 0) { _mongoc_set_error( error, MONGOC_ERROR_SASL, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Unable to base64 encode client SASL message"); return false; } else { BSON_ASSERT(mlib_in_range(uint32_t, b64_ret)); *outbuflen = (uint32_t)b64_ret; } return true; } bool _mongoc_cyrus_step(mongoc_cyrus_t *sasl, const uint8_t *inbuf, uint32_t inbuflen, uint8_t **outbuf, uint32_t *outbuflen, bson_error_t *error) { const char *raw = NULL; unsigned rawlen = 0; int status; BSON_ASSERT(sasl); if (sasl->step > 1) { BSON_ASSERT(inbuf); } BSON_ASSERT(outbuf); BSON_ASSERT(outbuflen); TRACE("Running %d, inbuflen: %" PRIu32, sasl->step, inbuflen); sasl->step++; if (sasl->step == 1) { return _mongoc_cyrus_start(sasl, outbuf, outbuflen, error); } else if (sasl->step >= 10) { _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY_SASL, MONGOC_ERROR_SASL, (uint32_t)SASL_NOTDONE, "SASL Failure: maximum steps detected"); return false; } TRACE("Running %d, inbuflen: %" PRIu32, sasl->step, inbuflen); if (!inbuflen) { _mongoc_set_error(error, MONGOC_ERROR_SASL, MONGOC_ERROR_CLIENT_AUTHENTICATE, "SASL Failure: no payload provided from server: %s", sasl_errdetail(sasl->conn)); return false; } unsigned int decoded_len = 0; const size_t decoded_capacity = mcommon_b64_pton_calculate_target_size(inbuflen); char *const decoded = bson_malloc(decoded_capacity); { const int b64_ret = mcommon_b64_pton((char *)inbuf, (uint8_t *)decoded, decoded_capacity); if (b64_ret < 0) { _mongoc_set_error( error, MONGOC_ERROR_SASL, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Unable to base64 decode client SASL message"); bson_free(decoded); bson_free(*outbuf); *outbuf = NULL; return false; } else { /* Set the output length to the number of bytes actually decoded to * excluding the NULL. */ decoded_len = (unsigned int)b64_ret; } } TRACE("%s", "Running client_step"); status = sasl_client_step(sasl->conn, decoded, decoded_len, &sasl->interact, &raw, &rawlen); TRACE("%s sent a client step", status == SASL_OK ? "Successfully" : "UNSUCCESSFULLY"); if (_mongoc_cyrus_is_failure(status, error)) { bson_free(decoded); return false; } *outbuflen = 0; const size_t outbuf_capacity = mcommon_b64_ntop_calculate_target_size(rawlen); *outbuf = bson_malloc0(outbuf_capacity); { const int b64_ret = mcommon_b64_ntop((const uint8_t *)raw, rawlen, (char *)*outbuf, outbuf_capacity); if (b64_ret < 0) { _mongoc_set_error_with_category(error, MONGOC_ERROR_CATEGORY, MONGOC_ERROR_SASL, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Unable to base64 encode client SASL message"); bson_free(decoded); bson_free(*outbuf); *outbuf = NULL; return false; } else { /* Set the output length to the number of characters written excluding * the NULL. */ BSON_ASSERT(mlib_in_range(uint32_t, b64_ret)); *outbuflen = (uint32_t)b64_ret; } } bson_free(decoded); return true; } // CDRIVER-2722: Cyrus SASL is deprecated on MacOS. #if defined(__APPLE__) END_IGNORE_DEPRECATIONS #endif // defined(__APPLE__) #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-database-private.h000066400000000000000000000077471511661753600260540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_DATABASE_PRIVATE_H #define MONGOC_DATABASE_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include BSON_BEGIN_DECLS struct _mongoc_database_t { mongoc_client_t *client; char *name; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; }; mongoc_database_t * _mongoc_database_new(mongoc_client_t *client, const char *name, const mongoc_read_prefs_t *read_prefs, const mongoc_read_concern_t *read_concern, const mongoc_write_concern_t *write_concern); /* _mongoc_get_encryptedFields_from_map checks the collection has an * encryptedFields set on the client encryptedFieldsMap. * encryptedFields is always initialized on return. */ bool _mongoc_get_encryptedFields_from_map( mongoc_client_t *client, const char *dbName, const char *collName, bson_t *encryptedFields, bson_error_t *error); /* _mongoc_get_encryptedFields_from_map checks the collection has an * encryptedFields by running listCollections. * encryptedFields is always initialized on return. */ bool _mongoc_get_encryptedFields_from_server( mongoc_client_t *client, const char *dbName, const char *collName, bson_t *encryptedFields, bson_error_t *error); /** * @brief Look up the encryptedFields to use for the given collection. * * If the collection options contains an encryptedFields, those are returned. * If the client has an encryptedFieldsMap entry for the collection within the * given database, those are returned. If neither, an empty document is * returned. * * @param client The client with which to search an encryptedFieldsMap * @param dbName The name of the database where the collection will/does live * @param collName The name of the collection * @param opts (Optional) The collection options, which may contain the * fields * @param checkEncryptedFieldsMap If false, the encryptedFieldsMap will not be * checked. * @param[out] encryptedFields An output where a view of the encryptedFields * will be written * @param[out] error An error output * @retval true If there was no error * @retval false Otherwise * * @note Upon returning `true`, check whether `*encryptedFields` is empty to * determine whether fields have been found. */ bool _mongoc_get_collection_encryptedFields(mongoc_client_t *client, const char *dbName, const char *collName, const bson_t *opts, bool checkEncryptedFieldsMap, bson_t *encryptedFields, bson_error_t *error); /* _mongoc_get_encryptedField_state_collection returns the state collection * name. Returns NULL on error. */ char * _mongoc_get_encryptedField_state_collection(const bson_t *encryptedFields, const char *data_collection, const char *state_collection_suffix, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_DATABASE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-database.c000066400000000000000000001143771511661753600243750ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "database" /* *-------------------------------------------------------------------------- * * _mongoc_database_new -- * * Create a new instance of mongoc_database_t for @client. * * @client must stay valid for the life of the resulting * database structure. * * Returns: * A newly allocated mongoc_database_t that should be freed with * mongoc_database_destroy(). * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_database_t * _mongoc_database_new(mongoc_client_t *client, const char *name, const mongoc_read_prefs_t *read_prefs, const mongoc_read_concern_t *read_concern, const mongoc_write_concern_t *write_concern) { mongoc_database_t *db; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(name); db = (mongoc_database_t *)bson_malloc0(sizeof *db); db->client = client; db->write_concern = write_concern ? mongoc_write_concern_copy(write_concern) : mongoc_write_concern_new(); db->read_concern = read_concern ? mongoc_read_concern_copy(read_concern) : mongoc_read_concern_new(); db->read_prefs = read_prefs ? mongoc_read_prefs_copy(read_prefs) : mongoc_read_prefs_new(MONGOC_READ_PRIMARY); db->name = bson_strdup(name); RETURN(db); } /* *-------------------------------------------------------------------------- * * mongoc_database_destroy -- * * Releases resources associated with @database. * * Returns: * None. * * Side effects: * Everything. * *-------------------------------------------------------------------------- */ void mongoc_database_destroy(mongoc_database_t *database) { ENTRY; if (!database) { EXIT; } if (database->read_prefs) { mongoc_read_prefs_destroy(database->read_prefs); database->read_prefs = NULL; } if (database->read_concern) { mongoc_read_concern_destroy(database->read_concern); database->read_concern = NULL; } if (database->write_concern) { mongoc_write_concern_destroy(database->write_concern); database->write_concern = NULL; } bson_free(database->name); bson_free(database); EXIT; } mongoc_cursor_t * mongoc_database_aggregate(mongoc_database_t *db, /* IN */ const bson_t *pipeline, /* IN */ const bson_t *opts, /* IN */ const mongoc_read_prefs_t *read_prefs) /* IN */ { return _mongoc_aggregate(db->client, db->name, MONGOC_QUERY_NONE, pipeline, opts, read_prefs, db->read_prefs, db->read_concern, db->write_concern); } /* *-------------------------------------------------------------------------- * * mongoc_database_copy -- * * Returns a copy of @database that needs to be freed by calling * mongoc_database_destroy. * * Returns: * A copy of this database. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_database_t * mongoc_database_copy(mongoc_database_t *database) { ENTRY; BSON_ASSERT_PARAM(database); RETURN(_mongoc_database_new( database->client, database->name, database->read_prefs, database->read_concern, database->write_concern)); } bool mongoc_database_command_simple(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error) { BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(command); /* Server Selection Spec: "The generic command method has a default read * preference of mode 'primary'. The generic command method MUST ignore any * default read preference from client, database or collection * configuration. The generic command method SHOULD allow an optional read * preference argument." */ return _mongoc_client_command_with_opts(database->client, database->name, command, MONGOC_CMD_RAW, NULL /* opts */, MONGOC_QUERY_NONE, read_prefs, NULL, /* user prefs */ NULL /* read concern */, NULL /* write concern */, reply, error); } bool mongoc_database_read_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(database->client, database->name, command, MONGOC_CMD_READ, opts, MONGOC_QUERY_NONE, read_prefs, database->read_prefs, database->read_concern, database->write_concern, reply, error); } bool mongoc_database_write_command_with_opts( mongoc_database_t *database, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(database->client, database->name, command, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ database->read_prefs, database->read_concern, database->write_concern, reply, error); } bool mongoc_database_read_write_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(database->client, database->name, command, MONGOC_CMD_RW, opts, MONGOC_QUERY_NONE, read_prefs, database->read_prefs, database->read_concern, database->write_concern, reply, error); } bool mongoc_database_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error) { return _mongoc_client_command_with_opts(database->client, database->name, command, MONGOC_CMD_RAW, opts, MONGOC_QUERY_NONE, read_prefs, NULL, /* default prefs */ database->read_concern, database->write_concern, reply, error); } /* *-------------------------------------------------------------------------- * * mongoc_database_drop -- * * Requests that the MongoDB server drops @database, including all * collections and indexes associated with @database. * * Make sure this is really what you want! * * Returns: * true if @database was dropped. * * Side effects: * @error may be set. * *-------------------------------------------------------------------------- */ bool mongoc_database_drop(mongoc_database_t *database, bson_error_t *error) { return mongoc_database_drop_with_opts(database, NULL, error); } bool mongoc_database_drop_with_opts(mongoc_database_t *database, const bson_t *opts, bson_error_t *error) { bool ret; bson_t cmd; BSON_ASSERT_PARAM(database); bson_init(&cmd); bson_append_int32(&cmd, "dropDatabase", 12, 1); ret = _mongoc_client_command_with_opts(database->client, database->name, &cmd, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ database->read_prefs, database->read_concern, database->write_concern, NULL, /* reply */ error); bson_destroy(&cmd); return ret; } bool mongoc_database_remove_user(mongoc_database_t *database, const char *username, bson_error_t *error) { bson_t cmd; bool ret; ENTRY; BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(username); bson_init(&cmd); BSON_APPEND_UTF8(&cmd, "dropUser", username); ret = mongoc_database_command_simple(database, &cmd, NULL, NULL, error); bson_destroy(&cmd); RETURN(ret); } bool mongoc_database_remove_all_users(mongoc_database_t *database, bson_error_t *error) { bson_t cmd; bool ret; ENTRY; BSON_ASSERT_PARAM(database); bson_init(&cmd); BSON_APPEND_INT32(&cmd, "dropAllUsersFromDatabase", 1); ret = mongoc_database_command_simple(database, &cmd, NULL, NULL, error); bson_destroy(&cmd); RETURN(ret); } /** * mongoc_database_add_user: * @database: A #mongoc_database_t. * @username: A string containing the username. * @password: (allow-none): A string containing password, or NULL. * @roles: (allow-none): An optional bson_t of roles. * @custom_data: (allow-none): An optional bson_t of data to store. * @error: (out) (allow-none): A location for a bson_error_t or %NULL. * * Creates a new user with access to @database. * * Returns: None. * Side effects: None. */ bool mongoc_database_add_user(mongoc_database_t *database, const char *username, const char *password, const bson_t *roles, const bson_t *custom_data, bson_error_t *error) { bson_t cmd; bson_array_builder_t *ar; bool ret = false; ENTRY; BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(username); bson_init(&cmd); BSON_APPEND_UTF8(&cmd, "createUser", username); BSON_APPEND_UTF8(&cmd, "pwd", password); if (custom_data) { BSON_APPEND_DOCUMENT(&cmd, "customData", custom_data); } if (roles) { BSON_APPEND_ARRAY(&cmd, "roles", roles); } else { bson_append_array_builder_begin(&cmd, "roles", 5, &ar); bson_append_array_builder_end(&cmd, ar); } ret = mongoc_database_command_simple(database, &cmd, NULL, NULL, error); bson_destroy(&cmd); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_database_get_read_prefs -- * * Fetch the read preferences for @database. * * Returns: * A mongoc_read_prefs_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_prefs_t * mongoc_database_get_read_prefs(const mongoc_database_t *database) /* IN */ { BSON_ASSERT_PARAM(database); return database->read_prefs; } /* *-------------------------------------------------------------------------- * * mongoc_database_set_read_prefs -- * * Sets the default read preferences for @database. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_database_set_read_prefs(mongoc_database_t *database, const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT_PARAM(database); if (database->read_prefs) { mongoc_read_prefs_destroy(database->read_prefs); database->read_prefs = NULL; } if (read_prefs) { database->read_prefs = mongoc_read_prefs_copy(read_prefs); } } /* *-------------------------------------------------------------------------- * * mongoc_database_get_read_concern -- * * Fetches the read concern for @database. * * Returns: * A mongoc_read_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_read_concern_t * mongoc_database_get_read_concern(const mongoc_database_t *database) { BSON_ASSERT_PARAM(database); return database->read_concern; } /* *-------------------------------------------------------------------------- * * mongoc_database_set_read_concern -- * * Set the default read concern for @database. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_database_set_read_concern(mongoc_database_t *database, const mongoc_read_concern_t *read_concern) { BSON_ASSERT_PARAM(database); if (database->read_concern) { mongoc_read_concern_destroy(database->read_concern); database->read_concern = NULL; } if (read_concern) { database->read_concern = mongoc_read_concern_copy(read_concern); } } /* *-------------------------------------------------------------------------- * * mongoc_database_get_write_concern -- * * Fetches the write concern for @database. * * Returns: * A mongoc_write_concern_t that should not be modified or freed. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_write_concern_t * mongoc_database_get_write_concern(const mongoc_database_t *database) { BSON_ASSERT_PARAM(database); return database->write_concern; } /* *-------------------------------------------------------------------------- * * mongoc_database_set_write_concern -- * * Set the default write concern for @database. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_database_set_write_concern(mongoc_database_t *database, const mongoc_write_concern_t *write_concern) { BSON_ASSERT_PARAM(database); if (database->write_concern) { mongoc_write_concern_destroy(database->write_concern); database->write_concern = NULL; } if (write_concern) { database->write_concern = mongoc_write_concern_copy(write_concern); } } /** * mongoc_database_has_collection: * @database: (in): A #mongoc_database_t. * @name: (in): The name of the collection to check for. * @error: (out) (allow-none): A location for a #bson_error_t, or %NULL. * * Checks to see if a collection exists within the database on the MongoDB * server. * * This will return %false if their was an error communicating with the * server, or if the collection does not exist. * * If @error is provided, it will first be zeroed. Upon error, error.domain * will be set. * * Returns: %true if @name exists, otherwise %false. @error may be set. */ bool mongoc_database_has_collection(mongoc_database_t *database, const char *name, bson_error_t *error) { bson_iter_t col_iter; bool ret = false; const char *cur_name; bson_t opts = BSON_INITIALIZER; bson_t filter; mongoc_cursor_t *cursor; const bson_t *doc; ENTRY; BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(name); if (error) { memset(error, 0, sizeof *error); } BSON_APPEND_DOCUMENT_BEGIN(&opts, "filter", &filter); BSON_APPEND_UTF8(&filter, "name", name); bson_append_document_end(&opts, &filter); cursor = mongoc_database_find_collections_with_opts(database, &opts); while (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init(&col_iter, doc) && bson_iter_find(&col_iter, "name") && BSON_ITER_HOLDS_UTF8(&col_iter) && (cur_name = bson_iter_utf8(&col_iter, NULL))) { if (!strcmp(cur_name, name)) { ret = true; GOTO(cleanup); } } } (void)mongoc_cursor_error(cursor, error); cleanup: mongoc_cursor_destroy(cursor); bson_destroy(&opts); RETURN(ret); } mongoc_cursor_t * mongoc_database_find_collections_with_opts(mongoc_database_t *database, const bson_t *opts) { mongoc_cursor_t *cursor; bson_t cmd = BSON_INITIALIZER; BSON_ASSERT_PARAM(database); BSON_APPEND_INT32(&cmd, "listCollections", 1); /* Enumerate Collections Spec: "run listCollections on the primary node in * replicaset mode" */ cursor = _mongoc_cursor_cmd_new(database->client, database->name, &cmd, opts, NULL, NULL, NULL); if (cursor->error.domain == 0) { _mongoc_cursor_prime(cursor); } bson_destroy(&cmd); return cursor; } char ** mongoc_database_get_collection_names_with_opts(mongoc_database_t *database, const bson_t *opts, bson_error_t *error) { bson_t opts_copy; bson_iter_t col; const char *name; char *namecopy; mongoc_array_t strv_buf; mongoc_cursor_t *cursor; const bson_t *doc; char **ret; BSON_ASSERT_PARAM(database); if (opts) { bson_copy_to(opts, &opts_copy); } else { bson_init(&opts_copy); } /* nameOnly option is faster in MongoDB 4+, ignored by older versions, * see Enumerating Collections Spec */ if (!bson_has_field(&opts_copy, "nameOnly")) { bson_append_bool(&opts_copy, "nameOnly", 8, true); } cursor = mongoc_database_find_collections_with_opts(database, &opts_copy); _mongoc_array_init(&strv_buf, sizeof(char *)); while (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init(&col, doc) && bson_iter_find(&col, "name") && BSON_ITER_HOLDS_UTF8(&col) && (name = bson_iter_utf8(&col, NULL))) { namecopy = bson_strdup(name); _mongoc_array_append_val(&strv_buf, namecopy); } } /* append a null pointer for the last value. also handles the case * of no values. */ namecopy = NULL; _mongoc_array_append_val(&strv_buf, namecopy); if (mongoc_cursor_error(cursor, error)) { _mongoc_array_destroy(&strv_buf); ret = NULL; } else { ret = (char **)strv_buf.data; } mongoc_cursor_destroy(cursor); bson_destroy(&opts_copy); return ret; } static mongoc_collection_t * create_collection(mongoc_database_t *database, const char *name, const bson_t *opts, bson_error_t *error) { mongoc_collection_t *collection = NULL; bson_iter_t iter; bson_t cmd; bool capped = false; BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(name); if (strchr(name, '$')) { _mongoc_set_error( error, MONGOC_ERROR_NAMESPACE, MONGOC_ERROR_NAMESPACE_INVALID, "The namespace \"%s\" is invalid.", name); return NULL; } if (opts) { if (bson_iter_init_find(&iter, opts, "capped")) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The argument \"capped\" must be a boolean."); return NULL; } capped = bson_iter_bool(&iter); } if (bson_iter_init_find(&iter, opts, "size")) { if (!BSON_ITER_HOLDS_INT(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The argument \"size\" must be an integer."); return NULL; } if (!capped) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"size\" parameter requires {\"capped\": true}"); return NULL; } } if (bson_iter_init_find(&iter, opts, "max")) { if (!BSON_ITER_HOLDS_INT(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The argument \"max\" must be an integer."); return NULL; } if (!capped) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"max\" parameter requires {\"capped\": true}"); return NULL; } } if (bson_iter_init_find(&iter, opts, "storageEngine")) { if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"storageEngine\" parameter must be a document"); return NULL; } if (bson_iter_find(&iter, "wiredTiger")) { if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"wiredTiger\" option must take a document " "argument with a \"configString\" field"); return NULL; } if (bson_iter_find(&iter, "configString")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"configString\" parameter must be a string"); return NULL; } } else { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The \"wiredTiger\" option must take a document " "argument with a \"configString\" field"); return NULL; } } } } bson_init(&cmd); BSON_APPEND_UTF8(&cmd, "create", name); if (_mongoc_client_command_with_opts(database->client, database->name, &cmd, MONGOC_CMD_WRITE, opts, MONGOC_QUERY_NONE, NULL, /* user prefs */ database->read_prefs, database->read_concern, database->write_concern, NULL, /* reply */ error)) { collection = _mongoc_collection_new( database->client, database->name, name, database->read_prefs, database->read_concern, database->write_concern); } bson_destroy(&cmd); return collection; } char * _mongoc_get_encryptedField_state_collection(const bson_t *encryptedFields, const char *data_collection, const char *state_collection_suffix, bson_error_t *error) { bson_iter_t iter; const char *fieldName = NULL; if (0 == strcmp(state_collection_suffix, "esc")) { fieldName = "escCollection"; } else if (0 == strcmp(state_collection_suffix, "ecoc")) { fieldName = "ecocCollection"; } else { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected state_collection_suffix to be 'esc' or " "'ecoc', got: %s", state_collection_suffix); return NULL; } if (bson_iter_init_find(&iter, encryptedFields, fieldName)) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected encryptedFields.%s to be UTF-8", fieldName); return NULL; } return bson_strdup(bson_iter_utf8(&iter, NULL)); } return bson_strdup_printf("enxcol_.%s.%s", data_collection, state_collection_suffix); } static bool create_encField_state_collection(mongoc_database_t *database, const bson_t *encryptedFields, const char *data_collection, const char *state_collection_suffix, bson_error_t *error) { char *state_collection = NULL; mongoc_collection_t *collection = NULL; bool ok = false; bson_t opts = BSON_INITIALIZER; state_collection = _mongoc_get_encryptedField_state_collection(encryptedFields, data_collection, state_collection_suffix, error); if (!state_collection) { goto fail; } BCON_APPEND(&opts, "clusteredIndex", "{", "key", "{", "_id", BCON_INT32(1), "}", "unique", BCON_BOOL(true), "}"); collection = create_collection(database, state_collection, &opts, error); if (collection == NULL) { goto fail; } ok = true; fail: bson_free(state_collection); mongoc_collection_destroy(collection); bson_destroy(&opts); return ok; } static mongoc_collection_t * create_collection_with_encryptedFields(mongoc_database_t *database, const char *name, const bson_t *opts, const bson_t *encryptedFields, bson_error_t *error) { mongoc_collection_t *dataCollection = NULL; bool ok = false; bson_t *cc_opts = NULL; // Check the wire version to ensure server is 7.0.0 or newer. { const mongoc_ss_log_context_t ss_log_context = {.operation = "createCollection"}; mongoc_server_stream_t *stream = mongoc_cluster_stream_for_writes(&database->client->cluster, &ss_log_context, NULL /* client session */, NULL /* deprioritized servers */, NULL /* reply */, error); if (!stream) { goto fail; } if (stream->sd->max_wire_version < WIRE_VERSION_7_0) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Driver support of Queryable Encryption is incompatible " "with server. Upgrade server to use Queryable Encryption. " "Got maxWireVersion %" PRId32 " but need maxWireVersion >= %d", stream->sd->max_wire_version, WIRE_VERSION_7_0); mongoc_server_stream_cleanup(stream); goto fail; } mongoc_server_stream_cleanup(stream); } bool state_collections_ok = create_encField_state_collection(database, encryptedFields, name, "esc", error) && create_encField_state_collection(database, encryptedFields, name, "ecoc", error); if (!state_collections_ok) { // Failed to create one or more state collections goto fail; } /* Create data collection. */ cc_opts = bson_copy(opts); if (!BSON_APPEND_DOCUMENT(cc_opts, "encryptedFields", encryptedFields)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to append encryptedFields"); goto fail; } dataCollection = create_collection(database, name, cc_opts, error); if (!dataCollection) { goto fail; } /* Create index on __safeContent__. */ { bson_t *keys = BCON_NEW("__safeContent__", BCON_INT32(1)); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL /* opts */); ok = mongoc_collection_create_indexes_with_opts(dataCollection, &im, 1, NULL /* opts */, NULL /* reply */, error); mongoc_index_model_destroy(im); bson_destroy(keys); if (!ok) { goto fail; } } ok = true; fail: bson_destroy(cc_opts); if (ok) { return dataCollection; } else { mongoc_collection_destroy(dataCollection); return NULL; } } bool _mongoc_get_encryptedFields_from_map( mongoc_client_t *client, const char *dbName, const char *collName, bson_t *encryptedFields, bson_error_t *error) { BSON_ASSERT_PARAM(client); const bson_t *efMap = client->topology->encrypted_fields_map; bson_init(encryptedFields); if (bson_empty0(efMap)) { /* Unset or empty efMap will have no encrypted fields */ return true; } char *ns = bson_strdup_printf("%s.%s", dbName, collName); bson_iter_t iter; if (!bson_iter_init_find(&iter, efMap, ns)) { /* No efMap entry for this database+collection. */ bson_free(ns); return true; } bson_free(ns); if (!_mongoc_iter_document_as_bson(&iter, encryptedFields, error)) { /* The efMap entry should always be a document. */ return false; } return true; } bool _mongoc_get_encryptedFields_from_server( mongoc_client_t *client, const char *dbName, const char *collName, bson_t *encryptedFields, bson_error_t *error) { BSON_ASSERT_PARAM(client); mongoc_database_t *db = mongoc_client_get_database(client, dbName); bson_t *opts = BCON_NEW("filter", "{", "name", BCON_UTF8(collName), "}"); mongoc_cursor_t *cursor; bool ret = false; const bson_t *collInfo; bson_init(encryptedFields); cursor = mongoc_database_find_collections_with_opts(db, opts); if (mongoc_cursor_error(cursor, error)) { goto fail; } if (mongoc_cursor_next(cursor, &collInfo)) { /* Check if the collInfo has options.encryptedFields. */ bson_iter_t iter; if (!bson_iter_init(&iter, collInfo)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to iterate listCollections result"); goto fail; } if (bson_iter_find_descendant(&iter, "options.encryptedFields", &iter)) { bson_t tmp; if (!_mongoc_iter_document_as_bson(&iter, &tmp, error)) { goto fail; } bson_copy_to(&tmp, encryptedFields); } } if (mongoc_cursor_error(cursor, error)) { goto fail; } ret = true; fail: mongoc_cursor_destroy(cursor); bson_destroy(opts); mongoc_database_destroy(db); return ret; } bool _mongoc_get_collection_encryptedFields(mongoc_client_t *client, const char *dbName, const char *collName, const bson_t *opts, bool checkEncryptedFieldsMap, bson_t *encryptedFields, bson_error_t *error) { BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(dbName); BSON_ASSERT_PARAM(collName); BSON_OPTIONAL_PARAM(opts); BSON_ASSERT_PARAM(encryptedFields); BSON_OPTIONAL_PARAM(error); bson_init(encryptedFields); // Initially empty if (opts) { // We have collection options, which may have encryptedFields in it bool found = false; bsonParse(*opts, find(key("encryptedFields"), if (not(type(doc)), then(error("'encryptedFields' should be a document"))), // Update encryptedFields to be a reference to the subdocument: storeDocRef(*encryptedFields), do(found = true))); if (bsonParseError) { // Error while parsing _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid createCollection command options: %s", bsonParseError); return false; } else if (found) { // Found it! return true; } else { // Nothing found in the options } } // Look in the encryptedFieldsMap based on this collection name if (checkEncryptedFieldsMap && !_mongoc_get_encryptedFields_from_map(client, dbName, collName, encryptedFields, error)) { // Error during lookup. return false; } // No error. We may or may not have found encryptedFields. The caller // determines this by checking if encryptedFields is empty. return true; } mongoc_collection_t * mongoc_database_create_collection(mongoc_database_t *database, const char *name, const bson_t *opts, bson_error_t *error) { BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(name); BSON_OPTIONAL_PARAM(opts); BSON_OPTIONAL_PARAM(error); bson_t encryptedFields = BSON_INITIALIZER; if (!_mongoc_get_collection_encryptedFields(database->client, mongoc_database_get_name(database), name, opts, true /* checkEncryptedFieldsMap */, &encryptedFields, error)) { // Error during fields lookup bson_destroy(&encryptedFields); return NULL; } if (!bson_empty(&encryptedFields)) { // Clone 'opts' without the encryptedFields element bsonBuildDecl(opts_without_encryptedFields, if (opts, then(insert(*opts, not(key("encryptedFields")))))); mongoc_collection_t *ret = create_collection_with_encryptedFields(database, name, &opts_without_encryptedFields, &encryptedFields, error); bson_destroy(&encryptedFields); bson_destroy(&opts_without_encryptedFields); return ret; } bson_destroy(&encryptedFields); return create_collection(database, name, opts, error); } mongoc_collection_t * mongoc_database_get_collection(mongoc_database_t *database, const char *collection) { BSON_ASSERT_PARAM(database); BSON_ASSERT_PARAM(collection); return _mongoc_collection_new(database->client, database->name, collection, database->read_prefs, database->read_concern, database->write_concern); } const char * mongoc_database_get_name(mongoc_database_t *database) { BSON_ASSERT_PARAM(database); return database->name; } mongoc_change_stream_t * mongoc_database_watch(const mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts) { return _mongoc_change_stream_new_from_database(db, pipeline, opts); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-database.h000066400000000000000000000134611511661753600243720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_DATABASE_H #define MONGOC_DATABASE_H #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_database_t mongoc_database_t; MONGOC_EXPORT(const char *) mongoc_database_get_name(mongoc_database_t *database); MONGOC_EXPORT(bool) mongoc_database_remove_user(mongoc_database_t *database, const char *username, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_remove_all_users(mongoc_database_t *database, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_add_user(mongoc_database_t *database, const char *username, const char *password, const bson_t *roles, const bson_t *custom_data, bson_error_t *error); MONGOC_EXPORT(void) mongoc_database_destroy(mongoc_database_t *database); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_database_aggregate(mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts, const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_database_t *) mongoc_database_copy(mongoc_database_t *database) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_database_read_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_write_command_with_opts( mongoc_database_t *database, const bson_t *command, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_read_write_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs /* IGNORED */, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_command_with_opts(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, const bson_t *opts, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_command_simple(mongoc_database_t *database, const bson_t *command, const mongoc_read_prefs_t *read_prefs, bson_t *reply, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_drop(mongoc_database_t *database, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_drop_with_opts(mongoc_database_t *database, const bson_t *opts, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_database_has_collection(mongoc_database_t *database, const char *name, bson_error_t *error); MONGOC_EXPORT(mongoc_collection_t *) mongoc_database_create_collection(mongoc_database_t *database, const char *name, const bson_t *options, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(const mongoc_read_prefs_t *) mongoc_database_get_read_prefs(const mongoc_database_t *database); MONGOC_EXPORT(void) mongoc_database_set_read_prefs(mongoc_database_t *database, const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_database_get_write_concern(const mongoc_database_t *database); MONGOC_EXPORT(void) mongoc_database_set_write_concern(mongoc_database_t *database, const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(const mongoc_read_concern_t *) mongoc_database_get_read_concern(const mongoc_database_t *database); MONGOC_EXPORT(void) mongoc_database_set_read_concern(mongoc_database_t *database, const mongoc_read_concern_t *read_concern); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_database_find_collections_with_opts(mongoc_database_t *database, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(char **) mongoc_database_get_collection_names_with_opts(mongoc_database_t *database, const bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_collection_t *) mongoc_database_get_collection(mongoc_database_t *database, const char *name) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_change_stream_t *) mongoc_database_watch(const mongoc_database_t *db, const bson_t *pipeline, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_DATABASE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-deprioritized-servers-private.h000066400000000000000000000025521511661753600306410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_DEPRIORITIZED_SERVERS_PRIVATE_H #define MONGOC_DEPRIORITIZED_SERVERS_PRIVATE_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_deprioritized_servers_t mongoc_deprioritized_servers_t; mongoc_deprioritized_servers_t * mongoc_deprioritized_servers_new(void); void mongoc_deprioritized_servers_destroy(mongoc_deprioritized_servers_t *ds); void mongoc_deprioritized_servers_add(mongoc_deprioritized_servers_t *ds, const mongoc_server_description_t *sd); bool mongoc_deprioritized_servers_contains(const mongoc_deprioritized_servers_t *ds, const mongoc_server_description_t *sd); BSON_END_DECLS #endif // MONGOC_DEPRIORITIZED_SERVERS_PRIVATE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-deprioritized-servers.c000066400000000000000000000026211511661753600271610ustar00rootroot00000000000000#include #include // Dedicated non-zero value to avoid confusing "key is present with a NULL item" // from "key is not present" (also NULL). #define MONGOC_DEPRIORITIZED_SERVERS_ITEM_VALUE ((void *)1) struct _mongoc_deprioritized_servers_t { // Use server ID (uint32_t) as keys to identify deprioritized servers. mongoc_set_t *ids; }; mongoc_deprioritized_servers_t * mongoc_deprioritized_servers_new(void) { mongoc_deprioritized_servers_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_deprioritized_servers_t){ .ids = mongoc_set_new(1u, NULL, NULL), }; return ret; } void mongoc_deprioritized_servers_destroy(mongoc_deprioritized_servers_t *ds) { if (!ds) { return; } mongoc_set_destroy(ds->ids); bson_free(ds); } void mongoc_deprioritized_servers_add(mongoc_deprioritized_servers_t *ds, const mongoc_server_description_t *sd) { BSON_ASSERT_PARAM(ds); BSON_ASSERT_PARAM(sd); mongoc_set_add(ds->ids, mongoc_server_description_id(sd), MONGOC_DEPRIORITIZED_SERVERS_ITEM_VALUE); } bool mongoc_deprioritized_servers_contains(const mongoc_deprioritized_servers_t *ds, const mongoc_server_description_t *sd) { BSON_ASSERT_PARAM(ds); BSON_ASSERT_PARAM(sd); return mongoc_set_get_const(ds->ids, mongoc_server_description_id(sd)) == MONGOC_DEPRIORITIZED_SERVERS_ITEM_VALUE; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-errno-private.h000066400000000000000000000024461511661753600254240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_ERRNO_PRIVATE_H #define MONGOC_ERRNO_PRIVATE_H #include #include // IWYU pragma: export #ifdef _WIN32 #include #include #endif BSON_BEGIN_DECLS #if defined(_WIN32) #define MONGOC_ERRNO_IS_AGAIN(errno) ((errno == EAGAIN) || (errno == WSAEWOULDBLOCK) || (errno == WSAEINPROGRESS)) #define MONGOC_ERRNO_IS_TIMEDOUT(errno) (errno == WSAETIMEDOUT) #else #define MONGOC_ERRNO_IS_AGAIN(errno) \ ((errno == EINTR) || (errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS)) #define MONGOC_ERRNO_IS_TIMEDOUT(errno) (errno == ETIMEDOUT) #endif BSON_END_DECLS #endif /* MONGOC_ERRNO_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-error-private.h000066400000000000000000000110051511661753600254170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_ERROR_PRIVATE_H #define MONGOC_ERROR_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS typedef enum { MONGOC_READ_ERR_NONE, MONGOC_READ_ERR_OTHER, MONGOC_READ_ERR_RETRY } mongoc_read_err_type_t; /* Server error codes libmongoc cares about. Compare with: * https://github.com/mongodb/mongo/blob/master/src/mongo/base/error_codes.yml */ typedef enum { MONGOC_SERVER_ERR_HOSTUNREACHABLE = 6, MONGOC_SERVER_ERR_HOSTNOTFOUND = 7, MONGOC_SERVER_ERR_CURSOR_NOT_FOUND = 43, MONGOC_SERVER_ERR_STALESHARDVERSION = 63, MONGOC_SERVER_ERR_NETWORKTIMEOUT = 89, MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS = 91, MONGOC_SERVER_ERR_FAILEDTOSATISFYREADPREFERENCE = 133, MONGOC_SERVER_ERR_READCONCERNMAJORITYNOTAVAILABLEYET = 134, MONGOC_SERVER_ERR_STALEEPOCH = 150, MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN = 189, MONGOC_SERVER_ERR_ELECTIONINPROGRESS = 216, MONGOC_SERVER_ERR_RETRYCHANGESTREAM = 234, MONGOC_SERVER_ERR_EXCEEDEDTIMELIMIT = 262, MONGOC_SERVER_ERR_SOCKETEXCEPTION = 9001, MONGOC_SERVER_ERR_NOTPRIMARY = 10107, MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN = 11600, MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE = 11602, MONGOC_SERVER_ERR_STALECONFIG = 13388, MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK = 13435, MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY = 13436, MONGOC_SERVER_ERR_LEGACYNOTPRIMARY = 10058, MONGOC_SERVER_ERR_NS_NOT_FOUND = 26, MONGOC_SERVER_ERR_AUTHENTICATION = 18, MONGOC_SERVER_ERR_REAUTHENTICATION_REQUIRED = 391, } mongoc_server_err_t; mongoc_read_err_type_t _mongoc_read_error_get_type(bool cmd_ret, const bson_error_t *cmd_err, const bson_t *reply); void _mongoc_error_copy_labels_and_upsert(const bson_t *src, bson_t *dst, char *label); void _mongoc_write_error_append_retryable_label(bson_t *reply); void _mongoc_write_error_handle_labels(bool cmd_ret, const bson_error_t *cmd_err, bson_t *reply, const mongoc_server_description_t *sd); bool _mongoc_error_is_shutdown(bson_error_t *error); bool _mongoc_error_is_recovering(bson_error_t *error); bool _mongoc_error_is_not_primary(bson_error_t *error); bool _mongoc_error_is_state_change(bson_error_t *error); bool _mongoc_error_is_network(const bson_error_t *error); bool _mongoc_error_is_server(const bson_error_t *error); bool _mongoc_error_is_auth(const bson_error_t *error); bool _mongoc_error_is_reauth(const bson_error_t *error, int error_api_version); /* Try to append `s` to `error`. Truncates `s` if `error` is out of space. */ void _mongoc_error_append(bson_error_t *error, const char *s); typedef enum { MONGOC_ERROR_CONTENT_FLAG_CODE = (1 << 0), MONGOC_ERROR_CONTENT_FLAG_DOMAIN = (1 << 1), MONGOC_ERROR_CONTENT_FLAG_MESSAGE = (1 << 2), } mongoc_error_content_flags_t; bool mongoc_error_append_contents_to_bson(const bson_error_t *error, bson_t *bson, mongoc_error_content_flags_t flags); void _mongoc_set_error(bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...) BSON_GNUC_PRINTF(4, 5); void _mongoc_set_error_with_category( bson_error_t *error, uint8_t category, uint32_t domain, uint32_t code, const char *format, ...) BSON_GNUC_PRINTF(5, 6); #define MONGOC_ERROR_CATEGORY_BSON 1 // BSON_ERROR_CATEGORY #define MONGOC_ERROR_CATEGORY 2 #define MONGOC_ERROR_CATEGORY_SERVER 3 #define MONGOC_ERROR_CATEGORY_CRYPT 4 #define MONGOC_ERROR_CATEGORY_SASL 5 static BSON_INLINE void _mongoc_set_error_category(bson_error_t *error, uint8_t category) { BSON_ASSERT_PARAM(error); error->reserved = category; } #ifdef _WIN32 // Call `mongoc_winerr_to_string` on a Windows error code (e.g. a return from GetLastError()). char * mongoc_winerr_to_string(DWORD err_code); #endif BSON_END_DECLS #endif /* MONGOC_ERROR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-error.c000066400000000000000000000306171511661753600237540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include bool mongoc_error_has_label(const bson_t *reply, const char *label) { bson_iter_t iter; bson_iter_t error_labels; BSON_ASSERT(reply); BSON_ASSERT(label); if (bson_iter_init_find(&iter, reply, "errorLabels") && bson_iter_recurse(&iter, &error_labels)) { while (bson_iter_next(&error_labels)) { if (BSON_ITER_HOLDS_UTF8(&error_labels) && !strcmp(bson_iter_utf8(&error_labels, NULL), label)) { return true; } } } return false; } bool _mongoc_error_is_server(const bson_error_t *error) { if (!error) { return false; } return error->domain == MONGOC_ERROR_SERVER || error->domain == MONGOC_ERROR_WRITE_CONCERN; } static bool _mongoc_write_error_is_retryable(bson_error_t *error) { if (!_mongoc_error_is_server(error)) { return false; } switch (error->code) { case MONGOC_SERVER_ERR_HOSTUNREACHABLE: case MONGOC_SERVER_ERR_HOSTNOTFOUND: case MONGOC_SERVER_ERR_NETWORKTIMEOUT: case MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS: case MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN: case MONGOC_SERVER_ERR_EXCEEDEDTIMELIMIT: case MONGOC_SERVER_ERR_SOCKETEXCEPTION: case MONGOC_SERVER_ERR_NOTPRIMARY: case MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN: case MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE: case MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK: case MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY: return true; default: return false; } } void _mongoc_write_error_append_retryable_label(bson_t *reply) { bson_t reply_local = BSON_INITIALIZER; if (!reply) { bson_destroy(&reply_local); return; } bson_copy_to_excluding_noinit(reply, &reply_local, "errorLabels", NULL); _mongoc_error_copy_labels_and_upsert(reply, &reply_local, RETRYABLE_WRITE_ERROR); bson_destroy(reply); bson_steal(reply, &reply_local); } void _mongoc_write_error_handle_labels(bool cmd_ret, const bson_error_t *cmd_err, bson_t *reply, const mongoc_server_description_t *sd) { bson_error_t error; /* check for a client error. */ if (!cmd_ret && _mongoc_error_is_network(cmd_err)) { /* Retryable writes spec: When the driver encounters a network error * communicating with any server version that supports retryable * writes, it MUST add a RetryableWriteError label to that error. */ _mongoc_write_error_append_retryable_label(reply); return; } if (sd->max_wire_version >= WIRE_VERSION_RETRYABLE_WRITE_ERROR_LABEL) { return; } /* Check for a server error. Do not consult writeConcernError for pre-4.4 * mongos. */ if (sd->type == MONGOC_SERVER_MONGOS) { if (_mongoc_cmd_check_ok(reply, MONGOC_ERROR_API_VERSION_2, &error)) { return; } } else { if (_mongoc_cmd_check_ok_no_wce(reply, MONGOC_ERROR_API_VERSION_2, &error)) { return; } } if (_mongoc_write_error_is_retryable(&error)) { _mongoc_write_error_append_retryable_label(reply); } } /*-------------------------------------------------------------------------- * * _mongoc_read_error_get_type -- * * Checks if the error or reply from a read command is considered * retryable according to the retryable reads spec. Checks both * for a client error (a network exception) and a server error in * the reply. @cmd_ret and @cmd_err come from the result of a * read_command function. * * * Return: * A mongoc_read_error_type_t indicating the type of error (if any). * *-------------------------------------------------------------------------- */ mongoc_read_err_type_t _mongoc_read_error_get_type(bool cmd_ret, const bson_error_t *cmd_err, const bson_t *reply) { bson_error_t error; /* check for a client error. */ if (!cmd_ret && cmd_err && _mongoc_error_is_network(cmd_err)) { /* Retryable reads spec: "considered retryable if [...] any network * exception (e.g. socket timeout or error) */ return MONGOC_READ_ERR_RETRY; } /* check for a server error. */ if (_mongoc_cmd_check_ok_no_wce(reply, MONGOC_ERROR_API_VERSION_2, &error)) { return MONGOC_READ_ERR_NONE; } switch (error.code) { case MONGOC_SERVER_ERR_EXCEEDEDTIMELIMIT: case MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN: case MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE: case MONGOC_SERVER_ERR_NOTPRIMARY: case MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK: case MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY: case MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN: case MONGOC_SERVER_ERR_READCONCERNMAJORITYNOTAVAILABLEYET: case MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS: case MONGOC_SERVER_ERR_HOSTNOTFOUND: case MONGOC_SERVER_ERR_HOSTUNREACHABLE: case MONGOC_SERVER_ERR_NETWORKTIMEOUT: case MONGOC_SERVER_ERR_SOCKETEXCEPTION: return MONGOC_READ_ERR_RETRY; default: if (strstr(error.message, "not master") || strstr(error.message, "node is recovering")) { return MONGOC_READ_ERR_RETRY; } return MONGOC_READ_ERR_OTHER; } } void _mongoc_error_copy_labels_and_upsert(const bson_t *src, bson_t *dst, char *label) { bson_iter_t iter; bson_iter_t src_label; bson_array_builder_t *dst_labels; BSON_APPEND_ARRAY_BUILDER_BEGIN(dst, "errorLabels", &dst_labels); bson_array_builder_append_utf8(dst_labels, label, -1); /* append any other errorLabels already in "src" */ if (bson_iter_init_find(&iter, src, "errorLabels") && bson_iter_recurse(&iter, &src_label)) { while (bson_iter_next(&src_label) && BSON_ITER_HOLDS_UTF8(&src_label)) { if (strcmp(bson_iter_utf8(&src_label, NULL), label) != 0) { bson_array_builder_append_utf8(dst_labels, bson_iter_utf8(&src_label, NULL), -1); } } } bson_append_array_builder_end(dst, dst_labels); } /* Defined in SDAM spec under "Application Errors". * @error should have been obtained from a command reply, e.g. with * _mongoc_cmd_check_ok. */ bool _mongoc_error_is_shutdown(bson_error_t *error) { if (!_mongoc_error_is_server(error)) { return false; } switch (error->code) { case 11600: /* InterruptedAtShutdown */ case 91: /* ShutdownInProgress */ return true; default: return false; } } bool _mongoc_error_is_not_primary(bson_error_t *error) { if (!_mongoc_error_is_server(error)) { return false; } if (_mongoc_error_is_recovering(error)) { return false; } switch (error->code) { case MONGOC_SERVER_ERR_NOTPRIMARY: case MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK: case MONGOC_SERVER_ERR_LEGACYNOTPRIMARY: return true; /* All errors where no code was found are marked as * MONGOC_ERROR_QUERY_FAILURE */ case MONGOC_ERROR_QUERY_FAILURE: return NULL != strstr(error->message, "not master"); default: return false; } } bool _mongoc_error_is_recovering(bson_error_t *error) { if (!_mongoc_error_is_server(error)) { return false; } switch (error->code) { case MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN: case MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE: case MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY: case MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN: case MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS: return true; /* All errors where no code was found are marked as * MONGOC_ERROR_QUERY_FAILURE */ case MONGOC_ERROR_QUERY_FAILURE: return NULL != strstr(error->message, "not master or secondary") || NULL != strstr(error->message, "node is recovering"); default: return false; } } /* Assumes @error was parsed as an API V2 error. */ bool _mongoc_error_is_state_change(bson_error_t *error) { return _mongoc_error_is_recovering(error) || _mongoc_error_is_not_primary(error); } bool _mongoc_error_is_network(const bson_error_t *error) { if (!error) { return false; } if (error->domain == MONGOC_ERROR_STREAM) { return true; } if (error->domain == MONGOC_ERROR_PROTOCOL && error->code == MONGOC_ERROR_PROTOCOL_INVALID_REPLY) { return true; } return false; } bool _mongoc_error_is_auth(const bson_error_t *error) { if (!error) { return false; } return error->domain == MONGOC_ERROR_CLIENT && error->code == MONGOC_ERROR_CLIENT_AUTHENTICATE; } bool _mongoc_error_is_reauth(const bson_error_t *error, int error_api_version) { if (!error) { return false; } uint32_t expected_domain = error_api_version == MONGOC_ERROR_API_VERSION_2 ? MONGOC_ERROR_SERVER : MONGOC_ERROR_QUERY; return error->domain == expected_domain && error->code == MONGOC_SERVER_ERR_REAUTHENTICATION_REQUIRED; } void _mongoc_error_append(bson_error_t *error, const char *s) { BSON_ASSERT(error); const size_t error_len = strlen(error->message); const size_t remaining = sizeof(error->message) - error_len; bson_strncpy(error->message + error_len, s, remaining); } bool mongoc_error_append_contents_to_bson(const bson_error_t *error, bson_t *bson, mongoc_error_content_flags_t flags) { BSON_ASSERT_PARAM(error); BSON_ASSERT_PARAM(bson); if ((flags & MONGOC_ERROR_CONTENT_FLAG_CODE) && !BSON_APPEND_INT32(bson, "code", error->code)) { return false; } if ((flags & MONGOC_ERROR_CONTENT_FLAG_DOMAIN) && !BSON_APPEND_INT32(bson, "domain", error->domain)) { return false; } if ((flags & MONGOC_ERROR_CONTENT_FLAG_MESSAGE) && !BSON_APPEND_UTF8(bson, "message", error->message)) { return false; } return true; } void _mongoc_set_error(bson_error_t *error, uint32_t domain, uint32_t code, const char *format, ...) { if (error) { error->domain = domain; error->code = code; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); va_list args; va_start(args, format); // Format into a temporary buf before copying into the error, as the existing // error message may be an input to our formatting string char buffer[sizeof(error->message)] = {0}; bson_vsnprintf(buffer, sizeof error->message, format, args); memcpy(&error->message, buffer, sizeof buffer); va_end(args); } } void _mongoc_set_error_with_category( bson_error_t *error, uint8_t category, uint32_t domain, uint32_t code, const char *format, ...) { if (error) { error->domain = domain; error->code = code; _mongoc_set_error_category(error, category); va_list args; va_start(args, format); char buffer[sizeof(error->message)] = {0}; bson_vsnprintf(buffer, sizeof error->message, format, args); memcpy(&error->message, buffer, sizeof buffer); va_end(args); } } #ifdef _WIN32 char * mongoc_winerr_to_string(DWORD err_code) { LPSTR msg = NULL; if (0 == FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msg, 0, NULL)) { LocalFree(msg); return bson_strdup_printf("(0x%.8lX) (Failed to get error message)", err_code); } // Remove trailing newline. size_t msglen = strlen(msg); if (msglen >= 1 && msg[msglen - 1] == '\n') { if (msglen >= 2 && msg[msglen - 2] == '\r') { // Remove trailing \r\n. msg[msglen - 2] = '\0'; } else { // Just remove trailing \n. msg[msglen - 1] = '\0'; } } char *ret = bson_strdup_printf("(0x%.8lX) %s", err_code, msg); LocalFree(msg); return ret; } #endif // _WIN32 mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-error.h000066400000000000000000000100121511661753600237440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_ERRORS_H #define MONGOC_ERRORS_H #include #include #define MONGOC_ERROR_API_VERSION_LEGACY 1 #define MONGOC_ERROR_API_VERSION_2 2 BSON_BEGIN_DECLS typedef enum { MONGOC_ERROR_CLIENT = 1, MONGOC_ERROR_STREAM, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_CURSOR, MONGOC_ERROR_QUERY, MONGOC_ERROR_INSERT, MONGOC_ERROR_SASL, MONGOC_ERROR_BSON, MONGOC_ERROR_MATCHER, MONGOC_ERROR_NAMESPACE, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COLLECTION, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_WRITE_CONCERN, MONGOC_ERROR_SERVER, /* Error API Version 2 only */ MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, /* An error coming from libmongocrypt */ MONGOC_ERROR_POOL, MONGOC_ERROR_AZURE, MONGOC_ERROR_GCP } mongoc_error_domain_t; typedef enum { MONGOC_ERROR_STREAM_INVALID_TYPE = 1, MONGOC_ERROR_STREAM_INVALID_STATE, MONGOC_ERROR_STREAM_NAME_RESOLUTION, MONGOC_ERROR_STREAM_SOCKET, MONGOC_ERROR_STREAM_CONNECT, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, MONGOC_ERROR_CLIENT_NOT_READY, MONGOC_ERROR_CLIENT_TOO_BIG, MONGOC_ERROR_CLIENT_TOO_SMALL, MONGOC_ERROR_CLIENT_GETNONCE, MONGOC_ERROR_CLIENT_AUTHENTICATE, MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER, MONGOC_ERROR_CLIENT_IN_EXHAUST, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, MONGOC_ERROR_CURSOR_INVALID_CURSOR, MONGOC_ERROR_QUERY_FAILURE, MONGOC_ERROR_BSON_INVALID, MONGOC_ERROR_MATCHER_INVALID, MONGOC_ERROR_NAMESPACE_INVALID, MONGOC_ERROR_NAMESPACE_INVALID_FILTER_TYPE, MONGOC_ERROR_COMMAND_INVALID_ARG, MONGOC_ERROR_COLLECTION_INSERT_FAILED, MONGOC_ERROR_COLLECTION_UPDATE_FAILED, MONGOC_ERROR_COLLECTION_DELETE_FAILED, MONGOC_ERROR_COLLECTION_DOES_NOT_EXIST = 26, MONGOC_ERROR_GRIDFS_INVALID_FILENAME, MONGOC_ERROR_SCRAM_NOT_DONE, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, MONGOC_ERROR_QUERY_COMMAND_NOT_FOUND = 59, MONGOC_ERROR_QUERY_NOT_TAILABLE = 13051, MONGOC_ERROR_SERVER_SELECTION_BAD_WIRE_VERSION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, MONGOC_ERROR_SERVER_SELECTION_INVALID_ID, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR, /* Dup with query failure. */ MONGOC_ERROR_PROTOCOL_ERROR = 17, MONGOC_ERROR_WRITE_CONCERN_ERROR = 64, MONGOC_ERROR_DUPLICATE_KEY = 11000, MONGOC_ERROR_MAX_TIME_MS_EXPIRED = 50, MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN, MONGOC_ERROR_CLIENT_SESSION_FAILURE, MONGOC_ERROR_TRANSACTION_INVALID_STATE, MONGOC_ERROR_GRIDFS_CORRUPT, MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND, MONGOC_ERROR_GRIDFS_BUCKET_STREAM, /* An error related to initializing client side encryption. */ MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, /* An error related to server version api */ MONGOC_ERROR_CLIENT_API_ALREADY_SET, MONGOC_ERROR_CLIENT_API_FROM_POOL, MONGOC_ERROR_POOL_API_ALREADY_SET, MONGOC_ERROR_POOL_API_TOO_LATE, MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER, /* An error related to either GCP metadata or Azure IMDS server */ MONGOC_ERROR_KMS_SERVER_HTTP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, } mongoc_error_code_t; MONGOC_EXPORT(bool) mongoc_error_has_label(const bson_t *reply, const char *label); BSON_END_DECLS #endif /* MONGOC_ERRORS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-find-and-modify-private.h000066400000000000000000000022201511661753600272320ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_FIND_AND_MODIFY_PRIVATE_H #define MONGOC_FIND_AND_MODIFY_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS struct _mongoc_find_and_modify_opts_t { bson_t *sort; bson_t *update; bson_t *fields; mongoc_find_and_modify_flags_t flags; bool bypass_document_validation; uint32_t max_time_ms; bson_t extra; }; BSON_END_DECLS #endif /* MONGOC_FIND_AND_MODIFY_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-find-and-modify.c000066400000000000000000000112461511661753600255650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include /** * mongoc_find_and_modify_new: * * Create a new mongoc_find_and_modify_t. * * Returns: A newly allocated mongoc_find_and_modify_t. This should be freed * with mongoc_find_and_modify_destroy(). */ mongoc_find_and_modify_opts_t * mongoc_find_and_modify_opts_new(void) { mongoc_find_and_modify_opts_t *opts = NULL; opts = BSON_ALIGNED_ALLOC0(mongoc_find_and_modify_opts_t); bson_init(&opts->extra); opts->bypass_document_validation = false; return opts; } bool mongoc_find_and_modify_opts_set_sort(mongoc_find_and_modify_opts_t *opts, const bson_t *sort) { BSON_ASSERT(opts); if (sort) { bson_destroy(opts->sort); opts->sort = bson_copy(sort); return true; } return false; } void mongoc_find_and_modify_opts_get_sort(const mongoc_find_and_modify_opts_t *opts, bson_t *sort) { BSON_ASSERT(opts); BSON_ASSERT(sort); if (opts->sort) { bson_copy_to(opts->sort, sort); } else { bson_init(sort); } } bool mongoc_find_and_modify_opts_set_update(mongoc_find_and_modify_opts_t *opts, const bson_t *update) { BSON_ASSERT(opts); if (update) { bson_destroy(opts->update); opts->update = bson_copy(update); return true; } return false; } void mongoc_find_and_modify_opts_get_update(const mongoc_find_and_modify_opts_t *opts, bson_t *update) { BSON_ASSERT(opts); BSON_ASSERT(update); if (opts->update) { bson_copy_to(opts->update, update); } else { bson_init(update); } } bool mongoc_find_and_modify_opts_set_fields(mongoc_find_and_modify_opts_t *opts, const bson_t *fields) { BSON_ASSERT(opts); if (fields) { bson_destroy(opts->fields); opts->fields = bson_copy(fields); return true; } return false; } void mongoc_find_and_modify_opts_get_fields(const mongoc_find_and_modify_opts_t *opts, bson_t *fields) { BSON_ASSERT(opts); BSON_ASSERT(fields); if (opts->fields) { bson_copy_to(opts->fields, fields); } else { bson_init(fields); } } bool mongoc_find_and_modify_opts_set_flags(mongoc_find_and_modify_opts_t *opts, const mongoc_find_and_modify_flags_t flags) { BSON_ASSERT(opts); opts->flags = flags; return true; } mongoc_find_and_modify_flags_t mongoc_find_and_modify_opts_get_flags(const mongoc_find_and_modify_opts_t *opts) { BSON_ASSERT(opts); return opts->flags; } bool mongoc_find_and_modify_opts_set_bypass_document_validation(mongoc_find_and_modify_opts_t *opts, bool bypass) { BSON_ASSERT(opts); opts->bypass_document_validation = bypass; return true; } bool mongoc_find_and_modify_opts_get_bypass_document_validation(const mongoc_find_and_modify_opts_t *opts) { BSON_ASSERT(opts); return opts->bypass_document_validation; } bool mongoc_find_and_modify_opts_set_max_time_ms(mongoc_find_and_modify_opts_t *opts, uint32_t max_time_ms) { BSON_ASSERT(opts); opts->max_time_ms = max_time_ms; return true; } uint32_t mongoc_find_and_modify_opts_get_max_time_ms(const mongoc_find_and_modify_opts_t *opts) { BSON_ASSERT(opts); return opts->max_time_ms; } bool mongoc_find_and_modify_opts_append(mongoc_find_and_modify_opts_t *opts, const bson_t *extra) { BSON_ASSERT(opts); if (!extra) { return true; } return bson_concat(&opts->extra, extra); } void mongoc_find_and_modify_opts_get_extra(const mongoc_find_and_modify_opts_t *opts, bson_t *extra) { BSON_ASSERT(opts); BSON_ASSERT(extra); bson_copy_to(&opts->extra, extra); } /** * mongoc_find_and_modify_opts_destroy: * @opts: A mongoc_find_and_modify_opts_t. * * Releases a mongoc_find_and_modify_opts_t and all associated memory. */ void mongoc_find_and_modify_opts_destroy(mongoc_find_and_modify_opts_t *opts) { if (opts) { bson_destroy(opts->sort); bson_destroy(opts->update); bson_destroy(opts->fields); bson_destroy(&opts->extra); bson_free(opts); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-find-and-modify.h000066400000000000000000000057571511661753600256040ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_FIND_AND_MODIFY_H #define MONGOC_FIND_AND_MODIFY_H #include #include BSON_BEGIN_DECLS typedef enum { MONGOC_FIND_AND_MODIFY_NONE = 0, MONGOC_FIND_AND_MODIFY_REMOVE = 1 << 0, MONGOC_FIND_AND_MODIFY_UPSERT = 1 << 1, MONGOC_FIND_AND_MODIFY_RETURN_NEW = 1 << 2, } mongoc_find_and_modify_flags_t; typedef struct _mongoc_find_and_modify_opts_t mongoc_find_and_modify_opts_t; MONGOC_EXPORT(mongoc_find_and_modify_opts_t *) mongoc_find_and_modify_opts_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_sort(mongoc_find_and_modify_opts_t *opts, const bson_t *sort); MONGOC_EXPORT(void) mongoc_find_and_modify_opts_get_sort(const mongoc_find_and_modify_opts_t *opts, bson_t *sort); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_update(mongoc_find_and_modify_opts_t *opts, const bson_t *update); MONGOC_EXPORT(void) mongoc_find_and_modify_opts_get_update(const mongoc_find_and_modify_opts_t *opts, bson_t *update); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_fields(mongoc_find_and_modify_opts_t *opts, const bson_t *fields); MONGOC_EXPORT(void) mongoc_find_and_modify_opts_get_fields(const mongoc_find_and_modify_opts_t *opts, bson_t *fields); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_flags(mongoc_find_and_modify_opts_t *opts, const mongoc_find_and_modify_flags_t flags); MONGOC_EXPORT(mongoc_find_and_modify_flags_t) mongoc_find_and_modify_opts_get_flags(const mongoc_find_and_modify_opts_t *opts); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_bypass_document_validation(mongoc_find_and_modify_opts_t *opts, bool bypass); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_get_bypass_document_validation(const mongoc_find_and_modify_opts_t *opts); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_set_max_time_ms(mongoc_find_and_modify_opts_t *opts, uint32_t max_time_ms); MONGOC_EXPORT(uint32_t) mongoc_find_and_modify_opts_get_max_time_ms(const mongoc_find_and_modify_opts_t *opts); MONGOC_EXPORT(bool) mongoc_find_and_modify_opts_append(mongoc_find_and_modify_opts_t *opts, const bson_t *extra); MONGOC_EXPORT(void) mongoc_find_and_modify_opts_get_extra(const mongoc_find_and_modify_opts_t *opts, bson_t *extra); MONGOC_EXPORT(void) mongoc_find_and_modify_opts_destroy(mongoc_find_and_modify_opts_t *opts); BSON_END_DECLS #endif /* MONGOC_FIND_AND_MODIFY_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-flags-private.h000066400000000000000000000025731511661753600253740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_FLAGS_PRIVATE_H #define MONGOC_FLAGS_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS /** * mongoc_op_msg_flags_t: * @MONGOC_MSG_CHECKSUM_PRESENT: The message ends with 4 bytes containing a * CRC-32C checksum. * @MONGOC_MSG_MORE_TO_COME: If set to 0, wait for a server response. If set to * 1, do not expect a server response. * @MONGOC_MSG_EXHAUST_ALLOWED: If set, allows multiple replies to this request * using the moreToCome bit. */ typedef enum { MONGOC_MSG_NONE = 0, MONGOC_MSG_CHECKSUM_PRESENT = 1 << 0, MONGOC_MSG_MORE_TO_COME = 1 << 1, MONGOC_MSG_EXHAUST_ALLOWED = 1 << 16, } mongoc_op_msg_flags_t; BSON_END_DECLS #endif /* MONGOC_FLAGS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-flags.c000066400000000000000000000050511511661753600237110ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include // Document and ensure consistency between equivalent macros in mcd-rpc and // libmongoc. BSON_STATIC_ASSERT(MONGOC_OP_COMPRESSED_COMPRESSOR_ID_NOOP == MONGOC_COMPRESSOR_NOOP_ID); BSON_STATIC_ASSERT(MONGOC_OP_COMPRESSED_COMPRESSOR_ID_SNAPPY == MONGOC_COMPRESSOR_SNAPPY_ID); BSON_STATIC_ASSERT(MONGOC_OP_COMPRESSED_COMPRESSOR_ID_ZLIB == MONGOC_COMPRESSOR_ZLIB_ID); BSON_STATIC_ASSERT(MONGOC_OP_COMPRESSED_COMPRESSOR_ID_ZSTD == MONGOC_COMPRESSOR_ZSTD_ID); BSON_STATIC_ASSERT(MONGOC_OP_MSG_FLAG_NONE == MONGOC_MSG_NONE); BSON_STATIC_ASSERT(MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT == MONGOC_MSG_CHECKSUM_PRESENT); BSON_STATIC_ASSERT(MONGOC_OP_MSG_FLAG_MORE_TO_COME == MONGOC_MSG_MORE_TO_COME); BSON_STATIC_ASSERT(MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED == MONGOC_MSG_EXHAUST_ALLOWED); BSON_STATIC_ASSERT(MONGOC_OP_UPDATE_FLAG_NONE == MONGOC_UPDATE_NONE); BSON_STATIC_ASSERT(MONGOC_OP_UPDATE_FLAG_UPSERT == MONGOC_UPDATE_UPSERT); BSON_STATIC_ASSERT(MONGOC_OP_UPDATE_FLAG_MULTI_UPDATE == MONGOC_UPDATE_MULTI_UPDATE); BSON_STATIC_ASSERT(MONGOC_OP_INSERT_FLAG_NONE == MONGOC_INSERT_NONE); BSON_STATIC_ASSERT(MONGOC_OP_INSERT_FLAG_CONTINUE_ON_ERROR == MONGOC_INSERT_CONTINUE_ON_ERROR); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_NONE == MONGOC_QUERY_NONE); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_TAILABLE_CURSOR == MONGOC_QUERY_TAILABLE_CURSOR); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_SECONDARY_OK == MONGOC_QUERY_SECONDARY_OK); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_OPLOG_REPLAY == MONGOC_QUERY_OPLOG_REPLAY); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_NO_CURSOR_TIMEOUT == MONGOC_QUERY_NO_CURSOR_TIMEOUT); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_AWAIT_DATA == MONGOC_QUERY_AWAIT_DATA); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_EXHAUST == MONGOC_QUERY_EXHAUST); BSON_STATIC_ASSERT(MONGOC_OP_QUERY_FLAG_PARTIAL == MONGOC_QUERY_PARTIAL); mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-flags.h000066400000000000000000000064611511661753600237240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_FLAGS_H #define MONGOC_FLAGS_H #include BSON_BEGIN_DECLS /** * mongoc_remove_flags_t: * @MONGOC_REMOVE_NONE: Specify no delete flags. * @MONGOC_REMOVE_SINGLE_REMOVE: Only remove the first document matching the * document selector. * * #mongoc_remove_flags_t are used when performing a remove operation. */ typedef enum { MONGOC_REMOVE_NONE = 0, MONGOC_REMOVE_SINGLE_REMOVE = 1 << 0, } mongoc_remove_flags_t; /** * mongoc_insert_flags_t: * @MONGOC_INSERT_NONE: Specify no insert flags. * @MONGOC_INSERT_CONTINUE_ON_ERROR: Continue inserting documents from * the insertion set even if one fails. * * #mongoc_insert_flags_t are used when performing an insert operation. */ typedef enum { MONGOC_INSERT_NONE = 0, MONGOC_INSERT_CONTINUE_ON_ERROR = 1 << 0, } mongoc_insert_flags_t; #define MONGOC_INSERT_NO_VALIDATE (1U << 31) /** * mongoc_query_flags_t: * @MONGOC_QUERY_NONE: No query flags supplied. * @MONGOC_QUERY_TAILABLE_CURSOR: Cursor will not be closed when the last * data is retrieved. You can resume this cursor later. * @MONGOC_QUERY_SECONDARY_OK: Allow query of secondaries in a replica set. * @MONGOC_QUERY_OPLOG_REPLAY: Used internally by Mongo. * @MONGOC_QUERY_NO_CURSOR_TIMEOUT: The server normally times out idle * cursors after an inactivity period (10 minutes). This prevents that. * @MONGOC_QUERY_AWAIT_DATA: Use with %MONGOC_QUERY_TAILABLE_CURSOR. Block * rather than returning no data. After a period, time out. * @MONGOC_QUERY_EXHAUST: Stream the data down full blast in multiple * "more" packages. Faster when you are pulling a lot of data and * know you want to pull it all down. * @MONGOC_QUERY_PARTIAL: Get partial results from mongos if some shards * are down (instead of throwing an error). * * #mongoc_query_flags_t is used for querying a Mongo instance. */ typedef enum { MONGOC_QUERY_NONE = 0, MONGOC_QUERY_TAILABLE_CURSOR = 1 << 1, MONGOC_QUERY_SECONDARY_OK = 1 << 2, MONGOC_QUERY_OPLOG_REPLAY = 1 << 3, MONGOC_QUERY_NO_CURSOR_TIMEOUT = 1 << 4, MONGOC_QUERY_AWAIT_DATA = 1 << 5, MONGOC_QUERY_EXHAUST = 1 << 6, MONGOC_QUERY_PARTIAL = 1 << 7, } mongoc_query_flags_t; /** * mongoc_update_flags_t: * @MONGOC_UPDATE_NONE: No update flags specified. * @MONGOC_UPDATE_UPSERT: Perform an upsert. * @MONGOC_UPDATE_MULTI_UPDATE: Continue updating after first match. * * #mongoc_update_flags_t is used when updating documents found in Mongo. */ typedef enum { MONGOC_UPDATE_NONE = 0, MONGOC_UPDATE_UPSERT = 1 << 0, MONGOC_UPDATE_MULTI_UPDATE = 1 << 1, } mongoc_update_flags_t; #define MONGOC_UPDATE_NO_VALIDATE (1U << 31) BSON_END_DECLS #endif /* MONGOC_FLAGS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-generation-map-private.h000066400000000000000000000025421511661753600272020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifndef MONGOC_GENERATION_MAP_PRIVATE_H #define MONGOC_GENERATION_MAP_PRIVATE_H /* mongoc_generation_map_t maps a BSON ObjectID to an unsigned integer. * It is used to track connection generations. */ typedef struct _mongoc_generation_map mongoc_generation_map_t; mongoc_generation_map_t * mongoc_generation_map_new(void); mongoc_generation_map_t * mongoc_generation_map_copy(const mongoc_generation_map_t *gm); uint32_t mongoc_generation_map_get(const mongoc_generation_map_t *gm, const bson_oid_t *key); void mongoc_generation_map_increment(mongoc_generation_map_t *gm, const bson_oid_t *key); void mongoc_generation_map_destroy(mongoc_generation_map_t *gm); #endif /* MONGOC_GENERATION_MAP_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-generation-map.c000066400000000000000000000056571511661753600255370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include typedef struct _gm_node_t { bson_oid_t key; uint32_t val; struct _gm_node_t *next; } gm_node_t; static gm_node_t * gm_node_new(void) { return bson_malloc0(sizeof(gm_node_t)); } static void gm_node_destroy(gm_node_t *node) { bson_free(node); } static gm_node_t * gm_node_copy(const gm_node_t *node) { gm_node_t *node_copy = gm_node_new(); BSON_ASSERT(node_copy); BSON_ASSERT(node); bson_oid_copy(&node->key, &node_copy->key); node_copy->val = node->val; return node_copy; } struct _mongoc_generation_map { gm_node_t *list; }; mongoc_generation_map_t * mongoc_generation_map_new(void) { mongoc_generation_map_t *gm; gm = bson_malloc0(sizeof(mongoc_generation_map_t)); return gm; } mongoc_generation_map_t * mongoc_generation_map_copy(const mongoc_generation_map_t *gm) { mongoc_generation_map_t *gm_copy; gm_node_t *iter; gm_copy = mongoc_generation_map_new(); BSON_ASSERT(gm_copy); LL_FOREACH(gm->list, iter) { gm_node_t *node_copy; node_copy = gm_node_copy(iter); BSON_ASSERT(node_copy); LL_PREPEND(gm_copy->list, node_copy); } return gm_copy; } uint32_t mongoc_generation_map_get(const mongoc_generation_map_t *gm, const bson_oid_t *key) { gm_node_t *iter = NULL; BSON_ASSERT(gm); BSON_ASSERT(key); LL_FOREACH(gm->list, iter) { if (bson_oid_equal(key, &iter->key)) { break; } } if (!iter) { return 0; } return iter->val; } void mongoc_generation_map_increment(mongoc_generation_map_t *gm, const bson_oid_t *key) { gm_node_t *match; gm_node_t *iter = NULL; BSON_ASSERT(gm); BSON_ASSERT(key); LL_FOREACH(gm->list, iter) { if (bson_oid_equal(key, &iter->key)) { break; } } if (iter) { match = iter; } else { gm_node_t *new_node = gm_node_new(); BSON_ASSERT(new_node); bson_oid_copy(key, &new_node->key); LL_PREPEND(gm->list, new_node); match = new_node; } BSON_ASSERT(match); match->val++; } void mongoc_generation_map_destroy(mongoc_generation_map_t *gm) { gm_node_t *iter = NULL; gm_node_t *tmp = NULL; if (!gm) { return; } LL_FOREACH_SAFE(gm->list, iter, tmp) { gm_node_destroy(iter); } bson_free(gm); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-bucket-file-private.h000066400000000000000000000034661511661753600277500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_BUCKET_FILE_PRIVATE_H #define MONGOC_GRIDFS_BUCKET_FILE_PRIVATE_H #include #include #include #include BSON_BEGIN_DECLS typedef struct { /* corresponding bucket */ mongoc_gridfs_bucket_t *bucket; /* file data */ char *filename; bson_value_t *file_id; bson_t *metadata; int32_t chunk_size; int64_t length; /* fields for reading and writing */ uint8_t *buffer; size_t in_buffer; int32_t curr_chunk; /* for writing */ bool saved; /* for reading */ mongoc_cursor_t *cursor; size_t bytes_read; bool finished; /* Error */ bson_error_t err; } mongoc_gridfs_bucket_file_t; ssize_t _mongoc_gridfs_bucket_file_writev(mongoc_gridfs_bucket_file_t *file, const mongoc_iovec_t *iov, size_t iovcnt); ssize_t _mongoc_gridfs_bucket_file_readv(mongoc_gridfs_bucket_file_t *file, mongoc_iovec_t *iov, size_t iovcnt); bool _mongoc_gridfs_bucket_file_save(mongoc_gridfs_bucket_file_t *file); void _mongoc_gridfs_bucket_file_destroy(mongoc_gridfs_bucket_file_t *file); BSON_END_DECLS #endif /* MONGOC_GRIDFS_BUCKET_FILE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-bucket-file.c000066400000000000000000000326071511661753600262720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include /* Returns the minimum of two numbers */ static size_t _mongoc_min(const size_t a, const size_t b) { return a < b ? a : b; } /*-------------------------------------------------------------------------- * * _mongoc_gridfs_bucket_create_indexes -- * * Creates the indexes needed for GridFS on the 'files' and 'chunks' * collections. * * Return: * True if creating the indexes was successful, otherwise returns * false. * *-------------------------------------------------------------------------- */ static bool _mongoc_gridfs_bucket_create_indexes(mongoc_gridfs_bucket_t *bucket, bson_error_t *error) { mongoc_read_prefs_t *prefs; bson_t filter; bson_t opts; mongoc_cursor_t *cursor; const bson_t *doc; bson_t files_index; bson_t chunks_index; bool r; /* Check to see if there already exists a document in the files collection */ bson_init(&filter); bson_append_int32(&filter, "_id", 3, 1); bson_init(&opts); bson_append_bool(&opts, "singleBatch", 11, true); bson_append_int32(&opts, "limit", 5, 1); prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); cursor = mongoc_collection_find_with_opts(bucket->files, &filter, &opts, prefs); bson_destroy(&filter); bson_destroy(&opts); r = mongoc_cursor_next(cursor, &doc); mongoc_read_prefs_destroy(prefs); if (r) { /* Files exist */ mongoc_cursor_destroy(cursor); return true; } else if (mongoc_cursor_error(cursor, error)) { mongoc_cursor_destroy(cursor); return false; } mongoc_cursor_destroy(cursor); /* Create files index */ bson_init(&files_index); BSON_APPEND_INT32(&files_index, "filename", 1); BSON_APPEND_INT32(&files_index, "uploadDate", 1); r = _mongoc_collection_create_index_if_not_exists(bucket->files, &files_index, NULL, error); bson_destroy(&files_index); if (!r) { return false; } /* Create unique chunks index */ bson_init(&opts); BSON_APPEND_BOOL(&opts, "unique", true); BSON_APPEND_UTF8(&opts, "name", "files_id_1_n_1"); bson_init(&chunks_index); BSON_APPEND_INT32(&chunks_index, "files_id", 1); BSON_APPEND_INT32(&chunks_index, "n", 1); r = _mongoc_collection_create_index_if_not_exists(bucket->chunks, &chunks_index, &opts, error); bson_destroy(&opts); bson_destroy(&chunks_index); if (!r) { return false; } return true; } /*-------------------------------------------------------------------------- * * _mongoc_gridfs_bucket_write_chunk -- * * Writes a chunk from the buffer into the chunks collection. * * Return: * Returns true if the chunk was successfully written. Otherwise, * returns false and sets an error on the bucket file. * *-------------------------------------------------------------------------- */ static bool _mongoc_gridfs_bucket_write_chunk(mongoc_gridfs_bucket_file_t *file) { bson_t chunk; bool r; BSON_ASSERT(file); bson_init(&chunk); BSON_APPEND_INT32(&chunk, "n", file->curr_chunk); BSON_APPEND_VALUE(&chunk, "files_id", file->file_id); BSON_APPEND_BINARY(&chunk, "data", BSON_SUBTYPE_BINARY, file->buffer, (uint32_t)file->in_buffer); r = mongoc_collection_insert_one(file->bucket->chunks, &chunk, NULL /* opts */, NULL /* reply */, &file->err); bson_destroy(&chunk); if (!r) { return false; } file->curr_chunk++; file->in_buffer = 0; return true; } /*-------------------------------------------------------------------------- * * _mongoc_gridfs_bucket_init_cursor -- * * Initializes the cursor at file->cursor for the given file. * *-------------------------------------------------------------------------- */ static void _mongoc_gridfs_bucket_init_cursor(mongoc_gridfs_bucket_file_t *file) { bson_t filter; bson_t opts; bson_t sort; BSON_ASSERT(file); bson_init(&filter); bson_init(&opts); bson_init(&sort); BSON_APPEND_VALUE(&filter, "files_id", file->file_id); BSON_APPEND_INT32(&sort, "n", 1); BSON_APPEND_DOCUMENT(&opts, "sort", &sort); file->cursor = mongoc_collection_find_with_opts(file->bucket->chunks, &filter, &opts, NULL); bson_destroy(&filter); bson_destroy(&opts); bson_destroy(&sort); } /*-------------------------------------------------------------------------- * * _mongoc_gridfs_bucket_read_chunk -- * * Reads a chunk from the server and places it into the file's buffer * * Return: * True if the buffer has been filled with any available data. * Otherwise, false and sets the error on the bucket file. * *-------------------------------------------------------------------------- */ static bool _mongoc_gridfs_bucket_read_chunk(mongoc_gridfs_bucket_file_t *file) { const bson_t *next; bool r; bson_iter_t iter; int32_t n; const uint8_t *data; uint32_t data_len; int64_t total_chunks; int64_t expected_size; BSON_ASSERT(file); if (file->length == 0) { /* This file has zero length */ file->in_buffer = 0; file->finished = true; return true; } /* Calculate the total number of chunks for this file */ total_chunks = (file->length / file->chunk_size); if (file->length % file->chunk_size != 0) { total_chunks++; } if (file->curr_chunk == total_chunks) { /* All chunks have been read! */ file->in_buffer = 0; file->finished = true; return true; } if (file->cursor == NULL) { _mongoc_gridfs_bucket_init_cursor(file); } r = mongoc_cursor_next(file->cursor, &next); if (mongoc_cursor_error(file->cursor, &file->err)) { return false; } if (!r) { _mongoc_set_error( &file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "Missing chunk %d.", file->curr_chunk); return false; } r = bson_iter_init_find(&iter, next, "n"); if (!r) { _mongoc_set_error(&file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "Chunk %d missing a required field 'n'.", file->curr_chunk); return false; } n = bson_iter_int32(&iter); if (n != file->curr_chunk) { _mongoc_set_error( &file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "Missing chunk %d.", file->curr_chunk); return false; } r = bson_iter_init_find(&iter, next, "data"); if (!r) { _mongoc_set_error(&file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "Chunk %d missing a required field 'data'.", file->curr_chunk); return false; } bson_iter_binary(&iter, NULL, &data_len, &data); /* Assert that the data is the correct length */ if (file->curr_chunk != total_chunks - 1) { expected_size = file->chunk_size; } else { expected_size = file->length - ((total_chunks - 1) * file->chunk_size); } if (data_len != expected_size) { _mongoc_set_error(&file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "Chunk %d expected to have size %" PRId64 " but is size %" PRIu32 ".", file->curr_chunk, expected_size, data_len); return false; } memcpy(file->buffer, data, data_len); file->in_buffer = data_len; file->bytes_read = 0u; file->curr_chunk++; return true; } ssize_t _mongoc_gridfs_bucket_file_writev(mongoc_gridfs_bucket_file_t *file, const mongoc_iovec_t *iov, size_t iovcnt) { BSON_ASSERT(file); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); size_t total = 0; if (file->err.code) { return -1; } if (file->saved) { _mongoc_set_error(&file->err, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR, "Cannot write after saving/aborting on a GridFS file."); return -1; } if (!file->bucket->indexed) { if (!_mongoc_gridfs_bucket_create_indexes(file->bucket, &file->err)) { /* Error is set on file. */ return -1; } else { file->bucket->indexed = true; } } BSON_ASSERT(mlib_in_range(size_t, file->chunk_size)); const size_t chunk_size = (size_t)file->chunk_size; for (size_t i = 0u; i < iovcnt; i++) { size_t written_this_iov = 0u; while (written_this_iov < iov[i].iov_len) { const size_t bytes_available = iov[i].iov_len - written_this_iov; const size_t space_available = chunk_size - file->in_buffer; const size_t to_write = _mongoc_min(bytes_available, space_available); memcpy(file->buffer + file->in_buffer, ((char *)iov[i].iov_base) + written_this_iov, to_write); file->in_buffer += to_write; written_this_iov += to_write; total += to_write; if (file->in_buffer == chunk_size) { /* Buffer is filled, write the chunk */ _mongoc_gridfs_bucket_write_chunk(file); } } } BSON_ASSERT(mlib_in_range(ssize_t, total)); return (ssize_t)total; } ssize_t _mongoc_gridfs_bucket_file_readv(mongoc_gridfs_bucket_file_t *file, mongoc_iovec_t *iov, size_t iovcnt) { BSON_ASSERT(file); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); if (file->err.code) { return -1; } if (file->finished) { return 0; } size_t total = 0u; for (size_t i = 0u; i < iovcnt; i++) { size_t read_this_iov = 0u; while (read_this_iov < iov[i].iov_len) { const size_t bytes_available = file->in_buffer - file->bytes_read; const size_t space_available = iov[i].iov_len - read_this_iov; const size_t to_read = _mongoc_min(bytes_available, space_available); memcpy(((char *)iov[i].iov_base) + read_this_iov, file->buffer + file->bytes_read, to_read); file->bytes_read += to_read; read_this_iov += to_read; total += to_read; if (file->bytes_read == file->in_buffer) { /* Everything in the current chunk has been read, so read a new * chunk */ if (!_mongoc_gridfs_bucket_read_chunk(file)) { /* an error occurred while reading the chunk */ return -1; } if (file->finished) { /* There's nothing left to read */ BSON_ASSERT(mlib_in_range(ssize_t, total)); RETURN((ssize_t)total); } } } } BSON_ASSERT(mlib_in_range(ssize_t, total)); RETURN((ssize_t)total); } /*-------------------------------------------------------------------------- * * _mongoc_gridfs_bucket_file_save -- * * Saves the file to the files collection in gridFS. This locks the * file into GridFS, and no more chunks are allowed to be written. * * Return: * True if saved or no-op. False otherwise, and sets the file error. * *-------------------------------------------------------------------------- */ bool _mongoc_gridfs_bucket_file_save(mongoc_gridfs_bucket_file_t *file) { bson_t new_doc; int64_t length; bool r; BSON_ASSERT(file); if (file->saved) { /* Already saved, or aborted. */ return true; } if (file->err.code) { return false; } length = ((int64_t)file->curr_chunk) * file->chunk_size; if (file->in_buffer != 0) { length += file->in_buffer; _mongoc_gridfs_bucket_write_chunk(file); } file->length = length; bson_init(&new_doc); BSON_APPEND_VALUE(&new_doc, "_id", file->file_id); BSON_APPEND_INT64(&new_doc, "length", file->length); BSON_APPEND_INT32(&new_doc, "chunkSize", file->chunk_size); BSON_APPEND_DATE_TIME(&new_doc, "uploadDate", _mongoc_get_real_time_ms()); BSON_APPEND_UTF8(&new_doc, "filename", file->filename); if (file->metadata) { BSON_APPEND_DOCUMENT(&new_doc, "metadata", file->metadata); } r = mongoc_collection_insert_one(file->bucket->files, &new_doc, NULL, NULL, &file->err); bson_destroy(&new_doc); file->saved = r; return (file->err.code) ? false : true; } void _mongoc_gridfs_bucket_file_destroy(mongoc_gridfs_bucket_file_t *file) { if (file) { bson_value_destroy(file->file_id); bson_free(file->file_id); bson_destroy(file->metadata); mongoc_cursor_destroy(file->cursor); bson_free(file->buffer); bson_free(file->filename); bson_free(file); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-bucket-private.h000066400000000000000000000020521511661753600270210ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_BUCKET_PRIVATE_H #define MONGOC_GRIDFS_BUCKET_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS struct _mongoc_gridfs_bucket_t { mongoc_collection_t *chunks; mongoc_collection_t *files; int32_t chunk_size; char *bucket_name; bool indexed; }; BSON_END_DECLS #endif /* MONGOC_GRIDFS_BUCKET_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-bucket.c000066400000000000000000000402631511661753600253520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /*-------------------------------------------------------------------------- * * _mongoc_gridfs_find_file_with_id -- * * Attempts to find the file corresponding to the given file_id in * GridFS. * * Return: * True on success and initializes file. Otherwise, returns false * and sets error. * *-------------------------------------------------------------------------- */ static bool _mongoc_gridfs_find_file_with_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_t *file, bson_error_t *error) { mongoc_cursor_t *cursor; bson_t filter; const bson_t *doc; bool r; BSON_ASSERT(bucket); BSON_ASSERT(file_id); bson_init(&filter); BSON_APPEND_VALUE(&filter, "_id", file_id); cursor = mongoc_collection_find_with_opts(bucket->files, &filter, NULL, NULL); bson_destroy(&filter); r = mongoc_cursor_next(cursor, &doc); if (!r) { if (!mongoc_cursor_error(cursor, error)) { _mongoc_set_error( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND, "No file with given id exists"); } } else { if (file) { bson_copy_to(doc, file); } } mongoc_cursor_destroy(cursor); return r; } mongoc_gridfs_bucket_t * mongoc_gridfs_bucket_new(mongoc_database_t *db, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_error_t *error) { mongoc_gridfs_bucket_t *bucket; char buf[128]; mongoc_gridfs_bucket_opts_t gridfs_opts; BSON_ASSERT(db); if (!_mongoc_gridfs_bucket_opts_parse(db->client, opts, &gridfs_opts, error)) { _mongoc_gridfs_bucket_opts_cleanup(&gridfs_opts); return NULL; } /* Initialize the bucket fields */ if (strlen(gridfs_opts.bucketName) + strlen(".chunks") + 1 > sizeof(buf)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bucketName \"%s\" must have fewer than %d characters", gridfs_opts.bucketName, (int)(sizeof(buf) - (strlen(".chunks") + 1))); _mongoc_gridfs_bucket_opts_cleanup(&gridfs_opts); return NULL; } bucket = (mongoc_gridfs_bucket_t *)bson_malloc0(sizeof *bucket); // Expect no truncation from above, checking no error occurred. int req = bson_snprintf(buf, sizeof(buf), "%s.chunks", gridfs_opts.bucketName); BSON_ASSERT(req > 0); bucket->chunks = mongoc_database_get_collection(db, buf); req = bson_snprintf(buf, sizeof(buf), "%s.files", gridfs_opts.bucketName); BSON_ASSERT(req > 0); bucket->files = mongoc_database_get_collection(db, buf); if (gridfs_opts.writeConcern) { mongoc_collection_set_write_concern(bucket->chunks, gridfs_opts.writeConcern); mongoc_collection_set_write_concern(bucket->files, gridfs_opts.writeConcern); } if (gridfs_opts.readConcern) { mongoc_collection_set_read_concern(bucket->chunks, gridfs_opts.readConcern); mongoc_collection_set_read_concern(bucket->files, gridfs_opts.readConcern); } if (read_prefs) { mongoc_collection_set_read_prefs(bucket->chunks, read_prefs); mongoc_collection_set_read_prefs(bucket->files, read_prefs); } bucket->chunk_size = gridfs_opts.chunkSizeBytes; bucket->bucket_name = bson_strdup(gridfs_opts.bucketName); _mongoc_gridfs_bucket_opts_cleanup(&gridfs_opts); return bucket; } mongoc_stream_t * mongoc_gridfs_bucket_open_upload_stream_with_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, const bson_t *opts, bson_error_t *error) { mongoc_gridfs_bucket_file_t *file; size_t len; mongoc_gridfs_bucket_upload_opts_t gridfs_opts; BSON_ASSERT(bucket); BSON_ASSERT(file_id); BSON_ASSERT(filename); if (!_mongoc_gridfs_bucket_upload_opts_parse(bucket->files->client, opts, &gridfs_opts, error)) { _mongoc_gridfs_bucket_upload_opts_cleanup(&gridfs_opts); return NULL; } /* default to bucket's chunk size. */ if (!gridfs_opts.chunkSizeBytes) { gridfs_opts.chunkSizeBytes = bucket->chunk_size; } /* Initialize the file's fields */ len = strlen(filename); file = (mongoc_gridfs_bucket_file_t *)bson_malloc0(sizeof *file); file->filename = bson_malloc0(len + 1); bson_strncpy(file->filename, filename, len + 1); file->file_id = (bson_value_t *)bson_malloc0(sizeof *(file->file_id)); bson_value_copy(file_id, file->file_id); file->bucket = bucket; file->chunk_size = gridfs_opts.chunkSizeBytes; file->metadata = bson_copy(&gridfs_opts.metadata); BSON_ASSERT(gridfs_opts.chunkSizeBytes > 0); // Validated in _mongoc_gridfs_bucket_opts_parse. file->buffer = bson_malloc((size_t)gridfs_opts.chunkSizeBytes); file->in_buffer = 0; _mongoc_gridfs_bucket_upload_opts_cleanup(&gridfs_opts); return _mongoc_upload_stream_gridfs_new(file); } mongoc_stream_t * mongoc_gridfs_bucket_open_upload_stream(mongoc_gridfs_bucket_t *bucket, const char *filename, const bson_t *opts, bson_value_t *file_id /* OUT */, bson_error_t *error) { mongoc_stream_t *stream; bson_oid_t object_id; bson_value_t val; BSON_ASSERT(bucket); BSON_ASSERT(filename); /* Create an objectId to use as the file's id */ bson_oid_init(&object_id, NULL); val.value_type = BSON_TYPE_OID; val.value.v_oid = object_id; stream = mongoc_gridfs_bucket_open_upload_stream_with_id(bucket, &val, filename, opts, error); if (!stream) { return NULL; } if (file_id) { bson_value_copy(&val, file_id); } return stream; } bool mongoc_gridfs_bucket_upload_from_stream_with_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_error_t *error) { mongoc_stream_t *upload_stream; ssize_t bytes_read; ssize_t bytes_written; char buf[512]; BSON_ASSERT(bucket); BSON_ASSERT(file_id); BSON_ASSERT(filename); BSON_ASSERT(source); upload_stream = mongoc_gridfs_bucket_open_upload_stream_with_id(bucket, file_id, filename, opts, error); if (!upload_stream) { return false; } while ((bytes_read = mongoc_stream_read(source, buf, 512, 1, 0)) > 0) { bytes_written = mongoc_stream_write(upload_stream, buf, bytes_read, 0); if (bytes_written < 0) { BSON_ASSERT(mongoc_gridfs_bucket_stream_error(upload_stream, error)); mongoc_gridfs_bucket_abort_upload(upload_stream); mongoc_stream_destroy(upload_stream); return false; } } if (bytes_read < 0) { mongoc_gridfs_bucket_abort_upload(upload_stream); _mongoc_set_error( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_BUCKET_STREAM, "Error occurred on the provided stream."); mongoc_stream_destroy(upload_stream); return false; } else { mongoc_stream_destroy(upload_stream); return true; } } bool mongoc_gridfs_bucket_upload_from_stream(mongoc_gridfs_bucket_t *bucket, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_value_t *file_id /* OUT */, bson_error_t *error) { bool r; bson_oid_t object_id; bson_value_t val; BSON_ASSERT(bucket); BSON_ASSERT(filename); BSON_ASSERT(source); /* Create an objectId to use as the file's id */ bson_oid_init(&object_id, bson_context_get_default()); val.value_type = BSON_TYPE_OID; val.value.v_oid = object_id; r = mongoc_gridfs_bucket_upload_from_stream_with_id(bucket, &val, filename, source, opts, error); if (!r) { return false; } if (file_id) { bson_value_copy(&val, file_id); } return true; } mongoc_stream_t * mongoc_gridfs_bucket_open_download_stream(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error) { mongoc_gridfs_bucket_file_t *file; bson_t file_doc; const char *key; bson_iter_t iter; uint32_t data_len; const uint8_t *data; bool r; BSON_ASSERT(bucket); BSON_ASSERT(file_id); r = _mongoc_gridfs_find_file_with_id(bucket, file_id, &file_doc, error); if (!r) { /* Error should already be set. */ return NULL; } if (!bson_iter_init(&iter, &file_doc)) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "File document malformed"); return NULL; } file = (mongoc_gridfs_bucket_file_t *)bson_malloc0(sizeof *file); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (strcmp(key, "length") == 0) { file->length = bson_iter_as_int64(&iter); } else if (strcmp(key, "chunkSize") == 0) { file->chunk_size = bson_iter_int32(&iter); } else if (strcmp(key, "filename") == 0) { file->filename = bson_strdup(bson_iter_utf8(&iter, NULL)); } else if (strcmp(key, "metadata") == 0) { bson_iter_document(&iter, &data_len, &data); file->metadata = bson_new_from_data(data, data_len); } } bson_destroy(&file_doc); if (file->chunk_size <= 0) { _mongoc_set_error(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "File document contains invalid chunk size: %" PRId32, file->chunk_size); _mongoc_gridfs_bucket_file_destroy(file); return NULL; } if (file->length < 0) { _mongoc_set_error(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "File document contains invalid length: %" PRId64, file->length); _mongoc_gridfs_bucket_file_destroy(file); return NULL; } file->file_id = (bson_value_t *)bson_malloc0(sizeof *(file->file_id)); bson_value_copy(file_id, file->file_id); file->bucket = bucket; file->buffer = bson_malloc0((size_t)file->chunk_size); BSON_ASSERT(file->file_id); return _mongoc_download_stream_gridfs_new(file); } bool mongoc_gridfs_bucket_download_to_stream(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, mongoc_stream_t *destination, bson_error_t *error) { mongoc_stream_t *download_stream; ssize_t bytes_read; ssize_t bytes_written; char buf[512]; BSON_ASSERT(bucket); BSON_ASSERT(file_id); BSON_ASSERT(destination); /* Make the download stream */ download_stream = mongoc_gridfs_bucket_open_download_stream(bucket, file_id, error); while ((bytes_read = mongoc_stream_read(download_stream, buf, 256, 1, 0)) > 0) { bytes_written = mongoc_stream_write(destination, buf, bytes_read, 0); if (bytes_written < 0) { _mongoc_set_error( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_BUCKET_STREAM, "Error occurred on the provided stream."); mongoc_stream_destroy(download_stream); return false; } } mongoc_stream_destroy(download_stream); return bytes_read != -1; } bool mongoc_gridfs_bucket_delete_by_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error) { bson_t files_selector; bson_t chunks_selector; bson_t reply; bson_iter_t iter; bool r; BSON_ASSERT(bucket); BSON_ASSERT(file_id); bson_init(&files_selector); BSON_APPEND_VALUE(&files_selector, "_id", file_id); r = mongoc_collection_delete_one(bucket->files, &files_selector, NULL, &reply, error); bson_destroy(&files_selector); if (!r) { bson_destroy(&reply); return false; } BSON_ASSERT(bson_iter_init_find(&iter, &reply, "deletedCount")); if (bson_iter_as_int64(&iter) != 1) { _mongoc_set_error(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND, "File not found"); bson_destroy(&reply); return false; } bson_destroy(&reply); bson_init(&chunks_selector); BSON_APPEND_VALUE(&chunks_selector, "files_id", file_id); r = mongoc_collection_delete_many(bucket->chunks, &chunks_selector, NULL, NULL, error); bson_destroy(&chunks_selector); if (!r) { return false; } return true; } mongoc_cursor_t * mongoc_gridfs_bucket_find(mongoc_gridfs_bucket_t *bucket, const bson_t *filter, const bson_t *opts) { mongoc_cursor_t *cursor; BSON_ASSERT(bucket); BSON_ASSERT(filter); cursor = mongoc_collection_find_with_opts(bucket->files, filter, opts, NULL); if (!cursor->error.code && opts && bson_has_field(opts, "sessionId")) { _mongoc_set_error( &cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot pass sessionId as an option"); } return cursor; } bool mongoc_gridfs_bucket_stream_error(mongoc_stream_t *stream, bson_error_t *error) { bson_error_t *stream_err; BSON_ASSERT(stream); BSON_ASSERT(error); if (stream->type == MONGOC_STREAM_GRIDFS_UPLOAD) { stream_err = &((mongoc_gridfs_upload_stream_t *)stream)->file->err; } else if (stream->type == MONGOC_STREAM_GRIDFS_DOWNLOAD) { stream_err = &((mongoc_gridfs_download_stream_t *)stream)->file->err; } else { return false; } if (stream_err->code) { memcpy(error, stream_err, sizeof(*stream_err)); return true; } else { return false; } } void mongoc_gridfs_bucket_destroy(mongoc_gridfs_bucket_t *bucket) { if (bucket) { mongoc_collection_destroy(bucket->chunks); mongoc_collection_destroy(bucket->files); bson_free(bucket->bucket_name); bson_free(bucket); } } bool mongoc_gridfs_bucket_abort_upload(mongoc_stream_t *stream) { mongoc_gridfs_bucket_file_t *file; bson_t chunks_selector; bool r; BSON_ASSERT(stream); BSON_ASSERT(stream->type == MONGOC_STREAM_GRIDFS_UPLOAD); file = ((mongoc_gridfs_upload_stream_t *)stream)->file; /* Pretend we've already saved. This way we won't add an entry to the files * collection when the stream is closed */ file->saved = true; bson_init(&chunks_selector); BSON_APPEND_VALUE(&chunks_selector, "files_id", file->file_id); r = mongoc_collection_delete_many(file->bucket->chunks, &chunks_selector, NULL, NULL, &file->err); bson_destroy(&chunks_selector); return r; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-bucket.h000066400000000000000000000077271511661753600253670ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_BUCKET_H #define MONGOC_GRIDFS_BUCKET_H #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_gridfs_bucket_t mongoc_gridfs_bucket_t; MONGOC_EXPORT(mongoc_gridfs_bucket_t *) mongoc_gridfs_bucket_new(mongoc_database_t *db, const bson_t *opts, const mongoc_read_prefs_t *read_prefs, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_stream_t *) mongoc_gridfs_bucket_open_upload_stream(mongoc_gridfs_bucket_t *bucket, const char *filename, const bson_t *opts, bson_value_t *file_id, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_stream_t *) mongoc_gridfs_bucket_open_upload_stream_with_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, const bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_gridfs_bucket_upload_from_stream(mongoc_gridfs_bucket_t *bucket, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_value_t *file_id, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_gridfs_bucket_upload_from_stream_with_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, const char *filename, mongoc_stream_t *source, const bson_t *opts, bson_error_t *error); MONGOC_EXPORT(mongoc_stream_t *) mongoc_gridfs_bucket_open_download_stream(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_gridfs_bucket_download_to_stream(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, mongoc_stream_t *destination, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_gridfs_bucket_delete_by_id(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, bson_error_t *error); MONGOC_EXPORT(mongoc_cursor_t *) mongoc_gridfs_bucket_find(mongoc_gridfs_bucket_t *bucket, const bson_t *filter, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_gridfs_bucket_stream_error(mongoc_stream_t *stream, bson_error_t *error); MONGOC_EXPORT(void) mongoc_gridfs_bucket_destroy(mongoc_gridfs_bucket_t *bucket); MONGOC_EXPORT(bool) mongoc_gridfs_bucket_abort_upload(mongoc_stream_t *stream); BSON_END_DECLS #endif /* MONGOC_GRIDFS_BUCKET_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-list-private.h000066400000000000000000000025561511661753600274450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_LIST_PRIVATE_H #define MONGOC_GRIDFS_FILE_LIST_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include BSON_BEGIN_DECLS struct _mongoc_gridfs_file_list_t { mongoc_gridfs_t *gridfs; mongoc_cursor_t *cursor; bson_error_t error; }; mongoc_gridfs_file_list_t * _mongoc_gridfs_file_list_new(mongoc_gridfs_t *gridfs, const bson_t *query, uint32_t limit); mongoc_gridfs_file_list_t * _mongoc_gridfs_file_list_new_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts); BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_LIST_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-list.c000066400000000000000000000063271511661753600257700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include mongoc_gridfs_file_list_t * _mongoc_gridfs_file_list_new(mongoc_gridfs_t *gridfs, const bson_t *query, uint32_t limit) { mongoc_gridfs_file_list_t *list; mongoc_cursor_t *cursor; bool use_unwrapped; bson_t opts; bson_t unwrapped; bson_error_t error; bson_init(&opts); use_unwrapped = _mongoc_cursor_translate_dollar_query_opts(query, &opts, &unwrapped, &error); cursor = _mongoc_cursor_find_new(gridfs->client, gridfs->files->ns, use_unwrapped ? &unwrapped : query, &opts, NULL, gridfs->files->read_prefs, gridfs->files->read_concern); BSON_ASSERT(cursor); bson_destroy(&opts); if (limit) { (void)mongoc_cursor_set_limit(cursor, limit); } bson_destroy(&unwrapped); if (error.domain) { memcpy(&cursor->error, &error, sizeof(bson_error_t)); } list = (mongoc_gridfs_file_list_t *)bson_malloc0(sizeof *list); list->cursor = cursor; list->gridfs = gridfs; return list; } mongoc_gridfs_file_list_t * _mongoc_gridfs_file_list_new_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts) { mongoc_gridfs_file_list_t *list; mongoc_cursor_t *cursor; cursor = mongoc_collection_find_with_opts(gridfs->files, filter, opts, NULL /* read prefs */); BSON_ASSERT(cursor); list = (mongoc_gridfs_file_list_t *)bson_malloc0(sizeof *list); list->cursor = cursor; list->gridfs = gridfs; return list; } mongoc_gridfs_file_t * mongoc_gridfs_file_list_next(mongoc_gridfs_file_list_t *list) { const bson_t *bson; BSON_ASSERT(list); if (mongoc_cursor_next(list->cursor, &bson)) { return _mongoc_gridfs_file_new_from_bson(list->gridfs, bson); } else { return NULL; } } bool mongoc_gridfs_file_list_error(mongoc_gridfs_file_list_t *list, bson_error_t *error) { return mongoc_cursor_error(list->cursor, error); } void mongoc_gridfs_file_list_destroy(mongoc_gridfs_file_list_t *list) { if (!list) { return; } mongoc_cursor_destroy(list->cursor); bson_free(list); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-list.h000066400000000000000000000023751511661753600257740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_LIST_H #define MONGOC_GRIDFS_FILE_LIST_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_gridfs_file_list_t mongoc_gridfs_file_list_t; MONGOC_EXPORT(mongoc_gridfs_file_t *) mongoc_gridfs_file_list_next(mongoc_gridfs_file_list_t *list) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_gridfs_file_list_destroy(mongoc_gridfs_file_list_t *list); MONGOC_EXPORT(bool) mongoc_gridfs_file_list_error(mongoc_gridfs_file_list_t *list, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_LIST_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-page-private.h000066400000000000000000000036461511661753600274070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_PAGE_PRIVATE_H #define MONGOC_GRIDFS_FILE_PAGE_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS struct _mongoc_gridfs_file_page_t { const uint8_t *read_buf; uint8_t *buf; uint32_t len; uint32_t chunk_size; uint32_t offset; }; mongoc_gridfs_file_page_t * _mongoc_gridfs_file_page_new(const uint8_t *data, uint32_t len, uint32_t chunk_size); void _mongoc_gridfs_file_page_destroy(mongoc_gridfs_file_page_t *page); bool _mongoc_gridfs_file_page_seek(mongoc_gridfs_file_page_t *page, uint32_t offset); int32_t _mongoc_gridfs_file_page_read(mongoc_gridfs_file_page_t *page, void *dst, uint32_t len); int32_t _mongoc_gridfs_file_page_write(mongoc_gridfs_file_page_t *page, const void *src, uint32_t len); uint32_t _mongoc_gridfs_file_page_memset0(mongoc_gridfs_file_page_t *page, uint32_t len); uint32_t _mongoc_gridfs_file_page_tell(mongoc_gridfs_file_page_t *page); const uint8_t * _mongoc_gridfs_file_page_get_data(mongoc_gridfs_file_page_t *page); uint32_t _mongoc_gridfs_file_page_get_len(mongoc_gridfs_file_page_t *page); bool _mongoc_gridfs_file_page_is_dirty(mongoc_gridfs_file_page_t *page); BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_PAGE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-page.c000066400000000000000000000114041511661753600257210ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "gridfs_file_page" #include #include #include /** create a new page from a buffer * * The buffer should stick around for the life of the page */ mongoc_gridfs_file_page_t * _mongoc_gridfs_file_page_new(const uint8_t *data, uint32_t len, uint32_t chunk_size) { mongoc_gridfs_file_page_t *page; ENTRY; BSON_ASSERT(data); BSON_ASSERT(len <= chunk_size); page = (mongoc_gridfs_file_page_t *)bson_malloc0(sizeof *page); page->chunk_size = chunk_size; page->read_buf = data; page->len = len; RETURN(page); } bool _mongoc_gridfs_file_page_seek(mongoc_gridfs_file_page_t *page, uint32_t offset) { ENTRY; BSON_ASSERT(page); page->offset = offset; RETURN(1); } int32_t _mongoc_gridfs_file_page_read(mongoc_gridfs_file_page_t *page, void *dst, uint32_t len) { int bytes_read; const uint8_t *src; ENTRY; BSON_ASSERT(page); BSON_ASSERT(dst); bytes_read = BSON_MIN(len, page->len - page->offset); src = page->read_buf ? page->read_buf : page->buf; memcpy(dst, src + page->offset, bytes_read); page->offset += bytes_read; RETURN(bytes_read); } /** * _mongoc_gridfs_file_page_write: * * Write to a page. * * Writes are copy-on-write with regards to the buffer that was passed to the * mongoc_gridfs_file_page_t during construction. In other words, the first * write allocates a large enough buffer for file->chunk_size, which becomes * authoritative from then on. * * A write of zero bytes will trigger the copy-on-write mechanism. */ int32_t _mongoc_gridfs_file_page_write(mongoc_gridfs_file_page_t *page, const void *src, uint32_t len) { int bytes_written; ENTRY; BSON_ASSERT(page); BSON_ASSERT(src); bytes_written = BSON_MIN(len, page->chunk_size - page->offset); if (!page->buf) { page->buf = (uint8_t *)bson_malloc(page->chunk_size); memcpy(page->buf, page->read_buf, BSON_MIN(page->chunk_size, page->len)); } /* Copy bytes and adjust the page position */ memcpy(page->buf + page->offset, src, bytes_written); page->offset += bytes_written; page->len = BSON_MAX(page->offset, page->len); /* Don't use the old read buffer, which is no longer current */ page->read_buf = page->buf; RETURN(bytes_written); } /** * _mongoc_gridfs_file_page_memset0: * * Write zeros to a page, starting from the page's current position. Up to * `len` bytes will be set to zero or until the page is full, whichever * comes first. * * Like _mongoc_gridfs_file_page_write, operations are copy-on-write with * regards to the page buffer. * * Returns: * Number of bytes set. */ uint32_t _mongoc_gridfs_file_page_memset0(mongoc_gridfs_file_page_t *page, uint32_t len) { uint32_t bytes_set; ENTRY; BSON_ASSERT(page); bytes_set = BSON_MIN(page->chunk_size - page->offset, len); if (!page->buf) { page->buf = (uint8_t *)bson_malloc0(page->chunk_size); memcpy(page->buf, page->read_buf, BSON_MIN(page->chunk_size, page->len)); } /* Set bytes and adjust the page position */ memset(page->buf + page->offset, '\0', bytes_set); page->offset += bytes_set; page->len = BSON_MAX(page->offset, page->len); /* Don't use the old read buffer, which is no longer current */ page->read_buf = page->buf; RETURN(bytes_set); } const uint8_t * _mongoc_gridfs_file_page_get_data(mongoc_gridfs_file_page_t *page) { ENTRY; BSON_ASSERT(page); RETURN(page->buf ? page->buf : page->read_buf); } uint32_t _mongoc_gridfs_file_page_get_len(mongoc_gridfs_file_page_t *page) { ENTRY; BSON_ASSERT(page); RETURN(page->len); } uint32_t _mongoc_gridfs_file_page_tell(mongoc_gridfs_file_page_t *page) { ENTRY; BSON_ASSERT(page); RETURN(page->offset); } bool _mongoc_gridfs_file_page_is_dirty(mongoc_gridfs_file_page_t *page) { ENTRY; BSON_ASSERT(page); RETURN(page->buf ? 1 : 0); } void _mongoc_gridfs_file_page_destroy(mongoc_gridfs_file_page_t *page) { ENTRY; if (page->buf) { bson_free(page->buf); } bson_free(page); EXIT; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-page.h000066400000000000000000000017461511661753600257360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_PAGE_H #define MONGOC_GRIDFS_FILE_PAGE_H #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_gridfs_file_page_t mongoc_gridfs_file_page_t; BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_PAGE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file-private.h000066400000000000000000000034241511661753600264670ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_PRIVATE_H #define MONGOC_GRIDFS_FILE_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include BSON_BEGIN_DECLS struct _mongoc_gridfs_file_t { mongoc_gridfs_t *gridfs; bson_t bson; mongoc_gridfs_file_page_t *page; uint64_t pos; int32_t n; bson_error_t error; mongoc_cursor_t *cursor; uint32_t cursor_range[2]; /* current chunk, # of chunks */ bool is_dirty; bson_value_t files_id; int64_t length; int32_t chunk_size; int64_t upload_date; char *md5; char *filename; char *content_type; bson_t aliases; bson_t metadata; const char *bson_md5; const char *bson_filename; const char *bson_content_type; bson_t bson_aliases; bson_t bson_metadata; }; mongoc_gridfs_file_t * _mongoc_gridfs_file_new_from_bson(mongoc_gridfs_t *gridfs, const bson_t *data); mongoc_gridfs_file_t * _mongoc_gridfs_file_new(mongoc_gridfs_t *gridfs, mongoc_gridfs_file_opt_t *opt); BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file.c000066400000000000000000000716101511661753600250140ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "gridfs_file" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static bool _mongoc_gridfs_file_refresh_page(mongoc_gridfs_file_t *file); static bool _mongoc_gridfs_file_flush_page(mongoc_gridfs_file_t *file); static ssize_t _mongoc_gridfs_file_extend(mongoc_gridfs_file_t *file); /***************************************************************** * Magic accessor generation * * We need some accessors to get and set properties on files, to handle memory * ownership and to determine dirtiness. These macros produce the getters and * setters we need *****************************************************************/ #define MONGOC_GRIDFS_FILE_STR_ACCESSOR(name) \ const char *mongoc_gridfs_file_get_##name(mongoc_gridfs_file_t *file) \ { \ return file->name ? file->name : file->bson_##name; \ } \ void mongoc_gridfs_file_set_##name(mongoc_gridfs_file_t *file, const char *str) \ { \ if (file->name) { \ bson_free(file->name); \ } \ file->name = bson_strdup(str); \ file->is_dirty = 1; \ } #define MONGOC_GRIDFS_FILE_BSON_ACCESSOR(name) \ const bson_t *mongoc_gridfs_file_get_##name(mongoc_gridfs_file_t *file) \ { \ if (file->name.len) { \ return &file->name; \ } else if (file->bson_##name.len) { \ return &file->bson_##name; \ } else { \ return NULL; \ } \ } \ void mongoc_gridfs_file_set_##name(mongoc_gridfs_file_t *file, const bson_t *bson) \ { \ if (file->name.len) { \ bson_destroy(&file->name); \ } \ bson_copy_to(bson, &(file->name)); \ file->is_dirty = 1; \ } MONGOC_GRIDFS_FILE_STR_ACCESSOR(md5) MONGOC_GRIDFS_FILE_STR_ACCESSOR(filename) MONGOC_GRIDFS_FILE_STR_ACCESSOR(content_type) MONGOC_GRIDFS_FILE_BSON_ACCESSOR(aliases) MONGOC_GRIDFS_FILE_BSON_ACCESSOR(metadata) /** * mongoc_gridfs_file_set_id: * * the user can set the files_id to an id of any type. Must be called before * mongoc_gridfs_file_save. * */ bool mongoc_gridfs_file_set_id(mongoc_gridfs_file_t *file, const bson_value_t *id, bson_error_t *error) { if (!file->is_dirty) { _mongoc_set_error( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR, "Cannot set file id after saving file."); return false; } bson_value_copy(id, &file->files_id); return true; } /** save a gridfs file */ bool mongoc_gridfs_file_save(mongoc_gridfs_file_t *file) { bson_t *selector, *update, child; const char *md5; const char *filename; const char *content_type; const bson_t *aliases; const bson_t *metadata; bool r; ENTRY; if (!file->is_dirty) { return 1; } if (file->page && _mongoc_gridfs_file_page_is_dirty(file->page)) { if (!_mongoc_gridfs_file_flush_page(file)) { RETURN(false); } } md5 = mongoc_gridfs_file_get_md5(file); filename = mongoc_gridfs_file_get_filename(file); content_type = mongoc_gridfs_file_get_content_type(file); aliases = mongoc_gridfs_file_get_aliases(file); metadata = mongoc_gridfs_file_get_metadata(file); selector = bson_new(); bson_append_value(selector, "_id", -1, &file->files_id); update = bson_new(); bson_append_document_begin(update, "$set", -1, &child); bson_append_int64(&child, "length", -1, file->length); bson_append_int32(&child, "chunkSize", -1, file->chunk_size); bson_append_date_time(&child, "uploadDate", -1, file->upload_date); if (md5) { bson_append_utf8(&child, "md5", -1, md5, -1); } if (filename) { bson_append_utf8(&child, "filename", -1, filename, -1); } if (content_type) { bson_append_utf8(&child, "contentType", -1, content_type, -1); } if (aliases) { bson_append_array(&child, "aliases", -1, aliases); } if (metadata) { bson_append_document(&child, "metadata", -1, metadata); } bson_append_document_end(update, &child); r = mongoc_collection_update(file->gridfs->files, MONGOC_UPDATE_UPSERT, selector, update, NULL, &file->error); bson_destroy(selector); bson_destroy(update); file->is_dirty = 0; RETURN(r); } /** * _mongoc_gridfs_file_new_from_bson: * * creates a gridfs file from a bson object * * This is only really useful for instantiating a gridfs file from a server * side object */ mongoc_gridfs_file_t * _mongoc_gridfs_file_new_from_bson(mongoc_gridfs_t *gridfs, const bson_t *data) { mongoc_gridfs_file_t *file; const bson_value_t *value; const char *key; bson_iter_t iter; const uint8_t *buf; uint32_t buf_len; ENTRY; BSON_ASSERT(gridfs); BSON_ASSERT(data); file = BSON_ALIGNED_ALLOC0(mongoc_gridfs_file_t); file->gridfs = gridfs; bson_copy_to(data, &file->bson); if (!bson_iter_init(&iter, &file->bson)) { GOTO(failure); } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (0 == strcmp(key, "_id")) { value = bson_iter_value(&iter); bson_value_copy(value, &file->files_id); } else if (0 == strcmp(key, "length")) { if (!BSON_ITER_HOLDS_NUMBER(&iter)) { GOTO(failure); } file->length = bson_iter_as_int64(&iter); } else if (0 == strcmp(key, "chunkSize")) { if (!BSON_ITER_HOLDS_NUMBER(&iter)) { GOTO(failure); } if (bson_iter_as_int64(&iter) > INT32_MAX) { GOTO(failure); } file->chunk_size = (int32_t)bson_iter_as_int64(&iter); } else if (0 == strcmp(key, "uploadDate")) { if (!BSON_ITER_HOLDS_DATE_TIME(&iter)) { GOTO(failure); } file->upload_date = bson_iter_date_time(&iter); } else if (0 == strcmp(key, "md5")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(failure); } file->bson_md5 = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp(key, "filename")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(failure); } file->bson_filename = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp(key, "contentType")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(failure); } file->bson_content_type = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp(key, "aliases")) { if (!BSON_ITER_HOLDS_ARRAY(&iter)) { GOTO(failure); } bson_iter_array(&iter, &buf_len, &buf); if (!bson_init_static(&file->bson_aliases, buf, buf_len)) { GOTO(failure); } } else if (0 == strcmp(key, "metadata")) { if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { GOTO(failure); } bson_iter_document(&iter, &buf_len, &buf); if (!bson_init_static(&file->bson_metadata, buf, buf_len)) { GOTO(failure); } } } /* TODO: is there are a minimal object we should be verifying that we * actually have here? */ RETURN(file); failure: bson_destroy(&file->bson); RETURN(NULL); } /** * _mongoc_gridfs_file_new: * * Create a new empty gridfs file */ mongoc_gridfs_file_t * _mongoc_gridfs_file_new(mongoc_gridfs_t *gridfs, mongoc_gridfs_file_opt_t *opt) { mongoc_gridfs_file_t *file; mongoc_gridfs_file_opt_t default_opt = {0}; ENTRY; BSON_ASSERT(gridfs); if (!opt) { opt = &default_opt; } file = BSON_ALIGNED_ALLOC0(mongoc_gridfs_file_t); file->gridfs = gridfs; file->is_dirty = 1; if (opt->chunk_size) { file->chunk_size = opt->chunk_size; } else { /* * The default chunk size is now 255kb. This used to be 256k but has been * reduced to allow for them to fit within power of two sizes in mongod. * * See CDRIVER-322. */ file->chunk_size = (1 << 18) - 1024; } file->files_id.value_type = BSON_TYPE_OID; bson_oid_init(&file->files_id.value.v_oid, NULL); file->upload_date = _mongoc_get_real_time_ms(); if (opt->md5) { file->md5 = bson_strdup(opt->md5); } if (opt->filename) { file->filename = bson_strdup(opt->filename); } if (opt->content_type) { file->content_type = bson_strdup(opt->content_type); } if (opt->aliases) { bson_copy_to(opt->aliases, &(file->aliases)); } if (opt->metadata) { bson_copy_to(opt->metadata, &(file->metadata)); } file->pos = 0; file->n = 0; RETURN(file); } void mongoc_gridfs_file_destroy(mongoc_gridfs_file_t *file) { ENTRY; if (!file) { EXIT; } if (file->page) { _mongoc_gridfs_file_page_destroy(file->page); } if (file->bson.len) { bson_destroy(&file->bson); } if (file->cursor) { mongoc_cursor_destroy(file->cursor); } if (file->files_id.value_type) { bson_value_destroy(&file->files_id); } if (file->md5) { bson_free(file->md5); } if (file->filename) { bson_free(file->filename); } if (file->content_type) { bson_free(file->content_type); } if (file->aliases.len) { bson_destroy(&file->aliases); } if (file->bson_aliases.len) { bson_destroy(&file->bson_aliases); } if (file->metadata.len) { bson_destroy(&file->metadata); } if (file->bson_metadata.len) { bson_destroy(&file->bson_metadata); } bson_free(file); EXIT; } /** readv against a gridfs file * timeout_msec is unused */ ssize_t mongoc_gridfs_file_readv( mongoc_gridfs_file_t *file, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, uint32_t timeout_msec) { uint32_t bytes_read = 0; int32_t r; size_t i; uint32_t iov_pos; ENTRY; BSON_UNUSED(timeout_msec); BSON_ASSERT(file); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); /* Reading when positioned past the end does nothing */ if (mlib_cmp(file->pos, >=, file->length)) { return 0; } /* Try to get the current chunk */ if (!file->page && !_mongoc_gridfs_file_refresh_page(file)) { return -1; } for (i = 0; i < iovcnt; i++) { iov_pos = 0; for (;;) { r = _mongoc_gridfs_file_page_read( file->page, (uint8_t *)iov[i].iov_base + iov_pos, (uint32_t)(iov[i].iov_len - iov_pos)); BSON_ASSERT(r >= 0); iov_pos += r; file->pos += r; bytes_read += r; if (iov_pos == iov[i].iov_len) { /* filled a bucket, keep going */ break; } else if (mlib_cmp(file->length, ==, file->pos)) { /* we're at the end of the file. So we're done */ RETURN(bytes_read); } else if (bytes_read >= min_bytes) { /* we need a new page, but we've read enough bytes to stop */ RETURN(bytes_read); } else if (!_mongoc_gridfs_file_refresh_page(file)) { return -1; } } } RETURN(bytes_read); } /** writev against a gridfs file * timeout_msec is unused */ ssize_t mongoc_gridfs_file_writev(mongoc_gridfs_file_t *file, const mongoc_iovec_t *iov, size_t iovcnt, uint32_t timeout_msec) { uint32_t bytes_written = 0; int32_t r; size_t i; uint32_t iov_pos; ENTRY; BSON_UNUSED(timeout_msec); BSON_ASSERT(file); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); /* Pull in the correct page */ if (!file->page && !_mongoc_gridfs_file_refresh_page(file)) { return -1; } /* When writing past the end-of-file, fill the gap with zeros */ if (mlib_cmp(file->pos, >, file->length) && !_mongoc_gridfs_file_extend(file)) { return -1; } for (i = 0; i < iovcnt; i++) { iov_pos = 0; for (;;) { if (!file->page && !_mongoc_gridfs_file_refresh_page(file)) { return -1; } /* write bytes until an iov is exhausted or the page is full */ r = _mongoc_gridfs_file_page_write( file->page, (uint8_t *)iov[i].iov_base + iov_pos, (uint32_t)(iov[i].iov_len - iov_pos)); BSON_ASSERT(r >= 0); iov_pos += r; file->pos += r; bytes_written += r; file->length = BSON_MAX(file->length, (int64_t)file->pos); if (iov_pos == iov[i].iov_len) { /** filled a bucket, keep going */ break; } else { /** flush the buffer, the next pass through will bring in a new page */ if (!_mongoc_gridfs_file_flush_page(file)) { return -1; } } } } file->is_dirty = 1; RETURN(bytes_written); } /** * _mongoc_gridfs_file_extend: * * Extend a GridFS file to the current position pointer. Zeros will be * appended to the end of the file until file->length is even with * file->pos. * * If file->length >= file->pos, the function exits successfully with no * operation performed. * * Parameters: * @file: A mongoc_gridfs_file_t. * * Returns: * The number of zero bytes written, or -1 on failure. */ static ssize_t _mongoc_gridfs_file_extend(mongoc_gridfs_file_t *file) { ENTRY; BSON_ASSERT(file); if (mlib_cmp(file->length, >=, file->pos)) { RETURN(0); } const uint64_t target_length = file->pos; BSON_ASSERT(mlib_in_range(uint64_t, file->length)); const uint64_t diff = file->pos - (uint64_t)file->length; if (-1 == mongoc_gridfs_file_seek(file, 0, SEEK_END)) { RETURN(-1); } while (true) { if (!file->page && !_mongoc_gridfs_file_refresh_page(file)) { RETURN(-1); } /* Set bytes until we reach the limit or fill a page */ { const uint64_t len = target_length - file->pos; BSON_ASSERT(mlib_in_range(uint32_t, len)); file->pos += _mongoc_gridfs_file_page_memset0(file->page, (uint32_t)len); } if (file->pos == target_length) { /* We're done */ break; } else if (!_mongoc_gridfs_file_flush_page(file)) { /* We tried to flush a full buffer, but an error occurred */ RETURN(-1); } } BSON_ASSERT(mlib_in_range(int64_t, target_length)); file->length = (int64_t)target_length; file->is_dirty = true; BSON_ASSERT(mlib_in_range(ssize_t, diff)); RETURN((ssize_t)diff); } /** * _mongoc_gridfs_file_flush_page: * * Unconditionally flushes the file's current page to the database. * The page to flush is determined by page->n. * * Side Effects: * * On success, file->page is properly destroyed and set to NULL. * * Returns: * * True on success; false otherwise. */ static bool _mongoc_gridfs_file_flush_page(mongoc_gridfs_file_t *file) { bson_t *selector, *update; bool r; const uint8_t *buf; uint32_t len; ENTRY; BSON_ASSERT(file); BSON_ASSERT(file->page); buf = _mongoc_gridfs_file_page_get_data(file->page); len = _mongoc_gridfs_file_page_get_len(file->page); selector = bson_new(); bson_append_value(selector, "files_id", -1, &file->files_id); bson_append_int32(selector, "n", -1, file->n); update = bson_sized_new(file->chunk_size + 100); bson_append_value(update, "files_id", -1, &file->files_id); bson_append_int32(update, "n", -1, file->n); bson_append_binary(update, "data", -1, BSON_SUBTYPE_BINARY, buf, len); r = mongoc_collection_update(file->gridfs->chunks, MONGOC_UPDATE_UPSERT, selector, update, NULL, &file->error); bson_destroy(selector); bson_destroy(update); if (r) { _mongoc_gridfs_file_page_destroy(file->page); file->page = NULL; r = mongoc_gridfs_file_save(file); } RETURN(r); } /** * _mongoc_gridfs_file_keep_cursor: * * After a seek, decide if the next read should use the current cursor or * start a new query. * * Preconditions: * * file has a cursor and cursor range. * * Side Effects: * * None. */ static bool _mongoc_gridfs_file_keep_cursor(mongoc_gridfs_file_t *file) { uint32_t chunk_no; uint32_t chunks_per_batch; if (file->n < 0 || file->chunk_size <= 0) { return false; } chunk_no = (uint32_t)file->n; /* server returns roughly 4 MB batches by default */ chunks_per_batch = (4 * 1024 * 1024) / (uint32_t)file->chunk_size; return ( /* cursor is on or before the desired chunk */ file->cursor_range[0] <= chunk_no && /* chunk_no is before end of file */ chunk_no <= file->cursor_range[1] && /* desired chunk is in this batch or next one */ chunk_no < file->cursor_range[0] + 2 * chunks_per_batch); } static int64_t divide_round_up(int64_t num, int64_t denom) { return (num + denom - 1) / denom; } static void missing_chunk(mongoc_gridfs_file_t *file) { _mongoc_set_error( &file->error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "missing chunk number %" PRId32, file->n); if (file->cursor) { mongoc_cursor_destroy(file->cursor); file->cursor = NULL; } } /** * _mongoc_gridfs_file_refresh_page: * * Refresh a GridFS file's underlying page. This recalculates the current * page number based on the file's stream position, then fetches that page * from the database. * * Note that this fetch is unconditional and the page is queried from the * database even if the current page covers the same theoretical chunk. * * * Side Effects: * * file->page is loaded with the appropriate buffer, fetched from the * database. If the file position is at the end of the file and on a new * chunk boundary, a new page is created. If the position is far past the * end of the file, _mongoc_gridfs_file_extend is responsible for creating * chunks to file the gap. * * file->n is set based on file->pos. file->error is set on error. */ static bool _mongoc_gridfs_file_refresh_page(mongoc_gridfs_file_t *file) { const uint8_t *data = NULL; uint32_t len = 0u; ENTRY; BSON_ASSERT(file); file->n = (int32_t)(file->pos / file->chunk_size); if (file->page) { _mongoc_gridfs_file_page_destroy(file->page); file->page = NULL; } /* if the file pointer is past the end of the current file (i.e. pointing to * a new chunk), we'll pass the page constructor a new empty page. */ const int64_t existing_chunks = divide_round_up(file->length, file->chunk_size); const int64_t required_chunks = divide_round_up(file->pos + 1, file->chunk_size); if (required_chunks > existing_chunks) { data = (uint8_t *)""; len = 0; } else { /* if we have a cursor, but the cursor doesn't have the chunk we're going * to need, destroy it (we'll grab a new one immediately there after) */ if (file->cursor && !_mongoc_gridfs_file_keep_cursor(file)) { mongoc_cursor_destroy(file->cursor); file->cursor = NULL; } if (!file->cursor) { bson_t query; bson_init(&query); BSON_APPEND_VALUE(&query, "files_id", &file->files_id); bson_t child; BSON_APPEND_DOCUMENT_BEGIN(&query, "n", &child); BSON_APPEND_INT32(&child, "$gte", file->n); bson_append_document_end(&query, &child); bson_t opts; bson_init(&opts); BSON_APPEND_DOCUMENT_BEGIN(&opts, "sort", &child); BSON_APPEND_INT32(&child, "n", 1); bson_append_document_end(&opts, &child); BSON_APPEND_DOCUMENT_BEGIN(&opts, "projection", &child); BSON_APPEND_INT32(&child, "n", 1); BSON_APPEND_INT32(&child, "data", 1); BSON_APPEND_INT32(&child, "_id", 0); bson_append_document_end(&opts, &child); /* find all chunks greater than or equal to our current file pos */ file->cursor = mongoc_collection_find_with_opts(file->gridfs->chunks, &query, &opts, NULL); file->cursor_range[0] = file->n; file->cursor_range[1] = (uint32_t)(file->length / file->chunk_size); bson_destroy(&query); bson_destroy(&opts); BSON_ASSERT(file->cursor); } const bson_t *chunk = NULL; /* we might have had a cursor before, then seeked ahead past a chunk. * iterate until we're on the right chunk */ while (mlib_cmp(file->cursor_range[0], <=, file->n)) { if (!mongoc_cursor_next(file->cursor, &chunk)) { /* copy cursor error; if there's none, we're missing a chunk */ if (!mongoc_cursor_error(file->cursor, &file->error)) { missing_chunk(file); } RETURN(0); } file->cursor_range[0]++; } bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, chunk)); /* grab out what we need from the chunk */ while (bson_iter_next(&iter)) { const char *const key = bson_iter_key(&iter); if (strcmp(key, "n") == 0) { if (file->n != bson_iter_int32(&iter)) { missing_chunk(file); RETURN(0); } } else if (strcmp(key, "data") == 0) { bson_iter_binary(&iter, NULL, &len, &data); // If this not the last chunk, ensure length is equal to chunk size. bool is_last_chunk = ((file->n + 1) == existing_chunks); // If this is not the last chunk, error. if (!is_last_chunk && mlib_cmp(len, !=, file->chunk_size)) { _mongoc_set_error(&file->error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "corrupt chunk number %" PRId32 ": not equal to chunk size: %" PRId32, file->n, file->chunk_size); RETURN(0); } } else { /* Unexpected key. This should never happen */ RETURN(0); } } if (mlib_cmp(file->n, !=, file->pos / file->chunk_size)) { return 0; } } if (!data) { _mongoc_set_error(&file->error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "corrupt chunk number %" PRId32 ": no data", file->n); RETURN(0); } if (mlib_cmp(len, >, file->chunk_size)) { _mongoc_set_error(&file->error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "corrupt chunk number %" PRId32 ": greater than chunk size: %" PRId32, file->n, file->chunk_size); RETURN(0); } file->page = _mongoc_gridfs_file_page_new(data, len, file->chunk_size); /* seek in the page towards wherever we're supposed to be */ RETURN(_mongoc_gridfs_file_page_seek(file->page, file->pos % file->chunk_size)); } /** * mongoc_gridfs_file_seek: * * Adjust the file position pointer in `file` by `delta`, starting from the * position `whence`. The `whence` argument is interpreted as in fseek(2): * * SEEK_SET Set the position relative to the start of the file. * SEEK_CUR Move `delta` from the current file position. * SEEK_END Move `delta` from the end-of-file. * * Parameters: * * @file: A mongoc_gridfs_file_t. * @delta: The amount to move. May be positive or negative. * @whence: One of SEEK_SET, SEEK_CUR or SEEK_END. * * Errors: * * [EINVAL] `whence` is not one of SEEK_SET, SEEK_CUR or SEEK_END. * [EINVAL] Resulting file position would be negative. * * Side Effects: * * On success, the file's underlying position pointer is set appropriately. * On failure, the file position is NOT changed and errno is set. * * Returns: * * 0 on success. * -1 on error, and errno set to indicate the error. */ int mongoc_gridfs_file_seek(mongoc_gridfs_file_t *file, int64_t delta, int whence) { int64_t offset; BSON_ASSERT(file); switch (whence) { case SEEK_SET: offset = delta; break; case SEEK_CUR: BSON_ASSERT(mlib_in_range(int64_t, file->pos)); offset = (int64_t)file->pos + delta; break; case SEEK_END: offset = file->length + delta; break; default: errno = EINVAL; return -1; } if (offset < 0) { errno = EINVAL; return -1; } if (offset / file->chunk_size != file->n) { /** no longer on the same page */ if (file->page) { if (_mongoc_gridfs_file_page_is_dirty(file->page)) { if (!_mongoc_gridfs_file_flush_page(file)) { return -1; } } else { _mongoc_gridfs_file_page_destroy(file->page); file->page = NULL; } } /** we'll pick up the seek when we fetch a page on the next action. We * lazily load */ } else if (file->page) { const int64_t n = offset % file->chunk_size; BSON_ASSERT(mlib_in_range(uint32_t, n)); BSON_ASSERT(_mongoc_gridfs_file_page_seek(file->page, (uint32_t)n)); } file->pos = (uint64_t)offset; BSON_ASSERT(mlib_in_range(uint64_t, file->chunk_size)); const uint64_t n = file->pos / (uint64_t)file->chunk_size; BSON_ASSERT(mlib_in_range(int32_t, n)); file->n = (int32_t)n; return 0; } uint64_t mongoc_gridfs_file_tell(mongoc_gridfs_file_t *file) { BSON_ASSERT(file); return file->pos; } bool mongoc_gridfs_file_error(mongoc_gridfs_file_t *file, bson_error_t *error) { BSON_ASSERT(file); BSON_ASSERT(error); if (BSON_UNLIKELY(file->error.domain)) { if (error) { *error = file->error; } RETURN(true); } RETURN(false); } const bson_value_t * mongoc_gridfs_file_get_id(mongoc_gridfs_file_t *file) { BSON_ASSERT(file); return &file->files_id; } int64_t mongoc_gridfs_file_get_length(mongoc_gridfs_file_t *file) { BSON_ASSERT(file); return file->length; } int32_t mongoc_gridfs_file_get_chunk_size(mongoc_gridfs_file_t *file) { BSON_ASSERT(file); return file->chunk_size; } int64_t mongoc_gridfs_file_get_upload_date(mongoc_gridfs_file_t *file) { BSON_ASSERT(file); return file->upload_date; } bool mongoc_gridfs_file_remove(mongoc_gridfs_file_t *file, bson_error_t *error) { bson_t sel = BSON_INITIALIZER; bool ret = false; BSON_ASSERT(file); BSON_APPEND_VALUE(&sel, "_id", &file->files_id); if (!mongoc_collection_delete_one(file->gridfs->files, &sel, NULL, NULL, error)) { goto cleanup; } bson_reinit(&sel); BSON_APPEND_VALUE(&sel, "files_id", &file->files_id); if (!mongoc_collection_delete_many(file->gridfs->chunks, &sel, NULL, NULL, error)) { goto cleanup; } ret = true; cleanup: bson_destroy(&sel); return ret; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-file.h000066400000000000000000000064231511661753600250210ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_FILE_H #define MONGOC_GRIDFS_FILE_H #include #include #include BSON_BEGIN_DECLS #define MONGOC_GRIDFS_FILE_STR_HEADER(name) \ MONGOC_EXPORT(const char *) \ mongoc_gridfs_file_get_##name(mongoc_gridfs_file_t *file); \ MONGOC_EXPORT(void) \ mongoc_gridfs_file_set_##name(mongoc_gridfs_file_t *file, const char *str); #define MONGOC_GRIDFS_FILE_BSON_HEADER(name) \ MONGOC_EXPORT(const bson_t *) \ mongoc_gridfs_file_get_##name(mongoc_gridfs_file_t *file); \ MONGOC_EXPORT(void) \ mongoc_gridfs_file_set_##name(mongoc_gridfs_file_t *file, const bson_t *bson); typedef struct _mongoc_gridfs_file_t mongoc_gridfs_file_t; typedef struct _mongoc_gridfs_file_opt_t mongoc_gridfs_file_opt_t; struct _mongoc_gridfs_file_opt_t { const char *md5; const char *filename; const char *content_type; const bson_t *aliases; const bson_t *metadata; uint32_t chunk_size; }; MONGOC_GRIDFS_FILE_STR_HEADER(md5) MONGOC_GRIDFS_FILE_STR_HEADER(filename) MONGOC_GRIDFS_FILE_STR_HEADER(content_type) MONGOC_GRIDFS_FILE_BSON_HEADER(aliases) MONGOC_GRIDFS_FILE_BSON_HEADER(metadata) MONGOC_EXPORT(const bson_value_t *) mongoc_gridfs_file_get_id(mongoc_gridfs_file_t *file); MONGOC_EXPORT(int64_t) mongoc_gridfs_file_get_length(mongoc_gridfs_file_t *file); MONGOC_EXPORT(int32_t) mongoc_gridfs_file_get_chunk_size(mongoc_gridfs_file_t *file); MONGOC_EXPORT(int64_t) mongoc_gridfs_file_get_upload_date(mongoc_gridfs_file_t *file); MONGOC_EXPORT(ssize_t) mongoc_gridfs_file_writev(mongoc_gridfs_file_t *file, const mongoc_iovec_t *iov, size_t iovcnt, uint32_t timeout_msec); MONGOC_EXPORT(ssize_t) mongoc_gridfs_file_readv( mongoc_gridfs_file_t *file, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, uint32_t timeout_msec); MONGOC_EXPORT(int) mongoc_gridfs_file_seek(mongoc_gridfs_file_t *file, int64_t delta, int whence); MONGOC_EXPORT(uint64_t) mongoc_gridfs_file_tell(mongoc_gridfs_file_t *file); MONGOC_EXPORT(bool) mongoc_gridfs_file_set_id(mongoc_gridfs_file_t *file, const bson_value_t *id, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_gridfs_file_save(mongoc_gridfs_file_t *file); MONGOC_EXPORT(void) mongoc_gridfs_file_destroy(mongoc_gridfs_file_t *file); MONGOC_EXPORT(bool) mongoc_gridfs_file_error(mongoc_gridfs_file_t *file, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_gridfs_file_remove(mongoc_gridfs_file_t *file, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_GRIDFS_FILE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs-private.h000066400000000000000000000023071511661753600255510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_PRIVATE_H #define MONGOC_GRIDFS_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include BSON_BEGIN_DECLS struct _mongoc_gridfs_t { mongoc_client_t *client; mongoc_collection_t *files; mongoc_collection_t *chunks; }; mongoc_gridfs_t * _mongoc_gridfs_new(mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_GRIDFS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs.c000066400000000000000000000250161511661753600240760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "gridfs" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MONGOC_GRIDFS_STREAM_CHUNK 4096 /** * _mongoc_gridfs_ensure_index: * * ensure gridfs indexes * * Ensure fast searches for chunks via [ files_id, n ] * Ensure fast searches for files via [ filename ] */ static bool _mongoc_gridfs_ensure_index(mongoc_gridfs_t *gridfs, bson_error_t *error) { bson_t keys; bson_t opts; bool r; ENTRY; bson_init(&opts); BSON_APPEND_BOOL(&opts, "unique", true); bson_init(&keys); BSON_APPEND_INT32(&keys, "files_id", 1); BSON_APPEND_INT32(&keys, "n", 1); r = _mongoc_collection_create_index_if_not_exists(gridfs->chunks, &keys, &opts, error); bson_destroy(&opts); bson_destroy(&keys); if (!r) { RETURN(r); } bson_init(&keys); BSON_APPEND_INT32(&keys, "filename", 1); BSON_APPEND_INT32(&keys, "uploadDate", 1); r = _mongoc_collection_create_index_if_not_exists(gridfs->files, &keys, NULL, error); bson_destroy(&keys); if (!r) { RETURN(r); } RETURN(1); } mongoc_gridfs_t * _mongoc_gridfs_new(mongoc_client_t *client, const char *db, const char *prefix, bson_error_t *error) { mongoc_gridfs_t *gridfs; char buf[128]; bool r; uint32_t prefix_len; ENTRY; BSON_ASSERT_PARAM(client); BSON_ASSERT(db); if (!prefix) { prefix = "fs"; } /* make sure prefix is short enough to bucket the chunks and files * collections */ prefix_len = (uint32_t)strlen(prefix); BSON_ASSERT(prefix_len + sizeof(".chunks") < sizeof(buf)); gridfs = (mongoc_gridfs_t *)bson_malloc0(sizeof *gridfs); gridfs->client = client; // Expect no truncation from above, checking no error occurred. int req = bson_snprintf(buf, sizeof(buf), "%s.chunks", prefix); BSON_ASSERT(req > 0); gridfs->chunks = mongoc_client_get_collection(client, db, buf); req = bson_snprintf(buf, sizeof(buf), "%s.files", prefix); BSON_ASSERT(req > 0); gridfs->files = mongoc_client_get_collection(client, db, buf); r = _mongoc_gridfs_ensure_index(gridfs, error); if (!r) { mongoc_gridfs_destroy(gridfs); RETURN(NULL); } RETURN(gridfs); } bool mongoc_gridfs_drop(mongoc_gridfs_t *gridfs, bson_error_t *error) { bool r; ENTRY; r = mongoc_collection_drop(gridfs->files, error); if (!r) { RETURN(0); } r = mongoc_collection_drop(gridfs->chunks, error); if (!r) { RETURN(0); } RETURN(1); } void mongoc_gridfs_destroy(mongoc_gridfs_t *gridfs) { ENTRY; if (!gridfs) { EXIT; } mongoc_collection_destroy(gridfs->files); mongoc_collection_destroy(gridfs->chunks); bson_free(gridfs); EXIT; } /** find all matching gridfs files */ mongoc_gridfs_file_list_t * mongoc_gridfs_find_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts) { return _mongoc_gridfs_file_list_new_with_opts(gridfs, filter, opts); } /** find a single gridfs file */ mongoc_gridfs_file_t * mongoc_gridfs_find_one_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts, bson_error_t *error) { mongoc_gridfs_file_list_t *list; mongoc_gridfs_file_t *file; bson_t new_opts; ENTRY; bson_init(&new_opts); if (opts) { bson_copy_to_excluding_noinit(opts, &new_opts, "limit", (char *)NULL); } BSON_APPEND_INT32(&new_opts, "limit", 1); list = _mongoc_gridfs_file_list_new_with_opts(gridfs, filter, &new_opts); file = mongoc_gridfs_file_list_next(list); if (!mongoc_gridfs_file_list_error(list, error) && error) { /* no error, but an error out-pointer was provided - clear it */ memset(error, 0, sizeof(*error)); } mongoc_gridfs_file_list_destroy(list); bson_destroy(&new_opts); RETURN(file); } /** find a single gridfs file by filename */ mongoc_gridfs_file_t * mongoc_gridfs_find_one_by_filename(mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error) { mongoc_gridfs_file_t *file; bson_t filter; bson_init(&filter); bson_append_utf8(&filter, "filename", -1, filename, -1); file = mongoc_gridfs_find_one_with_opts(gridfs, &filter, NULL, error); bson_destroy(&filter); return file; } /** create a gridfs file from a stream * * The stream is fully consumed in creating the file */ mongoc_gridfs_file_t * mongoc_gridfs_create_file_from_stream(mongoc_gridfs_t *gridfs, mongoc_stream_t *stream, mongoc_gridfs_file_opt_t *opt) { mongoc_gridfs_file_t *file; ssize_t r; uint8_t buf[MONGOC_GRIDFS_STREAM_CHUNK]; mongoc_iovec_t iov; int timeout; ENTRY; BSON_ASSERT(gridfs); BSON_ASSERT(stream); iov.iov_base = (void *)buf; iov.iov_len = 0; file = _mongoc_gridfs_file_new(gridfs, opt); timeout = gridfs->client->cluster.sockettimeoutms; for (;;) { r = mongoc_stream_read(stream, iov.iov_base, MONGOC_GRIDFS_STREAM_CHUNK, 0, timeout); if (r > 0) { iov.iov_len = r; if (mongoc_gridfs_file_writev(file, &iov, 1, timeout) < 0) { MONGOC_ERROR("%s", file->error.message); mongoc_gridfs_file_destroy(file); RETURN(NULL); } } else if (r == 0) { break; } else { MONGOC_ERROR("Error reading from GridFS file source stream"); mongoc_gridfs_file_destroy(file); RETURN(NULL); } } mongoc_stream_failed(stream); if (-1 == mongoc_gridfs_file_seek(file, 0, SEEK_SET)) { MONGOC_ERROR("%s", file->error.message); mongoc_gridfs_file_destroy(file); RETURN(NULL); } RETURN(file); } /** create an empty gridfs file */ mongoc_gridfs_file_t * mongoc_gridfs_create_file(mongoc_gridfs_t *gridfs, mongoc_gridfs_file_opt_t *opt) { mongoc_gridfs_file_t *file; ENTRY; BSON_ASSERT(gridfs); file = _mongoc_gridfs_file_new(gridfs, opt); RETURN(file); } /** accessor functions for collections */ mongoc_collection_t * mongoc_gridfs_get_files(mongoc_gridfs_t *gridfs) { BSON_ASSERT(gridfs); return gridfs->files; } mongoc_collection_t * mongoc_gridfs_get_chunks(mongoc_gridfs_t *gridfs) { BSON_ASSERT(gridfs); return gridfs->chunks; } bool mongoc_gridfs_remove_by_filename(mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error) { mongoc_bulk_operation_t *bulk_files = NULL; mongoc_bulk_operation_t *bulk_chunks = NULL; mongoc_cursor_t *cursor = NULL; bson_error_t files_error; bson_error_t chunks_error; const bson_t *doc; const char *key; char keybuf[16]; int count = 0; bool chunks_ret; bool files_ret; bool ret = false; bson_iter_t iter; bson_t *files_q = NULL; bson_t *chunks_q = NULL; bson_t find_filter = BSON_INITIALIZER; bson_t find_opts = BSON_INITIALIZER; bson_t find_opts_project; bson_t ar = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; BSON_ASSERT(gridfs); if (!filename) { _mongoc_set_error( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_INVALID_FILENAME, "A non-NULL filename must be specified."); return false; } /* * Find all files matching this filename. Hopefully just one, but not * strictly required! */ BSON_APPEND_UTF8(&find_filter, "filename", filename); BSON_APPEND_DOCUMENT_BEGIN(&find_opts, "projection", &find_opts_project); BSON_APPEND_INT32(&find_opts_project, "_id", 1); bson_append_document_end(&find_opts, &find_opts_project); cursor = _mongoc_cursor_find_new(gridfs->client, gridfs->files->ns, &find_filter, &find_opts, NULL /* user_prefs */, NULL /* default_prefs */, NULL /* read_concern */); BSON_ASSERT(cursor); while (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init_find(&iter, doc, "_id")) { const bson_value_t *value = bson_iter_value(&iter); bson_uint32_to_string(count, &key, keybuf, sizeof keybuf); BSON_APPEND_VALUE(&ar, key, value); } } if (mongoc_cursor_error(cursor, error)) { goto failure; } bson_append_bool(&opts, "ordered", 7, false); bulk_files = mongoc_collection_create_bulk_operation_with_opts(gridfs->files, &opts); bulk_chunks = mongoc_collection_create_bulk_operation_with_opts(gridfs->chunks, &opts); bson_destroy(&opts); files_q = BCON_NEW("_id", "{", "$in", BCON_ARRAY(&ar), "}"); chunks_q = BCON_NEW("files_id", "{", "$in", BCON_ARRAY(&ar), "}"); mongoc_bulk_operation_remove(bulk_files, files_q); mongoc_bulk_operation_remove(bulk_chunks, chunks_q); files_ret = mongoc_bulk_operation_execute(bulk_files, NULL, &files_error); chunks_ret = mongoc_bulk_operation_execute(bulk_chunks, NULL, &chunks_error); if (error) { if (!files_ret) { memcpy(error, &files_error, sizeof *error); } else if (!chunks_ret) { memcpy(error, &chunks_error, sizeof *error); } } ret = (files_ret && chunks_ret); failure: if (cursor) { mongoc_cursor_destroy(cursor); } if (bulk_files) { mongoc_bulk_operation_destroy(bulk_files); } if (bulk_chunks) { mongoc_bulk_operation_destroy(bulk_chunks); } bson_destroy(&find_filter); bson_destroy(&find_opts); bson_destroy(&ar); if (files_q) { bson_destroy(files_q); } if (chunks_q) { bson_destroy(chunks_q); } return ret; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-gridfs.h000066400000000000000000000044671511661753600241120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_GRIDFS_H #define MONGOC_GRIDFS_H #include #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_gridfs_t mongoc_gridfs_t; MONGOC_EXPORT(mongoc_gridfs_file_t *) mongoc_gridfs_create_file_from_stream(mongoc_gridfs_t *gridfs, mongoc_stream_t *stream, mongoc_gridfs_file_opt_t *opt) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_gridfs_file_t *) mongoc_gridfs_create_file(mongoc_gridfs_t *gridfs, mongoc_gridfs_file_opt_t *opt) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_gridfs_file_list_t *) mongoc_gridfs_find_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_gridfs_file_t *) mongoc_gridfs_find_one_with_opts(mongoc_gridfs_t *gridfs, const bson_t *filter, const bson_t *opts, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_gridfs_file_t *) mongoc_gridfs_find_one_by_filename(mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_gridfs_drop(mongoc_gridfs_t *gridfs, bson_error_t *error); MONGOC_EXPORT(void) mongoc_gridfs_destroy(mongoc_gridfs_t *gridfs); MONGOC_EXPORT(mongoc_collection_t *) mongoc_gridfs_get_files(mongoc_gridfs_t *gridfs); MONGOC_EXPORT(mongoc_collection_t *) mongoc_gridfs_get_chunks(mongoc_gridfs_t *gridfs); MONGOC_EXPORT(bool) mongoc_gridfs_remove_by_filename(mongoc_gridfs_t *gridfs, const char *filename, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_GRIDFS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-handshake-compiler-private.h000066400000000000000000000044101511661753600300260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HANDSHAKE_COMPILER_PRIVATE_H #define MONGOC_HANDSHAKE_COMPILER_PRIVATE_H #include #include /* * Thanks to: * http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros */ #if defined(__clang__) #define MONGOC_COMPILER "clang" #define MONGOC_COMPILER_VERSION __clang_version__ #elif defined(__ICC) || defined(__INTEL_COMPILER) #define MONGOC_COMPILER "ICC" #define MONGOC_COMPILER_VERSION __VERSION__ #elif defined(__GNUC__) || defined(__GNUG__) #define MONGOC_COMPILER "GCC" #define MONGOC_COMPILER_VERSION __VERSION__ #elif defined(__HP_cc) || defined(__HP_aCC) #define MONGOC_COMPILER "aCC" #define MONGOC_COMPILER_VERSION MONGOC_EVALUATE_STR(__HP_cc) #elif defined(__IBMC__) || defined(__IBMCPP__) #define MONGOC_COMPILER "xlc" #define MONGOC_COMPILER_VERSION __xlc__ #elif defined(_MSC_VER) #define MONGOC_COMPILER "MSVC" #define MONGOC_COMPILER_VERSION MONGOC_EVALUATE_STR(_MSC_VER) #elif defined(__PGI) #define MONGOC_COMPILER "Portland PGCC" #define MONGOC_COMPILER_VERSION \ MONGOC_EVALUATE_STR(__PGIC__) \ "." MONGOC_EVALUATE_STR(__PGIC_MINOR) "." MONGOC_EVALUATE_STR(__PGIC_PATCHLEVEL__) #elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) #define MONGOC_COMPILER "Solaris Studio" #define MONGOC_COMPILER_VERSION MONGOC_EVALUATE_STR(__SUNPRO_C) #elif defined(__PCC__) /* Portable C Compiler. Version may not be available */ #define MONGOC_COMPILER "PCC" #else #define MONGOC_COMPILER MONGOC_EVALUATE_STR(MONGOC_CC) /* Not defining COMPILER_VERSION. We'll fall back to values set at * configure-time */ #endif #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-handshake-os-private.h000066400000000000000000000054131511661753600266410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HANDSHAKE_OS_PRIVATE #define MONGOC_HANDSHAKE_OS_PRIVATE /* Based on tables from * http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system */ #if defined(_WIN32) || defined(__CYGWIN__) #define MONGOC_OS_TYPE "Windows" #if defined(__CYGWIN__) #define MONGOC_OS_NAME "Cygwin" #else #define MONGOC_OS_NAME "Windows" #endif /* osx and iphone defines __APPLE__ and __MACH__, but not __unix__ */ #elif defined(__APPLE__) && defined(__MACH__) && !defined(__unix__) #define MONGOC_OS_TYPE "Darwin" #include #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR == 1 #define MONGOC_OS_NAME "iOS Simulator" #elif defined(TARGET_OS_IOS) && TARGET_OS_IOS == 1 #define MONGOC_OS_NAME "iOS" #elif defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1 #define MONGOC_OS_NAME "macOS" #elif defined(TARGET_OS_TV) && TARGET_OS_TV == 1 #define MONGOC_OS_NAME "tvOS" #elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1 #define MONGOC_OS_NAME "watchOS" #else /* Fall back to uname () */ #endif /* Need to check if __unix is defined since sun and hpux always have __unix, * but not necessarily __unix__ defined. */ #elif defined(__unix__) || defined(__unix) #include #if defined(__linux__) #define MONGOC_OS_IS_LINUX #if defined(__ANDROID__) #define MONGOC_OS_TYPE "Linux (Android)" #else #define MONGOC_OS_TYPE "Linux" #endif /* Don't define OS_NAME. We'll scan the file system to determine distro. */ #elif defined(BSD) #define MONGOC_OS_TYPE "BSD" #if defined(__FreeBSD__) #define MONGOC_OS_NAME "FreeBSD" #elif defined(__NetBSD__) #define MONGOC_OS_NAME "NetBSD" #elif defined(__OpenBSD__) #define MONGOC_OS_NAME "OpenBSD" #elif defined(__DragonFly__) #define MONGOC_OS_NAME "DragonFlyBSD" #else /* Don't define OS_NAME. We'll use uname to figure it out. */ #endif #else #define MONGOC_OS_TYPE "Unix" #if defined(_AIX) #define MONGOC_OS_NAME "AIX" #elif defined(__sun) && defined(__SVR4) #define MONGOC_OS_NAME "Solaris" #elif defined(__hpux) #define MONGOC_OS_NAME "HP-UX" #else /* Don't set OS name. We'll just fall back to uname. */ #endif #endif #endif #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-handshake-private.h000066400000000000000000000113321511661753600262170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HANDSHAKE_PRIVATE_H #define MONGOC_HANDSHAKE_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS #define HANDSHAKE_FIELD "client" #define HANDSHAKE_PLATFORM_FIELD "platform" #define HANDSHAKE_MAX_SIZE 512 #define HANDSHAKE_OS_TYPE_MAX 32 #define HANDSHAKE_OS_NAME_MAX 32 #define HANDSHAKE_OS_VERSION_MAX 32 #define HANDSHAKE_OS_ARCHITECTURE_MAX 32 #define HANDSHAKE_DRIVER_NAME_MAX 64 #define HANDSHAKE_DRIVER_VERSION_MAX 32 #define HANDSHAKE_CMD_HELLO "hello" #define HANDSHAKE_RESPONSE_HELLO "helloOk" #define HANDSHAKE_CMD_LEGACY_HELLO "isMaster" #define HANDSHAKE_RESPONSE_LEGACY_HELLO "ismaster" /* platform has no fixed max size. It can just occupy the remaining * available space in the document. */ /* When adding a new field to mongoc-config.h.in, update this! */ typedef enum { /* The bit position (from the RHS) of each config flag. Do not reorder or change values. */ MONGOC_MD_FLAG_ENABLE_CRYPTO = 0, MONGOC_MD_FLAG_ENABLE_CRYPTO_CNG = 1, MONGOC_MD_FLAG_ENABLE_CRYPTO_COMMON_CRYPTO = 2, MONGOC_MD_FLAG_ENABLE_CRYPTO_LIBCRYPTO = 3, MONGOC_MD_FLAG_ENABLE_CRYPTO_SYSTEM_PROFILE = 4, MONGOC_MD_FLAG_ENABLE_SASL = 5, MONGOC_MD_FLAG_ENABLE_SSL = 6, MONGOC_MD_FLAG_ENABLE_SSL_OPENSSL = 7, MONGOC_MD_FLAG_ENABLE_SSL_SECURE_CHANNEL = 8, MONGOC_MD_FLAG_ENABLE_SSL_SECURE_TRANSPORT = 9, MONGOC_MD_FLAG_EXPERIMENTAL_FEATURES = 10, MONGOC_MD_FLAG_HAVE_SASL_CLIENT_DONE = 11, MONGOC_MD_FLAG_HAVE_WEAK_SYMBOLS = 12, MONGOC_MD_FLAG_NO_AUTOMATIC_GLOBALS_UNUSED = 13, // Removed in CDRIVER-1330. MONGOC_MD_FLAG_ENABLE_SSL_LIBRESSL_UNUSED = 14, // Removed in CDRIVER-5693. MONGOC_MD_FLAG_ENABLE_SASL_CYRUS = 15, MONGOC_MD_FLAG_ENABLE_SASL_SSPI = 16, MONGOC_MD_FLAG_HAVE_SOCKLEN = 17, MONGOC_MD_FLAG_ENABLE_COMPRESSION = 18, MONGOC_MD_FLAG_ENABLE_COMPRESSION_SNAPPY = 19, MONGOC_MD_FLAG_ENABLE_COMPRESSION_ZLIB = 20, MONGOC_MD_FLAG_ENABLE_SASL_GSSAPI_UNUSED = 21, /* CDRIVER-2654 removed this . */ MONGOC_MD_FLAG_ENABLE_RES_NSEARCH = 22, MONGOC_MD_FLAG_ENABLE_RES_NDESTROY = 23, MONGOC_MD_FLAG_ENABLE_RES_NCLOSE = 24, MONGOC_MD_FLAG_ENABLE_RES_SEARCH = 25, MONGOC_MD_FLAG_ENABLE_DNSAPI = 26, MONGOC_MD_FLAG_ENABLE_RDTSCP = 27, MONGOC_MD_FLAG_HAVE_SCHED_GETCPU = 28, MONGOC_MD_FLAG_ENABLE_SHM_COUNTERS = 29, MONGOC_MD_FLAG_TRACE = 30, MONGOC_MD_FLAG_ENABLE_ICU_UNUSED = 31, MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION = 32, MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH = 33, MONGOC_MD_FLAG_ENABLE_SRV = 34, MONGOC_MD_FLAG_HAVE_BCRYPT_PBKDF2 = 35, /* Add additional config flags here, above LAST_MONGOC_MD_FLAG. */ LAST_MONGOC_MD_FLAG } mongoc_handshake_config_flag_bit_t; typedef enum { MONGOC_HANDSHAKE_ENV_NONE, MONGOC_HANDSHAKE_ENV_AWS, MONGOC_HANDSHAKE_ENV_VERCEL, MONGOC_HANDSHAKE_ENV_GCP, MONGOC_HANDSHAKE_ENV_AZURE } mongoc_handshake_env_t; typedef struct _optional_int32 { bool set; int32_t value; } optional_int32; typedef struct _mongoc_handshake_t { char *os_type; char *os_name; char *os_version; char *os_architecture; char *driver_name; char *driver_version; char *platform; char *compiler_info; char *flags; bool docker; bool kubernetes; mongoc_handshake_env_t env; optional_int32 env_timeout_sec; optional_int32 env_memory_mb; char *env_region; bool frozen; } mongoc_handshake_t; void _mongoc_handshake_init(void); void _mongoc_handshake_cleanup(void); bson_t * _mongoc_handshake_build_doc_with_application(const char *application); void _mongoc_handshake_freeze(void); mongoc_handshake_t * _mongoc_handshake_get(void); bool _mongoc_handshake_appname_is_valid(const char *appname); typedef struct { bool scram_sha_256; bool scram_sha_1; } mongoc_handshake_sasl_supported_mechs_t; void _mongoc_handshake_append_sasl_supported_mechs(const mongoc_uri_t *uri, bson_t *hello); void _mongoc_handshake_parse_sasl_supported_mechs(const bson_t *hello, mongoc_handshake_sasl_supported_mechs_t *sasl_supported_mechs); BSON_END_DECLS #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-handshake.c000066400000000000000000000604411511661753600245470ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef _POSIX_VERSION #include #include #endif #ifdef _WIN32 #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Global handshake data instance. Initialized at startup from mongoc_init * * Can be modified by calls to mongoc_handshake_data_append */ static mongoc_handshake_t gMongocHandshake; /* * Used for thread-safety in mongoc_handshake_data_append */ static bson_mutex_t gHandshakeLock; static void _set_bit(uint8_t *bf, uint32_t byte_count, uint32_t bit) { uint32_t byte = bit / 8; uint32_t bit_of_byte = (bit) % 8; /* byte 0 is the last location in bf. */ bf[(byte_count - 1) - byte] |= 1u << bit_of_byte; } /* returns a hex string for all config flag bits, which must be freed. */ char * _mongoc_handshake_get_config_hex_string(void) { const uint32_t byte_count = (LAST_MONGOC_MD_FLAG + 7) / 8; /* ceil (num_bits / 8) */ /* allocate enough bytes to fit all config bits. */ uint8_t *const bf = (uint8_t *)bson_malloc0(byte_count); #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL _set_bit(bf, byte_count, MONGOC_ENABLE_SSL_SECURE_CHANNEL); #endif #ifdef MONGOC_ENABLE_CRYPTO_CNG _set_bit(bf, byte_count, MONGOC_ENABLE_CRYPTO_CNG); #endif #ifdef MONGOC_HAVE_BCRYPT_PBKDF2 _set_bit(bf, byte_count, MONGOC_MD_FLAG_HAVE_BCRYPT_PBKDF2); #endif #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SSL_SECURE_TRANSPORT); #endif #ifdef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_CRYPTO_COMMON_CRYPTO); #endif #ifdef MONGOC_ENABLE_SSL_OPENSSL _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SSL_OPENSSL); #endif #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_CRYPTO_LIBCRYPTO); #endif #ifdef MONGOC_ENABLE_SSL _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SSL); #endif #ifdef MONGOC_ENABLE_CRYPTO _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_CRYPTO); #endif #ifdef MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_CRYPTO_SYSTEM_PROFILE); #endif #ifdef MONGOC_ENABLE_SASL _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SASL); #endif #ifdef MONGOC_HAVE_SASL_CLIENT_DONE _set_bit(bf, byte_count, MONGOC_MD_FLAG_HAVE_SASL_CLIENT_DONE); #endif #ifdef MONGOC_EXPERIMENTAL_FEATURES _set_bit(bf, byte_count, MONGOC_MD_FLAG_EXPERIMENTAL_FEATURES); #endif #ifdef MONGOC_ENABLE_SASL_CYRUS _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SASL_CYRUS); #endif #ifdef MONGOC_ENABLE_SASL_SSPI _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SASL_SSPI); #endif #ifdef MONGOC_HAVE_SOCKLEN _set_bit(bf, byte_count, MONGOC_MD_FLAG_HAVE_SOCKLEN); #endif #ifdef MONGOC_ENABLE_COMPRESSION _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_COMPRESSION); #endif #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_COMPRESSION_SNAPPY); #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_COMPRESSION_ZLIB); #endif #ifdef MONGOC_HAVE_RES_NSEARCH _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_RES_NSEARCH); #endif #ifdef MONGOC_HAVE_RES_NDESTROY _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_RES_NDESTROY); #endif #ifdef MONGOC_HAVE_RES_NCLOSE _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_RES_NCLOSE); #endif #ifdef MONGOC_HAVE_RES_SEARCH _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_RES_SEARCH); #endif #ifdef MONGOC_HAVE_DNSAPI _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_DNSAPI); #endif #ifdef MONGOC_HAVE_RDTSCP _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_RDTSCP); #endif #ifdef MONGOC_HAVE_SCHED_GETCPU _set_bit(bf, byte_count, MONGOC_MD_FLAG_HAVE_SCHED_GETCPU); #endif #ifdef MONGOC_ENABLE_SHM_COUNTERS _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SHM_COUNTERS); #endif mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); if (MONGOC_TRACE_ENABLED) { _set_bit(bf, byte_count, MONGOC_MD_FLAG_TRACE); } mlib_diagnostic_pop(); #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION); #endif #ifdef MONGOC_ENABLE_MONGODB_AWS_AUTH _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH); #endif mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); if (MONGOC_SRV_ENABLED) { _set_bit(bf, byte_count, MONGOC_MD_FLAG_ENABLE_SRV); } mlib_diagnostic_pop(); mcommon_string_append_t append; mcommon_string_set_append(mcommon_string_new_with_capacity("0x", 2, 2 + byte_count * 2), &append); for (uint32_t i = 0u; i < byte_count; i++) { mcommon_string_append_printf(&append, "%02x", bf[i]); } bson_free(bf); return mcommon_string_from_append_destroy_with_steal(&append); } static char * _get_os_type(void) { #ifdef MONGOC_OS_TYPE return bson_strndup(MONGOC_OS_TYPE, HANDSHAKE_OS_TYPE_MAX); #else return bson_strndup("unknown", HANDSHAKE_OS_TYPE_MAX); #endif } static char * _get_os_architecture(void) { const char *ret = NULL; #ifdef _WIN32 SYSTEM_INFO system_info; DWORD arch; GetSystemInfo(&system_info); arch = system_info.wProcessorArchitecture; switch (arch) { case PROCESSOR_ARCHITECTURE_AMD64: ret = "x86_64"; break; case PROCESSOR_ARCHITECTURE_ARM: ret = "ARM"; break; case PROCESSOR_ARCHITECTURE_IA64: ret = "IA64"; break; case PROCESSOR_ARCHITECTURE_INTEL: ret = "x86"; break; case PROCESSOR_ARCHITECTURE_UNKNOWN: ret = "Unknown"; break; default: ret = "Other"; break; } #elif defined(_POSIX_VERSION) struct utsname system_info; if (uname(&system_info) >= 0) { ret = system_info.machine; } #endif if (ret) { return bson_strndup(ret, HANDSHAKE_OS_ARCHITECTURE_MAX); } return NULL; } #ifndef MONGOC_OS_IS_LINUX static char * _get_os_name(void) { #ifdef MONGOC_OS_NAME return bson_strndup(MONGOC_OS_NAME, HANDSHAKE_OS_NAME_MAX); #elif defined(_POSIX_VERSION) struct utsname system_info; if (uname(&system_info) >= 0) { return bson_strndup(system_info.sysname, HANDSHAKE_OS_NAME_MAX); } return NULL; #else return NULL; #endif } static char * _get_os_version(void) { char *ret = bson_malloc(HANDSHAKE_OS_VERSION_MAX); bool found = false; #ifdef _WIN32 OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); #if defined(_MSC_VER) // CDRIVER-4263: GetVersionEx is deprecated. #pragma warning(suppress : 4996) const BOOL res = GetVersionEx(&osvi); #else const BOOL res = GetVersionEx(&osvi); #endif if (res) { // Truncation is OK. int req = bson_snprintf( ret, HANDSHAKE_OS_VERSION_MAX, "%lu.%lu (%lu)", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber); BSON_ASSERT(req > 0); found = true; } else { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_WARNING("Error with GetVersionEx(): %s", msg); bson_free(msg); } #elif defined(_POSIX_VERSION) struct utsname system_info; if (uname(&system_info) >= 0) { bson_strncpy(ret, system_info.release, HANDSHAKE_OS_VERSION_MAX); found = true; } else { MONGOC_WARNING("Error with uname(): %d", errno); } #endif if (!found) { bson_free(ret); ret = NULL; } return ret; } #endif static void _get_system_info(mongoc_handshake_t *handshake) { handshake->os_type = _get_os_type(); #ifdef MONGOC_OS_IS_LINUX _mongoc_linux_distro_scanner_get_distro(&handshake->os_name, &handshake->os_version); #else handshake->os_name = _get_os_name(); handshake->os_version = _get_os_version(); #endif handshake->os_architecture = _get_os_architecture(); } static void _get_driver_info(mongoc_handshake_t *handshake) { handshake->driver_name = bson_strndup("mongoc", HANDSHAKE_DRIVER_NAME_MAX); handshake->driver_version = bson_strndup(MONGOC_VERSION_S, HANDSHAKE_DRIVER_VERSION_MAX); } static void _set_platform_string(mongoc_handshake_t *handshake) { handshake->platform = bson_strdup(""); } static void _get_container_info(mongoc_handshake_t *handshake) { char *kubernetes_env = _mongoc_getenv("KUBERNETES_SERVICE_HOST"); handshake->kubernetes = kubernetes_env; handshake->docker = false; #ifdef _WIN32 handshake->docker = (_access_s("C:\\.dockerenv", 0) == 0); #else handshake->docker = (access("/.dockerenv", F_OK) == 0); #endif bson_free(kubernetes_env); } static void _get_env_info(mongoc_handshake_t *handshake) { char *aws_env = _mongoc_getenv("AWS_EXECUTION_ENV"); char *aws_lambda = _mongoc_getenv("AWS_LAMBDA_RUNTIME_API"); char *vercel_env = _mongoc_getenv("VERCEL"); char *azure_env = _mongoc_getenv("FUNCTIONS_WORKER_RUNTIME"); char *gcp_env = _mongoc_getenv("K_SERVICE"); char *memory_str = NULL; char *timeout_str = NULL; char *region_str = NULL; bool is_aws = (aws_env && strlen(aws_env) && (aws_env == strstr(aws_env, "AWS_Lambda_"))) || (aws_lambda && strlen(aws_lambda)); bool is_vercel = vercel_env && strlen(vercel_env); bool is_azure = azure_env && strlen(azure_env); bool is_gcp = gcp_env && strlen(gcp_env); handshake->env = MONGOC_HANDSHAKE_ENV_NONE; handshake->env_region = NULL; handshake->env_memory_mb.set = false; handshake->env_timeout_sec.set = false; if ((is_aws || is_vercel) + is_azure + is_gcp != 1) { goto cleanup; } if (is_aws && !is_vercel) { handshake->env = MONGOC_HANDSHAKE_ENV_AWS; region_str = _mongoc_getenv("AWS_REGION"); memory_str = _mongoc_getenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE"); } else if (is_vercel) { handshake->env = MONGOC_HANDSHAKE_ENV_VERCEL; region_str = _mongoc_getenv("VERCEL_REGION"); } else if (is_gcp) { handshake->env = MONGOC_HANDSHAKE_ENV_GCP; region_str = _mongoc_getenv("FUNCTION_REGION"); memory_str = _mongoc_getenv("FUNCTION_MEMORY_MB"); timeout_str = _mongoc_getenv("FUNCTION_TIMEOUT_SEC"); } else if (is_azure) { handshake->env = MONGOC_HANDSHAKE_ENV_AZURE; } if (memory_str) { char *endptr; int64_t env_memory_mb = bson_ascii_strtoll(memory_str, &endptr, 10); bool parse_ok = endptr == memory_str + (strlen(memory_str)); bool in_range = mlib_in_range(int32_t, env_memory_mb); if (parse_ok && in_range) { handshake->env_memory_mb.set = true; handshake->env_memory_mb.value = (int32_t)env_memory_mb; } } if (timeout_str) { char *endptr; int64_t env_timeout_sec = bson_ascii_strtoll(timeout_str, &endptr, 10); bool parse_ok = endptr == timeout_str + (strlen(timeout_str)); bool in_range = mlib_in_range(int32_t, env_timeout_sec); if (parse_ok && in_range) { handshake->env_timeout_sec.set = true; handshake->env_timeout_sec.value = (int32_t)env_timeout_sec; } } if (region_str && strlen(region_str)) { handshake->env_region = bson_strdup(region_str); } cleanup: bson_free(aws_env); bson_free(aws_lambda); bson_free(vercel_env); bson_free(azure_env); bson_free(gcp_env); bson_free(memory_str); bson_free(timeout_str); bson_free(region_str); } static void _set_compiler_info(mongoc_handshake_t *handshake) { mcommon_string_append_t append; mcommon_string_new_as_append(&append); char *config_str = _mongoc_handshake_get_config_hex_string(); mcommon_string_append_printf(&append, "cfg=%s", config_str); bson_free(config_str); #ifdef _POSIX_VERSION mcommon_string_append_printf(&append, " posix=%ld", _POSIX_VERSION); #endif #ifdef __STDC_VERSION__ mcommon_string_append_printf(&append, " stdc=%ld", __STDC_VERSION__); #endif mcommon_string_append_printf(&append, " CC=%s", MONGOC_COMPILER); #ifdef MONGOC_COMPILER_VERSION mcommon_string_append_printf(&append, " %s", MONGOC_COMPILER_VERSION); #endif mcommon_string_append(&append, " CXX=" MONGOC_CXX_COMPILER_ID); if (0 != strlen(MONGOC_CXX_COMPILER_VERSION)) { mcommon_string_append(&append, " " MONGOC_CXX_COMPILER_VERSION); } handshake->compiler_info = mcommon_string_from_append_destroy_with_steal(&append); } static void _set_flags(mongoc_handshake_t *handshake) { mcommon_string_append_t append; mcommon_string_new_as_append(&append); if (strlen(MONGOC_EVALUATE_STR(MONGOC_USER_SET_CFLAGS)) > 0) { mcommon_string_append_printf(&append, " CFLAGS=%s", MONGOC_EVALUATE_STR(MONGOC_USER_SET_CFLAGS)); } if (strlen(MONGOC_EVALUATE_STR(MONGOC_USER_SET_LDFLAGS)) > 0) { mcommon_string_append_printf(&append, " LDFLAGS=%s", MONGOC_EVALUATE_STR(MONGOC_USER_SET_LDFLAGS)); } handshake->flags = mcommon_string_from_append_destroy_with_steal(&append); } void _mongoc_handshake_init(void) { _get_system_info(_mongoc_handshake_get()); _get_driver_info(_mongoc_handshake_get()); _set_platform_string(_mongoc_handshake_get()); _get_env_info(_mongoc_handshake_get()); _get_container_info(_mongoc_handshake_get()); _set_compiler_info(_mongoc_handshake_get()); _set_flags(_mongoc_handshake_get()); _mongoc_handshake_get()->frozen = false; bson_mutex_init(&gHandshakeLock); } void _mongoc_handshake_cleanup(void) { mongoc_handshake_t *h = _mongoc_handshake_get(); bson_free(h->os_type); bson_free(h->os_name); bson_free(h->os_version); bson_free(h->os_architecture); bson_free(h->driver_name); bson_free(h->driver_version); bson_free(h->platform); bson_free(h->compiler_info); bson_free(h->flags); bson_free(h->env_region); *h = (mongoc_handshake_t){0}; bson_mutex_destroy(&gHandshakeLock); } static void _append_platform_field(bson_t *doc, const char *platform, bool truncate) { char *compiler_info = _mongoc_handshake_get()->compiler_info; char *flags = _mongoc_handshake_get()->flags; const uint32_t overhead = (/* 1 byte for utf8 tag */ 1 + /* key size */ (int)strlen(HANDSHAKE_PLATFORM_FIELD) + 1 + /* 4 bytes for length of string */ 4 + /* NUL terminator */ 1); if (truncate && doc->len >= HANDSHAKE_MAX_SIZE - overhead) { return; } mcommon_string_append_t combined_platform; mcommon_string_set_append_with_limit(mcommon_string_new_with_capacity("", 0, HANDSHAKE_MAX_SIZE - overhead), &combined_platform, truncate ? HANDSHAKE_MAX_SIZE - overhead - doc->len : UINT32_MAX - 1u); mcommon_string_append(&combined_platform, platform); mcommon_string_append_all_or_none(&combined_platform, compiler_info); mcommon_string_append_all_or_none(&combined_platform, flags); bson_append_utf8(doc, HANDSHAKE_PLATFORM_FIELD, strlen(HANDSHAKE_PLATFORM_FIELD), mcommon_str_from_append(&combined_platform), mcommon_strlen_from_append(&combined_platform)); mcommon_string_from_append_destroy(&combined_platform); } static bool _get_subdoc_static(bson_t *doc, char *subdoc_name, bson_t *out) { bson_iter_t iter; if (bson_iter_init_find(&iter, doc, subdoc_name) && BSON_ITER_HOLDS_DOCUMENT(&iter)) { uint32_t len; const uint8_t *data; bson_iter_document(&iter, &len, &data); BSON_ASSERT(bson_init_static(out, data, len)); return true; } return false; } static bool _truncate_handshake(bson_t **doc) { if ((*doc)->len > HANDSHAKE_MAX_SIZE) { bson_t env_doc; if (_get_subdoc_static(*doc, "env", &env_doc)) { bson_t *new_env = bson_new(); bson_copy_to_including_noinit(&env_doc, new_env, "name", NULL); bson_t *new_doc = bson_new(); bson_copy_to_excluding_noinit(*doc, new_doc, "env", NULL); bson_append_document(new_doc, "env", -1, new_env); bson_destroy(new_env); bson_destroy(*doc); *doc = new_doc; } } if ((*doc)->len > HANDSHAKE_MAX_SIZE) { bson_t os_doc; if (_get_subdoc_static(*doc, "os", &os_doc)) { bson_t *new_os = bson_new(); bson_copy_to_including_noinit(&os_doc, new_os, "type", NULL); bson_t *new_doc = bson_new(); bson_copy_to_excluding_noinit(*doc, new_doc, "os", NULL); bson_append_document(new_doc, "os", -1, new_os); bson_destroy(new_os); bson_destroy(*doc); *doc = new_doc; } } if ((*doc)->len > HANDSHAKE_MAX_SIZE) { bson_t *new_doc = bson_new(); bson_copy_to_excluding_noinit(*doc, new_doc, "env", NULL); bson_destroy(*doc); *doc = new_doc; } const mongoc_handshake_t *md = _mongoc_handshake_get(); if ((*doc)->len > HANDSHAKE_MAX_SIZE && md->platform) { bson_t *new_doc = bson_new(); bson_copy_to_excluding_noinit(*doc, new_doc, "platform", NULL); _append_platform_field(new_doc, md->platform, true); bson_destroy(*doc); *doc = new_doc; } return (*doc)->len <= HANDSHAKE_MAX_SIZE; } /* * Return true if we build the document, and it's not too big * false if there's no way to prevent the doc from being too big. In this * case, the caller shouldn't include it with hello */ bson_t * _mongoc_handshake_build_doc_with_application(const char *appname) { const mongoc_handshake_t *md = _mongoc_handshake_get(); char *env_name = NULL; switch (md->env) { case MONGOC_HANDSHAKE_ENV_AWS: env_name = "aws.lambda"; break; case MONGOC_HANDSHAKE_ENV_GCP: env_name = "gcp.func"; break; case MONGOC_HANDSHAKE_ENV_AZURE: env_name = "azure.func"; break; case MONGOC_HANDSHAKE_ENV_VERCEL: env_name = "vercel"; break; case MONGOC_HANDSHAKE_ENV_NONE: env_name = NULL; break; default: break; } bson_t *doc = bson_new(); // Optimistically include all handshake data bsonBuildAppend( *doc, if (appname, then(kv("application", doc(kv("name", cstr(appname)))))), kv("driver", doc(kv("name", cstr(md->driver_name)), kv("version", cstr(md->driver_version)))), kv("os", doc(kv("type", cstr(md->os_type)), if (md->os_name, then(kv("name", cstr(md->os_name)))), if (md->os_version, then(kv("version", cstr(md->os_version)))), if (md->os_architecture, then(kv("architecture", cstr(md->os_architecture)))))), if (env_name, then(kv("env", doc(kv("name", cstr(env_name)), if (md->env_timeout_sec.set, then(kv("timeout_sec", int32(md->env_timeout_sec.value)))), if (md->env_memory_mb.set, then(kv("memory_mb", int32(md->env_memory_mb.value)))), if (md->env_region, then(kv("region", cstr(md->env_region)))))))), if (md->kubernetes || md->docker, then(kv("container", doc(if (md->docker, then(kv("runtime", cstr("docker")))), if (md->kubernetes, then(kv("orchestrator", cstr("kubernetes"))))))))); if (md->platform) { _append_platform_field(doc, md->platform, false); } if (_truncate_handshake(&doc)) { return doc; } else { bson_destroy(doc); return NULL; } } void _mongoc_handshake_freeze(void) { bson_mutex_lock(&gHandshakeLock); _mongoc_handshake_get()->frozen = true; bson_mutex_unlock(&gHandshakeLock); } static void _mongoc_handshake_freeze_nolock(void) { _mongoc_handshake_get()->frozen = true; } /* * free (*s) and make *s point to *s concated with suffix. * If *s is NULL it's treated like it's an empty string. */ static void _append_and_truncate(char **s, const char *suffix, size_t max_len) { char *old_str = *s; const size_t delim_len = strlen(" / "); BSON_ASSERT_PARAM(s); BSON_ASSERT_PARAM(suffix); const char *const prefix = old_str ? old_str : ""; const size_t required_space = strlen(prefix) + delim_len; if (max_len <= required_space) { /* the old string already takes the whole allotted space */ return; } const size_t space_for_suffix = max_len - required_space; BSON_ASSERT(mlib_in_range(int, space_for_suffix)); *s = bson_strdup_printf("%s / %.*s", prefix, (int)space_for_suffix, suffix); BSON_ASSERT(strlen(*s) <= max_len); bson_free(old_str); } /* * Set some values in our global handshake struct. These values will be sent * to the server as part of the initial connection handshake (hello). * If this function is called more than once, or after we've connected to a * mongod, then it will do nothing and return false. It will return true if * it successfully sets the values. * * All arguments are optional. */ bool mongoc_handshake_data_append(const char *driver_name, const char *driver_version, const char *platform) { int platform_space; bson_mutex_lock(&gHandshakeLock); if (_mongoc_handshake_get()->frozen) { bson_mutex_unlock(&gHandshakeLock); return false; } BSON_ASSERT(_mongoc_handshake_get()->platform); /* allow practically any size for "platform", we'll trim it down in * _mongoc_handshake_build_doc_with_application */ platform_space = HANDSHAKE_MAX_SIZE - (int)strlen(_mongoc_handshake_get()->platform); if (platform) { /* we check for an empty string as a special case to avoid an * unnecessary delimiter being added in front of the string by * _append_and_truncate */ if (_mongoc_handshake_get()->platform[0] == '\0') { bson_free(_mongoc_handshake_get()->platform); _mongoc_handshake_get()->platform = bson_strdup_printf("%.*s", platform_space, platform); } else { _append_and_truncate(&_mongoc_handshake_get()->platform, platform, HANDSHAKE_MAX_SIZE); } } if (driver_name) { _append_and_truncate(&_mongoc_handshake_get()->driver_name, driver_name, HANDSHAKE_DRIVER_NAME_MAX); } if (driver_version) { _append_and_truncate(&_mongoc_handshake_get()->driver_version, driver_version, HANDSHAKE_DRIVER_VERSION_MAX); } _mongoc_handshake_freeze_nolock(); bson_mutex_unlock(&gHandshakeLock); return true; } mongoc_handshake_t * _mongoc_handshake_get(void) { return &gMongocHandshake; } bool _mongoc_handshake_appname_is_valid(const char *appname) { return strlen(appname) <= MONGOC_HANDSHAKE_APPNAME_MAX; } void _mongoc_handshake_append_sasl_supported_mechs(const mongoc_uri_t *uri, bson_t *cmd) { const char *username; char *db_user; username = mongoc_uri_get_username(uri); db_user = bson_strdup_printf("%s.%s", mongoc_uri_get_auth_source(uri), username); bson_append_utf8(cmd, "saslSupportedMechs", 18, db_user, -1); bson_free(db_user); } void _mongoc_handshake_parse_sasl_supported_mechs(const bson_t *hello, mongoc_handshake_sasl_supported_mechs_t *sasl_supported_mechs) { memset(sasl_supported_mechs, 0, sizeof(*sasl_supported_mechs)); bsonParse(*hello, find(keyWithType("saslSupportedMechs", array), visitEach(case (when(strEqual("SCRAM-SHA-256"), do(sasl_supported_mechs->scram_sha_256 = true)), when(strEqual("SCRAM-SHA-1"), do(sasl_supported_mechs->scram_sha_1 = true)))))); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-handshake.h000066400000000000000000000017041511661753600245510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HANDSHAKE_H #define MONGOC_HANDSHAKE_H #include #include BSON_BEGIN_DECLS #define MONGOC_HANDSHAKE_APPNAME_MAX 128 MONGOC_EXPORT(bool) mongoc_handshake_data_append(const char *driver_name, const char *driver_version, const char *platform); BSON_END_DECLS #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-host-list-private.h000066400000000000000000000036411511661753600262230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HOST_LIST_PRIVATE_H #define MONGOC_HOST_LIST_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS void _mongoc_host_list_upsert(mongoc_host_list_t **list, const mongoc_host_list_t *new_host); mongoc_host_list_t * _mongoc_host_list_copy_all(const mongoc_host_list_t *src); bool _mongoc_host_list_from_string(mongoc_host_list_t *host_list, const char *host_and_port); bool _mongoc_host_list_from_string_with_err(mongoc_host_list_t *host_list, const char *host_and_port, bson_error_t *error); bool _mongoc_host_list_from_hostport_with_err(mongoc_host_list_t *host_list, mstr_view host, uint16_t port, bson_error_t *error); size_t _mongoc_host_list_length(const mongoc_host_list_t *list); bool _mongoc_host_list_compare_one(const mongoc_host_list_t *host_a, const mongoc_host_list_t *host_b); void _mongoc_host_list_remove_host(mongoc_host_list_t **phosts, const char *host, uint16_t port); void _mongoc_host_list_destroy_all(mongoc_host_list_t *host); bool _mongoc_host_list_contains_one(mongoc_host_list_t *host_list, mongoc_host_list_t *host); BSON_END_DECLS #endif /* MONGOC_HOST_LIST_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-host-list.c000066400000000000000000000263011511661753600245440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include // PRIu16 /* strcasecmp on windows */ #include #include #include static mongoc_host_list_t * _mongoc_host_list_find_host_and_port(mongoc_host_list_t *hosts, const char *host_and_port) { mongoc_host_list_t *iter; LL_FOREACH(hosts, iter) { BSON_ASSERT(iter); if (strcasecmp(iter->host_and_port, host_and_port) == 0) { return iter; } } return NULL; } /* *-------------------------------------------------------------------------- * * _mongoc_host_list_upsert -- * * If new_host is not already in list, copy and add it to the end of list. * If *list == NULL, then it will be set to a new host. * * Returns: * Nothing. * *-------------------------------------------------------------------------- */ void _mongoc_host_list_upsert(mongoc_host_list_t **list, const mongoc_host_list_t *new_host) { mongoc_host_list_t *link = NULL; mongoc_host_list_t *next_link = NULL; BSON_ASSERT(list); if (!new_host) { return; } link = _mongoc_host_list_find_host_and_port(*list, new_host->host_and_port); if (!link) { link = bson_malloc0(sizeof(mongoc_host_list_t)); LL_APPEND(*list, link); } else { /* Make sure linking is preserved when copying data into final. */ next_link = link->next; } memcpy(link, new_host, sizeof(mongoc_host_list_t)); link->next = next_link; } /* Duplicates a host list. */ mongoc_host_list_t * _mongoc_host_list_copy_all(const mongoc_host_list_t *src) { mongoc_host_list_t *tail = NULL; const mongoc_host_list_t *src_iter; mongoc_host_list_t *head = NULL; LL_FOREACH(src, src_iter) { tail = bson_malloc0(sizeof(mongoc_host_list_t)); memcpy(tail, src_iter, sizeof(mongoc_host_list_t)); LL_PREPEND(head, tail); } return head; } size_t _mongoc_host_list_length(const mongoc_host_list_t *list) { const mongoc_host_list_t *tmp; size_t counter = 0u; tmp = list; while (tmp) { tmp = tmp->next; counter++; } return counter; } /* *-------------------------------------------------------------------------- * * _mongoc_host_list_compare_one -- * * Check two hosts have the same domain (case-insensitive), port, * and address family. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool _mongoc_host_list_compare_one(const mongoc_host_list_t *host_a, const mongoc_host_list_t *host_b) { return (0 == strcasecmp(host_a->host_and_port, host_b->host_and_port) && host_a->family == host_b->family); } bool _mongoc_host_list_contains_one(mongoc_host_list_t *host_list, mongoc_host_list_t *host) { return NULL != _mongoc_host_list_find_host_and_port(host_list, host->host_and_port); } /* *-------------------------------------------------------------------------- * * _mongoc_host_list_destroy_all -- * * Destroy whole linked list of hosts. * *-------------------------------------------------------------------------- */ void _mongoc_host_list_destroy_all(mongoc_host_list_t *host) { mongoc_host_list_t *tmp; while (host) { tmp = host->next; bson_free(host); host = tmp; } } /* *-------------------------------------------------------------------------- * * _mongoc_host_list_from_string -- * * Populate a mongoc_host_list_t from a fully qualified address * *-------------------------------------------------------------------------- */ bool _mongoc_host_list_from_string(mongoc_host_list_t *link_, const char *address) { bson_error_t error = {0}; bool r = _mongoc_host_list_from_string_with_err(link_, address, &error); if (!r) { MONGOC_ERROR("Could not parse address %s: %s", address, error.message); return false; } return true; } static inline bool _parse_host_ipv6(mongoc_host_list_t *link, mstr_view addr, bson_error_t *error) { bson_error_reset(error); _mongoc_set_error(error, 0, 0, "Invalid IPv6 literal address '%.*s'", MSTR_FMT(addr)); // Find the opening bracket (must be the first char) const size_t open_square_pos = mstr_find(addr, mstr_cstring("["), 0, 1); if (open_square_pos != 0) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "%s: Must start with a bracket '['", error->message); return false; } // Find the closing bracket const size_t close_square_pos = mstr_find(addr, mstr_cstring("]")); if (close_square_pos == SIZE_MAX) { // Closing bracket is missing _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "%s: Mising closing bracket ']'", error->message); return false; } // Find the port delimiter, if present. It must be the next character const size_t port_delim_pos = mstr_find(addr, mstr_cstring(":"), close_square_pos + 1, 1); if (port_delim_pos == SIZE_MAX) { // There is no port specifier, or it is misplaced, so the closing bracket // should be the final character: if (close_square_pos != addr.len - 1) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "%s: Invalid trailing content following closing bracket ']'", error->message); return false; } } uint16_t port = MONGOC_DEFAULT_PORT; if (port_delim_pos != SIZE_MAX) { bson_error_t err2; const mstr_view port_str = mstr_substr(addr, port_delim_pos + 1); if (!_mongoc_parse_port(port_str, &port, &err2)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "%s: Invalid port '%.*s': %s", error->message, MSTR_FMT(port_str), err2.message); return false; } } return _mongoc_host_list_from_hostport_with_err( link, mstr_slice(addr, open_square_pos + 1, close_square_pos), port, error); } static inline bool _parse_host(mongoc_host_list_t *link, mstr_view spec, bson_error_t *error) { if (mstr_contains(spec, mstr_cstring("]"))) { // There is a "]" bracket, so this is probably an IPv6 literal, which is // more strict return _parse_host_ipv6(link, spec, error); } // Parsing anything else is simpler. uint16_t port = MONGOC_DEFAULT_PORT; // Try to split around the port delimiter: mstr_view hostname, port_str; if (mstr_split_around(spec, mstr_cstring(":"), &hostname, &port_str)) { // We have a ":" delimiter. Try to parse it as a port number: bson_error_t e2; if (!_mongoc_parse_port(port_str, &port, &e2)) { // Invalid port number _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid host specifier '%.*s': Invalid port string '%.*s': %s", MSTR_FMT(spec), MSTR_FMT(port_str), e2.message); return false; } } return _mongoc_host_list_from_hostport_with_err(link, hostname, port, error); } bool _mongoc_host_list_from_string_with_err(mongoc_host_list_t *link_, const char *address, bson_error_t *error) { return _parse_host(link_, mstr_cstring(address), error); } bool _mongoc_host_list_from_hostport_with_err(mongoc_host_list_t *link_, mstr_view host, uint16_t port, bson_error_t *error) { BSON_ASSERT(link_); *link_ = (mongoc_host_list_t){ .next = NULL, .port = port, }; if (host.len == 0) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Empty hostname in URI"); return false; } if (host.len > BSON_HOST_NAME_MAX) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Hostname provided in URI is too long, max is %d chars", BSON_HOST_NAME_MAX); return false; } bson_strncpy(link_->host, host.data, host.len + 1); /* like "fe80::1" or "::1" */ if (mstr_contains(host, mstr_cstring(":"))) { link_->family = AF_INET6; // Check that IPv6 literal is two less than the max to account for `[` and // `]` added below. if (host.len > BSON_HOST_NAME_MAX - 2) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "IPv6 literal provided in URI is too long, max is %d chars", BSON_HOST_NAME_MAX - 2); return false; } mongoc_lowercase(link_->host, link_->host); int req = bson_snprintf(link_->host_and_port, sizeof link_->host_and_port, "[%s]:%" PRIu16, link_->host, link_->port); BSON_ASSERT(mlib_in_range(size_t, req)); // Use `<`, not `<=` to account for NULL byte. BSON_ASSERT((size_t)req < sizeof link_->host_and_port); } else if (mstr_contains(host, mstr_cstring("/")) && mstr_contains(host, mstr_cstring(".sock"))) { link_->family = AF_UNIX; bson_strncpy(link_->host_and_port, link_->host, host.len + 1); } else { /* This is either an IPv4 or hostname. */ link_->family = AF_UNSPEC; mongoc_lowercase(link_->host, link_->host); int req = bson_snprintf(link_->host_and_port, sizeof link_->host_and_port, "%s:%" PRIu16, link_->host, link_->port); BSON_ASSERT(mlib_in_range(size_t, req)); // Use `<`, not `<=` to account for NULL byte. BSON_ASSERT((size_t)req < sizeof link_->host_and_port); } return true; } void _mongoc_host_list_remove_host(mongoc_host_list_t **hosts, const char *host, uint16_t port) { mongoc_host_list_t *current; mongoc_host_list_t *prev = NULL; for (current = *hosts; current; prev = current, current = current->next) { if ((current->port == port) && (strcmp(current->host, host) == 0)) { /* Node found, unlink. */ if (prev) { prev->next = current->next; } else { /* No previous, unlinking at head. */ *hosts = current->next; } bson_free(current); break; } } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-host-list.h000066400000000000000000000022201511661753600245430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_HOST_LIST_H #define MONGOC_HOST_LIST_H #include BSON_BEGIN_DECLS #ifdef _POSIX_HOST_NAME_MAX #define BSON_HOST_NAME_MAX _POSIX_HOST_NAME_MAX #else #define BSON_HOST_NAME_MAX 255 #endif typedef struct _mongoc_host_list_t mongoc_host_list_t; struct _mongoc_host_list_t { mongoc_host_list_t *next; char host[BSON_HOST_NAME_MAX + 1]; char host_and_port[BSON_HOST_NAME_MAX + 7]; uint16_t port; int family; void *padding[4]; }; BSON_END_DECLS #endif /* MONGOC_HOST_LIST_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-http-private.h000066400000000000000000000061151511661753600252530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifndef MONGOC_HTTP_PRIVATE_H #define MONGOC_HTTP_PRIVATE_H typedef struct { const char *host; int port; const char *method; const char *path; const char *extra_headers; const char *body; int body_len; } mongoc_http_request_t; typedef struct { int status; char *headers; int headers_len; char *body; int body_len; } mongoc_http_response_t; void _mongoc_http_request_init(mongoc_http_request_t *request); void _mongoc_http_response_init(mongoc_http_response_t *response); void _mongoc_http_response_cleanup(mongoc_http_response_t *response); /** * @brief Render the HTTP request head based on the given HTTP parameters. * * @param append Destination for the HTTP request head, as an mcommon_string_append_t initialized with * mcommon_string_set_append(). * @param req The request to render (required) * * @note The request body (if applicable) is not included in the resulting * string. */ void _mongoc_http_render_request_head(mcommon_string_append_t *append, const mongoc_http_request_t *req); /** * @brief Convenience function to send an HTTP request and receive an HTTP * response. * * This function only speaks HTTP 1.0, and does not maintain a persistent * connection. It does not handle 3xx redirects nor 1xx information. * * @param req The request to send. Uses the "host" attribute to determine the * HTTP peer. * @param timer A timer for the request. * @param use_tls Whether the connection should use TLS. * @param ssl_opts Options to control TLS (Required only if 'use_tls' is true) * @param res Output parameter for the response. Must be uninitialized. * Required. This object must later be destroyed with * _mongoc_http_response_cleanup. * @param error An output parameter for any possible errors. These are errors * related to the HTTP transmission, and unrelated to any HTTP response. * (Optional) * @return true Upon success * @return false Otherwise, and sets "error" * * For more transport control, the HTTP request head content can be manually * rendered using @ref _mongo_http_render_request_head. */ bool _mongoc_http_send(mongoc_http_request_t const *req, mlib_timer timer, bool use_tls, mongoc_ssl_opt_t *ssl_opts, mongoc_http_response_t *res, bson_error_t *error); #endif /* MONGOC_HTTP_PRIVATE */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-http.c000066400000000000000000000216431511661753600236010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include void _mongoc_http_request_init(mongoc_http_request_t *request) { memset(request, 0, sizeof(*request)); } void _mongoc_http_response_init(mongoc_http_response_t *response) { memset(response, 0, sizeof(*response)); } void _mongoc_http_response_cleanup(mongoc_http_response_t *response) { if (!response) { return; } bson_free(response->headers); bson_free(response->body); } void _mongoc_http_render_request_head(mcommon_string_append_t *append, const mongoc_http_request_t *req) { BSON_ASSERT_PARAM(req); mcommon_string_append_printf(append, "%s ", req->method); // Default paths if (!req->path) { // Top path: mcommon_string_append(append, "/"); } else if (req->path[0] != '/') { // Path MUST be prefixed with a separator mcommon_string_append(append, "/"); mcommon_string_append(append, req->path); } else { // Just copy the path mcommon_string_append(append, req->path); } mcommon_string_append(append, " HTTP/1.0\r\n"); /* Always add Host header. */ mcommon_string_append_printf(append, "Host: %s:%d\r\n", req->host, req->port); /* Always add Connection: close header to ensure server closes connection. */ mcommon_string_append(append, "Connection: close\r\n"); /* Add Content-Length if body is included. */ if (req->body_len) { mcommon_string_append_printf(append, "Content-Length: %d\r\n", req->body_len); } // Add any extra headers if (req->extra_headers) { mcommon_string_append(append, req->extra_headers); } // Final terminator mcommon_string_append(append, "\r\n"); } static int32_t _mongoc_http_msec_remaining(mlib_timer timer) { const int64_t msec = mlib_milliseconds_count(mlib_timer_remaining(timer)); BSON_ASSERT(mlib_in_range(int32_t, msec)); return (int32_t)msec; } bool _mongoc_http_send(const mongoc_http_request_t *req, mlib_timer timer, bool use_tls, mongoc_ssl_opt_t *ssl_opts, mongoc_http_response_t *res, bson_error_t *error) { mongoc_stream_t *stream = NULL; mongoc_host_list_t host_list; bool ret = false; mongoc_iovec_t iovec; char *path = NULL; mongoc_buffer_t http_response_buf; char *http_response_str; char *ptr; const char *header_delimiter = "\r\n\r\n"; mcommon_string_append_t http_request; mcommon_string_new_as_append(&http_request); memset(res, 0, sizeof(*res)); _mongoc_buffer_init(&http_response_buf, NULL, 0, NULL, NULL); if (!_mongoc_host_list_from_hostport_with_err(&host_list, mstr_cstring(req->host), (uint16_t)req->port, error)) { goto fail; } stream = mongoc_client_connect_tcp( // Prevent passing zero as a timeout BSON_MAX(_mongoc_http_msec_remaining(timer), 1), &host_list, error); if (!stream) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to connect to: %s", req->host); goto fail; } #ifndef MONGOC_ENABLE_SSL if (use_tls) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to connect to %s: libmongoc not built with TLS support", req->host); goto fail; } #else if (use_tls) { mongoc_stream_t *tls_stream; BSON_ASSERT(ssl_opts); tls_stream = mongoc_stream_tls_new_with_hostname(stream, req->host, ssl_opts, true); if (!tls_stream) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed create TLS stream to: %s", req->host); goto fail; } stream = tls_stream; if (!mongoc_stream_tls_handshake_block(stream, req->host, _mongoc_http_msec_remaining(timer), error)) { goto fail; } } #endif if (!req->path) { path = bson_strdup("/"); } else if (req->path[0] != '/') { path = bson_strdup_printf("/%s", req->path); } else { path = bson_strdup(req->path); } _mongoc_http_render_request_head(&http_request, req); iovec.iov_base = mcommon_str_from_append(&http_request); iovec.iov_len = mcommon_strlen_from_append(&http_request); if (!_mongoc_stream_writev_full(stream, &iovec, 1, _mongoc_http_msec_remaining(timer), error)) { goto fail; } if (req->body && req->body_len) { iovec.iov_base = (void *)req->body; iovec.iov_len = req->body_len; if (!_mongoc_stream_writev_full(stream, &iovec, 1, _mongoc_http_msec_remaining(timer), error)) { goto fail; } } /* Read until connection close. */ while (1) { const ssize_t bytes_read = _mongoc_buffer_try_append_from_stream( &http_response_buf, stream, 1024 * 32, _mongoc_http_msec_remaining(timer)); if (mongoc_stream_should_retry(stream)) { continue; } if (bytes_read <= 0) { break; } if (http_response_buf.len > 1024 * 1024 * 8) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "HTTP response message is too large"); goto fail; } } if (mongoc_stream_timed_out(stream)) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Timeout reading from stream"); goto fail; } if (http_response_buf.len == 0) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "No response received"); goto fail; } http_response_str = (char *)http_response_buf.data; const char *const resp_end_ptr = http_response_str + http_response_buf.len; const char *proto_leader_10 = "HTTP/1.0 "; const char *proto_leader_11 = "HTTP/1.1 "; ptr = strstr(http_response_str, proto_leader_10); if (!ptr) { ptr = strstr(http_response_str, proto_leader_11); } if (!ptr) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "No HTTP version leader in HTTP response. Expected '%s' or '%s'", proto_leader_10, proto_leader_11); goto fail; } /* Both protocol leaders have the same length. */ ptr += strlen(proto_leader_10); ssize_t remain = resp_end_ptr - ptr; if (remain < 4) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Short read in HTTP response"); goto fail; } char status_buf[4] = {0}; memcpy(status_buf, ptr, 3); char *status_endptr; res->status = strtol(status_buf, &status_endptr, 10); if (status_endptr != status_buf + 3) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Invalid HTTP response status string %*.s", 4, status_buf); goto fail; } /* Find the end of the headers. */ ptr = strstr(http_response_str, header_delimiter); if (NULL == ptr) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Error occurred reading response: end of headers not found"); goto fail; } const size_t headers_len = (size_t)(ptr - http_response_str); BSON_ASSERT(mlib_in_range(int, headers_len)); const size_t body_len = http_response_buf.len - headers_len - strlen(header_delimiter); BSON_ASSERT(mlib_in_range(int, body_len)); res->headers_len = (int)headers_len; res->headers = bson_strndup(http_response_str, (size_t)headers_len); res->body_len = (int)body_len; /* Add a NULL character in case caller assumes NULL terminated. */ res->body = bson_malloc0(body_len + 1u); memcpy(res->body, ptr + strlen(header_delimiter), body_len); ret = true; fail: mongoc_stream_destroy(stream); mcommon_string_from_append_destroy(&http_request); _mongoc_buffer_destroy(&http_response_buf); bson_free(path); return ret; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-init.c000066400000000000000000000107471511661753600235700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #include #include #if defined(MONGOC_ENABLE_CRYPTO_CNG) #include #include #endif #ifdef MONGOC_ENABLE_MONGODB_AWS_AUTH #include #endif #ifdef MONGOC_ENABLE_OCSP_OPENSSL #include #endif // CDRIVER-2722: Cyrus SASL is deprecated on MacOS. #if defined(MONGOC_ENABLE_SASL_CYRUS) && defined(__APPLE__) BEGIN_IGNORE_DEPRECATIONS #endif // defined(MONGOC_ENABLE_SASL_CYRUS) && defined(__APPLE__) #ifdef MONGOC_ENABLE_SASL_CYRUS #include static void * mongoc_cyrus_mutex_alloc(void) { bson_mutex_t *mutex; mutex = (bson_mutex_t *)bson_malloc0(sizeof(bson_mutex_t)); bson_mutex_init(mutex); return (void *)mutex; } static int mongoc_cyrus_mutex_lock(void *mutex) { bson_mutex_lock((bson_mutex_t *)mutex); return SASL_OK; } static int mongoc_cyrus_mutex_unlock(void *mutex) { bson_mutex_unlock((bson_mutex_t *)mutex); return SASL_OK; } static void mongoc_cyrus_mutex_free(void *mutex) { bson_mutex_destroy((bson_mutex_t *)mutex); bson_free(mutex); } #endif /* MONGOC_ENABLE_SASL_CYRUS */ static bool mongoc_init_called; bool mongoc_get_init_called(void) { return mongoc_init_called; } static BSON_ONCE_FUN(_mongoc_do_init) { mongoc_init_called = true; #ifdef MONGOC_ENABLE_SASL_CYRUS int status; #endif #ifdef MONGOC_ENABLE_SSL_OPENSSL _mongoc_openssl_init(); #endif #ifdef MONGOC_ENABLE_SASL_CYRUS /* The following functions should not use tracing, as they may be invoked * before mongoc_log_set_handler() can complete. */ sasl_set_mutex( mongoc_cyrus_mutex_alloc, mongoc_cyrus_mutex_lock, mongoc_cyrus_mutex_unlock, mongoc_cyrus_mutex_free); status = sasl_client_init(NULL); BSON_ASSERT(status == SASL_OK); #endif _mongoc_counters_init(); #ifdef _WIN32 { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); /* check the version perhaps? */ BSON_ASSERT(err == 0); } #endif #if defined(MONGOC_ENABLE_CRYPTO_CNG) mongoc_crypto_cng_init(); #endif _mongoc_handshake_init(); #if defined(MONGOC_ENABLE_MONGODB_AWS_AUTH) kms_message_init(); _mongoc_aws_credentials_cache_init(); #endif #if defined(MONGOC_ENABLE_OCSP_OPENSSL) _mongoc_ocsp_cache_init(); #endif BSON_ONCE_RETURN; } void mongoc_init(void) { static bson_once_t once = BSON_ONCE_INIT; bson_once(&once, _mongoc_do_init); } static BSON_ONCE_FUN(_mongoc_do_cleanup) { #ifdef MONGOC_ENABLE_SSL_OPENSSL _mongoc_openssl_cleanup(); #endif #ifdef MONGOC_ENABLE_SASL_CYRUS #ifdef MONGOC_HAVE_SASL_CLIENT_DONE sasl_client_done(); #else /* fall back to deprecated function */ sasl_done(); #endif #endif #ifdef _WIN32 WSACleanup(); #endif #if defined(MONGOC_ENABLE_CRYPTO_CNG) mongoc_crypto_cng_cleanup(); #endif _mongoc_counters_cleanup(); _mongoc_handshake_cleanup(); #if defined(MONGOC_ENABLE_MONGODB_AWS_AUTH) kms_message_cleanup(); _mongoc_aws_credentials_cache_cleanup(); #endif #if defined(MONGOC_ENABLE_OCSP_OPENSSL) _mongoc_ocsp_cache_cleanup(); #endif BSON_ONCE_RETURN; } void mongoc_cleanup(void) { static bson_once_t once = BSON_ONCE_INIT; bson_once(&once, _mongoc_do_cleanup); } // CDRIVER-2722: Cyrus SASL is deprecated on MacOS. #if defined(MONGOC_ENABLE_SASL_CYRUS) && defined(__APPLE__) BEGIN_IGNORE_DEPRECATIONS #endif // defined(MONGOC_ENABLE_SASL_CYRUS) && defined(__APPLE__) mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-init.h000066400000000000000000000015721511661753600235710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_INIT_H #define MONGOC_INIT_H #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(void) mongoc_init(void); MONGOC_EXPORT(void) mongoc_cleanup(void); BSON_END_DECLS #endif /* MONGOC_INIT_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-interrupt-private.h000066400000000000000000000037131511661753600263310ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_INTERRUPTIBLE_PRIVATE_H #define MONGOC_STREAM_INTERRUPTIBLE_PRIVATE_H #include /* Creates a stream to use to interrupt calls to mongoc_stream_poll. * * The expected use is to cancel in-progress hello commands (especially for * awaitable hello). A hello command may not respond for a long time, so * reading the reply may block on mongoc_stream_poll until data is readable. To * interrupt mongoc_stream_poll, a stream retrieved by * _mongoc_interrupt_get_stream can be added to the call of poll. Any other * thread can call _mongoc_interrupt_interrupt to write to that stream. */ typedef struct _mongoc_interrupt_t mongoc_interrupt_t; mongoc_interrupt_t * _mongoc_interrupt_new(uint32_t timeout_ms); /* Interrupt the stream. An in progress poll for POLLIN should return. */ bool _mongoc_interrupt_interrupt(mongoc_interrupt_t *interrupt); /* Returns a socket stream, that can be polled alongside other * socket streams. */ mongoc_stream_t * _mongoc_interrupt_get_stream(mongoc_interrupt_t *interrupt); /* Flushes queued data on an interrupt. * * This is not guaranteed to flush all data, but it does not block. */ bool _mongoc_interrupt_flush(mongoc_interrupt_t *interrupt); void _mongoc_interrupt_destroy(mongoc_interrupt_t *interrupt); #endif /* MONGOC_STREAM_INTERRUPTIBLE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-interrupt.c000066400000000000000000000211421511661753600246500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include /* The interrupt stream is implemented in two ways. * On POSIX, this uses the self-pipe trick. * On Windows, this uses a pair of TCP sockets. */ struct _mongoc_interrupt_t { bson_mutex_t mutex; union { /* For POSIX. pipe_fds[0] is the read end and pipe_fds[1] is the write * end. */ int pipe_fds[2]; /* For Windows */ struct { mongoc_socket_t *read; mongoc_socket_t *write; } socket_pair; } impl; mongoc_stream_t *stream; }; mongoc_stream_t * _mongoc_interrupt_get_stream(mongoc_interrupt_t *interrupt) { return interrupt->stream; } static void _log_errno(char *prefix, int _errno) { char buf[128] = {0}; bson_strerror_r(_errno, buf, sizeof(buf)); MONGOC_ERROR("%s: (%d) %s", prefix, _errno, buf); } #ifdef _WIN32 /* TCP socket pair implementation. */ mongoc_interrupt_t * _mongoc_interrupt_new(uint32_t timeout_ms) { mongoc_interrupt_t *interrupt; mongoc_socket_t *listen_socket = NULL; mongoc_socket_t *interrupt_socket = NULL; struct sockaddr_storage server_addr; mongoc_socklen_t sock_len; int ret; bool success = false; struct sockaddr_in server_addr_in = {0}; ENTRY; interrupt = (mongoc_interrupt_t *)bson_malloc0(sizeof *interrupt); bson_mutex_init(&interrupt->mutex); /* Inspired by cpython's implementation of socketpair. */ listen_socket = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); if (!listen_socket) { MONGOC_ERROR("socket creation failed"); GOTO(fail); } memset(&server_addr_in, 0, sizeof(server_addr_in)); server_addr_in.sin_family = AF_INET; server_addr_in.sin_addr.s_addr = htonl(INADDR_LOOPBACK); ret = mongoc_socket_bind(listen_socket, (struct sockaddr *)&server_addr_in, sizeof(server_addr_in)); if (ret == -1) { _log_errno("bind failed", mongoc_socket_errno(listen_socket)); GOTO(fail); } ret = mongoc_socket_listen(listen_socket, 1); if (ret == -1) { _log_errno("listen failed", mongoc_socket_errno(listen_socket)); GOTO(fail); } sock_len = sizeof(server_addr); ret = mongoc_socket_getsockname(listen_socket, (struct sockaddr *)&server_addr, &sock_len); if (-1 == ret) { _log_errno("getsockname failed", mongoc_socket_errno(listen_socket)); GOTO(fail); } interrupt->impl.socket_pair.read = mongoc_socket_new(server_addr.ss_family, SOCK_STREAM, 0); if (!interrupt->impl.socket_pair.read) { MONGOC_ERROR("socket creation failed"); GOTO(fail); } /* Begin non-blocking connect. */ ret = mongoc_socket_connect(interrupt->impl.socket_pair.read, (struct sockaddr *)&server_addr, sock_len, 0); if (ret == -1 && !MONGOC_ERRNO_IS_AGAIN(mongoc_socket_errno(interrupt->impl.socket_pair.read))) { _log_errno("connect failed", mongoc_socket_errno(interrupt->impl.socket_pair.read)); GOTO(fail); } interrupt->impl.socket_pair.write = mongoc_socket_accept(listen_socket, bson_get_monotonic_time() + timeout_ms * 1000); if (!interrupt->impl.socket_pair.write) { _log_errno("accept failed", mongoc_socket_errno(listen_socket)); GOTO(fail); } /* Create an unowned socket. interrupt_socket has 0 for the pid, so it will * be considered unowned. */ interrupt_socket = bson_malloc0(sizeof(mongoc_socket_t)); interrupt_socket->sd = interrupt->impl.socket_pair.read->sd; /* Creating the stream takes ownership of the mongoc_socket_t. */ interrupt->stream = mongoc_stream_socket_new(interrupt_socket); success = true; fail: mongoc_socket_destroy(listen_socket); if (!success) { _mongoc_interrupt_destroy(interrupt); interrupt = NULL; } RETURN(interrupt); } void _mongoc_interrupt_destroy(mongoc_interrupt_t *interrupt) { if (!interrupt) { return; } bson_mutex_destroy(&interrupt->mutex); mongoc_socket_destroy(interrupt->impl.socket_pair.read); mongoc_socket_destroy(interrupt->impl.socket_pair.write); mongoc_stream_destroy(interrupt->stream); bson_free(interrupt); } bool _mongoc_interrupt_flush(mongoc_interrupt_t *interrupt) { uint8_t buf[1]; while (true) { if (-1 == mongoc_socket_recv(interrupt->impl.socket_pair.read, buf, sizeof(buf), 0, 0)) { if (MONGOC_ERRNO_IS_AGAIN(errno)) { /* Nothing left to read. */ return true; } else { /* Unexpected error. */ _log_errno("interrupt recv failed", mongoc_socket_errno(interrupt->impl.socket_pair.read)); return false; } } } /* Should never be reached. */ BSON_ASSERT(false); } bool _mongoc_interrupt_interrupt(mongoc_interrupt_t *interrupt) { bson_mutex_lock(&interrupt->mutex); if (mongoc_socket_send(interrupt->impl.socket_pair.write, "!", 1, 0) == -1 && !MONGOC_ERRNO_IS_AGAIN(errno)) { _log_errno("interrupt send failed", mongoc_socket_errno(interrupt->impl.socket_pair.write)); bson_mutex_unlock(&interrupt->mutex); return false; } bson_mutex_unlock(&interrupt->mutex); return true; } #else /* Pipe implementation. */ /* Set non-blocking and close on exec. */ static bool _set_pipe_flags(int pipe_fd) { int flags; flags = fcntl(pipe_fd, F_GETFL); if (-1 == fcntl(pipe_fd, F_SETFL, (flags | O_NONBLOCK))) { return false; } #ifdef FD_CLOEXEC flags = fcntl(pipe_fd, F_GETFD); if (-1 == fcntl(pipe_fd, F_SETFD, (flags | FD_CLOEXEC))) { return false; } #endif return true; } mongoc_interrupt_t * _mongoc_interrupt_new(uint32_t timeout_ms) { mongoc_interrupt_t *interrupt; mongoc_socket_t *interrupt_socket = NULL; bool success = false; ENTRY; BSON_UNUSED(timeout_ms); interrupt = (mongoc_interrupt_t *)bson_malloc0(sizeof *interrupt); bson_mutex_init(&interrupt->mutex); if (0 != pipe(interrupt->impl.pipe_fds)) { _log_errno("pipe creation failed", errno); GOTO(fail); } /* Make the pipe non-blocking and close-on-exec. */ if (!_set_pipe_flags(interrupt->impl.pipe_fds[0]) || !_set_pipe_flags(interrupt->impl.pipe_fds[1])) { _log_errno("unable to configure pipes", errno); } /* Create an unowned socket. interrupt_socket has 0 for the pid, so it will * be considered unowned. */ interrupt_socket = bson_malloc0(sizeof(mongoc_socket_t)); interrupt_socket->sd = interrupt->impl.pipe_fds[0]; /* Creating the stream takes ownership of the mongoc_socket_t. */ interrupt->stream = mongoc_stream_socket_new(interrupt_socket); success = true; fail: if (!success) { _mongoc_interrupt_destroy(interrupt); interrupt = NULL; } RETURN(interrupt); } bool _mongoc_interrupt_flush(mongoc_interrupt_t *interrupt) { char c; while (true) { if (read(interrupt->impl.pipe_fds[0], &c, 1) == -1) { if (MONGOC_ERRNO_IS_AGAIN(errno)) { /* Nothing left to read. */ return true; } else { /* Unexpected error. */ MONGOC_ERROR("failed to read from pipe: %d", errno); return false; } } } BSON_UNREACHABLE("reached unreachable code"); } bool _mongoc_interrupt_interrupt(mongoc_interrupt_t *interrupt) { bson_mutex_lock(&interrupt->mutex); if (write(interrupt->impl.pipe_fds[1], "!", 1) == -1 && !MONGOC_ERRNO_IS_AGAIN(errno)) { MONGOC_ERROR("failed to write to pipe: %d", errno); bson_mutex_unlock(&interrupt->mutex); return false; } bson_mutex_unlock(&interrupt->mutex); return true; } void _mongoc_interrupt_destroy(mongoc_interrupt_t *interrupt) { if (!interrupt) { return; } bson_mutex_destroy(&interrupt->mutex); if (interrupt->impl.pipe_fds[0]) { close(interrupt->impl.pipe_fds[0]); } if (interrupt->impl.pipe_fds[1]) { close(interrupt->impl.pipe_fds[1]); } mongoc_stream_destroy(interrupt->stream); bson_free(interrupt); } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-iovec.h000066400000000000000000000023671511661753600237360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_IOVEC_H #define MONGOC_IOVEC_H #include #ifdef _WIN32 #include #else #include #endif BSON_BEGIN_DECLS #ifdef _WIN32 typedef struct { size_t iov_len; char *iov_base; } mongoc_iovec_t; BSON_STATIC_ASSERT2(sizeof_iovect_t, sizeof(mongoc_iovec_t) == sizeof(WSABUF)); BSON_STATIC_ASSERT2(offsetof_iovec_base, offsetof(mongoc_iovec_t, iov_base) == offsetof(WSABUF, buf)); BSON_STATIC_ASSERT2(offsetof_iovec_len, offsetof(mongoc_iovec_t, iov_len) == offsetof(WSABUF, len)); #else typedef struct iovec mongoc_iovec_t; #endif BSON_END_DECLS #endif /* MONGOC_IOVEC_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-linux-distro-scanner-private.h000066400000000000000000000032731511661753600303660ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_LINUX_DISTRO_SCANNER_PRIVATE_H #define MONGOC_LINUX_DISTRO_SCANNER_PRIVATE_H #include #ifdef MONGOC_OS_IS_LINUX BSON_BEGIN_DECLS bool _mongoc_linux_distro_scanner_get_distro(char **name, char **version); /* These functions are exposed so we can test them separately. */ void _mongoc_linux_distro_scanner_read_key_value_file(const char *path, const char *name_key, ssize_t name_key_len, char **name, const char *version_key, ssize_t version_key_len, char **version); void _mongoc_linux_distro_scanner_read_generic_release_file(const char **paths, char **name, char **version); void _mongoc_linux_distro_scanner_split_line_by_release(const char *line, ssize_t line_len, char **name, char **version); BSON_END_DECLS #endif #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-linux-distro-scanner.c000066400000000000000000000241311511661753600267050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_OS_IS_LINUX #include #include #include #include #include #include #include #include #include #define LINE_BUFFER_SIZE 1024 /* * fgets() wrapper which removes '\n' at the end of the string * Return 0 on failure or EOF. */ static size_t _fgets_wrapper(char *buffer, size_t buffer_size, FILE *f) { char *fgets_res; size_t len; fgets_res = fgets(buffer, buffer_size, f); if (!fgets_res) { /* Didn't read anything. Empty file or error. */ if (ferror(f)) { TRACE("fgets() failed with error %d", errno); } return 0; } /* Chop off trailing \n */ len = strlen(buffer); if (len > 0 && buffer[len - 1] == '\n') { buffer[len - 1] = '\0'; len--; } else if (len == buffer_size - 1) { /* We read buffer_size bytes without hitting a newline * therefore the line is super long, so we say this file is invalid. * This is important since if we are in this situation, the NEXT call to * fgets() will keep reading where we left off. * * This protects us from files like: * aaaaa...DISTRIB_ID=nasal demons */ TRACE("Found line of length %zu, bailing out", len); return 0; } return len; } static void _process_line(const char *name_key, size_t name_key_len, char **name, const char *version_key, size_t version_key_len, char **version, const char *line, size_t line_len) { size_t key_len; const char *equal_sign; const char *value; const char *needle = "="; size_t value_len = 0; ENTRY; /* Figure out where = is. Everything before is the key, * and everything after is the value */ equal_sign = strstr(line, needle); if (equal_sign == NULL) { TRACE("Encountered malformed line: %s", line); /* This line is malformed/incomplete, so skip it */ EXIT; } /* Should never happen since we null terminated this line */ BSON_ASSERT(equal_sign < line + line_len); key_len = equal_sign - line; value = equal_sign + strlen(needle); value_len = strlen(value); if (value_len > 2 && value[0] == '"' && value[value_len - 1] == '"') { value_len -= 2; value++; } /* If we find two copies of either key, the *name == NULL check will fail * so we will just keep the first value encountered. */ if (name_key_len == key_len && strncmp(line, name_key, key_len) == 0 && !(*name)) { *name = bson_strndup(value, value_len); TRACE("Found name: %s", *name); } else if (version_key_len == key_len && strncmp(line, version_key, key_len) == 0 && !(*version)) { *version = bson_strndup(value, value_len); TRACE("Found version: %s", *version); } EXIT; } /* * Parse a file of the form: * KEY=VALUE * Looking for name_key and version_key, and storing * their values into *name and *version. * The values in *name and *version must be freed with bson_free. */ void _mongoc_linux_distro_scanner_read_key_value_file(const char *path, const char *name_key, ssize_t name_key_len, char **name, const char *version_key, ssize_t version_key_len, char **version) { const int max_lines = 100; int lines_read = 0; char buffer[LINE_BUFFER_SIZE]; size_t buflen; FILE *f; ENTRY; *name = NULL; *version = NULL; if (name_key_len < 0) { name_key_len = strlen(name_key); } if (version_key_len < 0) { version_key_len = strlen(version_key); } if (access(path, R_OK)) { TRACE("No permission to read from %s: errno: %d", path, errno); EXIT; } f = fopen(path, "r"); if (!f) { TRACE("fopen failed on %s: %d", path, errno); EXIT; } while (lines_read < max_lines) { buflen = _fgets_wrapper(buffer, sizeof(buffer), f); if (buflen == 0) { /* Error or eof */ break; } _process_line(name_key, name_key_len, name, version_key, version_key_len, version, buffer, buflen); if (*version && *name) { /* No point in reading any more */ break; } lines_read++; } fclose(f); EXIT; } /* * Find the first string in a list which is a valid file. Assumes * passed in list is NULL terminated! */ const char * _get_first_existing(const char **paths) { const char **p = &paths[0]; ENTRY; for (; *p != NULL; p++) { if (access(*p, F_OK)) { /* Just doesn't exist */ continue; } if (access(*p, R_OK)) { TRACE("file %s exists, but cannot be read: error %d", *p, errno); continue; } RETURN(*p); } RETURN(NULL); } /* * Given a line of text, split it by the word "release." For example: * Ubuntu release 14.04 => * *name = Ubuntu * *version = 14.04 * If the word "release" isn't found then we put the whole string into *name * (even if the string is empty). */ void _mongoc_linux_distro_scanner_split_line_by_release(const char *line, ssize_t line_len, char **name, char **version) { const char *needle_loc; const char *const needle = " release "; const char *version_string; *name = NULL; *version = NULL; if (line_len < 0) { line_len = strlen(line); } needle_loc = strstr(line, needle); if (!needle_loc) { *name = bson_strdup(line); return; } else if (needle_loc == line) { /* The file starts with the word " release " * This file is weird enough we will just abandon it. */ return; } *name = bson_strndup(line, needle_loc - line); version_string = needle_loc + strlen(needle); if (version_string == line + line_len) { /* Weird. The file just ended with "release " */ return; } *version = bson_strdup(version_string); } /* * Search for a *-release file, and read its contents. */ void _mongoc_linux_distro_scanner_read_generic_release_file(const char **paths, char **name, char **version) { const char *path; size_t buflen; char buffer[LINE_BUFFER_SIZE]; FILE *f; ENTRY; *name = NULL; *version = NULL; path = _get_first_existing(paths); if (!path) { EXIT; } f = fopen(path, "r"); if (!f) { TRACE("Found %s exists and readable but couldn't open: %d", path, errno); EXIT; } /* Read the first line of the file, look for the word "release" */ buflen = _fgets_wrapper(buffer, sizeof(buffer), f); if (buflen > 0) { TRACE("Trying to split buffer with contents %s", buffer); /* Try splitting the string. If we can't it'll store everything in * *name. */ _mongoc_linux_distro_scanner_split_line_by_release(buffer, buflen, name, version); } fclose(f); EXIT; } static void _get_kernel_version_from_uname(char **version) { struct utsname system_info; if (uname(&system_info) >= 0) { *version = bson_strdup_printf("kernel %s", system_info.release); } else { *version = NULL; } } /* * Some boilerplate logic that tries to set *name and *version to new_name * and new_version if it's not already set. Values of new_name and new_version * should not be used after this call. */ static bool _set_name_and_version_if_needed(char **name, char **version, char *new_name, char *new_version) { if (new_name && !(*name)) { *name = new_name; } else { bson_free(new_name); } if (new_version && !(*version)) { *version = new_version; } else { bson_free(new_version); } return (*name) && (*version); } bool _mongoc_linux_distro_scanner_get_distro(char **name, char **version) { /* In case we decide to try looking up name/version again */ char *new_name; char *new_version; const char *generic_release_paths[] = { "/etc/redhat-release", "/etc/novell-release", "/etc/gentoo-release", "/etc/SuSE-release", "/etc/SUSE-release", "/etc/sles-release", "/etc/debian_release", "/etc/slackware-version", "/etc/centos-release", NULL, }; ENTRY; *name = NULL; *version = NULL; _mongoc_linux_distro_scanner_read_key_value_file("/etc/os-release", "NAME", -1, name, "VERSION_ID", -1, version); if (*name && *version) { RETURN(true); } _mongoc_linux_distro_scanner_read_key_value_file( "/etc/lsb-release", "DISTRIB_ID", -1, &new_name, "DISTRIB_RELEASE", -1, &new_version); if (_set_name_and_version_if_needed(name, version, new_name, new_version)) { RETURN(true); } /* Try to read from a generic release file */ _mongoc_linux_distro_scanner_read_generic_release_file(generic_release_paths, &new_name, &new_version); if (_set_name_and_version_if_needed(name, version, new_name, new_version)) { RETURN(true); } if (*version == NULL) { _get_kernel_version_from_uname(version); } if (*name && *version) { RETURN(true); } bson_free(*name); bson_free(*version); *name = NULL; *version = NULL; RETURN(false); } #else /* ensure the translation unit is not empty */ extern int mongoc_os_is_not_linux; #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-list-private.h000066400000000000000000000023511511661753600252450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_LIST_H #define MONGOC_LIST_H #include BSON_BEGIN_DECLS typedef struct _mongoc_list_t mongoc_list_t; struct _mongoc_list_t { mongoc_list_t *next; void *data; }; mongoc_list_t * _mongoc_list_append(mongoc_list_t *list, void *data); mongoc_list_t * _mongoc_list_prepend(mongoc_list_t *list, void *data); mongoc_list_t * _mongoc_list_remove(mongoc_list_t *list, void *data); void _mongoc_list_foreach(mongoc_list_t *list, void (*func)(void *data, void *user_data), void *user_data); void _mongoc_list_destroy(mongoc_list_t *list); BSON_END_DECLS #endif /* MONGOC_LIST_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-list.c000066400000000000000000000057611511661753600236000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include /** * mongoc_list_append: * @list: A list to append to, or NULL. * @data: Data to append to @list. * * Appends a new link onto the linked list. * * Returns: @list or a new list if @list is NULL. */ mongoc_list_t * _mongoc_list_append(mongoc_list_t *list, void *data) { mongoc_list_t *item; mongoc_list_t *iter; item = (mongoc_list_t *)bson_malloc0(sizeof *item); item->data = (void *)data; if (!list) { return item; } for (iter = list; iter->next; iter = iter->next) { } iter->next = item; return list; } /** * mongoc_list_prepend: * @list: A mongoc_list_t or NULL. * @data: data to prepend to the list. * * Prepends to @list a new link containing @data. * * Returns: A new link containing data with @list following. */ mongoc_list_t * _mongoc_list_prepend(mongoc_list_t *list, void *data) { mongoc_list_t *item; item = (mongoc_list_t *)bson_malloc0(sizeof *item); item->data = (void *)data; item->next = list; return item; } /** * mongoc_list_remove: * @list: A mongoc_list_t. * @data: Data to remove from @list. * * Removes the link containing @data from @list. * * Returns: @list with the link containing @data removed. */ mongoc_list_t * _mongoc_list_remove(mongoc_list_t *list, void *data) { mongoc_list_t *iter; mongoc_list_t *prev = NULL; mongoc_list_t *ret = list; BSON_ASSERT(list); for (iter = list; iter; iter = iter->next) { if (iter->data == data) { if (iter != list) { prev->next = iter->next; } else { ret = iter->next; } bson_free(iter); break; } prev = iter; } return ret; } /** * mongoc_list_foreach: * @list: A mongoc_list_t or NULL. * @func: A func to call for each link in @list. * @user_data: User data for @func. * * Calls @func for each item in @list. */ void _mongoc_list_foreach(mongoc_list_t *list, void (*func)(void *data, void *user_data), void *user_data) { mongoc_list_t *iter; BSON_ASSERT(func); for (iter = list; iter; iter = iter->next) { func(iter->data, user_data); } } /** * mongoc_list_destroy: * @list: A mongoc_list_t. * * Destroys @list and releases any resources. */ void _mongoc_list_destroy(mongoc_list_t *list) { mongoc_list_t *tmp = list; while (list) { tmp = list->next; bson_free(list); list = tmp; } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-log-and-monitor-private.c000066400000000000000000000102701511661753600272720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /** * @brief Initializes the contents of a just-allocated mongoc_log_and_monitor_instance_t * * Captures default structured log options from the environment */ void mongoc_log_and_monitor_instance_init(mongoc_log_and_monitor_instance_t *new_instance) { BSON_ASSERT_PARAM(new_instance); mongoc_log_and_monitor_instance_set_apm_callbacks(new_instance, NULL, NULL); /* This apm_mutex currently only provides explicit exclusion for heartbeat events. It was introduced along with * background monitoring threads, to retain compatibility with existing code and with the SDAM spec guarantee: * * "Events and log messages MUST be published in the order that their corresponding changes are processed in the * driver. Events MUST NOT be published concurrently for the same topology ID or server ID, but MAY be published * concurrently for differing topology IDs and server IDs." * * We may want to re-examine the scope of this mutex. It's broader than necessary for strict compliance (per-pool * rather than per-server) and it's unclear that this always provides the necessary exclusion between different event * types on the same server. */ bson_mutex_init(&new_instance->apm_mutex); mongoc_structured_log_opts_t *structured_log_opts = mongoc_structured_log_opts_new(); new_instance->structured_log = mongoc_structured_log_instance_new(structured_log_opts); mongoc_structured_log_opts_destroy(structured_log_opts); } /** * @brief Destroy the contents of a mongoc_log_and_monitor_instance_t * * Does not try to free the outer memory allocation; it will be part of another object. * There must not be any other threads using the instance concurrently. */ void mongoc_log_and_monitor_instance_destroy_contents(mongoc_log_and_monitor_instance_t *instance) { BSON_ASSERT_PARAM(instance); BSON_ASSERT(instance->structured_log); mongoc_structured_log_instance_destroy(instance->structured_log); instance->structured_log = NULL; bson_mutex_destroy(&instance->apm_mutex); } /** * @brief Set the APM callbacks in a mongoc_log_and_monitor_instance_t * * There must not be any other threads using the instance concurrently. * In single threaded mode, this is only valid on the thread that owns the * client. In pooled mode, it's only valid prior to the first client init. */ void mongoc_log_and_monitor_instance_set_apm_callbacks(mongoc_log_and_monitor_instance_t *instance, const mongoc_apm_callbacks_t *callbacks, void *context) { BSON_ASSERT_PARAM(instance); instance->apm_callbacks = callbacks ? *callbacks : (mongoc_apm_callbacks_t){0}; instance->apm_context = context; } /** * @brief Set the structured log options in a mongoc_log_and_monitor_instance_t * * Replace the instance's structured logging options. Options are copied. * * There must not be any other threads using the instance concurrently. * In single threaded mode, this is only valid on the thread that owns the * client. In pooled mode, it's only valid prior to the first client init. */ void mongoc_log_and_monitor_instance_set_structured_log_opts(mongoc_log_and_monitor_instance_t *instance, const mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(instance); mongoc_structured_log_instance_destroy(instance->structured_log); instance->structured_log = mongoc_structured_log_instance_new(opts); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-log-and-monitor-private.h000066400000000000000000000040431511661753600273000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_LOG_AND_MONITOR_PRIVATE_H #define MONGOC_LOG_AND_MONITOR_PRIVATE_H #include #include struct mongoc_structured_log_instance_t; struct mongoc_structured_log_opts_t; /* * @brief Logging and monitoring instance * * Includes APM callbacks, APM callback context, and the structured logging instance. * * It's owned by mongoc_topology_t on behalf of client/pool and borrowed by topology_description methods. */ typedef struct _mongoc_log_and_monitor_instance_t { bson_mutex_t apm_mutex; mongoc_apm_callbacks_t apm_callbacks; void *apm_context; struct mongoc_structured_log_instance_t *structured_log; } mongoc_log_and_monitor_instance_t; void mongoc_log_and_monitor_instance_init(mongoc_log_and_monitor_instance_t *new_instance); void mongoc_log_and_monitor_instance_destroy_contents(mongoc_log_and_monitor_instance_t *instance); void mongoc_log_and_monitor_instance_set_apm_callbacks(mongoc_log_and_monitor_instance_t *instance, const mongoc_apm_callbacks_t *callbacks, void *context); void mongoc_log_and_monitor_instance_set_structured_log_opts(mongoc_log_and_monitor_instance_t *instance, const struct mongoc_structured_log_opts_t *opts); #endif /* MONGOC_LOG_AND_MONITOR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-log-private.h000066400000000000000000000027561511661753600250640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_LOG_PRIVATE_H #define MONGOC_LOG_PRIVATE_H #include // IWYU pragma: export // #include /* just for testing */ void _mongoc_log_get_handler(mongoc_log_func_t *log_func, void **user_data); bool _mongoc_log_trace_is_enabled(void); void mongoc_log_trace_bytes(const char *domain, const uint8_t *_b, size_t _l); void mongoc_log_trace_iovec(const char *domain, const mongoc_iovec_t *_iov, size_t _iovcnt); #define STOP_LOGGING_CHECK \ if (1) { \ if (!gLogFunc || !_mongoc_log_trace_is_enabled()) { \ return; \ } \ } else \ (void)0 #endif /* MONGOC_LOG_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-log.c000066400000000000000000000174161511661753600234060ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if defined(__linux__) #include #elif defined(_WIN32) #include #elif defined(__APPLE__) #include #include #elif defined(__FreeBSD__) #include #elif defined(__NetBSD__) #include #else #include #endif #include #include #include #include #include #include #include static bson_once_t once = BSON_ONCE_INIT; static bson_mutex_t gLogMutex; static mongoc_log_func_t gLogFunc = mongoc_log_default_handler; bool gLogTrace = MONGOC_TRACE_ENABLED; static void *gLogData; static BSON_ONCE_FUN(_mongoc_ensure_mutex_once) { bson_mutex_init(&gLogMutex); BSON_ONCE_RETURN; } void mongoc_log_set_handler(mongoc_log_func_t log_func, void *user_data) { bson_once(&once, &_mongoc_ensure_mutex_once); bson_mutex_lock(&gLogMutex); gLogFunc = log_func; gLogData = user_data; bson_mutex_unlock(&gLogMutex); } bool _mongoc_log_trace_is_enabled(void) { return gLogTrace && MONGOC_TRACE_ENABLED; } void mongoc_log_trace_enable(void) { /* Enable trace logging if-and-only-if tracing is enabled at configure-time, * otherwise tracing remains disabled. */ gLogTrace = MONGOC_TRACE_ENABLED; } void mongoc_log_trace_disable(void) { gLogTrace = false; } /* just for testing */ void _mongoc_log_get_handler(mongoc_log_func_t *log_func, void **user_data) { *log_func = gLogFunc; *user_data = gLogData; } void mongoc_log(mongoc_log_level_t log_level, const char *log_domain, const char *format, ...) { va_list args; char *message; int stop_logging; bson_once(&once, &_mongoc_ensure_mutex_once); stop_logging = !gLogFunc; stop_logging = stop_logging || (log_level == MONGOC_LOG_LEVEL_TRACE && !_mongoc_log_trace_is_enabled()); if (stop_logging) { return; } BSON_ASSERT(format); va_start(args, format); message = bson_strdupv_printf(format, args); va_end(args); bson_mutex_lock(&gLogMutex); gLogFunc(log_level, log_domain, message, gLogData); bson_mutex_unlock(&gLogMutex); bson_free(message); } const char * mongoc_log_level_str(mongoc_log_level_t log_level) { switch (log_level) { case MONGOC_LOG_LEVEL_ERROR: return "ERROR"; case MONGOC_LOG_LEVEL_CRITICAL: return "CRITICAL"; case MONGOC_LOG_LEVEL_WARNING: return "WARNING"; case MONGOC_LOG_LEVEL_MESSAGE: return "MESSAGE"; case MONGOC_LOG_LEVEL_INFO: return "INFO"; case MONGOC_LOG_LEVEL_DEBUG: return "DEBUG"; case MONGOC_LOG_LEVEL_TRACE: return "TRACE"; default: return "UNKNOWN"; } } void mongoc_log_default_handler(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { struct timeval tv; struct tm tt; time_t t; FILE *stream; char nowstr[32]; int pid; BSON_UNUSED(user_data); bson_gettimeofday(&tv); t = tv.tv_sec; #ifdef _WIN32 #ifdef _MSC_VER localtime_s(&tt, &t); #else tt = *(localtime(&t)); #endif #else localtime_r(&t, &tt); #endif strftime(nowstr, sizeof nowstr, "%Y/%m/%d %H:%M:%S", &tt); switch (log_level) { case MONGOC_LOG_LEVEL_ERROR: case MONGOC_LOG_LEVEL_CRITICAL: case MONGOC_LOG_LEVEL_WARNING: stream = stderr; break; case MONGOC_LOG_LEVEL_MESSAGE: case MONGOC_LOG_LEVEL_INFO: case MONGOC_LOG_LEVEL_DEBUG: case MONGOC_LOG_LEVEL_TRACE: default: stream = stdout; } #ifdef __linux__ pid = syscall(SYS_gettid); #elif defined(_WIN32) pid = (int)_getpid(); #elif defined(__FreeBSD__) long tid; thr_self(&tid); pid = (int)tid; #elif defined(__OpenBSD__) pid = (int)getthrid(); #elif defined(__NetBSD__) pid = (int)_lwp_self(); #elif defined(__APPLE__) #if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 // libc on macOS < 10.7 does not support `pthread_threadid_np` mach_port_t tid = pthread_mach_thread_np(pthread_self()); pid = (int)tid; #else uint64_t tid; pthread_threadid_np(0, &tid); pid = (int)tid; #endif #else pid = (int)getpid(); #endif fprintf(stream, "%s.%04" PRId64 ": [%5d]: %8s: %12s: %s\n", nowstr, (int64_t)(tv.tv_usec / 1000), pid, mongoc_log_level_str(log_level), log_domain, message); } void mongoc_log_trace_bytes(const char *domain, const uint8_t *_b, size_t _l) { STOP_LOGGING_CHECK; mcommon_string_append_t str, astr; mcommon_string_new_as_append(&str); mcommon_string_new_as_append(&astr); size_t _i; for (_i = 0u; _i < _l; _i++) { const uint8_t _v = *(_b + _i); const size_t rem = _i % 16u; if (rem == 0u) { mcommon_string_append_printf(&str, "%05zx: ", _i); } mcommon_string_append_printf(&str, " %02x", _v); if (isprint(_v)) { mcommon_string_append_printf(&astr, " %c", _v); } else { mcommon_string_append(&astr, " ."); } if (rem == 15u) { mongoc_log( MONGOC_LOG_LEVEL_TRACE, domain, "%s %s", mcommon_str_from_append(&str), mcommon_str_from_append(&astr)); mcommon_string_from_append_clear(&str); mcommon_string_from_append_clear(&astr); } else if (rem == 7u) { mcommon_string_append(&str, " "); mcommon_string_append(&astr, " "); } } if (_i != 16u) { mongoc_log( MONGOC_LOG_LEVEL_TRACE, domain, "%-56s %s", mcommon_str_from_append(&str), mcommon_str_from_append(&astr)); } mcommon_string_from_append_destroy(&str); mcommon_string_from_append_destroy(&astr); } void mongoc_log_trace_iovec(const char *domain, const mongoc_iovec_t *_iov, size_t _iovcnt) { const char *_b; unsigned _i = 0; unsigned _j = 0; unsigned _k = 0; size_t _l = 0; uint8_t _v; STOP_LOGGING_CHECK; for (_i = 0; _i < _iovcnt; _i++) { _l += _iov[_i].iov_len; } _i = 0; mcommon_string_append_t str, astr; mcommon_string_new_as_append(&str); mcommon_string_new_as_append(&astr); for (_j = 0; _j < _iovcnt; _j++) { _b = (char *)_iov[_j].iov_base; _l = _iov[_j].iov_len; for (_k = 0; _k < _l; _k++, _i++) { _v = *(_b + _k); if ((_i % 16) == 0) { mcommon_string_append_printf(&str, "%05x: ", _i); } mcommon_string_append_printf(&str, " %02x", _v); if (isprint(_v)) { mcommon_string_append_printf(&astr, " %c", _v); } else { mcommon_string_append(&astr, " ."); } if ((_i % 16) == 15) { mongoc_log( MONGOC_LOG_LEVEL_TRACE, domain, "%s %s", mcommon_str_from_append(&str), mcommon_str_from_append(&astr)); mcommon_string_from_append_clear(&str); mcommon_string_from_append_clear(&astr); } else if ((_i % 16) == 7) { mcommon_string_append(&str, " "); mcommon_string_append(&astr, " "); } } } if (_i != 16) { mongoc_log( MONGOC_LOG_LEVEL_TRACE, domain, "%-56s %s", mcommon_str_from_append(&str), mcommon_str_from_append(&astr)); } mcommon_string_from_append_destroy(&str); mcommon_string_from_append_destroy(&astr); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-log.h000066400000000000000000000074651511661753600234160ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_LOG_H #define MONGOC_LOG_H #include #include BSON_BEGIN_DECLS #ifndef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "mongoc" #endif #define MONGOC_ERROR(...) mongoc_log(MONGOC_LOG_LEVEL_ERROR, MONGOC_LOG_DOMAIN, __VA_ARGS__) #define MONGOC_CRITICAL(...) mongoc_log(MONGOC_LOG_LEVEL_CRITICAL, MONGOC_LOG_DOMAIN, __VA_ARGS__) #define MONGOC_WARNING(...) mongoc_log(MONGOC_LOG_LEVEL_WARNING, MONGOC_LOG_DOMAIN, __VA_ARGS__) #define MONGOC_MESSAGE(...) mongoc_log(MONGOC_LOG_LEVEL_MESSAGE, MONGOC_LOG_DOMAIN, __VA_ARGS__) #define MONGOC_INFO(...) mongoc_log(MONGOC_LOG_LEVEL_INFO, MONGOC_LOG_DOMAIN, __VA_ARGS__) #define MONGOC_DEBUG(...) mongoc_log(MONGOC_LOG_LEVEL_DEBUG, MONGOC_LOG_DOMAIN, __VA_ARGS__) typedef enum { MONGOC_LOG_LEVEL_ERROR, MONGOC_LOG_LEVEL_CRITICAL, MONGOC_LOG_LEVEL_WARNING, MONGOC_LOG_LEVEL_MESSAGE, MONGOC_LOG_LEVEL_INFO, MONGOC_LOG_LEVEL_DEBUG, MONGOC_LOG_LEVEL_TRACE, } mongoc_log_level_t; /** * mongoc_log_func_t: * @log_level: The level of the log message. * @log_domain: The domain of the log message, such as "client". * @message: The message generated. * @user_data: User data provided to mongoc_log_set_handler(). * * This function prototype can be used to set a custom log handler for the * libmongoc library. This is useful if you would like to show them in a * user interface or alternate storage. */ typedef void(BSON_CALL *mongoc_log_func_t)(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); /** * mongoc_log_set_handler: * @log_func: A function to handle log messages. * @user_data: User data for @log_func. * * Sets the function to be called to handle logging. */ MONGOC_EXPORT(void) mongoc_log_set_handler(mongoc_log_func_t log_func, void *user_data); /** * mongoc_log: * @log_level: The log level. * @log_domain: The log domain (such as "client"). * @format: The format string for the log message. * * Logs a message using the currently configured logger. * * This method will hold a logging lock to prevent concurrent calls to the * logging infrastructure. It is important that your configured log function * does not re-enter the logging system or deadlock will occur. * */ MONGOC_EXPORT(void) mongoc_log(mongoc_log_level_t log_level, const char *log_domain, const char *format, ...) BSON_GNUC_PRINTF(3, 4); MONGOC_EXPORT(void) mongoc_log_default_handler(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data); /** * mongoc_log_level_str: * @log_level: The log level. * * Returns: The string representation of log_level */ MONGOC_EXPORT(const char *) mongoc_log_level_str(mongoc_log_level_t log_level); /** * mongoc_log_trace_enable: * * Enables tracing at runtime (if it has been enabled at compile time). */ MONGOC_EXPORT(void) mongoc_log_trace_enable(void); /** * mongoc_log_trace_disable: * * Disables tracing at runtime (if it has been enabled at compile time). */ MONGOC_EXPORT(void) mongoc_log_trace_disable(void); BSON_END_DECLS #endif /* MONGOC_LOG_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-macros.h000066400000000000000000000033521511661753600241100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_MACROS_H #define MONGOC_MACROS_H /* Decorate public functions: * - if MONGOC_STATIC, we're compiling a static libmongoc or a program * that uses libmongoc as a static library. Don't decorate functions * - else if MONGOC_COMPILATION, we're compiling a shared libmongoc, * mark public functions for export from the shared lib. * - else, we're compiling a program that uses libmongoc as a shared library, * mark public functions as DLL imports for Microsoft Visual C. */ #ifdef _MSC_VER /* * Microsoft Visual C */ #ifdef MONGOC_STATIC #define MONGOC_API #elif defined(MONGOC_COMPILATION) #define MONGOC_API __declspec(dllexport) #else #define MONGOC_API __declspec(dllimport) #endif #define MONGOC_CALL __cdecl #elif defined(__GNUC__) /* * GCC */ #ifdef MONGOC_STATIC #define MONGOC_API #elif defined(MONGOC_COMPILATION) #define MONGOC_API __attribute__((visibility("default"))) #else #define MONGOC_API #endif #define MONGOC_CALL #else /* * Other compilers */ #define MONGOC_API #define MONGOC_CALL #endif #define MONGOC_EXPORT(type) MONGOC_API type MONGOC_CALL #endif /* MONGOC_MACROS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-memcmp-private.h000066400000000000000000000021271511661753600255510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_MEMCMP_PRIVATE_H #define MONGOC_MEMCMP_PRIVATE_H #include #include /* WARNING: mongoc_memcmp() must be used to verify if two secret keys * are equal, in constant time. * It returns 0 if the keys are equal, and -1 if they differ. * This function is not designed for lexicographical comparisons. */ int mongoc_memcmp(const void *const b1, const void *const b2, size_t len); #endif /* MONGOC_MEMCMP_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-memcmp.c000066400000000000000000000020601511661753600240700ustar00rootroot00000000000000/* * Copyright (c) 2013-2015 * Frank Denis * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include int mongoc_memcmp(const void *const b1, const void *const b2, size_t len) { const unsigned char *p1 = b1, *p2 = b2; int ret = 0; for (; len > 0; len--) { ret |= *p1++ ^ *p2++; } return ret ? 1 : 0; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ocsp-cache-private.h000066400000000000000000000031601511661753600262760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OCSP_CACHE_PRIVATE_H #define MONGOC_OCSP_CACHE_PRIVATE_H #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #ifdef MONGOC_ENABLE_OCSP_OPENSSL #include void _mongoc_ocsp_cache_init(void); void _mongoc_ocsp_cache_set_resp( OCSP_CERTID *id, int cert_status, int reason, ASN1_GENERALIZEDTIME *this_update, ASN1_GENERALIZEDTIME *next_update); int _mongoc_ocsp_cache_length(void); bool _mongoc_ocsp_cache_get_status(OCSP_CERTID *id, int *cert_status, int *reason, ASN1_GENERALIZEDTIME **this_update, ASN1_GENERALIZEDTIME **next_update); void _mongoc_ocsp_cache_cleanup(void); #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ #endif /* MONGOC_ENABLE_SSL_OPENSSL */ /* ensure the translation unit is not empty */ extern int no_mongoc_ocsp_cache; #endif /* MONGO_C_DRIVER_MONGOC_OCSP_CACHE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ocsp-cache.c000066400000000000000000000127611511661753600246300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_OCSP_OPENSSL #include #include #include #include #include typedef struct _cache_entry_list_t { struct _cache_entry_list_t *next; OCSP_CERTID *id; int cert_status, reason; ASN1_GENERALIZEDTIME *this_update, *next_update; } cache_entry_list_t; static cache_entry_list_t *cache; static bson_mutex_t ocsp_cache_mutex; void _mongoc_ocsp_cache_init(void) { bson_mutex_init(&ocsp_cache_mutex); } static int cache_cmp(cache_entry_list_t *out, OCSP_CERTID *id) { ENTRY; if (!out || !out->id || !id) { RETURN(1); } RETURN(OCSP_id_cmp(out->id, id)); } static cache_entry_list_t * get_cache_entry(OCSP_CERTID *id) { cache_entry_list_t *iter = NULL; ENTRY; LL_SEARCH(cache, iter, id, cache_cmp); RETURN(iter); } #define REPLACE_ASN1_TIME(_old, _new) \ do { \ if ((_new)) { \ if ((_old)) \ ASN1_GENERALIZEDTIME_free((_old)); \ (_old) = ASN1_item_dup(ASN1_ITEM_rptr(ASN1_TIME), (_new)); \ } \ } while (0) static void update_entry(cache_entry_list_t *entry, int cert_status, int reason, ASN1_GENERALIZEDTIME *this_update, ASN1_GENERALIZEDTIME *next_update) { ENTRY; REPLACE_ASN1_TIME(entry->next_update, next_update); REPLACE_ASN1_TIME(entry->this_update, this_update); entry->cert_status = cert_status; entry->reason = reason; } #if OPENSSL_VERSION_NUMBER >= 0x10101000L static int _cmp_time(ASN1_TIME *a, ASN1_TIME *b) { return ASN1_TIME_compare(a, b); } #else static int _cmp_time(ASN1_TIME *a, ASN1_TIME *b) { /* For older OpenSSL, always report that "a" is before "b". I.e. do not * replace the entry. * If a driver would accept a stapled OCSP response and that response has a * later nextUpdate than the response already in the cache, drivers SHOULD * replace the older entry in the cache with the fresher response. */ return -1; } #endif void _mongoc_ocsp_cache_set_resp( OCSP_CERTID *id, int cert_status, int reason, ASN1_GENERALIZEDTIME *this_update, ASN1_GENERALIZEDTIME *next_update) { cache_entry_list_t *entry = NULL; ENTRY; bson_mutex_lock(&ocsp_cache_mutex); if (!(entry = get_cache_entry(id))) { entry = bson_malloc0(sizeof(cache_entry_list_t)); entry->id = OCSP_CERTID_dup(id); LL_APPEND(cache, entry); update_entry(entry, cert_status, reason, this_update, next_update); } else if (next_update && _cmp_time(next_update, entry->next_update) == 1) { update_entry(entry, cert_status, reason, this_update, next_update); } else { /* Do nothing; our next_update is at a later date */ } bson_mutex_unlock(&ocsp_cache_mutex); } int _mongoc_ocsp_cache_length(void) { cache_entry_list_t *iter; int counter; bson_mutex_lock(&ocsp_cache_mutex); LL_COUNT(cache, iter, counter); bson_mutex_unlock(&ocsp_cache_mutex); RETURN(counter); } static void cache_entry_destroy(cache_entry_list_t *entry) { OCSP_CERTID_free(entry->id); ASN1_GENERALIZEDTIME_free(entry->this_update); ASN1_GENERALIZEDTIME_free(entry->next_update); bson_free(entry); } bool _mongoc_ocsp_cache_get_status(OCSP_CERTID *id, int *cert_status, int *reason, ASN1_GENERALIZEDTIME **this_update, ASN1_GENERALIZEDTIME **next_update) { cache_entry_list_t *entry = NULL; bool ret = false; ENTRY; bson_mutex_lock(&ocsp_cache_mutex); if (!(entry = get_cache_entry(id))) { GOTO(done); } if (entry->this_update && entry->next_update && !OCSP_check_validity(entry->this_update, entry->next_update, 0L, -1L)) { LL_DELETE(cache, entry); cache_entry_destroy(entry); GOTO(done); } BSON_ASSERT_PARAM(cert_status); BSON_ASSERT_PARAM(reason); BSON_ASSERT_PARAM(this_update); BSON_ASSERT_PARAM(next_update); *cert_status = entry->cert_status; *reason = entry->reason; *this_update = entry->this_update; *next_update = entry->next_update; ret = true; done: bson_mutex_unlock(&ocsp_cache_mutex); RETURN(ret); } void _mongoc_ocsp_cache_cleanup(void) { cache_entry_list_t *iter = NULL; cache_entry_list_t *next = NULL; ENTRY; bson_mutex_lock(&ocsp_cache_mutex); for (iter = cache; iter != NULL; iter = next) { next = iter->next; cache_entry_destroy(iter); } cache = NULL; bson_mutex_unlock(&ocsp_cache_mutex); bson_mutex_destroy(&ocsp_cache_mutex); } #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-cache-private.h000066400000000000000000000072501511661753600262540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_OIDC_CACHE_PRIVATE_H #define MONGOC_OIDC_CACHE_PRIVATE_H #include #include struct _mongoc_uri_t; // Forward declaration. // mongoc_oidc_cache_t implements the OIDC spec "Client Cache". // Stores the OIDC callback, cache, and lock. // Expected to be shared among all clients in a pool. typedef struct mongoc_oidc_cache_t mongoc_oidc_cache_t; mongoc_oidc_cache_t * mongoc_oidc_cache_new(void); // mongoc_oidc_cache_apply_env_from_uri tries to set a callback if the URI includes an ENVIRONMENT. // Assumes `uri` was already validated with a call to `mongoc_uri_finalize_auth`. void mongoc_oidc_cache_apply_env_from_uri(mongoc_oidc_cache_t *cache, const struct _mongoc_uri_t *uri); // mongoc_oidc_cache_set_user_callback sets the token callback. // Not thread safe. Call before any authentication can occur. void mongoc_oidc_cache_set_user_callback(mongoc_oidc_cache_t *cache, const mongoc_oidc_callback_t *cb); // mongoc_oidc_cache_has_user_callback returns true if a custom callback was set. bool mongoc_oidc_cache_has_user_callback(const mongoc_oidc_cache_t *cache); // mongoc_oidc_cache_set_usleep_fn sets a custom sleep function. // Not thread safe. Call before any authentication can occur. void mongoc_oidc_cache_set_usleep_fn(mongoc_oidc_cache_t *cache, mongoc_usleep_func_t usleep_fn, void *usleep_data); // mongoc_oidc_cache_get_token returns a token or NULL on error. Thread safe. // Sets *found_in_cache to indicate if the returned token came from the cache or callback. // Calls sleep if needed to enforce 100ms delay between calls to the callback. char * mongoc_oidc_cache_get_token(mongoc_oidc_cache_t *cache, bool *found_in_cache, bson_error_t *error); // mongoc_oidc_cache_get_cached_token returns a cached token or NULL if none is cached. Thread safe. char * mongoc_oidc_cache_get_cached_token(const mongoc_oidc_cache_t *cache); // mongoc_oidc_cache_set_cached_token overwrites the cached token. Useful for tests. Thread safe. void mongoc_oidc_cache_set_cached_token(mongoc_oidc_cache_t *cache, const char *token); // mongoc_oidc_cache_invalidate_token invalidates the cached token if it matches `token`. Thread safe. void mongoc_oidc_cache_invalidate_token(mongoc_oidc_cache_t *cache, const char *token); void mongoc_oidc_cache_destroy(mongoc_oidc_cache_t *); // mongoc_oidc_connection_cache_t implements the OIDC spec "Connection Cache". // Stores a possible OIDC access token used to authenticate one mongoc_stream_t. typedef struct mongoc_oidc_connection_cache_t mongoc_oidc_connection_cache_t; mongoc_oidc_connection_cache_t * mongoc_oidc_connection_cache_new(void); // mongoc_oidc_connection_cache_set overwrites the cached token. Pass a NULL token to clear cache. void mongoc_oidc_connection_cache_set(mongoc_oidc_connection_cache_t *cache, const char *token); // mongoc_oidc_connection_cache_get returns the cached token or NULL. char * mongoc_oidc_connection_cache_get(const mongoc_oidc_connection_cache_t *cache); void mongoc_oidc_connection_cache_destroy(mongoc_oidc_connection_cache_t *cache); #endif // MONGOC_OIDC_CACHE_PRIVATE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-cache.c000066400000000000000000000247661511661753600246120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include // MC_DISABLE_CAST_QUAL_WARNING_BEGIN #include #include #include #include #include #include #include #include #define SET_ERROR(...) _mongoc_set_error(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, __VA_ARGS__) struct mongoc_oidc_cache_t { // user_callback is owned. NULL if unset. Not guarded by lock. Set before requesting tokens. // If both user_callback and env_callback are set, an error occurs when requesting a token. mongoc_oidc_callback_t *user_callback; // env_callback is owned. NULL if unset. Not guarded by lock. Set before requesting tokens. // If both user_callback and env_callback are set, an error occurs when requesting a token. mongoc_oidc_env_callback_t *env_callback; // usleep_fn is used to sleep between calls to the callback. Not guarded by lock. Set before requesting tokens. mongoc_usleep_func_t usleep_fn; void *usleep_data; // lock is used to prevent concurrent calls to callback. Guards access to token, last_called, and ever_called. bson_shared_mutex_t lock; // token is a cached OIDC access token. char *token; // last_call tracks the time just after the last call to the callback. mlib_time_point last_called; // ever_called is set to true after the first call to the callback. bool ever_called; }; mongoc_oidc_cache_t * mongoc_oidc_cache_new(void) { mongoc_oidc_cache_t *oidc = bson_malloc0(sizeof(mongoc_oidc_cache_t)); oidc->usleep_fn = mongoc_usleep_default_impl; bson_shared_mutex_init(&oidc->lock); return oidc; } void mongoc_oidc_cache_apply_env_from_uri(mongoc_oidc_cache_t *cache, const mongoc_uri_t *uri) { BSON_ASSERT_PARAM(cache); BSON_ASSERT_PARAM(uri); const char *mechanism = mongoc_uri_get_auth_mechanism(uri); if (!mechanism || 0 != strcmp(mechanism, "MONGODB-OIDC")) { // Not using OIDC. return; } const char *username = mongoc_uri_get_username(uri); bson_t mechanism_properties; if (!mongoc_uri_get_mechanism_properties(uri, &mechanism_properties)) { // Not configured with OIDC environment. return; } bson_iter_t iter; const char *environment = NULL; if (bson_iter_init_find(&iter, &mechanism_properties, "ENVIRONMENT") && BSON_ITER_HOLDS_UTF8(&iter)) { environment = bson_iter_utf8(&iter, NULL); } const mongoc_oidc_env_t *env = mongoc_oidc_env_find(environment); BSON_ASSERT(env); // Checked in mongoc_uri_finalize_auth. BSON_ASSERT(!(username && !mongoc_oidc_env_supports_username(env))); // Checked in mongoc_uri_finalize_auth. const char *token_resource = NULL; if (bson_iter_init_find(&iter, &mechanism_properties, "TOKEN_RESOURCE") && BSON_ITER_HOLDS_UTF8(&iter)) { BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); token_resource = bson_iter_utf8(&iter, NULL); // Checked in mongoc_uri_finalize_auth. } BSON_ASSERT((token_resource != NULL) == mongoc_oidc_env_requires_token_resource(env)); // Checked in mongoc_uri_finalize_auth. BSON_ASSERT(!cache->env_callback); // Not set yet. cache->env_callback = mongoc_oidc_env_callback_new(env, token_resource, username); } void mongoc_oidc_cache_set_user_callback(mongoc_oidc_cache_t *cache, const mongoc_oidc_callback_t *cb) { BSON_ASSERT_PARAM(cache); BSON_OPTIONAL_PARAM(cb); BSON_ASSERT(!cache->ever_called); if (cache->user_callback) { mongoc_oidc_callback_destroy(cache->user_callback); } cache->user_callback = cb ? mongoc_oidc_callback_copy(cb) : NULL; } bool mongoc_oidc_cache_has_user_callback(const mongoc_oidc_cache_t *cache) { BSON_ASSERT_PARAM(cache); return cache->user_callback; } void mongoc_oidc_cache_set_usleep_fn(mongoc_oidc_cache_t *cache, mongoc_usleep_func_t usleep_fn, void *usleep_data) { BSON_ASSERT_PARAM(cache); BSON_OPTIONAL_PARAM(usleep_fn); BSON_OPTIONAL_PARAM(usleep_data); BSON_ASSERT(!cache->ever_called); cache->usleep_fn = usleep_fn ? usleep_fn : mongoc_usleep_default_impl; cache->usleep_data = usleep_data; } void mongoc_oidc_cache_destroy(mongoc_oidc_cache_t *cache) { if (!cache) { return; } bson_free(cache->token); bson_shared_mutex_destroy(&cache->lock); mongoc_oidc_callback_destroy(cache->user_callback); mongoc_oidc_env_callback_destroy(cache->env_callback); bson_free(cache); } char * mongoc_oidc_cache_get_cached_token(const mongoc_oidc_cache_t *cache) { BSON_ASSERT_PARAM(cache); // Cast away const to lock. This function is logically const (read-only). MC_DISABLE_CAST_QUAL_WARNING_BEGIN bson_shared_mutex_lock_shared(&((mongoc_oidc_cache_t *)cache)->lock); char *token = bson_strdup(cache->token); bson_shared_mutex_unlock_shared(&((mongoc_oidc_cache_t *)cache)->lock); MC_DISABLE_CAST_QUAL_WARNING_END return token; } void mongoc_oidc_cache_set_cached_token(mongoc_oidc_cache_t *cache, const char *token) { BSON_ASSERT_PARAM(cache); BSON_OPTIONAL_PARAM(token); char *old_token; // Lock to update token: { bson_shared_mutex_lock(&cache->lock); old_token = cache->token; cache->token = bson_strdup(token); bson_shared_mutex_unlock(&cache->lock); } bson_free(old_token); } char * mongoc_oidc_cache_get_token(mongoc_oidc_cache_t *cache, bool *found_in_cache, bson_error_t *error) { BSON_ASSERT_PARAM(cache); BSON_ASSERT_PARAM(found_in_cache); BSON_OPTIONAL_PARAM(error); char *token = NULL; *found_in_cache = false; if (!cache->user_callback && !cache->env_callback) { SET_ERROR("MONGODB-OIDC requested, but no callback set"); return NULL; } // From spec: "If both ENVIRONMENT and an OIDC Callback [...] are provided the driver MUST raise an error." if (cache->user_callback && cache->env_callback) { SET_ERROR("MONGODB-OIDC requested with both ENVIRONMENT and an OIDC Callback. Use one or the other."); return NULL; } const mongoc_oidc_callback_t *callback = cache->user_callback ? cache->user_callback : mongoc_oidc_env_callback_inner(cache->env_callback); token = mongoc_oidc_cache_get_cached_token(cache); if (NULL != token) { *found_in_cache = true; return token; } // Prepare to call callback outside of lock: mongoc_oidc_credential_t *cred = NULL; mongoc_oidc_callback_params_t *params = mongoc_oidc_callback_params_new(); mongoc_oidc_callback_params_set_user_data(params, mongoc_oidc_callback_get_user_data(callback)); // From spec: "If CSOT is not applied, then the driver MUST use 1 minute as the timeout." // The timeout parameter (when set) is meant to be directly compared against bson_get_monotonic_time(). It is a // time point, not a duration. bson_get_monotonic_time() calls mlib_now(). Use mlib_now() directly. mongoc_oidc_callback_params_set_timeout( params, mlib_microseconds_count(mlib_time_add(mlib_now(), mlib_duration(60, s)).time_since_monotonic_start)); // Obtain write-lock: { bson_shared_mutex_lock(&cache->lock); // Check if another thread populated cache between checking cached token and obtaining write lock: if (cache->token) { *found_in_cache = true; token = bson_strdup(cache->token); goto unlock_and_return; } // From spec: "Wait until it has been at least 100ms since the last callback invocation" if (cache->ever_called) { mlib_duration since_last_call = mlib_time_difference(mlib_now(), cache->last_called); if (mlib_duration_cmp(since_last_call, <, (100, ms))) { mlib_duration to_sleep = mlib_duration((100, ms), minus, since_last_call); cache->usleep_fn(mlib_microseconds_count(to_sleep), cache->usleep_data); } } // Call callback: cred = mongoc_oidc_callback_get_fn(callback)(params); cache->last_called = mlib_now(); cache->ever_called = true; if (!cred) { if (mongoc_oidc_callback_params_get_cancelled_with_timeout(params)) { SET_ERROR("MONGODB-OIDC callback was cancelled due to timeout"); goto unlock_and_return; } SET_ERROR("MONGODB-OIDC callback failed"); goto unlock_and_return; } token = bson_strdup(mongoc_oidc_credential_get_access_token(cred)); cache->token = bson_strdup(token); // Cache a copy. unlock_and_return: bson_shared_mutex_unlock(&cache->lock); } mongoc_oidc_callback_params_destroy(params); mongoc_oidc_credential_destroy(cred); return token; } void mongoc_oidc_cache_invalidate_token(mongoc_oidc_cache_t *cache, const char *token) { BSON_ASSERT_PARAM(cache); BSON_ASSERT_PARAM(token); char *old_token = NULL; // Lock to clear token { bson_shared_mutex_lock(&cache->lock); if (cache->token && 0 == strcmp(cache->token, token)) { old_token = cache->token; cache->token = NULL; } bson_shared_mutex_unlock(&cache->lock); } bson_free(old_token); } struct mongoc_oidc_connection_cache_t { char *token; }; mongoc_oidc_connection_cache_t * mongoc_oidc_connection_cache_new(void) { mongoc_oidc_connection_cache_t *oidc = bson_malloc0(sizeof(mongoc_oidc_connection_cache_t)); return oidc; } void mongoc_oidc_connection_cache_set(mongoc_oidc_connection_cache_t *cache, const char *token) { BSON_ASSERT_PARAM(cache); BSON_OPTIONAL_PARAM(token); bson_free(cache->token); cache->token = bson_strdup(token); } char * mongoc_oidc_connection_cache_get(const mongoc_oidc_connection_cache_t *cache) { BSON_ASSERT_PARAM(cache); return bson_strdup(cache->token); } void mongoc_oidc_connection_cache_destroy(mongoc_oidc_connection_cache_t *cache) { if (!cache) { return; } bson_free(cache->token); bson_free(cache); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-callback-private.h000066400000000000000000000041621511661753600267440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OIDC_CALLBACK_PRIVATE_H #define MONGOC_OIDC_CALLBACK_PRIVATE_H #include // #include // Authentication spec: the version number is used to communicate callback API changes that are not breaking but that // users may want to know about and review their implementation. Drivers MUST pass 1 for the initial callback API // version number and increment the version number anytime the API changes. #define MONGOC_PRIVATE_OIDC_CALLBACK_API_VERSION 1 mongoc_oidc_callback_params_t * mongoc_oidc_callback_params_new(void); void mongoc_oidc_callback_params_destroy(mongoc_oidc_callback_params_t *params); void mongoc_oidc_callback_params_set_version(mongoc_oidc_callback_params_t *params, int32_t version); void mongoc_oidc_callback_params_set_user_data(mongoc_oidc_callback_params_t *params, void *user_data); void mongoc_oidc_callback_params_set_timeout(mongoc_oidc_callback_params_t *params, int64_t timeout); void mongoc_oidc_callback_params_unset_timeout(mongoc_oidc_callback_params_t *params); void mongoc_oidc_callback_params_set_username(mongoc_oidc_callback_params_t *params, const char *username); bool mongoc_oidc_callback_params_get_cancelled_with_timeout(const mongoc_oidc_callback_params_t *params); void mongoc_oidc_callback_params_set_cancelled_with_timeout(mongoc_oidc_callback_params_t *params, bool value); mongoc_oidc_callback_t * mongoc_oidc_callback_copy(const mongoc_oidc_callback_t *callback); #endif // MONGOC_OIDC_CALLBACK_PRIVATE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-callback.c000066400000000000000000000146321511661753600252720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include // #include struct _mongoc_oidc_callback_t { mongoc_oidc_callback_fn_t fn; void *user_data; }; struct _mongoc_oidc_callback_params_t { void *user_data; char *username; int64_t timeout; // Guarded by timeout_is_set. In microseconds since monotonic clock start. int32_t version; bool cancelled_with_timeout; bool timeout_is_set; }; struct _mongoc_oidc_credential_t { char *access_token; int64_t expires_in; // Guarded by expires_in_set. bool expires_in_set; }; mongoc_oidc_callback_t * mongoc_oidc_callback_new(mongoc_oidc_callback_fn_t fn) { if (!fn) { return NULL; } mongoc_oidc_callback_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_oidc_callback_t){.fn = fn}; return ret; } mongoc_oidc_callback_t * mongoc_oidc_callback_new_with_user_data(mongoc_oidc_callback_fn_t fn, void *user_data) { if (!fn) { return NULL; } mongoc_oidc_callback_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_oidc_callback_t){.fn = fn, .user_data = user_data}; return ret; } void mongoc_oidc_callback_destroy(mongoc_oidc_callback_t *callback) { if (callback) { bson_free(callback); } } mongoc_oidc_callback_fn_t mongoc_oidc_callback_get_fn(const mongoc_oidc_callback_t *callback) { BSON_ASSERT_PARAM(callback); return callback->fn; } void * mongoc_oidc_callback_get_user_data(const mongoc_oidc_callback_t *callback) { BSON_ASSERT_PARAM(callback); return callback->user_data; } void mongoc_oidc_callback_set_user_data(mongoc_oidc_callback_t *callback, void *user_data) { BSON_ASSERT_PARAM(callback); callback->user_data = user_data; } mongoc_oidc_callback_params_t * mongoc_oidc_callback_params_new(void) { mongoc_oidc_callback_params_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_oidc_callback_params_t){ .version = MONGOC_PRIVATE_OIDC_CALLBACK_API_VERSION, }; return ret; } void mongoc_oidc_callback_params_destroy(mongoc_oidc_callback_params_t *params) { if (params) { bson_free(params->username); bson_free(params); } } int32_t mongoc_oidc_callback_params_get_version(const mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); return params->version; } void mongoc_oidc_callback_params_set_version(mongoc_oidc_callback_params_t *params, int32_t version) { BSON_ASSERT_PARAM(params); params->version = version; } void * mongoc_oidc_callback_params_get_user_data(const mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); return params->user_data; } void mongoc_oidc_callback_params_set_user_data(mongoc_oidc_callback_params_t *params, void *user_data) { BSON_ASSERT_PARAM(params); params->user_data = user_data; } const int64_t * mongoc_oidc_callback_params_get_timeout(const mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); return params->timeout_is_set ? ¶ms->timeout : NULL; } void mongoc_oidc_callback_params_set_timeout(mongoc_oidc_callback_params_t *params, int64_t timeout) { BSON_ASSERT_PARAM(params); params->timeout = timeout; params->timeout_is_set = true; } void mongoc_oidc_callback_params_unset_timeout(mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); params->timeout_is_set = false; } const char * mongoc_oidc_callback_params_get_username(const mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); return params->username; } void mongoc_oidc_callback_params_set_username(mongoc_oidc_callback_params_t *params, const char *username) { BSON_ASSERT_PARAM(params); bson_free(params->username); params->username = bson_strdup(username); } mongoc_oidc_credential_t * mongoc_oidc_callback_params_cancel_with_timeout(mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); params->cancelled_with_timeout = true; return NULL; } bool mongoc_oidc_callback_params_get_cancelled_with_timeout(const mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); return params->cancelled_with_timeout; } void mongoc_oidc_callback_params_set_cancelled_with_timeout(mongoc_oidc_callback_params_t *params, bool value) { BSON_ASSERT_PARAM(params); params->cancelled_with_timeout = value; } mongoc_oidc_credential_t * mongoc_oidc_credential_new(const char *access_token) { if (!access_token) { return NULL; } mongoc_oidc_credential_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_oidc_credential_t){ .access_token = bson_strdup(access_token), .expires_in_set = false, // Infinite. }; return ret; } mongoc_oidc_credential_t * mongoc_oidc_credential_new_with_expires_in(const char *access_token, int64_t expires_in) { if (!access_token) { return NULL; } if (expires_in < 0) { return NULL; } mongoc_oidc_credential_t *const ret = bson_malloc(sizeof(*ret)); *ret = (mongoc_oidc_credential_t){ .access_token = bson_strdup(access_token), .expires_in_set = true, .expires_in = expires_in, }; return ret; } void mongoc_oidc_credential_destroy(mongoc_oidc_credential_t *cred) { if (cred) { bson_free(cred->access_token); bson_free(cred); } } const char * mongoc_oidc_credential_get_access_token(const mongoc_oidc_credential_t *cred) { BSON_ASSERT_PARAM(cred); return cred->access_token; } const int64_t * mongoc_oidc_credential_get_expires_in(const mongoc_oidc_credential_t *cred) { BSON_ASSERT_PARAM(cred); return cred->expires_in_set ? &cred->expires_in : NULL; } mongoc_oidc_callback_t * mongoc_oidc_callback_copy(const mongoc_oidc_callback_t *callback) { BSON_ASSERT_PARAM(callback); mongoc_oidc_callback_t *const ret = mongoc_oidc_callback_new_with_user_data( mongoc_oidc_callback_get_fn(callback), mongoc_oidc_callback_get_user_data(callback)); BSON_ASSERT(ret); return ret; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-callback.h000066400000000000000000000055511511661753600252770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OIDC_CALLBACK_H #define MONGOC_OIDC_CALLBACK_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_oidc_callback_t mongoc_oidc_callback_t; typedef struct _mongoc_oidc_callback_params_t mongoc_oidc_callback_params_t; typedef struct _mongoc_oidc_credential_t mongoc_oidc_credential_t; typedef mongoc_oidc_credential_t *(MONGOC_CALL *mongoc_oidc_callback_fn_t)(mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(mongoc_oidc_callback_t *) mongoc_oidc_callback_new(mongoc_oidc_callback_fn_t fn); MONGOC_EXPORT(mongoc_oidc_callback_t *) mongoc_oidc_callback_new_with_user_data(mongoc_oidc_callback_fn_t fn, void *user_data); MONGOC_EXPORT(void) mongoc_oidc_callback_destroy(mongoc_oidc_callback_t *callback); MONGOC_EXPORT(mongoc_oidc_callback_fn_t) mongoc_oidc_callback_get_fn(const mongoc_oidc_callback_t *callback); MONGOC_EXPORT(void *) mongoc_oidc_callback_get_user_data(const mongoc_oidc_callback_t *callback); MONGOC_EXPORT(void) mongoc_oidc_callback_set_user_data(mongoc_oidc_callback_t *callback, void *user_data); MONGOC_EXPORT(int32_t) mongoc_oidc_callback_params_get_version(const mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(void *) mongoc_oidc_callback_params_get_user_data(const mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(const int64_t *) mongoc_oidc_callback_params_get_timeout(const mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(const char *) mongoc_oidc_callback_params_get_username(const mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(mongoc_oidc_credential_t *) mongoc_oidc_callback_params_cancel_with_timeout(mongoc_oidc_callback_params_t *params); MONGOC_EXPORT(mongoc_oidc_credential_t *) mongoc_oidc_credential_new(const char *access_token); MONGOC_EXPORT(mongoc_oidc_credential_t *) mongoc_oidc_credential_new_with_expires_in(const char *access_token, int64_t expires_in); MONGOC_EXPORT(void) mongoc_oidc_credential_destroy(mongoc_oidc_credential_t *cred); MONGOC_EXPORT(const char *) mongoc_oidc_credential_get_access_token(const mongoc_oidc_credential_t *cred); MONGOC_EXPORT(const int64_t *) mongoc_oidc_credential_get_expires_in(const mongoc_oidc_credential_t *cred); BSON_END_DECLS #endif // MONGOC_OIDC_CALLBACK_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-env-private.h000066400000000000000000000030731511661753600260000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OIDC_ENV_PRIVATE_H #define MONGOC_OIDC_ENV_PRIVATE_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_oidc_env_t mongoc_oidc_env_t; typedef struct _mongoc_oidc_env_callback_t mongoc_oidc_env_callback_t; const mongoc_oidc_env_t * mongoc_oidc_env_find(const char *name); const char * mongoc_oidc_env_name(const mongoc_oidc_env_t *env); bool mongoc_oidc_env_supports_username(const mongoc_oidc_env_t *env); bool mongoc_oidc_env_requires_token_resource(const mongoc_oidc_env_t *env); mongoc_oidc_env_callback_t * mongoc_oidc_env_callback_new(const mongoc_oidc_env_t *env, const char *token_resource, const char *username); void mongoc_oidc_env_callback_destroy(mongoc_oidc_env_callback_t *env_callback); const mongoc_oidc_callback_t * mongoc_oidc_env_callback_inner(const mongoc_oidc_env_callback_t *env_callback); BSON_END_DECLS #endif // MONGOC_OIDC_ENV_PRIVATE_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-oidc-env.c000066400000000000000000000160261511661753600243250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include struct _mongoc_oidc_env_t { const char *name; mongoc_oidc_callback_fn_t callback_fn; bool supports_username; bool requires_token_resource; }; struct _mongoc_oidc_env_callback_t { mongoc_oidc_callback_t *inner; // Contains non-owning user_data pointer back to this mongoc_oidc_env_callback_t char *token_resource; char *username; }; static mongoc_oidc_credential_t * mongoc_oidc_env_fn_test(mongoc_oidc_callback_params_t *params) { BSON_UNUSED(params); // TODO (CDRIVER-4489) return NULL; } static mongoc_oidc_credential_t * mongoc_oidc_env_fn_azure(mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); bson_error_t error; mcd_azure_access_token token = {0}; mongoc_oidc_credential_t *ret = NULL; mongoc_oidc_env_callback_t *callback = mongoc_oidc_callback_params_get_user_data(params); BSON_ASSERT(callback); mlib_timer timer = {0}; const int64_t *timeout_us = mongoc_oidc_callback_params_get_timeout(params); if (timeout_us) { timer = mlib_expires_at((mlib_time_point){.time_since_monotonic_start = mlib_duration(*timeout_us, us)}); if (mlib_timer_is_expired(timer)) { // No time remaining. Immediately fail. mongoc_oidc_callback_params_cancel_with_timeout(params); goto fail; } } if (!mcd_azure_access_token_from_imds(&token, callback->token_resource, NULL, // Use the default host 0, // Default port as well NULL, // No extra headers timer, callback->username, // Optional client id &error)) { MONGOC_ERROR("Failed to obtain Azure OIDC access token: %s", error.message); goto fail; } ret = mongoc_oidc_credential_new_with_expires_in(token.access_token, mlib_microseconds_count(token.expires_in)); if (!ret) { MONGOC_ERROR("Failed to process Azure OIDC access token"); if (!token.access_token) { MONGOC_ERROR("missing Azure OIDC access token string"); } if (mlib_microseconds_count(token.expires_in) < 0) { MONGOC_ERROR("Azure OIDC access token expiration must not be a negative value"); } goto fail; } fail: mcd_azure_access_token_destroy(&token); return ret; } static mongoc_oidc_credential_t * mongoc_oidc_env_fn_gcp(mongoc_oidc_callback_params_t *params) { BSON_ASSERT_PARAM(params); bson_error_t error; gcp_service_account_token token = {0}; mongoc_oidc_credential_t *ret = NULL; mongoc_oidc_env_callback_t *callback = mongoc_oidc_callback_params_get_user_data(params); BSON_ASSERT(callback); mlib_timer timer = {0}; const int64_t *timeout_us = mongoc_oidc_callback_params_get_timeout(params); if (timeout_us) { timer = mlib_expires_at((mlib_time_point){.time_since_monotonic_start = mlib_duration(*timeout_us, us)}); if (mlib_timer_is_expired(timer)) { // No time remaining. Immediately fail. mongoc_oidc_callback_params_cancel_with_timeout(params); goto fail; } } if (!gcp_identity_token_from_gcp_server(&token, callback->token_resource, timer, &error)) { MONGOC_ERROR("Failed to obtain GCP OIDC access token: %s", error.message); goto fail; } ret = mongoc_oidc_credential_new(token.access_token); if (!ret) { MONGOC_ERROR("Failed to process GCP OIDC access token"); goto fail; } fail: gcp_access_token_destroy(&token); return ret; } static mongoc_oidc_credential_t * mongoc_oidc_env_fn_k8s(mongoc_oidc_callback_params_t *params) { BSON_UNUSED(params); // TODO (CDRIVER-4489) return NULL; } const mongoc_oidc_env_t * mongoc_oidc_env_find(const char *name) { static const mongoc_oidc_env_t oidc_env_table[] = { {.name = "test", .callback_fn = mongoc_oidc_env_fn_test}, {.name = "azure", .supports_username = true, .requires_token_resource = true, .callback_fn = mongoc_oidc_env_fn_azure}, {.name = "gcp", .requires_token_resource = true, .callback_fn = mongoc_oidc_env_fn_gcp}, {.name = "k8s", .callback_fn = mongoc_oidc_env_fn_k8s}, {0}}; if (name) { for (const mongoc_oidc_env_t *row = oidc_env_table; row->name; ++row) { if (!strcmp(name, row->name)) { return row; } } } return NULL; } const char * mongoc_oidc_env_name(const mongoc_oidc_env_t *env) { BSON_ASSERT_PARAM(env); return env->name; } bool mongoc_oidc_env_supports_username(const mongoc_oidc_env_t *env) { BSON_ASSERT_PARAM(env); return env->supports_username; } bool mongoc_oidc_env_requires_token_resource(const mongoc_oidc_env_t *env) { BSON_ASSERT_PARAM(env); return env->requires_token_resource; } mongoc_oidc_env_callback_t * mongoc_oidc_env_callback_new(const mongoc_oidc_env_t *env, const char *token_resource, const char *username) { BSON_ASSERT_PARAM(env); BSON_OPTIONAL_PARAM(token_resource); BSON_OPTIONAL_PARAM(username); mongoc_oidc_env_callback_t *env_callback = bson_malloc(sizeof *env_callback); // Note that the callback's user_data points back to this containing mongoc_oidc_env_callback_t. // We expect that the inner callback can only be destroyed via mongoc_oidc_env_callback_destroy. *env_callback = (mongoc_oidc_env_callback_t){.inner = mongoc_oidc_callback_new_with_user_data(env->callback_fn, env_callback), .token_resource = bson_strdup(token_resource), .username = bson_strdup(username)}; return env_callback; } void mongoc_oidc_env_callback_destroy(mongoc_oidc_env_callback_t *env_callback) { if (env_callback) { BSON_ASSERT(mongoc_oidc_callback_get_user_data(env_callback->inner) == (void *)env_callback); mongoc_oidc_callback_destroy(env_callback->inner); bson_free(env_callback->token_resource); bson_free(env_callback->username); bson_free(env_callback); } } const mongoc_oidc_callback_t * mongoc_oidc_env_callback_inner(const mongoc_oidc_env_callback_t *env_callback) { BSON_ASSERT_PARAM(env_callback); return env_callback->inner; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opcode.c000066400000000000000000000025711511661753600240720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include // Document and ensure consistency between equivalent macros in mcd-rpc and // libmongoc. BSON_STATIC_ASSERT(MONGOC_OP_CODE_COMPRESSED == MONGOC_OPCODE_COMPRESSED); BSON_STATIC_ASSERT(MONGOC_OP_CODE_MSG == MONGOC_OPCODE_MSG); BSON_STATIC_ASSERT(MONGOC_OP_CODE_REPLY == MONGOC_OPCODE_REPLY); BSON_STATIC_ASSERT(MONGOC_OP_CODE_UPDATE == MONGOC_OPCODE_UPDATE); BSON_STATIC_ASSERT(MONGOC_OP_CODE_INSERT == MONGOC_OPCODE_INSERT); BSON_STATIC_ASSERT(MONGOC_OP_CODE_QUERY == MONGOC_OPCODE_QUERY); BSON_STATIC_ASSERT(MONGOC_OP_CODE_GET_MORE == MONGOC_OPCODE_GET_MORE); BSON_STATIC_ASSERT(MONGOC_OP_CODE_DELETE == MONGOC_OPCODE_DELETE); BSON_STATIC_ASSERT(MONGOC_OP_CODE_KILL_CURSORS == MONGOC_OPCODE_KILL_CURSORS); mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opcode.h000066400000000000000000000021231511661753600240700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OPCODE_H #define MONGOC_OPCODE_H #include BSON_BEGIN_DECLS typedef enum { MONGOC_OPCODE_REPLY = 1, MONGOC_OPCODE_UPDATE = 2001, MONGOC_OPCODE_INSERT = 2002, MONGOC_OPCODE_QUERY = 2004, MONGOC_OPCODE_GET_MORE = 2005, MONGOC_OPCODE_DELETE = 2006, MONGOC_OPCODE_KILL_CURSORS = 2007, MONGOC_OPCODE_COMPRESSED = 2012, MONGOC_OPCODE_MSG = 2013, } mongoc_opcode_t; BSON_END_DECLS #endif /* MONGOC_OPCODE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-openssl-private.h000066400000000000000000000030061511661753600257530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OPENSSL_PRIVATE_H #define MONGOC_OPENSSL_PRIVATE_H #include #include #include #include #include #include #if (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_OCSP) && !defined(LIBRESSL_VERSION_NUMBER) #define MONGOC_ENABLE_OCSP_OPENSSL #endif BSON_BEGIN_DECLS bool _mongoc_openssl_check_peer_hostname(SSL *ssl, const char *host, bool allow_invalid_hostname); SSL_CTX * _mongoc_openssl_ctx_new(mongoc_ssl_opt_t *opt); void _mongoc_openssl_init(void); void _mongoc_openssl_cleanup(void); #ifdef MONGOC_ENABLE_OCSP_OPENSSL int _mongoc_ocsp_tlsext_status(SSL *ssl, mongoc_openssl_ocsp_opt_t *opts); #endif bool _mongoc_tlsfeature_has_status_request(const uint8_t *data, int length); BSON_END_DECLS #endif /* MONGOC_OPENSSL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-openssl.c000066400000000000000000000754641511661753600243170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_OCSP_OPENSSL #include #endif #ifdef _WIN32 #include #endif #if OPENSSL_VERSION_NUMBER < 0x10100000L static bson_mutex_t *gMongocOpenSslThreadLocks; static void _mongoc_openssl_thread_startup(void); static void _mongoc_openssl_thread_cleanup(void); #endif #ifndef MONGOC_HAVE_ASN1_STRING_GET0_DATA #define ASN1_STRING_get0_data ASN1_STRING_data #endif static int tlsfeature_nid; /** * _mongoc_openssl_init: * * initialization function for SSL * * This needs to get called early on and is not threadsafe. Called by * mongoc_init. */ void _mongoc_openssl_init(void) { SSL_CTX *ctx; SSL_library_init(); SSL_load_error_strings(); #if OPENSSL_VERSION_NUMBER < 0x30000000L // See: // https://www.openssl.org/docs/man3.0/man7/migration_guide.html#Deprecated-function-mappings ERR_load_BIO_strings(); #endif OpenSSL_add_all_algorithms(); #if OPENSSL_VERSION_NUMBER < 0x10100000L _mongoc_openssl_thread_startup(); #endif ctx = SSL_CTX_new(SSLv23_method()); if (!ctx) { MONGOC_ERROR("Failed to initialize OpenSSL."); } #ifdef NID_tlsfeature tlsfeature_nid = NID_tlsfeature; #else /* TLS versions before 1.1.0 did not define the TLS Feature extension. */ tlsfeature_nid = OBJ_create("1.3.6.1.5.5.7.1.24", "tlsfeature", "TLS Feature"); #endif SSL_CTX_free(ctx); } void _mongoc_openssl_cleanup(void) { #if OPENSSL_VERSION_NUMBER < 0x10100000L _mongoc_openssl_thread_cleanup(); #endif } static int _mongoc_openssl_password_cb(char *buf, int num, int rwflag, void *user_data) { char *pass = (char *)user_data; int pass_len = (int)strlen(pass); BSON_UNUSED(rwflag); if (num < pass_len + 1) { return 0; } bson_strncpy(buf, pass, num); return pass_len; } #ifdef _WIN32 bool _mongoc_openssl_import_cert_store(LPWSTR store_name, DWORD dwFlags, X509_STORE *openssl_store) { PCCERT_CONTEXT cert = NULL; HCERTSTORE cert_store; cert_store = CertOpenStore(CERT_STORE_PROV_SYSTEM, /* provider */ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* certificate encoding */ 0, /* unused */ dwFlags, /* dwFlags */ store_name); /* system store name. "My" or "Root" */ if (cert_store == NULL) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Can't open CA store: %s", msg); bson_free(msg); return false; } while ((cert = CertEnumCertificatesInStore(cert_store, cert)) != NULL) { X509 *x509Obj = d2i_X509(NULL, (const unsigned char **)&cert->pbCertEncoded, cert->cbCertEncoded); if (x509Obj == NULL) { MONGOC_WARNING("Error parsing X509 object from Windows certificate store"); continue; } X509_STORE_add_cert(openssl_store, x509Obj); X509_free(x509Obj); } CertCloseStore(cert_store, 0); return true; } bool _mongoc_openssl_import_cert_stores(SSL_CTX *context) { bool retval; X509_STORE *store = SSL_CTX_get_cert_store(context); if (!store) { MONGOC_WARNING("no X509 store found for SSL context while loading " "system certificates"); return false; } retval = _mongoc_openssl_import_cert_store(L"root", CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG, store); retval &= _mongoc_openssl_import_cert_store(L"CA", CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG, store); return retval; } #endif #if OPENSSL_VERSION_NUMBER > 0x10002000L bool _mongoc_openssl_check_peer_hostname(SSL *ssl, const char *host, bool allow_invalid_hostname) { X509 *peer = NULL; if (allow_invalid_hostname) { return true; } peer = SSL_get_peer_certificate(ssl); if (peer && (X509_check_host(peer, host, 0, 0, NULL) == 1 || X509_check_ip_asc(peer, host, 0) == 1)) { X509_free(peer); return true; } if (peer) { X509_free(peer); } return false; } #else /** mongoc_openssl_hostcheck * * rfc 6125 match a given hostname against a given pattern * * Patterns come from DNS common names or subjectAltNames. * * This code is meant to implement RFC 6125 6.4.[1-3] * */ static bool _mongoc_openssl_hostcheck(const char *pattern, const char *hostname) { const char *pattern_label_end; const char *pattern_wildcard; const char *hostname_label_end; size_t prefixlen; size_t suffixlen; TRACE("Comparing '%s' == '%s'", pattern, hostname); pattern_wildcard = strchr(pattern, '*'); if (pattern_wildcard == NULL) { return strcasecmp(pattern, hostname) == 0; } pattern_label_end = strchr(pattern, '.'); /* Bail out on wildcarding in a couple of situations: * o we don't have 2 dots - we're not going to wildcard root tlds * o the wildcard isn't in the left most group (separated by dots) * o the pattern is embedded in an A-label or U-label */ if (pattern_label_end == NULL || strchr(pattern_label_end + 1, '.') == NULL || pattern_wildcard > pattern_label_end || strncasecmp(pattern, "xn--", 4) == 0) { return strcasecmp(pattern, hostname) == 0; } hostname_label_end = strchr(hostname, '.'); /* we know we have a dot in the pattern, we need one in the hostname */ if (hostname_label_end == NULL || strcasecmp(pattern_label_end, hostname_label_end)) { return 0; } /* The wildcard must match at least one character, so the left part of the * hostname is at least as large as the left part of the pattern. */ if ((hostname_label_end - hostname) < (pattern_label_end - pattern)) { return 0; } /* If the left prefix group before the star matches and right of the star * matches... we have a wildcard match */ prefixlen = pattern_wildcard - pattern; suffixlen = pattern_label_end - (pattern_wildcard + 1); return strncasecmp(pattern, hostname, prefixlen) == 0 && strncasecmp(pattern_wildcard + 1, hostname_label_end - suffixlen, suffixlen) == 0; } /** check if a provided cert matches a passed hostname */ bool _mongoc_openssl_check_peer_hostname(SSL *ssl, const char *host, bool allow_invalid_hostname) { X509 *peer; X509_NAME *subject_name; X509_NAME_ENTRY *entry; ASN1_STRING *entry_data; int length; int idx; int r = 0; long verify_status; size_t addrlen = 0; unsigned char addr4[sizeof(struct in_addr)]; unsigned char addr6[sizeof(struct in6_addr)]; int i; int n_sans = -1; int target = GEN_DNS; STACK_OF(GENERAL_NAME) *sans = NULL; ENTRY; BSON_ASSERT(ssl); BSON_ASSERT(host); if (allow_invalid_hostname) { RETURN(true); } /** if the host looks like an IP address, match that, otherwise we assume we * have a DNS name */ if (inet_pton(AF_INET, host, &addr4)) { target = GEN_IPADD; addrlen = sizeof addr4; } else if (inet_pton(AF_INET6, host, &addr6)) { target = GEN_IPADD; addrlen = sizeof addr6; } peer = SSL_get_peer_certificate(ssl); if (!peer) { MONGOC_WARNING("SSL Certification verification failed: %s", ERR_error_string(ERR_get_error(), NULL)); RETURN(false); } verify_status = SSL_get_verify_result(ssl); if (verify_status == X509_V_OK) { /* gets a stack of alt names that we can iterate through */ sans = (STACK_OF(GENERAL_NAME) *)X509_get_ext_d2i((X509 *)peer, NID_subject_alt_name, NULL, NULL); if (sans) { n_sans = sk_GENERAL_NAME_num(sans); /* loop through the stack, or until we find a match */ for (i = 0; i < n_sans && !r; i++) { const GENERAL_NAME *name = sk_GENERAL_NAME_value(sans, i); /* skip entries that can't apply, I.e. IP entries if we've got a * DNS host */ if (name->type == target) { const char *check; check = (const char *)ASN1_STRING_get0_data(name->d.ia5); length = ASN1_STRING_length(name->d.ia5); switch (target) { case GEN_DNS: /* check that we don't have an embedded null byte */ if (mlib_cmp(length, ==, bson_strnlen(check, length)) && _mongoc_openssl_hostcheck(check, host)) { r = 1; } break; case GEN_IPADD: if (mlib_cmp(length, ==, addrlen)) { if (length == sizeof addr6 && !memcmp(check, &addr6, length)) { r = 1; } else if (length == sizeof addr4 && !memcmp(check, &addr4, length)) { r = 1; } } break; default: BSON_ASSERT(0); break; } } } GENERAL_NAMES_free(sans); } else { subject_name = X509_get_subject_name(peer); if (subject_name) { i = -1; /* skip to the last common name */ while ((idx = X509_NAME_get_index_by_NID(subject_name, NID_commonName, i)) >= 0) { i = idx; } if (i >= 0) { entry = X509_NAME_get_entry(subject_name, i); entry_data = X509_NAME_ENTRY_get_data(entry); if (entry_data) { char *check; /* TODO: I've heard tell that old versions of SSL crap out * when calling ASN1_STRING_to_UTF8 on already utf8 data. * Check up on that */ length = ASN1_STRING_to_UTF8((unsigned char **)&check, entry_data); if (length >= 0) { /* check for embedded nulls */ if (mlib_cmp(length, ==, bson_strnlen(check, length)) && _mongoc_openssl_hostcheck(check, host)) { r = 1; } OPENSSL_free(check); } } } } } } X509_free(peer); RETURN(r); } #endif /* OPENSSL_VERSION_NUMBER */ static bool _mongoc_openssl_setup_ca(SSL_CTX *ctx, const char *cert, const char *cert_dir) { BSON_ASSERT(ctx); BSON_ASSERT(cert || cert_dir); if (!SSL_CTX_load_verify_locations(ctx, cert, cert_dir)) { MONGOC_ERROR("Cannot load Certificate Authorities from '%s' and '%s'", cert, cert_dir); return 0; } return 1; } static bool _mongoc_openssl_setup_crl(SSL_CTX *ctx, const char *crlfile) { X509_STORE *store; X509_LOOKUP *lookup; int status; store = SSL_CTX_get_cert_store(ctx); X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK); lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file()); status = X509_load_crl_file(lookup, crlfile, X509_FILETYPE_PEM); return status != 0; } static bool _mongoc_openssl_setup_pem_file(SSL_CTX *ctx, const char *pem_file, const char *password) { if (!SSL_CTX_use_certificate_chain_file(ctx, pem_file)) { MONGOC_ERROR("Cannot find certificate in '%s'", pem_file); return 0; } if (password) { SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *)password); SSL_CTX_set_default_passwd_cb(ctx, _mongoc_openssl_password_cb); } if (!(SSL_CTX_use_PrivateKey_file(ctx, pem_file, SSL_FILETYPE_PEM))) { MONGOC_ERROR("Cannot find private key in: '%s'", pem_file); return 0; } if (!(SSL_CTX_check_private_key(ctx))) { MONGOC_ERROR("Cannot load private key: '%s'", pem_file); return 0; } return 1; } #ifdef MONGOC_ENABLE_OCSP_OPENSSL static X509 * _get_issuer(X509 *cert, STACK_OF(X509) * chain) { X509 *issuer = NULL, *candidate = NULL; X509_NAME *issuer_name = NULL, *candidate_name = NULL; int i; issuer_name = X509_get_issuer_name(cert); for (i = 0; i < sk_X509_num(chain) && issuer == NULL; i++) { candidate = sk_X509_value(chain, i); candidate_name = X509_get_subject_name(candidate); if (0 == X509_NAME_cmp(candidate_name, issuer_name)) { issuer = candidate; } } RETURN(issuer); } #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* OpenSSL 1.1.0+ has conveniences that we polyfill in older OpenSSL versions. */ STACK_OF(X509) * _get_verified_chain(SSL *ssl) { return SSL_get0_verified_chain(ssl); } void _free_verified_chain(STACK_OF(X509) * verified_chain) { BSON_UNUSED(verified_chain); /* _get_verified_chain does not return a copy. Do nothing. */ return; } const STACK_OF(X509_EXTENSION) * _get_extensions(const X509 *cert) { return X509_get0_extensions(cert); } #else /* Polyfill functionality for pre 1.1.0 OpenSSL */ STACK_OF(X509) * _get_verified_chain(SSL *ssl) { X509_STORE *store = NULL; X509 *peer = NULL; STACK_OF(X509) *peer_chain = NULL; X509_STORE_CTX *store_ctx = NULL; STACK_OF(X509) *verified_chain = NULL; /* Get the certificate the server presented. */ peer = SSL_get_peer_certificate(ssl); /* Get the chain of certificates the server presented. This is not a verified * chain. */ peer_chain = SSL_get_peer_cert_chain(ssl); store = SSL_CTX_get_cert_store(SSL_get_SSL_CTX(ssl)); store_ctx = X509_STORE_CTX_new(); if (!X509_STORE_CTX_init(store_ctx, store, peer, peer_chain)) { MONGOC_ERROR("failed to initialize X509 store"); goto fail; } if (X509_verify_cert(store_ctx) <= 0) { MONGOC_ERROR("failed to obtain verified chain"); goto fail; } verified_chain = X509_STORE_CTX_get1_chain(store_ctx); fail: X509_free(peer); X509_STORE_CTX_free(store_ctx); return verified_chain; } /* On OpenSSL < 1.1.0, this chain isn't attached to the SSL session, so we need * it to dispose of itself. */ void _free_verified_chain(STACK_OF(X509) * verified_chain) { if (!verified_chain) { return; } sk_X509_pop_free(verified_chain, X509_free); } const STACK_OF(X509_EXTENSION) * _get_extensions(const X509 *cert) { return cert->cert_info->extensions; } #endif /* OPENSSL_VERSION_NUMBER */ #define TLSFEATURE_STATUS_REQUEST 5 /* Check a tlsfeature extension contents for a status_request. * * Parse just enough of a DER encoded data to check if a SEQUENCE of INTEGER * contains the status_request extension (5). There are only five tlsfeature * extension types, so this only handles the case that the sequence's length is * representable in one byte, and that each integer is representable in one * byte. */ bool _mongoc_tlsfeature_has_status_request(const uint8_t *data, int length) { int i; /* Expect a sequence type, with a sequence length representable in one byte. */ if (length < 3 || data[0] != 0x30 || data[1] >= 127) { MONGOC_ERROR("malformed tlsfeature extension sequence"); return false; } for (i = 2; i < length; i += 3) { /* Expect an integer, representable in one byte. */ if (length < i + 3 || data[i] != 0x02 || data[i + 1] != 1) { MONGOC_ERROR("malformed tlsfeature extension integer"); return false; } if (data[i + 2] == TLSFEATURE_STATUS_REQUEST) { TRACE("%s", "found status request in tlsfeature extension"); return true; } } return false; } /* Check that the certificate has a tlsfeature extension with status_request. */ bool _get_must_staple(X509 *cert) { const STACK_OF(X509_EXTENSION) *exts = NULL; X509_EXTENSION *ext; ASN1_STRING *ext_data; int idx; exts = _get_extensions(cert); if (!exts) { TRACE("%s", "certificate extensions not found"); return false; } idx = X509v3_get_ext_by_NID(exts, tlsfeature_nid, -1); if (-1 == idx) { TRACE("%s", "tlsfeature extension not found"); return false; } ext = sk_X509_EXTENSION_value(exts, idx); ext_data = X509_EXTENSION_get_data(ext); /* Data is a DER encoded sequence of integers. */ return _mongoc_tlsfeature_has_status_request(ASN1_STRING_get0_data(ext_data), ASN1_STRING_length(ext_data)); } #define ERR_STR (ERR_error_string(ERR_get_error(), NULL)) #define MONGOC_OCSP_REQUEST_TIMEOUT mlib_duration(5, s) static OCSP_RESPONSE * _contact_ocsp_responder(OCSP_CERTID *id, X509 *peer, mongoc_ssl_opt_t *ssl_opts, int *ocsp_uri_count) { STACK_OF(OPENSSL_STRING) *url_stack = NULL; OPENSSL_STRING url = NULL, host = NULL, path = NULL, port = NULL; OCSP_REQUEST *req = NULL; const unsigned char *resp_data; OCSP_RESPONSE *resp = NULL; int i, ssl; url_stack = X509_get1_ocsp(peer); *ocsp_uri_count = sk_OPENSSL_STRING_num(url_stack); for (i = 0; i < *ocsp_uri_count && !resp; i++) { unsigned char *request_der = NULL; int request_der_len; mongoc_http_request_t http_req; mongoc_http_response_t http_res; bson_error_t error; _mongoc_http_request_init(&http_req); _mongoc_http_response_init(&http_res); url = sk_OPENSSL_STRING_value(url_stack, i); TRACE("Contacting OCSP responder '%s'", url); /* splits the given url into its host, port and path components */ if (!OCSP_parse_url(url, &host, &port, &path, &ssl)) { MONGOC_DEBUG("Could not parse URL"); GOTO(retry); } if (!(req = OCSP_REQUEST_new())) { MONGOC_DEBUG("Could not create new OCSP request"); GOTO(retry); } /* add the cert ID to the OCSP request object */ if (!id || !OCSP_request_add0_id(req, OCSP_CERTID_dup(id))) { MONGOC_DEBUG("Could not add cert ID to the OCSP request object"); GOTO(retry); } /* add nonce to OCSP request object */ if (!OCSP_request_add1_nonce(req, 0 /* use random nonce */, -1)) { MONGOC_DEBUG("Could not add nonce to OCSP request object"); GOTO(retry); } request_der_len = i2d_OCSP_REQUEST(req, &request_der); if (request_der_len < 0) { MONGOC_DEBUG("Could not encode OCSP request"); GOTO(retry); } http_req.method = "POST"; http_req.extra_headers = "Content-Type: application/ocsp-request\r\n"; http_req.host = host; http_req.path = path; http_req.port = (int)bson_ascii_strtoll(port, NULL, 10); http_req.body = (const char *)request_der; http_req.body_len = request_der_len; if (!_mongoc_http_send( &http_req, mlib_expires_after(MONGOC_OCSP_REQUEST_TIMEOUT), ssl != 0, ssl_opts, &http_res, &error)) { MONGOC_DEBUG("Could not send HTTP request: %s", error.message); GOTO(retry); } resp_data = (const unsigned char *)http_res.body; if (http_res.body_len == 0 || !d2i_OCSP_RESPONSE(&resp, &resp_data, http_res.body_len)) { MONGOC_DEBUG("Could not parse OCSP response from HTTP response"); MONGOC_DEBUG("Response headers: %s", http_res.headers); GOTO(retry); } retry: if (host) OPENSSL_free(host); if (port) OPENSSL_free(port); if (path) OPENSSL_free(path); if (req) OCSP_REQUEST_free(req); if (request_der) OPENSSL_free(request_der); _mongoc_http_response_cleanup(&http_res); } if (url_stack) X509_email_free(url_stack); RETURN(resp); } #define SOFT_FAIL(...) ((stapled_response) ? MONGOC_ERROR(__VA_ARGS__) : MONGOC_DEBUG(__VA_ARGS__)) #define OCSP_VERIFY_SUCCESS 1 int _mongoc_ocsp_tlsext_status(SSL *ssl, mongoc_openssl_ocsp_opt_t *opts) { enum { OCSP_CB_ERROR = -1, OCSP_CB_REVOKED, OCSP_CB_SUCCESS } ret; bool stapled_response = true; bool must_staple; OCSP_RESPONSE *resp = NULL; OCSP_BASICRESP *basic = NULL; X509_STORE *store = NULL; X509 *peer = NULL, *issuer = NULL; STACK_OF(X509) *cert_chain = NULL; const unsigned char *resp_data = NULL; unsigned char *mutable_resp_data = NULL; int cert_status, reason, len, status; OCSP_CERTID *id = NULL; ASN1_GENERALIZEDTIME *produced_at = NULL, *this_update = NULL, *next_update = NULL; int ocsp_uri_count = 0; if (opts->weak_cert_validation) { return OCSP_CB_SUCCESS; } if (!(peer = SSL_get_peer_certificate(ssl))) { MONGOC_ERROR("No certificate was presented by the peer"); ret = OCSP_CB_ERROR; GOTO(done); } /* Get a STACK_OF(X509) certs forming the cert chain of the peer, including * the peer's cert */ if (!(cert_chain = _get_verified_chain(ssl))) { MONGOC_ERROR("Unable to obtain verified chain"); ret = OCSP_CB_REVOKED; GOTO(done); } if (!(issuer = _get_issuer(peer, cert_chain))) { MONGOC_ERROR("Could not get issuer from peer cert"); ret = OCSP_CB_ERROR; GOTO(done); } if (!(id = OCSP_cert_to_id(NULL /* SHA1 */, peer, issuer))) { MONGOC_ERROR("Could not obtain a valid OCSP_CERTID for peer"); ret = OCSP_CB_ERROR; GOTO(done); } if (_mongoc_ocsp_cache_get_status(id, &cert_status, &reason, &this_update, &next_update)) { GOTO(validate); } /* Get the stapled OCSP response returned by the server */ len = SSL_get_tlsext_status_ocsp_resp(ssl, &mutable_resp_data); resp_data = mutable_resp_data; stapled_response = !!resp_data; if (stapled_response) { /* obtain an OCSP_RESPONSE object from the OCSP response */ if (!d2i_OCSP_RESPONSE(&resp, &resp_data, len)) { MONGOC_ERROR("Failed to parse OCSP response"); ret = OCSP_CB_ERROR; GOTO(done); } } else { TRACE("%s", "Server does not contain a stapled response"); must_staple = _get_must_staple(peer); if (must_staple) { MONGOC_ERROR("Server must contain a stapled response"); ret = OCSP_CB_REVOKED; GOTO(done); } if (opts->disable_endpoint_check || !(resp = _contact_ocsp_responder(id, peer, &opts->ssl_opts, &ocsp_uri_count))) { if (ocsp_uri_count > 0) { /* Only log a soft failure if there were OCSP responders listed in * the certificate. */ MONGOC_DEBUG("Soft-fail: No OCSP responder could be reached"); } ret = OCSP_CB_SUCCESS; GOTO(done); } } TRACE("%s", "Validating OCSP response"); /* Validate the OCSP response status of the OCSP_RESPONSE object */ status = OCSP_response_status(resp); if (status != OCSP_RESPONSE_STATUS_SUCCESSFUL) { SOFT_FAIL("OCSP response error %d %s", status, OCSP_response_status_str(status)); ret = OCSP_CB_ERROR; GOTO(done); } TRACE("%s", "OCSP response status successful"); /* Get the OCSP_BASICRESP structure contained in OCSP_RESPONSE object for the * peer cert */ basic = OCSP_response_get1_basic(resp); if (!basic) { SOFT_FAIL("Could not find BasicOCSPResponse: %s", ERR_STR); ret = OCSP_CB_ERROR; GOTO(done); } store = SSL_CTX_get_cert_store(SSL_get_SSL_CTX(ssl)); /* * checks that the basic response message is correctly signed and that the * signer certificate can be validated. * 1. The function first verifies the signer cert of the response is in the * given cert chain. * 2. Next, the function verifies the signature of the basic response. * 3. Finally, the function validates the signer cert, constructing the * validation path via the untrusted cert chain. * * cert_chain has already been verified. Use OCSP_TRUSTOTHER so the signer * certificate can be considered verified if it is in cert_chain. */ if (OCSP_basic_verify(basic, cert_chain, store, OCSP_TRUSTOTHER) != OCSP_VERIFY_SUCCESS) { SOFT_FAIL("OCSP response failed verification: %s", ERR_STR); ret = OCSP_CB_ERROR; GOTO(done); } /* searches the basic response for an OCSP response for the given cert ID */ if (!OCSP_resp_find_status(basic, id, &cert_status, &reason, &produced_at, &this_update, &next_update)) { SOFT_FAIL("No OCSP response found for the peer certificate"); ret = OCSP_CB_ERROR; GOTO(done); } /* checks the validity of this_update and next_update values */ if (!OCSP_check_validity(this_update, next_update, 0L, -1L)) { SOFT_FAIL("OCSP response has expired: %s", ERR_STR); ret = OCSP_CB_ERROR; GOTO(done); } validate: switch (cert_status) { case V_OCSP_CERTSTATUS_GOOD: TRACE("%s", "OCSP Certificate Status: Good"); _mongoc_ocsp_cache_set_resp(id, cert_status, reason, this_update, next_update); break; case V_OCSP_CERTSTATUS_REVOKED: MONGOC_ERROR("OCSP Certificate Status: Revoked. Reason: %s", OCSP_crl_reason_str(reason)); ret = OCSP_CB_REVOKED; _mongoc_ocsp_cache_set_resp(id, cert_status, reason, this_update, next_update); GOTO(done); default: MONGOC_DEBUG("OCSP Certificate Status: Unknown"); break; } /* Validate hostname matches cert */ if (!_mongoc_openssl_check_peer_hostname(ssl, opts->host, opts->allow_invalid_hostname)) { ret = OCSP_CB_REVOKED; GOTO(done); } ret = OCSP_CB_SUCCESS; done: if (ret == OCSP_CB_ERROR && !stapled_response) { ret = OCSP_CB_SUCCESS; } if (basic) OCSP_BASICRESP_free(basic); if (resp) OCSP_RESPONSE_free(resp); if (id) OCSP_CERTID_free(id); if (peer) X509_free(peer); if (cert_chain) _free_verified_chain(cert_chain); RETURN(ret); } #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ /** * _mongoc_openssl_ctx_new: * * Create a new ssl context declaratively * * The opt.pem_pwd parameter, if passed, must exist for the life of this * context object (for storing and loading the associated pem file) */ SSL_CTX * _mongoc_openssl_ctx_new(mongoc_ssl_opt_t *opt) { SSL_CTX *ctx = NULL; int ssl_ctx_options = 0; /* * Ensure we are initialized. This is safe to call multiple times. */ mongoc_init(); ctx = SSL_CTX_new(SSLv23_method()); BSON_ASSERT(ctx); /* SSL_OP_ALL - Activate all bug workaround options, to support buggy client * SSL's. */ ssl_ctx_options |= SSL_OP_ALL; /* SSL_OP_NO_SSLv2 - Disable SSL v2 support */ ssl_ctx_options |= SSL_OP_NO_SSLv2; /* Disable compression, if we can. * OpenSSL 0.9.x added compression support which was always enabled when built * against zlib * OpenSSL 1.0.0 added the ability to disable it, while keeping it enabled by * default * OpenSSL 1.1.0 disabled it by default. */ #if OPENSSL_VERSION_NUMBER >= 0x10000000L ssl_ctx_options |= SSL_OP_NO_COMPRESSION; #endif /* man SSL_get_options says: "SSL_OP_NO_RENEGOTIATION options were added in * OpenSSL 1.1.1". */ #ifdef SSL_OP_NO_RENEGOTIATION ssl_ctx_options |= SSL_OP_NO_RENEGOTIATION; #endif SSL_CTX_set_options(ctx, ssl_ctx_options); /* only defined in special build, using: * --enable-system-crypto-profile (autotools) * -DENABLE_CRYPTO_SYSTEM_PROFILE:BOOL=ON (cmake) */ #ifndef MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE /* HIGH - Enable strong ciphers * !EXPORT - Disable export ciphers (40/56 bit) * !aNULL - Disable anonymous auth ciphers * @STRENGTH - Sort ciphers based on strength */ SSL_CTX_set_cipher_list(ctx, "HIGH:!EXPORT:!aNULL@STRENGTH"); #endif /* If renegotiation is needed, don't return from recv() or send() until it's * successful. * Note: this is for blocking sockets only. */ SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); /* Load my private keys to present to the server */ if (opt->pem_file && !_mongoc_openssl_setup_pem_file(ctx, opt->pem_file, opt->pem_pwd)) { SSL_CTX_free(ctx); return NULL; } /* Load in my Certificate Authority, to verify the server against * If none provided, fallback to the distro defaults */ if (opt->ca_file || opt->ca_dir) { if (!_mongoc_openssl_setup_ca(ctx, opt->ca_file, opt->ca_dir)) { SSL_CTX_free(ctx); return NULL; } } else { /* If the server certificate is issued by known CA we trust it by default */ #ifdef _WIN32 _mongoc_openssl_import_cert_stores(ctx); #else SSL_CTX_set_default_verify_paths(ctx); #endif } /* Load my revocation list, to verify the server against */ if (opt->crl_file && !_mongoc_openssl_setup_crl(ctx, opt->crl_file)) { SSL_CTX_free(ctx); return NULL; } if (opt->weak_cert_validation) { SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); } else { SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); } return ctx; } #if OPENSSL_VERSION_NUMBER < 0x10100000L #ifdef _WIN32 static unsigned long _mongoc_openssl_thread_id_callback(void) { unsigned long ret; ret = (unsigned long)GetCurrentThreadId(); return ret; } #else static unsigned long _mongoc_openssl_thread_id_callback(void) { unsigned long ret; ret = (unsigned long)pthread_self(); return ret; } #endif static void _mongoc_openssl_thread_locking_callback(int mode, int type, const char *file, int line) { if (mode & CRYPTO_LOCK) { bson_mutex_lock(&gMongocOpenSslThreadLocks[type]); } else { bson_mutex_unlock(&gMongocOpenSslThreadLocks[type]); } } static void _mongoc_openssl_thread_startup(void) { int i; gMongocOpenSslThreadLocks = (bson_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(bson_mutex_t)); for (i = 0; i < CRYPTO_num_locks(); i++) { bson_mutex_init(&gMongocOpenSslThreadLocks[i]); } if (!CRYPTO_get_locking_callback()) { CRYPTO_set_locking_callback(_mongoc_openssl_thread_locking_callback); CRYPTO_set_id_callback(_mongoc_openssl_thread_id_callback); } } static void _mongoc_openssl_thread_cleanup(void) { int i; if (CRYPTO_get_locking_callback() == _mongoc_openssl_thread_locking_callback) { CRYPTO_set_locking_callback(NULL); } if (CRYPTO_get_id_callback() == _mongoc_openssl_thread_id_callback) { CRYPTO_set_id_callback(NULL); } for (i = 0; i < CRYPTO_num_locks(); i++) { bson_mutex_destroy(&gMongocOpenSslThreadLocks[i]); } OPENSSL_free(gMongocOpenSslThreadLocks); } #endif #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-optional.c000066400000000000000000000023341511661753600244430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include void mongoc_optional_init(mongoc_optional_t *opt) { opt->is_set = false; opt->value = false; } bool mongoc_optional_is_set(const mongoc_optional_t *opt) { BSON_ASSERT(opt); return opt->is_set; } bool mongoc_optional_value(const mongoc_optional_t *opt) { BSON_ASSERT(opt); return opt->value; } void mongoc_optional_set_value(mongoc_optional_t *opt, bool val) { BSON_ASSERT(opt); opt->value = val; opt->is_set = true; } void mongoc_optional_copy(const mongoc_optional_t *source, mongoc_optional_t *copy) { copy->value = source->value; copy->is_set = source->is_set; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-optional.h000066400000000000000000000024061511661753600244500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OPTIONAL_H #define MONGOC_OPTIONAL_H #include #include BSON_BEGIN_DECLS typedef struct { bool value; bool is_set; } mongoc_optional_t; MONGOC_EXPORT(void) mongoc_optional_init(mongoc_optional_t *opt); MONGOC_EXPORT(bool) mongoc_optional_is_set(const mongoc_optional_t *opt); MONGOC_EXPORT(bool) mongoc_optional_value(const mongoc_optional_t *opt); MONGOC_EXPORT(void) mongoc_optional_set_value(mongoc_optional_t *opt, bool val); MONGOC_EXPORT(void) mongoc_optional_copy(const mongoc_optional_t *source, mongoc_optional_t *copy); BSON_END_DECLS #endif /* MONGOC_OPTIONAL_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opts-helpers-private.h000066400000000000000000000075571511661753600267340ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifndef LIBMONGOC_MONGOC_OPTS_HELPERS_H #define LIBMONGOC_MONGOC_OPTS_HELPERS_H #define _mongoc_convert_session_id _mongoc_client_session_from_iter typedef struct _mongoc_timestamp_t { uint32_t timestamp; uint32_t increment; } mongoc_timestamp_t; bool _mongoc_timestamp_empty(mongoc_timestamp_t *timestamp); void _mongoc_timestamp_set(mongoc_timestamp_t *dst, mongoc_timestamp_t *src); void _mongoc_timestamp_set_from_bson(mongoc_timestamp_t *timestamp, bson_iter_t *iter); void _mongoc_timestamp_append(mongoc_timestamp_t *timestamp, bson_t *bson, char *key); void _mongoc_timestamp_clear(mongoc_timestamp_t *timestamp); bool _mongoc_convert_document(mongoc_client_t *client, const bson_iter_t *iter, bson_t *doc, bson_error_t *error); bool _mongoc_convert_array(mongoc_client_t *client, const bson_iter_t *iter, bson_t *doc, bson_error_t *error); bool _mongoc_convert_int64_positive(mongoc_client_t *client, const bson_iter_t *iter, int64_t *num, bson_error_t *error); bool _mongoc_convert_int32_t(mongoc_client_t *client, const bson_iter_t *iter, int32_t *num, bson_error_t *error); bool _mongoc_convert_int32_positive(mongoc_client_t *client, const bson_iter_t *iter, int32_t *num, bson_error_t *error); bool _mongoc_convert_bool(mongoc_client_t *client, const bson_iter_t *iter, bool *flag, bson_error_t *error); bool _mongoc_convert_bson_value_t(mongoc_client_t *client, const bson_iter_t *iter, bson_value_t *value, bson_error_t *error); bool _mongoc_convert_timestamp(mongoc_client_t *client, const bson_iter_t *iter, mongoc_timestamp_t *timestamp, bson_error_t *error); bool _mongoc_convert_utf8(mongoc_client_t *client, const bson_iter_t *iter, const char **comment, bson_error_t *error); bool _mongoc_convert_validate_flags(mongoc_client_t *client, const bson_iter_t *iter, bson_validate_flags_t *flags, bson_error_t *error); bool _mongoc_convert_mongoc_write_bypass_document_validation_t(mongoc_client_t *client, const bson_iter_t *iter, bool *bdv, bson_error_t *error); bool _mongoc_convert_write_concern(mongoc_client_t *client, const bson_iter_t *iter, mongoc_write_concern_t **wc, bson_error_t *error); bool _mongoc_convert_server_id(mongoc_client_t *client, const bson_iter_t *iter, uint32_t *server_id, bson_error_t *error); bool _mongoc_convert_read_concern(mongoc_client_t *client, const bson_iter_t *iter, mongoc_read_concern_t **rc, bson_error_t *error); bool _mongoc_convert_hint(mongoc_client_t *client, const bson_iter_t *iter, bson_value_t *value, bson_error_t *error); #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opts-helpers.c000066400000000000000000000235731511661753600252530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #define BSON_ERR(...) \ do { \ _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, __VA_ARGS__); \ return false; \ } while (0) #define CONVERSION_ERR(...) \ do { \ _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, __VA_ARGS__); \ return false; \ } while (0) bool _mongoc_timestamp_empty(mongoc_timestamp_t *timestamp) { return (timestamp->timestamp == 0 && timestamp->increment == 0); } void _mongoc_timestamp_set(mongoc_timestamp_t *dst, mongoc_timestamp_t *src) { dst->timestamp = src->timestamp; dst->increment = src->increment; } void _mongoc_timestamp_set_from_bson(mongoc_timestamp_t *timestamp, bson_iter_t *iter) { bson_iter_timestamp(iter, &(timestamp->timestamp), &(timestamp->increment)); } void _mongoc_timestamp_append(mongoc_timestamp_t *timestamp, bson_t *bson, char *key) { const size_t len = strlen(key); BSON_ASSERT(mlib_in_range(int, len)); bson_append_timestamp(bson, key, (int)len, timestamp->timestamp, timestamp->increment); } void _mongoc_timestamp_clear(mongoc_timestamp_t *timestamp) { timestamp->timestamp = 0; timestamp->increment = 0; } bool _mongoc_convert_document(mongoc_client_t *client, const bson_iter_t *iter, bson_t *doc, bson_error_t *error) { uint32_t len; const uint8_t *data; bson_t value; BSON_UNUSED(client); if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { CONVERSION_ERR("Invalid field \"%s\" in opts, should contain document," " not %s", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter))); } bson_iter_document(iter, &len, &data); if (!bson_init_static(&value, data, len)) { BSON_ERR("Corrupt BSON in field \"%s\" in opts", bson_iter_key(iter)); } bson_destroy(doc); bson_copy_to(&value, doc); return true; } bool _mongoc_convert_array(mongoc_client_t *client, const bson_iter_t *iter, bson_t *doc, bson_error_t *error) { uint32_t len; const uint8_t *data; bson_t value; BSON_UNUSED(client); if (!BSON_ITER_HOLDS_ARRAY(iter)) { CONVERSION_ERR("Invalid field \"%s\" in opts, should contain array," " not %s", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter))); } bson_iter_array(iter, &len, &data); if (!bson_init_static(&value, data, len)) { BSON_ERR("Corrupt BSON in field \"%s\" in opts", bson_iter_key(iter)); } bson_destroy(doc); bson_copy_to(&value, doc); return true; } bool _mongoc_convert_int64_positive(mongoc_client_t *client, const bson_iter_t *iter, int64_t *num, bson_error_t *error) { int64_t i; BSON_UNUSED(client); if (!BSON_ITER_HOLDS_NUMBER(iter)) { CONVERSION_ERR("Invalid field \"%s\" in opts, should contain number," " not %s", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter))); } i = bson_iter_as_int64(iter); if (i <= 0) { CONVERSION_ERR("Invalid field \"%s\" in opts, should be greater than 0," " not %" PRId64, bson_iter_key(iter), i); } *num = bson_iter_as_int64(iter); return true; } bool _mongoc_convert_int32_t(mongoc_client_t *client, const bson_iter_t *iter, int32_t *num, bson_error_t *error) { int64_t i; BSON_UNUSED(client); if (!BSON_ITER_HOLDS_NUMBER(iter)) { CONVERSION_ERR("Invalid field \"%s\" in opts", bson_iter_key(iter)); } i = bson_iter_as_int64(iter); if (i > INT32_MAX || i < INT32_MIN) { CONVERSION_ERR("Invalid field \"%s\" in opts: %" PRId64 " out of range for int32", bson_iter_key(iter), i); } *num = (int32_t)i; return true; } bool _mongoc_convert_int32_positive(mongoc_client_t *client, const bson_iter_t *iter, int32_t *num, bson_error_t *error) { int32_t i; if (!_mongoc_convert_int32_t(client, iter, &i, error)) { return false; } if (i <= 0) { CONVERSION_ERR("Invalid field \"%s\" in opts, should be greater than 0, not %d", bson_iter_key(iter), i); } *num = i; return true; } bool _mongoc_convert_bool(mongoc_client_t *client, const bson_iter_t *iter, bool *flag, bson_error_t *error) { BSON_UNUSED(client); if (BSON_ITER_HOLDS_BOOL(iter)) { *flag = bson_iter_bool(iter); return true; } CONVERSION_ERR("Invalid field \"%s\" in opts, should contain bool," " not %s", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter))); } bool _mongoc_convert_bson_value_t(mongoc_client_t *client, const bson_iter_t *iter, bson_value_t *value, bson_error_t *error) { BSON_UNUSED(client); BSON_UNUSED(error); bson_value_copy(bson_iter_value((bson_iter_t *)iter), value); return true; } bool _mongoc_convert_timestamp(mongoc_client_t *client, const bson_iter_t *iter, mongoc_timestamp_t *timestamp, bson_error_t *error) { BSON_UNUSED(client); BSON_UNUSED(error); bson_iter_timestamp(iter, ×tamp->timestamp, ×tamp->increment); return true; } bool _mongoc_convert_utf8(mongoc_client_t *client, const bson_iter_t *iter, const char **str, bson_error_t *error) { BSON_UNUSED(client); if (BSON_ITER_HOLDS_UTF8(iter)) { *str = bson_iter_utf8(iter, NULL); return true; } CONVERSION_ERR("Invalid field \"%s\" in opts, should contain string," " not %s", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter))); } bool _mongoc_convert_validate_flags(mongoc_client_t *client, const bson_iter_t *iter, bson_validate_flags_t *flags, bson_error_t *error) { BSON_UNUSED(client); if (BSON_ITER_HOLDS_BOOL(iter)) { if (!bson_iter_as_bool(iter)) { *flags = BSON_VALIDATE_NONE; return true; } else { /* validate: false is ok but validate: true is prohibited */ CONVERSION_ERR("Invalid option \"%s\": true, must be a bitwise-OR of" " bson_validate_flags_t values.", bson_iter_key(iter)); } } else if (BSON_ITER_HOLDS_INT32(iter)) { if (bson_iter_int32(iter) <= 0x1F) { *flags = (bson_validate_flags_t)bson_iter_int32(iter); return true; } else { CONVERSION_ERR("Invalid field \"%s\" in opts, must be a bitwise-OR of" " bson_validate_flags_t values.", bson_iter_key(iter)); } } CONVERSION_ERR("Invalid type for option \"%s\": \"%s\"." " \"%s\" must be a boolean or a bitwise-OR of" " bson_validate_flags_t values.", bson_iter_key(iter), _mongoc_bson_type_to_str(bson_iter_type(iter)), bson_iter_key(iter)); } bool _mongoc_convert_write_concern(mongoc_client_t *client, const bson_iter_t *iter, mongoc_write_concern_t **wc, bson_error_t *error) { mongoc_write_concern_t *tmp; BSON_UNUSED(client); tmp = _mongoc_write_concern_new_from_iter(iter, error); if (tmp) { *wc = tmp; return true; } return false; } bool _mongoc_convert_server_id(mongoc_client_t *client, const bson_iter_t *iter, uint32_t *server_id, bson_error_t *error) { int64_t tmp; BSON_UNUSED(client); if (!BSON_ITER_HOLDS_INT(iter)) { CONVERSION_ERR("The serverId option must be an integer"); } tmp = bson_iter_as_int64(iter); if (tmp <= 0) { CONVERSION_ERR("The serverId option must be >= 1"); } *server_id = (uint32_t)tmp; return true; } bool _mongoc_convert_read_concern(mongoc_client_t *client, const bson_iter_t *iter, mongoc_read_concern_t **rc, bson_error_t *error) { BSON_UNUSED(client); *rc = _mongoc_read_concern_new_from_iter(iter, error); if (!*rc) { return false; } return true; } bool _mongoc_convert_hint(mongoc_client_t *client, const bson_iter_t *iter, bson_value_t *value, bson_error_t *error) { BSON_UNUSED(client); if (BSON_ITER_HOLDS_UTF8(iter) || BSON_ITER_HOLDS_DOCUMENT(iter)) { bson_value_copy(bson_iter_value((bson_iter_t *)iter), value); return true; } CONVERSION_ERR("The hint option must be a string or document"); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opts-private.h000066400000000000000000000301021511661753600252520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_OPTS_H #define MONGOC_OPTS_H #include #include #include #include /************************************************** * * Generated by build/generate-opts.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ typedef struct _mongoc_crud_opts_t { mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_client_session_t *client_session; bson_validate_flags_t validate; bson_value_t comment; } mongoc_crud_opts_t; typedef struct _mongoc_update_opts_t { mongoc_crud_opts_t crud; bool bypass; bson_t collation; bson_value_t hint; bool upsert; bson_t let; } mongoc_update_opts_t; typedef struct _mongoc_insert_one_opts_t { mongoc_crud_opts_t crud; bool bypass; bson_t extra; } mongoc_insert_one_opts_t; typedef struct _mongoc_insert_many_opts_t { mongoc_crud_opts_t crud; bool ordered; bool bypass; bson_t extra; } mongoc_insert_many_opts_t; typedef struct _mongoc_delete_opts_t { mongoc_crud_opts_t crud; bson_t collation; bson_value_t hint; bson_t let; } mongoc_delete_opts_t; typedef struct _mongoc_delete_one_opts_t { mongoc_delete_opts_t delete; bson_t extra; } mongoc_delete_one_opts_t; typedef struct _mongoc_delete_many_opts_t { mongoc_delete_opts_t delete; bson_t extra; } mongoc_delete_many_opts_t; typedef struct _mongoc_update_one_opts_t { mongoc_update_opts_t update; bson_t arrayFilters; bson_t sort; bson_t extra; } mongoc_update_one_opts_t; typedef struct _mongoc_update_many_opts_t { mongoc_update_opts_t update; bson_t arrayFilters; bson_t extra; } mongoc_update_many_opts_t; typedef struct _mongoc_replace_one_opts_t { mongoc_update_opts_t update; bson_t sort; bson_t extra; } mongoc_replace_one_opts_t; typedef struct _mongoc_bulk_opts_t { mongoc_write_concern_t *writeConcern; bool write_concern_owned; bool ordered; mongoc_client_session_t *client_session; bson_t let; bson_value_t comment; bson_t extra; } mongoc_bulk_opts_t; typedef struct _mongoc_bulk_insert_opts_t { bson_validate_flags_t validate; bson_t extra; } mongoc_bulk_insert_opts_t; typedef struct _mongoc_bulk_update_opts_t { bson_validate_flags_t validate; bson_t collation; bson_value_t hint; bool upsert; bool multi; } mongoc_bulk_update_opts_t; typedef struct _mongoc_bulk_update_one_opts_t { mongoc_bulk_update_opts_t update; bson_t sort; bson_t arrayFilters; bson_t extra; } mongoc_bulk_update_one_opts_t; typedef struct _mongoc_bulk_update_many_opts_t { mongoc_bulk_update_opts_t update; bson_t arrayFilters; bson_t extra; } mongoc_bulk_update_many_opts_t; typedef struct _mongoc_bulk_replace_one_opts_t { mongoc_bulk_update_opts_t update; bson_t sort; bson_t extra; } mongoc_bulk_replace_one_opts_t; typedef struct _mongoc_bulk_remove_opts_t { bson_t collation; bson_value_t hint; int32_t limit; } mongoc_bulk_remove_opts_t; typedef struct _mongoc_bulk_remove_one_opts_t { mongoc_bulk_remove_opts_t remove; bson_t extra; } mongoc_bulk_remove_one_opts_t; typedef struct _mongoc_bulk_remove_many_opts_t { mongoc_bulk_remove_opts_t remove; bson_t extra; } mongoc_bulk_remove_many_opts_t; typedef struct _mongoc_change_stream_opts_t { int32_t batchSize; bson_t resumeAfter; bson_t startAfter; mongoc_timestamp_t startAtOperationTime; int64_t maxAwaitTimeMS; const char *fullDocument; const char *fullDocumentBeforeChange; bool showExpandedEvents; bson_value_t comment; bson_t extra; } mongoc_change_stream_opts_t; typedef struct _mongoc_create_index_opts_t { mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_client_session_t *client_session; bson_t extra; } mongoc_create_index_opts_t; typedef struct _mongoc_read_write_opts_t { bson_t readConcern; mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_client_session_t *client_session; bson_t collation; uint32_t serverId; bson_t extra; } mongoc_read_write_opts_t; typedef struct _mongoc_gridfs_bucket_opts_t { const char *bucketName; int32_t chunkSizeBytes; mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_read_concern_t *readConcern; bson_t extra; } mongoc_gridfs_bucket_opts_t; typedef struct _mongoc_gridfs_bucket_upload_opts_t { int32_t chunkSizeBytes; bson_t metadata; bson_t extra; } mongoc_gridfs_bucket_upload_opts_t; typedef struct _mongoc_aggregate_opts_t { mongoc_read_concern_t *readConcern; mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_client_session_t *client_session; bool bypass; bson_t collation; uint32_t serverId; int32_t batchSize; bool batchSize_is_set; bson_t let; bson_value_t comment; bson_value_t hint; bson_t extra; } mongoc_aggregate_opts_t; typedef struct _mongoc_find_and_modify_appended_opts_t { mongoc_write_concern_t *writeConcern; bool write_concern_owned; mongoc_client_session_t *client_session; bson_value_t hint; bson_t let; bson_value_t comment; bson_t extra; } mongoc_find_and_modify_appended_opts_t; typedef struct _mongoc_count_document_opts_t { bson_t readConcern; mongoc_client_session_t *client_session; bson_t collation; uint32_t serverId; bson_value_t skip; bson_value_t limit; bson_value_t comment; bson_value_t hint; bson_t extra; } mongoc_count_document_opts_t; bool _mongoc_insert_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_insert_one_opts_t *mongoc_insert_one_opts, bson_error_t *error); void _mongoc_insert_one_opts_cleanup (mongoc_insert_one_opts_t *mongoc_insert_one_opts); bool _mongoc_insert_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_insert_many_opts_t *mongoc_insert_many_opts, bson_error_t *error); void _mongoc_insert_many_opts_cleanup (mongoc_insert_many_opts_t *mongoc_insert_many_opts); bool _mongoc_delete_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_delete_one_opts_t *mongoc_delete_one_opts, bson_error_t *error); void _mongoc_delete_one_opts_cleanup (mongoc_delete_one_opts_t *mongoc_delete_one_opts); bool _mongoc_delete_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_delete_many_opts_t *mongoc_delete_many_opts, bson_error_t *error); void _mongoc_delete_many_opts_cleanup (mongoc_delete_many_opts_t *mongoc_delete_many_opts); bool _mongoc_update_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_update_one_opts_t *mongoc_update_one_opts, bson_error_t *error); void _mongoc_update_one_opts_cleanup (mongoc_update_one_opts_t *mongoc_update_one_opts); bool _mongoc_update_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_update_many_opts_t *mongoc_update_many_opts, bson_error_t *error); void _mongoc_update_many_opts_cleanup (mongoc_update_many_opts_t *mongoc_update_many_opts); bool _mongoc_replace_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_replace_one_opts_t *mongoc_replace_one_opts, bson_error_t *error); void _mongoc_replace_one_opts_cleanup (mongoc_replace_one_opts_t *mongoc_replace_one_opts); bool _mongoc_bulk_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_opts_t *mongoc_bulk_opts, bson_error_t *error); void _mongoc_bulk_opts_cleanup (mongoc_bulk_opts_t *mongoc_bulk_opts); bool _mongoc_bulk_insert_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_insert_opts_t *mongoc_bulk_insert_opts, bson_error_t *error); void _mongoc_bulk_insert_opts_cleanup (mongoc_bulk_insert_opts_t *mongoc_bulk_insert_opts); bool _mongoc_bulk_update_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_update_one_opts_t *mongoc_bulk_update_one_opts, bson_error_t *error); void _mongoc_bulk_update_one_opts_cleanup (mongoc_bulk_update_one_opts_t *mongoc_bulk_update_one_opts); bool _mongoc_bulk_update_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_update_many_opts_t *mongoc_bulk_update_many_opts, bson_error_t *error); void _mongoc_bulk_update_many_opts_cleanup (mongoc_bulk_update_many_opts_t *mongoc_bulk_update_many_opts); bool _mongoc_bulk_replace_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_replace_one_opts_t *mongoc_bulk_replace_one_opts, bson_error_t *error); void _mongoc_bulk_replace_one_opts_cleanup (mongoc_bulk_replace_one_opts_t *mongoc_bulk_replace_one_opts); bool _mongoc_bulk_remove_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_remove_one_opts_t *mongoc_bulk_remove_one_opts, bson_error_t *error); void _mongoc_bulk_remove_one_opts_cleanup (mongoc_bulk_remove_one_opts_t *mongoc_bulk_remove_one_opts); bool _mongoc_bulk_remove_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_remove_many_opts_t *mongoc_bulk_remove_many_opts, bson_error_t *error); void _mongoc_bulk_remove_many_opts_cleanup (mongoc_bulk_remove_many_opts_t *mongoc_bulk_remove_many_opts); bool _mongoc_change_stream_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_change_stream_opts_t *mongoc_change_stream_opts, bson_error_t *error); void _mongoc_change_stream_opts_cleanup (mongoc_change_stream_opts_t *mongoc_change_stream_opts); bool _mongoc_create_index_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_create_index_opts_t *mongoc_create_index_opts, bson_error_t *error); void _mongoc_create_index_opts_cleanup (mongoc_create_index_opts_t *mongoc_create_index_opts); bool _mongoc_read_write_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_read_write_opts_t *mongoc_read_write_opts, bson_error_t *error); void _mongoc_read_write_opts_cleanup (mongoc_read_write_opts_t *mongoc_read_write_opts); bool _mongoc_gridfs_bucket_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_gridfs_bucket_opts_t *mongoc_gridfs_bucket_opts, bson_error_t *error); void _mongoc_gridfs_bucket_opts_cleanup (mongoc_gridfs_bucket_opts_t *mongoc_gridfs_bucket_opts); bool _mongoc_gridfs_bucket_upload_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_gridfs_bucket_upload_opts_t *mongoc_gridfs_bucket_upload_opts, bson_error_t *error); void _mongoc_gridfs_bucket_upload_opts_cleanup (mongoc_gridfs_bucket_upload_opts_t *mongoc_gridfs_bucket_upload_opts); bool _mongoc_aggregate_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_aggregate_opts_t *mongoc_aggregate_opts, bson_error_t *error); void _mongoc_aggregate_opts_cleanup (mongoc_aggregate_opts_t *mongoc_aggregate_opts); bool _mongoc_find_and_modify_appended_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_find_and_modify_appended_opts_t *mongoc_find_and_modify_appended_opts, bson_error_t *error); void _mongoc_find_and_modify_appended_opts_cleanup (mongoc_find_and_modify_appended_opts_t *mongoc_find_and_modify_appended_opts); bool _mongoc_count_document_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_count_document_opts_t *mongoc_count_document_opts, bson_error_t *error); void _mongoc_count_document_opts_cleanup (mongoc_count_document_opts_t *mongoc_count_document_opts); #endif /* MONGOC_OPTS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-opts.c000066400000000000000000002334151511661753600236110ustar00rootroot00000000000000#include #include #include #include #include /************************************************** * * Generated by build/generate-opts.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ bool _mongoc_insert_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_insert_one_opts_t *mongoc_insert_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_insert_one_opts->crud.writeConcern = NULL; mongoc_insert_one_opts->crud.write_concern_owned = false; mongoc_insert_one_opts->crud.client_session = NULL; mongoc_insert_one_opts->crud.validate = _mongoc_default_insert_vflags; memset (&mongoc_insert_one_opts->crud.comment, 0, sizeof (bson_value_t)); mongoc_insert_one_opts->bypass = false; bson_init (&mongoc_insert_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_insert_one_opts->crud.writeConcern, error)) { return false; } mongoc_insert_one_opts->crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_insert_one_opts->crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_insert_one_opts->crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_insert_one_opts->crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_insert_one_opts->bypass, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_insert_one_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_insert_one_opts_cleanup (mongoc_insert_one_opts_t *mongoc_insert_one_opts) { if (mongoc_insert_one_opts->crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_insert_one_opts->crud.writeConcern); } bson_value_destroy (&mongoc_insert_one_opts->crud.comment); bson_destroy (&mongoc_insert_one_opts->extra); } bool _mongoc_insert_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_insert_many_opts_t *mongoc_insert_many_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_insert_many_opts->crud.writeConcern = NULL; mongoc_insert_many_opts->crud.write_concern_owned = false; mongoc_insert_many_opts->crud.client_session = NULL; mongoc_insert_many_opts->crud.validate = _mongoc_default_insert_vflags; memset (&mongoc_insert_many_opts->crud.comment, 0, sizeof (bson_value_t)); mongoc_insert_many_opts->ordered = true; mongoc_insert_many_opts->bypass = false; bson_init (&mongoc_insert_many_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_insert_many_opts->crud.writeConcern, error)) { return false; } mongoc_insert_many_opts->crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_insert_many_opts->crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_insert_many_opts->crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_insert_many_opts->crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "ordered")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_insert_many_opts->ordered, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_insert_many_opts->bypass, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_insert_many_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_insert_many_opts_cleanup (mongoc_insert_many_opts_t *mongoc_insert_many_opts) { if (mongoc_insert_many_opts->crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_insert_many_opts->crud.writeConcern); } bson_value_destroy (&mongoc_insert_many_opts->crud.comment); bson_destroy (&mongoc_insert_many_opts->extra); } bool _mongoc_delete_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_delete_one_opts_t *mongoc_delete_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_delete_one_opts->delete.crud.writeConcern = NULL; mongoc_delete_one_opts->delete.crud.write_concern_owned = false; mongoc_delete_one_opts->delete.crud.client_session = NULL; mongoc_delete_one_opts->delete.crud.validate = BSON_VALIDATE_NONE; memset (&mongoc_delete_one_opts->delete.crud.comment, 0, sizeof (bson_value_t)); bson_init (&mongoc_delete_one_opts->delete.collation); memset (&mongoc_delete_one_opts->delete.hint, 0, sizeof (bson_value_t)); bson_init (&mongoc_delete_one_opts->delete.let); bson_init (&mongoc_delete_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_delete_one_opts->delete.crud.writeConcern, error)) { return false; } mongoc_delete_one_opts->delete.crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_delete_one_opts->delete.crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_delete_one_opts->delete.crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_delete_one_opts->delete.crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_delete_one_opts->delete.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_delete_one_opts->delete.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_delete_one_opts->delete.let, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_delete_one_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_delete_one_opts_cleanup (mongoc_delete_one_opts_t *mongoc_delete_one_opts) { if (mongoc_delete_one_opts->delete.crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_delete_one_opts->delete.crud.writeConcern); } bson_value_destroy (&mongoc_delete_one_opts->delete.crud.comment); bson_destroy (&mongoc_delete_one_opts->delete.collation); bson_value_destroy (&mongoc_delete_one_opts->delete.hint); bson_destroy (&mongoc_delete_one_opts->delete.let); bson_destroy (&mongoc_delete_one_opts->extra); } bool _mongoc_delete_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_delete_many_opts_t *mongoc_delete_many_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_delete_many_opts->delete.crud.writeConcern = NULL; mongoc_delete_many_opts->delete.crud.write_concern_owned = false; mongoc_delete_many_opts->delete.crud.client_session = NULL; mongoc_delete_many_opts->delete.crud.validate = BSON_VALIDATE_NONE; memset (&mongoc_delete_many_opts->delete.crud.comment, 0, sizeof (bson_value_t)); bson_init (&mongoc_delete_many_opts->delete.collation); memset (&mongoc_delete_many_opts->delete.hint, 0, sizeof (bson_value_t)); bson_init (&mongoc_delete_many_opts->delete.let); bson_init (&mongoc_delete_many_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_delete_many_opts->delete.crud.writeConcern, error)) { return false; } mongoc_delete_many_opts->delete.crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_delete_many_opts->delete.crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_delete_many_opts->delete.crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_delete_many_opts->delete.crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_delete_many_opts->delete.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_delete_many_opts->delete.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_delete_many_opts->delete.let, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_delete_many_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_delete_many_opts_cleanup (mongoc_delete_many_opts_t *mongoc_delete_many_opts) { if (mongoc_delete_many_opts->delete.crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_delete_many_opts->delete.crud.writeConcern); } bson_value_destroy (&mongoc_delete_many_opts->delete.crud.comment); bson_destroy (&mongoc_delete_many_opts->delete.collation); bson_value_destroy (&mongoc_delete_many_opts->delete.hint); bson_destroy (&mongoc_delete_many_opts->delete.let); bson_destroy (&mongoc_delete_many_opts->extra); } bool _mongoc_update_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_update_one_opts_t *mongoc_update_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_update_one_opts->update.crud.writeConcern = NULL; mongoc_update_one_opts->update.crud.write_concern_owned = false; mongoc_update_one_opts->update.crud.client_session = NULL; mongoc_update_one_opts->update.crud.validate = _mongoc_default_update_vflags; memset (&mongoc_update_one_opts->update.crud.comment, 0, sizeof (bson_value_t)); mongoc_update_one_opts->update.bypass = false; bson_init (&mongoc_update_one_opts->update.collation); memset (&mongoc_update_one_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_update_one_opts->update.upsert = false; bson_init (&mongoc_update_one_opts->update.let); bson_init (&mongoc_update_one_opts->arrayFilters); bson_init (&mongoc_update_one_opts->sort); bson_init (&mongoc_update_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_update_one_opts->update.crud.writeConcern, error)) { return false; } mongoc_update_one_opts->update.crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_update_one_opts->update.crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_update_one_opts->update.crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_update_one_opts->update.crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_update_one_opts->update.bypass, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_update_one_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_update_one_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_update_one_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_update_one_opts->update.let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "arrayFilters")) { if (!_mongoc_convert_array ( client, &iter, &mongoc_update_one_opts->arrayFilters, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sort")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_update_one_opts->sort, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_update_one_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_update_one_opts_cleanup (mongoc_update_one_opts_t *mongoc_update_one_opts) { if (mongoc_update_one_opts->update.crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_update_one_opts->update.crud.writeConcern); } bson_value_destroy (&mongoc_update_one_opts->update.crud.comment); bson_destroy (&mongoc_update_one_opts->update.collation); bson_value_destroy (&mongoc_update_one_opts->update.hint); bson_destroy (&mongoc_update_one_opts->update.let); bson_destroy (&mongoc_update_one_opts->arrayFilters); bson_destroy (&mongoc_update_one_opts->sort); bson_destroy (&mongoc_update_one_opts->extra); } bool _mongoc_update_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_update_many_opts_t *mongoc_update_many_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_update_many_opts->update.crud.writeConcern = NULL; mongoc_update_many_opts->update.crud.write_concern_owned = false; mongoc_update_many_opts->update.crud.client_session = NULL; mongoc_update_many_opts->update.crud.validate = _mongoc_default_update_vflags; memset (&mongoc_update_many_opts->update.crud.comment, 0, sizeof (bson_value_t)); mongoc_update_many_opts->update.bypass = false; bson_init (&mongoc_update_many_opts->update.collation); memset (&mongoc_update_many_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_update_many_opts->update.upsert = false; bson_init (&mongoc_update_many_opts->update.let); bson_init (&mongoc_update_many_opts->arrayFilters); bson_init (&mongoc_update_many_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_update_many_opts->update.crud.writeConcern, error)) { return false; } mongoc_update_many_opts->update.crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_update_many_opts->update.crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_update_many_opts->update.crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_update_many_opts->update.crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_update_many_opts->update.bypass, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_update_many_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_update_many_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_update_many_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_update_many_opts->update.let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "arrayFilters")) { if (!_mongoc_convert_array ( client, &iter, &mongoc_update_many_opts->arrayFilters, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_update_many_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_update_many_opts_cleanup (mongoc_update_many_opts_t *mongoc_update_many_opts) { if (mongoc_update_many_opts->update.crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_update_many_opts->update.crud.writeConcern); } bson_value_destroy (&mongoc_update_many_opts->update.crud.comment); bson_destroy (&mongoc_update_many_opts->update.collation); bson_value_destroy (&mongoc_update_many_opts->update.hint); bson_destroy (&mongoc_update_many_opts->update.let); bson_destroy (&mongoc_update_many_opts->arrayFilters); bson_destroy (&mongoc_update_many_opts->extra); } bool _mongoc_replace_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_replace_one_opts_t *mongoc_replace_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_replace_one_opts->update.crud.writeConcern = NULL; mongoc_replace_one_opts->update.crud.write_concern_owned = false; mongoc_replace_one_opts->update.crud.client_session = NULL; mongoc_replace_one_opts->update.crud.validate = _mongoc_default_replace_vflags; memset (&mongoc_replace_one_opts->update.crud.comment, 0, sizeof (bson_value_t)); mongoc_replace_one_opts->update.bypass = false; bson_init (&mongoc_replace_one_opts->update.collation); memset (&mongoc_replace_one_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_replace_one_opts->update.upsert = false; bson_init (&mongoc_replace_one_opts->update.let); bson_init (&mongoc_replace_one_opts->sort); bson_init (&mongoc_replace_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_replace_one_opts->update.crud.writeConcern, error)) { return false; } mongoc_replace_one_opts->update.crud.write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_replace_one_opts->update.crud.client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_replace_one_opts->update.crud.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_replace_one_opts->update.crud.comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_replace_one_opts->update.bypass, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_replace_one_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_replace_one_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_replace_one_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_replace_one_opts->update.let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sort")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_replace_one_opts->sort, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_replace_one_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_replace_one_opts_cleanup (mongoc_replace_one_opts_t *mongoc_replace_one_opts) { if (mongoc_replace_one_opts->update.crud.write_concern_owned) { mongoc_write_concern_destroy (mongoc_replace_one_opts->update.crud.writeConcern); } bson_value_destroy (&mongoc_replace_one_opts->update.crud.comment); bson_destroy (&mongoc_replace_one_opts->update.collation); bson_value_destroy (&mongoc_replace_one_opts->update.hint); bson_destroy (&mongoc_replace_one_opts->update.let); bson_destroy (&mongoc_replace_one_opts->sort); bson_destroy (&mongoc_replace_one_opts->extra); } bool _mongoc_bulk_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_opts_t *mongoc_bulk_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_bulk_opts->writeConcern = NULL; mongoc_bulk_opts->write_concern_owned = false; mongoc_bulk_opts->ordered = true; mongoc_bulk_opts->client_session = NULL; bson_init (&mongoc_bulk_opts->let); memset (&mongoc_bulk_opts->comment, 0, sizeof (bson_value_t)); bson_init (&mongoc_bulk_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_bulk_opts->writeConcern, error)) { return false; } mongoc_bulk_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "ordered")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_opts->ordered, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_bulk_opts->client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_opts->let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_bulk_opts->comment, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_opts_cleanup (mongoc_bulk_opts_t *mongoc_bulk_opts) { if (mongoc_bulk_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_bulk_opts->writeConcern); } bson_destroy (&mongoc_bulk_opts->let); bson_value_destroy (&mongoc_bulk_opts->comment); bson_destroy (&mongoc_bulk_opts->extra); } bool _mongoc_bulk_insert_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_insert_opts_t *mongoc_bulk_insert_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_bulk_insert_opts->validate = _mongoc_default_insert_vflags; bson_init (&mongoc_bulk_insert_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_bulk_insert_opts->validate, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_insert_opts_cleanup (mongoc_bulk_insert_opts_t *mongoc_bulk_insert_opts) { bson_destroy (&mongoc_bulk_insert_opts->extra); } bool _mongoc_bulk_update_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_update_one_opts_t *mongoc_bulk_update_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_bulk_update_one_opts->update.validate = _mongoc_default_update_vflags; bson_init (&mongoc_bulk_update_one_opts->update.collation); memset (&mongoc_bulk_update_one_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_bulk_update_one_opts->update.upsert = false; mongoc_bulk_update_one_opts->update.multi = false; bson_init (&mongoc_bulk_update_one_opts->sort); bson_init (&mongoc_bulk_update_one_opts->arrayFilters); bson_init (&mongoc_bulk_update_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_bulk_update_one_opts->update.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_update_one_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_bulk_update_one_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_update_one_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "multi")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_update_one_opts->update.multi, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sort")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_update_one_opts->sort, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "arrayFilters")) { if (!_mongoc_convert_array ( client, &iter, &mongoc_bulk_update_one_opts->arrayFilters, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_update_one_opts_cleanup (mongoc_bulk_update_one_opts_t *mongoc_bulk_update_one_opts) { bson_destroy (&mongoc_bulk_update_one_opts->update.collation); bson_value_destroy (&mongoc_bulk_update_one_opts->update.hint); bson_destroy (&mongoc_bulk_update_one_opts->sort); bson_destroy (&mongoc_bulk_update_one_opts->arrayFilters); bson_destroy (&mongoc_bulk_update_one_opts->extra); } bool _mongoc_bulk_update_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_update_many_opts_t *mongoc_bulk_update_many_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_bulk_update_many_opts->update.validate = _mongoc_default_update_vflags; bson_init (&mongoc_bulk_update_many_opts->update.collation); memset (&mongoc_bulk_update_many_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_bulk_update_many_opts->update.upsert = false; mongoc_bulk_update_many_opts->update.multi = true; bson_init (&mongoc_bulk_update_many_opts->arrayFilters); bson_init (&mongoc_bulk_update_many_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_bulk_update_many_opts->update.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_update_many_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_bulk_update_many_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_update_many_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "multi")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_update_many_opts->update.multi, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "arrayFilters")) { if (!_mongoc_convert_array ( client, &iter, &mongoc_bulk_update_many_opts->arrayFilters, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_update_many_opts_cleanup (mongoc_bulk_update_many_opts_t *mongoc_bulk_update_many_opts) { bson_destroy (&mongoc_bulk_update_many_opts->update.collation); bson_value_destroy (&mongoc_bulk_update_many_opts->update.hint); bson_destroy (&mongoc_bulk_update_many_opts->arrayFilters); bson_destroy (&mongoc_bulk_update_many_opts->extra); } bool _mongoc_bulk_replace_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_replace_one_opts_t *mongoc_bulk_replace_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_bulk_replace_one_opts->update.validate = _mongoc_default_replace_vflags; bson_init (&mongoc_bulk_replace_one_opts->update.collation); memset (&mongoc_bulk_replace_one_opts->update.hint, 0, sizeof (bson_value_t)); mongoc_bulk_replace_one_opts->update.upsert = false; mongoc_bulk_replace_one_opts->update.multi = false; bson_init (&mongoc_bulk_replace_one_opts->sort); bson_init (&mongoc_bulk_replace_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "validate")) { if (!_mongoc_convert_validate_flags ( client, &iter, &mongoc_bulk_replace_one_opts->update.validate, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_replace_one_opts->update.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_bulk_replace_one_opts->update.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "upsert")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_replace_one_opts->update.upsert, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "multi")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_bulk_replace_one_opts->update.multi, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sort")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_replace_one_opts->sort, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_replace_one_opts_cleanup (mongoc_bulk_replace_one_opts_t *mongoc_bulk_replace_one_opts) { bson_destroy (&mongoc_bulk_replace_one_opts->update.collation); bson_value_destroy (&mongoc_bulk_replace_one_opts->update.hint); bson_destroy (&mongoc_bulk_replace_one_opts->sort); bson_destroy (&mongoc_bulk_replace_one_opts->extra); } bool _mongoc_bulk_remove_one_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_remove_one_opts_t *mongoc_bulk_remove_one_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. bson_init (&mongoc_bulk_remove_one_opts->remove.collation); memset (&mongoc_bulk_remove_one_opts->remove.hint, 0, sizeof (bson_value_t)); mongoc_bulk_remove_one_opts->remove.limit = 1; bson_init (&mongoc_bulk_remove_one_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_remove_one_opts->remove.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_bulk_remove_one_opts->remove.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "limit")) { if (!_mongoc_convert_int32_t ( client, &iter, &mongoc_bulk_remove_one_opts->remove.limit, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_remove_one_opts_cleanup (mongoc_bulk_remove_one_opts_t *mongoc_bulk_remove_one_opts) { bson_destroy (&mongoc_bulk_remove_one_opts->remove.collation); bson_value_destroy (&mongoc_bulk_remove_one_opts->remove.hint); bson_destroy (&mongoc_bulk_remove_one_opts->extra); } bool _mongoc_bulk_remove_many_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_bulk_remove_many_opts_t *mongoc_bulk_remove_many_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. bson_init (&mongoc_bulk_remove_many_opts->remove.collation); memset (&mongoc_bulk_remove_many_opts->remove.hint, 0, sizeof (bson_value_t)); mongoc_bulk_remove_many_opts->remove.limit = 0; bson_init (&mongoc_bulk_remove_many_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_bulk_remove_many_opts->remove.collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_bulk_remove_many_opts->remove.hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "limit")) { if (!_mongoc_convert_int32_t ( client, &iter, &mongoc_bulk_remove_many_opts->remove.limit, error)) { return false; } } else { _mongoc_set_error (error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option '%s'", bson_iter_key (&iter)); return false; } } return true; } void _mongoc_bulk_remove_many_opts_cleanup (mongoc_bulk_remove_many_opts_t *mongoc_bulk_remove_many_opts) { bson_destroy (&mongoc_bulk_remove_many_opts->remove.collation); bson_value_destroy (&mongoc_bulk_remove_many_opts->remove.hint); bson_destroy (&mongoc_bulk_remove_many_opts->extra); } bool _mongoc_change_stream_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_change_stream_opts_t *mongoc_change_stream_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_change_stream_opts->batchSize = -1; bson_init (&mongoc_change_stream_opts->resumeAfter); bson_init (&mongoc_change_stream_opts->startAfter); memset (&mongoc_change_stream_opts->startAtOperationTime, 0, sizeof (mongoc_timestamp_t)); mongoc_change_stream_opts->maxAwaitTimeMS = 0; mongoc_change_stream_opts->fullDocument = NULL; mongoc_change_stream_opts->fullDocumentBeforeChange = NULL; mongoc_change_stream_opts->showExpandedEvents = false; memset (&mongoc_change_stream_opts->comment, 0, sizeof (bson_value_t)); bson_init (&mongoc_change_stream_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "batchSize")) { if (!_mongoc_convert_int32_t ( client, &iter, &mongoc_change_stream_opts->batchSize, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "resumeAfter")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_change_stream_opts->resumeAfter, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "startAfter")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_change_stream_opts->startAfter, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "startAtOperationTime")) { if (!_mongoc_convert_timestamp ( client, &iter, &mongoc_change_stream_opts->startAtOperationTime, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "maxAwaitTimeMS")) { if (!_mongoc_convert_int64_positive ( client, &iter, &mongoc_change_stream_opts->maxAwaitTimeMS, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "fullDocument")) { if (!_mongoc_convert_utf8 ( client, &iter, &mongoc_change_stream_opts->fullDocument, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "fullDocumentBeforeChange")) { if (!_mongoc_convert_utf8 ( client, &iter, &mongoc_change_stream_opts->fullDocumentBeforeChange, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "showExpandedEvents")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_change_stream_opts->showExpandedEvents, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_change_stream_opts->comment, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_change_stream_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_change_stream_opts_cleanup (mongoc_change_stream_opts_t *mongoc_change_stream_opts) { bson_destroy (&mongoc_change_stream_opts->resumeAfter); bson_destroy (&mongoc_change_stream_opts->startAfter); bson_value_destroy (&mongoc_change_stream_opts->comment); bson_destroy (&mongoc_change_stream_opts->extra); } bool _mongoc_create_index_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_create_index_opts_t *mongoc_create_index_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_create_index_opts->writeConcern = NULL; mongoc_create_index_opts->write_concern_owned = false; mongoc_create_index_opts->client_session = NULL; bson_init (&mongoc_create_index_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_create_index_opts->writeConcern, error)) { return false; } mongoc_create_index_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_create_index_opts->client_session, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_create_index_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_create_index_opts_cleanup (mongoc_create_index_opts_t *mongoc_create_index_opts) { if (mongoc_create_index_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_create_index_opts->writeConcern); } bson_destroy (&mongoc_create_index_opts->extra); } bool _mongoc_read_write_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_read_write_opts_t *mongoc_read_write_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. bson_init (&mongoc_read_write_opts->readConcern); mongoc_read_write_opts->writeConcern = NULL; mongoc_read_write_opts->write_concern_owned = false; mongoc_read_write_opts->client_session = NULL; bson_init (&mongoc_read_write_opts->collation); mongoc_read_write_opts->serverId = 0; bson_init (&mongoc_read_write_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "readConcern")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_read_write_opts->readConcern, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_read_write_opts->writeConcern, error)) { return false; } mongoc_read_write_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_read_write_opts->client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_read_write_opts->collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "serverId")) { if (!_mongoc_convert_server_id ( client, &iter, &mongoc_read_write_opts->serverId, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_read_write_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_read_write_opts_cleanup (mongoc_read_write_opts_t *mongoc_read_write_opts) { bson_destroy (&mongoc_read_write_opts->readConcern); if (mongoc_read_write_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_read_write_opts->writeConcern); } bson_destroy (&mongoc_read_write_opts->collation); bson_destroy (&mongoc_read_write_opts->extra); } bool _mongoc_gridfs_bucket_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_gridfs_bucket_opts_t *mongoc_gridfs_bucket_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_gridfs_bucket_opts->bucketName = "fs"; mongoc_gridfs_bucket_opts->chunkSizeBytes = 261120; mongoc_gridfs_bucket_opts->writeConcern = NULL; mongoc_gridfs_bucket_opts->write_concern_owned = false; mongoc_gridfs_bucket_opts->readConcern = NULL; bson_init (&mongoc_gridfs_bucket_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "bucketName")) { if (!_mongoc_convert_utf8 ( client, &iter, &mongoc_gridfs_bucket_opts->bucketName, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "chunkSizeBytes")) { if (!_mongoc_convert_int32_positive ( client, &iter, &mongoc_gridfs_bucket_opts->chunkSizeBytes, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_gridfs_bucket_opts->writeConcern, error)) { return false; } mongoc_gridfs_bucket_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "readConcern")) { if (!_mongoc_convert_read_concern ( client, &iter, &mongoc_gridfs_bucket_opts->readConcern, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_gridfs_bucket_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_gridfs_bucket_opts_cleanup (mongoc_gridfs_bucket_opts_t *mongoc_gridfs_bucket_opts) { if (mongoc_gridfs_bucket_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_gridfs_bucket_opts->writeConcern); } mongoc_read_concern_destroy (mongoc_gridfs_bucket_opts->readConcern); bson_destroy (&mongoc_gridfs_bucket_opts->extra); } bool _mongoc_gridfs_bucket_upload_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_gridfs_bucket_upload_opts_t *mongoc_gridfs_bucket_upload_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_gridfs_bucket_upload_opts->chunkSizeBytes = 0; bson_init (&mongoc_gridfs_bucket_upload_opts->metadata); bson_init (&mongoc_gridfs_bucket_upload_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "chunkSizeBytes")) { if (!_mongoc_convert_int32_positive ( client, &iter, &mongoc_gridfs_bucket_upload_opts->chunkSizeBytes, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "metadata")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_gridfs_bucket_upload_opts->metadata, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_gridfs_bucket_upload_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_gridfs_bucket_upload_opts_cleanup (mongoc_gridfs_bucket_upload_opts_t *mongoc_gridfs_bucket_upload_opts) { bson_destroy (&mongoc_gridfs_bucket_upload_opts->metadata); bson_destroy (&mongoc_gridfs_bucket_upload_opts->extra); } bool _mongoc_aggregate_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_aggregate_opts_t *mongoc_aggregate_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_aggregate_opts->readConcern = NULL; mongoc_aggregate_opts->writeConcern = NULL; mongoc_aggregate_opts->write_concern_owned = false; mongoc_aggregate_opts->client_session = NULL; mongoc_aggregate_opts->bypass = false; bson_init (&mongoc_aggregate_opts->collation); mongoc_aggregate_opts->serverId = 0; mongoc_aggregate_opts->batchSize = 0; mongoc_aggregate_opts->batchSize_is_set = false; bson_init (&mongoc_aggregate_opts->let); memset (&mongoc_aggregate_opts->comment, 0, sizeof (bson_value_t)); memset (&mongoc_aggregate_opts->hint, 0, sizeof (bson_value_t)); bson_init (&mongoc_aggregate_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "readConcern")) { if (!_mongoc_convert_read_concern ( client, &iter, &mongoc_aggregate_opts->readConcern, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_aggregate_opts->writeConcern, error)) { return false; } mongoc_aggregate_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_aggregate_opts->client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "bypassDocumentValidation")) { if (!_mongoc_convert_bool ( client, &iter, &mongoc_aggregate_opts->bypass, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_aggregate_opts->collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "serverId")) { if (!_mongoc_convert_server_id ( client, &iter, &mongoc_aggregate_opts->serverId, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "batchSize")) { if (!_mongoc_convert_int32_t ( client, &iter, &mongoc_aggregate_opts->batchSize, error)) { return false; } mongoc_aggregate_opts->batchSize_is_set = true; } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_aggregate_opts->let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_aggregate_opts->comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_aggregate_opts->hint, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_aggregate_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_aggregate_opts_cleanup (mongoc_aggregate_opts_t *mongoc_aggregate_opts) { mongoc_read_concern_destroy (mongoc_aggregate_opts->readConcern); if (mongoc_aggregate_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_aggregate_opts->writeConcern); } bson_destroy (&mongoc_aggregate_opts->collation); bson_destroy (&mongoc_aggregate_opts->let); bson_value_destroy (&mongoc_aggregate_opts->comment); bson_value_destroy (&mongoc_aggregate_opts->hint); bson_destroy (&mongoc_aggregate_opts->extra); } bool _mongoc_find_and_modify_appended_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_find_and_modify_appended_opts_t *mongoc_find_and_modify_appended_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. mongoc_find_and_modify_appended_opts->writeConcern = NULL; mongoc_find_and_modify_appended_opts->write_concern_owned = false; mongoc_find_and_modify_appended_opts->client_session = NULL; memset (&mongoc_find_and_modify_appended_opts->hint, 0, sizeof (bson_value_t)); bson_init (&mongoc_find_and_modify_appended_opts->let); memset (&mongoc_find_and_modify_appended_opts->comment, 0, sizeof (bson_value_t)); bson_init (&mongoc_find_and_modify_appended_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "writeConcern")) { if (!_mongoc_convert_write_concern ( client, &iter, &mongoc_find_and_modify_appended_opts->writeConcern, error)) { return false; } mongoc_find_and_modify_appended_opts->write_concern_owned = true; } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_find_and_modify_appended_opts->client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_find_and_modify_appended_opts->hint, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "let")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_find_and_modify_appended_opts->let, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_find_and_modify_appended_opts->comment, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_find_and_modify_appended_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_find_and_modify_appended_opts_cleanup (mongoc_find_and_modify_appended_opts_t *mongoc_find_and_modify_appended_opts) { if (mongoc_find_and_modify_appended_opts->write_concern_owned) { mongoc_write_concern_destroy (mongoc_find_and_modify_appended_opts->writeConcern); } bson_value_destroy (&mongoc_find_and_modify_appended_opts->hint); bson_destroy (&mongoc_find_and_modify_appended_opts->let); bson_value_destroy (&mongoc_find_and_modify_appended_opts->comment); bson_destroy (&mongoc_find_and_modify_appended_opts->extra); } bool _mongoc_count_document_opts_parse ( mongoc_client_t *client, const bson_t *opts, mongoc_count_document_opts_t *mongoc_count_document_opts, bson_error_t *error) { bson_iter_t iter; BSON_ASSERT (client || true); // client may be NULL. bson_init (&mongoc_count_document_opts->readConcern); mongoc_count_document_opts->client_session = NULL; bson_init (&mongoc_count_document_opts->collation); mongoc_count_document_opts->serverId = 0; memset (&mongoc_count_document_opts->skip, 0, sizeof (bson_value_t)); memset (&mongoc_count_document_opts->limit, 0, sizeof (bson_value_t)); memset (&mongoc_count_document_opts->comment, 0, sizeof (bson_value_t)); memset (&mongoc_count_document_opts->hint, 0, sizeof (bson_value_t)); bson_init (&mongoc_count_document_opts->extra); if (!opts) { return true; } if (!bson_iter_init (&iter, opts)) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } while (bson_iter_next (&iter)) { if (!strcmp (bson_iter_key (&iter), "readConcern")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_count_document_opts->readConcern, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "sessionId")) { if (!_mongoc_convert_session_id ( client, &iter, &mongoc_count_document_opts->client_session, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "collation")) { if (!_mongoc_convert_document ( client, &iter, &mongoc_count_document_opts->collation, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "serverId")) { if (!_mongoc_convert_server_id ( client, &iter, &mongoc_count_document_opts->serverId, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "skip")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_count_document_opts->skip, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "limit")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_count_document_opts->limit, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "comment")) { if (!_mongoc_convert_bson_value_t ( client, &iter, &mongoc_count_document_opts->comment, error)) { return false; } } else if (!strcmp (bson_iter_key (&iter), "hint")) { if (!_mongoc_convert_hint ( client, &iter, &mongoc_count_document_opts->hint, error)) { return false; } } else { /* unrecognized values are copied to "extra" */ if (!BSON_APPEND_VALUE ( &mongoc_count_document_opts->extra, bson_iter_key (&iter), bson_iter_value (&iter))) { _mongoc_set_error (error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Invalid 'opts' parameter."); return false; } } } return true; } void _mongoc_count_document_opts_cleanup (mongoc_count_document_opts_t *mongoc_count_document_opts) { bson_destroy (&mongoc_count_document_opts->readConcern); bson_destroy (&mongoc_count_document_opts->collation); bson_value_destroy (&mongoc_count_document_opts->skip); bson_value_destroy (&mongoc_count_document_opts->limit); bson_value_destroy (&mongoc_count_document_opts->comment); bson_value_destroy (&mongoc_count_document_opts->hint); bson_destroy (&mongoc_count_document_opts->extra); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-prelude.h000066400000000000000000000013311511661753600242570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION) #error "Only can be included directly." #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-queue-private.h000066400000000000000000000030011511661753600254070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_QUEUE_PRIVATE_H #define MONGOC_QUEUE_PRIVATE_H #include #include BSON_BEGIN_DECLS #define MONGOC_QUEUE_INITIALIZER {NULL, NULL} typedef struct _mongoc_queue_t mongoc_queue_t; typedef struct _mongoc_queue_item_t mongoc_queue_item_t; struct _mongoc_queue_t { mongoc_queue_item_t *head; mongoc_queue_item_t *tail; uint32_t length; }; struct _mongoc_queue_item_t { mongoc_queue_item_t *next; void *data; }; void _mongoc_queue_init(mongoc_queue_t *queue); void * _mongoc_queue_pop_head(mongoc_queue_t *queue); void * _mongoc_queue_pop_tail(mongoc_queue_t *queue); void _mongoc_queue_push_head(mongoc_queue_t *queue, void *data); void _mongoc_queue_push_tail(mongoc_queue_t *queue, void *data); uint32_t _mongoc_queue_get_length(const mongoc_queue_t *queue); BSON_END_DECLS #endif /* MONGOC_QUEUE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-queue.c000066400000000000000000000051111511661753600237360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include void _mongoc_queue_init(mongoc_queue_t *queue) { BSON_ASSERT(queue); memset(queue, 0, sizeof *queue); } void _mongoc_queue_push_head(mongoc_queue_t *queue, void *data) { mongoc_queue_item_t *item; BSON_ASSERT(queue); BSON_ASSERT(data); item = (mongoc_queue_item_t *)bson_malloc0(sizeof *item); item->next = queue->head; item->data = data; queue->head = item; if (!queue->tail) { queue->tail = item; } queue->length++; } void _mongoc_queue_push_tail(mongoc_queue_t *queue, void *data) { mongoc_queue_item_t *item; BSON_ASSERT(queue); BSON_ASSERT(data); item = (mongoc_queue_item_t *)bson_malloc0(sizeof *item); item->data = data; if (queue->tail) { queue->tail->next = item; } else { queue->head = item; } queue->tail = item; queue->length++; } void * _mongoc_queue_pop_head(mongoc_queue_t *queue) { mongoc_queue_item_t *item; void *data = NULL; BSON_ASSERT(queue); if ((item = queue->head)) { if (!item->next) { queue->tail = NULL; } queue->head = item->next; data = item->data; bson_free(item); queue->length--; } return data; } void * _mongoc_queue_pop_tail(mongoc_queue_t *queue) { mongoc_queue_item_t *item; void *data = NULL; BSON_ASSERT(queue); if (queue->length == 0) { return NULL; } data = queue->tail->data; if (queue->length == 1) { bson_free(queue->tail); queue->head = queue->tail = NULL; } else { /* find item pointing at tail */ for (item = queue->head; item; item = item->next) { if (item->next == queue->tail) { item->next = NULL; bson_free(queue->tail); queue->tail = item; break; } } } queue->length--; return data; } uint32_t _mongoc_queue_get_length(const mongoc_queue_t *queue) { BSON_ASSERT(queue); return queue->length; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rand-cng.c000066400000000000000000000035001511661753600243030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include #include #include #include #include #include #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L) int _mongoc_rand_bytes(uint8_t *buf, int num) { static BCRYPT_ALG_HANDLE algorithm = 0; NTSTATUS status = 0; if (!algorithm) { status = BCryptOpenAlgorithmProvider(&algorithm, BCRYPT_RNG_ALGORITHM, NULL, 0); if (!NT_SUCCESS(status)) { MONGOC_ERROR("BCryptOpenAlgorithmProvider(): %ld", status); return 0; } } status = BCryptGenRandom(algorithm, buf, num, 0); if (NT_SUCCESS(status)) { return 1; } MONGOC_ERROR("BCryptGenRandom(): %ld", status); return 0; } void mongoc_rand_seed(const void *buf, int num) { BSON_UNUSED(buf); BSON_UNUSED(num); /* N/A - OS Does not need entropy seed */ } void mongoc_rand_add(const void *buf, int num, double entropy) { BSON_UNUSED(buf); BSON_UNUSED(num); BSON_UNUSED(entropy); /* N/A - OS Does not need entropy seed */ } int mongoc_rand_status(void) { return 1; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rand-common-crypto.c000066400000000000000000000023751511661753600263530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO #include #include #include #include /* rumour has it this wasn't in standard Security.h in ~10.8 */ #include int _mongoc_rand_bytes(uint8_t *buf, int num) { return !SecRandomCopyBytes(kSecRandomDefault, num, buf); } void mongoc_rand_seed(const void *buf, int num) { /* No such thing in Common Crypto */ } void mongoc_rand_add(const void *buf, int num, double entropy) { /* No such thing in Common Crypto */ } int mongoc_rand_status(void) { return 1; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rand-openssl.c000066400000000000000000000031671511661753600252300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO #include #include #include #include #include int _mongoc_rand_bytes(uint8_t *buf, int num) { #if OPENSSL_VERSION_NUMBER < 0x10101000L /* Versions of OpenSSL before 1.1.1 can potentially produce the same random * sequences in processes with the same PID. Rather than attempt to detect * PID changes (useful for parent/child forking but not if PIDs wrap), mix * the current time into the generator's state. * See also: https://wiki.openssl.org/index.php/Random_fork-safety */ struct timeval tv; bson_gettimeofday(&tv); RAND_add(&tv, sizeof(tv), 0.0); #endif return RAND_bytes(buf, num); } void mongoc_rand_seed(const void *buf, int num) { RAND_seed(buf, num); } void mongoc_rand_add(const void *buf, int num, double entropy) { RAND_add(buf, num, entropy); } int mongoc_rand_status(void) { return RAND_status(); } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rand-private.h000066400000000000000000000016121511661753600252150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_RAND_PRIVATE_H #define MONGOC_RAND_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS int _mongoc_rand_bytes(uint8_t *buf, int num); BSON_END_DECLS #endif /* MONGOC_RAND_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rand.h000066400000000000000000000017451511661753600235540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_RAND_H #define MONGOC_RAND_H #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(void) mongoc_rand_seed(const void *buf, int num); MONGOC_EXPORT(void) mongoc_rand_add(const void *buf, int num, double entropy); MONGOC_EXPORT(int) mongoc_rand_status(void); BSON_END_DECLS #endif /* MONGOC_RAND_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-concern-private.h000066400000000000000000000022221511661753600266270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_READ_CONCERN_PRIVATE_H #define MONGOC_READ_CONCERN_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS struct _mongoc_read_concern_t { char *level; bool frozen; bson_t compiled; }; const bson_t * _mongoc_read_concern_get_bson(mongoc_read_concern_t *read_concern); mongoc_read_concern_t * _mongoc_read_concern_new_from_iter(const bson_iter_t *iter, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_READ_CONCERN_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-concern.c000066400000000000000000000132401511661753600251540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include static void _mongoc_read_concern_freeze(mongoc_read_concern_t *read_concern); /** * mongoc_read_concern_new: * * Create a new mongoc_read_concern_t. * * Returns: A newly allocated mongoc_read_concern_t. This should be freed * with mongoc_read_concern_destroy(). */ mongoc_read_concern_t * mongoc_read_concern_new(void) { mongoc_read_concern_t *read_concern; read_concern = BSON_ALIGNED_ALLOC0(mongoc_read_concern_t); bson_init(&read_concern->compiled); return read_concern; } mongoc_read_concern_t * mongoc_read_concern_copy(const mongoc_read_concern_t *read_concern) { mongoc_read_concern_t *ret = NULL; if (read_concern) { ret = mongoc_read_concern_new(); ret->level = bson_strdup(read_concern->level); } return ret; } /** * mongoc_read_concern_destroy: * @read_concern: A mongoc_read_concern_t. * * Releases a mongoc_read_concern_t and all associated memory. */ void mongoc_read_concern_destroy(mongoc_read_concern_t *read_concern) { if (read_concern) { bson_destroy(&read_concern->compiled); bson_free(read_concern->level); bson_free(read_concern); } } const char * mongoc_read_concern_get_level(const mongoc_read_concern_t *read_concern) { BSON_ASSERT(read_concern); return read_concern->level; } /** * mongoc_read_concern_set_level: * @read_concern: A mongoc_read_concern_t. * @level: The read concern level * * Sets the read concern level. Any string is supported for future compatibility * but MongoDB 3.2 only accepts "local" and "majority", aka: * - MONGOC_READ_CONCERN_LEVEL_LOCAL * - MONGOC_READ_CONCERN_LEVEL_MAJORITY * MongoDB 3.4 added * - MONGOC_READ_CONCERN_LEVEL_LINEARIZABLE * * See the MongoDB docs for more information on readConcernLevel */ bool mongoc_read_concern_set_level(mongoc_read_concern_t *read_concern, const char *level) { BSON_ASSERT(read_concern); bson_free(read_concern->level); read_concern->level = bson_strdup(level); read_concern->frozen = false; return true; } /** * mongoc_read_concern_append: * @read_concern: (in): A mongoc_read_concern_t. * @opts: (out): A pointer to a bson document. * * Appends a read_concern document to command options to send to * a server. * * Returns true on success, false on failure. * */ bool mongoc_read_concern_append(mongoc_read_concern_t *read_concern, bson_t *command) { BSON_ASSERT(read_concern); if (!read_concern->level) { return true; } if (!bson_append_document(command, "readConcern", 11, _mongoc_read_concern_get_bson(read_concern))) { MONGOC_ERROR("Could not append readConcern to command."); return false; } return true; } /** * mongoc_read_concern_is_default: * @read_concern: A const mongoc_read_concern_t. * * Returns true when read_concern has not been modified. */ bool mongoc_read_concern_is_default(const mongoc_read_concern_t *read_concern) { return !read_concern || !read_concern->level; } /** * mongoc_read_concern_get_bson: * @read_concern: A mongoc_read_concern_t. * * This is an internal function. * * Returns: A bson_t representing the read concern, which is owned by the * mongoc_read_concern_t instance and should not be modified or freed. */ const bson_t * _mongoc_read_concern_get_bson(mongoc_read_concern_t *read_concern) { if (!read_concern->frozen) { _mongoc_read_concern_freeze(read_concern); } return &read_concern->compiled; } /** * _mongoc_read_concern_new_from_iter: * * Create a new mongoc_read_concern_t from an iterator positioned on * a "readConcern" document. * * Returns: A newly allocated mongoc_read_concern_t. This should be freed * with mongoc_read_concern_destroy(). */ mongoc_read_concern_t * _mongoc_read_concern_new_from_iter(const bson_iter_t *iter, bson_error_t *error) { bson_iter_t inner; mongoc_read_concern_t *read_concern; BSON_ASSERT(iter); read_concern = mongoc_read_concern_new(); if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { goto fail; } BSON_ASSERT(bson_iter_recurse(iter, &inner)); if (!bson_iter_find(&inner, "level") || !BSON_ITER_HOLDS_UTF8(&inner)) { goto fail; } mongoc_read_concern_set_level(read_concern, bson_iter_utf8(&inner, NULL)); return read_concern; fail: _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid readConcern"); mongoc_read_concern_destroy(read_concern); return NULL; } /** * mongoc_read_concern_freeze: * @read_concern: A mongoc_read_concern_t. * * This is an internal function. * * Encodes the read concern into a bson_t, which may then be returned by * mongoc_read_concern_get_bson(). */ static void _mongoc_read_concern_freeze(mongoc_read_concern_t *read_concern) { bson_t *compiled; BSON_ASSERT(read_concern); compiled = &read_concern->compiled; read_concern->frozen = true; bson_reinit(compiled); if (read_concern->level) { BSON_APPEND_UTF8(compiled, "level", read_concern->level); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-concern.h000066400000000000000000000035461511661753600251710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_READ_CONCERN_H #define MONGOC_READ_CONCERN_H #include #include BSON_BEGIN_DECLS #define MONGOC_READ_CONCERN_LEVEL_AVAILABLE "available" #define MONGOC_READ_CONCERN_LEVEL_LOCAL "local" #define MONGOC_READ_CONCERN_LEVEL_MAJORITY "majority" #define MONGOC_READ_CONCERN_LEVEL_LINEARIZABLE "linearizable" #define MONGOC_READ_CONCERN_LEVEL_SNAPSHOT "snapshot" typedef struct _mongoc_read_concern_t mongoc_read_concern_t; MONGOC_EXPORT(mongoc_read_concern_t *) mongoc_read_concern_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_read_concern_t *) mongoc_read_concern_copy(const mongoc_read_concern_t *read_concern) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_read_concern_destroy(mongoc_read_concern_t *read_concern); MONGOC_EXPORT(const char *) mongoc_read_concern_get_level(const mongoc_read_concern_t *read_concern); MONGOC_EXPORT(bool) mongoc_read_concern_set_level(mongoc_read_concern_t *read_concern, const char *level); MONGOC_EXPORT(bool) mongoc_read_concern_append(mongoc_read_concern_t *read_concern, bson_t *doc); MONGOC_EXPORT(bool) mongoc_read_concern_is_default(const mongoc_read_concern_t *read_concern); BSON_END_DECLS #endif /* MONGOC_READ_CONCERN_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-prefs-private.h000066400000000000000000000044631511661753600263300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_READ_PREFS_PRIVATE_H #define MONGOC_READ_PREFS_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS struct _mongoc_read_prefs_t { mongoc_read_mode_t mode; bson_t tags; int64_t max_staleness_seconds; bson_t hedge; }; typedef struct _mongoc_assemble_query_result_t { bson_t *assembled_query; bool query_owned; int32_t flags; } mongoc_assemble_query_result_t; #define ASSEMBLE_QUERY_RESULT_INIT {NULL, false, MONGOC_QUERY_NONE} const char * _mongoc_read_mode_as_str(mongoc_read_mode_t mode); void assemble_query(const mongoc_read_prefs_t *read_prefs, const mongoc_server_stream_t *server_stream, const bson_t *query_bson, int32_t initial_flags, mongoc_assemble_query_result_t *result); void assemble_query_result_cleanup(mongoc_assemble_query_result_t *result); bool _mongoc_read_prefs_validate(const mongoc_read_prefs_t *read_prefs, bson_error_t *error); typedef enum { MONGOC_READ_PREFS_CONTENT_FLAG_MODE = (1 << 0), MONGOC_READ_PREFS_CONTENT_FLAG_TAGS = (1 << 1), MONGOC_READ_PREFS_CONTENT_FLAG_MAX_STALENESS_SECONDS = (1 << 2), MONGOC_READ_PREFS_CONTENT_FLAG_HEDGE = (1 << 3), } mongoc_read_prefs_content_flags_t; bool mongoc_read_prefs_append_contents_to_bson(const mongoc_read_prefs_t *read_prefs, bson_t *bson, mongoc_read_prefs_content_flags_t flags); #define IS_PREF_PRIMARY(_pref) (!(_pref) || ((_pref)->mode == MONGOC_READ_PRIMARY)) BSON_END_DECLS #endif /* MONGOC_READ_PREFS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-prefs.c000066400000000000000000000312221511661753600246440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include mongoc_read_prefs_t * mongoc_read_prefs_new(mongoc_read_mode_t mode) { mongoc_read_prefs_t *read_prefs; read_prefs = BSON_ALIGNED_ALLOC0(mongoc_read_prefs_t); read_prefs->mode = mode; bson_init(&read_prefs->tags); read_prefs->max_staleness_seconds = MONGOC_NO_MAX_STALENESS; bson_init(&read_prefs->hedge); return read_prefs; } mongoc_read_mode_t mongoc_read_prefs_get_mode(const mongoc_read_prefs_t *read_prefs) { return read_prefs ? read_prefs->mode : MONGOC_READ_PRIMARY; } void mongoc_read_prefs_set_mode(mongoc_read_prefs_t *read_prefs, mongoc_read_mode_t mode) { BSON_ASSERT(read_prefs); BSON_ASSERT(mode <= MONGOC_READ_NEAREST); read_prefs->mode = mode; } const bson_t * mongoc_read_prefs_get_tags(const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT(read_prefs); return &read_prefs->tags; } void mongoc_read_prefs_set_tags(mongoc_read_prefs_t *read_prefs, const bson_t *tags) { BSON_ASSERT(read_prefs); bson_destroy(&read_prefs->tags); if (tags) { bson_copy_to(tags, &read_prefs->tags); } else { bson_init(&read_prefs->tags); } } void mongoc_read_prefs_add_tag(mongoc_read_prefs_t *read_prefs, const bson_t *tag) { bson_t empty = BSON_INITIALIZER; char str[16]; int key; BSON_ASSERT(read_prefs); key = bson_count_keys(&read_prefs->tags); // Expect no truncation. int req = bson_snprintf(str, sizeof str, "%d", key); BSON_ASSERT(mlib_cmp(req, <, sizeof str)); if (tag) { bson_append_document(&read_prefs->tags, str, -1, tag); } else { bson_append_document(&read_prefs->tags, str, -1, &empty); } bson_destroy(&empty); } int64_t mongoc_read_prefs_get_max_staleness_seconds(const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT(read_prefs); return read_prefs->max_staleness_seconds; } void mongoc_read_prefs_set_max_staleness_seconds(mongoc_read_prefs_t *read_prefs, int64_t max_staleness_seconds) { BSON_ASSERT(read_prefs); read_prefs->max_staleness_seconds = max_staleness_seconds; } const bson_t * mongoc_read_prefs_get_hedge(const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT(read_prefs); return &read_prefs->hedge; } void mongoc_read_prefs_set_hedge(mongoc_read_prefs_t *read_prefs, const bson_t *hedge) { BSON_ASSERT(read_prefs); bson_destroy(&read_prefs->hedge); if (hedge) { bson_copy_to(hedge, &read_prefs->hedge); } else { bson_init(&read_prefs->hedge); } } bool mongoc_read_prefs_is_valid(const mongoc_read_prefs_t *read_prefs) { BSON_ASSERT(read_prefs); /* * Tags, maxStalenessSeconds, and hedge are not supported with PRIMARY mode. */ if (read_prefs->mode == MONGOC_READ_PRIMARY) { if (!bson_empty(&read_prefs->tags) || read_prefs->max_staleness_seconds != MONGOC_NO_MAX_STALENESS || !bson_empty(&read_prefs->hedge)) { return false; } } if (read_prefs->max_staleness_seconds != MONGOC_NO_MAX_STALENESS && read_prefs->max_staleness_seconds <= 0) { return false; } return true; } void mongoc_read_prefs_destroy(mongoc_read_prefs_t *read_prefs) { if (read_prefs) { bson_destroy(&read_prefs->tags); bson_destroy(&read_prefs->hedge); bson_free(read_prefs); } } mongoc_read_prefs_t * mongoc_read_prefs_copy(const mongoc_read_prefs_t *read_prefs) { mongoc_read_prefs_t *ret = NULL; if (read_prefs) { ret = mongoc_read_prefs_new(read_prefs->mode); bson_destroy(&ret->tags); bson_copy_to(&read_prefs->tags, &ret->tags); ret->max_staleness_seconds = read_prefs->max_staleness_seconds; bson_destroy(&ret->hedge); bson_copy_to(&read_prefs->hedge, &ret->hedge); } return ret; } const char * _mongoc_read_mode_as_str(mongoc_read_mode_t mode) { switch (mode) { case MONGOC_READ_PRIMARY: return "primary"; case MONGOC_READ_PRIMARY_PREFERRED: return "primaryPreferred"; case MONGOC_READ_SECONDARY: return "secondary"; case MONGOC_READ_SECONDARY_PREFERRED: return "secondaryPreferred"; case MONGOC_READ_NEAREST: return "nearest"; default: return ""; } } /* Update result with the read prefs, following Server Selection Spec. * The driver must have discovered the server is a mongos. */ static void _apply_read_preferences_mongos(const mongoc_read_prefs_t *read_prefs, const bson_t *query_bson, mongoc_assemble_query_result_t *result /* OUT */) { mongoc_read_mode_t mode; const bson_t *tags = NULL; bson_t child; int64_t max_staleness_seconds = MONGOC_NO_MAX_STALENESS; const bson_t *hedge = NULL; mode = mongoc_read_prefs_get_mode(read_prefs); if (read_prefs) { max_staleness_seconds = mongoc_read_prefs_get_max_staleness_seconds(read_prefs); tags = mongoc_read_prefs_get_tags(read_prefs); mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); hedge = mongoc_read_prefs_get_hedge(read_prefs); mlib_diagnostic_pop(); } /* Server Selection Spec says: * * For mode 'primary', drivers MUST NOT set the secondaryOk wire protocol * flag and MUST NOT use $readPreference * * For mode 'secondary', drivers MUST set the secondaryOk wire protocol flag * and MUST also use $readPreference * * For mode 'primaryPreferred', drivers MUST set the secondaryOk wire * protocol flag and MUST also use $readPreference * * For mode 'secondaryPreferred', drivers MUST set the secondaryOk wire * protocol flag. If the read preference contains a non-empty tag_sets * parameter, maxStalenessSeconds is a positive integer, or the hedge * parameter is non-empty, drivers MUST use $readPreference; otherwise, * drivers MUST NOT use $readPreference * * For mode 'nearest', drivers MUST set the secondaryOk wire protocol flag * and MUST also use $readPreference */ if (mode == MONGOC_READ_SECONDARY_PREFERRED && (bson_empty0(tags) && max_staleness_seconds <= 0 && bson_empty0(hedge))) { result->flags |= MONGOC_QUERY_SECONDARY_OK; } else if (mode != MONGOC_READ_PRIMARY) { result->flags |= MONGOC_QUERY_SECONDARY_OK; /* Server Selection Spec: "When any $ modifier is used, including the * $readPreference modifier, the query MUST be provided using the $query * modifier". * * This applies to commands, too. */ result->assembled_query = bson_new(); result->query_owned = true; if (bson_has_field(query_bson, "$query")) { bson_concat(result->assembled_query, query_bson); } else { bson_append_document(result->assembled_query, "$query", 6, query_bson); } bson_append_document_begin(result->assembled_query, "$readPreference", 15, &child); mongoc_read_prefs_append_contents_to_bson( read_prefs, &child, MONGOC_READ_PREFS_CONTENT_FLAG_MODE | MONGOC_READ_PREFS_CONTENT_FLAG_TAGS | MONGOC_READ_PREFS_CONTENT_FLAG_MAX_STALENESS_SECONDS | MONGOC_READ_PREFS_CONTENT_FLAG_HEDGE); bson_append_document_end(result->assembled_query, &child); } } bool mongoc_read_prefs_append_contents_to_bson(const mongoc_read_prefs_t *read_prefs, bson_t *bson, mongoc_read_prefs_content_flags_t flags) { BSON_OPTIONAL_PARAM(read_prefs); BSON_ASSERT_PARAM(bson); if (flags & MONGOC_READ_PREFS_CONTENT_FLAG_MODE) { // 'mode' will be Primary when read_prefs==NULL. mongoc_read_mode_t mode = mongoc_read_prefs_get_mode(read_prefs); const char *mode_str = _mongoc_read_mode_as_str(mode); if (!BSON_APPEND_UTF8(bson, "mode", mode_str)) { return false; } } if (read_prefs) { // Other content is only available for non-NULL read_prefs int64_t max_staleness_seconds = mongoc_read_prefs_get_max_staleness_seconds(read_prefs); mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); const bson_t *hedge = mongoc_read_prefs_get_hedge(read_prefs); mlib_diagnostic_pop(); const bson_t *tags = mongoc_read_prefs_get_tags(read_prefs); if ((flags & MONGOC_READ_PREFS_CONTENT_FLAG_TAGS) && !bson_empty(tags) && !BSON_APPEND_ARRAY(bson, "tags", tags)) { return false; } if ((flags & MONGOC_READ_PREFS_CONTENT_FLAG_MAX_STALENESS_SECONDS) && max_staleness_seconds != MONGOC_NO_MAX_STALENESS && !BSON_APPEND_INT64(bson, "maxStalenessSeconds", max_staleness_seconds)) { return false; } if ((flags & MONGOC_READ_PREFS_CONTENT_FLAG_HEDGE) && !bson_empty(hedge) && !BSON_APPEND_DOCUMENT(bson, "hedge", hedge)) { return false; } } return true; } /* *-------------------------------------------------------------------------- * * assemble_query -- * * Update @result based on @read_prefs, following the Server Selection * Spec. * * Side effects: * Sets @result->assembled_query and @result->flags. * * Note: * This function, the mongoc_assemble_query_result_t struct, and all * related functions are only used for find operations with OP_QUERY. * Remove them once we have implemented exhaust cursors with OP_MSG in * the server, and all previous server versions are EOL. * *-------------------------------------------------------------------------- */ void assemble_query(const mongoc_read_prefs_t *read_prefs, const mongoc_server_stream_t *server_stream, const bson_t *query_bson, int32_t initial_flags, mongoc_assemble_query_result_t *result /* OUT */) { mongoc_server_description_type_t server_type; ENTRY; BSON_ASSERT(server_stream); BSON_ASSERT(query_bson); BSON_ASSERT(result); /* default values */ result->assembled_query = (bson_t *)query_bson; result->query_owned = false; result->flags = initial_flags; server_type = server_stream->sd->type; switch (server_stream->topology_type) { case MONGOC_TOPOLOGY_SINGLE: if (server_type == MONGOC_SERVER_MONGOS) { _apply_read_preferences_mongos(read_prefs, query_bson, result); } else { /* Server Selection Spec: for topology type single and server types * besides mongos, "clients MUST always set the secondaryOk wire * protocol flag on reads to ensure that any server type can handle the * request." */ result->flags |= MONGOC_OP_QUERY_FLAG_SECONDARY_OK; } break; case MONGOC_TOPOLOGY_RS_NO_PRIMARY: case MONGOC_TOPOLOGY_RS_WITH_PRIMARY: /* Server Selection Spec: for RS topology types, "For all read * preferences modes except primary, clients MUST set the secondaryOk wire * protocol flag to ensure that any suitable server can handle the * request. Clients MUST NOT set the secondaryOk wire protocol flag if * the read preference mode is primary. */ if (read_prefs && read_prefs->mode != MONGOC_READ_PRIMARY) { result->flags |= MONGOC_OP_QUERY_FLAG_SECONDARY_OK; } break; case MONGOC_TOPOLOGY_SHARDED: case MONGOC_TOPOLOGY_LOAD_BALANCED: _apply_read_preferences_mongos(read_prefs, query_bson, result); break; case MONGOC_TOPOLOGY_UNKNOWN: case MONGOC_TOPOLOGY_DESCRIPTION_TYPES: default: /* must not call _apply_read_preferences with unknown topology type */ BSON_ASSERT(false); } EXIT; } void assemble_query_result_cleanup(mongoc_assemble_query_result_t *result) { ENTRY; BSON_ASSERT(result); if (result->query_owned) { bson_destroy(result->assembled_query); } EXIT; } bool _mongoc_read_prefs_validate(const mongoc_read_prefs_t *read_prefs, bson_error_t *error) { if (read_prefs && !mongoc_read_prefs_is_valid(read_prefs)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid mongoc_read_prefs_t"); return false; } return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-read-prefs.h000066400000000000000000000061561511661753600246610ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_READ_PREFS_H #define MONGOC_READ_PREFS_H #include #include #include BSON_BEGIN_DECLS #define MONGOC_NO_MAX_STALENESS -1 #define MONGOC_SMALLEST_MAX_STALENESS_SECONDS 90 typedef struct _mongoc_read_prefs_t mongoc_read_prefs_t; typedef enum { /** Represents $readPreference.mode of 'primary' */ MONGOC_READ_PRIMARY = (1 << 0), /** Represents $readPreference.mode of 'secondary' */ MONGOC_READ_SECONDARY = (1 << 1), /** Represents $readPreference.mode of 'primaryPreferred' */ MONGOC_READ_PRIMARY_PREFERRED = (1 << 2) | MONGOC_READ_PRIMARY, /** Represents $readPreference.mode of 'secondaryPreferred' */ MONGOC_READ_SECONDARY_PREFERRED = (1 << 2) | MONGOC_READ_SECONDARY, /** Represents $readPreference.mode of 'nearest' */ MONGOC_READ_NEAREST = (1 << 3) | MONGOC_READ_SECONDARY, } mongoc_read_mode_t; MONGOC_EXPORT(mongoc_read_prefs_t *) mongoc_read_prefs_new(mongoc_read_mode_t read_mode) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_read_prefs_t *) mongoc_read_prefs_copy(const mongoc_read_prefs_t *read_prefs) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_read_prefs_destroy(mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(mongoc_read_mode_t) mongoc_read_prefs_get_mode(const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(void) mongoc_read_prefs_set_mode(mongoc_read_prefs_t *read_prefs, mongoc_read_mode_t mode); MONGOC_EXPORT(const bson_t *) mongoc_read_prefs_get_tags(const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(void) mongoc_read_prefs_set_tags(mongoc_read_prefs_t *read_prefs, const bson_t *tags); MONGOC_EXPORT(void) mongoc_read_prefs_add_tag(mongoc_read_prefs_t *read_prefs, const bson_t *tag); MONGOC_EXPORT(int64_t) mongoc_read_prefs_get_max_staleness_seconds(const mongoc_read_prefs_t *read_prefs); MONGOC_EXPORT(void) mongoc_read_prefs_set_max_staleness_seconds(mongoc_read_prefs_t *read_prefs, int64_t max_staleness_seconds); BSON_DEPRECATED("Hedged reads are deprecated in MongoDB 8.0 and will be removed in a future release") MONGOC_EXPORT(const bson_t *) mongoc_read_prefs_get_hedge(const mongoc_read_prefs_t *read_prefs); BSON_DEPRECATED("Hedged reads are deprecated in MongoDB 8.0 and will be removed in a future release") MONGOC_EXPORT(void) mongoc_read_prefs_set_hedge(mongoc_read_prefs_t *read_prefs, const bson_t *hedge); MONGOC_EXPORT(bool) mongoc_read_prefs_is_valid(const mongoc_read_prefs_t *read_prefs); BSON_END_DECLS #endif /* MONGOC_READ_PREFS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rpc-private.h000066400000000000000000000026721511661753600250640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_RPC_PRIVATE_H #define MONGOC_RPC_PRIVATE_H #include #include #include #include #include BSON_BEGIN_DECLS bool mcd_rpc_message_get_body(const mcd_rpc_message *rpc, bson_t *reply); bool mcd_rpc_message_check_ok(mcd_rpc_message *rpc, int32_t error_api_version, bson_error_t *error /* OUT */, bson_t *error_doc /* OUT */); bool _mongoc_cmd_check_ok(const bson_t *doc, int32_t error_api_version, bson_error_t *error); bool _mongoc_cmd_check_ok_no_wce(const bson_t *doc, int32_t error_api_version, bson_error_t *error); void mcd_rpc_message_egress(const mcd_rpc_message *rpc); void mcd_rpc_message_ingress(const mcd_rpc_message *rpc); BSON_END_DECLS #endif /* MONGOC_RPC_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-rpc.c000066400000000000000000000305251511661753600234050ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include bool mcd_rpc_message_get_body(const mcd_rpc_message *rpc, bson_t *reply) { switch (mcd_rpc_header_get_op_code(rpc)) { case MONGOC_OP_CODE_MSG: { const size_t sections_count = mcd_rpc_op_msg_get_sections_count(rpc); // Look for section kind 0. for (size_t index = 0u; index < sections_count; ++index) { switch (mcd_rpc_op_msg_section_get_kind(rpc, index)) { case 0: { // Body. const uint8_t *const body = mcd_rpc_op_msg_section_get_body(rpc, index); const int32_t body_len = bson_iter_int32_unsafe(&(bson_iter_t){.raw = body}); return bson_init_static(reply, body, (size_t)body_len); } case 1: // Document Sequence. continue; default: // Validated by `mcd_rpc_message_from_data`. BSON_UNREACHABLE("invalid OP_MSG section kind"); } } break; } case MONGOC_OP_CODE_REPLY: { if (mcd_rpc_op_reply_get_documents_len(rpc) < 1) { return false; } // Assume the first document in OP_REPLY is the body. const uint8_t *const body = mcd_rpc_op_reply_get_documents(rpc); return bson_init_static(reply, body, (size_t)bson_iter_int32_unsafe(&(bson_iter_t){.raw = body})); } default: break; } return false; } /* returns true if an error was found. */ static bool _parse_error_reply(const bson_t *doc, bool check_wce, uint32_t *code, const char **msg) { bson_iter_t iter; bool found_error = false; ENTRY; BSON_ASSERT(doc); BSON_ASSERT(code); *code = 0; /* The server only returns real error codes as int32. * But it may return as a double or int64 if a failpoint * based on how it is configured to error. */ if (bson_iter_init_find(&iter, doc, "code") && BSON_ITER_HOLDS_NUMBER(&iter)) { *code = (uint32_t)bson_iter_as_int64(&iter); BSON_ASSERT(*code); found_error = true; } if (bson_iter_init_find(&iter, doc, "errmsg") && BSON_ITER_HOLDS_UTF8(&iter)) { *msg = bson_iter_utf8(&iter, NULL); found_error = true; } else if (bson_iter_init_find(&iter, doc, "$err") && BSON_ITER_HOLDS_UTF8(&iter)) { *msg = bson_iter_utf8(&iter, NULL); found_error = true; } if (found_error) { /* there was a command error */ RETURN(true); } if (check_wce) { /* check for a write concern error */ if (bson_iter_init_find(&iter, doc, "writeConcernError") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { bson_iter_t child; BSON_ASSERT(bson_iter_recurse(&iter, &child)); if (bson_iter_find(&child, "code") && BSON_ITER_HOLDS_NUMBER(&child)) { *code = (uint32_t)bson_iter_as_int64(&child); BSON_ASSERT(*code); found_error = true; } BSON_ASSERT(bson_iter_recurse(&iter, &child)); if (bson_iter_find(&child, "errmsg") && BSON_ITER_HOLDS_UTF8(&child)) { *msg = bson_iter_utf8(&child, NULL); found_error = true; } } } RETURN(found_error); } static void _mongoc_cmd_set_error(bson_error_t *error, int32_t error_api_version, uint32_t code, const char *msg) { BSON_OPTIONAL_PARAM(error); BSON_ASSERT_PARAM(msg); uint8_t category = MONGOC_ERROR_CATEGORY_SERVER; if (code == MONGOC_ERROR_PROTOCOL_ERROR) { // Map protocolError to commandNotFound for backward compatibility (DRIVERS-192). code = MONGOC_ERROR_QUERY_COMMAND_NOT_FOUND; } else if (code == 0) { // Reply was "not OK" but no error code was provided. Use our own error code. code = MONGOC_ERROR_QUERY_FAILURE; category = MONGOC_ERROR_CATEGORY; } const mongoc_error_domain_t domain = error_api_version >= MONGOC_ERROR_API_VERSION_2 ? MONGOC_ERROR_SERVER : MONGOC_ERROR_QUERY; _mongoc_set_error_with_category(error, category, domain, code, "%s", msg); } /* *-------------------------------------------------------------------------- * * _mongoc_cmd_check_ok -- * * Check if a server reply document is an error message. * Optionally fill out a bson_error_t from the server error. * Does *not* check for writeConcernError. * * Returns: * false if @doc is an error message, true otherwise. * * Side effects: * If @doc is an error reply and @error is not NULL, set its * domain, code, and message. * *-------------------------------------------------------------------------- */ bool _mongoc_cmd_check_ok(const bson_t *doc, int32_t error_api_version, bson_error_t *error) { ENTRY; BSON_ASSERT(doc); { bson_iter_t iter; if (bson_iter_init_find(&iter, doc, "ok") && bson_iter_as_bool(&iter)) { /* no error */ RETURN(true); } } uint32_t code; const char *msg = "Unknown command error"; if (!_parse_error_reply(doc, false /* check_wce */, &code, &msg)) { RETURN(true); } _mongoc_cmd_set_error(error, error_api_version, code, msg); /* there was a command error */ RETURN(false); } /* *-------------------------------------------------------------------------- * * _mongoc_cmd_check_ok_no_wce -- * * Check if a server reply document is an error message. * Optionally fill out a bson_error_t from the server error. * If the response contains a writeConcernError, this is considered * an error and returns false. * * Returns: * false if @doc is an error message, true otherwise. * * Side effects: * If @doc is an error reply and @error is not NULL, set its * domain, code, and message. * *-------------------------------------------------------------------------- */ bool _mongoc_cmd_check_ok_no_wce(const bson_t *doc, int32_t error_api_version, bson_error_t *error) { ENTRY; BSON_ASSERT(doc); uint32_t code; const char *msg = "Unknown command error"; if (!_parse_error_reply(doc, true /* check_wce */, &code, &msg)) { RETURN(true); } _mongoc_cmd_set_error(error, error_api_version, code, msg); /* there was a command error */ RETURN(false); } /* helper function to parse error reply document to an OP_QUERY */ static void _mongoc_populate_query_error(const bson_t *doc, int32_t error_api_version, bson_error_t *error) { ENTRY; BSON_ASSERT(doc); if (!error) { return; } bson_iter_t iter; const uint32_t domain = error_api_version >= MONGOC_ERROR_API_VERSION_2 ? MONGOC_ERROR_SERVER : MONGOC_ERROR_QUERY; uint32_t code = MONGOC_ERROR_QUERY_FAILURE; uint8_t category = MONGOC_ERROR_CATEGORY; const char *msg = "Unknown query failure"; if (bson_iter_init_find(&iter, doc, "code") && BSON_ITER_HOLDS_NUMBER(&iter)) { code = (uint32_t)bson_iter_as_int64(&iter); category = MONGOC_ERROR_CATEGORY_SERVER; BSON_ASSERT(code); } if (bson_iter_init_find(&iter, doc, "$err") && BSON_ITER_HOLDS_UTF8(&iter)) { msg = bson_iter_utf8(&iter, NULL); } _mongoc_set_error_with_category(error, category, domain, code, "%s", msg); EXIT; } bool mcd_rpc_message_check_ok(mcd_rpc_message *rpc, int32_t error_api_version, bson_error_t *error /* OUT */, bson_t *error_doc /* OUT */) { BSON_ASSERT(rpc); ENTRY; if (mcd_rpc_header_get_op_code(rpc) != MONGOC_OP_CODE_REPLY) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "Received rpc other than OP_REPLY."); RETURN(false); } const int32_t flags = mcd_rpc_op_reply_get_response_flags(rpc); if (flags & MONGOC_OP_REPLY_RESPONSE_FLAG_QUERY_FAILURE) { bson_t body; if (mcd_rpc_message_get_body(rpc, &body)) { _mongoc_populate_query_error(&body, error_api_version, error); if (error_doc) { bson_destroy(error_doc); bson_copy_to(&body, error_doc); } bson_destroy(&body); } else { _mongoc_set_error(error, MONGOC_ERROR_QUERY, MONGOC_ERROR_QUERY_FAILURE, "Unknown query failure."); } RETURN(false); } if (flags & MONGOC_OP_REPLY_RESPONSE_FLAG_CURSOR_NOT_FOUND) { _mongoc_set_error( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "The cursor is invalid or has expired."); RETURN(false); } RETURN(true); } void mcd_rpc_message_egress(const mcd_rpc_message *rpc) { // `mcd_rpc_message_egress` is expected to be called after // `mcd_rpc_message_to_iovecs`, which converts the opCode field to // little endian. int32_t op_code = mcd_rpc_header_get_op_code(rpc); op_code = bson_iter_int32_unsafe(&(bson_iter_t){.raw = (const uint8_t *)&op_code}); if (op_code == MONGOC_OP_CODE_COMPRESSED) { mongoc_counter_op_egress_compressed_inc(); mongoc_counter_op_egress_total_inc(); op_code = mcd_rpc_op_compressed_get_original_opcode(rpc); op_code = bson_iter_int32_unsafe(&(bson_iter_t){.raw = (const uint8_t *)&op_code}); } switch (op_code) { case MONGOC_OP_CODE_COMPRESSED: BSON_UNREACHABLE("invalid opcode (double compression?!)"); break; case MONGOC_OP_CODE_MSG: mongoc_counter_op_egress_msg_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_REPLY: BSON_UNREACHABLE("unexpected OP_REPLY egress"); break; case MONGOC_OP_CODE_UPDATE: mongoc_counter_op_egress_update_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_INSERT: mongoc_counter_op_egress_insert_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_QUERY: mongoc_counter_op_egress_query_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_GET_MORE: mongoc_counter_op_egress_getmore_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_DELETE: mongoc_counter_op_egress_delete_inc(); mongoc_counter_op_egress_total_inc(); break; case MONGOC_OP_CODE_KILL_CURSORS: mongoc_counter_op_egress_killcursors_inc(); mongoc_counter_op_egress_total_inc(); break; default: BSON_UNREACHABLE("invalid opcode"); } } void mcd_rpc_message_ingress(const mcd_rpc_message *rpc) { // `mcd_rpc_message_ingress` is expected be called after // `mcd_rpc_message_from_data`, which converts the opCode field to native // endian. int32_t op_code = mcd_rpc_header_get_op_code(rpc); if (op_code == MONGOC_OP_CODE_COMPRESSED) { mongoc_counter_op_ingress_compressed_inc(); mongoc_counter_op_ingress_total_inc(); op_code = mcd_rpc_op_compressed_get_original_opcode(rpc); } switch (op_code) { case MONGOC_OP_CODE_COMPRESSED: BSON_UNREACHABLE("invalid opcode (double compression?!)"); break; case MONGOC_OP_CODE_MSG: mongoc_counter_op_ingress_msg_inc(); mongoc_counter_op_ingress_total_inc(); break; case MONGOC_OP_CODE_REPLY: mongoc_counter_op_ingress_reply_inc(); mongoc_counter_op_ingress_total_inc(); break; case MONGOC_OP_CODE_UPDATE: BSON_UNREACHABLE("unexpected OP_UPDATE ingress"); break; case MONGOC_OP_CODE_INSERT: BSON_UNREACHABLE("unexpected OP_INSERT ingress"); break; case MONGOC_OP_CODE_QUERY: BSON_UNREACHABLE("unexpected OP_QUERY ingress"); break; case MONGOC_OP_CODE_GET_MORE: BSON_UNREACHABLE("unexpected OP_GET_MORE ingress"); break; case MONGOC_OP_CODE_DELETE: BSON_UNREACHABLE("unexpected OP_DELETE ingress"); break; case MONGOC_OP_CODE_KILL_CURSORS: BSON_UNREACHABLE("unexpected OP_KILL_CURSORS ingress"); break; default: BSON_UNREACHABLE("invalid opcode"); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-sasl-private.h000066400000000000000000000032721511661753600252370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SASL_PRIVATE_H #define MONGOC_SASL_PRIVATE_H #include #include #include #include #include BSON_BEGIN_DECLS typedef struct { char *user; char *pass; char *service_name; char *service_host; bool canonicalize_host_name; char *mechanism; } mongoc_sasl_t; void _mongoc_sasl_set_pass(mongoc_sasl_t *sasl, const char *pass); void _mongoc_sasl_set_user(mongoc_sasl_t *sasl, const char *user); void _mongoc_sasl_set_service_name(mongoc_sasl_t *sasl, const char *service_name); void _mongoc_sasl_set_service_host(mongoc_sasl_t *sasl, const char *service_host); void _mongoc_sasl_set_properties(mongoc_sasl_t *sasl, const mongoc_uri_t *uri); bool _mongoc_sasl_get_canonicalized_name(mongoc_stream_t *node_stream, /* IN */ char *name, /* OUT */ size_t namelen); /* IN */ BSON_END_DECLS #endif /* MONGOC_SASL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-sasl.c000066400000000000000000000124621511661753600235630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SASL #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "SASL" void _mongoc_sasl_set_user(mongoc_sasl_t *sasl, const char *user) { BSON_ASSERT(sasl); bson_free(sasl->user); sasl->user = user ? bson_strdup(user) : NULL; } void _mongoc_sasl_set_pass(mongoc_sasl_t *sasl, const char *pass) { BSON_ASSERT(sasl); bson_free(sasl->pass); sasl->pass = pass ? bson_strdup(pass) : NULL; } void _mongoc_sasl_set_service_host(mongoc_sasl_t *sasl, const char *service_host) { BSON_ASSERT(sasl); bson_free(sasl->service_host); sasl->service_host = service_host ? bson_strdup(service_host) : NULL; } void _mongoc_sasl_set_service_name(mongoc_sasl_t *sasl, const char *service_name) { BSON_ASSERT(sasl); bson_free(sasl->service_name); sasl->service_name = service_name ? bson_strdup(service_name) : NULL; } void _mongoc_sasl_set_properties(mongoc_sasl_t *sasl, const mongoc_uri_t *uri) { const bson_t *options; bson_iter_t iter; bson_t properties; const char *service_name = NULL; bool canonicalize = false; _mongoc_sasl_set_pass(sasl, mongoc_uri_get_password(uri)); _mongoc_sasl_set_user(sasl, mongoc_uri_get_username(uri)); options = mongoc_uri_get_options(uri); if (!mongoc_uri_get_mechanism_properties(uri, &properties)) { bson_init(&properties); } if (bson_iter_init_find_case(&iter, options, MONGOC_URI_GSSAPISERVICENAME) && BSON_ITER_HOLDS_UTF8(&iter)) { service_name = bson_iter_utf8(&iter, NULL); } if (bson_iter_init_find_case(&iter, &properties, "SERVICE_NAME") && BSON_ITER_HOLDS_UTF8(&iter)) { /* newer "authMechanismProperties" URI syntax takes precedence */ service_name = bson_iter_utf8(&iter, NULL); } _mongoc_sasl_set_service_name(sasl, service_name); /* * Driver Authentication Spec: "Drivers MAY allow the user to request * canonicalization of the hostname. This might be required when the hosts * report different hostnames than what is used in the kerberos database. * The default is "false". * * Some underlying GSSAPI layers will do this for us, but can be disabled in * their config (krb.conf). * * See CDRIVER-323 for more information. */ if (bson_iter_init_find_case(&iter, options, MONGOC_URI_CANONICALIZEHOSTNAME) && BSON_ITER_HOLDS_BOOL(&iter)) { canonicalize = bson_iter_bool(&iter); } /* newer "authMechanismProperties" URI syntax takes precedence */ if (bson_iter_init_find_case(&iter, &properties, "CANONICALIZE_HOST_NAME") && BSON_ITER_HOLDS_UTF8(&iter)) { const char *const value = bson_iter_utf8(&iter, NULL); const bool is_true = strcasecmp(value, "true") == 0; // CDRIVER-4128: only legacy boolean values are currently supported. if (!is_true && strcasecmp(value, "false") != 0) { MONGOC_WARNING("Unsupported value for \"CANONICALIZE_HOST_NAME\": \"%s\"", value); } else { canonicalize = is_true; } } sasl->canonicalize_host_name = canonicalize; bson_destroy(&properties); } /* *-------------------------------------------------------------------------- * * _mongoc_sasl_get_canonicalized_name -- * * Query the node to get the canonicalized name. This may happen if * the node has been accessed via an alias. * * The gssapi code will use this if canonicalizeHostname is true. * * Some underlying layers of krb might do this for us, but they can * be disabled in krb.conf. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool _mongoc_sasl_get_canonicalized_name(mongoc_stream_t *node_stream, /* IN */ char *name, /* OUT */ size_t namelen) /* OUT */ { mongoc_stream_t *stream; mongoc_socket_t *sock = NULL; char *canonicalized; ENTRY; BSON_ASSERT(node_stream); BSON_ASSERT(name); stream = mongoc_stream_get_root_stream(node_stream); BSON_ASSERT(stream); if (stream->type == MONGOC_STREAM_SOCKET) { sock = mongoc_stream_socket_get_socket((mongoc_stream_socket_t *)stream); if (sock) { canonicalized = mongoc_socket_getnameinfo(sock); if (canonicalized) { // Truncation is OK. int req = bson_snprintf(name, namelen, "%s", canonicalized); BSON_ASSERT(req > 0); bson_free(canonicalized); RETURN(true); } } } RETURN(false); } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-scram-private.h000066400000000000000000000530501511661753600254010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SCRAM_PRIVATE_H #define MONGOC_SCRAM_PRIVATE_H #include #include BSON_BEGIN_DECLS #define MONGOC_SCRAM_SHA_1_HASH_SIZE 20 #define MONGOC_SCRAM_SHA_256_HASH_SIZE 32 /* SCRAM-SHA-1 uses a hash size of 20, and SCRAM-SHA-256 uses a hash size * of 32. Stack allocations should be large enough for either. */ #define MONGOC_SCRAM_HASH_MAX_SIZE MONGOC_SCRAM_SHA_256_HASH_SIZE #define MONGOC_SCRAM_B64_ENCODED_SIZE(n) (2 * n) #define MONGOC_SCRAM_B64_HASH_MAX_SIZE MONGOC_SCRAM_B64_ENCODED_SIZE(MONGOC_SCRAM_HASH_MAX_SIZE) enum { /* It is unlikely that there will be more than 64 different user accounts * used in a single process */ MONGOC_SCRAM_CACHE_SIZE = 64, }; typedef struct _mongoc_scram_t { int step; char *user; char *pass; char hashed_password[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t decoded_salt[MONGOC_SCRAM_B64_HASH_MAX_SIZE]; uint32_t iterations; uint8_t client_key[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t server_key[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t salted_password[MONGOC_SCRAM_HASH_MAX_SIZE]; char encoded_nonce[48]; int32_t encoded_nonce_len; uint8_t *auth_message; uint32_t auth_messagemax; uint32_t auth_messagelen; #ifdef MONGOC_ENABLE_CRYPTO mongoc_crypto_t crypto; #endif } mongoc_scram_t; #ifdef MONGOC_ENABLE_CRYPTO void _mongoc_scram_init(mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo); #endif void _mongoc_scram_set_pass(mongoc_scram_t *scram, const char *pass); void _mongoc_scram_set_user(mongoc_scram_t *scram, const char *user); void _mongoc_scram_set_server_key(mongoc_scram_t *scram, const uint8_t *server_key, size_t len); void _mongoc_scram_set_salted_password(mongoc_scram_t *scram, const uint8_t *salted_password, size_t len); void _mongoc_scram_destroy(mongoc_scram_t *scram); bool _mongoc_scram_step(mongoc_scram_t *scram, const uint8_t *inbuf, uint32_t inbuflen, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen, bson_error_t *error); /* returns false if this string does not need SASLPrep. It returns true * conservatively, if str might need to be SASLPrep'ed. */ bool _mongoc_sasl_prep_required(const char *str); /* returns the output of SASLPrep as a new string which must be freed. Returns * null on error and sets err. */ char * _mongoc_sasl_prep(const char *in_utf8, bson_error_t *err); /* returns the byte length of the first UTF-8 code point in `s`. * _mongoc_utf8_char_length is exposed for testing */ size_t _mongoc_utf8_char_length(const char *s); /* returns the byte length of the UTF-8 string. Returns -1 if `s` is not a valid * UTF-8 string. * _mongoc_utf8_string_length is exposed for testing. */ ssize_t _mongoc_utf8_string_length(const char *s); /* returns the first Unicode code point in `c`. Returns 0 if length is 0. * `c` must be a valid UTF-8 string. * _mongoc_utf8_get_first_code_point is exposed for testing. */ uint32_t _mongoc_utf8_get_first_code_point(const char *c, size_t length); /* the tables below all come from RFC 3454. They are all range tables, with * value 2*n being the lower bound, and value 2*n + 1 being the upper bound. * Both bounds are exclusive. */ /* A.1 Unassigned code points in Unicode 3.2 * these characters are not allowed for SASLPrep */ static const uint32_t unassigned_codepoint_ranges[] = { 0x0221, 0x0221, 0x0234, 0x024F, 0x02AE, 0x02AF, 0x02EF, 0x02FF, 0x0350, 0x035F, 0x0370, 0x0373, 0x0376, 0x0379, 0x037B, 0x037D, 0x037F, 0x0383, 0x038B, 0x038B, 0x038D, 0x038D, 0x03A2, 0x03A2, 0x03CF, 0x03CF, 0x03F7, 0x03FF, 0x0487, 0x0487, 0x04CF, 0x04CF, 0x04F6, 0x04F7, 0x04FA, 0x04FF, 0x0510, 0x0530, 0x0557, 0x0558, 0x0560, 0x0560, 0x0588, 0x0588, 0x058B, 0x0590, 0x05A2, 0x05A2, 0x05BA, 0x05BA, 0x05C5, 0x05CF, 0x05EB, 0x05EF, 0x05F5, 0x060B, 0x060D, 0x061A, 0x061C, 0x061E, 0x0620, 0x0620, 0x063B, 0x063F, 0x0656, 0x065F, 0x06EE, 0x06EF, 0x06FF, 0x06FF, 0x070E, 0x070E, 0x072D, 0x072F, 0x074B, 0x077F, 0x07B2, 0x0900, 0x0904, 0x0904, 0x093A, 0x093B, 0x094E, 0x094F, 0x0955, 0x0957, 0x0971, 0x0980, 0x0984, 0x0984, 0x098D, 0x098E, 0x0991, 0x0992, 0x09A9, 0x09A9, 0x09B1, 0x09B1, 0x09B3, 0x09B5, 0x09BA, 0x09BB, 0x09BD, 0x09BD, 0x09C5, 0x09C6, 0x09C9, 0x09CA, 0x09CE, 0x09D6, 0x09D8, 0x09DB, 0x09DE, 0x09DE, 0x09E4, 0x09E5, 0x09FB, 0x0A01, 0x0A03, 0x0A04, 0x0A0B, 0x0A0E, 0x0A11, 0x0A12, 0x0A29, 0x0A29, 0x0A31, 0x0A31, 0x0A34, 0x0A34, 0x0A37, 0x0A37, 0x0A3A, 0x0A3B, 0x0A3D, 0x0A3D, 0x0A43, 0x0A46, 0x0A49, 0x0A4A, 0x0A4E, 0x0A58, 0x0A5D, 0x0A5D, 0x0A5F, 0x0A65, 0x0A75, 0x0A80, 0x0A84, 0x0A84, 0x0A8C, 0x0A8C, 0x0A8E, 0x0A8E, 0x0A92, 0x0A92, 0x0AA9, 0x0AA9, 0x0AB1, 0x0AB1, 0x0AB4, 0x0AB4, 0x0ABA, 0x0ABB, 0x0AC6, 0x0AC6, 0x0ACA, 0x0ACA, 0x0ACE, 0x0ACF, 0x0AD1, 0x0ADF, 0x0AE1, 0x0AE5, 0x0AF0, 0x0B00, 0x0B04, 0x0B04, 0x0B0D, 0x0B0E, 0x0B11, 0x0B12, 0x0B29, 0x0B29, 0x0B31, 0x0B31, 0x0B34, 0x0B35, 0x0B3A, 0x0B3B, 0x0B44, 0x0B46, 0x0B49, 0x0B4A, 0x0B4E, 0x0B55, 0x0B58, 0x0B5B, 0x0B5E, 0x0B5E, 0x0B62, 0x0B65, 0x0B71, 0x0B81, 0x0B84, 0x0B84, 0x0B8B, 0x0B8D, 0x0B91, 0x0B91, 0x0B96, 0x0B98, 0x0B9B, 0x0B9B, 0x0B9D, 0x0B9D, 0x0BA0, 0x0BA2, 0x0BA5, 0x0BA7, 0x0BAB, 0x0BAD, 0x0BB6, 0x0BB6, 0x0BBA, 0x0BBD, 0x0BC3, 0x0BC5, 0x0BC9, 0x0BC9, 0x0BCE, 0x0BD6, 0x0BD8, 0x0BE6, 0x0BF3, 0x0C00, 0x0C04, 0x0C04, 0x0C0D, 0x0C0D, 0x0C11, 0x0C11, 0x0C29, 0x0C29, 0x0C34, 0x0C34, 0x0C3A, 0x0C3D, 0x0C45, 0x0C45, 0x0C49, 0x0C49, 0x0C4E, 0x0C54, 0x0C57, 0x0C5F, 0x0C62, 0x0C65, 0x0C70, 0x0C81, 0x0C84, 0x0C84, 0x0C8D, 0x0C8D, 0x0C91, 0x0C91, 0x0CA9, 0x0CA9, 0x0CB4, 0x0CB4, 0x0CBA, 0x0CBD, 0x0CC5, 0x0CC5, 0x0CC9, 0x0CC9, 0x0CCE, 0x0CD4, 0x0CD7, 0x0CDD, 0x0CDF, 0x0CDF, 0x0CE2, 0x0CE5, 0x0CF0, 0x0D01, 0x0D04, 0x0D04, 0x0D0D, 0x0D0D, 0x0D11, 0x0D11, 0x0D29, 0x0D29, 0x0D3A, 0x0D3D, 0x0D44, 0x0D45, 0x0D49, 0x0D49, 0x0D4E, 0x0D56, 0x0D58, 0x0D5F, 0x0D62, 0x0D65, 0x0D70, 0x0D81, 0x0D84, 0x0D84, 0x0D97, 0x0D99, 0x0DB2, 0x0DB2, 0x0DBC, 0x0DBC, 0x0DBE, 0x0DBF, 0x0DC7, 0x0DC9, 0x0DCB, 0x0DCE, 0x0DD5, 0x0DD5, 0x0DD7, 0x0DD7, 0x0DE0, 0x0DF1, 0x0DF5, 0x0E00, 0x0E3B, 0x0E3E, 0x0E5C, 0x0E80, 0x0E83, 0x0E83, 0x0E85, 0x0E86, 0x0E89, 0x0E89, 0x0E8B, 0x0E8C, 0x0E8E, 0x0E93, 0x0E98, 0x0E98, 0x0EA0, 0x0EA0, 0x0EA4, 0x0EA4, 0x0EA6, 0x0EA6, 0x0EA8, 0x0EA9, 0x0EAC, 0x0EAC, 0x0EBA, 0x0EBA, 0x0EBE, 0x0EBF, 0x0EC5, 0x0EC5, 0x0EC7, 0x0EC7, 0x0ECE, 0x0ECF, 0x0EDA, 0x0EDB, 0x0EDE, 0x0EFF, 0x0F48, 0x0F48, 0x0F6B, 0x0F70, 0x0F8C, 0x0F8F, 0x0F98, 0x0F98, 0x0FBD, 0x0FBD, 0x0FCD, 0x0FCE, 0x0FD0, 0x0FFF, 0x1022, 0x1022, 0x1028, 0x1028, 0x102B, 0x102B, 0x1033, 0x1035, 0x103A, 0x103F, 0x105A, 0x109F, 0x10C6, 0x10CF, 0x10F9, 0x10FA, 0x10FC, 0x10FF, 0x115A, 0x115E, 0x11A3, 0x11A7, 0x11FA, 0x11FF, 0x1207, 0x1207, 0x1247, 0x1247, 0x1249, 0x1249, 0x124E, 0x124F, 0x1257, 0x1257, 0x1259, 0x1259, 0x125E, 0x125F, 0x1287, 0x1287, 0x1289, 0x1289, 0x128E, 0x128F, 0x12AF, 0x12AF, 0x12B1, 0x12B1, 0x12B6, 0x12B7, 0x12BF, 0x12BF, 0x12C1, 0x12C1, 0x12C6, 0x12C7, 0x12CF, 0x12CF, 0x12D7, 0x12D7, 0x12EF, 0x12EF, 0x130F, 0x130F, 0x1311, 0x1311, 0x1316, 0x1317, 0x131F, 0x131F, 0x1347, 0x1347, 0x135B, 0x1360, 0x137D, 0x139F, 0x13F5, 0x1400, 0x1677, 0x167F, 0x169D, 0x169F, 0x16F1, 0x16FF, 0x170D, 0x170D, 0x1715, 0x171F, 0x1737, 0x173F, 0x1754, 0x175F, 0x176D, 0x176D, 0x1771, 0x1771, 0x1774, 0x177F, 0x17DD, 0x17DF, 0x17EA, 0x17FF, 0x180F, 0x180F, 0x181A, 0x181F, 0x1878, 0x187F, 0x18AA, 0x1DFF, 0x1E9C, 0x1E9F, 0x1EFA, 0x1EFF, 0x1F16, 0x1F17, 0x1F1E, 0x1F1F, 0x1F46, 0x1F47, 0x1F4E, 0x1F4F, 0x1F58, 0x1F58, 0x1F5A, 0x1F5A, 0x1F5C, 0x1F5C, 0x1F5E, 0x1F5E, 0x1F7E, 0x1F7F, 0x1FB5, 0x1FB5, 0x1FC5, 0x1FC5, 0x1FD4, 0x1FD5, 0x1FDC, 0x1FDC, 0x1FF0, 0x1FF1, 0x1FF5, 0x1FF5, 0x1FFF, 0x1FFF, 0x2053, 0x2056, 0x2058, 0x205E, 0x2064, 0x2069, 0x2072, 0x2073, 0x208F, 0x209F, 0x20B2, 0x20CF, 0x20EB, 0x20FF, 0x213B, 0x213C, 0x214C, 0x2152, 0x2184, 0x218F, 0x23CF, 0x23FF, 0x2427, 0x243F, 0x244B, 0x245F, 0x24FF, 0x24FF, 0x2614, 0x2615, 0x2618, 0x2618, 0x267E, 0x267F, 0x268A, 0x2700, 0x2705, 0x2705, 0x270A, 0x270B, 0x2728, 0x2728, 0x274C, 0x274C, 0x274E, 0x274E, 0x2753, 0x2755, 0x2757, 0x2757, 0x275F, 0x2760, 0x2795, 0x2797, 0x27B0, 0x27B0, 0x27BF, 0x27CF, 0x27EC, 0x27EF, 0x2B00, 0x2E7F, 0x2E9A, 0x2E9A, 0x2EF4, 0x2EFF, 0x2FD6, 0x2FEF, 0x2FFC, 0x2FFF, 0x3040, 0x3040, 0x3097, 0x3098, 0x3100, 0x3104, 0x312D, 0x3130, 0x318F, 0x318F, 0x31B8, 0x31EF, 0x321D, 0x321F, 0x3244, 0x3250, 0x327C, 0x327E, 0x32CC, 0x32CF, 0x32FF, 0x32FF, 0x3377, 0x337A, 0x33DE, 0x33DF, 0x33FF, 0x33FF, 0x4DB6, 0x4DFF, 0x9FA6, 0x9FFF, 0xA48D, 0xA48F, 0xA4C7, 0xABFF, 0xD7A4, 0xD7FF, 0xFA2E, 0xFA2F, 0xFA6B, 0xFAFF, 0xFB07, 0xFB12, 0xFB18, 0xFB1C, 0xFB37, 0xFB37, 0xFB3D, 0xFB3D, 0xFB3F, 0xFB3F, 0xFB42, 0xFB42, 0xFB45, 0xFB45, 0xFBB2, 0xFBD2, 0xFD40, 0xFD4F, 0xFD90, 0xFD91, 0xFDC8, 0xFDCF, 0xFDFD, 0xFDFF, 0xFE10, 0xFE1F, 0xFE24, 0xFE2F, 0xFE47, 0xFE48, 0xFE53, 0xFE53, 0xFE67, 0xFE67, 0xFE6C, 0xFE6F, 0xFE75, 0xFE75, 0xFEFD, 0xFEFE, 0xFF00, 0xFF00, 0xFFBF, 0xFFC1, 0xFFC8, 0xFFC9, 0xFFD0, 0xFFD1, 0xFFD8, 0xFFD9, 0xFFDD, 0xFFDF, 0xFFE7, 0xFFE7, 0xFFEF, 0xFFF8, 0x10000, 0x102FF, 0x1031F, 0x1031F, 0x10324, 0x1032F, 0x1034B, 0x103FF, 0x10426, 0x10427, 0x1044E, 0x1CFFF, 0x1D0F6, 0x1D0FF, 0x1D127, 0x1D129, 0x1D1DE, 0x1D3FF, 0x1D455, 0x1D455, 0x1D49D, 0x1D49D, 0x1D4A0, 0x1D4A1, 0x1D4A3, 0x1D4A4, 0x1D4A7, 0x1D4A8, 0x1D4AD, 0x1D4AD, 0x1D4BA, 0x1D4BA, 0x1D4BC, 0x1D4BC, 0x1D4C1, 0x1D4C1, 0x1D4C4, 0x1D4C4, 0x1D506, 0x1D506, 0x1D50B, 0x1D50C, 0x1D515, 0x1D515, 0x1D51D, 0x1D51D, 0x1D53A, 0x1D53A, 0x1D53F, 0x1D53F, 0x1D545, 0x1D545, 0x1D547, 0x1D549, 0x1D551, 0x1D551, 0x1D6A4, 0x1D6A7, 0x1D7CA, 0x1D7CD, 0x1D800, 0x1FFFD, 0x2A6D7, 0x2F7FF, 0x2FA1E, 0x2FFFD, 0x30000, 0x3FFFD, 0x40000, 0x4FFFD, 0x50000, 0x5FFFD, 0x60000, 0x6FFFD, 0x70000, 0x7FFFD, 0x80000, 0x8FFFD, 0x90000, 0x9FFFD, 0xA0000, 0xAFFFD, 0xB0000, 0xBFFFD, 0xC0000, 0xCFFFD, 0xD0000, 0xDFFFD, 0xE0000, 0xE0000, 0xE0002, 0xE001F, 0xE0080, 0xEFFFD}; /* * Table B.1 Commonly mapped to nothing * these are all of the characters that will be mapped to nothing. */ static const uint32_t commonly_mapped_to_nothing_ranges[] = {0x00AD, 0x00AD, 0x034F, 0x034F, 0x1806, 0x1806, 0x180B, 0x180D, 0x200B, 0x200D, 0x2060, 0x2060, 0xFE00, 0xFE0F, 0xFEFF, 0xFEFF}; /* * Table C.1.2 Non-ASCII space characters * these are all of the characters that will be mapped to the space character. * (0x0020) */ static const uint32_t non_ascii_space_character_ranges[] = { 0x00A0, 0x00A0, 0x1680, 0x1680, 0x2000, 0x200B, 0x202F, 0x202F, 0x205F, 0x205F, 0x3000, 0x3000}; /* * these are all of the characters that are "prohibited output" for SASLprep. * The tables that they come from are listed. */ static const uint32_t prohibited_output_ranges[] = { 0x0000, 0x001F, /* C.2.1 */ 0x007F, 0x00A0, /* C.1.2, C.2.1, C.2.2 */ 0x0340, 0x0341, /* C.8 */ 0x06DD, 0x06DD, /* C.2.2 */ 0x070F, 0x070F, /* C.2.2 */ 0x1680, 0x1680, /* C.1.2 */ 0x180E, 0x180E, /* C.2.2 */ 0x2000, 0x200F, /* C.1.2, C.2.2, C.8 */ 0x2028, 0x202F, /* C.1.2, C.2.2, C.8 */ 0x205F, 0x2063, /* C.1.2, C.2.2 */ 0x206A, 0x206F, /* C.2.2, C.8 */ 0x2FF0, 0x2FFB, /* C.7 */ 0x3000, 0x3000, /* C.1.2 */ 0xD800, 0xF8FF, /* C.3, C.5 */ 0xFDD0, 0xFDEF, /* C.4 */ 0xFEFF, 0xFEFF, /* C.2.2 */ 0xFFF9, 0xFFFF, /* C.2.2, C.4, C.6 */ 0x1D173, 0x1D17A, /* C.2.2 */ 0x1FFFE, 0x1FFFF, /* C.4 */ 0x2FFFE, 0x2FFFF, /* C.4 */ 0x3FFFE, 0x3FFFF, /* C.4 */ 0x4FFFE, 0x4FFFF, /* C.4 */ 0x5FFFE, 0x5FFFF, /* C.4 */ 0x6FFFE, 0x6FFFF, /* C.4 */ 0x7FFFE, 0x7FFFF, /* C.4 */ 0x8FFFE, 0x8FFFF, /* C.4 */ 0x9FFFE, 0x9FFFF, /* C.4 */ 0xAFFFE, 0xAFFFF, /* C.4 */ 0xBFFFE, 0xBFFFF, /* C.4 */ 0xCFFFE, 0xCFFFF, /* C.4 */ 0xDFFFE, 0xDFFFF, /* C.4 */ 0xE0001, 0xE0001, /* C.9 */ 0xE0020, 0xE007F, /* C.9 */ 0xEFFFE, 0xEFFFF, /* C.4 */ 0xF0000, 0xFFFFF, /* C.3, C.4 */ 0x100000, 0x10FFFF /* C.3, C.4 */ }; /* D.1 Characters with bidirectional property "R" or "AL" * any string that contains one of these characters cannot contain a character * with bidirectional property "L". */ static const uint32_t RandALCat_bidi_ranges[] = { 0x05BE, 0x05BE, 0x05C0, 0x05C0, 0x05C3, 0x05C3, 0x05D0, 0x05EA, 0x05F0, 0x05F4, 0x061B, 0x061B, 0x061F, 0x061F, 0x0621, 0x063A, 0x0640, 0x064A, 0x066D, 0x066F, 0x0671, 0x06D5, 0x06DD, 0x06DD, 0x06E5, 0x06E6, 0x06FA, 0x06FE, 0x0700, 0x070D, 0x0710, 0x0710, 0x0712, 0x072C, 0x0780, 0x07A5, 0x07B1, 0x07B1, 0x200F, 0x200F, 0xFB1D, 0xFB1D, 0xFB1F, 0xFB28, 0xFB2A, 0xFB36, 0xFB38, 0xFB3C, 0xFB3E, 0xFB3E, 0xFB40, 0xFB41, 0xFB43, 0xFB44, 0xFB46, 0xFBB1, 0xFBD3, 0xFD3D, 0xFD50, 0xFD8F, 0xFD92, 0xFDC7, 0xFDF0, 0xFDFC, 0xFE70, 0xFE74, 0xFE76, 0xFEFC}; /* D.2 Characters with bidirectional property "L" * any string that contains one of these characters cannot contain a character * with bidirectional property "R" or "AL". * */ static const uint32_t LCat_bidi_ranges[] = { 0x0041, 0x005A, 0x0061, 0x007A, 0x00AA, 0x00AA, 0x00B5, 0x00B5, 0x00BA, 0x00BA, 0x00C0, 0x00D6, 0x00D8, 0x00F6, 0x00F8, 0x0220, 0x0222, 0x0233, 0x0250, 0x02AD, 0x02B0, 0x02B8, 0x02BB, 0x02C1, 0x02D0, 0x02D1, 0x02E0, 0x02E4, 0x02EE, 0x02EE, 0x037A, 0x037A, 0x0386, 0x0386, 0x0388, 0x038A, 0x038C, 0x038C, 0x038E, 0x03A1, 0x03A3, 0x03CE, 0x03D0, 0x03F5, 0x0400, 0x0482, 0x048A, 0x04CE, 0x04D0, 0x04F5, 0x04F8, 0x04F9, 0x0500, 0x050F, 0x0531, 0x0556, 0x0559, 0x055F, 0x0561, 0x0587, 0x0589, 0x0589, 0x0903, 0x0903, 0x0905, 0x0939, 0x093D, 0x0940, 0x0949, 0x094C, 0x0950, 0x0950, 0x0958, 0x0961, 0x0964, 0x0970, 0x0982, 0x0983, 0x0985, 0x098C, 0x098F, 0x0990, 0x0993, 0x09A8, 0x09AA, 0x09B0, 0x09B2, 0x09B2, 0x09B6, 0x09B9, 0x09BE, 0x09C0, 0x09C7, 0x09C8, 0x09CB, 0x09CC, 0x09D7, 0x09D7, 0x09DC, 0x09DD, 0x09DF, 0x09E1, 0x09E6, 0x09F1, 0x09F4, 0x09FA, 0x0A05, 0x0A0A, 0x0A0F, 0x0A10, 0x0A13, 0x0A28, 0x0A2A, 0x0A30, 0x0A32, 0x0A33, 0x0A35, 0x0A36, 0x0A38, 0x0A39, 0x0A3E, 0x0A40, 0x0A59, 0x0A5C, 0x0A5E, 0x0A5E, 0x0A66, 0x0A6F, 0x0A72, 0x0A74, 0x0A83, 0x0A83, 0x0A85, 0x0A8B, 0x0A8D, 0x0A8D, 0x0A8F, 0x0A91, 0x0A93, 0x0AA8, 0x0AAA, 0x0AB0, 0x0AB2, 0x0AB3, 0x0AB5, 0x0AB9, 0x0ABD, 0x0AC0, 0x0AC9, 0x0AC9, 0x0ACB, 0x0ACC, 0x0AD0, 0x0AD0, 0x0AE0, 0x0AE0, 0x0AE6, 0x0AEF, 0x0B02, 0x0B03, 0x0B05, 0x0B0C, 0x0B0F, 0x0B10, 0x0B13, 0x0B28, 0x0B2A, 0x0B30, 0x0B32, 0x0B33, 0x0B36, 0x0B39, 0x0B3D, 0x0B3E, 0x0B40, 0x0B40, 0x0B47, 0x0B48, 0x0B4B, 0x0B4C, 0x0B57, 0x0B57, 0x0B5C, 0x0B5D, 0x0B5F, 0x0B61, 0x0B66, 0x0B70, 0x0B83, 0x0B83, 0x0B85, 0x0B8A, 0x0B8E, 0x0B90, 0x0B92, 0x0B95, 0x0B99, 0x0B9A, 0x0B9C, 0x0B9C, 0x0B9E, 0x0B9F, 0x0BA3, 0x0BA4, 0x0BA8, 0x0BAA, 0x0BAE, 0x0BB5, 0x0BB7, 0x0BB9, 0x0BBE, 0x0BBF, 0x0BC1, 0x0BC2, 0x0BC6, 0x0BC8, 0x0BCA, 0x0BCC, 0x0BD7, 0x0BD7, 0x0BE7, 0x0BF2, 0x0C01, 0x0C03, 0x0C05, 0x0C0C, 0x0C0E, 0x0C10, 0x0C12, 0x0C28, 0x0C2A, 0x0C33, 0x0C35, 0x0C39, 0x0C41, 0x0C44, 0x0C60, 0x0C61, 0x0C66, 0x0C6F, 0x0C82, 0x0C83, 0x0C85, 0x0C8C, 0x0C8E, 0x0C90, 0x0C92, 0x0CA8, 0x0CAA, 0x0CB3, 0x0CB5, 0x0CB9, 0x0CBE, 0x0CBE, 0x0CC0, 0x0CC4, 0x0CC7, 0x0CC8, 0x0CCA, 0x0CCB, 0x0CD5, 0x0CD6, 0x0CDE, 0x0CDE, 0x0CE0, 0x0CE1, 0x0CE6, 0x0CEF, 0x0D02, 0x0D03, 0x0D05, 0x0D0C, 0x0D0E, 0x0D10, 0x0D12, 0x0D28, 0x0D2A, 0x0D39, 0x0D3E, 0x0D40, 0x0D46, 0x0D48, 0x0D4A, 0x0D4C, 0x0D57, 0x0D57, 0x0D60, 0x0D61, 0x0D66, 0x0D6F, 0x0D82, 0x0D83, 0x0D85, 0x0D96, 0x0D9A, 0x0DB1, 0x0DB3, 0x0DBB, 0x0DBD, 0x0DBD, 0x0DC0, 0x0DC6, 0x0DCF, 0x0DD1, 0x0DD8, 0x0DDF, 0x0DF2, 0x0DF4, 0x0E01, 0x0E30, 0x0E32, 0x0E33, 0x0E40, 0x0E46, 0x0E4F, 0x0E5B, 0x0E81, 0x0E82, 0x0E84, 0x0E84, 0x0E87, 0x0E88, 0x0E8A, 0x0E8A, 0x0E8D, 0x0E8D, 0x0E94, 0x0E97, 0x0E99, 0x0E9F, 0x0EA1, 0x0EA3, 0x0EA5, 0x0EA5, 0x0EA7, 0x0EA7, 0x0EAA, 0x0EAB, 0x0EAD, 0x0EB0, 0x0EB2, 0x0EB3, 0x0EBD, 0x0EBD, 0x0EC0, 0x0EC4, 0x0EC6, 0x0EC6, 0x0ED0, 0x0ED9, 0x0EDC, 0x0EDD, 0x0F00, 0x0F17, 0x0F1A, 0x0F34, 0x0F36, 0x0F36, 0x0F38, 0x0F38, 0x0F3E, 0x0F47, 0x0F49, 0x0F6A, 0x0F7F, 0x0F7F, 0x0F85, 0x0F85, 0x0F88, 0x0F8B, 0x0FBE, 0x0FC5, 0x0FC7, 0x0FCC, 0x0FCF, 0x0FCF, 0x1000, 0x1021, 0x1023, 0x1027, 0x1029, 0x102A, 0x102C, 0x102C, 0x1031, 0x1031, 0x1038, 0x1038, 0x1040, 0x1057, 0x10A0, 0x10C5, 0x10D0, 0x10F8, 0x10FB, 0x10FB, 0x1100, 0x1159, 0x115F, 0x11A2, 0x11A8, 0x11F9, 0x1200, 0x1206, 0x1208, 0x1246, 0x1248, 0x1248, 0x124A, 0x124D, 0x1250, 0x1256, 0x1258, 0x1258, 0x125A, 0x125D, 0x1260, 0x1286, 0x1288, 0x1288, 0x128A, 0x128D, 0x1290, 0x12AE, 0x12B0, 0x12B0, 0x12B2, 0x12B5, 0x12B8, 0x12BE, 0x12C0, 0x12C0, 0x12C2, 0x12C5, 0x12C8, 0x12CE, 0x12D0, 0x12D6, 0x12D8, 0x12EE, 0x12F0, 0x130E, 0x1310, 0x1310, 0x1312, 0x1315, 0x1318, 0x131E, 0x1320, 0x1346, 0x1348, 0x135A, 0x1361, 0x137C, 0x13A0, 0x13F4, 0x1401, 0x1676, 0x1681, 0x169A, 0x16A0, 0x16F0, 0x1700, 0x170C, 0x170E, 0x1711, 0x1720, 0x1731, 0x1735, 0x1736, 0x1740, 0x1751, 0x1760, 0x176C, 0x176E, 0x1770, 0x1780, 0x17B6, 0x17BE, 0x17C5, 0x17C7, 0x17C8, 0x17D4, 0x17DA, 0x17DC, 0x17DC, 0x17E0, 0x17E9, 0x1810, 0x1819, 0x1820, 0x1877, 0x1880, 0x18A8, 0x1E00, 0x1E9B, 0x1EA0, 0x1EF9, 0x1F00, 0x1F15, 0x1F18, 0x1F1D, 0x1F20, 0x1F45, 0x1F48, 0x1F4D, 0x1F50, 0x1F57, 0x1F59, 0x1F59, 0x1F5B, 0x1F5B, 0x1F5D, 0x1F5D, 0x1F5F, 0x1F7D, 0x1F80, 0x1FB4, 0x1FB6, 0x1FBC, 0x1FBE, 0x1FBE, 0x1FC2, 0x1FC4, 0x1FC6, 0x1FCC, 0x1FD0, 0x1FD3, 0x1FD6, 0x1FDB, 0x1FE0, 0x1FEC, 0x1FF2, 0x1FF4, 0x1FF6, 0x1FFC, 0x200E, 0x200E, 0x2071, 0x2071, 0x207F, 0x207F, 0x2102, 0x2102, 0x2107, 0x2107, 0x210A, 0x2113, 0x2115, 0x2115, 0x2119, 0x211D, 0x2124, 0x2124, 0x2126, 0x2126, 0x2128, 0x2128, 0x212A, 0x212D, 0x212F, 0x2131, 0x2133, 0x2139, 0x213D, 0x213F, 0x2145, 0x2149, 0x2160, 0x2183, 0x2336, 0x237A, 0x2395, 0x2395, 0x249C, 0x24E9, 0x3005, 0x3007, 0x3021, 0x3029, 0x3031, 0x3035, 0x3038, 0x303C, 0x3041, 0x3096, 0x309D, 0x309F, 0x30A1, 0x30FA, 0x30FC, 0x30FF, 0x3105, 0x312C, 0x3131, 0x318E, 0x3190, 0x31B7, 0x31F0, 0x321C, 0x3220, 0x3243, 0x3260, 0x327B, 0x327F, 0x32B0, 0x32C0, 0x32CB, 0x32D0, 0x32FE, 0x3300, 0x3376, 0x337B, 0x33DD, 0x33E0, 0x33FE, 0x3400, 0x4DB5, 0x4E00, 0x9FA5, 0xA000, 0xA48C, 0xAC00, 0xD7A3, 0xD800, 0xFA2D, 0xFA30, 0xFA6A, 0xFB00, 0xFB06, 0xFB13, 0xFB17, 0xFF21, 0xFF3A, 0xFF41, 0xFF5A, 0xFF66, 0xFFBE, 0xFFC2, 0xFFC7, 0xFFCA, 0xFFCF, 0xFFD2, 0xFFD7, 0xFFDA, 0xFFDC, 0x10300, 0x1031E, 0x10320, 0x10323, 0x10330, 0x1034A, 0x10400, 0x10425, 0x10428, 0x1044D, 0x1D000, 0x1D0F5, 0x1D100, 0x1D126, 0x1D12A, 0x1D166, 0x1D16A, 0x1D172, 0x1D183, 0x1D184, 0x1D18C, 0x1D1A9, 0x1D1AE, 0x1D1DD, 0x1D400, 0x1D454, 0x1D456, 0x1D49C, 0x1D49E, 0x1D49F, 0x1D4A2, 0x1D4A2, 0x1D4A5, 0x1D4A6, 0x1D4A9, 0x1D4AC, 0x1D4AE, 0x1D4B9, 0x1D4BB, 0x1D4BB, 0x1D4BD, 0x1D4C0, 0x1D4C2, 0x1D4C3, 0x1D4C5, 0x1D505, 0x1D507, 0x1D50A, 0x1D50D, 0x1D514, 0x1D516, 0x1D51C, 0x1D51E, 0x1D539, 0x1D53B, 0x1D53E, 0x1D540, 0x1D544, 0x1D546, 0x1D546, 0x1D54A, 0x1D550, 0x1D552, 0x1D6A3, 0x1D6A8, 0x1D7C9, 0x20000, 0x2A6D6, 0x2F800, 0x2FA1D, 0xF0000, 0xFFFFD, 0x100000, 0x10FFFD}; BSON_END_DECLS #endif /* MONGOC_SCRAM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-scram.c000066400000000000000000001263741511661753600237360ustar00rootroot00000000000000/* Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_CRYPTO #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct _mongoc_scram_cache_entry_t { /* book keeping */ bool taken; /* pre-secrets */ char hashed_password[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t decoded_salt[MONGOC_SCRAM_B64_HASH_MAX_SIZE]; uint32_t iterations; /* secrets */ uint8_t client_key[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t server_key[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t salted_password[MONGOC_SCRAM_HASH_MAX_SIZE]; } mongoc_scram_cache_entry_t; #define MONGOC_SCRAM_SERVER_KEY "Server Key" #define MONGOC_SCRAM_CLIENT_KEY "Client Key" /* returns true if the first UTF-8 code point in `s` is valid. */ bool _mongoc_utf8_first_code_point_is_valid(const char *c, size_t length); /* returns whether a character is between two limits (inclusive). */ bool _mongoc_utf8_code_unit_in_range(const uint8_t c, const uint8_t lower, const uint8_t upper); /* returns whether a codepoint exists in the specified table. The table format * is that the 2*n element is the lower bound and the 2*n + 1 is the upper bound * (both inclusive). */ bool _mongoc_utf8_code_point_is_in_table(uint32_t code, const uint32_t *table, size_t size); /* returns the byte length of the UTF-8 code point. Returns -1 if `c` is not a * valid UTF-8 code point. */ ssize_t _mongoc_utf8_code_point_length(uint32_t c); /* converts a Unicode code point to UTF-8 character. Returns how many bytes the * character converted is. Returns -1 if the code point is invalid. * char *out must be large enough to contain all of the code units written to * it. */ ssize_t _mongoc_utf8_code_point_to_str(uint32_t c, char *out); static bson_shared_mutex_t g_scram_cache_rwlock; static bson_once_t init_cache_once_control = BSON_ONCE_INIT; static bson_mutex_t clear_cache_lock; /* * Cache lookups are a linear search through this table. This table is a * constant size, which is small enough that lookup cost is insignificant. * * This can be refactored into a hashmap if the cache size needs to grow larger * in the future, but a linear lookup is currently fast enough and is much * simpler logic to reason about. */ static mongoc_scram_cache_entry_t g_scram_cache[MONGOC_SCRAM_CACHE_SIZE]; static void _mongoc_scram_cache_clear(void) { bson_mutex_lock(&clear_cache_lock); memset(g_scram_cache, 0, sizeof(g_scram_cache)); bson_mutex_unlock(&clear_cache_lock); } static BSON_ONCE_FUN(_mongoc_scram_cache_init) { bson_shared_mutex_init(&g_scram_cache_rwlock); bson_mutex_init(&clear_cache_lock); _mongoc_scram_cache_clear(); BSON_ONCE_RETURN; } static void _mongoc_scram_cache_init_once(void) { bson_once(&init_cache_once_control, _mongoc_scram_cache_init); } static int _scram_hash_size(mongoc_scram_t *scram) { if (scram->crypto.algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_1) { return MONGOC_SCRAM_SHA_1_HASH_SIZE; } else if (scram->crypto.algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_256) { return MONGOC_SCRAM_SHA_256_HASH_SIZE; } else { BSON_UNREACHABLE("Unexpected crypto algorithm"); } } /* Copies the cache's secrets to scram */ static void _mongoc_scram_cache_apply_secrets(mongoc_scram_cache_entry_t *cache, mongoc_scram_t *scram) { BSON_ASSERT(cache); BSON_ASSERT(scram); memcpy(scram->client_key, cache->client_key, sizeof(scram->client_key)); memcpy(scram->server_key, cache->server_key, sizeof(scram->server_key)); memcpy(scram->salted_password, cache->salted_password, sizeof(scram->salted_password)); } void _mongoc_scram_cache_destroy(mongoc_scram_cache_entry_t *cache) { BSON_ASSERT(cache); bson_free(cache); } /* * Checks whether the cache contains scram's pre-secrets. * Populate `cache` with the values found in the global cache if found. */ static bool _mongoc_scram_cache_has_presecrets(mongoc_scram_cache_entry_t *cache /* out */, const mongoc_scram_t *scram) { bool cache_hit = false; BSON_ASSERT(cache); BSON_ASSERT(scram); _mongoc_scram_cache_init_once(); /* * - Take a read lock * - Search through g_scram_cache if the hashed_password, decoded_salt, and * iterations match an entry. * - If so, then return true * - Otherwise return false */ bson_shared_mutex_lock_shared(&g_scram_cache_rwlock); for (size_t i = 0; i < MONGOC_SCRAM_CACHE_SIZE; i++) { if (g_scram_cache[i].taken) { mongoc_scram_cache_entry_t *cache_entry = &g_scram_cache[i]; cache_hit = !strcmp(cache_entry->hashed_password, scram->hashed_password) && cache_entry->iterations == scram->iterations && !memcmp(cache_entry->decoded_salt, scram->decoded_salt, sizeof(cache_entry->decoded_salt)); if (cache_hit) { /* copy the found cache items into the 'cache' output parameter */ memcpy(cache->client_key, cache_entry->client_key, sizeof(cache->client_key)); memcpy(cache->server_key, cache_entry->server_key, sizeof(cache->server_key)); memcpy(cache->salted_password, cache_entry->salted_password, sizeof(cache->salted_password)); goto done; } } } done: bson_shared_mutex_unlock_shared(&g_scram_cache_rwlock); return cache_hit; } void _mongoc_scram_set_pass(mongoc_scram_t *scram, const char *pass) { BSON_ASSERT(scram); if (scram->pass) { bson_zero_free(scram->pass, strlen(scram->pass)); } scram->pass = pass ? bson_strdup(pass) : NULL; } void _mongoc_scram_set_user(mongoc_scram_t *scram, const char *user) { BSON_ASSERT(scram); bson_free(scram->user); scram->user = user ? bson_strdup(user) : NULL; } void _mongoc_scram_init(mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo) { BSON_ASSERT(scram); memset(scram, 0, sizeof *scram); mongoc_crypto_init(&scram->crypto, algo); } void _mongoc_scram_destroy(mongoc_scram_t *scram) { BSON_ASSERT(scram); bson_free(scram->user); if (scram->pass) { bson_zero_free(scram->pass, strlen(scram->pass)); } memset(scram->hashed_password, 0, sizeof(scram->hashed_password)); bson_free(scram->auth_message); memset(scram, 0, sizeof *scram); } static void _mongoc_scram_cache_insert(const mongoc_scram_t *scram) { bson_shared_mutex_lock(&g_scram_cache_rwlock); again: for (size_t i = 0; i < MONGOC_SCRAM_CACHE_SIZE; i++) { mongoc_scram_cache_entry_t *cache_entry = &g_scram_cache[i]; bool already_exists = !strcmp(cache_entry->hashed_password, scram->hashed_password) && cache_entry->iterations == scram->iterations && !memcmp(cache_entry->decoded_salt, scram->decoded_salt, sizeof(cache_entry->decoded_salt)) && !memcmp(cache_entry->client_key, scram->client_key, sizeof(cache_entry->client_key)) && !memcmp(cache_entry->server_key, scram->server_key, sizeof(cache_entry->server_key)) && !memcmp(cache_entry->salted_password, scram->salted_password, sizeof(cache_entry->salted_password)); if (already_exists) { /* cache entry already populated between read and write lock * acquisition, skipping */ break; } if (!cache_entry->taken) { /* found an empty slot */ memcpy(cache_entry->client_key, scram->client_key, sizeof(cache_entry->client_key)); memcpy(cache_entry->server_key, scram->server_key, sizeof(cache_entry->server_key)); memcpy(cache_entry->salted_password, scram->salted_password, sizeof(cache_entry->salted_password)); memcpy(cache_entry->decoded_salt, scram->decoded_salt, sizeof(cache_entry->decoded_salt)); memcpy(cache_entry->hashed_password, scram->hashed_password, sizeof(cache_entry->hashed_password)); cache_entry->iterations = scram->iterations; cache_entry->taken = true; break; } /* if cache is full, then invalidate the cache and insert again */ if (i == (MONGOC_SCRAM_CACHE_SIZE - 1)) { _mongoc_scram_cache_clear(); goto again; } } bson_shared_mutex_unlock(&g_scram_cache_rwlock); } /* Updates the cache with scram's last-used pre-secrets and secrets */ static void _mongoc_scram_update_cache(const mongoc_scram_t *scram) { mongoc_scram_cache_entry_t cache; bool found = _mongoc_scram_cache_has_presecrets(&cache, scram); if (!found) { /* cache miss, insert this as a new cache entry */ _mongoc_scram_cache_insert(scram); } } static bool _mongoc_scram_buf_write(const char *src, int32_t src_len, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen) { if (src_len < 0) { src_len = (int32_t)strlen(src); } if (*outbuflen + src_len >= outbufmax) { return false; } memcpy(outbuf + *outbuflen, src, src_len); *outbuflen += src_len; return true; } /* generate client-first-message: * n,a=authzid,n=encoded-username,r=client-nonce * * note that a= is optional, so we aren't dealing with that here */ static bool _mongoc_scram_start( mongoc_scram_t *scram, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen, bson_error_t *error) { uint8_t nonce[24]; const char *ptr; bool rval = true; BSON_ASSERT(scram); BSON_ASSERT(outbuf); BSON_ASSERT(outbufmax); BSON_ASSERT(outbuflen); if (!scram->user) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: username is not set"); goto FAIL; } if (!scram->pass) { // Apply an empty string as a default. scram->pass = bson_strdup(""); } /* auth message is as big as the outbuf just because */ scram->auth_message = (uint8_t *)bson_malloc(outbufmax); scram->auth_messagemax = outbufmax; /* the server uses a 24 byte random nonce. so we do as well */ if (1 != _mongoc_rand_bytes(nonce, sizeof(nonce))) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not generate a cryptographically " "secure nonce in sasl step 1"); goto FAIL; } scram->encoded_nonce_len = mcommon_b64_ntop(nonce, sizeof(nonce), scram->encoded_nonce, sizeof(scram->encoded_nonce)); if (-1 == scram->encoded_nonce_len) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not encode nonce"); goto FAIL; } if (!_mongoc_scram_buf_write("n,,n=", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } for (ptr = scram->user; *ptr; ptr++) { /* RFC 5802 specifies that ',' and '=' and encoded as '=2C' and '=3D' * respectively in the user name */ switch (*ptr) { case ',': if (!_mongoc_scram_buf_write("=2C", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } break; case '=': if (!_mongoc_scram_buf_write("=3D", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } break; default: if (!_mongoc_scram_buf_write(ptr, 1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } break; } } if (!_mongoc_scram_buf_write(",r=", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } if (!_mongoc_scram_buf_write(scram->encoded_nonce, scram->encoded_nonce_len, outbuf, outbufmax, outbuflen)) { goto BUFFER; } /* we have to keep track of the conversation to create a client proof later * on. This copies the message we're crafting from the 'n=' portion onwards * into a buffer we're managing */ if (!_mongoc_scram_buf_write( (char *)outbuf + 3, *outbuflen - 3, scram->auth_message, scram->auth_messagemax, &scram->auth_messagelen)) { goto BUFFER_AUTH; } if (!_mongoc_scram_buf_write(",", -1, scram->auth_message, scram->auth_messagemax, &scram->auth_messagelen)) { goto BUFFER_AUTH; } goto CLEANUP; BUFFER_AUTH: _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not buffer auth message in sasl step1"); goto FAIL; BUFFER: _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not buffer sasl step1"); goto FAIL; FAIL: rval = false; CLEANUP: return rval; } /* Compute the SCRAM step Hi() as defined in RFC5802 */ static bool _mongoc_scram_salt_password(mongoc_scram_t *scram, const char *password, uint32_t password_len, const uint8_t *salt, uint32_t salt_len, uint32_t iterations) { return mongoc_crypto_pbkdf(&scram->crypto, password, password_len, salt, salt_len, iterations, MONGOC_SCRAM_HASH_MAX_SIZE, (unsigned char *)scram->salted_password); } static bool _mongoc_scram_generate_client_proof(mongoc_scram_t *scram, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen) { uint8_t stored_key[MONGOC_SCRAM_HASH_MAX_SIZE]; uint8_t client_signature[MONGOC_SCRAM_HASH_MAX_SIZE]; unsigned char client_proof[MONGOC_SCRAM_HASH_MAX_SIZE]; int i; int r = 0; if (!*scram->client_key) { /* ClientKey := HMAC(saltedPassword, "Client Key") */ mongoc_crypto_hmac(&scram->crypto, scram->salted_password, _scram_hash_size(scram), (uint8_t *)MONGOC_SCRAM_CLIENT_KEY, (int)strlen(MONGOC_SCRAM_CLIENT_KEY), scram->client_key); } /* StoredKey := H(client_key) */ mongoc_crypto_hash(&scram->crypto, scram->client_key, (size_t)_scram_hash_size(scram), stored_key); /* ClientSignature := HMAC(StoredKey, AuthMessage) */ mongoc_crypto_hmac(&scram->crypto, stored_key, _scram_hash_size(scram), scram->auth_message, scram->auth_messagelen, client_signature); /* ClientProof := ClientKey XOR ClientSignature */ for (i = 0; i < _scram_hash_size(scram); i++) { client_proof[i] = scram->client_key[i] ^ client_signature[i]; } r = mcommon_b64_ntop(client_proof, _scram_hash_size(scram), (char *)outbuf + *outbuflen, outbufmax - *outbuflen); if (-1 == r) { return false; } *outbuflen += r; return true; } /* Parse server-first-message of the form: * r=client-nonce|server-nonce,s=user-salt,i=iteration-count * * Generate client-final-message of the form: * c=channel-binding(base64),r=client-nonce|server-nonce,p=client-proof */ static bool _mongoc_scram_step2(mongoc_scram_t *scram, const uint8_t *inbuf, uint32_t inbuflen, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen, bson_error_t *error) { uint8_t *val_r = NULL; uint32_t val_r_len = 0u; uint8_t *val_s = NULL; uint32_t val_s_len = 0u; uint8_t *val_i = NULL; uint32_t val_i_len = 0u; uint8_t **current_val = NULL; uint32_t *current_val_len = NULL; char *tmp = NULL; char *hashed_password = NULL; uint8_t decoded_salt[MONGOC_SCRAM_B64_HASH_MAX_SIZE] = {0}; int32_t decoded_salt_len = 0; /* the decoded salt leaves four trailing bytes to add the int32 0x00000001 */ const int32_t expected_salt_length = _scram_hash_size(scram) - 4; bool rval = true; int iterations = 0; BSON_ASSERT(scram); BSON_ASSERT(outbuf); BSON_ASSERT(outbufmax); BSON_ASSERT(outbuflen); if (scram->crypto.algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_1) { /* Auth spec for SCRAM-SHA-1: "The password variable MUST be the mongodb * hashed variant. The mongo hashed variant is computed as hash = HEX( * MD5( UTF8( username + ':mongo:' + plain_text_password )))" */ tmp = bson_strdup_printf("%s:mongo:%s", scram->user, scram->pass); hashed_password = _mongoc_hex_md5(tmp); BSON_ASSERT(hashed_password); bson_zero_free(tmp, strlen(tmp)); } else if (scram->crypto.algorithm == MONGOC_CRYPTO_ALGORITHM_SHA_256) { /* Auth spec for SCRAM-SHA-256: "Passwords MUST be prepared with SASLprep, * per RFC 5802. Passwords are used directly for key derivation; they * MUST NOT be digested as they are in SCRAM-SHA-1." */ hashed_password = _mongoc_sasl_prep(scram->pass, error); if (!hashed_password) { goto FAIL; } } else { BSON_ASSERT(false); } /* we need all of the incoming message for the final client proof */ if (!_mongoc_scram_buf_write( (char *)inbuf, inbuflen, scram->auth_message, scram->auth_messagemax, &scram->auth_messagelen)) { goto BUFFER_AUTH; } if (!_mongoc_scram_buf_write(",", -1, scram->auth_message, scram->auth_messagemax, &scram->auth_messagelen)) { goto BUFFER_AUTH; } for (const uint8_t *ptr = inbuf; ptr < inbuf + inbuflen;) { switch (*ptr) { case 'r': current_val = &val_r; current_val_len = &val_r_len; break; case 's': current_val = &val_s; current_val_len = &val_s_len; break; case 'i': current_val = &val_i; current_val_len = &val_i_len; break; default: _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: unknown key (%c) in sasl step 2", *ptr); goto FAIL; } ptr++; if (*ptr != '=') { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: invalid parse state in sasl step 2"); goto FAIL; } ptr++; const uint8_t *const next_comma = (const uint8_t *)memchr(ptr, ',', (inbuf + inbuflen) - ptr); if (next_comma) { *current_val_len = (uint32_t)(next_comma - ptr); } else { *current_val_len = (uint32_t)((inbuf + inbuflen) - ptr); } *current_val = (uint8_t *)bson_malloc(*current_val_len + 1); memcpy(*current_val, ptr, *current_val_len); (*current_val)[*current_val_len] = '\0'; if (next_comma) { ptr = next_comma + 1; } else { break; } } if (!val_r) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: no r param in sasl step 2"); goto FAIL; } if (!val_s) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: no s param in sasl step 2"); goto FAIL; } if (!val_i) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: no i param in sasl step 2"); goto FAIL; } /* verify our nonce */ if (mlib_cmp(val_r_len, <, scram->encoded_nonce_len) || mongoc_memcmp(val_r, scram->encoded_nonce, scram->encoded_nonce_len)) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: client nonce not repeated in sasl step 2"); } *outbuflen = 0; if (!_mongoc_scram_buf_write("c=biws,r=", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } if (!_mongoc_scram_buf_write((char *)val_r, val_r_len, outbuf, outbufmax, outbuflen)) { goto BUFFER; } if (!_mongoc_scram_buf_write( (char *)outbuf, *outbuflen, scram->auth_message, scram->auth_messagemax, &scram->auth_messagelen)) { goto BUFFER_AUTH; } if (!_mongoc_scram_buf_write(",p=", -1, outbuf, outbufmax, outbuflen)) { goto BUFFER; } decoded_salt_len = mcommon_b64_pton((char *)val_s, decoded_salt, sizeof(decoded_salt)); if (-1 == decoded_salt_len) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: unable to decode salt in sasl step2"); goto FAIL; } if (expected_salt_length != decoded_salt_len) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: invalid salt length of %d in sasl step2", decoded_salt_len); goto FAIL; } iterations = (int)bson_ascii_strtoll((char *)val_i, &tmp, 10); /* tmp holds the location of the failed to parse character. So if it's * null, we got to the end of the string and didn't have a parse error */ if (*tmp) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: unable to parse iterations in sasl step2"); goto FAIL; } if (iterations < 0) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: iterations is negative in sasl step2"); goto FAIL; } /* drivers MUST enforce a minimum iteration count of 4096 and MUST error if * the authentication conversation specifies a lower count. This mitigates * downgrade attacks by a man-in-the-middle attacker. */ if (iterations < 4096) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: iterations must be at least 4096"); goto FAIL; } /* Save the presecrets for caching */ bson_strncpy(scram->hashed_password, hashed_password, sizeof(scram->hashed_password)); scram->iterations = iterations; memcpy(scram->decoded_salt, decoded_salt, sizeof(scram->decoded_salt)); mongoc_scram_cache_entry_t cache; if (_mongoc_scram_cache_has_presecrets(&cache, scram)) { _mongoc_scram_cache_apply_secrets(&cache, scram); } if (!*scram->salted_password && !_mongoc_scram_salt_password(scram, hashed_password, (uint32_t)strlen(hashed_password), decoded_salt, decoded_salt_len, (uint32_t)iterations)) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: failed to salt password"); goto FAIL; } _mongoc_scram_generate_client_proof(scram, outbuf, outbufmax, outbuflen); goto CLEANUP; BUFFER_AUTH: _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not buffer auth message in sasl step2"); goto FAIL; BUFFER: _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not buffer sasl step2"); goto FAIL; FAIL: rval = false; CLEANUP: bson_free(val_r); bson_free(val_s); bson_free(val_i); if (hashed_password) { bson_zero_free(hashed_password, strlen(hashed_password)); } return rval; } static bool _mongoc_scram_verify_server_signature(mongoc_scram_t *scram, uint8_t *verification, uint32_t len) { char encoded_server_signature[MONGOC_SCRAM_B64_HASH_MAX_SIZE]; int32_t encoded_server_signature_len; uint8_t server_signature[MONGOC_SCRAM_HASH_MAX_SIZE]; if (!*scram->server_key) { const size_t key_len = strlen(MONGOC_SCRAM_SERVER_KEY); BSON_ASSERT(mlib_in_range(int, key_len)); /* ServerKey := HMAC(SaltedPassword, "Server Key") */ mongoc_crypto_hmac(&scram->crypto, scram->salted_password, _scram_hash_size(scram), (uint8_t *)MONGOC_SCRAM_SERVER_KEY, (int)key_len, scram->server_key); } /* ServerSignature := HMAC(ServerKey, AuthMessage) */ mongoc_crypto_hmac(&scram->crypto, scram->server_key, _scram_hash_size(scram), scram->auth_message, scram->auth_messagelen, server_signature); encoded_server_signature_len = mcommon_b64_ntop( server_signature, _scram_hash_size(scram), encoded_server_signature, sizeof(encoded_server_signature)); if (encoded_server_signature_len == -1) { return false; } return mlib_cmp(len, ==, encoded_server_signature_len) && (mongoc_memcmp(verification, encoded_server_signature, len) == 0); } static bool _mongoc_scram_step3(mongoc_scram_t *scram, const uint8_t *inbuf, uint32_t inbuflen, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen, bson_error_t *error) { uint8_t *val_e = NULL; uint32_t val_e_len = 0; uint8_t *val_v = NULL; uint32_t val_v_len = 0; uint8_t **current_val; uint32_t *current_val_len = 0; bool rval = true; BSON_ASSERT(scram); BSON_ASSERT(outbuf); BSON_ASSERT(outbufmax); BSON_ASSERT(outbuflen); for (const uint8_t *ptr = inbuf; ptr < inbuf + inbuflen;) { switch (*ptr) { case 'e': current_val = &val_e; current_val_len = &val_e_len; break; case 'v': current_val = &val_v; current_val_len = &val_v_len; break; default: _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: unknown key (%c) in sasl step 3", *ptr); goto FAIL; } ptr++; if (*ptr != '=') { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: invalid parse state in sasl step 3"); goto FAIL; } ptr++; const uint8_t *const next_comma = (const uint8_t *)memchr(ptr, ',', (inbuf + inbuflen) - ptr); if (next_comma) { *current_val_len = (uint32_t)(next_comma - ptr); } else { *current_val_len = (uint32_t)((inbuf + inbuflen) - ptr); } *current_val = (uint8_t *)bson_malloc(*current_val_len + 1); memcpy(*current_val, ptr, *current_val_len); (*current_val)[*current_val_len] = '\0'; if (next_comma) { ptr = next_comma + 1; } else { break; } } *outbuflen = 0; if (val_e) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: authentication failure in sasl step 3 : %s", val_e); goto FAIL; } if (!val_v) { _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: no v param in sasl step 3"); goto FAIL; } if (!_mongoc_scram_verify_server_signature(scram, val_v, val_v_len)) { _mongoc_set_error(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: could not verify server signature in sasl step 3"); goto FAIL; } /* Update the cache if authentication succeeds */ _mongoc_scram_update_cache(scram); goto CLEANUP; FAIL: rval = false; CLEANUP: bson_free(val_e); bson_free(val_v); return rval; } bool _mongoc_scram_step(mongoc_scram_t *scram, const uint8_t *inbuf, uint32_t inbuflen, uint8_t *outbuf, uint32_t outbufmax, uint32_t *outbuflen, bson_error_t *error) { BSON_ASSERT(scram); BSON_ASSERT(inbuf); BSON_ASSERT(outbuf); BSON_ASSERT(outbuflen); scram->step++; switch (scram->step) { case 1: return _mongoc_scram_start(scram, outbuf, outbufmax, outbuflen, error); case 2: return _mongoc_scram_step2(scram, inbuf, inbuflen, outbuf, outbufmax, outbuflen, error); case 3: return _mongoc_scram_step3(scram, inbuf, inbuflen, outbuf, outbufmax, outbuflen, error); default: _mongoc_set_error( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_NOT_DONE, "SCRAM Failure: maximum steps detected"); return false; } } bool _mongoc_sasl_prep_required(const char *str) { BSON_ASSERT_PARAM(str); unsigned char c; while (*str) { c = (unsigned char)*str; /* characters below 32 contain all of the control characters. * characters above 127 are multibyte UTF-8 characters. * character 127 is the DEL character. */ if (c < 32 || c >= 127) { return true; } str++; } return false; } char * _mongoc_sasl_prep_impl(const char *name, const char *in_utf8, bson_error_t *err) { BSON_ASSERT_PARAM(name); BSON_ASSERT_PARAM(in_utf8); uint32_t *utf8_codepoints; ssize_t num_chars; uint8_t *out_utf8; #define SASL_PREP_ERR_RETURN(msg) \ do { \ _mongoc_set_error(err, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, (msg), name); \ return NULL; \ } while (0) /* 1. convert str to Unicode codepoints. */ /* preflight to get the destination length. */ num_chars = _mongoc_utf8_string_length(in_utf8); if (num_chars == -1) { SASL_PREP_ERR_RETURN("could not calculate UTF-8 length of %s"); } /* convert to unicode. */ BSON_ASSERT(mlib_cmp(num_chars, <=, SIZE_MAX / sizeof(uint32_t) - 1)); utf8_codepoints = BSON_ARRAY_ALLOC(((size_t)num_chars + 1u), uint32_t); /* add one for trailing 0 value. */ const char *c = in_utf8; mlib_foreach_irange (i, num_chars) { const size_t utf8_char_length = _mongoc_utf8_char_length(c); utf8_codepoints[i] = _mongoc_utf8_get_first_code_point(c, utf8_char_length); c += utf8_char_length; } utf8_codepoints[num_chars] = '\0'; /* 2. perform SASLPREP */ // the steps below come directly from RFC 3454: 2. Preparation Overview. // a. Map - For each character in the input, check if it has a mapping (using // the tables) and, if so, replace it with its mapping. // because we will have to map some characters to nothing, we'll use two // pointers: one for reading the original characters (i) and one for writing // the new characters (curr). i will always be >= curr. size_t curr = 0; mlib_foreach_irange (i, num_chars) { if (_mongoc_utf8_code_point_is_in_table(utf8_codepoints[i], non_ascii_space_character_ranges, sizeof(non_ascii_space_character_ranges) / sizeof(uint32_t))) utf8_codepoints[curr++] = 0x0020; else if (_mongoc_utf8_code_point_is_in_table(utf8_codepoints[i], commonly_mapped_to_nothing_ranges, sizeof(commonly_mapped_to_nothing_ranges) / sizeof(uint32_t))) { // effectively skip over the character because we don't increment curr. } else utf8_codepoints[curr++] = utf8_codepoints[i]; } utf8_codepoints[curr] = '\0'; num_chars = curr; // b. Normalize - normalize the result of step `a` using Unicode // normalization. // this is an optional step for stringprep, but Unicode normalization with // form KC is required for SASLPrep. // in order to do this, we must first convert back to UTF-8. // preflight for length size_t utf8_pre_norm_len = 0; mlib_foreach_irange (i, num_chars) { const ssize_t len = _mongoc_utf8_code_point_length(utf8_codepoints[i]); if (len == -1) { bson_free(utf8_codepoints); SASL_PREP_ERR_RETURN("invalid Unicode code point in %s"); } else { utf8_pre_norm_len += len; } } char *utf8_pre_norm = BSON_ARRAY_ALLOC((utf8_pre_norm_len + 1), char); char *loc = utf8_pre_norm; mlib_foreach_irange (i, num_chars) { const ssize_t utf8_char_length = _mongoc_utf8_code_point_to_str(utf8_codepoints[i], loc); if (utf8_char_length == -1) { bson_free(utf8_pre_norm); bson_free(utf8_codepoints); SASL_PREP_ERR_RETURN("invalid Unicode code point in %s"); } loc += utf8_char_length; } *loc = '\0'; out_utf8 = (uint8_t *)utf8proc_NFKC((utf8proc_uint8_t *)utf8_pre_norm); // the last two steps are both checks for characters that should not be // allowed. Because the normalization step is guarenteed to not create any // characters that will cause an error, we will use the utf8_codepoints // codepoints to check (pre-normalization) as to avoid converting back and // forth from UTF-8 to unicode codepoints. // c. Prohibit -- Check for any characters // that are not allowed in the output. If any are found, return an error. mlib_foreach_irange (i, num_chars) { if (_mongoc_utf8_code_point_is_in_table( utf8_codepoints[i], prohibited_output_ranges, sizeof(prohibited_output_ranges) / sizeof(uint32_t)) || _mongoc_utf8_code_point_is_in_table( utf8_codepoints[i], unassigned_codepoint_ranges, sizeof(unassigned_codepoint_ranges) / sizeof(uint32_t))) { bson_free(out_utf8); bson_free(utf8_pre_norm); bson_free(utf8_codepoints); SASL_PREP_ERR_RETURN("prohibited character included in %s"); } } // d. Check bidi -- Possibly check for right-to-left characters, and if // any are found, make sure that the whole string satisfies the // requirements for bidirectional strings. If the string does not // satisfy the requirements for bidirectional strings, return an // error. // note: bidi stands for directional (text). Most characters are displayed // left to right but some are displayed right to left. The requirements are // as follows: // 1. If a string contains any RandALCat character, it can't contain an LCat // character // 2. If it contains an RandALCat character, there must be an RandALCat // character at the beginning and the end of the string (does not have to be // the same character) bool contains_LCat = false; bool contains_RandALCar = false; mlib_foreach_irange (i, num_chars) { if (_mongoc_utf8_code_point_is_in_table( utf8_codepoints[i], LCat_bidi_ranges, sizeof(LCat_bidi_ranges) / sizeof(uint32_t))) { contains_LCat = true; } if (_mongoc_utf8_code_point_is_in_table( utf8_codepoints[i], RandALCat_bidi_ranges, sizeof(RandALCat_bidi_ranges) / sizeof(uint32_t))) contains_RandALCar = true; } if ( // requirement 1 (contains_RandALCar && contains_LCat) || // requirement 2 (contains_RandALCar && (!_mongoc_utf8_code_point_is_in_table( utf8_codepoints[0], RandALCat_bidi_ranges, sizeof(RandALCat_bidi_ranges) / sizeof(uint32_t)) || !_mongoc_utf8_code_point_is_in_table( utf8_codepoints[num_chars - 1], RandALCat_bidi_ranges, sizeof(RandALCat_bidi_ranges) / sizeof(uint32_t))))) { bson_free(out_utf8); bson_free(utf8_pre_norm); bson_free(utf8_codepoints); SASL_PREP_ERR_RETURN("%s does not meet bidirectional requirements"); } bson_free(utf8_pre_norm); bson_free(utf8_codepoints); return (char *)out_utf8; #undef SASL_PREP_ERR_RETURN } char * _mongoc_sasl_prep(const char *in_utf8, bson_error_t *err) { if (_mongoc_sasl_prep_required(in_utf8)) { return _mongoc_sasl_prep_impl("password", in_utf8, err); } return bson_strdup(in_utf8); } size_t _mongoc_utf8_char_length(const char *s) { BSON_ASSERT_PARAM(s); uint8_t *c = (uint8_t *)s; // UTF-8 characters are either 1, 2, 3, or 4 bytes and the character length // can be determined by the first byte if ((*c & UINT8_C(0x80)) == 0) return 1u; else if ((*c & UINT8_C(0xe0)) == UINT8_C(0xc0)) return 2u; else if ((*c & UINT8_C(0xf0)) == UINT8_C(0xe0)) return 3u; else if ((*c & UINT8_C(0xf8)) == UINT8_C(0xf0)) return 4u; else return 1u; } ssize_t _mongoc_utf8_string_length(const char *s) { BSON_ASSERT_PARAM(s); const uint8_t *c = (uint8_t *)s; ssize_t str_length = 0; while (*c) { const size_t utf8_char_length = _mongoc_utf8_char_length((char *)c); if (!_mongoc_utf8_first_code_point_is_valid((char *)c, utf8_char_length)) return -1; str_length++; c += utf8_char_length; } return str_length; } bool _mongoc_utf8_first_code_point_is_valid(const char *c, size_t length) { BSON_ASSERT_PARAM(c); uint8_t *temp_c = (uint8_t *)c; // Referenced table here: // https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/ switch (length) { case 1: return _mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0x00), UINT8_C(0x7F)); case 2: return _mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xC2), UINT8_C(0xDF)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0xBF)); case 3: // Four options, separated by || return (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xE0), UINT8_C(0xE0)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0xA0), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF))) || (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xE1), UINT8_C(0xEC)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF))) || (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xED), UINT8_C(0xED)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0x9F)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF))) || (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xEE), UINT8_C(0xEF)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF))); case 4: // Three options, separated by || return (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xF0), UINT8_C(0xF0)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x90), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[3], UINT8_C(0x80), UINT8_C(0xBF))) || (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xF1), UINT8_C(0xF3)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[3], UINT8_C(0x80), UINT8_C(0xBF))) || (_mongoc_utf8_code_unit_in_range(temp_c[0], UINT8_C(0xF4), UINT8_C(0xF4)) && _mongoc_utf8_code_unit_in_range(temp_c[1], UINT8_C(0x80), UINT8_C(0x8F)) && _mongoc_utf8_code_unit_in_range(temp_c[2], UINT8_C(0x80), UINT8_C(0xBF)) && _mongoc_utf8_code_unit_in_range(temp_c[3], UINT8_C(0x80), UINT8_C(0xBF))); default: return true; } } bool _mongoc_utf8_code_unit_in_range(const uint8_t c, const uint8_t lower, const uint8_t upper) { return (c >= lower && c <= upper); } bool _mongoc_utf8_code_point_is_in_table(uint32_t code, const uint32_t *table, size_t size) { BSON_ASSERT_PARAM(table); // all tables have size / 2 ranges for (size_t i = 0; i < size; i += 2) { if (code >= table[i] && code <= table[i + 1]) return true; } return false; } uint32_t _mongoc_utf8_get_first_code_point(const char *c, size_t length) { BSON_ASSERT_PARAM(c); uint8_t *temp_c = (uint8_t *)c; switch (length) { case 1: return (uint32_t)temp_c[0]; case 2: return (uint32_t)(((temp_c[0] & UINT8_C(0x1f)) << 6) | (temp_c[1] & UINT8_C(0x3f))); case 3: return (uint32_t)(((temp_c[0] & UINT8_C(0x0f)) << 12) | ((temp_c[1] & UINT8_C(0x3f)) << 6) | (temp_c[2] & UINT8_C(0x3f))); case 4: return (uint32_t)(((temp_c[0] & UINT8_C(0x07)) << 18) | ((temp_c[1] & UINT8_C(0x3f)) << 12) | ((temp_c[2] & UINT8_C(0x3f)) << 6) | (temp_c[3] & UINT8_C(0x3f))); default: return 0; } } ssize_t _mongoc_utf8_code_point_to_str(uint32_t c, char *out) { BSON_ASSERT_PARAM(out); uint8_t *ptr = (uint8_t *)out; if (c <= UINT8_C(0x7F)) { // Plain ASCII ptr[0] = (uint8_t)c; return 1; } else if (c <= 0x07FF) { // 2-byte unicode ptr[0] = (uint8_t)(((c >> 6) & UINT8_C(0x1F)) | UINT8_C(0xC0)); ptr[1] = (uint8_t)(((c >> 0) & UINT8_C(0x3F)) | UINT8_C(0x80)); return 2; } else if (c <= 0xFFFF) { // 3-byte unicode ptr[0] = (uint8_t)(((c >> 12) & UINT8_C(0x0F)) | UINT8_C(0xE0)); ptr[1] = (uint8_t)(((c >> 6) & UINT8_C(0x3F)) | UINT8_C(0x80)); ptr[2] = (uint8_t)((c & UINT8_C(0x3F)) | UINT8_C(0x80)); return 3; } else if (c <= 0x10FFFF) { // 4-byte unicode ptr[0] = (uint8_t)(((c >> 18) & UINT8_C(0x07)) | UINT8_C(0xF0)); ptr[1] = (uint8_t)(((c >> 12) & UINT8_C(0x3F)) | UINT8_C(0x80)); ptr[2] = (uint8_t)(((c >> 6) & UINT8_C(0x3F)) | UINT8_C(0x80)); ptr[3] = (uint8_t)((c & UINT8_C(0x3F)) | UINT8_C(0x80)); return 4; } else { return -1; } } ssize_t _mongoc_utf8_code_point_length(uint32_t c) { if (c <= UINT8_C(0x7F)) return 1; else if (c <= 0x07FF) return 2; else if (c <= 0xFFFF) return 3; else if (c <= 0x10FFFF) return 4; else return -1; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-secure-channel-private.h000066400000000000000000000047561511661753600272010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SECURE_CHANNEL_PRIVATE_H #define MONGOC_SECURE_CHANNEL_PRIVATE_H #include #include #include #include #define SECURITY_WIN32 #include #include #include BSON_BEGIN_DECLS bool mongoc_secure_channel_setup_ca(const mongoc_ssl_opt_t *opt); bool mongoc_secure_channel_setup_crl(const mongoc_ssl_opt_t *opt); // mongoc_secure_channel_load_crl is used in tests. PCCRL_CONTEXT mongoc_secure_channel_load_crl(const char *crl_file); ssize_t mongoc_secure_channel_read(mongoc_stream_tls_t *tls, void *data, size_t data_length); ssize_t mongoc_secure_channel_write(mongoc_stream_tls_t *tls, const void *data, size_t data_length); PCCERT_CONTEXT mongoc_secure_channel_setup_certificate(const mongoc_ssl_opt_t *opt); /* it may require 16k + some overhead to hold one decryptable block of data - do * what cURL does, add 1k */ #define MONGOC_SCHANNEL_BUFFER_INIT_SIZE (17 * 1024) void _mongoc_secure_channel_init_sec_buffer(SecBuffer *buffer, unsigned long buf_type, void *buf_data_ptr, unsigned long buf_byte_size); void _mongoc_secure_channel_init_sec_buffer_desc(SecBufferDesc *desc, SecBuffer *buffer_array, unsigned long buffer_count); void mongoc_secure_channel_realloc_buf(size_t *size, uint8_t **buf, size_t new_size); bool mongoc_secure_channel_handshake_step_1(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error); bool mongoc_secure_channel_handshake_step_2(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error); bool mongoc_secure_channel_handshake_step_3(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_SECURE_CHANNEL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-secure-channel.c000066400000000000000000001233501511661753600255140ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include #include // mongoc_crypto_hash #include #include #include #include #include #include #include // bin_to_hex #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-secure-channel" #ifdef __MINGW32__ // Define macros omitted from mingw headers: #ifndef SECBUFFER_ALERT #define SECBUFFER_ALERT 17 #endif #ifndef NCRYPTBUFFER_VERSION #define NCRYPTBUFFER_VERSION 0 #endif #ifndef NCRYPT_PKCS8_PRIVATE_KEY_BLOB #define NCRYPT_PKCS8_PRIVATE_KEY_BLOB L"PKCS8_PRIVATEKEY" #endif #ifndef NCRYPT_SILENT_FLAG #define NCRYPT_SILENT_FLAG 0x00000040 #endif #ifndef MS_KEY_STORAGE_PROVIDER #define MS_KEY_STORAGE_PROVIDER L"Microsoft Software Key Storage Provider" #endif #endif // #ifdef __MINGW32__ // `decode_pem_base64` decodes a base-64 PEM blob with headers. // Returns NULL on error. static LPBYTE decode_pem_base64(const char *base64_in, DWORD *out_len, const char *descriptor, const char *filename) { BSON_ASSERT_PARAM(base64_in); BSON_ASSERT_PARAM(out_len); BSON_ASSERT_PARAM(descriptor); BSON_ASSERT_PARAM(filename); // Get needed output length: if (!CryptStringToBinaryA(base64_in, 0, CRYPT_STRING_BASE64HEADER, NULL, out_len, NULL, NULL)) { MONGOC_ERROR( "Failed to convert base64 %s from '%s'. Error 0x%.8X", descriptor, filename, (unsigned int)GetLastError()); return NULL; } if (*out_len == 0) { return NULL; } LPBYTE out = (LPBYTE)bson_malloc(*out_len); if (!CryptStringToBinaryA(base64_in, 0, CRYPT_STRING_BASE64HEADER, out, out_len, NULL, NULL)) { MONGOC_ERROR( "Failed to convert base64 %s from '%s'. Error 0x%.8X", descriptor, filename, (unsigned int)GetLastError()); bson_free(out); return NULL; } return out; } // `read_file_and_null_terminate` reads a file into a NUL-terminated string. // On success: returns a NUL-terminated string and (optionally) sets `*out_len` excluding NUL. // On error: returns NULL. static char * read_file_and_null_terminate(const char *filename, size_t *out_len) { BSON_ASSERT_PARAM(filename); BSON_OPTIONAL_PARAM(out_len); bool ok = false; char *contents = NULL; char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; FILE *file = fopen(filename, "rb"); if (!file) { MONGOC_ERROR( "Failed to open file: '%s' with error: '%s'", filename, bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf)); goto fail; } if (0 != fseek(file, 0, SEEK_END)) { MONGOC_ERROR("Failed to seek in file: '%s' with error: '%s'", filename, bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf)); goto fail; } const long file_len = ftell(file); if (file_len < 0) { MONGOC_ERROR("Failed to get length of file: '%s' with error: '%s'", filename, bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf)); goto fail; } if (file_len > LONG_MAX - 1) { goto fail; } if (0 != fseek(file, 0, SEEK_SET)) { goto fail; } // Read the whole file into one NUL-terminated string: contents = (char *)bson_malloc((size_t)file_len + 1u); contents[file_len] = '\0'; if ((size_t)file_len != fread(contents, 1, file_len, file)) { SecureZeroMemory(contents, file_len); if (feof(file)) { MONGOC_ERROR("Unexpected EOF reading file: '%s'", filename); goto fail; } else { MONGOC_ERROR("Failed to read file: '%s' with error: '%s'", filename, bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf)); goto fail; } } if (out_len) { *out_len = (size_t)file_len; } ok = true; fail: if (file) { (void)fclose(file); // Ignore error. } if (!ok) { bson_free(contents); contents = NULL; } return contents; } // `decode_object` decodes a cryptographic object from a blob. // Returns NULL on error. static LPBYTE decode_object(const char *structType, const LPBYTE data, DWORD data_len, DWORD *out_len, const char *descriptor, const char *filename) { BSON_ASSERT_PARAM(structType); BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(structType); BSON_ASSERT_PARAM(out_len); BSON_ASSERT_PARAM(descriptor); BSON_ASSERT_PARAM(filename); // Get needed output length: if (!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* dwCertEncodingType */ structType, /* lpszStructType */ data, /* pbEncoded */ data_len, /* cbEncoded */ 0, /* dwFlags */ NULL, /* pDecodePara */ NULL, /* pvStructInfo */ out_len /* pcbStructInfo */ )) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Failed to decode %s from '%s': %s", descriptor, filename, msg); bson_free(msg); return NULL; } if (*out_len == 0) { return NULL; } LPBYTE out = (LPBYTE)bson_malloc(*out_len); if (!CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* dwCertEncodingType */ structType, /* lpszStructType */ data, /* pbEncoded */ data_len, /* cbEncoded */ 0, /* dwFlags */ NULL, /* pDecodePara */ out, /* pvStructInfo */ out_len /* pcbStructInfo */ )) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Failed to decode %s from '%s': %s", descriptor, filename, msg); bson_free(msg); bson_free(out); return NULL; } return out; } // `utf8_to_wide` converts a UTF-8 string into a wide string using the Windows API MultiByteToWideChar. // Returns a NULL-terminated wide character string on success. Returns NULL on error. static WCHAR * utf8_to_wide(const char *utf8) { // Get necessary character count (not bytes!) of result: int required_wide_chars = MultiByteToWideChar(CP_UTF8, 0, utf8, -1 /* NULL terminated */, NULL, 0); if (required_wide_chars == 0) { return NULL; } // Since -1 was passed as the input length, the returned character count includes space for the null character. WCHAR *wide_chars = BSON_ARRAY_ALLOC(required_wide_chars, WCHAR); if (0 == MultiByteToWideChar(CP_UTF8, 0, utf8, -1 /* NULL terminated */, wide_chars, required_wide_chars)) { bson_free(wide_chars); return NULL; } return wide_chars; } // `generate_key_name` generates a deterministic name for a key of the form: "libmongoc--". // Returns NULL on error. static LPWSTR generate_key_name(LPBYTE data, DWORD len, const char *suffix) { bool ok = false; char *hash_hex = NULL; char *key_name = NULL; LPWSTR key_name_wide = NULL; BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(suffix); // Compute a hash of the certificate: { unsigned char hash[32]; mongoc_crypto_t crypto; mongoc_crypto_init(&crypto, MONGOC_CRYPTO_ALGORITHM_SHA_256); if (!mongoc_crypto_hash(&crypto, (const unsigned char *)data, mlib_assert_narrow(size_t, len), hash)) { goto fail; } // Use uppercase hex to match form of `openssl x509` command: hash_hex = bin_to_hex((const uint8_t *)hash, sizeof(hash)); if (!hash_hex) { goto fail; } } // Convert to a wide string: { key_name = bson_strdup_printf("libmongoc-%s-%s", hash_hex, suffix); key_name_wide = utf8_to_wide(key_name); if (!key_name_wide) { goto fail; } } ok = true; fail: bson_free(key_name); bson_free(hash_hex); if (!ok) { bson_free(key_name_wide); key_name_wide = NULL; } return key_name_wide; } PCCERT_CONTEXT mongoc_secure_channel_setup_certificate_from_file(const char *filename) { char *pem; bool ret = false; bool success; size_t pem_length; HCRYPTPROV provider = 0u; DWORD encoded_cert_len; LPBYTE encoded_cert = NULL; const char *pem_public; const char *pem_private; PCCERT_CONTEXT cert = NULL; LPBYTE blob_private = NULL; DWORD blob_private_len = 0; LPBYTE blob_private_rsa = NULL; DWORD blob_private_rsa_len = 0; DWORD encoded_private_len = 0; LPBYTE encoded_private = NULL; NCRYPT_PROV_HANDLE cng_provider = 0u; LPWSTR key_name = NULL; BSON_ASSERT_PARAM(filename); pem = read_file_and_null_terminate(filename, &pem_length); if (!pem) { goto fail; } pem_public = strstr(pem, "-----BEGIN CERTIFICATE-----"); if (!pem_public) { MONGOC_ERROR("Can't find public certificate in '%s'", filename); goto fail; } pem_private = strstr(pem, "-----BEGIN ENCRYPTED PRIVATE KEY-----"); if (pem_private) { MONGOC_ERROR("Detected unsupported encrypted private key"); goto fail; } encoded_cert = decode_pem_base64(pem_public, &encoded_cert_len, "public key", filename); if (!encoded_cert) { goto fail; } cert = CertCreateCertificateContext(X509_ASN_ENCODING, encoded_cert, encoded_cert_len); if (!cert) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Failed to extract public key from '%s': %s", filename, msg); bson_free(msg); goto fail; } // Import private key as a persisted (not ephemeral) key. // Ephemeral keys do not appear to support modern signatures. See CDRIVER-5998. if (NULL != (pem_private = strstr(pem, "-----BEGIN RSA PRIVATE KEY-----"))) { // Import PKCS#1 as a persisted CAPI key. Windows CNG API does not appear to support PKCS#1. encoded_private = decode_pem_base64(pem_private, &encoded_private_len, "private key", filename); if (!encoded_private) { goto fail; } blob_private_rsa = decode_object( PKCS_RSA_PRIVATE_KEY, encoded_private, encoded_private_len, &blob_private_rsa_len, "private key", filename); if (!blob_private_rsa) { goto fail; } // Import persisted key with a deterministic name of the form "libmongoc--pkcs1": key_name = generate_key_name(encoded_cert, encoded_cert_len, "pkcs1"); if (!key_name) { MONGOC_ERROR("Failed to generate key name"); goto fail; } bool exists = false; success = CryptAcquireContextW(&provider, /* phProv */ key_name, /* pszContainer */ MS_ENHANCED_PROV_W, /* pszProvider */ PROV_RSA_FULL, /* dwProvType */ CRYPT_NEWKEYSET | CRYPT_SILENT); /* dwFlags */ if (!success) { DWORD last_error = GetLastError(); exists = last_error == (DWORD)NTE_EXISTS; if (!exists) { // Unexpected error: char *msg = mongoc_winerr_to_string(last_error); MONGOC_ERROR("CryptAcquireContext failed: %s", msg); bson_free(msg); goto fail; } } if (!exists) { // Import CAPI key: HCRYPTKEY hKey; success = CryptImportKey(provider, /* hProv */ blob_private_rsa, /* pbData */ blob_private_rsa_len, /* dwDataLen */ 0, /* hPubKey */ 0, /* dwFlags */ &hKey); /* phKey, OUT */ if (!success) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("CryptImportKey for private key failed: %s", msg); bson_free(msg); goto fail; } CryptDestroyKey(hKey); } CRYPT_KEY_PROV_INFO keyProvInfo = {0}; keyProvInfo.pwszContainerName = key_name; keyProvInfo.pwszProvName = MS_ENHANCED_PROV_W, keyProvInfo.dwFlags |= CERT_SET_KEY_PROV_HANDLE_PROP_ID | CERT_SET_KEY_CONTEXT_PROP_ID | CRYPT_SILENT; keyProvInfo.dwProvType = PROV_RSA_FULL; keyProvInfo.dwKeySpec = AT_KEYEXCHANGE; success = CertSetCertificateContextProperty(cert, /* pCertContext */ CERT_KEY_PROV_INFO_PROP_ID, /* dwPropId */ 0, /* dwFlags */ (const void *)&keyProvInfo); /* pvData */ if (!success) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Can't associate private key with public key: %s", msg); bson_free(msg); goto fail; } } else if (NULL != (pem_private = strstr(pem, "-----BEGIN PRIVATE KEY-----"))) { // Import PKCS#8 as a persisted CNG key. encoded_private = decode_pem_base64(pem_private, &encoded_private_len, "private key", filename); if (!encoded_private) { goto fail; } // Open the software key storage provider: SECURITY_STATUS status = NCryptOpenStorageProvider(&cng_provider, MS_KEY_STORAGE_PROVIDER, 0); if (status != SEC_E_OK) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Can't open key storage provider: %s", msg); bson_free(msg); goto fail; } // Supply a key name to persist the key: NCryptBuffer buffer; NCryptBufferDesc bufferDesc; // Import persisted key with a deterministic name of the form "libmongoc--pkcs8": key_name = generate_key_name(encoded_cert, encoded_cert_len, "pkcs8"); if (!key_name) { MONGOC_ERROR("Failed to generate key name"); goto fail; } buffer.cbBuffer = (ULONG)(wcslen(key_name) + 1) * sizeof(WCHAR); buffer.BufferType = NCRYPTBUFFER_PKCS_KEY_NAME; buffer.pvBuffer = key_name; bufferDesc.ulVersion = NCRYPTBUFFER_VERSION; bufferDesc.cBuffers = 1; bufferDesc.pBuffers = &buffer; // Import the private key blob as a persisted CNG key: { NCRYPT_KEY_HANDLE hKey = 0; status = NCryptImportKey(cng_provider, 0, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, &bufferDesc, &hKey, encoded_private, encoded_private_len, NCRYPT_SILENT_FLAG); if (hKey) { NCryptFreeObject(hKey); } // Ignore `NTE_EXISTS` error since key may have already been imported: if (status != SEC_E_OK && status != NTE_EXISTS) { char *msg = mongoc_winerr_to_string((DWORD)status); MONGOC_ERROR("Failed to import key: %s", msg); bson_free(msg); goto fail; } } // Attach key to certificate: { CRYPT_KEY_PROV_INFO keyProvInfo = {0}; keyProvInfo.pwszContainerName = key_name; keyProvInfo.pwszProvName = MS_KEY_STORAGE_PROVIDER, keyProvInfo.dwFlags |= CERT_SET_KEY_PROV_HANDLE_PROP_ID | CERT_SET_KEY_CONTEXT_PROP_ID | CRYPT_SILENT; keyProvInfo.dwProvType = 0 /* CNG */; keyProvInfo.dwKeySpec = AT_KEYEXCHANGE; if (!CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo)) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Failed to attach key to certificate: %s", msg); bson_free(msg); goto fail; } } } else { MONGOC_ERROR("Can't find private key in '%s'", filename); goto fail; } TRACE("%s", "Successfully loaded client certificate"); ret = true; fail: bson_free(key_name); if (cng_provider) { NCryptFreeObject(cng_provider); } if (provider) { CryptReleaseContext(provider, 0); } if (pem) { SecureZeroMemory(pem, pem_length); bson_free(pem); } bson_free(encoded_cert); if (encoded_private) { SecureZeroMemory(encoded_private, encoded_private_len); bson_free(encoded_private); } if (blob_private_rsa) { SecureZeroMemory(blob_private_rsa, blob_private_rsa_len); bson_free(blob_private_rsa); } if (blob_private) { SecureZeroMemory(blob_private, blob_private_len); bson_free(blob_private); } if (!ret) { CertFreeCertificateContext(cert); return NULL; } return cert; } PCCERT_CONTEXT mongoc_secure_channel_setup_certificate(const mongoc_ssl_opt_t *opt) { return mongoc_secure_channel_setup_certificate_from_file(opt->pem_file); } bool mongoc_secure_channel_setup_ca(const mongoc_ssl_opt_t *opt) { bool ok = false; char *pem = NULL; const char *pem_key; HCERTSTORE cert_store = NULL; PCCERT_CONTEXT cert = NULL; DWORD encoded_cert_len = 0; LPBYTE encoded_cert = NULL; pem = read_file_and_null_terminate(opt->ca_file, NULL); if (!pem) { return false; } /* If we have private keys or other fuzz, seek to the good stuff */ pem_key = strstr(pem, "-----BEGIN CERTIFICATE-----"); if (!pem_key) { MONGOC_WARNING("Couldn't find certificate in '%s'", opt->ca_file); goto fail; } encoded_cert = decode_pem_base64(pem_key, &encoded_cert_len, "public key", opt->ca_file); if (!encoded_cert) { goto fail; } cert = CertCreateCertificateContext(X509_ASN_ENCODING, encoded_cert, encoded_cert_len); if (!cert) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_WARNING("Could not convert certificate: %s", msg); bson_free(msg); goto fail; } cert_store = CertOpenStore(CERT_STORE_PROV_SYSTEM, /* provider */ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* certificate encoding */ 0, /* unused */ CERT_SYSTEM_STORE_LOCAL_MACHINE, /* dwFlags */ L"Root"); /* system store name. "My" or "Root" */ if (cert_store == NULL) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Error opening certificate store: %s", msg); bson_free(msg); goto fail; } if (!CertAddCertificateContextToStore(cert_store, cert, CERT_STORE_ADD_USE_EXISTING, NULL)) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_WARNING("Failed adding the cert: %s", msg); bson_free(msg); goto fail; } TRACE("%s", "Added the certificate !"); ok = true; fail: CertCloseStore(cert_store, 0); bson_free(encoded_cert); CertFreeCertificateContext(cert); bson_free(pem); return ok; } PCCRL_CONTEXT mongoc_secure_channel_load_crl(const char *crl_file) { PCCRL_CONTEXT crl = NULL; bool ok = false; DWORD encoded_crl_len = 0; LPBYTE encoded_crl = NULL; char *pem = read_file_and_null_terminate(crl_file, NULL); if (!pem) { goto fail; } const char *pem_begin = strstr(pem, "-----BEGIN X509 CRL-----"); if (!pem_begin) { MONGOC_WARNING("Couldn't find CRL in '%s'", crl_file); goto fail; } encoded_crl = decode_pem_base64(pem_begin, &encoded_crl_len, "CRL", crl_file); if (!encoded_crl) { goto fail; } crl = CertCreateCRLContext(X509_ASN_ENCODING, encoded_crl, encoded_crl_len); if (!crl) { MONGOC_WARNING("Can't extract CRL from '%s'", crl_file); goto fail; } ok = true; fail: bson_free(encoded_crl); bson_free(pem); if (!ok) { CertFreeCRLContext(crl); crl = NULL; } return crl; } bool mongoc_secure_channel_setup_crl(const mongoc_ssl_opt_t *opt) { HCERTSTORE cert_store = NULL; bool ok = false; PCCRL_CONTEXT crl = mongoc_secure_channel_load_crl(opt->crl_file); if (!crl) { goto fail; } cert_store = CertOpenStore(CERT_STORE_PROV_SYSTEM, /* provider */ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* certificate encoding */ 0, /* unused */ CERT_SYSTEM_STORE_LOCAL_MACHINE, /* dwFlags */ L"Root"); /* system store name. "My" or "Root" */ if (cert_store == NULL) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_ERROR("Error opening certificate store: %s", msg); bson_free(msg); goto fail; } if (!CertAddCRLContextToStore(cert_store, crl, CERT_STORE_ADD_USE_EXISTING, NULL)) { char *msg = mongoc_winerr_to_string(GetLastError()); MONGOC_WARNING("Failed adding the CRL: %s", msg); bson_free(msg); goto fail; } TRACE("%s", "Added the CRL!"); ok = true; fail: CertCloseStore(cert_store, 0); CertFreeCRLContext(crl); return ok; } ssize_t mongoc_secure_channel_read(mongoc_stream_tls_t *tls, void *data, size_t data_length) { BSON_ASSERT_PARAM(tls); if (BSON_UNLIKELY(!mlib_in_range(int32_t, tls->timeout_msec))) { // CDRIVER-4589 MONGOC_ERROR("timeout_msec value %" PRId64 " exceeds supported 32-bit range", tls->timeout_msec); return -1; } errno = 0; TRACE("Wanting to read: %zu, timeout is %" PRId64, data_length, tls->timeout_msec); /* 4th argument is minimum bytes, while the data_length is the * size of the buffer. We are totally fine with just one TLS record (few *bytes) **/ const ssize_t length = mongoc_stream_read(tls->base_stream, data, data_length, 0, (int32_t)tls->timeout_msec); TRACE("Got %zd", length); if (length > 0) { return length; } return 0; } ssize_t mongoc_secure_channel_write(mongoc_stream_tls_t *tls, const void *data, size_t data_length) { BSON_ASSERT_PARAM(tls); if (BSON_UNLIKELY(!mlib_in_range(int32_t, tls->timeout_msec))) { // CDRIVER-4589 MONGOC_ERROR("timeout_msec value %" PRId64 " exceeds supported 32-bit range", tls->timeout_msec); return -1; } errno = 0; TRACE("Wanting to write: %zu", data_length); const ssize_t length = mongoc_stream_write(tls->base_stream, (void *)data, data_length, (int32_t)tls->timeout_msec); TRACE("Wrote: %zd", length); return length; } void mongoc_secure_channel_realloc_buf(size_t *size, uint8_t **buf, size_t new_size) { *size = bson_next_power_of_two(new_size); *buf = bson_realloc(*buf, *size); } /** * The follow functions comes from one of my favorite project, cURL! * Thank you so much for having gone through the Secure Channel pain for me. * * * Copyright (C) 2012 - 2015, Marc Hoersken, * Copyright (C) 2012, Mark Salisbury, * Copyright (C) 2012 - 2015, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ /* * Based upon the PolarSSL implementation in polarssl.c and polarssl.h: * Copyright (C) 2010, 2011, Hoi-Ho Chan, * * Based upon the CyaSSL implementation in cyassl.c and cyassl.h: * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * Thanks for code and inspiration! */ void _mongoc_secure_channel_init_sec_buffer(SecBuffer *buffer, unsigned long buf_type, void *buf_data_ptr, unsigned long buf_byte_size) { buffer->cbBuffer = buf_byte_size; buffer->BufferType = buf_type; buffer->pvBuffer = buf_data_ptr; } void _mongoc_secure_channel_init_sec_buffer_desc(SecBufferDesc *desc, SecBuffer *buffer_array, unsigned long buffer_count) { desc->ulVersion = SECBUFFER_VERSION; desc->pBuffers = buffer_array; desc->cBuffers = buffer_count; } #define MONGOC_LOG_AND_SET_ERROR(ERROR, DOMAIN, CODE, ...) \ do { \ MONGOC_ERROR(__VA_ARGS__); \ _mongoc_set_error(ERROR, DOMAIN, CODE, __VA_ARGS__); \ } while (0) bool mongoc_secure_channel_handshake_step_1(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error) { SecBuffer outbuf; ssize_t written = -1; SecBufferDesc outbuf_desc; SECURITY_STATUS sspi_status = SEC_E_OK; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; TRACE("SSL/TLS connection with '%s' (step 1/3)", hostname); /* setup output buffer */ _mongoc_secure_channel_init_sec_buffer(&outbuf, SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&outbuf_desc, &outbuf, 1); /* setup request flags */ secure_channel->req_flags = ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM; /* allocate memory for the security context handle */ secure_channel->ctxt = (mongoc_secure_channel_ctxt *)bson_malloc0(sizeof(mongoc_secure_channel_ctxt)); /* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375924.aspx */ sspi_status = InitializeSecurityContext(&secure_channel->cred_handle->cred_handle, /* phCredential */ NULL, /* phContext */ hostname, /* pszTargetName */ secure_channel->req_flags, /* fContextReq */ 0, /* Reserved1, must be 0 */ 0, /* TargetDataRep, unused */ NULL, /* pInput */ 0, /* Reserved2, must be 0 */ &secure_channel->ctxt->ctxt_handle, /* phNewContext OUT param */ &outbuf_desc, /* pOutput OUT param */ &secure_channel->ret_flags, /* pfContextAttr OUT param */ &secure_channel->ctxt->time_stamp /* ptsExpiry OUT param */ ); if (sspi_status != SEC_I_CONTINUE_NEEDED) { // Cast signed SECURITY_STATUS to unsigned DWORD. FormatMessage expects DWORD. char *msg = mongoc_winerr_to_string((DWORD)sspi_status); MONGOC_LOG_AND_SET_ERROR( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "initial InitializeSecurityContext failed: %s", msg); bson_free(msg); return false; } TRACE("sending initial handshake data: sending %lu bytes...", outbuf.cbBuffer); /* send initial handshake data which is now stored in output buffer */ written = mongoc_secure_channel_write(tls, outbuf.pvBuffer, outbuf.cbBuffer); FreeContextBuffer(outbuf.pvBuffer); if (outbuf.cbBuffer != (size_t)written) { MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "failed to send initial handshake data: " "sent %zd of %lu bytes", written, outbuf.cbBuffer); return false; } TRACE("sent initial handshake data: sent %zd bytes", written); secure_channel->recv_unrecoverable_err = 0; secure_channel->recv_sspi_close_notify = false; secure_channel->recv_connection_closed = false; /* continue to second handshake step */ secure_channel->connecting_state = ssl_connect_2; return true; } bool mongoc_secure_channel_handshake_step_2(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error) { mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; SECURITY_STATUS sspi_status = SEC_E_OK; ssize_t nread = -1, written = -1; SecBufferDesc outbuf_desc; SecBufferDesc inbuf_desc; SecBuffer outbuf[3]; SecBuffer inbuf[2]; bool doread; int i; doread = (secure_channel->connecting_state != ssl_connect_2_writing) ? true : false; TRACE("%s", "SSL/TLS connection with endpoint (step 2/3)"); if (!secure_channel->cred_handle || !secure_channel->ctxt) { MONGOC_LOG_AND_SET_ERROR( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "required TLS credentials or context not provided"); return false; } /* grow the buffer if necessary */ if (secure_channel->encdata_length == secure_channel->encdata_offset) { mongoc_secure_channel_realloc_buf( &secure_channel->encdata_length, &secure_channel->encdata_buffer, secure_channel->encdata_length + 1); } for (;;) { if (doread) { /* read encrypted handshake data from socket */ nread = mongoc_secure_channel_read(tls, (char *)(secure_channel->encdata_buffer + secure_channel->encdata_offset), secure_channel->encdata_length - secure_channel->encdata_offset); if (!nread) { if (MONGOC_ERRNO_IS_AGAIN(errno)) { if (secure_channel->connecting_state != ssl_connect_2_writing) { secure_channel->connecting_state = ssl_connect_2_reading; } TRACE("%s", "failed to receive handshake, need more data"); return true; } MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "failed to receive handshake, SSL/TLS connection failed"); return false; } /* increase encrypted data buffer offset */ secure_channel->encdata_offset += nread; } TRACE("encrypted data buffer: offset %d length %d", (int)secure_channel->encdata_offset, (int)secure_channel->encdata_length); /* setup input buffers */ _mongoc_secure_channel_init_sec_buffer(&inbuf[0], SECBUFFER_TOKEN, bson_malloc(secure_channel->encdata_offset), (unsigned long)(secure_channel->encdata_offset & (size_t)0xFFFFFFFFUL)); _mongoc_secure_channel_init_sec_buffer(&inbuf[1], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&inbuf_desc, inbuf, 2); /* setup output buffers */ _mongoc_secure_channel_init_sec_buffer(&outbuf[0], SECBUFFER_TOKEN, NULL, 0); _mongoc_secure_channel_init_sec_buffer(&outbuf[1], SECBUFFER_ALERT, NULL, 0); _mongoc_secure_channel_init_sec_buffer(&outbuf[2], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&outbuf_desc, outbuf, 3); if (inbuf[0].pvBuffer == NULL) { MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "unable to allocate memory"); return false; } /* copy received handshake data into input buffer */ memcpy(inbuf[0].pvBuffer, secure_channel->encdata_buffer, secure_channel->encdata_offset); /* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375924.aspx */ sspi_status = InitializeSecurityContext(&secure_channel->cred_handle->cred_handle, &secure_channel->ctxt->ctxt_handle, hostname, secure_channel->req_flags, 0, 0, &inbuf_desc, 0, NULL, &outbuf_desc, &secure_channel->ret_flags, &secure_channel->ctxt->time_stamp); /* free buffer for received handshake data */ bson_free(inbuf[0].pvBuffer); /* check if the handshake was incomplete */ if (sspi_status == SEC_E_INCOMPLETE_MESSAGE) { secure_channel->connecting_state = ssl_connect_2_reading; TRACE("%s", "received incomplete message, need more data"); return true; } /* If the server has requested a client certificate, attempt to continue * the handshake without one. This will allow connections to servers which * request a client certificate but do not require it. */ if (sspi_status == SEC_I_INCOMPLETE_CREDENTIALS && !(secure_channel->req_flags & ISC_REQ_USE_SUPPLIED_CREDS)) { secure_channel->req_flags |= ISC_REQ_USE_SUPPLIED_CREDS; secure_channel->connecting_state = ssl_connect_2_writing; TRACE("%s", "A client certificate has been requested"); return true; } /* check if the handshake needs to be continued */ if (sspi_status == SEC_I_CONTINUE_NEEDED || sspi_status == SEC_E_OK) { for (i = 0; i < 3; i++) { /* search for handshake tokens that need to be send */ if (outbuf[i].BufferType == SECBUFFER_TOKEN && outbuf[i].cbBuffer > 0) { TRACE("sending next handshake data: sending %lu bytes...", outbuf[i].cbBuffer); /* send handshake token to server */ written = mongoc_secure_channel_write(tls, outbuf[i].pvBuffer, outbuf[i].cbBuffer); if (outbuf[i].cbBuffer != (size_t)written) { MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "failed to send next handshake data: " "sent %zd of %lu bytes", written, outbuf[i].cbBuffer); return false; } } /* free obsolete buffer */ if (outbuf[i].pvBuffer != NULL) { FreeContextBuffer(outbuf[i].pvBuffer); } } } else { switch (sspi_status) { case SEC_E_WRONG_PRINCIPAL: MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "SSL Certification verification failed: hostname " "doesn't match certificate"); break; case SEC_E_UNTRUSTED_ROOT: MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "SSL Certification verification failed: Untrusted " "root certificate"); break; case SEC_E_CERT_EXPIRED: MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "SSL Certification verification failed: certificate " "has expired"); break; case CRYPT_E_NO_REVOCATION_CHECK: MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "SSL Certification verification failed: certificate " "does not include revocation check."); break; case SEC_E_INSUFFICIENT_MEMORY: case SEC_E_INTERNAL_ERROR: case SEC_E_INVALID_HANDLE: case SEC_E_INVALID_TOKEN: case SEC_E_LOGON_DENIED: case SEC_E_NO_AUTHENTICATING_AUTHORITY: case SEC_E_NO_CREDENTIALS: case SEC_E_TARGET_UNKNOWN: case SEC_E_UNSUPPORTED_FUNCTION: #ifdef SEC_E_APPLICATION_PROTOCOL_MISMATCH /* Not available in VS2010 */ case SEC_E_APPLICATION_PROTOCOL_MISMATCH: #endif default: { // Cast signed SECURITY_STATUS to unsigned DWORD. FormatMessage expects DWORD. char *msg = mongoc_winerr_to_string((DWORD)sspi_status); MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to initialize security context: %s", msg); bson_free(msg); } } return false; } /* check if there was additional remaining encrypted data */ if (inbuf[1].BufferType == SECBUFFER_EXTRA && inbuf[1].cbBuffer > 0) { TRACE("encrypted data length: %lu", inbuf[1].cbBuffer); /* * There are two cases where we could be getting extra data here: * 1) If we're renegotiating a connection and the handshake is already * complete (from the server perspective), it can encrypted app data * (not handshake data) in an extra buffer at this point. * 2) (sspi_status == SEC_I_CONTINUE_NEEDED) We are negotiating a * connection and this extra data is part of the handshake. * We should process the data immediately; waiting for the socket to * be ready may fail since the server is done sending handshake data. */ /* check if the remaining data is less than the total amount * and therefore begins after the already processed data */ if (secure_channel->encdata_offset > inbuf[1].cbBuffer) { memmove(secure_channel->encdata_buffer, (secure_channel->encdata_buffer + secure_channel->encdata_offset) - inbuf[1].cbBuffer, inbuf[1].cbBuffer); secure_channel->encdata_offset = inbuf[1].cbBuffer; if (sspi_status == SEC_I_CONTINUE_NEEDED) { doread = FALSE; continue; } } } else { secure_channel->encdata_offset = 0; } break; } /* check if the handshake needs to be continued */ if (sspi_status == SEC_I_CONTINUE_NEEDED) { secure_channel->connecting_state = ssl_connect_2_reading; return true; } /* check if the handshake is complete */ if (sspi_status == SEC_E_OK) { secure_channel->connecting_state = ssl_connect_3; TRACE("%s", "SSL/TLS handshake complete"); } return true; } bool mongoc_secure_channel_handshake_step_3(mongoc_stream_tls_t *tls, char *hostname, bson_error_t *error) { mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; BSON_ASSERT(ssl_connect_3 == secure_channel->connecting_state); TRACE("SSL/TLS connection with %s (step 3/3)", hostname); if (!secure_channel->cred_handle) { MONGOC_LOG_AND_SET_ERROR( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "required TLS credentials not provided"); return false; } /* check if the required context attributes are met */ if (secure_channel->ret_flags != secure_channel->req_flags) { MONGOC_LOG_AND_SET_ERROR(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed handshake"); return false; } secure_channel->connecting_state = ssl_connect_done; return true; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-secure-transport-private.h000066400000000000000000000030171511661753600276120ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SECURE_TRANSPORT_PRIVATE_H #define MONGOC_SECURE_TRANSPORT_PRIVATE_H #include #include #include #include BSON_BEGIN_DECLS char * _mongoc_cfstringref_to_cstring(CFStringRef ref); OSStatus mongoc_secure_transport_write(SSLConnectionRef connection, const void *data, size_t *data_length); OSStatus mongoc_secure_transport_read(SSLConnectionRef connection, void *data, size_t *data_length); bool mongoc_secure_transport_setup_ca(mongoc_stream_tls_secure_transport_t *secure_transport, mongoc_ssl_opt_t *opt); bool mongoc_secure_transport_setup_certificate(mongoc_stream_tls_secure_transport_t *secure_transport, mongoc_ssl_opt_t *opt); void CFReleaseSafe(CFTypeRef cf); BSON_END_DECLS #endif /* MONGOC_SECURE_TRANSPORT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-secure-transport.c000066400000000000000000000254031511661753600261400ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // CDRIVER-2722: Secure Transport is deprecated on MacOS. BEGIN_IGNORE_DEPRECATIONS /* Jailbreak Darwin Private API */ /* * An alternative to using SecIdentityCreate is to use * SecIdentityCreateWithCertificate with a temporary keychain. However, doing so * leads to memory bugs. Unfortunately, using this private API seems to be the * best solution. */ SecIdentityRef SecIdentityCreate(CFAllocatorRef allocator, SecCertificateRef certificate, SecKeyRef privateKey); #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-secure_transport" char * _mongoc_cfstringref_to_cstring(CFStringRef str) { CFIndex length; CFStringEncoding encoding; CFIndex max_size; char *cs; if (!str) { return NULL; } if (CFGetTypeID(str) != CFStringGetTypeID()) { return NULL; } length = CFStringGetLength(str); encoding = kCFStringEncodingASCII; max_size = CFStringGetMaximumSizeForEncoding(length, encoding) + 1; cs = bson_malloc((size_t)max_size); if (CFStringGetCString(str, cs, max_size, encoding)) { return cs; } bson_free(cs); return NULL; } CFTypeRef _mongoc_secure_transport_dict_get(CFArrayRef values, CFStringRef label) { if (!values || CFGetTypeID(values) != CFArrayGetTypeID()) { return NULL; } for (CFIndex i = 0; i < CFArrayGetCount(values); ++i) { CFStringRef item_label; CFDictionaryRef item = CFArrayGetValueAtIndex(values, i); if (CFGetTypeID(item) != CFDictionaryGetTypeID()) { continue; } item_label = CFDictionaryGetValue(item, kSecPropertyKeyLabel); if (item_label && CFStringCompare(item_label, label, 0) == kCFCompareEqualTo) { return CFDictionaryGetValue(item, kSecPropertyKeyValue); } } return NULL; } static void safe_release(CFTypeRef ref) { if (ref) { CFRelease(ref); } } bool _mongoc_secure_transport_import_pem(const char *filename, const char *passphrase, CFArrayRef *items, SecExternalItemType *type) { SecExternalFormat format = kSecFormatPEMSequence; SecItemImportExportKeyParameters params = {0}; SecTransformRef sec_transform = NULL; CFReadStreamRef read_stream = NULL; CFDataRef dataref = NULL; CFErrorRef error = NULL; CFURLRef url = NULL; OSStatus res; bool r = false; if (!filename) { TRACE("%s", "No certificate provided"); return false; } params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION; params.flags = 0; params.passphrase = NULL; params.alertTitle = NULL; params.alertPrompt = NULL; params.accessRef = NULL; params.keyUsage = NULL; params.keyAttributes = NULL; if (passphrase) { params.passphrase = CFStringCreateWithCString(kCFAllocatorDefault, passphrase, kCFStringEncodingUTF8); } url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, (const UInt8 *)filename, strlen(filename), false); read_stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url); if (!CFReadStreamOpen(read_stream)) { MONGOC_ERROR("Cannot find certificate in '%s', error reading file", filename); goto done; } sec_transform = SecTransformCreateReadTransformWithReadStream(read_stream); dataref = SecTransformExecute(sec_transform, &error); if (error) { CFStringRef str = CFErrorCopyDescription(error); MONGOC_ERROR( "Failed importing PEM '%s': %s", filename, CFStringGetCStringPtr(str, CFStringGetFastestEncoding(str))); CFRelease(str); goto done; } res = SecItemImport(dataref, CFSTR(".pem"), &format, type, 0, ¶ms, NULL, items); if (res) { MONGOC_ERROR("Failed importing PEM '%s' (code: %d)", filename, res); goto done; } r = true; done: safe_release(dataref); safe_release(sec_transform); safe_release(read_stream); safe_release(url); safe_release(params.passphrase); return r; } static const char * SecExternalItemType_to_string(SecExternalItemType value) { switch (value) { case kSecItemTypeUnknown: return "kSecItemTypeUnknown"; case kSecItemTypePrivateKey: return "kSecItemTypePrivateKey"; case kSecItemTypePublicKey: return "kSecItemTypePublicKey"; case kSecItemTypeSessionKey: return "kSecItemTypeSessionKey"; case kSecItemTypeCertificate: return "kSecItemTypeCertificate"; case kSecItemTypeAggregate: return "kSecItemTypeAggregate"; default: return "Unknown"; } } bool mongoc_secure_transport_setup_certificate(mongoc_stream_tls_secure_transport_t *secure_transport, mongoc_ssl_opt_t *opt) { bool success; CFArrayRef items; SecIdentityRef id; SecKeyRef key = NULL; SecCertificateRef cert = NULL; SecExternalItemType type = kSecItemTypeCertificate; if (!opt->pem_file) { TRACE("%s", "No private key provided, the server won't be able to verify us"); return false; } success = _mongoc_secure_transport_import_pem(opt->pem_file, opt->pem_pwd, &items, &type); if (!success) { /* caller will log an error */ return false; } if (type != kSecItemTypeAggregate) { MONGOC_ERROR("Cannot work with keys of type %s (%" PRIu32 "). Type is not supported", SecExternalItemType_to_string(type), type); CFRelease(items); return false; } for (CFIndex i = 0; i < CFArrayGetCount(items); ++i) { CFTypeID item_id = CFGetTypeID(CFArrayGetValueAtIndex(items, i)); if (item_id == SecCertificateGetTypeID()) { cert = (SecCertificateRef)CFArrayGetValueAtIndex(items, i); } else if (item_id == SecKeyGetTypeID()) { key = (SecKeyRef)CFArrayGetValueAtIndex(items, i); } } if (!cert || !key) { MONGOC_ERROR("Couldn't find valid private key"); CFRelease(items); return false; } id = SecIdentityCreate(kCFAllocatorDefault, cert, key); secure_transport->my_cert = CFArrayCreateMutable(kCFAllocatorDefault, 2, &kCFTypeArrayCallBacks); CFArrayAppendValue(secure_transport->my_cert, id); CFArrayAppendValue(secure_transport->my_cert, cert); CFRelease(id); /* * Secure Transport assumes the following: * * The certificate references remain valid for the lifetime of the * session. * * The identity specified in certRefs[0] is capable of signing. */ success = !SSLSetCertificate(secure_transport->ssl_ctx_ref, secure_transport->my_cert); TRACE("Setting client certificate %s", success ? "succeeded" : "failed"); CFRelease(items); return success; } bool mongoc_secure_transport_setup_ca(mongoc_stream_tls_secure_transport_t *secure_transport, mongoc_ssl_opt_t *opt) { CFArrayRef items; SecExternalItemType type = kSecItemTypeCertificate; bool success; if (!opt->ca_file) { TRACE("%s", "No CA provided, using defaults"); return false; } success = _mongoc_secure_transport_import_pem(opt->ca_file, NULL, &items, &type); if (!success) { MONGOC_ERROR("Cannot load Certificate Authorities from file \'%s\'", opt->ca_file); return false; } if (type == kSecItemTypeAggregate) { CFMutableArrayRef anchors = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); for (CFIndex i = 0; i < CFArrayGetCount(items); ++i) { CFTypeID item_id = CFGetTypeID(CFArrayGetValueAtIndex(items, i)); if (item_id == SecCertificateGetTypeID()) { CFArrayAppendValue(anchors, CFArrayGetValueAtIndex(items, i)); } } secure_transport->anchors = anchors; CFRelease(items); } else if (type == kSecItemTypeCertificate) { secure_transport->anchors = items; } else { CFRelease(items); } /* This should be SSLSetCertificateAuthorities But the /TLS/ tests fail * when it is */ success = !SSLSetTrustedRoots(secure_transport->ssl_ctx_ref, secure_transport->anchors, true); TRACE("Setting certificate authority %s (%s)", success ? "succeeded" : "failed", opt->ca_file); return success; } OSStatus mongoc_secure_transport_read(SSLConnectionRef connection, void *data, size_t *data_length) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)connection; ssize_t length; ENTRY; errno = 0; /* 4 arguments is *min_bytes* -- This is not a negotiation. * Secure Transport wants all or nothing. We must continue reading until * we get this amount, or timeout */ length = mongoc_stream_read(tls->base_stream, data, *data_length, *data_length, tls->timeout_msec); if (length > 0) { *data_length = length; RETURN(noErr); } if (length == 0) { RETURN(errSSLClosedGraceful); } switch (errno) { case ENOENT: RETURN(errSSLClosedGraceful); break; case ECONNRESET: RETURN(errSSLClosedAbort); break; case EAGAIN: RETURN(errSSLWouldBlock); break; default: RETURN(-36); /* ioErr */ break; } } OSStatus mongoc_secure_transport_write(SSLConnectionRef connection, const void *data, size_t *data_length) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)connection; ssize_t length; ENTRY; errno = 0; length = mongoc_stream_write(tls->base_stream, (void *)data, *data_length, tls->timeout_msec); if (length >= 0) { *data_length = length; RETURN(noErr); } switch (errno) { case EAGAIN: RETURN(errSSLWouldBlock); default: RETURN(-36); /* ioErr */ } } void CFReleaseSafe(CFTypeRef cf) { if (cf != NULL) { CFRelease(cf); } } // CDRIVER-2722: Secure Transport is deprecated on MacOS. END_IGNORE_DEPRECATIONS #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-api-private.h000066400000000000000000000017001511661753600263440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_API_PRIVATE_H #define MONGOC_SERVER_API_PRIVATE_H #include // IWYU pragma: export struct _mongoc_server_api_t { mongoc_server_api_version_t version; mongoc_optional_t strict; mongoc_optional_t deprecation_errors; }; #endif /* MONGOC_SERVER_API_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-api.c000066400000000000000000000052521511661753600246750ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include const char * mongoc_server_api_version_to_string(mongoc_server_api_version_t version) { switch (version) { case MONGOC_SERVER_API_V1: return "1"; default: return NULL; } } bool mongoc_server_api_version_from_string(const char *version, mongoc_server_api_version_t *out) { if (strcmp(version, "1") == 0) { *out = MONGOC_SERVER_API_V1; return true; } return false; } mongoc_server_api_t * mongoc_server_api_new(mongoc_server_api_version_t version) { mongoc_server_api_t *api; api = (mongoc_server_api_t *)bson_malloc0(sizeof(mongoc_server_api_t)); api->version = version; mongoc_optional_init(&api->strict); mongoc_optional_init(&api->deprecation_errors); return api; } mongoc_server_api_t * mongoc_server_api_copy(const mongoc_server_api_t *api) { mongoc_server_api_t *copy; if (!api) { return NULL; } copy = (mongoc_server_api_t *)bson_malloc0(sizeof(mongoc_server_api_t)); copy->version = api->version; mongoc_optional_copy(&api->strict, ©->strict); mongoc_optional_copy(&api->deprecation_errors, ©->deprecation_errors); return copy; } void mongoc_server_api_destroy(mongoc_server_api_t *api) { if (!api) { return; } bson_free(api); } void mongoc_server_api_strict(mongoc_server_api_t *api, bool strict) { BSON_ASSERT(api); mongoc_optional_set_value(&api->strict, strict); } void mongoc_server_api_deprecation_errors(mongoc_server_api_t *api, bool deprecation_errors) { BSON_ASSERT(api); mongoc_optional_set_value(&api->deprecation_errors, deprecation_errors); } const mongoc_optional_t * mongoc_server_api_get_deprecation_errors(const mongoc_server_api_t *api) { BSON_ASSERT(api); return &api->deprecation_errors; } const mongoc_optional_t * mongoc_server_api_get_strict(const mongoc_server_api_t *api) { BSON_ASSERT(api); return &api->strict; } mongoc_server_api_version_t mongoc_server_api_get_version(const mongoc_server_api_t *api) { BSON_ASSERT(api); return api->version; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-api.h000066400000000000000000000040021511661753600246720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_API_H #define MONGOC_SERVER_API_H #include #include #include BSON_BEGIN_DECLS typedef enum { MONGOC_SERVER_API_V1 } mongoc_server_api_version_t; typedef struct _mongoc_server_api_t mongoc_server_api_t; MONGOC_EXPORT(const char *) mongoc_server_api_version_to_string(mongoc_server_api_version_t version); MONGOC_EXPORT(bool) mongoc_server_api_version_from_string(const char *version, mongoc_server_api_version_t *out); MONGOC_EXPORT(mongoc_server_api_t *) mongoc_server_api_new(mongoc_server_api_version_t version) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_server_api_t *) mongoc_server_api_copy(const mongoc_server_api_t *api) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_server_api_destroy(mongoc_server_api_t *api); MONGOC_EXPORT(void) mongoc_server_api_strict(mongoc_server_api_t *api, bool strict); MONGOC_EXPORT(void) mongoc_server_api_deprecation_errors(mongoc_server_api_t *api, bool deprecation_errors); MONGOC_EXPORT(const mongoc_optional_t *) mongoc_server_api_get_deprecation_errors(const mongoc_server_api_t *api); MONGOC_EXPORT(const mongoc_optional_t *) mongoc_server_api_get_strict(const mongoc_server_api_t *api); MONGOC_EXPORT(mongoc_server_api_version_t) mongoc_server_api_get_version(const mongoc_server_api_t *api); BSON_END_DECLS #endif /* MONGOC_SERVER_API_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-description-private.h000066400000000000000000000207531511661753600301270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_DESCRIPTION_PRIVATE_H #define MONGOC_SERVER_DESCRIPTION_PRIVATE_H #include // IWYU pragma: export // #include #include #define MONGOC_DEFAULT_WIRE_VERSION 0 #define MONGOC_DEFAULT_WRITE_BATCH_SIZE 1000 #define MONGOC_DEFAULT_BSON_OBJ_SIZE 16 * 1024 * 1024 #define MONGOC_DEFAULT_MAX_MSG_SIZE 48000000 /* This is slightly out-of-spec as of the current version of the spec (1.0.0), * but SPEC-1397 plans to amend "Size limits and Wire Protocol Considerations" * to say that drivers MAY split with a reduced maxBsonObjectSize or * maxMessageSizeBytes * depending on the implementation. It is less invasive for libmongoc to split * OP_MSG payload type 1 with a reduced maxMessageSizeBytes and convert it to a * payload type 0 * rather than split a payload type 0 with a reduced maxBsonObjectSize. */ #define MONGOC_REDUCED_MAX_MSG_SIZE_FOR_FLE 2097152 #define MONGOC_NO_SESSIONS -1 #define MONGOC_IDLE_WRITE_PERIOD_MS 10 * 1000 /* represent a server or topology with no replica set config version */ #define MONGOC_NO_SET_VERSION -1 #define MONGOC_RTT_UNSET -1 #define MONGOC_NO_SERVER_CONNECTION_ID -1 typedef enum { MONGOC_SERVER_UNKNOWN, MONGOC_SERVER_STANDALONE, MONGOC_SERVER_MONGOS, MONGOC_SERVER_POSSIBLE_PRIMARY, MONGOC_SERVER_RS_PRIMARY, MONGOC_SERVER_RS_SECONDARY, MONGOC_SERVER_RS_ARBITER, MONGOC_SERVER_RS_OTHER, MONGOC_SERVER_RS_GHOST, MONGOC_SERVER_LOAD_BALANCER, MONGOC_SERVER_DESCRIPTION_TYPES, } mongoc_server_description_type_t; struct _mongoc_server_description_t { uint32_t id; mongoc_host_list_t host; int64_t round_trip_time_msec; int64_t last_update_time_usec; bson_t last_hello_response; bool has_hello_response; bool hello_ok; bool opened; const char *connection_address; /* SDAM dictates storing me/hosts/passives/arbiters after being "normalized * to lower-case" Instead, they are stored in the casing they are received, * but compared case insensitively. This should be addressed in CDRIVER-3527. */ const char *me; const char *set_name; bson_error_t error; mongoc_server_description_type_t type; int32_t min_wire_version; int32_t max_wire_version; int32_t max_msg_size; int32_t max_bson_obj_size; int32_t max_write_batch_size; int64_t session_timeout_minutes; /* hosts, passives, and arbiters are stored as a BSON array, but compared * case insensitively. This should be improved in CDRIVER-3527. */ bson_t hosts; bson_t passives; bson_t arbiters; bson_t tags; const char *current_primary; int64_t set_version; bson_oid_t election_id; int64_t last_write_date_ms; bson_t compressors; bson_t topology_version; /* The generation is incremented every time connections to this server should be invalidated. This happens when: 1. a monitor receives a network error 2. an app thread receives any network error before completing a handshake 3. an app thread receives a non-timeout network error after the handshake 4. an app thread receives a "not primary" or "node is recovering" error from a pre-4.2 server. */ /* generation only applies to a server description tied to a connection. * It represents the generation number for this connection. */ uint32_t generation; /* _generation_map_ stores all generations for all service IDs associated * with this server. _generation_map_ is only accessed on the server * description for monitoring. In non-load-balanced mode, there are no * service IDs. The only server generation is mapped from kZeroObjectId */ mongoc_generation_map_t *_generation_map_; bson_oid_t service_id; int64_t server_connection_id; }; /** Get a mutable pointer to the server's generation map */ static BSON_INLINE mongoc_generation_map_t * mc_tpl_sd_generation_map(mongoc_server_description_t *sd) { return sd->_generation_map_; } /** Get a const pointer to the server's generation map */ static BSON_INLINE const mongoc_generation_map_t * mc_tpl_sd_generation_map_const(const mongoc_server_description_t *sd) { return sd->_generation_map_; } /** * @brief Increment the generation number on the given server for the associated * service ID. */ static BSON_INLINE void mc_tpl_sd_increment_generation(mongoc_server_description_t *sd, const bson_oid_t *service_id) { mongoc_generation_map_increment(mc_tpl_sd_generation_map(sd), service_id); } /** * @brief Get the generation number of the given server description for the * associated service ID. */ static BSON_INLINE uint32_t mc_tpl_sd_get_generation(const mongoc_server_description_t *sd, const bson_oid_t *service_id) { return mongoc_generation_map_get(mc_tpl_sd_generation_map_const(sd), service_id); } void mongoc_server_description_init(mongoc_server_description_t *sd, const char *address, uint32_t id); bool mongoc_server_description_has_rs_member(const mongoc_server_description_t *description, const char *address); bool mongoc_server_description_has_set_version(const mongoc_server_description_t *description); bool mongoc_server_description_has_election_id(const mongoc_server_description_t *description); void mongoc_server_description_cleanup(mongoc_server_description_t *sd); void mongoc_server_description_reset(mongoc_server_description_t *sd); void mongoc_server_description_set_state(mongoc_server_description_t *description, mongoc_server_description_type_t type); void mongoc_server_description_set_set_version(mongoc_server_description_t *description, int64_t set_version); void mongoc_server_description_set_election_id(mongoc_server_description_t *description, const bson_oid_t *election_id); void mongoc_server_description_update_rtt(mongoc_server_description_t *server, int64_t rtt_msec); void mongoc_server_description_handle_hello(mongoc_server_description_t *sd, const bson_t *hello_response, int64_t rtt_msec, const bson_error_t *error /* IN */); void mongoc_server_description_filter_stale(const mongoc_server_description_t **sds, size_t sds_len, const mongoc_server_description_t *primary, int64_t heartbeat_frequency_ms, const mongoc_read_prefs_t *read_prefs); void mongoc_server_description_filter_tags(const mongoc_server_description_t **descriptions, size_t description_len, const mongoc_read_prefs_t *read_prefs); /* Compares server descriptions following the "Server Description Equality" * rules. Not all fields are considered. */ bool _mongoc_server_description_equal(const mongoc_server_description_t *sd1, const mongoc_server_description_t *sd2); int mongoc_server_description_topology_version_cmp(const bson_t *tv1, const bson_t *tv2); void mongoc_server_description_set_topology_version(mongoc_server_description_t *sd, const bson_t *tv); bool mongoc_server_description_has_service_id(const mongoc_server_description_t *description); typedef enum { MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_HOST = (1 << 0), MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_PORT = (1 << 1), MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_CONNECTION_ID = (1 << 2), MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVICE_ID = (1 << 3), MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_TYPE = (1 << 4), MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_ADDRESS = (1 << 5), } mongoc_server_description_content_flags_t; bool mongoc_server_description_append_contents_to_bson(const mongoc_server_description_t *sd, bson_t *bson, mongoc_server_description_content_flags_t flags); #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-description.c000066400000000000000000001226371511661753600264560ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ALPHA 0.2 static bool _match_tag_set(const mongoc_server_description_t *sd, bson_iter_t *tag_set_iter); /* Destroy allocated resources within @description, but don't free it */ void mongoc_server_description_cleanup(mongoc_server_description_t *sd) { BSON_ASSERT(sd); bson_destroy(&sd->last_hello_response); bson_destroy(&sd->hosts); bson_destroy(&sd->passives); bson_destroy(&sd->arbiters); bson_destroy(&sd->tags); bson_destroy(&sd->compressors); bson_destroy(&sd->topology_version); mongoc_generation_map_destroy(sd->_generation_map_); } /* Reset fields inside this sd, but keep same id, host information, RTT, generation, topology version, and leave hello in empty inited state */ void mongoc_server_description_reset(mongoc_server_description_t *sd) { BSON_ASSERT(sd); memset(&sd->error, 0, sizeof sd->error); sd->set_name = NULL; sd->type = MONGOC_SERVER_UNKNOWN; sd->min_wire_version = MONGOC_DEFAULT_WIRE_VERSION; sd->max_wire_version = MONGOC_DEFAULT_WIRE_VERSION; sd->max_msg_size = MONGOC_DEFAULT_MAX_MSG_SIZE; sd->max_bson_obj_size = MONGOC_DEFAULT_BSON_OBJ_SIZE; sd->max_write_batch_size = MONGOC_DEFAULT_WRITE_BATCH_SIZE; sd->session_timeout_minutes = MONGOC_NO_SESSIONS; sd->last_write_date_ms = -1; sd->hello_ok = false; /* always leave last hello in an init-ed state until we destroy sd */ bson_destroy(&sd->last_hello_response); bson_init(&sd->last_hello_response); sd->has_hello_response = false; sd->last_update_time_usec = bson_get_monotonic_time(); bson_destroy(&sd->hosts); bson_destroy(&sd->passives); bson_destroy(&sd->arbiters); bson_destroy(&sd->tags); bson_destroy(&sd->compressors); bson_init(&sd->hosts); bson_init(&sd->passives); bson_init(&sd->arbiters); bson_init(&sd->tags); bson_init(&sd->compressors); sd->me = NULL; sd->current_primary = NULL; sd->set_version = MONGOC_NO_SET_VERSION; mcommon_oid_set_zero(&sd->election_id); mcommon_oid_set_zero(&sd->service_id); sd->server_connection_id = MONGOC_NO_SERVER_CONNECTION_ID; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_init -- * * Initialize a new server_description_t. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_server_description_init(mongoc_server_description_t *sd, const char *address, uint32_t id) { ENTRY; BSON_ASSERT(sd); BSON_ASSERT(address); sd->id = id; sd->type = MONGOC_SERVER_UNKNOWN; sd->round_trip_time_msec = MONGOC_RTT_UNSET; sd->generation = 0; sd->opened = false; sd->_generation_map_ = mongoc_generation_map_new(); if (!_mongoc_host_list_from_string(&sd->host, address)) { MONGOC_WARNING("Failed to parse uri for %s", address); return; } sd->connection_address = sd->host.host_and_port; bson_init(&sd->last_hello_response); bson_init(&sd->hosts); bson_init(&sd->passives); bson_init(&sd->arbiters); bson_init(&sd->tags); bson_init(&sd->compressors); bson_init(&sd->topology_version); mongoc_server_description_reset(sd); EXIT; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_destroy -- * * Destroy allocated resources within @description and free * @description. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_server_description_destroy(mongoc_server_description_t *description) { ENTRY; if (!description) { EXIT; } mongoc_server_description_cleanup(description); bson_free(description); EXIT; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_has_rs_member -- * * Return true if this address is included in server's list of rs * members, false otherwise. * * Returns: * true, false * * Side effects: * None * *-------------------------------------------------------------------------- */ bool mongoc_server_description_has_rs_member(const mongoc_server_description_t *server, const char *address) { bson_iter_t member_iter; const bson_t *rs_members[3]; int i; if (server->type != MONGOC_SERVER_UNKNOWN) { rs_members[0] = &server->hosts; rs_members[1] = &server->arbiters; rs_members[2] = &server->passives; for (i = 0; i < 3; i++) { BSON_ASSERT(bson_iter_init(&member_iter, rs_members[i])); while (bson_iter_next(&member_iter)) { if (strcasecmp(address, bson_iter_utf8(&member_iter, NULL)) == 0) { return true; } } } } return false; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_has_set_version -- * * Did this server's hello response have a "setVersion" field? * * Returns: * True if the server description's setVersion is set. * *-------------------------------------------------------------------------- */ bool mongoc_server_description_has_set_version(const mongoc_server_description_t *description) { return description->set_version != MONGOC_NO_SET_VERSION; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_has_election_id -- * * Did this server's hello response have an "electionId" field? * * Returns: * True if the server description's electionId is set. * *-------------------------------------------------------------------------- */ bool mongoc_server_description_has_election_id(const mongoc_server_description_t *description) { return !mcommon_oid_is_zero(&description->election_id); } /* *-------------------------------------------------------------------------- * * mongoc_server_description_id -- * * Get the id of this server. * * Returns: * Server's id. * *-------------------------------------------------------------------------- */ uint32_t mongoc_server_description_id(const mongoc_server_description_t *description) { return description->id; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_host -- * * Return a reference to the host associated with this server description. * * Returns: * This server description's host, a const mongoc_host_list_t *. * *-------------------------------------------------------------------------- */ const mongoc_host_list_t * mongoc_server_description_host(const mongoc_server_description_t *description) { return &((mongoc_server_description_t *)description)->host; } int64_t mongoc_server_description_last_update_time(const mongoc_server_description_t *description) { return description->last_update_time_usec; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_round_trip_time -- * * Get the round trip time of this server, which is the client's * measurement of the duration of a "hello" command. * * Returns: * The server's round trip time in milliseconds. * *-------------------------------------------------------------------------- */ int64_t mongoc_server_description_round_trip_time(const mongoc_server_description_t *description) { return description->round_trip_time_msec; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_type -- * * Get this server's type, one of the types defined in the Server * Discovery And Monitoring Spec. * * Returns: * A string. * *-------------------------------------------------------------------------- */ const char * mongoc_server_description_type(const mongoc_server_description_t *description) { switch (description->type) { case MONGOC_SERVER_UNKNOWN: return "Unknown"; case MONGOC_SERVER_STANDALONE: return "Standalone"; case MONGOC_SERVER_MONGOS: return "Mongos"; case MONGOC_SERVER_POSSIBLE_PRIMARY: return "PossiblePrimary"; case MONGOC_SERVER_RS_PRIMARY: return "RSPrimary"; case MONGOC_SERVER_RS_SECONDARY: return "RSSecondary"; case MONGOC_SERVER_RS_ARBITER: return "RSArbiter"; case MONGOC_SERVER_RS_OTHER: return "RSOther"; case MONGOC_SERVER_RS_GHOST: return "RSGhost"; case MONGOC_SERVER_LOAD_BALANCER: return "LoadBalancer"; case MONGOC_SERVER_DESCRIPTION_TYPES: default: MONGOC_ERROR("Invalid mongoc_server_description_t type"); return "Invalid"; } } /* *-------------------------------------------------------------------------- * * mongoc_server_description_hello_response -- * * Return this server's most recent "hello" command response. * * Returns: * A reference to a BSON document, owned by the server description. * *-------------------------------------------------------------------------- */ const bson_t * mongoc_server_description_hello_response(const mongoc_server_description_t *description) { return &description->last_hello_response; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_set_state -- * * Set the server description's server type. * *-------------------------------------------------------------------------- */ void mongoc_server_description_set_state(mongoc_server_description_t *description, mongoc_server_description_type_t type) { description->type = type; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_set_set_version -- * * Set the replica set version of this server. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_server_description_set_set_version(mongoc_server_description_t *description, int64_t set_version) { description->set_version = set_version; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_set_election_id -- * * Set the election_id of this server. Copies the given ObjectId or, * if it is NULL, zeroes description's election_id. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_server_description_set_election_id(mongoc_server_description_t *description, const bson_oid_t *election_id) { if (election_id) { bson_oid_copy_unsafe(election_id, &description->election_id); } else { mcommon_oid_set_zero(&description->election_id); } } /* *------------------------------------------------------------------------- * * mongoc_server_description_update_rtt -- * * Calculate this server's rtt calculation using an exponentially- * weighted moving average formula. * * Side effects: * None. * * If rtt_msec is MONGOC_RTT_UNSET, the value is not updated. * *------------------------------------------------------------------------- */ void mongoc_server_description_update_rtt(mongoc_server_description_t *server, int64_t rtt_msec) { if (rtt_msec == MONGOC_RTT_UNSET) { return; } if (server->round_trip_time_msec == MONGOC_RTT_UNSET) { server->round_trip_time_msec = rtt_msec; } else { server->round_trip_time_msec = (int64_t)(ALPHA * rtt_msec + (1 - ALPHA) * server->round_trip_time_msec); } } static void _mongoc_server_description_set_error(mongoc_server_description_t *sd, const bson_error_t *error) { if (error && error->code) { memcpy(&sd->error, error, sizeof(bson_error_t)); } else { _mongoc_set_error(&sd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "unknown error calling hello"); } /* Server Discovery and Monitoring Spec: if the server type changes from a * known type to Unknown its RTT is set to null. */ sd->round_trip_time_msec = MONGOC_RTT_UNSET; } /* *------------------------------------------------------------------------- * * Called during SDAM, from topology description's hello handler, or * when handshaking a connection in _mongoc_cluster_stream_for_server. * * If @hello_response is empty, @error must say why hello failed. * *------------------------------------------------------------------------- */ void mongoc_server_description_handle_hello(mongoc_server_description_t *sd, const bson_t *hello_response, int64_t rtt_msec, const bson_error_t *error /* IN */) { bson_iter_t iter; bson_iter_t child; bool is_primary = false; bool is_shard = false; bool is_secondary = false; bool is_arbiter = false; bool is_replicaset = false; bool is_hidden = false; const uint8_t *bytes; uint32_t len; int num_keys = 0; ENTRY; BSON_ASSERT(sd); mongoc_server_description_reset(sd); if (!hello_response) { _mongoc_server_description_set_error(sd, error); EXIT; } bson_destroy(&sd->last_hello_response); bsonBuild(sd->last_hello_response, insert(*hello_response, not(key("speculativeAuthenticate")))); sd->has_hello_response = true; /* Only reinitialize the topology version if we have a hello response. * Resetting a server description should not effect the topology version. */ bson_reinit(&sd->topology_version); BSON_ASSERT(bson_iter_init(&iter, &sd->last_hello_response)); while (bson_iter_next(&iter)) { num_keys++; if (strcmp("ok", bson_iter_key(&iter)) == 0) { if (!bson_iter_as_bool(&iter)) { /* it doesn't really matter what error API we use. the code and * domain will be overwritten. */ (void)_mongoc_cmd_check_ok(hello_response, MONGOC_ERROR_API_VERSION_2, &sd->error); /* TODO CDRIVER-3696: this is an existing bug. If this is handling * a hello reply that is NOT from a handshake, this should not * be considered an auth error. */ /* hello response returned ok: 0. According to auth spec: "If the * hello of the MongoDB Handshake fails with an error, drivers * MUST treat this an authentication error." */ sd->error.domain = MONGOC_ERROR_CLIENT; sd->error.code = MONGOC_ERROR_CLIENT_AUTHENTICATE; _mongoc_set_error_category(&sd->error, MONGOC_ERROR_CATEGORY); GOTO(authfailure); } } else if (strcmp("isWritablePrimary", bson_iter_key(&iter)) == 0 || strcmp(HANDSHAKE_RESPONSE_LEGACY_HELLO, bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { GOTO(typefailure); } is_primary = bson_iter_bool(&iter); } else if (strcmp("helloOk", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { GOTO(typefailure); } sd->hello_ok = bson_iter_bool(&iter); } else if (strcmp("me", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(typefailure); } sd->me = bson_iter_utf8(&iter, NULL); } else if (strcmp("maxMessageSizeBytes", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_INT32(&iter)) { GOTO(typefailure); } sd->max_msg_size = bson_iter_int32(&iter); } else if (strcmp("maxBsonObjectSize", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_INT32(&iter)) { GOTO(typefailure); } sd->max_bson_obj_size = bson_iter_int32(&iter); } else if (strcmp("maxWriteBatchSize", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_INT32(&iter)) { GOTO(typefailure); } sd->max_write_batch_size = bson_iter_int32(&iter); } else if (strcmp("logicalSessionTimeoutMinutes", bson_iter_key(&iter)) == 0) { if (BSON_ITER_HOLDS_NUMBER(&iter)) { sd->session_timeout_minutes = bson_iter_as_int64(&iter); } else if (BSON_ITER_HOLDS_NULL(&iter)) { /* this arises executing standard JSON tests */ sd->session_timeout_minutes = MONGOC_NO_SESSIONS; } else { GOTO(typefailure); } } else if (strcmp("minWireVersion", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_INT32(&iter)) { GOTO(typefailure); } sd->min_wire_version = bson_iter_int32(&iter); } else if (strcmp("maxWireVersion", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_INT32(&iter)) { GOTO(typefailure); } sd->max_wire_version = bson_iter_int32(&iter); } else if (strcmp("msg", bson_iter_key(&iter)) == 0) { const char *msg; if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(typefailure); } msg = bson_iter_utf8(&iter, NULL); if (msg && 0 == strcmp(msg, "isdbgrid")) { is_shard = true; } } else if (strcmp("setName", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(typefailure); } sd->set_name = bson_iter_utf8(&iter, NULL); } else if (strcmp("setVersion", bson_iter_key(&iter)) == 0) { mongoc_server_description_set_set_version(sd, bson_iter_as_int64(&iter)); } else if (strcmp("electionId", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_OID(&iter)) { GOTO(typefailure); } mongoc_server_description_set_election_id(sd, bson_iter_oid(&iter)); } else if (strcmp("secondary", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { GOTO(typefailure); } is_secondary = bson_iter_bool(&iter); } else if (strcmp("hosts", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_ARRAY(&iter)) { GOTO(typefailure); } bson_iter_array(&iter, &len, &bytes); bson_destroy(&sd->hosts); BSON_ASSERT(bson_init_static(&sd->hosts, bytes, len)); } else if (strcmp("passives", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_ARRAY(&iter)) { GOTO(typefailure); } bson_iter_array(&iter, &len, &bytes); bson_destroy(&sd->passives); BSON_ASSERT(bson_init_static(&sd->passives, bytes, len)); } else if (strcmp("arbiters", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_ARRAY(&iter)) { GOTO(typefailure); } bson_iter_array(&iter, &len, &bytes); bson_destroy(&sd->arbiters); BSON_ASSERT(bson_init_static(&sd->arbiters, bytes, len)); } else if (strcmp("primary", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { GOTO(typefailure); } sd->current_primary = bson_iter_utf8(&iter, NULL); } else if (strcmp("arbiterOnly", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { GOTO(typefailure); } is_arbiter = bson_iter_bool(&iter); } else if (strcmp("isreplicaset", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_BOOL(&iter)) { GOTO(typefailure); } is_replicaset = bson_iter_bool(&iter); } else if (strcmp("tags", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { GOTO(typefailure); } bson_iter_document(&iter, &len, &bytes); bson_destroy(&sd->tags); BSON_ASSERT(bson_init_static(&sd->tags, bytes, len)); } else if (strcmp("hidden", bson_iter_key(&iter)) == 0) { is_hidden = bson_iter_bool(&iter); } else if (strcmp("lastWrite", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_DOCUMENT(&iter) || !bson_iter_recurse(&iter, &child) || !bson_iter_find(&child, "lastWriteDate") || !BSON_ITER_HOLDS_DATE_TIME(&child)) { GOTO(typefailure); } sd->last_write_date_ms = bson_iter_date_time(&child); } else if (strcmp("compression", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_ARRAY(&iter)) { GOTO(typefailure); } bson_iter_array(&iter, &len, &bytes); bson_destroy(&sd->compressors); BSON_ASSERT(bson_init_static(&sd->compressors, bytes, len)); } else if (strcmp("topologyVersion", bson_iter_key(&iter)) == 0) { bson_t incoming_topology_version; if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { GOTO(typefailure); } bson_iter_document(&iter, &len, &bytes); BSON_ASSERT(bson_init_static(&incoming_topology_version, bytes, len)); mongoc_server_description_set_topology_version(sd, &incoming_topology_version); bson_destroy(&incoming_topology_version); } else if (strcmp("serviceId", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_OID(&iter)) { GOTO(typefailure); } bson_oid_copy_unsafe(bson_iter_oid(&iter), &sd->service_id); } else if (strcmp("connectionId", bson_iter_key(&iter)) == 0) { if (!BSON_ITER_HOLDS_NUMBER(&iter)) { GOTO(typefailure); } sd->server_connection_id = bson_iter_as_int64(&iter); } } if (is_shard) { sd->type = MONGOC_SERVER_MONGOS; } else if (sd->set_name) { if (is_hidden) { sd->type = MONGOC_SERVER_RS_OTHER; } else if (is_primary) { sd->type = MONGOC_SERVER_RS_PRIMARY; } else if (is_secondary) { sd->type = MONGOC_SERVER_RS_SECONDARY; } else if (is_arbiter) { sd->type = MONGOC_SERVER_RS_ARBITER; } else { sd->type = MONGOC_SERVER_RS_OTHER; } } else if (is_replicaset) { sd->type = MONGOC_SERVER_RS_GHOST; } else if (num_keys > 0) { sd->type = MONGOC_SERVER_STANDALONE; } else { sd->type = MONGOC_SERVER_UNKNOWN; } if (!num_keys) { /* empty reply means hello failed */ _mongoc_server_description_set_error(sd, error); } mongoc_server_description_update_rtt(sd, rtt_msec); EXIT; typefailure: _mongoc_set_error(&sd->error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_INVALID_TYPE, "unexpected type %s for field %s in hello response", _mongoc_bson_type_to_str(bson_iter_type(&iter)), bson_iter_key(&iter)); authfailure: sd->type = MONGOC_SERVER_UNKNOWN; sd->round_trip_time_msec = MONGOC_RTT_UNSET; EXIT; } /* *------------------------------------------------------------------------- * * mongoc_server_description_new_copy -- * * A copy of a server description that you must destroy, or NULL. * *------------------------------------------------------------------------- */ mongoc_server_description_t * mongoc_server_description_new_copy(const mongoc_server_description_t *description) { #define COPY_FIELD(FIELD) \ if (1) { \ copy->FIELD = description->FIELD; \ } else \ (void)0 #define COPY_BSON_FIELD(FIELD) \ if (1) { \ bson_copy_to(&description->FIELD, ©->FIELD); \ } else \ (void)0 // COPY_INTERNAL_BSON_FIELD copies a `bson_t` that references data in `last_hello_response`. #define COPY_INTERNAL_BSON_FIELD(FIELD) \ if (1) { \ if (!bson_empty(&description->FIELD)) { \ ptrdiff_t offset = bson_get_data(&description->FIELD) - bson_get_data(&description->last_hello_response); \ MONGOC_DEBUG_ASSERT(offset >= 0); \ const uint8_t *data = bson_get_data(©->last_hello_response) + offset; \ uint32_t len = description->FIELD.len; \ MONGOC_DEBUG_ASSERT(offset + len <= copy->last_hello_response.len); \ BSON_ASSERT(bson_init_static(©->FIELD, data, len)); \ } else { \ bson_init(©->FIELD); \ } \ } else \ (void)0 // COPY_INTERNAL_STRING_FIELD copies a `const char*` that references data in `last_hello_response`. #define COPY_INTERNAL_STRING_FIELD(FIELD) \ if (1) { \ if (description->FIELD) { \ ptrdiff_t offset = (char *)description->FIELD - (char *)bson_get_data(&description->last_hello_response); \ MONGOC_DEBUG_ASSERT(offset >= 0); \ copy->FIELD = (char *)bson_get_data(©->last_hello_response) + offset; \ MONGOC_DEBUG_ASSERT(offset + strlen(description->FIELD) <= copy->last_hello_response.len); \ } else { \ copy->FIELD = NULL; \ } \ } else \ (void)0 if (!description) { return NULL; } mongoc_server_description_t *copy = BSON_ALIGNED_ALLOC(mongoc_server_description_t); COPY_FIELD(id); COPY_FIELD(host); COPY_FIELD(round_trip_time_msec); COPY_FIELD(last_update_time_usec); COPY_BSON_FIELD(last_hello_response); COPY_FIELD(has_hello_response); COPY_FIELD(hello_ok); copy->connection_address = copy->host.host_and_port; COPY_INTERNAL_STRING_FIELD(me); COPY_FIELD(opened); COPY_INTERNAL_STRING_FIELD(set_name); COPY_FIELD(error); COPY_FIELD(type); COPY_FIELD(min_wire_version); COPY_FIELD(max_wire_version); COPY_FIELD(max_msg_size); COPY_FIELD(max_bson_obj_size); COPY_FIELD(max_write_batch_size); COPY_FIELD(session_timeout_minutes); COPY_INTERNAL_BSON_FIELD(hosts); COPY_INTERNAL_BSON_FIELD(passives); COPY_INTERNAL_BSON_FIELD(arbiters); COPY_INTERNAL_BSON_FIELD(tags); COPY_INTERNAL_STRING_FIELD(current_primary); COPY_FIELD(set_version); COPY_FIELD(election_id); COPY_FIELD(last_write_date_ms); COPY_INTERNAL_BSON_FIELD(compressors); // `topology_version` does not refer to data in `last_hello_response`. It needs to outlive `last_hello_response`. COPY_BSON_FIELD(topology_version); COPY_FIELD(generation); copy->_generation_map_ = mongoc_generation_map_copy(mc_tpl_sd_generation_map_const(description)); COPY_FIELD(service_id); COPY_FIELD(server_connection_id); #undef COPY_INTERNAL_STRING_FIELD #undef COPY_INTERNAL_BSON_FIELD #undef COPY_BSON_FIELD #undef COPY_FIELD return copy; } /* *------------------------------------------------------------------------- * * mongoc_server_description_filter_stale -- * * Estimate servers' staleness according to the Server Selection Spec. * Determines the number of eligible servers, and sets any servers that * are too stale to NULL in the descriptions set. * *------------------------------------------------------------------------- */ void mongoc_server_description_filter_stale(const mongoc_server_description_t **sds, size_t sds_len, const mongoc_server_description_t *primary, int64_t heartbeat_frequency_ms, const mongoc_read_prefs_t *read_prefs) { int64_t max_staleness_seconds; size_t i; int64_t heartbeat_frequency_usec; int64_t max_last_write_date_usec; int64_t staleness_usec; int64_t max_staleness_usec; if (!read_prefs) { /* NULL read_prefs is PRIMARY, no maxStalenessSeconds to filter by */ return; } max_staleness_seconds = mongoc_read_prefs_get_max_staleness_seconds(read_prefs); if (max_staleness_seconds == MONGOC_NO_MAX_STALENESS) { return; } BSON_ASSERT(max_staleness_seconds > 0); max_staleness_usec = max_staleness_seconds * 1000 * 1000; heartbeat_frequency_usec = heartbeat_frequency_ms * 1000; if (primary) { for (i = 0; i < sds_len; i++) { if (!sds[i] || sds[i]->type != MONGOC_SERVER_RS_SECONDARY) { continue; } /* See max-staleness.rst for explanation of these formulae. */ staleness_usec = primary->last_write_date_ms * 1000 + (sds[i]->last_update_time_usec - primary->last_update_time_usec) - sds[i]->last_write_date_ms * 1000 + heartbeat_frequency_usec; if (staleness_usec > max_staleness_usec) { TRACE("Rejected stale RSSecondary [%s]", sds[i]->host.host_and_port); sds[i] = NULL; } } } else { /* find max last_write_date */ max_last_write_date_usec = 0; for (i = 0; i < sds_len; i++) { if (sds[i] && sds[i]->type == MONGOC_SERVER_RS_SECONDARY) { max_last_write_date_usec = BSON_MAX(max_last_write_date_usec, sds[i]->last_write_date_ms * 1000); } } /* use max last_write_date to estimate each secondary's staleness */ for (i = 0; i < sds_len; i++) { if (!sds[i] || sds[i]->type != MONGOC_SERVER_RS_SECONDARY) { continue; } staleness_usec = max_last_write_date_usec - sds[i]->last_write_date_ms * 1000 + heartbeat_frequency_usec; if (staleness_usec > max_staleness_usec) { TRACE("Rejected stale RSSecondary [%s]", sds[i]->host.host_and_port); sds[i] = NULL; } } } } /* *------------------------------------------------------------------------- * * mongoc_server_description_filter_tags -- * * Given a set of server descriptions, set to NULL any that don't * match the read preference's tag sets. * * https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.md#tag_sets * *------------------------------------------------------------------------- */ void mongoc_server_description_filter_tags(const mongoc_server_description_t **descriptions, size_t description_len, const mongoc_read_prefs_t *read_prefs) { const bson_t *rp_tags; bson_iter_t rp_tagset_iter; bson_iter_t tag_set_iter; bool *sd_matched = NULL; bool found; size_t i; if (!read_prefs) { /* NULL read_prefs is PRIMARY, no tags to filter by */ return; } rp_tags = mongoc_read_prefs_get_tags(read_prefs); if (bson_count_keys(rp_tags) == 0) { /* no tags to filter by */ return; } sd_matched = BSON_ARRAY_ALLOC0(description_len, bool); bson_iter_init(&rp_tagset_iter, rp_tags); /* for each read preference tag set */ while (bson_iter_next(&rp_tagset_iter)) { found = false; for (i = 0; i < description_len; i++) { if (!descriptions[i]) { /* NULLed earlier in mongoc_topology_description_suitable_servers */ continue; } BSON_ASSERT(bson_iter_recurse(&rp_tagset_iter, &tag_set_iter)); sd_matched[i] = _match_tag_set(descriptions[i], &tag_set_iter); if (sd_matched[i]) { found = true; } } if (found) { for (i = 0; i < description_len; i++) { if (!sd_matched[i] && descriptions[i]) { TRACE("Rejected [%s] [%s], doesn't match tags", mongoc_server_description_type(descriptions[i]), descriptions[i]->host.host_and_port); descriptions[i] = NULL; } } goto CLEANUP; } } /* tried each */ for (i = 0; i < description_len; i++) { if (!sd_matched[i]) { TRACE("Rejected [%s] [%s], reached end of tags array without match", mongoc_server_description_type(descriptions[i]), descriptions[i]->host.host_and_port); descriptions[i] = NULL; } } CLEANUP: bson_free(sd_matched); } /* *------------------------------------------------------------------------- * * _match_tag_set -- * * Check if a server's tags match one tag set, like * {'tag1': 'value1', 'tag2': 'value2'}. * *------------------------------------------------------------------------- */ static bool _match_tag_set(const mongoc_server_description_t *sd, bson_iter_t *tag_set_iter) { bson_iter_t sd_iter; uint32_t read_pref_tag_len; uint32_t sd_len; const char *read_pref_tag; const char *read_pref_val; const char *server_val; while (bson_iter_next(tag_set_iter)) { /* one {'tag': 'value'} pair from the read preference's tag set */ read_pref_tag = bson_iter_key(tag_set_iter); read_pref_val = bson_iter_utf8(tag_set_iter, &read_pref_tag_len); if (bson_iter_init_find(&sd_iter, &sd->tags, read_pref_tag)) { /* The server has this tag - does it have the right value? */ server_val = bson_iter_utf8(&sd_iter, &sd_len); if (sd_len != read_pref_tag_len || memcmp(read_pref_val, server_val, read_pref_tag_len)) { /* If the values don't match, no match */ return false; } } else { /* If the server description doesn't have that key, no match */ return false; } } return true; } /* *-------------------------------------------------------------------------- * * mongoc_server_description_compressor_id -- * * Get the compressor id if compression was negotiated. * * Returns: * The compressor ID, or -1 if none was negotiated. * *-------------------------------------------------------------------------- */ int32_t mongoc_server_description_compressor_id(const mongoc_server_description_t *description) { int id; bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, &description->compressors)); while (bson_iter_next(&iter)) { id = mongoc_compressor_name_to_id(bson_iter_utf8(&iter, NULL)); if (id != -1) { return id; } } return -1; } /* Returns true if either or both is NULL. out is 1 if exactly one NULL, 0 if * both NULL */ typedef int (*strcmp_fn)(const char *, const char *); static int _nullable_cmp(const char *a, const char *b, strcmp_fn cmp_fn) { if (!a && b) { return 1; } if (a && !b) { return 1; } if (!a && !b) { return 0; } /* Both not NULL. */ return cmp_fn(a, b); } static int _nullable_strcasecmp(const char *a, const char *b) { return _nullable_cmp(a, b, strcasecmp); } static int _nullable_strcmp(const char *a, const char *b) { return _nullable_cmp(a, b, strcmp); } bool _mongoc_server_description_equal(const mongoc_server_description_t *sd1, const mongoc_server_description_t *sd2) { if (sd1->type != sd2->type) { return false; } if (sd1->min_wire_version != sd2->min_wire_version) { return false; } if (sd1->max_wire_version != sd2->max_wire_version) { return false; } if (0 != _nullable_strcasecmp(sd1->me, sd2->me)) { return false; } /* CDRIVER-3527: The hosts/passives/arbiters checks should really be a set * comparison of case insensitive hostnames. */ if (!bson_equal(&sd1->hosts, &sd2->hosts)) { return false; } if (!bson_equal(&sd1->passives, &sd2->passives)) { return false; } if (!bson_equal(&sd1->arbiters, &sd2->arbiters)) { return false; } if (!bson_equal(&sd1->tags, &sd2->tags)) { return false; } if (0 != _nullable_strcmp(sd1->set_name, sd2->set_name)) { return false; } if (sd1->set_version != sd2->set_version) { return false; } if (!bson_oid_equal(&sd1->election_id, &sd2->election_id)) { return false; } if (0 != _nullable_strcasecmp(sd1->current_primary, sd2->current_primary)) { return false; } if (sd1->session_timeout_minutes != sd2->session_timeout_minutes) { return false; } if (sd1->error.domain != sd2->error.domain || sd1->error.code != sd2->error.code || 0 != strncmp(sd1->error.message, sd2->error.message, BSON_ERROR_BUFFER_SIZE)) { return false; } if (!bson_equal(&sd1->topology_version, &sd2->topology_version)) { return false; } return true; } int mongoc_server_description_topology_version_cmp(const bson_t *tv1, const bson_t *tv2) { const bson_oid_t *pid1; const bson_oid_t *pid2; int64_t counter1; int64_t counter2; bson_iter_t iter; BSON_ASSERT(tv1); BSON_ASSERT(tv2); if (bson_empty(tv1) || bson_empty(tv2)) { return -1; } if (!bson_iter_init_find(&iter, tv1, "processId") || !BSON_ITER_HOLDS_OID(&iter)) { return -1; } pid1 = bson_iter_oid(&iter); if (!bson_iter_init_find(&iter, tv2, "processId") || !BSON_ITER_HOLDS_OID(&iter)) { return -1; } pid2 = bson_iter_oid(&iter); if (0 != bson_oid_compare(pid1, pid2)) { /* Assume greater. */ return -1; } if (!bson_iter_init_find(&iter, tv1, "counter") || !BSON_ITER_HOLDS_INT(&iter)) { return -1; } counter1 = bson_iter_as_int64(&iter); if (!bson_iter_init_find(&iter, tv2, "counter") || !BSON_ITER_HOLDS_INT(&iter)) { return -1; } counter2 = bson_iter_as_int64(&iter); if (counter1 < counter2) { return -1; } else if (counter1 > counter2) { return 1; } return 0; } void mongoc_server_description_set_topology_version(mongoc_server_description_t *sd, const bson_t *tv) { BSON_ASSERT(tv); bson_destroy(&sd->topology_version); bson_copy_to(tv, &sd->topology_version); } bool mongoc_server_description_has_service_id(const mongoc_server_description_t *description) { return !mcommon_oid_is_zero(&description->service_id); } bool mongoc_server_description_append_contents_to_bson(const mongoc_server_description_t *sd, bson_t *bson, mongoc_server_description_content_flags_t flags) { BSON_ASSERT_PARAM(sd); BSON_ASSERT_PARAM(bson); if ((flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_HOST) && !BSON_APPEND_UTF8(bson, "serverHost", sd->host.host)) { return false; } if ((flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_PORT) && !BSON_APPEND_INT32(bson, "serverPort", sd->host.port)) { return false; } if ((flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_ADDRESS) && !BSON_APPEND_UTF8(bson, "address", sd->host.host_and_port)) { return false; } if (flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVER_CONNECTION_ID) { int64_t server_connection_id = sd->server_connection_id; if (MONGOC_NO_SERVER_CONNECTION_ID != server_connection_id) { if (!BSON_APPEND_INT64(bson, "serverConnectionId", server_connection_id)) { return false; } } } if (flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_SERVICE_ID) { if (mongoc_server_description_has_service_id(sd)) { char str[25]; bson_oid_to_string(&sd->service_id, str); if (!BSON_APPEND_UTF8(bson, "serviceId", str)) { return false; } } } if ((flags & MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_TYPE) && !BSON_APPEND_UTF8(bson, "type", mongoc_server_description_type(sd))) { return false; } return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-description.h000066400000000000000000000037431511661753600264570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_DESCRIPTION_H #define MONGOC_SERVER_DESCRIPTION_H #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_server_description_t mongoc_server_description_t; MONGOC_EXPORT(void) mongoc_server_description_destroy(mongoc_server_description_t *description); MONGOC_EXPORT(mongoc_server_description_t *) mongoc_server_description_new_copy(const mongoc_server_description_t *description) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(uint32_t) mongoc_server_description_id(const mongoc_server_description_t *description); MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_server_description_host(const mongoc_server_description_t *description); MONGOC_EXPORT(int64_t) mongoc_server_description_last_update_time(const mongoc_server_description_t *description); MONGOC_EXPORT(int64_t) mongoc_server_description_round_trip_time(const mongoc_server_description_t *description); MONGOC_EXPORT(const char *) mongoc_server_description_type(const mongoc_server_description_t *description); MONGOC_EXPORT(const bson_t *) mongoc_server_description_hello_response(const mongoc_server_description_t *description); MONGOC_EXPORT(int32_t) mongoc_server_description_compressor_id(const mongoc_server_description_t *description); BSON_END_DECLS #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-monitor-private.h000066400000000000000000000036521511661753600272720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_MONITOR_PRIVATE_H #define MONGOC_SERVER_MONITOR_PRIVATE_H #include #include #include /* For background monitoring of a single server. */ typedef enum { MONGOC_SERVER_MONITORING_AUTO = 0, MONGOC_SERVER_MONITORING_POLL, MONGOC_SERVER_MONITORING_STREAM } mongoc_server_monitoring_mode_t; typedef struct _mongoc_server_monitor_t mongoc_server_monitor_t; mongoc_server_monitor_t * mongoc_server_monitor_new(mongoc_topology_t *topology, mongoc_topology_description_t *td, mongoc_server_description_t *init_description); void mongoc_server_monitor_request_cancel(mongoc_server_monitor_t *server_monitor); void mongoc_server_monitor_request_scan(mongoc_server_monitor_t *server_monitor); bool mongoc_server_monitor_request_shutdown(mongoc_server_monitor_t *server_monitor); void mongoc_server_monitor_wait_for_shutdown(mongoc_server_monitor_t *server_monitor); void mongoc_server_monitor_destroy(mongoc_server_monitor_t *server_monitor); void mongoc_server_monitor_run(mongoc_server_monitor_t *server_monitor); void mongoc_server_monitor_run_as_rtt(mongoc_server_monitor_t *server_monitor); #endif /* MONGOC_SERVER_MONITOR_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-monitor.c000066400000000000000000001435641511661753600256240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "monitor" typedef enum { MONGOC_THREAD_OFF = 0, MONGOC_THREAD_RUNNING, MONGOC_THREAD_SHUTTING_DOWN, MONGOC_THREAD_JOINABLE } thread_state_t; /* Use a signed and wide return type for timeouts as long as you can. Cast only * when you know what you're doing with it. */ static int64_t _now_us(void) { return bson_get_monotonic_time(); } static int64_t _now_ms(void) { return _now_us() / 1000; } struct _mongoc_server_monitor_t { mongoc_topology_t *topology; bson_thread_t thread; /* State accessed from multiple threads. */ struct { bson_mutex_t mutex; mongoc_cond_t cond; thread_state_t state; bool scan_requested; bool cancel_requested; } shared; /* Default time to sleep between hello checks (reduced when a scan is * requested) */ int64_t heartbeat_frequency_ms; /* The minimum time to sleep between hello checks. */ int64_t min_heartbeat_frequency_ms; int64_t connect_timeout_ms; bool use_tls; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t *ssl_opts; #endif mongoc_uri_t *uri; /* A custom initiator may be set if a user provides overrides to create a * stream. */ mongoc_stream_initiator_t initiator; void *initiator_context; int32_t request_id; mongoc_stream_t *stream; bool more_to_come; mongoc_server_description_t *description; uint32_t server_id; bool is_rtt; mongoc_server_monitoring_mode_t mode; }; static BSON_GNUC_PRINTF(3, 4) void _server_monitor_log(mongoc_server_monitor_t *server_monitor, mongoc_log_level_t level, const char *format, ...) { va_list ap; char *msg; va_start(ap, format); msg = bson_strdupv_printf(format, ap); va_end(ap); mongoc_log(level, MONGOC_LOG_DOMAIN, "[%s%s] %s", server_monitor->description->host.host_and_port, server_monitor->is_rtt ? "-RTT" : "", msg); bson_free(msg); } #define MONITOR_LOG(sm, ...) \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED) { \ _server_monitor_log(sm, MONGOC_LOG_LEVEL_TRACE, __VA_ARGS__); \ } \ mlib_diagnostic_pop(); \ } else \ ((void)0) /* TODO CDRIVER-3710 use MONGOC_LOG_LEVEL_ERROR */ #define MONITOR_LOG_ERROR(sm, ...) _server_monitor_log(sm, MONGOC_LOG_LEVEL_DEBUG, __VA_ARGS__) static void _server_monitor_heartbeat_started(mongoc_server_monitor_t *server_monitor, bool awaited) { mongoc_apm_server_heartbeat_started_t event; mongoc_log_and_monitor_instance_t *log_and_monitor = &server_monitor->topology->log_and_monitor; { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(server_monitor)->topology); bson_oid_t topology_id; bson_oid_copy(&td.ptr->topology_id, &topology_id); mc_tpld_drop_ref(&td); mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat started", oid("topologyId", &topology_id), server_description(server_monitor->description, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID), boolean("awaited", awaited)); } MONGOC_DEBUG_ASSERT(!mcommon_mutex_is_locked(&log_and_monitor->apm_mutex)); if (!log_and_monitor->apm_callbacks.server_heartbeat_started) { return; } event.host = &server_monitor->description->host; event.context = log_and_monitor->apm_context; MONITOR_LOG(server_monitor, "%s heartbeat started", awaited ? "awaitable" : "regular"); event.awaited = awaited; bson_mutex_lock(&log_and_monitor->apm_mutex); log_and_monitor->apm_callbacks.server_heartbeat_started(&event); bson_mutex_unlock(&log_and_monitor->apm_mutex); } static void _server_monitor_heartbeat_succeeded(mongoc_server_monitor_t *server_monitor, const bson_t *reply, int64_t duration_usec, bool awaited) { mongoc_apm_server_heartbeat_succeeded_t event; mongoc_log_and_monitor_instance_t *log_and_monitor = &server_monitor->topology->log_and_monitor; { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(server_monitor)->topology); bson_oid_t topology_id; bson_oid_copy(&td.ptr->topology_id, &topology_id); mc_tpld_drop_ref(&td); mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat succeeded", oid("topologyId", &topology_id), server_description(server_monitor->description, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID), boolean("awaited", awaited), monotonic_time_duration(duration_usec), bson_as_json("reply", reply)); } if (!log_and_monitor->apm_callbacks.server_heartbeat_succeeded) { return; } event.host = &server_monitor->description->host; event.context = log_and_monitor->apm_context; event.reply = reply; event.duration_usec = duration_usec; MONITOR_LOG(server_monitor, "%s heartbeat succeeded", awaited ? "awaitable" : "regular"); event.awaited = awaited; bson_mutex_lock(&log_and_monitor->apm_mutex); log_and_monitor->apm_callbacks.server_heartbeat_succeeded(&event); bson_mutex_unlock(&log_and_monitor->apm_mutex); } static void _server_monitor_heartbeat_failed(mongoc_server_monitor_t *server_monitor, const bson_error_t *error, int64_t duration_usec, bool awaited) { mongoc_apm_server_heartbeat_failed_t event; mongoc_log_and_monitor_instance_t *log_and_monitor = &server_monitor->topology->log_and_monitor; { mc_shared_tpld td = mc_tpld_take_ref(BSON_ASSERT_PTR_INLINE(server_monitor)->topology); bson_oid_t topology_id; bson_oid_copy(&td.ptr->topology_id, &topology_id); mc_tpld_drop_ref(&td); mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat failed", oid("topologyId", &topology_id), server_description(server_monitor->description, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID), boolean("awaited", awaited), monotonic_time_duration(duration_usec), error("failure", error)); } if (!log_and_monitor->apm_callbacks.server_heartbeat_failed) { return; } event.host = &server_monitor->description->host; event.context = log_and_monitor->apm_context; event.error = error; event.duration_usec = duration_usec; MONITOR_LOG(server_monitor, "%s heartbeat failed", awaited ? "awaitable" : "regular"); event.awaited = awaited; bson_mutex_lock(&log_and_monitor->apm_mutex); log_and_monitor->apm_callbacks.server_heartbeat_failed(&event); bson_mutex_unlock(&log_and_monitor->apm_mutex); } static bool _server_monitor_send_and_recv_hello_opmsg(mongoc_server_monitor_t *server_monitor, const bson_t *cmd, bson_t *reply, bson_error_t *error) { bool ret = false; mcd_rpc_message *const rpc = mcd_rpc_message_new(); mongoc_buffer_t buffer; _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; /* First, let's construct and send our OP_MSG: */ { int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(rpc, 0); message_length += mcd_rpc_header_set_request_id(rpc, server_monitor->request_id++); message_length += mcd_rpc_header_set_response_to(rpc, 0); message_length += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_MSG); mcd_rpc_op_msg_set_sections_count(rpc, 1u); message_length += mcd_rpc_op_msg_set_flag_bits(rpc, MONGOC_OP_MSG_FLAG_NONE); message_length += mcd_rpc_op_msg_section_set_kind(rpc, 0u, 0); message_length += mcd_rpc_op_msg_section_set_body(rpc, 0u, bson_get_data(cmd)); mcd_rpc_message_set_length(rpc, message_length); } size_t num_iovecs = 0u; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); MONITOR_LOG(server_monitor, "sending with timeout %" PRId64, server_monitor->connect_timeout_ms); mcd_rpc_message_egress(rpc); if (!_mongoc_stream_writev_full( server_monitor->stream, iovecs, num_iovecs, server_monitor->connect_timeout_ms, error)) { MONITOR_LOG_ERROR(server_monitor, "failed to write polling hello: %s", error->message); goto fail; } /* Done sending! Now, receive the reply: */ if (!_mongoc_buffer_append_from_stream( &buffer, server_monitor->stream, sizeof(int32_t), server_monitor->connect_timeout_ms, error)) { goto fail; } const int32_t message_length = mlib_read_i32le(buffer.data); // msgHeader consists of four int32 fields. const int32_t message_header_length = 4u * sizeof(int32_t); if (message_length < message_header_length) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: message length"); goto fail; } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); if (!_mongoc_buffer_append_from_stream( &buffer, server_monitor->stream, remaining_bytes, server_monitor->connect_timeout_ms, error)) { goto fail; } mcd_rpc_message_reset(rpc); if (!mcd_rpc_message_from_data_in_place(rpc, buffer.data, buffer.len, NULL)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: malformed message"); goto fail; } mcd_rpc_message_ingress(rpc); if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: decompression failure"); goto fail; } bson_t body; if (!mcd_rpc_message_get_body(rpc, &body)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: malformed body"); goto fail; } bson_copy_to(&body, reply); bson_destroy(&body); ret = true; fail: if (!ret) { bson_init(reply); } bson_free(decompressed_data); _mongoc_buffer_destroy(&buffer); bson_free(iovecs); mcd_rpc_message_destroy(rpc); return ret; } static bool _server_monitor_send_and_recv_opquery(mongoc_server_monitor_t *server_monitor, const bson_t *cmd, bson_t *reply, bson_error_t *error) { bool ret = false; mcd_rpc_message *const rpc = mcd_rpc_message_new(); size_t num_iovecs = 0u; mongoc_iovec_t *iovecs = NULL; mongoc_buffer_t buffer; _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; { int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(rpc, 0); message_length += mcd_rpc_header_set_request_id(rpc, server_monitor->request_id++); message_length += mcd_rpc_header_set_response_to(rpc, 0); message_length += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_QUERY); message_length += mcd_rpc_op_query_set_flags(rpc, MONGOC_OP_QUERY_FLAG_SECONDARY_OK); message_length += mcd_rpc_op_query_set_full_collection_name(rpc, "admin.$cmd"); message_length += mcd_rpc_op_query_set_number_to_skip(rpc, 0); message_length += mcd_rpc_op_query_set_number_to_return(rpc, -1); message_length += mcd_rpc_op_query_set_query(rpc, bson_get_data(cmd)); mcd_rpc_message_set_length(rpc, message_length); } iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); mcd_rpc_message_egress(rpc); if (!_mongoc_stream_writev_full( server_monitor->stream, iovecs, num_iovecs, server_monitor->connect_timeout_ms, error)) { goto fail; } if (!_mongoc_buffer_append_from_stream( &buffer, server_monitor->stream, sizeof(int32_t), server_monitor->connect_timeout_ms, error)) { goto fail; } const int32_t message_length = mlib_read_i32le(buffer.data); // msgHeader consists of four int32 fields. const int32_t message_header_length = 4u * sizeof(int32_t); if (message_length < message_header_length) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: message length"); goto fail; } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); if (!_mongoc_buffer_append_from_stream( &buffer, server_monitor->stream, remaining_bytes, server_monitor->connect_timeout_ms, error)) { goto fail; } mcd_rpc_message_reset(rpc); if (!mcd_rpc_message_from_data_in_place(rpc, buffer.data, buffer.len, NULL)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: malformed message"); goto fail; } mcd_rpc_message_ingress(rpc); if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: decompression failure"); goto fail; } bson_t body; if (!mcd_rpc_message_get_body(rpc, &body)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "invalid reply from server: malformed body"); goto fail; } bson_copy_to(&body, reply); bson_destroy(&body); ret = true; fail: if (!ret) { bson_init(reply); } bson_free(decompressed_data); _mongoc_buffer_destroy(&buffer); bson_free(iovecs); mcd_rpc_message_destroy(rpc); return ret; } static bool _server_monitor_send_and_recv(mongoc_server_monitor_t *server_monitor, bson_t *cmd, bson_t *reply, bson_error_t *error) { if (mongoc_topology_uses_server_api(server_monitor->topology) || mongoc_topology_uses_loadbalanced(server_monitor->topology)) { /* OP_MSG requires a "db" parameter: */ bson_append_utf8(cmd, "$db", 3, "admin", 5); return _server_monitor_send_and_recv_hello_opmsg(server_monitor, cmd, reply, error); } else { return _server_monitor_send_and_recv_opquery(server_monitor, cmd, reply, error); } } static bool _server_monitor_polling_hello(mongoc_server_monitor_t *server_monitor, bool hello_ok, bson_t *hello_response, bson_error_t *error) { bson_t cmd; const bson_t *hello; bool ret; hello = _mongoc_topology_scanner_get_monitoring_cmd(server_monitor->topology->scanner, hello_ok); bson_copy_to(hello, &cmd); ret = _server_monitor_send_and_recv(server_monitor, &cmd, hello_response, error); bson_destroy(&cmd); return ret; } static bool _server_monitor_awaitable_hello_send(mongoc_server_monitor_t *server_monitor, bson_t *cmd, bson_error_t *error) { bool ret = false; mcd_rpc_message *const rpc = mcd_rpc_message_new(); { int32_t message_length = 0; message_length += mcd_rpc_header_set_message_length(rpc, 0); message_length += mcd_rpc_header_set_request_id(rpc, server_monitor->request_id++); message_length += mcd_rpc_header_set_response_to(rpc, 0); message_length += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_MSG); mcd_rpc_op_msg_set_sections_count(rpc, 1); message_length += mcd_rpc_op_msg_set_flag_bits(rpc, MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED); message_length += mcd_rpc_op_msg_section_set_kind(rpc, 0u, 0); message_length += mcd_rpc_op_msg_section_set_body(rpc, 0u, bson_get_data(cmd)); mcd_rpc_message_set_length(rpc, message_length); } size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); BSON_ASSERT(iovecs); MONITOR_LOG(server_monitor, "sending with timeout %" PRId64, server_monitor->connect_timeout_ms); mcd_rpc_message_egress(rpc); if (!_mongoc_stream_writev_full( server_monitor->stream, iovecs, num_iovecs, server_monitor->connect_timeout_ms, error)) { MONITOR_LOG_ERROR(server_monitor, "failed to write awaitable hello: %s", error->message); goto done; } ret = true; done: bson_free(iovecs); mcd_rpc_message_destroy(rpc); return ret; } /* Poll the server monitor stream for reading. Allows cancellation. * * Called only from server monitor thread. * Locks server monitor mutex. * Returns true if stream is readable. False on error or cancellation. * On cancellation, no error is set, but cancelled is set to true. */ static bool _server_monitor_poll_with_interrupt(mongoc_server_monitor_t *server_monitor, int64_t expire_at_ms, bool *cancelled, bson_error_t *error) { /* How many milliseconds we should poll for on each tick. * On every tick, check whether the awaitable hello was cancelled. */ const int32_t monitor_tick_ms = MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS; int64_t timeleft_ms; while ((timeleft_ms = expire_at_ms - _now_ms()) > 0) { ssize_t ret; mongoc_stream_poll_t poller[1]; MONITOR_LOG(server_monitor, "_server_monitor_poll_with_interrupt expires in: %" PRId64 "ms", timeleft_ms); poller[0].stream = server_monitor->stream; poller[0].events = POLLIN; /* POLLERR and POLLHUP are added in mongoc_socket_poll. */ poller[0].revents = 0; MONITOR_LOG(server_monitor, "polling for awaitable hello reply with timeleft_ms: %" PRId64, timeleft_ms); ret = mongoc_stream_poll(poller, 1, (int32_t)BSON_MIN(timeleft_ms, monitor_tick_ms)); if (ret == -1) { MONITOR_LOG(server_monitor, "mongoc_stream_poll error"); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "poll error"); return false; } if (poller[0].revents & (POLLERR | POLLHUP)) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "connection closed while polling"); return false; } /* Check for cancellation. */ bson_mutex_lock(&server_monitor->shared.mutex); *cancelled = server_monitor->shared.cancel_requested; server_monitor->shared.cancel_requested = false; bson_mutex_unlock(&server_monitor->shared.mutex); if (*cancelled) { MONITOR_LOG(server_monitor, "polling cancelled"); return false; } if (poller[0].revents & POLLIN) { MONITOR_LOG(server_monitor, "mongoc_stream_poll ready to read"); return true; } } _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "connection timeout while polling"); return false; } /* Calculate the timeout between the current time and an absolute expiration * time in milliseconds. * * Returns 0 and sets error if time expired. */ int64_t _get_timeout_ms(int64_t expire_at_ms, bson_error_t *error) { int64_t timeout_ms; timeout_ms = expire_at_ms - _now_ms(); if (timeout_ms <= 0) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "connection timed out reading message length"); return 0; } return timeout_ms; } /* Receive an awaitable hello reply. * * May be used to receive additional replies when moreToCome is set. * Called only from server monitor thread. * May lock server monitor mutex in functions that are called. * May block for up to heartbeatFrequencyMS + connectTimeoutMS waiting for * reply. * Returns true if a reply was received. False on error or cancellation. * On cancellation, no error is set, but cancelled is set to true. */ static bool _server_monitor_awaitable_hello_recv(mongoc_server_monitor_t *server_monitor, bson_t *hello_response, bool *cancelled, bson_error_t *error) { bool ret = false; int64_t timeout_ms; mcd_rpc_message *const rpc = mcd_rpc_message_new(); mongoc_buffer_t buffer; _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); void *decompressed_data = NULL; size_t decompressed_data_len = 0u; const int64_t expire_at_ms = _now_ms() + server_monitor->heartbeat_frequency_ms + server_monitor->connect_timeout_ms; if (!_server_monitor_poll_with_interrupt(server_monitor, expire_at_ms, cancelled, error)) { GOTO(fail); } timeout_ms = _get_timeout_ms(expire_at_ms, error); if (timeout_ms == 0) { GOTO(fail); } MONITOR_LOG(server_monitor, "reading first 4 bytes with timeout: %" PRId64, timeout_ms); if (!_mongoc_buffer_append_from_stream( &buffer, server_monitor->stream, sizeof(int32_t), (int32_t)timeout_ms, error)) { GOTO(fail); } const int32_t message_length = mlib_read_i32le(buffer.data); // msgHeader consists of four int32 fields. const int32_t message_header_length = 4u * sizeof(int32_t); if ((message_length < message_header_length) || (message_length > server_monitor->description->max_msg_size)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "message size %" PRId32 " is not within expected range 16-%" PRId32 " bytes", message_length, server_monitor->description->max_msg_size); GOTO(fail); } timeout_ms = _get_timeout_ms(expire_at_ms, error); if (timeout_ms == 0) { GOTO(fail); } const size_t remaining_bytes = (size_t)message_length - sizeof(int32_t); MONITOR_LOG(server_monitor, "reading remaining %zu bytes. Timeout %" PRId64, remaining_bytes, timeout_ms); if (!_mongoc_buffer_append_from_stream(&buffer, server_monitor->stream, remaining_bytes, timeout_ms, error)) { GOTO(fail); } if (!mcd_rpc_message_from_data_in_place(rpc, buffer.data, buffer.len, NULL)) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed message from server"); GOTO(fail); } mcd_rpc_message_ingress(rpc); if (!mcd_rpc_message_decompress_if_necessary(rpc, &decompressed_data, &decompressed_data_len)) { _mongoc_set_error(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "decompression failure"); GOTO(fail); } bson_t body; if (!mcd_rpc_message_get_body(rpc, &body)) { _mongoc_set_error( error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "malformed BSON payload from server"); GOTO(fail); } bson_copy_to(&body, hello_response); bson_destroy(&body); server_monitor->more_to_come = (mcd_rpc_op_msg_get_flag_bits(rpc) & MONGOC_OP_MSG_FLAG_MORE_TO_COME) != 0; ret = true; fail: if (!ret) { bson_init(hello_response); } bson_free(decompressed_data); _mongoc_buffer_destroy(&buffer); mcd_rpc_message_destroy(rpc); return ret; } /* Send and receive an awaitable hello. * * Called only from server monitor thread. * May lock server monitor mutex in functions that are called. * May block for up to heartbeatFrequencyMS waiting for reply. */ static bool _server_monitor_awaitable_hello(mongoc_server_monitor_t *server_monitor, const mongoc_server_description_t *description, bson_t *hello_response, bool *cancelled, bson_error_t *error) { bson_t cmd; const bson_t *hello; bool ret = false; hello = _mongoc_topology_scanner_get_monitoring_cmd(server_monitor->topology->scanner, description->hello_ok); bson_copy_to(hello, &cmd); bson_append_document(&cmd, "topologyVersion", 15, &description->topology_version); bson_append_int64(&cmd, "maxAwaitTimeMS", 14, server_monitor->heartbeat_frequency_ms); bson_append_utf8(&cmd, "$db", 3, "admin", 5); if (!_server_monitor_awaitable_hello_send(server_monitor, &cmd, error)) { GOTO(fail); } if (!_server_monitor_awaitable_hello_recv(server_monitor, hello_response, cancelled, error)) { bson_destroy(hello_response); GOTO(fail); } ret = true; fail: if (!ret) { bson_init(hello_response); } bson_destroy(&cmd); return ret; } /* Update the topology description with a reply or an error. * * Called only from server monitor thread. * Caller must hold no locks. * Locks server monitor mutex. */ static void _update_topology_description(mongoc_server_monitor_t *server_monitor, mongoc_server_description_t *description) { mongoc_topology_t *topology; bson_t *hello_response = NULL; mc_tpld_modification tdmod; topology = server_monitor->topology; if (description->has_hello_response) { hello_response = &description->last_hello_response; } if (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) == MONGOC_TOPOLOGY_SCANNER_SHUTTING_DOWN) { return; } tdmod = mc_tpld_modify_begin(topology); bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.scan_requested = false; bson_mutex_unlock(&server_monitor->shared.mutex); mongoc_topology_description_handle_hello(tdmod.new_td, &topology->log_and_monitor, server_monitor->server_id, hello_response, description->round_trip_time_msec, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, &description->error); /* Reconcile server monitors. */ _mongoc_topology_background_monitoring_reconcile(topology, tdmod.new_td); /* Wake threads performing server selection. */ mongoc_cond_broadcast(&server_monitor->topology->cond_client); mc_tpld_modify_commit(tdmod); } /* Get the mode enum based on the uri * * Called during server monitor creation */ static mongoc_server_monitoring_mode_t _server_monitor_get_mode_enum(mongoc_server_monitor_t *server_monitor) { const char *mode_str = mongoc_uri_get_server_monitoring_mode(server_monitor->uri); if (strcmp(mode_str, "poll") == 0) { return MONGOC_SERVER_MONITORING_POLL; } else if (strcmp(mode_str, "stream") == 0) { return MONGOC_SERVER_MONITORING_STREAM; } else { return MONGOC_SERVER_MONITORING_AUTO; } } /* Create a new server monitor. * * Called during reconcile. * Caller must hold topology lock. */ mongoc_server_monitor_t * mongoc_server_monitor_new(mongoc_topology_t *topology, mongoc_topology_description_t *td, mongoc_server_description_t *init_description) { mongoc_server_monitor_t *server_monitor = bson_malloc0(sizeof(*server_monitor)); server_monitor->description = mongoc_server_description_new_copy(init_description); server_monitor->server_id = init_description->id; server_monitor->topology = topology; server_monitor->heartbeat_frequency_ms = td->heartbeat_msec; server_monitor->min_heartbeat_frequency_ms = topology->min_heartbeat_frequency_msec; server_monitor->connect_timeout_ms = topology->connect_timeout_msec; server_monitor->uri = mongoc_uri_copy(topology->uri); /* TODO CDRIVER-3682: Do not retrieve ssl opts from topology scanner. They * should be stored somewhere else. */ #ifdef MONGOC_ENABLE_SSL if (topology->scanner->ssl_opts) { server_monitor->ssl_opts = bson_malloc0(sizeof(mongoc_ssl_opt_t)); _mongoc_ssl_opts_copy_to(topology->scanner->ssl_opts, server_monitor->ssl_opts, true); } #endif server_monitor->initiator = topology->scanner->initiator; server_monitor->initiator_context = topology->scanner->initiator_context; server_monitor->mode = _server_monitor_get_mode_enum(server_monitor); mongoc_cond_init(&server_monitor->shared.cond); bson_mutex_init(&server_monitor->shared.mutex); return server_monitor; } /* Creates a stream and performs the initial hello handshake. * * Called only by server monitor thread. * Returns true if both connection and handshake succeeds. * Returns false and sets error otherwise. * hello_response is always initialized. */ static bool _server_monitor_setup_connection(mongoc_server_monitor_t *server_monitor, bson_t *hello_response, int64_t *start_us, bson_error_t *error) { bson_t cmd = BSON_INITIALIZER; bool ret = false; ENTRY; BSON_ASSERT(!server_monitor->stream); bson_init(hello_response); server_monitor->more_to_come = false; /* Using an initiator isn't really necessary. Users can't set them on * pools. But it is used for tests. */ if (server_monitor->initiator) { server_monitor->stream = server_monitor->initiator( server_monitor->uri, &server_monitor->description->host, server_monitor->initiator_context, error); } else { void *ssl_opts_void = NULL; void *openssl_ctx_void = NULL; mongoc_shared_ptr secure_channel_cred_ptr = MONGOC_SHARED_PTR_NULL; #ifdef MONGOC_ENABLE_SSL ssl_opts_void = server_monitor->ssl_opts; #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L openssl_ctx_void = server_monitor->topology->scanner->openssl_ctx; #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) secure_channel_cred_ptr = server_monitor->topology->scanner->secure_channel_cred_ptr; #endif server_monitor->stream = mongoc_client_connect(ssl_opts_void != NULL, ssl_opts_void, server_monitor->uri, &server_monitor->description->host, openssl_ctx_void, secure_channel_cred_ptr, error); } if (!server_monitor->stream) { GOTO(fail); } /* Update the start time just before the handshake. */ *start_us = _now_us(); /* Perform handshake. */ bson_destroy(&cmd); _mongoc_topology_dup_handshake_cmd(server_monitor->topology, &cmd); bson_destroy(hello_response); ret = _server_monitor_send_and_recv(server_monitor, &cmd, hello_response, error); fail: bson_destroy(&cmd); RETURN(ret); } /** * @brief Perform a hello check on a server * * @param server_monitor The server monitor for this server. * @param previous_description The most recent view of the description of this * server. * @param cancelled Output parameter: Whether the monitor check is cancelled. * @return mongoc_server_description_t* The newly created updated server * description. * * @note May update the topology description associated with the server monitor. * * @note In case of error, returns a new server description with the error * information, but with no hello reply. */ static mongoc_server_description_t * _server_monitor_check_server(mongoc_server_monitor_t *server_monitor, const mongoc_server_description_t *previous_description, bool *cancelled) { bool ret = false; bson_error_t error; bson_t hello_response; int64_t duration_us; int64_t start_us; bool command_or_network_error = false; bool awaited = false; mongoc_server_description_t *description; mc_tpld_modification tdmod; ENTRY; *cancelled = false; memset(&error, 0, sizeof(bson_error_t)); description = BSON_ALIGNED_ALLOC0(mongoc_server_description_t); mongoc_server_description_init( description, server_monitor->description->connection_address, server_monitor->description->id); start_us = _now_us(); if (!server_monitor->stream) { MONITOR_LOG(server_monitor, "setting up connection"); awaited = false; _server_monitor_heartbeat_started(server_monitor, awaited); ret = _server_monitor_setup_connection(server_monitor, &hello_response, &start_us, &error); GOTO(exit); } if (server_monitor->more_to_come) { awaited = true; /* Publish a heartbeat started for each additional response read. */ _server_monitor_heartbeat_started(server_monitor, awaited); MONITOR_LOG(server_monitor, "more to come"); ret = _server_monitor_awaitable_hello_recv(server_monitor, &hello_response, cancelled, &error); GOTO(exit); } if (server_monitor->mode != MONGOC_SERVER_MONITORING_POLL && !bson_empty(&previous_description->topology_version) && (_mongoc_handshake_get()->env == MONGOC_HANDSHAKE_ENV_NONE || server_monitor->mode == MONGOC_SERVER_MONITORING_STREAM)) { // Use stream monitoring if: // - serverMonitoringMode != "poll" // - Server supports stream monitoring (indicated by `topologyVersion`). // - ONE OF: // - Application is not in an FaaS environment (e.g. AWS Lambda). // - serverMonitoringMode == "stream" awaited = true; _server_monitor_heartbeat_started(server_monitor, awaited); MONITOR_LOG(server_monitor, "awaitable hello"); ret = _server_monitor_awaitable_hello(server_monitor, previous_description, &hello_response, cancelled, &error); GOTO(exit); } MONITOR_LOG(server_monitor, "polling hello"); awaited = false; _server_monitor_heartbeat_started(server_monitor, awaited); ret = _server_monitor_polling_hello(server_monitor, previous_description->hello_ok, &hello_response, &error); exit: duration_us = _now_us() - start_us; MONITOR_LOG(server_monitor, "server check duration (us): %" PRId64, duration_us); /* If ret is true, we have a reply. Check if "ok": 1. */ if (ret && _mongoc_cmd_check_ok(&hello_response, MONGOC_ERROR_API_VERSION_2, &error)) { int64_t rtt_ms = MONGOC_RTT_UNSET; /* rtt remains MONGOC_RTT_UNSET if awaited. */ if (!awaited) { rtt_ms = duration_us / 1000; } mongoc_server_description_handle_hello(description, &hello_response, rtt_ms, NULL); /* If the hello reply could not be parsed, consider this a command * error. */ if (description->error.code) { MONITOR_LOG_ERROR(server_monitor, "error parsing server reply: %s", description->error.message); command_or_network_error = true; _server_monitor_heartbeat_failed(server_monitor, &description->error, duration_us, awaited); } else { _server_monitor_heartbeat_succeeded(server_monitor, &hello_response, duration_us, awaited); } } else if (*cancelled) { MONITOR_LOG(server_monitor, "server monitor cancelled"); if (server_monitor->stream) { mongoc_stream_destroy(server_monitor->stream); } server_monitor->stream = NULL; server_monitor->more_to_come = false; _server_monitor_heartbeat_failed(server_monitor, &description->error, duration_us, awaited); } else { /* The hello reply had "ok":0 or a network error occurred. */ MONITOR_LOG_ERROR(server_monitor, "command or network error occurred: %s", error.message); command_or_network_error = true; mongoc_server_description_handle_hello(description, NULL, MONGOC_RTT_UNSET, &error); _server_monitor_heartbeat_failed(server_monitor, &description->error, duration_us, awaited); } if (command_or_network_error) { if (server_monitor->stream) { mongoc_stream_failed(server_monitor->stream); } server_monitor->stream = NULL; server_monitor->more_to_come = false; tdmod = mc_tpld_modify_begin(server_monitor->topology); /* clear_connection_pool() is a no-op if 'description->id' was already * removed. */ _mongoc_topology_description_clear_connection_pool( tdmod.new_td, server_monitor->description->id, &server_monitor->description->service_id); mc_tpld_modify_commit(tdmod); } bson_destroy(&hello_response); return description; } /* Request scan of a single server. * * Locks server monitor mutex to deliver scan_requested. */ void mongoc_server_monitor_request_scan(mongoc_server_monitor_t *server_monitor) { MONITOR_LOG(server_monitor, "requesting scan"); bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.scan_requested = true; mongoc_cond_signal(&server_monitor->shared.cond); bson_mutex_unlock(&server_monitor->shared.mutex); } /* Request cancellation of an in progress awaitable hello. * * Called from app threads on network errors and during shutdown. * Locks server monitor mutex. */ void mongoc_server_monitor_request_cancel(mongoc_server_monitor_t *server_monitor) { MONITOR_LOG(server_monitor, "requesting cancel"); bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.cancel_requested = true; mongoc_cond_signal(&server_monitor->shared.cond); bson_mutex_unlock(&server_monitor->shared.mutex); } /* Wait for heartbeatFrequencyMS or minHeartbeatFrequencyMS if a scan is * requested. * * Locks server monitor mutex. */ void mongoc_server_monitor_wait(mongoc_server_monitor_t *server_monitor) { int64_t start_ms; int64_t scan_due_ms; start_ms = _now_ms(); scan_due_ms = start_ms + server_monitor->heartbeat_frequency_ms; bson_mutex_lock(&server_monitor->shared.mutex); while (true) { int64_t sleep_duration_ms; int cond_ret; if (server_monitor->shared.state != MONGOC_THREAD_RUNNING) { break; } if (server_monitor->shared.scan_requested) { server_monitor->shared.scan_requested = false; scan_due_ms = start_ms + server_monitor->min_heartbeat_frequency_ms; } sleep_duration_ms = scan_due_ms - _now_ms(); if (sleep_duration_ms <= 0) { break; } MONITOR_LOG(server_monitor, "sleeping for %" PRId64, sleep_duration_ms); cond_ret = mongoc_cond_timedwait(&server_monitor->shared.cond, &server_monitor->shared.mutex, sleep_duration_ms); if (mongo_cond_ret_is_timedout(cond_ret)) { break; } } bson_mutex_unlock(&server_monitor->shared.mutex); } /* The server monitor thread function. * * Server monitor must be in state MONGOC_THREAD_OFF. */ static BSON_THREAD_FUN(_server_monitor_thread, server_monitor_void) { mongoc_server_monitor_t *server_monitor; mongoc_server_description_t *description; mongoc_server_description_t *previous_description; server_monitor = (mongoc_server_monitor_t *)server_monitor_void; description = mongoc_server_description_new_copy(server_monitor->description); previous_description = NULL; while (true) { bool cancelled = false; bson_mutex_lock(&server_monitor->shared.mutex); if (server_monitor->shared.state != MONGOC_THREAD_RUNNING) { bson_mutex_unlock(&server_monitor->shared.mutex); break; } bson_mutex_unlock(&server_monitor->shared.mutex); mongoc_server_description_destroy(previous_description); previous_description = mongoc_server_description_new_copy(description); mongoc_server_description_destroy(description); description = _server_monitor_check_server(server_monitor, previous_description, &cancelled); if (cancelled) { mongoc_server_monitor_wait(server_monitor); continue; } _update_topology_description(server_monitor, description); /* Immediately proceed to the next check if the previous response was * successful and included the topologyVersion field. */ if (description->type != MONGOC_SERVER_UNKNOWN && !bson_empty(&description->topology_version)) { MONITOR_LOG(server_monitor, "immediately proceeding due to topologyVersion"); continue; } /* ... or the previous response included the moreToCome flag */ if (server_monitor->more_to_come) { MONITOR_LOG(server_monitor, "immediately proceeding due to moreToCome"); continue; } /* ... or the server has just transitioned to Unknown due to a network * error. */ if (_mongoc_error_is_network(&description->error) && previous_description->type != MONGOC_SERVER_UNKNOWN) { MONITOR_LOG(server_monitor, "immediately proceeding due to network error"); continue; } mongoc_server_monitor_wait(server_monitor); } bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.state = MONGOC_THREAD_JOINABLE; bson_mutex_unlock(&server_monitor->shared.mutex); mongoc_server_description_destroy(previous_description); mongoc_server_description_destroy(description); BSON_THREAD_RETURN; } static bool _server_monitor_ping_server(mongoc_server_monitor_t *server_monitor, bool hello_ok, int64_t *rtt_ms) { bool ret = false; int64_t start_us = _now_us(); bson_t hello_response; bson_error_t error; *rtt_ms = MONGOC_RTT_UNSET; if (!server_monitor->stream) { MONITOR_LOG(server_monitor, "rtt setting up connection"); ret = _server_monitor_setup_connection(server_monitor, &hello_response, &start_us, &error); bson_destroy(&hello_response); } if (server_monitor->stream) { MONITOR_LOG(server_monitor, "rtt polling hello"); ret = _server_monitor_polling_hello(server_monitor, hello_ok, &hello_response, &error); if (ret) { *rtt_ms = (_now_us() - start_us) / 1000; } bson_destroy(&hello_response); } return ret; } /* The RTT monitor thread function. * * Server monitor must be in state MONGOC_THREAD_OFF. */ static BSON_THREAD_FUN(_server_monitor_rtt_thread, server_monitor_void) { mongoc_server_monitor_t *server_monitor = server_monitor_void; while (true) { int64_t rtt_ms; bson_error_t error; bool hello_ok; bson_mutex_lock(&server_monitor->shared.mutex); if (server_monitor->shared.state != MONGOC_THREAD_RUNNING) { bson_mutex_unlock(&server_monitor->shared.mutex); break; } bson_mutex_unlock(&server_monitor->shared.mutex); { mc_shared_tpld td = mc_tpld_take_ref(server_monitor->topology); const mongoc_server_description_t *sd = mongoc_topology_description_server_by_id_const(td.ptr, server_monitor->description->id, &error); hello_ok = sd ? sd->hello_ok : false; mc_tpld_drop_ref(&td); } _server_monitor_ping_server(server_monitor, hello_ok, &rtt_ms); if (rtt_ms != MONGOC_RTT_UNSET) { mc_tpld_modification tdmod = mc_tpld_modify_begin(server_monitor->topology); mongoc_server_description_t *const mut_sd = mongoc_topology_description_server_by_id(tdmod.new_td, server_monitor->description->id, &error); if (mut_sd) { mongoc_server_description_update_rtt(mut_sd, rtt_ms); mc_tpld_modify_commit(tdmod); } else { /* If the server description has been removed, the RTT thread will * be terminated by background monitoring soon, so we have nothing * to do but wait until we are about to be stopped. */ mc_tpld_modify_drop(tdmod); } } mongoc_server_monitor_wait(server_monitor); } bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.state = MONGOC_THREAD_JOINABLE; bson_mutex_unlock(&server_monitor->shared.mutex); BSON_THREAD_RETURN; } void mongoc_server_monitor_run(mongoc_server_monitor_t *server_monitor) { bson_mutex_lock(&server_monitor->shared.mutex); if (server_monitor->shared.state == MONGOC_THREAD_OFF) { server_monitor->is_rtt = false; int ret = mcommon_thread_create(&server_monitor->thread, _server_monitor_thread, server_monitor); if (ret == 0) { server_monitor->shared.state = MONGOC_THREAD_RUNNING; } else { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg = bson_strerror_r(ret, errmsg_buf, sizeof errmsg_buf); _server_monitor_log(server_monitor, MONGOC_LOG_LEVEL_ERROR, "Failed to start monitoring thread. This server " "may not be selectable. Error: %s", errmsg); } } bson_mutex_unlock(&server_monitor->shared.mutex); } void mongoc_server_monitor_run_as_rtt(mongoc_server_monitor_t *server_monitor) { bson_mutex_lock(&server_monitor->shared.mutex); if (server_monitor->shared.state == MONGOC_THREAD_OFF) { server_monitor->is_rtt = true; int ret = mcommon_thread_create(&server_monitor->thread, _server_monitor_rtt_thread, server_monitor); if (ret == 0) { server_monitor->shared.state = MONGOC_THREAD_RUNNING; } else { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg = bson_strerror_r(ret, errmsg_buf, sizeof errmsg_buf); _server_monitor_log(server_monitor, MONGOC_LOG_LEVEL_ERROR, "Failed to start Round-Trip Time monitoring thread. Error: %s", errmsg); } } bson_mutex_unlock(&server_monitor->shared.mutex); } /* Request thread shutdown. * * Returns true if in state MONGOC_THREAD_OFF and the server monitor can be * safely destroyed. * Called during topology description reconcile. * Locks server monitor mutex. */ bool mongoc_server_monitor_request_shutdown(mongoc_server_monitor_t *server_monitor) { bool off = false; bson_mutex_lock(&server_monitor->shared.mutex); if (server_monitor->shared.state == MONGOC_THREAD_RUNNING) { server_monitor->shared.state = MONGOC_THREAD_SHUTTING_DOWN; } if (server_monitor->shared.state == MONGOC_THREAD_JOINABLE) { mcommon_thread_join(server_monitor->thread); server_monitor->shared.state = MONGOC_THREAD_OFF; } if (server_monitor->shared.state == MONGOC_THREAD_OFF) { off = true; } mongoc_cond_signal(&server_monitor->shared.cond); bson_mutex_unlock(&server_monitor->shared.mutex); /* Cancel an in-progress hello check. */ if (!off) { mongoc_server_monitor_request_cancel(server_monitor); } return off; } /* Request thread shutdown and block until the server monitor thread terminates. * * Called by one thread. * Locks the server monitor mutex. */ void mongoc_server_monitor_wait_for_shutdown(mongoc_server_monitor_t *server_monitor) { if (mongoc_server_monitor_request_shutdown(server_monitor)) { return; } /* Shutdown requested, but thread is not yet off. Wait. */ mcommon_thread_join(server_monitor->thread); bson_mutex_lock(&server_monitor->shared.mutex); server_monitor->shared.state = MONGOC_THREAD_OFF; bson_mutex_unlock(&server_monitor->shared.mutex); } /* Destroy a server monitor. * * Called only by one thread. * Caller must not hold server monitor lock. * Server monitor thread is in state MONGOC_THREAD_OFF. */ void mongoc_server_monitor_destroy(mongoc_server_monitor_t *server_monitor) { if (!server_monitor) { return; } /* Locking not necessary since this is only called by one thread, and server * monitor thread is no longer running. */ BSON_ASSERT(server_monitor->shared.state == MONGOC_THREAD_OFF); mongoc_server_description_destroy(server_monitor->description); mongoc_stream_destroy(server_monitor->stream); mongoc_uri_destroy(server_monitor->uri); mongoc_cond_destroy(&server_monitor->shared.cond); bson_mutex_destroy(&server_monitor->shared.mutex); #ifdef MONGOC_ENABLE_SSL if (server_monitor->ssl_opts) { _mongoc_ssl_opts_cleanup(server_monitor->ssl_opts, true); bson_free(server_monitor->ssl_opts); } #endif bson_free(server_monitor); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-stream-private.h000066400000000000000000000041671511661753600271000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SERVER_STREAM_H #define MONGOC_SERVER_STREAM_H #include #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_server_stream_t { mongoc_topology_description_type_t topology_type; mongoc_server_description_t *sd; // owned bson_t cluster_time; // owned mongoc_stream_t *stream; // borrowed // If the stream was created in a way that may have overwritten the user's // readPreference, we need to know if server selection forced that change. bool must_use_primary; // True if this server stream was acquired during a retry attempt triggered // by a network error establishing an initial connection. Used to avoid // further retry attempts. bool retry_attempted; } mongoc_server_stream_t; mongoc_server_stream_t * mongoc_server_stream_new(const mongoc_topology_description_t *td, mongoc_server_description_t *sd, mongoc_stream_t *stream); int32_t mongoc_server_stream_max_bson_obj_size(mongoc_server_stream_t *server_stream); int32_t mongoc_server_stream_max_msg_size(mongoc_server_stream_t *server_stream); int32_t mongoc_server_stream_max_write_batch_size(mongoc_server_stream_t *server_stream); void mongoc_server_stream_cleanup(mongoc_server_stream_t *server_stream); BSON_END_DECLS #endif /* MONGOC_SERVER_STREAM_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-server-stream.c000066400000000000000000000057641511661753600254270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include mongoc_server_stream_t * mongoc_server_stream_new(const mongoc_topology_description_t *td, mongoc_server_description_t *sd, mongoc_stream_t *stream) { mongoc_server_stream_t *server_stream; BSON_ASSERT(sd); BSON_ASSERT(stream); server_stream = BSON_ALIGNED_ALLOC(mongoc_server_stream_t); server_stream->topology_type = td->type; bson_copy_to(&td->cluster_time, &server_stream->cluster_time); server_stream->sd = sd; /* becomes owned */ server_stream->stream = stream; /* merely borrowed */ server_stream->must_use_primary = false; server_stream->retry_attempted = false; return server_stream; } void mongoc_server_stream_cleanup(mongoc_server_stream_t *server_stream) { if (server_stream) { mongoc_server_description_destroy(server_stream->sd); bson_destroy(&server_stream->cluster_time); bson_free(server_stream); } } /* *-------------------------------------------------------------------------- * * mongoc_server_stream_max_bson_obj_size -- * * Return the max bson object size for the given server stream. * *-------------------------------------------------------------------------- */ int32_t mongoc_server_stream_max_bson_obj_size(mongoc_server_stream_t *server_stream) { return COALESCE(server_stream->sd->max_bson_obj_size, MONGOC_DEFAULT_BSON_OBJ_SIZE); } /* *-------------------------------------------------------------------------- * * mongoc_server_stream_max_msg_size -- * * Return the max message size for the given server stream. * *-------------------------------------------------------------------------- */ int32_t mongoc_server_stream_max_msg_size(mongoc_server_stream_t *server_stream) { return COALESCE(server_stream->sd->max_msg_size, MONGOC_DEFAULT_MAX_MSG_SIZE); } /* *-------------------------------------------------------------------------- * * mongoc_server_stream_max_write_batch_size -- * * Return the max write batch size for the given server stream. * *-------------------------------------------------------------------------- */ int32_t mongoc_server_stream_max_write_batch_size(mongoc_server_stream_t *server_stream) { return COALESCE(server_stream->sd->max_write_batch_size, MONGOC_DEFAULT_WRITE_BATCH_SIZE); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-set-private.h000066400000000000000000000064321511661753600250710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SET_PRIVATE_H #define MONGOC_SET_PRIVATE_H #include BSON_BEGIN_DECLS typedef void (*mongoc_set_item_dtor)(void *item, void *ctx); /* return true to continue iteration, false to stop */ typedef bool (*mongoc_set_for_each_cb_t)(void *item, void *ctx); typedef bool (*mongoc_set_for_each_const_cb_t)(const void *item, void *ctx); typedef bool (*mongoc_set_for_each_with_id_cb_t)(uint32_t id, void *item, void *ctx); typedef bool (*mongoc_set_for_each_with_id_const_cb_t)(uint32_t id, const void *item, void *ctx); typedef struct { uint32_t id; void *item; } mongoc_set_item_t; typedef struct { mongoc_set_item_t *items; size_t items_len; size_t items_allocated; mongoc_set_item_dtor dtor; void *dtor_ctx; } mongoc_set_t; mongoc_set_t * mongoc_set_new(size_t nitems, mongoc_set_item_dtor dtor, void *dtor_ctx); void mongoc_set_add(mongoc_set_t *set, uint32_t id, void *item); void mongoc_set_rm(mongoc_set_t *set, uint32_t id); void * mongoc_set_get(mongoc_set_t *set, uint32_t id); static BSON_INLINE const void * mongoc_set_get_const(const mongoc_set_t *set, uint32_t id) { return mongoc_set_get((mongoc_set_t *)set, id); } void * mongoc_set_get_item(mongoc_set_t *set, size_t idx); static BSON_INLINE const void * mongoc_set_get_item_const(const mongoc_set_t *set, size_t idx) { return mongoc_set_get_item((mongoc_set_t *)set, idx); } void * mongoc_set_get_item_and_id(mongoc_set_t *set, size_t idx, uint32_t *id /* OUT */); static BSON_INLINE const void * mongoc_set_get_item_and_id_const(const mongoc_set_t *set, size_t idx, uint32_t *id) { return mongoc_set_get_item_and_id((mongoc_set_t *)set, idx, id); } void mongoc_set_destroy(mongoc_set_t *set); /* loops over the set safe-ish. * * Caveats: * - you can add items at any iteration * - if you remove elements other than the one you're currently looking at, * you may see it later in the iteration */ void mongoc_set_for_each(mongoc_set_t *set, mongoc_set_for_each_cb_t cb, void *ctx); void mongoc_set_for_each_const(const mongoc_set_t *set, mongoc_set_for_each_const_cb_t cb, void *ctx); void mongoc_set_for_each_with_id(mongoc_set_t *set, mongoc_set_for_each_with_id_cb_t cb, void *ctx); void mongoc_set_for_each_with_id_const(const mongoc_set_t *set, mongoc_set_for_each_with_id_const_cb_t cb, void *ctx); /* first item in set for which "cb" returns true */ void * mongoc_set_find_item(mongoc_set_t *set, mongoc_set_for_each_cb_t cb, void *ctx); /* id of first item in set for which "cb" returns true, or 0. */ uint32_t mongoc_set_find_id(const mongoc_set_t *set, mongoc_set_for_each_const_cb_t cb, void *ctx); BSON_END_DECLS #endif /* MONGOC_SET_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-set.c000066400000000000000000000145621511661753600234170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include mongoc_set_t * mongoc_set_new(size_t nitems, mongoc_set_item_dtor dtor, void *dtor_ctx) { mongoc_set_t *set = (mongoc_set_t *)bson_malloc(sizeof(*set)); set->items_allocated = BSON_MAX(nitems, 1); set->items = BSON_ARRAY_ALLOC(set->items_allocated, mongoc_set_item_t); set->items_len = 0; set->dtor = dtor; set->dtor_ctx = dtor_ctx; return set; } static int mongoc_set_id_cmp(const void *a_, const void *b_) { mongoc_set_item_t *a = (mongoc_set_item_t *)a_; mongoc_set_item_t *b = (mongoc_set_item_t *)b_; if (a->id == b->id) { return 0; } return a->id < b->id ? -1 : 1; } void mongoc_set_add(mongoc_set_t *set, uint32_t id, void *item) { if (set->items_len >= set->items_allocated) { set->items_allocated *= 2; set->items = (mongoc_set_item_t *)bson_realloc(set->items, sizeof(*set->items) * set->items_allocated); } set->items[set->items_len].id = id; set->items[set->items_len].item = item; set->items_len++; if (set->items_len > 1 && set->items[set->items_len - 2].id > id) { qsort(set->items, set->items_len, sizeof(*set->items), mongoc_set_id_cmp); } } void mongoc_set_rm(mongoc_set_t *set, uint32_t id) { const mongoc_set_item_t key = {.id = id}; mongoc_set_item_t *const ptr = (mongoc_set_item_t *)bsearch(&key, set->items, set->items_len, sizeof(key), mongoc_set_id_cmp); if (ptr) { if (set->dtor) { set->dtor(ptr->item, set->dtor_ctx); } const size_t index = (size_t)(ptr - set->items); if (index != set->items_len - 1u) { memmove(set->items + index, set->items + index + 1u, (set->items_len - (index + 1u)) * sizeof(key)); } set->items_len--; } } void * mongoc_set_get(mongoc_set_t *set, uint32_t id) { mongoc_set_item_t *ptr; mongoc_set_item_t key; key.id = id; ptr = (mongoc_set_item_t *)bsearch(&key, set->items, set->items_len, sizeof(key), mongoc_set_id_cmp); return ptr ? ptr->item : NULL; } void * mongoc_set_get_item(mongoc_set_t *set, size_t idx) { BSON_ASSERT(set); BSON_ASSERT(idx < set->items_len); return set->items[idx].item; } void * mongoc_set_get_item_and_id(mongoc_set_t *set, size_t idx, uint32_t *id /* OUT */) { BSON_ASSERT(set); BSON_ASSERT(id); BSON_ASSERT(idx < set->items_len); *id = set->items[idx].id; return set->items[idx].item; } void mongoc_set_destroy(mongoc_set_t *set) { if (set->dtor) { for (size_t i = 0u; i < set->items_len; i++) { set->dtor(set->items[i].item, set->dtor_ctx); } } bson_free(set->items); bson_free(set); } typedef struct { mongoc_set_for_each_cb_t cb; void *ctx; } _mongoc_set_for_each_helper_t; static bool _mongoc_set_for_each_helper(uint32_t id, void *item, void *ctx) { _mongoc_set_for_each_helper_t *helper = ctx; BSON_UNUSED(id); return helper->cb(item, helper->ctx); } void mongoc_set_for_each(mongoc_set_t *set, mongoc_set_for_each_cb_t cb, void *ctx) { _mongoc_set_for_each_helper_t helper = { .cb = cb, .ctx = ctx, }; mongoc_set_for_each_with_id(set, _mongoc_set_for_each_helper, &helper); } typedef struct { mongoc_set_for_each_const_cb_t cb; void *ctx; } _mongoc_set_for_each_const_helper_t; static bool _mongoc_set_for_each_const_helper(uint32_t id, const void *item, void *ctx) { _mongoc_set_for_each_const_helper_t *helper = ctx; BSON_UNUSED(id); return helper->cb(item, helper->ctx); } void mongoc_set_for_each_const(const mongoc_set_t *set, mongoc_set_for_each_const_cb_t cb, void *ctx) { _mongoc_set_for_each_const_helper_t helper = { .cb = cb, .ctx = ctx, }; mongoc_set_for_each_with_id_const(set, _mongoc_set_for_each_const_helper, &helper); } void mongoc_set_for_each_with_id(mongoc_set_t *set, mongoc_set_for_each_with_id_cb_t cb, void *ctx) { BSON_ASSERT_PARAM(set); BSON_ASSERT_PARAM(cb); BSON_ASSERT(ctx || true); BSON_ASSERT(mlib_in_range(uint32_t, set->items_len)); const uint32_t items_len = (uint32_t)set->items_len; /* prevent undefined behavior of memcpy(NULL) */ if (items_len == 0) { return; } mongoc_set_item_t *const old_set = BSON_ARRAY_ALLOC(items_len, mongoc_set_item_t); memcpy(old_set, set->items, sizeof(*old_set) * items_len); for (uint32_t i = 0u; i < items_len; i++) { void *const item = old_set[i].item; if (!cb(i, item, ctx)) { break; } } bson_free(old_set); } void mongoc_set_for_each_with_id_const(const mongoc_set_t *set, mongoc_set_for_each_with_id_const_cb_t cb, void *ctx) { BSON_ASSERT_PARAM(set); BSON_ASSERT_PARAM(cb); BSON_ASSERT(ctx || true); BSON_ASSERT(mlib_in_range(uint32_t, set->items_len)); const uint32_t items_len = (uint32_t)set->items_len; /* prevent undefined behavior of memcpy(NULL) */ if (items_len == 0) { return; } mongoc_set_item_t *const old_set = BSON_ARRAY_ALLOC(items_len, mongoc_set_item_t); memcpy(old_set, set->items, sizeof(*old_set) * items_len); for (uint32_t i = 0u; i < items_len; i++) { const void *const item = old_set[i].item; if (!cb(i, item, ctx)) { break; } } bson_free(old_set); } void * mongoc_set_find_item(mongoc_set_t *set, mongoc_set_for_each_cb_t cb, void *ctx) { for (size_t i = 0u; i < set->items_len; i++) { mongoc_set_item_t *const item = set->items + i; if (cb(item->item, ctx)) { return item; } } return NULL; } uint32_t mongoc_set_find_id(const mongoc_set_t *set, mongoc_set_for_each_const_cb_t cb, void *ctx) { for (size_t i = 0u; i < set->items_len; i++) { const mongoc_set_item_t *const item = set->items + i; if (cb(item->item, ctx)) { return item->id; } } return 0; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-shared-private.h000066400000000000000000000161001511661753600255350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SHARED_H #define MONGOC_SHARED_H #include #include /** * @brief A ref-counted thread-safe shared pointer to arbitrary data. * * `shared_ptr` instances manage the lifetime of a pointed-to object when the * precise time to destroy that managed object is indeterminate, such as with * shared state in a multithreaded or asynchronous program. * * The pointed-to object of a shared_ptr instance can be accessed via * the `ptr` member of the shared_ptr object. Assigning-to the `ptr` member of * a shared_ptr is legal, and can be done to change the pointed-to object of a * shared_ptr without changing which object is being managed. This can be done * to return a pointer to a subobject of the managed object without giving * out a reference to the full managed object. * * A new managed object with a `shared_ptr` is created with * `mongoc_shared_ptr_create`, which starts with an initial shared reference * count of `1`. To take another reference to keep the managed object alive, * use `mongoc_shared_ptr_copy`. When one is done with a managed resource, the * shared reference should be dropped using `mongoc_shared_ptr_reset_null`. * * When an operation on a shared_ptr causes the reference count to drop to zero, * the deleter that was given to create that shared state will immediately be * invoked with the pointed-to-data. The deleter runs in the thread that * caused the reference count to drop, so be aware that resetting or assigning * a shared_ptr can execute unseen code: Refrain from holding locks while * resetting/assigning a shared pointer. */ typedef struct mongoc_shared_ptr { /** Pointed-to data */ void *ptr; /** Auxilary book-keeping. Do not touch. */ struct _mongoc_shared_ptr_aux *_aux; } mongoc_shared_ptr; /** * @brief A "null" pointer constant for a mongoc_shared_ptr. */ #define MONGOC_SHARED_PTR_NULL \ ((mongoc_shared_ptr){ \ .ptr = NULL, \ ._aux = NULL, \ }) /** * @brief Reassign a shared pointer to manage the given resource * * @param ptr The shared pointer that will be rebound * @param pointee The pointer that we will point to. * @param deleter A deleter for `pointee`, to be called when the refcount * reaches zero. * * @note Equivalent to: * * mongoc_shared_ptr_reset_null(ptr); * *ptr = mongoc_shared_ptr_create(pointee, deleter); */ extern void mongoc_shared_ptr_reset(mongoc_shared_ptr *ptr, void *pointee, void (*deleter)(void *)); /** * @brief Reassign the given shared pointer to manage the same resource as * 'from' * * If `dest` manages an existing object, the reference count of that managed * object will be decremented. If this causes its refcount to reach zero, then * the deleter function will be executed with the pointee. * * @param dest The shared pointer to change * @param from The shared pointer to take from * * @note Equivalent to: * * mongoc_shared_ptr_reset_null(dest); * *dest = mongoc_shared_ptr_copy(from); */ extern void mongoc_shared_ptr_assign(mongoc_shared_ptr *dest, mongoc_shared_ptr from); /** * @brief Reassign the given shared pointer to manage the same resource as * 'from' * * This atomic function is safe to call between threads when 'dest' may be * accessed simultaneously from another thread even if any of those accesses are * a write. However: Any potential reads *must* be done using * `mongoc_atomic_shared_ptr_load` and any potential writes *must* be done using * `mongoc_atomic_shared_ptr_store`. * * @param dest The shared pointer to change * @param from The shared pointer to take from * * Thread-safe equivalent of `mongoc_shared_ptr_assign` */ extern void mongoc_atomic_shared_ptr_store(mongoc_shared_ptr *dest, mongoc_shared_ptr from); /** * @brief Create a copy of the given shared pointer. Increases the reference * count on the object. * * @param ptr The pointer to copy from * @returns a new shared pointer that has the same pointee as ptr * * @note Must later reset/reassign the returned shared pointer */ extern mongoc_shared_ptr mongoc_shared_ptr_copy(mongoc_shared_ptr ptr); /** * @brief Like `mongoc_shared_ptr_copy`, but is thread-safe in case `*ptr` * may be accessed simultaneously from other threads even if any of those * accesses are writes. However: such potential writes *must* use * `mongoc_atomic_shared_ptr_store`. * * This is a thread-safe equivalent of `mongoc_shared_ptr_copy`. * * @note Must later reset/reassign the returned shared pointer */ extern mongoc_shared_ptr mongoc_atomic_shared_ptr_load(mongoc_shared_ptr const *ptr); /** * @brief Release the ownership of the given shared pointer. * * The shared pointer object and ptr->ptr will be reset to NULL, and the * reference count of the managed object will be decremented. * * If this causes the refcount to reach zero, then the deleter function will * be executed with the pointee. * * @param ptr The pointer to release and set to NULL * * @note This function is not thread safe if other threads may be * writing to `ptr` simultaneously. To do a thread-safe null-reset of a shared * pointer, use mongoc_atomic_shared_ptr_store() with a null * mongoc_shared_ptr as the 'from' argument */ extern void mongoc_shared_ptr_reset_null(mongoc_shared_ptr *ptr); /** * @brief Obtain the number of hard references to the resource managed by the * given shared pointer. This should only be used for diagnostic and assertive * purposes. * * @param ptr A non-null shared pointer to check * @return int A positive integer reference count */ extern int mongoc_shared_ptr_use_count(mongoc_shared_ptr ptr); /** * @brief Check whether the given shared pointer is managing a resource. * * @note The ptr.ptr MAY be NULL while the shared pointer is still managing * a resource. * * @return true If the pointer is managing a resource * @return false Otherwise */ static BSON_INLINE int mongoc_shared_ptr_is_null(mongoc_shared_ptr ptr) { return ptr._aux == 0; } /** * @brief Create a new shared pointer that manages the given resource, or NULL * * @param pointee The target of the pointer. Should be NULL or a dynamically * allocated data segment * @param deleter The deleter for the pointer. If `pointee` is non-NULL, * `deleter` must be non-NULL. This deleter will be called when the reference * count reaches zero. If should release the resources referred-to by `pointee`. */ extern mongoc_shared_ptr mongoc_shared_ptr_create(void *pointee, void (*deleter)(void *)); #endif /* MONGOC_SHARED_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-shared.c000066400000000000000000000102501511661753600240600ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include typedef struct _mongoc_shared_ptr_aux { int refcount; void (*deleter)(void *); void *managed; } _mongoc_shared_ptr_aux; static void _release_aux(_mongoc_shared_ptr_aux *aux) { aux->deleter(aux->managed); bson_free(aux); } static bson_shared_mutex_t g_shared_ptr_mtx; static bson_once_t g_shared_ptr_mtx_init_once = BSON_ONCE_INIT; static BSON_ONCE_FUN(_init_mtx) { bson_shared_mutex_init(&g_shared_ptr_mtx); BSON_ONCE_RETURN; } void mongoc_shared_ptr_reset(mongoc_shared_ptr *ptr, void *pointee, void (*deleter)(void *)) { BSON_ASSERT_PARAM(ptr); if (!mongoc_shared_ptr_is_null(*ptr)) { /* Release the old value of the pointer, possibly destroying it */ mongoc_shared_ptr_reset_null(ptr); } ptr->ptr = pointee; ptr->_aux = NULL; /* Take the new value */ if (pointee != NULL) { BSON_ASSERT(deleter != NULL); ptr->_aux = bson_malloc0(sizeof(_mongoc_shared_ptr_aux)); ptr->_aux->deleter = deleter; ptr->_aux->refcount = 1; ptr->_aux->managed = pointee; } bson_once(&g_shared_ptr_mtx_init_once, _init_mtx); } void mongoc_shared_ptr_assign(mongoc_shared_ptr *dest, mongoc_shared_ptr from) { /* Copy from 'from' *first*, since this might be a self-assignment. */ mongoc_shared_ptr copied = mongoc_shared_ptr_copy(from); BSON_ASSERT_PARAM(dest); mongoc_shared_ptr_reset_null(dest); *dest = copied; } mongoc_shared_ptr mongoc_shared_ptr_create(void *pointee, void (*deleter)(void *)) { mongoc_shared_ptr ret = MONGOC_SHARED_PTR_NULL; mongoc_shared_ptr_reset(&ret, pointee, deleter); return ret; } void mongoc_atomic_shared_ptr_store(mongoc_shared_ptr *dest, mongoc_shared_ptr from) { mongoc_shared_ptr prev = MONGOC_SHARED_PTR_NULL; BSON_ASSERT_PARAM(dest); /* We are effectively "copying" the 'from' */ (void)mongoc_shared_ptr_copy(from); bson_shared_mutex_lock(&g_shared_ptr_mtx); /* Do the exchange. Quick! */ prev = *dest; *dest = from; bson_shared_mutex_unlock(&g_shared_ptr_mtx); /* Free the pointer that we just overwrote */ mongoc_shared_ptr_reset_null(&prev); } mongoc_shared_ptr mongoc_atomic_shared_ptr_load(mongoc_shared_ptr const *ptr) { mongoc_shared_ptr r; BSON_ASSERT_PARAM(ptr); bson_shared_mutex_lock_shared(&g_shared_ptr_mtx); r = mongoc_shared_ptr_copy(*ptr); bson_shared_mutex_unlock_shared(&g_shared_ptr_mtx); return r; } mongoc_shared_ptr mongoc_shared_ptr_copy(mongoc_shared_ptr ptr) { mongoc_shared_ptr ret = ptr; if (!mongoc_shared_ptr_is_null(ptr)) { mcommon_atomic_int_fetch_add(&ret._aux->refcount, 1, mcommon_memory_order_acquire); } return ret; } void mongoc_shared_ptr_reset_null(mongoc_shared_ptr *ptr) { int prevcount = 0; BSON_ASSERT_PARAM(ptr); if (mongoc_shared_ptr_is_null(*ptr)) { /* Already null. Okay. */ return; } /* Decrement the reference count by one */ prevcount = mcommon_atomic_int_fetch_sub(&ptr->_aux->refcount, 1, mcommon_memory_order_acq_rel); if (prevcount == 1) { /* We just decremented from one to zero, so this is the last instance. * Release the managed data. */ _release_aux(ptr->_aux); } ptr->_aux = NULL; ptr->ptr = NULL; } int mongoc_shared_ptr_use_count(mongoc_shared_ptr ptr) { BSON_ASSERT(!mongoc_shared_ptr_is_null(ptr) && "Unbound mongoc_shared_ptr given to mongoc_shared_ptr_use_count"); return mcommon_atomic_int_fetch(&ptr._aux->refcount, mcommon_memory_order_relaxed); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-sleep.h000066400000000000000000000021221511661753600237260ustar00rootroot00000000000000#include #ifndef MONGOC_SLEEP_H #define MONGOC_SLEEP_H #include #include #include BSON_BEGIN_DECLS /** * mongoc_usleep_func_t: * @usec: Number of microseconds to sleep for. * @user_data: User data provided to mongoc_client_set_usleep_impl(). */ typedef void(BSON_CALL *mongoc_usleep_func_t)(int64_t usec, void *user_data); /** * mongoc_client_set_usleep_impl: * @usleep_func: A function to perform microsecond sleep. * * Sets the function to be called to perform sleep during scanning. * Returns the old function. * If old_user_data is not NULL, *old_user_data is set to the old user_data. * Not thread-safe. * Providing a `usleep_func` that does not sleep (e.g. coroutine suspension) is * not supported. Doing so is at the user's own risk. */ MONGOC_EXPORT(void) mongoc_client_set_usleep_impl(mongoc_client_t *client, mongoc_usleep_func_t usleep_func, void *user_data); MONGOC_EXPORT(void) mongoc_usleep_default_impl(int64_t usec, void *user_data); BSON_END_DECLS #endif /* MONGOC_SLEEP_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-socket-private.h000066400000000000000000000020441511661753600255610ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SOCKET_PRIVATE_H #define MONGOC_SOCKET_PRIVATE_H #include // IWYU pragma: export BSON_BEGIN_DECLS struct _mongoc_socket_t { #ifdef _WIN32 SOCKET sd; #else int sd; #endif int errno_; int domain; int pid; }; mongoc_socket_t * mongoc_socket_accept_ex(mongoc_socket_t *sock, int64_t expire_at, uint16_t *port); BSON_END_DECLS #endif /* MONGOC_SOCKET_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-socket.c000066400000000000000000001102721511661753600241070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #ifdef _WIN32 #include #include #endif #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "socket" #define OPERATION_EXPIRED(expire_at) ((expire_at >= 0) && (expire_at < (bson_get_monotonic_time()))) /* either struct sockaddr or void, depending on platform */ typedef MONGOC_SOCKET_ARG2 mongoc_sockaddr_t; /* *-------------------------------------------------------------------------- * * _mongoc_socket_capture_errno -- * * Save the errno state for contextual use. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _mongoc_socket_capture_errno(mongoc_socket_t *sock) /* IN */ { #ifdef _WIN32 errno = sock->errno_ = WSAGetLastError(); #else sock->errno_ = errno; #endif TRACE("setting errno: %d %s", sock->errno_, strerror(sock->errno_)); } /* *-------------------------------------------------------------------------- * * _mongoc_socket_setflags -- * * A helper to set socket flags. Sets to nonblocking mode. On * POSIX sets closeonexec. * * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool #ifdef _WIN32 _mongoc_socket_setflags(SOCKET sd) #else _mongoc_socket_setflags(int sd) #endif { #ifdef _WIN32 u_long io_mode = 1; return (NO_ERROR == ioctlsocket(sd, FIONBIO, &io_mode)); #else int flags; flags = fcntl(sd, F_GETFL); if (-1 == fcntl(sd, F_SETFL, (flags | O_NONBLOCK))) { return false; } #ifdef FD_CLOEXEC flags = fcntl(sd, F_GETFD); if (-1 == fcntl(sd, F_SETFD, (flags | FD_CLOEXEC))) { return false; } #endif return true; #endif } /* *-------------------------------------------------------------------------- * * _mongoc_socket_wait -- * * A single socket poll helper. * * @events: in most cases should be POLLIN or POLLOUT. * * @expire_at should be an absolute time at which to expire using * the monotonic clock (bson_get_monotonic_time(), which is in * microseconds). Or zero to not block at all. Or -1 to block * forever. * * Returns: * true if an event matched. otherwise false. * a timeout will return false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _mongoc_socket_wait(mongoc_socket_t *sock, /* IN */ int events, /* IN */ int64_t expire_at) /* IN */ { #ifdef _WIN32 fd_set read_fds; fd_set write_fds; fd_set error_fds; struct timeval timeout_tv; #else struct pollfd pfd; #endif int ret; int timeout; int64_t now; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(events); #ifdef _WIN32 FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&error_fds); if (events & POLLIN) { FD_SET(sock->sd, &read_fds); } if (events & POLLOUT) { FD_SET(sock->sd, &write_fds); } FD_SET(sock->sd, &error_fds); #else pfd.fd = sock->sd; pfd.events = events | POLLERR | POLLHUP; pfd.revents = 0; #endif now = bson_get_monotonic_time(); for (;;) { if (expire_at < 0) { timeout = -1; } else if (expire_at == 0) { timeout = 0; } else { timeout = (int)((expire_at - now) / 1000L); if (timeout < 0) { timeout = 0; } } #ifdef _WIN32 if (timeout == -1) { /* not WSAPoll: daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken */ ret = select(0 /*unused*/, &read_fds, &write_fds, &error_fds, NULL); } else { timeout_tv.tv_sec = timeout / 1000; timeout_tv.tv_usec = (timeout % 1000) * 1000; ret = select(0 /*unused*/, &read_fds, &write_fds, &error_fds, &timeout_tv); } if (ret == SOCKET_ERROR) { _mongoc_socket_capture_errno(sock); ret = -1; } else if (FD_ISSET(sock->sd, &error_fds)) { errno = WSAECONNRESET; ret = -1; } #else ret = poll(&pfd, 1, timeout); #endif if (ret > 0) { /* Something happened, so return that */ #ifdef _WIN32 return (FD_ISSET(sock->sd, &read_fds) || FD_ISSET(sock->sd, &write_fds)); #else RETURN(0 != (pfd.revents & events)); #endif } else if (ret < 0) { /* poll itself failed */ TRACE("errno is: %d", errno); if (MONGOC_ERRNO_IS_AGAIN(errno)) { if (OPERATION_EXPIRED(expire_at)) { _mongoc_socket_capture_errno(sock); RETURN(false); } else { continue; } } else { /* poll failed for some non-transient reason */ _mongoc_socket_capture_errno(sock); RETURN(false); } } else { /* ret == 0, poll timed out */ if (timeout) { mongoc_counter_streams_timeout_inc(); } #ifdef _WIN32 sock->errno_ = timeout ? WSAETIMEDOUT : EAGAIN; #else sock->errno_ = timeout ? ETIMEDOUT : EAGAIN; #endif RETURN(false); } } } /* *-------------------------------------------------------------------------- * * mongoc_socket_poll -- * * A multi-socket poll helper. * * @expire_at should be an absolute time at which to expire using * the monotonic clock (bson_get_monotonic_time(), which is in * microseconds). Or zero to not block at all. Or -1 to block * forever. * * Returns: * The number of sockets ready. * * Side effects: * None. * *-------------------------------------------------------------------------- */ ssize_t mongoc_socket_poll(mongoc_socket_poll_t *sds, /* IN */ size_t nsds, /* IN */ int32_t timeout) /* IN */ { #ifdef _WIN32 fd_set read_fds; fd_set write_fds; fd_set error_fds; struct timeval timeout_tv; #else struct pollfd *pfds; #endif int ret; ENTRY; BSON_ASSERT(sds); #ifdef _WIN32 FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&error_fds); for (size_t i = 0u; i < nsds; i++) { if (sds[i].events & POLLIN) { FD_SET(sds[i].socket->sd, &read_fds); } if (sds[i].events & POLLOUT) { FD_SET(sds[i].socket->sd, &write_fds); } FD_SET(sds[i].socket->sd, &error_fds); } timeout_tv.tv_sec = timeout / 1000; timeout_tv.tv_usec = (timeout % 1000) * 1000; /* not WSAPoll: daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken */ ret = select(0 /*unused*/, &read_fds, &write_fds, &error_fds, &timeout_tv); if (ret == SOCKET_ERROR) { errno = WSAGetLastError(); return -1; } for (size_t i = 0u; i < nsds; i++) { if (FD_ISSET(sds[i].socket->sd, &read_fds)) { sds[i].revents = POLLIN; } else if (FD_ISSET(sds[i].socket->sd, &write_fds)) { sds[i].revents = POLLOUT; } else if (FD_ISSET(sds[i].socket->sd, &error_fds)) { sds[i].revents = POLLHUP; } else { sds[i].revents = 0; } } #else pfds = BSON_ARRAY_ALLOC(nsds, struct pollfd); for (size_t i = 0u; i < nsds; i++) { pfds[i].fd = sds[i].socket->sd; pfds[i].events = sds[i].events | POLLERR | POLLHUP; pfds[i].revents = 0; } ret = poll(pfds, nsds, timeout); for (size_t i = 0u; i < nsds; i++) { sds[i].revents = pfds[i].revents; } bson_free(pfds); #endif return ret; } /* https://jira.mongodb.org/browse/CDRIVER-2176 */ #define MONGODB_KEEPALIVEINTVL 10 #define MONGODB_KEEPIDLE 120 #define MONGODB_KEEPALIVECNT 9 #ifdef _WIN32 static void _mongoc_socket_setkeepalive_windows(SOCKET sd) { struct tcp_keepalive keepalive; DWORD lpcbBytesReturned = 0; HKEY hKey; DWORD type; DWORD data; DWORD data_size = sizeof data; const char *reg_key = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"; keepalive.onoff = true; keepalive.keepalivetime = MONGODB_KEEPIDLE * 1000; keepalive.keepaliveinterval = MONGODB_KEEPALIVEINTVL * 1000; /* * Windows hardcodes probes to 10: * https://msdn.microsoft.com/en-us/library/windows/desktop/dd877220(v=vs.85).aspx * "On Windows Vista and later, the number of keep-alive probes (data * retransmissions) is set to 10 and cannot be changed." * * Note that win2k (and seeminly all versions thereafter) do not set the * registry value by default so there is no way to derive the default value * programmatically. It is however listed in the docs. A user can however * change the default value by setting the registry values. */ if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { /* https://technet.microsoft.com/en-us/library/cc957549.aspx */ DWORD default_keepalivetime = 7200000; /* 2 hours */ /* https://technet.microsoft.com/en-us/library/cc957548.aspx */ DWORD default_keepaliveinterval = 1000; /* 1 second */ if (RegQueryValueEx(hKey, "KeepAliveTime", NULL, &type, (LPBYTE)&data, &data_size) == ERROR_SUCCESS) { if (type == REG_DWORD && data < keepalive.keepalivetime) { keepalive.keepalivetime = data; } } else if (default_keepalivetime < keepalive.keepalivetime) { keepalive.keepalivetime = default_keepalivetime; } if (RegQueryValueEx(hKey, "KeepAliveInterval", NULL, &type, (LPBYTE)&data, &data_size) == ERROR_SUCCESS) { if (type == REG_DWORD && data < keepalive.keepaliveinterval) { keepalive.keepaliveinterval = data; } } else if (default_keepaliveinterval < keepalive.keepaliveinterval) { keepalive.keepaliveinterval = default_keepaliveinterval; } RegCloseKey(hKey); } if (WSAIoctl(sd, SIO_KEEPALIVE_VALS, &keepalive, sizeof keepalive, NULL, 0, &lpcbBytesReturned, NULL, NULL) == SOCKET_ERROR) { TRACE("%s", "Could not set keepalive values"); } else { TRACE("%s", "KeepAlive values updated"); TRACE("KeepAliveTime: %lu", keepalive.keepalivetime); TRACE("KeepAliveInterval: %lu", keepalive.keepaliveinterval); } } #else static const char * _mongoc_socket_sockopt_value_to_name(int value) { switch (value) { #ifdef TCP_KEEPIDLE case TCP_KEEPIDLE: return "TCP_KEEPIDLE"; #endif #ifdef TCP_KEEPALIVE case TCP_KEEPALIVE: return "TCP_KEEPALIVE"; #endif #ifdef TCP_KEEPINTVL case TCP_KEEPINTVL: return "TCP_KEEPINTVL"; #endif #ifdef TCP_KEEPCNT case TCP_KEEPCNT: return "TCP_KEEPCNT"; #endif default: MONGOC_WARNING("Don't know what socketopt %d is", value); return "Unknown option name"; } } static void _mongoc_socket_set_sockopt_if_less(int sd, int name, int value) { int optval = 1; mongoc_socklen_t optlen; optlen = sizeof optval; if (getsockopt(sd, IPPROTO_TCP, name, (char *)&optval, &optlen)) { TRACE("Getting '%s' failed, errno: %d", _mongoc_socket_sockopt_value_to_name(name), errno); } else { TRACE("'%s' is %d, target value is %d", _mongoc_socket_sockopt_value_to_name(name), optval, value); if (optval > value) { optval = value; if (setsockopt(sd, IPPROTO_TCP, name, (char *)&optval, sizeof optval)) { TRACE("Setting '%s' failed, errno: %d", _mongoc_socket_sockopt_value_to_name(name), errno); } else { TRACE("'%s' value changed to %d", _mongoc_socket_sockopt_value_to_name(name), optval); } } } } static void _mongoc_socket_setkeepalive_nix(int sd) { #if defined(TCP_KEEPIDLE) _mongoc_socket_set_sockopt_if_less(sd, TCP_KEEPIDLE, MONGODB_KEEPIDLE); #elif defined(TCP_KEEPALIVE) _mongoc_socket_set_sockopt_if_less(sd, TCP_KEEPALIVE, MONGODB_KEEPIDLE); #else TRACE("%s", "Neither TCP_KEEPIDLE nor TCP_KEEPALIVE available"); #endif #ifdef TCP_KEEPINTVL _mongoc_socket_set_sockopt_if_less(sd, TCP_KEEPINTVL, MONGODB_KEEPALIVEINTVL); #else TRACE("%s", "TCP_KEEPINTVL not available"); #endif #ifdef TCP_KEEPCNT _mongoc_socket_set_sockopt_if_less(sd, TCP_KEEPCNT, MONGODB_KEEPALIVECNT); #else TRACE("%s", "TCP_KEEPCNT not available"); #endif } #endif static void #ifdef _WIN32 _mongoc_socket_setkeepalive(SOCKET sd) /* IN */ #else _mongoc_socket_setkeepalive(int sd) /* IN */ #endif { #ifdef SO_KEEPALIVE int optval = 1; ENTRY; #ifdef SO_KEEPALIVE if (!setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof optval)) { TRACE("%s", "Setting SO_KEEPALIVE"); #ifdef _WIN32 _mongoc_socket_setkeepalive_windows(sd); #else _mongoc_socket_setkeepalive_nix(sd); #endif } else { TRACE("%s", "Failed setting SO_KEEPALIVE"); } #else TRACE("%s", "SO_KEEPALIVE not available"); #endif EXIT; #endif } static bool #ifdef _WIN32 _mongoc_socket_setnodelay(SOCKET sd) /* IN */ #else _mongoc_socket_setnodelay(int sd) /* IN */ #endif { #ifdef _WIN32 BOOL optval = 1; #else int optval = 1; #endif int ret; ENTRY; errno = 0; ret = setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, sizeof optval); #ifdef _WIN32 if (ret == SOCKET_ERROR) { MONGOC_WARNING("WSAGetLastError(): %d", (int)WSAGetLastError()); } #endif RETURN(ret == 0); } /* *-------------------------------------------------------------------------- * * mongoc_socket_errno -- * * Returns the last error on the socket. * * Returns: * An integer errno, or 0 on no error. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_socket_errno(mongoc_socket_t *sock) /* IN */ { BSON_ASSERT(sock); TRACE("Current errno: %d", sock->errno_); return sock->errno_; } /* *-------------------------------------------------------------------------- * * _mongoc_socket_errno_is_again -- * * Check to see if we should attempt to make further progress * based on the error of the last operation. * * Returns: * true if we should try again. otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _mongoc_socket_errno_is_again(mongoc_socket_t *sock) /* IN */ { TRACE("errno is: %d", sock->errno_); return MONGOC_ERRNO_IS_AGAIN(sock->errno_); } /* *-------------------------------------------------------------------------- * * mongoc_socket_accept -- * * Wrapper for BSD socket accept(). Handles portability between * BSD sockets and WinSock2 on Windows Vista and newer. * * Returns: * NULL upon failure to accept or timeout. * A newly allocated mongoc_socket_t on success. * * Side effects: * *port contains the client port number. * *-------------------------------------------------------------------------- */ mongoc_socket_t * mongoc_socket_accept(mongoc_socket_t *sock, /* IN */ int64_t expire_at) /* IN */ { return mongoc_socket_accept_ex(sock, expire_at, NULL); } /* *-------------------------------------------------------------------------- * * mongoc_socket_accept_ex -- * * Private synonym for mongoc_socket_accept, returning client port. * * Returns: * NULL upon failure to accept or timeout. * A newly allocated mongoc_socket_t on success. * * Side effects: * *port contains the client port number. * *-------------------------------------------------------------------------- */ mongoc_socket_t * mongoc_socket_accept_ex(mongoc_socket_t *sock, /* IN */ int64_t expire_at, /* IN */ uint16_t *port) /* OUT */ { mongoc_socket_t *client; struct sockaddr_storage addr = {0}; mongoc_socklen_t addrlen = sizeof addr; bool try_again = false; bool failed = false; #ifdef _WIN32 SOCKET sd; #else int sd; #endif ENTRY; BSON_ASSERT(sock); again: errno = 0; sd = accept(sock->sd, (mongoc_sockaddr_t *)&addr, &addrlen); _mongoc_socket_capture_errno(sock); #ifdef _WIN32 failed = (sd == INVALID_SOCKET); #else failed = (sd == -1); #endif try_again = (failed && _mongoc_socket_errno_is_again(sock)); if (failed && try_again) { if (_mongoc_socket_wait(sock, POLLIN, expire_at)) { GOTO(again); } RETURN(NULL); } else if (failed) { RETURN(NULL); } else if (!_mongoc_socket_setflags(sd)) { #ifdef _WIN32 closesocket(sd); #else close(sd); #endif RETURN(NULL); } client = (mongoc_socket_t *)bson_malloc0(sizeof *client); client->sd = sd; if (port) { if (addr.ss_family == AF_INET) { struct sockaddr_in *tmp = (struct sockaddr_in *)&addr; *port = ntohs(tmp->sin_port); } else { struct sockaddr_in6 *tmp = (struct sockaddr_in6 *)&addr; *port = ntohs(tmp->sin6_port); } } if (!_mongoc_socket_setnodelay(client->sd)) { MONGOC_WARNING("Failed to enable TCP_NODELAY."); } RETURN(client); } /* *-------------------------------------------------------------------------- * * mongo_socket_bind -- * * A wrapper around bind(). * * Returns: * 0 on success, -1 on failure and errno is set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_socket_bind(mongoc_socket_t *sock, /* IN */ const struct sockaddr *addr, /* IN */ mongoc_socklen_t addrlen) /* IN */ { int ret; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(addr); BSON_ASSERT(addrlen); ret = bind(sock->sd, addr, addrlen); _mongoc_socket_capture_errno(sock); RETURN(ret); } int mongoc_socket_close(mongoc_socket_t *sock) /* IN */ { bool owned; ENTRY; BSON_ASSERT(sock); #ifdef _WIN32 owned = (sock->pid == (int)_getpid()); if (sock->sd != INVALID_SOCKET) { if (owned) { shutdown(sock->sd, SD_BOTH); } if (0 == closesocket(sock->sd)) { sock->sd = INVALID_SOCKET; } else { _mongoc_socket_capture_errno(sock); RETURN(-1); } } RETURN(0); #else owned = (sock->pid == (int)getpid()); if (sock->sd != -1) { if (owned) { shutdown(sock->sd, SHUT_RDWR); } if (0 == close(sock->sd)) { sock->sd = -1; } else { _mongoc_socket_capture_errno(sock); RETURN(-1); } } RETURN(0); #endif } /* *-------------------------------------------------------------------------- * * mongoc_socket_connect -- * * Performs a socket connection but will fail if @expire_at is * reached by the monotonic clock. * * Returns: * 0 if success, otherwise -1 and errno is set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_socket_connect(mongoc_socket_t *sock, /* IN */ const struct sockaddr *addr, /* IN */ mongoc_socklen_t addrlen, /* IN */ int64_t expire_at) /* IN */ { bool try_again = false; bool failed = false; int ret; int optval; /* getsockopt parameter types vary, we check in CheckCompiler.m4 */ mongoc_socklen_t optlen = (mongoc_socklen_t)sizeof optval; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(addr); BSON_ASSERT(addrlen); ret = connect(sock->sd, addr, addrlen); #ifdef _WIN32 if (ret == SOCKET_ERROR) { #else if (ret == -1) { #endif _mongoc_socket_capture_errno(sock); failed = true; try_again = _mongoc_socket_errno_is_again(sock); } if (failed && try_again) { if (_mongoc_socket_wait(sock, POLLOUT, expire_at)) { optval = -1; ret = getsockopt(sock->sd, SOL_SOCKET, SO_ERROR, (char *)&optval, &optlen); if ((ret == 0) && (optval == 0)) { RETURN(0); } else { errno = sock->errno_ = optval; } } RETURN(-1); } else if (failed) { RETURN(-1); } else { RETURN(0); } } /* *-------------------------------------------------------------------------- * * mongoc_socket_destroy -- * * Cleanup after a mongoc_socket_t structure, possibly closing * underlying sockets. * * Returns: * None. * * Side effects: * @sock is freed and should be considered invalid. * *-------------------------------------------------------------------------- */ void mongoc_socket_destroy(mongoc_socket_t *sock) /* IN */ { if (sock) { mongoc_socket_close(sock); bson_free(sock); } } /* *-------------------------------------------------------------------------- * * mongoc_socket_listen -- * * Listen for incoming requests with a backlog up to @backlog. * * If @backlog is zero, a sensible default will be chosen. * * Returns: * true if successful; otherwise false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_socket_listen(mongoc_socket_t *sock, /* IN */ unsigned int backlog) /* IN */ { int ret; ENTRY; BSON_ASSERT(sock); if (backlog == 0) { backlog = 10; } ret = listen(sock->sd, backlog); _mongoc_socket_capture_errno(sock); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_socket_new -- * * Create a new socket and store the current process id on it. * * Free the result with mongoc_socket_destroy(). * * Returns: * A newly allocated socket. * NULL on failure. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_socket_t * mongoc_socket_new(int domain, /* IN */ int type, /* IN */ int protocol) /* IN */ { mongoc_socket_t *sock; #ifdef _WIN32 SOCKET sd; #else int sd; #endif #ifdef SO_NOSIGPIPE int on = 1; #endif ENTRY; sd = socket(domain, type, protocol); #ifdef _WIN32 if (sd == INVALID_SOCKET) { #else if (sd == -1) { #endif RETURN(NULL); } if (!_mongoc_socket_setflags(sd)) { GOTO(fail); } if (domain != AF_UNIX) { if (!_mongoc_socket_setnodelay(sd)) { MONGOC_WARNING("Failed to enable TCP_NODELAY."); } _mongoc_socket_setkeepalive(sd); } /* Set SO_NOSIGPIPE, to ignore SIGPIPE on writes for platforms where setting MSG_NOSIGNAL on writes is not supported (primarily OSX). */ #ifdef SO_NOSIGPIPE setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); #endif sock = (mongoc_socket_t *)bson_malloc0(sizeof *sock); sock->sd = sd; sock->domain = domain; #ifdef _WIN32 sock->pid = (int)_getpid(); #else sock->pid = (int)getpid(); #endif RETURN(sock); fail: #ifdef _WIN32 closesocket(sd); #else close(sd); #endif RETURN(NULL); } /* *-------------------------------------------------------------------------- * * mongoc_socket_recv -- * * A portable wrapper around recv() that also respects an absolute * timeout. * * @expire_at is 0 for no blocking, -1 for infinite blocking, * or a time using the monotonic clock to expire. Calculate this * using bson_get_monotonic_time() + N_MICROSECONDS. * * Returns: * The number of bytes received on success. * 0 on end of stream. * -1 on failure. * * Side effects: * @buf will be read into. * *-------------------------------------------------------------------------- */ ssize_t mongoc_socket_recv(mongoc_socket_t *sock, /* IN */ void *buf, /* OUT */ size_t buflen, /* IN */ int flags, /* IN */ int64_t expire_at) /* IN */ { ssize_t ret = 0; bool failed = false; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(buf); BSON_ASSERT(buflen); again: sock->errno_ = 0; #ifdef _WIN32 ret = recv(sock->sd, (char *)buf, (int)buflen, flags); failed = (ret == SOCKET_ERROR); #else ret = recv(sock->sd, buf, buflen, flags); failed = (ret == -1); #endif if (failed) { _mongoc_socket_capture_errno(sock); if (_mongoc_socket_errno_is_again(sock) && _mongoc_socket_wait(sock, POLLIN, expire_at)) { GOTO(again); } } if (failed) { RETURN(-1); } mongoc_counter_streams_ingress_add(ret); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_socket_setsockopt -- * * A wrapper around setsockopt(). * * Returns: * 0 on success, -1 on failure. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_socket_setsockopt(mongoc_socket_t *sock, /* IN */ int level, /* IN */ int optname, /* IN */ const void *optval, /* IN */ mongoc_socklen_t optlen) /* IN */ { int ret; ENTRY; BSON_ASSERT(sock); ret = setsockopt(sock->sd, level, optname, optval, optlen); _mongoc_socket_capture_errno(sock); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_socket_send -- * * A simplified wrapper around mongoc_socket_sendv(). * * @expire_at is 0 for no blocking, -1 for infinite blocking, * or a time using the monotonic clock to expire. Calculate this * using bson_get_monotonic_time() + N_MICROSECONDS. * * Returns: * -1 on failure. number of bytes written on success. * * Side effects: * None. * *-------------------------------------------------------------------------- */ ssize_t mongoc_socket_send(mongoc_socket_t *sock, /* IN */ const void *buf, /* IN */ size_t buflen, /* IN */ int64_t expire_at) /* IN */ { mongoc_iovec_t iov; BSON_ASSERT(sock); BSON_ASSERT(buf); BSON_ASSERT(buflen); iov.iov_base = (void *)buf; iov.iov_len = buflen; return mongoc_socket_sendv(sock, &iov, 1, expire_at); } /* *-------------------------------------------------------------------------- * * _mongoc_socket_try_sendv_slow -- * * A slow variant of _mongoc_socket_try_sendv() that sends each * iovec entry one by one. This can happen if we hit EMSGSIZE * with sendmsg() on various POSIX systems or WSASend()+WSAEMSGSIZE * on Windows. * * Returns: * the number of bytes sent or -1 and errno is set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static ssize_t _mongoc_socket_try_sendv_slow(mongoc_socket_t *sock, /* IN */ mongoc_iovec_t *iov, /* IN */ size_t iovcnt) /* IN */ { ssize_t ret = 0; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); for (size_t i = 0u; i < iovcnt; i++) { #ifdef _WIN32 BSON_ASSERT(mlib_in_range(int, iov[i].iov_len)); const int wrote = send(sock->sd, iov[i].iov_base, (int)iov[i].iov_len, 0); if (wrote == SOCKET_ERROR) { #else const ssize_t wrote = send(sock->sd, iov[i].iov_base, iov[i].iov_len, 0); if (wrote == -1) { #endif _mongoc_socket_capture_errno(sock); if (!_mongoc_socket_errno_is_again(sock)) { RETURN(-1); } RETURN(ret ? ret : -1); } BSON_ASSERT(mlib_cmp(wrote, <=, SSIZE_MAX - ret)); ret += wrote; if (mlib_cmp(wrote, !=, iov[i].iov_len)) { RETURN(ret); } } RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_socket_try_sendv -- * * Helper used by mongoc_socket_sendv() to try to write as many * bytes to the underlying socket until the socket buffer is full. * * This is performed in a non-blocking fashion. * * Returns: * -1 on failure. the number of bytes written on success. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static ssize_t _mongoc_socket_try_sendv(mongoc_socket_t *sock, /* IN */ mongoc_iovec_t *iov, /* IN */ size_t iovcnt) /* IN */ { #ifdef _WIN32 DWORD dwNumberofBytesSent = 0; int ret; #else struct msghdr msg; ssize_t ret; #endif ENTRY; BSON_ASSERT(sock); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); DUMP_IOVEC(sendbuf, iov, iovcnt); #ifdef _WIN32 BSON_ASSERT(mlib_in_range(unsigned long, iovcnt)); ret = WSASend(sock->sd, (LPWSABUF)iov, (DWORD)iovcnt, &dwNumberofBytesSent, 0, NULL, NULL); TRACE("WSASend sent: %lu (out of: %zu), ret: %d", dwNumberofBytesSent, iov->iov_len, ret); #else memset(&msg, 0, sizeof msg); msg.msg_iov = iov; msg.msg_iovlen = iovcnt; ret = sendmsg(sock->sd, &msg, #ifdef MSG_NOSIGNAL MSG_NOSIGNAL); #else 0); #endif TRACE("Send %zd out of %zu bytes", ret, iov->iov_len); #endif #ifdef _WIN32 if (ret == SOCKET_ERROR) { #else if (ret == -1) { #endif _mongoc_socket_capture_errno(sock); /* * Check to see if we have sent an iovec too large for sendmsg to * complete. If so, we need to fallback to the slow path of multiple * send() commands. */ #ifdef _WIN32 if (mongoc_socket_errno(sock) == WSAEMSGSIZE) { #else if (mongoc_socket_errno(sock) == EMSGSIZE) { #endif RETURN(_mongoc_socket_try_sendv_slow(sock, iov, iovcnt)); } RETURN(-1); } #ifdef _WIN32 RETURN(dwNumberofBytesSent); #else RETURN(ret); #endif } /* *-------------------------------------------------------------------------- * * mongoc_socket_sendv -- * * A wrapper around using sendmsg() to send an iovec. * This also deals with the structure differences between * WSABUF and struct iovec. * * @expire_at is 0 for no blocking, -1 for infinite blocking, * or a time using the monotonic clock to expire. Calculate this * using bson_get_monotonic_time() + N_MICROSECONDS. * * Returns: * -1 on failure. * the number of bytes written on success. * * Side effects: * None. * *-------------------------------------------------------------------------- */ ssize_t mongoc_socket_sendv(mongoc_socket_t *sock, /* IN */ mongoc_iovec_t *in_iov, /* IN */ size_t iovcnt, /* IN */ int64_t expire_at) /* IN */ { ssize_t ret = 0; ssize_t sent; size_t cur = 0; mongoc_iovec_t *iov; ENTRY; BSON_ASSERT(sock); BSON_ASSERT(in_iov); BSON_ASSERT(iovcnt); iov = BSON_ARRAY_ALLOC(iovcnt, mongoc_iovec_t); memcpy(iov, in_iov, sizeof(*iov) * iovcnt); for (;;) { sent = _mongoc_socket_try_sendv(sock, &iov[cur], iovcnt - cur); TRACE("Sent %zd (of %zu) out of iovcnt=%zu", sent, iov[cur].iov_len, iovcnt); /* * If we failed with anything other than EAGAIN or EWOULDBLOCK, * we should fail immediately as there is another issue with the * underlying socket. */ if (sent == -1) { if (!_mongoc_socket_errno_is_again(sock)) { ret = -1; GOTO(CLEANUP); } } /* * Update internal stream counters. */ if (sent > 0) { ret += sent; mongoc_counter_streams_egress_add(sent); /* * Subtract the sent amount from what we still need to send. */ while ((cur < iovcnt) && (sent >= (ssize_t)iov[cur].iov_len)) { TRACE("still got bytes left: sent -= iov_len: %zd -= %zu", sent, iov[cur].iov_len); sent -= iov[cur++].iov_len; } /* * Check if that made us finish all of the iovecs. If so, we are done * sending data over the socket. */ if (cur == iovcnt) { TRACE("%s", "Finished the iovecs"); break; } /* * Increment the current iovec buffer to its proper offset and adjust * the number of bytes to write. */ TRACE("Seeked io_base+%zd", sent); TRACE("Subtracting iov_len -= sent; %zu -= %zd", iov[cur].iov_len, sent); iov[cur].iov_base = ((char *)iov[cur].iov_base) + sent; iov[cur].iov_len -= sent; TRACE("iov_len remaining %zu", iov[cur].iov_len); BSON_ASSERT(iovcnt - cur); BSON_ASSERT(iov[cur].iov_len); } else if (OPERATION_EXPIRED(expire_at)) { if (expire_at > 0) { mongoc_counter_streams_timeout_inc(); } GOTO(CLEANUP); } /* * Block on poll() until our desired condition is met. */ if (!_mongoc_socket_wait(sock, POLLOUT, expire_at)) { GOTO(CLEANUP); } } CLEANUP: bson_free(iov); RETURN(ret); } int mongoc_socket_getsockname(mongoc_socket_t *sock, /* IN */ struct sockaddr *addr, /* OUT */ mongoc_socklen_t *addrlen) /* INOUT */ { int ret; ENTRY; BSON_ASSERT(sock); ret = getsockname(sock->sd, addr, addrlen); _mongoc_socket_capture_errno(sock); RETURN(ret); } char * mongoc_socket_getnameinfo(mongoc_socket_t *sock) /* IN */ { /* getpeername parameter types vary, we check in CheckCompiler.m4 */ struct sockaddr_storage addr; mongoc_socklen_t len = (mongoc_socklen_t)sizeof addr; char *ret; char host[BSON_HOST_NAME_MAX + 1]; ENTRY; BSON_ASSERT(sock); if (getpeername(sock->sd, (struct sockaddr *)&addr, &len)) { RETURN(NULL); } if (getnameinfo((struct sockaddr *)&addr, len, host, sizeof host, NULL, 0, 0)) { RETURN(NULL); } ret = bson_strdup(host); RETURN(ret); } bool mongoc_socket_check_closed(mongoc_socket_t *sock) /* IN */ { bool closed = false; char buf[1]; ssize_t r; if (_mongoc_socket_wait(sock, POLLIN, 0)) { sock->errno_ = 0; r = recv(sock->sd, buf, 1, MSG_PEEK); if (r < 0) { _mongoc_socket_capture_errno(sock); } if (r < 1) { closed = true; } } return closed; } /* * *-------------------------------------------------------------------------- * * mongoc_socket_inet_ntop -- * * Convert the ip from addrinfo into a c string. * * Returns: * The value is returned into 'buffer'. The memory has to be allocated * by the caller * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_socket_inet_ntop(struct addrinfo *rp, /* IN */ char *buf, /* INOUT */ size_t buflen) /* IN */ { void *ptr; char tmp[256]; int req; switch (rp->ai_family) { case AF_INET: ptr = &((struct sockaddr_in *)rp->ai_addr)->sin_addr; inet_ntop(rp->ai_family, ptr, tmp, sizeof(tmp)); // Truncation is OK. req = bson_snprintf(buf, buflen, "ipv4 %s", tmp); BSON_ASSERT(req > 0); break; case AF_INET6: ptr = &((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr; inet_ntop(rp->ai_family, ptr, tmp, sizeof(tmp)); // Truncation is OK. req = bson_snprintf(buf, buflen, "ipv6 %s", tmp); BSON_ASSERT(req > 0); break; default: // Truncation is OK. req = bson_snprintf(buf, buflen, "unknown ip %d", rp->ai_family); BSON_ASSERT(req > 0); break; } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-socket.h000066400000000000000000000062011511661753600241100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SOCKET_H #define MONGOC_SOCKET_H #include #include #include #ifdef _WIN32 #include #include #else #include #include #include #include #include #include #include #include #include #endif #if defined(_AIX) && !defined(MONGOC_HAVE_SS_FAMILY) #define ss_family __ss_family #endif #include BSON_BEGIN_DECLS typedef MONGOC_SOCKET_ARG3 mongoc_socklen_t; typedef struct _mongoc_socket_t mongoc_socket_t; typedef struct { mongoc_socket_t *socket; int events; int revents; } mongoc_socket_poll_t; MONGOC_EXPORT(mongoc_socket_t *) mongoc_socket_accept(mongoc_socket_t *sock, int64_t expire_at) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(int) mongoc_socket_bind(mongoc_socket_t *sock, const struct sockaddr *addr, mongoc_socklen_t addrlen); MONGOC_EXPORT(int) mongoc_socket_close(mongoc_socket_t *socket); MONGOC_EXPORT(int) mongoc_socket_connect(mongoc_socket_t *sock, const struct sockaddr *addr, mongoc_socklen_t addrlen, int64_t expire_at); MONGOC_EXPORT(char *) mongoc_socket_getnameinfo(mongoc_socket_t *sock) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_socket_destroy(mongoc_socket_t *sock); MONGOC_EXPORT(int) mongoc_socket_errno(mongoc_socket_t *sock); MONGOC_EXPORT(int) mongoc_socket_getsockname(mongoc_socket_t *sock, struct sockaddr *addr, mongoc_socklen_t *addrlen); MONGOC_EXPORT(int) mongoc_socket_listen(mongoc_socket_t *sock, unsigned int backlog); MONGOC_EXPORT(mongoc_socket_t *) mongoc_socket_new(int domain, int type, int protocol) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(ssize_t) mongoc_socket_recv(mongoc_socket_t *sock, void *buf, size_t buflen, int flags, int64_t expire_at); MONGOC_EXPORT(int) mongoc_socket_setsockopt(mongoc_socket_t *sock, int level, int optname, const void *optval, mongoc_socklen_t optlen); MONGOC_EXPORT(ssize_t) mongoc_socket_send(mongoc_socket_t *sock, const void *buf, size_t buflen, int64_t expire_at); MONGOC_EXPORT(ssize_t) mongoc_socket_sendv(mongoc_socket_t *sock, mongoc_iovec_t *iov, size_t iovcnt, int64_t expire_at); MONGOC_EXPORT(bool) mongoc_socket_check_closed(mongoc_socket_t *sock); MONGOC_EXPORT(void) mongoc_socket_inet_ntop(struct addrinfo *rp, char *buf, size_t buflen); MONGOC_EXPORT(ssize_t) mongoc_socket_poll(mongoc_socket_poll_t *sds, size_t nsds, int32_t timeout); BSON_END_DECLS #endif /* MONGOC_SOCKET_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ssl-private.h000066400000000000000000000037141511661753600250770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SSL_PRIVATE_H #define MONGOC_SSL_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS typedef struct { bool tls_disable_certificate_revocation_check; bool tls_disable_ocsp_endpoint_check; } _mongoc_internal_tls_opts_t; void _mongoc_ssl_opts_from_uri(mongoc_ssl_opt_t *ssl_opt, _mongoc_internal_tls_opts_t *internal, mongoc_uri_t *uri); void _mongoc_ssl_opts_copy_to(const mongoc_ssl_opt_t *src, mongoc_ssl_opt_t *dst, bool copy_internal); bool _mongoc_ssl_opts_disable_certificate_revocation_check(const mongoc_ssl_opt_t *ssl_opt); bool _mongoc_ssl_opts_disable_ocsp_endpoint_check(const mongoc_ssl_opt_t *ssl_opt); void _mongoc_ssl_opts_cleanup(mongoc_ssl_opt_t *opt, bool free_internal); /* _mongoc_ssl_opts_from_bson is an internal helper for constructing an ssl_opt * from a BSON document. It is used to parse TLS options for the KMIP KMS * provider in CSFLE. * - ssl_opt must be a zero'd out ssl_opt struct. * - errmsg must be an initialized mcommon_string_append_t. * - Returns false on error and appends to errmsg. */ bool _mongoc_ssl_opts_from_bson(mongoc_ssl_opt_t *ssl_opt, const bson_t *bson, mcommon_string_append_t *errmsg); BSON_END_DECLS #endif /* MONGOC_SSL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ssl.c000066400000000000000000000157471511661753600234330ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL #include #include #include #include #include #include #include #if defined(MONGOC_ENABLE_SSL_OPENSSL) #include #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) #include #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include #endif /* TODO: we could populate these from a config or something further down the * road for providing defaults */ #ifndef MONGOC_SSL_DEFAULT_TRUST_FILE #define MONGOC_SSL_DEFAULT_TRUST_FILE NULL #endif #ifndef MONGOC_SSL_DEFAULT_TRUST_DIR #define MONGOC_SSL_DEFAULT_TRUST_DIR NULL #endif static mongoc_ssl_opt_t gMongocSslOptDefault = { NULL, NULL, MONGOC_SSL_DEFAULT_TRUST_FILE, MONGOC_SSL_DEFAULT_TRUST_DIR, }; const mongoc_ssl_opt_t * mongoc_ssl_opt_get_default(void) { return &gMongocSslOptDefault; } void _mongoc_ssl_opts_from_uri(mongoc_ssl_opt_t *ssl_opt, _mongoc_internal_tls_opts_t *internal, mongoc_uri_t *uri) { bool insecure = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSINSECURE, false); ssl_opt->pem_file = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, NULL); ssl_opt->pem_pwd = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, NULL); ssl_opt->ca_file = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, NULL); ssl_opt->weak_cert_validation = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, insecure); ssl_opt->allow_invalid_hostname = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, insecure); ssl_opt->internal = internal; internal->tls_disable_certificate_revocation_check = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK, false); internal->tls_disable_ocsp_endpoint_check = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK, false); } void _mongoc_ssl_opts_copy_to(const mongoc_ssl_opt_t *src, mongoc_ssl_opt_t *dst, bool copy_internal) { BSON_ASSERT(src); BSON_ASSERT(dst); dst->pem_file = bson_strdup(src->pem_file); dst->pem_pwd = bson_strdup(src->pem_pwd); dst->ca_file = bson_strdup(src->ca_file); dst->ca_dir = bson_strdup(src->ca_dir); dst->crl_file = bson_strdup(src->crl_file); dst->weak_cert_validation = src->weak_cert_validation; dst->allow_invalid_hostname = src->allow_invalid_hostname; if (copy_internal) { dst->internal = NULL; if (src->internal) { dst->internal = bson_malloc(sizeof(_mongoc_internal_tls_opts_t)); memcpy(dst->internal, src->internal, sizeof(_mongoc_internal_tls_opts_t)); } } } void _mongoc_ssl_opts_cleanup(mongoc_ssl_opt_t *opt, bool free_internal) { bson_free((char *)opt->pem_file); bson_free((char *)opt->pem_pwd); bson_free((char *)opt->ca_file); bson_free((char *)opt->ca_dir); bson_free((char *)opt->crl_file); if (free_internal) { bson_free(opt->internal); } } bool _mongoc_ssl_opts_disable_certificate_revocation_check(const mongoc_ssl_opt_t *ssl_opt) { if (!ssl_opt->internal) { return false; } return ((_mongoc_internal_tls_opts_t *)ssl_opt->internal)->tls_disable_certificate_revocation_check; } bool _mongoc_ssl_opts_disable_ocsp_endpoint_check(const mongoc_ssl_opt_t *ssl_opt) { if (!ssl_opt->internal) { return false; } return ((_mongoc_internal_tls_opts_t *)ssl_opt->internal)->tls_disable_ocsp_endpoint_check; } bool _mongoc_ssl_opts_from_bson(mongoc_ssl_opt_t *ssl_opt, const bson_t *bson, mcommon_string_append_t *errmsg) { bson_iter_t iter; if (ssl_opt->internal) { mcommon_string_append(errmsg, "SSL options must not have internal state set"); return false; } ssl_opt->internal = bson_malloc0(sizeof(_mongoc_internal_tls_opts_t)); if (!bson_iter_init(&iter, bson)) { mcommon_string_append(errmsg, "error initializing iterator to BSON SSL options"); return false; } while (bson_iter_next(&iter)) { const char *key = bson_iter_key(&iter); if (BSON_ITER_HOLDS_UTF8(&iter)) { if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILE)) { ssl_opt->pem_file = bson_strdup(bson_iter_utf8(&iter, NULL)); continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD)) { ssl_opt->pem_pwd = bson_strdup(bson_iter_utf8(&iter, NULL)); continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSCAFILE)) { ssl_opt->ca_file = bson_strdup(bson_iter_utf8(&iter, NULL)); continue; } } if (BSON_ITER_HOLDS_BOOL(&iter)) { if (0 == bson_strcasecmp(key, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES)) { /* If MONGOC_URI_TLSINSECURE was parsed, weak_cert_validation must * remain true. */ ssl_opt->weak_cert_validation = ssl_opt->weak_cert_validation || bson_iter_bool(&iter); continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES)) { /* If MONGOC_URI_TLSINSECURE was parsed, allow_invalid_hostname must * remain true. */ ssl_opt->allow_invalid_hostname = ssl_opt->allow_invalid_hostname || bson_iter_bool(&iter); continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSINSECURE)) { if (bson_iter_bool(&iter)) { ssl_opt->weak_cert_validation = true; ssl_opt->allow_invalid_hostname = true; } continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK)) { ((_mongoc_internal_tls_opts_t *)ssl_opt->internal)->tls_disable_certificate_revocation_check = bson_iter_bool(&iter); continue; } else if (0 == bson_strcasecmp(key, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK)) { ((_mongoc_internal_tls_opts_t *)ssl_opt->internal)->tls_disable_ocsp_endpoint_check = bson_iter_bool(&iter); continue; } } mcommon_string_append_printf( errmsg, "unexpected %s option: %s", _mongoc_bson_type_to_str(bson_iter_type(&iter)), key); return false; } return true; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ssl.h000066400000000000000000000022631511661753600234250ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SSL_H #define MONGOC_SSL_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_ssl_opt_t mongoc_ssl_opt_t; struct _mongoc_ssl_opt_t { const char *pem_file; const char *pem_pwd; const char *ca_file; const char *ca_dir; const char *crl_file; bool weak_cert_validation; bool allow_invalid_hostname; void *internal; void *padding[6]; }; MONGOC_EXPORT(const mongoc_ssl_opt_t *) mongoc_ssl_opt_get_default(void) BSON_GNUC_PURE; BSON_END_DECLS #endif /* MONGOC_SSL_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-sspi-private.h000066400000000000000000000043431511661753600252530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_SSPI_PRIVATE_H #define MONGOC_SSPI_PRIVATE_H #include #include BSON_BEGIN_DECLS #define SECURITY_WIN32 1 /* Required for SSPI */ #include #include #include #include #define MONGOC_SSPI_AUTH_GSS_ERROR -1 #define MONGOC_SSPI_AUTH_GSS_COMPLETE 1 #define MONGOC_SSPI_AUTH_GSS_CONTINUE 0 typedef struct { mongoc_sasl_t sasl; CredHandle cred; CtxtHandle ctx; WCHAR *spn; SEC_CHAR *response; SEC_CHAR *username; ULONG flags; UCHAR haveCred; UCHAR haveCtx; ULONG qop; } mongoc_sspi_client_state_t; void _mongoc_sspi_set_gsserror(DWORD errCode, const SEC_CHAR *msg); void _mongoc_sspi_destroy_sspi_client_state(mongoc_sspi_client_state_t *state); int _mongoc_sspi_auth_sspi_client_init(WCHAR *service, ULONG flags, WCHAR *user, ULONG ulen, WCHAR *domain, ULONG dlen, WCHAR *password, ULONG plen, mongoc_sspi_client_state_t *state); int _mongoc_sspi_auth_sspi_client_step(mongoc_sspi_client_state_t *state, SEC_CHAR *challenge); int _mongoc_sspi_auth_sspi_client_unwrap(mongoc_sspi_client_state_t *state, SEC_CHAR *challenge); int _mongoc_sspi_auth_sspi_client_wrap( mongoc_sspi_client_state_t *state, SEC_CHAR *data, SEC_CHAR *user, ULONG ulen, INT protect); BSON_END_DECLS #endif /* MONGOC_SSPI_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-sspi.c000066400000000000000000000354311511661753600236000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This file originates from https://github.com/mongodb-labs/winkerberos */ #include #ifdef MONGOC_ENABLE_SASL_SSPI /* mingw doesn't define this */ #ifndef CRYPT_STRING_NOCRLF #define CRYPT_STRING_NOCRLF 0x40000000 #endif #include #include #include void _mongoc_sspi_destroy_sspi_client_state(mongoc_sspi_client_state_t *state) { if (state->haveCtx) { DeleteSecurityContext(&state->ctx); state->haveCtx = 0; } if (state->haveCred) { FreeCredentialsHandle(&state->cred); state->haveCred = 0; } if (state->spn != NULL) { bson_free(state->spn); state->spn = NULL; } if (state->response != NULL) { bson_free(state->response); state->response = NULL; } if (state->username != NULL) { bson_free(state->username); state->username = NULL; } } void _mongoc_sspi_set_gsserror(DWORD errCode, const SEC_CHAR *msg) { char *err = mongoc_winerr_to_string(errCode); MONGOC_ERROR("SSPI: %s: %s", msg, err); bson_free(err); } static SEC_CHAR * _mongoc_sspi_base64_encode(const SEC_CHAR *value, DWORD vlen) { SEC_CHAR *out = NULL; DWORD len; /* Get the correct size for the out buffer. */ if (CryptBinaryToStringA((BYTE *)value, vlen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &len)) { out = BSON_ARRAY_ALLOC(len, SEC_CHAR); if (out) { /* Encode to the out buffer. */ if (CryptBinaryToStringA((BYTE *)value, vlen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, out, &len)) { return out; } else { bson_free(out); } } } MONGOC_ERROR("%s", "CryptBinaryToString failed."); return NULL; } static SEC_CHAR * _mongoc_sspi_base64_decode(const SEC_CHAR *value, DWORD *rlen) { SEC_CHAR *out = NULL; /* Get the correct size for the out buffer. */ if (CryptStringToBinaryA(value, 0, CRYPT_STRING_BASE64, NULL, rlen, NULL, NULL)) { out = BSON_ARRAY_ALLOC(*rlen, SEC_CHAR); if (out) { /* Decode to the out buffer. */ if (CryptStringToBinaryA(value, 0, CRYPT_STRING_BASE64, (BYTE *)out, rlen, NULL, NULL)) { return out; } else { bson_free(out); } } } MONGOC_ERROR("%s", "CryptStringToBinary failed."); return NULL; } static CHAR * _mongoc_sspi_wide_to_utf8(WCHAR *value) { CHAR *out; int len = WideCharToMultiByte(CP_UTF8, 0, value, -1, NULL, 0, NULL, NULL); if (len) { out = BSON_ARRAY_ALLOC(len, CHAR); if (WideCharToMultiByte(CP_UTF8, 0, value, -1, out, len, NULL, NULL)) { return out; } else { bson_free(out); } } _mongoc_sspi_set_gsserror(GetLastError(), "WideCharToMultiByte"); return NULL; } int _mongoc_sspi_auth_sspi_client_init(WCHAR *service, ULONG flags, WCHAR *user, ULONG ulen, WCHAR *domain, ULONG dlen, WCHAR *password, ULONG plen, mongoc_sspi_client_state_t *state) { SECURITY_STATUS status; SEC_WINNT_AUTH_IDENTITY_W authIdentity; TimeStamp ignored; state->response = NULL; state->username = NULL; state->qop = SECQOP_WRAP_NO_ENCRYPT; state->flags = flags; state->haveCred = 0; state->haveCtx = 0; state->spn = _wcsdup(service); if (state->spn == NULL) { return MONGOC_SSPI_AUTH_GSS_ERROR; } /* Convert RFC-2078 format to SPN */ if (!wcschr(state->spn, L'/')) { WCHAR *ptr = wcschr(state->spn, L'@'); if (ptr) { *ptr = L'/'; } } if (user) { authIdentity.User = user; authIdentity.UserLength = ulen; authIdentity.Domain = domain; authIdentity.DomainLength = dlen; authIdentity.Password = password; authIdentity.PasswordLength = plen; authIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; } /* Note that the first parameter, pszPrincipal, appears to be * completely ignored in the Kerberos SSP. For more details see * https://github.com/mongodb-labs/winkerberos/issues/11. * */ status = AcquireCredentialsHandleW(/* Principal */ NULL, /* Security package name */ L"kerberos", /* Credentials Use */ SECPKG_CRED_OUTBOUND, /* LogonID (We don't use this) */ NULL, /* AuthData */ password ? &authIdentity : NULL, /* Always NULL */ NULL, /* Always NULL */ NULL, /* CredHandle */ &state->cred, /* Expiry (Required but unused by us) */ &ignored); if (status != SEC_E_OK) { _mongoc_sspi_set_gsserror(status, "AcquireCredentialsHandle"); return MONGOC_SSPI_AUTH_GSS_ERROR; } state->haveCred = 1; return MONGOC_SSPI_AUTH_GSS_COMPLETE; } int _mongoc_sspi_auth_sspi_client_step(mongoc_sspi_client_state_t *state, SEC_CHAR *challenge) { SecBufferDesc inbuf; SecBuffer inBufs[1]; SecBufferDesc outbuf; SecBuffer outBufs[1]; ULONG ignored; SECURITY_STATUS status = MONGOC_SSPI_AUTH_GSS_CONTINUE; DWORD len; if (state->response != NULL) { bson_free(state->response); state->response = NULL; } inbuf.ulVersion = SECBUFFER_VERSION; inbuf.cBuffers = 1; inbuf.pBuffers = inBufs; inBufs[0].pvBuffer = NULL; inBufs[0].cbBuffer = 0; inBufs[0].BufferType = SECBUFFER_TOKEN; if (state->haveCtx) { inBufs[0].pvBuffer = _mongoc_sspi_base64_decode(challenge, &len); if (!inBufs[0].pvBuffer) { return MONGOC_SSPI_AUTH_GSS_ERROR; } inBufs[0].cbBuffer = len; } outbuf.ulVersion = SECBUFFER_VERSION; outbuf.cBuffers = 1; outbuf.pBuffers = outBufs; outBufs[0].pvBuffer = NULL; outBufs[0].cbBuffer = 0; outBufs[0].BufferType = SECBUFFER_TOKEN; status = InitializeSecurityContextW(/* CredHandle */ &state->cred, /* CtxtHandle (NULL on first call) */ state->haveCtx ? &state->ctx : NULL, /* Service Principal Name */ state->spn, /* Flags */ ISC_REQ_ALLOCATE_MEMORY | state->flags, /* Always 0 */ 0, /* Target data representation */ SECURITY_NETWORK_DREP, /* Challenge (NULL on first call) */ state->haveCtx ? &inbuf : NULL, /* Always 0 */ 0, /* CtxtHandle (Set on first call) */ &state->ctx, /* Output */ &outbuf, /* Context attributes */ &ignored, /* Expiry (We don't use this) */ NULL); if (status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) { _mongoc_sspi_set_gsserror(status, "InitializeSecurityContext"); status = MONGOC_SSPI_AUTH_GSS_ERROR; goto done; } state->haveCtx = 1; if (outBufs[0].cbBuffer) { state->response = _mongoc_sspi_base64_encode(outBufs[0].pvBuffer, outBufs[0].cbBuffer); if (!state->response) { status = MONGOC_SSPI_AUTH_GSS_ERROR; goto done; } } if (status == SEC_E_OK) { /* Get authenticated username. */ SecPkgContext_NamesW names; status = QueryContextAttributesW(&state->ctx, SECPKG_ATTR_NAMES, &names); if (status != SEC_E_OK) { _mongoc_sspi_set_gsserror(status, "QueryContextAttributesW"); status = MONGOC_SSPI_AUTH_GSS_ERROR; goto done; } state->username = _mongoc_sspi_wide_to_utf8(names.sUserName); if (state->username == NULL) { FreeContextBuffer(names.sUserName); status = MONGOC_SSPI_AUTH_GSS_ERROR; goto done; } FreeContextBuffer(names.sUserName); status = MONGOC_SSPI_AUTH_GSS_COMPLETE; } else { status = MONGOC_SSPI_AUTH_GSS_CONTINUE; } done: if (inBufs[0].pvBuffer) { bson_free(inBufs[0].pvBuffer); } if (outBufs[0].pvBuffer) { FreeContextBuffer(outBufs[0].pvBuffer); } return status; } int _mongoc_sspi_auth_sspi_client_unwrap(mongoc_sspi_client_state_t *state, SEC_CHAR *challenge) { SECURITY_STATUS status; DWORD len; SecBuffer wrapBufs[2]; SecBufferDesc wrapBufDesc; wrapBufDesc.ulVersion = SECBUFFER_VERSION; wrapBufDesc.cBuffers = 2; wrapBufDesc.pBuffers = wrapBufs; if (state->response != NULL) { bson_free(state->response); state->response = NULL; state->qop = SECQOP_WRAP_NO_ENCRYPT; } if (!state->haveCtx) { return MONGOC_SSPI_AUTH_GSS_ERROR; } wrapBufs[0].pvBuffer = _mongoc_sspi_base64_decode(challenge, &len); if (!wrapBufs[0].pvBuffer) { return MONGOC_SSPI_AUTH_GSS_ERROR; } wrapBufs[0].cbBuffer = len; wrapBufs[0].BufferType = SECBUFFER_STREAM; wrapBufs[1].pvBuffer = NULL; wrapBufs[1].cbBuffer = 0; wrapBufs[1].BufferType = SECBUFFER_DATA; status = DecryptMessage(&state->ctx, &wrapBufDesc, 0, &state->qop); if (status == SEC_E_OK) { status = MONGOC_SSPI_AUTH_GSS_COMPLETE; } else { _mongoc_sspi_set_gsserror(status, "DecryptMessage"); status = MONGOC_SSPI_AUTH_GSS_ERROR; goto done; } if (wrapBufs[1].cbBuffer) { state->response = _mongoc_sspi_base64_encode(wrapBufs[1].pvBuffer, wrapBufs[1].cbBuffer); if (!state->response) { status = MONGOC_SSPI_AUTH_GSS_ERROR; } } done: if (wrapBufs[0].pvBuffer) { bson_free(wrapBufs[0].pvBuffer); } return status; } int _mongoc_sspi_auth_sspi_client_wrap( mongoc_sspi_client_state_t *state, SEC_CHAR *data, SEC_CHAR *user, ULONG ulen, int protect) { SECURITY_STATUS status; SecPkgContext_Sizes sizes; SecBuffer wrapBufs[3]; SecBufferDesc wrapBufDesc; SEC_CHAR *decodedData = NULL; SEC_CHAR *inbuf; SIZE_T inbufSize; SEC_CHAR *outbuf; DWORD outbufSize; SEC_CHAR *plaintextMessage; ULONG plaintextMessageSize; if (state->response != NULL) { bson_free(state->response); state->response = NULL; } if (!state->haveCtx) { return MONGOC_SSPI_AUTH_GSS_ERROR; } status = QueryContextAttributes(&state->ctx, SECPKG_ATTR_SIZES, &sizes); if (status != SEC_E_OK) { _mongoc_sspi_set_gsserror(status, "QueryContextAttributes"); return MONGOC_SSPI_AUTH_GSS_ERROR; } if (user) { /* Length of user + 4 bytes for security layer (see below). */ plaintextMessageSize = ulen + 4; } else { decodedData = _mongoc_sspi_base64_decode(data, &plaintextMessageSize); if (!decodedData) { return MONGOC_SSPI_AUTH_GSS_ERROR; } } inbufSize = sizes.cbSecurityTrailer + plaintextMessageSize + sizes.cbBlockSize; inbuf = (SEC_CHAR *)bson_malloc(inbufSize); if (inbuf == NULL) { bson_free(decodedData); return MONGOC_SSPI_AUTH_GSS_ERROR; } plaintextMessage = inbuf + sizes.cbSecurityTrailer; if (user) { /* Authenticate the provided user. Unlike pykerberos, we don't * need any information from "data" to do that. * */ plaintextMessage[0] = 1; /* No security layer */ plaintextMessage[1] = 0; plaintextMessage[2] = 0; plaintextMessage[3] = 0; memcpy_s(plaintextMessage + 4, inbufSize - sizes.cbSecurityTrailer - 4, user, strlen(user)); } else { /* No user provided. Just rewrap data. */ memcpy_s(plaintextMessage, inbufSize - sizes.cbSecurityTrailer, decodedData, plaintextMessageSize); bson_free(decodedData); } wrapBufDesc.cBuffers = 3; wrapBufDesc.pBuffers = wrapBufs; wrapBufDesc.ulVersion = SECBUFFER_VERSION; wrapBufs[0].cbBuffer = sizes.cbSecurityTrailer; wrapBufs[0].BufferType = SECBUFFER_TOKEN; wrapBufs[0].pvBuffer = inbuf; wrapBufs[1].cbBuffer = (ULONG)plaintextMessageSize; wrapBufs[1].BufferType = SECBUFFER_DATA; wrapBufs[1].pvBuffer = inbuf + sizes.cbSecurityTrailer; wrapBufs[2].cbBuffer = sizes.cbBlockSize; wrapBufs[2].BufferType = SECBUFFER_PADDING; wrapBufs[2].pvBuffer = inbuf + (sizes.cbSecurityTrailer + plaintextMessageSize); status = EncryptMessage(&state->ctx, protect ? 0 : SECQOP_WRAP_NO_ENCRYPT, &wrapBufDesc, 0); if (status != SEC_E_OK) { bson_free(inbuf); _mongoc_sspi_set_gsserror(status, "EncryptMessage"); return MONGOC_SSPI_AUTH_GSS_ERROR; } outbufSize = wrapBufs[0].cbBuffer + wrapBufs[1].cbBuffer + wrapBufs[2].cbBuffer; outbuf = BSON_ARRAY_ALLOC(outbufSize, SEC_CHAR); memcpy_s(outbuf, outbufSize, wrapBufs[0].pvBuffer, wrapBufs[0].cbBuffer); memcpy_s( outbuf + wrapBufs[0].cbBuffer, outbufSize - wrapBufs[0].cbBuffer, wrapBufs[1].pvBuffer, wrapBufs[1].cbBuffer); memcpy_s(outbuf + wrapBufs[0].cbBuffer + wrapBufs[1].cbBuffer, outbufSize - wrapBufs[0].cbBuffer - wrapBufs[1].cbBuffer, wrapBufs[2].pvBuffer, wrapBufs[2].cbBuffer); state->response = _mongoc_sspi_base64_encode(outbuf, outbufSize); if (!state->response) { status = MONGOC_SSPI_AUTH_GSS_ERROR; } else { status = MONGOC_SSPI_AUTH_GSS_COMPLETE; } bson_free(inbuf); bson_free(outbuf); return status; } #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-buffered.c000066400000000000000000000225761511661753600257030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream" typedef struct { mongoc_stream_t stream; mongoc_stream_t *base_stream; mongoc_buffer_t buffer; } mongoc_stream_buffered_t; /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_destroy -- * * Clean up after a mongoc_stream_buffered_t. Free all allocated * resources and release the base stream. * * Returns: * None. * * Side effects: * Everything. * *-------------------------------------------------------------------------- */ static void mongoc_stream_buffered_destroy(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(stream); mongoc_stream_destroy(buffered->base_stream); buffered->base_stream = NULL; _mongoc_buffer_destroy(&buffered->buffer); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_failed -- * * Called when a stream fails. Useful for streams that differnciate * between failure and cleanup. * Calls mongoc_stream_buffered_destroy() on the stream. * * Returns: * None. * * Side effects: * Everything. * *-------------------------------------------------------------------------- */ static void mongoc_stream_buffered_failed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_destroy(stream); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_close -- * * Close the underlying stream. The buffered content is still * valid. * * Returns: * The return value of mongoc_stream_close() on the underlying * stream. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static int mongoc_stream_buffered_close(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(stream); return mongoc_stream_close(buffered->base_stream); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_flush -- * * Flushes the underlying stream. * * Returns: * The result of flush on the base stream. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static int mongoc_stream_buffered_flush(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(buffered); return mongoc_stream_flush(buffered->base_stream); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_writev -- * * Write an iovec to the underlying stream. This write is not * buffered, it passes through to the base stream directly. * * timeout_msec should be the number of milliseconds to wait before * considering the writev as failed. * * Returns: * The number of bytes written or -1 on failure. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static ssize_t mongoc_stream_buffered_writev(mongoc_stream_t *stream, /* IN */ mongoc_iovec_t *iov, /* IN */ size_t iovcnt, /* IN */ int32_t timeout_msec) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; ssize_t ret; ENTRY; BSON_ASSERT(buffered); ret = mongoc_stream_writev(buffered->base_stream, iov, iovcnt, timeout_msec); RETURN(ret); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_readv -- * * Read from the underlying stream. The data will be buffered based * on the buffered streams target buffer size. * * When reading from the underlying stream, we read at least the * requested number of bytes, but try to also fill the stream to * the size of the underlying buffer. * * Note: * This isn't actually a huge savings since we never have more than * one reply waiting for us, but perhaps someday that will be * different. It should help for small replies, however that will * reduce our read() syscalls by 50%. * * Returns: * The number of bytes read or -1 on failure. * * Side effects: * iov[*]->iov_base buffers are filled. * *-------------------------------------------------------------------------- */ static ssize_t mongoc_stream_buffered_readv(mongoc_stream_t *stream, /* IN */ mongoc_iovec_t *iov, /* INOUT */ size_t iovcnt, /* IN */ size_t min_bytes, /* IN */ int32_t timeout_msec) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; bson_error_t error = {0}; size_t total_bytes = 0; size_t i; size_t off = 0; ENTRY; BSON_UNUSED(min_bytes); BSON_ASSERT(buffered); for (i = 0; i < iovcnt; i++) { total_bytes += iov[i].iov_len; } if (-1 == _mongoc_buffer_fill(&buffered->buffer, buffered->base_stream, total_bytes, timeout_msec, &error)) { MONGOC_WARNING("%s", error.message); RETURN(-1); } BSON_ASSERT(buffered->buffer.len >= total_bytes); for (i = 0; i < iovcnt; i++) { memcpy(iov[i].iov_base, buffered->buffer.data + off, iov[i].iov_len); off += iov[i].iov_len; buffered->buffer.len -= iov[i].iov_len; } memmove(buffered->buffer.data, buffered->buffer.data + off, buffered->buffer.len); RETURN(total_bytes); } static mongoc_stream_t * _mongoc_stream_buffered_get_base_stream(mongoc_stream_t *stream) /* IN */ { return ((mongoc_stream_buffered_t *)stream)->base_stream; } static bool _mongoc_stream_buffered_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(stream); return mongoc_stream_check_closed(buffered->base_stream); } static bool _mongoc_stream_buffered_timed_out(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(stream); return mongoc_stream_timed_out(buffered->base_stream); } static bool _mongoc_stream_buffered_should_retry(mongoc_stream_t *stream) /* IN */ { mongoc_stream_buffered_t *buffered = (mongoc_stream_buffered_t *)stream; BSON_ASSERT(stream); return mongoc_stream_should_retry(buffered->base_stream); } /* *-------------------------------------------------------------------------- * * mongoc_stream_buffered_new -- * * Creates a new mongoc_stream_buffered_t. * * This stream will read from an underlying stream and try to read * more data than necessary. It can help lower the number of read() * or recv() syscalls performed. * * @base_stream is considered owned by the resulting stream after * calling this function. * * Returns: * A newly allocated mongoc_stream_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_stream_buffered_new(mongoc_stream_t *base_stream, /* IN */ size_t buffer_size) /* IN */ { mongoc_stream_buffered_t *stream; BSON_ASSERT(base_stream); stream = (mongoc_stream_buffered_t *)bson_malloc0(sizeof *stream); stream->stream.type = MONGOC_STREAM_BUFFERED; stream->stream.destroy = mongoc_stream_buffered_destroy; stream->stream.failed = mongoc_stream_buffered_failed; stream->stream.close = mongoc_stream_buffered_close; stream->stream.flush = mongoc_stream_buffered_flush; stream->stream.writev = mongoc_stream_buffered_writev; stream->stream.readv = mongoc_stream_buffered_readv; stream->stream.get_base_stream = _mongoc_stream_buffered_get_base_stream; stream->stream.check_closed = _mongoc_stream_buffered_check_closed; stream->stream.timed_out = _mongoc_stream_buffered_timed_out; stream->stream.should_retry = _mongoc_stream_buffered_should_retry; stream->base_stream = base_stream; _mongoc_buffer_init(&stream->buffer, NULL, buffer_size, NULL, NULL); mongoc_counter_streams_active_inc(); return (mongoc_stream_t *)stream; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-buffered.h000066400000000000000000000017711511661753600257020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_BUFFERED_H #define MONGOC_STREAM_BUFFERED_H #include #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_buffered_new(mongoc_stream_t *base_stream, size_t buffer_size) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_STREAM_BUFFERED_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-file.c000066400000000000000000000135001511661753600250230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef _WIN32 #include #include #endif #include #include #include #include #include /* * TODO: This does not respect timeouts or set O_NONBLOCK. * But that should be fine until it isn't :-) */ struct _mongoc_stream_file_t { mongoc_stream_t vtable; int fd; }; static int _mongoc_stream_file_close(mongoc_stream_t *stream) { mongoc_stream_file_t *file = (mongoc_stream_file_t *)stream; int ret; ENTRY; BSON_ASSERT(file); if (file->fd != -1) { #ifdef _WIN32 ret = _close(file->fd); #else ret = close(file->fd); #endif file->fd = -1; RETURN(ret); } RETURN(0); } static void _mongoc_stream_file_destroy(mongoc_stream_t *stream) { mongoc_stream_file_t *file = (mongoc_stream_file_t *)stream; ENTRY; BSON_ASSERT(file); if (file->fd) { _mongoc_stream_file_close(stream); } bson_free(file); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_stream_file_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_stream_file_destroy(stream); EXIT; } static int _mongoc_stream_file_flush(mongoc_stream_t *stream) /* IN */ { mongoc_stream_file_t *file = (mongoc_stream_file_t *)stream; BSON_ASSERT(file); if (file->fd != -1) { #ifdef _WIN32 return _commit(file->fd); #else return fsync(file->fd); #endif } return 0; } static ssize_t _mongoc_stream_file_readv(mongoc_stream_t *stream, /* IN */ mongoc_iovec_t *iov, /* IN */ size_t iovcnt, /* IN */ size_t min_bytes, /* IN */ int32_t timeout_msec) /* IN */ { mongoc_stream_file_t *file = (mongoc_stream_file_t *)stream; ssize_t ret = 0; BSON_UNUSED(min_bytes); BSON_UNUSED(timeout_msec); #ifdef _WIN32 { ENTRY; for (size_t i = 0u; i < iovcnt; i++) { BSON_ASSERT(mlib_in_range(unsigned int, iov[i].iov_len)); const int nread = _read(file->fd, iov[i].iov_base, (unsigned int)iov[i].iov_len); if (nread < 0) { ret = ret ? ret : -1; GOTO(done); } else if (nread == 0) { ret = ret ? ret : 0; GOTO(done); } else { ret += nread; if ((size_t)nread != iov[i].iov_len) { ret = ret ? ret : -1; GOTO(done); } } } GOTO(done); } #else { ENTRY; BSON_ASSERT(mlib_in_range(int, iovcnt)); ret = readv(file->fd, iov, (int)iovcnt); GOTO(done); } #endif done: if (ret > 0) { mongoc_counter_streams_ingress_add(ret); } return ret; } static ssize_t _mongoc_stream_file_writev(mongoc_stream_t *stream, /* IN */ mongoc_iovec_t *iov, /* IN */ size_t iovcnt, /* IN */ int32_t timeout_msec) /* IN */ { mongoc_stream_file_t *file = (mongoc_stream_file_t *)stream; ssize_t ret = 0; BSON_UNUSED(timeout_msec); #ifdef _WIN32 { for (size_t i = 0; i < iovcnt; i++) { BSON_ASSERT(mlib_in_range(unsigned int, iov[i].iov_len)); const int nwrite = _write(file->fd, iov[i].iov_base, (unsigned int)iov[i].iov_len); if (mlib_cmp(nwrite, !=, iov[i].iov_len)) { ret = ret ? ret : -1; goto done; } ret += nwrite; } goto done; } #else { BSON_ASSERT(mlib_in_range(int, iovcnt)); ret = writev(file->fd, iov, (int)iovcnt); goto done; } #endif done: if (ret > 0) { mongoc_counter_streams_egress_add(ret); } return ret; } static bool _mongoc_stream_file_check_closed(mongoc_stream_t *stream) /* IN */ { BSON_UNUSED(stream); return false; } mongoc_stream_t * mongoc_stream_file_new(int fd) /* IN */ { mongoc_stream_file_t *stream; BSON_ASSERT(fd != -1); stream = (mongoc_stream_file_t *)bson_malloc0(sizeof *stream); stream->vtable.type = MONGOC_STREAM_FILE; stream->vtable.close = _mongoc_stream_file_close; stream->vtable.destroy = _mongoc_stream_file_destroy; stream->vtable.failed = _mongoc_stream_file_failed; stream->vtable.flush = _mongoc_stream_file_flush; stream->vtable.readv = _mongoc_stream_file_readv; stream->vtable.writev = _mongoc_stream_file_writev; stream->vtable.check_closed = _mongoc_stream_file_check_closed; stream->fd = fd; mongoc_counter_streams_active_inc(); return (mongoc_stream_t *)stream; } mongoc_stream_t * mongoc_stream_file_new_for_path(const char *path, /* IN */ int flags, /* IN */ int mode) /* IN */ { int fd = -1; BSON_ASSERT(path); #ifdef _WIN32 if (_sopen_s(&fd, path, (flags | _O_BINARY), _SH_DENYNO, mode) != 0) { fd = -1; } #else fd = open(path, flags, mode); #endif if (fd == -1) { return NULL; } return mongoc_stream_file_new(fd); } int mongoc_stream_file_get_fd(mongoc_stream_file_t *stream) { BSON_ASSERT(stream); return stream->fd; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-file.h000066400000000000000000000022661511661753600250370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_FILE_H #define MONGOC_STREAM_FILE_H #include #include BSON_BEGIN_DECLS typedef struct _mongoc_stream_file_t mongoc_stream_file_t; MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_file_new(int fd) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_file_new_for_path(const char *path, int flags, int mode) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(int) mongoc_stream_file_get_fd(mongoc_stream_file_t *stream); BSON_END_DECLS #endif /* MONGOC_STREAM_FILE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs-download-private.h000066400000000000000000000021001511661753600306360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_GRIDFS_DOWNLOAD_PRIVATE_H #define MONGOC_STREAM_GRIDFS_DOWNLOAD_PRIVATE_H #include #include typedef struct { mongoc_stream_t stream; mongoc_gridfs_bucket_file_t *file; } mongoc_gridfs_download_stream_t; mongoc_stream_t * _mongoc_download_stream_gridfs_new(mongoc_gridfs_bucket_file_t *file); #endif /* MONGOC_STREAM_GRIDFS_DOWNLOAD_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs-download.c000066400000000000000000000064651511661753600272030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-gridfs-download" static void _mongoc_download_stream_gridfs_destroy(mongoc_stream_t *stream) { mongoc_gridfs_download_stream_t *gridfs = (mongoc_gridfs_download_stream_t *)stream; ENTRY; BSON_ASSERT(stream); mongoc_stream_close(stream); _mongoc_gridfs_bucket_file_destroy(gridfs->file); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_download_stream_gridfs_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_download_stream_gridfs_destroy(stream); EXIT; } static int _mongoc_download_stream_gridfs_close(mongoc_stream_t *stream) { mongoc_gridfs_download_stream_t *gridfs = (mongoc_gridfs_download_stream_t *)stream; int ret = 0; ENTRY; BSON_ASSERT(stream); gridfs->file->finished = true; RETURN(ret); } static ssize_t _mongoc_download_stream_gridfs_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_gridfs_download_stream_t *gridfs = (mongoc_gridfs_download_stream_t *)stream; ssize_t ret = 0; ENTRY; BSON_ASSERT(stream); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); (void)min_bytes; /* unused. */ (void)timeout_msec; /* unused. */ /* timeout_msec is unused by mongoc_gridfs_bucket_file_readv */ ret = _mongoc_gridfs_bucket_file_readv(gridfs->file, iov, iovcnt); mongoc_counter_streams_ingress_add(ret); RETURN(ret); } static bool _mongoc_download_stream_gridfs_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_gridfs_download_stream_t *gridfs = (mongoc_gridfs_download_stream_t *)stream; ENTRY; BSON_ASSERT(stream); RETURN(gridfs->file->finished); } mongoc_stream_t * _mongoc_download_stream_gridfs_new(mongoc_gridfs_bucket_file_t *file) { mongoc_gridfs_download_stream_t *stream; ENTRY; BSON_ASSERT(file); stream = (mongoc_gridfs_download_stream_t *)bson_malloc0(sizeof *stream); stream->file = file; stream->stream.type = MONGOC_STREAM_GRIDFS_DOWNLOAD; stream->stream.destroy = _mongoc_download_stream_gridfs_destroy; stream->stream.failed = _mongoc_download_stream_gridfs_failed; stream->stream.close = _mongoc_download_stream_gridfs_close; stream->stream.readv = _mongoc_download_stream_gridfs_readv; stream->stream.check_closed = _mongoc_download_stream_gridfs_check_closed; mongoc_counter_streams_active_inc(); RETURN((mongoc_stream_t *)stream); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs-upload-private.h000066400000000000000000000020661511661753600303260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_GRIDFS_UPLOAD_PRIVATE_H #define MONGOC_STREAM_GRIDFS_UPLOAD_PRIVATE_H #include #include typedef struct { mongoc_stream_t stream; mongoc_gridfs_bucket_file_t *file; } mongoc_gridfs_upload_stream_t; mongoc_stream_t * _mongoc_upload_stream_gridfs_new(mongoc_gridfs_bucket_file_t *file); #endif /* MONGOC_STREAM_GRIDFS_UPLOAD_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs-upload.c000066400000000000000000000063101511661753600266450ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-gridfs-upload" static void _mongoc_upload_stream_gridfs_destroy(mongoc_stream_t *stream) { mongoc_gridfs_upload_stream_t *gridfs = (mongoc_gridfs_upload_stream_t *)stream; ENTRY; BSON_ASSERT(stream); mongoc_stream_close(stream); _mongoc_gridfs_bucket_file_destroy(gridfs->file); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_upload_stream_gridfs_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_upload_stream_gridfs_destroy(stream); EXIT; } static int _mongoc_upload_stream_gridfs_close(mongoc_stream_t *stream) { mongoc_gridfs_upload_stream_t *gridfs = (mongoc_gridfs_upload_stream_t *)stream; int ret = 0; ENTRY; BSON_ASSERT(stream); ret = _mongoc_gridfs_bucket_file_save(gridfs->file); RETURN(ret ? 0 : 1); } static ssize_t _mongoc_upload_stream_gridfs_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_gridfs_upload_stream_t *gridfs = (mongoc_gridfs_upload_stream_t *)stream; ssize_t ret = 0; ENTRY; BSON_ASSERT(stream); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); (void)timeout_msec; /* unused. */ ret = _mongoc_gridfs_bucket_file_writev(gridfs->file, iov, iovcnt); if (!ret) { RETURN(ret); } mongoc_counter_streams_egress_add(ret); RETURN(ret); } static bool _mongoc_upload_stream_gridfs_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_gridfs_upload_stream_t *gridfs = (mongoc_gridfs_upload_stream_t *)stream; ENTRY; BSON_ASSERT(stream); RETURN(gridfs->file->saved); } mongoc_stream_t * _mongoc_upload_stream_gridfs_new(mongoc_gridfs_bucket_file_t *file) { mongoc_gridfs_upload_stream_t *stream; ENTRY; BSON_ASSERT(file); stream = (mongoc_gridfs_upload_stream_t *)bson_malloc0(sizeof *stream); stream->file = file; stream->stream.type = MONGOC_STREAM_GRIDFS_UPLOAD; stream->stream.destroy = _mongoc_upload_stream_gridfs_destroy; stream->stream.failed = _mongoc_upload_stream_gridfs_failed; stream->stream.close = _mongoc_upload_stream_gridfs_close; stream->stream.writev = _mongoc_upload_stream_gridfs_writev; stream->stream.check_closed = _mongoc_upload_stream_gridfs_check_closed; mongoc_counter_streams_active_inc(); RETURN((mongoc_stream_t *)stream); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs.c000066400000000000000000000076501511661753600253730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-gridfs" typedef struct { mongoc_stream_t stream; mongoc_gridfs_file_t *file; } mongoc_stream_gridfs_t; static void _mongoc_stream_gridfs_destroy(mongoc_stream_t *stream) { ENTRY; BSON_ASSERT(stream); mongoc_stream_close(stream); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_stream_gridfs_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_stream_gridfs_destroy(stream); EXIT; } static int _mongoc_stream_gridfs_close(mongoc_stream_t *stream) { mongoc_stream_gridfs_t *gridfs = (mongoc_stream_gridfs_t *)stream; int ret = 0; ENTRY; BSON_ASSERT(stream); ret = mongoc_gridfs_file_save(gridfs->file); RETURN(ret); } static int _mongoc_stream_gridfs_flush(mongoc_stream_t *stream) { mongoc_stream_gridfs_t *gridfs = (mongoc_stream_gridfs_t *)stream; int ret = 0; ENTRY; BSON_ASSERT(stream); ret = mongoc_gridfs_file_save(gridfs->file); RETURN(ret); } static ssize_t _mongoc_stream_gridfs_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_stream_gridfs_t *file = (mongoc_stream_gridfs_t *)stream; ssize_t ret = 0; ENTRY; BSON_UNUSED(timeout_msec); BSON_ASSERT(stream); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); /* timeout_msec is unused by mongoc_gridfs_file_readv */ ret = mongoc_gridfs_file_readv(file->file, iov, iovcnt, min_bytes, 0); mongoc_counter_streams_ingress_add(ret); RETURN(ret); } static ssize_t _mongoc_stream_gridfs_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_stream_gridfs_t *file = (mongoc_stream_gridfs_t *)stream; ssize_t ret = 0; ENTRY; BSON_UNUSED(timeout_msec); BSON_ASSERT(stream); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); /* timeout_msec is unused by mongoc_gridfs_file_writev */ ret = mongoc_gridfs_file_writev(file->file, iov, iovcnt, 0); if (!ret) { RETURN(ret); } mongoc_counter_streams_egress_add(ret); RETURN(ret); } static bool _mongoc_stream_gridfs_check_closed(mongoc_stream_t *stream) /* IN */ { BSON_UNUSED(stream); return false; } mongoc_stream_t * mongoc_stream_gridfs_new(mongoc_gridfs_file_t *file) { mongoc_stream_gridfs_t *stream; ENTRY; BSON_ASSERT(file); stream = (mongoc_stream_gridfs_t *)bson_malloc0(sizeof *stream); stream->file = file; stream->stream.type = MONGOC_STREAM_GRIDFS; stream->stream.destroy = _mongoc_stream_gridfs_destroy; stream->stream.failed = _mongoc_stream_gridfs_failed; stream->stream.close = _mongoc_stream_gridfs_close; stream->stream.flush = _mongoc_stream_gridfs_flush; stream->stream.writev = _mongoc_stream_gridfs_writev; stream->stream.readv = _mongoc_stream_gridfs_readv; stream->stream.check_closed = _mongoc_stream_gridfs_check_closed; mongoc_counter_streams_active_inc(); RETURN((mongoc_stream_t *)stream); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-gridfs.h000066400000000000000000000017751511661753600254020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_GRIDFS_H #define MONGOC_STREAM_GRIDFS_H #include #include #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_gridfs_new(mongoc_gridfs_file_t *file) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_STREAM_GRIDFS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-private.h000066400000000000000000000033401511661753600255640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_PRIVATE_H #define MONGOC_STREAM_PRIVATE_H #include // IWYU pragma: export // #include #include BSON_BEGIN_DECLS #define MONGOC_STREAM_SOCKET 1 #define MONGOC_STREAM_FILE 2 #define MONGOC_STREAM_BUFFERED 3 #define MONGOC_STREAM_GRIDFS 4 #define MONGOC_STREAM_TLS 5 #define MONGOC_STREAM_GRIDFS_UPLOAD 6 #define MONGOC_STREAM_GRIDFS_DOWNLOAD 7 bool mongoc_stream_wait(mongoc_stream_t *stream, int64_t expire_at); bool _mongoc_stream_writev_full( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int64_t timeout_msec, bson_error_t *error); mongoc_stream_t * mongoc_stream_get_root_stream(mongoc_stream_t *stream); /** * @brief Poll the given set of streams * * @param streams Pointer to an array of stream polling parameters * @param nstreams The number of streams in the array * @param until A timer that will wake up `poll()` from blocking */ ssize_t _mongoc_stream_poll_internal(mongoc_stream_poll_t *streams, size_t nstreams, mlib_timer until); BSON_END_DECLS #endif /* MONGOC_STREAM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-socket.c000066400000000000000000000164041511661753600254020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream" struct _mongoc_stream_socket_t { mongoc_stream_t vtable; mongoc_socket_t *sock; }; static BSON_INLINE int64_t get_expiration(int32_t timeout_msec) { if (timeout_msec < 0) { return -1; } else if (timeout_msec == 0) { return 0; } else { return (bson_get_monotonic_time() + ((int64_t)timeout_msec * 1000L)); } } static int _mongoc_stream_socket_close(mongoc_stream_t *stream) { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; int ret; ENTRY; BSON_ASSERT(ss); if (ss->sock) { ret = mongoc_socket_close(ss->sock); RETURN(ret); } RETURN(0); } static void _mongoc_stream_socket_destroy(mongoc_stream_t *stream) { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; ENTRY; BSON_ASSERT(ss); if (ss->sock) { mongoc_socket_destroy(ss->sock); ss->sock = NULL; } bson_free(ss); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_stream_socket_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_stream_socket_destroy(stream); EXIT; } static int _mongoc_stream_socket_setsockopt(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; int ret; ENTRY; BSON_ASSERT(ss); BSON_ASSERT(ss->sock); ret = mongoc_socket_setsockopt(ss->sock, level, optname, optval, optlen); RETURN(ret); } static int _mongoc_stream_socket_flush(mongoc_stream_t *stream) { ENTRY; BSON_UNUSED(stream); RETURN(0); } static ssize_t _mongoc_stream_socket_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; int64_t expire_at; ssize_t ret = 0; ssize_t nread; size_t cur = 0; ENTRY; BSON_ASSERT(ss); BSON_ASSERT(ss->sock); expire_at = get_expiration(timeout_msec); /* * This isn't ideal, we should plumb through to recvmsg(), but we * don't actually use this in any way but to a single buffer * currently anyway, so should be just fine. */ for (;;) { nread = mongoc_socket_recv(ss->sock, iov[cur].iov_base, iov[cur].iov_len, 0, expire_at); if (nread <= 0) { if (ret >= (ssize_t)min_bytes) { RETURN(ret); } errno = mongoc_socket_errno(ss->sock); RETURN(-1); } ret += nread; while ((cur < iovcnt) && (nread >= (ssize_t)iov[cur].iov_len)) { nread -= iov[cur++].iov_len; } if (cur == iovcnt) { break; } if (ret >= (ssize_t)min_bytes) { RETURN(ret); } iov[cur].iov_base = ((char *)iov[cur].iov_base) + nread; iov[cur].iov_len -= nread; BSON_ASSERT(iovcnt - cur); BSON_ASSERT(iov[cur].iov_len); } RETURN(ret); } static ssize_t _mongoc_stream_socket_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; int64_t expire_at; ssize_t ret; ENTRY; if (ss->sock) { expire_at = get_expiration(timeout_msec); ret = mongoc_socket_sendv(ss->sock, iov, iovcnt, expire_at); errno = mongoc_socket_errno(ss->sock); RETURN(ret); } RETURN(-1); } static ssize_t _mongoc_stream_socket_poll(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout_msec) { ssize_t ret = -1; mongoc_socket_poll_t *sds; mongoc_stream_socket_t *ss; ENTRY; sds = BSON_ARRAY_ALLOC(nstreams, mongoc_socket_poll_t); for (size_t i = 0u; i < nstreams; i++) { ss = (mongoc_stream_socket_t *)streams[i].stream; if (!ss->sock) { goto CLEANUP; } sds[i].socket = ss->sock; sds[i].events = streams[i].events; } ret = mongoc_socket_poll(sds, nstreams, timeout_msec); if (ret > 0) { for (size_t i = 0u; i < nstreams; i++) { streams[i].revents = sds[i].revents; } } CLEANUP: bson_free(sds); RETURN(ret); } mongoc_socket_t * mongoc_stream_socket_get_socket(mongoc_stream_socket_t *stream) /* IN */ { BSON_ASSERT(stream); return stream->sock; } static bool _mongoc_stream_socket_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; ENTRY; BSON_ASSERT(stream); if (ss->sock) { RETURN(mongoc_socket_check_closed(ss->sock)); } RETURN(true); } static bool _mongoc_stream_socket_timed_out(mongoc_stream_t *stream) /* IN */ { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; ENTRY; BSON_ASSERT(ss); BSON_ASSERT(ss->sock); RETURN(MONGOC_ERRNO_IS_TIMEDOUT(ss->sock->errno_)); } static bool _mongoc_stream_socket_should_retry(mongoc_stream_t *stream) /* IN */ { mongoc_stream_socket_t *ss = (mongoc_stream_socket_t *)stream; ENTRY; BSON_ASSERT(ss); BSON_ASSERT(ss->sock); RETURN(MONGOC_ERRNO_IS_AGAIN(ss->sock->errno_)); } /* *-------------------------------------------------------------------------- * * mongoc_stream_socket_new -- * * Create a new mongoc_stream_t using the mongoc_socket_t for * read and write underneath. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_stream_socket_new(mongoc_socket_t *sock) /* IN */ { mongoc_stream_socket_t *stream; BSON_ASSERT(sock); stream = (mongoc_stream_socket_t *)bson_malloc0(sizeof *stream); stream->vtable.type = MONGOC_STREAM_SOCKET; stream->vtable.close = _mongoc_stream_socket_close; stream->vtable.destroy = _mongoc_stream_socket_destroy; stream->vtable.failed = _mongoc_stream_socket_failed; stream->vtable.flush = _mongoc_stream_socket_flush; stream->vtable.readv = _mongoc_stream_socket_readv; stream->vtable.writev = _mongoc_stream_socket_writev; stream->vtable.setsockopt = _mongoc_stream_socket_setsockopt; stream->vtable.check_closed = _mongoc_stream_socket_check_closed; stream->vtable.timed_out = _mongoc_stream_socket_timed_out; stream->vtable.should_retry = _mongoc_stream_socket_should_retry; stream->vtable.poll = _mongoc_stream_socket_poll; stream->sock = sock; mongoc_counter_streams_active_inc(); return (mongoc_stream_t *)stream; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-socket.h000066400000000000000000000022051511661753600254010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_SOCKET_H #define MONGOC_STREAM_SOCKET_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_stream_socket_t mongoc_stream_socket_t; MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_socket_new(mongoc_socket_t *socket) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_socket_t *) mongoc_stream_socket_get_socket(mongoc_stream_socket_t *stream); BSON_END_DECLS #endif /* MONGOC_STREAM_SOCKET_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-openssl-bio-private.h000066400000000000000000000030601511661753600306130ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_OPENSSL_BIO_PRIVATE_H #define MONGOC_STREAM_TLS_OPENSSL_BIO_PRIVATE_H #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #include #include BSON_BEGIN_DECLS BIO_METHOD * mongoc_stream_tls_openssl_bio_meth_new(void); void mongoc_stream_tls_openssl_bio_set_data(BIO *b, void *ptr); int mongoc_stream_tls_openssl_bio_create(BIO *b); int mongoc_stream_tls_openssl_bio_destroy(BIO *b); int mongoc_stream_tls_openssl_bio_read(BIO *b, char *buf, int len); int mongoc_stream_tls_openssl_bio_write(BIO *b, const char *buf, int len); long mongoc_stream_tls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr); int mongoc_stream_tls_openssl_bio_gets(BIO *b, char *buf, int len); int mongoc_stream_tls_openssl_bio_puts(BIO *b, const char *str); BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_OPENSSL */ #endif /* MONGOC_STREAM_TLS_OPENSSL_BIO_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-openssl-bio.c000066400000000000000000000225571511661753600271520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-tls-openssl-bio" #if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) /* Magic vtable to make our BIO shim */ static BIO_METHOD gMongocStreamTlsOpenSslRawMethods = {BIO_TYPE_FILTER, "mongoc-stream-tls-glue", mongoc_stream_tls_openssl_bio_write, mongoc_stream_tls_openssl_bio_read, mongoc_stream_tls_openssl_bio_puts, mongoc_stream_tls_openssl_bio_gets, mongoc_stream_tls_openssl_bio_ctrl, mongoc_stream_tls_openssl_bio_create, mongoc_stream_tls_openssl_bio_destroy, NULL}; static void BIO_set_data(BIO *b, void *ptr) { b->ptr = ptr; } static void * BIO_get_data(BIO *b) { return b->ptr; } static void BIO_set_init(BIO *b, int init) { b->init = init; } BIO_METHOD * mongoc_stream_tls_openssl_bio_meth_new(void) { BIO_METHOD *meth = NULL; meth = &gMongocStreamTlsOpenSslRawMethods; return meth; } #else BIO_METHOD * mongoc_stream_tls_openssl_bio_meth_new(void) { BIO_METHOD *meth = NULL; meth = BIO_meth_new(BIO_TYPE_FILTER, "mongoc-stream-tls-glue"); if (meth) { BIO_meth_set_write(meth, mongoc_stream_tls_openssl_bio_write); BIO_meth_set_read(meth, mongoc_stream_tls_openssl_bio_read); BIO_meth_set_puts(meth, mongoc_stream_tls_openssl_bio_puts); BIO_meth_set_gets(meth, mongoc_stream_tls_openssl_bio_gets); BIO_meth_set_ctrl(meth, mongoc_stream_tls_openssl_bio_ctrl); BIO_meth_set_create(meth, mongoc_stream_tls_openssl_bio_create); BIO_meth_set_destroy(meth, mongoc_stream_tls_openssl_bio_destroy); } return meth; } #endif void mongoc_stream_tls_openssl_bio_set_data(BIO *b, void *ptr) { BIO_set_data(b, ptr); } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_create -- * * BIO callback to create a new BIO instance. * * Returns: * 1 if successful. * * Side effects: * @b is initialized. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_create(BIO *b) { BSON_ASSERT(b); BIO_set_init(b, 1); BIO_set_data(b, NULL); BIO_set_flags(b, 0); return 1; } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_destroy -- * * Release resources associated with BIO. * * Returns: * 1 if successful. * * Side effects: * @b is destroyed. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_destroy(BIO *b) { mongoc_stream_tls_t *tls; BSON_ASSERT(b); tls = (mongoc_stream_tls_t *)BIO_get_data(b); if (!tls) { return -1; } BIO_set_data(b, NULL); BIO_set_init(b, 0); BIO_set_flags(b, 0); ((mongoc_stream_tls_openssl_t *)tls->ctx)->bio = NULL; return 1; } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_read -- * * Read from the underlying stream to BIO. * * Returns: * -1 on failure; otherwise the number of bytes read. * * Side effects: * @buf is filled with data read from underlying stream. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_read(BIO *b, char *buf, int len) { mongoc_stream_tls_t *tls; mongoc_stream_tls_openssl_t *openssl; BSON_ASSERT(b); BSON_ASSERT(buf); ENTRY; tls = (mongoc_stream_tls_t *)BIO_get_data(b); if (!tls) { RETURN(-1); } if (len < 0) { RETURN(-1); } if (BSON_UNLIKELY(!mlib_in_range(int32_t, tls->timeout_msec))) { // CDRIVER-4589 MONGOC_ERROR("timeout_msec value %" PRId64 " exceeds supported 32-bit range", tls->timeout_msec); return -1; } openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; errno = 0; const ssize_t ret = mongoc_stream_read(tls->base_stream, buf, (size_t)len, 0, (int32_t)tls->timeout_msec); BIO_clear_retry_flags(b); if ((ret <= 0) && MONGOC_ERRNO_IS_AGAIN(errno)) { /* this BIO is not the same as "b", which openssl passed in to this func. * set its retry flag, which we check with BIO_should_retry in * mongoc-stream-tls-openssl.c */ BIO_set_retry_read(openssl->bio); } BSON_ASSERT(mlib_in_range(int, ret)); RETURN((int)ret); } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_write -- * * Write to the underlying stream on behalf of BIO. * * Returns: * -1 on failure; otherwise the number of bytes written. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_write(BIO *b, const char *buf, int len) { mongoc_stream_tls_t *tls; mongoc_stream_tls_openssl_t *openssl; mongoc_iovec_t iov; ENTRY; BSON_ASSERT(b); BSON_ASSERT(buf); tls = (mongoc_stream_tls_t *)BIO_get_data(b); if (!tls) { RETURN(-1); } if (len < 0) { RETURN(-1); } openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; iov.iov_base = (void *)buf; iov.iov_len = (size_t)len; if (BSON_UNLIKELY(!mlib_in_range(int32_t, tls->timeout_msec))) { // CDRIVER-4589 MONGOC_ERROR("timeout_msec value %" PRId64 " exceeds supported 32-bit range", tls->timeout_msec); RETURN(-1); } errno = 0; TRACE("mongoc_stream_writev is expected to write: %d", len); const ssize_t ret = mongoc_stream_writev(tls->base_stream, &iov, 1, (int32_t)tls->timeout_msec); BIO_clear_retry_flags(b); if (len > ret) { TRACE("Returned short write: %zd of %d", ret, len); } else { TRACE("Completed the %zd", ret); } if (ret <= 0 && MONGOC_ERRNO_IS_AGAIN(errno)) { /* this BIO is not the same as "b", which openssl passed in to this func. * set its retry flag, which we check with BIO_should_retry in * mongoc-stream-tls-openssl.c */ TRACE("%s", "Requesting a retry"); BIO_set_retry_write(openssl->bio); } BSON_ASSERT(mlib_in_range(int, ret)); RETURN((int)ret); } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_ctrl -- * * Handle ctrl callback for BIO. * * Returns: * ioctl dependent. * * Side effects: * ioctl dependent. * *-------------------------------------------------------------------------- */ long mongoc_stream_tls_openssl_bio_ctrl(BIO *b, int cmd, long num, void *ptr) { BSON_UNUSED(b); BSON_UNUSED(num); BSON_UNUSED(ptr); switch (cmd) { case BIO_CTRL_FLUSH: return 1; default: return 0; } } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_gets -- * * BIO callback for gets(). Not supported. * * Returns: * -1 always. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_gets(BIO *b, char *buf, int len) { BSON_UNUSED(b); BSON_UNUSED(buf); BSON_UNUSED(len); return -1; } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_bio_puts -- * * BIO callback to perform puts(). Just calls the actual write * callback. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ int mongoc_stream_tls_openssl_bio_puts(BIO *b, const char *str) { return mongoc_stream_tls_openssl_bio_write(b, str, (int)strlen(str)); } #endif /* MONGOC_ENABLE_SSL_OPENSSL */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-openssl-private.h000066400000000000000000000037351511661753600300550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_OPENSSL_PRIVATE_H #define MONGOC_STREAM_TLS_OPENSSL_PRIVATE_H #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #include BSON_BEGIN_DECLS typedef struct { char *host; bool allow_invalid_hostname; bool weak_cert_validation; bool disable_endpoint_check; /* If reaching out to an OCSP responder requires TLS, * use the same TLS options that the user provided. */ mongoc_ssl_opt_t ssl_opts; } mongoc_openssl_ocsp_opt_t; void mongoc_openssl_ocsp_opt_destroy(void *ocsp_opt); /** * mongoc_stream_tls_openssl_t: * * Private storage for handling callbacks from mongoc_stream and BIO_* */ typedef struct { BIO *bio; BIO_METHOD *meth; SSL_CTX *ctx; mongoc_openssl_ocsp_opt_t *ocsp_opts; } mongoc_stream_tls_openssl_t; #if OPENSSL_VERSION_NUMBER >= 0x10100000L MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_openssl_new_with_context(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client, SSL_CTX *ssl_ctx) BSON_GNUC_WARN_UNUSED_RESULT; #endif BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_OPENSSL */ #endif /* MONGOC_STREAM_TLS_OPENSSL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-openssl.c000066400000000000000000000612571511661753600264030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-tls-openssl" #define MONGOC_STREAM_TLS_OPENSSL_BUFFER_SIZE 4096 #if OPENSSL_VERSION_NUMBER < 0x10100000L || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x20700000L) static void BIO_meth_free(BIO_METHOD *meth) { /* Nothing to free pre OpenSSL 1.1.0 */ } #endif /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_destroy -- * * Cleanup after usage of a mongoc_stream_tls_openssl_t. Free all *allocated * resources and ensure connections are closed. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _mongoc_stream_tls_openssl_destroy(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; BSON_ASSERT(tls); BIO_free_all(openssl->bio); openssl->bio = NULL; BIO_meth_free(openssl->meth); openssl->meth = NULL; mongoc_stream_destroy(tls->base_stream); tls->base_stream = NULL; SSL_CTX_free(openssl->ctx); openssl->ctx = NULL; mongoc_openssl_ocsp_opt_destroy(openssl->ocsp_opts); openssl->ocsp_opts = NULL; bson_free(openssl); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_failed -- * * Called on stream failure. Same as _mongoc_stream_tls_openssl_destroy() * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _mongoc_stream_tls_openssl_failed(mongoc_stream_t *stream) { _mongoc_stream_tls_openssl_destroy(stream); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_close -- * * Close the underlying socket. * * Linus dictates that you should not check the result of close() * since there is a race condition with EAGAIN and a new file * descriptor being opened. * * Returns: * 0 on success; otherwise -1. * * Side effects: * The BIO fd is closed. * *-------------------------------------------------------------------------- */ static int _mongoc_stream_tls_openssl_close(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; int ret = 0; ENTRY; BSON_ASSERT(tls); ret = mongoc_stream_close(tls->base_stream); RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_flush -- * * Flush the underlying stream. * * Returns: * 0 if successful; otherwise -1. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static int _mongoc_stream_tls_openssl_flush(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; BSON_ASSERT(openssl); return BIO_flush(openssl->bio); } static ssize_t _mongoc_stream_tls_openssl_write(mongoc_stream_tls_t *tls, char *buf, size_t buf_len) { mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; ssize_t ret; int64_t now; int64_t expire = 0; ENTRY; BSON_ASSERT(tls); BSON_ASSERT(buf); BSON_ASSERT(buf_len); if (tls->timeout_msec >= 0) { expire = bson_get_monotonic_time() + (tls->timeout_msec * 1000); } BSON_ASSERT(mlib_in_range(int, buf_len)); ret = BIO_write(openssl->bio, buf, (int)buf_len); if (ret <= 0) { return ret; } if (expire) { now = bson_get_monotonic_time(); if ((expire - now) < 0) { if (mlib_cmp(ret, <, buf_len)) { mongoc_counter_streams_timeout_inc(); } tls->timeout_msec = 0; } else { tls->timeout_msec = (expire - now) / 1000; } } RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_writev -- * * Write the iovec to the stream. This function will try to write * all of the bytes or fail. If the number of bytes is not equal * to the number requested, a failure or EOF has occurred. * * Returns: * -1 on failure, otherwise the number of bytes written. * * Side effects: * None. * * This function is copied as _mongoc_stream_tls_secure_transport_writev *-------------------------------------------------------------------------- */ static ssize_t _mongoc_stream_tls_openssl_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; char buf[MONGOC_STREAM_TLS_OPENSSL_BUFFER_SIZE]; ssize_t ret = 0; ssize_t child_ret; size_t i; size_t iov_pos = 0; /* There's a bit of a dance to coalesce vectorized writes into * MONGOC_STREAM_TLS_OPENSSL_BUFFER_SIZE'd writes to avoid lots of small tls * packets. * * The basic idea is that we want to combine writes in the buffer if they're * smaller than the buffer, flushing as it gets full. For larger writes, or * the last write in the iovec array, we want to ignore the buffer and just * write immediately. We take care of doing buffer writes by re-invoking * ourself with a single iovec_t, pointing at our stack buffer. */ char *buf_head = buf; char *buf_tail = buf; char *buf_end = buf + MONGOC_STREAM_TLS_OPENSSL_BUFFER_SIZE; size_t bytes; char *to_write = NULL; size_t to_write_len = 0u; BSON_ASSERT(tls); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); ENTRY; tls->timeout_msec = timeout_msec; for (i = 0; i < iovcnt; i++) { iov_pos = 0; while (iov_pos < iov[i].iov_len) { BSON_ASSERT(buf_end >= buf_tail); const size_t buf_remaining = (size_t)(buf_end - buf_tail); if (buf_head != buf_tail || ((i + 1 < iovcnt) && (buf_remaining > (iov[i].iov_len - iov_pos)))) { /* If we have either of: * - buffered bytes already * - another iovec to send after this one and we don't have more * bytes to send than the size of the buffer. * * copy into the buffer */ bytes = BSON_MIN(iov[i].iov_len - iov_pos, buf_remaining); memcpy(buf_tail, (char *)iov[i].iov_base + iov_pos, bytes); buf_tail += bytes; iov_pos += bytes; if (buf_tail == buf_end) { /* If we're full, request send */ to_write = buf_head; to_write_len = (size_t)(buf_tail - buf_head); buf_tail = buf_head = buf; } } else { /* Didn't buffer, so just write it through */ to_write = (char *)iov[i].iov_base + iov_pos; to_write_len = iov[i].iov_len - iov_pos; iov_pos += to_write_len; } if (to_write) { /* We get here if we buffered some bytes and filled the buffer, or * if we didn't buffer and have to send out of the iovec */ child_ret = _mongoc_stream_tls_openssl_write(tls, to_write, to_write_len); if (mlib_cmp(child_ret, !=, to_write_len)) { TRACE("Got child_ret: %zd while to_write_len is: %zu", child_ret, to_write_len); } if (child_ret < 0) { TRACE("Returning what I had (%zd) as apposed to the error " "(%zd, errno:%d)", ret, child_ret, errno); RETURN(ret); } ret += child_ret; if (mlib_cmp(child_ret, <, to_write_len)) { /* we timed out, so send back what we could send */ RETURN(ret); } to_write = NULL; } } } if (buf_head != buf_tail) { /* If we have any bytes buffered, send */ child_ret = _mongoc_stream_tls_openssl_write(tls, buf_head, buf_tail - buf_head); if (child_ret < 0) { RETURN(child_ret); } ret += child_ret; } if (ret >= 0) { mongoc_counter_streams_egress_add(ret); } RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_readv -- * * Read from the stream into iov. This function will try to read * all of the bytes or fail. If the number of bytes is not equal * to the number requested, a failure or EOF has occurred. * * Returns: * -1 on failure, 0 on EOF, otherwise the number of bytes read. * * Side effects: * iov buffers will be written to. * * This function is copied as _mongoc_stream_tls_secure_transport_readv * *-------------------------------------------------------------------------- */ static ssize_t _mongoc_stream_tls_openssl_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; ssize_t ret = 0; size_t i; int read_ret; size_t iov_pos = 0; int64_t now; int64_t expire = 0; ENTRY; BSON_ASSERT(tls); BSON_ASSERT(iov); BSON_ASSERT(iovcnt); tls->timeout_msec = timeout_msec; if (timeout_msec >= 0) { expire = bson_get_monotonic_time() + (timeout_msec * 1000UL); } for (i = 0; i < iovcnt; i++) { iov_pos = 0; while (iov_pos < iov[i].iov_len) { read_ret = BIO_read(openssl->bio, (char *)iov[i].iov_base + iov_pos, (int)(iov[i].iov_len - iov_pos)); /* https://www.openssl.org/docs/crypto/BIO_should_retry.html: * * If BIO_should_retry() returns false then the precise "error * condition" depends on the BIO type that caused it and the return * code of the BIO operation. For example if a call to BIO_read() on a * socket BIO returns 0 and BIO_should_retry() is false then the cause * will be that the connection closed. */ if (read_ret < 0 || (read_ret == 0 && !BIO_should_retry(openssl->bio))) { return -1; } if (expire) { now = bson_get_monotonic_time(); if ((expire - now) < 0) { if (read_ret == 0) { mongoc_counter_streams_timeout_inc(); #ifdef _WIN32 errno = WSAETIMEDOUT; #else errno = ETIMEDOUT; #endif RETURN(-1); } tls->timeout_msec = 0; } else { tls->timeout_msec = (expire - now) / 1000L; } } ret += read_ret; if ((size_t)ret >= min_bytes) { mongoc_counter_streams_ingress_add(ret); RETURN(ret); } iov_pos += read_ret; } } if (ret >= 0) { mongoc_counter_streams_ingress_add(ret); } RETURN(ret); } /* *-------------------------------------------------------------------------- * * _mongoc_stream_tls_openssl_setsockopt -- * * Perform a setsockopt on the underlying stream. * * Returns: * -1 on failure, otherwise opt specific value. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static int _mongoc_stream_tls_openssl_setsockopt( mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; BSON_ASSERT(tls); return mongoc_stream_setsockopt(tls->base_stream, level, optname, optval, optlen); } static mongoc_stream_t * _mongoc_stream_tls_openssl_get_base_stream(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; return tls->base_stream; } static bool _mongoc_stream_tls_openssl_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; BSON_ASSERT(stream); return mongoc_stream_check_closed(tls->base_stream); } static bool _mongoc_stream_tls_openssl_set_verify_cert_error(SSL *ssl, bson_error_t *error) { long verify_result; BSON_ASSERT_PARAM(ssl); BSON_ASSERT_PARAM(error); verify_result = SSL_get_verify_result(ssl); if (verify_result == X509_V_OK) { return false; } _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed: certificate verify failed (%ld): %s", verify_result, X509_verify_cert_error_string(verify_result)); return true; } /** * mongoc_stream_tls_openssl_handshake: */ static bool _mongoc_stream_tls_openssl_handshake(mongoc_stream_t *stream, const char *host, int *events, bson_error_t *error) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; SSL *ssl; BSON_ASSERT(tls); BSON_ASSERT(host); ENTRY; BIO_get_ssl(openssl->bio, &ssl); if (BIO_do_handshake(openssl->bio) == 1) { *events = 0; #ifdef MONGOC_ENABLE_OCSP_OPENSSL /* Validate OCSP */ if (openssl->ocsp_opts && 1 != _mongoc_ocsp_tlsext_status(ssl, openssl->ocsp_opts)) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed: Failed OCSP verification"); RETURN(false); } #endif if (_mongoc_openssl_check_peer_hostname(ssl, host, tls->ssl_opts.allow_invalid_hostname)) { RETURN(true); } /* Try to relay certificate failure reason from OpenSSL library if any. */ if (_mongoc_stream_tls_openssl_set_verify_cert_error(ssl, error)) { RETURN(false); } /* Otherwise, use simple error message. */ _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed: Failed certificate verification"); RETURN(false); } if (BIO_should_retry(openssl->bio)) { *events = BIO_should_read(openssl->bio) ? POLLIN : POLLOUT; RETURN(false); } if (!errno) { #ifdef _WIN32 errno = WSAETIMEDOUT; #else errno = ETIMEDOUT; #endif } *events = 0; /* Try to relay certificate failure reason from OpenSSL library if any. */ if (_mongoc_stream_tls_openssl_set_verify_cert_error(ssl, error)) { RETURN(false); } /* Otherwise, try to relay error info from OpenSSL. */ if (ERR_peek_error() != 0) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed: %s", ERR_error_string(ERR_get_error(), NULL)); RETURN(false); } /* Otherwise, use simple error info. */ { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *msg = bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed: %s", msg); } RETURN(false); } /* Callback to get the client provided SNI, if any * It is only called in SSL "server mode" (e.g. when using the Mock Server), * and we don't actually use the hostname for anything, just debug print it */ static int _mongoc_stream_tls_openssl_sni(SSL *ssl, int *ad, void *arg) { const char *hostname; BSON_UNUSED(ad); BSON_UNUSED(arg); if (ssl == NULL) { TRACE("%s", "No SNI hostname provided"); return SSL_TLSEXT_ERR_NOACK; } hostname = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); /* This is intentionally debug since its only used by the mock test server */ MONGOC_DEBUG("Got SNI: '%s'", hostname); return SSL_TLSEXT_ERR_OK; } static bool _mongoc_stream_tls_openssl_timed_out(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; ENTRY; RETURN(mongoc_stream_timed_out(tls->base_stream)); } static bool _mongoc_stream_tls_openssl_should_retry(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_openssl_t *openssl = (mongoc_stream_tls_openssl_t *)tls->ctx; ENTRY; if (BIO_should_retry(openssl->bio)) { RETURN(true); } RETURN(mongoc_stream_should_retry(tls->base_stream)); } /* Creates a new mongoc_stream_tls_openssl_t with ssl_ctx. */ static mongoc_stream_t * create_stream_with_ctx( mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client, SSL_CTX *ssl_ctx) { mongoc_stream_tls_t *tls; mongoc_stream_tls_openssl_t *openssl; mongoc_openssl_ocsp_opt_t *ocsp_opts = NULL; BIO *bio_ssl = NULL; BIO *bio_mongoc_shim = NULL; BIO_METHOD *meth; SSL *ssl; BSON_ASSERT(base_stream); BSON_ASSERT(opt); ENTRY; if (!ssl_ctx) { RETURN(NULL); } bio_ssl = BIO_new_ssl(ssl_ctx, client); if (!bio_ssl) { SSL_CTX_free(ssl_ctx); RETURN(NULL); } BIO_get_ssl(bio_ssl, &ssl); #if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER) if (!opt->allow_invalid_hostname) { struct in_addr addr; struct in6_addr addr6; X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); X509_VERIFY_PARAM_set_hostflags(param, X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS); if (inet_pton(AF_INET, host, &addr) || inet_pton(AF_INET6, host, &addr6)) { X509_VERIFY_PARAM_set1_ip_asc(param, host); } else { X509_VERIFY_PARAM_set1_host(param, host, 0); } SSL_set1_param(ssl, param); X509_VERIFY_PARAM_free(param); } #endif meth = mongoc_stream_tls_openssl_bio_meth_new(); bio_mongoc_shim = BIO_new(meth); if (!bio_mongoc_shim) { BIO_free_all(bio_ssl); BIO_meth_free(meth); SSL_CTX_free(ssl_ctx); RETURN(NULL); } /* Added in OpenSSL 0.9.8f, as a build time option */ #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME if (client) { /* Set the SNI hostname we are expecting certificate for */ SSL_set_tlsext_host_name(ssl, host); #endif } BIO_push(bio_ssl, bio_mongoc_shim); #ifdef MONGOC_ENABLE_OCSP_OPENSSL if (client && !opt->weak_cert_validation && !_mongoc_ssl_opts_disable_certificate_revocation_check(opt)) { /* Set the status_request extension on the SSL object. * Do not use SSL_CTX_set_tlsext_status_type, since that requires OpenSSL * 1.1.0. */ if (!SSL_set_tlsext_status_type(ssl, TLSEXT_STATUSTYPE_ocsp)) { MONGOC_ERROR("cannot enable OCSP status request extension"); mongoc_openssl_ocsp_opt_destroy(ocsp_opts); BIO_free_all(bio_ssl); BIO_meth_free(meth); SSL_CTX_free(ssl_ctx); RETURN(NULL); } ocsp_opts = bson_malloc0(sizeof(mongoc_openssl_ocsp_opt_t)); ocsp_opts->allow_invalid_hostname = opt->allow_invalid_hostname; ocsp_opts->weak_cert_validation = opt->weak_cert_validation; ocsp_opts->disable_endpoint_check = _mongoc_ssl_opts_disable_ocsp_endpoint_check(opt); ocsp_opts->host = bson_strdup(host); _mongoc_ssl_opts_copy_to(opt, &ocsp_opts->ssl_opts, true); } #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ openssl = (mongoc_stream_tls_openssl_t *)bson_malloc0(sizeof *openssl); openssl->bio = bio_ssl; openssl->meth = meth; openssl->ctx = ssl_ctx; openssl->ocsp_opts = ocsp_opts; tls = (mongoc_stream_tls_t *)bson_malloc0(sizeof *tls); tls->parent.type = MONGOC_STREAM_TLS; tls->parent.destroy = _mongoc_stream_tls_openssl_destroy; tls->parent.failed = _mongoc_stream_tls_openssl_failed; tls->parent.close = _mongoc_stream_tls_openssl_close; tls->parent.flush = _mongoc_stream_tls_openssl_flush; tls->parent.writev = _mongoc_stream_tls_openssl_writev; tls->parent.readv = _mongoc_stream_tls_openssl_readv; tls->parent.setsockopt = _mongoc_stream_tls_openssl_setsockopt; tls->parent.get_base_stream = _mongoc_stream_tls_openssl_get_base_stream; tls->parent.check_closed = _mongoc_stream_tls_openssl_check_closed; tls->parent.timed_out = _mongoc_stream_tls_openssl_timed_out; tls->parent.should_retry = _mongoc_stream_tls_openssl_should_retry; memcpy(&tls->ssl_opts, opt, sizeof tls->ssl_opts); tls->handshake = _mongoc_stream_tls_openssl_handshake; tls->ctx = (void *)openssl; tls->timeout_msec = -1; tls->base_stream = base_stream; mongoc_stream_tls_openssl_bio_set_data(bio_mongoc_shim, tls); mongoc_counter_streams_active_inc(); RETURN((mongoc_stream_t *)tls); } /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_new -- * * Creates a new mongoc_stream_tls_openssl_t to communicate with a remote * server using a TLS stream. * * @base_stream should be a stream that will become owned by the * resulting tls stream. It will be used for raw I/O. * * Returns: * NULL on failure, otherwise a mongoc_stream_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_stream_tls_openssl_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) { BSON_ASSERT_PARAM(base_stream); BSON_ASSERT_PARAM(opt); SSL_CTX *ssl_ctx = _mongoc_openssl_ctx_new(opt); if (!ssl_ctx) { RETURN(NULL); } if (!client) { /* Only used by the Mock Server. * Set a callback to get the SNI, if provided */ SSL_CTX_set_tlsext_servername_callback(ssl_ctx, _mongoc_stream_tls_openssl_sni); } return create_stream_with_ctx(base_stream, host, opt, client, ssl_ctx); } #if OPENSSL_VERSION_NUMBER >= 0x10100000L /* *-------------------------------------------------------------------------- * * mongoc_stream_tls_openssl_new_with_context -- * * Creates a new mongoc_stream_tls_openssl_t to communicate with a remote * server using a TLS stream, using an existing OpenSSL context. * * Only called by mongoc_stream_tls_new_with_hostname_and_openssl_context. * * @ssl_ctx is the shared OpenSSL context for the mongoc_client_t * associated with this function call. * * Returns: * NULL on failure, otherwise a mongoc_stream_t. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_stream_t * mongoc_stream_tls_openssl_new_with_context( mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client, SSL_CTX *ssl_ctx) { // `ssl_ctx` may be NULL if creating the context failed. Return NULL to signal failure. if (!ssl_ctx) { return NULL; } SSL_CTX_up_ref(ssl_ctx); return create_stream_with_ctx(base_stream, host, opt, client, ssl_ctx); } #endif void mongoc_openssl_ocsp_opt_destroy(void *ocsp_opt) { mongoc_openssl_ocsp_opt_t *casted; if (!ocsp_opt) { return; } casted = (mongoc_openssl_ocsp_opt_t *)ocsp_opt; bson_free(casted->host); _mongoc_ssl_opts_cleanup(&casted->ssl_opts, true); bson_free(ocsp_opt); } #endif /* MONGOC_ENABLE_SSL_OPENSSL */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-openssl.h000066400000000000000000000021131511661753600263720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_OPENSSL_H #define MONGOC_STREAM_TLS_OPENSSL_H #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_openssl_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_OPENSSL */ #endif /* MONGOC_STREAM_TLS_OPENSSL_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-private.h000066400000000000000000000047751511661753600264010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_PRIVATE_H #define MONGOC_STREAM_TLS_PRIVATE_H #include // IWYU pragma: export // #include #include #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #include BSON_BEGIN_DECLS /** * mongoc_stream_tls_t: * * Overloaded mongoc_stream_t with additional TLS handshake and verification * callbacks. * */ struct _mongoc_stream_tls_t { mongoc_stream_t parent; /* The TLS stream wrapper */ mongoc_stream_t *base_stream; /* The underlying actual stream */ void *ctx; /* TLS lib specific configuration or wrappers */ int64_t timeout_msec; mongoc_ssl_opt_t ssl_opts; bool (*handshake)(mongoc_stream_t *stream, const char *host, int *events /* OUT*/, bson_error_t *error); }; #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_new_with_hostname_and_openssl_context(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client, SSL_CTX *ssl_ctx) BSON_GNUC_WARN_UNUSED_RESULT; #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) mongoc_stream_t * mongoc_stream_tls_new_with_secure_channel_cred(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, mongoc_shared_ptr secure_channel_cred_ptr) BSON_GNUC_WARN_UNUSED_RESULT; #endif // MONGOC_ENABLE_SSL_SECURE_CHANNEL BSON_END_DECLS #endif /* MONGOC_STREAM_TLS_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-channel-private.h000066400000000000000000000101361511661753600312570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_SECURE_CHANNEL_PRIVATE_H #define MONGOC_STREAM_TLS_SECURE_CHANNEL_PRIVATE_H #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include // IWYU pragma: export // #include #include #include #include // For SCH_CREDENTIALS /* Its mandatory to indicate to Windows who is compiling the code */ #define SECURITY_WIN32 #define SCHANNEL_USE_BLACKLISTS 1 // For SCH_CREDENTIALS #include #include #ifdef SCH_CREDENTIALS_VERSION #define HAVE_SCH_CREDENTIALS #endif BSON_BEGIN_DECLS /* enum for the nonblocking SSL connection state machine */ typedef enum { ssl_connect_1, ssl_connect_2, ssl_connect_2_reading, ssl_connect_2_writing, ssl_connect_3, ssl_connect_done } ssl_connect_state; /* enum for underlying type cred field in mongoc_secure_channel_cred */ typedef enum { schannel_cred, sch_credentials } schannel_credential_type; /* Structs to store Schannel handles */ typedef struct { CredHandle cred_handle; TimeStamp time_stamp; } mongoc_secure_channel_cred_handle; // `mongoc_secure_channel_cred` may be shared on multiple connections. typedef struct _mongoc_secure_channel_cred { PCCERT_CONTEXT cert; /* Owning. Optional client cert. */ schannel_credential_type cred_type; void *cred; /* Underlying type is specified by schannel_credential_type. */ } mongoc_secure_channel_cred; typedef struct { CtxtHandle ctxt_handle; TimeStamp time_stamp; } mongoc_secure_channel_ctxt; /** * mongoc_stream_tls_secure_channel_t: * * Private storage for Secure Channel Streams */ typedef struct { ssl_connect_state connecting_state; mongoc_stream_tls_t *tls; /* back pointer to parent */ char *hostname; /* the host name the stream was created with */ mongoc_shared_ptr cred_ptr; // Manages a mongoc_secure_channel_cred. mongoc_secure_channel_cred_handle *cred_handle; mongoc_secure_channel_ctxt *ctxt; SecPkgContext_StreamSizes stream_sizes; size_t encdata_length, decdata_length; size_t encdata_offset, decdata_offset; unsigned char *encdata_buffer, *decdata_buffer; unsigned long req_flags, ret_flags; int recv_unrecoverable_err; /* _mongoc_stream_tls_secure_channel_read had an unrecoverable err */ bool recv_renegotiate; /* true if server requests renegotiation on TLS 1.3 */ bool recv_sspi_close_notify; /* true if connection closed by close_notify */ bool recv_connection_closed; /* true if connection closed, regardless how */ } mongoc_stream_tls_secure_channel_t; struct _mongoc_ssl_opt_t; // Forward declare. Defined in mongoc-ssl.h. struct _mongoc_stream_t; // Forward declare. Defined in mongoc-stream.h. mongoc_secure_channel_cred * mongoc_secure_channel_cred_new(const struct _mongoc_ssl_opt_t *opt); // mongoc_secure_channel_cred_deleter is useful as a deleter for mongoc_shared_t. void mongoc_secure_channel_cred_deleter(void *cred_void); struct _mongoc_stream_t * mongoc_stream_tls_secure_channel_new_with_creds(struct _mongoc_stream_t *base_stream, const char *host, const struct _mongoc_ssl_opt_t *opt, mongoc_shared_ptr cred_ptr /* optional */); BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_SECURE_CHANNEL */ #endif /* MONGOC_STREAM_TLS_SECURE_CHANNEL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-channel.c000066400000000000000000001150021511661753600276000ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Significant portion of this file, such as * _mongoc_stream_tls_secure_channel_write & *_mongoc_stream_tls_secure_channel_read * comes straight from one of my favorite projects, cURL! * Thank you so much for having gone through the Secure Channel pain for me. * * * Copyright (C) 2012 - 2015, Marc Hoersken, * Copyright (C) 2012, Mark Salisbury, * Copyright (C) 2012 - 2015, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is * furnished to do so, under the terms of the COPYING file. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ***************************************************************************/ /* * Based upon the PolarSSL implementation in polarssl.c and polarssl.h: * Copyright (C) 2010, 2011, Hoi-Ho Chan, * * Based upon the CyaSSL implementation in cyassl.c and cyassl.h: * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. * * Thanks for code and inspiration! */ #include #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-tls-secure-channel" #define SECURITY_WIN32 #define SCHANNEL_USE_BLACKLISTS 1 #include #include #include /* mingw doesn't define these */ #ifndef SP_PROT_TLS1_1_CLIENT #define SP_PROT_TLS1_1_CLIENT 0x00000200 #endif #ifndef SP_PROT_TLS1_2_CLIENT #define SP_PROT_TLS1_2_CLIENT 0x00000800 #endif #ifndef SP_PROT_TLS1_3_CLIENT #define SP_PROT_TLS1_3_CLIENT 0x00002000 #endif static void _mongoc_stream_tls_secure_channel_destroy(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); /* See https://msdn.microsoft.com/en-us/library/windows/desktop/aa380138.aspx * Shutting Down an Schannel Connection */ TRACE("%s", "shutting down SSL/TLS connection"); if (secure_channel->cred_handle && secure_channel->ctxt) { SecBufferDesc BuffDesc; SecBuffer Buffer; SECURITY_STATUS sspi_status; SecBuffer outbuf; SecBufferDesc outbuf_desc; DWORD dwshut = SCHANNEL_SHUTDOWN; _mongoc_secure_channel_init_sec_buffer(&Buffer, SECBUFFER_TOKEN, &dwshut, sizeof(dwshut)); _mongoc_secure_channel_init_sec_buffer_desc(&BuffDesc, &Buffer, 1); sspi_status = ApplyControlToken(&secure_channel->ctxt->ctxt_handle, &BuffDesc); if (sspi_status != SEC_E_OK) { MONGOC_ERROR("ApplyControlToken failure: %ld", sspi_status); } /* setup output buffer */ _mongoc_secure_channel_init_sec_buffer(&outbuf, SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&outbuf_desc, &outbuf, 1); sspi_status = InitializeSecurityContext(&secure_channel->cred_handle->cred_handle, &secure_channel->ctxt->ctxt_handle, /*tls->hostname*/ NULL, secure_channel->req_flags, 0, 0, NULL, 0, &secure_channel->ctxt->ctxt_handle, &outbuf_desc, &secure_channel->ret_flags, &secure_channel->ctxt->time_stamp); if ((sspi_status == SEC_E_OK) || (sspi_status == SEC_I_CONTEXT_EXPIRED)) { /* send close message which is in output buffer */ ssize_t written = mongoc_secure_channel_write(tls, outbuf.pvBuffer, outbuf.cbBuffer); FreeContextBuffer(outbuf.pvBuffer); if (outbuf.cbBuffer != (size_t)written) { TRACE("failed to send close msg (wrote %zd out of %lu)", written, outbuf.cbBuffer); } } } /* free SSPI Schannel API security context handle */ if (secure_channel->ctxt) { TRACE("%s", "clear security context handle"); DeleteSecurityContext(&secure_channel->ctxt->ctxt_handle); bson_free(secure_channel->ctxt); } /* free SSPI Schannel API credential handle */ if (secure_channel->cred_handle) { /* decrement the reference counter of the credential/session handle */ /* if the handle was not cached and the refcount is zero */ TRACE("%s", "clear credential handle"); FreeCredentialsHandle(&secure_channel->cred_handle->cred_handle); bson_free(secure_channel->cred_handle); } mongoc_shared_ptr_reset_null(&secure_channel->cred_ptr); /* free internal buffer for received encrypted data */ if (secure_channel->encdata_buffer != NULL) { bson_free(secure_channel->encdata_buffer); secure_channel->encdata_length = 0; secure_channel->encdata_offset = 0; } /* free internal buffer for received decrypted data */ if (secure_channel->decdata_buffer != NULL) { bson_free(secure_channel->decdata_buffer); secure_channel->decdata_length = 0; secure_channel->decdata_offset = 0; } mongoc_stream_destroy(tls->base_stream); bson_free(secure_channel->hostname); bson_free(secure_channel); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_stream_tls_secure_channel_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_stream_tls_secure_channel_destroy(stream); EXIT; } static int _mongoc_stream_tls_secure_channel_close(mongoc_stream_t *stream) { int ret = 0; mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); ret = mongoc_stream_close(tls->base_stream); RETURN(ret); } static int _mongoc_stream_tls_secure_channel_flush(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); RETURN(0); } static ssize_t _mongoc_stream_tls_secure_channel_write(mongoc_stream_t *stream, char *buf, size_t buf_len) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ssize_t written = -1; size_t data_len = 0; unsigned char *data = NULL; SecBuffer outbuf[4]; SecBufferDesc outbuf_desc; SECURITY_STATUS sspi_status = SEC_E_OK; ENTRY; BSON_ASSERT(secure_channel); TRACE("The entire buffer is: %zu", buf_len); /* check if the maximum stream sizes were queried */ if (secure_channel->stream_sizes.cbMaximumMessage == 0) { sspi_status = QueryContextAttributes( &secure_channel->ctxt->ctxt_handle, SECPKG_ATTR_STREAM_SIZES, &secure_channel->stream_sizes); if (sspi_status != SEC_E_OK) { TRACE("failing here: %d", (int)(__LINE__)); return -1; } } /* check if the buffer is longer than the maximum message length */ if (buf_len > secure_channel->stream_sizes.cbMaximumMessage) { TRACE("SHRINKING buf_len from %zu to %lu", buf_len, secure_channel->stream_sizes.cbMaximumMessage); buf_len = secure_channel->stream_sizes.cbMaximumMessage; } /* calculate the complete message length and allocate a buffer for it */ data_len = secure_channel->stream_sizes.cbHeader + buf_len + secure_channel->stream_sizes.cbTrailer; data = (unsigned char *)bson_malloc(data_len); /* setup output buffers (header, data, trailer, empty) */ _mongoc_secure_channel_init_sec_buffer( &outbuf[0], SECBUFFER_STREAM_HEADER, data, secure_channel->stream_sizes.cbHeader); _mongoc_secure_channel_init_sec_buffer(&outbuf[1], SECBUFFER_DATA, data + secure_channel->stream_sizes.cbHeader, (unsigned long)(buf_len & (size_t)0xFFFFFFFFUL)); _mongoc_secure_channel_init_sec_buffer(&outbuf[2], SECBUFFER_STREAM_TRAILER, data + secure_channel->stream_sizes.cbHeader + buf_len, secure_channel->stream_sizes.cbTrailer); _mongoc_secure_channel_init_sec_buffer(&outbuf[3], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&outbuf_desc, outbuf, 4); /* copy data into output buffer */ memcpy(outbuf[1].pvBuffer, buf, buf_len); /* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375390.aspx */ sspi_status = EncryptMessage(&secure_channel->ctxt->ctxt_handle, 0, &outbuf_desc, 0); /* check if the message was encrypted */ if (sspi_status == SEC_E_OK) { written = 0; /* send the encrypted message including header, data and trailer */ buf_len = outbuf[0].cbBuffer + outbuf[1].cbBuffer + outbuf[2].cbBuffer; written = mongoc_secure_channel_write(tls, data, buf_len); } else { written = -1; } bson_free(data); if (buf_len == (size_t)written) { /* Encrypted message including header, data and trailer entirely sent. * The return value is the number of unencrypted bytes that were sent. */ written = outbuf[1].cbBuffer; } return written; } /* This is copypasta from _mongoc_stream_tls_openssl_writev */ #define MONGOC_STREAM_TLS_BUFFER_SIZE 4096 static ssize_t _mongoc_stream_tls_secure_channel_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; char buf[MONGOC_STREAM_TLS_BUFFER_SIZE]; ssize_t ret = 0; ssize_t child_ret; size_t i; size_t iov_pos = 0; /* There's a bit of a dance to coalesce vectorized writes into * MONGOC_STREAM_TLS_BUFFER_SIZE'd writes to avoid lots of small tls * packets. * * The basic idea is that we want to combine writes in the buffer if they're * smaller than the buffer, flushing as it gets full. For larger writes, or * the last write in the iovec array, we want to ignore the buffer and just * write immediately. We take care of doing buffer writes by re-invoking * ourself with a single iovec_t, pointing at our stack buffer. */ char *buf_head = buf; char *buf_tail = buf; char *buf_end = buf + MONGOC_STREAM_TLS_BUFFER_SIZE; size_t bytes; char *to_write = NULL; BSON_ASSERT(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(secure_channel); ENTRY; TRACE("%s", "Trying to write to the server"); tls->timeout_msec = timeout_msec; TRACE("count: %zu, 0th: %zu", iovcnt, iov[0].iov_len); for (i = 0; i < iovcnt; i++) { iov_pos = 0; TRACE("iov %zu size: %zu", i, iov[i].iov_len); while (iov_pos < iov[i].iov_len) { BSON_ASSERT(buf_end >= buf_tail); const size_t buf_remaining = (size_t)(buf_end - buf_tail); // Set below and guarded by `to_write`. size_t to_write_len = 0u; if (buf_head != buf_tail || ((i + 1u < iovcnt) && (buf_remaining > (iov[i].iov_len - iov_pos)))) { /* If we have either of: * - buffered bytes already * - another iovec to send after this one and we don't have more * bytes to send than the size of the buffer. * * copy into the buffer */ bytes = BSON_MIN(iov[i].iov_len - iov_pos, buf_remaining); memcpy(buf_tail, (char *)iov[i].iov_base + iov_pos, bytes); buf_tail += bytes; iov_pos += bytes; if (buf_tail == buf_end) { /* If we're full, request send */ to_write = buf_head; to_write_len = buf_tail - buf_head; buf_tail = buf_head = buf; } } else { /* Didn't buffer, so just write it through */ to_write = (char *)iov[i].iov_base + iov_pos; to_write_len = iov[i].iov_len - iov_pos; iov_pos += to_write_len; } if (to_write) { /* We get here if we buffered some bytes and filled the buffer, or * if we didn't buffer and have to send out of the iovec */ child_ret = _mongoc_stream_tls_secure_channel_write(stream, to_write, to_write_len); TRACE("Child0wrote: %zd, was supposed to write: %zu", child_ret, to_write_len); if (child_ret < 0) { RETURN(ret); } ret += child_ret; iov_pos -= to_write_len - child_ret; to_write = NULL; } } } if (buf_head != buf_tail) { /* If we have any bytes buffered, send */ child_ret = _mongoc_stream_tls_secure_channel_write(stream, buf_head, buf_tail - buf_head); TRACE("Child1wrote: %zd, was supposed to write: %td", child_ret, buf_tail - buf_head); if (child_ret < 0) { RETURN(child_ret); } ret += child_ret; } if (ret >= 0) { mongoc_counter_streams_egress_add(ret); } TRACE("Returning %d", (int)ret); RETURN(ret); } /* move up to "len" decrypted bytes to buf, return number of bytes */ static ssize_t _mongoc_stream_tls_secure_channel_debuf(mongoc_stream_tls_secure_channel_t *secure_channel, char *buf, size_t size) { size_t s = BSON_MIN(size, secure_channel->decdata_offset); memcpy(buf, secure_channel->decdata_buffer, s); memmove(secure_channel->decdata_buffer, secure_channel->decdata_buffer + s, secure_channel->decdata_offset - s); secure_channel->decdata_offset -= s; TRACE("decrypted data returned %d", (int)s); TRACE("decrypted data buffer: offset %d length %d", (int)secure_channel->decdata_offset, (int)secure_channel->decdata_length); return (ssize_t)s; } /* decrypt as many received bytes as possible to secure_channel.decdata_buf */ static void _mongoc_stream_tls_secure_channel_decrypt(mongoc_stream_tls_secure_channel_t *secure_channel) { size_t size = 0; size_t remaining; bool secbuf_extra_received = false; SecBuffer inbuf[4]; SecBufferDesc inbuf_desc; SECURITY_STATUS sspi_status = SEC_E_OK; TRACE("encrypted data buffer: offset %d length %d", (int)secure_channel->encdata_offset, (int)secure_channel->encdata_length); /* decrypt loop */ while (secure_channel->encdata_offset > 0 && sspi_status == SEC_E_OK) { secbuf_extra_received = false; /* prepare data buffer for DecryptMessage call */ _mongoc_secure_channel_init_sec_buffer(&inbuf[0], SECBUFFER_DATA, secure_channel->encdata_buffer, (unsigned long)(secure_channel->encdata_offset & (size_t)0xFFFFFFFFUL)); /* we need 3 more empty input buffers for possible output */ _mongoc_secure_channel_init_sec_buffer(&inbuf[1], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer(&inbuf[2], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer(&inbuf[3], SECBUFFER_EMPTY, NULL, 0); _mongoc_secure_channel_init_sec_buffer_desc(&inbuf_desc, inbuf, 4); /* https://msdn.microsoft.com/en-us/library/windows/desktop/aa375348.aspx */ sspi_status = DecryptMessage(&secure_channel->ctxt->ctxt_handle, &inbuf_desc, 0, NULL); /* check if everything went fine (server may want to renegotiate * or shutdown the connection context) */ if (sspi_status == SEC_E_OK || sspi_status == SEC_I_RENEGOTIATE || sspi_status == SEC_I_CONTEXT_EXPIRED) { /* check for successfully decrypted data, even before actual * renegotiation or shutdown of the connection context */ if (inbuf[1].BufferType == SECBUFFER_DATA) { TRACE("decrypted data length: %lu", inbuf[1].cbBuffer); size = inbuf[1].cbBuffer; remaining = secure_channel->decdata_length - secure_channel->decdata_offset; if (remaining < size) { mongoc_secure_channel_realloc_buf( &secure_channel->decdata_length, &secure_channel->decdata_buffer, size); } /* copy decrypted data to internal buffer */ if (size) { memcpy(secure_channel->decdata_buffer + secure_channel->decdata_offset, inbuf[1].pvBuffer, size); secure_channel->decdata_offset += size; } TRACE("decrypted data added: %d", (int)size); TRACE("decrypted data cached: offset %d length %d", (int)secure_channel->decdata_offset, (int)secure_channel->decdata_length); } /* check for remaining encrypted data */ if (inbuf[3].BufferType == SECBUFFER_EXTRA && inbuf[3].cbBuffer > 0) { TRACE("encrypted data length: %lu", inbuf[3].cbBuffer); /* check if the remaining data is less than the total amount * and therefore begins after the already processed data */ if (secure_channel->encdata_offset > inbuf[3].cbBuffer) { /* move remaining encrypted data forward to the beginning of * buffer */ memmove(secure_channel->encdata_buffer, (secure_channel->encdata_buffer + secure_channel->encdata_offset) - inbuf[3].cbBuffer, inbuf[3].cbBuffer); secure_channel->encdata_offset = inbuf[3].cbBuffer; } secbuf_extra_received = true; TRACE("encrypted data cached: offset %d length %d", (int)secure_channel->encdata_offset, (int)secure_channel->encdata_length); } else { /* reset encrypted buffer offset, because there is no data remaining */ secure_channel->encdata_offset = 0; } /* check if server wants to renegotiate the connection context */ if (sspi_status == SEC_I_RENEGOTIATE) { TRACE("%s", "remote party requests renegotiation"); if (secbuf_extra_received) { bool ret; bson_error_t error; secure_channel->recv_renegotiate = true; /* mongoc_secure_channel_handshake_step_2 passes the received SECBUFFER_EXTRA to * InitializeSecurityContext */ secure_channel->connecting_state = ssl_connect_2_writing; ret = mongoc_secure_channel_handshake_step_2(secure_channel->tls, secure_channel->hostname, &error); if (!ret) { TRACE("TLS 1.3 renegotiation failed: %s", error.message); secure_channel->recv_unrecoverable_err = true; return; } /* now continue decrypting data */ secure_channel->connecting_state = ssl_connect_done; sspi_status = SEC_E_OK; continue; } } /* check if the server closed the connection */ else if (sspi_status == SEC_I_CONTEXT_EXPIRED) { /* In Windows 2000 SEC_I_CONTEXT_EXPIRED (close_notify) is not * returned so we have to work around that in cleanup. */ secure_channel->recv_sspi_close_notify = true; if (!secure_channel->recv_connection_closed) { secure_channel->recv_connection_closed = true; TRACE("%s", "server closed the connection"); } } } else if (sspi_status == SEC_E_INCOMPLETE_MESSAGE) { TRACE("%s", "failed to decrypt data, need more data"); } else { TRACE("failed to read data from server: %ld", sspi_status); secure_channel->recv_unrecoverable_err = true; } } TRACE("encrypted data buffer: offset %d length %d", (int)secure_channel->encdata_offset, (int)secure_channel->encdata_length); TRACE("decrypted data buffer: offset %d length %d", (int)secure_channel->decdata_offset, (int)secure_channel->decdata_length); } static ssize_t _mongoc_stream_tls_secure_channel_read(mongoc_stream_t *stream, char *buf, size_t len) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ssize_t size = 0; ssize_t nread; TRACE("client wants to read %d bytes", (int)len); BSON_ASSERT(len > 0); /* * Our priority is to always return as much decrypted data to the caller as * possible, even if an error occurs. The state of the decrypted buffer must * always be valid. */ if (secure_channel->decdata_offset) { TRACE("%s", "decrypted data is already available"); return _mongoc_stream_tls_secure_channel_debuf(secure_channel, buf, len); } /* is a complete encrypted block left from last network read? */ if (secure_channel->encdata_offset) { _mongoc_stream_tls_secure_channel_decrypt(secure_channel); if (secure_channel->decdata_offset) { return _mongoc_stream_tls_secure_channel_debuf(secure_channel, buf, len); } } /* keep these checks separated, for more detailed tracing */ if (secure_channel->recv_unrecoverable_err) { TRACE("%s", "an unrecoverable error occurred in a prior call"); return -1; } if (secure_channel->recv_sspi_close_notify) { TRACE("%s", "server indicated shutdown in a prior call"); return -1; } if (secure_channel->recv_connection_closed) { TRACE("%s", "connection closed"); return -1; } size = secure_channel->encdata_length - secure_channel->encdata_offset; /* read encrypted data from socket. returns 0 on shutdown or error */ nread = mongoc_secure_channel_read( tls, (char *)(secure_channel->encdata_buffer + secure_channel->encdata_offset), (size_t)size); if (!nread) { if (MONGOC_ERRNO_IS_AGAIN(errno)) { TRACE("%s", "Try again"); return 0; } else { secure_channel->recv_connection_closed = true; TRACE("reading failed: %d", errno); return -1; } } secure_channel->encdata_offset += (size_t)nread; TRACE("encrypted data got %zd", nread); _mongoc_stream_tls_secure_channel_decrypt(secure_channel); return _mongoc_stream_tls_secure_channel_debuf(secure_channel, buf, len); } /* This function is copypasta of _mongoc_stream_tls_openssl_readv */ static ssize_t _mongoc_stream_tls_secure_channel_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ssize_t ret = 0; size_t i; size_t iov_pos = 0; int64_t now; int64_t expire = 0; BSON_ASSERT(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(secure_channel); ENTRY; tls->timeout_msec = timeout_msec; if (timeout_msec >= 0) { expire = bson_get_monotonic_time() + (timeout_msec * 1000UL); } for (i = 0; i < iovcnt; i++) { iov_pos = 0; while (iov_pos < iov[i].iov_len) { ssize_t read_ret = _mongoc_stream_tls_secure_channel_read( stream, (char *)iov[i].iov_base + iov_pos, (int)(iov[i].iov_len - iov_pos)); /* used up all read bytes for tls renegotiation, try reading again to get next message */ if (read_ret == 0 && secure_channel->recv_renegotiate) { secure_channel->recv_renegotiate = false; continue; } if (read_ret < 0) { RETURN(-1); } if (expire) { now = bson_get_monotonic_time(); if ((expire - now) < 0) { if (read_ret == 0) { mongoc_counter_streams_timeout_inc(); errno = ETIMEDOUT; RETURN(-1); } tls->timeout_msec = 0; } else { tls->timeout_msec = (expire - now) / 1000L; } } ret += read_ret; if ((size_t)ret >= min_bytes) { mongoc_counter_streams_ingress_add(ret); RETURN(ret); } iov_pos += read_ret; } } if (ret >= 0) { mongoc_counter_streams_ingress_add(ret); } RETURN(ret); } static int _mongoc_stream_tls_secure_channel_setsockopt( mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); RETURN(mongoc_stream_setsockopt(tls->base_stream, level, optname, optval, optlen)); } static mongoc_stream_t * _mongoc_stream_tls_secure_channel_get_base_stream(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); RETURN(tls->base_stream); } static bool _mongoc_stream_tls_secure_channel_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); RETURN(mongoc_stream_check_closed(tls->base_stream)); } bool mongoc_stream_tls_secure_channel_handshake(mongoc_stream_t *stream, const char *host, int *events, bson_error_t *error) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *secure_channel = (mongoc_stream_tls_secure_channel_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_channel); if (error) { error->code = 0; } TRACE( "Getting ready for state: %d, timeout is %" PRId64, (int)secure_channel->connecting_state + 1, tls->timeout_msec); switch (secure_channel->connecting_state) { case ssl_connect_1: if (mongoc_secure_channel_handshake_step_1(tls, (char *)host, error)) { TRACE("%s", "Step#1 Worked!\n\n"); *events = POLLIN; RETURN(false); } else { TRACE("%s", "Step#1 FAILED!"); } break; case ssl_connect_2: case ssl_connect_2_reading: case ssl_connect_2_writing: if (mongoc_secure_channel_handshake_step_2(tls, (char *)host, error)) { if (secure_channel->connecting_state == ssl_connect_2_reading) { *events = POLLIN; } else { *events = POLLOUT; } RETURN(false); } else { TRACE("%s", "Step#2 FAILED!"); } break; case ssl_connect_3: if (mongoc_secure_channel_handshake_step_3(tls, (char *)host, error)) { TRACE("%s", "Step#3 Worked!\n\n"); *events = POLLIN | POLLOUT; RETURN(false); } else { TRACE("%s", "Step#3 FAILED!"); } break; case ssl_connect_done: TRACE("%s", "Connect DONE!"); /* reset our connection state machine */ secure_channel->connecting_state = ssl_connect_1; RETURN(true); break; default: /* do nothing */ break; } *events = 0; if (error && !error->code) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed"); } RETURN(false); } static bool _mongoc_stream_tls_secure_channel_timed_out(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; ENTRY; RETURN(mongoc_stream_timed_out(tls->base_stream)); } static bool _mongoc_stream_tls_secure_channel_should_retry(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; ENTRY; RETURN(mongoc_stream_should_retry(tls->base_stream)); } static DWORD get_cred_flags(const mongoc_ssl_opt_t *opt) { DWORD dwFlags; /* SCH_USE_STRONG_CRYPTO is not available in VS2010 * https://msdn.microsoft.com/en-us/library/windows/desktop/aa379810.aspx */ #ifdef SCH_USE_STRONG_CRYPTO dwFlags = SCH_USE_STRONG_CRYPTO; #endif /* By default, enable soft failing. * A certificate with no revocation check is a soft failure. */ dwFlags |= SCH_CRED_IGNORE_NO_REVOCATION_CHECK; /* An offline OCSP responder / CRL distribution list is a soft failure. */ dwFlags |= SCH_CRED_IGNORE_REVOCATION_OFFLINE; if (opt->weak_cert_validation) { dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION; TRACE("%s", "disabled server certificate checks"); } else { dwFlags |= SCH_CRED_AUTO_CRED_VALIDATION; if (!_mongoc_ssl_opts_disable_certificate_revocation_check(opt)) { dwFlags |= SCH_CRED_REVOCATION_CHECK_CHAIN; TRACE("%s", "enabled server certificate revocation checks"); } TRACE("%s", "enabled server certificate checks"); } if (opt->allow_invalid_hostname) { dwFlags |= SCH_CRED_NO_SERVERNAME_CHECK; } return dwFlags; } #ifdef HAVE_SCH_CREDENTIALS void * _mongoc_secure_channel_sch_credentials_new(const mongoc_ssl_opt_t *opt, PCCERT_CONTEXT *cert, DWORD enabled_protocols) { SCH_CREDENTIALS *cred = bson_malloc0(sizeof(SCH_CREDENTIALS)); cred->dwVersion = SCH_CREDENTIALS_VERSION; cred->dwFlags = get_cred_flags(opt); if (*cert) { cred->cCreds = 1; cred->paCred = cert; } cred->cTlsParameters = 1; cred->pTlsParameters = bson_malloc0(sizeof(TLS_PARAMETERS)); cred->pTlsParameters->grbitDisabledProtocols = (DWORD)~enabled_protocols; return (void *)cred; } #endif void * _mongoc_secure_channel_schannel_cred_new(const mongoc_ssl_opt_t *opt, PCCERT_CONTEXT *cert, DWORD enabled_protocols) { SCHANNEL_CRED *cred = bson_malloc0(sizeof(SCHANNEL_CRED)); cred->dwVersion = SCHANNEL_CRED_VERSION; cred->dwFlags = get_cred_flags(opt); if (*cert) { cred->cCreds = 1; cred->paCred = cert; } cred->grbitEnabledProtocols = enabled_protocols; return (void *)cred; } mongoc_secure_channel_cred * mongoc_secure_channel_cred_new(const mongoc_ssl_opt_t *opt) { BSON_ASSERT_PARAM(opt); mongoc_secure_channel_cred *cred = bson_malloc0(sizeof(mongoc_secure_channel_cred)); DWORD enabled_protocols = SP_PROT_TLS1_1_CLIENT | SP_PROT_TLS1_2_CLIENT; /* TLS 1.3 is supported on Windows Server 2022 and newer. * Schannel will not negotiate TLS 1.3 when SCHANNEL_CRED is used. */ if (_mongoc_verify_windows_version(10, 0, 20348, false)) { // TODO - enable TLS 1.3 once renegotiation is supported. // enabled_protocols |= SP_PROT_TLS1_3_CLIENT; } if (opt->ca_file) { mongoc_secure_channel_setup_ca(opt); } if (opt->crl_file) { mongoc_secure_channel_setup_crl(opt); } if (opt->pem_file) { cred->cert = mongoc_secure_channel_setup_certificate(opt); } #ifdef HAVE_SCH_CREDENTIALS // SCH_CREDENTIALS is supported in Windows 10 1809 / Server 1809 and later if (_mongoc_verify_windows_version(10, 0, 17763, false)) { cred->cred = _mongoc_secure_channel_sch_credentials_new(opt, &cred->cert, enabled_protocols); cred->cred_type = sch_credentials; } else { cred->cred = _mongoc_secure_channel_schannel_cred_new(opt, &cred->cert, enabled_protocols); cred->cred_type = schannel_cred; } #else cred->cred = _mongoc_secure_channel_schannel_cred_new(opt, &cred->cert, enabled_protocols); cred->cred_type = schannel_cred; #endif return cred; } void mongoc_secure_channel_cred_deleter(void *cred_void) { mongoc_secure_channel_cred *cred = cred_void; if (!cred) { return; } CertFreeCertificateContext(cred->cert); #ifdef HAVE_SCH_CREDENTIALS if (cred->cred_type == sch_credentials) { SCH_CREDENTIALS *sch_cred = (SCH_CREDENTIALS *)cred->cred; bson_free(sch_cred->pTlsParameters); } #endif bson_free(cred->cred); bson_free(cred); } mongoc_stream_t * mongoc_stream_tls_secure_channel_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) { BSON_UNUSED(client); return mongoc_stream_tls_secure_channel_new_with_creds(base_stream, host, opt, MONGOC_SHARED_PTR_NULL); } mongoc_stream_t * mongoc_stream_tls_secure_channel_new_with_creds(mongoc_stream_t *base_stream, const char *host, const mongoc_ssl_opt_t *opt, mongoc_shared_ptr cred_ptr) { SECURITY_STATUS sspi_status = SEC_E_OK; mongoc_stream_tls_t *tls; mongoc_stream_tls_secure_channel_t *secure_channel; ENTRY; BSON_ASSERT_PARAM(base_stream); BSON_ASSERT_PARAM(opt); secure_channel = (mongoc_stream_tls_secure_channel_t *)bson_malloc0(sizeof *secure_channel); secure_channel->hostname = bson_strdup(host); secure_channel->decdata_buffer = bson_malloc(MONGOC_SCHANNEL_BUFFER_INIT_SIZE); secure_channel->decdata_length = MONGOC_SCHANNEL_BUFFER_INIT_SIZE; secure_channel->encdata_buffer = bson_malloc(MONGOC_SCHANNEL_BUFFER_INIT_SIZE); secure_channel->encdata_length = MONGOC_SCHANNEL_BUFFER_INIT_SIZE; tls = (mongoc_stream_tls_t *)bson_malloc0(sizeof *tls); tls->parent.type = MONGOC_STREAM_TLS; tls->parent.destroy = _mongoc_stream_tls_secure_channel_destroy; tls->parent.failed = _mongoc_stream_tls_secure_channel_failed; tls->parent.close = _mongoc_stream_tls_secure_channel_close; tls->parent.flush = _mongoc_stream_tls_secure_channel_flush; tls->parent.writev = _mongoc_stream_tls_secure_channel_writev; tls->parent.readv = _mongoc_stream_tls_secure_channel_readv; tls->parent.setsockopt = _mongoc_stream_tls_secure_channel_setsockopt; tls->parent.get_base_stream = _mongoc_stream_tls_secure_channel_get_base_stream; tls->parent.check_closed = _mongoc_stream_tls_secure_channel_check_closed; tls->parent.timed_out = _mongoc_stream_tls_secure_channel_timed_out; tls->parent.should_retry = _mongoc_stream_tls_secure_channel_should_retry; memcpy(&tls->ssl_opts, opt, sizeof tls->ssl_opts); tls->handshake = mongoc_stream_tls_secure_channel_handshake; tls->ctx = (void *)secure_channel; tls->timeout_msec = -1; tls->base_stream = base_stream; secure_channel->tls = tls; TRACE("%s", "SSL/TLS connection with endpoint AcquireCredentialsHandle"); /* setup Schannel API options */ if (mongoc_shared_ptr_is_null(cred_ptr)) { // Shared credentials were not passed. Create credentials for this stream: mongoc_shared_ptr_reset( &secure_channel->cred_ptr, mongoc_secure_channel_cred_new(opt), mongoc_secure_channel_cred_deleter); } else { mongoc_shared_ptr_assign(&secure_channel->cred_ptr, cred_ptr); // Increase reference count. } mongoc_secure_channel_cred *cred = secure_channel->cred_ptr.ptr; secure_channel->cred_handle = (mongoc_secure_channel_cred_handle *)bson_malloc0(sizeof(mongoc_secure_channel_cred_handle)); /* Example: * https://msdn.microsoft.com/en-us/library/windows/desktop/aa375454%28v=vs.85%29.aspx * AcquireCredentialsHandle: * https://msdn.microsoft.com/en-us/library/windows/desktop/aa374716.aspx */ sspi_status = AcquireCredentialsHandle(NULL, /* principal */ UNISP_NAME, /* security package */ SECPKG_CRED_OUTBOUND, /* we are preparing outbound connection */ NULL, /* Optional logon */ cred->cred, /* TLS "configuration", "auth data" */ NULL, /* unused */ NULL, /* unused */ &secure_channel->cred_handle->cred_handle, /* credential OUT param */ &secure_channel->cred_handle->time_stamp); /* certificate expiration time */ if (sspi_status != SEC_E_OK) { // Cast signed SECURITY_STATUS to unsigned DWORD. FormatMessage expects DWORD. char *msg = mongoc_winerr_to_string((DWORD)sspi_status); MONGOC_ERROR("Failed to initialize security context: %s", msg); bson_free(msg); // Detach the base stream so caller can free. tls->base_stream = NULL; mongoc_stream_destroy((mongoc_stream_t *)tls); RETURN(NULL); } if (opt->ca_dir) { MONGOC_ERROR("Setting mongoc_ssl_opt_t.ca_dir has no effect when built " "against Secure Channel"); } if (_mongoc_ssl_opts_disable_ocsp_endpoint_check(opt)) { MONGOC_ERROR("Setting tlsDisableOCSPEndpointCheck has no effect when " "built against Secure Channel"); } mongoc_counter_streams_active_inc(); RETURN((mongoc_stream_t *)tls); } #endif /* MONGOC_ENABLE_SSL_SECURE_CHANNEL */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-channel.h000066400000000000000000000022671511661753600276150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_SECURE_CHANNEL_H #define MONGOC_STREAM_TLS_SECURE_CHANNEL_H #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include #include #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_secure_channel_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_SECURE_CHANNEL */ #endif /* MONGOC_STREAM_TLS_SECURE_CHANNEL_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-transport-private.h000066400000000000000000000027521511661753600317100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_SECURE_TRANSPORT_PRIVATE_H #define MONGOC_STREAM_TLS_SECURE_TRANSPORT_PRIVATE_H #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS // CDRIVER-2722: Secure Transport is deprecated on MacOS. BEGIN_IGNORE_DEPRECATIONS /** * mongoc_stream_tls_secure_transport_t: * * Private storage for Secure Transport Streams */ typedef struct { SSLContextRef ssl_ctx_ref; CFArrayRef anchors; CFMutableArrayRef my_cert; } mongoc_stream_tls_secure_transport_t; // CDRIVER-2722: Secure Transport is deprecated on MacOS. END_IGNORE_DEPRECATIONS BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_SECURE_TRANSPORT */ #endif /* MONGOC_STREAM_TLS_SECURE_TRANSPORT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-transport.c000066400000000000000000000535151511661753600302360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-tls-secure_transport" // CDRIVER-2722: Secure Transport is deprecated on MacOS. BEGIN_IGNORE_DEPRECATIONS static void _mongoc_stream_tls_secure_transport_destroy(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); SSLClose(secure_transport->ssl_ctx_ref); CFRelease(secure_transport->ssl_ctx_ref); secure_transport->ssl_ctx_ref = NULL; /* SSLClose will do IO so destroy must come after */ mongoc_stream_destroy(tls->base_stream); if (secure_transport->anchors) { CFRelease(secure_transport->anchors); } if (secure_transport->my_cert) { CFRelease(secure_transport->my_cert); } bson_free(secure_transport); bson_free(stream); mongoc_counter_streams_active_dec(); mongoc_counter_streams_disposed_inc(); EXIT; } static void _mongoc_stream_tls_secure_transport_failed(mongoc_stream_t *stream) { ENTRY; _mongoc_stream_tls_secure_transport_destroy(stream); EXIT; } static int _mongoc_stream_tls_secure_transport_close(mongoc_stream_t *stream) { int ret = 0; mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); ret = mongoc_stream_close(tls->base_stream); RETURN(ret); } static int _mongoc_stream_tls_secure_transport_flush(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); RETURN(0); } static ssize_t _mongoc_stream_tls_secure_transport_write(mongoc_stream_t *stream, char *buf, size_t buf_len) { OSStatus status; mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ssize_t write_ret; int64_t now; int64_t expire = 0; ENTRY; BSON_ASSERT(secure_transport); if (tls->timeout_msec >= 0) { expire = bson_get_monotonic_time() + (tls->timeout_msec * 1000UL); } status = SSLWrite(secure_transport->ssl_ctx_ref, buf, buf_len, (size_t *)&write_ret); switch (status) { case errSSLWouldBlock: case noErr: break; case errSSLClosedAbort: errno = ECONNRESET; default: RETURN(-1); } if (expire) { now = bson_get_monotonic_time(); if ((expire - now) < 0) { if (write_ret < (ssize_t)buf_len) { mongoc_counter_streams_timeout_inc(); } tls->timeout_msec = 0; } else { tls->timeout_msec = (expire - now) / 1000L; } } RETURN(write_ret); } /* This is copypasta from _mongoc_stream_tls_openssl_writev */ #define MONGOC_STREAM_TLS_BUFFER_SIZE 4096 static ssize_t _mongoc_stream_tls_secure_transport_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; char buf[MONGOC_STREAM_TLS_BUFFER_SIZE]; ssize_t ret = 0; ssize_t child_ret; size_t i; size_t iov_pos = 0; /* There's a bit of a dance to coalesce vectorized writes into * MONGOC_STREAM_TLS_BUFFER_SIZE'd writes to avoid lots of small tls * packets. * * The basic idea is that we want to combine writes in the buffer if they're * smaller than the buffer, flushing as it gets full. For larger writes, or * the last write in the iovec array, we want to ignore the buffer and just * write immediately. We take care of doing buffer writes by re-invoking * ourself with a single iovec_t, pointing at our stack buffer. */ char *buf_head = buf; char *buf_tail = buf; char *buf_end = buf + MONGOC_STREAM_TLS_BUFFER_SIZE; size_t bytes; char *to_write = NULL; size_t to_write_len; BSON_ASSERT(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(secure_transport); ENTRY; tls->timeout_msec = timeout_msec; for (i = 0; i < iovcnt; i++) { iov_pos = 0; while (iov_pos < iov[i].iov_len) { if (buf_head != buf_tail || ((i + 1 < iovcnt) && ((size_t)(buf_end - buf_tail) > (iov[i].iov_len - iov_pos)))) { /* If we have either of: * - buffered bytes already * - another iovec to send after this one and we don't have more * bytes to send than the size of the buffer. * * copy into the buffer */ bytes = BSON_MIN(iov[i].iov_len - iov_pos, (size_t)(buf_end - buf_tail)); memcpy(buf_tail, (char *)iov[i].iov_base + iov_pos, bytes); buf_tail += bytes; iov_pos += bytes; if (buf_tail == buf_end) { /* If we're full, request send */ to_write = buf_head; to_write_len = buf_tail - buf_head; buf_tail = buf_head = buf; } } else { /* Didn't buffer, so just write it through */ to_write = (char *)iov[i].iov_base + iov_pos; to_write_len = iov[i].iov_len - iov_pos; iov_pos += to_write_len; } if (to_write) { /* We get here if we buffered some bytes and filled the buffer, or * if we didn't buffer and have to send out of the iovec */ child_ret = _mongoc_stream_tls_secure_transport_write(stream, to_write, to_write_len); if (child_ret < 0) { RETURN(ret); } ret += child_ret; if ((size_t)child_ret < to_write_len) { /* we timed out, so send back what we could send */ RETURN(ret); } to_write = NULL; } } } if (buf_head != buf_tail) { /* If we have any bytes buffered, send */ child_ret = _mongoc_stream_tls_secure_transport_write(stream, buf_head, buf_tail - buf_head); if (child_ret < 0) { RETURN(child_ret); } ret += child_ret; } if (ret >= 0) { mongoc_counter_streams_egress_add(ret); } TRACE("Returning %d", (int)ret); RETURN(ret); } /* This function is copypasta of _mongoc_stream_tls_openssl_readv */ static ssize_t _mongoc_stream_tls_secure_transport_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ssize_t ret = 0; size_t i; size_t read_ret; size_t iov_pos = 0; int64_t now; int64_t expire = 0; size_t to_read; size_t remaining_buf_size; size_t remaining_to_read; BSON_ASSERT(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(secure_transport); ENTRY; tls->timeout_msec = timeout_msec; if (timeout_msec >= 0) { expire = bson_get_monotonic_time() + (timeout_msec * 1000UL); } for (i = 0; i < iovcnt; i++) { iov_pos = 0; while (iov_pos < iov[i].iov_len) { remaining_buf_size = iov[i].iov_len - iov_pos; remaining_to_read = min_bytes - ret; /* The third argument passed to SSLRead is an all-or-nothing dataLength, which it will attempt to read until it succeeds or times out. If our buffer is larger than the message we expect to read, choose the smaller number of the two. */ if (remaining_to_read > 0 && remaining_to_read < remaining_buf_size) { to_read = remaining_to_read; } else { to_read = remaining_buf_size; } OSStatus status = SSLRead(secure_transport->ssl_ctx_ref, (char *)iov[i].iov_base + iov_pos, to_read, &read_ret); if (status != noErr) { RETURN(-1); } if (expire) { now = bson_get_monotonic_time(); if ((expire - now) < 0) { if (read_ret == 0) { mongoc_counter_streams_timeout_inc(); errno = ETIMEDOUT; RETURN(-1); } tls->timeout_msec = 0; } else { tls->timeout_msec = (expire - now) / 1000L; } } ret += read_ret; if ((size_t)ret >= min_bytes) { mongoc_counter_streams_ingress_add(ret); RETURN(ret); } iov_pos += read_ret; } } if (ret >= 0) { mongoc_counter_streams_ingress_add(ret); } RETURN(ret); } static int _mongoc_stream_tls_secure_transport_setsockopt( mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); RETURN(mongoc_stream_setsockopt(tls->base_stream, level, optname, optval, optlen)); } static mongoc_stream_t * _mongoc_stream_tls_secure_transport_get_base_stream(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); RETURN(tls->base_stream); } static bool _mongoc_stream_tls_secure_transport_check_closed(mongoc_stream_t *stream) /* IN */ { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); RETURN(mongoc_stream_check_closed(tls->base_stream)); } static void _set_error_from_osstatus(OSStatus status, const char *prefix, bson_error_t *error) { CFStringRef err; char *err_str; err = SecCopyErrorMessageString(status, NULL); err_str = _mongoc_cfstringref_to_cstring(err); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "%s: %s (%d)", prefix, err_str, status); bson_free(err_str); CFRelease(err); } /* Always returns a string that must be freed. */ static char * explain_trust_result(SecTrustRef trust, SecTrustResultType trust_result) { CFArrayRef cfprops = NULL; CFIndex count, i; mcommon_string_append_t reason; mcommon_string_new_as_append(&reason); switch (trust_result) { case kSecTrustResultDeny: mcommon_string_append(&reason, "Certificate trust denied"); break; case kSecTrustResultRecoverableTrustFailure: mcommon_string_append(&reason, "Certificate trust failure"); break; case kSecTrustResultFatalTrustFailure: mcommon_string_append(&reason, "Certificate trust fatal failure"); break; case kSecTrustResultInvalid: mcommon_string_append(&reason, "Certificate trust evaluation failure"); break; default: mcommon_string_append_printf(&reason, "Certificate trust failure #%d", (int)trust_result); break; } mcommon_string_append(&reason, ": "); cfprops = SecTrustCopyProperties(trust); /* This contains an array of dictionaries, each representing a cert in the * chain. Append the first failure reason found. */ if (!cfprops) { mcommon_string_append(&reason, "Unable to retreive cause for trust failure"); goto done; } count = CFArrayGetCount(cfprops); for (i = 0; i < count; ++i) { const void *elem = NULL; const void *reason_elem = NULL; char *reason_str; CFDictionaryRef dict; elem = CFArrayGetValueAtIndex(cfprops, i); if (CFGetTypeID(elem) != CFDictionaryGetTypeID()) { mcommon_string_append(&reason, "Unable to parse cause for trust failure"); goto done; } dict = (CFDictionaryRef)elem; reason_elem = CFDictionaryGetValue(dict, kSecPropertyTypeError); if (!reason_elem) { continue; } if (CFGetTypeID(reason_elem) != CFStringGetTypeID()) { mcommon_string_append(&reason, "Unable to parse trust failure error"); goto done; } reason_str = _mongoc_cfstringref_to_cstring(reason_elem); if (reason_str) { mcommon_string_append(&reason, reason_str); bson_free(reason_str); goto done; } else { mcommon_string_append(&reason, "Unable to express trust failure error"); goto done; } } mcommon_string_append(&reason, "No trust failure reason available"); done: CFReleaseSafe(cfprops); return mcommon_string_from_append_destroy_with_steal(&reason); } /* Returns a boolean indicating success. If false is returned, then an error is * set. */ static bool _verify_peer(mongoc_stream_t *stream, bson_error_t *error) { CFArrayRef policies = NULL; SecTrustRef trust = NULL; OSStatus status; CFMutableArrayRef policies_mutable = NULL; SecPolicyRef rev_policy = NULL; SecTrustResultType trust_result; mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; bool ret = false; status = SSLCopyPeerTrust(secure_transport->ssl_ctx_ref, &trust); if (status != noErr) { _set_error_from_osstatus(status, "Certificate validation errored", error); goto fail; } status = SecTrustCopyPolicies(trust, &policies); if (status != noErr) { _set_error_from_osstatus(status, "Certificate validation errored", error); goto fail; } /* Add explicit OCSP revocation policy. */ policies_mutable = CFArrayCreateMutableCopy(NULL, 0, policies); /* TODO: possibly disable endpoint checking by adding the flag * kSecRevocationNetworkAccessDisabled once the option * tlsDisableOCSPEndpointCheck is implemented. */ rev_policy = SecPolicyCreateRevocation(kSecRevocationOCSPMethod); CFArrayAppendValue(policies_mutable, rev_policy); status = SecTrustSetPolicies(trust, policies_mutable); if (status != noErr) { _set_error_from_osstatus(status, "Certificate validation errored", error); goto fail; } /* TODO: SecTrustEvaluate is blocking. When making Secure Transport's * handshake is made non-blocking in CDRIVER-2885, this will need to be * addressed. */ status = SecTrustEvaluate(trust, &trust_result); if (status != noErr) { _set_error_from_osstatus(status, "Certificate validation errored", error); goto fail; } if (trust_result != kSecTrustResultProceed && trust_result != kSecTrustResultUnspecified) { char *reason = explain_trust_result(trust, trust_result); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed (%s)", reason); bson_free(reason); goto fail; } ret = true; fail: CFReleaseSafe(trust); CFReleaseSafe(policies); CFReleaseSafe(policies_mutable); CFReleaseSafe(rev_policy); return ret; } bool mongoc_stream_tls_secure_transport_handshake(mongoc_stream_t *stream, const char *host, int *events, bson_error_t *error) { OSStatus ret = 0; mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_transport_t *secure_transport = (mongoc_stream_tls_secure_transport_t *)tls->ctx; ENTRY; BSON_ASSERT(secure_transport); ret = SSLHandshake(secure_transport->ssl_ctx_ref); if (ret == errSSLServerAuthCompleted) { if (!tls->ssl_opts.weak_cert_validation && !_verify_peer(stream, error)) { *events = 0; RETURN(false); } ret = errSSLWouldBlock; } if (ret == noErr) { RETURN(true); } if (ret == errSSLWouldBlock) { *events = POLLIN | POLLOUT; } else { *events = 0; _set_error_from_osstatus(ret, "TLS handshake failed", error); } RETURN(false); } static bool _mongoc_stream_tls_secure_channel_timed_out(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; ENTRY; RETURN(mongoc_stream_timed_out(tls->base_stream)); } static bool _mongoc_stream_tls_secure_channel_should_retry(mongoc_stream_t *stream) { mongoc_stream_tls_t *tls = (mongoc_stream_tls_t *)stream; ENTRY; RETURN(mongoc_stream_should_retry(tls->base_stream)); } mongoc_stream_t * mongoc_stream_tls_secure_transport_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) { mongoc_stream_tls_t *tls; mongoc_stream_tls_secure_transport_t *secure_transport; ENTRY; BSON_ASSERT(base_stream); BSON_ASSERT(opt); if (opt->ca_dir) { MONGOC_ERROR("Setting mongoc_ssl_opt_t.ca_dir has no effect when built " "against Secure Transport"); RETURN(NULL); } if (opt->crl_file) { MONGOC_ERROR("Setting mongoc_ssl_opt_t.crl_file has no effect when built " "against Secure Transport"); RETURN(NULL); } secure_transport = (mongoc_stream_tls_secure_transport_t *)bson_malloc0(sizeof *secure_transport); tls = (mongoc_stream_tls_t *)bson_malloc0(sizeof *tls); tls->parent.type = MONGOC_STREAM_TLS; tls->parent.destroy = _mongoc_stream_tls_secure_transport_destroy; tls->parent.failed = _mongoc_stream_tls_secure_transport_failed; tls->parent.close = _mongoc_stream_tls_secure_transport_close; tls->parent.flush = _mongoc_stream_tls_secure_transport_flush; tls->parent.writev = _mongoc_stream_tls_secure_transport_writev; tls->parent.readv = _mongoc_stream_tls_secure_transport_readv; tls->parent.setsockopt = _mongoc_stream_tls_secure_transport_setsockopt; tls->parent.get_base_stream = _mongoc_stream_tls_secure_transport_get_base_stream; tls->parent.check_closed = _mongoc_stream_tls_secure_transport_check_closed; tls->parent.timed_out = _mongoc_stream_tls_secure_channel_timed_out; tls->parent.should_retry = _mongoc_stream_tls_secure_channel_should_retry; memcpy(&tls->ssl_opts, opt, sizeof tls->ssl_opts); tls->handshake = mongoc_stream_tls_secure_transport_handshake; tls->ctx = (void *)secure_transport; tls->timeout_msec = -1; secure_transport->ssl_ctx_ref = SSLCreateContext(kCFAllocatorDefault, client ? kSSLClientSide : kSSLServerSide, kSSLStreamType); SSLSetIOFuncs(secure_transport->ssl_ctx_ref, mongoc_secure_transport_read, mongoc_secure_transport_write); SSLSetProtocolVersionMin(secure_transport->ssl_ctx_ref, kTLSProtocol1); if (opt->pem_file && !mongoc_secure_transport_setup_certificate(secure_transport, opt)) { mongoc_stream_destroy((mongoc_stream_t *)tls); RETURN(NULL); } if (opt->ca_file && !mongoc_secure_transport_setup_ca(secure_transport, opt)) { mongoc_stream_destroy((mongoc_stream_t *)tls); RETURN(NULL); } /* don't link base_stream to tls until we're sure we won't destroy tls */ tls->base_stream = base_stream; if (client) { /* This option has SSL_Handshake stop before it verifies peer cert. Set * this since we verify peer cert manually later. */ SSLSetSessionOption(secure_transport->ssl_ctx_ref, kSSLSessionOptionBreakOnServerAuth, true); } else if (!opt->allow_invalid_hostname) { /* used only in mock_server_t tests */ SSLSetClientSideAuthenticate(secure_transport->ssl_ctx_ref, kAlwaysAuthenticate); } if (!opt->allow_invalid_hostname) { SSLSetPeerDomainName(secure_transport->ssl_ctx_ref, host, strlen(host)); } SSLSetConnection(secure_transport->ssl_ctx_ref, tls); mongoc_counter_streams_active_inc(); if (_mongoc_ssl_opts_disable_certificate_revocation_check(opt)) { MONGOC_ERROR("Setting tlsDisableCertificateRevocationCheck has no " "effect when built against Secure Transport"); } if (_mongoc_ssl_opts_disable_ocsp_endpoint_check(opt)) { MONGOC_ERROR("Setting tlsDisableOCSPEndpointCheck has no effect when " "built against Secure Transport"); } RETURN((mongoc_stream_t *)tls); } // CDRIVER-2722: Secure Transport is deprecated on MacOS. END_IGNORE_DEPRECATIONS #endif /* MONGOC_ENABLE_SSL_SECURE_TRANSPORT */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls-secure-transport.h000066400000000000000000000024651511661753600302410ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_SECURE_TRANSPORT_H #define MONGOC_STREAM_TLS_SECURE_TRANSPORT_H #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT #include #include #include #include BSON_BEGIN_DECLS MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_secure_transport_new(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_ENABLE_SSL_SECURE_TRANSPORT */ #endif /* MONGOC_STREAM_TLS_SECURE_TRANSPORT_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls.c000066400000000000000000000175261511661753600247220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifdef MONGOC_ENABLE_SSL #include #include #include #include #include #include #include #include #if defined(MONGOC_ENABLE_SSL_OPENSSL) #include #include #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) #include #include #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include #include #endif #include // BEGIN_IGNORE_DEPRECATIONS #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream-tls" /** * mongoc_stream_tls_handshake: * * Performs TLS handshake dance */ bool mongoc_stream_tls_handshake( mongoc_stream_t *stream, const char *host, int32_t timeout_msec, int *events, bson_error_t *error) { mongoc_stream_tls_t *stream_tls = (mongoc_stream_tls_t *)mongoc_stream_get_tls_stream(stream); BSON_ASSERT(stream_tls); BSON_ASSERT(stream_tls->handshake); stream_tls->timeout_msec = timeout_msec; return stream_tls->handshake(stream, host, events, error); } bool mongoc_stream_tls_handshake_block(mongoc_stream_t *stream, const char *host, int32_t timeout_msec, bson_error_t *error) { int events; ssize_t ret = 0; mongoc_stream_poll_t poller; int64_t expire = 0; if (timeout_msec >= 0) { expire = bson_get_monotonic_time() + (timeout_msec * 1000); } /* * error variables get re-used a lot. To prevent cross-contamination of error * messages, and still be able to provide a generic failure message when * mongoc_stream_tls_handshake fails without a specific reason, we need to * init * the error code to 0. */ if (error) { error->code = 0; } do { events = 0; if (mongoc_stream_tls_handshake(stream, host, timeout_msec, &events, error)) { return true; } if (events) { poller.stream = stream; poller.events = events; poller.revents = 0; if (expire >= 0) { const int64_t now = bson_get_monotonic_time(); const int64_t remaining = expire - now; if (remaining < 0) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake timed out."); return false; } else { const int64_t msec = remaining / 1000; BSON_ASSERT(mlib_in_range(int32_t, msec)); timeout_msec = (int32_t)msec; } } ret = mongoc_stream_poll(&poller, 1, timeout_msec); } } while (events && ret > 0); if (error && !error->code) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "TLS handshake failed."); } return false; } // mongoc_stream_tls_new_with_hostname creates a TLS stream. // // base_stream: underlying data stream. Ownership is transferred to the returned stream on success. // host: hostname used to verify the the server certificate. // opt: TLS options. // client: indicates a client or server stream. Secure Channel implementation does not support server streams. // // Side effect: May set opt->allow_invalid_hostname to true. // // Returns a new stream on success. Returns `NULL` on failure. mongoc_stream_t * mongoc_stream_tls_new_with_hostname(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) { BSON_ASSERT_PARAM(base_stream); BSON_OPTIONAL_PARAM(host); BSON_ASSERT_PARAM(opt); /* !client is only used for testing, * when the streams are pretending to be the server */ if (!client || opt->weak_cert_validation) { opt->allow_invalid_hostname = true; } #ifndef _WIN32 /* Silly check for Unix Domain Sockets */ if (!host || (host[0] == '/' && !access(host, F_OK))) { opt->allow_invalid_hostname = true; } #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) return mongoc_stream_tls_openssl_new(base_stream, host, opt, client); #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) return mongoc_stream_tls_secure_transport_new(base_stream, host, opt, client); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) return mongoc_stream_tls_secure_channel_new(base_stream, host, opt, client); #else #error "Don't know how to create TLS stream" #endif } #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L // Create an OpenSSL TLS stream with a shared context. // // This is an internal extension to mongoc_stream_tls_new_with_hostname. // // base_stream: underlying data stream. Ownership is transferred to the returned stream on success. // host: hostname used to verify the the server certificate. // opt: TLS options. // client: indicates a client or server stream. // ssl_ctx: shared context. // // Side effect: May set opt->allow_invalid_hostname to true for compatibility with mongoc_stream_tls_new_with_hostname. // // Returns a new stream on success. Returns `NULL` on failure. mongoc_stream_t * mongoc_stream_tls_new_with_hostname_and_openssl_context( mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client, SSL_CTX *ssl_ctx) { BSON_ASSERT_PARAM(base_stream); BSON_OPTIONAL_PARAM(host); BSON_ASSERT_PARAM(opt); BSON_OPTIONAL_PARAM(ssl_ctx); /* !client is only used for testing, * when the streams are pretending to be the server */ if (!client || opt->weak_cert_validation) { opt->allow_invalid_hostname = true; } #ifndef _WIN32 /* Silly check for Unix Domain Sockets */ if (!host || (host[0] == '/' && !access(host, F_OK))) { opt->allow_invalid_hostname = true; } #endif return mongoc_stream_tls_openssl_new_with_context(base_stream, host, opt, client, ssl_ctx); } #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) // Create a Secure Channel TLS stream with shared credentials. // // This is an internal extension to mongoc_stream_tls_new_with_hostname. // // base_stream: underlying data stream. Ownership is transferred to the returned stream on success. // opt: TLS options. // secure_channel_cred_ptr: optional shared credentials. May be MONGOC_SHARED_PTR_NULL. // // Side effect: May set opt->allow_invalid_hostname to true for compatibility with mongoc_stream_tls_new_with_hostname. // // Returns a new stream on success. Returns `NULL` on failure. mongoc_stream_t * mongoc_stream_tls_new_with_secure_channel_cred(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, mongoc_shared_ptr secure_channel_cred_ptr) { BSON_ASSERT_PARAM(base_stream); BSON_ASSERT_PARAM(opt); if (opt->weak_cert_validation) { // For compatibility with `mongoc_stream_tls_new_with_hostname`, modify `opt` directly: opt->allow_invalid_hostname = true; } return mongoc_stream_tls_secure_channel_new_with_creds(base_stream, host, opt, secure_channel_cred_ptr); } #endif // MONGOC_ENABLE_SSL_SECURE_CHANNEL #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream-tls.h000066400000000000000000000026261511661753600247220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_TLS_H #define MONGOC_STREAM_TLS_H #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_stream_tls_t mongoc_stream_tls_t; MONGOC_EXPORT(bool) mongoc_stream_tls_handshake( mongoc_stream_t *stream, const char *host, int32_t timeout_msec, int *events, bson_error_t *error); MONGOC_EXPORT(bool) mongoc_stream_tls_handshake_block(mongoc_stream_t *stream, const char *host, int32_t timeout_msec, bson_error_t *error); MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_tls_new_with_hostname(mongoc_stream_t *base_stream, const char *host, mongoc_ssl_opt_t *opt, int client) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_STREAM_TLS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream.c000066400000000000000000000251151511661753600241130ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "stream" #ifndef MONGOC_DEFAULT_TIMEOUT_MSEC #define MONGOC_DEFAULT_TIMEOUT_MSEC (60L * 60L * 1000L) #endif /** * mongoc_stream_close: * @stream: A mongoc_stream_t. * * Closes the underlying file-descriptor used by @stream. * * Returns: 0 on success, -1 on failure. */ int mongoc_stream_close(mongoc_stream_t *stream) { int ret; ENTRY; BSON_ASSERT_PARAM(stream); BSON_ASSERT(stream->close); ret = stream->close(stream); RETURN(ret); } /** * mongoc_stream_failed: * @stream: A mongoc_stream_t. * * Frees any resources referenced by @stream, including the memory allocation * for @stream. * This handler is called upon stream failure, such as network errors, invalid * replies * or replicaset reconfigures deleting the stream */ void mongoc_stream_failed(mongoc_stream_t *stream) { ENTRY; BSON_ASSERT_PARAM(stream); if (stream->failed) { stream->failed(stream); } else { stream->destroy(stream); } EXIT; } /** * mongoc_stream_destroy: * @stream: A mongoc_stream_t. * * Frees any resources referenced by @stream, including the memory allocation * for @stream. */ void mongoc_stream_destroy(mongoc_stream_t *stream) { ENTRY; if (!stream) { EXIT; } BSON_ASSERT(stream->destroy); stream->destroy(stream); EXIT; } /** * mongoc_stream_flush: * @stream: A mongoc_stream_t. * * Flushes the data in the underlying stream to the transport. * * Returns: 0 on success, -1 on failure. */ int mongoc_stream_flush(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return stream->flush(stream); } /** * mongoc_stream_writev: * @stream: A mongoc_stream_t. * @iov: An array of iovec to write to the stream. * @iovcnt: The number of elements in @iov. * * Writes an array of iovec buffers to the underlying stream. * * Returns: the number of bytes written, or -1 upon failure. */ ssize_t mongoc_stream_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { ssize_t ret; ENTRY; BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(stream->writev); // CDRIVER-4781: for backward compatibility. if (timeout_msec < 0) { timeout_msec = MONGOC_DEFAULT_TIMEOUT_MSEC; } DUMP_IOVEC(writev, iov, iovcnt); ret = stream->writev(stream, iov, iovcnt, timeout_msec); RETURN(ret); } /** * mongoc_stream_write: * @stream: A mongoc_stream_t. * @buf: A buffer to write. * @count: The number of bytes to write into @buf. * * Simplified access to mongoc_stream_writev(). Creates a single iovec * with the buffer provided. * * Returns: -1 on failure, otherwise the number of bytes written. */ ssize_t mongoc_stream_write(mongoc_stream_t *stream, void *buf, size_t count, int32_t timeout_msec) { mongoc_iovec_t iov; ssize_t ret; ENTRY; BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(buf); iov.iov_base = buf; iov.iov_len = count; BSON_ASSERT(stream->writev); ret = mongoc_stream_writev(stream, &iov, 1, timeout_msec); RETURN(ret); } /** * mongoc_stream_readv: * @stream: A mongoc_stream_t. * @iov: An array of iovec containing the location and sizes to read. * @iovcnt: the number of elements in @iov. * @min_bytes: the minimum number of bytes to return, or -1. * * Reads into the various buffers pointed to by @iov and associated * buffer lengths. * * If @min_bytes is specified, then at least min_bytes will be returned unless * eof is encountered. This may result in ETIMEDOUT * * Returns: the number of bytes read or -1 on failure. */ ssize_t mongoc_stream_readv(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { ssize_t ret; ENTRY; BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(iov); BSON_ASSERT(iovcnt); BSON_ASSERT(stream->readv); ret = stream->readv(stream, iov, iovcnt, min_bytes, timeout_msec); if (ret >= 0) { DUMP_IOVEC(readv, iov, iovcnt); } RETURN(ret); } /** * mongoc_stream_read: * @stream: A mongoc_stream_t. * @buf: A buffer to write into. * @count: The number of bytes to write into @buf. * @min_bytes: The minimum number of bytes to receive * * Simplified access to mongoc_stream_readv(). Creates a single iovec * with the buffer provided. * * If @min_bytes is specified, then at least min_bytes will be returned unless * eof is encountered. This may result in ETIMEDOUT * * Returns: -1 on failure, otherwise the number of bytes read. */ ssize_t mongoc_stream_read(mongoc_stream_t *stream, void *buf, size_t count, size_t min_bytes, int32_t timeout_msec) { mongoc_iovec_t iov; ssize_t ret; ENTRY; BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(buf); iov.iov_base = buf; iov.iov_len = count; BSON_ASSERT(stream->readv); ret = mongoc_stream_readv(stream, &iov, 1, min_bytes, timeout_msec); RETURN(ret); } int mongoc_stream_setsockopt(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { BSON_ASSERT_PARAM(stream); if (stream->setsockopt) { return stream->setsockopt(stream, level, optname, optval, optlen); } return 0; } mongoc_stream_t * mongoc_stream_get_base_stream(mongoc_stream_t *stream) /* IN */ { BSON_ASSERT_PARAM(stream); if (stream->get_base_stream) { return stream->get_base_stream(stream); } return stream; } mongoc_stream_t * mongoc_stream_get_root_stream(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); while (stream->get_base_stream) { stream = stream->get_base_stream(stream); } return stream; } mongoc_stream_t * mongoc_stream_get_tls_stream(mongoc_stream_t *stream) /* IN */ { BSON_ASSERT_PARAM(stream); for (; stream && stream->type != MONGOC_STREAM_TLS; stream = stream->get_base_stream(stream)) ; return stream; } ssize_t mongoc_stream_poll(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout_ms) { return _mongoc_stream_poll_internal(streams, nstreams, mlib_expires_after(mlib_duration(timeout_ms, ms))); } ssize_t _mongoc_stream_poll_internal(mongoc_stream_poll_t *streams, size_t nstreams, mlib_timer until) { mongoc_stream_poll_t *poller = BSON_ARRAY_ALLOC(nstreams, mongoc_stream_poll_t); int last_type = 0; ssize_t rval = -1; errno = 0; for (size_t i = 0u; i < nstreams; i++) { poller[i].stream = mongoc_stream_get_root_stream(streams[i].stream); poller[i].events = streams[i].events; poller[i].revents = 0; if (i == 0u) { last_type = poller[i].stream->type; } else if (last_type != poller[i].stream->type) { errno = EINVAL; goto CLEANUP; } } if (!poller[0].stream->poll) { errno = EINVAL; goto CLEANUP; } int32_t time_remain_ms = 0; if (mlib_narrow(&time_remain_ms, mlib_milliseconds_count(mlib_timer_remaining(until)))) { // Too many ms, just use the max time_remain_ms = INT32_MAX; } rval = poller[0].stream->poll(poller, nstreams, time_remain_ms); if (rval > 0) { for (size_t i = 0u; i < nstreams; i++) { streams[i].revents = poller[i].revents; } } CLEANUP: bson_free(poller); return rval; } bool mongoc_stream_check_closed(mongoc_stream_t *stream) { int ret; ENTRY; if (!stream) { return true; } ret = stream->check_closed(stream); RETURN(ret); } bool mongoc_stream_timed_out(mongoc_stream_t *stream) { ENTRY; BSON_ASSERT_PARAM(stream); /* for e.g. a file stream there is no timed_out function */ RETURN(stream->timed_out && stream->timed_out(stream)); } bool mongoc_stream_should_retry(mongoc_stream_t *stream) { ENTRY; BSON_ASSERT_PARAM(stream); /* for e.g. a file stream there is no should_retry function */ RETURN(stream->should_retry && stream->should_retry(stream)); } bool _mongoc_stream_writev_full( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int64_t timeout_msec, bson_error_t *error) { size_t total_bytes = 0; ssize_t r; ENTRY; for (size_t i = 0u; i < iovcnt; i++) { total_bytes += iov[i].iov_len; } if (BSON_UNLIKELY(!mlib_in_range(int32_t, timeout_msec))) { // CDRIVER-4589 _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "timeout_msec value %" PRId64 " exceeds supported 32-bit range", timeout_msec); RETURN(false); } r = mongoc_stream_writev(stream, iov, iovcnt, (int32_t)timeout_msec); TRACE("writev returned: %zd", r); if (r < 0) { if (error) { char buf[128]; char *errstr; errstr = bson_strerror_r(errno, buf, sizeof(buf)); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failure during socket delivery: %s (%d)", errstr, errno); } RETURN(false); } if (mlib_cmp(r, !=, total_bytes)) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failure to send all requested bytes (only sent: %" PRIu64 "/%zu in %" PRId64 "ms) during socket delivery", (uint64_t)r, total_bytes, timeout_msec); RETURN(false); } RETURN(true); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-stream.h000066400000000000000000000071631511661753600241230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STREAM_H #define MONGOC_STREAM_H #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_stream_t mongoc_stream_t; typedef struct _mongoc_stream_poll_t { mongoc_stream_t *stream; int events; int revents; } mongoc_stream_poll_t; struct _mongoc_stream_t { int type; void(BSON_CALL *destroy)(mongoc_stream_t *stream); int(BSON_CALL *close)(mongoc_stream_t *stream); int(BSON_CALL *flush)(mongoc_stream_t *stream); ssize_t(BSON_CALL *writev)(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec); ssize_t(BSON_CALL *readv)( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec); int(BSON_CALL *setsockopt)(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen); mongoc_stream_t *(BSON_CALL *get_base_stream)(mongoc_stream_t *stream); bool(BSON_CALL *check_closed)(mongoc_stream_t *stream); ssize_t(BSON_CALL *poll)(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout); void(BSON_CALL *failed)(mongoc_stream_t *stream); bool(BSON_CALL *timed_out)(mongoc_stream_t *stream); bool(BSON_CALL *should_retry)(mongoc_stream_t *stream); void *padding[3]; }; MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_get_base_stream(mongoc_stream_t *stream); MONGOC_EXPORT(mongoc_stream_t *) mongoc_stream_get_tls_stream(mongoc_stream_t *stream); MONGOC_EXPORT(int) mongoc_stream_close(mongoc_stream_t *stream); MONGOC_EXPORT(void) mongoc_stream_destroy(mongoc_stream_t *stream); MONGOC_EXPORT(void) mongoc_stream_failed(mongoc_stream_t *stream); MONGOC_EXPORT(int) mongoc_stream_flush(mongoc_stream_t *stream); MONGOC_EXPORT(ssize_t) mongoc_stream_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec); MONGOC_EXPORT(ssize_t) mongoc_stream_write(mongoc_stream_t *stream, void *buf, size_t count, int32_t timeout_msec); MONGOC_EXPORT(ssize_t) mongoc_stream_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec); MONGOC_EXPORT(ssize_t) mongoc_stream_read(mongoc_stream_t *stream, void *buf, size_t count, size_t min_bytes, int32_t timeout_msec); MONGOC_EXPORT(int) mongoc_stream_setsockopt(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen); MONGOC_EXPORT(bool) mongoc_stream_check_closed(mongoc_stream_t *stream); MONGOC_EXPORT(bool) mongoc_stream_timed_out(mongoc_stream_t *stream); MONGOC_EXPORT(bool) mongoc_stream_should_retry(mongoc_stream_t *stream); /** * @brief Poll a set of streams * * @param streams Pointer to an array of streams to be polled * @param nstreams The number of streams in the array pointed-to by `streams` * @param timeout_ms The maximum number of milliseconds to poll * */ MONGOC_EXPORT(ssize_t) mongoc_stream_poll(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout_ms); BSON_END_DECLS #endif /* MONGOC_STREAM_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-structured-log-private.h000066400000000000000000000660571511661753600272720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STRUCTURED_LOG_PRIVATE_H #define MONGOC_STRUCTURED_LOG_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include #include BSON_BEGIN_DECLS typedef struct mongoc_structured_log_instance_t mongoc_structured_log_instance_t; #define MONGOC_STRUCTURED_LOG_DEFAULT_LEVEL MONGOC_STRUCTURED_LOG_LEVEL_WARNING #define MONGOC_STRUCTURED_LOG_DEFAULT_MAX_DOCUMENT_LENGTH 1000 /** * @brief maximum possible value of the 'maximum document length' setting, enforced when reading settings from the * environment. * * Maximum document length applies to a single serialized JSON document within the log. * The overall log document, when serialized as BSON, will be subject to BSON_MAX_SIZE. * At a minimum we should leave room for BSON headers and for the JSON truncation marker ("..."). * Choose to leave a little more room, as it's more useful to truncate the huge document early * rather than fail in bson_append_utf8(). */ #define MONGOC_STRUCTURED_LOG_MAXIMUM_MAX_DOCUMENT_LENGTH ((uint32_t)BSON_MAX_SIZE - 4096u) /** * @brief Allocate a new instance of the structured logging system * @param opts Options, copied into the new instance. * * Must be paired with mongoc_structured_log_instance_destroy(). * * Once created, an instance has immutable settings. To change the handler * or the max level per component filters, the instance will be replaced. * One instance can be used by mongoc_structured_log() calls on multiple * threads concurrently. */ mongoc_structured_log_instance_t * mongoc_structured_log_instance_new(const mongoc_structured_log_opts_t *opts); /** * @brief Destroy an instance of the structured logging system. * * All threads must be finished using the mongoc_structured_log_instance_t * before it is destroyed. */ void mongoc_structured_log_instance_destroy(mongoc_structured_log_instance_t *instance); /** * @def mongoc_structured_log(instance, level, component, message, ...) * @brief Write to the libmongoc structured log. * * @param instance Structured log instance, as a mongoc_structured_log_instance_t* expression * @param level Log level, as a mongoc_structured_log_level_t expression * @param component Log component, as a mongoc_structured_log_component_t expression * @param message Log message, as a const char* expression * @param ... Optional list of log 'items' that specify additional information to include. * * The instance, level, component, and message expressions are always evaluated. * Any expressions in the optional items list are only evaluated if the log * hasn't been disabled by a component's maximum log level setting or by * unsetting the global structured log handler. * * Each log 'item' may represent a deferred operation that has minimal cost * unless mongoc_structured_log_entry_message_as_bson is actually invoked. * * Calls implementation functions _mongoc_structured_log_should_log() before * building the table of item information and _mongoc_structured_log_with_entry() * once the table is built. */ #define mongoc_structured_log(_structured_log_instance, _level, _component, ...) \ _bsonDSL_eval(_mongoc_structured_log_with_end_of_list( \ _structured_log_instance, _level, _component, __VA_ARGS__, end_of_list())) #define _mongoc_structured_log_with_end_of_list(_structured_log_instance, _level, _component, _message, ...) \ do { \ mongoc_structured_log_entry_t _entry = {.envelope.instance = (_structured_log_instance), \ .envelope.level = (_level), \ .envelope.component = (_component), \ .envelope.message = (_message)}; \ if (_mongoc_structured_log_should_log(&_entry.envelope)) { \ const mongoc_structured_log_builder_stage_t _builder[] = { \ _mongoc_structured_log_items_to_stages(__VA_ARGS__)}; \ _entry.builder = _builder; \ _mongoc_structured_log_with_entry(&_entry); \ } \ } while (0) #define _mongoc_structured_log_items_to_stages(...) \ _bsonDSL_mapMacro(_mongoc_structured_log_item_to_stages, ~, __VA_ARGS__) #define _mongoc_structured_log_flag_expr(_action, _constant, _counter) | (_constant##_##_action) #define _mongoc_structured_log_item_to_stages(_action, _constant, _counter) _mongoc_structured_log_item_##_action #define _mongoc_structured_log_item_end_of_list() {.func = NULL}, /** * @def utf8(key, value) * @brief Structured log item, referencing a NUL-terminated utf8 string value. * * @param key Key as a const char * expression, or NULL to skip this item. * @param value UTF8 value as a const char * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_utf8(_key_or_null, _value_utf8) \ {.func = _mongoc_structured_log_append_utf8, .arg1.utf8 = (_key_or_null), .arg2.utf8 = (_value_utf8)}, /** * @def utf8_n(key, value, value_len) * @brief Structured log item, referencing a utf8 string value with explicit length. * * @param key Document key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value UTF8 value as a const char * expression, or NULL for a null value. May have embedded NUL bytes. * @param value_len UTF8 value length in bytes, as an int32_t expression. */ #define _mongoc_structured_log_item_utf8_n(_key_literal, _value_utf8, _value_len) \ _mongoc_structured_log_item_utf8_nn(_key_literal, strlen(_key_literal), _value_utf8, _value_len) /** * @def utf8_nn(key, key_len, value, value_len) * @brief Structured log item, referencing a utf8 string with explicit key and value lengths. * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param key_len UTF8 value length in bytes, as an int32_t expression. * @param value UTF8 value as a const char * expression, or NULL for a null value. May have embedded NUL bytes. * @param value_len UTF8 value length in bytes, as an int32_t expression. */ #define _mongoc_structured_log_item_utf8_nn(_key_or_null, _key_len, _value_utf8, _value_len) \ {.func = _mongoc_structured_log_append_utf8_n_stage0, .arg1.utf8 = (_key_or_null), .arg2.int32 = (_key_len)}, \ {.func = _mongoc_structured_log_append_utf8_n_stage1, .arg1.utf8 = (_value_utf8), .arg2.int32 = (_value_len)}, /** * @def int32(key, value) * @brief Structured log item, 32-bit integer * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Value as an int32_t expression. */ #define _mongoc_structured_log_item_int32(_key_or_null, _value_int32) \ {.func = _mongoc_structured_log_append_int32, .arg1.utf8 = (_key_or_null), .arg2.int32 = (_value_int32)}, /** * @def int64(key, value) * @brief Structured log item, 64-bit integer * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Value as an int64_t expression. */ #define _mongoc_structured_log_item_int64(_key_or_null, _value_int64) \ {.func = _mongoc_structured_log_append_int64, .arg1.utf8 = (_key_or_null), .arg2.int64 = (_value_int64)}, /** * @def double(key, value) * @brief Structured log item, double precision floating point * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Value as a double expression. */ #define _mongoc_structured_log_item_double(_key_or_null, _value_double) \ {.func = _mongoc_structured_log_append_double, .arg1.utf8 = (_key_or_null), .arg2.double_value = (_value_double)}, /** * @def boolean(key, value) * @brief Structured log item, boolean * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Value as a bool expression. */ #define _mongoc_structured_log_item_boolean(_key_or_null, _value_boolean) \ {.func = _mongoc_structured_log_append_boolean, .arg1.utf8 = (_key_or_null), .arg2.boolean = (_value_boolean)}, /** * @def error(key, value) * @brief Structured log item, bson_error_t document * * Serializes the fields of a bson_error_t as a subdocument with the indicated key. * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Error as a const bson_error_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_error(_key_or_null, _error_or_null) \ {.func = _mongoc_structured_log_append_error, .arg1.utf8 = (_key_or_null), .arg2.error = (_error_or_null)}, /** * @def read_prefs(key, value) * @brief Structured log item, mongoc_read_prefs_t document * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Value as a const mongoc_read_prefs_t * expression. NULL is equivalent to Primary read preference. * */ #define _mongoc_structured_log_item_read_prefs(_key_or_null, _value_read_prefs) \ {.func = _mongoc_structured_log_append_read_prefs, \ .arg1.utf8 = (_key_or_null), \ .arg2.read_prefs = (_value_read_prefs)}, /** * @def oid(key, value) * @brief Structured log item, bson_oid_t * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value OID as a const bson_oid_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_oid(_key_or_null, _value_oid) \ {.func = _mongoc_structured_log_append_oid, .arg1.utf8 = (_key_or_null), .arg2.oid = (_value_oid)}, /** * @def oid_as_hex(key, value) * @brief Structured log item, bson_oid_t converted to a hex string * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value OID to convert as a const bson_oid_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_oid_as_hex(_key_or_null, _value_oid) \ {.func = _mongoc_structured_log_append_oid_as_hex, .arg1.utf8 = (_key_or_null), .arg2.oid = (_value_oid)}, /** * @def bson_as_json(key, value) * @brief Structured log item, bson_t converted to a JSON string * * Always uses relaxed extended JSON format, and the current applicable * maximum document length for structured logging. * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value BSON to convert as a const bson_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_bson_as_json(_key_or_null, _value_bson) \ {.func = _mongoc_structured_log_append_bson_as_json, .arg1.utf8 = (_key_or_null), .arg2.bson = (_value_bson)}, /** * @def topology_description_as_json(key, value) * @brief Structured log item, mongoc_topology_description_t serialized into a json string * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param value Topology description as a const mongoc_topology_description_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_topology_description_as_json(_key_or_null, _value_topology_description) \ {.func = _mongoc_structured_log_append_topology_description_as_json, \ .arg1.utf8 = (_key_or_null), \ .arg2.topology_description = (_value_topology_description)}, /** * @def topology_as_description_json(key, topology) * @brief Structured log item, current description from a mongoc_topology_t serialized into a json string * * @param key Key as a NUL-terminated const char * expression, or NULL to skip this item. * @param topology Topology as a const mongoc_topology_t * expression, or NULL for a null value. */ #define _mongoc_structured_log_item_topology_as_description_json(_key_or_null, _topology) \ {.func = _mongoc_structured_log_append_topology_as_description_json, \ .arg1.utf8 = (_key_or_null), \ .arg2.topology = (_topology)}, typedef enum { MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_COMMAND = (1 << 0), MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_DATABASE_NAME = (1 << 1), MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_COMMAND_NAME = (1 << 2), MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_OPERATION_ID = (1 << 3), } mongoc_structured_log_cmd_content_flags_t; /** * @def cmd(cmd, ...) * @brief Structured log item, mongoc_cmd_t fields with automatic redaction * * @param cmd Borrowed command reference, as a const mongo_cmd_t * expression. Required. * @param ... Fields to include. Order is not significant. Any of: COMMAND, DATABASE_NAME, COMMAND_NAME, OPERATION_ID. * */ #define _mongoc_structured_log_item_cmd(_cmd, ...) \ {.func = _mongoc_structured_log_append_cmd, \ .arg1.cmd = (_cmd), \ .arg2.cmd_flags = \ (0 _bsonDSL_mapMacro(_mongoc_structured_log_flag_expr, MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG, __VA_ARGS__))}, /** * @def cmd_reply(cmd, reply) * @brief Structured log item, command reply for mongoc_cmd_t with automatic redaction * * @param cmd Borrowed command reference, as a const mongo_cmd_t * expression. Required. * @param reply Borrowed reference to reply document, as a const bson_t * expression. Required. */ #define _mongoc_structured_log_item_cmd_reply(_cmd, _reply_bson) \ {.func = _mongoc_structured_log_append_cmd_reply, .arg1.cmd = (_cmd), .arg2.bson = (_reply_bson)}, /** * @def cmd_name_reply(cmd_name, reply) * @brief Structured log item, reply for named command with automatic redaction * * For cases where a mongo_cmd_t is not available; makes redaction decisions based * on command name but not body, so it's unsuitable for the "hello" reply. * * @param cmd_name Command name as a const char * expression. Required. * @param reply Borrowed reference to reply document, as a const bson_t * expression. Required. */ #define _mongoc_structured_log_item_cmd_name_reply(_cmd_name, _reply_bson) \ {.func = _mongoc_structured_log_append_cmd_name_reply, .arg1.utf8 = (_cmd_name), .arg2.bson = (_reply_bson)}, /** * @def cmd_failure(cmd, reply, error) * @brief Structured log item, failure for mongoc_cmd_t with automatic redaction * * The 'error' is examined to determine whether this is a client-side or server-side failure. * The command's name and body may influence the reply's redaction. * * @param cmd Borrowed command reference, as a const mongo_cmd_t * expression. Required. * @param reply Borrowed reference to reply document, as a const bson_t * expression. Required. * @param error Borrowed reference to a libmongoc error, as a const bson_error_t * expression. Required. */ #define _mongoc_structured_log_item_cmd_failure(_cmd, _reply_bson, _error) \ {.func = _mongoc_structured_log_append_cmd_failure_stage0, .arg1.cmd = (_cmd), .arg2.bson = (_reply_bson)}, \ {.func = _mongoc_structured_log_append_cmd_failure_stage1, .arg1.error = (_error)}, /** * @def cmd_name_failure(cmd_name, reply, error) * @brief Structured log item, failure for named command with automatic redaction * * For cases where a mongo_cmd_t is not available; makes redaction decisions based * on command name but not body, so it's unsuitable for "hello" errors. * * The 'error' is examined to determine whether this is a client-side or server-side failure. * The command's name and body may influence the reply's redaction. * * @param cmd_name Command name as a const char * expression. Required. * @param reply Borrowed reference to reply document, as a const bson_t * expression. Required. * @param error Borrowed reference to a libmongoc error, as a const bson_error_t * expression. Required. */ #define _mongoc_structured_log_item_cmd_name_failure(_cmd_name, _reply_bson, _error) \ {.func = _mongoc_structured_log_append_cmd_name_failure_stage0, \ .arg1.utf8 = (_cmd_name), \ .arg2.bson = (_reply_bson)}, \ {.func = _mongoc_structured_log_append_cmd_name_failure_stage1, .arg1.error = (_error)}, /** * @def server_description(sd, ...) * @brief Structured log item, mongoc_server_description_t fields * * @param sd Borrowed server description reference, as a const mongoc_server_description_t * expression. Required. * @param ... Fields to include. Order is not significant. Any of: TYPE, ADDRESS, SERVER_HOST, SERVER_PORT, * SERVER_CONNECTION_ID, SERVICE_ID. * */ #define _mongoc_structured_log_item_server_description(_server_description, ...) \ {.func = _mongoc_structured_log_append_server_description, \ .arg1.server_description = (_server_description), \ .arg2.server_description_flags = \ (0 _bsonDSL_mapMacro(_mongoc_structured_log_flag_expr, MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG, __VA_ARGS__))}, /** * @def monotonic_time_duration(duration) * @brief Structured log item, standard format for a duration in monotonic time. * @param duration Duration in microseconds, as an int64_t expression. */ #define _mongoc_structured_log_item_monotonic_time_duration(_duration) \ _mongoc_structured_log_item_double("durationMS", (_duration) * 1e-3) typedef struct mongoc_structured_log_builder_stage_t mongoc_structured_log_builder_stage_t; typedef const mongoc_structured_log_builder_stage_t *(*mongoc_structured_log_builder_func_t)( bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); struct mongoc_structured_log_builder_stage_t { // Why "stages" instead of a variable size argument list per item? // This approach keeps function pointers and other types of data // separated, reducing opportunities for malicious control flow. // Most items are one stage. Items that need more arguments can use // multiple consecutive stages, leaving the extra stages' function // pointers unused and set to placeholder values which can be checked. mongoc_structured_log_builder_func_t func; // NULL sentinel here union { const bson_error_t *error; const char *utf8; const mongoc_cmd_t *cmd; const mongoc_server_description_t *server_description; } arg1; union { bool boolean; const bson_error_t *error; const bson_oid_t *oid; const bson_t *bson; const char *utf8; const mongoc_read_prefs_t *read_prefs; const struct _mongoc_topology_description_t *topology_description; const struct _mongoc_topology_t *topology; double double_value; int32_t int32; int64_t int64; mongoc_error_content_flags_t error_flags; mongoc_server_description_content_flags_t server_description_flags; mongoc_structured_log_cmd_content_flags_t cmd_flags; } arg2; // Avoid adding an arg3, prefer to use additional stages }; typedef struct mongoc_structured_log_envelope_t { mongoc_structured_log_instance_t *instance; mongoc_structured_log_level_t level; mongoc_structured_log_component_t component; const char *message; } mongoc_structured_log_envelope_t; struct mongoc_structured_log_entry_t { mongoc_structured_log_envelope_t envelope; const mongoc_structured_log_builder_stage_t *builder; // Required }; void mongoc_structured_log_get_handler(const mongoc_structured_log_opts_t *opts, mongoc_structured_log_func_t *log_func, void **user_data); bool _mongoc_structured_log_should_log(const mongoc_structured_log_envelope_t *envelope); void _mongoc_structured_log_with_entry(const mongoc_structured_log_entry_t *entry); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8_n_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8_n_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_int32(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_int64(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_double(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_boolean(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_error(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_oid_as_hex(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_oid(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_bson_as_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_reply(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_reply(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_failure_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_failure_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_failure_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_failure_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_server_description(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_topology_description_as_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_topology_as_description_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_read_prefs(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts); BSON_END_DECLS #endif /* MONGOC_STRUCTURED_LOG_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-structured-log.c000066400000000000000000001266721511661753600256150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define STRUCTURED_LOG_COMPONENT_TABLE_SIZE (1 + (size_t)MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION) // Environment variables with default level for each log component static const char *gStructuredLogComponentEnvVars[] = { "MONGODB_LOG_COMMAND", "MONGODB_LOG_TOPOLOGY", "MONGODB_LOG_SERVER_SELECTION", "MONGODB_LOG_CONNECTION"}; // Canonical names for log components static const char *gStructuredLogComponentNames[] = {"command", "topology", "serverSelection", "connection"}; // Canonical names for log levels static const char *gStructuredLogLevelNames[] = { "Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debug", "Trace"}; // Additional valid names for log levels static const struct { const char *name; mongoc_structured_log_level_t level; } gStructuredLogLevelAliases[] = {{.name = "off", .level = (mongoc_structured_log_level_t)0}, {.name = "warn", .level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING}, {.name = "info", .level = MONGOC_STRUCTURED_LOG_LEVEL_INFO}}; // Shared mutable data for the default handler typedef struct mongoc_structured_log_default_handler_shared_t { bson_mutex_t mutex; FILE *stream; bool stream_fclose_on_destroy; } mongoc_structured_log_default_handler_shared_t; struct mongoc_structured_log_opts_t { mongoc_structured_log_func_t handler_func; void *handler_user_data; mongoc_structured_log_level_t max_level_per_component[STRUCTURED_LOG_COMPONENT_TABLE_SIZE]; uint32_t max_document_length; char *default_handler_path; }; struct mongoc_structured_log_instance_t { struct mongoc_structured_log_opts_t opts; // Immutable capture of log_opts, func != NULL mongoc_structured_log_default_handler_shared_t default_handler_shared; // Inner mutability }; bson_t * mongoc_structured_log_entry_message_as_bson(const mongoc_structured_log_entry_t *entry) { BSON_ASSERT_PARAM(entry); bson_t *bson = bson_new(); BSON_APPEND_UTF8(bson, "message", entry->envelope.message); const mongoc_structured_log_builder_stage_t *stage = entry->builder; const mongoc_structured_log_opts_t *opts = &entry->envelope.instance->opts; while (stage->func) { stage = stage->func(bson, stage, opts); } return bson; } mongoc_structured_log_level_t mongoc_structured_log_entry_get_level(const mongoc_structured_log_entry_t *entry) { BSON_ASSERT_PARAM(entry); return entry->envelope.level; } mongoc_structured_log_component_t mongoc_structured_log_entry_get_component(const mongoc_structured_log_entry_t *entry) { BSON_ASSERT_PARAM(entry); return entry->envelope.component; } const char * mongoc_structured_log_entry_get_message_string(const mongoc_structured_log_entry_t *entry) { // Note that 'message' happens to have static lifetime right now (all messages are literals) // but our API only guarantees a lifetime that matches 'entry'. BSON_ASSERT_PARAM(entry); return entry->envelope.message; } mongoc_structured_log_level_t mongoc_structured_log_opts_get_max_level_for_component(const mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component) { BSON_ASSERT_PARAM(opts); unsigned table_index = (unsigned)component; if (table_index < STRUCTURED_LOG_COMPONENT_TABLE_SIZE) { return opts->max_level_per_component[table_index]; } else { // As documented, unknown component enums return the lowest possible log level. return MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY; } } void mongoc_structured_log_opts_set_handler(mongoc_structured_log_opts_t *opts, mongoc_structured_log_func_t log_func, void *user_data) { BSON_ASSERT_PARAM(opts); opts->handler_func = log_func; opts->handler_user_data = user_data; } void mongoc_structured_log_get_handler(const mongoc_structured_log_opts_t *opts, mongoc_structured_log_func_t *log_func, void **user_data) { BSON_ASSERT_PARAM(opts); *log_func = opts->handler_func; *user_data = opts->handler_user_data; } bool mongoc_structured_log_opts_set_max_level_for_component(mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component, mongoc_structured_log_level_t level) { BSON_ASSERT_PARAM(opts); if (level >= MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY && level <= MONGOC_STRUCTURED_LOG_LEVEL_TRACE) { unsigned table_index = (unsigned)component; if (table_index < STRUCTURED_LOG_COMPONENT_TABLE_SIZE) { opts->max_level_per_component[table_index] = level; return true; } } return false; } bool mongoc_structured_log_opts_set_max_level_for_all_components(mongoc_structured_log_opts_t *opts, mongoc_structured_log_level_t level) { BSON_ASSERT_PARAM(opts); mlib_foreach_urange (component, STRUCTURED_LOG_COMPONENT_TABLE_SIZE) { if (!mongoc_structured_log_opts_set_max_level_for_component( opts, (mongoc_structured_log_component_t)component, level)) { // Fine to stop on the first error, always means 'level' is wrong and none of these will succeed. return false; } } return true; } bool _mongoc_structured_log_should_log(const mongoc_structured_log_envelope_t *envelope) { // Note that the instance's max_level_per_component table will also be // set to zeroes if logging is disabled. See mongoc_structured_log_instance_new. unsigned table_index = (unsigned)envelope->component; BSON_ASSERT(table_index < STRUCTURED_LOG_COMPONENT_TABLE_SIZE); return envelope->level <= envelope->instance->opts.max_level_per_component[table_index]; } void _mongoc_structured_log_with_entry(const mongoc_structured_log_entry_t *entry) { // By now, func is not allowed to be NULL. See mongoc_structured_log_instance_new. mongoc_structured_log_instance_t *instance = entry->envelope.instance; mongoc_structured_log_func_t func = instance->opts.handler_func; BSON_ASSERT(func); func(entry, instance->opts.handler_user_data); } static bool _mongoc_structured_log_get_log_level_from_env(const char *variable, mongoc_structured_log_level_t *out, int volatile *err_flag_atomic) { char *level = _mongoc_getenv(variable); if (!level) { return false; } bool result = mongoc_structured_log_get_named_level(level, out); if (!result) { // Only log the first instance of each error per process if (0 == mcommon_atomic_int_compare_exchange_strong(err_flag_atomic, 0, 1, mcommon_memory_order_seq_cst)) { MONGOC_WARNING("Invalid log level '%s' read from environment variable %s. Ignoring it.", level, variable); } } bson_free(level); return result; } const char * mongoc_structured_log_get_level_name(mongoc_structured_log_level_t level) { unsigned table_index = (unsigned)level; const size_t table_size = sizeof gStructuredLogLevelNames / sizeof gStructuredLogLevelNames[0]; return table_index < table_size ? gStructuredLogLevelNames[table_index] : NULL; } bool mongoc_structured_log_get_named_level(const char *name, mongoc_structured_log_level_t *out) { BSON_ASSERT_PARAM(name); BSON_ASSERT_PARAM(out); // First check canonical names { const size_t table_size = sizeof gStructuredLogLevelNames / sizeof gStructuredLogLevelNames[0]; for (unsigned table_index = 0; table_index < table_size; table_index++) { if (!strcasecmp(name, gStructuredLogLevelNames[table_index])) { *out = (mongoc_structured_log_level_t)table_index; return true; } } } // Check additional acceptable names { const size_t table_size = sizeof gStructuredLogLevelAliases / sizeof gStructuredLogLevelAliases[0]; for (unsigned table_index = 0; table_index < table_size; table_index++) { const char *alias = gStructuredLogLevelAliases[table_index].name; mongoc_structured_log_level_t level = gStructuredLogLevelAliases[table_index].level; if (!strcasecmp(name, alias)) { *out = level; return true; } } } return false; } const char * mongoc_structured_log_get_component_name(mongoc_structured_log_component_t component) { unsigned table_index = (unsigned)component; const size_t table_size = sizeof gStructuredLogComponentNames / sizeof gStructuredLogComponentNames[0]; return table_index < table_size ? gStructuredLogComponentNames[table_index] : NULL; } bool mongoc_structured_log_get_named_component(const char *name, mongoc_structured_log_component_t *out) { BSON_ASSERT_PARAM(name); BSON_ASSERT_PARAM(out); const size_t table_size = sizeof gStructuredLogComponentNames / sizeof gStructuredLogComponentNames[0]; for (unsigned table_index = 0; table_index < table_size; table_index++) { if (!strcasecmp(name, gStructuredLogComponentNames[table_index])) { *out = (mongoc_structured_log_component_t)table_index; return true; } } return false; } size_t mongoc_structured_log_opts_get_max_document_length(const mongoc_structured_log_opts_t *opts) { return (size_t)opts->max_document_length; } bool mongoc_structured_log_opts_set_max_document_length(mongoc_structured_log_opts_t *opts, size_t max_document_length) { if (max_document_length <= (size_t)MONGOC_STRUCTURED_LOG_MAXIMUM_MAX_DOCUMENT_LENGTH) { opts->max_document_length = (uint32_t)max_document_length; return true; } else { return false; } } bool mongoc_structured_log_opts_set_max_document_length_from_env(mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(opts); const char *variable = "MONGODB_LOG_MAX_DOCUMENT_LENGTH"; char *max_length_str = _mongoc_getenv(variable); if (!max_length_str) { return true; } bool result = false; if (!strcasecmp(max_length_str, "unlimited")) { BSON_ASSERT( mongoc_structured_log_opts_set_max_document_length(opts, MONGOC_STRUCTURED_LOG_MAXIMUM_MAX_DOCUMENT_LENGTH)); result = true; } else { char *endptr; long int_value = strtol(max_length_str, &endptr, 10); if (int_value >= 0 && endptr != max_length_str && *endptr == '\0' && mlib_in_range(size_t, int_value) && mongoc_structured_log_opts_set_max_document_length(opts, (size_t)int_value)) { result = true; } } if (!result) { // Only log the first instance of each error per process static int err_flag_atomic; if (0 == mcommon_atomic_int_compare_exchange_strong(&err_flag_atomic, 0, 1, mcommon_memory_order_seq_cst)) { MONGOC_WARNING( "Invalid length '%s' read from environment variable %s. Ignoring it.", max_length_str, variable); } } bson_free(max_length_str); return result; } bool mongoc_structured_log_opts_set_max_levels_from_env(mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(opts); bool all_ok = true; mongoc_structured_log_level_t level; // Errors are not fatal by default; always reported by return value, and reported the first time only via a log // warning. static int err_flag_all_atomic; static int err_flag_per_component_atomic[STRUCTURED_LOG_COMPONENT_TABLE_SIZE]; if (_mongoc_structured_log_get_log_level_from_env("MONGODB_LOG_ALL", &level, &err_flag_all_atomic)) { BSON_ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, level)); } else { all_ok = false; } mlib_foreach_urange (component, STRUCTURED_LOG_COMPONENT_TABLE_SIZE) { if (_mongoc_structured_log_get_log_level_from_env( gStructuredLogComponentEnvVars[component], &level, &err_flag_per_component_atomic[component])) { BSON_ASSERT(mongoc_structured_log_opts_set_max_level_for_component( opts, (mongoc_structured_log_component_t)component, level)); } else { all_ok = false; } } return all_ok; } static void _mongoc_structured_log_default_handler_open_stream(mongoc_structured_log_default_handler_shared_t *shared, const char *path) { // shared->mutex must already be locked if (!path || !strcasecmp(path, "stderr")) { // Default or explicit stderr shared->stream = stderr; shared->stream_fclose_on_destroy = false; } else if (!strcasecmp(path, "stdout")) { shared->stream = stdout; shared->stream_fclose_on_destroy = false; } else { FILE *file = fopen(path, "a"); if (file) { shared->stream = file; shared->stream_fclose_on_destroy = true; } else { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; const char *errmsg = bson_strerror_r(errno, errmsg_buf, sizeof errmsg_buf); MONGOC_WARNING("Failed to open log file '%s' with error: '%s'. Logging to stderr instead.", path, errmsg); shared->stream = stderr; shared->stream_fclose_on_destroy = false; } } } static FILE * _mongoc_structured_log_default_handler_get_stream(mongoc_structured_log_instance_t *instance) { // instance->default_handler_shared->mutex must already be locked { FILE *log_stream = instance->default_handler_shared.stream; if (log_stream) { return log_stream; } } _mongoc_structured_log_default_handler_open_stream(&instance->default_handler_shared, instance->opts.default_handler_path); { FILE *log_stream = instance->default_handler_shared.stream; BSON_ASSERT(log_stream); return log_stream; } } static void _mongoc_structured_log_default_handler(const mongoc_structured_log_entry_t *entry, void *user_data) { BSON_UNUSED(user_data); mongoc_structured_log_instance_t *instance = entry->envelope.instance; // We can serialize the message before taking the default_handler_shared mutex bson_t *bson_message = mongoc_structured_log_entry_message_as_bson(entry); char *json_message = bson_as_relaxed_extended_json(bson_message, NULL); bson_destroy(bson_message); const char *level_name = mongoc_structured_log_get_level_name(mongoc_structured_log_entry_get_level(entry)); const char *component_name = mongoc_structured_log_get_component_name(mongoc_structured_log_entry_get_component(entry)); bson_mutex_lock(&instance->default_handler_shared.mutex); fprintf(_mongoc_structured_log_default_handler_get_stream(instance), "MONGODB_LOG %s %s %s\n", level_name, component_name, json_message); bson_mutex_unlock(&instance->default_handler_shared.mutex); bson_free(json_message); } static void _mongoc_structured_log_no_handler(const mongoc_structured_log_entry_t *entry, void *user_data) { // Stub, for when logging is disabled. Only possible to call at MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY. BSON_UNUSED(entry); BSON_UNUSED(user_data); } mongoc_structured_log_opts_t * mongoc_structured_log_opts_new(void) { mongoc_structured_log_opts_t *opts = (mongoc_structured_log_opts_t *)bson_malloc0(sizeof *opts); /* Capture default state from the environment now. * Note that error return values from mongoc_structured_log_opts_set_* must be ignored here. * If environment variables can't be parsed, warnings will be logged once but we must, by specification, * continue to provide structured logging using whatever valid or default settings remain. */ opts->default_handler_path = _mongoc_getenv("MONGODB_LOG_PATH"); opts->max_document_length = MONGOC_STRUCTURED_LOG_DEFAULT_MAX_DOCUMENT_LENGTH; (void)mongoc_structured_log_opts_set_max_document_length_from_env(opts); (void)mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_DEFAULT_LEVEL); (void)mongoc_structured_log_opts_set_max_levels_from_env(opts); // Set default handler. Its shared state is allocated later, as part of instance_t. mongoc_structured_log_opts_set_handler(opts, _mongoc_structured_log_default_handler, NULL); return opts; } void mongoc_structured_log_opts_destroy(mongoc_structured_log_opts_t *opts) { if (opts) { bson_free(opts->default_handler_path); bson_free(opts); } } mongoc_structured_log_instance_t * mongoc_structured_log_instance_new(const mongoc_structured_log_opts_t *opts) { /* Creating the instance captures an immutable copy of the options. * We also make a transformation that simplifies the critical path in * _mongoc_structured_log_should_log so that it only needs to check the * per-component table: In the instance, NULL handlers are no longer * allowed. If structured logging is disabled, the per-component table * will be set to the lowest possible levels and a stub handler function * is set in case of 'emergency' logs. * * 'opts' is optional; if NULL, structured logging is disabled. * (To request default options, you still need to use * mongoc_structured_log_opts_new) */ mongoc_structured_log_instance_t *instance = (mongoc_structured_log_instance_t *)bson_malloc0(sizeof *instance); bson_mutex_init(&instance->default_handler_shared.mutex); if (opts) { instance->opts.default_handler_path = bson_strdup(opts->default_handler_path); instance->opts.max_document_length = opts->max_document_length; instance->opts.handler_func = opts->handler_func; instance->opts.handler_user_data = opts->handler_user_data; } if (instance->opts.handler_func) { if (opts) { memcpy(instance->opts.max_level_per_component, opts->max_level_per_component, sizeof instance->opts.max_level_per_component); } } else { // No handler; leave the max_level_per_component table zero'ed, and add a stub handler for emergency level only. instance->opts.handler_func = _mongoc_structured_log_no_handler; } return instance; } void mongoc_structured_log_instance_destroy(mongoc_structured_log_instance_t *instance) { if (instance) { bson_mutex_destroy(&instance->default_handler_shared.mutex); bson_free(instance->opts.default_handler_path); if (instance->default_handler_shared.stream_fclose_on_destroy) { fclose(instance->default_handler_shared.stream); } bson_free(instance); } } static mcommon_string_t * _mongoc_structured_log_append_json_truncation_marker(mcommon_string_append_t *append) { if (!mcommon_string_status_from_append(append)) { mcommon_string_append_t marker_append; mcommon_string_set_append(mcommon_string_from_append(append), &marker_append); mcommon_string_append(&marker_append, "..."); } // Guaranteed due to choice of MONGOC_STRUCTURED_LOG_MAXIMUM_MAX_DOCUMENT_LENGTH BSON_ASSERT(mcommon_strlen_from_append(append) <= (uint32_t)BSON_MAX_SIZE); return mcommon_string_from_append(append); } // Generic bson-to-json for documents that appear within a structured log message as truncated JSON static mcommon_string_t * _mongoc_structured_log_document_as_truncated_json(const bson_t *document, const mongoc_structured_log_opts_t *opts) { // Use the bson_t document length as an initial buffer capacity guess mcommon_string_append_t append; mcommon_string_set_append_with_limit( mcommon_string_new_with_capacity("", 0, document->len), &append, opts->max_document_length); if (mcommon_json_append_bson_document(&append, document, BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION)) { return _mongoc_structured_log_append_json_truncation_marker(&append); } else { mcommon_string_from_append_destroy(&append); return NULL; } } /** * @brief Specialized bson-to-json conversion for mongoc_cmd_t * @returns A new allocated mcommon_string_t, limited to the maximum document length from 'opts' plus the space for a * possible truncation marker. Returns NULL if an invalid BSON document is encountered. This is equivalent to * _mongoc_cmd_append_payload_as_array() combined with _mongoc_structured_log_document_as_truncated_json(), but it * avoids ever assembling a BSON representation of the complete logged JSON document. Each payload is serialized * separately using the mcommon_json_* functions. If we reach the maximum document length, unused portions of the input * command will not be read. */ static mcommon_string_t * _mongoc_structured_log_command_with_payloads_as_truncated_json(const mongoc_cmd_t *cmd, const mongoc_structured_log_opts_t *opts) { BSON_ASSERT_PARAM(cmd); BSON_ASSERT(!bson_empty0(cmd->command)); BSON_ASSERT(cmd->payloads_count <= MONGOC_CMD_PAYLOADS_COUNT_MAX); // Use the bson length of the command itself as an initial buffer capacity guess. bool invalid_document = false; mcommon_string_append_t append; mcommon_string_set_append_with_limit( mcommon_string_new_with_capacity("", 0, cmd->command->len), &append, opts->max_document_length); if (!mcommon_string_append(&append, "{ ")) { goto done; } if (!mcommon_json_append_bson_values(&append, cmd->command, BSON_JSON_MODE_RELAXED, true, BSON_MAX_RECURSION - 1u)) { invalid_document = true; goto done; } for (size_t i = 0; i < cmd->payloads_count; i++) { const char *field_name = cmd->payloads[i].identifier; BSON_ASSERT(field_name); // Each payload is an appended key containing a non-empty sequence of documents if (!mcommon_json_append_separator(&append) || !mcommon_json_append_key(&append, field_name, strlen(field_name)) || !mcommon_string_append(&append, "[ ")) { goto done; } const uint8_t *doc_begin = cmd->payloads[i].documents; BSON_ASSERT(doc_begin); const uint8_t *doc_end = doc_begin + cmd->payloads[i].size; BSON_ASSERT(doc_begin != doc_end); const uint8_t *doc_ptr = doc_begin; while (doc_ptr + sizeof(int32_t) <= doc_end) { const int32_t doc_len = mlib_read_i32le(doc_ptr); bson_t doc; if (doc_len < 5 || (size_t)doc_len > (size_t)(doc_end - doc_ptr) || !bson_init_static(&doc, doc_ptr, (size_t)doc_len)) { invalid_document = true; goto done; } if (doc_ptr != doc_begin) { mcommon_json_append_separator(&append); } if (!mcommon_json_append_bson_document(&append, &doc, BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION - 2u)) { invalid_document = true; goto done; } doc_ptr += doc_len; } if (doc_ptr != doc_end) { invalid_document = true; goto done; } if (!mcommon_string_append(&append, " ]")) { goto done; } } mcommon_string_append(&append, " }"); done: if (invalid_document) { mcommon_string_from_append_destroy(&append); return NULL; } else { return _mongoc_structured_log_append_json_truncation_marker(&append); } } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; if (key_or_null) { bson_append_utf8(bson, key_or_null, -1, stage->arg2.utf8, -1); } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8_n_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); BSON_ASSERT(stage[1].func == _mongoc_structured_log_append_utf8_n_stage1); const char *key_or_null = stage[0].arg1.utf8; int32_t key_len = stage[0].arg2.int32; const char *value = stage[1].arg1.utf8; int32_t value_len = stage[1].arg2.int32; if (key_or_null) { bson_append_utf8(bson, key_or_null, key_len, value, value_len); } return stage + 2; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_utf8_n_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { // Never called, marks the second stage in a two-stage utf8_n BSON_UNUSED(bson); BSON_UNUSED(stage); BSON_UNUSED(opts); BSON_ASSERT(false); return NULL; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_int32(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; if (key_or_null) { bson_append_int32(bson, key_or_null, -1, stage->arg2.int32); } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_int64(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; if (key_or_null) { bson_append_int64(bson, key_or_null, -1, stage->arg2.int64); } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_double(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; if (key_or_null) { bson_append_double(bson, key_or_null, -1, stage->arg2.double_value); } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_boolean(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; if (key_or_null) { bson_append_bool(bson, key_or_null, -1, stage->arg2.boolean); } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_oid(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; const bson_oid_t *oid_or_null = stage->arg2.oid; if (key_or_null) { if (oid_or_null) { bson_append_oid(bson, key_or_null, -1, oid_or_null); } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_oid_as_hex(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; const bson_oid_t *oid_or_null = stage->arg2.oid; if (key_or_null) { if (oid_or_null) { char str[25]; bson_oid_to_string(oid_or_null, str); bson_append_utf8(bson, key_or_null, -1, str, 24); } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_bson_as_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const char *key_or_null = stage->arg1.utf8; const bson_t *bson_or_null = stage->arg2.bson; if (key_or_null) { if (bson_or_null) { mcommon_string_t *json = _mongoc_structured_log_document_as_truncated_json(bson_or_null, opts); if (json) { BSON_ASSERT(json->len <= (uint32_t)INT_MAX); bson_append_utf8(bson, key_or_null, -1, json->str, (int)json->len); mcommon_string_destroy(json); } // If invalid BSON was found in the input, the key is not logged. } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const mongoc_cmd_t *cmd = stage->arg1.cmd; const mongoc_structured_log_cmd_content_flags_t flags = stage->arg2.cmd_flags; BSON_ASSERT(cmd); if (flags & MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_DATABASE_NAME) { BSON_APPEND_UTF8(bson, "databaseName", cmd->db_name); } if (flags & MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_COMMAND_NAME) { BSON_APPEND_UTF8(bson, "commandName", cmd->command_name); } if (flags & MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_OPERATION_ID) { BSON_APPEND_INT64(bson, "operationId", cmd->operation_id); } if (flags & MONGOC_STRUCTURED_LOG_CMD_CONTENT_FLAG_COMMAND) { if (mongoc_apm_is_sensitive_command_message(cmd->command_name, cmd->command)) { BSON_APPEND_UTF8(bson, "command", "{}"); } else { mcommon_string_t *json = _mongoc_structured_log_command_with_payloads_as_truncated_json(cmd, opts); if (json) { const char *key = "command"; BSON_ASSERT(json->len <= (uint32_t)INT_MAX); bson_append_utf8(bson, key, strlen(key), json->str, (int)json->len); mcommon_string_destroy(json); } // If invalid BSON was found in the input, the key is not logged. } } return stage + 1; } static void _mongoc_structured_log_append_redacted_cmd_reply(bson_t *bson, bool is_sensitive, const bson_t *reply, const mongoc_structured_log_opts_t *opts) { if (is_sensitive) { BSON_APPEND_UTF8(bson, "reply", "{}"); } else { mcommon_string_t *json = _mongoc_structured_log_document_as_truncated_json(reply, opts); if (json) { const char *key = "reply"; BSON_ASSERT(json->len <= (uint32_t)INT_MAX); bson_append_utf8(bson, key, strlen(key), json->str, (int)json->len); mcommon_string_destroy(json); } // If invalid BSON was found in the input, the key is not logged. } } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_reply(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const mongoc_cmd_t *cmd = stage->arg1.cmd; const bson_t *reply = stage->arg2.bson; BSON_ASSERT(cmd); BSON_ASSERT(reply); bool is_sensitive = mongoc_apm_is_sensitive_command_message(cmd->command_name, cmd->command) || mongoc_apm_is_sensitive_command_message(cmd->command_name, reply); _mongoc_structured_log_append_redacted_cmd_reply(bson, is_sensitive, reply, opts); return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_reply(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const char *cmd_name = stage->arg1.utf8; const bson_t *reply = stage->arg2.bson; BSON_ASSERT(cmd_name); BSON_ASSERT(reply); bool is_sensitive = mongoc_apm_is_sensitive_command_message(cmd_name, reply); _mongoc_structured_log_append_redacted_cmd_reply(bson, is_sensitive, reply, opts); return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_error(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; const bson_error_t *error_or_null = stage->arg2.error; if (key_or_null) { if (error_or_null) { bson_t child; if (BSON_APPEND_DOCUMENT_BEGIN(bson, key_or_null, &child)) { mongoc_error_append_contents_to_bson(error_or_null, &child, MONGOC_ERROR_CONTENT_FLAG_MESSAGE | MONGOC_ERROR_CONTENT_FLAG_CODE | MONGOC_ERROR_CONTENT_FLAG_DOMAIN); bson_append_document_end(bson, &child); } } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } static void _mongoc_structured_log_append_redacted_cmd_failure(bson_t *bson, bool is_sensitive, const bson_t *reply, const bson_error_t *error) { bool is_server_side = error->domain == MONGOC_ERROR_SERVER || error->domain == MONGOC_ERROR_WRITE_CONCERN_ERROR; if (is_server_side) { if (is_sensitive) { // Redacted server-side message, must be a document with at most 'code', 'codeName', 'errorLabels' bson_t failure; bson_iter_t iter; if (BSON_APPEND_DOCUMENT_BEGIN(bson, "failure", &failure)) { bson_iter_init(&iter, reply); while (bson_iter_next(&iter)) { const char *key = bson_iter_key(&iter); if (!strcmp(key, "code") || !strcmp(key, "codeName") || !strcmp(key, "errorLabels")) { bson_append_iter(&failure, key, bson_iter_key_len(&iter), &iter); } } bson_append_document_end(bson, &failure); } } else { // Non-redacted server side message, pass through BSON_APPEND_DOCUMENT(bson, "failure", reply); } } else { /* Client-side errors converted directly from bson_error_t, never redacted. * In addition to the bson_error_t fields, client side errors may include errorLabels: * https://mongoc.org/libmongoc/current/errors.html#error-labels */ bson_t failure; if (BSON_APPEND_DOCUMENT_BEGIN(bson, "failure", &failure)) { mongoc_error_append_contents_to_bson(error, &failure, MONGOC_ERROR_CONTENT_FLAG_MESSAGE | MONGOC_ERROR_CONTENT_FLAG_CODE | MONGOC_ERROR_CONTENT_FLAG_DOMAIN); bson_iter_t iter; if (bson_iter_init_find(&iter, reply, "errorLabels")) { bson_append_iter(&failure, bson_iter_key(&iter), bson_iter_key_len(&iter), &iter); } bson_append_document_end(bson, &failure); } } } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_failure_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); BSON_ASSERT(stage[1].func == _mongoc_structured_log_append_cmd_failure_stage1); const mongoc_cmd_t *cmd = stage[0].arg1.cmd; const bson_t *reply = stage[0].arg2.bson; const bson_error_t *error = stage[1].arg1.error; BSON_ASSERT(cmd); BSON_ASSERT(reply); BSON_ASSERT(error); bool is_sensitive = mongoc_apm_is_sensitive_command_message(cmd->command_name, cmd->command) || mongoc_apm_is_sensitive_command_message(cmd->command_name, reply); _mongoc_structured_log_append_redacted_cmd_failure(bson, is_sensitive, reply, error); return stage + 2; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_failure_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { // Never called, marks the second stage in a two-stage cmd_failure BSON_UNUSED(bson); BSON_UNUSED(stage); BSON_UNUSED(opts); BSON_ASSERT(false); return NULL; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_failure_stage0(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); BSON_ASSERT(stage[1].func == _mongoc_structured_log_append_cmd_name_failure_stage1); const char *cmd_name = stage[0].arg1.utf8; const bson_t *reply = stage[0].arg2.bson; const bson_error_t *error = stage[1].arg1.error; BSON_ASSERT(cmd_name); BSON_ASSERT(reply); BSON_ASSERT(error); bool is_sensitive = mongoc_apm_is_sensitive_command_message(cmd_name, reply); _mongoc_structured_log_append_redacted_cmd_failure(bson, is_sensitive, reply, error); return stage + 2; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_cmd_name_failure_stage1(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { // Never called, marks the second stage in a two-stage cmd_name_failure BSON_UNUSED(bson); BSON_UNUSED(stage); BSON_UNUSED(opts); BSON_ASSERT(false); return NULL; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_server_description(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const mongoc_server_description_t *sd = stage->arg1.server_description; const mongoc_server_description_content_flags_t flags = stage->arg2.server_description_flags; mongoc_server_description_append_contents_to_bson(sd, bson, flags); return stage + 1; } static mcommon_string_t * _mongoc_structured_log_topology_description_as_json(const mongoc_topology_description_t *td, const mongoc_structured_log_opts_t *opts) { const mongoc_topology_description_content_flags_t td_flags = MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_TYPE | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SET_NAME | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_ELECTION_ID | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_SET_VERSION | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SERVERS | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_STALE | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBLE | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBILITY_ERROR | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_LOGICAL_SESSION_TIMEOUT_MINUTES; const mongoc_server_description_content_flags_t server_flags = MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_TYPE | MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_ADDRESS; bson_t doc = BSON_INITIALIZER; mongoc_topology_description_append_contents_to_bson(td, &doc, td_flags, server_flags); mcommon_string_t *result = _mongoc_structured_log_document_as_truncated_json(&doc, opts); bson_destroy(&doc); return result; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_topology_as_description_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const char *key_or_null = stage->arg1.utf8; const mongoc_topology_t *topology_or_null = stage->arg2.topology; if (key_or_null) { if (topology_or_null) { mc_shared_tpld td = mc_tpld_take_ref(topology_or_null); mcommon_string_t *json = _mongoc_structured_log_topology_description_as_json(td.ptr, opts); if (json) { BSON_ASSERT(json->len <= (uint32_t)INT_MAX); bson_append_utf8(bson, key_or_null, -1, json->str, (int)json->len); mcommon_string_destroy(json); } mc_tpld_drop_ref(&td); } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_topology_description_as_json(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { const char *key_or_null = stage->arg1.utf8; const mongoc_topology_description_t *topology_description_or_null = stage->arg2.topology_description; if (key_or_null) { if (topology_description_or_null) { mcommon_string_t *json = _mongoc_structured_log_topology_description_as_json(topology_description_or_null, opts); if (json) { BSON_ASSERT(json->len <= (uint32_t)INT_MAX); bson_append_utf8(bson, key_or_null, -1, json->str, (int)json->len); mcommon_string_destroy(json); } } else { bson_append_null(bson, key_or_null, -1); } } return stage + 1; } const mongoc_structured_log_builder_stage_t * _mongoc_structured_log_append_read_prefs(bson_t *bson, const mongoc_structured_log_builder_stage_t *stage, const mongoc_structured_log_opts_t *opts) { BSON_UNUSED(opts); const char *key_or_null = stage->arg1.utf8; const mongoc_read_prefs_t *read_prefs = stage->arg2.read_prefs; if (key_or_null) { bson_t child; if (BSON_APPEND_DOCUMENT_BEGIN(bson, key_or_null, &child)) { mongoc_read_prefs_append_contents_to_bson( read_prefs, &child, MONGOC_READ_PREFS_CONTENT_FLAG_MODE | MONGOC_READ_PREFS_CONTENT_FLAG_TAGS | MONGOC_READ_PREFS_CONTENT_FLAG_MAX_STALENESS_SECONDS | MONGOC_READ_PREFS_CONTENT_FLAG_HEDGE); bson_append_document_end(bson, &child); } } return stage + 1; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-structured-log.h000066400000000000000000000104711511661753600256070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_STRUCTURED_LOG_H #define MONGOC_STRUCTURED_LOG_H #include #include BSON_BEGIN_DECLS typedef enum { MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY = 0, MONGOC_STRUCTURED_LOG_LEVEL_ALERT = 1, MONGOC_STRUCTURED_LOG_LEVEL_CRITICAL = 2, MONGOC_STRUCTURED_LOG_LEVEL_ERROR = 3, MONGOC_STRUCTURED_LOG_LEVEL_WARNING = 4, MONGOC_STRUCTURED_LOG_LEVEL_NOTICE = 5, MONGOC_STRUCTURED_LOG_LEVEL_INFO = 6, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG = 7, MONGOC_STRUCTURED_LOG_LEVEL_TRACE = 8, } mongoc_structured_log_level_t; typedef enum { MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND = 0, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY = 1, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION = 2, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION = 3, } mongoc_structured_log_component_t; typedef struct mongoc_structured_log_entry_t mongoc_structured_log_entry_t; typedef struct mongoc_structured_log_opts_t mongoc_structured_log_opts_t; typedef void(BSON_CALL *mongoc_structured_log_func_t)(const mongoc_structured_log_entry_t *entry, void *user_data); MONGOC_EXPORT(mongoc_structured_log_opts_t *) mongoc_structured_log_opts_new(void); MONGOC_EXPORT(void) mongoc_structured_log_opts_destroy(mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(void) mongoc_structured_log_opts_set_handler(mongoc_structured_log_opts_t *opts, mongoc_structured_log_func_t log_func, void *user_data); MONGOC_EXPORT(bool) mongoc_structured_log_opts_set_max_level_for_component(mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component, mongoc_structured_log_level_t level); MONGOC_EXPORT(bool) mongoc_structured_log_opts_set_max_level_for_all_components(mongoc_structured_log_opts_t *opts, mongoc_structured_log_level_t level); MONGOC_EXPORT(bool) mongoc_structured_log_opts_set_max_levels_from_env(mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(mongoc_structured_log_level_t) mongoc_structured_log_opts_get_max_level_for_component(const mongoc_structured_log_opts_t *opts, mongoc_structured_log_component_t component); MONGOC_EXPORT(size_t) mongoc_structured_log_opts_get_max_document_length(const mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(bool) mongoc_structured_log_opts_set_max_document_length_from_env(mongoc_structured_log_opts_t *opts); MONGOC_EXPORT(bool) mongoc_structured_log_opts_set_max_document_length(mongoc_structured_log_opts_t *opts, size_t max_document_length); MONGOC_EXPORT(bson_t *) mongoc_structured_log_entry_message_as_bson(const mongoc_structured_log_entry_t *entry); MONGOC_EXPORT(mongoc_structured_log_level_t) mongoc_structured_log_entry_get_level(const mongoc_structured_log_entry_t *entry); MONGOC_EXPORT(mongoc_structured_log_component_t) mongoc_structured_log_entry_get_component(const mongoc_structured_log_entry_t *entry); MONGOC_EXPORT(const char *) mongoc_structured_log_entry_get_message_string(const mongoc_structured_log_entry_t *entry); MONGOC_EXPORT(const char *) mongoc_structured_log_get_level_name(mongoc_structured_log_level_t level); MONGOC_EXPORT(bool) mongoc_structured_log_get_named_level(const char *name, mongoc_structured_log_level_t *out); MONGOC_EXPORT(const char *) mongoc_structured_log_get_component_name(mongoc_structured_log_component_t component); MONGOC_EXPORT(bool) mongoc_structured_log_get_named_component(const char *name, mongoc_structured_log_component_t *out); BSON_END_DECLS #endif /* MONGOC_STRUCTURED_LOG_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-thread-private.h000066400000000000000000000054431511661753600255460ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_THREAD_PRIVATE_H #define MONGOC_THREAD_PRIVATE_H #include #include #include #include #if defined(BSON_OS_UNIX) #define mongoc_cond_t pthread_cond_t #define mongoc_cond_broadcast pthread_cond_broadcast #define mongoc_cond_init(_n) pthread_cond_init((_n), NULL) #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) #define mongoc_cond_wait(cond, mutex) pthread_cond_wait(cond, &(mutex)->wrapped_mutex); #else #define mongoc_cond_wait pthread_cond_wait #endif #define mongoc_cond_signal pthread_cond_signal static BSON_INLINE int mongoc_cond_timedwait(pthread_cond_t *cond, bson_mutex_t *mutex, int64_t timeout_msec) { struct timespec to; struct timeval tv; int64_t msec; bson_gettimeofday(&tv); msec = ((int64_t)tv.tv_sec * 1000) + (tv.tv_usec / 1000) + timeout_msec; to.tv_sec = msec / 1000; to.tv_nsec = (msec % 1000) * 1000 * 1000; #if defined(MONGOC_ENABLE_DEBUG_ASSERTIONS) && defined(BSON_OS_UNIX) return pthread_cond_timedwait(cond, &mutex->wrapped_mutex, &to); #else return pthread_cond_timedwait(cond, mutex, &to); #endif } static BSON_INLINE bool mongo_cond_ret_is_timedout(int ret) { return ret == ETIMEDOUT; } #define mongoc_cond_destroy pthread_cond_destroy #else #define mongoc_cond_t CONDITION_VARIABLE #define mongoc_cond_init InitializeConditionVariable #define mongoc_cond_wait(_c, _m) mongoc_cond_timedwait((_c), (_m), INFINITE) static BSON_INLINE int mongoc_cond_timedwait(mongoc_cond_t *cond, bson_mutex_t *mutex, int64_t timeout_msec) { int r; if (SleepConditionVariableCS(cond, mutex, (DWORD)timeout_msec)) { return 0; } else { r = GetLastError(); if (r == WAIT_TIMEOUT || r == ERROR_TIMEOUT) { return WSAETIMEDOUT; } else { return EINVAL; } } } static BSON_INLINE bool mongo_cond_ret_is_timedout(int ret) { return ret == WSAETIMEDOUT; } #define mongoc_cond_signal WakeConditionVariable #define mongoc_cond_broadcast WakeAllConditionVariable static BSON_INLINE int mongoc_cond_destroy(mongoc_cond_t *_ignored) { (void)_ignored; return 0; } #endif #endif /* MONGOC_THREAD_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-timeout-private.h000066400000000000000000000024351511661753600257630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TIMEOUT_PRIVATE_H #define MONGOC_TIMEOUT_PRIVATE_H #include #include typedef struct _mongoc_timeout_t mongoc_timeout_t; mongoc_timeout_t * mongoc_timeout_new(void); mongoc_timeout_t * mongoc_timeout_new_timeout_int64(int64_t timeout_ms); void mongoc_timeout_destroy(mongoc_timeout_t *timeout); mongoc_timeout_t * mongoc_timeout_copy(const mongoc_timeout_t *timeout); int64_t mongoc_timeout_get_timeout_ms(const mongoc_timeout_t *timeout); bool mongoc_timeout_set_timeout_ms(mongoc_timeout_t *timeout, int64_t timeout_ms); bool mongoc_timeout_is_set(const mongoc_timeout_t *timeout); #endif /* MONGOC_TIMEOUT_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-timeout.c000066400000000000000000000042221511661753600243020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include struct _mongoc_timeout_t { bool is_set; int64_t timeout_ms; }; int64_t mongoc_timeout_get_timeout_ms(const mongoc_timeout_t *timeout) { BSON_ASSERT(timeout); BSON_ASSERT(timeout->is_set); return timeout->timeout_ms; } bool _mongoc_timeout_set_timeout_ms(mongoc_timeout_t *timeout, int64_t timeout_ms) { BSON_ASSERT(timeout); if (timeout_ms < 0) { MONGOC_ERROR("timeout must not be negative"); return false; } timeout->timeout_ms = timeout_ms; timeout->is_set = true; return true; } bool mongoc_timeout_set_timeout_ms(mongoc_timeout_t *timeout, int64_t timeout_ms) { return _mongoc_timeout_set_timeout_ms(timeout, timeout_ms); } mongoc_timeout_t * mongoc_timeout_new(void) { return (mongoc_timeout_t *)bson_malloc0(sizeof(mongoc_timeout_t)); } mongoc_timeout_t * mongoc_timeout_new_timeout_int64(int64_t timeout_ms) { mongoc_timeout_t *timeout = mongoc_timeout_new(); if (_mongoc_timeout_set_timeout_ms(timeout, timeout_ms)) return timeout; mongoc_timeout_destroy(timeout); return NULL; } mongoc_timeout_t * mongoc_timeout_copy(const mongoc_timeout_t *timeout) { mongoc_timeout_t *copy = NULL; BSON_ASSERT(timeout); copy = mongoc_timeout_new(); copy->timeout_ms = timeout->timeout_ms; copy->is_set = timeout->is_set; return copy; } void mongoc_timeout_destroy(mongoc_timeout_t *timeout) { bson_free(timeout); } bool mongoc_timeout_is_set(const mongoc_timeout_t *timeout) { return timeout && timeout->is_set; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-background-monitoring-private.h000066400000000000000000000026341511661753600324520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H #define MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H #include #include /* Methods of mongoc_topology_t for managing background monitoring. */ void _mongoc_topology_background_monitoring_start(mongoc_topology_t *topology); void _mongoc_topology_background_monitoring_reconcile(mongoc_topology_t *topology, mongoc_topology_description_t *td); void _mongoc_topology_background_monitoring_request_scan(mongoc_topology_t *topology); void _mongoc_topology_background_monitoring_stop(mongoc_topology_t *topology); void _mongoc_topology_background_monitoring_cancel_check(mongoc_topology_t *topology, uint32_t server_id); #endif /* MONGOC_TOPOLOGY_BACKGROUND_MONITORING_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-background-monitoring.c000066400000000000000000000325061511661753600307760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "monitor" static BSON_THREAD_FUN(srv_polling_run, topology_void) { mongoc_topology_t *topology; topology = topology_void; while (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) == MONGOC_TOPOLOGY_SCANNER_BG_RUNNING) { int64_t now_ms; int64_t scan_due_ms; int64_t sleep_duration_ms; /* This will check if a scan is due. */ if (!mongoc_topology_should_rescan_srv(topology)) { TRACE("%s\n", "topology ineligible for SRV polling, stopping"); break; } mongoc_topology_rescan_srv(topology); /* Unlock and sleep until next scan is due, or until shutdown signalled. */ now_ms = bson_get_monotonic_time() / 1000; scan_due_ms = topology->srv_polling_last_scan_ms + _mongoc_topology_get_srv_polling_rescan_interval_ms(topology); sleep_duration_ms = scan_due_ms - now_ms; if (sleep_duration_ms > 0) { TRACE("srv polling thread sleeping for %" PRId64 "ms", sleep_duration_ms); } /* Check for shutdown again here. mongoc_topology_rescan_srv unlocks the * topology srv_polling_mtx for the scan. The topology may have shut * down in that time. */ bson_mutex_lock(&topology->srv_polling_mtx); if (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) != MONGOC_TOPOLOGY_SCANNER_BG_RUNNING) { bson_mutex_unlock(&topology->srv_polling_mtx); break; } /* If shutting down, stop. */ mongoc_cond_timedwait(&topology->srv_polling_cond, &topology->srv_polling_mtx, sleep_duration_ms); bson_mutex_unlock(&topology->srv_polling_mtx); } BSON_THREAD_RETURN; } /* Create a server monitor if necessary. * * Called by monitor threads and application threads when reconciling the * topology description. */ static void _background_monitor_reconcile_server_monitor(mongoc_topology_t *topology, mongoc_topology_description_t *td, mongoc_server_description_t *sd) { mongoc_set_t *server_monitors = topology->server_monitors; mongoc_server_monitor_t *server_monitor = mongoc_set_get(server_monitors, sd->id); if (!server_monitor) { /* Add a new server monitor. */ server_monitor = mongoc_server_monitor_new(topology, td, sd); mongoc_server_monitor_run(server_monitor); mongoc_set_add(server_monitors, sd->id, server_monitor); } /* Check if an RTT monitor is needed. */ if (!bson_empty(&sd->topology_version)) { mongoc_set_t *rtt_monitors; mongoc_server_monitor_t *rtt_monitor; rtt_monitors = topology->rtt_monitors; rtt_monitor = mongoc_set_get(rtt_monitors, sd->id); if (!rtt_monitor) { rtt_monitor = mongoc_server_monitor_new(topology, td, sd); mongoc_server_monitor_run_as_rtt(rtt_monitor); mongoc_set_add(rtt_monitors, sd->id, rtt_monitor); } } return; } /* Start background monitoring. * * Called by an application thread popping a client from a pool. Safe to * call repeatedly. */ void _mongoc_topology_background_monitoring_start(mongoc_topology_t *topology) { mc_tpld_modification tdmod; int prev_state; BSON_ASSERT(!topology->single_threaded); if (!topology->valid) { return; } prev_state = mcommon_atomic_int_compare_exchange_strong(&topology->scanner_state, MONGOC_TOPOLOGY_SCANNER_OFF, MONGOC_TOPOLOGY_SCANNER_BG_RUNNING, mcommon_memory_order_relaxed); if (prev_state != MONGOC_TOPOLOGY_SCANNER_OFF) { /* The topology scanner is already running, or another thread is starting * it up now. */ return; } TRACE("%s", "background monitoring starting"); tdmod = mc_tpld_modify_begin(topology); _mongoc_handshake_freeze(); _mongoc_topology_description_monitor_opening(tdmod.new_td, &topology->log_and_monitor); if (tdmod.new_td->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* Do not proceed to start monitoring threads. */ TRACE("%s", "disabling monitoring for load balanced topology"); } else { /* Reconcile to create the first server monitors. */ _mongoc_topology_background_monitoring_reconcile(topology, tdmod.new_td); /* Start SRV polling thread. */ if (mongoc_topology_should_rescan_srv(topology)) { int ret = mcommon_thread_create(&topology->srv_polling_thread, srv_polling_run, topology); if (ret == 0) { topology->is_srv_polling = true; } else { char errmsg_buf[BSON_ERROR_BUFFER_SIZE]; char *errmsg = bson_strerror_r(ret, errmsg_buf, sizeof errmsg_buf); MONGOC_ERROR("Failed to start SRV polling thread. SRV records " "will not be polled. Error: %s", errmsg); } } } mc_tpld_modify_commit(tdmod); } /* Remove server monitors that are no longer in the set of server descriptions. * * Called by monitor threads and application threads when reconciling the * topology description. */ static void _remove_orphaned_server_monitors(mongoc_set_t *server_monitors, mongoc_set_t *server_descriptions) { uint32_t *server_monitor_ids_to_remove; uint32_t n_server_monitor_ids_to_remove = 0; /* Signal shutdown to server monitors no longer in the topology description. */ server_monitor_ids_to_remove = BSON_ARRAY_ALLOC0(server_monitors->items_len, uint32_t); for (size_t i = 0u; i < server_monitors->items_len; i++) { mongoc_server_monitor_t *server_monitor; uint32_t id; server_monitor = mongoc_set_get_item_and_id(server_monitors, i, &id); if (!mongoc_set_get(server_descriptions, id)) { if (mongoc_server_monitor_request_shutdown(server_monitor)) { mongoc_server_monitor_wait_for_shutdown(server_monitor); mongoc_server_monitor_destroy(server_monitor); server_monitor_ids_to_remove[n_server_monitor_ids_to_remove] = id; n_server_monitor_ids_to_remove++; } } } /* Remove freed server monitors that have completed shutdown. */ for (uint32_t i = 0u; i < n_server_monitor_ids_to_remove; i++) { mongoc_set_rm(server_monitors, server_monitor_ids_to_remove[i]); } bson_free(server_monitor_ids_to_remove); } /* Reconcile the topology description with the set of server monitors. * * Called when the topology description is updated (via handshake, monitoring, * or invalidation). May be called by server monitor thread or an application * thread. * Locks server monitor mutexes. May join / remove server monitors that have * completed shutdown. */ void _mongoc_topology_background_monitoring_reconcile(mongoc_topology_t *topology, mongoc_topology_description_t *td) { mongoc_set_t *server_descriptions = mc_tpld_servers(td); BSON_ASSERT(!topology->single_threaded); if (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) != MONGOC_TOPOLOGY_SCANNER_BG_RUNNING) { return; } /* Add newly discovered server monitors, and update existing ones. */ for (size_t i = 0u; i < server_descriptions->items_len; i++) { mongoc_server_description_t *sd; sd = mongoc_set_get_item(server_descriptions, i); _background_monitor_reconcile_server_monitor(topology, td, sd); } _remove_orphaned_server_monitors(topology->server_monitors, server_descriptions); _remove_orphaned_server_monitors(topology->rtt_monitors, server_descriptions); } /* Request all server monitors to scan. * * Called from application threads (during server selection or "not primary" * errors). Locks server monitor mutexes to deliver scan_requested. */ void _mongoc_topology_background_monitoring_request_scan(mongoc_topology_t *topology) { mongoc_set_t *server_monitors; BSON_ASSERT(!topology->single_threaded); if (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) == MONGOC_TOPOLOGY_SCANNER_SHUTTING_DOWN) { return; } server_monitors = topology->server_monitors; for (size_t i = 0u; i < server_monitors->items_len; i++) { mongoc_server_monitor_t *server_monitor; uint32_t id; server_monitor = mongoc_set_get_item_and_id(server_monitors, i, &id); mongoc_server_monitor_request_scan(server_monitor); } } /* Stop, join, and destroy all server monitors. * * Called by application threads when destroying a client pool. * Locks server monitor mutexes to deliver shutdown. This function is * thread-safe. But in practice, it is only ever called by one application * thread (because mongoc_client_pool_destroy is not thread-safe). */ void _mongoc_topology_background_monitoring_stop(mongoc_topology_t *topology) { mongoc_server_monitor_t *server_monitor; BSON_ASSERT(!topology->single_threaded); if (mcommon_atomic_int_fetch(&topology->scanner_state, mcommon_memory_order_relaxed) != MONGOC_TOPOLOGY_SCANNER_BG_RUNNING) { return; } TRACE("%s", "background monitoring stopping"); /* Tell the srv polling thread to stop */ bson_mutex_lock(&topology->srv_polling_mtx); mcommon_atomic_int_exchange( &topology->scanner_state, MONGOC_TOPOLOGY_SCANNER_SHUTTING_DOWN, mcommon_memory_order_relaxed); if (topology->is_srv_polling) { /* Signal the srv poller to break out of waiting */ mongoc_cond_signal(&topology->srv_polling_cond); } bson_mutex_unlock(&topology->srv_polling_mtx); bson_mutex_lock(&topology->tpld_modification_mtx); const size_t n_srv_monitors = topology->server_monitors->items_len; const size_t n_rtt_monitors = topology->rtt_monitors->items_len; bson_mutex_unlock(&topology->tpld_modification_mtx); /* Signal all server monitors to shut down. */ for (size_t i = 0u; i < n_srv_monitors; i++) { server_monitor = mongoc_set_get_item(topology->server_monitors, i); mongoc_server_monitor_request_shutdown(server_monitor); } /* Signal all RTT monitors to shut down. */ for (size_t i = 0u; i < n_rtt_monitors; i++) { server_monitor = mongoc_set_get_item(topology->rtt_monitors, i); mongoc_server_monitor_request_shutdown(server_monitor); } for (size_t i = 0u; i < n_srv_monitors; i++) { /* Wait for the thread to shutdown. */ server_monitor = mongoc_set_get_item(topology->server_monitors, i); mongoc_server_monitor_wait_for_shutdown(server_monitor); mongoc_server_monitor_destroy(server_monitor); } for (size_t i = 0u; i < n_rtt_monitors; i++) { /* Wait for the thread to shutdown. */ server_monitor = mongoc_set_get_item(topology->rtt_monitors, i); mongoc_server_monitor_wait_for_shutdown(server_monitor); mongoc_server_monitor_destroy(server_monitor); } /* Wait for SRV polling thread. */ if (topology->is_srv_polling) { mcommon_thread_join(topology->srv_polling_thread); } /* Signal clients that are waiting on server selection to stop immediately, * as there will be no servers available. * This uses the tpld_modification_mtx as that is the mutex used with the * condition variable that will wait the waiting client threads. */ bson_mutex_lock(&topology->tpld_modification_mtx); mongoc_set_destroy(topology->server_monitors); mongoc_set_destroy(topology->rtt_monitors); topology->server_monitors = mongoc_set_new(1, NULL, NULL); topology->rtt_monitors = mongoc_set_new(1, NULL, NULL); mcommon_atomic_int_exchange(&topology->scanner_state, MONGOC_TOPOLOGY_SCANNER_OFF, mcommon_memory_order_relaxed); mongoc_cond_broadcast(&topology->cond_client); bson_mutex_unlock(&topology->tpld_modification_mtx); } /* Cancel an in-progress streaming hello for a specific server (if * applicable). * * Called from application threads on network errors. */ void _mongoc_topology_background_monitoring_cancel_check(mongoc_topology_t *topology, uint32_t server_id) { mongoc_server_monitor_t *server_monitor; server_monitor = mongoc_set_get(topology->server_monitors, server_id); if (!server_monitor) { /* Already removed. */ return; } mongoc_server_monitor_request_cancel(server_monitor); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-description-apm-private.h000066400000000000000000000055071511661753600312500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_DESCRIPTION_APM_PRIVATE_H #define MONGOC_TOPOLOGY_DESCRIPTION_APM_PRIVATE_H #include #include #include /* Application Performance Monitoring for topology events, complies with the * SDAM Monitoring Spec: https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md */ void _mongoc_topology_description_monitor_server_opening(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_server_description_t *sd); void _mongoc_topology_description_monitor_server_changed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *prev_sd, const mongoc_server_description_t *new_sd); void _mongoc_topology_description_monitor_server_closed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *sd); /* td is not const: we set its "opened" flag here */ void _mongoc_topology_description_monitor_opening(mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor); void _mongoc_topology_description_monitor_changed(const mongoc_topology_description_t *prev_td, const mongoc_topology_description_t *new_td, const mongoc_log_and_monitor_instance_t *log_and_monitor); void _mongoc_topology_description_monitor_closed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor); #endif /* MONGOC_TOPOLOGY_DESCRIPTION_APM_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-description-apm.c000066400000000000000000000221501511661753600275640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* Application Performance Monitoring for topology events, complies with the * SDAM Monitoring Spec: https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md */ /* ServerOpeningEvent */ void _mongoc_topology_description_monitor_server_opening(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_server_description_t *sd) { /* Topology opening will be deferred until server selection, and * server opening must be deferred until topology opening. */ if (td->opened && !sd->opened) { sd->opened = true; mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Starting server monitoring", oid("topologyId", &td->topology_id), server_description(sd, SERVER_HOST, SERVER_PORT)); if (log_and_monitor->apm_callbacks.server_opening) { mongoc_apm_server_opening_t event; bson_oid_copy(&td->topology_id, &event.topology_id); event.host = &sd->host; event.context = log_and_monitor->apm_context; log_and_monitor->apm_callbacks.server_opening(&event); } } } /* ServerDescriptionChangedEvent */ void _mongoc_topology_description_monitor_server_changed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *prev_sd, const mongoc_server_description_t *new_sd) { if (log_and_monitor->apm_callbacks.server_changed) { mongoc_apm_server_changed_t event; /* address is same in previous and new sd */ bson_oid_copy(&td->topology_id, &event.topology_id); event.host = &new_sd->host; event.previous_description = prev_sd; event.new_description = new_sd; event.context = log_and_monitor->apm_context; log_and_monitor->apm_callbacks.server_changed(&event); } } /* ServerClosedEvent */ void _mongoc_topology_description_monitor_server_closed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *sd) { if (!sd->opened) { return; } mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Stopped server monitoring", oid("topologyId", &td->topology_id), server_description(sd, SERVER_HOST, SERVER_PORT)); if (log_and_monitor->apm_callbacks.server_closed) { mongoc_apm_server_closed_t event; bson_oid_copy(&td->topology_id, &event.topology_id); event.host = &sd->host; event.context = log_and_monitor->apm_context; log_and_monitor->apm_callbacks.server_closed(&event); } } /* Send TopologyOpeningEvent when first called on this topology description. * td is not const: we mark it as "opened" by the current log-and-monitor instance. */ void _mongoc_topology_description_monitor_opening(mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor) { if (td->opened) { return; } td->opened = true; // The initial 'previous' topology description, with Unknown type mongoc_topology_description_t *prev_td = BSON_ALIGNED_ALLOC0(mongoc_topology_description_t); mongoc_topology_description_init(prev_td, td->heartbeat_msec); mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Starting topology monitoring", oid("topologyId", &td->topology_id)); if (log_and_monitor->apm_callbacks.topology_opening) { mongoc_apm_topology_opening_t event; bson_oid_copy(&td->topology_id, &event.topology_id); event.context = log_and_monitor->apm_context; log_and_monitor->apm_callbacks.topology_opening(&event); } /* send initial description-changed event */ _mongoc_topology_description_monitor_changed(prev_td, td, log_and_monitor); for (size_t i = 0u; i < mc_tpld_servers(td)->items_len; i++) { mongoc_server_description_t *sd = mongoc_set_get_item(mc_tpld_servers(td), i); _mongoc_topology_description_monitor_server_opening(td, log_and_monitor, sd); } /* If this is a load balanced topology: * - update the one server description to be LoadBalancer * - emit a server changed event Unknown => LoadBalancer * - emit a topology changed event */ if (td->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { mongoc_server_description_t *prev_sd; /* LoadBalanced deployments must have exactly one host listed. Otherwise, * an error would have occurred when constructing the topology. */ BSON_ASSERT(mc_tpld_servers(td)->items_len == 1); mongoc_server_description_t *sd = mongoc_set_get_item(mc_tpld_servers(td), 0); prev_sd = mongoc_server_description_new_copy(sd); BSON_ASSERT(prev_sd); mongoc_topology_description_cleanup(prev_td); _mongoc_topology_description_copy_to(td, prev_td); sd->type = MONGOC_SERVER_LOAD_BALANCER; _mongoc_topology_description_monitor_server_changed(td, log_and_monitor, prev_sd, sd); mongoc_server_description_destroy(prev_sd); _mongoc_topology_description_monitor_changed(prev_td, td, log_and_monitor); } if (prev_td) { mongoc_topology_description_cleanup(prev_td); bson_free(prev_td); } } /* TopologyDescriptionChangedEvent */ void _mongoc_topology_description_monitor_changed(const mongoc_topology_description_t *prev_td, const mongoc_topology_description_t *new_td, const mongoc_log_and_monitor_instance_t *log_and_monitor) { mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Topology description changed", oid("topologyId", &new_td->topology_id), topology_description_as_json("previousDescription", prev_td), topology_description_as_json("newDescription", new_td)); if (log_and_monitor->apm_callbacks.topology_changed) { mongoc_apm_topology_changed_t event; /* callbacks, context, and id are the same in previous and new td */ bson_oid_copy(&new_td->topology_id, &event.topology_id); event.context = log_and_monitor->apm_context; event.previous_description = prev_td; event.new_description = new_td; log_and_monitor->apm_callbacks.topology_changed(&event); } } /* TopologyClosedEvent */ void _mongoc_topology_description_monitor_closed(const mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor) { // Expected preconditions for 'closed' events: // (mongoc_topology_destroy() carries out these transitions prior to close of monitoring.) BSON_ASSERT(td->type == MONGOC_TOPOLOGY_UNKNOWN); BSON_ASSERT(mc_tpld_servers_const(td)->items_len == 0); if (!td->opened) { return; } mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Stopped topology monitoring", oid("topologyId", &td->topology_id)); if (log_and_monitor->apm_callbacks.topology_closed) { mongoc_apm_topology_closed_t event; bson_oid_copy(&td->topology_id, &event.topology_id); event.context = log_and_monitor->apm_context; log_and_monitor->apm_callbacks.topology_closed(&event); } } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-description-private.h000066400000000000000000000220431511661753600304670ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_DESCRIPTION_PRIVATE_H #define MONGOC_TOPOLOGY_DESCRIPTION_PRIVATE_H #include // IWYU pragma: export // #include #include #include #include #include #include #include typedef enum { MONGOC_TOPOLOGY_UNKNOWN, MONGOC_TOPOLOGY_SHARDED, MONGOC_TOPOLOGY_RS_NO_PRIMARY, MONGOC_TOPOLOGY_RS_WITH_PRIMARY, MONGOC_TOPOLOGY_SINGLE, MONGOC_TOPOLOGY_LOAD_BALANCED, MONGOC_TOPOLOGY_DESCRIPTION_TYPES } mongoc_topology_description_type_t; struct _mongoc_topology_description_t { bson_oid_t topology_id; mongoc_topology_description_type_t type; int64_t heartbeat_msec; mongoc_set_t *_servers_; char *set_name; int64_t max_set_version; bson_oid_t max_election_id; bson_error_t compatibility_error; uint32_t max_server_id; int32_t max_hosts; /* srvMaxHosts */ bool stale; bool opened; unsigned int rand_seed; /* the greatest seen cluster time, for a MongoDB 3.6+ sharded cluster. * see Driver Sessions Spec. */ bson_t cluster_time; /* smallest seen logicalSessionTimeoutMinutes, or -1 if any server has no * logicalSessionTimeoutMinutes. see Server Discovery and Monitoring Spec */ int64_t session_timeout_minutes; }; typedef enum { MONGOC_SS_READ, MONGOC_SS_WRITE, MONGOC_SS_AGGREGATE_WITH_WRITE } mongoc_ss_optype_t; /** * @brief Contextual information for logging during server selection * * Required to support the "common fields" defined in the Server Selection Logging specification. * The 'operation' string is borrowed for the lifetime of the mongoc_ss_log_context_t. */ typedef struct _mongoc_ss_log_context_t { const char *operation; // Required int64_t operation_id; bool has_operation_id; } mongoc_ss_log_context_t; void mongoc_topology_description_init(mongoc_topology_description_t *description, int64_t heartbeat_msec); /** * @brief Get a pointer to the set of server descriptions in the topology * description. */ static BSON_INLINE mongoc_set_t * mc_tpld_servers(mongoc_topology_description_t *tpld) { BSON_ASSERT_PARAM(tpld); return tpld->_servers_; } static BSON_INLINE const mongoc_set_t * mc_tpld_servers_const(const mongoc_topology_description_t *tpld) { BSON_ASSERT_PARAM(tpld); return tpld->_servers_; } void _mongoc_topology_description_copy_to(const mongoc_topology_description_t *src, mongoc_topology_description_t *dst); void mongoc_topology_description_cleanup(mongoc_topology_description_t *description); typedef enum { MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, } mongoc_topology_description_hello_cluster_time_strategy_t; void mongoc_topology_description_handle_hello( mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, uint32_t server_id, const bson_t *hello_response, int64_t rtt_msec, mongoc_topology_description_hello_cluster_time_strategy_t cluster_time_strategy, const bson_error_t *error /* IN */); mongoc_server_description_t const * mongoc_topology_description_select(const mongoc_topology_description_t *description, mongoc_ss_optype_t optype, const mongoc_read_prefs_t *read_pref, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, int64_t local_threshold_ms); mongoc_server_description_t * mongoc_topology_description_server_by_id(mongoc_topology_description_t *description, uint32_t id, bson_error_t *error); const mongoc_server_description_t * mongoc_topology_description_server_by_id_const(const mongoc_topology_description_t *description, uint32_t id, bson_error_t *error); int32_t mongoc_topology_description_lowest_max_wire_version(const mongoc_topology_description_t *td); bool mongoc_topology_description_all_sds_have_write_date(const mongoc_topology_description_t *td); bool _mongoc_topology_description_validate_max_staleness(const mongoc_topology_description_t *td, int64_t max_staleness_seconds, bson_error_t *error); const mongoc_server_description_t * _mongoc_topology_description_has_primary(const mongoc_topology_description_t *description); void mongoc_topology_description_suitable_servers(mongoc_array_t *set, /* OUT */ mongoc_ss_optype_t optype, const mongoc_topology_description_t *topology, const mongoc_read_prefs_t *read_pref, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, int64_t local_threshold_ms); bool mongoc_topology_description_has_data_node(const mongoc_topology_description_t *td); void mongoc_topology_description_invalidate_server(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, uint32_t id, const bson_error_t *error /* IN */); bool mongoc_topology_description_add_server(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const char *server, uint32_t *id /* OUT */); void mongoc_topology_description_update_cluster_time(mongoc_topology_description_t *td, const bson_t *reply); void mongoc_topology_description_reconcile(mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_host_list_t *host_list); /** * @brief Invalidate open connnections to a server. * * Pooled clients with open connections will discover the invalidation * the next time they fetch a stream to the server. * * @param td The topology description that will be updated. * @param server_id The ID of the server to invalidate. * @param service_id A service ID for load-balanced deployments. Use * kZeroObjectId if not applicable. * * @note Not applicable to single-threaded clients, which only maintain a * single connection per server and therefore have no connection pool. */ void _mongoc_topology_description_clear_connection_pool(mongoc_topology_description_t *td, uint32_t server_id, const bson_oid_t *service_id); void mongoc_deprioritized_servers_add_if_sharded(mongoc_deprioritized_servers_t *ds, mongoc_topology_description_type_t topology_type, const mongoc_server_description_t *sd); typedef enum { MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_TYPE = (1 << 0), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SET_NAME = (1 << 1), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_ELECTION_ID = (1 << 2), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_SET_VERSION = (1 << 3), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SERVERS = (1 << 4), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_STALE = (1 << 5), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBLE = (1 << 6), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBILITY_ERROR = (1 << 7), MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_LOGICAL_SESSION_TIMEOUT_MINUTES = (1 << 8), } mongoc_topology_description_content_flags_t; bool mongoc_topology_description_append_contents_to_bson(const mongoc_topology_description_t *td, bson_t *bson, mongoc_topology_description_content_flags_t flags, mongoc_server_description_content_flags_t servers_flags); #endif /* MONGOC_TOPOLOGY_DESCRIPTION_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-description.c000066400000000000000000002613651511661753600270260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static bool _is_data_node(const mongoc_server_description_t *sd) { switch (sd->type) { case MONGOC_SERVER_MONGOS: case MONGOC_SERVER_STANDALONE: case MONGOC_SERVER_RS_SECONDARY: case MONGOC_SERVER_RS_PRIMARY: case MONGOC_SERVER_LOAD_BALANCER: return true; case MONGOC_SERVER_RS_OTHER: case MONGOC_SERVER_RS_ARBITER: case MONGOC_SERVER_UNKNOWN: case MONGOC_SERVER_POSSIBLE_PRIMARY: case MONGOC_SERVER_RS_GHOST: case MONGOC_SERVER_DESCRIPTION_TYPES: default: return false; } } static void _mongoc_topology_server_dtor(void *server_, void *ctx_) { BSON_UNUSED(ctx_); mongoc_server_description_destroy((mongoc_server_description_t *)server_); } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_init -- * * Initialize the given topology description * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_topology_description_init(mongoc_topology_description_t *description, int64_t heartbeat_msec) { ENTRY; BSON_ASSERT(description); memset(description, 0, sizeof(*description)); bson_oid_init(&description->topology_id, NULL); description->type = MONGOC_TOPOLOGY_UNKNOWN; description->heartbeat_msec = heartbeat_msec; description->_servers_ = mongoc_set_new(8, _mongoc_topology_server_dtor, NULL); description->set_name = NULL; description->max_set_version = MONGOC_NO_SET_VERSION; description->stale = true; description->rand_seed = (unsigned int)bson_get_monotonic_time(); bson_init(&description->cluster_time); description->session_timeout_minutes = MONGOC_NO_SESSIONS; EXIT; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_copy_to -- * * Deep-copy @src to an uninitialized topology description @dst. * @dst must not already point to any allocated resources. Clean * up with mongoc_topology_description_cleanup. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void _mongoc_topology_description_copy_to(const mongoc_topology_description_t *src, mongoc_topology_description_t *dst) { size_t nitems; const mongoc_server_description_t *sd; uint32_t id; ENTRY; BSON_ASSERT(src); BSON_ASSERT(dst); bson_oid_copy(&src->topology_id, &dst->topology_id); bson_oid_copy(&src->max_election_id, &dst->max_election_id); dst->opened = src->opened; dst->type = src->type; dst->heartbeat_msec = src->heartbeat_msec; dst->rand_seed = src->rand_seed; nitems = bson_next_power_of_two(mc_tpld_servers_const(src)->items_len); dst->_servers_ = mongoc_set_new(nitems, _mongoc_topology_server_dtor, NULL); for (size_t i = 0u; i < mc_tpld_servers_const(src)->items_len; i++) { sd = mongoc_set_get_item_and_id_const(mc_tpld_servers_const(src), i, &id); mongoc_set_add(mc_tpld_servers(dst), id, mongoc_server_description_new_copy(sd)); } dst->set_name = bson_strdup(src->set_name); dst->max_set_version = src->max_set_version; memcpy(&dst->compatibility_error, &src->compatibility_error, sizeof(bson_error_t)); dst->max_server_id = src->max_server_id; dst->max_hosts = src->max_hosts; dst->stale = src->stale; bson_copy_to(&src->cluster_time, &dst->cluster_time); dst->session_timeout_minutes = src->session_timeout_minutes; EXIT; } /* *------------------------------------------------------------------------- * * mongoc_topology_description_new_copy -- * * Allocates a new topology description and deep-copies @description to it * using _mongoc_topology_description_copy_to. * * Returns: * A copy of a topology description that you must destroy with * mongoc_topology_description_destroy, or NULL if @description is NULL. * * Side effects: * None. * *------------------------------------------------------------------------- */ mongoc_topology_description_t * mongoc_topology_description_new_copy(const mongoc_topology_description_t *description) { mongoc_topology_description_t *copy; if (!description) { return NULL; } copy = BSON_ALIGNED_ALLOC0(mongoc_topology_description_t); _mongoc_topology_description_copy_to(description, copy); return copy; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_cleanup -- * * Destroy allocated resources within @description but don't free it. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_topology_description_cleanup(mongoc_topology_description_t *description) { ENTRY; BSON_ASSERT(description); if (mc_tpld_servers(description)) { mongoc_set_destroy(mc_tpld_servers(description)); } if (description->set_name) { bson_free(description->set_name); } bson_destroy(&description->cluster_time); EXIT; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_destroy -- * * Destroy allocated resources within @description and free * @description. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mongoc_topology_description_destroy(mongoc_topology_description_t *description) { ENTRY; if (!description) { EXIT; } mongoc_topology_description_cleanup(description); bson_free(description); EXIT; } /* find the primary, then stop iterating */ static bool _mongoc_topology_description_has_primary_cb(const void *item, void *ctx /* OUT */) { const mongoc_server_description_t *server = item; const mongoc_server_description_t **primary = ctx; /* TODO should this include MONGOS? */ if (server->type == MONGOC_SERVER_RS_PRIMARY || server->type == MONGOC_SERVER_STANDALONE) { *primary = (mongoc_server_description_t *)item; return false; } return true; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_has_primary -- * * If topology has a primary, return it. * * Returns: * A pointer to the primary, or NULL. * * Side effects: * None * *-------------------------------------------------------------------------- */ const mongoc_server_description_t * _mongoc_topology_description_has_primary(const mongoc_topology_description_t *description) { mongoc_server_description_t *primary = NULL; mongoc_set_for_each_const(mc_tpld_servers_const(description), _mongoc_topology_description_has_primary_cb, &primary); return primary; } /* *-------------------------------------------------------------------------- * * _mongoc_server_description_primary_is_not_stale -- * * Checks if a primary server is not stale by comparing the electionId and * setVersion. * * Returns: * True if the server's electionId is larger or the server's version is * later than the topology max version. * * Side effects: * None * *-------------------------------------------------------------------------- */ static bool _mongoc_server_description_primary_is_not_stale(mongoc_topology_description_t *td, const mongoc_server_description_t *sd) { /* initially max_set_version is -1 and max_election_id is zeroed */ return (bson_oid_compare(&sd->election_id, &td->max_election_id) > 0) || ((bson_oid_compare(&sd->election_id, &td->max_election_id) == 0) && sd->set_version >= td->max_set_version); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_later_election -- * * Check if we've seen a more recent election in the replica set * than this server has. * * Returns: * True if the topology description's max replica set version plus * election id is later than the server description's. * * Side effects: * None * *-------------------------------------------------------------------------- */ static bool _mongoc_topology_description_later_election(mongoc_topology_description_t *td, const mongoc_server_description_t *sd) { /* initially max_set_version is -1 and max_election_id is zeroed */ return td->max_set_version > sd->set_version || (td->max_set_version == sd->set_version && bson_oid_compare(&td->max_election_id, &sd->election_id) > 0); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_set_max_set_version -- * * Remember that we've seen a new replica set version. Unconditionally * sets td->set_version to sd->set_version. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_set_max_set_version(mongoc_topology_description_t *td, const mongoc_server_description_t *sd) { td->max_set_version = sd->set_version; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_set_max_election_id -- * * Remember that we've seen a new election id. Unconditionally sets * td->max_election_id to sd->election_id. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_set_max_election_id(mongoc_topology_description_t *td, const mongoc_server_description_t *sd) { bson_oid_copy(&sd->election_id, &td->max_election_id); } static bool _mongoc_topology_description_server_is_candidate(mongoc_server_description_type_t desc_type, mongoc_read_mode_t read_mode, mongoc_topology_description_type_t topology_type) { switch ((int)topology_type) { case MONGOC_TOPOLOGY_SINGLE: switch ((int)desc_type) { case MONGOC_SERVER_STANDALONE: return true; default: return false; } case MONGOC_TOPOLOGY_RS_NO_PRIMARY: case MONGOC_TOPOLOGY_RS_WITH_PRIMARY: switch ((int)read_mode) { case MONGOC_READ_PRIMARY: switch ((int)desc_type) { case MONGOC_SERVER_RS_PRIMARY: return true; default: return false; } case MONGOC_READ_SECONDARY: switch ((int)desc_type) { case MONGOC_SERVER_RS_SECONDARY: return true; default: return false; } default: switch ((int)desc_type) { case MONGOC_SERVER_RS_PRIMARY: case MONGOC_SERVER_RS_SECONDARY: return true; default: return false; } } case MONGOC_TOPOLOGY_SHARDED: switch ((int)desc_type) { case MONGOC_SERVER_MONGOS: return true; default: return false; } /* Note, there is no call path that leads to the * MONGOC_TOPOLOGY_LOAD_BALANCED case. Server selection for load balanced * topologies bypasses this logic. This silences compiler warnings on * unhandled enum values. */ case MONGOC_TOPOLOGY_LOAD_BALANCED: return desc_type == MONGOC_SERVER_LOAD_BALANCER; default: return false; } } typedef struct _mongoc_suitable_data_t { mongoc_read_mode_t read_mode; mongoc_topology_description_type_t topology_type; const mongoc_server_description_t *primary; /* OUT */ const mongoc_server_description_t **candidates; /* OUT */ size_t candidates_len; /* OUT */ bool has_secondary; /* OUT */ } mongoc_suitable_data_t; static bool _mongoc_replica_set_read_suitable_cb(const void *item, void *ctx) { const mongoc_server_description_t *server = item; mongoc_suitable_data_t *data = (mongoc_suitable_data_t *)ctx; /* primary's used in staleness calculation, even with mode SECONDARY */ if (server->type == MONGOC_SERVER_RS_PRIMARY) { data->primary = server; } if (_mongoc_topology_description_server_is_candidate(server->type, data->read_mode, data->topology_type)) { if (server->type == MONGOC_SERVER_RS_PRIMARY) { if (data->read_mode == MONGOC_READ_PRIMARY || data->read_mode == MONGOC_READ_PRIMARY_PREFERRED) { /* we want a primary and we have one, done! */ return false; } } if (server->type == MONGOC_SERVER_RS_SECONDARY) { data->has_secondary = true; } /* add to our candidates */ data->candidates[data->candidates_len++] = server; } else { TRACE("Rejected [%s] [%s] for mode [%s]", mongoc_server_description_type(server), server->host.host_and_port, _mongoc_read_mode_as_str(data->read_mode)); } return true; } /* if any mongos are candidates, add them to the candidates array */ static void _mongoc_try_mode_secondary(mongoc_array_t *set, /* OUT */ const mongoc_topology_description_t *topology, const mongoc_read_prefs_t *read_pref, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, int64_t local_threshold_ms) { mongoc_read_prefs_t *secondary; secondary = mongoc_read_prefs_copy(read_pref); mongoc_read_prefs_set_mode(secondary, MONGOC_READ_SECONDARY); mongoc_topology_description_suitable_servers( set, MONGOC_SS_READ, topology, secondary, must_use_primary, ds, local_threshold_ms); mongoc_read_prefs_destroy(secondary); } static bool _mongoc_td_servers_to_candidates_array(const void *item, void *ctx) { BSON_ASSERT_PARAM(item); BSON_ASSERT_PARAM(ctx); const mongoc_server_description_t *const server = item; mongoc_suitable_data_t *const data = (mongoc_suitable_data_t *)ctx; data->candidates[data->candidates_len++] = server; return true; } // Server Selection Spec: If a list of deprioritized servers is provided, and // the topology is a sharded cluster, these servers should be selected only if // there are no other suitable servers. The server selection algorithm MUST // ignore the deprioritized servers if the topology is not a sharded cluster. static void _mongoc_filter_deprioritized_servers(mongoc_suitable_data_t *data, const mongoc_deprioritized_servers_t *ds) { BSON_ASSERT_PARAM(data); BSON_ASSERT_PARAM(ds); TRACE("%s", "deprioritization: filtering list of candidates"); mongoc_array_t filtered_servers; _mongoc_array_init(&filtered_servers, sizeof(const mongoc_server_description_t *)); for (size_t idx = 0u; idx < data->candidates_len; ++idx) { mongoc_server_description_t const *const sd = data->candidates[idx]; if (!mongoc_deprioritized_servers_contains(ds, sd)) { TRACE("deprioritization: - kept: %s (id: %" PRIu32 ")", sd->host.host_and_port, sd->id); _mongoc_array_append_val(&filtered_servers, sd); } else { TRACE("deprioritization: - removed: %s (id: %" PRIu32 ")", sd->host.host_and_port, sd->id); } } if (filtered_servers.len == 0u) { TRACE("%s", "deprioritization: reverted due to no other suitable servers"); _mongoc_array_destroy(&filtered_servers); } else if (filtered_servers.len == data->candidates_len) { TRACE("%s", "deprioritization: none found in list of candidates"); _mongoc_array_destroy(&filtered_servers); } else { TRACE("%s", "deprioritization: using filtered list of candidates"); data->candidates_len = filtered_servers.len; // `(void*)`: avoid MSVC error C4090: // 'function': different 'const' qualifiers memmove((void *)data->candidates, filtered_servers.data, filtered_servers.len * filtered_servers.element_size); _mongoc_array_destroy(&filtered_servers); } } // Keep only suitable mongoses in the candidates array. static void _mongoc_filter_suitable_mongos(mongoc_suitable_data_t *data) { size_t idx = 0u; while (idx < data->candidates_len) { if (_mongoc_topology_description_server_is_candidate( data->candidates[idx]->type, data->read_mode, data->topology_type)) { // All candidates in the latency window are suitable. ++idx; } else { // Remove from list using swap+pop. // Order doesn't matter; the list will be randomized in // mongoc_topology_description_select prior to server selection. data->candidates[idx] = data->candidates[--data->candidates_len]; } } } /* *------------------------------------------------------------------------- * * mongoc_topology_description_lowest_max_wire_version -- * * The topology's max wire version. * * Returns: * The minimum of all known servers' max wire versions, or INT32_MAX * if there are no known servers. * * Side effects: * None. * *------------------------------------------------------------------------- */ int32_t mongoc_topology_description_lowest_max_wire_version(const mongoc_topology_description_t *td) { int32_t ret = INT32_MAX; const mongoc_set_t *servers = mc_tpld_servers_const(td); for (size_t i = 0u; (size_t)i < servers->items_len; i++) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(servers, i); if (sd->type != MONGOC_SERVER_UNKNOWN && sd->type != MONGOC_SERVER_POSSIBLE_PRIMARY && sd->max_wire_version < ret) { ret = sd->max_wire_version; } } return ret; } /* *------------------------------------------------------------------------- * * mongoc_topology_description_all_sds_have_write_date -- * * Whether the primary and all secondaries' server descriptions have * last_write_date_ms. * * Side effects: * None. * *------------------------------------------------------------------------- */ bool mongoc_topology_description_all_sds_have_write_date(const mongoc_topology_description_t *td) { for (size_t i = 0u; (size_t)i < mc_tpld_servers_const(td)->items_len; i++) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(mc_tpld_servers_const(td), i); if (sd->last_write_date_ms <= 0 && (sd->type == MONGOC_SERVER_RS_PRIMARY || sd->type == MONGOC_SERVER_RS_SECONDARY)) { return false; } } return true; } /* *------------------------------------------------------------------------- * * _mongoc_topology_description_validate_max_staleness -- * * If the provided "maxStalenessSeconds" component of the read * preference is not valid for this topology, fill out @error and * return false. * * Side effects: * None. * *------------------------------------------------------------------------- */ bool _mongoc_topology_description_validate_max_staleness(const mongoc_topology_description_t *td, int64_t max_staleness_seconds, bson_error_t *error) { mongoc_topology_description_type_t td_type; /* Server Selection Spec: A driver MUST raise an error if the TopologyType * is ReplicaSetWithPrimary or ReplicaSetNoPrimary and either of these * conditions is false: * * maxStalenessSeconds * 1000 >= heartbeatFrequencyMS + idleWritePeriodMS * maxStalenessSeconds >= smallestMaxStalenessSeconds */ td_type = td->type; if (td_type != MONGOC_TOPOLOGY_RS_WITH_PRIMARY && td_type != MONGOC_TOPOLOGY_RS_NO_PRIMARY) { return true; } if (max_staleness_seconds * 1000 < td->heartbeat_msec + MONGOC_IDLE_WRITE_PERIOD_MS) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "maxStalenessSeconds is set to %" PRId64 ", it must be at least heartbeatFrequencyMS (%" PRId64 ") + server's idle write period (%d seconds)", max_staleness_seconds, td->heartbeat_msec, MONGOC_IDLE_WRITE_PERIOD_MS / 1000); return false; } if (max_staleness_seconds < MONGOC_SMALLEST_MAX_STALENESS_SECONDS) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "maxStalenessSeconds is set to %" PRId64 ", it must be at least %d seconds", max_staleness_seconds, MONGOC_SMALLEST_MAX_STALENESS_SECONDS); return false; } return true; } static bool _check_any_server_less_than_wire_version_13(const void *sd_, void *any_too_old_) { const mongoc_server_description_t *sd = sd_; bool *any_too_old = any_too_old_; if (sd->type != MONGOC_SERVER_UNKNOWN && sd->max_wire_version < WIRE_VERSION_5_0) { *any_too_old = true; return false /* Stop searching */; } return true /* Keep searching */; } /** * @brief Calculate the read mode that we should be using, based on what was * requested and what is available in the topology. * * Per the CRUD spec, if the requested read mode is *not* primary, and *any* available * server in the topology has a wire version < server v5.0, we must override the * read mode preference with "primary." Server v5.0 indicates support on a * secondary server for using aggregate pipelines that contain writing stages * (i.e. '$out' and '$merge'). */ static bool _must_use_primary(const mongoc_topology_description_t *td, mongoc_ss_optype_t optype, mongoc_read_mode_t requested_read_mode) { if (requested_read_mode == MONGOC_READ_PRIMARY) { /* We never alter from a primary read mode. This early-return is just an * optimization to skip scanning for old servers, as we would end up * returning MONGOC_READ_PRIMARY regardless. */ return true; } switch (optype) { case MONGOC_SS_WRITE: /* We don't deal with write operations */ return false; case MONGOC_SS_READ: /* Maintain the requested read mode if it is a regular read operation */ return false; case MONGOC_SS_AGGREGATE_WITH_WRITE: { /* Check if any of the available servers are too old to support the * aggregate-with-write on a secondary server */ bool any_too_old = false; mongoc_set_for_each_const(mc_tpld_servers_const(td), _check_any_server_less_than_wire_version_13, &any_too_old); if (any_too_old) { /* Force the read preference back to reading from a primary server, as * one or more servers in the system may not support the operation */ return true; } /* We're okay to send an aggr-with-write to a secondary server, so permit * the caller's read mode preference */ return false; } default: BSON_UNREACHABLE("Invalid mongoc_ss_optype_t for _must_use_primary()"); } } /* *------------------------------------------------------------------------- * * mongoc_topology_description_suitable_servers -- * * Fill out an array of servers matching the read preference and * localThresholdMS. * * Side effects: * None. * *------------------------------------------------------------------------- */ void mongoc_topology_description_suitable_servers(mongoc_array_t *set, /* OUT */ mongoc_ss_optype_t optype, const mongoc_topology_description_t *topology, const mongoc_read_prefs_t *read_pref, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, int64_t local_threshold_ms) { const mongoc_set_t *td_servers = mc_tpld_servers_const(topology); const mongoc_read_mode_t given_read_mode = mongoc_read_prefs_get_mode(read_pref); const bool override_use_primary = _must_use_primary(topology, optype, given_read_mode); mongoc_suitable_data_t data = { .primary = NULL, .topology_type = topology->type, .has_secondary = false, .candidates_len = 0, .candidates = BSON_ARRAY_ALLOC0(td_servers->items_len, const mongoc_server_description_t *), }; /* The "effective" read mode is the read mode that we should behave for, and * depends on the user's provided read mode, the type of operation that the * user wishes to perform, and the server versions that we are talking to. * * If the operation is a write operation, read mode is irrelevant. * * If the operation is a regular read, we just use the caller's read mode. * * If the operation is an aggregate that contains writing stages, we need to * be more careful about selecting an appropriate server. */ data.read_mode = override_use_primary ? MONGOC_READ_PRIMARY : given_read_mode; if (must_use_primary) { /* The caller wants to know if we have overriden their read preference */ *must_use_primary = override_use_primary; } /* Single server -- * Either it is suitable or it isn't */ if (topology->type == MONGOC_TOPOLOGY_SINGLE) { const mongoc_server_description_t *server = mongoc_set_get_item_const(td_servers, 0); if (_mongoc_topology_description_server_is_candidate(server->type, data.read_mode, topology->type)) { _mongoc_array_append_val(set, server); } else { TRACE("Rejected [%s] [%s] for read mode [%s] with topology type Single", mongoc_server_description_type(server), server->host.host_and_port, _mongoc_read_mode_as_str(data.read_mode)); } goto DONE; } /* Replica sets -- * Find suitable servers based on read mode */ if (topology->type == MONGOC_TOPOLOGY_RS_NO_PRIMARY || topology->type == MONGOC_TOPOLOGY_RS_WITH_PRIMARY) { switch (optype) { case MONGOC_SS_AGGREGATE_WITH_WRITE: case MONGOC_SS_READ: { mongoc_set_for_each_const(td_servers, _mongoc_replica_set_read_suitable_cb, &data); if (data.read_mode == MONGOC_READ_PRIMARY) { if (data.primary) { _mongoc_array_append_val(set, data.primary); } goto DONE; } if (data.read_mode == MONGOC_READ_PRIMARY_PREFERRED && data.primary) { _mongoc_array_append_val(set, data.primary); goto DONE; } if (data.read_mode == MONGOC_READ_SECONDARY_PREFERRED) { /* try read_mode SECONDARY */ _mongoc_try_mode_secondary(set, topology, read_pref, must_use_primary, NULL, local_threshold_ms); /* otherwise fall back to primary */ if (!set->len && data.primary) { _mongoc_array_append_val(set, data.primary); } goto DONE; } if (data.read_mode == MONGOC_READ_SECONDARY) { for (size_t i = 0u; i < data.candidates_len; i++) { if (data.candidates[i] && data.candidates[i]->type != MONGOC_SERVER_RS_SECONDARY) { TRACE("Rejected [%s] [%s] for mode [%s] with RS topology", mongoc_server_description_type(data.candidates[i]), data.candidates[i]->host.host_and_port, _mongoc_read_mode_as_str(data.read_mode)); data.candidates[i] = NULL; } } } /* mode is SECONDARY or NEAREST, filter by staleness and tags */ mongoc_server_description_filter_stale( data.candidates, data.candidates_len, data.primary, topology->heartbeat_msec, read_pref); mongoc_server_description_filter_tags(data.candidates, data.candidates_len, read_pref); } break; case MONGOC_SS_WRITE: { if (topology->type == MONGOC_TOPOLOGY_RS_WITH_PRIMARY) { mongoc_set_for_each_const(td_servers, _mongoc_topology_description_has_primary_cb, (void *)&data.primary); if (data.primary) { _mongoc_array_append_val(set, data.primary); goto DONE; } } } break; default: BSON_UNREACHABLE("Invalid optype"); } } // Sharded clusters -- if (topology->type == MONGOC_TOPOLOGY_SHARDED) { mongoc_set_for_each_const(td_servers, _mongoc_td_servers_to_candidates_array, &data); if (ds) { _mongoc_filter_deprioritized_servers(&data, ds); } _mongoc_filter_suitable_mongos(&data); } /* Load balanced clusters -- * Always select the only server. */ if (topology->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { const mongoc_server_description_t *server; BSON_ASSERT(td_servers->items_len == 1); server = mongoc_set_get_item_const(td_servers, 0); _mongoc_array_append_val(set, server); goto DONE; } /* Ways to get here: * - secondary read * - secondary preferred read * - primary_preferred and no primary read * - sharded anything * Find the nearest, then select within the window */ int64_t nearest = INT64_MAX; bool found = false; for (size_t i = 0u; i < data.candidates_len; i++) { if (data.candidates[i]) { nearest = BSON_MIN(nearest, data.candidates[i]->round_trip_time_msec); found = true; } } // No candidates remaining. if (!found) { goto DONE; } const int64_t rtt_limit = nearest + local_threshold_ms; for (size_t i = 0u; i < data.candidates_len; i++) { if (data.candidates[i] && (data.candidates[i]->round_trip_time_msec <= rtt_limit)) { _mongoc_array_append_val(set, data.candidates[i]); } } DONE: bson_free((mongoc_server_description_t *)data.candidates); return; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_has_data_node -- * * Internal method: are any servers not Arbiter, Ghost, or Unknown? * *-------------------------------------------------------------------------- */ bool mongoc_topology_description_has_data_node(const mongoc_topology_description_t *td) { const mongoc_set_t *servers = mc_tpld_servers_const(td); for (size_t i = 0u; i < servers->items_len; i++) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(servers, i); if (_is_data_node(sd)) { return true; } } return false; } /* *------------------------------------------------------------------------- * * mongoc_topology_description_select -- * * Return a server description of a node that is appropriate for * the given read preference and operation type. * * NOTE: this method simply attempts to select a server from the * current topology, it does not retry or trigger topology checks. * * Returns: * Selected server description, or NULL upon failure. * * Side effects: * None. * *------------------------------------------------------------------------- */ mongoc_server_description_t const * mongoc_topology_description_select(const mongoc_topology_description_t *topology, mongoc_ss_optype_t optype, const mongoc_read_prefs_t *read_pref, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, int64_t local_threshold_ms) { mongoc_array_t suitable_servers; ENTRY; if (topology->type == MONGOC_TOPOLOGY_SINGLE) { mongoc_server_description_t const *const sd = mongoc_set_get_item_const(mc_tpld_servers_const(topology), 0); if (optype == MONGOC_SS_AGGREGATE_WITH_WRITE && sd->type != MONGOC_SERVER_UNKNOWN && sd->max_wire_version < WIRE_VERSION_5_0) { /* The single server may be part of an unseen replica set that may not * support aggr-with-write operations on secondaries. Force the read * preference to use a primary. */ if (must_use_primary) { *must_use_primary = true; } } if (sd->has_hello_response) { RETURN(sd); } else { TRACE("Topology type single, [%s] is down", sd->host.host_and_port); RETURN(NULL); } } _mongoc_array_init(&suitable_servers, sizeof(mongoc_server_description_t *)); mongoc_topology_description_suitable_servers( &suitable_servers, optype, topology, read_pref, must_use_primary, ds, local_threshold_ms); mongoc_server_description_t const *sd = NULL; if (suitable_servers.len != 0) { const int rand_n = _mongoc_rand_simple((unsigned *)&topology->rand_seed); sd = _mongoc_array_index(&suitable_servers, mongoc_server_description_t *, (size_t)rand_n % suitable_servers.len); } _mongoc_array_destroy(&suitable_servers); if (sd) { TRACE("Topology type [%s], selected [%s] [%s]", mongoc_topology_description_type(topology), mongoc_server_description_type(sd), sd->host.host_and_port); } RETURN(sd); } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_server_by_id -- * * Get the server description for @id, if that server is present * in @description. Otherwise, return NULL and fill out optional * @error. * * NOTE: In most cases, caller should create a duplicate of the * returned server description. * * Returns: * A mongoc_server_description_t *, or NULL. * * Side effects: * Fills out optional @error if server not found. * *-------------------------------------------------------------------------- */ mongoc_server_description_t * mongoc_topology_description_server_by_id(mongoc_topology_description_t *description, uint32_t id, bson_error_t *error) { return (mongoc_server_description_t *)mongoc_topology_description_server_by_id_const(description, id, error); } const mongoc_server_description_t * mongoc_topology_description_server_by_id_const(const mongoc_topology_description_t *td, uint32_t id, bson_error_t *error) { const mongoc_server_description_t *sd; BSON_ASSERT_PARAM(td); sd = mongoc_set_get_const(mc_tpld_servers_const(td), id); if (!sd) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not find description for node %u", id); } return sd; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_remove_server -- * * If present, remove this server from this topology description. * * Returns: * None. * * Side effects: * Removes the server description from topology and destroys it. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_remove_server(mongoc_topology_description_t *description, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_ASSERT(description); BSON_ASSERT(server); _mongoc_topology_description_monitor_server_closed(description, log_and_monitor, server); mongoc_set_rm(mc_tpld_servers(description), server->id); /* Check if removing server resulted in an empty set of servers */ if (mc_tpld_servers_const(description)->items_len == 0) { MONGOC_WARNING("Last server removed from topology"); } } typedef struct _mongoc_address_and_id_t { const char *address; /* IN */ bool found; /* OUT */ uint32_t id; /* OUT */ } mongoc_address_and_id_t; /* find the given server and stop iterating */ static bool _mongoc_topology_description_has_server_cb(const void *item, void *ctx /* IN - OUT */) { const mongoc_server_description_t *server = item; mongoc_address_and_id_t *data = (mongoc_address_and_id_t *)ctx; if (strcasecmp(data->address, server->connection_address) == 0) { data->found = true; data->id = server->id; return false; } return true; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_has_set_version -- * * Whether @topology's max replica set version has been set. * * Returns: * True if the max setVersion was ever set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _mongoc_topology_description_has_set_version(mongoc_topology_description_t *td) { return td->max_set_version != MONGOC_NO_SET_VERSION; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_topology_has_server -- * * Return true if @server is in @topology. If so, place its id in * @id if given. * * Returns: * True if server is in topology, false otherwise. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool _mongoc_topology_description_has_server(mongoc_topology_description_t *description, const char *address, uint32_t *id /* OUT */) { mongoc_address_and_id_t data; BSON_ASSERT(description); BSON_ASSERT(address); data.address = address; data.found = false; mongoc_set_for_each_const(mc_tpld_servers_const(description), _mongoc_topology_description_has_server_cb, &data); if (data.found && id) { *id = data.id; } return data.found; } typedef struct _mongoc_address_and_type_t { const char *address; mongoc_server_description_type_t type; } mongoc_address_and_type_t; static bool _mongoc_label_unknown_member_cb(void *item, void *ctx) { mongoc_server_description_t *server = (mongoc_server_description_t *)item; mongoc_address_and_type_t *data = (mongoc_address_and_type_t *)ctx; if (strcasecmp(server->connection_address, data->address) == 0 && server->type == MONGOC_SERVER_UNKNOWN) { mongoc_server_description_set_state(server, data->type); return false; } return true; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_label_unknown_member -- * * Find the server description with the given @address and if its * type is UNKNOWN, set its type to @type. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_label_unknown_member(mongoc_topology_description_t *description, const char *address, mongoc_server_description_type_t type) { mongoc_address_and_type_t data; BSON_ASSERT(description); BSON_ASSERT(address); data.type = type; data.address = address; mongoc_set_for_each(mc_tpld_servers(description), _mongoc_label_unknown_member_cb, &data); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_set_state -- * * Change the state of this cluster and unblock things waiting * on a change of topology type. * * Returns: * None. * * Side effects: * Unblocks anything waiting on this description to change states. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_set_state(mongoc_topology_description_t *description, mongoc_topology_description_type_t type) { description->type = type; } static void _update_rs_type(mongoc_topology_description_t *topology) { if (_mongoc_topology_description_has_primary(topology)) { _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_RS_WITH_PRIMARY); } else { _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_RS_NO_PRIMARY); } } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_check_if_has_primary -- * * If there is a primary in topology, set topology * type to RS_WITH_PRIMARY, otherwise set it to * RS_NO_PRIMARY. * * Returns: * None. * * Side effects: * Changes the topology type. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_check_if_has_primary(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_UNUSED(server); BSON_UNUSED(log_and_monitor); _update_rs_type(topology); } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_invalidate_server -- * * Invalidate a server if a network error occurred while using it in * another part of the client. Server description is set to type * UNKNOWN, the error is recorded, and other parameters are reset to * defaults. Pass in the reason for invalidation in @error. * * @todo Try to remove this function when CDRIVER-3654 is complete. * It is only called when an application thread needs to mark a server Unknown. * But an application error is also tied to other behavior, and should also * consider the connection generation. This logic is captured in * _mongoc_topology_handle_app_error. This should not be called directly */ void mongoc_topology_description_invalidate_server(mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, uint32_t id, const bson_error_t *error /* IN */) { BSON_ASSERT(error); if (td->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* Load balancers must never be marked unknown. */ return; } /* send NULL hello reply */ mongoc_topology_description_handle_hello( td, log_and_monitor, id, NULL, MONGOC_RTT_UNSET, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, error); } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_add_server -- * * Add the specified server to the cluster topology if it is not * already a member. If @id, place its id in @id. * * Return: * True if the server was added or already existed in the topology, * false if an error occurred. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool mongoc_topology_description_add_server(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const char *server, uint32_t *id /* OUT */) { uint32_t server_id; mongoc_server_description_t *description; BSON_ASSERT(topology); BSON_ASSERT(server); if (!_mongoc_topology_description_has_server(topology, server, &server_id)) { /* TODO this might not be an accurate count in all cases */ server_id = ++topology->max_server_id; description = BSON_ALIGNED_ALLOC0(mongoc_server_description_t); mongoc_server_description_init(description, server, server_id); mongoc_set_add(mc_tpld_servers(topology), server_id, description); /* Note that libmongoc defers topology 'opening' until server selection or background monitoring begins, * and server monitoring must correspondingly only be 'opened' after the API has seen topology monitoring open. * * If the topology is already opened, we will send server opening events immediately. * Otherwise this has no effect, and server opening events will be sent later by * _mongoc_topology_description_monitor_opening. */ _mongoc_topology_description_monitor_server_opening(topology, log_and_monitor, description); } if (id) { *id = server_id; } return true; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_update_cluster_time -- * * Drivers Session Spec: Drivers MUST examine responses to server commands to * see if they contain a top level field named $clusterTime formatted as * follows: * * { * ... * $clusterTime : { * clusterTime : , * signature : { * hash : , * keyId : * } * }, * ... * } * * Whenever a driver receives a clusterTime from a server it MUST compare it * to the current highest seen clusterTime for the cluster. If the new * clusterTime is higher than the highest seen clusterTime it MUST become * the new highest seen clusterTime. Two clusterTimes are compared using * only the BsonTimestamp value of the clusterTime embedded field (be sure to * include both the timestamp and the increment of the BsonTimestamp in the * comparison). The signature field does not participate in the comparison. * *-------------------------------------------------------------------------- */ void mongoc_topology_description_update_cluster_time(mongoc_topology_description_t *td, const bson_t *reply) { bson_iter_t iter; bson_iter_t child; const uint8_t *data; uint32_t size; bson_t cluster_time; if (!reply || !bson_iter_init_find(&iter, reply, "$clusterTime")) { return; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter) || !bson_iter_recurse(&iter, &child)) { MONGOC_ERROR("Can't parse $clusterTime"); return; } bson_iter_document(&iter, &size, &data); BSON_ASSERT(bson_init_static(&cluster_time, data, (size_t)size)); if (bson_empty(&td->cluster_time) || _mongoc_cluster_time_greater(&cluster_time, &td->cluster_time)) { bson_destroy(&td->cluster_time); bson_copy_to(&cluster_time, &td->cluster_time); } } static void _mongoc_topology_description_add_new_servers(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { bson_iter_t member_iter; const bson_t *rs_members[3]; int i; rs_members[0] = &server->hosts; rs_members[1] = &server->arbiters; rs_members[2] = &server->passives; for (i = 0; i < 3; i++) { BSON_ASSERT(bson_iter_init(&member_iter, rs_members[i])); while (bson_iter_next(&member_iter)) { mongoc_topology_description_add_server(topology, log_and_monitor, bson_iter_utf8(&member_iter, NULL), NULL); } } } typedef struct _mongoc_primary_and_topology_t { mongoc_topology_description_t *topology; const mongoc_server_description_t *primary; } mongoc_primary_and_topology_t; /* invalidate old primaries */ static bool _mongoc_topology_description_invalidate_primaries_cb(void *item, void *ctx) { mongoc_server_description_t *server = (mongoc_server_description_t *)item; mongoc_primary_and_topology_t *data = (mongoc_primary_and_topology_t *)ctx; if (server->id != data->primary->id && server->type == MONGOC_SERVER_RS_PRIMARY) { mongoc_server_description_set_state(server, MONGOC_SERVER_UNKNOWN); mongoc_server_description_set_set_version(server, MONGOC_NO_SET_VERSION); mongoc_server_description_set_election_id(server, NULL); mongoc_server_description_reset(server); } return true; } /* Remove and destroy all replica set members not in primary's hosts lists */ static void _mongoc_topology_description_remove_unreported_servers(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *primary) { mongoc_array_t to_remove; _mongoc_array_init(&to_remove, sizeof(mongoc_server_description_t *)); /* Accumulate servers to be removed - do this before calling * _mongoc_topology_description_remove_server, which could call * mongoc_server_description_cleanup on the primary itself if it * doesn't report its own connection_address in its hosts list. * See hosts_differ_from_seeds.json */ for (size_t i = 0u; i < mc_tpld_servers_const(topology)->items_len; i++) { const mongoc_server_description_t *member = mongoc_set_get_item_const(mc_tpld_servers_const(topology), i); const char *address = member->connection_address; if (!mongoc_server_description_has_rs_member(primary, address)) { _mongoc_array_append_val(&to_remove, member); } } /* now it's safe to call _mongoc_topology_description_remove_server, * even on the primary */ for (size_t i = 0u; i < to_remove.len; i++) { const mongoc_server_description_t *member = _mongoc_array_index(&to_remove, mongoc_server_description_t *, i); _mongoc_topology_description_remove_server(topology, log_and_monitor, member); } _mongoc_array_destroy(&to_remove); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_matches_me -- * * Server Discovery And Monitoring Spec: "Removal from the topology of * seed list members where the "me" property does not match the address * used to connect prevents clients from being able to select a server, * only to fail to re-select that server once the primary has responded. * * Returns: * True if "me" matches "connection_address". * * Side Effects: * None. * *-------------------------------------------------------------------------- */ static bool _mongoc_topology_description_matches_me(const mongoc_server_description_t *server) { BSON_ASSERT(server->connection_address); if (!server->me) { /* "me" is unknown: consider it a match */ return true; } return strcasecmp(server->connection_address, server->me) == 0; } /* *-------------------------------------------------------------------------- * * _mongoc_update_rs_from_primary -- * * First, determine that this is really the primary: * -If this node isn't in the cluster, do nothing. * -If the cluster's set name is null, set it to node's set name. * Otherwise if the cluster's set name is different from node's, * we found a rogue primary, so remove it from the cluster and * check the cluster for a primary, then return. * -If any of the members of cluster reports an address different * from node's, node cannot be the primary. * Now that we know this is the primary: * -If any hosts, passives, or arbiters in node's description aren't * in the cluster, add them as UNKNOWN servers. * -If the cluster has any servers that aren't in node's description, * remove and destroy them. * Finally, check the cluster for the new primary. * * Returns: * None. * * Side effects: * Changes to the cluster, possible removal of cluster nodes. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_update_rs_from_primary(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { mongoc_primary_and_topology_t data; bson_error_t error; BSON_ASSERT(topology); BSON_ASSERT(server); if (!_mongoc_topology_description_has_server(topology, server->connection_address, NULL)) return; /* If server->set_name was null this function wouldn't be called from * mongoc_server_description_handle_hello(). static code analyzers however * don't know that so we check for it explicitly. */ if (server->set_name) { /* 'Server' can only be the primary if it has the right rs name */ if (!topology->set_name) { topology->set_name = bson_strdup(server->set_name); } else if (strcmp(topology->set_name, server->set_name) != 0) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); _update_rs_type(topology); return; } } if (server->max_wire_version >= WIRE_VERSION_6_0) { /* MongoDB 6.0+ */ if (_mongoc_server_description_primary_is_not_stale(topology, server)) { _mongoc_topology_description_set_max_election_id(topology, server); _mongoc_topology_description_set_max_set_version(topology, server); } else { _mongoc_set_error( &error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "member's setVersion or electionId is stale"); mongoc_topology_description_invalidate_server(topology, log_and_monitor, server->id, &error); _update_rs_type(topology); return; } } else { // old comparison rules, namely setVersion is checked before electionId if (mongoc_server_description_has_set_version(server) && mongoc_server_description_has_election_id(server)) { /* Server Discovery And Monitoring Spec: "The client remembers the * greatest electionId reported by a primary, and distrusts primaries * with lesser electionIds. This prevents the client from oscillating * between the old and new primary during a split-brain period." */ if (_mongoc_topology_description_later_election(topology, server)) { // stale primary code return: _mongoc_set_error( &error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "member's setVersion or electionId is stale"); mongoc_topology_description_invalidate_server(topology, log_and_monitor, server->id, &error); _update_rs_type(topology); return; } /* server's electionId >= topology's max electionId */ _mongoc_topology_description_set_max_election_id(topology, server); } if (mongoc_server_description_has_set_version(server) && (!_mongoc_topology_description_has_set_version(topology) || server->set_version > topology->max_set_version)) { _mongoc_topology_description_set_max_set_version(topology, server); } } /* 'Server' is the primary! Invalidate other primaries if found */ data.primary = server; data.topology = topology; mongoc_set_for_each(mc_tpld_servers(topology), _mongoc_topology_description_invalidate_primaries_cb, &data); /* Add to topology description any new servers primary knows about */ _mongoc_topology_description_add_new_servers(topology, log_and_monitor, server); /* Remove from topology description any servers primary doesn't know about */ _mongoc_topology_description_remove_unreported_servers(topology, log_and_monitor, server); /* Finally, set topology type */ _update_rs_type(topology); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_update_rs_without_primary -- * * Update cluster's information when there is no primary. * * Returns: * None. * * Side Effects: * Alters cluster state, may remove node from cluster. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_update_rs_without_primary(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_ASSERT(topology); BSON_ASSERT(server); if (!_mongoc_topology_description_has_server(topology, server->connection_address, NULL)) { return; } /* make sure we're talking about the same replica set */ if (server->set_name) { if (!topology->set_name) { topology->set_name = bson_strdup(server->set_name); } else if (strcmp(topology->set_name, server->set_name) != 0) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); return; } } /* Add new servers that this replica set member knows about */ _mongoc_topology_description_add_new_servers(topology, log_and_monitor, server); /* If this server thinks there is a primary, label it POSSIBLE_PRIMARY */ if (server->current_primary) { _mongoc_topology_description_label_unknown_member( topology, server->current_primary, MONGOC_SERVER_POSSIBLE_PRIMARY); } if (!_mongoc_topology_description_matches_me(server)) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); return; } } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_update_rs_with_primary_from_member -- * * Update cluster's information when there is a primary, but the * update is coming from another replica set member. * * Returns: * None. * * Side Effects: * Alters cluster state. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_update_rs_with_primary_from_member( mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_ASSERT(topology); BSON_ASSERT(server); if (!_mongoc_topology_description_has_server(topology, server->connection_address, NULL)) { return; } /* set_name should never be null here */ if (strcmp(topology->set_name, server->set_name) != 0) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); _update_rs_type(topology); return; } if (!_mongoc_topology_description_matches_me(server)) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); return; } /* If there is no primary, label server's current_primary as the * POSSIBLE_PRIMARY */ if (!_mongoc_topology_description_has_primary(topology) && server->current_primary) { _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_RS_NO_PRIMARY); _mongoc_topology_description_label_unknown_member( topology, server->current_primary, MONGOC_SERVER_POSSIBLE_PRIMARY); } } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_set_topology_type_to_sharded -- * * Sets topology's type to SHARDED. * * Returns: * None * * Side effects: * Alter's topology's type * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_set_topology_type_to_sharded(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_UNUSED(server); BSON_UNUSED(log_and_monitor); _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_SHARDED); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_transition_unknown_to_rs_no_primary -- * * Encapsulates transition from cluster state UNKNOWN to * RS_NO_PRIMARY. Sets the type to RS_NO_PRIMARY, * then updates the replica set accordingly. * * Returns: * None. * * Side effects: * Changes topology state. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_transition_unknown_to_rs_no_primary( mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_RS_NO_PRIMARY); _mongoc_topology_description_update_rs_without_primary(topology, log_and_monitor, server); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_remove_and_check_primary -- * * Remove the server and check if the topology still has a primary. * * Returns: * None. * * Side effects: * Removes server from topology and destroys it. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_remove_and_check_primary(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { _mongoc_topology_description_remove_server(topology, log_and_monitor, server); _update_rs_type(topology); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_update_unknown_with_standalone -- * * If the cluster doesn't contain this server, do nothing. * Otherwise, if the topology only has one seed, change its * type to SINGLE. If the topology has multiple seeds, it does not * include us, so remove this server and destroy it. * * Returns: * None. * * Side effects: * Changes the topology type, might remove server from topology. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_update_unknown_with_standalone(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server) { BSON_ASSERT(topology); BSON_ASSERT(server); if (!_mongoc_topology_description_has_server(topology, server->connection_address, NULL)) return; if (mc_tpld_servers_const(topology)->items_len > 1) { /* This cluster contains other servers, it cannot be a standalone. */ _mongoc_topology_description_remove_server(topology, log_and_monitor, server); } else { _mongoc_topology_description_set_state(topology, MONGOC_TOPOLOGY_SINGLE); } } /* *-------------------------------------------------------------------------- * * This table implements the 'ToplogyType' table outlined in the Server * Discovery and Monitoring spec. Each row represents a server type, * and each column represents the topology type. Given a current topology * type T and a newly-observed server type S, use the function at * state_transions[S][T] to transition to a new state. * * Rows should be read like so: * { server type for this row * UNKNOWN, * SHARDED, * RS_NO_PRIMARY, * RS_WITH_PRIMARY * } * *-------------------------------------------------------------------------- */ typedef void (*transition_t)(mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, const mongoc_server_description_t *server); transition_t gSDAMTransitionTable[MONGOC_SERVER_DESCRIPTION_TYPES][MONGOC_TOPOLOGY_DESCRIPTION_TYPES] = { { /* UNKNOWN */ NULL, /* MONGOC_TOPOLOGY_UNKNOWN */ NULL, /* MONGOC_TOPOLOGY_SHARDED */ NULL, /* MONGOC_TOPOLOGY_RS_NO_PRIMARY */ _mongoc_topology_description_check_if_has_primary /* MONGOC_TOPOLOGY_RS_WITH_PRIMARY */ }, {/* STANDALONE */ _mongoc_topology_description_update_unknown_with_standalone, _mongoc_topology_description_remove_server, _mongoc_topology_description_remove_server, _mongoc_topology_description_remove_and_check_primary}, {/* MONGOS */ _mongoc_topology_description_set_topology_type_to_sharded, NULL, _mongoc_topology_description_remove_server, _mongoc_topology_description_remove_and_check_primary}, {/* POSSIBLE_PRIMARY */ NULL, NULL, NULL, NULL}, {/* PRIMARY */ _mongoc_topology_description_update_rs_from_primary, _mongoc_topology_description_remove_server, _mongoc_topology_description_update_rs_from_primary, _mongoc_topology_description_update_rs_from_primary}, {/* SECONDARY */ _mongoc_topology_description_transition_unknown_to_rs_no_primary, _mongoc_topology_description_remove_server, _mongoc_topology_description_update_rs_without_primary, _mongoc_topology_description_update_rs_with_primary_from_member}, {/* ARBITER */ _mongoc_topology_description_transition_unknown_to_rs_no_primary, _mongoc_topology_description_remove_server, _mongoc_topology_description_update_rs_without_primary, _mongoc_topology_description_update_rs_with_primary_from_member}, {/* RS_OTHER */ _mongoc_topology_description_transition_unknown_to_rs_no_primary, _mongoc_topology_description_remove_server, _mongoc_topology_description_update_rs_without_primary, _mongoc_topology_description_update_rs_with_primary_from_member}, {/* RS_GHOST */ NULL, _mongoc_topology_description_remove_server, NULL, _mongoc_topology_description_check_if_has_primary}}; /* *-------------------------------------------------------------------------- * * _tpld_type_str -- * * Get this topology's type, one of the types defined in the Server * Discovery And Monitoring Spec. * * Returns: * A string. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static const char * _tpld_type_str(mongoc_topology_description_type_t type) { switch (type) { case MONGOC_TOPOLOGY_UNKNOWN: return "Unknown"; case MONGOC_TOPOLOGY_SHARDED: return "Sharded"; case MONGOC_TOPOLOGY_RS_NO_PRIMARY: return "RSNoPrimary"; case MONGOC_TOPOLOGY_RS_WITH_PRIMARY: return "RSWithPrimary"; case MONGOC_TOPOLOGY_SINGLE: return "Single"; case MONGOC_TOPOLOGY_LOAD_BALANCED: return "LoadBalanced"; case MONGOC_TOPOLOGY_DESCRIPTION_TYPES: default: MONGOC_ERROR("Invalid mongoc_topology_description_type_t type"); return "Invalid"; } } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_update_session_timeout -- * * Fill out td.session_timeout_minutes. * * Server Discovery and Monitoring Spec: "set logicalSessionTimeoutMinutes * to the smallest logicalSessionTimeoutMinutes value among all * ServerDescriptions of known ServerType. If any ServerDescription of * known ServerType has a null logicalSessionTimeoutMinutes, then * logicalSessionTimeoutMinutes MUST be set to null." * * -------------------------------------------------------------------------- */ static void _mongoc_topology_description_update_session_timeout(mongoc_topology_description_t *td) { mongoc_set_t *set; mongoc_server_description_t *sd; set = mc_tpld_servers(td); td->session_timeout_minutes = MONGOC_NO_SESSIONS; for (size_t i = 0; i < set->items_len; i++) { sd = (mongoc_server_description_t *)mongoc_set_get_item(set, i); if (!_is_data_node(sd)) { continue; } if (sd->session_timeout_minutes == MONGOC_NO_SESSIONS) { td->session_timeout_minutes = MONGOC_NO_SESSIONS; return; } else if (td->session_timeout_minutes == MONGOC_NO_SESSIONS) { td->session_timeout_minutes = sd->session_timeout_minutes; } else if (td->session_timeout_minutes > sd->session_timeout_minutes) { td->session_timeout_minutes = sd->session_timeout_minutes; } } } /* *-------------------------------------------------------------------------- * * _mongoc_topology_description_check_compatible -- * * Fill out td.compatibility_error if any server's wire versions do * not overlap with ours. Otherwise clear td.compatibility_error. * * If any server is incompatible, the topology as a whole is considered * incompatible. * *-------------------------------------------------------------------------- */ static void _mongoc_topology_description_check_compatible(mongoc_topology_description_t *td) { mongoc_set_t const *const servers = mc_tpld_servers_const(td); memset(&td->compatibility_error, 0, sizeof(bson_error_t)); for (size_t i = 0; i < servers->items_len; i++) { mongoc_server_description_t const *const sd = mongoc_set_get_item_const(servers, i); if (sd->type == MONGOC_SERVER_UNKNOWN || sd->type == MONGOC_SERVER_POSSIBLE_PRIMARY) { continue; } if (sd->min_wire_version > WIRE_VERSION_MAX) { _mongoc_set_error(&td->compatibility_error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Server at %s requires wire version %d," " but this version of libmongoc only supports up to %d", sd->host.host_and_port, sd->min_wire_version, WIRE_VERSION_MAX); } else if (sd->max_wire_version < WIRE_VERSION_MIN) { _mongoc_set_error(&td->compatibility_error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Server at %s reports wire version %d, but this" " version of libmongoc requires at least %d (MongoDB %s)", sd->host.host_and_port, sd->max_wire_version, WIRE_VERSION_MIN, _mongoc_wire_version_to_server_version(WIRE_VERSION_MIN)); } } } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_handle_hello -- * * Handle a hello. This is called by the background SDAM process, * and by client when performing a handshake or invalidating servers. * If there was an error calling hello, pass it in as @error. * *-------------------------------------------------------------------------- */ void mongoc_topology_description_handle_hello( mongoc_topology_description_t *topology, const mongoc_log_and_monitor_instance_t *log_and_monitor, uint32_t server_id, const bson_t *hello_response, int64_t rtt_msec, mongoc_topology_description_hello_cluster_time_strategy_t cluster_time_strategy, const bson_error_t *error /* IN */) { mongoc_topology_description_t *prev_td = NULL; mongoc_server_description_t *prev_sd = NULL; mongoc_server_description_t *sd; bson_iter_t iter; /* sd_changed is set if the server description meaningfully changed AND * callbacks are registered. */ bool sd_changed = false; BSON_ASSERT(topology); BSON_ASSERT(server_id != 0); sd = mongoc_topology_description_server_by_id(topology, server_id, NULL); if (!sd) { return; /* server already removed from topology */ } if (log_and_monitor->apm_callbacks.topology_changed) { prev_td = BSON_ALIGNED_ALLOC0(mongoc_topology_description_t); _mongoc_topology_description_copy_to(topology, prev_td); } if (hello_response && bson_iter_init_find(&iter, hello_response, "topologyVersion") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { bson_t incoming_topology_version; const uint8_t *bytes; uint32_t len; bson_iter_document(&iter, &len, &bytes); BSON_ASSERT(bson_init_static(&incoming_topology_version, bytes, len)); if (mongoc_server_description_topology_version_cmp(&sd->topology_version, &incoming_topology_version) == 1) { TRACE("%s", "topology version is strictly less. Skipping."); if (prev_td) { mongoc_topology_description_cleanup(prev_td); bson_free(prev_td); } return; } } if (log_and_monitor->apm_callbacks.topology_changed || log_and_monitor->apm_callbacks.server_changed) { /* Only copy the previous server description if a monitoring callback is * registered. */ prev_sd = mongoc_server_description_new_copy(sd); } DUMP_BSON(hello_response); /* pass the current error in */ mongoc_server_description_handle_hello(sd, hello_response, rtt_msec, error); /* if the user specified a set_name in the connection string * and they are in topology type single, check that the set name * matches. */ if (topology->set_name && topology->type == MONGOC_TOPOLOGY_SINGLE) { bool wrong_set_name = false; bson_error_t set_name_err = {0}; if (!sd->set_name) { wrong_set_name = true; _mongoc_set_error(&set_name_err, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "no reported set name, but expected '%s'", topology->set_name); } else if (0 != strcmp(sd->set_name, topology->set_name)) { wrong_set_name = true; _mongoc_set_error(&set_name_err, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "reported set name '%s' does not match '%s'", sd->set_name, topology->set_name); } if (wrong_set_name) { /* Replace with unknown. */ TRACE("%s", "wrong set name"); mongoc_server_description_handle_hello(sd, NULL, MONGOC_RTT_UNSET, &set_name_err); } } if (cluster_time_strategy == MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE) { mongoc_topology_description_update_cluster_time(topology, hello_response); } if (prev_sd) { sd_changed = !_mongoc_server_description_equal(prev_sd, sd); } if (sd_changed) { _mongoc_topology_description_monitor_server_changed(topology, log_and_monitor, prev_sd, sd); } if (gSDAMTransitionTable[sd->type][topology->type]) { TRACE("Topology description %s handling server description %s", _tpld_type_str(topology->type), mongoc_server_description_type(sd)); gSDAMTransitionTable[sd->type][topology->type](topology, log_and_monitor, sd); } else { TRACE("Topology description %s ignoring server description %s", _tpld_type_str(topology->type), mongoc_server_description_type(sd)); } _mongoc_topology_description_update_session_timeout(topology); /* Don't bother checking wire version compatibility if we already errored */ if (hello_response && (!error || !error->code)) { _mongoc_topology_description_check_compatible(topology); } /* If server description did not change, then neither did topology * description */ if (sd_changed) { _mongoc_topology_description_monitor_changed(prev_td, topology, log_and_monitor); } if (prev_td) { mongoc_topology_description_cleanup(prev_td); bson_free(prev_td); } mongoc_server_description_destroy(prev_sd); } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_has_readable_server -- * * SDAM Monitoring Spec: * "Determines if the topology has a readable server available." * * NOTE: this method should only be called by user code in an SDAM * Monitoring callback. * *-------------------------------------------------------------------------- */ bool mongoc_topology_description_has_readable_server(const mongoc_topology_description_t *td, const mongoc_read_prefs_t *prefs) { bson_error_t error; if (!mongoc_topology_compatible(td, NULL, &error)) { return false; } /* local threshold argument doesn't matter */ return mongoc_topology_description_select(td, MONGOC_SS_READ, prefs, NULL, NULL, 0) != NULL; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_has_writable_server -- * * SDAM Monitoring Spec: * "Determines if the topology has a writable server available." * * NOTE: this method should only be called by user code in an SDAM * Monitoring callback. * *-------------------------------------------------------------------------- */ bool mongoc_topology_description_has_writable_server(const mongoc_topology_description_t *td) { bson_error_t error; if (!mongoc_topology_compatible(td, NULL, &error)) { return false; } return mongoc_topology_description_select(td, MONGOC_SS_WRITE, NULL, NULL, NULL, 0) != NULL; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_type -- * * Get this topology's type, one of the types defined in the Server * Discovery And Monitoring Spec. * * NOTE: this method should only be called by user code in an SDAM * Monitoring callback. * * Returns: * A string. * *-------------------------------------------------------------------------- */ const char * mongoc_topology_description_type(const mongoc_topology_description_t *td) { switch (td->type) { case MONGOC_TOPOLOGY_UNKNOWN: return "Unknown"; case MONGOC_TOPOLOGY_SHARDED: return "Sharded"; case MONGOC_TOPOLOGY_RS_NO_PRIMARY: return "ReplicaSetNoPrimary"; case MONGOC_TOPOLOGY_RS_WITH_PRIMARY: return "ReplicaSetWithPrimary"; case MONGOC_TOPOLOGY_SINGLE: return "Single"; case MONGOC_TOPOLOGY_LOAD_BALANCED: return "LoadBalanced"; case MONGOC_TOPOLOGY_DESCRIPTION_TYPES: default: fprintf(stderr, "ERROR: Unknown topology type %d\n", (int)td->type); BSON_ASSERT(0); } return NULL; } /* *-------------------------------------------------------------------------- * * mongoc_topology_description_get_servers -- * * Fetch an array of server descriptions for all known servers in the * topology. * * Returns: * An array you must free with mongoc_server_descriptions_destroy_all. * *-------------------------------------------------------------------------- */ mongoc_server_description_t ** mongoc_topology_description_get_servers(const mongoc_topology_description_t *td, size_t *n /* OUT */) { const mongoc_set_t *const set = mc_tpld_servers_const(BSON_ASSERT_PTR_INLINE(td)); /* enough room for all descriptions, even if some are unknown */ mongoc_server_description_t **sds = BSON_ARRAY_ALLOC0(set->items_len, mongoc_server_description_t *); BSON_ASSERT_PARAM(n); *n = 0; for (size_t i = 0; i < set->items_len; ++i) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(set, i); if (sd->type != MONGOC_SERVER_UNKNOWN) { sds[*n] = mongoc_server_description_new_copy(sd); ++(*n); } } return sds; } typedef struct { mongoc_host_list_t *host_list; size_t num_missing; } _count_num_hosts_to_remove_ctx_t; static bool _count_num_hosts_to_remove(void *sd_void, void *ctx_void) { mongoc_server_description_t *sd; _count_num_hosts_to_remove_ctx_t *ctx; mongoc_host_list_t *host_list; sd = sd_void; ctx = ctx_void; host_list = ctx->host_list; if (!_mongoc_host_list_contains_one(host_list, &sd->host)) { ++ctx->num_missing; } return true; } typedef struct { mongoc_host_list_t *host_list; mongoc_topology_description_t *td; const mongoc_log_and_monitor_instance_t *log_and_monitor; } _remove_if_not_in_host_list_ctx_t; static bool _remove_if_not_in_host_list_cb(void *sd_void, void *ctx_void) { _remove_if_not_in_host_list_ctx_t *ctx; mongoc_topology_description_t *td; mongoc_server_description_t *sd; mongoc_host_list_t *host_list; ctx = ctx_void; sd = sd_void; host_list = ctx->host_list; td = ctx->td; if (_mongoc_host_list_contains_one(host_list, &sd->host)) { return true; } _mongoc_topology_description_remove_server(td, ctx->log_and_monitor, sd); return true; } void mongoc_topology_description_reconcile(mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_host_list_t *host_list) { mongoc_set_t *servers; size_t host_list_length; size_t num_missing; BSON_ASSERT_PARAM(td); servers = mc_tpld_servers(td); host_list_length = _mongoc_host_list_length(host_list); /* Avoid removing all servers in topology, even temporarily, by deferring * actual removal until after new hosts have been added. */ { _count_num_hosts_to_remove_ctx_t ctx; ctx.host_list = host_list; ctx.num_missing = 0u; mongoc_set_for_each(servers, _count_num_hosts_to_remove, &ctx); num_missing = ctx.num_missing; } /* Polling SRV Records for mongos Discovery Spec: If srvMaxHosts is zero or * greater than or equal to the number of valid hosts, each valid new host * MUST be added to the topology as Unknown. */ if (td->max_hosts == 0 || (size_t)td->max_hosts >= host_list_length) { mongoc_host_list_t *host; LL_FOREACH(host_list, host) { /* "add" is really an "upsert" */ mongoc_topology_description_add_server(td, log_and_monitor, host->host_and_port, NULL); } } /* Polling SRV Records for mongos Discovery Spec: If srvMaxHosts is greater * than zero and less than the number of valid hosts, valid new hosts MUST be * randomly selected and added to the topology as Unknown until the topology * has srvMaxHosts hosts. */ else { const size_t max_with_missing = td->max_hosts + num_missing; size_t idx = 0u; size_t hl_array_size = 0u; /* Polling SRV Records for mongos Discovery Spec: Drivers MUST use the * same randomization algorithm as they do for initial selection. * Do not limit size of results yet (pass host_list_length) as we want to * update any existing hosts in the topology, but add new hosts. */ const mongoc_host_list_t *const *hl_array = _mongoc_apply_srv_max_hosts(host_list, host_list_length, &hl_array_size); for (idx = 0u; servers->items_len < max_with_missing && idx < hl_array_size; ++idx) { const mongoc_host_list_t *const elem = hl_array[idx]; /* "add" is really an "upsert" */ mongoc_topology_description_add_server(td, log_and_monitor, elem->host_and_port, NULL); } /* There should not be a situation where all items in the valid host list * were traversed without the number of hosts in the topology reaching * srvMaxHosts. */ BSON_ASSERT(servers->items_len == max_with_missing); bson_free((void *)hl_array); } /* Polling SRV Records for mongos Discovery Spec: For all verified host * names, as returned through the DNS SRV query, the driver MUST remove * all hosts that are part of the topology, but are no longer in the * returned set of valid hosts. */ { _remove_if_not_in_host_list_ctx_t ctx; ctx.host_list = host_list; ctx.td = td; ctx.log_and_monitor = log_and_monitor; mongoc_set_for_each(servers, _remove_if_not_in_host_list_cb, &ctx); } /* At this point, the number of hosts in the host list should not exceed * srvMaxHosts. */ BSON_ASSERT(td->max_hosts == 0 || servers->items_len <= (size_t)td->max_hosts); } void _mongoc_topology_description_clear_connection_pool(mongoc_topology_description_t *td, uint32_t server_id, const bson_oid_t *service_id) { mongoc_server_description_t *sd; bson_error_t error; BSON_ASSERT(service_id); sd = mongoc_topology_description_server_by_id(td, server_id, &error); if (!sd) { /* Server removed, ignore and ignore error. */ return; } TRACE("clearing pool for server: %s", sd->host.host_and_port); mc_tpl_sd_increment_generation(sd, service_id); } void mongoc_deprioritized_servers_add_if_sharded(mongoc_deprioritized_servers_t *ds, mongoc_topology_description_type_t topology_type, const mongoc_server_description_t *sd) { // In a sharded cluster, the server on which the operation failed MUST // be provided to the server selection mechanism as a deprioritized // server. if (topology_type == MONGOC_TOPOLOGY_SHARDED) { TRACE("deprioritization: add to list: %s (id: %" PRIu32 ")", sd->host.host_and_port, sd->id); mongoc_deprioritized_servers_add(ds, sd); } } bool mongoc_topology_description_append_contents_to_bson(const mongoc_topology_description_t *td, bson_t *bson, mongoc_topology_description_content_flags_t flags, mongoc_server_description_content_flags_t servers_flags) { // Follow the language-independent format from the SDAM spec. if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_TYPE) && !BSON_APPEND_UTF8(bson, "type", mongoc_topology_description_type(td))) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SET_NAME) && td->set_name && !BSON_APPEND_UTF8(bson, "setName", td->set_name)) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_ELECTION_ID) && !mcommon_oid_is_zero(&td->max_election_id) && !BSON_APPEND_OID(bson, "maxElectionId", &td->max_election_id)) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_MAX_SET_VERSION) && MONGOC_NO_SET_VERSION != td->max_set_version && !BSON_APPEND_INT64(bson, "maxSetVersion", td->max_set_version)) { return false; } if (flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SERVERS) { const mongoc_set_t *const set = mc_tpld_servers_const(BSON_ASSERT_PTR_INLINE(td)); bson_array_builder_t *array; if (BSON_APPEND_ARRAY_BUILDER_BEGIN(bson, "servers", &array)) { bool ok = true; for (size_t i = 0; ok && i < set->items_len; i++) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(set, i); bson_t child; if (!bson_array_builder_append_document_begin(array, &child)) { ok = false; } else { ok &= mongoc_server_description_append_contents_to_bson(sd, &child, servers_flags); ok &= bson_array_builder_append_document_end(array, &child); } } if (!bson_append_array_builder_end(bson, array) || !ok) { return false; } } else { return false; } } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_STALE) && !BSON_APPEND_BOOL(bson, "stale", td->stale)) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBLE) && !BSON_APPEND_BOOL(bson, "compatible", td->compatibility_error.code == 0)) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_COMPATIBILITY_ERROR) && 0 != td->compatibility_error.code && !BSON_APPEND_UTF8(bson, "compatibilityError", td->compatibility_error.message)) { return false; } if ((flags & MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_LOGICAL_SESSION_TIMEOUT_MINUTES) && MONGOC_NO_SESSIONS != td->session_timeout_minutes && !BSON_APPEND_INT64(bson, "logicalSessionTimeoutMinutes", td->session_timeout_minutes)) { return false; } return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-description.h000066400000000000000000000035071511661753600270230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_DESCRIPTION_H #define MONGOC_TOPOLOGY_DESCRIPTION_H #include #include #include #include BSON_BEGIN_DECLS typedef struct _mongoc_topology_description_t mongoc_topology_description_t; MONGOC_EXPORT(void) mongoc_topology_description_destroy(mongoc_topology_description_t *description); MONGOC_EXPORT(mongoc_topology_description_t *) mongoc_topology_description_new_copy(const mongoc_topology_description_t *description) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(bool) mongoc_topology_description_has_readable_server(const mongoc_topology_description_t *td, const mongoc_read_prefs_t *prefs); MONGOC_EXPORT(bool) mongoc_topology_description_has_writable_server(const mongoc_topology_description_t *td); MONGOC_EXPORT(const char *) mongoc_topology_description_type(const mongoc_topology_description_t *td); MONGOC_EXPORT(mongoc_server_description_t **) mongoc_topology_description_get_servers(const mongoc_topology_description_t *td, size_t *n) BSON_GNUC_WARN_UNUSED_RESULT; BSON_END_DECLS #endif /* MONGOC_TOPOLOGY_DESCRIPTION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-private.h000066400000000000000000000567221511661753600261610ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_PRIVATE_H #define MONGOC_TOPOLOGY_PRIVATE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS 500 #define MONGOC_TOPOLOGY_SOCKET_CHECK_INTERVAL_MS 5000 #define MONGOC_TOPOLOGY_COOLDOWN_MS 5000 #define MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS 15 #define MONGOC_TOPOLOGY_SERVER_SELECTION_TIMEOUT_MS 30000 #define MONGOC_TOPOLOGY_HEARTBEAT_FREQUENCY_MS_MULTI_THREADED 10000 #define MONGOC_TOPOLOGY_HEARTBEAT_FREQUENCY_MS_SINGLE_THREADED 60000 #define MONGOC_TOPOLOGY_MIN_RESCAN_SRV_INTERVAL_MS 60000 typedef enum { MONGOC_TOPOLOGY_SCANNER_OFF, MONGOC_TOPOLOGY_SCANNER_BG_RUNNING, MONGOC_TOPOLOGY_SCANNER_SHUTTING_DOWN } mongoc_topology_scanner_state_t; typedef enum mongoc_topology_cse_state_t { MONGOC_CSE_DISABLED, MONGOC_CSE_STARTING, MONGOC_CSE_ENABLED, } mongoc_topology_cse_state_t; struct _mongoc_background_monitor_t; struct _mongoc_client_pool_t; struct mongoc_structured_log_instance_t; typedef enum { MONGOC_RR_SRV, MONGOC_RR_TXT } mongoc_rr_type_t; typedef struct _mongoc_rr_data_t { /* Number of records returned by DNS. */ uint32_t count; /* Set to lowest TTL found when polling SRV records. */ uint32_t min_ttl; /* Set to the resulting host list when polling SRV records */ mongoc_host_list_t *hosts; /* Set to the TXT record when polling for TXT */ char *txt_record_opts; } mongoc_rr_data_t; struct _mongoc_topology_t; MONGOC_DECL_SPECIAL_TS_POOL(mongoc_server_session_t, mongoc_server_session_pool, struct _mongoc_topology_t, /* ctor/dtor/prune are defined in the new_with_params call */ NULL, NULL, NULL) typedef bool (*_mongoc_rr_resolver_fn)(const char *hostname, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error); /** * @brief A reference-counted reference to a topology description. * * The referred-to topology description should be access via the `.ptr` member * of this object. */ typedef union mc_shared_tpld { /* Private: The reference-counted shared pointer that manages the topology * description. */ mongoc_shared_ptr _sptr_; /** The pointed-to topology description */ mongoc_topology_description_t const *ptr; } mc_shared_tpld; /** A null-pointer initializer for an `mc_shared_tpld` */ #define MC_SHARED_TPLD_NULL ((mc_shared_tpld){._sptr_ = MONGOC_SHARED_PTR_NULL}) typedef struct _mongoc_topology_t { /** * @brief The topology description. Do not access directly. Instead, use * mc_tpld_take_ref() */ mc_shared_tpld _shared_descr_; /* topology->uri is initialized as a copy of the client/pool's URI. * For a "mongodb+srv://" URI, topology->uri is then updated in * mongoc_topology_new() after initial seedlist discovery. */ mongoc_uri_t *uri; mongoc_topology_scanner_t *scanner; bool server_selection_try_once; int64_t last_scan; int64_t local_threshold_msec; int64_t connect_timeout_msec; int64_t server_selection_timeout_msec; /* defaults to 500ms, configurable by tests */ int64_t min_heartbeat_frequency_msec; /* Minimum of SRV record TTLs, but no lower than 60 seconds. * May be zero for non-SRV/non-MongoS topology. * DO NOT access directly: use the accessor methods to get/set the value. */ int64_t _atomic_srv_polling_rescan_interval_ms; int64_t srv_polling_last_scan_ms; /* For multi-threaded, srv polling occurs in a separate thread. */ bson_thread_t srv_polling_thread; bson_mutex_t srv_polling_mtx; mongoc_cond_t srv_polling_cond; /** * @brief Signal for background monitoring threads to signal stop/shutdown. * * The values stored are mongoc_topology_scanner_state_t values */ int scanner_state; /** * @brief This lock is held in order to serialize operations that modify the * topology description. It *should not* be held while performing read-only * operations on the topology. * * This mutex is also used by server selection to synchronize with threads * that may update the topology following a failed server selection. It is * used in conjunction with `cond_client`. This protects _shared_descr_, as * well as the server_monitors and rtt_monitors. */ bson_mutex_t tpld_modification_mtx; /** * @brief Condition variable used to signal client threads that the topology * has been updated by another thread. This CV should be used with * tpld_modification_mtx, as it signals modifications to the topology. * * Note that mc_tpld_modify_begin/commit/drop will acquire/release * tpld_modification_mtx as well. */ mongoc_cond_t cond_client; bool single_threaded; bool stale; mongoc_server_session_pool session_pool; /* Is client side encryption enabled? */ mongoc_topology_cse_state_t cse_state; bool is_srv_polling; #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION _mongoc_crypt_t *crypt; struct _mongoc_client_t *mongocryptd_client; /* single threaded */ struct _mongoc_client_t *keyvault_client; /* single threaded */ struct _mongoc_client_pool_t *mongocryptd_client_pool; /* multi threaded */ struct _mongoc_client_pool_t *keyvault_client_pool; /* multi threaded */ char *keyvault_db; char *keyvault_coll; bool bypass_auto_encryption; bool mongocryptd_bypass_spawn; char *mongocryptd_spawn_path; bson_t *mongocryptd_spawn_args; bool bypass_query_analysis; #endif struct { struct { struct { char *cryptSharedLibPath; bool cryptSharedLibRequired; } extraOptions; } autoOptions; } clientSideEncryption; // Corresponds to AutoEncryptionOpts.encryptedFieldsMap. bson_t *encrypted_fields_map; /* For background monitoring. */ mongoc_set_t *server_monitors; mongoc_set_t *rtt_monitors; // APM callbacks, structured logging handlers and callbacks. // Documented as per-client and per-pool, implemented as owned by topology_t. mongoc_log_and_monitor_instance_t log_and_monitor; /* This is overridable for SRV polling tests to mock DNS records. */ _mongoc_rr_resolver_fn rr_resolver; /* valid is false when mongoc_topology_new failed to construct a valid * topology. This could occur if the URI is invalid. * An invalid topology does not monitor servers. */ bool valid; // `usleep_fn` and `usleep_data` may be overridden by // `mongoc_client_set_usleep_impl`. mongoc_usleep_func_t usleep_fn; void *usleep_data; // `srv_prefer_tcp` determines if DNS lookup for SRV tries TCP first instead of UDP. // DNS implementations are expected to try UDP first, then retry with TCP if the UDP response indicates truncation. // Some DNS servers truncate UDP responses without setting the truncated (TC) flag. This may result in no TCP retry. bool srv_prefer_tcp; // `oidc_cache` implements the OIDC spec "Client Cache". It is shared among all pooled clients. mongoc_oidc_cache_t *oidc_cache; } mongoc_topology_t; mongoc_topology_t * mongoc_topology_new(const mongoc_uri_t *uri, bool single_threaded); void mongoc_topology_set_structured_log_opts(mongoc_topology_t *topology, const mongoc_structured_log_opts_t *opts); void mongoc_topology_destroy(mongoc_topology_t *topology); void mongoc_topology_reconcile(const mongoc_topology_t *topology, mongoc_topology_description_t *td); bool mongoc_topology_compatible(const mongoc_topology_description_t *td, const mongoc_read_prefs_t *read_prefs, bson_error_t *error); /** * @brief Select a server description for an operation. May scan and update the * topology. * * A server description might be returned that matches the given `optype` and * `read_prefs`. If the topology is out-of-date or due for a scan, then this * function will perform a scan and update the topology accordingly. If no * matching server is found, returns a NULL pointer. * * @param topology The topology to inspect and/or update. * @param optype The operation that is intended to be performed. * @param log_context Additional contextual information used only to support standardized logging. * @param read_prefs The read preferences for the command. * @param must_use_primary An optional output parameter. Server selection might * need to override the caller's read preferences' read mode to 'primary'. * Whether or not that takes place will be set through this pointer. * @param error An output parameter for any error information. * @return mongoc_server_description_t* A copy of the topology's server * description that matches the request, or NULL if there is no such server. * * @note The returned object is a COPY, and should be released with * `mongoc_server_description_destroy()` * * @note This function may update the topology description. */ mongoc_server_description_t * mongoc_topology_select(mongoc_topology_t *topology, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, bool *must_use_primary, bson_error_t *error); /** * @brief Obtain the integral ID of a server description matching the requested * ops. * * Refer to @see mongoc_topology_select() for more information * * @param topology The topology to inspect and/or update. * @param optype The operation that is intended to be performed. * @param log_context Additional contextual information used only to support standardized logging. * @param read_prefs The read preferences for the command. * @param must_use_primary An optional output parameter. Server selection might * need to override the caller's read preferences' read mode to 'primary'. * Whether or not that takes place will be set through this pointer. * @param ds A list of servers that should be selected only if there are no * other suitable servers. * @param error An output parameter for any error information. * @return uint32_t A non-zero integer ID of the server description. In case of * error, sets `error` and returns zero. * * @note This function may update the topology description. */ uint32_t mongoc_topology_select_server_id(mongoc_topology_t *topology, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, bson_error_t *error); /** * @brief Return a new mongoc_host_list_t for the given server matching the * given ID. * * @param topology The topology description to inspect * @param id The ID of a server in the topology * @param error Output error information * @return mongoc_host_list_t* A new host list, or NULL on error * * @note The returned list should be freed with * `_mongoc_host_list_destroy_all()` */ mongoc_host_list_t * _mongoc_topology_host_by_id(const mongoc_topology_description_t *topology, uint32_t id, bson_error_t *error); /** * @brief Update the topology from the response to a handshake on a new * application connection. * * @note Only applicable to a client pool (single-threaded clients reuse * monitoring connections). * * @param topology The topology that will be updated. * @param sd The server description that contains the hello response. * @return true If the server is valid in the topology. * @return false If the server was already removed from the topology. */ bool _mongoc_topology_update_from_handshake(mongoc_topology_t *topology, const mongoc_server_description_t *sd); void _mongoc_topology_update_last_used(mongoc_topology_t *topology, uint32_t server_id); int64_t mongoc_topology_server_timestamp(mongoc_topology_t *topology, uint32_t id); /** * @brief Get the current type of the topology */ mongoc_topology_description_type_t _mongoc_topology_get_type(const mongoc_topology_t *topology); bool _mongoc_topology_set_appname(mongoc_topology_t *topology, const char *appname); void _mongoc_topology_update_cluster_time(mongoc_topology_t *topology, const bson_t *reply); mongoc_server_session_t * _mongoc_topology_pop_server_session(mongoc_topology_t *topology, const mongoc_ss_log_context_t *log_context, bson_error_t *error); void _mongoc_topology_push_server_session(mongoc_topology_t *topology, mongoc_server_session_t *server_session); bool _mongoc_topology_end_sessions_cmd(mongoc_topology_t *topology, bson_t *cmd); void _mongoc_topology_do_blocking_scan(mongoc_topology_t *topology, bson_error_t *error); /** * @brief Duplicate the handshake command of the topology scanner. * * @param topology The topology to inspect. * @param copy_into The destination of the copy. Should be uninitialized storage * for a bson_t. * * @note This API will lazily construct the handshake command for the scanner. * * @note This is called at the start of the scan in * _mongoc_topology_run_background, when a node is added in * _mongoc_topology_reconcile_add_nodes, or when running a hello directly on a * node in _mongoc_stream_run_hello. */ void _mongoc_topology_dup_handshake_cmd(const mongoc_topology_t *topology, bson_t *copy_into); void _mongoc_topology_request_scan(mongoc_topology_t *topology); void _mongoc_topology_bypass_cooldown(mongoc_topology_t *topology); typedef enum { MONGOC_SDAM_APP_ERROR_COMMAND, MONGOC_SDAM_APP_ERROR_NETWORK, MONGOC_SDAM_APP_ERROR_TIMEOUT } _mongoc_sdam_app_error_type_t; /** * @brief Handle an error from an app connection * * Processes network errors, timeouts, and command replies. * * @param topology The topology that will be updated * @param server_id The ID of the server on which the error occurred. * @param handshake_complete Whether the handshake was complete for this server * @param type The type of error to process * @param reply If checking for a command error, the server reply. Otherwise * NULL * @param why An error that will be attached to the server description * @param generation The generation of the server description the caller was * using. * @param service_id A service ID for a load-balanced deployment. If not * applicable, pass kZeroObjectId. * @return true If the topology was updated and the pool was cleared. * @return false If no modifications were made and the error was ignored. * * @note May update the topology description. */ bool _mongoc_topology_handle_app_error(mongoc_topology_t *topology, uint32_t server_id, bool handshake_complete, _mongoc_sdam_app_error_type_t type, const bson_t *reply, const bson_error_t *why, uint32_t generation, const bson_oid_t *service_id); void mongoc_topology_rescan_srv(mongoc_topology_t *topology); bool mongoc_topology_should_rescan_srv(mongoc_topology_t *topology); /* _mongoc_topology_set_rr_resolver is called by tests to mock DNS responses for * SRV polling. * This is necessarily called after initial seedlist discovery completes in * mongoc_topology_new. * Callers should call this before monitoring starts. */ void _mongoc_topology_set_rr_resolver(mongoc_topology_t *topology, _mongoc_rr_resolver_fn rr_resolver); /** * @brief Thread-safe update the SRV polling rescan interval on the given topology */ static BSON_INLINE void _mongoc_topology_set_srv_polling_rescan_interval_ms(mongoc_topology_t *topology, int64_t val) { mcommon_atomic_int64_exchange(&topology->_atomic_srv_polling_rescan_interval_ms, val, mcommon_memory_order_seq_cst); } /** * @brief Thread-safe get the SRV polling interval */ static BSON_INLINE int64_t _mongoc_topology_get_srv_polling_rescan_interval_ms(mongoc_topology_t const *topology) { return mcommon_atomic_int64_fetch(&topology->_atomic_srv_polling_rescan_interval_ms, mcommon_memory_order_seq_cst); } /** * @brief Return the latest connection generation for the server_id and/or * service_id. * * Use this generation for newly established connections. * * @param td The topology that contains the server * @param server_id The ID of the server to inspect * @param service_id The service ID of the connection if applicable, or * kZeroObjectId. * @returns uint32_t A generation counter for the given server, or zero if the * server does not exist in the topology. */ uint32_t _mongoc_topology_get_connection_pool_generation(const mongoc_topology_description_t *td, uint32_t server_id, const bson_oid_t *service_id); /** * @brief Obtain a reference to the current topology description for the given * topology. * * Returns a ref-counted reference to the topology description. The returned * reference must later be released with mc_tpld_drop_ref(). The contents of the * topology description are immutable. */ static BSON_INLINE mc_shared_tpld mc_tpld_take_ref(const mongoc_topology_t *tpl) { return (mc_shared_tpld){._sptr_ = mongoc_atomic_shared_ptr_load(&tpl->_shared_descr_._sptr_)}; } /** * @brief Release a reference to a topology description obtained via * mc_tpld_take_ref(). * * The pointed-to shared reference will be reset to NULL. */ static BSON_INLINE void mc_tpld_drop_ref(mc_shared_tpld *p) { mongoc_shared_ptr_reset_null(&p->_sptr_); } /** * @brief Refresh a reference to a topology description for the given topology. * * @param td Pointer-to-shared-pointer of the topology description * @param tpl The topology to query. * * The pointed-to shared pointer will be modified to refer to the topology * description of the topology. * * Equivalent to a call to `mc_tpld_drop_ref()` followed by a call to * `mc_tpld_take_ref()`. */ static BSON_INLINE void mc_tpld_renew_ref(mc_shared_tpld *td, mongoc_topology_t *tpl) { mc_tpld_drop_ref(td); *td = mc_tpld_take_ref(tpl); } /** * @brief A pending topology description modification. * * Create an instance using `mc_tpld_modify_begin()`. */ typedef struct mc_tpld_modification { /** The new topology. Modifications should be applied to this topology * description. Those modifications will be published by * `mc_tpld_modify_commit()`. */ mongoc_topology_description_t *new_td; /** The topology that owns the topology description */ mongoc_topology_t *topology; } mc_tpld_modification; /** * @brief Begin a new modification transaction of the topology description owned * by `tpl` * * @return mc_tpld_modification A pending modification. * * @note MUST be followed by a call to `mc_tpld_modify_commit` OR * `mc_tpld_modify_drop` * * @note THIS FUNCTION MAY BLOCK: This call takes a lock, which will only be * released by mc_tpld_modify_commit() or mc_tpld_modify_drop(). Do not call * this API while the current thread is already performing a modification! */ mc_tpld_modification mc_tpld_modify_begin(mongoc_topology_t *tpl); /** * @brief Commit a topology description modification to the owning topology. * * All later calls to mc_tpld_take_ref() will see the new topology. */ void mc_tpld_modify_commit(mc_tpld_modification); /** * @brief Drop a pending modification to a topology description. No changes will * be made to the topology. */ void mc_tpld_modify_drop(mc_tpld_modification); /** * @brief Obtain a pointer-to-mutable mongoc_topology_description_t for the * given topology. * * This call is "unsafe" as the returned pointer may be invalidated by * concurrent modifications done using mc_tpld_modify_begin() and * mc_tpld_modify_commit(). * * To obtain a safe pointer to the topology description, use mc_tpld_take_ref(). */ static BSON_INLINE mongoc_topology_description_t * mc_tpld_unsafe_get_mutable(mongoc_topology_t *tpl) { return tpl->_shared_descr_._sptr_.ptr; } /** * @brief Obtain a pointer-to-const mongoc_topology_description_t for the * given topology. * * This call is "unsafe" as the returned pointer may be invalidated by * concurrent modifications done using mc_tpld_modify_begin() and * mc_tpld_modify_commit(). * * To obtain a safe pointer to the topology description, use mc_tpld_take_ref(). * * @return const mongoc_topology_description_t* Pointer to the topology * description for the given topology. */ static BSON_INLINE const mongoc_topology_description_t * mc_tpld_unsafe_get_const(const mongoc_topology_t *tpl) { return tpl->_shared_descr_._sptr_.ptr; } /** * @brief Directly invalidate a server in the topology by its ID. * * This is intended for testing purposes, as it provides thread-safe * direct topology modification. * * @param topology The topology to modify. * @param server_id The ID of a server in the topology. */ static BSON_INLINE void _mongoc_topology_invalidate_server(mongoc_topology_t *topology, uint32_t server_id) { bson_error_t error; mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); _mongoc_set_error(&error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "invalidated"); mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, &error); mc_tpld_modify_commit(tdmod); } /* Return an array view to `max_hosts` or fewer elements of `hl`, or NULL if * `hl` is empty. The size of the returned array is written to `hl_array_size` * even if `hl` is empty. * * The returned array must be freed with `bson_free()`. The elements of the * array must not be freed, as they are still owned by `hl`. */ const mongoc_host_list_t ** _mongoc_apply_srv_max_hosts(const mongoc_host_list_t *hl, size_t max_hosts, size_t *hl_array_size); /* Returns true if a versioned server API has been selected, otherwise returns * false. */ bool mongoc_topology_uses_server_api(const mongoc_topology_t *topology); /* Returns true if load balancing mode has been seelected, otherwise returns * false. */ bool mongoc_topology_uses_loadbalanced(const mongoc_topology_t *topology); #endif mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-scanner-private.h000066400000000000000000000220061511661753600275740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TOPOLOGY_SCANNER_PRIVATE_H #define MONGOC_TOPOLOGY_SCANNER_PRIVATE_H /* TODO: rename to TOPOLOGY scanner */ #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #include #include #include #include #include #include #include #include #include #include #include BSON_BEGIN_DECLS typedef void (*mongoc_topology_scanner_setup_err_cb_t)(uint32_t id, void *data, const bson_error_t *error /* IN */); typedef void (*mongoc_topology_scanner_cb_t)( uint32_t id, const bson_t *bson, int64_t rtt, void *data, const bson_error_t *error /* IN */); struct mongoc_topology_scanner; struct mongoc_topology_scanner_node; typedef struct mongoc_topology_scanner_node { uint32_t id; /* after scanning, this is set to the successful stream if one exists. */ mongoc_stream_t *stream; mongoc_oidc_connection_cache_t *oidc_connection_cache; int64_t last_used; /* last_failed is set upon a network error trying to check a server. * last_failed is used to enforce cooldownMS. * last_failed is not set upon a network error during an application * operation on @stream. */ int64_t last_failed; bool has_auth; bool hello_ok; mongoc_host_list_t host; struct mongoc_topology_scanner *ts; struct mongoc_topology_scanner_node *next; struct mongoc_topology_scanner_node *prev; bool retired; bson_error_t last_error; /* the hostname for a node may resolve to multiple DNS results. * dns_results has the full list of DNS results, ordered by host preference. * successful_dns_result is the most recent successful DNS result. */ struct addrinfo *dns_results; struct addrinfo *successful_dns_result; int64_t last_dns_cache; /* used by single-threaded clients to store negotiated sasl mechanisms on a * node. */ mongoc_handshake_sasl_supported_mechs_t sasl_supported_mechs; bool negotiated_sasl_supported_mechs; bson_t speculative_auth_response; mongoc_scram_t scram; /* handshake_sd is a server description constructed from the response of the * initial handshake. It is bound to the lifetime of stream. */ mongoc_server_description_t *handshake_sd; } mongoc_topology_scanner_node_t; typedef enum handshake_state_t { /** * The handshake command has no value. The handshake_cmd pointer will be * NULL. */ HANDSHAKE_CMD_UNINITIALIZED, /** * The handshake command could not be constructed because it would be too * large. The handshake_cmd pointer will be NULL. */ HANDSHAKE_CMD_TOO_BIG, /** * The handshake command is valid and ready to be copied-from. */ HANDSHAKE_CMD_OKAY, } handshake_state_t; typedef struct mongoc_topology_scanner { mongoc_async_t *async; int64_t connect_timeout_msec; mongoc_topology_scanner_node_t *nodes; bson_t hello_cmd; bson_t legacy_hello_cmd; bson_mutex_t handshake_cmd_mtx; bson_t *handshake_cmd; handshake_state_t handshake_state; bson_oid_t topology_id; const char *appname; mongoc_topology_scanner_setup_err_cb_t setup_err_cb; mongoc_topology_scanner_cb_t cb; void *cb_data; const mongoc_uri_t *uri; mongoc_async_cmd_stream_setup_cb setup; mongoc_stream_initiator_t initiator; void *initiator_context; bson_error_t error; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t *ssl_opts; #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX *openssl_ctx; #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) mongoc_shared_ptr secure_channel_cred_ptr; // Manages a mongoc_secure_channel_cred. #endif int64_t dns_cache_timeout_ms; /* only used by single-threaded clients to negotiate auth mechanisms. */ bool negotiate_sasl_supported_mechs; bool bypass_cooldown; bool speculative_authentication; mongoc_server_api_t *api; mongoc_log_and_monitor_instance_t *log_and_monitor; // Not null. bool loadbalanced; // oidc_cache is used to create the OIDC speculative auth command. mongoc_oidc_cache_t *oidc_cache; } mongoc_topology_scanner_t; mongoc_topology_scanner_t * mongoc_topology_scanner_new(const mongoc_uri_t *uri, const bson_oid_t *topology_id, mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_topology_scanner_setup_err_cb_t setup_err_cb, mongoc_topology_scanner_cb_t cb, void *data, int64_t connect_timeout_msec); void mongoc_topology_scanner_destroy(mongoc_topology_scanner_t *ts); bool mongoc_topology_scanner_valid(mongoc_topology_scanner_t *ts); void mongoc_topology_scanner_add(mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, uint32_t id, bool hello_ok); void mongoc_topology_scanner_scan(mongoc_topology_scanner_t *ts, uint32_t id); void mongoc_topology_scanner_disconnect(mongoc_topology_scanner_t *scanner); void mongoc_topology_scanner_node_retire(mongoc_topology_scanner_node_t *node); void mongoc_topology_scanner_node_disconnect(mongoc_topology_scanner_node_t *node, bool failed); void mongoc_topology_scanner_node_destroy(mongoc_topology_scanner_node_t *node, bool failed); bool mongoc_topology_scanner_in_cooldown(mongoc_topology_scanner_t *ts, int64_t when); void mongoc_topology_scanner_start(mongoc_topology_scanner_t *ts, bool obey_cooldown); void mongoc_topology_scanner_work(mongoc_topology_scanner_t *ts); void _mongoc_topology_scanner_finish(mongoc_topology_scanner_t *ts); void mongoc_topology_scanner_get_error(mongoc_topology_scanner_t *ts, bson_error_t *error); void mongoc_topology_scanner_reset(mongoc_topology_scanner_t *ts); void mongoc_topology_scanner_node_setup(mongoc_topology_scanner_node_t *node, bson_error_t *error); mongoc_topology_scanner_node_t * mongoc_topology_scanner_get_node(mongoc_topology_scanner_t *ts, uint32_t id); void _mongoc_topology_scanner_add_speculative_authentication( bson_t *cmd, const mongoc_uri_t *uri, char *oidc_access_token, uint32_t server_id, mongoc_scram_t *scram /* OUT */); void _mongoc_topology_scanner_parse_speculative_authentication(const bson_t *hello, bson_t *speculative_authenticate); const char * _mongoc_topology_scanner_get_speculative_auth_mechanism(const mongoc_uri_t *uri); const bson_t * _mongoc_topology_scanner_get_monitoring_cmd(mongoc_topology_scanner_t *ts, bool hello_ok); /** * @brief Get the scanner's associated handshake command BSON document. * * @param ts The scanner to inspect * @param copy_into A pointer to an initialized bson_t. The handshake command * will be copied into the pointee. */ void _mongoc_topology_scanner_dup_handshake_cmd(mongoc_topology_scanner_t *ts, bson_t *copy_into); bool mongoc_topology_scanner_has_node_for_host(mongoc_topology_scanner_t *ts, mongoc_host_list_t *host); void mongoc_topology_scanner_set_stream_initiator(mongoc_topology_scanner_t *ts, mongoc_stream_initiator_t si, void *ctx); bool _mongoc_topology_scanner_set_appname(mongoc_topology_scanner_t *ts, const char *name); void _mongoc_topology_scanner_set_dns_cache_timeout(mongoc_topology_scanner_t *ts, int64_t timeout_ms); #ifdef MONGOC_ENABLE_SSL void mongoc_topology_scanner_set_ssl_opts(mongoc_topology_scanner_t *ts, mongoc_ssl_opt_t *opts); #endif bool mongoc_topology_scanner_node_in_cooldown(mongoc_topology_scanner_node_t *node, int64_t when); void _mongoc_topology_scanner_set_server_api(mongoc_topology_scanner_t *ts, const mongoc_server_api_t *api); void _mongoc_topology_scanner_set_loadbalanced(mongoc_topology_scanner_t *ts, bool val); /* for testing. */ mongoc_stream_t * _mongoc_topology_scanner_tcp_initiate(mongoc_async_cmd_t *acmd); /* Returns true if versioned server API has been selected, otherwise * false. */ bool mongoc_topology_scanner_uses_server_api(const mongoc_topology_scanner_t *ts); /* Returns true if load balancing mode has been selected, otherwise false. */ bool mongoc_topology_scanner_uses_loadbalanced(const mongoc_topology_scanner_t *ts); void _mongoc_topology_scanner_set_oidc_cache(mongoc_topology_scanner_t *ts, mongoc_oidc_cache_t *oidc_cache); BSON_END_DECLS #endif /* MONGOC_TOPOLOGY_SCANNER_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology-scanner.c000066400000000000000000001357201511661753600261270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L #include #include #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include #include #endif #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "topology_scanner" #define DNS_CACHE_TIMEOUT_MS 10 * 60 * 1000 #define HAPPY_EYEBALLS_DELAY mlib_duration(250, ms) /* forward declarations */ static void _async_connected(mongoc_async_cmd_t *acmd); static void _async_success(mongoc_async_cmd_t *acmd, const bson_t *hello_response, mlib_duration elapsed); static void _async_error_or_timeout(mongoc_async_cmd_t *acmd, mlib_duration elapsed, const char *default_err_msg); static void _async_handler(mongoc_async_cmd_t *acmd, mongoc_async_cmd_result_t async_status, const bson_t *hello_response, mlib_duration duration); static void _mongoc_topology_scanner_monitor_heartbeat_started(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host); static void _mongoc_topology_scanner_monitor_heartbeat_succeeded(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, const bson_t *reply, mlib_duration elapsed); static void _mongoc_topology_scanner_monitor_heartbeat_failed(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, const bson_error_t *error, mlib_duration elapsed); /* reset "retired" nodes that failed or were removed in the previous scan */ static void _delete_retired_nodes(mongoc_topology_scanner_t *ts); // Get the scanner node associated with an async command static mongoc_topology_scanner_node_t * _scanner_node_of(mongoc_async_cmd_t const *a) { BSON_ASSERT_PARAM(a); return _acmd_userdata(mongoc_topology_scanner_node_t, a); } // Test whether two async commands are associated with the same topology scanner node, // and aren't the same command object static bool _is_sibling_command(mongoc_async_cmd_t const *l, mongoc_async_cmd_t const *r) { BSON_ASSERT_PARAM(l); BSON_ASSERT_PARAM(r); return l != r && _scanner_node_of(l) == _scanner_node_of(r); } /* cancel any pending async commands for a specific node excluding acmd. * If acmd is NULL, cancel all async commands on the node. */ static void _cancel_commands_excluding(mongoc_topology_scanner_node_t *node, mongoc_async_cmd_t *acmd); /* return the number of pending async commands for a node. */ static int _count_acmds(mongoc_topology_scanner_node_t *node); /** * @brief Cause all sibling commands to initiate sooner */ static void _jumpstart_other_acmds(mongoc_async_cmd_t const *const self) { BSON_ASSERT_PARAM(self); mongoc_async_cmd_t *other; DL_FOREACH(self->async->cmds, other) { // Only consider commands on the same node if (_is_sibling_command(self, other)) { // Decrease the delay by the happy eyeballs duration. _acmd_adjust_connect_delay(other, mlib_duration(HAPPY_EYEBALLS_DELAY, mul, -1)); } } } static void _add_hello(mongoc_topology_scanner_t *ts) { BSON_APPEND_INT32(&ts->hello_cmd, "hello", 1); BSON_APPEND_BOOL(&ts->hello_cmd, "helloOk", true); BSON_APPEND_INT32(&ts->legacy_hello_cmd, HANDSHAKE_CMD_LEGACY_HELLO, 1); BSON_APPEND_BOOL(&ts->legacy_hello_cmd, "helloOk", true); /* Append appropriate server API metadata (such as "serverApi") if selected: */ if (mongoc_topology_scanner_uses_server_api(ts)) { _mongoc_cmd_append_server_api(&ts->hello_cmd, ts->api); } } static void _init_hello(mongoc_topology_scanner_t *ts) { bson_init(&ts->hello_cmd); bson_init(&ts->legacy_hello_cmd); ts->handshake_cmd = NULL; _add_hello(ts); } static void _reset_hello(mongoc_topology_scanner_t *ts) { bson_t *prev_cmd; bson_reinit(&ts->hello_cmd); bson_reinit(&ts->legacy_hello_cmd); bson_mutex_lock(&ts->handshake_cmd_mtx); prev_cmd = ts->handshake_cmd; ts->handshake_cmd = NULL; ts->handshake_state = HANDSHAKE_CMD_UNINITIALIZED; bson_mutex_unlock(&ts->handshake_cmd_mtx); bson_destroy(prev_cmd); _add_hello(ts); } void _mongoc_topology_scanner_node_parse_sasl_supported_mechs(const bson_t *hello, mongoc_topology_scanner_node_t *node) { _mongoc_handshake_parse_sasl_supported_mechs(hello, &node->sasl_supported_mechs); node->negotiated_sasl_supported_mechs = true; } const char * _mongoc_topology_scanner_get_speculative_auth_mechanism(const mongoc_uri_t *uri) { const char *mechanism = mongoc_uri_get_auth_mechanism(uri); bool requires_auth = mechanism || mongoc_uri_get_username(uri); if (!requires_auth) { return NULL; } if (!mechanism) { return "SCRAM-SHA-256"; } return mechanism; } void _mongoc_topology_scanner_add_speculative_authentication( bson_t *cmd, const mongoc_uri_t *uri, char *oidc_access_token, uint32_t server_id, mongoc_scram_t *scram /* OUT */) { BSON_ASSERT_PARAM(cmd); BSON_ASSERT_PARAM(uri); BSON_OPTIONAL_PARAM(oidc_access_token); BSON_ASSERT_PARAM(scram); bson_t auth_cmd; bson_error_t error; bool has_auth = false; const char *mechanism = _mongoc_topology_scanner_get_speculative_auth_mechanism(uri); if (!mechanism) { return; } if (strcasecmp(mechanism, "MONGODB-X509") == 0) { /* Ignore errors while building authentication document: we proceed with * the handshake as usual and let the subsequent authenticate command * fail. */ if (_mongoc_cluster_get_auth_cmd_x509(uri, &auth_cmd, &error)) { has_auth = true; BSON_APPEND_UTF8(&auth_cmd, "db", "$external"); } } #ifdef MONGOC_ENABLE_CRYPTO if (strcasecmp(mechanism, "SCRAM-SHA-1") == 0 || strcasecmp(mechanism, "SCRAM-SHA-256") == 0) { mongoc_crypto_hash_algorithm_t algo = strcasecmp(mechanism, "SCRAM-SHA-1") == 0 ? MONGOC_CRYPTO_ALGORITHM_SHA_1 : MONGOC_CRYPTO_ALGORITHM_SHA_256; _mongoc_uri_init_scram(uri, scram, algo); if (_mongoc_cluster_get_auth_cmd_scram(algo, scram, &auth_cmd, &error)) { const char *auth_source; if (!(auth_source = mongoc_uri_get_auth_source(uri)) || (*auth_source == '\0')) { auth_source = "admin"; } has_auth = true; BSON_APPEND_UTF8(&auth_cmd, "db", auth_source); } } #endif if (strcasecmp(mechanism, "MONGODB-OIDC") == 0 && oidc_access_token) { if (mongoc_oidc_append_speculative_auth(oidc_access_token, server_id, &auth_cmd, &error)) { has_auth = true; } else { MONGOC_ERROR("Error adding MONGODB-OIDC speculative auth: %s", error.message); } } if (has_auth) { BSON_APPEND_DOCUMENT(cmd, "speculativeAuthenticate", &auth_cmd); bson_destroy(&auth_cmd); } } void _mongoc_topology_scanner_parse_speculative_authentication(const bson_t *hello, bson_t *speculative_authenticate) { bson_iter_t iter; uint32_t data_len; const uint8_t *data; bson_t auth_response; BSON_ASSERT(hello); BSON_ASSERT(speculative_authenticate); if (!bson_iter_init_find(&iter, hello, "speculativeAuthenticate")) { return; } bson_iter_document(&iter, &data_len, &data); BSON_ASSERT(bson_init_static(&auth_response, data, data_len)); bson_destroy(speculative_authenticate); bson_copy_to(&auth_response, speculative_authenticate); } static bson_t * _build_handshake_cmd(const bson_t *basis_cmd, const char *appname, const mongoc_uri_t *uri, bool is_loadbalanced) { bson_t *doc = bson_copy(basis_cmd); bson_iter_t iter; const bson_t *compressors; bson_array_builder_t *subarray; BSON_ASSERT(doc); bson_t *handshake_doc = _mongoc_handshake_build_doc_with_application(appname); if (!handshake_doc) { bson_destroy(doc); return NULL; } bson_append_document(doc, HANDSHAKE_FIELD, -1, handshake_doc); bson_destroy(handshake_doc); BSON_APPEND_ARRAY_BUILDER_BEGIN(doc, "compression", &subarray); if (uri) { compressors = mongoc_uri_get_compressors(uri); if (bson_iter_init(&iter, compressors)) { while (bson_iter_next(&iter)) { bson_array_builder_append_utf8(subarray, bson_iter_key(&iter), -1); } } } bson_append_array_builder_end(doc, subarray); if (is_loadbalanced) { BSON_APPEND_BOOL(doc, "loadBalanced", true); } /* Return whether the handshake doc fit the size limit */ return doc; } static bool _should_use_op_msg(const mongoc_topology_scanner_t *ts) { return mongoc_topology_scanner_uses_server_api(ts) || mongoc_topology_scanner_uses_loadbalanced(ts); } const bson_t * _mongoc_topology_scanner_get_monitoring_cmd(mongoc_topology_scanner_t *ts, bool hello_ok) { return hello_ok || _should_use_op_msg(ts) ? &ts->hello_cmd : &ts->legacy_hello_cmd; } void _mongoc_topology_scanner_dup_handshake_cmd(mongoc_topology_scanner_t *ts, bson_t *copy_into) { bson_t *new_cmd; const char *appname; BSON_ASSERT_PARAM(ts); BSON_ASSERT_PARAM(copy_into); /* appname will only be changed from NULL, so a non-null pointer will never * be invalidated after this fetch. */ appname = mcommon_atomic_ptr_fetch((void *)&ts->appname, mcommon_memory_order_relaxed); bson_mutex_lock(&ts->handshake_cmd_mtx); /* If this is the first time using the node or if it's the first time * using it after a failure, build handshake doc */ if (ts->handshake_state != HANDSHAKE_CMD_UNINITIALIZED) { /* We're good to just return the handshake now */ goto after_init; } /* There is not yet a handshake command associated with this scanner. * Initialize one and set it now. */ /* Note: Don't hold the mutex while we build our command */ /* Construct a new handshake command to be sent */ BSON_ASSERT(ts->handshake_cmd == NULL); bson_mutex_unlock(&ts->handshake_cmd_mtx); new_cmd = _build_handshake_cmd( _should_use_op_msg(ts) ? &ts->hello_cmd : &ts->legacy_hello_cmd, appname, ts->uri, ts->loadbalanced); bson_mutex_lock(&ts->handshake_cmd_mtx); if (ts->handshake_state != HANDSHAKE_CMD_UNINITIALIZED) { /* Someone else updated the handshake_cmd while we were building ours. * Defer to their copy and just destroy the one we created. */ bson_destroy(new_cmd); goto after_init; } BSON_ASSERT(ts->handshake_cmd == NULL); /* We're still the one updating the command */ ts->handshake_cmd = new_cmd; /* The "_build" may have failed. */ /* Even if new_cmd is NULL, this is still what we want */ ts->handshake_state = new_cmd == NULL ? HANDSHAKE_CMD_TOO_BIG : HANDSHAKE_CMD_OKAY; if (ts->handshake_state == HANDSHAKE_CMD_TOO_BIG) { MONGOC_WARNING("Handshake doc too big, not including in hello"); } after_init: /* If the doc turned out to be too big */ if (ts->handshake_state == HANDSHAKE_CMD_TOO_BIG) { bson_t *ret = _should_use_op_msg(ts) ? &ts->hello_cmd : &ts->legacy_hello_cmd; bson_copy_to(ret, copy_into); } else { BSON_ASSERT(ts->handshake_cmd != NULL); bson_copy_to(ts->handshake_cmd, copy_into); } bson_mutex_unlock(&ts->handshake_cmd_mtx); } static void _begin_hello_cmd(mongoc_topology_scanner_node_t *node, mongoc_stream_t *stream, bool is_setup_done, struct addrinfo *dns_result, mlib_duration initiate_delay, bool use_handshake) { mongoc_topology_scanner_t *ts = node->ts; bson_t cmd; /* If we're asked to use a specific API version, we should send our hello handshake via op_msg rather than the legacy op_query: */ const int32_t cmd_opcode = _should_use_op_msg(ts) ? MONGOC_OP_CODE_MSG : MONGOC_OP_CODE_QUERY; if (node->last_used != -1 && node->last_failed == -1 && !use_handshake) { /* The node's been used before and not failed recently */ bson_copy_to(_mongoc_topology_scanner_get_monitoring_cmd(ts, node->hello_ok), &cmd); } else { _mongoc_topology_scanner_dup_handshake_cmd(ts, &cmd); } if (node->ts->negotiate_sasl_supported_mechs && !node->negotiated_sasl_supported_mechs) { _mongoc_handshake_append_sasl_supported_mechs(ts->uri, &cmd); } if (node->ts->speculative_authentication && !node->has_auth && bson_empty(&node->speculative_auth_response) && node->scram.step == 0) { char *oidc_access_token = mongoc_oidc_cache_get_cached_token(ts->oidc_cache); _mongoc_topology_scanner_add_speculative_authentication(&cmd, ts->uri, oidc_access_token, node->id, &node->scram); mongoc_oidc_connection_cache_set(node->oidc_connection_cache, oidc_access_token); bson_free(oidc_access_token); } /* if the node should connect with a TCP socket, stream will be null, and * dns_result will be set. The async loop is responsible for calling the * _tcp_initiator to construct TCP sockets. */ mongoc_async_cmd_new(ts->async, stream, is_setup_done, dns_result, _mongoc_topology_scanner_tcp_initiate, initiate_delay, ts->setup, node->host.host, "admin", &cmd, cmd_opcode, &_async_handler, node, mlib_duration(ts->connect_timeout_msec, ms)); bson_destroy(&cmd); } mongoc_topology_scanner_t * mongoc_topology_scanner_new(const mongoc_uri_t *uri, const bson_oid_t *topology_id, mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_topology_scanner_setup_err_cb_t setup_err_cb, mongoc_topology_scanner_cb_t cb, void *data, int64_t connect_timeout_msec) { mongoc_topology_scanner_t *ts = BSON_ALIGNED_ALLOC0(mongoc_topology_scanner_t); ts->async = mongoc_async_new(); bson_oid_copy(topology_id, &ts->topology_id); ts->setup_err_cb = setup_err_cb; ts->cb = cb; ts->cb_data = data; ts->uri = uri; ts->appname = NULL; ts->log_and_monitor = log_and_monitor; ts->api = NULL; ts->handshake_state = HANDSHAKE_CMD_UNINITIALIZED; ts->connect_timeout_msec = connect_timeout_msec; /* may be overridden for testing. */ ts->dns_cache_timeout_ms = DNS_CACHE_TIMEOUT_MS; bson_mutex_init(&ts->handshake_cmd_mtx); #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) ts->secure_channel_cred_ptr = MONGOC_SHARED_PTR_NULL; #endif _init_hello(ts); return ts; } #ifdef MONGOC_ENABLE_SSL void mongoc_topology_scanner_set_ssl_opts(mongoc_topology_scanner_t *ts, mongoc_ssl_opt_t *opts) { ts->ssl_opts = opts; ts->setup = mongoc_async_cmd_tls_setup; } #endif void mongoc_topology_scanner_set_stream_initiator(mongoc_topology_scanner_t *ts, mongoc_stream_initiator_t si, void *ctx) { ts->initiator = si; ts->initiator_context = ctx; ts->setup = NULL; } void mongoc_topology_scanner_destroy(mongoc_topology_scanner_t *ts) { mongoc_topology_scanner_node_t *ele, *tmp; DL_FOREACH_SAFE(ts->nodes, ele, tmp) { mongoc_topology_scanner_node_destroy(ele, false); } mongoc_async_destroy(ts->async); bson_destroy(&ts->hello_cmd); bson_destroy(&ts->legacy_hello_cmd); bson_destroy(ts->handshake_cmd); mongoc_server_api_destroy(ts->api); bson_mutex_destroy(&ts->handshake_cmd_mtx); #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L SSL_CTX_free(ts->openssl_ctx); ts->openssl_ctx = NULL; #endif #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) mongoc_shared_ptr_reset_null(&ts->secure_channel_cred_ptr); #endif /* This field can be set by a mongoc_client */ bson_free((char *)ts->appname); bson_free(ts); } /* whether the scanner was successfully initialized - false if a mongodb+srv * URI failed to resolve to any hosts */ bool mongoc_topology_scanner_valid(mongoc_topology_scanner_t *ts) { return ts->nodes != NULL; } void mongoc_topology_scanner_add(mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, uint32_t id, bool hello_ok) { mongoc_topology_scanner_node_t *node; node = BSON_ALIGNED_ALLOC0(mongoc_topology_scanner_node_t); memcpy(&node->host, host, sizeof(*host)); node->id = id; node->ts = ts; node->last_failed = -1; node->last_used = -1; node->hello_ok = hello_ok; node->oidc_connection_cache = mongoc_oidc_connection_cache_new(); bson_init(&node->speculative_auth_response); DL_APPEND(ts->nodes, node); } void mongoc_topology_scanner_scan(mongoc_topology_scanner_t *ts, uint32_t id) { mongoc_topology_scanner_node_t *node; node = mongoc_topology_scanner_get_node(ts, id); /* begin non-blocking connection, don't wait for success */ if (node) { mongoc_topology_scanner_node_setup(node, &node->last_error); } /* if setup fails the node stays in the scanner. destroyed after the scan. */ } void mongoc_topology_scanner_disconnect(mongoc_topology_scanner_t *scanner) { mongoc_topology_scanner_node_t *node; BSON_ASSERT(scanner); node = scanner->nodes; while (node) { mongoc_topology_scanner_node_disconnect(node, false); node = node->next; } } void mongoc_topology_scanner_node_retire(mongoc_topology_scanner_node_t *node) { /* cancel any pending commands. */ _cancel_commands_excluding(node, NULL); node->retired = true; } void mongoc_topology_scanner_node_disconnect(mongoc_topology_scanner_node_t *node, bool failed) { /* the node may or may not have succeeded in finding a working stream. */ if (node->stream) { if (failed) { mongoc_stream_failed(node->stream); } else { mongoc_stream_destroy(node->stream); } node->stream = NULL; } mongoc_server_description_destroy(node->handshake_sd); node->handshake_sd = NULL; mongoc_oidc_connection_cache_set(node->oidc_connection_cache, NULL); } void mongoc_topology_scanner_node_destroy(mongoc_topology_scanner_node_t *node, bool failed) { DL_DELETE(node->ts->nodes, node); mongoc_topology_scanner_node_disconnect(node, failed); if (node->dns_results) { freeaddrinfo(node->dns_results); } bson_destroy(&node->speculative_auth_response); #ifdef MONGOC_ENABLE_CRYPTO _mongoc_scram_destroy(&node->scram); #endif mongoc_oidc_connection_cache_destroy(node->oidc_connection_cache); bson_free(node); } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_get_node -- * * Return the scanner node with the given id. * *-------------------------------------------------------------------------- */ mongoc_topology_scanner_node_t * mongoc_topology_scanner_get_node(mongoc_topology_scanner_t *ts, uint32_t id) { mongoc_topology_scanner_node_t *ele, *tmp; DL_FOREACH_SAFE(ts->nodes, ele, tmp) { if (ele->id == id) { return ele; } if (ele->id > id) { break; } } return NULL; } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_has_node_for_host -- * * Whether the scanner has a node for the given host and port. * *-------------------------------------------------------------------------- */ bool mongoc_topology_scanner_has_node_for_host(mongoc_topology_scanner_t *ts, mongoc_host_list_t *host) { mongoc_topology_scanner_node_t *ele, *tmp; DL_FOREACH_SAFE(ts->nodes, ele, tmp) { if (_mongoc_host_list_compare_one(&ele->host, host)) { return true; } } return false; } static void _async_connected(mongoc_async_cmd_t *acmd) { BSON_ASSERT_PARAM(acmd); mongoc_topology_scanner_node_t *const node = _scanner_node_of(acmd); /* this cmd connected successfully, cancel other cmds on this node. */ _cancel_commands_excluding(node, acmd); node->successful_dns_result = acmd->dns_result; } static void _async_success(mongoc_async_cmd_t *acmd, const bson_t *hello_response, mlib_duration elapsed) { BSON_ASSERT_PARAM(acmd); BSON_ASSERT_PARAM(hello_response); mongoc_topology_scanner_node_t *const node = _scanner_node_of(acmd); mongoc_stream_t *const stream = acmd->stream; mongoc_topology_scanner_t *ts = node->ts; if (node->retired) { if (stream) { mongoc_stream_failed(stream); } return; } node->last_used = bson_get_monotonic_time(); node->last_failed = -1; _mongoc_topology_scanner_monitor_heartbeat_succeeded(ts, &node->host, hello_response, elapsed); /* set our successful stream. */ BSON_ASSERT(!node->stream); node->stream = stream; if (!node->handshake_sd) { mongoc_server_description_t sd; /* Store a server description associated with the handshake. */ mongoc_server_description_init(&sd, node->host.host_and_port, node->id); mongoc_server_description_handle_hello(&sd, hello_response, mlib_milliseconds_count(elapsed), &acmd->error); node->handshake_sd = mongoc_server_description_new_copy(&sd); mongoc_server_description_cleanup(&sd); } if (ts->negotiate_sasl_supported_mechs && !node->negotiated_sasl_supported_mechs) { _mongoc_topology_scanner_node_parse_sasl_supported_mechs(hello_response, node); } if (ts->speculative_authentication) { _mongoc_topology_scanner_parse_speculative_authentication(hello_response, &node->speculative_auth_response); } /* mongoc_topology_scanner_cb_t takes rtt_msec, not usec */ ts->cb(node->id, hello_response, mlib_milliseconds_count(elapsed), ts->cb_data, &acmd->error); } static void _async_error_or_timeout(mongoc_async_cmd_t *acmd, mlib_duration elapsed, const char *default_err_msg) { BSON_ASSERT_PARAM(acmd); mongoc_topology_scanner_node_t *const node = _scanner_node_of(acmd); mongoc_stream_t *stream = acmd->stream; mongoc_topology_scanner_t *ts = node->ts; bson_error_t *error = &acmd->error; int64_t now = bson_get_monotonic_time(); const char *message; /* the stream may have failed on initiation. */ if (stream) { mongoc_stream_failed(stream); } if (node->retired) { return; } node->last_used = now; if (!node->stream && _count_acmds(node) == 1) { /* there are no remaining streams, connecting has failed. */ node->last_failed = now; if (error->code) { message = error->message; } else { message = default_err_msg; } /* invalidate any cached DNS results. */ if (node->dns_results) { freeaddrinfo(node->dns_results); node->dns_results = NULL; node->successful_dns_result = NULL; } _mongoc_set_error(&node->last_error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_STREAM_CONNECT, "%s calling hello on \'%s\'", message, node->host.host_and_port); _mongoc_topology_scanner_monitor_heartbeat_failed(ts, &node->host, &node->last_error, elapsed); /* call the topology scanner callback. cannot connect to this node. * callback takes rtt_msec, not usec. */ ts->cb(node->id, NULL, mlib_milliseconds_count(elapsed), ts->cb_data, error); mongoc_server_description_destroy(node->handshake_sd); node->handshake_sd = NULL; } else { /* there are still more commands left for this node or it succeeded * with another stream. skip the topology scanner callback. */ _jumpstart_other_acmds(acmd); } } /* *----------------------------------------------------------------------- * * This is the callback passed to async_cmd when we're running * hellos from within the topology monitor. * *----------------------------------------------------------------------- */ static void _async_handler(mongoc_async_cmd_t *acmd, mongoc_async_cmd_result_t async_status, const bson_t *hello_response, mlib_duration duration) { switch (async_status) { case MONGOC_ASYNC_CMD_CONNECTED: _async_connected(acmd); return; case MONGOC_ASYNC_CMD_SUCCESS: _async_success(acmd, hello_response, duration); return; case MONGOC_ASYNC_CMD_TIMEOUT: _async_error_or_timeout(acmd, duration, "connection timeout"); return; case MONGOC_ASYNC_CMD_ERROR: _async_error_or_timeout(acmd, duration, "connection error"); return; case MONGOC_ASYNC_CMD_IN_PROGRESS: default: fprintf(stderr, "unexpected async status: %d\n", (int)async_status); BSON_ASSERT(false); return; } } mongoc_stream_t * _mongoc_topology_scanner_node_setup_stream_for_tls(mongoc_topology_scanner_node_t *node, mongoc_stream_t *stream) { #ifdef MONGOC_ENABLE_SSL mongoc_stream_t *tls_stream; #endif if (!stream) { return NULL; } #ifdef MONGOC_ENABLE_SSL if (node->ts->ssl_opts) { #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L tls_stream = mongoc_stream_tls_new_with_hostname_and_openssl_context( stream, node->host.host, node->ts->ssl_opts, 1, node->ts->openssl_ctx); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) tls_stream = mongoc_stream_tls_new_with_secure_channel_cred( stream, node->host.host, node->ts->ssl_opts, node->ts->secure_channel_cred_ptr); #else tls_stream = mongoc_stream_tls_new_with_hostname(stream, node->host.host, node->ts->ssl_opts, 1); #endif if (!tls_stream) { mongoc_stream_destroy(stream); return NULL; } else { return tls_stream; } } #endif return stream; } /* attempt to create a new socket stream using this dns result. */ mongoc_stream_t * _mongoc_topology_scanner_tcp_initiate(mongoc_async_cmd_t *acmd) { BSON_ASSERT_PARAM(acmd); mongoc_topology_scanner_node_t *const node = _scanner_node_of(acmd); struct addrinfo *res = acmd->dns_result; mongoc_socket_t *sock = NULL; BSON_ASSERT(acmd->dns_result); /* create a new non-blocking socket. */ if (!(sock = mongoc_socket_new(res->ai_family, res->ai_socktype, res->ai_protocol))) { return NULL; } (void)mongoc_socket_connect(sock, res->ai_addr, (mongoc_socklen_t)res->ai_addrlen, 0); return _mongoc_topology_scanner_node_setup_stream_for_tls(node, mongoc_stream_socket_new(sock)); } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_node_setup_tcp -- * * Create an async command for each DNS record found for this node. * * Returns: * A bool. On failure error is set. * *-------------------------------------------------------------------------- */ bool mongoc_topology_scanner_node_setup_tcp(mongoc_topology_scanner_node_t *node, bson_error_t *error) { struct addrinfo hints; struct addrinfo *iter; char portstr[8]; mongoc_host_list_t *host; int s; mlib_duration delay = mlib_duration(); int64_t now = bson_get_monotonic_time(); ENTRY; host = &node->host; /* if cached dns results are expired, flush. */ if (node->dns_results && (now - node->last_dns_cache) > node->ts->dns_cache_timeout_ms * 1000) { freeaddrinfo(node->dns_results); node->dns_results = NULL; node->successful_dns_result = NULL; } if (!node->dns_results) { // Expect no truncation. int req = bson_snprintf(portstr, sizeof portstr, "%hu", host->port); BSON_ASSERT(mlib_cmp(req, <, sizeof portstr)); memset(&hints, 0, sizeof hints); hints.ai_family = host->family; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; s = getaddrinfo(host->host, portstr, &hints, &node->dns_results); if (s != 0) { mongoc_counter_dns_failure_inc(); _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve '%s'", host->host); RETURN(false); } mongoc_counter_dns_success_inc(); node->last_dns_cache = now; } if (node->successful_dns_result) { _begin_hello_cmd(node, NULL /* stream */, false /* is_setup_done */, node->successful_dns_result, mlib_duration() /* initiate_delay */, true /* use_handshake */); } else { LL_FOREACH2(node->dns_results, iter, ai_next) { _begin_hello_cmd(node, NULL /* stream */, false /* is_setup_done */, iter, delay, true /* use_handshake */); /* each subsequent DNS result will have an additional 250ms delay. */ delay = mlib_duration(delay, plus, HAPPY_EYEBALLS_DELAY); } } RETURN(true); } bool mongoc_topology_scanner_node_connect_unix(mongoc_topology_scanner_node_t *node, bson_error_t *error) { #ifdef _WIN32 ENTRY; BSON_UNUSED(node); _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "UNIX domain sockets not supported on win32."); RETURN(false); #else struct sockaddr_un saddr; mongoc_socket_t *sock; mongoc_stream_t *stream; mongoc_host_list_t *host; ENTRY; host = &node->host; memset(&saddr, 0, sizeof saddr); saddr.sun_family = AF_UNIX; // Expect no truncation. int req = bson_snprintf(saddr.sun_path, sizeof saddr.sun_path - 1, "%s", host->host); if (mlib_cmp(req, >=, sizeof saddr.sun_path - 1)) { _mongoc_set_error( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to define socket address path."); RETURN(false); } sock = mongoc_socket_new(AF_UNIX, SOCK_STREAM, 0); if (sock == NULL) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to create socket."); RETURN(false); } if (-1 == mongoc_socket_connect(sock, (struct sockaddr *)&saddr, sizeof saddr, -1)) { char buf[128]; char *errstr; errstr = bson_strerror_r(mongoc_socket_errno(sock), buf, sizeof(buf)); _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "Failed to connect to UNIX domain socket: %s", errstr); mongoc_socket_destroy(sock); RETURN(false); } stream = _mongoc_topology_scanner_node_setup_stream_for_tls(node, mongoc_stream_socket_new(sock)); if (stream) { _begin_hello_cmd(node, stream, false /* is_setup_done */, NULL /* dns result */, mlib_duration() /* no delay */, true /* use_handshake */); RETURN(true); } _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "Failed to create TLS stream"); RETURN(false); #endif } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_node_setup -- * * Create a stream and begin a non-blocking connect. * * Returns: * true on success, or false and error is set. * *-------------------------------------------------------------------------- */ void mongoc_topology_scanner_node_setup(mongoc_topology_scanner_node_t *node, bson_error_t *error) { bool success = false; mongoc_stream_t *stream; _mongoc_topology_scanner_monitor_heartbeat_started(node->ts, &node->host); const mlib_time_point start_time = mlib_now(); /* if there is already a working stream, push it back to be re-scanned. */ if (node->stream) { _begin_hello_cmd(node, node->stream, true /* is_setup_done */, NULL /* dns_result */, mlib_duration() /* initiate_delay */, false /* use_handshake */); node->stream = NULL; return; } BSON_ASSERT(!node->retired); // If a new stream is needed, reset state authentication state. // Authentication state is tied to a stream. { node->has_auth = false; bson_reinit(&node->speculative_auth_response); #ifdef MONGOC_ENABLE_CRYPTO // Destroy and zero `node->scram`. _mongoc_scram_destroy(&node->scram); #endif memset(&node->sasl_supported_mechs, 0, sizeof(node->sasl_supported_mechs)); node->negotiated_sasl_supported_mechs = false; } if (node->ts->initiator) { stream = node->ts->initiator(node->ts->uri, &node->host, node->ts->initiator_context, error); if (stream) { success = true; _begin_hello_cmd(node, stream, false /* is_setup_done */, NULL /* dns_result */, mlib_duration() /* initiate_delay */, true /* use_handshake */); } } else { if (node->host.family == AF_UNIX) { success = mongoc_topology_scanner_node_connect_unix(node, error); } else { success = mongoc_topology_scanner_node_setup_tcp(node, error); } } if (!success) { _mongoc_topology_scanner_monitor_heartbeat_failed(node->ts, &node->host, error, mlib_elapsed_since(start_time)); node->ts->setup_err_cb(node->id, node->ts->cb_data, error); return; } } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_node_in_cooldown -- * * Return true if @node has experienced a network error attempting * to call "hello" less than 5 seconds before @when, a timestamp in * microseconds. * * Server Discovery and Monitoring Spec: "After a single-threaded client * gets a network error trying to check a server, the client skips * re-checking the server until cooldownMS has passed. This avoids * spending connectTimeoutMS on each unavailable server during each scan. * This value MUST be 5000 ms, and it MUST NOT be configurable." * *-------------------------------------------------------------------------- */ bool mongoc_topology_scanner_node_in_cooldown(mongoc_topology_scanner_node_t *node, int64_t when) { if (node->last_failed == -1 || node->ts->bypass_cooldown) { return false; /* node is new, or connected */ } return node->last_failed + 1000 * MONGOC_TOPOLOGY_COOLDOWN_MS >= when; } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_in_cooldown -- * * Return true if all nodes will be in cooldown at time @when, a * timestamp in microseconds. * *-------------------------------------------------------------------------- */ bool mongoc_topology_scanner_in_cooldown(mongoc_topology_scanner_t *ts, int64_t when) { mongoc_topology_scanner_node_t *node; if (ts->bypass_cooldown) { return false; } DL_FOREACH(ts->nodes, node) { if (!mongoc_topology_scanner_node_in_cooldown(node, when)) { return false; } } return true; } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_start -- * * Initializes the scanner and begins a full topology check. This * should be called once before calling mongoc_topology_scanner_work() * to complete the scan. * * If "obey_cooldown" is true, this is a single-threaded blocking scan * that must obey the Server Discovery And Monitoring Spec's cooldownMS: * * "After a single-threaded client gets a network error trying to check * a server, the client skips re-checking the server until cooldownMS has * passed. * * "This avoids spending connectTimeoutMS on each unavailable server * during each scan. * * "This value MUST be 5000 ms, and it MUST NOT be configurable." * *-------------------------------------------------------------------------- */ void mongoc_topology_scanner_start(mongoc_topology_scanner_t *ts, bool obey_cooldown) { mongoc_topology_scanner_node_t *node, *tmp; bool skip; int64_t now; BSON_ASSERT(ts); _delete_retired_nodes(ts); now = bson_get_monotonic_time(); DL_FOREACH_SAFE(ts->nodes, node, tmp) { skip = obey_cooldown && mongoc_topology_scanner_node_in_cooldown(node, now); if (!skip) { mongoc_topology_scanner_node_setup(node, &node->last_error); } } } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_finish_scan -- * * Summarizes all scanner node errors into one error message, * deletes retired nodes. * *-------------------------------------------------------------------------- */ void _mongoc_topology_scanner_finish(mongoc_topology_scanner_t *ts) { mongoc_topology_scanner_node_t *node, *tmp; bson_error_t *error = &ts->error; memset(&ts->error, 0, sizeof(bson_error_t)); mcommon_string_append_t msg; mcommon_string_new_as_fixed_capacity_append(&msg, sizeof error->message - 1u); DL_FOREACH_SAFE(ts->nodes, node, tmp) { if (node->last_error.code) { if (!mcommon_string_from_append_is_empty(&msg)) { mcommon_string_append(&msg, " "); } mcommon_string_append_printf(&msg, "[%s]", node->last_error.message); /* last error domain and code win */ error->domain = node->last_error.domain; error->code = node->last_error.code; error->reserved = node->last_error.reserved; } } bson_strncpy((char *)&error->message, mcommon_str_from_append(&msg), sizeof error->message); mcommon_string_from_append_destroy(&msg); _delete_retired_nodes(ts); } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_work -- * * Crank the knob on the topology scanner state machine. This should * be called only after mongoc_topology_scanner_start() has been used * to begin the scan. * *-------------------------------------------------------------------------- */ void mongoc_topology_scanner_work(mongoc_topology_scanner_t *ts) { mongoc_async_run(ts->async); BSON_ASSERT(ts->async->ncmds == 0); } /* *-------------------------------------------------------------------------- * * mongoc_topology_scanner_get_error -- * * Copy the scanner's current error; which may no-error (code 0). * *-------------------------------------------------------------------------- */ void mongoc_topology_scanner_get_error(mongoc_topology_scanner_t *ts, bson_error_t *error) { BSON_ASSERT(ts); BSON_ASSERT(error); *error = ts->error; } /* * Set a field in the topology scanner. */ bool _mongoc_topology_scanner_set_appname(mongoc_topology_scanner_t *ts, const char *appname) { char *s; const char *prev; if (!_mongoc_handshake_appname_is_valid(appname)) { MONGOC_ERROR("Cannot set appname: %s is invalid", appname); return false; } s = bson_strdup(appname); prev = mcommon_atomic_ptr_compare_exchange_strong((void *)&ts->appname, NULL, s, mcommon_memory_order_relaxed); if (prev == NULL) { return true; } MONGOC_ERROR("Cannot set appname more than once"); bson_free(s); return false; } /* SDAM Monitoring Spec: send HeartbeatStartedEvent */ static void _mongoc_topology_scanner_monitor_heartbeat_started(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host) { mongoc_structured_log(ts->log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat started", oid("topologyId", &ts->topology_id), utf8("serverHost", host->host), int32("serverPort", host->port), boolean("awaited", false)); if (ts->log_and_monitor->apm_callbacks.server_heartbeat_started) { mongoc_apm_server_heartbeat_started_t event; event.host = host; event.context = ts->log_and_monitor->apm_context; event.awaited = false; ts->log_and_monitor->apm_callbacks.server_heartbeat_started(&event); } } /* SDAM Monitoring Spec: send HeartbeatSucceededEvent */ static void _mongoc_topology_scanner_monitor_heartbeat_succeeded(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, const bson_t *reply, mlib_duration elapsed) { /* This redaction is more lenient than the general command redaction in the Command Logging and Monitoring spec and * the cmd*() structured log items. In those general command logs, sensitive replies are omitted entirely. In this * APM message, the reply is passed through with only the speculativeAuthenticate field stripped. The Server * Discovery and Monitoring Logging spec does not mention reply redaction, so we choose to be consistent with the APM * event. */ bson_t hello_redacted; bson_init(&hello_redacted); bson_copy_to_excluding_noinit(reply, &hello_redacted, "speculativeAuthenticate", NULL); mongoc_structured_log(ts->log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat succeeded", oid("topologyId", &ts->topology_id), utf8("serverHost", host->host), int32("serverPort", host->port), boolean("awaited", false), monotonic_time_duration(mlib_microseconds_count(elapsed)), bson_as_json("reply", &hello_redacted)); if (ts->log_and_monitor->apm_callbacks.server_heartbeat_succeeded) { mongoc_apm_server_heartbeat_succeeded_t event; event.host = host; event.context = ts->log_and_monitor->apm_context; event.reply = reply; event.duration_usec = mlib_microseconds_count(elapsed); event.awaited = false; ts->log_and_monitor->apm_callbacks.server_heartbeat_succeeded(&event); } bson_destroy(&hello_redacted); } /* SDAM Monitoring Spec: send HeartbeatFailedEvent */ static void _mongoc_topology_scanner_monitor_heartbeat_failed(const mongoc_topology_scanner_t *ts, const mongoc_host_list_t *host, const bson_error_t *error, mlib_duration elapsed) { mongoc_structured_log(ts->log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, "Server heartbeat failed", oid("topologyId", &ts->topology_id), utf8("serverHost", host->host), int32("serverPort", host->port), boolean("awaited", false), monotonic_time_duration(mlib_microseconds_count(elapsed)), error("failure", error)); if (ts->log_and_monitor->apm_callbacks.server_heartbeat_failed) { mongoc_apm_server_heartbeat_failed_t event; event.host = host; event.context = ts->log_and_monitor->apm_context; event.error = error; event.duration_usec = mlib_microseconds_count(elapsed); event.awaited = false; ts->log_and_monitor->apm_callbacks.server_heartbeat_failed(&event); } } /* this is for testing the dns cache timeout. */ void _mongoc_topology_scanner_set_dns_cache_timeout(mongoc_topology_scanner_t *ts, int64_t timeout_ms) { ts->dns_cache_timeout_ms = timeout_ms; } /* reset "retired" nodes that failed or were removed in the previous scan */ static void _delete_retired_nodes(mongoc_topology_scanner_t *ts) { mongoc_topology_scanner_node_t *node, *tmp; DL_FOREACH_SAFE(ts->nodes, node, tmp) { if (node->retired) { mongoc_topology_scanner_node_destroy(node, true); } } } static void _cancel_commands_excluding(mongoc_topology_scanner_node_t *node, mongoc_async_cmd_t *acmd) { mongoc_async_cmd_t *iter; DL_FOREACH(node->ts->async->cmds, iter) { if (acmd && _is_sibling_command(iter, acmd)) { _acmd_cancel(iter); } } } static int _count_acmds(mongoc_topology_scanner_node_t *node) { mongoc_async_cmd_t *iter; int count = 0; DL_FOREACH(node->ts->async->cmds, iter) { if (_scanner_node_of(iter) == node) { ++count; } } return count; } void _mongoc_topology_scanner_set_server_api(mongoc_topology_scanner_t *ts, const mongoc_server_api_t *api) { BSON_ASSERT(ts); BSON_ASSERT(api); mongoc_server_api_destroy(ts->api); ts->api = mongoc_server_api_copy(api); _reset_hello(ts); } /* This must be called before the handshake command is constructed. */ void _mongoc_topology_scanner_set_loadbalanced(mongoc_topology_scanner_t *ts, bool val) { BSON_UNUSED(val); BSON_ASSERT(ts->handshake_cmd == NULL); ts->loadbalanced = true; } bool mongoc_topology_scanner_uses_server_api(const mongoc_topology_scanner_t *ts) { BSON_ASSERT_PARAM(ts); return NULL != ts->api; } bool mongoc_topology_scanner_uses_loadbalanced(const mongoc_topology_scanner_t *ts) { BSON_ASSERT_PARAM(ts); return ts->loadbalanced; } void _mongoc_topology_scanner_set_oidc_cache(mongoc_topology_scanner_t *ts, mongoc_oidc_cache_t *oidc_cache) { BSON_ASSERT_PARAM(ts); BSON_ASSERT_PARAM(oidc_cache); ts->oidc_cache = oidc_cache; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-topology.c000066400000000000000000002244631511661753600245030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void _topology_collect_errors(const mongoc_topology_description_t *topology, bson_error_t *error_out); static bool _mongoc_topology_reconcile_add_nodes(mongoc_server_description_t *sd, mongoc_topology_scanner_t *scanner) { mongoc_topology_scanner_node_t *node; /* Search by ID and update hello_ok */ node = mongoc_topology_scanner_get_node(scanner, sd->id); if (node) { node->hello_ok = sd->hello_ok; } else if (!mongoc_topology_scanner_has_node_for_host(scanner, &sd->host)) { /* A node for this host was retired in this scan. */ mongoc_topology_scanner_add(scanner, &sd->host, sd->id, sd->hello_ok); mongoc_topology_scanner_scan(scanner, sd->id); } return true; } /* Called from: * - the topology scanner callback (when a hello was just received) * - at the start of a single-threaded scan (mongoc_topology_scan_once) * Not called for multi threaded monitoring. */ void mongoc_topology_reconcile(const mongoc_topology_t *topology, mongoc_topology_description_t *td) { mongoc_set_t *servers; mongoc_server_description_t *sd; mongoc_topology_scanner_node_t *ele, *tmp; BSON_ASSERT(topology->single_threaded); servers = mc_tpld_servers(td); /* Add newly discovered nodes */ for (size_t i = 0u; i < servers->items_len; i++) { sd = mongoc_set_get_item(servers, i); _mongoc_topology_reconcile_add_nodes(sd, topology->scanner); } /* Remove removed nodes */ DL_FOREACH_SAFE(topology->scanner->nodes, ele, tmp) { if (!mongoc_topology_description_server_by_id(td, ele->id, NULL)) { mongoc_topology_scanner_node_retire(ele); } } } /* call this while already holding the lock */ static bool _mongoc_topology_update_no_lock(uint32_t id, const bson_t *hello_response, int64_t rtt_msec, mongoc_topology_description_hello_cluster_time_strategy_t cluster_time_strategy, mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, const bson_error_t *error /* IN */) { mongoc_topology_description_handle_hello( td, log_and_monitor, id, hello_response, rtt_msec, cluster_time_strategy, error); /* return false if server removed from topology */ return mongoc_topology_description_server_by_id(td, id, NULL) != NULL; } /* *------------------------------------------------------------------------- * * _mongoc_topology_scanner_setup_err_cb -- * * Callback method to handle errors during topology scanner node * setup, typically DNS or SSL errors. * *------------------------------------------------------------------------- */ void _mongoc_topology_scanner_setup_err_cb(uint32_t id, void *data, const bson_error_t *error /* IN */) { mongoc_topology_t *topology = BSON_ASSERT_PTR_INLINE(data); BSON_ASSERT(topology->single_threaded); if (_mongoc_topology_get_type(topology) == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* In load balanced mode, scanning is only for connection establishment. * It must not modify the topology description. */ } else { // Use `mc_tpld_unsafe_get_mutable` to get a mutable topology description // without locking. This function only applies to single-threaded clients. mongoc_topology_description_t *td = mc_tpld_unsafe_get_mutable(topology); mongoc_topology_description_handle_hello(td, &topology->log_and_monitor, id, NULL /* hello reply */, -1 /* rtt_msec */, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, error); } } /* *------------------------------------------------------------------------- * * _mongoc_topology_scanner_cb -- * * Callback method to handle hello responses received by async * command objects. * * Only called for single-threaded monitoring. * *------------------------------------------------------------------------- */ void _mongoc_topology_scanner_cb( uint32_t id, const bson_t *hello_response, int64_t rtt_msec, void *data, const bson_error_t *error /* IN */) { mongoc_topology_t *const topology = BSON_ASSERT_PTR_INLINE(data); mongoc_server_description_t *sd; mongoc_topology_description_t *td; BSON_ASSERT(topology->single_threaded); if (_mongoc_topology_get_type(topology) == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* In load balanced mode, scanning is only for connection establishment. * It must not modify the topology description. */ return; } // Use `mc_tpld_unsafe_get_mutable` to get a mutable topology description // without locking. This function only applies to single-threaded clients. td = mc_tpld_unsafe_get_mutable(topology); sd = mongoc_topology_description_server_by_id(td, id, NULL); if (!hello_response) { /* Server monitoring: When a server check fails due to a network error * (including a network timeout), the client MUST clear its connection * pool for the server */ _mongoc_topology_description_clear_connection_pool(td, id, &kZeroObjectId); } /* Server Discovery and Monitoring Spec: "Once a server is connected, the * client MUST change its type to Unknown only after it has retried the * server once." */ if (!hello_response && sd && sd->type != MONGOC_SERVER_UNKNOWN) { _mongoc_topology_update_no_lock(id, hello_response, rtt_msec, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, td, &topology->log_and_monitor, error); /* add another hello call to the current scan - the scan continues * until all commands are done */ mongoc_topology_scanner_scan(topology->scanner, sd->id); } else { _mongoc_topology_update_no_lock(id, hello_response, rtt_msec, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, td, &topology->log_and_monitor, error); /* The processing of the hello results above may have added, changed, or * removed server descriptions. We need to reconcile that with our * monitoring agents */ mongoc_topology_reconcile(topology, td); } } static void _server_session_init(void *session, void *unused, bson_error_t *error) { BSON_UNUSED(unused); _mongoc_server_session_init(session, error); } static void _server_session_destroy(void *session, void *unused) { BSON_UNUSED(unused); _mongoc_server_session_destroy(session); } static int _server_session_should_prune(const void *session_vp, void *topo_vp) { BSON_ASSERT_PARAM(session_vp); BSON_ASSERT_PARAM(topo_vp); const mongoc_server_session_t *const session = session_vp; mongoc_topology_t *const topo = topo_vp; /** If "dirty" (i.e. contains a network error), it should be dropped */ if (session->dirty) { return true; } /** If the session has never been used, it should be dropped */ if (session->last_used_usec == SESSION_NEVER_USED) { return true; } /* Check for a timeout */ mc_shared_tpld td = mc_tpld_take_ref(topo); const int64_t timeout = td.ptr->session_timeout_minutes; const bool is_loadbalanced = td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED; mc_tpld_drop_ref(&td); /** Load balanced topology sessions never expire */ if (is_loadbalanced) { return false; } /* Prune the session if it has hit a timeout */ return _mongoc_server_session_timed_out(session, timeout); } static void _tpld_destroy_and_free(void *tpl_descr) { mongoc_topology_description_t *td = tpl_descr; mongoc_topology_description_destroy(td); } const mongoc_host_list_t ** _mongoc_apply_srv_max_hosts(const mongoc_host_list_t *hl, size_t max_hosts, size_t *hl_array_size) { const mongoc_host_list_t **hl_array; BSON_ASSERT_PARAM(hl_array_size); const size_t hl_size = _mongoc_host_list_length(hl); if (hl_size == 0u) { *hl_array_size = 0u; return NULL; } hl_array = BSON_ARRAY_ALLOC(hl_size, const mongoc_host_list_t *); for (size_t idx = 0u; hl; hl = hl->next) { hl_array[idx++] = hl; } if (max_hosts == 0u || // Unlimited. hl_size == 1u || // Trivial case. hl_size <= max_hosts // Already satisfies limit. ) { /* No random shuffle or selection required. */ *hl_array_size = hl_size; return hl_array; } /* Initial DNS Seedlist Discovery Spec: If `srvMaxHosts` is greater than zero * and less than the number of hosts in the DNS result, the driver MUST * randomly select that many hosts and use them to populate the seedlist. * Drivers SHOULD use the `Fisher-Yates shuffle` for randomization. */ for (size_t idx = hl_size - 1u; idx > 0u; --idx) { /* 0 <= swap_pos <= idx */ const size_t swap_pos = _mongoc_rand_size_t(0u, idx); const mongoc_host_list_t *tmp = hl_array[swap_pos]; hl_array[swap_pos] = hl_array[idx]; hl_array[idx] = tmp; } *hl_array_size = max_hosts; return hl_array; } // `_detect_nongenuine_host` logs if the host string suggests use of CosmosDB or // DocumentDB. See DRIVERS-2583 for behavior requirements. Returns true if a // CosmosDB or DocumentDB host is detected. static bool _detect_nongenuine_host(const char *host) { char *const host_lowercase = bson_strdup(host); mongoc_lowercase(host, host_lowercase); if (mongoc_ends_with(host_lowercase, ".cosmos.azure.com")) { MONGOC_INFO("You appear to be connected to a CosmosDB cluster. For more " "information regarding feature compatibility and support please " "visit https://www.mongodb.com/supportability/cosmosdb"); bson_free(host_lowercase); return true; } if (mongoc_ends_with(host_lowercase, ".docdb.amazonaws.com") || mongoc_ends_with(host_lowercase, ".docdb-elastic.amazonaws.com")) { MONGOC_INFO("You appear to be connected to a DocumentDB cluster. For more " "information regarding feature compatibility and support please " "visit https://www.mongodb.com/supportability/documentdb"); bson_free(host_lowercase); return true; } bson_free(host_lowercase); return false; } static void _detect_nongenuine_hosts(const mongoc_uri_t *uri) { const char *srv_hostname = mongoc_uri_get_srv_hostname(uri); if (srv_hostname) { _detect_nongenuine_host(srv_hostname); return; } const mongoc_host_list_t *iter; LL_FOREACH(mongoc_uri_get_hosts(uri), iter) { if (_detect_nongenuine_host(iter->host)) { return; } } } /* *------------------------------------------------------------------------- * * mongoc_topology_new -- * * Creates and returns a new topology object. * * Returns: * A new topology object. * * Side effects: * None. * *------------------------------------------------------------------------- */ mongoc_topology_t * mongoc_topology_new(const mongoc_uri_t *uri, bool single_threaded) { mongoc_topology_t *topology; mongoc_topology_description_type_t init_type; mongoc_topology_description_t *td; const char *srv_hostname; const mongoc_host_list_t *hl; mongoc_rr_data_t rr_data; bool has_directconnection; bool directconnection; BSON_ASSERT(uri); _detect_nongenuine_hosts(uri); #ifndef MONGOC_ENABLE_CRYPTO if (mongoc_uri_get_option_as_bool(uri, MONGOC_URI_RETRYWRITES, MONGOC_DEFAULT_RETRYWRITES)) { /* retryWrites requires sessions, which require crypto - just warn */ MONGOC_WARNING("retryWrites not supported without an SSL crypto library"); } #endif topology = (mongoc_topology_t *)bson_malloc0(sizeof *topology); topology->oidc_cache = mongoc_oidc_cache_new(); // Check if requested to use TCP for SRV lookup. { char *srv_prefer_tcp = _mongoc_getenv("MONGOC_EXPERIMENTAL_SRV_PREFER_TCP"); if (srv_prefer_tcp) { topology->srv_prefer_tcp = true; } bson_free(srv_prefer_tcp); } topology->usleep_fn = mongoc_usleep_default_impl; topology->session_pool = mongoc_server_session_pool_new_with_params( _server_session_init, _server_session_destroy, _server_session_should_prune, topology); // Capture default structured log options from the environment mongoc_log_and_monitor_instance_init(&topology->log_and_monitor); topology->valid = false; const int32_t heartbeat_default = single_threaded ? MONGOC_TOPOLOGY_HEARTBEAT_FREQUENCY_MS_SINGLE_THREADED : MONGOC_TOPOLOGY_HEARTBEAT_FREQUENCY_MS_MULTI_THREADED; const int32_t heartbeat = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, heartbeat_default); topology->_shared_descr_._sptr_ = mongoc_shared_ptr_create(BSON_ALIGNED_ALLOC0(mongoc_topology_description_t), _tpld_destroy_and_free); td = mc_tpld_unsafe_get_mutable(topology); mongoc_topology_description_init(td, heartbeat); td->set_name = bson_strdup(mongoc_uri_get_replica_set(uri)); topology->uri = mongoc_uri_copy(uri); topology->cse_state = MONGOC_CSE_DISABLED; topology->single_threaded = single_threaded; if (single_threaded) { /* Server Selection Spec: * * "Single-threaded drivers MUST provide a "serverSelectionTryOnce" * mode, in which the driver scans the topology exactly once after * server selection fails, then either selects a server or raises an * error. * * "The serverSelectionTryOnce option MUST be true by default." */ topology->server_selection_try_once = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, true); } else { topology->server_selection_try_once = false; } topology->server_selection_timeout_msec = mongoc_uri_get_option_as_int32( topology->uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, MONGOC_TOPOLOGY_SERVER_SELECTION_TIMEOUT_MS); /* tests can override this */ topology->min_heartbeat_frequency_msec = MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS; topology->local_threshold_msec = mongoc_uri_get_local_threshold_option(topology->uri); /* Total time allowed to check a server is connectTimeoutMS. * Server Discovery And Monitoring Spec: * * "The socket used to check a server MUST use the same connectTimeoutMS as * regular sockets. Multi-threaded clients SHOULD set monitoring sockets' * socketTimeoutMS to the connectTimeoutMS." */ topology->connect_timeout_msec = mongoc_uri_get_option_as_int32(topology->uri, MONGOC_URI_CONNECTTIMEOUTMS, MONGOC_DEFAULT_CONNECTTIMEOUTMS); topology->scanner_state = MONGOC_TOPOLOGY_SCANNER_OFF; topology->scanner = mongoc_topology_scanner_new(topology->uri, &td->topology_id, &topology->log_and_monitor, _mongoc_topology_scanner_setup_err_cb, _mongoc_topology_scanner_cb, topology, topology->connect_timeout_msec); _mongoc_topology_scanner_set_oidc_cache(topology->scanner, topology->oidc_cache); bson_mutex_init(&topology->tpld_modification_mtx); mongoc_cond_init(&topology->cond_client); if (single_threaded) { /* single threaded drivers attempt speculative authentication during a * topology scan */ topology->scanner->speculative_authentication = true; /* single threaded clients negotiate sasl supported mechanisms during * a topology scan. */ if (_mongoc_uri_requires_auth_negotiation(uri)) { topology->scanner->negotiate_sasl_supported_mechs = true; } } srv_hostname = mongoc_uri_get_srv_hostname(uri); if (srv_hostname) { char *prefixed_hostname; memset(&rr_data, 0, sizeof(mongoc_rr_data_t)); /* Set the default resource record resolver */ topology->rr_resolver = _mongoc_client_get_rr; /* Initialize the last scan time and interval. Even if the initial DNS * lookup fails, SRV polling will still start when background monitoring * starts. */ topology->srv_polling_last_scan_ms = bson_get_monotonic_time() / 1000; _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, MONGOC_TOPOLOGY_MIN_RESCAN_SRV_INTERVAL_MS); /* a mongodb+srv URI. try SRV lookup, if no error then also try TXT */ prefixed_hostname = bson_strdup_printf("_%s._tcp.%s", mongoc_uri_get_srv_service_name(uri), srv_hostname); if (!topology->rr_resolver(prefixed_hostname, MONGOC_RR_SRV, &rr_data, MONGOC_RR_DEFAULT_BUFFER_SIZE, topology->srv_prefer_tcp, &topology->scanner->error)) { GOTO(srv_fail); } /* Failure to find TXT records will not return an error (since it is only * for options). But _mongoc_client_get_rr may return an error if * there is more than one TXT record returned. */ if (!topology->rr_resolver(srv_hostname, MONGOC_RR_TXT, &rr_data, MONGOC_RR_DEFAULT_BUFFER_SIZE, topology->srv_prefer_tcp, &topology->scanner->error)) { GOTO(srv_fail); } /* Use rr_data to update the topology's URI. */ if (rr_data.txt_record_opts && !_mongoc_uri_apply_query_string( topology->uri, mstr_cstring(rr_data.txt_record_opts), true /* from_dns */, &topology->scanner->error)) { GOTO(srv_fail); } if (!mongoc_uri_init_with_srv_host_list(topology->uri, rr_data.hosts, &topology->scanner->error)) { GOTO(srv_fail); } topology->srv_polling_last_scan_ms = bson_get_monotonic_time() / 1000; /* TODO (CDRIVER-4047) use BSON_MIN */ int64_t new_iv = BSON_MAX(rr_data.min_ttl * 1000, MONGOC_TOPOLOGY_MIN_RESCAN_SRV_INTERVAL_MS); _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, new_iv); topology->valid = true; srv_fail: bson_free(rr_data.txt_record_opts); bson_free(prefixed_hostname); _mongoc_host_list_destroy_all(rr_data.hosts); } else { topology->valid = true; } if (!mongoc_uri_finalize(topology->uri, &topology->scanner->error)) { topology->valid = false; } td->max_hosts = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SRVMAXHOSTS, 0); if (td->max_hosts < 0) { topology->valid = false; } /* * Set topology type from URI: * + if directConnection=true * - whether or not we have a replicaSet name, initialize to SINGLE * (directConnect with SRV or multiple hosts triggers a URI parse error) * + if directConnection=false * - if we've got a replicaSet name, initialize to RS_NO_PRIMARY * - otherwise, initialize to UNKNOWN * + if directConnection was not specified in the URI (old behavior) * - if we've got a replicaSet name, initialize to RS_NO_PRIMARY * - otherwise, if the seed list has a single host, initialize to SINGLE * - everything else gets initialized to UNKNOWN */ has_directconnection = mongoc_uri_has_option(uri, MONGOC_URI_DIRECTCONNECTION); directconnection = has_directconnection && mongoc_uri_get_option_as_bool(uri, MONGOC_URI_DIRECTCONNECTION, false); hl = mongoc_uri_get_hosts(topology->uri); /* If loadBalanced is enabled, directConnection is disabled. This was * validated in mongoc_uri_finalize_loadbalanced, which is called by * mongoc_uri_finalize. */ if (mongoc_uri_get_option_as_bool(topology->uri, MONGOC_URI_LOADBALANCED, false)) { init_type = MONGOC_TOPOLOGY_LOAD_BALANCED; if (topology->single_threaded) { /* Cooldown only applies to server monitoring for single-threaded * clients. In load balanced mode, the topology scanner is used to * create connections. The cooldown period does not apply. A network * error to a load balanced connection does not imply subsequent * connection attempts will be to the same server and that a delay * should occur. */ _mongoc_topology_bypass_cooldown(topology); } _mongoc_topology_scanner_set_loadbalanced(topology->scanner, true); } else if (srv_hostname && !has_directconnection) { init_type = MONGOC_TOPOLOGY_UNKNOWN; } else if (has_directconnection) { if (directconnection) { init_type = MONGOC_TOPOLOGY_SINGLE; } else { if (mongoc_uri_get_replica_set(topology->uri)) { init_type = MONGOC_TOPOLOGY_RS_NO_PRIMARY; } else { init_type = MONGOC_TOPOLOGY_UNKNOWN; } } } else if (mongoc_uri_get_replica_set(topology->uri)) { init_type = MONGOC_TOPOLOGY_RS_NO_PRIMARY; } else { if (hl && hl->next) { init_type = MONGOC_TOPOLOGY_UNKNOWN; } else { init_type = MONGOC_TOPOLOGY_SINGLE; } } td->type = init_type; if (!topology->single_threaded) { topology->server_monitors = mongoc_set_new(1, NULL, NULL); topology->rtt_monitors = mongoc_set_new(1, NULL, NULL); bson_mutex_init(&topology->srv_polling_mtx); mongoc_cond_init(&topology->srv_polling_cond); } if (!topology->valid) { TRACE("%s", "topology invalid"); /* add no nodes */ return topology; } // URI and topology are valid. Try to apply to OIDC environment. mongoc_oidc_cache_apply_env_from_uri(topology->oidc_cache, topology->uri); size_t hl_array_size = 0u; BSON_ASSERT(mlib_in_range(size_t, td->max_hosts)); const mongoc_host_list_t *const *hl_array = _mongoc_apply_srv_max_hosts(hl, (size_t)td->max_hosts, &hl_array_size); for (size_t idx = 0u; idx < hl_array_size; ++idx) { const mongoc_host_list_t *const elem = hl_array[idx]; uint32_t id = 0u; mongoc_topology_description_add_server(td, &topology->log_and_monitor, elem->host_and_port, &id); mongoc_topology_scanner_add(topology->scanner, elem, id, false); } bson_free((void *)hl_array); return topology; } /* *------------------------------------------------------------------------- * * mongoc_topology_destroy -- * * Free the memory associated with this topology object. * * Returns: * None. * * Side effects: * @topology will be cleaned up. * *------------------------------------------------------------------------- */ void mongoc_topology_destroy(mongoc_topology_t *topology) { if (!topology) { return; } #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION bson_free(topology->keyvault_db); bson_free(topology->keyvault_coll); mongoc_client_destroy(topology->mongocryptd_client); mongoc_client_pool_destroy(topology->mongocryptd_client_pool); _mongoc_crypt_destroy(topology->crypt); bson_destroy(topology->mongocryptd_spawn_args); bson_free(topology->mongocryptd_spawn_path); #endif if (!topology->single_threaded) { _mongoc_topology_background_monitoring_stop(topology); BSON_ASSERT(topology->scanner_state == MONGOC_TOPOLOGY_SCANNER_OFF); mongoc_set_destroy(topology->server_monitors); mongoc_set_destroy(topology->rtt_monitors); bson_mutex_destroy(&topology->srv_polling_mtx); mongoc_cond_destroy(&topology->srv_polling_cond); } /* Before reporting this topology as closed, life cycle rules expect us to close * all servers and transition to an unknown topology. */ { /* Prefer mc_tpld_unsafe_get_const to mc_tpld_take_ref/drop_ref here: no other references remain, and bypassing * the shared pointer lock has the side-effect of revealing problems in TSAN. */ const mongoc_topology_description_t *td = mc_tpld_unsafe_get_const(topology); for (size_t i = 0u; i < mc_tpld_servers_const(td)->items_len; i++) { const mongoc_server_description_t *sd = mongoc_set_get_item_const(mc_tpld_servers_const(td), i); _mongoc_topology_description_monitor_server_closed(td, &topology->log_and_monitor, sd); } // Transition to an "Unknown" td that will exist only for monitoring purposes just before closing mongoc_topology_description_t next_td; mongoc_topology_description_init(&next_td, td->heartbeat_msec); bson_oid_copy(&td->topology_id, &next_td.topology_id); next_td.opened = td->opened; _mongoc_topology_description_monitor_changed(td, &next_td, &topology->log_and_monitor); _mongoc_topology_description_monitor_closed(&next_td, &topology->log_and_monitor); mongoc_topology_description_cleanup(&next_td); } mongoc_uri_destroy(topology->uri); mongoc_shared_ptr_reset_null(&topology->_shared_descr_._sptr_); mongoc_topology_scanner_destroy(topology->scanner); mongoc_server_session_pool_free(topology->session_pool); bson_free(topology->clientSideEncryption.autoOptions.extraOptions.cryptSharedLibPath); mongoc_log_and_monitor_instance_destroy_contents(&topology->log_and_monitor); mongoc_cond_destroy(&topology->cond_client); bson_mutex_destroy(&topology->tpld_modification_mtx); bson_destroy(topology->encrypted_fields_map); mongoc_oidc_cache_destroy(topology->oidc_cache); bson_free(topology); } /* Returns false if none of the hosts were valid. */ bool mongoc_topology_apply_scanned_srv_hosts(mongoc_uri_t *uri, mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_host_list_t *hosts, bson_error_t *error) { mongoc_host_list_t *host; mongoc_host_list_t *valid_hosts = NULL; bool had_valid_hosts = false; /* Validate that the hosts have a matching domain. * If validation fails, log it. * If no valid hosts remain, do not update the topology description. */ LL_FOREACH(hosts, host) { if (mongoc_uri_validate_srv_result(uri, host->host, error)) { _mongoc_host_list_upsert(&valid_hosts, host); } else { MONGOC_ERROR("Invalid host returned by SRV: %s", host->host_and_port); /* Continue on, there may still be valid hosts returned. */ } } if (valid_hosts) { /* Reconcile with the topology description. Newly found servers will start * getting monitored and are eligible to be used by clients. */ mongoc_topology_description_reconcile(td, log_and_monitor, valid_hosts); had_valid_hosts = true; } else { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "SRV response did not contain any valid hosts"); } _mongoc_host_list_destroy_all(valid_hosts); return had_valid_hosts; } /* *-------------------------------------------------------------------------- * * mongoc_topology_should_rescan_srv -- * * Checks whether it is valid to rescan SRV records on the topology. * Namely, that the topology type is Sharded or Unknown, and that * the topology URI was configured with SRV. * * If this returns false, caller can stop scanning SRV records * and does not need to try again in the future. * * -------------------------------------------------------------------------- */ bool mongoc_topology_should_rescan_srv(mongoc_topology_t *topology) { const char *srv_hostname = mongoc_uri_get_srv_hostname(topology->uri); mongoc_topology_description_type_t type; if (!srv_hostname) { /* Only rescan if we have a mongodb+srv:// URI. */ return false; } type = _mongoc_topology_get_type(topology); /* Only perform rescan for sharded topology. */ return type == MONGOC_TOPOLOGY_SHARDED || type == MONGOC_TOPOLOGY_UNKNOWN; } /* *-------------------------------------------------------------------------- * * mongoc_topology_rescan_srv -- * * Queries SRV records for new hosts in a mongos cluster. * Caller must call mongoc_topology_should_rescan_srv before calling * to ensure preconditions are met. * * NOTE: This method may update the topology description. * * -------------------------------------------------------------------------- */ void mongoc_topology_rescan_srv(mongoc_topology_t *topology) { mongoc_rr_data_t rr_data = {0}; const char *srv_hostname; char *prefixed_hostname = NULL; int64_t scan_time_ms; bool ret; mc_shared_tpld td; mc_tpld_modification tdmod; BSON_ASSERT(mongoc_topology_should_rescan_srv(topology)); srv_hostname = mongoc_uri_get_srv_hostname(topology->uri); scan_time_ms = topology->srv_polling_last_scan_ms + _mongoc_topology_get_srv_polling_rescan_interval_ms(topology); if (bson_get_monotonic_time() / 1000 < scan_time_ms) { /* Query SRV no more frequently than srv_polling_rescan_interval_ms. */ return; } TRACE("%s", "Polling for SRV records"); /* Go forth and query... */ prefixed_hostname = bson_strdup_printf("_%s._tcp.%s", mongoc_uri_get_srv_service_name(topology->uri), srv_hostname); ret = topology->rr_resolver(prefixed_hostname, MONGOC_RR_SRV, &rr_data, MONGOC_RR_DEFAULT_BUFFER_SIZE, topology->srv_prefer_tcp, &topology->scanner->error); td = mc_tpld_take_ref(topology); topology->srv_polling_last_scan_ms = bson_get_monotonic_time() / 1000; if (!ret) { /* Failed querying, soldier on and try again next time. */ _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, td.ptr->heartbeat_msec); MONGOC_ERROR("SRV polling error: %s", topology->scanner->error.message); GOTO(done); } /* TODO (CDRIVER-4047) use BSON_MIN */ const int64_t new_iv = BSON_MAX(rr_data.min_ttl * 1000, MONGOC_TOPOLOGY_MIN_RESCAN_SRV_INTERVAL_MS); _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, new_iv); tdmod = mc_tpld_modify_begin(topology); if (!mongoc_topology_apply_scanned_srv_hosts( topology->uri, tdmod.new_td, &topology->log_and_monitor, rr_data.hosts, &topology->scanner->error)) { MONGOC_ERROR("%s", topology->scanner->error.message); /* Special case when DNS returns zero records successfully or no valid * hosts exist. * Leave the toplogy alone and perform another scan at the next interval * rather than removing all records and having nothing to connect to. * For no verified hosts drivers "MUST temporarily set * srv_polling_rescan_interval_ms * to heartbeatFrequencyMS until at least one verified SRV record is * obtained." */ _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, td.ptr->heartbeat_msec); } mc_tpld_modify_commit(tdmod); done: mc_tpld_drop_ref(&td); bson_free(prefixed_hostname); _mongoc_host_list_destroy_all(rr_data.hosts); } /* *-------------------------------------------------------------------------- * * mongoc_topology_scan_once -- * * Runs a single complete scan. * * NOTE: This method updates the topology description. * * Only runs for single threaded monitoring. (obey_cooldown is always * true). * *-------------------------------------------------------------------------- */ static void mongoc_topology_scan_once(mongoc_topology_t *topology, bool obey_cooldown) { mongoc_topology_description_t *td; BSON_ASSERT(topology->single_threaded); if (mongoc_topology_should_rescan_srv(topology)) { /* Prior to scanning hosts, update the list of SRV hosts, if applicable. */ mongoc_topology_rescan_srv(topology); } /* since the last scan, members may be added or removed from the topology * description based on hello responses in connection handshakes, see * _mongoc_topology_update_from_handshake. retire scanner nodes for removed * members and create scanner nodes for new ones. */ // Use `mc_tpld_unsafe_get_mutable` to get a mutable topology description // without locking. This function only applies to single-threaded clients. td = mc_tpld_unsafe_get_mutable(topology); mongoc_topology_reconcile(topology, td); mongoc_topology_scanner_start(topology->scanner, obey_cooldown); mongoc_topology_scanner_work(topology->scanner); _mongoc_topology_scanner_finish(topology->scanner); topology->last_scan = bson_get_monotonic_time(); topology->stale = false; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_do_blocking_scan -- * * Monitoring entry for single-threaded use case. Assumes the caller * has checked that it's the right time to scan. * *-------------------------------------------------------------------------- */ void _mongoc_topology_do_blocking_scan(mongoc_topology_t *topology, bson_error_t *error) { BSON_ASSERT(topology->single_threaded); _mongoc_handshake_freeze(); mongoc_topology_scan_once(topology, true /* obey cooldown */); mongoc_topology_scanner_get_error(topology->scanner, error); } bool mongoc_topology_compatible(const mongoc_topology_description_t *td, const mongoc_read_prefs_t *read_prefs, bson_error_t *error) { if (td->compatibility_error.code) { if (error) { memcpy(error, &td->compatibility_error, sizeof(bson_error_t)); } return false; } if (!read_prefs) { /* NULL means read preference Primary */ return true; } const int64_t max_staleness_seconds = mongoc_read_prefs_get_max_staleness_seconds(read_prefs); if (max_staleness_seconds != MONGOC_NO_MAX_STALENESS) { /* shouldn't happen if we've properly enforced wire version */ if (!mongoc_topology_description_all_sds_have_write_date(td)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "Not all servers have lastWriteDate"); return false; } if (!_mongoc_topology_description_validate_max_staleness(td, max_staleness_seconds, error)) { return false; } } return true; } static void _mongoc_server_selection_error(const char *msg, const bson_error_t *scanner_error, bson_error_t *error) { if (scanner_error && scanner_error->code) { _mongoc_set_error(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "%s: %s", msg, scanner_error->message); } else { _mongoc_set_error(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "%s", msg); } } mongoc_server_description_t * mongoc_topology_select(mongoc_topology_t *topology, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, bool *must_use_primary, bson_error_t *error) { uint32_t server_id = mongoc_topology_select_server_id(topology, optype, log_context, read_prefs, must_use_primary, NULL, error); if (server_id) { /* new copy of the server description */ mongoc_server_description_t *ret; mc_shared_tpld td = mc_tpld_take_ref(topology); mongoc_server_description_t const *sd = mongoc_topology_description_server_by_id_const(td.ptr, server_id, error); ret = mongoc_server_description_new_copy(sd); mc_tpld_drop_ref(&td); return ret; } else { return NULL; } } /* Bypasses normal server selection behavior for a load balanced topology. * Returns the id of the one load balancer server. Returns 0 on failure. * Successful post-condition: On a single threaded client, a connection will * have been established. */ static uint32_t _mongoc_topology_select_server_id_loadbalanced(mongoc_topology_t *topology, bson_error_t *error) { mongoc_server_description_t const *selected_server; int32_t selected_server_id; mongoc_topology_scanner_node_t *node; bson_error_t scanner_error = {0}; mc_shared_tpld td = mc_tpld_take_ref(topology); BSON_ASSERT(td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED); /* Emit the opening SDAM events if they have not emitted already. */ { mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); _mongoc_topology_description_monitor_opening(tdmod.new_td, &topology->log_and_monitor); mc_tpld_modify_commit(tdmod); mc_tpld_renew_ref(&td, topology); } selected_server = mongoc_topology_description_select(td.ptr, MONGOC_SS_WRITE, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, 0 /* local threshold */); if (!selected_server) { _mongoc_server_selection_error("No suitable server found in load balanced deployment", NULL, error); selected_server_id = 0; goto done; } selected_server_id = selected_server->id; if (!topology->single_threaded) { goto done; } /* If this is a single threaded topology, we must ensure that a connection is * available to this server. Wrapping drivers make the assumption that * successful server selection implies a connection is available. */ node = mongoc_topology_scanner_get_node(topology->scanner, selected_server_id); if (!node) { _mongoc_server_selection_error("Topology scanner in invalid state; cannot find load balancer", NULL, error); selected_server_id = 0; goto done; } if (!node->stream) { TRACE("%s", "Server selection performing scan since no connection has " "been established"); _mongoc_topology_do_blocking_scan(topology, &scanner_error); } if (!node->stream) { /* Use the same error domain / code that is returned in mongoc-cluster.c * when fetching a stream fails. */ if (scanner_error.code) { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not establish stream for node %s: %s", node->host.host_and_port, scanner_error.message); } else { _mongoc_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not establish stream for node %s", node->host.host_and_port); } selected_server_id = 0; goto done; } done: mc_tpld_drop_ref(&td); return selected_server_id; } uint32_t mongoc_topology_select_server_id(mongoc_topology_t *topology, mongoc_ss_optype_t optype, const mongoc_ss_log_context_t *log_context, const mongoc_read_prefs_t *read_prefs, bool *must_use_primary, const mongoc_deprioritized_servers_t *ds, bson_error_t *error) { static const char *timeout_msg = "No suitable servers found: `serverSelectionTimeoutMS` expired"; mongoc_topology_scanner_t *ts; int r; int64_t local_threshold_ms; const mongoc_server_description_t *selected_server = NULL; bool try_once; int64_t sleep_usec; bool tried_once; bool logged_waiting_for_suitable_server = false; bson_error_t scanner_error = {0}; int64_t heartbeat_msec; uint32_t server_id; mc_shared_tpld td = mc_tpld_take_ref(topology); const mongoc_log_and_monitor_instance_t *log_and_monitor = &topology->log_and_monitor; mcommon_string_append_t topology_type; mcommon_string_new_as_append(&topology_type); mcommon_string_append(&topology_type, ". Topology type: "); mcommon_string_append(&topology_type, mongoc_topology_description_type(td.ptr)); /* These names come from the Server Selection Spec pseudocode */ int64_t loop_start; /* when we entered this function */ int64_t loop_end; /* when we last completed a loop (single-threaded) */ int64_t scan_ready; /* the soonest we can do a blocking scan */ int64_t next_update; /* the latest we must do a blocking scan */ int64_t expire_at; /* when server selection timeout expires */ BSON_ASSERT(topology); ts = topology->scanner; mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Server selection started", read_prefs("selector", read_prefs), utf8("operation", log_context->operation), int64(log_context->has_operation_id ? "operationId" : NULL, log_context->operation_id), topology_as_description_json("topologyDescription", topology)); if (!mongoc_topology_scanner_valid(ts)) { if (error) { mongoc_topology_scanner_get_error(ts, error); error->domain = MONGOC_ERROR_SERVER_SELECTION; error->code = MONGOC_ERROR_SERVER_SELECTION_FAILURE; _mongoc_set_error_category(error, MONGOC_ERROR_CATEGORY); } server_id = 0; goto done; } if (td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED) { server_id = _mongoc_topology_select_server_id_loadbalanced(topology, error); goto done; } heartbeat_msec = td.ptr->heartbeat_msec; local_threshold_ms = topology->local_threshold_msec; try_once = topology->server_selection_try_once; loop_start = loop_end = bson_get_monotonic_time(); expire_at = loop_start + ((int64_t)topology->server_selection_timeout_msec * 1000); if (topology->single_threaded) { // Use `mc_tpld_unsafe_get_mutable` to get a mutable topology // description without locking. This block only applies to // single-threaded clients. _mongoc_topology_description_monitor_opening(mc_tpld_unsafe_get_mutable(topology), log_and_monitor); mc_tpld_renew_ref(&td, topology); tried_once = false; next_update = topology->last_scan + heartbeat_msec * 1000; if (next_update < loop_start) { /* we must scan now */ topology->stale = true; } /* until we find a server or time out */ for (;;) { if (topology->stale) { /* how soon are we allowed to scan? */ scan_ready = topology->last_scan + topology->min_heartbeat_frequency_msec * 1000; if (scan_ready > expire_at && !try_once) { /* selection timeout will expire before min heartbeat passes */ _mongoc_server_selection_error(timeout_msg, &scanner_error, error); server_id = 0; goto done; } sleep_usec = scan_ready - loop_end; if (sleep_usec > 0) { if (try_once && mongoc_topology_scanner_in_cooldown(ts, scan_ready)) { _mongoc_server_selection_error("No servers yet eligible for rescan", &scanner_error, error); server_id = 0; goto done; } if (!logged_waiting_for_suitable_server) { logged_waiting_for_suitable_server = true; mongoc_structured_log( log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_INFO, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Waiting for suitable server to become available", read_prefs("selector", read_prefs), utf8("operation", log_context->operation), int64(log_context->has_operation_id ? "operationId" : NULL, log_context->operation_id), topology_as_description_json("topologyDescription", topology), int64("remainingTimeMS", (expire_at - loop_end) / 1000)); } topology->usleep_fn(sleep_usec, topology->usleep_data); } /* takes up to connectTimeoutMS. sets "last_scan", clears "stale" */ _mongoc_topology_do_blocking_scan(topology, &scanner_error); loop_end = topology->last_scan; tried_once = true; } /* Topology may have just been updated by a scan. */ mc_tpld_renew_ref(&td, topology); if (!mongoc_topology_compatible(td.ptr, read_prefs, error)) { server_id = 0; goto done; } selected_server = mongoc_topology_description_select(td.ptr, optype, read_prefs, must_use_primary, ds, local_threshold_ms); if (selected_server) { server_id = selected_server->id; goto done; } topology->stale = true; if (try_once) { if (tried_once) { _mongoc_server_selection_error( "No suitable servers found (`serverSelectionTryOnce` set)", &scanner_error, error); server_id = 0; goto done; } } else { loop_end = bson_get_monotonic_time(); if (loop_end > expire_at) { /* no time left in server_selection_timeout_msec */ _mongoc_server_selection_error(timeout_msg, &scanner_error, error); server_id = 0; goto done; } } } } /* With background thread */ /* we break out when we've found a server or timed out */ for (;;) { /* Topology may have been updated on a previous loop iteration */ mc_tpld_renew_ref(&td, topology); if (!mongoc_topology_compatible(td.ptr, read_prefs, error)) { server_id = 0; goto done; } selected_server = mongoc_topology_description_select(td.ptr, optype, read_prefs, must_use_primary, ds, local_threshold_ms); if (selected_server) { server_id = selected_server->id; goto done; } /* tlpd_modification_mtx is used to synchronize updates to the topology. * Take that lock to do a wait on the topology to become up-to-date and * synchronize with a condition variable that will be signalled upon * topology changes. */ bson_mutex_lock(&topology->tpld_modification_mtx); /* Now that we have the lock, check again, since a scan may have * occurred while we were waiting on the lock. */ mc_tpld_renew_ref(&td, topology); selected_server = mongoc_topology_description_select(td.ptr, optype, read_prefs, must_use_primary, ds, local_threshold_ms); if (selected_server) { server_id = selected_server->id; bson_mutex_unlock(&topology->tpld_modification_mtx); goto done; } /* Still nothing. Request that the scanner do a scan now. */ TRACE("server selection requesting an immediate scan, want %s", _mongoc_read_mode_as_str(mongoc_read_prefs_get_mode(read_prefs))); _mongoc_topology_request_scan(topology); if (!logged_waiting_for_suitable_server) { logged_waiting_for_suitable_server = true; mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_INFO, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Waiting for suitable server to become available", read_prefs("selector", read_prefs), utf8("operation", log_context->operation), int64(log_context->has_operation_id ? "operationId" : NULL, log_context->operation_id), topology_as_description_json("topologyDescription", topology), int64("remainingTimeMS", (expire_at - loop_start) / 1000)); } TRACE("server selection about to wait for %" PRId64 "ms", (expire_at - loop_start) / 1000); r = mongoc_cond_timedwait( &topology->cond_client, &topology->tpld_modification_mtx, (expire_at - loop_start) / 1000); TRACE("%s", "server selection awake"); /* Refresh our topology handle */ mc_tpld_renew_ref(&td, topology); _topology_collect_errors(td.ptr, &scanner_error); bson_mutex_unlock(&topology->tpld_modification_mtx); #ifdef _WIN32 if (r == WSAETIMEDOUT) { #else if (r == ETIMEDOUT) { #endif /* handle timeouts */ _mongoc_server_selection_error(timeout_msg, &scanner_error, error); server_id = 0; goto done; } else if (r) { _mongoc_set_error(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "Unknown error '%d' received while waiting on " "thread condition", r); server_id = 0; goto done; } loop_start = bson_get_monotonic_time(); if (loop_start > expire_at) { _mongoc_server_selection_error(timeout_msg, &scanner_error, error); server_id = 0; goto done; } } done: /* server_id set to zero indicates an error has occurred and that `error` should be initialized */ if (server_id == 0) { if (error && error->domain == MONGOC_ERROR_SERVER_SELECTION) { _mongoc_error_append(error, mcommon_str_from_append(&topology_type)); } mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Server selection failed", read_prefs("selector", read_prefs), utf8("operation", log_context->operation), int64(log_context->has_operation_id ? "operationId" : NULL, log_context->operation_id), topology_as_description_json("topologyDescription", topology), error("failure", error)); } else { mongoc_structured_log(log_and_monitor->structured_log, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Server selection succeeded", read_prefs("selector", read_prefs), utf8("operation", log_context->operation), int64(log_context->has_operation_id ? "operationId" : NULL, log_context->operation_id), topology_as_description_json("topologyDescription", topology), server_description(mongoc_topology_description_server_by_id_const(td.ptr, server_id, NULL), SERVER_HOST, SERVER_PORT)); } mcommon_string_from_append_destroy(&topology_type); mc_tpld_drop_ref(&td); return server_id; } mongoc_host_list_t * _mongoc_topology_host_by_id(const mongoc_topology_description_t *td, uint32_t id, bson_error_t *error) { mongoc_server_description_t const *sd; mongoc_host_list_t *host = NULL; /* not a copy - direct pointer into topology description data */ sd = mongoc_topology_description_server_by_id_const(td, id, error); if (sd) { host = bson_malloc0(sizeof(mongoc_host_list_t)); memcpy(host, &sd->host, sizeof(mongoc_host_list_t)); } return host; } void _mongoc_topology_request_scan(mongoc_topology_t *topology) { _mongoc_topology_background_monitoring_request_scan(topology); } bool _mongoc_topology_update_from_handshake(mongoc_topology_t *topology, const mongoc_server_description_t *sd) { bool has_server; mc_tpld_modification tdmod; BSON_ASSERT(topology); BSON_ASSERT(sd); BSON_ASSERT(!topology->single_threaded); if (_mongoc_topology_get_type(topology) == MONGOC_TOPOLOGY_LOAD_BALANCED) { /* In load balanced mode, scanning is only for connection establishment. * It must not modify the topology description. */ return true; } tdmod = mc_tpld_modify_begin(topology); /* return false if server was removed from topology */ has_server = _mongoc_topology_update_no_lock(sd->id, &sd->last_hello_response, sd->round_trip_time_msec, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, tdmod.new_td, &topology->log_and_monitor, NULL); /* if pooled, wake threads waiting in mongoc_topology_server_by_id */ mongoc_cond_broadcast(&topology->cond_client); /* Update background monitoring. */ _mongoc_topology_background_monitoring_reconcile(topology, tdmod.new_td); mc_tpld_modify_commit(tdmod); return has_server; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_update_last_used -- * * Internal function. In single-threaded mode only, track when the socket * to a particular server was last used. This is required for * mongoc_cluster_check_interval to know when a socket has been idle. * *-------------------------------------------------------------------------- */ void _mongoc_topology_update_last_used(mongoc_topology_t *topology, uint32_t server_id) { mongoc_topology_scanner_node_t *node; if (!topology->single_threaded) { return; } node = mongoc_topology_scanner_get_node(topology->scanner, server_id); if (node) { node->last_used = bson_get_monotonic_time(); } } mongoc_topology_description_type_t _mongoc_topology_get_type(const mongoc_topology_t *topology) { mc_shared_tpld td = mc_tpld_take_ref(topology); mongoc_topology_description_type_t td_type = td.ptr->type; mc_tpld_drop_ref(&td); return td_type; } bool _mongoc_topology_set_appname(mongoc_topology_t *topology, const char *appname) { bool ret = false; if (topology->scanner_state == MONGOC_TOPOLOGY_SCANNER_OFF) { ret = _mongoc_topology_scanner_set_appname(topology->scanner, appname); } else { MONGOC_ERROR("Cannot set appname after handshake initiated"); } return ret; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_update_cluster_time -- * * Internal function. If the server reply has a later $clusterTime than * any seen before, update the topology's clusterTime. See the Driver * Sessions Spec. * *-------------------------------------------------------------------------- */ void _mongoc_topology_update_cluster_time(mongoc_topology_t *topology, const bson_t *reply) { bson_iter_t iter; bson_iter_t child; const uint8_t *data; uint32_t size; bson_t cluster_time; mc_shared_tpld td; if (!reply || !bson_iter_init_find(&iter, reply, "$clusterTime")) { return; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter) || !bson_iter_recurse(&iter, &child)) { MONGOC_ERROR("Can't parse $clusterTime"); return; } bson_iter_document(&iter, &size, &data); BSON_ASSERT(bson_init_static(&cluster_time, data, (size_t)size)); td = mc_tpld_take_ref(topology); /* This func is called frequently and repeatedly, but the cluster time itself * is infrequently updated. mc_tpld_modify_begin() is very expensive, so we * only want to actually call it if we anticipate performing an update to the * cluster time. * * Check that the cluster time has actually changed from what we have on * record before opening a topology modification to update it. */ if (bson_empty(&td.ptr->cluster_time) || _mongoc_cluster_time_greater(&cluster_time, &td.ptr->cluster_time)) { mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); /* Check again if we need to update the cluster time, since it may have * been updated behind our back. */ if (bson_empty(&tdmod.new_td->cluster_time) || _mongoc_cluster_time_greater(&cluster_time, &tdmod.new_td->cluster_time)) { bson_destroy(&tdmod.new_td->cluster_time); bson_copy_to(&cluster_time, &tdmod.new_td->cluster_time); mc_tpld_modify_commit(tdmod); } else { mc_tpld_modify_drop(tdmod); } } mc_tpld_drop_ref(&td); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_pop_server_session -- * * Internal function. Get a server session from the pool or create * one. On error, return NULL and fill out @error. * *-------------------------------------------------------------------------- */ mongoc_server_session_t * _mongoc_topology_pop_server_session(mongoc_topology_t *topology, const mongoc_ss_log_context_t *log_context, bson_error_t *error) { int64_t timeout; mongoc_server_session_t *ss = NULL; bool loadbalanced; mc_shared_tpld td = mc_tpld_take_ref(topology); ENTRY; timeout = td.ptr->session_timeout_minutes; loadbalanced = td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED; /* When the topology type is LoadBalanced, sessions are always supported. */ if (!loadbalanced && timeout == MONGOC_NO_SESSIONS) { /* if needed, connect and check for session timeout again */ if (!mongoc_topology_description_has_data_node(td.ptr)) { if (!mongoc_topology_select_server_id(topology, MONGOC_SS_READ, log_context, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, error)) { ss = NULL; goto done; } /* Topology may have been updated by a scan */ mc_tpld_renew_ref(&td, topology); timeout = td.ptr->session_timeout_minutes; } if (timeout == MONGOC_NO_SESSIONS) { _mongoc_set_error( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Server does not support sessions"); ss = NULL; goto done; } } ss = mongoc_server_session_pool_get(topology->session_pool, error); done: mc_tpld_drop_ref(&td); RETURN(ss); } /* *-------------------------------------------------------------------------- * * _mongoc_topology_push_server_session -- * * Internal function. Return a server session to the pool. * *-------------------------------------------------------------------------- */ void _mongoc_topology_push_server_session(mongoc_topology_t *topology, mongoc_server_session_t *server_session) { ENTRY; /** * ! note: * At time of writing, this diverges from the spec: * https://github.com/mongodb/specifications/blob/master/source/sessions/driver-sessions.md#algorithm-to-return-a-serversession-instance-to-the-server-session-pool * * The spec notes that before returning a session, we should first inspect * the back of the pool for expired items and delete them. In this case, we * simply return the item to the top of the pool and leave the remainder * unchanged. * * The next pop operation that encounters an expired session will clear the * entire session pool, thus preventing unbounded growth of the pool. */ mongoc_server_session_pool_return(topology->session_pool, server_session); EXIT; } /* *-------------------------------------------------------------------------- * * _mongoc_topology_end_sessions_cmd -- * * Internal function. End up to 10,000 server sessions. @cmd is an * uninitialized document. Sessions are destroyed as their ids are * appended to @cmd. * * Driver Sessions Spec: "If the number of sessions is very large the * endSessions command SHOULD be run multiple times to end 10,000 * sessions at a time (in order to avoid creating excessively large * commands)." * * Returns: * true if any session ids were appended to @cmd. * *-------------------------------------------------------------------------- */ bool _mongoc_topology_end_sessions_cmd(mongoc_topology_t *topology, bson_t *cmd) { bson_array_builder_t *ar; /* Only end up to 10'000 sessions */ const int ENDED_SESSION_PRUNING_LIMIT = 10000; int i = 0; mongoc_server_session_t *ss = mongoc_server_session_pool_get_existing(topology->session_pool); bson_init(cmd); BSON_APPEND_ARRAY_BUILDER_BEGIN(cmd, "endSessions", &ar); for (; i < ENDED_SESSION_PRUNING_LIMIT && ss != NULL; ++i, ss = mongoc_server_session_pool_get_existing(topology->session_pool)) { bson_array_builder_append_document(ar, &ss->lsid); mongoc_server_session_pool_drop(topology->session_pool, ss); } if (ss) { /* We deleted at least 10'000 sessions, so we will need to return the * final session that we didn't drop */ mongoc_server_session_pool_return(topology->session_pool, ss); } bson_append_array_builder_end(cmd, ar); return i > 0; } void _mongoc_topology_dup_handshake_cmd(const mongoc_topology_t *topology, bson_t *copy_into) { _mongoc_topology_scanner_dup_handshake_cmd(topology->scanner, copy_into); } void _mongoc_topology_bypass_cooldown(mongoc_topology_t *topology) { BSON_ASSERT(topology->single_threaded); topology->scanner->bypass_cooldown = true; } static void _find_topology_version(const bson_t *reply, bson_t *topology_version) { bson_iter_t iter; const uint8_t *bytes; uint32_t len; if (!bson_iter_init_find(&iter, reply, "topologyVersion") || !BSON_ITER_HOLDS_DOCUMENT(&iter)) { bson_init(topology_version); return; } bson_iter_document(&iter, &len, &bytes); BSON_ASSERT(bson_init_static(topology_version, bytes, len)); } static bool _handle_sdam_app_error_command(mongoc_topology_t *topology, const mongoc_topology_description_t *td, uint32_t server_id, uint32_t generation, const bson_oid_t *service_id, const mongoc_server_description_t *sd, const bson_t *reply) { bson_error_t cmd_error; bson_t incoming_topology_version; bool pool_cleared = false; bool should_clear_pool = false; mc_tpld_modification tdmod; mongoc_server_description_t *mut_sd; BSON_UNUSED(td); if (_mongoc_cmd_check_ok_no_wce(reply, MONGOC_ERROR_API_VERSION_2, &cmd_error)) { /* No error. */ return false; } if (!_mongoc_error_is_state_change(&cmd_error)) { /* Not a "not primary" or "node is recovering" error. */ return false; } /* Check if the error is "stale", i.e. the topologyVersion refers to an * older * version of the server than we have stored in the topology description. */ _find_topology_version(reply, &incoming_topology_version); if (mongoc_server_description_topology_version_cmp(&sd->topology_version, &incoming_topology_version) >= 0) { /* The server description is greater or equal, ignore the error. */ bson_destroy(&incoming_topology_version); return false; } should_clear_pool = _mongoc_error_is_shutdown(&cmd_error); tdmod = mc_tpld_modify_begin(topology); /* Get the server handle again, which might have been removed. */ mut_sd = mongoc_topology_description_server_by_id(tdmod.new_td, server_id, NULL); if (!mut_sd) { /* Server was already removed/invalidated */ mc_tpld_modify_drop(tdmod); bson_destroy(&incoming_topology_version); return false; } /* Check the topology version a second time, now that we have an exclusive * lock on the latest topology description. */ if (mongoc_server_description_topology_version_cmp(&mut_sd->topology_version, &incoming_topology_version) >= 0) { /* The server description is greater or equal, ignore the error. */ mc_tpld_modify_drop(tdmod); bson_destroy(&incoming_topology_version); return false; } if (generation < mc_tpl_sd_get_generation(mut_sd, service_id)) { /* Our view of the server description is stale. Ignore it. */ mc_tpld_modify_drop(tdmod); bson_destroy(&incoming_topology_version); return false; } /* Overwrite the topology version. */ mongoc_server_description_set_topology_version(mut_sd, &incoming_topology_version); /* SDAM: When handling a "not primary" or "node is recovering" error, the * client MUST clear the server's connection pool if and only if the error * is "node is shutting down" or the error originated from server version * < 4.2. */ if (should_clear_pool) { _mongoc_topology_description_clear_connection_pool(tdmod.new_td, server_id, service_id); pool_cleared = true; } /* * SDAM: When the client sees a "not primary" or "node is recovering" * error and the error's topologyVersion is strictly greater than the * current ServerDescription's topologyVersion it MUST replace the * server's description with a ServerDescription of type Unknown. */ mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, &cmd_error); if (topology->single_threaded) { /* SDAM: For single-threaded clients, in the case of a "not primary" or * "node is shutting down" error, the client MUST mark the topology as * "stale" */ if (_mongoc_error_is_not_primary(&cmd_error)) { topology->stale = true; } } else { /* SDAM Spec: "Multi-threaded and asynchronous clients MUST request an * immediate check of the server." * Instead of requesting a check of the one server, request a scan * to all servers (to find the new primary). */ _mongoc_topology_request_scan(topology); } mc_tpld_modify_commit(tdmod); bson_destroy(&incoming_topology_version); return pool_cleared; } bool _mongoc_topology_handle_app_error(mongoc_topology_t *topology, uint32_t server_id, bool handshake_complete, _mongoc_sdam_app_error_type_t type, const bson_t *reply, const bson_error_t *why, uint32_t generation, const bson_oid_t *service_id) { bson_error_t server_selection_error; const mongoc_server_description_t *sd; bool cleared_pool = false; mc_shared_tpld td = mc_tpld_take_ref(topology); /* Start by checking every condition in which we should ignore the error */ sd = mongoc_topology_description_server_by_id_const(td.ptr, server_id, &server_selection_error); if (!sd) { /* The server was already removed from the topology. Ignore error. */ goto ignore_error; } /* When establishing a new connection in load balanced mode, drivers MUST NOT * perform SDAM error handling for any errors that occur before the MongoDB * Handshake. */ if (td.ptr->type == MONGOC_TOPOLOGY_LOAD_BALANCED && !handshake_complete) { goto ignore_error; } if (generation < mc_tpl_sd_get_generation(sd, service_id)) { /* This is a stale connection. Ignore. */ goto ignore_error; } if (type == MONGOC_SDAM_APP_ERROR_TIMEOUT && handshake_complete) { /* Timeout errors after handshake are ok, do nothing. */ goto ignore_error; } /* Do something with the error */ if (type == MONGOC_SDAM_APP_ERROR_COMMAND) { cleared_pool = _handle_sdam_app_error_command(topology, td.ptr, server_id, generation, service_id, sd, reply); } else { /* Invalidate the server that saw the error. */ mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); sd = mongoc_topology_description_server_by_id_const(tdmod.new_td, server_id, NULL); /* Check if the server has already been invalidated */ if (!sd || generation < mc_tpl_sd_get_generation(sd, service_id)) { mc_tpld_modify_drop(tdmod); goto ignore_error; } /* Mark server as unknown. */ mongoc_topology_description_invalidate_server(tdmod.new_td, &topology->log_and_monitor, server_id, why); /* Clear the connection pool */ _mongoc_topology_description_clear_connection_pool(tdmod.new_td, server_id, service_id); cleared_pool = true; if (!topology->single_threaded) { _mongoc_topology_background_monitoring_cancel_check(topology, server_id); } mc_tpld_modify_commit(tdmod); } ignore_error: /* <- Jump taken if we should ignore the error */ mc_tpld_drop_ref(&td); return cleared_pool; } /* Called from application threads * Caller must hold topology lock. * For single-threaded monitoring, the topology scanner may include errors for * servers that were removed from the topology. */ static void _topology_collect_errors(const mongoc_topology_description_t *td, bson_error_t *error_out) { const mongoc_server_description_t *server_description; memset(error_out, 0, sizeof(bson_error_t)); mcommon_string_append_t error_message; mcommon_string_new_as_fixed_capacity_append(&error_message, sizeof error_out->message - 1u); for (size_t i = 0u; i < mc_tpld_servers_const(td)->items_len; i++) { const bson_error_t *error; server_description = mc_tpld_servers_const(td)->items[i].item; error = &server_description->error; if (error->code) { if (!mcommon_string_from_append_is_empty(&error_message)) { mcommon_string_append(&error_message, " "); } mcommon_string_append_printf(&error_message, "[%s]", server_description->error.message); /* The last error's code and domain wins. */ error_out->code = error->code; error_out->domain = error->domain; error_out->reserved = error->reserved; } } bson_strncpy((char *)&error_out->message, mcommon_str_from_append(&error_message), sizeof(error_out->message)); mcommon_string_from_append_destroy(&error_message); } void _mongoc_topology_set_rr_resolver(mongoc_topology_t *topology, _mongoc_rr_resolver_fn rr_resolver) { topology->rr_resolver = rr_resolver; } uint32_t _mongoc_topology_get_connection_pool_generation(const mongoc_topology_description_t *td, uint32_t server_id, const bson_oid_t *service_id) { const mongoc_server_description_t *sd; bson_error_t error; BSON_ASSERT(service_id); sd = mongoc_topology_description_server_by_id_const(td, server_id, &error); if (!sd) { /* Server removed, ignore and ignore error. */ return 0; } return mc_tpl_sd_get_generation(sd, service_id); } mc_tpld_modification mc_tpld_modify_begin(mongoc_topology_t *tpl) { mc_shared_tpld prev_td; mongoc_topology_description_t *new_td; bson_mutex_lock(&tpl->tpld_modification_mtx); prev_td = mc_tpld_take_ref(tpl); new_td = mongoc_topology_description_new_copy(prev_td.ptr); mc_tpld_drop_ref(&prev_td); return (mc_tpld_modification){ .new_td = new_td, .topology = tpl, }; } void mc_tpld_modify_commit(mc_tpld_modification mod) { mongoc_shared_ptr old_sptr = mongoc_shared_ptr_copy(mod.topology->_shared_descr_._sptr_); mongoc_shared_ptr new_sptr = mongoc_shared_ptr_create(mod.new_td, _tpld_destroy_and_free); mongoc_atomic_shared_ptr_store(&mod.topology->_shared_descr_._sptr_, new_sptr); bson_mutex_unlock(&mod.topology->tpld_modification_mtx); mongoc_shared_ptr_reset_null(&new_sptr); mongoc_shared_ptr_reset_null(&old_sptr); } void mc_tpld_modify_drop(mc_tpld_modification mod) { bson_mutex_unlock(&mod.topology->tpld_modification_mtx); mongoc_topology_description_destroy(mod.new_td); } bool mongoc_topology_uses_server_api(const mongoc_topology_t *topology) { BSON_ASSERT_PARAM(topology); return mongoc_topology_scanner_uses_server_api(topology->scanner); } bool mongoc_topology_uses_loadbalanced(const mongoc_topology_t *topology) { BSON_ASSERT_PARAM(topology); return mongoc_topology_scanner_uses_loadbalanced(topology->scanner); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-trace-private.h000066400000000000000000000221151511661753600253700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TRACE_PRIVATE_H #define MONGOC_TRACE_PRIVATE_H #include #include #include #include #include #include BSON_BEGIN_DECLS // `gLogTrace` determines if tracing is enabled at runtime. extern bool gLogTrace; #define TRACE(msg, ...) \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, \ MONGOC_LOG_DOMAIN, \ "TRACE: %s():%d " msg, \ BSON_FUNC, \ (int)(__LINE__), \ __VA_ARGS__); \ } \ mlib_diagnostic_pop(); \ } else \ ((void)0) #define ENTRY \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, MONGOC_LOG_DOMAIN, "ENTRY: %s():%d", BSON_FUNC, (int)(__LINE__)); \ } \ mlib_diagnostic_pop(); \ } else \ ((void)0) #define EXIT \ do { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, MONGOC_LOG_DOMAIN, " EXIT: %s():%d", BSON_FUNC, (int)(__LINE__)); \ } \ mlib_diagnostic_pop(); \ return; \ } while (0) // do-while instead of if-else to avoid false-positive -Wreturn-type warnings with GCC 11. #define RETURN(ret) \ do { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, MONGOC_LOG_DOMAIN, " EXIT: %s():%d", BSON_FUNC, (int)(__LINE__)); \ } \ mlib_diagnostic_pop(); \ return ret; \ } while (0) // do-while instead of if-else to avoid false-positive -Wreturn-type warnings with GCC 11. #define GOTO(label) \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log( \ MONGOC_LOG_LEVEL_TRACE, MONGOC_LOG_DOMAIN, " GOTO: %s():%d %s", BSON_FUNC, (int)(__LINE__), #label); \ } \ mlib_diagnostic_pop(); \ goto label; \ } else \ ((void)0) #define DUMP_BSON(_bson) \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ char *_bson_str; \ if (_bson) { \ _bson_str = bson_as_canonical_extended_json(_bson, NULL); \ } else { \ _bson_str = bson_strdup(""); \ } \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, \ MONGOC_LOG_DOMAIN, \ "TRACE: %s():%d %s = %s", \ BSON_FUNC, \ (int)(__LINE__), \ #_bson, \ _bson_str); \ bson_free(_bson_str); \ } \ mlib_diagnostic_pop(); \ } else \ ((void)0) #define DUMP_IOVEC(_n, _iov, _iovcnt) \ if (1) { \ mlib_diagnostic_push(); \ mlib_disable_constant_conditional_expression_warnings(); \ if (MONGOC_TRACE_ENABLED && gLogTrace) { \ mongoc_log(MONGOC_LOG_LEVEL_TRACE, \ MONGOC_LOG_DOMAIN, \ "TRACE: %s():%d %s = %p [%d]", \ BSON_FUNC, \ (int)(__LINE__), \ #_n, \ (void *)_iov, \ (int)_iovcnt); \ mongoc_log_trace_iovec(MONGOC_LOG_DOMAIN, _iov, _iovcnt); \ } \ mlib_diagnostic_pop(); \ } else \ ((void)0) BSON_END_DECLS #endif /* MONGOC_TRACE_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ts-pool-private.h000066400000000000000000000423451511661753600256760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_TS_POOL_PRIVATE_H #define MONGOC_TS_POOL_PRIVATE_H #include #include struct _bson_error_t; /** Type of an object constructor function */ typedef void (*_erased_constructor_fn)(void *self, void *userdata, struct _bson_error_t *error_out); /** Type of an object destructor function */ typedef void (*_erased_destructor_fn)(void *self, void *userdata); /** Type of an object pruning predicate */ typedef int (*_erased_prune_predicate)(const void *self, void *userdata); /** Type of a pool visit function */ typedef int (*_erased_visit_fn)(void *elem, void *pool_userdata, void *visit_userdata); /** * @brief Construction parameters for creating a new object pool. */ typedef struct mongoc_ts_pool_params { /** * @brief The alignment of the objects that are managed by the pool */ size_t element_alignment; /** * @brief The size of the objects that are managed by the pool */ size_t element_size; /** * @brief Arbitrary data pointer that is passed to the * constructor/destructor/prune_predicate functions */ void *userdata; /** * @brief A function that is called on a newly-allocated object in the pool. * * If `NULL`, newly created objects are just zero-initialized. * * Called as `constructor(item_ptr, userdata_ptr, bson_error_ptr)`. * * The `bson_error_ptr` is never `NULL`. If the bson_error_ptr->code is * non-zero, the pool will consider the constructor to have failed, and will * deallocate the item without destroying it, and then report that failure to * the caller of `mongoc_ts_pool_get()` that caused the creation of the new * item. */ _erased_constructor_fn constructor; /** * @brief A function that will destroy an item before it is deallocated. * * If `NULL`, destructing an object is a no-op. * * Called as `destructor(item_ptr, userdata_ptr)`. */ _erased_destructor_fn destructor; /** * @brief A predicate function that is used to automatically drop items from * the pool. * * If `NULL`, item are never automatically dropped from the pool, and * can only be discarded by use of `mongoc_ts_pool_drop()`. Items will still * be dropped when the pool is freed, though. * * Called as `prune_predicate(item_ptr, userdata_ptr)`. * * If this function returns non-zero, this informs the pool that the item * should not be returned to the pool nor yielded to a pool user. Instead, * the item will be given to `mongoc_ts_pool_drop`. */ _erased_prune_predicate prune_predicate; } mongoc_ts_pool_params; /** * @brief A thread-safe object pool. * * Object pools act as a thread-safe stack of reusable objects. The pool can be * given a prune-predicate function that will be used to discard elements * automatically if they meet some user-specified condition. * * When an item is taken from a pool, the pool will either create a new item or * return the *most-recently-returned* *non-pruned* item. i.e. The pool acts as * a LIFO stack. * * Objects are created *automatically* by the pool: Only objects obtained from a * pool instance can be returned to that pool, and all objects obtained from * a given pool must either be returned to that same pool, or dropped using * `mongoc_ts_pool_drop`. * * Refer to `mongoc_ts_pool_params` for more information on the construction, * destruction, and pruning of pool items. */ typedef struct mongoc_ts_pool mongoc_ts_pool; /** * @brief Create a new thread-safe pool * * @param params The operating parameters for the pool. @see * mongoc_ts_pool_params * * @returns A new thread-safe pool constructed with the given parameters. * * @note The pool must be destroyed using `mongoc_ts_pool_free` */ mongoc_ts_pool * mongoc_ts_pool_new(mongoc_ts_pool_params params); /** * @brief Destroy a pool of objects previously created with `mongo_ts_pool_new` * * Any objects remaining in the pool will also be destroyed. * * @note All objects that have been obtained from the pool must be returned to * the pool before it is freed. */ void mongoc_ts_pool_free(mongoc_ts_pool *pool); /** * @brief Obtain an object from the pool. * * If the pool is empty, the pool will try to create a new item and return it. * If the constructor of that item fails, this function will return `NULL` and * set an error in `error`. * * @param pool The pool of objects. * @param error An error out-parameter. If the constructor of an object is * called and fails, it will set an error through this parameter. * @returns A pointer to an object associated with the pool, or `NULL` if the * object's constructor fails. * * @note Returns the most-recently-returned non-pruned item from the pool (i.e. * the pool is a LIFO stack). * * @note If the return value is `NULL`, then an error will be set in `*error`. * If the return value is non-`NULL`, then the value of `*error` is unspecified. * * @note A non-NULL returned item MUST be passed to either * `mongo_ts_pool_return` or `mongo_ts_pool_drop` BEFORE the pool is destroyed * with `mongo_ts_pool_free`. */ void * mongoc_ts_pool_get(mongoc_ts_pool *pool, struct _bson_error_t *error); /** * @brief Attempt to pop an object from the pool. * * Unlike `mongoc_ts_pool_get`, if the pool is empty, this function returns * `NULL` unconditionally. * * @param pool The pool of objects. * @returns A pointer to an object previously passed to `mongo_ts_pool_push`, * or `NULL` if the pool is empty. * * @note Returns the most-recently-returned non-pruned item from the pool * (i.e. the pool is a LIFO stack). */ void * mongoc_ts_pool_get_existing(mongoc_ts_pool *pool); /** * @brief Return an object obtained from a pool back to the pool that manages it * * @param item A pointer that was previously returned from a call to * `mongoc_ts_pool_get` or `mongoc_ts_pool_get_existing` */ void mongoc_ts_pool_return(mongoc_ts_pool *pool, void *item); /** * @brief Obtain the number of elements in the pool. * * @note If the pool could be modified by another thread simultaneously, then * the return value may become immediately stale. */ size_t mongoc_ts_pool_size(const mongoc_ts_pool *pool); /** * @brief Determine whether the pool is empty. * * @note If the pool could be modified by another thread simultaneously, then * the result may become immediately stale. */ int mongoc_ts_pool_is_empty(const mongoc_ts_pool *pool); /** * @brief Destroy all items currently in the given pool. * * Objects that are "checked-out" of the pool are unaffected. * * @note This does not free the pool. For that purpose, us `mongoc_ts_pool_free` */ void mongoc_ts_pool_clear(mongoc_ts_pool *pool); /** * @brief Destroy an item that was created by a pool * * Instead of returning to the pool, the item will be destroyed and deallocated. * * @param item A pointer returned by `mongoc_ts_pool_get` or * `mongo_ts_pool_get_existing`. */ void mongoc_ts_pool_drop(mongoc_ts_pool *pool, void *item); /** * @brief Visit each element of the pool, optionally pruning items. * * @note While this visit function is executing, all pool operations are * blocked on all threads. Attempting to return/get/drop items in the pool from * within the visit callback will deadlock. * * The visit function will be called as: * * visit(pool_item, pool_userdata, visit_userdata) * * If the visitor function returns non-zero for an item, then that item will be * removed from the pool. * * @param pool The pool of items to visit * @param visit_userdata Optional additional context for the visitor * @param visitor The visit function * */ void mongoc_ts_pool_visit_each(mongoc_ts_pool *pool, void *visit_userdata, _erased_visit_fn visitor); /** * @brief Declare a thread-safe pool type that contains elements of a specific * type. Wraps a `mongoc_ts_pool`. * * @param ElementType The type of object contained in the pool * @param PoolName The name of the pool type. All methods of the pool will be * prefixed by this name. * @param UserDataType The type of the userdata associated with the constructor, * destructor, and prune predicate. May be `void`. * @param Constructor A function that constructs new elements for the pool, or * `NULL` * @param Destructor An element destructor function, or `NULL` * @param PrunePredicate A function that checks whether elements should be * dropped from the pool, or `NULL` */ #define MONGOC_DECL_SPECIAL_TS_POOL(ElementType, PoolName, UserDataType, Constructor, Destructor, PrunePredicate) \ typedef struct PoolName { \ mongoc_ts_pool *pool; \ } PoolName; \ \ BSON_MAYBE_UNUSED static BSON_INLINE PoolName PoolName##_new_with_params(_erased_constructor_fn constructor, \ _erased_destructor_fn destructor, \ _erased_prune_predicate prune_predicate, \ UserDataType *userdata) \ { \ PoolName ret; \ mongoc_ts_pool_params params = {0}; \ params.userdata = userdata; \ params.constructor = constructor; \ params.destructor = destructor; \ params.prune_predicate = prune_predicate; \ params.element_alignment = BSON_ALIGNOF(ElementType); \ params.element_size = sizeof(ElementType); \ ret.pool = mongoc_ts_pool_new(params); \ return ret; \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE PoolName PoolName##_new(UserDataType *userdata) \ { \ return PoolName##_new_with_params(Constructor, Destructor, PrunePredicate, userdata); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE void PoolName##_free(PoolName p) \ { \ mongoc_ts_pool_free(p.pool); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE void PoolName##_clear(PoolName p) \ { \ mongoc_ts_pool_clear(p.pool); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE ElementType *PoolName##_get_existing(PoolName p) \ { \ return (ElementType *)mongoc_ts_pool_get_existing(p.pool); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE ElementType *PoolName##_get(PoolName p, struct _bson_error_t *error) \ { \ return (ElementType *)mongoc_ts_pool_get(p.pool, error); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE void PoolName##_return(PoolName p, ElementType *elem) \ { \ mongoc_ts_pool_return(p.pool, elem); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE void PoolName##_drop(PoolName p, ElementType *elem) \ { \ mongoc_ts_pool_drop(p.pool, elem); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE size_t PoolName##_size(PoolName p) \ { \ return mongoc_ts_pool_size(p.pool); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE int PoolName##_is_empty(PoolName p) \ { \ return mongoc_ts_pool_is_empty(p.pool); \ } \ \ BSON_MAYBE_UNUSED static BSON_INLINE void PoolName##_visit_each( \ PoolName p, void *visit_userdata, _erased_visit_fn visitor) \ { \ mongoc_ts_pool_visit_each(p.pool, visit_userdata, visitor); \ } #endif /* MONGOC_TS_POOL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-ts-pool.c000066400000000000000000000235461511661753600242230ustar00rootroot00000000000000#include #include #include #include #include /** * Toggle this to enable/disable checks that all items are returned to the pool * before the pool is destroyed */ static const bool audit_pool_enabled = false; /** * To support correct alignment of the item allocated within pool_node::data, * pool_node has the following data layout: * * [ next | owner_pool | (padding) | item ] * ^ ^ ^ * | | | * pool_node * | first byte of aligned item * pool_node::data * * If alignment of the item is not greater than the alignment of pool_node, * then pool_node::data already satisfies the alignment requirements and no * padding is necessary. The position of the allocated item should be obtained * via _pool_node_data_offset. */ typedef struct pool_node { struct pool_node *next; mongoc_ts_pool *owner_pool; #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable : 4200) #endif unsigned char data[]; #if defined(_MSC_VER) #pragma warning(pop) #endif } pool_node; // Flexible member array member should not contribute to sizeof result. BSON_STATIC_ASSERT2(pool_node_size, sizeof(pool_node) == sizeof(void *) * 2u); struct mongoc_ts_pool { mongoc_ts_pool_params params; pool_node *head; /* Number of elements in the pool */ int32_t size; bson_mutex_t mtx; /* Number of elements that the pool has given to users. * If audit_pool_enabled is zero, this member is unused */ int32_t outstanding_items; }; /** * @brief Return the offset of the item allocated within pool_node::data. */ static size_t _pool_node_data_offset(const mongoc_ts_pool *pool) { BSON_ASSERT_PARAM(pool); const size_t alignment = pool->params.element_alignment; // If element type has alignment greater than that of pool_node, position of // item within storage region must be offset accordingly. if (alignment > BSON_ALIGNOF(pool_node)) { return alignment - sizeof(pool_node); } return 0u; } /** * @brief Allocate a pool_node object with the appropriate flexible array member * length to accomodate the alignment and size of the element type. */ static pool_node * _pool_node_new(const mongoc_ts_pool *pool) { BSON_ASSERT_PARAM(pool); const size_t alignment = pool->params.element_alignment; const size_t size = pool->params.element_size; const size_t minimum_size = sizeof(pool_node) + _pool_node_data_offset(pool) + size; if (alignment == 0) { return bson_malloc0(minimum_size); } // aligned_alloc requires allocation size to be a multiple of the alignment. const size_t required_size = minimum_size + (alignment - (minimum_size % alignment)); return bson_aligned_alloc0(alignment, required_size); } /** * @brief Return a pointer to the item owned by the given node. */ static const void * _pool_node_get_data_const(const pool_node *node) { BSON_ASSERT_PARAM(node); return node->data + _pool_node_data_offset(node->owner_pool); } /** * @brief Return a pointer to the item owned by the given node. */ static void * _pool_node_get_data(pool_node *node) { BSON_ASSERT_PARAM(node); return node->data + _pool_node_data_offset(node->owner_pool); } /** * @brief Obtain a pointer to the pool_node that owns the given item. */ static pool_node * _pool_node_from_item(void *item, const mongoc_ts_pool *pool) { return (void *)(((unsigned char *)item) - _pool_node_data_offset(pool) - offsetof(pool_node, data)); } /** * @brief Check whether we should drop the given node from the pool */ static bool _should_prune(const pool_node *node) { mongoc_ts_pool *pool = node->owner_pool; return pool->params.prune_predicate && pool->params.prune_predicate(_pool_node_get_data_const(node), pool->params.userdata); } /** * @brief Create a new pool node and contained element. * * @return pool_node* A pointer to a constructed element, or NULL if the * constructor sets `error` */ static pool_node * _new_item(mongoc_ts_pool *pool, bson_error_t *error) { pool_node *node = _pool_node_new(pool); node->owner_pool = pool; if (pool->params.constructor) { /* To construct, we need to know if that constructor fails */ bson_error_reset(error); /* Construct the object */ pool->params.constructor(_pool_node_get_data(node), pool->params.userdata, error); if (error->code != 0) { /* Constructor reported an error. Deallocate and drop the node. */ bson_free(node); node = NULL; } } if (node && audit_pool_enabled) { mcommon_atomic_int32_fetch_add(&pool->outstanding_items, 1, mcommon_memory_order_relaxed); } return node; } /** * @brief Destroy the given node and the element that it contains */ static void _delete_item(pool_node *node) { mongoc_ts_pool *pool = node->owner_pool; if (pool->params.destructor) { pool->params.destructor(_pool_node_get_data(node), pool->params.userdata); } bson_free(node); } /** * @brief Try to take a node from the pool. Returns `NULL` if the pool is empty. */ static pool_node * _try_get(mongoc_ts_pool *pool) { pool_node *node; bson_mutex_lock(&pool->mtx); node = pool->head; if (node) { pool->head = node->next; } bson_mutex_unlock(&pool->mtx); if (node) { mcommon_atomic_int32_fetch_sub(&pool->size, 1, mcommon_memory_order_relaxed); if (audit_pool_enabled) { mcommon_atomic_int32_fetch_add(&pool->outstanding_items, 1, mcommon_memory_order_relaxed); } } return node; } mongoc_ts_pool * mongoc_ts_pool_new(mongoc_ts_pool_params params) { mongoc_ts_pool *r = bson_malloc0(sizeof(mongoc_ts_pool)); r->params = params; r->head = NULL; r->size = 0; if (audit_pool_enabled) { r->outstanding_items = 0; } bson_mutex_init(&r->mtx); // Promote alignment if it is too small to satisfy bson_aligned_alloc // requirements. { const size_t alignment = r->params.element_alignment; if (alignment != 0 && alignment < BSON_ALIGN_OF_PTR) { r->params.element_alignment = BSON_ALIGN_OF_PTR; } } return r; } void mongoc_ts_pool_free(mongoc_ts_pool *pool) { if (audit_pool_enabled) { BSON_ASSERT(pool->outstanding_items == 0 && "Pool was destroyed while there are still items checked out"); } mongoc_ts_pool_clear(pool); bson_mutex_destroy(&pool->mtx); bson_free(pool); } void mongoc_ts_pool_clear(mongoc_ts_pool *pool) { pool_node *node; { bson_mutex_lock(&pool->mtx); node = pool->head; pool->head = NULL; pool->size = 0; bson_mutex_unlock(&pool->mtx); } while (node) { pool_node *n = node; node = n->next; _delete_item(n); } } void * mongoc_ts_pool_get_existing(mongoc_ts_pool *pool) { pool_node *node; retry: node = _try_get(pool); if (node && _should_prune(node)) { /* This node should be pruned now. Drop it and try again. */ mongoc_ts_pool_drop(pool, _pool_node_get_data(node)); goto retry; } return node ? _pool_node_get_data(node) : NULL; } void * mongoc_ts_pool_get(mongoc_ts_pool *pool, bson_error_t *error) { pool_node *node; retry: node = _try_get(pool); if (node && _should_prune(node)) { /* This node should be pruned now. Drop it and try again. */ mongoc_ts_pool_drop(pool, _pool_node_get_data(node)); goto retry; } if (node == NULL) { /* We need a new item */ node = _new_item(pool, error); } if (node == NULL) { /* No item in pool, and we couldn't create one either */ return NULL; } return _pool_node_get_data(node); } void mongoc_ts_pool_return(mongoc_ts_pool *pool, void *item) { pool_node *node = _pool_node_from_item(item, pool); BSON_ASSERT(pool == node->owner_pool); if (_should_prune(node)) { mongoc_ts_pool_drop(pool, item); } else { bson_mutex_lock(&pool->mtx); node->next = pool->head; pool->head = node; bson_mutex_unlock(&pool->mtx); mcommon_atomic_int32_fetch_add(&node->owner_pool->size, 1, mcommon_memory_order_relaxed); if (audit_pool_enabled) { mcommon_atomic_int32_fetch_sub(&node->owner_pool->outstanding_items, 1, mcommon_memory_order_relaxed); } } } void mongoc_ts_pool_drop(mongoc_ts_pool *pool, void *item) { pool_node *node = _pool_node_from_item(item, pool); BSON_ASSERT(pool == node->owner_pool); if (audit_pool_enabled) { mcommon_atomic_int32_fetch_sub(&node->owner_pool->outstanding_items, 1, mcommon_memory_order_relaxed); } _delete_item(node); } int mongoc_ts_pool_is_empty(const mongoc_ts_pool *pool) { return mongoc_ts_pool_size(pool) == 0; } size_t mongoc_ts_pool_size(const mongoc_ts_pool *pool) { return mcommon_atomic_int32_fetch(&pool->size, mcommon_memory_order_relaxed); } void mongoc_ts_pool_visit_each(mongoc_ts_pool *pool, void *visit_userdata, int (*visit)(void *item, void *pool_userdata, void *visit_userdata)) { /* Pointer to the pointer that must be updated in case of an item pruning */ pool_node **node_ptrptr; /* The node we are looking at */ pool_node *node; bson_mutex_lock(&pool->mtx); node_ptrptr = &pool->head; node = pool->head; while (node) { const bool should_remove = visit(_pool_node_get_data(node), pool->params.userdata, visit_userdata); pool_node *const next_node = node->next; if (!should_remove) { node_ptrptr = &node->next; node = next_node; continue; } /* Retarget the previous pointer to the next node in line */ *node_ptrptr = node->next; _delete_item(node); pool->size--; /* Leave node_ptrptr pointing to the previous pointer, because we may * need to erase another item */ node = next_node; } bson_mutex_unlock(&pool->mtx); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-uri-private.h000066400000000000000000000047631511661753600251020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_URI_PRIVATE_H #define MONGOC_URI_PRIVATE_H #include // IWYU pragma: export // #include #include #include BSON_BEGIN_DECLS bool mongoc_uri_upsert_host_and_port(mongoc_uri_t *uri, const char *host_and_port, bson_error_t *error); bool mongoc_uri_upsert_host(mongoc_uri_t *uri, const char *host, uint16_t port, bson_error_t *error); void mongoc_uri_remove_host(mongoc_uri_t *uri, const char *host, uint16_t port); /** * @brief Update the settings on a URI based on a URI query string * * @param uri The URI to be updated * @param options A string of key-value pairs, separated by "&", URI %-encoded. * This should not include the leading "?" * @param from_dns Whether this string comes from a DNS query * @return true Upon success. The internal settings of the URI object have been updated * @return false Otherwise. The internal settings of the URI object are unspecified. */ bool _mongoc_uri_apply_query_string(mongoc_uri_t *uri, mstr_view options, bool from_dns, bson_error_t *error); int32_t mongoc_uri_get_local_threshold_option(const mongoc_uri_t *uri); bool _mongoc_uri_requires_auth_negotiation(const mongoc_uri_t *uri); const char * mongoc_uri_canonicalize_option(const char *key); mongoc_uri_t * _mongoc_uri_copy_and_replace_host_list(const mongoc_uri_t *original, const char *host); bool mongoc_uri_init_with_srv_host_list(mongoc_uri_t *uri, mongoc_host_list_t *hosts, bson_error_t *error); bool mongoc_uri_validate_srv_result(const mongoc_uri_t *uri, const char *host, bson_error_t *error); #ifdef MONGOC_ENABLE_CRYPTO void _mongoc_uri_init_scram(const mongoc_uri_t *uri, mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo); #endif bool mongoc_uri_finalize(mongoc_uri_t *uri, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_URI_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-uri.c000066400000000000000000003434231511661753600234240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include /* strcasecmp on windows */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct _mongoc_uri_t { char *str; bool is_srv; char srv[BSON_HOST_NAME_MAX + 1]; mongoc_host_list_t *hosts; char *username; // MongoCredential.username char *password; // MongoCredential.password char *database; bson_t raw; // Unparsed options, see mongoc_uri_parse_options bson_t options; // Type-coerced and canonicalized options bson_t credentials; // MongoCredential.source, MongoCredential.mechanism, and MongoCredential.mechanism_properties. bson_t compressors; mongoc_read_prefs_t *read_prefs; mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; }; // Common strings we need to look for static const mstr_view COLON = {":", 1}; static const mstr_view COMMA = {",", 1}; static const mstr_view QUESTION = {"?", 1}; static const mstr_view SLASH = {"/", 1}; static const mstr_view AT = {"@", 1}; #define MONGOC_URI_ERROR(error, format, ...) \ _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, format, __VA_ARGS__) static const char *escape_instructions = "Percent-encode username and password" " according to RFC 3986"; static bool _mongoc_uri_set_option_as_int32(mongoc_uri_t *uri, const char *option, int32_t value); static bool _mongoc_uri_set_option_as_int32_with_error(mongoc_uri_t *uri, const char *option, int32_t value, bson_error_t *error); static bool _mongoc_uri_set_option_as_int64_with_error(mongoc_uri_t *uri, const char *option, int64_t value, bson_error_t *error); #define VALIDATE_SRV_ERR() \ do { \ _mongoc_set_error(error, \ MONGOC_ERROR_STREAM, \ MONGOC_ERROR_STREAM_NAME_RESOLUTION, \ "Invalid host \"%s\" returned for service \"%s\": " \ "host must be subdomain of service name", \ host, \ srv_hostname); \ return false; \ } while (0) static int count_dots(const char *s) { int n = 0; const char *dot = s; while ((dot = strchr(dot + 1, '.'))) { n++; } return n; } static char * lowercase_str_new(const char *key) { char *ret = bson_strdup(key); mongoc_lowercase(key, ret); return ret; } /* at least one character, and does not start with dot */ static bool valid_hostname(const char *s) { size_t len = strlen(s); return len > 1 && s[0] != '.'; } bool mongoc_uri_validate_srv_result(const mongoc_uri_t *uri, const char *host, bson_error_t *error) { const char *srv_hostname; const char *srv_host; srv_hostname = mongoc_uri_get_srv_hostname(uri); BSON_ASSERT(srv_hostname); if (!valid_hostname(host)) { VALIDATE_SRV_ERR(); } srv_host = strchr(srv_hostname, '.'); BSON_ASSERT(srv_host); /* host must be descendent of service root: if service is * "a.foo.co" host can be like "a.foo.co", "b.foo.co", "a.b.foo.co", etc. */ if (strlen(host) < strlen(srv_host)) { VALIDATE_SRV_ERR(); } if (!mongoc_ends_with(host, srv_host)) { VALIDATE_SRV_ERR(); } return true; } /* copy and upsert @host into @uri's host list. */ static bool _upsert_into_host_list(mongoc_uri_t *uri, mongoc_host_list_t *host, bson_error_t *error) { if (uri->is_srv && !mongoc_uri_validate_srv_result(uri, host->host, error)) { return false; } _mongoc_host_list_upsert(&uri->hosts, host); return true; } bool mongoc_uri_upsert_host_and_port(mongoc_uri_t *uri, const char *host_and_port, bson_error_t *error) { mongoc_host_list_t temp; memset(&temp, 0, sizeof(mongoc_host_list_t)); if (!_mongoc_host_list_from_string_with_err(&temp, host_and_port, error)) { return false; } return _upsert_into_host_list(uri, &temp, error); } bool mongoc_uri_upsert_host(mongoc_uri_t *uri, const char *host, uint16_t port, bson_error_t *error) { mongoc_host_list_t temp; memset(&temp, 0, sizeof(mongoc_host_list_t)); if (!_mongoc_host_list_from_hostport_with_err(&temp, mstr_cstring(host), port, error)) { return false; } return _upsert_into_host_list(uri, &temp, error); } void mongoc_uri_remove_host(mongoc_uri_t *uri, const char *host, uint16_t port) { _mongoc_host_list_remove_host(&(uri->hosts), host, port); } /** * @brief %-decode a %-encoded string * * @param sv The string to be decoded * @return char* A pointer to a new C string, which must be freed with `bson_free`, * or a null pointer in case of error */ static char * _strdup_pct_decode(mstr_view const sv, bson_error_t *error) { // Compute how many bytes we want to store size_t bufsize = 0; // Must use safe arithmetic because a pathological sv with `len == SIZE_MAX` is possible bool add_okay = !mlib_add(&bufsize, sv.len, 1); // Prepare the output region. We can allocate the whole thing up-front, because // we know the decode result will be *at most* as long as `sv`, since %-encoding // can only ever grow the plaintext string char *const buf = add_okay ? bson_malloc0(bufsize) : NULL; // alloc or arithmetic failure if (!buf) { MONGOC_URI_ERROR(error, "%s", "Failed to allocate memory for the %%-decoding"); return NULL; } // char-wise output char *out = buf; // Consume the input as we go mstr_view remain = sv; while (remain.len) { if (remain.data[0] != '%') { // Not a % char, just append it *out++ = remain.data[0]; remain = mstr_substr(remain, 1); continue; } // %-sequence if (remain.len < 3) { MONGOC_URI_ERROR( error, "At offset %zu: Truncated %%-sequence \"%.*s\"", (sv.len - remain.len), MSTR_FMT(remain)); bson_free(buf); return NULL; } // Grab the next two chars mstr_view pair = mstr_substr(remain, 1, 2); uint64_t v; if (mlib_nat64_parse(pair, 16, &v)) { MONGOC_URI_ERROR(error, "At offset %zu: Invalid %%-sequence \"%.3s\"", (sv.len - remain.len), remain.data); bson_free(buf); return NULL; } // Append the decoded byte value *out++ = (char)v; // Drop the "%xy" sequence remain = mstr_substr(remain, 3); } // Check whether the decoded result is valid UTF-8 size_t len = (size_t)(out - buf); if (!bson_utf8_validate(buf, len, false)) { MONGOC_URI_ERROR( error, "%s", "Invalid %%-encoded string: The decoded result is not valid UTF-8 or contains null characters"); bson_free(buf); return NULL; } return buf; } /** * @brief Parse the userinfo segment from a URI string * * @param uri The URI to be updated * @param userpass The userinfo segment from the original URI string * @return true If the operation succeeds * @return false Otherwise */ static bool _uri_parse_userinfo(mongoc_uri_t *uri, mstr_view userpass, bson_error_t *error) { bson_error_reset(error); BSON_ASSERT(uri); // Split the user/pass around the colon: mstr_view username, password; const bool has_password = mstr_split_around(userpass, COLON, &username, &password); // Check if the username has invalid unescaped characters const mstr_view PROHIBITED_CHARS = mstr_cstring("@:/"); if (mstr_find_first_of(username, PROHIBITED_CHARS) != SIZE_MAX) { MONGOC_URI_ERROR(error, "Username must not have unescaped chars. %s", escape_instructions); return false; } if (mstr_find_first_of(password, PROHIBITED_CHARS) != SIZE_MAX) { MONGOC_URI_ERROR(error, "Password must not have unescaped chars. %s", escape_instructions); return false; } // Store the username and password on the URI uri->username = _strdup_pct_decode(username, error); if (!uri->username) { MONGOC_URI_ERROR(error, "%s", "Invalid %-encoding in username in URI string"); return false; } /* Providing password at all is optional */ if (has_password) { uri->password = _strdup_pct_decode(password, error); if (!uri->password) { MONGOC_URI_ERROR(error, "%s", "Invalid %-encoding in password in URI string"); return false; } } return true; } /** * @brief Parse a single host specifier for a URI * * @param uri The URI object to be updated * @param hostport A host specifier, with an optional port * @return true If the operation succeeds * @return false Otherwise */ static bool _parse_one_host(mongoc_uri_t *uri, mstr_view hostport, bson_error_t *error) { bson_error_reset(error); // Don't allow an unescaped "/" in the host string. if (mstr_find(hostport, SLASH) != SIZE_MAX) { // They were probably trying to do a unix socket. Those slashes must be escaped MONGOC_WARNING("Unix Domain Sockets must be escaped (e.g. / = %%2F)"); return false; } /* unescape host. It doesn't hurt including port. */ char *host_and_port = _strdup_pct_decode(hostport, error); if (!host_and_port) { /* invalid */ MONGOC_URI_ERROR(error, "Invalid host specifier \"%.*s\": %s", MSTR_FMT(hostport), error->message); return false; } const bool okay = mongoc_uri_upsert_host_and_port(uri, host_and_port, error); if (!okay) { MONGOC_URI_ERROR(error, "Invalid host specifier \"%s\": %s", host_and_port, error->message); } bson_free(host_and_port); return okay; } /** * @brief Parse the single SRV host specifier for a URI * * @param uri The URI to be updated * @param str The host string for the URI. Should specify a single SRV name * @return true If the operation succeeds * @return false Otherwise */ static bool _parse_srv_hostname(mongoc_uri_t *uri, mstr_view str, bson_error_t *error) { bson_error_reset(error); if (str.len == 0) { MONGOC_URI_ERROR(error, "%s", "Missing service name in SRV URI"); return false; } { char *service = _strdup_pct_decode(str, error); if (!service || !valid_hostname(service) || count_dots(service) < 2) { MONGOC_URI_ERROR(error, "Invalid SRV service name \"%.*s\" in URI: %s", MSTR_FMT(str), error->message); bson_free(service); return false; } bson_strncpy(uri->srv, service, sizeof uri->srv); bson_free(service); } if (strchr(uri->srv, ',')) { MONGOC_URI_ERROR(error, "%s", "Multiple service names are prohibited in an SRV URI"); return false; } if (strchr(uri->srv, ':')) { MONGOC_URI_ERROR(error, "%s", "Port numbers are prohibited in an SRV URI"); return false; } return true; } /** * @brief Parse the comma-separate list of host+port specifiers and store them in `uri` * * @param uri The URI object to be updated * @param hosts A non-empty comma-separated list of host specifiers * @param error An error object to be updated in case of failure * @return true If the operation succeeds and at least one host was added to `uri` * @return false Otherise. `error` will be updated. */ static bool _parse_hosts_csv(mongoc_uri_t *uri, mstr_view const hosts, bson_error_t *error) { bson_error_reset(error); // Check if there is a question mark in the given hostinfo string. This indicates that // the user omitted a required "/" before the query component if (mstr_find(hosts, QUESTION) != SIZE_MAX) { MONGOC_URI_ERROR(error, "%s", "A '/' is required between the host list and any options."); return false; } // We require at least one host in the host list in order to be a valid host CSV if (!hosts.len) { MONGOC_URI_ERROR(error, "%s", "Host list of URI string cannot be empty"); return false; } // Split around commas for (mstr_view remain = hosts; remain.len;) { mstr_view host; mstr_split_around(remain, COMMA, &host, &remain); if (!_parse_one_host(uri, host, error)) { return false; } } return true; } /** * @brief Handle the URI path component * * @param uri The URI object to be updated * @param path The path component of the original URI string. May be empty if * there was no path in the input string, but should start with the leading * slash if it is non-empty. * @return true If the operation succeeds * @return false Otherwise * * We use the URI path to specify the database to be associated with the URI. * We only expect a single path element. If the path is just a slash "/", then * that is the same as omitting the path entirely. */ static bool _parse_path(mongoc_uri_t *uri, mstr_view path, bson_error_t *error) { bson_error_reset(error); // Drop the leading slash, if present. If the URI has no path, then `path` // will already be an empty string. const mstr_view relative = path.len ? mstr_substr(path, 1) : path; if (!relative.len) { // Empty/absent path is no database uri->database = NULL; return true; } // %-decode the path as the database name uri->database = _strdup_pct_decode(relative, error); if (!uri->database) { // %-decode failure MONGOC_URI_ERROR(error, "Invalid database specifier \"%.*s\": %s", MSTR_FMT(relative), error->message); return false; } // Check if the database name contains and invalid characters after the %-decode if (mstr_contains_any_of(mstr_cstring(uri->database), mstr_cstring("/\\. \"$"))) { MONGOC_URI_ERROR(error, "Invalid database specifier \"%s\": Contains disallowed characters", uri->database); return false; } return true; } static bool _parse_and_set_auth_mechanism_properties(mongoc_uri_t *uri, const char *str) { bson_t properties = BSON_INITIALIZER; mstr_view remain = mstr_cstring(str); while (remain.len) { // Get the entry until the next comma mstr_view entry; mstr_split_around(remain, COMMA, &entry, &remain); // Split around the colon. If no colon, makes an empty value. mstr_view key, value; mstr_split_around(entry, COLON, &key, &value); // Accumulate properties bson_append_utf8(&properties, key.data, (int)key.len, value.data, (int)value.len); } /* append our auth properties to our credentials */ if (!mongoc_uri_set_mechanism_properties(uri, &properties)) { bson_destroy(&properties); return false; } bson_destroy(&properties); return true; } static bool mongoc_uri_check_srv_service_name(mongoc_uri_t *uri, const char *str) { /* 63 character DNS query limit, excluding prepended underscore. */ const size_t mongoc_srv_service_name_max = 62u; size_t length = 0u; size_t num_alpha = 0u; size_t i = 0u; char prev = '\0'; BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(str); length = strlen(str); /* Initial DNS Seedlist Discovery Spec: This option specifies a valid SRV * service name according to RFC 6335, with the exception that it may exceed * 15 characters as long as the 63rd (62nd with prepended underscore) * character DNS query limit is not surpassed. */ if (length > mongoc_srv_service_name_max) { return false; } /* RFC 6335: MUST be at least 1 character. */ if (length == 0u) { return false; } for (i = 0u; i < length; ++i) { const char c = str[i]; /* RFC 6335: MUST contain only US-ASCII letters 'A' - 'Z' and 'a' - 'z', * digits '0' - '9', and hyphens ('-', ASCII 0x2D or decimal 45). */ if (!isalpha(c) && !isdigit(c) && c != '-') { return false; } /* RFC 6335: hyphens MUST NOT be adjacent to other hyphens. */ if (c == '-' && prev == '-') { return false; } num_alpha += isalpha(c) ? 1u : 0u; prev = c; } /* RFC 6335: MUST contain at least one letter ('A' - 'Z' or 'a' - 'z') */ if (num_alpha == 0u) { return false; } /* RFC 6335: MUST NOT begin or end with a hyphen. */ if (str[0] == '-' || str[length - 1u] == '-') { return false; } return true; } static bool _apply_read_prefs_tags(mongoc_uri_t *uri, /* IN */ const char *str) /* IN */ { bson_t b = BSON_INITIALIZER; bool okay = false; for (mstr_view remain = mstr_cstring(str); remain.len;) { mstr_view entry; mstr_split_around(remain, COMMA, &entry, &remain); mstr_view key, value; if (!mstr_split_around(entry, COLON, &key, &value)) { // The entry does not have a colon. This is invalid for tags MONGOC_WARNING("Unsupported value for \"" MONGOC_URI_READPREFERENCETAGS "\": \"%s\"", str); goto fail; } bson_append_utf8(&b, key.data, (int)key.len, value.data, (int)value.len); } mongoc_read_prefs_add_tag(uri->read_prefs, &b); okay = true; fail: bson_destroy(&b); return okay; } /** * @brief Remove a BSON element with the given key, case-insensitive * * @param doc The document to be updated * @param key The key to be removed */ static void _bson_erase_icase(bson_t *doc, mstr_view key) { bson_iter_t iter; if (!bson_iter_init(&iter, doc)) { return; } bson_t tmp = BSON_INITIALIZER; while (bson_iter_next(&iter)) { if (mstr_latin_casecmp(mstr_cstring(bson_iter_key(&iter)), !=, key)) { const bson_value_t *const bvalue = bson_iter_value(&iter); BSON_APPEND_VALUE(&tmp, bson_iter_key(&iter), bvalue); } } bson_destroy(doc); bson_copy_to(&tmp, doc); bson_destroy(&tmp); } /** * @brief Update a BSON document with a UTF-8 value, replacing it if it already * exists * * @param options The doc to be updated * @param key The case-insensitive string of the to be added/updated * @param value The UTF-8 string that will be inserted or removed * * @note This will case-normalize the key string to lowercase before inserting it. */ static void _bson_upsert_utf8_icase(bson_t *options, mstr_view key, const char *value) { _bson_erase_icase(options, key); // Lowercase the key, preventing the need for all callers to do this normalization // themselves. char *lower = bson_strndup(key.data, key.len); mongoc_lowercase_inplace(lower); bson_append_utf8(options, lower, -1, value, -1); bson_free(lower); } /** * @brief Initialize an iterator to point to the named element, case-insensitive * * @param iter Storage for an iterator to be updated * @param doc The document to be searched * @param key The key to find, case-insensitive * @return true If the element was found, and `*iter` is updated * @return false Otherwise */ static inline bool _bson_init_iter_find_icase(bson_iter_t *iter, bson_t const *doc, mstr_view key) { if (!bson_iter_init(iter, doc)) { return false; } while (bson_iter_next(iter)) { if (mstr_latin_casecmp(mstr_cstring(bson_iter_key(iter)), ==, key)) { return true; } } return false; } bool mongoc_uri_has_option(const mongoc_uri_t *uri, const char *key) { bson_iter_t iter; return _bson_init_iter_find_icase(&iter, &uri->options, mstr_cstring(key)); } bool mongoc_uri_option_is_int32(const char *key) { return mongoc_uri_option_is_int64(key) || !strcasecmp(key, MONGOC_URI_CONNECTTIMEOUTMS) || !strcasecmp(key, MONGOC_URI_HEARTBEATFREQUENCYMS) || !strcasecmp(key, MONGOC_URI_SERVERSELECTIONTIMEOUTMS) || !strcasecmp(key, MONGOC_URI_SOCKETCHECKINTERVALMS) || !strcasecmp(key, MONGOC_URI_SOCKETTIMEOUTMS) || !strcasecmp(key, MONGOC_URI_LOCALTHRESHOLDMS) || !strcasecmp(key, MONGOC_URI_MAXPOOLSIZE) || !strcasecmp(key, MONGOC_URI_MAXSTALENESSSECONDS) || !strcasecmp(key, MONGOC_URI_WAITQUEUETIMEOUTMS) || !strcasecmp(key, MONGOC_URI_ZLIBCOMPRESSIONLEVEL) || !strcasecmp(key, MONGOC_URI_SRVMAXHOSTS); } bool mongoc_uri_option_is_int64(const char *key) { return !strcasecmp(key, MONGOC_URI_WTIMEOUTMS); } bool mongoc_uri_option_is_bool(const char *key) { // CDRIVER-5933 if (!strcasecmp(key, MONGOC_URI_CANONICALIZEHOSTNAME)) { MONGOC_WARNING(MONGOC_URI_CANONICALIZEHOSTNAME " is deprecated, use " MONGOC_URI_AUTHMECHANISMPROPERTIES " with CANONICALIZE_HOST_NAME instead"); return true; } return !strcasecmp(key, MONGOC_URI_DIRECTCONNECTION) || !strcasecmp(key, MONGOC_URI_JOURNAL) || !strcasecmp(key, MONGOC_URI_RETRYREADS) || !strcasecmp(key, MONGOC_URI_RETRYWRITES) || !strcasecmp(key, MONGOC_URI_SAFE) || !strcasecmp(key, MONGOC_URI_SERVERSELECTIONTRYONCE) || !strcasecmp(key, MONGOC_URI_TLS) || !strcasecmp(key, MONGOC_URI_TLSINSECURE) || !strcasecmp(key, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES) || !strcasecmp(key, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES) || !strcasecmp(key, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK) || !strcasecmp(key, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK) || !strcasecmp(key, MONGOC_URI_LOADBALANCED) || /* deprecated options with canonical equivalents */ !strcasecmp(key, MONGOC_URI_SSL) || !strcasecmp(key, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES) || !strcasecmp(key, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES); } bool mongoc_uri_option_is_utf8(const char *key) { return !strcasecmp(key, MONGOC_URI_APPNAME) || !strcasecmp(key, MONGOC_URI_REPLICASET) || !strcasecmp(key, MONGOC_URI_READPREFERENCE) || !strcasecmp(key, MONGOC_URI_SERVERMONITORINGMODE) || !strcasecmp(key, MONGOC_URI_SRVSERVICENAME) || !strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILE) || !strcasecmp(key, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD) || !strcasecmp(key, MONGOC_URI_TLSCAFILE) || /* deprecated options with canonical equivalents */ !strcasecmp(key, MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE) || !strcasecmp(key, MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD) || !strcasecmp(key, MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE); } const char * mongoc_uri_canonicalize_option(const char *key) { if (!strcasecmp(key, MONGOC_URI_SSL)) { return MONGOC_URI_TLS; } else if (!strcasecmp(key, MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE)) { return MONGOC_URI_TLSCERTIFICATEKEYFILE; } else if (!strcasecmp(key, MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD)) { return MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD; } else if (!strcasecmp(key, MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE)) { return MONGOC_URI_TLSCAFILE; } else if (!strcasecmp(key, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES)) { return MONGOC_URI_TLSALLOWINVALIDCERTIFICATES; } else if (!strcasecmp(key, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES)) { return MONGOC_URI_TLSALLOWINVALIDHOSTNAMES; } else { return key; } } /** * @brief Test whether the given URI parameter is allowed to be specified in * a DNS record. * * @param key The parameter key string, case-insensitive * @return true If the option is valid in a DNS record * @return false Otherwise */ static bool dns_option_allowed(mstr_view key) { /* Initial DNS Seedlist Discovery Spec: "A Client MUST only support the * authSource, replicaSet, and loadBalanced options through a TXT record, and * MUST raise an error if any other option is encountered." */ return mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_AUTHSOURCE)) || mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_LOADBALANCED)) || mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_REPLICASET)); } /** * @brief Apply a single query parameter to a URI from a string * * @param uri The object to be updated. * @param options The URI options data that will also be updated. * @param str The percent-encoded query string element to be decoded. * @param from_dns Whether this query string comes from a DNS result * @retval true Upon success * @retval false Otherwise, and sets `*error` */ static bool _handle_pct_uri_query_param(mongoc_uri_t *uri, bson_t *options, mstr_view str, bool from_dns, bson_error_t *error) { bson_error_reset(error); // The argument value, with percent-encoding removed char *value = NULL; // Whether the operation succeeded bool ret = false; mstr_view key, val_pct; if (!mstr_split_around(str, mstr_cstring("="), &key, &val_pct)) { MONGOC_URI_ERROR(error, "URI option \"%.*s\" contains no \"=\" sign", MSTR_FMT(str)); goto done; } /* Initial DNS Seedlist Discovery Spec: "A Client MUST only support the * authSource, replicaSet, and loadBalanced options through a TXT record, and * MUST raise an error if any other option is encountered."*/ if (from_dns && !dns_option_allowed(key)) { MONGOC_URI_ERROR(error, "URI option \"%.*s\" prohibited in TXT records", MSTR_FMT(key)); goto done; } value = _strdup_pct_decode(val_pct, error); if (!value) { /* do_unescape detected invalid UTF-8 and freed value */ MONGOC_URI_ERROR(error, "Value for URI option \"%.*s\" contains is invalid: %s", MSTR_FMT(key), error->message); goto done; } /* Special case: readPreferenceTags is a composing option. * Multiple instances should append, not overwrite. * Encode them directly to the options field, * bypassing canonicalization and duplicate checks. */ if (mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_READPREFERENCETAGS))) { if (!_apply_read_prefs_tags(uri, value)) { MONGOC_URI_ERROR(error, "Unsupported value for \"%.*s\": \"%s\"", MSTR_FMT(key), value); goto done; } else { ret = true; goto done; } } // Handle case where the option has already been specified bson_iter_t iter; if (_bson_init_iter_find_icase(&iter, &uri->raw, key) || _bson_init_iter_find_icase(&iter, options, key)) { /* Special case, MONGOC_URI_W == "any non-int" is not overridden * by later values. */ size_t opt_len; if (mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_W)) && mlib_i64_parse(mstr_cstring(bson_iter_utf8_unsafe(&iter, &opt_len)), NULL)) { // Value is a "w", and is not a valid integer, but we already have a valid "w" // value, so don't overwrite it ret = true; goto done; } /* Initial DNS Seedlist Discovery Spec: "Client MUST use options * specified in the Connection String to override options provided * through TXT records." So, do NOT override existing options with TXT * options. */ if (from_dns) { if (mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_AUTHSOURCE))) { // Treat `authSource` as a special case. A server may support authentication with multiple mechanisms. // MONGODB-X509 requires authSource=$external. SCRAM-SHA-256 requires authSource=admin. // Only log a trace message since this may be expected. TRACE("Ignoring URI option \"%.*s\" from TXT record \"%.*s\". Option is already present in URI", MSTR_FMT(key), MSTR_FMT(str)); } else { MONGOC_WARNING("Ignoring URI option \"%.*s\" from TXT record \"%.*s\". Option is already present in URI", MSTR_FMT(key), MSTR_FMT(str)); } ret = true; goto done; } MONGOC_WARNING("Overwriting previously provided value for '%.*s'", MSTR_FMT(key)); } // Reject replicaSet="" if (mstr_latin_casecmp(key, ==, mstr_cstring(MONGOC_URI_REPLICASET)) && strlen(value) == 0) { MONGOC_URI_ERROR(error, "Value for URI option \"%.*s\" cannot be empty string", MSTR_FMT(key)); goto done; } _bson_upsert_utf8_icase(options, key, value); ret = true; done: bson_free(value); return ret; } /* Check for canonical/deprecated conflicts * between the option list a, and b. * If both names exist either way with differing values, error. */ static bool mongoc_uri_options_validate_names(const bson_t *a, const bson_t *b, bson_error_t *error) { bson_iter_t key_iter, canon_iter; const char *key = NULL; const char *canon = NULL; const char *value = NULL; const char *cval = NULL; size_t value_len = 0; size_t cval_len = 0; /* Scan `a` looking for deprecated names * where the canonical name was also used in `a`, * or was used in `b`. */ if (!bson_iter_init(&key_iter, a)) { return false; } while (bson_iter_next(&key_iter)) { key = bson_iter_key(&key_iter); value = bson_iter_utf8_unsafe(&key_iter, &value_len); canon = mongoc_uri_canonicalize_option(key); if (mstr_latin_casecmp(mstr_cstring(key), ==, mstr_cstring(canon))) { /* Canonical form, no point checking `b`. */ continue; } /* Check for a conflict in `a`. */ if (bson_iter_init_find(&canon_iter, a, canon)) { cval = bson_iter_utf8_unsafe(&canon_iter, &cval_len); if (mstr_cmp(mstr_cstring(cval), !=, mstr_cstring(value))) { goto HANDLE_CONFLICT; } } /* Check for a conflict in `b`. */ if (bson_iter_init_find(&canon_iter, b, canon)) { cval = bson_iter_utf8_unsafe(&canon_iter, &cval_len); if (mstr_cmp(mstr_cstring(cval), !=, mstr_cstring(value))) { goto HANDLE_CONFLICT; } } } return true; HANDLE_CONFLICT: MONGOC_URI_ERROR(error, "Deprecated option '%s=%s' conflicts with " "canonical name '%s=%s'", key, value, canon, cval); return false; } #define HANDLE_DUPE() \ if (from_dns) { \ MONGOC_WARNING("Cannot override URI option \"%s\" from TXT record", key); \ continue; \ } else if (1) { \ MONGOC_WARNING("Overwriting previously provided value for '%s'", key); \ } else \ (void)0 static bool mongoc_uri_apply_options(mongoc_uri_t *uri, const bson_t *options, bool from_dns, bson_error_t *error) { bson_iter_t iter; const char *key = NULL; const char *canon = NULL; const char *value = NULL; size_t value_len; bool bval; if (!bson_iter_init(&iter, options)) { return false; } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); canon = mongoc_uri_canonicalize_option(key); value = bson_iter_utf8_unsafe(&iter, &value_len); /* Keep a record of how the option was originally presented. */ _bson_upsert_utf8_icase(&uri->raw, mstr_cstring(key), value); /* This check precedes mongoc_uri_option_is_int32 as all 64-bit values are * also recognised as 32-bit ints. */ if (mongoc_uri_option_is_int64(key)) { if (0 < strlen(value)) { int64_t i64 = 42424242; if (mlib_i64_parse(mstr_cstring(value), &i64)) { goto UNSUPPORTED_VALUE; } if (!_mongoc_uri_set_option_as_int64_with_error(uri, canon, i64, error)) { return false; } } else { MONGOC_WARNING("Empty value provided for \"%s\"", key); } } else if (mongoc_uri_option_is_int32(key)) { if (0 < strlen(value)) { int32_t i32 = 42424242; if (mlib_i32_parse(mstr_cstring(value), &i32)) { goto UNSUPPORTED_VALUE; } if (!_mongoc_uri_set_option_as_int32_with_error(uri, canon, i32, error)) { return false; } } else { MONGOC_WARNING("Empty value provided for \"%s\"", key); } } else if (!strcmp(key, MONGOC_URI_W)) { int32_t i32 = 42424242; if (!mlib_i32_parse(mstr_cstring(value), 10, &i32)) { // A valid integer 'w' value. _mongoc_uri_set_option_as_int32(uri, MONGOC_URI_W, i32); } else if (0 == strcasecmp(value, "majority")) { _bson_upsert_utf8_icase(&uri->options, mstr_cstring(MONGOC_URI_W), "majority"); } else if (*value) { _bson_upsert_utf8_icase(&uri->options, mstr_cstring(MONGOC_URI_W), value); } } else if (mongoc_uri_option_is_bool(key)) { if (0 < strlen(value)) { if (0 == strcasecmp(value, "true")) { bval = true; } else if (0 == strcasecmp(value, "false")) { bval = false; } else if ((0 == strcmp(value, "1")) || (0 == strcasecmp(value, "yes")) || (0 == strcasecmp(value, "y")) || (0 == strcasecmp(value, "t"))) { MONGOC_WARNING("Deprecated boolean value for \"%s\": \"%s\", " "please update to \"%s=true\"", key, value, key); bval = true; } else if ((0 == strcasecmp(value, "0")) || (0 == strcasecmp(value, "-1")) || (0 == strcmp(value, "no")) || (0 == strcmp(value, "n")) || (0 == strcmp(value, "f"))) { MONGOC_WARNING("Deprecated boolean value for \"%s\": \"%s\", " "please update to \"%s=false\"", key, value, key); bval = false; } else { goto UNSUPPORTED_VALUE; } if (!mongoc_uri_set_option_as_bool(uri, canon, bval)) { _mongoc_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Failed to set %s to %d", canon, bval); return false; } } else { MONGOC_WARNING("Empty value provided for \"%s\"", key); } } else if (!strcmp(key, MONGOC_URI_READPREFERENCETAGS)) { /* Skip this option here. * It was marshalled during mongoc_uri_split_option() * as a special case composing option. */ } else if (!strcmp(key, MONGOC_URI_AUTHMECHANISM) || !strcmp(key, MONGOC_URI_AUTHSOURCE)) { if (bson_has_field(&uri->credentials, key)) { HANDLE_DUPE(); } _bson_upsert_utf8_icase(&uri->credentials, mstr_cstring(canon), value); } else if (!strcmp(key, MONGOC_URI_READCONCERNLEVEL)) { if (!mongoc_read_concern_is_default(uri->read_concern)) { HANDLE_DUPE(); } mongoc_read_concern_set_level(uri->read_concern, value); } else if (!strcmp(key, MONGOC_URI_GSSAPISERVICENAME)) { char *tmp = bson_strdup_printf("SERVICE_NAME:%s", value); if (bson_has_field(&uri->credentials, MONGOC_URI_AUTHMECHANISMPROPERTIES)) { MONGOC_WARNING("authMechanismProperties SERVICE_NAME already set, " "ignoring '%s'", key); } else { // CDRIVER-5933 MONGOC_WARNING(MONGOC_URI_GSSAPISERVICENAME " is deprecated, use " MONGOC_URI_AUTHMECHANISMPROPERTIES " with SERVICE_NAME instead"); if (!_parse_and_set_auth_mechanism_properties(uri, tmp)) { bson_free(tmp); goto UNSUPPORTED_VALUE; } } bson_free(tmp); } else if (!strcmp(key, MONGOC_URI_SRVSERVICENAME)) { if (!mongoc_uri_check_srv_service_name(uri, value)) { goto UNSUPPORTED_VALUE; } _bson_upsert_utf8_icase(&uri->options, mstr_cstring(canon), value); } else if (!strcmp(key, MONGOC_URI_AUTHMECHANISMPROPERTIES)) { if (bson_has_field(&uri->credentials, key)) { HANDLE_DUPE(); } if (!_parse_and_set_auth_mechanism_properties(uri, value)) { goto UNSUPPORTED_VALUE; } } else if (!strcmp(key, MONGOC_URI_APPNAME)) { /* Part of uri->options */ if (!mongoc_uri_set_appname(uri, value)) { goto UNSUPPORTED_VALUE; } } else if (!strcmp(key, MONGOC_URI_COMPRESSORS)) { if (!bson_empty(mongoc_uri_get_compressors(uri))) { HANDLE_DUPE(); } if (!mongoc_uri_set_compressors(uri, value)) { goto UNSUPPORTED_VALUE; } } else if (!strcmp(key, MONGOC_URI_SERVERMONITORINGMODE)) { if (!mongoc_uri_set_server_monitoring_mode(uri, value)) { goto UNSUPPORTED_VALUE; } } else if (mongoc_uri_option_is_utf8(key)) { _bson_upsert_utf8_icase(&uri->options, mstr_cstring(canon), value); } else { /* * Keys that aren't supported by a driver MUST be ignored. * * A WARN level logging message MUST be issued * https://github.com/mongodb/specifications/blob/master/source/connection-string/connection-string-spec.md#keys */ MONGOC_WARNING("Unsupported URI option \"%s\"", key); } } return true; UNSUPPORTED_VALUE: MONGOC_URI_ERROR(error, "Unsupported value for \"%s\": \"%s\"", key, value); return false; } /* Processes a query string formatted set of driver options * (i.e. tls=true&connectTimeoutMS=250 ) into a BSON dict of values. * uri->raw is initially populated with the raw split of key/value pairs, * then the keys are canonicalized and the values coerced * to their appropriate type and stored in uri->options. */ bool _mongoc_uri_apply_query_string(mongoc_uri_t *uri, mstr_view remain, bool from_dns, bson_error_t *error) { bson_t options = BSON_INITIALIZER; for (; remain.len;) { mstr_view entry; mstr_split_around(remain, mstr_cstring("&"), &entry, &remain); if (!_handle_pct_uri_query_param(uri, &options, entry, from_dns, error)) { bson_destroy(&options); return false; } } /* Walk both sides of this map to handle each ordering: * deprecated first canonical later, and vice-versa. * Then finalize parse by writing final values to uri->options. */ if (!mongoc_uri_options_validate_names(&uri->options, &options, error) || !mongoc_uri_options_validate_names(&options, &uri->options, error) || !mongoc_uri_apply_options(uri, &options, from_dns, error)) { bson_destroy(&options); return false; } bson_destroy(&options); return true; } static bool mongoc_uri_finalize_tls(mongoc_uri_t *uri, bson_error_t *error) { /* Initial DNS Seedlist Discovery Spec: "If mongodb+srv is used, a driver * MUST implicitly also enable TLS." */ if (uri->is_srv && !bson_has_field(&uri->options, MONGOC_URI_TLS)) { mongoc_uri_set_option_as_bool(uri, MONGOC_URI_TLS, true); } /* tlsInsecure implies tlsAllowInvalidCertificates, tlsAllowInvalidHostnames, * tlsDisableOCSPEndpointCheck, and tlsDisableCertificateRevocationCheck, so * consider it an error to have both. The user might have the wrong idea. */ if (bson_has_field(&uri->options, MONGOC_URI_TLSINSECURE) && (bson_has_field(&uri->options, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES) || bson_has_field(&uri->options, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES) || bson_has_field(&uri->options, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK) || bson_has_field(&uri->options, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK))) { MONGOC_URI_ERROR(error, "%s may not be specified with %s, %s, %s, or %s", MONGOC_URI_TLSINSECURE, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK); return false; } /* tlsAllowInvalidCertificates implies tlsDisableOCSPEndpointCheck and * tlsDisableCertificateRevocationCheck, so consider it an error to have * both. The user might have the wrong idea. */ if (bson_has_field(&uri->options, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES) && (bson_has_field(&uri->options, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK) || bson_has_field(&uri->options, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK))) { MONGOC_URI_ERROR(error, "%s may not be specified with %s or %s", MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK); return false; } /* tlsDisableCertificateRevocationCheck implies tlsDisableOCSPEndpointCheck, * so consider it an error to have both. The user might have the wrong idea. */ if (bson_has_field(&uri->options, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK) && bson_has_field(&uri->options, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK)) { MONGOC_URI_ERROR(error, "%s may not be specified with %s", MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK); return false; } return true; } typedef enum _mongoc_uri_finalize_validate { _mongoc_uri_finalize_allowed, _mongoc_uri_finalize_required, _mongoc_uri_finalize_prohibited, } mongoc_uri_finalize_validate; static bool _finalize_auth_username(const char *username, const char *mechanism, mongoc_uri_finalize_validate validate, bson_error_t *error) { BSON_OPTIONAL_PARAM(username); BSON_ASSERT_PARAM(mechanism); BSON_OPTIONAL_PARAM(error); switch (validate) { case _mongoc_uri_finalize_required: if (!username || strlen(username) == 0u) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism requires a username", mechanism); return false; } break; case _mongoc_uri_finalize_prohibited: if (username) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism does not accept a username", mechanism); return false; } break; case _mongoc_uri_finalize_allowed: default: if (username && strlen(username) == 0u) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism requires a non-empty username", mechanism); return false; } break; } return true; } // source MUST be "$external" static bool _finalize_auth_source_external(const char *source, const char *mechanism, bson_error_t *error) { BSON_OPTIONAL_PARAM(source); BSON_ASSERT_PARAM(mechanism); BSON_OPTIONAL_PARAM(error); if (source && strcasecmp(source, "$external") != 0) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism requires \"$external\" authSource, but \"%s\" was specified", mechanism, source); return false; } return true; } // source MUST be "$external" and defaults to "$external". static bool _finalize_auth_source_default_external(mongoc_uri_t *uri, const char *source, const char *mechanism, bson_error_t *error) { BSON_ASSERT_PARAM(uri); BSON_OPTIONAL_PARAM(source); BSON_ASSERT_PARAM(mechanism); BSON_OPTIONAL_PARAM(error); if (!source) { bsonBuildAppend(uri->credentials, kv(MONGOC_URI_AUTHSOURCE, cstr("$external"))); if (bsonBuildError) { MONGOC_URI_ERROR(error, "unexpected URI credentials BSON error when attempting to default '%s' " "authentication source to '$external': %s", mechanism, bsonBuildError); return false; } return true; } else { return _finalize_auth_source_external(source, mechanism, error); } } static bool _finalize_auth_password(const char *password, const char *mechanism, mongoc_uri_finalize_validate validate, bson_error_t *error) { BSON_OPTIONAL_PARAM(password); BSON_ASSERT_PARAM(mechanism); BSON_OPTIONAL_PARAM(error); switch (validate) { case _mongoc_uri_finalize_required: // Passwords may be zero length. if (!password) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism requires a password", mechanism); return false; } break; case _mongoc_uri_finalize_prohibited: if (password) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism does not accept a password", mechanism); return false; } break; case _mongoc_uri_finalize_allowed: default: break; } return true; } typedef struct __supported_mechanism_properties { const char *name; bson_type_t type; } supported_mechanism_properties; static bool _supported_mechanism_properties_check(const supported_mechanism_properties *supported_properties, const bson_t *mechanism_properties, const char *mechanism, bson_error_t *error) { BSON_ASSERT_PARAM(supported_properties); BSON_ASSERT_PARAM(mechanism_properties); BSON_ASSERT_PARAM(mechanism); BSON_ASSERT_PARAM(error); bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, mechanism_properties)); // For each element in `MongoCredential.mechanism_properties`... while (bson_iter_next(&iter)) { const char *const key = bson_iter_key(&iter); // ... ensure it matches one of the supported mechanism property fields. for (const supported_mechanism_properties *prop = supported_properties; prop->name; ++prop) { // Authentication spec: naming of mechanism properties MUST be case-insensitive. For instance, SERVICE_NAME and // service_name refer to the same property. if (strcasecmp(key, prop->name) == 0) { const bson_type_t type = bson_iter_type(&iter); if (type == prop->type) { goto found_match; // Matches both key and type. } else { // Authentication spec: Drivers SHOULD raise an error as early as possible when detecting invalid values // in a credential. For instance, if a mechanism_property is specified for MONGODB-CR, the driver should // raise an error indicating that the property does not apply. // // Note: this overrides the Connection String spec: Any invalid Values for a given key MUST be ignored // and MUST log a WARN level message. MONGOC_URI_ERROR(error, "'%s' authentication mechanism property '%s' has incorrect type '%s', should be '%s'", key, mechanism, _mongoc_bson_type_to_str(type), _mongoc_bson_type_to_str(prop->type)); return false; } } } // Authentication spec: Drivers SHOULD raise an error as early as possible when detecting invalid values in a // credential. For instance, if a mechanism_property is specified for MONGODB-CR, the driver should raise an error // indicating that the property does not apply. // // Note: this overrides the Connection String spec: Any invalid Values for a given key MUST be ignored and MUST // log a WARN level message. MONGOC_URI_ERROR(error, "Unsupported '%s' authentication mechanism property: '%s'", mechanism, key); return false; found_match: continue; } return true; } static bool _finalize_auth_gssapi_mechanism_properties(const bson_t *mechanism_properties, bson_error_t *error) { BSON_OPTIONAL_PARAM(mechanism_properties); BSON_ASSERT_PARAM(error); static const supported_mechanism_properties supported_properties[] = { {"SERVICE_NAME", BSON_TYPE_UTF8}, {"CANONICALIZE_HOST_NAME", BSON_TYPE_UTF8}, // CDRIVER-4128: UTF-8 even when "false" or "true". {"SERVICE_REALM", BSON_TYPE_UTF8}, {"SERVICE_HOST", BSON_TYPE_UTF8}, {0}, }; if (mechanism_properties) { return _supported_mechanism_properties_check(supported_properties, mechanism_properties, "GSSAPI", error); } return true; } static bool _finalize_auth_aws_mechanism_properties(const bson_t *mechanism_properties, bson_error_t *error) { BSON_OPTIONAL_PARAM(mechanism_properties); BSON_ASSERT_PARAM(error); static const supported_mechanism_properties supported_properties[] = { {"AWS_SESSION_TOKEN", BSON_TYPE_UTF8}, {0}, }; if (mechanism_properties) { return _supported_mechanism_properties_check(supported_properties, mechanism_properties, "MONGODB-AWS", error); } return true; } static bool _finalize_auth_oidc_mechanism_properties(const bson_t *mechanism_properties, bson_error_t *error) { BSON_OPTIONAL_PARAM(mechanism_properties); BSON_ASSERT_PARAM(error); static const supported_mechanism_properties supported_properties[] = { {"ENVIRONMENT", BSON_TYPE_UTF8}, {"TOKEN_RESOURCE", BSON_TYPE_UTF8}, {0}, }; if (mechanism_properties) { return _supported_mechanism_properties_check(supported_properties, mechanism_properties, "MONGODB-OIDC", error); } return true; } static bool mongoc_uri_finalize_auth(mongoc_uri_t *uri, bson_error_t *error) { BSON_ASSERT_PARAM(uri); BSON_OPTIONAL_PARAM(error); // Most validation of MongoCredential fields below according to the Authentication spec must be deferred to the // implementation of the Authentication Handshake algorithm (i.e. `_mongoc_cluster_auth_node`) due to support for // partial and late setting of credential fields via `mongoc_uri_set_*` functions. Limit validation to requirements // for individual field which are explicitly specified. Do not validate requirements on fields in relation to one // another (e.g. "given field A, field B must..."). The username, password, and authSource credential fields are // exceptions to this rule for both backward compatibility and spec test compliance. bool ret = false; bson_iter_t iter; const char *const username = mongoc_uri_get_username(uri); const char *const password = mongoc_uri_get_password(uri); const char *const source = bson_iter_init_find_case(&iter, &uri->credentials, MONGOC_URI_AUTHSOURCE) ? bson_iter_utf8(&iter, NULL) : NULL; // Satisfy Connection String spec test: "must raise an error when the authSource is empty". // This applies even before determining whether or not authentication is required. if (source && strlen(source) == 0) { MONGOC_URI_ERROR(error, "%s", "authSource may not be specified as an empty string"); return false; } // Copy `mechanism` to avoid invalidation by updates to `uri->credentials`. char *const mechanism = bson_strdup(mongoc_uri_get_auth_mechanism(uri)); // Authentication spec: The presence of a credential delimiter (i.e. '@') in the URI connection string is // evidence that the user has unambiguously specified user information and MUST be interpreted as a user // configuring authentication credentials (even if the username and/or password are empty strings). // // Note: username is always set when the credential delimiter `@` is present in the URI as parsed by // `mongoc_uri_parse_userpass`. // // If neither an authentication mechanism nor a username is provided, there is nothing to do. if (!mechanism && !username) { return true; } else { // All code below assumes authentication credentials are being configured. } bson_t *mechanism_properties = NULL; bson_t mechanism_properties_owner; { bson_t tmp; if (mongoc_uri_get_mechanism_properties(uri, &tmp)) { bson_copy_to(&tmp, &mechanism_properties_owner); // Avoid invalidation by updates to `uri->credentials`. mechanism_properties = &mechanism_properties_owner; } else { bson_init(&mechanism_properties_owner); // Ensure initialization. } } // Default authentication method. if (!mechanism) { // The authentication mechanism will be derived by `_mongoc_cluster_auth_node` during handshake according to // `saslSupportedMechs`. // Authentication spec: username: MUST be specified and non-zero length. // Default authentication method is used when no mechanism is specified but a username is present; see the // `!mechanism && !username` check above. if (!_finalize_auth_username(username, "default", _mongoc_uri_finalize_required, error)) { goto fail; } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // SCRAM-SHA-1, SCRAM-SHA-256, and PLAIN (same validation requirements) else if (strcasecmp(mechanism, "SCRAM-SHA-1") == 0 || strcasecmp(mechanism, "SCRAM-SHA-256") == 0 || strcasecmp(mechanism, "PLAIN") == 0) { // Authentication spec: username: MUST be specified and non-zero length. if (!_finalize_auth_username(username, mechanism, _mongoc_uri_finalize_required, error)) { goto fail; } // Authentication spec: password: MUST be specified. if (!_finalize_auth_password(password, mechanism, _mongoc_uri_finalize_required, error)) { goto fail; } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // MONGODB-X509 else if (strcasecmp(mechanism, "MONGODB-X509") == 0) { // `MongoCredential.username` SHOULD NOT be provided for MongoDB 3.4 and newer. // CDRIVER-1959: allow for backward compatibility until the spec states "MUST NOT" instead of "SHOULD NOT" and // spec tests are updated accordingly to permit warnings or errors. if (!_finalize_auth_username(username, mechanism, _mongoc_uri_finalize_allowed, error)) { goto fail; } // Authentication spec: password: MUST NOT be specified. if (!_finalize_auth_password(password, mechanism, _mongoc_uri_finalize_prohibited, error)) { goto fail; } // Authentication spec: source: MUST be "$external" and defaults to "$external". if (!_finalize_auth_source_default_external(uri, source, mechanism, error)) { goto fail; } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // GSSAPI else if (strcasecmp(mechanism, "GSSAPI") == 0) { // Authentication spec: username: MUST be specified and non-zero length. if (!_finalize_auth_username(username, mechanism, _mongoc_uri_finalize_required, error)) { goto fail; } // Authentication spec: source: MUST be "$external" and defaults to "$external". if (!_finalize_auth_source_default_external(uri, source, mechanism, error)) { goto fail; } // Authentication spec: password: MAY be specified. if (!_finalize_auth_password(password, mechanism, _mongoc_uri_finalize_allowed, error)) { goto fail; } // `MongoCredentials.mechanism_properties` are allowed for GSSAPI. if (!_finalize_auth_gssapi_mechanism_properties(mechanism_properties, error)) { goto fail; } // Authentication spec: valid values for CANONICALIZE_HOST_NAME are true, false, "none", "forward", // "forwardAndReverse". If a value is provided that does not match one of these the driver MUST raise an error. if (mechanism_properties) { bsonParse(*mechanism_properties, find(iKeyWithType("CANONICALIZE_HOST_NAME", utf8), case (when(iStrEqual("true"), nop), when(iStrEqual("false"), nop), // CDRIVER-4128: only legacy boolean values are currently supported. else(do({ bsonParseError = "'GSSAPI' authentication mechanism requires CANONICALIZE_HOST_NAME is either " "\"true\" or \"false\""; }))))); if (bsonParseError) { MONGOC_URI_ERROR(error, "%s", bsonParseError); goto fail; } } // Authentication spec: Drivers MUST allow the user to specify a different service name. The default is // "mongodb". if (!mechanism_properties || !bson_iter_init_find_case(&iter, mechanism_properties, "SERVICE_NAME")) { bsonBuildDecl(props, if (mechanism_properties, then(insert(*mechanism_properties, always))), kv("SERVICE_NAME", cstr("mongodb"))); const bool success = !bsonBuildError && mongoc_uri_set_mechanism_properties(uri, &props); bson_destroy(&props); if (!success) { MONGOC_URI_ERROR(error, "unexpected URI credentials BSON error when attempting to default 'GSSAPI' " "authentication mechanism property 'SERVICE_NAME' to 'mongodb': %s", bsonBuildError ? bsonBuildError : "mongoc_uri_set_mechanism_properties failed"); goto fail; } } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // MONGODB-AWS else if (strcasecmp(mechanism, "MONGODB-AWS") == 0) { // Authentication spec: username: MAY be specified (as the non-sensitive AWS access key). if (!_finalize_auth_username(username, mechanism, _mongoc_uri_finalize_allowed, error)) { goto fail; } // Authentication spec: source: MUST be "$external" and defaults to "$external". if (!_finalize_auth_source_default_external(uri, source, mechanism, error)) { goto fail; } // Authentication spec: password: MAY be specified (as the sensitive AWS secret key). if (!_finalize_auth_password(password, mechanism, _mongoc_uri_finalize_allowed, error)) { goto fail; } // mechanism_properties are allowed for MONGODB-AWS. if (!_finalize_auth_aws_mechanism_properties(mechanism_properties, error)) { goto fail; } // Authentication spec: if a username is provided without a password (or vice-versa), Drivers MUST raise an error. if (!username != !password) { MONGOC_URI_ERROR(error, "'%s' authentication mechanism does not accept a username or a password without the other", mechanism); goto fail; } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // MONGODB-OIDC else if (strcasecmp(mechanism, "MONGODB-OIDC") == 0) { // Authentication spec: username: MAY be specified (with callback/environment defined meaning). if (!_finalize_auth_username(username, mechanism, _mongoc_uri_finalize_allowed, error)) { goto fail; } // Authentication spec: source: MUST be "$external" and defaults to "$external". if (!_finalize_auth_source_default_external(uri, source, mechanism, error)) { goto fail; } // Authentication spec: password: MUST NOT be specified. if (!_finalize_auth_password(password, mechanism, _mongoc_uri_finalize_prohibited, error)) { goto fail; } // mechanism_properties are allowed for MONGODB-OIDC. if (!_finalize_auth_oidc_mechanism_properties(mechanism_properties, error)) { goto fail; } // The environment is optional, but if specified it must appear valid. if (mechanism_properties && bson_iter_init_find_case(&iter, mechanism_properties, "ENVIRONMENT")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { MONGOC_URI_ERROR(error, "'%s' authentication has non-string %s property", mechanism, "ENVIRONMENT"); goto fail; } const mongoc_oidc_env_t *env = mongoc_oidc_env_find(bson_iter_utf8(&iter, NULL)); if (!env) { MONGOC_URI_ERROR(error, "'%s' authentication has unrecognized %s property '%s'", mechanism, "ENVIRONMENT", bson_iter_utf8(&iter, NULL)); goto fail; } if (username && !mongoc_oidc_env_supports_username(env)) { MONGOC_URI_ERROR(error, "'%s' authentication with %s environment does not accept a %s", mechanism, mongoc_oidc_env_name(env), "username"); goto fail; } if (bson_iter_init_find_case(&iter, mechanism_properties, "TOKEN_RESOURCE")) { if (!BSON_ITER_HOLDS_UTF8(&iter)) { MONGOC_URI_ERROR(error, "'%s' authentication has non-string %s property", mechanism, "TOKEN_RESOURCE"); goto fail; } if (!mongoc_oidc_env_requires_token_resource(env)) { MONGOC_URI_ERROR(error, "'%s' authentication with %s environment does not accept a %s", mechanism, mongoc_oidc_env_name(env), "TOKEN_RESOURCE"); goto fail; } } else { if (mongoc_oidc_env_requires_token_resource(env)) { MONGOC_URI_ERROR(error, "'%s' authentication with %s environment requires a %s", mechanism, mongoc_oidc_env_name(env), "TOKEN_RESOURCE"); goto fail; } } } // Defer remaining validation of `MongoCredential` fields to Authentication Handshake. } // Invalid or unsupported authentication mechanism. else { MONGOC_URI_ERROR( error, "Unsupported value for authMechanism '%s': must be one of " "['MONGODB-OIDC', 'SCRAM-SHA-1', 'SCRAM-SHA-256', 'PLAIN', 'MONGODB-X509', 'GSSAPI', 'MONGODB-AWS']", mechanism); goto fail; } ret = true; fail: bson_destroy(&mechanism_properties_owner); bson_free(mechanism); return ret; } static bool mongoc_uri_finalize_directconnection(mongoc_uri_t *uri, bson_error_t *error) { bool directconnection = false; directconnection = mongoc_uri_get_option_as_bool(uri, MONGOC_URI_DIRECTCONNECTION, false); if (!directconnection) { return true; } /* URI options spec: "The driver MUST report an error if the * directConnection=true URI option is specified with an SRV URI, because * the URI may resolve to multiple hosts. The driver MUST allow specifying * directConnection=false URI option with an SRV URI." */ if (uri->is_srv) { MONGOC_URI_ERROR(error, "%s", "SRV URI not allowed with directConnection option"); return false; } /* URI options spec: "The driver MUST report an error if the * directConnection=true URI option is specified with multiple seeds." */ if (uri->hosts && uri->hosts->next) { MONGOC_URI_ERROR(error, "%s", "Multiple seeds not allowed with directConnection option"); return false; } return true; } /** * @brief Parse the authority component of the URI string. This is the part following * "://" until the path or query * * @param uri The URI to be updated * @param authority The full authority string to be parsed */ static bool _parse_authority(mongoc_uri_t *uri, const mstr_view authority, bson_error_t *error) { // Split around "@" if there is a userinfo mstr_view userinfo, hostinfo; if (mstr_split_around(authority, AT, &userinfo, &hostinfo)) { // We have userinfo. Parse that first if (!_uri_parse_userinfo(uri, userinfo, error)) { // Fail to parse userinfo. Fail the full authority. return false; } // `hostinfo` now contains the authority part following the first "@" } else { // No userinfo. The hostinfo is the entire string hostinfo = authority; } // Don't allow the host list to start with "@" if (mstr_starts_with(hostinfo, AT)) { /* special case: "mongodb://alice@@localhost" */ MONGOC_URI_ERROR(error, "Invalid username or password. %s", escape_instructions); return false; } if (uri->is_srv) { // Parse as an SRV URI if (!_parse_srv_hostname(uri, hostinfo, error)) { return false; } } else { // Parse a comma-separated host list if (!_parse_hosts_csv(uri, hostinfo, error)) { return false; } } return true; } /** * @brief The elements of a decomposed URI string * * This isn't strictly conformant to any WWW spec, because our URI strings are weird, * but the URI components correspond to the same elements in a normal URL or URI * * Note: We do not include a URI fragment in our string parsing. */ typedef struct { /// The scheme of the URI, which precedes the "://" substring mstr_view scheme; /// The authority element, which includes the userinfo and the host specifier(s) mstr_view authority; /// The userinfo for the URI. If the URI has no userinfo, this is null mstr_view userinfo; /// The host specifier in the URI mstr_view hosts; /// The path string, including the leading "/" mstr_view path; /// The query string, including the leading "?" mstr_view query; } uri_parts; /** * @brief Decompose a URI string into its constituent components * * @param components Pointer to struct that receives each URI component * @param uri The URI string that is being inspected * @return true If the decomposition was successful * @return false Otherwise * * This does not allocate any memory or update an data related to `mongoc_uri_t`, * it is purely a parsing operation. The string views attached to `*components` * are views within the `uri` string. * * This function does not handle percent-encoding of elements. */ static bool _decompose_uri_string(uri_parts *parts, mstr_view const uri, bson_error_t *error) { BSON_ASSERT_PARAM(parts); // Clear out *parts = (uri_parts){{0}}; // Check that the URI string is valid UTF-8, otherwise we'll refuse to parse it if (!bson_utf8_validate(uri.data, uri.len, false /* allow_null */)) { MONGOC_URI_ERROR(error, "%s", "Invalid UTF-8 in URI"); return false; } // Trim down the string as we read from left to right mstr_view remain = uri; // * remain = "foo://bar@baz:1234/path?query" // Grab the scheme, which is the part preceding "://" if (!mstr_split_around(remain, mstr_cstring("://"), &parts->scheme, &remain)) { MONGOC_URI_ERROR(error, "%s", "Invalid URI, no scheme part specified"); return false; } // * remain = "bar@baz:1234/path?query" // Only ':' is permitted among RFC-3986 gen-delims (":/?#[]@") in userinfo. // However, continue supporting these characters for backward compatibility, as permitted by the Connection // String spec: for backwards-compatibility reasons, drivers MAY allow reserved characters other than "@" and // ":" to be present in user information without percent-encoding. // To handle this, we will start scanning for the authority terminator beginning // after a possible "@" symbol in the URI. If no "@" is present, we don't need to // do anything different. { size_t userinfo_end_pos = mstr_find(remain, AT); if (userinfo_end_pos == SIZE_MAX) { // There is no userinfo, so we don't need to do anything special userinfo_end_pos = 0; } // Find the position of the first character that terminates the authority element const size_t term_pos = mstr_find_first_of(remain, mstr_cstring("/?"), userinfo_end_pos); mstr_split_at(remain, term_pos, &parts->authority, &remain); // Now we should split the authority between the userinfo and the hosts { const size_t at_pos = mstr_find(parts->authority, AT); if (at_pos != SIZE_MAX) { // We have a userinfo component mstr_split_at(parts->authority, at_pos, 1, &parts->userinfo, &parts->hosts); } else { // We have no userinfo, so the authority string is just the host list parts->hosts = parts->authority; } } } // * remain = "/path?query" (Each following component is optional, but this is the proper order) const size_t path_end_pos = mstr_find_first_of(remain, mstr_cstring("?")); mstr_split_at(remain, path_end_pos, &parts->path, &remain); // * remain = "?query" parts->query = remain; return true; } /** * @brief Parse the given URI C string into the URI structure * * @param uri Pointer to an initialized empty URI object to be updated * @param str Pointer to a C string for the URI string itself * @return true If the parse operation is successful, and `*uri` is updated * @return false Otherwise, and `*uri` contents are unspecified */ static bool mongoc_uri_parse(mongoc_uri_t *uri, const char *str, bson_error_t *error) { BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(str); // Split the URI into its parts mstr_view remain = mstr_cstring(str); uri_parts parts; if (!_decompose_uri_string(&parts, remain, error)) { return false; } // Detect whether we are a "mongodb" or "mongodb+srv" URI if (mstr_cmp(parts.scheme, ==, mstr_cstring("mongodb"))) { uri->is_srv = false; } else if (mstr_cmp(parts.scheme, ==, mstr_cstring("mongodb+srv"))) { uri->is_srv = true; } else { MONGOC_URI_ERROR(error, "Invalid URI scheme \"%.*s://\". Expected one of \"mongodb://\" or \"mongodb+srv://\"", MSTR_FMT(parts.scheme)); return false; } // Handle the authority, including the userinfo and host specifier(s) if (!_parse_authority(uri, parts.authority, error)) { return false; } // If we have a path, parse that as the auth database if (!_parse_path(uri, parts.path, error)) { return false; } // If we have a query, parse that as the URI settings if (parts.query.len && !_mongoc_uri_apply_query_string(uri, mstr_substr(parts.query, 1), false /* from DNS */, error)) { return false; } return mongoc_uri_finalize(uri, error); } const mongoc_host_list_t * mongoc_uri_get_hosts(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return uri->hosts; } const char * mongoc_uri_get_replica_set(const mongoc_uri_t *uri) { bson_iter_t iter; BSON_ASSERT(uri); if (bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_REPLICASET) && BSON_ITER_HOLDS_UTF8(&iter)) { return bson_iter_utf8(&iter, NULL); } return NULL; } const bson_t * mongoc_uri_get_credentials(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return &uri->credentials; } const char * mongoc_uri_get_auth_mechanism(const mongoc_uri_t *uri) { bson_iter_t iter; BSON_ASSERT(uri); if (bson_iter_init_find_case(&iter, &uri->credentials, MONGOC_URI_AUTHMECHANISM) && BSON_ITER_HOLDS_UTF8(&iter)) { return bson_iter_utf8(&iter, NULL); } return NULL; } bool mongoc_uri_set_auth_mechanism(mongoc_uri_t *uri, const char *value) { size_t len; BSON_ASSERT(value); len = strlen(value); if (!bson_utf8_validate(value, len, false)) { return false; } _bson_upsert_utf8_icase(&uri->credentials, mstr_cstring(MONGOC_URI_AUTHMECHANISM), value); return true; } bool mongoc_uri_get_mechanism_properties(const mongoc_uri_t *uri, bson_t *properties /* OUT */) { bson_iter_t iter; BSON_ASSERT(uri); BSON_ASSERT(properties); if (bson_iter_init_find_case(&iter, &uri->credentials, MONGOC_URI_AUTHMECHANISMPROPERTIES) && BSON_ITER_HOLDS_DOCUMENT(&iter)) { uint32_t len = 0; const uint8_t *data = NULL; bson_iter_document(&iter, &len, &data); BSON_ASSERT(bson_init_static(properties, data, len)); return true; } return false; } bool mongoc_uri_set_mechanism_properties(mongoc_uri_t *uri, const bson_t *properties) { BSON_ASSERT(uri); BSON_ASSERT(properties); bson_t tmp = BSON_INITIALIZER; bsonBuildAppend(tmp, // Copy the existing credentials, dropping the existing properties if // present insert(uri->credentials, not(key(MONGOC_URI_AUTHMECHANISMPROPERTIES))), // Append the new properties kv(MONGOC_URI_AUTHMECHANISMPROPERTIES, bson(*properties))); bson_reinit(&uri->credentials); bsonBuildAppend(uri->credentials, insert(tmp, always)); bson_destroy(&tmp); return bsonBuildError == NULL; } static bool _mongoc_uri_assign_read_prefs_mode(mongoc_uri_t *uri, bson_error_t *error) { BSON_ASSERT(uri); mongoc_read_mode_t mode = 0; const char *pref = NULL; bsonParse(uri->options, find( // Find the 'readPreference' string iKeyWithType(MONGOC_URI_READPREFERENCE, utf8), case ( // Switch on the string content: when(iStrEqual("primary"), do(mode = MONGOC_READ_PRIMARY)), when(iStrEqual("primaryPreferred"), do(mode = MONGOC_READ_PRIMARY_PREFERRED)), when(iStrEqual("secondary"), do(mode = MONGOC_READ_SECONDARY)), when(iStrEqual("secondaryPreferred"), do(mode = MONGOC_READ_SECONDARY_PREFERRED)), when(iStrEqual("nearest"), do(mode = MONGOC_READ_NEAREST)), else(do({ pref = bsonAs(cstr); bsonParseError = "Unsupported readPreference value"; }))))); if (bsonParseError) { const char *prefix = "Error while assigning URI read preference"; if (pref) { MONGOC_URI_ERROR(error, "%s: %s [readPreference=%s]", prefix, bsonParseError, pref); } else { MONGOC_URI_ERROR(error, "%s: %s", prefix, bsonParseError); } return false; } if (mode != 0) { mongoc_read_prefs_set_mode(uri->read_prefs, mode); } return true; } static bool _mongoc_uri_build_write_concern(mongoc_uri_t *uri, bson_error_t *error) { mongoc_write_concern_t *write_concern; int64_t wtimeoutms; BSON_ASSERT(uri); write_concern = mongoc_write_concern_new(); uri->write_concern = write_concern; bsonParse( uri->options, find(iKeyWithType(MONGOC_URI_SAFE, boolean), do(mongoc_write_concern_set_w(write_concern, bsonAs(boolean) ? 1 : MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED)))); if (bsonParseError) { MONGOC_URI_ERROR(error, "Error while parsing 'safe' URI option: %s", bsonParseError); return false; } wtimeoutms = mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 0); if (wtimeoutms < 0) { MONGOC_URI_ERROR(error, "Unsupported wtimeoutMS value [w=%" PRId64 "]", wtimeoutms); return false; } else if (wtimeoutms > 0) { mongoc_write_concern_set_wtimeout_int64(write_concern, wtimeoutms); } bsonParse(uri->options, find(iKeyWithType(MONGOC_URI_JOURNAL, boolean), do(mongoc_write_concern_set_journal(write_concern, bsonAs(boolean))))); if (bsonParseError) { MONGOC_URI_ERROR(error, "Error while parsing 'journal' URI option: %s", bsonParseError); return false; } int w_int = INT_MAX; const char *w_str = NULL; bsonParse(uri->options, find(iKey("w"), // storeInt32(w_int), storeStrRef(w_str), case ( // Special W options: when(eq(int32, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED), // These conflict with journalling: if (eval(mongoc_write_concern_get_journal(write_concern)), then(error("Journal conflicts with w value"))), do(mongoc_write_concern_set_w(write_concern, bsonAs(int32)))), // Other positive 'w' value: when(allOf(type(int32), eval(bsonAs(int32) > 0)), do(mongoc_write_concern_set_w(write_concern, bsonAs(int32)))), // Special "majority" string: when(iStrEqual("majority"), do(mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_MAJORITY))), // Other string: when(type(utf8), do(mongoc_write_concern_set_wtag(write_concern, bsonAs(cstr)))), // Invalid value: else(error("Unsupported w value"))))); if (bsonParseError) { const char *const prefix = "Error while parsing the 'w' URI option"; if (w_str) { MONGOC_URI_ERROR(error, "%s: %s [w=%s]", prefix, bsonParseError, w_str); } else if (w_int != INT_MAX) { MONGOC_URI_ERROR(error, "%s: %s [w=%d]", prefix, bsonParseError, w_int); } else { MONGOC_URI_ERROR(error, "%s: %s", prefix, bsonParseError); } return false; } return true; } /* can't use mongoc_uri_get_option_as_int32, it treats 0 specially */ static int32_t _mongoc_uri_get_max_staleness_option(const mongoc_uri_t *uri) { const bson_t *options; bson_iter_t iter; int32_t retval = MONGOC_NO_MAX_STALENESS; if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, MONGOC_URI_MAXSTALENESSSECONDS) && BSON_ITER_HOLDS_INT32(&iter)) { retval = bson_iter_int32(&iter); if (retval == 0) { MONGOC_WARNING("Unsupported value for \"" MONGOC_URI_MAXSTALENESSSECONDS "\": \"%d\"", retval); retval = -1; } else if (retval < 0 && retval != -1) { MONGOC_WARNING("Unsupported value for \"" MONGOC_URI_MAXSTALENESSSECONDS "\": \"%d\"", retval); retval = MONGOC_NO_MAX_STALENESS; } } return retval; } mongoc_uri_t * mongoc_uri_new_with_error(const char *uri_string, bson_error_t *error) { mongoc_uri_t *uri; int32_t max_staleness_seconds; uri = BSON_ALIGNED_ALLOC0(mongoc_uri_t); bson_init(&uri->raw); bson_init(&uri->options); bson_init(&uri->credentials); bson_init(&uri->compressors); /* Initialize read_prefs, since parsing may add to it */ uri->read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); /* Initialize empty read_concern */ uri->read_concern = mongoc_read_concern_new(); if (!uri_string) { uri_string = "mongodb://127.0.0.1/"; } if (!mongoc_uri_parse(uri, uri_string, error)) { mongoc_uri_destroy(uri); return NULL; } uri->str = bson_strdup(uri_string); if (!_mongoc_uri_assign_read_prefs_mode(uri, error)) { mongoc_uri_destroy(uri); return NULL; } max_staleness_seconds = _mongoc_uri_get_max_staleness_option(uri); mongoc_read_prefs_set_max_staleness_seconds(uri->read_prefs, max_staleness_seconds); if (!mongoc_read_prefs_is_valid(uri->read_prefs)) { mongoc_uri_destroy(uri); MONGOC_URI_ERROR(error, "%s", "Invalid readPreferences"); return NULL; } if (!_mongoc_uri_build_write_concern(uri, error)) { mongoc_uri_destroy(uri); return NULL; } if (!mongoc_write_concern_is_valid(uri->write_concern)) { mongoc_uri_destroy(uri); MONGOC_URI_ERROR(error, "%s", "Invalid writeConcern"); return NULL; } return uri; } mongoc_uri_t * mongoc_uri_new(const char *uri_string) { bson_error_t error = {0}; mongoc_uri_t *uri; uri = mongoc_uri_new_with_error(uri_string, &error); if (error.domain) { MONGOC_WARNING("Error parsing URI: '%s'", error.message); } return uri; } mongoc_uri_t * mongoc_uri_new_for_host_port(const char *hostname, uint16_t port) { mongoc_uri_t *uri; char *str; BSON_ASSERT(hostname); BSON_ASSERT(port); str = bson_strdup_printf("mongodb://%s:%hu/", hostname, port); uri = mongoc_uri_new(str); bson_free(str); return uri; } const char * mongoc_uri_get_username(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return uri->username; } bool mongoc_uri_set_username(mongoc_uri_t *uri, const char *username) { size_t len; BSON_ASSERT(username); len = strlen(username); if (!bson_utf8_validate(username, len, false)) { return false; } if (uri->username) { bson_free(uri->username); } uri->username = bson_strdup(username); return true; } const char * mongoc_uri_get_password(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return uri->password; } bool mongoc_uri_set_password(mongoc_uri_t *uri, const char *password) { size_t len; BSON_ASSERT(password); len = strlen(password); if (!bson_utf8_validate(password, len, false)) { return false; } if (uri->password) { bson_free(uri->password); } uri->password = bson_strdup(password); return true; } const char * mongoc_uri_get_database(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return uri->database; } bool mongoc_uri_set_database(mongoc_uri_t *uri, const char *database) { size_t len; BSON_ASSERT(database); len = strlen(database); if (!bson_utf8_validate(database, len, false)) { return false; } if (uri->database) { bson_free(uri->database); } uri->database = bson_strdup(database); return true; } const char * mongoc_uri_get_auth_source(const mongoc_uri_t *uri) { BSON_ASSERT_PARAM(uri); // Explicitly set. { bson_iter_t iter; if (bson_iter_init_find_case(&iter, &uri->credentials, MONGOC_URI_AUTHSOURCE)) { return bson_iter_utf8(&iter, NULL); } } // The database name if supplied. const char *const db = uri->database; // Depending on the authentication mechanism, `MongoCredential.source` has different defaults. const char *const mechanism = mongoc_uri_get_auth_mechanism(uri); // Default authentication mechanism uses either SCRAM-SHA-1 or SCRAM-SHA-256. if (!mechanism) { return db ? db : "admin"; } // Defaults to the database name if supplied on the connection string or "admin" for: { static const char *const matches[] = { "SCRAM-SHA-1", "SCRAM-SHA-256", NULL, }; for (const char *const *match = matches; *match; ++match) { if (strcasecmp(mechanism, *match) == 0) { return db ? db : "admin"; } } } // Defaults to the database name if supplied on the connection string or "$external" for: // - PLAIN if (strcasecmp(mechanism, "PLAIN") == 0) { return db ? db : "$external"; } // Fallback to "$external" for all remaining authentication mechanisms: // - MONGODB-X509 // - GSSAPI // - MONGODB-AWS return "$external"; } bool mongoc_uri_set_auth_source(mongoc_uri_t *uri, const char *value) { size_t len; BSON_ASSERT(value); len = strlen(value); if (!bson_utf8_validate(value, len, false)) { return false; } _bson_upsert_utf8_icase(&uri->credentials, mstr_cstring(MONGOC_URI_AUTHSOURCE), value); return true; } const char * mongoc_uri_get_appname(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_APPNAME, NULL); } bool mongoc_uri_set_appname(mongoc_uri_t *uri, const char *value) { BSON_ASSERT(value); if (!bson_utf8_validate(value, strlen(value), false)) { return false; } if (!_mongoc_handshake_appname_is_valid(value)) { return false; } _bson_upsert_utf8_icase(&uri->options, mstr_cstring(MONGOC_URI_APPNAME), value); return true; } bool mongoc_uri_set_compressors(mongoc_uri_t *uri, const char *value) { bson_reinit(&uri->compressors); if (!value) { // Just clear the compressors return true; } if (!bson_utf8_validate(value, strlen(value), false)) { // Invalid UTF-8 in the string return false; } for (mstr_view remain = mstr_cstring(value); remain.len;) { mstr_view entry; mstr_split_around(remain, COMMA, &entry, &remain); if (mongoc_compressor_supported(entry)) { _bson_upsert_utf8_icase(&uri->compressors, entry, "yes"); } else { MONGOC_WARNING("Unsupported compressor: '%.*s'", MSTR_FMT(entry)); } } return true; } const bson_t * mongoc_uri_get_compressors(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return &uri->compressors; } /* can't use mongoc_uri_get_option_as_int32, it treats 0 specially */ int32_t mongoc_uri_get_local_threshold_option(const mongoc_uri_t *uri) { const bson_t *options; bson_iter_t iter; int32_t retval = MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS; if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, "localthresholdms") && BSON_ITER_HOLDS_INT32(&iter)) { retval = bson_iter_int32(&iter); if (retval < 0) { MONGOC_WARNING("Invalid localThresholdMS: %d", retval); retval = MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS; } } return retval; } const char * mongoc_uri_get_srv_hostname(const mongoc_uri_t *uri) { if (uri->is_srv) { return uri->srv; } return NULL; } /* Initial DNS Seedlist Discovery Spec: `srvServiceName` requires a string value * and defaults to "mongodb". */ static const char *const mongoc_default_srv_service_name = "mongodb"; const char * mongoc_uri_get_srv_service_name(const mongoc_uri_t *uri) { bson_iter_t iter; BSON_ASSERT_PARAM(uri); if (bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_SRVSERVICENAME)) { BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); return bson_iter_utf8(&iter, NULL); } return mongoc_default_srv_service_name; } const bson_t * mongoc_uri_get_options(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return &uri->options; } void mongoc_uri_destroy(mongoc_uri_t *uri) { if (uri) { _mongoc_host_list_destroy_all(uri->hosts); bson_free(uri->str); bson_free(uri->database); bson_free(uri->username); bson_destroy(&uri->raw); bson_destroy(&uri->options); bson_destroy(&uri->credentials); bson_destroy(&uri->compressors); mongoc_read_prefs_destroy(uri->read_prefs); mongoc_read_concern_destroy(uri->read_concern); mongoc_write_concern_destroy(uri->write_concern); if (uri->password) { bson_zero_free(uri->password, strlen(uri->password)); } bson_free(uri); } } mongoc_uri_t * mongoc_uri_copy(const mongoc_uri_t *uri) { mongoc_uri_t *copy; mongoc_host_list_t *iter; bson_error_t error; BSON_ASSERT(uri); copy = BSON_ALIGNED_ALLOC0(mongoc_uri_t); copy->str = bson_strdup(uri->str); copy->is_srv = uri->is_srv; bson_strncpy(copy->srv, uri->srv, sizeof uri->srv); copy->username = bson_strdup(uri->username); copy->password = bson_strdup(uri->password); copy->database = bson_strdup(uri->database); copy->read_prefs = mongoc_read_prefs_copy(uri->read_prefs); copy->read_concern = mongoc_read_concern_copy(uri->read_concern); copy->write_concern = mongoc_write_concern_copy(uri->write_concern); LL_FOREACH(uri->hosts, iter) { if (!mongoc_uri_upsert_host(copy, iter->host, iter->port, &error)) { MONGOC_ERROR("%s", error.message); mongoc_uri_destroy(copy); return NULL; } } bson_copy_to(&uri->raw, ©->raw); bson_copy_to(&uri->options, ©->options); bson_copy_to(&uri->credentials, ©->credentials); bson_copy_to(&uri->compressors, ©->compressors); return copy; } const char * mongoc_uri_get_string(const mongoc_uri_t *uri) { BSON_ASSERT(uri); return uri->str; } char * mongoc_uri_unescape(const char *escaped_string) { bson_error_t error; char *r = _strdup_pct_decode(mstr_cstring(escaped_string), &error); if (!r) { MONGOC_WARNING("%s(): Invalid %% escape sequence: %s", BSON_FUNC, error.message); } return r; } const mongoc_read_prefs_t * mongoc_uri_get_read_prefs_t(const mongoc_uri_t *uri) /* IN */ { BSON_ASSERT(uri); return uri->read_prefs; } void mongoc_uri_set_read_prefs_t(mongoc_uri_t *uri, const mongoc_read_prefs_t *prefs) { BSON_ASSERT(uri); BSON_ASSERT(prefs); mongoc_read_prefs_destroy(uri->read_prefs); uri->read_prefs = mongoc_read_prefs_copy(prefs); } const mongoc_read_concern_t * mongoc_uri_get_read_concern(const mongoc_uri_t *uri) /* IN */ { BSON_ASSERT(uri); return uri->read_concern; } void mongoc_uri_set_read_concern(mongoc_uri_t *uri, const mongoc_read_concern_t *rc) { BSON_ASSERT(uri); BSON_ASSERT(rc); mongoc_read_concern_destroy(uri->read_concern); uri->read_concern = mongoc_read_concern_copy(rc); } const mongoc_write_concern_t * mongoc_uri_get_write_concern(const mongoc_uri_t *uri) /* IN */ { BSON_ASSERT(uri); return uri->write_concern; } void mongoc_uri_set_write_concern(mongoc_uri_t *uri, const mongoc_write_concern_t *wc) { BSON_ASSERT(uri); BSON_ASSERT(wc); mongoc_write_concern_destroy(uri->write_concern); uri->write_concern = mongoc_write_concern_copy(wc); } bool mongoc_uri_get_tls(const mongoc_uri_t *uri) /* IN */ { bson_iter_t iter; BSON_ASSERT(uri); if (bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLS) && BSON_ITER_HOLDS_BOOL(&iter)) { return bson_iter_bool(&iter); } if (bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSCERTIFICATEKEYFILE) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSCAFILE) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSINSECURE) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK) || bson_iter_init_find_case(&iter, &uri->options, MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK)) { return true; } return false; } const char * mongoc_uri_get_server_monitoring_mode(const mongoc_uri_t *uri) { BSON_ASSERT_PARAM(uri); return mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SERVERMONITORINGMODE, "auto"); } bool mongoc_uri_set_server_monitoring_mode(mongoc_uri_t *uri, const char *value) { BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(value); // Check for valid value if (strcmp(value, "stream") && strcmp(value, "poll") && strcmp(value, "auto")) { return false; } _bson_upsert_utf8_icase(&uri->options, mstr_cstring(MONGOC_URI_SERVERMONITORINGMODE), value); return true; } /* *-------------------------------------------------------------------------- * * mongoc_uri_get_option_as_int32 -- * * Checks if the URI 'option' is set and of correct type (int32). * The special value '0' is considered as "unset". * This is so users can provide * sprintf("mongodb://localhost/?option=%d", myvalue) style connection * strings, and still apply default values. * * If not set, or set to invalid type, 'fallback' is returned. * * NOTE: 'option' is case*in*sensitive. * * Returns: * The value of 'option' if available as int32 (and not 0), or * 'fallback'. * *-------------------------------------------------------------------------- */ int32_t mongoc_uri_get_option_as_int32(const mongoc_uri_t *uri, const char *option_orig, int32_t fallback) { const char *option; const bson_t *options; bson_iter_t iter; int64_t retval = 0; option = mongoc_uri_canonicalize_option(option_orig); /* BC layer to allow retrieving 32-bit values stored in 64-bit options */ if (mongoc_uri_option_is_int64(option_orig)) { retval = mongoc_uri_get_option_as_int64(uri, option_orig, 0); if (retval > INT32_MAX || retval < INT32_MIN) { MONGOC_WARNING("Cannot read 64-bit value for \"%s\": %" PRId64, option_orig, retval); retval = 0; } } else if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option) && BSON_ITER_HOLDS_INT32(&iter)) { retval = bson_iter_int32(&iter); } if (!retval) { retval = fallback; } return (int32_t)retval; } /* *-------------------------------------------------------------------------- * * mongoc_uri_set_option_as_int32 -- * * Sets a URI option 'after the fact'. Allows users to set individual * URI options without passing them as a connection string. * * Only allows a set of known options to be set. * @see mongoc_uri_option_is_int32 (). * * Does in-place-update of the option BSON if 'option' is already set. * Appends the option to the end otherwise. * * NOTE: If 'option' is already set, and is of invalid type, this * function will return false. * * NOTE: 'option' is case*in*sensitive. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ bool mongoc_uri_set_option_as_int32(mongoc_uri_t *uri, const char *option_orig, int32_t value) { const char *option; bson_error_t error; bool r; if (mongoc_uri_option_is_int64(option_orig)) { return mongoc_uri_set_option_as_int64(uri, option_orig, value); } option = mongoc_uri_canonicalize_option(option_orig); if (!mongoc_uri_option_is_int32(option)) { MONGOC_WARNING("Unsupported value for \"%s\": %d, \"%s\" is not an int32 option", option_orig, value, option); return false; } r = _mongoc_uri_set_option_as_int32_with_error(uri, option, value, &error); if (!r) { MONGOC_WARNING("%s", error.message); } return r; } /* *-------------------------------------------------------------------------- * * _mongoc_uri_set_option_as_int32_with_error -- * * Same as mongoc_uri_set_option_as_int32, with error reporting. * * Precondition: * mongoc_uri_option_is_int32(option) must be true. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_uri_set_option_as_int32_with_error(mongoc_uri_t *uri, const char *option_orig, int32_t value, bson_error_t *error) { const char *option; const bson_t *options; bson_iter_t iter; char *option_lowercase = NULL; option = mongoc_uri_canonicalize_option(option_orig); /* Server Discovery and Monitoring Spec: "the driver MUST NOT permit users * to configure it less than minHeartbeatFrequencyMS (500ms)." */ if (!bson_strcasecmp(option, MONGOC_URI_HEARTBEATFREQUENCYMS) && value < MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS) { MONGOC_URI_ERROR(error, "Invalid \"%s\" of %d: must be at least %d", option_orig, value, MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS); return false; } /* zlib levels are from -1 (default) through 9 (best compression) */ if (!bson_strcasecmp(option, MONGOC_URI_ZLIBCOMPRESSIONLEVEL) && (value < -1 || value > 9)) { MONGOC_URI_ERROR(error, "Invalid \"%s\" of %d: must be between -1 and 9", option_orig, value); return false; } if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option)) { if (BSON_ITER_HOLDS_INT32(&iter)) { bson_iter_overwrite_int32(&iter, value); return true; } else { MONGOC_URI_ERROR(error, "Cannot set URI option \"%s\" to %d, it already has " "a non-32-bit integer value", option, value); return false; } } option_lowercase = lowercase_str_new(option); if (!bson_append_int32(&uri->options, option_lowercase, -1, value)) { bson_free(option_lowercase); MONGOC_URI_ERROR(error, "Failed to set URI option \"%s\" to %d", option_orig, value); return false; } bson_free(option_lowercase); return true; } /* *-------------------------------------------------------------------------- * * _mongoc_uri_set_option_as_int32 -- * * Same as mongoc_uri_set_option_as_int32, except the option is not * validated against valid int32 options * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_uri_set_option_as_int32(mongoc_uri_t *uri, const char *option_orig, int32_t value) { const char *option; const bson_t *options; bson_iter_t iter; char *option_lowercase = NULL; option = mongoc_uri_canonicalize_option(option_orig); if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option)) { if (BSON_ITER_HOLDS_INT32(&iter)) { bson_iter_overwrite_int32(&iter, value); return true; } else { return false; } } option_lowercase = lowercase_str_new(option); bson_append_int32(&uri->options, option_lowercase, -1, value); bson_free(option_lowercase); return true; } /* *-------------------------------------------------------------------------- * * mongoc_uri_get_option_as_int64 -- * * Checks if the URI 'option' is set and of correct type (int32 or * int64). * The special value '0' is considered as "unset". * This is so users can provide * sprintf("mongodb://localhost/?option=%" PRId64, myvalue) style * connection strings, and still apply default values. * * If not set, or set to invalid type, 'fallback' is returned. * * NOTE: 'option' is case*in*sensitive. * * Returns: * The value of 'option' if available as int64 or int32 (and not 0), or * 'fallback'. * *-------------------------------------------------------------------------- */ int64_t mongoc_uri_get_option_as_int64(const mongoc_uri_t *uri, const char *option_orig, int64_t fallback) { const char *option; const bson_t *options; bson_iter_t iter; int64_t retval = fallback; option = mongoc_uri_canonicalize_option(option_orig); if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option)) { if (BSON_ITER_HOLDS_INT(&iter)) { if (!(retval = bson_iter_as_int64(&iter))) { retval = fallback; } } } return retval; } /* *-------------------------------------------------------------------------- * * mongoc_uri_set_option_as_int64 -- * * Sets a URI option 'after the fact'. Allows users to set individual * URI options without passing them as a connection string. * * Only allows a set of known options to be set. * @see mongoc_uri_option_is_int64 (). * * Does in-place-update of the option BSON if 'option' is already set. * Appends the option to the end otherwise. * * NOTE: If 'option' is already set, and is of invalid type, this * function will return false. * * NOTE: 'option' is case*in*sensitive. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ bool mongoc_uri_set_option_as_int64(mongoc_uri_t *uri, const char *option_orig, int64_t value) { const char *option; bson_error_t error; bool r; option = mongoc_uri_canonicalize_option(option_orig); if (!mongoc_uri_option_is_int64(option)) { if (mongoc_uri_option_is_int32(option_orig)) { if (value >= INT32_MIN && value <= INT32_MAX) { MONGOC_WARNING("Setting value for 32-bit option \"%s\" through 64-bit method", option_orig); return mongoc_uri_set_option_as_int32(uri, option_orig, (int32_t)value); } MONGOC_WARNING( "Unsupported value for \"%s\": %" PRId64 ", \"%s\" is not an int64 option", option_orig, value, option); return false; } } r = _mongoc_uri_set_option_as_int64_with_error(uri, option, value, &error); if (!r) { MONGOC_WARNING("%s", error.message); } return r; } /* *-------------------------------------------------------------------------- * * _mongoc_uri_set_option_as_int64_with_error -- * * Same as mongoc_uri_set_option_as_int64, with error reporting. * * Precondition: * mongoc_uri_option_is_int64(option) must be true. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ static bool _mongoc_uri_set_option_as_int64_with_error(mongoc_uri_t *uri, const char *option_orig, int64_t value, bson_error_t *error) { const char *option; const bson_t *options; bson_iter_t iter; char *option_lowercase = NULL; option = mongoc_uri_canonicalize_option(option_orig); if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option)) { if (BSON_ITER_HOLDS_INT64(&iter)) { bson_iter_overwrite_int64(&iter, value); return true; } else { MONGOC_URI_ERROR(error, "Cannot set URI option \"%s\" to %" PRId64 ", it already has " "a non-64-bit integer value", option, value); return false; } } option_lowercase = lowercase_str_new(option); if (!bson_append_int64(&uri->options, option_lowercase, -1, value)) { bson_free(option_lowercase); MONGOC_URI_ERROR(error, "Failed to set URI option \"%s\" to %" PRId64, option_orig, value); return false; } bson_free(option_lowercase); return true; } /* *-------------------------------------------------------------------------- * * mongoc_uri_get_option_as_bool -- * * Checks if the URI 'option' is set and of correct type (bool). * * If not set, or set to invalid type, 'fallback' is returned. * * NOTE: 'option' is case*in*sensitive. * * Returns: * The value of 'option' if available as bool, or 'fallback'. * *-------------------------------------------------------------------------- */ bool mongoc_uri_get_option_as_bool(const mongoc_uri_t *uri, const char *option_orig, bool fallback) { const char *option; const bson_t *options; bson_iter_t iter; option = mongoc_uri_canonicalize_option(option_orig); if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option) && BSON_ITER_HOLDS_BOOL(&iter)) { return bson_iter_bool(&iter); } return fallback; } /* *-------------------------------------------------------------------------- * * mongoc_uri_set_option_as_bool -- * * Sets a URI option 'after the fact'. Allows users to set individual * URI options without passing them as a connection string. * * Only allows a set of known options to be set. * @see mongoc_uri_option_is_bool (). * * Does in-place-update of the option BSON if 'option' is already set. * Appends the option to the end otherwise. * * NOTE: If 'option' is already set, and is of invalid type, this * function will return false. * * NOTE: 'option' is case*in*sensitive. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ bool mongoc_uri_set_option_as_bool(mongoc_uri_t *uri, const char *option_orig, bool value) { const char *option; char *option_lowercase; const bson_t *options; bson_iter_t iter; option = mongoc_uri_canonicalize_option(option_orig); BSON_ASSERT(option); if (!mongoc_uri_option_is_bool(option)) { return false; } if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option)) { if (BSON_ITER_HOLDS_BOOL(&iter)) { bson_iter_overwrite_bool(&iter, value); return true; } else { return false; } } option_lowercase = lowercase_str_new(option); bson_append_bool(&uri->options, option_lowercase, -1, value); bson_free(option_lowercase); return true; } /* *-------------------------------------------------------------------------- * * mongoc_uri_get_option_as_utf8 -- * * Checks if the URI 'option' is set and of correct type (utf8). * * If not set, or set to invalid type, 'fallback' is returned. * * NOTE: 'option' is case*in*sensitive. * * Returns: * The value of 'option' if available as utf8, or 'fallback'. * *-------------------------------------------------------------------------- */ const char * mongoc_uri_get_option_as_utf8(const mongoc_uri_t *uri, const char *option_orig, const char *fallback) { const char *option; const bson_t *options; bson_iter_t iter; option = mongoc_uri_canonicalize_option(option_orig); if ((options = mongoc_uri_get_options(uri)) && bson_iter_init_find_case(&iter, options, option) && BSON_ITER_HOLDS_UTF8(&iter)) { return bson_iter_utf8(&iter, NULL); } return fallback; } /* *-------------------------------------------------------------------------- * * mongoc_uri_set_option_as_utf8 -- * * Sets a URI option 'after the fact'. Allows users to set individual * URI options without passing them as a connection string. * * Only allows a set of known options to be set. * @see mongoc_uri_option_is_utf8 (). * * If the option is not already set, this function will append it to *the end of the options bson. NOTE: If the option is already set the entire *options bson will be overwritten, containing the new option=value *(at the same position). * * NOTE: If 'option' is already set, and is of invalid type, this * function will return false. * * NOTE: 'option' must be valid utf8. * * NOTE: 'option' is case*in*sensitive. * * Returns: * true on successfully setting the option, false on failure. * *-------------------------------------------------------------------------- */ bool mongoc_uri_set_option_as_utf8(mongoc_uri_t *uri, const char *option_orig, const char *value) { const char *option; size_t len; option = mongoc_uri_canonicalize_option(option_orig); BSON_ASSERT(option); len = strlen(value); if (!bson_utf8_validate(value, len, false)) { return false; } if (!mongoc_uri_option_is_utf8(option)) { return false; } if (!bson_strcasecmp(option, MONGOC_URI_APPNAME)) { return mongoc_uri_set_appname(uri, value); } else if (!bson_strcasecmp(option, MONGOC_URI_SERVERMONITORINGMODE)) { return mongoc_uri_set_server_monitoring_mode(uri, value); } else { _bson_upsert_utf8_icase(&uri->options, mstr_cstring(option), value); } return true; } /* *-------------------------------------------------------------------------- * * _mongoc_uri_requires_auth_negotiation -- * * Returns true if auth mechanism is necessary for this uri. According * to the auth spec: "If an application provides a username but does * not provide an authentication mechanism, drivers MUST negotiate a * mechanism". * * Returns: * true if the driver should negotiate the auth mechanism for the uri * *-------------------------------------------------------------------------- */ bool _mongoc_uri_requires_auth_negotiation(const mongoc_uri_t *uri) { return mongoc_uri_get_username(uri) && !mongoc_uri_get_auth_mechanism(uri); } /* A bit of a hack. Needed for multi mongos tests to create a URI with the same * auth, SSL, and compressors settings but with only one specific host. */ mongoc_uri_t * _mongoc_uri_copy_and_replace_host_list(const mongoc_uri_t *original, const char *host) { mongoc_uri_t *uri = mongoc_uri_copy(original); _mongoc_host_list_destroy_all(uri->hosts); uri->hosts = bson_malloc0(sizeof(mongoc_host_list_t)); _mongoc_host_list_from_string(uri->hosts, host); return uri; } bool mongoc_uri_init_with_srv_host_list(mongoc_uri_t *uri, mongoc_host_list_t *host_list, bson_error_t *error) { mongoc_host_list_t *host; BSON_ASSERT(uri->is_srv); BSON_ASSERT(!uri->hosts); LL_FOREACH(host_list, host) { if (!mongoc_uri_upsert_host_and_port(uri, host->host_and_port, error)) { return false; } } return true; } #ifdef MONGOC_ENABLE_CRYPTO void _mongoc_uri_init_scram(const mongoc_uri_t *uri, mongoc_scram_t *scram, mongoc_crypto_hash_algorithm_t algo) { BSON_ASSERT(uri); BSON_ASSERT(scram); _mongoc_scram_init(scram, algo); _mongoc_scram_set_pass(scram, mongoc_uri_get_password(uri)); _mongoc_scram_set_user(scram, mongoc_uri_get_username(uri)); } #endif static bool mongoc_uri_finalize_loadbalanced(const mongoc_uri_t *uri, bson_error_t *error) { if (!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_LOADBALANCED, false)) { return true; } /* Load Balancer Spec: When `loadBalanced=true` is provided in the connection * string, the driver MUST throw an exception if the connection string * contains more than one host/port. */ if (uri->hosts && uri->hosts->next) { MONGOC_URI_ERROR(error, "URI with \"%s\" enabled must not contain more than one host", MONGOC_URI_LOADBALANCED); return false; } if (mongoc_uri_has_option(uri, MONGOC_URI_REPLICASET)) { MONGOC_URI_ERROR(error, "URI with \"%s\" enabled must not contain option \"%s\"", MONGOC_URI_LOADBALANCED, MONGOC_URI_REPLICASET); return false; } if (mongoc_uri_has_option(uri, MONGOC_URI_DIRECTCONNECTION) && mongoc_uri_get_option_as_bool(uri, MONGOC_URI_DIRECTCONNECTION, false)) { MONGOC_URI_ERROR(error, "URI with \"%s\" enabled must not contain option \"%s\" enabled", MONGOC_URI_LOADBALANCED, MONGOC_URI_DIRECTCONNECTION); return false; } return true; } static bool mongoc_uri_finalize_srv(const mongoc_uri_t *uri, bson_error_t *error) { /* Initial DNS Seedlist Discovery Spec: The driver MUST report an error if * either the `srvServiceName` or `srvMaxHosts` URI options are specified * with a non-SRV URI. */ if (!uri->is_srv) { const char *option = NULL; if (mongoc_uri_has_option(uri, MONGOC_URI_SRVSERVICENAME)) { option = MONGOC_URI_SRVSERVICENAME; } else if (mongoc_uri_has_option(uri, MONGOC_URI_SRVMAXHOSTS)) { option = MONGOC_URI_SRVMAXHOSTS; } if (option) { MONGOC_URI_ERROR(error, "%s must not be specified with a non-SRV URI", option); return false; } } if (uri->is_srv) { const int32_t max_hosts = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SRVMAXHOSTS, 0); /* Initial DNS Seedless Discovery Spec: This option requires a * non-negative integer and defaults to zero (i.e. no limit). */ if (max_hosts < 0) { MONGOC_URI_ERROR(error, "%s is required to be a non-negative integer, but " "has value %" PRId32, MONGOC_URI_SRVMAXHOSTS, max_hosts); return false; } if (max_hosts > 0) { /* Initial DNS Seedless Discovery spec: If srvMaxHosts is a positive * integer, the driver MUST throw an error if the connection string * contains a `replicaSet` option. */ if (mongoc_uri_has_option(uri, MONGOC_URI_REPLICASET)) { MONGOC_URI_ERROR(error, "%s must not be specified with %s", MONGOC_URI_SRVMAXHOSTS, MONGOC_URI_REPLICASET); return false; } /* Initial DNS Seedless Discovery Spec: If srvMaxHosts is a positive * integer, the driver MUST throw an error if the connection string * contains a `loadBalanced` option with a value of `true`. */ if (mongoc_uri_get_option_as_bool(uri, MONGOC_URI_LOADBALANCED, false)) { MONGOC_URI_ERROR( error, "%s must not be specified with %s=true", MONGOC_URI_SRVMAXHOSTS, MONGOC_URI_LOADBALANCED); return false; } } } return true; } /* This should be called whenever URI options change (e.g. parsing a new URI * string, after setting one or more options explicitly, applying TXT records). * While the primary purpose of this function is to validate the URI, it may * also alter the URI (e.g. implicitly enable TLS when SRV is used). Returns * true on success; otherwise, returns false and sets @error. */ bool mongoc_uri_finalize(mongoc_uri_t *uri, bson_error_t *error) { BSON_ASSERT_PARAM(uri); if (!mongoc_uri_finalize_tls(uri, error)) { return false; } if (!mongoc_uri_finalize_auth(uri, error)) { return false; } if (!mongoc_uri_finalize_directconnection(uri, error)) { return false; } if (!mongoc_uri_finalize_loadbalanced(uri, error)) { return false; } if (!mongoc_uri_finalize_srv(uri, error)) { return false; } return true; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-uri.h000066400000000000000000000206121511661753600234210ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_URI_H #define MONGOC_URI_H #include #include #include #include #include #include #include #ifndef MONGOC_DEFAULT_PORT #define MONGOC_DEFAULT_PORT 27017 #endif #define MONGOC_URI_APPNAME "appname" #define MONGOC_URI_AUTHMECHANISM "authmechanism" #define MONGOC_URI_AUTHMECHANISMPROPERTIES "authmechanismproperties" #define MONGOC_URI_AUTHSOURCE "authsource" #define MONGOC_URI_CANONICALIZEHOSTNAME "canonicalizehostname" #define MONGOC_URI_CONNECTTIMEOUTMS "connecttimeoutms" #define MONGOC_URI_COMPRESSORS "compressors" #define MONGOC_URI_DIRECTCONNECTION "directconnection" #define MONGOC_URI_GSSAPISERVICENAME "gssapiservicename" #define MONGOC_URI_HEARTBEATFREQUENCYMS "heartbeatfrequencyms" #define MONGOC_URI_JOURNAL "journal" #define MONGOC_URI_LOADBALANCED "loadbalanced" #define MONGOC_URI_LOCALTHRESHOLDMS "localthresholdms" #define MONGOC_URI_MAXPOOLSIZE "maxpoolsize" #define MONGOC_URI_MAXSTALENESSSECONDS "maxstalenessseconds" #define MONGOC_URI_READCONCERNLEVEL "readconcernlevel" #define MONGOC_URI_READPREFERENCE "readpreference" #define MONGOC_URI_READPREFERENCETAGS "readpreferencetags" #define MONGOC_URI_REPLICASET "replicaset" #define MONGOC_URI_RETRYREADS "retryreads" #define MONGOC_URI_RETRYWRITES "retrywrites" #define MONGOC_URI_SAFE "safe" #define MONGOC_URI_SERVERMONITORINGMODE "servermonitoringmode" #define MONGOC_URI_SERVERSELECTIONTIMEOUTMS "serverselectiontimeoutms" #define MONGOC_URI_SERVERSELECTIONTRYONCE "serverselectiontryonce" #define MONGOC_URI_SOCKETCHECKINTERVALMS "socketcheckintervalms" #define MONGOC_URI_SOCKETTIMEOUTMS "sockettimeoutms" #define MONGOC_URI_SRVSERVICENAME "srvservicename" #define MONGOC_URI_SRVMAXHOSTS "srvmaxhosts" #define MONGOC_URI_TLS "tls" #define MONGOC_URI_TLSCERTIFICATEKEYFILE "tlscertificatekeyfile" #define MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD "tlscertificatekeyfilepassword" #define MONGOC_URI_TLSCAFILE "tlscafile" #define MONGOC_URI_TLSALLOWINVALIDCERTIFICATES "tlsallowinvalidcertificates" #define MONGOC_URI_TLSALLOWINVALIDHOSTNAMES "tlsallowinvalidhostnames" #define MONGOC_URI_TLSINSECURE "tlsinsecure" #define MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK "tlsdisablecertificaterevocationcheck" #define MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK "tlsdisableocspendpointcheck" #define MONGOC_URI_W "w" #define MONGOC_URI_WAITQUEUETIMEOUTMS "waitqueuetimeoutms" #define MONGOC_URI_WTIMEOUTMS "wtimeoutms" #define MONGOC_URI_ZLIBCOMPRESSIONLEVEL "zlibcompressionlevel" /* Deprecated in MongoDB 4.2, use "tls" variants instead. */ #define MONGOC_URI_SSL "ssl" #define MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE "sslclientcertificatekeyfile" #define MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD "sslclientcertificatekeypassword" #define MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE "sslcertificateauthorityfile" #define MONGOC_URI_SSLALLOWINVALIDCERTIFICATES "sslallowinvalidcertificates" #define MONGOC_URI_SSLALLOWINVALIDHOSTNAMES "sslallowinvalidhostnames" BSON_BEGIN_DECLS typedef struct _mongoc_uri_t mongoc_uri_t; MONGOC_EXPORT(mongoc_uri_t *) mongoc_uri_copy(const mongoc_uri_t *uri) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_uri_destroy(mongoc_uri_t *uri); MONGOC_EXPORT(mongoc_uri_t *) mongoc_uri_new(const char *uri_string) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_uri_t *) mongoc_uri_new_with_error(const char *uri_string, bson_error_t *error) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_uri_t *) mongoc_uri_new_for_host_port(const char *hostname, uint16_t port) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(const mongoc_host_list_t *) mongoc_uri_get_hosts(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_srv_hostname(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_srv_service_name(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_database(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_database(mongoc_uri_t *uri, const char *database); MONGOC_EXPORT(const bson_t *) mongoc_uri_get_compressors(const mongoc_uri_t *uri); MONGOC_EXPORT(const bson_t *) mongoc_uri_get_options(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_password(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_password(mongoc_uri_t *uri, const char *password); MONGOC_EXPORT(bool) mongoc_uri_has_option(const mongoc_uri_t *uri, const char *key); MONGOC_EXPORT(bool) mongoc_uri_option_is_int32(const char *key); MONGOC_EXPORT(bool) mongoc_uri_option_is_int64(const char *key); MONGOC_EXPORT(bool) mongoc_uri_option_is_bool(const char *key); MONGOC_EXPORT(bool) mongoc_uri_option_is_utf8(const char *key); MONGOC_EXPORT(int32_t) mongoc_uri_get_option_as_int32(const mongoc_uri_t *uri, const char *option, int32_t fallback); MONGOC_EXPORT(int64_t) mongoc_uri_get_option_as_int64(const mongoc_uri_t *uri, const char *option, int64_t fallback); MONGOC_EXPORT(bool) mongoc_uri_get_option_as_bool(const mongoc_uri_t *uri, const char *option, bool fallback); MONGOC_EXPORT(const char *) mongoc_uri_get_option_as_utf8(const mongoc_uri_t *uri, const char *option, const char *fallback); MONGOC_EXPORT(bool) mongoc_uri_set_option_as_int32(mongoc_uri_t *uri, const char *option, int32_t value); MONGOC_EXPORT(bool) mongoc_uri_set_option_as_int64(mongoc_uri_t *uri, const char *option, int64_t value); MONGOC_EXPORT(bool) mongoc_uri_set_option_as_bool(mongoc_uri_t *uri, const char *option, bool value); MONGOC_EXPORT(bool) mongoc_uri_set_option_as_utf8(mongoc_uri_t *uri, const char *option, const char *value); MONGOC_EXPORT(const char *) mongoc_uri_get_replica_set(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_string(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_username(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_username(mongoc_uri_t *uri, const char *username); MONGOC_EXPORT(const bson_t *) mongoc_uri_get_credentials(const mongoc_uri_t *uri); MONGOC_EXPORT(const char *) mongoc_uri_get_auth_source(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_auth_source(mongoc_uri_t *uri, const char *value); MONGOC_EXPORT(const char *) mongoc_uri_get_appname(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_appname(mongoc_uri_t *uri, const char *value); MONGOC_EXPORT(bool) mongoc_uri_set_compressors(mongoc_uri_t *uri, const char *value); MONGOC_EXPORT(const char *) mongoc_uri_get_auth_mechanism(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_auth_mechanism(mongoc_uri_t *uri, const char *value); MONGOC_EXPORT(bool) mongoc_uri_get_mechanism_properties(const mongoc_uri_t *uri, bson_t *properties); MONGOC_EXPORT(bool) mongoc_uri_set_mechanism_properties(mongoc_uri_t *uri, const bson_t *properties); MONGOC_EXPORT(bool) mongoc_uri_get_tls(const mongoc_uri_t *uri); MONGOC_EXPORT(char *) mongoc_uri_unescape(const char *escaped_string) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(const mongoc_read_prefs_t *) mongoc_uri_get_read_prefs_t(const mongoc_uri_t *uri); MONGOC_EXPORT(void) mongoc_uri_set_read_prefs_t(mongoc_uri_t *uri, const mongoc_read_prefs_t *prefs); MONGOC_EXPORT(const mongoc_write_concern_t *) mongoc_uri_get_write_concern(const mongoc_uri_t *uri); MONGOC_EXPORT(void) mongoc_uri_set_write_concern(mongoc_uri_t *uri, const mongoc_write_concern_t *wc); MONGOC_EXPORT(const mongoc_read_concern_t *) mongoc_uri_get_read_concern(const mongoc_uri_t *uri); MONGOC_EXPORT(void) mongoc_uri_set_read_concern(mongoc_uri_t *uri, const mongoc_read_concern_t *rc); MONGOC_EXPORT(const char *) mongoc_uri_get_server_monitoring_mode(const mongoc_uri_t *uri); MONGOC_EXPORT(bool) mongoc_uri_set_server_monitoring_mode(mongoc_uri_t *uri, const char *value); BSON_END_DECLS #endif /* MONGOC_URI_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-util-private.h000066400000000000000000000200671511661753600252530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_UTIL_PRIVATE_H #define MONGOC_UTIL_PRIVATE_H #include // IWYU pragma: export // #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif #include /* string comparison functions for Windows */ #ifdef _WIN32 #define strcasecmp _stricmp #define strncasecmp _strnicmp #endif #ifndef _WIN32 #define MONGOC_PRINTF_FORMAT(a, b) __attribute__((format(__printf__, a, b))) #else #define MONGOC_PRINTF_FORMAT(a, b) /* no-op */ #endif #define COALESCE(x, y) ((x == 0) ? (y) : (x)) /* Helper macros for stringifying things */ #define MONGOC_STR(s) #s #define MONGOC_EVALUATE_STR(s) MONGOC_STR(s) BSON_BEGIN_DECLS extern const bson_validate_flags_t _mongoc_default_insert_vflags; extern const bson_validate_flags_t _mongoc_default_replace_vflags; extern const bson_validate_flags_t _mongoc_default_update_vflags; int _mongoc_rand_simple(unsigned int *seed); char * _mongoc_hex_md5(const char *input); /* Get the current time as a number of milliseconds since the Unix Epoch. */ int64_t _mongoc_get_real_time_ms(void); const char * _mongoc_get_command_name(const bson_t *command); bool _mongoc_lookup_bool(const bson_t *bson, const char *key, bool default_value); /* Returns a database name that the caller must free. */ char * _mongoc_get_db_name(const char *ns); void _mongoc_bson_init_if_set(bson_t *bson); const char * _mongoc_bson_type_to_str(bson_type_t t); const char * _mongoc_wire_version_to_server_version(int32_t version); bool _mongoc_validate_new_document(const bson_t *insert, bson_validate_flags_t vflags, bson_error_t *error); bool _mongoc_validate_replace(const bson_t *insert, bson_validate_flags_t vflags, bson_error_t *error); bool _mongoc_validate_update(const bson_t *update, bson_validate_flags_t vflags, bson_error_t *error); bool mongoc_ends_with(const char *str, const char *suffix); void mongoc_lowercase(const char *src, char *buf /* OUT */); void mongoc_lowercase_inplace(char *src); /** * @brief Parse a network port number * * @param spelling The decimal spelling of the port number * @param out The port number to be updated * @return true If the parse is successful * @return false Otherwise */ bool _mongoc_parse_port(mstr_view spelling, uint16_t *out, bson_error_t *error); void _mongoc_bson_array_add_label(bson_t *bson, const char *label); void _mongoc_bson_array_copy_labels_to(const bson_t *reply, bson_t *dst); void _mongoc_add_transient_txn_error(const mongoc_client_session_t *cs, bson_t *reply); bool _mongoc_document_is_pipeline(const bson_t *document); /* *-------------------------------------------------------------------------- * * _mongoc_getenv -- * * Get the value of an environment variable. * * Returns: * A string you must bson_free, or NULL if the variable is not set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * _mongoc_getenv(const char *name); /* *-------------------------------------------------------------------------- * * _mongoc_setenv -- * * Set or overwrite the value of an environment variable. * * Returns: * False if setting the variable was unsuccessful. * *-------------------------------------------------------------------------- */ bool _mongoc_setenv(const char *name, const char *value); void bson_copy_to_including_noinit(const bson_t *src, bson_t *dst, const char *first_include, ...) BSON_GNUC_NULL_TERMINATED; void bson_copy_to_including_noinit_va(const bson_t *src, bson_t *dst, const char *first_include, va_list args); /* Returns a uniformly-distributed uint32_t generated using * `_mongoc_rand_bytes()` if a source of cryptographic randomness is available * (defined only if `MONGOC_ENABLE_CRYPTO` is defined). */ uint32_t _mongoc_crypto_rand_uint32_t(void); /* Returns a uniformly-distributed uint64_t generated using * `_mongoc_rand_bytes()` if a source of cryptographic randomness is available * (defined only if `MONGOC_ENABLE_CRYPTO` is defined). */ uint64_t _mongoc_crypto_rand_uint64_t(void); /* Returns a uniformly-distributed size_t generated using * `_mongoc_rand_bytes()` if a source of cryptographic randomness is available * (defined only if `MONGOC_ENABLE_CRYPTO` is defined). */ size_t _mongoc_crypto_rand_size_t(void); /* Returns a uniformly-distributed random uint32_t generated using `rand()`. * Note: may invoke `srand()`, which may not be thread-safe. Concurrent calls to * `_mongoc_simple_rand_*()` functions, however, is thread-safe. */ uint32_t _mongoc_simple_rand_uint32_t(void); /* Returns a uniformly-distributed random uint64_t generated using `rand()`. * Note: may invoke `srand()`, which may not be thread-safe. Concurrent calls to * `_mongoc_simple_rand_*()` functions, however, is thread-safe. */ uint64_t _mongoc_simple_rand_uint64_t(void); /* Returns a uniformly-distributed random size_t generated using `rand()`. * Note: may invoke `srand()`, which may not be thread-safe. Concurrent calls to * `_mongoc_simple_rand_*()` functions, however, is thread-safe. */ size_t _mongoc_simple_rand_size_t(void); /* Returns a uniformly-distributed random integer in the range [min, max] * using the provided `rand` generator. * * The size of the range [min, max] must not equal the size of the representable * range of uint32_t (`min == 0 && max == UINT32_MAX` must not be true). * * The generator `rand` must return a random integer uniformly distributed in * the full range of representable values of uint32_t. */ uint32_t _mongoc_rand_uint32_t(uint32_t min, uint32_t max, uint32_t (*rand)(void)); /* Returns a uniformly-distributed random integer in the range [min, max] * using the provided `rand` generator. * * The size of the range [min, max] must not equal the size of the representable * range of uint64_t (`min == 0 && max == UINT64_MAX` must not be true). * * The generator `rand` must return a random integer uniformly distributed in * the full range of representable values of uint64_t. */ uint64_t _mongoc_rand_uint64_t(uint64_t min, uint64_t max, uint64_t (*rand)(void)); /* Returns a uniformly-distributed random integer in the range [min, max] * using the `_mongoc_simple_rand_size_t()` generator. * * The size of the range [min, max] must not equal the size of the representable * range of size_t (`min == 0 && max == SIZE_MAX` must not be true). */ size_t _mongoc_rand_size_t(size_t min, size_t max); /* _mongoc_iter_document_as_bson attempts to read the document from @iter into * @bson. */ bool _mongoc_iter_document_as_bson(const bson_iter_t *iter, bson_t *bson, bson_error_t *error); // `hex_to_bin` parses `hex` into bytes. `hex` can be either upper or lowercase. Returns NULL on error. uint8_t * hex_to_bin(const char *hex, size_t *bin_len); // `bin_to_hex` returns uppercase hex for `bin`. Returns NULL on error. char * bin_to_hex(const uint8_t *bin, size_t bin_len); typedef struct { bool set; uint64_t value; } mcd_optional_u64_t; #ifdef _WIN32 /** * Returns true if the Windows version is greater than or equal to the required * desktop or server version. */ bool _mongoc_verify_windows_version(DWORD major_version, DWORD minor_version, DWORD build_number, bool strictly_equal); #endif // mongoc_percent_encode percent encodes `str` according to RFC 3986. The caller must free the returned string. // Returns NULL on failure. char * mongoc_percent_encode(const char *str); BSON_END_DECLS #endif /* MONGOC_UTIL_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-util.c000066400000000000000000000676221511661753600236060ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef _WIN32 #define _CRT_RAND_S #endif #include #include #include // WIRE_VERSION_* macros. #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #include #include #include #endif #include /** * ! NOTE * * In earlier releases, these flags had `BSON_VALIDATE_UTF8` and `BSON_VALIDATE_UTF8_ALLOW_NULL`. * Due to a bug, the CRUD APIs did not actually do UTF-8 validation. This issue has been fixed, but * we want to maintain backward compatibility, so the UTF-8 validation was removed from these flag * values. * * A future API may add the UTF-8 validation back, but it would be a breaking change. */ const bson_validate_flags_t _mongoc_default_insert_vflags = BSON_VALIDATE_EMPTY_KEYS; const bson_validate_flags_t _mongoc_default_replace_vflags = BSON_VALIDATE_EMPTY_KEYS; const bson_validate_flags_t _mongoc_default_update_vflags = BSON_VALIDATE_EMPTY_KEYS; int _mongoc_rand_simple(unsigned int *seed) { #ifdef _WIN32 /* ignore the seed */ BSON_UNUSED(seed); unsigned int ret = 0; errno_t err; err = rand_s(&ret); if (0 != err) { MONGOC_ERROR("rand_s failed: %s", strerror(err)); } return (int)ret; #else return rand_r(seed); #endif } char * _mongoc_hex_md5(const char *input) { uint8_t digest[16]; bson_md5_t md5; char digest_str[33]; mcommon_md5_init(&md5); mcommon_md5_append(&md5, (const uint8_t *)input, (uint32_t)strlen(input)); mcommon_md5_finish(&md5, digest); mlib_foreach_urange (i, sizeof digest) { // Expect no truncation. int req = bson_snprintf(&digest_str[i * 2], 3, "%02x", digest[i]); BSON_ASSERT(req < 3); } digest_str[sizeof digest_str - 1] = '\0'; return bson_strdup(digest_str); } void mongoc_client_set_usleep_impl(mongoc_client_t *client, mongoc_usleep_func_t usleep_func, void *user_data) { client->topology->usleep_fn = usleep_func; client->topology->usleep_data = user_data; if (client->topology->oidc_cache) { mongoc_oidc_cache_set_usleep_fn(client->topology->oidc_cache, usleep_func, user_data); } } void mongoc_usleep_default_impl(int64_t usec, void *user_data) { BSON_UNUSED(user_data); mlib_sleep_for(usec, us); } int64_t _mongoc_get_real_time_ms(void) { struct timeval tv; const bool rc = bson_gettimeofday(&tv); if (rc != 0) { return -1; } return tv.tv_sec * (int64_t)1000 + tv.tv_usec / (int64_t)1000; } const char * _mongoc_get_command_name(const bson_t *command) { bson_iter_t iter; const char *name; bson_iter_t child; const char *wrapper_name = NULL; BSON_ASSERT(command); if (!bson_iter_init(&iter, command) || !bson_iter_next(&iter)) { return NULL; } name = bson_iter_key(&iter); /* wrapped in "$query" or "query"? * * {$query: {count: "collection"}, $readPreference: {...}} */ if (name[0] == '$') { wrapper_name = "$query"; } else if (!strcmp(name, "query")) { wrapper_name = "query"; } if (wrapper_name && bson_iter_init_find(&iter, command, wrapper_name) && BSON_ITER_HOLDS_DOCUMENT(&iter) && bson_iter_recurse(&iter, &child) && bson_iter_next(&child)) { name = bson_iter_key(&child); } return name; } bool _mongoc_lookup_bool(const bson_t *bson, const char *key, bool default_value) { bson_iter_t iter; bson_iter_t child; if (!bson) { return default_value; } BSON_ASSERT(bson_iter_init(&iter, bson)); if (!bson_iter_find_descendant(&iter, key, &child)) { return default_value; } return bson_iter_as_bool(&child); } char * _mongoc_get_db_name(const char *ns) { size_t dblen; const char *dot; BSON_ASSERT(ns); dot = strstr(ns, "."); if (dot) { dblen = dot - ns; return bson_strndup(ns, dblen); } else { return bson_strdup(ns); } } void _mongoc_bson_init_if_set(bson_t *bson) { if (bson) { bson_init(bson); } } const char * _mongoc_bson_type_to_str(bson_type_t t) { switch (t) { case BSON_TYPE_EOD: return "EOD"; case BSON_TYPE_DOUBLE: return "DOUBLE"; case BSON_TYPE_UTF8: return "UTF8"; case BSON_TYPE_DOCUMENT: return "DOCUMENT"; case BSON_TYPE_ARRAY: return "ARRAY"; case BSON_TYPE_BINARY: return "BINARY"; case BSON_TYPE_UNDEFINED: return "UNDEFINED"; case BSON_TYPE_OID: return "OID"; case BSON_TYPE_BOOL: return "BOOL"; case BSON_TYPE_DATE_TIME: return "DATE_TIME"; case BSON_TYPE_NULL: return "NULL"; case BSON_TYPE_REGEX: return "REGEX"; case BSON_TYPE_DBPOINTER: return "DBPOINTER"; case BSON_TYPE_CODE: return "CODE"; case BSON_TYPE_SYMBOL: return "SYMBOL"; case BSON_TYPE_CODEWSCOPE: return "CODEWSCOPE"; case BSON_TYPE_INT32: return "INT32"; case BSON_TYPE_TIMESTAMP: return "TIMESTAMP"; case BSON_TYPE_INT64: return "INT64"; case BSON_TYPE_MAXKEY: return "MAXKEY"; case BSON_TYPE_MINKEY: return "MINKEY"; case BSON_TYPE_DECIMAL128: return "DECIMAL128"; default: return "Unknown"; } } /* Refer to: * https://github.com/mongodb/specifications/blob/master/source/wireversion-featurelist/wireversion-featurelist.md * and: * https://github.com/mongodb/mongo/blob/master/src/mongo/db/wire_version.h#L57 */ const char * _mongoc_wire_version_to_server_version(int32_t version) { switch (version) { case 1: case 2: return "2.6"; case 3: return "3.0"; case 4: return "3.2"; case 5: return "3.4"; case 6: return "3.6"; case 7: return "4.0"; case WIRE_VERSION_4_2: return "4.2"; case WIRE_VERSION_4_4: return "4.4"; case 10: return "4.7"; case 11: return "4.8"; case WIRE_VERSION_4_9: return "4.9"; case WIRE_VERSION_5_0: return "5.0"; case WIRE_VERSION_5_1: return "5.1"; case 15: return "5.2"; case 16: return "5.3"; case WIRE_VERSION_6_0: return "6.0"; case WIRE_VERSION_7_0: return "7.0"; case WIRE_VERSION_8_0: return "8.0"; default: return "Unknown"; } } bool _mongoc_validate_new_document(const bson_t *doc, bson_validate_flags_t vflags, bson_error_t *error) { bson_error_t validate_err; if (vflags == BSON_VALIDATE_NONE) { return true; } if (!bson_validate_with_error(doc, vflags, &validate_err)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid document for insert: %s", validate_err.message); return false; } return true; } bool _mongoc_validate_replace(const bson_t *doc, bson_validate_flags_t vflags, bson_error_t *error) { bson_error_t validate_err; bson_iter_t iter; const char *key; if (vflags == BSON_VALIDATE_NONE) { return true; } if (!bson_validate_with_error(doc, vflags, &validate_err)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid argument for replace: %s", validate_err.message); return false; } if (!bson_iter_init(&iter, doc)) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "replace document is corrupt"); return false; } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (key[0] == '$') { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '%s': replace prohibits $ operators", key); return false; } } return true; } bool _mongoc_validate_update(const bson_t *update, bson_validate_flags_t vflags, bson_error_t *error) { bson_error_t validate_err; bson_iter_t iter; const char *key; if (vflags == BSON_VALIDATE_NONE) { return true; } if (!bson_validate_with_error(update, vflags, &validate_err)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid argument for update: %s", validate_err.message); return false; } if (_mongoc_document_is_pipeline(update)) { return true; } if (!bson_iter_init(&iter, update)) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "update document is corrupt"); return false; } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (key[0] != '$') { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '%s': update only works with $ operators" " and pipelines", key); return false; } } return true; } static bool should_include(const char *first_include, va_list args, const char *name) { bool ret = false; const char *include = first_include; va_list args_copy; va_copy(args_copy, args); do { if (!strcmp(name, include)) { ret = true; break; } } while ((include = va_arg(args_copy, const char *))); va_end(args_copy); return ret; } void bson_copy_to_including_noinit_va(const bson_t *src, bson_t *dst, const char *first_include, va_list args) { BSON_ASSERT_PARAM(src); BSON_ASSERT_PARAM(dst); BSON_ASSERT_PARAM(first_include); bson_iter_t iter; if (bson_iter_init(&iter, src)) { while (bson_iter_next(&iter)) { if (should_include(first_include, args, bson_iter_key(&iter))) { if (!bson_append_iter(dst, NULL, 0, &iter)) { /* * This should not be able to happen since we are copying * from within a valid bson_t. */ BSON_ASSERT(false); return; } } } } } void bson_copy_to_including_noinit(const bson_t *src, bson_t *dst, const char *first_include, ...) { BSON_ASSERT_PARAM(src); BSON_ASSERT_PARAM(dst); BSON_ASSERT_PARAM(first_include); va_list args; va_start(args, first_include); bson_copy_to_including_noinit_va(src, dst, first_include, args); va_end(args); } /* *-------------------------------------------------------------------------- * * mongoc_ends_with -- * * Return true if str ends with suffix. * *-------------------------------------------------------------------------- */ bool mongoc_ends_with(const char *str, const char *suffix) { BSON_ASSERT_PARAM(str); BSON_ASSERT_PARAM(suffix); const size_t str_len = strlen(str); const size_t suffix_len = strlen(suffix); if (str_len < suffix_len) { return false; } return strcmp(str + (str_len - suffix_len), suffix) == 0; } void mongoc_lowercase(const char *src, char *buf /* OUT */) { for (; *src; ++src, ++buf) { /* UTF8 non-ascii characters have a 1 at the leftmost bit. If this is the * case, just copy */ if ((*src & (0x1 << 7)) == 0) { *buf = (char)tolower(*src); } else { *buf = *src; } } } void mongoc_lowercase_inplace(char *src) { for (; *src; ++src) { /* UTF8 non-ascii characters have a 1 at the leftmost bit. If this is the * case, just leave as-is */ if ((*src & (0x1 << 7)) == 0) { *src = (char)tolower(*src); } } } bool _mongoc_parse_port(mstr_view spelling, uint16_t *out, bson_error_t *error) { bson_error_reset(error); // Parse a strict natural number uint64_t u = 0; int ec = mlib_nat64_parse(spelling, 10, &u); if (!ec && u == 0) { // Successful parse, but the value is zero bson_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Port number cannot be zero"); return false; } if (ec == EINVAL) { // The given string is just not a valid integer bson_set_error( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Port string is not a valid integer"); return false; } if (ec == ERANGE || mlib_narrow(out, u)) { // The value is out-of range for u64, or out-of range for u16 bson_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Port number is out-of-range for a 16-bit integer"); return false; } // No other errors are possible from nat64_parse mlib_check(ec, eq, 0); return true; } /*-------------------------------------------------------------------------- * * _mongoc_bson_array_add_label -- * * Append an error label like "TransientTransactionError" to a BSON * array iff the array does not already contain it. * * Side effects: * Aborts if the array is invalid or contains non-string elements. * *-------------------------------------------------------------------------- */ void _mongoc_bson_array_add_label(bson_t *bson, const char *label) { bson_iter_t iter; char buf[16]; uint32_t i = 0; const char *key; BSON_ASSERT(bson_iter_init(&iter, bson)); while (bson_iter_next(&iter)) { if (!strcmp(bson_iter_utf8(&iter, NULL), label)) { /* already included once */ return; } i++; } bson_uint32_to_string(i, &key, buf, sizeof buf); BSON_APPEND_UTF8(bson, key, label); } /*-------------------------------------------------------------------------- * * _mongoc_bson_array_copy_labels_to -- * * Copy error labels like "TransientTransactionError" from a server * reply to a BSON array iff the array does not already contain it. * * Side effects: * Aborts if @dst is invalid or contains non-string elements. * *-------------------------------------------------------------------------- */ void _mongoc_bson_array_copy_labels_to(const bson_t *reply, bson_t *dst) { bson_iter_t iter; bson_iter_t label; if (bson_iter_init_find(&iter, reply, "errorLabels")) { BSON_ASSERT(bson_iter_recurse(&iter, &label)); while (bson_iter_next(&label)) { if (BSON_ITER_HOLDS_UTF8(&label)) { _mongoc_bson_array_add_label(dst, bson_iter_utf8(&label, NULL)); } } } } /*-------------------------------------------------------------------------- * * _mongoc_add_transient_txn_error -- * * If @cs is not NULL and in a transaction, add errorLabels: * ["TransientTransactionError"] to @reply. * * Transactions Spec: TransientTransactionError includes "server * selection error encountered running any command besides * commitTransaction in a transaction. ...in the case of network errors * or server selection errors where the client receives no server reply, * the client adds the label." * * Side effects: * None. * *-------------------------------------------------------------------------- */ void _mongoc_add_transient_txn_error(const mongoc_client_session_t *cs, bson_t *reply) { if (!reply) { return; } if (_mongoc_client_session_in_txn(cs)) { bson_t labels = BSON_INITIALIZER; _mongoc_bson_array_copy_labels_to(reply, &labels); _mongoc_bson_array_add_label(&labels, TRANSIENT_TXN_ERR); bson_t new_reply = BSON_INITIALIZER; bson_copy_to_excluding_noinit(reply, &new_reply, "errorLabels", NULL); BSON_APPEND_ARRAY(&new_reply, "errorLabels", &labels); bson_reinit(reply); bson_concat(reply, &new_reply); bson_destroy(&labels); bson_destroy(&new_reply); } } bool _mongoc_document_is_pipeline(const bson_t *document) { bson_iter_t iter; bson_iter_t child; const char *key; int i = 0; char *i_str; if (!bson_iter_init(&iter, document)) { return false; } while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); i_str = bson_strdup_printf("%d", i++); if (strcmp(key, i_str)) { bson_free(i_str); return false; } bson_free(i_str); if (BSON_ITER_HOLDS_DOCUMENT(&iter)) { if (!bson_iter_recurse(&iter, &child)) { return false; } if (!bson_iter_next(&child)) { return false; } key = bson_iter_key(&child); if (key[0] != '$') { return false; } } else { return false; } } /* should return false when the document is empty */ return i != 0; } char * _mongoc_getenv(const char *name) { #ifdef _MSC_VER char buf[2048]; size_t buflen; if ((0 == getenv_s(&buflen, buf, sizeof buf, name)) && buflen) { return bson_strdup(buf); } else { return NULL; } #else char *const var = getenv(name); if (var && strlen(var)) { return bson_strdup(var); } else { return NULL; } #endif } bool _mongoc_setenv(const char *name, const char *value) { #ifdef _WIN32 return SetEnvironmentVariableA(name, value) != 0; #else if (0 != setenv(name, value, 1)) { return false; } return true; #endif } /* Nearly Divisionless (Algorithm 5): https://arxiv.org/abs/1805.10941 */ static uint32_t _mongoc_rand_nduid32(uint32_t s, uint32_t (*rand32)(void)) { const uint64_t limit = UINT32_MAX; /* 2^L */ uint64_t x, m, l; x = rand32(); m = x * s; l = m % limit; if (l < s) { const uint64_t t = (limit - s) % s; while (l < t) { x = rand32(); m = x * s; l = m % limit; } } return (uint32_t)(m / limit); } /* Java Algorithm (Algorithm 4): https://arxiv.org/abs/1805.10941 * The 64-bit version of the nearly divisionless algorithm requires 128-bit * integer arithmetic. Instead of trying to deal with cross-platform support for * `__int128`, fallback to using the Java algorithm for 64-bit instead. */ static uint64_t _mongoc_rand_java64(uint64_t s, uint64_t (*rand64)(void)) { const uint64_t limit = UINT64_MAX; /* 2^L */ uint64_t x, r; x = rand64(); r = x % s; while ((x - r) > (limit - s)) { x = rand64(); r = x % s; } return r; } #if defined(MONGOC_ENABLE_CRYPTO) uint32_t _mongoc_crypto_rand_uint32_t(void) { uint32_t res; (void)_mongoc_rand_bytes((uint8_t *)&res, sizeof(res)); return res; } uint64_t _mongoc_crypto_rand_uint64_t(void) { uint64_t res; (void)_mongoc_rand_bytes((uint8_t *)&res, sizeof(res)); return res; } size_t _mongoc_crypto_rand_size_t(void) { size_t res; (void)_mongoc_rand_bytes((uint8_t *)&res, sizeof(res)); return res; } #endif /* defined(MONGOC_ENABLE_CRYPTO) */ #define _mongoc_thread_local BSON_IF_GNU_LIKE(__thread) BSON_IF_MSVC(__declspec(thread)) // Use a thread-local random seed for calls to `rand_r`: static _mongoc_thread_local unsigned int _mongoc_simple_rand_seed = 0; static _mongoc_thread_local bool _mongoc_simple_rand_seed_initialized = false; static void _mongoc_simple_rand_init(void) { if (_mongoc_simple_rand_seed_initialized) { return; } _mongoc_simple_rand_seed_initialized = true; struct timeval tv; bson_gettimeofday(&tv); _mongoc_simple_rand_seed ^= (unsigned int)tv.tv_sec; _mongoc_simple_rand_seed ^= (unsigned int)tv.tv_usec; } uint32_t _mongoc_simple_rand_uint32_t(void) { _mongoc_simple_rand_init(); /* Ensure *all* bits are random, as RAND_MAX is only required to be at least * 32767 (2^15). */ return (((uint32_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 0u) | (((uint32_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 15u) | (((uint32_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x0003u) << 30u); } uint64_t _mongoc_simple_rand_uint64_t(void) { _mongoc_simple_rand_init(); /* Ensure *all* bits are random, as RAND_MAX is only required to be at least * 32767 (2^15). */ return (((uint64_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 0u) | (((uint64_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 15u) | (((uint64_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 30u) | (((uint64_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x7FFFu) << 45u) | (((uint64_t)_mongoc_rand_simple(&_mongoc_simple_rand_seed) & 0x0003u) << 60u); } uint32_t _mongoc_rand_uint32_t(uint32_t min, uint32_t max, uint32_t (*rand)(void)) { BSON_ASSERT(min <= max); BSON_ASSERT(min != 0u || max != UINT32_MAX); return _mongoc_rand_nduid32(max - min + 1u, rand) + min; } uint64_t _mongoc_rand_uint64_t(uint64_t min, uint64_t max, uint64_t (*rand)(void)) { BSON_ASSERT(min <= max); BSON_ASSERT(min != 0u || max != UINT64_MAX); return _mongoc_rand_java64(max - min + 1u, rand) + min; } #if SIZE_MAX == UINT64_MAX BSON_STATIC_ASSERT2(_mongoc_simple_rand_size_t, sizeof(size_t) == sizeof(uint64_t)); size_t _mongoc_simple_rand_size_t(void) { return (size_t)_mongoc_simple_rand_uint64_t(); } size_t _mongoc_rand_size_t(size_t min, size_t max) { BSON_ASSERT(min <= max); BSON_ASSERT(min != 0u || max != UINT64_MAX); return _mongoc_rand_java64(max - min + 1u, &_mongoc_simple_rand_uint64_t) + min; } #elif SIZE_MAX == UINT32_MAX BSON_STATIC_ASSERT2(_mongoc_simple_rand_size_t, sizeof(size_t) == sizeof(uint32_t)); size_t _mongoc_simple_rand_size_t(void) { return (size_t)_mongoc_simple_rand_uint32_t(); } size_t _mongoc_rand_size_t(size_t min, size_t max) { BSON_ASSERT(min <= max); BSON_ASSERT(min != 0u || max != UINT32_MAX); return _mongoc_rand_nduid32(max - min + 1u, &_mongoc_simple_rand_uint32_t) + min; } #else #error "Implementation of _mongoc_simple_rand_size_t() requires size_t be exactly 32-bit or 64-bit" #endif bool _mongoc_iter_document_as_bson(const bson_iter_t *iter, bson_t *bson, bson_error_t *error) { uint32_t len; const uint8_t *data; if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "expected BSON document for field: %s", bson_iter_key(iter)); return false; } bson_iter_document(iter, &len, &data); if (!bson_init_static(bson, data, len)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to initialize BSON document from field: %s", bson_iter_key(iter)); return false; } return true; } uint8_t * hex_to_bin(const char *hex, size_t *bin_len) { BSON_ASSERT_PARAM(hex); BSON_ASSERT_PARAM(bin_len); uint8_t *out; const size_t hex_len = strlen(hex); if (hex_len % 2u != 0u) { return NULL; } *bin_len = hex_len / 2u; out = bson_malloc0(*bin_len); for (size_t i = 0; i < hex_len; i += 2u) { uint64_t byte_value; if (mlib_nat64_parse(mstr_view_data(hex + i, 2), 16, &byte_value)) { bson_free(out); return NULL; } BSON_ASSERT(mlib_in_range(uint8_t, byte_value)); out[i / 2u] = (uint8_t)byte_value; } return out; } char * bin_to_hex(const uint8_t *bin, size_t bin_len) { BSON_ASSERT_PARAM(bin); size_t hex_len = bin_len; if (mlib_mul(&hex_len, 2u) || mlib_add(&hex_len, 1u)) { // Overflow return NULL; } char *out = bson_malloc0(hex_len); for (size_t i = 0u; i < bin_len; i++) { int req = bson_snprintf(out + (2u * i), 3, "%02X", bin[i]); // Expect no truncation. BSON_ASSERT(req < 3); } return out; } #ifdef _WIN32 typedef NTSTATUS(APIENTRY *RTLVERIFYVERSIONINFO_FN)(PRTL_OSVERSIONINFOEXW VersionInfo, ULONG TypeMask, ULONGLONG ConditionMask); bool _mongoc_verify_windows_version(DWORD major_version, DWORD minor_version, DWORD build_number, bool strictly_equal) { static RTLVERIFYVERSIONINFO_FN pRtlVerifyVersionInfo; OSVERSIONINFOEXW osvi; bool matched; BYTE op = VER_GREATER_EQUAL; if (strictly_equal) { op = VER_EQUAL; } /* Windows version functions may not return the correct version for later Windows versions unless the application is so manifested. Try to use the more accurate kernel function RtlVerifyVersionInfo */ pRtlVerifyVersionInfo = (RTLVERIFYVERSIONINFO_FN)GetProcAddress(GetModuleHandleA("ntdll"), "RtlVerifyVersionInfo"); ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXW)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); osvi.dwMajorVersion = major_version; osvi.dwMinorVersion = minor_version; ULONGLONG mask = 0; VER_SET_CONDITION(mask, VER_MAJORVERSION, op); VER_SET_CONDITION(mask, VER_MINORVERSION, op); if (pRtlVerifyVersionInfo) { matched = (pRtlVerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION, mask) == 0); } else { matched = (VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION, mask) != 0); } // Compare build number separately if major and minor versions are equal if (build_number && matched && _mongoc_verify_windows_version(major_version, minor_version, 0, true)) { ZeroMemory(&osvi, sizeof(OSVERSIONINFOEXW)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); osvi.dwBuildNumber = build_number; mask = 0; VER_SET_CONDITION(mask, VER_BUILDNUMBER, op); if (pRtlVerifyVersionInfo) { matched = (pRtlVerifyVersionInfo(&osvi, VER_BUILDNUMBER, mask) == 0); } else { matched = (VerifyVersionInfoW(&osvi, VER_BUILDNUMBER, mask) != 0); } } return matched; } #endif static bool needs_percent_encoding(unsigned char c) { // Unreserved characters according to RFC 3986: // ALPHA / DIGIT / "-" / "." / "_" / "~" if (c >= 'A' && c <= 'Z') { return false; } if (c >= 'a' && c <= 'z') { return false; } if (c >= '0' && c <= '9') { return false; } if (c == '-' || c == '.' || c == '_' || c == '~') { return false; } return true; } char * mongoc_percent_encode(const char *str) { BSON_ASSERT_PARAM(str); size_t str_len = strlen(str); size_t encoded_len = 0u; static const size_t percent_encoded_char_len = 3u; for (char const *i = (char *)str; *i; i++) { if (needs_percent_encoding((unsigned char)*i)) { encoded_len += percent_encoded_char_len; } else { encoded_len += 1u; } } encoded_len += 1u; // null terminator if (encoded_len < str_len) { // Overflow return NULL; } char *encoded = bson_malloc(encoded_len); char *o = encoded; // output pointer for (char const *i = (char *)str; *i; i++) { if (needs_percent_encoding((unsigned char)*i)) { int req = bson_snprintf(o, 4, "%%%02X", (unsigned char)*i); // Expect no truncation. BSON_ASSERT(req == 3); o += 3u; } else { *o = *i; o += 1; } } *o = '\0'; return encoded; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-version-functions.c000066400000000000000000000032501511661753600263070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include /** * mongoc_get_major_version: * * Helper function to return the runtime major version of the library. */ int mongoc_get_major_version(void) { return MONGOC_MAJOR_VERSION; } /** * mongoc_get_minor_version: * * Helper function to return the runtime minor version of the library. */ int mongoc_get_minor_version(void) { return MONGOC_MINOR_VERSION; } /** * mongoc_get_micro_version: * * Helper function to return the runtime micro version of the library. */ int mongoc_get_micro_version(void) { return MONGOC_MICRO_VERSION; } /** * mongoc_get_version: * * Helper function to return the runtime string version of the library. */ const char * mongoc_get_version(void) { return MONGOC_VERSION_S; } /** * mongoc_check_version: * * True if libmongoc's version is greater than or equal to the required * version. */ bool mongoc_check_version(int required_major, int required_minor, int required_micro) { return MONGOC_CHECK_VERSION(required_major, required_minor, required_micro); } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-version-functions.h000066400000000000000000000022241511661753600263140ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_VERSION_FUNCTIONS_H #define MONGOC_VERSION_FUNCTIONS_H #include #include /* for "bool" */ BSON_BEGIN_DECLS MONGOC_EXPORT(int) mongoc_get_major_version(void); MONGOC_EXPORT(int) mongoc_get_minor_version(void); MONGOC_EXPORT(int) mongoc_get_micro_version(void); MONGOC_EXPORT(const char *) mongoc_get_version(void); MONGOC_EXPORT(bool) mongoc_check_version(int required_major, int required_minor, int required_micro); BSON_END_DECLS #endif /* MONGOC_VERSION_FUNCTIONS_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-version.h.in000066400000000000000000000051411511661753600247140ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(MONGOC_INSIDE) && !defined(MONGOC_COMPILATION) #error "Only can be included directly." #endif // clang-format off #ifndef MONGOC_VERSION_H #define MONGOC_VERSION_H /** * MONGOC_MAJOR_VERSION: * * MONGOC major version component (e.g. 1 if %MONGOC_VERSION is 1.2.3) */ #define MONGOC_MAJOR_VERSION (@libmongoc_VERSION_MAJOR@) /** * MONGOC_MINOR_VERSION: * * MONGOC minor version component (e.g. 2 if %MONGOC_VERSION is 1.2.3) */ #define MONGOC_MINOR_VERSION (@libmongoc_VERSION_MINOR@) /** * MONGOC_MICRO_VERSION: * * MONGOC micro version component (e.g. 3 if %MONGOC_VERSION is 1.2.3) */ #define MONGOC_MICRO_VERSION (@libmongoc_VERSION_PATCH@) /** * MONGOC_PRERELEASE_VERSION: * * MONGOC prerelease version component (e.g. pre if %MONGOC_VERSION is 1.2.3-pre) */ #define MONGOC_PRERELEASE_VERSION (@libmongoc_VERSION_PRERELEASE@) /** * MONGOC_VERSION: * * MONGOC version. */ #define MONGOC_VERSION (@libmongoc_VERSION_FULL@) /** * MONGOC_VERSION_S: * * MONGOC version, encoded as a string, useful for printing and * concatenation. */ #define MONGOC_VERSION_S "@libmongoc_VERSION_FULL@" /** * MONGOC_VERSION_HEX: * * MONGOC version, encoded as an hexadecimal number, useful for * integer comparisons. */ #define MONGOC_VERSION_HEX (MONGOC_MAJOR_VERSION << 24 | \ MONGOC_MINOR_VERSION << 16 | \ MONGOC_MICRO_VERSION << 8) /** * MONGOC_CHECK_VERSION: * @major: required major version * @minor: required minor version * @micro: required micro version * * Compile-time version checking. Evaluates to %TRUE if the version * of MONGOC is greater than or equal to the required one. */ #define MONGOC_CHECK_VERSION(major,minor,micro) \ (MONGOC_MAJOR_VERSION > (major) || \ (MONGOC_MAJOR_VERSION == (major) && MONGOC_MINOR_VERSION > (minor)) || \ (MONGOC_MAJOR_VERSION == (major) && MONGOC_MINOR_VERSION == (minor) && \ MONGOC_MICRO_VERSION >= (micro))) #endif /* MONGOC_VERSION_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-write-command-private.h000066400000000000000000000175701511661753600270510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_WRITE_COMMAND_PRIVATE_H #define MONGOC_WRITE_COMMAND_PRIVATE_H #include #include #include #include #include #include BSON_BEGIN_DECLS /* forward decl */ struct _mongoc_crud_opts_t; #define MONGOC_WRITE_COMMAND_DELETE 0 #define MONGOC_WRITE_COMMAND_INSERT 1 #define MONGOC_WRITE_COMMAND_UPDATE 2 /* MongoDB has a extra allowance to allow updating 16mb document, as the update * operators would otherwise overflow the 16mb object limit. See SERVER-10643 * for context. */ #define BSON_OBJECT_ALLOWANCE (16 * 1024) #define RETRYABLE_WRITE_ERROR "RetryableWriteError" struct _mongoc_bulk_write_flags_t { bool ordered; bool bypass_document_validation; bool has_collation; bool has_multi_write; bool has_array_filters; bool has_update_hint; bool has_delete_hint; }; typedef struct { int type; mongoc_buffer_t payload; uint32_t n_documents; mongoc_bulk_write_flags_t flags; int64_t operation_id; bson_t *cmd_opts; } mongoc_write_command_t; typedef struct { uint32_t nInserted; uint32_t nMatched; uint32_t nModified; uint32_t nRemoved; uint32_t nUpserted; /* like [{"index": int, "code": int, "errmsg": str}, ...] */ bson_t writeErrors; /* like [{"index": int, "_id": value}, ...] */ bson_t upserted; uint32_t n_writeConcernErrors; /* like [{"code": 64, "errmsg": "duplicate"}, ...] */ bson_t writeConcernErrors; /* like ["TransientTransactionError", ...] */ bson_t errorLabels; bool failed; /* The command failed */ bool must_stop; /* The stream may have been disconnected */ bson_error_t error; uint32_t upsert_append_count; /* If the command initially failed with a retryable write, and selected a new * primary, this contains the server id of the newly selected primary. Only * applies to OP_MSG. Is left at 0 if no retry occurs. */ uint32_t retry_server_id; /* store the raw server response if an error occurred */ uint32_t n_errorReplies; bson_t rawErrorReplies; } mongoc_write_result_t; typedef enum { MONGOC_WRITE_ERR_NONE, MONGOC_WRITE_ERR_OTHER, MONGOC_WRITE_ERR_RETRY, MONGOC_WRITE_ERR_WRITE_CONCERN, } mongoc_write_err_type_t; void _mongoc_write_command_destroy(mongoc_write_command_t *command); void _mongoc_write_command_init(bson_t *doc, mongoc_write_command_t *command, const char *collection); void _mongoc_write_command_init_insert(mongoc_write_command_t *command, const bson_t *document, const bson_t *cmd_opts, mongoc_bulk_write_flags_t flags, int64_t operation_id); void _mongoc_write_command_init_insert_one_idl(mongoc_write_command_t *command, const bson_t *document, const bson_t *cmd_opts, bson_t *insert_id, int64_t operation_id); void _mongoc_write_command_init_insert_idl(mongoc_write_command_t *command, const bson_t *document, const bson_t *cmd_opts, int64_t operation_id); void _mongoc_write_command_init_delete(mongoc_write_command_t *command, const bson_t *selectors, const bson_t *cmd_opts, const bson_t *opts, mongoc_bulk_write_flags_t flags, int64_t operation_id); void _mongoc_write_command_init_delete_idl(mongoc_write_command_t *command, const bson_t *selector, const bson_t *cmd_opts, const bson_t *opts, int64_t operation_id); void _mongoc_write_command_init_update(mongoc_write_command_t *command, const bson_t *selector, const bson_t *update, const bson_t *cmd_opts, const bson_t *opts, mongoc_bulk_write_flags_t flags, int64_t operation_id); void _mongoc_write_command_init_update_idl(mongoc_write_command_t *command, const bson_t *selector, const bson_t *update, const bson_t *cmd_opts, const bson_t *opts, int64_t operation_id); void _mongoc_write_command_insert_append(mongoc_write_command_t *command, const bson_t *document); void _mongoc_write_command_update_append(mongoc_write_command_t *command, const bson_t *selector, const bson_t *update, const bson_t *opts); void _mongoc_write_command_delete_append(mongoc_write_command_t *command, const bson_t *selector, const bson_t *opts); void _mongoc_write_command_execute(mongoc_write_command_t *command, mongoc_client_t *client, mongoc_server_stream_t *server_stream, const char *database, const char *collection, const mongoc_write_concern_t *write_concern, uint32_t offset, mongoc_client_session_t *cs, mongoc_write_result_t *result); void _mongoc_write_command_execute_idl(mongoc_write_command_t *command, mongoc_client_t *client, mongoc_server_stream_t *server_stream, const char *database, const char *collection, uint32_t offset, const struct _mongoc_crud_opts_t *crud, mongoc_write_result_t *result); const char * _mongoc_write_command_get_name(const mongoc_write_command_t *command); void _mongoc_write_result_init(mongoc_write_result_t *result); #define MONGOC_WRITE_RESULT_COMPLETE(_result, ...) _mongoc_write_result_complete(_result, __VA_ARGS__, NULL) bool _mongoc_write_result_complete(mongoc_write_result_t *result, int32_t error_api_version, const mongoc_write_concern_t *wc, mongoc_error_domain_t err_domain_override, bson_t *reply, bson_error_t *error, ...); void _mongoc_write_result_destroy(mongoc_write_result_t *result); mongoc_write_err_type_t _mongoc_write_error_get_type(bson_t *reply); bool _mongoc_write_error_update_if_unsupported_storage_engine(bool cmd_ret, bson_error_t *cmd_err, bson_t *reply); BSON_END_DECLS #endif /* MONGOC_WRITE_COMMAND_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-write-command.c000066400000000000000000001213421511661753600253650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* indexed by MONGOC_WRITE_COMMAND_DELETE, INSERT, UPDATE */ static const char *gCommandNames[] = {"delete", "insert", "update"}; static const char *gCommandFields[] = {"deletes", "documents", "updates"}; static const uint32_t gCommandFieldLens[] = {7, 9, 7}; void _mongoc_write_command_insert_append(mongoc_write_command_t *command, const bson_t *document) { bson_iter_t iter; bson_oid_t oid; bson_t tmp; ENTRY; BSON_ASSERT(command); BSON_ASSERT(command->type == MONGOC_WRITE_COMMAND_INSERT); BSON_ASSERT(document); BSON_ASSERT(document->len >= 5); /* * If the document does not contain an "_id" field, we need to generate * a new oid for "_id". */ if (!bson_iter_init_find(&iter, document, "_id")) { bson_init(&tmp); bson_oid_init(&oid, NULL); BSON_APPEND_OID(&tmp, "_id", &oid); bson_concat(&tmp, document); _mongoc_buffer_append(&command->payload, bson_get_data(&tmp), tmp.len); bson_destroy(&tmp); } else { _mongoc_buffer_append(&command->payload, bson_get_data(document), document->len); } command->n_documents++; EXIT; } void _mongoc_write_command_update_append(mongoc_write_command_t *command, const bson_t *selector, const bson_t *update, const bson_t *opts) { bson_t document; ENTRY; BSON_ASSERT(command); BSON_ASSERT(command->type == MONGOC_WRITE_COMMAND_UPDATE); BSON_ASSERT(selector && update); bson_init(&document); BSON_APPEND_DOCUMENT(&document, "q", selector); if (_mongoc_document_is_pipeline(update)) { BSON_APPEND_ARRAY(&document, "u", update); } else { BSON_APPEND_DOCUMENT(&document, "u", update); } if (opts) { bson_concat(&document, opts); } _mongoc_buffer_append(&command->payload, bson_get_data(&document), document.len); command->n_documents++; bson_destroy(&document); EXIT; } void _mongoc_write_command_delete_append(mongoc_write_command_t *command, const bson_t *selector, const bson_t *opts) { bson_t document; ENTRY; BSON_ASSERT(command); BSON_ASSERT(command->type == MONGOC_WRITE_COMMAND_DELETE); BSON_ASSERT(selector); BSON_ASSERT(selector->len >= 5); bson_init(&document); BSON_APPEND_DOCUMENT(&document, "q", selector); if (opts) { bson_concat(&document, opts); } _mongoc_buffer_append(&command->payload, bson_get_data(&document), document.len); command->n_documents++; bson_destroy(&document); EXIT; } static void _mongoc_write_command_init_bulk( mongoc_write_command_t *command, int type, mongoc_bulk_write_flags_t flags, int64_t operation_id, const bson_t *opts) { ENTRY; BSON_ASSERT(command); command->type = type; command->flags = flags; command->operation_id = operation_id; if (!bson_empty0(opts)) { command->cmd_opts = bson_copy(opts); } else { command->cmd_opts = bson_new(); } _mongoc_buffer_init(&command->payload, NULL, 0, NULL, NULL); command->n_documents = 0; EXIT; } void _mongoc_write_command_init_insert(mongoc_write_command_t *command, /* IN */ const bson_t *document, /* IN */ const bson_t *cmd_opts, /* IN */ mongoc_bulk_write_flags_t flags, /* IN */ int64_t operation_id) /* IN */ { ENTRY; BSON_ASSERT_PARAM(command); BSON_ASSERT_PARAM(document); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_INSERT, flags, operation_id, cmd_opts); _mongoc_write_command_insert_append(command, document); EXIT; } // `_mongoc_write_command_init_insert_one_idl` returns the inserted ID in `inserted_id`. // Only called by mongoc_collection_insert_one. void _mongoc_write_command_init_insert_one_idl(mongoc_write_command_t *command, const bson_t *document, const bson_t *cmd_opts, bson_t *insert_id, int64_t operation_id) { mongoc_bulk_write_flags_t flags = MONGOC_BULK_WRITE_FLAGS_INIT; ENTRY; BSON_ASSERT_PARAM(command); BSON_ASSERT_PARAM(document); BSON_ASSERT_PARAM(cmd_opts); BSON_ASSERT_PARAM(insert_id); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_INSERT, flags, operation_id, cmd_opts); /* near identical to _mongoc_write_command_insert_append but additionally records the inserted id */ BSON_ASSERT(command->type == MONGOC_WRITE_COMMAND_INSERT); BSON_ASSERT(document->len >= 5); bson_iter_t iter; bson_oid_t oid; bson_t tmp; /* * If the document does not contain an "_id" field, we need to generate * a new oid for "_id". */ if (!bson_iter_init_find(&iter, document, "_id")) { bson_init(&tmp); bson_oid_init(&oid, NULL); BSON_APPEND_OID(&tmp, "_id", &oid); bson_concat(&tmp, document); _mongoc_buffer_append(&command->payload, bson_get_data(&tmp), tmp.len); BSON_APPEND_OID(insert_id, "insertedId", &oid); bson_destroy(&tmp); } else { _mongoc_buffer_append(&command->payload, bson_get_data(document), document->len); BSON_APPEND_VALUE(insert_id, "insertedId", bson_iter_value(&iter)); } command->n_documents++; EXIT; } void _mongoc_write_command_init_insert_idl(mongoc_write_command_t *command, const bson_t *document, const bson_t *cmd_opts, int64_t operation_id) { mongoc_bulk_write_flags_t flags = MONGOC_BULK_WRITE_FLAGS_INIT; ENTRY; BSON_ASSERT(command); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_INSERT, flags, operation_id, cmd_opts); /* must handle NULL document from mongoc_collection_insert_many */ if (document) { _mongoc_write_command_insert_append(command, document); } EXIT; } void _mongoc_write_command_init_delete(mongoc_write_command_t *command, /* IN */ const bson_t *selector, /* IN */ const bson_t *cmd_opts, /* IN */ const bson_t *opts, /* IN */ mongoc_bulk_write_flags_t flags, /* IN */ int64_t operation_id) /* IN */ { ENTRY; BSON_ASSERT(command); BSON_ASSERT(selector); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_DELETE, flags, operation_id, cmd_opts); _mongoc_write_command_delete_append(command, selector, opts); EXIT; } void _mongoc_write_command_init_delete_idl(mongoc_write_command_t *command, const bson_t *selector, const bson_t *cmd_opts, const bson_t *opts, int64_t operation_id) { mongoc_bulk_write_flags_t flags = MONGOC_BULK_WRITE_FLAGS_INIT; ENTRY; BSON_ASSERT(command); BSON_ASSERT(selector); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_DELETE, flags, operation_id, cmd_opts); _mongoc_write_command_delete_append(command, selector, opts); EXIT; } void _mongoc_write_command_init_update(mongoc_write_command_t *command, /* IN */ const bson_t *selector, /* IN */ const bson_t *update, /* IN */ const bson_t *cmd_opts, /* IN */ const bson_t *opts, /* IN */ mongoc_bulk_write_flags_t flags, /* IN */ int64_t operation_id) /* IN */ { ENTRY; BSON_ASSERT(command); BSON_ASSERT(selector); BSON_ASSERT(update); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_UPDATE, flags, operation_id, cmd_opts); _mongoc_write_command_update_append(command, selector, update, opts); EXIT; } void _mongoc_write_command_init_update_idl(mongoc_write_command_t *command, const bson_t *selector, const bson_t *update, const bson_t *cmd_opts, const bson_t *opts, int64_t operation_id) { mongoc_bulk_write_flags_t flags = MONGOC_BULK_WRITE_FLAGS_INIT; ENTRY; BSON_ASSERT(command); _mongoc_write_command_init_bulk(command, MONGOC_WRITE_COMMAND_UPDATE, flags, operation_id, cmd_opts); _mongoc_write_command_update_append(command, selector, update, opts); EXIT; } const char * _mongoc_write_command_get_name(const mongoc_write_command_t *command) { BSON_ASSERT_PARAM(command); BSON_ASSERT(command->type >= 0 && command->type < (int)(sizeof gCommandNames / sizeof gCommandNames[0])); return gCommandNames[command->type]; } /* takes initialized bson_t *doc and begins formatting a write command */ void _mongoc_write_command_init(bson_t *doc, mongoc_write_command_t *command, const char *collection) { ENTRY; if (!command->n_documents) { EXIT; } BSON_APPEND_UTF8(doc, _mongoc_write_command_get_name(command), collection); BSON_APPEND_BOOL(doc, "ordered", command->flags.ordered); if (command->flags.bypass_document_validation) { BSON_APPEND_BOOL(doc, "bypassDocumentValidation", command->flags.bypass_document_validation); } EXIT; } /* *------------------------------------------------------------------------- * * _mongoc_write_command_too_large_error -- * * Fill a bson_error_t and optional bson_t with error info after * receiving a document for bulk insert, update, or remove that is * larger than max_bson_size. * * "err_doc" should be NULL or an empty initialized bson_t. * * Returns: * None. * * Side effects: * "error" and optionally "err_doc" are filled out. * *------------------------------------------------------------------------- */ static void _mongoc_write_command_too_large_error(bson_error_t *error, int32_t idx, int32_t len, int32_t max_bson_size) { _mongoc_set_error(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Document %" PRId32 " is too large for the cluster. " "Document is %" PRId32 " bytes, max is %" PRId32 ".", idx, len, max_bson_size); } static void _empty_error(mongoc_write_command_t *command, bson_error_t *error) { static const uint32_t codes[] = {MONGOC_ERROR_COLLECTION_DELETE_FAILED, MONGOC_ERROR_COLLECTION_INSERT_FAILED, MONGOC_ERROR_COLLECTION_UPDATE_FAILED}; _mongoc_set_error(error, MONGOC_ERROR_COLLECTION, codes[command->type], "Cannot do an empty %s", _mongoc_write_command_get_name(command)); } static int32_t _mongoc_write_result_merge_arrays(uint32_t offset, mongoc_write_result_t *result, /* IN */ bson_t *dest, /* IN */ bson_iter_t *iter) /* IN */ { const bson_value_t *value; bson_iter_t ar; bson_iter_t citer; int32_t idx; int32_t count = 0; int32_t aridx; bson_t child; const char *keyptr = NULL; char key[12]; int len; ENTRY; BSON_ASSERT(result); BSON_ASSERT(dest); BSON_ASSERT(iter); BSON_ASSERT(BSON_ITER_HOLDS_ARRAY(iter)); aridx = bson_count_keys(dest); if (bson_iter_recurse(iter, &ar)) { while (bson_iter_next(&ar)) { if (BSON_ITER_HOLDS_DOCUMENT(&ar) && bson_iter_recurse(&ar, &citer)) { len = (int)bson_uint32_to_string(aridx++, &keyptr, key, sizeof key); bson_append_document_begin(dest, keyptr, len, &child); while (bson_iter_next(&citer)) { if (BSON_ITER_IS_KEY(&citer, "index")) { idx = bson_iter_int32(&citer) + offset; BSON_APPEND_INT32(&child, "index", idx); } else { value = bson_iter_value(&citer); BSON_APPEND_VALUE(&child, bson_iter_key(&citer), value); } } bson_append_document_end(dest, &child); count++; } } } RETURN(count); } static void _mongoc_write_result_append_upsert(mongoc_write_result_t *result, int32_t idx, const bson_value_t *value) { bson_t child; const char *keyptr = NULL; char key[12]; int len; BSON_ASSERT(result); BSON_ASSERT(value); len = (int)bson_uint32_to_string(result->upsert_append_count, &keyptr, key, sizeof key); bson_append_document_begin(&result->upserted, keyptr, len, &child); BSON_APPEND_INT32(&child, "index", idx); BSON_APPEND_VALUE(&child, "_id", value); bson_append_document_end(&result->upserted, &child); result->upsert_append_count++; } static void _mongoc_write_result_merge(mongoc_write_result_t *result, /* IN */ mongoc_write_command_t *command, /* IN */ const bson_t *reply, /* IN */ uint32_t offset) { int32_t server_index = 0; const bson_value_t *value; bson_iter_t iter; bson_iter_t citer; bson_iter_t ar; int32_t n_upserted = 0; int32_t affected = 0; ENTRY; BSON_ASSERT(result); BSON_ASSERT(reply); if (bson_iter_init_find(&iter, reply, "n") && BSON_ITER_HOLDS_INT32(&iter)) { affected = bson_iter_int32(&iter); } if (bson_iter_init_find(&iter, reply, "writeErrors") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &citer) && bson_iter_next(&citer)) { result->failed = true; } switch (command->type) { case MONGOC_WRITE_COMMAND_INSERT: result->nInserted += affected; break; case MONGOC_WRITE_COMMAND_DELETE: result->nRemoved += affected; break; case MONGOC_WRITE_COMMAND_UPDATE: /* server returns each upserted _id with its index into this batch * look for "upserted": [{"index": 4, "_id": ObjectId()}, ...] */ if (bson_iter_init_find(&iter, reply, "upserted")) { if (BSON_ITER_HOLDS_ARRAY(&iter) && (bson_iter_recurse(&iter, &ar))) { while (bson_iter_next(&ar)) { if (BSON_ITER_HOLDS_DOCUMENT(&ar) && bson_iter_recurse(&ar, &citer) && bson_iter_find(&citer, "index") && BSON_ITER_HOLDS_INT32(&citer)) { server_index = bson_iter_int32(&citer); if (bson_iter_recurse(&ar, &citer) && bson_iter_find(&citer, "_id")) { value = bson_iter_value(&citer); _mongoc_write_result_append_upsert(result, offset + server_index, value); n_upserted++; } } } } result->nUpserted += n_upserted; /* * XXX: The following addition to nMatched needs some checking. * I'm highly skeptical of it. */ result->nMatched += BSON_MAX(0, (affected - n_upserted)); } else { result->nMatched += affected; } if (bson_iter_init_find(&iter, reply, "nModified") && BSON_ITER_HOLDS_INT32(&iter)) { result->nModified += bson_iter_int32(&iter); } break; default: BSON_ASSERT(false); break; } if (bson_iter_init_find(&iter, reply, "writeErrors") && BSON_ITER_HOLDS_ARRAY(&iter)) { _mongoc_write_result_merge_arrays(offset, result, &result->writeErrors, &iter); } if (bson_iter_init_find(&iter, reply, "writeConcernError") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { uint32_t len; const uint8_t *data; bson_t write_concern_error; char str[16]; const char *key; /* writeConcernError is a subdocument in the server response * append it to the result->writeConcernErrors array */ bson_iter_document(&iter, &len, &data); BSON_ASSERT(bson_init_static(&write_concern_error, data, len)); bson_uint32_to_string(result->n_writeConcernErrors, &key, str, sizeof str); if (!bson_append_document(&result->writeConcernErrors, key, -1, &write_concern_error)) { MONGOC_ERROR("Error adding \"%s\" to writeConcernErrors.\n", key); } result->n_writeConcernErrors++; } /* If a server error ocurred, then append the raw response to the * error_replies array. */ if (!_mongoc_cmd_check_ok(reply, MONGOC_ERROR_API_VERSION_2, NULL /* error */)) { char str[16]; const char *key; bson_uint32_to_string(result->n_errorReplies, &key, str, sizeof str); if (!bson_append_document(&result->rawErrorReplies, key, -1, reply)) { MONGOC_ERROR("Error adding \"%s\" to errorReplies.\n", key); } result->n_errorReplies++; } /* inefficient if there are ever large numbers: for each label in each err, * we linear-search result->errorLabels to see if it's included yet */ _mongoc_bson_array_copy_labels_to(reply, &result->errorLabels); EXIT; } static void _mongoc_write_opmsg(mongoc_write_command_t *command, mongoc_client_t *client, mongoc_server_stream_t *server_stream, const char *database, const char *collection, const mongoc_write_concern_t *write_concern, uint32_t index_offset, mongoc_client_session_t *cs, mongoc_write_result_t *result, bson_error_t *error) { mongoc_cmd_parts_t parts; bson_iter_t iter; bson_t cmd; bson_t reply; bool ret = false; int32_t max_msg_size; int32_t max_bson_obj_size; int32_t max_document_count; uint32_t payload_batch_size = 0; uint32_t payload_total_offset = 0; bool ship_it = false; int document_count = 0; mongoc_server_stream_t *retry_server_stream = NULL; ENTRY; BSON_ASSERT(command); BSON_ASSERT_PARAM(client); BSON_ASSERT(database); BSON_ASSERT(server_stream); BSON_ASSERT(collection); max_bson_obj_size = mongoc_server_stream_max_bson_obj_size(server_stream); max_msg_size = mongoc_server_stream_max_msg_size(server_stream); if (_mongoc_cse_is_enabled(client)) { max_msg_size = MONGOC_REDUCED_MAX_MSG_SIZE_FOR_FLE; } max_document_count = mongoc_server_stream_max_write_batch_size(server_stream); bson_init(&cmd); _mongoc_write_command_init(&cmd, command, collection); mongoc_cmd_parts_init(&parts, client, database, MONGOC_QUERY_NONE, &cmd); parts.assembled.operation_id = command->operation_id; parts.is_write_command = true; if (!mongoc_cmd_parts_set_write_concern(&parts, write_concern, error)) { bson_destroy(&cmd); mongoc_cmd_parts_cleanup(&parts); EXIT; } if (parts.assembled.is_acknowledged) { mongoc_cmd_parts_set_session(&parts, cs); } /* Write commands that include multi-document operations are not retryable. * Set this explicitly so that mongoc_cmd_parts_assemble does not need to * inspect the command body later. */ parts.allow_txn_number = (command->flags.has_multi_write || !parts.assembled.is_acknowledged) ? MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_NO : MONGOC_CMD_PARTS_ALLOW_TXN_NUMBER_YES; BSON_ASSERT(bson_iter_init(&iter, command->cmd_opts)); if (!mongoc_cmd_parts_append_opts(&parts, &iter, error)) { bson_destroy(&cmd); mongoc_cmd_parts_cleanup(&parts); EXIT; } if (!mongoc_cmd_parts_assemble(&parts, server_stream, error)) { bson_destroy(&cmd); mongoc_cmd_parts_cleanup(&parts); EXIT; } // Calculate overhead of OP_MSG data. See OP_MSG spec for description of fields. uint32_t opmsg_overhead = 0; { opmsg_overhead += 16; // OP_MSG.MsgHeader opmsg_overhead += 4; // OP_MSG.flagBits opmsg_overhead += 1; // OP_MSG.Section[0].payloadType (0) opmsg_overhead += parts.assembled.command->len; // OP_MSG.Section[0].payload.document opmsg_overhead += 1; // OP_MSG.Section[1].payloadType (1) opmsg_overhead += 4; // OP_MSG.Section[1].payload.size opmsg_overhead += gCommandFieldLens[command->type] + 1; // OP_MSG.Section[1].payload.identifier // OP_MSG.Section[1].payload.documents is omitted. Calculated below with remaining size. } do { const int32_t len = mlib_read_i32le(command->payload.data + payload_batch_size + payload_total_offset); // Although messageLength is an int32, it should never be negative. BSON_ASSERT(len >= 0); if (len > max_bson_obj_size + BSON_OBJECT_ALLOWANCE) { /* Quit if the document is too large */ _mongoc_write_command_too_large_error(error, index_offset, len, max_bson_obj_size); result->failed = true; break; } else if (mlib_cmp(payload_batch_size + opmsg_overhead + len, <=, max_msg_size) || document_count == 0) { /* The current batch is still under max batch size in bytes */ payload_batch_size += len; /* If this document filled the maximum document count */ if (++document_count == max_document_count) { ship_it = true; /* If this document is the last document we have */ } else if (payload_batch_size + payload_total_offset == command->payload.len) { ship_it = true; } else { ship_it = false; } } else { ship_it = true; } if (ship_it) { parts.assembled.payloads_count = 1; mongoc_cmd_payload_t *const payload = &parts.assembled.payloads[0]; /* Seek past the document offset we have already sent */ payload->documents = command->payload.data + payload_total_offset; /* Only send the documents up to this size */ payload->size = payload_batch_size; payload->identifier = gCommandFields[command->type]; mongoc_server_stream_t *new_retry_server_stream = NULL; ret = mongoc_cluster_run_retryable_write( &client->cluster, &parts.assembled, parts.is_retryable_write, &new_retry_server_stream, &reply, error); if (new_retry_server_stream) { mongoc_server_stream_cleanup(retry_server_stream); retry_server_stream = new_retry_server_stream; } /* Add this batch size so we skip these documents next time */ payload_total_offset += payload_batch_size; payload_batch_size = 0; if (!ret) { result->failed = true; /* Stop for ordered bulk writes or when the server stream has been * properly invalidated (e.g., due to a network error). */ if (command->flags.ordered || !mongoc_cluster_stream_valid(&client->cluster, server_stream)) { result->must_stop = true; } } /* Result merge needs to know the absolute index for a document * so it can rewrite the error message which contains the relative * document index per batch */ _mongoc_write_result_merge(result, command, &reply, index_offset); index_offset += document_count; document_count = 0; bson_destroy(&reply); } /* While we have more documents to write */ } while (payload_total_offset < command->payload.len && !result->must_stop); bson_destroy(&cmd); mongoc_cmd_parts_cleanup(&parts); if (retry_server_stream) { if (ret) { /* if a retry succeeded, report that in the result so bulk write can * use the newly selected server. */ result->retry_server_id = mongoc_server_description_id(retry_server_stream->sd); } mongoc_server_stream_cleanup(retry_server_stream); } if (ret) { /* if a retry succeeded, clear the initial error */ memset(&result->error, 0, sizeof(bson_error_t)); } EXIT; } void _mongoc_write_command_execute(mongoc_write_command_t *command, /* IN */ mongoc_client_t *client, /* IN */ mongoc_server_stream_t *server_stream, /* IN */ const char *database, /* IN */ const char *collection, /* IN */ const mongoc_write_concern_t *write_concern, /* IN */ uint32_t offset, /* IN */ mongoc_client_session_t *cs, /* IN */ mongoc_write_result_t *result) /* OUT */ { mongoc_crud_opts_t crud = {0}; ENTRY; BSON_ASSERT(command); BSON_ASSERT_PARAM(client); BSON_ASSERT(server_stream); BSON_ASSERT(database); BSON_ASSERT(collection); BSON_ASSERT(result); if (!write_concern) { write_concern = client->write_concern; } if (!mongoc_write_concern_is_valid(write_concern)) { _mongoc_set_error( &result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The write concern is invalid."); result->failed = true; EXIT; } crud.client_session = cs; crud.writeConcern = (mongoc_write_concern_t *)write_concern; _mongoc_write_command_execute_idl(command, client, server_stream, database, collection, offset, &crud, result); EXIT; } void _mongoc_write_command_execute_idl(mongoc_write_command_t *command, mongoc_client_t *client, mongoc_server_stream_t *server_stream, const char *database, const char *collection, uint32_t offset, const mongoc_crud_opts_t *crud, mongoc_write_result_t *result) { ENTRY; BSON_ASSERT(command); BSON_ASSERT_PARAM(client); BSON_ASSERT(server_stream); BSON_ASSERT(database); BSON_ASSERT(collection); BSON_ASSERT(result); if (command->flags.has_collation) { if (!mongoc_write_concern_is_acknowledged(crud->writeConcern)) { result->failed = true; _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set collation for unacknowledged writes"); EXIT; } } if (command->flags.has_array_filters) { if (!mongoc_write_concern_is_acknowledged(crud->writeConcern)) { result->failed = true; _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use array filters with unacknowledged writes"); EXIT; } } if (command->flags.has_update_hint) { if (server_stream->sd->max_wire_version < WIRE_VERSION_UPDATE_HINT && !mongoc_write_concern_is_acknowledged(crud->writeConcern)) { _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support hint for update"); result->failed = true; EXIT; } } if (command->flags.has_delete_hint) { if (server_stream->sd->max_wire_version < WIRE_VERSION_DELETE_HINT && !mongoc_write_concern_is_acknowledged(crud->writeConcern)) { _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support hint for delete"); result->failed = true; EXIT; } } if (command->flags.bypass_document_validation) { if (!mongoc_write_concern_is_acknowledged(crud->writeConcern)) { result->failed = true; _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set bypassDocumentValidation for unacknowledged writes"); EXIT; } } if (crud->client_session && !mongoc_write_concern_is_acknowledged(crud->writeConcern)) { result->failed = true; _mongoc_set_error(&result->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use client session with unacknowledged writes"); EXIT; } if (command->payload.len == 0) { _empty_error(command, &result->error); EXIT; } _mongoc_write_opmsg(command, client, server_stream, database, collection, crud->writeConcern, offset, crud->client_session, result, &result->error); EXIT; } void _mongoc_write_command_destroy(mongoc_write_command_t *command) { ENTRY; if (command) { bson_destroy(command->cmd_opts); _mongoc_buffer_destroy(&command->payload); } EXIT; } void _mongoc_write_result_init(mongoc_write_result_t *result) /* IN */ { ENTRY; BSON_ASSERT(result); memset(result, 0, sizeof *result); bson_init(&result->upserted); bson_init(&result->writeConcernErrors); bson_init(&result->writeErrors); bson_init(&result->errorLabels); bson_init(&result->rawErrorReplies); EXIT; } void _mongoc_write_result_destroy(mongoc_write_result_t *result) { ENTRY; BSON_ASSERT(result); bson_destroy(&result->upserted); bson_destroy(&result->writeConcernErrors); bson_destroy(&result->writeErrors); bson_destroy(&result->errorLabels); bson_destroy(&result->rawErrorReplies); EXIT; } /* * If error is not set, set code from first document in array like * [{"code": 64, "errmsg": "duplicate"}, ...]. Format the error message * from all errors in array. */ static void _set_error_from_response(bson_t *bson_array, mongoc_error_domain_t domain, const char *error_type, bson_error_t *error /* OUT */) { bson_iter_t array_iter; bson_iter_t doc_iter; const char *errmsg = NULL; int32_t code = 0; uint32_t n_keys, i; mcommon_string_append_t compound_err; mcommon_string_new_as_fixed_capacity_append(&compound_err, sizeof error->message - 1u); n_keys = bson_count_keys(bson_array); if (n_keys > 1) { mcommon_string_append_printf(&compound_err, "Multiple %s errors: ", error_type); } if (!bson_empty0(bson_array) && bson_iter_init(&array_iter, bson_array)) { /* get first code and all error messages */ i = 0; while (bson_iter_next(&array_iter)) { if (BSON_ITER_HOLDS_DOCUMENT(&array_iter) && bson_iter_recurse(&array_iter, &doc_iter)) { /* parse doc, which is like {"code": 64, "errmsg": "duplicate"} */ while (bson_iter_next(&doc_iter)) { /* use the first error code we find */ if (BSON_ITER_IS_KEY(&doc_iter, "code") && code == 0) { code = (uint32_t)bson_iter_as_int64(&doc_iter); } else if (BSON_ITER_IS_KEY(&doc_iter, "errmsg")) { errmsg = bson_iter_utf8(&doc_iter, NULL); /* build message like 'Multiple write errors: "foo", "bar"' */ if (n_keys > 1) { mcommon_string_append_printf(&compound_err, "\"%s\"", errmsg); if (i < n_keys - 1) { mcommon_string_append(&compound_err, ", "); } } else { /* single error message */ mcommon_string_append(&compound_err, errmsg); } } } i++; } } if (code && !mcommon_string_from_append_is_empty(&compound_err)) { _mongoc_set_error_with_category( error, MONGOC_ERROR_CATEGORY_SERVER, domain, (uint32_t)code, "%s", mcommon_str_from_append(&compound_err)); } } mcommon_string_from_append_destroy(&compound_err); } /* complete a write result, including only certain fields */ bool _mongoc_write_result_complete(mongoc_write_result_t *result, /* IN */ int32_t error_api_version, /* IN */ const mongoc_write_concern_t *wc, /* IN */ mongoc_error_domain_t err_domain_override, /* IN */ bson_t *bson, /* OUT */ bson_error_t *error, /* OUT */ ...) { mongoc_error_domain_t domain; va_list args; const char *field; int n_args; bson_iter_t iter; bson_iter_t child; ENTRY; BSON_ASSERT(result); if (error_api_version >= MONGOC_ERROR_API_VERSION_2) { domain = MONGOC_ERROR_SERVER; } else if (err_domain_override) { domain = err_domain_override; } else if (result->error.domain) { domain = (mongoc_error_domain_t)result->error.domain; } else { domain = MONGOC_ERROR_COLLECTION; } /* produce either old fields like nModified from the deprecated Bulk API Spec * or new fields like modifiedCount from the CRUD Spec, which we partly obey */ if (bson && mongoc_write_concern_is_acknowledged(wc)) { n_args = 0; va_start(args, error); while ((field = va_arg(args, const char *))) { n_args++; if (!strcmp(field, "nInserted")) { BSON_APPEND_INT32(bson, field, result->nInserted); } else if (!strcmp(field, "insertedCount")) { BSON_APPEND_INT32(bson, field, result->nInserted); } else if (!strcmp(field, "nMatched")) { BSON_APPEND_INT32(bson, field, result->nMatched); } else if (!strcmp(field, "matchedCount")) { BSON_APPEND_INT32(bson, field, result->nMatched); } else if (!strcmp(field, "nModified")) { BSON_APPEND_INT32(bson, field, result->nModified); } else if (!strcmp(field, "modifiedCount")) { BSON_APPEND_INT32(bson, field, result->nModified); } else if (!strcmp(field, "nRemoved")) { BSON_APPEND_INT32(bson, field, result->nRemoved); } else if (!strcmp(field, "deletedCount")) { BSON_APPEND_INT32(bson, field, result->nRemoved); } else if (!strcmp(field, "nUpserted")) { BSON_APPEND_INT32(bson, field, result->nUpserted); } else if (!strcmp(field, "upsertedCount")) { BSON_APPEND_INT32(bson, field, result->nUpserted); } else if (!strcmp(field, "upserted") && !bson_empty0(&result->upserted)) { BSON_APPEND_ARRAY(bson, field, &result->upserted); } else if (!strcmp(field, "upsertedId") && !bson_empty0(&result->upserted) && bson_iter_init_find(&iter, &result->upserted, "0") && bson_iter_recurse(&iter, &child) && bson_iter_find(&child, "_id")) { /* "upsertedId", singular, for update_one() */ BSON_APPEND_VALUE(bson, "upsertedId", bson_iter_value(&child)); } } va_end(args); /* default: a standard result includes all Bulk API fields */ if (!n_args) { BSON_APPEND_INT32(bson, "nInserted", result->nInserted); BSON_APPEND_INT32(bson, "nMatched", result->nMatched); BSON_APPEND_INT32(bson, "nModified", result->nModified); BSON_APPEND_INT32(bson, "nRemoved", result->nRemoved); BSON_APPEND_INT32(bson, "nUpserted", result->nUpserted); if (!bson_empty0(&result->upserted)) { BSON_APPEND_ARRAY(bson, "upserted", &result->upserted); } } /* always append errors if there are any */ if (!n_args || !bson_empty(&result->writeErrors)) { BSON_APPEND_ARRAY(bson, "writeErrors", &result->writeErrors); } if (result->n_writeConcernErrors) { BSON_APPEND_ARRAY(bson, "writeConcernErrors", &result->writeConcernErrors); } } /* If there is a raw error response then we know a server error has occurred. * We should add the raw result to the reply. */ if (bson && !bson_empty(&result->rawErrorReplies)) { BSON_APPEND_ARRAY(bson, "errorReplies", &result->rawErrorReplies); } /* set bson_error_t from first write error or write concern error */ _set_error_from_response(&result->writeErrors, domain, "write", &result->error); if (!result->error.code) { _set_error_from_response( &result->writeConcernErrors, MONGOC_ERROR_WRITE_CONCERN, "write concern", &result->error); } if (bson && !bson_empty(&result->errorLabels)) { BSON_APPEND_ARRAY(bson, "errorLabels", &result->errorLabels); } if (error) { memcpy(error, &result->error, sizeof *error); } RETURN(!result->failed && result->error.code == 0); } /*-------------------------------------------------------------------------- * * _mongoc_write_error_get_type -- * * Checks if the error or reply from a write command is considered * retryable according to the retryable writes spec. Checks both * for a client error (a network exception) and a server error in * the reply. @cmd_ret and @cmd_err come from the result of a * write_command function. This function should be called after * error labels are appended in _mongoc_write_error_handle_labels, * which should be called after mongoc_cluster_run_command_monitored. * * * Return: * A mongoc_write_error_type_t indicating the type of error (if any). * *-------------------------------------------------------------------------- */ mongoc_write_err_type_t _mongoc_write_error_get_type(bson_t *reply) { bson_error_t error; if (mongoc_error_has_label(reply, RETRYABLE_WRITE_ERROR)) { return MONGOC_WRITE_ERR_RETRY; } /* check for a server error. */ if (_mongoc_cmd_check_ok_no_wce(reply, MONGOC_ERROR_API_VERSION_2, &error)) { return MONGOC_WRITE_ERR_NONE; } switch (error.code) { case 64: /* WriteConcernFailed */ return MONGOC_WRITE_ERR_WRITE_CONCERN; default: return MONGOC_WRITE_ERR_OTHER; } } /* Returns true and modifies reply and cmd_err. */ bool _mongoc_write_error_update_if_unsupported_storage_engine(bool cmd_ret, bson_error_t *cmd_err, bson_t *reply) { bson_error_t server_error; if (cmd_ret) { return false; } if (_mongoc_cmd_check_ok_no_wce(reply, MONGOC_ERROR_API_VERSION_2, &server_error)) { return false; } if (server_error.code == 20 && strstr(server_error.message, "Transaction numbers") == server_error.message) { const char *replacement = "This MongoDB deployment does not support " "retryable writes. Please add " "retryWrites=false to your connection string."; strcpy(cmd_err->message, replacement); if (reply) { bson_t *new_reply = bson_new(); bson_copy_to_excluding_noinit(reply, new_reply, "errmsg", NULL); BSON_APPEND_UTF8(new_reply, "errmsg", replacement); bson_destroy(reply); bson_steal(reply, new_reply); } return true; } return false; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-write-concern-private.h000066400000000000000000000025301511661753600270500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_WRITE_CONCERN_PRIVATE_H #define MONGOC_WRITE_CONCERN_PRIVATE_H #include // IWYU pragma: export // #include BSON_BEGIN_DECLS #define MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT -1 struct _mongoc_write_concern_t { int8_t journal; int32_t w; int64_t wtimeout; char *wtag; bool frozen; bson_t compiled; bool is_default; }; mongoc_write_concern_t * _mongoc_write_concern_new_from_iter(const bson_iter_t *iter, bson_error_t *error); const bson_t * _mongoc_write_concern_get_bson(mongoc_write_concern_t *write_concern); bool _mongoc_parse_wc_err(const bson_t *doc, bson_error_t *error); BSON_END_DECLS #endif /* MONGOC_WRITE_CONCERN_PRIVATE_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-write-concern.c000066400000000000000000000335331511661753600254020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include static void _mongoc_write_concern_freeze(mongoc_write_concern_t *write_concern); /** * mongoc_write_concern_new: * * Create a new mongoc_write_concern_t. * * Returns: A newly allocated mongoc_write_concern_t. This should be freed * with mongoc_write_concern_destroy(). */ mongoc_write_concern_t * mongoc_write_concern_new(void) { mongoc_write_concern_t *write_concern; write_concern = BSON_ALIGNED_ALLOC0(mongoc_write_concern_t); write_concern->w = MONGOC_WRITE_CONCERN_W_DEFAULT; write_concern->journal = MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT; write_concern->is_default = true; bson_init(&write_concern->compiled); return write_concern; } mongoc_write_concern_t * mongoc_write_concern_copy(const mongoc_write_concern_t *write_concern) { mongoc_write_concern_t *ret = NULL; if (write_concern) { ret = mongoc_write_concern_new(); ret->journal = write_concern->journal; ret->w = write_concern->w; ret->wtimeout = write_concern->wtimeout; ret->frozen = false; ret->wtag = bson_strdup(write_concern->wtag); ret->is_default = write_concern->is_default; } return ret; } /** * mongoc_write_concern_destroy: * @write_concern: A mongoc_write_concern_t. * * Releases a mongoc_write_concern_t and all associated memory. */ void mongoc_write_concern_destroy(mongoc_write_concern_t *write_concern) { if (write_concern) { bson_destroy(&write_concern->compiled); bson_free(write_concern->wtag); bson_free(write_concern); } } bool mongoc_write_concern_get_journal(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); return (write_concern->journal == true); } bool mongoc_write_concern_journal_is_set(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); return (write_concern->journal != MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT); } /** * mongoc_write_concern_set_journal: * @write_concern: A mongoc_write_concern_t. * @journal: If the write should be journaled. * * Set if the write request should be journaled before acknowledging the * write request. */ void mongoc_write_concern_set_journal(mongoc_write_concern_t *write_concern, bool journal) { BSON_ASSERT(write_concern); write_concern->journal = !!journal; write_concern->is_default = false; write_concern->frozen = false; } int32_t mongoc_write_concern_get_w(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); return write_concern->w; } /** * mongoc_write_concern_set_w: * @w: The number of nodes for write or MONGOC_WRITE_CONCERN_W_MAJORITY * for "majority". * * Sets the number of nodes that must acknowledge the write request before * acknowledging the write request to the client. * * You may specify @w as MONGOC_WRITE_CONCERN_W_MAJORITY to request that * a "majority" of nodes acknowledge the request. */ void mongoc_write_concern_set_w(mongoc_write_concern_t *write_concern, int32_t w) { BSON_ASSERT(write_concern); BSON_ASSERT(w >= -3); write_concern->w = w; if (w != MONGOC_WRITE_CONCERN_W_DEFAULT) { write_concern->is_default = false; } write_concern->frozen = false; } int32_t mongoc_write_concern_get_wtimeout(const mongoc_write_concern_t *write_concern) { return (int32_t)mongoc_write_concern_get_wtimeout_int64(write_concern); } int64_t mongoc_write_concern_get_wtimeout_int64(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); return write_concern->wtimeout; } void mongoc_write_concern_set_wtimeout(mongoc_write_concern_t *write_concern, int32_t wtimeout_msec) { mongoc_write_concern_set_wtimeout_int64(write_concern, (int64_t)wtimeout_msec); } void mongoc_write_concern_set_wtimeout_int64(mongoc_write_concern_t *write_concern, int64_t wtimeout_msec) { BSON_ASSERT(write_concern); if (wtimeout_msec < 0) { return; } write_concern->wtimeout = wtimeout_msec; write_concern->is_default = false; write_concern->frozen = false; } bool mongoc_write_concern_get_wmajority(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); return (write_concern->w == MONGOC_WRITE_CONCERN_W_MAJORITY); } /** * mongoc_write_concern_set_wmajority: * @write_concern: A mongoc_write_concern_t. * @wtimeout_msec: Number of milliseconds before timeout. * * Sets the "w" of a write concern to "majority". It is suggested that * you provide a reasonable @wtimeout_msec to wait before considering the * write request failed. A @wtimeout_msec value of 0 indicates no write timeout. * * The @wtimeout_msec parameter must be positive or zero. Negative values will * be ignored. */ void mongoc_write_concern_set_wmajority(mongoc_write_concern_t *write_concern, int32_t wtimeout_msec) { BSON_ASSERT(write_concern); write_concern->w = MONGOC_WRITE_CONCERN_W_MAJORITY; write_concern->is_default = false; write_concern->frozen = false; if (wtimeout_msec >= 0) { write_concern->wtimeout = wtimeout_msec; } } const char * mongoc_write_concern_get_wtag(const mongoc_write_concern_t *write_concern) { BSON_ASSERT(write_concern); if (write_concern->w == MONGOC_WRITE_CONCERN_W_TAG) { return write_concern->wtag; } return NULL; } void mongoc_write_concern_set_wtag(mongoc_write_concern_t *write_concern, const char *wtag) { BSON_ASSERT(write_concern); bson_free(write_concern->wtag); write_concern->wtag = bson_strdup(wtag); write_concern->w = MONGOC_WRITE_CONCERN_W_TAG; write_concern->is_default = false; write_concern->frozen = false; } /** * mongoc_write_concern_get_bson: * @write_concern: A mongoc_write_concern_t. * * This is an internal function. * * Returns: A bson_t representing the write concern, which is owned by the * mongoc_write_concern_t instance and should not be modified or freed. */ const bson_t * _mongoc_write_concern_get_bson(mongoc_write_concern_t *write_concern) { if (!write_concern->frozen) { _mongoc_write_concern_freeze(write_concern); } return &write_concern->compiled; } /** * mongoc_write_concern_is_default: * @write_concern: A mongoc_write_concern_t. * * Returns is_default, which is true when write_concern has not been modified. * */ bool mongoc_write_concern_is_default(const mongoc_write_concern_t *write_concern) { return !write_concern || write_concern->is_default; } /** * mongoc_write_concern_freeze: * @write_concern: A mongoc_write_concern_t. * * This is an internal function. * * Encodes the write concern into a bson_t, which may then be returned by * _mongoc_write_concern_get_bson(). */ static void _mongoc_write_concern_freeze(mongoc_write_concern_t *write_concern) { bson_t *compiled; BSON_ASSERT(write_concern); compiled = &write_concern->compiled; write_concern->frozen = true; bson_reinit(compiled); if (write_concern->w == MONGOC_WRITE_CONCERN_W_TAG) { BSON_ASSERT(write_concern->wtag); BSON_APPEND_UTF8(compiled, "w", write_concern->wtag); } else if (write_concern->w == MONGOC_WRITE_CONCERN_W_MAJORITY) { BSON_APPEND_UTF8(compiled, "w", "majority"); } else if (write_concern->w == MONGOC_WRITE_CONCERN_W_DEFAULT) { /* Do Nothing */ } else { BSON_APPEND_INT32(compiled, "w", write_concern->w); } if (write_concern->journal != MONGOC_WRITE_CONCERN_JOURNAL_DEFAULT) { bson_append_bool(compiled, "j", 1, !!write_concern->journal); } if (write_concern->wtimeout) { bson_append_int64(compiled, "wtimeout", 8, write_concern->wtimeout); } } /** * mongoc_write_concern_is_acknowledged: * @concern: (in): A mongoc_write_concern_t. * * Checks to see if @write_concern requests that a getlasterror command is to * be delivered to the MongoDB server. * * Returns: true if a getlasterror command should be sent. */ bool mongoc_write_concern_is_acknowledged(const mongoc_write_concern_t *write_concern) { if (write_concern) { return (((write_concern->w != MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED)) || mongoc_write_concern_get_journal(write_concern)); } return true; } /** * mongoc_write_concern_is_valid: * @write_concern: (in): A mongoc_write_concern_t. * * Checks to see if @write_concern is valid and does not contain conflicting * options. * * Returns: true if the write concern is valid; otherwise false. */ bool mongoc_write_concern_is_valid(const mongoc_write_concern_t *write_concern) { if (!write_concern) { return false; } /* Journal should require acknowledgement. */ if ((mongoc_write_concern_get_journal(write_concern)) && (write_concern->w == MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED)) { return false; } if (write_concern->wtimeout < 0) { return false; } return true; } static bool _mongoc_write_concern_validate(const mongoc_write_concern_t *write_concern, bson_error_t *error) { if (write_concern && !mongoc_write_concern_is_valid(write_concern)) { _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); return false; } return true; } /** * _mongoc_parse_wc_err: * @doc: (in): A bson document. * @error: (out): A bson_error_t. * * Parses a document, usually a server reply, * looking for a writeConcernError. Returns true if * there is a writeConcernError, false otherwise. */ bool _mongoc_parse_wc_err(const bson_t *doc, bson_error_t *error) { bson_iter_t iter; bson_iter_t inner; if (bson_iter_init_find(&iter, doc, "writeConcernError") && BSON_ITER_HOLDS_DOCUMENT(&iter)) { const char *errmsg = NULL; int32_t code = 0; BSON_ASSERT(bson_iter_recurse(&iter, &inner)); while (bson_iter_next(&inner)) { if (BSON_ITER_IS_KEY(&inner, "code")) { code = (uint32_t)bson_iter_as_int64(&inner); } else if (BSON_ITER_IS_KEY(&inner, "errmsg")) { errmsg = bson_iter_utf8(&inner, NULL); } } _mongoc_set_error(error, MONGOC_ERROR_WRITE_CONCERN, code, "Write Concern error: %s", errmsg); return true; } return false; } /** * mongoc_write_concern_append: * @write_concern: (in): A mongoc_write_concern_t. * @command: (out): A pointer to a bson document. * * Appends a write_concern document to a command, to send to * a server. * * Returns true on success, false on failure. * */ bool mongoc_write_concern_append(mongoc_write_concern_t *write_concern, bson_t *command) { if (!mongoc_write_concern_is_valid(write_concern)) { MONGOC_ERROR("Invalid writeConcern passed into " "mongoc_write_concern_append."); return false; } if (!bson_append_document(command, "writeConcern", 12, _mongoc_write_concern_get_bson(write_concern))) { MONGOC_ERROR("Could not append writeConcern to command."); return false; } return true; } /** * _mongoc_write_concern_new_from_iter: * * Create a new mongoc_write_concern_t from an iterator positioned on * a "writeConcern" document. * * Returns: A newly allocated mongoc_write_concern_t. This should be freed * with mongoc_write_concern_destroy(). */ mongoc_write_concern_t * _mongoc_write_concern_new_from_iter(const bson_iter_t *iter, bson_error_t *error) { bson_iter_t inner; mongoc_write_concern_t *write_concern; int32_t w; BSON_ASSERT(iter); write_concern = mongoc_write_concern_new(); if (!BSON_ITER_HOLDS_DOCUMENT(iter)) { goto fail; } BSON_ASSERT(bson_iter_recurse(iter, &inner)); while (bson_iter_next(&inner)) { if (BSON_ITER_IS_KEY(&inner, "w")) { if (BSON_ITER_HOLDS_INT32(&inner)) { w = bson_iter_int32(&inner); if (w < MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED) { goto fail; } mongoc_write_concern_set_w(write_concern, w); } else if (BSON_ITER_HOLDS_UTF8(&inner)) { if (!strcmp(bson_iter_utf8(&inner, NULL), "majority")) { mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { mongoc_write_concern_set_wtag(write_concern, bson_iter_utf8(&inner, NULL)); } } else { /* wrong type for "w" */ goto fail; } } else if (BSON_ITER_IS_KEY(&inner, "fsync")) { // fsync removed in C driver 2.0. goto fail; } else if (BSON_ITER_IS_KEY(&inner, "j")) { if (!BSON_ITER_HOLDS_BOOL(&inner)) { goto fail; } mongoc_write_concern_set_journal(write_concern, bson_iter_bool(&inner)); } else if (BSON_ITER_IS_KEY(&inner, "wtimeout")) { if (!BSON_ITER_HOLDS_INT(&inner) || bson_iter_as_int64(&inner) < 0) { goto fail; } mongoc_write_concern_set_wtimeout_int64(write_concern, bson_iter_as_int64(&inner)); } } if (!_mongoc_write_concern_validate(write_concern, error)) { mongoc_write_concern_destroy(write_concern); return NULL; } return write_concern; fail: _mongoc_set_error(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); mongoc_write_concern_destroy(write_concern); return NULL; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc-write-concern.h000066400000000000000000000062051511661753600254030ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #ifndef MONGOC_WRITE_CONCERN_H #define MONGOC_WRITE_CONCERN_H #include #include BSON_BEGIN_DECLS #define MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED 0 #define MONGOC_WRITE_CONCERN_W_DEFAULT -2 #define MONGOC_WRITE_CONCERN_W_MAJORITY -3 #define MONGOC_WRITE_CONCERN_W_TAG -4 typedef struct _mongoc_write_concern_t mongoc_write_concern_t; MONGOC_EXPORT(mongoc_write_concern_t *) mongoc_write_concern_new(void) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(mongoc_write_concern_t *) mongoc_write_concern_copy(const mongoc_write_concern_t *write_concern) BSON_GNUC_WARN_UNUSED_RESULT; MONGOC_EXPORT(void) mongoc_write_concern_destroy(mongoc_write_concern_t *write_concern); MONGOC_EXPORT(bool) mongoc_write_concern_get_journal(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(bool) mongoc_write_concern_journal_is_set(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_write_concern_set_journal(mongoc_write_concern_t *write_concern, bool journal); MONGOC_EXPORT(int32_t) mongoc_write_concern_get_w(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_write_concern_set_w(mongoc_write_concern_t *write_concern, int32_t w); MONGOC_EXPORT(const char *) mongoc_write_concern_get_wtag(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_write_concern_set_wtag(mongoc_write_concern_t *write_concern, const char *tag); MONGOC_EXPORT(int32_t) mongoc_write_concern_get_wtimeout(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(int64_t) mongoc_write_concern_get_wtimeout_int64(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_write_concern_set_wtimeout(mongoc_write_concern_t *write_concern, int32_t wtimeout_msec); MONGOC_EXPORT(void) mongoc_write_concern_set_wtimeout_int64(mongoc_write_concern_t *write_concern, int64_t wtimeout_msec); MONGOC_EXPORT(bool) mongoc_write_concern_get_wmajority(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(void) mongoc_write_concern_set_wmajority(mongoc_write_concern_t *write_concern, int32_t wtimeout_msec); MONGOC_EXPORT(bool) mongoc_write_concern_is_acknowledged(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(bool) mongoc_write_concern_is_valid(const mongoc_write_concern_t *write_concern); MONGOC_EXPORT(bool) mongoc_write_concern_append(mongoc_write_concern_t *write_concern, bson_t *doc); MONGOC_EXPORT(bool) mongoc_write_concern_is_default(const mongoc_write_concern_t *write_concern); BSON_END_DECLS #endif /* MONGOC_WRITE_CONCERN_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/mongoc.h000066400000000000000000000043171511661753600226300ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_H #define MONGOC_H #include #define MONGOC_INSIDE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #include #include #endif #undef MONGOC_INSIDE #endif /* MONGOC_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/service-gcp.c000066400000000000000000000174271511661753600235560ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #define HOST "metadata.google.internal" static const char *const DEFAULT_METADATA_TOKEN_PATH = "/computeMetadata/v1/instance/service-accounts/default/token"; static const char *const DEFAULT_METADATA_IDENTITY_PATH = "/computeMetadata/v1/instance/service-accounts/default/identity"; bool gcp_request_init(gcp_request *req, const char *metadata_path, const char *opt_audience, const char *const opt_host, int opt_port, const char *const opt_extra_headers) { BSON_ASSERT_PARAM(req); BSON_ASSERT_PARAM(metadata_path); bool ok = false; char *encoded_audience = NULL; mcommon_string_append_t path = {0}; _mongoc_http_request_init(&req->req); // The HTTP host of the Google metadata server req->req.host = req->_owned_host = bson_strdup(opt_host ? opt_host : HOST); if (opt_port) { req->req.port = opt_port; } else { req->req.port = 80; } // Empty body req->req.body = ""; // We GET req->req.method = "GET"; req->req.extra_headers = req->_owned_headers = bson_strdup_printf("Metadata-Flavor: Google\r\n%s", opt_extra_headers ? opt_extra_headers : ""); mcommon_string_new_as_append(&path); if (!mcommon_string_append(&path, metadata_path)) { goto fail; } if (opt_audience) { encoded_audience = mongoc_percent_encode(opt_audience); if (!encoded_audience) { goto fail; } if (!mcommon_string_append_printf(&path, "?audience=%s", encoded_audience)) { goto fail; } } req->req.path = req->_owned_path = mcommon_string_from_append_destroy_with_steal(&path); path = (mcommon_string_append_t){0}; ok = true; fail: bson_free(encoded_audience); mcommon_string_from_append_destroy(&path); return ok; } void gcp_request_destroy(gcp_request *req) { BSON_ASSERT_PARAM(req); bson_free(req->_owned_headers); bson_free(req->_owned_host); bson_free(req->_owned_path); *req = (gcp_request){ .req = {0}, ._owned_path = NULL, ._owned_host = NULL, ._owned_headers = NULL, }; } void gcp_access_token_destroy(gcp_service_account_token *token) { bson_free(token->access_token); bson_free(token->token_type); token->access_token = NULL; token->token_type = NULL; } bool gcp_access_token_try_parse_from_json(gcp_service_account_token *out, const char *json, int len, bson_error_t *error) { BSON_ASSERT_PARAM(out); BSON_ASSERT_PARAM(json); bool okay = false; // Zero the output *out = (gcp_service_account_token){0}; // Parse the JSON data bson_t bson; if (!bson_init_from_json(&bson, json, len, error)) { return false; } bson_iter_t iter; // access_token bool found = bson_iter_init_find(&iter, &bson, "access_token"); const char *const access_token = !found ? NULL : bson_iter_utf8(&iter, NULL); // token_type found = bson_iter_init_find(&iter, &bson, "token_type"); const char *const token_type = !found ? NULL : bson_iter_utf8(&iter, NULL); if (!(access_token && token_type)) { _mongoc_set_error(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, "One or more required JSON properties are " "missing/invalid: data: %.*s", len, json); goto done; } *out = (gcp_service_account_token){ .access_token = bson_strdup(access_token), .token_type = bson_strdup(token_type), }; okay = true; done: bson_destroy(&bson); return okay; } bool gcp_access_token_from_gcp_server(gcp_service_account_token *out, const char *opt_host, int opt_port, const char *opt_extra_headers, bson_error_t *error) { BSON_ASSERT_PARAM(out); bool okay = false; // Clear the output *out = (gcp_service_account_token){0}; mongoc_http_response_t resp; _mongoc_http_response_init(&resp); gcp_request req = { .req = {0}, ._owned_path = NULL, ._owned_host = NULL, ._owned_headers = NULL, }; if (!gcp_request_init(&req, DEFAULT_METADATA_TOKEN_PATH, NULL, opt_host, opt_port, opt_extra_headers)) { _mongoc_set_error(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_HTTP, "Failed to initialize request"); goto fail; } const mlib_duration socket_timeout = mlib_duration(3, s); if (!_mongoc_http_send(&req.req, mlib_expires_after(socket_timeout), false, NULL, &resp, error)) { goto fail; } // Only accept an HTTP 200 as success if (resp.status != 200) { _mongoc_set_error(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_HTTP, "Error from the GCP metadata server while looking for " "access token: %.*s", resp.body_len, resp.body); goto fail; } // Expect response body is JSON containing the token. if (!gcp_access_token_try_parse_from_json(out, resp.body, resp.body_len, error)) { goto fail; } okay = true; fail: gcp_request_destroy(&req); _mongoc_http_response_cleanup(&resp); return okay; } bool gcp_identity_token_from_gcp_server(gcp_service_account_token *out, const char *audience, mlib_timer opt_timer, bson_error_t *error) { BSON_ASSERT_PARAM(out); BSON_ASSERT_PARAM(audience); bool okay = false; // Clear the output *out = (gcp_service_account_token){0}; mongoc_http_response_t resp; _mongoc_http_response_init(&resp); gcp_request req = { .req = {0}, ._owned_path = NULL, ._owned_host = NULL, ._owned_headers = NULL, }; if (!gcp_request_init(&req, DEFAULT_METADATA_IDENTITY_PATH, audience, NULL, 0, NULL)) { _mongoc_set_error(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_HTTP, "Failed to initialize request"); goto fail; } mlib_timer timer = mlib_time_cmp(opt_timer.expires_at, !=, (mlib_time_point){0}) ? opt_timer : mlib_expires_after(3, s); // Default 3 second timeout. if (!_mongoc_http_send(&req.req, timer, false, NULL, &resp, error)) { goto fail; } // Only accept an HTTP 200 as success if (resp.status != 200) { _mongoc_set_error(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_HTTP, "Error from the GCP metadata server while looking for access token: %.*s", resp.body_len, resp.body); goto fail; } // Expect response body is the token. *out = (gcp_service_account_token){0}; out->access_token = resp.body; // Ownership transfer. resp.body = NULL; okay = true; fail: gcp_request_destroy(&req); _mongoc_http_response_cleanup(&resp); return okay; } mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/service-gcp.h000066400000000000000000000117021511661753600235510ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SERVICE_GCP_H_INCLUDED #define SERVICE_GCP_H_INCLUDED #include #include #include #include /** * @brief A GCP access token obtained from the GCP metadata server */ typedef struct gcp_service_account_token { /// The access token string char *access_token; // The HTTP type of the token char *token_type; } gcp_service_account_token; /** * @brief A GCP request */ typedef struct gcp_request { /// The underlying HTTP request object to be sent mongoc_http_request_t req; // optional parameters (used in testing) to override defaults char *_owned_path; char *_owned_host; char *_owned_headers; } gcp_request; /** * @brief Initialize a new GCP HTTP request * * @param req The object to initialize * @param metadata_path The HTTP path. * @param opt_audience (Optional) Will be percent encoded and passed as the "audience" query parameter. * @param opt_host (Optional) the IP host of the metadata server (default is * metadata.google.internal) * @param opt_port (Optional) The port of the HTTP server (default is 80) * @param opt_extra_headers (Optional) Set extra HTTP headers for the request * * @note the request must later be destroyed with gcp_request_destroy * * @retval true Upon success * @retval false Otherwise. Sets an error via `error` */ bool gcp_request_init(gcp_request *req, const char *metadata_path, const char *opt_audience, const char *const opt_host, int opt_port, const char *const opt_extra_headers); /** * @brief Destroy an GCP request created with gcp_request_init() * * @param req */ void gcp_request_destroy(gcp_request *req); /** * @brief Destroy and zero-fill GCP service account token * * @param token The service account token to destory */ void gcp_access_token_destroy(gcp_service_account_token *token); /** * @brief Try to parse a GCP access token from the metadata server JSON response * * @param out Overwritten with the obtained token. Must later be destroyed. * @pre `*out` must be in a non-owning state (e.g. uninitialized or zero-initialized). * @param json The JSON string body * @param len The length of 'body' * @param error An output parameter for errors * @retval true If 'out' was successfully initialized to a token. * @retval false Otherwise * * @note The 'out' token must later be given to gcp_access_token_destroy */ bool gcp_access_token_try_parse_from_json(gcp_service_account_token *out, const char *json, int len, bson_error_t *error); /** * @brief Attempt to obtain a new GCP service account token from a GCP metadata * server. * * @param out Overwritten with the obtained token. Must later be destroyed. * @pre `*out` must be in a non-owning state (e.g. uninitialized or zero-initialized). * @param opt_host (Optional) Override the IP host of the GCP server (used * in testing) * @param opt_port (Optional) The port of the HTTP server (default is 80) * (used in testing) * @param opt_extra_headers (Optional) Set extra HTTP headers for the request * (used in testing) * @param error Output parameter for errors * @retval true Upon success * @retval false Otherwise. Sets an error via `error` * */ bool gcp_access_token_from_gcp_server(gcp_service_account_token *out, const char *opt_host, int opt_port, const char *opt_extra_headers, bson_error_t *error); /** * @brief Like @ref gcp_access_token_from_gcp_server, but requests an identity token. * * @param out Overwritten with the obtained token. Must later be destroyed. * @pre `*out` must be in a non-owning state (e.g. uninitialized or zero-initialized). * @param audience Will be percent encoded and passed as the "audience" query parameter. * @param opt_timer (Optional) The timer for the request. Set to zero for default. * @param error Output parameter for errors * * @retval true Upon success * @retval false Otherwise. Sets an error via `error` * */ bool gcp_identity_token_from_gcp_server(gcp_service_account_token *out, const char *audience, mlib_timer opt_timer, bson_error_t *error); #endif /* SERVICE_GCP_H */ mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/uthash.h000066400000000000000000000015341511661753600226400ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_UTHASH_H #define MONGOC_UTHASH_H #include #include #define uthash_malloc(sz) bson_malloc(sz) #define uthash_free(ptr, sz) bson_free(ptr) #include #endif // MONGOC_UTHASH_H mongo-c-driver-2.2.1/src/libmongoc/src/mongoc/utlist.h000066400000000000000000000013551511661753600226710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MONGOC_UTLIST_H #define MONGOC_UTLIST_H #include #include #endif // MONGOC_UTLIST_H mongo-c-driver-2.2.1/src/libmongoc/tests/000077500000000000000000000000001511661753600202615ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/.gitignore000066400000000000000000000000001511661753600222370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/TestSuite.c000066400000000000000000000773721511661753600223760ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #if !defined(_WIN32) #include #include #include #include #include #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #define SKIP_LINE_BUFFER_SIZE 1024 static bson_once_t once = BSON_ONCE_INIT; static bson_mutex_t gTestMutex; static TestSuite *gTestSuite; MONGOC_PRINTF_FORMAT(1, 2) static void test_msg(const char *format, ...) { va_list ap; va_start(ap, format); vprintf(format, ap); printf("\n"); va_end(ap); fflush(stdout); } void _test_error(const char *format, ...) { va_list ap; fflush(stdout); va_start(ap, format); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); va_end(ap); fflush(stderr); abort(); } static void TestSuite_SeedRand(TestSuite *suite, /* IN */ Test *test) /* IN */ { BSON_UNUSED(suite); #ifndef BSON_OS_WIN32 int fd = open("/dev/urandom", O_RDONLY); int n_read; unsigned seed; if (fd != -1) { n_read = read(fd, &seed, 4); BSON_ASSERT(n_read == 4); close(fd); test->seed = seed; return; } else { test->seed = (unsigned)time(NULL) * (unsigned)getpid(); } #else test->seed = (unsigned)time(NULL); #endif } static BSON_ONCE_FUN(_test_suite_ensure_mutex_once) { bson_mutex_init(&gTestMutex); BSON_ONCE_RETURN; } void TestSuite_Init(TestSuite *suite, const char *name, int argc, char **argv) { const char *filename; int i; char *mock_server_log; memset(suite, 0, sizeof *suite); suite->name = bson_strdup(name); suite->flags = 0; suite->prgname = bson_strdup(argv[0]); suite->silent = false; for (i = 1; i < argc; i++) { if (0 == strcmp("-d", argv[i])) { suite->flags |= TEST_DEBUGOUTPUT; } else if ((0 == strcmp("-f", argv[i])) || (0 == strcmp("--no-fork", argv[i]))) { suite->flags |= TEST_NOFORK; } else if ((0 == strcmp("-t", argv[i])) || (0 == strcmp("--trace", argv[i]))) { mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); if (!MONGOC_TRACE_ENABLED) { test_error("-t requires mongoc compiled with -DENABLE_TRACING=ON."); } mlib_diagnostic_pop(); suite->flags |= TEST_TRACE; } else if (0 == strcmp("-F", argv[i])) { if (argc - 1 == i) { test_error("-F requires a filename argument."); } filename = argv[++i]; if (0 != strcmp("-", filename)) { #ifdef _WIN32 if (0 != fopen_s(&suite->outfile, filename, "w")) { suite->outfile = NULL; } #else suite->outfile = fopen(filename, "w"); #endif if (!suite->outfile) { test_error("Failed to open log file: %s", filename); } } } else if ((0 == strcmp("-h", argv[i])) || (0 == strcmp("--help", argv[i]))) { suite->flags |= TEST_HELPTEXT; } else if (0 == strcmp("--list-tests", argv[i])) { suite->flags |= TEST_LISTTESTS; } else if (0 == strcmp("--tests-cmake", argv[i])) { suite->flags |= TEST_TESTS_CMAKE; } else if ((0 == strcmp("-s", argv[i])) || (0 == strcmp("--silent", argv[i]))) { suite->silent = true; } else if ((0 == strcmp("--ctest-run", argv[i]))) { if (suite->ctest_run.data) { test_error("'--ctest-run' can only be specified once"); } if (argc - 1 == i) { test_error("'--ctest-run' requires an argument"); } suite->flags |= TEST_NOFORK; suite->silent = true; suite->ctest_run = mstr_copy_cstring(argv[i + 1]); ++i; } else if ((0 == strcmp("-l", argv[i])) || (0 == strcmp("--match", argv[i]))) { if (argc - 1 == i) { test_error("%s requires an argument.", argv[i]); } ++i; *mstr_vec_push(&suite->match_patterns) = mstr_copy_cstring(argv[i]); } else if (0 == strcmp("--skip-tests", argv[i])) { if (argc - 1 == i) { test_error("%s requires an argument.", argv[i]); } filename = argv[++i]; _process_skip_file(filename, &suite->failing_flaky_skips); } else { test_error("Unknown option: %s\n" "Try using the --help option.", argv[i]); } } if (suite->match_patterns.size != 0 && suite->ctest_run.data) { test_error("'--ctest-run' cannot be specified with '-l' or '--match'"); } mock_server_log = test_framework_getenv("MONGOC_TEST_SERVER_LOG"); if (mock_server_log) { if (!strcmp(mock_server_log, "stdout")) { suite->mock_server_log = stdout; } else if (!strcmp(mock_server_log, "stderr")) { suite->mock_server_log = stderr; } else if (!strcmp(mock_server_log, "json")) { suite->mock_server_log_buf = mcommon_string_new_with_capacity("", 0, 4096); } else { test_error("Unrecognized option: MONGOC_TEST_SERVER_LOG=%s", mock_server_log); } bson_free(mock_server_log); } if (suite->silent) { if (suite->outfile) { test_error("Cannot combine -F with --silent"); } suite->flags &= ~(TEST_DEBUGOUTPUT); } bson_once(&once, &_test_suite_ensure_mutex_once); bson_mutex_lock(&gTestMutex); gTestSuite = suite; bson_mutex_unlock(&gTestMutex); } int TestSuite_CheckLive(void) { return test_framework_getenv_bool("MONGOC_TEST_SKIP_LIVE") ? 0 : 1; } static int TestSuite_CheckDummy(void) { return 1; } int TestSuite_CheckMockServerAllowed(void) { if (test_framework_getenv_bool("MONGOC_TEST_SKIP_MOCK")) { return 0; } return 1; } static void TestSuite_AddHelper(void *ctx) { ((TestFnCtx *)ctx)->test_fn(); } void TestSuite_Add(TestSuite *suite, /* IN */ const char *name, /* IN */ TestFunc func) /* IN */ { TestSuite_AddFullWithTestFn(suite, name, TestSuite_AddHelper, NULL, func, TestSuite_CheckDummy); } void TestSuite_AddLive(TestSuite *suite, /* IN */ const char *name, /* IN */ TestFunc func) /* IN */ { // Add the `lock:live-server` tag to the test. mstr with_tags = mstr_sprintf("%s [lock:live-server]", name); TestSuite_AddFullWithTestFn(suite, with_tags.data, TestSuite_AddHelper, NULL, func, TestSuite_CheckLive); mstr_destroy(&with_tags); } Test * _V_TestSuite_AddFull( TestSuite *suite, const char *name_and_tags, TestFuncWC func, TestFuncDtor dtor, void *ctx, va_list ap) { // Split the name and tags around the first whitespace: mstr_view name, tags; mstr_split_around(mstr_cstring(name_and_tags), mstr_cstring(" "), &name, &tags); // Trim extras: tags = mstr_trim(tags); if (suite->ctest_run.data && mstr_cmp(suite->ctest_run, !=, name)) { // We are running CTest, and not running this particular test, so just skip registering it if (dtor) { dtor(ctx); } return NULL; } Test *test = TestVec_push(&suite->tests); test->name = mstr_copy(name); test->func = func; mstr_view tag, tail; tail = tags; while (tail.len) { mlib_check(mstr_split_around(tail, mstr_cstring("["), NULL, &tag), because, "Invalid test specifier: Expected an opening bracket (following whitespace or closing bracket) for a " "test tag"); mlib_check( mstr_split_around(tag, mstr_cstring("]"), &tag, &tail), because, "Expected a closing bracket for test tag"); *mstr_vec_push(&test->tags) = mstr_copy(tag); } CheckFunc check; while ((check = va_arg(ap, CheckFunc))) { *CheckFuncVec_push(&test->checks) = check; } test->dtor = dtor; test->ctx = ctx; TestSuite_SeedRand(suite, test); return test; } void _TestSuite_AddMockServerTest(TestSuite *suite, const char *name, TestFunc func, ...) { Test *test; va_list ap; TestFnCtx *ctx = bson_malloc(sizeof(TestFnCtx)); *ctx = (TestFnCtx){.test_fn = func, .dtor = NULL}; va_start(ap, func); test = _V_TestSuite_AddFull(suite, name, TestSuite_AddHelper, _TestSuite_TestFnCtxDtor, ctx, ap); va_end(ap); if (test) { *CheckFuncVec_push(&test->checks) = TestSuite_CheckMockServerAllowed; } } void TestSuite_AddWC(TestSuite *suite, /* IN */ const char *name, /* IN */ TestFuncWC func, /* IN */ TestFuncDtor dtor, /* IN */ void *ctx) /* IN */ { TestSuite_AddFull(suite, name, func, dtor, ctx, TestSuite_CheckDummy); } void(TestSuite_AddFull)(TestSuite *suite, /* IN */ const char *name, /* IN */ TestFuncWC func, /* IN */ TestFuncDtor dtor, /* IN */ void *ctx, ...) /* IN */ { va_list ap; va_start(ap, ctx); _V_TestSuite_AddFull(suite, name, func, dtor, ctx, ap); va_end(ap); } void _TestSuite_TestFnCtxDtor(void *ctx) { TestFuncDtor dtor = ((TestFnCtx *)ctx)->dtor; if (dtor) { dtor(ctx); } bson_free(ctx); } #if defined(_WIN32) static void _print_getlasterror_win(const char *msg) { char *err_msg = mongoc_winerr_to_string(GetLastError()); test_error("%s: %s", msg, err_msg); bson_free(err_msg); } static int TestSuite_RunFuncInChild(TestSuite *suite, /* IN */ Test *test) /* IN */ { STARTUPINFO si; PROCESS_INFORMATION pi; char *cmdline; DWORD exit_code = -1; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); cmdline = bson_strdup_printf("%s --silent --no-fork -l %.*s", suite->prgname, MSTR_FMT(test->name)); if (!CreateProcess(NULL, cmdline, NULL, /* Process handle not inheritable */ NULL, /* Thread handle not inheritable */ FALSE, /* Set handle inheritance to FALSE */ 0, /* No creation flags */ NULL, /* Use parent's environment block */ NULL, /* Use parent's starting directory */ &si, &pi)) { test_error("CreateProcess failed (%lu).", GetLastError()); bson_free(cmdline); return -1; } if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_OBJECT_0) { _print_getlasterror_win("Couldn't await process"); goto done; } if (!GetExitCodeProcess(pi.hProcess, &exit_code)) { _print_getlasterror_win("Couldn't get exit code"); goto done; } done: CloseHandle(pi.hProcess); CloseHandle(pi.hThread); bson_free(cmdline); return exit_code; } #else /* Unix */ static int TestSuite_RunFuncInChild(TestSuite *suite, /* IN */ Test *test) /* IN */ { pid_t child; int exit_code = -1; int fd; int pipefd[2]; const char *envp[] = {"MONGOC_TEST_SERVER_LOG=stdout", NULL}; char buf[4096]; ssize_t nread; if (suite->outfile) { fflush(suite->outfile); } if (suite->mock_server_log_buf) { if (pipe(pipefd) == -1) { perror("pipe"); exit(-1); } } if (-1 == (child = fork())) { return -1; } if (!child) { if (suite->outfile) { fclose(suite->outfile); suite->outfile = NULL; } if (suite->mock_server_log_buf) { /* tell mock server to log to stdout, and read its output */ dup2(pipefd[1], STDOUT_FILENO); close(pipefd[0]); close(pipefd[1]); execle(suite->prgname, suite->prgname, "--no-fork", "--silent", "-l", test->name.data, (char *)0, envp); } else { /* suppress child output */ fd = open("/dev/null", O_WRONLY); dup2(fd, STDOUT_FILENO); close(fd); execl(suite->prgname, suite->prgname, "--no-fork", "-l", test->name.data, (char *)0); } exit(-1); } if (suite->mock_server_log_buf) { close(pipefd[1]); while ((nread = read(pipefd[0], buf, sizeof(buf) - 1)) > 0) { mcommon_string_append_t append; mcommon_string_set_append(suite->mock_server_log_buf, &append); mcommon_string_append_bytes(&append, buf, nread); } } if (-1 == waitpid(child, &exit_code, 0)) { perror("waitpid()"); } return exit_code; } #endif /* returns 1 on failure, 0 on success */ static int TestSuite_RunTest(TestSuite *suite, /* IN */ Test *test, /* IN */ int *count) /* INOUT */ { int64_t t1, t2, t3; char name[MAX_TEST_NAME_LENGTH]; mcommon_string_append_t buf; mcommon_string_t *mock_server_log_buf; int status = 0; bson_snprintf(name, sizeof name, "%s%.*s", suite->name, MSTR_FMT(test->name)); mcommon_string_new_as_append(&buf); if (suite->flags & TEST_DEBUGOUTPUT) { test_msg("Begin %s, seed %u", name, test->seed); } mlib_vec_foreach (TestSkip, skip, suite->failing_flaky_skips) { if (mstr_cmp(skip->test_name, ==, mstr_cstring(name)) && !skip->subtest_desc.data) { if (suite->ctest_run.data) { /* Write a marker that tells CTest that we are skipping this test */ test_msg("@@ctest-skipped@@"); } if (!suite->silent) { mcommon_string_append_printf(&buf, " { \"status\": \"skip\", \"test_file\": \"%.*s\"," " \"reason\": \"%.*s\" }%s", MSTR_FMT(test->name), MSTR_FMT(skip->reason), ((*count) == 1) ? "" : ","); test_msg("%s", mcommon_str_from_append(&buf)); if (suite->outfile) { fprintf(suite->outfile, "%s", mcommon_str_from_append(&buf)); fflush(suite->outfile); } } goto done; } } mlib_vec_foreach (CheckFunc, check, test->checks) { if (!(*check)()) { if (suite->ctest_run.data) { /* Write a marker that tells CTest that we are skipping this test */ test_msg("@@ctest-skipped@@"); } if (!suite->silent) { mcommon_string_append_printf(&buf, " { \"status\": \"skip\", \"test_file\": \"%.*s\" }%s", MSTR_FMT(test->name), ((*count) == 1) ? "" : ","); test_msg("%s", mcommon_str_from_append(&buf)); if (suite->outfile) { fprintf(suite->outfile, "%s", mcommon_str_from_append(&buf)); fflush(suite->outfile); } } goto done; } } t1 = bson_get_monotonic_time(); if (suite->flags & TEST_NOFORK) { if (suite->flags & TEST_TRACE) { mongoc_log_set_handler(mongoc_log_default_handler, NULL); mongoc_log_trace_enable(); } else { mongoc_log_trace_disable(); } srand(test->seed); test_conveniences_init(); test->func(test->ctx); test_conveniences_cleanup(); } else { status = TestSuite_RunFuncInChild(suite, test); } capture_logs(false); if (suite->silent) { goto done; } t2 = bson_get_monotonic_time(); // CDRIVER-2567: check that bson_get_monotonic_time does not wrap. ASSERT_CMPINT64(t2, >=, t1); t3 = t2 - t1; mcommon_string_append_printf(&buf, " { \"status\": \"%s\", " "\"test_file\": \"%s\", " "\"seed\": \"%u\", " "\"start\": %u.%06u, " "\"end\": %u.%06u, " "\"elapsed\": %u.%06u ", (status == 0) ? "pass" : "fail", name, test->seed, (unsigned)t1 / (1000 * 1000), (unsigned)t1 % (1000 * 1000), (unsigned)t2 / (1000 * 1000), (unsigned)t2 % (1000 * 1000), (unsigned)t3 / (1000 * 1000), (unsigned)t3 % (1000 * 1000)); mock_server_log_buf = suite->mock_server_log_buf; if (mock_server_log_buf && !mcommon_string_is_empty(mock_server_log_buf)) { mcommon_string_append(&buf, ", \"log_raw\": \""); mcommon_json_append_escaped(&buf, mock_server_log_buf->str, mock_server_log_buf->len, true); mcommon_string_append(&buf, "\""); mcommon_string_clear(mock_server_log_buf); } mcommon_string_append(&buf, " }"); if (*count > 1) { mcommon_string_append(&buf, ","); } test_msg("%s", mcommon_str_from_append(&buf)); if (suite->outfile) { fprintf(suite->outfile, "%s", mcommon_str_from_append(&buf)); fflush(suite->outfile); } done: mcommon_string_from_append_destroy(&buf); return status ? 1 : 0; } static void TestSuite_PrintHelp(TestSuite *suite) /* IN */ { printf("usage: %s [OPTIONS]\n" "\n" "Options:\n" " -h, --help Show this help menu.\n" " --list-tests Print list of available tests.\n" " --tests-cmake Print CMake code that defines test information.\n" " -f, --no-fork Do not spawn a process per test (abort on " "first error).\n" " -l, --match PATTERN Run test by name, e.g. \"/Client/command\" or " "\"/Client/*\". May be repeated.\n" " --ctest-run TEST Run only the named TEST for CTest\n" " integration.\n" " -s, --silent Suppress all output.\n" " -F FILENAME Write test results (JSON) to FILENAME.\n" " -d Print debug output (useful if a test hangs).\n" " --skip-tests FILE Skip known failing or flaky tests.\n" " -t, --trace Enable mongoc tracing (useful to debug " "tests).\n" "\n", suite->prgname); } static void TestSuite_PrintTests(TestSuite *suite) /* IN */ { printf("\nTests:\n"); mlib_vec_foreach (Test, t, suite->tests) { printf("%s%.*s\n", suite->name, MSTR_FMT(t->name)); } printf("\n"); } static void TestSuite_PrintCMake(TestSuite *suite) { printf("set(MONGOC_TESTS)\n"); mlib_vec_foreach (Test, t, suite->tests) { printf("list(APPEND MONGOC_TESTS [[%.*s]])\n", MSTR_FMT(t->name)); printf("set(MONGOC_TEST_%.*s_TAGS)\n", MSTR_FMT(t->name)); mlib_vec_foreach (mstr, tag, t->tags) { printf("list(APPEND MONGOC_TEST_%.*s_TAGS [[%.*s]])\n", MSTR_FMT(t->name), MSTR_FMT(*tag)); } } } static void TestSuite_PrintJsonSystemHeader(FILE *stream) { #ifdef _WIN32 #define INFO_BUFFER_SIZE 32767 SYSTEM_INFO si; GetSystemInfo(&si); #if defined(_MSC_VER) // CDRIVER-4263: GetVersionEx is deprecated. #pragma warning(suppress : 4996) const DWORD version = GetVersion(); #else const DWORD version = GetVersion(); #endif const DWORD major_version = (DWORD)(LOBYTE(LOWORD(version))); const DWORD minor_version = (DWORD)(HIBYTE(LOWORD(version))); const DWORD build = version < 0x80000000u ? (DWORD)(HIWORD(version)) : 0u; fprintf(stream, " \"host\": {\n" " \"sysname\": \"Windows\",\n" " \"release\": \"%lu.%lu (%lu)\",\n" " \"machine\": \"%lu\",\n" " \"memory\": {\n" " \"pagesize\": %lu,\n" " \"npages\": 0\n" " }\n" " },\n", major_version, minor_version, build, si.dwProcessorType, si.dwPageSize); #else struct utsname u; uint64_t pagesize; uint64_t npages = 0; if (uname(&u) == -1) { perror("uname()"); return; } pagesize = sysconf(_SC_PAGE_SIZE); #if defined(_SC_PHYS_PAGES) npages = sysconf(_SC_PHYS_PAGES); #endif fprintf(stream, " \"host\": {\n" " \"sysname\": \"%s\",\n" " \"release\": \"%s\",\n" " \"machine\": \"%s\",\n" " \"memory\": {\n" " \"pagesize\": %" PRIu64 ",\n" " \"npages\": %" PRIu64 "\n" " }\n" " },\n", u.sysname, u.release, u.machine, pagesize, npages); #endif } static const char * getenv_or(const char *name, const char *dflt) { const char *s = getenv(name); return s ? s : dflt; } static const char * egetenv(const char *name) { return getenv_or(name, ""); } static void TestSuite_PrintJsonHeader(TestSuite *suite, /* IN */ FILE *stream) /* IN */ { char *hostname = test_framework_get_host(); char *udspath = test_framework_get_unix_domain_socket_path_escaped(); int port = test_framework_get_port(); bool ssl = test_framework_get_ssl(); ASSERT(suite); fprintf(stream, "{\n"); TestSuite_PrintJsonSystemHeader(stream); fprintf(stream, " \"auth\": { \"user\": \"%s\", \"pass\": \"%s\" }, \n" " \"addr\": { \"host\": \"%s\", \"port\": %d, \"uri\": \"%s\" },\n" " \"gssapi\": { \"host\": \"%s\", \"user\": \"%s\" }, \n" " \"uds\": \"%s\", \n" " \"compressors\": \"%s\", \n" " \"SSL\": {\n" " \"enabled\": %s,\n" " \"weak_cert_validation\": %s,\n" " \"pem_file\": \"%s\",\n" " \"pem_pwd\": \"%s\",\n" " \"ca_file\": \"%s\",\n" " \"ca_dir\": \"%s\",\n" " \"crl_file\": \"%s\"\n" " },\n" " \"framework\": {\n" " \"monitoringVerbose\": %s,\n" " \"mockServerLog\": \"%s\",\n" " \"futureTimeoutMS\": %" PRId64 ",\n" " \"majorityReadConcern\": %s,\n" " \"skipLiveTests\": %s\n" " },\n" " \"options\": {\n" " \"fork\": %s,\n" " \"tracing\": %s,\n" " \"apiVersion\": %s\n" " },\n" " \"results\": [\n", egetenv("MONGOC_TEST_USER"), egetenv("MONGOC_TEST_PASSWORD"), hostname, port, egetenv("MONGOC_TEST_URI"), egetenv("MONGOC_TEST_GSSAPI_HOST"), egetenv("MONGOC_TEST_GSSAPI_USER"), udspath, egetenv("MONGOC_TEST_COMPRESSORS"), ssl ? "true" : "false", test_framework_getenv_bool("MONGOC_TEST_SSL_WEAK_CERT_VALIDATION") ? "true" : "false", egetenv("MONGOC_TEST_SSL_PEM_FILE"), egetenv("MONGOC_TEST_SSL_PEM_PWD"), egetenv("MONGOC_TEST_SSL_CA_FILE"), egetenv("MONGOC_TEST_SSL_CA_DIR"), egetenv("MONGOC_TEST_SSL_CRL_FILE"), getenv("MONGOC_TEST_MONITORING_VERBOSE") ? "true" : "false", egetenv("MONGOC_TEST_SERVER_LOG"), get_future_timeout_ms(), test_framework_getenv_bool("MONGOC_ENABLE_MAJORITY_READ_CONCERN") ? "true" : "false", test_framework_getenv_bool("MONGOC_TEST_SKIP_LIVE") ? "true" : "false", (suite->flags & TEST_NOFORK) ? "false" : "true", (suite->flags & TEST_TRACE) ? "true" : "false", getenv_or("MONGODB_API_VERSION", "null")); bson_free(hostname); bson_free(udspath); fflush(stream); } static void TestSuite_PrintJsonFooter(FILE *stream) /* IN */ { fprintf(stream, " ]\n}\n"); fflush(stream); } static bool TestSuite_TestMatchesName(const TestSuite *suite, const Test *test, const char *testname) { char name[128]; bool star = strlen(testname) && testname[strlen(testname) - 1] == '*'; bson_snprintf(name, sizeof name, "%s%.*s", suite->name, MSTR_FMT(test->name)); if (star) { /* e.g. testname is "/Client*" and name is "/Client/authenticate" */ return (0 == strncmp(name, testname, strlen(testname) - 1)); } else { return (0 == strcmp(name, testname)); } } bool test_matches(TestSuite *suite, Test *test) { if (suite->ctest_run.data) { /* We only want exactly the named test */ return mstr_cmp(test->name, ==, suite->ctest_run); } /* If no match patterns were provided, then assume all match. */ if (suite->match_patterns.size == 0) { return true; } mlib_vec_foreach (mstr, pat, suite->match_patterns) { if (TestSuite_TestMatchesName(suite, test, pat->data)) { return true; } } return false; } void _process_skip_file(const char *filename, TestSkipVec *skips) { FILE *skip_file; #ifdef _WIN32 if (0 != fopen_s(&skip_file, filename, "r")) { skip_file = NULL; } #else skip_file = fopen(filename, "r"); #endif if (!skip_file) { test_error("Failed to open skip file: %s: errno: %d", filename, errno); } while (1) { char buffer[SKIP_LINE_BUFFER_SIZE]; if (!fgets(buffer, sizeof(buffer), skip_file)) { break; /* error */ } mstr_view line = mstr_cstring(buffer); if (!line.len) { // EOF break; } // Remove whitespace line = mstr_trim(line); if (line.len == 0 || line.data[0] == '#') { // Empty line or comment continue; } TestSkip skip = {0}; // If there is a trailing comment, drop that: mstr_view comment = {0}; mstr_split_around(line, mstr_cstring("#"), &line, &comment); line = mstr_trim(line); comment = mstr_trim(comment); if (comment.len) { skip.reason = mstr_copy(comment); } // If it contains a '/"' substring, the quoted part is the subtest description, // and everything before the '/' is the main test name. Split on that: mstr_view test_name; mstr_view subtest_desc; if (mstr_split_around(line, mstr_cstring("/\""), &test_name, &subtest_desc)) { // Drop trailing quote: mlib_check(mstr_at(subtest_desc, -1), eq, '"', because, "Subtest description should end with a quote"); subtest_desc = mstr_slice(subtest_desc, 0, -1); skip.subtest_desc = mstr_copy(subtest_desc); } skip.test_name = mstr_copy(test_name); *TestSkipVec_push(skips) = skip; } fclose(skip_file); } static int TestSuite_RunAll(TestSuite *suite /* IN */) { int count = 0; int status = 0; ASSERT(suite); /* initialize "count" so we can omit comma after last test output */ mlib_vec_foreach (Test, t, suite->tests) { if (test_matches(suite, t)) { count++; } } if (suite->ctest_run.data) { /* We should have matched *at most* one test */ ASSERT(count <= 1); if (count == 0) { test_error("No such test '%.*s'", MSTR_FMT(suite->ctest_run)); } } mlib_vec_foreach (Test, t, suite->tests) { if (test_matches(suite, t)) { status += TestSuite_RunTest(suite, t, &count); count--; } } if (suite->silent) { return status; } TestSuite_PrintJsonFooter(stdout); if (suite->outfile) { TestSuite_PrintJsonFooter(suite->outfile); } return status; } int TestSuite_Run(TestSuite *suite) /* IN */ { int failures = 0; int64_t start_us; if (suite->flags & TEST_HELPTEXT) { TestSuite_PrintHelp(suite); } if (suite->flags & TEST_LISTTESTS) { TestSuite_PrintTests(suite); } if (suite->flags & TEST_TESTS_CMAKE) { TestSuite_PrintCMake(suite); } if ((suite->flags & TEST_HELPTEXT) || (suite->flags & TEST_LISTTESTS) || (suite->flags & TEST_TESTS_CMAKE)) { return 0; } if (!suite->silent) { TestSuite_PrintJsonHeader(suite, stdout); if (suite->outfile) { TestSuite_PrintJsonHeader(suite, suite->outfile); } } start_us = bson_get_monotonic_time(); failures += TestSuite_RunAll(suite); MONGOC_DEBUG("Duration of all tests (s): %" PRId64, (bson_get_monotonic_time() - start_us) / (1000 * 1000)); return failures; } void TestSuite_Destroy(TestSuite *suite) { bson_mutex_lock(&gTestMutex); gTestSuite = NULL; bson_mutex_unlock(&gTestMutex); TestVec_destroy(&suite->tests); if (suite->outfile) { fclose(suite->outfile); } mcommon_string_destroy(suite->mock_server_log_buf); bson_free(suite->name); bson_free(suite->prgname); mstr_destroy(&suite->ctest_run); mstr_vec_destroy(&suite->match_patterns); TestSkipVec_destroy(&suite->failing_flaky_skips); } int test_suite_debug_output(void) { int ret; bson_mutex_lock(&gTestMutex); ret = gTestSuite->flags & TEST_DEBUGOUTPUT; bson_mutex_unlock(&gTestMutex); return ret; } MONGOC_PRINTF_FORMAT(1, 2) void test_suite_mock_server_log(const char *msg, ...) { bson_mutex_lock(&gTestMutex); if (gTestSuite->mock_server_log_buf) { mcommon_string_append_t append; mcommon_string_set_append(gTestSuite->mock_server_log_buf, &append); va_list ap; va_start(ap, msg); mcommon_string_append_vprintf(&append, msg, ap); va_end(ap); mcommon_string_append(&append, "\n"); } else if (gTestSuite->mock_server_log) { va_list ap; va_start(ap, msg); vfprintf(gTestSuite->mock_server_log, msg, ap); va_end(ap); fputc('\n', gTestSuite->mock_server_log); fflush(gTestSuite->mock_server_log); } bson_mutex_unlock(&gTestMutex); } bool TestSuite_NoFork(TestSuite *suite) { if (suite->flags & TEST_NOFORK) { return true; } return false; } char * bson_value_to_str(const bson_value_t *val) { bson_t *tmp = bson_new(); BSON_APPEND_VALUE(tmp, "v", val); char *str = bson_as_canonical_extended_json(tmp, NULL); // str is the string: { "v": ... } // remove the prefix and suffix. char *ret = bson_strndup(str + 6, strlen(str) - (6 + 1)); bson_free(str); bson_destroy(tmp); return ret; } bool bson_value_eq(const bson_value_t *a, const bson_value_t *b) { bson_t *tmp_a = bson_new(); bson_t *tmp_b = bson_new(); BSON_APPEND_VALUE(tmp_a, "v", a); BSON_APPEND_VALUE(tmp_b, "v", b); bool ret = bson_equal(tmp_a, tmp_b); bson_destroy(tmp_b); bson_destroy(tmp_a); return ret; } const char * test_bulkwriteexception_str(const mongoc_bulkwriteexception_t *bwe) { bson_error_t _error; const char *_msg = "(none)"; if (mongoc_bulkwriteexception_error(bwe, &_error)) { _msg = _error.message; } return tmp_str("Bulk Write Exception:\n" " Error : %s\n" " Write Errors : %s\n" " Write Concern Errors : %s\n" " Error Reply : %s", _msg, tmp_json(mongoc_bulkwriteexception_writeerrors(bwe)), tmp_json(mongoc_bulkwriteexception_writeconcernerrors(bwe)), tmp_json(mongoc_bulkwriteexception_errorreply(bwe))); } mongo-c-driver-2.2.1/src/libmongoc/tests/TestSuite.h000066400000000000000000001364261511661753600223770ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_SUITE_H #define TEST_SUITE_H #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #ifndef OS_RELEASE_FILE_DIR #define OS_RELEASE_FILE_DIR "src/libmongoc/tests/release_files" #endif #ifndef BINARY_DIR #define BINARY_DIR "src/libmongoc/tests/binary" #endif #ifndef BSON_BINARY_DIR #define BSON_BINARY_DIR "src/libbson/tests/binary" #endif #ifndef JSON_DIR #define JSON_DIR "src/libmongoc/tests/json" #endif #ifndef BSON_JSON_DIR #define BSON_JSON_DIR "src/libbson/tests/json" #endif #ifndef CERT_TEST_DIR #define CERT_TEST_DIR "src/libmongoc/tests/x509gen" #endif #ifdef BSON_OS_WIN32 #include #include static __inline int bson_open(const char *filename, int flags, ...) { int fd = -1; if (_sopen_s(&fd, filename, flags | _O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE) == NO_ERROR) { return fd; } return -1; } #define bson_close _close #define bson_read(f, b, c) ((ssize_t)_read((f), (b), (int)(c))) #define bson_write _write #else #define bson_open open #define bson_read read #define bson_close close #define bson_write write #endif #define TEST_NOFORK (1 << 1) #define TEST_HELPTEXT (1 << 2) #define TEST_DEBUGOUTPUT (1 << 3) #define TEST_TRACE (1 << 4) #define TEST_LISTTESTS (1 << 5) #define TEST_TESTS_CMAKE (1 << 6) #define CERT_CA CERT_TEST_DIR "/ca.pem" #define CERT_CRL CERT_TEST_DIR "/crl.pem" #define CERT_SERVER CERT_TEST_DIR "/server.pem" /* 127.0.0.1 & localhost */ #define CERT_CLIENT CERT_TEST_DIR "/client.pem" #define CERT_ALTNAME \ CERT_TEST_DIR "/altname.pem" /* alternative.mongodb.org \ */ #define CERT_WILD CERT_TEST_DIR "/wild.pem" /* *.mongodb.org */ #define CERT_COMMONNAME CERT_TEST_DIR "/commonName.pem" /* 127.0.0.1 & localhost */ #define CERT_EXPIRED CERT_TEST_DIR "/expired.pem" /* 127.0.0.1 & localhost */ #define CERT_PASSWORD "qwerty" #define CERT_PASSWORD_PROTECTED CERT_TEST_DIR "/password_protected.pem" #ifdef ASSERT #undef ASSERT #endif // Ensure stdout and stderr are flushed prior to possible following abort(). #define MONGOC_STDERR_PRINTF(format, ...) \ if (1) { \ fflush(stdout); \ fprintf(stderr, format, __VA_ARGS__); \ fflush(stderr); \ } else \ ((void)0) #define MONGOC_STDERR_HEXDUMP(pointer, length) \ if (1) { \ const uint8_t *_pointer = (const uint8_t *)(pointer); \ const size_t _length = (length); \ fflush(stdout); \ putc('<', stderr); \ for (size_t _i = 0; _i < _length; _i++) { \ fprintf(stderr, "%s%02x", _i ? " " : "", _pointer[_i]); \ } \ putc('>', stderr); \ fflush(stderr); \ } else \ ((void)0) #define ASSERT(Cond) \ do { \ if (!(Cond)) { \ MONGOC_STDERR_PRINTF( \ "FAIL:%s:%d %s()\n Condition '%s' failed.\n", __FILE__, (int)(__LINE__), BSON_FUNC, BSON_STR(Cond)); \ abort(); \ } \ } while (0) void _test_error(const char *format, ...) BSON_GNUC_PRINTF(1, 2); #define test_error(...) \ if (1) { \ MONGOC_STDERR_PRINTF("test error in: %s %d:%s()\n", __FILE__, (int)(__LINE__), BSON_FUNC); \ _test_error(__VA_ARGS__); \ abort(); /* suppress missing return errors in non-void functions */ \ } else \ ((void)0) #define bson_eq_bson(bson, expected) \ do { \ char *bson_json, *expected_json; \ const uint8_t *bson_data = bson_get_data((bson)); \ const uint8_t *expected_data = bson_get_data((expected)); \ int unequal; \ unsigned o; \ int off = -1; \ unequal = ((expected)->len != (bson)->len) || \ memcmp(bson_get_data((expected)), bson_get_data((bson)), (expected)->len); \ if (unequal) { \ bson_json = bson_as_canonical_extended_json(bson, NULL); \ expected_json = bson_as_canonical_extended_json((expected), NULL); \ for (o = 0; o < (bson)->len && o < (expected)->len; o++) { \ if (bson_data[o] != expected_data[o]) { \ off = o; \ break; \ } \ } \ if (off == -1) { \ off = BSON_MAX((expected)->len, (bson)->len) - 1; \ } \ MONGOC_STDERR_PRINTF("bson objects unequal (byte %d):\n(%s)\n(%s)\n", off, bson_json, expected_json); \ { \ int fd1 = bson_open("failure.bad.bson", O_RDWR | O_CREAT, 0640); \ int fd2 = bson_open("failure.expected.bson", O_RDWR | O_CREAT, 0640); \ ASSERT(fd1 != -1); \ ASSERT(fd2 != -1); \ ASSERT((int)(bson)->len == (int)bson_write(fd1, bson_data, (bson)->len)); \ ASSERT((int)(expected)->len == (int)bson_write(fd2, expected_data, (expected)->len)); \ bson_close(fd1); \ bson_close(fd2); \ } \ abort(); \ } \ } while (0) #ifdef ASSERT_OR_PRINT #undef ASSERT_OR_PRINT #endif #define ASSERT_OR_PRINT(_statement, _err) \ do { \ if (!(_statement)) { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n %s\n\n", \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC, \ BSON_STR(_statement), \ _err.message); \ abort(); \ } \ } while (0) #define ASSERT_CURSOR_NEXT(_cursor, _doc) \ do { \ bson_error_t _err; \ if (!mongoc_cursor_next((_cursor), (_doc))) { \ if (mongoc_cursor_error((_cursor), &_err)) { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n\n", __FILE__, (int)(__LINE__), BSON_FUNC, _err.message); \ } else { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n\n", __FILE__, (int)(__LINE__), BSON_FUNC, "empty cursor"); \ } \ abort(); \ } \ } while (0) #define ASSERT_CURSOR_DONE(_cursor) \ do { \ bson_error_t _err; \ const bson_t *_doc; \ if (mongoc_cursor_next((_cursor), &_doc)) { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n\n", __FILE__, (int)(__LINE__), BSON_FUNC, "non-empty cursor"); \ abort(); \ } \ if (mongoc_cursor_error((_cursor), &_err)) { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n\n", __FILE__, (int)(__LINE__), BSON_FUNC, _err.message); \ abort(); \ } \ } while (0) #define ASSERT_CMPINT_HELPER(a, eq, b, fmt, type) \ do { \ /* evaluate once */ \ type _a = a; \ type _b = b; \ if (!((_a)eq(_b))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: %" fmt " %s %" fmt "\n" \ "%s:%d %s()\n", \ _a, \ BSON_STR(eq), \ _b, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define ASSERT_CMPINT(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "d", int) #define ASSERT_CMPUINT(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "u", unsigned int) #define ASSERT_CMPLONG(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "ld", long) #define ASSERT_CMPULONG(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "lu", unsigned long) #define ASSERT_CMPINT32(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, PRId32, int32_t) #define ASSERT_CMPINT64(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, PRId64, int64_t) #define ASSERT_CMPUINT16(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "hu", uint16_t) #define ASSERT_CMPUINT32(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, PRIu32, uint32_t) #define ASSERT_CMPUINT64(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, PRIu64, uint64_t) #define ASSERT_CMPSIZE_T(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "zu", size_t) #define ASSERT_CMPSSIZE_T(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "zd", ssize_t) #define ASSERT_CMPDOUBLE(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "f", double) #define ASSERT_CMPVOID(a, eq, b) ASSERT_CMPINT_HELPER(a, eq, b, "p", void *) // Returns "true" or "false". The result does _not_ need to be freed. static inline char const * _bool_to_str(bool b) { return b ? "true" : "false"; } #define ASSERT_CMPBOOL(a, eq, b) \ do { \ /* evaluate once */ \ bool _a = a; \ bool _b = b; \ if (!((_a)eq(_b))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: %s %s %s\n%s:%d %s()\n", \ _bool_to_str(_a), \ BSON_STR(eq), \ _bool_to_str(_b), \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define ASSERT_MEMCMP(a, b, n) \ do { \ const void *_a = (a); \ const void *_b = (b); \ const size_t _n = (n); \ if (0 != memcmp(_a, _b, _n)) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: Expected an exact match of %" PRIu64 " bytes:\n ", \ (uint64_t)_n); \ MONGOC_STDERR_HEXDUMP(_a, _n); \ fprintf(stderr, " !=\n "); \ MONGOC_STDERR_HEXDUMP(_b, _n); \ MONGOC_STDERR_PRINTF("\n %s:%d %s()\n", __FILE__, (int)(__LINE__), BSON_FUNC); \ fflush(stderr); \ abort(); \ } \ } while (0) #ifdef ASSERT_ALMOST_EQUAL #undef ASSERT_ALMOST_EQUAL #endif #define ASSERT_ALMOST_EQUAL(a, b) \ do { \ /* evaluate once */ \ int64_t _a = (a); \ int64_t _b = (b); \ if (!(_a > (_b * 2) / 3 && (_a < (_b * 3) / 2))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: %" PRId64 " not within 50%% of %" PRId64 "\n" \ "%s:%d %s()\n", \ _a, \ _b, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #ifdef ASSERT_EQUAL_DOUBLE #undef ASSERT_EQUAL_DOUBLE #endif #define ASSERT_EQUAL_DOUBLE(a, b) \ do { \ double _a = fabs((double)a); \ double _b = fabs((double)b); \ if (!(_a > (_b * 4) / 5 && (_a < (_b * 6) / 5))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: %f not within 20%% of %f\n" \ "%s:%d %s()\n", \ (double)a, \ (double)b, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define ASSERT_CMPSTR(a, b) \ do { \ /* evaluate once */ \ const char *_a = a; \ const char *_b = b; \ if ((_a != _b) && (!_a || !_b || (strcmp(_a, _b) != 0))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure:\n \"%s\"\n !=\n \"%s\"\n %s:%d " \ " %s()\n", \ _a ? _a : "(null)", \ _b ? _b : "(null)", \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define ASSERT_CMPJSON(_a, _b) \ do { \ size_t i = 0; \ char *__a = (char *)(_a); \ char *__b = (char *)(_b); \ char *__aa = bson_malloc0(strlen(__a) + 1); \ char *__bb = bson_malloc0(strlen(__b) + 1); \ char *f = __a; \ do { \ while (bson_isspace(*__a)) \ __a++; \ __aa[i++] = *__a++; \ } while (*__a); \ i = 0; \ do { \ while (bson_isspace(*__b)) \ __b++; \ __bb[i++] = *__b++; \ } while (*__b); \ if (!!strcmp((__aa), (__bb))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: \"%s\" != \"%s\"\n" \ "%s:%d %s()\n", \ __aa, \ __bb, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ bson_free(__aa); \ bson_free(__bb); \ bson_free(f); \ } while (0) #define ASSERT_CMPOID(a, b) \ do { \ if (bson_oid_compare((a), (b))) { \ char oid_a[25]; \ char oid_b[25]; \ bson_oid_to_string((a), oid_a); \ bson_oid_to_string((b), oid_b); \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: " \ "ObjectId(\"%s\") != ObjectId(\"%s\")\n", \ oid_a, \ oid_b); \ abort(); \ } \ } while (0) #define ASSERT_CONTAINS(a, b) \ do { \ char *_a_lower = bson_strdup(a); \ char *_b_lower = bson_strdup(b); \ mongoc_lowercase(_a_lower, _a_lower); \ mongoc_lowercase(_b_lower, _b_lower); \ if (NULL == strstr((_a_lower), (_b_lower))) { \ MONGOC_STDERR_PRINTF("%s:%d %s(): [%s] does not contain [%s]\n", __FILE__, (int)(__LINE__), BSON_FUNC, a, b); \ abort(); \ } \ bson_free(_a_lower); \ bson_free(_b_lower); \ } while (0) #define ASSERT_STARTSWITH(a, b) \ do { \ /* evaluate once */ \ const char *_a = a; \ const char *_b = b; \ if ((_a) != strstr((_a), (_b))) { \ MONGOC_STDERR_PRINTF( \ "%s:%d %s(): : [%s] does not start with [%s]\n", __FILE__, (int)(__LINE__), BSON_FUNC, _a, _b); \ abort(); \ } \ } while (0) #define ASSERT_ERROR_CONTAINS(error, _domain, _code, _message) \ do { \ uint32_t _domain_ = (_domain); \ uint32_t _code_ = (_code); \ if (error.domain != _domain_) { \ MONGOC_STDERR_PRINTF("%s:%d %s(): error domain %" PRIu32 " doesn't match expected %" PRIu32 "\n" \ "error: \"%s\"", \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC, \ error.domain, \ _domain_, \ error.message); \ abort(); \ }; \ if (error.code != _code_) { \ MONGOC_STDERR_PRINTF("%s:%d %s(): error code %" PRIu32 " doesn't match expected %" PRIu32 "\n" \ "error: \"%s\"", \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC, \ error.code, \ _code_, \ error.message); \ abort(); \ }; \ ASSERT_CONTAINS(error.message, _message); \ } while (0) #define ASSERT_CAPTURED_LOG(_info, _level, _msg) \ do { \ if (!has_captured_log(_level, _msg)) { \ MONGOC_STDERR_PRINTF( \ "%s:%d %s(): testing %s didn't log \"%s\"\n", __FILE__, (int)(__LINE__), BSON_FUNC, _info, _msg); \ print_captured_logs("\t"); \ abort(); \ } \ } while (0) #define ASSERT_NO_CAPTURED_LOGS(_info) \ do { \ if (has_captured_logs()) { \ MONGOC_STDERR_PRINTF( \ "%s:%d %s(): testing %s shouldn't have logged:\n", __FILE__, (int)(__LINE__), BSON_FUNC, _info); \ print_captured_logs("\t"); \ abort(); \ } \ } while (0) #define ASSERT_HAS_FIELD(_bson, _field) \ do { \ if (!bson_has_field((_bson), (_field))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: No field \"%s\" in \"%s\"\n", \ (_field), \ bson_as_canonical_extended_json(_bson, NULL)); \ abort(); \ } \ } while (0) #define ASSERT_HAS_NOT_FIELD(_bson, _field) \ do { \ if (bson_has_field((_bson), (_field))) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: Unexpected field \"%s\" in \"%s\"\n", \ (_field), \ bson_as_canonical_extended_json(_bson, NULL)); \ abort(); \ } \ } while (0) #define ASSERT_CMPTIME(actual, maxduration) \ do { \ ASSERT_CMPINT64(actual, <, maxduration); \ } while (0) #define ASSERT_WITHIN_TIME_INTERVAL(actual, minduration, maxduration) \ do { \ ASSERT_CMPINT64(actual, >=, minduration); \ ASSERT_CMPINT64(actual, <, maxduration); \ } while (0) #if defined(_WIN32) && !defined(__MINGW32__) #define gettestpid _getpid #else #ifdef __MINGW32__ #include #endif #define gettestpid getpid #endif #define ASSERT_OR_PRINT_ERRNO(_statement, _errcode) \ do { \ if (!(_statement)) { \ MONGOC_STDERR_PRINTF("FAIL:%s:%d %s()\n %s\n Failed with error code: %d (%s)\n\n", \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC, \ BSON_STR(_statement), \ _errcode, \ strerror(_errcode)); \ abort(); \ } \ } while (0) #define ASSERT_COUNT(n, collection) \ do { \ int count = (int)mongoc_collection_count_documents(collection, tmp_bson("{}"), NULL, NULL, NULL, NULL); \ if ((n) != count) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: count of %s is %d, not %d\n" \ "%s:%d %s()\n", \ mongoc_collection_get_name(collection), \ count, \ n, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define ASSERT_CURSOR_COUNT(_n, _cursor) \ do { \ int _count = 0; \ const bson_t *_doc; \ while (mongoc_cursor_next(_cursor, &_doc)) { \ _count++; \ } \ if ((_n) != _count) { \ MONGOC_STDERR_PRINTF("FAIL\n\nAssert Failure: cursor count is %d, not %d\n" \ "%s:%d %s()\n", \ _count, \ _n, \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ } while (0) #define WAIT_UNTIL(_pred) \ do { \ int64_t _start = bson_get_monotonic_time(); \ while (!(_pred)) { \ if (bson_get_monotonic_time() - _start > 10 * 1000 * 1000) { \ MONGOC_STDERR_PRINTF("Predicate \"%s\" timed out\n" \ " %s:%d %s()\n", \ BSON_STR(_pred), \ __FILE__, \ (int)(__LINE__), \ BSON_FUNC); \ abort(); \ } \ mlib_sleep_for(10, ms); \ } \ } while (0) #define ASSERT_WITH_MSG(_statement, ...) \ do { \ if (!(_statement)) { \ MONGOC_STDERR_PRINTF( \ "FAIL:%s:%d %s()\n %s\n\n", __FILE__, (int)(__LINE__), BSON_FUNC, BSON_STR(_statement)); \ fprintf(stderr, __VA_ARGS__); \ fprintf(stderr, "\n"); \ fflush(stderr); \ abort(); \ } \ } while (0) // bson_value_to_str returns a string representation of a BSON value. // Example: { "$numberInt": "123" } // The return string must be freed with bson_free. char * bson_value_to_str(const bson_value_t *val); // bson_value_eq returns true if both bson_value_t contain equal values. bool bson_value_eq(const bson_value_t *a, const bson_value_t *b); // ASSERT_BSONVALUE_EQ asserts that two const bson_value_t* contain equal // values. #define ASSERT_BSONVALUE_EQ(a, b) \ if (1) { \ if (!bson_value_eq((a), (b))) { \ test_error("%s != %s", bson_value_to_str(a), bson_value_to_str(b)); \ } \ } else \ (void)0 // `test_bulkwriteexception_tostring` returns a temporary string that does not need to be freed. const char * test_bulkwriteexception_str(const mongoc_bulkwriteexception_t *bwe); #define ASSERT_NO_BULKWRITEEXCEPTION(bwr) \ if (bwr.exc) { \ const char *_str = test_bulkwriteexception_str(bwr.exc); \ test_error("Expected no bulk write exception, but got:\n%s", _str); \ } else \ (void)0 #define MAX_TEST_NAME_LENGTH 500 #define MAX_TEST_CHECK_FUNCS 10 typedef void (*TestFunc)(void); typedef void (*TestFuncWC)(void *); typedef void (*TestFuncDtor)(void *); typedef int (*CheckFunc)(void); typedef struct Test Test; typedef struct TestSuite TestSuite; typedef struct _TestFnCtx TestFnCtx; typedef struct TestSkip TestSkip; #define T CheckFunc #define VecName CheckFuncVec #include struct Test { /** * @brief The C string that names the test case */ mstr name; /** * @brief Set of tags that are associated with this test case */ mstr_vec tags; /** * @brief The function that will be executed for the test case */ TestFuncWC func; /** * @brief The function that destroys the context data associated with the test case */ TestFuncDtor dtor; /** * @brief Pointer to arbitrary context data associated with the text case */ void *ctx; /** * @brief The exit code that was received from the test function */ int exit_code; /** * @brief Randomness seed for the test case */ unsigned seed; /** * @brief Array of check functions that determine whether this test case should be skipped */ CheckFuncVec checks; }; static inline void Test_Destroy(Test *t) { if (t->dtor) { t->dtor(t->ctx); } mstr_destroy(&t->name); mstr_vec_destroy(&t->tags); CheckFuncVec_destroy(&t->checks); } #define T Test #define VecName TestVec #define VecDestroyElement Test_Destroy #include /** * @brief Information about a test that we plan to skip */ struct TestSkip { /** * @brief The name of the test that is being skipped */ mstr test_name; /** * @brief If not-null, the description of the sub-test that we are skipping. */ mstr subtest_desc; /** * @brief An explanatory string for why we are skipping the test */ mstr reason; }; static inline void TestSkip_Destroy(TestSkip *skip) { mstr_destroy(&skip->test_name); mstr_destroy(&skip->subtest_desc); mstr_destroy(&skip->reason); } #define T TestSkip #define VecName TestSkipVec #define VecDestroyElement(Skip) TestSkip_Destroy(Skip) #include struct TestSuite { char *prgname; char *name; mstr_vec match_patterns; mstr ctest_run; TestVec tests; FILE *outfile; int flags; int silent; mcommon_string_t *mock_server_log_buf; FILE *mock_server_log; TestSkipVec failing_flaky_skips; }; struct _TestFnCtx { TestFunc test_fn; TestFuncDtor dtor; }; void TestSuite_Init(TestSuite *suite, const char *name, int argc, char **argv); void TestSuite_Add(TestSuite *suite, const char *name_and_tags, TestFunc func); int TestSuite_CheckLive(void); void TestSuite_AddLive(TestSuite *suite, const char *name, TestFunc func); int TestSuite_CheckMockServerAllowed(void); void _TestSuite_AddMockServerTest(TestSuite *suite, const char *name, TestFunc func, ...); #define TestSuite_AddMockServerTest(_suite, _name, ...) _TestSuite_AddMockServerTest(_suite, _name, __VA_ARGS__, NULL) void TestSuite_AddWC(TestSuite *suite, const char *name_and_tags, TestFuncWC func, TestFuncDtor dtor, void *ctx); Test * _V_TestSuite_AddFull( TestSuite *suite, const char *name_and_tags, TestFuncWC func, TestFuncDtor dtor, void *ctx, va_list ap); void TestSuite_AddFull(TestSuite *suite, const char *name_and_tags, TestFuncWC func, TestFuncDtor dtor, void *ctx, ...); void _TestSuite_TestFnCtxDtor(void *ctx); #define TestSuite_AddFull(_suite, _name, _func, _dtor, _ctx, ...) \ (TestSuite_AddFull)(_suite, _name, _func, _dtor, _ctx, __VA_ARGS__, NULL) #define TestSuite_AddFullWithTestFn(_suite, _name, _func, _dtor, _test_fn, ...) \ do { \ TestFnCtx *ctx = bson_malloc(sizeof(TestFnCtx)); \ ctx->test_fn = (TestFunc)(_test_fn); \ ctx->dtor = _dtor; \ TestSuite_AddFull(_suite, _name, _func, _TestSuite_TestFnCtxDtor, ctx, __VA_ARGS__, NULL); \ } while (0) int TestSuite_Run(TestSuite *suite); void TestSuite_Destroy(TestSuite *suite); int test_suite_debug_output(void); void test_suite_mock_server_log(const char *msg, ...); void _process_skip_file(const char *, TestSkipVec *); bool TestSuite_NoFork(TestSuite *suite); #ifdef __cplusplus } #endif #endif /* TEST_SUITE_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/benchmark-tls-pooled.c000066400000000000000000000045161511661753600244450ustar00rootroot00000000000000/* * Used as a benchmark for CDRIVER-4656 to test the performance effect of sharing the OpenSSL context among all clients * in a pool. * * TO BUILD: % cmake --build cmake-build --target benchmark-tls-pooled * TO RUN: % ./cmake-build/src/libmongoc/benchmark-tls-pooled [number of clients to check out] * The integer argument is optional, if not provided 200 clients are created by default. */ #include #include #include #include static void * worker(void *data) { mongoc_client_pool_t *pool = data; mongoc_client_t *client; mongoc_database_t *database; bson_t ping = BSON_INITIALIZER; bson_error_t error; bool r; bson_append_int32(&ping, "ping", 4, 1); client = mongoc_client_pool_pop(pool); database = mongoc_client_get_database(client, "test"); r = mongoc_database_command_with_opts(database, &ping, NULL, NULL, NULL, &error); if (!r) { fprintf(stderr, "Ping failure: %s\n", error.message); } mongoc_client_pool_push(pool, client); bson_destroy(&ping); return NULL; } int main(int argc, char *argv[]) { int num_clients = 200; if (argc > 1) { num_clients = atoi(argv[1]); } mongoc_uri_t *uri; mongoc_client_pool_t *pool; pthread_t threads[num_clients]; void *ret; mongoc_init(); uri = mongoc_uri_new("mongodb://localhost:27017/"); const char *certificate_path; const char *ca_path; // Use built-in test CA and PEM files. certificate_path = "./src/libmongoc/tests/x509gen/client.pem"; ca_path = "./src/libmongoc/tests/x509gen/ca.pem"; mongoc_uri_set_option_as_bool(uri, MONGOC_URI_TLS, true); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, certificate_path); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, ca_path); // Always set maxPoolSize to match client count. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_MAXPOOLSIZE, num_clients); pool = mongoc_client_pool_new(uri); mongoc_client_pool_set_error_api(pool, MONGOC_ERROR_API_VERSION_2); mlib_foreach_irange (i, num_clients) { pthread_create(&threads[i], NULL, worker, pool); } mlib_foreach_irange (i, num_clients) { pthread_join(threads[i], &ret); } mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/tests/binary/000077500000000000000000000000001511661753600215455ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/binary/delete1.dat000066400000000000000000000000471511661753600235630ustar00rootroot00000000000000'ÒÿÿÿÿÖtest.testmongo-c-driver-2.2.1/src/libmongoc/tests/binary/empty.dat000066400000000000000000000000001511661753600233630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/binary/get_more1.dat000066400000000000000000000000521511661753600241160ustar00rootroot00000000000000*ÒÿÿÿÿÕtest.testNa¼mongo-c-driver-2.2.1/src/libmongoc/tests/binary/gridfs-large.dat000066400000000000000000007765121511661753600246270ustar00rootroot00000000000000Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. mongo-c-driver-2.2.1/src/libmongoc/tests/binary/gridfs.dat000066400000000000000000000046721511661753600235260ustar00rootroot00000000000000Bacon ipsum dolor sit amet capicola meatloaf prosciutto, pork swine biltong hamburger brisket pancetta venison fatback tenderloin pastrami frankfurter jowl. Short ribs ball tip rump doner t-bone. Shank flank short loin biltong pig. T-bone swine capicola, pork loin pork chop ribeye cow salami brisket shank meatloaf turducken. Venison short ribs beef, meatloaf salami spare ribs jerky biltong frankfurter bresaola boudin jowl pork loin meatball short loin. Chicken cow tri-tip bacon jerky prosciutto t-bone pork chop pork beef. Strip steak ball tip tail, rump swine pork prosciutto short ribs drumstick venison pork belly beef ribs ribeye. Kevin swine turducken leberkas pastrami filet mignon shoulder brisket. Short loin kevin jerky, t-bone salami turducken ball tip doner boudin fatback turkey pork loin. Pork chop andouille leberkas short loin drumstick bresaola t-bone tenderloin rump shoulder jowl shank beef. Hamburger pork loin pancetta jowl sausage, short ribs flank. Hamburger frankfurter beef fatback spare ribs ribeye. Kielbasa chicken kevin bresaola corned beef tail cow pork chop fatback. Brisket pork chop meatloaf, corned beef flank sausage shank turkey kielbasa kevin. Shoulder shankle salami, filet mignon bacon tenderloin prosciutto kevin flank drumstick ribeye pig. Cow jerky ball tip drumstick sirloin pig pork beef ribs prosciutto leberkas. Ball tip t-bone ham, pig ham hock chuck meatloaf tail boudin turducken. Frankfurter chuck beef corned beef bresaola cow pancetta capicola turkey andouille. Pork ribeye frankfurter pastrami, chuck turkey meatball. Pig t-bone bacon drumstick ham hock capicola pork loin bresaola meatball kevin tri-tip. Biltong beef ribs jowl short ribs drumstick flank, strip steak t-bone sausage capicola pork loin frankfurter corned beef. Doner pork drumstick salami biltong. Pastrami cow ribeye beef drumstick salami, biltong beef ribs flank turducken pork belly meatball spare ribs swine. Flank leberkas doner, pork shank ham hock drumstick pork loin corned beef. Turducken shankle sirloin boudin venison ball tip pancetta. Tenderloin shank ham swine, fatback pastrami ground round kevin beef ribs ham hock turducken spare ribs leberkas meatball. Spare ribs andouille brisket beef ribs tail, bresaola swine. Strip steak bresaola sausage t-bone kevin chicken beef swine corned beef ball tip ham hock jerky kielbasa chuck. Tail venison salami pancetta beef, frankfurter bresaola beef ribs turkey ham ham hock turducken meatball rump jerky. mongo-c-driver-2.2.1/src/libmongoc/tests/binary/insert1.dat000066400000000000000000000002021511661753600236160ustar00rootroot00000000000000‚ÒÿÿÿÿÒtest.testmongo-c-driver-2.2.1/src/libmongoc/tests/binary/kill_cursors1.dat000066400000000000000000000001001511661753600250220ustar00rootroot00000000000000@Òÿÿÿÿ×mongo-c-driver-2.2.1/src/libmongoc/tests/binary/msg1.dat000066400000000000000000000000501511661753600231010ustar00rootroot00000000000000(Òÿÿÿÿèthis is a test message.mongo-c-driver-2.2.1/src/libmongoc/tests/binary/query1.dat000066400000000000000000000000601511661753600234610ustar00rootroot000000000000000ÒÿÿÿÿÔtest.testmongo-c-driver-2.2.1/src/libmongoc/tests/binary/query2.dat000066400000000000000000000000531511661753600234640ustar00rootroot00000000000000+ÒÿÿÿÿÔtest.testmongo-c-driver-2.2.1/src/libmongoc/tests/binary/reply1.dat000066400000000000000000000010301511661753600234450ustar00rootroot00000000000000ÒÿÿÿÿNa¼2dmongo-c-driver-2.2.1/src/libmongoc/tests/binary/reply2.dat000066400000000000000000000375541511661753600234720ustar00rootroot00000000000000l?ÒNa¼d¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.¢this is some really long here or something or otherdthis is some stupid short value or something. blah. blah blah. blah blah blah. blah blah blah blah.mongo-c-driver-2.2.1/src/libmongoc/tests/binary/update1.dat000066400000000000000000000000541511661753600236010ustar00rootroot00000000000000,ÒÿÿÿÿÑtest.testmongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/000077500000000000000000000000001511661753600221205ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-match.c000066400000000000000000000533631511661753600243310ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include // hex_to_bin #include #include #include #include #include typedef struct _special_functor_t { special_fn fn; void *user_data; char *keyword; struct _special_functor_t *next; } special_functor_t; struct _bson_matcher_t { special_functor_t *specials; }; #define MATCH_ERR(format, ...) test_set_error(error, "match error at path: '%s': " format, context->path, __VA_ARGS__) static char * get_first_key(const bson_t *bson) { bson_iter_t iter; bson_iter_init(&iter, bson); if (!bson_iter_next(&iter)) { return ""; } return (char *)bson_iter_key(&iter); } static bool is_special_match(const bson_t *bson) { char *first_key = get_first_key(bson); if (strstr(first_key, "$$") != first_key) { return false; } if (bson_count_keys(bson) != 1) { return false; } return true; } /* implements $$placeholder */ static bool special_placeholder(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { BSON_UNUSED(context); BSON_UNUSED(assertion); BSON_UNUSED(actual); BSON_UNUSED(user_data); BSON_UNUSED(error); /* Nothing to do (not an operator, just a reserved key value). The meaning * and corresponding behavior of $$placeholder depends on context. */ return true; } /* implements $$exists */ static bool special_exists(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; bson_iter_t iter; bool should_exist; BSON_UNUSED(context); BSON_UNUSED(user_data); bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!BSON_ITER_HOLDS_BOOL(&iter)) { MATCH_ERR("%s", "unexpected non-bool $$exists assertion"); } should_exist = bson_iter_bool(&iter); if (should_exist && NULL == actual) { MATCH_ERR("%s", "should exist but does not"); goto done; } if (!should_exist && NULL != actual) { MATCH_ERR("%s", "should not exist but does"); goto done; } ret = true; done: return ret; } /* implements $$type */ static bool special_type(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; bson_iter_t iter; BSON_UNUSED(context); BSON_UNUSED(user_data); bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!actual) { MATCH_ERR("%s", "does not exist but should"); goto done; } if (BSON_ITER_HOLDS_UTF8(&iter)) { bson_type_t expected_type = bson_type_from_string(bson_iter_utf8(&iter, NULL)); if (expected_type != bson_val_type(actual)) { MATCH_ERR("expected type: %s, got: %s", bson_type_to_string(expected_type), bson_type_to_string(bson_val_type(actual))); goto done; } } if (BSON_ITER_HOLDS_ARRAY(&iter)) { bson_t arr; bson_iter_t arriter; bool found = false; bson_iter_bson(&iter, &arr); BSON_FOREACH(&arr, arriter) { bson_type_t expected_type; if (!BSON_ITER_HOLDS_UTF8(&arriter)) { MATCH_ERR("%s", "unexpected non-UTF8 $$type assertion"); goto done; } expected_type = bson_type_from_string(bson_iter_utf8(&arriter, NULL)); if (expected_type == bson_val_type(actual)) { found = true; break; } } if (!found) { MATCH_ERR("expected one of type: %s, got %s", tmp_json(&arr), bson_type_to_string(bson_val_type(actual))); goto done; } } ret = true; done: return ret; } /* implements $$unsetOrMatches */ static bool special_unset_or_matches(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; bson_iter_t iter; bson_val_t *expected = NULL; BSON_UNUSED(user_data); bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); expected = bson_val_from_iter(&iter); if (actual == NULL) { ret = true; goto done; } if (!bson_matcher_match(context, expected, actual, error)) { goto done; } ret = true; done: bson_val_destroy(expected); return ret; } /* implements $$matchesHexBytes */ static bool special_matches_hex_bytes(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; uint8_t *expected_bytes; size_t expected_bytes_len; const uint8_t *actual_bytes; size_t actual_bytes_len; uint32_t actual_bytes_len_u32; char *expected_bytes_string = NULL; char *actual_bytes_string = NULL; bson_iter_t iter; BSON_UNUSED(context); BSON_UNUSED(user_data); bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!actual) { MATCH_ERR("%s", "does not exist but should"); goto done; } if (!BSON_ITER_HOLDS_UTF8(&iter)) { MATCH_ERR("%s", "$$matchesHexBytes does not contain utf8"); goto done; } if (bson_val_type(actual) != BSON_TYPE_BINARY) { MATCH_ERR("%s", "value does not contain binary"); goto done; } expected_bytes = hex_to_bin(bson_iter_utf8(&iter, NULL), &expected_bytes_len); actual_bytes = bson_val_to_binary(actual, &actual_bytes_len_u32); actual_bytes_len = actual_bytes_len_u32; expected_bytes_string = bin_to_hex(expected_bytes, expected_bytes_len); actual_bytes_string = bin_to_hex(actual_bytes, actual_bytes_len); if (expected_bytes_len != actual_bytes_len) { MATCH_ERR("expected %zu (%s) but got %zu (%s) bytes", expected_bytes_len, expected_bytes_string, actual_bytes_len, actual_bytes_string); bson_free(expected_bytes); bson_free(expected_bytes_string); bson_free(actual_bytes_string); goto done; } if (0 != memcmp(expected_bytes, actual_bytes, expected_bytes_len)) { MATCH_ERR("expected %s, but got %s", expected_bytes_string, actual_bytes_string); bson_free(expected_bytes); bson_free(expected_bytes_string); bson_free(actual_bytes_string); goto done; } bson_free(expected_bytes); bson_free(expected_bytes_string); bson_free(actual_bytes_string); ret = true; done: return ret; } /* implements $$matchAsDocument */ static bool special_match_as_document(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; bson_t actual_as_bson = BSON_INITIALIZER; BSON_UNUSED(user_data); bson_iter_t iter; bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { MATCH_ERR("%s", "$$matchAsDocument does not contain a document"); goto done; } if (!actual) { MATCH_ERR("%s", "does not exist but should"); goto done; } if (bson_val_type(actual) != BSON_TYPE_UTF8) { MATCH_ERR("%s", "value type is not utf8"); goto done; } const char *actual_json = bson_val_to_utf8(actual); if (!bson_init_from_json(&actual_as_bson, actual_json, -1, error)) { MATCH_ERR("%s", "value can't be parsed as JSON"); goto done; } bson_val_t *expected_val = bson_val_from_iter(&iter); bson_val_t *actual_val = bson_val_from_bson(&actual_as_bson); ret = bson_matcher_match(context, expected_val, actual_val, error); bson_val_destroy(actual_val); bson_val_destroy(expected_val); bson_destroy(&actual_as_bson); done: return ret; } /* implements $$matchAsRoot */ static bool special_match_as_root(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; BSON_UNUSED(user_data); bson_iter_t iter; bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { MATCH_ERR("%s", "$$matchAsRoot does not contain a document"); goto done; } if (!actual) { MATCH_ERR("%s", "does not exist but should"); goto done; } if (bson_val_type(actual) != BSON_TYPE_DOCUMENT) { MATCH_ERR("%s", "value is not a document"); goto done; } bson_matcher_context_t as_root_context = *context; as_root_context.is_root = true; bson_val_t *expected_val = bson_val_from_iter(&iter); ret = bson_matcher_match(&as_root_context, expected_val, actual, error); bson_val_destroy(expected_val); done: return ret; } static bool evaluate_special(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, bson_error_t *error) { bson_iter_t iter; const char *assertion_key; special_functor_t *special_iter; bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); assertion_key = bson_iter_key(&iter); LL_FOREACH(context->matcher->specials, special_iter) { if (0 == strcmp(assertion_key, special_iter->keyword)) { return special_iter->fn(context, assertion, actual, special_iter->user_data, error); } } MATCH_ERR("unrecognized special operator: %s", assertion_key); return false; } bson_matcher_t * bson_matcher_new(void) { bson_matcher_t *matcher = bson_malloc0(sizeof(bson_matcher_t)); /* Add default special functions. */ bson_matcher_add_special(matcher, "$$placeholder", special_placeholder, NULL); bson_matcher_add_special(matcher, "$$exists", special_exists, NULL); bson_matcher_add_special(matcher, "$$type", special_type, NULL); bson_matcher_add_special(matcher, "$$unsetOrMatches", special_unset_or_matches, NULL); bson_matcher_add_special(matcher, "$$matchesHexBytes", special_matches_hex_bytes, NULL); bson_matcher_add_special(matcher, "$$matchAsDocument", special_match_as_document, NULL); bson_matcher_add_special(matcher, "$$matchAsRoot", special_match_as_root, NULL); return matcher; } /* Add a hook function for matching a special $$ operator */ void bson_matcher_add_special(bson_matcher_t *matcher, const char *keyword, special_fn special, void *user_data) { special_functor_t *functor; if (strstr(keyword, "$$") != keyword) { test_error("unexpected special match keyword: %s. Should start with '$$'", keyword); } functor = bson_malloc(sizeof(special_functor_t)); functor->keyword = bson_strdup(keyword); functor->fn = special; functor->user_data = user_data; LL_PREPEND(matcher->specials, functor); } void bson_matcher_destroy(bson_matcher_t *matcher) { special_functor_t *special_iter, *tmp; if (!matcher) { return; } LL_FOREACH_SAFE(matcher->specials, special_iter, tmp) { bson_free(special_iter->keyword); bson_free(special_iter); } bson_free(matcher); } bool bson_matcher_match(const bson_matcher_context_t *context, const bson_val_t *expected, const bson_val_t *actual, bson_error_t *error) { bool ret = false; if (bson_val_type(expected) == BSON_TYPE_DOCUMENT) { bson_iter_t expected_iter; const bson_t *expected_bson = bson_val_to_document(expected); const bson_t *actual_bson = NULL; uint32_t expected_keys; uint32_t actual_keys; /* handle special operators (e.g. $$type) */ if (is_special_match(expected_bson)) { ret = evaluate_special(context, expected_bson, actual, error); goto done; } if (bson_val_type(actual) != BSON_TYPE_DOCUMENT) { MATCH_ERR("expected type document, got %s", bson_type_to_string(bson_val_type(actual))); goto done; } actual_bson = bson_val_to_document(actual); BSON_FOREACH(expected_bson, expected_iter) { const char *key; bson_val_t *expected_val = NULL; bson_val_t *actual_val = NULL; bson_iter_t actual_iter; key = bson_iter_key(&expected_iter); expected_val = bson_val_from_iter(&expected_iter); if (bson_iter_init_find(&actual_iter, actual_bson, key)) { actual_val = bson_val_from_iter(&actual_iter); } if (bson_val_type(expected_val) == BSON_TYPE_DOCUMENT && is_special_match(bson_val_to_document(expected_val))) { char *path_child = bson_strdup_printf("%s.%s", context->path, key); bson_matcher_context_t special_context = {.matcher = context->matcher, .path = path_child}; bool special_ret = evaluate_special(&special_context, bson_val_to_document(expected_val), actual_val, error); bson_free(path_child); bson_val_destroy(expected_val); bson_val_destroy(actual_val); if (!special_ret) { goto done; } continue; } if (NULL == actual_val) { MATCH_ERR("key '%s' is not present", key); bson_val_destroy(expected_val); bson_val_destroy(actual_val); goto done; } char *path_child = bson_strdup_printf("%s.%s", context->path, key); bson_matcher_context_t document_child_context = { .matcher = context->matcher, .path = path_child, }; bool document_child_ret = bson_matcher_match(&document_child_context, expected_val, actual_val, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); bson_free(path_child); if (!document_child_ret) { goto done; } } expected_keys = bson_count_keys(expected_bson); actual_keys = bson_count_keys(actual_bson); /* Unified test format spec: "When matching root-level documents, test * runners MUST permit the actual document to contain additional fields * not present in the expected document."" * * This logic must also handle the case where `expected` is one of any * number of root documents within an array (i.e. cursor result); see * array_child_context below. */ if (!context->is_root && expected_keys < actual_keys) { MATCH_ERR("expected %" PRIu32 " keys in document, got: %" PRIu32, expected_keys, actual_keys); goto done; } ret = true; goto done; } if (bson_val_type(expected) == BSON_TYPE_ARRAY) { bson_iter_t expected_iter; const bson_t *expected_bson = bson_val_to_array(expected); const bson_t *actual_bson = NULL; uint32_t expected_keys = bson_count_keys(expected_bson); uint32_t actual_keys; if (bson_val_type(actual) != BSON_TYPE_ARRAY) { MATCH_ERR("expected array, but got: %s", bson_type_to_string(bson_val_type(actual))); goto done; } actual_bson = bson_val_to_array(actual); actual_keys = bson_count_keys(actual_bson); if (expected_keys != actual_keys) { MATCH_ERR("expected array of size %" PRIu32 ", but got array of size: %" PRIu32, expected_keys, actual_keys); goto done; } BSON_FOREACH(expected_bson, expected_iter) { bson_val_t *expected_val = bson_val_from_iter(&expected_iter); bson_val_t *actual_val = NULL; bson_iter_t actual_iter; const char *key; key = bson_iter_key(&expected_iter); if (!bson_iter_init_find(&actual_iter, actual_bson, key)) { MATCH_ERR("expected array index: %s, but did not exist", key); bson_val_destroy(expected_val); bson_val_destroy(actual_val); goto done; } actual_val = bson_val_from_iter(&actual_iter); char *path_child = bson_strdup_printf("%s.%s", context->path, key); bson_matcher_context_t array_child_context = { .matcher = context->matcher, .path = path_child, .is_root = context->is_root && context->array_of_root_docs, }; bool array_child_ret = bson_matcher_match(&array_child_context, expected_val, actual_val, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); bson_free(path_child); if (!array_child_ret) { goto done; } } ret = true; goto done; } if (!bson_val_eq(expected, actual, BSON_VAL_FLEXIBLE_NUMERICS)) { MATCH_ERR("value %s != %s", bson_val_to_json(expected), bson_val_to_json(actual)); goto done; } ret = true; done: if (!ret && context->is_root) { /* Append the error with more context at the root match. */ bson_error_t tmp_error; memcpy(&tmp_error, error, sizeof(bson_error_t)); test_set_error(error, "BSON match failed: %s\n" "Expected: %s\n" "Actual: %s", tmp_error.message, bson_val_to_json(expected), bson_val_to_json(actual)); } return ret; } bool bson_match(const bson_val_t *expected, const bson_val_t *actual, bool array_of_root_docs, bson_error_t *error) { bson_matcher_context_t root_context = { .matcher = bson_matcher_new(), .path = "", .is_root = true, .array_of_root_docs = array_of_root_docs, }; bool matched = bson_matcher_match(&root_context, expected, actual, error); bson_matcher_destroy(root_context.matcher); return matched; } typedef struct { const char *desc; const char *expected; const char *actual; bool expect_match; } testcase_t; static void test_match(void) { testcase_t tests[] = { {"int32 ==", "{'a': 1}", "{'a': 1}", true}, {"int32 !=", "{'a': 1}", "{'a': 0}", false}, {"$$exists", "{'a': {'$$exists': true}}", "{'a': 0}", true}, {"$$exists fail", "{'a': {'$$exists': true}}", "{'b': 0}", false}, {"does not $$exists", "{'a': {'$$exists': false}}", "{'b': 0}", true}, {"$$unsetOrMatches match", "{'a': {'$$unsetOrMatches': 1}}", "{'a': 1}", true}, {"$$unsetOrMatches unset", "{'a': {'$$unsetOrMatches': 1}}", "{}", true}, {"$$unsetOrMatches mismatch", "{'a': {'$$unsetOrMatches': 'abc'}}", "{'a': 1}", false}, {"$$type match", "{'a': {'$$type': 'string'}}", "{'a': 'abc'}", true}, {"$$type mismatch", "{'a': {'$$type': 'string'}}", "{'a': 1}", false}, {"$$type array match", "{'a': {'$$type': ['string', 'int']}}", "{'a': 1}", true}, {"$$type array mismatch", "{'a': {'$$type': ['string', 'int']}}", "{'a': 1.2}", false}, {"extra keys in root ok", "{'a': 1}", "{'a': 1, 'b': 2}", true}, {"extra keys in subdoc not ok", "{'a': {'b': 1}}", "{'a': {'b': 1, 'c': 2}}", false}, {"extra keys in subdoc allowed explicitly", "{'a': {'$$matchAsRoot': {'b': 1}}}", "{'a': {'b': 1, 'c': 2}}", true}, {"missing key in matchAsRoot subdoc", "{'a': {'$$matchAsRoot': {'b': 1, 'd': 1}}}", "{'a': {'b': 1, 'c': 2}}", false}, {"$$matchAsDocument match", "{'a': {'$$matchAsDocument': {'b': 'abc'}}}", "{'a': '{\\'b\\':\\'abc\\'}'}", true}, {"$$matchAsDocument mismatch", "{'a': {'$$matchAsDocument': {'b': 'abc'}}}", "{'a': '{\\'b\\':\\'xyz\\'}'}", false}, {"$$matchAsDocument parse error", "{'a': {'$$matchAsDocument': {'b': 'abc'}}}", "{'a': 'nope'}", false}, {"$$matchAsDocument extra keys not ok", "{'a': {'$$matchAsDocument': {'b': 'abc'}}}", "{'a': '{\\'b\\':\\'abc\\',\\'c\\':1}'}", false}, {"$$matchAsDocument and $$matchAsRoot, extra keys ok", "{'a': {'$$matchAsDocument': {'$$matchAsRoot': {'b': 'abc'}}}}", "{'a': '{\\'b\\':\\'abc\\',\\'c\\':1}'}", true}, {"numeric type mismatch is ok", "{'a': 1}", "{'a': 1.0}", true}, {"comparing number to string is an error", "{'a': 1}", "{'a': 'foo'}", false}}; mlib_foreach_arr (testcase_t, test, tests) { bson_error_t error; bson_val_t *expected = bson_val_from_json(test->expected); bson_val_t *actual = bson_val_from_json(test->actual); bool ret; ret = bson_match(expected, actual, false, &error); if (test->expect_match) { if (!ret) { test_error("%s: did not match with error: %s, but should have", test->desc, error.message); } } else { if (ret) { test_error("%s: matched, but should not have", test->desc); } } bson_val_destroy(expected); bson_val_destroy(actual); } } void test_bson_match_install(TestSuite *suite) { TestSuite_Add(suite, "/unified/selftest/bson/match", test_match); } mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-match.h000066400000000000000000000044011511661753600243230ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSONUTIL_BSON_MATCH_H #define BSONUTIL_BSON_MATCH_H #include /* Matches bson values in accordance with the unified test format's "Evaluating * Matches" rules. */ bool bson_match(const bson_val_t *expected, const bson_val_t *actual, bool array_of_root_docs, bson_error_t *error); /* A bson_matcher_t may be used to extend the default matching behavior. */ typedef struct _bson_matcher_t bson_matcher_t; bson_matcher_t * bson_matcher_new(void); /* Current state of an ongoing match operation, of interest to custom operators. * Each recursion level has its own instance on the stack. */ typedef struct bson_matcher_context_t { bson_matcher_t *matcher; const char *path; bool is_root; bool array_of_root_docs; } bson_matcher_context_t; typedef bool (*special_fn)(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error); /* Adds a handler function for matching a special $$ operator. * * Example: * bson_matcher_add_special (matcher, "$$custom", custom_matcher, NULL); * This would call custom_matcher whenever a "$$custom" key is encountered in an * expectation. */ void bson_matcher_add_special(bson_matcher_t *matcher, const char *keyword, special_fn special, void *user_data); bool bson_matcher_match(const bson_matcher_context_t *context, const bson_val_t *expected, const bson_val_t *actual, bson_error_t *error); void bson_matcher_destroy(bson_matcher_t *matcher); #endif /* BSONUTIL_BSON_MATCH_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-parser.c000066400000000000000000000431571511661753600245310ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include typedef enum { BSON_PARSER_UTF8, BSON_PARSER_INT, BSON_PARSER_BOOL, BSON_PARSER_DOC, BSON_PARSER_ARRAY, BSON_PARSER_ARRAY_OR_DOC, BSON_PARSER_ANY, BSON_PARSER_WRITE_CONCERN, BSON_PARSER_READ_CONCERN, BSON_PARSER_READ_PREFS } bson_parser_type_t; typedef struct _bson_parser_entry_t { bson_parser_type_t ptype; bool optional; void *out; char *key; bool set; struct _bson_parser_entry_t *next; } bson_parser_entry_t; struct _bson_parser_t { bson_parser_entry_t *entries; bool allow_extra; bson_t *extra; }; static const char * parser_type_to_string(bson_parser_type_t ptype) { switch (ptype) { case BSON_PARSER_UTF8: return "UTF8"; case BSON_PARSER_INT: return "INT"; case BSON_PARSER_BOOL: return "BOOL"; case BSON_PARSER_DOC: return "DOC"; case BSON_PARSER_ARRAY: return "ARRAY"; case BSON_PARSER_ARRAY_OR_DOC: return "ARRAY or DOC"; case BSON_PARSER_ANY: return "ANY"; case BSON_PARSER_WRITE_CONCERN: return "WRITE_CONCERN"; case BSON_PARSER_READ_CONCERN: return "READ_CONCERN"; case BSON_PARSER_READ_PREFS: return "READ_PREFS"; default: return "INVALID"; } } static mongoc_write_concern_t * bson_to_write_concern(bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; mongoc_write_concern_t *out = NULL; bool *journal = NULL; bson_val_t *w_val = NULL; int64_t *wtimeoutms; parser = bson_parser_new(); bson_parser_bool_optional(parser, "journal", &journal); bson_parser_any_optional(parser, "w", &w_val); bson_parser_int_optional(parser, "wTimeoutMS", &wtimeoutms); if (!bson_parser_parse(parser, bson, error)) { goto done; } out = mongoc_write_concern_new(); if (journal) { mongoc_write_concern_set_journal(out, *journal); } if (w_val) { if (bson_val_is_numeric(w_val)) { mongoc_write_concern_set_w(out, (int32_t)bson_val_convert_int64(w_val)); } else if (bson_val_type(w_val) == BSON_TYPE_UTF8 && 0 == strcmp(bson_val_to_utf8(w_val), "majority")) { mongoc_write_concern_set_w(out, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { test_set_error(error, "unrecognized value for 'w': %s", bson_val_to_json(w_val)); } } if (wtimeoutms) { mongoc_write_concern_set_wtimeout_int64(out, *wtimeoutms); } done: bson_parser_destroy_with_parsed_fields(parser); return out; } static mongoc_read_concern_t * bson_to_read_concern(bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; mongoc_read_concern_t *out = NULL; char *level = NULL; parser = bson_parser_new(); bson_parser_utf8_optional(parser, "level", &level); if (!bson_parser_parse(parser, bson, error)) { goto done; } out = mongoc_read_concern_new(); if (level) { mongoc_read_concern_set_level(out, level); } done: bson_parser_destroy_with_parsed_fields(parser); return out; } /* Returns 0 on error. */ static mongoc_read_mode_t string_to_read_mode(char *str, bson_error_t *error) { if (0 == bson_strcasecmp("primary", str)) { return MONGOC_READ_PRIMARY; } else if (0 == bson_strcasecmp("primarypreferred", str)) { return MONGOC_READ_PRIMARY_PREFERRED; } else if (0 == bson_strcasecmp("secondary", str)) { return MONGOC_READ_SECONDARY; } else if (0 == bson_strcasecmp("secondarypreferred", str)) { return MONGOC_READ_SECONDARY_PREFERRED; } else if (0 == bson_strcasecmp("nearest", str)) { return MONGOC_READ_NEAREST; } test_set_error(error, "Invalid read mode: %s", str); return 0; } static mongoc_read_prefs_t * bson_to_read_prefs(bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; mongoc_read_prefs_t *out = NULL; char *mode_string = NULL; mongoc_read_mode_t read_mode; bson_t *tag_sets = NULL; int64_t *max_staleness_seconds; bson_t *hedge = NULL; parser = bson_parser_new(); bson_parser_utf8(parser, "mode", &mode_string); bson_parser_array_optional(parser, "tagSets", &tag_sets); bson_parser_int_optional(parser, "maxStalenessSeconds", &max_staleness_seconds); bson_parser_doc_optional(parser, "hedge", &hedge); if (!bson_parser_parse(parser, bson, error)) { goto done; } read_mode = string_to_read_mode(mode_string, error); if (read_mode == 0) { goto done; } out = mongoc_read_prefs_new(read_mode); if (tag_sets) { mongoc_read_prefs_set_tags(out, tag_sets); } if (max_staleness_seconds) { mongoc_read_prefs_set_max_staleness_seconds(out, *max_staleness_seconds); } if (hedge) { mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); mongoc_read_prefs_set_hedge(out, hedge); mlib_diagnostic_pop(); } done: bson_parser_destroy_with_parsed_fields(parser); return out; } bson_parser_t * bson_parser_new(void) { bson_parser_t *parser = NULL; parser = bson_malloc0(sizeof(bson_parser_t)); parser->extra = bson_new(); return parser; } void bson_parser_allow_extra(bson_parser_t *parser, bool val) { BSON_ASSERT(parser); parser->allow_extra = val; } const bson_t * bson_parser_get_extra(const bson_parser_t *parser) { BSON_ASSERT(parser); return parser->extra; } static void bson_parser_entry_destroy(bson_parser_entry_t *entry, bool with_parsed_fields) { if (with_parsed_fields) { if (entry->ptype == BSON_PARSER_DOC || entry->ptype == BSON_PARSER_ARRAY || entry->ptype == BSON_PARSER_ARRAY_OR_DOC) { bson_t **out; out = (bson_t **)entry->out; bson_destroy(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_BOOL) { bool **out; out = (bool **)entry->out; bson_free(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_UTF8) { char **out; out = (char **)entry->out; bson_free(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_INT) { int64_t **out; out = (int64_t **)entry->out; bson_free(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_ANY) { bson_val_t **out; out = (bson_val_t **)entry->out; bson_val_destroy(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_WRITE_CONCERN) { mongoc_write_concern_t **out; out = (mongoc_write_concern_t **)entry->out; mongoc_write_concern_destroy(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_READ_CONCERN) { mongoc_read_concern_t **out; out = (mongoc_read_concern_t **)entry->out; mongoc_read_concern_destroy(*out); *out = NULL; } else if (entry->ptype == BSON_PARSER_READ_PREFS) { mongoc_read_prefs_t **out; out = (mongoc_read_prefs_t **)entry->out; mongoc_read_prefs_destroy(*out); *out = NULL; } } bson_free(entry->key); bson_free(entry); } static void bson_parser_destroy_helper(bson_parser_t *parser, bool with_parsed_fields) { bson_parser_entry_t *entry, *tmp; if (!parser) { return; } LL_FOREACH_SAFE(parser->entries, entry, tmp) { bson_parser_entry_destroy(entry, with_parsed_fields); } bson_destroy(parser->extra); bson_free(parser); } void bson_parser_destroy(bson_parser_t *parser) { bson_parser_destroy_helper(parser, false); } /* This additionally destroys the destination of each parsed field. */ void bson_parser_destroy_with_parsed_fields(bson_parser_t *parser) { bson_parser_destroy_helper(parser, true); } static void bson_parser_add_entry(bson_parser_t *parser, const char *key, void *out, bson_parser_type_t ptype, bool optional) { bson_parser_entry_t *e = NULL; bson_parser_entry_t *match = NULL; e = bson_malloc0(sizeof(*e)); e->optional = optional; e->ptype = ptype; e->out = out; e->key = bson_strdup(key); /* Check if an entry already exists for this key. */ LL_FOREACH(parser->entries, match) { if (0 == strcmp(match->key, key)) { break; } } if (match != NULL) { test_error("Invalid parser configuration. Attempted to add duplicated " "type for %s.", key); } LL_PREPEND(parser->entries, e); } void bson_parser_utf8(bson_parser_t *parser, const char *key, char **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_UTF8, false); } void bson_parser_utf8_optional(bson_parser_t *parser, const char *key, char **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_UTF8, true); } void bson_parser_doc(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_DOC, false); } void bson_parser_doc_optional(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_DOC, true); } void bson_parser_array(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_ARRAY, false); } void bson_parser_array_optional(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_ARRAY, true); } void bson_parser_array_or_doc(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_ARRAY_OR_DOC, false); } void bson_parser_array_or_doc_optional(bson_parser_t *parser, const char *key, bson_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_ARRAY_OR_DOC, true); } void bson_parser_bool(bson_parser_t *parser, const char *key, bool **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_BOOL, false); } void bson_parser_bool_optional(bson_parser_t *parser, const char *key, bool **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_BOOL, true); } void bson_parser_int(bson_parser_t *parser, const char *key, int64_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_INT, false); } void bson_parser_int_optional(bson_parser_t *parser, const char *key, int64_t **out) { *out = NULL; bson_parser_add_entry(parser, key, (void *)out, BSON_PARSER_INT, true); } void bson_parser_any(bson_parser_t *bp, const char *key, bson_val_t **out) { *out = NULL; bson_parser_add_entry(bp, key, (void *)out, BSON_PARSER_ANY, false); } void bson_parser_any_optional(bson_parser_t *bp, const char *key, bson_val_t **out) { *out = NULL; bson_parser_add_entry(bp, key, (void *)out, BSON_PARSER_ANY, true); } void bson_parser_write_concern(bson_parser_t *bp, mongoc_write_concern_t **out) { *out = NULL; bson_parser_add_entry(bp, "writeConcern", (void *)out, BSON_PARSER_WRITE_CONCERN, false); } void bson_parser_write_concern_optional(bson_parser_t *bp, mongoc_write_concern_t **out) { *out = NULL; bson_parser_add_entry(bp, "writeConcern", (void *)out, BSON_PARSER_WRITE_CONCERN, true); } void bson_parser_read_concern(bson_parser_t *bp, mongoc_read_concern_t **out) { *out = NULL; bson_parser_add_entry(bp, "readConcern", (void *)out, BSON_PARSER_READ_CONCERN, false); } void bson_parser_read_concern_optional(bson_parser_t *bp, mongoc_read_concern_t **out) { *out = NULL; bson_parser_add_entry(bp, "readConcern", (void *)out, BSON_PARSER_READ_CONCERN, true); } void bson_parser_read_prefs(bson_parser_t *bp, mongoc_read_prefs_t **out) { *out = NULL; bson_parser_add_entry(bp, "readPreference", (void *)out, BSON_PARSER_READ_PREFS, false); } void bson_parser_read_prefs_optional(bson_parser_t *bp, mongoc_read_prefs_t **out) { *out = NULL; bson_parser_add_entry(bp, "readPreference", (void *)out, BSON_PARSER_READ_PREFS, true); } void marshal_error(const char *key, bson_type_t btype, bson_parser_type_t ptype, bson_error_t *error) { test_set_error( error, "expecting %s for '%s' but got: %s", parser_type_to_string(ptype), key, bson_type_to_string(btype)); } bool entry_marshal(bson_parser_entry_t *entry, bson_iter_t *iter, bson_error_t *error) { bool ret = false; const char *key; bson_type_t btype; bson_parser_type_t ptype; ptype = entry->ptype; key = bson_iter_key(iter); btype = bson_iter_type(iter); if (ptype == BSON_PARSER_UTF8) { char **out = (char **)entry->out; if (btype != BSON_TYPE_UTF8) { marshal_error(key, btype, ptype, error); goto done; } *out = bson_strdup(bson_iter_utf8(iter, NULL)); } else if (ptype == BSON_PARSER_INT) { int64_t **out = (int64_t **)entry->out; if (btype != BSON_TYPE_INT32 && btype != BSON_TYPE_INT64) { marshal_error(key, btype, ptype, error); goto done; } *out = bson_malloc0(sizeof(int64_t)); **out = bson_iter_as_int64(iter); } else if (ptype == BSON_PARSER_BOOL) { bool **out = (bool **)entry->out; if (btype != BSON_TYPE_BOOL) { marshal_error(key, btype, ptype, error); goto done; } *out = bson_malloc0(sizeof(bool)); **out = bson_iter_bool(iter); } else if (ptype == BSON_PARSER_DOC) { bson_t tmp; bson_t **out = (bson_t **)entry->out; if (btype != BSON_TYPE_DOCUMENT) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_copy(&tmp); } else if (ptype == BSON_PARSER_ARRAY) { bson_t tmp; bson_t **out = (bson_t **)entry->out; if (btype != BSON_TYPE_ARRAY) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_copy(&tmp); } else if (ptype == BSON_PARSER_ARRAY_OR_DOC) { bson_t tmp; bson_t **out = (bson_t **)entry->out; if (btype != BSON_TYPE_ARRAY && btype != BSON_TYPE_DOCUMENT) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_copy(&tmp); } else if (ptype == BSON_PARSER_ANY) { bson_val_t **out = (bson_val_t **)entry->out; *out = bson_val_from_iter(iter); } else if (ptype == BSON_PARSER_WRITE_CONCERN) { bson_t tmp; mongoc_write_concern_t **out = (mongoc_write_concern_t **)entry->out; if (btype != BSON_TYPE_DOCUMENT) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_to_write_concern(&tmp, error); if (!*out) { goto done; } } else if (ptype == BSON_PARSER_READ_CONCERN) { bson_t tmp; mongoc_read_concern_t **out = (mongoc_read_concern_t **)entry->out; if (btype != BSON_TYPE_DOCUMENT) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_to_read_concern(&tmp, error); } else if (ptype == BSON_PARSER_READ_PREFS) { bson_t tmp; mongoc_read_prefs_t **out = (mongoc_read_prefs_t **)entry->out; if (btype != BSON_TYPE_DOCUMENT) { marshal_error(key, btype, ptype, error); goto done; } bson_iter_bson(iter, &tmp); *out = bson_to_read_prefs(&tmp, error); } else { test_set_error(error, "unimplemented parser type: %s", parser_type_to_string(ptype)); goto done; } ret = true; done: return ret; } bool bson_parser_parse(bson_parser_t *parser, bson_t *in, bson_error_t *error) { bson_iter_t iter; bson_parser_entry_t *entry = NULL; /* Check that document is not null. */ if (in) { BSON_FOREACH(in, iter) { const char *key = bson_iter_key(&iter); bson_parser_entry_t *matched = NULL; /* Check for a corresponding entry. */ LL_FOREACH(parser->entries, entry) { if (0 == strcmp(entry->key, key)) { matched = entry; break; } } if (matched) { if (!entry_marshal(entry, &iter, error)) { return false; } entry->set = true; } else if (parser->allow_extra) { BSON_APPEND_VALUE(parser->extra, key, bson_iter_value(&iter)); } else { test_set_error(error, "Extra field '%s' found parsing: %s", key, tmp_json(in)); return false; } } } /* Check if there are any unparsed required entries. */ LL_FOREACH(parser->entries, entry) { if (!entry->optional && !entry->set) { test_set_error(error, "Required field '%s' was not found parsing: %s", entry->key, tmp_json(in)); return false; } } return true; } void bson_parser_parse_or_assert(bson_parser_t *parser, bson_t *in) { bson_error_t error; if (!bson_parser_parse(parser, in, &error)) { test_error("Unable to parse: %s: %s", error.message, tmp_json(in)); } } mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-parser.h000066400000000000000000000076501511661753600245340ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSONUTIL_BSON_PARSER_H #define BSONUTIL_BSON_PARSER_H #include #include #include /* bson_parser_t is a very simplified parser to parse BSON fields into C values. * Example usage: * * typedef struct { * char *name; * bool *has_kids; * bson_t *jobs; * } person_t; * * person_t person; * bson_parser_t *parser; * bson_t *bson = bson_from_file(); * * parser = bson_parser_new (); * bson_parser_utf8 (parser, "name", &person.name); * bson_parser_bool_optional (parser, "hasKids", &person.has_kids); * bson_parser_array (parser, "jobs", &person.jobs); * bson_parser_parse_or_assert (parser, bson); * * bson_parser_destroy_with_parsed_fields (parser); * * This parses a document like: * { "name": "Kevin", "hasKids": false, "jobs": [ "mongodb", "alk" ] } * "name" is required. "hasKids" is optional. */ typedef struct _bson_parser_t bson_parser_t; bson_parser_t * bson_parser_new(void); /* Permits extra fields to be ignored when parsing. */ void bson_parser_allow_extra(bson_parser_t *bp, bool val); /* Return extra fields a read-only bson_t. */ const bson_t * bson_parser_get_extra(const bson_parser_t *bp); void bson_parser_destroy(bson_parser_t *bp); /* bson_parser_destroy also destroys the outputs of all parsed fields. */ void bson_parser_destroy_with_parsed_fields(bson_parser_t *parser); void bson_parser_utf8(bson_parser_t *bp, const char *key, char **out); void bson_parser_utf8_optional(bson_parser_t *bp, const char *key, char **out); void bson_parser_doc(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_doc_optional(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_array(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_array_optional(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_array_or_doc(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_array_or_doc_optional(bson_parser_t *bp, const char *key, bson_t **out); void bson_parser_bool(bson_parser_t *bp, const char *key, bool **out); void bson_parser_bool_optional(bson_parser_t *bp, const char *key, bool **out); /* Accepts either int32 or int64 */ void bson_parser_int(bson_parser_t *bp, const char *key, int64_t **out); void bson_parser_int_optional(bson_parser_t *bp, const char *key, int64_t **out); void bson_parser_any(bson_parser_t *bp, const char *key, bson_val_t **out); void bson_parser_any_optional(bson_parser_t *bp, const char *key, bson_val_t **out); void bson_parser_write_concern(bson_parser_t *bp, mongoc_write_concern_t **out); void bson_parser_write_concern_optional(bson_parser_t *bp, mongoc_write_concern_t **out); void bson_parser_read_concern(bson_parser_t *bp, mongoc_read_concern_t **out); void bson_parser_read_concern_optional(bson_parser_t *bp, mongoc_read_concern_t **out); void bson_parser_read_prefs(bson_parser_t *bp, mongoc_read_prefs_t **out); void bson_parser_read_prefs_optional(bson_parser_t *bp, mongoc_read_prefs_t **out); /* Attempt to parse @in into the fields that were registered. If parsing fails, * returns false and sets @error. */ bool bson_parser_parse(bson_parser_t *bp, bson_t *in, bson_error_t *error); /* Attempt to parse @in. If parsing fails, print an error and abort. */ void bson_parser_parse_or_assert(bson_parser_t *bp, bson_t *in); #endif /* BSONUTIL_BSON_PARSER_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-val.c000066400000000000000000000202161511661753600240060ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include struct _bson_val_t { bson_value_t value; bson_type_t type; bson_t *as_bson; char *as_string; }; bson_val_t * bson_val_from_value(const bson_value_t *value) { bson_val_t *val = NULL; bson_t tmp; char *as_string = NULL; BSON_ASSERT(value); val = bson_malloc0(sizeof(bson_val_t)); bson_value_copy(value, &val->value); if (value->value_type == BSON_TYPE_DOCUMENT || value->value_type == BSON_TYPE_ARRAY) { val->as_bson = bson_new_from_data(value->value.v_doc.data, value->value.v_doc.data_len); } val->type = value->value_type; bson_init(&tmp); bson_append_value(&tmp, "v", 1, value); as_string = bson_as_canonical_extended_json(&tmp, NULL); if (!as_string) { val->as_string = NULL; } else { /* This produces: { "v" : {...} }. Strip off the wrapping "v" and braces. */ val->as_string = bson_strndup(as_string + 7, strlen(as_string) - 9); bson_free(as_string); } bson_destroy(&tmp); return val; } bson_val_t * bson_val_from_json(const char *single_quoted_json) { bson_val_t *val = NULL; char *double_quoted = single_quotes_to_double(single_quoted_json); bson_t as_bson; bson_error_t error; if (!bson_init_from_json(&as_bson, double_quoted, -1, &error)) { test_error("unable to construct bson value from: %s", single_quoted_json); } val = bson_val_from_bson(&as_bson); bson_free(double_quoted); bson_destroy(&as_bson); return val; } bson_val_t * bson_val_from_iter(const bson_iter_t *iter) { return bson_val_from_value(bson_iter_value((bson_iter_t *)iter)); } bson_val_t * bson_val_from_bson(const bson_t *bson) { bson_value_t value; bson_iter_t iter; value.value.v_doc.data = (uint8_t *)bson_get_data(bson); value.value.v_doc.data_len = bson->len; value.value_type = BSON_TYPE_DOCUMENT; bson_iter_init(&iter, bson); if (bson_iter_next(&iter) && 0 == strcmp("0", bson_iter_key(&iter))) { value.value_type = BSON_TYPE_ARRAY; } return bson_val_from_value(&value); } /* Always force to be an array. */ bson_val_t * bson_val_from_array(const bson_t *bson) { bson_value_t value; value.value.v_doc.data = (uint8_t *)bson_get_data(bson); value.value.v_doc.data_len = bson->len; value.value_type = BSON_TYPE_ARRAY; return bson_val_from_value(&value); } /* Always force to be an document. */ bson_val_t * bson_val_from_doc(const bson_t *bson) { bson_value_t value; value.value.v_doc.data = (uint8_t *)bson_get_data(bson); value.value.v_doc.data_len = bson->len; value.value_type = BSON_TYPE_DOCUMENT; return bson_val_from_value(&value); } bson_val_t * bson_val_from_int64(int64_t val) { bson_value_t value; value.value_type = BSON_TYPE_INT64; value.value.v_int64 = val; return bson_val_from_value(&value); } bson_val_t * bson_val_from_bytes(const uint8_t *bytes, uint32_t len) { bson_value_t value; value.value_type = BSON_TYPE_BINARY; value.value.v_binary.subtype = BSON_SUBTYPE_BINARY; value.value.v_binary.data = (uint8_t *)bytes; value.value.v_binary.data_len = len; return bson_val_from_value(&value); } bson_val_t * bson_val_copy(const bson_val_t *val) { if (!val) { return NULL; } return bson_val_from_value(&val->value); } void bson_val_destroy(bson_val_t *val) { if (!val) { return; } bson_free(val->as_string); bson_destroy(val->as_bson); bson_value_destroy(&val->value); bson_free(val); } bool bson_val_eq(const bson_val_t *a, const bson_val_t *b, bson_val_comparison_flags_t flags) { bson_type_t vtype; vtype = a->type; if (vtype == BSON_TYPE_DOUBLE || vtype == BSON_TYPE_INT32 || vtype == BSON_TYPE_INT64) { if (flags & BSON_VAL_FLEXIBLE_NUMERICS) { bson_type_t vtype_b = b->type; if (vtype_b == BSON_TYPE_INT32 || vtype_b == BSON_TYPE_INT64 || vtype_b == BSON_TYPE_DOUBLE) { return bson_val_convert_int64(a) == bson_val_convert_int64(b); } // Otherwise fall through to propagate an error on a type mismatch. } } if (a->type != b->type) { return false; } if (vtype == BSON_TYPE_ARRAY || vtype == BSON_TYPE_DOCUMENT) { if (flags & BSON_VAL_UNORDERED) { bool ret; bson_t *a_sorted, *b_sorted; a_sorted = bson_copy_and_sort(bson_val_to_bson(a)); b_sorted = bson_copy_and_sort(bson_val_to_bson(b)); ret = bson_equal(a_sorted, b_sorted); bson_destroy(a_sorted); bson_destroy(b_sorted); return ret; } } if (vtype == BSON_TYPE_CODEWSCOPE) { bool scope_equal; bson_t *a_scope, *a_scope_sorted, *b_scope, *b_scope_sorted; a_scope = bson_new_from_data(a->value.value.v_codewscope.scope_data, a->value.value.v_codewscope.scope_len); b_scope = bson_new_from_data(b->value.value.v_codewscope.scope_data, b->value.value.v_codewscope.scope_len); a_scope_sorted = bson_copy_and_sort(a_scope); b_scope_sorted = bson_copy_and_sort(b_scope); scope_equal = bson_equal(a_scope_sorted, b_scope_sorted); bson_destroy(a_scope); bson_destroy(b_scope); bson_destroy(a_scope_sorted); bson_destroy(b_scope_sorted); if (!scope_equal) { return false; } return 0 == strcmp(a->value.value.v_codewscope.code, b->value.value.v_codewscope.code); } /* All other cases, compare exact match by looking at canonical extended JSON * string representation. */ return 0 == strcmp(a->as_string, b->as_string); } bson_type_t bson_val_type(const bson_val_t *val) { return val->type; } const bson_t * bson_val_to_document(const bson_val_t *val) { if (val->type != BSON_TYPE_DOCUMENT) { test_error("expected document, got: %s", bson_type_to_string(val->type)); } return val->as_bson; } const bson_t * bson_val_to_array(const bson_val_t *val) { if (val->type != BSON_TYPE_ARRAY) { test_error("expected array, got: %s", bson_type_to_string(val->type)); } return val->as_bson; } /* Either document or array. */ const bson_t * bson_val_to_bson(const bson_val_t *val) { if (val->type != BSON_TYPE_ARRAY && val->type != BSON_TYPE_DOCUMENT) { test_error("expected document or array, got: %s", bson_type_to_string(val->type)); } return val->as_bson; } const uint8_t * bson_val_to_binary(const bson_val_t *val, uint32_t *len) { if (val->type != BSON_TYPE_BINARY) { test_error("expected binary, got: %s", bson_type_to_string(val->type)); } *len = (uint32_t)val->value.value.v_binary.data_len; return val->value.value.v_binary.data; } const bson_value_t * bson_val_to_value(const bson_val_t *val) { return (bson_value_t *)&val->value; } const char * bson_val_to_utf8(const bson_val_t *val) { BSON_ASSERT(val->type == BSON_TYPE_UTF8); return val->value.value.v_utf8.str; } bool bson_val_is_numeric(const bson_val_t *val) { return (val->type == BSON_TYPE_INT32 || val->type == BSON_TYPE_INT64 || val->type == BSON_TYPE_DOUBLE); } int64_t bson_val_convert_int64(const bson_val_t *val) { if (val->type == BSON_TYPE_INT32) { return (int64_t)val->value.value.v_int32; } if (val->type == BSON_TYPE_INT64) { return (int64_t)val->value.value.v_int64; } if (val->type == BSON_TYPE_DOUBLE) { return (int64_t)val->value.value.v_double; } test_error("expected int64, int32, or double, got: %s", bson_type_to_string(val->type)); return 0; } const char * bson_val_to_json(const bson_val_t *val) { if (!val) { return "(NULL)"; } return val->as_string; } mongo-c-driver-2.2.1/src/libmongoc/tests/bsonutil/bson-val.h000066400000000000000000000042011511661753600240070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef BSONUTIL_BSON_VAL_H #define BSONUTIL_BSON_VAL_H #include /* * bson_val_t is a convenience wrapper around a bson_value_t. */ typedef struct _bson_val_t bson_val_t; typedef enum { BSON_VAL_FLEXIBLE_NUMERICS = 1 << 0, BSON_VAL_UNORDERED = 1 << 1 } bson_val_comparison_flags_t; bson_val_t * bson_val_from_value(const bson_value_t *value); bson_val_t * bson_val_from_json(const char *single_quoted_json); bson_val_t * bson_val_from_iter(const bson_iter_t *iter); bson_val_t * bson_val_from_bson(const bson_t *bson); bson_val_t * bson_val_from_doc(const bson_t *bson); bson_val_t * bson_val_from_array(const bson_t *bson); bson_val_t * bson_val_from_int64(int64_t val); bson_val_t * bson_val_from_bytes(const uint8_t *bytes, uint32_t len); bson_val_t * bson_val_copy(const bson_val_t *val); const bson_t * bson_val_to_document(const bson_val_t *val); const bson_t * bson_val_to_array(const bson_val_t *val); const bson_t * bson_val_to_bson(const bson_val_t *val); const uint8_t * bson_val_to_binary(const bson_val_t *val, uint32_t *len); const bson_value_t * bson_val_to_value(const bson_val_t *val); const char * bson_val_to_utf8(const bson_val_t *val); bool bson_val_is_numeric(const bson_val_t *val); int64_t bson_val_convert_int64(const bson_val_t *val); bool bson_val_eq(const bson_val_t *a, const bson_val_t *b, bson_val_comparison_flags_t flags); bson_type_t bson_val_type(const bson_val_t *val); const char * bson_val_to_json(const bson_val_t *val); void bson_val_destroy(bson_val_t *val); #endif /* BSONUTIL_BSON_VAL_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/000077500000000000000000000000001511661753600262255ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/000077500000000000000000000000001511661753600275405ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-encrypted.json000066400000000000000000007574761511661753600337730ustar00rootroot00000000000000{ "_id": "client_side_encryption_corpus", "altname_aws": "aws", "altname_local": "local", "aws_double_rand_auto_id": { "kms": "aws", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAABchrWPF5OPeuFpk4tUV325TmoNpGW+L5iPSXcLQIr319WJFIp3EDy5QiAHBfz2rThI7imU4eLXndIUrsjM0S/vg==", "subType": "06" } } }, "aws_double_rand_auto_altname": { "kms": "aws", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAABga5hXFiFvH/wOr0wOHSHFWRZ4pEs/UCC1XJWf46Dod3GY9Ry5j1ZyzeHueJxc4Ym5M8UHKSmJuXmNo9m9ZnkiA==", "subType": "06" } } }, "aws_double_rand_explicit_id": { "kms": "aws", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAABjTYZbsro/YxLWBb88qPXEIDQdzY7UZyK4UaZZ8h62OTxp43Zp9j6WvOEzKhXt4oJPMxlAxyTdqO6MllX5bsDrw==", "subType": "06" } } }, "aws_double_rand_explicit_altname": { "kms": "aws", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAABqkyXdeS3aWH2tRFoKxsIIL3ZH05gkiAEbutrjrdfw0b110iPhuCCOb0gP/nX/NRNCg1kCFZ543Vu0xZ0BRXlvQ==", "subType": "06" } } }, "aws_double_det_explicit_id": { "kms": "aws", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "aws_double_det_explicit_altname": { "kms": "aws", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "aws_string_rand_auto_id": { "kms": "aws", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAACAsI5E0rVT8TpIONY3TnbRvIxUjKsiy9ynVd/fE7U1lndE7KR6dTzs8QWK13kdKxO+njKPeC2ObBX904QmJ65Sw==", "subType": "06" } } }, "aws_string_rand_auto_altname": { "kms": "aws", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAACgBE6J6MRxPSDe+gfJPL8nBvuEIRBYxNS/73LqBTDJYyN/lsHQ6UlFDT5B4EkIPmHPTe+UBMOhZQ1bsP+DK8Aog==", "subType": "06" } } }, "aws_string_rand_explicit_id": { "kms": "aws", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAACbdTVDBWn35M5caKZgLFoiSVeFGKRj5K/QtupKNc8/dPIyCE+/a4PU51G/YIzFpYmp91nLpyq7lD/eJ/V0q66Zw==", "subType": "06" } } }, "aws_string_rand_explicit_altname": { "kms": "aws", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAACa4O+kE2BaqM0E+yiBrbCuE0YEGTrZ7L/+SuWm9gN3UupxwAQpRfxXAuUCTc9u1CXnvL+ga+VJMcWD2bawnn/Rg==", "subType": "06" } } }, "aws_string_det_auto_id": { "kms": "aws", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAACyvOW8NcqRkZYzujivwVmYptJkic27PWr3Nq3Yv5Njz8cJdoyesVaQan6mn+U3wdfGEH8zbUUISdCx5qgvXEpvw==", "subType": "06" } } }, "aws_string_det_explicit_id": { "kms": "aws", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAACyvOW8NcqRkZYzujivwVmYptJkic27PWr3Nq3Yv5Njz8cJdoyesVaQan6mn+U3wdfGEH8zbUUISdCx5qgvXEpvw==", "subType": "06" } } }, "aws_string_det_explicit_altname": { "kms": "aws", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAACyvOW8NcqRkZYzujivwVmYptJkic27PWr3Nq3Yv5Njz8cJdoyesVaQan6mn+U3wdfGEH8zbUUISdCx5qgvXEpvw==", "subType": "06" } } }, "aws_object_rand_auto_id": { "kms": "aws", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAADI+/afY6Eka8j1VNThWIeGkDZ7vo4/l66a01Z+lVUFFnVLeUV/nz9kM6uTTplNRUa+RXmNmwkoR/BHRnGc7wRNA==", "subType": "06" } } }, "aws_object_rand_auto_altname": { "kms": "aws", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAADzN4hVXWXKerhggRRtwWnDu2W2wQ5KIWb/X1WCZJKTjQSQ5LNHVasabBCa4U1q46PQ5pDDM1PkVjW6o+zzl/4xw==", "subType": "06" } } }, "aws_object_rand_explicit_id": { "kms": "aws", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAADhSs5zKFMuuux3fqFFuPito3N+bp5TgmkUtJtFXjmA/EnLuexGARvEeGUsMJ/n0VzKbbsiE8+AsUNY3o9YXutqQ==", "subType": "06" } } }, "aws_object_rand_explicit_altname": { "kms": "aws", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAADpj8MSov16h26bFDrHepsNkW+tOLOjRP7oj1Tnj75qZ+uqxxVkQ5B/t/Ihk5fikHTJGAcRBR5Vv6kJ/ulMaDnvQ==", "subType": "06" } } }, "aws_object_det_explicit_id": { "kms": "aws", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "aws_object_det_explicit_altname": { "kms": "aws", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "aws_array_rand_auto_id": { "kms": "aws", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAETWDOZ6zV39H2+W+BkwZIoxI3BNF6phKoiBZ9+i4T9uEoyU3TmoTPjuI0YNwR1v/p5/9rlVCG0KLZd16eeMb3zxZXjqh6IAJqfhsBQ7bzBYI=", "subType": "06" } } }, "aws_array_rand_auto_altname": { "kms": "aws", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAE1xeHbld2JjUiPB1k+xMZuIzNSai7mv1iusCswxKEfYCZ7YtR0GDQTxN4676CwhcodSDiysjgOxSFIGlptKCvl0k46LNq0EGypP9yWBLvdjQ=", "subType": "06" } } }, "aws_array_rand_explicit_id": { "kms": "aws", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAEFVa4U2uW65MGihhdOmpZFgnwGTs3VeN5TXXbXJ5cfm0CwXF3EPlzAVjy5WO/+lbvFufpQnIiLH59/kVygmwn+2P9zPNJnSGIJW9gaV8Vye8=", "subType": "06" } } }, "aws_array_rand_explicit_altname": { "kms": "aws", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAE11VXbfg7DJQ5/CB9XdBO0hCrxOkK3RrEjPGJ0FXlUo76IMna1uo+NVmDnM63CRlGE3/TEbZPpp0w0jn4vZLKvBmGr7o7WQusRY4jnRf5oH4=", "subType": "06" } } }, "aws_array_det_explicit_id": { "kms": "aws", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_det_explicit_altname": { "kms": "aws", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_binData=00_rand_auto_id": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFpZYSktIHzGLZ6mcBFxywICqxdurqLVJcQR34ngix5YIOOulCYEhBSDzzSEyixEPCuU6cEzeuafpZRHX4qgcr9Q==", "subType": "06" } } }, "aws_binData=00_rand_auto_altname": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFshzESR9SyR++9r2yeaEjJYScMDez414s8pZkB3C8ihDa+rsyaxNy4yrF7qNEWjFrdFaH7zD2LdlPx+TKZgROlg==", "subType": "06" } } }, "aws_binData=00_rand_explicit_id": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFpYwZRPDom7qyAe5WW/QNSq97/OYgRT8xUEaaR5pkbQEFd/Cwtl8Aib/3Bs1CT3MVaHVWna2u5Gcc4s/v18zLhg==", "subType": "06" } } }, "aws_binData=00_rand_explicit_altname": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFBq1RIU1YGHKAS1SAtS42fKtQBHQ/BCQzRutirNdvWlrXxF81LSaS7QgQyycZ2ePiOLsSm2vZS4xaQETeCgRC4g==", "subType": "06" } } }, "aws_binData=00_det_auto_id": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAF6SJGmfD3hLVc4tLPm4v2zFuHoRxUDLumBR8Q0AlKK2nQPyvuHEPVBD3vQdDi+Q7PwFxmovJsHccr59VnzvpJeg==", "subType": "06" } } }, "aws_binData=00_det_explicit_id": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAF6SJGmfD3hLVc4tLPm4v2zFuHoRxUDLumBR8Q0AlKK2nQPyvuHEPVBD3vQdDi+Q7PwFxmovJsHccr59VnzvpJeg==", "subType": "06" } } }, "aws_binData=00_det_explicit_altname": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAF6SJGmfD3hLVc4tLPm4v2zFuHoRxUDLumBR8Q0AlKK2nQPyvuHEPVBD3vQdDi+Q7PwFxmovJsHccr59VnzvpJeg==", "subType": "06" } } }, "aws_binData=04_rand_auto_id": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFM5685zqlM8pc3xubtCFuf724g/bWXsebpNzw5E5HrxUqSBBVOvjs3IJH74+Supe169qejY358nOG41mLZvO2wJByvT14qmgUGpgBaLaxPR0=", "subType": "06" } } }, "aws_binData=04_rand_auto_altname": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFfLqOzpfjz/XYHDLnliUAA5ehi6s+OIjvrLa59ubqEf8DuoCEWlO13Dl8X42IBB4hoSsO2RUeWtc9MeH4SdIUh/xJN3qS7qzjh/H+GvZRdAM=", "subType": "06" } } }, "aws_binData=04_rand_explicit_id": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFkmKfKAbz9tqVaiM9MRhYttiY3vgDwXpdYLQ4uUgWX89KRayLADWortYL+Oq+roFhO3oiwB9vjeWGIdgbj5wSh/50JT/2Gs85TXFe1GFjfWs=", "subType": "06" } } }, "aws_binData=04_rand_explicit_altname": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAFKbufv83ddN+07Q5Ocq0VxUEV+BesSrVM7Bol3cMlWjHi7P+MrdwhNEa94xlxlDwU3b+RD6kW+AuNEQ2byA3CX2JjZE1gHwN7l0ukXuqpD0A=", "subType": "06" } } }, "aws_binData=04_det_auto_id": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAFlg7ceq9w/JMhHcNzQks6UrKYAffpUyeWuBIpcuLoB7YbFO61Dphseh77pzZbk3OvmveUq6EtCP2pmsq7hA+QV4hkv6BTn4m6wnXw6ss/qfE=", "subType": "06" } } }, "aws_binData=04_det_explicit_id": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAFlg7ceq9w/JMhHcNzQks6UrKYAffpUyeWuBIpcuLoB7YbFO61Dphseh77pzZbk3OvmveUq6EtCP2pmsq7hA+QV4hkv6BTn4m6wnXw6ss/qfE=", "subType": "06" } } }, "aws_binData=04_det_explicit_altname": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAFlg7ceq9w/JMhHcNzQks6UrKYAffpUyeWuBIpcuLoB7YbFO61Dphseh77pzZbk3OvmveUq6EtCP2pmsq7hA+QV4hkv6BTn4m6wnXw6ss/qfE=", "subType": "06" } } }, "aws_undefined_rand_explicit_id": { "kms": "aws", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_rand_explicit_altname": { "kms": "aws", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_det_explicit_id": { "kms": "aws", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_det_explicit_altname": { "kms": "aws", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "aws_objectId_rand_auto_id": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAHASE+V+LlkmwgF9QNjBK8QBvC973NaTMk6wbd57VB2EpQzrgxMtR5gYzVeqq4xaaHqrncyZCOIxDJkFlaim2NqA==", "subType": "06" } } }, "aws_objectId_rand_auto_altname": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAHf/+9Qj/ozcDoUb8RNBnajU1d9hJ/6fE17IEZnw+ma6v5yH8LqZk9w3dtm6Sfw1unMhcMKrmIgs6kxqRWhNREJg==", "subType": "06" } } }, "aws_objectId_rand_explicit_id": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAHzX8ejVLhoarQ5xgWsJitU/9eBm/Hlt2IIbZtS0SBc80qzkkWTaP9Zl9wrILH/Hwwx8RFnts855eKII3NJFa3BA==", "subType": "06" } } }, "aws_objectId_rand_explicit_altname": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAHG5l6nUCY8f/6xO6TsPDrZHcdPRyMe3muMlY2DxHwv9GJNDR5Ne5VEAzUjnbgoy+B29SX4oY8cXJ6XhVz8mt3Eg==", "subType": "06" } } }, "aws_objectId_det_auto_id": { "kms": "aws", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAHTMY2l+gY8glm4HeSsGfCSfOsTVTzYU8qnQV8iqEFHrO5SBJac59gv3N/jukMwAnt0j6vIIQrROkVetU24YY7sQ==", "subType": "06" } } }, "aws_objectId_det_explicit_id": { "kms": "aws", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAHTMY2l+gY8glm4HeSsGfCSfOsTVTzYU8qnQV8iqEFHrO5SBJac59gv3N/jukMwAnt0j6vIIQrROkVetU24YY7sQ==", "subType": "06" } } }, "aws_objectId_det_explicit_altname": { "kms": "aws", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAHTMY2l+gY8glm4HeSsGfCSfOsTVTzYU8qnQV8iqEFHrO5SBJac59gv3N/jukMwAnt0j6vIIQrROkVetU24YY7sQ==", "subType": "06" } } }, "aws_bool_rand_auto_id": { "kms": "aws", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAISm4UFt1HC2j0ObpTBg7SvF2Dq31i9To2ED4F3JcTihhq0fVzaSCsUz9VTJ0ziHmeNPNdfPPZO6qA/CDEZBO4jg==", "subType": "06" } } }, "aws_bool_rand_auto_altname": { "kms": "aws", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAIj93KeAa96DmZXdB8boFvW19jhJSMmtSs5ag5FDSkH8MdKG2d2VoBOdUlBrL+LHYELqeDHCszY7qCirvb5mIgZg==", "subType": "06" } } }, "aws_bool_rand_explicit_id": { "kms": "aws", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAIMbDFEuHIl5MNEsWnYLIand1vpK6EMv7Mso6qxrN4wHSVVwmxK+GCPgrKoUQsNuTssFWNCu0IhwrXOagDEfmlxw==", "subType": "06" } } }, "aws_bool_rand_explicit_altname": { "kms": "aws", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAIkIaWfmPdxgAV5Rtb6on6T0NGt9GPFDScQD5I/Ch0ngiTCCKceJOjU0ljd3YTgfWRA1p/MlMIV0I5YAWZXKTHlg==", "subType": "06" } } }, "aws_bool_det_explicit_id": { "kms": "aws", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "aws_bool_det_explicit_altname": { "kms": "aws", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "aws_date_rand_auto_id": { "kms": "aws", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAJz1VG4+QnQXEE+TGu/pzfPugGMVTiC1xnenG1ByRdPvsERVw9WComWl1tb9tt9oblD7H/q0y1+y8HevkDqohB2Q==", "subType": "06" } } }, "aws_date_rand_auto_altname": { "kms": "aws", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAJa1kI2mIIYWjf7zjf5dD9+psvAQpjZ3nnsoXA5upcIwEtZaC8bxKKHVpOLOP3rTbvT5EV6vLhXkferGoyaqd/8w==", "subType": "06" } } }, "aws_date_rand_explicit_id": { "kms": "aws", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAJ9Q5Xe4UuOLQTUwosk47A6xx40XJcNoICCNtKrHqsUYy0QLCFRc5v4nA0160BVghURizbUtX8iuIp11pnsDyRtA==", "subType": "06" } } }, "aws_date_rand_explicit_altname": { "kms": "aws", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAJkHOdUc/4U82wxWJZ0SYABkJjQqNApkH2Iy/5S+PoatPgynoeSFTU9FmAbuWV/gbtIfBiaCOIjlsdonl/gf9+5w==", "subType": "06" } } }, "aws_date_det_auto_id": { "kms": "aws", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAJEEpQNsiqMWPqD4lhMkiOJHGE8FxOeYrKPiiAp/bZTrLKyCSS0ZL1WT9H3cGzxWPm5veihCjKqWhjatC/pjtzbQ==", "subType": "06" } } }, "aws_date_det_explicit_id": { "kms": "aws", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAJEEpQNsiqMWPqD4lhMkiOJHGE8FxOeYrKPiiAp/bZTrLKyCSS0ZL1WT9H3cGzxWPm5veihCjKqWhjatC/pjtzbQ==", "subType": "06" } } }, "aws_date_det_explicit_altname": { "kms": "aws", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAJEEpQNsiqMWPqD4lhMkiOJHGE8FxOeYrKPiiAp/bZTrLKyCSS0ZL1WT9H3cGzxWPm5veihCjKqWhjatC/pjtzbQ==", "subType": "06" } } }, "aws_null_rand_explicit_id": { "kms": "aws", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "aws_null_rand_explicit_altname": { "kms": "aws", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "aws_null_det_explicit_id": { "kms": "aws", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "aws_null_det_explicit_altname": { "kms": "aws", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "aws_regex_rand_auto_id": { "kms": "aws", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAALnhViSt3HqTDzyLN4mWO9srBU8TjRvPWsAJYfj/5sgI/yFuWdrggMs3Aq6G+K3tRrX3Yb+osy5CLiFCxq9WIvAA==", "subType": "06" } } }, "aws_regex_rand_auto_altname": { "kms": "aws", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAALbL2RS2tGQLBZ+6LtXLKAWFKcoKui+u4+gMIlFemLgpdO2eLqrMJB53ccqZImX8ons9UgAwDkiD68hWy8e7KHfg==", "subType": "06" } } }, "aws_regex_rand_explicit_id": { "kms": "aws", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAALa0+ftF6W/0Ul4J9VT/3chXFktE1o+OK4S14h2kyOqDVNA8yMKuyCK5nWl1yZvjJ76TuhEABte23oxcBP5QwalQ==", "subType": "06" } } }, "aws_regex_rand_explicit_altname": { "kms": "aws", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAALS4Yo9Fwk6OTx2CWdnObFT2L4rHngeIbdCyT4/YMJYd+jLU3mph14M1ptZZg+TBIgSPHq+BkvpRDifbMmOVr/Hg==", "subType": "06" } } }, "aws_regex_det_auto_id": { "kms": "aws", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAALpwNlokiTCUtTa2Kx9NVGvXR/aKPGhR5iaCT7nHEk4BOiZ9Kr4cRHdPCeZ7A+gjG4cKoT62sm3Fj1FwSOl8J8aQ==", "subType": "06" } } }, "aws_regex_det_explicit_id": { "kms": "aws", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAALpwNlokiTCUtTa2Kx9NVGvXR/aKPGhR5iaCT7nHEk4BOiZ9Kr4cRHdPCeZ7A+gjG4cKoT62sm3Fj1FwSOl8J8aQ==", "subType": "06" } } }, "aws_regex_det_explicit_altname": { "kms": "aws", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAALpwNlokiTCUtTa2Kx9NVGvXR/aKPGhR5iaCT7nHEk4BOiZ9Kr4cRHdPCeZ7A+gjG4cKoT62sm3Fj1FwSOl8J8aQ==", "subType": "06" } } }, "aws_dbPointer_rand_auto_id": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAMfCVAnMNbRGsThnoVGb2KDsCIU2ehcPtebk/TFG4GZvEmculscLLih813lEz5NHS2sAXBn721EzUS7d0TKAPbmEYFwUBnijIQIPvUoUO8AQM=", "subType": "06" } } }, "aws_dbPointer_rand_auto_altname": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAMvYJ5BtaMLVXV+qj85q5WqKRlzlHOBIIxZfUE/BBXUwqSTpJLdQQD++DDh6F2dtorBeYa3oUv2ef3ImASk5j23joU35Pm3Zt9Ci1pMNGodWs=", "subType": "06" } } }, "aws_dbPointer_rand_explicit_id": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAMdsmYtPDw8kKjfB2kWfx5W1oNEkWWct1lRpesN303pUWsawDJpfBx40lg18So2X/g4yGIwpY3qfEKQZA4vCJeT+MTjhRXFjXA7eS/mxv8f3E=", "subType": "06" } } }, "aws_dbPointer_rand_explicit_altname": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAM0hcvS5zmY3mlTp0SfME/rINlflF/sx2KvP0eJTdH+Uk0WHuTkFIJAza+bXvV/gB7iNC350qyzUX3M6NHx/9s/5yBpY8MawTZTZ7WCQIA+ZI=", "subType": "06" } } }, "aws_dbPointer_det_auto_id": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAMp4QxbaEOij66L+RtaMekrDSm6QbfJBTQ8lQFhxfq9n7SVuQ9Zwdy14Ja8tyI3cGgQzQ/73rHUJ3CKA4+OYr63skYUkkkdlHxUrIMd5j5woc=", "subType": "06" } } }, "aws_dbPointer_det_explicit_id": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAMp4QxbaEOij66L+RtaMekrDSm6QbfJBTQ8lQFhxfq9n7SVuQ9Zwdy14Ja8tyI3cGgQzQ/73rHUJ3CKA4+OYr63skYUkkkdlHxUrIMd5j5woc=", "subType": "06" } } }, "aws_dbPointer_det_explicit_altname": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAMp4QxbaEOij66L+RtaMekrDSm6QbfJBTQ8lQFhxfq9n7SVuQ9Zwdy14Ja8tyI3cGgQzQ/73rHUJ3CKA4+OYr63skYUkkkdlHxUrIMd5j5woc=", "subType": "06" } } }, "aws_javascript_rand_auto_id": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAN3HzAC9BTD7Jgi0PR4RS/Z6L6QtAQ7VhbKRbX+1smmnYniH6jVBM6zyxMDM8h9YjMPNs8EJrGDnisuf33w5KI/A==", "subType": "06" } } }, "aws_javascript_rand_auto_altname": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAANJpw+znlu3ecSiNyZ0EerVsow4aDRF2auI3Wy69EVexJkQlHO753PjRn8hG/x2kY8ROy5IUU43jaugP5AN1bwNQ==", "subType": "06" } } }, "aws_javascript_rand_explicit_id": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAANzoDiq8uI0+l8COY8YdM9S3rpLvPOHOWmJqJNtOyS0ZXUx1SB5paRJ4W3Eg8KuXEeoFwvBDe9cW9YT66CzkjlBw==", "subType": "06" } } }, "aws_javascript_rand_explicit_altname": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAN/JhtRongJweLC5SdrXHhsFz3p82q3cwXf8Sru21DK6S39S997y3uhVLn0xlX5d94PxK1XVYSjz1oVuMxZouZ7Q==", "subType": "06" } } }, "aws_javascript_det_auto_id": { "kms": "aws", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAANE39aEGiuUZ1WyakVEBgkGzLp5whkIjJ4uiaFLXniRszJL70FRkcf+aFXlA5Y4So9/ODKF76qbSsH4Jk6L+3mog==", "subType": "06" } } }, "aws_javascript_det_explicit_id": { "kms": "aws", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAANE39aEGiuUZ1WyakVEBgkGzLp5whkIjJ4uiaFLXniRszJL70FRkcf+aFXlA5Y4So9/ODKF76qbSsH4Jk6L+3mog==", "subType": "06" } } }, "aws_javascript_det_explicit_altname": { "kms": "aws", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAANE39aEGiuUZ1WyakVEBgkGzLp5whkIjJ4uiaFLXniRszJL70FRkcf+aFXlA5Y4So9/ODKF76qbSsH4Jk6L+3mog==", "subType": "06" } } }, "aws_symbol_rand_auto_id": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAOBv1T9tleM0xwNe7efg/MlShyzvXe3Pmg1GzPl3gjFRHZGWXR578KqX+8oiz65eXGzNuyOFvcpnR2gYCs3NeKeQfctO5plEiIva6nzCI5SK8=", "subType": "06" } } }, "aws_symbol_rand_auto_altname": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAOwLgGws8CMh+GgkEJFAx8tDIflyjsgG+/1FmZZobKAg8NOKqfXjtbnNCbvR28OCk6g/8SqBm8m53G6JciwvthJ0DirdfEexiUqu7IPtaeeyw=", "subType": "06" } } }, "aws_symbol_rand_explicit_id": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAORQi3dNkXzZeruWu19kEhDu6fFD/h47ILzk+OVKQMoriAQC5YFyVRp1yAkIaWsrsPcyCHlfZ99FySSQeqSYbZZNj5FqyonWvDuPTduHDy3CI=", "subType": "06" } } }, "aws_symbol_rand_explicit_altname": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAOj+Yl1pQPiJ6mESOISOyUYsKN/VIvC8f0derhxIPakXkwn57U0sxv+geUkrl3JZDxY3+cX5M1JZmY+PfjaYQhbTorf9RZaVC2Wwo2lMftWi0=", "subType": "06" } } }, "aws_symbol_det_auto_id": { "kms": "aws", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAO5IHripygBGEsVK8RFWZ1rIIVUap8KVDuqOspZpERaj+5ZEfqIcyrP/WK9KdvwOfdOWXfP/mOwuImYgNdbaQe+ejkYe4W0Y0uneCuw88k95Q=", "subType": "06" } } }, "aws_symbol_det_explicit_id": { "kms": "aws", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAO5IHripygBGEsVK8RFWZ1rIIVUap8KVDuqOspZpERaj+5ZEfqIcyrP/WK9KdvwOfdOWXfP/mOwuImYgNdbaQe+ejkYe4W0Y0uneCuw88k95Q=", "subType": "06" } } }, "aws_symbol_det_explicit_altname": { "kms": "aws", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAO5IHripygBGEsVK8RFWZ1rIIVUap8KVDuqOspZpERaj+5ZEfqIcyrP/WK9KdvwOfdOWXfP/mOwuImYgNdbaQe+ejkYe4W0Y0uneCuw88k95Q=", "subType": "06" } } }, "aws_javascriptWithScope_rand_auto_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAPT31GSNkY1RM43miv1XPYtDX1vU/xORiM3U0pumjqA+JLU/HMhH++75OcMhcAQqMjm2nZtZScxdGJsJJPEEzqjbFNMJgYc9sqR5uLnzk+2dg=", "subType": "06" } } }, "aws_javascriptWithScope_rand_auto_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAPUxgaKAxSQ1uzOZtzsbtrxtDT2P/zWY6lYsbChXuRUooqvyjXSkNDqKBBA7Gp5BdGiVB/JLR47Tihpbcw1s1yGhwQRvnqeDvPrf91nvElXRY=", "subType": "06" } } }, "aws_javascriptWithScope_rand_explicit_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAPv8W0ZtquFCLTG0TqvRjdzKa/4mvqT2FuEGQ0mXG2k2BZh2LY5APr/kgW0tP4eLjHzVld6OLiM9ZKAvENCZ6/fKOvqSwpIfkdLWUIeB4REQg=", "subType": "06" } } }, "aws_javascriptWithScope_rand_explicit_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAPMVhWjaxLffdAOkVgIJpjgNIldMS451NQs3C1jb+pzopHp3DlfZ+AHQpK9reMVVKjaqanhWBpL25q+feA60XVgZPCUDroiRYqMFqU//y0amw=", "subType": "06" } } }, "aws_javascriptWithScope_det_explicit_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_det_explicit_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "aws_int_rand_auto_id": { "kms": "aws", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAQFV5b3vsoZe+MT4z8soetpmrWJpm7be41FNu/rdEqHWTG32jCym6762PCNYH5+vA7ldCWQkdt+ncneHsxzPrm9w==", "subType": "06" } } }, "aws_int_rand_auto_altname": { "kms": "aws", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAQY9+QenvU1Tk/dEGZP11uOZJLHAJ9hWHbEhxbtxItt1LsdU/8gOZfypilIO5BUkLT/15PUuXV28GISNh6yIuWhw==", "subType": "06" } } }, "aws_int_rand_explicit_id": { "kms": "aws", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAQruCugbneumhcinuXm89WW1PXVuSOewttp9cpsPPsCRVqe/uAkZOdJnZ2KaEZ9zki2GeqaJTs1qDmaJofc6GMEA==", "subType": "06" } } }, "aws_int_rand_explicit_altname": { "kms": "aws", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAQb15qXl/tejk4pmgkc4pUxzt4eJrv/cetgzgcPVaROAQSzd8ptbgCjaV8vP46uqozRoaDFZbQ06t65c3f0x/Ucw==", "subType": "06" } } }, "aws_int_det_auto_id": { "kms": "aws", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAQCXo6ieWvfoqkG+rP7J2BV013AVf/oNMmmGWe44VEHahF+qZHzW5I/F2qIA+xgKkk172pFq0iTSOpe+K2WHMKFw==", "subType": "06" } } }, "aws_int_det_explicit_id": { "kms": "aws", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAQCXo6ieWvfoqkG+rP7J2BV013AVf/oNMmmGWe44VEHahF+qZHzW5I/F2qIA+xgKkk172pFq0iTSOpe+K2WHMKFw==", "subType": "06" } } }, "aws_int_det_explicit_altname": { "kms": "aws", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAAQCXo6ieWvfoqkG+rP7J2BV013AVf/oNMmmGWe44VEHahF+qZHzW5I/F2qIA+xgKkk172pFq0iTSOpe+K2WHMKFw==", "subType": "06" } } }, "aws_timestamp_rand_auto_id": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAR63xXG8mrlixkQzD5VBIPE6NHicaWcS5CBhiIJDcZ0x8D9c5TgRJUfCeWhKvWFD4o0DoxcBQ2opPormFDpvmq/g==", "subType": "06" } } }, "aws_timestamp_rand_auto_altname": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAARAgY9LsUxP6gP4gYRvvzZ4iaHVQRNbycATiVag1YNSiDmEr4LYserYuBscdrIy4v3zgGaulFM9KV86bx0ItycZA==", "subType": "06" } } }, "aws_timestamp_rand_explicit_id": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAARLneAZqPcHdzGGnXz2Ne5E7HP9cDC1+yoIwcA8OSF/IlzEjrrMAi3z6Izol6gWDlD7VOh7QYL3sASJOXyzF1hPQ==", "subType": "06" } } }, "aws_timestamp_rand_explicit_altname": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAARH2bU7KNo5SHxiO8JFEcT9wryuHNXyM7ADop1oPcESyay1Nc0WHPD3nr0yMAK481NxOkE3qXyaslu7bcP/744WA==", "subType": "06" } } }, "aws_timestamp_det_auto_id": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAARG7kGfx0ky+d4Hl/fRBu8oUR1Mph26Dkv3J7fxGYanpzOFMiHIfVO0uwYMvsfzG54y0DDNlS3FmmS13DzepbzGQ==", "subType": "06" } } }, "aws_timestamp_det_explicit_id": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAARG7kGfx0ky+d4Hl/fRBu8oUR1Mph26Dkv3J7fxGYanpzOFMiHIfVO0uwYMvsfzG54y0DDNlS3FmmS13DzepbzGQ==", "subType": "06" } } }, "aws_timestamp_det_explicit_altname": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAARG7kGfx0ky+d4Hl/fRBu8oUR1Mph26Dkv3J7fxGYanpzOFMiHIfVO0uwYMvsfzG54y0DDNlS3FmmS13DzepbzGQ==", "subType": "06" } } }, "aws_long_rand_auto_id": { "kms": "aws", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAASZbes2EdR78crt2pXVElW2YwAQh8HEBapYYeav2VQeg2syXaV/qZuD8ofnAVn4v/DydTTMVMmK+sVU/TlnAu2eA==", "subType": "06" } } }, "aws_long_rand_auto_altname": { "kms": "aws", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAASt+7fmMYH+fLHgybc+sng8/UmKP3YPUEPCz1SXVQljQp6orsCILSgtgGPsdeGnN5NSxh3XzerHs6zlR92fWpZCw==", "subType": "06" } } }, "aws_long_rand_explicit_id": { "kms": "aws", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAS01fF1uo6zYDToJnOT/EbDipzk7YZ6I+IspZF+avjU3XYfpRxT9NdAgKr0euWJwyAsdpWqqCwFummfrPeZOy04A==", "subType": "06" } } }, "aws_long_rand_explicit_altname": { "kms": "aws", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAS6tpH796bqy58mXf38rJvVtA1uBcxBE5yIGQ4RN44oypc/pvw0ouhFI1dkoneKMtAFU/5RygZV+RvQhRtgKn76A==", "subType": "06" } } }, "aws_long_det_auto_id": { "kms": "aws", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAASC7O/8JeB4WTqQFPuMpFRsAuonPS3yu7IAPZeRPIr03CmM6HNndYIKMoFM13eELNZTdJSgg9u9ItGqRw+/XMHzQ==", "subType": "06" } } }, "aws_long_det_explicit_id": { "kms": "aws", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAASC7O/8JeB4WTqQFPuMpFRsAuonPS3yu7IAPZeRPIr03CmM6HNndYIKMoFM13eELNZTdJSgg9u9ItGqRw+/XMHzQ==", "subType": "06" } } }, "aws_long_det_explicit_altname": { "kms": "aws", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQFkgAAAAAAAAAAAAAAAAAASC7O/8JeB4WTqQFPuMpFRsAuonPS3yu7IAPZeRPIr03CmM6HNndYIKMoFM13eELNZTdJSgg9u9ItGqRw+/XMHzQ==", "subType": "06" } } }, "aws_decimal_rand_auto_id": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAATgf5zW9EgnWHPxj4HAGt472eN9UXP41TaF8V2J7S2zqSpiBZGKDuOIjw2FBSqaNp53vvfl9HpwAuQBJZhrwkBCKRkKV/AAR3/pTpuoqhSKaM=", "subType": "06" } } }, "aws_decimal_rand_auto_altname": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAATPRfvZWdupE2N0W1DXUx7X8Zz7g43jawJL7PbQtTYetI78xRETkMdygwSEHgs+cvnUBBtYIeKRVkOGZQkwf568OclhDiPxUeD38cR5blBq/U=", "subType": "06" } } }, "aws_decimal_rand_explicit_id": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAAT+ZnCg2lSMIohZ9RJ4CNs3LZ0g+nV04cYAmrxTSrTSBPGlZ7Ywh5A2rCss7AUijYZiKiYyZbuAzukbOuVRhdCtm+xo9+DyLAwTezF18okk6Y=", "subType": "06" } } }, "aws_decimal_rand_explicit_altname": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgFkgAAAAAAAAAAAAAAAAAATlnQYASsTZRRHzFjcbCClXartcXBVRrYv7JImMkDmAj6EAjf/ZqpjeykkS/wohMhXaNwyZBdREr+n+GDV7imYoL4WRBOLnqB6hrYidlWqNzE=", "subType": "06" } } }, "aws_decimal_det_explicit_id": { "kms": "aws", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_det_explicit_altname": { "kms": "aws", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "aws_minKey_rand_explicit_id": { "kms": "aws", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_rand_explicit_altname": { "kms": "aws", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_det_explicit_id": { "kms": "aws", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_det_explicit_altname": { "kms": "aws", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "aws_maxKey_rand_explicit_id": { "kms": "aws", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_rand_explicit_altname": { "kms": "aws", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_det_explicit_id": { "kms": "aws", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_det_explicit_altname": { "kms": "aws", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "local_double_rand_auto_id": { "kms": "local", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAABGF195CB8nRmK9+KxYO7T96MeXucC/ILQtEEQAS4zrwj3Qz7YEQrf/apvbKTCkn3siN2XSDLQ/7dmddZa9xa9yQ==", "subType": "06" } } }, "local_double_rand_auto_altname": { "kms": "local", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAABY8g18z6ZOjGtfNxaAmU95tXMdoM6qbtDMpB72paqiHZTW1UGB22HPXiEnVz05JTBzzX4fc6tOldX6aJel812Zg==", "subType": "06" } } }, "local_double_rand_explicit_id": { "kms": "local", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAABDlHwN8hYyScEhhx64TdJ2Qp2rmKRg8983zdqIL1914tyPwRQq7ySCOhmFif2S7v4KT+r0uOfimYvKD1n9rKHlg==", "subType": "06" } } }, "local_double_rand_explicit_altname": { "kms": "local", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAB2VnTFlaCRzAZZTQiMWQORFNgXIuAJlHJXIHiYow2eO6JbVghWTpH+MsdafBNPVnc0zKuZBL0Qs2Nuk1xiQaqhA==", "subType": "06" } } }, "local_double_det_explicit_id": { "kms": "local", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "local_double_det_explicit_altname": { "kms": "local", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "local_string_rand_auto_id": { "kms": "local", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAC5NBAPM8q2n9fnkwQfE9so/XcO51plPBNs5VlBRbDw68k9T6/uZ2TWsAvTYtVooY59zHHr2QS3usKbGQB6J61rA==", "subType": "06" } } }, "local_string_rand_auto_altname": { "kms": "local", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACM/EjGMrkYHvSZra26m74upuvLkfKXTs+tTWquGzrgWYLnLt8I6XBIwx1VymS9EybrCU/ewmtgjLUNUFQacIeXA==", "subType": "06" } } }, "local_string_rand_explicit_id": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACn4tD26UG8lO9gTZaxen6yXzHo/a2lokeY1ClxHMtJODoJr2JZzIDHP3A9aZ8L4+Vu+nyqphaWyGaGONKu8gpcQ==", "subType": "06" } } }, "local_string_rand_explicit_altname": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACZfoO2LjY+IB31FZ1Tq7pHr0DCFKGJqWcXcOrnZ7bV9Euc9f101motJc31sp8nF5CTCfd83VQE0319eQrxDDaSw==", "subType": "06" } } }, "local_string_det_auto_id": { "kms": "local", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACW0cZMYWOY3eoqQQkSdBtS9iHC4CSQA27dy6XJGcmTV8EDuhGNnPmbx0EKFTDb0PCSyCjMyuE4nsgmNYgjTaSuw==", "subType": "06" } } }, "local_string_det_explicit_id": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACW0cZMYWOY3eoqQQkSdBtS9iHC4CSQA27dy6XJGcmTV8EDuhGNnPmbx0EKFTDb0PCSyCjMyuE4nsgmNYgjTaSuw==", "subType": "06" } } }, "local_string_det_explicit_altname": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACW0cZMYWOY3eoqQQkSdBtS9iHC4CSQA27dy6XJGcmTV8EDuhGNnPmbx0EKFTDb0PCSyCjMyuE4nsgmNYgjTaSuw==", "subType": "06" } } }, "local_object_rand_auto_id": { "kms": "local", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAADlekcUsETAkkKTjCVx5EISJN+sftrQax/VhaWXLyRgRz97adXXmwZkMyt+035SHZsF91i2LaXziMA4RHoP+nKFw==", "subType": "06" } } }, "local_object_rand_auto_altname": { "kms": "local", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAADpaQmy5r6q9gLqEm+FIi/OyQgcuUnrICCP9rC4S3wR6qUHd82IW/3dFQUzwTkaXxgStjopamQMuZ4ESRj0xx0bA==", "subType": "06" } } }, "local_object_rand_explicit_id": { "kms": "local", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAADCHRJCINzWY0u4gZPWEmHg/JoQ8IW4yMfUyzYJCQrEMp4rUeupIuxqSuq2QyLBYZBBv0r7t3lNH49I5qDeav2vA==", "subType": "06" } } }, "local_object_rand_explicit_altname": { "kms": "local", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAADrHQQUnLF1jdNmFY/V266cS28XAB4nOKetHAcSbwkeUxNzgZT1g+XMQaYfcNMMv/ywypKU1KpgLMsEOpm4qcPkQ==", "subType": "06" } } }, "local_object_det_explicit_id": { "kms": "local", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "local_object_det_explicit_altname": { "kms": "local", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "local_array_rand_auto_id": { "kms": "local", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAEXa7bQ5vGPNsLdklM/H+sop8aCL4vlDiVUoVjTAGjTngn2WLcdKLWxaNSyMdJpsI/NsxQJ58YrcwP+yHzi9rZVtRdbg7m8p+CYcq1vUm6UoQ=", "subType": "06" } } }, "local_array_rand_auto_altname": { "kms": "local", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAEVlZlOvtRmGIhcYi/qPl3HKi/qf0yRQrkbVo9rScYkxDCBN9wA55pAWHDQ/5Sjy4d0DwL57k+M1G9e7xSIrv8xXKwoIuuabhSWaIX2eJHroY=", "subType": "06" } } }, "local_array_rand_explicit_id": { "kms": "local", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAEYBLSYHHt2rohezMF4lMjNdqy9CY33EHf+pgRbJwVXZScLDgn9CcqeRsdU8bW5h2qgNpQvoSMBB7pW+Dgp1RauTHZSOd4PcZpAGjwoFDWSSM=", "subType": "06" } } }, "local_array_rand_explicit_altname": { "kms": "local", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAES1IJ8S2NxWekolQockxLJvzFSGfKQ9Xbi55vO8LyWo0sIG9ZgPQXtVQkZ301CsdFduvx9A0vDqQ0MGYc4plxNnpUTizJPRUDyez5dOgZ9tI=", "subType": "06" } } }, "local_array_det_explicit_id": { "kms": "local", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_det_explicit_altname": { "kms": "local", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_binData=00_rand_auto_id": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAF+hgWs4ZCo9GnmhSM9SDSWzWX4E7Tlp4TwlEy3zfO/rrMREECGB4u8LD8Ju9b8YP+xcZhMI1tcz/vrQS87NffUg==", "subType": "06" } } }, "local_binData=00_rand_auto_altname": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAFtEvaXWpGfXC1GlKu0AeRDaeBKHryGoS0tAUr48vfYk7umCr+fJKyXCY9vSv7wCiQxWLe8V/EZWkHsu0zqhJw9w==", "subType": "06" } } }, "local_binData=00_rand_explicit_id": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAF/1L5bvmMX3Bk2nAw8KvvRd/7nZ82XHVasT0jrlPhSiJU7ehJMeUCOb7HCHU6KgCzZB9C2W3NoVhLKIhE9ZnYdg==", "subType": "06" } } }, "local_binData=00_rand_explicit_altname": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAFK0W5IWKzggR4UU+fhwA2p8YCHLfmx5y1OEtHc/9be9eEYTORACDmWY6207Vd4LhBJCedd+Q5qMm7NRZjjhyLEQ==", "subType": "06" } } }, "local_binData=00_det_auto_id": { "kms": "local", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAF1ofBnK9+ERP29P/i14GQ/y3muic6tNKY532zCkzQkJSktYCOeXS8DdY1DdaOP/asZWzPTdgwby6/iZcAxJU+xQ==", "subType": "06" } } }, "local_binData=00_det_explicit_id": { "kms": "local", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAF1ofBnK9+ERP29P/i14GQ/y3muic6tNKY532zCkzQkJSktYCOeXS8DdY1DdaOP/asZWzPTdgwby6/iZcAxJU+xQ==", "subType": "06" } } }, "local_binData=00_det_explicit_altname": { "kms": "local", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAF1ofBnK9+ERP29P/i14GQ/y3muic6tNKY532zCkzQkJSktYCOeXS8DdY1DdaOP/asZWzPTdgwby6/iZcAxJU+xQ==", "subType": "06" } } }, "local_binData=04_rand_auto_id": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAFxq38aA4k/tYHPwJFRK0pahlo/3zjCe3VHJRqURRA+04lbJCvdkQTawxWlf8o+3Pcetl1UcPTQigdYp5KbIkstuPstLbT+TZXHVD1os9LTRw=", "subType": "06" } } }, "local_binData=04_rand_auto_altname": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAFTXNWchCPmCSY0+AL22/kCBmAoDJDX5T18jpJHLdvZtHs0zwD64b9hLvfRK268BlNu4P37KDFE6LT0QzjG7brqzFJf3ZaadDCKeIw1q7DWQs=", "subType": "06" } } }, "local_binData=04_rand_explicit_id": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAF7XgMgKjQmWYWmobrYWKiGYCKsy5kTgVweFBuzvFISaZjFsq2hrZB2DwUaOeT6XUPH/Onrdjc3fNElf3FdQDHif4rt+1lh9jEX+nMbRw9i3s=", "subType": "06" } } }, "local_binData=04_rand_explicit_altname": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAFGoA/1H0waFLor6LbkUCLC2Wm9j/ZT7yifPbf0G7WvO0+gBLlffr3aJIQ9ik5vxPbmDDMCoYlbEYgb8i9I5tKC17WPhjVH2N2+4l9y7aEmS4=", "subType": "06" } } }, "local_binData=04_det_auto_id": { "kms": "local", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAFwO3hsD8ee/uwgUiHWem8fGe54LsTJWqgbRCacIe6sxrsyLT6EsVIqg4Sn7Ou+FC3WJbFld5kx8euLe/MHa8FGYjxD97z5j+rUx5tt3T6YbA=", "subType": "06" } } }, "local_binData=04_det_explicit_id": { "kms": "local", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAFwO3hsD8ee/uwgUiHWem8fGe54LsTJWqgbRCacIe6sxrsyLT6EsVIqg4Sn7Ou+FC3WJbFld5kx8euLe/MHa8FGYjxD97z5j+rUx5tt3T6YbA=", "subType": "06" } } }, "local_binData=04_det_explicit_altname": { "kms": "local", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAFwO3hsD8ee/uwgUiHWem8fGe54LsTJWqgbRCacIe6sxrsyLT6EsVIqg4Sn7Ou+FC3WJbFld5kx8euLe/MHa8FGYjxD97z5j+rUx5tt3T6YbA=", "subType": "06" } } }, "local_undefined_rand_explicit_id": { "kms": "local", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "local_undefined_rand_explicit_altname": { "kms": "local", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "local_undefined_det_explicit_id": { "kms": "local", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "local_undefined_det_explicit_altname": { "kms": "local", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "local_objectId_rand_auto_id": { "kms": "local", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAHfvxWRZOzfao3faE3RglL0IcDpBcNwqiGL5KgSokmRxWjjWeiel88Mbo5Plo0SswwNQ2H7C5GVG21L+UbvcW63g==", "subType": "06" } } }, "local_objectId_rand_auto_altname": { "kms": "local", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAHhd9lSOO7bHE7PM+Uxa2v3X1FF66IwyEr0wqnyTaOM+cHQLmec/RlEaRIQ1x2AiW7LwmmVgZ0xBMK9CMh0Lhbyw==", "subType": "06" } } }, "local_objectId_rand_explicit_id": { "kms": "local", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAHETwT9bo+JtboBVW/8GzzMQCpn22iiNJnlxYfyO45jvYJQRs29RRIouCsnFkmC7cfAO3GlVxv113euYjIO7AlAg==", "subType": "06" } } }, "local_objectId_rand_explicit_altname": { "kms": "local", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAHhsguAMBzQUFBAitpJDzKEaMDGUGfvCzmUUhf4rnp8xeall/p91TUudaSMcU11XEgJ0Mym4IbYRd8+TfUai0nvw==", "subType": "06" } } }, "local_objectId_det_auto_id": { "kms": "local", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAH4ElF4AvQ+kkGfhadgKNy3GcYrDZPN6RpzaMYIhcCGDvC9W+cIS9dH1aJbPU7vTPmEZnnynPTDWjw3rAj2+9mOA==", "subType": "06" } } }, "local_objectId_det_explicit_id": { "kms": "local", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAH4ElF4AvQ+kkGfhadgKNy3GcYrDZPN6RpzaMYIhcCGDvC9W+cIS9dH1aJbPU7vTPmEZnnynPTDWjw3rAj2+9mOA==", "subType": "06" } } }, "local_objectId_det_explicit_altname": { "kms": "local", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAH4ElF4AvQ+kkGfhadgKNy3GcYrDZPN6RpzaMYIhcCGDvC9W+cIS9dH1aJbPU7vTPmEZnnynPTDWjw3rAj2+9mOA==", "subType": "06" } } }, "local_bool_rand_auto_id": { "kms": "local", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAIxGld4J/2vSWg5tjQulpkm9C6WeUcLbv2yfKRXPAbmLpv3u4Yrmr5qisJtqmDPTcb993WosvCYAh0UGW+zpsdEg==", "subType": "06" } } }, "local_bool_rand_auto_altname": { "kms": "local", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAIpUFPiS2uoW1Aqs0WQkBa201OBmsuJ8WUKcv5aBPASkcwfaw9qSWs3QrbEDR2GyoU4SeYOByCAQMzXCPoIYAFdQ==", "subType": "06" } } }, "local_bool_rand_explicit_id": { "kms": "local", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAIJuzu1a60meYlU3LMjw/7G4Vh/lqKopxdpGWoLXEmY/NoHgX6Fkv9iTwxv/Nv8rZwtawpFV+mQUG/6A1IHMBASQ==", "subType": "06" } } }, "local_bool_rand_explicit_altname": { "kms": "local", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAIn9VjxL5TdGgJLckNHRrIaL32L31q5OERRZG2M5OYKk66TnrlfEs+ykcDvGwMGKpr/PYjY5kBHDc/oELGJJbWRQ==", "subType": "06" } } }, "local_bool_det_explicit_id": { "kms": "local", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "local_bool_det_explicit_altname": { "kms": "local", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "local_date_rand_auto_id": { "kms": "local", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAJPPv4MC5xzt2uxPGBHH9g2z03o9SQjjmuxt97Ub1UcKCCHsGED3bx6YSrocuEMiFFI4d5Fqgl8HNeS4j0PR0tYA==", "subType": "06" } } }, "local_date_rand_auto_altname": { "kms": "local", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAJ6i2A9Hi4xWlOMjFMGpwaRctR1VFnb4El166n18RvjKic46V+WoadvLHS32RhPOvkLVYwIeU4C+vrO5isBNoUdw==", "subType": "06" } } }, "local_date_rand_explicit_id": { "kms": "local", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAJHcniV7Q0C8ZTWrE0hp5i5bUPlrrRdNLZckfODw8XNVtVPDjbznglccQmI7w1t8kOVp65eKzVzUOXN0YkqA+1QA==", "subType": "06" } } }, "local_date_rand_explicit_altname": { "kms": "local", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAJKCUCjC3hsmEKKYwGP3ceh3zR+ArE8LYFOQfN87aEsTr60VrzHXmsE8PvizRhhMnrp07ljzQkuat39L+0QSR2qQ==", "subType": "06" } } }, "local_date_det_auto_id": { "kms": "local", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAJ1GMYQTruoKr6fv9XCbcVkx/3yivymPSMEkPCRDYxQv45w4TqBKMDfpRd1TOLOv1qvcb+gjH+z5IfVBMp2IpG/Q==", "subType": "06" } } }, "local_date_det_explicit_id": { "kms": "local", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAJ1GMYQTruoKr6fv9XCbcVkx/3yivymPSMEkPCRDYxQv45w4TqBKMDfpRd1TOLOv1qvcb+gjH+z5IfVBMp2IpG/Q==", "subType": "06" } } }, "local_date_det_explicit_altname": { "kms": "local", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAJ1GMYQTruoKr6fv9XCbcVkx/3yivymPSMEkPCRDYxQv45w4TqBKMDfpRd1TOLOv1qvcb+gjH+z5IfVBMp2IpG/Q==", "subType": "06" } } }, "local_null_rand_explicit_id": { "kms": "local", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "local_null_rand_explicit_altname": { "kms": "local", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "local_null_det_explicit_id": { "kms": "local", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "local_null_det_explicit_altname": { "kms": "local", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "local_regex_rand_auto_id": { "kms": "local", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAALXKw7zSgqQj1AKoWO0MoMxsBuu0cMB6KdJQCRKdupoLV/Y22owwsVpDDMv5sgUpkG5YIV+Fz7taHodXE07qHopw==", "subType": "06" } } }, "local_regex_rand_auto_altname": { "kms": "local", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAALntOLXq7VW1+jwba/dSbidMo2bewNo7AtK9A1CPwk9XrjUQaEOQxfRpho3BYQEo2U67fQdsY/tyhaj4jduHn9JQ==", "subType": "06" } } }, "local_regex_rand_explicit_id": { "kms": "local", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAALlMMG2iS/gEOEsVKR7sxBJP2IUzZ+aRbozDSkqADncresBvaPBSE17lng5NG7H1JRCAcP1rH/Te+0CrMd7JpRAQ==", "subType": "06" } } }, "local_regex_rand_explicit_altname": { "kms": "local", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAL1YNnlVu5+njDLxh1LMhIPOH19RykAXhxrUbCy6TI5MLQsAOSgAJbXOTXeKr0D8/Ff0phToWOKl193gOOIp8yZQ==", "subType": "06" } } }, "local_regex_det_auto_id": { "kms": "local", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAALiZbL5nFIZl7cSLH5E3wK3jJeAeFc7hLHNITtLAu+o10raEs5i/UCihMHmkf8KHZxghs056pfm5BjPzlL9x7IHQ==", "subType": "06" } } }, "local_regex_det_explicit_id": { "kms": "local", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAALiZbL5nFIZl7cSLH5E3wK3jJeAeFc7hLHNITtLAu+o10raEs5i/UCihMHmkf8KHZxghs056pfm5BjPzlL9x7IHQ==", "subType": "06" } } }, "local_regex_det_explicit_altname": { "kms": "local", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAALiZbL5nFIZl7cSLH5E3wK3jJeAeFc7hLHNITtLAu+o10raEs5i/UCihMHmkf8KHZxghs056pfm5BjPzlL9x7IHQ==", "subType": "06" } } }, "local_dbPointer_rand_auto_id": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAMUdAA9uOSk1tXJVe/CG3Ps6avYTEF1eHj1wSlCHkFxqlMtTO+rIQpikpjH0MrcXvEEdAO8g5hFZ01I7DWyK5AAxTxDqVF+kOaQ2VfKs6hyuo=", "subType": "06" } } }, "local_dbPointer_rand_auto_altname": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAMiNqvqLwZrPnsF235z+Obl1K9iEXdJ5GucMGpJdRG4lRvRE0Oy1vh6ztNTpYPY/tXyUFTBWlzl/lITalSEm/dT1Bnlh0iPAFrAiNySf662og=", "subType": "06" } } }, "local_dbPointer_rand_explicit_id": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAM+Tn31YcKiowBTJWRYCYAEO7UARDE2/jTVGEKXCpiwEqqP3JSAS0b80zYt8dxo5mVhUo2a02ClKrB8vs+B6sU1kXrahSaVSEHZlRSGN9fWgo=", "subType": "06" } } }, "local_dbPointer_rand_explicit_altname": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAMdOZZUvpJIqG9qiOLy5x4BdftyHipPDZn/eeLEc7ir3v4jJsY3dsv6fQERo5U9lMynNGA9PJePVzq5tWsIMX0EcCQcMfGmosfkYDzN1OX99A=", "subType": "06" } } }, "local_dbPointer_det_auto_id": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAMQWace2C1w3yqtmo/rgz3YtIDnx1Ia/oDsoHnnMZlEy5RoK3uosi1hvNAZCSg3Sen0H7MH3XVhGGMCL4cS69uJ0ENSvh+K6fiZzAXCKUPfvM=", "subType": "06" } } }, "local_dbPointer_det_explicit_id": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAMQWace2C1w3yqtmo/rgz3YtIDnx1Ia/oDsoHnnMZlEy5RoK3uosi1hvNAZCSg3Sen0H7MH3XVhGGMCL4cS69uJ0ENSvh+K6fiZzAXCKUPfvM=", "subType": "06" } } }, "local_dbPointer_det_explicit_altname": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAMQWace2C1w3yqtmo/rgz3YtIDnx1Ia/oDsoHnnMZlEy5RoK3uosi1hvNAZCSg3Sen0H7MH3XVhGGMCL4cS69uJ0ENSvh+K6fiZzAXCKUPfvM=", "subType": "06" } } }, "local_javascript_rand_auto_id": { "kms": "local", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAANNL2AMKwTDyMIvxLKhBxZKx50C0tBdkLwuXmuMcrUqZeH8bsvjtttoM9LWkkileMyeTWgxblJ1b+uQ+V+4VT6fA==", "subType": "06" } } }, "local_javascript_rand_auto_altname": { "kms": "local", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAANBjBlHGw3K3TWQHpvfa1z0bKhNnVFC/lZArIexo3wjdGq3MdkGA5cuBIp87HHmOIv6o/pvQ9K74v48RQl+JH44A==", "subType": "06" } } }, "local_javascript_rand_explicit_id": { "kms": "local", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAANjvM7u3vNVyKpyI7g5kbzBpHPzXzOQToDSng5/c9yjMG+qi4TPtOyassobJOnMmDYBLyqRXCl/GsDLprbg5jxuA==", "subType": "06" } } }, "local_javascript_rand_explicit_altname": { "kms": "local", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAANMtO7KneuVx4gSOjX4MQjKL80zJhnt+efDBylkpNsqKyxBXB60nkiredGzwaK3/4QhIfGJrC1fQpwUwu/v1L17g==", "subType": "06" } } }, "local_javascript_det_auto_id": { "kms": "local", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAANmQsg9E/BzGJVNVhSNyunS/TH0332oVFdPS6gjX0Cp/JC0YhB97DLz3N4e/q8ECaz7tTdQt9JacNUgxo+YCULUA==", "subType": "06" } } }, "local_javascript_det_explicit_id": { "kms": "local", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAANmQsg9E/BzGJVNVhSNyunS/TH0332oVFdPS6gjX0Cp/JC0YhB97DLz3N4e/q8ECaz7tTdQt9JacNUgxo+YCULUA==", "subType": "06" } } }, "local_javascript_det_explicit_altname": { "kms": "local", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAANmQsg9E/BzGJVNVhSNyunS/TH0332oVFdPS6gjX0Cp/JC0YhB97DLz3N4e/q8ECaz7tTdQt9JacNUgxo+YCULUA==", "subType": "06" } } }, "local_symbol_rand_auto_id": { "kms": "local", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAOOuO2b23mekwI8b6gWeEgRy1lLOCsNyBKvdmizK7/oOVKCvd+3kwUn9a6TxygooiVAN/Aohr1cjb8jRlMPWpkP0iO0+Tt6+vkizgFsQW4iio=", "subType": "06" } } }, "local_symbol_rand_auto_altname": { "kms": "local", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAOhN4QPOcmGnFKGvTfhz6TQleDA02X6oWULLHTnOUJYfE3OUSyf2ULEQh1yhdKdwXMuYVgGl28pMosiwkBShrXYe5ZlMjiZCIMZWSdUMV0tXk=", "subType": "06" } } }, "local_symbol_rand_explicit_id": { "kms": "local", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAO9aWi9RliwQHdXHoJME9VyN6XgyGd95Eclx+ZFYfLxBGAuUnPNjSfVuNZwYdyKC8JX79+mYhk7IXmcGV4z+4486sxyLk3idi4Kmpz2ESqV5g=", "subType": "06" } } }, "local_symbol_rand_explicit_altname": { "kms": "local", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAO/qev3DPfpkQoSW9aHOyalwfI/VYDQVN5VMINx4kw2vEqHiI1HRdZRPOz3q74TlQEy3TMNMTYdCvh5bpN/PptRZCTQbzP6ugz9dTp79w5/Ok=", "subType": "06" } } }, "local_symbol_det_auto_id": { "kms": "local", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAOsg5cs6VpZWoTOFg4ztZmpj8kSTeCArVcI1Zz2pOnmMqNv/vcKQGhKSBbfniMripr7iuiYtlgkHGsdO2FqUp6Jb8NEWm5uWqdNU21zR9SRkE=", "subType": "06" } } }, "local_symbol_det_explicit_id": { "kms": "local", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAOsg5cs6VpZWoTOFg4ztZmpj8kSTeCArVcI1Zz2pOnmMqNv/vcKQGhKSBbfniMripr7iuiYtlgkHGsdO2FqUp6Jb8NEWm5uWqdNU21zR9SRkE=", "subType": "06" } } }, "local_symbol_det_explicit_altname": { "kms": "local", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAOsg5cs6VpZWoTOFg4ztZmpj8kSTeCArVcI1Zz2pOnmMqNv/vcKQGhKSBbfniMripr7iuiYtlgkHGsdO2FqUp6Jb8NEWm5uWqdNU21zR9SRkE=", "subType": "06" } } }, "local_javascriptWithScope_rand_auto_id": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAP5gLMvLOAc6vGAvC7bGmEC4eweptAiX3A7L0iCoHps/wm0FBLkfpF6F4pCjVYiY1lTID38wliRLPyhntCj+cfvlMfKSjouNgXMIWyQ8GKZ2c=", "subType": "06" } } }, "local_javascriptWithScope_rand_auto_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAPVsw9Opn/P5SAdJhX4MTxIcsmaG8isIN4NKPi9k1u/Vj7AVkcxYqwurAghaJpmfoAgMruvzi1hcKvd05yHd9Nk0vkvODwDgnjJB6QO+qUce8=", "subType": "06" } } }, "local_javascriptWithScope_rand_explicit_id": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAPLUa+nsrqiHkVdE5K1xl/ZsiZqQznG2yVXyA3b3loBylbcL2NEBp1JUeGnPZ0y5ZK4AmoL6NMH2Io313rW3V8FTArs/OOQWPRJSe6h0M3wXk=", "subType": "06" } } }, "local_javascriptWithScope_rand_explicit_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAPzUKaXCH0JImSlY73HVop9g9c0YssNEiA7Dy7Vji61avxvnuJJfghDchdwwaY7Vc8+0bymoanUWcErRctLzjm+1uKeMnFQokR8wFtnS3PgpQ=", "subType": "06" } } }, "local_javascriptWithScope_det_explicit_id": { "kms": "local", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_det_explicit_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "local_int_rand_auto_id": { "kms": "local", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAQHXpXb3KlHA2KFTBgl0VoLCu0CUf1ae4DckkwDorbredVSqxvA5e+NvVudY5yuea6bC9F57JlbjI8NWYAUw4q0Q==", "subType": "06" } } }, "local_int_rand_auto_altname": { "kms": "local", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAQSxXMF4+TKV+a3lcxXky8VepEqdg5wI/jg+C4CAUgNurq2XhgrxyqiMjkU8z07tfyoLYyX6P+dTrwj6nzvvchCw==", "subType": "06" } } }, "local_int_rand_explicit_id": { "kms": "local", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAQmzteYnshCI8HBGd7UYUKvcg4xl6M8PRyi1xX/WHbjyQkAJXxczS8hO91wuqStE3tBNSmulUejz9S691ufTd6ZA==", "subType": "06" } } }, "local_int_rand_explicit_altname": { "kms": "local", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAQLCHLru//++QSoWVEyw2v6TUfCnlrPJXrpLLezWf16vK85jTfm8vJbb2X2UzX04wGzVL9tCFFsWX6Z5gHXhgSBg==", "subType": "06" } } }, "local_int_det_auto_id": { "kms": "local", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAQIxWjLBromNUgiOoeoZ4RUJUYIfhfOmab0sa4qYlS9bgYI41FU6BtzaOevR16O9i+uACbiHL0X6FMXKjOmiRAug==", "subType": "06" } } }, "local_int_det_explicit_id": { "kms": "local", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAQIxWjLBromNUgiOoeoZ4RUJUYIfhfOmab0sa4qYlS9bgYI41FU6BtzaOevR16O9i+uACbiHL0X6FMXKjOmiRAug==", "subType": "06" } } }, "local_int_det_explicit_altname": { "kms": "local", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAQIxWjLBromNUgiOoeoZ4RUJUYIfhfOmab0sa4qYlS9bgYI41FU6BtzaOevR16O9i+uACbiHL0X6FMXKjOmiRAug==", "subType": "06" } } }, "local_timestamp_rand_auto_id": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAARntIycg0Xkd16GEa//VSJI4Rkl7dT6MpRa+D3MiTEeio5Yy8zGK0u2BtEP/9MCRQw2hJDYj5znVqwhdduM0OTiA==", "subType": "06" } } }, "local_timestamp_rand_auto_altname": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAARWA9Ox5ejDPeWxfjbRgcGCtF/G5yrPMbBJD9ESDFc0NaVe0sdNNTisEVxsSkn7M/S4FCibKh+C8femr7xhu1iTw==", "subType": "06" } } }, "local_timestamp_rand_explicit_id": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAARrEfOL4+4Qh7IkhHnHcBEANGfMF8n2wUDnsZ0lXEb0fACKzaN5OKaxMIQBs/3pFBw721qRfCHY+ByKeaQuABbzg==", "subType": "06" } } }, "local_timestamp_rand_explicit_altname": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAARW8nwmnBt+LFIAcFWvOzX8llrGcveQKFhyYUIth9d7wtpTyc9myFp8GBQCnjDpKzA6lPmbqVYeLU0L9q0h6SHGQ==", "subType": "06" } } }, "local_timestamp_det_auto_id": { "kms": "local", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAR6uMylGytMq8QDr5Yz3w9HlW2MkGt6yIgUKcXYSaXru8eer+EkLv66/vy5rHqTfV0+8ryoi+d+PWO5U6b3Ng5Gg==", "subType": "06" } } }, "local_timestamp_det_explicit_id": { "kms": "local", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAR6uMylGytMq8QDr5Yz3w9HlW2MkGt6yIgUKcXYSaXru8eer+EkLv66/vy5rHqTfV0+8ryoi+d+PWO5U6b3Ng5Gg==", "subType": "06" } } }, "local_timestamp_det_explicit_altname": { "kms": "local", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAR6uMylGytMq8QDr5Yz3w9HlW2MkGt6yIgUKcXYSaXru8eer+EkLv66/vy5rHqTfV0+8ryoi+d+PWO5U6b3Ng5Gg==", "subType": "06" } } }, "local_long_rand_auto_id": { "kms": "local", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAASrinKUOpHIB7MNRmCAPWcP4CjZwfr5JaRT3G/GqY9B/6csj3+N9jmo1fYvM8uHcnmf5hzDDOamaE2FF1jDKkrHw==", "subType": "06" } } }, "local_long_rand_auto_altname": { "kms": "local", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAShWMPYDkCpTC2XLYyykPJMihASLKn6HHcB2Eh7jFwQb/8D1HCQoPmOHMyXaN4AtIKm1oqEfma6FSnEPENQoledQ==", "subType": "06" } } }, "local_long_rand_explicit_id": { "kms": "local", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAASd2h34ZLib+GiYayrm/FIZ/weg8wF41T0PfF8NCLTJCoT7gIkdpNRz2zkkQgZMR31efNKtsM8Bs4wgZbkrXsXWg==", "subType": "06" } } }, "local_long_rand_explicit_altname": { "kms": "local", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAASPAvdjz+a3FvXqDSjazaGqwZxrfXlfFB5/VjQFXQB0gpodCEaz1qaLSKfCWBg83ftrYKa/1sa44gU5NBthDfDwQ==", "subType": "06" } } }, "local_long_det_auto_id": { "kms": "local", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAASQk372m/hW3WX82/GH+ikPv3QUwK7Hh/RBpAguiNxMdNhkgA/y2gznVNm17t6djyub7+d5zN4P5PLS/EOm2kjtw==", "subType": "06" } } }, "local_long_det_explicit_id": { "kms": "local", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAASQk372m/hW3WX82/GH+ikPv3QUwK7Hh/RBpAguiNxMdNhkgA/y2gznVNm17t6djyub7+d5zN4P5PLS/EOm2kjtw==", "subType": "06" } } }, "local_long_det_explicit_altname": { "kms": "local", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAASQk372m/hW3WX82/GH+ikPv3QUwK7Hh/RBpAguiNxMdNhkgA/y2gznVNm17t6djyub7+d5zN4P5PLS/EOm2kjtw==", "subType": "06" } } }, "local_decimal_rand_auto_id": { "kms": "local", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAATLnMMDZhnGSn5F5xHhsJXxiTGXd61Eq6fgppOlxUNVlsZNYyr5tZ3owfTTqRuD9yRg97x65WiHewBBnJJSeirCTAy9zZxWPVlJSiC0gO7rbM=", "subType": "06" } } }, "local_decimal_rand_auto_altname": { "kms": "local", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAATenMh7NKQioGjpuEojIrYKFaJhbuGxUgu2yTTbe3TndhgHryhW9GXiUqo8WTpnXqpC5E/z03ZYLWfCbe7qGdL6T7bbrTpaTaWZnnAm3XaCqY=", "subType": "06" } } }, "local_decimal_rand_explicit_id": { "kms": "local", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAT9vqXuKRh+2HxeCMr+pQYdhYNw7xrTdU4dySWz0X6tCK7LZO5AV72utmRJxID7Bqv1ZlXAk00V92oDLyKG9kHeG5+S34QE/aLCPsAWcppfxY=", "subType": "06" } } }, "local_decimal_rand_explicit_altname": { "kms": "local", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAATtqOCFMbOkls3LikQNXlnlkRr5gJns1+5Kvbt7P7texMa/QlXkYSHhtwESyfOcCQ2sw1T0eZ9DDuNaznpdK2KIqZBkVEC9iMoxqIqXF7Nab0=", "subType": "06" } } }, "local_decimal_det_explicit_id": { "kms": "local", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "local_decimal_det_explicit_altname": { "kms": "local", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "local_minKey_rand_explicit_id": { "kms": "local", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_rand_explicit_altname": { "kms": "local", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_det_explicit_id": { "kms": "local", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_det_explicit_altname": { "kms": "local", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "local_maxKey_rand_explicit_id": { "kms": "local", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_rand_explicit_altname": { "kms": "local", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_det_explicit_id": { "kms": "local", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_det_explicit_altname": { "kms": "local", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "payload=0,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACcsBdT93ivCyvtkfQz9qb1A9Ll+I6hnGE0kFy3rmVG6xAvipmRJSoVq3iv7iUEDvaqmPXfjeH8h8cPYT86v3XSg==", "subType": "06" } } }, "payload=1,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACQOzpNBEGSrANr3Wl8uYpqeIc7pjc8e2LS2FaSrb8tM9F3mR1FqGgfJtn3eD+HZf3Y3WEDGK8975a/1BufkMqIQ==", "subType": "06" } } }, "payload=2,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACyGJEcuN1pG5oSEyxuKFwqddGHVU5Untbib7LkmtoJe9HngTofkOpeHZH/hV6Z3CFxLu6WFliJoySsFFbnFy9ag==", "subType": "06" } } }, "payload=3,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACLbp4w6mx45lR1vvgmeRja/y8U+WnR2oH4IpfrDi4lKM+JPVnJweiN3/1wAy+sXSy0S1Yh9yxmhh9ISoTkAuVxw==", "subType": "06" } } }, "payload=4,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACG0qMY/GPZ/2CR61cxbuizywefyMZVdeTCn5KFjqwejgxeBwX0JmGNHKKWbQIDQykRFv0q0WHUgsRmRhaotNCyQ==", "subType": "06" } } }, "payload=5,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACJI1onNpQfZhaYWrPEzHvNaJRqUDZK2xoyonB5E473BPgp3zvn0Jmz1deL8GzS+HlkjCrx39OvHyVt3+3S0kYYw==", "subType": "06" } } }, "payload=6,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAClyKY9tZBjl7SewSXr3MdoWRDUNgLaXDUjENpjyYvi/54EQ9a+J/LAAh1892i+mLpYxEUAmcftPyfX3VhbCgUQw==", "subType": "06" } } }, "payload=7,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACAMbEA+kNvnVV7B//ds2/QoVot061kbazoMwB/psB5eFdLVB5qApAXEWgQEMwkNnsTUYbtSduQz6uGwdagtNBRw==", "subType": "06" } } }, "payload=8,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACzdSK/d7Ni6D8qUgNopnEU5ia1K5llhBGk3O1Tf71t4ThnQjYW9eI/rIohWmev5CGWLHhwuvvKUtFcTAe+NMQww==", "subType": "06" } } }, "payload=9,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACzQcEa+ktF2EZf35TtyatnSGGaIVvFhZNuo5P3VwQvoONJrK2cSad7PBDAv3xDAB+VPZAigXAGQvd051sHooOHg==", "subType": "06" } } }, "payload=10,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACpfoDmApsR5xOD3TDhcHeD7Jco3kPFuuWjDpHtMepMOJ3S0c+ngGGhzPGZtEz2xuD/E7AQn1ryp/WAQ+WwkaJkQ==", "subType": "06" } } }, "payload=11,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACICMRXmx3oKqYv0IpmzkSMBIGT4Li3MPBF4Lw1s5F69WvZApD58glIKB6b7koIrF5qc2Wrb1/Nw+stRv0zvQ8Y9CcFV4OHm6WoEw+XDlWXJ4=", "subType": "06" } } }, "payload=12,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACTArUn0WUTojQC4fSvq3TwJVTsZNhWAK2WB057u2EnkUzMC0xsbU6611W6Okx6idZ7pMudXpBC34fRDrJPXOu3BxK+ZLCOWS2FqsvWq3HeTY=", "subType": "06" } } }, "payload=13,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACU1Ojn7EM2i+5KK2Beh1gPLhryK3Y7PtaZ/v4JvstxuAV4OHOR9yROP7pwenHXxczkWXvcyMY9OCdmHO8pkQkXO21798IPkDDN/ejJUFI0Uw=", "subType": "06" } } }, "payload=14,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAAC0ZLwSliCbcr/e1uiYWk6gRuD/5qiyulQ7IUNWjhpBR6SLUfX2+yExLzps9hoOp53j9zRSKIzyleZ8yGLTLeN+Lz9BUe2ZT+sV8NiqZz3pkA=", "subType": "06" } } }, "payload=15,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACQ9pmlQeFDr+jEhFwjL/eGVxdv70JdnkLaKdJ3/jkvCX1VPU5HmQIi+JWY3Rrw844E/6sBR6zIODn5aM0WfyP8a2zKRAWaVQZ7n+QE9hDN/8=", "subType": "06" } } }, "payload=16,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AizggCwAAAAAAAAAAAAAAAACiOcItInDGHqvkH0I3udp5nnX32XzDeqya/3KDjgZPT5GHek1vFTZ4924JVxFqFQz+No9rOVmyxm8O2fxjTK2vsjtADzKGnMTtFYZqghYCuc=", "subType": "06" } } }, "payload=0,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACijFptWQy7a1Y0rpXEvamXWI9v9dnx0Qj84/mKUsVpc3agkQ0B04uPYeROdt2MeEeiZoEKVWV0NjBocAQCEz7dw==", "subType": "06" } } }, "payload=1,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAChR90taVWsZk+++sgibX6CnFeQQHNoB8V+n2gmDe3CIT/t+WvhMf9D+mQipbAlrUyHgGihKMHcvAZ5RZ/spaH4Q==", "subType": "06" } } }, "payload=2,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAC67wemDv1Xdu7+EMR9LMBTOxfyAqsGaxQibwamZItzplslL/Dp3t9g9vPuNzq0dWwhnfxQ9GBe8OA3dtRaifYCA==", "subType": "06" } } }, "payload=3,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACVLxch+uC7weXrbtylCo1m4HYZmh0sd9JCrlTECO2M56JK1X9a30i2BDUdhPuoTvvODv74CGXkZKdist3o0mGAQ==", "subType": "06" } } }, "payload=4,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACexfIZGkOYaCGktOUc6cgAYg7Bd/C5ZYmdb7b8+rd5BKWbthW6N6CxhDIyh/DHvkPAeIzfTYA2/9w6tsjfD/TPQ==", "subType": "06" } } }, "payload=5,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACjUH/dPW4egOvFMJJnpWK8v27MeLkbXC4GFl1j+wPqTsIEeIWkzEmcXjHLTQGE2GplHHc/zxwRwD2dXdbzvsCDw==", "subType": "06" } } }, "payload=6,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACzvS+QkGlvb05pNn+vBMml09yKmE8yM6lwccNIST5uZSsUxXf2hrxPtO7Ylc4lmBAJt/9bcM59JIeT9fpYMc75w==", "subType": "06" } } }, "payload=7,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACSf2RxHJpRuh4j8nS1dfonUtsJEwgqfWrwOsfuT/tAGXgDN0ObUpzL2K7G2vmePjP4dwycCSIL3+2j34bqBJK1Q==", "subType": "06" } } }, "payload=8,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACu96YYeLXXoYdEZYNU9UAZjSd6G4fOE1edrA6/RjZKVGWKxftmvj5g1VAOiom0XuTZUe1ihbnwhvKexeoa3Vc8Q==", "subType": "06" } } }, "payload=9,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACX+UjBKo9+N0Z+mbyqZqkQv2ETMSn6aPTONWgJtw5nWklcxKjUSSLI+8LW/6M6Xf9a7177GsqmV2f/yCRF58Xtw==", "subType": "06" } } }, "payload=10,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACL6TVscFzIJ9+Zj6LsCZ9xhaZuTZdvz1nJe4l69nKyj9hCjnyuiV6Ve4AXwQ5W1wiPfkJ0fCZS33NwiHw7QQ/vg==", "subType": "06" } } }, "payload=11,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACPLq7IcWhTVwkKmy0flN7opoQzx7tTe1eD9JIc25FC9B6KGQkdcRDglDDR7/m6+kBtTnq88y63vBgomTxA8ZxQE+3pB7zCiBhX0QznuXvP44=", "subType": "06" } } }, "payload=12,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACxv7v4pKtom5z1g9FUuyjEWAbdzJ3ytPNZlOfVr6KZnUPhIH7PfCz3/lTdYYWBTj01+SUZiC/7ruof9QDhsSiNWP7nUyHpQ/C3joI/BBjtDA=", "subType": "06" } } }, "payload=13,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACZhiElQ/MvyVMwMkZPu8pT54Ap6TlpVSEbE4nIQzzeU3XKVuspMdI5IXvvgfULXKXc+AOu6oQXZ+wAJ1tErVOsb48HF1g0wbXbBA31C5qLEM=", "subType": "06" } } }, "payload=14,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACdp8mDOeDuDLhE0LzTOT2p0CMaUsAQrGCzmiK6Ab9xvaIcPPcejUcpdO3XXAS/pPab4+TUwO5GbI5pDJ29zwaOiOz2H3OJ2m2p5BHQp9mCys=", "subType": "06" } } }, "payload=15,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAACmtLohoP/gotuon2IvnGeLEfCWHRMhG9Wp4tPu/vbJJkJkbQTP35HRG9VrMV7KKrEQbOsJ2Y6UDBra4tyjn0fIkwwc/0X9i+xaP+TrwpNabE=", "subType": "06" } } }, "payload=16,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASzggCwAAAAAAAAAAAAAAAAC6s9eUtSneKWj3/A7S+bPZLj3t1WtUh7ltW80b8jCRzA+kOI26j1MEb1tt68HgcnH1IJ3YQ/+UHlV95OgwSnIxlib/HJn3U0s8mpuCWe1Auo=", "subType": "06" } } }, "azure_double_rand_auto_id": { "kms": "azure", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAB0S2kOZe54q6iZqeTLndkX+kehTKtb30jTP7FS+Zx+cxhFs626OrGY+jrH41cLfroCccacyNHUZFRinfqZPNOyw==", "subType": "06" } } }, "azure_double_rand_auto_altname": { "kms": "azure", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAABYViH7PLjCIdmTibW9dGCJADwXx2dRSMYxEmulPu89clAoeLDa8pwJ7YxLFQCcTGmZRfmp58dDDAzV8tyyE8QMg==", "subType": "06" } } }, "azure_double_rand_explicit_id": { "kms": "azure", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAABeRahSj4pniBp0rLIEZE8MdeyiIKcYuTZiuGzGiXbFbntEPow88DFHIBSxbMGR7p/8jCpPL+GqBwFkPkafXbMzg==", "subType": "06" } } }, "azure_double_rand_explicit_altname": { "kms": "azure", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAABdaa3vKtO4cAEUjYJfOPl1KbbgeWtphfUuJd6MxR9VReNSf1jc+kONwmkPVQs2WyZ1n+TSQMGRoBp1nHRttDdTg==", "subType": "06" } } }, "azure_double_det_explicit_id": { "kms": "azure", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "azure_double_det_explicit_altname": { "kms": "azure", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "azure_string_rand_auto_id": { "kms": "azure", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAACeoztcDg9oZ7ixHinReWQTrAumpsfyb0E1s3BGOFHgBCi1tW79CEXfqN8riFRc1YeRTlN4k5ShgHaBWBlax+XoQ==", "subType": "06" } } }, "azure_string_rand_auto_altname": { "kms": "azure", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAACov9cXQvDHeKOS5Gxcxa8vdAcTsTXDYgUucGzsCyh4TnTWKGQEVk3DHndUXX569TKCjq5QsC//oWEwweCn1nZ4g==", "subType": "06" } } }, "azure_string_rand_explicit_id": { "kms": "azure", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAACKU5qTdMdO0buQ/37ZRANUAAafcsoNMOTxJsDOfkqUb+/kRgM1ePlwVvk4EJiAGhJ/4SEmEOpwv05TT3PxGur2Q==", "subType": "06" } } }, "azure_string_rand_explicit_altname": { "kms": "azure", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAACX/ODKGHUyAKxoJ/c/3lEDBTc+eP/VS8OHrLhYoP96McpnFSgYi5jfUwvrFYa715fkass4N0nAHE6TzoGTYyk6Q==", "subType": "06" } } }, "azure_string_det_auto_id": { "kms": "azure", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAACmVI7YK4JLOzutEdQ79he817Vk5EDP/3hXwOlGmERZCtp8J8HcqClhV+pyvRLGbwmlh12fbSs9nEp7mrobQm9wA==", "subType": "06" } } }, "azure_string_det_explicit_id": { "kms": "azure", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAACmVI7YK4JLOzutEdQ79he817Vk5EDP/3hXwOlGmERZCtp8J8HcqClhV+pyvRLGbwmlh12fbSs9nEp7mrobQm9wA==", "subType": "06" } } }, "azure_string_det_explicit_altname": { "kms": "azure", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAACmVI7YK4JLOzutEdQ79he817Vk5EDP/3hXwOlGmERZCtp8J8HcqClhV+pyvRLGbwmlh12fbSs9nEp7mrobQm9wA==", "subType": "06" } } }, "azure_object_rand_auto_id": { "kms": "azure", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAADWkZMsfCo4dOPMH1RXC7GkZFt1RCjJf0vaLDA09ih1Jl47SOetZELQ7B1TQjRQitktzrfD43jk8Fn4J5ZYZu1qQ==", "subType": "06" } } }, "azure_object_rand_auto_altname": { "kms": "azure", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAADJFMymfstltZP1oAqj4bgbCk8uLGtCd12eLqvSq0ZO+JDvls7PAovwmoWwigHunP8BBXT8sLydK+jn1sHfnhrlw==", "subType": "06" } } }, "azure_object_rand_explicit_id": { "kms": "azure", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAADCen+XrLYKg7gIVubVfdbQwuJ0mFHxhSUUyyBWj4RCeLeLUYXckboPGixXWB9XdwcOnInfF9u6qvktY67GtYASQ==", "subType": "06" } } }, "azure_object_rand_explicit_altname": { "kms": "azure", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAADnUyp/7eLmxxxOdsP+mNuJABK4PQoKFWDAY7lDrH6MYa03ryASOihPZWYZWXZLrbAf7cQQhElEkKqKwY8+NXgqg==", "subType": "06" } } }, "azure_object_det_explicit_id": { "kms": "azure", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "azure_object_det_explicit_altname": { "kms": "azure", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "azure_array_rand_auto_id": { "kms": "azure", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAEtk14WyoatZcNPlg3y/XJNsBt6neFJeQwR06B9rMGV58oIsmeE5zMtUOBYTgzlnwyKpqI/XVAg8s1VxvsrvGCyLVPwGVyDztwtMgVSW6QM3s=", "subType": "06" } } }, "azure_array_rand_auto_altname": { "kms": "azure", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAERTO63J4Nj1BpFlqVduA2IrAiGoV4jEOH3FnFgx7ZP7da/YBmLX/bc1EqdpC8v4faHxp74iU0xAB0yW4WgySDX7rriL5cw9sMpqgLRaBxGug=", "subType": "06" } } }, "azure_array_rand_explicit_id": { "kms": "azure", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAEs09qQdNVwh+KFqKPREQkw0XFdRNHAvjYJzs5MDE9+QxvtKlmVKSK3wkxDdCrcH4r7ePV2nCy2h1IHYqaDnnt4s5dSawI2l88iTT+bBcCSrU=", "subType": "06" } } }, "azure_array_rand_explicit_altname": { "kms": "azure", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAEaQ/YL50up4YIMJuVJSiAP06IQ+YjdKLIfkN/prbOZMiXErcD1Vq1hwGhfGdpEsLVu8E7IhJb4wakVC/2dLZoRP95az6HqRRauNNZAIQMKfY=", "subType": "06" } } }, "azure_array_det_explicit_id": { "kms": "azure", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_det_explicit_altname": { "kms": "azure", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_binData=00_rand_auto_id": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFl/leuLAHf1p6aRKHdFyN9FM6MW2XzBemql2xQgqkwJ6YOQXW6Pu/aI1scXVOrvrSu3+wBvByjHu++1AqFgzZRQ==", "subType": "06" } } }, "azure_binData=00_rand_auto_altname": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAF4Nq/LwyufT/mx0LtFSkupNHTuyjbr4yUy1N5/37XhkpqZ1e4sWCHGNaTDEm5+cvdnbqZ/MMkBv855dc8N7vnGA==", "subType": "06" } } }, "azure_binData=00_rand_explicit_id": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFv1Kbv54uXJ76Ih63vtmszQtzkXqDlv8LDCFO3sjzu70+tgRXOhLm3J8uZpwoiNkgM6oNLn0en7tnEekYB9++CA==", "subType": "06" } } }, "azure_binData=00_rand_explicit_altname": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFgcYC1n7cGGXpv0qf1Kb8t9y/6kbhscGt2QJkQpAiqadFPPYDU/wwaKdDz94NpAHMZizUbhf9tvZ3UXl1bozhDA==", "subType": "06" } } }, "azure_binData=00_det_auto_id": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFvswfP3+jgia6rAyrypvbso3Xm4d7MEgJRUCWFYzA+9ov++vmeirgoTp/rFavTNOPb+61fvl1WKbVwrgODusaMg==", "subType": "06" } } }, "azure_binData=00_det_explicit_id": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFvswfP3+jgia6rAyrypvbso3Xm4d7MEgJRUCWFYzA+9ov++vmeirgoTp/rFavTNOPb+61fvl1WKbVwrgODusaMg==", "subType": "06" } } }, "azure_binData=00_det_explicit_altname": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFvswfP3+jgia6rAyrypvbso3Xm4d7MEgJRUCWFYzA+9ov++vmeirgoTp/rFavTNOPb+61fvl1WKbVwrgODusaMg==", "subType": "06" } } }, "azure_binData=04_rand_auto_id": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFMzMC3BLn/zWE9dxpcD8G0h4aifSY0zSHS9xTVJXgq21s2WU++Ov2UvHatVozmtZltsUN9JvSWqOBQRkFsrXvI7bc4lYfOoOmfpTHFcRDA/c=", "subType": "06" } } }, "azure_binData=04_rand_auto_altname": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFDlBN5hUTcjamOg/sgyeG0S52kphsjUgvlpuqHYz6VVdLtZ69cGHOVqqyml3x2rVqWUZJjd4ZodOhlwWq9p+i5IYNot2QaBvi8NZSaiThTc0=", "subType": "06" } } }, "azure_binData=04_rand_explicit_id": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFjvS2ozJuAL3rCvyBpraVtgL91OMdiskmgYnyfKlzd8EhYLd1cL4yxnTUjRXx+W+p8uN0/QZo+mynhcWnwcq83raY+I1HftSTx+S6rZ0qyDM=", "subType": "06" } } }, "azure_binData=04_rand_explicit_altname": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAFqUMd/I0yOdy5W4THvFc6yrgSzB6arkRs/06b0M9Ii+QtAY6vbz+/aJ0Iy3Jm8TahC1wOZVmTj5luQpr+PHZMCEAFadv+0K/Nsx6xVhAh9gg=", "subType": "06" } } }, "azure_binData=04_det_auto_id": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFmN+KMrERGmfmue8/hG4D+ZcGzxC2HntdYBLjEolzvS9FV5JH/adxyUAnMpyL8FNznARL51rbv/G1nXPn9mPabsQ4BtWEAQbHx9TiXd+xbB0=", "subType": "06" } } }, "azure_binData=04_det_explicit_id": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFmN+KMrERGmfmue8/hG4D+ZcGzxC2HntdYBLjEolzvS9FV5JH/adxyUAnMpyL8FNznARL51rbv/G1nXPn9mPabsQ4BtWEAQbHx9TiXd+xbB0=", "subType": "06" } } }, "azure_binData=04_det_explicit_altname": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAFmN+KMrERGmfmue8/hG4D+ZcGzxC2HntdYBLjEolzvS9FV5JH/adxyUAnMpyL8FNznARL51rbv/G1nXPn9mPabsQ4BtWEAQbHx9TiXd+xbB0=", "subType": "06" } } }, "azure_undefined_rand_explicit_id": { "kms": "azure", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_rand_explicit_altname": { "kms": "azure", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_det_explicit_id": { "kms": "azure", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_det_explicit_altname": { "kms": "azure", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "azure_objectId_rand_auto_id": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAH3sYVJpCKi310YxndMwm5ltEbbiRO1RwZxxeEkzI8tptbNXC8t7RkrT8VSJZ43wbGYCiqH5RZy9v8pYwtUm4STw==", "subType": "06" } } }, "azure_objectId_rand_auto_altname": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAHD7agzVEc0JwesHHhkpGYIDAHQ+3Hc691kqic6YmVvK2N45fD5aRKftaZNs5OxSj3tNHSo7lQ+DVtPj8uSSpsVg==", "subType": "06" } } }, "azure_objectId_rand_explicit_id": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAHEgKgy2mpMLpfeEWqbvQOaRZAy+cEGXGon3e53/JoH6dZneEyyt4ZrcrK6uRqyUPWX0q104JbCYxfbtHtdzWgPQ==", "subType": "06" } } }, "azure_objectId_rand_explicit_altname": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAHqSv6Nruw3TIi7y0FPRjSfnJmWSdv5XMhAtnHNkT8MVuHeM32ayo0yc8dTA1wlkRtAI5JrGxTfERCXYuCojvvXg==", "subType": "06" } } }, "azure_objectId_det_auto_id": { "kms": "azure", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAHcPRjIOyLDUJCDcdWkUySKCFS2AFkIa1OQyQAfC3Zh5HwJ1O7j2o+iYKRerhbni8lBiZH7EUMm1JcxM99lLC5jQ==", "subType": "06" } } }, "azure_objectId_det_explicit_id": { "kms": "azure", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAHcPRjIOyLDUJCDcdWkUySKCFS2AFkIa1OQyQAfC3Zh5HwJ1O7j2o+iYKRerhbni8lBiZH7EUMm1JcxM99lLC5jQ==", "subType": "06" } } }, "azure_objectId_det_explicit_altname": { "kms": "azure", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAHcPRjIOyLDUJCDcdWkUySKCFS2AFkIa1OQyQAfC3Zh5HwJ1O7j2o+iYKRerhbni8lBiZH7EUMm1JcxM99lLC5jQ==", "subType": "06" } } }, "azure_bool_rand_auto_id": { "kms": "azure", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAIYVWPvzSmiCs9LwRlv/AoQWhaS5mzoKX4W26M5eg/gPjOZbEVYOV80pWMxCcZWRAyV/NDWDUmKtRQDMU9b8lCJw==", "subType": "06" } } }, "azure_bool_rand_auto_altname": { "kms": "azure", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAIsAB01Ugqtw4T9SkuJBQN1y/ewpRAyz0vjFPdKI+jmPMmaXpMlXDJU8ZbTKm/nh6sjJCFcY5oZJ83ylbp2gHc6w==", "subType": "06" } } }, "azure_bool_rand_explicit_id": { "kms": "azure", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAIr8/qFd564X1mqHEhB0y7bzGFdrHuw+Gk45nXla3VvGHzeIJy6j2Wdl0uziWslMmBvNp8WweW+jQ6E2Fu7SiojQ==", "subType": "06" } } }, "azure_bool_rand_explicit_altname": { "kms": "azure", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAIWsca5FAnS2zhHnmKmexvvXMTgsZZ7uAFHnjQassUcay6mvIWH4hOnGiRxt5Zm0wO4S6cZq+PZrmEH5/n9rJcJQ==", "subType": "06" } } }, "azure_bool_det_explicit_id": { "kms": "azure", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "azure_bool_det_explicit_altname": { "kms": "azure", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "azure_date_rand_auto_id": { "kms": "azure", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAJwKo7XW5daIFlwY1mDAnJdHlcUgF+74oViL28hQGhde63pkPyyS6lPkYrc1gcCK5DL7PwsSX4Vb9SsNAG9860xw==", "subType": "06" } } }, "azure_date_rand_auto_altname": { "kms": "azure", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAJYZdWIqvqTztGKJkSASMEOjyrUFKnYql8fMIEzfEZWx2BYsIkxxOUUUCASg/Jsn09fTLVQ7yLD+LwycuI2uaXsw==", "subType": "06" } } }, "azure_date_rand_explicit_id": { "kms": "azure", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAJuWzKqi3KV8GbGGnT7i9N4BACUuNjt5AgKsjWIfrWRXK1+jRQFq0bYlVWaliT9CNIygL2aTF0H4eHl55PAI84MQ==", "subType": "06" } } }, "azure_date_rand_explicit_altname": { "kms": "azure", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAJ5JTtTuP4zTnEbaVlS/W59SrZ08LOC4ZIl+h+H4RnfHUfBXDwUou+APolVaYko+VZMKecrikdPeewgzWaqazJ1g==", "subType": "06" } } }, "azure_date_det_auto_id": { "kms": "azure", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAJCREIp/SPolAZcVU1iOmaJaN2tFId5HhrjNmhp6xhA1AIPLnN+U7TAqesxFN7iebR9fXI5fZxYNgyWqQC1rqUJw==", "subType": "06" } } }, "azure_date_det_explicit_id": { "kms": "azure", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAJCREIp/SPolAZcVU1iOmaJaN2tFId5HhrjNmhp6xhA1AIPLnN+U7TAqesxFN7iebR9fXI5fZxYNgyWqQC1rqUJw==", "subType": "06" } } }, "azure_date_det_explicit_altname": { "kms": "azure", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAJCREIp/SPolAZcVU1iOmaJaN2tFId5HhrjNmhp6xhA1AIPLnN+U7TAqesxFN7iebR9fXI5fZxYNgyWqQC1rqUJw==", "subType": "06" } } }, "azure_null_rand_explicit_id": { "kms": "azure", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "azure_null_rand_explicit_altname": { "kms": "azure", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "azure_null_det_explicit_id": { "kms": "azure", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "azure_null_det_explicit_altname": { "kms": "azure", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "azure_regex_rand_auto_id": { "kms": "azure", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAALsMm3W2ogEiI6m0l8dS5Xhqnw+vMBvN1EesOTqAZOk4tQleX6fWARwUUnjFxbuejU7ISb50fc/Ul+ntL9z/2nHQ==", "subType": "06" } } }, "azure_regex_rand_auto_altname": { "kms": "azure", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAALITQNQI0hfCeMTxH0Hce1Cf5tinQG+Bq8EolUACvxUUQcDqIXfFXn19tV/Qyj4lIdnnwh/18hiswgEpJRK7uLGw==", "subType": "06" } } }, "azure_regex_rand_explicit_id": { "kms": "azure", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAALw/1QI/bKeiGUrrtC+yXOTvxZ2mJjSelPPGOm1mge0ws8DsX0DPHmo6MjhnRO4u0c/LWiE3hwHG2rYjAFlFXZ5A==", "subType": "06" } } }, "azure_regex_rand_explicit_altname": { "kms": "azure", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAL6Sl58UfFCHCZzWIB4r19/ZjeSRAoWeTFCFedKiwyR8/xnL+8jzXK/9+vTIspP6j35lFapr+f4iBNB9WjdpYNKA==", "subType": "06" } } }, "azure_regex_det_auto_id": { "kms": "azure", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAALxshM91Tsql/8kPe3dC16oP36XSUIN6godiRVIJLJ+NAwYtEkThthQsln7CrkIxIx6npN6A/hw1CBJERS/cqWhw==", "subType": "06" } } }, "azure_regex_det_explicit_id": { "kms": "azure", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAALxshM91Tsql/8kPe3dC16oP36XSUIN6godiRVIJLJ+NAwYtEkThthQsln7CrkIxIx6npN6A/hw1CBJERS/cqWhw==", "subType": "06" } } }, "azure_regex_det_explicit_altname": { "kms": "azure", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAALxshM91Tsql/8kPe3dC16oP36XSUIN6godiRVIJLJ+NAwYtEkThthQsln7CrkIxIx6npN6A/hw1CBJERS/cqWhw==", "subType": "06" } } }, "azure_dbPointer_rand_auto_id": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAMaAd1v/XCYM2Kzi/f4utR6aHOFORmzZ17EepEjkn5IeKshktUpPWjI/dBwSunn5Qxx2zI3nm06c3SDvp6tw8qb7u4qXjLQYhlsQ0bHvvm+vE=", "subType": "06" } } }, "azure_dbPointer_rand_auto_altname": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAM6VNjkN9bMIzfC7AX0ZhOEXPpyPE0nzYq3c5TNHrgeGWdZDR9GVdbO9t55zQrQJJ2Mmevh8c0WaAUV+YODv7ty6TDBsPbaKWWqMzu/v9RXHo=", "subType": "06" } } }, "azure_dbPointer_rand_explicit_id": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAM66tywuMhwdyUjxfl7EOdKHNCLeIPnct3PgKrAKlOQFjiNQUIA2ShVy0qYpJcvvFsuQ5e8Bjr0IqeBc8mC7n4euRSM1UXpLqI5XHgXMMaYpI=", "subType": "06" } } }, "azure_dbPointer_rand_explicit_altname": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAMtPQEbZ4gWoSYjVZLd5X6j0XxutWY1Ecrys2ErKRgZaxP0uGe8uw0cnr2Z5PYylaYmsSicLwD1PwWY42PKmaGBDraHmdfqDOPvrNxhBrfU/E=", "subType": "06" } } }, "azure_dbPointer_det_auto_id": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAMxUcVqq6RpAUCv08qGkmjuwVAIgLeYyh7xZnMeCYVGmhJKIP1Zdt1SvRGRV0jzwCQmXgxNd04adRwJnG/PRQIsL9aH3ilJgEnUbOo1nqR7yw=", "subType": "06" } } }, "azure_dbPointer_det_explicit_id": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAMxUcVqq6RpAUCv08qGkmjuwVAIgLeYyh7xZnMeCYVGmhJKIP1Zdt1SvRGRV0jzwCQmXgxNd04adRwJnG/PRQIsL9aH3ilJgEnUbOo1nqR7yw=", "subType": "06" } } }, "azure_dbPointer_det_explicit_altname": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAMxUcVqq6RpAUCv08qGkmjuwVAIgLeYyh7xZnMeCYVGmhJKIP1Zdt1SvRGRV0jzwCQmXgxNd04adRwJnG/PRQIsL9aH3ilJgEnUbOo1nqR7yw=", "subType": "06" } } }, "azure_javascript_rand_auto_id": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAANWXPb5z3a0S7F26vkmBF3fV+oXYUj15OEtnSlXlUrc+gbhbPDxSvCPnTBEy5sNu4ndkvEZZxYgZInkF2q4rhlfQ==", "subType": "06" } } }, "azure_javascript_rand_auto_altname": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAANN4mcwLz/J4eOUknhVsy6kdF1ThDP8cx6dNpOwJWAiyPHEsn+i6JmMTlfQMBrUp9HB/u3R+jLO5yz4XgLUKE8Tw==", "subType": "06" } } }, "azure_javascript_rand_explicit_id": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAANJ+t5Z8hSQaoNzszzkWndAo4A0avDf9bKFa7euznz8ZYInnl9RUVqWMyxjSuIotAvTyYSJzxh+w2hKCgVf+MjEA==", "subType": "06" } } }, "azure_javascript_rand_explicit_altname": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAANRLOQFpmkEg/KdWMmaurkNtUhy45rgtoipc9kQz6olgDWiMim81XC0AW5cOvjbHXL3w7Du28Kwdsp4j0PTTXHUQ==", "subType": "06" } } }, "azure_javascript_det_auto_id": { "kms": "azure", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAANUrNUS/7/dmKVWBd+2JKGEn1hxbFSyu3p5sDNatukG2m16t4WwxzmYAg8PuQbAxekprs7iaLA+7D2Kn3ZuMSQOw==", "subType": "06" } } }, "azure_javascript_det_explicit_id": { "kms": "azure", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAANUrNUS/7/dmKVWBd+2JKGEn1hxbFSyu3p5sDNatukG2m16t4WwxzmYAg8PuQbAxekprs7iaLA+7D2Kn3ZuMSQOw==", "subType": "06" } } }, "azure_javascript_det_explicit_altname": { "kms": "azure", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAANUrNUS/7/dmKVWBd+2JKGEn1hxbFSyu3p5sDNatukG2m16t4WwxzmYAg8PuQbAxekprs7iaLA+7D2Kn3ZuMSQOw==", "subType": "06" } } }, "azure_symbol_rand_auto_id": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAORMcgtQSU+/2Qlq57neRrVuAFSeSwkqdo+z1fh6IKjyEzhCy+u5bTzSzTopyKJQTCUZA2mSpRezWkM87oiGfhMFkBRVreMcE62eH+BLlgUaM=", "subType": "06" } } }, "azure_symbol_rand_auto_altname": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAOIKlAw/A3nwHn0tO2cYtJx0azB8MGmXtt+bRptzn8yHlUSpMpYaiU0ssBBiLkmMLAITYebLqDk3NHESyP7PvbSfX1E2XVn2Nf694ZqPWMec8=", "subType": "06" } } }, "azure_symbol_rand_explicit_id": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAO8SXW76AEr/6D6zyP1RYwmwdVM2AINaXZn3Ipy+fynWTUV6XIPIRR7xMTttNo2zlh7fgXDZ28PmjooGlQzn0q0JVQmXPCIPM3aqAmMcgyuqg=", "subType": "06" } } }, "azure_symbol_rand_explicit_altname": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAOtoJWm2Ucre0foHIiOutsX1WIyub7t3Lby3/F8zRXn+l6ixlTjAPgWFwpRnYg96Lt2ACDDQ9CO51ejr9qk0b8LDBwG3qU5Cuibsp7vo1VsdI=", "subType": "06" } } }, "azure_symbol_det_auto_id": { "kms": "azure", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAOvp/FMMmWVMkiuN51uFMFBiRQAcc9jftlNsHsLoNtohZaGni26kgX94b+/EI8pdWF5xA/73JlGlij0Rt+vC9s/zTDItRpn0bJL54WPphDcmA=", "subType": "06" } } }, "azure_symbol_det_explicit_id": { "kms": "azure", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAOvp/FMMmWVMkiuN51uFMFBiRQAcc9jftlNsHsLoNtohZaGni26kgX94b+/EI8pdWF5xA/73JlGlij0Rt+vC9s/zTDItRpn0bJL54WPphDcmA=", "subType": "06" } } }, "azure_symbol_det_explicit_altname": { "kms": "azure", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAOvp/FMMmWVMkiuN51uFMFBiRQAcc9jftlNsHsLoNtohZaGni26kgX94b+/EI8pdWF5xA/73JlGlij0Rt+vC9s/zTDItRpn0bJL54WPphDcmA=", "subType": "06" } } }, "azure_javascriptWithScope_rand_auto_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAPCw9NnvJyuTYIgZxr1w1UiG85PGZ4rO62DWWDF98HwVM/Y6u7hNdNjkaWjYFsPMl38ioHw/pS8GFR62QmH2RAw/BV0wI7pNy2evANr3i3gKg=", "subType": "06" } } }, "azure_javascriptWithScope_rand_auto_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAPXQzqnQ2UWkIYof8/OfadNMa7iVKAbOaiu7YGm8iVrx+W6uxKLPFugVqHtQ29hYXXf33xr8rqGNxDlAe7/x1OeYEif71f7LUkmKF9WxJV9Ko=", "subType": "06" } } }, "azure_javascriptWithScope_rand_explicit_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAP0nxlppgPyjLx0eBempbOlL21G6KbABSrE6+YuNDcsjJjxCQuLR9+aoAwa+yCDEC7GZ1E3oP489edKUuNpE4Ts26jy4aRegu4DmyECUeBwAg=", "subType": "06" } } }, "azure_javascriptWithScope_rand_explicit_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAPO89afu9Sb+cK9wwM1cO1DPjvu5UNyObjjTScy1hy9PzllJGfj7b84f0Ah74jPYsMPwI0Eslu/IYF3+5jmquq5Qp/VUQESlxqRqRK0xIeMfs=", "subType": "06" } } }, "azure_javascriptWithScope_det_explicit_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_det_explicit_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "azure_int_rand_auto_id": { "kms": "azure", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAQUyy4uWmWdzypsK81q9egREg4s80X3L2hzxJzC+fL08Xzy1z9grpPPCfJrluUVKMMGmmZR8gJPJ70igN3unJbzg==", "subType": "06" } } }, "azure_int_rand_auto_altname": { "kms": "azure", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAQr4gyoHKpGsSJo8CMsYSJk/KilFMJhsDCmxrha7yfNW1uR5sjyZj4B4s6uTXGw76x7aR/AvecDlY3QFJb8L1mjg==", "subType": "06" } } }, "azure_int_rand_explicit_id": { "kms": "azure", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAQ0zgXYPV1MuEFksmDpVDoWkoZQelm3+rYrMiT64KYywO//75799W8TbR3a7O6Q/ErjKQOin2OCp8EWwZqTDdz5w==", "subType": "06" } } }, "azure_int_rand_explicit_altname": { "kms": "azure", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAQG+qz00yizREbP3tla1elMiwf8TKLbUU2XWUP+E0vey/wvbjTTIzqwUlz/b9St77CHJhavypP3hMrngXR9GapbQ==", "subType": "06" } } }, "azure_int_det_auto_id": { "kms": "azure", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAQCkJH+CataLqp/xBjO77QBprC2xPV+rE+goSZ3C6aqwXIeTYHTOqEbeaFb5iZcqYH5nWvNvnfbZSIMyvSfrPjhw==", "subType": "06" } } }, "azure_int_det_explicit_id": { "kms": "azure", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAQCkJH+CataLqp/xBjO77QBprC2xPV+rE+goSZ3C6aqwXIeTYHTOqEbeaFb5iZcqYH5nWvNvnfbZSIMyvSfrPjhw==", "subType": "06" } } }, "azure_int_det_explicit_altname": { "kms": "azure", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAQCkJH+CataLqp/xBjO77QBprC2xPV+rE+goSZ3C6aqwXIeTYHTOqEbeaFb5iZcqYH5nWvNvnfbZSIMyvSfrPjhw==", "subType": "06" } } }, "azure_timestamp_rand_auto_id": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAARwcXYtx+A7g/zGkjGdkyVxZGCO9Nzj3D70NIpl2TeH2j9qYGP4DenwL1xSgrL2Ez+X58d2BvNhKrjA9y2w1Z8kA==", "subType": "06" } } }, "azure_timestamp_rand_auto_altname": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAARQ0Pjx3l92Aqhn2e1hot2M9rQ6aLPE2Iw8AVhm5AD8FWywWih12Fn2p9+kiE33yKPOCyrTWQHKPtB4yYhqnJgGg==", "subType": "06" } } }, "azure_timestamp_rand_explicit_id": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAARvFMlIzh2IjpHkTJ8buqTOqBA0+CxVDsZacUhSHVMgJLN+0DJsJy8OfkmKMu9Lk5hULY00Udoja87x+79mYfmeQ==", "subType": "06" } } }, "azure_timestamp_rand_explicit_altname": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAAR+2SCd7V5ukAkh7CYpNPIatzTL8osNoA4Mb5jjjbos8eMamImw0fbH8YA+Rdm4CgGdQQ9VDX7MtMWlArkj0Jpew==", "subType": "06" } } }, "azure_timestamp_det_auto_id": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAARe72T/oC09QGE1vuljb6ZEHa6llEwMLT+C4s9u1fREkOKndpmrOlGE8zOey4teizY1ypOMkIZ8GDQJJ4kLSpNkQ==", "subType": "06" } } }, "azure_timestamp_det_explicit_id": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAARe72T/oC09QGE1vuljb6ZEHa6llEwMLT+C4s9u1fREkOKndpmrOlGE8zOey4teizY1ypOMkIZ8GDQJJ4kLSpNkQ==", "subType": "06" } } }, "azure_timestamp_det_explicit_altname": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAARe72T/oC09QGE1vuljb6ZEHa6llEwMLT+C4s9u1fREkOKndpmrOlGE8zOey4teizY1ypOMkIZ8GDQJJ4kLSpNkQ==", "subType": "06" } } }, "azure_long_rand_auto_id": { "kms": "azure", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAASSSgX7k8iw0xFe0AiIzOu0e0P7Ujyfsk/Cdl0fR5X8V3QLVER+1Qa47Qpb8iWL2VLBSh+55HvIEtvhWn8SwXaog==", "subType": "06" } } }, "azure_long_rand_auto_altname": { "kms": "azure", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAASUhKr5K7ulGTeFbhIvJ2DDE10gRAFn5+2zqnsIFSY8lYV2PBYcENdeNBXZs6kyIAYhJdQyuOChVCerTI5jmQWDw==", "subType": "06" } } }, "azure_long_rand_explicit_id": { "kms": "azure", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAASHxawpjTHdXYRWQSZ7Qi7gFC+o4dW2mPH8s5nQkPFY/EubcJbdAZ5HFp66NfPaDJ/NSH6Vy+TkpX3683RC+bjSQ==", "subType": "06" } } }, "azure_long_rand_explicit_altname": { "kms": "azure", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAASVaMAv6UjuBOUZMJ9qz+58TQWmgaMpS9xrJziJY80ml9aRlDTtRubP7U40CgbDvrtY1QgHbkF/di1XDCB6iXMMg==", "subType": "06" } } }, "azure_long_det_auto_id": { "kms": "azure", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAS06L8oEPeMvVlA32VlobdOWG24OoyMbv9PyYsHLsbT0bHFwU7lYUSQG9EkYVRNPEDzvXpciE1jT7KT8CRY8XT/g==", "subType": "06" } } }, "azure_long_det_explicit_id": { "kms": "azure", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAS06L8oEPeMvVlA32VlobdOWG24OoyMbv9PyYsHLsbT0bHFwU7lYUSQG9EkYVRNPEDzvXpciE1jT7KT8CRY8XT/g==", "subType": "06" } } }, "azure_long_det_explicit_altname": { "kms": "azure", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQGVERAAAAAAAAAAAAAAAAAS06L8oEPeMvVlA32VlobdOWG24OoyMbv9PyYsHLsbT0bHFwU7lYUSQG9EkYVRNPEDzvXpciE1jT7KT8CRY8XT/g==", "subType": "06" } } }, "azure_decimal_rand_auto_id": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAATJ6LZgPu9F+rPtYsMuvwOx62+g1dAk858BUtE9FjC/300DnbDiolhkHNcyoFs07NYUNgLthW2rISb/ejmsDCt/oqnf8zWYf9vrJEfHaS/Ocw=", "subType": "06" } } }, "azure_decimal_rand_auto_altname": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAATX8eD6qFYWKwIGvXtQG79fXKuPW9hkIV0OwrmNNIqRltw6gPHl+/1X8Q6rgmjCxqvhB05AxTj7xz64gP+ILkPQY8e8VGuCOvOdwDo2IPwy18=", "subType": "06" } } }, "azure_decimal_rand_explicit_id": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAATBjQ9E5wDdTS/iI1XDqGmDBC5aLbPB4nSyrjRLfv1zEoPRjmcHlQmMRJA0mori2VQv6EBFNHeczFCenJaSAkuh77czeXM2vH3T6qwEIDs4dw=", "subType": "06" } } }, "azure_decimal_rand_explicit_altname": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AgGVERAAAAAAAAAAAAAAAAATtkjbhdve7MNuLaTm6qvaewuVUxeC1DMz1fd4RC4jeiBFMd5uZUVJTiOIerwQ6P5G5lkMlezKDWgKl2FUvZH6c7V3JknhsaWcV5iLWGUL6Zc=", "subType": "06" } } }, "azure_decimal_det_explicit_id": { "kms": "azure", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_det_explicit_altname": { "kms": "azure", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "azure_minKey_rand_explicit_id": { "kms": "azure", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_rand_explicit_altname": { "kms": "azure", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_det_explicit_id": { "kms": "azure", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_det_explicit_altname": { "kms": "azure", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "azure_maxKey_rand_explicit_id": { "kms": "azure", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_rand_explicit_altname": { "kms": "azure", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_det_explicit_id": { "kms": "azure", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_det_explicit_altname": { "kms": "azure", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_double_rand_auto_id": { "kms": "gcp", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAABFoHQxnh1XSC0k1B01uFFg7rE9sZVBn4PXo26JX8gx9tuxu+4l9Avb23H9BfOzuWiEc43iw87K/W2y0VfKp5CCg==", "subType": "06" } } }, "gcp_double_rand_auto_altname": { "kms": "gcp", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAABRkZkEtQEFB/r268cNfYRQbN4u5Cxjl9Uh+8wq9TFWLQH2E/9wj2vTLlxQ2cQsM7Qd+XxR5idjfBf9CKAfvUa/A==", "subType": "06" } } }, "gcp_double_rand_explicit_id": { "kms": "gcp", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAABDSUZ+0BbDDEZxCXA+J2T6Js8Uor2dfXSf7s/hpLrg6dxcW2chpht9XLiLOXG5w83TzCAI5pF8cQgBpBpYjR8RQ==", "subType": "06" } } }, "gcp_double_rand_explicit_altname": { "kms": "gcp", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAABCYxugs7L+4S+1rr0VILSbtBm79JPTLuzluQAv0+8hbu5Z6zReOL6Ta1vQH1oA+pSPGYA4euye3zNl1X6ZewbPw==", "subType": "06" } } }, "gcp_double_det_explicit_id": { "kms": "gcp", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "gcp_double_det_explicit_altname": { "kms": "gcp", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "gcp_string_rand_auto_id": { "kms": "gcp", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAACx3wSslJEiD80YLTH0n4Bbs4yWVPQl15AU8pZMLLQePqEtI+BJy3t2bqNP1098jS0CGSf+LQmQvXhJn1aNFeMTw==", "subType": "06" } } }, "gcp_string_rand_auto_altname": { "kms": "gcp", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAC5BTe5KP5UxSIk6dJlkz8aaZ/9fg44XPWHafiiL/48lcv3AWbu2gcBo1EDuc1sJQu6XMrtDCRQ7PCHsL7sEQMGQ==", "subType": "06" } } }, "gcp_string_rand_explicit_id": { "kms": "gcp", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAACyJN55OcyXXJ71x8VphTaIuIg6kQtGgVKPhWx0LSdYc6JOjB6LTdA7SEWiSlSWWFZE26UmKcPbkbLDAYf4IVrzQ==", "subType": "06" } } }, "gcp_string_rand_explicit_altname": { "kms": "gcp", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAACoa0d9gqfPP5s3+GoruwzxoQFgli8SmjpTVRLAOcFxqGdfrwSbpYffSw/OR45sZPxXCL6T2MtUvZsl7ukv0jBnw==", "subType": "06" } } }, "gcp_string_det_auto_id": { "kms": "gcp", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAACTCkyETcWayIZ9YEoQEBVIF3i7iXEe6M3KjYYaSVCYdqSbSHBzlwKWYbP+Xj/MMYBYTLZ1aiRQWCMK4gWPYppZw==", "subType": "06" } } }, "gcp_string_det_explicit_id": { "kms": "gcp", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAACTCkyETcWayIZ9YEoQEBVIF3i7iXEe6M3KjYYaSVCYdqSbSHBzlwKWYbP+Xj/MMYBYTLZ1aiRQWCMK4gWPYppZw==", "subType": "06" } } }, "gcp_string_det_explicit_altname": { "kms": "gcp", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAACTCkyETcWayIZ9YEoQEBVIF3i7iXEe6M3KjYYaSVCYdqSbSHBzlwKWYbP+Xj/MMYBYTLZ1aiRQWCMK4gWPYppZw==", "subType": "06" } } }, "gcp_object_rand_auto_id": { "kms": "gcp", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAADy+8fkyeNYdIK001YogXfKc25zRXS1VGIFVWR6jRfrexy9C8LBBfX3iDwGNPbP2pkC3Tq16OoziQB6iNGf7s7yg==", "subType": "06" } } }, "gcp_object_rand_auto_altname": { "kms": "gcp", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAADixoDdvm57gH8ooOaKI57WyZD5uaPmuYgmrgAFuV8I+oaalqYctnNSYlzQKCMQX/mIcTxvW3oOWY7+IzAz7npvw==", "subType": "06" } } }, "gcp_object_rand_explicit_id": { "kms": "gcp", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAADvq0OAoijgHaVMhsoNMdfWFLyISDo6Y13sYM0CoBXS/oXJNIJJvhgKPbFSV/h4IgiDLy4qNYOTJQvpqt094RPgQ==", "subType": "06" } } }, "gcp_object_rand_explicit_altname": { "kms": "gcp", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAADuTZF7/uqGjFbjzBYspPkxGWvvVAEN/ib8bfPOQrEobtTWuU+ju9H3TlT9DMuFy7RdUZnPB0D3HkM8+zky5xeBw==", "subType": "06" } } }, "gcp_object_det_explicit_id": { "kms": "gcp", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_det_explicit_altname": { "kms": "gcp", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "gcp_array_rand_auto_id": { "kms": "gcp", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAE085kJIBX6S93D94bcRjkOegEKsksi2R1cxoVDoOpSdHh3S6bZAOh50W405wvnOKf3KTP9SICDUehQKQZSC026Y5dwVQ2GiM7PtpSedthKJs=", "subType": "06" } } }, "gcp_array_rand_auto_altname": { "kms": "gcp", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAEk/FAXsaqyVr6I+MY5L0axeLhskcEfLZeB8whLMKbjLDLa8Iep+IdrFVSfKo03Zr/7Ah8Js01aT6+Vt4EDMJK0mGKZJOjsrAf3b6RS+Mzebg=", "subType": "06" } } }, "gcp_array_rand_explicit_id": { "kms": "gcp", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAEDY7J9JGiurctYr7ytakNjcryVm42fkubcVpQpUYEkpK/G9NLGjrJuFgNW5ZVjYiPKEBbDB7vEtJqGux0BU++hrvVHNJ3wUT2mbDE18NE4KE=", "subType": "06" } } }, "gcp_array_rand_explicit_altname": { "kms": "gcp", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAErFFlw8W9J2y+751RnYLw0TSK9ThD6sP3i4zPbZtiuhc90RFoJhScvqM9i4sDKuYePZZRLBxdX4EZhZClOmswCGDLCIWsQlSvCwgDcIsRR/w=", "subType": "06" } } }, "gcp_array_det_explicit_id": { "kms": "gcp", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_det_explicit_altname": { "kms": "gcp", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_binData=00_rand_auto_id": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAF0R5BNkQKfm6wx/tob8nVGDEYV/pvy9UeCqc9gFNuB5d9KxCkgyxryV65rbB90OriqvWFO2jcxzchRYgRI3fQ+A==", "subType": "06" } } }, "gcp_binData=00_rand_auto_altname": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAF4wcT8XGc3xNdKYDX5/cbUwPDdnkIXlWWCCYeSXSk2oWPxMZnPsVQ44nXKJJsKitoE3r/hL1sSG5239WzCWyx9g==", "subType": "06" } } }, "gcp_binData=00_rand_explicit_id": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAF07OFs5mlx0AB6QBanaybLuhuFbG+19KxSqHlSgELcz6TQKI6equX97OZdaWSWf2SSeiYm5E6+Y3lgA5l4KxC2A==", "subType": "06" } } }, "gcp_binData=00_rand_explicit_altname": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAFZ74Q7JMm7y2i3wRmjIRKefhmdnrhP1NXJgploi+44eQ2eRraZsW7peGPYyIfsXEbhgV5+aLmiYgvemBywfdogQ==", "subType": "06" } } }, "gcp_binData=00_det_auto_id": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFhwJkocj36WXoY3mg2GWUrJ5IQTo9MvkwEwRFKdkcxm9pX2PZPK7bN5ZWw3IFcQ/0GfaW6V4LYr8WarZdLF0p5g==", "subType": "06" } } }, "gcp_binData=00_det_explicit_id": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFhwJkocj36WXoY3mg2GWUrJ5IQTo9MvkwEwRFKdkcxm9pX2PZPK7bN5ZWw3IFcQ/0GfaW6V4LYr8WarZdLF0p5g==", "subType": "06" } } }, "gcp_binData=00_det_explicit_altname": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFhwJkocj36WXoY3mg2GWUrJ5IQTo9MvkwEwRFKdkcxm9pX2PZPK7bN5ZWw3IFcQ/0GfaW6V4LYr8WarZdLF0p5g==", "subType": "06" } } }, "gcp_binData=04_rand_auto_id": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAFmDO47RTVXzm8D4hfhLICILrQJg3yOwG3HYfCdz7yaanPow2Y6bMxvXxk+kDS29aS8pJKDqJQQoMGc1ZFD3yYKsLQHRi/8rW6TNDQd4sCQ00=", "subType": "06" } } }, "gcp_binData=04_rand_auto_altname": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAFpiu9Q3LTuPmgdWBqo5Kw0vGF9xU1rMyE4xwR8GccZ7ZMrUcR4AnZnAP7ah5Oz8e7qonNYX4d09obesYSLlIjyK7J7qg+GWiEURgbvmOngaA=", "subType": "06" } } }, "gcp_binData=04_rand_explicit_id": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAFHRy8dveGuMng9WMmadIp39jD7iEfl3bEjKmzyNoAc0wIcSJZo9kdGbNEwZ4p+A1gz273fmAt/AJwAxwvqdlanLWBr4wiSKz1Mu9VaBcTlyY=", "subType": "06" } } }, "gcp_binData=04_rand_explicit_altname": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAFiqO+sKodqXuVox0zTbKuY4Ng0QE1If2hDLWXljAEZdYABPk20UJyL/CHR49WP2Cwvi4evJCf8sEfKpR+ugPiyxWzP3iVe6qqTzP93BBjqoc=", "subType": "06" } } }, "gcp_binData=04_det_auto_id": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFEp5Gut6iENHUqDMVdBm4cxQy35gnslTf7vSWW9InFh323BvaTTiubxbxTiMKIa/u47MfMprL9HNQSwgpAQc4lped+YnlRW8RYvTcG4frFtA=", "subType": "06" } } }, "gcp_binData=04_det_explicit_id": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFEp5Gut6iENHUqDMVdBm4cxQy35gnslTf7vSWW9InFh323BvaTTiubxbxTiMKIa/u47MfMprL9HNQSwgpAQc4lped+YnlRW8RYvTcG4frFtA=", "subType": "06" } } }, "gcp_binData=04_det_explicit_altname": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAFEp5Gut6iENHUqDMVdBm4cxQy35gnslTf7vSWW9InFh323BvaTTiubxbxTiMKIa/u47MfMprL9HNQSwgpAQc4lped+YnlRW8RYvTcG4frFtA=", "subType": "06" } } }, "gcp_undefined_rand_explicit_id": { "kms": "gcp", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_rand_explicit_altname": { "kms": "gcp", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_det_explicit_id": { "kms": "gcp", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_det_explicit_altname": { "kms": "gcp", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "gcp_objectId_rand_auto_id": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAH8Kt6coc8bPI4QIwS1tIdk6pPA05xlZvrOyAQgvoqaozMtWzG15OunQLDdS3yJ5WRiV7kO6CIKqRrvL2RykB5sw==", "subType": "06" } } }, "gcp_objectId_rand_auto_altname": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAHU5Yzmz2mbgNQrGSvglgVuv14nQWzipBkZUVSO4eYZ7wLrj/9t0fnizsu7Isgg5oA9fV0Snh/A9pDnHZWoccXUw==", "subType": "06" } } }, "gcp_objectId_rand_explicit_id": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAHsdq5/FLqbjMDiNzf+6k9yxUtFVjS/xSqErqaboOl21934pAzgkOzBGodpKKFuK0Ta4f3h21XS+84wlIYPMlTtw==", "subType": "06" } } }, "gcp_objectId_rand_explicit_altname": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAHokIdXxNQ/NBMdMAVNxyVuz/J5pMMdtfxxJxr7PbsRJ3FoD2QNjTgE1Wsz0G4o09Wv9UWD+/mIqPVlLgx1sRtPw==", "subType": "06" } } }, "gcp_objectId_det_auto_id": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAHkcbaj3Hy3b4HkjRkMgiw5h6jBW7Sc56QSJmAPmVSc2T4B8d79A49dW0RyEiInZJcnVRjrYzUTRtgRaG4/FRd8g==", "subType": "06" } } }, "gcp_objectId_det_explicit_id": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAHkcbaj3Hy3b4HkjRkMgiw5h6jBW7Sc56QSJmAPmVSc2T4B8d79A49dW0RyEiInZJcnVRjrYzUTRtgRaG4/FRd8g==", "subType": "06" } } }, "gcp_objectId_det_explicit_altname": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAHkcbaj3Hy3b4HkjRkMgiw5h6jBW7Sc56QSJmAPmVSc2T4B8d79A49dW0RyEiInZJcnVRjrYzUTRtgRaG4/FRd8g==", "subType": "06" } } }, "gcp_bool_rand_auto_id": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAIf7vUYS5XFrEU4g03lzj9dk8a2MkaQdlH8nE/507D2Gm5XKQLi2jCENZ9UaQm3MQtVr4Uqrgz2GZiQHt9mXcG3w==", "subType": "06" } } }, "gcp_bool_rand_auto_altname": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAIdOC4Tx/TaVLRtOL/Qh8RUFIzHFB6nSegZoITwZeDethd8V3+R+aIAgzfN3pvmZzagHyVCm2nbNYJNdjOJhuDrg==", "subType": "06" } } }, "gcp_bool_rand_explicit_id": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAIzB14mX2vaZdiW9kGc+wYEgTCXA0FB5AVEyuERD00+K7U5Otlc6ZUwMtb9nGUu+M7PnnfxiDFHCrUWrTkAZzSUw==", "subType": "06" } } }, "gcp_bool_rand_explicit_altname": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAIhRLg79ACCMfeERBgG1wirirrZXZzbK11RxHkAbf14Fji2L3sdMBdLBU5I028+rmtDdC7khcNMt11V6XGKpAjnA==", "subType": "06" } } }, "gcp_bool_det_explicit_id": { "kms": "gcp", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "gcp_bool_det_explicit_altname": { "kms": "gcp", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "gcp_date_rand_auto_id": { "kms": "gcp", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAJL+mjI8xBmSahOOi3XkGRGxjhGNdJb445KZtRAaUdCV0vMKbrefuiDHJDPCYo7mLYNhRSIhQfs63IFYMrlKP26A==", "subType": "06" } } }, "gcp_date_rand_auto_altname": { "kms": "gcp", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAJbeyqO5FRmqvPYyOb0tdKtK6JOg8QKbCl37/iFeEm7N0T0Pjb8Io4U0ndB3O6fjokc3kDQrZcQkV+OFWIMuKFjw==", "subType": "06" } } }, "gcp_date_rand_explicit_id": { "kms": "gcp", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAJVz3rSYIcoYtM0tZ8pB2Ytgh8RvYPeZvW7aUVJfZkZlIhfUHOHEf5kHqxzt8E1l2n3lmK/7ZVCFUuCCmr8cZyWw==", "subType": "06" } } }, "gcp_date_rand_explicit_altname": { "kms": "gcp", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAJAiQqNyUcpuDEpFt7skp2NSHFCux2XObrIIFgXReYgtWoapL/n4zksJXl89PGavzNPBZbzgEa8uwwAe+S+Y6TLg==", "subType": "06" } } }, "gcp_date_det_auto_id": { "kms": "gcp", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAJmATV2A1P5DmrS8uES6AMD9y+EU3x7u4K4J0p296iSkCEgIdZZORhPIEnuJK3FHw1II6IEShW2nd7sOJRZSGKcg==", "subType": "06" } } }, "gcp_date_det_explicit_id": { "kms": "gcp", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAJmATV2A1P5DmrS8uES6AMD9y+EU3x7u4K4J0p296iSkCEgIdZZORhPIEnuJK3FHw1II6IEShW2nd7sOJRZSGKcg==", "subType": "06" } } }, "gcp_date_det_explicit_altname": { "kms": "gcp", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAJmATV2A1P5DmrS8uES6AMD9y+EU3x7u4K4J0p296iSkCEgIdZZORhPIEnuJK3FHw1II6IEShW2nd7sOJRZSGKcg==", "subType": "06" } } }, "gcp_null_rand_explicit_id": { "kms": "gcp", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "gcp_null_rand_explicit_altname": { "kms": "gcp", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "gcp_null_det_explicit_id": { "kms": "gcp", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "gcp_null_det_explicit_altname": { "kms": "gcp", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "gcp_regex_rand_auto_id": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAALiebb3hWwJRqlgVEhLYKKvo6cnlU7BFnZnvlZ8GuIr11fUvcnS9Tg2m7vPmfL7WVyuNrXlR48x28Es49YuaxuIg==", "subType": "06" } } }, "gcp_regex_rand_auto_altname": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAALouDFNLVgBXqhJvBRj9DKacuD1AQ2NAVDW93P9NpZDFFwGOFxmKUcklbPj8KkHqvma8ovVUBTLLUDR+tKFRvC2Q==", "subType": "06" } } }, "gcp_regex_rand_explicit_id": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAALtdcT9+3R1he4eniT+1opqs/YtujFlqzBXssv+hCKhJQVY/IXde32nNpQ1WTgUc7jfIJl/v9HvuA9cDHPtDWWTg==", "subType": "06" } } }, "gcp_regex_rand_explicit_altname": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAALAwlRAlj4Zpn+wu9eOcs5CsNgrkVwrgmu1tc4wyQp0Lt+3UcplYsXQMrMPcTx3yB0JcI4Kh65n/DrAaA+G/a6iw==", "subType": "06" } } }, "gcp_regex_det_auto_id": { "kms": "gcp", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAALbCutQ7D94gk0djewcQiEdMFVVa21+Dn5enQf/mqPi3o7vPy7OejDBk9fiZRffsioRMhlx2cxqa8T3+AkeN96yg==", "subType": "06" } } }, "gcp_regex_det_explicit_id": { "kms": "gcp", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAALbCutQ7D94gk0djewcQiEdMFVVa21+Dn5enQf/mqPi3o7vPy7OejDBk9fiZRffsioRMhlx2cxqa8T3+AkeN96yg==", "subType": "06" } } }, "gcp_regex_det_explicit_altname": { "kms": "gcp", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAALbCutQ7D94gk0djewcQiEdMFVVa21+Dn5enQf/mqPi3o7vPy7OejDBk9fiZRffsioRMhlx2cxqa8T3+AkeN96yg==", "subType": "06" } } }, "gcp_dbPointer_rand_auto_id": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAMG8P+Y2YNIgknxE0/yPDCHASBvCU1IJwsEyaJPuOjn03enxEN7z/wbjVMN0lGUptDP3SVL+OIZtQ35VRP84MtnbdhcfZWqMhLjzrCjmtHUEg=", "subType": "06" } } }, "gcp_dbPointer_rand_auto_altname": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAMKCLFUN6ApB5fSVEWazRddhKTEwgqI/mxfe0BBxht69pZQYhTjhOJP0YcIrtr+RCeHOa4FIJgQod1CFOellIzO5YH5CuV4wPxCAlOdbJcBK8=", "subType": "06" } } }, "gcp_dbPointer_rand_explicit_id": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAM7ULEA6uKKv4Pu4Sa3aAt7dXtEwfQC98aJoLBapHT+xXtn5GWPynOZQNtV3lGaYExQjiGdYbzOcav3SVy/sYTe3ktgkQnuZfe0tk0zyvKIMM=", "subType": "06" } } }, "gcp_dbPointer_rand_explicit_altname": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAMoMveHO1MadAKuT498xiKWWBUKRbH7k7P2YETDg/BufVw0swos07rk6WJa1vqyF61QEmACjy4pmlK/5P0VfKJBAIvif51YqHPQkobJVS3nVA=", "subType": "06" } } }, "gcp_dbPointer_det_auto_id": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAMz+9m1bE+Th9YeyPmJdtJPO0F5QYsGYtU/Eom/LSoYjDmTmV2ehkKx/cevIxJfZUc+Mvv/uGoeuubGl8tiX4l+f6yLrSIS6QBtIHYKXk+JNE=", "subType": "06" } } }, "gcp_dbPointer_det_explicit_id": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAMz+9m1bE+Th9YeyPmJdtJPO0F5QYsGYtU/Eom/LSoYjDmTmV2ehkKx/cevIxJfZUc+Mvv/uGoeuubGl8tiX4l+f6yLrSIS6QBtIHYKXk+JNE=", "subType": "06" } } }, "gcp_dbPointer_det_explicit_altname": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAMz+9m1bE+Th9YeyPmJdtJPO0F5QYsGYtU/Eom/LSoYjDmTmV2ehkKx/cevIxJfZUc+Mvv/uGoeuubGl8tiX4l+f6yLrSIS6QBtIHYKXk+JNE=", "subType": "06" } } }, "gcp_javascript_rand_auto_id": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAANqBD0ITMn4BaFnDp7BX7vXbRBkFwmjQRVUeBbwsQtv5WVlJMAd/2+w7tyH8Wc44x0/9U/DA5GVhpTrtdDyPBI3w==", "subType": "06" } } }, "gcp_javascript_rand_auto_altname": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAANtA0q4mbkAaKX4x1xk0/094Mln0wnh2bYnI6s6dh+l2WLDH7A9JMZxCl6kc4uOsEfbOvjP/PLIYtdMGs14EjM5A==", "subType": "06" } } }, "gcp_javascript_rand_explicit_id": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAANfrW3pmeiFdBFt5tJS6Auq9Wo/J4r/vMRiueLWxig5S1zYuf9kFPJMK/nN9HqQPIcBIJIC2i/uEPgeepaNXACCw==", "subType": "06" } } }, "gcp_javascript_rand_explicit_altname": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAANL7UZNzpwfwhRn/HflWIE9CSxGYNwLSo9d86HsOJ42rrZKq6HQqm/hiEAg0lyqCxVIVFxYEc2BUWSaq4/+SSyZw==", "subType": "06" } } }, "gcp_javascript_det_auto_id": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAANB2d97R8nUJqnG0JPsWzyFe5pct5jvUljdkPnlZvLN1ZH+wSu4WmLfjri6IzzYP//f8tywn4Il+R4lZ0Kr/RAeA==", "subType": "06" } } }, "gcp_javascript_det_explicit_id": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAANB2d97R8nUJqnG0JPsWzyFe5pct5jvUljdkPnlZvLN1ZH+wSu4WmLfjri6IzzYP//f8tywn4Il+R4lZ0Kr/RAeA==", "subType": "06" } } }, "gcp_javascript_det_explicit_altname": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAANB2d97R8nUJqnG0JPsWzyFe5pct5jvUljdkPnlZvLN1ZH+wSu4WmLfjri6IzzYP//f8tywn4Il+R4lZ0Kr/RAeA==", "subType": "06" } } }, "gcp_symbol_rand_auto_id": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAOsGdnr6EKcBdOAvYrP0o1pWbhhJbYsqfVwwwS1zq6ZkBayOss2J3TuYwBGXhJFlq3iIiWLdxGQ883XIvuAECnqUNuvpK2rOLwtDg8xJLiH24=", "subType": "06" } } }, "gcp_symbol_rand_auto_altname": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAOpfa6CUSnJBvnWdd7pSZ2pXAbYm68Yka6xa/fuyhVx/Tc926/JpqmOmQtXqbOj8dZra0rQ3/yxHySwgD7s9Qr+xvyL7LvAguGkGmEV5H4Xz4=", "subType": "06" } } }, "gcp_symbol_rand_explicit_id": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAO085iqYGFdtjiFWHcNqE0HuKMNHmk49DVh+pX8Pb4p3ehB57JL1nRqaXqHPqhFenxSEInT/te9HQRr+ADcHADvUGsScfm/n85v85nq6X+5y4=", "subType": "06" } } }, "gcp_symbol_rand_explicit_altname": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAOiidb+2TsbAb2wc7MtDzb/UYsjgVNSw410Sz9pm+Uy7aZROE5SURKXdLjrCH2ZM2a+XCAl3o9yAoNgmAjEvYVxjmyzLK00EVjT42MBOrdA+k=", "subType": "06" } } }, "gcp_symbol_det_auto_id": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAOFBGo77joqvZl7QQMB9ebMsAI3uro8ILQTJsTUgAqNzSh1mNzqihGHZYe84xtgMrVxNuwcjkidkRbNnLXWLuarOx4tgmOLx5A5G1eYEe3s7Q=", "subType": "06" } } }, "gcp_symbol_det_explicit_id": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAOFBGo77joqvZl7QQMB9ebMsAI3uro8ILQTJsTUgAqNzSh1mNzqihGHZYe84xtgMrVxNuwcjkidkRbNnLXWLuarOx4tgmOLx5A5G1eYEe3s7Q=", "subType": "06" } } }, "gcp_symbol_det_explicit_altname": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAOFBGo77joqvZl7QQMB9ebMsAI3uro8ILQTJsTUgAqNzSh1mNzqihGHZYe84xtgMrVxNuwcjkidkRbNnLXWLuarOx4tgmOLx5A5G1eYEe3s7Q=", "subType": "06" } } }, "gcp_javascriptWithScope_rand_auto_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAPUsQHeXWhdmyfQ2Sq1ev1HMuMhBTc/FZFKO9tMMcI9qzjr+z4IdCOFCcx24/T/6NCsDpMiOGNnCdaBCCNRwNM0CTIkpHNLO+RSZORDgAsm9Q=", "subType": "06" } } }, "gcp_javascriptWithScope_rand_auto_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAPRZawtuu0gErebyFqiQw0LxniWhdeujGzaqfAXriGo/2fU7PalzTlWQa8wsv0y7Q/i1K4JbQwCEFpJWLppmtZshCGbVWjpPljB2BH4NNrLPE=", "subType": "06" } } }, "gcp_javascriptWithScope_rand_explicit_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAP0qkQjuKmKIqdrsrR9djxt+1jFlEL7K9bP1oz7QWuY38dZJOoGwa6G1bP4wDzjsucJLCEgU2IY+t7BHraBFXvR/Aar8ID5eXcvJ7iOPIyqUw=", "subType": "06" } } }, "gcp_javascriptWithScope_rand_explicit_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAP6L41iuBWGLg3hQZuhXp4MupTQvIT07+/+CRY292sC02mehk5BkuSOEVrehlvyvBJFKia4Bqd/UWvY8PnUPLqFKTLnokONWbAuh36y3gjStw=", "subType": "06" } } }, "gcp_javascriptWithScope_det_explicit_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_det_explicit_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "gcp_int_rand_auto_id": { "kms": "gcp", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAQ+6oRKWMSvC+3UGrHSyGeVlR9bFnZtFTmYlUoGn04k6ndtCl8rsmBVUV6dMMYd7znnZtTSIGPI8q6jwf/NJjdIw==", "subType": "06" } } }, "gcp_int_rand_auto_altname": { "kms": "gcp", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAQnz5jAbrrdutTPFA4m3MvlVJr3bpurTKY5xjwO5k8DZpeWTJzr+kVEJjG6M8/RgC/0UFNgBBrDbDhYa8PZHRijw==", "subType": "06" } } }, "gcp_int_rand_explicit_id": { "kms": "gcp", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAQfRFoxUgjrv8up/eZ/fLlr/z++d/jFm30nYvKqsnQT7vkmmujJWc8yAtthR9OI6W5biBgAkounqRHhvatLZC6gA==", "subType": "06" } } }, "gcp_int_rand_explicit_altname": { "kms": "gcp", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAQY/ePk59RY6vLejx9a5ITwkT9000KAubVSqMoQwv7lNXO+GKZfZoLHG6k1MA/IxTvl1Zbz1Tw1bTctmj0HPEGNA==", "subType": "06" } } }, "gcp_int_det_auto_id": { "kms": "gcp", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAQE9RVV9pOuysUUEGKq0u6ztFM0gTpoOHcHsTFQstA7+L9XTvxWEgL3RgNeq5KtKdODlxl62niV8dnQwlSoDSSWw==", "subType": "06" } } }, "gcp_int_det_explicit_id": { "kms": "gcp", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAQE9RVV9pOuysUUEGKq0u6ztFM0gTpoOHcHsTFQstA7+L9XTvxWEgL3RgNeq5KtKdODlxl62niV8dnQwlSoDSSWw==", "subType": "06" } } }, "gcp_int_det_explicit_altname": { "kms": "gcp", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAQE9RVV9pOuysUUEGKq0u6ztFM0gTpoOHcHsTFQstA7+L9XTvxWEgL3RgNeq5KtKdODlxl62niV8dnQwlSoDSSWw==", "subType": "06" } } }, "gcp_timestamp_rand_auto_id": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAARLnk1LpJIriKr6iiY1yBDGnfkRaHNwWcQyL+mORtYC4+AQ6oMv0qpGrJxS2QCbYY1tGmAISqZHCIExCG+TIv4bw==", "subType": "06" } } }, "gcp_timestamp_rand_auto_altname": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAARaqYXh9AVZI6gvRZrBwbprE5P3K5Qf4PIK1ca+mLRNOof0EExyAhtku7mYXusLeq0ww/tV6Zt1cA36KsT8a0Nog==", "subType": "06" } } }, "gcp_timestamp_rand_explicit_id": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAARLXzBjkCN8BpfXDIrb94kuZCD07Uo/DMBfMIWQtAb1++tTheUoY2ClQz33Luh4g8NXwuMJ7h8ufE70N2+b1yrUg==", "subType": "06" } } }, "gcp_timestamp_rand_explicit_altname": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAARe44QH9ZvTAuHsWhEMoue8eHod+cJpBm+Kl/Xtw7NI/6UTOOHC5Kkg20EvX3+GwXdAGk0bUSCFiTZb/yPox1OlA==", "subType": "06" } } }, "gcp_timestamp_det_auto_id": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAARzXjP6d6j/iQxiz1/TC/m+IfAGLFH9wY2ksS//i9x15QttlhcRrT3XmPvxaP5OjTHac4Gq3m2aXiJH56lETyl8A==", "subType": "06" } } }, "gcp_timestamp_det_explicit_id": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAARzXjP6d6j/iQxiz1/TC/m+IfAGLFH9wY2ksS//i9x15QttlhcRrT3XmPvxaP5OjTHac4Gq3m2aXiJH56lETyl8A==", "subType": "06" } } }, "gcp_timestamp_det_explicit_altname": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAARzXjP6d6j/iQxiz1/TC/m+IfAGLFH9wY2ksS//i9x15QttlhcRrT3XmPvxaP5OjTHac4Gq3m2aXiJH56lETyl8A==", "subType": "06" } } }, "gcp_long_rand_auto_id": { "kms": "gcp", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAASuGZs48eEyVBJ9vvM6cvRySfuR0WM4kL7lx52rSGXBKtkZywyP5rJwNtRn9WTBMDqc1O/4jUgYXpqHx39SLhUPA==", "subType": "06" } } }, "gcp_long_rand_auto_altname": { "kms": "gcp", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAS/62F71oKTX1GlvOP89uNhXpIyLZ5OdnuLeM/hvL5HWyOudSb06cG3+xnPg3QgppAYFK5X2PGgrEcrA87AykLPg==", "subType": "06" } } }, "gcp_long_rand_explicit_id": { "kms": "gcp", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAASSgx+p4YzTvjZ+GCZCFHEKHNXJUSloPnLRHE4iJ515Epb8Tox7h8/aIAkB3ulnDS9BiT5UKdye2TWf8OBEwkXzg==", "subType": "06" } } }, "gcp_long_rand_explicit_altname": { "kms": "gcp", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAAStqszyEfltpgd3aYeoyqaJX27OX861o06VhNX/N2fdSfKx0NQq/hWlWTkX6hK3hjCijiTtHmhFQR6QLkHD/6THw==", "subType": "06" } } }, "gcp_long_det_auto_id": { "kms": "gcp", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAS0wJHtZKnxJlWnlSu0xuq7bZR25UdwcbdCRSaXBC0EXEFuqlzrZSn1lcwKPKGZQO8EQ6SdQDqK95alMLmM8eQrQ==", "subType": "06" } } }, "gcp_long_det_explicit_id": { "kms": "gcp", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAS0wJHtZKnxJlWnlSu0xuq7bZR25UdwcbdCRSaXBC0EXEFuqlzrZSn1lcwKPKGZQO8EQ6SdQDqK95alMLmM8eQrQ==", "subType": "06" } } }, "gcp_long_det_explicit_altname": { "kms": "gcp", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ARgjwAAAAAAAAAAAAAAAAAAS0wJHtZKnxJlWnlSu0xuq7bZR25UdwcbdCRSaXBC0EXEFuqlzrZSn1lcwKPKGZQO8EQ6SdQDqK95alMLmM8eQrQ==", "subType": "06" } } }, "gcp_decimal_rand_auto_id": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAATg4U3nbHBX/Az3ie2yurEIJO6cFryQWKiCpBbx1z0NF7RXd7kFC1XzaY6zcBjfl2AfRO8FFmgjTmFXb6gTRSSF0iAZJZTslfe3n6YFtwSKDI=", "subType": "06" } } }, "gcp_decimal_rand_auto_altname": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAATdSSyp0ewboV5zI3T3TV/FOrdx0UQbFHhqcH+yqpotoWPSw5dxE+BEoihYLeaPKuVU/rUIY4TUv05Egj7Ovg62Kpk3cPscxsGtE/T2Ppbt6o=", "subType": "06" } } }, "gcp_decimal_rand_explicit_id": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAATl7k20T22pf5Y9knVwIDyOIlbHyZBJqyi3Mai8APEZIYjpSKDKs8QNAH69CIjupyge8Izw4Cuch0bRrvMbp6YFfrUgk1JIQ4iLKkqqzHpBTY=", "subType": "06" } } }, "gcp_decimal_rand_explicit_altname": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AhgjwAAAAAAAAAAAAAAAAAATF7YLkhkuLhXdxrQk2fJTs128tRNYHeodkqw7ha/TxW3Czr5gE272gnkdzfNoS7uu9XwOr1yjrC6y/8gHALAWn77WvGrAlBktLQbIIinsuds=", "subType": "06" } } }, "gcp_decimal_det_explicit_id": { "kms": "gcp", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_det_explicit_altname": { "kms": "gcp", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "gcp_minKey_rand_explicit_id": { "kms": "gcp", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_rand_explicit_altname": { "kms": "gcp", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_det_explicit_id": { "kms": "gcp", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_det_explicit_altname": { "kms": "gcp", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "gcp_maxKey_rand_explicit_id": { "kms": "gcp", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_rand_explicit_altname": { "kms": "gcp", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_det_explicit_id": { "kms": "gcp", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_det_explicit_altname": { "kms": "gcp", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_double_rand_auto_id": { "kms": "kmip", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAB1hL/nPkpQtqxQUANbIJr30PQ98vPvaoy4JWUoElOL+cCnrSra3o7W+12dydy0rCS2EKrVm7Fw0C8L9nf1hpWjw==", "subType": "06" } } }, "kmip_double_rand_auto_altname": { "kms": "kmip", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAABxlcphy2SxXlkRBvO1Z3nNUqchmeOhIhkdYBbbW7CwYeLVRDciXFsZN73Nb9Bm+W4IpUNpo6mqFEtfjevIjtFyg==", "subType": "06" } } }, "kmip_double_rand_explicit_id": { "kms": "kmip", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAABx5AfRSiblFc1DGwxRIaUSP2kaM76ryzPUKL9KnEgnX1kjIlFz5B15uMht2cxdrntHFe1qZZk8V9PxTBpWZhJ8Q==", "subType": "06" } } }, "kmip_double_rand_explicit_altname": { "kms": "kmip", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAABXUC9v9HPrmU9tINzFmr2sQM9f7GHDus+y5T4pWX28PRtfnTysN/ANCfB9RosoR/wuKsbznwwD2JfSzOvlKo3PQ==", "subType": "06" } } }, "kmip_double_det_explicit_id": { "kms": "kmip", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "kmip_double_det_explicit_altname": { "kms": "kmip", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.2339999999999999858" } }, "kmip_string_rand_auto_id": { "kms": "kmip", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAACGHmqW1qbfqVlfB0x0CkXCk9smhs3yXsxJ/8eypSgbDQqVLSW2nf5bbHpnoCHHNtQ7I7ZBXzPzDLH2GgMJpopeQ==", "subType": "06" } } }, "kmip_string_rand_auto_altname": { "kms": "kmip", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAC9BJTD1pEMbslAjbJYt7yx/jzKkcZF3axu96+NYwp8afUCjXG5TOUZzODOwkbJuWgr7DBxa2GkZTvaAEk86h+Ow==", "subType": "06" } } }, "kmip_string_rand_explicit_id": { "kms": "kmip", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAACQlG28ECy8KHXC7GEPdC8+raBo2RMJwl5pofcPaTGkPUEbkreguMd1mYctNb90vXxby1nNeJY4o5zJJCMiNhNXg==", "subType": "06" } } }, "kmip_string_rand_explicit_altname": { "kms": "kmip", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAACbWuK+3nzeKSNVjmgHb0Ii7rA+CsAd+gYubPiMiHXZwE/o6i9FYWN+t/VK3p4K0CwIi6q3cycrMb2IgcvM27Q7Q==", "subType": "06" } } }, "kmip_string_det_auto_id": { "kms": "kmip", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAC5OZgr9keCXOIj5Fi06i4win1xt7gpsyPA4Os+HdFn1MIP9tnktvWNRb8Rqhuj2O9KO83brx74Hu3EQ4nT6uCMw==", "subType": "06" } } }, "kmip_string_det_explicit_id": { "kms": "kmip", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAC5OZgr9keCXOIj5Fi06i4win1xt7gpsyPA4Os+HdFn1MIP9tnktvWNRb8Rqhuj2O9KO83brx74Hu3EQ4nT6uCMw==", "subType": "06" } } }, "kmip_string_det_explicit_altname": { "kms": "kmip", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAC5OZgr9keCXOIj5Fi06i4win1xt7gpsyPA4Os+HdFn1MIP9tnktvWNRb8Rqhuj2O9KO83brx74Hu3EQ4nT6uCMw==", "subType": "06" } } }, "kmip_object_rand_auto_id": { "kms": "kmip", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAADh2nGqaAUwHDRVjqYpj8JAPH7scmiHp1Z9SGBZQ6Fapxm+zWDdTBHyitM9U69BctJ5DaaafyqFOj5yr6sJ+ebJQ==", "subType": "06" } } }, "kmip_object_rand_auto_altname": { "kms": "kmip", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAD1YhOKyNle4y0Qbeio1HlCULLeTCALCLgKSITd50bilD+oDyqQawixJAwphcdjhLdFzbFwst5RWqpsiWMPHx4hQ==", "subType": "06" } } }, "kmip_object_rand_explicit_id": { "kms": "kmip", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAADveILoWFgX7AhUWCv8UL52TUa75qHuoNadnTQydJlqd6PVmtRKj+8vS7VwxNWPaH4wB1Tk7emMyFEbZpvvzjxqQ==", "subType": "06" } } }, "kmip_object_rand_explicit_altname": { "kms": "kmip", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAADB/LN9V/4SROJn+ESHRLM7wwcUltQUx3+LbbYXjPDXiiV14HK76Iyy6ZxJ+M5qC9bRj3afhTKuWLBblB8WwksOg==", "subType": "06" } } }, "kmip_object_det_explicit_id": { "kms": "kmip", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_det_explicit_altname": { "kms": "kmip", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "kmip_array_rand_auto_id": { "kms": "kmip", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAEasWXQam8XtOkSO0nEttMCQ0iZ4V8DDmhMKyQDFDsiNHyF2h98Ya/xFv4ZSlbpGWXPBvBATEGgov/PDg2vhVi53y4Pk33RHfY60hABuksp3o=", "subType": "06" } } }, "kmip_array_rand_auto_altname": { "kms": "kmip", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAEj3A1DYSEHm/3SlEmusA+pewxRPUoZ2NAjs60ioEBlCw9n6yiiB+X8d/w40TKsjZcOSfh05NC0z3gnpqQvrNolkxkvi9dmFiZeiiv5vBZUPI=", "subType": "06" } } }, "kmip_array_rand_explicit_id": { "kms": "kmip", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAEqeJW+L6lP0bn5QcD0FMI0C8vv2n5kV7SKgqKi1o5mxaxmp3Cjlspf7yumfSiQ5js6G9yJVAvHuxlqv14UFyR9RgXS0PIA8WzsAqkL0sJSw0=", "subType": "06" } } }, "kmip_array_rand_explicit_altname": { "kms": "kmip", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAEnPlPwy0B1VKuNum1GzkZwQjZia5jNYL5bf/k+PbfhnToTRWGxx8+E3R7XXp6YT/rFkjPlzU8ww9+iZNo2oqNpYuHdrIC8ybhO6HZAlvcERo=", "subType": "06" } } }, "kmip_array_det_explicit_id": { "kms": "kmip", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_det_explicit_altname": { "kms": "kmip", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_binData=00_rand_auto_id": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFliNDZ6DmjoVcYQBCKDI9njpBsDELg+TD6XLF7xbZnMaJCCHLHr7w3x2/xFfrFSN44CtGAKOniYPCMAspaxHqOA==", "subType": "06" } } }, "kmip_binData=00_rand_auto_altname": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAF/P8LPmHKGgG0l5/Xi7jdkwfxpGPxoY0417suCvN6zjM3JNdufytzkektrm9CbBb1SnZCGYF9c0FCMzFG+tN/dg==", "subType": "06" } } }, "kmip_binData=00_rand_explicit_id": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFWI0N4RbnYdEiFrzNpbRN9p+bSLm8Lthiu4K3/CvBg6GQpLMVQFhjW01Bud0lxpT2ohRnOK+ASUhiFcUU/t/lWQ==", "subType": "06" } } }, "kmip_binData=00_rand_explicit_altname": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFQZvAtpY4cjEr1rJWVoUGaZKmzocSJ0muHose7Tk5kRDczjFa4Jcu4hN7JLM9qz2z4g+WJC3KQTdW4ZBXStke/Q==", "subType": "06" } } }, "kmip_binData=00_det_auto_id": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFohIHrvzu8xLxVHsnYEDhZmv8BpEoEtFSjMUQzvBLUInvvTuU/rOzlVL88CkAEII7M3hcvrz8FKY7b7lC1veoYg==", "subType": "06" } } }, "kmip_binData=00_det_explicit_id": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFohIHrvzu8xLxVHsnYEDhZmv8BpEoEtFSjMUQzvBLUInvvTuU/rOzlVL88CkAEII7M3hcvrz8FKY7b7lC1veoYg==", "subType": "06" } } }, "kmip_binData=00_det_explicit_altname": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFohIHrvzu8xLxVHsnYEDhZmv8BpEoEtFSjMUQzvBLUInvvTuU/rOzlVL88CkAEII7M3hcvrz8FKY7b7lC1veoYg==", "subType": "06" } } }, "kmip_binData=04_rand_auto_id": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFn7rhdO8tYq77uVxcqd9Qjz84Yg7JnJMYf0ULTMTh1vJHacckkhXw+8fIMMiAKwuOVwGkMAtu5RBvrFqdfxryCg8RLTxu1YYVthufiClEIS0=", "subType": "06" } } }, "kmip_binData=04_rand_auto_altname": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFwwXQx9dKyoyHq7GBMmHzYe9ysoJK/f/ZWzA6nErau9MtX1gqi7VRsYqkamb47/zVbsLZwPMmdgNyPxEh3kqbV2D61t5RG2A3VeqhO1pTF8c=", "subType": "06" } } }, "kmip_binData=04_rand_explicit_id": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAFALeGeinJ8DE+WZniLdCIW2gfJUj445Ukp9PvRLgBXLGedl8mIXlLF2eu3BA9vP6s5y9w6peQjhn+oEofrsUVYD2duyzeIRMKgNiNchjf6TU=", "subType": "06" } } }, "kmip_binData=04_rand_explicit_altname": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAF06Fx8CO3OSKE3fGri0VwK0e22YiG9LH2QkDTsRdFbT2lBm+bDD9FrEY8vKWS5RljMuysaxjBOzZ98d2LEs6k8LMOm83Nz/RESe4ZbbcfdQ0=", "subType": "06" } } }, "kmip_binData=04_det_auto_id": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFzmZI909fJgxOykJtvOlv5LsX8z6BxUX2Xg5TsIwOxJMPSC8usm/zR7sZawoVBOuJxtNVLY/8oNP/4pFtAmQo02bUOtTo1yxNz/IZa9x+Q5E=", "subType": "06" } } }, "kmip_binData=04_det_explicit_id": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFzmZI909fJgxOykJtvOlv5LsX8z6BxUX2Xg5TsIwOxJMPSC8usm/zR7sZawoVBOuJxtNVLY/8oNP/4pFtAmQo02bUOtTo1yxNz/IZa9x+Q5E=", "subType": "06" } } }, "kmip_binData=04_det_explicit_altname": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAFzmZI909fJgxOykJtvOlv5LsX8z6BxUX2Xg5TsIwOxJMPSC8usm/zR7sZawoVBOuJxtNVLY/8oNP/4pFtAmQo02bUOtTo1yxNz/IZa9x+Q5E=", "subType": "06" } } }, "kmip_undefined_rand_explicit_id": { "kms": "kmip", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_rand_explicit_altname": { "kms": "kmip", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_det_explicit_id": { "kms": "kmip", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_det_explicit_altname": { "kms": "kmip", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "kmip_objectId_rand_auto_id": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAHZFzE908RuO5deEt3t2QQdT12ybwqbm8D+sMJrdKt2Wp4kVPsw4ocAGGsRYN6VXe46P5fmyG5HqVWn0hkflZnQg==", "subType": "06" } } }, "kmip_objectId_rand_auto_altname": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAH3dPKyCCStvOtVGzlgIS33fsl8OAwQblt9i21pOVuLiliY1Tup9EtkSic88+nNEtXnq9gRknRzLthXv/k1ql+7Q==", "subType": "06" } } }, "kmip_objectId_rand_explicit_id": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAHcEjxVfHDSfLzFxAuK/rs/Pn/XV7jLkgKXZYeY0PNlRi1MHojN2AvQqI3J2rOvAjuYfikGcpvGPp/goqUbV9HYw==", "subType": "06" } } }, "kmip_objectId_rand_explicit_altname": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAHX65sNHnRYpx3VbWPCdQyFe7u0Y5ItabLEduqDeVsPk/iK4X3GjCSHQfw1yPi+CA+/veVpgdonwws6RiYV4ZZ5Q==", "subType": "06" } } }, "kmip_objectId_det_auto_id": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAHKU7mcdGEq2WGrDB6TicipLQstAk6G3PkiNt5F3bMavpKLjz04UBrd8aWGVG2gJTTON1UKRztiYFgRvb8f+LK/Q==", "subType": "06" } } }, "kmip_objectId_det_explicit_id": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAHKU7mcdGEq2WGrDB6TicipLQstAk6G3PkiNt5F3bMavpKLjz04UBrd8aWGVG2gJTTON1UKRztiYFgRvb8f+LK/Q==", "subType": "06" } } }, "kmip_objectId_det_explicit_altname": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAHKU7mcdGEq2WGrDB6TicipLQstAk6G3PkiNt5F3bMavpKLjz04UBrd8aWGVG2gJTTON1UKRztiYFgRvb8f+LK/Q==", "subType": "06" } } }, "kmip_bool_rand_auto_id": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAIw/xgJlKEvErmVtue3X3RFsOI2sttAbxnzh1INc9GUQ2vok1VwYt9k88RxMPiOwMAZG7P1MlAdx7zt865onPKOw==", "subType": "06" } } }, "kmip_bool_rand_auto_altname": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAIn8IuzlNHbpTgXOd1wEp364zJOBxj2Zf7a9B5osUV1sDY0G1OVpEnuDvZeUsdiUSyRjTTxzyuD/KZlKZ3+qrnrA==", "subType": "06" } } }, "kmip_bool_rand_explicit_id": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAI3Nz9PdjUYQRGfTtvYSR8EQuUKFL0wdlEdfSCTBmMBhBPuuF9KxqCgy+ldVu1DRRgg3346DOKEEtE9BJPPInJ6Q==", "subType": "06" } } }, "kmip_bool_rand_explicit_altname": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAIEGjqoerIZBk8Rw+YTO7jFKWzagDS8mEpD+9Wm1Q0r0ZHUmV0dQZcIqRV4oUk8U8uHUn0N3t2qGLr+rhUs4GH/g==", "subType": "06" } } }, "kmip_bool_det_explicit_id": { "kms": "kmip", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "kmip_bool_det_explicit_altname": { "kms": "kmip", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "kmip_date_rand_auto_id": { "kms": "kmip", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAJgr0v4xetUXjlLcPcyKv/rzjtWOKp9CZJcm23Noglu5RR/rXJS0qKI+W9MmJ64TMf27KvaJ0UXwfTRrvOC1plCg==", "subType": "06" } } }, "kmip_date_rand_auto_altname": { "kms": "kmip", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAJoeysAaiPsVK+JL1P1vD/9xF92m5kKidUdn6yklPlSKN4VVEBTymDetTLujULs1u1TlrS71jVLxo3xEwpG/KQvg==", "subType": "06" } } }, "kmip_date_rand_explicit_id": { "kms": "kmip", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAJVwu4+Su0DktpnZvzTBHYpWbWTq5gho/SLijrcIrFJcvq4YrjjPCXv+odCl95tkH+J1RlJdQ5Cr0umEIazLa6GA==", "subType": "06" } } }, "kmip_date_rand_explicit_altname": { "kms": "kmip", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAJWTYpjbDkIf82QXHMGrvd0SqhP8cBIakfYJf5aNcNrs86vxRhiG3KwETWPeOOlPZ6n1WjE2bOLB+DJTAxmJvahA==", "subType": "06" } } }, "kmip_date_det_auto_id": { "kms": "kmip", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAJ/+sQrUqQh+JADSVIKM0d68gDUhDy37M1z1uvROzQw6hUAbQeD0DWdztADKg560UTPM4uOgH4NAyhLyBLMrWWHg==", "subType": "06" } } }, "kmip_date_det_explicit_id": { "kms": "kmip", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAJ/+sQrUqQh+JADSVIKM0d68gDUhDy37M1z1uvROzQw6hUAbQeD0DWdztADKg560UTPM4uOgH4NAyhLyBLMrWWHg==", "subType": "06" } } }, "kmip_date_det_explicit_altname": { "kms": "kmip", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAJ/+sQrUqQh+JADSVIKM0d68gDUhDy37M1z1uvROzQw6hUAbQeD0DWdztADKg560UTPM4uOgH4NAyhLyBLMrWWHg==", "subType": "06" } } }, "kmip_null_rand_explicit_id": { "kms": "kmip", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "kmip_null_rand_explicit_altname": { "kms": "kmip", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "kmip_null_det_explicit_id": { "kms": "kmip", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "kmip_null_det_explicit_altname": { "kms": "kmip", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "kmip_regex_rand_auto_id": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAALi8avMfpxSlDsSTqdxO8O2B1M79gOElyUIdXySQo7mvgHlf4oHQ7r94lL9dnsA2t/jmUmBKoGypaUQUSQE+9x+A==", "subType": "06" } } }, "kmip_regex_rand_auto_altname": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAALfHerZ/KolaBrb5qi3SpeNVW+i/nh5mkcdtQg5f1pHePr68KryHucM/XDAzbMqrPlag2/41STGYdJqzYO7Mbppg==", "subType": "06" } } }, "kmip_regex_rand_explicit_id": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAALOhKDVAN5cuDyB1EuRFWgKKt0wGJ63E5pPY8Tq2TXMNgCxUUc5O+TE+Ux4ls/uMyOBA3gPzND0CZKiru0i7ACUQ==", "subType": "06" } } }, "kmip_regex_rand_explicit_altname": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAALK3Hg8xX9gX+d3vKh7aosRP9CS2CIFeG9sapZv3OAPv1eWjY62Cp/G16kJ0BQt33RYD+DzD3gWupfUSyNZR0gng==", "subType": "06" } } }, "kmip_regex_det_auto_id": { "kms": "kmip", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAALaQXA8rItT7ELVxO8XtAWdHuiXFFPmnMhS5PMrUy/6mRtbq4fvU9dascW7ozonKOh8ad6+MIT7B/STv9dVBF4Kw==", "subType": "06" } } }, "kmip_regex_det_explicit_id": { "kms": "kmip", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAALaQXA8rItT7ELVxO8XtAWdHuiXFFPmnMhS5PMrUy/6mRtbq4fvU9dascW7ozonKOh8ad6+MIT7B/STv9dVBF4Kw==", "subType": "06" } } }, "kmip_regex_det_explicit_altname": { "kms": "kmip", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAALaQXA8rItT7ELVxO8XtAWdHuiXFFPmnMhS5PMrUy/6mRtbq4fvU9dascW7ozonKOh8ad6+MIT7B/STv9dVBF4Kw==", "subType": "06" } } }, "kmip_dbPointer_rand_auto_id": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAMoGkfmmUWTI+0aW7jVyCJ5Dgru1SCXBUmJSRzDL0D57pNruQ+79tVVcI6Uz5j87DhZFxShHbPjj583vLOOBNM3WGzZCpqH3serhHTWvXK+NM=", "subType": "06" } } }, "kmip_dbPointer_rand_auto_altname": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAMwu1WaRhhv43xgxLNxuenbND9M6mxGtCs9o4J5+yfL95XNB9Daie3RcLlyngz0pncBie6IqjhTycXsxTLQ94Jdg6m5GD5cU541LYKvhbv5f4=", "subType": "06" } } }, "kmip_dbPointer_rand_explicit_id": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAM+CIoCAisUwhhJtWQLolxQGQWafniwYyvaJQHmJC94Uwbf1gPfhMR42v2VtrmIVP0J0BaP/xf0cco2/qWRdKGZpgkK2CK6M972NtnZ/2x03A=", "subType": "06" } } }, "kmip_dbPointer_rand_explicit_altname": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAMjbeE9+EaJYjGfeAuxsV8teOdsW8bfnlkvji/tE11Zq89UMGx+oUsZzeLjUgVZ5nxsZKCZjEAq+DPnwFVC+MgqNeqWL7fRChODFlPGH2ZC+8=", "subType": "06" } } }, "kmip_dbPointer_det_auto_id": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAM5B+fjbjYCZzCYUu4N/pJI3srCCXN+OCCHweeweqmpIEmB7yw87bQRIMGtCm6HuekcZ5J5q+nY5AQb0du/wh1YIoOrC3u4w7ZcLHkDmuAJPg=", "subType": "06" } } }, "kmip_dbPointer_det_explicit_id": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAM5B+fjbjYCZzCYUu4N/pJI3srCCXN+OCCHweeweqmpIEmB7yw87bQRIMGtCm6HuekcZ5J5q+nY5AQb0du/wh1YIoOrC3u4w7ZcLHkDmuAJPg=", "subType": "06" } } }, "kmip_dbPointer_det_explicit_altname": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAM5B+fjbjYCZzCYUu4N/pJI3srCCXN+OCCHweeweqmpIEmB7yw87bQRIMGtCm6HuekcZ5J5q+nY5AQb0du/wh1YIoOrC3u4w7ZcLHkDmuAJPg=", "subType": "06" } } }, "kmip_javascript_rand_auto_id": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAANuzlkWs/c8xArrAxPgYuCeShjj1zCfIMHOTPohspcyNofo9iY3P5MlhEOprZDiS8dBFg6EB7fZDzDdczx6VCN2A==", "subType": "06" } } }, "kmip_javascript_rand_auto_altname": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAANwJ72y7UqCBJh1NwVRiE3vU1ex7FMv/X5YWCMuO9MHPMo4g1V5eaO4KfOr+K8+9NtkflgMpeDkvwP92rfR5ud5Q==", "subType": "06" } } }, "kmip_javascript_rand_explicit_id": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAANj5q+888itRnLsw9PNGsBLhgqpvem5IJBOE2292r6zwjVueoEK/2I2PesRnn0esnkwdia1ADoMkcLUegwcFRkWQ==", "subType": "06" } } }, "kmip_javascript_rand_explicit_altname": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAANnvbnmApys7OIe8LGTsZKDG1F1G1SI/rfZVmF6q1fq5U7feYPp1ejb2t2S2+v7LfcOHytsQWGcYuWCDcl+vosvQ==", "subType": "06" } } }, "kmip_javascript_det_auto_id": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAANOR9R/Da8j5iVxllLiGFlv4U/bVn/PyN9/5WeGJkGJeE/j/osKrKx6IL1igI0YVI+pKKzsINqJGIv+bJX0s7MNw==", "subType": "06" } } }, "kmip_javascript_det_explicit_id": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAANOR9R/Da8j5iVxllLiGFlv4U/bVn/PyN9/5WeGJkGJeE/j/osKrKx6IL1igI0YVI+pKKzsINqJGIv+bJX0s7MNw==", "subType": "06" } } }, "kmip_javascript_det_explicit_altname": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAANOR9R/Da8j5iVxllLiGFlv4U/bVn/PyN9/5WeGJkGJeE/j/osKrKx6IL1igI0YVI+pKKzsINqJGIv+bJX0s7MNw==", "subType": "06" } } }, "kmip_symbol_rand_auto_id": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAOe+vXpJSkmBM3WkxZrn4ea9/C6iNyMXWUzkQIzIYlnbkyu8od8nfOdhobUhoFxcKnvdaxN1s5NhJ1FA97RN/upGYN+AI/7cTCElmFSpdSvkI=", "subType": "06" } } }, "kmip_symbol_rand_auto_altname": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAOPpCgK6Hc/M2elOJkwIU9J7PZa+h1chody2yvfDu/UlB6T5sxnEZ6aEY/ISNLhJlhsRzuApSgFOmnrcG6Eg9VnSKin2yK0ll+VFxQEDHAcSA=", "subType": "06" } } }, "kmip_symbol_rand_explicit_id": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAOVoHX9GaOn71L5D9TpZmmxkx/asr0FHCLG5ZgLLA04yIhZHsDjt2DiVGGO/Mf4KwvoBn7Cf08qMhW7rQh2LgvvSLBO3zbw5l+MZ/bSn+Jylo=", "subType": "06" } } }, "kmip_symbol_rand_explicit_altname": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAOPobmcO/I4QObtCUEmGWpSCJ6tlYyhbO59q78LZBucSNl7DSkf/13tOJ9t+WKXACcMKVMmfPoFsgHbVj1nKWULBT07n1OWWDTZkuMD6C2+Fc=", "subType": "06" } } }, "kmip_symbol_det_auto_id": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAOPpwX4mafoQJYHuzYfbKW1JunpjpB7Nd2slTC3n8Hsas9wQYf9VkModQhe5M4wZHOIXpehaODRcjKKfKRmpnNBOURSLm/ORJvy+UxtSLsnqo=", "subType": "06" } } }, "kmip_symbol_det_explicit_id": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAOPpwX4mafoQJYHuzYfbKW1JunpjpB7Nd2slTC3n8Hsas9wQYf9VkModQhe5M4wZHOIXpehaODRcjKKfKRmpnNBOURSLm/ORJvy+UxtSLsnqo=", "subType": "06" } } }, "kmip_symbol_det_explicit_altname": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAOPpwX4mafoQJYHuzYfbKW1JunpjpB7Nd2slTC3n8Hsas9wQYf9VkModQhe5M4wZHOIXpehaODRcjKKfKRmpnNBOURSLm/ORJvy+UxtSLsnqo=", "subType": "06" } } }, "kmip_javascriptWithScope_rand_auto_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAPW2VMMm+EvsYpVtJQhsxgxgvV35kr9nxqKxP2qqIOAOQ58R/1oyYScFkNwB/tw0A1/zdvhoo+ERa7c0tjLIojFrosXhX2N/8Z4VnbZruz0Nk=", "subType": "06" } } }, "kmip_javascriptWithScope_rand_auto_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAPjPq9BQR4EwG/CD+RthOJY04m99LCl/shY6HnaU/QL627kN1dbBAG5vs+MXfa+glg8waVTNgB94vm3j72FMV1ZOKvbl4faWF1Rl2EOpOlR9U=", "subType": "06" } } }, "kmip_javascriptWithScope_rand_explicit_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAPtqebrCAidKzBMvp3B5/vBeetqeCoMKS+vo+hLAYooXrnBunWxwRHpr45XYUvroG3aqOMkLtVZSgw8sO6Y/3z1viO2G0sGQW1ZMoW0/PX5Uw=", "subType": "06" } } }, "kmip_javascriptWithScope_rand_explicit_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAPtkJwXKlq8Fx1f1+9HFofM4uKi6lHQRFRyiOyUFJYxxZY1LR/2WXXTqWz3MWtrcJFCB+QSVOb1N/ieC7AZUboPgIuPJISM3Hu5VU2x/Isbdc=", "subType": "06" } } }, "kmip_javascriptWithScope_det_explicit_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_det_explicit_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "kmip_int_rand_auto_id": { "kms": "kmip", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAQ50kE7Tby9od2OsmIGZhp9k/mj4vy/YdnmF6YsSPxihbjV1vXGMraI/nGCr+0H1riwzq3m4sCT7aPw2VgiuwKMA==", "subType": "06" } } }, "kmip_int_rand_auto_altname": { "kms": "kmip", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAQkNL14OSMX/bJbsLtB/UumRoat6QOY7fvwZxRrkXTS3VJVHigthI1cUX7Is/uUsY8oHOfk/ZuHklQkifmfdcklQ==", "subType": "06" } } }, "kmip_int_rand_explicit_id": { "kms": "kmip", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAQtN2gNVU9Itoj+vgcK/4jEB5baSUH+Qz2WqTY7m0XaA3bPWGFCiWY4Sdw+qovednrSSSbC+azWi1QYclFRraldQ==", "subType": "06" } } }, "kmip_int_rand_explicit_altname": { "kms": "kmip", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAQk6uBqwXXFF9zEM4bc124goI3pBy2Jdi8Cd0ycKkjXrPG7GVCUm2UMbO+zEzYODeVo35N11g2yMXcv9RVgjWtNA==", "subType": "06" } } }, "kmip_int_det_auto_id": { "kms": "kmip", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAQgrkPEf+RBZMn/J7HZObqEfus8icYls6ecaUrlabI6v1ALgxLuv23WSIfTr6mqpQCounqdA14DWS/Wl3kSkVC0w==", "subType": "06" } } }, "kmip_int_det_explicit_id": { "kms": "kmip", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAQgrkPEf+RBZMn/J7HZObqEfus8icYls6ecaUrlabI6v1ALgxLuv23WSIfTr6mqpQCounqdA14DWS/Wl3kSkVC0w==", "subType": "06" } } }, "kmip_int_det_explicit_altname": { "kms": "kmip", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAQgrkPEf+RBZMn/J7HZObqEfus8icYls6ecaUrlabI6v1ALgxLuv23WSIfTr6mqpQCounqdA14DWS/Wl3kSkVC0w==", "subType": "06" } } }, "kmip_timestamp_rand_auto_id": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAAR2Cu3o2e/u5o69MndeZPJU5ngVA1G2MNYn00t+up/GlmaUC1ni1CVl0ZR0EVZ0gCDUrfxwPISPib8y23tNjbsog==", "subType": "06" } } }, "kmip_timestamp_rand_auto_altname": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAARgi8stgSQwqnN4Ws2ZBILOREsjreZcS1MBerL7dbGLVfzW99tqECglhGokkrE0aY69L0xMgcAUIaFRN4GanQAPg==", "subType": "06" } } }, "kmip_timestamp_rand_explicit_id": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAARPxEEI8L5Q3Jybu88BLdf31T3uYEUbijgSlKlkTt141RYrlE8nxtiYU5/5H9GXBis0Qq1s2C+MauD2h/cNijTCA==", "subType": "06" } } }, "kmip_timestamp_rand_explicit_altname": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAARh/QaU1dnGbii4LtXCpT5o6vencc8E2fzarjJFbSEd0ixW/UV1ppZdvD729d0umkaIwIEVA4q+XVvHfl/ckKPFg==", "subType": "06" } } }, "kmip_timestamp_det_auto_id": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAARqdpLb72mmzb75QBrE+ATMfS5LLqzAD/1g5ScT8zfgh0IHsZZBWCJlSVRNC12Sgr3zdXHMtYp8C3OZT6/tPkQGg==", "subType": "06" } } }, "kmip_timestamp_det_explicit_id": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAARqdpLb72mmzb75QBrE+ATMfS5LLqzAD/1g5ScT8zfgh0IHsZZBWCJlSVRNC12Sgr3zdXHMtYp8C3OZT6/tPkQGg==", "subType": "06" } } }, "kmip_timestamp_det_explicit_altname": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAARqdpLb72mmzb75QBrE+ATMfS5LLqzAD/1g5ScT8zfgh0IHsZZBWCJlSVRNC12Sgr3zdXHMtYp8C3OZT6/tPkQGg==", "subType": "06" } } }, "kmip_long_rand_auto_id": { "kms": "kmip", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAASVv+ClXkh9spIaXWJYRV/o8UZjG+WWWrNpIjZ9LQn2bXakrKJ3REvdkrzGuxASmBhBYTplEyvxVCJwXuWRAGGYw==", "subType": "06" } } }, "kmip_long_rand_auto_altname": { "kms": "kmip", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAASeAz/dK+Gc4/jx3W07B2rNFvQ0LoyCllFRvRVGu1Xf1NByc4cRZLOMzlr99syz/fifF6WY30bOi5Pani9QtFuGg==", "subType": "06" } } }, "kmip_long_rand_explicit_id": { "kms": "kmip", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAASP1HD9uoDlwTldaznKxW71JUQcLsa4/cUWzeTnelQwdpohCbZsM8fBZBqgwwTWnjpYY/LBUipC6yhwLKfUXBoBQ==", "subType": "06" } } }, "kmip_long_rand_explicit_altname": { "kms": "kmip", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAASnGPH77bS/ETB1hn+VTvsBrxEvIHA6EAb8Z2SEz6BHt7SVeI+I7DLERvRVpV5kNJFcKgXDrvRmD+Et0rhSmk9sw==", "subType": "06" } } }, "kmip_long_det_auto_id": { "kms": "kmip", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAS+zKmtijSTPOEVlpwmaeMIOuzVNuZpV4Jw9zP8Yqa1xYtlItXDozqdibacRaA74KU49KNySdR1T7fxwxa2OOTrQ==", "subType": "06" } } }, "kmip_long_det_explicit_id": { "kms": "kmip", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAS+zKmtijSTPOEVlpwmaeMIOuzVNuZpV4Jw9zP8Yqa1xYtlItXDozqdibacRaA74KU49KNySdR1T7fxwxa2OOTrQ==", "subType": "06" } } }, "kmip_long_det_explicit_altname": { "kms": "kmip", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "ASjCDwAAAAAAAAAAAAAAAAAS+zKmtijSTPOEVlpwmaeMIOuzVNuZpV4Jw9zP8Yqa1xYtlItXDozqdibacRaA74KU49KNySdR1T7fxwxa2OOTrQ==", "subType": "06" } } }, "kmip_decimal_rand_auto_id": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAATu/BbCc5Ti9SBlMR2B8zj3Q1yQ16Uob+10LWaT5QKS192IcnBGy4wmmNkIsTys060xUby9KKQF80dVPnjYfqJwEXCe/pVaPQZftE0DolKv78=", "subType": "06" } } }, "kmip_decimal_rand_auto_altname": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAATpq6/dtxq2ZUZHrK10aB0YjjPalEaXYcyAyRZjfXWAYCLZdT9sIybjX3Axjxisim+VSHx0QU7oXkKUfcbLgHyjUXj8g9059FHxKFkUsNv4Z8=", "subType": "06" } } }, "kmip_decimal_rand_explicit_id": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAATS++9KcfM7uiShZYxRpFPrBJquKv7dyvFRTjnxs6aaaPo0fiqpv6bco/cMLsldEVpWDEA/Tc2HtSXYPp4UJsMfASyBjoxCloL5SaRWyD9Ye8=", "subType": "06" } } }, "kmip_decimal_rand_explicit_altname": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AijCDwAAAAAAAAAAAAAAAAATREcETS5KoAGyj/P45owPrdFfy5ng8Z1ND+F+780lLddOyPeDnIsa7yg6uvhTZ65mHfGLvKcFocclYenq/AX1dY4xdjLRg/AfT088A27ORUA=", "subType": "06" } } }, "kmip_decimal_det_explicit_id": { "kms": "kmip", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_det_explicit_altname": { "kms": "kmip", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "kmip_minKey_rand_explicit_id": { "kms": "kmip", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_rand_explicit_altname": { "kms": "kmip", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_det_explicit_id": { "kms": "kmip", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_det_explicit_altname": { "kms": "kmip", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "kmip_maxKey_rand_explicit_id": { "kms": "kmip", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_rand_explicit_altname": { "kms": "kmip", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_det_explicit_id": { "kms": "kmip", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_det_explicit_altname": { "kms": "kmip", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } } }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-key-aws.json000066400000000000000000000020231511661753600333210ustar00rootroot00000000000000{ "status": { "$numberInt": "1" }, "_id": { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "region": "us-east-1", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "provider": "aws" }, "updateDate": { "$date": { "$numberLong": "1557827033449" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1557827033449" } }, "keyAltNames": ["aws"] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-key-azure.json000066400000000000000000000017751511661753600336720ustar00rootroot00000000000000{ "_id": { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "n+HWZ0ZSVOYA3cvQgP7inN4JSXfOH85IngmeQxRpQHjCCcqT3IFqEWNlrsVHiz3AELimHhX4HKqOLWMUeSIT6emUDDoQX9BAv8DR1+E1w4nGs/NyEneac78EYFkK3JysrFDOgl2ypCCTKAypkn9CkAx1if4cfgQE93LW4kczcyHdGiH36CIxrCDGv1UzAvERN5Qa47DVwsM6a+hWsF2AAAJVnF0wYLLJU07TuRHdMrrphPWXZsFgyV+lRqJ7DDpReKNO8nMPLV/mHqHBHGPGQiRdb9NoJo8CvokGz4+KE8oLwzKf6V24dtwZmRkrsDV4iOhvROAzz+Euo1ypSkL3mw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601573901680" } }, "updateDate": { "$date": { "$numberLong": "1601573901680" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyAltNames": ["azure"] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-key-gcp.json000066400000000000000000000016751511661753600333140ustar00rootroot00000000000000{ "_id": { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "CiQAIgLj0WyktnB4dfYHo5SLZ41K4ASQrjJUaSzl5vvVH0G12G0SiQEAjlV8XPlbnHDEDFbdTO4QIe8ER2/172U1ouLazG0ysDtFFIlSvWX5ZnZUrRMmp/R2aJkzLXEt/zf8Mn4Lfm+itnjgo5R9K4pmPNvvPKNZX5C16lrPT+aA+rd+zXFSmlMg3i5jnxvTdLHhg3G7Q/Uv1ZIJskKt95bzLoe0tUVzRWMYXLIEcohnQg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601574333107" } }, "updateDate": { "$date": { "$numberLong": "1601574333107" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyAltNames": ["gcp"] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-key-kmip.json000066400000000000000000000014551511661753600334770ustar00rootroot00000000000000{ "_id": { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "eUYDyB0HuWb+lQgUwO+6qJQyTTDTY2gp9FbemL7ZFo0pvr0x6rm6Ff9OVUTGH6HyMKipaeHdiIJU1dzsLwvqKvi7Beh+U4iaIWX/K0oEg1GOsJc0+Z/in8gNHbGUYLmycHViM3LES3kdt7FdFSUl5rEBHrM71yoNEXImz17QJWMGOuT4x6yoi2pvnaRJwfrI4DjpmnnTrDMac92jgZehbg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1634220190041" } }, "updateDate": { "$date": { "$numberLong": "1634220190041" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "kmip", "keyId": "1" }, "keyAltNames": ["kmip"] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-key-local.json000066400000000000000000000014421511661753600336250ustar00rootroot00000000000000{ "status": { "$numberInt": "1" }, "_id": { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "local" }, "updateDate": { "$date": { "$numberLong": "1557827033449" } }, "keyMaterial": { "$binary": { "base64": "Ce9HSz/HKKGkIt4uyy+jDuKGA+rLC2cycykMo6vc8jXxqa1UVDYHWq1r+vZKbnnSRBfB981akzRKZCFpC05CTyFqDhXv6OnMjpG97OZEREGIsHEYiJkBW0jJJvfLLgeLsEpBzsro9FztGGXASxyxFRZFhXvHxyiLOKrdWfs7X1O/iK3pEoHMx6uSNSfUOgbebLfIqW7TO++iQS5g1xovXA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1557827033449" } }, "keyAltNames": [ "local" ] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus-schema.json000066400000000000000000004422361511661753600332170ustar00rootroot00000000000000{ "bsonType": "object", "properties": { "aws_double_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "aws_double_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "aws_double_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_double_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_string_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "aws_string_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "aws_string_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_string_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_string_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } }, "aws_string_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_string_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_object_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "aws_object_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "aws_object_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_object_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_array_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "aws_array_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "aws_array_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_array_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=00_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "aws_binData=00_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "aws_binData=00_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=00_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=00_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "aws_binData=00_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=00_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=04_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "aws_binData=04_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "aws_binData=04_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=04_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=04_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "aws_binData=04_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_binData=04_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_objectId_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "aws_objectId_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "aws_objectId_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_objectId_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_objectId_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "objectId" } } } }, "aws_objectId_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_objectId_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_bool_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "aws_bool_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "aws_bool_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_bool_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_date_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "aws_date_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "aws_date_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_date_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_date_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "date" } } } }, "aws_date_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_date_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_regex_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "aws_regex_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "aws_regex_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_regex_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_regex_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "regex" } } } }, "aws_regex_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_regex_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_dbPointer_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "aws_dbPointer_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "aws_dbPointer_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_dbPointer_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_dbPointer_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "dbPointer" } } } }, "aws_dbPointer_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_dbPointer_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascript_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "aws_javascript_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "aws_javascript_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascript_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascript_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "javascript" } } } }, "aws_javascript_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascript_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_symbol_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "aws_symbol_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "aws_symbol_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_symbol_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_symbol_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "symbol" } } } }, "aws_symbol_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_symbol_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascriptWithScope_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "aws_javascriptWithScope_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "aws_javascriptWithScope_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_javascriptWithScope_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_int_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "aws_int_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "aws_int_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_int_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_int_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "int" } } } }, "aws_int_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_int_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_timestamp_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "aws_timestamp_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "aws_timestamp_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_timestamp_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_timestamp_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "timestamp" } } } }, "aws_timestamp_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_timestamp_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_long_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "aws_long_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "aws_long_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_long_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_long_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "long" } } } }, "aws_long_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_long_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_decimal_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AWSAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "aws_decimal_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_aws", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "aws_decimal_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "aws_decimal_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_double_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "local_double_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "local_double_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_double_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_string_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "local_string_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "local_string_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_string_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_string_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } }, "local_string_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_string_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_object_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "local_object_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "local_object_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_object_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_array_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "local_array_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "local_array_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_array_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=00_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "local_binData=00_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "local_binData=00_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=00_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=00_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "local_binData=00_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=00_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=04_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "local_binData=04_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "local_binData=04_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=04_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=04_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "local_binData=04_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_binData=04_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_objectId_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "local_objectId_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "local_objectId_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_objectId_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_objectId_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "objectId" } } } }, "local_objectId_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_objectId_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_bool_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "local_bool_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "local_bool_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_bool_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_date_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "local_date_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "local_date_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_date_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_date_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "date" } } } }, "local_date_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_date_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_regex_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "local_regex_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "local_regex_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_regex_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_regex_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "regex" } } } }, "local_regex_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_regex_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_dbPointer_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "local_dbPointer_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "local_dbPointer_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_dbPointer_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_dbPointer_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "dbPointer" } } } }, "local_dbPointer_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_dbPointer_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascript_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "local_javascript_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "local_javascript_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascript_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascript_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "javascript" } } } }, "local_javascript_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascript_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_symbol_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "local_symbol_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "local_symbol_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_symbol_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_symbol_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "symbol" } } } }, "local_symbol_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_symbol_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascriptWithScope_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "local_javascriptWithScope_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "local_javascriptWithScope_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_javascriptWithScope_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_int_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "local_int_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "local_int_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_int_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_int_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "int" } } } }, "local_int_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_int_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_timestamp_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "local_timestamp_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "local_timestamp_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_timestamp_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_timestamp_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "timestamp" } } } }, "local_timestamp_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_timestamp_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_long_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "local_long_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "local_long_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_long_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_long_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "long" } } } }, "local_long_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_long_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_decimal_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "local_decimal_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_local", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "local_decimal_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "local_decimal_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_double_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "azure_double_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "azure_double_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_double_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_string_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "azure_string_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "azure_string_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_string_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_string_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } }, "azure_string_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_string_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_object_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "azure_object_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "azure_object_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_object_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_array_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "azure_array_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "azure_array_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_array_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=00_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "azure_binData=00_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "azure_binData=00_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=00_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=00_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "azure_binData=00_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=00_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=04_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "azure_binData=04_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "azure_binData=04_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=04_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=04_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "azure_binData=04_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_binData=04_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_objectId_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "azure_objectId_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "azure_objectId_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_objectId_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_objectId_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "objectId" } } } }, "azure_objectId_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_objectId_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_bool_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "azure_bool_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "azure_bool_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_bool_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_date_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "azure_date_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "azure_date_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_date_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_date_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "date" } } } }, "azure_date_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_date_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_regex_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "azure_regex_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "azure_regex_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_regex_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_regex_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "regex" } } } }, "azure_regex_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_regex_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_dbPointer_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "azure_dbPointer_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "azure_dbPointer_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_dbPointer_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_dbPointer_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "dbPointer" } } } }, "azure_dbPointer_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_dbPointer_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascript_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "azure_javascript_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "azure_javascript_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascript_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascript_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "javascript" } } } }, "azure_javascript_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascript_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_symbol_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "azure_symbol_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "azure_symbol_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_symbol_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_symbol_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "symbol" } } } }, "azure_symbol_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_symbol_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascriptWithScope_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "azure_javascriptWithScope_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "azure_javascriptWithScope_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_javascriptWithScope_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_int_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "azure_int_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "azure_int_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_int_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_int_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "int" } } } }, "azure_int_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_int_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_timestamp_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "azure_timestamp_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "azure_timestamp_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_timestamp_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_timestamp_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "timestamp" } } } }, "azure_timestamp_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_timestamp_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_long_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "azure_long_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "azure_long_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_long_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_long_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "long" } } } }, "azure_long_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_long_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_decimal_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZUREAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "azure_decimal_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_azure", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "azure_decimal_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "azure_decimal_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_double_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "gcp_double_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "gcp_double_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_double_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_string_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "gcp_string_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "gcp_string_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_string_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_string_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } }, "gcp_string_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_string_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_object_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "gcp_object_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "gcp_object_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_object_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_array_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "gcp_array_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "gcp_array_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_array_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=00_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "gcp_binData=00_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "gcp_binData=00_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=00_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=00_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "gcp_binData=00_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=00_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=04_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "gcp_binData=04_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "gcp_binData=04_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=04_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=04_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "gcp_binData=04_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_binData=04_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_objectId_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "gcp_objectId_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "gcp_objectId_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_objectId_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_objectId_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "objectId" } } } }, "gcp_objectId_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_objectId_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_bool_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "gcp_bool_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "gcp_bool_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_bool_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_date_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "gcp_date_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "gcp_date_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_date_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_date_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "date" } } } }, "gcp_date_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_date_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_regex_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "gcp_regex_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "gcp_regex_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_regex_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_regex_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "regex" } } } }, "gcp_regex_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_regex_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_dbPointer_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "gcp_dbPointer_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "gcp_dbPointer_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_dbPointer_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_dbPointer_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "dbPointer" } } } }, "gcp_dbPointer_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_dbPointer_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascript_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "gcp_javascript_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "gcp_javascript_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascript_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascript_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "javascript" } } } }, "gcp_javascript_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascript_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_symbol_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "gcp_symbol_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "gcp_symbol_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_symbol_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_symbol_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "symbol" } } } }, "gcp_symbol_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_symbol_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascriptWithScope_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "gcp_javascriptWithScope_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "gcp_javascriptWithScope_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_javascriptWithScope_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_int_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "gcp_int_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "gcp_int_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_int_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_int_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "int" } } } }, "gcp_int_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_int_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_timestamp_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "gcp_timestamp_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "gcp_timestamp_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_timestamp_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_timestamp_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "timestamp" } } } }, "gcp_timestamp_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_timestamp_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_long_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "gcp_long_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "gcp_long_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_long_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_long_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "long" } } } }, "gcp_long_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_long_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_decimal_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCPAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "gcp_decimal_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_gcp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "gcp_decimal_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "gcp_decimal_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_double_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "kmip_double_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "double" } } } }, "kmip_double_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_double_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_string_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "kmip_string_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "string" } } } }, "kmip_string_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_string_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_string_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "string" } } } }, "kmip_string_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_string_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_object_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "kmip_object_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "object" } } } }, "kmip_object_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_object_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_array_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "kmip_array_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "array" } } } }, "kmip_array_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_array_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=00_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "kmip_binData=00_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "kmip_binData=00_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=00_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=00_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "kmip_binData=00_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=00_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=04_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "kmip_binData=04_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "binData" } } } }, "kmip_binData=04_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=04_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=04_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "binData" } } } }, "kmip_binData=04_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_binData=04_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_objectId_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "kmip_objectId_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "objectId" } } } }, "kmip_objectId_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_objectId_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_objectId_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "objectId" } } } }, "kmip_objectId_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_objectId_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_bool_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "kmip_bool_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "bool" } } } }, "kmip_bool_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_bool_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_date_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "kmip_date_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "date" } } } }, "kmip_date_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_date_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_date_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "date" } } } }, "kmip_date_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_date_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_regex_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "kmip_regex_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "regex" } } } }, "kmip_regex_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_regex_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_regex_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "regex" } } } }, "kmip_regex_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_regex_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_dbPointer_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "kmip_dbPointer_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "dbPointer" } } } }, "kmip_dbPointer_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_dbPointer_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_dbPointer_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "dbPointer" } } } }, "kmip_dbPointer_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_dbPointer_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascript_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "kmip_javascript_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascript" } } } }, "kmip_javascript_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascript_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascript_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "javascript" } } } }, "kmip_javascript_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascript_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_symbol_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "kmip_symbol_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "symbol" } } } }, "kmip_symbol_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_symbol_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_symbol_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "symbol" } } } }, "kmip_symbol_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_symbol_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascriptWithScope_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "kmip_javascriptWithScope_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "javascriptWithScope" } } } }, "kmip_javascriptWithScope_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_javascriptWithScope_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_int_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "kmip_int_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "int" } } } }, "kmip_int_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_int_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_int_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "int" } } } }, "kmip_int_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_int_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_timestamp_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "kmip_timestamp_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "timestamp" } } } }, "kmip_timestamp_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_timestamp_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_timestamp_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "timestamp" } } } }, "kmip_timestamp_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_timestamp_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_long_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "kmip_long_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "long" } } } }, "kmip_long_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_long_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_long_det_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType": "long" } } } }, "kmip_long_det_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_long_det_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_decimal_rand_auto_id": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": [ { "$binary": { "base64": "KMIPAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "kmip_decimal_rand_auto_altname": { "bsonType": "object", "properties": { "value": { "encrypt": { "keyId": "/altname_kmip", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "bsonType": "decimal" } } } }, "kmip_decimal_rand_explicit_id": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } }, "kmip_decimal_rand_explicit_altname": { "bsonType": "object", "properties": { "value": { "bsonType": "binData" } } } } }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/corpus/corpus.json000066400000000000000000005230711511661753600317560ustar00rootroot00000000000000{ "_id": "client_side_encryption_corpus", "altname_aws": "aws", "altname_local": "local", "altname_azure": "azure", "altname_gcp": "gcp", "altname_kmip": "kmip", "aws_double_rand_auto_id": { "kms": "aws", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "aws_double_rand_auto_altname": { "kms": "aws", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "aws_double_rand_explicit_id": { "kms": "aws", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "aws_double_rand_explicit_altname": { "kms": "aws", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "aws_double_det_explicit_id": { "kms": "aws", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "aws_double_det_explicit_altname": { "kms": "aws", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "aws_string_rand_auto_id": { "kms": "aws", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "aws_string_rand_auto_altname": { "kms": "aws", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": "mongodb" }, "aws_string_rand_explicit_id": { "kms": "aws", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "aws_string_rand_explicit_altname": { "kms": "aws", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "aws_string_det_auto_id": { "kms": "aws", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "aws_string_det_explicit_id": { "kms": "aws", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "aws_string_det_explicit_altname": { "kms": "aws", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "aws_object_rand_auto_id": { "kms": "aws", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "aws_object_rand_auto_altname": { "kms": "aws", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "aws_object_rand_explicit_id": { "kms": "aws", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "aws_object_rand_explicit_altname": { "kms": "aws", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "aws_object_det_explicit_id": { "kms": "aws", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "aws_object_det_explicit_altname": { "kms": "aws", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "aws_array_rand_auto_id": { "kms": "aws", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_rand_auto_altname": { "kms": "aws", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_rand_explicit_id": { "kms": "aws", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_rand_explicit_altname": { "kms": "aws", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_det_explicit_id": { "kms": "aws", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_array_det_explicit_altname": { "kms": "aws", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "aws_binData=00_rand_auto_id": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_rand_auto_altname": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_rand_explicit_id": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_rand_explicit_altname": { "kms": "aws", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_det_auto_id": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_det_explicit_id": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=00_det_explicit_altname": { "kms": "aws", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "aws_binData=04_rand_auto_id": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_rand_auto_altname": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_rand_explicit_id": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_rand_explicit_altname": { "kms": "aws", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_det_auto_id": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_det_explicit_id": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_binData=04_det_explicit_altname": { "kms": "aws", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "aws_undefined_rand_explicit_id": { "kms": "aws", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_rand_explicit_altname": { "kms": "aws", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_det_explicit_id": { "kms": "aws", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "aws_undefined_det_explicit_altname": { "kms": "aws", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "aws_objectId_rand_auto_id": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_rand_auto_altname": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_rand_explicit_id": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_rand_explicit_altname": { "kms": "aws", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_det_auto_id": { "kms": "aws", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_det_explicit_id": { "kms": "aws", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_objectId_det_explicit_altname": { "kms": "aws", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "aws_bool_rand_auto_id": { "kms": "aws", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": true }, "aws_bool_rand_auto_altname": { "kms": "aws", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": true }, "aws_bool_rand_explicit_id": { "kms": "aws", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": true }, "aws_bool_rand_explicit_altname": { "kms": "aws", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": true }, "aws_bool_det_explicit_id": { "kms": "aws", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "aws_bool_det_explicit_altname": { "kms": "aws", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "aws_date_rand_auto_id": { "kms": "aws", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_rand_auto_altname": { "kms": "aws", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_rand_explicit_id": { "kms": "aws", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_rand_explicit_altname": { "kms": "aws", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_det_auto_id": { "kms": "aws", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_det_explicit_id": { "kms": "aws", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_date_det_explicit_altname": { "kms": "aws", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "aws_null_rand_explicit_id": { "kms": "aws", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "aws_null_rand_explicit_altname": { "kms": "aws", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "aws_null_det_explicit_id": { "kms": "aws", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "aws_null_det_explicit_altname": { "kms": "aws", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "aws_regex_rand_auto_id": { "kms": "aws", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_rand_auto_altname": { "kms": "aws", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_rand_explicit_id": { "kms": "aws", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_rand_explicit_altname": { "kms": "aws", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_det_auto_id": { "kms": "aws", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_det_explicit_id": { "kms": "aws", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_regex_det_explicit_altname": { "kms": "aws", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "aws_dbPointer_rand_auto_id": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_rand_auto_altname": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_rand_explicit_id": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_rand_explicit_altname": { "kms": "aws", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_det_auto_id": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_det_explicit_id": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_dbPointer_det_explicit_altname": { "kms": "aws", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "aws_javascript_rand_auto_id": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_rand_auto_altname": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_rand_explicit_id": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_rand_explicit_altname": { "kms": "aws", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_det_auto_id": { "kms": "aws", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_det_explicit_id": { "kms": "aws", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "aws_javascript_det_explicit_altname": { "kms": "aws", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "aws_symbol_rand_auto_id": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_rand_auto_altname": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_rand_explicit_id": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_rand_explicit_altname": { "kms": "aws", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_det_auto_id": { "kms": "aws", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_det_explicit_id": { "kms": "aws", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_symbol_det_explicit_altname": { "kms": "aws", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "aws_javascriptWithScope_rand_auto_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_rand_auto_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_rand_explicit_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_rand_explicit_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_det_explicit_id": { "kms": "aws", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "aws_javascriptWithScope_det_explicit_altname": { "kms": "aws", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "aws_int_rand_auto_id": { "kms": "aws", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_rand_auto_altname": { "kms": "aws", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_rand_explicit_id": { "kms": "aws", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_rand_explicit_altname": { "kms": "aws", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_det_auto_id": { "kms": "aws", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_det_explicit_id": { "kms": "aws", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "aws_int_det_explicit_altname": { "kms": "aws", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "aws_timestamp_rand_auto_id": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_rand_auto_altname": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_rand_explicit_id": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_rand_explicit_altname": { "kms": "aws", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_det_auto_id": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_det_explicit_id": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_timestamp_det_explicit_altname": { "kms": "aws", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "aws_long_rand_auto_id": { "kms": "aws", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_rand_auto_altname": { "kms": "aws", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_rand_explicit_id": { "kms": "aws", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_rand_explicit_altname": { "kms": "aws", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_det_auto_id": { "kms": "aws", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_det_explicit_id": { "kms": "aws", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "aws_long_det_explicit_altname": { "kms": "aws", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "aws_decimal_rand_auto_id": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_rand_auto_altname": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_rand_explicit_id": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_rand_explicit_altname": { "kms": "aws", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_det_explicit_id": { "kms": "aws", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "aws_decimal_det_explicit_altname": { "kms": "aws", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "aws_minKey_rand_explicit_id": { "kms": "aws", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_rand_explicit_altname": { "kms": "aws", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_det_explicit_id": { "kms": "aws", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "aws_minKey_det_explicit_altname": { "kms": "aws", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "aws_maxKey_rand_explicit_id": { "kms": "aws", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_rand_explicit_altname": { "kms": "aws", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_det_explicit_id": { "kms": "aws", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "aws_maxKey_det_explicit_altname": { "kms": "aws", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "local_double_rand_auto_id": { "kms": "local", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "local_double_rand_auto_altname": { "kms": "local", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "local_double_rand_explicit_id": { "kms": "local", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "local_double_rand_explicit_altname": { "kms": "local", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "local_double_det_explicit_id": { "kms": "local", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "local_double_det_explicit_altname": { "kms": "local", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "local_string_rand_auto_id": { "kms": "local", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "local_string_rand_auto_altname": { "kms": "local", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": "mongodb" }, "local_string_rand_explicit_id": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "local_string_rand_explicit_altname": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "local_string_det_auto_id": { "kms": "local", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "local_string_det_explicit_id": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "local_string_det_explicit_altname": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "local_object_rand_auto_id": { "kms": "local", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "local_object_rand_auto_altname": { "kms": "local", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "local_object_rand_explicit_id": { "kms": "local", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "local_object_rand_explicit_altname": { "kms": "local", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "local_object_det_explicit_id": { "kms": "local", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "local_object_det_explicit_altname": { "kms": "local", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "local_array_rand_auto_id": { "kms": "local", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_rand_auto_altname": { "kms": "local", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_rand_explicit_id": { "kms": "local", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_rand_explicit_altname": { "kms": "local", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_det_explicit_id": { "kms": "local", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_array_det_explicit_altname": { "kms": "local", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "local_binData=00_rand_auto_id": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_rand_auto_altname": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_rand_explicit_id": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_rand_explicit_altname": { "kms": "local", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_det_auto_id": { "kms": "local", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_det_explicit_id": { "kms": "local", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=00_det_explicit_altname": { "kms": "local", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "local_binData=04_rand_auto_id": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_rand_auto_altname": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_rand_explicit_id": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_rand_explicit_altname": { "kms": "local", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_det_auto_id": { "kms": "local", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_det_explicit_id": { "kms": "local", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_binData=04_det_explicit_altname": { "kms": "local", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "local_undefined_rand_explicit_id": { "kms": "local", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "local_undefined_rand_explicit_altname": { "kms": "local", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "local_undefined_det_explicit_id": { "kms": "local", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "local_undefined_det_explicit_altname": { "kms": "local", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "local_objectId_rand_auto_id": { "kms": "local", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_rand_auto_altname": { "kms": "local", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_rand_explicit_id": { "kms": "local", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_rand_explicit_altname": { "kms": "local", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_det_auto_id": { "kms": "local", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_det_explicit_id": { "kms": "local", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_objectId_det_explicit_altname": { "kms": "local", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "local_bool_rand_auto_id": { "kms": "local", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": true }, "local_bool_rand_auto_altname": { "kms": "local", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": true }, "local_bool_rand_explicit_id": { "kms": "local", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": true }, "local_bool_rand_explicit_altname": { "kms": "local", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": true }, "local_bool_det_explicit_id": { "kms": "local", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "local_bool_det_explicit_altname": { "kms": "local", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "local_date_rand_auto_id": { "kms": "local", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_rand_auto_altname": { "kms": "local", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_rand_explicit_id": { "kms": "local", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_rand_explicit_altname": { "kms": "local", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_det_auto_id": { "kms": "local", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_det_explicit_id": { "kms": "local", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_date_det_explicit_altname": { "kms": "local", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "local_null_rand_explicit_id": { "kms": "local", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "local_null_rand_explicit_altname": { "kms": "local", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "local_null_det_explicit_id": { "kms": "local", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "local_null_det_explicit_altname": { "kms": "local", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "local_regex_rand_auto_id": { "kms": "local", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_rand_auto_altname": { "kms": "local", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_rand_explicit_id": { "kms": "local", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_rand_explicit_altname": { "kms": "local", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_det_auto_id": { "kms": "local", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_det_explicit_id": { "kms": "local", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_regex_det_explicit_altname": { "kms": "local", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "local_dbPointer_rand_auto_id": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_rand_auto_altname": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_rand_explicit_id": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_rand_explicit_altname": { "kms": "local", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_det_auto_id": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_det_explicit_id": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_dbPointer_det_explicit_altname": { "kms": "local", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "local_javascript_rand_auto_id": { "kms": "local", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_rand_auto_altname": { "kms": "local", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_rand_explicit_id": { "kms": "local", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_rand_explicit_altname": { "kms": "local", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_det_auto_id": { "kms": "local", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_det_explicit_id": { "kms": "local", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "local_javascript_det_explicit_altname": { "kms": "local", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "local_symbol_rand_auto_id": { "kms": "local", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_rand_auto_altname": { "kms": "local", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_rand_explicit_id": { "kms": "local", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_rand_explicit_altname": { "kms": "local", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_det_auto_id": { "kms": "local", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_det_explicit_id": { "kms": "local", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_symbol_det_explicit_altname": { "kms": "local", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "local_javascriptWithScope_rand_auto_id": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_rand_auto_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_rand_explicit_id": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_rand_explicit_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_det_explicit_id": { "kms": "local", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "local_javascriptWithScope_det_explicit_altname": { "kms": "local", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "local_int_rand_auto_id": { "kms": "local", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_rand_auto_altname": { "kms": "local", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_rand_explicit_id": { "kms": "local", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_rand_explicit_altname": { "kms": "local", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_det_auto_id": { "kms": "local", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_det_explicit_id": { "kms": "local", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "local_int_det_explicit_altname": { "kms": "local", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "local_timestamp_rand_auto_id": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_rand_auto_altname": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_rand_explicit_id": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_rand_explicit_altname": { "kms": "local", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_det_auto_id": { "kms": "local", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_det_explicit_id": { "kms": "local", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_timestamp_det_explicit_altname": { "kms": "local", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "local_long_rand_auto_id": { "kms": "local", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_rand_auto_altname": { "kms": "local", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_rand_explicit_id": { "kms": "local", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_rand_explicit_altname": { "kms": "local", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_det_auto_id": { "kms": "local", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_det_explicit_id": { "kms": "local", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "local_long_det_explicit_altname": { "kms": "local", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "local_decimal_rand_auto_id": { "kms": "local", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "local_decimal_rand_auto_altname": { "kms": "local", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "local_decimal_rand_explicit_id": { "kms": "local", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "local_decimal_rand_explicit_altname": { "kms": "local", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "local_decimal_det_explicit_id": { "kms": "local", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "local_decimal_det_explicit_altname": { "kms": "local", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "local_minKey_rand_explicit_id": { "kms": "local", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_rand_explicit_altname": { "kms": "local", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_det_explicit_id": { "kms": "local", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "local_minKey_det_explicit_altname": { "kms": "local", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "local_maxKey_rand_explicit_id": { "kms": "local", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_rand_explicit_altname": { "kms": "local", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_det_explicit_id": { "kms": "local", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "local_maxKey_det_explicit_altname": { "kms": "local", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "azure_double_rand_auto_id": { "kms": "azure", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "azure_double_rand_auto_altname": { "kms": "azure", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "azure_double_rand_explicit_id": { "kms": "azure", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "azure_double_rand_explicit_altname": { "kms": "azure", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "azure_double_det_explicit_id": { "kms": "azure", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "azure_double_det_explicit_altname": { "kms": "azure", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "azure_string_rand_auto_id": { "kms": "azure", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "azure_string_rand_auto_altname": { "kms": "azure", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": "mongodb" }, "azure_string_rand_explicit_id": { "kms": "azure", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "azure_string_rand_explicit_altname": { "kms": "azure", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "azure_string_det_auto_id": { "kms": "azure", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "azure_string_det_explicit_id": { "kms": "azure", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "azure_string_det_explicit_altname": { "kms": "azure", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "azure_object_rand_auto_id": { "kms": "azure", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "azure_object_rand_auto_altname": { "kms": "azure", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "azure_object_rand_explicit_id": { "kms": "azure", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "azure_object_rand_explicit_altname": { "kms": "azure", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "azure_object_det_explicit_id": { "kms": "azure", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "azure_object_det_explicit_altname": { "kms": "azure", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "azure_array_rand_auto_id": { "kms": "azure", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_rand_auto_altname": { "kms": "azure", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_rand_explicit_id": { "kms": "azure", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_rand_explicit_altname": { "kms": "azure", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_det_explicit_id": { "kms": "azure", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_array_det_explicit_altname": { "kms": "azure", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "azure_binData=00_rand_auto_id": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_rand_auto_altname": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_rand_explicit_id": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_rand_explicit_altname": { "kms": "azure", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_det_auto_id": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_det_explicit_id": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=00_det_explicit_altname": { "kms": "azure", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "azure_binData=04_rand_auto_id": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_rand_auto_altname": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_rand_explicit_id": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_rand_explicit_altname": { "kms": "azure", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_det_auto_id": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_det_explicit_id": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_binData=04_det_explicit_altname": { "kms": "azure", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "azure_undefined_rand_explicit_id": { "kms": "azure", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_rand_explicit_altname": { "kms": "azure", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_det_explicit_id": { "kms": "azure", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "azure_undefined_det_explicit_altname": { "kms": "azure", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "azure_objectId_rand_auto_id": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_rand_auto_altname": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_rand_explicit_id": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_rand_explicit_altname": { "kms": "azure", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_det_auto_id": { "kms": "azure", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_det_explicit_id": { "kms": "azure", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_objectId_det_explicit_altname": { "kms": "azure", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "azure_bool_rand_auto_id": { "kms": "azure", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": true }, "azure_bool_rand_auto_altname": { "kms": "azure", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": true }, "azure_bool_rand_explicit_id": { "kms": "azure", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": true }, "azure_bool_rand_explicit_altname": { "kms": "azure", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": true }, "azure_bool_det_explicit_id": { "kms": "azure", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "azure_bool_det_explicit_altname": { "kms": "azure", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "azure_date_rand_auto_id": { "kms": "azure", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_rand_auto_altname": { "kms": "azure", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_rand_explicit_id": { "kms": "azure", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_rand_explicit_altname": { "kms": "azure", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_det_auto_id": { "kms": "azure", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_det_explicit_id": { "kms": "azure", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_date_det_explicit_altname": { "kms": "azure", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "azure_null_rand_explicit_id": { "kms": "azure", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "azure_null_rand_explicit_altname": { "kms": "azure", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "azure_null_det_explicit_id": { "kms": "azure", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "azure_null_det_explicit_altname": { "kms": "azure", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "azure_regex_rand_auto_id": { "kms": "azure", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_rand_auto_altname": { "kms": "azure", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_rand_explicit_id": { "kms": "azure", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_rand_explicit_altname": { "kms": "azure", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_det_auto_id": { "kms": "azure", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_det_explicit_id": { "kms": "azure", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_regex_det_explicit_altname": { "kms": "azure", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "azure_dbPointer_rand_auto_id": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_rand_auto_altname": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_rand_explicit_id": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_rand_explicit_altname": { "kms": "azure", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_det_auto_id": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_det_explicit_id": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_dbPointer_det_explicit_altname": { "kms": "azure", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "azure_javascript_rand_auto_id": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_rand_auto_altname": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_rand_explicit_id": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_rand_explicit_altname": { "kms": "azure", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_det_auto_id": { "kms": "azure", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_det_explicit_id": { "kms": "azure", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "azure_javascript_det_explicit_altname": { "kms": "azure", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "azure_symbol_rand_auto_id": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_rand_auto_altname": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_rand_explicit_id": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_rand_explicit_altname": { "kms": "azure", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_det_auto_id": { "kms": "azure", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_det_explicit_id": { "kms": "azure", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_symbol_det_explicit_altname": { "kms": "azure", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "azure_javascriptWithScope_rand_auto_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_rand_auto_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_rand_explicit_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_rand_explicit_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_det_explicit_id": { "kms": "azure", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "azure_javascriptWithScope_det_explicit_altname": { "kms": "azure", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "azure_int_rand_auto_id": { "kms": "azure", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_rand_auto_altname": { "kms": "azure", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_rand_explicit_id": { "kms": "azure", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_rand_explicit_altname": { "kms": "azure", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_det_auto_id": { "kms": "azure", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_det_explicit_id": { "kms": "azure", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "azure_int_det_explicit_altname": { "kms": "azure", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "azure_timestamp_rand_auto_id": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_rand_auto_altname": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_rand_explicit_id": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_rand_explicit_altname": { "kms": "azure", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_det_auto_id": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_det_explicit_id": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_timestamp_det_explicit_altname": { "kms": "azure", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "azure_long_rand_auto_id": { "kms": "azure", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_rand_auto_altname": { "kms": "azure", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_rand_explicit_id": { "kms": "azure", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_rand_explicit_altname": { "kms": "azure", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_det_auto_id": { "kms": "azure", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_det_explicit_id": { "kms": "azure", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "azure_long_det_explicit_altname": { "kms": "azure", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "azure_decimal_rand_auto_id": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_rand_auto_altname": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_rand_explicit_id": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_rand_explicit_altname": { "kms": "azure", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_det_explicit_id": { "kms": "azure", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "azure_decimal_det_explicit_altname": { "kms": "azure", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "azure_minKey_rand_explicit_id": { "kms": "azure", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_rand_explicit_altname": { "kms": "azure", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_det_explicit_id": { "kms": "azure", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "azure_minKey_det_explicit_altname": { "kms": "azure", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "azure_maxKey_rand_explicit_id": { "kms": "azure", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_rand_explicit_altname": { "kms": "azure", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_det_explicit_id": { "kms": "azure", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "azure_maxKey_det_explicit_altname": { "kms": "azure", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_double_rand_auto_id": { "kms": "gcp", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "gcp_double_rand_auto_altname": { "kms": "gcp", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "gcp_double_rand_explicit_id": { "kms": "gcp", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "gcp_double_rand_explicit_altname": { "kms": "gcp", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "gcp_double_det_explicit_id": { "kms": "gcp", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "gcp_double_det_explicit_altname": { "kms": "gcp", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "gcp_string_rand_auto_id": { "kms": "gcp", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "gcp_string_rand_auto_altname": { "kms": "gcp", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": "mongodb" }, "gcp_string_rand_explicit_id": { "kms": "gcp", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "gcp_string_rand_explicit_altname": { "kms": "gcp", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "gcp_string_det_auto_id": { "kms": "gcp", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "gcp_string_det_explicit_id": { "kms": "gcp", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "gcp_string_det_explicit_altname": { "kms": "gcp", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "gcp_object_rand_auto_id": { "kms": "gcp", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_rand_auto_altname": { "kms": "gcp", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_rand_explicit_id": { "kms": "gcp", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_rand_explicit_altname": { "kms": "gcp", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_det_explicit_id": { "kms": "gcp", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "gcp_object_det_explicit_altname": { "kms": "gcp", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "gcp_array_rand_auto_id": { "kms": "gcp", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_rand_auto_altname": { "kms": "gcp", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_rand_explicit_id": { "kms": "gcp", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_rand_explicit_altname": { "kms": "gcp", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_det_explicit_id": { "kms": "gcp", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_array_det_explicit_altname": { "kms": "gcp", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "gcp_binData=00_rand_auto_id": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_rand_auto_altname": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_rand_explicit_id": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_rand_explicit_altname": { "kms": "gcp", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_det_auto_id": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_det_explicit_id": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=00_det_explicit_altname": { "kms": "gcp", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "gcp_binData=04_rand_auto_id": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_rand_auto_altname": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_rand_explicit_id": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_rand_explicit_altname": { "kms": "gcp", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_det_auto_id": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_det_explicit_id": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_binData=04_det_explicit_altname": { "kms": "gcp", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "gcp_undefined_rand_explicit_id": { "kms": "gcp", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_rand_explicit_altname": { "kms": "gcp", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_det_explicit_id": { "kms": "gcp", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "gcp_undefined_det_explicit_altname": { "kms": "gcp", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "gcp_objectId_rand_auto_id": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_rand_auto_altname": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_rand_explicit_id": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_rand_explicit_altname": { "kms": "gcp", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_det_auto_id": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_det_explicit_id": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_objectId_det_explicit_altname": { "kms": "gcp", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "gcp_bool_rand_auto_id": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": true }, "gcp_bool_rand_auto_altname": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": true }, "gcp_bool_rand_explicit_id": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": true }, "gcp_bool_rand_explicit_altname": { "kms": "gcp", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": true }, "gcp_bool_det_explicit_id": { "kms": "gcp", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "gcp_bool_det_explicit_altname": { "kms": "gcp", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "gcp_date_rand_auto_id": { "kms": "gcp", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_rand_auto_altname": { "kms": "gcp", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_rand_explicit_id": { "kms": "gcp", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_rand_explicit_altname": { "kms": "gcp", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_det_auto_id": { "kms": "gcp", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_det_explicit_id": { "kms": "gcp", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_date_det_explicit_altname": { "kms": "gcp", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "gcp_null_rand_explicit_id": { "kms": "gcp", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "gcp_null_rand_explicit_altname": { "kms": "gcp", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "gcp_null_det_explicit_id": { "kms": "gcp", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "gcp_null_det_explicit_altname": { "kms": "gcp", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "gcp_regex_rand_auto_id": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_rand_auto_altname": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_rand_explicit_id": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_rand_explicit_altname": { "kms": "gcp", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_det_auto_id": { "kms": "gcp", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_det_explicit_id": { "kms": "gcp", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_regex_det_explicit_altname": { "kms": "gcp", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "gcp_dbPointer_rand_auto_id": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_rand_auto_altname": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_rand_explicit_id": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_rand_explicit_altname": { "kms": "gcp", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_det_auto_id": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_det_explicit_id": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_dbPointer_det_explicit_altname": { "kms": "gcp", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "gcp_javascript_rand_auto_id": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_rand_auto_altname": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_rand_explicit_id": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_rand_explicit_altname": { "kms": "gcp", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_det_auto_id": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_det_explicit_id": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "gcp_javascript_det_explicit_altname": { "kms": "gcp", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "gcp_symbol_rand_auto_id": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_rand_auto_altname": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_rand_explicit_id": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_rand_explicit_altname": { "kms": "gcp", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_det_auto_id": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_det_explicit_id": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_symbol_det_explicit_altname": { "kms": "gcp", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "gcp_javascriptWithScope_rand_auto_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_rand_auto_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_rand_explicit_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_rand_explicit_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_det_explicit_id": { "kms": "gcp", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "gcp_javascriptWithScope_det_explicit_altname": { "kms": "gcp", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "gcp_int_rand_auto_id": { "kms": "gcp", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_rand_auto_altname": { "kms": "gcp", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_rand_explicit_id": { "kms": "gcp", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_rand_explicit_altname": { "kms": "gcp", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_det_auto_id": { "kms": "gcp", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_det_explicit_id": { "kms": "gcp", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_int_det_explicit_altname": { "kms": "gcp", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "gcp_timestamp_rand_auto_id": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_rand_auto_altname": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_rand_explicit_id": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_rand_explicit_altname": { "kms": "gcp", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_det_auto_id": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_det_explicit_id": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_timestamp_det_explicit_altname": { "kms": "gcp", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "gcp_long_rand_auto_id": { "kms": "gcp", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_rand_auto_altname": { "kms": "gcp", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_rand_explicit_id": { "kms": "gcp", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_rand_explicit_altname": { "kms": "gcp", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_det_auto_id": { "kms": "gcp", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_det_explicit_id": { "kms": "gcp", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_long_det_explicit_altname": { "kms": "gcp", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "gcp_decimal_rand_auto_id": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_rand_auto_altname": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_rand_explicit_id": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_rand_explicit_altname": { "kms": "gcp", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_det_explicit_id": { "kms": "gcp", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "gcp_decimal_det_explicit_altname": { "kms": "gcp", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "gcp_minKey_rand_explicit_id": { "kms": "gcp", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_rand_explicit_altname": { "kms": "gcp", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_det_explicit_id": { "kms": "gcp", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "gcp_minKey_det_explicit_altname": { "kms": "gcp", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "gcp_maxKey_rand_explicit_id": { "kms": "gcp", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_rand_explicit_altname": { "kms": "gcp", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_det_explicit_id": { "kms": "gcp", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "gcp_maxKey_det_explicit_altname": { "kms": "gcp", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_double_rand_auto_id": { "kms": "kmip", "type": "double", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "kmip_double_rand_auto_altname": { "kms": "kmip", "type": "double", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "kmip_double_rand_explicit_id": { "kms": "kmip", "type": "double", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDouble": "1.234" } }, "kmip_double_rand_explicit_altname": { "kms": "kmip", "type": "double", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDouble": "1.234" } }, "kmip_double_det_explicit_id": { "kms": "kmip", "type": "double", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDouble": "1.234" } }, "kmip_double_det_explicit_altname": { "kms": "kmip", "type": "double", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDouble": "1.234" } }, "kmip_string_rand_auto_id": { "kms": "kmip", "type": "string", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "kmip_string_rand_auto_altname": { "kms": "kmip", "type": "string", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": "mongodb" }, "kmip_string_rand_explicit_id": { "kms": "kmip", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "kmip_string_rand_explicit_altname": { "kms": "kmip", "type": "string", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "kmip_string_det_auto_id": { "kms": "kmip", "type": "string", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": "mongodb" }, "kmip_string_det_explicit_id": { "kms": "kmip", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "mongodb" }, "kmip_string_det_explicit_altname": { "kms": "kmip", "type": "string", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": "mongodb" }, "kmip_object_rand_auto_id": { "kms": "kmip", "type": "object", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_rand_auto_altname": { "kms": "kmip", "type": "object", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_rand_explicit_id": { "kms": "kmip", "type": "object", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_rand_explicit_altname": { "kms": "kmip", "type": "object", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_det_explicit_id": { "kms": "kmip", "type": "object", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "kmip_object_det_explicit_altname": { "kms": "kmip", "type": "object", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "x": { "$numberInt": "1" } } }, "kmip_array_rand_auto_id": { "kms": "kmip", "type": "array", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_rand_auto_altname": { "kms": "kmip", "type": "array", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_rand_explicit_id": { "kms": "kmip", "type": "array", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_rand_explicit_altname": { "kms": "kmip", "type": "array", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_det_explicit_id": { "kms": "kmip", "type": "array", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_array_det_explicit_altname": { "kms": "kmip", "type": "array", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": [ { "$numberInt": "1" }, { "$numberInt": "2" }, { "$numberInt": "3" } ] }, "kmip_binData=00_rand_auto_id": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_rand_auto_altname": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_rand_explicit_id": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_rand_explicit_altname": { "kms": "kmip", "type": "binData=00", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_det_auto_id": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_det_explicit_id": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=00_det_explicit_altname": { "kms": "kmip", "type": "binData=00", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AQIDBA==", "subType": "00" } } }, "kmip_binData=04_rand_auto_id": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_rand_auto_altname": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_rand_explicit_id": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_rand_explicit_altname": { "kms": "kmip", "type": "binData=04", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_det_auto_id": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_det_explicit_id": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_binData=04_det_explicit_altname": { "kms": "kmip", "type": "binData=04", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$binary": { "base64": "AAECAwQFBgcICQoLDA0ODw==", "subType": "04" } } }, "kmip_undefined_rand_explicit_id": { "kms": "kmip", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_rand_explicit_altname": { "kms": "kmip", "type": "undefined", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_det_explicit_id": { "kms": "kmip", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$undefined": true } }, "kmip_undefined_det_explicit_altname": { "kms": "kmip", "type": "undefined", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$undefined": true } }, "kmip_objectId_rand_auto_id": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_rand_auto_altname": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_rand_explicit_id": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_rand_explicit_altname": { "kms": "kmip", "type": "objectId", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_det_auto_id": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_det_explicit_id": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_objectId_det_explicit_altname": { "kms": "kmip", "type": "objectId", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$oid": "01234567890abcdef0123456" } }, "kmip_bool_rand_auto_id": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": true }, "kmip_bool_rand_auto_altname": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": true }, "kmip_bool_rand_explicit_id": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": true }, "kmip_bool_rand_explicit_altname": { "kms": "kmip", "type": "bool", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": true }, "kmip_bool_det_explicit_id": { "kms": "kmip", "type": "bool", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": true }, "kmip_bool_det_explicit_altname": { "kms": "kmip", "type": "bool", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": true }, "kmip_date_rand_auto_id": { "kms": "kmip", "type": "date", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_rand_auto_altname": { "kms": "kmip", "type": "date", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_rand_explicit_id": { "kms": "kmip", "type": "date", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_rand_explicit_altname": { "kms": "kmip", "type": "date", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_det_auto_id": { "kms": "kmip", "type": "date", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_det_explicit_id": { "kms": "kmip", "type": "date", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_date_det_explicit_altname": { "kms": "kmip", "type": "date", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$date": { "$numberLong": "12345" } } }, "kmip_null_rand_explicit_id": { "kms": "kmip", "type": "null", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "kmip_null_rand_explicit_altname": { "kms": "kmip", "type": "null", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "kmip_null_det_explicit_id": { "kms": "kmip", "type": "null", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": null }, "kmip_null_det_explicit_altname": { "kms": "kmip", "type": "null", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": null }, "kmip_regex_rand_auto_id": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_rand_auto_altname": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_rand_explicit_id": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_rand_explicit_altname": { "kms": "kmip", "type": "regex", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_det_auto_id": { "kms": "kmip", "type": "regex", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_det_explicit_id": { "kms": "kmip", "type": "regex", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_regex_det_explicit_altname": { "kms": "kmip", "type": "regex", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$regularExpression": { "pattern": ".*", "options": "" } } }, "kmip_dbPointer_rand_auto_id": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_rand_auto_altname": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_rand_explicit_id": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_rand_explicit_altname": { "kms": "kmip", "type": "dbPointer", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_det_auto_id": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_det_explicit_id": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_dbPointer_det_explicit_altname": { "kms": "kmip", "type": "dbPointer", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$dbPointer": { "$ref": "db.example", "$id": { "$oid": "01234567890abcdef0123456" } } } }, "kmip_javascript_rand_auto_id": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_rand_auto_altname": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_rand_explicit_id": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_rand_explicit_altname": { "kms": "kmip", "type": "javascript", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_det_auto_id": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_det_explicit_id": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1" } }, "kmip_javascript_det_explicit_altname": { "kms": "kmip", "type": "javascript", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1" } }, "kmip_symbol_rand_auto_id": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_rand_auto_altname": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_rand_explicit_id": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_rand_explicit_altname": { "kms": "kmip", "type": "symbol", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_det_auto_id": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_det_explicit_id": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_symbol_det_explicit_altname": { "kms": "kmip", "type": "symbol", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$symbol": "mongodb-symbol" } }, "kmip_javascriptWithScope_rand_auto_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_rand_auto_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_rand_explicit_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_rand_explicit_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_det_explicit_id": { "kms": "kmip", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "kmip_javascriptWithScope_det_explicit_altname": { "kms": "kmip", "type": "javascriptWithScope", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$code": "x=1", "$scope": {} } }, "kmip_int_rand_auto_id": { "kms": "kmip", "type": "int", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_rand_auto_altname": { "kms": "kmip", "type": "int", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_rand_explicit_id": { "kms": "kmip", "type": "int", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_rand_explicit_altname": { "kms": "kmip", "type": "int", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_det_auto_id": { "kms": "kmip", "type": "int", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_det_explicit_id": { "kms": "kmip", "type": "int", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_int_det_explicit_altname": { "kms": "kmip", "type": "int", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberInt": "123" } }, "kmip_timestamp_rand_auto_id": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_rand_auto_altname": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_rand_explicit_id": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_rand_explicit_altname": { "kms": "kmip", "type": "timestamp", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_det_auto_id": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_det_explicit_id": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_timestamp_det_explicit_altname": { "kms": "kmip", "type": "timestamp", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$timestamp": { "t": 0, "i": 12345 } } }, "kmip_long_rand_auto_id": { "kms": "kmip", "type": "long", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_rand_auto_altname": { "kms": "kmip", "type": "long", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_rand_explicit_id": { "kms": "kmip", "type": "long", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_rand_explicit_altname": { "kms": "kmip", "type": "long", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_det_auto_id": { "kms": "kmip", "type": "long", "algo": "det", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_det_explicit_id": { "kms": "kmip", "type": "long", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_long_det_explicit_altname": { "kms": "kmip", "type": "long", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberLong": "456" } }, "kmip_decimal_rand_auto_id": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_rand_auto_altname": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "auto", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_rand_explicit_id": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_rand_explicit_altname": { "kms": "kmip", "type": "decimal", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": true, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_det_explicit_id": { "kms": "kmip", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "kmip_decimal_det_explicit_altname": { "kms": "kmip", "type": "decimal", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$numberDecimal": "1.234" } }, "kmip_minKey_rand_explicit_id": { "kms": "kmip", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_rand_explicit_altname": { "kms": "kmip", "type": "minKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_det_explicit_id": { "kms": "kmip", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$minKey": 1 } }, "kmip_minKey_det_explicit_altname": { "kms": "kmip", "type": "minKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$minKey": 1 } }, "kmip_maxKey_rand_explicit_id": { "kms": "kmip", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_rand_explicit_altname": { "kms": "kmip", "type": "maxKey", "algo": "rand", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_det_explicit_id": { "kms": "kmip", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "id", "allowed": false, "value": { "$maxKey": 1 } }, "kmip_maxKey_det_explicit_altname": { "kms": "kmip", "type": "maxKey", "algo": "det", "method": "explicit", "identifier": "altname", "allowed": false, "value": { "$maxKey": 1 } }, "payload=0,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "" }, "payload=1,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "a" }, "payload=2,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aa" }, "payload=3,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaa" }, "payload=4,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaa" }, "payload=5,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaa" }, "payload=6,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaa" }, "payload=7,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaa" }, "payload=8,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaa" }, "payload=9,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaa" }, "payload=10,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaa" }, "payload=11,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaa" }, "payload=12,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaa" }, "payload=13,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaa" }, "payload=14,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaa" }, "payload=15,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaaa" }, "payload=16,algo=rand": { "kms": "local", "type": "string", "algo": "rand", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaaaa" }, "payload=0,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "" }, "payload=1,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "a" }, "payload=2,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aa" }, "payload=3,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaa" }, "payload=4,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaa" }, "payload=5,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaa" }, "payload=6,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaa" }, "payload=7,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaa" }, "payload=8,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaa" }, "payload=9,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaa" }, "payload=10,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaa" }, "payload=11,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaa" }, "payload=12,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaa" }, "payload=13,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaa" }, "payload=14,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaa" }, "payload=15,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaaa" }, "payload=16,algo=det": { "kms": "local", "type": "string", "algo": "det", "method": "explicit", "identifier": "id", "allowed": true, "value": "aaaaaaaaaaaaaaaa" } }datakey-and-double-encryption-schemamap.json000066400000000000000000000004231511661753600366160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose{ "db.coll": { "bsonType": "object", "properties": { "encrypted_placeholder": { "encrypt": { "keyId": "/placeholder", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/000077500000000000000000000000001511661753600323205ustar00rootroot00000000000000encryptedFields-prefix-suffix.json000066400000000000000000000021321511661753600410530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "prefixPreview", "strMinQueryLength": { "$numberInt": "2" }, "strMaxQueryLength": { "$numberInt": "10" }, "caseSensitive": true, "diacriticSensitive": true }, { "queryType": "suffixPreview", "strMinQueryLength": { "$numberInt": "2" }, "strMaxQueryLength": { "$numberInt": "10" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } encryptedFields-substring.json000066400000000000000000000014731511661753600403030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "substringPreview", "strMaxLength": { "$numberInt": "10" }, "strMinQueryLength": { "$numberInt": "2" }, "strMaxQueryLength": { "$numberInt": "10" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } encryptedFields.json000066400000000000000000000010551511661753600362610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } key1-document.json000066400000000000000000000013741511661753600356260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } range-encryptedFields-Date.json000066400000000000000000000012161511661753600402250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } range-encryptedFields-DecimalNoPrecision.json000066400000000000000000000006451511661753600430640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "sparsity": { "$numberLong": "1" } } } ] } range-encryptedFields-DecimalPrecision.json000066400000000000000000000012371511661753600425650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } range-encryptedFields-DoubleNoPrecision.json000066400000000000000000000006431511661753600427360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "sparsity": { "$numberLong": "1" } } } ] } range-encryptedFields-DoublePrecision.json000066400000000000000000000012331511661753600424350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } range-encryptedFields-Int.json000066400000000000000000000011041511661753600400760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } range-encryptedFields-Long.json000066400000000000000000000011101511661753600402400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/explicit_encryption{ "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/external/000077500000000000000000000000001511661753600300475ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/external/external-key.json000066400000000000000000000014421511661753600333530ustar00rootroot00000000000000{ "status": { "$numberInt": "1" }, "_id": { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "local" }, "updateDate": { "$date": { "$numberLong": "1557827033449" } }, "keyMaterial": { "$binary": { "base64": "Ce9HSz/HKKGkIt4uyy+jDuKGA+rLC2cycykMo6vc8jXxqa1UVDYHWq1r+vZKbnnSRBfB981akzRKZCFpC05CTyFqDhXv6OnMjpG97OZEREGIsHEYiJkBW0jJJvfLLgeLsEpBzsro9FztGGXASxyxFRZFhXvHxyiLOKrdWfs7X1O/iK3pEoHMx6uSNSfUOgbebLfIqW7TO++iQS5g1xovXA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1557827033449" } }, "keyAltNames": [ "local" ] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/external/external-schema.json000066400000000000000000000007551511661753600340310ustar00rootroot00000000000000{ "properties": { "encrypted": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/limits-doc.json000066400000000000000000000031011511661753600311570ustar00rootroot00000000000000{ "00": "a", "01": "a", "02": "a", "03": "a", "04": "a", "05": "a", "06": "a", "07": "a", "08": "a", "09": "a", "10": "a", "11": "a", "12": "a", "13": "a", "14": "a", "15": "a", "16": "a", "17": "a", "18": "a", "19": "a", "20": "a", "21": "a", "22": "a", "23": "a", "24": "a", "25": "a", "26": "a", "27": "a", "28": "a", "29": "a", "30": "a", "31": "a", "32": "a", "33": "a", "34": "a", "35": "a", "36": "a", "37": "a", "38": "a", "39": "a", "40": "a", "41": "a", "42": "a", "43": "a", "44": "a", "45": "a", "46": "a", "47": "a", "48": "a", "49": "a", "50": "a", "51": "a", "52": "a", "53": "a", "54": "a", "55": "a", "56": "a", "57": "a", "58": "a", "59": "a", "60": "a", "61": "a", "62": "a", "63": "a", "64": "a", "65": "a", "66": "a", "67": "a", "68": "a", "69": "a", "70": "a", "71": "a", "72": "a", "73": "a", "74": "a", "75": "a", "76": "a", "77": "a", "78": "a", "79": "a", "80": "a", "81": "a", "82": "a", "83": "a", "84": "a", "85": "a", "86": "a", "87": "a", "88": "a", "89": "a", "90": "a", "91": "a", "92": "a", "93": "a", "94": "a", "95": "a", "96": "a", "97": "a", "98": "a", "99": "a" }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/limits-encryptedFields.json000066400000000000000000000004341511661753600335440ustar00rootroot00000000000000{ "fields": [ { "keyId": { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "path": "foo", "bsonType": "string" } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/limits-key.json000066400000000000000000000014421511661753600312100ustar00rootroot00000000000000{ "status": { "$numberInt": "1" }, "_id": { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "local" }, "updateDate": { "$date": { "$numberLong": "1557827033449" } }, "keyMaterial": { "$binary": { "base64": "Ce9HSz/HKKGkIt4uyy+jDuKGA+rLC2cycykMo6vc8jXxqa1UVDYHWq1r+vZKbnnSRBfB981akzRKZCFpC05CTyFqDhXv6OnMjpG97OZEREGIsHEYiJkBW0jJJvfLLgeLsEpBzsro9FztGGXASxyxFRZFhXvHxyiLOKrdWfs7X1O/iK3pEoHMx6uSNSfUOgbebLfIqW7TO++iQS5g1xovXA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1557827033449" } }, "keyAltNames": [ "local" ] }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/limits-qe-doc.json000066400000000000000000000001671511661753600315730ustar00rootroot00000000000000{ "foo": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/limits-schema.json000066400000000000000000001271561511661753600316730ustar00rootroot00000000000000{ "properties": { "00": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "01": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "02": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "03": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "04": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "05": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "06": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "07": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "08": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "09": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "10": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "11": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "12": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "13": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "14": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "15": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "16": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "17": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "18": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "19": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "20": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "21": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "22": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "23": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "24": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "25": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "26": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "27": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "28": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "29": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "30": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "31": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "32": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "33": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "34": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "35": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "36": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "37": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "38": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "39": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "40": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "41": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "42": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "43": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "44": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "45": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "46": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "47": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "48": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "49": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "50": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "51": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "52": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "53": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "54": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "55": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "56": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "57": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "58": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "59": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "60": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "61": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "62": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "63": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "64": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "65": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "66": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "67": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "68": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "69": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "70": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "71": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "72": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "73": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "74": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "75": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "76": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "77": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "78": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "79": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "80": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "81": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "82": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "83": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "84": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "85": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "86": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "87": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "88": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "89": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "90": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "91": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "92": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "93": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "94": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "95": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "96": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "97": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "98": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "99": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/000077500000000000000000000000001511661753600275365ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/key-doc.json000066400000000000000000000013741511661753600317710ustar00rootroot00000000000000{ "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/schema-csfle.json000066400000000000000000000007641511661753600327720ustar00rootroot00000000000000{ "properties": { "csfle": { "encrypt": { "keyId": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/schema-csfle2.json000066400000000000000000000007651511661753600330550ustar00rootroot00000000000000{ "properties": { "csfle2": { "encrypt": { "keyId": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/schema-non-csfle.json000066400000000000000000000000341511661753600335500ustar00rootroot00000000000000{ "bsonType": "object" } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/schema-qe.json000066400000000000000000000007351511661753600323010ustar00rootroot00000000000000{ "escCollection": "enxcol_.qe.esc", "ecocCollection": "enxcol_.qe.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "qe", "bsonType": "string", "queries": { "queryType": "equality", "contention": 0 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/lookup/schema-qe2.json000066400000000000000000000007401511661753600323570ustar00rootroot00000000000000{ "escCollection": "enxcol_.qe2.esc", "ecocCollection": "enxcol_.qe2.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "qe2", "bsonType": "string", "queries": { "queryType": "equality", "contention": 0 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/client_side_encryption_prose/schema.json000066400000000000000000000010011511661753600303500ustar00rootroot00000000000000{ "bsonType": "object", "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "LOCALAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } }mongo-c-driver-2.2.1/src/libmongoc/tests/cmake-import/000077500000000000000000000000001511661753600226515ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/cmake-import/CMakeLists.txt000066400000000000000000000022631511661753600254140ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) project(ImportTestProject) include(CTest) add_compile_definitions("EXPECT_BSON_VERSION=\"${EXPECT_BSON_VERSION}\"") add_compile_definitions("EXPECT_MONGOC_VERSION=\"${EXPECT_MONGOC_VERSION}\"") if(FIND_BSON) # Call find_package() twice to check that we can be imported twice find_package(bson ${FIND_BSON_ARGS}) find_package(bson ${FIND_BSON_ARGS}) endif() if(FIND_MONGOC) find_package(mongoc ${FIND_MONGOC_ARGS}) find_package(mongoc ${FIND_MONGOC_ARGS}) endif() if(bson_FOUND AND EXPECT_FIND_BSON_FAILS) message(FATAL_ERROR "We expected find_package(bson) to fail, but it succeeded [bson_DIR=${bson_DIR}]") endif() if(mongoc_FOUND AND EXPECT_FIND_MONGOC_FAILS) message(FATAL_ERROR "We expected find_package(mongoc) to fail, but it succeeded [mongoc_DIR=${mongoc_DIR}]") endif() if(EXPECT_BSON_VERSION) add_executable(use-bson use-bson.c) target_link_libraries(use-bson PRIVATE bson::bson) add_test(use-bson-test use-bson) endif() if(EXPECT_MONGOC_VERSION) add_executable(use-mongoc use-mongoc.c) target_link_libraries(use-mongoc PRIVATE mongoc::mongoc) add_test(use-mongoc-test use-mongoc) endif() mongo-c-driver-2.2.1/src/libmongoc/tests/cmake-import/use-bson.c000066400000000000000000000006441511661753600245540ustar00rootroot00000000000000#include #include #ifndef EXPECT_BSON_VERSION #error This file requires EXPECT_BSON_VERSION to be defined #define EXPECT_BSON_VERSION "" #endif int main(void) { if (strcmp(BSON_VERSION_S, EXPECT_BSON_VERSION)) { fprintf( stderr, "Wrong BSON_MAJOR_VERSION found (Expected “%sâ€, but got “%sâ€)", EXPECT_BSON_VERSION, BSON_VERSION_S); return 2; } return 0; } mongo-c-driver-2.2.1/src/libmongoc/tests/cmake-import/use-mongoc.c000066400000000000000000000007301511661753600250710ustar00rootroot00000000000000#include #include #ifndef EXPECT_MONGOC_VERSION #error This file requires EXPECT_MONGOC_VERSION to be defined #define EXPECT_MONGOC_VERSION "" #endif int main(void) { if (strcmp(MONGOC_VERSION_S, EXPECT_MONGOC_VERSION)) { fprintf(stderr, "Wrong MONGOC_MAJOR_VERSION found (Expected “%sâ€, but got “%sâ€)", EXPECT_MONGOC_VERSION, MONGOC_VERSION_S); return 2; } return 0; } mongo-c-driver-2.2.1/src/libmongoc/tests/debug-stream.c000066400000000000000000000117301511661753600230060ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #define MONGOC_STREAM_DEBUG 7 typedef struct _mongoc_stream_debug_t { mongoc_stream_t vtable; mongoc_stream_t *wrapped; debug_stream_stats_t *stats; } mongoc_stream_debug_t; static int _mongoc_stream_debug_close(mongoc_stream_t *stream) { return mongoc_stream_close(((mongoc_stream_debug_t *)stream)->wrapped); } static void _mongoc_stream_debug_destroy(mongoc_stream_t *stream) { mongoc_stream_debug_t *debug_stream = (mongoc_stream_debug_t *)stream; debug_stream->stats->n_destroyed++; mongoc_stream_destroy(debug_stream->wrapped); bson_free(debug_stream); } static void _mongoc_stream_debug_failed(mongoc_stream_t *stream) { mongoc_stream_debug_t *debug_stream = (mongoc_stream_debug_t *)stream; debug_stream->stats->n_failed++; mongoc_stream_failed(debug_stream->wrapped); bson_free(debug_stream); } static int _mongoc_stream_debug_setsockopt(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { return mongoc_stream_setsockopt(((mongoc_stream_debug_t *)stream)->wrapped, level, optname, optval, optlen); } static int _mongoc_stream_debug_flush(mongoc_stream_t *stream) { return mongoc_stream_flush(((mongoc_stream_debug_t *)stream)->wrapped); } static ssize_t _mongoc_stream_debug_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { return mongoc_stream_readv(((mongoc_stream_debug_t *)stream)->wrapped, iov, iovcnt, min_bytes, timeout_msec); } static ssize_t _mongoc_stream_debug_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { return mongoc_stream_writev(((mongoc_stream_debug_t *)stream)->wrapped, iov, iovcnt, timeout_msec); } static bool _mongoc_stream_debug_check_closed(mongoc_stream_t *stream) { return mongoc_stream_check_closed(((mongoc_stream_debug_t *)stream)->wrapped); } static bool _mongoc_stream_debug_timed_out(mongoc_stream_t *stream) { return mongoc_stream_timed_out(((mongoc_stream_debug_t *)stream)->wrapped); } static bool _mongoc_stream_debug_should_retry(mongoc_stream_t *stream) { return mongoc_stream_should_retry(((mongoc_stream_debug_t *)stream)->wrapped); } static mongoc_stream_t * _mongoc_stream_debug_get_base_stream(mongoc_stream_t *stream) { mongoc_stream_t *wrapped = ((mongoc_stream_debug_t *)stream)->wrapped; /* "wrapped" is typically a mongoc_stream_buffered_t, get the real * base stream */ if (wrapped->get_base_stream) { return wrapped->get_base_stream(wrapped); } return wrapped; } mongoc_stream_t * debug_stream_new(mongoc_stream_t *stream, debug_stream_stats_t *stats) { mongoc_stream_debug_t *debug_stream; if (!stream) { return NULL; } debug_stream = (mongoc_stream_debug_t *)bson_malloc0(sizeof *debug_stream); debug_stream->vtable.type = MONGOC_STREAM_DEBUG; debug_stream->vtable.close = _mongoc_stream_debug_close; debug_stream->vtable.destroy = _mongoc_stream_debug_destroy; debug_stream->vtable.failed = _mongoc_stream_debug_failed; debug_stream->vtable.flush = _mongoc_stream_debug_flush; debug_stream->vtable.readv = _mongoc_stream_debug_readv; debug_stream->vtable.writev = _mongoc_stream_debug_writev; debug_stream->vtable.setsockopt = _mongoc_stream_debug_setsockopt; debug_stream->vtable.check_closed = _mongoc_stream_debug_check_closed; debug_stream->vtable.timed_out = _mongoc_stream_debug_timed_out; debug_stream->vtable.should_retry = _mongoc_stream_debug_should_retry; debug_stream->vtable.get_base_stream = _mongoc_stream_debug_get_base_stream; debug_stream->wrapped = stream; debug_stream->stats = stats; return (mongoc_stream_t *)debug_stream; } mongoc_stream_t * debug_stream_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { debug_stream_stats_t *stats; mongoc_stream_t *default_stream; stats = (debug_stream_stats_t *)user_data; default_stream = mongoc_client_default_stream_initiator(uri, host, stats->client, error); return debug_stream_new(default_stream, stats); } void test_framework_set_debug_stream(mongoc_client_t *client, debug_stream_stats_t *stats) { BSON_ASSERT_PARAM(client); stats->client = client; mongoc_client_set_stream_initiator(client, debug_stream_initiator, stats); } mongo-c-driver-2.2.1/src/libmongoc/tests/import-tests.cmake000066400000000000000000000106611511661753600237410ustar00rootroot00000000000000include(TestProject) math(EXPR next_major_version "${PROJECT_VERSION_MAJOR}+1") # A bare find_package will succeed add_test_cmake_project( mongoc/CMake/bare-bson-import src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/CMake/bare-mongoc-import src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_MONGOC=1 "FIND_MONGOC_ARGS=REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" "EXPECT_MONGOC_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/CMake/bson-import-${PROJECT_VERSION_MAJOR}.0 src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${PROJECT_VERSION_MAJOR}.0;REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) # Try to import a too-new minor version that will never exist add_test_cmake_project( mongoc/CMake/bson-import-too-new-fails src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${PROJECT_VERSION_MAJOR}.9999.0" EXPECT_FIND_BSON_FAILS=TRUE ) # Try to import the next major version, which is not installed in this test case add_test_cmake_project( mongoc/CMake/bson-import-${next_major_version}.0-fails src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${next_major_version}.0" EXPECT_FIND_BSON_FAILS=TRUE ) # Try to import a range of versions add_test_cmake_project( mongoc/CMake/bson-import-range-upper src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=1.0...${PROJECT_VERSION};REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/CMake/bson-import-range-lower src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${PROJECT_VERSION}...${PROJECT_VERSION_MAJOR}.9999.0;REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/CMake/bson-import-range-exclusive src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=1.0...<${PROJECT_VERSION}" EXPECT_FIND_BSON_FAILS=TRUE ) add_test_cmake_project( mongoc/CMake/bson-import-major-range src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${PROJECT_VERSION_MAJOR}.0...${next_major_version}.0;REQUIRED" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/CMake/bson-import-major-range-too-new src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=${next_major_version}.0...<${next_major_version}.9999" EXPECT_FIND_BSON_FAILS=TRUE ) add_test_cmake_project( mongoc/CMake/bson-import-bad-components src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=COMPONENTS;foo" EXPECT_FIND_BSON_FAILS=TRUE ) add_test_cmake_project( mongoc/CMake/bson-import-opt-components src/libmongoc/tests/cmake-import INSTALL_PARENT SETTINGS FIND_BSON=1 "FIND_BSON_ARGS=REQUIRED;OPTIONAL_COMPONENTS;foo" "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/pkg-config/bson-import-shared src/libmongoc/tests/pkg-config-import INSTALL_PARENT SETTINGS PKG_CONFIG_SEARCH=bson${PROJECT_VERSION_MAJOR} "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/pkg-config/bson-import-static src/libmongoc/tests/pkg-config-import INSTALL_PARENT SETTINGS PKG_CONFIG_SEARCH=bson${PROJECT_VERSION_MAJOR}-static "EXPECT_BSON_VERSION=${mongo-c-driver_VERSION_FULL}" EXPECT_BSON_STATIC=1 ) add_test_cmake_project( mongoc/pkg-config/mongoc-import-shared src/libmongoc/tests/pkg-config-import INSTALL_PARENT SETTINGS PKG_CONFIG_SEARCH=mongoc${PROJECT_VERSION_MAJOR} "EXPECT_MONGOC_VERSION=${mongo-c-driver_VERSION_FULL}" ) add_test_cmake_project( mongoc/pkg-config/mongoc-import-static src/libmongoc/tests/pkg-config-import INSTALL_PARENT SETTINGS PKG_CONFIG_SEARCH=mongoc${PROJECT_VERSION_MAJOR}-static "EXPECT_MONGOC_VERSION=${mongo-c-driver_VERSION_FULL}" EXPECT_BSON_STATIC=1 EXPECT_MONGOC_STATIC=1 ) mongo-c-driver-2.2.1/src/libmongoc/tests/json-test-monitoring.c000066400000000000000000000555421511661753600245510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _MSC_VER #include #else #include #endif #ifdef BSON_HAVE_STRINGS_H #include #endif static bool ends_with(const char *s, const char *suffix) { size_t s_len; size_t suffix_len; if (!s) { return false; } s_len = strlen(s); suffix_len = strlen(suffix); return s_len >= suffix_len && !strcmp(s + s_len - suffix_len, suffix); } /* test that an event's "host" field is set to a reasonable value */ static void assert_host_in_uri(const mongoc_host_list_t *host, const mongoc_uri_t *uri) { const mongoc_host_list_t *hosts; hosts = mongoc_uri_get_hosts(uri); while (hosts) { if (_mongoc_host_list_compare_one(hosts, host)) { return; } hosts = hosts->next; } test_error("Host \"%s\" not in \"%s\"", host->host_and_port, mongoc_uri_get_string(uri)); } static void started_cb(const mongoc_apm_command_started_t *event) { json_test_ctx_t *ctx = (json_test_ctx_t *)mongoc_apm_command_started_get_context(event); bson_t *events = &ctx->events; char str[16]; const char *key; bson_t *new_event; if (ctx->verbose) { char *cmd_json; cmd_json = bson_as_canonical_extended_json(event->command, NULL); printf("%s\n", cmd_json); fflush(stdout); bson_free(cmd_json); } bson_mutex_lock(&ctx->mutex); /* Track the last two lsid's */ if (bson_has_field(event->command, "lsid")) { bson_t lsid; /* Push on the circular queue */ bson_destroy(ctx->sent_lsids[0]); ctx->sent_lsids[0] = ctx->sent_lsids[1]; bson_lookup_doc(event->command, "lsid", &lsid); ctx->sent_lsids[1] = bson_copy(&lsid); bson_destroy(&lsid); } BSON_ASSERT(mongoc_apm_command_started_get_request_id(event) > 0); BSON_ASSERT(mongoc_apm_command_started_get_server_id(event) > 0); /* check that event->host is sane */ assert_host_in_uri(event->host, ctx->test_framework_uri); new_event = BCON_NEW("command_started_event", "{", "command", BCON_DOCUMENT(event->command), "command_name", BCON_UTF8(event->command_name), "database_name", BCON_UTF8(event->database_name), "operation_id", BCON_INT64(event->operation_id), "}"); bson_uint32_to_string(ctx->n_events, &key, str, sizeof str); BSON_APPEND_DOCUMENT(events, key, new_event); ctx->n_events++; bson_destroy(new_event); bson_mutex_unlock(&ctx->mutex); } static void succeeded_cb(const mongoc_apm_command_succeeded_t *event) { json_test_ctx_t *ctx = (json_test_ctx_t *)mongoc_apm_command_succeeded_get_context(event); char str[16]; const char *key; bson_t *new_event; if (ctx->verbose) { char *reply_json; reply_json = bson_as_canonical_extended_json(event->reply, NULL); MONGOC_DEBUG("<-- COMMAND SUCCEEDED: %s\n", reply_json); bson_free(reply_json); } if (ctx->config->command_started_events_only) { return; } BSON_ASSERT(mongoc_apm_command_succeeded_get_request_id(event) > 0); BSON_ASSERT(mongoc_apm_command_succeeded_get_server_id(event) > 0); assert_host_in_uri(event->host, ctx->test_framework_uri); new_event = BCON_NEW("command_succeeded_event", "{", "reply", BCON_DOCUMENT(event->reply), "command_name", BCON_UTF8(event->command_name), "operation_id", BCON_INT64(event->operation_id), "}"); bson_mutex_lock(&ctx->mutex); bson_uint32_to_string(ctx->n_events, &key, str, sizeof str); BSON_APPEND_DOCUMENT(&ctx->events, key, new_event); ctx->n_events++; bson_destroy(new_event); bson_mutex_unlock(&ctx->mutex); } static void failed_cb(const mongoc_apm_command_failed_t *event) { json_test_ctx_t *ctx = (json_test_ctx_t *)mongoc_apm_command_failed_get_context(event); char str[16]; const char *key; bson_t *new_event; if (ctx->verbose) { char *reply_json; reply_json = bson_as_canonical_extended_json(event->reply, NULL); MONGOC_DEBUG("<-- %s COMMAND FAILED: %s\nREPLY: %s\n", event->command_name, event->error->message, reply_json); bson_free(reply_json); } if (ctx->config->command_started_events_only) { return; } BSON_ASSERT(mongoc_apm_command_failed_get_request_id(event) > 0); BSON_ASSERT(mongoc_apm_command_failed_get_server_id(event) > 0); assert_host_in_uri(event->host, ctx->test_framework_uri); new_event = BCON_NEW("command_failed_event", "{", "command_name", BCON_UTF8(event->command_name), "operation_id", BCON_INT64(event->operation_id), "}"); bson_mutex_lock(&ctx->mutex); bson_uint32_to_string(ctx->n_events, &key, str, sizeof str); BSON_APPEND_DOCUMENT(&ctx->events, key, new_event); ctx->n_events++; bson_destroy(new_event); bson_mutex_unlock(&ctx->mutex); } static void server_changed_cb(const mongoc_apm_server_changed_t *event) { json_test_ctx_t *ctx; const mongoc_server_description_t *sd; const mongoc_server_description_t *prev_sd; ctx = mongoc_apm_server_changed_get_context(event); sd = mongoc_apm_server_changed_get_new_description(event); prev_sd = mongoc_apm_server_changed_get_previous_description(event); if (ctx->verbose) { MONGOC_DEBUG("SERVER CHANGED: (%s) %s --> %s\n", sd->host.host_and_port, mongoc_server_description_type(prev_sd), mongoc_server_description_type(sd)); } bson_mutex_lock(&ctx->mutex); if (sd->type == MONGOC_SERVER_UNKNOWN) { ctx->total_ServerMarkedUnknownEvent++; } if (sd->type == MONGOC_SERVER_RS_PRIMARY && !_mongoc_host_list_compare_one(&sd->host, &ctx->primary_host)) { ctx->total_PrimaryChangedEvent++; memcpy(&ctx->primary_host, &sd->host, sizeof(mongoc_host_list_t)); } bson_mutex_unlock(&ctx->mutex); } void set_apm_callbacks(json_test_ctx_t *ctx, mongoc_client_t *client) { mongoc_apm_callbacks_t *callbacks; BSON_UNUSED(client); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, started_cb); /* Even if test only checks command started events (i.e. * command_started_events_only is set on test config), set callbacks for the * benefit of logging. */ mongoc_apm_set_command_succeeded_cb(callbacks, succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, failed_cb); mongoc_client_set_apm_callbacks(ctx->client, callbacks, ctx); mongoc_apm_callbacks_destroy(callbacks); } void set_apm_callbacks_pooled(json_test_ctx_t *ctx, mongoc_client_pool_t *pool) { mongoc_apm_callbacks_t *callbacks; ASSERT(pool); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, started_cb); mongoc_apm_set_server_changed_cb(callbacks, server_changed_cb); mongoc_apm_set_command_succeeded_cb(callbacks, succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, failed_cb); mongoc_client_pool_set_apm_callbacks(pool, callbacks, ctx); mongoc_apm_callbacks_destroy(callbacks); } static bool lsids_match(const bson_t *a, const bson_t *b) { return match_bson(a, b, false); } typedef struct { char *command_name; int64_t cursor_id; bson_t lsids[2]; } apm_match_visitor_ctx_t; void apm_match_visitor_ctx_reset(apm_match_visitor_ctx_t *ctx) { bson_free(ctx->command_name); ctx->command_name = NULL; } static match_action_t apm_match_visitor(match_ctx_t *ctx, bson_iter_t *pattern_iter, bson_iter_t *doc_iter) { const char *key = bson_iter_key(pattern_iter); apm_match_visitor_ctx_t *visitor_ctx = (apm_match_visitor_ctx_t *)ctx->visitor_ctx; #define SHOULD_EXIST \ do { \ if (!doc_iter) { \ match_err(ctx, "expected %s", key); \ return MATCH_ACTION_ABORT; \ } \ } while (0) #define IS_COMMAND(cmd) (ends_with(ctx->path, "command") && !strcmp(key, cmd)) if (ends_with(ctx->path, "command") && !visitor_ctx->command_name && doc_iter) { visitor_ctx->command_name = bson_strdup(bson_iter_key(doc_iter)); } // Subdocuments in `command` should not have extra fields. if (NULL != strstr(ctx->path, ".command") && doc_iter) { if (BSON_ITER_HOLDS_DOCUMENT(doc_iter) && BSON_ITER_HOLDS_DOCUMENT(pattern_iter)) { bson_t doc_subdoc; bson_iter_bson(doc_iter, &doc_subdoc); bson_iter_t doc_subdoc_iter; bson_iter_init(&doc_subdoc_iter, &doc_subdoc); while (bson_iter_next(&doc_subdoc_iter)) { const char *subdoc_key = bson_iter_key(&doc_subdoc_iter); bson_t pattern_subdoc; bson_iter_bson(pattern_iter, &pattern_subdoc); bson_iter_t pattern_subdoc_iter; bool skip = false; if (ends_with(ctx->path, "updates") && (0 == strcmp("multi", subdoc_key) || 0 == strcmp("upsert", subdoc_key))) { // libmongoc includes `multi: false` and `upsert: false`. // Some tests do not include `multi: false` and `upsert: false` // in expectations. See DRIVERS-2271 and DRIVERS-976. skip = true; } if (!skip && !bson_iter_init_find(&pattern_subdoc_iter, &pattern_subdoc, subdoc_key)) { match_err(ctx, "unexpected extra field '%s' in captured event " "command subdocument of field '%s'. pattern_subdoc=%s", subdoc_key, key, tmp_json(&pattern_subdoc)); return MATCH_ACTION_ABORT; } } } } if (IS_COMMAND("find") || IS_COMMAND("aggregate")) { /* New query. Next server reply or getMore will set cursor_id. */ visitor_ctx->cursor_id = 0; } else if (!strcmp(key, "id") && ends_with(ctx->path, "cursor")) { visitor_ctx->cursor_id = bson_iter_as_int64(doc_iter); } else if (!strcmp(key, "errmsg")) { /* "errmsg values of "" MUST assert that the value is not empty" */ const char *errmsg = bson_iter_utf8(pattern_iter, NULL); if (strcmp(errmsg, "") == 0) { if (!doc_iter || bson_iter_type(doc_iter) != BSON_TYPE_UTF8 || strlen(bson_iter_utf8(doc_iter, NULL)) == 0) { match_err(ctx, "expected non-empty 'errmsg'"); return MATCH_ACTION_ABORT; } return MATCH_ACTION_SKIP; } } else if (IS_COMMAND("getMore")) { /* "When encountering a cursor or getMore value of "42" in a test, the * driver MUST assert that the values are equal to each other and * greater than zero." */ SHOULD_EXIST; if (visitor_ctx->cursor_id == 0) { /* A cursor id may not have been set in the visitor context if the spec * test only checked command started events. Set the cursor_id now, so * it can at least verify subsequent getMores use with the same id. */ visitor_ctx->cursor_id = bson_iter_as_int64(doc_iter); } else if (visitor_ctx->cursor_id != bson_iter_as_int64(doc_iter)) { match_err(ctx, "cursor requested in getMore (%" PRId64 ") does not match previously seen (%" PRId64 ")", bson_iter_as_int64(doc_iter), visitor_ctx->cursor_id); return MATCH_ACTION_ABORT; } } else if (!strcmp(key, "lsid")) { const char *session_name = bson_iter_utf8(pattern_iter, NULL); bson_t lsid; bool fail = false; SHOULD_EXIST; bson_iter_bson(doc_iter, &lsid); /* Transactions tests: "Each command-started event in "expectations" * includes an lsid with the value "session0" or "session1". Tests MUST * assert that the command's actual lsid matches the id of the correct * ClientSession named session0 or session1." */ if (!strcmp(session_name, "session0") && !lsids_match(&visitor_ctx->lsids[0], &lsid)) { fail = true; } if (!strcmp(session_name, "session1") && !lsids_match(&visitor_ctx->lsids[1], &lsid)) { fail = true; } if (fail) { char *str = bson_as_relaxed_extended_json(&lsid, NULL); match_err(ctx, "expected %s, but used session: %s", session_name, str); bson_free(str); return MATCH_ACTION_ABORT; } else { return MATCH_ACTION_SKIP; } } else if (strstr(ctx->path, "updates.")) { /* tests expect "multi: false" and "upsert: false" explicitly; * we don't send them. fix when path is like "updates.0", "updates.1", ... */ if (!strcmp(key, "multi") && !bson_iter_bool(pattern_iter)) { return MATCH_ACTION_SKIP; } if (!strcmp(key, "upsert") && !bson_iter_bool(pattern_iter)) { return MATCH_ACTION_SKIP; } } else if (visitor_ctx->command_name && !strcmp(visitor_ctx->command_name, "findAndModify") && !strcmp(key, "new")) { /* transaction tests expect "new: false" explicitly; we don't send it */ return MATCH_ACTION_SKIP; } return MATCH_ACTION_CONTINUE; } static void _apm_match_error_context(const bson_t *actual, const bson_t *expectations) { char *actual_str; char *expectations_str; actual_str = bson_as_canonical_extended_json(actual, NULL); expectations_str = bson_as_canonical_extended_json(expectations, NULL); fprintf(stderr, "Error in APM matching\nFull list of captured events: %s\nFull " "list of expectations: %s", actual_str, expectations_str); bson_free(actual_str); bson_free(expectations_str); } bool skip_cse_list_collections(const bson_t *doc) { /* see CDRIVER-3856: Sharing a MongoClient for metadata lookup can lead to * deadlock in drivers using automatic encryption. Since the C driver does * not use a separate 'mongoc_client_t' for listCollections and finds on the * key vault, we skip these checks. */ const char *val; if (!bson_has_field(doc, "command_started_event.command.listCollections")) return false; if (!bson_has_field(doc, "command_started_event.command.$db")) return false; val = bson_lookup_utf8(doc, "command_started_event.command.$db"); if (0 != strcmp(val, "keyvault")) return false; return true; } /* *----------------------------------------------------------------------- * * check_json_apm_events -- * * Compare actual APM events with expected sequence. The two docs * are each like: * * [ * { * "command_started_event": { * "command": { ... }, * "command_name": "count", * "database_name": "command-monitoring-tests", * "operation_id": 123 * } * }, * { * "command_failed_event": { * "command_name": "count", * "operation_id": 123 * } * } * ] * * If @allow_subset is true, then expectations is allowed to be * a subset of events. * *----------------------------------------------------------------------- */ void check_json_apm_events(json_test_ctx_t *ctx, const bson_t *expectations) { bson_iter_t expectations_iter, actual_iter; bool allow_subset; match_ctx_t match_ctx = {{0}}; apm_match_visitor_ctx_t apm_match_visitor_ctx = {0}; int i; for (i = 0; i < 2; i++) { bson_copy_to(&ctx->lsids[i], &apm_match_visitor_ctx.lsids[i]); } /* Old mongod returns a double for "count", newer returns int32. * Ignore this and other insignificant type differences. */ match_ctx.strict_numeric_types = false; match_ctx.retain_dots_in_keys = true; match_ctx.allow_placeholders = true; match_ctx.visitor_fn = apm_match_visitor; match_ctx.visitor_ctx = &apm_match_visitor_ctx; allow_subset = ctx->config->command_monitoring_allow_subset; BSON_ASSERT(bson_iter_init(&expectations_iter, expectations)); BSON_ASSERT(bson_iter_init(&actual_iter, &ctx->events)); /* Compare the captured actual events against the expectations. */ while (bson_iter_next(&expectations_iter)) { bson_t expectation, actual; bool matched = false; bson_iter_bson(&expectations_iter, &expectation); /* match against the current actual event, and possibly skip actual events * if we allow subset matching. */ while (bson_iter_next(&actual_iter)) { bson_iter_bson(&actual_iter, &actual); matched = match_bson_with_ctx(&actual, &expectation, &match_ctx); apm_match_visitor_ctx_reset(&apm_match_visitor_ctx); bson_destroy(&actual); if (matched) { break; } if (allow_subset) { /* if we allow matching only a subset of actual events, skip * non-matching ones */ continue; } if (skip_cse_list_collections(&actual)) { continue; } _apm_match_error_context(&ctx->events, expectations); test_error("could not match APM event\n" "\texpected: %s\n\n" "\tactual : %s\n\n" "\terror : %s\n\n", bson_as_canonical_extended_json(&expectation, NULL), bson_as_canonical_extended_json(&actual, NULL), match_ctx.errmsg); } if (!matched) { _apm_match_error_context(&ctx->events, expectations); test_error("expectation unmatched\n" "\texpected: %s\n\n", bson_as_canonical_extended_json(&expectation, NULL)); } bson_destroy(&expectation); } /* If we do not allow matching against a subset of actual events, check if * there are extra "actual" events */ if (!allow_subset) { bson_t extra; while (bson_iter_next(&actual_iter)) { bson_iter_bson(&actual_iter, &extra); if (!skip_cse_list_collections(&extra)) { _apm_match_error_context(&ctx->events, expectations); test_error("extra actual event was not found in expectations: %s\n", bson_as_canonical_extended_json(&extra, NULL)); } } } for (i = 0; i < 2; i++) { bson_destroy(&apm_match_visitor_ctx.lsids[i]); } } /* Test that apm_match_visitor verifies the cursor id requested in a getMore * is the same cursor id returned in a find reply. */ void test_apm_matching(void) { apm_match_visitor_ctx_t match_visitor_ctx = {0}; match_ctx_t match_ctx = {{0}}; const char *e1 = "{" " 'command_succeeded_event': {" " 'command_name': 'find'," " 'reply': {'cursor': { 'id': 123 }}" " }" "}"; const char *e2 = "{" " 'command_started_event': {" " 'command_name': 'getMore'," " 'command': {'getMore': 124}" " }" "}"; match_ctx.visitor_fn = apm_match_visitor; match_ctx.visitor_ctx = &match_visitor_ctx; BSON_ASSERT(match_bson_with_ctx(tmp_bson(e1), tmp_bson(e1), &match_ctx)); BSON_ASSERT(!match_bson_with_ctx(tmp_bson(e2), tmp_bson(e2), &match_ctx)); ASSERT_CONTAINS(match_ctx.errmsg, "cursor requested in getMore"); apm_match_visitor_ctx_reset(&match_visitor_ctx); } // Test that documents in command_started_event.command do not permit extra // fields by default. static void test_apm_matching_extra_fields(void) { // Extra fields are permitted in `command`. { apm_match_visitor_ctx_t match_visitor_ctx = {0}; match_ctx_t match_ctx = {{0}}; const char *event = BSON_STR({"command_started_event" : {"command" : {"a" : 1, "b" : 2}}}); const char *pattern = BSON_STR({"command_started_event" : {"command" : {"a" : 1}}}); match_ctx.visitor_fn = apm_match_visitor; match_ctx.visitor_ctx = &match_visitor_ctx; bool matched = match_bson_with_ctx(tmp_bson(event), tmp_bson(pattern), &match_ctx); ASSERT(matched); apm_match_visitor_ctx_reset(&match_visitor_ctx); } // Extra fields are not permitted in `command` sub-documents. { apm_match_visitor_ctx_t match_visitor_ctx = {0}; match_ctx_t match_ctx = {{0}}; const char *event = BSON_STR({"command_started_event" : {"command" : {"subdoc" : {"a" : 1, "b" : 2}}}}); const char *pattern = BSON_STR({"command_started_event" : {"command" : {"subdoc" : {"a" : 1}}}}); match_ctx.visitor_fn = apm_match_visitor; match_ctx.visitor_ctx = &match_visitor_ctx; bool matched = match_bson_with_ctx(tmp_bson(event), tmp_bson(pattern), &match_ctx); ASSERT(!matched); ASSERT_CONTAINS(match_ctx.errmsg, "unexpected extra field 'b'"); apm_match_visitor_ctx_reset(&match_visitor_ctx); } // Extra fields are not permitted in `command` sub-arrays. { apm_match_visitor_ctx_t match_visitor_ctx = {0}; match_ctx_t match_ctx = {{0}}; const char *event = BSON_STR({"command_started_event" : {"command" : {"subarray" : [ {"a" : 1, "b" : 2} ]}}}); const char *pattern = BSON_STR({"command_started_event" : {"command" : {"subarray" : [ {"a" : 1} ]}}}); match_ctx.visitor_fn = apm_match_visitor; match_ctx.visitor_ctx = &match_visitor_ctx; bool matched = match_bson_with_ctx(tmp_bson(event), tmp_bson(pattern), &match_ctx); ASSERT(!matched); ASSERT_CONTAINS(match_ctx.errmsg, "unexpected extra field 'b'"); apm_match_visitor_ctx_reset(&match_visitor_ctx); } } void test_apm_install(TestSuite *suite) { TestSuite_Add(suite, "/apm_test_matching", test_apm_matching); TestSuite_Add(suite, "/apm_test_matching/extra_fields", test_apm_matching_extra_fields); } mongo-c-driver-2.2.1/src/libmongoc/tests/json-test-monitoring.h000066400000000000000000000021341511661753600245430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef JSON_TEST_MONITORING_H #define JSON_TEST_MONITORING_H #include #include #include #include #include typedef void (*json_test_events_check_cb_t)(const bson_t *events); void set_apm_callbacks(json_test_ctx_t *ctx, mongoc_client_t *client); void set_apm_callbacks_pooled(json_test_ctx_t *ctx, mongoc_client_pool_t *pool); void check_json_apm_events(json_test_ctx_t *ctx, const bson_t *expectations); #endif mongo-c-driver-2.2.1/src/libmongoc/tests/json-test-operations.c000066400000000000000000002352311511661753600245420ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include mongoc_client_session_t * session_from_name(json_test_ctx_t *ctx, const char *session_name) { BSON_ASSERT(session_name); if (!strcmp(session_name, "session0")) { return ctx->sessions[0]; } else if (!strcmp(session_name, "session1")) { return ctx->sessions[1]; } else { test_error("Unrecognized session name: %s", session_name); } } static json_test_worker_thread_t * thread_from_name(json_test_ctx_t *ctx, const char *thread_name) { json_test_worker_thread_t *wt = NULL; BSON_ASSERT(thread_name); if (!strcmp(thread_name, "thread1")) { wt = ctx->worker_threads[0]; } else if (!strcmp(thread_name, "thread2")) { wt = ctx->worker_threads[1]; } else { test_error("Unrecognized thread name: %s", thread_name); } if (!wt) { test_error("Test runner did not create worker threads"); } return wt; } json_test_worker_thread_t * worker_thread_new(json_test_ctx_t *ctx) { json_test_worker_thread_t *wt; wt = bson_malloc0(sizeof(json_test_worker_thread_t)); wt->ctx = ctx; /* Note: thread safety of the queue is a bit redundant since the worker * thread locks around it. */ wt->queue = q_new(); bson_mutex_init(&wt->mutex); mongoc_cond_init(&wt->cond); return wt; } void worker_thread_destroy(json_test_worker_thread_t *wt) { q_destroy(wt->queue); bson_mutex_destroy(&wt->mutex); mongoc_cond_destroy(&wt->cond); bson_free(wt); } #define WORKER_THREAD_WAIT_TIMEOUT_MS 10 * 1000 static BSON_THREAD_FUN(json_test_worker_thread_run, wt_void) { json_test_worker_thread_t *wt; bson_t *op = NULL; bool shutdown = false; wt = wt_void; while (true) { /* Wait for a new item in the queue or shutdown. */ bson_mutex_lock(&wt->mutex); op = (bson_t *)q_get_nowait(wt->queue); shutdown = wt->shutdown_requested; while (!op && !shutdown) { mongoc_cond_timedwait(&wt->cond, &wt->mutex, WORKER_THREAD_WAIT_TIMEOUT_MS); shutdown = wt->shutdown_requested; op = q_get_nowait(wt->queue); } bson_mutex_unlock(&wt->mutex); if (op) { bson_t reply; json_test_operation(wt->ctx, wt->ctx->config->scenario, op, wt->ctx->collection, NULL /* session */, &reply); bson_destroy(op); op = NULL; bson_destroy(&reply); } else if (shutdown) { /* If there are no queued operations and shutdown was requested, exit * thread. */ break; } } BSON_THREAD_RETURN; } static void start_thread(json_test_worker_thread_t *wt) { wt->shutdown_requested = false; int ret = mcommon_thread_create(&wt->thread, json_test_worker_thread_run, wt); ASSERT_CMPINT(0, ==, ret); } static void run_on_thread(json_test_worker_thread_t *wt, bson_t *op) { bson_mutex_lock(&wt->mutex); q_put(wt->queue, bson_copy(op)); mongoc_cond_broadcast(&wt->cond); bson_mutex_unlock(&wt->mutex); } static void wait_for_thread(json_test_worker_thread_t *wt) { bson_mutex_lock(&wt->mutex); wt->shutdown_requested = true; mongoc_cond_broadcast(&wt->cond); bson_mutex_unlock(&wt->mutex); mcommon_thread_join(wt->thread); } void json_test_ctx_init(json_test_ctx_t *ctx, const bson_t *test, mongoc_client_t *client, mongoc_database_t *db, mongoc_collection_t *collection, const json_test_config_t *config) { char *session_name; char *session_opts_path; int i; bson_error_t error; ASSERT(client); memset(ctx, 0, sizeof(*ctx)); ctx->client = client; ctx->db = db; ctx->collection = collection; ctx->change_stream = NULL; ctx->config = config; ctx->n_events = 0; bson_init(&ctx->events); ctx->test_framework_uri = mongoc_uri_copy(client->uri); ctx->acknowledged = true; ctx->verbose = test_framework_getenv_bool("MONGOC_TEST_MONITORING_VERBOSE"); bson_init(&ctx->lsids[0]); bson_init(&ctx->lsids[1]); ctx->sessions[0] = NULL; ctx->sessions[1] = NULL; ctx->has_sessions = test_framework_session_timeout_minutes() > -1 && test_framework_skip_if_no_crypto(); /* transactions tests require two sessions named session0 and session1, * retryable writes use one explicit session or none */ if (ctx->has_sessions) { for (i = 0; i < 2; i++) { session_name = bson_strdup_printf("session%d", i); session_opts_path = bson_strdup_printf("sessionOptions.session%d", i); if (bson_has_field(test, session_opts_path)) { ctx->sessions[i] = bson_lookup_session(test, session_opts_path, client); } else { ctx->sessions[i] = mongoc_client_start_session(client, NULL, &error); } ASSERT_OR_PRINT(ctx->sessions[i], error); bson_concat(&ctx->lsids[i], mongoc_client_session_get_lsid(ctx->sessions[i])); bson_free(session_name); bson_free(session_opts_path); } } bson_mutex_init(&ctx->mutex); } void json_test_ctx_end_sessions(json_test_ctx_t *ctx) { int i; if (ctx->has_sessions) { for (i = 0; i < 2; i++) { if (ctx->sessions[i]) { mongoc_client_session_destroy(ctx->sessions[i]); ctx->sessions[i] = NULL; } } } } void json_test_ctx_cleanup(json_test_ctx_t *ctx) { json_test_ctx_end_sessions(ctx); mongoc_change_stream_destroy(ctx->change_stream); bson_destroy(&ctx->lsids[0]); bson_destroy(&ctx->lsids[1]); bson_destroy(&ctx->events); mongoc_uri_destroy(ctx->test_framework_uri); bson_destroy(ctx->sent_lsids[0]); bson_destroy(ctx->sent_lsids[1]); bson_mutex_destroy(&ctx->mutex); } static void append_session(mongoc_client_session_t *session, bson_t *opts) { if (session) { bool r; bson_error_t error; r = mongoc_client_session_append(session, opts, &error); ASSERT_OR_PRINT(r, error); } } static char * value_to_str(const bson_value_t *value) { bson_t doc; if (value->value_type == BSON_TYPE_DOCUMENT || value->value_type == BSON_TYPE_ARRAY) { bson_init_from_value(&doc, value); return bson_as_relaxed_extended_json(&doc, NULL); } else { return bson_strdup_printf("%" PRId64, bson_value_as_int64(value)); } } static void convert_bulk_write_result(const bson_t *doc, bson_t *r) { bson_iter_t iter; ASSERT(bson_iter_init(&iter, doc)); /* tests expect "insertedCount" etc. from the CRUD Spec for bulk write, * we return "nInserted" etc. from the old Bulk API Spec */ while (bson_iter_next(&iter)) { if (BSON_ITER_IS_KEY(&iter, "insertedCount")) { BSON_APPEND_VALUE(r, "nInserted", bson_iter_value(&iter)); } else if (BSON_ITER_IS_KEY(&iter, "deletedCount")) { BSON_APPEND_VALUE(r, "nRemoved", bson_iter_value(&iter)); } else if (BSON_ITER_IS_KEY(&iter, "matchedCount")) { BSON_APPEND_VALUE(r, "nMatched", bson_iter_value(&iter)); } else if (BSON_ITER_IS_KEY(&iter, "modifiedCount")) { BSON_APPEND_VALUE(r, "nModified", bson_iter_value(&iter)); } else if (BSON_ITER_IS_KEY(&iter, "upsertedCount")) { BSON_APPEND_VALUE(r, "nUpserted", bson_iter_value(&iter)); } else if (BSON_ITER_IS_KEY(&iter, "upsertedIds")) { bson_array_builder_t *upserted; bson_iter_t inner; uint32_t i = 0; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); /* include the "upserted" field if upsertedIds isn't empty */ ASSERT(bson_iter_recurse(&iter, &inner)); while (bson_iter_next(&inner)) { i++; } if (i) { ASSERT(bson_iter_recurse(&iter, &inner)); BSON_APPEND_ARRAY_BUILDER_BEGIN(r, "upserted", &upserted); while (bson_iter_next(&inner)) { bson_t upsert; int64_t index; index = bson_ascii_strtoll(bson_iter_key(&inner), NULL, 10); bson_array_builder_append_document_begin(upserted, &upsert); BSON_APPEND_INT32(&upsert, "index", (int32_t)index); BSON_APPEND_VALUE(&upsert, "_id", bson_iter_value(&inner)); bson_array_builder_append_document_end(upserted, &upsert); } bson_append_array_builder_end(r, upserted); } } else if (BSON_ITER_IS_KEY(&iter, "insertedIds")) { /* tests expect insertedIds, but they're optional and we omit them */ } else { BSON_APPEND_VALUE(r, bson_iter_key(&iter), bson_iter_value(&iter)); } } } /* convert from spec result in JSON test to a libmongoc result */ static void convert_spec_result(const char *op_name, const bson_value_t *spec_result, bson_value_t *converted) { bson_t doc; bson_t r; bson_iter_t iter; if (spec_result->value_type != BSON_TYPE_DOCUMENT && spec_result->value_type != BSON_TYPE_ARRAY) { bson_value_copy(spec_result, converted); return; } bson_init(&r); bson_init_from_value(&doc, spec_result); ASSERT(bson_iter_init(&iter, &doc)); if (!strcmp(op_name, "bulkWrite")) { convert_bulk_write_result(&doc, &r); } else { /* tests expect "upsertedCount": 0, we add "upsertedCount" only if it's * not zero. tests also expect insertedId or insertedIds, but they are * optional and we omit them. */ while (bson_iter_next(&iter)) { if (BSON_ITER_IS_KEY(&iter, "upsertedCount")) { if (bson_iter_as_int64(&iter) != 0) { BSON_APPEND_INT64(&r, "upsertedCount", bson_iter_as_int64(&iter)); } } else if (!BSON_ITER_IS_KEY(&iter, "insertedId") && !BSON_ITER_IS_KEY(&iter, "insertedIds")) { BSON_APPEND_VALUE(&r, bson_iter_key(&iter), bson_iter_value(&iter)); } } } /* copies r's contents */ value_init_from_doc(converted, &r); /* preserve spec tests' distinction between array and document */ converted->value_type = spec_result->value_type; bson_destroy(&r); } static bool get_result(const bson_t *test, const bson_t *operation, bson_value_t *value) { const char *op_name; bson_value_t pre_conversion; /* retryable writes tests specify result at the end of the whole test: * operation: * name: insertOne * arguments: ... * outcome: * result: * insertedId: 3 * * transactions tests specify the result of each operation: * operations: * - name: insertOne * arguments: ... * result: * insertedId: 3 * * command monitoring tests have no results */ if (bson_has_field(test, "outcome.result")) { bson_lookup_value(test, "outcome.result", &pre_conversion); } else if (bson_has_field(operation, "result")) { bson_lookup_value(operation, "result", &pre_conversion); } else { return false; } if (value) { op_name = bson_lookup_utf8(operation, "name"); convert_spec_result(op_name, &pre_conversion, value); } bson_value_destroy(&pre_conversion); return true; } static void check_success_expected(const bson_t *operation, bool succeeded, bool expected, const bson_error_t *error) { char *json = bson_as_relaxed_extended_json(operation, NULL); if (!succeeded && expected) { test_error("Expected success, got error \"%s\":\n%s", error->message, json); } if (succeeded && !expected) { test_error("Expected error, got success:\n%s", json); } bson_free(json); } static uint32_t error_code_from_name(const char *name) { if (!strcmp(name, "CannotSatisfyWriteConcern")) { return 100; } else if (!strcmp(name, "DuplicateKey")) { return 11000; } else if (!strcmp(name, "NoSuchTransaction")) { return 251; } else if (!strcmp(name, "WriteConflict")) { return 112; } else if (!strcmp(name, "Interrupted")) { return 11601; } else if (!strcmp(name, "MaxTimeMSExpired")) { return 50; } else if (!strcmp(name, "UnknownReplWriteConcern")) { return 79; } else if (!strcmp(name, "UnsatisfiableWriteConcern")) { return 100; } else if (!strcmp(name, "OperationNotSupportedInTransaction")) { return 263; } test_error("Add errorCodeName \"%s\" to error_code_from_name()", name); /* test_error() aborts, but add a return to suppress compiler warnings */ return 0; } static void check_error_code_name(const bson_t *operation, const bson_error_t *error) { const char *code_name; uint32_t expected_error_code; if (!bson_has_field(operation, "errorCodeName")) { return; } code_name = bson_lookup_utf8(operation, "errorCodeName"); expected_error_code = error_code_from_name(code_name); if (error->code != expected_error_code) { test_error("Expected error code %" PRIu32 " : %s but got error code %" PRIu32 "\n", expected_error_code, code_name, error->code); } } static void check_error_contains(const bson_t *operation, const bson_error_t *error) { const char *msg; if (!bson_has_field(operation, "errorContains")) { return; } msg = bson_lookup_utf8(operation, "errorContains"); ASSERT_CONTAINS(error->message, msg); } static void check_error_labels_contain(const bson_t *operation, const bson_value_t *result) { bson_t reply; bson_iter_t operation_iter; bson_iter_t expected_labels; bson_iter_t expected_label; const char *expected_label_str; if (!bson_has_field(operation, "errorLabelsContain")) { return; } BSON_ASSERT(result); BSON_ASSERT(bson_iter_init(&operation_iter, operation)); BSON_ASSERT(bson_iter_find_descendant(&operation_iter, "errorLabelsContain", &expected_labels)); BSON_ASSERT(bson_iter_recurse(&expected_labels, &expected_label)); /* if the test has "errorLabelsContain" then result must be an error reply */ ASSERT_CMPSTR(_mongoc_bson_type_to_str(result->value_type), "DOCUMENT"); bson_init_from_value(&reply, result); while (bson_iter_next(&expected_label)) { expected_label_str = bson_iter_utf8(&expected_label, NULL); if (!mongoc_error_has_label(&reply, expected_label_str)) { test_error( "Expected label \"%s\" not found in %s", expected_label_str, bson_as_relaxed_extended_json(&reply, NULL)); } } } static void check_error_labels_omit(const bson_t *operation, const bson_value_t *result) { bson_t reply; bson_t omitted_labels; bson_iter_t omitted_label; if (!bson_has_field(operation, "errorLabelsOmit")) { return; } BSON_ASSERT(result); if (result->value_type != BSON_TYPE_DOCUMENT) { /* successful result from count, distinct, etc. */ return; } bson_init_from_value(&reply, result); if (!bson_has_field(&reply, "errorLabels")) { return; } bson_lookup_doc(operation, "errorLabelsOmit", &omitted_labels); BSON_ASSERT(bson_iter_init(&omitted_label, &omitted_labels)); while (bson_iter_next(&omitted_label)) { if (mongoc_error_has_label(&reply, bson_iter_utf8(&omitted_label, NULL))) { test_error( "Label \"%s\" should have been omitted %s", bson_iter_utf8(&omitted_label, NULL), value_to_str(result)); } } } /*-------------------------------------------------------------------------- * * check_result -- * * Verify that a function call's outcome matches the expected outcome. * * Consider a JSON test like: * * operations: * - name: insertOne * arguments: * document: * _id: 1 * session: session0 * result: * insertedId: 1 * * @test is the BSON representation of the entire test including the * "operations" array, @operation is one of the documents in array, * @succeeded is true if the function call actually succeeded, @result * is the function call's result (optional), and @error is the call's * error (optional). * * Side effects: * Logs and aborts if the outcome does not match the expected outcome. * *-------------------------------------------------------------------------- */ void check_result( const bson_t *test, const bson_t *operation, bool succeeded, const bson_value_t *result, const bson_error_t *error) { bson_t expected_doc; bson_value_t expected_value; match_ctx_t ctx = {{0}}; if (!get_result(test, operation, &expected_value)) { /* if there's no "result", e.g. in the command monitoring tests, * we don't know if the command is expected to succeed or fail */ return; } if (expected_value.value_type == BSON_TYPE_DOCUMENT) { bson_init_from_value(&expected_doc, &expected_value); if (bson_has_field(&expected_doc, "errorCodeName") || bson_has_field(&expected_doc, "errorContains") || bson_has_field(&expected_doc, "errorLabelsContain") || bson_has_field(&expected_doc, "errorLabelsOmit")) { /* Expect the operation has failed. Transactions tests specify errors * per-operation, with one or more details: * operations: * - name: insertOne * arguments: ... * result: * errorCodeName: WriteConflict * errorContains: "message substring" * errorLabelsContain: ["TransientTransactionError"] * errorLabelsOmit: ["UnknownTransactionCommitResult"] */ check_success_expected(&expected_doc, succeeded, false, error); check_error_code_name(&expected_doc, error); check_error_contains(&expected_doc, error); check_error_labels_contain(&expected_doc, result); check_error_labels_omit(&expected_doc, result); bson_value_destroy(&expected_value); return; } } /* retryable writes tests and CRUD tests specify error: at the end of * the whole test: * operation: * name: insertOne * outcome: * error: true */ check_success_expected(operation, succeeded, !_mongoc_lookup_bool(test, "outcome.error", false), error); BSON_ASSERT(result); /* Database-level aggregate tests use $currentOp, which may return a command * document containing dots in keys. Retain these as we do for APM checks. */ ctx.retain_dots_in_keys = true; if (!match_bson_value(result, &expected_value, &ctx)) { test_error("Error in \"%s\" test %s\n" "Expected:\n%s\nActual:\n%s", bson_lookup_utf8(test, "description"), ctx.errmsg, value_to_str(&expected_value), value_to_str(result)); } bson_value_destroy(&expected_value); } static bool add_request_to_bulk(mongoc_bulk_operation_t *bulk, const bson_t *request, bson_error_t *error) { const char *name; bson_t args; bool r; bson_t opts = BSON_INITIALIZER; name = bson_lookup_utf8(request, "name"); bson_lookup_doc(request, "arguments", &args); if (bson_has_field(&args, "arrayFilters")) { bson_value_t array_filters; bson_lookup_value(&args, "arrayFilters", &array_filters); BSON_APPEND_VALUE(&opts, "arrayFilters", &array_filters); bson_value_destroy(&array_filters); } if (bson_has_field(&args, "collation")) { bson_t collation; bson_lookup_doc(&args, "collation", &collation); BSON_APPEND_DOCUMENT(&opts, "collation", &collation); } if (bson_has_field(&args, "hint")) { bson_value_t hint; bson_lookup_value(&args, "hint", &hint); BSON_APPEND_VALUE(&opts, "hint", &hint); bson_value_destroy(&hint); } if (!strcmp(name, "deleteMany")) { bson_t filter; bson_lookup_doc(&args, "filter", &filter); r = mongoc_bulk_operation_remove_many_with_opts(bulk, &filter, &opts, error); } else if (!strcmp(name, "deleteOne")) { bson_t filter; bson_lookup_doc(&args, "filter", &filter); r = mongoc_bulk_operation_remove_one_with_opts(bulk, &filter, &opts, error); } else if (!strcmp(name, "insertOne")) { bson_t document; bson_lookup_doc(&args, "document", &document); r = mongoc_bulk_operation_insert_with_opts(bulk, &document, &opts, error); } else if (!strcmp(name, "replaceOne")) { bson_t filter; bson_t replacement; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "replacement", &replacement); if (bson_has_field(&args, "upsert")) { BSON_APPEND_BOOL(&opts, "upsert", _mongoc_lookup_bool(&args, "upsert", false)); } r = mongoc_bulk_operation_replace_one_with_opts(bulk, &filter, &replacement, &opts, error); } else if (!strcmp(name, "updateMany")) { bson_t filter; bson_t update; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "update", &update); if (bson_has_field(&args, "upsert")) { BSON_APPEND_BOOL(&opts, "upsert", _mongoc_lookup_bool(&args, "upsert", false)); } r = mongoc_bulk_operation_update_many_with_opts(bulk, &filter, &update, &opts, error); } else if (!strcmp(name, "updateOne")) { bson_t filter; bson_t update; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "update", &update); if (bson_has_field(&args, "upsert")) { BSON_APPEND_BOOL(&opts, "upsert", _mongoc_lookup_bool(&args, "upsert", false)); } r = mongoc_bulk_operation_update_one_with_opts(bulk, &filter, &update, &opts, error); } else { test_error("unrecognized request name %s", name); } bson_destroy(&opts); return r; } static void execute_bulk_operation(mongoc_bulk_operation_t *bulk, const bson_t *test, const bson_t *operation, bson_t *reply) { uint32_t server_id; bson_error_t error; bson_value_t value; server_id = mongoc_bulk_operation_execute(bulk, reply, &error); value_init_from_doc(&value, reply); check_result(test, operation, server_id != 0, &value, &error); bson_value_destroy(&value); } static bson_t * create_bulk_write_opts(const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc) { bson_t *opts; bson_t tmp; opts = tmp_bson("{}"); if (bson_has_field(operation, "arguments.options")) { bson_lookup_doc(operation, "arguments.options", &tmp); bson_concat(opts, &tmp); } append_session(session, opts); if (!mongoc_write_concern_is_default(wc)) { BSON_ASSERT(mongoc_write_concern_append(wc, opts)); } return opts; } static bool bulk_write(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { bson_t *opts; mongoc_bulk_operation_t *bulk; bson_t requests; bson_iter_t iter; bson_error_t error; opts = create_bulk_write_opts(operation, session, wc); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, opts); bson_lookup_doc(operation, "arguments.requests", &requests); ASSERT(bson_iter_init(&iter, &requests)); while (bson_iter_next(&iter)) { bson_t request; bson_iter_bson(&iter, &request); if (!add_request_to_bulk(bulk, &request, &error)) { /* For the sake of the test framework, we must init this */ bson_init(reply); check_result(test, operation, false, NULL, &error); mongoc_bulk_operation_destroy(bulk); return false; } } execute_bulk_operation(bulk, test, operation, reply); mongoc_bulk_operation_destroy(bulk); return true; } #define COPY_EXCEPT(...) bson_copy_to_excluding_noinit(&args, &opts, "session", "readPreference", __VA_ARGS__, NULL) static bool single_write(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { const char *name; bson_t args; bson_t opts = BSON_INITIALIZER; bson_value_t value; bson_error_t error; bool r; BSON_UNUSED(wc); name = bson_lookup_utf8(operation, "name"); bson_lookup_doc(operation, "arguments", &args); append_session(session, &opts); if (!strcmp(name, "deleteMany")) { bson_t filter; bson_lookup_doc(&args, "filter", &filter); COPY_EXCEPT("filter"); r = mongoc_collection_delete_many(collection, &filter, &opts, reply, &error); } else if (!strcmp(name, "deleteOne")) { bson_t filter; bson_lookup_doc(&args, "filter", &filter); COPY_EXCEPT("filter"); r = mongoc_collection_delete_one(collection, &filter, &opts, reply, &error); } else if (!strcmp(name, "insertOne")) { bson_t document; bson_lookup_doc(&args, "document", &document); COPY_EXCEPT("document"); r = mongoc_collection_insert_one(collection, &document, &opts, reply, &error); } else if (!strcmp(name, "replaceOne")) { bson_t filter; bson_t replacement; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "replacement", &replacement); COPY_EXCEPT("filter", "replacement"); r = mongoc_collection_replace_one(collection, &filter, &replacement, &opts, reply, &error); } else if (!strcmp(name, "updateMany")) { bson_t filter; bson_t update; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "update", &update); COPY_EXCEPT("filter", "update"); r = mongoc_collection_update_many(collection, &filter, &update, &opts, reply, &error); } else if (!strcmp(name, "updateOne")) { bson_t filter; bson_t update; bson_lookup_doc(&args, "filter", &filter); bson_lookup_doc(&args, "update", &update); COPY_EXCEPT("filter", "update"); r = mongoc_collection_update_one(collection, &filter, &update, &opts, reply, &error); } else { test_error("unrecognized request name %s", name); } value_init_from_doc(&value, reply); check_result(test, operation, r, &value, &error); bson_value_destroy(&value); bson_destroy(&opts); return r; } static mongoc_find_and_modify_opts_t * create_find_and_modify_opts(const char *name, const bson_t *args, mongoc_client_session_t *session, mongoc_write_concern_t *wc) { mongoc_find_and_modify_opts_t *opts; mongoc_find_and_modify_flags_t flags = MONGOC_FIND_AND_MODIFY_NONE; bson_t extra = BSON_INITIALIZER; bson_iter_t iter; opts = mongoc_find_and_modify_opts_new(); if (!strcmp(name, "findOneAndDelete")) { flags |= MONGOC_FIND_AND_MODIFY_REMOVE; } if (!strcmp(name, "findOneAndReplace")) { bson_t replacement; bson_lookup_doc(args, "replacement", &replacement); mongoc_find_and_modify_opts_set_update(opts, &replacement); } if (!strcmp(name, "findOneAndUpdate")) { bson_t update; bson_lookup_doc(args, "update", &update); mongoc_find_and_modify_opts_set_update(opts, &update); } if (bson_has_field(args, "sort")) { bson_t sort; bson_lookup_doc(args, "sort", &sort); mongoc_find_and_modify_opts_set_sort(opts, &sort); } if (_mongoc_lookup_bool(args, "upsert", false)) { flags |= MONGOC_FIND_AND_MODIFY_UPSERT; } if (bson_has_field(args, "collation")) { bson_t collation = BSON_INITIALIZER; bson_t temp; bson_lookup_doc(args, "collation", &temp); BSON_APPEND_DOCUMENT(&collation, "collation", &temp); mongoc_find_and_modify_opts_append(opts, &collation); bson_destroy(&collation); bson_destroy(&temp); } if (bson_has_field(args, "arrayFilters")) { bson_t array_filters = BSON_INITIALIZER; bson_value_t temp; bson_lookup_value(args, "arrayFilters", &temp); BSON_APPEND_VALUE(&array_filters, "arrayFilters", &temp); mongoc_find_and_modify_opts_append(opts, &array_filters); bson_destroy(&array_filters); bson_value_destroy(&temp); } if (bson_has_field(args, "returnDocument") && !strcmp("After", bson_lookup_utf8(args, "returnDocument"))) { flags |= MONGOC_FIND_AND_MODIFY_RETURN_NEW; } if (bson_iter_init_find(&iter, args, "hint")) { bson_append_iter(&extra, "hint", 4, &iter); } mongoc_find_and_modify_opts_set_flags(opts, flags); append_session(session, &extra); if (!mongoc_write_concern_is_default(wc)) { BSON_ASSERT(mongoc_write_concern_append(wc, &extra)); } ASSERT(mongoc_find_and_modify_opts_append(opts, &extra)); bson_destroy(&extra); return opts; } static bool find_and_modify(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { const char *name; bson_t args; bson_t filter; mongoc_find_and_modify_opts_t *opts; bson_value_t value = {0}; bson_error_t error; bool r; name = bson_lookup_utf8(operation, "name"); bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(operation, "arguments.filter", &filter); opts = create_find_and_modify_opts(name, &args, session, wc); r = mongoc_collection_find_and_modify_with_opts(collection, &filter, opts, reply, &error); /* Transactions Tests have findAndModify results like: * result: {_id: 3} * * Or for findOneAndDelete with no result: * result: null * * But mongoc_collection_find_and_modify_with_opts returns: * { ok: 1, value: {_id: 3}} * * Or: * { ok: 1, value: null} */ if (get_result(test, operation, NULL)) { if (r) { bson_lookup_value(reply, "value", &value); } else { value_init_from_doc(&value, reply); } } check_result(test, operation, r, &value, &error); bson_value_destroy(&value); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&args); bson_destroy(&filter); return r; } static bool insert_many(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { bson_t args; bson_t opts = BSON_INITIALIZER; bson_t docs_array; bson_t *doc_ptrs[100]; size_t i, n; bson_iter_t iter; bson_value_t value; bson_error_t error; bool r; BSON_UNUSED(wc); bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(&args, "documents", &docs_array); ASSERT(bson_iter_init(&iter, &docs_array)); n = 0; while (bson_iter_next(&iter)) { bson_t document; bson_iter_bson(&iter, &document); doc_ptrs[n] = bson_copy(&document); n++; if (n >= 100) { test_error("Too many documents: %s", bson_as_relaxed_extended_json(operation, NULL)); } } append_session(session, &opts); /* transactions tests are like: * operation: * name: "insertMany" * arguments: * documents: * - { _id: 2, x: 22 } * options: { ordered: false } */ BSON_APPEND_BOOL(&opts, "ordered", _mongoc_lookup_bool(&args, "options.ordered", true /* default */)); COPY_EXCEPT("documents", "options"); r = mongoc_collection_insert_many(collection, (const bson_t **)doc_ptrs, n, &opts, reply, &error); /* CRUD tests may specify a write result even if an error is expected. * From the CRUD spec test readme: * "drivers may choose to check the result object if their BulkWriteException * (or equivalent) provides access to a write result object" * The C driver does not return a full write result for an "InsertMany" on * error, but instead just the insertedCount. */ if (!r) { BSON_APPEND_INT64(reply, "deletedCount", 0); BSON_APPEND_INT64(reply, "matchedCount", 0); BSON_APPEND_INT64(reply, "modifiedCount", 0); BSON_APPEND_INT64(reply, "upsertedCount", 0); BSON_APPEND_DOCUMENT(reply, "upsertedIds", tmp_bson("{}")); } value_init_from_doc(&value, reply); check_result(test, operation, r, &value, &error); bson_value_destroy(&value); bson_destroy(&opts); for (i = 0; i < n; i++) { bson_destroy(doc_ptrs[i]); } return r; } static bool rename_op(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { bson_t args; const char *db; const char *to; bson_error_t error; bool res; BSON_UNUSED(test); BSON_UNUSED(session); BSON_UNUSED(wc); bson_lookup_doc(operation, "arguments", &args); db = bson_lookup_utf8(operation, "database"); to = bson_lookup_utf8(&args, "to"); res = mongoc_collection_rename(collection, db, to, true, &error); /* This operation is only run by change stream tests, which use it to trigger further events and check all results elsewhere. */ ASSERT_OR_PRINT(res, error); bson_destroy(&args); /* fake a reply for the test framework's sake */ bson_init(reply); return res; } static bool drop(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, mongoc_write_concern_t *wc, bson_t *reply) { bson_error_t error; bool res; BSON_UNUSED(test); BSON_UNUSED(operation); BSON_UNUSED(session); BSON_UNUSED(wc); res = mongoc_collection_drop(collection, &error); /* This operation is only run by change stream tests, which use it to trigger further events and check all results elsewhere. */ ASSERT_OR_PRINT(res, error); /* fake a reply for the test framework's sake */ bson_init(reply); return res; } static bool count(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t filter; bson_t opts = BSON_INITIALIZER; bson_error_t error; int64_t r; bson_value_t value; const char *name; if (bson_has_field(operation, "arguments.filter")) { bson_lookup_doc(operation, "arguments.filter", &filter); } if (bson_has_field(operation, "arguments.skip")) { BSON_APPEND_INT64(&opts, "skip", bson_lookup_int32(operation, "arguments.skip")); } if (bson_has_field(operation, "arguments.limit")) { BSON_APPEND_INT64(&opts, "limit", bson_lookup_int32(operation, "arguments.limit")); } if (bson_has_field(operation, "arguments.collation")) { bson_t collation; bson_lookup_doc(operation, "arguments.collation", &collation); BSON_APPEND_DOCUMENT(&opts, "collation", &collation); } append_session(session, &opts); name = bson_lookup_utf8(operation, "name"); if (!strcmp(name, "countDocuments")) { r = mongoc_collection_count_documents(collection, &filter, &opts, read_prefs, reply, &error); } else if (!strcmp(name, "estimatedDocumentCount")) { r = mongoc_collection_estimated_document_count(collection, &opts, read_prefs, reply, &error); } else if (!strcmp(name, "count")) { // "count" previously referred to the deprecated helper: `mongoc_collection_count_with_opts`. // Run the "count" command directly to support tests. See: CRUD spec "Count API Details". bson_t *cmd = BCON_NEW("count", mongoc_collection_get_name(collection)); BSON_ASSERT(BSON_APPEND_DOCUMENT(cmd, "query", &filter)); bool ok = mongoc_collection_read_command_with_opts(collection, cmd, read_prefs, &opts, reply, &error); if (!ok) { // Set resulting count to -1 to indicate failure. r = -1; } else { bson_iter_t iter; BSON_ASSERT(bson_iter_init_find(&iter, reply, "n")); r = bson_iter_as_int64(&iter); } bson_destroy(cmd); } else { test_error("count() called with unrecognized operation name %s", name); return false; } if (r >= 0) { value.value_type = BSON_TYPE_INT64; value.value.v_int64 = r; } else { value_init_from_doc(&value, reply); } check_result(test, operation, r > -1, &value, &error); bson_value_destroy(&value); bson_destroy(&opts); return (r > -1); } static bool distinct(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t args; bson_t opts = BSON_INITIALIZER; const char *field_name; bson_t query; bson_value_t value = {0}; bson_error_t error; bool r; append_session(session, &opts); bson_lookup_doc(operation, "arguments", &args); field_name = bson_lookup_utf8(&args, "fieldName"); if (bson_has_field(&args, "filter")) { bson_lookup_doc(&args, "filter", &query); BSON_APPEND_DOCUMENT(&opts, "query", &query); } COPY_EXCEPT("fieldName", "filter"); r = mongoc_collection_read_command_with_opts( collection, tmp_bson("{'distinct': '%s', 'key': '%s'}", collection->collection, field_name), read_prefs, &opts, reply, &error); /* Transactions Tests have "distinct" results like: * result: [1, 2, 3] * * But the command returns: * { ok: 1, values: [1, 2, 3]} */ if (r) { bson_lookup_value(reply, "values", &value); } else { value_init_from_doc(&value, reply); } check_result(test, operation, r, &value, &error); bson_value_destroy(&value); bson_destroy(&opts); return r; } static void check_cursor(mongoc_cursor_t *cursor, const bson_t *test, const bson_t *operation) { const bson_t *doc; bson_error_t error; bson_t result = BSON_INITIALIZER; const char *keyptr = NULL; char key[12]; uint32_t i = 0; bson_value_t value; i = 0; while (mongoc_cursor_next(cursor, &doc)) { bson_uint32_to_string(i++, &keyptr, key, sizeof key); BSON_APPEND_DOCUMENT(&result, keyptr, doc); } if (mongoc_cursor_error_document(cursor, &error, &doc)) { value_init_from_doc(&value, doc); check_result(test, operation, false, &value, &error); } else { value_init_from_doc(&value, &result); value.value_type = BSON_TYPE_ARRAY; check_result(test, operation, true, &value, &error); } bson_value_destroy(&value); bson_destroy(&result); } static bool find(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t args; bson_t tmp; bson_t filter; bson_t opts = BSON_INITIALIZER; mongoc_cursor_t *cursor; bson_error_t error; /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); bson_lookup_doc(operation, "arguments", &args); if (bson_has_field(&args, "filter")) { bson_lookup_doc(&args, "filter", &tmp); bson_copy_to(&tmp, &filter); } else { bson_init(&filter); } /* Command Monitoring Spec tests use OP_QUERY-style modifiers for "find": * arguments: * filter: { _id: { $gt: 1 } } * sort: { _id: 1 } * skip: {"$numberLong": "2"} * modifiers: * $comment: "test" * $showDiskLoc: false * * Abuse _mongoc_cursor_translate_dollar_query_opts to upgrade "modifiers". */ if (bson_has_field(&args, "modifiers")) { bson_t modifiers; bson_t *query = tmp_bson("{'$query': {}}"); bson_t unwrapped; bool r; bson_lookup_doc(&args, "modifiers", &modifiers); bson_concat(query, &modifiers); r = _mongoc_cursor_translate_dollar_query_opts(query, &opts, &unwrapped, &error); ASSERT_OR_PRINT(r, error); bson_destroy(&unwrapped); } COPY_EXCEPT("filter", "modifiers"); append_session(session, &opts); cursor = mongoc_collection_find_with_opts(collection, &filter, &opts, read_prefs); check_cursor(cursor, test, operation); mongoc_cursor_destroy(cursor); bson_destroy(&filter); bson_destroy(&opts); return true; } static bool find_one(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t filter; bson_t opts = BSON_INITIALIZER; const bson_t *doc; mongoc_cursor_t *cursor; bson_value_t value; bson_error_t error; BSON_UNUSED(session); bson_lookup_doc(operation, "arguments.filter", &filter); cursor = mongoc_collection_find_with_opts(collection, &filter, &opts, read_prefs); if (mongoc_cursor_next(cursor, &doc)) { value_init_from_doc(&value, doc); mongoc_cursor_error(cursor, &error); check_result(test, operation, true, &value, &error); } else if (mongoc_cursor_error_document(cursor, &error, &doc)) { value_init_from_doc(&value, doc); check_result(test, operation, false, &value, &error); } mongoc_cursor_destroy(cursor); bson_destroy(&filter); bson_destroy(&opts); bson_value_destroy(&value); bson_init(reply); return true; } static bool _is_aggregate_out(const bson_t *pipeline) { bson_iter_t iter; bson_iter_t stage; ASSERT(bson_iter_init(&iter, pipeline)); while (bson_iter_next(&iter)) { if (BSON_ITER_HOLDS_DOCUMENT(&iter) && bson_iter_recurse(&iter, &stage)) { if (bson_iter_find(&stage, "$out")) { return true; } } } return false; } static bool aggregate(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t args; bson_t pipeline; bson_t opts = BSON_INITIALIZER; mongoc_cursor_t *cursor; /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(&args, "pipeline", &pipeline); append_session(session, &opts); COPY_EXCEPT("pipeline"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, &pipeline, &opts, read_prefs); /* Driver CRUD API Spec: "$out is a special pipeline stage that causes no * results to be returned from the server. As such, the iterable here would * never contain documents. Drivers MAY setup a cursor to be executed upon * iteration against the $out collection such that if a user were to iterate * a pipeline including $out, results would be returned." * * The C Driver chooses the first option, and returns an empty cursor. */ if (_is_aggregate_out(&pipeline)) { const bson_t *doc; bson_error_t error; bson_value_t value; ASSERT(!mongoc_cursor_next(cursor, &doc)); if (mongoc_cursor_error_document(cursor, &error, &doc)) { value_init_from_doc(&value, doc); check_result(test, operation, false, &value, &error); bson_value_destroy(&value); } } else { check_cursor(cursor, test, operation); } mongoc_cursor_destroy(cursor); bson_destroy(&opts); return true; } static bool db_aggregate(mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t args; bson_t pipeline; bson_t opts = BSON_INITIALIZER; mongoc_cursor_t *cursor; /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(&args, "pipeline", &pipeline); append_session(session, &opts); COPY_EXCEPT("pipeline"); cursor = mongoc_database_aggregate(db, &pipeline, &opts, read_prefs); /* Driver CRUD API Spec: "$out is a special pipeline stage that causes no * results to be returned from the server. As such, the iterable here would * never contain documents. Drivers MAY setup a cursor to be executed upon * iteration against the $out collection such that if a user were to iterate * a pipeline including $out, results would be returned." * * The C Driver chooses the first option, and returns an empty cursor. */ if (_is_aggregate_out(&pipeline)) { const bson_t *doc; bson_error_t error; bson_value_t value; ASSERT(!mongoc_cursor_next(cursor, &doc)); if (mongoc_cursor_error_document(cursor, &error, &doc)) { value_init_from_doc(&value, doc); check_result(test, operation, false, &value, &error); bson_value_destroy(&value); } } else { check_cursor(cursor, test, operation); } mongoc_cursor_destroy(cursor); bson_destroy(&opts); return true; } static bool command(mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { bson_t cmd; bson_t args; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; bson_value_t value; /* arguments are like: * * arguments: * session: session0 * command: * find: *collection_name * readConcern: * level: majority */ bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(&args, "command", &cmd); COPY_EXCEPT("command"); append_session(session, &opts); r = mongoc_database_command_with_opts(db, &cmd, read_prefs, &opts, reply, &error); value_init_from_doc(&value, reply); check_result(test, operation, r, &value, &error); bson_value_destroy(&value); bson_destroy(&opts); bson_destroy(&cmd); return r; } static bool start_transaction(mongoc_client_session_t *session, const bson_t *test, const bson_t *operation, bson_t *reply) { mongoc_transaction_opt_t *opts = NULL; bson_error_t error; bool r; /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); if (bson_has_field(operation, "arguments.options")) { opts = bson_lookup_txn_opts(operation, "arguments.options"); } r = mongoc_client_session_start_transaction(session, opts, &error); check_result(test, operation, r, NULL, &error); if (opts) { mongoc_transaction_opts_destroy(opts); } return r; } static bool commit_transaction(mongoc_client_session_t *session, const bson_t *test, const bson_t *operation, bson_t *reply) { bson_value_t value; bson_error_t error; bool r; r = mongoc_client_session_commit_transaction(session, reply, &error); value_init_from_doc(&value, reply); check_result(test, operation, r, &value, &error); bson_value_destroy(&value); return r; } static bool abort_transaction(mongoc_client_session_t *session, const bson_t *test, const bson_t *operation, bson_t *reply) { bson_value_t value; bson_error_t error; bool r; r = mongoc_client_session_abort_transaction(session, &error); /* fake a reply for the test framework's sake */ bson_init(reply); value_init_from_doc(&value, reply); check_result(test, operation, r, &value, &error); bson_value_destroy(&value); return r; } static bool list_databases(mongoc_client_t *client, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { mongoc_cursor_t *cursor; bson_t opts; ASSERT(client); bson_init(&opts); append_session(session, &opts); cursor = mongoc_client_find_databases_with_opts(client, &opts); bson_destroy(&opts); check_cursor(cursor, test, operation); mongoc_cursor_destroy(cursor); bson_init(reply); return true; } static bool list_database_names(mongoc_client_t *client, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { char **database_names; bson_t opts; bson_error_t error; ASSERT(client); bson_init(&opts); append_session(session, &opts); database_names = mongoc_client_get_database_names_with_opts(client, &opts, &error); bson_destroy(&opts); check_result(test, operation, database_names != NULL, NULL /* result */, &error); bson_init(reply); bson_strfreev(database_names); return true; } static bool list_indexes(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { bson_t opts; mongoc_cursor_t *cursor; BSON_ASSERT(collection); bson_init(&opts); append_session(session, &opts); cursor = mongoc_collection_find_indexes_with_opts(collection, &opts); check_cursor(cursor, test, operation); mongoc_cursor_destroy(cursor); bson_init(reply); bson_destroy(&opts); return true; } static bool list_collections( mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { mongoc_cursor_t *cursor; bson_t opts; bson_init(&opts); append_session(session, &opts); cursor = mongoc_database_find_collections_with_opts(db, &opts); bson_destroy(&opts); check_cursor(cursor, test, operation); mongoc_cursor_destroy(cursor); bson_init(reply); return true; } static bool list_collection_names( mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { char **collection_names; bson_t opts; bson_error_t error; bson_init(&opts); append_session(session, &opts); collection_names = mongoc_database_get_collection_names_with_opts(db, &opts, &error); bson_destroy(&opts); check_result(test, operation, collection_names != NULL, NULL /* result */, &error); bson_init(reply); bson_strfreev(collection_names); return true; } static bool gridfs_download(mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, const mongoc_read_prefs_t *read_prefs, bson_t *reply) { mongoc_gridfs_bucket_t *bucket; bson_value_t value; bson_error_t error; mongoc_stream_t *stream; char buf[512]; BSON_UNUSED(test); BSON_UNUSED(session); bson_lookup_value(operation, "arguments.id", &value); bucket = mongoc_gridfs_bucket_new(db, NULL, read_prefs, &error); stream = mongoc_gridfs_bucket_open_download_stream(bucket, &value, &error); if (stream != NULL) { mongoc_stream_read(stream, buf, 1, 1, 0); } mongoc_stream_destroy(stream); mongoc_gridfs_bucket_destroy(bucket); bson_init(reply); return true; } static bool create_collection( mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { bson_t args; bson_t opts = BSON_INITIALIZER; bson_error_t error; mongoc_collection_t *collection; const char *collection_name; BSON_ASSERT(db); /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); append_session(session, &opts); bson_lookup_doc(operation, "arguments", &args); collection_name = bson_lookup_utf8(&args, "collection"); COPY_EXCEPT("collection"); collection = mongoc_database_create_collection(db, collection_name, &opts, &error); bson_destroy(&opts); check_result(test, operation, collection != NULL, NULL, &error); if (collection) { mongoc_collection_destroy(collection); } return true; } static bool drop_collection( mongoc_database_t *db, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { bson_t args; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; const char *collection_name; mongoc_collection_t *collection; BSON_ASSERT(db); /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); append_session(session, &opts); bson_lookup_doc(operation, "arguments", &args); collection_name = bson_lookup_utf8(&args, "collection"); COPY_EXCEPT("collection"); collection = mongoc_database_get_collection(db, collection_name); r = mongoc_collection_drop_with_opts(collection, &opts, &error); bson_destroy(&opts); mongoc_collection_destroy(collection); check_result(test, operation, r, NULL, &error); return true; } static bool create_index(mongoc_collection_t *collection, const bson_t *test, const bson_t *operation, mongoc_client_session_t *session, bson_t *reply) { bson_t args; bson_t keys; const char *name; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; BSON_ASSERT(collection); /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); append_session(session, &opts); bson_lookup_doc(operation, "arguments", &args); bson_lookup_doc(&args, "keys", &keys); name = bson_lookup_utf8(&args, "name"); COPY_EXCEPT("keys", "name"); mongoc_index_model_t *im = mongoc_index_model_new(&keys, tmp_bson("{'name': '%s'}", name)); r = mongoc_collection_create_indexes_with_opts(collection, &im, 1, &opts, NULL /* reply */, &error); mongoc_index_model_destroy(im); bson_destroy(&opts); check_result(test, operation, r, NULL, &error); return true; } static bool collection_exists(mongoc_client_t *client, const bson_t *operation) { char **names; bson_t args; const char *database_name; const char *collection_name; bson_error_t error; mongoc_database_t *db; bool found = false; uint32_t i; ASSERT(client); bson_lookup_doc(operation, "arguments", &args); database_name = bson_lookup_utf8(&args, "database"); collection_name = bson_lookup_utf8(&args, "collection"); db = mongoc_client_get_database(client, database_name); names = mongoc_database_get_collection_names_with_opts(db, NULL, &error); if (!names) { test_error("expected error checking if collection '%s' exists: %s", collection_name, error.message); } for (i = 0; names && names[i] != NULL; i++) { if (!strcmp(names[i], collection_name)) { found = true; } } mongoc_database_destroy(db); bson_strfreev(names); return found; } static bool index_exists(mongoc_client_t *client, const bson_t *operation) { bson_t args; const char *database_name; const char *collection_name; const char *index_name; mongoc_collection_t *collection; mongoc_cursor_t *indexes; bson_iter_t index; const bson_t *doc; bool found = false; ASSERT(client); bson_lookup_doc(operation, "arguments", &args); database_name = bson_lookup_utf8(&args, "database"); collection_name = bson_lookup_utf8(&args, "collection"); index_name = bson_lookup_utf8(&args, "index"); collection = mongoc_client_get_collection(client, database_name, collection_name); indexes = mongoc_collection_find_indexes_with_opts(collection, NULL); while (mongoc_cursor_next(indexes, &doc)) { if (bson_iter_init(&index, doc) && bson_iter_find(&index, "name") && BSON_ITER_HOLDS_UTF8(&index) && !strcmp(bson_iter_utf8(&index, NULL), index_name)) { found = true; } } mongoc_cursor_destroy(indexes); mongoc_collection_destroy(collection); return found; } static uint32_t _get_total_pool_cleared_event(json_test_ctx_t *ctx) { uint32_t total = 0; mc_shared_tpld td = mc_tpld_take_ref(ctx->client->topology); /* Go get total generation counts. */ for (size_t i = 0u; i < mc_tpld_servers_const(td.ptr)->items_len; i++) { const mongoc_server_description_t *sd; sd = mongoc_set_get_item_const(mc_tpld_servers_const(td.ptr), i); total += mc_tpl_sd_get_generation(sd, &kZeroObjectId); } mc_tpld_drop_ref(&td); return total; } #define WAIT_FOR_EVENT_TIMEOUT_MS 10 * 1000 #define WAIT_FOR_EVENT_TICK_MS 10 static void wait_for_event(json_test_ctx_t *ctx, const bson_t *operation) { bool satisfied = false; int64_t measured = 0; int64_t total = 0; const char *const event_name = bson_lookup_utf8(operation, "arguments.event"); const int32_t count = bson_lookup_int32(operation, "arguments.count"); const int64_t expires_us = bson_get_monotonic_time() + WAIT_FOR_EVENT_TIMEOUT_MS * 1000; while (!satisfied && bson_get_monotonic_time() < expires_us) { if (0 == strcmp(event_name, "ServerMarkedUnknownEvent")) { bson_mutex_lock(&ctx->mutex); measured = ctx->measured_ServerMarkedUnknownEvent; total = ctx->total_ServerMarkedUnknownEvent; const int64_t diff = total - measured; if (diff >= count) { /* "count" events were accounted for in the test. There may be more * later. */ ctx->measured_ServerMarkedUnknownEvent += count; satisfied = true; } bson_mutex_unlock(&ctx->mutex); } else if (0 == strcmp(event_name, "PoolClearedEvent")) { bson_mutex_lock(&ctx->mutex); total = (int64_t)_get_total_pool_cleared_event(ctx); measured = ctx->measured_PoolClearedEvent; const int64_t diff = total - measured; if (diff >= count) { /* "count" events were accounted for in the test. There may be more * later. */ ctx->measured_PoolClearedEvent += count; satisfied = true; } bson_mutex_unlock(&ctx->mutex); } else { test_error("Unknown event: %s", event_name); } if (!satisfied) { mlib_sleep_for(WAIT_FOR_EVENT_TICK_MS, ms); } } if (!satisfied) { test_error("did not see enough %s events after 10s. %" PRId64 " total occurred. %" PRId64 " accounted for. But %" PRId32 " more expected", event_name, total, measured, count); } } static void wait_for_primary_change(json_test_ctx_t *ctx, const bson_t *operation) { bool satisfied = false; int64_t measured = 0; int64_t total = 0; const int32_t timeout_ms = bson_lookup_int32(operation, "arguments.timeoutMS"); const int64_t expires_us = bson_get_monotonic_time() + timeout_ms * 1000; while (!satisfied && bson_get_monotonic_time() < expires_us) { bson_mutex_lock(&ctx->mutex); total = ctx->total_PrimaryChangedEvent; measured = ctx->measured_PrimaryChangedEvent; const int64_t diff = total - measured; if (diff >= 1) { /* 1 event accounted for. There may be more later. */ ctx->measured_PrimaryChangedEvent++; satisfied = true; } bson_mutex_unlock(&ctx->mutex); if (!satisfied) { mlib_sleep_for(10, ms); } } if (!satisfied) { test_error("did not see any primary change events after %" PRId32 "ms. %" PRId64 " total occurred. " "%" PRId64 " accounted for.", timeout_ms, total, measured); } } static void assert_event_count(json_test_ctx_t *ctx, const bson_t *operation) { int64_t total = 0; const char *const event_name = bson_lookup_utf8(operation, "arguments.event"); const int32_t count = bson_lookup_int32(operation, "arguments.count"); if (0 == strcmp(event_name, "ServerMarkedUnknownEvent")) { total = ctx->total_ServerMarkedUnknownEvent; } else if (0 == strcmp(event_name, "PoolClearedEvent")) { total = (int64_t)_get_total_pool_cleared_event(ctx); } else { test_error("Unknown event: %s", event_name); } if (count != total) { test_error("event count %s mismatched. Expected %" PRId32 ", but have %" PRId64, event_name, count, total); } } static void assert_session_transaction_state(json_test_ctx_t *ctx, const bson_t *operation) { const char *expected_state; const mongoc_client_session_t *session; mongoc_transaction_state_t state; char *state_strings[] = {"none", "starting", "in progress", "committed", "aborted"}; expected_state = bson_lookup_utf8(operation, "arguments.state"); session = session_from_name(ctx, bson_lookup_utf8(operation, "arguments.session")); state = mongoc_client_session_get_transaction_state(session); if (!strcmp(expected_state, "none")) { if (state != MONGOC_TRANSACTION_NONE) { test_error("expected session transaction state none, but have %s", state_strings[state]); } } else if (!strcmp(expected_state, "starting")) { if (state != MONGOC_TRANSACTION_STARTING) { test_error("expected session transaction state starting, but have %s", state_strings[state]); } } else if (!strcmp(expected_state, "in_progress")) { if (state != MONGOC_TRANSACTION_IN_PROGRESS) { test_error("expected session transaction state in progress, but have %s", state_strings[state]); } } else if (!strcmp(expected_state, "committed")) { if (state != MONGOC_TRANSACTION_COMMITTED) { test_error("expected session transaction state committed, but have %s", state_strings[state]); } } else if (!strcmp(expected_state, "aborted")) { if (state != MONGOC_TRANSACTION_ABORTED) { test_error("expected session transaction state aborted, but have %s", state_strings[state]); } } else { test_error("unrecognized state %s for assertSessionTransactionState", expected_state); } } static bool op_error(const bson_t *operation) { return bson_has_field(operation, "error") && bson_lookup_bool(operation, "error"); } bool json_test_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation, mongoc_collection_t *collection, mongoc_client_session_t *session, bson_t *reply) { const char *op_name; const char *obj_name = "collection"; mongoc_read_prefs_t *read_prefs = NULL; mongoc_write_concern_t *wc; mongoc_database_t *db = mongoc_database_copy(ctx->db); mongoc_collection_t *c = mongoc_collection_copy(collection); bool res = false; op_name = bson_lookup_utf8(operation, "name"); if (bson_has_field(operation, "object")) { obj_name = bson_lookup_utf8(operation, "object"); } if (bson_has_field(operation, "databaseOptions")) { bson_lookup_database_opts(operation, "databaseOptions", db); } if (bson_has_field(operation, "collectionOptions")) { bson_lookup_collection_opts(operation, "collectionOptions", c); } if (bson_has_field(operation, "read_preference")) { /* command monitoring tests */ read_prefs = bson_lookup_read_prefs(operation, "read_preference"); } else if (bson_has_field(operation, "arguments.readPreference")) { /* transactions tests */ read_prefs = bson_lookup_read_prefs(operation, "arguments.readPreference"); } if (bson_has_field(operation, "arguments.writeConcern")) { wc = bson_lookup_write_concern(operation, "arguments.writeConcern"); } else { wc = mongoc_write_concern_new(); } if (!strcmp(obj_name, "collection")) { if (!strcmp(op_name, "bulkWrite")) { res = bulk_write(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "deleteOne") || !strcmp(op_name, "deleteMany") || !strcmp(op_name, "insertOne") || !strcmp(op_name, "replaceOne") || !strcmp(op_name, "updateOne") || !strcmp(op_name, "updateMany")) { res = single_write(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "findOneAndDelete") || !strcmp(op_name, "findOneAndReplace") || !strcmp(op_name, "findOneAndUpdate")) { res = find_and_modify(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "insertMany")) { res = insert_many(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "rename")) { res = rename_op(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "drop")) { res = drop(c, test, operation, session, wc, reply); } else if (!strcmp(op_name, "count")) { res = count(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "estimatedDocumentCount")) { res = count(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "countDocuments")) { res = count(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "distinct")) { res = distinct(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "find")) { res = find(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "findOne")) { res = find_one(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "aggregate")) { res = aggregate(c, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "listIndexes") || !strcmp(op_name, "listIndexNames")) { res = list_indexes(c, test, operation, session, reply); } else if (!strcmp(op_name, "watch")) { bson_t pipeline = BSON_INITIALIZER; mongoc_change_stream_destroy(ctx->change_stream); ctx->change_stream = mongoc_collection_watch(c, &pipeline, NULL); res = (op_error(operation) == (0 != ctx->change_stream->err.code)); if (!res) { test_error("expected error=%s, but actual error='%s'", op_error(operation) ? "true" : "false", ctx->change_stream->err.message); } bson_init(reply); bson_destroy(&pipeline); } else if (!strcmp(op_name, "mapReduce")) { test_error("operation not implemented in libmongoc"); } else if (!strcmp(op_name, "createIndex")) { res = create_index(c, test, operation, session, reply); } else { test_error("unrecognized collection operation name %s", op_name); } } else if (!strcmp(obj_name, "database")) { if (!strcmp(op_name, "aggregate")) { res = db_aggregate(db, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "runCommand")) { res = command(db, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "listCollections")) { res = list_collections(db, test, operation, session, reply); } else if (!strcmp(op_name, "listCollectionNames")) { res = list_collection_names(db, test, operation, session, reply); } else if (!strcmp(op_name, "watch")) { bson_t pipeline = BSON_INITIALIZER; mongoc_change_stream_destroy(ctx->change_stream); ctx->change_stream = mongoc_database_watch(db, &pipeline, NULL); res = (op_error(operation) == (0 != ctx->change_stream->err.code)); if (!res) { test_error("expected error=%s, but actual error='%s'", op_error(operation) ? "true" : "false", ctx->change_stream->err.message); } bson_init(reply); bson_destroy(&pipeline); } else if (!strcmp(op_name, "listCollectionObjects")) { test_error("listCollectionObjects is not implemented in libmongoc"); } else if (!strcmp(op_name, "createCollection")) { create_collection(db, test, operation, session, reply); } else if (!strcmp(op_name, "dropCollection")) { drop_collection(db, test, operation, session, reply); } else { test_error("unrecognized database operation name %s", op_name); } } else if (!strncmp(obj_name, "session", 7)) { mongoc_client_session_t *named_session = session_from_name(ctx, obj_name); if (!strcmp(op_name, "startTransaction")) { res = start_transaction(named_session, test, operation, reply); } else if (!strcmp(op_name, "commitTransaction")) { res = commit_transaction(named_session, test, operation, reply); } else if (!strcmp(op_name, "abortTransaction")) { res = abort_transaction(named_session, test, operation, reply); } else if (!strcmp(op_name, "endSession")) { mongoc_client_session_destroy(named_session); if (0 == strcmp(obj_name, "session0")) { ctx->sessions[0] = NULL; } else if (0 == strcmp(obj_name, "session1")) { ctx->sessions[1] = NULL; } else { test_error("unrecognized session: %s", op_name); } res = true; bson_init(reply); } else { test_error("unrecognized session operation name %s", op_name); } } else if (!strcmp(obj_name, "testRunner")) { /* We don't use reply, but we need to initialize it for the test runner */ bson_init(reply); if (!strcmp(op_name, "assertSessionPinned")) { res = (0 != mongoc_client_session_get_server_id(session)); } else if (!strcmp(op_name, "assertSessionUnpinned")) { res = (0 == mongoc_client_session_get_server_id(session)); } else if (!strcmp(op_name, "targetedFailPoint")) { mongoc_client_t *client; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); activate_fail_point(client, session->server_id, operation, "arguments.failPoint"); mongoc_client_destroy(client); } else if (!strcmp(op_name, "assertSessionNotDirty")) { BSON_ASSERT(!session->server_session->dirty); } else if (!strcmp(op_name, "assertSessionDirty")) { BSON_ASSERT(session->server_session->dirty); } else if (!strcmp(op_name, "assertSameLsidOnLastTwoCommands")) { if (!ctx->sent_lsids[0] || !ctx->sent_lsids[1]) { test_error("attempting to check last two session IDs, but test " "runner has not captured them"); } BSON_ASSERT(bson_equal(ctx->sent_lsids[0], ctx->sent_lsids[1])); } else if (!strcmp(op_name, "assertDifferentLsidOnLastTwoCommands")) { if (!ctx->sent_lsids[0] || !ctx->sent_lsids[1]) { test_error("attempting to check last two session IDs, but test " "runner has not captured them"); } BSON_ASSERT(!bson_equal(ctx->sent_lsids[0], ctx->sent_lsids[1])); } else if (!strcmp(op_name, "assertCollectionExists")) { mongoc_client_t *client; bool exists; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); exists = collection_exists(client, operation); mongoc_client_destroy(client); BSON_ASSERT(exists); } else if (!strcmp(op_name, "assertCollectionNotExists")) { mongoc_client_t *client; bool exists; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); exists = collection_exists(client, operation); mongoc_client_destroy(client); BSON_ASSERT(!exists); } else if (!strcmp(op_name, "assertIndexExists")) { mongoc_client_t *client; bool exists; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); exists = index_exists(client, operation); mongoc_client_destroy(client); BSON_ASSERT(exists); } else if (!strcmp(op_name, "assertIndexNotExists")) { mongoc_client_t *client; bool exists; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); exists = index_exists(client, operation); mongoc_client_destroy(client); BSON_ASSERT(!exists); } else if (!strcmp(op_name, "waitForEvent")) { wait_for_event(ctx, operation); } else if (!strcmp(op_name, "assertEventCount")) { assert_event_count(ctx, operation); } else if (!strcmp(op_name, "configureFailPoint")) { mongoc_client_t *client; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); activate_fail_point(client, 0 /* primary */, operation, "arguments.failPoint"); mongoc_client_destroy(client); } else if (!strcmp(op_name, "wait")) { mlib_sleep_for(bson_lookup_int32(operation, "arguments.ms"), ms); } else if (!strcmp(op_name, "recordPrimary")) { /* It doesn't matter who the primary is. We just want to assert in * tests later that the primary changed x times after this operation. */ bson_mutex_lock(&ctx->mutex); ctx->measured_PrimaryChangedEvent = ctx->total_PrimaryChangedEvent; bson_mutex_unlock(&ctx->mutex); } else if (!strcmp(op_name, "runAdminCommand")) { mongoc_client_t *client; mongoc_database_t *admin_db; client = test_framework_client_new_from_uri(ctx->client->uri, NULL); test_framework_set_ssl_opts(client); admin_db = mongoc_client_get_database(client, "admin"); bson_destroy(reply); res = command(admin_db, test, operation, session, read_prefs, reply); if (!res) { test_error("admin command failed: %s", bson_as_relaxed_extended_json(reply, NULL)); } mongoc_database_destroy(admin_db); mongoc_client_destroy(client); } else if (!strcmp(op_name, "waitForPrimaryChange")) { wait_for_primary_change(ctx, operation); } else if (!strcmp(op_name, "startThread")) { json_test_worker_thread_t *wt; wt = thread_from_name(ctx, bson_lookup_utf8(operation, "arguments.name")); start_thread(wt); } else if (!strcmp(op_name, "waitForThread")) { json_test_worker_thread_t *wt; wt = thread_from_name(ctx, bson_lookup_utf8(operation, "arguments.name")); wait_for_thread(wt); } else if (!strcmp(op_name, "runOnThread")) { json_test_worker_thread_t *wt; bson_t op; bson_lookup_doc(operation, "arguments.operation", &op); wt = thread_from_name(ctx, bson_lookup_utf8(operation, "arguments.name")); run_on_thread(wt, &op); } else if (!strcmp(op_name, "assertSessionTransactionState")) { assert_session_transaction_state(ctx, operation); } else { test_error("unrecognized testRunner operation name %s", op_name); } } else if (!strcmp(obj_name, "client")) { if (!strcmp(op_name, "listDatabases")) { res = list_databases(c->client, test, operation, session, reply); } else if (!strcmp(op_name, "listDatabaseNames")) { res = list_database_names(c->client, test, operation, session, reply); } else if (!strcmp(op_name, "watch")) { bson_t pipeline = BSON_INITIALIZER; mongoc_change_stream_destroy(ctx->change_stream); ctx->change_stream = mongoc_client_watch(c->client, &pipeline, NULL); res = (op_error(operation) == (0 != ctx->change_stream->err.code)); if (!res) { test_error("expected error=%s, but actual error='%s'", op_error(operation) ? "true" : "false", ctx->change_stream->err.message); } bson_init(reply); bson_destroy(&pipeline); } else if (!strcmp(op_name, "listDatabaseObjects")) { test_error("listDatabaseObjects is not implemented in libmongoc"); } else { test_error("unrecognized client operation name %s", op_name); } } else if (!strcmp(obj_name, "gridfsbucket")) { if (!strcmp(op_name, "download")) { res = gridfs_download(db, test, operation, session, read_prefs, reply); } else if (!strcmp(op_name, "download_by_name")) { test_error("download_by_name is part of the optional advanced API " "and not implemented in libmongoc"); } else { test_error("unrecognized gridfs operation name %s", op_name); } } else { test_error("unrecognized object name %s", obj_name); } mongoc_read_prefs_destroy(read_prefs); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(c); mongoc_database_destroy(db); return res; } static void one_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { const char *op_name; mongoc_write_concern_t *wc = NULL; op_name = bson_lookup_utf8(operation, "name"); if (ctx->verbose) { char *op_str; op_str = bson_as_relaxed_extended_json(operation, NULL); MONGOC_DEBUG(" running operation %s : %s\n", op_name, op_str); bson_free(op_str); } if (bson_has_field(operation, "arguments.writeConcern")) { wc = bson_lookup_write_concern(operation, "arguments.writeConcern"); } else if (bson_has_field(operation, "collectionOptions.writeConcern")) { wc = bson_lookup_write_concern(operation, "collectionOptions.writeConcern"); } if (wc) { ctx->acknowledged = mongoc_write_concern_is_acknowledged(wc); mongoc_write_concern_destroy(wc); } else { ctx->acknowledged = true; } if (ctx->config->run_operation_cb) { ctx->config->run_operation_cb(ctx, test, operation); } else { test_error("set json_test_config_t.run_operation_cb to a callback" " that executes json_test_operation()"); } } void json_test_operations(json_test_ctx_t *ctx, const bson_t *test) { bson_t operations; bson_t operation; bson_iter_t iter; /* run each CRUD operation in the test, using the config's run-operation * callback, by default json_test_operation(). retryable writes tests have * one operation each, transactions tests have an array of them. */ if (bson_has_field(test, "operation")) { bson_lookup_doc(test, "operation", &operation); one_operation(ctx, test, &operation); } else { bson_lookup_doc(test, "operations", &operations); BSON_ASSERT(bson_iter_init(&iter, &operations)); while (bson_iter_next(&iter)) { bson_iter_bson(&iter, &operation); one_operation(ctx, test, &operation); } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json-test-operations.h000066400000000000000000000065721511661753600245530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef JSON_TEST_OPERATIONS_H #define JSON_TEST_OPERATIONS_H struct _json_test_config_t; #include #include #include #include #include struct _json_test_ctx_t; typedef struct { struct _json_test_ctx_t *ctx; bson_thread_t thread; sync_queue_t *queue; bson_mutex_t mutex; mongoc_cond_t cond; bool shutdown_requested; } json_test_worker_thread_t; typedef struct _json_test_ctx_t { const struct _json_test_config_t *config; uint32_t n_events; bson_t events; mongoc_uri_t *test_framework_uri; mongoc_client_session_t *sessions[2]; bson_t lsids[2]; bool acknowledged; bool verbose; bool has_sessions; mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; mongoc_change_stream_t *change_stream; /* Sessions tests check the most recently sent two lsid's */ bson_t *sent_lsids[2]; bson_mutex_t mutex; /* The total number of times a server description was marked unknown. */ int64_t total_ServerMarkedUnknownEvent; /* How many were accounted for in the test. */ int64_t measured_ServerMarkedUnknownEvent; /* How many connection generation increments were accounted for in the test. */ int64_t measured_PoolClearedEvent; mongoc_host_list_t primary_host; int64_t total_PrimaryChangedEvent; int64_t measured_PrimaryChangedEvent; json_test_worker_thread_t *worker_threads[2]; } json_test_ctx_t; mongoc_client_session_t * session_from_name(json_test_ctx_t *ctx, const char *session_name); void json_test_ctx_init(json_test_ctx_t *ctx, const bson_t *test, mongoc_client_t *client, mongoc_database_t *db, mongoc_collection_t *collection, const struct _json_test_config_t *config); void json_test_ctx_end_sessions(json_test_ctx_t *ctx); void json_test_ctx_cleanup(json_test_ctx_t *ctx); typedef bool (*json_test_operation_cb_t)(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation); typedef void (*json_test_cb_t)(json_test_ctx_t *ctx, const bson_t *test); bool json_test_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation, mongoc_collection_t *collection, mongoc_client_session_t *session, bson_t *reply); void json_test_operations(json_test_ctx_t *ctx, const bson_t *test); void check_result( const bson_t *test, const bson_t *operation, bool succeeded, const bson_value_t *result, const bson_error_t *error); json_test_worker_thread_t * worker_thread_new(json_test_ctx_t *ctx); void worker_thread_destroy(json_test_worker_thread_t *wt); #endif mongo-c-driver-2.2.1/src/libmongoc/tests/json-test.c000066400000000000000000002061621511661753600223620ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef _MSC_VER #include #else #include #endif #ifdef BSON_HAVE_STRINGS_H #include #endif mongoc_topology_description_type_t topology_type_from_test(const char *type) { if (strcmp(type, "ReplicaSetWithPrimary") == 0) { return MONGOC_TOPOLOGY_RS_WITH_PRIMARY; } else if (strcmp(type, "ReplicaSetNoPrimary") == 0) { return MONGOC_TOPOLOGY_RS_NO_PRIMARY; } else if (strcmp(type, "Unknown") == 0) { return MONGOC_TOPOLOGY_UNKNOWN; } else if (strcmp(type, "Single") == 0) { return MONGOC_TOPOLOGY_SINGLE; } else if (strcmp(type, "Sharded") == 0) { return MONGOC_TOPOLOGY_SHARDED; } else if (strcmp(type, "LoadBalanced") == 0) { return MONGOC_TOPOLOGY_LOAD_BALANCED; } fprintf(stderr, "can't parse this: %s", type); BSON_ASSERT(0); return 0; } mongoc_server_description_type_t server_type_from_test(const char *type) { if (strcmp(type, "RSPrimary") == 0) { return MONGOC_SERVER_RS_PRIMARY; } else if (strcmp(type, "RSSecondary") == 0) { return MONGOC_SERVER_RS_SECONDARY; } else if (strcmp(type, "Standalone") == 0) { return MONGOC_SERVER_STANDALONE; } else if (strcmp(type, "Mongos") == 0) { return MONGOC_SERVER_MONGOS; } else if (strcmp(type, "PossiblePrimary") == 0) { return MONGOC_SERVER_POSSIBLE_PRIMARY; } else if (strcmp(type, "RSArbiter") == 0) { return MONGOC_SERVER_RS_ARBITER; } else if (strcmp(type, "RSOther") == 0) { return MONGOC_SERVER_RS_OTHER; } else if (strcmp(type, "RSGhost") == 0) { return MONGOC_SERVER_RS_GHOST; } else if (strcmp(type, "Unknown") == 0) { return MONGOC_SERVER_UNKNOWN; } else if (strcmp(type, "LoadBalancer") == 0) { return MONGOC_SERVER_LOAD_BALANCER; } fprintf(stderr, "ERROR: Unknown server type %s\n", type); BSON_ASSERT(0); return 0; } static mongoc_read_mode_t read_mode_from_test(const char *mode) { if (bson_strcasecmp(mode, "Primary") == 0) { return MONGOC_READ_PRIMARY; } else if (bson_strcasecmp(mode, "PrimaryPreferred") == 0) { return MONGOC_READ_PRIMARY_PREFERRED; } else if (bson_strcasecmp(mode, "Secondary") == 0) { return MONGOC_READ_SECONDARY; } else if (bson_strcasecmp(mode, "SecondaryPreferred") == 0) { return MONGOC_READ_SECONDARY_PREFERRED; } else if (bson_strcasecmp(mode, "Nearest") == 0) { return MONGOC_READ_NEAREST; } else { test_error("Unknown read preference mode \"%s\"", mode); } return MONGOC_READ_PRIMARY; } static mongoc_ss_optype_t optype_from_test(const char *op) { if (strcmp(op, "read") == 0) { return MONGOC_SS_READ; } else if (strcmp(op, "write") == 0) { return MONGOC_SS_WRITE; } return MONGOC_SS_READ; } /* *----------------------------------------------------------------------- * * server_description_by_hostname -- * * Return a reference to a mongoc_server_description_t or NULL. * *----------------------------------------------------------------------- */ const mongoc_server_description_t * server_description_by_hostname(const mongoc_topology_description_t *topology, const char *address) { const mongoc_set_t *set = mc_tpld_servers_const(topology); const mongoc_server_description_t *server_iter; for (size_t i = 0; i < set->items_len; i++) { server_iter = mongoc_set_get_item_const(mc_tpld_servers_const(topology), i); if (strcasecmp(address, server_iter->connection_address) == 0) { return server_iter; } } return NULL; } /* *----------------------------------------------------------------------- * * process_sdam_test_hello_responses -- * * Update a topology description with the hello responses in a "phase" * from an SDAM or SDAM Monitoring test, like: * * [ * [ * "a:27017", * { * "ok": 1, * "isWritablePrimary": false * } * ] * ] * * See: * https://github.com/mongodb/specifications/tree/master/source/server-discovery-and-monitoring/tests * *----------------------------------------------------------------------- */ void process_sdam_test_hello_responses(bson_t *phase, mongoc_topology_t *topology) { bson_iter_t phase_field_iter; const char *hostname; if (bson_iter_init_find(&phase_field_iter, phase, "description")) { const char *description; description = bson_iter_utf8(&phase_field_iter, NULL); MONGOC_DEBUG("phase: %s", description); } /* grab hello responses (if present) and feed them to topology */ if (bson_iter_init_find(&phase_field_iter, phase, "responses")) { bson_t hellos; bson_t hello; bson_t response; bson_iter_t hello_iter; bson_iter_t hello_field_iter; bson_iter_bson(&phase_field_iter, &hellos); bson_iter_init(&hello_iter, &hellos); while (bson_iter_next(&hello_iter)) { mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); mongoc_server_description_t const *sd; bson_iter_bson(&hello_iter, &hello); bson_iter_init_find(&hello_field_iter, &hello, "0"); hostname = bson_iter_utf8(&hello_field_iter, NULL); /* Each handle_hello can invalidate the topology */ sd = server_description_by_hostname(tdmod.new_td, hostname); /* if server has been removed from topology, skip */ if (!sd) { mc_tpld_modify_drop(tdmod); continue; } bson_iter_init_find(&hello_field_iter, &hello, "1"); bson_iter_bson(&hello_field_iter, &response); /* send hello through the topology description's handler */ capture_logs(true); mongoc_topology_description_handle_hello(tdmod.new_td, &topology->log_and_monitor, sd->id, &response, 1, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_IGNORE, NULL); if (mc_tpld_servers_const(tdmod.new_td)->items_len == 0) { ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_WARNING, "Last server removed from topology"); } capture_logs(false); mc_tpld_modify_commit(tdmod); } } else if (bson_iter_init_find(&phase_field_iter, phase, "applicationErrors")) { bson_t app_errors; bson_iter_t app_error_iter; bson_t app_error; bson_iter_t app_error_field_iter; bson_iter_bson(&phase_field_iter, &app_errors); bson_iter_init(&app_error_iter, &app_errors); while (bson_iter_next(&app_error_iter)) { uint32_t generation = 0; const char *when_str; bool handshake_complete = false; const char *type_str; _mongoc_sdam_app_error_type_t type = 0; bson_t response; bson_error_t err; mongoc_server_description_t const *sd; mc_shared_tpld td = mc_tpld_take_ref(topology); bson_iter_bson(&app_error_iter, &app_error); bson_iter_init_find(&app_error_field_iter, &app_error, "address"); hostname = bson_iter_utf8(&app_error_field_iter, NULL); /* Each handle_app_error can invalidate the topology */ sd = server_description_by_hostname(td.ptr, hostname); /* if server has been removed from topology, skip */ if (!sd) { mc_tpld_drop_ref(&td); continue; } if (bson_iter_init_find(&app_error_field_iter, &app_error, "generation")) { BSON_ASSERT(BSON_ITER_HOLDS_INT32(&app_error_field_iter)); generation = bson_iter_int32(&app_error_field_iter); } else { /* Default to the current generation. */ generation = mc_tpl_sd_get_generation(sd, &kZeroObjectId); } BSON_ASSERT(bson_iter_init_find(&app_error_field_iter, &app_error, "maxWireVersion")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&app_error_field_iter)); BSON_ASSERT(bson_iter_init_find(&app_error_field_iter, &app_error, "when")); BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&app_error_field_iter)); when_str = bson_iter_utf8(&app_error_field_iter, 0); if (0 == strcmp(when_str, "beforeHandshakeCompletes")) { handshake_complete = false; } else if (0 == strcmp(when_str, "afterHandshakeCompletes")) { handshake_complete = true; } else { test_error("unexpected 'when' value: %s", when_str); } BSON_ASSERT(bson_iter_init_find(&app_error_field_iter, &app_error, "type")); BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&app_error_field_iter)); type_str = bson_iter_utf8(&app_error_field_iter, 0); if (0 == strcmp(type_str, "command")) { type = MONGOC_SDAM_APP_ERROR_COMMAND; } else if (0 == strcmp(type_str, "network")) { type = MONGOC_SDAM_APP_ERROR_NETWORK; } else if (0 == strcmp(type_str, "timeout")) { type = MONGOC_SDAM_APP_ERROR_TIMEOUT; } else { test_error("unexpected 'type' value: %s", type_str); } if (MONGOC_SDAM_APP_ERROR_COMMAND == type) { BSON_ASSERT(bson_iter_init_find(&app_error_field_iter, &app_error, "response")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&app_error_field_iter)); bson_iter_bson(&app_error_field_iter, &response); } memset(&err, 0, sizeof(bson_error_t)); _mongoc_topology_handle_app_error( topology, sd->id, handshake_complete, type, &response, &err, generation, &kZeroObjectId); mc_tpld_drop_ref(&td); } } } /* *----------------------------------------------------------------------- * * test_server_selection_logic_cb -- * * Runs the JSON tests for server selection logic that are * included with the Server Selection spec. * *----------------------------------------------------------------------- */ void test_server_selection_logic_cb(void *test_vp) { bool expected_error; bson_error_t error; int32_t heartbeat_msec; mongoc_topology_description_t topology; mongoc_server_description_t *sd; mongoc_read_prefs_t *read_prefs; mongoc_read_mode_t read_mode; mongoc_ss_optype_t op; bson_iter_t iter; bson_iter_t topology_iter; bson_iter_t server_iter; bson_iter_t sd_iter; bson_iter_t read_pref_iter; bson_iter_t tag_sets_iter; bson_iter_t last_write_iter; bson_iter_t expected_servers_iter; bson_t first_tag_set; bson_t test_topology; bson_t test_servers; bson_t server; bson_t test_read_pref; bson_t test_tag_sets; uint32_t i = 0; bool matched_servers[50]; mongoc_array_t selected_servers; _mongoc_array_init(&selected_servers, sizeof(mongoc_server_description_t *)); BSON_ASSERT(test_vp); const bson_t *const test = test_vp; expected_error = bson_iter_init_find(&iter, test, "error") && bson_iter_as_bool(&iter); heartbeat_msec = MONGOC_TOPOLOGY_HEARTBEAT_FREQUENCY_MS_SINGLE_THREADED; if (bson_iter_init_find(&iter, test, "heartbeatFrequencyMS")) { heartbeat_msec = bson_iter_int32(&iter); } /* pull out topology description field */ BSON_ASSERT(bson_iter_init_find(&iter, test, "topology_description")); bson_iter_bson(&iter, &test_topology); /* set topology state from test */ BSON_ASSERT(bson_iter_init_find(&topology_iter, &test_topology, "type")); mongoc_topology_description_init(&topology, heartbeat_msec); topology.type = topology_type_from_test(bson_iter_utf8(&topology_iter, NULL)); /* for each server description in test, add server to our topology */ BSON_ASSERT(bson_iter_init_find(&topology_iter, &test_topology, "servers")); bson_iter_bson(&topology_iter, &test_servers); bson_iter_init(&server_iter, &test_servers); while (bson_iter_next(&server_iter)) { bson_iter_bson(&server_iter, &server); /* initialize new server description with given address */ sd = (mongoc_server_description_t *)bson_malloc0(sizeof *sd); BSON_ASSERT(bson_iter_init_find(&sd_iter, &server, "address")); mongoc_server_description_init(sd, bson_iter_utf8(&sd_iter, NULL), i++); BSON_ASSERT(bson_iter_init_find(&sd_iter, &server, "type")); sd->type = server_type_from_test(bson_iter_utf8(&sd_iter, NULL)); if (bson_iter_init_find(&sd_iter, &server, "avg_rtt_ms")) { sd->round_trip_time_msec = bson_iter_int32(&sd_iter); } else if (sd->type != MONGOC_SERVER_UNKNOWN) { test_error("%s has no avg_rtt_ms", sd->host.host_and_port); } if (bson_iter_init_find(&sd_iter, &server, "maxWireVersion")) { sd->max_wire_version = (int32_t)bson_iter_as_int64(&sd_iter); } if (bson_iter_init_find(&sd_iter, &server, "lastUpdateTime")) { sd->last_update_time_usec = bson_iter_as_int64(&sd_iter) * 1000; } if (bson_iter_init_find(&sd_iter, &server, "lastWrite")) { BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&sd_iter) && bson_iter_recurse(&sd_iter, &last_write_iter) && bson_iter_find(&last_write_iter, "lastWriteDate") && BSON_ITER_HOLDS_INT(&last_write_iter)); sd->last_write_date_ms = bson_iter_as_int64(&last_write_iter); } if (bson_iter_init_find(&sd_iter, &server, "tags")) { bson_destroy(&sd->tags); bson_iter_bson(&sd_iter, &sd->tags); } /* add new server to our topology description */ mongoc_set_add(mc_tpld_servers(&topology), sd->id, sd); } /* create read preference document from test */ BSON_ASSERT(bson_iter_init_find(&iter, test, "read_preference")); bson_iter_bson(&iter, &test_read_pref); if (bson_iter_init_find(&read_pref_iter, &test_read_pref, "mode")) { read_mode = read_mode_from_test(bson_iter_utf8(&read_pref_iter, NULL)); ASSERT_CMPINT(read_mode, !=, 0); } else { read_mode = MONGOC_READ_PRIMARY; } read_prefs = mongoc_read_prefs_new(read_mode); if (bson_iter_init_find(&read_pref_iter, &test_read_pref, "tag_sets")) { /* ignore "tag_sets: [{}]" */ if (bson_iter_recurse(&read_pref_iter, &tag_sets_iter) && bson_iter_next(&tag_sets_iter) && BSON_ITER_HOLDS_DOCUMENT(&tag_sets_iter)) { bson_iter_bson(&tag_sets_iter, &first_tag_set); if (!bson_empty(&first_tag_set)) { /* not empty */ bson_iter_bson(&read_pref_iter, &test_tag_sets); mongoc_read_prefs_set_tags(read_prefs, &test_tag_sets); } } } if (bson_iter_init_find(&read_pref_iter, &test_read_pref, "maxStalenessSeconds")) { mongoc_read_prefs_set_max_staleness_seconds(read_prefs, bson_iter_as_int64(&read_pref_iter)); } /* get operation type */ op = MONGOC_SS_READ; if (bson_iter_init_find(&iter, test, "operation")) { op = optype_from_test(bson_iter_utf8(&iter, NULL)); } if (expected_error) { BSON_ASSERT(!mongoc_read_prefs_is_valid(read_prefs) || !mongoc_topology_compatible(&topology, read_prefs, &error)); goto DONE; } /* no expected error */ BSON_ASSERT(mongoc_read_prefs_is_valid(read_prefs)); BSON_ASSERT(mongoc_topology_compatible(&topology, read_prefs, &error)); /* read in latency window servers */ BSON_ASSERT(bson_iter_init_find(&iter, test, "in_latency_window")); /* TODO: use topology_select instead? */ mongoc_topology_description_suitable_servers( &selected_servers, op, &topology, read_prefs, NULL, NULL, MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS); /* check each server in expected_servers is in selected_servers */ memset(matched_servers, 0, sizeof(matched_servers)); bson_iter_recurse(&iter, &expected_servers_iter); while (bson_iter_next(&expected_servers_iter)) { bool found = false; bson_iter_t host; BSON_ASSERT(bson_iter_recurse(&expected_servers_iter, &host)); BSON_ASSERT(bson_iter_find(&host, "address")); for (i = 0; i < selected_servers.len; i++) { sd = _mongoc_array_index(&selected_servers, mongoc_server_description_t *, i); if (strcmp(sd->host.host_and_port, bson_iter_utf8(&host, NULL)) == 0) { found = true; break; } } if (!found) { test_error("Should have been selected but wasn't: %s", bson_iter_utf8(&host, NULL)); } matched_servers[i] = true; } /* check each server in selected_servers is in expected_servers */ for (i = 0; i < selected_servers.len; i++) { if (!matched_servers[i]) { sd = _mongoc_array_index(&selected_servers, mongoc_server_description_t *, i); test_error("Shouldn't have been selected but was: %s", sd->host.host_and_port); } } DONE: mongoc_read_prefs_destroy(read_prefs); mongoc_topology_description_cleanup(&topology); _mongoc_array_destroy(&selected_servers); } /* *----------------------------------------------------------------------- * * assemble_path -- * * Given a parent directory and filename, compile a full path to * the child file. * * "dst" receives the joined path, delimited by "/" even on Windows. * *----------------------------------------------------------------------- */ void assemble_path(const char *parent_path, const char *child_name, char *dst /* OUT */) { char *p; int path_len = (int)strlen(parent_path); int name_len = (int)strlen(child_name); BSON_ASSERT(path_len + name_len + 1 < MAX_TEST_NAME_LENGTH); memset(dst, '\0', MAX_TEST_NAME_LENGTH * sizeof(char)); strcat(dst, parent_path); strcat(dst, "/"); strcat(dst, child_name); for (p = dst; *p; ++p) { if (*p == '\\') { *p = '/'; } } } /* *----------------------------------------------------------------------- * * collect_tests_from_dir -- * * Recursively search the directory at @dir_path for files with * '.json' in their filenames. Append all found file paths to * @paths, and return the number of files found. * *----------------------------------------------------------------------- */ int collect_tests_from_dir(char (*paths)[MAX_TEST_NAME_LENGTH] /* OUT */, const char *dir_path, int paths_index, int max_paths) { #ifdef _MSC_VER char *dir_path_plus_star; intptr_t handle; struct _finddata_t info; char child_path[MAX_TEST_NAME_LENGTH]; dir_path_plus_star = bson_strdup_printf("%s/*", dir_path); handle = _findfirst(dir_path_plus_star, &info); if (handle == -1) { bson_free(dir_path_plus_star); return 0; } while (1) { BSON_ASSERT(paths_index < max_paths); if (info.attrib & _A_SUBDIR) { /* recursively call on child directories */ if (strcmp(info.name, "..") != 0 && strcmp(info.name, ".") != 0) { assemble_path(dir_path, info.name, child_path); paths_index = collect_tests_from_dir(paths, child_path, paths_index, max_paths); } } else if (strstr(info.name, ".json")) { /* if this is a JSON test, collect its path */ assemble_path(dir_path, info.name, paths[paths_index++]); } if (_findnext(handle, &info) == -1) { break; } } bson_free(dir_path_plus_star); _findclose(handle); return paths_index; #else struct dirent *entry; struct stat dir_stat; char child_path[MAX_TEST_NAME_LENGTH]; DIR *dir; dir = opendir(dir_path); if (!dir) { test_error("Cannot open \"%s\"\n" "Run test-libmongoc in repository root directory.", dir_path); } while ((entry = readdir(dir))) { BSON_ASSERT(paths_index < max_paths); if (strcmp(entry->d_name, "..") == 0 || strcmp(entry->d_name, ".") == 0) { continue; } assemble_path(dir_path, entry->d_name, child_path); if (0 == stat(child_path, &dir_stat) && S_ISDIR(dir_stat.st_mode)) { /* recursively call on child directories */ paths_index = collect_tests_from_dir(paths, child_path, paths_index, max_paths); } else if (strstr(entry->d_name, ".json")) { /* if this is a JSON test, collect its path */ assemble_path(dir_path, entry->d_name, paths[paths_index++]); } } closedir(dir); return paths_index; #endif } /* *----------------------------------------------------------------------- * * get_bson_from_json_file -- * * Open the file at @filename and store its contents in a * bson_t. This function assumes that @filename contains a * single JSON object. * * NOTE: caller owns returned bson_t and must free it. * *----------------------------------------------------------------------- */ bson_t * get_bson_from_json_file(const char *filename) { FILE *const file = fopen(filename, "rb"); if (!file) { test_error("Failed to open JSON file: %s", filename); } /* get file length */ fseek(file, 0, SEEK_END); const long length = ftell(file); fseek(file, 0, SEEK_SET); if (length < 1) { test_error("Failed to read length of JSON file: %s", filename); } /* read entire file into buffer */ char *const buffer = (char *)bson_malloc0(length); const size_t nread = fread(buffer, 1, length, file); fclose(file); if (mlib_cmp(nread, !=, length)) { test_error("Failed to read JSON file [%s] into buffer", filename); } /* convert to bson */ bson_error_t error; bson_t *const data = bson_new_from_json((const uint8_t *)buffer, length, &error); if (!data) { test_error("Cannot parse %s: %s", filename, error.message); } bson_free(buffer); return data; } static bool check_version_info(const bson_t *scenario, bool print_reason) { const char *s; char *padded; server_version_t test_version, server_version; if (bson_has_field(scenario, "maxServerVersion")) { s = bson_lookup_utf8(scenario, "maxServerVersion"); /* s is like "3.0", don't skip if server is 3.0.x but skip 3.1+ */ padded = bson_strdup_printf("%s.99", s); test_version = test_framework_str_to_version(padded); bson_free(padded); server_version = test_framework_get_server_version(); if (server_version > test_version) { if (print_reason && test_suite_debug_output()) { printf(" SKIP, maxServerVersion=\"%s\"\n", s); fflush(stdout); } return false; } } if (bson_has_field(scenario, "minServerVersion")) { s = bson_lookup_utf8(scenario, "minServerVersion"); test_version = test_framework_str_to_version(s); server_version = test_framework_get_server_version(); if (server_version < test_version) { if (print_reason && test_suite_debug_output()) { printf(" SKIP, minServerVersion=\"%s\"\n", s); fflush(stdout); } return false; } } if (bson_has_field(scenario, "topology")) { bson_iter_t iter; bson_t topology; char *current_topology; BSON_ASSERT(bson_iter_init_find(&iter, scenario, "topology")); BSON_ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); bson_iter_bson(&iter, &topology); /* Determine cluster type */ if (test_framework_is_loadbalanced()) { current_topology = "load-balanced"; } else if (test_framework_is_mongos()) { current_topology = "sharded"; } else if (test_framework_is_replset()) { current_topology = "replicaset"; } else { current_topology = "single"; } bson_iter_init(&iter, &topology); while (bson_iter_next(&iter)) { const char *test_topology; BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); test_topology = bson_iter_utf8(&iter, NULL); if (strcmp(test_topology, current_topology) == 0) { return true; } } /* If we didn't match any of the listed topologies, skip */ if (print_reason && test_suite_debug_output()) { printf(" SKIP, test topologies do not match current %s setup\n", current_topology); fflush(stdout); } return false; } return true; } bool check_scenario_version(const bson_t *scenario) { /* version info can be nested inside "runOn" array */ if (bson_has_field(scenario, "runOn")) { bson_iter_t iter; bson_t run_on; bson_t version_info; bson_lookup_doc(scenario, "runOn", &run_on); BSON_ASSERT(bson_iter_init(&iter, &run_on)); while (bson_iter_next(&iter)) { bson_iter_bson(&iter, &version_info); if (check_version_info(&version_info, false)) { return true; } } if (test_suite_debug_output()) { printf(" SKIP, no matching topologies in runOn\n"); fflush(stdout); } return false; } return check_version_info(scenario, true); } static int check_test_version(const bson_t *test) { const char *s; char *padded; server_version_t test_version, server_version; if (bson_has_field(test, "minServerVersion")) { s = bson_lookup_utf8(test, "minServerVersion"); test_version = test_framework_str_to_version(s); server_version = test_framework_get_server_version(); if (server_version < test_version) { if (test_suite_debug_output()) { printf(" SKIP, minServerVersion %s\n", s); fflush(stdout); } return false; } } if (bson_has_field(test, "maxServerVersion")) { s = bson_lookup_utf8(test, "maxServerVersion"); test_version = test_framework_str_to_version(s); server_version = test_framework_get_server_version(); if (server_version >= test_version) { if (test_suite_debug_output()) { printf(" SKIP, maxServerVersion %s\n", s); fflush(stdout); } return false; } } if (bson_has_field(test, "ignore_if_server_version_greater_than")) { s = bson_lookup_utf8(test, "ignore_if_server_version_greater_than"); /* s is like "3.0", don't skip if server is 3.0.x but skip 3.1+ */ padded = bson_strdup_printf("%s.99", s); test_version = test_framework_str_to_version(padded); bson_free(padded); server_version = test_framework_get_server_version(); if (server_version > test_version) { if (test_suite_debug_output()) { printf(" SKIP, ignore_if_server_version_greater_than %s\n", s); fflush(stdout); } return false; } } if (bson_has_field(test, "ignore_if_server_version_less_than")) { s = bson_lookup_utf8(test, "ignore_if_server_version_less_than"); test_version = test_framework_str_to_version(s); server_version = test_framework_get_server_version(); if (server_version < test_version) { if (test_suite_debug_output()) { printf(" SKIP, ignore_if_server_version_less_than %s\n", s); fflush(stdout); } return false; } } /* server version is ok, don't skip the test */ return true; } /* is this test allowed to run against the current test topology? */ static bool check_topology_type(const bson_t *test) { bson_iter_t iter; bson_iter_t child; const char *s; bool compatible; bool is_mongos; bool is_replset; bool is_single; bool match; bool can_proceed; /* "topology" is an array of compatible topologies. * "ignore_if_topology_type" is an array of incompatible types. * So far, the only valid values are "single", "sharded", and "replicaset" */ if (bson_iter_init_find(&iter, test, "topology")) { compatible = true; } else if (bson_iter_init_find(&iter, test, "ignore_if_topology_type")) { compatible = false; } else { return true; } ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &child)); is_mongos = test_framework_is_mongos(); is_replset = test_framework_is_replset(); is_single = !is_mongos && !is_replset; match = false; while (bson_iter_next(&child)) { if (BSON_ITER_HOLDS_UTF8(&child)) { s = bson_iter_utf8(&child, NULL); if (!strcmp(s, "sharded") && is_mongos) { match = true; } else if (!strcmp(s, "replicaset") && is_replset) { match = true; } else if (!strcmp(s, "single") && is_single) { match = true; } } } can_proceed = (compatible == match); if (!can_proceed && test_suite_debug_output()) { printf(" SKIP, incompatible topology type\n"); fflush(stdout); } return can_proceed; } /* _recreate drops and creates db_name.collection_name. * If 'scenario' contains 'json_schema', the collection is created with a JSON * schema validator. Refer: * https://github.com/mongodb/specifications/tree/d68e85c33c5a3b02bcd8a32a0bec9f11471e41ad/source/client-side-encryption/tests#spec-test-format */ static void _recreate(const char *db_name, const char *collection_name, const bson_t *scenario) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_database_t *db; bson_t *opts; bson_iter_t iter; bson_error_t error; bson_t *drop_opts; if (!db_name || !collection_name) { return; } /* Use a separate internal client for test setup. */ client = test_framework_new_default_client(); drop_opts = bson_new(); collection = mongoc_client_get_collection(client, db_name, collection_name); if (bson_iter_init_find(&iter, scenario, "encrypted_fields")) { bson_t encrypted_fields; bson_iter_bson(&iter, &encrypted_fields); BCON_APPEND(drop_opts, "encryptedFields", BCON_DOCUMENT(&encrypted_fields)); } if (!mongoc_collection_drop_with_opts(collection, drop_opts, &error)) { /* Ignore "namespace does not exist" error. */ ASSERT_OR_PRINT(error.code == 26, error); } bson_destroy(drop_opts); mongoc_collection_drop(collection, NULL); mongoc_collection_destroy(collection); opts = bson_new(); if (bson_iter_init_find(&iter, scenario, "json_schema")) { bson_t json_schema; bson_iter_bson(&iter, &json_schema); BCON_APPEND(opts, "validator", "{", "$jsonSchema", BCON_DOCUMENT(&json_schema), "}"); } if (bson_iter_init_find(&iter, scenario, "encrypted_fields")) { bson_t encrypted_fields; bson_iter_bson(&iter, &encrypted_fields); BCON_APPEND(opts, "encryptedFields", BCON_DOCUMENT(&encrypted_fields)); } db = mongoc_client_get_database(client, db_name); collection = mongoc_database_create_collection(db, collection_name, opts, &error); ASSERT_OR_PRINT(collection, error); bson_destroy(opts); mongoc_collection_destroy(collection); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void _insert_data(mongoc_collection_t *collection, bson_t *documents) { bson_iter_t iter; mongoc_bulk_operation_t *bulk; bson_t *majority = tmp_bson("{'writeConcern': {'w': 'majority'}}"); bool r; uint32_t server_id; bson_error_t error; mongoc_collection_delete_many(collection, tmp_bson("{}"), majority, NULL, NULL); if (!bson_count_keys(documents)) { return; } bson_iter_init(&iter, documents); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, majority); while (bson_iter_next(&iter)) { bson_t document; bson_t opts = BSON_INITIALIZER; bson_iter_bson(&iter, &document); r = mongoc_bulk_operation_insert_with_opts(bulk, &document, &opts, &error); ASSERT_OR_PRINT(r, error); bson_destroy(&opts); } server_id = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(server_id, error); mongoc_bulk_operation_destroy(bulk); } /* insert the documents in a spec test scenario's "data" array */ void insert_data(const char *db_name, const char *collection_name, const bson_t *scenario) { mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; bson_t documents; bson_iter_t iter; bson_t *majority = tmp_bson("{'writeConcern': {'w': 'majority'}}"); /* use a fresh client to prepare the collection */ client = test_framework_new_default_client(); db = mongoc_client_get_database(client, db_name); collection = mongoc_database_get_collection(db, collection_name); mongoc_collection_delete_many(collection, tmp_bson("{}"), majority, NULL, NULL); if (!bson_has_field(scenario, "data")) { goto DONE; } bson_iter_init_find(&iter, scenario, "data"); if (BSON_ITER_HOLDS_ARRAY(&iter)) { bson_lookup_doc(scenario, "data", &documents); _insert_data(collection, &documents); } else { /* go through collection: [] */ bson_iter_recurse(&iter, &iter); while (bson_iter_next(&iter)) { bson_t collection_documents; mongoc_collection_destroy(collection); collection = mongoc_database_get_collection(db, bson_iter_key(&iter)); bson_iter_bson(&iter, &collection_documents); _insert_data(collection, &collection_documents); } } DONE: mongoc_database_destroy(db); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } void check_outcome_collection(mongoc_collection_t *collection, bson_t *test) { bson_t data; bson_iter_t iter; mongoc_read_concern_t *rc; mongoc_cursor_t *cursor; bson_t query = BSON_INITIALIZER; mongoc_read_prefs_t *prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); bson_t opts = BSON_INITIALIZER; bson_lookup_doc(test, "outcome.collection.data", &data); ASSERT(bson_iter_init(&iter, &data)); rc = mongoc_read_concern_new(); /* If the collection has had its read_concern set by a test, make sure it's set to LOCAL for this check. */ if (mongoc_read_concern_get_level(collection->read_concern)) { mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_collection_set_read_concern(collection, rc); } BCON_APPEND(&opts, "sort", "{", "_id", BCON_INT32(1), "}"); cursor = mongoc_collection_find_with_opts(collection, &query, &opts, prefs); bson_destroy(&opts); while (bson_iter_next(&iter)) { bson_t expected_doc; const bson_t *actual_doc; bson_iter_bson(&iter, &expected_doc); ASSERT_CURSOR_NEXT(cursor, &actual_doc); assert_match_bson(actual_doc, &expected_doc, false); } ASSERT_CURSOR_DONE(cursor); bson_destroy(&data); mongoc_read_prefs_destroy(prefs); bson_destroy(&query); mongoc_read_concern_destroy(rc); mongoc_cursor_destroy(cursor); } static void execute_test(const json_test_config_t *config, mongoc_client_t *client, mongoc_database_t *db, mongoc_collection_t *collection, bson_t *test) { json_test_ctx_t ctx; uint32_t server_id; bson_error_t error; mongoc_client_t *outcome_client; mongoc_collection_t *outcome_coll; ASSERT(client); if (test_suite_debug_output()) { const char *description = bson_lookup_utf8(test, "description"); printf(" - %s\n", description); fflush(stdout); } if (!check_test_version(test) || !check_topology_type(test)) { return; } /* Select a primary for testing */ const mongoc_ss_log_context_t ss_log_context = {.operation = "configureFailPoint"}; server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); json_test_ctx_init(&ctx, test, client, db, collection, config); if (config->before_test_cb) { config->before_test_cb(&ctx, test); } if (bson_has_field(test, "failPoint")) { activate_fail_point(client, server_id, test, "failPoint"); } set_apm_callbacks(&ctx, client); json_test_operations(&ctx, test); if (config->after_test_cb) { config->after_test_cb(&ctx, test); } json_test_ctx_end_sessions(&ctx); if (bson_has_field(test, "expectations")) { bson_t expectations; bson_iter_t iter; if (bson_iter_init_find(&iter, test, "expectations")) { /* If 'expectations' is explicitly null, skip the check. */ if (!BSON_ITER_HOLDS_NULL(&iter)) { bson_iter_bson(&iter, &expectations); check_json_apm_events(&ctx, &expectations); if (config->events_check_cb) { config->events_check_cb(&ctx.events); } } } } if (bson_has_field(test, "outcome.collection")) { /* Use a fresh client to check the outcome collection. */ outcome_client = test_framework_new_default_client(); if (bson_has_field(test, "outcome.collection.name")) { outcome_coll = mongoc_client_get_collection( outcome_client, mongoc_database_get_name(db), bson_lookup_utf8(test, "outcome.collection.name")); } else { outcome_coll = mongoc_client_get_collection( outcome_client, mongoc_database_get_name(db), mongoc_collection_get_name(collection)); } check_outcome_collection(outcome_coll, test); mongoc_collection_destroy(outcome_coll); mongoc_client_destroy(outcome_client); } mongoc_client_set_apm_callbacks(client, NULL, NULL); json_test_ctx_cleanup(&ctx); if (!_mongoc_cse_is_enabled(client)) { /* The configureFailpoint command is not supported for CSE. * But we need to disable failpoints on the client that knows * the server description for "server_id". I.e. we cannot use * a separate client. So, as a special case, skip disabling * failpoints if CSE is enabled. (the CSE tests don't currently * use failpoints). */ deactivate_fail_points(client, server_id); } } void activate_fail_point(mongoc_client_t *client, const uint32_t server_id, const bson_t *test, const char *key) { bson_t command; bson_error_t error; bool r; ASSERT(client); bson_lookup_doc(test, key, &command); ASSERT_CMPSTR(_mongoc_get_command_name(&command), "configureFailPoint"); if (server_id) { r = mongoc_client_command_simple_with_server_id(client, "admin", &command, NULL, server_id, NULL, &error); } else { /* Use default "primary" read preference. */ r = mongoc_client_command_simple(client, "admin", &command, NULL /* read prefs */, NULL /* reply */, &error); } ASSERT_OR_PRINT(r, error); } /* *----------------------------------------------------------------------- * * deactivate_fail_points -- * * Deactivate the onPrimaryTransactionalWrite fail point, and all * future fail points used in JSON tests. * *----------------------------------------------------------------------- */ void deactivate_fail_points(mongoc_client_t *client, uint32_t server_id) { mongoc_server_description_t *sd; bson_t *command; bool r; bson_error_t error; ASSERT(client); if (server_id) { sd = mongoc_client_get_server_description(client, server_id); BSON_ASSERT(sd); } else { sd = mongoc_client_select_server(client, false, NULL, &error); ASSERT_OR_PRINT(sd, error); } if (sd->type == MONGOC_SERVER_RS_PRIMARY) { command = tmp_bson("{'configureFailPoint': 'onPrimaryTransactionalWrite'," " 'mode': 'off'}"); r = mongoc_client_command_simple_with_server_id(client, "admin", command, NULL, sd->id, NULL, &error); ASSERT_OR_PRINT(r, error); command = tmp_bson("{'configureFailPoint': 'failCommand'," " 'mode': 'off'}"); r = mongoc_client_command_simple_with_server_id(client, "admin", command, NULL, sd->id, NULL, &error); /* ignore error from servers that predate "failCommand" fail point */ if (!r && !strstr(error.message, "failCommand not found")) { ASSERT_OR_PRINT(r, error); } } if (sd->max_wire_version >= WIRE_VERSION_4_4) { /* failGetMoreAfterCursorCheckout added in 4.4 */ command = tmp_bson("{'configureFailPoint': " "'failGetMoreAfterCursorCheckout', 'mode': 'off'}"); r = mongoc_client_command_simple_with_server_id(client, "admin", command, NULL, sd->id, NULL, &error); ASSERT_OR_PRINT(r, error); } mongoc_server_description_destroy(sd); } void set_uri_opts_from_bson(mongoc_uri_t *uri, const bson_t *opts) { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, opts)); while (bson_iter_next(&iter)) { const char *key = bson_iter_key(&iter); /* can't use bson_lookup_write_concern etc. with clientOptions format */ if (!strcmp(key, "w")) { mongoc_write_concern_t *wc = mongoc_write_concern_new(); if (BSON_ITER_HOLDS_UTF8(&iter)) { mongoc_write_concern_set_wtag(wc, bson_iter_utf8(&iter, NULL)); } else if (BSON_ITER_HOLDS_INT(&iter)) { mongoc_write_concern_set_w(wc, (int32_t)bson_iter_as_int64(&iter)); } else { test_error("Unrecognized type for 'w': %d", (int)bson_iter_type(&iter)); } mongoc_uri_set_write_concern(uri, wc); mongoc_write_concern_destroy(wc); } else if (!strcmp(key, "readConcernLevel")) { mongoc_read_concern_t *rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, bson_iter_utf8(&iter, NULL)); mongoc_uri_set_read_concern(uri, rc); mongoc_read_concern_destroy(rc); } else if (!strcmp(key, "readPreference")) { mongoc_read_prefs_t *read_prefs = mongoc_read_prefs_new(read_mode_from_test(bson_iter_utf8(&iter, NULL))); mongoc_uri_set_read_prefs_t(uri, read_prefs); mongoc_read_prefs_destroy(read_prefs); } else if (!strcmp(key, "autoEncryptOpts")) { /* Auto encrypt options are set on constructed client, not in URI. */ } else if (!strcmp(key, "writeConcern")) { mongoc_write_concern_t *wc = bson_lookup_write_concern(opts, "writeConcern"); mongoc_uri_set_write_concern(uri, wc); mongoc_write_concern_destroy(wc); } else if (mongoc_uri_option_is_bool(key)) { mongoc_uri_set_option_as_bool(uri, key, bson_iter_bool(&iter)); } else if (mongoc_uri_option_is_int32(key)) { mongoc_uri_set_option_as_int32(uri, key, bson_iter_int32(&iter)); } else if (mongoc_uri_option_is_utf8(key)) { mongoc_uri_set_option_as_utf8(uri, key, bson_iter_utf8(&iter, NULL)); } else { test_error("Unsupported clientOptions field \"%s\" in %s", key, bson_as_relaxed_extended_json(opts, NULL)); } } } static void set_auto_encryption_opts(mongoc_client_t *client, bson_t *test) { bson_t opts; bson_iter_t iter; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_error_t error; bool ret; bson_t extra; ASSERT(client); if (!bson_has_field(test, "clientOptions.autoEncryptOpts")) { return; } bson_lookup_doc(test, "clientOptions.autoEncryptOpts", &opts); auto_encryption_opts = mongoc_auto_encryption_opts_new(); if (bson_iter_init_find(&iter, &opts, "kmsProviders")) { bson_t kms_providers = BSON_INITIALIZER; bson_t tls_opts = BSON_INITIALIZER; bson_t tmp; bson_iter_bson(&iter, &tmp); bson_copy_to_excluding_noinit( &tmp, &kms_providers, "aws", "awsTemporary", "awsTemporaryNoSessionToken", "azure", "gcp", "kmip", NULL); /* AWS credentials are set from environment variables. */ if (bson_has_field(&opts, "kmsProviders.aws")) { char *const secret_access_key = test_framework_getenv("MONGOC_TEST_AWS_SECRET_ACCESS_KEY"); char *const access_key_id = test_framework_getenv("MONGOC_TEST_AWS_ACCESS_KEY_ID"); if (!secret_access_key || !access_key_id) { test_error("Set MONGOC_TEST_AWS_SECRET_ACCESS_KEY and " "MONGOC_TEST_AWS_ACCESS_KEY_ID environment variables to " "run Client Side Encryption tests."); } { bson_t aws = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_UTF8(&aws, "secretAccessKey", secret_access_key)); BSON_ASSERT(BSON_APPEND_UTF8(&aws, "accessKeyId", access_key_id)); BSON_APPEND_DOCUMENT(&kms_providers, "aws", &aws); bson_destroy(&aws); } bson_free(secret_access_key); bson_free(access_key_id); } const bool need_aws_with_session_token = bson_has_field(&opts, "kmsProviders.awsTemporary"); const bool need_aws_with_temp_creds = need_aws_with_session_token || bson_has_field(&opts, "kmsProviders.awsTemporaryNoSessionToken"); if (need_aws_with_temp_creds) { char *const secret_access_key = test_framework_getenv("MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY"); char *const access_key_id = test_framework_getenv("MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID"); char *const session_token = test_framework_getenv("MONGOC_TEST_AWS_TEMP_SESSION_TOKEN"); if (!secret_access_key || !access_key_id) { test_error("Set MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY and " "MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID environment variables " "to run Client Side Encryption tests."); } // Only require session token when requested. if (!session_token && need_aws_with_session_token) { test_error("Set MONGOC_TEST_AWS_TEMP_SESSION_TOKEN environment " "variable to run Client Side Encryption tests."); } { bson_t aws = BSON_INITIALIZER; BSON_ASSERT(BSON_APPEND_UTF8(&aws, "secretAccessKey", secret_access_key)); BSON_ASSERT(BSON_APPEND_UTF8(&aws, "accessKeyId", access_key_id)); if (need_aws_with_session_token) { BSON_ASSERT(BSON_APPEND_UTF8(&aws, "sessionToken", session_token)); } BSON_APPEND_DOCUMENT(&kms_providers, "aws", &aws); bson_destroy(&aws); } bson_free(secret_access_key); bson_free(access_key_id); bson_free(session_token); } if (bson_has_field(&opts, "kmsProviders.azure")) { char *azure_tenant_id; char *azure_client_id; char *azure_client_secret; azure_tenant_id = test_framework_getenv("MONGOC_TEST_AZURE_TENANT_ID"); azure_client_id = test_framework_getenv("MONGOC_TEST_AZURE_CLIENT_ID"); azure_client_secret = test_framework_getenv("MONGOC_TEST_AZURE_CLIENT_SECRET"); if (!azure_tenant_id || !azure_client_id || !azure_client_secret) { test_error("Set MONGOC_TEST_AZURE_TENANT_ID, " "MONGOC_TEST_AZURE_CLIENT_ID, and " "MONGOC_TEST_AZURE_CLIENT_SECRET to enable CSFLE " "tests."); } bson_concat(&kms_providers, tmp_bson("{ 'azure': { 'tenantId': '%s', 'clientId': " "'%s', 'clientSecret': '%s' }}", azure_tenant_id, azure_client_id, azure_client_secret)); bson_free(azure_tenant_id); bson_free(azure_client_id); bson_free(azure_client_secret); } if (bson_has_field(&opts, "kmsProviders.gcp")) { char *gcp_email; char *gcp_privatekey; gcp_email = test_framework_getenv("MONGOC_TEST_GCP_EMAIL"); gcp_privatekey = test_framework_getenv("MONGOC_TEST_GCP_PRIVATEKEY"); if (!gcp_email || !gcp_privatekey) { test_error("Set MONGOC_TEST_GCP_EMAIL and " "MONGOC_TEST_GCP_PRIVATEKEY to enable CSFLE " "tests."); } bson_concat(&kms_providers, tmp_bson("{ 'gcp': { 'email': '%s', 'privateKey': '%s' }}", gcp_email, gcp_privatekey)); bson_free(gcp_email); bson_free(gcp_privatekey); } if (bson_has_field(&opts, "kmsProviders.kmip")) { char *kmip_tls_ca_file; char *kmip_tls_certificate_key_file; kmip_tls_ca_file = test_framework_getenv("MONGOC_TEST_CSFLE_TLS_CA_FILE"); kmip_tls_certificate_key_file = test_framework_getenv("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); if (!kmip_tls_ca_file || !kmip_tls_certificate_key_file) { test_error("Set MONGOC_TEST_CSFLE_TLS_CA_FILE, and " "MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE to enable " "CSFLE tests."); } bson_concat(&kms_providers, tmp_bson("{ 'kmip': { 'endpoint': 'localhost:5698' }}")); bson_concat(&tls_opts, tmp_bson("{'kmip': { 'tlsCAFile': '%s', " "'tlsCertificateKeyFile': '%s' } }", kmip_tls_ca_file, kmip_tls_certificate_key_file)); bson_free(kmip_tls_ca_file); bson_free(kmip_tls_certificate_key_file); } mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, &kms_providers); mongoc_auto_encryption_opts_set_tls_opts(auto_encryption_opts, &tls_opts); bson_destroy(&kms_providers); bson_destroy(&tls_opts); } if (bson_iter_init_find(&iter, &opts, "schemaMap")) { bson_t schema_map; bson_iter_bson(&iter, &schema_map); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, &schema_map); bson_destroy(&schema_map); } if (bson_iter_init_find(&iter, &opts, "bypassAutoEncryption")) { mongoc_auto_encryption_opts_set_bypass_auto_encryption(auto_encryption_opts, bson_iter_as_bool(&iter)); } if (bson_iter_init_find(&iter, &opts, "bypassQueryAnalysis")) { mongoc_auto_encryption_opts_set_bypass_query_analysis(auto_encryption_opts, bson_iter_as_bool(&iter)); } if (bson_iter_init_find(&iter, &opts, "keyVaultNamespace")) { const char *keyvault_ns; char *db_name; char *coll_name; char *dot; BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); keyvault_ns = bson_iter_utf8(&iter, NULL); dot = strstr(keyvault_ns, "."); BSON_ASSERT(dot); db_name = bson_strndup(keyvault_ns, dot - keyvault_ns); coll_name = bson_strdup(dot + 1); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, db_name, coll_name); bson_free(db_name); bson_free(coll_name); } else { /* "If ``autoEncryptOpts`` does not include ``keyVaultNamespace``, default * it to ``keyvault.datakeys``" */ mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); } if (bson_iter_init_find(&iter, &opts, "extra")) { bson_t tmp; bson_iter_bson(&iter, &tmp); bson_copy_to(&tmp, &extra); } else { bson_init(&extra); } if (bson_iter_init_find(&iter, &opts, "encryptedFieldsMap")) { BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_t efm; bson_iter_bson(&iter, &efm); mongoc_auto_encryption_opts_set_encrypted_fields_map(auto_encryption_opts, &efm); bson_destroy(&efm); } if (test_framework_getenv_bool("MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN") && !bson_iter_init_find(&iter, &extra, "mongocryptdBypassSpawn")) { /* forking is disallowed in test runner, bypass spawning mongocryptd and * assume it is running in the background. */ BSON_APPEND_BOOL(&extra, "mongocryptdBypassSpawn", true); } char *env_cryptSharedLibPath = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); if (env_cryptSharedLibPath) { BSON_APPEND_UTF8(&extra, "cryptSharedLibPath", env_cryptSharedLibPath); bson_free(env_cryptSharedLibPath); } if (bson_iter_init_find(&iter, &opts, "keyExpirationMS")) { BSON_ASSERT(BSON_ITER_HOLDS_INT(&iter)); const int expiration = bson_iter_as_int64(&iter); BSON_ASSERT(expiration > 0); mongoc_auto_encryption_opts_set_key_expiration(auto_encryption_opts, (uint64_t)expiration); } mongoc_auto_encryption_opts_set_extra(auto_encryption_opts, &extra); bson_destroy(&extra); ret = mongoc_client_enable_auto_encryption(client, auto_encryption_opts, &error); ASSERT_OR_PRINT(ret, error); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); } static bool _in_deny_list(const bson_t *test, char **deny_list, uint32_t deny_list_len) { const char *desc = bson_lookup_utf8(test, "description"); for (uint32_t i = 0; i < deny_list_len; i++) { if (0 == strcmp(desc, deny_list[i])) { return true; } } return false; } static bool _should_skip_due_to_unsupported_operation(const bson_t *test) { char *deny_list[] = {"CreateIndex and dropIndex omits default write concern", "MapReduce omits default write concern"}; if (_in_deny_list(test, deny_list, sizeof(deny_list) / sizeof(char *))) { return true; } return false; } /* *----------------------------------------------------------------------- * * run_json_general_test -- * * Run a JSON test scenario from the CRUD, Command Monitoring, * Retryable Writes, Change Stream, or Transactions Spec. * * Call json_test_config_cleanup on @config after the last call * to run_json_general_test. * *----------------------------------------------------------------------- */ void run_json_general_test(const json_test_config_t *config) { const bson_t *scenario = config->scenario; bson_iter_t scenario_iter; bson_iter_t tests_iter; const char *db_name, *db2_name; const char *collection_name, *collection2_name; ASSERT(scenario); if (!check_scenario_version(scenario)) { return; } db_name = bson_has_field(scenario, "database_name") ? bson_lookup_utf8(scenario, "database_name") : "test"; collection_name = bson_has_field(scenario, "collection_name") ? bson_lookup_utf8(scenario, "collection_name") : "test"; /* database2_name/collection2_name are optional. */ db2_name = bson_has_field(scenario, "database2_name") ? bson_lookup_utf8(scenario, "database2_name") : NULL; collection2_name = bson_has_field(scenario, "collection2_name") ? bson_lookup_utf8(scenario, "collection2_name") : NULL; ASSERT(bson_iter_init_find(&scenario_iter, scenario, "tests")); ASSERT(BSON_ITER_HOLDS_ARRAY(&scenario_iter)); ASSERT(bson_iter_recurse(&scenario_iter, &tests_iter)); while (bson_iter_next(&tests_iter)) { bson_t test; char *selected_test; const char *description; bson_iter_t client_opts_iter; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; uint32_t server_id; bson_error_t error; bool r; bson_iter_t uri_iter; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&tests_iter)); bson_iter_bson(&tests_iter, &test); selected_test = test_framework_getenv("MONGOC_JSON_SUBTEST"); description = bson_lookup_utf8(&test, "description"); if (selected_test && strcmp(selected_test, description) != 0) { fprintf(stderr, " - %s SKIPPED by MONGOC_JSON_SUBTEST\n", description); bson_free(selected_test); continue; } bson_free(selected_test); if (bson_has_field(&test, "skipReason")) { fprintf(stderr, " - %s SKIPPED, reason: %s\n", description, bson_lookup_utf8(&test, "skipReason")); continue; } if (_should_skip_due_to_unsupported_operation(&test)) { fprintf(stderr, " - %s SKIPPED, reason: test requires operation that libmongoc" " does not provide\n", description); continue; } if (test_should_be_skipped(config->skips, description)) { continue; } uri = (config->uri_str != NULL) ? mongoc_uri_new(config->uri_str) : test_framework_get_uri(); /* If we are using multiple mongos, hardcode them in, for now, but keep * the other URI components (CDRIVER-3285) */ if (bson_iter_init_find(&uri_iter, &test, "useMultipleMongoses") && bson_iter_as_bool(&uri_iter)) { if (test_framework_is_loadbalanced()) { mongoc_uri_destroy(uri); uri = test_framework_get_uri_multi_mongos_loadbalanced(); } else { ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27017", &error), error); ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27018", &error), error); } } if (bson_iter_init_find(&client_opts_iter, &test, "clientOptions")) { bson_t client_opts; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&tests_iter)); bson_iter_bson(&client_opts_iter, &client_opts); set_uri_opts_from_bson(uri, &client_opts); } client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); test_framework_set_ssl_opts(client); /* reconnect right away, if a fail point causes a disconnect */ client->topology->min_heartbeat_frequency_msec = 0; mongoc_uri_destroy(uri); /* clean up in case a previous test aborted */ const mongoc_ss_log_context_t ss_log_context = {.operation = "configureFailPoint"}; server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); deactivate_fail_points(client, server_id); r = mongoc_client_command_with_opts( client, "admin", tmp_bson("{'killAllSessions': []}"), NULL, NULL, NULL, &error); /* expect "operation was interrupted", ignore "command not found" or "is * not supported" */ if (!r && (error.domain != MONGOC_ERROR_SERVER || (error.code != 11601 && error.code != 59)) && (strstr(error.message, "is unsupported") == NULL)) { MONGOC_WARNING("Error in killAllSessions: %s", error.message); } set_auto_encryption_opts(client, &test); /* Drop and recreate test database/collection if necessary. */ _recreate(db_name, collection_name, scenario); _recreate(db2_name, collection2_name, scenario); insert_data(db_name, collection_name, scenario); db = mongoc_client_get_database(client, db_name); collection = mongoc_database_get_collection(db, collection_name); execute_test(config, client, db, collection, &test); mongoc_collection_destroy(collection); mongoc_database_destroy(db); mongoc_client_destroy(client); } } /* *----------------------------------------------------------------------- * * json_test_config_cleanup -- * * Free memory after run_json_general_test. * *----------------------------------------------------------------------- */ void json_test_config_cleanup(json_test_config_t *config) { BSON_UNUSED(config); /* no-op */ } /* Tests on unsupported operations are automatically skipped with a message * indicating why. */ static bson_t * _skip_if_unsupported(const char *test_name, bson_t *original) { bool skip = false; const char *unsupported_tests[] = {"/retryable_reads/legacy/gridfs-downloadByName", "/retryable_reads/legacy/gridfs-downloadByName-serverErrors", "/retryable_reads/legacy/listCollectionObjects", "/retryable_reads/legacy/listCollectionObjects-serverErrors", "/retryable_reads/legacy/listDatabaseObjects", "/retryable_reads/legacy/listDatabaseObjects-serverErrors", "/retryable_reads/legacy/listIndexNames", "/retryable_reads/legacy/listIndexNames-serverErrors", "/retryable_reads/legacy/mapReduce"}; mlib_foreach_arr (const char *, test, unsupported_tests) { if (0 == strcmp(test_name, *test)) { skip = true; break; } } if (skip) { /* Modify the test file to give all entries in "tests" a skipReason */ bson_t *modified = bson_new(); bson_array_builder_t *modified_tests; bson_iter_t iter; bson_copy_to_excluding_noinit(original, modified, "tests", NULL); BSON_APPEND_ARRAY_BUILDER_BEGIN(modified, "tests", &modified_tests); BSON_ASSERT(bson_iter_init_find(&iter, original, "tests")); for (bson_iter_recurse(&iter, &iter); bson_iter_next(&iter);) { bson_t original_test; bson_t modified_test; bson_iter_bson(&iter, &original_test); bson_array_builder_append_document_begin(modified_tests, &modified_test); bson_concat(&modified_test, &original_test); BSON_APPEND_UTF8(&modified_test, "skipReason", "libmongoc does not support required operation."); bson_array_builder_append_document_end(modified_tests, &modified_test); } bson_append_array_builder_end(modified, modified_tests); bson_destroy(original); return modified; } return original; } static void bson_destroy_vp(void *vp) { bson_destroy((bson_t *)vp); } /* *----------------------------------------------------------------------- * * install_json_test_suite -- * * Given a path to a directory containing JSON tests, import each * test into a BSON blob and call the provided callback for * evaluation. * * It is expected that the callback will BSON_ASSERT on failure, so if * callback returns quietly the test is considered to have passed. * *----------------------------------------------------------------------- */ void _install_json_test_suite_with_check(TestSuite *suite, const char *base, const char *subdir, test_hook callback, ...) { char test_paths[MAX_NUM_TESTS][MAX_TEST_NAME_LENGTH]; int num_tests; bson_t *test; char *skip_json; char *ext; va_list ap; char joined[PATH_MAX]; char resolved[PATH_MAX]; bson_snprintf(joined, PATH_MAX, "%s/%s", base, subdir); ASSERT(realpath(joined, resolved)); if (suite->ctest_run.data) { // If we're running a specific test, only register if the directory we are scanning // is a prefix of the requested test pathname size_t where = mstr_find(suite->ctest_run, mstr_cstring(subdir)); // allow where == 0 or where == 1 to allow optional leading slash in the // test specifier: if (where > 1) { return; } } num_tests = collect_tests_from_dir(&test_paths[0], resolved, 0, MAX_NUM_TESTS); for (int i = 0; i < num_tests; i++) { test = get_bson_from_json_file(test_paths[i]); skip_json = COALESCE(strstr(test_paths[i], "/json"), strstr(test_paths[i], "\\json")); BSON_ASSERT(skip_json); skip_json += strlen("/json"); ext = strstr(skip_json, ".json"); BSON_ASSERT(ext); ext[0] = '\0'; test = _skip_if_unsupported(skip_json, test); mlib_vec_foreach (TestSkip, skip, suite->failing_flaky_skips) { if (mstr_cmp(mstr_cstring(skip_json), !=, skip->test_name)) { continue; } /* Modify the test file to give applicable entries a skipReason */ bson_t *modified = bson_new(); bson_array_builder_t *modified_tests; bson_iter_t iter; bson_copy_to_excluding_noinit(test, modified, "tests", NULL); BSON_APPEND_ARRAY_BUILDER_BEGIN(modified, "tests", &modified_tests); BSON_ASSERT(bson_iter_init_find(&iter, test, "tests")); for (bson_iter_recurse(&iter, &iter); bson_iter_next(&iter);) { bson_iter_t desc_iter; uint32_t desc_len; const char *desc; bson_t original_test; bson_t modified_test; bson_iter_bson(&iter, &original_test); bson_iter_init_find(&desc_iter, &original_test, "description"); desc = bson_iter_utf8(&desc_iter, &desc_len); bson_array_builder_append_document_begin(modified_tests, &modified_test); bson_concat(&modified_test, &original_test); if (!skip->subtest_desc.data || mstr_cmp(skip->subtest_desc, ==, mstr_cstring(desc))) { BSON_APPEND_UTF8(&modified_test, "skipReason", skip->reason.data ? skip->reason.data : "(null)"); } bson_array_builder_append_document_end(modified_tests, &modified_test); } bson_append_array_builder_end(modified, modified_tests); bson_destroy(test); test = modified; } mstr name = mstr_copy_cstring(skip_json); mstr_append(&name, mstr_cstring(" [lock:live-server]")); /* list of "check" functions that decide whether to skip the test */ va_start(ap, callback); _V_TestSuite_AddFull(suite, name.data, callback, &bson_destroy_vp, test, ap); va_end(ap); mstr_destroy(&name); } } /* *----------------------------------------------------------------------- * * install_json_test_suite -- * * Given a path to a directory containing JSON tests, import each * test into a BSON blob and call the provided callback for * evaluation. * * It is expected that the callback will BSON_ASSERT on failure, so if * callback returns quietly the test is considered to have passed. * *----------------------------------------------------------------------- */ void install_json_test_suite(TestSuite *suite, const char *base, const char *subdir, test_hook callback) { install_json_test_suite_with_check(suite, base, subdir, callback, TestSuite_CheckLive); } /* *----------------------------------------------------------------------- * * test_should_be_skipped -- * * Check a test description string against a list of description strings for * tests that should be skipped. "skips" is an optional NULL terminated array. * * If the test should be skipped, returns 'true' and logs a reason to stderr. * *----------------------------------------------------------------------- */ bool test_should_be_skipped(const test_skip_t *skips, const char *description) { if (skips) { for (const test_skip_t *iter = skips; iter->description != NULL; iter++) { if (iter->check_substring) { if (NULL != strstr(description, iter->description)) { fprintf(stderr, " - %s SKIPPED (contains '%s'), due to reason: %s\n", description, iter->description, iter->reason); return true; } } else if (0 == strcmp(description, iter->description)) { fprintf(stderr, " - %s SKIPPED, due to reason: %s\n", description, iter->reason); return true; } } } return false; } mongo-c-driver-2.2.1/src/libmongoc/tests/json-test.h000066400000000000000000000066541511661753600223730ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef JSON_TEST_H #define JSON_TEST_H #include #include #include #include #include #include #define MAX_NUM_TESTS 150 typedef void (*test_hook)(void *test); typedef struct { const char *description; bool check_substring; // If true, check that `description` matches a substring of the test description. const char *reason; } test_skip_t; typedef struct _json_test_config_t { void *ctx; const bson_t *scenario; json_test_cb_t before_test_cb, after_test_cb; json_test_operation_cb_t run_operation_cb; json_test_events_check_cb_t events_check_cb; bool command_started_events_only; bool command_monitoring_allow_subset; const char *uri_str; /* skips is a NULL terminated list of tests to skip identified by the test * "description" */ test_skip_t *skips; } json_test_config_t; #define JSON_TEST_CONFIG_INIT {NULL, NULL, NULL, NULL, NULL, NULL, false, false, NULL, NULL} bson_t * get_bson_from_json_file(const char *filename); int collect_tests_from_dir(char (*paths)[MAX_TEST_NAME_LENGTH] /* OUT */, const char *dir_path, int paths_index, int max_paths); void assemble_path(const char *parent_path, const char *child_name, char *dst /* OUT */); mongoc_topology_description_type_t topology_type_from_test(const char *type); const mongoc_server_description_t * server_description_by_hostname(const mongoc_topology_description_t *topology, const char *address); void process_sdam_test_hello_responses(bson_t *phase, mongoc_topology_t *topology); void test_server_selection_logic_cb(void *test); mongoc_server_description_type_t server_type_from_test(const char *type); void activate_fail_point(mongoc_client_t *client, const uint32_t server_id, const bson_t *test, const char *key); void deactivate_fail_points(mongoc_client_t *client, uint32_t server_id); void run_json_general_test(const json_test_config_t *config); void json_test_config_cleanup(json_test_config_t *config); void _install_json_test_suite_with_check(TestSuite *suite, const char *base, const char *subdir, test_hook callback, ...); void install_json_test_suite(TestSuite *suite, const char *base, const char *subdir, test_hook callback); #define install_json_test_suite_with_check(_suite, _base, _subdir, ...) \ _install_json_test_suite_with_check(_suite, _base, _subdir, __VA_ARGS__, NULL) void set_uri_opts_from_bson(mongoc_uri_t *uri, const bson_t *opts); void insert_data(const char *db_name, const char *collection_name, const bson_t *scenario); bool check_scenario_version(const bson_t *scenario); void check_outcome_collection(mongoc_collection_t *collection, bson_t *test); bool test_should_be_skipped(const test_skip_t *skips, const char *description); #endif mongo-c-driver-2.2.1/src/libmongoc/tests/json/000077500000000000000000000000001511661753600212325ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/auth/000077500000000000000000000000001511661753600221735ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/auth/legacy/000077500000000000000000000000001511661753600234375ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/auth/legacy/connection-string.json000066400000000000000000000551041511661753600300020ustar00rootroot00000000000000{ "tests": [ { "description": "should use the default source and mechanism", "uri": "mongodb://user:password@localhost", "valid": true, "credential": { "username": "user", "password": "password", "source": "admin", "mechanism": null, "mechanism_properties": null } }, { "description": "should use the database when no authSource is specified", "uri": "mongodb://user:password@localhost/foo", "valid": true, "credential": { "username": "user", "password": "password", "source": "foo", "mechanism": null, "mechanism_properties": null } }, { "description": "should use the authSource when specified", "uri": "mongodb://user:password@localhost/foo?authSource=bar", "valid": true, "credential": { "username": "user", "password": "password", "source": "bar", "mechanism": null, "mechanism_properties": null } }, { "description": "should recognise the mechanism (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "mongodb" } } }, { "description": "should ignore the database (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/foo?authMechanism=GSSAPI", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "mongodb" } } }, { "description": "should accept valid authSource (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authSource=$external", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "mongodb" } } }, { "description": "should accept generic mechanism property (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:forward,SERVICE_HOST:example.com", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "other", "SERVICE_HOST": "example.com", "CANONICALIZE_HOST_NAME": "forward" } } }, { "description": "should accept forwardAndReverse hostname canonicalization (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:forwardAndReverse", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "other", "CANONICALIZE_HOST_NAME": "forwardAndReverse" } } }, { "description": "should accept no hostname canonicalization (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:none", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "other", "CANONICALIZE_HOST_NAME": "none" } } }, { "description": "must raise an error when the hostname canonicalization is invalid", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:invalid", "valid": false }, { "description": "should accept the password (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM:password@localhost/?authMechanism=GSSAPI&authSource=$external", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": "password", "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "mongodb" } } }, { "description": "must raise an error when the authSource is empty", "uri": "mongodb://user:password@localhost/foo?authSource=", "valid": false }, { "description": "must raise an error when the authSource is empty without credentials", "uri": "mongodb://localhost/admin?authSource=", "valid": false }, { "description": "should throw an exception if authSource is invalid (GSSAPI)", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authSource=foo", "valid": false }, { "description": "should throw an exception if no username (GSSAPI)", "uri": "mongodb://localhost/?authMechanism=GSSAPI", "valid": false }, { "description": "should recognize the mechanism (MONGODB-X509)", "uri": "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/?authMechanism=MONGODB-X509", "valid": true, "credential": { "username": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "password": null, "source": "$external", "mechanism": "MONGODB-X509", "mechanism_properties": null } }, { "description": "should ignore the database (MONGODB-X509)", "uri": "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/foo?authMechanism=MONGODB-X509", "valid": true, "credential": { "username": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "password": null, "source": "$external", "mechanism": "MONGODB-X509", "mechanism_properties": null } }, { "description": "should accept valid authSource (MONGODB-X509)", "uri": "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/?authMechanism=MONGODB-X509&authSource=$external", "valid": true, "credential": { "username": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "password": null, "source": "$external", "mechanism": "MONGODB-X509", "mechanism_properties": null } }, { "description": "should recognize the mechanism with no username (MONGODB-X509)", "uri": "mongodb://localhost/?authMechanism=MONGODB-X509", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-X509", "mechanism_properties": null } }, { "description": "should recognize the mechanism with no username when auth source is explicitly specified (MONGODB-X509)", "uri": "mongodb://localhost/?authMechanism=MONGODB-X509&authSource=$external", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-X509", "mechanism_properties": null } }, { "description": "should throw an exception if supplied a password (MONGODB-X509)", "uri": "mongodb://user:password@localhost/?authMechanism=MONGODB-X509", "valid": false }, { "description": "should throw an exception if authSource is invalid (MONGODB-X509)", "uri": "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/foo?authMechanism=MONGODB-X509&authSource=bar", "valid": false }, { "description": "should recognize the mechanism (PLAIN)", "uri": "mongodb://user:password@localhost/?authMechanism=PLAIN", "valid": true, "credential": { "username": "user", "password": "password", "source": "$external", "mechanism": "PLAIN", "mechanism_properties": null } }, { "description": "should use the database when no authSource is specified (PLAIN)", "uri": "mongodb://user:password@localhost/foo?authMechanism=PLAIN", "valid": true, "credential": { "username": "user", "password": "password", "source": "foo", "mechanism": "PLAIN", "mechanism_properties": null } }, { "description": "should use the authSource when specified (PLAIN)", "uri": "mongodb://user:password@localhost/foo?authMechanism=PLAIN&authSource=bar", "valid": true, "credential": { "username": "user", "password": "password", "source": "bar", "mechanism": "PLAIN", "mechanism_properties": null } }, { "description": "should throw an exception if no username (PLAIN)", "uri": "mongodb://localhost/?authMechanism=PLAIN", "valid": false }, { "description": "should recognize the mechanism (SCRAM-SHA-1)", "uri": "mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-1", "valid": true, "credential": { "username": "user", "password": "password", "source": "admin", "mechanism": "SCRAM-SHA-1", "mechanism_properties": null } }, { "description": "should use the database when no authSource is specified (SCRAM-SHA-1)", "uri": "mongodb://user:password@localhost/foo?authMechanism=SCRAM-SHA-1", "valid": true, "credential": { "username": "user", "password": "password", "source": "foo", "mechanism": "SCRAM-SHA-1", "mechanism_properties": null } }, { "description": "should accept valid authSource (SCRAM-SHA-1)", "uri": "mongodb://user:password@localhost/foo?authMechanism=SCRAM-SHA-1&authSource=bar", "valid": true, "credential": { "username": "user", "password": "password", "source": "bar", "mechanism": "SCRAM-SHA-1", "mechanism_properties": null } }, { "description": "should throw an exception if no username (SCRAM-SHA-1)", "uri": "mongodb://localhost/?authMechanism=SCRAM-SHA-1", "valid": false }, { "description": "should recognize the mechanism (SCRAM-SHA-256)", "uri": "mongodb://user:password@localhost/?authMechanism=SCRAM-SHA-256", "valid": true, "credential": { "username": "user", "password": "password", "source": "admin", "mechanism": "SCRAM-SHA-256", "mechanism_properties": null } }, { "description": "should use the database when no authSource is specified (SCRAM-SHA-256)", "uri": "mongodb://user:password@localhost/foo?authMechanism=SCRAM-SHA-256", "valid": true, "credential": { "username": "user", "password": "password", "source": "foo", "mechanism": "SCRAM-SHA-256", "mechanism_properties": null } }, { "description": "should accept valid authSource (SCRAM-SHA-256)", "uri": "mongodb://user:password@localhost/foo?authMechanism=SCRAM-SHA-256&authSource=bar", "valid": true, "credential": { "username": "user", "password": "password", "source": "bar", "mechanism": "SCRAM-SHA-256", "mechanism_properties": null } }, { "description": "should throw an exception if no username (SCRAM-SHA-256)", "uri": "mongodb://localhost/?authMechanism=SCRAM-SHA-256", "valid": false }, { "description": "URI with no auth-related info doesn't create credential", "uri": "mongodb://localhost/", "valid": true, "credential": null }, { "description": "database in URI path doesn't create credentials", "uri": "mongodb://localhost/foo", "valid": true, "credential": null }, { "description": "authSource without username doesn't create credential (default mechanism)", "uri": "mongodb://localhost/?authSource=foo", "valid": true, "credential": null }, { "description": "should throw an exception if no username provided (userinfo implies default mechanism)", "uri": "mongodb://@localhost.com/", "valid": false }, { "description": "should throw an exception if no username/password provided (userinfo implies default mechanism)", "uri": "mongodb://:@localhost.com/", "valid": false }, { "description": "should recognise the mechanism (MONGODB-AWS)", "uri": "mongodb://localhost/?authMechanism=MONGODB-AWS", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-AWS", "mechanism_properties": null } }, { "description": "should recognise the mechanism when auth source is explicitly specified (MONGODB-AWS)", "uri": "mongodb://localhost/?authMechanism=MONGODB-AWS&authSource=$external", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-AWS", "mechanism_properties": null } }, { "description": "should throw an exception if username and no password (MONGODB-AWS)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-AWS", "valid": false, "credential": null }, { "description": "should use username and password if specified (MONGODB-AWS)", "uri": "mongodb://user%21%40%23%24%25%5E%26%2A%28%29_%2B:pass%21%40%23%24%25%5E%26%2A%28%29_%2B@localhost/?authMechanism=MONGODB-AWS", "valid": true, "credential": { "username": "user!@#$%^&*()_+", "password": "pass!@#$%^&*()_+", "source": "$external", "mechanism": "MONGODB-AWS", "mechanism_properties": null } }, { "description": "should use username, password and session token if specified (MONGODB-AWS)", "uri": "mongodb://user:password@localhost/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:token%21%40%23%24%25%5E%26%2A%28%29_%2B", "valid": true, "credential": { "username": "user", "password": "password", "source": "$external", "mechanism": "MONGODB-AWS", "mechanism_properties": { "AWS_SESSION_TOKEN": "token!@#$%^&*()_+" } } }, { "description": "should recognise the mechanism with test environment (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:test", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "test" } } }, { "description": "should recognise the mechanism when auth source is explicitly specified and with environment (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authSource=$external&authMechanismProperties=ENVIRONMENT:test", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "test" } } }, { "description": "should throw an exception if supplied a password (MONGODB-OIDC)", "uri": "mongodb://user:pass@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:test", "valid": false, "credential": null }, { "description": "should throw an exception if username is specified for test (MONGODB-OIDC)", "uri": "mongodb://principalName@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:test", "valid": false, "credential": null }, { "description": "should throw an exception if specified environment is not supported (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:invalid", "valid": false, "credential": null }, { "description": "should throw an exception if neither environment nor callbacks specified (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC", "valid": false, "credential": null }, { "description": "should throw an exception when unsupported auth property is specified (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=UnsupportedProperty:unexisted", "valid": false, "credential": null }, { "description": "should recognise the mechanism with azure provider (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:foo", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "foo" } } }, { "description": "should accept a username with azure provider (MONGODB-OIDC)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:foo", "valid": true, "credential": { "username": "user", "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "foo" } } }, { "description": "should accept a url-encoded TOKEN_RESOURCE (MONGODB-OIDC)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:mongodb%3A%2F%2Ftest-cluster", "valid": true, "credential": { "username": "user", "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "mongodb://test-cluster" } } }, { "description": "should accept an un-encoded TOKEN_RESOURCE (MONGODB-OIDC)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:mongodb://test-cluster", "valid": true, "credential": { "username": "user", "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "mongodb://test-cluster" } } }, { "description": "should handle a complicated url-encoded TOKEN_RESOURCE (MONGODB-OIDC)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:abcd%25ef%3Ag%26hi", "valid": true, "credential": { "username": "user", "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "abcd%ef:g&hi" } } }, { "description": "should url-encode a TOKEN_RESOURCE (MONGODB-OIDC)", "uri": "mongodb://user@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:a$b", "valid": true, "credential": { "username": "user", "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "azure", "TOKEN_RESOURCE": "a$b" } } }, { "description": "should accept a username and throw an error for a password with azure provider (MONGODB-OIDC)", "uri": "mongodb://user:pass@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,TOKEN_RESOURCE:foo", "valid": false, "credential": null }, { "description": "should throw an exception if no token audience is given for azure provider (MONGODB-OIDC)", "uri": "mongodb://username@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure", "valid": false, "credential": null }, { "description": "should recognise the mechanism with gcp provider (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:foo", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "foo" } } }, { "description": "should throw an error for a username and password with gcp provider (MONGODB-OIDC)", "uri": "mongodb://user:pass@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:foo", "valid": false, "credential": null }, { "description": "should throw an error if not TOKEN_RESOURCE with gcp provider (MONGODB-OIDC)", "uri": "mongodb://user:pass@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:gcp", "valid": false, "credential": null }, { "description": "should recognise the mechanism with k8s provider (MONGODB-OIDC)", "uri": "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:k8s", "valid": true, "credential": { "username": null, "password": null, "source": "$external", "mechanism": "MONGODB-OIDC", "mechanism_properties": { "ENVIRONMENT": "k8s" } } }, { "description": "should throw an error for a username and password with k8s provider (MONGODB-OIDC)", "uri": "mongodb://user:pass@localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:k8s", "valid": false, "credential": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/auth/unified/000077500000000000000000000000001511661753600236165ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/auth/unified/mongodb-oidc-no-retry.json000066400000000000000000000343411511661753600306340ustar00rootroot00000000000000{ "description": "MONGODB-OIDC authentication with retry disabled", "schemaVersion": "1.19", "runOnRequirements": [ { "minServerVersion": "7.0", "auth": true, "authMechanism": "MONGODB-OIDC", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "failPointClient", "useMultipleMongoses": false } }, { "client": { "id": "client0", "uriOptions": { "authMechanism": "MONGODB-OIDC", "authMechanismProperties": { "$$placeholder": 1 }, "retryReads": false, "retryWrites": false }, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "test" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collName" } } ], "initialData": [ { "collectionName": "collName", "databaseName": "test", "documents": [] } ], "tests": [ { "description": "A read operation should succeed", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": {} }, "expectResult": [] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collName", "filter": {} } } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "A write operation should succeed", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "collName", "documents": [ { "_id": 1, "x": 1 } ] } } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "Read commands should reauthenticate and retry when a ReauthenticationRequired error happens", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 391 } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {} }, "expectResult": [] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collName", "filter": {} } } }, { "commandFailedEvent": { "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "collName", "filter": {} } } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "Write commands should reauthenticate and retry when a ReauthenticationRequired error happens", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 391 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "collName", "documents": [ { "_id": 1, "x": 1 } ] } } }, { "commandFailedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "collName", "documents": [ { "_id": 1, "x": 1 } ] } } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "Handshake with cached token should use speculative authentication", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "x": 1 } }, "expectError": { "isClientError": true } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslStart" ], "errorCode": 18 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "collName", "documents": [ { "_id": 1, "x": 1 } ] } } }, { "commandFailedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "collName", "documents": [ { "_id": 1, "x": 1 } ] } } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "Handshake without cached token should not use speculative authentication", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslStart" ], "errorCode": 18 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "x": 1 } }, "expectError": { "errorCode": 18 } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/000077500000000000000000000000001511661753600242155ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified/000077500000000000000000000000001511661753600256405ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified/change-streams-clusterTime.json000066400000000000000000000031521511661753600337330ustar00rootroot00000000000000{ "description": "change-streams-clusterTime", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [] } ], "tests": [ { "description": "clusterTime is present", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "ns": { "db": "database0", "coll": "collection0" }, "clusterTime": { "$$exists": true } } } ] } ] } change-streams-disambiguatedPaths.json000066400000000000000000000102311511661753600351520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified{ "description": "disambiguatedPaths", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "6.1.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [] } ], "tests": [ { "description": "disambiguatedPaths is present on updateDescription when an ambiguous path is present", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": { "1": 1 } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "a.1": 2 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "database0", "coll": "collection0" }, "updateDescription": { "updatedFields": { "$$exists": true }, "removedFields": { "$$exists": true }, "truncatedArrays": { "$$exists": true }, "disambiguatedPaths": { "a.1": [ "a", "1" ] } } } } ] }, { "description": "disambiguatedPaths returns array indices as integers", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": [ { "1": 1 } ] } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "a.0.1": 2 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "database0", "coll": "collection0" }, "updateDescription": { "updatedFields": { "$$exists": true }, "removedFields": { "$$exists": true }, "truncatedArrays": { "$$exists": true }, "disambiguatedPaths": { "a.0.1": [ "a", { "$$type": "int" }, "1" ] } } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified/change-streams-errors.json000066400000000000000000000127031511661753600327510ustar00rootroot00000000000000{ "description": "change-streams-errors", "schemaVersion": "1.7", "runOnRequirements": [ { "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "killCursors" ], "useMultipleMongoses": false } }, { "client": { "id": "globalClient", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "database": { "id": "globalDatabase0", "client": "globalClient", "databaseName": "database0" } }, { "collection": { "id": "globalCollection0", "database": "globalDatabase0", "collectionName": "collection0" } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [] } ], "tests": [ { "description": "The watch helper must not throw a custom exception when executed against a single server topology, but instead depend on a server error", "runOnRequirements": [ { "minServerVersion": "3.6.0", "topologies": [ "single" ] } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "expectError": { "errorCode": 40573 } } ] }, { "description": "Change Stream should error when an invalid aggregation stage is passed in", "runOnRequirements": [ { "minServerVersion": "3.6.0", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$unsupported": "foo" } ] }, "expectError": { "errorCode": 40324 } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} }, { "$unsupported": "foo" } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Change Stream should error when _id is projected out", "runOnRequirements": [ { "minServerVersion": "4.1.11", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "_id": 0 } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "errorCode": 280 } } ] }, { "description": "change stream errors on ElectionInProgress", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 216, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "errorCode": 216 } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified/change-streams-nsType.json000066400000000000000000000065001511661753600327150ustar00rootroot00000000000000{ "description": "change-streams-nsType", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "8.1.0", "topologies": [ "replicaset", "sharded" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } } ], "tests": [ { "description": "nsType is present when creating collections", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "create", "nsType": "collection" } } ] }, { "description": "nsType is present when creating timeseries", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo", "timeseries": { "timeField": "time", "metaField": "meta", "granularity": "minutes" } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "create", "nsType": "timeseries" } } ] }, { "description": "nsType is present when creating views", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo", "viewOn": "testName" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "create", "nsType": "view" } } ] } ] } change-streams-pre_and_post_images.json000066400000000000000000000474201511661753600353640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified{ "description": "change-streams-pre_and_post_images", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "6.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "collMod", "insert", "update", "getMore", "killCursors" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "change-stream-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "change-stream-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "fullDocument:whenAvailable with changeStreamPreAndPostImages enabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocument": "whenAvailable" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocument": { "_id": 1, "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocument": "whenAvailable" } } ] } } } ] } ] }, { "description": "fullDocument:whenAvailable with changeStreamPreAndPostImages disabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocument": "whenAvailable" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocument": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocument": "whenAvailable" } } ] } } } ] } ] }, { "description": "fullDocument:required with changeStreamPreAndPostImages enabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocument": "required" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocument": { "_id": 1, "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocument": "required" } } ] } } } ] } ] }, { "description": "fullDocument:required with changeStreamPreAndPostImages disabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocument": "required" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocument": "required" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:whenAvailable with changeStreamPreAndPostImages enabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "whenAvailable" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocumentBeforeChange": { "_id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "whenAvailable" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:whenAvailable with changeStreamPreAndPostImages disabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "whenAvailable" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocumentBeforeChange": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "whenAvailable" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:required with changeStreamPreAndPostImages enabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "required" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocumentBeforeChange": { "_id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "required" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:required with changeStreamPreAndPostImages disabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "required" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "required" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:off with changeStreamPreAndPostImages enabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "off" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocumentBeforeChange": { "$$exists": false } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "off" } } ] } } } ] } ] }, { "description": "fullDocumentBeforeChange:off with changeStreamPreAndPostImages disabled", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "collMod", "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "fullDocumentBeforeChange": "off" }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "change-stream-tests", "coll": "test" }, "updateDescription": { "$$type": "object" }, "fullDocumentBeforeChange": { "$$exists": false } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$changeStream": { "fullDocumentBeforeChange": "off" } } ] } } } ] } ] } ] } change-streams-resume-allowlist.json000066400000000000000000001670631511661753600347000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified{ "description": "change-streams-resume-allowlist", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "killCursors" ], "useMultipleMongoses": false } }, { "client": { "id": "globalClient", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "database": { "id": "globalDatabase0", "client": "globalClient", "databaseName": "database0" } }, { "collection": { "id": "globalCollection0", "database": "globalDatabase0", "collectionName": "collection0" } } ], "tests": [ { "description": "change stream resumes after a network error", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "closeConnection": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after HostUnreachable", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 6, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after HostNotFound", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 7, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NetworkTimeout", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 89, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after ShutdownInProgress", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 91, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after PrimarySteppedDown", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 189, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after ExceededTimeLimit", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 262, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after SocketException", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 9001, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotWritablePrimary", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 10107, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after InterruptedAtShutdown", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 11600, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after InterruptedDueToReplStateChange", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 11602, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotPrimaryNoSecondaryOk", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 13435, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotPrimaryOrSecondary", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 13436, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after StaleShardVersion", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 63, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after StaleEpoch", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 150, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after RetryChangeStream", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 234, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after FailedToSatisfyReadPreference", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 133, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after CursorNotFound", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 43, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] } ] } change-streams-resume-errorLabels.json000066400000000000000000001551571511661753600351430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified{ "description": "change-streams-resume-errorlabels", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "4.3.1", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "killCursors" ], "useMultipleMongoses": false } }, { "client": { "id": "globalClient", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "database": { "id": "globalDatabase0", "client": "globalClient", "databaseName": "database0" } }, { "collection": { "id": "globalCollection0", "database": "globalDatabase0", "collectionName": "collection0" } } ], "tests": [ { "description": "change stream resumes after HostUnreachable", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 6, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after HostNotFound", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 7, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NetworkTimeout", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 89, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate" } } ] } ] }, { "description": "change stream resumes after ShutdownInProgress", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 91, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after PrimarySteppedDown", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 189, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after ExceededTimeLimit", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 262, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after SocketException", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 9001, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotWritablePrimary", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 10107, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after InterruptedAtShutdown", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 11600, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after InterruptedDueToReplStateChange", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 11602, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotPrimaryNoSecondaryOk", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 13435, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after NotPrimaryOrSecondary", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 13436, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after StaleShardVersion", "runOnRequirements": [ { "maxServerVersion": "6.0.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 63, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after StaleEpoch", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 150, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after RetryChangeStream", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 234, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes after FailedToSatisfyReadPreference", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failGetMoreAfterCursorCheckout", "mode": { "times": 1 }, "data": { "errorCode": 133, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream resumes if error contains ResumableChangeStreamError", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 50, "closeConnection": false, "errorLabels": [ "ResumableChangeStreamError" ] } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "getMore": { "$$exists": true }, "collection": "collection0" }, "commandName": "getMore", "databaseName": "database0" } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "resumeAfter": { "$$unsetOrMatches": { "$$exists": true } } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "change stream does not resume if error does not contain ResumableChangeStreamError", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 6, "closeConnection": false } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "errorCode": 6 } } ] } ] } change-streams-showExpandedEvents.json000066400000000000000000000304141511661753600351730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified{ "description": "change-streams-showExpandedEvents", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "6.0.0", "topologies": [ "replicaset", "sharded" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "killCursors" ], "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "database": { "id": "database1", "client": "client0", "databaseName": "database1" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "collection1" } }, { "database": { "id": "shardedDb", "client": "client0", "databaseName": "shardedDb" } }, { "database": { "id": "adminDb", "client": "client0", "databaseName": "admin" } }, { "collection": { "id": "shardedCollection", "database": "shardedDb", "collectionName": "shardedCollection" } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [] } ], "tests": [ { "description": "when provided, showExpandedEvents is sent as a part of the aggregate command", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "showExpandedEvents": true } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "when omitted, showExpandedEvents is not sent as a part of the aggregate command", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": { "showExpandedEvents": { "$$exists": false } } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "when showExpandedEvents is true, new fields on change stream events are handled appropriately", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "a": 1 } } }, { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "name": "x_1" } }, { "name": "rename", "object": "collection0", "arguments": { "to": "foo", "dropTarget": true } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "collectionUUID": { "$$exists": true } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "createIndexes", "ns": { "db": "database0", "coll": "collection0" }, "operationDescription": { "$$exists": true } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "rename", "ns": { "db": "database0", "coll": "collection0" }, "to": { "db": "database0", "coll": "foo" }, "operationDescription": { "dropTarget": { "$$exists": true }, "to": { "db": "database0", "coll": "foo" } } } } ] }, { "description": "when showExpandedEvents is true, createIndex events are reported", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "operationType": { "$ne": "create" } } } ], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "name": "x_1" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "createIndexes" } } ] }, { "description": "when showExpandedEvents is true, dropIndexes events are reported", "operations": [ { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "name": "x_1" } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "dropIndex", "object": "collection0", "arguments": { "name": "x_1" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "dropIndexes" } } ] }, { "description": "when showExpandedEvents is true, create events are reported", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "create" } } ] }, { "description": "when showExpandedEvents is true, create events on views are reported", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "foo" } }, { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "foo", "viewOn": "testName" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "create" } } ] }, { "description": "when showExpandedEvents is true, modify events are reported", "operations": [ { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "name": "x_2" } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "runCommand", "object": "database0", "arguments": { "command": { "collMod": "collection0" }, "commandName": "collMod" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "modify" } } ] }, { "description": "when showExpandedEvents is true, shardCollection events are reported", "runOnRequirements": [ { "topologies": [ "sharded" ] } ], "operations": [ { "name": "dropCollection", "object": "shardedDb", "arguments": { "collection": "shardedCollection" } }, { "name": "createCollection", "object": "shardedDb", "arguments": { "collection": "shardedCollection" } }, { "name": "createChangeStream", "object": "shardedCollection", "arguments": { "pipeline": [], "showExpandedEvents": true }, "saveResultAsEntity": "changeStream0" }, { "name": "runCommand", "object": "adminDb", "arguments": { "command": { "shardCollection": "shardedDb.shardedCollection", "key": { "_id": 1 } }, "commandName": "shardCollection" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "shardCollection" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/change_streams/unified/change-streams.json000066400000000000000000001245521511661753600314450ustar00rootroot00000000000000{ "description": "change-streams", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "killCursors" ], "useMultipleMongoses": false } }, { "client": { "id": "globalClient", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "database": { "id": "database1", "client": "client0", "databaseName": "database1" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "collection1" } }, { "database": { "id": "globalDatabase0", "client": "globalClient", "databaseName": "database0" } }, { "collection": { "id": "globalCollection0", "database": "globalDatabase0", "collectionName": "collection0" } }, { "database": { "id": "globalDatabase1", "client": "globalClient", "databaseName": "database1" } }, { "collection": { "id": "globalCollection1", "database": "globalDatabase1", "collectionName": "collection1" } }, { "collection": { "id": "globalDb1Collection0", "database": "globalDatabase1", "collectionName": "collection0" } }, { "collection": { "id": "globalDb0Collection1", "database": "globalDatabase0", "collectionName": "collection1" } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [] } ], "tests": [ { "description": "Test array truncation", "runOnRequirements": [ { "minServerVersion": "4.7" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1, "array": [ "foo", { "a": "bar" }, 1, 2, 3 ] } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "array": [ "foo", { "a": "bar" } ] } } ] } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "database0", "coll": "collection0" }, "updateDescription": { "updatedFields": {}, "removedFields": [], "truncatedArrays": [ { "field": "array", "newSize": 2 } ], "disambiguatedPaths": { "$$unsetOrMatches": { "$$exists": true } } } } } ] }, { "description": "Test with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "comment": { "name": "test1" } }, "saveResultAsEntity": "changeStream0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$changeStream": {} } ], "comment": { "name": "test1" } } } } ] } ] }, { "description": "Test with document comment - pre 4.4", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "comment": { "name": "test1" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$changeStream": {} } ], "comment": { "name": "test1" } } } } ] } ] }, { "description": "Test with string comment", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "comment": "comment" }, "saveResultAsEntity": "changeStream0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$changeStream": {} } ], "comment": "comment" } } } ] } ] }, { "description": "Test that comment is set on getMore", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "comment": { "key": "value" } }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$changeStream": {} } ], "comment": { "key": "value" } } } }, { "commandStartedEvent": { "command": { "insert": "collection0", "documents": [ { "_id": 1, "a": 1 } ] } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "collection0", "comment": { "key": "value" } }, "commandName": "getMore", "databaseName": "database0" } } ] } ] }, { "description": "Test that comment is not set on getMore - pre 4.4", "runOnRequirements": [ { "maxServerVersion": "4.3.99" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "comment": "comment" }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$changeStream": {} } ], "comment": "comment" } } }, { "commandStartedEvent": { "command": { "insert": "collection0", "documents": [ { "_id": 1, "a": 1 } ] } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "collection0", "comment": { "$$exists": false } }, "commandName": "getMore", "databaseName": "database0" } } ] } ] }, { "description": "to field is set in a rename change event", "runOnRequirements": [ { "minServerVersion": "4.0.1" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "dropCollection", "object": "database0", "arguments": { "collection": "collection1" } }, { "name": "rename", "object": "collection0", "arguments": { "to": "collection1" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "rename", "ns": { "db": "database0", "coll": "collection0" }, "to": { "db": "database0", "coll": "collection1" } } } ] }, { "description": "Test unknown operationType MUST NOT err", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "operationType": "addedInFutureMongoDBVersion", "ns": 1 } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "addedInFutureMongoDBVersion", "ns": { "db": "database0", "coll": "collection0" } } } ] }, { "description": "Test newField added in response MUST NOT err", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "operationType": 1, "ns": 1, "newField": "newFieldValue" } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "newField": "newFieldValue" } } ] }, { "description": "Test new structure in ns document MUST NOT err", "runOnRequirements": [ { "minServerVersion": "3.6", "maxServerVersion": "5.2.99" }, { "minServerVersion": "6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "operationType": "insert", "ns.viewOn": "db.coll" } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "viewOn": "db.coll" } } } ] }, { "description": "Test modified structure in ns document MUST NOT err", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "operationType": "insert", "ns": { "db": "$ns.db", "coll": "$ns.coll", "viewOn": "db.coll" } } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0", "viewOn": "db.coll" } } } ] }, { "description": "Test server error on projecting out _id", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "_id": 0 } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectError": { "errorCode": 280, "errorCodeName": "ChangeStreamFatalError", "errorLabelsContain": [ "NonResumableChangeStreamError" ] } } ] }, { "description": "Test projection in change stream returns expected fields", "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "optype": "$operationType", "ns": 1, "newField": "value" } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "optype": "insert", "ns": { "db": "database0", "coll": "collection0" }, "newField": "value" } } ] }, { "description": "$changeStream must be the first stage in a change stream pipeline sent to the server", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "The server returns change stream responses in the specified server response format", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "_id": { "$$exists": true }, "documentKey": { "$$exists": true }, "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } } ] }, { "description": "Executing a watch helper on a Collection results in notifications for changes to the specified collection", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalDb0Collection1", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "globalDb1Collection0", "arguments": { "document": { "y": 2 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "z": 3, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Change Stream should allow valid aggregate pipeline stages", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "fullDocument.z": 3 } } ] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "y": 2 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "z": 3, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} }, { "$match": { "fullDocument.z": 3 } } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Executing a watch helper on a Database results in notifications for changes to all collections in the specified database.", "runOnRequirements": [ { "minServerVersion": "3.8.0" } ], "operations": [ { "name": "createChangeStream", "object": "database0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalDb0Collection1", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "globalDb1Collection0", "arguments": { "document": { "y": 2 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection1" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "z": 3, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Executing a watch helper on a MongoClient results in notifications for changes to all collections in all databases in the cluster.", "runOnRequirements": [ { "minServerVersion": "3.8.0" } ], "operations": [ { "name": "createChangeStream", "object": "client0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalDb0Collection1", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "globalDb1Collection0", "arguments": { "document": { "y": 2 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "z": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection1" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database1", "coll": "collection0" }, "fullDocument": { "y": 2, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "z": 3, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "commandName": "aggregate", "databaseName": "admin" } } ] } ] }, { "description": "Test insert, update, replace, and delete event types", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "updateOne", "object": "globalCollection0", "arguments": { "filter": { "x": 1 }, "update": { "$set": { "x": 2 } } } }, { "name": "replaceOne", "object": "globalCollection0", "arguments": { "filter": { "x": 2 }, "replacement": { "x": 3 } } }, { "name": "deleteOne", "object": "globalCollection0", "arguments": { "filter": { "x": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "update", "ns": { "db": "database0", "coll": "collection0" }, "updateDescription": { "updatedFields": { "x": 2 }, "removedFields": [], "truncatedArrays": { "$$unsetOrMatches": { "$$exists": true } }, "disambiguatedPaths": { "$$unsetOrMatches": { "$$exists": true } } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "replace", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 3, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "delete", "ns": { "db": "database0", "coll": "collection0" } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Test rename and invalidate event types", "runOnRequirements": [ { "minServerVersion": "4.0.1" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "dropCollection", "object": "database0", "arguments": { "collection": "collection1" } }, { "name": "rename", "object": "globalCollection0", "arguments": { "to": "collection1" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "rename", "ns": { "db": "database0", "coll": "collection0" }, "to": { "db": "database0", "coll": "collection1" } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "invalidate" } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Test drop and invalidate event types", "runOnRequirements": [ { "minServerVersion": "4.0.1" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "dropCollection", "object": "database0", "arguments": { "collection": "collection0" } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "drop", "ns": { "db": "database0", "coll": "collection0" } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "invalidate" } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Test consecutive resume", "runOnRequirements": [ { "minServerVersion": "4.1.7" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "globalClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "getMore" ], "closeConnection": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [], "batchSize": 1 }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 2 } } }, { "name": "insertOne", "object": "globalCollection0", "arguments": { "document": { "x": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 1, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 2, "_id": { "$$exists": true } } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "fullDocument": { "x": 3, "_id": { "$$exists": true } } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": { "batchSize": 1 }, "pipeline": [ { "$changeStream": {} } ] }, "commandName": "aggregate", "databaseName": "database0" } } ] } ] }, { "description": "Test wallTime field is set in a change event", "runOnRequirements": [ { "minServerVersion": "6.0.0" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "database0", "coll": "collection0" }, "wallTime": { "$$exists": true } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/000077500000000000000000000000001511661753600257665ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/000077500000000000000000000000001511661753600272325ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/aggregate.json000066400000000000000000000227551511661753600320660ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Aggregate with deterministic encryption", "skipReason": "SERVER-39395", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encrypted_string": "457-55-5642" } } ] }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encrypted_string": "457-55-5642" } } ] }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } }, { "description": "Aggregate with empty pipeline", "skipReason": "SERVER-40829 hides agg support behind enableTestCommands flag.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "aggregate", "arguments": { "pipeline": [] }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [], "cursor": {} }, "command_name": "aggregate" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } }, { "description": "Aggregate should fail with random encryption", "skipReason": "SERVER-39395", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "random": "abc" } } ] }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] }, { "description": "Database aggregate should fail", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "aggregate", "object": "database", "arguments": { "pipeline": [ { "$currentOp": { "allUsers": false, "idleConnections": false, "localOps": true } }, { "$match": { "command.aggregate": { "$eq": 1 } } }, { "$project": { "command": 1 } }, { "$project": { "command.lsid": 0 } } ] }, "result": { "errorContains": "non-collection command not supported for auto encryption: aggregate" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/awsTemporary.json000066400000000000000000000132411511661753600326230ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert a document with auto encryption using the AWS provider with temporary credentials", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "awsTemporary": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } }, { "description": "Insert with invalid temporary credentials", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "awsTemporaryNoSessionToken": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "result": { "errorContains": "security token" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/azureKMS.json000066400000000000000000000132571511661753600316360ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "_id": { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "n+HWZ0ZSVOYA3cvQgP7inN4JSXfOH85IngmeQxRpQHjCCcqT3IFqEWNlrsVHiz3AELimHhX4HKqOLWMUeSIT6emUDDoQX9BAv8DR1+E1w4nGs/NyEneac78EYFkK3JysrFDOgl2ypCCTKAypkn9CkAx1if4cfgQE93LW4kczcyHdGiH36CIxrCDGv1UzAvERN5Qa47DVwsM6a+hWsF2AAAJVnF0wYLLJU07TuRHdMrrphPWXZsFgyV+lRqJ7DDpReKNO8nMPLV/mHqHBHGPGQiRdb9NoJo8CvokGz4+KE8oLwzKf6V24dtwZmRkrsDV4iOhvROAzz+Euo1ypSkL3mw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601573901680" } }, "updateDate": { "$date": { "$numberLong": "1601573901680" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyAltNames": [ "altname", "azure_altname" ] } ], "tests": [ { "description": "Insert a document with auto encryption using Azure KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "azure": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_azure": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_azure": { "$binary": { "base64": "AQGVERPgAAAAAAAAAAAAAAAC5DbBSwPwfSlBrDtRuglvNvCXD1KzDuCKY2P+4bRFtHDjpTOE2XuytPAUaAbXf1orsPq59PVZmsbTZbt2CB8qaQ==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string_azure": { "$binary": { "base64": "AQGVERPgAAAAAAAAAAAAAAAC5DbBSwPwfSlBrDtRuglvNvCXD1KzDuCKY2P+4bRFtHDjpTOE2XuytPAUaAbXf1orsPq59PVZmsbTZbt2CB8qaQ==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/badSchema.json000066400000000000000000000146321511661753600320020ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Schema with an encrypted field in an array", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } }, "bsonType": "array" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "result": { "errorContains": "Invalid schema" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "Schema without specifying parent object types", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "foo": { "properties": { "bar": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } } } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "result": { "errorContains": "Invalid schema" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "Schema with siblings of encrypt document", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" }, "bsonType": "object" } } } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "result": { "errorContains": "'encrypt' cannot be used in conjunction with 'bsonType'" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "Schema with logical keywords", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "anyOf": [ { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } ] } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "result": { "errorContains": "Invalid schema" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/basic.json000066400000000000000000000205721511661753600312140ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert with deterministic encryption, then find it", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } }, { "description": "Insert with randomized encryption, then find it", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "random": "123" } } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "random": "123" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "random": { "$$type": "binData" } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "random": { "$$type": "binData" } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/bulk.json000066400000000000000000000220671511661753600310710ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Bulk write with encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } } }, { "name": "insertOne", "arguments": { "document": { "_id": 2, "encrypted_string": "string1" } } }, { "name": "updateOne", "arguments": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "$and": [ { "encrypted_string": "string1" }, { "_id": 2 } ] } } } ], "options": { "ordered": true } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } } } ], "ordered": true }, "command_name": "update" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "$and": [ { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } }, { "_id": { "$eq": 2 } } ] }, "limit": 1 } ], "ordered": true }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } } ] } bypassAutoEncryption.json000066400000000000000000000244601511661753600342610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert with bypassAutoEncryption", "clientOptions": { "autoEncryptOpts": { "bypassAutoEncryption": true, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "encrypted_string": "string0" }, "bypassDocumentValidation": true } }, { "name": "find", "arguments": { "filter": {} }, "result": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 2, "encrypted_string": "string0" } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": {} }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": "string0" } ] } } }, { "description": "Insert with bypassAutoEncryption for local schema", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "bypassAutoEncryption": true, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "encrypted_string": "string0" }, "bypassDocumentValidation": true } }, { "name": "find", "arguments": { "filter": {} }, "result": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 2, "encrypted_string": "string0" } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": {} }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": "string0" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/bypassedCommand.json000066400000000000000000000047131511661753600332430ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": {}, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "ping is bypassed", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "runCommand", "object": "database", "command_name": "ping", "arguments": { "command": { "ping": 1 } } } ], "expectations": [ { "command_started_event": { "command": { "ping": 1 }, "command_name": "ping" } } ] }, { "description": "kill op is not bypassed", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "runCommand", "object": "database", "command_name": "killOp", "arguments": { "command": { "killOp": 1, "op": 1234 } }, "result": { "errorContains": "command not supported for auto encryption: killOp" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/count.json000066400000000000000000000133201511661753600312540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Count with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "count", "arguments": { "filter": { "encrypted_string": "string0" } }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "count": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, "command_name": "count" } } ] }, { "description": "Count fails when filtering on a random encrypted field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "count", "arguments": { "filter": { "random": "abc" } }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/countDocuments.json000066400000000000000000000143571511661753600331510ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "countDocuments with deterministic encryption", "skipReason": "waiting on SERVER-39395", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "countDocuments", "arguments": { "filter": { "encrypted_string": "string0" } }, "result": 1 } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] } create-and-createIndexes.json000066400000000000000000000054431511661753600346400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "tests": [ { "description": "create is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "unencryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "unencryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "unencryptedCollection" } } ] }, { "description": "createIndexes is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "unencryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "unencryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "createIndexes": "unencryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 } } ] } } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "unencryptedCollection", "index": "name" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/delete.json000066400000000000000000000213431511661753600313720ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "deleteOne with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "deleteOne", "arguments": { "filter": { "encrypted_string": "string0" } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "limit": 1 } ], "ordered": true }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } }, { "description": "deleteMany with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "deleteMany", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } } }, "result": { "deletedCount": 2 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } }, "limit": 0 } ], "ordered": true }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/distinct.json000066400000000000000000000163041511661753600317520ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "distinct with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "distinct", "arguments": { "filter": { "encrypted_string": "string0" }, "fieldName": "encrypted_string" }, "result": [ "string0" ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "distinct": "default", "key": "encrypted_string", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, "command_name": "distinct" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } }, { "description": "Distinct fails when filtering on a random encrypted field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "distinct", "arguments": { "filter": { "random": "abc" }, "fieldName": "encrypted_string" }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/explain.json000066400000000000000000000143251511661753600315720ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Explain a find with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "runCommand", "object": "database", "command_name": "explain", "arguments": { "command": { "explain": { "find": "default", "filter": { "encrypted_string": "string1" } } } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "explain": { "find": "default", "filter": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } } }, "verbosity": "allPlansExecution" }, "command_name": "explain" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/find.json000066400000000000000000000255111511661753600310510ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Find with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encrypted_string": "string0" } }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ] } } }, { "description": "Find with $in with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } } }, "result": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1", "random": "abc" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ] } } }, { "description": "Find fails when filtering on a random encrypted field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "random": "abc" } }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/findOneAndDelete.json000066400000000000000000000132111511661753600332530ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "findOneAndDelete with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "findOneAndDelete", "arguments": { "filter": { "encrypted_string": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "remove": true }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/findOneAndReplace.json000066400000000000000000000136321511661753600334330ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "findOneAndReplace with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "findOneAndReplace", "arguments": { "filter": { "encrypted_string": "string0" }, "replacement": { "encrypted_string": "string1" }, "returnDocument": "Before" }, "result": { "_id": 1, "encrypted_string": "string0" } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "update": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/findOneAndUpdate.json000066400000000000000000000137651511661753600333110ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "findOneAndUpdate with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "findOneAndUpdate", "arguments": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1" } }, "returnDocument": "Before" }, "result": { "_id": 1, "encrypted_string": "string0" } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "update": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/fle2v2-Compact.json000066400000000000000000000135541511661753600326210ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "7.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } }, { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Compact works", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "runCommand", "object": "database", "command_name": "compactStructuredEncryptionData", "arguments": { "command": { "compactStructuredEncryptionData": "default" } }, "result": { "ok": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "compactStructuredEncryptionData": "default", "compactionTokens": { "encryptedIndexed": { "$binary": { "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=", "subType": "00" } }, "encryptedUnindexed": { "$binary": { "base64": "SWO8WEoZ2r2Kx/muQKb7+COizy85nIIUFiHh4K9kcvA=", "subType": "00" } } } }, "command_name": "compactStructuredEncryptionData" } } ] }, { "description": "Compact errors on an unencrypted client", "operations": [ { "name": "runCommand", "object": "database", "command_name": "compactStructuredEncryptionData", "arguments": { "command": { "compactStructuredEncryptionData": "default" } }, "result": { "errorContains": "'compactStructuredEncryptionData.compactionTokens' is missing" } } ] } ] } fle2v2-CreateCollection-OldServer.json000066400000000000000000000046471511661753600363010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "6.0.0", "maxServerVersion": "6.3.99", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "tests": [ { "description": "driver returns an error if creating a QEv2 collection on unsupported server", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" }, "result": { "errorContains": "Driver support of Queryable Encryption is incompatible with server. Upgrade server to use Queryable Encryption." } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } } ] } ] } fle2v2-CreateCollection.json000066400000000000000000001340311511661753600343650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "tests": [ { "description": "state collections and index are created", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } } ] }, { "description": "default state collection names are applied", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } } ] }, { "description": "drop removes all state collections", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } }, { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } } ] }, { "description": "CreateCollection without encryptedFields.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "plaintextCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "plaintextCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "plaintextCollection" } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "plaintextCollection" } }, "command_name": "listCollections", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "plaintextCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "plaintextCollection" }, "command_name": "create", "database_name": "default" } } ] }, { "description": "CreateCollection from encryptedFieldsMap.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } } ] }, { "description": "CreateCollection from encryptedFields.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "command_name": "listCollections", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } } ] }, { "description": "DropCollection from encryptedFieldsMap", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } } ] }, { "description": "DropCollection from encryptedFields", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": {} } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } }, { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "command_name": "listCollections", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } } ] }, { "description": "DropCollection from remote encryptedFields", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": {} } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "__safeContent___1" } }, { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "command_name": "create", "database_name": "default" } }, { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "command_name": "listCollections", "database_name": "default" } }, { "command_started_event": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "command_name": "createIndexes", "database_name": "default" } }, { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "command_name": "listCollections", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "command_name": "drop", "database_name": "default" } }, { "command_started_event": { "command": { "drop": "encryptedCollection" }, "command_name": "drop", "database_name": "default" } } ] }, { "description": "encryptedFields are consulted for metadata collection names", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "encryptedFieldsMap": { "default.encryptedCollection": { "escCollection": "invalid_esc_name", "ecocCollection": "invalid_ecoc_name", "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" }, "result": { "errorContains": "Encrypted State Collection name should follow" } } ] } ] } fle2v2-DecryptExistingData.json000066400000000000000000000070201511661753600350620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ], "key_vault_data": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 decrypt of existing data succeeds", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encryptedUnindexed": "value123" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/fle2v2-Delete.json000066400000000000000000000174151511661753600324350ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Delete can query an FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedIndexed": "value123" } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [] } } } ] } fle2v2-EncryptedFields-vs-jsonSchema.json000066400000000000000000000201521511661753600367460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": {}, "bsonType": "object" }, "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "encryptedFields is preferred over jsonSchema", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } } }, { "name": "find", "arguments": { "filter": { "encryptedIndexed": "123" } }, "result": [ { "_id": 1, "encryptedIndexed": "123" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPGmZcUzdE/FPILvRSyAScGvZparGI2y9rJ/vSBxgCujBXMAIAAAAACi1RjmndKqgnXy7xb22RzUbnZl1sOZRXPOC0KcJkAxmQVsACAAAAAApJtKPW4+o9B7gAynNLL26jtlB4+hq5TXResijcYet8USY20AAAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "31eCYlbQoVboc5zwC8IoyJVSkag9PxREka8dkmbXJeY=", "subType": "00" } } ] } ] } } } ] } fle2v2-EncryptedFieldsMap-defaults.json000066400000000000000000000060001511661753600364670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "key_vault_data": [], "tests": [ { "description": "default state collections are applied to encryptionInformation", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.default": { "fields": [] } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } ], "encryptionInformation": { "type": { "$numberInt": "1" }, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [] } } }, "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } ] } } } ] } fle2v2-FindOneAndUpdate.json000066400000000000000000000371101511661753600342560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "findOneAndUpdate can query an FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "foo": "bar" } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedIndexed": "value123" } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "foo": "bar" } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "foo": "bar", "__safeContent__": [ { "$binary": { "base64": "ThpoKfQ8AkOzkFfNC1+9PF0pY2nIzfXvRdxQgjkNbBw=", "subType": "00" } } ] } ] } } }, { "description": "findOneAndUpdate can modify an FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "encryptedIndexed": "value456" } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedIndexed": "value123" } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "encryptedIndexed": "value456" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedIndexed": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "findAndModify" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rhe7/w8Ob8Unl44rGr/moScx6m5VODQnscDhF4Nkn6g=", "subType": "00" } } ] } ] } } } ] } fle2v2-InsertFind-Indexed.json000066400000000000000000000200311511661753600345630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Insert and find FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } } }, { "name": "find", "arguments": { "filter": { "encryptedIndexed": "123" } }, "result": [ { "_id": 1, "encryptedIndexed": "123" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPGmZcUzdE/FPILvRSyAScGvZparGI2y9rJ/vSBxgCujBXMAIAAAAACi1RjmndKqgnXy7xb22RzUbnZl1sOZRXPOC0KcJkAxmQVsACAAAAAApJtKPW4+o9B7gAynNLL26jtlB4+hq5TXResijcYet8USY20AAAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "31eCYlbQoVboc5zwC8IoyJVSkag9PxREka8dkmbXJeY=", "subType": "00" } } ] } ] } } } ] } fle2v2-InsertFind-Unindexed.json000066400000000000000000000133421511661753600351350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Insert and find FLE2 unindexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedUnindexed": "value123" } } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encryptedUnindexed": "value123" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedUnindexed": { "$$type": "binData" } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedUnindexed": { "$$type": "binData" } } ] } } }, { "description": "Query with an unindexed field fails", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedUnindexed": "value123" } } }, { "name": "find", "arguments": { "filter": { "encryptedUnindexed": "value123" } }, "result": { "errorContains": "encrypt" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/fle2v2-MissingKey.json000066400000000000000000000053101511661753600333040ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [ { "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [], "tests": [ { "description": "FLE2 encrypt fails with mising key", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } }, "result": { "errorContains": "not all keys requested were satisfied" } } ] }, { "description": "FLE2 decrypt fails with mising key", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": {} }, "result": { "errorContains": "not all keys requested were satisfied" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/fle2v2-NoEncryption.json000066400000000000000000000035431511661753600336570ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "key_vault_data": [], "encrypted_fields": { "fields": [] }, "tests": [ { "description": "insert with no encryption succeeds", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "foo": "bar" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "foo": "bar" } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "foo": "bar" } ] } } } ] } fle2v2-Rangev2-Compact.json000066400000000000000000000176231511661753600340450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Compact works with 'range' fields", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "runCommand", "object": "database", "command_name": "compactStructuredEncryptionData", "arguments": { "command": { "compactStructuredEncryptionData": "default" } }, "result": { "ok": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "compactStructuredEncryptionData": "default", "compactionTokens": { "encryptedInt": { "ecoc": { "$binary": { "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=", "subType": "00" } }, "anchorPaddingToken": { "$binary": { "base64": "QxKJD2If48p0l8NAXf2Kr0aleMd/dATSjBK6hTpNMyc=", "subType": "00" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "compactStructuredEncryptionData" } } ] } ] } fle2v2-Rangev2-Date-Aggregate.json000066400000000000000000000401071511661753600352110ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Date. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } } ] }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Date-Correctness.json000066400000000000000000001245141511661753600356220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "1" } } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "1" } } } } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lte": { "$date": { "$numberLong": "1" } } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "0" } } } } }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "200" } } } } }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } }, "$lt": { "$date": { "$numberLong": "2" } } } } }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } }, "$lte": { "$date": { "$numberLong": "200" } } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$in": [ { "$date": { "$numberLong": "0" } } ] } } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Insert out of range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "-1" } } } }, "result": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDate": { "$date": { "$numberLong": "200" } } } } }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 200, "encryptedDate": { "$date": { "$numberLong": "200" } } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "1" } } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "1" } } } } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lte": { "$date": { "$numberLong": "1" } } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "0" } } } } } ] }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "200" } } } } } ] }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } }, "$lt": { "$date": { "$numberLong": "2" } } } } } ] }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$date": { "$numberLong": "0" } } } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$date": { "$numberLong": "1" } } } } ] }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } }, "$lte": { "$date": { "$numberLong": "200" } } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$in": [ { "$date": { "$numberLong": "0" } } ] } } } ] }, "result": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Wrong type: Insert Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$numberDouble": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$numberDouble": "0" } } } }, "result": { "errorContains": "value type is a date" } } ] } ] } fle2v2-Rangev2-Date-Delete.json000066400000000000000000000341071511661753600345300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Date. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Date-FindOneAndUpdate.json000066400000000000000000000403601511661753600364340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Date. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } }, "update": { "$set": { "encryptedDate": { "$date": { "$numberLong": "2" } } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedDate": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Date-InsertFind.json000066400000000000000000000374761511661753600354070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Date. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "result": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Date-Update.json000066400000000000000000000405011511661753600345430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Date. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } }, "update": { "$set": { "encryptedDate": { "$date": { "$numberLong": "2" } } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedDate": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Decimal-Aggregate.json000066400000000000000000002726601511661753600357050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Decimal. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=", "subType": "00" } }, { "$binary": { "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=", "subType": "00" } }, { "$binary": { "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=", "subType": "00" } }, { "$binary": { "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=", "subType": "00" } }, { "$binary": { "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=", "subType": "00" } }, { "$binary": { "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=", "subType": "00" } }, { "$binary": { "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=", "subType": "00" } }, { "$binary": { "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=", "subType": "00" } }, { "$binary": { "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=", "subType": "00" } }, { "$binary": { "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=", "subType": "00" } }, { "$binary": { "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=", "subType": "00" } }, { "$binary": { "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=", "subType": "00" } }, { "$binary": { "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=", "subType": "00" } }, { "$binary": { "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=", "subType": "00" } }, { "$binary": { "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=", "subType": "00" } }, { "$binary": { "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=", "subType": "00" } }, { "$binary": { "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=", "subType": "00" } }, { "$binary": { "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=", "subType": "00" } }, { "$binary": { "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=", "subType": "00" } }, { "$binary": { "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=", "subType": "00" } }, { "$binary": { "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=", "subType": "00" } }, { "$binary": { "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=", "subType": "00" } }, { "$binary": { "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=", "subType": "00" } }, { "$binary": { "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=", "subType": "00" } }, { "$binary": { "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=", "subType": "00" } }, { "$binary": { "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=", "subType": "00" } }, { "$binary": { "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=", "subType": "00" } }, { "$binary": { "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=", "subType": "00" } }, { "$binary": { "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=", "subType": "00" } }, { "$binary": { "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=", "subType": "00" } }, { "$binary": { "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=", "subType": "00" } }, { "$binary": { "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=", "subType": "00" } }, { "$binary": { "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=", "subType": "00" } }, { "$binary": { "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=", "subType": "00" } }, { "$binary": { "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=", "subType": "00" } }, { "$binary": { "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=", "subType": "00" } }, { "$binary": { "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=", "subType": "00" } }, { "$binary": { "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=", "subType": "00" } }, { "$binary": { "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=", "subType": "00" } }, { "$binary": { "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=", "subType": "00" } }, { "$binary": { "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=", "subType": "00" } }, { "$binary": { "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=", "subType": "00" } }, { "$binary": { "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=", "subType": "00" } }, { "$binary": { "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=", "subType": "00" } }, { "$binary": { "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=", "subType": "00" } }, { "$binary": { "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=", "subType": "00" } }, { "$binary": { "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=", "subType": "00" } }, { "$binary": { "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=", "subType": "00" } }, { "$binary": { "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=", "subType": "00" } }, { "$binary": { "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=", "subType": "00" } }, { "$binary": { "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=", "subType": "00" } }, { "$binary": { "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=", "subType": "00" } }, { "$binary": { "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=", "subType": "00" } }, { "$binary": { "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=", "subType": "00" } }, { "$binary": { "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=", "subType": "00" } }, { "$binary": { "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=", "subType": "00" } }, { "$binary": { "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=", "subType": "00" } }, { "$binary": { "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=", "subType": "00" } }, { "$binary": { "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=", "subType": "00" } }, { "$binary": { "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=", "subType": "00" } }, { "$binary": { "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=", "subType": "00" } }, { "$binary": { "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=", "subType": "00" } }, { "$binary": { "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=", "subType": "00" } }, { "$binary": { "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=", "subType": "00" } }, { "$binary": { "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=", "subType": "00" } }, { "$binary": { "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=", "subType": "00" } }, { "$binary": { "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=", "subType": "00" } }, { "$binary": { "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=", "subType": "00" } }, { "$binary": { "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=", "subType": "00" } }, { "$binary": { "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=", "subType": "00" } }, { "$binary": { "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=", "subType": "00" } }, { "$binary": { "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=", "subType": "00" } }, { "$binary": { "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=", "subType": "00" } }, { "$binary": { "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=", "subType": "00" } }, { "$binary": { "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=", "subType": "00" } }, { "$binary": { "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=", "subType": "00" } }, { "$binary": { "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=", "subType": "00" } }, { "$binary": { "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=", "subType": "00" } }, { "$binary": { "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=", "subType": "00" } }, { "$binary": { "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=", "subType": "00" } }, { "$binary": { "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=", "subType": "00" } }, { "$binary": { "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=", "subType": "00" } }, { "$binary": { "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=", "subType": "00" } }, { "$binary": { "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=", "subType": "00" } }, { "$binary": { "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=", "subType": "00" } }, { "$binary": { "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=", "subType": "00" } }, { "$binary": { "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=", "subType": "00" } }, { "$binary": { "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=", "subType": "00" } }, { "$binary": { "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=", "subType": "00" } }, { "$binary": { "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=", "subType": "00" } }, { "$binary": { "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=", "subType": "00" } }, { "$binary": { "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=", "subType": "00" } }, { "$binary": { "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=", "subType": "00" } }, { "$binary": { "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=", "subType": "00" } }, { "$binary": { "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=", "subType": "00" } }, { "$binary": { "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=", "subType": "00" } }, { "$binary": { "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=", "subType": "00" } }, { "$binary": { "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=", "subType": "00" } }, { "$binary": { "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=", "subType": "00" } }, { "$binary": { "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=", "subType": "00" } }, { "$binary": { "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=", "subType": "00" } }, { "$binary": { "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=", "subType": "00" } }, { "$binary": { "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=", "subType": "00" } }, { "$binary": { "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=", "subType": "00" } }, { "$binary": { "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=", "subType": "00" } }, { "$binary": { "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=", "subType": "00" } }, { "$binary": { "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=", "subType": "00" } }, { "$binary": { "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=", "subType": "00" } }, { "$binary": { "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=", "subType": "00" } }, { "$binary": { "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=", "subType": "00" } }, { "$binary": { "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=", "subType": "00" } }, { "$binary": { "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=", "subType": "00" } }, { "$binary": { "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=", "subType": "00" } }, { "$binary": { "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=", "subType": "00" } }, { "$binary": { "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=", "subType": "00" } }, { "$binary": { "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=", "subType": "00" } }, { "$binary": { "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=", "subType": "00" } }, { "$binary": { "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=", "subType": "00" } }, { "$binary": { "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=", "subType": "00" } }, { "$binary": { "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=", "subType": "00" } }, { "$binary": { "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=", "subType": "00" } }, { "$binary": { "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=", "subType": "00" } }, { "$binary": { "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=", "subType": "00" } }, { "$binary": { "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Decimal-Correctness.json000066400000000000000000000670051511661753600363040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" } } } }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gte": { "$numberDecimal": "0.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "1.0" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$lt": { "$numberDecimal": "1.0" } } } }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$lte": { "$numberDecimal": "1.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gte": { "$numberDecimal": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "1.0" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$lt": { "$numberDecimal": "1.0" } } } } ] }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$lte": { "$numberDecimal": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } } ] }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } ] }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } ] }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberInt": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Decimal-Delete.json000066400000000000000000002073461511661753600352200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Decimal. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Decimal-FindOneAndUpdate.json000066400000000000000000002731211511661753600371200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Decimal. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$numberDecimal": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=", "subType": "00" } }, { "$binary": { "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=", "subType": "00" } }, { "$binary": { "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=", "subType": "00" } }, { "$binary": { "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=", "subType": "00" } }, { "$binary": { "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=", "subType": "00" } }, { "$binary": { "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=", "subType": "00" } }, { "$binary": { "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=", "subType": "00" } }, { "$binary": { "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=", "subType": "00" } }, { "$binary": { "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=", "subType": "00" } }, { "$binary": { "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=", "subType": "00" } }, { "$binary": { "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=", "subType": "00" } }, { "$binary": { "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=", "subType": "00" } }, { "$binary": { "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=", "subType": "00" } }, { "$binary": { "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=", "subType": "00" } }, { "$binary": { "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=", "subType": "00" } }, { "$binary": { "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=", "subType": "00" } }, { "$binary": { "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=", "subType": "00" } }, { "$binary": { "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=", "subType": "00" } }, { "$binary": { "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=", "subType": "00" } }, { "$binary": { "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=", "subType": "00" } }, { "$binary": { "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=", "subType": "00" } }, { "$binary": { "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=", "subType": "00" } }, { "$binary": { "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=", "subType": "00" } }, { "$binary": { "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=", "subType": "00" } }, { "$binary": { "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=", "subType": "00" } }, { "$binary": { "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=", "subType": "00" } }, { "$binary": { "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=", "subType": "00" } }, { "$binary": { "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=", "subType": "00" } }, { "$binary": { "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=", "subType": "00" } }, { "$binary": { "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=", "subType": "00" } }, { "$binary": { "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=", "subType": "00" } }, { "$binary": { "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=", "subType": "00" } }, { "$binary": { "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=", "subType": "00" } }, { "$binary": { "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=", "subType": "00" } }, { "$binary": { "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=", "subType": "00" } }, { "$binary": { "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=", "subType": "00" } }, { "$binary": { "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=", "subType": "00" } }, { "$binary": { "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=", "subType": "00" } }, { "$binary": { "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=", "subType": "00" } }, { "$binary": { "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=", "subType": "00" } }, { "$binary": { "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=", "subType": "00" } }, { "$binary": { "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=", "subType": "00" } }, { "$binary": { "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=", "subType": "00" } }, { "$binary": { "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=", "subType": "00" } }, { "$binary": { "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=", "subType": "00" } }, { "$binary": { "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=", "subType": "00" } }, { "$binary": { "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=", "subType": "00" } }, { "$binary": { "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=", "subType": "00" } }, { "$binary": { "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=", "subType": "00" } }, { "$binary": { "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=", "subType": "00" } }, { "$binary": { "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=", "subType": "00" } }, { "$binary": { "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=", "subType": "00" } }, { "$binary": { "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=", "subType": "00" } }, { "$binary": { "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=", "subType": "00" } }, { "$binary": { "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=", "subType": "00" } }, { "$binary": { "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=", "subType": "00" } }, { "$binary": { "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=", "subType": "00" } }, { "$binary": { "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=", "subType": "00" } }, { "$binary": { "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=", "subType": "00" } }, { "$binary": { "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=", "subType": "00" } }, { "$binary": { "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=", "subType": "00" } }, { "$binary": { "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=", "subType": "00" } }, { "$binary": { "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=", "subType": "00" } }, { "$binary": { "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=", "subType": "00" } }, { "$binary": { "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=", "subType": "00" } }, { "$binary": { "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=", "subType": "00" } }, { "$binary": { "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=", "subType": "00" } }, { "$binary": { "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=", "subType": "00" } }, { "$binary": { "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=", "subType": "00" } }, { "$binary": { "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=", "subType": "00" } }, { "$binary": { "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=", "subType": "00" } }, { "$binary": { "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=", "subType": "00" } }, { "$binary": { "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=", "subType": "00" } }, { "$binary": { "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=", "subType": "00" } }, { "$binary": { "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=", "subType": "00" } }, { "$binary": { "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=", "subType": "00" } }, { "$binary": { "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=", "subType": "00" } }, { "$binary": { "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=", "subType": "00" } }, { "$binary": { "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=", "subType": "00" } }, { "$binary": { "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=", "subType": "00" } }, { "$binary": { "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=", "subType": "00" } }, { "$binary": { "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=", "subType": "00" } }, { "$binary": { "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=", "subType": "00" } }, { "$binary": { "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=", "subType": "00" } }, { "$binary": { "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=", "subType": "00" } }, { "$binary": { "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=", "subType": "00" } }, { "$binary": { "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=", "subType": "00" } }, { "$binary": { "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=", "subType": "00" } }, { "$binary": { "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=", "subType": "00" } }, { "$binary": { "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=", "subType": "00" } }, { "$binary": { "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=", "subType": "00" } }, { "$binary": { "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=", "subType": "00" } }, { "$binary": { "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=", "subType": "00" } }, { "$binary": { "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=", "subType": "00" } }, { "$binary": { "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=", "subType": "00" } }, { "$binary": { "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=", "subType": "00" } }, { "$binary": { "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=", "subType": "00" } }, { "$binary": { "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=", "subType": "00" } }, { "$binary": { "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=", "subType": "00" } }, { "$binary": { "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=", "subType": "00" } }, { "$binary": { "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=", "subType": "00" } }, { "$binary": { "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=", "subType": "00" } }, { "$binary": { "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=", "subType": "00" } }, { "$binary": { "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=", "subType": "00" } }, { "$binary": { "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=", "subType": "00" } }, { "$binary": { "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=", "subType": "00" } }, { "$binary": { "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=", "subType": "00" } }, { "$binary": { "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=", "subType": "00" } }, { "$binary": { "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=", "subType": "00" } }, { "$binary": { "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=", "subType": "00" } }, { "$binary": { "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=", "subType": "00" } }, { "$binary": { "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=", "subType": "00" } }, { "$binary": { "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=", "subType": "00" } }, { "$binary": { "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=", "subType": "00" } }, { "$binary": { "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=", "subType": "00" } }, { "$binary": { "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=", "subType": "00" } }, { "$binary": { "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=", "subType": "00" } }, { "$binary": { "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=", "subType": "00" } }, { "$binary": { "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=", "subType": "00" } }, { "$binary": { "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=", "subType": "00" } }, { "$binary": { "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=", "subType": "00" } }, { "$binary": { "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=", "subType": "00" } }, { "$binary": { "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=", "subType": "00" } }, { "$binary": { "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=", "subType": "00" } }, { "$binary": { "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=", "subType": "00" } }, { "$binary": { "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Decimal-InsertFind.json000066400000000000000000002722571511661753600360660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Decimal. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "result": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=", "subType": "00" } }, { "$binary": { "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=", "subType": "00" } }, { "$binary": { "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=", "subType": "00" } }, { "$binary": { "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=", "subType": "00" } }, { "$binary": { "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=", "subType": "00" } }, { "$binary": { "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=", "subType": "00" } }, { "$binary": { "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=", "subType": "00" } }, { "$binary": { "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=", "subType": "00" } }, { "$binary": { "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=", "subType": "00" } }, { "$binary": { "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=", "subType": "00" } }, { "$binary": { "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=", "subType": "00" } }, { "$binary": { "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=", "subType": "00" } }, { "$binary": { "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=", "subType": "00" } }, { "$binary": { "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=", "subType": "00" } }, { "$binary": { "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=", "subType": "00" } }, { "$binary": { "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=", "subType": "00" } }, { "$binary": { "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=", "subType": "00" } }, { "$binary": { "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=", "subType": "00" } }, { "$binary": { "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=", "subType": "00" } }, { "$binary": { "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=", "subType": "00" } }, { "$binary": { "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=", "subType": "00" } }, { "$binary": { "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=", "subType": "00" } }, { "$binary": { "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=", "subType": "00" } }, { "$binary": { "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=", "subType": "00" } }, { "$binary": { "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=", "subType": "00" } }, { "$binary": { "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=", "subType": "00" } }, { "$binary": { "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=", "subType": "00" } }, { "$binary": { "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=", "subType": "00" } }, { "$binary": { "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=", "subType": "00" } }, { "$binary": { "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=", "subType": "00" } }, { "$binary": { "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=", "subType": "00" } }, { "$binary": { "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=", "subType": "00" } }, { "$binary": { "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=", "subType": "00" } }, { "$binary": { "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=", "subType": "00" } }, { "$binary": { "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=", "subType": "00" } }, { "$binary": { "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=", "subType": "00" } }, { "$binary": { "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=", "subType": "00" } }, { "$binary": { "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=", "subType": "00" } }, { "$binary": { "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=", "subType": "00" } }, { "$binary": { "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=", "subType": "00" } }, { "$binary": { "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=", "subType": "00" } }, { "$binary": { "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=", "subType": "00" } }, { "$binary": { "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=", "subType": "00" } }, { "$binary": { "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=", "subType": "00" } }, { "$binary": { "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=", "subType": "00" } }, { "$binary": { "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=", "subType": "00" } }, { "$binary": { "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=", "subType": "00" } }, { "$binary": { "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=", "subType": "00" } }, { "$binary": { "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=", "subType": "00" } }, { "$binary": { "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=", "subType": "00" } }, { "$binary": { "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=", "subType": "00" } }, { "$binary": { "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=", "subType": "00" } }, { "$binary": { "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=", "subType": "00" } }, { "$binary": { "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=", "subType": "00" } }, { "$binary": { "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=", "subType": "00" } }, { "$binary": { "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=", "subType": "00" } }, { "$binary": { "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=", "subType": "00" } }, { "$binary": { "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=", "subType": "00" } }, { "$binary": { "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=", "subType": "00" } }, { "$binary": { "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=", "subType": "00" } }, { "$binary": { "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=", "subType": "00" } }, { "$binary": { "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=", "subType": "00" } }, { "$binary": { "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=", "subType": "00" } }, { "$binary": { "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=", "subType": "00" } }, { "$binary": { "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=", "subType": "00" } }, { "$binary": { "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=", "subType": "00" } }, { "$binary": { "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=", "subType": "00" } }, { "$binary": { "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=", "subType": "00" } }, { "$binary": { "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=", "subType": "00" } }, { "$binary": { "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=", "subType": "00" } }, { "$binary": { "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=", "subType": "00" } }, { "$binary": { "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=", "subType": "00" } }, { "$binary": { "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=", "subType": "00" } }, { "$binary": { "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=", "subType": "00" } }, { "$binary": { "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=", "subType": "00" } }, { "$binary": { "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=", "subType": "00" } }, { "$binary": { "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=", "subType": "00" } }, { "$binary": { "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=", "subType": "00" } }, { "$binary": { "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=", "subType": "00" } }, { "$binary": { "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=", "subType": "00" } }, { "$binary": { "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=", "subType": "00" } }, { "$binary": { "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=", "subType": "00" } }, { "$binary": { "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=", "subType": "00" } }, { "$binary": { "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=", "subType": "00" } }, { "$binary": { "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=", "subType": "00" } }, { "$binary": { "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=", "subType": "00" } }, { "$binary": { "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=", "subType": "00" } }, { "$binary": { "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=", "subType": "00" } }, { "$binary": { "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=", "subType": "00" } }, { "$binary": { "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=", "subType": "00" } }, { "$binary": { "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=", "subType": "00" } }, { "$binary": { "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=", "subType": "00" } }, { "$binary": { "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=", "subType": "00" } }, { "$binary": { "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=", "subType": "00" } }, { "$binary": { "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=", "subType": "00" } }, { "$binary": { "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=", "subType": "00" } }, { "$binary": { "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=", "subType": "00" } }, { "$binary": { "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=", "subType": "00" } }, { "$binary": { "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=", "subType": "00" } }, { "$binary": { "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=", "subType": "00" } }, { "$binary": { "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=", "subType": "00" } }, { "$binary": { "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=", "subType": "00" } }, { "$binary": { "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=", "subType": "00" } }, { "$binary": { "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=", "subType": "00" } }, { "$binary": { "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=", "subType": "00" } }, { "$binary": { "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=", "subType": "00" } }, { "$binary": { "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=", "subType": "00" } }, { "$binary": { "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=", "subType": "00" } }, { "$binary": { "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=", "subType": "00" } }, { "$binary": { "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=", "subType": "00" } }, { "$binary": { "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=", "subType": "00" } }, { "$binary": { "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=", "subType": "00" } }, { "$binary": { "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=", "subType": "00" } }, { "$binary": { "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=", "subType": "00" } }, { "$binary": { "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=", "subType": "00" } }, { "$binary": { "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=", "subType": "00" } }, { "$binary": { "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=", "subType": "00" } }, { "$binary": { "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=", "subType": "00" } }, { "$binary": { "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=", "subType": "00" } }, { "$binary": { "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=", "subType": "00" } }, { "$binary": { "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=", "subType": "00" } }, { "$binary": { "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=", "subType": "00" } }, { "$binary": { "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=", "subType": "00" } }, { "$binary": { "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Decimal-Update.json000066400000000000000000002732741511661753600352430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Decimal. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$numberDecimal": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "u": { "$set": { "encryptedDecimalNoPrecision": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=", "subType": "00" } }, { "$binary": { "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=", "subType": "00" } }, { "$binary": { "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=", "subType": "00" } }, { "$binary": { "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=", "subType": "00" } }, { "$binary": { "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=", "subType": "00" } }, { "$binary": { "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=", "subType": "00" } }, { "$binary": { "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=", "subType": "00" } }, { "$binary": { "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=", "subType": "00" } }, { "$binary": { "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=", "subType": "00" } }, { "$binary": { "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=", "subType": "00" } }, { "$binary": { "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=", "subType": "00" } }, { "$binary": { "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=", "subType": "00" } }, { "$binary": { "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=", "subType": "00" } }, { "$binary": { "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=", "subType": "00" } }, { "$binary": { "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=", "subType": "00" } }, { "$binary": { "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=", "subType": "00" } }, { "$binary": { "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=", "subType": "00" } }, { "$binary": { "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=", "subType": "00" } }, { "$binary": { "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=", "subType": "00" } }, { "$binary": { "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=", "subType": "00" } }, { "$binary": { "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=", "subType": "00" } }, { "$binary": { "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=", "subType": "00" } }, { "$binary": { "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=", "subType": "00" } }, { "$binary": { "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=", "subType": "00" } }, { "$binary": { "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=", "subType": "00" } }, { "$binary": { "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=", "subType": "00" } }, { "$binary": { "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=", "subType": "00" } }, { "$binary": { "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=", "subType": "00" } }, { "$binary": { "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=", "subType": "00" } }, { "$binary": { "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=", "subType": "00" } }, { "$binary": { "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=", "subType": "00" } }, { "$binary": { "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=", "subType": "00" } }, { "$binary": { "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=", "subType": "00" } }, { "$binary": { "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=", "subType": "00" } }, { "$binary": { "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=", "subType": "00" } }, { "$binary": { "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=", "subType": "00" } }, { "$binary": { "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=", "subType": "00" } }, { "$binary": { "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=", "subType": "00" } }, { "$binary": { "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=", "subType": "00" } }, { "$binary": { "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=", "subType": "00" } }, { "$binary": { "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=", "subType": "00" } }, { "$binary": { "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=", "subType": "00" } }, { "$binary": { "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=", "subType": "00" } }, { "$binary": { "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=", "subType": "00" } }, { "$binary": { "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=", "subType": "00" } }, { "$binary": { "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=", "subType": "00" } }, { "$binary": { "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=", "subType": "00" } }, { "$binary": { "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=", "subType": "00" } }, { "$binary": { "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=", "subType": "00" } }, { "$binary": { "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=", "subType": "00" } }, { "$binary": { "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=", "subType": "00" } }, { "$binary": { "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=", "subType": "00" } }, { "$binary": { "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=", "subType": "00" } }, { "$binary": { "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=", "subType": "00" } }, { "$binary": { "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=", "subType": "00" } }, { "$binary": { "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=", "subType": "00" } }, { "$binary": { "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=", "subType": "00" } }, { "$binary": { "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=", "subType": "00" } }, { "$binary": { "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=", "subType": "00" } }, { "$binary": { "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=", "subType": "00" } }, { "$binary": { "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=", "subType": "00" } }, { "$binary": { "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=", "subType": "00" } }, { "$binary": { "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=", "subType": "00" } }, { "$binary": { "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=", "subType": "00" } }, { "$binary": { "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=", "subType": "00" } }, { "$binary": { "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=", "subType": "00" } }, { "$binary": { "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=", "subType": "00" } }, { "$binary": { "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=", "subType": "00" } }, { "$binary": { "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=", "subType": "00" } }, { "$binary": { "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=", "subType": "00" } }, { "$binary": { "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=", "subType": "00" } }, { "$binary": { "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=", "subType": "00" } }, { "$binary": { "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=", "subType": "00" } }, { "$binary": { "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=", "subType": "00" } }, { "$binary": { "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=", "subType": "00" } }, { "$binary": { "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=", "subType": "00" } }, { "$binary": { "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=", "subType": "00" } }, { "$binary": { "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=", "subType": "00" } }, { "$binary": { "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=", "subType": "00" } }, { "$binary": { "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=", "subType": "00" } }, { "$binary": { "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=", "subType": "00" } }, { "$binary": { "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=", "subType": "00" } }, { "$binary": { "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=", "subType": "00" } }, { "$binary": { "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=", "subType": "00" } }, { "$binary": { "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=", "subType": "00" } }, { "$binary": { "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=", "subType": "00" } }, { "$binary": { "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=", "subType": "00" } }, { "$binary": { "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=", "subType": "00" } }, { "$binary": { "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=", "subType": "00" } }, { "$binary": { "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=", "subType": "00" } }, { "$binary": { "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=", "subType": "00" } }, { "$binary": { "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=", "subType": "00" } }, { "$binary": { "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=", "subType": "00" } }, { "$binary": { "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=", "subType": "00" } }, { "$binary": { "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=", "subType": "00" } }, { "$binary": { "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=", "subType": "00" } }, { "$binary": { "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=", "subType": "00" } }, { "$binary": { "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=", "subType": "00" } }, { "$binary": { "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=", "subType": "00" } }, { "$binary": { "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=", "subType": "00" } }, { "$binary": { "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=", "subType": "00" } }, { "$binary": { "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=", "subType": "00" } }, { "$binary": { "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=", "subType": "00" } }, { "$binary": { "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=", "subType": "00" } }, { "$binary": { "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=", "subType": "00" } }, { "$binary": { "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=", "subType": "00" } }, { "$binary": { "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=", "subType": "00" } }, { "$binary": { "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=", "subType": "00" } }, { "$binary": { "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=", "subType": "00" } }, { "$binary": { "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=", "subType": "00" } }, { "$binary": { "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=", "subType": "00" } }, { "$binary": { "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=", "subType": "00" } }, { "$binary": { "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=", "subType": "00" } }, { "$binary": { "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=", "subType": "00" } }, { "$binary": { "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=", "subType": "00" } }, { "$binary": { "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=", "subType": "00" } }, { "$binary": { "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=", "subType": "00" } }, { "$binary": { "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=", "subType": "00" } }, { "$binary": { "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=", "subType": "00" } }, { "$binary": { "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=", "subType": "00" } }, { "$binary": { "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=", "subType": "00" } }, { "$binary": { "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=", "subType": "00" } }, { "$binary": { "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=", "subType": "00" } }, { "$binary": { "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=", "subType": "00" } }, { "$binary": { "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=", "subType": "00" } }, { "$binary": { "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DecimalPrecision-Aggregate.json000066400000000000000000000506531511661753600375550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DecimalPrecision-Correctness.json000066400000000000000000001165061511661753600401610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" } } } }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "1.0" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "1.0" } } } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lte": { "$numberDecimal": "1.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "0.0" } } } }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "200.0" } } } }, "result": { "errorContains": "must be less than the range max" } } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" }, "$lte": { "$numberDecimal": "200.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Insert out of range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "-1" } } }, "result": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDecimalPrecision": { "$numberDecimal": "200.0" } } } }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 200, "encryptedDecimalPrecision": { "$numberDecimal": "200.0" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "1.0" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "1.0" } } } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lte": { "$numberDecimal": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "0.0" } } } } ] }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "200.0" } } } } ] }, "result": { "errorContains": "must be less than the range max" } } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } } ] }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } ] }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" }, "$lte": { "$numberDecimal": "200.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberInt": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-DecimalPrecision-Delete.json000066400000000000000000000420171511661753600370640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DecimalPrecision-FindOneAndUpdate.json000066400000000000000000000511101511661753600407640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$numberDecimal": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DecimalPrecision-InsertFind.json000066400000000000000000000501061511661753600377250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "result": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DecimalPrecision-Update.json000066400000000000000000000511211511661753600371000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$numberDecimal": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "u": { "$set": { "encryptedDecimalPrecision": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Defaults.json000066400000000000000000000463211511661753600342230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range applies defaults for trimFactor and sparsity", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedInt": { "$gt": { "$binary": { "base64": "DRgbAAADcGF5bG9hZADEGgAABGcAsBoAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAA30oqY6NKy1KWDWf6Z36DtA2QsL9JRALvHX6smxz8cb4FcwAgAAAAADIhM0hCHwFGH+k7kPGuZlO+v5TjV6RRwA5FqUKM60o0BWwAIAAAAABTMPNUweBKrILSCxc5gcgjn9pTkkKX7KqWXgNMk4q7XgADMgB9AAAABWQAIAAAAACnCDvYEbgR9fWeQ8SatKNX43p0XIXTyFfzc7/395V2swVzACAAAAAAp8pkn2wJrZRBLlD18oE1ZRRiujmtFtuHYTZDzdGNE4kFbAAgAAAAAE2eptD2Jp126h5cd7S6k8IjRB6QJhuuWzPU/SEynDXTAAMzAH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzQAfQAAAAVkACAAAAAA8Ci9z02yMVsDNyHvLStLAHR25LO22UO5P/gbUG/IStQFcwAgAAAAAOdfFhaFVq1JPr3dIeLm1EYKWgceZ7hZ5FJT5u/lL/I+BWwAIAAAAADqUyU1hSFDLCmqsz2dhPhefzCShUV/Z2x+4P9xcGw8rwADNQB9AAAABWQAIAAAAAD3g2atCWYVOXW0YbCbvIturqNIAsy210bkL9KmqVMlAAVzACAAAAAAVGEb7L0QCjV/PBTAvUyhlddo467ToKjlMdwI9hsjuE4FbAAgAAAAAJe0bDhUH1sZldnDGWn0xMa1CQuN6cgv/i/6XqnpPS39AAM2AH0AAAAFZAAgAAAAANQOKUE9FOmCoMva2IYg45LZXJX0cMpUR1OvIwFmjLDYBXMAIAAAAAB6dyIKkQ86l/8j8zeWcDYeVGRYKd0USz6To3LbOBAKsAVsACAAAAAAELK0ExI0g4/WxNs+mf+Ua+mie3MuMO3daPGukA23VUYAAzcAfQAAAAVkACAAAAAARQp+fGA08v1bhcnYbfsP0ubXl9yg18QmYMfh2sd8EdEFcwAgAAAAABhe79wEznE298tt02xyRF7bk7a2NH9kwVg1TPY5/lT1BWwAIAAAAAADiGV5f/RRPkwpSrZMGHNBSarmwyqV+SYXI73QW/PmnwADOAB9AAAABWQAIAAAAABnW3CpmSFTglPNKYHJHhJHC/vd5BMWQpztIXQBL0sCngVzACAAAAAAC21qRBu2Px7VUz1lW95Dfn/0tw2yq9AVBtka34HijLgFbAAgAAAAAP8S1s5OA5cJT6ILpA94LanuLsSl9BsRCWHBtufFTMVrAAM5AH0AAAAFZAAgAAAAAJRIWu6DI2LR+2Pi09OaBZEmS2FInyBnGs9wf9Jf2wiIBXMAIAAAAABoDqKzj11qyOfXl4dcfkmGHqZxXyAsnGlgA9wsJRWWUQVsACAAAAAAIsDousyo/D8e4BCwUqvFhrKtOnpcGCSqpN94oFtWaC0AAzEwAH0AAAAFZAAgAAAAAE0h7vfdciFBeqIk1N14ZXw/jzFT0bLfXcNyiPRsg4W4BXMAIAAAAAB0Kbvm3VLBphtd8/OpgNuJtJaJJLhHBCKZJJeK+GcthAVsACAAAAAAKfjHp8xww1JDjzyjTnfamOvjFDc1Z3Hp/v/ZuQnFOOEAAzExAH0AAAAFZAAgAAAAACL9+rQRyywIXa5Pr7g2SnB0s0EjIct7PQtzjEkA69acBXMAIAAAAADz54imCCbu/qQkYP9wW2f5pHoBS+EyCe+xuDwC0UTiYgVsACAAAAAAKv602j4c3Bpn2t10qGl68eAD/fQsIH5lKMj8ANwrf7oAAzEyAH0AAAAFZAAgAAAAAKTK0NLhQ/+Y/HMxjRwBlXpXJAhAmCoWf1fReTegPnVpBXMAIAAAAAD7AlW+P4FfQS4r8d7EEvPVEP1diSbrVDBqg8ZvNl1XRAVsACAAAAAATTSEkff+/JMBjNwUciY2RQ6M66uMQMAtwU+UidDv1y4AAzEzAH0AAAAFZAAgAAAAAGMbgPxi2Wu1AlqoDKTgyBnCZlnCjHm2naxRcizkIbYJBXMAIAAAAADMvSM3VZzVyRFCfUvcLXAXQFRIxlhm0t0dUsnaRZG4hgVsACAAAAAAI7uGriMAQc4A/a70Yi1Y7IAC7o/mfNYf7/FvwELYf80AAzE0AH0AAAAFZAAgAAAAAPnZ1bdmrcX0fsSxliuSqvDbRqwIiVg0tYp0PViRX0nOBXMAIAAAAAAqBdZGg9O74mnwyQF+lILtyzHdLOErDjPSf9sM8EqCugVsACAAAAAAwhuDsz+fCtqY8mW8QvEVQERjDChwrYTw4y7dinlCCOMAAzE1AH0AAAAFZAAgAAAAAJ40Dmb5BUT1AlWjfXB43nIbJgDn9rBg9FAeYR80WK0vBXMAIAAAAAAMPqLMDdNmnKzA3Hq49/NkJfs+/cjnyjSAbmiOFUE5FgVsACAAAAAAxbi7ql49Y4pduqWlLJqpwimRzrEnC7w5fWaMBiinHL8AAzE2AH0AAAAFZAAgAAAAAGelnhqWM2gUVy4P5QE/2Zfd7s9BugPqB/tcnSsFg5X0BXMAIAAAAAAWUhif3G+NMvZ3YPLB5OMuIhfPEu6U8KR9gTvJFz5uIwVsACAAAAAADEs8/aVSj2sJjxjv1K7o/aH8vZzt1bga73YiIKUx5DYAAzE3AH0AAAAFZAAgAAAAAD1xX2wCyf1aK1MoXnBAPfWLeBxsJI2i06tWbuiYKgElBXMAIAAAAACW1NW4RibvY0JRUzPvCmKnVbEy8AIS70fmsY08WgJOEgVsACAAAAAAQq9eIVoLcd4WxXUC3vub+EnxmcI2uP/yUWr3cz0jv9EAAzE4AH0AAAAFZAAgAAAAAHwU1LYeJmTch640sTu3VRRRdQg4YZ7S9IRfVXWHEWU8BXMAIAAAAACozWKD2YlqbQiBVVwJKptfAVM+R2FPJPtXkxVFAhHNXQVsACAAAAAAn7LS0QzTv9sOJzxH0ZqxsLYBYoArEo/PIXkU/zTnpM0AAzE5AH0AAAAFZAAgAAAAAHKaToAsILpmJyCE02I1iwmF/FibqaOb4b5nteuwOayfBXMAIAAAAABPxYjSK5DKgsdUZrZ+hM6ikejPCUK6Rqa0leoN7KOM0QVsACAAAAAAH9rPq5vvOIe9nTAcM1W1dVhQZ+gSkBohgoWLPcZnQXcAAzIwAH0AAAAFZAAgAAAAANTGiHqJVq28n7mMZsJD6gHxVQp1A6z8wgZVW+xV/lhmBXMAIAAAAABCR4BfdNVy7WE+IyQ312vYuIW0aGcXxr2II/MbNz8ZdAVsACAAAAAAng0GYpYJTypRLQUd5tIXWaAjZX5na04T/BypmwwrXPoAAzIxAH0AAAAFZAAgAAAAABooumzjEqp9Hvvd+sn1L82NI2iUGRl0nXQNJTHM7oyVBXMAIAAAAADgjz5L2ursK4C+pXXsJ6XHABhyallj9s/vSUgxXvjiiwVsACAAAAAAPjlAM0tbO6EUmLAeIZt57YMkMsuQfuC3T3d9vtnxgjwAAzIyAH0AAAAFZAAgAAAAAMA4jmE8U2uGkYUeKoYSlb22tfrRq2VlhV1Jq1kn4hV9BXMAIAAAAADG4fLeJUcINPSb1pMfAASJkuYsgS/59Eq/51mET/Y7RQVsACAAAAAAmwwcWOnzvpxm4pROXOL+BlxjEG/7v7hIautb2ubFT44AAzIzAH0AAAAFZAAgAAAAAK8/E3VHzHM6Kjp39GjFy+ci1IiUG5oxh0W6elV+oiX2BXMAIAAAAAA4/F4Q94xxb2TvZcMcji/DVTFrZlH8BL/HzD86RRmqNAVsACAAAAAAif3HPf6B1dTX/W+Vlp6ohadEQk/GAmHYzXfJia2zHeIAAzI0AH0AAAAFZAAgAAAAAGUX9ttLN1cCrOjlzsl/E6jEzQottNDw8Zo94nbO1133BXMAIAAAAAA7uVthFvXH+pbBrgQmnkPcpiHFEVCAi0WA7sAt9tlt3gVsACAAAAAAznaMStSbtGXU1Pb5z9KDTvEd79s6gmWYCKOKdzeijpEAAzI1AH0AAAAFZAAgAAAAAKnT/qg8N85Q9EQvpH7FBqUooxHFgrIjqLlIDheva2QSBXMAIAAAAABGAKkFMKoSIrvClWF7filoYM6fI9xSqOJVNS3dv4lxYwVsACAAAAAAgITE31hQA4ZOxpUFYSYv0mzWbd/6RKgbUXiUY96fBQEAAzI2AH0AAAAFZAAgAAAAAHRDRDT2hJrJ8X9zB9ELT28q8ZsfkYr92chaZYakiLlqBXMAIAAAAAAT0Le67ObldDta/Qb17dYfdslPsJTfGj3bWAgC0JIingVsACAAAAAAMGDrqys8iJ3fCT2Cj+zXIuXtsf4OAXWJl5HoPUMlbNoAAzI3AH0AAAAFZAAgAAAAAOOJcUjYOE0KqcYS1yZ363zglQXfr3XSD+R5fWLSivDoBXMAIAAAAABjeLe+tg37lNa+DdVxtlCtY77tV9PqfJ5X4XEKrfwu0AVsACAAAAAAlbpHiQAPLLTvSF+u58RBCLnYQKB5wciIQmANV9bkzsoAAzI4AH0AAAAFZAAgAAAAAMwWOOaWDDYUusdA1nyoaEB3C4/9GRpFNGags95Ddp4LBXMAIAAAAACLrsQXGWK15fW4mPEUXJ/90by13aG+727qWJep8QJ/WgVsACAAAAAAuThwsAsKUB56QAXC0MjJsZ9736atbiHPlK2tE0urf9QAAzI5AH0AAAAFZAAgAAAAABPRXBK0z8UANcvMDWntBjN9yF7iGMPLbhbaKrvHwcplBXMAIAAAAACZlqWsYPIb+ydmH03BxD3TqSGsSNoI7EVCy0VgW0TpYgVsACAAAAAAD2uaBv8oc7l4EeC5PWx5sfeyGZoas0JdFJ33M3jjgjMAAzMwAH0AAAAFZAAgAAAAAOn9/6pbzjIxFEApugaVOvVKXq23sDCJELv5UtLPDZI3BXMAIAAAAACHIwSDTlof0vFoigF4drbeM/8rdlj/4U386zQsNLtPGwVsACAAAAAAsYt/rXnpL55J9rlWSFRA4seaU6ggix7RgxbrJPu6gO4AAzMxAH0AAAAFZAAgAAAAAIMCESykv5b5d6mYjU5DlnO709lOFCaNoJBLtzBIqmg4BXMAIAAAAADs1Bfuaun4Es3nQ4kr29BzheLRDcFv+9a0gOGkSEcrDgVsACAAAAAA5kW6i/jOBSdoGAsZEZxVNRvt6miv86bP8JfUT+1KJg8AAzMyAH0AAAAFZAAgAAAAAFSPmr27XgKhUkbEvvC6Br5K1w7280NZrrhdzfYF+YGjBXMAIAAAAADv2h+Xq6kM7MHYTLMACRwbe2MzGHu4sdB67FGzDR6H4QVsACAAAAAAKII0MMC7o6GKVfGo2qBW/p35NupBp7MI6Gp0zXYwJOcAAzMzAH0AAAAFZAAgAAAAAPSV9qprvlNZK6OSQZNxKhJmBMs6QCKFESB/oeIvAS0iBXMAIAAAAAA835Jh22/pvZgKoYH6KjE+RRpYkaM1G35TWq6uplk/rgVsACAAAAAA162IdSb079yVlS7GkuSdHU3dOw03a+NS55ZPVBxbD08AAzM0AH0AAAAFZAAgAAAAAGsadEBJFax/UltPXB86G/YPxo6h353ZT+rC62iGy7qqBXMAIAAAAADs9TP3h91f6bTuG8QCQMA3atAVGs8k0ZjVzX3pM8HNAgVsACAAAAAA2ed4R4wYD6DT0P+N6o3gDJPE0DjljbRAv5vme3jb42sAAzM1AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzM2AH0AAAAFZAAgAAAAAKJY+8+7psFzJb5T+Mg9UWb6gA9Y8NN9j/ML2jZkNDNPBXMAIAAAAAA2R/nCtSYfCim89BzdUPS+DTQGwYDk+2ihFPEBS8h+ygVsACAAAAAAaEQra7xyvA3JS0BasIpRVrz7ZXsp6RpH7OpfJBFzFG8AAzM3AH0AAAAFZAAgAAAAAI4qr+sJiRaqwZRhnenAzD7tTKq+jP1aaLyAln3w1HQuBXMAIAAAAADNYpqV73NpwN+Ta0ms1SRiu+6WNOOdGT+syghL+JAFhQVsACAAAAAAN07Fo9SK+fXp5Odk1J806pyVWc2WHXCtb1gJQknTgqsAAzM4AH0AAAAFZAAgAAAAAISgN1Hid7IWvDESN/3tywFZiBsZPYapOUx9/QjDDxLfBXMAIAAAAAA7lxpEz3+CGdv6/WKIAlIwRYURREKgn7+StwNoVekkDwVsACAAAAAAx+Oa2v1e1R7VomfsvcKO8VkY4eTl7LzjNQQL6Cj6GBQAAzM5AH0AAAAFZAAgAAAAAOTLdk1RIUzCsvK7xCXy+LxGhJf87fEL406U9QKta3JRBXMAIAAAAAD8+6UnUn8sN6AgQuuf7uFxW+2ZJNpZLgp3eKVtjbo9ewVsACAAAAAAQN3mZHmaDM0ZbUnk2O/+wCUjiCs4bnshfHjd/4ygLXcAAzQwAH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzQxAH0AAAAFZAAgAAAAAPLX4XT1eMfokMvj73G6loHEotbdivVFM6cpMbU0zIOmBXMAIAAAAABuTqwm6E60kVBN5iClzLnMBozIQRYjMozzRNKVhixkEAVsACAAAAAAjvY9G0Of8EQcZ4GVfSEVz7jrNn7i4qps2r82jJmngKoAAzQyAH0AAAAFZAAgAAAAAGzGJAUZBcVKRb4bCSNaRxtcDH2TqIgHqMElD9RL7SzDBXMAIAAAAABbJfrLwBrqZ2Ylm9QfL7nkW+GJ8vTlaeMUDT5620ebaAVsACAAAAAASiaS1IlBls5Tan57XqqbR1cuvyOcoSibJJQGREzm4c0AAzQzAH0AAAAFZAAgAAAAAC028abAppwE/ApZHU5RbzZZ8OPD5eJ8/6+NgiSFf4d+BXMAIAAAAAD3THvDUYWULR+AVLuRRPPAMVMeZ2ldWpBYSODboszWbQVsACAAAAAAATOaeYj+kx3MTDeNUcKGbUxLZDeMjC8JrWnlHmWTamQAAzQ0AH0AAAAFZAAgAAAAAHWr8wQYIKLiKeb3wd8kZQuXD/GUHDqXj12K/EQWV11CBXMAIAAAAADo3aFHDuyfls9tcWCxlFqJn4zDXd3WT9CIFYFjJnTYswVsACAAAAAAeMbIatR7DgefzuvF4WyNVDjJxP8KPA6U/rmMQIBvpM0AAzQ1AH0AAAAFZAAgAAAAAMdRi6AAjF1Z9ucMqYl2Ud1PLUGOlOPJFgSrPTjs27u8BXMAIAAAAAAqOdI7+P8srvqCTFadwMM3iggaVOGcf1BB0EjBYeV6RAVsACAAAAAAU+V2GrqgxJYs9mxuak/8JMFICXwQ2vksrBdOvSwWFpoAAzQ2AH0AAAAFZAAgAAAAADKKe++fqh4sn0a8Bb+w3QMFnOqSE5hDI3zGQTcmJGcOBXMAIAAAAAC8ebHa++JmxVISv6LzjuMgEZqzKSZlJyujnSV9syRD9AVsACAAAAAAQcVNSjyetScLu78IrAYaAigerY4kWtnbctmIyb19Wa4AAzQ3AH0AAAAFZAAgAAAAAMKoHwhZcocaQy7asIuRG8+P1qPENgFAwzc3X1gZWYnJBXMAIAAAAAB+R01s+WdJjLa5p7STuEylradWr+2JDxsWx9bKDgXNDQVsACAAAAAADeXTBHsm+FH2pQVoqOBPPIJiTJLqrzGisNnQ3S3xYJAAAzQ4AH0AAAAFZAAgAAAAAF41XuyBvREKcxjDl+wbnillseykpAjCKHmwIu+RNvM7BXMAIAAAAAC2Wzq+2mfO7howoOZxquqvOuH1D2WdlzA1nK+LUp0FMgVsACAAAAAARha+D6DVeDxSjNyXXO5DMY+W70EGyfc7gxR4TjzcYusAAzQ5AH0AAAAFZAAgAAAAAAfONgdhLPEjvsMxTY9K4//7WjREuRmZ6Bpcf3yvdMf3BXMAIAAAAABCy/zjmzucxQkbJ96l5vS5x6SeyHE0Z+Aqp9oZgBcC6QVsACAAAAAAasG/uN4DnWHZLkLhH4cMzXk5F/HL2D+72WH+1jjgH8UAAzUwAH0AAAAFZAAgAAAAAA5ZsebFm5NrSGs2E17+fUt4qkzsVmy4IJA5nGehtSBVBXMAIAAAAAAOzteKfp+YGPqn1fi8u/lKXP7E2Zgouwgt6KAADHX9AQVsACAAAAAA2+FaAbl8JZogfNCI0FFbmZZPy/KLF1u16FGrPspSbEIAAzUxAH0AAAAFZAAgAAAAAHf6LIjrvy6I31w/8b910U9qU8cBIYiWn9mW55NYZF8VBXMAIAAAAACONPisRtnFG9vV2mTQ3hRR/hGuVRA9dGd9Lt9JqDoM8wVsACAAAAAA+h7V/jIYJcd0ALIvFBlwxkFqWxBVlkqT9wFkmumr4QcAAzUyAH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAIAAAAAAAAAEHRmAAYAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Double-Aggregate.json000066400000000000000000001364521511661753600355570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Double. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=", "subType": "00" } }, { "$binary": { "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=", "subType": "00" } }, { "$binary": { "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=", "subType": "00" } }, { "$binary": { "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=", "subType": "00" } }, { "$binary": { "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=", "subType": "00" } }, { "$binary": { "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=", "subType": "00" } }, { "$binary": { "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=", "subType": "00" } }, { "$binary": { "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=", "subType": "00" } }, { "$binary": { "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=", "subType": "00" } }, { "$binary": { "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=", "subType": "00" } }, { "$binary": { "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=", "subType": "00" } }, { "$binary": { "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=", "subType": "00" } }, { "$binary": { "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=", "subType": "00" } }, { "$binary": { "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=", "subType": "00" } }, { "$binary": { "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=", "subType": "00" } }, { "$binary": { "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=", "subType": "00" } }, { "$binary": { "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=", "subType": "00" } }, { "$binary": { "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=", "subType": "00" } }, { "$binary": { "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=", "subType": "00" } }, { "$binary": { "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=", "subType": "00" } }, { "$binary": { "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=", "subType": "00" } }, { "$binary": { "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=", "subType": "00" } }, { "$binary": { "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=", "subType": "00" } }, { "$binary": { "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=", "subType": "00" } }, { "$binary": { "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=", "subType": "00" } }, { "$binary": { "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=", "subType": "00" } }, { "$binary": { "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=", "subType": "00" } }, { "$binary": { "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=", "subType": "00" } }, { "$binary": { "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=", "subType": "00" } }, { "$binary": { "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=", "subType": "00" } }, { "$binary": { "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=", "subType": "00" } }, { "$binary": { "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=", "subType": "00" } }, { "$binary": { "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=", "subType": "00" } }, { "$binary": { "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=", "subType": "00" } }, { "$binary": { "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=", "subType": "00" } }, { "$binary": { "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=", "subType": "00" } }, { "$binary": { "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=", "subType": "00" } }, { "$binary": { "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=", "subType": "00" } }, { "$binary": { "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=", "subType": "00" } }, { "$binary": { "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=", "subType": "00" } }, { "$binary": { "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=", "subType": "00" } }, { "$binary": { "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=", "subType": "00" } }, { "$binary": { "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=", "subType": "00" } }, { "$binary": { "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=", "subType": "00" } }, { "$binary": { "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=", "subType": "00" } }, { "$binary": { "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=", "subType": "00" } }, { "$binary": { "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=", "subType": "00" } }, { "$binary": { "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=", "subType": "00" } }, { "$binary": { "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=", "subType": "00" } }, { "$binary": { "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=", "subType": "00" } }, { "$binary": { "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=", "subType": "00" } }, { "$binary": { "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=", "subType": "00" } }, { "$binary": { "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=", "subType": "00" } }, { "$binary": { "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=", "subType": "00" } }, { "$binary": { "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=", "subType": "00" } }, { "$binary": { "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=", "subType": "00" } }, { "$binary": { "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=", "subType": "00" } }, { "$binary": { "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=", "subType": "00" } }, { "$binary": { "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=", "subType": "00" } }, { "$binary": { "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Double-Correctness.json000066400000000000000000000666471511661753600361730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" } } } }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gte": { "$numberDouble": "0.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "1.0" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$lt": { "$numberDouble": "1.0" } } } }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$lte": { "$numberDouble": "1.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gte": { "$numberDouble": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "1.0" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$lt": { "$numberDouble": "1.0" } } } } ] }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$lte": { "$numberDouble": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } } ] }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } ] }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } ] }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberInt": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Double-Delete.json000066400000000000000000001044251511661753600350660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Double. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Double-FindOneAndUpdate.json000066400000000000000000001367101511661753600367760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Double. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$numberDouble": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=", "subType": "00" } }, { "$binary": { "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=", "subType": "00" } }, { "$binary": { "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=", "subType": "00" } }, { "$binary": { "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=", "subType": "00" } }, { "$binary": { "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=", "subType": "00" } }, { "$binary": { "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=", "subType": "00" } }, { "$binary": { "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=", "subType": "00" } }, { "$binary": { "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=", "subType": "00" } }, { "$binary": { "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=", "subType": "00" } }, { "$binary": { "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=", "subType": "00" } }, { "$binary": { "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=", "subType": "00" } }, { "$binary": { "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=", "subType": "00" } }, { "$binary": { "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=", "subType": "00" } }, { "$binary": { "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=", "subType": "00" } }, { "$binary": { "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=", "subType": "00" } }, { "$binary": { "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=", "subType": "00" } }, { "$binary": { "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=", "subType": "00" } }, { "$binary": { "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=", "subType": "00" } }, { "$binary": { "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=", "subType": "00" } }, { "$binary": { "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=", "subType": "00" } }, { "$binary": { "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=", "subType": "00" } }, { "$binary": { "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=", "subType": "00" } }, { "$binary": { "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=", "subType": "00" } }, { "$binary": { "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=", "subType": "00" } }, { "$binary": { "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=", "subType": "00" } }, { "$binary": { "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=", "subType": "00" } }, { "$binary": { "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=", "subType": "00" } }, { "$binary": { "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=", "subType": "00" } }, { "$binary": { "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=", "subType": "00" } }, { "$binary": { "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=", "subType": "00" } }, { "$binary": { "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=", "subType": "00" } }, { "$binary": { "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=", "subType": "00" } }, { "$binary": { "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=", "subType": "00" } }, { "$binary": { "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=", "subType": "00" } }, { "$binary": { "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=", "subType": "00" } }, { "$binary": { "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=", "subType": "00" } }, { "$binary": { "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=", "subType": "00" } }, { "$binary": { "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=", "subType": "00" } }, { "$binary": { "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=", "subType": "00" } }, { "$binary": { "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=", "subType": "00" } }, { "$binary": { "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=", "subType": "00" } }, { "$binary": { "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=", "subType": "00" } }, { "$binary": { "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=", "subType": "00" } }, { "$binary": { "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=", "subType": "00" } }, { "$binary": { "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=", "subType": "00" } }, { "$binary": { "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=", "subType": "00" } }, { "$binary": { "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=", "subType": "00" } }, { "$binary": { "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=", "subType": "00" } }, { "$binary": { "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=", "subType": "00" } }, { "$binary": { "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=", "subType": "00" } }, { "$binary": { "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=", "subType": "00" } }, { "$binary": { "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=", "subType": "00" } }, { "$binary": { "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=", "subType": "00" } }, { "$binary": { "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=", "subType": "00" } }, { "$binary": { "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=", "subType": "00" } }, { "$binary": { "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=", "subType": "00" } }, { "$binary": { "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=", "subType": "00" } }, { "$binary": { "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=", "subType": "00" } }, { "$binary": { "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=", "subType": "00" } }, { "$binary": { "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=", "subType": "00" } }, { "$binary": { "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=", "subType": "00" } }, { "$binary": { "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Double-InsertFind.json000066400000000000000000001360511511661753600357310ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Double. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } }, "result": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=", "subType": "00" } }, { "$binary": { "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=", "subType": "00" } }, { "$binary": { "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=", "subType": "00" } }, { "$binary": { "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=", "subType": "00" } }, { "$binary": { "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=", "subType": "00" } }, { "$binary": { "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=", "subType": "00" } }, { "$binary": { "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=", "subType": "00" } }, { "$binary": { "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=", "subType": "00" } }, { "$binary": { "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=", "subType": "00" } }, { "$binary": { "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=", "subType": "00" } }, { "$binary": { "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=", "subType": "00" } }, { "$binary": { "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=", "subType": "00" } }, { "$binary": { "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=", "subType": "00" } }, { "$binary": { "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=", "subType": "00" } }, { "$binary": { "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=", "subType": "00" } }, { "$binary": { "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=", "subType": "00" } }, { "$binary": { "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=", "subType": "00" } }, { "$binary": { "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=", "subType": "00" } }, { "$binary": { "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=", "subType": "00" } }, { "$binary": { "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=", "subType": "00" } }, { "$binary": { "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=", "subType": "00" } }, { "$binary": { "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=", "subType": "00" } }, { "$binary": { "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=", "subType": "00" } }, { "$binary": { "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=", "subType": "00" } }, { "$binary": { "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=", "subType": "00" } }, { "$binary": { "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=", "subType": "00" } }, { "$binary": { "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=", "subType": "00" } }, { "$binary": { "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=", "subType": "00" } }, { "$binary": { "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=", "subType": "00" } }, { "$binary": { "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=", "subType": "00" } }, { "$binary": { "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=", "subType": "00" } }, { "$binary": { "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=", "subType": "00" } }, { "$binary": { "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=", "subType": "00" } }, { "$binary": { "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=", "subType": "00" } }, { "$binary": { "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=", "subType": "00" } }, { "$binary": { "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=", "subType": "00" } }, { "$binary": { "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=", "subType": "00" } }, { "$binary": { "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=", "subType": "00" } }, { "$binary": { "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=", "subType": "00" } }, { "$binary": { "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=", "subType": "00" } }, { "$binary": { "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=", "subType": "00" } }, { "$binary": { "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=", "subType": "00" } }, { "$binary": { "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=", "subType": "00" } }, { "$binary": { "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=", "subType": "00" } }, { "$binary": { "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=", "subType": "00" } }, { "$binary": { "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=", "subType": "00" } }, { "$binary": { "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=", "subType": "00" } }, { "$binary": { "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=", "subType": "00" } }, { "$binary": { "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=", "subType": "00" } }, { "$binary": { "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=", "subType": "00" } }, { "$binary": { "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=", "subType": "00" } }, { "$binary": { "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=", "subType": "00" } }, { "$binary": { "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=", "subType": "00" } }, { "$binary": { "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=", "subType": "00" } }, { "$binary": { "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=", "subType": "00" } }, { "$binary": { "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=", "subType": "00" } }, { "$binary": { "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=", "subType": "00" } }, { "$binary": { "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=", "subType": "00" } }, { "$binary": { "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=", "subType": "00" } }, { "$binary": { "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Double-Update.json000066400000000000000000001370651511661753600351140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Double. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$numberDouble": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "u": { "$set": { "encryptedDoubleNoPrecision": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=", "subType": "00" } }, { "$binary": { "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=", "subType": "00" } }, { "$binary": { "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=", "subType": "00" } }, { "$binary": { "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=", "subType": "00" } }, { "$binary": { "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=", "subType": "00" } }, { "$binary": { "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=", "subType": "00" } }, { "$binary": { "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=", "subType": "00" } }, { "$binary": { "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=", "subType": "00" } }, { "$binary": { "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=", "subType": "00" } }, { "$binary": { "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=", "subType": "00" } }, { "$binary": { "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=", "subType": "00" } }, { "$binary": { "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=", "subType": "00" } }, { "$binary": { "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=", "subType": "00" } }, { "$binary": { "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=", "subType": "00" } }, { "$binary": { "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=", "subType": "00" } }, { "$binary": { "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=", "subType": "00" } }, { "$binary": { "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=", "subType": "00" } }, { "$binary": { "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=", "subType": "00" } }, { "$binary": { "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=", "subType": "00" } }, { "$binary": { "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=", "subType": "00" } }, { "$binary": { "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=", "subType": "00" } }, { "$binary": { "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=", "subType": "00" } }, { "$binary": { "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=", "subType": "00" } }, { "$binary": { "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=", "subType": "00" } }, { "$binary": { "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=", "subType": "00" } }, { "$binary": { "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=", "subType": "00" } }, { "$binary": { "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=", "subType": "00" } }, { "$binary": { "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=", "subType": "00" } }, { "$binary": { "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=", "subType": "00" } }, { "$binary": { "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=", "subType": "00" } }, { "$binary": { "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=", "subType": "00" } }, { "$binary": { "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=", "subType": "00" } }, { "$binary": { "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=", "subType": "00" } }, { "$binary": { "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=", "subType": "00" } }, { "$binary": { "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=", "subType": "00" } }, { "$binary": { "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=", "subType": "00" } }, { "$binary": { "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=", "subType": "00" } }, { "$binary": { "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=", "subType": "00" } }, { "$binary": { "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=", "subType": "00" } }, { "$binary": { "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=", "subType": "00" } }, { "$binary": { "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=", "subType": "00" } }, { "$binary": { "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=", "subType": "00" } }, { "$binary": { "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=", "subType": "00" } }, { "$binary": { "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=", "subType": "00" } }, { "$binary": { "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=", "subType": "00" } }, { "$binary": { "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=", "subType": "00" } }, { "$binary": { "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=", "subType": "00" } }, { "$binary": { "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=", "subType": "00" } }, { "$binary": { "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=", "subType": "00" } }, { "$binary": { "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=", "subType": "00" } }, { "$binary": { "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=", "subType": "00" } }, { "$binary": { "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=", "subType": "00" } }, { "$binary": { "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=", "subType": "00" } }, { "$binary": { "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=", "subType": "00" } }, { "$binary": { "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=", "subType": "00" } }, { "$binary": { "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=", "subType": "00" } }, { "$binary": { "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=", "subType": "00" } }, { "$binary": { "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=", "subType": "00" } }, { "$binary": { "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=", "subType": "00" } }, { "$binary": { "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=", "subType": "00" } }, { "$binary": { "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=", "subType": "00" } }, { "$binary": { "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DoublePrecision-Aggregate.json000066400000000000000000000504251511661753600374260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DoublePrecision-Correctness.json000066400000000000000000001162021511661753600400260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" } } } }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "1.0" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "1.0" } } } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lte": { "$numberDouble": "1.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "0.0" } } } }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "200.0" } } } }, "result": { "errorContains": "must be less than the range max" } } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" }, "$lte": { "$numberDouble": "200.0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Insert out of range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "-1" } } }, "result": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDoublePrecision": { "$numberDouble": "200.0" } } } }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 200, "encryptedDoublePrecision": { "$numberDouble": "200.0" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "1.0" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "1.0" } } } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lte": { "$numberDouble": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "0.0" } } } } ] }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "200.0" } } } } ] }, "result": { "errorContains": "must be less than the range max" } } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } } ] }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } ] }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" }, "$lte": { "$numberDouble": "200.0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberInt": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-DoublePrecision-Delete.json000066400000000000000000000416561511661753600367500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DoublePrecision-FindOneAndUpdate.json000066400000000000000000000506571511661753600406570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DoublePrecision. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoublePrecision": { "$numberDouble": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "update": { "$set": { "encryptedDoublePrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DoublePrecision-InsertFind.json000066400000000000000000000500241511661753600376000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } }, "result": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-DoublePrecision-Update.json000066400000000000000000000510361511661753600367610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoublePrecision": { "$numberDouble": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "u": { "$set": { "encryptedDoublePrecision": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Int-Aggregate.json000066400000000000000000000365411511661753600350750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Int. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Int-Correctness.json000066400000000000000000001126461511661753600355020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "1" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lt": { "$numberInt": "1" } } } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lte": { "$numberInt": "1" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lt": { "$numberInt": "0" } } } }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "200" } } } }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" }, "$lt": { "$numberInt": "2" } } } }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$numberInt": "0" } } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$numberInt": "1" } } }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberInt": "0" }, "$lte": { "$numberInt": "200" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$in": [ { "$numberInt": "0" } ] } } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Insert out of range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "-1" } } }, "result": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedInt": { "$numberInt": "200" } } } }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 200, "encryptedInt": { "$numberInt": "200" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gte": { "$numberInt": "0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "1" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lt": { "$numberInt": "1" } } } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lte": { "$numberInt": "1" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lt": { "$numberInt": "0" } } } } ] }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "200" } } } } ] }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "0" }, "$lt": { "$numberInt": "2" } } } } ] }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$numberInt": "0" } } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$numberInt": "1" } } } ] }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gte": { "$numberInt": "0" }, "$lte": { "$numberInt": "200" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$in": [ { "$numberInt": "0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Wrong type: Insert Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberDouble": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberDouble": "0" } } } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Int-Delete.json000066400000000000000000000326331511661753600344070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Int. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Int-FindOneAndUpdate.json000066400000000000000000000367401511661753600363200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Int. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } }, "update": { "$set": { "encryptedInt": { "$numberInt": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "update": { "$set": { "encryptedInt": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Int-InsertFind.json000066400000000000000000000361401511661753600352470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Int. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "result": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Int-Update.json000066400000000000000000000371361511661753600344320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Int. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } }, "update": { "$set": { "encryptedInt": { "$numberInt": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "u": { "$set": { "encryptedInt": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Long-Aggregate.json000066400000000000000000000366071511661753600352450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Long. Aggregate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } } ] }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "aggregate" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Long-Correctness.json000066400000000000000000001131521511661753600356400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Find with $gt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberLong": "0" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "1" } } } }, "result": [] } ] }, { "description": "Find with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lt": { "$numberLong": "1" } } } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Find with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lte": { "$numberLong": "1" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lt": { "$numberLong": "0" } } } }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "200" } } } }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" }, "$lt": { "$numberLong": "2" } } } }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$numberLong": "0" } } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$numberLong": "1" } } }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberLong": "0" }, "$lte": { "$numberLong": "200" } } }, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$in": [ { "$numberLong": "0" } ] } } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Insert out of range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "-1" } } }, "result": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedLong": { "$numberLong": "200" } } } }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 200, "encryptedLong": { "$numberLong": "200" } } ] } ] }, { "description": "Aggregate with $gte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gte": { "$numberLong": "0" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $gt with no results", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "1" } } } } ] }, "result": [] } ] }, { "description": "Aggregate with $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lt": { "$numberLong": "1" } } } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Aggregate with $lte", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lte": { "$numberLong": "1" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $lt below min", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lt": { "$numberLong": "0" } } } } ] }, "result": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "200" } } } } ] }, "result": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "0" }, "$lt": { "$numberLong": "2" } } } } ] }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with equality", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$numberLong": "0" } } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$numberLong": "1" } } } ] }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with full range", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gte": { "$numberLong": "0" }, "$lte": { "$numberLong": "200" } } } }, { "$sort": { "_id": 1 } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $in", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$in": [ { "$numberLong": "0" } ] } } } ] }, "result": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Wrong type: Insert Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberDouble": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberDouble": "0" } } } }, "result": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Long-Delete.json000066400000000000000000000326761511661753600345630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Long. Delete.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "deleteOne", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "delete" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Long-FindOneAndUpdate.json000066400000000000000000000370111511661753600364550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Long. FindOneAndUpdate.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } }, "update": { "$set": { "encryptedLong": { "$numberLong": "2" } } }, "returnDocument": "Before" }, "result": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "findAndModify": "default", "query": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedLong": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "findAndModify" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Long-InsertFind.json000066400000000000000000000362061511661753600354170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Long. Insert and Find.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "result": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-Long-Update.json000066400000000000000000000372051511661753600345740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "FLE2 Range Long. Update.", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } }, "update": { "$set": { "encryptedLong": { "$numberLong": "2" } } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command_name": "update", "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedLong": { "$$type": "binData" } } } } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, "$db": "default" } } } ], "outcome": { "collection": { "data": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } } } ] } fle2v2-Rangev2-WrongType.json000066400000000000000000000073021511661753600344060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "8.0.0", "topology": [ "replicaset", "sharded", "load-balanced" ], "maxServerVersion": "8.99.99" } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Wrong type: Insert Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberDouble": "0" } } }, "result": { "errorContains": "cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } } }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberDouble": "0" } } }, "sort": { "_id": 1 } }, "result": { "errorContains": "field type is not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/fle2v2-Update.json000066400000000000000000000374761511661753600324660ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "encrypted_fields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "key_vault_data": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Update can query an FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "foo": "bar" } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "foo": "bar" } } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "foo": "bar", "__safeContent__": [ { "$binary": { "base64": "ThpoKfQ8AkOzkFfNC1+9PF0pY2nIzfXvRdxQgjkNbBw=", "subType": "00" } } ] } ] } } }, { "description": "Update can modify an FLE2 indexed field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } } }, { "name": "updateOne", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "encryptedIndexed": "value456" } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "encryptedIndexed": "value456" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "insert" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedIndexed": { "$$type": "binData" } } } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "command_name": "update" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rhe7/w8Ob8Unl44rGr/moScx6m5VODQnscDhF4Nkn6g=", "subType": "00" } } ] } ] } } } ] } fle2v2-validatorAndPartialFieldExpression.json000066400000000000000000000337411511661753600401250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "default", "collection_name": "default", "data": [], "tests": [ { "description": "create with a validator on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } } ] }, { "description": "create with a validator on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "validator": { "encryptedIndexed": "foo" } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "collMod with a validator on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "collMod": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } } } ] }, { "description": "collMod with a validator on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "collMod": "encryptedCollection", "validator": { "encryptedIndexed": "foo" } } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "createIndexes with a partialFilterExpression on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "unencrypted_string": "foo" } } ] } } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "name" } } ] }, { "description": "createIndexes with a partialFilterExpression on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "encryptedIndexed": "foo" } } ] } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/gcpKMS.json000066400000000000000000000131451511661753600312550ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "_id": { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "CiQAIgLj0WyktnB4dfYHo5SLZ41K4ASQrjJUaSzl5vvVH0G12G0SiQEAjlV8XPlbnHDEDFbdTO4QIe8ER2/172U1ouLazG0ysDtFFIlSvWX5ZnZUrRMmp/R2aJkzLXEt/zf8Mn4Lfm+itnjgo5R9K4pmPNvvPKNZX5C16lrPT+aA+rd+zXFSmlMg3i5jnxvTdLHhg3G7Q/Uv1ZIJskKt95bzLoe0tUVzRWMYXLIEcohnQg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601574333107" } }, "updateDate": { "$date": { "$numberLong": "1601574333107" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyAltNames": [ "altname", "gcp_altname" ] } ], "tests": [ { "description": "Insert a document with auto encryption using GCP KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "gcp": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_gcp": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_gcp": { "$binary": { "base64": "ARgj/gAAAAAAAAAAAAAAAAACwFd+Y5Ojw45GUXNvbcIpN9YkRdoHDHkR4kssdn0tIMKlDQOLFkWFY9X07IRlXsxPD8DcTiKnl6XINK28vhcGlg==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string_gcp": { "$binary": { "base64": "ARgj/gAAAAAAAAAAAAAAAAACwFd+Y5Ojw45GUXNvbcIpN9YkRdoHDHkR4kssdn0tIMKlDQOLFkWFY9X07IRlXsxPD8DcTiKnl6XINK28vhcGlg==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/getMore.json000066400000000000000000000152651511661753600315400ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "getMore with encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "batchSize": 2, "filter": {} }, "result": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1" }, { "_id": 3, "encrypted_string": "string2" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "default", "batchSize": 2 }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "getMore": { "$$type": "long" }, "collection": "default", "batchSize": 2 }, "command_name": "getMore" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/insert.json000066400000000000000000000217131511661753600314350ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "insertOne with encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } }, { "description": "insertMany with encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertMany", "arguments": { "documents": [ { "_id": 1, "encrypted_string": "string0", "random": "abc" }, { "_id": 2, "encrypted_string": "string1" } ] } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/keyAltName.json000066400000000000000000000126131511661753600321620ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert with encryption using key alt name", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_w_altname": "string0", "altname": "altname" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [] } }, { "keyAltNames": { "$in": [ "altname" ] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_w_altname": { "$$type": "binData" }, "altname": "altname" } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_w_altname": { "$$type": "binData" }, "altname": "altname" } ] } } }, { "description": "Replace with key alt name fails", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "encrypted_w_altname": "string0" } }, "upsert": true }, "result": { "errorContains": "A non-static (JSONPointer) keyId is not supported" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/keyCache.json000066400000000000000000000153221511661753600316440ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert with deterministic encryption, then find it", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} }, "keyExpirationMS": 1 } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 50 } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/kmipKMS.json000066400000000000000000000224701511661753600314450ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip_delegated": { "encrypt": { "keyId": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "_id": { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "eUYDyB0HuWb+lQgUwO+6qJQyTTDTY2gp9FbemL7ZFo0pvr0x6rm6Ff9OVUTGH6HyMKipaeHdiIJU1dzsLwvqKvi7Beh+U4iaIWX/K0oEg1GOsJc0+Z/in8gNHbGUYLmycHViM3LES3kdt7FdFSUl5rEBHrM71yoNEXImz17QJWMGOuT4x6yoi2pvnaRJwfrI4DjpmnnTrDMac92jgZehbg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1634220190041" } }, "updateDate": { "$date": { "$numberLong": "1634220190041" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "kmip", "keyId": "1" }, "keyAltNames": [ "altname", "kmip_altname" ] }, { "_id": { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" }, "keyMaterial": { "$binary": { "base64": "5TLMFWlguBWe5GUESTvOVtkdBsCrynhnV72XRyZ66/nk+EP9/1oEp1t1sg0+vwCTqULHjBiUE6DRx2mYD/Eup1+u2Jgz9/+1sV1drXeOPALNPkSgiZiDbIb67zRi+wTABEcKcegJH+FhmSGxwUoQAiHCsCbcvia5P8tN1lt98YQ=", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1634220190041" } }, "updateDate": { "$date": { "$numberLong": "1634220190041" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "kmip", "delegated": true, "keyId": "11" }, "keyAltNames": [ "delegated" ] } ], "tests": [ { "description": "Insert a document with auto encryption using KMIP KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "kmip": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_kmip": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_kmip": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6UCKCwtKFIsL8eKObDVxvqGupJNUk7kXswHhB7G5j/C1D+6no+Asra0KgSU43bTL3ooIBLVyIzbV5CDJYqzAsa4WQ==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string_kmip": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6UCKCwtKFIsL8eKObDVxvqGupJNUk7kXswHhB7G5j/C1D+6no+Asra0KgSU43bTL3ooIBLVyIzbV5CDJYqzAsa4WQ==", "subType": "06" } } } ] } } }, { "description": "Insert a document with auto encryption using KMIP delegated KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "kmip": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_kmip_delegated": "string0" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "datakeys" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_kmip_delegated": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6YCkB+8NVfAAjIbvLqyXIg6g1a8tXrym92DPoqmxpcdQyH0vQM3aFNMz7tZwQBimKs29ztZV/LWjM633HhO5ACl9A==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string_kmip_delegated": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6YCkB+8NVfAAjIbvLqyXIg6g1a8tXrym92DPoqmxpcdQyH0vQM3aFNMz7tZwQBimKs29ztZV/LWjM633HhO5ACl9A==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/localKMS.json000066400000000000000000000114211511661753600315710ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } }, "bsonType": "object" }, "key_vault_data": [ { "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "Ce9HSz/HKKGkIt4uyy+jDuKGA+rLC2cycykMo6vc8jXxqa1UVDYHWq1r+vZKbnnSRBfB981akzRKZCFpC05CTyFqDhXv6OnMjpG97OZEREGIsHEYiJkBW0jJJvfLLgeLsEpBzsro9FztGGXASxyxFRZFhXvHxyiLOKrdWfs7X1O/iK3pEoHMx6uSNSfUOgbebLfIqW7TO++iQS5g1xovXA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ], "tests": [ { "description": "Insert a document with auto encryption using local KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {}, "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACV/+zJmpqMU47yxS/xIVAviGi7wHDuFwaULAixEAoIh0xHz73UYOM3D8D44gcJn67EROjbz4ITpYzzlCJovDL0Q==", "subType": "06" } }, "random": { "$$type": "binData" } } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACV/+zJmpqMU47yxS/xIVAviGi7wHDuFwaULAixEAoIh0xHz73UYOM3D8D44gcJn67EROjbz4ITpYzzlCJovDL0Q==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/malformedCiphertext.json000066400000000000000000000220451511661753600341360ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "00" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQ==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAa2V2aW4gYWxiZXJ0c29uCg==", "subType": "06" } } } ], "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Wrong subtype", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "00" } } } ] } ] }, { "description": "Empty data", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "_id": 2 } }, "result": { "errorContains": "malformed ciphertext" } } ] }, { "description": "Malformed data", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "find", "arguments": { "filter": { "_id": 3 } }, "result": { "errorContains": "not all keys requested were satisfied" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/missingKey.json000066400000000000000000000106251511661753600322530ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "Insert with encryption on a missing key", "clientOptions": { "autoEncryptOpts": { "keyVaultNamespace": "keyvault.different", "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } }, "result": { "errorContains": "not all keys requested were satisfied" } } ], "outcome": { "collection": { "data": [] } }, "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "different", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/namedKMS.json000066400000000000000000000114771511661753600315760ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "_id": { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "DX3iUuOlBsx6wBX9UZ3v/qXk1HNeBace2J+h/JwsDdF/vmSXLZ1l1VmZYIcpVFy6ODhdbzLjd4pNgg9wcm4etYig62KNkmtZ0/s1tAL5VsuW/s7/3PYnYGznZTFhLjIVcOH/RNoRj2eQb/sRTyivL85wePEpAU/JzuBj6qO9Y5txQgs1k0J3aNy10R9aQ8kC1NuSSpLAIXwE6DlNDDJXhw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local:name2" } } ], "tests": [ { "description": "Automatically encrypt and decrypt with a named KMS provider", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local:name2": { "key": { "$binary": { "base64": "local+name2+YUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC07sFvTQ0I4O2U49hpr4HezaK44Ivluzv5ntQBTYHDlAJMLyRMyB6Dl+UGHBgqhHe/Xw+pcT9XdiUoOJYAx9g+w==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC07sFvTQ0I4O2U49hpr4HezaK44Ivluzv5ntQBTYHDlAJMLyRMyB6Dl+UGHBgqhHe/Xw+pcT9XdiUoOJYAx9g+w==", "subType": "06" } } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/noSchema.json000066400000000000000000000024421511661753600316640ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "unencrypted", "tests": [ { "description": "Insert on an unencrypted collection", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "unencrypted" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "insert": "unencrypted", "documents": [ { "_id": 1 } ], "ordered": true }, "command_name": "insert" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/replaceOne.json000066400000000000000000000143421511661753600322060ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "replaceOne with encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "replaceOne", "arguments": { "filter": { "encrypted_string": "string0" }, "replacement": { "encrypted_string": "string1", "random": "abc" } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } } ], "ordered": true }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/types.json000066400000000000000000001236031511661753600312760ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [], "json_schema": {}, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "type=objectId", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_objectId": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "objectId", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_objectId": { "$oid": "AAAAAAAAAAAAAAAAAAAAAAAA" } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_objectId": { "$oid": "AAAAAAAAAAAAAAAAAAAAAAAA" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_objectId": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAHmkTPqvzfHMWpvS1mEsrjOxVQ2dyihEgIFWD5E0eNEsiMBQsC0GuvjdqYRL5DHLFI1vKuGek7EYYp0Qyii/tHqA==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_objectId": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAHmkTPqvzfHMWpvS1mEsrjOxVQ2dyihEgIFWD5E0eNEsiMBQsC0GuvjdqYRL5DHLFI1vKuGek7EYYp0Qyii/tHqA==", "subType": "06" } } } ] } } }, { "description": "type=symbol", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_symbol": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "symbol", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_symbol": { "$symbol": "test" } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_symbol": { "$symbol": "test" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_symbol": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAOOmvDmWjcuKsSCO7U/7t9HJ8eI73B6wduyMbdkvn7n7V4uTJes/j+BTtneSdyG2JHKHGkevWAJSIU2XoO66BSXw==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_symbol": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAOOmvDmWjcuKsSCO7U/7t9HJ8eI73B6wduyMbdkvn7n7V4uTJes/j+BTtneSdyG2JHKHGkevWAJSIU2XoO66BSXw==", "subType": "06" } } } ] } } }, { "description": "type=int", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_int": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_int": { "$numberInt": "123" } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_int": { "$numberInt": "123" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_int": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAQPNXJVXMEjGZnftMuf2INKufXCtQIRHdw5wTgn6QYt3ejcoAXyiwI4XIUizkpsob494qpt2in4tWeiO7b9zkA8Q==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_int": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAQPNXJVXMEjGZnftMuf2INKufXCtQIRHdw5wTgn6QYt3ejcoAXyiwI4XIUizkpsob494qpt2in4tWeiO7b9zkA8Q==", "subType": "06" } } } ] } } }, { "description": "type=double", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_double": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "double", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_double": { "$numberDouble": "1.23" } } }, "result": { "errorContains": "element of type: double" } } ] }, { "description": "type=decimal", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_decimal": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "decimal", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_decimal": { "$numberDecimal": "1.23" } } }, "result": { "errorContains": "element of type: decimal" } } ] }, { "description": "type=binData", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_binData": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "binData", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AAAA", "subType": "00" } } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AAAA", "subType": "00" } } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAFB/KHZQHaHHo8fctcl7v6kR+sLkJoTRx2cPSSck9ya+nbGROSeFhdhDRHaCzhV78fDEqnMDSVPNi+ZkbaIh46GQ==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAFB/KHZQHaHHo8fctcl7v6kR+sLkJoTRx2cPSSck9ya+nbGROSeFhdhDRHaCzhV78fDEqnMDSVPNi+ZkbaIh46GQ==", "subType": "06" } } } ] } } }, { "description": "type=javascript", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_javascript": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "javascript", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_javascript": { "$code": "var x = 1;" } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_javascript": { "$code": "var x = 1;" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_javascript": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAANrvMgJkTKWGMc9wt3E2RBR2Hu5gL9p+vIIdHe9FcOm99t1W480/oX1Gnd87ON3B399DuFaxi/aaIiQSo7gTX6Lw==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_javascript": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAANrvMgJkTKWGMc9wt3E2RBR2Hu5gL9p+vIIdHe9FcOm99t1W480/oX1Gnd87ON3B399DuFaxi/aaIiQSo7gTX6Lw==", "subType": "06" } } } ] } } }, { "description": "type=javascriptWithScope", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_javascriptWithScope": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "javascriptWithScope", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_javascriptWithScope": { "$code": "var x = 1;", "$scope": {} } } }, "result": { "errorContains": "element of type: javascriptWithScope" } } ] }, { "description": "type=object", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_object": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "object", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_object": {} } }, "result": { "errorContains": "element of type: object" } } ] }, { "description": "type=timestamp", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_timestamp": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "timestamp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_timestamp": { "$timestamp": { "t": 123, "i": 456 } } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_timestamp": { "$timestamp": { "t": 123, "i": 456 } } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_timestamp": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAARJHaM4Gq3MpDTdBasBsEolQaOmxJQU1wsZVaSFAOLpEh1QihDglXI95xemePFMKhg+KNpFg7lw1ChCs2Wn/c26Q==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_timestamp": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAARJHaM4Gq3MpDTdBasBsEolQaOmxJQU1wsZVaSFAOLpEh1QihDglXI95xemePFMKhg+KNpFg7lw1ChCs2Wn/c26Q==", "subType": "06" } } } ] } } }, { "description": "type=regex", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_regex": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "regex", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_regex": { "$regularExpression": { "pattern": "test", "options": "" } } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_regex": { "$regularExpression": { "pattern": "test", "options": "" } } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_regex": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAALVnxM4UqGhqf5eXw6nsS08am3YJrTf1EvjKitT8tyyMAbHsICIU3GUjuC7EBofCHbusvgo7pDyaClGostFz44nA==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_regex": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAALVnxM4UqGhqf5eXw6nsS08am3YJrTf1EvjKitT8tyyMAbHsICIU3GUjuC7EBofCHbusvgo7pDyaClGostFz44nA==", "subType": "06" } } } ] } } }, { "description": "type=date", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_date": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "date", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_date": { "$date": { "$numberLong": "123" } } } } }, { "name": "findOne", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "encrypted_date": { "$date": { "$numberLong": "123" } } } } ], "expectations": [ { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_date": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAJ5sN7u6l97+DswfKTqZAijSTSOo5htinGKQKUD7pHNJYlLXGOkB4glrCu7ibu0g3344RHQ5yUp4YxMEa8GD+Snw==", "subType": "06" } } } ], "ordered": true }, "command_name": "insert" } }, { "command_started_event": { "command": { "find": "default", "filter": { "_id": 1 } }, "command_name": "find" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_date": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAJ5sN7u6l97+DswfKTqZAijSTSOo5htinGKQKUD7pHNJYlLXGOkB4glrCu7ibu0g3344RHQ5yUp4YxMEa8GD+Snw==", "subType": "06" } } } ] } } }, { "description": "type=minKey", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_minKey": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "minKey", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_minKey": { "$minKey": 1 } } }, "result": { "errorContains": "Cannot encrypt element of type: minKey" } } ] }, { "description": "type=maxKey", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_maxKey": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "maxKey", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_maxKey": { "$maxKey": 1 } } }, "result": { "errorContains": "Cannot encrypt element of type: maxKey" } } ] }, { "description": "type=undefined", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_undefined": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "undefined", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_undefined": { "$undefined": true } } }, "result": { "errorContains": "Cannot encrypt element of type: undefined" } } ] }, { "description": "type=array", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_array": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_array": [] } }, "result": { "errorContains": "element of type: array" } } ] }, { "description": "type=bool", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_bool": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "bool", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_bool": true } }, "result": { "errorContains": "element of type: bool" } } ] }, { "description": "type=null", "clientOptions": { "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_null": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "null", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_null": true } }, "result": { "errorContains": "Cannot encrypt element of type: null" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/updateMany.json000066400000000000000000000202721511661753600322370ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "updateMany with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateMany", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } }, "update": { "$set": { "encrypted_string": "string2", "random": "abc" } } }, "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } } }, "multi": true, "upsert": false } ], "ordered": true }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } }, { "description": "updateMany fails when filtering on a random field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateMany", "arguments": { "filter": { "random": "abc" }, "update": { "$set": { "encrypted_string": "string1" } } }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy/updateOne.json000066400000000000000000000267071511661753600320650ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.10" } ], "database_name": "default", "collection_name": "default", "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "json_schema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" }, "key_vault_data": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ], "tests": [ { "description": "updateOne with deterministic encryption", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1", "random": "abc" } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "command_name": "find" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } } } ], "ordered": true }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } } }, { "description": "updateOne fails when filtering on a random field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": { "random": "abc" }, "update": { "$set": { "encrypted_string": "string1" } } }, "result": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] }, { "description": "$unset works with an encrypted field", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$unset": { "encrypted_string": "" } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": {}, "u": { "$unset": { "encrypted_string": "" } } } ], "ordered": true }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "$rename works if target value has same encryption options", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$rename": { "encrypted_string": "encrypted_string_equivalent" } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "command_name": "listCollections" } }, { "command_started_event": { "command": { "update": "default", "updates": [ { "q": {}, "u": { "$rename": { "encrypted_string": "encrypted_string_equivalent" } } } ], "ordered": true }, "command_name": "update" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "encrypted_string_equivalent": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ] } } }, { "description": "$rename fails if target value has different encryption options", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$rename": { "encrypted_string": "random" } } }, "result": { "errorContains": "$rename between two encrypted fields must have the same metadata or both be unencrypted" } } ] }, { "description": "an invalid update (no $ operators) is validated and errors", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "aws": {} } } }, "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "encrypted_string": "random" } }, "result": { "errorContains": "" } } ] } ] } validatorAndPartialFieldExpression.json000066400000000000000000000465771511661753600370420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/legacy{ "runOn": [ { "minServerVersion": "6.0.0" } ], "database_name": "default", "collection_name": "default", "data": [], "tests": [ { "description": "create with a validator on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection" } } ] }, { "description": "create with a validator on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection", "validator": { "encrypted_string": "foo" } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "collMod with a validator on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "collMod": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } } } ] }, { "description": "collMod with a validator on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "collMod": "encryptedCollection", "validator": { "encrypted_string": "foo" } } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "createIndexes with a partialFilterExpression on an unencrypted field is OK", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "unencrypted_string": "foo" } } ] } } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "default", "collection": "encryptedCollection", "index": "name" } } ] }, { "description": "createIndexes with a partialFilterExpression on an encrypted field is an error", "clientOptions": { "autoEncryptOpts": { "kmsProviders": { "local": { "key": { "$binary": { "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk", "subType": "00" } } } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "database", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "encrypted_string": "foo" } } ] } }, "result": { "errorContains": "Comparison to encrypted fields not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/000077500000000000000000000000001511661753600274115ustar00rootroot00000000000000QE-Text-cleanupStructuredEncryptionData.json000066400000000000000000000133551511661753600400420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "QE-Text-cleanupStructuredEncryptionData", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.2.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.0" } } ], "createEntities": [ { "client": { "id": "client", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "db" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "db", "collectionName": "coll", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "suffixPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "30" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } } } ], "tests": [ { "description": "QE Text cleanupStructuredEncryptionData works", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "cleanupStructuredEncryptionData": "coll" }, "commandName": "cleanupStructuredEncryptionData" }, "expectResult": { "ok": 1 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "coll" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "cleanupStructuredEncryptionData": "coll", "cleanupTokens": { "encryptedText": { "ecoc": { "$binary": { "base64": "SWO8WEoZ2r2Kx/muQKb7+COizy85nIIUFiHh4K9kcvA=", "subType": "00" } }, "anchorPaddingToken": { "$binary": { "base64": "YAiF7Iwhqq1UyfxPvm70xfQJtrIRPrjfD2yRLG1+saQ=", "subType": "00" } } } } }, "commandName": "cleanupStructuredEncryptionData" } } ] } ] } ] } QE-Text-compactStructuredEncryptionData.json000066400000000000000000000166631511661753600400460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "QE-Text-compactStructuredEncryptionData", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.2.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.0" } } ], "createEntities": [ { "client": { "id": "client", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "db" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "db", "collectionName": "coll", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "suffixPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "30" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } } } ], "tests": [ { "description": "QE Text compactStructuredEncryptionData works", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "compactStructuredEncryptionData": "coll" }, "commandName": "compactStructuredEncryptionData" }, "expectResult": { "ok": 1 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "coll" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "compactStructuredEncryptionData": "coll", "encryptionInformation": { "type": { "$numberInt": "1" }, "schema": { "db.coll": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "suffixPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "30" }, "caseSensitive": true, "diacriticSensitive": true } ] } ], "strEncodeVersion": { "$numberInt": "1" }, "escCollection": "enxcol_.coll.esc", "ecocCollection": "enxcol_.coll.ecoc" } } }, "compactionTokens": { "encryptedText": { "ecoc": { "$binary": { "base64": "SWO8WEoZ2r2Kx/muQKb7+COizy85nIIUFiHh4K9kcvA=", "subType": "00" } }, "anchorPaddingToken": { "$binary": { "base64": "YAiF7Iwhqq1UyfxPvm70xfQJtrIRPrjfD2yRLG1+saQ=", "subType": "00" } } } } }, "commandName": "compactStructuredEncryptionData" } } ] } ] } ] } QE-Text-prefixPreview.json000066400000000000000000000213141511661753600343120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "QE-Text-prefixPreview", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.2.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.0" } } ], "createEntities": [ { "client": { "id": "client", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "db" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "db", "collectionName": "coll", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "prefixPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "30" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } } } ], "tests": [ { "description": "Insert QE prefixPreview", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "coll" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 1, "encryptedText": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Query with matching $encStrStartsWith", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrStartsWith": { "input": "$encryptedText", "prefix": "foo" } } } }, "object": "coll", "expectResult": [ { "_id": { "$numberInt": "1" }, "encryptedText": "foobar", "__safeContent__": [ { "$binary": { "base64": "wpaMBVDjL4bHf9EtSP52PJFzyNn1R19+iNI/hWtvzdk=", "subType": "00" } }, { "$binary": { "base64": "fmUMXTMV/XRiN0IL3VXxSEn6SQG9E6Po30kJKB8JJlQ=", "subType": "00" } }, { "$binary": { "base64": "vZIDMiFDgjmLNYVrrbnq1zT4hg7sGpe/PMtighSsnRc=", "subType": "00" } }, { "$binary": { "base64": "26Z5G+sHTzV3D7F8Y0m08389USZ2afinyFV3ez9UEBQ=", "subType": "00" } }, { "$binary": { "base64": "q/JEq8of7bE0QE5Id0XuOsNQ4qVpANYymcPQDUL2Ywk=", "subType": "00" } }, { "$binary": { "base64": "Uvvv46LkfbgLoPqZ6xTBzpgoYRTM6FUgRdqZ9eaVojI=", "subType": "00" } }, { "$binary": { "base64": "nMxdq2lladuBJA3lv3JC2MumIUtRJBNJVLp3PVE6nQk=", "subType": "00" } }, { "$binary": { "base64": "hS3V0qq5CF/SkTl3ZWWWgXcAJ8G5yGtkY2RwcHNc5Oc=", "subType": "00" } }, { "$binary": { "base64": "McgwYUxfKj5+4D0vskZymy4KA82s71MR25iV/Enutww=", "subType": "00" } }, { "$binary": { "base64": "Ciqdk1b+t+Vrr6oIlFFk0Zdym5BPmwN3glQ0/VcsVdM=", "subType": "00" } } ] } ] } ] }, { "description": "Query with non-matching $encStrStartsWith", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrStartsWith": { "input": "$encryptedText", "prefix": "bar" } } } }, "object": "coll", "expectResult": [] } ] } ] } QE-Text-substringPreview.json000066400000000000000000000373201511661753600350410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "QE-Text-substringPreview", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.2.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.0" } } ], "createEntities": [ { "client": { "id": "client", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "db" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "db", "collectionName": "coll", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "substringPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "10" }, "strMaxLength": { "$numberLong": "20" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } } } ], "tests": [ { "description": "Insert QE suffixPreview", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "coll" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 1, "encryptedText": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Query with matching $encStrContains", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrContains": { "input": "$encryptedText", "substring": "oba" } } } }, "object": "coll", "expectResult": [ { "_id": { "$numberInt": "1" }, "encryptedText": "foobar", "__safeContent__": [ { "$binary": { "base64": "wpaMBVDjL4bHf9EtSP52PJFzyNn1R19+iNI/hWtvzdk=", "subType": "00" } }, { "$binary": { "base64": "IpY3x/jjm8j/74jAdUhgxdM5hk68zR0zv/lTKm/72Vg=", "subType": "00" } }, { "$binary": { "base64": "G+ky260C6QiOfIxKz14FmaMbAxvui1BKJO/TnLOHlGk=", "subType": "00" } }, { "$binary": { "base64": "7dv3gAKe9vwJMZmpB40pRCwRTmc7ds9UkGhxH8j084E=", "subType": "00" } }, { "$binary": { "base64": "o0V+Efn6x8XQdE80F1tztNaT3qxHjcsd9DOQ47BtmQk=", "subType": "00" } }, { "$binary": { "base64": "sJvrCjyVot7PIZFsdRehWFANKAj6fmBaj3FLbz/dZLE=", "subType": "00" } }, { "$binary": { "base64": "e98auxFmu02h5MfBIARk29MI7hSmvN3F9DaQ0xjqoEM=", "subType": "00" } }, { "$binary": { "base64": "US83krGNov/ezL6IhsY5eEOCxv1xUPDIEL/nmY0IKi0=", "subType": "00" } }, { "$binary": { "base64": "P2Aq5+OHZPG0CWIdmZvWq9c/18ZKVYW3vbxd+WU/TXU=", "subType": "00" } }, { "$binary": { "base64": "8AdPRPnSzcd5uhq4TZfNvNeF0XjLNVwAsJJMTtktw84=", "subType": "00" } }, { "$binary": { "base64": "9O6u/G51I4ZHFLhL4ZLuudbr0s202A2QnPfThmOXPhI=", "subType": "00" } }, { "$binary": { "base64": "N7AjYVyVlv6+lVSTM+cIxRL3SMgs3G5LgxSs+jrgDkI=", "subType": "00" } }, { "$binary": { "base64": "RbGF7dQbPGYQFd9DDO1hPz1UlLOJ77FAC6NsjGwJeos=", "subType": "00" } }, { "$binary": { "base64": "m7srHMgKm6kZwsNx8rc45pmw0/9Qro6xuQ8lZS3+RYk=", "subType": "00" } }, { "$binary": { "base64": "K75CNU3JyKFqZWPiIsVi4+n7DhYmcPl/nEhQ3d88mVI=", "subType": "00" } }, { "$binary": { "base64": "c7bwGpUZc/7JzEnMS7qQ/TPuXZyrmMihFaAV6zIqbZc=", "subType": "00" } }, { "$binary": { "base64": "rDvEdUgEk8u4Srt3ETokWs2FXcnyJaRGQ+NbkFwi2rQ=", "subType": "00" } }, { "$binary": { "base64": "VcdZj9zfveRBRlpCR2OYWau2+GokOFb73TE3gpElNiU=", "subType": "00" } }, { "$binary": { "base64": "eOa9o2xfA6OgkbYUxd6wQJicaeN6guhy2V66W3ALsaA=", "subType": "00" } }, { "$binary": { "base64": "1xGkJh+um70XiRd8lKLDtyHgDqrf7/59Mg7X0+KZh8k=", "subType": "00" } }, { "$binary": { "base64": "OSvllqHxycbcZN4phR6NDujY3ttA59o7nQJ6V9eJpX0=", "subType": "00" } }, { "$binary": { "base64": "ZTX1pyk8Vdw0BSbJx7GeJNcQf3tGKxbrrNSTqBqUWkg=", "subType": "00" } }, { "$binary": { "base64": "cn7V05zb5iXwYrePGMHztC+GRq+Tj8IMpRDraauPhSE=", "subType": "00" } }, { "$binary": { "base64": "E9bV9KyrZxHJSUmMg0HrDK4gGN+75ruelAnrM6hXQgY=", "subType": "00" } }, { "$binary": { "base64": "WrssTNmdgXoTGpbaF0JLRCGH6cDQuz1XEFNTy98nrb0=", "subType": "00" } }, { "$binary": { "base64": "jZmyOJP35dsxQ/OY5U4ISpVRIYr8iedNfcwZiKt29Qc=", "subType": "00" } }, { "$binary": { "base64": "d2mocORMbX9MX+/itAW8r1kxVw2/uii4vzXtc+2CIRQ=", "subType": "00" } }, { "$binary": { "base64": "JBnJy58eRPhDo3DuZvsHbvQDiHXxdtAx1Eif66k5SfA=", "subType": "00" } }, { "$binary": { "base64": "OjbDulC8s62v0pgweBSsQqtJjJBwH5JinfJpj7nVr+A=", "subType": "00" } }, { "$binary": { "base64": "85i7KT2GP9nSda3Gsil5LKubhq0LDtc22pxBxHpR+nE=", "subType": "00" } }, { "$binary": { "base64": "u9Fvsclwrs9lwIcMPV/fMZD7L3d5anSfJQVjQb9mgLg=", "subType": "00" } }, { "$binary": { "base64": "LZ32ttmLJGOIw9oFaUCn3Sx5uHPTYJPSFpeGRWNqlUc=", "subType": "00" } }, { "$binary": { "base64": "mMsZvGEePTqtl0FJAL/jAdyWNQIlpwN61YIlZsSIZ6s=", "subType": "00" } }, { "$binary": { "base64": "XZcu1a/ZGsIzAl3j4MXQlLo4v2p7kvIqRHtIQYFmL6k=", "subType": "00" } }, { "$binary": { "base64": "Zse27LinlYCEnX6iTmJceI33mEJxFb0LdPxp0RiMOaQ=", "subType": "00" } }, { "$binary": { "base64": "vOv2Hgb2/sBpnX9XwFbIN6yDxhjchwlmczUf82W2tp4=", "subType": "00" } }, { "$binary": { "base64": "oQxZ9A6j3x5j6x1Jqw/N9tpP4rfWMjcV3y+a3PkrL7c=", "subType": "00" } }, { "$binary": { "base64": "/D7ew3EijyUnmT22awVFspcuyo3JChJcDeCPwpljzVM=", "subType": "00" } }, { "$binary": { "base64": "BEmmwqyamt9X3bcWDld61P01zquy8fBHAXq3SHAPP0M=", "subType": "00" } }, { "$binary": { "base64": "wygD9/kAo1KsRvtr1v+9/lvqoWdKwgh6gDHvAQfXPPk=", "subType": "00" } }, { "$binary": { "base64": "pRTKgF/uksrF1c1AcfSTY6ZhqBKVud1vIztQ4/36SLs=", "subType": "00" } }, { "$binary": { "base64": "C4iUo8oNJsjJ37BqnBgIgSQpf99X2Bb4W5MZEAmakHU=", "subType": "00" } }, { "$binary": { "base64": "icoE53jIq6Fu/YGKUiSUTYyZ8xdiTQY9jJiGxVJObpw=", "subType": "00" } }, { "$binary": { "base64": "oubCwk0V6G2RFWtcOnYDU4uUBoXBrhBRi4nZgrYj9JY=", "subType": "00" } }, { "$binary": { "base64": "IyqhQ9nGhzEi5YW2W6v1kGU5DY2u2qSqbM/qXdLdWVU=", "subType": "00" } } ] } ] } ] }, { "description": "Query with non-matching $encStrContains", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrContains": { "input": "$encryptedText", "substring": "blah" } } } }, "object": "coll", "expectResult": [] } ] } ] } QE-Text-suffixPreview.json000066400000000000000000000213061511661753600343220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "QE-Text-suffixPreview", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.2.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.0" } } ], "createEntities": [ { "client": { "id": "client", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "db" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "db", "collectionName": "coll", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedText", "bsonType": "string", "queries": [ { "queryType": "suffixPreview", "contention": { "$numberLong": "0" }, "strMinQueryLength": { "$numberLong": "3" }, "strMaxQueryLength": { "$numberLong": "30" }, "caseSensitive": true, "diacriticSensitive": true } ] } ] } } } ], "tests": [ { "description": "Insert QE suffixPreview", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "coll" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 1, "encryptedText": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Query with matching $encStrStartsWith", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrEndsWith": { "input": "$encryptedText", "suffix": "bar" } } } }, "object": "coll", "expectResult": [ { "_id": { "$numberInt": "1" }, "encryptedText": "foobar", "__safeContent__": [ { "$binary": { "base64": "wpaMBVDjL4bHf9EtSP52PJFzyNn1R19+iNI/hWtvzdk=", "subType": "00" } }, { "$binary": { "base64": "uDCWsucUsJemUP7pmeb+Kd8B9qupVzI8wnLFqX1rkiU=", "subType": "00" } }, { "$binary": { "base64": "W3E1x4bHZ8SEHFz4zwXM0G5Z5WSwBhnxE8x5/qdP6JM=", "subType": "00" } }, { "$binary": { "base64": "6g/TXVDDf6z+ntResIvTKWdmIy4ajQ1rhwdNZIiEG7A=", "subType": "00" } }, { "$binary": { "base64": "hU+u/T3D6dHDpT3d/v5AlgtRoAufCXCAyO2jQlgsnCw=", "subType": "00" } }, { "$binary": { "base64": "vrPnq0AtBIURNgNGA6HJL+5/p5SBWe+qz8505TRo/dE=", "subType": "00" } }, { "$binary": { "base64": "W5pylBxdv2soY2NcBfPiHDVLTS6tx+0ULkI8gysBeFY=", "subType": "00" } }, { "$binary": { "base64": "oWO3xX3x0bYUJGK2S1aPAmlU3Xtfsgb9lTZ6flGAlsg=", "subType": "00" } }, { "$binary": { "base64": "SjZGucTEUbdpd86O8yj1pyMyBOOKxvAQ9C8ngZ9C5UE=", "subType": "00" } }, { "$binary": { "base64": "CEaMZkxVDVbnXr+To0DOyvsva04UQkIYP3KtgYVVwf8=", "subType": "00" } } ] } ] } ] }, { "description": "Query with non-matching $encStrEndsWith", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedText": "foobar" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "$expr": { "$encStrEndsWith": { "input": "$encryptedText", "suffix": "foo" } } } }, "object": "coll", "expectResult": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/addKeyAltName.json000066400000000000000000000377421511661753600327640ustar00rootroot00000000000000{ "description": "addKeyAltName", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "add keyAltName to non-existent data key", "operations": [ { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "AAAjYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "new_key_alt_name" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "AAAjYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "new_key_alt_name" } }, "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] }, { "description": "add new keyAltName to data key with no keyAltNames", "operations": [ { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "projection": { "_id": 0, "keyAltNames": 1 } }, "expectResult": [ { "keyAltNames": [ "local_key" ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "local_key" } }, "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "find" } } ] } ] }, { "description": "add existing keyAltName to existing data key", "operations": [ { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "projection": { "_id": 0, "keyAltNames": 1 } }, "expectResult": [ { "keyAltNames": [ "local_key" ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "local_key" } }, "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "local_key" } }, "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "find" } } ] } ] }, { "description": "add new keyAltName to data key with keyAltNames", "operations": [ { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "addKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "another_name" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "_id": 0, "keyAltNames": "$keyAltNames" } }, { "$unwind": "$keyAltNames" }, { "$sort": { "keyAltNames": 1 } } ] }, "expectResult": [ { "keyAltNames": "another_name" }, { "keyAltNames": "local_key" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "local_key" } }, "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": { "$addToSet": { "keyAltNames": "another_name" } }, "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "aggregate" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/aggregate.json000066400000000000000000000266651511661753600322510ustar00rootroot00000000000000{ "description": "aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Aggregate with deterministic encryption", "skipReason": "SERVER-39395", "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encrypted_string": "457-55-5642" } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encrypted_string": "457-55-5642" } } ] }, "commandName": "aggregate" } } ] } ] }, { "description": "Aggregate with empty pipeline", "skipReason": "SERVER-40829 hides agg support behind enableTestCommands flag.", "operations": [ { "name": "aggregate", "arguments": { "pipeline": [] }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [], "cursor": {} }, "commandName": "aggregate" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] }, { "description": "Aggregate should fail with random encryption", "skipReason": "SERVER-39395", "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "random": "abc" } } ] }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] }, { "description": "Database aggregate should fail", "operations": [ { "name": "aggregate", "object": "db", "arguments": { "pipeline": [ { "$currentOp": { "allUsers": false, "idleConnections": false, "localOps": true } }, { "$match": { "command.aggregate": { "$eq": 1 } } }, { "$project": { "command": 1 } }, { "$project": { "command.lsid": 0 } } ] }, "expectError": { "errorContains": "non-collection command not supported for auto encryption: aggregate" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/awsTemporary.json000066400000000000000000000203711511661753600330040ustar00rootroot00000000000000{ "description": "awsTemporary", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 }, "sessionToken": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client1", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 }, "sessionToken": "bad" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db1", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "coll1", "database": "db1", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Insert a document with auto encryption using the AWS provider with temporary credentials", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Insert with invalid temporary credentials", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll1", "expectError": { "errorContains": "security token" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/azureKMS.json000066400000000000000000000203021511661753600320020ustar00rootroot00000000000000{ "description": "azureKMS", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip_delegated": { "encrypt": { "keyId": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "n+HWZ0ZSVOYA3cvQgP7inN4JSXfOH85IngmeQxRpQHjCCcqT3IFqEWNlrsVHiz3AELimHhX4HKqOLWMUeSIT6emUDDoQX9BAv8DR1+E1w4nGs/NyEneac78EYFkK3JysrFDOgl2ypCCTKAypkn9CkAx1if4cfgQE93LW4kczcyHdGiH36CIxrCDGv1UzAvERN5Qa47DVwsM6a+hWsF2AAAJVnF0wYLLJU07TuRHdMrrphPWXZsFgyV+lRqJ7DDpReKNO8nMPLV/mHqHBHGPGQiRdb9NoJo8CvokGz4+KE8oLwzKf6V24dtwZmRkrsDV4iOhvROAzz+Euo1ypSkL3mw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601573901680" } }, "updateDate": { "$date": { "$numberLong": "1601573901680" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyAltNames": [ "altname", "azure_altname" ] } ] } ], "tests": [ { "description": "Insert a document with auto encryption using Azure KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_azure": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string_azure": { "$binary": { "base64": "AQGVERPgAAAAAAAAAAAAAAAC5DbBSwPwfSlBrDtRuglvNvCXD1KzDuCKY2P+4bRFtHDjpTOE2XuytPAUaAbXf1orsPq59PVZmsbTZbt2CB8qaQ==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_azure": { "$binary": { "base64": "AQGVERPgAAAAAAAAAAAAAAAC5DbBSwPwfSlBrDtRuglvNvCXD1KzDuCKY2P+4bRFtHDjpTOE2XuytPAUaAbXf1orsPq59PVZmsbTZbt2CB8qaQ==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/badQueries.json000066400000000000000000001031631511661753600323740ustar00rootroot00000000000000{ "description": "badQueries", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "collection": { "id": "coll_with_encrypted_id", "database": "db", "collectionName": "coll_with_encrypted_id" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "default", "collectionName": "coll_with_encrypted_id", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "_id": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } } } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "$text unconditionally fails", "operations": [ { "name": "find", "arguments": { "filter": { "$text": { "$search": "search text" } } }, "object": "coll", "expectError": { "errorContains": "Unsupported match expression operator for encryption" } } ] }, { "description": "$where unconditionally fails", "operations": [ { "name": "find", "arguments": { "filter": { "$where": { "$code": "function() { return true }" } } }, "object": "coll", "expectError": { "errorContains": "Unsupported match expression operator for encryption" } } ] }, { "description": "$bit operators succeed on unencrypted, error on encrypted", "operations": [ { "name": "find", "arguments": { "filter": { "unencrypted": { "$bitsAllClear": 35 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$bitsAllClear": 35 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$bitsAllSet": 35 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$bitsAllSet": 35 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$bitsAnyClear": 35 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$bitsAnyClear": 35 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$bitsAnySet": 35 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$bitsAnySet": 35 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } } ] }, { "description": "geo operators succeed on unencrypted, error on encrypted", "operations": [ { "name": "find", "arguments": { "filter": { "unencrypted": { "$near": [ 0, 0 ] } } }, "object": "coll", "expectError": { "errorContains": "unable to find index" } }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$near": [ 0, 0 ] } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$nearSphere": [ 0, 0 ] } } }, "object": "coll", "expectError": { "errorContains": "unable to find index" } }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$nearSphere": [ 0, 0 ] } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$geoIntersects": { "$geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 0 ] ] ] } } } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$geoIntersects": { "$geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 0 ] ] ] } } } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$geoWithin": { "$geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 0 ] ] ] } } } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$geoWithin": { "$geometry": { "type": "Polygon", "coordinates": [ [ [ 0, 0 ], [ 1, 0 ], [ 1, 1 ], [ 0, 0 ] ] ] } } } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } } ] }, { "description": "inequality operators succeed on unencrypted, error on encrypted", "operations": [ { "name": "find", "arguments": { "filter": { "unencrypted": { "$gt": 1 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$gt": 1 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$lt": 1 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$lt": 1 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$gte": 1 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$gte": 1 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$lte": 1 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$lte": 1 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } } ] }, { "description": "other misc operators succeed on unencrypted, error on encrypted", "operations": [ { "name": "find", "arguments": { "filter": { "unencrypted": { "$mod": [ 3, 1 ] } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$mod": [ 3, 1 ] } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$regex": "pattern", "$options": "" } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$regex": "pattern", "$options": "" } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$size": 2 } } }, "object": "coll", "expectResult": [] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$size": 2 } } }, "object": "coll", "expectError": { "errorContains": "Invalid match expression operator on encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$eq": null } } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1" } ] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$eq": null } } }, "object": "coll", "expectError": { "errorContains": "Illegal equality to null predicate for encrypted field" } }, { "name": "find", "arguments": { "filter": { "unencrypted": { "$in": [ null ] } } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1" } ] }, { "name": "find", "arguments": { "filter": { "encrypted_string": { "$in": [ null ] } } }, "object": "coll", "expectError": { "errorContains": "Illegal equality to null inside $in against an encrypted field" } } ] }, { "description": "$addToSet succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$addToSet": { "unencrypted": [ "a" ] } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$addToSet": { "encrypted_string": [ "a" ] } } }, "object": "coll", "expectError": { "errorContains": "$addToSet not allowed on encrypted values" } } ] }, { "description": "$inc succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$inc": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$inc": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$inc and $mul not allowed on encrypted values" } } ] }, { "description": "$mul succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$mul": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$mul": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$inc and $mul not allowed on encrypted values" } } ] }, { "description": "$max succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$max": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$max": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$max and $min not allowed on encrypted values" } } ] }, { "description": "$min succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$min": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$min": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$max and $min not allowed on encrypted values" } } ] }, { "description": "$currentDate succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$currentDate": { "unencrypted": true } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$currentDate": { "encrypted_string": true } } }, "object": "coll", "expectError": { "errorContains": "$currentDate not allowed on encrypted values" } } ] }, { "description": "$pop succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pop": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 0, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pop": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$pop not allowed on encrypted values" } } ] }, { "description": "$pull succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pull": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 0, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pull": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$pull not allowed on encrypted values" } } ] }, { "description": "$pullAll succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pullAll": { "unencrypted": [ 1 ] } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 0, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$pullAll": { "encrypted_string": [ 1 ] } } }, "object": "coll", "expectError": { "errorContains": "$pullAll not allowed on encrypted values" } } ] }, { "description": "$push succeeds on unencrypted, error on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$push": { "unencrypted": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": {}, "update": { "$push": { "encrypted_string": 1 } } }, "object": "coll", "expectError": { "errorContains": "$push not allowed on encrypted values" } } ] }, { "description": "array filters on encrypted fields does not error in mongocryptd, but errors in mongod", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "encrypted_string.$[i].x": 1 } }, "arrayFilters": [ { "i.x": 1 } ] }, "object": "coll", "expectError": { "errorContains": "Array update operations not allowed on encrypted values" } } ] }, { "description": "positional operator succeeds on unencrypted, errors on encrypted", "operations": [ { "name": "updateOne", "arguments": { "filter": { "unencrypted": 1 }, "update": { "$set": { "unencrypted.$": 1 } } }, "object": "coll", "expectResult": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0 } }, { "name": "updateOne", "arguments": { "filter": { "encrypted_string": "abc" }, "update": { "$set": { "encrypted_string.$": "abc" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt fields below '$' positional update operator" } } ] }, { "description": "an update that would produce an array on an encrypted field errors", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "encrypted_string": [ 1, 2 ] } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element of type" } } ] }, { "description": "an insert with encrypted field on _id errors", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } }, "object": "coll_with_encrypted_id", "expectError": { "errorContains": "Invalid schema containing the 'encrypt' keyword." } } ] }, { "description": "an insert with an array value for an encrypted field fails", "operations": [ { "name": "insertOne", "arguments": { "document": { "encrypted_string": [ "123", "456" ] } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element of type" } } ] }, { "description": "an insert with a Timestamp(0,0) value in the top-level fails", "operations": [ { "name": "insertOne", "arguments": { "document": { "random": { "$timestamp": { "t": 0, "i": 0 } } } }, "object": "coll", "expectError": { "errorContains": "A command that inserts cannot supply Timestamp(0, 0) for an encrypted" } } ] }, { "description": "distinct with the key referring to a field where the keyID is a JSON Pointer errors", "operations": [ { "name": "distinct", "arguments": { "filter": {}, "fieldName": "encrypted_w_altname" }, "object": "coll", "expectError": { "errorContains": "The distinct key is not allowed to be marked for encryption with a non-UUID keyId" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/badSchema.json000066400000000000000000000230221511661753600321520ustar00rootroot00000000000000{ "description": "badSchema", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } }, "bsonType": "array" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db0", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll0", "database": "db0", "collectionName": "default" } }, { "client": { "id": "client1", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "foo": { "properties": { "bar": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } } } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db1", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "coll1", "database": "db1", "collectionName": "default" } }, { "client": { "id": "client2", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" }, "bsonType": "object" } } } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db2", "client": "client2", "databaseName": "default" } }, { "collection": { "id": "coll2", "database": "db2", "collectionName": "default" } }, { "client": { "id": "client3", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "anyOf": [ { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } ] } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db3", "client": "client3", "databaseName": "default" } }, { "collection": { "id": "coll3", "database": "db3", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Schema with an encrypted field in an array", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll0", "expectError": { "errorContains": "Invalid schema" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ] }, { "description": "Schema without specifying parent object types", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll1", "expectError": { "errorContains": "Invalid schema" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ] }, { "description": "Schema with siblings of encrypt document", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll2", "expectError": { "errorContains": "'encrypt' cannot be used in conjunction with 'bsonType'" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ] }, { "description": "Schema with logical keywords", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll3", "expectError": { "errorContains": "Invalid schema" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/basic.json000066400000000000000000000262251511661753600313740ustar00rootroot00000000000000{ "description": "basic", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Insert with deterministic encryption, then find it", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "Insert with randomized encryption, then find it", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "random": "123" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "random": "123" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "random": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/bulk.json000066400000000000000000000271451511661753600312520ustar00rootroot00000000000000{ "description": "bulk", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Bulk write with encryption", "operations": [ { "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } } }, { "insertOne": { "document": { "_id": 2, "encrypted_string": "string1" } } }, { "updateOne": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1" } } } }, { "deleteOne": { "filter": { "$and": [ { "encrypted_string": "string1" }, { "_id": 2 } ] } } } ], "ordered": true }, "object": "coll" }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } }, "multi": false, "upsert": false } ], "ordered": true }, "commandName": "update" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "$and": [ { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } }, { "_id": { "$eq": 2 } } ] }, "limit": 1 } ], "ordered": true }, "commandName": "delete" } } ] } ] } ] } bypassAutoEncryption.json000066400000000000000000000251771511661753600344460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "bypassAutoEncryption", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "bypassAutoEncryption": true, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Insert with bypassAutoEncryption", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "encrypted_string": "string0" }, "bypassDocumentValidation": true }, "object": "coll" }, { "name": "find", "arguments": { "filter": {} }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": "string0" } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 2, "encrypted_string": "string0" } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": {} }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] }, { "description": "Insert with bypassAutoEncryption for local schema", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "encrypted_string": "string0" }, "bypassDocumentValidation": true }, "object": "coll" }, { "name": "find", "arguments": { "filter": {} }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": "string0" } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 2, "encrypted_string": "string0" } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": {} }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/bypassedCommand.json000066400000000000000000000066371511661753600334310ustar00rootroot00000000000000{ "description": "bypassedCommand", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "ping is bypassed", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "commandName": "ping" } } ] } ] }, { "description": "kill op is not bypassed", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "killOp": 1, "op": 1234 }, "commandName": "killOp" }, "expectError": { "errorContains": "command not supported for auto encryption: killOp" } } ] } ] } client-bulkWrite-qe.json000066400000000000000000000161621511661753600340620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "client bulkWrite with queryable encryption", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid", "csfle": { "minLibmongocryptVersion": "1.10.0" } } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ], "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "client": { "id": "client1", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database1", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "datakeys" } }, { "database": { "id": "database2", "client": "client1", "databaseName": "crud-tests" } }, { "collection": { "id": "collection2", "database": "database2", "collectionName": "coll0" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] }, { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } } ] } } } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite QE replaceOne", "operations": [ { "object": "collection0", "name": "insertMany", "arguments": { "documents": [ { "_id": 1, "encryptedInt": 11 }, { "_id": 2, "encryptedInt": 22 }, { "_id": 3, "encryptedInt": 33 } ] } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "encryptedInt": { "$eq": 11 } }, "replacement": { "encryptedInt": 44 } } } ] }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 1, "modifiedCount": 1, "deletedCount": 0 } }, { "object": "collection0", "name": "find", "arguments": { "filter": { "encryptedInt": 44 } }, "expectResult": [ { "_id": 1, "encryptedInt": 44 } ] }, { "object": "collection2", "name": "find", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": { "$$type": "array" } }, { "_id": 2, "encryptedInt": { "$$type": "binData" }, "__safeContent__": { "$$type": "array" } }, { "_id": 3, "encryptedInt": { "$$type": "binData" }, "__safeContent__": { "$$type": "array" } } ] } ] }, { "description": "client bulkWrite QE with multiple replace fails", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "encryptedInt": { "$eq": 11 } }, "replacement": { "encryptedInt": 44 } } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "encryptedInt": { "$eq": 22 } }, "replacement": { "encryptedInt": 44 } } } ] }, "expectError": { "isError": true, "errorContains": "Only insert is supported in BulkWrite with multiple operations and Queryable Encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/count.json000066400000000000000000000200641511661753600314360ustar00rootroot00000000000000{ "description": "count", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Count with deterministic encryption", "operations": [ { "name": "countDocuments", "arguments": { "filter": { "encrypted_string": "string0" } }, "object": "coll", "expectResult": 2 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "cursor": {}, "pipeline": [ { "$match": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, { "$group": { "_id": { "$const": 1 }, "n": { "$sum": { "$const": 1 } } } } ] }, "commandName": "aggregate" } } ] } ] }, { "description": "Count fails when filtering on a random encrypted field", "operations": [ { "name": "countDocuments", "arguments": { "filter": { "random": "abc" } }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/countDocuments.json000066400000000000000000000204001511661753600333120ustar00rootroot00000000000000{ "description": "countDocuments", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "countDocuments with deterministic encryption", "skipReason": "waiting on SERVER-39395", "operations": [ { "name": "countDocuments", "arguments": { "filter": { "encrypted_string": "string0" } }, "object": "coll", "expectResult": 1 } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "commandName": "aggregate" } } ] } ] } ] } create-and-createIndexes.json000066400000000000000000000052731511661753600350200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "create-and-createIndexes", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "unencryptedCollection" } } ], "initialData": [ { "databaseName": "default", "collectionName": "unencryptedCollection", "documents": [] } ], "tests": [ { "description": "create is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "unencryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "unencryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "unencryptedCollection" } } ] }, { "description": "createIndexes is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "unencryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "unencryptedCollection" } }, { "name": "createIndex", "object": "coll", "arguments": { "keys": { "x": 1 }, "name": "name" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "unencryptedCollection", "indexName": "name" } } ] } ] } createDataKey-kms_providers-invalid.json000066400000000000000000000051101511661753600372410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "createDataKey-kms_providers-invalid", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } } } } ], "tests": [ { "description": "create data key without required master key fields", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "aws", "opts": { "masterKey": {} } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "create data key with invalid master key field", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "masterKey": { "invalid": 1 } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "create data key with invalid master key", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "aws", "opts": { "masterKey": { "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "invalid" } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/createDataKey.json000066400000000000000000000505471511661753600330250ustar00rootroot00000000000000{ "description": "createDataKey", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip": { "endpoint": { "$$placeholder": 1 } }, "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [] } ], "tests": [ { "description": "create data key with AWS KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "aws", "opts": { "masterKey": { "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with Azure KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "azure", "opts": { "masterKey": { "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with GCP KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "gcp", "opts": { "masterKey": { "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with KMIP KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "kmip" }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with KMIP delegated KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "kmip", "opts": { "masterKey": { "delegated": true } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" }, "delegated": true } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with local KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local" }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "local" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with no keyAltName", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyAltNames": [] } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyAltNames": { "$$exists": false }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with single keyAltName", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyAltNames": [ "local_key" ] } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with multiple keyAltNames", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyAltNames": [ "abc", "def" ] } }, "expectResult": { "$$type": "binData" } }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$project": { "_id": 0, "keyAltNames": 1 } }, { "$unwind": "$keyAltNames" }, { "$sort": { "keyAltNames": 1 } } ] }, "expectResult": [ { "keyAltNames": "abc" }, { "keyAltNames": "def" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyAltNames": { "$$type": "array" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ], "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "create datakey with custom key material", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyMaterial": { "$binary": { "base64": "a2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFs", "subType": "00" } } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with invalid custom key material (too short)", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyMaterial": { "$binary": { "base64": "a2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFsa2V5X21hdGVyaWFs", "subType": "00" } } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/delete.json000066400000000000000000000260661511661753600315600ustar00rootroot00000000000000{ "description": "delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "deleteOne with deterministic encryption", "operations": [ { "name": "deleteOne", "arguments": { "filter": { "encrypted_string": "string0" } }, "object": "coll", "expectResult": { "deletedCount": 1 } } ], "outcome": [ { "documents": [ { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "limit": 1 } ], "ordered": true }, "commandName": "delete" } } ] } ] }, { "description": "deleteMany with deterministic encryption", "operations": [ { "name": "deleteMany", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } } }, "object": "coll", "expectResult": { "deletedCount": 2 } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } }, "limit": 0 } ], "ordered": true }, "commandName": "delete" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/deleteKey.json000066400000000000000000000370311511661753600322230ustar00rootroot00000000000000{ "description": "deleteKey", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "delete non-existent data key", "operations": [ { "name": "deleteKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "AAAzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "deletedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "delete": "datakeys", "deletes": [ { "q": { "_id": { "$binary": { "base64": "AAAzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "limit": 1 } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] }, { "description": "delete existing AWS data key", "operations": [ { "name": "deleteKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "delete": "datakeys", "deletes": [ { "q": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "limit": 1 } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] }, { "description": "delete existing local data key", "operations": [ { "name": "deleteKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "delete": "datakeys", "deletes": [ { "q": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "limit": 1 } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } ] } ] }, { "description": "delete existing data key twice", "operations": [ { "name": "deleteKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "deletedCount": 1 } }, { "name": "deleteKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "deletedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "delete": "datakeys", "deletes": [ { "q": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "limit": 1 } ], "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "delete": "datakeys", "deletes": [ { "q": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "limit": 1 } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/distinct.json000066400000000000000000000221511511661753600321260ustar00rootroot00000000000000{ "description": "distinct", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "distinct with deterministic encryption", "operations": [ { "name": "distinct", "arguments": { "filter": { "encrypted_string": "string0" }, "fieldName": "encrypted_string" }, "object": "coll", "expectResult": [ "string0" ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "distinct": "default", "key": "encrypted_string", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, "commandName": "distinct" } } ] } ] }, { "description": "Distinct fails when filtering on a random encrypted field", "operations": [ { "name": "distinct", "arguments": { "filter": { "random": "abc" }, "fieldName": "encrypted_string" }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/explain.json000066400000000000000000000202341511661753600317450ustar00rootroot00000000000000{ "description": "explain", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Explain a find with deterministic encryption", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "explain": { "find": "default", "filter": { "encrypted_string": "string1" } } }, "commandName": "explain" } } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "explain": { "find": "default", "filter": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } } }, "verbosity": "allPlansExecution" }, "commandName": "explain" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/find.json000066400000000000000000000320341511661753600312260ustar00rootroot00000000000000{ "description": "find", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Find with deterministic encryption", "operations": [ { "name": "find", "arguments": { "filter": { "encrypted_string": "string0" } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } } }, "commandName": "find" } } ] } ] }, { "description": "Find with $in with deterministic encryption", "operations": [ { "name": "find", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1", "random": "abc" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$binary": { "base64": "AgAAAAAAAAAAAAAAAAAAAAACyfp+lXvKOi7f5vh6ZsCijLEaXFKq1X06RmyS98ZvmMQGixTw8HM1f/bGxZjGwvYwjXOkIEb7Exgb8p2KCDI5TQ==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } } }, "commandName": "find" } } ] } ] }, { "description": "Find fails when filtering on a random encrypted field", "operations": [ { "name": "find", "arguments": { "filter": { "random": "abc" } }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/findOneAndDelete.json000066400000000000000000000171621511661753600334430ustar00rootroot00000000000000{ "description": "findOneAndDelete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "findOneAndDelete with deterministic encryption", "operations": [ { "name": "findOneAndDelete", "arguments": { "filter": { "encrypted_string": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "remove": true }, "commandName": "findAndModify" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/findOneAndReplace.json000066400000000000000000000176021511661753600336130ustar00rootroot00000000000000{ "description": "findOneAndReplace", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "findOneAndReplace with deterministic encryption", "operations": [ { "name": "findOneAndReplace", "arguments": { "filter": { "encrypted_string": "string0" }, "replacement": { "encrypted_string": "string1" }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encrypted_string": "string0" } } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "update": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } }, "commandName": "findAndModify" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/findOneAndUpdate.json000066400000000000000000000177441511661753600334710ustar00rootroot00000000000000{ "description": "findOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "findOneAndUpdate with deterministic encryption", "operations": [ { "name": "findOneAndUpdate", "arguments": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1" } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encrypted_string": "string0" } } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "update": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-BypassQueryAnalysis.json000066400000000000000000000226331511661753600353240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-BypassQueryAnalysis", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } }, "keyVaultNamespace": "keyvault.datakeys", "bypassQueryAnalysis": true }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "encryptedDB", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "encryptedColl", "database": "encryptedDB", "collectionName": "default" } }, { "client": { "id": "client1" } }, { "database": { "id": "unencryptedDB", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "unencryptedColl", "database": "unencryptedDB", "collectionName": "default" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } ], "tests": [ { "description": "BypassQueryAnalysis decrypts", "operations": [ { "object": "encryptedColl", "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": { "$binary": { "base64": "C18BAAAFZAAgAAAAANnt+eLTkv4GdDPl8IAfJOvTzArOgFJQ2S/DcLza4W0DBXMAIAAAAAD2u+omZme3P2gBPehMQyQHQ153tPN1+z7bksYA9jKTpAVwADAAAAAAUnCOQqIvmR65YKyYnsiVfVrg9hwUVO3RhhKExo3RWOzgaS0QdsBL5xKFS0JhZSoWBXUAEAAAAAQSNFZ4EjSYdhI0EjRWeJASEHQAAgAAAAV2AFAAAAAAEjRWeBI0mHYSNBI0VniQEpQbp/ZJpWBKeDtKLiXb0P2E9wvc0g3f373jnYQYlJquOrlPOoEy3ngsHPJuSUijvWDsrQzqYa349K7G/66qaXEFZQAgAAAAAOuac/eRLYakKX6B0vZ1r3QodOQFfjqJD+xlGiPu4/PsBWwAIAAAAACkm0o9bj6j0HuADKc0svbqO2UHj6GrlNdF6yKNxh63xRJrAAAAAAAAAAAAAA==", "subType": "06" } } } } }, { "object": "encryptedColl", "name": "find", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encryptedIndexed": "123" } ] }, { "object": "unencryptedColl", "name": "find", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "31eCYlbQoVboc5zwC8IoyJVSkag9PxREka8dkmbXJeY=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$binary": { "base64": "C18BAAAFZAAgAAAAANnt+eLTkv4GdDPl8IAfJOvTzArOgFJQ2S/DcLza4W0DBXMAIAAAAAD2u+omZme3P2gBPehMQyQHQ153tPN1+z7bksYA9jKTpAVwADAAAAAAUnCOQqIvmR65YKyYnsiVfVrg9hwUVO3RhhKExo3RWOzgaS0QdsBL5xKFS0JhZSoWBXUAEAAAAAQSNFZ4EjSYdhI0EjRWeJASEHQAAgAAAAV2AFAAAAAAEjRWeBI0mHYSNBI0VniQEpQbp/ZJpWBKeDtKLiXb0P2E9wvc0g3f373jnYQYlJquOrlPOoEy3ngsHPJuSUijvWDsrQzqYa349K7G/66qaXEFZQAgAAAAAOuac/eRLYakKX6B0vZ1r3QodOQFfjqJD+xlGiPu4/PsBWwAIAAAAACkm0o9bj6j0HuADKc0svbqO2UHj6GrlNdF6yKNxh63xRJrAAAAAAAAAAAAAA==", "subType": "06" } } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/fle2v2-Compact.json000066400000000000000000000201711511661753600327710ustar00rootroot00000000000000{ "description": "fle2v2-Compact", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "client": { "id": "client1" } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "database": { "id": "db1", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "coll1", "database": "db1", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } }, { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Compact works", "operations": [ { "name": "runCommand", "object": "db", "arguments": { "command": { "compactStructuredEncryptionData": "default" }, "commandName": "compactStructuredEncryptionData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections", "reply": { "ok": 1 } } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find", "reply": { "ok": 1 } } }, { "commandStartedEvent": { "command": { "compactStructuredEncryptionData": "default", "compactionTokens": { "encryptedIndexed": { "$binary": { "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=", "subType": "00" } }, "encryptedUnindexed": { "$binary": { "base64": "SWO8WEoZ2r2Kx/muQKb7+COizy85nIIUFiHh4K9kcvA=", "subType": "00" } } } }, "commandName": "compactStructuredEncryptionData" } }, { "commandSucceededEvent": { "commandName": "compactStructuredEncryptionData", "reply": { "ok": 1 } } } ] } ] }, { "description": "Compact errors on an unencrypted client", "operations": [ { "name": "runCommand", "object": "db1", "arguments": { "command": { "compactStructuredEncryptionData": "default" }, "commandName": "compactStructuredEncryptionData" }, "expectError": { "errorContains": "'compactStructuredEncryptionData.compactionTokens' is missing" } } ] } ] } fle2v2-CreateCollection-OldServer.json000066400000000000000000000062121511661753600364460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-CreateCollection-OldServer", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "6.0.0", "maxServerVersion": "6.3.99", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } } ] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "tests": [ { "description": "driver returns an error if creating a QEv2 collection on unsupported server", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" }, "expectError": { "errorContains": "Driver support of Queryable Encryption is incompatible with server. Upgrade server to use Queryable Encryption." } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } } ] } ] } fle2v2-CreateCollection.json000066400000000000000000001407431511661753600345530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-CreateCollection", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client1", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } }, "encryptedFieldsMap": { "default.encryptedCollection": { "escCollection": "invalid_esc_name", "ecocCollection": "invalid_ecoc_name", "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db1", "client": "client1", "databaseName": "default" } }, { "client": { "id": "client2", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } }, "encryptedFieldsMap": {} }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db2", "client": "client2", "databaseName": "default" } } ], "tests": [ { "description": "state collections and index are created", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } } ] } ] }, { "description": "default state collection names are applied", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } } ] } ] }, { "description": "drop removes all state collections", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } }, { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexNotExists", "object": "db", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } } ] } ] }, { "description": "CreateCollection without encryptedFields.", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "plaintextCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "plaintextCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "plaintextCollection" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "plaintextCollection" } }, "databaseName": "default", "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "drop": "plaintextCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "plaintextCollection" }, "databaseName": "default", "commandName": "create" } } ] } ] }, { "description": "CreateCollection from encryptedFieldsMap.", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } } ] } ] }, { "description": "CreateCollection from encryptedFields.", "operations": [ { "name": "dropCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } } ], "expectEvents": [ { "client": "client2", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "databaseName": "default", "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } } ] } ] }, { "description": "DropCollection from encryptedFieldsMap", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } } ] } ] }, { "description": "DropCollection from encryptedFields", "operations": [ { "name": "dropCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } }, { "name": "dropCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } } ], "expectEvents": [ { "client": "client2", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "databaseName": "default", "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } } ] } ] }, { "description": "DropCollection from remote encryptedFields", "operations": [ { "name": "dropCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "createCollection", "object": "db2", "arguments": { "collection": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "__safeContent___1" } }, { "name": "dropCollection", "object": "db2", "arguments": { "collection": "encryptedCollection" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.esc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "enxcol_.encryptedCollection.ecoc" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } } ], "expectEvents": [ { "client": "client2", "events": [ { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.esc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "enxcol_.encryptedCollection.ecoc", "clusteredIndex": { "key": { "_id": 1 }, "unique": true } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "create": "encryptedCollection", "encryptedFields": { "fields": [ { "path": "firstName", "bsonType": "string", "keyId": { "$binary": { "subType": "04", "base64": "AAAAAAAAAAAAAAAAAAAAAA==" } } } ] } }, "databaseName": "default", "commandName": "create" } }, { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "databaseName": "default", "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "__safeContent___1", "key": { "__safeContent__": 1 } } ] }, "databaseName": "default", "commandName": "createIndexes" } }, { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "encryptedCollection" } }, "databaseName": "default", "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.esc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "enxcol_.encryptedCollection.ecoc" }, "databaseName": "default", "commandName": "drop" } }, { "commandStartedEvent": { "command": { "drop": "encryptedCollection" }, "databaseName": "default", "commandName": "drop" } } ] } ] }, { "description": "encryptedFields are consulted for metadata collection names", "operations": [ { "name": "dropCollection", "object": "db1", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db1", "arguments": { "collection": "encryptedCollection" }, "expectError": { "errorContains": "Encrypted State Collection name should follow" } } ] } ] } fle2v2-DecryptExistingData.json000066400000000000000000000110561511661753600352450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-DecryptExistingData", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ] }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 decrypt of existing data succeeds", "operations": [ { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedUnindexed": "value123" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/fle2v2-Delete.json000066400000000000000000000227061511661753600326130ustar00rootroot00000000000000{ "description": "fle2v2-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Delete can query an FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedIndexed": "value123" } }, "object": "coll", "expectResult": { "deletedCount": 1 } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-EncryptedFields-vs-EncryptedFieldsMap.json000066400000000000000000000153701511661753600405630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-EncryptedFields-vs-EncryptedFieldsMap", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "serverless": "forbid", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } }, "encryptedFieldsMap": { "default.default": { "fields": [] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "encryptedDB", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "encryptedColl", "database": "encryptedDB", "collectionName": "default" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] }, { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } ], "tests": [ { "description": "encryptedFieldsMap is preferred over remote encryptedFields", "operations": [ { "object": "encryptedColl", "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } } }, { "object": "encryptedColl", "name": "find", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encryptedUnindexed": "value123" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "default", "commandName": "insert", "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ], "ordered": true } } }, { "commandStartedEvent": { "databaseName": "default", "commandName": "find", "command": { "find": "default", "filter": { "_id": 1 } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "commandName": "find", "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } } } } ] } ], "outcome": [ { "collectionName": "default", "databaseName": "default", "documents": [ { "_id": 1, "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ] } ] } ] } fle2v2-EncryptedFields-vs-jsonSchema.json000066400000000000000000000244721511661753600371360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-EncryptedFields-vs-jsonSchema", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] }, "validator": { "$jsonSchema": { "properties": {}, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "encryptedFields is preferred over jsonSchema", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedIndexed": "123" } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedIndexed": "123" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "31eCYlbQoVboc5zwC8IoyJVSkag9PxREka8dkmbXJeY=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPGmZcUzdE/FPILvRSyAScGvZparGI2y9rJ/vSBxgCujBXMAIAAAAACi1RjmndKqgnXy7xb22RzUbnZl1sOZRXPOC0KcJkAxmQVsACAAAAAApJtKPW4+o9B7gAynNLL26jtlB4+hq5TXResijcYet8USY20AAAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-EncryptedFieldsMap-defaults.json000066400000000000000000000074001511661753600366530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-EncryptedFieldsMap-defaults", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } }, "encryptedFieldsMap": { "default.default": { "fields": [] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] } ], "tests": [ { "description": "default state collections are applied to encryptionInformation", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "foo": { "$binary": { "base64": "BYkAAAAFZAAgAAAAAE8KGPgq7h3n9nH5lfHcia8wtOTLwGkZNLBesb6PULqbBXMAIAAAAACq0558QyD3c3jkR5k0Zc9UpQK8ByhXhtn2d1xVQnuJ3AVjACAAAAAA1003zUWGwD4zVZ0KeihnZOthS3V6CEHUfnJZcIYHefISY20AAAAAAAAAAAAA", "subType": "06" } } } ], "encryptionInformation": { "type": { "$numberInt": "1" }, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [] } } }, "ordered": true }, "commandName": "insert" } } ] } ] } ] } fle2v2-FindOneAndUpdate.json000066400000000000000000000443521511661753600344430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "findOneAndUpdate can query an FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "foo": "bar" } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedIndexed": "value123" } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "foo": "bar", "__safeContent__": [ { "$binary": { "base64": "ThpoKfQ8AkOzkFfNC1+9PF0pY2nIzfXvRdxQgjkNbBw=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "foo": "bar" } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "findAndModify" } } ] } ] }, { "description": "findOneAndUpdate can modify an FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "encryptedIndexed": "value456" } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedIndexed": "value123" } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "encryptedIndexed": "value456" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rhe7/w8Ob8Unl44rGr/moScx6m5VODQnscDhF4Nkn6g=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedIndexed": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "findAndModify" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "commandName": "find" } } ] } ] } ] } fle2v2-InsertFind-Indexed.json000066400000000000000000000242351511661753600347540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-InsertFind-Indexed", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Insert and find FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedIndexed": "123" } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedIndexed": "123" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "31eCYlbQoVboc5zwC8IoyJVSkag9PxREka8dkmbXJeY=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPGmZcUzdE/FPILvRSyAScGvZparGI2y9rJ/vSBxgCujBXMAIAAAAACi1RjmndKqgnXy7xb22RzUbnZl1sOZRXPOC0KcJkAxmQVsACAAAAAApJtKPW4+o9B7gAynNLL26jtlB4+hq5TXResijcYet8USY20AAAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-InsertFind-Unindexed.json000066400000000000000000000162731511661753600353220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-InsertFind-Unindexed", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "HBk9BWihXExNDvTp1lUxOuxuZK2Pe2ZdVdlsxPEBkiO1bS4mG5NNDsQ7zVxJAH8BtdOYp72Ku4Y3nwc0BUpIKsvAKX4eYXtlhv5zUQxWdeNFhg9qK7qb8nqhnnLeT0f25jFSqzWJoT379hfwDeu0bebJHr35QrJ8myZdPMTEDYF08QYQ48ShRBli0S+QzBHHAQiM2iJNr4svg2WR8JSeWQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Insert and find FLE2 unindexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedUnindexed": "value123" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedUnindexed": "value123" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedUnindexed": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedUnindexed": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "commandName": "find" } } ] } ] }, { "description": "Query with an unindexed field fails", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedUnindexed": "value123" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedUnindexed": "value123" } }, "object": "coll", "expectError": { "errorContains": "encrypt" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/fle2v2-MissingKey.json000066400000000000000000000061751511661753600334750ustar00rootroot00000000000000{ "description": "fle2v2-MissingKey", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "encryptedUnindexed": { "$binary": { "base64": "BqvN76sSNJh2EjQSNFZ4kBICTQaVZPWgXp41I7mPV1rLFTtw1tXzjcdSEyxpKKqujlko5TeizkB9hHQ009dVY1+fgIiDcefh+eQrm3CkhQ==", "subType": "06" } } } ], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [] } ], "tests": [ { "description": "FLE2 encrypt fails with missing key", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "123" } }, "object": "coll", "expectError": { "errorContains": "not all keys requested were satisfied" } } ] }, { "description": "FLE2 decrypt fails with missing key", "operations": [ { "name": "find", "arguments": { "filter": {} }, "object": "coll", "expectError": { "errorContains": "not all keys requested were satisfied" } } ] } ] } fle2v2-NoEncryption.json000066400000000000000000000051531511661753600337560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-NoEncryption", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [] } } } ], "tests": [ { "description": "insert with no encryption succeeds", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "foo": "bar" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "foo": "bar" } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "foo": "bar" } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } fle2v2-Rangev2-Compact.json000066400000000000000000000245111511661753600342160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Compact", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Compact works with 'range' fields", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "runCommand", "object": "db", "arguments": { "command": { "compactStructuredEncryptionData": "default" }, "commandName": "compactStructuredEncryptionData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections", "reply": { "ok": 1 } } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find", "reply": { "ok": 1 } } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert", "reply": { "ok": 1 } } }, { "commandStartedEvent": { "command": { "compactStructuredEncryptionData": "default", "compactionTokens": { "encryptedInt": { "ecoc": { "$binary": { "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=", "subType": "00" } }, "anchorPaddingToken": { "$binary": { "base64": "QxKJD2If48p0l8NAXf2Kr0aleMd/dATSjBK6hTpNMyc=", "subType": "00" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "compactStructuredEncryptionData" } }, { "commandSucceededEvent": { "commandName": "compactStructuredEncryptionData", "reply": { "ok": 1 } } } ] } ] } ] } fle2v2-Rangev2-Date-Aggregate.json000066400000000000000000000451361511661753600353770ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Date. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-Date-Correctness.json000066400000000000000000001064421511661753600360010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "1" } } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "1" } } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lte": { "$date": { "$numberLong": "1" } } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "0" } } } } }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "200" } } } } }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } }, "$lt": { "$date": { "$numberLong": "2" } } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } }, "$lte": { "$date": { "$numberLong": "200" } } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$in": [ { "$date": { "$numberLong": "0" } } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Insert out of range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "-1" } } } }, "object": "coll", "expectError": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDate": { "$date": { "$numberLong": "200" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 200, "encryptedDate": { "$date": { "$numberLong": "200" } } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "1" } } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "1" } } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lte": { "$date": { "$numberLong": "1" } } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$lt": { "$date": { "$numberLong": "0" } } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "200" } } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } }, "$lt": { "$date": { "$numberLong": "2" } } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$date": { "$numberLong": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$date": { "$numberLong": "1" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$gte": { "$date": { "$numberLong": "0" } }, "$lte": { "$date": { "$numberLong": "200" } } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } }, { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDate": { "$in": [ { "$date": { "$numberLong": "0" } } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } ] } ] }, { "description": "Wrong type: Insert Double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$numberDouble": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gte": { "$numberDouble": "0" } } } }, "object": "coll", "expectError": { "errorContains": "value type is a date" } } ] } ] } fle2v2-Rangev2-Date-Delete.json000066400000000000000000000410311511661753600347010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Date. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-Date-FindOneAndUpdate.json000066400000000000000000000453201511661753600366140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Date. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } }, "update": { "$set": { "encryptedDate": { "$date": { "$numberLong": "2" } } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedDate": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-Date-InsertFind.json000066400000000000000000000443741511661753600355610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Date. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Date-Update.json000066400000000000000000000455741511661753600347410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Date-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Date. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDate": { "$date": { "$numberLong": "0" } } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDate": { "$date": { "$numberLong": "1" } } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedDate": { "$gt": { "$date": { "$numberLong": "0" } } } }, "update": { "$set": { "encryptedDate": { "$date": { "$numberLong": "2" } } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedDate": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDate": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDate": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAJbW4AAAAAAAAAAAAJbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedDate": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDate", "bsonType": "date", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$date": { "$numberLong": "0" } }, "max": { "$date": { "$numberLong": "200" } } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-Decimal-Aggregate.json000066400000000000000000002773201511661753600360620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Decimal. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=", "subType": "00" } }, { "$binary": { "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=", "subType": "00" } }, { "$binary": { "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=", "subType": "00" } }, { "$binary": { "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=", "subType": "00" } }, { "$binary": { "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=", "subType": "00" } }, { "$binary": { "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=", "subType": "00" } }, { "$binary": { "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=", "subType": "00" } }, { "$binary": { "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=", "subType": "00" } }, { "$binary": { "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=", "subType": "00" } }, { "$binary": { "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=", "subType": "00" } }, { "$binary": { "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=", "subType": "00" } }, { "$binary": { "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=", "subType": "00" } }, { "$binary": { "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=", "subType": "00" } }, { "$binary": { "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=", "subType": "00" } }, { "$binary": { "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=", "subType": "00" } }, { "$binary": { "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=", "subType": "00" } }, { "$binary": { "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=", "subType": "00" } }, { "$binary": { "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=", "subType": "00" } }, { "$binary": { "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=", "subType": "00" } }, { "$binary": { "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=", "subType": "00" } }, { "$binary": { "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=", "subType": "00" } }, { "$binary": { "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=", "subType": "00" } }, { "$binary": { "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=", "subType": "00" } }, { "$binary": { "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=", "subType": "00" } }, { "$binary": { "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=", "subType": "00" } }, { "$binary": { "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=", "subType": "00" } }, { "$binary": { "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=", "subType": "00" } }, { "$binary": { "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=", "subType": "00" } }, { "$binary": { "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=", "subType": "00" } }, { "$binary": { "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=", "subType": "00" } }, { "$binary": { "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=", "subType": "00" } }, { "$binary": { "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=", "subType": "00" } }, { "$binary": { "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=", "subType": "00" } }, { "$binary": { "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=", "subType": "00" } }, { "$binary": { "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=", "subType": "00" } }, { "$binary": { "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=", "subType": "00" } }, { "$binary": { "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=", "subType": "00" } }, { "$binary": { "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=", "subType": "00" } }, { "$binary": { "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=", "subType": "00" } }, { "$binary": { "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=", "subType": "00" } }, { "$binary": { "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=", "subType": "00" } }, { "$binary": { "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=", "subType": "00" } }, { "$binary": { "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=", "subType": "00" } }, { "$binary": { "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=", "subType": "00" } }, { "$binary": { "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=", "subType": "00" } }, { "$binary": { "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=", "subType": "00" } }, { "$binary": { "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=", "subType": "00" } }, { "$binary": { "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=", "subType": "00" } }, { "$binary": { "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=", "subType": "00" } }, { "$binary": { "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=", "subType": "00" } }, { "$binary": { "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=", "subType": "00" } }, { "$binary": { "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=", "subType": "00" } }, { "$binary": { "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=", "subType": "00" } }, { "$binary": { "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=", "subType": "00" } }, { "$binary": { "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=", "subType": "00" } }, { "$binary": { "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=", "subType": "00" } }, { "$binary": { "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=", "subType": "00" } }, { "$binary": { "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=", "subType": "00" } }, { "$binary": { "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=", "subType": "00" } }, { "$binary": { "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=", "subType": "00" } }, { "$binary": { "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=", "subType": "00" } }, { "$binary": { "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=", "subType": "00" } }, { "$binary": { "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=", "subType": "00" } }, { "$binary": { "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=", "subType": "00" } }, { "$binary": { "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=", "subType": "00" } }, { "$binary": { "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=", "subType": "00" } }, { "$binary": { "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=", "subType": "00" } }, { "$binary": { "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=", "subType": "00" } }, { "$binary": { "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=", "subType": "00" } }, { "$binary": { "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=", "subType": "00" } }, { "$binary": { "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=", "subType": "00" } }, { "$binary": { "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=", "subType": "00" } }, { "$binary": { "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=", "subType": "00" } }, { "$binary": { "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=", "subType": "00" } }, { "$binary": { "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=", "subType": "00" } }, { "$binary": { "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=", "subType": "00" } }, { "$binary": { "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=", "subType": "00" } }, { "$binary": { "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=", "subType": "00" } }, { "$binary": { "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=", "subType": "00" } }, { "$binary": { "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=", "subType": "00" } }, { "$binary": { "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=", "subType": "00" } }, { "$binary": { "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=", "subType": "00" } }, { "$binary": { "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=", "subType": "00" } }, { "$binary": { "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=", "subType": "00" } }, { "$binary": { "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=", "subType": "00" } }, { "$binary": { "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=", "subType": "00" } }, { "$binary": { "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=", "subType": "00" } }, { "$binary": { "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=", "subType": "00" } }, { "$binary": { "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=", "subType": "00" } }, { "$binary": { "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=", "subType": "00" } }, { "$binary": { "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=", "subType": "00" } }, { "$binary": { "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=", "subType": "00" } }, { "$binary": { "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=", "subType": "00" } }, { "$binary": { "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=", "subType": "00" } }, { "$binary": { "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=", "subType": "00" } }, { "$binary": { "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=", "subType": "00" } }, { "$binary": { "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=", "subType": "00" } }, { "$binary": { "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=", "subType": "00" } }, { "$binary": { "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=", "subType": "00" } }, { "$binary": { "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=", "subType": "00" } }, { "$binary": { "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=", "subType": "00" } }, { "$binary": { "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=", "subType": "00" } }, { "$binary": { "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=", "subType": "00" } }, { "$binary": { "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=", "subType": "00" } }, { "$binary": { "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=", "subType": "00" } }, { "$binary": { "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=", "subType": "00" } }, { "$binary": { "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=", "subType": "00" } }, { "$binary": { "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=", "subType": "00" } }, { "$binary": { "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=", "subType": "00" } }, { "$binary": { "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=", "subType": "00" } }, { "$binary": { "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=", "subType": "00" } }, { "$binary": { "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=", "subType": "00" } }, { "$binary": { "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=", "subType": "00" } }, { "$binary": { "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=", "subType": "00" } }, { "$binary": { "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=", "subType": "00" } }, { "$binary": { "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=", "subType": "00" } }, { "$binary": { "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=", "subType": "00" } }, { "$binary": { "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=", "subType": "00" } }, { "$binary": { "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=", "subType": "00" } }, { "$binary": { "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=", "subType": "00" } }, { "$binary": { "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=", "subType": "00" } }, { "$binary": { "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=", "subType": "00" } }, { "$binary": { "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=", "subType": "00" } }, { "$binary": { "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-Decimal-Correctness.json000066400000000000000000000561771511661753600364730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gte": { "$numberDecimal": "0.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "1.0" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$lt": { "$numberDecimal": "1.0" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$lte": { "$numberDecimal": "1.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gte": { "$numberDecimal": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "1.0" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$lt": { "$numberDecimal": "1.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$lte": { "$numberDecimal": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalNoPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberInt": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Decimal-Delete.json000066400000000000000000002140071511661753600353670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Decimal. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-Decimal-FindOneAndUpdate.json000066400000000000000000002776001511661753600373050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Decimal. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$numberDecimal": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=", "subType": "00" } }, { "$binary": { "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=", "subType": "00" } }, { "$binary": { "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=", "subType": "00" } }, { "$binary": { "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=", "subType": "00" } }, { "$binary": { "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=", "subType": "00" } }, { "$binary": { "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=", "subType": "00" } }, { "$binary": { "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=", "subType": "00" } }, { "$binary": { "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=", "subType": "00" } }, { "$binary": { "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=", "subType": "00" } }, { "$binary": { "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=", "subType": "00" } }, { "$binary": { "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=", "subType": "00" } }, { "$binary": { "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=", "subType": "00" } }, { "$binary": { "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=", "subType": "00" } }, { "$binary": { "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=", "subType": "00" } }, { "$binary": { "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=", "subType": "00" } }, { "$binary": { "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=", "subType": "00" } }, { "$binary": { "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=", "subType": "00" } }, { "$binary": { "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=", "subType": "00" } }, { "$binary": { "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=", "subType": "00" } }, { "$binary": { "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=", "subType": "00" } }, { "$binary": { "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=", "subType": "00" } }, { "$binary": { "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=", "subType": "00" } }, { "$binary": { "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=", "subType": "00" } }, { "$binary": { "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=", "subType": "00" } }, { "$binary": { "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=", "subType": "00" } }, { "$binary": { "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=", "subType": "00" } }, { "$binary": { "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=", "subType": "00" } }, { "$binary": { "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=", "subType": "00" } }, { "$binary": { "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=", "subType": "00" } }, { "$binary": { "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=", "subType": "00" } }, { "$binary": { "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=", "subType": "00" } }, { "$binary": { "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=", "subType": "00" } }, { "$binary": { "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=", "subType": "00" } }, { "$binary": { "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=", "subType": "00" } }, { "$binary": { "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=", "subType": "00" } }, { "$binary": { "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=", "subType": "00" } }, { "$binary": { "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=", "subType": "00" } }, { "$binary": { "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=", "subType": "00" } }, { "$binary": { "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=", "subType": "00" } }, { "$binary": { "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=", "subType": "00" } }, { "$binary": { "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=", "subType": "00" } }, { "$binary": { "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=", "subType": "00" } }, { "$binary": { "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=", "subType": "00" } }, { "$binary": { "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=", "subType": "00" } }, { "$binary": { "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=", "subType": "00" } }, { "$binary": { "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=", "subType": "00" } }, { "$binary": { "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=", "subType": "00" } }, { "$binary": { "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=", "subType": "00" } }, { "$binary": { "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=", "subType": "00" } }, { "$binary": { "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=", "subType": "00" } }, { "$binary": { "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=", "subType": "00" } }, { "$binary": { "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=", "subType": "00" } }, { "$binary": { "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=", "subType": "00" } }, { "$binary": { "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=", "subType": "00" } }, { "$binary": { "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=", "subType": "00" } }, { "$binary": { "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=", "subType": "00" } }, { "$binary": { "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=", "subType": "00" } }, { "$binary": { "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=", "subType": "00" } }, { "$binary": { "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=", "subType": "00" } }, { "$binary": { "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=", "subType": "00" } }, { "$binary": { "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=", "subType": "00" } }, { "$binary": { "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=", "subType": "00" } }, { "$binary": { "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=", "subType": "00" } }, { "$binary": { "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=", "subType": "00" } }, { "$binary": { "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=", "subType": "00" } }, { "$binary": { "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=", "subType": "00" } }, { "$binary": { "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=", "subType": "00" } }, { "$binary": { "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=", "subType": "00" } }, { "$binary": { "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=", "subType": "00" } }, { "$binary": { "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=", "subType": "00" } }, { "$binary": { "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=", "subType": "00" } }, { "$binary": { "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=", "subType": "00" } }, { "$binary": { "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=", "subType": "00" } }, { "$binary": { "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=", "subType": "00" } }, { "$binary": { "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=", "subType": "00" } }, { "$binary": { "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=", "subType": "00" } }, { "$binary": { "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=", "subType": "00" } }, { "$binary": { "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=", "subType": "00" } }, { "$binary": { "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=", "subType": "00" } }, { "$binary": { "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=", "subType": "00" } }, { "$binary": { "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=", "subType": "00" } }, { "$binary": { "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=", "subType": "00" } }, { "$binary": { "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=", "subType": "00" } }, { "$binary": { "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=", "subType": "00" } }, { "$binary": { "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=", "subType": "00" } }, { "$binary": { "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=", "subType": "00" } }, { "$binary": { "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=", "subType": "00" } }, { "$binary": { "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=", "subType": "00" } }, { "$binary": { "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=", "subType": "00" } }, { "$binary": { "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=", "subType": "00" } }, { "$binary": { "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=", "subType": "00" } }, { "$binary": { "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=", "subType": "00" } }, { "$binary": { "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=", "subType": "00" } }, { "$binary": { "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=", "subType": "00" } }, { "$binary": { "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=", "subType": "00" } }, { "$binary": { "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=", "subType": "00" } }, { "$binary": { "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=", "subType": "00" } }, { "$binary": { "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=", "subType": "00" } }, { "$binary": { "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=", "subType": "00" } }, { "$binary": { "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=", "subType": "00" } }, { "$binary": { "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=", "subType": "00" } }, { "$binary": { "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=", "subType": "00" } }, { "$binary": { "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=", "subType": "00" } }, { "$binary": { "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=", "subType": "00" } }, { "$binary": { "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=", "subType": "00" } }, { "$binary": { "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=", "subType": "00" } }, { "$binary": { "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=", "subType": "00" } }, { "$binary": { "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=", "subType": "00" } }, { "$binary": { "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=", "subType": "00" } }, { "$binary": { "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=", "subType": "00" } }, { "$binary": { "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=", "subType": "00" } }, { "$binary": { "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=", "subType": "00" } }, { "$binary": { "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=", "subType": "00" } }, { "$binary": { "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=", "subType": "00" } }, { "$binary": { "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=", "subType": "00" } }, { "$binary": { "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=", "subType": "00" } }, { "$binary": { "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=", "subType": "00" } }, { "$binary": { "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=", "subType": "00" } }, { "$binary": { "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=", "subType": "00" } }, { "$binary": { "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=", "subType": "00" } }, { "$binary": { "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=", "subType": "00" } }, { "$binary": { "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=", "subType": "00" } }, { "$binary": { "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=", "subType": "00" } }, { "$binary": { "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=", "subType": "00" } }, { "$binary": { "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=", "subType": "00" } }, { "$binary": { "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-Decimal-InsertFind.json000066400000000000000000002766741511661753600362540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Decimal. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=", "subType": "00" } }, { "$binary": { "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=", "subType": "00" } }, { "$binary": { "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=", "subType": "00" } }, { "$binary": { "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=", "subType": "00" } }, { "$binary": { "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=", "subType": "00" } }, { "$binary": { "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=", "subType": "00" } }, { "$binary": { "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=", "subType": "00" } }, { "$binary": { "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=", "subType": "00" } }, { "$binary": { "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=", "subType": "00" } }, { "$binary": { "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=", "subType": "00" } }, { "$binary": { "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=", "subType": "00" } }, { "$binary": { "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=", "subType": "00" } }, { "$binary": { "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=", "subType": "00" } }, { "$binary": { "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=", "subType": "00" } }, { "$binary": { "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=", "subType": "00" } }, { "$binary": { "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=", "subType": "00" } }, { "$binary": { "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=", "subType": "00" } }, { "$binary": { "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=", "subType": "00" } }, { "$binary": { "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=", "subType": "00" } }, { "$binary": { "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=", "subType": "00" } }, { "$binary": { "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=", "subType": "00" } }, { "$binary": { "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=", "subType": "00" } }, { "$binary": { "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=", "subType": "00" } }, { "$binary": { "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=", "subType": "00" } }, { "$binary": { "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=", "subType": "00" } }, { "$binary": { "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=", "subType": "00" } }, { "$binary": { "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=", "subType": "00" } }, { "$binary": { "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=", "subType": "00" } }, { "$binary": { "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=", "subType": "00" } }, { "$binary": { "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=", "subType": "00" } }, { "$binary": { "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=", "subType": "00" } }, { "$binary": { "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=", "subType": "00" } }, { "$binary": { "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=", "subType": "00" } }, { "$binary": { "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=", "subType": "00" } }, { "$binary": { "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=", "subType": "00" } }, { "$binary": { "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=", "subType": "00" } }, { "$binary": { "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=", "subType": "00" } }, { "$binary": { "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=", "subType": "00" } }, { "$binary": { "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=", "subType": "00" } }, { "$binary": { "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=", "subType": "00" } }, { "$binary": { "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=", "subType": "00" } }, { "$binary": { "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=", "subType": "00" } }, { "$binary": { "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=", "subType": "00" } }, { "$binary": { "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=", "subType": "00" } }, { "$binary": { "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=", "subType": "00" } }, { "$binary": { "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=", "subType": "00" } }, { "$binary": { "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=", "subType": "00" } }, { "$binary": { "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=", "subType": "00" } }, { "$binary": { "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=", "subType": "00" } }, { "$binary": { "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=", "subType": "00" } }, { "$binary": { "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=", "subType": "00" } }, { "$binary": { "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=", "subType": "00" } }, { "$binary": { "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=", "subType": "00" } }, { "$binary": { "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=", "subType": "00" } }, { "$binary": { "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=", "subType": "00" } }, { "$binary": { "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=", "subType": "00" } }, { "$binary": { "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=", "subType": "00" } }, { "$binary": { "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=", "subType": "00" } }, { "$binary": { "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=", "subType": "00" } }, { "$binary": { "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=", "subType": "00" } }, { "$binary": { "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=", "subType": "00" } }, { "$binary": { "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=", "subType": "00" } }, { "$binary": { "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=", "subType": "00" } }, { "$binary": { "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=", "subType": "00" } }, { "$binary": { "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=", "subType": "00" } }, { "$binary": { "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=", "subType": "00" } }, { "$binary": { "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=", "subType": "00" } }, { "$binary": { "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=", "subType": "00" } }, { "$binary": { "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=", "subType": "00" } }, { "$binary": { "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=", "subType": "00" } }, { "$binary": { "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=", "subType": "00" } }, { "$binary": { "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=", "subType": "00" } }, { "$binary": { "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=", "subType": "00" } }, { "$binary": { "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=", "subType": "00" } }, { "$binary": { "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=", "subType": "00" } }, { "$binary": { "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=", "subType": "00" } }, { "$binary": { "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=", "subType": "00" } }, { "$binary": { "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=", "subType": "00" } }, { "$binary": { "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=", "subType": "00" } }, { "$binary": { "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=", "subType": "00" } }, { "$binary": { "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=", "subType": "00" } }, { "$binary": { "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=", "subType": "00" } }, { "$binary": { "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=", "subType": "00" } }, { "$binary": { "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=", "subType": "00" } }, { "$binary": { "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=", "subType": "00" } }, { "$binary": { "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=", "subType": "00" } }, { "$binary": { "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=", "subType": "00" } }, { "$binary": { "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=", "subType": "00" } }, { "$binary": { "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=", "subType": "00" } }, { "$binary": { "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=", "subType": "00" } }, { "$binary": { "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=", "subType": "00" } }, { "$binary": { "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=", "subType": "00" } }, { "$binary": { "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=", "subType": "00" } }, { "$binary": { "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=", "subType": "00" } }, { "$binary": { "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=", "subType": "00" } }, { "$binary": { "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=", "subType": "00" } }, { "$binary": { "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=", "subType": "00" } }, { "$binary": { "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=", "subType": "00" } }, { "$binary": { "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=", "subType": "00" } }, { "$binary": { "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=", "subType": "00" } }, { "$binary": { "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=", "subType": "00" } }, { "$binary": { "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=", "subType": "00" } }, { "$binary": { "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=", "subType": "00" } }, { "$binary": { "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=", "subType": "00" } }, { "$binary": { "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=", "subType": "00" } }, { "$binary": { "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=", "subType": "00" } }, { "$binary": { "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=", "subType": "00" } }, { "$binary": { "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=", "subType": "00" } }, { "$binary": { "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=", "subType": "00" } }, { "$binary": { "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=", "subType": "00" } }, { "$binary": { "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=", "subType": "00" } }, { "$binary": { "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=", "subType": "00" } }, { "$binary": { "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=", "subType": "00" } }, { "$binary": { "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=", "subType": "00" } }, { "$binary": { "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=", "subType": "00" } }, { "$binary": { "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=", "subType": "00" } }, { "$binary": { "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=", "subType": "00" } }, { "$binary": { "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=", "subType": "00" } }, { "$binary": { "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=", "subType": "00" } }, { "$binary": { "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=", "subType": "00" } }, { "$binary": { "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=", "subType": "00" } }, { "$binary": { "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=", "subType": "00" } }, { "$binary": { "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=", "subType": "00" } }, { "$binary": { "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Decimal-Update.json000066400000000000000000003001061511661753600354030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Decimal-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Decimal. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalNoPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalNoPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedDecimalNoPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalNoPrecision": { "$numberDecimal": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } }, { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=", "subType": "00" } }, { "$binary": { "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=", "subType": "00" } }, { "$binary": { "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=", "subType": "00" } }, { "$binary": { "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=", "subType": "00" } }, { "$binary": { "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=", "subType": "00" } }, { "$binary": { "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=", "subType": "00" } }, { "$binary": { "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=", "subType": "00" } }, { "$binary": { "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=", "subType": "00" } }, { "$binary": { "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=", "subType": "00" } }, { "$binary": { "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=", "subType": "00" } }, { "$binary": { "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=", "subType": "00" } }, { "$binary": { "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=", "subType": "00" } }, { "$binary": { "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=", "subType": "00" } }, { "$binary": { "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=", "subType": "00" } }, { "$binary": { "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=", "subType": "00" } }, { "$binary": { "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=", "subType": "00" } }, { "$binary": { "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=", "subType": "00" } }, { "$binary": { "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=", "subType": "00" } }, { "$binary": { "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=", "subType": "00" } }, { "$binary": { "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=", "subType": "00" } }, { "$binary": { "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=", "subType": "00" } }, { "$binary": { "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=", "subType": "00" } }, { "$binary": { "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=", "subType": "00" } }, { "$binary": { "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=", "subType": "00" } }, { "$binary": { "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=", "subType": "00" } }, { "$binary": { "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=", "subType": "00" } }, { "$binary": { "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=", "subType": "00" } }, { "$binary": { "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=", "subType": "00" } }, { "$binary": { "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=", "subType": "00" } }, { "$binary": { "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=", "subType": "00" } }, { "$binary": { "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=", "subType": "00" } }, { "$binary": { "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=", "subType": "00" } }, { "$binary": { "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=", "subType": "00" } }, { "$binary": { "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=", "subType": "00" } }, { "$binary": { "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=", "subType": "00" } }, { "$binary": { "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=", "subType": "00" } }, { "$binary": { "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=", "subType": "00" } }, { "$binary": { "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=", "subType": "00" } }, { "$binary": { "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=", "subType": "00" } }, { "$binary": { "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=", "subType": "00" } }, { "$binary": { "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=", "subType": "00" } }, { "$binary": { "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=", "subType": "00" } }, { "$binary": { "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=", "subType": "00" } }, { "$binary": { "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=", "subType": "00" } }, { "$binary": { "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=", "subType": "00" } }, { "$binary": { "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=", "subType": "00" } }, { "$binary": { "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=", "subType": "00" } }, { "$binary": { "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=", "subType": "00" } }, { "$binary": { "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=", "subType": "00" } }, { "$binary": { "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=", "subType": "00" } }, { "$binary": { "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=", "subType": "00" } }, { "$binary": { "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=", "subType": "00" } }, { "$binary": { "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=", "subType": "00" } }, { "$binary": { "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=", "subType": "00" } }, { "$binary": { "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=", "subType": "00" } }, { "$binary": { "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=", "subType": "00" } }, { "$binary": { "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=", "subType": "00" } }, { "$binary": { "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=", "subType": "00" } }, { "$binary": { "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=", "subType": "00" } }, { "$binary": { "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=", "subType": "00" } }, { "$binary": { "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=", "subType": "00" } }, { "$binary": { "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=", "subType": "00" } }, { "$binary": { "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=", "subType": "00" } }, { "$binary": { "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=", "subType": "00" } }, { "$binary": { "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=", "subType": "00" } }, { "$binary": { "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=", "subType": "00" } }, { "$binary": { "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=", "subType": "00" } }, { "$binary": { "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=", "subType": "00" } }, { "$binary": { "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=", "subType": "00" } }, { "$binary": { "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=", "subType": "00" } }, { "$binary": { "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=", "subType": "00" } }, { "$binary": { "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=", "subType": "00" } }, { "$binary": { "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=", "subType": "00" } }, { "$binary": { "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=", "subType": "00" } }, { "$binary": { "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=", "subType": "00" } }, { "$binary": { "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=", "subType": "00" } }, { "$binary": { "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=", "subType": "00" } }, { "$binary": { "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=", "subType": "00" } }, { "$binary": { "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=", "subType": "00" } }, { "$binary": { "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=", "subType": "00" } }, { "$binary": { "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=", "subType": "00" } }, { "$binary": { "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=", "subType": "00" } }, { "$binary": { "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=", "subType": "00" } }, { "$binary": { "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=", "subType": "00" } }, { "$binary": { "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=", "subType": "00" } }, { "$binary": { "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=", "subType": "00" } }, { "$binary": { "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=", "subType": "00" } }, { "$binary": { "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=", "subType": "00" } }, { "$binary": { "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=", "subType": "00" } }, { "$binary": { "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=", "subType": "00" } }, { "$binary": { "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=", "subType": "00" } }, { "$binary": { "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=", "subType": "00" } }, { "$binary": { "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=", "subType": "00" } }, { "$binary": { "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=", "subType": "00" } }, { "$binary": { "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=", "subType": "00" } }, { "$binary": { "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=", "subType": "00" } }, { "$binary": { "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=", "subType": "00" } }, { "$binary": { "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=", "subType": "00" } }, { "$binary": { "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=", "subType": "00" } }, { "$binary": { "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=", "subType": "00" } }, { "$binary": { "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=", "subType": "00" } }, { "$binary": { "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=", "subType": "00" } }, { "$binary": { "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=", "subType": "00" } }, { "$binary": { "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=", "subType": "00" } }, { "$binary": { "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=", "subType": "00" } }, { "$binary": { "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=", "subType": "00" } }, { "$binary": { "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=", "subType": "00" } }, { "$binary": { "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=", "subType": "00" } }, { "$binary": { "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=", "subType": "00" } }, { "$binary": { "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=", "subType": "00" } }, { "$binary": { "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=", "subType": "00" } }, { "$binary": { "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=", "subType": "00" } }, { "$binary": { "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=", "subType": "00" } }, { "$binary": { "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=", "subType": "00" } }, { "$binary": { "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=", "subType": "00" } }, { "$binary": { "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=", "subType": "00" } }, { "$binary": { "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=", "subType": "00" } }, { "$binary": { "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=", "subType": "00" } }, { "$binary": { "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=", "subType": "00" } }, { "$binary": { "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=", "subType": "00" } }, { "$binary": { "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=", "subType": "00" } }, { "$binary": { "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=", "subType": "00" } }, { "$binary": { "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=", "subType": "00" } }, { "$binary": { "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=", "subType": "00" } }, { "$binary": { "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=", "subType": "00" } }, { "$binary": { "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=", "subType": "00" } }, { "$binary": { "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=", "subType": "00" } }, { "$binary": { "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=", "subType": "00" } }, { "$binary": { "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=", "subType": "00" } }, { "$binary": { "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=", "subType": "00" } }, { "$binary": { "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=", "subType": "00" } }, { "$binary": { "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=", "subType": "00" } }, { "$binary": { "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=", "subType": "00" } }, { "$binary": { "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=", "subType": "00" } }, { "$binary": { "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=", "subType": "00" } }, { "$binary": { "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=", "subType": "00" } }, { "$binary": { "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=", "subType": "00" } }, { "$binary": { "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=", "subType": "00" } }, { "$binary": { "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=", "subType": "00" } }, { "$binary": { "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=", "subType": "00" } }, { "$binary": { "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=", "subType": "00" } }, { "$binary": { "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=", "subType": "00" } }, { "$binary": { "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=", "subType": "00" } }, { "$binary": { "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=", "subType": "00" } }, { "$binary": { "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=", "subType": "00" } }, { "$binary": { "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=", "subType": "00" } }, { "$binary": { "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=", "subType": "00" } }, { "$binary": { "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=", "subType": "00" } }, { "$binary": { "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=", "subType": "00" } }, { "$binary": { "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=", "subType": "00" } }, { "$binary": { "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=", "subType": "00" } }, { "$binary": { "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=", "subType": "00" } }, { "$binary": { "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=", "subType": "00" } }, { "$binary": { "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=", "subType": "00" } }, { "$binary": { "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=", "subType": "00" } }, { "$binary": { "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=", "subType": "00" } }, { "$binary": { "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=", "subType": "00" } }, { "$binary": { "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=", "subType": "00" } }, { "$binary": { "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=", "subType": "00" } }, { "$binary": { "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=", "subType": "00" } }, { "$binary": { "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=", "subType": "00" } }, { "$binary": { "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=", "subType": "00" } }, { "$binary": { "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=", "subType": "00" } }, { "$binary": { "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=", "subType": "00" } }, { "$binary": { "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=", "subType": "00" } }, { "$binary": { "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=", "subType": "00" } }, { "$binary": { "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=", "subType": "00" } }, { "$binary": { "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=", "subType": "00" } }, { "$binary": { "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=", "subType": "00" } }, { "$binary": { "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=", "subType": "00" } }, { "$binary": { "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=", "subType": "00" } }, { "$binary": { "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=", "subType": "00" } }, { "$binary": { "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=", "subType": "00" } }, { "$binary": { "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=", "subType": "00" } }, { "$binary": { "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=", "subType": "00" } }, { "$binary": { "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=", "subType": "00" } }, { "$binary": { "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=", "subType": "00" } }, { "$binary": { "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=", "subType": "00" } }, { "$binary": { "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=", "subType": "00" } }, { "$binary": { "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=", "subType": "00" } }, { "$binary": { "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=", "subType": "00" } }, { "$binary": { "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=", "subType": "00" } }, { "$binary": { "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=", "subType": "00" } }, { "$binary": { "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=", "subType": "00" } }, { "$binary": { "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=", "subType": "00" } }, { "$binary": { "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=", "subType": "00" } }, { "$binary": { "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=", "subType": "00" } }, { "$binary": { "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDecimalNoPrecision": { "$gt": { "$binary": { "base64": "DR1jAAADcGF5bG9hZACxYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVsACAAAAAAt19RL3Oo5ni5L8kcvgOJYLgVYyXJExwP8pkuzLG7f/kAAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWwAIAAAAADflr+fsnZngm6KRWYgHa9JzK+bXogWl9evBU9sQUHPHQADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFbAAgAAAAAOpydOrKxx6m2gquSDV2Vv3w10GocmNCFeOo/fRhRH9JAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVsACAAAAAAgzIak+Q3UFLTHXPmJ+MuEklFtR3eLtvM+jdKkmGCV/YAAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWwAIAAAAACR26FJif673qpwF1J1FEkQGJ1Ywcr/ZW6JQ7meGqzt1QADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFbAAgAAAAAPEoHj87sYE+nBut52/LPvleWQBzB/uaJFnosxp4NRO2AAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVsACAAAAAAJuoY4rF8mbI+nKb+5XbZShJ8191o/e8ZCRHE0O4Ey8MAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWwAIAAAAAAcCcBR2Vyv5pAFbaOU97yovuOi1+ATDnLLcAUqHecXcAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFbAAgAAAAAKXKmh4V8veYwob1H03Q3p3PN8SRAaQwDT34KlNVUjiDAAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVsACAAAAAAJe/r67N6d8uTiogvfoR9rEXbIDjyLb9EVdqkayFFGaYAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVsACAAAAAAP+Um2vwW6Bj6vuz9DKz6+6aWkoKoEmFNoiz/xXm7lOsAAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVsACAAAAAAb9legYzsfctBPpHyl7YWpPmLr5QiNZFND/50N1vv2MUAAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVsACAAAAAADBU6KefT0v8zSmseaMNmQxKjJar72y7MojLFhkEHqrUAAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVsACAAAAAAS7El1FtZ5STh8Q1FguvieyYX9b2DF1DFVsb9hzxXYRsAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVsACAAAAAA9hqC2VoJBjwR7hcQ45xO8ZVojwC83jiRacCaDj6Px2gAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVsACAAAAAAi9zAsyAuou2oiCUHGc6QefLUkACa9IgeBhGu9W/r0X8AAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVsACAAAAAAWI/Gj5aZMwDIxztqmVL0g5LBcI8EdKEc2UA28pnekQoAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVsACAAAAAADatsMW4ezgnyi1PiP7xk+gA4AFIN/fb5uJqfVkjg4UoAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVsACAAAAAAkgCHbCwyX640/0Ni8+MoYxeHUiC+FSU4Mn9jTLYtgZgAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVsACAAAAAA3q0eKdV7KeU3pc+CtfypKR7BPxwaf30yu0j9FXeOOboAAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVsACAAAAAAO0wvY66l24gx8nRxyVGC0QcTztIi81Kx3ndRhuZr6W4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVsACAAAAAAqvadzJFLqQbs8WxgZ2D2X+XnaPSDMLCVVgWxx5jnLcYAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVsACAAAAAAEh6Vs81jLU204aGpL90fmYTm5i5R8/RT1uIbg6VU3HwAAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVsACAAAAAAT5x2hCCd2bpmpnyWaxas8nSxTc8e4C9DfKaqr0ABEysAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVsACAAAAAAWHeWxIkyvXTOWvfZzqtPXjfGaWWKjGSIQENTU3zBCrsAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVsACAAAAAAUNlpMJZs1p4HfsD4Q4WZ4TBEi6Oc2fX34rzyynqWCdwAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVsACAAAAAAIYOsNwC3DA7fLcOzqdr0bOFdHCfmK8tLwPoaE9uKOosAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVsACAAAAAAMgZFH6lQIIDrgHnFeslv3ld20ynwQjQJt3cAp4GgrFkAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVsACAAAAAA4v1lSp5H9BB+HYJ4bH43tC8aeuPZMf78Ng1JOhJh190AAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVsACAAAAAAvfgzIorXxE91dDt4nQxYfntTsx0M8Gzdsao5naQqcRUAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVsACAAAAAAf42C1+T7xdHEFF83+c2mF5S8PuuL22ogXXELnRAZ4boAAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVsACAAAAAAMbH453A+BYAaDOTo5kdhV1VdND1avNwvshEG/4MIJjQAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVsACAAAAAA/w5s++XYmO+9TWTbtGc3n3ndV4T9JUribIbF4jmDLSMAAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVsACAAAAAAvruXHTT3irPJLyWpI1j/Xwf2FeIE/IV+6Z49pqRzISoAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVsACAAAAAAU2815RR57TQ9uDg0XjWjBkAKvf8yssxDMzrM4+FqP6AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVsACAAAAAAJ88zt4Y/Hoqh+zrf6KCOiUwHbOzCxSfp6k/qsZaYGEgAAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVsACAAAAAAMGz4fAOa0EoVv90fUffwLjBrQhHATf+NdlgCR65vujAAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVsACAAAAAAGIEN6sfqq30nyxW4dxDgXr/jz5HmvA9T1jx/pKCn4zgAAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVsACAAAAAA9xu828hugIgo0E3de9dZD+gTpVUGlwtDba+tw/WcbUoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVsACAAAAAAcgN4P/wakJ5aJK5c1bvJBqpVGND221dli2YicPFfuAYAAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVsACAAAAAA4zkCd4k9gvfXoD1C7vwTjNcdVJwEARh8h/cxZ4PNMfgAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVsACAAAAAAg8Wt1HO3NhByq2ggux2a4Lo6Gryr24rEFIqh2acrwWMAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVsACAAAAAANoQXEWpXJpgrSNK/cKi/m7oYhuSRlp1IZBF0bqTEATcAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVsACAAAAAA5dunyJK6/SVfDD0t9QlNBcFqoZnf9legRjHaLSKAoQMAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVsACAAAAAAXzBLfq+GxRtX4Wa9fazA49DBLG6AjZm2XODStJKH8D0AAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVsACAAAAAAbbZalyo07BbFjPFlYmbmv0z023eT9eLkHqeVUnfUAUAAAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVsACAAAAAAK2GVGvyPIKolF/ECcmfmkVcf1/IZNcaTv96N92yGrkEAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVsACAAAAAAIGxGDzoeB3PTmudl4+j6piQB++e33EEzuzAiXcqGxvUAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVsACAAAAAAvBCHguWswb4X0xdcAryCvZgQuthXzt7597bJ5VxAMdgAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVsACAAAAAAAt5zLJG+/j4K8rnkFtAn8IvdUVNefe6utJ3rdzgwudIAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVsACAAAAAAJqOA1c6KVog3F4Hb/GfDb3jCxXDRTqpXWSbMH4ePIJsAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVsACAAAAAAnQhx4Rnyj081XrLRLD5NLpWmRWCsd0M9Hl7Jl19R0h8AAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVsACAAAAAAYIPdjV2XbPj7dBeHPwnwhVU7zMuJ+xtMUW5mIOYtmdAAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVsACAAAAAALnVK5p2tTTeZEh1zYt4iqKIQT9Z0si//Hy1L85oF+5IAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVsACAAAAAAXUf0pzUq0NhLYagWDap4uEiwq5rLpcx29rWbt1NYMsMAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVsACAAAAAA1hA2gMeZZPUNytk9K+lB1RCqWRudRr7GtadJlExJf8oAAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVsACAAAAAAWtsyO+FxMPSIezwsV1TJD8ZrXAdRnQM6DJ+f+1V3qEkAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVsACAAAAAA3k0Tj/XgPQtcYijH8cIlQoe/VXf15q1nrZNmg7yWYEgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVsACAAAAAAzUrK4kpoKCmcpdZlZNI13fddjdoAseVe67jaX1LobIIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVsACAAAAAAzI49hdpp0PbO7S2KexISxC16sE73EUAEyuqUFAC/J48AAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVsACAAAAAA7nvcU59+LwxGupSF21jAeAE0x7JE94tjRkJfgM1yKU8AAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVsACAAAAAAFkUYWFwNr815dEdFqp+TiIozDcq5IBNVkyMoDjharDQAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVsACAAAAAAPFHdLw3jssmEXsgtvl/RBNaUCRA1kgSwsofG364VOvQAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVsACAAAAAAxwP/X/InJJHmrjznvahIMgj6pQR30B62UtHCthSjrP0AAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVsACAAAAAA7gkPzNsS3gCxdFBWbSW9tkBjoR5ib+saDvpGSB3A3ogAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVsACAAAAAApRovMiV00hm/pEcT4XBsyPNw0eo8RLAX/fuabjdU+uwAAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVsACAAAAAAhRnjrXecwV0yeCWKJ5J/x12Xx4qVJahsCEVHB/1U2rcAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVsACAAAAAAGWeGmBNDRaMtvm7Rv+8TJ2sJ4WNXKcp3tqpv5Se9Ut4AAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVsACAAAAAADa+KP/pdTiG22l+ZWd30P1iHjnBF4zSNRdFm0oEK82kAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVsACAAAAAA2RK3Xng6v8kpvfVW9tkVXjpE+BSnx9/+Fw85Evs+kUEAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFbAAgAAAAAJVc+HYYqa0m1Hq6OiRX8c0iRnJYOt6AJAJoG0sG3GMSAAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWwAIAAAAABWrjGlvKYuTS2s8L9rYy8Hf0juFGJfwQmxVIjkTmFIGQADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFbAAgAAAAAKdI2LMqISr/T5vuJPg6ZRBm5fVi2aQCc4ra3A4+AjbDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWwAIAAAAABuuRkJWAH1CynggBt1/5sPh9PoGiqTlS24D/OE2uHXLQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FbAAgAAAAAHUt+McyXrJ1H8SwnHNVO181Ki8vDAM1f7XI26mg95ZDAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWwAIAAAAABB0EMXfvju4JU/mUH/OvxWbPEl9NJkcEp4iCbkXI41fAADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFbAAgAAAAAHQbgTCdZcbdA0avaTmZXUKnIS7Nwf1tNrcXDCw+PdBRAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWwAIAAAAACbceTZy8E3QA1pHmPN5kTlOx3EO8kJM5PUjTVftw1VpgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFbAAgAAAAAAs9x1SnVpMfNv5Bm1aXGwHmbbI9keWa9HRD35XuCBK5AAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWwAIAAAAACW0kkqMIzIFMn7g+R0MI8l15fr3k/w/mHtY5n6SYTEwAADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFbAAgAAAAAGeiJKzlUXAvL0gOlW+Hz1mSa2HsV4RGmyLmCHlzbAkoAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWwAIAAAAADuPckac21Hrg/h0kt5ShJwVEZ9rx6SOHd2+HDjqxEWTQADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFbAAgAAAAAIgbpyYtJj5513Z5XYqviH/HXG/5+mqR52iBbfqMmDtZAAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWwAIAAAAAAzRNXtL5o9VXMk5D5ylI0odPDJDSZZry1wfN+TedH70gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FbAAgAAAAAJci0w1ZB8W2spJQ+kMpod6HSCtSR2jrabOH+B0fj3A4AAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWwAIAAAAAAlswzAl81+0DteibwHD+CG5mZJrfHXa9NnEFRtXybzzwADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FbAAgAAAAAKMb+1CodEalAFnDrEL1Ndt8ztamZ+9134m9Kp3GQgd+AAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWwAIAAAAAAqkAONzhvMhkyL1D/6h7QQxEkdhC3p2WjXH+VGq5qCqQADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVsACAAAAAA07XQBzBUQMNw7F2/YxJjZNuPVpHTTgbLd1oGk77+bygAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFbAAgAAAAAAzyZ91dx+0oMlOVAjRGiMrPySikY/U9eMEB4WJb3uWtAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWwAIAAAAAD4Fl5bV5sz4isIE9bX+lmAp+aAKaZgVYVZeVfrItkCZAADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVsACAAAAAAanavcBdqZxgRGKvEK95wTmeL1K1CeDSXZsXUAs81uOgAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFbAAgAAAAAKcTFfPQzaFiAtSFhqbN02sCE1BKWJSrRfGN5L6oZwzkAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWwAIAAAAAA2cDNRXZuiC241TGRvdFyctJnrNcdbZOP9zHio81tkngADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVsACAAAAAAiYwzf2m71aWFD5ajcXyW2JX2EzQOkBroTGMg29nLPYIAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FbAAgAAAAAAOrS1KVA94rjB1jZ1pPocpCeBG+B14RzWoHqVDpp7JbAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWwAIAAAAAB9lEtZS0aXCFbCtSbhnis27S5IPcfWGygHW8AHn3QqzwADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVsACAAAAAAFXobHiMLvNZuEPr8jtewCX2J93EZG3JNeyVg92fue6YAAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFbAAgAAAAACE7JvOpBgMoZ7kRd4QbxIhxukPTUxXpzhjnBHiR7XoRAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWwAIAAAAAD53Rok1Vq/PMAnXmarqoHJ0PEyYUBmVESa9hIpCv/G9QADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVsACAAAAAA3Apjd+TapONB7k5wBVwTWgn8t+Sq2oyyU5/+as109RcAAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFbAAgAAAAAHJXLlId3edFoniLD/9K2A5973MeP2Ro31flDyqm3l5QAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWwAIAAAAACcxt9hg14WqPNiDv1MkqVljM2e2KJEv53lA17LhV6ZigADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVsACAAAAAAC9hLK1dScQTAqg+YAG3ObdPzg2Xet57HmOFpGmyUR9UAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FbAAgAAAAAAb5IAbZ1hXCNegQ+S+C9i/Z8y6sS8KeU04V6hXa2ml6AAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWwAIAAAAAA9LOcKmhek8F2wAh8yvT/vjp2gaouuO+Hmv10lwAeWPAADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVsACAAAAAAcf/y75UOuI62A6vWH7bYr/5Jz+nirZVYK/81trN6XOQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFbAAgAAAAALeGiLJS4z2zhgVpxzyPdRYyACP9QzQBOob34YrIZumCAAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWwAIAAAAAAmf+NYh9TZ/QRu3w/GQz66n7DtfbJijN3G7KzeL8lstAADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVsACAAAAAAvVbDkLxXx2DcMLifIQ3K0IIJcLcAG9DUrNfI6aoUjNcAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFbAAgAAAAACzvZ33h6aWEe8hmo+1f6OXJ72FY5hvWaUuha64ZV3KFAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWwAIAAAAAD+P4H0sk9jOd+7vOANt2/1Ectb+4ZRGPE8GkHWNXW3MgADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVsACAAAAAAQEZ1ZZ8GC8rdbg7s87OM5Gr9qkTXS9+P5DuAZxj5Gl4AAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFbAAgAAAAACdltCeWi5E/q1Li1eXLChpM2D9QQSGLBZ82NklQSc0oAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWwAIAAAAAD6aEdOO0CsQGagioOCvANPCEHSpJ8BSixlPBq5ERhB7AADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVsACAAAAAAeNCIQN6hVnGJinytQRFGlQ2ocoprXNqpia+BSxzl+uwAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFbAAgAAAAAIA32v6oGkAOS96HexGouNTex+tLahtx9QF2dgGClk6WAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWwAIAAAAADqFr1ThRrTXNgIOrJWScO9mk86Ufi95IDu5gi4vP+HWQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVsACAAAAAAJuJbwuaMrAFoI+jU/IYr+k4RzAqITrOjAd3HWCpJHqEAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFbAAgAAAAAJVxavipE0H4/JQvhagdytXBZ8qGooeXpkbPQ1RfYMVHAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWwAIAAAAACD58TO6d+71GaOoS+r73rAxliAO9GMs4Uc8JbOTmC0OwADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVsACAAAAAAI+2TTQIgbFq4Yr3lkzGwhG/tqChP7hRAx2W0fNaH6jcAAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFbAAgAAAAALtSICOzQDfV9d+gZuYxpEj6cCeHnKTT+2G3ceP2H65kAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWwAIAAAAAD+aHNMP/X+jcRHyUtrCNkk1KfMtoD3GTmShS8pWGLt+AADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVsACAAAAAAF7SvnjjRk5v2flFOKaBAEDvjXaL1cpjsQLtK2fv9zdQAAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FbAAgAAAAAALACk0KcCDN/Kv8WuazY8ORtUGkOZ5Dsm0ys1oOppp/AAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWwAIAAAAAB55FlHAkmTzAYj/TWrGkRJw2EhrVWUnZXDoMYjyfB/ZwADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVsACAAAAAA5E7Ti3PnFiBQoCcb/DN7V1uM3Xd6VKiexPKntssFL7kAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFbAAgAAAAAJzMoyojYV6Ed/LpVN5zge93Odv3U7JgP7wxeRaJZGTdAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWwAIAAAAACeqXoAOQOE4j0zRMlkVd8plaW0RX1npsFvB38Xmzv7sAADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVsACAAAAAAF+1nS7O0v85s3CCy+9HkdeoEfm2C6ZiNbPMMnSfsMHUAAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFbAAgAAAAAOG6DvDZkT9B/xZWmjao2AevN7MMbs3Oh9YJeSd/hZ+hAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWwAIAAAAADuhVLqb1Bkrx8aNymS+bx2cL8GvLFNH4SAi690DUgnWQADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVsACAAAAAAIlO46ehXp4TqpDV0t6op++KO+uWBFh8iFORZjmx2IjkAAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFbAAgAAAAAJMrOUOyiu5Y3sV76zwEFct8L7+i8WGlQI2+8z2W2kzaAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWwAIAAAAAD9qeDchteEpVXWcycmD9kl9449C1dOw0r60TBm5jK+cQADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVsACAAAAAANzg/BnkvkmvOr8nS4omF+q9EG/4oisB+ul4YHi938hwAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFbAAgAAAAAKwx3S4XfDZh4+LuI9jf7XgUh5qiefNv87JD4qvVRfPSAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWwAIAAAAABXvoZhaQE7ogWjeBjceVkp03N20cKYP3TA8vuNsgpfAgADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVsACAAAAAAeA/L8MQIXkamaObtMPLpoDoi5FypA5WAPtMeMrgi0eQAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFbAAgAAAAAFbm10ko67ahboAejQdAV0U2uA5OhZYdb8XUFJ8OL46LAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWwAIAAAAADLZGFJ7MQd5JXMgMXjqZO5LDLxcFClcXPlnRMWRn+1oAADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVsACAAAAAA419oHmD2W0SYoOMwhrhrp8jf68fg9hTkaRdCuVd3CN0AAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FbAAgAAAAAPvl9pBStQvP4OGkN5v0MghUY6djm9n7XdKKfrW0l1sMAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWwAIAAAAADB2/wo5CSHR4ANtifY6ZRXNTO5+O8qP82DfAiAeanpZwADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVsACAAAAAAfggtJTprQ/yZzj7y5z9KvXsdeXMWP0yUXMMJqpOwI88AAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFbAAgAAAAAJtWe6b4wK2Hae2dZm/OEpYQnvoZjz4Sz5IgJC2wInecAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWwAIAAAAAAMGBq72n00rox3uqhxSB98mkenTGCdbbUF1gXrgottzgADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVsACAAAAAAW42nGHa6q2MCAaaPVwaIDfr8QLyQwjKq23onZJYsqVsAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFbAAgAAAAAEUSQGVnAPISD6voD0DiBUqyWKgt2rta0tjmoe+LNt6IAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWwAIAAAAACQ5nED99LnpbqXZuUOUjnO2HTphEAFBjLD4OZeDEYybgADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVsACAAAAAArOO6FyfNRyBi0sPT5iye7M8d16MTLcwRfodZq4uCYKEAAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFbAAgAAAAAMGqPGMPxXbmYbVfSa/japvUljht1zZT33TY7ZjAiuPfAAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWwAIAAAAABt7qSmn3gxJu7aswsbUiwvO+G6lXj/Xhx+J/zQyZxzLAADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVsACAAAAAAUC4eTprX4DUZn2X+UXYU6QjtiXk+u57yoOPBbPQUmDkAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FbAAgAAAAAOk45vg5VqZHAFCO3i0Z52SZi5RADf8NXwf68T5yad/DAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWwAIAAAAAC3Sd+Qg+uFDKpGZHbrQgokXHQ1az1aFl4YK343OB6hcQAAEmNtAAAAAAAAAAAAABBwYXlsb2FkSWQAAAAAABBmaXJzdE9wZXJhdG9yAAEAAAASc3AAAQAAAAAAAAAQdGYAAQAAABNtbgD/////Y46NN8CHrb4J7f/fE214AP////9jjo03wIetvgnt/18A", "subType": "06" } } } }, "u": { "$set": { "encryptedDecimalNoPrecision": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalNoPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-DecimalPrecision-Aggregate.json000066400000000000000000000555661511661753600377440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-DecimalPrecision-Correctness.json000066400000000000000000001004421511661753600403300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "1.0" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "1.0" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lte": { "$numberDecimal": "1.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "0.0" } } } }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "200.0" } } } }, "object": "coll", "expectError": { "errorContains": "must be less than the range max" } } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" }, "$lte": { "$numberDecimal": "200.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Insert out of range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "-1" } } }, "object": "coll", "expectError": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDecimalPrecision": { "$numberDecimal": "200.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 200, "encryptedDecimalPrecision": { "$numberDecimal": "200.0" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "1.0" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "1.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lte": { "$numberDecimal": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$lt": { "$numberDecimal": "0.0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "200.0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be less than the range max" } } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0.0" }, "$lt": { "$numberDecimal": "2.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$gte": { "$numberDecimal": "0.0" }, "$lte": { "$numberDecimal": "200.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } }, { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDecimalPrecision": { "$in": [ { "$numberDecimal": "0.0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberInt": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-DecimalPrecision-Delete.json000066400000000000000000000467331511661753600372540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-DecimalPrecision-FindOneAndUpdate.json000066400000000000000000000560421511661753600411540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$numberDecimal": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": { "$numberInt": "0" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-DecimalPrecision-InsertFind.json000066400000000000000000000547761511661753600401250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-DecimalPrecision-Update.json000066400000000000000000000562061511661753600372700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DecimalPrecision-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DecimalPrecision. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDecimalPrecision": { "$numberDecimal": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDecimalPrecision": { "$numberDecimal": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedDecimalPrecision": { "$gt": { "$numberDecimal": "0" } } }, "update": { "$set": { "encryptedDecimalPrecision": { "$numberDecimal": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDecimalPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDecimalPrecision": { "$gt": { "$binary": { "base64": "DRYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAABNtbgAAAAAAAAAAAAAAAAAAAD4wE214ANAHAAAAAAAAAAAAAAAAPjAA", "subType": "06" } } } }, "u": { "$set": { "encryptedDecimalPrecision": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDecimalPrecision", "bsonType": "decimal", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDecimal": "0.0" }, "max": { "$numberDecimal": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-Defaults.json000066400000000000000000000527241511661753600344060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Defaults", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range applies defaults for trimFactor and sparsity", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } } ] }, { "_id": { "$numberInt": "1" }, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedInt": { "$gt": { "$binary": { "base64": "DRgbAAADcGF5bG9hZADEGgAABGcAsBoAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAA30oqY6NKy1KWDWf6Z36DtA2QsL9JRALvHX6smxz8cb4FcwAgAAAAADIhM0hCHwFGH+k7kPGuZlO+v5TjV6RRwA5FqUKM60o0BWwAIAAAAABTMPNUweBKrILSCxc5gcgjn9pTkkKX7KqWXgNMk4q7XgADMgB9AAAABWQAIAAAAACnCDvYEbgR9fWeQ8SatKNX43p0XIXTyFfzc7/395V2swVzACAAAAAAp8pkn2wJrZRBLlD18oE1ZRRiujmtFtuHYTZDzdGNE4kFbAAgAAAAAE2eptD2Jp126h5cd7S6k8IjRB6QJhuuWzPU/SEynDXTAAMzAH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzQAfQAAAAVkACAAAAAA8Ci9z02yMVsDNyHvLStLAHR25LO22UO5P/gbUG/IStQFcwAgAAAAAOdfFhaFVq1JPr3dIeLm1EYKWgceZ7hZ5FJT5u/lL/I+BWwAIAAAAADqUyU1hSFDLCmqsz2dhPhefzCShUV/Z2x+4P9xcGw8rwADNQB9AAAABWQAIAAAAAD3g2atCWYVOXW0YbCbvIturqNIAsy210bkL9KmqVMlAAVzACAAAAAAVGEb7L0QCjV/PBTAvUyhlddo467ToKjlMdwI9hsjuE4FbAAgAAAAAJe0bDhUH1sZldnDGWn0xMa1CQuN6cgv/i/6XqnpPS39AAM2AH0AAAAFZAAgAAAAANQOKUE9FOmCoMva2IYg45LZXJX0cMpUR1OvIwFmjLDYBXMAIAAAAAB6dyIKkQ86l/8j8zeWcDYeVGRYKd0USz6To3LbOBAKsAVsACAAAAAAELK0ExI0g4/WxNs+mf+Ua+mie3MuMO3daPGukA23VUYAAzcAfQAAAAVkACAAAAAARQp+fGA08v1bhcnYbfsP0ubXl9yg18QmYMfh2sd8EdEFcwAgAAAAABhe79wEznE298tt02xyRF7bk7a2NH9kwVg1TPY5/lT1BWwAIAAAAAADiGV5f/RRPkwpSrZMGHNBSarmwyqV+SYXI73QW/PmnwADOAB9AAAABWQAIAAAAABnW3CpmSFTglPNKYHJHhJHC/vd5BMWQpztIXQBL0sCngVzACAAAAAAC21qRBu2Px7VUz1lW95Dfn/0tw2yq9AVBtka34HijLgFbAAgAAAAAP8S1s5OA5cJT6ILpA94LanuLsSl9BsRCWHBtufFTMVrAAM5AH0AAAAFZAAgAAAAAJRIWu6DI2LR+2Pi09OaBZEmS2FInyBnGs9wf9Jf2wiIBXMAIAAAAABoDqKzj11qyOfXl4dcfkmGHqZxXyAsnGlgA9wsJRWWUQVsACAAAAAAIsDousyo/D8e4BCwUqvFhrKtOnpcGCSqpN94oFtWaC0AAzEwAH0AAAAFZAAgAAAAAE0h7vfdciFBeqIk1N14ZXw/jzFT0bLfXcNyiPRsg4W4BXMAIAAAAAB0Kbvm3VLBphtd8/OpgNuJtJaJJLhHBCKZJJeK+GcthAVsACAAAAAAKfjHp8xww1JDjzyjTnfamOvjFDc1Z3Hp/v/ZuQnFOOEAAzExAH0AAAAFZAAgAAAAACL9+rQRyywIXa5Pr7g2SnB0s0EjIct7PQtzjEkA69acBXMAIAAAAADz54imCCbu/qQkYP9wW2f5pHoBS+EyCe+xuDwC0UTiYgVsACAAAAAAKv602j4c3Bpn2t10qGl68eAD/fQsIH5lKMj8ANwrf7oAAzEyAH0AAAAFZAAgAAAAAKTK0NLhQ/+Y/HMxjRwBlXpXJAhAmCoWf1fReTegPnVpBXMAIAAAAAD7AlW+P4FfQS4r8d7EEvPVEP1diSbrVDBqg8ZvNl1XRAVsACAAAAAATTSEkff+/JMBjNwUciY2RQ6M66uMQMAtwU+UidDv1y4AAzEzAH0AAAAFZAAgAAAAAGMbgPxi2Wu1AlqoDKTgyBnCZlnCjHm2naxRcizkIbYJBXMAIAAAAADMvSM3VZzVyRFCfUvcLXAXQFRIxlhm0t0dUsnaRZG4hgVsACAAAAAAI7uGriMAQc4A/a70Yi1Y7IAC7o/mfNYf7/FvwELYf80AAzE0AH0AAAAFZAAgAAAAAPnZ1bdmrcX0fsSxliuSqvDbRqwIiVg0tYp0PViRX0nOBXMAIAAAAAAqBdZGg9O74mnwyQF+lILtyzHdLOErDjPSf9sM8EqCugVsACAAAAAAwhuDsz+fCtqY8mW8QvEVQERjDChwrYTw4y7dinlCCOMAAzE1AH0AAAAFZAAgAAAAAJ40Dmb5BUT1AlWjfXB43nIbJgDn9rBg9FAeYR80WK0vBXMAIAAAAAAMPqLMDdNmnKzA3Hq49/NkJfs+/cjnyjSAbmiOFUE5FgVsACAAAAAAxbi7ql49Y4pduqWlLJqpwimRzrEnC7w5fWaMBiinHL8AAzE2AH0AAAAFZAAgAAAAAGelnhqWM2gUVy4P5QE/2Zfd7s9BugPqB/tcnSsFg5X0BXMAIAAAAAAWUhif3G+NMvZ3YPLB5OMuIhfPEu6U8KR9gTvJFz5uIwVsACAAAAAADEs8/aVSj2sJjxjv1K7o/aH8vZzt1bga73YiIKUx5DYAAzE3AH0AAAAFZAAgAAAAAD1xX2wCyf1aK1MoXnBAPfWLeBxsJI2i06tWbuiYKgElBXMAIAAAAACW1NW4RibvY0JRUzPvCmKnVbEy8AIS70fmsY08WgJOEgVsACAAAAAAQq9eIVoLcd4WxXUC3vub+EnxmcI2uP/yUWr3cz0jv9EAAzE4AH0AAAAFZAAgAAAAAHwU1LYeJmTch640sTu3VRRRdQg4YZ7S9IRfVXWHEWU8BXMAIAAAAACozWKD2YlqbQiBVVwJKptfAVM+R2FPJPtXkxVFAhHNXQVsACAAAAAAn7LS0QzTv9sOJzxH0ZqxsLYBYoArEo/PIXkU/zTnpM0AAzE5AH0AAAAFZAAgAAAAAHKaToAsILpmJyCE02I1iwmF/FibqaOb4b5nteuwOayfBXMAIAAAAABPxYjSK5DKgsdUZrZ+hM6ikejPCUK6Rqa0leoN7KOM0QVsACAAAAAAH9rPq5vvOIe9nTAcM1W1dVhQZ+gSkBohgoWLPcZnQXcAAzIwAH0AAAAFZAAgAAAAANTGiHqJVq28n7mMZsJD6gHxVQp1A6z8wgZVW+xV/lhmBXMAIAAAAABCR4BfdNVy7WE+IyQ312vYuIW0aGcXxr2II/MbNz8ZdAVsACAAAAAAng0GYpYJTypRLQUd5tIXWaAjZX5na04T/BypmwwrXPoAAzIxAH0AAAAFZAAgAAAAABooumzjEqp9Hvvd+sn1L82NI2iUGRl0nXQNJTHM7oyVBXMAIAAAAADgjz5L2ursK4C+pXXsJ6XHABhyallj9s/vSUgxXvjiiwVsACAAAAAAPjlAM0tbO6EUmLAeIZt57YMkMsuQfuC3T3d9vtnxgjwAAzIyAH0AAAAFZAAgAAAAAMA4jmE8U2uGkYUeKoYSlb22tfrRq2VlhV1Jq1kn4hV9BXMAIAAAAADG4fLeJUcINPSb1pMfAASJkuYsgS/59Eq/51mET/Y7RQVsACAAAAAAmwwcWOnzvpxm4pROXOL+BlxjEG/7v7hIautb2ubFT44AAzIzAH0AAAAFZAAgAAAAAK8/E3VHzHM6Kjp39GjFy+ci1IiUG5oxh0W6elV+oiX2BXMAIAAAAAA4/F4Q94xxb2TvZcMcji/DVTFrZlH8BL/HzD86RRmqNAVsACAAAAAAif3HPf6B1dTX/W+Vlp6ohadEQk/GAmHYzXfJia2zHeIAAzI0AH0AAAAFZAAgAAAAAGUX9ttLN1cCrOjlzsl/E6jEzQottNDw8Zo94nbO1133BXMAIAAAAAA7uVthFvXH+pbBrgQmnkPcpiHFEVCAi0WA7sAt9tlt3gVsACAAAAAAznaMStSbtGXU1Pb5z9KDTvEd79s6gmWYCKOKdzeijpEAAzI1AH0AAAAFZAAgAAAAAKnT/qg8N85Q9EQvpH7FBqUooxHFgrIjqLlIDheva2QSBXMAIAAAAABGAKkFMKoSIrvClWF7filoYM6fI9xSqOJVNS3dv4lxYwVsACAAAAAAgITE31hQA4ZOxpUFYSYv0mzWbd/6RKgbUXiUY96fBQEAAzI2AH0AAAAFZAAgAAAAAHRDRDT2hJrJ8X9zB9ELT28q8ZsfkYr92chaZYakiLlqBXMAIAAAAAAT0Le67ObldDta/Qb17dYfdslPsJTfGj3bWAgC0JIingVsACAAAAAAMGDrqys8iJ3fCT2Cj+zXIuXtsf4OAXWJl5HoPUMlbNoAAzI3AH0AAAAFZAAgAAAAAOOJcUjYOE0KqcYS1yZ363zglQXfr3XSD+R5fWLSivDoBXMAIAAAAABjeLe+tg37lNa+DdVxtlCtY77tV9PqfJ5X4XEKrfwu0AVsACAAAAAAlbpHiQAPLLTvSF+u58RBCLnYQKB5wciIQmANV9bkzsoAAzI4AH0AAAAFZAAgAAAAAMwWOOaWDDYUusdA1nyoaEB3C4/9GRpFNGags95Ddp4LBXMAIAAAAACLrsQXGWK15fW4mPEUXJ/90by13aG+727qWJep8QJ/WgVsACAAAAAAuThwsAsKUB56QAXC0MjJsZ9736atbiHPlK2tE0urf9QAAzI5AH0AAAAFZAAgAAAAABPRXBK0z8UANcvMDWntBjN9yF7iGMPLbhbaKrvHwcplBXMAIAAAAACZlqWsYPIb+ydmH03BxD3TqSGsSNoI7EVCy0VgW0TpYgVsACAAAAAAD2uaBv8oc7l4EeC5PWx5sfeyGZoas0JdFJ33M3jjgjMAAzMwAH0AAAAFZAAgAAAAAOn9/6pbzjIxFEApugaVOvVKXq23sDCJELv5UtLPDZI3BXMAIAAAAACHIwSDTlof0vFoigF4drbeM/8rdlj/4U386zQsNLtPGwVsACAAAAAAsYt/rXnpL55J9rlWSFRA4seaU6ggix7RgxbrJPu6gO4AAzMxAH0AAAAFZAAgAAAAAIMCESykv5b5d6mYjU5DlnO709lOFCaNoJBLtzBIqmg4BXMAIAAAAADs1Bfuaun4Es3nQ4kr29BzheLRDcFv+9a0gOGkSEcrDgVsACAAAAAA5kW6i/jOBSdoGAsZEZxVNRvt6miv86bP8JfUT+1KJg8AAzMyAH0AAAAFZAAgAAAAAFSPmr27XgKhUkbEvvC6Br5K1w7280NZrrhdzfYF+YGjBXMAIAAAAADv2h+Xq6kM7MHYTLMACRwbe2MzGHu4sdB67FGzDR6H4QVsACAAAAAAKII0MMC7o6GKVfGo2qBW/p35NupBp7MI6Gp0zXYwJOcAAzMzAH0AAAAFZAAgAAAAAPSV9qprvlNZK6OSQZNxKhJmBMs6QCKFESB/oeIvAS0iBXMAIAAAAAA835Jh22/pvZgKoYH6KjE+RRpYkaM1G35TWq6uplk/rgVsACAAAAAA162IdSb079yVlS7GkuSdHU3dOw03a+NS55ZPVBxbD08AAzM0AH0AAAAFZAAgAAAAAGsadEBJFax/UltPXB86G/YPxo6h353ZT+rC62iGy7qqBXMAIAAAAADs9TP3h91f6bTuG8QCQMA3atAVGs8k0ZjVzX3pM8HNAgVsACAAAAAA2ed4R4wYD6DT0P+N6o3gDJPE0DjljbRAv5vme3jb42sAAzM1AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzM2AH0AAAAFZAAgAAAAAKJY+8+7psFzJb5T+Mg9UWb6gA9Y8NN9j/ML2jZkNDNPBXMAIAAAAAA2R/nCtSYfCim89BzdUPS+DTQGwYDk+2ihFPEBS8h+ygVsACAAAAAAaEQra7xyvA3JS0BasIpRVrz7ZXsp6RpH7OpfJBFzFG8AAzM3AH0AAAAFZAAgAAAAAI4qr+sJiRaqwZRhnenAzD7tTKq+jP1aaLyAln3w1HQuBXMAIAAAAADNYpqV73NpwN+Ta0ms1SRiu+6WNOOdGT+syghL+JAFhQVsACAAAAAAN07Fo9SK+fXp5Odk1J806pyVWc2WHXCtb1gJQknTgqsAAzM4AH0AAAAFZAAgAAAAAISgN1Hid7IWvDESN/3tywFZiBsZPYapOUx9/QjDDxLfBXMAIAAAAAA7lxpEz3+CGdv6/WKIAlIwRYURREKgn7+StwNoVekkDwVsACAAAAAAx+Oa2v1e1R7VomfsvcKO8VkY4eTl7LzjNQQL6Cj6GBQAAzM5AH0AAAAFZAAgAAAAAOTLdk1RIUzCsvK7xCXy+LxGhJf87fEL406U9QKta3JRBXMAIAAAAAD8+6UnUn8sN6AgQuuf7uFxW+2ZJNpZLgp3eKVtjbo9ewVsACAAAAAAQN3mZHmaDM0ZbUnk2O/+wCUjiCs4bnshfHjd/4ygLXcAAzQwAH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzQxAH0AAAAFZAAgAAAAAPLX4XT1eMfokMvj73G6loHEotbdivVFM6cpMbU0zIOmBXMAIAAAAABuTqwm6E60kVBN5iClzLnMBozIQRYjMozzRNKVhixkEAVsACAAAAAAjvY9G0Of8EQcZ4GVfSEVz7jrNn7i4qps2r82jJmngKoAAzQyAH0AAAAFZAAgAAAAAGzGJAUZBcVKRb4bCSNaRxtcDH2TqIgHqMElD9RL7SzDBXMAIAAAAABbJfrLwBrqZ2Ylm9QfL7nkW+GJ8vTlaeMUDT5620ebaAVsACAAAAAASiaS1IlBls5Tan57XqqbR1cuvyOcoSibJJQGREzm4c0AAzQzAH0AAAAFZAAgAAAAAC028abAppwE/ApZHU5RbzZZ8OPD5eJ8/6+NgiSFf4d+BXMAIAAAAAD3THvDUYWULR+AVLuRRPPAMVMeZ2ldWpBYSODboszWbQVsACAAAAAAATOaeYj+kx3MTDeNUcKGbUxLZDeMjC8JrWnlHmWTamQAAzQ0AH0AAAAFZAAgAAAAAHWr8wQYIKLiKeb3wd8kZQuXD/GUHDqXj12K/EQWV11CBXMAIAAAAADo3aFHDuyfls9tcWCxlFqJn4zDXd3WT9CIFYFjJnTYswVsACAAAAAAeMbIatR7DgefzuvF4WyNVDjJxP8KPA6U/rmMQIBvpM0AAzQ1AH0AAAAFZAAgAAAAAMdRi6AAjF1Z9ucMqYl2Ud1PLUGOlOPJFgSrPTjs27u8BXMAIAAAAAAqOdI7+P8srvqCTFadwMM3iggaVOGcf1BB0EjBYeV6RAVsACAAAAAAU+V2GrqgxJYs9mxuak/8JMFICXwQ2vksrBdOvSwWFpoAAzQ2AH0AAAAFZAAgAAAAADKKe++fqh4sn0a8Bb+w3QMFnOqSE5hDI3zGQTcmJGcOBXMAIAAAAAC8ebHa++JmxVISv6LzjuMgEZqzKSZlJyujnSV9syRD9AVsACAAAAAAQcVNSjyetScLu78IrAYaAigerY4kWtnbctmIyb19Wa4AAzQ3AH0AAAAFZAAgAAAAAMKoHwhZcocaQy7asIuRG8+P1qPENgFAwzc3X1gZWYnJBXMAIAAAAAB+R01s+WdJjLa5p7STuEylradWr+2JDxsWx9bKDgXNDQVsACAAAAAADeXTBHsm+FH2pQVoqOBPPIJiTJLqrzGisNnQ3S3xYJAAAzQ4AH0AAAAFZAAgAAAAAF41XuyBvREKcxjDl+wbnillseykpAjCKHmwIu+RNvM7BXMAIAAAAAC2Wzq+2mfO7howoOZxquqvOuH1D2WdlzA1nK+LUp0FMgVsACAAAAAARha+D6DVeDxSjNyXXO5DMY+W70EGyfc7gxR4TjzcYusAAzQ5AH0AAAAFZAAgAAAAAAfONgdhLPEjvsMxTY9K4//7WjREuRmZ6Bpcf3yvdMf3BXMAIAAAAABCy/zjmzucxQkbJ96l5vS5x6SeyHE0Z+Aqp9oZgBcC6QVsACAAAAAAasG/uN4DnWHZLkLhH4cMzXk5F/HL2D+72WH+1jjgH8UAAzUwAH0AAAAFZAAgAAAAAA5ZsebFm5NrSGs2E17+fUt4qkzsVmy4IJA5nGehtSBVBXMAIAAAAAAOzteKfp+YGPqn1fi8u/lKXP7E2Zgouwgt6KAADHX9AQVsACAAAAAA2+FaAbl8JZogfNCI0FFbmZZPy/KLF1u16FGrPspSbEIAAzUxAH0AAAAFZAAgAAAAAHf6LIjrvy6I31w/8b910U9qU8cBIYiWn9mW55NYZF8VBXMAIAAAAACONPisRtnFG9vV2mTQ3hRR/hGuVRA9dGd9Lt9JqDoM8wVsACAAAAAA+h7V/jIYJcd0ALIvFBlwxkFqWxBVlkqT9wFkmumr4QcAAzUyAH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAIAAAAAAAAAEHRmAAYAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Double-Aggregate.json000066400000000000000000001431111511661753600357240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Double. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=", "subType": "00" } }, { "$binary": { "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=", "subType": "00" } }, { "$binary": { "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=", "subType": "00" } }, { "$binary": { "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=", "subType": "00" } }, { "$binary": { "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=", "subType": "00" } }, { "$binary": { "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=", "subType": "00" } }, { "$binary": { "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=", "subType": "00" } }, { "$binary": { "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=", "subType": "00" } }, { "$binary": { "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=", "subType": "00" } }, { "$binary": { "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=", "subType": "00" } }, { "$binary": { "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=", "subType": "00" } }, { "$binary": { "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=", "subType": "00" } }, { "$binary": { "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=", "subType": "00" } }, { "$binary": { "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=", "subType": "00" } }, { "$binary": { "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=", "subType": "00" } }, { "$binary": { "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=", "subType": "00" } }, { "$binary": { "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=", "subType": "00" } }, { "$binary": { "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=", "subType": "00" } }, { "$binary": { "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=", "subType": "00" } }, { "$binary": { "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=", "subType": "00" } }, { "$binary": { "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=", "subType": "00" } }, { "$binary": { "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=", "subType": "00" } }, { "$binary": { "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=", "subType": "00" } }, { "$binary": { "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=", "subType": "00" } }, { "$binary": { "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=", "subType": "00" } }, { "$binary": { "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=", "subType": "00" } }, { "$binary": { "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=", "subType": "00" } }, { "$binary": { "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=", "subType": "00" } }, { "$binary": { "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=", "subType": "00" } }, { "$binary": { "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=", "subType": "00" } }, { "$binary": { "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=", "subType": "00" } }, { "$binary": { "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=", "subType": "00" } }, { "$binary": { "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=", "subType": "00" } }, { "$binary": { "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=", "subType": "00" } }, { "$binary": { "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=", "subType": "00" } }, { "$binary": { "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=", "subType": "00" } }, { "$binary": { "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=", "subType": "00" } }, { "$binary": { "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=", "subType": "00" } }, { "$binary": { "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=", "subType": "00" } }, { "$binary": { "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=", "subType": "00" } }, { "$binary": { "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=", "subType": "00" } }, { "$binary": { "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=", "subType": "00" } }, { "$binary": { "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=", "subType": "00" } }, { "$binary": { "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=", "subType": "00" } }, { "$binary": { "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=", "subType": "00" } }, { "$binary": { "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=", "subType": "00" } }, { "$binary": { "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=", "subType": "00" } }, { "$binary": { "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=", "subType": "00" } }, { "$binary": { "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=", "subType": "00" } }, { "$binary": { "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=", "subType": "00" } }, { "$binary": { "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=", "subType": "00" } }, { "$binary": { "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=", "subType": "00" } }, { "$binary": { "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=", "subType": "00" } }, { "$binary": { "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=", "subType": "00" } }, { "$binary": { "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=", "subType": "00" } }, { "$binary": { "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=", "subType": "00" } }, { "$binary": { "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=", "subType": "00" } }, { "$binary": { "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=", "subType": "00" } }, { "$binary": { "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=", "subType": "00" } }, { "$binary": { "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-Double-Correctness.json000066400000000000000000000560401511661753600363340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gte": { "$numberDouble": "0.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "1.0" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$lt": { "$numberDouble": "1.0" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$lte": { "$numberDouble": "1.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gte": { "$numberDouble": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "1.0" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$lt": { "$numberDouble": "1.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$lte": { "$numberDouble": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoubleNoPrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberInt": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Double-Delete.json000066400000000000000000001110651511661753600352430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Double. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-Double-FindOneAndUpdate.json000066400000000000000000001433661511661753600371620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Double. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$numberDouble": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=", "subType": "00" } }, { "$binary": { "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=", "subType": "00" } }, { "$binary": { "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=", "subType": "00" } }, { "$binary": { "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=", "subType": "00" } }, { "$binary": { "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=", "subType": "00" } }, { "$binary": { "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=", "subType": "00" } }, { "$binary": { "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=", "subType": "00" } }, { "$binary": { "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=", "subType": "00" } }, { "$binary": { "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=", "subType": "00" } }, { "$binary": { "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=", "subType": "00" } }, { "$binary": { "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=", "subType": "00" } }, { "$binary": { "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=", "subType": "00" } }, { "$binary": { "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=", "subType": "00" } }, { "$binary": { "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=", "subType": "00" } }, { "$binary": { "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=", "subType": "00" } }, { "$binary": { "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=", "subType": "00" } }, { "$binary": { "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=", "subType": "00" } }, { "$binary": { "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=", "subType": "00" } }, { "$binary": { "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=", "subType": "00" } }, { "$binary": { "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=", "subType": "00" } }, { "$binary": { "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=", "subType": "00" } }, { "$binary": { "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=", "subType": "00" } }, { "$binary": { "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=", "subType": "00" } }, { "$binary": { "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=", "subType": "00" } }, { "$binary": { "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=", "subType": "00" } }, { "$binary": { "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=", "subType": "00" } }, { "$binary": { "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=", "subType": "00" } }, { "$binary": { "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=", "subType": "00" } }, { "$binary": { "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=", "subType": "00" } }, { "$binary": { "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=", "subType": "00" } }, { "$binary": { "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=", "subType": "00" } }, { "$binary": { "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=", "subType": "00" } }, { "$binary": { "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=", "subType": "00" } }, { "$binary": { "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=", "subType": "00" } }, { "$binary": { "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=", "subType": "00" } }, { "$binary": { "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=", "subType": "00" } }, { "$binary": { "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=", "subType": "00" } }, { "$binary": { "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=", "subType": "00" } }, { "$binary": { "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=", "subType": "00" } }, { "$binary": { "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=", "subType": "00" } }, { "$binary": { "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=", "subType": "00" } }, { "$binary": { "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=", "subType": "00" } }, { "$binary": { "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=", "subType": "00" } }, { "$binary": { "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=", "subType": "00" } }, { "$binary": { "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=", "subType": "00" } }, { "$binary": { "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=", "subType": "00" } }, { "$binary": { "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=", "subType": "00" } }, { "$binary": { "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=", "subType": "00" } }, { "$binary": { "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=", "subType": "00" } }, { "$binary": { "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=", "subType": "00" } }, { "$binary": { "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=", "subType": "00" } }, { "$binary": { "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=", "subType": "00" } }, { "$binary": { "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=", "subType": "00" } }, { "$binary": { "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=", "subType": "00" } }, { "$binary": { "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=", "subType": "00" } }, { "$binary": { "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=", "subType": "00" } }, { "$binary": { "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=", "subType": "00" } }, { "$binary": { "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=", "subType": "00" } }, { "$binary": { "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=", "subType": "00" } }, { "$binary": { "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=", "subType": "00" } }, { "$binary": { "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=", "subType": "00" } }, { "$binary": { "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-Double-InsertFind.json000066400000000000000000001424651511661753600361160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Double. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=", "subType": "00" } }, { "$binary": { "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=", "subType": "00" } }, { "$binary": { "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=", "subType": "00" } }, { "$binary": { "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=", "subType": "00" } }, { "$binary": { "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=", "subType": "00" } }, { "$binary": { "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=", "subType": "00" } }, { "$binary": { "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=", "subType": "00" } }, { "$binary": { "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=", "subType": "00" } }, { "$binary": { "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=", "subType": "00" } }, { "$binary": { "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=", "subType": "00" } }, { "$binary": { "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=", "subType": "00" } }, { "$binary": { "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=", "subType": "00" } }, { "$binary": { "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=", "subType": "00" } }, { "$binary": { "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=", "subType": "00" } }, { "$binary": { "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=", "subType": "00" } }, { "$binary": { "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=", "subType": "00" } }, { "$binary": { "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=", "subType": "00" } }, { "$binary": { "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=", "subType": "00" } }, { "$binary": { "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=", "subType": "00" } }, { "$binary": { "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=", "subType": "00" } }, { "$binary": { "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=", "subType": "00" } }, { "$binary": { "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=", "subType": "00" } }, { "$binary": { "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=", "subType": "00" } }, { "$binary": { "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=", "subType": "00" } }, { "$binary": { "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=", "subType": "00" } }, { "$binary": { "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=", "subType": "00" } }, { "$binary": { "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=", "subType": "00" } }, { "$binary": { "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=", "subType": "00" } }, { "$binary": { "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=", "subType": "00" } }, { "$binary": { "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=", "subType": "00" } }, { "$binary": { "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=", "subType": "00" } }, { "$binary": { "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=", "subType": "00" } }, { "$binary": { "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=", "subType": "00" } }, { "$binary": { "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=", "subType": "00" } }, { "$binary": { "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=", "subType": "00" } }, { "$binary": { "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=", "subType": "00" } }, { "$binary": { "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=", "subType": "00" } }, { "$binary": { "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=", "subType": "00" } }, { "$binary": { "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=", "subType": "00" } }, { "$binary": { "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=", "subType": "00" } }, { "$binary": { "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=", "subType": "00" } }, { "$binary": { "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=", "subType": "00" } }, { "$binary": { "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=", "subType": "00" } }, { "$binary": { "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=", "subType": "00" } }, { "$binary": { "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=", "subType": "00" } }, { "$binary": { "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=", "subType": "00" } }, { "$binary": { "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=", "subType": "00" } }, { "$binary": { "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=", "subType": "00" } }, { "$binary": { "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=", "subType": "00" } }, { "$binary": { "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=", "subType": "00" } }, { "$binary": { "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=", "subType": "00" } }, { "$binary": { "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=", "subType": "00" } }, { "$binary": { "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=", "subType": "00" } }, { "$binary": { "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=", "subType": "00" } }, { "$binary": { "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=", "subType": "00" } }, { "$binary": { "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=", "subType": "00" } }, { "$binary": { "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=", "subType": "00" } }, { "$binary": { "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=", "subType": "00" } }, { "$binary": { "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=", "subType": "00" } }, { "$binary": { "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=", "subType": "00" } }, { "$binary": { "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=", "subType": "00" } }, { "$binary": { "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=", "subType": "00" } }, { "$binary": { "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=", "subType": "00" } }, { "$binary": { "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Double-Update.json000066400000000000000000001436761511661753600353000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Double-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Double. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoubleNoPrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoubleNoPrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedDoubleNoPrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoubleNoPrecision": { "$numberDouble": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=", "subType": "00" } }, { "$binary": { "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=", "subType": "00" } }, { "$binary": { "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=", "subType": "00" } }, { "$binary": { "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=", "subType": "00" } }, { "$binary": { "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=", "subType": "00" } }, { "$binary": { "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=", "subType": "00" } }, { "$binary": { "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=", "subType": "00" } }, { "$binary": { "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=", "subType": "00" } }, { "$binary": { "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=", "subType": "00" } }, { "$binary": { "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=", "subType": "00" } }, { "$binary": { "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=", "subType": "00" } }, { "$binary": { "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=", "subType": "00" } }, { "$binary": { "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=", "subType": "00" } }, { "$binary": { "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=", "subType": "00" } }, { "$binary": { "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=", "subType": "00" } }, { "$binary": { "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=", "subType": "00" } }, { "$binary": { "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=", "subType": "00" } }, { "$binary": { "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=", "subType": "00" } }, { "$binary": { "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=", "subType": "00" } }, { "$binary": { "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=", "subType": "00" } }, { "$binary": { "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=", "subType": "00" } }, { "$binary": { "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=", "subType": "00" } }, { "$binary": { "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=", "subType": "00" } }, { "$binary": { "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=", "subType": "00" } }, { "$binary": { "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=", "subType": "00" } }, { "$binary": { "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=", "subType": "00" } }, { "$binary": { "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=", "subType": "00" } }, { "$binary": { "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=", "subType": "00" } }, { "$binary": { "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=", "subType": "00" } }, { "$binary": { "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=", "subType": "00" } }, { "$binary": { "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=", "subType": "00" } }, { "$binary": { "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=", "subType": "00" } }, { "$binary": { "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=", "subType": "00" } }, { "$binary": { "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=", "subType": "00" } }, { "$binary": { "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=", "subType": "00" } }, { "$binary": { "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=", "subType": "00" } }, { "$binary": { "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=", "subType": "00" } }, { "$binary": { "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=", "subType": "00" } }, { "$binary": { "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=", "subType": "00" } }, { "$binary": { "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=", "subType": "00" } }, { "$binary": { "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=", "subType": "00" } }, { "$binary": { "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=", "subType": "00" } }, { "$binary": { "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=", "subType": "00" } }, { "$binary": { "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=", "subType": "00" } }, { "$binary": { "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=", "subType": "00" } }, { "$binary": { "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=", "subType": "00" } }, { "$binary": { "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=", "subType": "00" } }, { "$binary": { "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=", "subType": "00" } }, { "$binary": { "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=", "subType": "00" } }, { "$binary": { "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=", "subType": "00" } }, { "$binary": { "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=", "subType": "00" } }, { "$binary": { "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=", "subType": "00" } }, { "$binary": { "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=", "subType": "00" } }, { "$binary": { "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=", "subType": "00" } }, { "$binary": { "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=", "subType": "00" } }, { "$binary": { "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=", "subType": "00" } }, { "$binary": { "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=", "subType": "00" } }, { "$binary": { "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=", "subType": "00" } }, { "$binary": { "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=", "subType": "00" } }, { "$binary": { "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=", "subType": "00" } }, { "$binary": { "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=", "subType": "00" } }, { "$binary": { "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=", "subType": "00" } }, { "$binary": { "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=", "subType": "00" } }, { "$binary": { "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=", "subType": "00" } }, { "$binary": { "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=", "subType": "00" } }, { "$binary": { "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=", "subType": "00" } }, { "$binary": { "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=", "subType": "00" } }, { "$binary": { "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=", "subType": "00" } }, { "$binary": { "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=", "subType": "00" } }, { "$binary": { "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=", "subType": "00" } }, { "$binary": { "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=", "subType": "00" } }, { "$binary": { "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=", "subType": "00" } }, { "$binary": { "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=", "subType": "00" } }, { "$binary": { "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=", "subType": "00" } }, { "$binary": { "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=", "subType": "00" } }, { "$binary": { "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=", "subType": "00" } }, { "$binary": { "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=", "subType": "00" } }, { "$binary": { "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=", "subType": "00" } }, { "$binary": { "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=", "subType": "00" } }, { "$binary": { "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=", "subType": "00" } }, { "$binary": { "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=", "subType": "00" } }, { "$binary": { "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=", "subType": "00" } }, { "$binary": { "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=", "subType": "00" } }, { "$binary": { "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=", "subType": "00" } }, { "$binary": { "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=", "subType": "00" } }, { "$binary": { "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=", "subType": "00" } }, { "$binary": { "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=", "subType": "00" } }, { "$binary": { "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=", "subType": "00" } }, { "$binary": { "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=", "subType": "00" } }, { "$binary": { "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=", "subType": "00" } }, { "$binary": { "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=", "subType": "00" } }, { "$binary": { "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=", "subType": "00" } }, { "$binary": { "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=", "subType": "00" } }, { "$binary": { "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=", "subType": "00" } }, { "$binary": { "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=", "subType": "00" } }, { "$binary": { "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=", "subType": "00" } }, { "$binary": { "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=", "subType": "00" } }, { "$binary": { "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=", "subType": "00" } }, { "$binary": { "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=", "subType": "00" } }, { "$binary": { "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=", "subType": "00" } }, { "$binary": { "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=", "subType": "00" } }, { "$binary": { "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=", "subType": "00" } }, { "$binary": { "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=", "subType": "00" } }, { "$binary": { "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=", "subType": "00" } }, { "$binary": { "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=", "subType": "00" } }, { "$binary": { "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=", "subType": "00" } }, { "$binary": { "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=", "subType": "00" } }, { "$binary": { "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=", "subType": "00" } }, { "$binary": { "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=", "subType": "00" } }, { "$binary": { "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=", "subType": "00" } }, { "$binary": { "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=", "subType": "00" } }, { "$binary": { "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=", "subType": "00" } }, { "$binary": { "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=", "subType": "00" } }, { "$binary": { "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=", "subType": "00" } }, { "$binary": { "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=", "subType": "00" } }, { "$binary": { "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=", "subType": "00" } }, { "$binary": { "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=", "subType": "00" } }, { "$binary": { "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=", "subType": "00" } }, { "$binary": { "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=", "subType": "00" } }, { "$binary": { "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=", "subType": "00" } }, { "$binary": { "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=", "subType": "00" } }, { "$binary": { "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=", "subType": "00" } }, { "$binary": { "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=", "subType": "00" } }, { "$binary": { "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=", "subType": "00" } }, { "$binary": { "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=", "subType": "00" } }, { "$binary": { "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=", "subType": "00" } }, { "$binary": { "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoubleNoPrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDoubleNoPrecision": { "$gt": { "$binary": { "base64": "DbMkAAADcGF5bG9hZABXJAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVsACAAAAAAuPSXVmJUAUpTQg/A9Bu1hYczZF58KEhVofakygbsvJQAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWwAIAAAAADuCQ/M2xLeALF0UFZtJb22QGOhHmJv6xoO+kZIHcDeiAADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFbAAgAAAAAKUaLzIldNIZv6RHE+FwbMjzcNHqPESwF/37mm43VPrsAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVsACAAAAAA/qxvuvJbAHwwhfrPVpmCFzNvg2cU/NXaWgqgYUZpgXwAAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWwAIAAAAACFGeOtd5zBXTJ4JYonkn/HXZfHipUlqGwIRUcH/VTatwADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFbAAgAAAAABlnhpgTQ0WjLb5u0b/vEydrCeFjVynKd7aqb+UnvVLeAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVsACAAAAAA5hmY4ptuNxULGf87SUFXQWGAONsL9U29duh8xqsHtxoAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWwAIAAAAAANr4o/+l1OIbbaX5lZ3fQ/WIeOcEXjNI1F0WbSgQrzaQADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFbAAgAAAAANkSt154Or/JKb31VvbZFV46RPgUp8ff/hcPORL7PpFBAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVsACAAAAAAfb1VZZCqs2ivYbRzX4p5CtaCkKW+g20Pr57FWXzEZi8AAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVsACAAAAAAG4YYkTp80EKo59mlHExDodRQFR7njhR5dmISwUJ6ukAAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVsACAAAAAAAqPQi9luYAu3GrFCEsVjd9z2zIDcp6SPTR2w6KQEr+IAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVsACAAAAAAD7K1Fx4gFaaizkIUrf+EGXQeG7QX1jadhGc6Ji471H8AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVsACAAAAAAOWul0oVqJ9CejD2RqphhTC98DJeRQy5EwbNerU2+4l8AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVsACAAAAAADlE+oc1ins+paNcaOZJhBlKlObDJ4VQORWjFYocM4LgAAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVsACAAAAAAoHqiwGOUkBu8SX5U1yHho+UIFdSN2MdQN5s6bQ0EsJYAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVsACAAAAAADyQnHGH2gF4w4L8axUsSTf6Ubk7L5/eoFOJk12MtZAoAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVsACAAAAAAgvxRbXDisNnLY3pfsjDdnFLtkvYUC4lhA68eBXc7KAwAAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVsACAAAAAAxKPaIBKVx3jTA+R/el7P7AZ7efrmTGjJs3Hj/YdMddwAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVsACAAAAAAqyEjfKC8lYoIfoXYHUqHZPoaA6EK5BAZy5dxXZmay4kAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVsACAAAAAA6Ct9nNMKyRazn1OKnRKagm746CGu+jyhbL1qJnZxGi0AAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVsACAAAAAAnc1xCKfdvbUEc8F7XZqlNn1C+hZTtC0I9I3LL06iaNkAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVsACAAAAAAfsLZsEDcWSuNsIo/TD1ReyQW75HPMgmuKZuWFOLKRLoAAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVsACAAAAAACzfjbTBH7IwDU91OqLAz94RFkoqBOkzKAqQb55gT4/MAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVsACAAAAAAaPxcOIxnU7But88/yadOuDJDMcCywwrRitaxMODT4msAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVsACAAAAAAZYK/f9H4OeihmpiFMH7Wm7uLvs2s92zNA8wyrNZTsuMAAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVsACAAAAAAGPnYVvo2ulO9z4LGd/69NAklfIcZqZvFX2KK0s+FcTUAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVsACAAAAAA6NhRTYFL/Sz4tao7vpPjLNgAJ0FX6P/IyMW65qT6YsMAAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVsACAAAAAA/JcUoyKacCB1NfmH8vYqC1f7rd13KShrQqV2r9QBP44AAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVsACAAAAAAxXd9Mh6R3mnJy8m7UfqMKi6oD5DlZpkaOz6bEjMOdiwAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVsACAAAAAAL/D5Sze/ZoEanZLK0IeEkhgVkxEjMWVCfmJaD3a8uNIAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVsACAAAAAAVLHNg0OUVqZ7WGOP53BkTap9FOw9dr1P4J8HxqFqU04AAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVsACAAAAAAs9c9SM49/pWmyUQKslpt3RTMBNSRppfNO0JBvUqHPg0AAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVsACAAAAAAJOP+EHz6awDb1qK2bZQ3kTV7wsj5Daj/IGAWh4g7omAAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVsACAAAAAA4ml/nm0gJNTcJ4vuD+T2Qfq2fQZlibJp/j6MOGDrbHMAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVsACAAAAAACUqiFqHZdGbwAA+hN0YUE5zFg+H+dabIB4dj5/75W/YAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVsACAAAAAAlVz4dhiprSbUero6JFfxzSJGclg63oAkAmgbSwbcYxIAAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVsACAAAAAAVq4xpbymLk0trPC/a2MvB39I7hRiX8EJsVSI5E5hSBkAAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVsACAAAAAA0nWwYzXQ1+EkDvnGq+SMlq20z+j32Su+i/A95SggPb4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVsACAAAAAAp0jYsyohKv9Pm+4k+DplEGbl9WLZpAJzitrcDj4CNsMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVsACAAAAAAbrkZCVgB9Qsp4IAbdf+bD4fT6Boqk5UtuA/zhNrh1y0AAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVsACAAAAAAHErCYycpqiIcCZHdmPL1hi+ovLQk4TAvENpfLdTRamQAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVsACAAAAAAdS34xzJesnUfxLCcc1U7XzUqLy8MAzV/tcjbqaD3lkMAAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVsACAAAAAAQdBDF3747uCVP5lB/zr8VmzxJfTSZHBKeIgm5FyONXwAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVsACAAAAAAOZLQ6o7e4mVfDzbpQioa4d3RoTvqwgnbmc5Qh2wsZuoAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVsACAAAAAAdBuBMJ1lxt0DRq9pOZldQqchLs3B/W02txcMLD490FEAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVsACAAAAAAm3Hk2cvBN0ANaR5jzeZE5TsdxDvJCTOT1I01X7cNVaYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVsACAAAAAAaLvJDrqBESTNZSdcXsd+8GXPl8ZkUsGpeYuyYVv/kygAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVsACAAAAAACz3HVKdWkx82/kGbVpcbAeZtsj2R5Zr0dEPfle4IErkAAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVsACAAAAAAltJJKjCMyBTJ+4PkdDCPJdeX695P8P5h7WOZ+kmExMAAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVsACAAAAAAQQOkIQtkyNavqCnhQbNg3HfqrJdsAGaoxSJePJl1qXsAAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVsACAAAAAAZ6IkrOVRcC8vSA6Vb4fPWZJrYexXhEabIuYIeXNsCSgAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVsACAAAAAA7j3JGnNtR64P4dJLeUoScFRGfa8ekjh3dvhw46sRFk0AAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVsACAAAAAAcvBV+SykDYhmRFyVYwFYB9oBKBSHr55Jdz2cXeowsUQAAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVsACAAAAAAiBunJi0mPnnXdnldiq+If8dcb/n6apHnaIFt+oyYO1kAAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVsACAAAAAAM0TV7S+aPVVzJOQ+cpSNKHTwyQ0mWa8tcHzfk3nR+9IAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVsACAAAAAAS19m7DccQxgryOsBJ3GsCs37yfQqNi1G+S6fCXpEhn4AAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVsACAAAAAAlyLTDVkHxbayklD6Qymh3odIK1JHaOtps4f4HR+PcDgAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVsACAAAAAAJbMMwJfNftA7Xom8Bw/ghuZmSa3x12vTZxBUbV8m888AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVsACAAAAAAZa0/FI/GkZR7CtX18Xg9Tn9zfxkD0UoaSt+pIO5t1t4AAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVsACAAAAAAoxv7UKh0RqUAWcOsQvU123zO1qZn73Xfib0qncZCB34AAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVsACAAAAAAKpADjc4bzIZMi9Q/+oe0EMRJHYQt6dlo1x/lRquagqkAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVsACAAAAAAV76JZAlYpgC/Zl8awx2ArCg1uuyy2XVTSkp0wUMi/7UAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVsACAAAAAAc4Un6dtIFe+AQ+RSfNWs3q63RTHhmyc+5GKRRdpWRv8AAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVsACAAAAAA78YHWVkp6HbZ0zS4UL2z/2pj9vPDcMDt7zTv6NcRsVsAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVsACAAAAAAHW3ERalTFWKMzjuXF3nFh0pSrQxM/ojnPbPhc4v5MaQAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVsACAAAAAATDW0reyaCjbJuVLJzbSLx1OBuBoQu+090kgW4RurVacAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVsACAAAAAAqkC8zYASvkVrp0pqmDyFCkPaDmD/ePAJpMuNOCBhni8AAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVsACAAAAAAPG3IxQVOdZrr509ggm5FKizWWoZPuVtOgOIGZ3m+pdEAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVsACAAAAAA9+Sf7PbyFcY45hP9oTfjQiOUS3vEIAT8C0vOHymwYSUAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVsACAAAAAArQ/E1ACyhK4ZyLqH9mNkCU7WClqRQTGyW9tciSGG/EMAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVsACAAAAAAlgTPaoQKz+saU8rwCT3UiNOdG6hdpjzFx9GBn08ZkBEAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAABbW4A////////7/8BbXgA////////738A", "subType": "06" } } } }, "u": { "$set": { "encryptedDoubleNoPrecision": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoubleNoPrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-DoublePrecision-Aggregate.json000066400000000000000000000553371511661753600376140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-DoublePrecision-Correctness.json000066400000000000000000001001351511661753600402030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "1.0" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "1.0" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lte": { "$numberDouble": "1.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "0.0" } } } }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "200.0" } } } }, "object": "coll", "expectError": { "errorContains": "must be less than the range max" } } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" }, "$lte": { "$numberDouble": "200.0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Insert out of range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "-1" } } }, "object": "coll", "expectError": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedDoublePrecision": { "$numberDouble": "200.0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 200, "encryptedDoublePrecision": { "$numberDouble": "200.0" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "1.0" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "1.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lte": { "$numberDouble": "1.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$lt": { "$numberDouble": "0.0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "200.0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be less than the range max" } } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0.0" }, "$lt": { "$numberDouble": "2.0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$numberDouble": "0.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$numberDouble": "1.0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$gte": { "$numberDouble": "0.0" }, "$lte": { "$numberDouble": "200.0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } }, { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1.0" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedDoublePrecision": { "$in": [ { "$numberDouble": "0.0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0.0" } } ] } ] }, { "description": "Wrong type: Insert Int", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberInt": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Int", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-DoublePrecision-Delete.json000066400000000000000000000465711511661753600371300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-DoublePrecision-FindOneAndUpdate.json000066400000000000000000000556101511661753600410300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DoublePrecision. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoublePrecision": { "$numberDouble": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "update": { "$set": { "encryptedDoublePrecision": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-DoublePrecision-InsertFind.json000066400000000000000000000547131511661753600377700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } }, { "$binary": { "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=", "subType": "00" } }, { "$binary": { "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=", "subType": "00" } }, { "$binary": { "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=", "subType": "00" } }, { "$binary": { "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=", "subType": "00" } }, { "$binary": { "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=", "subType": "00" } }, { "$binary": { "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=", "subType": "00" } }, { "$binary": { "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-DoublePrecision-Update.json000066400000000000000000000561221511661753600371410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-DoublePrecision-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range DoublePrecision. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedDoublePrecision": { "$numberDouble": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedDoublePrecision": { "$numberDouble": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedDoublePrecision": { "$gt": { "$numberDouble": "0" } } }, "update": { "$set": { "encryptedDoublePrecision": { "$numberDouble": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } }, { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=", "subType": "00" } }, { "$binary": { "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=", "subType": "00" } }, { "$binary": { "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=", "subType": "00" } }, { "$binary": { "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=", "subType": "00" } }, { "$binary": { "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=", "subType": "00" } }, { "$binary": { "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=", "subType": "00" } } ] }, { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=", "subType": "00" } }, { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=", "subType": "00" } }, { "$binary": { "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=", "subType": "00" } }, { "$binary": { "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=", "subType": "00" } }, { "$binary": { "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=", "subType": "00" } }, { "$binary": { "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=", "subType": "00" } }, { "$binary": { "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedDoublePrecision": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedDoublePrecision": { "$gt": { "$binary": { "base64": "DQYKAAADcGF5bG9hZACiCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVsACAAAAAAhEPSNv4M023A3hzNFuy83+hIKuZ2mKRY954N++aEOBUAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWwAIAAAAACEndE0SLxFSElOrNnqeX0EPmgDio3udZjVREy4JLS3sQADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFbAAgAAAAAIGepU1RSCF8sWODHEpKglsoqw3VBBH4a/URGxgGzbq2AAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVsACAAAAAA1eYAZBFHlDiaDAljWi8blGQ2nvvZa5AO5doeo0SFZsgAAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWwAIAAAAAAPxXmi+SDJ+40A0KdwfRczexlZQrHjIA+D3oUB0EY9tAADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFbAAgAAAAAA+uJUw1ICYgyeygSRe206VTWVtUnhdci3iHbyP5YtEVAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVsACAAAAAAJfFErjZ6BPhsw5LjJLqNtKDLJ4zV0eIZppQpd9b0wZoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWwAIAAAAAD4wUR3xd9lKltcqqo8LYvdMQWzCRobkV/ppKB/yn5dUgADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFbAAgAAAAAE0+FKuK7HxbypvCeEJzMTcjOWE0ScYOlTBMUNlIv55hAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVsACAAAAAAetRiPwDSFWBzpWSWkOKWM6fKStRJ8SyObnpc79ux8p0AAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVsACAAAAAA0G2GD8ZQjDBntjLpW4rqwKRS6HiUjL03g1N6chANozcAAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVsACAAAAAAWMFPNOk3EMSQDS9JGPSMIQP0oNGVugxXKKUrIPPlhHgAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVsACAAAAAAWp4jvretbDEsqEMzP/WLTnwOiJwCtfrCiB6m8k+yEMoAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVsACAAAAAA+lGesNk3+SyB/60rSvdQ2aN2vfJPR7llJVhufGTNhHkAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVsACAAAAAArZ6atJCYrVfHB8dSNPOFf6nnDADBMJcIEj8ljPvxHp8AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVsACAAAAAAR0G2m+uANoWknkr/NerFcG+fECVxNIs0cqbY1t/U/0MAAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVsACAAAAAA3GHaRE2RAcaBRd8VzmYzWeBD2Gmy91eTK1k8YdWObZcAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHBuAAIAAAAQdGYAAQAAAAFtbgAAAAAAAAAAAAFteAAAAAAAAABpQAA=", "subType": "06" } } } }, "u": { "$set": { "encryptedDoublePrecision": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedDoublePrecision", "bsonType": "double", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberDouble": "0.0" }, "max": { "$numberDouble": "200.0" }, "precision": { "$numberInt": "2" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-Int-Aggregate.json000066400000000000000000000433511511661753600352510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Int. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-Int-Correctness.json000066400000000000000000000745431511661753600356640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberInt": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "1" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lt": { "$numberInt": "1" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lte": { "$numberInt": "1" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$lt": { "$numberInt": "0" } } } }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "200" } } } }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" }, "$lt": { "$numberInt": "2" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$numberInt": "0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$numberInt": "1" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberInt": "0" }, "$lte": { "$numberInt": "200" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$in": [ { "$numberInt": "0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Insert out of range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "-1" } } }, "object": "coll", "expectError": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedInt": { "$numberInt": "200" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 200, "encryptedInt": { "$numberInt": "200" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gte": { "$numberInt": "0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "1" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lt": { "$numberInt": "1" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lte": { "$numberInt": "1" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$lt": { "$numberInt": "0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "200" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gt": { "$numberInt": "0" }, "$lt": { "$numberInt": "2" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$numberInt": "0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$numberInt": "1" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$gte": { "$numberInt": "0" }, "$lte": { "$numberInt": "200" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } }, { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedInt": { "$in": [ { "$numberInt": "0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedInt": { "$numberInt": "0" } } ] } ] }, { "description": "Wrong type: Insert Double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberDouble": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberDouble": "0" } } } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Int-Delete.json000066400000000000000000000374441511661753600345730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Int. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-Int-FindOneAndUpdate.json000066400000000000000000000435671511661753600365040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Int. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } }, "update": { "$set": { "encryptedInt": { "$numberInt": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "update": { "$set": { "encryptedInt": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-Int-InsertFind.json000066400000000000000000000427251511661753600354340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Int. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedInt": { "$numberInt": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Int-Update.json000066400000000000000000000441201511661753600346000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Int-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Int. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": { "$numberInt": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedInt": { "$gt": { "$numberInt": "0" } } }, "update": { "$set": { "encryptedInt": { "$numberInt": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedInt": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedInt": { "$gt": { "$binary": { "base64": "DW0FAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAAQbW4AAAAAABBteADIAAAAAA==", "subType": "06" } } } }, "u": { "$set": { "encryptedInt": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-Long-Aggregate.json000066400000000000000000000434201511661753600354130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-Aggregate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Long. Aggregate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "aggregate": "default", "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } } } ], "cursor": {}, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "aggregate" } } ] } ] } ] } fle2v2-Rangev2-Long-Correctness.json000066400000000000000000000750501511661753600360230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-Correctness", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Find with $gt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberLong": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "1" } } } }, "object": "coll", "expectResult": [] } ] }, { "description": "Find with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lt": { "$numberLong": "1" } } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Find with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lte": { "$numberLong": "1" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$lt": { "$numberLong": "0" } } } }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Find with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "200" } } } }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Find with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" }, "$lt": { "$numberLong": "2" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$numberLong": "0" } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$numberLong": "1" } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberLong": "0" }, "$lte": { "$numberLong": "200" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Find with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$in": [ { "$numberLong": "0" } ] } } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Insert out of range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "-1" } } }, "object": "coll", "expectError": { "errorContains": "value must be greater than or equal to the minimum value" } } ] }, { "description": "Insert min and max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 200, "encryptedLong": { "$numberLong": "200" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 200, "encryptedLong": { "$numberLong": "200" } } ] } ] }, { "description": "Aggregate with $gte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gte": { "$numberLong": "0" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $gt with no results", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "1" } } } } ] }, "object": "coll", "expectResult": [] } ] }, { "description": "Aggregate with $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lt": { "$numberLong": "1" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Aggregate with $lte", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lte": { "$numberLong": "1" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $lt below min", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$lt": { "$numberLong": "0" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be greater than the range minimum" } } ] }, { "description": "Aggregate with $gt above max", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "200" } } } } ] }, "object": "coll", "expectError": { "errorContains": "must be less than the range maximum" } } ] }, { "description": "Aggregate with $gt and $lt", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gt": { "$numberLong": "0" }, "$lt": { "$numberLong": "2" } } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with equality", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$numberLong": "0" } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$numberLong": "1" } } } ] }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with full range", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$gte": { "$numberLong": "0" }, "$lte": { "$numberLong": "200" } } } }, { "$sort": { "_id": 1 } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } }, { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] } ] }, { "description": "Aggregate with $in", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "encryptedLong": { "$in": [ { "$numberLong": "0" } ] } } } ] }, "object": "coll", "expectResult": [ { "_id": 0, "encryptedLong": { "$numberLong": "0" } } ] } ] }, { "description": "Wrong type: Insert Double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberDouble": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "operations": [ { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gte": { "$numberDouble": "0" } } } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } fle2v2-Rangev2-Long-Delete.json000066400000000000000000000375101511661753600347320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-Delete", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Long. Delete.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "deleteOne", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "object": "coll", "expectResult": { "deletedCount": 1 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "delete": "default", "deletes": [ { "q": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "limit": 1 } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "delete" } } ] } ] } ] } fle2v2-Rangev2-Long-FindOneAndUpdate.json000066400000000000000000000436411511661753600366420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-FindOneAndUpdate", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Long. FindOneAndUpdate.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "findOneAndUpdate", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } }, "update": { "$set": { "encryptedLong": { "$numberLong": "2" } } }, "returnDocument": "Before" }, "object": "coll", "expectResult": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "findAndModify": "default", "query": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "update": { "$set": { "encryptedLong": { "$$type": "binData" } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "findAndModify" } } ] } ] } ] } fle2v2-Rangev2-Long-InsertFind.json000066400000000000000000000427741511661753600356050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-InsertFind", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Long. Insert and Find.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } } }, "object": "coll", "expectResult": [ { "_id": 1, "encryptedLong": { "$numberLong": "1" } } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=", "subType": "00" } }, { "$binary": { "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=", "subType": "00" } }, { "$binary": { "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=", "subType": "00" } }, { "$binary": { "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=", "subType": "00" } }, { "$binary": { "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=", "subType": "00" } }, { "$binary": { "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=", "subType": "00" } }, { "$binary": { "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=", "subType": "00" } }, { "$binary": { "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "find" } } ] } ] } ] } fle2v2-Rangev2-Long-Update.json000066400000000000000000000441701511661753600347520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-Long-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "FLE2 Range Long. Update.", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedLong": { "$numberLong": "0" } } }, "object": "coll" }, { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedLong": { "$numberLong": "1" } } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedLong": { "$gt": { "$numberLong": "0" } } }, "update": { "$set": { "encryptedLong": { "$numberLong": "2" } } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 0, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=", "subType": "00" } }, { "$binary": { "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=", "subType": "00" } }, { "$binary": { "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=", "subType": "00" } }, { "$binary": { "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=", "subType": "00" } }, { "$binary": { "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=", "subType": "00" } }, { "$binary": { "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=", "subType": "00" } }, { "$binary": { "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=", "subType": "00" } }, { "$binary": { "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=", "subType": "00" } } ] }, { "_id": 1, "encryptedLong": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=", "subType": "00" } }, { "$binary": { "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=", "subType": "00" } }, { "$binary": { "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=", "subType": "00" } }, { "$binary": { "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=", "subType": "00" } }, { "$binary": { "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=", "subType": "00" } }, { "$binary": { "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=", "subType": "00" } }, { "$binary": { "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=", "subType": "00" } }, { "$binary": { "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 0, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedLong": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "ordered": true, "updates": [ { "q": { "encryptedLong": { "$gt": { "$binary": { "base64": "DXUFAAADcGF5bG9hZAAZBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVsACAAAAAA+MFEd8XfZSpbXKqqPC2L3TEFswkaG5Ff6aSgf8p+XVIAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWwAIAAAAABNPhSriux8W8qbwnhCczE3IzlhNEnGDpUwTFDZSL+eYQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFbAAgAAAAAHrUYj8A0hVgc6VklpDiljOnykrUSfEsjm56XO/bsfKdAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVsACAAAAAAIHYXP8RLcCboUmHN3+OlnEw1DxaLSnbTB9PdF228fFAAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWwAIAAAAADQbYYPxlCMMGe2MulbiurApFLoeJSMvTeDU3pyEA2jNwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFbAAgAAAAAFjBTzTpNxDEkA0vSRj0jCED9KDRlboMVyilKyDz5YR4AAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVsACAAAAAAWbp8JVJnx8fEVAJFa7WMfMa7wXeP5M3C8MX20J/i9n0AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWwAIAAAAAA9/YU9eI3D7QbXKIw/3/gzWJ6MZrCYhG0j1wNKgRQp5wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FbAAgAAAAAA9EsxoV1B2DcQ1NJRwuxXnvVR+vkD0wbbDYEI/zFEnDAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVsACAAAAAA+W0+zgLr85/PD7P9a94wk6MgNgrizx/XU9aCxAkp1IwAABJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAEnNwAAEAAAAAAAAAEHRmAAEAAAASbW4AAAAAAAAAAAASbXgAyAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedLong": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedLong", "bsonType": "long", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberInt": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberLong": "0" }, "max": { "$numberLong": "200" } } } ] } } }, "$db": "default" }, "commandName": "update" } } ] } ] } ] } fle2v2-Rangev2-WrongType.json000066400000000000000000000112161511661753600345640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-Rangev2-WrongType", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "8.0.0", "maxServerVersion": "8.99.99", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "range", "contention": { "$numberLong": "0" }, "trimFactor": { "$numberLong": "1" }, "sparsity": { "$numberLong": "1" }, "min": { "$numberInt": "0" }, "max": { "$numberInt": "200" } } } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Wrong type: Insert Double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberDouble": "0" } } }, "object": "coll", "expectError": { "errorContains": "Cannot encrypt element" } } ] }, { "description": "Wrong type: Find Double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 0, "encryptedInt": { "$numberInt": "0" } } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "encryptedInt": { "$gte": { "$numberDouble": "0" } } }, "sort": { "_id": 1 } }, "object": "coll", "expectError": { "errorContains": "field type is not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/fle2v2-Update.json000066400000000000000000000451221511661753600326300ustar00rootroot00000000000000{ "description": "fle2v2-Update", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1648914851981" } }, "updateDate": { "$date": { "$numberLong": "1648914851981" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Update can query an FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "foo": "bar" } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "foo": "bar", "__safeContent__": [ { "$binary": { "base64": "ThpoKfQ8AkOzkFfNC1+9PF0pY2nIzfXvRdxQgjkNbBw=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "foo": "bar" } }, "multi": false, "upsert": false } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "update" } } ] } ] }, { "description": "Update can modify an FLE2 indexed field", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedIndexed": "value123" } }, "object": "coll" }, { "name": "updateOne", "arguments": { "filter": { "encryptedIndexed": "value123" }, "update": { "$set": { "encryptedIndexed": "value456" } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "encryptedIndexed": "value456" } ] }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rhe7/w8Ob8Unl44rGr/moScx6m5VODQnscDhF4Nkn6g=", "subType": "00" } } ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encryptedIndexed": { "$$type": "binData" } } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encryptedIndexed": { "$eq": { "$binary": { "base64": "DIkAAAAFZAAgAAAAAPtVteJQAlgb2YMa/+7YWH00sbQPyt7L6Rb8OwBdMmL2BXMAIAAAAAAd44hgVKnEnTFlwNVC14oyc9OZOTspeymusqkRQj57nAVsACAAAAAAaZ9s3G+4znfxStxeOZwcZy1OhzjMGc5hjmdMN+b/w6kSY20AAAAAAAAAAAAA", "subType": "06" } } } }, "u": { "$set": { "encryptedIndexed": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "ordered": true, "encryptionInformation": { "type": 1, "schema": { "default.default": { "escCollection": "enxcol_.default.esc", "ecocCollection": "enxcol_.default.ecoc", "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } } }, "commandName": "update" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": { "$eq": 1 } } }, "commandName": "find" } } ] } ] } ] } fle2v2-validatorAndPartialFieldExpression.json000066400000000000000000000171251511661753600403020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "fle2v2-validatorAndPartialFieldExpression", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } }, "encryptedFieldsMap": { "default.encryptedCollection": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedIndexed", "bsonType": "string", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } }, { "keyId": { "$binary": { "base64": "q83vqxI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedUnindexed", "bsonType": "string" } ] } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] } ], "tests": [ { "description": "create with a validator on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "coll", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } } ] }, { "description": "create with a validator on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection", "validator": { "encryptedIndexed": "foo" } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "collMod with a validator on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "collMod", "command": { "collMod": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } } } ] }, { "description": "collMod with a validator on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "collMod", "command": { "collMod": "encryptedCollection", "validator": { "encryptedIndexed": "foo" } } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "createIndexes with a partialFilterExpression on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "createIndexes", "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "unencrypted_string": "foo" } } ] } } }, { "name": "assertIndexExists", "object": "coll", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "name" } } ] }, { "description": "createIndexes with a partialFilterExpression on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "createIndexes", "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "encryptedIndexed": "foo" } } ] } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/gcpKMS.json000066400000000000000000000200511511661753600314260ustar00rootroot00000000000000{ "description": "gcpKMS", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip_delegated": { "encrypt": { "keyId": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "CiQAIgLj0WyktnB4dfYHo5SLZ41K4ASQrjJUaSzl5vvVH0G12G0SiQEAjlV8XPlbnHDEDFbdTO4QIe8ER2/172U1ouLazG0ysDtFFIlSvWX5ZnZUrRMmp/R2aJkzLXEt/zf8Mn4Lfm+itnjgo5R9K4pmPNvvPKNZX5C16lrPT+aA+rd+zXFSmlMg3i5jnxvTdLHhg3G7Q/Uv1ZIJskKt95bzLoe0tUVzRWMYXLIEcohnQg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1601574333107" } }, "updateDate": { "$date": { "$numberLong": "1601574333107" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyAltNames": [ "altname", "gcp_altname" ] } ] } ], "tests": [ { "description": "Insert a document with auto encryption using GCP KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_gcp": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string_gcp": { "$binary": { "base64": "ARgj/gAAAAAAAAAAAAAAAAACwFd+Y5Ojw45GUXNvbcIpN9YkRdoHDHkR4kssdn0tIMKlDQOLFkWFY9X07IRlXsxPD8DcTiKnl6XINK28vhcGlg==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_gcp": { "$binary": { "base64": "ARgj/gAAAAAAAAAAAAAAAAACwFd+Y5Ojw45GUXNvbcIpN9YkRdoHDHkR4kssdn0tIMKlDQOLFkWFY9X07IRlXsxPD8DcTiKnl6XINK28vhcGlg==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/getKey.json000066400000000000000000000210301511661753600315300ustar00rootroot00000000000000{ "description": "getKey", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "get non-existent data key", "operations": [ { "name": "getKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "AAAzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "_id": { "$binary": { "base64": "AAAzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "get existing AWS data key", "operations": [ { "name": "getKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "expectResult": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } } }, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "get existing local data key", "operations": [ { "name": "getKey", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "readConcern": { "level": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/getKeyByAltName.json000066400000000000000000000173341511661753600333010ustar00rootroot00000000000000{ "description": "getKeyByAltName", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "get non-existent data key", "operations": [ { "name": "getKeyByAltName", "object": "clientEncryption0", "arguments": { "keyAltName": "does_not_exist" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": "does_not_exist" }, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "get existing AWS data key", "operations": [ { "name": "getKeyByAltName", "object": "clientEncryption0", "arguments": { "keyAltName": "aws_key" }, "expectResult": { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": "aws_key" }, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "get existing local data key", "operations": [ { "name": "getKeyByAltName", "object": "clientEncryption0", "arguments": { "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": "local_key" }, "readConcern": { "level": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/getKeys.json000066400000000000000000000134221511661753600317210ustar00rootroot00000000000000{ "description": "getKeys", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [] } ], "tests": [ { "description": "getKeys with zero key documents", "operations": [ { "name": "getKeys", "object": "clientEncryption0", "expectResult": [] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "getKeys with single key documents", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local", "opts": { "keyAltNames": [ "abc" ] } }, "expectResult": { "$$type": "binData" } }, { "name": "getKeys", "object": "clientEncryption0", "expectResult": [ { "_id": { "$$type": "binData" }, "keyAltNames": [ "abc" ], "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "getKeys with many key documents", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local" }, "expectResult": { "$$type": "binData" } }, { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local" }, "expectResult": { "$$type": "binData" } }, { "name": "getKeys", "object": "clientEncryption0", "expectResult": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } }, { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$type": "int" }, "masterKey": { "$$type": "object" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/getMore.json000066400000000000000000000214171511661753600317130ustar00rootroot00000000000000{ "description": "getMore", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "getMore with encryption", "operations": [ { "name": "find", "arguments": { "batchSize": 2, "filter": {} }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" }, { "_id": 2, "encrypted_string": "string1" }, { "_id": 3, "encrypted_string": "string2" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "default", "batchSize": 2 }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "default", "batchSize": 2 }, "commandName": "getMore" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/insert.json000066400000000000000000000271601511661753600316160ustar00rootroot00000000000000{ "description": "insert", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "insertOne with encryption", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } }, "object": "coll" }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "insertMany with encryption", "operations": [ { "name": "insertMany", "arguments": { "documents": [ { "_id": 1, "encrypted_string": "string0", "random": "abc" }, { "_id": 2, "encrypted_string": "string1" } ] }, "object": "coll" }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/keyAltName.json000066400000000000000000000171701511661753600323440ustar00rootroot00000000000000{ "description": "keyAltName", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Insert with encryption using key alt name", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_w_altname": "string0", "altname": "altname" } }, "object": "coll" }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_w_altname": { "$$type": "binData" }, "altname": "altname" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [] } }, { "keyAltNames": { "$in": [ "altname" ] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_w_altname": { "$$type": "binData" }, "altname": "altname" } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Replace with key alt name fails", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "encrypted_w_altname": "string0" } }, "upsert": true }, "object": "coll", "expectError": { "errorContains": "A non-static (JSONPointer) keyId is not supported" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/keyCache.json000066400000000000000000000122331511661753600320210ustar00rootroot00000000000000{ "description": "keyCache-explicit", "schemaVersion": "1.22", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "OCTP9uKPPmvuqpHlqq83gPk4U6rUPxKVRRyVtrjFmVjdoa4Xzm1SzUbr7aIhNI42czkUBmrCtZKF31eaaJnxEBkqf0RFukA9Mo3NEHQWgAQ2cn9duOcRbaFUQo2z0/rB" } }, "keyExpirationMS": 1 } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "a+YWzdygTAG62/cNUkqZiQ==", "subType": "04" } }, "keyAltNames": [], "keyMaterial": { "$binary": { "base64": "iocBkhO3YBokiJ+FtxDTS71/qKXQ7tSWhWbcnFTXBcMjarsepvALeJ5li+SdUd9ePuatjidxAdMo7vh1V2ZESLMkQWdpPJ9PaJjA67gKQKbbbB4Ik5F2uKjULvrMBnFNVRMup4JNUwWFQJpqbfMveXnUVcD06+pUpAkml/f+DSXrV3e5rxciiNVtz03dAG8wJrsKsFXWj6vTjFhsfknyBA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "decrypt, wait, and decrypt again", "operations": [ { "name": "decrypt", "object": "clientEncryption0", "arguments": { "value": { "$binary": { "base64": "AWvmFs3coEwButv3DVJKmYkCJ6lUzRX9R28WNlw5uyndb+8gurA+p8q14s7GZ04K2ZvghieRlAr5UwZbow3PMq27u5EIhDDczwBFcbdP1amllw==", "subType": "06" } } }, "expectResult": "foobar" }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 50 } }, { "name": "decrypt", "object": "clientEncryption0", "arguments": { "value": { "$binary": { "base64": "AWvmFs3coEwButv3DVJKmYkCJ6lUzRX9R28WNlw5uyndb+8gurA+p8q14s7GZ04K2ZvghieRlAr5UwZbow3PMq27u5EIhDDczwBFcbdP1amllw==", "subType": "06" } } }, "expectResult": "foobar" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "a+YWzdygTAG62/cNUkqZiQ==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "a+YWzdygTAG62/cNUkqZiQ==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/kmipKMS.json000066400000000000000000000267541511661753600316350ustar00rootroot00000000000000{ "description": "kmipKMS", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "kmip": { "endpoint": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_string_aws": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_azure": { "encrypt": { "keyId": [ { "$binary": { "base64": "AZURE+AAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_gcp": { "encrypt": { "keyId": [ { "$binary": { "base64": "GCP+AAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_local": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip": { "encrypt": { "keyId": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "encrypted_string_kmip_delegated": { "encrypt": { "keyId": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "eUYDyB0HuWb+lQgUwO+6qJQyTTDTY2gp9FbemL7ZFo0pvr0x6rm6Ff9OVUTGH6HyMKipaeHdiIJU1dzsLwvqKvi7Beh+U4iaIWX/K0oEg1GOsJc0+Z/in8gNHbGUYLmycHViM3LES3kdt7FdFSUl5rEBHrM71yoNEXImz17QJWMGOuT4x6yoi2pvnaRJwfrI4DjpmnnTrDMac92jgZehbg==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1634220190041" } }, "updateDate": { "$date": { "$numberLong": "1634220190041" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "kmip", "keyId": "1" }, "keyAltNames": [ "altname", "kmip_altname" ] }, { "_id": { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" }, "keyMaterial": { "$binary": { "base64": "5TLMFWlguBWe5GUESTvOVtkdBsCrynhnV72XRyZ66/nk+EP9/1oEp1t1sg0+vwCTqULHjBiUE6DRx2mYD/Eup1+u2Jgz9/+1sV1drXeOPALNPkSgiZiDbIb67zRi+wTABEcKcegJH+FhmSGxwUoQAiHCsCbcvia5P8tN1lt98YQ=", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1634220190041" } }, "updateDate": { "$date": { "$numberLong": "1634220190041" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "kmip", "delegated": true, "keyId": "11" }, "keyAltNames": [ "delegated" ] } ] } ], "tests": [ { "description": "Insert a document with auto encryption using KMIP KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_kmip": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string_kmip": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6UCKCwtKFIsL8eKObDVxvqGupJNUk7kXswHhB7G5j/C1D+6no+Asra0KgSU43bTL3ooIBLVyIzbV5CDJYqzAsa4WQ==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "dBHpr8aITfeBQ15grpbLpQ==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_kmip": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6UCKCwtKFIsL8eKObDVxvqGupJNUk7kXswHhB7G5j/C1D+6no+Asra0KgSU43bTL3ooIBLVyIzbV5CDJYqzAsa4WQ==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] }, { "description": "Insert a document with auto encryption using KMIP delegated KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string_kmip_delegated": "string0" } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string_kmip_delegated": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6YCkB+8NVfAAjIbvLqyXIg6g1a8tXrym92DPoqmxpcdQyH0vQM3aFNMz7tZwQBimKs29ztZV/LWjM633HhO5ACl9A==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba6" } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string_kmip_delegated": { "$binary": { "base64": "AXQR6a/GiE33gUNeYK6Wy6YCkB+8NVfAAjIbvLqyXIg6g1a8tXrym92DPoqmxpcdQyH0vQM3aFNMz7tZwQBimKs29ztZV/LWjM633HhO5ACl9A==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/localKMS.json000066400000000000000000000154031511661753600317540ustar00rootroot00000000000000{ "description": "localKMS", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "Ce9HSz/HKKGkIt4uyy+jDuKGA+rLC2cycykMo6vc8jXxqa1UVDYHWq1r+vZKbnnSRBfB981akzRKZCFpC05CTyFqDhXv6OnMjpG97OZEREGIsHEYiJkBW0jJJvfLLgeLsEpBzsro9FztGGXASxyxFRZFhXvHxyiLOKrdWfs7X1O/iK3pEoHMx6uSNSfUOgbebLfIqW7TO++iQS5g1xovXA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "Insert a document with auto encryption using local KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } }, "object": "coll" }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACV/+zJmpqMU47yxS/xIVAviGi7wHDuFwaULAixEAoIh0xHz73UYOM3D8D44gcJn67EROjbz4ITpYzzlCJovDL0Q==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault" }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACV/+zJmpqMU47yxS/xIVAviGi7wHDuFwaULAixEAoIh0xHz73UYOM3D8D44gcJn67EROjbz4ITpYzzlCJovDL0Q==", "subType": "06" } }, "random": { "$$type": "binData" } } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/localSchema.json000066400000000000000000000217221511661753600325230ustar00rootroot00000000000000{ "description": "localSchema", "schemaVersion": "1.23", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "OyQRAeK7QlWMr0E2xWapYg==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "OyQRAeK7QlWMr0E2xWapYg==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "OyQRAeK7QlWMr0E2xWapYg==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "client": { "id": "client1", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "test": { "bsonType": "string" } }, "bsonType": "object", "required": [ "test" ] } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "encryptedDB", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "encryptedColl", "database": "encryptedDB", "collectionName": "default" } }, { "database": { "id": "encryptedDB2", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "encryptedColl2", "database": "encryptedDB2", "collectionName": "default" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "OyQRAeK7QlWMr0E2xWapYg==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] }, { "databaseName": "default", "collectionName": "default", "documents": [] } ], "tests": [ { "description": "A local schema should override", "operations": [ { "object": "encryptedColl", "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } } }, { "object": "encryptedColl", "name": "find", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "commandName": "find", "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "OyQRAeK7QlWMr0E2xWapYg==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "ATskEQHiu0JVjK9BNsVmqWIClDjVEWlpmVRN76InSQuFW2piVbYFkh0QhZCKyx9DdvFBUG+FWluh0kXyhdq3b2Vt/nqNWjXn2y0+JPhrc4W+wQ==", "subType": "06" } } } ], "ordered": true } } }, { "commandStartedEvent": { "commandName": "find", "command": { "find": "default", "filter": { "_id": 1 } } } } ] } ], "outcome": [ { "collectionName": "default", "databaseName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "ATskEQHiu0JVjK9BNsVmqWIClDjVEWlpmVRN76InSQuFW2piVbYFkh0QhZCKyx9DdvFBUG+FWluh0kXyhdq3b2Vt/nqNWjXn2y0+JPhrc4W+wQ==", "subType": "06" } } } ] } ] }, { "description": "A local schema with no encryption is an error", "operations": [ { "object": "encryptedColl2", "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "expectError": { "isError": true, "errorContains": "JSON schema keyword 'required' is only allowed with a remote schema" } } ] } ] } malformedCiphertext.json000066400000000000000000000143461511661753600342430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "malformedCiphertext", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "00" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQ==", "subType": "06" } } }, { "_id": 3, "encrypted_string": { "$binary": { "base64": "AQAAa2V2aW4gYWxiZXJ0c29uCg==", "subType": "06" } } } ] }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Wrong subtype", "operations": [ { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "00" } } } ] } ] }, { "description": "Empty data", "operations": [ { "name": "find", "arguments": { "filter": { "_id": 2 } }, "object": "coll", "expectError": { "errorContains": "malformed ciphertext" } } ] }, { "description": "Malformed data", "operations": [ { "name": "find", "arguments": { "filter": { "_id": 3 } }, "object": "coll", "expectError": { "errorContains": "not all keys requested were satisfied" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/maxWireVersion.json000066400000000000000000000052711511661753600332730ustar00rootroot00000000000000{ "description": "maxWireVersion", "schemaVersion": "1.23", "runOnRequirements": [ { "maxServerVersion": "4.0.99", "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } }, "extraOptions": { "mongocryptdBypassSpawn": true } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "default" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "operation fails with maxWireVersion < 8", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "encrypted_string": "string0" } }, "expectError": { "errorContains": "Auto-encryption requires a minimum MongoDB version of 4.2" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/missingKey.json000066400000000000000000000142641511661753600324350ustar00rootroot00000000000000{ "description": "missingKey", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.different", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "Insert with encryption on a missing key", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0", "random": "abc" } }, "object": "coll", "expectError": { "errorContains": "not all keys requested were satisfied" } } ], "outcome": [ { "documents": [], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "different", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } } ] } ] } ] } namedKMS-createDataKey.json000066400000000000000000000247451511661753600344040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "namedKMS-createDataKey", "schemaVersion": "1.18", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws:name1": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure:name1": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp:name1": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip:name1": { "endpoint": { "$$placeholder": 1 } }, "local:name1": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [] } ], "tests": [ { "description": "create data key with named AWS KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "aws:name1", "opts": { "masterKey": { "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with named Azure KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "azure:name1", "opts": { "masterKey": { "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with named GCP KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "gcp:name1", "opts": { "masterKey": { "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with named KMIP KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "kmip:name1" }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "kmip:name1", "keyId": { "$$type": "string" } } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "create datakey with named local KMS provider", "operations": [ { "name": "createDataKey", "object": "clientEncryption0", "arguments": { "kmsProvider": "local:name1" }, "expectResult": { "$$type": "binData" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "insert": "datakeys", "documents": [ { "_id": { "$$type": "binData" }, "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": { "$$exists": true }, "masterKey": { "provider": "local:name1" } } ], "writeConcern": { "w": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/namedKMS-explicit.json000066400000000000000000000064321511661753600335670ustar00rootroot00000000000000{ "description": "namedKMS-explicit", "schemaVersion": "1.18", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local:name2": { "key": "local+name2+YUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } }, "keyAltNames": [ "local:name2" ], "keyMaterial": { "$binary": { "base64": "DX3iUuOlBsx6wBX9UZ3v/qXk1HNeBace2J+h/JwsDdF/vmSXLZ1l1VmZYIcpVFy6ODhdbzLjd4pNgg9wcm4etYig62KNkmtZ0/s1tAL5VsuW/s7/3PYnYGznZTFhLjIVcOH/RNoRj2eQb/sRTyivL85wePEpAU/JzuBj6qO9Y5txQgs1k0J3aNy10R9aQ8kC1NuSSpLAIXwE6DlNDDJXhw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local:name2" } } ] } ], "tests": [ { "description": "can explicitly encrypt with a named KMS provider", "operations": [ { "name": "encrypt", "object": "clientEncryption0", "arguments": { "value": "foobar", "opts": { "keyAltName": "local:name2", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "expectResult": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC4yX2LTAuN253GAkEO2ZXp4GpCyM7yoVNJMQQl+6uzxMs03IprLC7DL2vr18x9LwOimjTS9YbMJhrnFkEPuNhbg==", "subType": "06" } } } ] }, { "description": "can explicitly decrypt with a named KMS provider", "operations": [ { "name": "decrypt", "object": "clientEncryption0", "arguments": { "value": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC4yX2LTAuN253GAkEO2ZXp4GpCyM7yoVNJMQQl+6uzxMs03IprLC7DL2vr18x9LwOimjTS9YbMJhrnFkEPuNhbg==", "subType": "06" } } }, "expectResult": "foobar" } ] } ] } namedKMS-rewrapManyDataKey.json000066400000000000000000001243721511661753600352630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "namedKMS-rewrapManyDataKey", "schemaVersion": "1.18", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws:name1": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure:name1": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp:name1": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip:name1": { "endpoint": { "$$placeholder": 1 } }, "local:name1": { "key": { "$$placeholder": 1 } }, "local:name2": { "key": "local+name2+YUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" }, "aws:name2": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws:name1_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "YXp1cmVhenVyZWF6dXJlYQ==", "subType": "04" } }, "keyAltNames": [ "azure:name1_key" ], "keyMaterial": { "$binary": { "base64": "pr01l7qDygUkFE/0peFwpnNlv3iIy8zrQK38Q9i12UCN2jwZHDmfyx8wokiIKMb9kAleeY+vnt3Cf1MKu9kcDmI+KxbNDd+V3ytAAGzOVLDJr77CiWjF9f8ntkXRHrAY9WwnVDANYkDwXlyU0Y2GQFTiW65jiQhUtYLYH63Tk48SsJuQvnWw1Q+PzY8ga+QeVec8wbcThwtm+r2IHsCFnc72Gv73qq7weISw+O4mN08z3wOp5FOS2ZM3MK7tBGmPdBcktW7F8ODGsOQ1FU53OrWUnyX2aTi2ftFFFMWVHqQo7EYuBZHru8RRODNKMyQk0BFfKovAeTAVRv9WH9QU7g==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } }, { "_id": { "$binary": { "base64": "Z2NwZ2NwZ2NwZ2NwZ2NwZw==", "subType": "04" } }, "keyAltNames": [ "gcp:name1_key" ], "keyMaterial": { "$binary": { "base64": "CiQAIgLj0USbQtof/pYRLQO96yg/JEtZbD1UxKueaC37yzT5tTkSiQEAhClWB5ZCSgzHgxv8raWjNB4r7e8ePGdsmSuYTYmLC5oHHS/BdQisConzNKFaobEQZHamTCjyhy5NotKF8MWoo+dyfQApwI29+vAGyrUIQCXzKwRnNdNQ+lb3vJtS5bqvLTvSxKHpVca2kqyC9nhonV+u4qru5Q2bAqUgVFc8fL4pBuvlowZFTQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } }, { "_id": { "$binary": { "base64": "a21pcGttaXBrbWlwa21pcA==", "subType": "04" } }, "keyAltNames": [ "kmip:name1_key" ], "keyMaterial": { "$binary": { "base64": "CklVctHzke4mcytd0TxGqvepkdkQN8NUF4+jV7aZQITAKdz6WjdDpq3lMt9nSzWGG2vAEfvRb3mFEVjV57qqGqxjq2751gmiMRHXz0btStbIK3mQ5xbY9kdye4tsixlCryEwQONr96gwlwKKI9Nubl9/8+uRF6tgYjje7Q7OjauEf1SrJwKcoQ3WwnjZmEqAug0kImCpJ/irhdqPzivRiA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "kmip:name1", "keyId": "1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local:name1_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local:name1" } } ] } ], "tests": [ { "description": "rewrap to aws:name1", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "aws:name1_key" } }, "opts": { "provider": "aws:name1", "masterKey": { "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "aws:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws:name1", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap to azure:name1", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "azure:name1_key" } }, "opts": { "provider": "azure:name1", "masterKey": { "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "azure:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure:name1", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap to gcp:name1", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "gcp:name1_key" } }, "opts": { "provider": "gcp:name1", "masterKey": { "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "gcp:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp:name1", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap to kmip:name1", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "kmip:name1_key" } }, "opts": { "provider": "kmip:name1" } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "kmip:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip:name1", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip:name1", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip:name1", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip:name1", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap to local:name1", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "local:name1_key" } }, "opts": { "provider": "local:name1" } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "local:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local:name1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local:name1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local:name1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local:name1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap from local:name1 to local:name2", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$eq": "local:name1_key" } }, "opts": { "provider": "local:name2" } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 1, "modifiedCount": 1, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$eq": "local:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local:name2" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap from aws:name1 to aws:name2", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$eq": "aws:name1_key" } }, "opts": { "provider": "aws:name2", "masterKey": { "key": "arn:aws:kms:us-east-1:857654397073:key/0f8468f0-f135-4226-aa0b-bd05c4c30df5", "region": "us-east-1" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 1, "modifiedCount": 1, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$eq": "aws:name1_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws:name2", "key": "arn:aws:kms:us-east-1:857654397073:key/0f8468f0-f135-4226-aa0b-bd05c4c30df5", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/namedKMS.json000066400000000000000000000143051511661753600317460ustar00rootroot00000000000000{ "description": "namedKMS", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local:name2": { "key": "local+name2+YUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "DX3iUuOlBsx6wBX9UZ3v/qXk1HNeBace2J+h/JwsDdF/vmSXLZ1l1VmZYIcpVFy6ODhdbzLjd4pNgg9wcm4etYig62KNkmtZ0/s1tAL5VsuW/s7/3PYnYGznZTFhLjIVcOH/RNoRj2eQb/sRTyivL85wePEpAU/JzuBj6qO9Y5txQgs1k0J3aNy10R9aQ8kC1NuSSpLAIXwE6DlNDDJXhw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "status": { "$numberInt": "0" }, "masterKey": { "provider": "local:name2" } } ] } ], "tests": [ { "description": "Automatically encrypt and decrypt with a named KMS provider", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_string": "string0" } }, "object": "coll" }, { "name": "find", "arguments": { "filter": { "_id": 1 } }, "object": "coll", "expectResult": [ { "_id": 1, "encrypted_string": "string0" } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC07sFvTQ0I4O2U49hpr4HezaK44Ivluzv5ntQBTYHDlAJMLyRMyB6Dl+UGHBgqhHe/Xw+pcT9XdiUoOJYAx9g+w==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "local+name2+AAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AZaHGpfp2pntvgAAAAAAAAAC07sFvTQ0I4O2U49hpr4HezaK44Ivluzv5ntQBTYHDlAJMLyRMyB6Dl+UGHBgqhHe/Xw+pcT9XdiUoOJYAx9g+w==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/noSchema.json000066400000000000000000000045511511661753600320460ustar00rootroot00000000000000{ "description": "noSchema", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "unencrypted" } } ], "initialData": [ { "databaseName": "default", "collectionName": "unencrypted", "documents": [] } ], "tests": [ { "description": "Insert on an unencrypted collection", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } }, "object": "coll" } ], "outcome": [ { "documents": [ { "_id": 1 } ], "collectionName": "unencrypted", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "unencrypted" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "insert": "unencrypted", "documents": [ { "_id": 1 } ], "ordered": true }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/removeKeyAltName.json000066400000000000000000000462261511661753600335260ustar00rootroot00000000000000{ "description": "removeKeyAltName", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "remove keyAltName from non-existent data key", "operations": [ { "name": "removeKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "AAAjYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "does_not_exist" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "AAAjYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": [ { "$set": { "keyAltNames": { "$cond": [ { "$eq": [ "$keyAltNames", [ "does_not_exist" ] ] }, "$$REMOVE", { "$filter": { "input": "$keyAltNames", "cond": { "$ne": [ "$$this", "does_not_exist" ] } } } ] } } } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] }, { "description": "remove non-existent keyAltName from existing data key", "operations": [ { "name": "removeKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "does_not_exist" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": [ { "$set": { "keyAltNames": { "$cond": [ { "$eq": [ "$keyAltNames", [ "does_not_exist" ] ] }, "$$REMOVE", { "$filter": { "input": "$keyAltNames", "cond": { "$ne": [ "$$this", "does_not_exist" ] } } } ] } } } ], "writeConcern": { "w": "majority" } } } } ] } ], "outcome": [ { "collectionName": "datakeys", "databaseName": "keyvault", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ] }, { "description": "remove an existing keyAltName from an existing data key", "operations": [ { "name": "removeKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "alternate_name" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "projection": { "_id": 0, "keyAltNames": 1 } }, "expectResult": [ { "keyAltNames": [ "local_key" ] } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": [ { "$set": { "keyAltNames": { "$cond": [ { "$eq": [ "$keyAltNames", [ "alternate_name" ] ] }, "$$REMOVE", { "$filter": { "input": "$keyAltNames", "cond": { "$ne": [ "$$this", "alternate_name" ] } } } ] } } } ], "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "find" } } ] } ] }, { "description": "remove the last keyAltName from an existing data key", "operations": [ { "name": "removeKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "alternate_name" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "alternate_name", "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } }, { "name": "removeKeyAltName", "object": "clientEncryption0", "arguments": { "id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltName": "local_key" }, "expectResult": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$$type": "binData" }, "creationDate": { "$$type": "date" }, "updateDate": { "$$type": "date" }, "status": 1, "masterKey": { "provider": "local" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": [ { "$set": { "keyAltNames": { "$cond": [ { "$eq": [ "$keyAltNames", [ "alternate_name" ] ] }, "$$REMOVE", { "$filter": { "input": "$keyAltNames", "cond": { "$ne": [ "$$this", "alternate_name" ] } } } ] } } } ], "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "findAndModify": "datakeys", "query": { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } } }, "update": [ { "$set": { "keyAltNames": { "$cond": [ { "$eq": [ "$keyAltNames", [ "local_key" ] ] }, "$$REMOVE", { "$filter": { "input": "$keyAltNames", "cond": { "$ne": [ "$$this", "local_key" ] } } } ] } } } ] } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/replaceOne.json000066400000000000000000000213011511661753600323560ustar00rootroot00000000000000{ "description": "replaceOne", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "replaceOne with encryption", "operations": [ { "name": "replaceOne", "arguments": { "filter": { "encrypted_string": "string0" }, "replacement": { "encrypted_string": "string1", "random": "abc" } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } }, "multi": false, "upsert": false } ], "ordered": true }, "commandName": "update" } } ] } ] } ] } rewrapManyDataKey-decrypt_failure.json000066400000000000000000000076531511661753600370070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "rewrapManyDataKey-decrypt_failure", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip": { "endpoint": { "$$placeholder": 1 } }, "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-2:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-2" } } ] } ], "tests": [ { "description": "rewrap data key that fails during decryption due to invalid masterKey", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": {}, "opts": { "provider": "local" } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] } ] } rewrapManyDataKey-encrypt_failure.json000066400000000000000000000140271511661753600370120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "rewrapManyDataKey-encrypt_failure", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip": { "endpoint": { "$$placeholder": 1 } }, "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] } ], "tests": [ { "description": "rewrap with invalid masterKey for AWS KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": {}, "opts": { "provider": "aws", "masterKey": { "key": "arn:aws:kms:us-east-2:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-2" } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "rewrap with invalid masterKey for Azure KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": {}, "opts": { "provider": "azure", "masterKey": { "keyVaultEndpoint": "invalid-vault-csfle.vault.azure.net", "keyName": "invalid-name-csfle" } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "rewrap with invalid masterKey for GCP KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": {}, "opts": { "provider": "gcp", "masterKey": { "projectId": "devprod-drivers", "location": "global", "keyRing": "invalid-ring-csfle", "keyName": "invalid-name-csfle" } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/rewrapManyDataKey.json000066400000000000000000001660321511661753600337040ustar00rootroot00000000000000{ "description": "rewrapManyDataKey", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip": { "endpoint": { "$$placeholder": 1 } }, "local": { "key": { "$$placeholder": 1 } } } } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "keyvault" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "datakeys" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "keyAltNames": [ "aws_key" ], "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gFXJqbF0Fy872MD7xl56D/2AAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDO7HPisPUlGzaio9vgIBEIB7/Qow46PMh/8JbEUbdXgTGhLfXPE+KIVW7T8s6YEMlGiRvMu7TV0QCIUJlSHPKZxzlJ2iwuz5yXeOag+EdY+eIQ0RKrsJ3b8UTisZYzGjfzZnxUKLzLoeXremtRCm3x47wCuHKd1dhh6FBbYt5TL2tDaj+vL2GBrKat2L", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "YXp1cmVhenVyZWF6dXJlYQ==", "subType": "04" } }, "keyAltNames": [ "azure_key" ], "keyMaterial": { "$binary": { "base64": "pr01l7qDygUkFE/0peFwpnNlv3iIy8zrQK38Q9i12UCN2jwZHDmfyx8wokiIKMb9kAleeY+vnt3Cf1MKu9kcDmI+KxbNDd+V3ytAAGzOVLDJr77CiWjF9f8ntkXRHrAY9WwnVDANYkDwXlyU0Y2GQFTiW65jiQhUtYLYH63Tk48SsJuQvnWw1Q+PzY8ga+QeVec8wbcThwtm+r2IHsCFnc72Gv73qq7weISw+O4mN08z3wOp5FOS2ZM3MK7tBGmPdBcktW7F8ODGsOQ1FU53OrWUnyX2aTi2ftFFFMWVHqQo7EYuBZHru8RRODNKMyQk0BFfKovAeTAVRv9WH9QU7g==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } }, { "_id": { "$binary": { "base64": "Z2NwZ2NwZ2NwZ2NwZ2NwZw==", "subType": "04" } }, "keyAltNames": [ "gcp_key" ], "keyMaterial": { "$binary": { "base64": "CiQAIgLj0USbQtof/pYRLQO96yg/JEtZbD1UxKueaC37yzT5tTkSiQEAhClWB5ZCSgzHgxv8raWjNB4r7e8ePGdsmSuYTYmLC5oHHS/BdQisConzNKFaobEQZHamTCjyhy5NotKF8MWoo+dyfQApwI29+vAGyrUIQCXzKwRnNdNQ+lb3vJtS5bqvLTvSxKHpVca2kqyC9nhonV+u4qru5Q2bAqUgVFc8fL4pBuvlowZFTQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } }, { "_id": { "$binary": { "base64": "a21pcGttaXBrbWlwa21pcA==", "subType": "04" } }, "keyAltNames": [ "kmip_key" ], "keyMaterial": { "$binary": { "base64": "CklVctHzke4mcytd0TxGqvepkdkQN8NUF4+jV7aZQITAKdz6WjdDpq3lMt9nSzWGG2vAEfvRb3mFEVjV57qqGqxjq2751gmiMRHXz0btStbIK3mQ5xbY9kdye4tsixlCryEwQONr96gwlwKKI9Nubl9/8+uRF6tgYjje7Q7OjauEf1SrJwKcoQ3WwnjZmEqAug0kImCpJ/irhdqPzivRiA==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "kmip", "keyId": "1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "keyAltNames": [ "local_key" ], "keyMaterial": { "$binary": { "base64": "ABKBldDEoDW323yejOnIRk6YQmlD9d3eQthd16scKL75nz2LjNL9fgPDZWrFFOlqlhMCFaSrNJfGrFUjYk5JFDO7soG5Syb50k1niJoKg4ilsj0L4mpimFUtTpOr2nzZOeQtvAksEXc7gsFgq8gV7t/U3lsaXPY7I0t42DfSE8EGlPdxRjFdHnxh+OR8h7U9b8Qs5K5UuhgyeyxaBZ1Hgw==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } }, { "_id": { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba5" }, "keyAltNames": [ "kmip_delegated_key" ], "keyMaterial": { "$binary": { "base64": "5TLMFWlguBWe5GUESTvOVtkdBsCrynhnV72XRyZ66/nk+EP9/1oEp1t1sg0+vwCTqULHjBiUE6DRx2mYD/Eup1+u2Jgz9/+1sV1drXeOPALNPkSgiZiDbIb67zRi+wTABEcKcegJH+FhmSGxwUoQAiHCsCbcvia5P8tN1lt98YQ=", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "kmip", "keyId": "11", "delegated": true } } ] } ], "tests": [ { "description": "no keys to rewrap due to no filter matches", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": "no_matching_keys" }, "opts": { "provider": "local" } }, "expectResult": { "bulkWriteResult": { "$$exists": false } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": "no_matching_keys" }, "readConcern": { "level": "majority" } } } } ] } ] }, { "description": "rewrap with new AWS KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "aws_key" } }, "opts": { "provider": "aws", "masterKey": { "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "aws_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/061334ae-07a8-4ceb-a813-8135540e837d", "region": "us-east-1" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with new Azure KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "azure_key" } }, "opts": { "provider": "azure", "masterKey": { "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "azure_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with new GCP KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "gcp_key" } }, "opts": { "provider": "gcp", "masterKey": { "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "gcp_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with new KMIP KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "kmip_key" } }, "opts": { "provider": "kmip" } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "kmip_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with new KMIP delegated KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "kmip_delegated_key" } }, "opts": { "provider": "kmip", "masterKey": { "delegated": true } } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "kmip_delegated_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "delegated": true, "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "delegated": true, "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "delegated": true, "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "delegated": true, "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "kmip", "delegated": true, "keyId": { "$$type": "string" } }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with new local KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": { "keyAltNames": { "$ne": "local_key" } }, "opts": { "provider": "local" } }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 5, "modifiedCount": 5, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": { "keyAltNames": { "$ne": "local_key" } }, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "provider": "local" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } } ] } ] }, { "description": "rewrap with current KMS provider", "operations": [ { "name": "rewrapManyDataKey", "object": "clientEncryption0", "arguments": { "filter": {} }, "expectResult": { "bulkWriteResult": { "insertedCount": 0, "matchedCount": 6, "modifiedCount": 6, "deletedCount": 0, "upsertedCount": 0, "upsertedIds": {}, "insertedIds": { "$$unsetOrMatches": {} } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "projection": { "masterKey": 1 }, "sort": { "keyAltNames": 1 } }, "expectResult": [ { "_id": { "$binary": { "base64": "YXdzYXdzYXdzYXdzYXdzYQ==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" } }, { "_id": { "$binary": { "base64": "YXp1cmVhenVyZWF6dXJlYQ==", "subType": "04" } }, "masterKey": { "provider": "azure", "keyVaultEndpoint": "key-vault-csfle.vault.azure.net", "keyName": "key-name-csfle" } }, { "_id": { "$binary": { "base64": "Z2NwZ2NwZ2NwZ2NwZ2NwZw==", "subType": "04" } }, "masterKey": { "provider": "gcp", "projectId": "devprod-drivers", "location": "global", "keyRing": "key-ring-csfle", "keyName": "key-name-csfle" } }, { "_id": { "$uuid": "7411e9af-c688-4df7-8143-5e60ae96cba5" }, "masterKey": { "provider": "kmip", "keyId": "11", "delegated": true } }, { "_id": { "$binary": { "base64": "a21pcGttaXBrbWlwa21pcA==", "subType": "04" } }, "masterKey": { "provider": "kmip", "keyId": "1" } }, { "_id": { "$binary": { "base64": "bG9jYWxrZXlsb2NhbGtleQ==", "subType": "04" } }, "masterKey": { "provider": "local" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "databaseName": "keyvault", "command": { "find": "datakeys", "filter": {}, "readConcern": { "level": "majority" } } } }, { "commandStartedEvent": { "databaseName": "keyvault", "command": { "update": "datakeys", "ordered": true, "updates": [ { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$$type": "binData" } }, "u": { "$set": { "masterKey": { "$$type": "object" }, "keyMaterial": { "$$type": "binData" } }, "$currentDate": { "updateDate": true } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": "majority" } } } }, { "commandStartedEvent": { "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/types.json000066400000000000000000001616241511661753600314620ustar00rootroot00000000000000{ "description": "types", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_objectId": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "objectId", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db0", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll0", "database": "db0", "collectionName": "default" } }, { "client": { "id": "client1", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_symbol": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "symbol", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db1", "client": "client1", "databaseName": "default" } }, { "collection": { "id": "coll1", "database": "db1", "collectionName": "default" } }, { "client": { "id": "client2", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_int": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "int", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db2", "client": "client2", "databaseName": "default" } }, { "collection": { "id": "coll2", "database": "db2", "collectionName": "default" } }, { "client": { "id": "client3", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_double": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "double", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db3", "client": "client3", "databaseName": "default" } }, { "collection": { "id": "coll3", "database": "db3", "collectionName": "default" } }, { "client": { "id": "client4", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_decimal": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "decimal", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db4", "client": "client4", "databaseName": "default" } }, { "collection": { "id": "coll4", "database": "db4", "collectionName": "default" } }, { "client": { "id": "client5", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_binData": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "binData", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db5", "client": "client5", "databaseName": "default" } }, { "collection": { "id": "coll5", "database": "db5", "collectionName": "default" } }, { "client": { "id": "client6", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_javascript": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "javascript", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db6", "client": "client6", "databaseName": "default" } }, { "collection": { "id": "coll6", "database": "db6", "collectionName": "default" } }, { "client": { "id": "client7", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_javascriptWithScope": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "javascriptWithScope", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db7", "client": "client7", "databaseName": "default" } }, { "collection": { "id": "coll7", "database": "db7", "collectionName": "default" } }, { "client": { "id": "client8", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_object": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "object", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db8", "client": "client8", "databaseName": "default" } }, { "collection": { "id": "coll8", "database": "db8", "collectionName": "default" } }, { "client": { "id": "client9", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_timestamp": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "timestamp", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db9", "client": "client9", "databaseName": "default" } }, { "collection": { "id": "coll9", "database": "db9", "collectionName": "default" } }, { "client": { "id": "client10", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_regex": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "regex", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db10", "client": "client10", "databaseName": "default" } }, { "collection": { "id": "coll10", "database": "db10", "collectionName": "default" } }, { "client": { "id": "client11", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_date": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "date", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db11", "client": "client11", "databaseName": "default" } }, { "collection": { "id": "coll11", "database": "db11", "collectionName": "default" } }, { "client": { "id": "client12", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_minKey": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "minKey", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db12", "client": "client12", "databaseName": "default" } }, { "collection": { "id": "coll12", "database": "db12", "collectionName": "default" } }, { "client": { "id": "client13", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_maxKey": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "maxKey", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db13", "client": "client13", "databaseName": "default" } }, { "collection": { "id": "coll13", "database": "db13", "collectionName": "default" } }, { "client": { "id": "client14", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_undefined": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "undefined", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db14", "client": "client14", "databaseName": "default" } }, { "collection": { "id": "coll14", "database": "db14", "collectionName": "default" } }, { "client": { "id": "client15", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_array": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "array", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db15", "client": "client15", "databaseName": "default" } }, { "collection": { "id": "coll15", "database": "db15", "collectionName": "default" } }, { "client": { "id": "client16", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_bool": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "bool", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db16", "client": "client16", "databaseName": "default" } }, { "collection": { "id": "coll16", "database": "db16", "collectionName": "default" } }, { "client": { "id": "client17", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "schemaMap": { "default.default": { "properties": { "encrypted_null": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "null", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } }, "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db17", "client": "client17", "databaseName": "default" } }, { "collection": { "id": "coll17", "database": "db17", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "type=objectId", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_objectId": { "$oid": "AAAAAAAAAAAAAAAAAAAAAAAA" } } }, "object": "coll0" }, { "name": "find", "object": "coll0", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_objectId": { "$oid": "AAAAAAAAAAAAAAAAAAAAAAAA" } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_objectId": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAHmkTPqvzfHMWpvS1mEsrjOxVQ2dyihEgIFWD5E0eNEsiMBQsC0GuvjdqYRL5DHLFI1vKuGek7EYYp0Qyii/tHqA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_objectId": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAHmkTPqvzfHMWpvS1mEsrjOxVQ2dyihEgIFWD5E0eNEsiMBQsC0GuvjdqYRL5DHLFI1vKuGek7EYYp0Qyii/tHqA==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=symbol", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_symbol": { "$symbol": "test" } } }, "object": "coll1" }, { "name": "find", "object": "coll1", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_symbol": { "$symbol": "test" } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_symbol": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAOOmvDmWjcuKsSCO7U/7t9HJ8eI73B6wduyMbdkvn7n7V4uTJes/j+BTtneSdyG2JHKHGkevWAJSIU2XoO66BSXw==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client1", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_symbol": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAOOmvDmWjcuKsSCO7U/7t9HJ8eI73B6wduyMbdkvn7n7V4uTJes/j+BTtneSdyG2JHKHGkevWAJSIU2XoO66BSXw==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=int", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_int": { "$numberInt": "123" } } }, "object": "coll2" }, { "name": "find", "object": "coll2", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_int": { "$numberInt": "123" } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_int": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAQPNXJVXMEjGZnftMuf2INKufXCtQIRHdw5wTgn6QYt3ejcoAXyiwI4XIUizkpsob494qpt2in4tWeiO7b9zkA8Q==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client2", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_int": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAQPNXJVXMEjGZnftMuf2INKufXCtQIRHdw5wTgn6QYt3ejcoAXyiwI4XIUizkpsob494qpt2in4tWeiO7b9zkA8Q==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=double", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_double": { "$numberDouble": "1.23" } } }, "object": "coll3", "expectError": { "errorContains": "element of type: double" } } ] }, { "description": "type=decimal", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_decimal": { "$numberDecimal": "1.23" } } }, "object": "coll4", "expectError": { "errorContains": "element of type: decimal" } } ] }, { "description": "type=binData", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AAAA", "subType": "00" } } } }, "object": "coll5" }, { "name": "find", "object": "coll5", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AAAA", "subType": "00" } } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAFB/KHZQHaHHo8fctcl7v6kR+sLkJoTRx2cPSSck9ya+nbGROSeFhdhDRHaCzhV78fDEqnMDSVPNi+ZkbaIh46GQ==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client5", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_binData": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAFB/KHZQHaHHo8fctcl7v6kR+sLkJoTRx2cPSSck9ya+nbGROSeFhdhDRHaCzhV78fDEqnMDSVPNi+ZkbaIh46GQ==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=javascript", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_javascript": { "$code": "var x = 1;" } } }, "object": "coll6" }, { "name": "find", "object": "coll6", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_javascript": { "$code": "var x = 1;" } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_javascript": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAANrvMgJkTKWGMc9wt3E2RBR2Hu5gL9p+vIIdHe9FcOm99t1W480/oX1Gnd87ON3B399DuFaxi/aaIiQSo7gTX6Lw==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client6", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_javascript": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAANrvMgJkTKWGMc9wt3E2RBR2Hu5gL9p+vIIdHe9FcOm99t1W480/oX1Gnd87ON3B399DuFaxi/aaIiQSo7gTX6Lw==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=javascriptWithScope", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_javascriptWithScope": { "$code": "var x = 1;", "$scope": {} } } }, "object": "coll7", "expectError": { "errorContains": "element of type: javascriptWithScope" } } ] }, { "description": "type=object", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_object": {} } }, "object": "coll8", "expectError": { "errorContains": "element of type: object" } } ] }, { "description": "type=timestamp", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_timestamp": { "$timestamp": { "t": 123, "i": 456 } } } }, "object": "coll9" }, { "name": "find", "object": "coll9", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_timestamp": { "$timestamp": { "t": 123, "i": 456 } } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_timestamp": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAARJHaM4Gq3MpDTdBasBsEolQaOmxJQU1wsZVaSFAOLpEh1QihDglXI95xemePFMKhg+KNpFg7lw1ChCs2Wn/c26Q==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client9", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_timestamp": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAARJHaM4Gq3MpDTdBasBsEolQaOmxJQU1wsZVaSFAOLpEh1QihDglXI95xemePFMKhg+KNpFg7lw1ChCs2Wn/c26Q==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=regex", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_regex": { "$regularExpression": { "pattern": "test", "options": "" } } } }, "object": "coll10" }, { "name": "find", "object": "coll10", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_regex": { "$regularExpression": { "pattern": "test", "options": "" } } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_regex": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAALVnxM4UqGhqf5eXw6nsS08am3YJrTf1EvjKitT8tyyMAbHsICIU3GUjuC7EBofCHbusvgo7pDyaClGostFz44nA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client10", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_regex": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAALVnxM4UqGhqf5eXw6nsS08am3YJrTf1EvjKitT8tyyMAbHsICIU3GUjuC7EBofCHbusvgo7pDyaClGostFz44nA==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=date", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_date": { "$date": { "$numberLong": "123" } } } }, "object": "coll11" }, { "name": "find", "object": "coll11", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "encrypted_date": { "$date": { "$numberLong": "123" } } } ] } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_date": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAJ5sN7u6l97+DswfKTqZAijSTSOo5htinGKQKUD7pHNJYlLXGOkB4glrCu7ibu0g3344RHQ5yUp4YxMEa8GD+Snw==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client11", "events": [ { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "insert": "default", "documents": [ { "_id": 1, "encrypted_date": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAAJ5sN7u6l97+DswfKTqZAijSTSOo5htinGKQKUD7pHNJYlLXGOkB4glrCu7ibu0g3344RHQ5yUp4YxMEa8GD+Snw==", "subType": "06" } } } ], "ordered": true }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "find": "default", "filter": { "_id": 1 } }, "commandName": "find" } } ] } ] }, { "description": "type=minKey", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_minKey": { "$minKey": 1 } } }, "object": "coll12", "expectError": { "errorContains": "Cannot encrypt element of type: minKey" } } ] }, { "description": "type=maxKey", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_maxKey": { "$maxKey": 1 } } }, "object": "coll13", "expectError": { "errorContains": "Cannot encrypt element of type: maxKey" } } ] }, { "description": "type=undefined", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_undefined": { "$undefined": true } } }, "object": "coll14", "expectError": { "errorContains": "Cannot encrypt element of type: undefined" } } ] }, { "description": "type=array", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_array": [] } }, "object": "coll15", "expectError": { "errorContains": "element of type: array" } } ] }, { "description": "type=bool", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_bool": true } }, "object": "coll16", "expectError": { "errorContains": "element of type: bool" } } ] }, { "description": "type=null", "operations": [ { "name": "insertOne", "arguments": { "document": { "_id": 1, "encrypted_null": true } }, "object": "coll17", "expectError": { "errorContains": "Cannot encrypt element of type: null" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/updateMany.json000066400000000000000000000250721511661753600324210ustar00rootroot00000000000000{ "description": "updateMany", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "updateMany with deterministic encryption", "operations": [ { "name": "updateMany", "arguments": { "filter": { "encrypted_string": { "$in": [ "string0", "string1" ] } }, "update": { "$set": { "encrypted_string": "string2", "random": "abc" } } }, "object": "coll", "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } }, { "_id": 2, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$in": [ { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } }, { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } } ] } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACQ76HWOut3DZtQuV90hp1aaCpZn95vZIaWmn+wrBehcEtcFwyJlBdlyzDzZTWPZCPgiFq72Wvh6Y7VbpU9NAp3A==", "subType": "06" } }, "random": { "$$type": "binData" } } }, "multi": true, "upsert": false } ], "ordered": true }, "commandName": "update" } } ] } ] }, { "description": "updateMany fails when filtering on a random field", "operations": [ { "name": "updateMany", "arguments": { "filter": { "random": "abc" }, "update": { "$set": { "encrypted_string": "string1" } } }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified/updateOne.json000066400000000000000000000345671511661753600322470ustar00rootroot00000000000000{ "description": "updateOne", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "4.1.10", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } }, { "client": { "id": "client_unencrypted" } }, { "database": { "id": "db_unencrypted", "client": "client_unencrypted", "databaseName": "default" } }, { "collection": { "id": "coll_unencrypted", "database": "db_unencrypted", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "createOptions": { "validator": { "$jsonSchema": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } } }, { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "status": 1, "_id": { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } }, "masterKey": { "provider": "aws", "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "region": "us-east-1" }, "updateDate": { "$date": { "$numberLong": "1552949630483" } }, "keyMaterial": { "$binary": { "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1552949630483" } }, "keyAltNames": [ "altname", "another_altname" ] } ] } ], "tests": [ { "description": "updateOne with deterministic encryption", "operations": [ { "name": "updateOne", "arguments": { "filter": { "encrypted_string": "string0" }, "update": { "$set": { "encrypted_string": "string1", "random": "abc" } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "find", "object": "coll_unencrypted", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "find": "datakeys", "filter": { "$or": [ { "_id": { "$in": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ] } }, { "keyAltNames": { "$in": [] } } ] }, "$db": "keyvault", "readConcern": { "level": "majority" } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": { "encrypted_string": { "$eq": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } }, "u": { "$set": { "encrypted_string": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==", "subType": "06" } }, "random": { "$$type": "binData" } } }, "multi": false, "upsert": false } ], "ordered": true }, "commandName": "update" } } ] } ] }, { "description": "updateOne fails when filtering on a random field", "operations": [ { "name": "updateOne", "arguments": { "filter": { "random": "abc" }, "update": { "$set": { "encrypted_string": "string1" } } }, "object": "coll", "expectError": { "errorContains": "Cannot query on fields encrypted with the randomized encryption" } } ] }, { "description": "$unset works with an encrypted field", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$unset": { "encrypted_string": "" } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "documents": [ { "_id": 1 } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": {}, "u": { "$unset": { "encrypted_string": "" } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update" } } ] } ] }, { "description": "$rename works if target value has same encryption options", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$rename": { "encrypted_string": "encrypted_string_equivalent" } } }, "object": "coll", "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "documents": [ { "_id": 1, "encrypted_string_equivalent": { "$binary": { "base64": "AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==", "subType": "06" } } } ], "collectionName": "default", "databaseName": "default" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": "default" } }, "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "update": "default", "updates": [ { "q": {}, "u": { "$rename": { "encrypted_string": "encrypted_string_equivalent" } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update" } } ] } ] }, { "description": "$rename fails if target value has different encryption options", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$rename": { "encrypted_string": "random" } } }, "object": "coll", "expectError": { "errorContains": "$rename between two encrypted fields must have the same metadata or both be unencrypted" } } ] }, { "description": "an invalid update (no $ operators) is validated and errors", "operations": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "encrypted_string": "random" } }, "object": "coll", "expectError": { "errorContains": "" } } ] } ] } validatorAndPartialFieldExpression.json000066400000000000000000000206511511661753600372020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/client_side_encryption/unified{ "description": "validatorAndPartialFieldExpression", "schemaVersion": "1.25", "runOnRequirements": [ { "minServerVersion": "6.0.0", "csfle": { "minLibmongocryptVersion": "1.15.1" } } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } }, "schemaMap": { "default.encryptedCollection": { "properties": { "encrypted_w_altname": { "encrypt": { "keyId": "/altname", "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } }, "random": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, "encrypted_string_equivalent": { "encrypt": { "keyId": [ { "$binary": { "base64": "AAAAAAAAAAAAAAAAAAAAAA==", "subType": "04" } } ], "bsonType": "string", "algorithm": "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, "bsonType": "object" } } }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "db", "client": "client0", "databaseName": "default" } }, { "collection": { "id": "coll", "database": "db", "collectionName": "default" } } ], "initialData": [ { "databaseName": "default", "collectionName": "default", "documents": [] } ], "tests": [ { "description": "create with a validator on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection" } } ] }, { "description": "create with a validator on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection", "validator": { "encrypted_string": "foo" } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "collMod with a validator on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "collMod", "command": { "collMod": "encryptedCollection", "validator": { "unencrypted_string": "foo" } } } } ] }, { "description": "collMod with a validator on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "collMod", "command": { "collMod": "encryptedCollection", "validator": { "encrypted_string": "foo" } } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] }, { "description": "createIndexes with a partialFilterExpression on an unencrypted field is OK", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "createIndexes", "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "unencrypted_string": "foo" } } ] } } }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "default", "collectionName": "encryptedCollection", "indexName": "name" } } ] }, { "description": "createIndexes with a partialFilterExpression on an encrypted field is an error", "operations": [ { "name": "dropCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "createCollection", "object": "db", "arguments": { "collection": "encryptedCollection" } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "createIndexes", "command": { "createIndexes": "encryptedCollection", "indexes": [ { "name": "name", "key": { "name": 1 }, "partialFilterExpression": { "encrypted_string": "foo" } } ] } }, "expectError": { "errorContains": "Comparison to encrypted fields not supported" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management/000077500000000000000000000000001511661753600254775ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management/clustered-indexes.json000066400000000000000000000151741511661753600320310ustar00rootroot00000000000000{ "description": "clustered-indexes", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "5.3", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "ci-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "ci-tests", "documents": [] } ], "tests": [ { "description": "createCollection with clusteredIndex", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "ci-tests", "collectionName": "test" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ci-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } }, "databaseName": "ci-tests" } } ] } ] }, { "description": "listCollections includes clusteredIndex", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } } }, { "name": "listCollections", "object": "database0", "arguments": { "filter": { "name": { "$eq": "test" } } }, "expectResult": [ { "name": "test", "options": { "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index", "v": { "$$type": [ "int", "long" ] } } } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ci-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } }, "databaseName": "ci-tests" } }, { "commandStartedEvent": { "command": { "listCollections": 1, "filter": { "name": { "$eq": "test" } } }, "databaseName": "ci-tests" } } ] } ] }, { "description": "listIndexes returns the index", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } } }, { "name": "listIndexes", "object": "collection0", "expectResult": [ { "key": { "_id": 1 }, "name": "test index", "clustered": true, "unique": true, "v": { "$$type": [ "int", "long" ] } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ci-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "clusteredIndex": { "key": { "_id": 1 }, "unique": true, "name": "test index" } }, "databaseName": "ci-tests" } }, { "commandStartedEvent": { "command": { "listIndexes": "test" }, "databaseName": "ci-tests" } } ] } ] } ] } createCollection-pre_and_post_images.json000066400000000000000000000037671511661753600356070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management{ "description": "createCollection-pre_and_post_images", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "6.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "papi-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "createCollection with changeStreamPreAndPostImages enabled", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "changeStreamPreAndPostImages": { "enabled": true } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "papi-tests", "collectionName": "test" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "papi-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "changeStreamPreAndPostImages": { "enabled": true } }, "databaseName": "papi-tests" } } ] } ] } ] } modifyCollection-errorResponse.json000066400000000000000000000051051511661753600344650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management{ "description": "modifyCollection-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "collMod-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "collMod-tests", "documents": [ { "_id": 1, "x": 1 }, { "_id": 2, "x": 1 } ] } ], "tests": [ { "description": "modifyCollection prepareUnique violations are accessible", "runOnRequirements": [ { "minServerVersion": "5.2" } ], "operations": [ { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 } } }, { "name": "modifyCollection", "object": "database0", "arguments": { "collection": "test", "index": { "keyPattern": { "x": 1 }, "prepareUnique": true } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 1 } }, "expectError": { "errorCode": 11000 } }, { "name": "modifyCollection", "object": "database0", "arguments": { "collection": "test", "index": { "keyPattern": { "x": 1 }, "unique": true } }, "expectError": { "isClientError": false, "errorCode": 359, "errorResponse": { "violations": [ { "ids": [ 1, 2 ] } ] } } } ] } ] } modifyCollection-pre_and_post_images.json000066400000000000000000000047321511661753600356240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management{ "description": "modifyCollection-pre_and_post_images", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "6.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "papi-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "modifyCollection to changeStreamPreAndPostImages enabled", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "changeStreamPreAndPostImages": { "enabled": false } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "papi-tests", "collectionName": "test" } }, { "name": "modifyCollection", "object": "database0", "arguments": { "collection": "test", "changeStreamPreAndPostImages": { "enabled": true } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "papi-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "changeStreamPreAndPostImages": { "enabled": false } } } }, { "commandStartedEvent": { "command": { "collMod": "test", "changeStreamPreAndPostImages": { "enabled": true } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/collection-management/timeseries-collection.json000066400000000000000000000171211511661753600326760ustar00rootroot00000000000000{ "description": "timeseries-collection", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "ts-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "ts-tests", "documents": [] } ], "tests": [ { "description": "createCollection with all options", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "expireAfterSeconds": 604800, "timeseries": { "timeField": "time", "metaField": "meta", "granularity": "minutes" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "ts-tests", "collectionName": "test" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ts-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "expireAfterSeconds": 604800, "timeseries": { "timeField": "time", "metaField": "meta", "granularity": "minutes" } }, "databaseName": "ts-tests" } } ] } ] }, { "description": "insertMany with duplicate ids", "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "expireAfterSeconds": 604800, "timeseries": { "timeField": "time", "metaField": "meta", "granularity": "minutes" } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "ts-tests", "collectionName": "test" } }, { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "time": { "$date": { "$numberLong": "1552949630482" } } }, { "_id": 1, "time": { "$date": { "$numberLong": "1552949630483" } } } ] } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "sort": { "time": 1 } }, "expectResult": [ { "_id": 1, "time": { "$date": { "$numberLong": "1552949630482" } } }, { "_id": 1, "time": { "$date": { "$numberLong": "1552949630483" } } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ts-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "expireAfterSeconds": 604800, "timeseries": { "timeField": "time", "metaField": "meta", "granularity": "minutes" } }, "databaseName": "ts-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1, "time": { "$date": { "$numberLong": "1552949630482" } } }, { "_id": 1, "time": { "$date": { "$numberLong": "1552949630483" } } } ] } } }, { "commandStartedEvent": { "command": { "find": "test", "filter": {}, "sort": { "time": 1 } }, "databaseName": "ts-tests" } } ] } ] }, { "description": "createCollection with bucketing options", "runOnRequirements": [ { "minServerVersion": "7.0" } ], "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "test", "timeseries": { "timeField": "time", "bucketMaxSpanSeconds": 3600, "bucketRoundingSeconds": 3600 } } }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "ts-tests", "collectionName": "test" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test" }, "databaseName": "ts-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "timeseries": { "timeField": "time", "bucketMaxSpanSeconds": 3600, "bucketRoundingSeconds": 3600 } }, "databaseName": "ts-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/000077500000000000000000000000001511661753600272175ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging/000077500000000000000000000000001511661753600306455ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging/command.json000066400000000000000000000121031511661753600331530ustar00rootroot00000000000000{ "description": "command-logging", "schemaVersion": "1.13", "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "collectionName": "logging-tests-collection", "databaseName": "logging-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful command", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "ping", "command": { "$$matchAsDocument": { "$$matchAsRoot": { "ping": 1, "$db": "logging-tests" } } }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "databaseName": "logging-tests", "commandName": "ping", "reply": { "$$type": "string" }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "durationMS": { "$$type": [ "double", "int", "long" ] } } } ] } ] }, { "description": "A failed command", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "find", "command": { "$$type": "string" }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "databaseName": "logging-tests", "commandName": "find", "failure": { "$$exists": true }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "durationMS": { "$$type": [ "double", "int", "long" ] } } } ] } ] } ] } driver-connection-id.json000066400000000000000000000063311511661753600355060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "driver-connection-id", "schemaVersion": "1.13", "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "collectionName": "logging-tests-collection", "databaseName": "logging-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful command", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "ping", "driverConnectionId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "ping", "driverConnectionId": { "$$type": [ "int", "long" ] } } } ] } ] }, { "description": "A failed command", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "find", "driverConnectionId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "find", "driverConnectionId": { "$$type": [ "int", "long" ] } } } ] } ] } ] } no-handshake-messages.json000066400000000000000000000044021511661753600356260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "no-handshake-command-logs", "schemaVersion": "1.13", "tests": [ { "description": "Handshake commands should not generate log messages", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" }, "observeEvents": [ "connectionCreatedEvent", "connectionReadyEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } } ] } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionCreatedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionReadyEvent": {} }, "count": 1 } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "ping" } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "ping" } } ] } ] } ] } no-heartbeat-messages.json000066400000000000000000000041421511661753600356400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "no-heartbeat-command-logs", "schemaVersion": "1.13", "runOnRequirements": [ { "topologies": [ "single", "replicaset", "sharded" ] } ], "tests": [ { "description": "Heartbeat commands should not generate log messages", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": {} }, "count": 1 } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "ping" } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "ping" } } ] } ] } ] } operation-id.json000066400000000000000000000111361511661753600340550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "operation-id", "schemaVersion": "1.13", "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "collectionName": "logging-tests-collection", "databaseName": "logging-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "Successful bulk write command log messages include operationIds", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "x": 1 } } }, { "deleteOne": { "filter": { "x": 1 } } } ] } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "insert", "operationId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "operationId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "delete", "operationId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "delete", "operationId": { "$$type": [ "int", "long" ] } } } ] } ] }, { "description": "Failed bulk write command log message includes operationId", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "updateOne": { "filter": { "x": 1 }, "update": [ { "$invalidOperator": true } ] } } ] }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "update", "operationId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "update", "operationId": { "$$type": [ "int", "long" ] } } } ] } ] } ] } pre-42-server-connection-id.json000066400000000000000000000053231511661753600365300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "pre-42-server-connection-id", "schemaVersion": "1.13", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "databaseName": "logging-server-connection-id-tests", "collectionName": "logging-tests-collection", "documents": [] } ], "tests": [ { "description": "command log messages do not include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "insert", "serverConnectionId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "serverConnectionId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "find", "serverConnectionId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "find", "serverConnectionId": { "$$exists": false } } } ] } ] } ] } redacted-commands.json000066400000000000000000001115331511661753600350370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "redacted-commands", "schemaVersion": "1.13", "runOnRequirements": [ { "minServerVersion": "5.0", "auth": false } ], "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeLogMessages": { "command": "debug" } } }, { "client": { "id": "failPointClient", "useMultipleMongoses": false } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-redaction-tests" } } ], "tests": [ { "description": "authenticate command and resulting server-generated error are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "authenticate", "command": { "authenticate": 1, "mechanism": "MONGODB-X509", "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "db": "$external" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "authenticate", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "authenticate", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to authenticate is not redacted", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "authenticate" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "authenticate", "command": { "authenticate": 1, "mechanism": "MONGODB-X509", "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "authenticate", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "authenticate", "failure": { "$$exists": true } } } ] } ] }, { "description": "saslStart command and resulting server-generated error are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslStart", "command": { "saslStart": 1, "payload": "definitely-invalid-payload", "db": "admin" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "saslStart", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "saslStart", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to saslStart is not redacted", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslStart" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslStart", "command": { "saslStart": 1, "payload": "ZmFrZXNhc2xwYXlsb2Fk", "mechanism": "MONGODB-X509" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "saslStart", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "saslStart", "failure": { "$$exists": true } } } ] } ] }, { "description": "saslContinue command and resulting server-generated error are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslContinue", "command": { "saslContinue": 1, "conversationId": 0, "payload": "definitely-invalid-payload" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "saslContinue", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "saslContinue", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to saslContinue is not redacted", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslContinue", "command": { "saslContinue": 1, "conversationId": 0, "payload": "ZmFrZXNhc2xwYXlsb2Fk" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "saslContinue", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "saslContinue", "failure": { "$$exists": true } } } ] } ] }, { "description": "getnonce command and server reply are redacted", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "getnonce", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "getnonce", "reply": { "$$matchAsDocument": {} } } } ] } ] }, { "description": "network error in response to getnonce is not redacted", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getnonce" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "getnonce", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "getnonce", "failure": { "$$exists": true } } } ] } ] }, { "description": "createUser command and resulting server-generated error are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "createUser", "command": { "createUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "createUser", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "createUser", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to createUser is not redacted", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "createUser" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "createUser", "command": { "createUser": "private", "pwd": "pwd", "roles": [] } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "createUser", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "createUser", "failure": { "$$exists": true } } } ] } ] }, { "description": "updateUser command and resulting server-generated error are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "updateUser", "command": { "updateUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "updateUser", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "updateUser", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to updateUser is not redacted", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "updateUser" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "updateUser", "command": { "updateUser": "private", "pwd": "pwd", "roles": [] } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "updateUser", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "updateUser", "failure": { "$$exists": true } } } ] } ] }, { "description": "copydbgetnonce command and resulting server-generated error are redacted", "runOnRequirements": [ { "maxServerVersion": "3.6.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": "private" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydbgetnonce", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "copydbgetnonce", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to copydbgetnonce is not redacted", "runOnRequirements": [ { "maxServerVersion": "3.6.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "copydbgetnonce" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": "private" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydbgetnonce", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "copydbgetnonce", "failure": { "$$exists": true } } } ] } ] }, { "description": "copydbsaslstart command and resulting server-generated error are redacted", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": "private" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydbsaslstart", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "copydbsaslstart", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to copydbsaslstart is not redacted", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "copydbsaslstart" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": "private" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydbgetnonce", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "copydbgetnonce", "failure": { "$$exists": true } } } ] } ] }, { "description": "copydb command and resulting server-generated error are redacted", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydb", "command": { "copydb": "private" } }, "expectError": { "isClientError": false } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydb", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": true, "data": { "message": "Command failed", "commandName": "copydb", "failure": { "$$exists": true } } } ] } ] }, { "description": "network error in response to copydb is not redacted", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "copydb" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydb", "command": { "copydb": "private" } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "copydb", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "failureIsRedacted": false, "data": { "message": "Command failed", "commandName": "copydb", "failure": { "$$exists": true } } } ] } ] }, { "description": "hello with speculative authenticate command and server reply are redacted", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "hello", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "hello", "reply": { "$$matchAsDocument": {} } } } ] } ] }, { "description": "legacy hello with speculative authenticate command and server reply are redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "ismaster", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "ismaster", "reply": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "isMaster", "command": { "$$matchAsDocument": {} } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "isMaster", "reply": { "$$matchAsDocument": {} } } } ] } ] }, { "description": "hello without speculative authenticate command and server reply are not redacted", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "hello", "command": { "$$matchAsDocument": { "$$matchAsRoot": { "hello": 1 } } } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "hello", "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1, "isWritablePrimary": true } } } } } ] } ] }, { "description": "legacy hello without speculative authenticate command and server reply are not redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "ismaster", "command": { "$$matchAsDocument": { "$$matchAsRoot": { "ismaster": 1 } } } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "ismaster", "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1, "ismaster": true } } } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-redaction-tests", "commandName": "isMaster", "command": { "$$matchAsDocument": { "$$matchAsRoot": { "isMaster": 1 } } } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "isMaster", "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1, "ismaster": true } } } } } ] } ] } ] } server-connection-id.json000066400000000000000000000057221511661753600355240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "server-connection-id", "schemaVersion": "1.13", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "databaseName": "logging-server-connection-id-tests", "collectionName": "logging-tests-collection", "documents": [] } ], "tests": [ { "description": "command log messages include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "insert", "serverConnectionId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "serverConnectionId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "find", "serverConnectionId": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "find", "serverConnectionId": { "$$type": [ "int", "long" ] } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging/service-id.json000066400000000000000000000113651511661753600336000ustar00rootroot00000000000000{ "description": "service-id", "schemaVersion": "1.13", "createEntities": [ { "client": { "id": "client", "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection" } } ], "initialData": [ { "databaseName": "logging-server-connection-id-tests", "collectionName": "logging-tests-collection", "documents": [] } ], "tests": [ { "description": "command log messages include serviceId when in LB mode", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "insert", "serviceId": { "$$type": "string" } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "serviceId": { "$$type": "string" } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "find", "serviceId": { "$$type": "string" } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "find", "serviceId": { "$$type": "string" } } } ] } ] }, { "description": "command log messages omit serviceId when not in LB mode", "runOnRequirements": [ { "topologies": [ "single", "replicaset", "sharded" ] } ], "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "insert", "serviceId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "serviceId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command started", "commandName": "find", "serviceId": { "$$exists": false } } }, { "level": "debug", "component": "command", "data": { "message": "Command failed", "commandName": "find", "serviceId": { "$$exists": false } } } ] } ] } ] } unacknowledged-write.json000066400000000000000000000067231511661753600356130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/logging{ "description": "unacknowledged-write", "schemaVersion": "1.16", "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeLogMessages": { "command": "debug" } } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "logging-tests-collection", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "logging-tests-collection", "databaseName": "logging-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "An unacknowledged write generates a succeeded log message with ok: 1 reply", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } } }, { "name": "find", "object": "collection", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1 }, { "_id": 2 } ] } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "messages": [ { "level": "debug", "component": "command", "data": { "message": "Command started", "databaseName": "logging-tests", "commandName": "insert", "command": { "$$matchAsDocument": { "$$matchAsRoot": { "insert": "logging-tests-collection", "$db": "logging-tests" } } }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "command", "data": { "message": "Command succeeded", "commandName": "insert", "reply": { "$$matchAsDocument": { "ok": 1 } }, "requestId": { "$$type": [ "int", "long" ] }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "durationMS": { "$$type": [ "double", "int", "long" ] } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring/000077500000000000000000000000001511661753600314045ustar00rootroot00000000000000bulkWrite.json000066400000000000000000000067071511661753600342020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "bulkWrite", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "A successful mixed bulk write", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 4, "x": 44 } } }, { "updateOne": { "filter": { "_id": 3 }, "update": { "$set": { "x": 333 } } } } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 4, "x": 44 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 3 }, "u": { "$set": { "x": 333 } }, "upsert": { "$$unsetOrMatches": false }, "multi": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring/command.json000066400000000000000000000031771511661753600337250ustar00rootroot00000000000000{ "description": "command", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful command", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "commandName": "ping", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1 }, "commandName": "ping" } } ] } ] } ] } deleteMany.json000066400000000000000000000067761511661753600343270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "deleteMany", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "A successful deleteMany", "operations": [ { "name": "deleteMany", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 0 } ], "ordered": true }, "commandName": "delete", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 2 }, "commandName": "delete" } } ] } ] }, { "description": "A successful deleteMany with write errors", "operations": [ { "name": "deleteMany", "object": "collection", "arguments": { "filter": { "_id": { "$unsupported": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$unsupported": 1 } }, "limit": 0 } ], "ordered": true }, "commandName": "delete", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "delete" } } ] } ] } ] } deleteOne.json000066400000000000000000000067711511661753600341370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "deleteOne", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "A successful deleteOne", "operations": [ { "name": "deleteOne", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 1 } ], "ordered": true }, "commandName": "delete", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "delete" } } ] } ] }, { "description": "A successful deleteOne with write errors", "operations": [ { "name": "deleteOne", "object": "collection", "arguments": { "filter": { "_id": { "$unsupported": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$unsupported": 1 } }, "limit": 1 } ], "ordered": true }, "commandName": "delete", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "delete" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring/find.json000066400000000000000000000331421511661753600332220ustar00rootroot00000000000000{ "description": "find", "schemaVersion": "1.15", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "_yamlAnchors": { "namespace": "command-monitoring-tests.test" }, "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "A successful find with no options", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": 1 } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with options", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "x": -1 }, "projection": { "_id": 0, "x": 1 }, "skip": 2, "comment": "test", "hint": { "_id": 1 }, "max": { "_id": 6 }, "maxTimeMS": 6000, "min": { "_id": 0 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gt": 1 } }, "sort": { "x": -1 }, "projection": { "_id": 0, "x": 1 }, "skip": 2, "comment": "test", "hint": { "_id": 1 }, "max": { "_id": 6 }, "maxTimeMS": 6000, "min": { "_id": 0 } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "x": 33 }, { "x": 22 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with showRecordId and returnKey", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "showRecordId": true, "returnKey": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "showRecordId": true, "returnKey": true }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with a getMore", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3 }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": { "$$type": [ "int", "long" ] }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "test", "batchSize": 3 }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find event with a getmore and the server kills the cursor (<= 4.4)", "runOnRequirements": [ { "minServerVersion": "3.1", "maxServerVersion": "4.4.99", "topologies": [ "single", "replicaset" ] } ], "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": { "$$type": [ "int", "long" ] }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "test", "batchSize": 1 }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 } ] } }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A failed find event", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "$or": true } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandFailedEvent": { "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] } ] } insertMany.json000066400000000000000000000062661511661753600343630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "insertMany", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful insertMany", "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 2, "x": 22 } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "insert" } } ] } ] }, { "description": "A successful insertMany with write errors", "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1, "x": 11 } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1, "x": 11 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "insert" } } ] } ] } ] } insertOne.json000066400000000000000000000061471511661753600341760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "insertOne", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful insertOne", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "insert" } } ] } ] }, { "description": "A successful insertOne with write errors", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1, "x": 11 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1, "x": 11 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "insert" } } ] } ] } ] } pre-42-server-connection-id.json000066400000000000000000000041761511661753600372740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "pre-42-server-connection-id", "schemaVersion": "1.6", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "server-connection-id-tests", "collectionName": "coll", "documents": [] } ], "tests": [ { "description": "command events do not include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "insert", "hasServerConnectionId": false } }, { "commandSucceededEvent": { "commandName": "insert", "hasServerConnectionId": false } }, { "commandStartedEvent": { "commandName": "find", "hasServerConnectionId": false } }, { "commandFailedEvent": { "commandName": "find", "hasServerConnectionId": false } } ] } ] } ] } redacted-commands.json000066400000000000000000000370751511661753600356060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "redacted-commands", "schemaVersion": "1.5", "runOnRequirements": [ { "minServerVersion": "5.0", "auth": false } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ], "observeSensitiveCommands": true } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } } ], "tests": [ { "description": "authenticate", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "authenticate", "command": { "authenticate": 1, "mechanism": "MONGODB-X509", "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "db": "$external" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "authenticate", "command": { "authenticate": { "$$exists": false }, "mechanism": { "$$exists": false }, "user": { "$$exists": false }, "db": { "$$exists": false } } } } ] } ] }, { "description": "saslStart", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslStart", "command": { "saslStart": 1, "payload": "definitely-invalid-payload", "db": "admin" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "saslStart", "command": { "saslStart": { "$$exists": false }, "payload": { "$$exists": false }, "db": { "$$exists": false } } } } ] } ] }, { "description": "saslContinue", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslContinue", "command": { "saslContinue": 1, "conversationId": 0, "payload": "definitely-invalid-payload" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "saslContinue", "command": { "saslContinue": { "$$exists": false }, "conversationId": { "$$exists": false }, "payload": { "$$exists": false } } } } ] } ] }, { "description": "getnonce", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "getnonce", "command": { "getnonce": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "getnonce", "reply": { "ok": { "$$exists": false }, "nonce": { "$$exists": false } } } } ] } ] }, { "description": "createUser", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "createUser", "command": { "createUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "createUser", "command": { "createUser": { "$$exists": false }, "pwd": { "$$exists": false }, "roles": { "$$exists": false } } } } ] } ] }, { "description": "updateUser", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "updateUser", "command": { "updateUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "updateUser", "command": { "updateUser": { "$$exists": false }, "pwd": { "$$exists": false }, "roles": { "$$exists": false } } } } ] } ] }, { "description": "copydbgetnonce", "runOnRequirements": [ { "maxServerVersion": "3.6.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": { "$$exists": false } } } } ] } ] }, { "description": "copydbsaslstart", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": { "$$exists": false } } } } ] } ] }, { "description": "copydb", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydb", "command": { "copydb": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydb", "command": { "copydb": { "$$exists": false } } } } ] } ] }, { "description": "hello with speculative authenticate", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] } ] }, { "description": "legacy hello with speculative authenticate", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] } ] }, { "description": "hello without speculative authenticate is not redacted", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": 1 } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": true } } } } ] } ] }, { "description": "legacy hello without speculative authenticate is not redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": true } } } } ] } ] } ] } server-connection-id.json000066400000000000000000000041511511661753600362560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "server-connection-id", "schemaVersion": "1.6", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "server-connection-id-tests", "collectionName": "coll", "documents": [] } ], "tests": [ { "description": "command events include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "insert", "hasServerConnectionId": true } }, { "commandSucceededEvent": { "commandName": "insert", "hasServerConnectionId": true } }, { "commandStartedEvent": { "commandName": "find", "hasServerConnectionId": true } }, { "commandFailedEvent": { "commandName": "find", "hasServerConnectionId": true } } ] } ] } ] } unacknowledged-client-bulkWrite.json000066400000000000000000000124071511661753600404400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "unacknowledged-client-bulkWrite", "schemaVersion": "1.7", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ], "uriOptions": { "w": 0 } } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "command-monitoring-tests.test" }, "tests": [ { "description": "A successful mixed client bulkWrite", "operations": [ { "object": "client", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "command-monitoring-tests.test", "document": { "_id": 4, "x": 44 } } }, { "updateOne": { "namespace": "command-monitoring-tests.test", "filter": { "_id": 3 }, "update": { "$set": { "x": 333 } } } } ], "ordered": false }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false }, "insertedCount": { "$$unsetOrMatches": 0 }, "upsertedCount": { "$$unsetOrMatches": 0 }, "matchedCount": { "$$unsetOrMatches": 0 }, "modifiedCount": { "$$unsetOrMatches": 0 }, "deletedCount": { "$$unsetOrMatches": 0 }, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } }, { "object": "collection", "name": "find", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 333 }, { "_id": 4, "x": 44 } ] } ], "expectEvents": [ { "client": "client", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": false, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } }, { "update": 0, "filter": { "_id": 3 }, "updateMods": { "$set": { "x": 333 } }, "multi": false } ], "nsInfo": [ { "ns": "command-monitoring-tests.test" } ] } } }, { "commandSucceededEvent": { "commandName": "bulkWrite", "reply": { "ok": 1, "nInserted": { "$$exists": false }, "nMatched": { "$$exists": false }, "nModified": { "$$exists": false }, "nUpserted": { "$$exists": false }, "nDeleted": { "$$exists": false } } } } ] } ] } ] } unacknowledgedBulkWrite.json000066400000000000000000000051211511661753600370420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "unacknowledgedBulkWrite", "schemaVersion": "1.7", "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A successful unordered bulk write with an unacknowledged write concern", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": "unorderedBulkWriteInsertW0", "x": 44 } } } ], "ordered": false } }, { "name": "find", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": "unorderedBulkWriteInsertW0", "x": 44 } ], "ordered": false, "writeConcern": { "w": 0 } }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": { "$$exists": false } }, "commandName": "insert" } } ] } ] } ] } updateMany.json000066400000000000000000000103161511661753600343300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "updateMany", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "A successful updateMany", "operations": [ { "name": "updateMany", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "upsert": { "$$unsetOrMatches": false }, "multi": true } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 2 }, "commandName": "update" } } ] } ] }, { "description": "A successful updateMany with write errors", "operations": [ { "name": "updateMany", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$unsupported": { "x": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$unsupported": { "x": 1 } }, "upsert": { "$$unsetOrMatches": false }, "multi": true } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "update" } } ] } ] } ] } updateOne.json000066400000000000000000000140361511661753600341500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "updateOne", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "A successful updateOne", "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "upsert": { "$$unsetOrMatches": false }, "multi": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ] }, { "description": "A successful updateOne with upsert where the upserted id is not an ObjectId", "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "$inc": { "x": 1 } }, "upsert": true, "multi": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1, "upserted": [ { "index": 0, "_id": 4 } ] }, "commandName": "update" } } ] } ] }, { "description": "A successful updateOne with write errors", "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$unsupported": { "x": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$unsupported": { "x": 1 } }, "upsert": { "$$unsetOrMatches": false }, "multi": { "$$unsetOrMatches": false } } ], "ordered": true }, "commandName": "update", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 0, "writeErrors": { "$$type": "array" } }, "commandName": "update" } } ] } ] } ] } writeConcernError.json000066400000000000000000000070051511661753600356760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command-logging-and-monitoring/monitoring{ "description": "writeConcernError", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.3.1", "topologies": [ "replicaset" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A retryable write with write concern errors publishes success event", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91 } } } } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1, "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91 } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/000077500000000000000000000000001511661753600251155ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/000077500000000000000000000000001511661753600263615ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/bulkWrite.json000066400000000000000000000044141511661753600312270ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful mixed bulk write", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 4, "x": 44 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 3 }, "update": { "$set": { "x": 333 } } } } ] } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4, "x": 44 } ], "ordered": true }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "insert" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 3 }, "u": { "$set": { "x": 333 } } } ], "ordered": true }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "update" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/command.json000066400000000000000000000044641511661753600307020ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful command", "operation": { "name": "count", "arguments": { "filter": { "_id": 1 } } }, "expectations": [ { "command_started_event": { "command": { "count": "test", "query": { "_id": 1 } }, "command_name": "count", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "count" } } ] }, { "description": "A failed command event", "operation": { "name": "count", "arguments": { "filter": { "$or": true } } }, "expectations": [ { "command_started_event": { "command": { "count": "test", "query": { "$or": true } }, "command_name": "count", "database_name": "command-monitoring-tests" } }, { "command_failed_event": { "command_name": "count" } } ] }, { "description": "A successful command with a non-primary read preference", "operation": { "name": "count", "arguments": { "filter": { "_id": 1 } }, "read_preference": { "mode": "primaryPreferred" } }, "expectations": [ { "command_started_event": { "command": { "count": "test", "query": { "_id": 1 } }, "command_name": "count", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "count" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/deleteMany.json000066400000000000000000000045341511661753600313510ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful delete many", "operation": { "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 0 } ], "ordered": true }, "command_name": "delete", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 2 }, "command_name": "delete" } } ] }, { "description": "A successful delete many command with write errors", "operation": { "name": "deleteMany", "arguments": { "filter": { "_id": { "$nothing": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$nothing": 1 } }, "limit": 0 } ], "ordered": true }, "command_name": "delete", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "delete" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/deleteOne.json000066400000000000000000000045301511661753600311620ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful delete one", "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 1 } ], "ordered": true }, "command_name": "delete", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "delete" } } ] }, { "description": "A successful delete one command with write errors", "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": { "$nothing": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$nothing": 1 } }, "limit": 1 } ], "ordered": true }, "command_name": "delete", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "delete" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/find.json000066400000000000000000000314421511661753600302000ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "namespace": "command-monitoring-tests.test", "tests": [ { "description": "A successful find event with no options", "operation": { "name": "find", "arguments": { "filter": { "_id": 1 } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "_id": 1 } }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "0" }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 } ] } }, "command_name": "find" } } ] }, { "description": "A successful find event with options", "operation": { "name": "find", "read_preference": { "mode": "primaryPreferred" }, "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": 1 }, "skip": { "$numberLong": "2" }, "modifiers": { "$comment": "test", "$hint": { "_id": 1 }, "$max": { "_id": 6 }, "$maxTimeMS": 6000, "$min": { "_id": 0 }, "$returnKey": false, "$showDiskLoc": false } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": 1 }, "skip": { "$numberLong": "2" }, "comment": "test", "hint": { "_id": 1 }, "max": { "_id": 6 }, "maxTimeMS": 6000, "min": { "_id": 0 }, "returnKey": false, "showRecordId": false }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "0" }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } }, "command_name": "find" } } ] }, { "description": "A successful find event with a getmore", "operation": { "name": "find", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" } }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "42" }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "command_name": "find" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": { "$numberLong": "3" } }, "command_name": "getMore", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "0" }, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } }, "command_name": "getMore" } } ] }, { "description": "A successful find event with a getmore and killcursors", "ignore_if_server_version_greater_than": "3.0", "operation": { "name": "find", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" }, "limit": { "$numberLong": "4" } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" }, "limit": { "$numberLong": "4" } }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "42" }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "command_name": "find" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": { "$numberLong": "1" } }, "command_name": "getMore", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "42" }, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 } ] } }, "command_name": "getMore" } }, { "command_started_event": { "command": { "killCursors": "test", "cursors": [ { "$numberLong": "42" } ] }, "command_name": "killCursors", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursorsUnknown": [ { "$numberLong": "42" } ] }, "command_name": "killCursors" } } ] }, { "description": "A successful find event with a getmore and the server kills the cursor (<= 4.4)", "ignore_if_server_version_less_than": "3.1", "ignore_if_server_version_greater_than": "4.4", "ignore_if_topology_type": [ "sharded" ], "operation": { "name": "find", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" }, "limit": { "$numberLong": "4" } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": { "$numberLong": "3" }, "limit": { "$numberLong": "4" } }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "42" }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "command_name": "find" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": { "$numberLong": "1" } }, "command_name": "getMore", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "cursor": { "id": { "$numberLong": "0" }, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 } ] } }, "command_name": "getMore" } } ] }, { "description": "A failed find event", "operation": { "name": "find", "arguments": { "filter": { "$or": true } } }, "expectations": [ { "command_started_event": { "command": { "find": "test", "filter": { "$or": true } }, "command_name": "find", "database_name": "command-monitoring-tests" } }, { "command_failed_event": { "command_name": "find" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/insertMany.json000066400000000000000000000060361511661753600314120ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful insert many", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 } ] } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "insert" } } ] }, { "description": "A successful insert many command with write errors", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 1, "x": 11 } ] } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1, "x": 11 } ], "ordered": true }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "insert" } } ] }, { "description": "A successful unordered insert many", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 } ], "options": { "ordered": false } } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": false }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "insert" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/insertOne.json000066400000000000000000000040221511661753600312200ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful insert one", "operation": { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "insert" } } ] }, { "description": "A successful insert one command with write errors", "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1, "x": 11 } ], "ordered": true }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "insert" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/unacknowledgedBulkWrite.json000066400000000000000000000031561511661753600341040ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "collection_name": "test-unacknowledged-bulk-write", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful unordered bulk write with an unacknowledged write concern", "comment": "On a 2.4 server, no GLE is sent and requires a client-side manufactured reply", "operation": { "name": "bulkWrite", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": "unorderedBulkWriteInsertW0", "x": 44 } } } ], "options": { "ordered": false } } }, "expectations": [ { "command_started_event": { "command": { "insert": "test-unacknowledged-bulk-write", "documents": [ { "_id": "unorderedBulkWriteInsertW0", "x": 44 } ], "ordered": false, "writeConcern": { "w": 0 } }, "command_name": "insert", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1 }, "command_name": "insert" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/updateMany.json000066400000000000000000000054261511661753600313720ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful update many", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "update": "test", "ordered": true, "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true } ] }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 2 }, "command_name": "update" } } ] }, { "description": "A successful update many command with write errors", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$nothing": { "x": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "update": "test", "ordered": true, "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$nothing": { "x": 1 } }, "multi": true } ] }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "update" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/legacy/updateOne.json000066400000000000000000000077701511661753600312130ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "collection_name": "test", "database_name": "command-monitoring-tests", "tests": [ { "description": "A successful update one", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "update": "test", "ordered": true, "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } } } ] }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1 }, "command_name": "update" } } ] }, { "description": "A successful update one with upsert when the upserted id is not an object id", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "expectations": [ { "command_started_event": { "command": { "update": "test", "ordered": true, "updates": [ { "q": { "_id": 4 }, "u": { "$inc": { "x": 1 } }, "upsert": true } ] }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 1, "upserted": [ { "index": 0, "_id": 4 } ] }, "command_name": "update" } } ] }, { "description": "A successful update one command with write errors", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$nothing": { "x": 1 } } } }, "expectations": [ { "command_started_event": { "command": { "update": "test", "ordered": true, "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$nothing": { "x": 1 } } } ] }, "command_name": "update", "database_name": "command-monitoring-tests" } }, { "command_succeeded_event": { "reply": { "ok": 1, "n": 0, "writeErrors": [ { "index": 0, "code": 42, "errmsg": "" } ] }, "command_name": "update" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified/000077500000000000000000000000001511661753600265405ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified/find.json000066400000000000000000000331421511661753600303560ustar00rootroot00000000000000{ "description": "find", "schemaVersion": "1.15", "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "_yamlAnchors": { "namespace": "command-monitoring-tests.test" }, "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "A successful find with no options", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": 1 } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with options", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "x": -1 }, "projection": { "_id": 0, "x": 1 }, "skip": 2, "comment": "test", "hint": { "_id": 1 }, "max": { "_id": 6 }, "maxTimeMS": 6000, "min": { "_id": 0 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gt": 1 } }, "sort": { "x": -1 }, "projection": { "_id": 0, "x": 1 }, "skip": 2, "comment": "test", "hint": { "_id": 1 }, "max": { "_id": 6 }, "maxTimeMS": 6000, "min": { "_id": 0 } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "x": 33 }, { "x": 22 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with showRecordId and returnKey", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "showRecordId": true, "returnKey": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "showRecordId": true, "returnKey": true }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find with a getMore", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3 }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": { "$$type": [ "int", "long" ] }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "test", "batchSize": 3 }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A successful find event with a getmore and the server kills the cursor (<= 4.4)", "runOnRequirements": [ { "minServerVersion": "3.1", "maxServerVersion": "4.4.99", "topologies": [ "single", "replicaset" ] } ], "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": { "$$type": [ "int", "long" ] }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "test", "batchSize": 1 }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 } ] } }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } } ] } ] }, { "description": "A failed find event", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "$or": true } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandFailedEvent": { "commandName": "find", "databaseName": "command-monitoring-tests" } } ] } ] } ] } pre-42-server-connection-id.json000066400000000000000000000041761511661753600344300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified{ "description": "pre-42-server-connection-id", "schemaVersion": "1.6", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "server-connection-id-tests", "collectionName": "coll", "documents": [] } ], "tests": [ { "description": "command events do not include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "insert", "hasServerConnectionId": false } }, { "commandSucceededEvent": { "commandName": "insert", "hasServerConnectionId": false } }, { "commandStartedEvent": { "commandName": "find", "hasServerConnectionId": false } }, { "commandFailedEvent": { "commandName": "find", "hasServerConnectionId": false } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified/redacted-commands.json000066400000000000000000000370751511661753600330210ustar00rootroot00000000000000{ "description": "redacted-commands", "schemaVersion": "1.5", "runOnRequirements": [ { "minServerVersion": "5.0", "auth": false } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ], "observeSensitiveCommands": true } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } } ], "tests": [ { "description": "authenticate", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "authenticate", "command": { "authenticate": 1, "mechanism": "MONGODB-X509", "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "db": "$external" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "authenticate", "command": { "authenticate": { "$$exists": false }, "mechanism": { "$$exists": false }, "user": { "$$exists": false }, "db": { "$$exists": false } } } } ] } ] }, { "description": "saslStart", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslStart", "command": { "saslStart": 1, "payload": "definitely-invalid-payload", "db": "admin" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "saslStart", "command": { "saslStart": { "$$exists": false }, "payload": { "$$exists": false }, "db": { "$$exists": false } } } } ] } ] }, { "description": "saslContinue", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "saslContinue", "command": { "saslContinue": 1, "conversationId": 0, "payload": "definitely-invalid-payload" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "saslContinue", "command": { "saslContinue": { "$$exists": false }, "conversationId": { "$$exists": false }, "payload": { "$$exists": false } } } } ] } ] }, { "description": "getnonce", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "getnonce", "command": { "getnonce": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "getnonce", "reply": { "ok": { "$$exists": false }, "nonce": { "$$exists": false } } } } ] } ] }, { "description": "createUser", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "createUser", "command": { "createUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "createUser", "command": { "createUser": { "$$exists": false }, "pwd": { "$$exists": false }, "roles": { "$$exists": false } } } } ] } ] }, { "description": "updateUser", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "updateUser", "command": { "updateUser": "private", "pwd": {}, "roles": [] } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "updateUser", "command": { "updateUser": { "$$exists": false }, "pwd": { "$$exists": false }, "roles": { "$$exists": false } } } } ] } ] }, { "description": "copydbgetnonce", "runOnRequirements": [ { "maxServerVersion": "3.6.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydbgetnonce", "command": { "copydbgetnonce": { "$$exists": false } } } } ] } ] }, { "description": "copydbsaslstart", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydbsaslstart", "command": { "copydbsaslstart": { "$$exists": false } } } } ] } ] }, { "description": "copydb", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "copydb", "command": { "copydb": "private" } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "copydb", "command": { "copydb": { "$$exists": false } } } } ] } ] }, { "description": "hello with speculative authenticate", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] } ] }, { "description": "legacy hello with speculative authenticate", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] } ] }, { "description": "hello without speculative authenticate is not redacted", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "hello", "command": { "hello": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": 1 } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": true } } } } ] } ] }, { "description": "legacy hello without speculative authenticate is not redacted", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": true } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified/server-connection-id.json000066400000000000000000000041511511661753600334710ustar00rootroot00000000000000{ "description": "server-connection-id", "schemaVersion": "1.6", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "server-connection-id-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "databaseName": "server-connection-id-tests", "collectionName": "coll", "documents": [] } ], "tests": [ { "description": "command events include server connection id", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } }, { "name": "find", "object": "collection", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "insert", "hasServerConnectionId": true } }, { "commandSucceededEvent": { "commandName": "insert", "hasServerConnectionId": true } }, { "commandStartedEvent": { "commandName": "find", "hasServerConnectionId": true } }, { "commandFailedEvent": { "commandName": "find", "hasServerConnectionId": true } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/command_monitoring/unified/writeConcernError.json000066400000000000000000000070051511661753600331110ustar00rootroot00000000000000{ "description": "writeConcernError", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.3.1", "topologies": [ "replicaset" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "A retryable write with write concern errors publishes success event", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91 } } } } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1, "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91 } }, "commandName": "insert" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2, "x": 22 } ], "ordered": true }, "commandName": "insert", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/000077500000000000000000000000001511661753600242505ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/README.rst000066400000000000000000000102661511661753600257440ustar00rootroot00000000000000======================= Connection String Tests ======================= The YAML and JSON files in this directory tree are platform-independent tests that drivers can use to prove their conformance to the Connection String Spec. As the spec is primarily concerned with parsing the parts of a URI, these tests do not focus on host and option validation. Where necessary, the tests use options known to be (un)supported by drivers to BSON_ASSERT behavior such as issuing a warning on repeated option keys. As such these YAML tests are in no way a replacement for more thorough testing. However, they can provide an initial verification of your implementation. Converting to JSON ------------------ The tests are written in YAML because it is easier for humans to write and read, and because YAML includes a standard comment format. A JSONified version of each YAML file is included in this repository. Whenever you change the YAML, re-convert to JSON. One method to convert to JSON is with `jsonwidget-python `_:: pip install PyYAML urwid jsonwidget make Or instead of "make":: for i in `find . -iname '*.yml'`; do echo "${i%.*}" jwc yaml2json $i > ${i%.*}.json done Alternatively, you can use `yamljs `_:: npm install -g yamljs yaml2json -s -p -r . Version ------- Files in the "specifications" repository have no version scheme. They are not tied to a MongoDB server version, and it is our intention that each specification moves from "draft" to "final" with no further versions; it is superseded by a future spec, not revised. However, implementers must have stable sets of tests to target. As test files evolve they will be occasionally tagged like "uri-tests-tests-2015-07-16", until the spec is final. Format ------ Each YAML file contains an object with a single ``tests`` key. This key is an array of test case objects, each of which have the following keys: - ``description``: A string describing the test. - ``uri``: A string containing the URI to be parsed. - ``valid:`` A boolean indicating if the URI should be considered valid. - ``warning:`` A boolean indicating whether URI parsing should emit a warning (independent of whether or not the URI is valid). - ``hosts``: An array of host objects, each of which have the following keys: - ``type``: A string denoting the type of host. Possible values are "ipv4", "ip_literal", "hostname", and "unix". Asserting the type is *optional*. - ``host``: A string containing the parsed host. - ``port``: An integer containing the parsed port number. - ``auth``: An object containing the following keys: - ``username``: A string containing the parsed username. For auth mechanisms that do not utilize a password, this may be the entire ``userinfo`` token (as discussed in `RFC 2396 `_). - ``password``: A string containing the parsed password. - ``db``: A string containing the parsed authentication database. For legacy implementations that support namespaces (databases and collections) this may be the full namespace eg: ``.`` - ``options``: An object containing key/value pairs for each parsed query string option. If a test case includes a null value for one of these keys (e.g. ``auth: ~``, ``port: ~``), no assertion is necessary. This both simplifies parsing of the test files (keys should always exist) and allows flexibility for drivers that might substitute default values *during* parsing (e.g. omitted ``port`` could be parsed as 27017). The ``valid`` and ``warning`` fields are boolean in order to keep the tests flexible. We are not concerned with asserting the format of specific error or warnings messages strings. Use as unit tests ================= Testing whether a URI is valid or not should simply be a matter of checking whether URI parsing (or MongoClient construction) raises an error or exception. Testing for emitted warnings may require more legwork (e.g. configuring a log handler and watching for output). Not all drivers may be able to directly BSON_ASSERT the hosts, auth credentials, and options. Doing so may require exposing the driver's URI parsing component. mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/additional-nonspec-tests.json000066400000000000000000000123771511661753600320700ustar00rootroot00000000000000{ "tests": [ { "description": "Repeated authSource key", "uri": "mongodb://example.com/?authSource=bar&authSource=foo", "valid": true, "comment": "invalid URI (see SPEC-1424)", "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "authSource": "foo" } }, { "description": "Repeated readConcernLevel key", "uri": "mongodb://example.com/?readConcernLevel=local&readConcernLevel=majority", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "readconcernlevel": "majority" } }, { "description": "Repeated authmechanismproperties: key", "uri": "mongodb://example.com/?authmechanismproperties=SERVICE_NAME:42&authmechanismproperties=SERVICE_NAME:49", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "authmechanismproperties": { "SERVICE_NAME": "49" } } }, { "description": "Repeated appname key", "uri": "mongodb://example.com/?appname=example&appname=example42", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "appname": "example42" } }, { "description": "Username containing an unescaped :", "uri": "mongodb://alic::e@127.0.0.1:27017", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing an unescaped :", "uri": "mongodb://alic::e@[::1]", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing an unescaped :", "uri": "mongodb://alic::e@[::1]:27017", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing an unescaped :", "uri": "mongodb://alic::e@%2Ftmp%2Fmongodb-27017.sock/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "should default to SERVICE_NAME:mongodb even if other authMechanismProperties present", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOST_NAME:true", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "mongodb", "CANONICALIZE_HOST_NAME": true } } }, { "description": "should detect case-insensitive service_name", "uri": "mongodb://user%40DOMAIN.COM@localhost/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOST_NAME:true,service_name:abc", "valid": true, "credential": { "username": "user@DOMAIN.COM", "password": null, "source": "$external", "mechanism": "GSSAPI", "mechanism_properties": { "SERVICE_NAME": "abc", "CANONICALIZE_HOST_NAME": true } } }, { "description": "Username containing percent encoded multi-byte UTF-8 is valid", "uri": "mongodb://%E2%98%83", "valid": true, "hosts": [ { "type": "hostname", "host": "☃", "port": null } ] }, { "description": "Username containing percent encoded multi-byte UTF-8 is valid", "uri": "mongodb://%E2%D8%83", "valid": false, "warning": false }, { "description": "Valid connection and timeout options are parsed correctly, libmongoc version without maxIdleTimeMS", "uri": "mongodb://example.com/?appname=URI-OPTIONS-SPEC-TEST&connectTimeoutMS=20000&heartbeatFrequencyMS=5000&localThresholdMS=3000&replicaSet=uri-options-spec&retryWrites=true&serverSelectionTimeoutMS=15000&socketTimeoutMS=7500", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "appname": "URI-OPTIONS-SPEC-TEST", "connectTimeoutMS": 20000, "heartbeatFrequencyMS": 5000, "localThresholdMS": 3000, "replicaSet": "uri-options-spec", "retryWrites": true, "serverSelectionTimeoutMS": 15000, "socketTimeoutMS": 7500 } }, { "description": "Valid connection pool options are parsed correctly, libmongoc version without maxIdleTimeMS or minPoolSize", "uri": "mongodb://example.com/?waitQueueTimeoutMS=50000&maxPoolSize=5", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "waitQueueTimeoutMS": 50000, "maxPoolSize": 5 } } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/invalid-uris.json000066400000000000000000000161531511661753600275570ustar00rootroot00000000000000{ "tests": [ { "description": "Empty string", "uri": "", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid scheme", "uri": "mongo://localhost:27017", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Missing host", "uri": "mongodb://", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Double colon in host identifier", "uri": "mongodb://localhost::27017", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Double colon in host identifier and trailing slash", "uri": "mongodb://localhost::27017/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Double colon in host identifier with missing host and port", "uri": "mongodb://::", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Double colon in host identifier with missing port", "uri": "mongodb://localhost,localhost::", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Double colon in host identifier and second host", "uri": "mongodb://localhost::27017,abc", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (negative number) with hostname", "uri": "mongodb://localhost:-1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (zero) with hostname", "uri": "mongodb://localhost:0/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (positive number) with hostname", "uri": "mongodb://localhost:65536", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (positive number) with hostname and trailing slash", "uri": "mongodb://localhost:65536/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (non-numeric string) with hostname", "uri": "mongodb://localhost:foo", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (negative number) with IP literal", "uri": "mongodb://[::1]:-1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (zero) with IP literal", "uri": "mongodb://[::1]:0/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (positive number) with IP literal", "uri": "mongodb://[::1]:65536", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (positive number) with IP literal and trailing slash", "uri": "mongodb://[::1]:65536/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Invalid port (non-numeric string) with IP literal", "uri": "mongodb://[::1]:foo", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Incomplete key value pair for option", "uri": "mongodb://example.com/?w", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped colon", "uri": "mongodb://alice:foo:bar@127.0.0.1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing an unescaped at-sign", "uri": "mongodb://alice@@127.0.0.1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped at-sign", "uri": "mongodb://alice@foo:bar@127.0.0.1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing an unescaped slash", "uri": "mongodb://alice/@localhost/db", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username containing unescaped slash with password", "uri": "mongodb://alice/bob:foo@localhost/db", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped slash", "uri": "mongodb://alice:foo/bar@localhost/db", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Host with unescaped slash", "uri": "mongodb:///tmp/mongodb-27017.sock/", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "mongodb+srv with multiple service names", "uri": "mongodb+srv://test5.test.mongodb.com,test6.test.mongodb.com", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "mongodb+srv with port number", "uri": "mongodb+srv://test7.test.mongodb.com:27018", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped percent sign", "uri": "mongodb://alice%foo:bar@127.0.0.1", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped percent sign and an escaped one", "uri": "mongodb://user%20%:password@localhost", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null }, { "description": "Username with password containing an unescaped percent sign (non hex digit)", "uri": "mongodb://user%w:password@localhost", "valid": false, "warning": null, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-auth.json000066400000000000000000000163221511661753600272050ustar00rootroot00000000000000{ "tests": [ { "description": "User info for single IPv4 host without database", "uri": "mongodb://alice:foo@127.0.0.1", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": { "username": "alice", "password": "foo", "db": null }, "options": null }, { "description": "User info for single IPv4 host with database", "uri": "mongodb://alice:foo@127.0.0.1/test", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": { "username": "alice", "password": "foo", "db": "test" }, "options": null }, { "description": "User info for single IP literal host without database", "uri": "mongodb://bob:bar@[::1]:27018", "valid": true, "warning": false, "hosts": [ { "type": "ip_literal", "host": "::1", "port": 27018 } ], "auth": { "username": "bob", "password": "bar", "db": null }, "options": null }, { "description": "User info for single IP literal host with database", "uri": "mongodb://bob:bar@[::1]:27018/admin", "valid": true, "warning": false, "hosts": [ { "type": "ip_literal", "host": "::1", "port": 27018 } ], "auth": { "username": "bob", "password": "bar", "db": "admin" }, "options": null }, { "description": "User info for single hostname without database", "uri": "mongodb://eve:baz@example.com", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": { "username": "eve", "password": "baz", "db": null }, "options": null }, { "description": "User info for single hostname with database", "uri": "mongodb://eve:baz@example.com/db2", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": { "username": "eve", "password": "baz", "db": "db2" }, "options": null }, { "description": "User info for multiple hosts without database", "uri": "mongodb://alice:secret@127.0.0.1,example.com:27018", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null }, { "type": "hostname", "host": "example.com", "port": 27018 } ], "auth": { "username": "alice", "password": "secret", "db": null }, "options": null }, { "description": "User info for multiple hosts with database", "uri": "mongodb://alice:secret@example.com,[::1]:27019/admin", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null }, { "type": "ip_literal", "host": "::1", "port": 27019 } ], "auth": { "username": "alice", "password": "secret", "db": "admin" }, "options": null }, { "description": "Username without password", "uri": "mongodb://alice@127.0.0.1", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": { "username": "alice", "password": null, "db": null }, "options": null }, { "description": "Username with empty password", "uri": "mongodb://alice:@127.0.0.1", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": { "username": "alice", "password": "", "db": null }, "options": null }, { "description": "Escaped username and database without password", "uri": "mongodb://%40l%3Ace%2F%3D@example.com/my%3Ddb", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": { "username": "@l:ce/=", "password": null, "db": "my=db" }, "options": null }, { "description": "Subdelimiters in user/pass don't need escaping (PLAIN)", "uri": "mongodb://!$&'()*+,;=:!$&'()*+,;=@127.0.0.1/admin?authMechanism=PLAIN", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": { "username": "!$&'()*+,;=", "password": "!$&'()*+,;=", "db": "admin" }, "options": { "authmechanism": "PLAIN" } }, { "description": "Escaped username (MONGODB-X509)", "uri": "mongodb://CN%3DmyName%2COU%3DmyOrgUnit%2CO%3DmyOrg%2CL%3DmyLocality%2CST%3DmyState%2CC%3DmyCountry@localhost/?authMechanism=MONGODB-X509", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "localhost", "port": null } ], "auth": { "username": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry", "password": null, "db": null }, "options": { "authmechanism": "MONGODB-X509" } }, { "description": "Escaped username (GSSAPI)", "uri": "mongodb://user%40EXAMPLE.COM:secret@localhost/?authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:forward,SERVICE_HOST:example.com&authMechanism=GSSAPI", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "localhost", "port": null } ], "auth": { "username": "user@EXAMPLE.COM", "password": "secret", "db": null }, "options": { "authmechanism": "GSSAPI", "authmechanismproperties": { "SERVICE_NAME": "other", "SERVICE_HOST": "example.com", "CANONICALIZE_HOST_NAME": "forward" } } }, { "description": "At-signs in options aren't part of the userinfo", "uri": "mongodb://alice:secret@example.com/admin?replicaset=my@replicaset", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": { "username": "alice", "password": "secret", "db": "admin" }, "options": { "replicaset": "my@replicaset" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-db-with-dotted-name.json000066400000000000000000000047461511661753600320100ustar00rootroot00000000000000{ "tests": [ { "description": "Multiple Unix domain sockets and auth DB resembling a socket (relative path)", "uri": "mongodb://rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock/admin.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin.sock" }, "options": null }, { "description": "Multiple Unix domain sockets with auth DB resembling a path (relative path)", "uri": "mongodb://rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock/admin.shoe", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin.shoe" }, "options": null }, { "description": "Multiple Unix domain sockets and auth DB resembling a socket (absolute path)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock/admin.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin.sock" }, "options": null }, { "description": "Multiple Unix domain sockets with auth DB resembling a path (absolute path)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock/admin.shoe", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin.shoe" }, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-host_identifiers.json000066400000000000000000000063421511661753600316070ustar00rootroot00000000000000{ "tests": [ { "description": "Single IPv4 host without port", "uri": "mongodb://127.0.0.1", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null } ], "auth": null, "options": null }, { "description": "Single IPv4 host with port", "uri": "mongodb://127.0.0.1:27018", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": 27018 } ], "auth": null, "options": null }, { "description": "Single IP literal host without port", "uri": "mongodb://[::1]", "valid": true, "warning": false, "hosts": [ { "type": "ip_literal", "host": "::1", "port": null } ], "auth": null, "options": null }, { "description": "Single IP literal host with port", "uri": "mongodb://[::1]:27019", "valid": true, "warning": false, "hosts": [ { "type": "ip_literal", "host": "::1", "port": 27019 } ], "auth": null, "options": null }, { "description": "Single hostname without port", "uri": "mongodb://example.com", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": null }, { "description": "Single hostname with port", "uri": "mongodb://example.com:27020", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": 27020 } ], "auth": null, "options": null }, { "description": "Single hostname (resembling IPv4) without port", "uri": "mongodb://256.0.0.1", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "256.0.0.1", "port": null } ], "auth": null, "options": null }, { "description": "Multiple hosts (mixed formats)", "uri": "mongodb://127.0.0.1,[::1]:27018,example.com:27019", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": null }, { "type": "ip_literal", "host": "::1", "port": 27018 }, { "type": "hostname", "host": "example.com", "port": 27019 } ], "auth": null, "options": null }, { "description": "UTF-8 hosts", "uri": "mongodb://bücher.example.com,umläut.example.com/", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "bücher.example.com", "port": null }, { "type": "hostname", "host": "umläut.example.com", "port": null } ], "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-options.json000066400000000000000000000026041511661753600277350ustar00rootroot00000000000000{ "tests": [ { "description": "Option names are normalized to lowercase", "uri": "mongodb://alice:secret@example.com/admin?AUTHMechanism=PLAIN", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": { "username": "alice", "password": "secret", "db": "admin" }, "options": { "authmechanism": "PLAIN" } }, { "description": "Missing delimiting slash between hosts and options", "uri": "mongodb://example.com?tls=true", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "tls": true } }, { "description": "Colon in a key value pair", "uri": "mongodb://example.com/?authMechanism=MONGODB-OIDC&authMechanismProperties=TOKEN_RESOURCE:mongodb://test-cluster", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "authmechanismProperties": { "TOKEN_RESOURCE": "mongodb://test-cluster" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-unix_socket-absolute.json000066400000000000000000000143441511661753600324150ustar00rootroot00000000000000{ "tests": [ { "description": "Unix domain socket (absolute path with trailing slash)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock/", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket (absolute path without trailing slash)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket (absolute path with spaces in path)", "uri": "mongodb://%2Ftmp%2F %2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/ /mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple Unix domain sockets (absolute paths)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple hosts (absolute path and ipv4)", "uri": "mongodb://127.0.0.1:27017,%2Ftmp%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": 27017 }, { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple hosts (absolute path and hostname resembling relative path)", "uri": "mongodb://mongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with auth database (absolute path)", "uri": "mongodb://alice:foo@%2Ftmp%2Fmongodb-27017.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null } ], "auth": { "username": "alice", "password": "foo", "db": "admin" }, "options": null }, { "description": "Unix domain socket with path resembling socket file (absolute path with trailing slash)", "uri": "mongodb://%2Ftmp%2Fpath.to.sock%2Fmongodb-27017.sock/", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with path resembling socket file (absolute path without trailing slash)", "uri": "mongodb://%2Ftmp%2Fpath.to.sock%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with path resembling socket file and auth (absolute path)", "uri": "mongodb://bob:bar@%2Ftmp%2Fpath.to.sock%2Fmongodb-27017.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": { "username": "bob", "password": "bar", "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets and auth DB (absolute path)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets with auth DB (absolute path)", "uri": "mongodb://%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets with auth and query string (absolute path)", "uri": "mongodb://bob:bar@%2Ftmp%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock/admin?w=1", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "/tmp/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": { "username": "bob", "password": "bar", "db": "admin" }, "options": { "w": 1 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-unix_socket-relative.json000066400000000000000000000153021511661753600324050ustar00rootroot00000000000000{ "tests": [ { "description": "Unix domain socket (relative path with trailing slash)", "uri": "mongodb://rel%2Fmongodb-27017.sock/", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket (relative path without trailing slash)", "uri": "mongodb://rel%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket (relative path with spaces)", "uri": "mongodb://rel%2F %2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/ /mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple Unix domain sockets (relative paths)", "uri": "mongodb://rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple Unix domain sockets (relative and absolute paths)", "uri": "mongodb://rel%2Fmongodb-27017.sock,%2Ftmp%2Fmongodb-27018.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "/tmp/mongodb-27018.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple hosts (relative path and ipv4)", "uri": "mongodb://127.0.0.1:27017,rel%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "ipv4", "host": "127.0.0.1", "port": 27017 }, { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Multiple hosts (relative path and hostname resembling relative path)", "uri": "mongodb://mongodb-27017.sock,rel%2Fmongodb-27018.sock", "valid": true, "warning": false, "hosts": [ { "type": "hostname", "host": "mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with auth database (relative path)", "uri": "mongodb://alice:foo@rel%2Fmongodb-27017.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null } ], "auth": { "username": "alice", "password": "foo", "db": "admin" }, "options": null }, { "description": "Unix domain socket with path resembling socket file (relative path with trailing slash)", "uri": "mongodb://rel%2Fpath.to.sock%2Fmongodb-27017.sock/", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with path resembling socket file (relative path without trailing slash)", "uri": "mongodb://rel%2Fpath.to.sock%2Fmongodb-27017.sock", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": null, "options": null }, { "description": "Unix domain socket with path resembling socket file and auth (relative path)", "uri": "mongodb://bob:bar@rel%2Fpath.to.sock%2Fmongodb-27017.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/path.to.sock/mongodb-27017.sock", "port": null } ], "auth": { "username": "bob", "password": "bar", "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets and auth DB resembling a socket (relative path)", "uri": "mongodb://rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets with auth DB resembling a path (relative path)", "uri": "mongodb://rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock/admin", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": { "username": null, "password": null, "db": "admin" }, "options": null }, { "description": "Multiple Unix domain sockets with auth and query string (relative path)", "uri": "mongodb://bob:bar@rel%2Fmongodb-27017.sock,rel%2Fmongodb-27018.sock/admin?w=1", "valid": true, "warning": false, "hosts": [ { "type": "unix", "host": "rel/mongodb-27017.sock", "port": null }, { "type": "unix", "host": "rel/mongodb-27018.sock", "port": null } ], "auth": { "username": "bob", "password": "bar", "db": "admin" }, "options": { "w": 1 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/connection_uri/valid-warnings.json000066400000000000000000000042121511661753600300670ustar00rootroot00000000000000{ "tests": [ { "description": "Unrecognized option keys are ignored", "uri": "mongodb://example.com/?foo=bar", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": null }, { "description": "Unsupported option values are ignored", "uri": "mongodb://example.com/?fsync=ifPossible", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": null }, { "description": "Repeated option keys", "uri": "mongodb://example.com/?replicaSet=test&replicaSet=test", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "replicaset": "test" } }, { "description": "Deprecated (or unknown) options are ignored if replacement exists", "uri": "mongodb://example.com/?wtimeout=5&wtimeoutMS=10", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "example.com", "port": null } ], "auth": null, "options": { "wtimeoutms": 10 } }, { "description": "Empty integer option values are ignored", "uri": "mongodb://localhost/?maxIdleTimeMS=", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "localhost", "port": null } ], "auth": null, "options": null }, { "description": "Empty boolean option value are ignored", "uri": "mongodb://localhost/?journal=", "valid": true, "warning": true, "hosts": [ { "type": "hostname", "host": "localhost", "port": null } ], "auth": null, "options": null } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/000077500000000000000000000000001511661753600221675ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/000077500000000000000000000000001511661753600234335ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/000077500000000000000000000000001511661753600237615ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/000077500000000000000000000000001511661753600246745ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/aggregate-collation.json000066400000000000000000000011561511661753600315020ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "Aggregate with collation", "operation": { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "x": "PING" } } ], "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": [ { "_id": 1, "x": "ping" } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/aggregate-out.json000066400000000000000000000034361511661753600303300ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "minServerVersion": "2.6", "tests": [ { "description": "Aggregate with $out", "operation": { "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "batchSize": 2 } }, "outcome": { "collection": { "name": "other_test_collection", "data": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "Aggregate with $out and batch size of 0", "operation": { "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "batchSize": 0 } }, "outcome": { "collection": { "name": "other_test_collection", "data": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/aggregate.json000066400000000000000000000014521511661753600275170ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Aggregate with multiple stages", "operation": { "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } } ], "batchSize": 2 } }, "outcome": { "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/count-collation.json000066400000000000000000000015021511661753600306770ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": "PING" } ], "minServerVersion": "3.4", "tests": [ { "description": "Count documents with collation", "operation": { "name": "countDocuments", "arguments": { "filter": { "x": "ping" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": 1 } }, { "description": "Deprecated count with collation", "operation": { "name": "count", "arguments": { "filter": { "x": "ping" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": 1 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/count-empty.json000066400000000000000000000013411511661753600300520ustar00rootroot00000000000000{ "data": [], "tests": [ { "description": "Estimated document count with empty collection", "operation": { "name": "estimatedDocumentCount", "arguments": {} }, "outcome": { "result": 0 } }, { "description": "Count documents with empty collection", "operation": { "name": "countDocuments", "arguments": { "filter": {} } }, "outcome": { "result": 0 } }, { "description": "Deprecated count with empty collection", "operation": { "name": "count", "arguments": { "filter": {} } }, "outcome": { "result": 0 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/count.json000066400000000000000000000037101511661753600267200ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Estimated document count", "operation": { "name": "estimatedDocumentCount", "arguments": {} }, "outcome": { "result": 3 } }, { "description": "Count documents without a filter", "operation": { "name": "countDocuments", "arguments": { "filter": {} } }, "outcome": { "result": 3 } }, { "description": "Count documents with a filter", "operation": { "name": "countDocuments", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "outcome": { "result": 2 } }, { "description": "Count documents with skip and limit", "operation": { "name": "countDocuments", "arguments": { "filter": {}, "skip": 1, "limit": 3 } }, "outcome": { "result": 2 } }, { "description": "Deprecated count without a filter", "operation": { "name": "count", "arguments": { "filter": {} } }, "outcome": { "result": 3 } }, { "description": "Deprecated count with a filter", "operation": { "name": "count", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "outcome": { "result": 2 } }, { "description": "Deprecated count with skip and limit", "operation": { "name": "count", "arguments": { "filter": {}, "skip": 1, "limit": 3 } }, "outcome": { "result": 2 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/distinct-collation.json000066400000000000000000000010141511661753600313660ustar00rootroot00000000000000{ "data": [ { "_id": 1, "string": "PING" }, { "_id": 2, "string": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "Distinct with a collation", "operation": { "name": "distinct", "arguments": { "fieldName": "string", "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": [ "PING" ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/distinct.json000066400000000000000000000014671511661753600274200ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Distinct without a filter", "operation": { "name": "distinct", "arguments": { "fieldName": "x", "filter": {} } }, "outcome": { "result": [ 11, 22, 33 ] } }, { "description": "Distinct with a filter", "operation": { "name": "distinct", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } } }, "outcome": { "result": [ 22, 33 ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/find-collation.json000066400000000000000000000010321511661753600304650ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "Find with a collation", "operation": { "name": "find", "arguments": { "filter": { "x": "PING" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": [ { "_id": 1, "x": "ping" } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/read/find.json000066400000000000000000000031701511661753600265100ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "tests": [ { "description": "Find with filter", "operation": { "name": "find", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": [ { "_id": 1, "x": 11 } ] } }, { "description": "Find with filter, sort, skip, and limit", "operation": { "name": "find", "arguments": { "filter": { "_id": { "$gt": 2 } }, "sort": { "_id": 1 }, "skip": 2, "limit": 2 } }, "outcome": { "result": [ { "_id": 5, "x": 55 } ] } }, { "description": "Find with limit, sort, and batchsize", "operation": { "name": "find", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4, "batchSize": 2 } }, "outcome": { "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/000077500000000000000000000000001511661753600251135ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/bulkWrite-arrayFilters.json000066400000000000000000000040721511661753600324260ustar00rootroot00000000000000{ "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ], "minServerVersion": "3.5.6", "tests": [ { "description": "BulkWrite with arrayFilters", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 3 } ] } }, { "name": "updateMany", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 3, "modifiedCount": 3, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 2 }, { "b": 2 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 2 } ] } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/bulkWrite-collation.json000066400000000000000000000111741511661753600317440ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" }, { "_id": 4, "x": "pong" }, { "_id": 5, "x": "pONg" } ], "minServerVersion": "3.4", "tests": [ { "description": "BulkWrite with delete operations and collation", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "x": "PING" }, "collation": { "locale": "en_US", "strength": 2 } } }, { "name": "deleteOne", "arguments": { "filter": { "x": "PING" }, "collation": { "locale": "en_US", "strength": 2 } } }, { "name": "deleteMany", "arguments": { "filter": { "x": "PONG" }, "collation": { "locale": "en_US", "strength": 2 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 4, "insertedCount": 0, "insertedIds": {}, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "BulkWrite with update operations and collation", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateMany", "arguments": { "filter": { "x": "ping" }, "update": { "$set": { "x": "PONG" } }, "collation": { "locale": "en_US", "strength": 3 } } }, { "name": "updateOne", "arguments": { "filter": { "x": "ping" }, "update": { "$set": { "x": "PONG" } }, "collation": { "locale": "en_US", "strength": 2 } } }, { "name": "replaceOne", "arguments": { "filter": { "x": "ping" }, "replacement": { "_id": 6, "x": "ping" }, "upsert": true, "collation": { "locale": "en_US", "strength": 3 } } }, { "name": "updateMany", "arguments": { "filter": { "x": "pong" }, "update": { "$set": { "x": "PONG" } }, "collation": { "locale": "en_US", "strength": 2 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 6, "modifiedCount": 4, "upsertedCount": 1, "upsertedIds": { "2": 6 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "PONG" }, { "_id": 3, "x": "PONG" }, { "_id": 4, "x": "PONG" }, { "_id": 5, "x": "PONG" }, { "_id": 6, "x": "ping" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/bulkWrite.json000066400000000000000000000410311511661753600277550ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "minServerVersion": "2.6", "tests": [ { "description": "BulkWrite with deleteOne operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 3 } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 2 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 0, "insertedIds": {}, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "BulkWrite with deleteMany operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteMany", "arguments": { "filter": { "x": { "$lt": 11 } } } }, { "name": "deleteMany", "arguments": { "filter": { "x": { "$lte": 22 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 2, "insertedCount": 0, "insertedIds": {}, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [] } } }, { "description": "BulkWrite with insertOne operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 4, "x": 44 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 2, "insertedIds": { "0": 3, "1": 4 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } }, { "description": "BulkWrite with replaceOne operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "replaceOne", "arguments": { "filter": { "_id": 3 }, "replacement": { "x": 33 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 12 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 3 }, "replacement": { "x": 33 }, "upsert": true } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 1, "upsertedIds": { "2": 3 } }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite with updateOne operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateOne", "arguments": { "filter": { "_id": 0 }, "update": { "$set": { "x": 0 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 11 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 3 }, "update": { "$set": { "x": 33 } }, "upsert": true } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 2, "modifiedCount": 1, "upsertedCount": 1, "upsertedIds": { "3": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite with updateMany operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateMany", "arguments": { "filter": { "x": { "$lt": 11 } }, "update": { "$set": { "x": 0 } } } }, { "name": "updateMany", "arguments": { "filter": { "x": { "$lte": 22 } }, "update": { "$unset": { "y": 1 } } } }, { "name": "updateMany", "arguments": { "filter": { "x": { "$lte": 22 } }, "update": { "$inc": { "x": 1 } } } }, { "name": "updateMany", "arguments": { "filter": { "_id": 3 }, "update": { "$set": { "x": 33 } }, "upsert": true } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 4, "modifiedCount": 2, "upsertedCount": 1, "upsertedIds": { "3": 3 } }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite with mixed ordered operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 4, "x": 44 } } }, { "name": "deleteMany", "arguments": { "filter": { "x": { "$nin": [ 24, 34 ] } } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 2, "insertedCount": 2, "insertedIds": { "0": 3, "3": 4 }, "matchedCount": 3, "modifiedCount": 3, "upsertedCount": 1, "upsertedIds": { "5": 4 } }, "collection": { "data": [ { "_id": 2, "x": 24 }, { "_id": 3, "x": 34 }, { "_id": 4, "x": 44 } ] } } }, { "description": "BulkWrite with mixed unordered operations", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "replaceOne", "arguments": { "filter": { "_id": 3 }, "replacement": { "_id": 3, "x": 33 }, "upsert": true } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": false } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 0, "insertedIds": {}, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 1, "upsertedIds": { "0": 3 } }, "collection": { "data": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite continue-on-error behavior with unordered (preexisting duplicate key)", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 4, "x": 44 } } } ], "options": { "ordered": false } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } }, { "description": "BulkWrite continue-on-error behavior with unordered (duplicate key in requests)", "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 4, "x": 44 } } } ], "options": { "ordered": false } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/deleteMany-collation.json000066400000000000000000000013731511661753600320630ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" } ], "minServerVersion": "3.4", "tests": [ { "description": "DeleteMany when many documents match with collation", "operation": { "name": "deleteMany", "arguments": { "filter": { "x": "PING" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "deletedCount": 2 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/deleteMany.json000066400000000000000000000023371511661753600301020ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "DeleteMany when many documents match", "operation": { "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "outcome": { "result": { "deletedCount": 2 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "DeleteMany when no document matches", "operation": { "name": "deleteMany", "arguments": { "filter": { "_id": 4 } } }, "outcome": { "result": { "deletedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/deleteOne-collation.json000066400000000000000000000015121511661753600316730ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" } ], "minServerVersion": "3.4", "tests": [ { "description": "DeleteOne when many documents matches with collation", "operation": { "name": "deleteOne", "arguments": { "filter": { "x": "PING" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": "pINg" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/deleteOne.json000066400000000000000000000031261511661753600277140ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "DeleteOne when many documents match", "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } } } }, "outcome": { "result": { "deletedCount": 1 } } }, { "description": "DeleteOne when one document matches", "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 2 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": 33 } ] } } }, { "description": "DeleteOne when no documents match", "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 4 } } }, "outcome": { "result": { "deletedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndDelete-collation.json000066400000000000000000000017521511661753600331250ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" } ], "minServerVersion": "3.4", "tests": [ { "description": "FindOneAndDelete when one document matches with collation", "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "_id": 2, "x": "PING" }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "x": "ping" }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": "pINg" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndDelete.json000066400000000000000000000042551511661753600311440ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "FindOneAndDelete when many documents match", "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "_id": { "$gt": 1 } }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndDelete when one document matches", "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "_id": 2 }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndDelete when no documents match", "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "_id": 4 }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndReplace-collation.json000066400000000000000000000020661511661753600332750ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "FindOneAndReplace when one document matches with collation returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "x": "PING" }, "replacement": { "x": "pong" }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "x": "pong" }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "pong" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndReplace-upsert.json000066400000000000000000000076721511661753600326430ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "minServerVersion": "2.6", "tests": [ { "description": "FindOneAndReplace when no documents match without id specified with upsert returning the document before modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "x": 44 }, "projection": { "x": 1, "_id": 0 }, "upsert": true } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } }, { "description": "FindOneAndReplace when no documents match without id specified with upsert returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "x": 44 }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 }, "upsert": true } }, "outcome": { "result": { "x": 44 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } }, { "description": "FindOneAndReplace when no documents match with id specified with upsert returning the document before modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "projection": { "x": 1, "_id": 0 }, "upsert": true } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } }, { "description": "FindOneAndReplace when no documents match with id specified with upsert returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 }, "upsert": true } }, "outcome": { "result": { "x": 44 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndReplace.json000066400000000000000000000123031511661753600313060ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "FindOneAndReplace when many documents match returning the document before modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 32 }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 32 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndReplace when many documents match returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 32 }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": { "x": 32 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 32 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndReplace when one document matches returning the document before modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 2 }, "replacement": { "x": 32 }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 32 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndReplace when one document matches returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 2 }, "replacement": { "x": 32 }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": { "x": 32 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 32 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndReplace when no documents match returning the document before modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "x": 44 }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndReplace when no documents match returning the document after modification", "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 4 }, "replacement": { "x": 44 }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } findOneAndUpdate-arrayFilters.json000066400000000000000000000070551511661753600335530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write{ "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ], "minServerVersion": "3.5.6", "tests": [ { "description": "FindOneAndUpdate when no document matches arrayFilters", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 4 } ] } }, "outcome": { "result": { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } } }, { "description": "FindOneAndUpdate when one document matches arrayFilters", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 3 } ] } }, "outcome": { "result": { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 2 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } } }, { "description": "FindOneAndUpdate when multiple documents match arrayFilters", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } }, "outcome": { "result": { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 2 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndUpdate-collation.json000066400000000000000000000022611511661753600331410ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" } ], "minServerVersion": "3.4", "tests": [ { "description": "FindOneAndUpdate when many documents match with collation returning the document before modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "x": "PING" }, "update": { "$set": { "x": "pong" } }, "projection": { "x": 1, "_id": 0 }, "sort": { "_id": 1 }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "x": "ping" }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "pong" }, { "_id": 3, "x": "pINg" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/findOneAndUpdate.json000066400000000000000000000163571511661753600311720ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "FindOneAndUpdate when many documents match returning the document before modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when many documents match returning the document after modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": { "x": 23 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when one document matches returning the document before modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": { "x": 22 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when one document matches returning the document after modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": { "x": 23 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when no documents match returning the document before modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "sort": { "x": 1 } } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when no documents match with upsert returning the document before modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "upsert": true } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } }, { "description": "FindOneAndUpdate when no documents match returning the document after modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 } } }, "outcome": { "result": null, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "FindOneAndUpdate when no documents match with upsert returning the document after modification", "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "projection": { "x": 1, "_id": 0 }, "returnDocument": "After", "sort": { "x": 1 }, "upsert": true } }, "outcome": { "result": { "x": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/insertMany.json000066400000000000000000000060241511661753600301410ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "InsertMany with non-existing documents", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany continue-on-error behavior with unordered (preexisting duplicate key)", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": false } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany continue-on-error behavior with unordered (duplicate key in requests)", "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": false } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/insertOne.json000066400000000000000000000011601511661753600277520ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "InsertOne with a non-existing document", "operation": { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, "outcome": { "result": { "insertedId": 2 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/replaceOne-collation.json000066400000000000000000000016551511661753600320540ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "ReplaceOne when one document matches with collation", "operation": { "name": "replaceOne", "arguments": { "filter": { "x": "PING" }, "replacement": { "_id": 2, "x": "pong" }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "pong" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/replaceOne.json000066400000000000000000000075111511661753600300670ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "minServerVersion": "2.6", "tests": [ { "description": "ReplaceOne when many documents match", "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } }, { "description": "ReplaceOne when one document matches", "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "ReplaceOne when no documents match", "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 1 } } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "ReplaceOne with upsert when no documents match without an id specified", "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 4 }, "replacement": { "x": 1 }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } }, { "description": "ReplaceOne with upsert when no documents match with an id specified", "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 1 }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateMany-arrayFilters.json000066400000000000000000000065241511661753600325710ustar00rootroot00000000000000{ "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ], "minServerVersion": "3.5.6", "tests": [ { "description": "UpdateMany when no documents match arrayFilters", "operation": { "name": "updateMany", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 4 } ] } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } } }, { "description": "UpdateMany when one document matches arrayFilters", "operation": { "name": "updateMany", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 3 } ] } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 2 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } } }, { "description": "UpdateMany when multiple documents match arrayFilters", "operation": { "name": "updateMany", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 2 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 2 } ] } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateMany-collation.json000066400000000000000000000020661511661753600321030ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" }, { "_id": 3, "x": "pINg" } ], "minServerVersion": "3.4", "tests": [ { "description": "UpdateMany when many documents match with collation", "operation": { "name": "updateMany", "arguments": { "filter": { "x": "ping" }, "update": { "$set": { "x": "pong" } }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "pong" }, { "_id": 3, "x": "pong" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateMany.json000066400000000000000000000064461511661753600301270ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "minServerVersion": "2.6", "tests": [ { "description": "UpdateMany when many documents match", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 34 } ] } } }, { "description": "UpdateMany when one document matches", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "UpdateMany when no documents match", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "UpdateMany with upsert when no documents match", "operation": { "name": "updateMany", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateOne-arrayFilters.json000066400000000000000000000166571511661753600324160ustar00rootroot00000000000000{ "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 1 } ] } ] } ], "minServerVersion": "3.5.6", "tests": [ { "description": "UpdateOne when no document matches arrayFilters", "operation": { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 4 } ] } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 1 } ] } ] } ] } } }, { "description": "UpdateOne when one document matches arrayFilters", "operation": { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 3 } ] } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 2 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 1 } ] } ] } ] } } }, { "description": "UpdateOne when multiple documents match arrayFilters", "operation": { "name": "updateOne", "arguments": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 2 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 1 } ] } ] } ] } } }, { "description": "UpdateOne when no documents match multiple arrayFilters", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 3 }, "update": { "$set": { "y.$[i].c.$[j].d": 0 } }, "arrayFilters": [ { "i.b": 5 }, { "j.d": 3 } ] } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 1 } ] } ] } ] } } }, { "description": "UpdateOne when one document matches multiple arrayFilters", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 3 }, "update": { "$set": { "y.$[i].c.$[j].d": 0 } }, "arrayFilters": [ { "i.b": 5 }, { "j.d": 1 } ] } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] }, { "_id": 3, "y": [ { "b": 5, "c": [ { "d": 2 }, { "d": 0 } ] } ] } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateOne-collation.json000066400000000000000000000016661511661753600317250ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "ping" } ], "minServerVersion": "3.4", "tests": [ { "description": "UpdateOne when one document matches with collation", "operation": { "name": "updateOne", "arguments": { "filter": { "x": "PING" }, "update": { "$set": { "x": "pong" } }, "collation": { "locale": "en_US", "strength": 2 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": "pong" } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/legacy/v1/write/updateOne.json000066400000000000000000000057731511661753600277460ustar00rootroot00000000000000{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "minServerVersion": "2.6", "tests": [ { "description": "UpdateOne when many documents match", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } }, { "description": "UpdateOne when one document matches", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "UpdateOne when no documents match", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "UpdateOne with upsert when no documents match", "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/000077500000000000000000000000001511661753600236125ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-allowdiskuse.json000066400000000000000000000066221511661753600311450ustar00rootroot00000000000000{ "description": "aggregate-allowdiskuse", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "Aggregate does not send allowDiskUse when value is not specified", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": {} } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} } ], "allowDiskUse": { "$$exists": false } }, "commandName": "aggregate", "databaseName": "crud-tests" } } ] } ] }, { "description": "Aggregate sends allowDiskUse false when false is specified", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": {} } ], "allowDiskUse": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} } ], "allowDiskUse": false }, "commandName": "aggregate", "databaseName": "crud-tests" } } ] } ] }, { "description": "Aggregate sends allowDiskUse true when true is specified", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": {} } ], "allowDiskUse": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} } ], "allowDiskUse": true }, "commandName": "aggregate", "databaseName": "crud-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-let.json000066400000000000000000000206021511661753600272150ustar00rootroot00000000000000{ "description": "aggregate-let", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] }, { "collectionName": "coll1", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "Aggregate with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 0, "x": "$$x", "y": "$$y", "rand": "$$rand" } } ], "let": { "id": 1, "x": "foo", "y": { "$literal": "$bar" }, "rand": { "$rand": {} } } }, "expectResult": [ { "x": "foo", "y": "$bar", "rand": { "$$type": "double" } } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 0, "x": "$$x", "y": "$$y", "rand": "$$rand" } } ], "let": { "id": 1, "x": "foo", "y": { "$literal": "$bar" }, "rand": { "$rand": {} } } } } } ] } ] }, { "description": "Aggregate with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "2.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "let": { "x": "foo" } }, "expectError": { "errorContains": "unrecognized field 'let'", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": 1 } } ], "let": { "x": "foo" } } } } ] } ] }, { "description": "Aggregate to collection with let option", "runOnRequirements": [ { "minServerVersion": "5.0", "serverless": "forbid" } ], "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 1 } }, { "$out": "coll1" } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 1 } }, { "$out": "coll1" } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll1", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Aggregate to collection with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "2.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 1 } }, { "$out": "coll1" } ], "let": { "id": 1 } }, "expectError": { "errorContains": "unrecognized field 'let'", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "$expr": { "$eq": [ "$_id", "$$id" ] } } }, { "$project": { "_id": 1 } }, { "$out": "coll1" } ], "let": { "id": 1 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-merge-errorResponse.json000066400000000000000000000033311511661753600323760ustar00rootroot00000000000000{ "description": "aggregate-merge-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1 }, { "_id": 2, "x": 1 } ] } ], "tests": [ { "description": "aggregate $merge DuplicateKey error is accessible", "runOnRequirements": [ { "minServerVersion": "5.1", "topologies": [ "single", "replicaset" ] } ], "operations": [ { "name": "aggregate", "object": "database0", "arguments": { "pipeline": [ { "$documents": [ { "_id": 2, "x": 1 } ] }, { "$merge": { "into": "test", "whenMatched": "fail" } } ] }, "expectError": { "errorCode": 11000, "errorResponse": { "keyPattern": { "_id": 1 }, "keyValue": { "_id": 2 } } } } ] } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-merge.json000066400000000000000000000260501511661753600275330ustar00rootroot00000000000000{ "description": "aggregate-merge", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.1.11" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_aggregate_merge" } }, { "collection": { "id": "collection_readConcern_majority", "database": "database0", "collectionName": "test_aggregate_merge", "collectionOptions": { "readConcern": { "level": "majority" } } } }, { "collection": { "id": "collection_readConcern_local", "database": "database0", "collectionName": "test_aggregate_merge", "collectionOptions": { "readConcern": { "level": "local" } } } }, { "collection": { "id": "collection_readConcern_available", "database": "database0", "collectionName": "test_aggregate_merge", "collectionOptions": { "readConcern": { "level": "available" } } } } ], "initialData": [ { "collectionName": "test_aggregate_merge", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Aggregate with $merge", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_merge", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ] } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "Aggregate with $merge and batch size of 0", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ], "batchSize": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_merge", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ], "cursor": {} } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "Aggregate with $merge and majority readConcern", "operations": [ { "object": "collection_readConcern_majority", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_merge", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ], "readConcern": { "level": "majority" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "Aggregate with $merge and local readConcern", "operations": [ { "object": "collection_readConcern_local", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_merge", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ], "readConcern": { "level": "local" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "Aggregate with $merge and available readConcern", "operations": [ { "object": "collection_readConcern_available", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_merge", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_test_collection" } } ], "readConcern": { "level": "available" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-out-readConcern.json000066400000000000000000000222011511661753600314560ustar00rootroot00000000000000{ "description": "aggregate-out-readConcern", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.1.0", "topologies": [ "replicaset", "sharded" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_aggregate_out_readconcern" } }, { "collection": { "id": "collection_readConcern_majority", "database": "database0", "collectionName": "test_aggregate_out_readconcern", "collectionOptions": { "readConcern": { "level": "majority" } } } }, { "collection": { "id": "collection_readConcern_local", "database": "database0", "collectionName": "test_aggregate_out_readconcern", "collectionOptions": { "readConcern": { "level": "local" } } } }, { "collection": { "id": "collection_readConcern_available", "database": "database0", "collectionName": "test_aggregate_out_readconcern", "collectionOptions": { "readConcern": { "level": "available" } } } }, { "collection": { "id": "collection_readConcern_linearizable", "database": "database0", "collectionName": "test_aggregate_out_readconcern", "collectionOptions": { "readConcern": { "level": "linearizable" } } } } ], "initialData": [ { "collectionName": "test_aggregate_out_readconcern", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "readConcern majority with out stage", "operations": [ { "object": "collection_readConcern_majority", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_out_readconcern", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "readConcern": { "level": "majority" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "readConcern local with out stage", "operations": [ { "object": "collection_readConcern_local", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_out_readconcern", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "readConcern": { "level": "local" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "readConcern available with out stage", "operations": [ { "object": "collection_readConcern_available", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_out_readconcern", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "readConcern": { "level": "available" } } } } ] } ], "outcome": [ { "collectionName": "other_test_collection", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "readConcern linearizable with out stage", "operations": [ { "object": "collection_readConcern_linearizable", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ] }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test_aggregate_out_readconcern", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_test_collection" } ], "readConcern": { "level": "linearizable" } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate-write-readPreference.json000066400000000000000000000213411511661753600324740ustar00rootroot00000000000000{ "description": "aggregate-write-readPreference", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "_yamlAnchors": { "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } }, "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "uriOptions": { "readConcernLevel": "local", "w": 1 } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 } } } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Aggregate with $out includes read preference for 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0", "serverless": "forbid" } ], "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "coll1" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "coll1" } ], "$readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Aggregate with $out omits read preference for pre-5.0 server", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.4.99", "serverless": "forbid" } ], "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "coll1" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "coll1" } ], "$readPreference": { "$$exists": false }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Aggregate with $merge includes read preference for 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "coll1" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "coll1" } } ], "$readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Aggregate with $merge omits read preference for pre-5.0 server", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.4.99" } ], "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "coll1" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "coll1" } } ], "$readPreference": { "$$exists": false }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/aggregate.json000066400000000000000000000316041511661753600264370ustar00rootroot00000000000000{ "description": "aggregate", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "aggregate-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "aggregate-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "tests": [ { "description": "aggregate with multiple batches works", "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "batchSize": 2 }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "cursor": { "batchSize": 2 } }, "commandName": "aggregate", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2 }, "commandName": "getMore", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2 }, "commandName": "getMore", "databaseName": "aggregate-tests" } } ] } ] }, { "description": "aggregate with a string comment", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": "comment" }, "object": "collection0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": "comment" } } } ] } ] }, { "description": "aggregate with a document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": { "content": "test" } }, "object": "collection0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": { "content": "test" } } } } ] } ] }, { "description": "aggregate with a document comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": { "content": "test" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "comment": { "content": "test" } }, "commandName": "aggregate", "databaseName": "aggregate-tests" } } ] } ] }, { "description": "aggregate with comment sets comment on getMore", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "batchSize": 2, "comment": { "content": "test" } }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "cursor": { "batchSize": 2 }, "comment": { "content": "test" } }, "commandName": "aggregate", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "content": "test" } }, "commandName": "getMore", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "content": "test" } }, "commandName": "getMore", "databaseName": "aggregate-tests" } } ] } ] }, { "description": "aggregate with comment does not set comment on getMore - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.3.99" } ], "operations": [ { "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "batchSize": 2, "comment": "comment" }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ], "cursor": { "batchSize": 2 }, "comment": "comment" }, "commandName": "aggregate", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "$$exists": false } }, "commandName": "getMore", "databaseName": "aggregate-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "$$exists": false } }, "commandName": "getMore", "databaseName": "aggregate-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-arrayFilters-clientError.json000066400000000000000000000060321511661753600334110ustar00rootroot00000000000000{ "description": "bulkWrite-arrayFilters-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.5.5" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "crud-v2" } } ], "initialData": [ { "collectionName": "crud-v2", "databaseName": "crud-v2", "documents": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } ], "tests": [ { "description": "BulkWrite on server that doesn't support arrayFilters", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": {}, "update": { "$set": { "y.0.b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "BulkWrite on server that doesn't support arrayFilters with arrayFilters on second op", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": {}, "update": { "$set": { "y.0.b": 2 } } } }, { "updateMany": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-arrayFilters.json000066400000000000000000000141611511661753600311250ustar00rootroot00000000000000{ "description": "bulkWrite-arrayFilters", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.5.6" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } ], "tests": [ { "description": "BulkWrite updateOne with arrayFilters", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 3 } ] } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": {}, "u": { "$set": { "y.$[i].b": 2 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "arrayFilters": [ { "i.b": 3 } ] } ], "ordered": true }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "y": [ { "b": 2 }, { "b": 1 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 1 } ] } ] } ] }, { "description": "BulkWrite updateMany with arrayFilters", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": {}, "update": { "$set": { "y.$[i].b": 2 } }, "arrayFilters": [ { "i.b": 1 } ] } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": {}, "u": { "$set": { "y.$[i].b": 2 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "arrayFilters": [ { "i.b": 1 } ] } ], "ordered": true }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "y": [ { "b": 3 }, { "b": 2 } ] }, { "_id": 2, "y": [ { "b": 0 }, { "b": 2 } ] } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-comment.json000066400000000000000000000302751511661753600301240ustar00rootroot00000000000000{ "description": "bulkWrite-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "BulkWrite_comment" } } ], "initialData": [ { "collectionName": "BulkWrite_comment", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 5, "x": "inserted" } } }, { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": "replaced" } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$set": { "x": "updated" } } } }, { "deleteOne": { "filter": { "_id": 3 } } } ], "comment": "comment" }, "expectResult": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 5 } }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "BulkWrite_comment", "documents": [ { "_id": 5, "x": "inserted" } ], "ordered": true, "comment": "comment" } } }, { "commandStartedEvent": { "command": { "update": "BulkWrite_comment", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "x": "replaced" }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": 2 }, "u": { "$set": { "x": "updated" } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true, "comment": "comment" } } }, { "commandStartedEvent": { "command": { "delete": "BulkWrite_comment", "deletes": [ { "q": { "_id": 3 }, "limit": 1 } ], "ordered": true, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_comment", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": "replaced" }, { "_id": 2, "x": "updated" }, { "_id": 4, "x": 44 }, { "_id": 5, "x": "inserted" } ] } ] }, { "description": "BulkWrite with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 5, "x": "inserted" } } }, { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": "replaced" } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$set": { "x": "updated" } } } }, { "deleteOne": { "filter": { "_id": 3 } } } ], "comment": { "key": "value" } }, "expectResult": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 5 } }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "BulkWrite_comment", "documents": [ { "_id": 5, "x": "inserted" } ], "ordered": true, "comment": { "key": "value" } } } }, { "commandStartedEvent": { "command": { "update": "BulkWrite_comment", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "x": "replaced" }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": 2 }, "u": { "$set": { "x": "updated" } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true, "comment": { "key": "value" } } } }, { "commandStartedEvent": { "command": { "delete": "BulkWrite_comment", "deletes": [ { "q": { "_id": 3 }, "limit": 1 } ], "ordered": true, "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_comment", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": "replaced" }, { "_id": 2, "x": "updated" }, { "_id": 4, "x": 44 }, { "_id": 5, "x": "inserted" } ] } ] }, { "description": "BulkWrite with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 5, "x": "inserted" } } }, { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": "replaced" } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$set": { "x": "updated" } } } }, { "deleteOne": { "filter": { "_id": 3 } } } ], "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "BulkWrite_comment", "documents": [ { "_id": 5, "x": "inserted" } ], "ordered": true, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_comment", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-delete-hint-clientError.json000066400000000000000000000075221511661753600331510ustar00rootroot00000000000000{ "description": "bulkWrite-delete-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "BulkWrite_delete_hint" } } ], "initialData": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite deleteOne with hints unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": 1 }, "hint": "_id_" } }, { "deleteOne": { "filter": { "_id": 2 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite deleteMany with hints unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$lt": 3 } }, "hint": "_id_" } }, { "deleteMany": { "filter": { "_id": { "$gte": 4 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-delete-hint-serverError.json000066400000000000000000000126611511661753600332010ustar00rootroot00000000000000{ "description": "bulkWrite-delete-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.3.3" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "BulkWrite_delete_hint" } } ], "initialData": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite deleteOne with hints unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": 1 }, "hint": "_id_" } }, { "deleteOne": { "filter": { "_id": 2 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "BulkWrite_delete_hint", "deletes": [ { "q": { "_id": 1 }, "hint": "_id_", "limit": 1 }, { "q": { "_id": 2 }, "hint": { "_id": 1 }, "limit": 1 } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite deleteMany with hints unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$lt": 3 } }, "hint": "_id_" } }, { "deleteMany": { "filter": { "_id": { "$gte": 4 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "BulkWrite_delete_hint", "deletes": [ { "q": { "_id": { "$lt": 3 } }, "hint": "_id_", "limit": 0 }, { "q": { "_id": { "$gte": 4 } }, "hint": { "_id": 1 }, "limit": 0 } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-delete-hint.json000066400000000000000000000126571511661753600306700ustar00rootroot00000000000000{ "description": "bulkWrite-delete-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.4" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "BulkWrite_delete_hint" } } ], "initialData": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite deleteOne with hints", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": 1 }, "hint": "_id_" } }, { "deleteOne": { "filter": { "_id": 2 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 2, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "BulkWrite_delete_hint", "deletes": [ { "q": { "_id": 1 }, "hint": "_id_", "limit": 1 }, { "q": { "_id": 2 }, "hint": { "_id": 1 }, "limit": 1 } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite deleteMany with hints", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$lt": 3 } }, "hint": "_id_" } }, { "deleteMany": { "filter": { "_id": { "$gte": 4 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 3, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "BulkWrite_delete_hint", "deletes": [ { "q": { "_id": { "$lt": 3 } }, "hint": "_id_", "limit": 0 }, { "q": { "_id": { "$gte": 4 } }, "hint": { "_id": 1 }, "limit": 0 } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "BulkWrite_delete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 3, "x": 33 } ] } ] } ] } bulkWrite-deleteMany-hint-unacknowledged.json000066400000000000000000000135741511661753600344250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-deleteMany-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Unacknowledged deleteMany with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteMany with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteMany with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 0 } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged deleteMany with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 0 } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-deleteMany-let.json000066400000000000000000000103731511661753600313300ustar00rootroot00000000000000{ "description": "BulkWrite deleteMany-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "BulkWrite deleteMany with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } } } } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 0 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "BulkWrite deleteMany with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } } } } ], "let": { "id": 1 } }, "expectError": { "errorContains": "'delete.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 1 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } bulkWrite-deleteOne-hint-unacknowledged.json000066400000000000000000000134701511661753600342350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-deleteOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged deleteOne with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteOne with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteOne with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 1 } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged deleteOne with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 1 } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-deleteOne-let.json000066400000000000000000000103641511661753600311450ustar00rootroot00000000000000{ "description": "BulkWrite deleteOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "BulkWrite deleteOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } } } } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 1 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "BulkWrite deleteOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.9" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } } } } ], "let": { "id": 1 } }, "expectError": { "errorContains": "'delete.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 1 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-errorResponse.json000066400000000000000000000037421511661753600313310ustar00rootroot00000000000000{ "description": "bulkWrite-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "bulkWrite operations support errorResponse assertions", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 8 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1 } } } ] }, "expectError": { "errorCode": 8, "errorResponse": { "code": 8 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-insertOne-dots_and_dollars.json000066400000000000000000000202441511661753600337340ustar00rootroot00000000000000{ "description": "bulkWrite-insertOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "Inserting document with top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "$a": 1 } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 1 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "$a": 1 } ] } ] }, { "description": "Inserting document with top-level dollar-prefixed key on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "$a": 1 } } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] }, { "description": "Inserting document with top-level dotted key", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "a.b": 1 } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 1 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a.b": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Inserting document with dollar-prefixed key in embedded doc", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "a": { "$b": 1 } } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 1 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Inserting document with dotted key in embedded doc", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 1, "a": { "b.c": 1 } } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 1 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] } ] } bulkWrite-replaceOne-dots_and_dollars.json000066400000000000000000000305441511661753600337700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-replaceOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "Replacing document with top-level dotted key on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a.b": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Replacing document with top-level dotted key on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a.b": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "$b": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "$b": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "b.c": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "b.c": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] } ] } bulkWrite-replaceOne-hint-unacknowledged.json000066400000000000000000000152611511661753600344060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-replaceOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged replaceOne with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged replaceOne with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged replaceOne with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged replaceOne with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-replaceOne-let.json000066400000000000000000000117771511661753600313270ustar00rootroot00000000000000{ "description": "BulkWrite replaceOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "BulkWrite replaceOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": 3 } } } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": { "x": 3 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 3 }, { "_id": 2 } ] } ] }, { "description": "BulkWrite replaceOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.9" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": 3 } } } ], "let": { "id": 1 } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": { "x": 3 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-replaceOne-sort.json000066400000000000000000000122501511661753600315150ustar00rootroot00000000000000{ "description": "BulkWrite replaceOne-sort", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "BulkWrite replaceOne with sort option", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "replacement": { "x": 1 } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 1 }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 1 } ] } ] }, { "description": "BulkWrite replaceOne with sort option unsupported (server-side error)", "runOnRequirements": [ { "maxServerVersion": "7.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "replacement": { "x": 1 } } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 1 }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-update-hint-clientError.json000066400000000000000000000136701511661753600331720ustar00rootroot00000000000000{ "description": "bulkWrite-update-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_bulkwrite_update_hint" } } ], "initialData": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite updateOne with update hints unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite updateMany with update hints unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite replaceOne with update hints unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 3 }, "replacement": { "x": 333 }, "hint": "_id_" } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "x": 444 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-update-hint-serverError.json000066400000000000000000000236741511661753600332270ustar00rootroot00000000000000{ "description": "bulkWrite-update-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.1.9" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_bulkwrite_update_hint" } } ], "initialData": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite updateOne with update hints unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": 1 }, "u": { "$inc": { "x": 1 } }, "hint": "_id_", "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": 1 }, "u": { "$inc": { "x": 1 } }, "hint": { "_id": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite updateMany with update hints unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": { "$lt": 3 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": "_id_", "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": { "$lt": 3 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": { "_id": 1 }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite replaceOne with update hints unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 3 }, "replacement": { "x": 333 }, "hint": "_id_" } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "x": 444 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": 3 }, "u": { "x": 333 }, "hint": "_id_", "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } }, { "q": { "_id": 4 }, "u": { "x": 444 }, "hint": { "_id": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-update-hint.json000066400000000000000000000250051511661753600306770ustar00rootroot00000000000000{ "description": "bulkWrite-update-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_bulkwrite_update_hint" } } ], "initialData": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "tests": [ { "description": "BulkWrite updateOne with update hints", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": 1 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": "_id_" }, { "q": { "_id": 1 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "_id": 1 } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 13 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite updateMany with update hints", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } }, { "updateMany": { "filter": { "_id": { "$lt": 3 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 4, "modifiedCount": 4, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": { "$lt": 3 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": "_id_" }, { "q": { "_id": { "$lt": 3 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": { "_id": 1 } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 13 }, { "_id": 2, "x": 24 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "BulkWrite replaceOne with update hints", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 3 }, "replacement": { "x": 333 }, "hint": "_id_" } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "x": 444 }, "hint": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_bulkwrite_update_hint", "updates": [ { "q": { "_id": 3 }, "u": { "x": 333 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": "_id_" }, { "q": { "_id": 4 }, "u": { "x": 444 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "_id": 1 } } ], "ordered": true } } } ] } ], "outcome": [ { "collectionName": "test_bulkwrite_update_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 333 }, { "_id": 4, "x": 444 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-update-validation.json000066400000000000000000000101471511661753600320700ustar00rootroot00000000000000{ "description": "bulkWrite-update-validation", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "BulkWrite replaceOne prohibits atomic modifiers", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "replaceOne": { "filter": { "_id": 1 }, "replacement": { "$set": { "x": 22 } } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "BulkWrite updateOne requires atomic modifiers", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "x": 22 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "BulkWrite updateMany requires atomic modifiers", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "x": 44 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } bulkWrite-updateMany-dots_and_dollars.json000066400000000000000000000263621511661753600340250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-updateMany-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {} } ] } ], "tests": [ { "description": "Updating document to set top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "$a": 1 } ] } ] }, { "description": "Updating document to set top-level dotted key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "a.b": 1 } ] } ] }, { "description": "Updating document to set dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "$a": 1 } } ] } ] }, { "description": "Updating document to set dotted key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "a.b": 1 } } ] } ] } ] } bulkWrite-updateMany-hint-unacknowledged.json000066400000000000000000000156221511661753600344410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-updateMany-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Unacknowledged updateMany with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateMany with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateMany with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged updateMany with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-updateMany-let.json000066400000000000000000000126311511661753600313470ustar00rootroot00000000000000{ "description": "BulkWrite updateMany-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 20 }, { "_id": 2, "x": 21 } ] } ], "tests": [ { "description": "BulkWrite updateMany with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": 21 } } ] } } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": [ { "$set": { "x": 21 } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 21 }, { "_id": 2, "x": 21 } ] } ] }, { "description": "BulkWrite updateMany with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.9" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": 21 } } ] } } ], "let": { "id": 1 } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": [ { "$set": { "x": 21 } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 20 }, { "_id": 2, "x": 21 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-updateOne-dots_and_dollars.json000066400000000000000000000270111511661753600337110ustar00rootroot00000000000000{ "description": "bulkWrite-updateOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {} } ] } ], "tests": [ { "description": "Updating document to set top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "$a": 1 } ] } ] }, { "description": "Updating document to set top-level dotted key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "a.b": 1 } ] } ] }, { "description": "Updating document to set dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "$a": 1 } } ] } ] }, { "description": "Updating document to set dotted key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ] } } ] }, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "a.b": 1 } } ] } ] } ] } bulkWrite-updateOne-hint-unacknowledged.json000066400000000000000000000157341511661753600342620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "bulkWrite-updateOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged updateOne with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateOne with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateOne with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged updateOne with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } ] }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-updateOne-let.json000066400000000000000000000130421511661753600311610ustar00rootroot00000000000000{ "description": "BulkWrite updateOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 20 }, { "_id": 2, "x": 21 } ] } ], "tests": [ { "description": "BulkWrite updateOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": 22 } } ] } } ], "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": [ { "$set": { "x": 22 } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 }, { "_id": 2, "x": 21 } ] } ] }, { "description": "BulkWrite updateOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.9" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": 22 } } ] } } ], "let": { "id": 1 } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": [ { "$set": { "x": 22 } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 20 }, { "_id": 2, "x": 21 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/bulkWrite-updateOne-sort.json000066400000000000000000000131311511661753600313630ustar00rootroot00000000000000{ "description": "BulkWrite updateOne-sort", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "BulkWrite updateOne with sort option", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "update": [ { "$set": { "x": 1 } } ] } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": [ { "$set": { "x": 1 } } ], "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 1 } ] } ] }, { "description": "BulkWrite updateOne with sort option unsupported (server-side error)", "runOnRequirements": [ { "maxServerVersion": "7.99" } ], "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "update": [ { "$set": { "x": 1 } } ] } } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": [ { "$set": { "x": 1 } } ], "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-delete-options.json000066400000000000000000000144331511661753600326670ustar00rootroot00000000000000{ "description": "client bulkWrite delete options", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0", "collation": { "locale": "simple" }, "hint": "_id_" }, "tests": [ { "description": "client bulk write delete with collation", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "collation": { "locale": "simple" } } }, { "deleteMany": { "namespace": "crud-tests.coll0", "filter": { "_id": { "$gt": 1 } }, "collation": { "locale": "simple" } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 3, "insertResults": {}, "updateResults": {}, "deleteResults": { "0": { "deletedCount": 1 }, "1": { "deletedCount": 2 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "delete": 0, "filter": { "_id": 1 }, "collation": { "locale": "simple" }, "multi": false }, { "delete": 0, "filter": { "_id": { "$gt": 1 } }, "collation": { "locale": "simple" }, "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [] } ] }, { "description": "client bulk write delete with hint", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "hint": "_id_" } }, { "deleteMany": { "namespace": "crud-tests.coll0", "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 3, "insertResults": {}, "updateResults": {}, "deleteResults": { "0": { "deletedCount": 1 }, "1": { "deletedCount": 2 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "delete": 0, "filter": { "_id": 1 }, "hint": "_id_", "multi": false }, { "delete": 0, "filter": { "_id": { "$gt": 1 } }, "hint": "_id_", "multi": true } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-errorResponse.json000066400000000000000000000026771511661753600326130ustar00rootroot00000000000000{ "description": "client bulkWrite errorResponse", "schemaVersion": "1.12", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite operations support errorResponse assertions", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 8 } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1 } } } ] }, "expectError": { "errorCode": 8, "errorResponse": { "code": 8 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-errors.json000066400000000000000000000305021511661753600312430ustar00rootroot00000000000000{ "description": "client bulkWrite errors", "schemaVersion": "1.21", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "uriOptions": { "retryWrites": false }, "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0", "writeConcernErrorCode": 91, "writeConcernErrorMessage": "Replication is being shut down", "undefinedVarCode": 17276 }, "tests": [ { "description": "an individual operation fails during an ordered bulkWrite", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 3 } } } ], "verboseResults": true }, "expectError": { "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 1, "insertResults": {}, "updateResults": {}, "deleteResults": { "0": { "deletedCount": 1 } } }, "writeErrors": { "1": { "code": 17276 } } } } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "an individual operation fails during an unordered bulkWrite", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 3 } } } ], "verboseResults": true, "ordered": false }, "expectError": { "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 2, "insertResults": {}, "updateResults": {}, "deleteResults": { "0": { "deletedCount": 1 }, "2": { "deletedCount": 1 } } }, "writeErrors": { "1": { "code": 17276 } } } } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "detailed results are omitted from error when verboseResults is false", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 3 } } } ], "verboseResults": false }, "expectError": { "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 1, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } }, "writeErrors": { "1": { "code": 17276 } } } } ] }, { "description": "a top-level failure occurs during a bulkWrite", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 8 } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "x": 1 } } } ], "verboseResults": true }, "expectError": { "errorCode": 8 } } ] }, { "description": "a bulk write with only errors does not report a partial result", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } } } } ], "verboseResults": true }, "expectError": { "expectResult": { "$$unsetOrMatches": {} }, "writeErrors": { "0": { "code": 17276 } } } } ] }, { "description": "a write concern error occurs during a bulkWrite", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 10 } } } ], "verboseResults": true }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 10 } }, "updateResults": {}, "deleteResults": {} }, "writeConcernErrors": [ { "code": 91, "message": "Replication is being shut down" } ] } } ] }, { "description": "an empty list of write models is a client-side error", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [], "verboseResults": true }, "expectError": { "isClientError": true } } ] }, { "description": "Requesting unacknowledged write with verboseResults is a client-side error", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 10 } } } ], "verboseResults": true, "ordered": false, "writeConcern": { "w": 0 } }, "expectError": { "isClientError": true, "errorContains": "Cannot request unacknowledged write concern and verbose results" } } ] }, { "description": "Requesting unacknowledged write with ordered is a client-side error", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 10 } } } ], "writeConcern": { "w": 0 } }, "expectError": { "isClientError": true, "errorContains": "Cannot request unacknowledged write concern and ordered writes" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-mixed-namespaces.json000066400000000000000000000160371511661753600331610ustar00rootroot00000000000000{ "description": "client bulkWrite with mixed namespaces", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } }, { "database": { "id": "database1", "client": "client0", "databaseName": "db1" } }, { "collection": { "id": "collection2", "database": "database1", "collectionName": "coll2" } } ], "initialData": [ { "databaseName": "db0", "collectionName": "coll0", "documents": [] }, { "databaseName": "db0", "collectionName": "coll1", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] }, { "databaseName": "db1", "collectionName": "coll2", "documents": [ { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "_yamlAnchors": { "db0Coll0Namespace": "db0.coll0", "db0Coll1Namespace": "db0.coll1", "db1Coll2Namespace": "db1.coll2" }, "tests": [ { "description": "client bulkWrite with mixed namespaces", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "db0.coll0", "document": { "_id": 1 } } }, { "insertOne": { "namespace": "db0.coll0", "document": { "_id": 2 } } }, { "updateOne": { "namespace": "db0.coll1", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "namespace": "db1.coll2", "filter": { "_id": 3 } } }, { "deleteOne": { "namespace": "db0.coll1", "filter": { "_id": 2 } } }, { "replaceOne": { "namespace": "db1.coll2", "filter": { "_id": 4 }, "replacement": { "x": 45 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 2, "upsertedCount": 0, "matchedCount": 2, "modifiedCount": 2, "deletedCount": 2, "insertResults": { "0": { "insertedId": 1 }, "1": { "insertedId": 2 } }, "updateResults": { "2": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "5": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": { "3": { "deletedCount": 1 }, "4": { "deletedCount": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "bulkWrite": 1, "ops": [ { "insert": 0, "document": { "_id": 1 } }, { "insert": 0, "document": { "_id": 2 } }, { "update": 1, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "delete": 2, "filter": { "_id": 3 }, "multi": false }, { "delete": 1, "filter": { "_id": 2 }, "multi": false }, { "update": 2, "filter": { "_id": 4 }, "updateMods": { "x": 45 }, "multi": false } ], "nsInfo": [ { "ns": "db0.coll0" }, { "ns": "db0.coll1" }, { "ns": "db1.coll2" } ] } } } ] } ], "outcome": [ { "databaseName": "db0", "collectionName": "coll0", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, { "databaseName": "db0", "collectionName": "coll1", "documents": [ { "_id": 1, "x": 12 } ] }, { "databaseName": "db1", "collectionName": "coll2", "documents": [ { "_id": 4, "x": 45 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-options.json000066400000000000000000000421541511661753600314300ustar00rootroot00000000000000{ "description": "client bulkWrite top-level options", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "client": { "id": "writeConcernClient", "uriOptions": { "w": 1 }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0", "comment": { "bulk": "write" }, "let": { "id1": 1, "id2": 2 }, "writeConcern": { "w": "majority" } }, "tests": [ { "description": "client bulkWrite comment", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "comment": { "bulk": "write" }, "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "comment": { "bulk": "write" }, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "client bulkWrite bypassDocumentValidation", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "bypassDocumentValidation": true, "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "bypassDocumentValidation": true, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "client bulkWrite let", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id1" ] } }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } } } } ], "let": { "id1": 1, "id2": 2 }, "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 1, "modifiedCount": 1, "deletedCount": 1, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": { "1": { "deletedCount": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "let": { "id1": 1, "id2": 2 }, "ops": [ { "update": 0, "filter": { "$expr": { "$eq": [ "$_id", "$$id1" ] } }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "delete": 0, "filter": { "$expr": { "$eq": [ "$_id", "$$id2" ] } }, "multi": false } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "x": 12 } ] } ] }, { "description": "client bulkWrite bypassDocumentValidation: false is sent", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "bypassDocumentValidation": false, "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "bypassDocumentValidation": false, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "client bulkWrite writeConcern", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "writeConcern": { "w": "majority" }, "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "writeConcern": { "w": "majority" }, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ] }, { "description": "client bulkWrite inherits writeConcern from client", "operations": [ { "object": "writeConcernClient", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "writeConcernClient", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "writeConcern": { "w": 1 }, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ] }, { "description": "client bulkWrite writeConcern option overrides client writeConcern", "operations": [ { "object": "writeConcernClient", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 3, "x": 33 } } } ], "writeConcern": { "w": "majority" }, "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 3 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "writeConcernClient", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "writeConcern": { "w": "majority" }, "ops": [ { "insert": 0, "document": { "_id": 3, "x": 33 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-ordered.json000066400000000000000000000152771511661753600313670ustar00rootroot00000000000000{ "description": "client bulkWrite with ordered option", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite with ordered: false", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "verboseResults": true, "ordered": false }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 1 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": false, "ops": [ { "insert": 0, "document": { "_id": 1, "x": 11 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] }, { "description": "client bulkWrite with ordered: true", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "verboseResults": true, "ordered": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 1 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 1, "x": 11 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] }, { "description": "client bulkWrite defaults to ordered: true", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 1 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 1, "x": 11 } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-partialResults.json000066400000000000000000000334361511661753600327560ustar00rootroot00000000000000{ "description": "client bulkWrite partial results", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0", "newDocument": { "_id": 2, "x": 22 } }, "tests": [ { "description": "partialResult is unset when first operation fails during an ordered bulk write (verbose)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } } ], "ordered": true, "verboseResults": true }, "expectError": { "expectResult": { "$$unsetOrMatches": { "insertedCount": { "$$exists": false }, "upsertedCount": { "$$exists": false }, "matchedCount": { "$$exists": false }, "modifiedCount": { "$$exists": false }, "deletedCount": { "$$exists": false }, "insertResults": { "$$exists": false }, "updateResults": { "$$exists": false }, "deleteResults": { "$$exists": false } } } } } ] }, { "description": "partialResult is unset when first operation fails during an ordered bulk write (summary)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } } ], "ordered": true, "verboseResults": false }, "expectError": { "expectResult": { "$$unsetOrMatches": { "insertedCount": { "$$exists": false }, "upsertedCount": { "$$exists": false }, "matchedCount": { "$$exists": false }, "modifiedCount": { "$$exists": false }, "deletedCount": { "$$exists": false }, "insertResults": { "$$exists": false }, "updateResults": { "$$exists": false }, "deleteResults": { "$$exists": false } } } } } ] }, { "description": "partialResult is set when second operation fails during an ordered bulk write (verbose)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "ordered": true, "verboseResults": true }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 2 } }, "updateResults": {}, "deleteResults": {} } } } ] }, { "description": "partialResult is set when second operation fails during an ordered bulk write (summary)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "ordered": true, "verboseResults": false }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } } ] }, { "description": "partialResult is unset when all operations fail during an unordered bulk write", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "ordered": false }, "expectError": { "expectResult": { "$$unsetOrMatches": { "insertedCount": { "$$exists": false }, "upsertedCount": { "$$exists": false }, "matchedCount": { "$$exists": false }, "modifiedCount": { "$$exists": false }, "deletedCount": { "$$exists": false }, "insertResults": { "$$exists": false }, "updateResults": { "$$exists": false }, "deleteResults": { "$$exists": false } } } } } ] }, { "description": "partialResult is set when first operation fails during an unordered bulk write (verbose)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } } ], "ordered": false, "verboseResults": true }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "1": { "insertedId": 2 } }, "updateResults": {}, "deleteResults": {} } } } ] }, { "description": "partialResult is set when first operation fails during an unordered bulk write (summary)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } } ], "ordered": false, "verboseResults": false }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } } ] }, { "description": "partialResult is set when second operation fails during an unordered bulk write (verbose)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "ordered": false, "verboseResults": true }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 2 } }, "updateResults": {}, "deleteResults": {} } } } ] }, { "description": "partialResult is set when first operation fails during an unordered bulk write (summary)", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 2, "x": 22 } } }, { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 1, "x": 11 } } } ], "ordered": false, "verboseResults": false }, "expectError": { "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-replaceOne-sort.json000066400000000000000000000070401511661753600327720ustar00rootroot00000000000000{ "description": "client bulkWrite updateOne-sort", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite replaceOne with sort option", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "replacement": { "x": 1 } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "ops": [ { "update": 0, "filter": { "_id": { "$gt": 1 } }, "updateMods": { "x": 1 }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "nErrors": 0, "nMatched": 1, "nModified": 1 }, "commandName": "bulkWrite" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-results.json000066400000000000000000000522521511661753600314360ustar00rootroot00000000000000{ "description": "client bulkWrite results", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite with verboseResults: true returns detailed results", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 8, "x": 88 } } }, { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$inc": { "x": 2 } } } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 4 }, "replacement": { "x": 44 }, "upsert": true } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 5 } } }, { "deleteMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 1, "matchedCount": 3, "modifiedCount": 3, "deletedCount": 3, "insertResults": { "0": { "insertedId": 8 } }, "updateResults": { "1": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } }, "3": { "matchedCount": 1, "modifiedCount": 0, "upsertedId": 4 } }, "deleteResults": { "4": { "deletedCount": 1 }, "5": { "deletedCount": 2 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 8, "x": 88 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$inc": { "x": 2 } }, "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "x": 44 }, "upsert": true, "multi": false }, { "delete": 0, "filter": { "_id": 5 }, "multi": false }, { "delete": 0, "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] }, "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 24 }, { "_id": 3, "x": 35 }, { "_id": 4, "x": 44 }, { "_id": 8, "x": 88 } ] } ] }, { "description": "client bulkWrite with verboseResults: false omits detailed results", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 8, "x": 88 } } }, { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$inc": { "x": 2 } } } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 4 }, "replacement": { "x": 44 }, "upsert": true } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 5 } } }, { "deleteMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] } } } ], "verboseResults": false }, "expectResult": { "insertedCount": 1, "upsertedCount": 1, "matchedCount": 3, "modifiedCount": 3, "deletedCount": 3, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 8, "x": 88 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$inc": { "x": 2 } }, "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "x": 44 }, "upsert": true, "multi": false }, { "delete": 0, "filter": { "_id": 5 }, "multi": false }, { "delete": 0, "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] }, "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 24 }, { "_id": 3, "x": 35 }, { "_id": 4, "x": 44 }, { "_id": 8, "x": 88 } ] } ] }, { "description": "client bulkWrite defaults to verboseResults: false", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "crud-tests.coll0", "document": { "_id": 8, "x": 88 } } }, { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$inc": { "x": 2 } } } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 4 }, "replacement": { "x": 44 }, "upsert": true } }, { "deleteOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 5 } } }, { "deleteMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] } } } ] }, "expectResult": { "insertedCount": 1, "upsertedCount": 1, "matchedCount": 3, "modifiedCount": 3, "deletedCount": 3, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 8, "x": 88 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$inc": { "x": 2 } }, "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "x": 44 }, "upsert": true, "multi": false }, { "delete": 0, "filter": { "_id": 5 }, "multi": false }, { "delete": 0, "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] }, "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 24 }, { "_id": 3, "x": 35 }, { "_id": 4, "x": 44 }, { "_id": 8, "x": 88 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-update-options.json000066400000000000000000000564421511661753600327150ustar00rootroot00000000000000{ "description": "client bulkWrite update options", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "array": [ 1, 2, 3 ] }, { "_id": 2, "array": [ 1, 2, 3 ] }, { "_id": 3, "array": [ 1, 2, 3 ] }, { "_id": 4, "array": [ 1, 2, 3 ] } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0", "collation": { "locale": "simple" }, "hint": "_id_" }, "tests": [ { "description": "client bulkWrite update with arrayFilters", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$set": { "array.$[i]": 4 } }, "arrayFilters": [ { "i": { "$gte": 2 } } ] } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$set": { "array.$[i]": 5 } }, "arrayFilters": [ { "i": { "$gte": 2 } } ] } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 3, "modifiedCount": 3, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "1": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$set": { "array.$[i]": 4 } }, "arrayFilters": [ { "i": { "$gte": 2 } } ], "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$set": { "array.$[i]": 5 } }, "arrayFilters": [ { "i": { "$gte": 2 } } ], "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "array": [ 1, 4, 4 ] }, { "_id": 2, "array": [ 1, 5, 5 ] }, { "_id": 3, "array": [ 1, 5, 5 ] }, { "_id": 4, "array": [ 1, 2, 3 ] } ] } ] }, { "description": "client bulkWrite update with collation", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$set": { "array": [ 1, 2, 4 ] } }, "collation": { "locale": "simple" } } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$set": { "array": [ 1, 2, 5 ] } }, "collation": { "locale": "simple" } } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 4 }, "replacement": { "array": [ 1, 2, 6 ] }, "collation": { "locale": "simple" } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "1": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$set": { "array": [ 1, 2, 4 ] } }, "collation": { "locale": "simple" }, "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$set": { "array": [ 1, 2, 5 ] } }, "collation": { "locale": "simple" }, "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "array": [ 1, 2, 6 ] }, "collation": { "locale": "simple" }, "multi": false } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "array": [ 1, 2, 4 ] }, { "_id": 2, "array": [ 1, 2, 5 ] }, { "_id": 3, "array": [ 1, 2, 5 ] }, { "_id": 4, "array": [ 1, 2, 6 ] } ] } ] }, { "description": "client bulkWrite update with hint", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "$set": { "array": [ 1, 2, 4 ] } }, "hint": "_id_" } }, { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$set": { "array": [ 1, 2, 5 ] } }, "hint": "_id_" } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 4 }, "replacement": { "array": [ 1, 2, 6 ] }, "hint": "_id_" } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 4, "modifiedCount": 4, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "1": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$set": { "array": [ 1, 2, 4 ] } }, "hint": "_id_", "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$set": { "array": [ 1, 2, 5 ] } }, "hint": "_id_", "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "array": [ 1, 2, 6 ] }, "hint": "_id_", "multi": false } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "array": [ 1, 2, 4 ] }, { "_id": 2, "array": [ 1, 2, 5 ] }, { "_id": 3, "array": [ 1, 2, 5 ] }, { "_id": 4, "array": [ 1, 2, 6 ] } ] } ] }, { "description": "client bulkWrite update with upsert", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 5 }, "update": { "$set": { "array": [ 1, 2, 4 ] } }, "upsert": true } }, { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 6 }, "replacement": { "array": [ 1, 2, 6 ] }, "upsert": true } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 0, "upsertedId": 5 }, "1": { "matchedCount": 1, "modifiedCount": 0, "upsertedId": 6 } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 5 }, "updateMods": { "$set": { "array": [ 1, 2, 4 ] } }, "upsert": true, "multi": false }, { "update": 0, "filter": { "_id": 6 }, "updateMods": { "array": [ 1, 2, 6 ] }, "upsert": true, "multi": false } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "array": [ 1, 2, 3 ] }, { "_id": 2, "array": [ 1, 2, 3 ] }, { "_id": 3, "array": [ 1, 2, 3 ] }, { "_id": 4, "array": [ 1, 2, 3 ] }, { "_id": 5, "array": [ 1, 2, 4 ] }, { "_id": 6, "array": [ 1, 2, 6 ] } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-update-pipeline.json000066400000000000000000000136361511661753600330250ustar00rootroot00000000000000{ "description": "client bulkWrite update pipeline", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1 }, { "_id": 2, "x": 2 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite updateOne with pipeline", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": [ { "$addFields": { "foo": 1 } } ] } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 1, "modifiedCount": 1, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": [ { "$addFields": { "foo": 1 } } ], "multi": false } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "x": 1, "foo": 1 }, { "_id": 2, "x": 2 } ] } ] }, { "description": "client bulkWrite updateMany with pipeline", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateMany": { "namespace": "crud-tests.coll0", "filter": {}, "update": [ { "$addFields": { "foo": 1 } } ] } } ], "verboseResults": true }, "expectResult": { "insertedCount": 0, "upsertedCount": 0, "matchedCount": 2, "modifiedCount": 2, "deletedCount": 0, "insertResults": {}, "updateResults": { "0": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } } }, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "update": 0, "filter": {}, "updateMods": [ { "$addFields": { "foo": 1 } } ], "multi": true } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } } ] } ], "outcome": [ { "databaseName": "crud-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "x": 1, "foo": 1 }, { "_id": 2, "x": 2, "foo": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-update-validation.json000066400000000000000000000105311511661753600333410ustar00rootroot00000000000000{ "description": "client-bulkWrite-update-validation", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite replaceOne prohibits atomic modifiers", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [ { "replaceOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "replacement": { "$set": { "x": 22 } } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "client bulkWrite updateOne requires atomic modifiers", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": 1 }, "update": { "x": 22 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "client bulkWrite updateMany requires atomic modifiers", "operations": [ { "name": "clientBulkWrite", "object": "client0", "arguments": { "models": [ { "updateMany": { "namespace": "crud-tests.coll0", "filter": { "_id": { "$gt": 1 } }, "update": { "x": 44 } } } ] }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/client-bulkWrite-updateOne-sort.json000066400000000000000000000072161511661753600326460ustar00rootroot00000000000000{ "description": "client bulkWrite updateOne-sort", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "crud-tests.coll0" }, "tests": [ { "description": "client bulkWrite updateOne with sort option", "operations": [ { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateOne": { "namespace": "crud-tests.coll0", "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "update": { "$inc": { "x": 1 } } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "ops": [ { "update": 0, "filter": { "_id": { "$gt": 1 } }, "updateMods": { "$inc": { "x": 1 } }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "nsInfo": [ { "ns": "crud-tests.coll0" } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "nErrors": 0, "nMatched": 1, "nModified": 1 }, "commandName": "bulkWrite" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/countDocuments-comment.json000066400000000000000000000112641511661753600311630ustar00rootroot00000000000000{ "description": "countDocuments-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "countDocuments-comments-test" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "countDocuments-comments-test", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "countDocuments with document comment", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "countDocuments", "object": "collection0", "arguments": { "filter": {}, "comment": { "key": "value" } }, "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "comment": { "key": "value" } }, "commandName": "aggregate", "databaseName": "countDocuments-comments-test" } } ] } ] }, { "description": "countDocuments with string comment", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "operations": [ { "name": "countDocuments", "object": "collection0", "arguments": { "filter": {}, "comment": "comment" }, "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "comment": "comment" }, "commandName": "aggregate", "databaseName": "countDocuments-comments-test" } } ] } ] }, { "description": "countDocuments with document comment on less than 4.4.0 - server error", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.3.99" } ], "operations": [ { "name": "countDocuments", "object": "collection0", "arguments": { "filter": {}, "comment": { "key": "value" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "comment": { "key": "value" } }, "commandName": "aggregate", "databaseName": "countDocuments-comments-test" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/db-aggregate-write-readPreference.json000066400000000000000000000222161511661753600330610ustar00rootroot00000000000000{ "description": "db-aggregate-write-readPreference", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ], "serverless": "forbid" } ], "_yamlAnchors": { "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } }, "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "uriOptions": { "readConcernLevel": "local", "w": 1 } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0", "databaseOptions": { "readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 } } } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "tests": [ { "description": "Database-level aggregate with $out includes read preference for 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0", "serverless": "forbid" } ], "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$out": "coll0" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$out": "coll0" } ], "$readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Database-level aggregate with $out omits read preference for pre-5.0 server", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.4.99", "serverless": "forbid" } ], "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$out": "coll0" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$out": "coll0" } ], "$readPreference": { "$$exists": false }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Database-level aggregate with $merge includes read preference for 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$merge": { "into": "coll0" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$merge": { "into": "coll0" } } ], "$readPreference": { "mode": "secondaryPreferred", "maxStalenessSeconds": 600 }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] }, { "description": "Database-level aggregate with $merge omits read preference for pre-5.0 server", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.4.99" } ], "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$merge": { "into": "coll0" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "_id": 1 } }, { "$project": { "_id": 1 } }, { "$merge": { "into": "coll0" } } ], "$readPreference": { "$$exists": false }, "readConcern": { "level": "local" }, "writeConcern": { "w": 1 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/db-aggregate.json000066400000000000000000000042211511661753600270150ustar00rootroot00000000000000{ "description": "db-aggregate", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "3.6.0", "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "admin" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "crud-v2" } } ], "tests": [ { "description": "Aggregate with $listLocalSessions", "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "dummy": "dummy field" } }, { "$project": { "_id": 0, "dummy": 1 } } ] }, "expectResult": [ { "dummy": "dummy field" } ] } ] }, { "description": "Aggregate with $listLocalSessions and allowDiskUse", "operations": [ { "object": "database0", "name": "aggregate", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "dummy": "dummy field" } }, { "$project": { "_id": 0, "dummy": 1 } } ], "allowDiskUse": true }, "expectResult": [ { "dummy": "dummy field" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-comment.json000066400000000000000000000120161511661753600302340ustar00rootroot00000000000000{ "description": "deleteMany-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name2" }, { "_id": 3, "name": "name3" } ] } ], "tests": [ { "description": "deleteMany with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "deleteMany", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "comment": "comment" }, "expectResult": { "deletedCount": 2 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 0 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "deleteMany with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "deleteMany", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "comment": { "key": "value" } }, "expectResult": { "deletedCount": 2 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 0 } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "deleteMany with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "deleteMany", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "limit": 0 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name2" }, { "_id": 3, "name": "name3" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-hint-clientError.json000066400000000000000000000054531511661753600320310ustar00rootroot00000000000000{ "description": "deleteMany-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteMany_hint" } } ], "initialData": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "DeleteMany with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "DeleteMany with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-hint-serverError.json000066400000000000000000000075551511661753600320660ustar00rootroot00000000000000{ "description": "deleteMany-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.3.3" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteMany_hint" } } ], "initialData": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "DeleteMany with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteMany_hint", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": "_id_", "limit": 0 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "DeleteMany with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteMany_hint", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 }, "limit": 0 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-hint-unacknowledged.json000066400000000000000000000123461511661753600325320ustar00rootroot00000000000000{ "description": "deleteMany-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Unacknowledged deleteMany with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteMany with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteMany with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 0 } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged deleteMany with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 0 } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-hint.json000066400000000000000000000067301511661753600275420ustar00rootroot00000000000000{ "description": "deleteMany-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.4" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteMany_hint" } } ], "initialData": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "DeleteMany with hint string", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectResult": { "deletedCount": 2 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteMany_hint", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": "_id_", "limit": 0 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 } ] } ] }, { "description": "DeleteMany with hint document", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "deletedCount": 2 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteMany_hint", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 }, "limit": 0 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteMany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteMany-let.json000066400000000000000000000103071511661753600273570ustar00rootroot00000000000000{ "description": "deleteMany-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ], "tests": [ { "description": "deleteMany with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "deleteMany", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "let": { "name": "name" } }, "expectResult": { "deletedCount": 2 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "limit": 0 } ], "let": { "name": "name" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "deleteMany with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "deleteMany", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "let": { "name": "name" } }, "expectError": { "errorContains": "'delete.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "limit": 0 } ], "let": { "name": "name" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-comment.json000066400000000000000000000116611511661753600300560ustar00rootroot00000000000000{ "description": "deleteOne-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ], "tests": [ { "description": "deleteOne with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": "comment" }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ] }, { "description": "deleteOne with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": { "key": "value" } }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ] }, { "description": "deleteOne with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-errorResponse.json000066400000000000000000000035061511661753600312630ustar00rootroot00000000000000{ "description": "deleteOne-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "delete operations support errorResponse assertions", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 8 } } } }, { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "_id": 1 } }, "expectError": { "errorCode": 8, "errorResponse": { "code": 8 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-hint-clientError.json000066400000000000000000000047771511661753600316560ustar00rootroot00000000000000{ "description": "deleteOne-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteOne_hint" } } ], "initialData": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "DeleteOne with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "DeleteOne with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-hint-serverError.json000066400000000000000000000067051511661753600316770ustar00rootroot00000000000000{ "description": "deleteOne-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.3.3" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteOne_hint" } } ], "initialData": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "DeleteOne with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteOne_hint", "deletes": [ { "q": { "_id": 1 }, "hint": "_id_", "limit": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "DeleteOne with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteOne_hint", "deletes": [ { "q": { "_id": 1 }, "hint": { "_id": 1 }, "limit": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-hint-unacknowledged.json000066400000000000000000000122421511661753600323420ustar00rootroot00000000000000{ "description": "deleteOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged deleteOne with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteOne with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged deleteOne with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 1 } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged deleteOne with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "_id": { "$gt": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "limit": 1 } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-hint.json000066400000000000000000000063061511661753600273560ustar00rootroot00000000000000{ "description": "deleteOne-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.4" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "DeleteOne_hint" } } ], "initialData": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "DeleteOne with hint string", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteOne_hint", "deletes": [ { "q": { "_id": 1 }, "hint": "_id_", "limit": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "deleteOne with hint document", "operations": [ { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "DeleteOne_hint", "deletes": [ { "q": { "_id": 1 }, "hint": { "_id": 1 }, "limit": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "DeleteOne_hint", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/deleteOne-let.json000066400000000000000000000077161511661753600272060ustar00rootroot00000000000000{ "description": "deleteOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "deleteOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } }, "expectResult": { "deletedCount": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 1 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "deleteOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } }, "expectError": { "errorContains": "'delete.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "coll0", "deletes": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "limit": 1 } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/estimatedDocumentCount-comment.json000066400000000000000000000071411511661753600326370ustar00rootroot00000000000000{ "description": "estimatedDocumentCount-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "edc-comment-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "edc-comment-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "estimatedDocumentCount with document comment", "runOnRequirements": [ { "minServerVersion": "4.4.14" } ], "operations": [ { "name": "estimatedDocumentCount", "object": "collection0", "arguments": { "comment": { "key": "value" } }, "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0", "comment": { "key": "value" } }, "commandName": "count", "databaseName": "edc-comment-tests" } } ] } ] }, { "description": "estimatedDocumentCount with string comment", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "estimatedDocumentCount", "object": "collection0", "arguments": { "comment": "comment" }, "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0", "comment": "comment" }, "commandName": "count", "databaseName": "edc-comment-tests" } } ] } ] }, { "description": "estimatedDocumentCount with document comment - pre 4.4.14, server error", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.13", "topologies": [ "single", "replicaset" ] } ], "operations": [ { "name": "estimatedDocumentCount", "object": "collection0", "arguments": { "comment": { "key": "value" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0", "comment": { "key": "value" } }, "commandName": "count", "databaseName": "edc-comment-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/estimatedDocumentCount.json000066400000000000000000000175751511661753600312130ustar00rootroot00000000000000{ "description": "estimatedDocumentCount", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "uriOptions": { "retryReads": false }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "edc-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } }, { "collection": { "id": "collection0View", "database": "database0", "collectionName": "coll0view" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "edc-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "estimatedDocumentCount always uses count", "operations": [ { "name": "estimatedDocumentCount", "object": "collection0", "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0" }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] }, { "description": "estimatedDocumentCount with maxTimeMS", "operations": [ { "name": "estimatedDocumentCount", "object": "collection0", "arguments": { "maxTimeMS": 6000 }, "expectResult": 3 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0", "maxTimeMS": 6000 }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] }, { "description": "estimatedDocumentCount on non-existent collection", "operations": [ { "name": "estimatedDocumentCount", "object": "collection1", "expectResult": 0 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll1" }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] }, { "description": "estimatedDocumentCount errors correctly--command error", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 8 } } } }, { "name": "estimatedDocumentCount", "object": "collection0", "expectError": { "errorCode": 8 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0" }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] }, { "description": "estimatedDocumentCount errors correctly--socket error", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "closeConnection": true } } } }, { "name": "estimatedDocumentCount", "object": "collection0", "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "count": "coll0" }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] }, { "description": "estimatedDocumentCount works correctly on views", "runOnRequirements": [ { "minServerVersion": "3.4.0" } ], "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "coll0view" } }, { "name": "createCollection", "object": "database0", "arguments": { "collection": "coll0view", "viewOn": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ] } }, { "name": "estimatedDocumentCount", "object": "collection0View", "expectResult": 2 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "coll0view" }, "commandName": "drop", "databaseName": "edc-tests" } }, { "commandStartedEvent": { "command": { "create": "coll0view", "viewOn": "coll0", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } } ] }, "commandName": "create", "databaseName": "edc-tests" } }, { "commandStartedEvent": { "command": { "count": "coll0view" }, "commandName": "count", "databaseName": "edc-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find-allowdiskuse-clientError.json000066400000000000000000000031131511661753600324150ustar00rootroot00000000000000{ "description": "find-allowdiskuse-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.0.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_find_allowdiskuse_clienterror" } } ], "tests": [ { "description": "Find fails when allowDiskUse true is specified against pre 3.2 server", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Find fails when allowDiskUse false is specified against pre 3.2 server", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": false }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find-allowdiskuse-serverError.json000066400000000000000000000042741511661753600324560ustar00rootroot00000000000000{ "description": "find-allowdiskuse-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.2", "maxServerVersion": "4.3.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_find_allowdiskuse_servererror" } } ], "tests": [ { "description": "Find fails when allowDiskUse true is specified against pre 4.4 server (server-side error)", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": true }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test_find_allowdiskuse_servererror", "filter": {}, "allowDiskUse": true } } } ] } ] }, { "description": "Find fails when allowDiskUse false is specified against pre 4.4 server (server-side error)", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": false }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test_find_allowdiskuse_servererror", "filter": {}, "allowDiskUse": false } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find-allowdiskuse.json000066400000000000000000000047601511661753600301400ustar00rootroot00000000000000{ "description": "find-allowdiskuse", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.1" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_find_allowdiskuse" } } ], "tests": [ { "description": "Find does not send allowDiskUse when value is not specified", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test_find_allowdiskuse", "allowDiskUse": { "$$exists": false } } } } ] } ] }, { "description": "Find sends allowDiskUse false when false is specified", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test_find_allowdiskuse", "allowDiskUse": false } } } ] } ] }, { "description": "Find sends allowDiskUse true when true is specified", "operations": [ { "object": "collection0", "name": "find", "arguments": { "filter": {}, "allowDiskUse": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test_find_allowdiskuse", "allowDiskUse": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find-comment.json000066400000000000000000000206661511661753600270770ustar00rootroot00000000000000{ "description": "find-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "tests": [ { "description": "find with string comment", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": "comment" }, "expectResult": [ { "_id": 1 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": 1 }, "comment": "comment" } } } ] } ] }, { "description": "find with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": { "key": "value" } }, "expectResult": [ { "_id": 1 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": 1 }, "comment": { "key": "value" } } } } ] } ] }, { "description": "find with document comment - pre 4.4", "runOnRequirements": [ { "maxServerVersion": "4.2.99", "minServerVersion": "3.6" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": { "key": "value" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": 1 }, "comment": { "key": "value" } } } } ] } ] }, { "description": "find with comment sets comment on getMore", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "batchSize": 2, "comment": { "key": "value" } }, "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": { "$gt": 1 } }, "batchSize": 2, "comment": { "key": "value" } } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "key": "value" } } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "key": "value" } } } } ] } ] }, { "description": "find with comment does not set comment on getMore - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.3.99" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "batchSize": 2, "comment": "comment" }, "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": { "$gt": 1 } }, "batchSize": 2, "comment": "comment" } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "$$exists": false } } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2, "comment": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find-let.json000066400000000000000000000056501511661753600262150ustar00rootroot00000000000000{ "description": "find-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Find with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } }, "expectResult": [ { "_id": 1 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } } } } ] } ] }, { "description": "Find with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "let": { "x": 1 } }, "expectError": { "errorContains": "Unrecognized field 'let'", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": 1 }, "let": { "x": 1 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/find.json000066400000000000000000000062461511661753600254350ustar00rootroot00000000000000{ "description": "find", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "find-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "find-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "tests": [ { "description": "find with multiple batches works", "operations": [ { "name": "find", "arguments": { "filter": { "_id": { "$gt": 1 } }, "batchSize": 2 }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": { "_id": { "$gt": 1 } }, "batchSize": 2 }, "commandName": "find", "databaseName": "find-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2 }, "commandName": "getMore", "databaseName": "find-tests" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "coll0", "batchSize": 2 }, "commandName": "getMore", "databaseName": "find-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-comment.json000066400000000000000000000104041511661753600312740ustar00rootroot00000000000000{ "description": "findOneAndDelete-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndDelete with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndDelete", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": "comment" }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "remove": true, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "findOneAndDelete with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndDelete", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": { "key": "value" } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "remove": true, "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "findOneAndDelete with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "findOneAndDelete", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "remove": true, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-hint-clientError.json000066400000000000000000000050361511661753600330670ustar00rootroot00000000000000{ "description": "findOneAndDelete-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndDelete_hint" } } ], "initialData": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndDelete with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndDelete with hint document", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-hint-serverError.json000066400000000000000000000065021511661753600331160ustar00rootroot00000000000000{ "description": "findOneAndDelete-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.3.3" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndDelete_hint" } } ], "initialData": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndDelete with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndDelete_hint", "query": { "_id": 1 }, "hint": "_id_", "remove": true } } } ] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndDelete with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndDelete_hint", "query": { "_id": 1 }, "hint": { "_id": 1 }, "remove": true } } } ] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-hint-unacknowledged.json000066400000000000000000000114271511661753600335720ustar00rootroot00000000000000{ "description": "findOneAndDelete-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged findOneAndDelete with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndDelete with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndDelete with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "remove": true, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged findOneAndDelete with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": { "$gt": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "remove": true, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-hint.json000066400000000000000000000061331511661753600306000ustar00rootroot00000000000000{ "description": "findOneAndDelete-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.4" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndDelete_hint" } } ], "initialData": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndDelete with hint string", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": "_id_" }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndDelete_hint", "query": { "_id": 1 }, "hint": "_id_", "remove": true } } } ] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndDelete with hint document", "operations": [ { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "_id": 1 }, "hint": { "_id": 1 } }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndDelete_hint", "query": { "_id": 1 }, "hint": { "_id": 1 }, "remove": true } } } ] } ], "outcome": [ { "collectionName": "findOneAndDelete_hint", "databaseName": "crud-v2", "documents": [ { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndDelete-let.json000066400000000000000000000073011511661753600304200ustar00rootroot00000000000000{ "description": "findOneAndDelete-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndDelete with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndDelete", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "remove": true, "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2 } ] } ] }, { "description": "findOneAndDelete with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "findOneAndDelete", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "let": { "id": 1 } }, "expectError": { "errorContains": "field 'let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "remove": true, "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-comment.json000066400000000000000000000113461511661753600314530ustar00rootroot00000000000000{ "description": "findOneAndReplace-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndReplace with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 5 }, "comment": "comment" }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "x": 5 }, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 5 }, { "_id": 2 } ] } ] }, { "description": "findOneAndReplace with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 5 }, "comment": { "key": "value" } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "x": 5 }, "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 5 }, { "_id": 2 } ] } ] }, { "description": "findOneAndReplace with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 5 }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "x": 5 }, "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-dots_and_dollars.json000066400000000000000000000224351511661753600333250ustar00rootroot00000000000000{ "description": "findOneAndReplace-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "Replacing document with top-level dotted key on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a.b": 1 }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Replacing document with top-level dotted key on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a.b": 1 }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a": { "$b": 1 } }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a": { "$b": 1 } }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a": { "b.c": 1 } }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": { "_id": 1, "a": { "b.c": 1 } }, "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-hint-clientError.json000066400000000000000000000053131511661753600332360ustar00rootroot00000000000000{ "description": "findOneAndReplace-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndReplace_hint" } } ], "initialData": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndReplace with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndReplace with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-hint-serverError.json000066400000000000000000000070531511661753600332710ustar00rootroot00000000000000{ "description": "findOneAndReplace-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.3.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndReplace_hint" } } ], "initialData": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndReplace with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndReplace_hint", "query": { "_id": 1 }, "update": { "x": 33 }, "hint": "_id_" } } } ] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndReplace with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndReplace_hint", "query": { "_id": 1 }, "update": { "x": 33 }, "hint": { "_id": 1 } } } } ] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } findOneAndReplace-hint-unacknowledged.json000066400000000000000000000124231511661753600336610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified{ "description": "findOneAndReplace-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged findOneAndReplace with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndReplace with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndReplace with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "update": { "x": 111 }, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged findOneAndReplace with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "update": { "x": 111 }, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-hint.json000066400000000000000000000067321511661753600307560ustar00rootroot00000000000000{ "description": "findOneAndReplace-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.1" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndReplace_hint" } } ], "initialData": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndReplace with hint string", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": "_id_" }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndReplace_hint", "query": { "_id": 1 }, "update": { "x": 33 }, "hint": "_id_" } } } ] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 33 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndReplace with hint document", "operations": [ { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 }, "hint": { "_id": 1 } }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndReplace_hint", "query": { "_id": 1 }, "update": { "x": 33 }, "hint": { "_id": 1 } } } } ] } ], "outcome": [ { "collectionName": "findOneAndReplace_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 33 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndReplace-let.json000066400000000000000000000100621511661753600305670ustar00rootroot00000000000000{ "description": "findOneAndReplace-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndReplace with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": "x" }, "let": { "id": 1 } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": { "x": "x" }, "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": "x" }, { "_id": 2 } ] } ] }, { "description": "findOneAndReplace with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "findOneAndReplace", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": "x" }, "let": { "id": 1 } }, "expectError": { "errorContains": "field 'let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": { "x": "x" }, "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-comment.json000066400000000000000000000112721511661753600313200ustar00rootroot00000000000000{ "description": "findOneAndUpdate-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndUpdate with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": "comment" }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": "comment" } } } ] } ] }, { "description": "findOneAndUpdate with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": { "key": "value" } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": { "key": "value" } } } } ] } ] }, { "description": "findOneAndUpdate with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$set": { "x": 5 } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-dots_and_dollars.json000066400000000000000000000213521511661753600331710ustar00rootroot00000000000000{ "description": "findOneAndUpdate-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {} } ] } ], "tests": [ { "description": "Updating document to set top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "_id": 1, "foo": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ], "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "$a": 1 } ] } ] }, { "description": "Updating document to set top-level dotted key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "_id": 1, "foo": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ], "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "a.b": 1 } ] } ] }, { "description": "Updating document to set dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "_id": 1, "foo": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ], "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "$a": 1 } } ] } ] }, { "description": "Updating document to set dotted key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "_id": 1, "foo": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ], "new": { "$$unsetOrMatches": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "a.b": 1 } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-errorResponse.json000066400000000000000000000056601511661753600325320ustar00rootroot00000000000000{ "description": "findOneAndUpdate-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": "foo" } ] } ], "tests": [ { "description": "findOneAndUpdate DuplicateKey error is accessible", "runOnRequirements": [ { "minServerVersion": "4.2" } ], "operations": [ { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "unique": true } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 2 }, "update": { "$set": { "x": "foo" } }, "upsert": true }, "expectError": { "errorCode": 11000, "errorResponse": { "keyPattern": { "x": 1 }, "keyValue": { "x": "foo" } } } } ] }, { "description": "findOneAndUpdate document validation errInfo is accessible", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "modifyCollection", "object": "database0", "arguments": { "collection": "test", "validator": { "x": { "$type": "string" } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } }, "expectError": { "errorCode": 121, "errorResponse": { "errInfo": { "failingDocumentId": 1, "details": { "$$type": "object" } } } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-hint-clientError.json000066400000000000000000000054121511661753600331050ustar00rootroot00000000000000{ "description": "findOneAndUpdate-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndUpdate_hint" } } ], "initialData": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndUpdate with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-hint-serverError.json000066400000000000000000000073221511661753600331370ustar00rootroot00000000000000{ "description": "findOneAndUpdate-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.3.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndUpdate_hint" } } ], "initialData": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndUpdate with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndUpdate_hint", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } } ] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndUpdate_hint", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } } ] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-hint-unacknowledged.json000066400000000000000000000125631511661753600336140ustar00rootroot00000000000000{ "description": "findOneAndUpdate-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged findOneAndUpdate with hint string fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndUpdate with hint document fails with client-side error on pre-4.4 server", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged findOneAndUpdate with hint string on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged findOneAndUpdate with hint document on 4.4+ server", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": null } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "$$type": [ "string", "object" ] }, "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-hint.json000066400000000000000000000072011511661753600306150ustar00rootroot00000000000000{ "description": "findOneAndUpdate-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.3.1" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "findOneAndUpdate_hint" } } ], "initialData": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndUpdate with hint string", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndUpdate_hint", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" } } } ] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate with hint document", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "_id": 1, "x": 11 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "findOneAndUpdate_hint", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } } } } ] } ], "outcome": [ { "collectionName": "findOneAndUpdate_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/findOneAndUpdate-let.json000066400000000000000000000110211511661753600304320ustar00rootroot00000000000000{ "description": "findOneAndUpdate-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "findOneAndUpdate with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "id": 1, "x": "foo" } }, "expectResult": { "_id": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "id": 1, "x": "foo" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": "foo" }, { "_id": 2 } ] } ] }, { "description": "findOneAndUpdate with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "id": 1, "x": "foo" } }, "expectError": { "errorContains": "field 'let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "coll0", "query": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "id": 1, "x": "foo" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/insertMany-comment.json000066400000000000000000000110421511661753600302740ustar00rootroot00000000000000{ "description": "insertMany-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "insertMany with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "insertMany with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 2, "x": 22 } ], "comment": { "key": "value" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "insertMany with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/insertMany-dots_and_dollars.json000066400000000000000000000161501511661753600321520ustar00rootroot00000000000000{ "description": "insertMany-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "Inserting document with top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "$a": 1 } ] }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 1 } } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "$a": 1 } ] } ] }, { "description": "Inserting document with top-level dollar-prefixed key on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "$a": 1 } ] }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] }, { "description": "Inserting document with top-level dotted key", "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "a.b": 1 } ] }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 1 } } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a.b": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Inserting document with dollar-prefixed key in embedded doc", "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "a": { "$b": 1 } } ] }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 1 } } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Inserting document with dotted key in embedded doc", "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 1 } } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/insertOne-comment.json000066400000000000000000000106541511661753600301210ustar00rootroot00000000000000{ "description": "insertOne-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "insertOne with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 2, "x": 22 }, "comment": "comment" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "insertOne with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 2, "x": 22 }, "comment": { "key": "value" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "insertOne with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 2, "x": 22 }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2, "x": 22 } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/insertOne-dots_and_dollars.json000066400000000000000000000322111511661753600317630ustar00rootroot00000000000000{ "description": "insertOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "Inserting document with top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "$a": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "$a": 1 } ] } ] }, { "description": "Inserting document with top-level dollar-prefixed key on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "$a": 1 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "$a": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] }, { "description": "Inserting document with top-level dotted key", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a.b": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a.b": 1 } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Inserting document with dollar-prefixed key in embedded doc", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": { "$b": 1 } } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Inserting document with dotted key in embedded doc", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": { "b.c": 1 } } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] }, { "description": "Inserting document with dollar-prefixed key in _id yields server-side error", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": { "$a": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": { "$a": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] }, { "description": "Inserting document with dotted key in _id on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": { "a.b": 1 } } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": { "a.b": 1 } } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": { "a.b": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": { "a.b": 1 } } ] } ] }, { "description": "Inserting document with dotted key in _id on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": { "a.b": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": { "a.b": 1 } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] }, { "description": "Inserting document with DBRef-like keys", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1, "a": { "$db": "foo" } } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1, "a": { "$db": "foo" } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$db": "foo" } } ] } ] }, { "description": "Unacknowledged write using dollar-prefixed or dotted keys may be silently rejected on pre-5.0 server", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "insertOne", "object": "collection1", "arguments": { "document": { "_id": { "$a": 1 } } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll1", "documents": [ { "_id": { "$a": 1 } } ], "writeConcern": { "w": 0 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/insertOne-errorResponse.json000066400000000000000000000035101511661753600313200ustar00rootroot00000000000000{ "description": "insertOne-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "insert operations support errorResponse assertions", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 8 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } }, "expectError": { "errorCode": 8, "errorResponse": { "code": 8 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-comment.json000066400000000000000000000125471511661753600302330ustar00rootroot00000000000000{ "description": "replaceOne-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "ReplaceOne with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 22 }, "comment": "comment" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "x": 22 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "ReplaceOne with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 22 }, "comment": { "key": "value" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "x": 22 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "ReplaceOne with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 22 }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "x": 22 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-dots_and_dollars.json000066400000000000000000000316001511661753600320730ustar00rootroot00000000000000{ "description": "replaceOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "Replacing document with top-level dotted key on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a.b": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a.b": 1 } ] } ] }, { "description": "Replacing document with top-level dotted key on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a.b": 1 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a.b": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "$b": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "$b": 1 } } ] } ] }, { "description": "Replacing document with dollar-prefixed key in embedded doc on pre-5.0 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "$b": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on 3.6+ server", "runOnRequirements": [ { "minServerVersion": "3.6" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "b.c": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "a": { "b.c": 1 } } ] } ] }, { "description": "Replacing document with dotted key in embedded doc on pre-3.6 server yields server-side error", "runOnRequirements": [ { "maxServerVersion": "3.4.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "b.c": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "b.c": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Unacknowledged write using dollar-prefixed or dotted keys may be silently rejected on pre-5.0 server", "runOnRequirements": [ { "maxServerVersion": "4.99" } ], "operations": [ { "name": "replaceOne", "object": "collection1", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "a": { "$b": 1 } } }, "expectResult": { "acknowledged": { "$$unsetOrMatches": false } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll1", "updates": [ { "q": { "_id": 1 }, "u": { "_id": 1, "a": { "$b": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "writeConcern": { "w": 0 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-hint-unacknowledged.json000066400000000000000000000137231511661753600325200ustar00rootroot00000000000000{ "description": "replaceOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged replaceOne with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged replaceOne with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged replaceOne with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged replaceOne with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-hint.json000066400000000000000000000105651511661753600275310ustar00rootroot00000000000000{ "description": "replaceOne-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_replaceone_hint" } } ], "initialData": [ { "collectionName": "test_replaceone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "ReplaceOne with hint string", "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": "_id_" }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_replaceone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "hint": "_id_", "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_replaceone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 111 } ] } ] }, { "description": "ReplaceOne with hint document", "operations": [ { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "replacement": { "x": 111 }, "hint": { "_id": 1 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_replaceone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 111 }, "hint": { "_id": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_replaceone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 111 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-let.json000066400000000000000000000114131511661753600273440ustar00rootroot00000000000000{ "description": "replaceOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "ReplaceOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": "foo" }, "let": { "id": 1 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": { "x": "foo" }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": "foo" }, { "_id": 2 } ] } ] }, { "description": "ReplaceOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "replacement": { "x": "foo" }, "let": { "id": 1 } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": { "x": "foo" }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1 } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-sort.json000066400000000000000000000116331511661753600275530ustar00rootroot00000000000000{ "description": "replaceOne-sort", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "ReplaceOne with sort option", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "replacement": { "x": 1 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 1 }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 1 } ] } ] }, { "description": "replaceOne with sort option unsupported (server-side error)", "runOnRequirements": [ { "maxServerVersion": "7.99" } ], "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "replacement": { "x": 1 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "x": 1 }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/replaceOne-validation.json000066400000000000000000000027671511661753600307260ustar00rootroot00000000000000{ "description": "replaceOne-validation", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "ReplaceOne prohibits atomic modifiers", "operations": [ { "name": "replaceOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "replacement": { "$set": { "x": 22 } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-comment.json000066400000000000000000000126731511661753600302650ustar00rootroot00000000000000{ "description": "updateMany-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "UpdateMany with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": "comment" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "UpdateMany with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": { "key": "value" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "UpdateMany with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-dots_and_dollars.json000066400000000000000000000232601511661753600321300ustar00rootroot00000000000000{ "description": "updateMany-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {} } ] } ], "tests": [ { "description": "Updating document to set top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "$a": 1 } ] } ] }, { "description": "Updating document to set top-level dotted key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "a.b": 1 } ] } ] }, { "description": "Updating document to set dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "$a": 1 } } ] } ] }, { "description": "Updating document to set dotted key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "a.b": 1 } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-hint-clientError.json000066400000000000000000000060131511661753600320420ustar00rootroot00000000000000{ "description": "updateMany-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updatemany_hint" } } ], "initialData": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "UpdateMany with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "UpdateMany with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-hint-serverError.json000066400000000000000000000111351511661753600320730ustar00rootroot00000000000000{ "description": "updateMany-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.1.9" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updatemany_hint" } } ], "initialData": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "UpdateMany with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updatemany_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": "_id_", "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "UpdateMany with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updatemany_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": { "_id": 1 }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-hint-unacknowledged.json000066400000000000000000000142041511661753600325450ustar00rootroot00000000000000{ "description": "updateMany-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Unacknowledged updateMany with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateMany with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateMany with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged updateMany with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-hint.json000066400000000000000000000111641511661753600275570ustar00rootroot00000000000000{ "description": "updateMany-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updatemany_hint" } } ], "initialData": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "UpdateMany with hint string", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updatemany_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": "_id_", "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 34 } ] } ] }, { "description": "UpdateMany with hint document", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updatemany_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "hint": { "_id": 1 }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updatemany_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 }, { "_id": 3, "x": 34 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-let.json000066400000000000000000000126671511661753600274120ustar00rootroot00000000000000{ "description": "updateMany-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ], "tests": [ { "description": "updateMany with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "update": [ { "$set": { "x": "$$x", "y": "$$y" } } ], "let": { "name": "name", "x": "foo", "y": { "$literal": "bar" } } }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$name", "$$name" ] } }, "u": [ { "$set": { "x": "$$x", "y": "$$y" } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "let": { "name": "name", "x": "foo", "y": { "$literal": "bar" } } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name", "x": "foo", "y": "bar" }, { "_id": 3, "name": "name", "x": "foo", "y": "bar" } ] } ] }, { "description": "updateMany with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "x": "foo" } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "x": "$$x" } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "let": { "x": "foo" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2, "name": "name" }, { "_id": 3, "name": "name" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateMany-validation.json000066400000000000000000000033741511661753600307530ustar00rootroot00000000000000{ "description": "updateMany-validation", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "UpdateMany requires atomic modifiers", "operations": [ { "name": "updateMany", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "x": 44 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-comment.json000066400000000000000000000132111511661753600300670ustar00rootroot00000000000000{ "description": "updateOne-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "UpdateOne with string comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": "comment" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "UpdateOne with document comment", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": { "key": "value" } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": { "key": "value" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 22 } ] } ] }, { "description": "UpdateOne with comment - pre 4.4", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 22 } }, "comment": "comment" }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 22 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "comment": "comment" } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-dots_and_dollars.json000066400000000000000000000237071511661753600317530ustar00rootroot00000000000000{ "description": "updateOne-dots_and_dollars", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {} } ] } ], "tests": [ { "description": "Updating document to set top-level dollar-prefixed key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$$ROOT" } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "$a": 1 } ] } ] }, { "description": "Updating document to set top-level dotted key on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceWith": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$$ROOT" } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": {}, "a.b": 1 } ] } ] }, { "description": "Updating document to set dollar-prefixed key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "$a" }, "value": 1, "input": "$foo" } } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "$a": 1 } } ] } ] }, { "description": "Updating document to set dotted key in embedded doc on 5.0+ server", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "foo": { "$setField": { "field": { "$literal": "a.b" }, "value": 1, "input": "$foo" } } } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "foo": { "a.b": 1 } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-errorResponse.json000066400000000000000000000036701511661753600313050ustar00rootroot00000000000000{ "description": "updateOne-errorResponse", "schemaVersion": "1.12", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "tests": [ { "description": "update operations support errorResponse assertions", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 8 } } } }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } }, "expectError": { "errorCode": 8, "errorResponse": { "code": 8 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-hint-clientError.json000066400000000000000000000054611511661753600316650ustar00rootroot00000000000000{ "description": "updateOne-hint-clientError", "schemaVersion": "1.0", "runOnRequirements": [ { "maxServerVersion": "3.3.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updateone_hint" } } ], "initialData": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "UpdateOne with hint string unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "UpdateOne with hint document unsupported (client-side error)", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-hint-serverError.json000066400000000000000000000110171511661753600317070ustar00rootroot00000000000000{ "description": "updateOne-hint-serverError", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.4.0", "maxServerVersion": "4.1.9" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updateone_hint" } } ], "initialData": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "UpdateOne with hint string unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updateone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "hint": "_id_", "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "UpdateOne with hint document unsupported (server-side error)", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updateone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "hint": { "_id": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-hint-unacknowledged.json000066400000000000000000000143161511661753600323660ustar00rootroot00000000000000{ "description": "updateOne-hint-unacknowledged", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "db0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "db0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "Unacknowledged updateOne with hint string fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateOne with hint document fails with client-side error on pre-4.2 server", "runOnRequirements": [ { "maxServerVersion": "4.0.99" } ], "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ] }, { "description": "Unacknowledged updateOne with hint string on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] }, { "description": "Unacknowledged updateOne with hint document on 4.2+ server", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "acknowledged": { "$$unsetOrMatches": false } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false }, "hint": { "$$type": [ "string", "object" ] } } ], "writeConcern": { "w": 0 } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-hint.json000066400000000000000000000110461511661753600273730ustar00rootroot00000000000000{ "description": "updateOne-hint", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.2.0" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-v2" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test_updateone_hint" } } ], "initialData": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "UpdateOne with hint string", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": "_id_" }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updateone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "hint": "_id_", "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 } ] } ] }, { "description": "UpdateOne with hint document", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } }, "hint": { "_id": 1 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test_updateone_hint", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "hint": { "_id": 1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "test_updateone_hint", "databaseName": "crud-v2", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 23 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-let.json000066400000000000000000000116721511661753600272220ustar00rootroot00000000000000{ "description": "updateOne-let", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "UpdateOne with let option", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "id": 1, "x": "foo" } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "$expr": { "$eq": [ "$_id", "$$id" ] } }, "u": [ { "$set": { "x": "$$x" } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "id": 1, "x": "foo" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": "foo" }, { "_id": 2 } ] } ] }, { "description": "UpdateOne with let option unsupported (server-side error)", "runOnRequirements": [ { "minServerVersion": "4.2.0", "maxServerVersion": "4.4.99" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": [ { "$set": { "x": "$$x" } } ], "let": { "x": "foo" } }, "expectError": { "errorContains": "'update.let' is an unknown field", "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": 1 }, "u": [ { "$set": { "x": "$$x" } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "let": { "x": "foo" } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-sort.json000066400000000000000000000121351511661753600274200ustar00rootroot00000000000000{ "description": "updateOne-sort", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "UpdateOne with sort option", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "update": { "$inc": { "x": 1 } } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } }, { "commandSucceededEvent": { "reply": { "ok": 1, "n": 1 }, "commandName": "update" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } ] }, { "description": "updateOne with sort option unsupported (server-side error)", "runOnRequirements": [ { "maxServerVersion": "7.99" } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": { "$gt": 1 } }, "sort": { "_id": -1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "coll0", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "sort": { "_id": -1 }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateOne-validation.json000066400000000000000000000027041511661753600305640ustar00rootroot00000000000000{ "description": "updateOne-validation", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "UpdateOne requires atomic modifiers", "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "x": 22 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/crud/unified/updateWithPipelines.json000066400000000000000000000262751511661753600305100ustar00rootroot00000000000000{ "description": "updateWithPipelines", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.1.11" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1, "y": 1, "t": { "u": { "v": 1 } } }, { "_id": 2, "x": 2, "y": 1 } ] } ], "tests": [ { "description": "UpdateOne using pipelines", "operations": [ { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": [ { "$replaceRoot": { "newRoot": "$t" } }, { "$addFields": { "foo": 1 } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceRoot": { "newRoot": "$t" } }, { "$addFields": { "foo": 1 } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "u": { "v": 1 }, "foo": 1 }, { "_id": 2, "x": 2, "y": 1 } ] } ] }, { "description": "UpdateMany using pipelines", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": {}, "update": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ] }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": {}, "u": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1, "foo": 1 }, { "_id": 2, "x": 2, "foo": 1 } ] } ] }, { "description": "FindOneAndUpdate using pipelines", "operations": [ { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "update": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ] }, "commandName": "findAndModify", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1, "foo": 1 }, { "_id": 2, "x": 2, "y": 1 } ] } ] }, { "description": "UpdateOne in bulk write using pipelines", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": [ { "$replaceRoot": { "newRoot": "$t" } }, { "$addFields": { "foo": 1 } } ] } } ] }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": [ { "$replaceRoot": { "newRoot": "$t" } }, { "$addFields": { "foo": 1 } } ], "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ] }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "u": { "v": 1 }, "foo": 1 }, { "_id": 2, "x": 2, "y": 1 } ] } ] }, { "description": "UpdateMany in bulk write using pipelines", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": {}, "update": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ] } } ] }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": {}, "u": [ { "$project": { "x": 1 } }, { "$addFields": { "foo": 1 } } ], "multi": true, "upsert": { "$$unsetOrMatches": false } } ] }, "commandName": "update", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 1, "foo": 1 }, { "_id": 2, "x": 2, "foo": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/gridfs/000077500000000000000000000000001511661753600225105ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/gridfs/delete.json000066400000000000000000000144601511661753600246520ustar00rootroot00000000000000{ "data": { "files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 0, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "d41d8cd98f00b204e9800998ecf8427e", "filename": "length-0", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000002" }, "length": 0, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "d41d8cd98f00b204e9800998ecf8427e", "filename": "length-0-with-empty-chunk", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000003" }, "length": 2, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "c700ed4fdb1d27055aa3faa2c2432283", "filename": "length-2", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000004" }, "length": 8, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "dd254cdc958e53abaa67da9f797125f5", "filename": "length-8", "contentType": "application/octet-stream", "aliases": [], "metadata": {} } ], "chunks": [ { "_id": { "$oid": "000000000000000000000001" }, "files_id": { "$oid": "000000000000000000000002" }, "n": 0, "data": { "$hex": "" } }, { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000003" }, "n": 0, "data": { "$hex": "1122" } }, { "_id": { "$oid": "000000000000000000000003" }, "files_id": { "$oid": "000000000000000000000004" }, "n": 0, "data": { "$hex": "11223344" } }, { "_id": { "$oid": "000000000000000000000004" }, "files_id": { "$oid": "000000000000000000000004" }, "n": 1, "data": { "$hex": "55667788" } } ] }, "tests": [ { "description": "Delete when length is 0", "act": { "operation": "delete", "arguments": { "id": { "$oid": "000000000000000000000001" } } }, "assert": { "result": "void", "data": [ { "delete": "expected.files", "deletes": [ { "q": { "_id": { "$oid": "000000000000000000000001" } }, "limit": 1 } ] } ] } }, { "description": "Delete when length is 0 and there is one extra empty chunk", "act": { "operation": "delete", "arguments": { "id": { "$oid": "000000000000000000000002" } } }, "assert": { "result": "void", "data": [ { "delete": "expected.files", "deletes": [ { "q": { "_id": { "$oid": "000000000000000000000002" } }, "limit": 1 } ] }, { "delete": "expected.chunks", "deletes": [ { "q": { "files_id": { "$oid": "000000000000000000000002" } }, "limit": 0 } ] } ] } }, { "description": "Delete when length is 8", "act": { "operation": "delete", "arguments": { "id": { "$oid": "000000000000000000000004" } } }, "assert": { "result": "void", "data": [ { "delete": "expected.files", "deletes": [ { "q": { "_id": { "$oid": "000000000000000000000004" } }, "limit": 1 } ] }, { "delete": "expected.chunks", "deletes": [ { "q": { "files_id": { "$oid": "000000000000000000000004" } }, "limit": 0 } ] } ] } }, { "description": "Delete when files entry does not exist", "act": { "operation": "delete", "arguments": { "id": { "$oid": "000000000000000000000000" } } }, "assert": { "error": "FileNotFound" } }, { "description": "Delete when files entry does not exist and there are orphaned chunks", "arrange": { "data": [ { "delete": "fs.files", "deletes": [ { "q": { "_id": { "$oid": "000000000000000000000004" } }, "limit": 1 } ] } ] }, "act": { "operation": "delete", "arguments": { "id": { "$oid": "000000000000000000000004" } } }, "assert": { "error": "FileNotFound", "data": [ { "delete": "expected.files", "deletes": [ { "q": { "_id": { "$oid": "000000000000000000000004" } }, "limit": 1 } ] } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/gridfs/download.json000066400000000000000000000240341511661753600252150ustar00rootroot00000000000000{ "data": { "files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 0, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "d41d8cd98f00b204e9800998ecf8427e", "filename": "length-0", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000002" }, "length": 0, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "d41d8cd98f00b204e9800998ecf8427e", "filename": "length-0-with-empty-chunk", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000003" }, "length": 2, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "c700ed4fdb1d27055aa3faa2c2432283", "filename": "length-2", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000004" }, "length": 8, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "dd254cdc958e53abaa67da9f797125f5", "filename": "length-8", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000005" }, "length": 10, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "57d83cd477bfb1ccd975ab33d827a92b", "filename": "length-10", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000006" }, "length": 2, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "c700ed4fdb1d27055aa3faa2c2432283", "contentType": "application/octet-stream", "aliases": [], "metadata": {} } ], "chunks": [ { "_id": { "$oid": "000000000000000000000001" }, "files_id": { "$oid": "000000000000000000000002" }, "n": 0, "data": { "$hex": "" } }, { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000003" }, "n": 0, "data": { "$hex": "1122" } }, { "_id": { "$oid": "000000000000000000000003" }, "files_id": { "$oid": "000000000000000000000004" }, "n": 0, "data": { "$hex": "11223344" } }, { "_id": { "$oid": "000000000000000000000004" }, "files_id": { "$oid": "000000000000000000000004" }, "n": 1, "data": { "$hex": "55667788" } }, { "_id": { "$oid": "000000000000000000000005" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 0, "data": { "$hex": "11223344" } }, { "_id": { "$oid": "000000000000000000000006" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 1, "data": { "$hex": "55667788" } }, { "_id": { "$oid": "000000000000000000000007" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 2, "data": { "$hex": "99aa" } }, { "_id": { "$oid": "000000000000000000000008" }, "files_id": { "$oid": "000000000000000000000006" }, "n": 0, "data": { "$hex": "1122" } } ] }, "tests": [ { "description": "Download when length is zero", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000001" }, "options": {} } }, "assert": { "result": { "$hex": "" } } }, { "description": "Download when length is zero and there is one empty chunk", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000002" }, "options": {} } }, "assert": { "result": { "$hex": "" } } }, { "description": "Download when there is one chunk", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000003" }, "options": {} } }, "assert": { "result": { "$hex": "1122" } } }, { "description": "Download when there are two chunks", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000004" }, "options": {} } }, "assert": { "result": { "$hex": "1122334455667788" } } }, { "description": "Download when there are three chunks", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000005" }, "options": {} } }, "assert": { "result": { "$hex": "112233445566778899aa" } } }, { "description": "Download when files entry does not exist", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000000" }, "options": {} } }, "assert": { "error": "FileNotFound" } }, { "description": "Download when an intermediate chunk is missing", "arrange": { "data": [ { "delete": "fs.chunks", "deletes": [ { "q": { "files_id": { "$oid": "000000000000000000000005" }, "n": 1 }, "limit": 1 } ] } ] }, "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000005" } } }, "assert": { "error": "ChunkIsMissing" } }, { "description": "Download when final chunk is missing", "arrange": { "data": [ { "delete": "fs.chunks", "deletes": [ { "q": { "files_id": { "$oid": "000000000000000000000005" }, "n": 1 }, "limit": 1 } ] } ] }, "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000005" } } }, "assert": { "error": "ChunkIsMissing" } }, { "description": "Download when an intermediate chunk is the wrong size", "arrange": { "data": [ { "update": "fs.chunks", "updates": [ { "q": { "files_id": { "$oid": "000000000000000000000005" }, "n": 1 }, "u": { "$set": { "data": { "$hex": "556677" } } } }, { "q": { "files_id": { "$oid": "000000000000000000000005" }, "n": 2 }, "u": { "$set": { "data": { "$hex": "8899aa" } } } } ] } ] }, "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000005" } } }, "assert": { "error": "ChunkIsWrongSize" } }, { "description": "Download when final chunk is the wrong size", "arrange": { "data": [ { "update": "fs.chunks", "updates": [ { "q": { "files_id": { "$oid": "000000000000000000000005" }, "n": 2 }, "u": { "$set": { "data": { "$hex": "99" } } } } ] } ] }, "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000005" } } }, "assert": { "error": "ChunkIsWrongSize" } }, { "description": "Download legacy file with no name", "act": { "operation": "download", "arguments": { "id": { "$oid": "000000000000000000000006" }, "options": {} } }, "assert": { "result": { "$hex": "1122" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/gridfs/download_by_name.json000066400000000000000000000120721511661753600267060ustar00rootroot00000000000000{ "data": { "files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "47ed733b8d10be225eceba344d533586", "filename": "abc", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000002" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-02T00:00:00.000Z" }, "md5": "b15835f133ff2e27c7cb28117bfae8f4", "filename": "abc", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000003" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-03T00:00:00.000Z" }, "md5": "eccbc87e4b5ce2fe28308fd9f2a7baf3", "filename": "abc", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000004" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-04T00:00:00.000Z" }, "md5": "f623e75af30e62bbd73d6df5b50bb7b5", "filename": "abc", "contentType": "application/octet-stream", "aliases": [], "metadata": {} }, { "_id": { "$oid": "000000000000000000000005" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-05T00:00:00.000Z" }, "md5": "4c614360da93c0a041b22e537de151eb", "filename": "abc", "contentType": "application/octet-stream", "aliases": [], "metadata": {} } ], "chunks": [ { "_id": { "$oid": "000000000000000000000001" }, "files_id": { "$oid": "000000000000000000000001" }, "n": 0, "data": { "$hex": "11" } }, { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000002" }, "n": 0, "data": { "$hex": "22" } }, { "_id": { "$oid": "000000000000000000000003" }, "files_id": { "$oid": "000000000000000000000003" }, "n": 0, "data": { "$hex": "33" } }, { "_id": { "$oid": "000000000000000000000004" }, "files_id": { "$oid": "000000000000000000000004" }, "n": 0, "data": { "$hex": "44" } }, { "_id": { "$oid": "000000000000000000000005" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 0, "data": { "$hex": "55" } } ] }, "tests": [ { "description": "Download_by_name when revision is 0", "act": { "operation": "download_by_name", "arguments": { "filename": "abc", "options": { "revision": 0 } } }, "assert": { "result": { "$hex": "11" } } }, { "description": "Download_by_name when revision is 1", "act": { "operation": "download_by_name", "arguments": { "filename": "abc", "options": { "revision": 1 } } }, "assert": { "result": { "$hex": "22" } } }, { "description": "Download_by_name when revision is -2", "act": { "operation": "download_by_name", "arguments": { "filename": "abc", "options": { "revision": -2 } } }, "assert": { "result": { "$hex": "44" } } }, { "description": "Download_by_name when revision is -1", "act": { "operation": "download_by_name", "arguments": { "filename": "abc", "options": { "revision": -1 } } }, "assert": { "result": { "$hex": "55" } } }, { "description": "Download_by_name when files entry does not exist", "act": { "operation": "download_by_name", "arguments": { "filename": "xyz" } }, "assert": { "error": "FileNotFound" } }, { "description": "Download_by_name when revision does not exist", "act": { "operation": "download_by_name", "arguments": { "filename": "abc", "options": { "revision": 999 } } }, "assert": { "error": "RevisionNotFound" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/gridfs/upload.json000066400000000000000000000251701511661753600246740ustar00rootroot00000000000000{ "data": { "files": [], "chunks": [] }, "tests": [ { "description": "Upload when length is 0", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 0, "chunkSize": 4, "uploadDate": "*actual", "md5": "d41d8cd98f00b204e9800998ecf8427e", "filename": "filename" } ] } ] } }, { "description": "Upload when length is 1", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "11" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 1, "chunkSize": 4, "uploadDate": "*actual", "md5": "47ed733b8d10be225eceba344d533586", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11" } } ] } ] } }, { "description": "Upload when length is 3", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "112233" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 3, "chunkSize": 4, "uploadDate": "*actual", "md5": "bafae3a174ab91fc70db7a6aa50f4f52", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "112233" } } ] } ] } }, { "description": "Upload when length is 4", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "11223344" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 4, "chunkSize": 4, "uploadDate": "*actual", "md5": "7e7c77cff5705d1f7574a25ef6662117", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11223344" } } ] } ] } }, { "description": "Upload when length is 5", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "1122334455" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 5, "chunkSize": 4, "uploadDate": "*actual", "md5": "283d4fea5dded59cf837d3047328f5af", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11223344" } }, { "_id": "*actual", "files_id": "*result", "n": 1, "data": { "$hex": "55" } } ] } ] } }, { "description": "Upload when length is 8", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "1122334455667788" }, "options": { "chunkSizeBytes": 4 } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 8, "chunkSize": 4, "uploadDate": "*actual", "md5": "dd254cdc958e53abaa67da9f797125f5", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11223344" } }, { "_id": "*actual", "files_id": "*result", "n": 1, "data": { "$hex": "55667788" } } ] } ] } }, { "description": "Upload when contentType is provided", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "11" }, "options": { "chunkSizeBytes": 4, "contentType": "image/jpeg" } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 1, "chunkSize": 4, "uploadDate": "*actual", "md5": "47ed733b8d10be225eceba344d533586", "filename": "filename", "contentType": "image/jpeg" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11" } } ] } ] } }, { "description": "Upload when metadata is provided", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "11" }, "options": { "chunkSizeBytes": 4, "metadata": { "x": 1 } } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 1, "chunkSize": 4, "uploadDate": "*actual", "md5": "47ed733b8d10be225eceba344d533586", "filename": "filename", "metadata": { "x": 1 } } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11" } } ] } ] } }, { "description": "Upload when length is 0 sans MD5", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "" }, "options": { "chunkSizeBytes": 4, "disableMD5": true } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 0, "chunkSize": 4, "uploadDate": "*actual", "filename": "filename" } ] } ] } }, { "description": "Upload when length is 1 sans MD5", "act": { "operation": "upload", "arguments": { "filename": "filename", "source": { "$hex": "11" }, "options": { "chunkSizeBytes": 4, "disableMD5": true } } }, "assert": { "result": "&result", "data": [ { "insert": "expected.files", "documents": [ { "_id": "*result", "length": 1, "chunkSize": 4, "uploadDate": "*actual", "filename": "filename" } ] }, { "insert": "expected.chunks", "documents": [ { "_id": "*actual", "files_id": "*result", "n": 0, "data": { "$hex": "11" } } ] } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/000077500000000000000000000000001511661753600244535ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/createSearchIndex.json000066400000000000000000000117321511661753600307330ustar00rootroot00000000000000{ "description": "createSearchIndex", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.5", "maxServerVersion": "7.0.99", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" }, { "minServerVersion": "7.2.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "no name provided for an index definition", "operations": [ { "name": "createSearchIndex", "object": "collection0", "arguments": { "model": { "definition": { "mappings": { "dynamic": true } }, "type": "search" } }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "mappings": { "dynamic": true } }, "type": "search" } ], "$db": "database0" } } } ] } ] }, { "description": "name provided for an index definition", "operations": [ { "name": "createSearchIndex", "object": "collection0", "arguments": { "model": { "definition": { "mappings": { "dynamic": true } }, "name": "test index", "type": "search" } }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "mappings": { "dynamic": true } }, "name": "test index", "type": "search" } ], "$db": "database0" } } } ] } ] }, { "description": "create a vector search index", "operations": [ { "name": "createSearchIndex", "object": "collection0", "arguments": { "model": { "definition": { "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "euclidean" } ] }, "name": "test index", "type": "vectorSearch" } }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "euclidean" } ] }, "name": "test index", "type": "vectorSearch" } ], "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/createSearchIndexes.json000066400000000000000000000135251511661753600312650ustar00rootroot00000000000000{ "description": "createSearchIndexes", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.5", "maxServerVersion": "7.0.99", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" }, { "minServerVersion": "7.2.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "empty index definition array", "operations": [ { "name": "createSearchIndexes", "object": "collection0", "arguments": { "models": [] }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [], "$db": "database0" } } } ] } ] }, { "description": "no name provided for an index definition", "operations": [ { "name": "createSearchIndexes", "object": "collection0", "arguments": { "models": [ { "definition": { "mappings": { "dynamic": true } }, "type": "search" } ] }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "mappings": { "dynamic": true } }, "type": "search" } ], "$db": "database0" } } } ] } ] }, { "description": "name provided for an index definition", "operations": [ { "name": "createSearchIndexes", "object": "collection0", "arguments": { "models": [ { "definition": { "mappings": { "dynamic": true } }, "name": "test index", "type": "search" } ] }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "mappings": { "dynamic": true } }, "name": "test index", "type": "search" } ], "$db": "database0" } } } ] } ] }, { "description": "create a vector search index", "operations": [ { "name": "createSearchIndexes", "object": "collection0", "arguments": { "models": [ { "definition": { "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "euclidean" } ] }, "name": "test index", "type": "vectorSearch" } ] }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createSearchIndexes": "collection0", "indexes": [ { "definition": { "fields": [ { "type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "euclidean" } ] }, "name": "test index", "type": "vectorSearch" } ], "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/dropSearchIndex.json000066400000000000000000000027311511661753600304330ustar00rootroot00000000000000{ "description": "dropSearchIndex", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "sends the correct command", "operations": [ { "name": "dropSearchIndex", "object": "collection0", "arguments": { "name": "test index" }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "dropSearchIndex": "collection0", "name": "test index", "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/dropSearchIndexes.json000066400000000000000000000026631511661753600307670ustar00rootroot00000000000000{ "description": "dropSearchIndex", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "sends the correct command", "operations": [ { "name": "dropSearchIndex", "object": "collection0", "arguments": { "name": "test index" }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "dropSearchIndex": "collection0", "name": "test index", "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/listSearchIndexes.json000066400000000000000000000067301511661753600307750ustar00rootroot00000000000000{ "description": "listSearchIndexes", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "when no name is provided, it does not populate the filter", "operations": [ { "name": "listSearchIndexes", "object": "collection0", "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$listSearchIndexes": {} } ] } } } ] } ] }, { "description": "when a name is provided, it is present in the filter", "operations": [ { "name": "listSearchIndexes", "object": "collection0", "arguments": { "name": "test index" }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "pipeline": [ { "$listSearchIndexes": { "name": "test index" } } ], "$db": "database0" } } } ] } ] }, { "description": "aggregation cursor options are supported", "operations": [ { "name": "listSearchIndexes", "object": "collection0", "arguments": { "name": "test index", "aggregationOptions": { "batchSize": 10 } }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "cursor": { "batchSize": 10 }, "pipeline": [ { "$listSearchIndexes": { "name": "test index" } } ], "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/index-management/updateSearchIndex.json000066400000000000000000000030411511661753600307440ustar00rootroot00000000000000{ "description": "updateSearchIndex", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } } ], "runOnRequirements": [ { "minServerVersion": "7.0.0", "topologies": [ "replicaset", "load-balanced", "sharded" ], "serverless": "forbid" } ], "tests": [ { "description": "sends the correct command", "operations": [ { "name": "updateSearchIndex", "object": "collection0", "arguments": { "name": "test index", "definition": {} }, "expectError": { "isError": true, "errorContains": "Atlas" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "updateSearchIndex": "collection0", "name": "test index", "definition": {}, "$db": "database0" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/000077500000000000000000000000001511661753600275125ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced/000077500000000000000000000000001511661753600321605ustar00rootroot00000000000000loadBalanced-directConnection.json000066400000000000000000000004431511661753600406160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test24.test.build.10gen.cc/?directConnection=false", "seeds": [ "localhost.test.build.10gen.cc:8000" ], "hosts": [ "localhost.test.build.10gen.cc:8000" ], "options": { "loadBalanced": true, "ssl": true, "directConnection": false } } loadBalanced-no-results.json000066400000000000000000000003061511661753600374350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test4.test.build.10gen.cc/?loadBalanced=true", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because no SRV records are present for this URI." } loadBalanced-replicaSet-errors.json000066400000000000000000000003211511661753600407240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test24.test.build.10gen.cc/?replicaSet=replset", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because loadBalanced=true is incompatible with replicaSet" } loadBalanced-true-multiple-hosts.json000066400000000000000000000003401511661753600412660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?loadBalanced=true", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because loadBalanced is true but the SRV record resolves to multiple hosts" } loadBalanced-true-txt.json000066400000000000000000000003551511661753600371220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test24.test.build.10gen.cc/", "seeds": [ "localhost.test.build.10gen.cc:8000" ], "hosts": [ "localhost.test.build.10gen.cc:8000" ], "options": { "loadBalanced": true, "ssl": true } } srvMaxHosts-conflicts_with_loadBalanced-true-txt.json000066400000000000000000000003421511661753600445140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test24.test.build.10gen.cc/?srvMaxHosts=1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because positive integer for srvMaxHosts conflicts with loadBalanced=true (TXT)" } srvMaxHosts-conflicts_with_loadBalanced-true.json000066400000000000000000000003551511661753600437030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test3.test.build.10gen.cc/?loadBalanced=true&srvMaxHosts=1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because positive integer for srvMaxHosts conflicts with loadBalanced=true" } srvMaxHosts-zero-txt.json000066400000000000000000000004211511661753600370640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test24.test.build.10gen.cc/?srvMaxHosts=0", "seeds": [ "localhost.test.build.10gen.cc:8000" ], "hosts": [ "localhost.test.build.10gen.cc:8000" ], "options": { "loadBalanced": true, "srvMaxHosts": 0, "ssl": true } } srvMaxHosts-zero.json000066400000000000000000000004431511661753600362530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/load-balanced{ "uri": "mongodb+srv://test23.test.build.10gen.cc/?loadBalanced=true&srvMaxHosts=0", "seeds": [ "localhost.test.build.10gen.cc:8000" ], "hosts": [ "localhost.test.build.10gen.cc:8000" ], "options": { "loadBalanced": true, "srvMaxHosts": 0, "ssl": true } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set/000077500000000000000000000000001511661753600317225ustar00rootroot00000000000000direct-connection-false.json000066400000000000000000000004441511661753600372370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test3.test.build.10gen.cc/?directConnection=false", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "ssl": true, "directConnection": false } } direct-connection-true.json000066400000000000000000000003261511661753600371230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test3.test.build.10gen.cc/?directConnection=true", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because directConnection=true is incompatible with SRV URIs." } encoded-userinfo-and-db.json000066400000000000000000000007371511661753600371210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://b*b%40f3tt%3D:%244to%40L8%3DMC@test3.test.build.10gen.cc/mydb%3F?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true }, "parsed_options": { "user": "b*b@f3tt=", "password": "$4to@L8=MC", "db": "mydb?" }, "comment": "Encoded user, pass, and DB parse correctly" } loadBalanced-false-txt.json000066400000000000000000000004121511661753600367710ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test21.test.build.10gen.cc/", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "loadBalanced": false, "ssl": true } } longer-parent-in-return.json000066400000000000000000000005761511661753600372440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test18.test.build.10gen.cc/?replicaSet=repl0", "seeds": [ "localhost.sub.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true }, "comment": "Is correct, as returned host name shared the URI root \"test.build.10gen.cc\"." } misformatted-option.json000066400000000000000000000003231511661753600365400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test8.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because the options in the TXT record are incorrectly formatted (misses value)." } no-results.json000066400000000000000000000002641511661753600346530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test4.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because no SRV records are present for this URI." } not-enough-parts.json000066400000000000000000000002701511661753600357470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because host in URI does not have {hostname}, {domainname} and {tld}." } one-result-default-port.json000066400000000000000000000004321511661753600372360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test3.test.build.10gen.cc/?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true } } one-txt-record-multiple-strings.json000066400000000000000000000004121511661753600407250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test11.test.build.10gen.cc/", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true } } one-txt-record.json000066400000000000000000000004451511661753600354130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc/", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "authSource": "thisDB", "ssl": true } } parent-part-mismatch1.json000066400000000000000000000003301511661753600366530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test14.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name's part \"not-test\" mismatches URI parent part \"test\"." } parent-part-mismatch2.json000066400000000000000000000003321511661753600366560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test15.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name's part \"not-build\" mismatches URI parent part \"build\"." } parent-part-mismatch3.json000066400000000000000000000003321511661753600366570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test16.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name's part \"not-10gen\" mismatches URI parent part \"10gen\"." } parent-part-mismatch4.json000066400000000000000000000003131511661753600366570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test17.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name's TLD \"not-cc\" mismatches URI TLD \"cc\"." } parent-part-mismatch5.json000066400000000000000000000003341511661753600366630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test19.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because one of the returned host names' domain name parts \"evil\" mismatches \"test\"." } returned-parent-too-short.json000066400000000000000000000003121511661753600376050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test13.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name's parent (build.10gen.cc) misses \"test.\"" } returned-parent-wrong.json000066400000000000000000000003051511661753600370050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test12.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because returned host name is too short and mismatches a parent." } srv-service-name.json000066400000000000000000000005301511661753600357220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test22.test.build.10gen.cc/?srvServiceName=customname", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "ssl": true, "srvServiceName": "customname" } } srvMaxHosts-conflicts_with_replicaSet-txt.json000066400000000000000000000003411511661753600430420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc/?srvMaxHosts=1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because positive integer for srvMaxHosts conflicts with replicaSet option (TXT)" } srvMaxHosts-conflicts_with_replicaSet.json000066400000000000000000000003541511661753600422310ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?replicaSet=repl0&srvMaxHosts=1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because positive integer for srvMaxHosts conflicts with replicaSet option" } srvMaxHosts-equal_to_srv_records.json000066400000000000000000000005161511661753600412630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2", "numSeeds": 2, "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "srvMaxHosts": 2, "ssl": true } } srvMaxHosts-greater_than_srv_records.json000066400000000000000000000004751511661753600421210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=3", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "srvMaxHosts": 3, "ssl": true } } srvMaxHosts-invalid_integer.json000066400000000000000000000003341511661753600402000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?replicaSet=repl0&srvMaxHosts=-1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because srvMaxHosts is not greater than or equal to zero" } srvMaxHosts-invalid_type.json000066400000000000000000000003121511661753600375200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?replicaSet=repl0&srvMaxHosts=foo", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because srvMaxHosts is not an integer" } srvMaxHosts-less_than_srv_records.json000066400000000000000000000003471511661753600414340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=1", "numSeeds": 1, "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "srvMaxHosts": 1, "ssl": true } } srvMaxHosts-zero-txt.json000066400000000000000000000005111511661753600366260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc/?srvMaxHosts=0", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "authSource": "thisDB", "replicaSet": "repl0", "srvMaxHosts": 0, "ssl": true } } srvMaxHosts-zero.json000066400000000000000000000005511511661753600360150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?replicaSet=repl0&srvMaxHosts=0", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "srvMaxHosts": 0, "ssl": true } } two-results-default-port.json000066400000000000000000000005051511661753600374520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true } } two-results-nonstandard-port.json000066400000000000000000000005051511661753600403410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test2.test.build.10gen.cc/?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27018", "localhost.test.build.10gen.cc:27019" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true } } two-txt-records.json000066400000000000000000000002461511661753600356250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test6.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because there are two TXT records." } txt-record-not-allowed-option.json000066400000000000000000000003071511661753600403620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test10.test.build.10gen.cc/?replicaSet=repl0", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because socketTimeoutMS is not an allowed option." } txt-record-with-overridden-ssl-option.json000066400000000000000000000004601511661753600420460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc/?ssl=false", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "authSource": "thisDB", "ssl": false } } txt-record-with-overridden-uri-option.json000066400000000000000000000004711511661753600420460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc/?authSource=otherDB", "seeds": [ "localhost.test.build.10gen.cc:27017" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "authSource": "otherDB", "ssl": true } } txt-record-with-unallowed-option.json000066400000000000000000000002551511661753600411020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test7.test.build.10gen.cc/", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because \"ssl\" is not an allowed option." } uri-with-admin-database.json000066400000000000000000000006061511661753600371400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test1.test.build.10gen.cc/adminDB?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "options": { "replicaSet": "repl0", "ssl": true }, "parsed_options": { "auth_database": "adminDB" } } uri-with-auth.json000066400000000000000000000006131511661753600352450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://auser:apass@test1.test.build.10gen.cc/?replicaSet=repl0", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost:27017", "localhost:27018", "localhost:27019" ], "parsed_options": { "user": "auser", "password": "apass" }, "comment": "Should preserve auth credentials" } uri-with-port.json000066400000000000000000000003061511661753600352670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc:8123/?replicaSet=repl0", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because the mongodb+srv URI includes a port." } uri-with-two-hosts.json000066400000000000000000000003431511661753600362530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/replica-set{ "uri": "mongodb+srv://test5.test.build.10gen.cc,test6.test.build.10gen.cc/?replicaSet=repl0", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because the mongodb+srv URI includes two host names." } mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded/000077500000000000000000000000001511661753600311245ustar00rootroot00000000000000srvMaxHosts-equal_to_srv_records.json000066400000000000000000000005371511661753600404700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2", "numSeeds": 2, "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "options": { "srvMaxHosts": 2, "ssl": true } } srvMaxHosts-greater_than_srv_records.json000066400000000000000000000005161511661753600413170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=3", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "options": { "srvMaxHosts": 3, "ssl": true } } srvMaxHosts-invalid_integer.json000066400000000000000000000003131511661753600373770ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=-1", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because srvMaxHosts is not greater than or equal to zero" } srvMaxHosts-invalid_type.json000066400000000000000000000002711511661753600367260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=foo", "seeds": [], "hosts": [], "error": true, "comment": "Should fail because srvMaxHosts is not an integer" } srvMaxHosts-less_than_srv_records.json000066400000000000000000000002421511661753600406300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=1", "numSeeds": 1, "numHosts": 1, "options": { "srvMaxHosts": 1, "ssl": true } } srvMaxHosts-zero.json000066400000000000000000000005161511661753600352200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/initial_dns_seedlist_discovery/sharded{ "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=0", "seeds": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "hosts": [ "localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018" ], "options": { "srvMaxHosts": 0, "ssl": true } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/000077500000000000000000000000001511661753600241635ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/cursors.json000066400000000000000000000731061511661753600265650ustar00rootroot00000000000000{ "description": "cursors are correctly pinned to connections for load-balanced clusters", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent", "connectionReadyEvent", "connectionClosedEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } }, { "collection": { "id": "collection2", "database": "database0", "collectionName": "coll2" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] }, { "collectionName": "coll1", "databaseName": "database0Name", "documents": [] }, { "collectionName": "coll2", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "no connection is pinned if all documents are returned in the initial batch", "operations": [ { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {} }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {} }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": 0, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connections are returned when the cursor is drained", "operations": [ { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 2 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 3 } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } }, { "name": "close", "object": "cursor0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": 0, "ns": { "$$type": "string" }, "nextBatch": { "$$type": "array" } } }, "commandName": "getMore" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connections are returned to the pool when the cursor is closed", "operations": [ { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } }, { "commandStartedEvent": { "commandName": "killCursors" } }, { "commandSucceededEvent": { "commandName": "killCursors" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connections are not returned after an network error during getMore", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "closeConnection": true } } } }, { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 2 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectError": { "isClientError": true } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandFailedEvent": { "commandName": "getMore" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "error" } } ] } ] }, { "description": "pinned connections are returned after a network error during a killCursors request", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "killCursors" ], "closeConnection": true } } } }, { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } }, { "commandStartedEvent": { "commandName": "killCursors" } }, { "commandFailedEvent": { "commandName": "killCursors" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "error" } } ] } ] }, { "description": "pinned connections are not returned to the pool after a non-network error on getMore", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "getMore" ], "errorCode": 7 } } } }, { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 2 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectError": { "errorCode": 7 } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "firstBatch": { "$$type": "array" }, "ns": { "$$type": "string" } } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandFailedEvent": { "commandName": "getMore" } }, { "commandStartedEvent": { "commandName": "killCursors" } }, { "commandSucceededEvent": { "commandName": "killCursors" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "aggregate pins the cursor to a connection", "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [], "batchSize": 2 } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll0", "cursor": { "batchSize": 2 } }, "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": 0, "ns": { "$$type": "string" }, "nextBatch": { "$$type": "array" } } }, "commandName": "getMore" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "listCollections pins the cursor to a connection", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "listCollections", "object": "database0", "arguments": { "filter": {}, "batchSize": 2 } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "cursor": { "batchSize": 2 } }, "commandName": "listCollections", "databaseName": "database0Name" } }, { "commandSucceededEvent": { "commandName": "listCollections" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": { "$$type": "string" } }, "commandName": "getMore" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": 0, "ns": { "$$type": "string" }, "nextBatch": { "$$type": "array" } } }, "commandName": "getMore" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "listIndexes pins the cursor to a connection", "operations": [ { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "x": 1 }, "name": "x_1" } }, { "name": "createIndex", "object": "collection0", "arguments": { "keys": { "y": 1 }, "name": "y_1" } }, { "name": "listIndexes", "object": "collection0", "arguments": { "batchSize": 2 } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "createIndexes": "coll0", "indexes": [ { "name": "x_1", "key": { "x": 1 } } ] }, "commandName": "createIndexes" } }, { "commandSucceededEvent": { "commandName": "createIndexes" } }, { "commandStartedEvent": { "command": { "createIndexes": "coll0", "indexes": [ { "name": "y_1", "key": { "y": 1 } } ] }, "commandName": "createIndexes" } }, { "commandSucceededEvent": { "commandName": "createIndexes" } }, { "commandStartedEvent": { "command": { "listIndexes": "coll0", "cursor": { "batchSize": 2 } }, "commandName": "listIndexes", "databaseName": "database0Name" } }, { "commandSucceededEvent": { "commandName": "listIndexes" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": 0, "ns": { "$$type": "string" }, "nextBatch": { "$$type": "array" } } }, "commandName": "getMore" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "change streams pin to a connection", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "createChangeStream", "object": "collection0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "changeStream0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } }, { "commandStartedEvent": { "commandName": "killCursors" } }, { "commandSucceededEvent": { "commandName": "killCursors" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/event-monitoring.json000066400000000000000000000076031511661753600303700ustar00rootroot00000000000000{ "description": "monitoring events include correct fields", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "uriOptions": { "retryReads": false }, "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent", "poolClearedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "databaseName": "database0", "collectionName": "coll0", "documents": [] } ], "tests": [ { "description": "command started and succeeded events include serviceId", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "hasServiceId": true } }, { "commandSucceededEvent": { "commandName": "insert", "hasServiceId": true } } ] } ] }, { "description": "command failed events include serviceId", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "hasServiceId": true } }, { "commandFailedEvent": { "commandName": "find", "hasServiceId": true } } ] } ] }, { "description": "poolClearedEvent events include serviceId", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {} }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "find", "hasServiceId": true } }, { "commandFailedEvent": { "commandName": "find", "hasServiceId": true } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "poolClearedEvent": { "hasServiceId": true } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/lb-connection-establishment.json000066400000000000000000000023331511661753600324510ustar00rootroot00000000000000{ "description": "connection establishment for load-balanced clusters", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "uriOptions": { "loadBalanced": false }, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } } ], "tests": [ { "description": "operations against load balancers fail if URI contains loadBalanced=false", "skipReason": "servers have not implemented LB support yet so they will not fail the connection handshake in this case", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/non-lb-connection-establishment.json000066400000000000000000000037261511661753600332500ustar00rootroot00000000000000{ "description": "connection establishment if loadBalanced is specified for non-load balanced clusters", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "single", "sharded" ] } ], "createEntities": [ { "client": { "id": "lbTrueClient", "useMultipleMongoses": false, "uriOptions": { "loadBalanced": true } } }, { "database": { "id": "lbTrueDatabase", "client": "lbTrueClient", "databaseName": "lbTrueDb" } }, { "client": { "id": "lbFalseClient", "uriOptions": { "loadBalanced": false } } }, { "database": { "id": "lbFalseDatabase", "client": "lbFalseClient", "databaseName": "lbFalseDb" } } ], "_yamlAnchors": { "runCommandArguments": [ { "arguments": { "commandName": "ping", "command": { "ping": 1 } } } ] }, "tests": [ { "description": "operations against non-load balanced clusters fail if URI contains loadBalanced=true", "operations": [ { "name": "runCommand", "object": "lbTrueDatabase", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "errorContains": "Driver attempted to initialize in load balancing mode, but the server does not support this mode" } } ] }, { "description": "operations against non-load balanced clusters succeed if URI contains loadBalanced=false", "operations": [ { "name": "runCommand", "object": "lbFalseDatabase", "arguments": { "commandName": "ping", "command": { "ping": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/sdam-error-handling.json000066400000000000000000000266421511661753600307250ustar00rootroot00000000000000{ "description": "state change errors are correctly handled", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "_yamlAnchors": { "observedEvents": [ "connectionCreatedEvent", "connectionReadyEvent", "connectionCheckedOutEvent", "connectionCheckOutFailedEvent", "connectionCheckedInEvent", "connectionClosedEvent", "poolClearedEvent" ] }, "createEntities": [ { "client": { "id": "failPointClient", "useMultipleMongoses": false } }, { "client": { "id": "singleClient", "useMultipleMongoses": false, "uriOptions": { "appname": "lbSDAMErrorTestClient", "retryWrites": false }, "observeEvents": [ "connectionCreatedEvent", "connectionReadyEvent", "connectionCheckedOutEvent", "connectionCheckOutFailedEvent", "connectionCheckedInEvent", "connectionClosedEvent", "poolClearedEvent" ] } }, { "database": { "id": "singleDB", "client": "singleClient", "databaseName": "singleDB" } }, { "collection": { "id": "singleColl", "database": "singleDB", "collectionName": "singleColl" } }, { "client": { "id": "multiClient", "useMultipleMongoses": true, "uriOptions": { "retryWrites": false }, "observeEvents": [ "connectionCreatedEvent", "connectionReadyEvent", "connectionCheckedOutEvent", "connectionCheckOutFailedEvent", "connectionCheckedInEvent", "connectionClosedEvent", "poolClearedEvent" ] } }, { "database": { "id": "multiDB", "client": "multiClient", "databaseName": "multiDB" } }, { "collection": { "id": "multiColl", "database": "multiDB", "collectionName": "multiColl" } } ], "initialData": [ { "collectionName": "singleColl", "databaseName": "singleDB", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] }, { "collectionName": "multiColl", "databaseName": "multiDB", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ], "tests": [ { "description": "only connections for a specific serviceId are closed when pools are cleared", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "createFindCursor", "object": "multiColl", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "createFindCursor", "object": "multiColl", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor1" }, { "name": "close", "object": "cursor0" }, { "name": "close", "object": "cursor1" }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "multiClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11600 } } } }, { "name": "insertOne", "object": "multiColl", "arguments": { "document": { "x": 1 } }, "expectError": { "errorCode": 11600 } }, { "name": "insertOne", "object": "multiColl", "arguments": { "document": { "x": 1 } } } ], "expectEvents": [ { "client": "multiClient", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCreatedEvent": {} }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "poolClearedEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "stale" } }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "errors during the initial connection hello are ignored", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "isMaster", "hello" ], "closeConnection": true, "appName": "lbSDAMErrorTestClient" } } } }, { "name": "insertOne", "object": "singleColl", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "singleClient", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "connectionClosedEvent": { "reason": "error" } }, { "connectionCheckOutFailedEvent": { "reason": "connectionError" } } ] } ] }, { "description": "errors during authentication are processed", "runOnRequirements": [ { "auth": true } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "closeConnection": true, "appName": "lbSDAMErrorTestClient" } } } }, { "name": "insertOne", "object": "singleColl", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "singleClient", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "poolClearedEvent": {} }, { "connectionClosedEvent": { "reason": "error" } }, { "connectionCheckOutFailedEvent": { "reason": "connectionError" } } ] } ] }, { "description": "stale errors are ignored", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "getMore" ], "closeConnection": true } } } }, { "name": "createFindCursor", "object": "singleColl", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "createFindCursor", "object": "singleColl", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor1" }, { "name": "iterateUntilDocumentOrError", "object": "cursor0" }, { "name": "iterateUntilDocumentOrError", "object": "cursor0" }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectError": { "isClientError": true } }, { "name": "close", "object": "cursor0" }, { "name": "iterateUntilDocumentOrError", "object": "cursor1" }, { "name": "iterateUntilDocumentOrError", "object": "cursor1" }, { "name": "iterateUntilDocumentOrError", "object": "cursor1", "expectError": { "isClientError": true } }, { "name": "close", "object": "cursor1" } ], "expectEvents": [ { "client": "singleClient", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCreatedEvent": {} }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "poolClearedEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/server-selection.json000066400000000000000000000032511511661753600303500ustar00rootroot00000000000000{ "description": "server selection for load-balanced clusters", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "readPreference": { "mode": "secondaryPreferred" } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "$readPreference is sent for load-balanced clusters", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "$readPreference": { "mode": "secondaryPreferred" } }, "commandName": "find", "databaseName": "database0Name" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/transactions.json000066400000000000000000001117471511661753600276010ustar00rootroot00000000000000{ "description": "transactions are correctly pinned to connections for load-balanced clusters", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent", "connectionReadyEvent", "connectionClosedEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ] } }, { "session": { "id": "session0", "client": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ], "_yamlAnchors": { "documents": [ { "_id": 4 } ] }, "tests": [ { "description": "sessions are reused in LB mode", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } } }, { "name": "assertSameLsidOnLastTwoCommands", "object": "testRunner", "arguments": { "client": "client0" } } ] }, { "description": "all operations go to the same mongos", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} } ] } ] }, { "description": "transaction can be committed multiple times", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} } ] } ] }, { "description": "pinned connection is not released after a non-transient CRUD error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 51 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" }, "expectError": { "errorCode": 51, "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} } ] } ] }, { "description": "pinned connection is not released after a non-transient commit error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 51 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0", "expectError": { "errorCode": 51, "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} } ] } ] }, { "description": "pinned connection is released after a non-transient abort error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 51 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient non-network CRUD error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 24 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" }, "expectError": { "errorCode": 24, "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient network CRUD error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" }, "expectError": { "isClientError": true, "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "error" } }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient non-network commit error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 24 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0", "expectError": { "errorCode": 24, "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient network commit error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0", "ignoreResultAndError": true }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "error" } }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient non-network abort error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 24 } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released after a transient network abort error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "closeConnection": true } } } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": { "reason": "error" } }, { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is released on successful abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "pinned connection is returned when a new transaction is started", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "startTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} } ] } ] }, { "description": "pinned connection is returned when a non-transaction operation uses the session", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "commitTransaction" } }, { "commandStartedEvent": { "commandName": "insert" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] }, { "description": "a connection can be shared by a transaction and a cursor", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2, "session": "session0" }, "saveResultAsEntity": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "close", "object": "cursor0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandStartedEvent": { "commandName": "killCursors" } }, { "commandStartedEvent": { "commandName": "abortTransaction" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/load_balancers/wait-queue-timeouts.json000066400000000000000000000065451511661753600310250ustar00rootroot00000000000000{ "description": "wait queue timeout errors include details about checked out connections", "schemaVersion": "1.3", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "uriOptions": { "maxPoolSize": 1, "waitQueueTimeoutMS": 50 }, "observeEvents": [ "connectionCheckedOutEvent", "connectionCheckOutFailedEvent" ] } }, { "session": { "id": "session0", "client": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ], "tests": [ { "description": "wait queue timeout errors include cursor statistics", "operations": [ { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true, "errorContains": "maxPoolSize: 1, connections in use by cursors: 1, connections in use by transactions: 0, connections in use by other operations: 0" } } ], "expectEvents": [ { "client": "client0", "eventType": "cmap", "events": [ { "connectionCheckedOutEvent": {} }, { "connectionCheckOutFailedEvent": {} } ] } ] }, { "description": "wait queue timeout errors include transaction statistics", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true, "errorContains": "maxPoolSize: 1, connections in use by cursors: 0, connections in use by transactions: 1, connections in use by other operations: 0" } } ], "expectEvents": [ { "client": "client0", "eventType": "cmap", "events": [ { "connectionCheckedOutEvent": {} }, { "connectionCheckOutFailedEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/000077500000000000000000000000001511661753600241005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/000077500000000000000000000000001511661753600277745ustar00rootroot00000000000000DefaultNoMaxStaleness.json000066400000000000000000000027001511661753600350200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest" }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.json000066400000000000000000000034321511661753600335560ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 1, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 25002, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 25001, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 1, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 25002, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 1, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 } ] } MaxStalenessTooSmall.json000066400000000000000000000005201511661753600346670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "Unknown" }, { "address": "b:27017", "type": "Unknown" } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 1 }, "error": true } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/Nearest.json000066400000000000000000000034161511661753600322740ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "avg_rtt_ms": 5, "lastUpdateTime": 0, "type": "RSSecondary", "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/Nearest2.json000066400000000000000000000034111511661753600323510ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "avg_rtt_ms": 5, "lastUpdateTime": 0, "type": "RSSecondary", "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/NoKnownServers.json000066400000000000000000000005651511661753600336400ustar00rootroot00000000000000{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "Unknown" }, { "address": "b:27017", "type": "Unknown" } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 90 }, "suitable_servers": [], "in_latency_window": [] } OneKnownTwoUnavailable.json000066400000000000000000000022111511661753600352000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "PossiblePrimary", "avg_rtt_ms": 5, "maxWireVersion": 0 }, { "address": "b:27017", "type": "Unknown", "avg_rtt_ms": 5, "maxWireVersion": 0 }, { "address": "c:27017", "type": "RSSecondary", "maxWireVersion": 6, "avg_rtt_ms": 5, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 120 }, "suitable_servers": [ { "address": "c:27017", "type": "RSSecondary", "maxWireVersion": 6, "avg_rtt_ms": 5, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "c:27017", "type": "RSSecondary", "maxWireVersion": 6, "avg_rtt_ms": 5, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } PrimaryPreferred.json000066400000000000000000000024331511661753600340740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "PrimaryPreferred", "maxStalenessSeconds": 90 }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ] } PrimaryPreferred_tags.json000066400000000000000000000031711511661753600351120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6, "tags": { "data_center": "nyc" } } ] }, "read_preference": { "mode": "PrimaryPreferred", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" }, { "data_center": "tokyo" } ] }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary/Secondary.json000066400000000000000000000043021511661753600326150ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "tags": { "data_center": "tokyo" } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "tags": { "data_center": "nyc" } }, { "address": "d:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "tokyo" } } ] }, "read_preference": { "mode": "Secondary", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ] } SecondaryPreferred.json000066400000000000000000000023751511661753600344050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "SecondaryPreferred", "maxStalenessSeconds": 120 }, "suitable_servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ] } SecondaryPreferred_tags.json000066400000000000000000000043131511661753600354150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "tags": { "data_center": "tokyo" } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "tags": { "data_center": "nyc" } }, { "address": "d:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "tokyo" } } ] }, "read_preference": { "mode": "SecondaryPreferred", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ] } ZeroMaxStaleness.json000066400000000000000000000013221511661753600340550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetNoPrimary{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "a:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 0 }, "error": true } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary/000077500000000000000000000000001511661753600303335ustar00rootroot00000000000000DefaultNoMaxStaleness.json000066400000000000000000000026761511661753600353730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest" }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } LastUpdateTime.json000066400000000000000000000034211511661753600340340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 125001, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 125001, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 125001, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 125001, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.json000066400000000000000000000027621511661753600337540ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 120000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 130 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } LongHeartbeat2.json000066400000000000000000000013661511661753600337560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 120000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 129 }, "error": true } MaxStalenessTooSmall.json000066400000000000000000000013621511661753600352330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 500, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 89 }, "error": true } MaxStalenessWithModePrimary.json000066400000000000000000000012751511661753600365700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "maxStalenessSeconds": 120 }, "error": true } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary/Nearest.json000066400000000000000000000034121511661753600326270ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "avg_rtt_ms": 5, "lastUpdateTime": 0, "type": "RSSecondary", "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary/Nearest2.json000066400000000000000000000034071511661753600327150ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 }, { "address": "c:27017", "avg_rtt_ms": 5, "lastUpdateTime": 0, "type": "RSSecondary", "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 50, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6 } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary/Nearest_tags.json000066400000000000000000000031541511661753600336500ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6, "tags": { "data_center": "nyc" } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" }, { "data_center": "tokyo" } ] }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ] } PrimaryPreferred.json000066400000000000000000000024061511661753600344330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "PrimaryPreferred", "maxStalenessSeconds": 150 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } SecondaryPreferred.json000066400000000000000000000023711511661753600347400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "SecondaryPreferred", "maxStalenessSeconds": 120 }, "suitable_servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } } } ] } SecondaryPreferred_tags.json000066400000000000000000000054111511661753600357540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } }, "tags": { "data_center": "nyc" } }, { "address": "d:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "tags": { "data_center": "nyc" } }, { "address": "e:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "tokyo" } } ] }, "read_preference": { "mode": "SecondaryPreferred", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } }, "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ] } SecondaryPreferred_tags2.json000066400000000000000000000035731511661753600360450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6, "tags": { "data_center": "nyc" } } ] }, "read_preference": { "mode": "SecondaryPreferred", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" }, { "data_center": "tokyo" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ] } Secondary_tags.json000066400000000000000000000054001511661753600341130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } }, "tags": { "data_center": "nyc" } }, { "address": "d:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "tags": { "data_center": "nyc" } }, { "address": "e:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "tokyo" } } ] }, "read_preference": { "mode": "Secondary", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 50, "lastUpdateTime": 1, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1000001" } }, "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "tags": { "data_center": "nyc" } } ] } Secondary_tags2.json000066400000000000000000000035621511661753600342040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "heartbeatFrequencyMS": 25000, "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "125002" } }, "maxWireVersion": 6 }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } }, { "address": "c:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } }, "maxWireVersion": 6, "tags": { "data_center": "nyc" } } ] }, "read_preference": { "mode": "Secondary", "maxStalenessSeconds": 150, "tag_sets": [ { "data_center": "nyc" }, { "data_center": "tokyo" } ] }, "suitable_servers": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ], "in_latency_window": [ { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } }, "maxWireVersion": 6, "tags": { "data_center": "tokyo" } } ] } ZeroMaxStaleness.json000066400000000000000000000013221511661753600344140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/ReplicaSetWithPrimary{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "type": "RSPrimary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "2" } } }, { "address": "b:27017", "type": "RSSecondary", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 0 }, "error": true } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Sharded/000077500000000000000000000000001511661753600254525ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Sharded/SmallMaxStaleness.json000066400000000000000000000027161511661753600317530ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 10000, "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "type": "Mongos", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "Mongos", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 1 }, "suitable_servers": [ { "address": "a:27017", "type": "Mongos", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } }, { "address": "b:27017", "type": "Mongos", "avg_rtt_ms": 50, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "Mongos", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Single/000077500000000000000000000000001511661753600253215ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Single/SmallMaxStaleness.json000066400000000000000000000017451511661753600316230ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 10000, "topology_description": { "type": "Single", "servers": [ { "address": "a:27017", "type": "Standalone", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 1 }, "suitable_servers": [ { "address": "a:27017", "type": "Standalone", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ], "in_latency_window": [ { "address": "a:27017", "type": "Standalone", "avg_rtt_ms": 5, "lastUpdateTime": 0, "maxWireVersion": 6, "lastWrite": { "lastWriteDate": { "$numberLong": "1" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Unknown/000077500000000000000000000000001511661753600255375ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/max_staleness/Unknown/SmallMaxStaleness.json000066400000000000000000000005351511661753600320350ustar00rootroot00000000000000{ "heartbeatFrequencyMS": 10000, "topology_description": { "type": "Unknown", "servers": [ { "address": "a:27017", "type": "Unknown", "maxWireVersion": 6 } ] }, "read_preference": { "mode": "Nearest", "maxStalenessSeconds": 1 }, "suitable_servers": [], "in_latency_window": [] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/000077500000000000000000000000001511661753600250665ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/connection-string/000077500000000000000000000000001511661753600305315ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/connection-string/read-concern.json000066400000000000000000000020551511661753600337660ustar00rootroot00000000000000{ "tests": [ { "description": "Default", "uri": "mongodb://localhost/", "valid": true, "warning": false, "readConcern": {} }, { "description": "local specified", "uri": "mongodb://localhost/?readConcernLevel=local", "valid": true, "warning": false, "readConcern": { "level": "local" } }, { "description": "majority specified", "uri": "mongodb://localhost/?readConcernLevel=majority", "valid": true, "warning": false, "readConcern": { "level": "majority" } }, { "description": "linearizable specified", "uri": "mongodb://localhost/?readConcernLevel=linearizable", "valid": true, "warning": false, "readConcern": { "level": "linearizable" } }, { "description": "available specified", "uri": "mongodb://localhost/?readConcernLevel=available", "valid": true, "warning": false, "readConcern": { "level": "available" } } ] } write-concern.json000066400000000000000000000052311511661753600341250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/connection-string{ "tests": [ { "description": "Default", "uri": "mongodb://localhost/", "valid": true, "warning": false, "writeConcern": {} }, { "description": "w as a valid number", "uri": "mongodb://localhost/?w=1", "valid": true, "warning": false, "writeConcern": { "w": 1 } }, { "description": "w as an invalid number", "uri": "mongodb://localhost/?w=-2", "valid": false, "warning": null }, { "description": "w as a string", "uri": "mongodb://localhost/?w=majority", "valid": true, "warning": false, "writeConcern": { "w": "majority" } }, { "description": "wtimeoutMS as a valid number", "uri": "mongodb://localhost/?wtimeoutMS=500", "valid": true, "warning": false, "writeConcern": { "wtimeoutMS": 500 } }, { "description": "wtimeoutMS as an invalid number", "uri": "mongodb://localhost/?wtimeoutMS=-500", "valid": false, "warning": null }, { "description": "journal as false", "uri": "mongodb://localhost/?journal=false", "valid": true, "warning": false, "writeConcern": { "journal": false } }, { "description": "journal as true", "uri": "mongodb://localhost/?journal=true", "valid": true, "warning": false, "writeConcern": { "journal": true } }, { "description": "All options combined", "uri": "mongodb://localhost/?w=3&wtimeoutMS=500&journal=true", "valid": true, "warning": false, "writeConcern": { "w": 3, "wtimeoutMS": 500, "journal": true } }, { "description": "Unacknowledged with w", "uri": "mongodb://localhost/?w=0", "valid": true, "warning": false, "writeConcern": { "w": 0 } }, { "description": "Unacknowledged with w and journal", "uri": "mongodb://localhost/?w=0&journal=false", "valid": true, "warning": false, "writeConcern": { "w": 0, "journal": false } }, { "description": "Unacknowledged with w and wtimeoutMS", "uri": "mongodb://localhost/?w=0&wtimeoutMS=500", "valid": true, "warning": false, "writeConcern": { "w": 0, "wtimeoutMS": 500 } }, { "description": "Acknowledged with w as 0 and journal true", "uri": "mongodb://localhost/?w=0&journal=true", "valid": false, "warning": false, "writeConcern": { "w": 0, "journal": true } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/document/000077500000000000000000000000001511661753600267045ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/document/read-concern.json000066400000000000000000000024361511661753600321440ustar00rootroot00000000000000{ "tests": [ { "description": "Default", "valid": true, "readConcern": {}, "readConcernDocument": {}, "isServerDefault": true }, { "description": "Majority", "valid": true, "readConcern": { "level": "majority" }, "readConcernDocument": { "level": "majority" }, "isServerDefault": false }, { "description": "Local", "valid": true, "readConcern": { "level": "local" }, "readConcernDocument": { "level": "local" }, "isServerDefault": false }, { "description": "Linearizable", "valid": true, "readConcern": { "level": "linearizable" }, "readConcernDocument": { "level": "linearizable" }, "isServerDefault": false }, { "description": "Snapshot", "valid": true, "readConcern": { "level": "snapshot" }, "readConcernDocument": { "level": "snapshot" }, "isServerDefault": false }, { "description": "Available", "valid": true, "readConcern": { "level": "available" }, "readConcernDocument": { "level": "available" }, "isServerDefault": false } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/document/write-concern.json000066400000000000000000000071331511661753600323620ustar00rootroot00000000000000{ "tests": [ { "description": "Default", "valid": true, "writeConcern": {}, "writeConcernDocument": {}, "isServerDefault": true, "isAcknowledged": true }, { "description": "W as a number", "valid": true, "writeConcern": { "w": 3 }, "writeConcernDocument": { "w": 3 }, "isServerDefault": false, "isAcknowledged": true }, { "description": "W as an invalid number", "valid": false, "writeConcern": { "w": -3 }, "writeConcernDocument": null, "isServerDefault": null, "isAcknowledged": null }, { "description": "W as majority", "valid": true, "writeConcern": { "w": "majority" }, "writeConcernDocument": { "w": "majority" }, "isServerDefault": false, "isAcknowledged": true }, { "description": "W as a custom string", "valid": true, "writeConcern": { "w": "my_mode" }, "writeConcernDocument": { "w": "my_mode" }, "isServerDefault": false, "isAcknowledged": true }, { "description": "WTimeoutMS", "valid": true, "writeConcern": { "wtimeoutMS": 1000 }, "writeConcernDocument": { "wtimeout": 1000 }, "isServerDefault": false, "isAcknowledged": true }, { "description": "WTimeoutMS as an invalid number", "valid": false, "writeConcern": { "wtimeoutMS": -1000 }, "writeConcernDocument": null, "isServerDefault": null, "isAcknowledged": null }, { "description": "Journal as true", "valid": true, "writeConcern": { "journal": true }, "writeConcernDocument": { "j": true }, "isServerDefault": false, "isAcknowledged": true }, { "description": "Journal as false", "valid": true, "writeConcern": { "journal": false }, "writeConcernDocument": { "j": false }, "isServerDefault": false, "isAcknowledged": true }, { "description": "Unacknowledged with only w", "valid": true, "writeConcern": { "w": 0 }, "writeConcernDocument": { "w": 0 }, "isServerDefault": false, "isAcknowledged": false }, { "description": "Unacknowledged with wtimeoutMS", "valid": true, "writeConcern": { "w": 0, "wtimeoutMS": 500 }, "writeConcernDocument": { "w": 0, "wtimeout": 500 }, "isServerDefault": false, "isAcknowledged": false }, { "description": "Unacknowledged with journal", "valid": true, "writeConcern": { "w": 0, "journal": false }, "writeConcernDocument": { "w": 0, "j": false }, "isServerDefault": false, "isAcknowledged": false }, { "description": "W is 0 with journal true", "valid": false, "writeConcern": { "w": 0, "journal": true }, "writeConcernDocument": { "w": 0, "j": true }, "isServerDefault": false, "isAcknowledged": true }, { "description": "Everything", "valid": true, "writeConcern": { "w": 3, "wtimeoutMS": 1000, "journal": true }, "writeConcernDocument": { "w": 3, "wtimeout": 1000, "j": true }, "isServerDefault": false, "isAcknowledged": true } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/operation/000077500000000000000000000000001511661753600270665ustar00rootroot00000000000000default-write-concern-2.6.json000066400000000000000000000277351511661753600344240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/operation{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "collection_name": "default_write_concern_coll", "database_name": "default_write_concern_db", "runOn": [ { "minServerVersion": "2.6" } ], "tests": [ { "description": "DeleteOne omits default write concern", "operations": [ { "name": "deleteOne", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": {} }, "result": { "deletedCount": 1 } } ], "expectations": [ { "command_started_event": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": {}, "limit": 1 } ], "writeConcern": null } } } ] }, { "description": "DeleteMany omits default write concern", "operations": [ { "name": "deleteMany", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": {} }, "result": { "deletedCount": 2 } } ], "expectations": [ { "command_started_event": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": {}, "limit": 0 } ], "writeConcern": null } } } ] }, { "description": "BulkWrite with all models omits default write concern", "operations": [ { "name": "bulkWrite", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "ordered": true, "requests": [ { "name": "deleteMany", "arguments": { "filter": {} } }, { "name": "insertOne", "arguments": { "document": { "_id": 1 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 2 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 2 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3 } } }, { "name": "updateMany", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 3 } } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 3 } } } ] } } ], "outcome": { "collection": { "name": "default_write_concern_coll", "data": [ { "_id": 1, "x": 3 }, { "_id": 2 } ] } }, "expectations": [ { "command_started_event": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": {}, "limit": 0 } ], "writeConcern": null } } }, { "command_started_event": { "command": { "insert": "default_write_concern_coll", "documents": [ { "_id": 1 } ], "writeConcern": null } } }, { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 1 } } } ], "writeConcern": null } } }, { "command_started_event": { "command": { "insert": "default_write_concern_coll", "documents": [ { "_id": 2 } ], "writeConcern": null } } }, { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 1 }, "u": { "x": 2 } } ], "writeConcern": null } } }, { "command_started_event": { "command": { "insert": "default_write_concern_coll", "documents": [ { "_id": 3 } ], "writeConcern": null } } }, { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 3 } }, "multi": true } ], "writeConcern": null } } }, { "command_started_event": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": { "_id": 3 }, "limit": 1 } ], "writeConcern": null } } } ] }, { "description": "InsertOne and InsertMany omit default write concern", "operations": [ { "name": "insertOne", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "document": { "_id": 3 } } }, { "name": "insertMany", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "documents": [ { "_id": 4 }, { "_id": 5 } ] } } ], "outcome": { "collection": { "name": "default_write_concern_coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ] } }, "expectations": [ { "command_started_event": { "command": { "insert": "default_write_concern_coll", "documents": [ { "_id": 3 } ], "writeConcern": null } } }, { "command_started_event": { "command": { "insert": "default_write_concern_coll", "documents": [ { "_id": 4 }, { "_id": 5 } ], "writeConcern": null } } } ] }, { "description": "UpdateOne, UpdateMany, and ReplaceOne omit default write concern", "operations": [ { "name": "updateOne", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "updateMany", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 2 }, "update": { "$set": { "x": 2 } } } }, { "name": "replaceOne", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 2 }, "replacement": { "x": 3 } } } ], "outcome": { "collection": { "name": "default_write_concern_coll", "data": [ { "_id": 1, "x": 1 }, { "_id": 2, "x": 3 } ] } }, "expectations": [ { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 1 } } } ], "writeConcern": null } } }, { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 2 }, "u": { "$set": { "x": 2 } }, "multi": true } ], "writeConcern": null } } }, { "command_started_event": { "command": { "update": "default_write_concern_coll", "updates": [ { "q": { "_id": 2 }, "u": { "x": 3 } } ], "writeConcern": null } } } ] } ] } default-write-concern-3.2.json000066400000000000000000000051231511661753600344040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/operation{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "collection_name": "default_write_concern_coll", "database_name": "default_write_concern_db", "runOn": [ { "minServerVersion": "3.2" } ], "tests": [ { "description": "findAndModify operations omit default write concern", "operations": [ { "name": "findOneAndUpdate", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "findOneAndReplace", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 2 }, "replacement": { "x": 2 } } }, { "name": "findOneAndDelete", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "filter": { "_id": 2 } } } ], "outcome": { "collection": { "name": "default_write_concern_coll", "data": [ { "_id": 1, "x": 1 } ] } }, "expectations": [ { "command_started_event": { "command": { "findAndModify": "default_write_concern_coll", "query": { "_id": 1 }, "update": { "$set": { "x": 1 } }, "writeConcern": null } } }, { "command_started_event": { "command": { "findAndModify": "default_write_concern_coll", "query": { "_id": 2 }, "update": { "x": 2 }, "writeConcern": null } } }, { "command_started_event": { "command": { "findAndModify": "default_write_concern_coll", "query": { "_id": 2 }, "remove": true, "writeConcern": null } } } ] } ] } default-write-concern-3.4.json000066400000000000000000000116641511661753600344150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/operation{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "collection_name": "default_write_concern_coll", "database_name": "default_write_concern_db", "runOn": [ { "minServerVersion": "3.4" } ], "tests": [ { "description": "Aggregate with $out omits default write concern", "operations": [ { "object": "collection", "collectionOptions": { "writeConcern": {} }, "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_collection_name" } ] } } ], "outcome": { "collection": { "name": "other_collection_name", "data": [ { "_id": 2, "x": 22 } ] } }, "expectations": [ { "command_started_event": { "command": { "aggregate": "default_write_concern_coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$out": "other_collection_name" } ], "writeConcern": null } } } ] }, { "description": "RunCommand with a write command omits default write concern (runCommand should never inherit write concern)", "operations": [ { "object": "database", "databaseOptions": { "writeConcern": {} }, "name": "runCommand", "command_name": "delete", "arguments": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": {}, "limit": 1 } ] } } } ], "expectations": [ { "command_started_event": { "command": { "delete": "default_write_concern_coll", "deletes": [ { "q": {}, "limit": 1 } ], "writeConcern": null } } } ] }, { "description": "CreateIndex and dropIndex omits default write concern", "operations": [ { "object": "collection", "collectionOptions": { "writeConcern": {} }, "name": "createIndex", "arguments": { "keys": { "x": 1 } } }, { "object": "collection", "collectionOptions": { "writeConcern": {} }, "name": "dropIndex", "arguments": { "name": "x_1" } } ], "expectations": [ { "command_started_event": { "command": { "createIndexes": "default_write_concern_coll", "indexes": [ { "name": "x_1", "key": { "x": 1 } } ], "writeConcern": null } } }, { "command_started_event": { "command": { "dropIndexes": "default_write_concern_coll", "index": "x_1", "writeConcern": null } } } ] }, { "description": "MapReduce omits default write concern", "operations": [ { "name": "mapReduce", "object": "collection", "collectionOptions": { "writeConcern": {} }, "arguments": { "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } } } ], "expectations": [ { "command_started_event": { "command": { "mapReduce": "default_write_concern_coll", "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 }, "writeConcern": null } } } ] } ] } default-write-concern-4.2.json000066400000000000000000000034001511661753600344010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/read_write_concern/operation{ "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "collection_name": "default_write_concern_coll", "database_name": "default_write_concern_db", "runOn": [ { "minServerVersion": "4.2" } ], "tests": [ { "description": "Aggregate with $merge omits default write concern", "operations": [ { "object": "collection", "databaseOptions": { "writeConcern": {} }, "collectionOptions": { "writeConcern": {} }, "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_collection_name" } } ] } } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "default_write_concern_coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "other_collection_name" } } ], "writeConcern": null } } } ], "outcome": { "collection": { "name": "other_collection_name", "data": [ { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/000077500000000000000000000000001511661753600244015ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/000077500000000000000000000000001511661753600256455ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/aggregate-merge.json000066400000000000000000000036471511661753600315750ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.11" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Aggregate with $merge does not retry", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "object": "collection", "name": "aggregate", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "output-collection" } } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$merge": { "into": "output-collection" } } ] }, "command_name": "aggregate", "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/aggregate-serverErrors.json000066400000000000000000000631741511661753600332020ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Aggregate succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11602 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13435 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13436 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 189 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 7 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 6 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 89 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 9001 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/aggregate.json000066400000000000000000000206631511661753600304750ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Aggregate succeeds on first attempt", "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "result": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Aggregate with $out does not retry", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "output-collection" } ] }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } }, { "$out": "output-collection" } ] }, "command_name": "aggregate", "database_name": "retryable-reads-tests" } } ] } ] } changeStreams-client.watch-serverErrors.json000066400000000000000000000401701511661753600363310ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "client.watch succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11602 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13435 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13436 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 189 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 7 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 6 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 89 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 9001 } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/changeStreams-client.watch.json000066400000000000000000000105771511661753600337170ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "client.watch succeeds on first attempt", "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] }, { "description": "client.watch fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true } } ] }, "database_name": "admin" } } ] } ] } changeStreams-db.coll.watch-serverErrors.json000066400000000000000000000360421511661753600363730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "db.coll.watch succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11602 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13435 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13436 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 189 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 7 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 6 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 89 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 9001 } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] } ] } changeStreams-db.coll.watch.json000066400000000000000000000101711511661753600336650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "db.coll.watch succeeds on first attempt", "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.coll.watch fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] } ] } changeStreams-db.watch-serverErrors.json000066400000000000000000000355121511661753600354440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "db.watch succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11602 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13435 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13436 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 189 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 7 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 6 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 89 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 9001 } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "watch", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/changeStreams-db.watch.json000066400000000000000000000100771511661753600330210ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "db.watch succeeds on first attempt", "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "db.watch fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "watch", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": {} } ] }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/count-serverErrors.json000066400000000000000000000303001511661753600323650ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "Count succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 11600 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 11602 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 13435 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 13436 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 189 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 91 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 7 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 6 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 89 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 9001 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/count.json000066400000000000000000000070141511661753600276720ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "Count succeeds on first attempt", "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Count fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "count", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } countDocuments-serverErrors.json000066400000000000000000000502101511661753600341720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "CountDocuments succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11602 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13435 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 13436 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 189 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 7 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 6 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 89 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 9001 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 10107 } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/countDocuments.json000066400000000000000000000126741511661753600315640ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "CountDocuments succeeds on first attempt", "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] }, { "description": "CountDocuments fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "aggregate": "coll", "pipeline": [ { "$match": {} }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ] }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/distinct-serverErrors.json000066400000000000000000000431551511661753600330720ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Distinct succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 11600 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 11602 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 10107 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 13435 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 13436 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 189 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 91 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 7 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 6 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 89 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 9001 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "distinct" ], "errorCode": 10107 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 10107 } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/distinct.json000066400000000000000000000116501511661753600303640ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "tests": [ { "description": "Distinct succeeds on first attempt", "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "closeConnection": true } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "result": [ 22, 33 ] } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "closeConnection": true } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Distinct fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "distinct" ], "closeConnection": true } }, "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": { "_id": { "$gt": 1 } } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "distinct": "coll", "key": "x", "query": { "_id": { "$gt": 1 } } }, "database_name": "retryable-reads-tests" } } ] } ] } estimatedDocumentCount-serverErrors.json000066400000000000000000000274561511661753600356670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "EstimatedDocumentCount succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 11600 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 11602 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 13435 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 13436 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 189 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 91 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 7 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 6 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 89 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 9001 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "errorCode": 10107 } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/estimatedDocumentCount.json000066400000000000000000000065771511661753600332460ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "EstimatedDocumentCount succeeds on first attempt", "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "result": 2 } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "EstimatedDocumentCount fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "count" ], "closeConnection": true } }, "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "count": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/find-serverErrors.json000066400000000000000000000471321511661753600321700ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "tests": [ { "description": "Find succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11602 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13435 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13436 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 189 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 7 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 6 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 89 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 9001 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/find.json000066400000000000000000000155751511661753600274750ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "tests": [ { "description": "Find succeeds on first attempt", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds on second attempt with explicit clientOptions", "clientOptions": { "retryReads": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "result": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Find fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 4 }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/findOne-serverErrors.json000066400000000000000000000360311511661753600326260ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "tests": [ { "description": "FindOne succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11602 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13435 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13436 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 189 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 7 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 6 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 89 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 9001 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/findOne.json000066400000000000000000000104501511661753600301220ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ], "tests": [ { "description": "FindOne succeeds on first attempt", "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": { "_id": 1, "x": 11 } } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "FindOne fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "findOne", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "coll", "filter": { "_id": 1 } }, "database_name": "retryable-reads-tests" } } ] } ] } gridfs-download-serverErrors.json000066400000000000000000000521451511661753600342540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "bucket_name": "fs", "data": { "fs.files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "filename": "abc", "metadata": {} } ], "fs.chunks": [ { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000001" }, "n": 0, "data": { "$binary": { "base64": "EQ==", "subType": "00" } } } ] }, "tests": [ { "description": "Download succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11602 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13435 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13436 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 189 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 7 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 6 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 89 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 9001 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/gridfs-download.json000066400000000000000000000135611511661753600316310ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "bucket_name": "fs", "data": { "fs.files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "filename": "abc", "metadata": {} } ], "fs.chunks": [ { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000001" }, "n": 0, "data": { "$binary": { "base64": "EQ==", "subType": "00" } } } ] }, "tests": [ { "description": "Download succeeds on first attempt", "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "Download fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download", "object": "gridfsbucket", "arguments": { "id": { "$oid": "000000000000000000000001" } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "_id": { "$oid": "000000000000000000000001" } } }, "database_name": "retryable-reads-tests" } } ] } ] } gridfs-downloadByName-serverErrors.json000066400000000000000000000461341511661753600353510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "bucket_name": "fs", "data": { "fs.files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "filename": "abc", "metadata": {} } ], "fs.chunks": [ { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000001" }, "n": 0, "data": { "$binary": { "base64": "EQ==", "subType": "00" } } } ] }, "tests": [ { "description": "DownloadByName succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11602 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13435 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 13436 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 189 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 7 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 6 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 89 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 9001 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 10107 } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/gridfs-downloadByName.json000066400000000000000000000125411511661753600327220ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "bucket_name": "fs", "data": { "fs.files": [ { "_id": { "$oid": "000000000000000000000001" }, "length": 1, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "filename": "abc", "metadata": {} } ], "fs.chunks": [ { "_id": { "$oid": "000000000000000000000002" }, "files_id": { "$oid": "000000000000000000000001" }, "n": 0, "data": { "$binary": { "base64": "EQ==", "subType": "00" } } } ] }, "tests": [ { "description": "DownloadByName succeeds on first attempt", "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" } } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.chunks", "filter": { "files_id": { "$oid": "000000000000000000000001" } }, "sort": { "n": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "DownloadByName fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "closeConnection": true } }, "operations": [ { "name": "download_by_name", "object": "gridfsbucket", "arguments": { "filename": "abc" }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "find": "fs.files", "filter": { "filename": "abc" } }, "database_name": "retryable-reads-tests" } } ] } ] } listCollectionNames-serverErrors.json000066400000000000000000000245031511661753600351410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollectionNames succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11600 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11602 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13435 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13436 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 189 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 91 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 7 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 6 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 89 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 9001 } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionNames", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionNames", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listCollectionNames.json000066400000000000000000000057521511661753600325240ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollectionNames succeeds on first attempt", "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionNames", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionNames", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionNames fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionNames", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } listCollectionObjects-serverErrors.json000066400000000000000000000245671511661753600355010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollectionObjects succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11600 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11602 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13435 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13436 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 189 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 91 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 7 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 6 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 89 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 9001 } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionObjects", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollectionObjects", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listCollectionObjects.json000066400000000000000000000057721511661753600330540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollectionObjects succeeds on first attempt", "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionObjects", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionObjects", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollectionObjects fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollectionObjects", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } listCollections-serverErrors.json000066400000000000000000000243331511661753600343410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollections succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11600 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 11602 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13435 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 13436 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 189 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 91 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 7 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 6 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 89 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 9001 } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollections", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "errorCode": 10107 } }, "operations": [ { "name": "listCollections", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listCollections.json000066400000000000000000000057121511661753600317170ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListCollections succeeds on first attempt", "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollections", "object": "database" } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollections", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } } ] }, { "description": "ListCollections fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listCollections" ], "closeConnection": true } }, "operations": [ { "name": "listCollections", "object": "database", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listCollections": 1 } } }, { "command_started_event": { "command": { "listCollections": 1 } } } ] } ] } listDatabaseNames-serverErrors.json000066400000000000000000000242511511661753600345520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabaseNames succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11600 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11602 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13435 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13436 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 189 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 91 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 7 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 6 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 89 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 9001 } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseNames", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseNames", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listDatabaseNames.json000066400000000000000000000057001511661753600321260ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabaseNames succeeds on first attempt", "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseNames", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseNames", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseNames fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseNames", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } listDatabaseObjects-serverErrors.json000066400000000000000000000243351511661753600351030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabaseObjects succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11600 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11602 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13435 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13436 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 189 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 91 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 7 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 6 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 89 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 9001 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabaseObjects", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listDatabaseObjects.json000066400000000000000000000057201511661753600324560ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabaseObjects succeeds on first attempt", "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseObjects", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseObjects", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabaseObjects fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabaseObjects", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listDatabases-serverErrors.json000066400000000000000000000241011511661753600340220ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabases succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11600 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 11602 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13435 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 13436 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 189 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 91 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 7 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 6 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 89 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 9001 } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabases", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "errorCode": 10107 } }, "operations": [ { "name": "listDatabases", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listDatabases.json000066400000000000000000000056401511661753600313300ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListDatabases succeeds on first attempt", "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabases", "object": "client" } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabases", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } } ] }, { "description": "ListDatabases fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } }, "operations": [ { "name": "listDatabases", "object": "client", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listDatabases": 1 } } }, { "command_started_event": { "command": { "listDatabases": 1 } } } ] } ] } listIndexNames-serverErrors.json000066400000000000000000000270061511661753600341160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListIndexNames succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 11600 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 11602 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 13435 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 13436 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 189 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 91 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 7 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 6 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 89 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 9001 } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexNames", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexNames", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listIndexNames.json000066400000000000000000000064101511661753600314700ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListIndexNames succeeds on first attempt", "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexNames", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexNames", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexNames fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexNames", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listIndexes-serverErrors.json000066400000000000000000000266701511661753600335470ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListIndexes succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 11600 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 11602 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 13435 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 13436 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 189 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 91 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 7 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 6 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 89 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 9001 } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexes", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "errorCode": 10107 } }, "operations": [ { "name": "listIndexes", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/listIndexes.json000066400000000000000000000063601511661753600310400ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [], "tests": [ { "description": "ListIndexes succeeds on first attempt", "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes succeeds on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexes", "object": "collection" } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes fails on first attempt", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexes", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] }, { "description": "ListIndexes fails on second attempt", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "listIndexes" ], "closeConnection": true } }, "operations": [ { "name": "listIndexes", "object": "collection", "error": true } ], "expectations": [ { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } }, { "command_started_event": { "command": { "listIndexes": "coll" }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/legacy/mapReduce.json000066400000000000000000000105751511661753600304550ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "retryable-reads-tests", "collection_name": "coll", "data": [ { "_id": 1, "x": 0 }, { "_id": 2, "x": 1 }, { "_id": 3, "x": 2 } ], "tests": [ { "description": "MapReduce succeeds with retry on", "operations": [ { "name": "mapReduce", "object": "collection", "arguments": { "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "result": [ { "_id": 0, "value": 6 } ] } ], "expectations": [ { "command_started_event": { "command": { "mapReduce": "coll", "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "MapReduce fails with retry on", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "mapReduce" ], "closeConnection": true } }, "operations": [ { "name": "mapReduce", "object": "collection", "arguments": { "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "mapReduce": "coll", "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "database_name": "retryable-reads-tests" } } ] }, { "description": "MapReduce fails with retry off", "clientOptions": { "retryReads": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "mapReduce" ], "closeConnection": true } }, "operations": [ { "name": "mapReduce", "object": "collection", "arguments": { "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "error": true } ], "expectations": [ { "command_started_event": { "command": { "mapReduce": "coll", "map": { "$code": "function inc() { return emit(0, this.x + 1) }" }, "reduce": { "$code": "function sum(key, values) { return values.reduce((acc, x) => acc + x); }" }, "out": { "inline": 1 } }, "database_name": "retryable-reads-tests" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/unified/000077500000000000000000000000001511661753600260245ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/unified/exceededTimeLimit.json000066400000000000000000000061101511661753600323010ustar00rootroot00000000000000{ "description": "ExceededTimeLimit is a retryable read", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-reads-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "exceededtimelimit-test" } } ], "initialData": [ { "collectionName": "exceededtimelimit-test", "databaseName": "retryable-reads-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Find succeeds on second attempt after ExceededTimeLimit", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 262 } } } }, { "name": "find", "arguments": { "filter": { "_id": { "$gt": 1 } } }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "exceededtimelimit-test", "filter": { "_id": { "$gt": 1 } } }, "commandName": "find", "databaseName": "retryable-reads-tests" } }, { "commandStartedEvent": { "command": { "find": "exceededtimelimit-test", "filter": { "_id": { "$gt": 1 } } }, "commandName": "find", "databaseName": "retryable-reads-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/unified/handshakeError.json000066400000000000000000002206131511661753600316630ustar00rootroot00000000000000{ "description": "retryable reads handshake failures", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ], "auth": true } ], "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "connectionCheckOutStartedEvent", "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "retryable-reads-handshake-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-reads-handshake-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "client.listDatabases succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listDatabases", "object": "client", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listDatabases" } }, { "commandSucceededEvent": { "commandName": "listDatabases" } } ] } ] }, { "description": "client.listDatabases succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listDatabases", "object": "client", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listDatabases" } }, { "commandSucceededEvent": { "commandName": "listDatabases" } } ] } ] }, { "description": "client.listDatabaseNames succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listDatabaseNames", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listDatabases" } }, { "commandSucceededEvent": { "commandName": "listDatabases" } } ] } ] }, { "description": "client.listDatabaseNames succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listDatabaseNames", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listDatabases" } }, { "commandSucceededEvent": { "commandName": "listDatabases" } } ] } ] }, { "description": "client.createChangeStream succeeds after retryable handshake network error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "client", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "client.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "client", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "database.aggregate succeeds after retryable handshake network error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "aggregate", "object": "database", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "database.aggregate succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "aggregate", "object": "database", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "database.listCollections succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listCollections", "object": "database", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections" } } ] } ] }, { "description": "database.listCollections succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listCollections", "object": "database", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections" } } ] } ] }, { "description": "database.listCollectionNames succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listCollectionNames", "object": "database", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections" } } ] } ] }, { "description": "database.listCollectionNames succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listCollectionNames", "object": "database", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listCollections" } }, { "commandSucceededEvent": { "commandName": "listCollections" } } ] } ] }, { "description": "database.createChangeStream succeeds after retryable handshake network error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "database", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "database.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "database", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.aggregate succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.aggregate succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.countDocuments succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.countDocuments succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.estimatedDocumentCount succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "estimatedDocumentCount", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "count" } }, { "commandSucceededEvent": { "commandName": "count" } } ] } ] }, { "description": "collection.estimatedDocumentCount succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "estimatedDocumentCount", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "count" } }, { "commandSucceededEvent": { "commandName": "count" } } ] } ] }, { "description": "collection.distinct succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "distinct" } }, { "commandSucceededEvent": { "commandName": "distinct" } } ] } ] }, { "description": "collection.distinct succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "distinct" } }, { "commandSucceededEvent": { "commandName": "distinct" } } ] } ] }, { "description": "collection.find succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "find", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "collection.find succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "find", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "collection.findOne succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOne", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "collection.findOne succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOne", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find" } } ] } ] }, { "description": "collection.listIndexes succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listIndexes", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listIndexes" } }, { "commandSucceededEvent": { "commandName": "listIndexes" } } ] } ] }, { "description": "collection.listIndexes succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listIndexes", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listIndexes" } }, { "commandSucceededEvent": { "commandName": "listIndexes" } } ] } ] }, { "description": "collection.listIndexNames succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listIndexNames", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listIndexes" } }, { "commandSucceededEvent": { "commandName": "listIndexes" } } ] } ] }, { "description": "collection.listIndexNames succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "listIndexNames", "object": "collection" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "listIndexes" } }, { "commandSucceededEvent": { "commandName": "listIndexes" } } ] } ] }, { "description": "collection.createChangeStream succeeds after retryable handshake network error", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "collection", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "collection.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "createChangeStream", "object": "collection", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream" } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-reads-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "aggregate" } }, { "commandSucceededEvent": { "commandName": "aggregate" } } ] } ] } ] } readConcernMajorityNotAvailableYet.json000066400000000000000000000062561511661753600355570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_reads/unified{ "description": "ReadConcernMajorityNotAvailableYet is a retryable read", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-reads-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "readconcernmajoritynotavailableyet_test" } } ], "initialData": [ { "collectionName": "readconcernmajoritynotavailableyet_test", "databaseName": "retryable-reads-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Find succeeds on second attempt after ReadConcernMajorityNotAvailableYet", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 134 } } } }, { "name": "find", "arguments": { "filter": { "_id": { "$gt": 1 } } }, "object": "collection0", "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "readconcernmajoritynotavailableyet_test", "filter": { "_id": { "$gt": 1 } } }, "commandName": "find", "databaseName": "retryable-reads-tests" } }, { "commandStartedEvent": { "command": { "find": "readconcernmajoritynotavailableyet_test", "filter": { "_id": { "$gt": 1 } } }, "commandName": "find", "databaseName": "retryable-reads-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/000077500000000000000000000000001511661753600246205ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/000077500000000000000000000000001511661753600260645ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/bulkWrite-errorLabels.json000066400000000000000000000163731511661753600332130ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "BulkWrite succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "1": 3 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "1": 3 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } }, { "description": "BulkWrite succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "1": 3 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/bulkWrite-serverErrors.json000066400000000000000000000036761511661753600334440ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "BulkWrite fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "update" ], "closeConnection": true } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/bulkWrite.json000066400000000000000000000421551511661753600307360ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "First command is retried", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "0": 2 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 2, "x": 23 } ] } } }, { "description": "All commands are retried", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 7 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 4, "x": 44 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, { "name": "insertOne", "arguments": { "document": { "_id": 5, "x": 55 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 3 }, "replacement": { "_id": 3, "x": 333 } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 3, "insertedIds": { "0": 2, "2": 3, "4": 5 }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 1, "upsertedIds": { "3": 4 } }, "collection": { "data": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 333 }, { "_id": 4, "x": 45 }, { "_id": 5, "x": 55 } ] } } }, { "description": "Both commands are retried after their first statement fails", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "0": 2 }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } } }, { "description": "Second command is retried after its second statement fails", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 2 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "0": 2 }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } } }, { "description": "BulkWrite with unordered execution", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } } ], "options": { "ordered": false } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 2, "insertedIds": { "0": 2, "1": 3 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "First insertOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 0, "insertedIds": {}, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "Second updateOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "0": 2 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "Third updateOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "1": 2 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "Single-document write following deleteMany is retried", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "deleteMany", "arguments": { "filter": { "x": 11 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "1": 2 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "Single-document write following updateMany is retried", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "bulkWrite", "arguments": { "requests": [ { "name": "updateMany", "arguments": { "filter": { "x": 11 }, "update": { "$inc": { "x": 1 } } } }, { "name": "insertOne", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "options": { "ordered": true } } }, "outcome": { "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "1": 2 }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/deleteMany.json000066400000000000000000000011761511661753600310530ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "DeleteMany ignores retryWrites", "useMultipleMongoses": true, "operation": { "name": "deleteMany", "arguments": { "filter": {} } }, "outcome": { "result": { "deletedCount": 2 }, "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/deleteOne-errorLabels.json000066400000000000000000000070311511661753600331360ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "DeleteOne succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "DeleteOne fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "DeleteOne succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "DeleteOne succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/deleteOne-serverErrors.json000066400000000000000000000023271511661753600333700ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "DeleteOne fails with RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/deleteOne.json000066400000000000000000000042101511661753600306600ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "DeleteOne is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "DeleteOne is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "result": { "deletedCount": 1 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "DeleteOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } findOneAndDelete-errorLabels.json000066400000000000000000000077571511661753600343220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndDelete succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndDelete fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndDelete succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndDelete succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } } ] } findOneAndDelete-serverErrors.json000066400000000000000000000025071511661753600345350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndDelete fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/findOneAndDelete.json000066400000000000000000000047211511661753600321130ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndDelete is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndDelete is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndDelete is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } findOneAndReplace-errorLabels.json000066400000000000000000000105331511661753600344550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndReplace succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndReplace fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndReplace succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndReplace succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } } ] } findOneAndReplace-serverErrors.json000066400000000000000000000025511511661753600347050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndReplace fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/findOneAndReplace.json000066400000000000000000000053171511661753600322660ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndReplace is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndReplace is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndReplace is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } findOneAndUpdate-errorLabels.json000066400000000000000000000105641511661753600343300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndUpdate succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndUpdate fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndUpdate succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndUpdate succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } } ] } findOneAndUpdate-serverErrors.json000066400000000000000000000025601511661753600345540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndUpdate fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/findOneAndUpdate.json000066400000000000000000000052741511661753600321370ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "FindOneAndUpdate is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndUpdate is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" } }, "outcome": { "result": { "_id": 1, "x": 11 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "FindOneAndUpdate is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertMany-errorLabels.json000066400000000000000000000114171511661753600333660ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "InsertMany succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertMany succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertMany-serverErrors.json000066400000000000000000000024501511661753600336120ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "InsertMany fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertMany.json000066400000000000000000000057501511661753600311170ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 } ], "tests": [ { "description": "InsertMany succeeds after one network error", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": true } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany with unordered execution", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "options": { "ordered": false } } }, "outcome": { "result": { "insertedIds": { "0": 2, "1": 3 } }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertMany fails after multiple network errors", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": "alwaysOn", "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ], "options": { "ordered": true } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertOne-errorLabels.json000066400000000000000000000376721511661753600332160ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [], "tests": [ { "description": "InsertOne succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [] } } }, { "description": "InsertOne succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 10107, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 13436, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 13435, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11602, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11600, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 7, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 6, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 9001, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 89, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after ExceededTimeLimit", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 262, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after WriteConcernError InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11600, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after WriteConcernError InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11602, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after WriteConcernError PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 189, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "result": { "insertedId": 1 }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } }, { "description": "InsertOne fails after multiple retryable writeConcernErrors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertOne-serverErrors.json000066400000000000000000000141071511661753600334310ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "InsertOne succeeds after connection failure", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "result": { "insertedId": 3 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertOne fails after connection failure when retryWrites option is false", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "InsertOne fails after Interrupted", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601, "closeConnection": false } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "InsertOne fails after WriteConcernError Interrupted", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "writeConcernError": { "code": 11601, "errmsg": "operation was interrupted" } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertOne fails after WriteConcernError WriteConcernFailed", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "writeConcernError": { "code": 64, "codeName": "WriteConcernFailed", "errmsg": "waiting for replication timed out", "errInfo": { "wtimeout": true } } } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertOne fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/insertOne.json000066400000000000000000000047651511661753600307410ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "InsertOne is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "result": { "insertedId": 3 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertOne is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "result": { "insertedId": 3 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } } }, { "description": "InsertOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/replaceOne-errorLabels.json000066400000000000000000000104051511661753600333060ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "ReplaceOne succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "ReplaceOne fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "ReplaceOne succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "ReplaceOne succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/replaceOne-serverErrors.json000066400000000000000000000024561511661753600335440ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "ReplaceOne fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "update" ], "closeConnection": true } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/replaceOne.json000066400000000000000000000052271511661753600310420ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "ReplaceOne is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "ReplaceOne is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } } }, { "description": "ReplaceOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/updateMany.json000066400000000000000000000016661511661753600310770ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "UpdateMany ignores retryWrites", "useMultipleMongoses": true, "operation": { "name": "updateMany", "arguments": { "filter": {}, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/updateOne-errorLabels.json000066400000000000000000000104361511661753600331610ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "UpdateOne succeeds with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne fails if server does not return RetryableWriteError", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11600, "errorLabels": [] } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "error": true, "result": { "errorLabelsOmit": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/updateOne-serverErrors.json000066400000000000000000000024651511661753600334130ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topology": [ "sharded", "load-balanced" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "UpdateOne fails with a RetryableWriteError label after two connection failures", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "update" ], "closeConnection": true } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "error": true, "result": { "errorLabelsContain": [ "RetryableWriteError" ] }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/legacy/updateOne.json000066400000000000000000000127471511661753600307160ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6", "topology": [ "replicaset" ] } ], "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ], "tests": [ { "description": "UpdateOne is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 }, "collection": { "data": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } }, { "description": "UpdateOne with upsert is committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 3 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } } }, { "description": "UpdateOne with upsert is not committed on first attempt", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "outcome": { "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 3 }, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } } }, { "description": "UpdateOne with upsert is never committed", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } }, "operation": { "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, "outcome": { "error": true, "collection": { "data": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/000077500000000000000000000000001511661753600262435ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/aggregate-out-merge.json000066400000000000000000000056701511661753600327760ustar00rootroot00000000000000{ "description": "aggregate with $out/$merge does not set txnNumber", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "mergeCollection", "databaseName": "retryable-writes-tests", "documents": [] } ], "tests": [ { "description": "aggregate with $out does not set txnNumber", "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "outCollection" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "aggregate", "command": { "txnNumber": { "$$exists": false } } } } ] } ] }, { "description": "aggregate with $merge does not set txnNumber", "runOnRequirements": [ { "minServerVersion": "4.1.11" } ], "operations": [ { "object": "collection0", "name": "aggregate", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$merge": { "into": "mergeCollection" } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "aggregate", "command": { "txnNumber": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/bulkWrite-serverErrors.json000066400000000000000000000110031511661753600336020ustar00rootroot00000000000000{ "description": "retryable-writes bulkWrite serverErrors", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "BulkWrite succeeds after retryable writeConcernError in first batch", "runOnRequirements": [ { "minServerVersion": "4.3.1" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 3, "x": 33 } } }, { "deleteOne": { "filter": { "_id": 2 } } } ] }, "expectResult": { "deletedCount": 1, "insertedCount": 1, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "insertedIds": { "$$unsetOrMatches": { "0": 3 } }, "upsertedIds": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } }, { "commandStartedEvent": { "command": { "delete": "coll", "deletes": [ { "q": { "_id": 2 }, "limit": 1 } ] }, "commandName": "delete", "databaseName": "retryable-writes-tests" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/bulkWrite.json000066400000000000000000000614201511661753600311110ustar00rootroot00000000000000{ "description": "bulkWrite", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "First command is retried", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "filter": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 2 } }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 23 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "delete", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "All commands are retried", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 7 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "insertOne": { "document": { "_id": 3, "x": 33 } } }, { "updateOne": { "filter": { "_id": 4, "x": 44 }, "update": { "$inc": { "x": 1 } }, "upsert": true } }, { "insertOne": { "document": { "_id": 5, "x": 55 } } }, { "replaceOne": { "filter": { "_id": 3 }, "replacement": { "_id": 3, "x": 333 } } }, { "deleteOne": { "filter": { "_id": 1 } } } ], "ordered": true }, "expectResult": { "deletedCount": 1, "insertedCount": 3, "insertedIds": { "$$unsetOrMatches": { "0": 2, "2": 3, "4": 5 } }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 1, "upsertedIds": { "3": 4 } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 23 }, { "_id": 3, "x": 333 }, { "_id": 4, "x": 45 }, { "_id": 5, "x": 55 } ] } ] }, { "description": "Both commands are retried after their first statement fails", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 2 } }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } ] }, { "description": "Second command is retried after its second statement fails", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 2 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 2 } }, "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } ] }, { "description": "BulkWrite with unordered execution", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "insertOne": { "document": { "_id": 3, "x": 33 } } } ], "ordered": false }, "expectResult": { "deletedCount": 0, "insertedCount": 2, "insertedIds": { "$$unsetOrMatches": { "0": 2, "1": 3 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "First insertOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "filter": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true, "expectResult": { "deletedCount": 0, "insertedCount": 0, "insertedIds": { "$$unsetOrMatches": {} }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] }, { "description": "Second updateOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "filter": { "_id": 1 } } } ], "ordered": true }, "expectError": { "isError": true, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "0": 2 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "Third updateOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "skip": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "insertOne": { "document": { "_id": 2, "x": 22 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "ordered": true }, "expectError": { "isError": true, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "1": 2 } }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "Single-document write following deleteMany is retried", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": { "x": 11 } } }, { "insertOne": { "document": { "_id": 2, "x": 22 } } } ], "ordered": true }, "expectResult": { "deletedCount": 1, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "1": 2 } }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "Single-document write following updateMany is retried", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": { "x": 11 }, "update": { "$inc": { "x": 1 } } } }, { "insertOne": { "document": { "_id": 2, "x": 22 } } } ], "ordered": true }, "expectResult": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "$$unsetOrMatches": { "1": 2 } }, "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0, "upsertedIds": {} } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "collection bulkWrite with updateMany does not set txnNumber", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "updateMany": { "filter": {}, "update": { "$set": { "x": 1 } } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": false } } } } ] } ] }, { "description": "collection bulkWrite with deleteMany does not set txnNumber", "operations": [ { "object": "collection0", "name": "bulkWrite", "arguments": { "requests": [ { "deleteMany": { "filter": {} } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "delete", "command": { "txnNumber": { "$$exists": false } } } } ] } ] } ] } client-bulkWrite-clientErrors.json000066400000000000000000000205561511661753600347640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified{ "description": "client bulkWrite retryable writes with client errors", "schemaVersion": "1.20", "runOnRequirements": [ { "minServerVersion": "8.0", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "retryable-writes-tests.coll0" }, "tests": [ { "description": "client bulkWrite with one network error succeeds after retry", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "closeConnection": true } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-tests.coll0", "document": { "_id": 4, "x": 44 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 4 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "client bulkWrite with two network errors fails after retry", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "bulkWrite" ], "closeConnection": true } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-tests.coll0", "document": { "_id": 4, "x": 44 } } } ], "verboseResults": true }, "expectError": { "isClientError": true, "errorLabelsContain": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } client-bulkWrite-serverErrors.json000066400000000000000000000556061511661753600350200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified{ "description": "client bulkWrite retryable writes", "schemaVersion": "1.21", "runOnRequirements": [ { "minServerVersion": "8.0", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "useMultipleMongoses": false } }, { "client": { "id": "clientRetryWritesFalse", "uriOptions": { "retryWrites": false }, "observeEvents": [ "commandStartedEvent" ], "useMultipleMongoses": false } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "_yamlAnchors": { "namespace": "retryable-writes-tests.coll0" }, "tests": [ { "description": "client bulkWrite with no multi: true operations succeeds after retryable top-level error", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-tests.coll0", "document": { "_id": 4, "x": 44 } } }, { "updateOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "replaceOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 2 }, "replacement": { "x": 222 } } }, { "deleteOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 3 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 2, "modifiedCount": 2, "deletedCount": 1, "insertResults": { "0": { "insertedId": 4 } }, "updateResults": { "1": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": { "3": { "deletedCount": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "_id": 2 }, "updateMods": { "x": 222 }, "multi": false }, { "delete": 0, "filter": { "_id": 3 }, "multi": false } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "_id": 2 }, "updateMods": { "x": 222 }, "multi": false }, { "delete": 0, "filter": { "_id": 3 }, "multi": false } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 222 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "client bulkWrite with multi: true operations fails after retryable top-level error", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateMany": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "deleteMany": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 3 } } } ] }, "expectError": { "errorCode": 189, "errorLabelsContain": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": true }, { "delete": 0, "filter": { "_id": 3 }, "multi": true } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "txnNumber": { "$$exists": false } } } } ] } ] }, { "description": "client bulkWrite with no multi: true operations succeeds after retryable writeConcernError", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-tests.coll0", "document": { "_id": 4, "x": 44 } } }, { "updateOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "replaceOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 2 }, "replacement": { "x": 222 } } }, { "deleteOne": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 3 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 2, "modifiedCount": 2, "deletedCount": 1, "insertResults": { "0": { "insertedId": 4 } }, "updateResults": { "1": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } } }, "deleteResults": { "3": { "deletedCount": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "_id": 2 }, "updateMods": { "x": 222 }, "multi": false }, { "delete": 0, "filter": { "_id": 3 }, "multi": false } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "_id": 2 }, "updateMods": { "x": 222 }, "multi": false }, { "delete": 0, "filter": { "_id": 3 }, "multi": false } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "lsid": { "$$exists": true }, "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "client bulkWrite with multi: true operations fails after retryable writeConcernError", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "models": [ { "updateMany": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "deleteMany": { "namespace": "retryable-writes-tests.coll0", "filter": { "_id": 3 } } } ] }, "expectError": { "writeConcernErrors": [ { "code": 91, "message": "Replication is being shut down" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": true }, { "delete": 0, "filter": { "_id": 3 }, "multi": true } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "txnNumber": { "$$exists": false } } } } ] } ] }, { "description": "client bulkWrite with retryWrites: false does not retry", "operations": [ { "object": "testRunner", "name": "failPoint", "arguments": { "client": "clientRetryWritesFalse", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } } } }, { "object": "clientRetryWritesFalse", "name": "clientBulkWrite", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-tests.coll0", "document": { "_id": 4, "x": 44 } } } ] }, "expectError": { "errorCode": 189, "errorLabelsContain": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "clientRetryWritesFalse", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 4, "x": 44 } } ], "nsInfo": [ { "ns": "retryable-writes-tests.coll0" } ], "txnNumber": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/deleteMany.json000066400000000000000000000034711511661753600312320ustar00rootroot00000000000000{ "description": "deleteMany", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "DeleteMany ignores retryWrites", "operations": [ { "object": "collection0", "name": "deleteMany", "arguments": { "filter": {} }, "expectResult": { "deletedCount": 2 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "delete", "command": { "txnNumber": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/deleteOne.json000066400000000000000000000110571511661753600310460ustar00rootroot00000000000000{ "description": "deleteOne", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "DeleteOne is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 } }, "expectResult": { "deletedCount": 1 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "delete", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "delete", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "DeleteOne is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 } }, "expectResult": { "deletedCount": 1 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "DeleteOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "deleteOne", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/findOneAndDelete.json000066400000000000000000000116571511661753600323000ustar00rootroot00000000000000{ "description": "findOneAndDelete", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndDelete is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "FindOneAndDelete is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndDelete is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndDelete", "arguments": { "filter": { "x": { "$gte": 11 } }, "sort": { "x": 1 } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/findOneAndReplace.json000066400000000000000000000122561511661753600324450ustar00rootroot00000000000000{ "description": "findOneAndReplace", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndReplace is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "FindOneAndReplace is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndReplace is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndReplace", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 }, "returnDocument": "Before" }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/findOneAndUpdate.json000066400000000000000000000122361511661753600323120ustar00rootroot00000000000000{ "description": "findOneAndUpdate", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndUpdate is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "findAndModify", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "FindOneAndUpdate is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "findOneAndUpdate", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/handshakeError.json000066400000000000000000001361201511661753600321010ustar00rootroot00000000000000{ "description": "retryable writes handshake failures", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ], "auth": true } ], "createEntities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "connectionCheckOutStartedEvent", "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "retryable-writes-handshake-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-handshake-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "client.clientBulkWrite succeeds after retryable handshake network error", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "clientBulkWrite", "object": "client", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-handshake-tests.coll", "document": { "_id": 8, "x": 88 } } } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "bulkWrite" } }, { "commandSucceededEvent": { "commandName": "bulkWrite" } } ] } ] }, { "description": "client.clientBulkWrite succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "clientBulkWrite", "object": "client", "arguments": { "models": [ { "insertOne": { "namespace": "retryable-writes-handshake-tests.coll", "document": { "_id": 8, "x": 88 } } } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "bulkWrite" } }, { "commandSucceededEvent": { "commandName": "bulkWrite" } } ] } ] }, { "description": "collection.insertOne succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "collection.insertOne succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2, "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "collection.insertMany succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 2, "x": 22 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "collection.insertMany succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 2, "x": 22 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "collection.deleteOne succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "deleteOne", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "delete" } }, { "commandSucceededEvent": { "commandName": "delete" } } ] } ] }, { "description": "collection.deleteOne succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "deleteOne", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "delete" } }, { "commandSucceededEvent": { "commandName": "delete" } } ] } ] }, { "description": "collection.replaceOne succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "replaceOne", "object": "collection", "arguments": { "filter": {}, "replacement": { "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandSucceededEvent": { "commandName": "update" } } ] } ] }, { "description": "collection.replaceOne succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "replaceOne", "object": "collection", "arguments": { "filter": {}, "replacement": { "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandSucceededEvent": { "commandName": "update" } } ] } ] }, { "description": "collection.updateOne succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "updateOne", "object": "collection", "arguments": { "filter": {}, "update": { "$set": { "x": 22 } } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandSucceededEvent": { "commandName": "update" } } ] } ] }, { "description": "collection.updateOne succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "updateOne", "object": "collection", "arguments": { "filter": {}, "update": { "$set": { "x": 22 } } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandSucceededEvent": { "commandName": "update" } } ] } ] }, { "description": "collection.findOneAndDelete succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.findOneAndDelete succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "filter": {} } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.findOneAndReplace succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "filter": {}, "replacement": { "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.findOneAndReplace succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "filter": {}, "replacement": { "x": 22 } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.findOneAndUpdate succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "filter": {}, "update": { "$set": { "x": 22 } } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.findOneAndUpdate succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "filter": {}, "update": { "$set": { "x": 22 } } } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "findAndModify" } }, { "commandSucceededEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "collection.bulkWrite succeeds after retryable handshake network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] }, { "description": "collection.bulkWrite succeeds after retryable handshake server error (ShutdownInProgress)", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "ping", "saslContinue" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectError": { "isError": true } }, { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 2, "x": 22 } } } ] } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-writes-handshake-tests" } }, { "commandFailedEvent": { "commandName": "ping" } }, { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/insertMany.json000066400000000000000000000142401511661753600312700ustar00rootroot00000000000000{ "description": "insertMany", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "InsertMany succeeds after one network error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "ordered": true }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 2, "1": 3 } } } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "InsertMany with unordered execution", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "ordered": false }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 2, "1": 3 } } } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "InsertMany fails after multiple network errors", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": "alwaysOn", "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "insertMany", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ], "ordered": true }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } insertOne-noWritesPerformedError.json000066400000000000000000000037471511661753600355260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified{ "description": "retryable-writes insertOne noWritesPerformedErrors", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "6.0", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "no-writes-performed-collection" } } ], "tests": [ { "description": "InsertOne fails after NoWritesPerformed error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "errorCode": 64, "errorLabels": [ "NoWritesPerformed", "RetryableWriteError" ] } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } }, "expectError": { "errorCode": 64, "errorLabelsContain": [ "NoWritesPerformed", "RetryableWriteError" ] } } ], "outcome": [ { "collectionName": "no-writes-performed-collection", "databaseName": "retryable-writes-tests", "documents": [] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/insertOne-serverErrors.json000066400000000000000000000254171511661753600336160ustar00rootroot00000000000000{ "description": "retryable-writes insertOne serverErrors", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "InsertOne succeeds after retryable writeConcernError", "runOnRequirements": [ { "minServerVersion": "4.3.1" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "RetryableWriteError label is added based on top-level code in pre-4.4 server response", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99", "topologies": [ "replicaset", "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "errorCode": 189 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "errorLabelsContain": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "RetryableWriteError label is added based on writeConcernError in pre-4.4 mongod response", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "errorLabelsContain": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } }, { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "RetryableWriteError label is not added based on writeConcernError in pre-4.4 mongos response", "runOnRequirements": [ { "minServerVersion": "4.2", "maxServerVersion": "4.2.99", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "errorLabelsOmit": [ "RetryableWriteError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 3, "x": 33 } ] }, "commandName": "insert", "databaseName": "retryable-writes-tests" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/insertOne.json000066400000000000000000000121621511661753600311060ustar00rootroot00000000000000{ "description": "insertOne", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "InsertOne is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "InsertOne is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "InsertOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "insertOne", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/replaceOne.json000066400000000000000000000121371511661753600312170ustar00rootroot00000000000000{ "description": "replaceOne", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "ReplaceOne is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "ReplaceOne is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 111 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "ReplaceOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "_id": 1, "x": 111 } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } unacknowledged-write-concern.json000066400000000000000000000027651511661753600346400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified{ "description": "unacknowledged write does not set txnNumber", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0", "collectionOptions": { "writeConcern": { "w": 0 } } } } ], "tests": [ { "description": "unacknowledged write does not set txnNumber", "operations": [ { "object": "collection0", "name": "insertOne", "arguments": { "document": { "_id": 1, "x": 11 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "insert", "command": { "txnNumber": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/updateMany.json000066400000000000000000000041771511661753600312560ustar00rootroot00000000000000{ "description": "updateMany", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "UpdateMany ignores retryWrites", "operations": [ { "object": "collection0", "name": "updateMany", "arguments": { "filter": {}, "update": { "$inc": { "x": 1 } } }, "expectResult": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 23 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/retryable_writes/unified/updateOne.json000066400000000000000000000221111511661753600310570ustar00rootroot00000000000000{ "description": "updateOne", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "UpdateOne is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "update", "command": { "txnNumber": { "$$exists": true } } } } ] } ] }, { "description": "UpdateOne is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectResult": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "UpdateOne is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "UpdateOne with upsert is committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "expectResult": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 3 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } ] }, { "description": "UpdateOne with upsert is not committed on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "expectResult": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 3 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 34 } ] } ] }, { "description": "UpdateOne with upsert is never committed", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "object": "collection0", "name": "updateOne", "arguments": { "filter": { "_id": 3, "x": 33 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/000077500000000000000000000000001511661753600277165ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors/000077500000000000000000000000001511661753600312325ustar00rootroot00000000000000error_handling_handshake.json000066400000000000000000000054411511661753600370550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Network timeouts before and after the handshake completes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore network timeout application error (afterHandshakeCompletes)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "timeout" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Mark server unknown on network timeout application error (beforeHandshakeCompletes)", "applicationErrors": [ { "address": "a:27017", "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "timeout" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-network-error.json000066400000000000000000000035711511661753600365720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale network error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale network error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-network-timeout-error.json000066400000000000000000000041541511661753600402540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale network timeout error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale network timeout error does not mark server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "timeout" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-InterruptedAtShutdown.json000066400000000000000000000047411511661753600451470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater InterruptedAtShutdown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.json000066400000000000000000000047771511661753600470320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater InterruptedDueToReplStateChange error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-LegacyNotPrimary.json000066400000000000000000000047221511661753600440510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater LegacyNotPrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.json000066400000000000000000000047471511661753600453720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater NotPrimaryNoSecondaryOk error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-NotPrimaryOrSecondary.json000066400000000000000000000047411511661753600450760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater NotPrimaryOrSecondary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-NotWritablePrimary.json000066400000000000000000000047301511661753600444150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater NotWritablePrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-PrimarySteppedDown.json000066400000000000000000000047261511661753600444240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater PrimarySteppedDown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-greater-ShutdownInProgress.json000066400000000000000000000047251511661753600444520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion greater ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion greater ShutdownInProgress error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-InterruptedAtShutdown.json000066400000000000000000000041101511661753600451550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing InterruptedAtShutdown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.json000066400000000000000000000041461511661753600470400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing InterruptedDueToReplStateChange error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-LegacyNotPrimary.json000066400000000000000000000040711511661753600440660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing LegacyNotPrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.json000066400000000000000000000041161511661753600454000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing NotPrimaryNoSecondaryOk error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-NotPrimaryOrSecondary.json000066400000000000000000000041101511661753600451040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing NotPrimaryOrSecondary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-NotWritablePrimary.json000066400000000000000000000040771511661753600444410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing NotWritablePrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-PrimarySteppedDown.json000066400000000000000000000040751511661753600444410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing PrimarySteppedDown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-missing-ShutdownInProgress.json000066400000000000000000000040741511661753600444670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion missing ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion missing ShutdownInProgress error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.json000066400000000000000000000047671511661753600472130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed InterruptedAtShutdown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.json000066400000000000000000000050251511661753600510510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed InterruptedDueToReplStateChange error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.json000066400000000000000000000047501511661753600461060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed LegacyNotPrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.json000066400000000000000000000047751511661753600474270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed NotPrimaryNoSecondaryOk error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.json000066400000000000000000000047671511661753600471420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed NotPrimaryOrSecondary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.json000066400000000000000000000047561511661753600464610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed NotWritablePrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.json000066400000000000000000000047541511661753600464610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed PrimarySteppedDown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.json000066400000000000000000000047531511661753600465070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Non-stale topologyVersion proccessId changed ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale topologyVersion proccessId changed ShutdownInProgress error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-InterruptedAtShutdown.json000066400000000000000000000031751511661753600376100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 InterruptedAtShutdown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-InterruptedDueToReplStateChange.json000066400000000000000000000032331511661753600414550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 InterruptedDueToReplStateChange error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-LegacyNotPrimary.json000066400000000000000000000031561511661753600365120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 LegacyNotPrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-NotPrimaryNoSecondaryOk.json000066400000000000000000000032031511661753600400150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 NotPrimaryNoSecondaryOk error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-NotPrimaryOrSecondary.json000066400000000000000000000031751511661753600375370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 NotPrimaryOrSecondary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-NotWritablePrimary.json000066400000000000000000000031641511661753600370560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 NotWritablePrimary error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-PrimarySteppedDown.json000066400000000000000000000031621511661753600370560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 PrimarySteppedDown error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } post-42-ShutdownInProgress.json000066400000000000000000000031611511661753600371040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Post-4.2 ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 8 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Post-4.2 ShutdownInProgress error marks server Unknown", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 8, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-InterruptedAtShutdown.json000066400000000000000000000032171511661753600374060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 InterruptedAtShutdown error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-InterruptedDueToReplStateChange.json000066400000000000000000000032551511661753600412620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 InterruptedDueToReplStateChange error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-LegacyNotPrimary.json000066400000000000000000000032001511661753600363010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 LegacyNotPrimary error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-NotPrimaryNoSecondaryOk.json000066400000000000000000000032251511661753600376220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 NotPrimaryNoSecondaryOk error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-NotPrimaryOrSecondary.json000066400000000000000000000032171511661753600373350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 NotPrimaryOrSecondary error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-NotWritablePrimary.json000066400000000000000000000032061511661753600366540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 NotWritablePrimary error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-PrimarySteppedDown.json000066400000000000000000000032041511661753600366540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 PrimarySteppedDown error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } pre-42-ShutdownInProgress.json000066400000000000000000000032031511661753600367020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Pre-4.2 ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Pre-4.2 ShutdownInProgress error marks server Unknown and clears the pool", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 7, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91 } } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } prefer-error-code.json000066400000000000000000000062731511661753600354000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Do not check errmsg when code exists", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "errmsg \"not master\" gets ignored when error code exists", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "not master", "code": 1 } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "errmsg \"node is recovering\" gets ignored when error code exists", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "node is recovering", "code": 1 } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-InterruptedAtShutdown.json000066400000000000000000000103771511661753600416430ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedAtShutdown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-InterruptedDueToReplStateChange.json000066400000000000000000000104351511661753600435100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedDueToReplStateChange error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-NotPrimaryNoSecondaryOk.json000066400000000000000000000104051511661753600420500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryNoSecondaryOk error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-NotPrimaryOrSecondary.json000066400000000000000000000103771511661753600415720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryOrSecondary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-NotWritablePrimary.json000066400000000000000000000103661511661753600411110ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotWritablePrimary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-PrimarySteppedDown.json000066400000000000000000000103641511661753600411110ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale PrimarySteppedDown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-ShutdownInProgress.json000066400000000000000000000103631511661753600411370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale ShutdownInProgress error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.json000066400000000000000000000104271511661753600464210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedAtShutdown error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedAtShutdown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.json000066400000000000000000000104651511661753600502750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedDueToReplStateChange error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedDueToReplStateChange error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-LegacyNotPrimary.json000066400000000000000000000104101511661753600453140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation LegacyNotPrimary error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale LegacyNotPrimary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.json000066400000000000000000000104351511661753600466350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryNoSecondaryOk error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryNoSecondaryOk error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.json000066400000000000000000000104271511661753600463500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryOrSecondary error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryOrSecondary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-NotWritablePrimary.json000066400000000000000000000104161511661753600456670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotWritablePrimary error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotWritablePrimary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-PrimarySteppedDown.json000066400000000000000000000104141511661753600456670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation PrimarySteppedDown error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale PrimarySteppedDown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-ShutdownInProgress.json000066400000000000000000000104131511661753600457150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation ShutdownInProgress error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale ShutdownInProgress error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-network.json000066400000000000000000000076311511661753600435670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation network error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale network error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-afterHandshakeCompletes-timeout.json000066400000000000000000000076311511661753600435640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation timeout error afterHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale timeout error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "timeout" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.json000066400000000000000000000104311511661753600465550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedAtShutdown error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedAtShutdown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.json000066400000000000000000000104671511661753600504400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation InterruptedDueToReplStateChange error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedDueToReplStateChange error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.json000066400000000000000000000104121511661753600454570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation LegacyNotPrimary error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale LegacyNotPrimary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.json000066400000000000000000000104371511661753600470000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryNoSecondaryOk error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryNoSecondaryOk error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.json000066400000000000000000000104311511661753600465040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotPrimaryOrSecondary error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryOrSecondary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-NotWritablePrimary.json000066400000000000000000000104201511661753600460230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation NotWritablePrimary error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotWritablePrimary error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.json000066400000000000000000000104161511661753600460320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation PrimarySteppedDown error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale PrimarySteppedDown error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-ShutdownInProgress.json000066400000000000000000000104151511661753600460600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation ShutdownInProgress error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale ShutdownInProgress error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-network.json000066400000000000000000000076331511661753600437320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation network error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale network error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-generation-beforeHandshakeCompletes-timeout.json000066400000000000000000000076331511661753600437270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale generation timeout error beforeHandshakeCompletes", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Non-stale application network error", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "network" } ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Primary A is rediscovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale timeout error (stale generation)", "applicationErrors": [ { "address": "a:27017", "generation": 0, "when": "beforeHandshakeCompletes", "maxWireVersion": 9, "type": "timeout" } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 1 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-InterruptedAtShutdown.json000066400000000000000000000072411511661753600427260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion InterruptedAtShutdown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedAtShutdown error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedAtShutdown error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedAtShutdown", "code": 11600, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-InterruptedDueToReplStateChange.json000066400000000000000000000073231511661753600446010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion InterruptedDueToReplStateChange error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedDueToReplStateChange error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale InterruptedDueToReplStateChange error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "InterruptedDueToReplStateChange", "code": 11602, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-LegacyNotPrimary.json000066400000000000000000000072101511661753600416250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion LegacyNotPrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale LegacyNotPrimary error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale LegacyNotPrimary error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "LegacyNotPrimary", "code": 10058, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-NotPrimaryNoSecondaryOk.json000066400000000000000000000072531511661753600431460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion NotPrimaryNoSecondaryOk error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryNoSecondaryOk error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryNoSecondaryOk error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-NotPrimaryOrSecondary.json000066400000000000000000000072411511661753600426550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion NotPrimaryOrSecondary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryOrSecondary error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotPrimaryOrSecondary error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotPrimaryOrSecondary", "code": 13436, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-NotWritablePrimary.json000066400000000000000000000072221511661753600421750ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion NotWritablePrimary error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotWritablePrimary error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale NotWritablePrimary error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "NotWritablePrimary", "code": 10107, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-PrimarySteppedDown.json000066400000000000000000000072161511661753600422020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion PrimarySteppedDown error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale PrimarySteppedDown error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale PrimarySteppedDown error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "PrimarySteppedDown", "code": 189, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } stale-topologyVersion-ShutdownInProgress.json000066400000000000000000000072141511661753600422270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "Stale topologyVersion ShutdownInProgress error", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale ShutdownInProgress error (topologyVersion less)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore stale ShutdownInProgress error (topologyVersion equal)", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 0, "errmsg": "ShutdownInProgress", "code": 91, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } write_errors_ignored.json000066400000000000000000000045141511661753600363070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/errors{ "description": "writeErrors field is ignored", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "description": "Primary A is discovered", "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "description": "Ignore command error with writeErrors field", "applicationErrors": [ { "address": "a:27017", "when": "afterHandshakeCompletes", "maxWireVersion": 9, "type": "command", "response": { "ok": 1, "writeErrors": [ { "errmsg": "NotPrimaryNoSecondaryOk", "code": 13435, "index": 0 } ] } } ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } }, "pool": { "generation": 0 } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration/000077500000000000000000000000001511661753600322415ustar00rootroot00000000000000cancel-server-check.json000066400000000000000000000053051511661753600366640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.2", "topology": [ "sharded" ] } ], "database_name": "sdam-tests", "collection_name": "cancel-server-check", "data": [], "tests": [ { "description": "Cancel server check", "clientOptions": { "retryWrites": true, "heartbeatFrequencyMS": 10000, "serverSelectionTimeoutMS": 5000, "appname": "cancelServerCheckTest" }, "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } } ] } connectTimeoutMS.json000066400000000000000000000062421511661753600363210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "connectTimeoutMS", "data": [], "tests": [ { "description": "connectTimeoutMS=0", "clientOptions": { "retryWrites": false, "connectTimeoutMS": 0, "heartbeatFrequencyMS": 500, "appname": "connectTimeoutMS=0" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "connectTimeoutMS=0", "blockConnection": true, "blockTimeMS": 550 } } } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 750 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 0 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 0 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "connectTimeoutMS", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "connectTimeoutMS", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } find-network-error.json000066400000000000000000000057051511661753600366220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "find-network-error", "data": [ { "_id": 1 }, { "_id": 2 } ], "tests": [ { "description": "Reset server and pool after network error on find", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true, "appName": "findNetworkErrorTest" } }, "clientOptions": { "retryWrites": false, "retryReads": false, "appname": "findNetworkErrorTest" }, "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "expectations": [ { "command_started_event": { "command": { "find": "find-network-error" }, "command_name": "find", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "find-network-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } } } ] } find-shutdown-error.json000066400000000000000000000073521511661753600370040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "find-shutdown-error", "data": [], "tests": [ { "description": "Concurrent shutdown error on find", "clientOptions": { "retryWrites": false, "retryReads": false, "heartbeatFrequencyMS": 500, "appname": "shutdownErrorFindTest" }, "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "appName": "shutdownErrorFindTest", "errorCode": 91, "blockConnection": true, "blockTimeMS": 500 } } } }, { "name": "startThread", "object": "testRunner", "arguments": { "name": "thread1" } }, { "name": "startThread", "object": "testRunner", "arguments": { "name": "thread2" } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "name": "thread1", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "name": "thread2", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "error": true } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "name": "thread1" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "name": "thread2" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 4 } ] } } } ] } hello-command-error.json000066400000000000000000000123271511661753600367300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.9" } ], "database_name": "sdam-tests", "collection_name": "hello-command-error", "data": [], "tests": [ { "description": "Command error on Monitor handshake", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "commandErrorHandshakeTest", "closeConnection": false, "errorCode": 91 } }, "clientOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "commandErrorHandshakeTest" }, "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "Command error on Monitor check", "clientOptions": { "retryWrites": false, "connectTimeoutMS": 1000, "heartbeatFrequencyMS": 500, "appname": "commandErrorCheckTest" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "commandErrorCheckTest", "closeConnection": false, "blockConnection": true, "blockTimeMS": 750, "errorCode": 91 } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } hello-network-error.json000066400000000000000000000112771511661753600370060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.9" } ], "database_name": "sdam-tests", "collection_name": "hello-network-error", "data": [], "tests": [ { "description": "Network error on Monitor handshake", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "networkErrorHandshakeTest", "closeConnection": true } }, "clientOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "networkErrorHandshakeTest" }, "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "Network error on Monitor check", "clientOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "networkErrorCheckTest" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "networkErrorCheckTest", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } hello-timeout.json000066400000000000000000000171261511661753600356530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "hello-timeout", "data": [], "tests": [ { "description": "Network timeout on Monitor handshake", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "timeoutMonitorHandshakeTest", "blockConnection": true, "blockTimeMS": 1000 } }, "clientOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "timeoutMonitorHandshakeTest" }, "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "Network timeout on Monitor check", "clientOptions": { "retryWrites": false, "connectTimeoutMS": 750, "heartbeatFrequencyMS": 500, "appname": "timeoutMonitorCheckTest" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "timeoutMonitorCheckTest", "blockConnection": true, "blockTimeMS": 1000 } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "Driver extends timeout while streaming", "clientOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "extendsTimeoutTest" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 2000 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 0 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 0 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } insert-network-error.json000066400000000000000000000063141511661753600372030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "insert-network-error", "data": [ { "_id": 1 }, { "_id": 2 } ], "tests": [ { "description": "Reset server and pool after network error on insert", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true, "appName": "insertNetworkErrorTest" } }, "clientOptions": { "retryWrites": false, "appname": "insertNetworkErrorTest" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "error": true }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "insert-network-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "insert-network-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } } } ] } insert-shutdown-error.json000066400000000000000000000073451511661753600373720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4" } ], "database_name": "sdam-tests", "collection_name": "insert-shutdown-error", "data": [], "tests": [ { "description": "Concurrent shutdown error on insert", "clientOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "appname": "shutdownErrorInsertTest" }, "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "configureFailPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "appName": "shutdownErrorInsertTest", "errorCode": 91, "blockConnection": true, "blockTimeMS": 500 } } } }, { "name": "startThread", "object": "testRunner", "arguments": { "name": "thread1" } }, { "name": "startThread", "object": "testRunner", "arguments": { "name": "thread2" } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "name": "thread1", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "error": true } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "name": "thread2", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } }, "error": true } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "name": "thread1" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "name": "thread2" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "ServerMarkedUnknownEvent", "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 1 } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 4 } ] } } } ] } rediscover-quickly-after-step-down.json000066400000000000000000000066371511661753600417320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/integration{ "runOn": [ { "minServerVersion": "4.4", "topology": [ "replicaset" ] } ], "database_name": "sdam-tests", "collection_name": "test-replSetStepDown", "data": [ { "_id": 1 }, { "_id": 2 } ], "tests": [ { "description": "Rediscover quickly after replSetStepDown", "clientOptions": { "appname": "replSetStepDownTest", "heartbeatFrequencyMS": 60000, "serverSelectionTimeoutMS": 5000, "w": "majority" }, "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "recordPrimary", "object": "testRunner" }, { "name": "runAdminCommand", "object": "testRunner", "command_name": "replSetFreeze", "arguments": { "command": { "replSetFreeze": 0 }, "readPreference": { "mode": "Secondary" } } }, { "name": "runAdminCommand", "object": "testRunner", "command_name": "replSetStepDown", "arguments": { "command": { "replSetStepDown": 30, "secondaryCatchUpPeriodSecs": 30, "force": false } } }, { "name": "waitForPrimaryChange", "object": "testRunner", "arguments": { "timeoutMS": 15000 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "event": "PoolClearedEvent", "count": 0 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test-replSetStepDown", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "command_name": "insert", "database_name": "sdam-tests" } }, { "command_started_event": { "command": { "insert": "test-replSetStepDown", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "command_name": "insert", "database_name": "sdam-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/load-balanced/000077500000000000000000000000001511661753600323645ustar00rootroot00000000000000discover_load_balancer.json000066400000000000000000000013541511661753600376470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/load-balanced{ "description": "Load balancer can be discovered and only has the address property set", "uri": "mongodb://a/?loadBalanced=true", "phases": [ { "outcome": { "servers": { "a:27017": { "type": "LoadBalancer", "setName": null, "setVersion": null, "electionId": null, "logicalSessionTimeoutMinutes": null, "minWireVersion": null, "maxWireVersion": null, "topologyVersion": null } }, "topologyType": "LoadBalanced", "setName": null, "logicalSessionTimeoutMinutes": null, "maxSetVersion": null, "maxElectionId": null, "compatible": true } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring/000077500000000000000000000000001511661753600321035ustar00rootroot00000000000000discovered_standalone.json000066400000000000000000000053561511661753600372670ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a discovered standalone connection", "uri": "mongodb://a:27017/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } ] } } } ] } } ] } load_balancer.json000066400000000000000000000047601511661753600354740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a load balancer", "uri": "mongodb://a:27017/?loadBalanced=true", "phases": [ { "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "LoadBalanced", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "LoadBalancer" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "LoadBalanced", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "LoadBalanced", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "LoadBalancer" } ] } } } ] } } ] } replica_set_with_no_primary.json000066400000000000000000000101431511661753600405020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a topology that is a replica set with no primary connected", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "setVersion": 1, "primary": "b:27017", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_opening_event": { "topologyId": "42", "address": "b:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "b:27017", "setName": "rs", "type": "RSSecondary" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "ReplicaSetNoPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "b:27017", "setName": "rs", "type": "RSSecondary" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "PossiblePrimary" } ] } } } ] } } ] } replica_set_with_primary.json000066400000000000000000000100701511661753600400050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a topology that is a replica set with a primary connected", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "setVersion": 1, "primary": "a:27017", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_opening_event": { "topologyId": "42", "address": "b:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } } ] } } ] } replica_set_with_removal.json000066400000000000000000000101531511661753600377710ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a replica set with non member", "uri": "mongodb://a,b/", "phases": [ { "responses": [], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_opening_event": { "topologyId": "42", "address": "b:27017" } } ] } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "setVersion": 1, "primary": "a:27017", "hosts": [ "a:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true } ] ], "outcome": { "events": [ { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" } } }, { "server_closed_event": { "topologyId": "42", "address": "b:27017" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" } ] } } } ] } } ] } required_replica_set.json000066400000000000000000000102271511661753600371130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a topology that is required to be a replica set", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "setVersion": 1, "primary": "a:27017", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "ReplicaSetNoPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_opening_event": { "topologyId": "42", "address": "b:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "ReplicaSetNoPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [ "a:27017", "b:27017" ], "passives": [], "primary": "a:27017", "setName": "rs", "type": "RSPrimary" }, { "address": "b:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } } ] } } ] } standalone.json000066400000000000000000000053341511661753600350540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a direct connection", "uri": "mongodb://a:27017/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } ] } } } ] } } ] } standalone_suppress_equal_description_changes.json000066400000000000000000000057601511661753600443050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/monitoring{ "description": "Monitoring a direct connection - suppress update events for equal server descriptions", "uri": "mongodb://a:27017/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "events": [ { "topology_opening_event": { "topologyId": "42" } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Unknown", "servers": [] }, "newDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] } } }, { "server_opening_event": { "topologyId": "42", "address": "a:27017" } }, { "server_description_changed_event": { "topologyId": "42", "address": "a:27017", "previousDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" }, "newDescription": { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } } }, { "topology_description_changed_event": { "topologyId": "42", "previousDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Unknown" } ] }, "newDescription": { "topologyType": "Single", "servers": [ { "address": "a:27017", "arbiters": [], "hosts": [], "passives": [], "type": "Standalone" } ] } } } ] } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/000077500000000000000000000000001511661753600303425ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/compatible.json000066400000000000000000000023761511661753600333640ustar00rootroot00000000000000{ "description": "Replica set member with large maxWireVersion", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 1000 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": true } } ] } compatible_unknown.json000066400000000000000000000015461511661753600350620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Replica set member and an unknown server", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": true } } ] } discover_arbiters.json000066400000000000000000000016401511661753600346700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover arbiters with directConnection URI option", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "arbiters": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_arbiters_replicaset.json000066400000000000000000000016211511661753600371020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover arbiters with replicaSet URI option", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "arbiters": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/discover_ghost.json000066400000000000000000000012651511661753600342630ustar00rootroot00000000000000{ "description": "Discover ghost with directConnection URI option", "uri": "mongodb://b/?directConnection=false", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "isreplicaset": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "RSGhost", "setName": null } }, "topologyType": "Unknown", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } discover_ghost_replicaset.json000066400000000000000000000014231511661753600364130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover ghost with replicaSet URI option", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "isreplicaset": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "RSGhost", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_hidden.json000066400000000000000000000020151511661753600343050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover hidden with directConnection URI option", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hidden": true, "hosts": [ "c:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_hidden_replicaset.json000066400000000000000000000017761511661753600365350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover hidden with replicaSet URI option", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hidden": true, "hosts": [ "c:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_passives.json000066400000000000000000000033651511661753600347200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover passives with directConnection URI option", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "passives": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "passive": true, "hosts": [ "a:27017" ], "passives": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_passives_replicaset.json000066400000000000000000000033461511661753600371320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover passives with replicaSet URI option", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "passives": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "passive": true, "hosts": [ "a:27017" ], "passives": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_primary.json000066400000000000000000000015671511661753600345500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover primary with directConnection URI option", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_primary_replicaset.json000066400000000000000000000015501511661753600367530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover primary with replicaSet URI option", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_rsother.json000066400000000000000000000017631511661753600345510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover RSOther with directConnection URI option", "uri": "mongodb://b/?directConnection=false", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": false, "hosts": [ "c:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "RSOther", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_rsother_replicaset.json000066400000000000000000000027221511661753600367600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover RSOther with replicaSet URI option", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hidden": true, "hosts": [ "c:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": false, "hosts": [ "c:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "b:27017": { "type": "RSOther", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_secondary.json000066400000000000000000000016311511661753600350440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover secondary with directConnection URI option", "uri": "mongodb://b/?directConnection=false", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_secondary_replicaset.json000066400000000000000000000016121511661753600372560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Discover secondary with replicaSet URI option", "uri": "mongodb://b/?replicaSet=rs", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/discovery.json000066400000000000000000000077061511661753600332560ustar00rootroot00000000000000{ "description": "Replica set discovery", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017", "c:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null }, "c:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "primary": "d:27017", "hosts": [ "b:27017", "c:27017", "d:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "PossiblePrimary", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "d:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "b:27017", "c:27017", "d:27017", "e:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "RSPrimary", "setName": "rs" }, "e:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017", "c:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "RSSecondary", "setName": "rs" }, "d:27017": { "type": "RSPrimary", "setName": "rs" }, "e:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } electionId_precedence_setVersion.json000066400000000000000000000042541511661753600376400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "ElectionId is considered higher precedence than setVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ], [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "b:27017": { "type": "Unknown", "setName": null, "setVersion": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } equal_electionids.json000066400000000000000000000033111511661753600346450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "New primary with equal electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "setVersion": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } } ] } hosts_differ_from_seeds.json000066400000000000000000000013351511661753600360450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Host list differs from seeds", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } incompatible_arbiter.json000066400000000000000000000022741511661753600353410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Incompatible arbiter", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "arbiterOnly": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 1 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": false } } ] } incompatible_ghost.json000066400000000000000000000021051511661753600350260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Incompatible ghost", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isreplicaset": true, "minWireVersion": 0, "maxWireVersion": 1 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSGhost", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": false } } ] } incompatible_other.json000066400000000000000000000022631511661753600350300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Incompatible other", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "hidden": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 1 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSOther", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": false } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/ls_timeout.json000066400000000000000000000143161511661753600334260ustar00rootroot00000000000000{ "description": "Parse logicalSessionTimeoutMinutes from replica set", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017", "d:27017", "e:27017" ], "setName": "rs", "logicalSessionTimeoutMinutes": 3, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown" }, "c:27017": { "type": "Unknown" }, "d:27017": { "type": "Unknown" }, "e:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": 3, "setName": "rs" } }, { "responses": [ [ "d:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "isreplicaset": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown" }, "c:27017": { "type": "Unknown" }, "d:27017": { "type": "RSGhost" }, "e:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": 3, "setName": "rs" } }, { "responses": [ [ "e:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "hosts": [ "a:27017", "b:27017", "c:27017", "d:27017", "e:27017" ], "setName": "rs", "arbiterOnly": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown" }, "c:27017": { "type": "Unknown" }, "d:27017": { "type": "RSGhost" }, "e:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": 3, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017", "c:27017", "d:27017", "e:27017" ], "setName": "rs", "logicalSessionTimeoutMinutes": 2, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "Unknown" }, "d:27017": { "type": "RSGhost" }, "e:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": 2, "setName": "rs" } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "setName": "rs", "hidden": true, "logicalSessionTimeoutMinutes": 1, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "RSOther", "setName": "rs" }, "d:27017": { "type": "RSGhost" }, "e:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": 2, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017", "c:27017", "d:27017", "e:27017" ], "setName": "rs", "logicalSessionTimeoutMinutes": null, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "RSOther", "setName": "rs" }, "d:27017": { "type": "RSGhost" }, "e:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } member_reconfig.json000066400000000000000000000027151511661753600343060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Member removed by reconfig", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } member_standalone.json000066400000000000000000000023401511661753600346340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Member brought up as standalone", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Unknown", "logicalSessionTimeoutMinutes": null, "setName": null } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/new_primary.json000066400000000000000000000030661511661753600335760ustar00rootroot00000000000000{ "description": "New primary", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } new_primary_new_electionid.json000066400000000000000000000067121511661753600365700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "New primary with greater setVersion and electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } new_primary_new_setversion.json000066400000000000000000000066731511661753600366600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "New primary with greater setVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } } ] } new_primary_wrong_set_name.json000066400000000000000000000027221511661753600366040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "New primary with wrong setName", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/non_rs_member.json000066400000000000000000000011371511661753600340640ustar00rootroot00000000000000{ "description": "Non replicaSet member responds", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/normalize_case.json000066400000000000000000000020431511661753600342270ustar00rootroot00000000000000{ "description": "Replica set case normalization", "uri": "mongodb://A/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "A:27017" ], "passives": [ "B:27017" ], "arbiters": [ "C:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null }, "c:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } normalize_case_me.json000066400000000000000000000040731511661753600346360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Replica set mixed case normalization", "uri": "mongodb://A/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "me": "A:27017", "hosts": [ "A:27017" ], "passives": [ "B:27017" ], "arbiters": [ "C:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null }, "c:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "me": "B:27017", "hosts": [ "A:27017" ], "passives": [ "B:27017" ], "arbiters": [ "C:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } null_election_id-pre-6.0.json000066400000000000000000000113201511661753600355500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Pre 6.0 Primaries with and without electionIds", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setVersion": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setVersion": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } null_election_id.json000066400000000000000000000116041511661753600344700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primaries with and without electionIds", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setVersion": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setVersion": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "setVersion": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017", "c:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "setVersion": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "c:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } primary_becomes_ghost.json000066400000000000000000000024221511661753600355420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary becomes ghost", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "isreplicaset": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSGhost", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_becomes_mongos.json000066400000000000000000000022501511661753600357170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary becomes mongos", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_becomes_standalone.json000066400000000000000000000021111511661753600365410ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary becomes standalone", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_changes_set_name.json000066400000000000000000000023501511661753600362040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary changes setName", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_disconnect.json000066400000000000000000000021151511661753600350510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Disconnected from primary", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_disconnect_electionid.json000066400000000000000000000126711511661753600372600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Disconnected from primary, reject primary with stale electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "b:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000003" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000003" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000003" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000003" } }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000003" } } } ] } primary_disconnect_setversion.json000066400000000000000000000126711511661753600373420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Disconnected from primary, reject primary with stale setVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000002" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000002" } }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } primary_hint_from_secondary_with_mismatched_me.json000066400000000000000000000027631511661753600426770ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary with mismatched 'me' tells us who the primary is", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "me": "c:27017", "hosts": [ "b:27017" ], "setName": "rs", "primary": "b:27017", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "PossiblePrimary", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "me": "b:27017", "hosts": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_mismatched_me.json000066400000000000000000000016011511661753600355160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary mismatched me", "phases": [ { "outcome": { "servers": { "a:27017": { "setName": null, "type": "Unknown" }, "b:27017": { "setName": null, "type": "Unknown" } }, "setName": "rs", "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null }, "responses": [ [ "localhost:27017", { "me": "a:27017", "hosts": [ "a:27017", "b:27017" ], "helloOk": true, "isWritablePrimary": true, "ok": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ] } ], "uri": "mongodb://localhost:27017/?replicaSet=rs" } primary_mismatched_me_not_removed.json000066400000000000000000000035631511661753600401300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary mismatched me is not removed", "uri": "mongodb://localhost:27017,localhost:27018/?replicaSet=rs", "phases": [ { "responses": [ [ "localhost:27017", { "ok": 1, "hosts": [ "localhost:27017", "localhost:27018" ], "helloOk": true, "isWritablePrimary": true, "setName": "rs", "primary": "localhost:27017", "me": "a:27017", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "localhost:27017": { "type": "RSPrimary", "setName": "rs" }, "localhost:27018": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "localhost:27018", { "ok": 1, "hosts": [ "localhost:27017", "localhost:27018" ], "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "primary": "localhost:27017", "me": "localhost:27018", "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "localhost:27017": { "type": "RSPrimary", "setName": "rs" }, "localhost:27018": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_reports_new_member.json000066400000000000000000000065771511661753600366360ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary reports a new member", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017", "c:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "RSPrimary", "setName": "rs" }, "c:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "primary": "b:27017", "hosts": [ "a:27017", "b:27017", "c:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" }, "b:27017": { "type": "RSPrimary", "setName": "rs" }, "c:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_to_no_primary_mismatched_me.json000066400000000000000000000032071511661753600404630ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary to no primary with mismatched me", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "me": "a:27017", "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "c:27017", "d:27017" ], "me": "c:27017", "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "c:27017": { "type": "Unknown", "setName": null }, "d:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } primary_wrong_set_name.json000066400000000000000000000011621511661753600357300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary wrong setName", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/repeated.json000066400000000000000000000061351511661753600330330ustar00rootroot00000000000000{ "description": "Repeated isWritablePrimary response must be processed", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hidden": true, "hosts": [ "a:27017", "c:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "b:27017": { "type": "Unknown" }, "c:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "b:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hidden": true, "hosts": [ "a:27017", "c:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "b:27017": { "type": "Unknown" }, "c:27017": { "type": "Unknown" } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "c:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "c:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSOther", "setName": "rs" }, "c:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } replicaset_rsnp.json000066400000000000000000000011171511661753600343530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "replicaSet URI option causes starting topology to be RSNP", "uri": "mongodb://a/?replicaSet=rs&directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } response_from_removed.json000066400000000000000000000026201511661753600355600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Response from removed server", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/sec_not_auth.json000066400000000000000000000023341511661753600337120ustar00rootroot00000000000000{ "description": "Secondary's host list is not authoritative", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "b:27017", "c:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } secondary_ignore_ok_0-pre-6.0.json000066400000000000000000000033731511661753600365130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Pre 6.0 New primary", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 0, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } secondary_ignore_ok_0.json000066400000000000000000000034111511661753600354170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary ignored when ok is zero", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 0, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } secondary_ipv6_literal.json000066400000000000000000000022051511661753600356240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary with IPv6 literal", "uri": "mongodb://[::1]/?replicaSet=rs", "phases": [ { "responses": [ [ "[::1]:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "me": "[::1]:27017", "hosts": [ "[::1]:27017" ], "minWireVersion": 0, "maxWireVersion": 26 } ] ], "outcome": { "servers": { "[::1]:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetNoPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": true } } ] } secondary_mismatched_me.json000066400000000000000000000016041511661753600360250ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary mismatched me", "uri": "mongodb://localhost:27017/?replicaSet=rs", "phases": [ { "outcome": { "servers": { "a:27017": { "setName": null, "type": "Unknown" }, "b:27017": { "setName": null, "type": "Unknown" } }, "setName": "rs", "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null }, "responses": [ [ "localhost:27017", { "me": "a:27017", "hosts": [ "a:27017", "b:27017" ], "helloOk": true, "isWritablePrimary": false, "ok": 1, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ] } ] } secondary_wrong_set_name.json000066400000000000000000000012241511661753600362330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary wrong setName", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } secondary_wrong_set_name_with_primary.json000066400000000000000000000030231511661753600410300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Secondary wrong setName with primary", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } set_version_can_rollback.json000066400000000000000000000067301511661753600362160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Set version rolls back after new primary with higher election Id", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } setversion_equal_max_without_electionid.json000066400000000000000000000036631511661753600414050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "setVersion version that is equal is treated the same as greater than if there is no electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1 } } ] } setversion_greaterthan_max_without_electionid.json000066400000000000000000000036441511661753600426010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "setVersion that is greater than maxSetVersion is used if there is no electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2 } } ] } setversion_without_electionid-pre-6.0.json000066400000000000000000000036121511661753600404300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Pre 6.0 setVersion is ignored if there is no electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2 } } ] } setversion_without_electionid.json000066400000000000000000000036441511661753600373500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "setVersion that is less than maxSetVersion is ignored if there is no electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2 } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2, "electionId": null }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2 } } ] } stepdown_change_set_name.json000066400000000000000000000024371511661753600362070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary becomes a secondary with wrong setName", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/too_new.json000066400000000000000000000024011511661753600327040ustar00rootroot00000000000000{ "description": "Replica set member with large minWireVersion", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 999, "maxWireVersion": 1000 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": false } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/too_old.json000066400000000000000000000024101511661753600326710ustar00rootroot00000000000000{ "description": "Replica set member with default maxWireVersion of 0", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "setName": "rs", "hosts": [ "a:27017", "b:27017" ], "minWireVersion": 999, "maxWireVersion": 1000 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" }, "b:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "ReplicaSetWithPrimary", "setName": "rs", "logicalSessionTimeoutMinutes": null, "compatible": false } } ] } topology_version_equal.json000066400000000000000000000045251511661753600357740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary with equal topologyVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } }, "b:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } topology_version_greater.json000066400000000000000000000136551511661753600363220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary with newer topologyVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "2" } } }, "b:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "c:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "0" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000002" }, "counter": { "$numberLong": "0" } } }, "c:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "d:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": null }, "d:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "e:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000003" }, "counter": { "$numberLong": "0" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000003" }, "counter": { "$numberLong": "0" } } }, "e:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "topologyVersion": null }, "e:27017": { "type": "Unknown", "topologyVersion": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } topology_version_less.json000066400000000000000000000043561511661753600356350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Primary with older topologyVersion", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 9, "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "0" } } } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "topologyVersion": { "processId": { "$oid": "000000000000000000000001" }, "counter": { "$numberLong": "1" } } } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } unexpected_mongos.json000066400000000000000000000010571511661753600347070ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Unexpected mongos", "uri": "mongodb://b/?replicaSet=rs", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": {}, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } use_setversion_without_electionid-pre-6.0.json000066400000000000000000000063041511661753600413050ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Pre 6.0 Record max setVersion, even from primary without electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2 } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 7 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null, "electionId": null }, "b:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 2 } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 2, "maxElectionId": { "$oid": "000000000000000000000001" } } } ] } use_setversion_without_electionid.json000066400000000000000000000065671511661753600402330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs{ "description": "Record max setVersion, even from primary without electionId", "uri": "mongodb://a/?replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 2, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000001" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000001" } } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" }, "minWireVersion": 0, "maxWireVersion": 17 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs", "setVersion": 1, "electionId": { "$oid": "000000000000000000000002" } }, "b:27017": { "type": "Unknown", "setName": null, "electionId": null } }, "topologyType": "ReplicaSetWithPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs", "maxSetVersion": 1, "maxElectionId": { "$oid": "000000000000000000000002" } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/rs/wrong_set_name.json000066400000000000000000000014141511661753600342440ustar00rootroot00000000000000{ "description": "Wrong setName", "uri": "mongodb://a,b/?replicaSet=rs", "phases": [ { "responses": [ [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "b:27017", "c:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "ReplicaSetNoPrimary", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded/000077500000000000000000000000001511661753600313305ustar00rootroot00000000000000compatible.json000066400000000000000000000020161511661753600342620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Multiple mongoses with large maxWireVersion", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 1000 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": true } } ] } discover_single_mongos.json000066400000000000000000000011511511661753600367030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Discover single mongos", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "setName": null } } ] } ls_timeout_mongos.json000066400000000000000000000040001511661753600357040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Parse logicalSessionTimeoutMinutes from mongoses", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "logicalSessionTimeoutMinutes": 1, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "logicalSessionTimeoutMinutes": 2, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": 1, "setName": null } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "logicalSessionTimeoutMinutes": 1, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } mongos_disconnect.json000066400000000000000000000040341511661753600356600ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Mongos disconnect", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } }, { "responses": [ [ "a:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } multiple_mongoses.json000066400000000000000000000017261511661753600357170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Multiple mongoses", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } non_mongos_removed.json000066400000000000000000000017071511661753600360460ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Non-Mongos server in sharded cluster", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } normalize_uri_case.json000066400000000000000000000007331511661753600360210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded{ "description": "Normalize URI case", "uri": "mongodb://A,B", "phases": [ { "responses": [], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null }, "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Unknown", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded/too_new.json000066400000000000000000000020221511661753600336710ustar00rootroot00000000000000{ "description": "Multiple mongoses with large minWireVersion", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 999, "maxWireVersion": 1000 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 7, "maxWireVersion": 900 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": false } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/sharded/too_old.json000066400000000000000000000017211511661753600336630ustar00rootroot00000000000000{ "description": "Multiple mongoses with default maxWireVersion of 0", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 2, "maxWireVersion": 21 } ], [ "b:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid" } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null }, "b:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Sharded", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": false } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single/000077500000000000000000000000001511661753600311775ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single/compatible.json000066400000000000000000000012151511661753600342100ustar00rootroot00000000000000{ "description": "Standalone with large maxWireVersion", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": true } } ] } direct_connection_external_ip.json000066400000000000000000000013541511661753600401010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to RSPrimary via external IP", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_mongos.json000066400000000000000000000012321511661753600370640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to mongos", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "msg": "isdbgrid", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Mongos", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_replicaset.json000066400000000000000000000012721511661753600377210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection with replicaSet URI option", "uri": "mongodb://a/?replicaSet=rs&directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } direct_connection_rsarbiter.json000066400000000000000000000014271511661753600375650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to RSArbiter", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "arbiterOnly": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSArbiter", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_rsprimary.json000066400000000000000000000013651511661753600376210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to RSPrimary", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_rssecondary.json000066400000000000000000000014311511661753600401170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to RSSecondary", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": false, "secondary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSSecondary", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_standalone.json000066400000000000000000000012031511661753600377100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to standalone", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_unavailable_seed.json000066400000000000000000000007401511661753600410500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to unavailable seed", "uri": "mongodb://a/?directConnection=true", "phases": [ { "responses": [ [ "a:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } direct_connection_wrong_set_name.json000066400000000000000000000025711511661753600406000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Direct connection to RSPrimary with wrong set name", "uri": "mongodb://a/?directConnection=true&replicaSet=rs", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "wrong", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": "rs" } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "hosts": [ "a:27017", "b:27017" ], "setName": "rs", "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "RSPrimary", "setName": "rs" } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": "rs" } } ] } discover_standalone.json000066400000000000000000000011701511661753600360400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Discover standalone", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } discover_unavailable_seed.json000066400000000000000000000007261511661753600372010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Discover unavailable seed", "uri": "mongodb://a/?directConnection=false", "phases": [ { "responses": [ [ "a:27017", {} ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Unknown", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } ls_timeout_standalone.json000066400000000000000000000012531511661753600364100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Parse logicalSessionTimeoutMinutes from standalone", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "logicalSessionTimeoutMinutes": 7, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": 7, "setName": null } } ] } not_ok_response.json000066400000000000000000000015211511661753600352210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Handle a not-ok isWritablePrimary response", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ], [ "a:27017", { "ok": 0, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } standalone_removed.json000066400000000000000000000011721511661753600356650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Standalone removed from multi-server topology", "uri": "mongodb://a,b", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "b:27017": { "type": "Unknown", "setName": null } }, "topologyType": "Unknown", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } standalone_using_legacy_hello.json000066400000000000000000000011171511661753600400570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Connect to standalone using legacy hello", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "ismaster": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single/too_new.json000066400000000000000000000012221511661753600335410ustar00rootroot00000000000000{ "description": "Standalone with large minWireVersion", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 999, "maxWireVersion": 1000 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": false } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single/too_old.json000066400000000000000000000011221511661753600335250ustar00rootroot00000000000000{ "description": "Standalone with default maxWireVersion of 0", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": false } } ] } too_old_then_upgraded.json000066400000000000000000000022431511661753600363440ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/single{ "description": "Standalone with default maxWireVersion of 0 is upgraded to one with maxWireVersion 21", "uri": "mongodb://a", "phases": [ { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": false } }, { "responses": [ [ "a:27017", { "ok": 1, "helloOk": true, "isWritablePrimary": true, "minWireVersion": 0, "maxWireVersion": 21 } ] ], "outcome": { "servers": { "a:27017": { "type": "Standalone", "setName": null } }, "topologyType": "Single", "logicalSessionTimeoutMinutes": null, "setName": null, "compatible": true } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/supplemental/000077500000000000000000000000001511661753600324275ustar00rootroot00000000000000discover_rs_name.json000066400000000000000000000023171511661753600365700ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/supplemental{ "description": "Discover replica set name", "phases": [ { "outcome": { "servers": { "a:27017": { "setName": "rs", "type": "RSPrimary" } }, "setName": "rs", "topologyType": "ReplicaSetWithPrimary" }, "responses": [ [ "a:27017", { "hosts": [ "a:27017", "b:27017" ], "ismaster": true, "ok": 1, "setName": "rs" } ], [ "b:27017", { "hosts": [ "a:27017", "b:27017" ], "ismaster": true, "ok": 1, "setName": "wrong" } ] ] } ], "uri": "mongodb://a,b" } discover_rs_name_from_primary.json000066400000000000000000000020461511661753600413550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/supplemental{ "description": "Discover replica set name from primary", "phases": [ { "outcome": { "servers": { "b:27017": { "setName": "rs", "type": "RSPrimary" } }, "setName": "rs", "topologyType": "ReplicaSetWithPrimary" }, "responses": [ [ "b:27017", { "hosts": [ "b:27017" ], "ismaster": true, "ok": 1, "setName": "rs" } ], [ "a:27017", { "ismaster": true, "msg": "isdbgrid", "ok": 1 } ] ] } ], "uri": "mongodb://a,b" } discover_rs_name_from_secondary.json000066400000000000000000000021251511661753600416570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/supplemental{ "description": "Discover replica set name from secondary", "phases": [ { "outcome": { "servers": { "b:27017": { "setName": "rs", "type": "RSSecondary" } }, "setName": "rs", "topologyType": "ReplicaSetNoPrimary" }, "responses": [ [ "b:27017", { "hosts": [ "b:27017" ], "ismaster": false, "ok": 1, "secondary": true, "setName": "rs" } ], [ "a:27017", { "ismaster": true, "msg": "isdbgrid", "ok": 1 } ] ] } ], "uri": "mongodb://a,b" } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified/000077500000000000000000000000001511661753600313415ustar00rootroot00000000000000auth-error.json000066400000000000000000000121751511661753600342530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "auth-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "auth": true, "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "auth-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after AuthenticationFailure error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "appName": "authErrorTest", "errorCode": 18 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "auth-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "auth-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "auth-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } auth-misc-command-error.json000066400000000000000000000122341511661753600366140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "auth-misc-command-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "auth": true, "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "auth-misc-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after misc command error", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "appName": "authMiscErrorTest", "errorCode": 1 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authMiscErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "auth-misc-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "auth-misc-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "auth-misc-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } auth-network-error.json000066400000000000000000000123031511661753600357330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "auth-network-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "auth": true, "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "auth-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after network error during authentication", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "closeConnection": true, "appName": "authNetworkErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authNetworkErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "auth-network-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "auth-network-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "auth-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } auth-network-timeout-error.json000066400000000000000000000125761511661753600374330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "auth-network-timeout-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "auth": true, "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "auth-network-timeout-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after network timeout error during authentication", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "blockConnection": true, "blockTimeMS": 500, "appName": "authNetworkTimeoutErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authNetworkTimeoutErrorTest", "connectTimeoutMS": 250, "socketTimeoutMS": 250 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "auth-network-timeout-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "auth-network-timeout-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "auth-network-timeout-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } auth-shutdown-error.json000066400000000000000000000123031511661753600361150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "auth-shutdown-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "auth": true, "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "auth-shutdown-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after shutdown error during authentication", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "appName": "authShutdownErrorTest", "errorCode": 91 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authShutdownErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "auth-shutdown-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "auth-shutdown-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "auth-shutdown-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } cancel-server-check.json000066400000000000000000000110571511661753600357650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "cancel-server-check", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ], "serverless": "forbid" }, { "minServerVersion": "4.2", "topologies": [ "sharded" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "cancel-server-check", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Cancel server check", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": true, "heartbeatFrequencyMS": 10000, "serverSelectionTimeoutMS": 5000, "appname": "cancelServerCheckTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "cancel-server-check" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "client": "setupClient" } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "expectResult": { "insertedId": 2 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } }, "expectResult": { "insertedId": 3 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "outcome": [ { "collectionName": "cancel-server-check", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ] } ] } connectTimeoutMS.json000066400000000000000000000121351511661753600354170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "connectTimeoutMS", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "connectTimeoutMS", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "connectTimeoutMS=0", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 0, "heartbeatFrequencyMS": 500, "appname": "connectTimeoutMS=0" }, "useMultipleMongoses": false } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "connectTimeoutMS" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "connectTimeoutMS=0", "blockConnection": true, "blockTimeMS": 550 } }, "client": "setupClient" } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 750 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 0 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 0 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "connectTimeoutMS", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "connectTimeoutMS", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "connectTimeoutMS", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ] } ] } find-network-error.json000066400000000000000000000125441511661753600357210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "find-network-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "find-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after network error on find", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true, "appName": "findNetworkErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "retryReads": false, "appname": "findNetworkErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "find-network-error" } } ] } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "find": "find-network-error" }, "commandName": "find", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "find-network-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "find-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } find-network-timeout-error.json000066400000000000000000000112211511661753600373740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "find-network-timeout-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "find-network-timeout-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Ignore network timeout error on find", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "blockConnection": true, "blockTimeMS": 500, "appName": "findNetworkTimeoutErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "retryReads": false, "appname": "findNetworkTimeoutErrorTest", "socketTimeoutMS": 250 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "find-network-timeout-error" } } ] } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 0 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 0 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "find": "find-network-timeout-error" }, "commandName": "find", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "find-network-timeout-error", "documents": [ { "_id": 3 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "find-network-timeout-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ] } ] } find-shutdown-error.json000066400000000000000000000135001511661753600360740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "find-shutdown-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "find-shutdown-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Concurrent shutdown error on find", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "uriOptions": { "retryWrites": false, "retryReads": false, "heartbeatFrequencyMS": 500, "appname": "shutdownErrorFindTest" }, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "find-shutdown-error" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "appName": "shutdownErrorFindTest", "errorCode": 91, "blockConnection": true, "blockTimeMS": 500 } }, "client": "setupClient" } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "thread": { "id": "thread0" } }, { "thread": { "id": "thread1" } } ] } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread0", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread0" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "outcome": [ { "collectionName": "find-shutdown-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 4 } ] } ] } ] } hello-command-error.json000066400000000000000000000220641511661753600360270ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "hello-command-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4.7", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "hello-command-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Command error on Monitor handshake", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "commandErrorHandshakeTest", "closeConnection": false, "errorCode": 91 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent", "commandStartedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "commandErrorHandshakeTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-command-error" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-command-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "Command error on Monitor check", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 1000, "heartbeatFrequencyMS": 500, "appname": "commandErrorCheckTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-command-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "commandErrorCheckTest", "closeConnection": false, "blockConnection": true, "blockTimeMS": 750, "errorCode": 91 } }, "client": "setupClient" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "hello-command-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-command-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ] } ] } hello-network-error.json000066400000000000000000000204441511661753600361020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "hello-network-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4.7", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "hello-network-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Network error on Monitor handshake", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "networkErrorHandshakeTest", "closeConnection": true } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "networkErrorHandshakeTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-network-error" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "Network error on Monitor check", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "networkErrorCheckTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-network-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "networkErrorCheckTest", "closeConnection": true } }, "client": "setupClient" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "hello-network-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ] } ] } hello-timeout.json000066400000000000000000000304071511661753600347500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "hello-timeout", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "hello-timeout", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Network timeout on Monitor handshake", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "timeoutMonitorHandshakeTest", "blockConnection": true, "blockTimeMS": 1000 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "timeoutMonitorHandshakeTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-timeout" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-timeout", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "Network timeout on Monitor check", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 750, "heartbeatFrequencyMS": 500, "appname": "timeoutMonitorCheckTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-timeout" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "timeoutMonitorCheckTest", "blockConnection": true, "blockTimeMS": 1000 } }, "client": "setupClient" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-timeout", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ] }, { "description": "Driver extends timeout while streaming", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "connectTimeoutMS": 250, "heartbeatFrequencyMS": 500, "appname": "extendsTimeoutTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "hello-timeout" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 } ] } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 2000 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 0 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 0 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "hello-timeout", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "hello-timeout", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ] } ] } insert-network-error.json000066400000000000000000000132051511661753600363000ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "insert-network-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "insert-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Reset server and pool after network error on insert", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true, "appName": "insertNetworkErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent", "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": false, "appname": "insertNetworkErrorTest" }, "useMultipleMongoses": false } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "insert-network-error" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "insert-network-error", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "insert-network-error", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "insert-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } insert-shutdown-error.json000066400000000000000000000134651511661753600364720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "insert-shutdown-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "insert-shutdown-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Concurrent shutdown error on insert", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "uriOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "appname": "shutdownErrorInsertTest" }, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "insert-shutdown-error" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "appName": "shutdownErrorInsertTest", "errorCode": 91, "blockConnection": true, "blockTimeMS": 500 } }, "client": "setupClient" } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "thread": { "id": "thread0" } }, { "thread": { "id": "thread1" } } ] } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread0", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "expectError": { "isError": true } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } }, "expectError": { "isError": true } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread0" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "outcome": [ { "collectionName": "insert-shutdown-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 4 } ] } ] } ] } interruptInUse-pool-clear.json000066400000000000000000000353171511661753600372210ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "interruptInUse", "schemaVersion": "1.11", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "interruptInUse", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Connection pool clear uses interruptInUseConnections=true after monitor timeout", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "poolClearedEvent", "connectionClosedEvent", "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ], "uriOptions": { "connectTimeoutMS": 500, "heartbeatFrequencyMS": 500, "appname": "interruptInUse", "retryReads": false, "minPoolSize": 0 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "interruptInUse" } }, { "thread": { "id": "thread1" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "$where": "sleep(2000) || true" } }, "expectError": { "isError": true } } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "blockConnection": true, "blockTimeMS": 1500, "appName": "interruptInUse" } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandFailedEvent": { "commandName": "find" } } ] }, { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "poolClearedEvent": { "interruptInUseConnections": true } }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": {} } ] } ], "outcome": [ { "collectionName": "interruptInUse", "databaseName": "sdam-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Error returned from connection pool clear with interruptInUseConnections=true is retryable", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "poolClearedEvent", "connectionClosedEvent", "commandStartedEvent", "commandFailedEvent", "commandSucceededEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ], "uriOptions": { "connectTimeoutMS": 500, "heartbeatFrequencyMS": 500, "appname": "interruptInUseRetryable", "retryReads": true, "minPoolSize": 0 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "interruptInUse" } }, { "thread": { "id": "thread1" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "find", "object": "collection", "arguments": { "filter": { "$where": "sleep(2000) || true" } } } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "blockConnection": true, "blockTimeMS": 1500, "appName": "interruptInUseRetryable" } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandFailedEvent": { "commandName": "find" } }, { "commandStartedEvent": { "commandName": "find" } }, { "commandSucceededEvent": { "commandName": "find" } } ] }, { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "poolClearedEvent": { "interruptInUseConnections": true } }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ], "outcome": [ { "collectionName": "interruptInUse", "databaseName": "sdam-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "Error returned from connection pool clear with interruptInUseConnections=true is retryable for write", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "poolClearedEvent", "connectionClosedEvent", "commandStartedEvent", "commandFailedEvent", "commandSucceededEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ], "uriOptions": { "connectTimeoutMS": 500, "heartbeatFrequencyMS": 500, "appname": "interruptInUseRetryableWrite", "retryWrites": true, "minPoolSize": 0 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "interruptInUse" } }, { "thread": { "id": "thread1" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "updateOne", "object": "collection", "arguments": { "filter": { "$where": "sleep(2000) || true" }, "update": { "$set": { "a": "bar" } } } } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "hello", "isMaster" ], "blockConnection": true, "blockTimeMS": 1500, "appName": "interruptInUseRetryableWrite" } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "commandName": "insert" } }, { "commandSucceededEvent": { "commandName": "insert" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandFailedEvent": { "commandName": "update" } }, { "commandStartedEvent": { "commandName": "update" } }, { "commandSucceededEvent": { "commandName": "update" } } ] }, { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} }, { "connectionCheckedOutEvent": {} }, { "poolClearedEvent": { "interruptInUseConnections": true } }, { "connectionCheckedInEvent": {} }, { "connectionClosedEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ], "outcome": [ { "collectionName": "interruptInUse", "databaseName": "sdam-tests", "documents": [ { "_id": 1, "a": "bar" } ] } ] } ] } loadbalanced-emit-topology-changed-before-close.json000066400000000000000000000040131511661753600433040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "loadbalanced-emit-topology-description-changed-before-close", "schemaVersion": "1.20", "runOnRequirements": [ { "topologies": [ "load-balanced" ], "minServerVersion": "4.4" } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "topologyDescriptionChangedEvent", "topologyOpeningEvent", "topologyClosedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "close", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "events": [ { "topologyOpeningEvent": {} }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": {} } }, { "topologyDescriptionChangedEvent": { "newDescription": { "type": "LoadBalanced" } } }, { "topologyDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, { "topologyClosedEvent": {} } ] } ] } ] } logging-loadbalanced.json000066400000000000000000000103021511661753600361660ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "loadbalanced-logging", "schemaVersion": "1.16", "runOnRequirements": [ { "topologies": [ "load-balanced" ], "minServerVersion": "4.4" } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "topologyDescriptionChangedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "close", "object": "client" } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring", "topologyId": { "$$exists": true } } } ] } ] } ] } logging-replicaset.json000066400000000000000000000375561511661753600357540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "replicaset-logging", "schemaVersion": "1.16", "runOnRequirements": [ { "topologies": [ "replicaset" ], "minServerVersion": "4.4" } ], "createEntities": [ { "client": { "id": "setupClient" } } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "topologyDescriptionChangedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 4 } }, { "name": "close", "object": "client" } ], "expectLogMessages": [ { "client": "client", "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring", "topologyId": { "$$exists": true } } } ] } ] }, { "description": "Successful heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatSucceededEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatSucceededEvent": {} }, "count": 3 } } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "serverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1 } } } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "serverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1 } } } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "serverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1 } } } } } ] } ] }, { "description": "Failing heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatFailedEvent" ], "uriOptions": { "appname": "failingHeartbeatLoggingTest" } } } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "isMaster" ], "appName": "failingHeartbeatLoggingTest", "closeConnection": true } }, "client": "setupClient" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatFailedEvent": {} }, "count": 1 } } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "failure": { "$$exists": true } } } ] } ] } ] } logging-sharded.json000066400000000000000000000313311511661753600352140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "sharded-logging", "schemaVersion": "1.16", "runOnRequirements": [ { "topologies": [ "sharded" ], "minServerVersion": "4.4" } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "topologyDescriptionChangedEvent" ], "useMultipleMongoses": true } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 3 } }, { "name": "close", "object": "client" } ], "expectLogMessages": [ { "client": "client", "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring", "topologyId": { "$$exists": true } } } ] } ] }, { "description": "Successful heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatSucceededEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatSucceededEvent": {} }, "count": 1 } } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "serverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1 } } } } } ] } ] }, { "description": "Failing heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatFailedEvent" ], "uriOptions": { "appname": "failingHeartbeatLoggingTest" } } } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "isMaster" ], "appName": "failingHeartbeatLoggingTest", "closeConnection": true } }, "client": "setupClient" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatFailedEvent": {} }, "count": 1 } } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "failure": { "$$exists": true } } } ] } ] } ] } logging-standalone.json000066400000000000000000000324551511661753600357420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "standalone-logging", "schemaVersion": "1.16", "runOnRequirements": [ { "topologies": [ "single" ], "minServerVersion": "4.4" } ], "createEntities": [ { "client": { "id": "setupClient" } } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "topologyDescriptionChangedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "close", "object": "client" } ], "expectLogMessages": [ { "client": "client", "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring", "topologyId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring", "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed", "topologyId": { "$$exists": true }, "previousDescription": { "$$exists": true }, "newDescription": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring", "topologyId": { "$$exists": true } } } ] } ] }, { "description": "Successful heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatSucceededEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatSucceededEvent": {} }, "count": 1 } }, { "name": "close", "object": "client" } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true } } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "serverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "reply": { "$$matchAsDocument": { "$$matchAsRoot": { "ok": 1 } } } } } ] } ] }, { "description": "Failing heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeLogMessages": { "topology": "debug" }, "observeEvents": [ "serverHeartbeatFailedEvent" ], "uriOptions": { "appname": "failingHeartbeatLoggingTest" } } } ] } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "isMaster" ], "appName": "failingHeartbeatLoggingTest", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatFailedEvent": {} }, "count": 1 } } ], "expectLogMessages": [ { "client": "client", "ignoreExtraMessages": true, "ignoreMessages": [ { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped topology monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Stopped server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Topology description changed" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting server monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Starting topology monitoring" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat started" } }, { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat succeeded" } } ], "messages": [ { "level": "debug", "component": "topology", "data": { "message": "Server heartbeat failed", "awaited": { "$$exists": true }, "topologyId": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] }, "driverConnectionId": { "$$exists": true }, "durationMS": { "$$type": [ "double", "int", "long" ] }, "failure": { "$$exists": true } } } ] } ] } ] } minPoolSize-error.json000066400000000000000000000103301511661753600355510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "minPoolSize-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4.7", "serverless": "forbid", "topologies": [ "single" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "sdam-minPoolSize-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "Network error on minPoolSize background creation", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "skip": 3 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "SDAMminPoolSizeError", "closeConnection": true } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent", "poolReadyEvent" ], "uriOptions": { "heartbeatFrequencyMS": 10000, "appname": "SDAMminPoolSizeError", "minPoolSize": 10, "serverSelectionTimeoutMS": 1000 } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "sdam-minPoolSize-error" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolReadyEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": {} }, "commandName": "ping" }, "expectError": { "isError": true } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": "off" }, "client": "setupClient" } }, { "name": "runCommand", "object": "database", "arguments": { "command": { "ping": 1 }, "commandName": "ping" } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolReadyEvent": {} }, "count": 2 } } ] } ] } pool-clear-application-error.json000066400000000000000000000065731511661753600376550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "pool-clear-application-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "find-network-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Pool is cleared before application connection is checked into the pool", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true, "appName": "findNetworkErrorTest" } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "poolClearedEvent", "connectionCheckedInEvent" ], "uriOptions": { "retryWrites": false, "retryReads": false, "appname": "findNetworkErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "find-network-error" } } ] } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionCheckedInEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "poolClearedEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] } ] } pool-clear-checkout-error.json000066400000000000000000000160561511661753600371540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "pool-clear-on-error-checkout", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single", "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "tests": [ { "description": "Pool is cleared before connection is closed (authentication error)", "runOnRequirements": [ { "auth": true } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "appName": "authErrorTest", "errorCode": 18 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "connectionCheckOutStartedEvent", "poolClearedEvent", "connectionClosedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "foo" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "bar" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionClosedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "poolClearedEvent": {} }, { "connectionClosedEvent": {} } ] } ] }, { "description": "Pool is cleared before connection is closed (handshake error)", "runOnRequirements": [ { "topologies": [ "single" ] } ], "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "connectionCheckOutStartedEvent", "poolClearedEvent", "connectionClosedEvent", "topologyDescriptionChangedEvent" ], "uriOptions": { "retryWrites": false, "appname": "authErrorTest", "minPoolSize": 0, "serverMonitoringMode": "poll", "heartbeatFrequencyMS": 1000000 } } }, { "database": { "id": "database", "client": "client", "databaseName": "foo" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "bar" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Single" } } }, "count": 1 } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "authErrorTest", "closeConnection": true } } } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "expectError": { "isError": true } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionClosedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "poolClearedEvent": {} }, { "connectionClosedEvent": {} } ] } ] } ] } pool-clear-min-pool-size-error.json000066400000000000000000000130041511661753600400370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "pool-cleared-on-min-pool-size-population-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "single" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "tests": [ { "description": "Pool is cleared on authentication error during minPoolSize population", "runOnRequirements": [ { "auth": true } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "saslContinue" ], "appName": "authErrorTest", "errorCode": 18 } } } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "connectionCreatedEvent", "poolClearedEvent", "connectionClosedEvent" ], "uriOptions": { "appname": "authErrorTest", "minPoolSize": 1 } } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionClosedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "poolClearedEvent": {} }, { "connectionClosedEvent": {} } ] } ] }, { "description": "Pool is cleared on handshake error during minPoolSize population", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "topologyDescriptionChangedEvent", "connectionCreatedEvent", "poolClearedEvent", "connectionClosedEvent", "connectionReadyEvent" ], "uriOptions": { "appname": "authErrorTest", "minPoolSize": 5, "maxConnecting": 1, "serverMonitoringMode": "poll", "heartbeatFrequencyMS": 1000000 } } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Single" } } }, "count": 1 } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "setupClient", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "hello", "isMaster" ], "appName": "authErrorTest", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "connectionClosedEvent": {} }, "count": 1 } } ], "expectEvents": [ { "client": "client", "eventType": "cmap", "events": [ { "connectionCreatedEvent": {} }, { "connectionReadyEvent": {} }, { "connectionCreatedEvent": {} }, { "poolClearedEvent": {} }, { "connectionClosedEvent": {} } ] } ] } ] } pool-cleared-error.json000066400000000000000000000210171511661753600356530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "pool-cleared-error", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.9", "serverless": "forbid", "topologies": [ "replicaset", "sharded" ] } ], "createEntities": [ { "client": { "id": "setupClient", "useMultipleMongoses": false } } ], "initialData": [ { "collectionName": "pool-cleared-error", "databaseName": "sdam-tests", "documents": [] } ], "tests": [ { "description": "PoolClearedError does not mark server unknown", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "useMultipleMongoses": false, "observeEvents": [ "serverDescriptionChangedEvent", "poolClearedEvent" ], "uriOptions": { "retryWrites": true, "maxPoolSize": 1, "appname": "poolClearedErrorTest" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "pool-cleared-error" } } ] } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 1 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "blockConnection": true, "blockTimeMS": 100, "closeConnection": true, "appName": "poolClearedErrorTest" } }, "client": "setupClient" } }, { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "thread": { "id": "thread0" } }, { "thread": { "id": "thread1" } }, { "thread": { "id": "thread2" } }, { "thread": { "id": "thread3" } }, { "thread": { "id": "thread4" } }, { "thread": { "id": "thread5" } } ] } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread0", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread1", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 } } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread2", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 } } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread3", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 5 } } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread4", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 6 } } } } }, { "name": "runOnThread", "object": "testRunner", "arguments": { "thread": "thread5", "operation": { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 7 } } } } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread0" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread1" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread2" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread3" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread4" } }, { "name": "waitForThread", "object": "testRunner", "arguments": { "thread": "thread5" } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 8 } } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 1 } } ], "outcome": [ { "collectionName": "pool-cleared-error", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 }, { "_id": 7 }, { "_id": 8 } ] } ] } ] } rediscover-quickly-after-step-down.json000066400000000000000000000130641511661753600410220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "rediscover-quickly-after-step-down", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.4", "serverless": "forbid", "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "setupClient" } }, { "database": { "id": "adminDatabase", "client": "setupClient", "databaseName": "admin" } } ], "initialData": [ { "collectionName": "test-replSetStepDown", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "Rediscover quickly after replSetStepDown", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "poolClearedEvent", "commandStartedEvent" ], "uriOptions": { "appname": "replSetStepDownTest", "heartbeatFrequencyMS": 60000, "serverSelectionTimeoutMS": 5000, "w": "majority" } } }, { "database": { "id": "database", "client": "client", "databaseName": "sdam-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test-replSetStepDown" } } ] } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ] } }, { "name": "recordTopologyDescription", "object": "testRunner", "arguments": { "client": "client", "id": "topologyDescription" } }, { "name": "assertTopologyType", "object": "testRunner", "arguments": { "topologyDescription": "topologyDescription", "topologyType": "ReplicaSetWithPrimary" } }, { "name": "runCommand", "object": "adminDatabase", "arguments": { "command": { "replSetFreeze": 0 }, "readPreference": { "mode": "secondary" }, "commandName": "replSetFreeze" } }, { "name": "runCommand", "object": "adminDatabase", "arguments": { "command": { "replSetStepDown": 30, "secondaryCatchUpPeriodSecs": 30, "force": false }, "commandName": "replSetStepDown" } }, { "name": "waitForPrimaryChange", "object": "testRunner", "arguments": { "client": "client", "priorTopologyDescription": "topologyDescription", "timeoutMS": 15000 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 5 }, { "_id": 6 } ] } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "poolClearedEvent": {} }, "count": 0 } } ], "expectEvents": [ { "client": "client", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "test-replSetStepDown", "documents": [ { "_id": 3 }, { "_id": 4 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } }, { "commandStartedEvent": { "command": { "insert": "test-replSetStepDown", "documents": [ { "_id": 5 }, { "_id": 6 } ] }, "commandName": "insert", "databaseName": "sdam-tests" } } ] } ], "outcome": [ { "collectionName": "test-replSetStepDown", "databaseName": "sdam-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 } ] } ] } ] } replicaset-emit-topology-changed-before-close.json000066400000000000000000000040721511661753600430530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "replicaset-emit-topology-description-changed-before-close", "schemaVersion": "1.20", "runOnRequirements": [ { "topologies": [ "replicaset" ], "minServerVersion": "4.4" } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "topologyDescriptionChangedEvent", "topologyOpeningEvent", "topologyClosedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 4 } }, { "name": "close", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": false, "events": [ { "topologyOpeningEvent": {} }, { "topologyDescriptionChangedEvent": {} }, { "topologyDescriptionChangedEvent": {} }, { "topologyDescriptionChangedEvent": {} }, { "topologyDescriptionChangedEvent": {} }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "ReplicaSetWithPrimary" }, "newDescription": { "type": "Unknown" } } }, { "topologyClosedEvent": {} } ] } ] } ] } serverMonitoringMode.json000066400000000000000000000306141511661753600363420ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "serverMonitoringMode", "schemaVersion": "1.17", "runOnRequirements": [ { "topologies": [ "single", "sharded", "sharded-replicaset" ], "serverless": "forbid" } ], "tests": [ { "description": "connect with serverMonitoringMode=auto >=4.4", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "auto" }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent", "serverHeartbeatFailedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectResult": { "ok": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 2 } } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": true, "events": [ { "serverHeartbeatStartedEvent": { "awaited": false } }, { "serverHeartbeatSucceededEvent": { "awaited": false } }, { "serverHeartbeatStartedEvent": { "awaited": true } } ] } ] }, { "description": "connect with serverMonitoringMode=auto <4.4", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "auto", "heartbeatFrequencyMS": 500 }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent", "serverHeartbeatFailedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectResult": { "ok": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 2 } } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": true, "events": [ { "serverHeartbeatStartedEvent": { "awaited": false } }, { "serverHeartbeatSucceededEvent": { "awaited": false } }, { "serverHeartbeatStartedEvent": { "awaited": false } } ] } ] }, { "description": "connect with serverMonitoringMode=stream >=4.4", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "stream" }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent", "serverHeartbeatFailedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectResult": { "ok": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 2 } } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": true, "events": [ { "serverHeartbeatStartedEvent": { "awaited": false } }, { "serverHeartbeatSucceededEvent": { "awaited": false } }, { "serverHeartbeatStartedEvent": { "awaited": true } } ] } ] }, { "description": "connect with serverMonitoringMode=stream <4.4", "runOnRequirements": [ { "maxServerVersion": "4.2.99" } ], "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "stream", "heartbeatFrequencyMS": 500 }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent", "serverHeartbeatFailedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectResult": { "ok": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 2 } } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": true, "events": [ { "serverHeartbeatStartedEvent": { "awaited": false } }, { "serverHeartbeatSucceededEvent": { "awaited": false } }, { "serverHeartbeatStartedEvent": { "awaited": false } } ] } ] }, { "description": "connect with serverMonitoringMode=poll", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "poll", "heartbeatFrequencyMS": 500 }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent", "serverHeartbeatFailedEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "runCommand", "object": "db", "arguments": { "commandName": "ping", "command": { "ping": 1 } }, "expectResult": { "ok": 1 } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 2 } } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": true, "events": [ { "serverHeartbeatStartedEvent": { "awaited": false } }, { "serverHeartbeatSucceededEvent": { "awaited": false } }, { "serverHeartbeatStartedEvent": { "awaited": false } } ] } ] }, { "description": "poll waits after successful heartbeat", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "uriOptions": { "serverMonitoringMode": "poll", "heartbeatFrequencyMS": 1000000 }, "useMultipleMongoses": false, "observeEvents": [ "serverHeartbeatStartedEvent", "serverHeartbeatSucceededEvent" ] } }, { "database": { "id": "db", "client": "client", "databaseName": "sdam-tests" } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatSucceededEvent": {} }, "count": 1 } }, { "name": "wait", "object": "testRunner", "arguments": { "ms": 500 } }, { "name": "assertEventCount", "object": "testRunner", "arguments": { "client": "client", "event": { "serverHeartbeatStartedEvent": {} }, "count": 1 } } ] } ] } sharded-emit-topology-changed-before-close.json000066400000000000000000000051371511661753600423350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "sharded-emit-topology-description-changed-before-close", "schemaVersion": "1.20", "runOnRequirements": [ { "topologies": [ "sharded" ], "minServerVersion": "4.4" } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "topologyDescriptionChangedEvent", "topologyOpeningEvent", "topologyClosedEvent" ], "useMultipleMongoses": true } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 3 } }, { "name": "close", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": false, "events": [ { "topologyOpeningEvent": {} }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Unknown" } } }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Sharded" } } }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Sharded" }, "newDescription": { "type": "Sharded" } } }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Sharded" }, "newDescription": { "type": "Unknown" } } }, { "topologyClosedEvent": {} } ] } ] } ] } standalone-emit-topology-changed-before-close.json000066400000000000000000000044261511661753600430530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_discovery_and_monitoring/unified{ "description": "standalone-emit-topology-description-changed-before-close", "schemaVersion": "1.20", "runOnRequirements": [ { "topologies": [ "single" ], "minServerVersion": "4.4" } ], "tests": [ { "description": "Topology lifecycle", "operations": [ { "name": "createEntities", "object": "testRunner", "arguments": { "entities": [ { "client": { "id": "client", "observeEvents": [ "topologyDescriptionChangedEvent", "topologyOpeningEvent", "topologyClosedEvent" ] } } ] } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "close", "object": "client" } ], "expectEvents": [ { "client": "client", "eventType": "sdam", "ignoreExtraEvents": false, "events": [ { "topologyOpeningEvent": {} }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Unknown" } } }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Unknown" }, "newDescription": { "type": "Single" } } }, { "topologyDescriptionChangedEvent": { "previousDescription": { "type": "Single" }, "newDescription": { "type": "Unknown" } } }, { "topologyClosedEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/000077500000000000000000000000001511661753600246055ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/000077500000000000000000000000001511661753600266025ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/equilibrium.json000066400000000000000000000015251511661753600320270ustar00rootroot00000000000000{ "description": "When in equilibrium selection is evenly distributed", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 5 }, { "address": "b:27017", "operation_count": 5 }, { "address": "c:27017", "operation_count": 5 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.33, "b:27017": 0.33, "c:27017": 0.33 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/many-choices.json000066400000000000000000000037231511661753600320610ustar00rootroot00000000000000{ "description": "Selections from many choices occur at correct frequencies", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "d:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "e:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "f:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "g:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "i:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 0 }, { "address": "b:27017", "operation_count": 5 }, { "address": "c:27017", "operation_count": 5 }, { "address": "d:27017", "operation_count": 10 }, { "address": "e:27017", "operation_count": 10 }, { "address": "f:27017", "operation_count": 20 }, { "address": "g:27017", "operation_count": 20 }, { "address": "h:27017", "operation_count": 50 }, { "address": "i:27017", "operation_count": 60 } ], "iterations": 10000, "outcome": { "tolerance": 0.03, "expected_frequencies": { "a:27017": 0.22, "b:27017": 0.18, "c:27017": 0.18, "d:27017": 0.125, "e:27017": 0.125, "f:27017": 0.074, "g:27017": 0.074, "h:27017": 0.0277, "i:27017": 0 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/one-least-two-tied.json000066400000000000000000000015451511661753600331230ustar00rootroot00000000000000{ "description": "Least operations gets most selections, two tied share the rest", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 16 }, { "address": "b:27017", "operation_count": 10 }, { "address": "c:27017", "operation_count": 16 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.165, "b:27017": 0.66, "c:27017": 0.165 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/rs-equilibrium.json000066400000000000000000000015761511661753600324570ustar00rootroot00000000000000{ "description": "When in equilibrium selection is evenly distributed (replica set)", "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "RSPrimary" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "RSSecondary" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "RSSecondary" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 6 }, { "address": "b:27017", "operation_count": 6 }, { "address": "c:27017", "operation_count": 6 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.33, "b:27017": 0.33, "c:27017": 0.33 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/rs-three-choices.json000066400000000000000000000016041511661753600326420ustar00rootroot00000000000000{ "description": "Selections from three servers occur at proper distributions (replica set)", "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "RSPrimary" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "RSSecondary" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "RSSecondary" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 3 }, { "address": "b:27017", "operation_count": 6 }, { "address": "c:27017", "operation_count": 20 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.66, "b:27017": 0.33, "c:27017": 0 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/three-choices.json000066400000000000000000000015331511661753600322210ustar00rootroot00000000000000{ "description": "Selections from three servers occur at proper distributions", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 3 }, { "address": "b:27017", "operation_count": 6 }, { "address": "c:27017", "operation_count": 20 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.66, "b:27017": 0.33, "c:27017": 0 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/two-choices.json000066400000000000000000000012001511661753600317120ustar00rootroot00000000000000{ "description": "Better of two choices always selected", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 0 }, { "address": "b:27017", "operation_count": 5 } ], "iterations": 100, "outcome": { "tolerance": 0, "expected_frequencies": { "a:27017": 1, "b:27017": 0 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/in_window/two-least.json000066400000000000000000000015221511661753600314140ustar00rootroot00000000000000{ "description": "Two tied for least operations share all selections", "topology_description": { "type": "Sharded", "servers": [ { "address": "a:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "b:27017", "avg_rtt_ms": 35, "type": "Mongos" }, { "address": "c:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "mocked_topology_state": [ { "address": "a:27017", "operation_count": 10 }, { "address": "b:27017", "operation_count": 10 }, { "address": "c:27017", "operation_count": 16 } ], "iterations": 2000, "outcome": { "tolerance": 0.05, "expected_frequencies": { "a:27017": 0.5, "b:27017": 0.5, "c:27017": 0 } } } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/000077500000000000000000000000001511661753600262335ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/load-balanced.json000066400000000000000000000045771511661753600316110ustar00rootroot00000000000000{ "description": "server-selection-logging", "schemaVersion": "1.13", "runOnRequirements": [ { "topologies": [ "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client", "uriOptions": { "heartbeatFrequencyMS": 500 }, "observeLogMessages": { "serverSelection": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "server-selection" } } ], "tests": [ { "description": "A successful operation - load balanced cluster", "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "LoadBalancer" } } }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/operation-id.json000066400000000000000000000242011511661753600315170ustar00rootroot00000000000000{ "description": "operation-id", "schemaVersion": "1.14", "runOnRequirements": [ { "topologies": [ "single" ] } ], "createEntities": [ { "client": { "id": "client", "uriOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "appName": "loggingClient", "serverSelectionTimeoutMS": 2000 }, "observeLogMessages": { "serverSelection": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent", "topologyDescriptionChangedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "server-selection" } }, { "client": { "id": "failPointClient" } } ], "_yamlAnchors": { "namespace": "logging-tests.server-selection" }, "tests": [ { "description": "Successful bulkWrite operation: log messages have operationIds", "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "x": 1 } } } ] } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "operationId": { "$$type": [ "int", "long" ] }, "operation": "insert" } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "operationId": { "$$type": [ "int", "long" ] }, "operation": "insert" } } ] } ] }, { "description": "Failed bulkWrite operation: log messages have operationIds", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "ismaster" ], "appName": "loggingClient", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "x": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "operationId": { "$$type": [ "int", "long" ] }, "operation": "insert" } }, { "level": "info", "component": "serverSelection", "data": { "message": "Waiting for suitable server to become available", "operationId": { "$$type": [ "int", "long" ] }, "operation": "insert" } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection failed", "operationId": { "$$type": [ "int", "long" ] }, "operation": "insert" } } ] } ] }, { "description": "Successful client bulkWrite operation: log messages have operationIds", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "clientBulkWrite", "object": "client", "arguments": { "models": [ { "insertOne": { "namespace": "logging-tests.server-selection", "document": { "x": 1 } } } ] } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "operationId": { "$$type": [ "int", "long" ] }, "operation": "bulkWrite" } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "operationId": { "$$type": [ "int", "long" ] }, "operation": "bulkWrite" } } ] } ] }, { "description": "Failed client bulkWrite operation: log messages have operationIds", "runOnRequirements": [ { "minServerVersion": "8.0", "serverless": "forbid" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "ismaster" ], "appName": "loggingClient", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "clientBulkWrite", "object": "client", "arguments": { "models": [ { "insertOne": { "namespace": "logging-tests.server-selection", "document": { "x": 1 } } } ] }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "operationId": { "$$type": [ "int", "long" ] }, "operation": "bulkWrite" } }, { "level": "info", "component": "serverSelection", "data": { "message": "Waiting for suitable server to become available", "operationId": { "$$type": [ "int", "long" ] }, "operation": "bulkWrite" } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection failed", "operationId": { "$$type": [ "int", "long" ] }, "operation": "bulkWrite" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/replica-set.json000066400000000000000000000125751511661753600313500ustar00rootroot00000000000000{ "description": "replica-set-logging", "schemaVersion": "1.14", "runOnRequirements": [ { "topologies": [ "replicaset" ] } ], "createEntities": [ { "client": { "id": "client", "uriOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "serverSelectionTimeoutMS": 2000 }, "observeLogMessages": { "serverSelection": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent", "topologyDescriptionChangedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "server-selection" } }, { "client": { "id": "failPointClient" } }, { "collection": { "id": "unsatisfiableRPColl", "database": "database", "collectionName": "unsatisfiableRPColl", "collectionOptions": { "readPreference": { "mode": "Secondary", "tagSets": [ { "nonexistenttag": "a" } ] } } } } ], "tests": [ { "description": "A successful operation", "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 4 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } } ] } ] }, { "description": "Server selection fails due to unsatisfiable read preference", "runOnRequirements": [ { "minServerVersion": "4.0" } ], "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 4 } }, { "name": "find", "object": "unsatisfiableRPColl", "arguments": { "filter": { "x": 1 } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "find", "topologyDescription": { "$$exists": true } } }, { "level": "info", "component": "serverSelection", "data": { "message": "Waiting for suitable server to become available", "selector": { "$$exists": true }, "operation": "find", "topologyDescription": { "$$exists": true }, "remainingTimeMS": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection failed", "selector": { "$$exists": true }, "operation": "find", "topologyDescription": { "$$exists": true }, "failure": { "$$exists": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/sharded.json000066400000000000000000000133131511661753600305410ustar00rootroot00000000000000{ "description": "server-selection-logging", "schemaVersion": "1.14", "runOnRequirements": [ { "topologies": [ "sharded" ] } ], "createEntities": [ { "client": { "id": "client", "uriOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "appName": "loggingClient", "serverSelectionTimeoutMS": 2000 }, "observeLogMessages": { "serverSelection": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent", "topologyDescriptionChangedEvent" ], "useMultipleMongoses": false } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "server-selection" } }, { "client": { "id": "failPointClient", "useMultipleMongoses": false } } ], "tests": [ { "description": "A successful operation", "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } } ] } ] }, { "description": "Failure due to unreachable server", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "ismaster" ], "appName": "loggingClient", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "info", "component": "serverSelection", "data": { "message": "Waiting for suitable server to become available", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "remainingTimeMS": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection failed", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "failure": { "$$exists": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/logging/standalone.json000066400000000000000000000131701511661753600312600ustar00rootroot00000000000000{ "description": "standalone-logging", "schemaVersion": "1.14", "runOnRequirements": [ { "topologies": [ "single" ] } ], "createEntities": [ { "client": { "id": "client", "uriOptions": { "retryWrites": false, "heartbeatFrequencyMS": 500, "appName": "loggingClient", "serverSelectionTimeoutMS": 2000 }, "observeLogMessages": { "serverSelection": "debug" }, "observeEvents": [ "serverDescriptionChangedEvent", "topologyDescriptionChangedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "logging-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "server-selection" } }, { "client": { "id": "failPointClient" } } ], "tests": [ { "description": "A successful operation", "operations": [ { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "topologyDescriptionChangedEvent": {} }, "count": 2 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection succeeded", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "serverHost": { "$$type": "string" }, "serverPort": { "$$type": [ "int", "long" ] } } } ] } ] }, { "description": "Failure due to unreachable server", "runOnRequirements": [ { "minServerVersion": "4.4" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "failPointClient", "failPoint": { "configureFailPoint": "failCommand", "mode": "alwaysOn", "data": { "failCommands": [ "hello", "ismaster" ], "appName": "loggingClient", "closeConnection": true } } } }, { "name": "waitForEvent", "object": "testRunner", "arguments": { "client": "client", "event": { "serverDescriptionChangedEvent": { "newDescription": { "type": "Unknown" } } }, "count": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "x": 1 } }, "expectError": { "isClientError": true } } ], "expectLogMessages": [ { "client": "client", "messages": [ { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection started", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true } } }, { "level": "info", "component": "serverSelection", "data": { "message": "Waiting for suitable server to become available", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "remainingTimeMS": { "$$type": [ "int", "long" ] } } }, { "level": "debug", "component": "serverSelection", "data": { "message": "Server selection failed", "selector": { "$$exists": true }, "operation": "insert", "topologyDescription": { "$$exists": true }, "failure": { "$$exists": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/000077500000000000000000000000001511661753600254165ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/first_value.json000066400000000000000000000001041511661753600306270ustar00rootroot00000000000000{ "avg_rtt_ms": "NULL", "new_rtt_ms": 10, "new_avg_rtt": 10 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/first_value_zero.json000066400000000000000000000001021511661753600316640ustar00rootroot00000000000000{ "avg_rtt_ms": "NULL", "new_rtt_ms": 0, "new_avg_rtt": 0 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/value_test_1.json000066400000000000000000000000751511661753600307060ustar00rootroot00000000000000{ "avg_rtt_ms": 0, "new_rtt_ms": 5, "new_avg_rtt": 1 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/value_test_2.json000066400000000000000000000001031511661753600306770ustar00rootroot00000000000000{ "avg_rtt_ms": 3.1, "new_rtt_ms": 36, "new_avg_rtt": 9.68 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/value_test_3.json000066400000000000000000000001061511661753600307030ustar00rootroot00000000000000{ "avg_rtt_ms": 9.12, "new_rtt_ms": 9.12, "new_avg_rtt": 9.12 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/value_test_4.json000066400000000000000000000001041511661753600307020ustar00rootroot00000000000000{ "avg_rtt_ms": 1, "new_rtt_ms": 1000, "new_avg_rtt": 200.8 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/rtt/value_test_5.json000066400000000000000000000001031511661753600307020ustar00rootroot00000000000000{ "avg_rtt_ms": 0, "new_rtt_ms": 0.25, "new_avg_rtt": 0.05 } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/000077500000000000000000000000001511661753600301605ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/000077500000000000000000000000001511661753600324515ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read/000077500000000000000000000000001511661753600333645ustar00rootroot00000000000000Nearest.json000066400000000000000000000010771511661753600356060ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } Primary.json000066400000000000000000000007711511661753600356300ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "read", "read_preference": { "mode": "Primary" }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } PrimaryPreferred.json000066400000000000000000000011101511661753600374530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } Secondary.json000066400000000000000000000011011511661753600361200ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } SecondaryPreferred.json000066400000000000000000000011121511661753600377610ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/read{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write/000077500000000000000000000000001511661753600336035ustar00rootroot00000000000000Nearest.json000066400000000000000000000011001511661753600360100ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "write", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } Primary.json000066400000000000000000000007721511661753600360500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "write", "read_preference": { "mode": "Primary" }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } PrimaryPreferred.json000066400000000000000000000011111511661753600376730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "write", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } Secondary.json000066400000000000000000000011021511661753600363400ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "write", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } SecondaryPreferred.json000066400000000000000000000011131511661753600402010ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/LoadBalanced/write{ "topology_description": { "type": "LoadBalanced", "servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 0, "type": "LoadBalancer" } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/000077500000000000000000000000001511661753600340545ustar00rootroot00000000000000read/000077500000000000000000000000001511661753600347105ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimaryNearest.json000066400000000000000000000020431511661753600372030ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } Nearest_multiple.json000066400000000000000000000022671511661753600411260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 20, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 20, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 20, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } Nearest_non_matching.json000066400000000000000000000011461511661753600417320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } PossiblePrimary.json000066400000000000000000000005471511661753600407350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "PossiblePrimary" } ] }, "operation": "read", "read_preference": { "mode": "Primary", "tag_sets": [ {} ] }, "suitable_servers": [], "in_latency_window": [] } PossiblePrimaryNearest.json000066400000000000000000000005471511661753600422570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "PossiblePrimary" } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ {} ] }, "suitable_servers": [], "in_latency_window": [] } Primary.json000066400000000000000000000010411511661753600372220ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Primary" }, "suitable_servers": [], "in_latency_window": [] } PrimaryPreferred.json000066400000000000000000000020101511661753600410560ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ {} ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } PrimaryPreferred_non_matching.json000066400000000000000000000011571511661753600436150ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } Secondary.json000066400000000000000000000020451511661753600375330ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } SecondaryPreferred.json000066400000000000000000000020561511661753600413740ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } SecondaryPreferred_non_matching.json000066400000000000000000000011611511661753600441140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } Secondary_multi_tags.json000066400000000000000000000020711511661753600417620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "two", "data_center": "sf" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc", "rack": "one" }, { "other_tag": "doesntexist" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } } ] } Secondary_multi_tags2.json000066400000000000000000000020721511661753600420450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "two", "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc", "rack": "one" }, { "other_tag": "doesntexist" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "rack": "one", "data_center": "nyc" } } ] } Secondary_non_matching.json000066400000000000000000000011501511661753600422530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/read{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } write/000077500000000000000000000000001511661753600351275ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimarySecondaryPreferred.json000066400000000000000000000011631511661753600416110ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetNoPrimary/write{ "topology_description": { "type": "ReplicaSetNoPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [], "in_latency_window": [] } ReplicaSetWithPrimary/000077500000000000000000000000001511661753600343345ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selectionread/000077500000000000000000000000001511661753600352475ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimaryNearest.json000066400000000000000000000025271511661753600375510ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } Nearest_multiple.json000066400000000000000000000027531511661753600414650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 20, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 20, "type": "RSPrimary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 10, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 20, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } Nearest_non_matching.json000066400000000000000000000014111511661753600422640ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } Primary.json000066400000000000000000000017521511661753600375720ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Primary" }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } PrimaryPreferred.json000066400000000000000000000020251511661753600414230ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ {} ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } PrimaryPreferred_non_matching.json000066400000000000000000000020701511661753600441470ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } Secondary.json000066400000000000000000000023101511661753600400650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } SecondaryPreferred.json000066400000000000000000000023211511661753600417260ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } } ] } SecondaryPreferred_non_matching.json000066400000000000000000000020721511661753600444550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } SecondaryPreferred_tags.json000066400000000000000000000016231511661753600427500ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "RSPrimary", "tags": { "data_center": "nyc" } }, { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "sf" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } Secondary_non_matching.json000066400000000000000000000014131511661753600426140ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/read{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "sf" } ] }, "suitable_servers": [], "in_latency_window": [] } write/000077500000000000000000000000001511661753600354665ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimarySecondaryPreferred.json000066400000000000000000000020741511661753600421520ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/ReplicaSetWithPrimary/write{ "topology_description": { "type": "ReplicaSetWithPrimary", "servers": [ { "address": "b:27017", "avg_rtt_ms": 5, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "c:27017", "avg_rtt_ms": 100, "type": "RSSecondary", "tags": { "data_center": "nyc" } }, { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 26, "type": "RSPrimary", "tags": { "data_center": "nyc" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/000077500000000000000000000000001511661753600315325ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read/000077500000000000000000000000001511661753600324455ustar00rootroot00000000000000Nearest.json000066400000000000000000000013421511661753600346620ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "read", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } Primary.json000066400000000000000000000012341511661753600347040ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "read", "read_preference": { "mode": "Primary" }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } PrimaryPreferred.json000066400000000000000000000013531511661753600365450ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "read", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } Secondary.json000066400000000000000000000013441511661753600352120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "read", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } SecondaryPreferred.json000066400000000000000000000013551511661753600370530ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/read{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write/000077500000000000000000000000001511661753600326645ustar00rootroot00000000000000Nearest.json000066400000000000000000000013431511661753600351020ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "write", "read_preference": { "mode": "Nearest", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } Primary.json000066400000000000000000000012351511661753600351240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "write", "read_preference": { "mode": "Primary" }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } PrimaryPreferred.json000066400000000000000000000013541511661753600367650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "write", "read_preference": { "mode": "PrimaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } Secondary.json000066400000000000000000000013451511661753600354320ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "write", "read_preference": { "mode": "Secondary", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } SecondaryPreferred.json000066400000000000000000000013561511661753600372730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Sharded/write{ "topology_description": { "type": "Sharded", "servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" }, { "address": "h:27017", "avg_rtt_ms": 35, "type": "Mongos" } ], "in_latency_window": [ { "address": "g:27017", "avg_rtt_ms": 5, "type": "Mongos" } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Single/000077500000000000000000000000001511661753600314015ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Single/read/000077500000000000000000000000001511661753600323145ustar00rootroot00000000000000SecondaryPreferred.json000066400000000000000000000013431511661753600367170ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Single/read{ "topology_description": { "type": "Single", "servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Single/write/000077500000000000000000000000001511661753600325335ustar00rootroot00000000000000SecondaryPreferred.json000066400000000000000000000013441511661753600371370ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Single/write{ "topology_description": { "type": "Single", "servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ], "in_latency_window": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "Standalone", "tags": { "data_center": "dc" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/000077500000000000000000000000001511661753600316175ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/read/000077500000000000000000000000001511661753600325325ustar00rootroot00000000000000SecondaryPreferred.json000066400000000000000000000004341511661753600371350ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/read{ "topology_description": { "type": "Unknown", "servers": [] }, "operation": "read", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [], "in_latency_window": [] } ghost.json000066400000000000000000000004611511661753600344730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/read{ "topology_description": { "type": "Unknown", "servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "RSGhost" } ] }, "operation": "read", "read_preference": { "mode": "Nearest" }, "suitable_servers": [], "in_latency_window": [] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/write/000077500000000000000000000000001511661753600327515ustar00rootroot00000000000000SecondaryPreferred.json000066400000000000000000000004351511661753600373550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/write{ "topology_description": { "type": "Unknown", "servers": [] }, "operation": "write", "read_preference": { "mode": "SecondaryPreferred", "tag_sets": [ { "data_center": "nyc" } ] }, "suitable_servers": [], "in_latency_window": [] } ghost.json000066400000000000000000000004621511661753600347130ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/server_selection/server_selection/Unknown/write{ "topology_description": { "type": "Unknown", "servers": [ { "address": "a:27017", "avg_rtt_ms": 5, "type": "RSGhost" } ] }, "operation": "write", "read_preference": { "mode": "Nearest" }, "suitable_servers": [], "in_latency_window": [] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/000077500000000000000000000000001511661753600231005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/legacy/000077500000000000000000000000001511661753600243445ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/legacy/dirty-session-errors.json000066400000000000000000000351161511661753600313730ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "session-tests", "collection_name": "test", "data": [ { "_id": 1 } ], "tests": [ { "description": "Dirty explicit session is discarded", "clientOptions": { "retryWrites": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operations": [ { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "assertSessionDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "assertSessionDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "endSession", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" } }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" } }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" } }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 } }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } }, { "description": "Dirty explicit session is discarded (non-bulk write)", "clientOptions": { "retryWrites": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } }, "operations": [ { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 1 } }, { "name": "assertSessionDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "endSession", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "session-tests" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 } }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "x": 1 } ] } } }, { "description": "Dirty implicit session is discarded (write)", "clientOptions": { "retryWrites": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "txnNumber": { "$numberLong": "1" } }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "txnNumber": { "$numberLong": "1" } }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 } }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "Dirty implicit session is discarded (non-bulk write)", "clientOptions": { "retryWrites": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } }, "operations": [ { "name": "findOneAndUpdate", "object": "collection", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 1 } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "new": false, "txnNumber": { "$numberLong": "1" }, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "session-tests" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "new": false, "txnNumber": { "$numberLong": "1" }, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 } }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "x": 1 } ] } } }, { "description": "Dirty implicit session is discarded (read)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ] }, "error": true }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "Dirty implicit session is discarded (non-cursor returning read)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } }, "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": {} }, "error": true }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner" } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/legacy/server-support.json000066400000000000000000000073321511661753600302640ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "3.6.0" } ], "database_name": "session-tests", "collection_name": "test", "data": [ { "_id": 1 } ], "tests": [ { "description": "Server supports explicit sessions", "operations": [ { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "endSession", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertSameLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0" }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 }, "lsid": "session0" }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "Server supports implicit sessions", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": -1 } }, "result": [] }, { "name": "assertSameLsidOnLastTwoCommands", "object": "testRunner" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true }, "command_name": "insert", "database_name": "session-tests" } }, { "command_started_event": { "command": { "find": "test", "filter": { "_id": -1 } }, "command_name": "find", "database_name": "session-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified/000077500000000000000000000000001511661753600245235ustar00rootroot00000000000000implicit-sessions-default-causal-consistency.json000066400000000000000000000167521511661753600362570ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified{ "description": "implicit sessions default causal consistency", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "implicit-cc-tests" } }, { "collection": { "id": "collectionDefault", "database": "database0", "collectionName": "coll-default" } }, { "collection": { "id": "collectionSnapshot", "database": "database0", "collectionName": "coll-snapshot", "collectionOptions": { "readConcern": { "level": "snapshot" } } } }, { "collection": { "id": "collectionlinearizable", "database": "database0", "collectionName": "coll-linearizable", "collectionOptions": { "readConcern": { "level": "linearizable" } } } } ], "initialData": [ { "collectionName": "coll-default", "databaseName": "implicit-cc-tests", "documents": [ { "_id": 1, "x": "default" } ] }, { "collectionName": "coll-snapshot", "databaseName": "implicit-cc-tests", "documents": [ { "_id": 1, "x": "snapshot" } ] }, { "collectionName": "coll-linearizable", "databaseName": "implicit-cc-tests", "documents": [ { "_id": 1, "x": "linearizable" } ] } ], "tests": [ { "description": "readConcern is not sent on retried read in implicit session when readConcern level is not specified", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } } } }, { "name": "find", "object": "collectionDefault", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "x": "default" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll-default", "filter": {}, "readConcern": { "$$exists": false } }, "databaseName": "implicit-cc-tests" } }, { "commandStartedEvent": { "command": { "find": "coll-default", "filter": {}, "readConcern": { "$$exists": false } }, "databaseName": "implicit-cc-tests" } } ] } ] }, { "description": "afterClusterTime is not sent on retried read in implicit session when readConcern level is snapshot", "runOnRequirements": [ { "minServerVersion": "5.0" } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } } } }, { "name": "find", "object": "collectionSnapshot", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "x": "snapshot" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll-snapshot", "filter": {}, "readConcern": { "level": "snapshot", "afterClusterTime": { "$$exists": false } } }, "databaseName": "implicit-cc-tests" } }, { "commandStartedEvent": { "command": { "find": "coll-snapshot", "filter": {}, "readConcern": { "level": "snapshot", "afterClusterTime": { "$$exists": false } } }, "databaseName": "implicit-cc-tests" } } ] } ] }, { "description": "afterClusterTime is not sent on retried read in implicit session when readConcern level is linearizable", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11600 } } } }, { "name": "find", "object": "collectionlinearizable", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "x": "linearizable" } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll-linearizable", "filter": {}, "readConcern": { "level": "linearizable", "afterClusterTime": { "$$exists": false } } }, "databaseName": "implicit-cc-tests" } }, { "commandStartedEvent": { "command": { "find": "coll-linearizable", "filter": {}, "readConcern": { "level": "linearizable", "afterClusterTime": { "$$exists": false } } }, "databaseName": "implicit-cc-tests" } } ] } ] } ] } snapshot-sessions-not-supported-client-error.json000066400000000000000000000046411511661753600362730ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified{ "description": "snapshot-sessions-not-supported-client-error", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6", "maxServerVersion": "4.4.99" } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "session": { "id": "session0", "client": "client0", "sessionOptions": { "snapshot": true } } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "Client error on find with snapshot", "operations": [ { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "isClientError": true, "errorContains": "Snapshot reads require MongoDB 5.0 or later" } } ], "expectEvents": [] }, { "description": "Client error on aggregate with snapshot", "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "session": "session0", "pipeline": [] }, "expectError": { "isClientError": true, "errorContains": "Snapshot reads require MongoDB 5.0 or later" } } ], "expectEvents": [] }, { "description": "Client error on distinct with snapshot", "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session0" }, "expectError": { "isClientError": true, "errorContains": "Snapshot reads require MongoDB 5.0 or later" } } ], "expectEvents": [] } ] } snapshot-sessions-not-supported-server-error.json000066400000000000000000000100451511661753600363160ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified{ "description": "snapshot-sessions-not-supported-server-error", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "5.0", "topologies": [ "single" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "session": { "id": "session0", "client": "client0", "sessionOptions": { "snapshot": true } } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "Server returns an error on find with snapshot", "operations": [ { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "find" } } ] } ] }, { "description": "Server returns an error on aggregate with snapshot", "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "session": "session0", "pipeline": [] }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "aggregate" } } ] } ] }, { "description": "Server returns an error on distinct with snapshot", "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session0" }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "distinct" } } ] } ] } ] } snapshot-sessions-unsupported-ops.json000066400000000000000000000260701511661753600342340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified{ "description": "snapshot-sessions-unsupported-ops", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "5.0", "topologies": [ "replicaset", "sharded-replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0" } }, { "session": { "id": "session0", "client": "client0", "sessionOptions": { "snapshot": true } } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "Server returns an error on insertOne with snapshot", "runOnRequirements": [ { "topologies": [ "replicaset" ] } ], "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 22, "x": 22 } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "insert" } } ] } ] }, { "description": "Server returns an error on insertMany with snapshot", "runOnRequirements": [ { "topologies": [ "replicaset" ] } ], "operations": [ { "name": "insertMany", "object": "collection0", "arguments": { "session": "session0", "documents": [ { "_id": 22, "x": 22 }, { "_id": 33, "x": 33 } ] }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "insert" } } ] } ] }, { "description": "Server returns an error on deleteOne with snapshot", "runOnRequirements": [ { "topologies": [ "replicaset" ] } ], "operations": [ { "name": "deleteOne", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "delete": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "delete" } } ] } ] }, { "description": "Server returns an error on updateOne with snapshot", "runOnRequirements": [ { "topologies": [ "replicaset" ] } ], "operations": [ { "name": "updateOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "update": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "update" } } ] } ] }, { "description": "Server returns an error on findOneAndUpdate with snapshot", "operations": [ { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "findAndModify" } } ] } ] }, { "description": "Server returns an error on listDatabases with snapshot", "operations": [ { "name": "listDatabases", "object": "client0", "arguments": { "session": "session0" }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listDatabases": 1, "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "listDatabases" } } ] } ] }, { "description": "Server returns an error on listCollections with snapshot", "operations": [ { "name": "listCollections", "object": "database0", "arguments": { "session": "session0" }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "listCollections" } } ] } ] }, { "description": "Server returns an error on listIndexes with snapshot", "operations": [ { "name": "listIndexes", "object": "collection0", "arguments": { "session": "session0" }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listIndexes": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "listIndexes" } } ] } ] }, { "description": "Server returns an error on runCommand with snapshot", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "session": "session0", "commandName": "listCollections", "command": { "listCollections": 1 } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listCollections": 1, "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandFailedEvent": { "commandName": "listCollections" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/sessions/unified/snapshot-sessions.json000066400000000000000000000545471511661753600311400ustar00rootroot00000000000000{ "description": "snapshot-sessions", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "5.0", "topologies": [ "replicaset", "sharded-replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "findAndModify", "insert", "update" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "collection0", "collectionOptions": { "writeConcern": { "w": "majority" } } } }, { "session": { "id": "session0", "client": "client0", "sessionOptions": { "snapshot": true } } }, { "session": { "id": "session1", "client": "client0", "sessionOptions": { "snapshot": true } } } ], "initialData": [ { "collectionName": "collection0", "databaseName": "database0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 11 } ] } ], "tests": [ { "description": "Find operation with snapshot", "operations": [ { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 1, "x": 12 } }, { "name": "find", "object": "collection0", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 12 } ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 1, "x": 13 } }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 13 } ] }, { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "find", "object": "collection0", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 12 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "$$exists": false } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "Distinct operation with snapshot", "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session0" }, "expectResult": [ 11 ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 2, "x": 12 } }, { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session1" }, "expectResult": [ 11, 12 ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 2, "x": 13 } }, { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {} }, "expectResult": [ 11, 13 ] }, { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session0" }, "expectResult": [ 11 ] }, { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session1" }, "expectResult": [ 11, 12 ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "$$exists": false } } } }, { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } }, { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "Aggregate operation with snapshot", "operations": [ { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "session": "session0" }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 1, "x": 12 } }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "session": "session1" }, "expectResult": [ { "_id": 1, "x": 12 } ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 1, "x": 13 } }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ] }, "expectResult": [ { "_id": 1, "x": 13 } ] }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "session": "session0" }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "session": "session1" }, "expectResult": [ { "_id": 1, "x": 12 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "$$exists": false } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "countDocuments operation with snapshot", "operations": [ { "name": "countDocuments", "object": "collection0", "arguments": { "filter": {}, "session": "session0" }, "expectResult": 2 }, { "name": "countDocuments", "object": "collection0", "arguments": { "filter": {}, "session": "session0" }, "expectResult": 2 } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "Mixed operation with snapshot", "operations": [ { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "After" }, "expectResult": { "_id": 1, "x": 12 } }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 } }, "expectResult": [ { "_id": 1, "x": 12 } ] }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": 1 } } ], "session": "session0" }, "expectResult": [ { "_id": 1, "x": 11 } ] }, { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "session": "session0" }, "expectResult": [ 11 ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "$$exists": false } } } }, { "commandStartedEvent": { "command": { "aggregate": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } }, { "commandStartedEvent": { "command": { "distinct": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "Write commands with snapshot session do not affect snapshot reads", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": {}, "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 22, "x": 33 } } }, { "name": "updateOne", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "session": "session0" }, "expectResult": [ { "_id": 1, "x": 11 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } } } }, { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": true } } } } } ] } ] }, { "description": "First snapshot read does not send atClusterTime", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": {}, "session": "session0" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "collection0", "readConcern": { "level": "snapshot", "atClusterTime": { "$$exists": false } } }, "commandName": "find", "databaseName": "database0" } } ] } ] }, { "description": "StartTransaction fails in snapshot session", "operations": [ { "name": "startTransaction", "object": "session0", "expectError": { "isError": true, "isClientError": true, "errorContains": "Transactions are not supported in snapshot sessions" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/000077500000000000000000000000001511661753600237425ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/000077500000000000000000000000001511661753600252065ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/abort.json000066400000000000000000000352631511661753600272210ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "implicit abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "two aborts", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "abortTransaction", "object": "session0", "result": { "errorContains": "cannot call abortTransaction twice" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abort without start", "operations": [ { "name": "abortTransaction", "object": "session0", "result": { "errorContains": "no transaction started" } } ], "expectations": [], "outcome": { "collection": { "data": [] } } }, { "description": "abort directly after no-op commit", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "abortTransaction", "object": "session0", "result": { "errorContains": "Cannot call abortTransaction after calling commitTransaction" } } ], "expectations": [], "outcome": { "collection": { "data": [] } } }, { "description": "abort directly after commit", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "abortTransaction", "object": "session0", "result": { "errorContains": "Cannot call abortTransaction after calling commitTransaction" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "abort ignores TransactionAborted", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorContains": "E11000" } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorCodeName": "NoSuchTransaction", "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abort does not apply writeConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": 10 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/bulk.json000066400000000000000000000315551511661753600270470ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "bulk", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "deletedCount": 1 } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } }, { "name": "updateOne", "arguments": { "filter": { "_id": 2 }, "update": { "$set": { "x": 2 } }, "upsert": true } }, { "name": "insertOne", "arguments": { "document": { "_id": 3 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 4 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 5 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 6 } } }, { "name": "insertOne", "arguments": { "document": { "_id": 7 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 1 }, "replacement": { "y": 1 } } }, { "name": "replaceOne", "arguments": { "filter": { "_id": 2 }, "replacement": { "y": 2 } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 3 } } }, { "name": "deleteOne", "arguments": { "filter": { "_id": 4 } } }, { "name": "updateMany", "arguments": { "filter": { "_id": { "$gte": 2 } }, "update": { "$set": { "z": 1 } } } }, { "name": "deleteMany", "arguments": { "filter": { "_id": { "$gte": 6 } } } } ] }, "result": { "deletedCount": 4, "insertedCount": 6, "insertedIds": { "0": 1, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7 }, "matchedCount": 7, "modifiedCount": 7, "upsertedCount": 1, "upsertedIds": { "2": 2 } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": { "$set": { "x": 1 } } }, { "q": { "_id": 2 }, "u": { "$set": { "x": 2 } }, "upsert": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 }, { "_id": 7 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": { "y": 1 } }, { "q": { "_id": 2 }, "u": { "y": 2 } } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 3 }, "limit": 1 }, { "q": { "_id": 4 }, "limit": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gte": 2 } }, "u": { "$set": { "z": 1 } }, "multi": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$gte": 6 } }, "limit": 0 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "y": 1 }, { "_id": 2, "y": 2, "z": 1 }, { "_id": 5, "z": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/causal-consistency.json000066400000000000000000000157351511661753600317230ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1, "count": 0 } ], "tests": [ { "description": "causal consistency", "clientOptions": { "retryWrites": false }, "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "count": 1 } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "count": 1 } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": { "$inc": { "count": 1 } } } ], "ordered": true, "lsid": "session0", "readConcern": null, "txnNumber": null, "startTransaction": null, "autocommit": null, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": { "$inc": { "count": 1 } } } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "count": 2 } ] } } }, { "description": "causal consistency disabled", "clientOptions": { "retryWrites": false }, "sessionOptions": { "session0": { "causalConsistency": false } }, "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "count": 1 } } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": null, "autocommit": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 1 }, "u": { "$inc": { "count": 1 } } } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1, "count": 1 }, { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/commit.json000066400000000000000000000535141511661753600274010ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commit", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "rerun commit after empty transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "multiple commits in a row", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "write concern error on commit", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": 10 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commit without start", "operations": [ { "name": "commitTransaction", "object": "session0", "result": { "errorContains": "no transaction started" } } ], "expectations": [], "outcome": { "collection": { "data": [] } } }, { "description": "commit after no-op abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "abortTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0", "result": { "errorContains": "Cannot call commitTransaction after calling abortTransaction" } } ], "expectations": [], "outcome": { "collection": { "data": [] } } }, { "description": "commit after abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0", "result": { "errorContains": "Cannot call commitTransaction after calling abortTransaction" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ] }, { "description": "multiple commits after empty transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "reset session state commit", "clientOptions": { "retryWrites": false }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorContains": "no transaction started" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": null, "startTransaction": null, "autocommit": null }, "command_name": "insert", "database_name": "transaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "reset session state abort", "clientOptions": { "retryWrites": false }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0", "result": { "errorContains": "no transaction started" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": null, "startTransaction": null, "autocommit": null }, "command_name": "insert", "database_name": "transaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/count.json000066400000000000000000000047041511661753600272360ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0.2", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "tests": [ { "description": "count", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "count", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorCodeName": "OperationNotSupportedInTransaction", "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "count": "test", "query": { "_id": 1 }, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "count", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/create-collection.json000066400000000000000000000117441511661753600315040ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.4", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "explicitly create collection using create command", "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "createCollection", "object": "database", "arguments": { "session": "session0", "collection": "test" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "test", "writeConcern": null }, "command_name": "drop", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "create": "test", "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "create", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] }, { "description": "implicitly create collection using insert", "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "test", "writeConcern": null }, "command_name": "drop", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/create-index.json000066400000000000000000000134501511661753600304540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.4", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "create index on a non-existing collection", "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "createIndex", "object": "collection", "arguments": { "session": "session0", "name": "t_1", "keys": { "x": 1 } } }, { "name": "assertIndexNotExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test", "index": "t_1" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test", "index": "t_1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "test", "writeConcern": null }, "command_name": "drop", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "createIndexes": "test", "indexes": [ { "name": "t_1", "key": { "x": 1 } } ], "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "createIndexes", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] }, { "description": "create index on a collection created within the same transaction", "operations": [ { "name": "dropCollection", "object": "database", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "createCollection", "object": "database", "arguments": { "session": "session0", "collection": "test" } }, { "name": "createIndex", "object": "collection", "arguments": { "session": "session0", "name": "t_1", "keys": { "x": 1 } } }, { "name": "assertIndexNotExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test", "index": "t_1" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "database": "transaction-tests", "collection": "test", "index": "t_1" } } ], "expectations": [ { "command_started_event": { "command": { "drop": "test", "writeConcern": null }, "command_name": "drop", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "create": "test", "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "create", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "createIndexes": "test", "indexes": [ { "name": "t_1", "key": { "x": 1 } } ], "lsid": "session0", "writeConcern": null }, "command_name": "createIndexes", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/delete.json000066400000000000000000000167021511661753600273510ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ], "tests": [ { "description": "delete", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "deletedCount": 1 } }, { "name": "deleteMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$lte": 3 } } }, "result": { "deletedCount": 2 } }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 4 } }, "result": { "deletedCount": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$lte": 3 } }, "limit": 0 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 4 }, "limit": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 5 } ] } } }, { "description": "collection writeConcern ignored for delete", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "deleteOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "deletedCount": 1 } }, { "name": "deleteMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$lte": 3 } } }, "result": { "deletedCount": 2 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 1 }, "limit": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": { "$lte": 3 } }, "limit": 0 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/error-labels-blockConnection.json000066400000000000000000000075251511661753600336130ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.2", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "add RetryableWriteError and UnknownTransactionCommitResult labels to connection errors", "clientOptions": { "socketTimeoutMS": 100 }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "blockConnection": true, "blockTimeMS": 150 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/error-labels-errorLabels.json000066400000000000000000000173251511661753600327540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "add RetryableWriteError and UnknownTransactionCommitResult labels to retryable commit errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 11602, "errorLabels": [ "RetryableWriteError" ] } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "add RetryableWriteError and UnknownTransactionCommitResult labels to writeConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/error-labels.json000066400000000000000000001274731511661753600305100ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "DuplicateKey errors do not contain transient label", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "arguments": { "session": "session0", "documents": [ { "_id": 1 }, { "_id": 1 } ] }, "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorContains": "E11000" } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 }, { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "NotWritablePrimary errors contain transient label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 10107 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "WriteConflict errors contain transient label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 112 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "NoSuchTransaction errors contain transient label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 251 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "NoSuchTransaction errors on commit contain transient label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 251 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "add TransientTransactionError label to connection errors, but do not add RetryableWriteError label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 4 }, "data": { "failCommands": [ "insert", "find", "aggregate", "distinct" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "find", "object": "collection", "arguments": { "session": "session0" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "session": "session0" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": {}, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "add RetryableWriteError and UnknownTransactionCommitResult labels to connection errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "do not add RetryableWriteError label to writeConcernError ShutdownInProgress that occurs within transaction", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [], "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "add UnknownTransactionCommitResult label to writeConcernError WriteConcernFailed", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 64, "errmsg": "multiple errors reported" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "add UnknownTransactionCommitResult label to writeConcernError WriteConcernFailed with wtimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 64, "codeName": "WriteConcernFailed", "errmsg": "waiting for replication timed out", "errInfo": { "wtimeout": true } } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "omit UnknownTransactionCommitResult label from writeConcernError UnsatisfiableWriteConcern", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 100, "errmsg": "Not enough data-bearing nodes" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "omit UnknownTransactionCommitResult label from writeConcernError UnknownReplWriteConcern", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 79, "errmsg": "No write concern mode named 'blah' found in replica set configuration" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "RetryableWriteConcern", "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "do not add UnknownTransactionCommitResult label to MaxTimeMSExpired inside transactions", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 50 } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "maxTimeMS": 60000, "session": "session0" }, "result": { "errorLabelsOmit": [ "RetryableWriteError", "UnknownTransactionCommitResult", "TransientTransactionError" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": {}, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "maxTimeMS": 60000 }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "add UnknownTransactionCommitResult label to MaxTimeMSExpired", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 50 } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" }, "maxCommitTimeMS": 60000 } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "add UnknownTransactionCommitResult label to writeConcernError MaxTimeMSExpired", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 50, "errmsg": "operation exceeded time limit" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" }, "maxCommitTimeMS": 60000 } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/errors-client.json000066400000000000000000000040151511661753600306710ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "Client side error in command starting transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "x": 1 } }, "error": true }, { "name": "assertSessionTransactionState", "object": "testRunner", "arguments": { "session": "session0", "state": "starting" } } ] }, { "description": "Client side error when transaction is in progress", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "x": 1 } }, "error": true }, { "name": "assertSessionTransactionState", "object": "testRunner", "arguments": { "session": "session0", "state": "in_progress" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/errors.json000066400000000000000000000115601511661753600274200ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "start insert start", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "startTransaction", "object": "session0", "result": { "errorContains": "transaction already in progress" } }, { "name": "commitTransaction", "object": "session0" } ] }, { "description": "start twice", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0", "result": { "errorContains": "transaction already in progress" } } ] }, { "description": "commit and start twice", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0", "result": { "errorContains": "transaction already in progress" } } ] }, { "description": "write conflict commit", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "startTransaction", "object": "session1" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session1", "document": { "_id": 1 } }, "result": { "errorCodeName": "WriteConflict", "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session1", "result": { "errorCodeName": "NoSuchTransaction", "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } } ] }, { "description": "write conflict abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "startTransaction", "object": "session1" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session1", "document": { "_id": 1 } }, "result": { "errorCodeName": "WriteConflict", "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "commitTransaction", "object": "session0" }, { "name": "abortTransaction", "object": "session1" } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/findOneAndDelete.json000066400000000000000000000120631511661753600312330ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ], "tests": [ { "description": "findOneAndDelete", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 3 } }, "result": { "_id": 3 } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 4 } }, "result": null }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "remove": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 4 }, "remove": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "collection writeConcern ignored for findOneAndDelete", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "findOneAndDelete", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": 3 } }, "result": { "_id": 3 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "remove": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/findOneAndReplace.json000066400000000000000000000134611511661753600314070ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ], "tests": [ { "description": "findOneAndReplace", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 3 }, "replacement": { "x": 1 }, "returnDocument": "Before" }, "result": { "_id": 3 } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 4 }, "replacement": { "x": 1 }, "upsert": true, "returnDocument": "After" }, "result": { "_id": 4, "x": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "x": 1 }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 4 }, "update": { "x": 1 }, "new": true, "upsert": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3, "x": 1 }, { "_id": 4, "x": 1 } ] } } }, { "description": "collection writeConcern ignored for findOneAndReplace", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "findOneAndReplace", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": 3 }, "replacement": { "x": 1 }, "returnDocument": "Before" }, "result": { "_id": 3 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "x": 1 }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/findOneAndUpdate.json000066400000000000000000000233241511661753600312550ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ], "tests": [ { "description": "findOneAndUpdate", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 3 } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true, "returnDocument": "After" }, "result": { "_id": 4, "x": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 3, "x": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 3, "x": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "new": true, "upsert": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "afterClusterTime": 42 }, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "readConcern": { "afterClusterTime": 42 }, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3, "x": 2 }, { "_id": 4, "x": 1 } ] } } }, { "description": "collection writeConcern ignored for findOneAndUpdate", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "findOneAndUpdate", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 3 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 3 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/insert.json000066400000000000000000000357751511661753600274260ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "insert", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 2 }, { "_id": 3 } ], "session": "session0" }, "result": { "insertedIds": { "0": 2, "1": 3 } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "insertedId": 4 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 5 } }, "result": { "insertedId": 5 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 }, { "_id": 3 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 5 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ] } } }, { "description": "insert with session1", "operations": [ { "name": "startTransaction", "object": "session1" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session1", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 2 }, { "_id": 3 } ], "session": "session1" }, "result": { "insertedIds": { "0": 2, "1": 3 } } }, { "name": "commitTransaction", "object": "session1" }, { "name": "startTransaction", "object": "session1" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session1", "document": { "_id": 4 } }, "result": { "insertedId": 4 } }, { "name": "abortTransaction", "object": "session1" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session1", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 }, { "_id": 3 } ], "ordered": true, "lsid": "session1", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session1", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session1", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session1", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } }, { "description": "collection writeConcern without transaction", "clientOptions": { "retryWrites": false }, "operations": [ { "name": "insertOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": null, "startTransaction": null, "autocommit": null, "writeConcern": { "w": "majority" } }, "command_name": "insert", "database_name": "transaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "collection writeConcern ignored for insert", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "documents": [ { "_id": 2 }, { "_id": 3 } ], "session": "session0" }, "result": { "insertedIds": { "0": 2, "1": 3 } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 }, { "_id": 3 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/isolation.json000066400000000000000000000105421511661753600301040ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "one transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": [ { "_id": 1 } ] }, { "name": "find", "object": "collection", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "result": [] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": [] }, { "name": "commitTransaction", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "result": [ { "_id": 1 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1 } ] } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "two transactions", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session1" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": [ { "_id": 1 } ] }, { "name": "find", "object": "collection", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "result": [] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": [] }, { "name": "commitTransaction", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "session": "session1", "filter": { "_id": 1 } }, "result": [] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 1 } }, "result": [ { "_id": 1 } ] }, { "name": "commitTransaction", "object": "session1" } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/mongos-pin-auto.json000066400000000000000000003302501511661753600311400ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 } ], "tests": [ { "description": "remain pinned after non-transient Interrupted error on insertOne", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorCodeName": "Interrupted" } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } }, { "description": "unpin after transient error within a transaction", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on insertOne insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on insertMany insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertMany", "object": "collection", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on updateOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on replaceOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "replaceOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on updateMany update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "updateMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on deleteOne delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on deleteMany delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "deleteMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on findOneAndDelete findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on findOneAndUpdate findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on findOneAndReplace findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ] }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ] }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on find find", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11601 } } } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on countDocuments aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11601 } } } }, { "name": "countDocuments", "object": "collection", "arguments": { "session": "session0", "filter": {} }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on aggregate aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11601 } } } }, { "name": "aggregate", "object": "collection", "arguments": { "session": "session0", "pipeline": [] }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on distinct distinct", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 11601 } } } }, { "name": "distinct", "object": "collection", "arguments": { "session": "session0", "fieldName": "_id" }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "remain pinned after non-transient Interrupted error on runCommand insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "result": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on insertOne insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on insertOne insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on insertMany insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertMany", "object": "collection", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on insertMany insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "insertMany", "object": "collection", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on updateOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on updateOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on replaceOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "replaceOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on replaceOne update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "replaceOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on updateMany update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "updateMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on updateMany update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "updateMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on deleteOne delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on deleteOne delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "deleteOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on deleteMany delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "deleteMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on deleteMany delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "deleteMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on findOneAndDelete findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on findOneAndDelete findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndDelete", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on findOneAndUpdate findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on findOneAndUpdate findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndUpdate", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on findOneAndReplace findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on findOneAndReplace findAndModify", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndReplace", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on bulkWrite insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on bulkWrite update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite update", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "updateOne", "arguments": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on bulkWrite delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite delete", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "session": "session0", "requests": [ { "name": "deleteOne", "arguments": { "filter": { "_id": 1 } } } ] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on find find", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on find find", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } } } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on countDocuments aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } } } }, { "name": "countDocuments", "object": "collection", "arguments": { "session": "session0", "filter": {} }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on countDocuments aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } } } }, { "name": "countDocuments", "object": "collection", "arguments": { "session": "session0", "filter": {} }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on aggregate aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } } } }, { "name": "aggregate", "object": "collection", "arguments": { "session": "session0", "pipeline": [] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on aggregate aggregate", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } } } }, { "name": "aggregate", "object": "collection", "arguments": { "session": "session0", "pipeline": [] }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on distinct distinct", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "closeConnection": true } } } }, { "name": "distinct", "object": "collection", "arguments": { "session": "session0", "fieldName": "_id" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on distinct distinct", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 91 } } } }, { "name": "distinct", "object": "collection", "arguments": { "session": "session0", "fieldName": "_id" }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient connection error on runCommand insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient ShutdownInProgress error on runCommand insert", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } } ] } mongos-recovery-token-errorLabels.json000066400000000000000000000071071511661753600345550ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction retry succeeds on new mongos", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" }, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/mongos-recovery-token.json000066400000000000000000000227041511661753600323620ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction explicit retries include recoveryToken", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction retry fails on new mongos", "useMultipleMongoses": true, "clientOptions": { "heartbeatFrequencyMS": 30000 }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 7 }, "data": { "failCommands": [ "commitTransaction", "isMaster", "hello" ], "closeConnection": true } } } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ], "errorCodeName": "NoSuchTransaction" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction sends recoveryToken", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "closeConnection": true } } } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/pin-mongos.json000066400000000000000000000644311511661753600301770ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 } ], "tests": [ { "description": "countDocuments", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": 1 }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "distinct", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "distinct", "object": "collection", "arguments": { "fieldName": "_id", "session": "session0" }, "result": [ 1, 2 ] }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "find", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "find", "object": "collection", "arguments": { "filter": { "_id": 2 }, "session": "session0" }, "result": [ { "_id": 2 } ] }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "insertOne", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 }, "session": "session0" }, "result": { "insertedId": 3 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 }, "session": "session0" }, "result": { "insertedId": 4 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 5 }, "session": "session0" }, "result": { "insertedId": 5 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 6 }, "session": "session0" }, "result": { "insertedId": 6 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 7 }, "session": "session0" }, "result": { "insertedId": 7 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 8 }, "session": "session0" }, "result": { "insertedId": 8 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 9 }, "session": "session0" }, "result": { "insertedId": 9 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 10 }, "session": "session0" }, "result": { "insertedId": 10 } }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 }, { "_id": 7 }, { "_id": 8 }, { "_id": 9 }, { "_id": 10 } ] } } }, { "description": "mixed read write operations", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 3 }, "session": "session0" }, "result": { "insertedId": 3 } }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 3 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 3 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 3 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 3 }, "session": "session0" }, "result": 1 }, { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "_id": 3 }, "session": "session0" }, "result": 1 }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 4 }, "session": "session0" }, "result": { "insertedId": 4 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 5 }, "session": "session0" }, "result": { "insertedId": 5 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 6 }, "session": "session0" }, "result": { "insertedId": 6 } }, { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 7 }, "session": "session0" }, "result": { "insertedId": 7 } }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 }, { "_id": 6 }, { "_id": 7 } ] } } }, { "description": "multiple commits", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 3, "1": 4 } } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "remain pinned after non-transient error on commit", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 3, "1": 4 } } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 51 } } } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "TransientTransactionError" ], "errorCode": 51 } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "unpin after transient error within a transaction", "useMultipleMongoses": true, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unpin after transient error within a transaction and commit", "useMultipleMongoses": true, "clientOptions": { "heartbeatFrequencyMS": 30000 }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 7 }, "data": { "failCommands": [ "insert", "isMaster", "hello" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 4 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ], "errorCodeName": "NoSuchTransaction" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null, "recoveryToken": 42 }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/read-concern.json000066400000000000000000001137671511661753600304600ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "tests": [ { "description": "only first countDocuments includes readConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" } } } }, { "name": "countDocuments", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$gte": 2 } } }, "result": 3 }, { "name": "countDocuments", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$gte": 2 } } }, "result": 3 }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "_id": { "$gte": 2 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "cursor": {}, "lsid": "session0", "readConcern": { "level": "majority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "_id": { "$gte": 2 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "cursor": {}, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "only first find includes readConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" } } } }, { "name": "find", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "find", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "batchSize": 3, "lsid": "session0", "readConcern": { "level": "majority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "only first aggregate includes readConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" } } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "lsid": "session0", "readConcern": { "level": "majority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "only first distinct includes readConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" } } } }, { "name": "distinct", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "fieldName": "_id" }, "result": [ 1, 2, 3, 4 ] }, { "name": "distinct", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "fieldName": "_id" }, "result": [ 1, 2, 3, 4 ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": { "level": "majority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "only first runCommand includes readConcern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" } } } }, { "name": "runCommand", "object": "database", "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" } } }, { "name": "runCommand", "object": "database", "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "lsid": "session0", "readConcern": { "level": "majority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "countDocuments ignores collection readConcern", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "countDocuments", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$gte": 2 } } }, "result": 3 }, { "name": "countDocuments", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$gte": 2 } } }, "result": 3 }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "_id": { "$gte": 2 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "cursor": {}, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "_id": { "$gte": 2 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "cursor": {}, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "find ignores collection readConcern", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "find", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "find", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "aggregate ignores collection readConcern", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "distinct ignores collection readConcern", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "distinct", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "fieldName": "_id" }, "result": [ 1, 2, 3, 4 ] }, { "name": "distinct", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0", "fieldName": "_id" }, "result": [ 1, 2, 3, 4 ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "runCommand ignores database readConcern", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "runCommand", "object": "database", "databaseOptions": { "readConcern": { "level": "majority" } }, "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" } } }, { "name": "runCommand", "object": "database", "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/read-pref.json000066400000000000000000000362201511661753600277510ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "default readPreference", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 1, "1": 2, "2": 3, "3": 4 } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "session": "session0", "pipeline": [ { "$match": { "_id": 1 } }, { "$count": "count" } ] }, "result": [ { "count": 1 } ] }, { "name": "find", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "primary readPreference", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Primary" } } } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 1, "1": 2, "2": 3, "3": 4 } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "session": "session0", "pipeline": [ { "$match": { "_id": 1 } }, { "$count": "count" } ] }, "result": [ { "count": 1 } ] }, { "name": "find", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Secondary" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "secondary readPreference", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Secondary" } } } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 1, "1": 2, "2": 3, "3": 4 } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "pipeline": [ { "$match": { "_id": 1 } }, { "$count": "count" } ] }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "find", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [] } } }, { "description": "primaryPreferred readPreference", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "PrimaryPreferred" } } } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 1, "1": 2, "2": 3, "3": 4 } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "pipeline": [ { "$match": { "_id": 1 } }, { "$count": "count" } ] }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "find", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [] } } }, { "description": "nearest readPreference", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Nearest" } } } }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "session": "session0" }, "result": { "insertedIds": { "0": 1, "1": 2, "2": 3, "3": 4 } } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "pipeline": [ { "$match": { "_id": 1 } }, { "$count": "count" } ] }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "find", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "session": "session0", "batchSize": 3 }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "aggregate", "object": "collection", "collectionOptions": { "readPreference": { "mode": "Primary" } }, "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "abortTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [] } } }, { "description": "secondary write only", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Secondary" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/reads.json000066400000000000000000000277171511661753600272150ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ], "tests": [ { "description": "collection readConcern without transaction", "operations": [ { "name": "find", "object": "collection", "collectionOptions": { "readConcern": { "level": "majority" } }, "arguments": { "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "readConcern": { "level": "majority" }, "lsid": "session0", "txnNumber": null, "startTransaction": null, "autocommit": null }, "command_name": "find", "database_name": "transaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "find", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "batchSize": 3 }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "find": "test", "batchSize": 3, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "find": "test", "batchSize": 3, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "find", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "aggregate", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$project": { "_id": 1 } } ], "batchSize": 3, "session": "session0" }, "result": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "aggregate": "test", "pipeline": [ { "$project": { "_id": 1 } } ], "cursor": { "batchSize": 3 }, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "aggregate", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "getMore": { "$numberLong": "42" }, "collection": "test", "batchSize": 3, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false }, "command_name": "getMore", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } }, { "description": "distinct", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "distinct", "object": "collection", "arguments": { "session": "session0", "fieldName": "_id" }, "result": [ 1, 2, 3, 4 ] }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "distinct": "test", "key": "_id", "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "distinct", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "readConcern": null, "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/retryable-abort-errorLabels.json000066400000000000000000001303421511661753600334540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "abortTransaction only retries once with RetryableWriteError from server", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction does not retry without RetryableWriteError label", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 11600, "errorLabels": [] } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 10107, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 13436, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 13435, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 11602, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 11600, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 91, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 7, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 6, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 9001, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 89, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after WriteConcernError InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11600, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after WriteConcernError InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11602, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after WriteConcernError PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 189, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/retryable-abort.json000066400000000000000000000231151511661753600312010ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "abortTransaction only performs a single retry", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "abortTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction does not retry after Interrupted", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 11601, "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction does not retry after WriteConcernError Interrupted", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "writeConcernError": { "code": 11601, "errmsg": "operation was interrupted" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "abortTransaction succeeds after connection error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } retryable-commit-errorLabels-forbid_serverless.json000066400000000000000000000132431511661753600372760ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction succeeds after InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 11600, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 91, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/retryable-commit-errorLabels.json000066400000000000000000001224431511661753600336400ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction does not retry error without RetryableWriteError label", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 11600, "errorLabels": [] } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "commitTransaction retries once with RetryableWriteError from server", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 112, "errorLabels": [ "RetryableWriteError" ] } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 10107, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 13436, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 13435, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 11602, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after HostNotFound", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 7, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after HostUnreachable", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 6, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after SocketException", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 9001, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after NetworkTimeout", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 89, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after WriteConcernError InterruptedAtShutdown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11600, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after WriteConcernError InterruptedDueToReplStateChange", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 11602, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after WriteConcernError PrimarySteppedDown", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 189, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after WriteConcernError ShutdownInProgress", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } retryable-commit-forbid_serverless.json000066400000000000000000000245021511661753600350240ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ], "serverless": "forbid" } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction fails after two errors", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction applies majority write concern on retries", "clientOptions": { "retryWrites": false }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": 2, "j": true, "wtimeout": 5000 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsContain": [ "RetryableWriteError", "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": 2, "j": true, "wtimeout": 5000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "j": true, "wtimeout": 5000 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "j": true, "wtimeout": 5000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction succeeds after connection error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/retryable-commit.json000066400000000000000000000122421511661753600313610ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction fails after Interrupted", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 11601, "closeConnection": false } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorCodeName": "Interrupted", "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "commitTransaction is not retried after UnsatisfiableWriteConcern error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 100, "errmsg": "Not enough data-bearing nodes" } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0", "result": { "errorLabelsOmit": [ "RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/retryable-writes.json000066400000000000000000000177131511661753600314160ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "increment txnNumber", "clientOptions": { "retryWrites": true }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 4 }, { "_id": 5 } ], "session": "session0" }, "result": { "insertedIds": { "0": 4, "1": 5 } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": { "afterClusterTime": 42 }, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 4 }, { "_id": 5 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "4" }, "startTransaction": null, "autocommit": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 4 }, { "_id": 5 } ] } } }, { "description": "writes are not retried", "clientOptions": { "retryWrites": true }, "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/run-command.json000066400000000000000000000166221511661753600303300ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "run command with default read preference", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "result": { "n": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] }, { "description": "run command with secondary read preference in client option and primary read preference in transaction options", "clientOptions": { "readPreference": "secondary" }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Primary" } } } }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "result": { "n": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] }, { "description": "run command with explicit primary read preference", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "runCommand", "object": "database", "command_name": "insert", "arguments": { "session": "session0", "command": { "insert": "test", "documents": [ { "_id": 1 } ] }, "readPreference": { "mode": "Primary" } }, "result": { "n": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ] }, { "description": "run command fails with explicit secondary read preference", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "runCommand", "object": "database", "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" }, "readPreference": { "mode": "Secondary" } }, "result": { "errorContains": "read preference in a transaction must be primary" } } ] }, { "description": "run command fails with secondary read preference from transaction options", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Secondary" } } } }, { "name": "runCommand", "object": "database", "command_name": "find", "arguments": { "session": "session0", "command": { "find": "test" } }, "result": { "errorContains": "read preference in a transaction must be primary" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/transaction-options-repl.json000066400000000000000000000103571511661753600330650ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "readConcern snapshot in startTransaction options", "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "majority" } } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "snapshot" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "snapshot" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "snapshot" }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "snapshot", "afterClusterTime": 42 }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/transaction-options.json000066400000000000000000001034351511661753600321250ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "no transaction options set", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null, "maxTimeMS": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "afterClusterTime": 42 }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null, "maxTimeMS": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "transaction options inherited from client", "clientOptions": { "w": 1, "readConcernLevel": "local" }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local" }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 }, "maxTimeMS": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local", "afterClusterTime": 42 }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 }, "maxTimeMS": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "transaction options inherited from defaultTransactionOptions", "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 }, "maxCommitTimeMS": 60000 } } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority", "afterClusterTime": 42 }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "startTransaction options override defaults", "clientOptions": { "readConcernLevel": "local", "w": 1 }, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "snapshot" }, "writeConcern": { "w": 1 }, "maxCommitTimeMS": 30000 } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" }, "writeConcern": { "w": "majority" }, "maxCommitTimeMS": 60000 } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readConcern": { "level": "majority" }, "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority", "afterClusterTime": 42 }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" }, "maxTimeMS": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "defaultTransactionOptions override client options", "clientOptions": { "readConcernLevel": "local", "w": 1 }, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "majority" }, "writeConcern": { "w": "majority" }, "maxCommitTimeMS": 60000 } } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" }, "maxTimeMS": 60000 }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority", "afterClusterTime": 42 }, "writeConcern": null, "maxTimeMS": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": "majority" }, "maxTimeMS": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "readConcern local in defaultTransactionOptions", "clientOptions": { "w": 1 }, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "local" } } } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local" }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 } }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local", "afterClusterTime": 42 }, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": { "w": 1 } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "client writeConcern ignored for bulk", "clientOptions": { "w": "majority" }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": 1 } } } }, { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ], "session": "session0" }, "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "0": 1 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": 1 } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "readPreference inherited from client", "clientOptions": { "readPreference": "secondary" }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "readPreference inherited from defaultTransactionOptions", "clientOptions": { "readPreference": "primary" }, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readPreference": { "mode": "Secondary" } } } }, "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "startTransaction overrides readPreference", "clientOptions": { "readPreference": "primary" }, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readPreference": { "mode": "Primary" } } } }, "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "readPreference": { "mode": "Secondary" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "find", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "result": { "errorContains": "read preference in a transaction must be primary" } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/update.json000066400000000000000000000244001511661753600273630ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ], "tests": [ { "description": "update", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 } }, { "name": "replaceOne", "object": "collection", "arguments": { "session": "session0", "filter": { "x": 1 }, "replacement": { "y": 1 } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateMany", "object": "collection", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 3 } }, "update": { "$set": { "z": 1 } } }, "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "$inc": { "x": 1 } }, "upsert": true } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "x": 1 }, "u": { "y": 1 } } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gte": 3 } }, "u": { "$set": { "z": 1 } }, "multi": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3, "z": 1 }, { "_id": 4, "y": 1, "z": 1 } ] } } }, { "description": "collections writeConcern ignored for update", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "updateOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": 4 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "result": { "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 1, "upsertedId": 4 } }, { "name": "replaceOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "x": 1 }, "replacement": { "y": 1 } }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "updateMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": "majority" } }, "arguments": { "session": "session0", "filter": { "_id": { "$gte": 3 } }, "update": { "$set": { "z": 1 } } }, "result": { "matchedCount": 2, "modifiedCount": 2, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "$inc": { "x": 1 } }, "upsert": true } ], "ordered": true, "readConcern": null, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "x": 1 }, "u": { "y": 1 } } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gte": 3 } }, "u": { "$set": { "z": 1 } }, "multi": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/legacy/write-concern.json000066400000000000000000000735261511661753600306750ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded", "load-balanced" ] } ], "database_name": "transaction-tests", "collection_name": "test", "data": [ { "_id": 0 } ], "tests": [ { "description": "commit with majority", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 }, { "_id": 1 } ] } } }, { "description": "commit with default", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 }, { "_id": 1 } ] } } }, { "description": "abort with majority", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": "majority" } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": { "w": "majority" } }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 } ] } } }, { "description": "abort with default", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 } ] } } }, { "description": "start with unacknowledged write concern", "operations": [ { "name": "startTransaction", "object": "session0", "arguments": { "options": { "writeConcern": { "w": 0 } } }, "result": { "errorContains": "transactions do not support unacknowledged write concern" } } ] }, { "description": "start with implicit unacknowledged write concern", "clientOptions": { "w": 0 }, "operations": [ { "name": "startTransaction", "object": "session0", "result": { "errorContains": "transactions do not support unacknowledged write concern" } } ] }, { "description": "unacknowledged write concern coll insertOne", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 }, { "_id": 1 } ] } } }, { "description": "unacknowledged write concern coll insertMany", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "documents": [ { "_id": 1 }, { "_id": 2 } ] }, "result": { "insertedIds": { "0": 1, "1": 2 } } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 }, { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 }, { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "unacknowledged write concern coll bulkWrite", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "bulkWrite", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "requests": [ { "name": "insertOne", "arguments": { "document": { "_id": 1 } } } ] }, "result": { "deletedCount": 0, "insertedCount": 1, "insertedIds": { "0": 1 }, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0 }, { "_id": 1 } ] } } }, { "description": "unacknowledged write concern coll deleteOne", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "deleteOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 } }, "result": { "deletedCount": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 0 }, "limit": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "unacknowledged write concern coll deleteMany", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "deleteMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 } }, "result": { "deletedCount": 1 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 0 }, "limit": 0 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "delete", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "unacknowledged write concern coll updateOne", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 0 }, "u": { "$inc": { "x": 1 } }, "upsert": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "x": 1 } ] } } }, { "description": "unacknowledged write concern coll updateMany", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "updateMany", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 }, "update": { "$inc": { "x": 1 } }, "upsert": true }, "result": { "matchedCount": 1, "modifiedCount": 1, "upsertedCount": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "update": "test", "updates": [ { "q": { "_id": 0 }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": true } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "update", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "x": 1 } ] } } }, { "description": "unacknowledged write concern coll findOneAndDelete", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndDelete", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 } }, "result": { "_id": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 0 }, "remove": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "unacknowledged write concern coll findOneAndReplace", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndReplace", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 }, "replacement": { "x": 1 }, "returnDocument": "Before" }, "result": { "_id": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 0 }, "update": { "x": 1 }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "x": 1 } ] } } }, { "description": "unacknowledged write concern coll findOneAndUpdate", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "findOneAndUpdate", "object": "collection", "collectionOptions": { "writeConcern": { "w": 0 } }, "arguments": { "session": "session0", "filter": { "_id": 0 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "result": { "_id": 0 } }, { "name": "commitTransaction", "object": "session0" } ], "expectations": [ { "command_started_event": { "command": { "findAndModify": "test", "query": { "_id": 0 }, "update": { "$inc": { "x": 1 } }, "new": false, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "findAndModify", "database_name": "transaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": null, "autocommit": false, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 0, "x": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/000077500000000000000000000000001511661753600253655ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/client-bulkWrite.json000066400000000000000000000352111511661753600315060ustar00rootroot00000000000000{ "description": "client bulkWrite transactions", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "8.0", "topologies": [ "replicaset", "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "transaction-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "session": { "id": "session0", "client": "client0" } }, { "client": { "id": "client_with_wmajority", "uriOptions": { "w": "majority" }, "observeEvents": [ "commandStartedEvent" ] } }, { "session": { "id": "session_with_wmajority", "client": "client_with_wmajority" } } ], "_yamlAnchors": { "namespace": "transaction-tests.coll0" }, "initialData": [ { "databaseName": "transaction-tests", "collectionName": "coll0", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ] } ], "tests": [ { "description": "client bulkWrite in a transaction", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "session": "session0", "models": [ { "insertOne": { "namespace": "transaction-tests.coll0", "document": { "_id": 8, "x": 88 } } }, { "updateOne": { "namespace": "transaction-tests.coll0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } }, { "updateMany": { "namespace": "transaction-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "update": { "$inc": { "x": 2 } } } }, { "replaceOne": { "namespace": "transaction-tests.coll0", "filter": { "_id": 4 }, "replacement": { "x": 44 }, "upsert": true } }, { "deleteOne": { "namespace": "transaction-tests.coll0", "filter": { "_id": 5 } } }, { "deleteMany": { "namespace": "transaction-tests.coll0", "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 1, "matchedCount": 3, "modifiedCount": 3, "deletedCount": 3, "insertResults": { "0": { "insertedId": 8 } }, "updateResults": { "1": { "matchedCount": 1, "modifiedCount": 1, "upsertedId": { "$$exists": false } }, "2": { "matchedCount": 2, "modifiedCount": 2, "upsertedId": { "$$exists": false } }, "3": { "matchedCount": 1, "modifiedCount": 0, "upsertedId": 4 } }, "deleteResults": { "4": { "deletedCount": 1 }, "5": { "deletedCount": 2 } } } }, { "object": "session0", "name": "commitTransaction" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false }, "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 8, "x": 88 } }, { "update": 0, "filter": { "_id": 1 }, "updateMods": { "$inc": { "x": 1 } }, "multi": false }, { "update": 0, "filter": { "$and": [ { "_id": { "$gt": 1 } }, { "_id": { "$lte": 3 } } ] }, "updateMods": { "$inc": { "x": 2 } }, "multi": true }, { "update": 0, "filter": { "_id": 4 }, "updateMods": { "x": 44 }, "upsert": true, "multi": false }, { "delete": 0, "filter": { "_id": 5 }, "multi": false }, { "delete": 0, "filter": { "$and": [ { "_id": { "$gt": 5 } }, { "_id": { "$lte": 7 } } ] }, "multi": true } ], "nsInfo": [ { "ns": "transaction-tests.coll0" } ] } } }, { "commandStartedEvent": { "commandName": "commitTransaction", "databaseName": "admin", "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } } } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "transaction-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 24 }, { "_id": 3, "x": 35 }, { "_id": 4, "x": 44 }, { "_id": 8, "x": 88 } ] } ] }, { "description": "client writeConcern ignored for client bulkWrite in transaction", "operations": [ { "object": "session_with_wmajority", "name": "startTransaction", "arguments": { "writeConcern": { "w": 1 } } }, { "object": "client_with_wmajority", "name": "clientBulkWrite", "arguments": { "session": "session_with_wmajority", "models": [ { "insertOne": { "namespace": "transaction-tests.coll0", "document": { "_id": 8, "x": 88 } } } ] }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "$$unsetOrMatches": {} }, "updateResults": { "$$unsetOrMatches": {} }, "deleteResults": { "$$unsetOrMatches": {} } } }, { "object": "session_with_wmajority", "name": "commitTransaction" } ], "expectEvents": [ { "client": "client_with_wmajority", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "lsid": { "$$sessionLsid": "session_with_wmajority" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false }, "bulkWrite": 1, "errorsOnly": true, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 8, "x": 88 } } ], "nsInfo": [ { "ns": "transaction-tests.coll0" } ] } } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session_with_wmajority" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "w": 1 } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "coll0", "databaseName": "transaction-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 5, "x": 55 }, { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 }, { "_id": 8, "x": 88 } ] } ] }, { "description": "client bulkWrite with writeConcern in a transaction causes a transaction error", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "client0", "name": "clientBulkWrite", "arguments": { "session": "session0", "writeConcern": { "w": 1 }, "models": [ { "insertOne": { "namespace": "transaction-tests.coll0", "document": { "_id": 8, "x": 88 } } } ] }, "expectError": { "isClientError": true, "errorContains": "Cannot set write concern after starting a transaction" } } ] } ] } do-not-retry-read-in-transaction.json000066400000000000000000000046511511661753600344120ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified{ "description": "do not retry read in a transaction", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.0.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.2.0", "topologies": [ "sharded", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ], "uriOptions": { "retryReads": true } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-read-in-transaction-test" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } }, { "session": { "id": "session0", "client": "client0" } } ], "tests": [ { "description": "find does not retry in a transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "session": "session0" }, "expectError": { "isError": true, "errorLabelsContain": [ "TransientTransactionError" ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll", "filter": {}, "startTransaction": true }, "commandName": "find", "databaseName": "retryable-read-in-transaction-test" } } ] } ] } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/mongos-pin-auto.json000066400000000000000000003733711511661753600313320ustar00rootroot00000000000000{ "description": "mongos-pin-auto", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.1.8", "topologies": [ "sharded" ], "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "transaction-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } } ], "initialData": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "remain pinned after non-transient Interrupted error on insertOne", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "object": "testRunner", "name": "targetedFailPoint", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorCodeName": "Interrupted" } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "commitTransaction" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false }, "recoveryToken": { "$$exists": true } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ] }, { "description": "unpin after transient error within a transaction", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "object": "testRunner", "name": "targetedFailPoint", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "abortTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": { "$numberLong": "1" }, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false }, "recoveryToken": { "$$exists": true } }, "commandName": "abortTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on insertOne insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on insertMany insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertMany", "object": "collection0", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on updateOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "updateOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on replaceOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "replaceOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on updateMany update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "updateMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on deleteOne delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "deleteOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on deleteMany delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "deleteMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on findOneAndDelete findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndDelete", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on findOneAndUpdate findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on findOneAndReplace findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 11601 } } } }, { "name": "findOneAndReplace", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "insertOne": { "document": { "_id": 1 } } } ] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on bulkWrite delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 11601 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "deleteOne": { "filter": { "_id": 1 } } } ] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on find find", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 11601 } } } }, { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on countDocuments aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11601 } } } }, { "name": "countDocuments", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on aggregate aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11601 } } } }, { "name": "aggregate", "object": "collection0", "arguments": { "session": "session0", "pipeline": [] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on distinct distinct", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 11601 } } } }, { "name": "distinct", "object": "collection0", "arguments": { "session": "session0", "fieldName": "_id", "filter": {} }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on runCommand insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "runCommand", "object": "database0", "arguments": { "session": "session0", "commandName": "insert", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "remain pinned after non-transient Interrupted error on clientBulkWrite bulkWrite", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 11601 } } } }, { "name": "clientBulkWrite", "object": "client0", "arguments": { "session": "session0", "models": [ { "insertOne": { "namespace": "database0.collection0", "document": { "_id": 8, "x": 88 } } } ] }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionPinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "runOnRequirements": [ { "minServerVersion": "8.0" } ] }, { "description": "unpin after transient connection error on insertOne insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on insertOne insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on insertMany insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertMany", "object": "collection0", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on insertMany insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "insertMany", "object": "collection0", "arguments": { "session": "session0", "documents": [ { "_id": 4 }, { "_id": 5 } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on updateOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "updateOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on updateOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "updateOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on replaceOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "replaceOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on replaceOne update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "replaceOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on updateMany update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "updateMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on updateMany update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "updateMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } }, "update": { "$set": { "z": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on deleteOne delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "deleteOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on deleteOne delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "deleteOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on deleteMany delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "deleteMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on deleteMany delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "deleteMany", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": { "$gte": 1 } } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on findOneAndDelete findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndDelete", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on findOneAndDelete findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndDelete", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on findOneAndUpdate findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on findOneAndUpdate findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on findOneAndReplace findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "closeConnection": true } } } }, { "name": "findOneAndReplace", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on findOneAndReplace findAndModify", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "findAndModify" ], "errorCode": 91 } } } }, { "name": "findOneAndReplace", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "replacement": { "y": 1 }, "returnDocument": "Before" }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on bulkWrite insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "insertOne": { "document": { "_id": 1 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "insertOne": { "document": { "_id": 1 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on bulkWrite update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite update", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "update" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "updateOne": { "filter": { "_id": 1 }, "update": { "$set": { "x": 1 } } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on bulkWrite delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "closeConnection": true } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "deleteOne": { "filter": { "_id": 1 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on bulkWrite delete", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "delete" ], "errorCode": 91 } } } }, { "name": "bulkWrite", "object": "collection0", "arguments": { "session": "session0", "requests": [ { "deleteOne": { "filter": { "_id": 1 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on find find", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on find find", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "errorCode": 91 } } } }, { "name": "find", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on countDocuments aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } } } }, { "name": "countDocuments", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on countDocuments aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } } } }, { "name": "countDocuments", "object": "collection0", "arguments": { "session": "session0", "filter": {} }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on aggregate aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "closeConnection": true } } } }, { "name": "aggregate", "object": "collection0", "arguments": { "session": "session0", "pipeline": [] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on aggregate aggregate", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 91 } } } }, { "name": "aggregate", "object": "collection0", "arguments": { "session": "session0", "pipeline": [] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on distinct distinct", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "closeConnection": true } } } }, { "name": "distinct", "object": "collection0", "arguments": { "session": "session0", "fieldName": "_id", "filter": {} }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on distinct distinct", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "distinct" ], "errorCode": 91 } } } }, { "name": "distinct", "object": "collection0", "arguments": { "session": "session0", "fieldName": "_id", "filter": {} }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on runCommand insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database0", "arguments": { "session": "session0", "commandName": "insert", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient ShutdownInProgress error on runCommand insert", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 91 } } } }, { "name": "runCommand", "object": "database0", "arguments": { "session": "session0", "commandName": "insert", "command": { "insert": "test", "documents": [ { "_id": 1 } ] } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "unpin after transient connection error on clientBulkWrite bulkWrite", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "closeConnection": true } } } }, { "name": "clientBulkWrite", "object": "client0", "arguments": { "session": "session0", "models": [ { "insertOne": { "namespace": "database0.collection0", "document": { "_id": 8, "x": 88 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "runOnRequirements": [ { "minServerVersion": "8.0" } ] }, { "description": "unpin after transient ShutdownInProgress error on clientBulkWrite bulkWrite", "operations": [ { "object": "session0", "name": "startTransaction" }, { "object": "collection0", "name": "insertOne", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "bulkWrite" ], "errorCode": 91 } } } }, { "name": "clientBulkWrite", "object": "client0", "arguments": { "session": "session0", "models": [ { "insertOne": { "namespace": "database0.collection0", "document": { "_id": 8, "x": 88 } } } ] }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ] } }, { "object": "testRunner", "name": "assertSessionUnpinned", "arguments": { "session": "session0" } }, { "object": "session0", "name": "abortTransaction" } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "runOnRequirements": [ { "minServerVersion": "8.0" } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/mongos-unpin.json000066400000000000000000000206211511661753600307120ustar00rootroot00000000000000{ "description": "mongos-unpin", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "sharded-replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true } }, { "database": { "id": "database0", "client": "client0", "databaseName": "mongos-unpin-db" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } } ], "initialData": [ { "collectionName": "test", "databaseName": "mongos-unpin-db", "documents": [] } ], "_yamlAnchors": { "anchors": 24 }, "tests": [ { "description": "unpin after TransientTransactionError error on commit", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 24 } } } }, { "name": "commitTransaction", "object": "session0", "expectError": { "errorCode": 24, "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin on successful abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin after TransientTransactionError error on abort", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 24 } } } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin after non-transient error on abort", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "abortTransaction" ], "errorCode": 91 } } } }, { "name": "abortTransaction", "object": "session0" }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin when a new transaction is started", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "startTransaction", "object": "session0" }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin when a non-transaction write operation uses a session", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] }, { "description": "unpin when a non-transaction read operation uses a session", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 }, "session": "session0" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "find", "object": "collection0", "arguments": { "filter": { "x": 1 }, "session": "session0" } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/retryable-abort-handshake.json000066400000000000000000000111401511661753600332770ustar00rootroot00000000000000{ "description": "retryable abortTransaction on handshake errors", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid", "auth": true } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "connectionCheckOutStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-handshake-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } }, { "session": { "id": "session0", "client": "client0" } }, { "session": { "id": "session1", "client": "client0" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-handshake-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "AbortTransaction succeeds after handshake network error", "skipReason": "DRIVERS-2032: Pinned servers need to be checked if they are still selectable", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 2, "x": 22 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "session": "session1", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "saslContinue", "ping" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database0", "arguments": { "commandName": "ping", "command": { "ping": 1 }, "session": "session1" }, "expectError": { "isError": true } }, { "name": "abortTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 2, "x": 22 } ], "startTransaction": true }, "commandName": "insert", "databaseName": "retryable-handshake-tests" } }, { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-handshake-tests" } }, { "commandStartedEvent": { "command": { "abortTransaction": 1, "lsid": { "$$sessionLsid": "session0" } }, "commandName": "abortTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-handshake-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/transactions/unified/retryable-commit-handshake.json000066400000000000000000000113621511661753600334660ustar00rootroot00000000000000{ "description": "retryable commitTransaction on handshake errors", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.2", "topologies": [ "replicaset", "sharded", "load-balanced" ], "serverless": "forbid", "auth": true } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent", "connectionCheckOutStartedEvent" ], "uriOptions": { "retryWrites": false } } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-handshake-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } }, { "session": { "id": "session0", "client": "client0" } }, { "session": { "id": "session1", "client": "client0" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-handshake-tests", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "CommitTransaction succeeds after handshake network error", "skipReason": "DRIVERS-2032: Pinned servers need to be checked if they are still selectable", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 2, "x": 22 } } }, { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "session": "session1", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "saslContinue", "ping" ], "closeConnection": true } } } }, { "name": "runCommand", "object": "database0", "arguments": { "commandName": "ping", "command": { "ping": 1 }, "session": "session1" }, "expectError": { "isError": true } }, { "name": "commitTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "eventType": "cmap", "events": [ { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} }, { "connectionCheckOutStartedEvent": {} } ] }, { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll", "documents": [ { "_id": 2, "x": 22 } ], "startTransaction": true }, "commandName": "insert", "databaseName": "retryable-handshake-tests" } }, { "commandStartedEvent": { "command": { "ping": 1 }, "databaseName": "retryable-handshake-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-handshake-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/000077500000000000000000000000001511661753600226555ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/assertNumberConnectionsCheckedOut.json000066400000000000000000000010161511661753600323620ustar00rootroot00000000000000{ "description": "assertNumberConnectionsCheckedOut", "schemaVersion": "1.3", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true } } ], "tests": [ { "description": "basic assertion succeeds", "operations": [ { "name": "assertNumberConnectionsCheckedOut", "object": "testRunner", "arguments": { "client": "client0", "connections": 0 } } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/distinct-comment.json000066400000000000000000000076451511661753600270450ustar00rootroot00000000000000{ "description": "distinct-comment", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "distinct-comment-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "distinct-comment-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "distinct with document comment", "runOnRequirements": [ { "minServerVersion": "4.4.14" } ], "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "comment": { "key": "value" } }, "expectResult": [ 11, 22, 33 ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "distinct": "coll0", "key": "x", "query": {}, "comment": { "key": "value" } }, "commandName": "distinct", "databaseName": "distinct-comment-tests" } } ] } ] }, { "description": "distinct with string comment", "runOnRequirements": [ { "minServerVersion": "4.4.0" } ], "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "comment": "comment" }, "expectResult": [ 11, 22, 33 ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "distinct": "coll0", "key": "x", "query": {}, "comment": "comment" }, "commandName": "distinct", "databaseName": "distinct-comment-tests" } } ] } ] }, { "description": "distinct with document comment - pre 4.4, server error", "runOnRequirements": [ { "minServerVersion": "3.6.0", "maxServerVersion": "4.4.13" } ], "operations": [ { "name": "distinct", "object": "collection0", "arguments": { "fieldName": "x", "filter": {}, "comment": { "key": "value" } }, "expectError": { "isClientError": false } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "distinct": "coll0", "key": "x", "query": {}, "comment": { "key": "value" } }, "commandName": "distinct", "databaseName": "distinct-comment-tests" } } ] } ] } ] }mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/entity-client-cmap-events.json000066400000000000000000000026261511661753600305660ustar00rootroot00000000000000{ "description": "entity-client-cmap-events", "schemaVersion": "1.3", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "connectionReadyEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "events are captured during an operation", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "x": 1 } } } ], "expectEvents": [ { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} }, { "connectionCheckedOutEvent": {} }, { "connectionCheckedInEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/entity-client-storeEventsAsEntities.json000066400000000000000000000023561511661753600326560ustar00rootroot00000000000000{ "description": "entity-client-storeEventsAsEntities", "schemaVersion": "1.2", "createEntities": [ { "client": { "id": "client0", "storeEventsAsEntities": [ { "id": "client0_events", "events": [ "CommandStartedEvent", "CommandSucceededEvent", "CommandFailedEvent" ] } ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "test" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "test", "documents": [ { "_id": 1, "x": 11 } ] } ], "tests": [ { "description": "storeEventsAsEntities captures events", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "x": 11 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/entity-find-cursor.json000066400000000000000000000101631511661753600273160ustar00rootroot00000000000000{ "description": "entity-find-cursor", "schemaVersion": "1.3", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "databaseName": "database0Name", "collectionName": "coll0", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 }, { "_id": 4 }, { "_id": 5 } ] } ], "tests": [ { "description": "cursors can be created, iterated, and closed", "operations": [ { "name": "createFindCursor", "object": "collection0", "arguments": { "filter": {}, "batchSize": 2 }, "saveResultAsEntity": "cursor0" }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 1 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 2 } }, { "name": "iterateUntilDocumentOrError", "object": "cursor0", "expectResult": { "_id": 3 } }, { "name": "close", "object": "cursor0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll0", "filter": {}, "batchSize": 2 }, "commandName": "find", "databaseName": "database0Name" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "ns": { "$$type": "string" }, "firstBatch": { "$$type": "array" } } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": "long" }, "collection": "coll0" }, "commandName": "getMore" } }, { "commandSucceededEvent": { "reply": { "cursor": { "id": { "$$type": "long" }, "ns": { "$$type": "string" }, "nextBatch": { "$$type": "array" } } }, "commandName": "getMore" } }, { "commandStartedEvent": { "command": { "killCursors": "coll0", "cursors": { "$$type": "array" } }, "commandName": "killCursors" } }, { "commandSucceededEvent": { "reply": { "cursorsKilled": { "$$unsetOrMatches": { "$$type": "array" } } }, "commandName": "killCursors" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/expectedEventsForClient-eventType.json000066400000000000000000000051141511661753600323260ustar00rootroot00000000000000{ "description": "expectedEventsForClient-eventType", "schemaVersion": "1.3", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent", "connectionReadyEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "eventType can be set to command and cmap", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } } } ], "expectEvents": [ { "client": "client0", "eventType": "command", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1 } ] }, "commandName": "insert" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} } ] } ] }, { "description": "eventType defaults to command if unset", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1 } ] }, "commandName": "insert" } } ] }, { "client": "client0", "eventType": "cmap", "events": [ { "connectionReadyEvent": {} } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/expectedEventsForClient-ignoreExtraEvents.json000066400000000000000000000062151511661753600340220ustar00rootroot00000000000000{ "description": "expectedEventsForClient-ignoreExtraEvents", "schemaVersion": "1.7", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "ignoreExtraEvents can be set to false", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": false, "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 1 } ] }, "commandName": "insert" } } ] } ] }, { "description": "ignoreExtraEvents can be set to true", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 2 } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3 } } } ], "expectEvents": [ { "client": "client0", "ignoreExtraEvents": true, "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 2 } ] }, "commandName": "insert" } } ] } ] }, { "description": "ignoreExtraEvents defaults to false if unset", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 4 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "coll0", "documents": [ { "_id": 4 } ] }, "commandName": "insert" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/ignoreResultAndError.json000066400000000000000000000022101511661753600276620ustar00rootroot00000000000000{ "description": "ignoreResultAndError", "schemaVersion": "1.3", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true } }, { "database": { "id": "database0", "client": "client0", "databaseName": "database0Name" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "database0Name", "documents": [] } ], "tests": [ { "description": "operation errors are ignored if ignoreResultAndError is true", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 1 } }, "ignoreResultAndError": true } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/kmsProviders-explicit_kms_credentials.json000066400000000000000000000023331511661753600333070ustar00rootroot00000000000000{ "description": "kmsProviders-explicit_kms_credentials", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0" } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": "accessKeyId", "secretAccessKey": "secretAccessKey" }, "azure": { "tenantId": "tenantId", "clientId": "clientId", "clientSecret": "clientSecret" }, "gcp": { "email": "email", "privateKey": "cHJpdmF0ZUtleQo=" }, "kmip": { "endpoint": "endpoint" }, "local": { "key": "a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5a2V5" } } } } } ], "tests": [ { "description": "", "operations": [] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/kmsProviders-mixed_kms_credential_fields.json000066400000000000000000000021531511661753600337370ustar00rootroot00000000000000{ "description": "kmsProviders-mixed_kms_credential_fields", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0" } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": "accessKeyId", "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": "tenantId", "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": "email", "privateKey": { "$$placeholder": 1 } } } } } } ], "tests": [ { "description": "", "operations": [] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/kmsProviders-placeholder_kms_credentials.json000066400000000000000000000027151511661753600337540ustar00rootroot00000000000000{ "description": "kmsProviders-placeholder_kms_credentials", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0" } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": { "accessKeyId": { "$$placeholder": 1 }, "secretAccessKey": { "$$placeholder": 1 } }, "azure": { "tenantId": { "$$placeholder": 1 }, "clientId": { "$$placeholder": 1 }, "clientSecret": { "$$placeholder": 1 } }, "gcp": { "email": { "$$placeholder": 1 }, "privateKey": { "$$placeholder": 1 } }, "kmip": { "endpoint": { "$$placeholder": 1 } }, "local": { "key": { "$$placeholder": 1 } } } } } } ], "tests": [ { "description": "", "operations": [] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/kmsProviders-unconfigured_kms.json000066400000000000000000000014071511661753600316020ustar00rootroot00000000000000{ "description": "kmsProviders-unconfigured_kms", "schemaVersion": "1.8", "runOnRequirements": [ { "csfle": true } ], "createEntities": [ { "client": { "id": "client0" } }, { "clientEncryption": { "id": "clientEncryption0", "clientEncryptionOpts": { "keyVaultClient": "client0", "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "aws": {}, "azure": {}, "gcp": {}, "kmip": {}, "local": {} } } } } ], "tests": [ { "description": "", "skipReason": "DRIVERS-2280: waiting on driver support for on-demand credentials", "operations": [] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/observeSensitiveCommands.json000066400000000000000000000403121511661753600305710ustar00rootroot00000000000000{ "description": "observeSensitiveCommands", "schemaVersion": "1.5", "runOnRequirements": [ { "auth": false } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ], "observeSensitiveCommands": true } }, { "client": { "id": "client1", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ], "observeSensitiveCommands": false } }, { "client": { "id": "client2", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "observeSensitiveCommands" } }, { "database": { "id": "database1", "client": "client1", "databaseName": "observeSensitiveCommands" } }, { "database": { "id": "database2", "client": "client2", "databaseName": "observeSensitiveCommands" } } ], "tests": [ { "description": "getnonce is observed with observeSensitiveCommands=true", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "getnonce", "command": { "getnonce": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "getnonce", "reply": { "ok": { "$$exists": false }, "nonce": { "$$exists": false } } } } ] } ] }, { "description": "getnonce is not observed with observeSensitiveCommands=false", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database1", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectEvents": [ { "client": "client1", "events": [] } ] }, { "description": "getnonce is not observed by default", "runOnRequirements": [ { "maxServerVersion": "6.1.99" } ], "operations": [ { "name": "runCommand", "object": "database2", "arguments": { "commandName": "getnonce", "command": { "getnonce": 1 } } } ], "expectEvents": [ { "client": "client2", "events": [] } ] }, { "description": "hello with speculativeAuthenticate", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "hello", "command": { "hello": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] }, { "client": "client1", "events": [] }, { "client": "client2", "events": [] } ] }, { "description": "hello without speculativeAuthenticate is always observed", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "hello", "command": { "hello": 1 } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "hello", "command": { "hello": 1 } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "hello", "command": { "hello": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": 1 } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": true } } } } ] }, { "client": "client1", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": 1 } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": true } } } } ] }, { "client": "client2", "events": [ { "commandStartedEvent": { "commandName": "hello", "command": { "hello": 1 } } }, { "commandSucceededEvent": { "commandName": "hello", "reply": { "isWritablePrimary": { "$$exists": true } } } } ] } ] }, { "description": "legacy hello with speculativeAuthenticate", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database0", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1, "speculativeAuthenticate": { "saslStart": 1 } } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": false }, "speculativeAuthenticate": { "$$exists": false } } } } ] }, { "client": "client1", "events": [] }, { "client": "client2", "events": [] } ] }, { "description": "legacy hello without speculativeAuthenticate is always observed", "operations": [ { "name": "runCommand", "object": "database0", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database0", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database1", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "name": "runCommand", "object": "database2", "arguments": { "commandName": "isMaster", "command": { "isMaster": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": true } } } } ] }, { "client": "client1", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": true } } } } ] }, { "client": "client2", "events": [ { "commandStartedEvent": { "commandName": "ismaster", "command": { "ismaster": 1 } } }, { "commandSucceededEvent": { "commandName": "ismaster", "reply": { "ismaster": { "$$exists": true } } } }, { "commandStartedEvent": { "commandName": "isMaster", "command": { "isMaster": 1 } } }, { "commandSucceededEvent": { "commandName": "isMaster", "reply": { "ismaster": { "$$exists": true } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-change-streams.json000066400000000000000000000235321511661753600272350ustar00rootroot00000000000000{ "description": "poc-change-streams", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ], "ignoreCommandMonitoringEvents": [ "getMore", "killCursors" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "change-stream-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "client": { "id": "client1", "useMultipleMongoses": false } }, { "database": { "id": "database1", "client": "client1", "databaseName": "change-stream-tests" } }, { "database": { "id": "database2", "client": "client1", "databaseName": "change-stream-tests-2" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "test" } }, { "collection": { "id": "collection2", "database": "database1", "collectionName": "test2" } }, { "collection": { "id": "collection3", "database": "database2", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "change-stream-tests", "documents": [] }, { "collectionName": "test2", "databaseName": "change-stream-tests", "documents": [] }, { "collectionName": "test", "databaseName": "change-stream-tests-2", "documents": [] } ], "tests": [ { "description": "Executing a watch helper on a MongoClient results in notifications for changes to all collections in all databases in the cluster.", "runOnRequirements": [ { "minServerVersion": "3.8.0", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "createChangeStream", "object": "client0", "arguments": { "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection2", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "collection3", "arguments": { "document": { "y": 1 } } }, { "name": "insertOne", "object": "collection1", "arguments": { "document": { "z": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests", "coll": "test2" }, "fullDocument": { "_id": { "$$type": "objectId" }, "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests-2", "coll": "test" }, "fullDocument": { "_id": { "$$type": "objectId" }, "y": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests", "coll": "test" }, "fullDocument": { "_id": { "$$type": "objectId" }, "z": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "cursor": {}, "pipeline": [ { "$changeStream": { "allChangesForCluster": true, "fullDocument": { "$$unsetOrMatches": "default" } } } ] }, "commandName": "aggregate", "databaseName": "admin" } } ] } ] }, { "description": "Test consecutive resume", "runOnRequirements": [ { "minServerVersion": "4.1.7", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "getMore" ], "closeConnection": true } } } }, { "name": "createChangeStream", "object": "collection0", "arguments": { "batchSize": 1, "pipeline": [] }, "saveResultAsEntity": "changeStream0" }, { "name": "insertOne", "object": "collection1", "arguments": { "document": { "x": 1 } } }, { "name": "insertOne", "object": "collection1", "arguments": { "document": { "x": 2 } } }, { "name": "insertOne", "object": "collection1", "arguments": { "document": { "x": 3 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests", "coll": "test" }, "fullDocument": { "_id": { "$$type": "objectId" }, "x": 1 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests", "coll": "test" }, "fullDocument": { "_id": { "$$type": "objectId" }, "x": 2 } } }, { "name": "iterateUntilDocumentOrError", "object": "changeStream0", "expectResult": { "operationType": "insert", "ns": { "db": "change-stream-tests", "coll": "test" }, "fullDocument": { "_id": { "$$type": "objectId" }, "x": 3 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "cursor": { "batchSize": 1 }, "pipeline": [ { "$changeStream": { "fullDocument": { "$$unsetOrMatches": "default" } } } ] }, "commandName": "aggregate", "databaseName": "change-stream-tests" } }, { "commandStartedEvent": { "command": { "aggregate": "test", "cursor": { "batchSize": 1 }, "pipeline": [ { "$changeStream": { "fullDocument": { "$$unsetOrMatches": "default" }, "resumeAfter": { "$$exists": true } } } ] }, "commandName": "aggregate", "databaseName": "change-stream-tests" } }, { "commandStartedEvent": { "command": { "aggregate": "test", "cursor": { "batchSize": 1 }, "pipeline": [ { "$changeStream": { "fullDocument": { "$$unsetOrMatches": "default" }, "resumeAfter": { "$$exists": true } } } ] }, "commandName": "aggregate", "databaseName": "change-stream-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-command-monitoring.json000066400000000000000000000120711511661753600301310ustar00rootroot00000000000000{ "description": "poc-command-monitoring", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent", "commandSucceededEvent", "commandFailedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "command-monitoring-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } } ], "initialData": [ { "collectionName": "test", "databaseName": "command-monitoring-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "A successful find event with a getmore and the server kills the cursor (<= 4.4)", "runOnRequirements": [ { "minServerVersion": "3.1", "maxServerVersion": "4.4.99", "topologies": [ "single", "replicaset" ] } ], "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": { "$gte": 1 } }, "sort": { "_id": 1 }, "batchSize": 3, "limit": 4 }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": { "$$type": [ "int", "long" ] }, "ns": "command-monitoring-tests.test", "firstBatch": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } }, "commandName": "find" } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "collection": "test", "batchSize": 1 }, "commandName": "getMore", "databaseName": "command-monitoring-tests" } }, { "commandSucceededEvent": { "reply": { "ok": 1, "cursor": { "id": 0, "ns": "command-monitoring-tests.test", "nextBatch": [ { "_id": 4, "x": 44 } ] } }, "commandName": "getMore" } } ] } ] }, { "description": "A failed find event", "operations": [ { "name": "find", "object": "collection0", "arguments": { "filter": { "$or": true } }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "test", "filter": { "$or": true } }, "commandName": "find", "databaseName": "command-monitoring-tests" } }, { "commandFailedEvent": { "commandName": "find" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-crud.json000066400000000000000000000226641511661753600252760ustar00rootroot00000000000000{ "description": "poc-crud", "schemaVersion": "1.4", "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "crud-tests" } }, { "database": { "id": "database1", "client": "client0", "databaseName": "admin" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll0" } }, { "collection": { "id": "collection1", "database": "database0", "collectionName": "coll1" } }, { "collection": { "id": "collection2", "database": "database0", "collectionName": "coll2", "collectionOptions": { "readConcern": { "level": "majority" } } } } ], "initialData": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] }, { "collectionName": "coll1", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] }, { "collectionName": "coll2", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] }, { "collectionName": "aggregate_out", "databaseName": "crud-tests", "documents": [] } ], "tests": [ { "description": "BulkWrite with mixed ordered operations", "operations": [ { "name": "bulkWrite", "object": "collection0", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 3, "x": 33 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, { "insertOne": { "document": { "_id": 4, "x": 44 } } }, { "deleteMany": { "filter": { "x": { "$nin": [ 24, 34 ] } } } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "ordered": true }, "expectResult": { "deletedCount": 2, "insertedCount": 2, "insertedIds": { "$$unsetOrMatches": { "0": 3, "3": 4 } }, "matchedCount": 3, "modifiedCount": 3, "upsertedCount": 1, "upsertedIds": { "5": 4 } } } ], "outcome": [ { "collectionName": "coll0", "databaseName": "crud-tests", "documents": [ { "_id": 2, "x": 24 }, { "_id": 3, "x": 34 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "InsertMany continue-on-error behavior with unordered (duplicate key in requests)", "operations": [ { "name": "insertMany", "object": "collection1", "arguments": { "documents": [ { "_id": 2, "x": 22 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ], "ordered": false }, "expectError": { "expectResult": { "$$unsetOrMatches": { "deletedCount": 0, "insertedCount": 2, "matchedCount": 0, "modifiedCount": 0, "upsertedCount": 0, "upsertedIds": {} } } } } ], "outcome": [ { "collectionName": "coll1", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "ReplaceOne prohibits atomic modifiers", "operations": [ { "name": "replaceOne", "object": "collection1", "arguments": { "filter": { "_id": 1 }, "replacement": { "$set": { "x": 22 } } }, "expectError": { "isClientError": true } } ], "expectEvents": [ { "client": "client0", "events": [] } ], "outcome": [ { "collectionName": "coll1", "databaseName": "crud-tests", "documents": [ { "_id": 1, "x": 11 } ] } ] }, { "description": "readConcern majority with out stage", "runOnRequirements": [ { "minServerVersion": "4.1.0", "topologies": [ "replicaset", "sharded-replicaset" ] } ], "operations": [ { "name": "aggregate", "object": "collection2", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "aggregate_out" } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll2", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } }, { "$out": "aggregate_out" } ], "readConcern": { "level": "majority" } }, "commandName": "aggregate", "databaseName": "crud-tests" } } ] } ], "outcome": [ { "collectionName": "aggregate_out", "databaseName": "crud-tests", "documents": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] }, { "description": "Aggregate with $listLocalSessions", "runOnRequirements": [ { "minServerVersion": "3.6.0", "serverless": "forbid" } ], "operations": [ { "name": "aggregate", "object": "database1", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 }, { "$addFields": { "dummy": "dummy field" } }, { "$project": { "_id": 0, "dummy": 1 } } ] }, "expectResult": [ { "dummy": "dummy field" } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-gridfs.json000066400000000000000000000152361511661753600256140ustar00rootroot00000000000000{ "description": "poc-gridfs", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0" } }, { "database": { "id": "database0", "client": "client0", "databaseName": "gridfs-tests" } }, { "bucket": { "id": "bucket0", "database": "database0" } }, { "collection": { "id": "bucket0_files_collection", "database": "database0", "collectionName": "fs.files" } }, { "collection": { "id": "bucket0_chunks_collection", "database": "database0", "collectionName": "fs.chunks" } } ], "initialData": [ { "collectionName": "fs.files", "databaseName": "gridfs-tests", "documents": [ { "_id": { "$oid": "000000000000000000000005" }, "length": 10, "chunkSize": 4, "uploadDate": { "$date": "1970-01-01T00:00:00.000Z" }, "md5": "57d83cd477bfb1ccd975ab33d827a92b", "filename": "length-10", "contentType": "application/octet-stream", "aliases": [], "metadata": {} } ] }, { "collectionName": "fs.chunks", "databaseName": "gridfs-tests", "documents": [ { "_id": { "$oid": "000000000000000000000005" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 0, "data": { "$binary": { "base64": "ESIzRA==", "subType": "00" } } }, { "_id": { "$oid": "000000000000000000000006" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 1, "data": { "$binary": { "base64": "VWZ3iA==", "subType": "00" } } }, { "_id": { "$oid": "000000000000000000000007" }, "files_id": { "$oid": "000000000000000000000005" }, "n": 2, "data": { "$binary": { "base64": "mao=", "subType": "00" } } } ] } ], "tests": [ { "description": "Delete when length is 10", "operations": [ { "name": "delete", "object": "bucket0", "arguments": { "id": { "$oid": "000000000000000000000005" } } } ], "outcome": [ { "collectionName": "fs.files", "databaseName": "gridfs-tests", "documents": [] }, { "collectionName": "fs.chunks", "databaseName": "gridfs-tests", "documents": [] } ] }, { "description": "Download when there are three chunks", "operations": [ { "name": "download", "object": "bucket0", "arguments": { "id": { "$oid": "000000000000000000000005" } }, "expectResult": { "$$matchesHexBytes": "112233445566778899aa" } } ] }, { "description": "Download when files entry does not exist", "operations": [ { "name": "download", "object": "bucket0", "arguments": { "id": { "$oid": "000000000000000000000000" } }, "expectError": { "isError": true } } ] }, { "description": "Download when an intermediate chunk is missing", "operations": [ { "name": "deleteOne", "object": "bucket0_chunks_collection", "arguments": { "filter": { "files_id": { "$oid": "000000000000000000000005" }, "n": 1 } }, "expectResult": { "deletedCount": 1 } }, { "name": "download", "object": "bucket0", "arguments": { "id": { "$oid": "000000000000000000000005" } }, "expectError": { "isError": true } } ] }, { "description": "Upload when length is 5", "operations": [ { "name": "upload", "object": "bucket0", "arguments": { "filename": "filename", "source": { "$$hexBytes": "1122334455" }, "chunkSizeBytes": 4 }, "expectResult": { "$$type": "objectId" }, "saveResultAsEntity": "oid0" }, { "name": "find", "object": "bucket0_files_collection", "arguments": { "filter": {}, "sort": { "uploadDate": -1 }, "limit": 1 }, "expectResult": [ { "_id": { "$$matchesEntity": "oid0" }, "length": 5, "chunkSize": 4, "uploadDate": { "$$type": "date" }, "md5": { "$$unsetOrMatches": "283d4fea5dded59cf837d3047328f5af" }, "filename": "filename" } ] }, { "name": "find", "object": "bucket0_chunks_collection", "arguments": { "filter": { "_id": { "$gt": { "$oid": "000000000000000000000007" } } }, "sort": { "n": 1 } }, "expectResult": [ { "_id": { "$$type": "objectId" }, "files_id": { "$$matchesEntity": "oid0" }, "n": 0, "data": { "$binary": { "base64": "ESIzRA==", "subType": "00" } } }, { "_id": { "$$type": "objectId" }, "files_id": { "$$matchesEntity": "oid0" }, "n": 1, "data": { "$binary": { "base64": "VQ==", "subType": "00" } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-queryable-encryption.json000066400000000000000000000106771511661753600305230ustar00rootroot00000000000000{ "description": "poc-queryable-encryption", "schemaVersion": "1.23", "runOnRequirements": [ { "minServerVersion": "7.0", "csfle": true, "topologies": [ "replicaset", "load-balanced", "sharded" ] } ], "createEntities": [ { "client": { "id": "client0", "autoEncryptOpts": { "keyVaultNamespace": "keyvault.datakeys", "kmsProviders": { "local": { "key": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk" } } } } }, { "database": { "id": "encryptedDB", "client": "client0", "databaseName": "poc-queryable-encryption" } }, { "collection": { "id": "encryptedColl", "database": "encryptedDB", "collectionName": "encrypted" } }, { "client": { "id": "client1" } }, { "database": { "id": "unencryptedDB", "client": "client1", "databaseName": "poc-queryable-encryption" } }, { "collection": { "id": "unencryptedColl", "database": "unencryptedDB", "collectionName": "encrypted" } } ], "initialData": [ { "databaseName": "keyvault", "collectionName": "datakeys", "documents": [ { "_id": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "keyMaterial": { "$binary": { "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==", "subType": "00" } }, "creationDate": { "$date": { "$numberLong": "1641024000000" } }, "updateDate": { "$date": { "$numberLong": "1641024000000" } }, "status": 1, "masterKey": { "provider": "local" } } ] }, { "databaseName": "poc-queryable-encryption", "collectionName": "encrypted", "documents": [], "createOptions": { "encryptedFields": { "fields": [ { "keyId": { "$binary": { "base64": "EjRWeBI0mHYSNBI0VniQEg==", "subType": "04" } }, "path": "encryptedInt", "bsonType": "int", "queries": { "queryType": "equality", "contention": { "$numberLong": "0" } } } ] } } } ], "tests": [ { "description": "insert, replace, and find with queryable encryption", "operations": [ { "object": "encryptedColl", "name": "insertOne", "arguments": { "document": { "_id": 1, "encryptedInt": 11 } } }, { "object": "encryptedColl", "name": "replaceOne", "arguments": { "filter": { "encryptedInt": 11 }, "replacement": { "encryptedInt": 22 } } }, { "object": "encryptedColl", "name": "find", "arguments": { "filter": { "encryptedInt": 22 } }, "expectResult": [ { "_id": 1, "encryptedInt": 22 } ] }, { "object": "unencryptedColl", "name": "find", "arguments": { "filter": {} }, "expectResult": [ { "_id": 1, "encryptedInt": { "$$type": "binData" }, "__safeContent__": [ { "$binary": { "base64": "rhS16TJojgDDBtbluxBokvcotP1mQTGeYpNt8xd3MJQ=", "subType": "00" } } ] } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-retryable-reads.json000066400000000000000000000227301511661753600274200ustar00rootroot00000000000000{ "description": "poc-retryable-reads", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "single", "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "client": { "id": "client1", "uriOptions": { "retryReads": false }, "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-reads-tests" } }, { "database": { "id": "database1", "client": "client1", "databaseName": "retryable-reads-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-reads-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "tests": [ { "description": "Aggregate succeeds after InterruptedAtShutdown", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "aggregate" ], "errorCode": 11600 } } } }, { "name": "aggregate", "object": "collection0", "arguments": { "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "expectResult": [ { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "databaseName": "retryable-reads-tests" } }, { "commandStartedEvent": { "command": { "aggregate": "coll", "pipeline": [ { "$match": { "_id": { "$gt": 1 } } }, { "$sort": { "x": 1 } } ] }, "databaseName": "retryable-reads-tests" } } ] } ] }, { "description": "Find succeeds on second attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {}, "sort": { "_id": 1 }, "limit": 2 }, "expectResult": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 2 }, "databaseName": "retryable-reads-tests" } }, { "commandStartedEvent": { "command": { "find": "coll", "filter": {}, "sort": { "_id": 1 }, "limit": 2 }, "databaseName": "retryable-reads-tests" } } ] } ] }, { "description": "Find fails on first attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection1", "arguments": { "filter": {} }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client1", "events": [ { "commandStartedEvent": { "command": { "find": "coll", "filter": {} }, "databaseName": "retryable-reads-tests" } } ] } ] }, { "description": "Find fails on second attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "find" ], "closeConnection": true } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": {} }, "expectError": { "isError": true } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "find": "coll", "filter": {} }, "databaseName": "retryable-reads-tests" } }, { "commandStartedEvent": { "command": { "find": "coll", "filter": {} }, "databaseName": "retryable-reads-tests" } } ] } ] }, { "description": "ListDatabases succeeds on second attempt", "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "listDatabases" ], "closeConnection": true } } } }, { "name": "listDatabases", "object": "client0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "listDatabases": 1 } } }, { "commandStartedEvent": { "command": { "listDatabases": 1 } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-retryable-writes.json000066400000000000000000000247551511661753600276500ustar00rootroot00000000000000{ "description": "poc-retryable-writes", "schemaVersion": "1.0", "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "client": { "id": "client1", "uriOptions": { "retryWrites": false }, "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "retryable-writes-tests" } }, { "database": { "id": "database1", "client": "client1", "databaseName": "retryable-writes-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "coll" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "coll" } } ], "initialData": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ], "tests": [ { "description": "FindOneAndUpdate is committed on first attempt", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate is not committed on first attempt", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 1 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectResult": { "_id": 1, "x": 11 } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 12 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "FindOneAndUpdate is never committed", "runOnRequirements": [ { "minServerVersion": "3.6", "topologies": [ "replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "onPrimaryTransactionalWrite", "mode": { "times": 2 }, "data": { "failBeforeCommitExceptionCode": 1 } } } }, { "name": "findOneAndUpdate", "object": "collection0", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "returnDocument": "Before" }, "expectError": { "isError": true } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "InsertMany succeeds after PrimarySteppedDown", "runOnRequirements": [ { "minServerVersion": "4.3.1", "topologies": [ "replicaset", "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 189, "errorLabels": [ "RetryableWriteError" ] } } } }, { "name": "insertMany", "object": "collection0", "arguments": { "documents": [ { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ], "ordered": true }, "expectResult": { "$$unsetOrMatches": { "insertedIds": { "$$unsetOrMatches": { "0": 3, "1": 4 } } } } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 } ] } ] }, { "description": "InsertOne fails after connection failure when retryWrites option is false", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.7", "topologies": [ "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client1", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection1", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "errorLabelsOmit": [ "RetryableWriteError" ] } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 } ] } ] }, { "description": "InsertOne fails after multiple retryable writeConcernErrors", "runOnRequirements": [ { "minServerVersion": "4.3.1", "topologies": [ "replicaset", "sharded" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "errorLabels": [ "RetryableWriteError" ], "writeConcernError": { "code": 91, "errmsg": "Replication is being shut down" } } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 3, "x": 33 } }, "expectError": { "errorLabelsContain": [ "RetryableWriteError" ] } } ], "outcome": [ { "collectionName": "coll", "databaseName": "retryable-writes-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-sessions.json000066400000000000000000000251261511661753600262030ustar00rootroot00000000000000{ "description": "poc-sessions", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "3.6.0" } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": false, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "session-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } } ], "initialData": [ { "collectionName": "test", "databaseName": "session-tests", "documents": [ { "_id": 1 } ] } ], "tests": [ { "description": "Server supports explicit sessions", "operations": [ { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 2 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 2 } } } }, { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "endSession", "object": "session0" }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": -1 } }, "expectResult": [] }, { "name": "assertSameLsidOnLastTwoCommands", "object": "testRunner", "arguments": { "client": "client0" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" } }, "commandName": "insert", "databaseName": "session-tests" } }, { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": -1 }, "lsid": { "$$sessionLsid": "session0" } }, "commandName": "find", "databaseName": "session-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "session-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "Server supports implicit sessions", "operations": [ { "name": "insertOne", "object": "collection0", "arguments": { "document": { "_id": 2 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 2 } } } }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": -1 } }, "expectResult": [] }, { "name": "assertSameLsidOnLastTwoCommands", "object": "testRunner", "arguments": { "client": "client0" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": { "$$type": "object" } }, "commandName": "insert", "databaseName": "session-tests" } }, { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": -1 }, "lsid": { "$$type": "object" } }, "commandName": "find", "databaseName": "session-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "session-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] }, { "description": "Dirty explicit session is discarded", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topologies": [ "sharded-replicaset" ] } ], "operations": [ { "name": "failPoint", "object": "testRunner", "arguments": { "client": "client0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "assertSessionNotDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 2 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 2 } } } }, { "name": "assertSessionDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "assertSessionDirty", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "endSession", "object": "session0" }, { "name": "find", "object": "collection0", "arguments": { "filter": { "_id": -1 } }, "expectResult": [] }, { "name": "assertDifferentLsidOnLastTwoCommands", "object": "testRunner", "arguments": { "client": "client0" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1 }, "commandName": "insert", "databaseName": "session-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1 }, "commandName": "insert", "databaseName": "session-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 2 }, "commandName": "insert", "databaseName": "session-tests" } }, { "commandStartedEvent": { "command": { "find": "test", "filter": { "_id": -1 }, "lsid": { "$$type": "object" } }, "commandName": "find", "databaseName": "session-tests" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "session-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-transactions-convenient-api.json000066400000000000000000000307731511661753600317660ustar00rootroot00000000000000{ "description": "poc-transactions-convenient-api", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topologies": [ "sharded-replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "client": { "id": "client1", "uriOptions": { "readConcernLevel": "local", "w": 1 }, "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "transaction-tests" } }, { "database": { "id": "database1", "client": "client1", "databaseName": "transaction-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "collection": { "id": "collection1", "database": "database1", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } }, { "session": { "id": "session1", "client": "client1" } }, { "session": { "id": "session2", "client": "client0", "sessionOptions": { "defaultTransactionOptions": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } } } ], "initialData": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [] } ], "tests": [ { "description": "withTransaction and no transaction options set", "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": [ { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "readConcern": { "$$exists": false }, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "autocommit": false, "readConcern": { "$$exists": false }, "startTransaction": { "$$exists": false }, "writeConcern": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "withTransaction inherits transaction options from client", "operations": [ { "name": "withTransaction", "object": "session1", "arguments": { "callback": [ { "name": "insertOne", "object": "collection1", "arguments": { "session": "session1", "document": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ] } } ], "expectEvents": [ { "client": "client1", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": { "$$sessionLsid": "session1" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local" }, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session1" }, "txnNumber": 1, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": { "$$exists": false }, "startTransaction": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "withTransaction inherits transaction options from defaultTransactionOptions", "operations": [ { "name": "withTransaction", "object": "session2", "arguments": { "callback": [ { "name": "insertOne", "object": "collection0", "arguments": { "session": "session2", "document": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ] } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": { "$$sessionLsid": "session2" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session2" }, "txnNumber": 1, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": { "$$exists": false }, "startTransaction": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 } ] } ] }, { "description": "withTransaction explicit transaction options", "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": [ { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 1 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 1 } } } } ], "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": { "$$exists": false }, "startTransaction": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-transactions-mongos-pin-auto.json000066400000000000000000000241071511661753600320750ustar00rootroot00000000000000{ "description": "poc-transactions-mongos-pin-auto", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.1.8", "topologies": [ "sharded-replicaset" ] } ], "createEntities": [ { "client": { "id": "client0", "useMultipleMongoses": true, "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "transaction-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } } ], "initialData": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ], "tests": [ { "description": "remain pinned after non-transient Interrupted error on insertOne", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "errorCode": 11601 } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorCodeName": "Interrupted" } }, { "name": "assertSessionPinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "commitTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false }, "recoveryToken": { "$$type": "object" } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } ] }, { "description": "unpin after transient error within a transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 3 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 3 } } } }, { "name": "targetedFailPoint", "object": "testRunner", "arguments": { "session": "session0", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } } } }, { "name": "insertOne", "object": "collection0", "arguments": { "session": "session0", "document": { "_id": 4 } }, "expectError": { "errorLabelsContain": [ "TransientTransactionError" ], "errorLabelsOmit": [ "UnknownTransactionCommitResult" ] } }, { "name": "assertSessionUnpinned", "object": "testRunner", "arguments": { "session": "session0" } }, { "name": "abortTransaction", "object": "session0" } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 4 } ], "ordered": true, "readConcern": { "$$exists": false }, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "insert", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "abortTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false }, "recoveryToken": { "$$type": "object" } }, "commandName": "abortTransaction", "databaseName": "admin" } } ] } ], "outcome": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [ { "_id": 1 }, { "_id": 2 } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/unified/poc-transactions.json000066400000000000000000000174371511661753600270530ustar00rootroot00000000000000{ "description": "poc-transactions", "schemaVersion": "1.0", "runOnRequirements": [ { "minServerVersion": "4.0", "topologies": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topologies": [ "sharded" ] } ], "createEntities": [ { "client": { "id": "client0", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database0", "client": "client0", "databaseName": "transaction-tests" } }, { "collection": { "id": "collection0", "database": "database0", "collectionName": "test" } }, { "session": { "id": "session0", "client": "client0" } } ], "initialData": [ { "collectionName": "test", "databaseName": "transaction-tests", "documents": [] } ], "tests": [ { "description": "Client side error in command starting transaction", "operations": [ { "name": "startTransaction", "object": "session0" }, { "name": "updateOne", "object": "collection0", "arguments": { "session": "session0", "filter": { "_id": 1 }, "update": { "x": 1 } }, "expectError": { "isClientError": true } }, { "name": "assertSessionTransactionState", "object": "testRunner", "arguments": { "session": "session0", "state": "starting" } } ] }, { "description": "explicitly create collection using create command", "runOnRequirements": [ { "minServerVersion": "4.3.4", "topologies": [ "replicaset", "sharded" ] } ], "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "createCollection", "object": "database0", "arguments": { "session": "session0", "collection": "test" } }, { "name": "assertCollectionNotExists", "object": "testRunner", "arguments": { "databaseName": "transaction-tests", "collectionName": "test" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertCollectionExists", "object": "testRunner", "arguments": { "databaseName": "transaction-tests", "collectionName": "test" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test", "writeConcern": { "$$exists": false } }, "commandName": "drop", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "create": "test", "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "create", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ] }, { "description": "create index on a non-existing collection", "runOnRequirements": [ { "minServerVersion": "4.3.4", "topologies": [ "replicaset", "sharded" ] } ], "operations": [ { "name": "dropCollection", "object": "database0", "arguments": { "collection": "test" } }, { "name": "startTransaction", "object": "session0" }, { "name": "createIndex", "object": "collection0", "arguments": { "session": "session0", "name": "x_1", "keys": { "x": 1 } } }, { "name": "assertIndexNotExists", "object": "testRunner", "arguments": { "databaseName": "transaction-tests", "collectionName": "test", "indexName": "x_1" } }, { "name": "commitTransaction", "object": "session0" }, { "name": "assertIndexExists", "object": "testRunner", "arguments": { "databaseName": "transaction-tests", "collectionName": "test", "indexName": "x_1" } } ], "expectEvents": [ { "client": "client0", "events": [ { "commandStartedEvent": { "command": { "drop": "test", "writeConcern": { "$$exists": false } }, "commandName": "drop", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "createIndexes": "test", "indexes": [ { "name": "x_1", "key": { "x": 1 } } ], "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": true, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "createIndexes", "databaseName": "transaction-tests" } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session0" }, "txnNumber": 1, "startTransaction": { "$$exists": false }, "autocommit": false, "writeConcern": { "$$exists": false } }, "commandName": "commitTransaction", "databaseName": "admin" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/000077500000000000000000000000001511661753600235225ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/README000066400000000000000000000001501511661753600243760ustar00rootroot00000000000000Driver URI options tests from: https://github.com/mongodb/specifications/tree/master/source/uri-options mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/auth-options.json000066400000000000000000000020001511661753600270370ustar00rootroot00000000000000{ "tests": [ { "description": "Valid auth options are parsed correctly (GSSAPI)", "uri": "mongodb://foo:bar@example.com/?authMechanism=GSSAPI&authMechanismProperties=SERVICE_NAME:other,CANONICALIZE_HOST_NAME:forward,SERVICE_HOST:example.com&authSource=$external", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "authMechanism": "GSSAPI", "authMechanismProperties": { "SERVICE_NAME": "other", "SERVICE_HOST": "example.com", "CANONICALIZE_HOST_NAME": "forward" }, "authSource": "$external" } }, { "description": "Valid auth options are parsed correctly (SCRAM-SHA-1)", "uri": "mongodb://foo:bar@example.com/?authMechanism=SCRAM-SHA-1&authSource=authSourceDB", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "authMechanism": "SCRAM-SHA-1", "authSource": "authSourceDB" } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/compression-options.json000066400000000000000000000027721511661753600304570ustar00rootroot00000000000000{ "tests": [ { "description": "Valid compression options are parsed correctly", "uri": "mongodb://example.com/?compressors=zlib&zlibCompressionLevel=9", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "compressors": [ "zlib" ], "zlibCompressionLevel": 9 } }, { "description": "Multiple compressors are parsed correctly", "uri": "mongodb://example.com/?compressors=snappy,zlib", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "compressors": [ "snappy", "zlib" ] } }, { "description": "Non-numeric zlibCompressionLevel causes a warning", "uri": "mongodb://example.com/?compressors=zlib&zlibCompressionLevel=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low zlibCompressionLevel causes a warning", "uri": "mongodb://example.com/?compressors=zlib&zlibCompressionLevel=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too high zlibCompressionLevel causes a warning", "uri": "mongodb://example.com/?compressors=zlib&zlibCompressionLevel=10", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/concern-options.json000066400000000000000000000033551511661753600275430ustar00rootroot00000000000000{ "tests": [ { "description": "Valid read and write concern are parsed correctly", "uri": "mongodb://example.com/?readConcernLevel=majority&w=5&wTimeoutMS=30000&journal=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "readConcernLevel": "majority", "w": 5, "wTimeoutMS": 30000, "journal": false } }, { "description": "Arbitrary string readConcernLevel does not cause a warning", "uri": "mongodb://example.com/?readConcernLevel=arbitraryButStillValid", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "readConcernLevel": "arbitraryButStillValid" } }, { "description": "Arbitrary string w doesn't cause a warning", "uri": "mongodb://example.com/?w=arbitraryButStillValid", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "w": "arbitraryButStillValid" } }, { "description": "Non-numeric wTimeoutMS causes a warning", "uri": "mongodb://example.com/?wTimeoutMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low wTimeoutMS causes a warning", "uri": "mongodb://example.com/?wTimeoutMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Invalid journal causes a warning", "uri": "mongodb://example.com/?journal=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/connection-options.json000066400000000000000000000166311511661753600302540ustar00rootroot00000000000000{ "tests": [ { "description": "Valid connection and timeout options are parsed correctly", "uri": "mongodb://example.com/?appname=URI-OPTIONS-SPEC-TEST&connectTimeoutMS=20000&heartbeatFrequencyMS=5000&localThresholdMS=3000&maxIdleTimeMS=50000&replicaSet=uri-options-spec&retryWrites=true&serverSelectionTimeoutMS=15000&socketTimeoutMS=7500&timeoutMS=100", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "appname": "URI-OPTIONS-SPEC-TEST", "connectTimeoutMS": 20000, "heartbeatFrequencyMS": 5000, "localThresholdMS": 3000, "maxIdleTimeMS": 50000, "replicaSet": "uri-options-spec", "retryWrites": true, "serverSelectionTimeoutMS": 15000, "socketTimeoutMS": 7500, "timeoutMS": 100 } }, { "description": "Non-numeric connectTimeoutMS causes a warning", "uri": "mongodb://example.com/?connectTimeoutMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low connectTimeoutMS causes a warning", "uri": "mongodb://example.com/?connectTimeoutMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-numeric heartbeatFrequencyMS causes a warning", "uri": "mongodb://example.com/?heartbeatFrequencyMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low heartbeatFrequencyMS causes a warning", "uri": "mongodb://example.com/?heartbeatFrequencyMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-numeric localThresholdMS causes a warning", "uri": "mongodb://example.com/?localThresholdMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low localThresholdMS causes a warning", "uri": "mongodb://example.com/?localThresholdMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Invalid retryWrites causes a warning", "uri": "mongodb://example.com/?retryWrites=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-numeric serverSelectionTimeoutMS causes a warning", "uri": "mongodb://example.com/?serverSelectionTimeoutMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low serverSelectionTimeoutMS causes a warning", "uri": "mongodb://example.com/?serverSelectionTimeoutMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-numeric socketTimeoutMS causes a warning", "uri": "mongodb://example.com/?socketTimeoutMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low socketTimeoutMS causes a warning", "uri": "mongodb://example.com/?socketTimeoutMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "directConnection=true", "uri": "mongodb://example.com/?directConnection=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "directConnection": true } }, { "description": "directConnection=true with multiple seeds", "uri": "mongodb://example1.com,example2.com/?directConnection=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "directConnection=false", "uri": "mongodb://example.com/?directConnection=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "directConnection": false } }, { "description": "directConnection=false with multiple seeds", "uri": "mongodb://example1.com,example2.com/?directConnection=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "directConnection": false } }, { "description": "Invalid directConnection value", "uri": "mongodb://example.com/?directConnection=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "loadBalanced=true", "uri": "mongodb://example.com/?loadBalanced=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "loadBalanced": true } }, { "description": "loadBalanced=true with directConnection=false", "uri": "mongodb://example.com/?loadBalanced=true&directConnection=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "loadBalanced": true, "directConnection": false } }, { "description": "loadBalanced=false", "uri": "mongodb://example.com/?loadBalanced=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "loadBalanced": false } }, { "description": "Invalid loadBalanced value", "uri": "mongodb://example.com/?loadBalanced=1", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "loadBalanced=true with multiple hosts causes an error", "uri": "mongodb://example1,example2/?loadBalanced=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "loadBalanced=true with directConnection=true causes an error", "uri": "mongodb://example.com/?loadBalanced=true&directConnection=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "loadBalanced=true with replicaSet causes an error", "uri": "mongodb://example.com/?loadBalanced=true&replicaSet=replset", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "timeoutMS=0", "uri": "mongodb://example.com/?timeoutMS=0", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "timeoutMS": 0 } }, { "description": "Non-numeric timeoutMS causes a warning", "uri": "mongodb://example.com/?timeoutMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low timeoutMS causes a warning", "uri": "mongodb://example.com/?timeoutMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/connection-pool-options.json000066400000000000000000000035551511661753600312240ustar00rootroot00000000000000{ "tests": [ { "description": "Valid connection pool options are parsed correctly", "uri": "mongodb://example.com/?maxIdleTimeMS=50000&maxPoolSize=5&minPoolSize=3&maxConnecting=1", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "maxIdleTimeMS": 50000, "maxPoolSize": 5, "minPoolSize": 3, "maxConnecting": 1 } }, { "description": "Non-numeric maxIdleTimeMS causes a warning", "uri": "mongodb://example.com/?maxIdleTimeMS=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low maxIdleTimeMS causes a warning", "uri": "mongodb://example.com/?maxIdleTimeMS=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "maxPoolSize=0 does not error", "uri": "mongodb://example.com/?maxPoolSize=0", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "maxPoolSize": 0 } }, { "description": "minPoolSize=0 does not error", "uri": "mongodb://example.com/?minPoolSize=0", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "minPoolSize": 0 } }, { "description": "maxConnecting=0 causes a warning", "uri": "mongodb://example.com/?maxConnecting=0", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "maxConnecting<0 causes a warning", "uri": "mongodb://example.com/?maxConnecting=-1", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/proxy-options.json000066400000000000000000000074211511661753600272730ustar00rootroot00000000000000{ "tests": [ { "description": "proxyPort without proxyHost", "uri": "mongodb://localhost/?proxyPort=1080", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "proxyUsername without proxyHost", "uri": "mongodb://localhost/?proxyUsername=abc", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "proxyPassword without proxyHost", "uri": "mongodb://localhost/?proxyPassword=def", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "all other proxy options without proxyHost", "uri": "mongodb://localhost/?proxyPort=1080&proxyUsername=abc&proxyPassword=def", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "proxyUsername without proxyPassword", "uri": "mongodb://localhost/?proxyHost=localhost&proxyUsername=abc", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "proxyPassword without proxyUsername", "uri": "mongodb://localhost/?proxyHost=localhost&proxyPassword=def", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "multiple proxyHost parameters", "uri": "mongodb://localhost/?proxyHost=localhost&proxyHost=localhost2", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "multiple proxyPort parameters", "uri": "mongodb://localhost/?proxyHost=localhost&proxyPort=1234&proxyPort=12345", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "multiple proxyUsername parameters", "uri": "mongodb://localhost/?proxyHost=localhost&proxyUsername=abc&proxyUsername=def&proxyPassword=123", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "multiple proxyPassword parameters", "uri": "mongodb://localhost/?proxyHost=localhost&proxyUsername=abc&proxyPassword=123&proxyPassword=456", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "only host present", "uri": "mongodb://localhost/?proxyHost=localhost", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "host and default port present", "uri": "mongodb://localhost/?proxyHost=localhost&proxyPort=1080", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "host and non-default port present", "uri": "mongodb://localhost/?proxyHost=localhost&proxyPort=12345", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "replicaset, host and non-default port present", "uri": "mongodb://rs1,rs2,rs3/?proxyHost=localhost&proxyPort=12345", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "all options present", "uri": "mongodb://rs1,rs2,rs3/?proxyHost=localhost&proxyPort=12345&proxyUsername=asdf&proxyPassword=qwerty", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/read-preference-options.json000066400000000000000000000041271511661753600311410ustar00rootroot00000000000000{ "tests": [ { "description": "Valid read preference options are parsed correctly", "uri": "mongodb://example.com/?readPreference=primaryPreferred&readPreferenceTags=dc:ny,rack:1&maxStalenessSeconds=120&readPreferenceTags=dc:ny", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "readPreference": "primaryPreferred", "readPreferenceTags": [ { "dc": "ny", "rack": "1" }, { "dc": "ny" } ], "maxStalenessSeconds": 120 } }, { "description": "Single readPreferenceTags is parsed as array of size one", "uri": "mongodb://example.com/?readPreference=secondary&readPreferenceTags=dc:ny", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "readPreferenceTags": [ { "dc": "ny" } ] } }, { "description": "Read preference tags are case sensitive", "uri": "mongodb://example.com/?readPreference=secondary&readPreferenceTags=dc:NY", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "readPreferenceTags": [ { "dc": "NY" } ] } }, { "description": "Invalid readPreferenceTags causes a warning", "uri": "mongodb://example.com/?readPreferenceTags=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-numeric maxStalenessSeconds causes a warning", "uri": "mongodb://example.com/?maxStalenessSeconds=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Too low maxStalenessSeconds causes a warning", "uri": "mongodb://example.com/?maxStalenessSeconds=-2", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/sdam-options.json000066400000000000000000000021231511661753600270300ustar00rootroot00000000000000{ "tests": [ { "description": "serverMonitoringMode=auto", "uri": "mongodb://example.com/?serverMonitoringMode=auto", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "serverMonitoringMode": "auto" } }, { "description": "serverMonitoringMode=stream", "uri": "mongodb://example.com/?serverMonitoringMode=stream", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "serverMonitoringMode": "stream" } }, { "description": "serverMonitoringMode=poll", "uri": "mongodb://example.com/?serverMonitoringMode=poll", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "serverMonitoringMode": "poll" } }, { "description": "invalid serverMonitoringMode", "uri": "mongodb://example.com/?serverMonitoringMode=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/single-threaded-options.json000066400000000000000000000011431511661753600311440ustar00rootroot00000000000000{ "tests": [ { "description": "Valid options specific to single-threaded drivers are parsed correctly", "uri": "mongodb://example.com/?serverSelectionTryOnce=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "serverSelectionTryOnce": false } }, { "description": "Invalid serverSelectionTryOnce causes a warning", "uri": "mongodb://example.com/?serverSelectionTryOnce=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/srv-options.json000066400000000000000000000061761511661753600267320ustar00rootroot00000000000000{ "tests": [ { "description": "SRV URI with custom srvServiceName", "uri": "mongodb+srv://test22.test.build.10gen.cc/?srvServiceName=customname", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "srvServiceName": "customname" } }, { "description": "Non-SRV URI with custom srvServiceName", "uri": "mongodb://example.com/?srvServiceName=customname", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "SRV URI with srvMaxHosts", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "srvMaxHosts": 2 } }, { "description": "SRV URI with negative integer for srvMaxHosts", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=-1", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "SRV URI with invalid type for srvMaxHosts", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=foo", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "Non-SRV URI with srvMaxHosts", "uri": "mongodb://example.com/?srvMaxHosts=2", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "SRV URI with positive srvMaxHosts and replicaSet", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2&replicaSet=foo", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "SRV URI with positive srvMaxHosts and loadBalanced=true", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2&loadBalanced=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "SRV URI with positive srvMaxHosts and loadBalanced=false", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=2&loadBalanced=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "loadBalanced": false, "srvMaxHosts": 2 } }, { "description": "SRV URI with srvMaxHosts=0 and replicaSet", "uri": "mongodb+srv://test1.test.build.10gen.cc/?srvMaxHosts=0&replicaSet=foo", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "replicaSet": "foo", "srvMaxHosts": 0 } }, { "description": "SRV URI with srvMaxHosts=0 and loadBalanced=true", "uri": "mongodb+srv://test3.test.build.10gen.cc/?srvMaxHosts=0&loadBalanced=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "loadBalanced": true, "srvMaxHosts": 0 } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/uri-options/tls-options.json000066400000000000000000000530251511661753600267150ustar00rootroot00000000000000{ "tests": [ { "description": "Valid required tls options are parsed correctly", "uri": "mongodb://example.com/?tls=true&tlsCAFile=ca.pem&tlsCertificateKeyFile=cert.pem", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tls": true, "tlsCAFile": "ca.pem", "tlsCertificateKeyFile": "cert.pem" } }, { "description": "Valid tlsCertificateKeyFilePassword is parsed correctly", "uri": "mongodb://example.com/?tlsCertificateKeyFilePassword=hunter2", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tlsCertificateKeyFilePassword": "hunter2" } }, { "description": "Invalid tlsAllowInvalidCertificates causes a warning", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates is parsed correctly", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tlsAllowInvalidCertificates": true } }, { "description": "tlsAllowInvalidHostnames is parsed correctly", "uri": "mongodb://example.com/?tlsAllowInvalidHostnames=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tlsAllowInvalidHostnames": true } }, { "description": "Invalid tlsAllowInvalidHostnames causes a warning", "uri": "mongodb://example.com/?tlsAllowInvalidHostnames=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure is parsed correctly", "uri": "mongodb://example.com/?tlsInsecure=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tlsInsecure": true } }, { "description": "Invalid tlsInsecure causes a warning", "uri": "mongodb://example.com/?tlsInsecure=invalid", "valid": true, "warning": true, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsAllowInvalidCertificates both present (and true) raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsAllowInvalidCertificates=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsAllowInvalidCertificates both present (and false) raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsAllowInvalidCertificates=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates and tlsInsecure both present (and true) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates and tlsInsecure both present (and false) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=false&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsAllowInvalidHostnames both present (and true) raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsAllowInvalidHostnames=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsAllowInvalidHostnames both present (and false) raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsAllowInvalidHostnames=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidHostnames and tlsInsecure both present (and true) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidHostnames=true&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidHostnames and tlsInsecure both present (and false) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidHostnames=false&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tls=true and ssl=true doesn't warn", "uri": "mongodb://example.com/?tls=true&ssl=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "tls=false and ssl=false doesn't warn", "uri": "mongodb://example.com/?tls=false&ssl=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "ssl=true and tls=true doesn't warn", "uri": "mongodb://example.com/?ssl=true&tls=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "ssl=false and tls=false doesn't warn", "uri": "mongodb://example.com/?ssl=false&tls=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": {} }, { "description": "tls=false and ssl=true raises error", "uri": "mongodb://example.com/?tls=false&ssl=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tls=true and ssl=false raises error", "uri": "mongodb://example.com/?tls=true&ssl=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "ssl=false and tls=true raises error", "uri": "mongodb://example.com/?ssl=false&tls=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "ssl=true and tls=false raises error", "uri": "mongodb://example.com/?ssl=true&tls=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck can be set to true", "uri": "mongodb://example.com/?tls=true&tlsDisableCertificateRevocationCheck=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tls": true, "tlsDisableCertificateRevocationCheck": true } }, { "description": "tlsDisableCertificateRevocationCheck can be set to false", "uri": "mongodb://example.com/?tls=true&tlsDisableCertificateRevocationCheck=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tls": true, "tlsDisableCertificateRevocationCheck": false } }, { "description": "tlsAllowInvalidCertificates and tlsDisableCertificateRevocationCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates=true and tlsDisableCertificateRevocationCheck=false raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates=false and tlsDisableCertificateRevocationCheck=true raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=false&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates and tlsDisableCertificateRevocationCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=false&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsAllowInvalidCertificates both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsAllowInvalidCertificates=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=true and tlsAllowInvalidCertificates=false raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsAllowInvalidCertificates=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=false and tlsAllowInvalidCertificates=true raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsAllowInvalidCertificates=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsAllowInvalidCertificates both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsAllowInvalidCertificates=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsDisableCertificateRevocationCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure=true and tlsDisableCertificateRevocationCheck=false raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure=false and tlsDisableCertificateRevocationCheck=true raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsDisableCertificateRevocationCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsInsecure both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=true and tlsInsecure=false raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=false and tlsInsecure=true raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsInsecure both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsDisableOCSPEndpointCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=true and tlsDisableOCSPEndpointCheck=false raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=true&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck=false and tlsDisableOCSPEndpointCheck=true raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableCertificateRevocationCheck and tlsDisableOCSPEndpointCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableCertificateRevocationCheck=false&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsDisableCertificateRevocationCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=true and tlsDisableCertificateRevocationCheck=false raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=false and tlsDisableCertificateRevocationCheck=true raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsDisableCertificateRevocationCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsDisableCertificateRevocationCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsDisableCertificateRevocationCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck can be set to true", "uri": "mongodb://example.com/?tls=true&tlsDisableOCSPEndpointCheck=true", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tls": true, "tlsDisableOCSPEndpointCheck": true } }, { "description": "tlsDisableOCSPEndpointCheck can be set to false", "uri": "mongodb://example.com/?tls=true&tlsDisableOCSPEndpointCheck=false", "valid": true, "warning": false, "hosts": null, "auth": null, "options": { "tls": true, "tlsDisableOCSPEndpointCheck": false } }, { "description": "tlsInsecure and tlsDisableOCSPEndpointCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure=true and tlsDisableOCSPEndpointCheck=false raises an error", "uri": "mongodb://example.com/?tlsInsecure=true&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure=false and tlsDisableOCSPEndpointCheck=true raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsInsecure and tlsDisableOCSPEndpointCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsInsecure=false&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsInsecure both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=true and tlsInsecure=false raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=false and tlsInsecure=true raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsInsecure=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsInsecure both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsInsecure=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates and tlsDisableOCSPEndpointCheck both present (and true) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates=true and tlsDisableOCSPEndpointCheck=false raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=true&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates=false and tlsDisableOCSPEndpointCheck=true raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=false&tlsDisableOCSPEndpointCheck=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsAllowInvalidCertificates and tlsDisableOCSPEndpointCheck both present (and false) raises an error", "uri": "mongodb://example.com/?tlsAllowInvalidCertificates=false&tlsDisableOCSPEndpointCheck=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsAllowInvalidCertificates both present (and true) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsAllowInvalidCertificates=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=true and tlsAllowInvalidCertificates=false raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=true&tlsAllowInvalidCertificates=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck=false and tlsAllowInvalidCertificates=true raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsAllowInvalidCertificates=true", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null }, { "description": "tlsDisableOCSPEndpointCheck and tlsAllowInvalidCertificates both present (and false) raises an error", "uri": "mongodb://example.com/?tlsDisableOCSPEndpointCheck=false&tlsAllowInvalidCertificates=false", "valid": false, "warning": false, "hosts": null, "auth": null, "options": null } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/000077500000000000000000000000001511661753600240615ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/crud-api-version-1-strict.json000066400000000000000000000643071511661753600316210ustar00rootroot00000000000000{ "description": "CRUD Api Version 1 (strict)", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ], "serverApi": { "version": "1", "strict": true } } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } }, { "database": { "id": "adminDatabase", "client": "client", "databaseName": "admin" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "_yamlAnchors": { "versions": [ { "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } ] }, "initialData": [ { "collectionName": "test", "databaseName": "versioned-api-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "aggregate on collection appends declared API version", "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "aggregate on database appends declared API version", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "aggregate", "object": "adminDatabase", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ] }, "expectError": { "errorCodeName": "APIStrictError" } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "bulkWrite appends declared API version", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 6, "x": 66 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "deleteMany": { "filter": { "x": { "$nin": [ 24, 34 ] } } } }, { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "filter": { "_id": 7 } } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "ordered": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 2 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "x": { "$nin": [ 24, 34 ] } }, "limit": 0 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 7 }, "limit": 1 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "_id": 4, "x": 44 }, "multi": { "$$unsetOrMatches": false }, "upsert": true } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "countDocuments appends declared API version", "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "x": { "$gt": 11 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "x": { "$gt": 11 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "deleteMany appends declared API version", "operations": [ { "name": "deleteMany", "object": "collection", "arguments": { "filter": { "x": { "$nin": [ 24, 34 ] } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "x": { "$nin": [ 24, 34 ] } }, "limit": 0 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "deleteOne appends declared API version", "operations": [ { "name": "deleteOne", "object": "collection", "arguments": { "filter": { "_id": 7 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 7 }, "limit": 1 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "distinct appends declared API version", "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": {} }, "expectError": { "isError": true, "errorContains": "command distinct is not in API Version 1", "errorCodeName": "APIStrictError" } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "distinct": "test", "key": "x", "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "estimatedDocumentCount appends declared API version", "runOnRequirements": [ { "minServerVersion": "5.0.9", "maxServerVersion": "5.0.99" }, { "minServerVersion": "5.3.2" } ], "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "arguments": {} } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "count": "test", "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "find and getMore append API version", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "batchSize": 3 }, "expectResult": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "findOneAndDelete appends declared API version", "operations": [ { "name": "findOneAndDelete", "object": "collection", "arguments": { "filter": { "_id": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "remove": true, "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "findOneAndReplace appends declared API version", "operations": [ { "name": "findOneAndReplace", "object": "collection", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "x": 33 }, "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "findOneAndUpdate appends declared API version", "operations": [ { "name": "findOneAndUpdate", "object": "collection", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "insertMany appends declared API version", "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "insertOne appends declared API version", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 6, "x": 66 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "replaceOne appends declared API version", "operations": [ { "name": "replaceOne", "object": "collection", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "_id": 4, "x": 44 }, "multi": { "$$unsetOrMatches": false }, "upsert": true } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "updateMany appends declared API version", "operations": [ { "name": "updateMany", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "updateOne appends declared API version", "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 2 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/crud-api-version-1.json000066400000000000000000000677571511661753600303270ustar00rootroot00000000000000{ "description": "CRUD Api Version 1", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.9" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ], "serverApi": { "version": "1", "deprecationErrors": true } } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } }, { "database": { "id": "adminDatabase", "client": "client", "databaseName": "admin" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } } ], "_yamlAnchors": { "versions": [ { "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } ], "namespace": "versioned-api-tests.test" }, "initialData": [ { "collectionName": "test", "databaseName": "versioned-api-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "aggregate on collection appends declared API version", "operations": [ { "name": "aggregate", "object": "collection", "arguments": { "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$sort": { "x": 1 } }, { "$match": { "_id": { "$gt": 1 } } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "aggregate on database appends declared API version", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "aggregate", "object": "adminDatabase", "arguments": { "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": 1, "pipeline": [ { "$listLocalSessions": {} }, { "$limit": 1 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "bulkWrite appends declared API version", "operations": [ { "name": "bulkWrite", "object": "collection", "arguments": { "requests": [ { "insertOne": { "document": { "_id": 6, "x": 66 } } }, { "updateOne": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } }, { "deleteMany": { "filter": { "x": { "$nin": [ 24, 34 ] } } } }, { "updateMany": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } }, { "deleteOne": { "filter": { "_id": 7 } } }, { "replaceOne": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "ordered": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 2 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "x": { "$nin": [ 24, 34 ] } }, "limit": 0 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 7 }, "limit": 1 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "_id": 4, "x": 44 }, "multi": { "$$unsetOrMatches": false }, "upsert": true } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "client bulkWrite appends declared API version", "runOnRequirements": [ { "minServerVersion": "8.0" } ], "operations": [ { "name": "clientBulkWrite", "object": "client", "arguments": { "models": [ { "insertOne": { "namespace": "versioned-api-tests.test", "document": { "_id": 6, "x": 6 } } } ], "verboseResults": true }, "expectResult": { "insertedCount": 1, "upsertedCount": 0, "matchedCount": 0, "modifiedCount": 0, "deletedCount": 0, "insertResults": { "0": { "insertedId": 6 } }, "updateResults": {}, "deleteResults": {} } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "commandName": "bulkWrite", "databaseName": "admin", "command": { "bulkWrite": 1, "errorsOnly": false, "ordered": true, "ops": [ { "insert": 0, "document": { "_id": 6, "x": 6 } } ], "nsInfo": [ { "ns": "versioned-api-tests.test" } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "countDocuments appends declared API version", "operations": [ { "name": "countDocuments", "object": "collection", "arguments": { "filter": { "x": { "$gt": 11 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "aggregate": "test", "pipeline": [ { "$match": { "x": { "$gt": 11 } } }, { "$group": { "_id": 1, "n": { "$sum": 1 } } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "deleteMany appends declared API version", "operations": [ { "name": "deleteMany", "object": "collection", "arguments": { "filter": { "x": { "$nin": [ 24, 34 ] } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "x": { "$nin": [ 24, 34 ] } }, "limit": 0 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "deleteOne appends declared API version", "operations": [ { "name": "deleteOne", "object": "collection", "arguments": { "filter": { "_id": 7 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "delete": "test", "deletes": [ { "q": { "_id": 7 }, "limit": 1 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "distinct appends declared API version", "operations": [ { "name": "distinct", "object": "collection", "arguments": { "fieldName": "x", "filter": {} } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "distinct": "test", "key": "x", "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "estimatedDocumentCount appends declared API version", "runOnRequirements": [ { "minServerVersion": "5.0.9", "maxServerVersion": "5.0.99" }, { "minServerVersion": "5.3.2" } ], "operations": [ { "name": "estimatedDocumentCount", "object": "collection", "arguments": {} } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "count": "test", "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "find and getMore append API version", "operations": [ { "name": "find", "object": "collection", "arguments": { "filter": {}, "sort": { "_id": 1 }, "batchSize": 3 }, "expectResult": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "find": "test", "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } }, { "commandStartedEvent": { "command": { "getMore": { "$$type": [ "int", "long" ] }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "findOneAndDelete appends declared API version", "operations": [ { "name": "findOneAndDelete", "object": "collection", "arguments": { "filter": { "_id": 1 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "remove": true, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "findOneAndReplace appends declared API version", "operations": [ { "name": "findOneAndReplace", "object": "collection", "arguments": { "filter": { "_id": 1 }, "replacement": { "x": 33 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "x": 33 }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "findOneAndUpdate appends declared API version", "operations": [ { "name": "findOneAndUpdate", "object": "collection", "arguments": { "filter": { "_id": 1 }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "findAndModify": "test", "query": { "_id": 1 }, "update": { "$inc": { "x": 1 } }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "insertMany appends declared API version", "operations": [ { "name": "insertMany", "object": "collection", "arguments": { "documents": [ { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ] } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 }, { "_id": 7, "x": 77 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "insertOne appends declared API version", "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "document": { "_id": 6, "x": 66 } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "replaceOne appends declared API version", "operations": [ { "name": "replaceOne", "object": "collection", "arguments": { "filter": { "_id": 4 }, "replacement": { "_id": 4, "x": 44 }, "upsert": true } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 4 }, "u": { "_id": 4, "x": 44 }, "multi": { "$$unsetOrMatches": false }, "upsert": true } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "updateMany appends declared API version", "operations": [ { "name": "updateMany", "object": "collection", "arguments": { "filter": { "_id": { "$gt": 1 } }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": { "$gt": 1 } }, "u": { "$inc": { "x": 1 } }, "multi": true, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] }, { "description": "updateOne appends declared API version", "operations": [ { "name": "updateOne", "object": "collection", "arguments": { "filter": { "_id": 2 }, "update": { "$inc": { "x": 1 } } } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "update": "test", "updates": [ { "q": { "_id": 2 }, "u": { "$inc": { "x": 1 } }, "multi": { "$$unsetOrMatches": false }, "upsert": { "$$unsetOrMatches": false } } ], "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": true } } } ] } ] } ] } runcommand-helper-no-api-version-declared.json000066400000000000000000000056631511661753600347340ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api{ "description": "RunCommand helper: No API version declared", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.9", "serverParameters": { "requireApiVersion": false } } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } } ], "tests": [ { "description": "runCommand does not inspect or change the command document", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1, "apiVersion": "server_will_never_support_this_api_version" } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1, "apiVersion": "server_will_never_support_this_api_version", "apiStrict": { "$$exists": false }, "apiDeprecationErrors": { "$$exists": false } }, "commandName": "ping", "databaseName": "versioned-api-tests" } } ] } ] }, { "description": "runCommand does not prevent sending invalid API version declarations", "runOnRequirements": [ { "serverless": "forbid" } ], "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "ping", "command": { "ping": 1, "apiStrict": true } }, "expectError": { "isError": true, "isClientError": false } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "ping": 1, "apiVersion": { "$$exists": false }, "apiStrict": true, "apiDeprecationErrors": { "$$exists": false } }, "commandName": "ping", "databaseName": "versioned-api-tests" } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/test-commands-deprecation-errors.json000066400000000000000000000033571511661753600333470ustar00rootroot00000000000000{ "description": "Test commands: deprecation errors", "schemaVersion": "1.1", "runOnRequirements": [ { "minServerVersion": "4.9", "serverParameters": { "enableTestCommands": true, "acceptApiVersion2": true, "requireApiVersion": false } } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ] } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } } ], "tests": [ { "description": "Running a command that is deprecated raises a deprecation error", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "testDeprecationInVersion2", "command": { "testDeprecationInVersion2": 1, "apiVersion": "2", "apiDeprecationErrors": true } }, "expectError": { "isError": true, "errorContains": "command testDeprecationInVersion2 is deprecated in API Version 2", "errorCodeName": "APIDeprecationError" } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "testDeprecationInVersion2": 1, "apiVersion": "2", "apiStrict": { "$$exists": false }, "apiDeprecationErrors": true } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/test-commands-strict-mode.json000066400000000000000000000032331511661753600317630ustar00rootroot00000000000000{ "description": "Test commands: strict mode", "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.9", "serverParameters": { "enableTestCommands": true }, "serverless": "forbid" } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ], "serverApi": { "version": "1", "strict": true } } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } } ], "tests": [ { "description": "Running a command that is not part of the versioned API results in an error", "operations": [ { "name": "runCommand", "object": "database", "arguments": { "commandName": "testVersion2", "command": { "testVersion2": 1 } }, "expectError": { "isError": true, "errorContains": "command testVersion2 is not in API Version 1", "errorCodeName": "APIStrictError" } } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "testVersion2": 1, "apiVersion": "1", "apiStrict": true, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/versioned_api/transaction-handling.json000066400000000000000000000177621511661753600311000ustar00rootroot00000000000000{ "description": "Transaction handling", "schemaVersion": "1.3", "runOnRequirements": [ { "minServerVersion": "4.9", "topologies": [ "replicaset", "sharded-replicaset", "load-balanced" ] } ], "createEntities": [ { "client": { "id": "client", "observeEvents": [ "commandStartedEvent" ], "serverApi": { "version": "1" } } }, { "database": { "id": "database", "client": "client", "databaseName": "versioned-api-tests" } }, { "collection": { "id": "collection", "database": "database", "collectionName": "test" } }, { "session": { "id": "session", "client": "client" } } ], "_yamlAnchors": { "versions": [ { "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } ] }, "initialData": [ { "collectionName": "test", "databaseName": "versioned-api-tests", "documents": [ { "_id": 1, "x": 11 }, { "_id": 2, "x": 22 }, { "_id": 3, "x": 33 }, { "_id": 4, "x": 44 }, { "_id": 5, "x": 55 } ] } ], "tests": [ { "description": "All commands in a transaction declare an API version", "runOnRequirements": [ { "topologies": [ "replicaset", "sharded-replicaset", "load-balanced" ] } ], "operations": [ { "name": "startTransaction", "object": "session" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session", "document": { "_id": 6, "x": 66 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 6 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session", "document": { "_id": 7, "x": 77 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 7 } } } }, { "name": "commitTransaction", "object": "session" } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "lsid": { "$$sessionLsid": "session" }, "startTransaction": true, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 7, "x": 77 } ], "lsid": { "$$sessionLsid": "session" }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "commitTransaction": 1, "lsid": { "$$sessionLsid": "session" }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] }, { "description": "abortTransaction includes an API version", "runOnRequirements": [ { "topologies": [ "replicaset", "sharded-replicaset", "load-balanced" ] } ], "operations": [ { "name": "startTransaction", "object": "session" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session", "document": { "_id": 6, "x": 66 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 6 } } } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session", "document": { "_id": 7, "x": 77 } }, "expectResult": { "$$unsetOrMatches": { "insertedId": { "$$unsetOrMatches": 7 } } } }, { "name": "abortTransaction", "object": "session" } ], "expectEvents": [ { "client": "client", "events": [ { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 6, "x": 66 } ], "lsid": { "$$sessionLsid": "session" }, "startTransaction": true, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "insert": "test", "documents": [ { "_id": 7, "x": 77 } ], "lsid": { "$$sessionLsid": "session" }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } }, { "commandStartedEvent": { "command": { "abortTransaction": 1, "lsid": { "$$sessionLsid": "session" }, "apiVersion": "1", "apiStrict": { "$$unsetOrMatches": false }, "apiDeprecationErrors": { "$$unsetOrMatches": false } } } } ] } ] } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/000077500000000000000000000000001511661753600246125ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/callback-aborts.json000066400000000000000000000140101511661753600305250ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "withTransaction succeeds if callback aborts", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } }, { "description": "withTransaction succeeds if callback aborts with no ops", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "abortTransaction", "object": "session0" } ] } } } ], "expectations": [], "outcome": { "collection": { "data": [] } } }, { "description": "withTransaction still succeeds if callback aborts and runs extra op", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "abortTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "autocommit": null, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/callback-commits.json000066400000000000000000000172141511661753600307170ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "withTransaction succeeds if callback commits", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "commitTransaction", "object": "session0" } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "withTransaction still succeeds if callback commits and runs extra op", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 3 } }, "result": { "insertedId": 3 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 3 } ], "ordered": true, "lsid": "session0", "autocommit": null, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 }, { "_id": 3 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/callback-retry.json000066400000000000000000000200421511661753600304020ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "callback succeeds after multiple connection errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "insert" ], "closeConnection": true } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "callback is not retried after non-transient error (DuplicateKeyError)", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ] } }, "result": { "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ], "errorContains": "E11000" } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "abortTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "abortTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/commit-retry-errorLabels.json000066400000000000000000000073511511661753600324200ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.3.1", "topology": [ "replicaset", "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commit is retried after commitTransaction UnknownTransactionCommitResult (NotWritablePrimary)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 10107, "errorLabels": [ "RetryableWriteError" ], "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/commit-retry.json000066400000000000000000000235741511661753600301530ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction succeeds after multiple connection errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction retry only overwrites write concern w option", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "closeConnection": true } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] }, "options": { "writeConcern": { "w": 2, "j": true, "wtimeout": 5000 } } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 2, "j": true, "wtimeout": 5000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "j": true, "wtimeout": 5000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "j": true, "wtimeout": 5000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commit is not retried after MaxTimeMSExpired error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 50 } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] }, "options": { "maxCommitTimeMS": 60000 } }, "result": { "errorCodeName": "MaxTimeMSExpired", "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "maxTimeMS": 60000, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [] } } } ] } commit-transienttransactionerror-4.2.json000066400000000000000000000116551511661753600345540ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction{ "runOn": [ { "minServerVersion": "4.1.6", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "transaction is retried after commitTransaction TransientTransactionError (PreparedTransactionInProgress)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 267, "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/commit-transienttransactionerror.json000066400000000000000000000453101511661753600343250ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "transaction is retried after commitTransaction TransientTransactionError (LockTimeout)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 24, "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "transaction is retried after commitTransaction TransientTransactionError (WriteConflict)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 112, "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "transaction is retried after commitTransaction TransientTransactionError (SnapshotUnavailable)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 246, "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "transaction is retried after commitTransaction TransientTransactionError (NoSuchTransaction)", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "errorCode": 251, "closeConnection": false } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "3" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "3" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/commit-writeconcernerror.json000066400000000000000000000364111511661753600325540ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "commitTransaction is retried after WriteConcernFailed timeout error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 64, "codeName": "WriteConcernFailed", "errmsg": "waiting for replication timed out", "errInfo": { "wtimeout": true } } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction is retried after WriteConcernFailed non-timeout error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 2 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 64, "codeName": "WriteConcernFailed", "errmsg": "multiple errors reported" } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": "majority", "wtimeout": 10000 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction is not retried after UnknownReplWriteConcern error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 79, "codeName": "UnknownReplWriteConcern", "errmsg": "No write concern mode named 'foo' found in replica set configuration" } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } }, "result": { "errorCodeName": "UnknownReplWriteConcern", "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction is not retried after UnsatisfiableWriteConcern error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 100, "codeName": "UnsatisfiableWriteConcern", "errmsg": "Not enough data-bearing nodes" } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } }, "result": { "errorCodeName": "UnsatisfiableWriteConcern", "errorLabelsOmit": [ "TransientTransactionError", "UnknownTransactionCommitResult" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "commitTransaction is not retried after MaxTimeMSExpired error", "failPoint": { "configureFailPoint": "failCommand", "mode": { "times": 1 }, "data": { "failCommands": [ "commitTransaction" ], "writeConcernError": { "code": 50, "codeName": "MaxTimeMSExpired", "errmsg": "operation exceeded time limit" } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } }, "result": { "errorCodeName": "MaxTimeMSExpired", "errorLabelsContain": [ "UnknownTransactionCommitResult" ], "errorLabelsOmit": [ "TransientTransactionError" ] } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/commit.json000066400000000000000000000163171511661753600270050ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "withTransaction commits after callback returns", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } }, { "description": "withTransaction commits after callback returns (second transaction)", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } }, { "name": "commitTransaction", "object": "session0" }, { "name": "startTransaction", "object": "session0" }, { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 2 } }, "result": { "insertedId": 2 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } }, { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 2 } ], "ordered": true, "lsid": "session0", "readConcern": { "afterClusterTime": 42 }, "txnNumber": { "$numberLong": "2" }, "startTransaction": true, "autocommit": false, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "2" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 }, { "_id": 2 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/json/with_transaction/transaction-options.json000066400000000000000000000341501511661753600315260ustar00rootroot00000000000000{ "runOn": [ { "minServerVersion": "4.0", "topology": [ "replicaset" ] }, { "minServerVersion": "4.1.8", "topology": [ "sharded" ] } ], "database_name": "withTransaction-tests", "collection_name": "test", "data": [], "tests": [ { "description": "withTransaction and no transaction options set", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": null, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "readConcern": null, "startTransaction": null, "writeConcern": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "withTransaction inherits transaction options from client", "useMultipleMongoses": true, "clientOptions": { "readConcernLevel": "local", "w": 1 }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "local" }, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "withTransaction inherits transaction options from defaultTransactionOptions", "useMultipleMongoses": true, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "withTransaction explicit transaction options", "useMultipleMongoses": true, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] }, "options": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "withTransaction explicit transaction options override defaultTransactionOptions", "useMultipleMongoses": true, "sessionOptions": { "session0": { "defaultTransactionOptions": { "readConcern": { "level": "snapshot" }, "writeConcern": { "w": "majority" } } } }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] }, "options": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } }, { "description": "withTransaction explicit transaction options override client options", "useMultipleMongoses": true, "clientOptions": { "readConcernLevel": "local", "w": "majority" }, "operations": [ { "name": "withTransaction", "object": "session0", "arguments": { "callback": { "operations": [ { "name": "insertOne", "object": "collection", "arguments": { "session": "session0", "document": { "_id": 1 } }, "result": { "insertedId": 1 } } ] }, "options": { "readConcern": { "level": "majority" }, "writeConcern": { "w": 1 } } } } ], "expectations": [ { "command_started_event": { "command": { "insert": "test", "documents": [ { "_id": 1 } ], "ordered": true, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "startTransaction": true, "autocommit": false, "readConcern": { "level": "majority" }, "writeConcern": null }, "command_name": "insert", "database_name": "withTransaction-tests" } }, { "command_started_event": { "command": { "commitTransaction": 1, "lsid": "session0", "txnNumber": { "$numberLong": "1" }, "autocommit": false, "writeConcern": { "w": 1 }, "readConcern": null, "startTransaction": null }, "command_name": "commitTransaction", "database_name": "admin" } } ], "outcome": { "collection": { "data": [ { "_id": 1 } ] } } } ] } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/000077500000000000000000000000001511661753600226005ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future-functions.c000066400000000000000000002261761511661753600263020ustar00rootroot00000000000000/************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ /* * Define two sets of functions: background functions and future functions. * A background function like background_mongoc_cursor_next runs a driver * operation on a thread. * A future function like future_mongoc_cursor_next launches the background * operation and returns a future_t that will resolve when the operation * finishes. * * These are used with mock_server_t so you can run the driver on a thread while * controlling the server from the main thread. */ #include #include static BSON_THREAD_FUN (background_mongoc_async_run, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_void_type; mongoc_async_run ( future_value_get_mongoc_async_ptr (future_get_param (future, 0))); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_bulk_operation_execute, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_uint32_t_type; future_value_set_uint32_t ( &return_value, mongoc_bulk_operation_execute ( future_value_get_mongoc_bulk_operation_ptr (future_get_param (future, 0)), future_value_get_bson_ptr (future_get_param (future, 1)), future_value_get_bson_error_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_read_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_database_read_command_with_opts ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_read_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_database_read_write_command_with_opts ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_database_write_command_with_opts ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_command_simple, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_client_command_simple ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_client_command_with_opts ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_const_bson_ptr (future_get_param (future, 4)), future_value_get_bson_ptr (future_get_param (future, 5)), future_value_get_bson_error_ptr (future_get_param (future, 6)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_read_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_client_read_command_with_opts ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_const_bson_ptr (future_get_param (future, 4)), future_value_get_bson_ptr (future_get_param (future, 5)), future_value_get_bson_error_ptr (future_get_param (future, 6)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_client_write_command_with_opts ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_read_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_client_read_write_command_with_opts ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_const_bson_ptr (future_get_param (future, 4)), future_value_get_bson_ptr (future_get_param (future, 5)), future_value_get_bson_error_ptr (future_get_param (future, 6)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_watch, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_change_stream_ptr_type; future_value_set_mongoc_change_stream_ptr ( &return_value, mongoc_client_watch ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_aggregate, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_cursor_ptr_type; future_value_set_mongoc_cursor_ptr ( &return_value, mongoc_collection_aggregate ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_mongoc_query_flags_t (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_create_indexes_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_create_indexes_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_mongoc_index_model_t_ptr_const_ptr (future_get_param (future, 1)), future_value_get_size_t (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_drop_index_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_drop_index_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_error_ptr (future_get_param (future, 3)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_drop_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_drop_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_bson_error_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_find_and_modify_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_find_and_modify_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_find_and_modify_opts_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_find_and_modify, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_find_and_modify ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_const_bson_ptr (future_get_param (future, 4)), future_value_get_bool (future_get_param (future, 5)), future_value_get_bool (future_get_param (future, 6)), future_value_get_bool (future_get_param (future, 7)), future_value_get_bson_ptr (future_get_param (future, 8)), future_value_get_bson_error_ptr (future_get_param (future, 9)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_find_indexes_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_cursor_ptr_type; future_value_set_mongoc_cursor_ptr ( &return_value, mongoc_collection_find_indexes_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_insert_many, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_insert_many ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr_ptr (future_get_param (future, 1)), future_value_get_size_t (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_insert_one, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_insert_one ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_read_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_read_command_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_read_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_read_write_command_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_write_command_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_write_command_with_opts ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_cluster_run_command_parts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_cluster_run_command_parts ( future_value_get_mongoc_cluster_ptr (future_get_param (future, 0)), future_value_get_mongoc_server_stream_ptr (future_get_param (future, 1)), future_value_get_mongoc_cmd_parts_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_cursor_destroy, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_void_type; mongoc_cursor_destroy ( future_value_get_mongoc_cursor_ptr (future_get_param (future, 0))); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_cursor_next, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_cursor_next ( future_value_get_mongoc_cursor_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr_ptr (future_get_param (future, 1)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_get_database_names_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_char_ptr_ptr_type; future_value_set_char_ptr_ptr ( &return_value, mongoc_client_get_database_names_with_opts ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_bson_error_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_select_server, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_server_description_ptr_type; future_value_set_mongoc_server_description_ptr ( &return_value, mongoc_client_select_server ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_bool (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_bson_error_ptr (future_get_param (future, 3)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_destroy, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_void_type; mongoc_client_destroy ( future_value_get_mongoc_client_ptr (future_get_param (future, 0))); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_pool_destroy, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_void_type; mongoc_client_pool_destroy ( future_value_get_mongoc_client_pool_ptr (future_get_param (future, 0))); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_command_simple, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_database_command_simple ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_drop_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_database_drop_with_opts ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_bson_error_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_get_collection_names_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_char_ptr_ptr_type; future_value_set_char_ptr_ptr ( &return_value, mongoc_database_get_collection_names_with_opts ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_bson_error_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_database_watch, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_change_stream_ptr_type; future_value_set_mongoc_change_stream_ptr ( &return_value, mongoc_database_watch ( future_value_get_mongoc_database_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_gridfs_file_readv, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_ssize_t_type; future_value_set_ssize_t ( &return_value, mongoc_gridfs_file_readv ( future_value_get_mongoc_gridfs_file_ptr (future_get_param (future, 0)), future_value_get_mongoc_iovec_ptr (future_get_param (future, 1)), future_value_get_size_t (future_get_param (future, 2)), future_value_get_size_t (future_get_param (future, 3)), future_value_get_uint32_t (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_gridfs_file_remove, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_gridfs_file_remove ( future_value_get_mongoc_gridfs_file_ptr (future_get_param (future, 0)), future_value_get_bson_error_ptr (future_get_param (future, 1)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_gridfs_file_seek, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_int_type; future_value_set_int ( &return_value, mongoc_gridfs_file_seek ( future_value_get_mongoc_gridfs_file_ptr (future_get_param (future, 0)), future_value_get_int64_t (future_get_param (future, 1)), future_value_get_int (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_gridfs_file_writev, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_ssize_t_type; future_value_set_ssize_t ( &return_value, mongoc_gridfs_file_writev ( future_value_get_mongoc_gridfs_file_ptr (future_get_param (future, 0)), future_value_get_const_mongoc_iovec_ptr (future_get_param (future, 1)), future_value_get_size_t (future_get_param (future, 2)), future_value_get_uint32_t (future_get_param (future, 3)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_gridfs_find_one_with_opts, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_gridfs_file_ptr_type; future_value_set_mongoc_gridfs_file_ptr ( &return_value, mongoc_gridfs_find_one_with_opts ( future_value_get_mongoc_gridfs_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_error_ptr (future_get_param (future, 3)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_topology_select, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_server_description_ptr_type; future_value_set_mongoc_server_description_ptr ( &return_value, mongoc_topology_select ( future_value_get_mongoc_topology_ptr (future_get_param (future, 0)), future_value_get_mongoc_ss_optype_t (future_get_param (future, 1)), future_value_get_const_mongoc_ss_log_context_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_bool_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_client_get_gridfs, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_gridfs_ptr_type; future_value_set_mongoc_gridfs_ptr ( &return_value, mongoc_client_get_gridfs ( future_value_get_mongoc_client_ptr (future_get_param (future, 0)), future_value_get_const_char_ptr (future_get_param (future, 1)), future_value_get_const_char_ptr (future_get_param (future, 2)), future_value_get_bson_error_ptr (future_get_param (future, 3)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_watch, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_change_stream_ptr_type; future_value_set_mongoc_change_stream_ptr ( &return_value, mongoc_collection_watch ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_change_stream_next, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_change_stream_next ( future_value_get_mongoc_change_stream_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr_ptr (future_get_param (future, 1)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_change_stream_destroy, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_void_type; mongoc_change_stream_destroy ( future_value_get_mongoc_change_stream_ptr (future_get_param (future, 0))); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_delete_one, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_delete_one ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_delete_many, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_delete_many ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_remove, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_remove ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_mongoc_remove_flags_t (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_write_concern_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_update_one, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_update_one ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_update_many, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_update_many ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_replace_one, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_bool_type; future_value_set_bool ( &return_value, mongoc_collection_replace_one ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_bson_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_count_documents, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_int64_t_type; future_value_set_int64_t ( &return_value, mongoc_collection_count_documents ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_bson_ptr (future_get_param (future, 2)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 3)), future_value_get_bson_ptr (future_get_param (future, 4)), future_value_get_bson_error_ptr (future_get_param (future, 5)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_collection_estimated_document_count, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_int64_t_type; future_value_set_int64_t ( &return_value, mongoc_collection_estimated_document_count ( future_value_get_mongoc_collection_ptr (future_get_param (future, 0)), future_value_get_const_bson_ptr (future_get_param (future, 1)), future_value_get_const_mongoc_read_prefs_ptr (future_get_param (future, 2)), future_value_get_bson_ptr (future_get_param (future, 3)), future_value_get_bson_error_ptr (future_get_param (future, 4)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } static BSON_THREAD_FUN (background_mongoc_bulkwrite_execute, data) { future_t *future = (future_t *) data; future_value_t return_value; return_value.type = future_value_mongoc_bulkwritereturn_t_type; future_value_set_mongoc_bulkwritereturn_t ( &return_value, mongoc_bulkwrite_execute ( future_value_get_mongoc_bulkwrite_ptr (future_get_param (future, 0)), future_value_get_const_mongoc_bulkwriteopts_ptr (future_get_param (future, 1)) )); future_resolve (future, return_value); BSON_THREAD_RETURN; } future_t * future_async_run ( mongoc_async_ptr async) { future_t *future = future_new (future_value_void_type, 1); future_value_set_mongoc_async_ptr ( future_get_param (future, 0), async); future_start (future, background_mongoc_async_run); return future; } future_t * future_bulk_operation_execute ( mongoc_bulk_operation_ptr bulk, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_uint32_t_type, 3); future_value_set_mongoc_bulk_operation_ptr ( future_get_param (future, 0), bulk); future_value_set_bson_ptr ( future_get_param (future, 1), reply); future_value_set_bson_error_ptr ( future_get_param (future, 2), error); future_start (future, background_mongoc_bulk_operation_execute); return future; } future_t * future_database_read_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_database_read_command_with_opts); return future; } future_t * future_database_read_write_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_database_read_write_command_with_opts); return future; } future_t * future_database_write_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_database_write_command_with_opts); return future; } future_t * future_client_command_simple ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_client_command_simple); return future; } future_t * future_client_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 7); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 4), opts); future_value_set_bson_ptr ( future_get_param (future, 5), reply); future_value_set_bson_error_ptr ( future_get_param (future, 6), error); future_start (future, background_mongoc_client_command_with_opts); return future; } future_t * future_client_read_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 7); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 4), opts); future_value_set_bson_ptr ( future_get_param (future, 5), reply); future_value_set_bson_error_ptr ( future_get_param (future, 6), error); future_start (future, background_mongoc_client_read_command_with_opts); return future; } future_t * future_client_write_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), command); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_client_write_command_with_opts); return future; } future_t * future_client_read_write_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 7); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 4), opts); future_value_set_bson_ptr ( future_get_param (future, 5), reply); future_value_set_bson_error_ptr ( future_get_param (future, 6), error); future_start (future, background_mongoc_client_read_write_command_with_opts); return future; } future_t * future_client_watch ( mongoc_client_ptr client, const_bson_ptr pipeline, const_bson_ptr opts) { future_t *future = future_new (future_value_mongoc_change_stream_ptr_type, 3); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_bson_ptr ( future_get_param (future, 1), pipeline); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_start (future, background_mongoc_client_watch); return future; } future_t * future_collection_aggregate ( mongoc_collection_ptr collection, mongoc_query_flags_t flags, const_bson_ptr pipeline, const_bson_ptr options, const_mongoc_read_prefs_ptr read_prefs) { future_t *future = future_new (future_value_mongoc_cursor_ptr_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_mongoc_query_flags_t ( future_get_param (future, 1), flags); future_value_set_const_bson_ptr ( future_get_param (future, 2), pipeline); future_value_set_const_bson_ptr ( future_get_param (future, 3), options); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 4), read_prefs); future_start (future, background_mongoc_collection_aggregate); return future; } future_t * future_collection_create_indexes_with_opts ( mongoc_collection_ptr collection, mongoc_index_model_t_ptr_const_ptr models, size_t num_models, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_mongoc_index_model_t_ptr_const_ptr ( future_get_param (future, 1), models); future_value_set_size_t ( future_get_param (future, 2), num_models); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_create_indexes_with_opts); return future; } future_t * future_collection_drop_index_with_opts ( mongoc_collection_ptr collection, const_char_ptr index_name, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 4); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_char_ptr ( future_get_param (future, 1), index_name); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_error_ptr ( future_get_param (future, 3), error); future_start (future, background_mongoc_collection_drop_index_with_opts); return future; } future_t * future_collection_drop_with_opts ( mongoc_collection_ptr collection, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 3); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_value_set_bson_error_ptr ( future_get_param (future, 2), error); future_start (future, background_mongoc_collection_drop_with_opts); return future; } future_t * future_collection_find_and_modify_with_opts ( mongoc_collection_ptr collection, const_bson_ptr query, const_mongoc_find_and_modify_opts_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), query); future_value_set_const_mongoc_find_and_modify_opts_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_find_and_modify_with_opts); return future; } future_t * future_collection_find_and_modify ( mongoc_collection_ptr collection, const_bson_ptr query, const_bson_ptr sort, const_bson_ptr update, const_bson_ptr fields, bool _remove, bool upsert, bool _new, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 10); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), query); future_value_set_const_bson_ptr ( future_get_param (future, 2), sort); future_value_set_const_bson_ptr ( future_get_param (future, 3), update); future_value_set_const_bson_ptr ( future_get_param (future, 4), fields); future_value_set_bool ( future_get_param (future, 5), _remove); future_value_set_bool ( future_get_param (future, 6), upsert); future_value_set_bool ( future_get_param (future, 7), _new); future_value_set_bson_ptr ( future_get_param (future, 8), reply); future_value_set_bson_error_ptr ( future_get_param (future, 9), error); future_start (future, background_mongoc_collection_find_and_modify); return future; } future_t * future_collection_find_indexes_with_opts ( mongoc_collection_ptr collection, const_bson_ptr opts) { future_t *future = future_new (future_value_mongoc_cursor_ptr_type, 2); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_start (future, background_mongoc_collection_find_indexes_with_opts); return future; } future_t * future_collection_insert_many ( mongoc_collection_ptr collection, const_bson_ptr_ptr documents, size_t n_documents, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr_ptr ( future_get_param (future, 1), documents); future_value_set_size_t ( future_get_param (future, 2), n_documents); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_insert_many); return future; } future_t * future_collection_insert_one ( mongoc_collection_ptr collection, const_bson_ptr document, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), document); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_insert_one); return future; } future_t * future_collection_read_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_read_command_with_opts); return future; } future_t * future_collection_read_write_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_read_write_command_with_opts); return future; } future_t * future_collection_write_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), collection); future_value_set_const_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_write_command_with_opts); return future; } future_t * future_cluster_run_command_parts ( mongoc_cluster_ptr cluster, mongoc_server_stream_ptr server_stream, mongoc_cmd_parts_ptr parts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_cluster_ptr ( future_get_param (future, 0), cluster); future_value_set_mongoc_server_stream_ptr ( future_get_param (future, 1), server_stream); future_value_set_mongoc_cmd_parts_ptr ( future_get_param (future, 2), parts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_cluster_run_command_parts); return future; } future_t * future_cursor_destroy ( mongoc_cursor_ptr cursor) { future_t *future = future_new (future_value_void_type, 1); future_value_set_mongoc_cursor_ptr ( future_get_param (future, 0), cursor); future_start (future, background_mongoc_cursor_destroy); return future; } future_t * future_cursor_next ( mongoc_cursor_ptr cursor, const_bson_ptr_ptr doc) { future_t *future = future_new (future_value_bool_type, 2); future_value_set_mongoc_cursor_ptr ( future_get_param (future, 0), cursor); future_value_set_const_bson_ptr_ptr ( future_get_param (future, 1), doc); future_start (future, background_mongoc_cursor_next); return future; } future_t * future_client_get_database_names_with_opts ( mongoc_client_ptr client, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_char_ptr_ptr_type, 3); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_value_set_bson_error_ptr ( future_get_param (future, 2), error); future_start (future, background_mongoc_client_get_database_names_with_opts); return future; } future_t * future_client_select_server ( mongoc_client_ptr client, bool for_writes, const_mongoc_read_prefs_ptr prefs, bson_error_ptr error) { future_t *future = future_new (future_value_mongoc_server_description_ptr_type, 4); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_bool ( future_get_param (future, 1), for_writes); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), prefs); future_value_set_bson_error_ptr ( future_get_param (future, 3), error); future_start (future, background_mongoc_client_select_server); return future; } future_t * future_client_destroy ( mongoc_client_ptr client) { future_t *future = future_new (future_value_void_type, 1); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_start (future, background_mongoc_client_destroy); return future; } future_t * future_client_pool_destroy ( mongoc_client_pool_ptr pool) { future_t *future = future_new (future_value_void_type, 1); future_value_set_mongoc_client_pool_ptr ( future_get_param (future, 0), pool); future_start (future, background_mongoc_client_pool_destroy); return future; } future_t * future_database_command_simple ( mongoc_database_ptr database, bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_bson_ptr ( future_get_param (future, 1), command); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_database_command_simple); return future; } future_t * future_database_drop_with_opts ( mongoc_database_ptr database, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 3); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_value_set_bson_error_ptr ( future_get_param (future, 2), error); future_start (future, background_mongoc_database_drop_with_opts); return future; } future_t * future_database_get_collection_names_with_opts ( mongoc_database_ptr database, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_char_ptr_ptr_type, 3); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_value_set_bson_error_ptr ( future_get_param (future, 2), error); future_start (future, background_mongoc_database_get_collection_names_with_opts); return future; } future_t * future_database_watch ( mongoc_database_ptr database, const_bson_ptr pipeline, const_bson_ptr opts) { future_t *future = future_new (future_value_mongoc_change_stream_ptr_type, 3); future_value_set_mongoc_database_ptr ( future_get_param (future, 0), database); future_value_set_const_bson_ptr ( future_get_param (future, 1), pipeline); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_start (future, background_mongoc_database_watch); return future; } future_t * future_gridfs_file_readv ( mongoc_gridfs_file_ptr file, mongoc_iovec_ptr iov, size_t iovcnt, size_t min_bytes, uint32_t timeout_msec) { future_t *future = future_new (future_value_ssize_t_type, 5); future_value_set_mongoc_gridfs_file_ptr ( future_get_param (future, 0), file); future_value_set_mongoc_iovec_ptr ( future_get_param (future, 1), iov); future_value_set_size_t ( future_get_param (future, 2), iovcnt); future_value_set_size_t ( future_get_param (future, 3), min_bytes); future_value_set_uint32_t ( future_get_param (future, 4), timeout_msec); future_start (future, background_mongoc_gridfs_file_readv); return future; } future_t * future_gridfs_file_remove ( mongoc_gridfs_file_ptr file, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 2); future_value_set_mongoc_gridfs_file_ptr ( future_get_param (future, 0), file); future_value_set_bson_error_ptr ( future_get_param (future, 1), error); future_start (future, background_mongoc_gridfs_file_remove); return future; } future_t * future_gridfs_file_seek ( mongoc_gridfs_file_ptr file, int64_t delta, int whence) { future_t *future = future_new (future_value_int_type, 3); future_value_set_mongoc_gridfs_file_ptr ( future_get_param (future, 0), file); future_value_set_int64_t ( future_get_param (future, 1), delta); future_value_set_int ( future_get_param (future, 2), whence); future_start (future, background_mongoc_gridfs_file_seek); return future; } future_t * future_gridfs_file_writev ( mongoc_gridfs_file_ptr file, const_mongoc_iovec_ptr iov, size_t iovcnt, uint32_t timeout_msec) { future_t *future = future_new (future_value_ssize_t_type, 4); future_value_set_mongoc_gridfs_file_ptr ( future_get_param (future, 0), file); future_value_set_const_mongoc_iovec_ptr ( future_get_param (future, 1), iov); future_value_set_size_t ( future_get_param (future, 2), iovcnt); future_value_set_uint32_t ( future_get_param (future, 3), timeout_msec); future_start (future, background_mongoc_gridfs_file_writev); return future; } future_t * future_gridfs_find_one_with_opts ( mongoc_gridfs_ptr gridfs, const_bson_ptr filter, const_bson_ptr opts, bson_error_ptr error) { future_t *future = future_new (future_value_mongoc_gridfs_file_ptr_type, 4); future_value_set_mongoc_gridfs_ptr ( future_get_param (future, 0), gridfs); future_value_set_const_bson_ptr ( future_get_param (future, 1), filter); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_error_ptr ( future_get_param (future, 3), error); future_start (future, background_mongoc_gridfs_find_one_with_opts); return future; } future_t * future_topology_select ( mongoc_topology_ptr topology, mongoc_ss_optype_t optype, const_mongoc_ss_log_context_ptr log_context, const_mongoc_read_prefs_ptr read_prefs, bool_ptr must_use_primary, bson_error_ptr error) { future_t *future = future_new (future_value_mongoc_server_description_ptr_type, 6); future_value_set_mongoc_topology_ptr ( future_get_param (future, 0), topology); future_value_set_mongoc_ss_optype_t ( future_get_param (future, 1), optype); future_value_set_const_mongoc_ss_log_context_ptr ( future_get_param (future, 2), log_context); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_bool_ptr ( future_get_param (future, 4), must_use_primary); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_topology_select); return future; } future_t * future_client_get_gridfs ( mongoc_client_ptr client, const_char_ptr db, const_char_ptr prefix, bson_error_ptr error) { future_t *future = future_new (future_value_mongoc_gridfs_ptr_type, 4); future_value_set_mongoc_client_ptr ( future_get_param (future, 0), client); future_value_set_const_char_ptr ( future_get_param (future, 1), db); future_value_set_const_char_ptr ( future_get_param (future, 2), prefix); future_value_set_bson_error_ptr ( future_get_param (future, 3), error); future_start (future, background_mongoc_client_get_gridfs); return future; } future_t * future_collection_watch ( mongoc_collection_ptr coll, const_bson_ptr pipeline, const_bson_ptr opts) { future_t *future = future_new (future_value_mongoc_change_stream_ptr_type, 3); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), pipeline); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_start (future, background_mongoc_collection_watch); return future; } future_t * future_change_stream_next ( mongoc_change_stream_ptr stream, const_bson_ptr_ptr bson) { future_t *future = future_new (future_value_bool_type, 2); future_value_set_mongoc_change_stream_ptr ( future_get_param (future, 0), stream); future_value_set_const_bson_ptr_ptr ( future_get_param (future, 1), bson); future_start (future, background_mongoc_change_stream_next); return future; } future_t * future_change_stream_destroy ( mongoc_change_stream_ptr stream) { future_t *future = future_new (future_value_void_type, 1); future_value_set_mongoc_change_stream_ptr ( future_get_param (future, 0), stream); future_start (future, background_mongoc_change_stream_destroy); return future; } future_t * future_collection_delete_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), selector); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_delete_one); return future; } future_t * future_collection_delete_many ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), selector); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_delete_many); return future; } future_t * future_collection_remove ( mongoc_collection_ptr coll, mongoc_remove_flags_t flags, const_bson_ptr selector, const_mongoc_write_concern_ptr write_concern, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_mongoc_remove_flags_t ( future_get_param (future, 1), flags); future_value_set_const_bson_ptr ( future_get_param (future, 2), selector); future_value_set_const_mongoc_write_concern_ptr ( future_get_param (future, 3), write_concern); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_remove); return future; } future_t * future_collection_update_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr update, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), selector); future_value_set_const_bson_ptr ( future_get_param (future, 2), update); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_update_one); return future; } future_t * future_collection_update_many ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr update, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), selector); future_value_set_const_bson_ptr ( future_get_param (future, 2), update); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_update_many); return future; } future_t * future_collection_replace_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr replacement, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_bool_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), selector); future_value_set_const_bson_ptr ( future_get_param (future, 2), replacement); future_value_set_const_bson_ptr ( future_get_param (future, 3), opts); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_replace_one); return future; } future_t * future_collection_count_documents ( mongoc_collection_ptr coll, const_bson_ptr filter, const_bson_ptr opts, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_int64_t_type, 6); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), filter); future_value_set_const_bson_ptr ( future_get_param (future, 2), opts); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 3), read_prefs); future_value_set_bson_ptr ( future_get_param (future, 4), reply); future_value_set_bson_error_ptr ( future_get_param (future, 5), error); future_start (future, background_mongoc_collection_count_documents); return future; } future_t * future_collection_estimated_document_count ( mongoc_collection_ptr coll, const_bson_ptr opts, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error) { future_t *future = future_new (future_value_int64_t_type, 5); future_value_set_mongoc_collection_ptr ( future_get_param (future, 0), coll); future_value_set_const_bson_ptr ( future_get_param (future, 1), opts); future_value_set_const_mongoc_read_prefs_ptr ( future_get_param (future, 2), read_prefs); future_value_set_bson_ptr ( future_get_param (future, 3), reply); future_value_set_bson_error_ptr ( future_get_param (future, 4), error); future_start (future, background_mongoc_collection_estimated_document_count); return future; } future_t * future_bulkwrite_execute ( mongoc_bulkwrite_ptr bw, const_mongoc_bulkwriteopts_ptr opts) { future_t *future = future_new (future_value_mongoc_bulkwritereturn_t_type, 2); future_value_set_mongoc_bulkwrite_ptr ( future_get_param (future, 0), bw); future_value_set_const_mongoc_bulkwriteopts_ptr ( future_get_param (future, 1), opts); future_start (future, background_mongoc_bulkwrite_execute); return future; } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future-functions.h000066400000000000000000000223631511661753600262770ustar00rootroot00000000000000#ifndef FUTURE_FUNCTIONS_H #define FUTURE_FUNCTIONS_H #include #include #include /************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ future_t * future_async_run ( mongoc_async_ptr async ); future_t * future_bulk_operation_execute ( mongoc_bulk_operation_ptr bulk, bson_ptr reply, bson_error_ptr error ); future_t * future_database_read_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_database_read_write_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_database_write_command_with_opts ( mongoc_database_ptr database, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_client_command_simple ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error ); future_t * future_client_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_client_read_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_client_write_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_client_read_write_command_with_opts ( mongoc_client_ptr client, const_char_ptr db_name, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_client_watch ( mongoc_client_ptr client, const_bson_ptr pipeline, const_bson_ptr opts ); future_t * future_collection_aggregate ( mongoc_collection_ptr collection, mongoc_query_flags_t flags, const_bson_ptr pipeline, const_bson_ptr options, const_mongoc_read_prefs_ptr read_prefs ); future_t * future_collection_create_indexes_with_opts ( mongoc_collection_ptr collection, mongoc_index_model_t_ptr_const_ptr models, size_t num_models, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_drop_index_with_opts ( mongoc_collection_ptr collection, const_char_ptr index_name, const_bson_ptr opts, bson_error_ptr error ); future_t * future_collection_drop_with_opts ( mongoc_collection_ptr collection, const_bson_ptr opts, bson_error_ptr error ); future_t * future_collection_find_and_modify_with_opts ( mongoc_collection_ptr collection, const_bson_ptr query, const_mongoc_find_and_modify_opts_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_find_and_modify ( mongoc_collection_ptr collection, const_bson_ptr query, const_bson_ptr sort, const_bson_ptr update, const_bson_ptr fields, bool _remove, bool upsert, bool _new, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_find_indexes_with_opts ( mongoc_collection_ptr collection, const_bson_ptr opts ); future_t * future_collection_insert_many ( mongoc_collection_ptr collection, const_bson_ptr_ptr documents, size_t n_documents, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_insert_one ( mongoc_collection_ptr collection, const_bson_ptr document, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_read_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_read_write_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_write_command_with_opts ( mongoc_collection_ptr collection, const_bson_ptr command, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_cluster_run_command_parts ( mongoc_cluster_ptr cluster, mongoc_server_stream_ptr server_stream, mongoc_cmd_parts_ptr parts, bson_ptr reply, bson_error_ptr error ); future_t * future_cursor_destroy ( mongoc_cursor_ptr cursor ); future_t * future_cursor_next ( mongoc_cursor_ptr cursor, const_bson_ptr_ptr doc ); future_t * future_client_get_database_names_with_opts ( mongoc_client_ptr client, const_bson_ptr opts, bson_error_ptr error ); future_t * future_client_select_server ( mongoc_client_ptr client, bool for_writes, const_mongoc_read_prefs_ptr prefs, bson_error_ptr error ); future_t * future_client_destroy ( mongoc_client_ptr client ); future_t * future_client_pool_destroy ( mongoc_client_pool_ptr pool ); future_t * future_database_command_simple ( mongoc_database_ptr database, bson_ptr command, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error ); future_t * future_database_drop_with_opts ( mongoc_database_ptr database, const_bson_ptr opts, bson_error_ptr error ); future_t * future_database_get_collection_names_with_opts ( mongoc_database_ptr database, const_bson_ptr opts, bson_error_ptr error ); future_t * future_database_watch ( mongoc_database_ptr database, const_bson_ptr pipeline, const_bson_ptr opts ); future_t * future_gridfs_file_readv ( mongoc_gridfs_file_ptr file, mongoc_iovec_ptr iov, size_t iovcnt, size_t min_bytes, uint32_t timeout_msec ); future_t * future_gridfs_file_remove ( mongoc_gridfs_file_ptr file, bson_error_ptr error ); future_t * future_gridfs_file_seek ( mongoc_gridfs_file_ptr file, int64_t delta, int whence ); future_t * future_gridfs_file_writev ( mongoc_gridfs_file_ptr file, const_mongoc_iovec_ptr iov, size_t iovcnt, uint32_t timeout_msec ); future_t * future_gridfs_find_one_with_opts ( mongoc_gridfs_ptr gridfs, const_bson_ptr filter, const_bson_ptr opts, bson_error_ptr error ); future_t * future_topology_select ( mongoc_topology_ptr topology, mongoc_ss_optype_t optype, const_mongoc_ss_log_context_ptr log_context, const_mongoc_read_prefs_ptr read_prefs, bool_ptr must_use_primary, bson_error_ptr error ); future_t * future_client_get_gridfs ( mongoc_client_ptr client, const_char_ptr db, const_char_ptr prefix, bson_error_ptr error ); future_t * future_collection_watch ( mongoc_collection_ptr coll, const_bson_ptr pipeline, const_bson_ptr opts ); future_t * future_change_stream_next ( mongoc_change_stream_ptr stream, const_bson_ptr_ptr bson ); future_t * future_change_stream_destroy ( mongoc_change_stream_ptr stream ); future_t * future_collection_delete_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_delete_many ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_remove ( mongoc_collection_ptr coll, mongoc_remove_flags_t flags, const_bson_ptr selector, const_mongoc_write_concern_ptr write_concern, bson_error_ptr error ); future_t * future_collection_update_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr update, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_update_many ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr update, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_replace_one ( mongoc_collection_ptr coll, const_bson_ptr selector, const_bson_ptr replacement, const_bson_ptr opts, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_count_documents ( mongoc_collection_ptr coll, const_bson_ptr filter, const_bson_ptr opts, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error ); future_t * future_collection_estimated_document_count ( mongoc_collection_ptr coll, const_bson_ptr opts, const_mongoc_read_prefs_ptr read_prefs, bson_ptr reply, bson_error_ptr error ); future_t * future_bulkwrite_execute ( mongoc_bulkwrite_ptr bw, const_mongoc_bulkwriteopts_ptr opts ); #endif /* FUTURE_FUNCTIONS_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future-value.c000066400000000000000000000504641511661753600254010ustar00rootroot00000000000000#include /************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ future_value_t * future_value_new (void) { return (future_value_t *) bson_malloc0 (sizeof (future_value_t)); } void future_value_set_void (future_value_t *future_value) { future_value->type = future_value_void_type; } void future_value_get_void (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_void_type); } void future_value_set_bool (future_value_t *future_value, bool value) { future_value->type = future_value_bool_type; future_value->value.bool_value = value; } bool future_value_get_bool (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_bool_type); return future_value->value.bool_value; } void future_value_set_char_ptr (future_value_t *future_value, char_ptr value) { future_value->type = future_value_char_ptr_type; future_value->value.char_ptr_value = value; } char_ptr future_value_get_char_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_char_ptr_type); return future_value->value.char_ptr_value; } void future_value_set_char_ptr_ptr (future_value_t *future_value, char_ptr_ptr value) { future_value->type = future_value_char_ptr_ptr_type; future_value->value.char_ptr_ptr_value = value; } char_ptr_ptr future_value_get_char_ptr_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_char_ptr_ptr_type); return future_value->value.char_ptr_ptr_value; } void future_value_set_int (future_value_t *future_value, int value) { future_value->type = future_value_int_type; future_value->value.int_value = value; } int future_value_get_int (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_int_type); return future_value->value.int_value; } void future_value_set_int64_t (future_value_t *future_value, int64_t value) { future_value->type = future_value_int64_t_type; future_value->value.int64_t_value = value; } int64_t future_value_get_int64_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_int64_t_type); return future_value->value.int64_t_value; } void future_value_set_size_t (future_value_t *future_value, size_t value) { future_value->type = future_value_size_t_type; future_value->value.size_t_value = value; } size_t future_value_get_size_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_size_t_type); return future_value->value.size_t_value; } void future_value_set_ssize_t (future_value_t *future_value, ssize_t value) { future_value->type = future_value_ssize_t_type; future_value->value.ssize_t_value = value; } ssize_t future_value_get_ssize_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_ssize_t_type); return future_value->value.ssize_t_value; } void future_value_set_uint32_t (future_value_t *future_value, uint32_t value) { future_value->type = future_value_uint32_t_type; future_value->value.uint32_t_value = value; } uint32_t future_value_get_uint32_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_uint32_t_type); return future_value->value.uint32_t_value; } void future_value_set_void_ptr (future_value_t *future_value, void_ptr value) { future_value->type = future_value_void_ptr_type; future_value->value.void_ptr_value = value; } void_ptr future_value_get_void_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_void_ptr_type); return future_value->value.void_ptr_value; } void future_value_set_const_char_ptr (future_value_t *future_value, const_char_ptr value) { future_value->type = future_value_const_char_ptr_type; future_value->value.const_char_ptr_value = value; } const_char_ptr future_value_get_const_char_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_char_ptr_type); return future_value->value.const_char_ptr_value; } void future_value_set_bool_ptr (future_value_t *future_value, bool_ptr value) { future_value->type = future_value_bool_ptr_type; future_value->value.bool_ptr_value = value; } bool_ptr future_value_get_bool_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_bool_ptr_type); return future_value->value.bool_ptr_value; } void future_value_set_bson_error_ptr (future_value_t *future_value, bson_error_ptr value) { future_value->type = future_value_bson_error_ptr_type; future_value->value.bson_error_ptr_value = value; } bson_error_ptr future_value_get_bson_error_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_bson_error_ptr_type); return future_value->value.bson_error_ptr_value; } void future_value_set_bson_ptr (future_value_t *future_value, bson_ptr value) { future_value->type = future_value_bson_ptr_type; future_value->value.bson_ptr_value = value; } bson_ptr future_value_get_bson_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_bson_ptr_type); return future_value->value.bson_ptr_value; } void future_value_set_const_bson_ptr (future_value_t *future_value, const_bson_ptr value) { future_value->type = future_value_const_bson_ptr_type; future_value->value.const_bson_ptr_value = value; } const_bson_ptr future_value_get_const_bson_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_bson_ptr_type); return future_value->value.const_bson_ptr_value; } void future_value_set_const_bson_ptr_ptr (future_value_t *future_value, const_bson_ptr_ptr value) { future_value->type = future_value_const_bson_ptr_ptr_type; future_value->value.const_bson_ptr_ptr_value = value; } const_bson_ptr_ptr future_value_get_const_bson_ptr_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_bson_ptr_ptr_type); return future_value->value.const_bson_ptr_ptr_value; } void future_value_set_mongoc_async_ptr (future_value_t *future_value, mongoc_async_ptr value) { future_value->type = future_value_mongoc_async_ptr_type; future_value->value.mongoc_async_ptr_value = value; } mongoc_async_ptr future_value_get_mongoc_async_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_async_ptr_type); return future_value->value.mongoc_async_ptr_value; } void future_value_set_mongoc_bulk_operation_ptr (future_value_t *future_value, mongoc_bulk_operation_ptr value) { future_value->type = future_value_mongoc_bulk_operation_ptr_type; future_value->value.mongoc_bulk_operation_ptr_value = value; } mongoc_bulk_operation_ptr future_value_get_mongoc_bulk_operation_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_bulk_operation_ptr_type); return future_value->value.mongoc_bulk_operation_ptr_value; } void future_value_set_mongoc_client_ptr (future_value_t *future_value, mongoc_client_ptr value) { future_value->type = future_value_mongoc_client_ptr_type; future_value->value.mongoc_client_ptr_value = value; } mongoc_client_ptr future_value_get_mongoc_client_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_client_ptr_type); return future_value->value.mongoc_client_ptr_value; } void future_value_set_mongoc_client_pool_ptr (future_value_t *future_value, mongoc_client_pool_ptr value) { future_value->type = future_value_mongoc_client_pool_ptr_type; future_value->value.mongoc_client_pool_ptr_value = value; } mongoc_client_pool_ptr future_value_get_mongoc_client_pool_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_client_pool_ptr_type); return future_value->value.mongoc_client_pool_ptr_value; } void future_value_set_mongoc_collection_ptr (future_value_t *future_value, mongoc_collection_ptr value) { future_value->type = future_value_mongoc_collection_ptr_type; future_value->value.mongoc_collection_ptr_value = value; } mongoc_collection_ptr future_value_get_mongoc_collection_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_collection_ptr_type); return future_value->value.mongoc_collection_ptr_value; } void future_value_set_mongoc_cluster_ptr (future_value_t *future_value, mongoc_cluster_ptr value) { future_value->type = future_value_mongoc_cluster_ptr_type; future_value->value.mongoc_cluster_ptr_value = value; } mongoc_cluster_ptr future_value_get_mongoc_cluster_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_cluster_ptr_type); return future_value->value.mongoc_cluster_ptr_value; } void future_value_set_mongoc_cmd_parts_ptr (future_value_t *future_value, mongoc_cmd_parts_ptr value) { future_value->type = future_value_mongoc_cmd_parts_ptr_type; future_value->value.mongoc_cmd_parts_ptr_value = value; } mongoc_cmd_parts_ptr future_value_get_mongoc_cmd_parts_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_cmd_parts_ptr_type); return future_value->value.mongoc_cmd_parts_ptr_value; } void future_value_set_mongoc_cursor_ptr (future_value_t *future_value, mongoc_cursor_ptr value) { future_value->type = future_value_mongoc_cursor_ptr_type; future_value->value.mongoc_cursor_ptr_value = value; } mongoc_cursor_ptr future_value_get_mongoc_cursor_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_cursor_ptr_type); return future_value->value.mongoc_cursor_ptr_value; } void future_value_set_mongoc_database_ptr (future_value_t *future_value, mongoc_database_ptr value) { future_value->type = future_value_mongoc_database_ptr_type; future_value->value.mongoc_database_ptr_value = value; } mongoc_database_ptr future_value_get_mongoc_database_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_database_ptr_type); return future_value->value.mongoc_database_ptr_value; } void future_value_set_mongoc_gridfs_file_ptr (future_value_t *future_value, mongoc_gridfs_file_ptr value) { future_value->type = future_value_mongoc_gridfs_file_ptr_type; future_value->value.mongoc_gridfs_file_ptr_value = value; } mongoc_gridfs_file_ptr future_value_get_mongoc_gridfs_file_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_gridfs_file_ptr_type); return future_value->value.mongoc_gridfs_file_ptr_value; } void future_value_set_mongoc_gridfs_ptr (future_value_t *future_value, mongoc_gridfs_ptr value) { future_value->type = future_value_mongoc_gridfs_ptr_type; future_value->value.mongoc_gridfs_ptr_value = value; } mongoc_gridfs_ptr future_value_get_mongoc_gridfs_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_gridfs_ptr_type); return future_value->value.mongoc_gridfs_ptr_value; } void future_value_set_mongoc_insert_flags_t (future_value_t *future_value, mongoc_insert_flags_t value) { future_value->type = future_value_mongoc_insert_flags_t_type; future_value->value.mongoc_insert_flags_t_value = value; } mongoc_insert_flags_t future_value_get_mongoc_insert_flags_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_insert_flags_t_type); return future_value->value.mongoc_insert_flags_t_value; } void future_value_set_mongoc_iovec_ptr (future_value_t *future_value, mongoc_iovec_ptr value) { future_value->type = future_value_mongoc_iovec_ptr_type; future_value->value.mongoc_iovec_ptr_value = value; } mongoc_iovec_ptr future_value_get_mongoc_iovec_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_iovec_ptr_type); return future_value->value.mongoc_iovec_ptr_value; } void future_value_set_mongoc_server_stream_ptr (future_value_t *future_value, mongoc_server_stream_ptr value) { future_value->type = future_value_mongoc_server_stream_ptr_type; future_value->value.mongoc_server_stream_ptr_value = value; } mongoc_server_stream_ptr future_value_get_mongoc_server_stream_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_server_stream_ptr_type); return future_value->value.mongoc_server_stream_ptr_value; } void future_value_set_mongoc_query_flags_t (future_value_t *future_value, mongoc_query_flags_t value) { future_value->type = future_value_mongoc_query_flags_t_type; future_value->value.mongoc_query_flags_t_value = value; } mongoc_query_flags_t future_value_get_mongoc_query_flags_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_query_flags_t_type); return future_value->value.mongoc_query_flags_t_value; } void future_value_set_mongoc_server_description_ptr (future_value_t *future_value, mongoc_server_description_ptr value) { future_value->type = future_value_mongoc_server_description_ptr_type; future_value->value.mongoc_server_description_ptr_value = value; } mongoc_server_description_ptr future_value_get_mongoc_server_description_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_server_description_ptr_type); return future_value->value.mongoc_server_description_ptr_value; } void future_value_set_mongoc_ss_optype_t (future_value_t *future_value, mongoc_ss_optype_t value) { future_value->type = future_value_mongoc_ss_optype_t_type; future_value->value.mongoc_ss_optype_t_value = value; } mongoc_ss_optype_t future_value_get_mongoc_ss_optype_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_ss_optype_t_type); return future_value->value.mongoc_ss_optype_t_value; } void future_value_set_mongoc_topology_ptr (future_value_t *future_value, mongoc_topology_ptr value) { future_value->type = future_value_mongoc_topology_ptr_type; future_value->value.mongoc_topology_ptr_value = value; } mongoc_topology_ptr future_value_get_mongoc_topology_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_topology_ptr_type); return future_value->value.mongoc_topology_ptr_value; } void future_value_set_mongoc_write_concern_ptr (future_value_t *future_value, mongoc_write_concern_ptr value) { future_value->type = future_value_mongoc_write_concern_ptr_type; future_value->value.mongoc_write_concern_ptr_value = value; } mongoc_write_concern_ptr future_value_get_mongoc_write_concern_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_write_concern_ptr_type); return future_value->value.mongoc_write_concern_ptr_value; } void future_value_set_mongoc_change_stream_ptr (future_value_t *future_value, mongoc_change_stream_ptr value) { future_value->type = future_value_mongoc_change_stream_ptr_type; future_value->value.mongoc_change_stream_ptr_value = value; } mongoc_change_stream_ptr future_value_get_mongoc_change_stream_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_change_stream_ptr_type); return future_value->value.mongoc_change_stream_ptr_value; } void future_value_set_mongoc_remove_flags_t (future_value_t *future_value, mongoc_remove_flags_t value) { future_value->type = future_value_mongoc_remove_flags_t_type; future_value->value.mongoc_remove_flags_t_value = value; } mongoc_remove_flags_t future_value_get_mongoc_remove_flags_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_remove_flags_t_type); return future_value->value.mongoc_remove_flags_t_value; } void future_value_set_mongoc_bulkwrite_ptr (future_value_t *future_value, mongoc_bulkwrite_ptr value) { future_value->type = future_value_mongoc_bulkwrite_ptr_type; future_value->value.mongoc_bulkwrite_ptr_value = value; } mongoc_bulkwrite_ptr future_value_get_mongoc_bulkwrite_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_bulkwrite_ptr_type); return future_value->value.mongoc_bulkwrite_ptr_value; } void future_value_set_mongoc_bulkwritereturn_t (future_value_t *future_value, mongoc_bulkwritereturn_t value) { future_value->type = future_value_mongoc_bulkwritereturn_t_type; future_value->value.mongoc_bulkwritereturn_t_value = value; } mongoc_bulkwritereturn_t future_value_get_mongoc_bulkwritereturn_t (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_bulkwritereturn_t_type); return future_value->value.mongoc_bulkwritereturn_t_value; } void future_value_set_const_mongoc_find_and_modify_opts_ptr (future_value_t *future_value, const_mongoc_find_and_modify_opts_ptr value) { future_value->type = future_value_const_mongoc_find_and_modify_opts_ptr_type; future_value->value.const_mongoc_find_and_modify_opts_ptr_value = value; } const_mongoc_find_and_modify_opts_ptr future_value_get_const_mongoc_find_and_modify_opts_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_find_and_modify_opts_ptr_type); return future_value->value.const_mongoc_find_and_modify_opts_ptr_value; } void future_value_set_const_mongoc_iovec_ptr (future_value_t *future_value, const_mongoc_iovec_ptr value) { future_value->type = future_value_const_mongoc_iovec_ptr_type; future_value->value.const_mongoc_iovec_ptr_value = value; } const_mongoc_iovec_ptr future_value_get_const_mongoc_iovec_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_iovec_ptr_type); return future_value->value.const_mongoc_iovec_ptr_value; } void future_value_set_const_mongoc_read_prefs_ptr (future_value_t *future_value, const_mongoc_read_prefs_ptr value) { future_value->type = future_value_const_mongoc_read_prefs_ptr_type; future_value->value.const_mongoc_read_prefs_ptr_value = value; } const_mongoc_read_prefs_ptr future_value_get_const_mongoc_read_prefs_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_read_prefs_ptr_type); return future_value->value.const_mongoc_read_prefs_ptr_value; } void future_value_set_const_mongoc_write_concern_ptr (future_value_t *future_value, const_mongoc_write_concern_ptr value) { future_value->type = future_value_const_mongoc_write_concern_ptr_type; future_value->value.const_mongoc_write_concern_ptr_value = value; } const_mongoc_write_concern_ptr future_value_get_const_mongoc_write_concern_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_write_concern_ptr_type); return future_value->value.const_mongoc_write_concern_ptr_value; } void future_value_set_const_mongoc_ss_log_context_ptr (future_value_t *future_value, const_mongoc_ss_log_context_ptr value) { future_value->type = future_value_const_mongoc_ss_log_context_ptr_type; future_value->value.const_mongoc_ss_log_context_ptr_value = value; } const_mongoc_ss_log_context_ptr future_value_get_const_mongoc_ss_log_context_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_ss_log_context_ptr_type); return future_value->value.const_mongoc_ss_log_context_ptr_value; } void future_value_set_mongoc_index_model_t_ptr_const_ptr (future_value_t *future_value, mongoc_index_model_t_ptr_const_ptr value) { future_value->type = future_value_mongoc_index_model_t_ptr_const_ptr_type; future_value->value.mongoc_index_model_t_ptr_const_ptr_value = value; } mongoc_index_model_t_ptr_const_ptr future_value_get_mongoc_index_model_t_ptr_const_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_mongoc_index_model_t_ptr_const_ptr_type); return future_value->value.mongoc_index_model_t_ptr_const_ptr_value; } void future_value_set_const_mongoc_bulkwriteopts_ptr (future_value_t *future_value, const_mongoc_bulkwriteopts_ptr value) { future_value->type = future_value_const_mongoc_bulkwriteopts_ptr_type; future_value->value.const_mongoc_bulkwriteopts_ptr_value = value; } const_mongoc_bulkwriteopts_ptr future_value_get_const_mongoc_bulkwriteopts_ptr (future_value_t *future_value) { BSON_ASSERT (future_value->type == future_value_const_mongoc_bulkwriteopts_ptr_type); return future_value->value.const_mongoc_bulkwriteopts_ptr_value; } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future-value.h000066400000000000000000000366771511661753600254200ustar00rootroot00000000000000#ifndef FUTURE_VALUE_H #define FUTURE_VALUE_H #include #include #include /************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ typedef char * char_ptr; typedef char ** char_ptr_ptr; typedef void * void_ptr; typedef const char * const_char_ptr; typedef bool * bool_ptr; typedef bson_error_t * bson_error_ptr; typedef bson_t * bson_ptr; typedef const bson_t * const_bson_ptr; typedef const bson_t ** const_bson_ptr_ptr; typedef mongoc_async_t * mongoc_async_ptr; typedef mongoc_bulk_operation_t * mongoc_bulk_operation_ptr; typedef mongoc_client_t * mongoc_client_ptr; typedef mongoc_client_pool_t * mongoc_client_pool_ptr; typedef mongoc_collection_t * mongoc_collection_ptr; typedef mongoc_cluster_t * mongoc_cluster_ptr; typedef mongoc_cmd_parts_t * mongoc_cmd_parts_ptr; typedef mongoc_cursor_t * mongoc_cursor_ptr; typedef mongoc_database_t * mongoc_database_ptr; typedef mongoc_gridfs_file_t * mongoc_gridfs_file_ptr; typedef mongoc_gridfs_t * mongoc_gridfs_ptr; typedef mongoc_iovec_t * mongoc_iovec_ptr; typedef mongoc_server_stream_t * mongoc_server_stream_ptr; typedef mongoc_server_description_t * mongoc_server_description_ptr; typedef mongoc_topology_t * mongoc_topology_ptr; typedef mongoc_write_concern_t * mongoc_write_concern_ptr; typedef mongoc_change_stream_t * mongoc_change_stream_ptr; typedef mongoc_bulkwrite_t * mongoc_bulkwrite_ptr; typedef const mongoc_find_and_modify_opts_t * const_mongoc_find_and_modify_opts_ptr; typedef const mongoc_iovec_t * const_mongoc_iovec_ptr; typedef const mongoc_read_prefs_t * const_mongoc_read_prefs_ptr; typedef const mongoc_write_concern_t * const_mongoc_write_concern_ptr; typedef const mongoc_ss_log_context_t * const_mongoc_ss_log_context_ptr; typedef mongoc_index_model_t *const * mongoc_index_model_t_ptr_const_ptr; typedef const mongoc_bulkwriteopts_t * const_mongoc_bulkwriteopts_ptr; typedef enum { future_value_no_type = 0, future_value_bool_type, future_value_char_ptr_type, future_value_char_ptr_ptr_type, future_value_int_type, future_value_int64_t_type, future_value_size_t_type, future_value_ssize_t_type, future_value_uint32_t_type, future_value_void_ptr_type, future_value_const_char_ptr_type, future_value_bool_ptr_type, future_value_bson_error_ptr_type, future_value_bson_ptr_type, future_value_const_bson_ptr_type, future_value_const_bson_ptr_ptr_type, future_value_mongoc_async_ptr_type, future_value_mongoc_bulk_operation_ptr_type, future_value_mongoc_client_ptr_type, future_value_mongoc_client_pool_ptr_type, future_value_mongoc_collection_ptr_type, future_value_mongoc_cluster_ptr_type, future_value_mongoc_cmd_parts_ptr_type, future_value_mongoc_cursor_ptr_type, future_value_mongoc_database_ptr_type, future_value_mongoc_gridfs_file_ptr_type, future_value_mongoc_gridfs_ptr_type, future_value_mongoc_insert_flags_t_type, future_value_mongoc_iovec_ptr_type, future_value_mongoc_server_stream_ptr_type, future_value_mongoc_query_flags_t_type, future_value_mongoc_server_description_ptr_type, future_value_mongoc_ss_optype_t_type, future_value_mongoc_topology_ptr_type, future_value_mongoc_write_concern_ptr_type, future_value_mongoc_change_stream_ptr_type, future_value_mongoc_remove_flags_t_type, future_value_mongoc_bulkwrite_ptr_type, future_value_mongoc_bulkwritereturn_t_type, future_value_const_mongoc_find_and_modify_opts_ptr_type, future_value_const_mongoc_iovec_ptr_type, future_value_const_mongoc_read_prefs_ptr_type, future_value_const_mongoc_write_concern_ptr_type, future_value_const_mongoc_ss_log_context_ptr_type, future_value_mongoc_index_model_t_ptr_const_ptr_type, future_value_const_mongoc_bulkwriteopts_ptr_type, future_value_void_type, } future_value_type_t; typedef struct _future_value_t { future_value_type_t type; union { bool bool_value; char_ptr char_ptr_value; char_ptr_ptr char_ptr_ptr_value; int int_value; int64_t int64_t_value; size_t size_t_value; ssize_t ssize_t_value; uint32_t uint32_t_value; void_ptr void_ptr_value; const_char_ptr const_char_ptr_value; bool_ptr bool_ptr_value; bson_error_ptr bson_error_ptr_value; bson_ptr bson_ptr_value; const_bson_ptr const_bson_ptr_value; const_bson_ptr_ptr const_bson_ptr_ptr_value; mongoc_async_ptr mongoc_async_ptr_value; mongoc_bulk_operation_ptr mongoc_bulk_operation_ptr_value; mongoc_client_ptr mongoc_client_ptr_value; mongoc_client_pool_ptr mongoc_client_pool_ptr_value; mongoc_collection_ptr mongoc_collection_ptr_value; mongoc_cluster_ptr mongoc_cluster_ptr_value; mongoc_cmd_parts_ptr mongoc_cmd_parts_ptr_value; mongoc_cursor_ptr mongoc_cursor_ptr_value; mongoc_database_ptr mongoc_database_ptr_value; mongoc_gridfs_file_ptr mongoc_gridfs_file_ptr_value; mongoc_gridfs_ptr mongoc_gridfs_ptr_value; mongoc_insert_flags_t mongoc_insert_flags_t_value; mongoc_iovec_ptr mongoc_iovec_ptr_value; mongoc_server_stream_ptr mongoc_server_stream_ptr_value; mongoc_query_flags_t mongoc_query_flags_t_value; mongoc_server_description_ptr mongoc_server_description_ptr_value; mongoc_ss_optype_t mongoc_ss_optype_t_value; mongoc_topology_ptr mongoc_topology_ptr_value; mongoc_write_concern_ptr mongoc_write_concern_ptr_value; mongoc_change_stream_ptr mongoc_change_stream_ptr_value; mongoc_remove_flags_t mongoc_remove_flags_t_value; mongoc_bulkwrite_ptr mongoc_bulkwrite_ptr_value; mongoc_bulkwritereturn_t mongoc_bulkwritereturn_t_value; const_mongoc_find_and_modify_opts_ptr const_mongoc_find_and_modify_opts_ptr_value; const_mongoc_iovec_ptr const_mongoc_iovec_ptr_value; const_mongoc_read_prefs_ptr const_mongoc_read_prefs_ptr_value; const_mongoc_write_concern_ptr const_mongoc_write_concern_ptr_value; const_mongoc_ss_log_context_ptr const_mongoc_ss_log_context_ptr_value; mongoc_index_model_t_ptr_const_ptr mongoc_index_model_t_ptr_const_ptr_value; const_mongoc_bulkwriteopts_ptr const_mongoc_bulkwriteopts_ptr_value; } value; } future_value_t; future_value_t *future_value_new (void); #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-function" #endif void future_value_set_void (future_value_t *future_value); void future_value_get_void (future_value_t *future_value); void future_value_set_bool( future_value_t *future_value, bool value); bool future_value_get_bool ( future_value_t *future_value); void future_value_set_char_ptr( future_value_t *future_value, char_ptr value); char_ptr future_value_get_char_ptr ( future_value_t *future_value); void future_value_set_char_ptr_ptr( future_value_t *future_value, char_ptr_ptr value); char_ptr_ptr future_value_get_char_ptr_ptr ( future_value_t *future_value); void future_value_set_int( future_value_t *future_value, int value); int future_value_get_int ( future_value_t *future_value); void future_value_set_int64_t( future_value_t *future_value, int64_t value); int64_t future_value_get_int64_t ( future_value_t *future_value); void future_value_set_size_t( future_value_t *future_value, size_t value); size_t future_value_get_size_t ( future_value_t *future_value); void future_value_set_ssize_t( future_value_t *future_value, ssize_t value); ssize_t future_value_get_ssize_t ( future_value_t *future_value); void future_value_set_uint32_t( future_value_t *future_value, uint32_t value); uint32_t future_value_get_uint32_t ( future_value_t *future_value); void future_value_set_void_ptr( future_value_t *future_value, void_ptr value); void_ptr future_value_get_void_ptr ( future_value_t *future_value); void future_value_set_const_char_ptr( future_value_t *future_value, const_char_ptr value); const_char_ptr future_value_get_const_char_ptr ( future_value_t *future_value); void future_value_set_bool_ptr( future_value_t *future_value, bool_ptr value); bool_ptr future_value_get_bool_ptr ( future_value_t *future_value); void future_value_set_bson_error_ptr( future_value_t *future_value, bson_error_ptr value); bson_error_ptr future_value_get_bson_error_ptr ( future_value_t *future_value); void future_value_set_bson_ptr( future_value_t *future_value, bson_ptr value); bson_ptr future_value_get_bson_ptr ( future_value_t *future_value); void future_value_set_const_bson_ptr( future_value_t *future_value, const_bson_ptr value); const_bson_ptr future_value_get_const_bson_ptr ( future_value_t *future_value); void future_value_set_const_bson_ptr_ptr( future_value_t *future_value, const_bson_ptr_ptr value); const_bson_ptr_ptr future_value_get_const_bson_ptr_ptr ( future_value_t *future_value); void future_value_set_mongoc_async_ptr( future_value_t *future_value, mongoc_async_ptr value); mongoc_async_ptr future_value_get_mongoc_async_ptr ( future_value_t *future_value); void future_value_set_mongoc_bulk_operation_ptr( future_value_t *future_value, mongoc_bulk_operation_ptr value); mongoc_bulk_operation_ptr future_value_get_mongoc_bulk_operation_ptr ( future_value_t *future_value); void future_value_set_mongoc_client_ptr( future_value_t *future_value, mongoc_client_ptr value); mongoc_client_ptr future_value_get_mongoc_client_ptr ( future_value_t *future_value); void future_value_set_mongoc_client_pool_ptr( future_value_t *future_value, mongoc_client_pool_ptr value); mongoc_client_pool_ptr future_value_get_mongoc_client_pool_ptr ( future_value_t *future_value); void future_value_set_mongoc_collection_ptr( future_value_t *future_value, mongoc_collection_ptr value); mongoc_collection_ptr future_value_get_mongoc_collection_ptr ( future_value_t *future_value); void future_value_set_mongoc_cluster_ptr( future_value_t *future_value, mongoc_cluster_ptr value); mongoc_cluster_ptr future_value_get_mongoc_cluster_ptr ( future_value_t *future_value); void future_value_set_mongoc_cmd_parts_ptr( future_value_t *future_value, mongoc_cmd_parts_ptr value); mongoc_cmd_parts_ptr future_value_get_mongoc_cmd_parts_ptr ( future_value_t *future_value); void future_value_set_mongoc_cursor_ptr( future_value_t *future_value, mongoc_cursor_ptr value); mongoc_cursor_ptr future_value_get_mongoc_cursor_ptr ( future_value_t *future_value); void future_value_set_mongoc_database_ptr( future_value_t *future_value, mongoc_database_ptr value); mongoc_database_ptr future_value_get_mongoc_database_ptr ( future_value_t *future_value); void future_value_set_mongoc_gridfs_file_ptr( future_value_t *future_value, mongoc_gridfs_file_ptr value); mongoc_gridfs_file_ptr future_value_get_mongoc_gridfs_file_ptr ( future_value_t *future_value); void future_value_set_mongoc_gridfs_ptr( future_value_t *future_value, mongoc_gridfs_ptr value); mongoc_gridfs_ptr future_value_get_mongoc_gridfs_ptr ( future_value_t *future_value); void future_value_set_mongoc_insert_flags_t( future_value_t *future_value, mongoc_insert_flags_t value); mongoc_insert_flags_t future_value_get_mongoc_insert_flags_t ( future_value_t *future_value); void future_value_set_mongoc_iovec_ptr( future_value_t *future_value, mongoc_iovec_ptr value); mongoc_iovec_ptr future_value_get_mongoc_iovec_ptr ( future_value_t *future_value); void future_value_set_mongoc_server_stream_ptr( future_value_t *future_value, mongoc_server_stream_ptr value); mongoc_server_stream_ptr future_value_get_mongoc_server_stream_ptr ( future_value_t *future_value); void future_value_set_mongoc_query_flags_t( future_value_t *future_value, mongoc_query_flags_t value); mongoc_query_flags_t future_value_get_mongoc_query_flags_t ( future_value_t *future_value); void future_value_set_mongoc_server_description_ptr( future_value_t *future_value, mongoc_server_description_ptr value); mongoc_server_description_ptr future_value_get_mongoc_server_description_ptr ( future_value_t *future_value); void future_value_set_mongoc_ss_optype_t( future_value_t *future_value, mongoc_ss_optype_t value); mongoc_ss_optype_t future_value_get_mongoc_ss_optype_t ( future_value_t *future_value); void future_value_set_mongoc_topology_ptr( future_value_t *future_value, mongoc_topology_ptr value); mongoc_topology_ptr future_value_get_mongoc_topology_ptr ( future_value_t *future_value); void future_value_set_mongoc_write_concern_ptr( future_value_t *future_value, mongoc_write_concern_ptr value); mongoc_write_concern_ptr future_value_get_mongoc_write_concern_ptr ( future_value_t *future_value); void future_value_set_mongoc_change_stream_ptr( future_value_t *future_value, mongoc_change_stream_ptr value); mongoc_change_stream_ptr future_value_get_mongoc_change_stream_ptr ( future_value_t *future_value); void future_value_set_mongoc_remove_flags_t( future_value_t *future_value, mongoc_remove_flags_t value); mongoc_remove_flags_t future_value_get_mongoc_remove_flags_t ( future_value_t *future_value); void future_value_set_mongoc_bulkwrite_ptr( future_value_t *future_value, mongoc_bulkwrite_ptr value); mongoc_bulkwrite_ptr future_value_get_mongoc_bulkwrite_ptr ( future_value_t *future_value); void future_value_set_mongoc_bulkwritereturn_t( future_value_t *future_value, mongoc_bulkwritereturn_t value); mongoc_bulkwritereturn_t future_value_get_mongoc_bulkwritereturn_t ( future_value_t *future_value); void future_value_set_const_mongoc_find_and_modify_opts_ptr( future_value_t *future_value, const_mongoc_find_and_modify_opts_ptr value); const_mongoc_find_and_modify_opts_ptr future_value_get_const_mongoc_find_and_modify_opts_ptr ( future_value_t *future_value); void future_value_set_const_mongoc_iovec_ptr( future_value_t *future_value, const_mongoc_iovec_ptr value); const_mongoc_iovec_ptr future_value_get_const_mongoc_iovec_ptr ( future_value_t *future_value); void future_value_set_const_mongoc_read_prefs_ptr( future_value_t *future_value, const_mongoc_read_prefs_ptr value); const_mongoc_read_prefs_ptr future_value_get_const_mongoc_read_prefs_ptr ( future_value_t *future_value); void future_value_set_const_mongoc_write_concern_ptr( future_value_t *future_value, const_mongoc_write_concern_ptr value); const_mongoc_write_concern_ptr future_value_get_const_mongoc_write_concern_ptr ( future_value_t *future_value); void future_value_set_const_mongoc_ss_log_context_ptr( future_value_t *future_value, const_mongoc_ss_log_context_ptr value); const_mongoc_ss_log_context_ptr future_value_get_const_mongoc_ss_log_context_ptr ( future_value_t *future_value); void future_value_set_mongoc_index_model_t_ptr_const_ptr( future_value_t *future_value, mongoc_index_model_t_ptr_const_ptr value); mongoc_index_model_t_ptr_const_ptr future_value_get_mongoc_index_model_t_ptr_const_ptr ( future_value_t *future_value); void future_value_set_const_mongoc_bulkwriteopts_ptr( future_value_t *future_value, const_mongoc_bulkwriteopts_ptr value); const_mongoc_bulkwriteopts_ptr future_value_get_const_mongoc_bulkwriteopts_ptr ( future_value_t *future_value); #ifdef __clang__ #pragma clang diagnostic pop #endif #endif /* FUTURE_VALUE_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future.c000066400000000000000000000302761511661753600242660ustar00rootroot00000000000000#include #include "../test-libmongoc.h" #include #include #include /************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ #define FUTURE_TIMEOUT_ABORT \ if (1) { \ fflush (stdout); \ fprintf (stderr, "%s timed out\n", BSON_FUNC); \ fflush (stderr); \ abort (); \ } else \ ((void) 0) void future_get_void (future_t *future) { if (future_wait (future)) { return; } FUTURE_TIMEOUT_ABORT; } bool future_get_bool (future_t *future) { if (future_wait (future)) { return future_value_get_bool (&future->return_value); } FUTURE_TIMEOUT_ABORT; } char_ptr future_get_char_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_char_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } char_ptr_ptr future_get_char_ptr_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_char_ptr_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } int future_get_int (future_t *future) { if (future_wait (future)) { return future_value_get_int (&future->return_value); } FUTURE_TIMEOUT_ABORT; } int64_t future_get_int64_t (future_t *future) { if (future_wait (future)) { return future_value_get_int64_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } size_t future_get_size_t (future_t *future) { if (future_wait (future)) { return future_value_get_size_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } ssize_t future_get_ssize_t (future_t *future) { if (future_wait (future)) { return future_value_get_ssize_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } uint32_t future_get_uint32_t (future_t *future) { if (future_wait (future)) { return future_value_get_uint32_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } void_ptr future_get_void_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_void_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_char_ptr future_get_const_char_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_char_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } bool_ptr future_get_bool_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_bool_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } bson_error_ptr future_get_bson_error_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_bson_error_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } bson_ptr future_get_bson_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_bson_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_bson_ptr future_get_const_bson_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_bson_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_bson_ptr_ptr future_get_const_bson_ptr_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_bson_ptr_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_async_ptr future_get_mongoc_async_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_async_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_bulk_operation_ptr future_get_mongoc_bulk_operation_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_bulk_operation_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_client_ptr future_get_mongoc_client_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_client_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_client_pool_ptr future_get_mongoc_client_pool_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_client_pool_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_collection_ptr future_get_mongoc_collection_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_collection_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_cluster_ptr future_get_mongoc_cluster_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_cluster_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_cmd_parts_ptr future_get_mongoc_cmd_parts_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_cmd_parts_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_cursor_ptr future_get_mongoc_cursor_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_cursor_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_database_ptr future_get_mongoc_database_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_database_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_gridfs_file_ptr future_get_mongoc_gridfs_file_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_gridfs_file_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_gridfs_ptr future_get_mongoc_gridfs_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_gridfs_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_insert_flags_t future_get_mongoc_insert_flags_t (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_insert_flags_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_iovec_ptr future_get_mongoc_iovec_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_iovec_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_server_stream_ptr future_get_mongoc_server_stream_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_server_stream_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_query_flags_t future_get_mongoc_query_flags_t (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_query_flags_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_server_description_ptr future_get_mongoc_server_description_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_server_description_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_ss_optype_t future_get_mongoc_ss_optype_t (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_ss_optype_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_topology_ptr future_get_mongoc_topology_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_topology_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_write_concern_ptr future_get_mongoc_write_concern_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_write_concern_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_change_stream_ptr future_get_mongoc_change_stream_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_change_stream_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_remove_flags_t future_get_mongoc_remove_flags_t (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_remove_flags_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_bulkwrite_ptr future_get_mongoc_bulkwrite_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_bulkwrite_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_bulkwritereturn_t future_get_mongoc_bulkwritereturn_t (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_bulkwritereturn_t (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_find_and_modify_opts_ptr future_get_const_mongoc_find_and_modify_opts_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_find_and_modify_opts_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_iovec_ptr future_get_const_mongoc_iovec_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_iovec_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_read_prefs_ptr future_get_const_mongoc_read_prefs_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_read_prefs_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_write_concern_ptr future_get_const_mongoc_write_concern_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_write_concern_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_ss_log_context_ptr future_get_const_mongoc_ss_log_context_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_ss_log_context_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } mongoc_index_model_t_ptr_const_ptr future_get_mongoc_index_model_t_ptr_const_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_mongoc_index_model_t_ptr_const_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } const_mongoc_bulkwriteopts_ptr future_get_const_mongoc_bulkwriteopts_ptr (future_t *future) { if (future_wait (future)) { return future_value_get_const_mongoc_bulkwriteopts_ptr (&future->return_value); } FUTURE_TIMEOUT_ABORT; } future_t * future_new (future_value_type_t return_type, int argc) { future_t *future; future = (future_t *)bson_malloc0 (sizeof *future); future->return_value.type = return_type; future->argc = argc; future->argv = (future_value_t *)bson_malloc0 ((size_t) argc * sizeof(future_value_t)); mongoc_cond_init (&future->cond); bson_mutex_init (&future->mutex); return future; } future_value_t * future_get_param (future_t *future, int i) { return &future->argv[i]; } void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)) { int r = mcommon_thread_create (&future->thread, start_routine, (void *) future); BSON_ASSERT (!r); } void future_resolve (future_t *future, future_value_t return_value) { bson_mutex_lock (&future->mutex); BSON_ASSERT (!future->resolved); BSON_ASSERT (future->return_value.type == return_value.type); future->return_value = return_value; future->resolved = true; mongoc_cond_signal (&future->cond); bson_mutex_unlock (&future->mutex); } bool future_wait_max (future_t *future, int64_t timeout_ms) { int64_t remaining_usec = timeout_ms * 1000; int64_t deadline = bson_get_monotonic_time () + timeout_ms * 1000; bool resolved; bson_mutex_lock (&future->mutex); while (!future->resolved && remaining_usec > 0) { mongoc_cond_timedwait (&future->cond, &future->mutex, remaining_usec / 1000); remaining_usec = deadline - bson_get_monotonic_time (); } resolved = future->resolved; bson_mutex_unlock (&future->mutex); if (resolved) { future->awaited = true; /* free memory */ mcommon_thread_join (future->thread); } return resolved; } bool future_wait (future_t *future) { return future_wait_max (future, get_future_timeout_ms ()); } void future_destroy (future_t *future) { BSON_ASSERT (future->awaited); bson_free (future->argv); mongoc_cond_destroy (&future->cond); bson_mutex_destroy (&future->mutex); bson_free (future); } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/future.h000066400000000000000000000103021511661753600242570ustar00rootroot00000000000000#ifndef FUTURE_H #define FUTURE_H #include #include #include /************************************************** * * Generated by build/generate-future-functions.py. * * DO NOT EDIT THIS FILE. * *************************************************/ /* clang-format off */ typedef struct { bool resolved; bool awaited; future_value_t return_value; int argc; future_value_t *argv; mongoc_cond_t cond; bson_mutex_t mutex; bson_thread_t thread; } future_t; future_t *future_new (future_value_type_t return_type, int argc); future_value_t *future_get_param (future_t *future, int i); void future_start (future_t *future, BSON_THREAD_FUN_TYPE (start_routine)); void future_resolve (future_t *future, future_value_t return_value); bool future_wait (future_t *future); bool future_wait_max (future_t *future, int64_t timeout_ms); void future_get_void (future_t *future); bool future_get_bool (future_t *future); char_ptr future_get_char_ptr (future_t *future); char_ptr_ptr future_get_char_ptr_ptr (future_t *future); int future_get_int (future_t *future); int64_t future_get_int64_t (future_t *future); size_t future_get_size_t (future_t *future); ssize_t future_get_ssize_t (future_t *future); uint32_t future_get_uint32_t (future_t *future); void_ptr future_get_void_ptr (future_t *future); const_char_ptr future_get_const_char_ptr (future_t *future); bool_ptr future_get_bool_ptr (future_t *future); bson_error_ptr future_get_bson_error_ptr (future_t *future); bson_ptr future_get_bson_ptr (future_t *future); const_bson_ptr future_get_const_bson_ptr (future_t *future); const_bson_ptr_ptr future_get_const_bson_ptr_ptr (future_t *future); mongoc_async_ptr future_get_mongoc_async_ptr (future_t *future); mongoc_bulk_operation_ptr future_get_mongoc_bulk_operation_ptr (future_t *future); mongoc_client_ptr future_get_mongoc_client_ptr (future_t *future); mongoc_client_pool_ptr future_get_mongoc_client_pool_ptr (future_t *future); mongoc_collection_ptr future_get_mongoc_collection_ptr (future_t *future); mongoc_cluster_ptr future_get_mongoc_cluster_ptr (future_t *future); mongoc_cmd_parts_ptr future_get_mongoc_cmd_parts_ptr (future_t *future); mongoc_cursor_ptr future_get_mongoc_cursor_ptr (future_t *future); mongoc_database_ptr future_get_mongoc_database_ptr (future_t *future); mongoc_gridfs_file_ptr future_get_mongoc_gridfs_file_ptr (future_t *future); mongoc_gridfs_ptr future_get_mongoc_gridfs_ptr (future_t *future); mongoc_insert_flags_t future_get_mongoc_insert_flags_t (future_t *future); mongoc_iovec_ptr future_get_mongoc_iovec_ptr (future_t *future); mongoc_server_stream_ptr future_get_mongoc_server_stream_ptr (future_t *future); mongoc_query_flags_t future_get_mongoc_query_flags_t (future_t *future); mongoc_server_description_ptr future_get_mongoc_server_description_ptr (future_t *future); mongoc_ss_optype_t future_get_mongoc_ss_optype_t (future_t *future); mongoc_topology_ptr future_get_mongoc_topology_ptr (future_t *future); mongoc_write_concern_ptr future_get_mongoc_write_concern_ptr (future_t *future); mongoc_change_stream_ptr future_get_mongoc_change_stream_ptr (future_t *future); mongoc_remove_flags_t future_get_mongoc_remove_flags_t (future_t *future); mongoc_bulkwrite_ptr future_get_mongoc_bulkwrite_ptr (future_t *future); mongoc_bulkwritereturn_t future_get_mongoc_bulkwritereturn_t (future_t *future); const_mongoc_find_and_modify_opts_ptr future_get_const_mongoc_find_and_modify_opts_ptr (future_t *future); const_mongoc_iovec_ptr future_get_const_mongoc_iovec_ptr (future_t *future); const_mongoc_read_prefs_ptr future_get_const_mongoc_read_prefs_ptr (future_t *future); const_mongoc_write_concern_ptr future_get_const_mongoc_write_concern_ptr (future_t *future); const_mongoc_ss_log_context_ptr future_get_const_mongoc_ss_log_context_ptr (future_t *future); mongoc_index_model_t_ptr_const_ptr future_get_mongoc_index_model_t_ptr_const_ptr (future_t *future); const_mongoc_bulkwriteopts_ptr future_get_const_mongoc_bulkwriteopts_ptr (future_t *future); void future_destroy (future_t *future); #endif /* FUTURE_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/mock-rs.c000066400000000000000000000425761511661753600243350ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./mock-rs.h" #include "./sync-queue.h" #include #include #include #include #include #include struct _mock_rs_t { bool has_primary; int n_secondaries; int n_arbiters; int32_t max_wire_version; int64_t request_timeout_msec; mock_server_t *primary; mongoc_array_t secondaries; mongoc_array_t arbiters; mongoc_array_t servers; char *hosts_str; mongoc_uri_t *uri; sync_queue_t *q; bson_t primary_tags; bson_t **secondary_tags; }; mock_server_t * get_server(mongoc_array_t *servers, size_t i) { return _mongoc_array_index(servers, mock_server_t *, i); } void append_array(mongoc_array_t *dst, mongoc_array_t *src) { _mongoc_array_append_vals(dst, src->data, (uint32_t)src->len); } /* a string like: "localhost:1","localhost:2","localhost:3" */ char * hosts(mongoc_array_t *servers) { const char *host_and_port; mcommon_string_append_t hosts_str; mcommon_string_new_as_append(&hosts_str); for (size_t i = 0u; i < servers->len; i++) { host_and_port = mock_server_get_host_and_port(get_server(servers, i)); mcommon_string_append_printf(&hosts_str, "\"%s\"", host_and_port); if (i + 1u < servers->len) { mcommon_string_append_printf(&hosts_str, ", "); } } return mcommon_string_from_append_destroy_with_steal(&hosts_str); } mongoc_uri_t * make_uri(mongoc_array_t *servers) { const char *host_and_port; mcommon_string_append_t uri_str; mcommon_string_new_as_append(&uri_str); mongoc_uri_t *uri; mcommon_string_append(&uri_str, "mongodb://"); for (size_t i = 0u; i < servers->len; i++) { host_and_port = mock_server_get_host_and_port(get_server(servers, i)); mcommon_string_append(&uri_str, host_and_port); if (i + 1u < servers->len) { mcommon_string_append(&uri_str, ","); } } mcommon_string_append(&uri_str, "/?replicaSet=rs"); uri = mongoc_uri_new(mcommon_str_from_append(&uri_str)); // Many mock server tests do not expect retryable handshakes. Disable by // default: tests that expect or require retryable handshakes must opt-in. mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, false); mcommon_string_from_append_destroy(&uri_str); return uri; } static char * hello_json(mock_rs_t *rs, mongoc_server_description_type_t type, const bson_t *tags) { char *server_type; char *tags_json; char *hosts_str; char *json; if (type == MONGOC_SERVER_RS_PRIMARY) { server_type = "'isWritablePrimary': true, 'secondary': false,"; } else if (type == MONGOC_SERVER_RS_SECONDARY) { server_type = "'isWritablePrimary': false, 'secondary': true,"; } else { BSON_ASSERT(type == MONGOC_SERVER_RS_ARBITER); server_type = "'isWritablePrimary': false, 'arbiterOnly': true,"; } if (bson_empty0(tags)) { tags_json = bson_strdup("{}"); } else { tags_json = bson_as_relaxed_extended_json(tags, NULL); } hosts_str = hosts(&rs->servers); json = bson_strdup_printf("{'ok': 1," " %s" " '$clusterTime': {" " 'clusterTime': {'$timestamp': {'t': 1, 'i': 1}}," " 'signature': {" " 'hash': {'$binary': {'subType': '0', 'base64': ''}}," " 'keyId': {'$numberLong': '6446735049323708417'}" " }," " 'operationTime': {'$timestamp': {'t': 1, 'i': 1}}" " }," "'logicalSessionTimeoutMinutes': 30," " 'tags': %s," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'setName': 'rs'," " 'hosts': [%s]}", server_type, tags_json, WIRE_VERSION_MIN, rs->max_wire_version, hosts_str); bson_free(tags_json); bson_free(hosts_str); return json; } static char * primary_json(mock_rs_t *rs) { return hello_json(rs, MONGOC_SERVER_RS_PRIMARY, &rs->primary_tags); } static char * secondary_json(mock_rs_t *rs, int server_number) { return hello_json(rs, MONGOC_SERVER_RS_SECONDARY, rs->secondary_tags[server_number]); } static char * arbiter_json(mock_rs_t *rs) { return hello_json(rs, MONGOC_SERVER_RS_ARBITER, NULL); } /*-------------------------------------------------------------------------- * * mock_rs_with_auto_hello -- * * A new mock replica set. Each member autoresponds to hello. * Call mock_rs_run to start it, then mock_rs_get_uri to connect. * * Returns: * A replica set you must mock_rs_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mock_rs_t * mock_rs_with_auto_hello(int32_t max_wire_version, bool has_primary, int n_secondaries, int n_arbiters) { int i; mock_rs_t *rs = BSON_ALIGNED_ALLOC0(mock_rs_t); ASSERT_WITH_MSG(max_wire_version >= WIRE_VERSION_MIN, "max_wire_version %" PRId32 " must be greater than or equal to minimum wire version %d", max_wire_version, WIRE_VERSION_MIN); rs->max_wire_version = max_wire_version; rs->has_primary = has_primary; rs->n_secondaries = n_secondaries; rs->n_arbiters = n_arbiters; rs->request_timeout_msec = get_future_timeout_ms(); rs->q = q_new(); bson_init(&rs->primary_tags); rs->secondary_tags = bson_malloc(n_secondaries * sizeof(bson_t *)); for (i = 0; i < n_secondaries; i++) { rs->secondary_tags[i] = bson_new(); } return rs; } void mock_rs_tag_secondary(mock_rs_t *rs, int server_number, const bson_t *tags) { bson_destroy(rs->secondary_tags[server_number]); rs->secondary_tags[server_number] = bson_copy(tags); } static void mock_rs_auto_endsessions(mock_rs_t *rs) { for (size_t i = 0u; i < rs->servers.len; i++) { mock_server_auto_endsessions(get_server(&rs->servers, i)); } } /*-------------------------------------------------------------------------- * * mock_rs_set_request_timeout_msec -- * * How long mock_rs_receives_* functions wait for a client * request before giving up and returning NULL. * *-------------------------------------------------------------------------- */ void mock_rs_set_request_timeout_msec(mock_rs_t *rs, int64_t request_timeout_msec) { rs->request_timeout_msec = request_timeout_msec; } static bool rs_q_append(request_t *request, void *data) { mock_rs_t *rs = (mock_rs_t *)data; q_put(rs->q, (void *)request); return true; /* handled */ } /*-------------------------------------------------------------------------- * * mock_rs_run -- * * Start each member listening on an unused port. After this, call * mock_rs_get_uri to connect. * * Returns: * None. * * Side effects: * The replica set's URI is set. * *-------------------------------------------------------------------------- */ void mock_rs_run(mock_rs_t *rs) { mock_server_t *server; char *hello; if (rs->has_primary) { /* start primary */ rs->primary = mock_server_new(); mock_server_run(rs->primary); } /* start secondaries */ _mongoc_array_init(&rs->secondaries, sizeof(mock_server_t *)); for (int i = 0; i < rs->n_secondaries; i++) { server = mock_server_new(); mock_server_run(server); _mongoc_array_append_val(&rs->secondaries, server); } /* start arbiters */ _mongoc_array_init(&rs->arbiters, sizeof(mock_server_t *)); for (int i = 0; i < rs->n_arbiters; i++) { server = mock_server_new(); mock_server_run(server); _mongoc_array_append_val(&rs->arbiters, server); } /* add all servers to replica set */ _mongoc_array_init(&rs->servers, sizeof(mock_server_t *)); if (rs->has_primary) { _mongoc_array_append_val(&rs->servers, rs->primary); } append_array(&rs->servers, &rs->secondaries); append_array(&rs->servers, &rs->arbiters); /* enqueue unhandled requests in rs->q, they're retrieved with * mock_rs_receives_query() &co. rs_q_append is added first so it * runs last, after auto_hello. */ for (size_t i = 0u; i < rs->servers.len; i++) { mock_server_autoresponds(get_server(&rs->servers, i), rs_q_append, (void *)rs, NULL); } /* now we know all servers' ports and we have them in one array */ rs->hosts_str = hosts(&rs->servers); rs->uri = make_uri(&rs->servers); BSON_ASSERT(rs->max_wire_version > 0); if (rs->has_primary) { /* primary's hello response */ hello = primary_json(rs); mock_server_auto_hello(rs->primary, hello); bson_free(hello); } /* secondaries' hello response */ for (int i = 0; i < rs->n_secondaries; i++) { hello = secondary_json(rs, i); mock_server_auto_hello(get_server(&rs->secondaries, (size_t)i), hello); bson_free(hello); } /* arbiters' hello response */ hello = arbiter_json(rs); for (int i = 0; i < rs->n_arbiters; i++) { mock_server_auto_hello(get_server(&rs->arbiters, (size_t)i), hello); } bson_free(hello); mock_rs_auto_endsessions(rs); } /*-------------------------------------------------------------------------- * * mock_rs_get_uri -- * * Call after mock_rs_run to get the connection string. * * Returns: * A const URI. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_uri_t * mock_rs_get_uri(mock_rs_t *rs) { return rs->uri; } /*-------------------------------------------------------------------------- * * mock_rs_receives_request -- * * Pop a client request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the request. * * Side effects: * None. * *-------------------------------------------------------------------------- */ request_t * mock_rs_receives_request(mock_rs_t *rs) { return (request_t *)q_get(rs->q, rs->request_timeout_msec); } /*-------------------------------------------------------------------------- * * mock_rs_receives_msg -- * * Pop a client OP_MSG request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. Pass varargs * list of bson_t pointers, which are matched to the series of * documents in the request, regardless of section boundaries. * * Returns: * A request you must request_destroy. * * Side effects: * Logs and aborts if the current request is not an OP_MSG matching * flags and documents. * *-------------------------------------------------------------------------- */ request_t * _mock_rs_receives_msg(mock_rs_t *rs, uint32_t flags, ...) { request_t *request; va_list args; bool r; request = (request_t *)q_get(rs->q, rs->request_timeout_msec); ASSERT_WITH_MSG(request, "expected an OP_MSG request but did not receive one!"); va_start(args, flags); r = request_matches_msgv(request, flags, &args); va_end(args); if (!r) { request_destroy(request); return NULL; } return request; } /*-------------------------------------------------------------------------- * * mock_rs_receives_kill_cursors -- * * Pop a client request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. * * Real-life OP_KILLCURSORS can take multiple ids, but that is * not yet supported here. * * Returns: * A request you must request_destroy, or NULL if the request * does not match. * * Side effects: * Logs if the current request is not an OP_KILLCURSORS with the * expected cursor_id. * *-------------------------------------------------------------------------- */ request_t * mock_rs_receives_kill_cursors(mock_rs_t *rs, int64_t cursor_id) { request_t *request; request = (request_t *)q_get(rs->q, rs->request_timeout_msec); if (request && !request_matches_kill_cursors(request, cursor_id)) { request_destroy(request); return NULL; } return request; } static mongoc_server_description_type_t _mock_rs_server_type(mock_rs_t *rs, uint16_t port) { if (rs->primary && port == mock_server_get_port(rs->primary)) { return MONGOC_SERVER_RS_PRIMARY; } for (size_t i = 0u; i < rs->secondaries.len; i++) { if (port == mock_server_get_port(get_server(&rs->secondaries, i))) { return MONGOC_SERVER_RS_SECONDARY; } } for (size_t i = 0u; i < rs->arbiters.len; i++) { if (port == mock_server_get_port(get_server(&rs->arbiters, i))) { return MONGOC_SERVER_RS_ARBITER; } } return MONGOC_SERVER_UNKNOWN; } /*-------------------------------------------------------------------------- * * mock_rs_request_is_to_primary -- * * Check that the request is non-NULL and sent to a * primary in this replica set. * * Returns: * True if so. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool mock_rs_request_is_to_primary(mock_rs_t *rs, request_t *request) { BSON_ASSERT(request); return MONGOC_SERVER_RS_PRIMARY == _mock_rs_server_type(rs, request_get_server_port(request)); } /*-------------------------------------------------------------------------- * * mock_rs_request_is_to_secondary -- * * Check that the request is non-NULL and sent to a * secondary in this replica set. * * Returns: * True if so. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool mock_rs_request_is_to_secondary(mock_rs_t *rs, request_t *request) { BSON_ASSERT(request); return MONGOC_SERVER_RS_SECONDARY == _mock_rs_server_type(rs, request_get_server_port(request)); } /*-------------------------------------------------------------------------- * * mock_rs_stepdown -- * * Change the primary to a secondary. * *-------------------------------------------------------------------------- */ void mock_rs_stepdown(mock_rs_t *rs) { char *json; BSON_ASSERT(rs->primary); rs->n_secondaries++; rs->secondary_tags = bson_realloc(rs->secondary_tags, rs->n_secondaries * sizeof(bson_t *)); rs->secondary_tags[rs->n_secondaries - 1] = bson_copy(&rs->primary_tags); bson_reinit(&rs->primary_tags); json = secondary_json(rs, rs->n_secondaries - 1); mock_server_auto_hello(rs->primary, json); bson_free(json); _mongoc_array_append_val(&rs->secondaries, rs->primary); rs->primary = NULL; } /*-------------------------------------------------------------------------- * * mock_rs_elect -- * * Change a secondary to the primary. * *-------------------------------------------------------------------------- */ void mock_rs_elect(mock_rs_t *rs, size_t id) { char *json; mock_server_t **ptrs; BSON_ASSERT(!rs->primary); BSON_ASSERT(id < rs->secondaries.len); rs->primary = get_server(&rs->secondaries, id); /* as the secondary becomes primary, its tags come along */ bson_destroy(&rs->primary_tags); BSON_ASSERT(bson_steal(&rs->primary_tags, rs->secondary_tags[id])); /* primary_json() uses the current primary_tags */ json = primary_json(rs); mock_server_auto_hello(rs->primary, json); bson_free(json); ptrs = (mock_server_t **)rs->secondaries.data; for (size_t i = id + 1u; i < rs->secondaries.len; i++) { ptrs[i - 1u] = ptrs[i]; rs->secondary_tags[i - 1u] = rs->secondary_tags[i]; } rs->secondaries.len--; rs->n_secondaries--; } /*-------------------------------------------------------------------------- * * mock_rs_destroy -- * * Free a mock_rs_t. * * Returns: * None. * * Side effects: * Destroys each member mock_server_t, closes sockets, joins threads. * *-------------------------------------------------------------------------- */ void mock_rs_destroy(mock_rs_t *rs) { for (size_t i = 0u; i < rs->servers.len; i++) { mock_server_destroy(get_server(&rs->servers, i)); } _mongoc_array_destroy(&rs->secondaries); _mongoc_array_destroy(&rs->arbiters); _mongoc_array_destroy(&rs->servers); bson_free(rs->hosts_str); mongoc_uri_destroy(rs->uri); q_destroy(rs->q); bson_destroy(&rs->primary_tags); for (int i = 0u; i < rs->n_secondaries; i++) { bson_destroy(rs->secondary_tags[i]); } bson_free(rs->secondary_tags); bson_free(rs); } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/mock-rs.h000066400000000000000000000032531511661753600243270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MOCK_RS_H #define MOCK_RS_H #include "./mock-server.h" #include typedef struct _mock_rs_t mock_rs_t; mock_rs_t * mock_rs_with_auto_hello(int32_t max_wire_version, bool has_primary, int n_secondaries, int n_arbiters); void mock_rs_tag_secondary(mock_rs_t *rs, int server_number, const bson_t *tags); void mock_rs_set_request_timeout_msec(mock_rs_t *rs, int64_t request_timeout_msec); void mock_rs_run(mock_rs_t *rs); const mongoc_uri_t * mock_rs_get_uri(mock_rs_t *rs); request_t * mock_rs_receives_request(mock_rs_t *rs); request_t * mock_rs_receives_kill_cursors(mock_rs_t *rs, int64_t cursor_id); request_t * _mock_rs_receives_msg(mock_rs_t *rs, uint32_t flags, ...); #define mock_rs_receives_msg(_rs, _flags, ...) _mock_rs_receives_msg(_rs, _flags, __VA_ARGS__, NULL) bool mock_rs_request_is_to_primary(mock_rs_t *rs, request_t *request); bool mock_rs_request_is_to_secondary(mock_rs_t *rs, request_t *request); void mock_rs_stepdown(mock_rs_t *rs); void mock_rs_elect(mock_rs_t *rs, size_t id); void mock_rs_destroy(mock_rs_t *rs); #endif /* MOCK_RS_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/mock-server.c000066400000000000000000001627241511661753600252150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "../TestSuite.h" #include "../test-conveniences.h" #include "../test-libmongoc.h" #include "./mock-server.h" #include "./sync-queue.h" #include #include #include #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif /* /Async/hello_ssl and /TOPOLOGY/scanner_ssl need a reasonable timeout */ #define TIMEOUT 5000 struct _mock_server_t { bool running; bool stopped; bool rand_delay; int64_t request_timeout_msec; uint16_t port; mongoc_socket_t *sock; char *uri_str; mongoc_uri_t *uri; bson_thread_t main_thread; mongoc_cond_t cond; bson_mutex_t mutex; int32_t last_response_id; mongoc_array_t worker_threads; sync_queue_t *q; mongoc_array_t autoresponders; int last_autoresponder_id; int64_t start_time; #ifdef MONGOC_ENABLE_SSL bool ssl; mongoc_ssl_opt_t ssl_opts; #endif mock_server_bind_opts_t bind_opts; }; struct _autoresponder_handle_t { autoresponder_t responder; void *data; destructor_t destructor; int id; }; struct _hello_callback_t { hello_callback_func_t callback_func; void *data; destructor_t destructor; }; typedef enum { REPLY, HANGUP, RESET } reply_type_t; typedef struct { reply_type_t type; mongoc_reply_flags_t flags; bson_t *docs; int n_docs; int64_t cursor_id; uint16_t client_port; int32_t request_opcode; int32_t query_flags; uint32_t opmsg_flags; int32_t response_to; } reply_t; static BSON_THREAD_FUN(main_thread, data); static BSON_THREAD_FUN(worker_thread, data); static void _mock_server_reply_with_stream(mock_server_t *server, reply_t *reply, mongoc_stream_t *client); void autoresponder_handle_destroy(autoresponder_handle_t *handle); static uint16_t get_port(mongoc_socket_t *sock); /*-------------------------------------------------------------------------- * * mock_server_new -- * * Get a new mock_server_t. Call mock_server_run to start it, * then mock_server_get_uri to connect. * * This server does not autorespond to "hello". * * Returns: * A server you must mock_server_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mock_server_t * mock_server_new(void) { mock_server_t *server = (mock_server_t *)bson_malloc0(sizeof(mock_server_t)); server->request_timeout_msec = get_future_timeout_ms(); _mongoc_array_init(&server->autoresponders, sizeof(autoresponder_handle_t)); _mongoc_array_init(&server->worker_threads, sizeof(bson_thread_t)); mongoc_cond_init(&server->cond); bson_mutex_init(&server->mutex); server->q = q_new(); server->start_time = bson_get_monotonic_time(); return server; } /*-------------------------------------------------------------------------- * * mock_server_with_auto_hello -- * * A new mock_server_t that autoresponds to hello. Call * mock_server_run to start it, then mock_server_get_uri to * connect. * * Returns: * A server you must mock_server_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mock_server_t * mock_server_with_auto_hello(int32_t max_wire_version) { mock_server_t *server = mock_server_new(); ASSERT_WITH_MSG(max_wire_version >= WIRE_VERSION_MIN, "max_wire_version %" PRId32 " must be greater than or equal to minimum wire version %d", max_wire_version, WIRE_VERSION_MIN); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, max_wire_version); return server; } /*-------------------------------------------------------------------------- * * mock_mongos_new -- * * A new mock_server_t that autoresponds to hello as if it were a * mongos. Call mock_server_run to start it, then mock_server_get_uri * to connect. * * Returns: * A server you must mock_server_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mock_server_t * mock_mongos_new(int32_t max_wire_version) { mock_server_t *server = mock_server_new(); ASSERT_WITH_MSG(max_wire_version >= WIRE_VERSION_MIN, "max_wire_version %" PRId32 " must be greater than or equal to minimum wire version %d", max_wire_version, WIRE_VERSION_MIN); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'msg': 'isdbgrid'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " '$clusterTime': {" " 'clusterTime': {'$timestamp': {'t': 1, 'i': 1}}," " 'signature': {" " 'hash': {'$binary': {'subType': '0', 'base64': ''}}," " 'keyId': {'$numberLong': '6446735049323708417'}" " }," " 'operationTime': {'$timestamp': {'t': 1, 'i': 1}}}," " 'logicalSessionTimeoutMinutes': 30}", WIRE_VERSION_MIN, max_wire_version); return server; } static bool hangup(request_t *request, void *ctx) { BSON_UNUSED(ctx); reply_to_request_with_hang_up(request); request_destroy(request); return true; } /*-------------------------------------------------------------------------- * * mock_server_down -- * * A new mock_server_t hangs up. Call mock_server_run to start it, * then mock_server_get_uri to connect. * * Returns: * A server you must mock_server_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mock_server_t * mock_server_down(void) { mock_server_t *server = mock_server_new(); mock_server_autoresponds(server, hangup, NULL, NULL); return server; } #ifdef MONGOC_ENABLE_SSL /*-------------------------------------------------------------------------- * * mock_server_set_ssl_opts -- * * Set server-side SSL options before calling mock_server_run. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void mock_server_set_ssl_opts(mock_server_t *server, mongoc_ssl_opt_t *opts) { bson_mutex_lock(&server->mutex); server->ssl = true; memcpy(&server->ssl_opts, opts, sizeof *opts); bson_mutex_unlock(&server->mutex); } #endif /*-------------------------------------------------------------------------- * * mock_server_run -- * * Start listening on an unused port. After this, call * mock_server_get_uri to connect. * * Returns: * The bound port. * * Side effects: * The server's port and URI are set. * *-------------------------------------------------------------------------- */ uint16_t mock_server_run(mock_server_t *server) { mongoc_socket_t *ssock; struct sockaddr_in default_bind_addr; struct sockaddr_in *bind_addr; int optval; uint16_t bound_port; size_t bind_addr_len = 0; int r; ssock = mongoc_socket_new(server->bind_opts.family ? server->bind_opts.family : AF_INET, SOCK_STREAM, 0); if (!ssock) { perror("Failed to create socket."); return 0; } optval = 1; mongoc_socket_setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); optval = server->bind_opts.ipv6_only; mongoc_socket_setsockopt(ssock, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)); memset(&default_bind_addr, 0, sizeof default_bind_addr); default_bind_addr.sin_family = AF_INET; default_bind_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* bind to unused port */ default_bind_addr.sin_port = htons(0); if (server->bind_opts.bind_addr) { bind_addr = server->bind_opts.bind_addr; bind_addr_len = server->bind_opts.bind_addr_len; } else { bind_addr = &default_bind_addr; bind_addr_len = sizeof(default_bind_addr); } // socklen_t: an unsigned opaque integral type of length of at least 32 bits. // To forestall portability problems, it is recommended that applications // should not use values larger than 2^32 - 1. BSON_ASSERT(mlib_in_range(uint32_t, bind_addr_len)); if (-1 == mongoc_socket_bind(ssock, (struct sockaddr *)bind_addr, (uint32_t)bind_addr_len)) { perror("Failed to bind socket"); return 0; } if (-1 == mongoc_socket_listen(ssock, 10)) { perror("Failed to put socket into listen mode"); return 0; } bound_port = get_port(ssock); if (!bound_port) { perror("Failed to get bound port number"); return 0; } MONGOC_INFO("Starting mock server on port %d.", bound_port); bson_mutex_lock(&server->mutex); server->sock = ssock; server->port = bound_port; /* TODO: configurable timeouts, perhaps from env */ server->uri_str = bson_strdup_printf("mongodb://127.0.0.1:%hu/?serverselectiontimeoutms=10000&" "sockettimeoutms=10000", bound_port); server->uri = mongoc_uri_new(server->uri_str); // Many mock server tests do not expect retryable handshakes. Disable by // default: tests that expect or require retryable handshakes must opt-in. mongoc_uri_set_option_as_bool(server->uri, MONGOC_URI_RETRYREADS, false); mongoc_uri_set_option_as_bool(server->uri, MONGOC_URI_RETRYWRITES, false); r = mcommon_thread_create(&server->main_thread, main_thread, (void *)server); BSON_ASSERT(r == 0); while (!server->running) { mongoc_cond_wait(&server->cond, &server->mutex); } bson_mutex_unlock(&server->mutex); test_suite_mock_server_log("listening on port %hu", bound_port); return (uint16_t)bound_port; } /*-------------------------------------------------------------------------- * * mock_server_autoresponds -- * * Respond to matching requests. "data" is passed to the responder * callback, and passed to "destructor" when the autoresponder is * destroyed. * * Responders are run most-recently-added-first until one returns * true to indicate it has handled the request. If none handles it, * the request is enqueued until a call to mock_server_receives_*. * * Autoresponders must call request_destroy after handling a * request. * * Returns: * An id for mock_server_remove_autoresponder. * * Side effects: * If a matching request is enqueued, pop it and respond. * *-------------------------------------------------------------------------- */ int mock_server_autoresponds(mock_server_t *server, autoresponder_t responder, void *data, destructor_t destructor) { autoresponder_handle_t handle = {responder, data, destructor}; int id; bson_mutex_lock(&server->mutex); id = handle.id = server->last_autoresponder_id++; /* TODO: peek and see if a matching request is enqueued */ _mongoc_array_append_val(&server->autoresponders, handle); bson_mutex_unlock(&server->mutex); return id; } /*-------------------------------------------------------------------------- * * mock_server_remove_autoresponder -- * * Remove a responder callback. Pass in the id returned by * mock_server_autoresponds. * * Returns: * None. * * Side effects: * The responder's destructor is called on its "data" pointer. * *-------------------------------------------------------------------------- */ void mock_server_remove_autoresponder(mock_server_t *server, int id) { size_t i; autoresponder_handle_t *handles; bson_mutex_lock(&server->mutex); handles = (autoresponder_handle_t *)server->autoresponders.data; for (i = 0; i < server->autoresponders.len; i++) { if (handles[i].id == id) { /* left-shift everyone after */ server->autoresponders.len--; for (; i < server->autoresponders.len; i++) { handles[i] = handles[i + 1]; } autoresponder_handle_destroy(handles); break; } } bson_mutex_unlock(&server->mutex); } static bool auto_hello_generate_response(request_t *request, void *data, bson_t *hello_response) { const char *response_json = (const char *)data; char *quotes_replaced; bson_error_t error; BSON_UNUSED(request); quotes_replaced = single_quotes_to_double(response_json); if (!bson_init_from_json(hello_response, quotes_replaced, -1, &error)) { test_error("%s", error.message); } bson_free(quotes_replaced); return true; } static bool auto_hello(request_t *request, void *data) { hello_callback_t *callback = (hello_callback_t *)data; bson_t response; bool is_hello; bool is_legacy_hello; char *response_json; bson_iter_t iter; if (!request->is_command) { return false; } /* Check whether we've got "hello" or legacy hello */ is_hello = strcasecmp(request->command_name, "hello") == 0; is_legacy_hello = strcasecmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) == 0; if (!is_hello && !is_legacy_hello) { return false; } if (!callback->callback_func(request, callback->data, &response)) { return false; } /* Convert responses for legacy hello */ if (bson_iter_init_find(&iter, &response, "isWritablePrimary")) { BSON_APPEND_BOOL(&response, HANDSHAKE_RESPONSE_LEGACY_HELLO, bson_iter_bool(&iter)); } else if (bson_iter_init_find(&iter, &response, HANDSHAKE_RESPONSE_LEGACY_HELLO)) { BSON_APPEND_BOOL(&response, "isWritablePrimary", bson_iter_bool(&iter)); } if (!bson_iter_init_find(&iter, &response, "minWireVersion")) { BSON_APPEND_INT32(&response, "minWireVersion", WIRE_VERSION_MIN); } if (!bson_iter_init_find(&iter, &response, "maxWireVersion")) { BSON_APPEND_INT32(&response, "maxWireVersion", WIRE_VERSION_MAX); } response_json = bson_as_relaxed_extended_json(&response, 0); if (mock_server_get_rand_delay(request->server)) { const int random_sleep = rand() % 10; mlib_sleep_for(random_sleep, ms); } reply_to_request(request, MONGOC_REPLY_NONE, 0, 0, 1, response_json); bson_destroy(&response); bson_free(response_json); request_destroy(request); return true; } static void hello_callback_free(void *data) { hello_callback_t *callback = (hello_callback_t *)data; if (callback->destructor) { callback->destructor(callback->data); } bson_free(callback); } int mock_server_auto_hello_callback(mock_server_t *server, hello_callback_func_t callback_func, void *data, destructor_t destructor) { hello_callback_t *callback = bson_malloc0(sizeof(hello_callback_t)); ASSERT(callback_func); callback->callback_func = callback_func; callback->data = data; callback->destructor = destructor; return mock_server_autoresponds(server, auto_hello, (void *)callback, hello_callback_free); } /*-------------------------------------------------------------------------- * * mock_server_auto_hello -- * * Autorespond to "hello" and legacy hello with the provided document. * * Returns: * An id for mock_server_remove_autoresponder. * * Side effects: * If a matching request is enqueued, pop it and respond. * *-------------------------------------------------------------------------- */ MONGOC_PRINTF_FORMAT(2, 3) int mock_server_auto_hello(mock_server_t *server, const char *response_json, ...) { char *formatted_response_json; va_list args; va_start(args, response_json); formatted_response_json = bson_strdupv_printf(response_json, args); va_end(args); return mock_server_auto_hello_callback( server, auto_hello_generate_response, (void *)formatted_response_json, bson_free); } static bool auto_endsessions(request_t *request, void *data) { BSON_UNUSED(data); if (!request->is_command || strcasecmp(request->command_name, "endSessions") != 0) { return false; } reply_to_request_with_ok_and_destroy(request); return true; } /*-------------------------------------------------------------------------- * * mock_server_auto_endsessions -- * * Autorespond to "endSessions". * * Returns: * An id for mock_server_remove_autoresponder. * * Side effects: * If a matching request is enqueued, pop it and respond. * *-------------------------------------------------------------------------- */ int mock_server_auto_endsessions(mock_server_t *server) { return mock_server_autoresponds(server, auto_endsessions, NULL, NULL); } /*-------------------------------------------------------------------------- * * mock_server_get_uri -- * * Call after mock_server_run to get the connection string. * * Returns: * A const URI. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_uri_t * mock_server_get_uri(mock_server_t *server) { mongoc_uri_t *uri; bson_mutex_lock(&server->mutex); uri = server->uri; bson_mutex_unlock(&server->mutex); return uri; } /*-------------------------------------------------------------------------- * * mock_server_get_host_and_port -- * * Call after mock_server_run to get the server's "host:port". * * Returns: * A const string. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const char * mock_server_get_host_and_port(mock_server_t *server) { const mongoc_uri_t *uri; uri = mock_server_get_uri(server); BSON_ASSERT(uri); /* must call after mock_server_run */ return (mongoc_uri_get_hosts(uri))->host_and_port; } /*-------------------------------------------------------------------------- * * mock_server_get_port -- * * Call after mock_server_run to get the server's listening port. * * Returns: * A port number. * * Side effects: * None. * *-------------------------------------------------------------------------- */ uint16_t mock_server_get_port(mock_server_t *server) { return server->port; } /*-------------------------------------------------------------------------- * * mock_server_get_request_timeout_msec -- * * How long mock_server_receives_* functions wait for a client * request before giving up and returning NULL. * *-------------------------------------------------------------------------- */ static int64_t mock_server_get_request_timeout_msec(mock_server_t *server) { int64_t request_timeout_msec; bson_mutex_lock(&server->mutex); request_timeout_msec = server->request_timeout_msec; bson_mutex_unlock(&server->mutex); return request_timeout_msec; } /*-------------------------------------------------------------------------- * * mock_server_set_request_timeout_msec -- * * How long mock_server_receives_* functions wait for a client * request before giving up and returning NULL. * *-------------------------------------------------------------------------- */ void mock_server_set_request_timeout_msec(mock_server_t *server, int64_t request_timeout_msec) { bson_mutex_lock(&server->mutex); server->request_timeout_msec = request_timeout_msec; bson_mutex_unlock(&server->mutex); } /*-------------------------------------------------------------------------- * * mock_server_get_rand_delay -- * * Does the server delay a random duration before responding? * *-------------------------------------------------------------------------- */ bool mock_server_get_rand_delay(mock_server_t *server) { bool rand_delay; bson_mutex_lock(&server->mutex); rand_delay = server->rand_delay; bson_mutex_unlock(&server->mutex); return rand_delay; } /*-------------------------------------------------------------------------- * * mock_server_set_rand_delay -- * * Whether to delay a random duration before responding. * *-------------------------------------------------------------------------- */ void mock_server_set_rand_delay(mock_server_t *server, bool rand_delay) { bson_mutex_lock(&server->mutex); server->rand_delay = rand_delay; bson_mutex_unlock(&server->mutex); } /*-------------------------------------------------------------------------- * * mock_server_get_uptime_sec -- * * How long since mock_server_run() was called. * *-------------------------------------------------------------------------- */ static double mock_server_get_uptime_sec(mock_server_t *server) { double uptime; bson_mutex_lock(&server->mutex); uptime = (bson_get_monotonic_time() - server->start_time) / 1e6; bson_mutex_unlock(&server->mutex); return uptime; } sync_queue_t * mock_server_get_queue(mock_server_t *server) { sync_queue_t *q; bson_mutex_lock(&server->mutex); q = server->q; bson_mutex_unlock(&server->mutex); return q; } static void request_assert_no_duplicate_keys(request_t *request) { for (size_t i = 0u; i < request->docs.len; i++) { assert_no_duplicate_keys(request_get_doc(request, i)); } } request_t * mock_server_receives_request(mock_server_t *server) { sync_queue_t *q; int64_t request_timeout_msec; request_t *r; q = mock_server_get_queue(server); request_timeout_msec = mock_server_get_request_timeout_msec(server); r = (request_t *)q_get(q, request_timeout_msec); if (r) { request_assert_no_duplicate_keys(r); } return r; } /*-------------------------------------------------------------------------- * * mock_server_receives_bulk_msg -- * * Pop a client OP_MSG request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. Pass * `msg_pattern`, which is matched to the series of exactly `n_doc` * documents in the request, regardless of section boundaries. * * Returns: * A request you must request_destroy, or NULL if the request does not * match. * * Side effects: * Logs and aborts if the current request is not an OP_MSG matching * flags and expected pattern and number of documents. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_bulk_msg( mock_server_t *server, uint32_t flags, const bson_t *msg_pattern, const bson_t *doc_pattern, size_t n_docs) { request_t *request; bool r; BSON_UNUSED(flags); request = mock_server_receives_request(server); { const bson_t **docs; size_t i; docs = bson_malloc(n_docs * sizeof(bson_t *)); docs[0] = msg_pattern; for (i = 1; i < n_docs; ++i) { docs[i] = doc_pattern; } r = request_matches_msg(request, MONGOC_MSG_NONE, docs, n_docs); bson_free((bson_t **)docs); } if (!r) { request_destroy(request); return NULL; } return request; } /*-------------------------------------------------------------------------- * * mock_server_receives_command -- * * Pop a client request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the request does * not match. * * Side effects: * Logs if the current request is not an OP_QUERY command matching * database_name, command_name, and command_json. * *-------------------------------------------------------------------------- */ MONGOC_PRINTF_FORMAT(4, 5) request_t * mock_server_receives_command( mock_server_t *server, const char *database_name, mongoc_query_flags_t flags, const char *command_json, ...) { va_list args; char *formatted_command_json = NULL; char *ns; request_t *request; va_start(args, command_json); if (command_json) { formatted_command_json = bson_strdupv_printf(command_json, args); } va_end(args); ns = bson_strdup_printf("%s.$cmd", database_name); request = mock_server_receives_request(server); if (request && !request_matches_query(request, ns, flags, 0, 1, formatted_command_json, NULL, true)) { request_destroy(request); request = NULL; } bson_free(formatted_command_json); bson_free(ns); return request; } /*-------------------------------------------------------------------------- * * mock_server_receives_msg -- * * Pop a client OP_MSG request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. Pass varargs * list of bson_t pointers, which are matched to the series of * documents in the request, regardless of section boundaries. * * Returns: * A request you must request_destroy. * * Side effects: * Logs and aborts if the current request is not an OP_MSG matching * flags and documents. * *-------------------------------------------------------------------------- */ request_t * _mock_server_receives_msg(mock_server_t *server, uint32_t flags, ...) { request_t *request; va_list args; bool r; request = mock_server_receives_request(server); va_start(args, flags); r = request_matches_msgv(request, flags, &args); va_end(args); if (!r) { request_destroy(request); return NULL; } return request; } request_t * _mock_server_receives_single_msg(mock_server_t *server, uint32_t flags, const bson_t *doc) { request_t *request; bool r; BSON_ASSERT(doc); request = mock_server_receives_request(server); r = request_matches_msg(request, flags, &doc, 1); if (!r) { request_destroy(request); return NULL; } return request; } static request_t * mock_server_matches_legacy_hello(request_t *request, const char *match_json); static request_t * mock_server_matches_any_hello_with_json(request_t *request, const char *match_json_op_msg, const char *match_json_op_query) { if (!request) { return NULL; } /* We check the opcode separately because request_matches_msg() and friends like to abort the program when checks fail: */ if (MONGOC_OPCODE_MSG == request->opcode) { bson_t *hello_doc = NULL; const char *hello_str = "{'hello': 1, 'maxAwaitTimeMS': { '$exists': false }}"; if (NULL != match_json_op_msg) hello_doc = tmp_bson(match_json_op_msg); else hello_doc = tmp_bson(hello_str); if (request_matches_msg(request, 0, /* flags */ (const bson_t **)&hello_doc, 1 /* number of documents */)) { return request; } } if (mock_server_matches_legacy_hello(request, match_json_op_query ? match_json_op_query : NULL)) { return request; } /* No match: */ request_destroy(request); return NULL; } /*-------------------------------------------------------------------------- * * mock_server_receives_any_hello-- * * Check first for an OP_MSG hello or an OP_QUERY with hello or legacy hello. * * Returns: * A request you must request_destroy, or NULL if the current * request is not a hello command. * * Side effects: * Logs if the current request is not a legacy hello command ("isMaster") * using OP_QUERY. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_any_hello(mock_server_t *server) { return mock_server_receives_any_hello_with_match(server, NULL, NULL); } /*-------------------------------------------------------------------------- * * mock_server_matches_legacy_hello -- * * Checks to see if a given request matches OP_QUERY hello or legacy hello. * * Returns: * A request you must request_destroy (the same one passed in), or * NULL if the current request is not a hello command. * * Side effects: * Logs if the current request is not hello command or legacy hello * command ("isMaster") using OP_QUERY. * *-------------------------------------------------------------------------- */ static request_t * mock_server_matches_legacy_hello(request_t *request, const char *match_json) { char *formatted_command_json = NULL; if (!request) { return NULL; } if (strcasecmp(request->command_name, "hello") && strcasecmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO)) { request_destroy(request); fprintf(stderr, "expected hello or legacy hello (\"%s\"), but got \"%s\"\n", HANDSHAKE_CMD_LEGACY_HELLO, request->command_name); return NULL; } formatted_command_json = bson_strdup_printf("{'%s': 1, 'maxAwaitTimeMS': { '$exists': false }}", request->command_name); /* request_matches_query() always checks for OPCODE_QUERY, used by legacy * hello: */ if (!request_matches_query(request, "admin.$cmd", MONGOC_QUERY_SECONDARY_OK, 0, 1, match_json ? match_json : formatted_command_json, NULL, true)) { request_destroy(request); request = NULL; } bson_free(formatted_command_json); return request; } /*-------------------------------------------------------------------------- * * mock_server_receives_legacy_hello -- * * Pop a client non-streaming hello call if one is enqueued, * or wait up to request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the current * request is not a hello command. * * Side effects: * Logs if the current request is not a legacy hello command ("isMaster") * using OP_QUERY. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_legacy_hello(mock_server_t *server, const char *match_json) { return mock_server_matches_legacy_hello(mock_server_receives_request(server), match_json); } /*-------------------------------------------------------------------------- * * mock_server_receives_hello -- * * Pop a client non-streaming hello call if one is enqueued, * or wait up to request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the current * request is not a hello command. * * Side effects: * Logs if the current request is a hello command using OP_QUERY. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_hello(mock_server_t *server) { return mock_server_receives_command( server, "admin", MONGOC_QUERY_SECONDARY_OK, "{'hello': 1, 'maxAwaitTimeMS': { '$exists': false }}"); } /*-------------------------------------------------------------------------- * * mock_server_receives_any_hello_with_match -- * * Pop a client non-streaming hello call if one is enqueued, * or wait up to request_timeout_ms for the client to send a request; * if non-NULL values are provided for either or both of the optional * match_json_op_msg or match_json_op_query parameters, the reply is * matched to those, as per request_matches_msg() or * mock_server_matches_legacy_hello(). * * Returns: * A request you must request_destroy, or NULL if the current * request is not a hello command. * * Side effects: * Logs if the current request uses OP_QUERY but is not hello or legacy * hello. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_any_hello_with_match(mock_server_t *server, const char *match_json_op_msg, const char *match_json_op_query) { request_t *request = mock_server_receives_request(server); if (NULL == request) { return NULL; } return mock_server_matches_any_hello_with_json(request, match_json_op_msg, match_json_op_query); } /*-------------------------------------------------------------------------- * * mock_server_receives_query -- * * Pop a client request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the request does * not match. * * Side effects: * Logs if the current request is not a query matching ns, flags, * skip, n_return, query_json, and fields_json. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_query(mock_server_t *server, const char *ns, mongoc_query_flags_t flags, uint32_t skip, int32_t n_return, const char *query_json, const char *fields_json) { request_t *request; request = mock_server_receives_request(server); if (request && !request_matches_query(request, ns, flags, skip, n_return, query_json, fields_json, false)) { request_destroy(request); return NULL; } return request; } /*-------------------------------------------------------------------------- * * mock_server_receives_hello_op_msg -- * * Pop a client non-streaming hello call if one is enqueued, * or wait up to request_timeout_ms for the client to send a request. * * Returns: * A request you must request_destroy, or NULL if the current * request is not a hello command. * * Side effects: * None. (See also request_matches_msg()). * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_hello_op_msg(mock_server_t *server) { return _mock_server_receives_single_msg(server, 0, tmp_bson("{'hello': 1, 'maxAwaitTimeMS': { '$exists': false }}")); } /*-------------------------------------------------------------------------- * * mock_server_receives_kill_cursors -- * * Pop a client request if one is enqueued, or wait up to * request_timeout_ms for the client to send a request. * * Real-life OP_KILLCURSORS can take multiple ids, but that is * not yet supported here. * * Returns: * A request you must request_destroy, or NULL if the request * does not match. * * Side effects: * Logs if the current request is not an OP_KILLCURSORS with the * expected cursor_id. * *-------------------------------------------------------------------------- */ request_t * mock_server_receives_kill_cursors(mock_server_t *server, int64_t cursor_id) { request_t *request; request = mock_server_receives_request(server); if (request && !request_matches_kill_cursors(request, cursor_id)) { request_destroy(request); return NULL; } return request; } /*-------------------------------------------------------------------------- * * reply_to_request_with_hang_up -- * * Hang up on a client request. * * Returns: * None. * * Side effects: * Causes a network error on the client side. * *-------------------------------------------------------------------------- */ void reply_to_request_with_hang_up(request_t *request) { reply_t *reply; test_suite_mock_server_log("%5.2f %hu <- %hu \thang up!", mock_server_get_uptime_sec(request->server), request->client_port, request_get_server_port(request)); reply = bson_malloc0(sizeof(reply_t)); reply->type = HANGUP; q_put(request->replies, reply); } /*-------------------------------------------------------------------------- * * reply_to_request_with_reset -- * * Forcefully reset a connection from the client. * * Returns: * None. * * Side effects: * Causes ECONNRESET on the client side. * *-------------------------------------------------------------------------- */ void reply_to_request_with_reset(request_t *request) { reply_t *reply; test_suite_mock_server_log("%5.2f %hu <- %hu \treset!", mock_server_get_uptime_sec(request->server), request->client_port, request_get_server_port(request)); reply = bson_malloc0(sizeof(reply_t)); reply->type = RESET; q_put(request->replies, reply); } /*-------------------------------------------------------------------------- * * reply_to_request -- * * Respond to a client request. * * Returns: * None. * * Side effects: * Sends an OP_REPLY to the client. * *-------------------------------------------------------------------------- */ void reply_to_request(request_t *request, mongoc_reply_flags_t flags, int64_t cursor_id, int32_t starting_from, int32_t number_returned, const char *docs_json) { char *quotes_replaced; bson_t doc; bson_error_t error; bool r; BSON_UNUSED(starting_from); BSON_UNUSED(number_returned); BSON_ASSERT(request); if (docs_json) { quotes_replaced = single_quotes_to_double(docs_json); r = bson_init_from_json(&doc, quotes_replaced, -1, &error); bson_free(quotes_replaced); } else { r = bson_init_from_json(&doc, "{}", -1, &error); } if (!r) { MONGOC_WARNING("%s", error.message); return; } reply_to_request_with_multiple_docs(request, flags, &doc, 1, cursor_id); bson_destroy(&doc); } /*-------------------------------------------------------------------------- * * reply_to_request_simple -- * * Respond to a client request. * * Returns: * None. * * Side effects: * Sends an OP_REPLY to the client. * *-------------------------------------------------------------------------- */ void reply_to_request_simple(request_t *request, const char *docs_json) { reply_to_request(request, MONGOC_REPLY_NONE, 0, 0, 1, docs_json); } /* To specify additional flags for OP_MSG replies. */ void reply_to_op_msg_request(request_t *request, mongoc_op_msg_flags_t flags, const bson_t *doc) { reply_t *reply; BSON_ASSERT(request); reply = bson_malloc0(sizeof(reply_t)); reply->opmsg_flags = flags; reply->n_docs = 1; reply->docs = BSON_ALIGNED_ALLOC0(bson_t); bson_copy_to(doc, &reply->docs[0]); reply->cursor_id = 0; reply->client_port = request_get_client_port(request); reply->request_opcode = MONGOC_OPCODE_MSG; reply->response_to = mcd_rpc_header_get_request_id(request->rpc); q_put(request->replies, reply); } /*-------------------------------------------------------------------------- * * reply_to_request_with_ok_and_destroy -- * * Respond to a client request. * * Returns: * None. * * Side effects: * Sends an OP_REPLY with "{ok: 1}" to the client. * *-------------------------------------------------------------------------- */ void reply_to_request_with_ok_and_destroy(request_t *request) { reply_to_request(request, MONGOC_REPLY_NONE, 0, 0, 1, "{'ok': 1}"); request_destroy(request); } /*-------------------------------------------------------------------------- * * reply_to_find_request -- * * Receive an OP_QUERY or "find" command and reply appropriately. * * Returns: * None. * * Side effects: * Very roughly validates the query or "find" command or aborts. * The intent is not to test the driver's query or find command * implementation here, see _test_kill_cursors for example use. * *-------------------------------------------------------------------------- */ void reply_to_find_request(request_t *request, mongoc_query_flags_t flags, int64_t cursor_id, int32_t number_returned, const char *ns, const char *reply_json, bool is_command) { char *find_reply; char *db; BSON_ASSERT_PARAM(request); db = _mongoc_get_db_name(ns); /* minimal validation, we're not testing query / find cmd here */ if (request->is_command && !is_command) { test_error("expected query, got command"); } if (!request->is_command && is_command) { test_error("expected command, got query"); } assert_request_matches_flags(request, flags); if (is_command) { find_reply = bson_strdup_printf("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '%" PRId64 "'}," " 'ns': '%s'," " 'firstBatch': [%s]}}", cursor_id, ns, reply_json); reply_to_request_simple(request, find_reply); bson_free(find_reply); } else { reply_to_request(request, MONGOC_REPLY_NONE, cursor_id, 0, number_returned, reply_json); } bson_free(db); } /*-------------------------------------------------------------------------- * * mock_server_destroy -- * * Free a mock_server_t. * * Returns: * None. * * Side effects: * Closes sockets, joins threads, and calls destructors passed * to mock_server_autoresponds. * *-------------------------------------------------------------------------- */ void mock_server_destroy(mock_server_t *server) { size_t i; autoresponder_handle_t *handle; int64_t deadline = bson_get_monotonic_time() + 10 * 1000 * 1000; request_t *request; if (!server) { return; } bson_mutex_lock(&server->mutex); if (server->running) { server->stopped = true; } bson_mutex_unlock(&server->mutex); while (bson_get_monotonic_time() <= deadline) { /* wait 10 seconds */ bson_mutex_lock(&server->mutex); if (!server->running) { bson_mutex_unlock(&server->mutex); break; } bson_mutex_unlock(&server->mutex); mlib_sleep_for(1, ms); } bson_mutex_lock(&server->mutex); if (server->running) { test_error("server still running after timeout"); } bson_mutex_unlock(&server->mutex); mcommon_thread_join(server->main_thread); _mongoc_array_destroy(&server->worker_threads); for (i = 0; i < server->autoresponders.len; i++) { handle = &_mongoc_array_index(&server->autoresponders, autoresponder_handle_t, i); autoresponder_handle_destroy(handle); } _mongoc_array_destroy(&server->autoresponders); mongoc_cond_destroy(&server->cond); bson_mutex_destroy(&server->mutex); mongoc_socket_destroy(server->sock); bson_free(server->uri_str); mongoc_uri_destroy(server->uri); while ((request = (request_t *)q_get_nowait(server->q))) { request_destroy(request); } q_destroy(server->q); bson_free(server); } static uint16_t get_port(mongoc_socket_t *sock) { struct sockaddr_storage bound_addr = {0}; mongoc_socklen_t addr_len = (mongoc_socklen_t)sizeof bound_addr; if (mongoc_socket_getsockname(sock, (struct sockaddr *)&bound_addr, &addr_len) < 0) { perror("Failed to get listening port number"); return 0; } if (bound_addr.ss_family == AF_INET6) { return ntohs(((struct sockaddr_in6 *)&bound_addr)->sin6_port); } else { return ntohs(((struct sockaddr_in *)&bound_addr)->sin_port); } } static bool _mock_server_stopping(mock_server_t *server) { bool stopped; bson_mutex_lock(&server->mutex); stopped = server->stopped; bson_mutex_unlock(&server->mutex); return stopped; } typedef struct worker_closure_t { mock_server_t *server; mongoc_stream_t *client_stream; uint16_t port; } worker_closure_t; static BSON_THREAD_FUN(main_thread, data) { mock_server_t *server = (mock_server_t *)data; mongoc_socket_t *client_sock; uint16_t port; mongoc_stream_t *client_stream; worker_closure_t *closure; bson_thread_t thread; mongoc_array_t worker_threads; size_t i; int r; bson_mutex_lock(&server->mutex); server->running = true; mongoc_cond_signal(&server->cond); bson_mutex_unlock(&server->mutex); for (;;) { client_sock = mongoc_socket_accept_ex(server->sock, bson_get_monotonic_time() + 100 * 1000, &port); if (_mock_server_stopping(server)) { mongoc_socket_destroy(client_sock); break; } if (client_sock) { test_suite_mock_server_log( "%5.2f %hu -> server port %hu (connected)", mock_server_get_uptime_sec(server), port, server->port); client_stream = mongoc_stream_socket_new(client_sock); #ifdef MONGOC_ENABLE_SSL bson_mutex_lock(&server->mutex); if (server->ssl) { mongoc_stream_t *tls_stream; server->ssl_opts.weak_cert_validation = 1; tls_stream = mongoc_stream_tls_new_with_hostname(client_stream, NULL, &server->ssl_opts, 0); if (!tls_stream) { mongoc_stream_destroy(client_stream); bson_mutex_unlock(&server->mutex); perror("Failed to attach tls stream"); break; } client_stream = tls_stream; } bson_mutex_unlock(&server->mutex); #endif closure = (worker_closure_t *)bson_malloc(sizeof *closure); closure->server = server; closure->client_stream = client_stream; closure->port = port; bson_mutex_lock(&server->mutex); r = mcommon_thread_create(&thread, worker_thread, closure); BSON_ASSERT(r == 0); _mongoc_array_append_val(&server->worker_threads, thread); bson_mutex_unlock(&server->mutex); } } /* copy list of worker threads and join them all */ _mongoc_array_init(&worker_threads, sizeof(bson_thread_t)); bson_mutex_lock(&server->mutex); _mongoc_array_copy(&worker_threads, &server->worker_threads); bson_mutex_unlock(&server->mutex); for (i = 0; i < worker_threads.len; i++) { mcommon_thread_join(_mongoc_array_index(&worker_threads, bson_thread_t, i)); } _mongoc_array_destroy(&worker_threads); bson_mutex_lock(&server->mutex); server->running = false; bson_mutex_unlock(&server->mutex); BSON_THREAD_RETURN; } static void _reply_destroy(reply_t *reply) { int i; for (i = 0; i < reply->n_docs; i++) { bson_destroy(&reply->docs[i]); } bson_free(reply->docs); bson_free(reply); } static BSON_THREAD_FUN(worker_thread, data) { worker_closure_t *closure = (worker_closure_t *)data; mock_server_t *server = closure->server; mongoc_stream_t *client_stream = closure->client_stream; mongoc_buffer_t buffer; bool handled; bson_error_t error; sync_queue_t *requests; sync_queue_t *replies; request_t *request; mongoc_array_t autoresponders; ssize_t i; autoresponder_handle_t handle; reply_t *reply; #ifdef MONGOC_ENABLE_SSL bool ssl; #endif ENTRY; /* queue of client replies sent over this worker's connection */ replies = q_new(); #ifdef MONGOC_ENABLE_SSL bson_mutex_lock(&server->mutex); ssl = server->ssl; bson_mutex_unlock(&server->mutex); if (ssl) { if (!mongoc_stream_tls_handshake_block(client_stream, "localhost", TIMEOUT, &error)) { mongoc_stream_close(client_stream); mongoc_stream_destroy(client_stream); bson_free(closure); q_destroy(replies); BSON_THREAD_RETURN; } } #endif _mongoc_buffer_init(&buffer, NULL, 0, NULL, NULL); _mongoc_array_init(&autoresponders, sizeof(autoresponder_handle_t)); again: /* loop, checking for requests to receive or replies to send */ if (_mongoc_buffer_fill(&buffer, client_stream, 4, 10, &error) > 0) { BSON_ASSERT(buffer.len >= 4); const int32_t msg_len = mlib_read_u32le(buffer.data); if (msg_len < 16) { MONGOC_WARNING("No data"); GOTO(failure); } if (_mongoc_buffer_fill(&buffer, client_stream, (size_t)msg_len, -1, &error) == -1) { MONGOC_WARNING("%s():%d: %s", BSON_FUNC, (int)(__LINE__), error.message); GOTO(failure); } BSON_ASSERT(buffer.len >= (unsigned)msg_len); /* copies message from buffer */ request = request_new(&buffer, msg_len, server, client_stream, closure->port, replies); memmove(buffer.data, buffer.data + msg_len, buffer.len - msg_len); buffer.len -= msg_len; bson_mutex_lock(&server->mutex); _mongoc_array_copy(&autoresponders, &server->autoresponders); bson_mutex_unlock(&server->mutex); test_suite_mock_server_log( "%5.2f %hu -> %hu %s", mock_server_get_uptime_sec(server), closure->port, server->port, request->as_str); /* run responders most-recently-added-first */ handled = false; for (i = server->autoresponders.len - 1u; i >= 0; i--) { handle = _mongoc_array_index(&server->autoresponders, autoresponder_handle_t, i); if (handle.responder(request, handle.data)) { /* responder destroyed request and enqueued a reply in "replies" */ handled = true; request = NULL; break; } } if (!handled) { /* pass to the main thread via the queue */ requests = mock_server_get_queue(server); q_put(requests, (void *)request); } } if (_mock_server_stopping(server)) { GOTO(failure); } reply = q_get(replies, 10); if (reply) { _mock_server_reply_with_stream(server, reply, client_stream); _reply_destroy(reply); } if (_mock_server_stopping(server)) { GOTO(failure); } GOTO(again); failure: _mongoc_array_destroy(&autoresponders); _mongoc_buffer_destroy(&buffer); mongoc_stream_close(client_stream); mongoc_stream_destroy(client_stream); bson_free(closure); _mongoc_buffer_destroy(&buffer); while ((reply = q_get_nowait(replies))) { _reply_destroy(reply); } q_destroy(replies); BSON_THREAD_RETURN; } /* enqueue server reply for this connection's worker thread to send to client */ void reply_to_request_with_multiple_docs( request_t *request, mongoc_reply_flags_t flags, const bson_t *docs, int n_docs, int64_t cursor_id) { reply_t *reply; int i; BSON_ASSERT(request); reply = bson_malloc0(sizeof(reply_t)); reply->type = REPLY; reply->flags = flags; reply->n_docs = n_docs; reply->docs = bson_aligned_alloc0(BSON_ALIGNOF(bson_t), (size_t)n_docs * sizeof(bson_t)); for (i = 0; i < n_docs; i++) { bson_copy_to(&docs[i], &reply->docs[i]); } reply->cursor_id = cursor_id; reply->client_port = request_get_client_port(request); reply->response_to = mcd_rpc_header_get_request_id(request->rpc); reply->request_opcode = mcd_rpc_header_get_op_code(request->rpc); if (reply->request_opcode == MONGOC_OP_CODE_MSG) { reply->opmsg_flags = mcd_rpc_op_msg_get_flag_bits(request->rpc); } else { reply->query_flags = mcd_rpc_op_query_get_flags(request->rpc); } q_put(request->replies, reply); } static void _mock_server_reply_with_stream(mock_server_t *server, reply_t *reply, mongoc_stream_t *client) { uint8_t *buf; uint8_t *ptr; size_t len; bool is_op_msg; mongoc_reply_flags_t flags = reply->flags; const bson_t *docs = reply->docs; int n_docs = reply->n_docs; int64_t cursor_id = reply->cursor_id; if (reply->type == HANGUP) { mongoc_stream_close(client); return; } else if (reply->type == RESET) { struct linger no_linger; no_linger.l_onoff = 1; no_linger.l_linger = 0; /* send RST packet to client */ mongoc_stream_setsockopt(client, SOL_SOCKET, SO_LINGER, &no_linger, sizeof no_linger); mongoc_stream_close(client); return; } mcommon_string_append_t docs_json; mcommon_string_new_as_append(&docs_json); for (int i = 0; i < n_docs; i++) { mcommon_json_append_bson_document(&docs_json, &docs[i], BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION); if (i < n_docs - 1) { mcommon_string_append(&docs_json, ", "); } } is_op_msg = reply->request_opcode == MONGOC_OPCODE_MSG; test_suite_mock_server_log("%5.2f %hu <- %hu %s %s", mock_server_get_uptime_sec(server), reply->client_port, mock_server_get_port(server), is_op_msg ? "OP_MSG" : "OP_REPLY", mcommon_str_from_append(&docs_json)); len = 0; for (int i = 0; i < n_docs; i++) { len += docs[i].len; } ptr = buf = bson_malloc(len); for (int i = 0; i < n_docs; i++) { memcpy(ptr, bson_get_data(&docs[i]), docs[i].len); ptr += docs[i].len; } mcd_rpc_message *const rpc = mcd_rpc_message_new(); int32_t message_len = 0; bson_mutex_lock(&server->mutex); if (!(reply->request_opcode == MONGOC_OPCODE_QUERY && reply->query_flags & MONGOC_QUERY_EXHAUST)) { server->last_response_id++; } message_len += mcd_rpc_header_set_request_id(rpc, server->last_response_id); bson_mutex_unlock(&server->mutex); message_len += mcd_rpc_header_set_message_length(rpc, 0); message_len += mcd_rpc_header_set_response_to(rpc, reply->response_to); if (is_op_msg) { message_len += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_MSG); mcd_rpc_op_msg_set_sections_count(rpc, 1); message_len += mcd_rpc_op_msg_set_flag_bits(rpc, reply->opmsg_flags); /* we don't yet implement payload type 1, a document stream */ message_len += mcd_rpc_op_msg_section_set_kind(rpc, 0, 0); message_len += mcd_rpc_op_msg_section_set_body(rpc, 0, buf); } else { message_len += mcd_rpc_header_set_op_code(rpc, MONGOC_OP_CODE_REPLY); message_len += mcd_rpc_op_reply_set_response_flags(rpc, (int32_t)flags); message_len += mcd_rpc_op_reply_set_cursor_id(rpc, cursor_id); message_len += mcd_rpc_op_reply_set_starting_from(rpc, 0); message_len += mcd_rpc_op_reply_set_number_returned(rpc, 1); message_len += mcd_rpc_op_reply_set_documents(rpc, buf, len); } mcd_rpc_message_set_length(rpc, message_len); size_t iovcnt; mongoc_iovec_t *const iov = mcd_rpc_message_to_iovecs(rpc, &iovcnt); BSON_ASSERT(iov); size_t expected = 0; for (size_t i = 0u; i < iovcnt; i++) { expected += iov[i].iov_len; } const ssize_t n_written = mongoc_stream_writev(client, iov, iovcnt, -1); BSON_ASSERT(mlib_cmp(n_written, ==, expected)); bson_free(iov); mcd_rpc_message_destroy(rpc); mcommon_string_from_append_destroy(&docs_json); bson_free(buf); } void autoresponder_handle_destroy(autoresponder_handle_t *handle) { if (handle->destructor) { handle->destructor(handle->data); } } void mock_server_set_bind_opts(mock_server_t *server, mock_server_bind_opts_t *opts) { server->bind_opts = *opts; } void rs_response_to_hello(mock_server_t *server, int max_wire_version, bool primary, int has_tags, ...) { va_list ap; bool first; mock_server_t *host; ASSERT_WITH_MSG(max_wire_version >= WIRE_VERSION_MIN, "max_wire_version %" PRId32 " must be greater than or equal to minimum wire version %d", max_wire_version, WIRE_VERSION_MIN); mcommon_string_append_t hosts; mcommon_string_new_as_append(&hosts); va_start(ap, has_tags); first = true; while ((host = va_arg(ap, mock_server_t *))) { if (first) { first = false; } else { mcommon_string_append(&hosts, ","); } mcommon_string_append_printf(&hosts, "'%s'", mock_server_get_host_and_port(host)); } va_end(ap); mock_server_auto_endsessions(server); mock_server_auto_hello(server, "{'ok': 1, " " 'setName': 'rs'," " 'isWritablePrimary': %s," " 'secondary': %s," " 'tags': {%s}," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': [%s]," " 'logicalSessionTimeoutMinutes': 30}", primary ? "true" : "false", primary ? "false" : "true", has_tags ? "'key': 'value'" : "", WIRE_VERSION_MIN, max_wire_version, mcommon_str_from_append(&hosts)); mcommon_string_from_append_destroy(&hosts); } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/mock-server.h000066400000000000000000000136521511661753600252150ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MOCK_SERVER_H #define MOCK_SERVER_H #include #include // mongoc_reply_flags_t represents flags for the legacy OP_REPLY protocol: typedef enum { MONGOC_REPLY_NONE = 0, MONGOC_REPLY_CURSOR_NOT_FOUND = 1 << 0, MONGOC_REPLY_QUERY_FAILURE = 1 << 1, MONGOC_REPLY_SHARD_CONFIG_STALE = 1 << 2, MONGOC_REPLY_AWAIT_CAPABLE = 1 << 3, } mongoc_reply_flags_t; #include #ifdef MONGOC_ENABLE_SSL #include #endif #include "./request.h" typedef struct _mock_server_t mock_server_t; typedef struct _autoresponder_handle_t autoresponder_handle_t; typedef struct _hello_callback_t hello_callback_t; typedef struct _mock_server_bind_opts_t { struct sockaddr_in *bind_addr; size_t bind_addr_len; int family; int ipv6_only; } mock_server_bind_opts_t; typedef bool (*autoresponder_t)(request_t *request, void *data); typedef bool (*hello_callback_func_t)(request_t *request, void *data, bson_t *hello_response); typedef void (*destructor_t)(void *data); mock_server_t * mock_server_new(void); mock_server_t * mock_server_with_auto_hello(int32_t max_wire_version); mock_server_t * mock_mongos_new(int32_t max_wire_version); mock_server_t * mock_server_down(void); int mock_server_autoresponds(mock_server_t *server, autoresponder_t responder, void *data, destructor_t destructor); void mock_server_remove_autoresponder(mock_server_t *server, int id); int mock_server_auto_hello_callback(mock_server_t *server, hello_callback_func_t callback_func, void *data, destructor_t destructor); int mock_server_auto_hello(mock_server_t *server, const char *response_json, ...); int mock_server_auto_endsessions(mock_server_t *server); #ifdef MONGOC_ENABLE_SSL void mock_server_set_ssl_opts(mock_server_t *server, mongoc_ssl_opt_t *opts); #endif void mock_server_set_bind_opts(mock_server_t *server, mock_server_bind_opts_t *opts); uint16_t mock_server_run(mock_server_t *server); const mongoc_uri_t * mock_server_get_uri(mock_server_t *server); const char * mock_server_get_host_and_port(mock_server_t *server); uint16_t mock_server_get_port(mock_server_t *server); void mock_server_set_request_timeout_msec(mock_server_t *server, int64_t request_timeout_msec); bool mock_server_get_rand_delay(mock_server_t *server); void mock_server_set_rand_delay(mock_server_t *server, bool rand_delay); request_t * mock_server_receives_request(mock_server_t *server); request_t * mock_server_receives_command( mock_server_t *server, const char *database_name, mongoc_query_flags_t flags, const char *command_json, ...); request_t * mock_server_receives_any_hello(mock_server_t *server); request_t * mock_server_receives_legacy_hello(mock_server_t *server, const char *match_json); request_t * mock_server_receives_hello(mock_server_t *server); request_t * mock_server_receives_hello_op_msg(mock_server_t *server); request_t * mock_server_receives_any_hello_with_match(mock_server_t *server, const char *match_json_op_msg, const char *match_json_op_query); request_t * mock_server_receives_query(mock_server_t *server, const char *ns, mongoc_query_flags_t flags, uint32_t skip, int32_t n_return, const char *query_json, const char *fields_json); request_t * mock_server_receives_kill_cursors(mock_server_t *server, int64_t cursor_id); request_t * _mock_server_receives_msg(mock_server_t *server, uint32_t flags, ...); #define mock_server_receives_msg(_server, _flags, ...) _mock_server_receives_msg(_server, _flags, __VA_ARGS__, NULL) request_t * mock_server_receives_bulk_msg( mock_server_t *server, uint32_t flags, const bson_t *msg_json, const bson_t *doc_json, size_t n_docs); void reply_to_request_with_hang_up(request_t *request); void reply_to_request_with_reset(request_t *request); void reply_to_request(request_t *request, mongoc_reply_flags_t flags, int64_t cursor_id, int32_t starting_from, int32_t number_returned, const char *docs_json); void reply_to_request_simple(request_t *request, const char *docs_json); void reply_to_request_with_ok_and_destroy(request_t *request); void reply_to_find_request(request_t *request, mongoc_query_flags_t flags, int64_t cursor_id, int32_t number_returned, const char *ns, const char *reply_json, bool is_command); void reply_to_op_msg_request(request_t *request, mongoc_op_msg_flags_t flags, const bson_t *doc); void reply_to_request_with_multiple_docs( request_t *request, mongoc_reply_flags_t flags, const bson_t *docs, int n_docs, int64_t cursor_id); void mock_server_destroy(mock_server_t *server); void rs_response_to_hello(mock_server_t *server, int max_wire_version, bool primary, int has_tags, ...); #define RS_RESPONSE_TO_HELLO(server, max_wire_version, primary, has_tags, ...) \ rs_response_to_hello(server, max_wire_version, primary, has_tags, __VA_ARGS__, NULL) #endif /* MOCK_SERVER_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/request.c000066400000000000000000000472701511661753600244460ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "../TestSuite.h" #include "../test-conveniences.h" #include "./mock-server.h" #include #include #include #include #include #include static bool is_command_ns(const char *ns); static void request_from_query(request_t *request); static void request_from_killcursors(request_t *request); static void request_from_getmore(request_t *request); static void request_from_op_msg(request_t *request); static void query_flags_str(mcommon_string_append_t *str, int32_t flags); request_t * request_new(const mongoc_buffer_t *buffer, int32_t msg_len, mock_server_t *server, mongoc_stream_t *client, uint16_t client_port, sync_queue_t *replies) { BSON_ASSERT_PARAM(buffer); BSON_ASSERT_PARAM(server); BSON_ASSERT_PARAM(client); BSON_ASSERT_PARAM(replies); BSON_ASSERT(mlib_in_range(size_t, msg_len)); request_t *const request = (request_t *)bson_malloc0(sizeof *request); request->data = bson_malloc((size_t)msg_len); request->data_len = (size_t)msg_len; request->replies = replies; memcpy(request->data, buffer->data, request->data_len); const void *data_end = NULL; request->rpc = mcd_rpc_message_from_data(request->data, request->data_len, &data_end); if (!request->rpc) { test_error("failed to parse incoming message due to byte %zu of %zu", (size_t)((const uint8_t *)data_end - request->data), request->data_len); } request->opcode = mcd_rpc_header_get_op_code(request->rpc); request->server = server; request->client = client; request->client_port = client_port; _mongoc_array_init(&request->docs, sizeof(bson_t *)); switch (request->opcode) { case MONGOC_OP_CODE_COMPRESSED: // Nothing to do. break; case MONGOC_OP_CODE_QUERY: request_from_query(request); break; case MONGOC_OP_CODE_KILL_CURSORS: // Still being used for legacy OP_KILL_CURSORS tests. request_from_killcursors(request); break; case MONGOC_OP_CODE_GET_MORE: // Still being used for exhaust cursor tests. request_from_getmore(request); break; case MONGOC_OP_CODE_MSG: request_from_op_msg(request); break; case MONGOC_OP_CODE_DELETE: case MONGOC_OP_CODE_INSERT: case MONGOC_OP_CODE_REPLY: case MONGOC_OP_CODE_UPDATE: default: test_error("Mock server does not support opcode %d", request->opcode); } return request; } const bson_t * request_get_doc(const request_t *request, size_t n) { BSON_ASSERT(request); return _mongoc_array_index(&request->docs, const bson_t *, n); } void assert_request_matches_flags(const request_t *request, uint32_t flags) { BSON_ASSERT(request); const int32_t request_flags = mcd_rpc_op_query_get_flags(request->rpc); if (mlib_cmp(request_flags, !=, flags)) { mcommon_string_append_t str_request_flags, str_flags; mcommon_string_new_as_append(&str_request_flags); mcommon_string_new_as_append(&str_flags); query_flags_str(&str_request_flags, request_flags); query_flags_str(&str_flags, (int32_t)flags); test_error("request's query flags are %s, expected %s", mcommon_str_from_append(&str_request_flags), mcommon_str_from_append(&str_flags)); mcommon_string_from_append_destroy(&str_request_flags); mcommon_string_from_append_destroy(&str_flags); } } /* TODO: take file, line, function params from caller, wrap in macro */ bool request_matches_query(const request_t *request, const char *ns, uint32_t flags, uint32_t skip, int32_t n_return, const char *query_json, const char *fields_json, bool is_command) { const bson_t *doc; const bson_t *doc2; char *doc_as_json; bool ret = false; BSON_ASSERT(request); BSON_ASSERT(request->docs.len <= 2); if (request->docs.len) { doc = request_get_doc(request, 0); doc_as_json = bson_as_relaxed_extended_json(doc, NULL); } else { doc = NULL; doc_as_json = NULL; } if (!match_json(doc, is_command, __FILE__, __LINE__, BSON_FUNC, query_json)) { /* match_json has logged the err */ goto done; } if (request->docs.len > 1) { doc2 = request_get_doc(request, 1); } else { doc2 = NULL; } if (!match_json(doc2, false, __FILE__, __LINE__, BSON_FUNC, fields_json)) { /* match_json has logged the err */ goto done; } if (request->is_command && !is_command) { test_error("expected query, got command: %s", doc_as_json); goto done; } if (!request->is_command && is_command) { test_error("expected command, got query: %s", doc_as_json); goto done; } if (request->opcode != MONGOC_OPCODE_QUERY) { test_error("request's opcode does not match QUERY: %s", doc_as_json); goto done; } const char *const request_ns = mcd_rpc_op_query_get_full_collection_name(request->rpc); if (0 != strcmp(request_ns, ns)) { test_error("request's namespace is '%s', expected '%s': %s", request_ns, ns, doc_as_json); goto done; } assert_request_matches_flags(request, flags); const int32_t request_skip = mcd_rpc_op_query_get_number_to_skip(request->rpc); if (mlib_cmp(request_skip, !=, skip)) { test_error("requests's skip = %" PRId32 ", expected %" PRIu32 ": %s", request_skip, skip, doc_as_json); goto done; } const int32_t request_n_return = mcd_rpc_op_query_get_number_to_return(request->rpc); bool n_return_equal = (request_n_return == n_return); if (!n_return_equal && abs(request_n_return) == 1) { /* quirk: commands from mongoc_client_command_simple have n_return 1, * from mongoc_topology_scanner_t have n_return -1 */ n_return_equal = abs(request_n_return) == n_return; } if (!n_return_equal) { test_error( "requests's n_return = %" PRId32 ", expected %" PRId32 ": %s", request_n_return, n_return, doc_as_json); goto done; } ret = true; done: bson_free(doc_as_json); return ret; } /* TODO: take file, line, function params from caller, wrap in macro */ bool request_matches_kill_cursors(const request_t *request, int64_t cursor_id) { BSON_ASSERT(request); if (request->opcode != MONGOC_OPCODE_KILL_CURSORS) { test_error("request's opcode does not match KILL_CURSORS, got: %d", request->opcode); return false; } const int32_t request_n_cursors = mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(request->rpc); if (request_n_cursors != 1) { test_error("request's n_cursors is %" PRId32 ", expected 1", request_n_cursors); return false; } const int64_t request_cursor_id = mcd_rpc_op_kill_cursors_get_cursor_ids(request->rpc)[0]; if (request_cursor_id != cursor_id) { test_error("request's cursor_id %" PRId64 ", expected %" PRId64, request_cursor_id, cursor_id); return false; } return true; } /*-------------------------------------------------------------------------- * * request_matches_msg -- * * Test that a client OP_MSG matches a pattern. The OP_MSG consists * of at least one document (the command body) and optional sequence * of additional documents (e.g., documents in a bulk insert). The * documents in the actual client message are compared pairwise to * the patterns in @docs. * * Returns: * True if the body and document sequence of the request match * the given pattern. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool request_matches_msg(const request_t *request, uint32_t flags, const bson_t **docs, size_t n_docs) { const bson_t *doc; const bson_t *pattern; bson_error_t bson_error; bool is_command_doc; BSON_ASSERT(request); if (request->opcode != MONGOC_OPCODE_MSG) { test_error("%s", "request's opcode does not match OP_MSG"); } BSON_ASSERT(request->docs.len >= 1); for (size_t i = 0u; i < n_docs; i++) { pattern = docs[i]; /* make sure the pattern is reasonable, e.g. that we didn't pass a string * instead of a bson_t* by mistake */ ASSERT_WITH_MSG(bson_validate_with_error(pattern, BSON_VALIDATE_EMPTY_KEYS | BSON_VALIDATE_UTF8, &bson_error), "invalid argument at position %zu (note: must be " "bson_t*, not char*):\ndomain: %" PRIu32 ", code: %" PRIu32 ", message: %s\n", i, bson_error.domain, bson_error.code, bson_error.message); if (i > request->docs.len) { fprintf(stderr, "Expected at least %zu documents in request, got %zu\n", i, request->docs.len); return false; } doc = request_get_doc(request, i); /* pass is_command=true for first doc, including "find" command */ is_command_doc = (i == 0u); assert_match_bson(doc, pattern, is_command_doc); } if (n_docs < request->docs.len) { fprintf(stderr, "Expected %zu documents in request, got %zu\n", n_docs, request->docs.len); return false; } const uint32_t request_flags = mcd_rpc_op_msg_get_flag_bits(request->rpc); if (request_flags != flags) { fprintf(stderr, "Expected OP_MSG flags %" PRIu32 ", got %" PRIu32 "\n", flags, request_flags); return false; } return true; } /*-------------------------------------------------------------------------- * * request_matches_msgv -- * * Variable-args version of request_matches_msg. * * Returns: * True if the body and document sequence of the request match * the given pattern. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool request_matches_msgv(const request_t *request, uint32_t flags, va_list *args) { bson_t **docs; size_t n_docs, allocated; bool r; n_docs = 0; allocated = 1; docs = bson_malloc(allocated * sizeof(bson_t *)); while ((docs[n_docs] = va_arg(*args, bson_t *))) { n_docs++; if (n_docs == allocated) { allocated = bson_next_power_of_two(allocated + 1); docs = bson_realloc(docs, allocated * sizeof(bson_t *)); } } r = request_matches_msg(request, flags, (const bson_t **)docs, n_docs); bson_free(docs); return r; } /*-------------------------------------------------------------------------- * * request_get_server_port -- * * Get the port of the server this request was sent to. * * Returns: * A port number. * * Side effects: * None. * *-------------------------------------------------------------------------- */ uint16_t request_get_server_port(request_t *request) { return mock_server_get_port(request->server); } /*-------------------------------------------------------------------------- * * request_get_client_port -- * * Get the client port this request was sent from. * * Returns: * A port number. * * Side effects: * None. * *-------------------------------------------------------------------------- */ uint16_t request_get_client_port(request_t *request) { return request->client_port; } /*-------------------------------------------------------------------------- * * request_destroy -- * * Free a request_t. * * Returns: * None. * * Side effects: * None. * *-------------------------------------------------------------------------- */ void request_destroy(request_t *request) { size_t i; bson_t *doc; for (i = 0; i < request->docs.len; i++) { doc = _mongoc_array_index(&request->docs, bson_t *, i); bson_destroy(doc); } _mongoc_array_destroy(&request->docs); bson_free(request->command_name); bson_free(request->as_str); mcd_rpc_message_destroy(request->rpc); bson_free(request->data); bson_free(request); } static bool is_command_ns(const char *ns) { size_t len = strlen(ns); const char *cmd = ".$cmd"; size_t cmd_len = strlen(cmd); return len > cmd_len && !strncmp(ns + len - cmd_len, cmd, cmd_len); } static void query_flags_str(mcommon_string_append_t *str, int32_t flags) { int flag = 1; bool begun = false; if (flags == MONGOC_OP_QUERY_FLAG_NONE) { mcommon_string_append(str, "0"); } else { while (flag <= MONGOC_OP_QUERY_FLAG_PARTIAL) { flag <<= 1; if (flags & flag) { if (begun) { mcommon_string_append(str, "|"); } begun = true; switch (flag) { case MONGOC_OP_QUERY_FLAG_TAILABLE_CURSOR: mcommon_string_append(str, "TAILABLE"); break; case MONGOC_OP_QUERY_FLAG_SECONDARY_OK: mcommon_string_append(str, "SECONDARY_OK"); break; case MONGOC_OP_QUERY_FLAG_OPLOG_REPLAY: mcommon_string_append(str, "OPLOG_REPLAY"); break; case MONGOC_OP_QUERY_FLAG_NO_CURSOR_TIMEOUT: mcommon_string_append(str, "NO_TIMEOUT"); break; case MONGOC_OP_QUERY_FLAG_AWAIT_DATA: mcommon_string_append(str, "AWAIT_DATA"); break; case MONGOC_OP_QUERY_FLAG_EXHAUST: mcommon_string_append(str, "EXHAUST"); break; case MONGOC_OP_QUERY_FLAG_PARTIAL: mcommon_string_append(str, "PARTIAL"); break; case MONGOC_OP_QUERY_FLAG_NONE: default: BSON_ASSERT(false); } } } } } static void request_from_query(request_t *request) { bson_iter_t iter; mcommon_string_append_t query_as_str; mcommon_string_new_as_append(&query_as_str); mcommon_string_append(&query_as_str, "OP_QUERY "); const int32_t request_flags = mcd_rpc_op_query_get_flags(request->rpc); const char *const request_coll = mcd_rpc_op_query_get_full_collection_name(request->rpc); const int32_t request_skip = mcd_rpc_op_query_get_number_to_skip(request->rpc); const int32_t request_return = mcd_rpc_op_query_get_number_to_return(request->rpc); const void *const request_query = mcd_rpc_op_query_get_query(request->rpc); const void *const request_fields = mcd_rpc_op_query_get_return_fields_selector(request->rpc); { const int32_t len = mlib_read_i32le(request_query); bson_t *const query = bson_new_from_data(request_query, (size_t)len); BSON_ASSERT(query); _mongoc_array_append_val(&request->docs, query); mcommon_string_append_printf(&query_as_str, "%s ", request_coll); if (is_command_ns(request_coll)) { request->is_command = true; if (bson_iter_init(&iter, query) && bson_iter_next(&iter)) { request->command_name = bson_strdup(bson_iter_key(&iter)); } else { fprintf(stderr, "WARNING: no command name for %s\n", request_coll); } } mcommon_json_append_bson_document(&query_as_str, query, BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION); } if (request_fields) { const int32_t len = mlib_read_i32le(request_fields); bson_t *const fields = bson_new_from_data(request_fields, (size_t)len); BSON_ASSERT(fields); _mongoc_array_append_val(&request->docs, fields); mcommon_string_append(&query_as_str, " fields="); mcommon_json_append_bson_document(&query_as_str, fields, BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION); } mcommon_string_append(&query_as_str, " flags="); query_flags_str(&query_as_str, request_flags); if (request_skip) { mcommon_string_append_printf(&query_as_str, " skip=%" PRId32, request_skip); } if (request_return) { mcommon_string_append_printf(&query_as_str, " n_return=%" PRId32, request_return); } request->as_str = mcommon_string_from_append_destroy_with_steal(&query_as_str); } static void request_from_killcursors(request_t *request) { /* protocol allows multiple cursor ids but we only implement one */ BSON_ASSERT(mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(request->rpc) == 1); request->as_str = bson_strdup_printf("OP_KILLCURSORS %" PRId64, mcd_rpc_op_kill_cursors_get_cursor_ids(request->rpc)[0]); } static void request_from_getmore(request_t *request) { request->as_str = bson_strdup_printf("OP_GETMORE %s %" PRId64 " n_return=%d", mcd_rpc_op_get_more_get_full_collection_name(request->rpc), mcd_rpc_op_get_more_get_cursor_id(request->rpc), mcd_rpc_op_get_more_get_number_to_return(request->rpc)); } static void parse_op_msg_doc(request_t *request, const uint8_t *data, size_t data_len, mcommon_string_append_t *msg_as_str) { const uint8_t *pos = data; while (pos < data + data_len) { if (pos > data) { mcommon_string_append(msg_as_str, ", "); } const int32_t doc_len = mlib_read_i32le(pos); const bson_t *const doc = bson_new_from_data(pos, (size_t)doc_len); BSON_ASSERT(doc); _mongoc_array_append_val(&request->docs, doc); mcommon_json_append_bson_document(msg_as_str, doc, BSON_JSON_MODE_RELAXED, BSON_MAX_RECURSION); pos += doc_len; } } static void request_from_op_msg(request_t *request) { mcommon_string_append_t msg_as_str; mcommon_string_new_as_append(&msg_as_str); mcommon_string_append(&msg_as_str, "OP_MSG"); const size_t sections_count = mcd_rpc_op_msg_get_sections_count(request->rpc); BSON_ASSERT(sections_count <= 3u); for (size_t index = 0; index < sections_count; ++index) { mcommon_string_append(&msg_as_str, (index > 0 ? ", " : " ")); const uint8_t kind = mcd_rpc_op_msg_section_get_kind(request->rpc, index); switch (kind) { case 0: { /* a single BSON document */ const void *const body = mcd_rpc_op_msg_section_get_body(request->rpc, index); parse_op_msg_doc(request, body, (size_t)mlib_read_i32le(body), &msg_as_str); break; } case 1: { /* a sequence of BSON documents */ mcommon_string_append(&msg_as_str, mcd_rpc_op_msg_section_get_identifier(request->rpc, index)); mcommon_string_append(&msg_as_str, ": ["); parse_op_msg_doc(request, mcd_rpc_op_msg_section_get_document_sequence(request->rpc, index), mcd_rpc_op_msg_section_get_document_sequence_length(request->rpc, index), &msg_as_str); mcommon_string_append(&msg_as_str, "]"); break; } default: test_error("Unimplemented payload type %d\n", kind); } } request->as_str = mcommon_string_from_append_destroy_with_steal(&msg_as_str); request->is_command = true; /* true for all OP_MSG requests */ if (request->docs.len) { const bson_t *doc = request_get_doc(request, 0); bson_iter_t iter; if (bson_iter_init(&iter, doc) && bson_iter_next(&iter)) { request->command_name = bson_strdup(bson_iter_key(&iter)); } } } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/request.h000066400000000000000000000046601511661753600244470ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef REQUEST_H #define REQUEST_H #include "./sync-queue.h" #include #include #include #include #include #include struct _mock_server_t; /* forward declaration */ typedef struct _request_t { uint8_t *data; size_t data_len; mcd_rpc_message *rpc; int32_t opcode; /* copied from rpc for convenience */ struct _mock_server_t *server; mongoc_stream_t *client; uint16_t client_port; bool is_command; char *command_name; char *as_str; mongoc_array_t docs; /* array of bson_t pointers */ sync_queue_t *replies; } request_t; request_t * request_new(const mongoc_buffer_t *buffer, int32_t msg_len, struct _mock_server_t *server, mongoc_stream_t *client, uint16_t client_port, sync_queue_t *replies); const bson_t * request_get_doc(const request_t *request, size_t n); void assert_request_matches_flags(const request_t *request, uint32_t flags); bool request_matches_query(const request_t *request, const char *ns, uint32_t flags, uint32_t skip, int32_t n_return, const char *query_json, const char *fields_json, bool is_command); bool request_matches_kill_cursors(const request_t *request, int64_t cursor_id); bool request_matches_msg(const request_t *request, uint32_t flags, const bson_t **docs, size_t n_docs); bool request_matches_msgv(const request_t *request, uint32_t flags, va_list *args); uint16_t request_get_server_port(request_t *request); uint16_t request_get_client_port(request_t *request); void request_destroy(request_t *request); #endif /* REQUEST_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/sync-queue.c000066400000000000000000000050051511661753600250420ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./sync-queue.h" #include #include struct _sync_queue_t { mongoc_array_t array; mongoc_cond_t cond; bson_mutex_t mutex; }; sync_queue_t * q_new(void) { sync_queue_t *q = (sync_queue_t *)bson_malloc(sizeof(sync_queue_t)); _mongoc_array_init(&q->array, sizeof(void *)); mongoc_cond_init(&q->cond); bson_mutex_init(&q->mutex); return q; } void q_put(sync_queue_t *q, void *item) { bson_mutex_lock(&q->mutex); _mongoc_array_append_val(&q->array, item); mongoc_cond_signal(&q->cond); bson_mutex_unlock(&q->mutex); } /* call holding the lock */ static void * _get(sync_queue_t *q) { void **data; void *item = NULL; size_t i; if (q->array.len) { data = (void **)q->array.data; item = data[0]; /* shift the queue left */ q->array.len--; for (i = 0; i < q->array.len; i++) { data[i] = data[i + 1]; } } return item; } void * q_get(sync_queue_t *q, int64_t timeout_msec) { void *item = NULL; int64_t remaining_usec = timeout_msec * 1000; int64_t deadline = bson_get_monotonic_time() + timeout_msec * 1000; bson_mutex_lock(&q->mutex); if (timeout_msec) { while (!q->array.len && remaining_usec > 0) { mongoc_cond_timedwait(&q->cond, &q->mutex, remaining_usec / 1000); remaining_usec = deadline - bson_get_monotonic_time(); } } else { /* no deadline */ while (!q->array.len) { mongoc_cond_wait(&q->cond, &q->mutex); } } item = _get(q); bson_mutex_unlock(&q->mutex); return item; } void * q_get_nowait(sync_queue_t *q) { void *item; bson_mutex_lock(&q->mutex); item = _get(q); bson_mutex_unlock(&q->mutex); return item; } void q_destroy(sync_queue_t *q) { _mongoc_array_destroy(&q->array); mongoc_cond_destroy(&q->cond); bson_mutex_destroy(&q->mutex); bson_free(q); } mongo-c-driver-2.2.1/src/libmongoc/tests/mock_server/sync-queue.h000066400000000000000000000016771511661753600250620ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifndef SYNC_QUEUE_H #define SYNC_QUEUE_H typedef struct _sync_queue_t sync_queue_t; sync_queue_t * q_new(void); void q_put(sync_queue_t *q, void *item); void * q_get(sync_queue_t *q, int64_t timeout_msec); void * q_get_nowait(sync_queue_t *q); void q_destroy(sync_queue_t *q); #endif /* SYNC_QUEUE_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/pkg-config-import/000077500000000000000000000000001511661753600236155ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/pkg-config-import/CMakeLists.txt000066400000000000000000000020311511661753600263510ustar00rootroot00000000000000cmake_minimum_required (VERSION 3.15...4.0) project(pkg-config-import-test LANGUAGES C) # This is a test case that tries to build against bson/mongoc using pkg-config. # Even though this is a CMake project, we import by talking to `pkg-config` include(CTest) find_package(PkgConfig REQUIRED) pkg_check_modules(thing REQUIRED IMPORTED_TARGET "${PKG_CONFIG_SEARCH}") add_compile_definitions( "EXPECT_BSON_VERSION=\"${EXPECT_BSON_VERSION}\"" "EXPECT_MONGOC_VERSION=\"${EXPECT_MONGOC_VERSION}\"" EXPECT_BSON_STATIC=$ EXPECT_MONGOC_STATIC=$ ) add_executable(my-app app.c) target_link_libraries(my-app PRIVATE PkgConfig::thing) if(EXPECT_BSON_VERSION) add_executable(use-bson use-bson.c) target_link_libraries(use-bson PRIVATE PkgConfig::thing) add_test(use-bson use-bson) endif() if(EXPECT_MONGOC_VERSION) add_executable(use-mongoc use-mongoc.c) target_link_libraries(use-mongoc PRIVATE PkgConfig::thing) add_test(use-mongoc use-mongoc) endif() mongo-c-driver-2.2.1/src/libmongoc/tests/pkg-config-import/app.c000066400000000000000000000000161511661753600245360ustar00rootroot00000000000000int main() { }mongo-c-driver-2.2.1/src/libmongoc/tests/pkg-config-import/use-bson.c000066400000000000000000000007721511661753600255220ustar00rootroot00000000000000#include #include #ifndef EXPECT_BSON_VERSION #error This file requires EXPECT_BSON_VERSION to be defined #define EXPECT_BSON_VERSION "" #endif #if EXPECT_BSON_STATIC != defined(BSON_STATIC) #error Static/dynamic mismatch #endif int main(void) { if (strcmp(BSON_VERSION_S, EXPECT_BSON_VERSION)) { fprintf( stderr, "Wrong BSON_MAJOR_VERSION found (Expected “%sâ€, but got “%sâ€)", EXPECT_BSON_VERSION, BSON_VERSION_S); return 2; } return 0; } mongo-c-driver-2.2.1/src/libmongoc/tests/pkg-config-import/use-mongoc.c000066400000000000000000000010711511661753600260340ustar00rootroot00000000000000#include #include #ifndef EXPECT_MONGOC_VERSION #error This file requires EXPECT_MONGOC_VERSION to be defined #define EXPECT_MONGOC_VERSION "" #endif int main(void) { mongoc_client_t *const cl = mongoc_client_new("mongodb://foo"); mongoc_client_destroy(cl); if (strcmp(MONGOC_VERSION_S, EXPECT_MONGOC_VERSION)) { fprintf(stderr, "Wrong MONGOC_MAJOR_VERSION found (Expected “%sâ€, but got “%sâ€)", EXPECT_MONGOC_VERSION, MONGOC_VERSION_S); return 2; } return 0; } mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/000077500000000000000000000000001511661753600230635ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/empty-file.txt000066400000000000000000000000001511661753600256650ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-etc-fedora-release.txt000066400000000000000000000000341511661753600307010ustar00rootroot00000000000000Fedora release 8 (Werewolf) mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-etc-os-release-ubuntu1604.txt000066400000000000000000000004221511661753600317160ustar00rootroot00000000000000NAME="Ubuntu" VERSION="16.04.1 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.1 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" UBUNTU_CODENAME=xenial mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-etc-os-release.txt000066400000000000000000000003711511661753600300660ustar00rootroot00000000000000NAME=Fedora VERSION="17 (Beefy Miracle)" ID=fedora VERSION_ID=17 PRETTY_NAME="Fedora 17 (Beefy Miracle)" ANSI_COLOR="0;34" CPE_NAME="cpe:/o:fedoraproject:fedora:17" HOME_URL="https://fedoraproject.org/" BUG_REPORT_URL="https://bugzilla.redhat.com/" mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-etc-xyz-release-no-delimiter.txt000066400000000000000000000000501511661753600326570ustar00rootroot00000000000000This one just has name, not that R word mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-key-value-file.txt000066400000000000000000000027701511661753600301020ustar00rootroot00000000000000normalkey=normalval key=first value key=second value a-key-without-a-value= just-a-key key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value key=some value lastkey=lastval mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-lsb-file-with-super-long-line.txt000066400000000000000000000020501511661753600327360ustar00rootroot00000000000000DISTRIB_RELEASE=12.04 this-is-to-test-dealing-with-a-weird-file-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa DISTRIB_ID=Ubuntu mongo-c-driver-2.2.1/src/libmongoc/tests/release_files/example-lsb-file.txt000066400000000000000000000021541511661753600267540ustar00rootroot00000000000000DISTRIB_CODENAME=precise DISTRIB_RELEASE=12.04 DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS" this-is-to-test-dealing-with-a-weird-file-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa x= DISTRIB_ID=Ubuntu mongo-c-driver-2.2.1/src/libmongoc/tests/ssl-test.c000066400000000000000000000205741511661753600222130ustar00rootroot00000000000000#include #include #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #include #endif #include #include #include #define TIMEOUT 10 * 1000 #define NUM_IOVECS 2000 /** this function is meant to be run from ssl_test as a child thread * * It: * 1. spins up * 2. binds and listens to a random port * 3. notifies the client of its port through a condvar * 4. accepts a request * 5. reads a 32 bit length * 6. reads a string of that length * 7. echoes it back to the client * 8. shuts down */ static BSON_THREAD_FUN(ssl_test_server, ptr) { ssl_test_data_t *data = (ssl_test_data_t *)ptr; mongoc_stream_t *sock_stream; mongoc_stream_t *ssl_stream; mongoc_socket_t *listen_sock; mongoc_socket_t *conn_sock; mongoc_socklen_t sock_len; char buf[4 * NUM_IOVECS]; ssize_t r; bson_error_t error; mongoc_iovec_t iov; struct sockaddr_in server_addr = {0}; int len; iov.iov_base = buf; iov.iov_len = sizeof buf; listen_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(listen_sock); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); server_addr.sin_port = htons(0); r = mongoc_socket_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof server_addr); BSON_ASSERT(r == 0); sock_len = sizeof(server_addr); r = mongoc_socket_getsockname(listen_sock, (struct sockaddr *)&server_addr, &sock_len); BSON_ASSERT(r == 0); r = mongoc_socket_listen(listen_sock, 10); BSON_ASSERT(r == 0); bson_mutex_lock(&data->cond_mutex); data->server_port = ntohs(server_addr.sin_port); mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); conn_sock = mongoc_socket_accept(listen_sock, -1); BSON_ASSERT(conn_sock); sock_stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(sock_stream); ssl_stream = mongoc_stream_tls_new_with_hostname(sock_stream, NULL, data->server, 0); if (!ssl_stream) { #ifdef MONGOC_ENABLE_SSL_OPENSSL unsigned long err = ERR_get_error(); #else unsigned long err = 42; #endif BSON_ASSERT(err); data->server_result->ssl_err = err; data->server_result->result = SSL_TEST_SSL_INIT; #ifdef MONGOC_ENABLE_SSL_OPENSSL MONGOC_ERROR("ERRORED (line: %d): %s\n", (int)(__LINE__), ERR_error_string(ERR_get_error(), NULL)); #endif mongoc_stream_destroy(sock_stream); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } BSON_ASSERT(ssl_stream); r = mongoc_stream_tls_handshake_block(ssl_stream, data->host, TIMEOUT, &error); if (!r) { unsigned long err = 43; MONGOC_ERROR("ERRORED (line: %d): %s\n", (int)(__LINE__), error.message); #ifdef MONGOC_ENABLE_SSL_OPENSSL MONGOC_ERROR("msg: %s\n", ERR_error_string(ERR_get_error(), NULL)); #endif data->server_result->ssl_err = err; data->server_result->result = SSL_TEST_SSL_HANDSHAKE; mongoc_socket_destroy(listen_sock); mongoc_stream_destroy(ssl_stream); BSON_THREAD_RETURN; } r = mongoc_stream_readv(ssl_stream, &iov, 1, 4, TIMEOUT); if (r < 0) { data->server_result->err = errno; data->server_result->result = SSL_TEST_TIMEOUT; MONGOC_ERROR("ERRORED (line: %d): %s\n", (int)(__LINE__), "mongoc_stream_readv failed."); mongoc_stream_destroy(ssl_stream); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } BSON_ASSERT(r == 4); memcpy(&len, iov.iov_base, r); r = mongoc_stream_readv(ssl_stream, &iov, 1, len, TIMEOUT); BSON_ASSERT(r == len); iov.iov_len = r; mongoc_stream_writev(ssl_stream, &iov, 1, TIMEOUT); mongoc_stream_destroy(ssl_stream); mongoc_socket_destroy(listen_sock); data->server_result->result = SSL_TEST_SUCCESS; BSON_THREAD_RETURN; } /** this function is meant to be run from ssl_test as a child thread * * It: * 1. spins up * 2. waits on a condvar until the server is up * 3. connects to the server's port * 4. writes a 4 bytes length * 5. writes a string of length size * 6. reads a response back of the given length * 7. confirms that its the same as what was written * 8. shuts down */ static BSON_THREAD_FUN(ssl_test_client, ptr) { ssl_test_data_t *data = (ssl_test_data_t *)ptr; mongoc_stream_t *sock_stream; mongoc_stream_t *ssl_stream; mongoc_socket_t *conn_sock; int i; char buf[1024]; ssize_t r; mongoc_iovec_t riov; mongoc_iovec_t wiov; mongoc_iovec_t wiov_many[NUM_IOVECS]; struct sockaddr_in server_addr = {0}; int len; bson_error_t error; riov.iov_base = buf; riov.iov_len = sizeof buf; conn_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(conn_sock); bson_mutex_lock(&data->cond_mutex); while (!data->server_port) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(data->server_port); server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); r = mongoc_socket_connect(conn_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), -1); if (r != 0) { test_error("mongoc_socket_connect returned %zd: \"%s\"", r, strerror(errno)); } sock_stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(sock_stream); ssl_stream = mongoc_stream_tls_new_with_hostname(sock_stream, data->host, data->client, 1); if (!ssl_stream) { #ifdef MONGOC_ENABLE_SSL_OPENSSL unsigned long err = ERR_get_error(); #else unsigned long err = 44; #endif BSON_ASSERT(err); data->client_result->ssl_err = err; data->client_result->result = SSL_TEST_SSL_INIT; MONGOC_ERROR("ERRORED (line: %d): %s\n", (int)(__LINE__), "mongoc_stream_tls_new_with_hostname failed."); mongoc_stream_destroy(sock_stream); BSON_THREAD_RETURN; } BSON_ASSERT(ssl_stream); r = mongoc_stream_tls_handshake_block(ssl_stream, data->host, TIMEOUT, &error); if (!r) { unsigned long err = 45; data->client_result->ssl_err = err; data->client_result->result = SSL_TEST_SSL_HANDSHAKE; MONGOC_ERROR("ERRORED (line: %d): %s\n", (int)(__LINE__), error.message); mongoc_stream_destroy(ssl_stream); BSON_THREAD_RETURN; } len = 4 * NUM_IOVECS; wiov.iov_base = (void *)&len; wiov.iov_len = 4; r = mongoc_stream_writev(ssl_stream, &wiov, 1, TIMEOUT); BSON_ASSERT(mlib_cmp(r, ==, wiov.iov_len)); for (i = 0; i < NUM_IOVECS; i++) { wiov_many[i].iov_base = (void *)"foo"; wiov_many[i].iov_len = 4; } r = mongoc_stream_writev(ssl_stream, wiov_many, NUM_IOVECS, TIMEOUT); BSON_ASSERT(mlib_cmp(r, ==, wiov_many[0].iov_len * NUM_IOVECS)); riov.iov_len = 1; r = mongoc_stream_readv(ssl_stream, &riov, 1, 1, TIMEOUT); BSON_ASSERT(r == 1); BSON_ASSERT(memcmp(riov.iov_base, "f", 1) == 0); riov.iov_len = 3; r = mongoc_stream_readv(ssl_stream, &riov, 1, 3, TIMEOUT); BSON_ASSERT(r == 3); BSON_ASSERT(memcmp(riov.iov_base, "oo", 3) == 0); mongoc_stream_destroy(ssl_stream); data->client_result->result = SSL_TEST_SUCCESS; BSON_THREAD_RETURN; } /** This is the testing function for the ssl-test lib * * The basic idea is that you spin up a client and server, which will * communicate over a mongoc-stream-tls, with varying mongoc_ssl_opt's. The * client and server speak a simple echo protocol, so all we're really testing * here is that any given configuration succeeds or fails as it should */ void ssl_test(mongoc_ssl_opt_t *client, mongoc_ssl_opt_t *server, const char *host, ssl_test_result_t *client_result, ssl_test_result_t *server_result) { ssl_test_data_t data = {0}; bson_thread_t threads[2]; int i, r; data.server = server; data.client = client; data.client_result = client_result; data.server_result = server_result; data.host = host; bson_mutex_init(&data.cond_mutex); mongoc_cond_init(&data.cond); r = mcommon_thread_create(threads, &ssl_test_server, &data); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, &ssl_test_client, &data); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_mutex_destroy(&data.cond_mutex); mongoc_cond_destroy(&data.cond); } mongo-c-driver-2.2.1/src/libmongoc/tests/ssl-test.h000066400000000000000000000020541511661753600222110ustar00rootroot00000000000000#include #include typedef enum ssl_test_behavior { SSL_TEST_BEHAVIOR_NORMAL, SSL_TEST_BEHAVIOR_HANGUP_AFTER_HANDSHAKE, SSL_TEST_BEHAVIOR_STALL_BEFORE_HANDSHAKE, } ssl_test_behavior_t; typedef enum ssl_test_state { SSL_TEST_CRASH, SSL_TEST_SUCCESS, SSL_TEST_SSL_INIT, SSL_TEST_SSL_HANDSHAKE, SSL_TEST_TIMEOUT, } ssl_test_state_t; typedef struct ssl_test_result { ssl_test_state_t result; int err; unsigned long ssl_err; } ssl_test_result_t; typedef struct ssl_test_data { mongoc_ssl_opt_t *client; mongoc_ssl_opt_t *server; ssl_test_behavior_t behavior; int64_t handshake_stall_ms; const char *host; unsigned short server_port; mongoc_cond_t cond; bson_mutex_t cond_mutex; ssl_test_result_t *client_result; ssl_test_result_t *server_result; } ssl_test_data_t; void ssl_test(mongoc_ssl_opt_t *client, mongoc_ssl_opt_t *server, const char *host, ssl_test_result_t *client_result, ssl_test_result_t *server_result); mongo-c-driver-2.2.1/src/libmongoc/tests/stream-tracker.c000066400000000000000000000320041511661753600233500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include // _mongoc_client_pool_set_stream_initiator #include // mongoc_client_default_stream_initiator #include #include // ASSERT_OR_PRINT #include // tmp_bson #include // test_framework_* typedef struct { mongoc_host_list_t host; int count_active; int count_total; } stream_tracker_entry; struct stream_tracker_t { #define STREAM_TRACKER_MAX_ENTRIES 10 // Arbitrary stream_tracker_entry entries[STREAM_TRACKER_MAX_ENTRIES]; bson_mutex_t lock; mongoc_client_pool_t *pool; mongoc_client_t *client; }; stream_tracker_t * stream_tracker_new(void) { stream_tracker_t *st = bson_malloc0(sizeof(stream_tracker_t)); bson_mutex_init(&st->lock); return st; } static mongoc_stream_t * stream_tracker_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error); void stream_tracker_track_client(stream_tracker_t *st, mongoc_client_t *client) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(client); // Can only track one pool or single-threaded client: BSON_ASSERT(!st->pool); BSON_ASSERT(!st->client); st->client = client; mongoc_client_set_stream_initiator(client, stream_tracker_initiator, st); } void stream_tracker_track_pool(stream_tracker_t *st, mongoc_client_pool_t *pool) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(pool); // Can only track one pool or single-threaded client: BSON_ASSERT(!st->pool); BSON_ASSERT(!st->client); st->pool = pool; _mongoc_client_pool_set_stream_initiator(pool, stream_tracker_initiator, st); } int stream_tracker_count_active(stream_tracker_t *st, const char *host_) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(host_); bson_error_t error; mongoc_host_list_t host; ASSERT_OR_PRINT(_mongoc_host_list_from_string_with_err(&host, host_, &error), error); int count = 0; // Find matching entry (if present): { bson_mutex_lock(&st->lock); for (size_t i = 0; i < STREAM_TRACKER_MAX_ENTRIES; i++) { if (_mongoc_host_list_compare_one(&st->entries[i].host, &host)) { count = st->entries[i].count_active; break; } } bson_mutex_unlock(&st->lock); } return count; } int stream_tracker_count_total(stream_tracker_t *st, const char *host_) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(host_); bson_error_t error; mongoc_host_list_t host; ASSERT_OR_PRINT(_mongoc_host_list_from_string_with_err(&host, host_, &error), error); int count = 0; // Find matching entry (if present): { bson_mutex_lock(&st->lock); for (size_t i = 0; i < STREAM_TRACKER_MAX_ENTRIES; i++) { if (_mongoc_host_list_compare_one(&st->entries[i].host, &host)) { count = st->entries[i].count_total; break; } } bson_mutex_unlock(&st->lock); } return count; } static void stream_tracker_increment(stream_tracker_t *st, const mongoc_host_list_t *host) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(host); bson_mutex_lock(&st->lock); // Find (or create) matching entry. for (size_t i = 0; i < STREAM_TRACKER_MAX_ENTRIES; i++) { if (0 == strlen(st->entries[i].host.host_and_port)) { // No matching entry. Create one. st->entries[i].host = *host; st->entries[i].count_active = 1; st->entries[i].count_total = 1; bson_mutex_unlock(&st->lock); return; } if (_mongoc_host_list_compare_one(&st->entries[i].host, host)) { st->entries[i].count_active++; st->entries[i].count_total++; bson_mutex_unlock(&st->lock); return; } } test_error("No room to add %s. Increase STREAM_TRACKER_MAX_ENTRIES.", host->host_and_port); } static void stream_tracker_decrement(stream_tracker_t *st, const mongoc_host_list_t *host) { BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(host); bson_mutex_lock(&st->lock); // Find matching entry. for (size_t i = 0; i < STREAM_TRACKER_MAX_ENTRIES; i++) { if (0 == strlen(st->entries[i].host.host_and_port)) { test_error("Unexpected: no matching entry for %s", st->entries[i].host.host_and_port); } if (_mongoc_host_list_compare_one(&st->entries[i].host, host)) { ASSERT(st->entries[i].count_active > 0); st->entries[i].count_active--; bson_mutex_unlock(&st->lock); return; } } test_error("Unexpected. No matching entry to decrement!"); } void stream_tracker_destroy(stream_tracker_t *st) { if (!st) { return; } bson_mutex_destroy(&st->lock); bson_free(st); } // tracked_stream_t wraps a mongoc_stream_t and updates a linked stream_tracker. #define MONGOC_STREAM_TRACKED 8 typedef struct { mongoc_stream_t vtable; mongoc_stream_t *wrapped; mongoc_host_list_t host; stream_tracker_t *st; } tracked_stream_t; static int tracked_stream_close(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return mongoc_stream_close(((tracked_stream_t *)stream)->wrapped); } static void tracked_stream_destroy(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); tracked_stream_t *ts = (tracked_stream_t *)stream; stream_tracker_decrement(ts->st, &ts->host); mongoc_stream_destroy(ts->wrapped); bson_free(ts); } static void tracked_stream_failed(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); tracked_stream_t *ts = (tracked_stream_t *)stream; stream_tracker_decrement(ts->st, &ts->host); mongoc_stream_failed(ts->wrapped); bson_free(ts); } static int tracked_stream_setsockopt(mongoc_stream_t *stream, int level, int optname, void *optval, mongoc_socklen_t optlen) { BSON_ASSERT_PARAM(stream); return mongoc_stream_setsockopt(((tracked_stream_t *)stream)->wrapped, level, optname, optval, optlen); } static int tracked_stream_flush(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return mongoc_stream_flush(((tracked_stream_t *)stream)->wrapped); } static ssize_t tracked_stream_readv( mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, size_t min_bytes, int32_t timeout_msec) { BSON_ASSERT_PARAM(stream); return mongoc_stream_readv(((tracked_stream_t *)stream)->wrapped, iov, iovcnt, min_bytes, timeout_msec); } static ssize_t tracked_stream_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { BSON_ASSERT_PARAM(stream); return mongoc_stream_writev(((tracked_stream_t *)stream)->wrapped, iov, iovcnt, timeout_msec); } static bool tracked_stream_check_closed(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return mongoc_stream_check_closed(((tracked_stream_t *)stream)->wrapped); } static bool tracked_stream_timed_out(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return mongoc_stream_timed_out(((tracked_stream_t *)stream)->wrapped); } static bool tracked_stream_should_retry(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); return mongoc_stream_should_retry(((tracked_stream_t *)stream)->wrapped); } static mongoc_stream_t * tracked_stream_get_base_stream(mongoc_stream_t *stream) { BSON_ASSERT_PARAM(stream); mongoc_stream_t *wrapped = ((tracked_stream_t *)stream)->wrapped; if (wrapped->get_base_stream) { return wrapped->get_base_stream(wrapped); } return wrapped; } static mongoc_stream_t * tracked_stream_new(mongoc_stream_t *stream, stream_tracker_t *st, const mongoc_host_list_t *host) { BSON_ASSERT_PARAM(stream); BSON_ASSERT_PARAM(st); BSON_ASSERT_PARAM(host); tracked_stream_t *ts = (tracked_stream_t *)bson_malloc0(sizeof(tracked_stream_t)); // Set vtable to wrapper functions: ts->vtable.type = MONGOC_STREAM_TRACKED; ts->vtable.close = tracked_stream_close; ts->vtable.destroy = tracked_stream_destroy; ts->vtable.failed = tracked_stream_failed; ts->vtable.flush = tracked_stream_flush; ts->vtable.readv = tracked_stream_readv; ts->vtable.writev = tracked_stream_writev; ts->vtable.setsockopt = tracked_stream_setsockopt; ts->vtable.check_closed = tracked_stream_check_closed; ts->vtable.timed_out = tracked_stream_timed_out; ts->vtable.should_retry = tracked_stream_should_retry; ts->vtable.get_base_stream = tracked_stream_get_base_stream; // Wrap base stream: ts->wrapped = stream; // Set data for tracking: ts->st = st; ts->host = *host; // Record a new stream created to host: stream_tracker_increment(ts->st, &ts->host); return (mongoc_stream_t *)ts; } mongoc_stream_t * stream_tracker_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(host); BSON_ASSERT_PARAM(user_data); BSON_ASSERT_PARAM(error); stream_tracker_t *st = (stream_tracker_t *)user_data; // mongoc_client_default_stream_initiator expects a client context. If tracking a pool, pop a temporary client: mongoc_client_t *client = (st->pool) ? mongoc_client_pool_pop(st->pool) : st->client; ASSERT(client); mongoc_stream_t *base_stream = mongoc_client_default_stream_initiator(uri, host, client, error); ASSERT_OR_PRINT(base_stream, (*error)); if (st->pool) { mongoc_client_pool_push(st->pool, client); } return tracked_stream_new(base_stream, st, host); } static void test_stream_tracker(void) { // Get first host+port from test environment. Example: "localhost:27017" or "[::1]:27017" char *first_host_and_port = test_framework_get_host_and_port(); // Test single-threaded client: { stream_tracker_t *st = stream_tracker_new(); mongoc_client_t *client = test_framework_new_default_client(); stream_tracker_track_client(st, client); // Expect initial count is 0: stream_tracker_assert_active_count(st, first_host_and_port, 0); // Do operation requiring a stream. Target first host: bson_error_t error; ASSERT_OR_PRINT(mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL, 1 /* server ID */, NULL, &error), error); // Expect active and total count incremented: stream_tracker_assert_active_count(st, first_host_and_port, 1); stream_tracker_assert_total_count(st, first_host_and_port, 1); // Destroy stream: mongoc_client_destroy(client); // Expect active count decremented: stream_tracker_assert_active_count(st, first_host_and_port, 0); // Expect total count unchanged: stream_tracker_assert_total_count(st, first_host_and_port, 1); stream_tracker_destroy(st); } // Test client-pool: { stream_tracker_t *st = stream_tracker_new(); mongoc_client_pool_t *pool = test_framework_new_default_client_pool(); stream_tracker_track_pool(st, pool); // Expect initial count is 0: stream_tracker_assert_active_count(st, first_host_and_port, 0); // Pop a client, triggering background connections to be created: mongoc_client_t *client = mongoc_client_pool_pop(pool); // Server 4.4 added support for streaming monitoring and has 2 monitoring connections. int monitor_count = test_framework_get_server_version() >= test_framework_str_to_version("4.4") ? 2 : 1; stream_tracker_assert_eventual_active_count(st, first_host_and_port, monitor_count); // Do operation requiring a stream. Target first host: bson_error_t error; ASSERT_OR_PRINT(mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL, 1 /* server ID */, NULL, &error), error); // Expect active and total count incremented: stream_tracker_assert_active_count(st, first_host_and_port, monitor_count + 1); stream_tracker_assert_total_count(st, first_host_and_port, monitor_count + 1); // Destroy pool. mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); // Expect active count decremented: stream_tracker_assert_active_count(st, first_host_and_port, 0); // Expect total count unchanged: stream_tracker_assert_total_count(st, first_host_and_port, monitor_count + 1); stream_tracker_destroy(st); } bson_free(first_host_and_port); } void test_stream_tracker_install(TestSuite *suite) { TestSuite_AddLive(suite, "/stream_tracker/selftest", test_stream_tracker); } mongo-c-driver-2.2.1/src/libmongoc/tests/stream-tracker.h000066400000000000000000000112151511661753600233560ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef STREAM_TRACKER_H #define STREAM_TRACKER_H #include #include #include #include // stream_tracker_t is a test utility to count streams created to servers. typedef struct stream_tracker_t stream_tracker_t; stream_tracker_t * stream_tracker_new(void); // stream_tracker_track_client tracks streams in a single-threaded client. void stream_tracker_track_client(stream_tracker_t *st, mongoc_client_t *client); // stream_tracker_track_pool tracks streams in a pool. Call before calling mongoc_client_pool_pop. void stream_tracker_track_pool(stream_tracker_t *st, mongoc_client_pool_t *pool); // stream_tracker_count_active returns a count of active streams. int stream_tracker_count_active(stream_tracker_t *st, const char *host); // stream_tracker_count_total returns a cumulative count of streams. int stream_tracker_count_total(stream_tracker_t *st, const char *host); void stream_tracker_destroy(stream_tracker_t *st); #define stream_tracker_assert_active_count(st, host, expect) \ if (1) { \ int _got = stream_tracker_count_active(st, host); \ if (_got != expect) { \ test_error("Got unexpected active stream count to %s:\n" \ " Expected %d, got %d", \ host, \ expect, \ _got); \ } \ } else \ ((void)0) #define stream_tracker_assert_total_count(st, host, expect) \ if (1) { \ int _got = stream_tracker_count_total(st, host); \ if (_got != expect) { \ test_error("Got unexpected total stream count to %s:\n" \ " Expected %d, got %d", \ host, \ expect, \ _got); \ } \ } else \ ((void)0) #define stream_tracker_assert_eventual_active_count(st, host, expect) \ if (1) { \ mlib_timer _timer = mlib_expires_after(5, s); \ while (true) { \ int _got = stream_tracker_count_active(st, host); \ if (_got == expect) { \ break; \ } \ if (mlib_timer_is_expired(_timer)) { \ test_error("Timed out waiting for expected active stream count to %s:\n" \ " Expected %d, got %d", \ host, \ expect, \ _got); \ } \ mlib_sleep_for(100, ms); \ } \ } else \ ((void)0) #endif // STREAM_TRACKER_H mongo-c-driver-2.2.1/src/libmongoc/tests/test-awsauth.c000066400000000000000000000416621511661753600230670ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // test-awsauth.c tests authentication with the MONGODB-AWS authMechanism. // It may be run in an AWS ECS task or EC2 instance. #include #include #include #include // _mongoc_getenv #include #include #include #include // Ensure stdout and stderr are flushed prior to possible following abort(). #define MONGOC_STDERR_PRINTF(format, ...) \ if (1) { \ fflush(stdout); \ fprintf(stderr, format, __VA_ARGS__); \ fflush(stderr); \ } else \ ((void)0) #define ASSERT(Cond) \ if (1) { \ if (!(Cond)) { \ MONGOC_STDERR_PRINTF( \ "FAIL:%s:%d %s()\n Condition '%s' failed.\n", __FILE__, (int)(__LINE__), BSON_FUNC, BSON_STR(Cond)); \ abort(); \ } \ } else \ ((void)0) #define ASSERTF(Cond, Fmt, ...) \ if (1) { \ if (!(Cond)) { \ MONGOC_STDERR_PRINTF( \ "FAIL:%s:%d %s()\n Condition '%s' failed.\n", __FILE__, (int)(__LINE__), BSON_FUNC, BSON_STR(Cond)); \ MONGOC_STDERR_PRINTF("MESSAGE: " Fmt "\n", __VA_ARGS__); \ abort(); \ } \ } else \ ((void)0) #define FAILF(Fmt, ...) \ if (1) { \ MONGOC_STDERR_PRINTF( \ "FAIL:%s:%d %s()\n Condition '%s' failed.\n", __FILE__, (int)(__LINE__), BSON_FUNC, BSON_STR(Cond)); \ MONGOC_STDERR_PRINTF("MESSAGE: " Fmt "\n", __VA_ARGS__); \ abort(); \ } else \ ((void)0) static void test_auth(mongoc_database_t *db, bool expect_failure) { bson_error_t error; bson_t *ping = BCON_NEW("ping", BCON_INT32(1)); bool ok = mongoc_database_command_with_opts(db, ping, NULL /* read_prefs */, NULL /* opts */, NULL /* reply */, &error); if (expect_failure) { ASSERTF(!ok, "%s", "Expected auth failure, but got success"); } else { ASSERTF(ok, "Expected auth success, but got error: %s", error.message); } bson_destroy(ping); } // creds_eq returns true if `a` and `b` contain the same credentials. static bool creds_eq(_mongoc_aws_credentials_t *a, _mongoc_aws_credentials_t *b) { BSON_ASSERT_PARAM(a); BSON_ASSERT_PARAM(b); if (0 != strcmp(a->access_key_id, b->access_key_id)) { return false; } if (0 != strcmp(a->secret_access_key, b->secret_access_key)) { return false; } if (0 != strcmp(a->session_token, b->session_token)) { return false; } if (a->expiration.set != b->expiration.set) { return false; } if (a->expiration.set) { if (mlib_time_cmp(a->expiration.value.expires_at, !=, b->expiration.value.expires_at)) { return false; } } return true; } // clear_env sets all AWS environment variables to empty strings. static void clear_env(void) { ASSERT(_mongoc_setenv("AWS_ACCESS_KEY_ID", "")); ASSERT(_mongoc_setenv("AWS_SECRET_ACCESS_KEY", "")); ASSERT(_mongoc_setenv("AWS_SESSION_TOKEN", "")); } // caching_expected returns true if MONGODB-AWS authentication is expected to // cache credentials. Caching is expected when credentials are not passed // through the URI or environment variables. static bool caching_expected(const mongoc_uri_t *uri) { if (mongoc_uri_get_username(uri)) { // AWS credentials in the URI like: // "mongodb://:@mongodb.example.com/?authMechanism=MONGODB-AWS" // are not cached. return false; } char *got = _mongoc_getenv("AWS_ACCESS_KEY_ID"); if (NULL != got) { bson_free(got); // AWS credentials passed in environment are not cached. return false; } return true; } // do_find runs a find command. Returns false and sets `error` on error. static bool do_find(mongoc_client_t *client, bson_error_t *error) { ASSERT(client); bson_t *filter = bson_new(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "aws", "coll"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, filter, NULL /* opts */, NULL /* read prefs */); const bson_t *doc; while (mongoc_cursor_next(cursor, &doc)) ; bool ok = !mongoc_cursor_error(cursor, error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); bson_destroy(filter); return ok; } static void test_cache(const mongoc_uri_t *uri) { bson_error_t error; if (!caching_expected(uri)) { printf("Caching credentials is not expected. Skipping tests expecting " "credential caching.\n"); return; } // Clear the cache. _mongoc_aws_credentials_cache_clear(); // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation adds credentials to the cache. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } // Override the cached credentials with an "Expiration" that is within one // minute of the current UTC time. _mongoc_aws_credentials_t first_cached = MONGOC_AWS_CREDENTIALS_INIT; { ASSERT(mongoc_aws_credentials_cache.cached.set); mongoc_aws_credentials_cache.cached.value.expiration.set = true; mongoc_aws_credentials_cache.cached.value.expiration.value = mlib_expires_after(mlib_duration((1, mn), minus, MONGOC_AWS_CREDENTIALS_EXPIRATION_WINDOW)); _mongoc_aws_credentials_copy_to(&mongoc_aws_credentials_cache.cached.value, &first_cached); } // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation updates the credentials in the cache. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); ASSERTF(!creds_eq(&first_cached, &mongoc_aws_credentials_cache.cached.value), "%s", "expected unequal credentials, got equal"); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } _mongoc_aws_credentials_cleanup(&first_cached); // Poison the cache with an invalid access key id. { ASSERT(mongoc_aws_credentials_cache.cached.set); bson_free(mongoc_aws_credentials_cache.cached.value.access_key_id); mongoc_aws_credentials_cache.cached.value.access_key_id = bson_strdup("invalid"); } // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation results in an error. ASSERT(!do_find(client, &error)); ASSERTF(NULL != strstr(error.message, "Authentication failed"), "Expected error to contain '%s', but got '%s'", "Authentication failed", error.message); // Ensure that the cache has been cleared. bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(!found); _mongoc_aws_credentials_cleanup(&creds); // Ensure that a subsequent ``find`` operation succeeds. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); // Ensure that the cache has been set. found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } } static void test_cache_with_env(const mongoc_uri_t *uri) { bson_error_t error; if (!caching_expected(uri)) { printf("Caching credentials is not expected. Skipping tests expecting " "credential caching.\n"); return; } // Clear the cache. _mongoc_aws_credentials_cache_clear(); // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation adds credentials to the cache. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); // Set the AWS environment variables based on the cached credentials. ASSERT(_mongoc_setenv("AWS_ACCESS_KEY_ID", mongoc_aws_credentials_cache.cached.value.access_key_id)); ASSERT(_mongoc_setenv("AWS_SECRET_ACCESS_KEY", mongoc_aws_credentials_cache.cached.value.secret_access_key)); ASSERT(_mongoc_setenv("AWS_SESSION_TOKEN", mongoc_aws_credentials_cache.cached.value.session_token)); // Clear the cache. _mongoc_aws_credentials_cache_clear(); mongoc_client_destroy(client); } // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation succeeds and does not add credentials // to the cache. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(!found); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } // Set the AWS environment variables to invalid values. ASSERT(_mongoc_setenv("AWS_ACCESS_KEY_ID", "invalid")); // Create a new client. { mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation results in an error. ASSERT(!do_find(client, &error)); ASSERTF(NULL != strstr(error.message, "Authentication failed"), "Expected error to contain '%s', but got '%s'", "Authentication failed", error.message); mongoc_client_destroy(client); } // Clear the AWS environment variables. clear_env(); // Clear the cache. _mongoc_aws_credentials_cache_clear(); // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation adds credentials to the cache. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } // Set the AWS environment variables to invalid values. ASSERT(_mongoc_setenv("AWS_ACCESS_KEY_ID", "invalid")); // Create a new client. { _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation succeeds. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); mongoc_client_destroy(client); } // Clear the AWS environment variables. clear_env(); } BSON_THREAD_FUN(auth_fn, uri_void) { bson_error_t error; const mongoc_uri_t *uri = uri_void; mongoc_client_t *client = mongoc_client_new_from_uri(uri); ASSERT(client); // Ensure that a ``find`` operation succeeds. ASSERTF(do_find(client, &error), "expected success, got: %s", error.message); mongoc_client_destroy(client); BSON_THREAD_RETURN; } static void test_multithreaded(const mongoc_uri_t *uri) { // Test authenticating in many threads concurrently. bson_thread_t threads[64]; for (size_t i = 0; i < sizeof threads / sizeof threads[0]; i++) { ASSERT(0 == mcommon_thread_create(&threads[i], auth_fn, (void *)uri)); } for (size_t i = 0; i < sizeof threads / sizeof threads[0]; i++) { ASSERT(0 == mcommon_thread_join(threads[i])); } // Verify that credentials are cached. if (caching_expected(uri)) { // Assert credentials are cached. _mongoc_aws_credentials_t creds = MONGOC_AWS_CREDENTIALS_INIT; bool found = _mongoc_aws_credentials_cache_get(&creds); ASSERT(found); _mongoc_aws_credentials_cleanup(&creds); } } static void log_func(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { if (log_level != MONGOC_LOG_LEVEL_TRACE) { mongoc_log_default_handler(log_level, log_domain, message, user_data); return; } // Only log trace messages from AWS auth. if (0 == strcmp(log_domain, "aws_auth")) { mongoc_log_default_handler(log_level, log_domain, message, user_data); } // Do not print other trace logs to reduce verbosity. } int main(int argc, char *argv[]) { mongoc_database_t *db; mongoc_client_t *client; bson_error_t error; mongoc_uri_t *uri; bool expect_failure; if (argc != 3) { FAILF("usage: %s URI [EXPECT_SUCCESS|EXPECT_FAILURE]\n", argv[0]); } // Set a custom log callback to only print trace messages related to fetching // AWS credentials. mongoc_log_set_handler(log_func, NULL /* user_data */); mongoc_init(); uri = mongoc_uri_new_with_error(argv[1], &error); ASSERTF(uri, "Failed to create URI: %s", error.message); if (0 == strcmp(argv[2], "EXPECT_FAILURE")) { expect_failure = true; } else if (0 == strcmp(argv[2], "EXPECT_SUCCESS")) { expect_failure = false; } else { FAILF("Expected 'EXPECT_FAILURE' or 'EXPECT_SUCCESS' for argument. Got: %s", argv[2]); } client = mongoc_client_new_from_uri(uri); ASSERT(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); db = mongoc_client_get_database(client, "test"); test_auth(db, expect_failure); if (!expect_failure) { // The test_cache_* functions implement the "Cached Credentials" tests // from the specification. test_cache(uri); test_cache_with_env(uri); test_multithreaded(uri); } mongoc_database_destroy(db); mongoc_uri_destroy(uri); mongoc_client_destroy(client); printf("%s tests passed\n", argv[0]); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-azurekms.c000066400000000000000000000047241511661753600232520ustar00rootroot00000000000000#include int main(void) { char *mongodb_uri = getenv("MONGODB_URI"); char *expect_error = getenv("EXPECT_ERROR"); char *keyName = getenv("KEY_NAME"); char *keyVaultEndpoint = getenv("KEY_VAULT_ENDPOINT"); if (!mongodb_uri || !keyName || !keyVaultEndpoint) { MONGOC_ERROR("Error: expecting environment variables to be set: " "MONGODB_URI, KEY_NAME, KEY_VAULT_ENDPOINT"); return EXIT_FAILURE; } mongoc_init(); mongoc_client_t *keyvault_client = mongoc_client_new(mongodb_uri); MONGOC_DEBUG("libmongoc version: %s", mongoc_get_version()); mongoc_client_encryption_opts_t *ceopts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_client(ceopts, keyvault_client); mongoc_client_encryption_opts_set_keyvault_namespace(ceopts, "keyvault", "datakeys"); bson_t *kms_providers = BCON_NEW("azure", "{", "}"); mongoc_client_encryption_opts_set_kms_providers(ceopts, kms_providers); bson_error_t error; mongoc_client_encryption_t *ce = mongoc_client_encryption_new(ceopts, &error); if (!ce) { MONGOC_ERROR("Error in mongoc_client_encryption_new: %s", error.message); return EXIT_FAILURE; } mongoc_client_encryption_datakey_opts_t *dkopts; dkopts = mongoc_client_encryption_datakey_opts_new(); bson_t *masterkey = BCON_NEW("keyVaultEndpoint", BCON_UTF8(keyVaultEndpoint), "keyName", BCON_UTF8(keyName)); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, masterkey); bson_value_t keyid; bool got = mongoc_client_encryption_create_datakey(ce, "azure", dkopts, &keyid, &error); if (NULL != expect_error) { if (got) { MONGOC_ERROR("Expected error to contain %s, but got success", expect_error); return EXIT_FAILURE; } if (NULL == strstr(error.message, expect_error)) { MONGOC_ERROR("Expected error to contain %s, but got: %s", expect_error, error.message); return EXIT_FAILURE; } } else { if (!got) { MONGOC_ERROR("Expected to create data key, but got error: %s", error.message); return EXIT_FAILURE; } MONGOC_DEBUG("Created key\n"); } bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_datakey_opts_destroy(dkopts); mongoc_client_encryption_destroy(ce); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceopts); mongoc_client_destroy(keyvault_client); mongoc_cleanup(); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-conveniences.c000066400000000000000000001445171511661753600240750ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include /* For strcasecmp on Windows */ #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif #include static bool gConveniencesInitialized = false; static mongoc_array_t gTmpBsonArray; static mongoc_array_t gTmpStringArray; static char *gHugeString; static size_t gHugeStringLength; static char *gFourMBString; void test_conveniences_init(void) { if (!gConveniencesInitialized) { _mongoc_array_init(&gTmpBsonArray, sizeof(bson_t *)); _mongoc_array_init(&gTmpStringArray, sizeof(char *)); atexit(test_conveniences_cleanup); gConveniencesInitialized = true; gHugeString = NULL; gFourMBString = NULL; } } void test_conveniences_cleanup(void) { bson_t *doc; if (gConveniencesInitialized) { for (size_t i = 0u; i < gTmpBsonArray.len; i++) { doc = _mongoc_array_index(&gTmpBsonArray, bson_t *, i); bson_destroy(doc); } for (size_t i = 0u; i < gTmpStringArray.len; i++) { char *str; str = _mongoc_array_index(&gTmpStringArray, char *, i); bson_free(str); } _mongoc_array_destroy(&gTmpBsonArray); _mongoc_array_destroy(&gTmpStringArray); bson_free(gHugeString); bson_free(gFourMBString); gConveniencesInitialized = false; } } void value_init_from_doc(bson_value_t *value, const bson_t *doc) { BSON_ASSERT(doc); value->value_type = BSON_TYPE_DOCUMENT; value->value.v_doc.data = bson_malloc((size_t)doc->len); memcpy(value->value.v_doc.data, bson_get_data(doc), (size_t)doc->len); value->value.v_doc.data_len = doc->len; } MONGOC_PRINTF_FORMAT(1, 2) bson_t * tmp_bson(const char *json, ...) { va_list args; bson_error_t error; char *formatted; char *double_quoted; bson_t *doc; test_conveniences_init(); if (json) { va_start(args, json); formatted = bson_strdupv_printf(json, args); va_end(args); double_quoted = single_quotes_to_double(formatted); doc = bson_new_from_json((const uint8_t *)double_quoted, -1, &error); if (!doc) { test_error("tmp_bson error %s: parsing: %s", error.message, json); } bson_free(formatted); bson_free(double_quoted); } else { doc = bson_new(); } _mongoc_array_append_val(&gTmpBsonArray, doc); return doc; } MONGOC_PRINTF_FORMAT(1, 2) const char * tmp_str(const char *format, ...) { va_list args; char *str; test_conveniences_init(); va_start(args, format); str = bson_strdupv_printf(format, args); va_end(args); _mongoc_array_append_val(&gTmpStringArray, str); return (const char *)str; } const char * tmp_json(const bson_t *bson) { char *str; test_conveniences_init(); if (!bson) { return "(NULL)"; } str = bson_as_canonical_extended_json(bson, NULL); _mongoc_array_append_val(&gTmpStringArray, str); return (const char *)str; } /* Look up a field by a dot separate path, or abort. */ void bson_lookup(const bson_t *bson, const char *path, bson_iter_t *out) { bson_iter_t iter; bson_iter_init(&iter, bson); if (!bson_iter_find_descendant(&iter, path, out)) { test_error("'%s' field not found in BSON: %s", path, tmp_json(bson)); } } /*-------------------------------------------------------------------------- * * bson_iter_bson -- * * Statically init a bson_t from an iter at an array or document. * *-------------------------------------------------------------------------- */ void bson_iter_bson(const bson_iter_t *iter, bson_t *bson) { uint32_t len; const uint8_t *data; BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(iter) || BSON_ITER_HOLDS_ARRAY(iter)); if (BSON_ITER_HOLDS_DOCUMENT(iter)) { bson_iter_document(iter, &len, &data); } else { bson_iter_array(iter, &len, &data); } BSON_ASSERT(bson_init_static(bson, data, len)); } /*-------------------------------------------------------------------------- * * bson_lookup_utf8 -- * * Return a string by key, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ const char * bson_lookup_utf8(const bson_t *b, const char *key) { bson_iter_t iter; bson_lookup(b, key, &iter); ASSERT_WITH_MSG(BSON_ITER_HOLDS_UTF8(&iter), "'%s' is not a string: %s", key, tmp_json(b)); return bson_iter_utf8(&iter, NULL); } /*-------------------------------------------------------------------------- * * bson_lookup_value -- * * Return a bson_value_t or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ void bson_lookup_value(const bson_t *b, const char *key, bson_value_t *value) { bson_iter_t iter; bson_lookup(b, key, &iter); bson_value_copy(bson_iter_value(&iter), value); } bson_t * bson_lookup_bson(const bson_t *b, const char *key) { bson_iter_t iter; bson_t tmp; bson_lookup(b, key, &iter); if (!BSON_ITER_HOLDS_DOCUMENT(&iter) && !BSON_ITER_HOLDS_ARRAY(&iter)) { test_error("Expected '%s' to resolve to BSON: %s", key, tmp_json(b)); } bson_iter_bson(&iter, &tmp); return bson_new_from_data(bson_get_data(&tmp), tmp.len); } /*-------------------------------------------------------------------------- * * bson_lookup_doc -- * * Find a subdocument by key and return it by static-initializing * the passed-in bson_t "doc". There is no need to bson_destroy * "doc". Asserts and aborts if the key is absent or not a subdoc. * *-------------------------------------------------------------------------- */ void bson_lookup_doc(const bson_t *b, const char *key, bson_t *doc) { bson_iter_t iter; bson_lookup(b, key, &iter); bson_iter_bson(&iter, doc); } /*-------------------------------------------------------------------------- * * bson_lookup_bool -- * * Return a bool by key, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ bool bson_lookup_bool(const bson_t *b, const char *key) { bson_iter_t iter; bson_lookup(b, key, &iter); ASSERT_WITH_MSG(BSON_ITER_HOLDS_BOOL(&iter), "'%s' is not a bool: %s", key, tmp_json(b)); return bson_iter_bool(&iter); } /*-------------------------------------------------------------------------- * * bson_lookup_int32 -- * * Return an int32_t by key, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ int32_t bson_lookup_int32(const bson_t *b, const char *key) { bson_iter_t iter; bson_lookup(b, key, &iter); ASSERT_WITH_MSG(BSON_ITER_HOLDS_INT32(&iter), "'%s' is not a int32: %s", key, tmp_json(b)); return bson_iter_int32(&iter); } /*-------------------------------------------------------------------------- * * bson_lookup_int64 -- * * Return an int64_t by key, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ int64_t bson_lookup_int64(const bson_t *b, const char *key) { bson_iter_t iter; bson_lookup(b, key, &iter); ASSERT_WITH_MSG(BSON_ITER_HOLDS_INT64(&iter), "'%s' is not a int64: %s", key, tmp_json(b)); return bson_iter_int64(&iter); } /*-------------------------------------------------------------------------- * * bson_lookup_read_concern -- * * Find a subdocument like {level: "majority"} and interpret it as a * mongoc_read_concern_t, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ mongoc_read_concern_t * bson_lookup_read_concern(const bson_t *b, const char *key) { bson_t doc; mongoc_read_concern_t *rc = mongoc_read_concern_new(); bson_lookup_doc(b, key, &doc); if (!bson_has_field(&doc, "level")) { /* empty document means default read concern. */ return rc; } mongoc_read_concern_set_level(rc, bson_lookup_utf8(&doc, "level")); return rc; } /*-------------------------------------------------------------------------- * * bson_lookup_write_concern -- * * Find a subdocument like {w: } and interpret it as a * mongoc_write_concern_t, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ mongoc_write_concern_t * bson_lookup_write_concern(const bson_t *b, const char *key) { mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t doc; bson_iter_t iter; bson_iter_t w; bson_lookup_doc(b, key, &doc); BSON_ASSERT(bson_iter_init(&iter, &doc)); if (!bson_iter_find_descendant(&iter, "w", &w)) { /* empty document means default write concern. */ return wc; } if (BSON_ITER_HOLDS_NUMBER(&w)) { mongoc_write_concern_set_w(wc, (int32_t)bson_iter_as_int64(&w)); } else if (!strcmp(bson_iter_utf8(&w, NULL), "majority")) { mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { mongoc_write_concern_set_wtag(wc, bson_iter_utf8(&w, NULL)); } if (bson_has_field(&doc, "wtimeout")) { mongoc_write_concern_set_wtimeout_int64(wc, bson_lookup_int32(&doc, "wtimeout")); } if (bson_has_field(&doc, "j")) { mongoc_write_concern_set_journal(wc, bson_lookup_bool(&doc, "j")); } return wc; } /*-------------------------------------------------------------------------- * * bson_lookup_read_prefs -- * * Find a subdocument like {mode: "mode"} and interpret it as a * mongoc_read_prefs_t, or BSON_ASSERT and abort. * *-------------------------------------------------------------------------- */ mongoc_read_prefs_t * bson_lookup_read_prefs(const bson_t *b, const char *key) { bson_t doc; const char *str; mongoc_read_mode_t mode; bson_lookup_doc(b, key, &doc); str = bson_lookup_utf8(&doc, "mode"); if (0 == strcasecmp("primary", str)) { mode = MONGOC_READ_PRIMARY; } else if (0 == strcasecmp("primarypreferred", str)) { mode = MONGOC_READ_PRIMARY_PREFERRED; } else if (0 == strcasecmp("secondary", str)) { mode = MONGOC_READ_SECONDARY; } else if (0 == strcasecmp("secondarypreferred", str)) { mode = MONGOC_READ_SECONDARY_PREFERRED; } else if (0 == strcasecmp("nearest", str)) { mode = MONGOC_READ_NEAREST; } else { test_error("Bad readPreference: {\"mode\": \"%s\"}.", str); } return mongoc_read_prefs_new(mode); } /*-------------------------------------------------------------------------- * * bson_lookup_database_opts -- * * Interpret a subdocument as database options. * *-------------------------------------------------------------------------- */ void bson_lookup_database_opts(const bson_t *b, const char *key, mongoc_database_t *database) { bson_t doc; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; mongoc_read_prefs_t *prefs; bson_lookup_doc(b, key, &doc); if (bson_has_field(&doc, "readConcern")) { rc = bson_lookup_read_concern(&doc, "readConcern"); mongoc_database_set_read_concern(database, rc); mongoc_read_concern_destroy(rc); } if (bson_has_field(&doc, "writeConcern")) { wc = bson_lookup_write_concern(&doc, "writeConcern"); mongoc_database_set_write_concern(database, wc); mongoc_write_concern_destroy(wc); } if (bson_has_field(&doc, "readPreference")) { prefs = bson_lookup_read_prefs(&doc, "readPreference"); mongoc_database_set_read_prefs(database, prefs); mongoc_read_prefs_destroy(prefs); } } /*-------------------------------------------------------------------------- * * bson_lookup_collection_opts -- * * Interpret a subdocument as collection options. * *-------------------------------------------------------------------------- */ void bson_lookup_collection_opts(const bson_t *b, const char *key, mongoc_collection_t *collection) { bson_t doc; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; mongoc_read_prefs_t *prefs; bson_lookup_doc(b, key, &doc); if (bson_has_field(&doc, "readConcern")) { rc = bson_lookup_read_concern(&doc, "readConcern"); mongoc_collection_set_read_concern(collection, rc); mongoc_read_concern_destroy(rc); } if (bson_has_field(&doc, "writeConcern")) { wc = bson_lookup_write_concern(&doc, "writeConcern"); mongoc_collection_set_write_concern(collection, wc); mongoc_write_concern_destroy(wc); } if (bson_has_field(&doc, "readPreference")) { prefs = bson_lookup_read_prefs(&doc, "readPreference"); mongoc_collection_set_read_prefs(collection, prefs); mongoc_read_prefs_destroy(prefs); } } /*-------------------------------------------------------------------------- * * bson_lookup_txn_opts -- * * Interpret a subdocument as transaction options. * *-------------------------------------------------------------------------- */ mongoc_transaction_opt_t * bson_lookup_txn_opts(const bson_t *b, const char *key) { bson_t doc; mongoc_transaction_opt_t *opts; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; mongoc_read_prefs_t *prefs; int64_t max_commit_time_ms; bson_lookup_doc(b, key, &doc); opts = mongoc_transaction_opts_new(); if (bson_has_field(&doc, "readConcern")) { rc = bson_lookup_read_concern(&doc, "readConcern"); mongoc_transaction_opts_set_read_concern(opts, rc); mongoc_read_concern_destroy(rc); } if (bson_has_field(&doc, "writeConcern")) { wc = bson_lookup_write_concern(&doc, "writeConcern"); mongoc_transaction_opts_set_write_concern(opts, wc); mongoc_write_concern_destroy(wc); } if (bson_has_field(&doc, "readPreference")) { prefs = bson_lookup_read_prefs(&doc, "readPreference"); mongoc_transaction_opts_set_read_prefs(opts, prefs); mongoc_read_prefs_destroy(prefs); } if (bson_has_field(&doc, "maxCommitTimeMS")) { max_commit_time_ms = bson_lookup_int32(&doc, "maxCommitTimeMS"); mongoc_transaction_opts_set_max_commit_time_ms(opts, max_commit_time_ms); } return opts; } /*-------------------------------------------------------------------------- * * bson_lookup_session_opts -- * * Interpret a subdocument as client session options. * *-------------------------------------------------------------------------- */ mongoc_session_opt_t * bson_lookup_session_opts(const bson_t *b, const char *key) { bson_t doc; mongoc_session_opt_t *opts; bson_lookup_doc(b, key, &doc); opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(opts, _mongoc_lookup_bool(&doc, "causalConsistency", true)); if (bson_has_field(&doc, "defaultTransactionOptions")) { mongoc_transaction_opt_t *txn_opts; txn_opts = bson_lookup_txn_opts(&doc, "defaultTransactionOptions"); mongoc_session_opts_set_default_transaction_opts(opts, txn_opts); mongoc_transaction_opts_destroy(txn_opts); } return opts; } /*-------------------------------------------------------------------------- * * bson_lookup_session -- * * Interpret a subdocument as a client session with options. * *-------------------------------------------------------------------------- */ mongoc_client_session_t * bson_lookup_session(const bson_t *b, const char *key, mongoc_client_t *client) { ASSERT(client); mongoc_session_opt_t *opts; mongoc_client_session_t *session; bson_error_t error; opts = bson_lookup_session_opts(b, key); session = mongoc_client_start_session(client, opts, &error); ASSERT_OR_PRINT(session, error); mongoc_session_opts_destroy(opts); return session; } static bool get_exists_operator(const bson_value_t *value, bool *exists); static bool get_empty_operator(const bson_value_t *value, bool *exists); static bool get_type_operator(const bson_value_t *value, bson_type_t *out); static bool is_empty_doc_or_array(const bson_value_t *value); static bool find(bson_iter_t *iter, const bson_t *doc, const char *key, bool is_command, bool is_first, bool retain_dots_in_keys); /*-------------------------------------------------------------------------- * * single_quotes_to_double -- * * Copy str with single-quotes replaced by double. * * Returns: * A string you must bson_free. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * single_quotes_to_double(const char *str) { char *result = bson_strdup(str); char *p; for (p = result; *p; p++) { if (*p == '\'') { *p = '"'; } } return result; } /*-------------------------------------------------------------------------- * * match_json -- * * Call match_bson on "doc" and "json_pattern". * For convenience, single-quotes are synonymous with double-quotes. * * A NULL doc or NULL json_pattern means "{}". * * Returns: * True or false. * * Side effects: * Logs if no match. Aborts if json is malformed. * *-------------------------------------------------------------------------- */ MONGOC_PRINTF_FORMAT(6, 7) bool match_json(const bson_t *doc, bool is_command, const char *filename, int lineno, const char *funcname, const char *json_pattern, ...) { va_list args; char *json_pattern_formatted; char *double_quoted; bson_error_t error; bson_t *pattern; match_ctx_t ctx = {{0}}; bool matches; va_start(args, json_pattern); json_pattern_formatted = bson_strdupv_printf(json_pattern ? json_pattern : "{}", args); va_end(args); double_quoted = single_quotes_to_double(json_pattern_formatted); pattern = bson_new_from_json((const uint8_t *)double_quoted, -1, &error); if (!pattern) { test_error("couldn't parse JSON: %s", error.message); } ctx.is_command = is_command; matches = match_bson_with_ctx(doc, pattern, &ctx); if (!matches) { char *as_string = doc ? bson_as_canonical_extended_json(doc, NULL) : NULL; fprintf(stderr, "ASSERT_MATCH failed:\n" "document: %s\n" "pattern : %s\n" "error : %s\n" "%s:%d %s()\n", as_string ? as_string : "{}", double_quoted, ctx.errmsg, filename, lineno, funcname); bson_free(as_string); } bson_destroy(pattern); bson_free(json_pattern_formatted); bson_free(double_quoted); return matches; } /*-------------------------------------------------------------------------- * * match_bson -- * * Does "doc" match "pattern"? * * See match_bson_with_ctx for details. * * Returns: * True or false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool match_bson(const bson_t *doc, const bson_t *pattern, bool is_command) { match_ctx_t ctx = {{0}}; ctx.strict_numeric_types = true; ctx.is_command = is_command; return match_bson_with_ctx(doc, pattern, &ctx); } MONGOC_PRINTF_FORMAT(2, 3) void match_err(match_ctx_t *ctx, const char *fmt, ...) { va_list args; char *formatted; BSON_ASSERT(ctx); va_start(args, fmt); formatted = bson_strdupv_printf(fmt, args); va_end(args); bson_snprintf(ctx->errmsg, sizeof ctx->errmsg, "%s: %s", ctx->path, formatted); bson_free(formatted); } /* When matching two docs, and preparing to recurse to match two subdocs with * the given key, derive context for matching them from the current context. */ static void derive(match_ctx_t *ctx, match_ctx_t *derived, const char *key) { BSON_ASSERT(ctx); BSON_ASSERT(derived); BSON_ASSERT(key); derived->strict_numeric_types = ctx->strict_numeric_types; if (strlen(ctx->path) > 0) { bson_snprintf(derived->path, sizeof derived->path, "%s.%s", ctx->path, key); } else { bson_snprintf(derived->path, sizeof derived->path, "%s", key); } derived->retain_dots_in_keys = ctx->retain_dots_in_keys; derived->allow_placeholders = ctx->allow_placeholders; derived->visitor_ctx = ctx->visitor_ctx; derived->visitor_fn = ctx->visitor_fn; derived->is_command = false; derived->errmsg[0] = 0; } /*-------------------------------------------------------------------------- * * match_bson_with_ctx -- * * Does "doc" match "pattern"? * * "doc" matches "pattern" if its key-value pairs are a simple * superset of pattern's. Order matters. * * Matching $-prefixed keys is supported (e.g. `$readPreference`) * excluding these special patterns: * "field": {"$exists": true/false} * "field": {"$empty": true/false} * "field": {"$$type": "type string"} * * The first key matches case-insensitively if ctx->is_command. * * An optional match visitor (match_visitor_fn and match_visitor_ctx) * can be set in ctx to provide custom matching behavior. * * A NULL doc or NULL pattern means "{}". * * Returns: * True or false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool match_bson_with_ctx(const bson_t *doc, const bson_t *pattern, match_ctx_t *ctx) { bson_iter_t pattern_iter; const char *key; const bson_value_t *value; bool is_first = true; bool is_exists_operator; bool is_empty_operator; bool is_type_operator; bool exists; bool empty = false; bson_type_t bson_type = (bson_type_t)0; bool found; bson_iter_t doc_iter; bson_value_t doc_value = {0}; match_ctx_t derived; if (bson_empty0(pattern)) { /* matches anything */ return true; } BSON_ASSERT(bson_iter_init(&pattern_iter, pattern)); while (bson_iter_next(&pattern_iter)) { key = bson_iter_key(&pattern_iter); value = bson_iter_value(&pattern_iter); found = find(&doc_iter, doc, key, ctx->is_command, is_first, ctx->retain_dots_in_keys); if (found) { bson_value_copy(bson_iter_value(&doc_iter), &doc_value); } /* is value {"$exists": true} or {"$exists": false} ? */ is_exists_operator = get_exists_operator(value, &exists); /* is value {"$empty": true} or {"$empty": false} ? */ is_empty_operator = get_empty_operator(value, &empty); /* is value {"$$type": "string" } ? */ is_type_operator = get_type_operator(value, &bson_type); derive(ctx, &derived, key); if (ctx->visitor_fn) { match_action_t action = ctx->visitor_fn(ctx, &pattern_iter, found ? &doc_iter : NULL); if (action == MATCH_ACTION_ABORT) { // Visitor encountered a match error. goto fail; } else if (action == MATCH_ACTION_SKIP) { // Visitor handled match of this field. Skip any additional matching // of this field. goto next; } ASSERT(action == MATCH_ACTION_CONTINUE); } // `doc_value` is set by `bson_value_copy` above and guarded by `found`. if (value->value_type == BSON_TYPE_NULL && found) { /* pattern has "key": null, and "key" is in doc */ if (doc_value.value_type != BSON_TYPE_NULL) { match_err(&derived, "%s should be null or absent", key); goto fail; } } else if (is_exists_operator) { if (exists != found) { match_err(&derived, "%s found", found ? "" : "not"); goto fail; } } else if (!found) { match_err(&derived, "not found"); goto fail; } else if (is_empty_operator) { if (empty != is_empty_doc_or_array(&doc_value)) { match_err(&derived, "%s found", empty ? "" : " not"); goto fail; } } else if (is_type_operator) { if (doc_value.value_type != bson_type) { match_err(&derived, "incorrect type"); goto fail; } } else if (!match_bson_value(&doc_value, value, &derived)) { goto fail; } next: is_first = false; if (found) { bson_value_destroy(&doc_value); } } return true; fail: if (found) { bson_value_destroy(&doc_value); } if (strlen(derived.errmsg) > 0) { strcpy(ctx->errmsg, derived.errmsg); } return false; } /*-------------------------------------------------------------------------- * * find -- * * Find the value for a key. * * Returns: * Whether the key was found. * * Side effects: * Copies the found value into "iter_out". * *-------------------------------------------------------------------------- */ static bool find( bson_iter_t *iter_out, const bson_t *doc, const char *key, bool is_command, bool is_first, bool retain_dots_in_keys) { bson_iter_t iter; bson_iter_t descendent; bson_iter_init(&iter, doc); if (!retain_dots_in_keys && strchr(key, '.')) { if (!bson_iter_find_descendant(&iter, key, &descendent)) { return false; } memcpy(iter_out, &descendent, sizeof(bson_iter_t)); return true; } else if (is_command && is_first) { if (!bson_iter_find_case(&iter, key)) { return false; } } else if (!bson_iter_find(&iter, key)) { return false; } memcpy(iter_out, &iter, sizeof(bson_iter_t)); return true; } bool bson_init_from_value(bson_t *b, const bson_value_t *v) { BSON_ASSERT(v->value_type == BSON_TYPE_ARRAY || v->value_type == BSON_TYPE_DOCUMENT); return bson_init_static(b, v->value.v_doc.data, v->value.v_doc.data_len); } static bool _is_operator(const char *op_name, const bson_value_t *value, bool *op_val) { bson_t bson; bson_iter_t iter; if (value->value_type == BSON_TYPE_DOCUMENT && bson_init_from_value(&bson, value) && bson_iter_init_find(&iter, &bson, op_name)) { *op_val = bson_iter_as_bool(&iter); return true; } return false; } /*-------------------------------------------------------------------------- * * get_exists_operator -- * * Is value a subdocument like {"$exists": bool}? * * Returns: * True if the value is a subdocument with the first key "$exists", * or if value is BSON null. * * Side effects: * If the function returns true, *exists is set to true or false, * the value of the bool. * *-------------------------------------------------------------------------- */ static bool get_exists_operator(const bson_value_t *value, bool *exists) { if (_is_operator("$exists", value, exists)) { return true; } if (value->value_type == BSON_TYPE_NULL) { *exists = false; return true; } return false; } /*-------------------------------------------------------------------------- * * get_empty_operator -- * * Is value a subdocument like {"$empty": bool}? * * Returns: * True if the value is a subdocument with the first key "$empty". * * Side effects: * If the function returns true, *empty is set to true or false, * the value of the bool. * *-------------------------------------------------------------------------- */ bool get_empty_operator(const bson_value_t *value, bool *empty) { return _is_operator("$empty", value, empty); } /*-------------------------------------------------------------------------- * * get_type_operator -- * * Is value a subdocument like {"$$type": "BSON type string"}? * * Returns: * True if the value is a subdocument with the first key "$$type", * and sets the @bson_type. * * Side effects: * If the function returns true, *@bson_type is set. * *-------------------------------------------------------------------------- */ static bool get_type_operator(const bson_value_t *value, bson_type_t *out) { bson_t bson; bson_iter_t iter; const char *value_string; /* See list of aliases on this page: * https://www.mongodb.com/docs/manual/reference/bson-types/ */ if (value->value_type == BSON_TYPE_DOCUMENT && bson_init_from_value(&bson, value) && bson_iter_init_find(&iter, &bson, "$$type")) { value_string = bson_iter_utf8(&iter, NULL); if (0 == strcasecmp("double", value_string)) { *out = BSON_TYPE_DOUBLE; } else if (0 == strcasecmp("string", value_string)) { *out = BSON_TYPE_UTF8; } else if (0 == strcasecmp("object", value_string)) { *out = BSON_TYPE_DOCUMENT; } else if (0 == strcasecmp("array", value_string)) { *out = BSON_TYPE_ARRAY; } else if (0 == strcasecmp("binData", value_string)) { *out = BSON_TYPE_BINARY; } else if (0 == strcasecmp("undefined", value_string)) { *out = BSON_TYPE_UNDEFINED; } else if (0 == strcasecmp("objectId", value_string)) { *out = BSON_TYPE_OID; } else if (0 == strcasecmp("bool", value_string)) { *out = BSON_TYPE_BOOL; } else if (0 == strcasecmp("date", value_string)) { *out = BSON_TYPE_DATE_TIME; } else if (0 == strcasecmp("null", value_string)) { *out = BSON_TYPE_NULL; } else if (0 == strcasecmp("regex", value_string)) { *out = BSON_TYPE_REGEX; } else if (0 == strcasecmp("dbPointer", value_string)) { *out = BSON_TYPE_DBPOINTER; } else if (0 == strcasecmp("javascript", value_string)) { *out = BSON_TYPE_CODE; } else if (0 == strcasecmp("symbol", value_string)) { *out = BSON_TYPE_SYMBOL; } else if (0 == strcasecmp("javascriptWithScope", value_string)) { *out = BSON_TYPE_CODEWSCOPE; } else if (0 == strcasecmp("int", value_string)) { *out = BSON_TYPE_INT32; } else if (0 == strcasecmp("timestamp", value_string)) { *out = BSON_TYPE_TIMESTAMP; } else if (0 == strcasecmp("long", value_string)) { *out = BSON_TYPE_INT64; } else if (0 == strcasecmp("decimal", value_string)) { *out = BSON_TYPE_DECIMAL128; } else if (0 == strcasecmp("minKey", value_string)) { *out = BSON_TYPE_MINKEY; } else if (0 == strcasecmp("maxKey", value_string)) { *out = BSON_TYPE_MAXKEY; } else { test_error("unrecognized $$type value: %s", value_string); } return true; } return false; } /*-------------------------------------------------------------------------- * * is_empty_doc_or_array -- * * Is value the subdocument {} or the array []? * *-------------------------------------------------------------------------- */ static bool is_empty_doc_or_array(const bson_value_t *value) { bson_t doc; if (!(value->value_type == BSON_TYPE_ARRAY || value->value_type == BSON_TYPE_DOCUMENT)) { return false; } BSON_ASSERT(bson_init_static(&doc, value->value.v_doc.data, value->value.v_doc.data_len)); return bson_count_keys(&doc) == 0; } static bool match_bson_arrays(const bson_t *array, const bson_t *pattern, match_ctx_t *ctx) { uint32_t array_count; uint32_t pattern_count; bson_iter_t array_iter; bson_iter_t pattern_iter; const bson_value_t *array_value; const bson_value_t *pattern_value; match_ctx_t derived; array_count = bson_count_keys(array); pattern_count = bson_count_keys(pattern); if (array_count != pattern_count) { match_err(ctx, "expected %" PRIu32 " keys, not %" PRIu32, pattern_count, array_count); return false; } BSON_ASSERT(bson_iter_init(&array_iter, array)); BSON_ASSERT(bson_iter_init(&pattern_iter, pattern)); while (bson_iter_next(&array_iter)) { BSON_ASSERT(bson_iter_next(&pattern_iter)); array_value = bson_iter_value(&array_iter); pattern_value = bson_iter_value(&pattern_iter); derive(ctx, &derived, bson_iter_key(&array_iter)); if (ctx && ctx->visitor_fn) { match_action_t action = ctx->visitor_fn(ctx, &pattern_iter, &array_iter); if (action == MATCH_ACTION_ABORT) { // Visitor encountered a match error. return false; } else if (action == MATCH_ACTION_SKIP) { // Visitor handled match of this field. Skip any additional matching // of this field. continue; } ASSERT(action == MATCH_ACTION_CONTINUE); } if (!match_bson_value(array_value, pattern_value, &derived)) { return false; } } return true; } static bool is_number_type(bson_type_t t) { if (t == BSON_TYPE_DOUBLE || t == BSON_TYPE_INT32 || t == BSON_TYPE_INT64) { return true; } return false; } int64_t bson_value_as_int64(const bson_value_t *value) { if (value->value_type == BSON_TYPE_DOUBLE) { return (int64_t)value->value.v_double; } else if (value->value_type == BSON_TYPE_INT32) { return (int64_t)value->value.v_int32; } else if (value->value_type == BSON_TYPE_INT64) { return value->value.v_int64; } else { test_error("bson_value_as_int64 called on value of type %d", (int)value->value_type); } } bool match_bson_value(const bson_value_t *doc, const bson_value_t *pattern, match_ctx_t *ctx) { bson_t subdoc; bson_t pattern_subdoc; int64_t doc_int64; int64_t pattern_int64; bool ret; if (ctx && ctx->allow_placeholders) { /* The change streams spec tests use the value 42 as a placeholder. */ bool is_placeholder = false; if (is_number_type(pattern->value_type) && bson_value_as_int64(pattern) == 42) { is_placeholder = true; } if (pattern->value_type == BSON_TYPE_UTF8 && !strcmp(pattern->value.v_utf8.str, "42")) { is_placeholder = true; } if (is_placeholder) { return true; } } if (is_number_type(doc->value_type) && is_number_type(pattern->value_type) && ctx && !ctx->strict_numeric_types) { doc_int64 = bson_value_as_int64(doc); pattern_int64 = bson_value_as_int64(pattern); if (doc_int64 != pattern_int64) { match_err(ctx, "expected %" PRId64 ", got %" PRId64, pattern_int64, doc_int64); return false; } return true; } if (doc->value_type != pattern->value_type) { match_err(ctx, "expected type %s, got %s", _mongoc_bson_type_to_str(pattern->value_type), _mongoc_bson_type_to_str(doc->value_type)); return false; } switch (doc->value_type) { case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: if (!bson_init_from_value(&subdoc, doc)) { return false; } if (!bson_init_from_value(&pattern_subdoc, pattern)) { bson_destroy(&subdoc); return false; } if (doc->value_type == BSON_TYPE_ARRAY) { ret = match_bson_arrays(&subdoc, &pattern_subdoc, ctx); } else { ret = match_bson_with_ctx(&subdoc, &pattern_subdoc, ctx); } bson_destroy(&subdoc); bson_destroy(&pattern_subdoc); return ret; case BSON_TYPE_BINARY: ret = doc->value.v_binary.data_len == pattern->value.v_binary.data_len && !memcmp(doc->value.v_binary.data, pattern->value.v_binary.data, doc->value.v_binary.data_len); break; case BSON_TYPE_BOOL: ret = doc->value.v_bool == pattern->value.v_bool; if (!ret) { match_err(ctx, "expected %d, got %d", pattern->value.v_bool, doc->value.v_bool); } return ret; case BSON_TYPE_CODE: ret = doc->value.v_code.code_len == pattern->value.v_code.code_len && !memcmp(doc->value.v_code.code, pattern->value.v_code.code, doc->value.v_code.code_len); break; case BSON_TYPE_CODEWSCOPE: ret = doc->value.v_codewscope.code_len == pattern->value.v_codewscope.code_len && !memcmp(doc->value.v_codewscope.code, pattern->value.v_codewscope.code, doc->value.v_codewscope.code_len) && doc->value.v_codewscope.scope_len == pattern->value.v_codewscope.scope_len && !memcmp(doc->value.v_codewscope.scope_data, pattern->value.v_codewscope.scope_data, doc->value.v_codewscope.scope_len); break; case BSON_TYPE_DATE_TIME: ret = doc->value.v_datetime == pattern->value.v_datetime; if (!ret) { match_err(ctx, "expected %" PRId64 ", got %" PRId64, pattern->value.v_datetime, doc->value.v_datetime); } return ret; case BSON_TYPE_DOUBLE: ret = doc->value.v_double == pattern->value.v_double; if (!ret) { match_err(ctx, "expected %f, got %f", pattern->value.v_double, doc->value.v_double); } return ret; case BSON_TYPE_INT32: ret = doc->value.v_int32 == pattern->value.v_int32; if (!ret) { match_err(ctx, "expected %" PRId32 ", got %" PRId32, pattern->value.v_int32, doc->value.v_int32); } return ret; case BSON_TYPE_INT64: ret = doc->value.v_int64 == pattern->value.v_int64; if (!ret) { match_err(ctx, "expected %" PRId64 ", got %" PRId64, pattern->value.v_int64, doc->value.v_int64); } return ret; case BSON_TYPE_OID: ret = bson_oid_equal(&doc->value.v_oid, &pattern->value.v_oid); break; case BSON_TYPE_REGEX: ret = !strcmp(doc->value.v_regex.regex, pattern->value.v_regex.regex) && !strcmp(doc->value.v_regex.options, pattern->value.v_regex.options); break; case BSON_TYPE_SYMBOL: ret = doc->value.v_symbol.len == pattern->value.v_symbol.len && !strncmp(doc->value.v_symbol.symbol, pattern->value.v_symbol.symbol, doc->value.v_symbol.len); break; case BSON_TYPE_TIMESTAMP: ret = doc->value.v_timestamp.timestamp == pattern->value.v_timestamp.timestamp && doc->value.v_timestamp.increment == pattern->value.v_timestamp.increment; break; case BSON_TYPE_UTF8: ret = doc->value.v_utf8.len == pattern->value.v_utf8.len && !strncmp(doc->value.v_utf8.str, pattern->value.v_utf8.str, doc->value.v_utf8.len); if (!ret) { match_err(ctx, "expected \"%s\", got \"%s\"", pattern->value.v_utf8.str, doc->value.v_utf8.str); } return ret; /* these are empty types, if "a" and "b" are the same type they're equal */ case BSON_TYPE_EOD: case BSON_TYPE_MAXKEY: case BSON_TYPE_MINKEY: case BSON_TYPE_NULL: case BSON_TYPE_UNDEFINED: return true; case BSON_TYPE_DBPOINTER: ret = (0 == strcmp(doc->value.v_dbpointer.collection, pattern->value.v_dbpointer.collection) && bson_oid_equal(&doc->value.v_dbpointer.oid, &pattern->value.v_dbpointer.oid)); break; case BSON_TYPE_DECIMAL128: ret = (doc->value.v_decimal128.low == pattern->value.v_decimal128.low && doc->value.v_decimal128.high == pattern->value.v_decimal128.high); if (!ret) { match_err(ctx, "Decimal128 is not an exact binary match (though " "numeric values may be equal)"); } break; default: test_error("unexpected value type %d: %s", (int)doc->value_type, _mongoc_bson_type_to_str(doc->value_type)); } if (!ret) { match_err(ctx, "%s values mismatch", _mongoc_bson_type_to_str(pattern->value_type)); } return ret; } bool mongoc_write_concern_append_bad(mongoc_write_concern_t *write_concern, bson_t *command) { mongoc_write_concern_t *wc = mongoc_write_concern_copy(write_concern); if (!bson_append_document(command, "writeConcern", 12, _mongoc_write_concern_get_bson(wc))) { MONGOC_ERROR("Could not append writeConcern to command."); mongoc_write_concern_destroy(wc); return false; } mongoc_write_concern_destroy(wc); return true; } static void init_huge_string(mongoc_client_t *client) { int32_t max_bson_size; ASSERT(client); test_conveniences_init(); if (!gHugeString) { max_bson_size = mongoc_cluster_get_max_bson_obj_size(&client->cluster); BSON_ASSERT(max_bson_size > 0); gHugeStringLength = (size_t)max_bson_size - 36; gHugeString = (char *)bson_malloc(gHugeStringLength + 1); BSON_ASSERT(gHugeString); memset(gHugeString, 'a', gHugeStringLength); gHugeString[gHugeStringLength] = '\0'; } } const char * huge_string(mongoc_client_t *client) { ASSERT(client); init_huge_string(client); return gHugeString; } size_t huge_string_length(mongoc_client_t *client) { ASSERT(client); init_huge_string(client); return gHugeStringLength; } static void init_four_mb_string(void) { test_conveniences_init(); if (!gFourMBString) { gFourMBString = (char *)bson_malloc(FOUR_MB + 1); BSON_ASSERT(gFourMBString); memset(gFourMBString, 'a', FOUR_MB); gFourMBString[FOUR_MB] = '\0'; } } const char * four_mb_string(void) { init_four_mb_string(); return gFourMBString; } static bool find_key(void *current, void *key) { return !strcmp((const char *)current, (const char *)key); } static void key_dtor(void *item, void *ctx) { BSON_UNUSED(item); BSON_UNUSED(ctx); /* mongoc_set_t requires a dtor, there's nothing to destroy */ } void assert_no_duplicate_keys(const bson_t *doc) { mongoc_set_t *keys; bson_iter_t iter; bson_t subdoc; keys = mongoc_set_new(8, key_dtor, NULL); BSON_ASSERT(bson_iter_init(&iter, doc)); while (bson_iter_next(&iter)) { if (mongoc_set_find_item(keys, find_key, (void *)bson_iter_key(&iter))) { test_error( "Duplicate key \"%s\" in document:\n%s", bson_iter_key(&iter), bson_as_relaxed_extended_json(doc, NULL)); } mongoc_set_add(keys, 0 /* index */, (void *)bson_iter_key(&iter)); if (BSON_ITER_HOLDS_DOCUMENT(&iter) || BSON_ITER_HOLDS_ARRAY(&iter)) { bson_iter_bson(&iter, &subdoc); assert_no_duplicate_keys(&subdoc); } } mongoc_set_destroy(keys); } void match_in_array(const bson_t *doc, const bson_t *array, match_ctx_t *ctx) { bson_iter_t array_iter; bool found = false; BSON_ASSERT(bson_iter_init(&array_iter, array)); while (bson_iter_next(&array_iter)) { bson_t array_elem; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&array_iter)); bson_iter_bson(&array_iter, &array_elem); if (match_bson_with_ctx(&array_elem, doc, ctx)) { found = true; } bson_destroy(&array_elem); } if (!found) { test_error("could not match: %s\n\n" "in array:\n%s\n\n", bson_as_canonical_extended_json(doc, NULL), bson_as_canonical_extended_json(array, NULL)); } } bson_t * bson_with_all_types(void) { bson_t *bson = tmp_bson("{}"); bson_oid_t oid; bson_decimal128_t dec; BSON_ASSERT(bson_decimal128_from_string("1.23456789", &dec)); bson_oid_init_from_string(&oid, "000000000000000000000000"); BSON_ASSERT(BSON_APPEND_DOUBLE(bson, "double", 1.0)); BSON_ASSERT(BSON_APPEND_UTF8(bson, "string", "string_example")); BSON_ASSERT(BSON_APPEND_DOCUMENT(bson, "document", tmp_bson("{'x': 'y'}"))); BSON_ASSERT(BSON_APPEND_ARRAY(bson, "document", tmp_bson("{'0': 'x'}"))); BSON_ASSERT(BSON_APPEND_BINARY(bson, "binary", BSON_SUBTYPE_BINARY, (uint8_t *)"data", 4)); BSON_ASSERT(BSON_APPEND_UNDEFINED(bson, "undefined")); BSON_ASSERT(BSON_APPEND_OID(bson, "oid", &oid)); BSON_ASSERT(BSON_APPEND_BOOL(bson, "bool", true)); BSON_ASSERT(BSON_APPEND_DATE_TIME(bson, "datetime", 123)); BSON_ASSERT(BSON_APPEND_NULL(bson, "null")); BSON_ASSERT(BSON_APPEND_REGEX(bson, "regex", "a+", NULL)); BSON_ASSERT(BSON_APPEND_DBPOINTER(bson, "dbpointer", "collection", &oid)); BSON_ASSERT(BSON_APPEND_CODE(bson, "code", "var x = 1;")); BSON_ASSERT(BSON_APPEND_SYMBOL(bson, "symbol", "symbol_example")); BSON_ASSERT(BSON_APPEND_CODE(bson, "code", "var x = 1;")); BSON_ASSERT(BSON_APPEND_CODE_WITH_SCOPE(bson, "code_w_scope", "var x = 1;", tmp_bson("{}"))); BSON_ASSERT(BSON_APPEND_INT32(bson, "int32", 1)); BSON_ASSERT(BSON_APPEND_TIMESTAMP(bson, "timestamp", 2, 3)); BSON_ASSERT(BSON_APPEND_INT64(bson, "int64", 4)); BSON_ASSERT(BSON_APPEND_DECIMAL128(bson, "decimal128", &dec)); BSON_ASSERT(BSON_APPEND_MINKEY(bson, "minkey")); BSON_ASSERT(BSON_APPEND_MAXKEY(bson, "maxkey")); /* and an empty key, as it so often is an edge case. */ BSON_ASSERT(BSON_APPEND_INT32(bson, "", -1)); return bson; } const char * json_with_all_types(void) { const char *json = "{\n" " \"double\": {\n" " \"$numberDouble\": \"1.0\"\n" " },\n" " \"string\": \"string_example\",\n" " \"document\": {\n" " \"x\": \"y\"\n" " },\n" " \"document\": [\"x\"],\n" " \"binary\": {\n" " \"$binary\": {\n" " \"base64\": \"ZGF0YQ==\",\n" " \"subType\": \"00\"\n" " }\n" " },\n" " \"undefined\": {\n" " \"$undefined\": true\n" " },\n" " \"oid\": {\n" " \"$oid\": \"000000000000000000000000\"\n" " },\n" " \"bool\": true,\n" " \"datetime\": {\n" " \"$date\": {\n" " \"$numberLong\": \"123\"\n" " }\n" " },\n" " \"null\": null,\n" " \"regex\": {\n" " \"$regularExpression\": {\n" " \"pattern\": \"a+\",\n" " \"options\": \"\"\n" " }\n" " },\n" " \"dbpointer\": {\n" " \"$dbPointer\": {\n" " \"$ref\": \"collection\",\n" " \"$id\": {\n" " \"$oid\": \"000000000000000000000000\"\n" " }\n" " }\n" " },\n" " \"code\": {\n" " \"$code\": \"var x = 1;\"\n" " },\n" " \"symbol\": {\n" " \"$symbol\": \"symbol_example\"\n" " },\n" " \"code\": {\n" " \"$code\": \"var x = 1;\"\n" " },\n" " \"code_w_scope\": {\n" " \"$code\": \"var x = 1;\",\n" " \"$scope\": {}\n" " },\n" " \"int32\": {\n" " \"$numberInt\": \"1\"\n" " },\n" " \"timestamp\": {\n" " \"$timestamp\": {\n" " \"t\": 2,\n" " \"i\": 3\n" " }\n" " },\n" " \"int64\": {\n" " \"$numberLong\": \"4\"\n" " },\n" " \"decimal128\": {\n" " \"$numberDecimal\": \"1.23456789\"\n" " },\n" " \"minkey\": {\n" " \"$minKey\": 1\n" " },\n" " \"maxkey\": {\n" " \"$maxKey\": 1\n" " },\n" " \"\": {\n" " \"$numberInt\": \"-1\"\n" " }\n" "}"; return json; } void assert_wc_oob_error(bson_error_t *error) { if (test_framework_get_server_version() >= test_framework_str_to_version("4.3.3")) { /* Error reporting changed in SERVER-45584 */ ASSERT_ERROR_CONTAINS( (*error), MONGOC_ERROR_SERVER, 9, "w has to be a non-negative number and not greater than 50"); } else { if (test_framework_is_replset()) { /* replset */ ASSERT_ERROR_CONTAINS((*error), MONGOC_ERROR_WRITE_CONCERN, 100, "Write Concern error:"); } else { /* standalone */ ASSERT_CMPINT(error->domain, ==, MONGOC_ERROR_SERVER); ASSERT_CMPINT(error->code, ==, 2); } } } void semver_parse(const char *str, semver_t *out) { char *dot; memset(out, 0, sizeof(semver_t)); out->major = (int)bson_ascii_strtoll(str, &dot, 10); if (*dot == '.') { dot++; } else { return; } out->has_minor = true; out->minor = (int)bson_ascii_strtoll(dot, &dot, 10); if (*dot == '.') { dot++; } else { return; } out->has_patch = true; out->patch = (int)bson_ascii_strtoll(dot, &dot, 10); } void server_semver(mongoc_client_t *client, semver_t *out) { bson_t reply; bson_error_t error; const char *server_version_str; ASSERT(client); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'buildinfo': 1}"), NULL, &reply, &error), error); server_version_str = bson_lookup_utf8(&reply, "version"); semver_parse(server_version_str, out); bson_destroy(&reply); } int semver_cmp(semver_t *a, semver_t *b) { if (a->major < b->major) { return -1; } else if (a->major > b->major) { return 1; } if (a->minor < b->minor) { return -1; } else if (a->minor > b->minor) { return 1; } if (a->patch < b->patch) { return -1; } else if (a->patch > b->patch) { return 1; } return 0; } int semver_cmp_str(semver_t *a, const char *str) { semver_t b; semver_parse(str, &b); return semver_cmp(a, &b); } const char * semver_to_string(semver_t *semver) { return tmp_str("%d.%d.%d", semver->major, semver->minor, semver->patch); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-conveniences.h000066400000000000000000000232341511661753600240720ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_CONVENIENCES_H #define TEST_CONVENIENCES_H #include #include #include #include /* TODO: split this header up. * Move bson_lookup_* functions under bsonutil. * Move temporary helpers into a separate header. */ /* Initialize global test convenience structures. * Safe to call repeatedly, or after calling test_conveniences_cleanup(). */ void test_conveniences_init(void); /* Tear down global test conveniences. * Safe to call repeatedly. * Called automatically at process exit. */ void test_conveniences_cleanup(void); /* Return a bson_t representation from a single-quoted JSON string, with * possible printf format directives. * bson_t is freed automatically at test cleanup. * E.g. tmp_bson ("{'key': %d}", 123); */ bson_t * tmp_bson(const char *json, ...); /* Return a string, with possible printf format directives. String is * automatically freed at test cleanup. */ const char * tmp_str(const char *fmt, ...); /* Return a JSON string representation of BSON. String is freed automatically at * test cleanup. */ const char * tmp_json(const bson_t *bson); void bson_iter_bson(const bson_iter_t *iter, bson_t *bson); /* create a bson_t containing all types of values, and an empty key. The * returned bson_t does not need to be freed. This corresponds to the same * document in json_with_all_types. */ bson_t * bson_with_all_types(void); /* returns a json string with all types of values, and an empty key. This * corresponds to the same document in bson_with_all_types. */ const char * json_with_all_types(void); #ifndef PATH_MAX #define PATH_MAX 1024 #endif #ifdef _WIN32 #define realpath(path, expanded) GetFullPathName(path, PATH_MAX, expanded, NULL) #endif void bson_lookup(const bson_t *bson, const char *path, bson_iter_t *out); const char * bson_lookup_utf8(const bson_t *b, const char *key); void value_init_from_doc(bson_value_t *value, const bson_t *doc); void bson_lookup_value(const bson_t *b, const char *key, bson_value_t *value); bson_t * bson_lookup_bson(const bson_t *b, const char *key); void bson_lookup_doc(const bson_t *b, const char *key, bson_t *doc); bool bson_lookup_bool(const bson_t *b, const char *key); int32_t bson_lookup_int32(const bson_t *b, const char *key); int64_t bson_lookup_int64(const bson_t *b, const char *key); mongoc_read_concern_t * bson_lookup_read_concern(const bson_t *b, const char *key); mongoc_write_concern_t * bson_lookup_write_concern(const bson_t *b, const char *key); mongoc_read_prefs_t * bson_lookup_read_prefs(const bson_t *b, const char *key); void bson_lookup_database_opts(const bson_t *b, const char *key, mongoc_database_t *database); void bson_lookup_collection_opts(const bson_t *b, const char *key, mongoc_collection_t *collection); mongoc_transaction_opt_t * bson_lookup_txn_opts(const bson_t *b, const char *key); mongoc_session_opt_t * bson_lookup_session_opts(const bson_t *b, const char *key); mongoc_client_session_t * bson_lookup_session(const bson_t *b, const char *key, mongoc_client_t *client); bool bson_init_from_value(bson_t *b, const bson_value_t *v); char * single_quotes_to_double(const char *str); /* match_action_t determines if default check for a field is overridden. */ typedef enum { MATCH_ACTION_SKIP, /* do not use the default check. */ MATCH_ACTION_ABORT, /* an error occurred, stop checking. */ MATCH_ACTION_CONTINUE /* use the default check. */ } match_action_t; struct _match_ctx_t; /* doc_iter may be null if the pattern field is not found. */ typedef match_action_t (*match_visitor_fn)(struct _match_ctx_t *ctx, bson_iter_t *pattern_iter, bson_iter_t *doc_iter); typedef struct _match_ctx_t { char errmsg[1000]; bool strict_numeric_types; /* if retain_dots_in_keys is true, then don't consider a path with dots to * indicate recursing into a sub document. */ bool retain_dots_in_keys; /* if allow_placeholders is true, treats 42 and "42" as placeholders. I.e. * comparing 42 to anything is ok. */ bool allow_placeholders; /* path is the dot separated breadcrumb trail of keys. */ char path[1000]; /* if visitor_fn is not NULL, this is called on for every key in the pattern. * The returned match_action_t can override the default match behavior. */ match_visitor_fn visitor_fn; void *visitor_ctx; /* if is_command is true, then compare the first key case insensitively. */ bool is_command; } match_ctx_t; #define assert_match_bson(doc, pattern, _is_command) \ if (1) { \ match_ctx_t _ctx = {.strict_numeric_types = true, .is_command = _is_command}; \ \ if (!match_bson_with_ctx(doc, pattern, &_ctx)) { \ test_error("Expected: %s\n, Got: %s\n, %s\n", \ bson_as_canonical_extended_json(pattern, NULL), \ bson_as_canonical_extended_json(doc, NULL), \ _ctx.errmsg); \ } \ } else \ (void)0 bool match_bson(const bson_t *doc, const bson_t *pattern, bool is_command); int64_t bson_value_as_int64(const bson_value_t *value); bool match_bson_value(const bson_value_t *doc, const bson_value_t *pattern, match_ctx_t *ctx); bool match_bson_with_ctx(const bson_t *doc, const bson_t *pattern, match_ctx_t *ctx); bool match_json(const bson_t *doc, bool is_command, const char *filename, int lineno, const char *funcname, const char *json_pattern, ...); #define ASSERT_MATCH(doc, ...) \ do { \ BSON_ASSERT(match_json(doc, false, __FILE__, __LINE__, BSON_FUNC, __VA_ARGS__)); \ } while (0) #define ASSERT_EQUAL_BSON(expected, actual) \ do { \ const bson_t *_expected_bson = expected, *_actual_bson = actual; \ char *_expected_str, *_actual_str; \ _expected_str = bson_as_canonical_extended_json(_expected_bson, NULL); \ _actual_str = bson_as_canonical_extended_json(_actual_bson, NULL); \ if (!bson_equal(_expected_bson, _actual_bson)) { \ test_error("BSON unequal: \n" \ "Expected: %s\n" \ "Got : %s", \ _expected_str, \ _actual_str); \ } \ bson_free(_actual_str); \ bson_free(_expected_str); \ } while (0) bool mongoc_write_concern_append_bad(mongoc_write_concern_t *write_concern, bson_t *command); #define FOUR_MB 1024 * 1024 * 4 const char * huge_string(mongoc_client_t *client); size_t huge_string_length(mongoc_client_t *client); const char * four_mb_string(void); void assert_no_duplicate_keys(const bson_t *doc); void match_in_array(const bson_t *doc, const bson_t *array, match_ctx_t *ctx); void match_err(match_ctx_t *ctx, const char *fmt, ...); void assert_wc_oob_error(bson_error_t *error); typedef struct { int major; int minor; bool has_minor; int patch; bool has_patch; } semver_t; void semver_parse(const char *str, semver_t *out); void server_semver(mongoc_client_t *client, semver_t *out); int semver_cmp(semver_t *a, semver_t *b); int semver_cmp_str(semver_t *a, const char *str); const char * semver_to_string(semver_t *str); /* Iterate over a BSON document or array. * * Example of iterating and printing an array of BSON documents: * * bson_iter_t iter; * bson_t *arr = my_func(); * * BSON_FOREACH (arr, iter) { * bson_t el; * bson_iter_bson (&iter, &el); * printf ("%d: %s", bson_iter_key (&iter), tmp_json (&el)); * } */ #define BSON_FOREACH(bson, iter_varname) for (bson_iter_init(&(iter_varname), (bson)); bson_iter_next(&(iter_varname));) #define TEST_ERROR_DOMAIN 123456 #define TEST_ERROR_CODE 654321 #define test_set_error(error, ...) bson_set_error(error, TEST_ERROR_DOMAIN, TEST_ERROR_CODE, __VA_ARGS__) /* An arbitrary traceable mongoc_ss_log_context_t for tests. * Logs the function name and file:line as the "operation". */ #define TEST_SS_LOG_CONTEXT \ (&(mongoc_ss_log_context_t){.operation = tmp_str("%s:%d: %s", __FILE__, (int)__LINE__, BSON_FUNC)}) #endif /* TEST_CONVENIENCES_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/test-gcpkms.c000066400000000000000000000064661511661753600227020ustar00rootroot00000000000000/** * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include int main(void) { bson_error_t error; char *mongodb_uri = getenv("MONGODB_URI"); char *expect_error = getenv("EXPECT_ERROR"); if (!mongodb_uri) { MONGOC_ERROR("Error: expecting MONGODB_URI environment variable to be set. "); return EXIT_FAILURE; } mongoc_init(); mongoc_client_t *keyvault_client = mongoc_client_new(mongodb_uri); MONGOC_DEBUG("libmongoc version: %s", mongoc_get_version()); mongoc_client_encryption_opts_t *ceopts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_client(ceopts, keyvault_client); mongoc_client_encryption_opts_set_keyvault_namespace(ceopts, "keyvault", "datakeys"); bson_t *kms_providers = BCON_NEW("gcp", "{", "}"); mongoc_client_encryption_opts_set_kms_providers(ceopts, kms_providers); mongoc_client_encryption_t *ce = mongoc_client_encryption_new(ceopts, &error); if (!ce) { MONGOC_ERROR("Error in mongoc_client_encryption_new: %s", error.message); return EXIT_FAILURE; } mongoc_client_encryption_datakey_opts_t *dkopts; dkopts = mongoc_client_encryption_datakey_opts_new(); bson_t *masterkey = BCON_NEW("keyRing", BCON_UTF8("key-ring-csfle"), "keyName", BCON_UTF8("key-name-csfle"), "location", BCON_UTF8("global"), "projectId", BCON_UTF8("devprod-drivers")); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, masterkey); bson_value_t keyid; bool got = mongoc_client_encryption_create_datakey(ce, "gcp", dkopts, &keyid, &error); if (NULL != expect_error) { if (got) { MONGOC_ERROR("Expected an error to contain %s, but got success", expect_error); return EXIT_FAILURE; } if (NULL == strstr(error.message, expect_error)) { MONGOC_ERROR("Expected error to contain %s, but got: %s", expect_error, error.message); return EXIT_FAILURE; } } else { if (!got) { MONGOC_ERROR("Expected to create data key, but got error: %s", error.message); return EXIT_FAILURE; } } MONGOC_DEBUG("Created key\n"); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_datakey_opts_destroy(dkopts); mongoc_client_encryption_destroy(ce); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceopts); mongoc_client_destroy(keyvault_client); mongoc_cleanup(); return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-happy-eyeballs.c000066400000000000000000000444771511661753600243410ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #define TIMEOUT 20000 /* milliseconds */ /* happy eyeballs (he) testing. */ typedef struct he_testcase_server { /* { "ipv4", "ipv6", NULL } */ char *type; /* if true, this closes the server socket before the client establishes * connection. */ bool close_before_connection; /* how long before the mock server calls `listen` on the server socket. * this delays the client from establishing a connection. */ int listen_delay_ms; } he_testcase_server_t; typedef struct he_testcase_client { /* { "ipv4", "ipv6", "both" } */ char *type; int64_t dns_cache_timeout_ms; } he_testcase_client_t; typedef struct he_testcase_expected { /* { "ipv4", "ipv6", "neither" }. which connection succeeds (if any). */ char *conn_succeeds_to; /* how many async commands should be created at the start. */ int initial_acmds; /* bounds for the server selection to finish. */ int duration_min_ms; int duration_max_ms; } he_testcase_expected_t; typedef struct he_testcase_state { mock_server_t *mock_server; mongoc_host_list_t host; mongoc_topology_scanner_t *ts; mongoc_log_and_monitor_instance_t log_and_monitor; int64_t start; int last_duration; /* set if timing fails, so it can be retried once. */ } he_testcase_state_t; typedef struct he_testcase { he_testcase_client_t client; he_testcase_server_t servers[2]; he_testcase_expected_t expected; he_testcase_state_t state; } he_testcase_t; typedef ssize_t (*poll_fn_t)(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout); static poll_fn_t gOriginalPoll; static he_testcase_t *gCurrentTestCase; /* if the server testcase specifies a delay or hangup, overwrite the poll * response. */ static int _override_poll_response(he_testcase_server_t *server, mongoc_stream_poll_t *poller) { if (server->listen_delay_ms) { int64_t now = bson_get_monotonic_time(); if (gCurrentTestCase->state.start + server->listen_delay_ms * 1000 > now) { /* should still "sleep". */ int delta = 0; if (poller->revents) { delta = -1; } poller->revents = 0; return delta; } } if (server->close_before_connection) { poller->revents = POLLHUP; } return 0; } /* get the server testcase that this client stream is connected to (if one * exists). */ static he_testcase_server_t * _server_for_client(mongoc_stream_t *stream) { int i; mongoc_socket_t *sock; char *stream_type = "ipv4"; BSON_ASSERT(stream->type == MONGOC_STREAM_SOCKET); sock = mongoc_stream_socket_get_socket((mongoc_stream_socket_t *)stream); if (sock->domain == AF_INET6) { stream_type = "ipv6"; } for (i = 0; i < 2; i++) { const char *server_type = gCurrentTestCase->servers[i].type; if (!server_type) { break; } if (strcmp(server_type, stream_type) == 0) { return gCurrentTestCase->servers + i; } } return NULL; } static ssize_t _mock_poll(mongoc_stream_poll_t *streams, size_t nstreams, int32_t timeout) { ssize_t starting_nactive; /* call the real poll first. */ /* TODO CDRIVER-2542: ZSeries appears to have excessive delay with repeated * calls to poll. As a workaround, set the poll timeout to 5ms. */ ssize_t nactive = gOriginalPoll(streams, nstreams, 5); BSON_UNUSED(timeout); starting_nactive = nactive; /* check if any of the poll responses need to be overwritten. */ for (size_t i = 0u; i < nstreams; i++) { mongoc_stream_t *stream = mongoc_stream_get_root_stream(streams[i].stream); he_testcase_server_t *server = _server_for_client(stream); if (server) { nactive += _override_poll_response(server, streams + i); } } if (starting_nactive > 0 && nactive == 0) { /* if there were active poll responses which were all silenced, * sleep for a little while since subsequent calls to poll may not have * any delay. */ mlib_sleep_for(5, ms); } return nactive; } static mongoc_stream_t * _mock_connect(mongoc_async_cmd_t *acmd) { mongoc_stream_t *stream = _mongoc_topology_scanner_tcp_initiate(acmd); /* override poll */ gOriginalPoll = stream->poll; stream->poll = _mock_poll; return stream; } static void _test_scanner_callback( uint32_t id, const bson_t *bson, int64_t rtt_msec, void *data, const bson_error_t *error /* IN */) { he_testcase_t *testcase = (he_testcase_t *)data; int should_succeed = strcmp(testcase->expected.conn_succeeds_to, "neither"); BSON_UNUSED(id); BSON_UNUSED(bson); BSON_UNUSED(rtt_msec); if (should_succeed) { ASSERT_OR_PRINT(!error->code, (*error)); } else { ASSERT_ERROR_CONTAINS((*error), MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "connection refused"); } } static void _init_host(mongoc_host_list_t *host, uint16_t port, const char *type) { char *host_str, *host_and_port; bool free_host_str = false; if (strcmp(type, "ipv4") == 0) { host_str = "127.0.0.1"; } else if (strcmp(type, "ipv6") == 0) { host_str = "[::1]"; } else { host_str = test_framework_getenv("MONGOC_TEST_IPV4_AND_IPV6_HOST"); if (host_str) { free_host_str = true; } else { /* default to localhost. */ host_str = "localhost"; } } host_and_port = bson_strdup_printf("%s:%hu", host_str, port); BSON_ASSERT(_mongoc_host_list_from_string(host, host_and_port)); if (free_host_str) { bson_free(host_str); } /* we should only have one host. */ BSON_ASSERT(!host->next); bson_free(host_and_port); } static void _testcase_setup(he_testcase_t *testcase) { mock_server_t *mock_server = NULL; mock_server_bind_opts_t opts = {0}; struct sockaddr_in ipv4_addr = {0}; struct sockaddr_in6 ipv6_addr = {0}; char *server_type = "both"; /* if there is only one server, use that type. */ if (testcase->servers[0].type && !testcase->servers[1].type) { server_type = testcase->servers[0].type; } if (strcmp("both", server_type) == 0) { opts.bind_addr_len = sizeof(ipv6_addr); opts.family = AF_INET6; opts.ipv6_only = 0; ipv6_addr.sin6_family = AF_INET6; ipv6_addr.sin6_port = htons(0); ipv6_addr.sin6_addr = in6addr_any; opts.bind_addr = (struct sockaddr_in *)&ipv6_addr; } else if (strcmp("ipv4", server_type) == 0) { opts.bind_addr_len = sizeof(ipv4_addr); opts.family = AF_INET; opts.ipv6_only = 0; ipv4_addr.sin_family = AF_INET; ipv4_addr.sin_port = htons(0); BSON_ASSERT(inet_pton(AF_INET, "127.0.0.1", &ipv4_addr.sin_addr)); opts.bind_addr = &ipv4_addr; } else if (strcmp("ipv6", server_type) == 0) { opts.bind_addr_len = sizeof(ipv6_addr); opts.family = AF_INET6; opts.ipv6_only = 1; ipv6_addr.sin6_family = AF_INET6; ipv6_addr.sin6_port = htons(0); BSON_ASSERT(inet_pton(AF_INET6, "::1", &ipv6_addr.sin6_addr)); opts.bind_addr = (struct sockaddr_in *)&ipv6_addr; } mock_server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_set_bind_opts(mock_server, &opts); mock_server_run(mock_server); _init_host(&testcase->state.host, mock_server_get_port(mock_server), testcase->client.type); bson_oid_t topology_id; mcommon_oid_set_zero(&topology_id); mongoc_log_and_monitor_instance_init(&testcase->state.log_and_monitor); testcase->state.ts = mongoc_topology_scanner_new( NULL, &topology_id, &testcase->state.log_and_monitor, NULL, &_test_scanner_callback, testcase, TIMEOUT); testcase->state.mock_server = mock_server; if (testcase->client.dns_cache_timeout_ms > 0) { _mongoc_topology_scanner_set_dns_cache_timeout(testcase->state.ts, testcase->client.dns_cache_timeout_ms); } } static void _testcase_teardown(he_testcase_t *testcase) { mock_server_destroy(testcase->state.mock_server); mongoc_topology_scanner_destroy(testcase->state.ts); mongoc_log_and_monitor_instance_destroy_contents(&testcase->state.log_and_monitor); } static void _check_stream(mongoc_stream_t *stream, const char *expected, char *message) { /* check the socket that the scanner found. */ char *actual = "neither"; if (stream) { mongoc_socket_t *sock = mongoc_stream_socket_get_socket((mongoc_stream_socket_t *)stream); actual = (sock->domain == AF_INET) ? "ipv4" : "ipv6"; } ASSERT_WITH_MSG( strcmp(expected, actual) == 0, "%s: expected %s stream but got %s stream\n", message, expected, actual); } static void _testcase_run(he_testcase_t *testcase) { /* construct mock servers. */ mongoc_topology_scanner_t *ts = testcase->state.ts; mongoc_topology_scanner_node_t *node; he_testcase_expected_t *expected = &testcase->expected; #ifndef _WIN32 uint64_t duration_ms; #endif mongoc_async_cmd_t *iter; gCurrentTestCase = testcase; testcase->state.start = bson_get_monotonic_time(); mongoc_topology_scanner_add(ts, &testcase->state.host, 1 /* any server id is ok. */, false); mongoc_topology_scanner_scan(ts, 1); /* how many commands should we have initially? */ ASSERT_CMPINT((int)(ts->async->ncmds), ==, expected->initial_acmds); DL_FOREACH(ts->async->cmds, iter) { iter->_stream_connect = _mock_connect; } mongoc_topology_scanner_work(ts); #ifndef _WIN32 /* Note: do not check time on Windows. Windows waits 1 second before refusing * connection to unused ports: * https://support.microsoft.com/en-us/help/175523/info-winsock-tcp-connection-performance-to-unused-ports */ duration_ms = (bson_get_monotonic_time() - testcase->state.start) / (1000); { bool within_expected_duration = mlib_cmp(duration_ms, >=, expected->duration_min_ms) // && mlib_cmp(duration_ms, <, expected->duration_max_ms); if (!within_expected_duration) { /* this is a timing failure, this may have been a fluke, retry once. */ ASSERT_WITH_MSG(!testcase->state.last_duration, "Timing failed twice. Expected to take between %dms " "and %dms. First duration was %dms, second was %dms.", expected->duration_min_ms, expected->duration_max_ms, testcase->state.last_duration, (int)duration_ms); testcase->state.last_duration = duration_ms; } else { /* clear the last duration in case succeeded on second try. */ testcase->state.last_duration = 0; } } #endif node = mongoc_topology_scanner_get_node(ts, 1); _check_stream(node->stream, expected->conn_succeeds_to, "checking client's final connection"); } #define CLIENT(client) {#client} #define CLIENT_WITH_DNS_CACHE_TIMEOUT(type, timeout) {#type, timeout} #define HANGUP true #define LISTEN false #define SERVER(type, hangup) {#type, hangup} #define DELAYED_SERVER(type, hangup, delay) {#type, hangup, delay} #define SERVERS(...) {__VA_ARGS__} #define DELAY_MS(val) val #define DURATION_MS(min, max) (min), (max) #define EXPECT(type, num_acmds, duration) {#type, num_acmds, duration} #define NCMDS(n) (n) static void _run_testcase(void *ctx) { he_testcase_t *testcase = (he_testcase_t *)ctx; retry: _testcase_setup(testcase); _testcase_run(testcase); _testcase_teardown(testcase); if (testcase->state.last_duration) { goto retry; } } static void test_happy_eyeballs_dns_cache(void) { #define E 1000 he_testcase_t testcase = { CLIENT_WITH_DNS_CACHE_TIMEOUT(both, 1000), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, LISTEN)), EXPECT(ipv6, NCMDS(2), DURATION_MS(0, E)), }; _testcase_setup(&testcase); _testcase_run(&testcase); /* disconnect the node so we perform another DNS lookup. */ mongoc_topology_scanner_node_disconnect(testcase.state.ts->nodes, false); /* after running once, the topology scanner should have cached the DNS * result for IPv6. It should complete immediately. */ testcase.expected.initial_acmds = 1; _testcase_run(&testcase); /* disconnect the node so we perform another DNS lookup. */ mongoc_topology_scanner_node_disconnect(testcase.state.ts->nodes, false); /* wait for DNS cache to expire. */ mlib_sleep_for(2, s); /* after running once, the topology scanner should have cached the DNS * result for IPv6. It should complete immediately. */ testcase.expected.initial_acmds = 2; _testcase_run(&testcase); _testcase_teardown(&testcase); #undef E } void test_happy_eyeballs_install(TestSuite *suite) { #define E 1000 /* epsilon. wiggle room for time constraints. */ #define HE 250 /* delay before ipv4 if ipv6 does not finish. */ int i, ntests; /* This tests conformity to RFC-6555 (Happy Eyeballs) when the topology * scanner connects to a single server. The expected behavior is as follows: * - if a hostname has both A and AAAA records, attempt to connect to IPv6 * immediately, and schedule a delayed IPv4 connection attempt 250ms after. * - if IPv6 fails, schedule the IPv4 connection attempt immediately. * - whichever connection attempt succeeds first cancels the other. * * The testcases are specified in terms of the client and server. * Client * - what address is trying connect (e.g. 127.0.0.1, ::1, localhost)? * Server * - is the server listening on IPv4, IPv6, or both? * - will it delay connection to any of these connections? * - will it hang up on these connections immediately? * */ static he_testcase_t he_testcases[] = { /* client ipv4. */ { CLIENT(ipv4), SERVERS(SERVER(ipv4, LISTEN)), EXPECT(ipv4, NCMDS(1), DURATION_MS(0, E)), }, { CLIENT(ipv4), SERVERS(SERVER(ipv6, LISTEN)), EXPECT(neither, NCMDS(1), DURATION_MS(0, E)), }, {CLIENT(ipv4), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, HANGUP)), EXPECT(ipv4, NCMDS(1), DURATION_MS(0, E))}, { CLIENT(ipv4), SERVERS(SERVER(ipv4, HANGUP), SERVER(ipv6, HANGUP)), EXPECT(neither, NCMDS(1), DURATION_MS(0, E)), }, /* client ipv6. */ { CLIENT(ipv6), SERVERS(SERVER(ipv4, LISTEN)), EXPECT(neither, NCMDS(1), DURATION_MS(0, E)), }, { CLIENT(ipv6), SERVERS(SERVER(ipv6, LISTEN)), EXPECT(ipv6, NCMDS(1), DURATION_MS(0, E)), }, { CLIENT(ipv6), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, LISTEN)), EXPECT(ipv6, NCMDS(1), DURATION_MS(0, E)), }, { CLIENT(ipv6), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, HANGUP)), EXPECT(neither, NCMDS(1), DURATION_MS(0, E)), }, /* client both ipv4 and ipv6. */ { CLIENT(both), SERVERS(SERVER(ipv4, LISTEN)), /* no delay, ipv6 fails immediately and ipv4 succeeds. */ EXPECT(ipv4, NCMDS(2), DURATION_MS(0, E)), }, { CLIENT(both), SERVERS(SERVER(ipv6, LISTEN)), /* no delay, ipv6 succeeds immediately. */ EXPECT(ipv6, NCMDS(2), DURATION_MS(0, E)), }, { CLIENT(both), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, LISTEN)), /* no delay, ipv6 succeeds immediately. */ EXPECT(ipv6, NCMDS(2), DURATION_MS(0, E)), }, { CLIENT(both), SERVERS(SERVER(ipv4, LISTEN), SERVER(ipv6, HANGUP)), /* no delay, ipv6 fails immediately and ipv4 succeeds. */ EXPECT(ipv4, NCMDS(2), DURATION_MS(0, E)), }, /* when both client is connecting to both ipv4 and ipv6 and server is * listening on both ipv4 and ipv6, test delaying the connections at * various times. */ /* ipv6 {succeeds, fails} before ipv4 starts and {succeeds, fails} */ {CLIENT(both), SERVERS(SERVER(ipv4, HANGUP), SERVER(ipv6, HANGUP)), EXPECT(neither, NCMDS(2), DURATION_MS(0, E))}, /* ipv6 {succeeds, fails} after ipv4 starts but before ipv4 {succeeds, fails} */ { CLIENT(both), SERVERS(DELAYED_SERVER(ipv4, LISTEN, DELAY_MS(2 * HE)), DELAYED_SERVER(ipv6, LISTEN, HE)), EXPECT(ipv6, NCMDS(2), DURATION_MS(HE, HE + E)), }, { CLIENT(both), SERVERS(DELAYED_SERVER(ipv4, LISTEN, DELAY_MS(2 * HE)), DELAYED_SERVER(ipv6, HANGUP, DELAY_MS(HE))), EXPECT(ipv4, NCMDS(2), DURATION_MS(2 * HE, 2 * HE + E)), }, { CLIENT(both), SERVERS(DELAYED_SERVER(ipv4, HANGUP, DELAY_MS(2 * HE)), DELAYED_SERVER(ipv6, HANGUP, DELAY_MS(HE))), EXPECT(neither, NCMDS(2), DURATION_MS(2 * HE, 2 * HE + E)), }, /* ipv4 {succeeds,fails} after ipv6 {succeeds, fails}. */ { CLIENT(both), SERVERS(SERVER(ipv4, LISTEN), DELAYED_SERVER(ipv6, LISTEN, DELAY_MS(HE + E))), /* ipv6 is delayed too long, ipv4 succeeds. */ EXPECT(ipv4, NCMDS(2), DURATION_MS(HE, HE + E)), }, { CLIENT(both), SERVERS(SERVER(ipv4, HANGUP), DELAYED_SERVER(ipv6, LISTEN, DELAY_MS(HE + E))), /* ipv6 is delayed, but ipv4 fails. */ EXPECT(ipv6, NCMDS(2), DURATION_MS(HE + E, HE + 2 * E)), }, { CLIENT(both), SERVERS(SERVER(ipv4, HANGUP), DELAYED_SERVER(ipv6, HANGUP, DELAY_MS(HE + E))), EXPECT(neither, NCMDS(2), DURATION_MS(HE + E, HE + 2 * E)), }, }; #undef HE #undef E ntests = sizeof(he_testcases) / sizeof(he_testcases[0]); for (i = 0; i < ntests; i++) { char *name = bson_strdup_printf("/TOPOLOGY/happy_eyeballs/%d", i); TestSuite_AddFull(suite, name, _run_testcase, NULL, he_testcases + i, test_framework_skip_if_no_dual_ip_hostname, TestSuite_CheckMockServerAllowed); bson_free(name); } TestSuite_AddMockServerTest(suite, "/TOPOLOGY/happy_eyeballs/dns_cache/", test_happy_eyeballs_dns_cache, test_framework_skip_if_no_dual_ip_hostname); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-libmongoc-main.c000066400000000000000000000143551511661753600243050ustar00rootroot00000000000000#include #include #include #include #include #include int main(int argc, char *argv[]) { TestSuite suite; test_libmongoc_init(&suite, argc, argv); /* libbson */ #define TEST_INSTALL(FuncName) \ if (1) { \ mlib_diagnostic_push(); \ mlib_msvc_warning(disable : 4210); \ extern void FuncName(TestSuite * suite); \ mlib_diagnostic_pop(); \ FuncName(&suite); \ } else \ ((void)0) TEST_INSTALL(test_bcon_basic_install); TEST_INSTALL(test_bcon_extract_install); TEST_INSTALL(test_bson_corpus_install); TEST_INSTALL(test_bson_error_install); TEST_INSTALL(test_bson_install); TEST_INSTALL(test_bson_version_install); TEST_INSTALL(test_bson_vector_install); TEST_INSTALL(test_install_generated_bson_validation); TEST_INSTALL(test_clock_install); TEST_INSTALL(test_decimal128_install); TEST_INSTALL(test_endian_install); TEST_INSTALL(test_iso8601_install); TEST_INSTALL(test_iter_install); TEST_INSTALL(test_json_install); TEST_INSTALL(test_oid_install); TEST_INSTALL(test_reader_install); TEST_INSTALL(test_string_install); TEST_INSTALL(test_utf8_install); TEST_INSTALL(test_value_install); TEST_INSTALL(test_writer_install); TEST_INSTALL(test_b64_install); TEST_INSTALL(test_mcommon_atomic_install); TEST_INSTALL(test_mcommon_oid_install); TEST_INSTALL(test_mlib_install); /* libmongoc */ TEST_INSTALL(test_aggregate_install); TEST_INSTALL(test_array_install); TEST_INSTALL(test_async_install); TEST_INSTALL(test_buffer_install); TEST_INSTALL(test_change_stream_install); TEST_INSTALL(test_client_install); TEST_INSTALL(test_client_max_staleness_install); TEST_INSTALL(test_client_hedged_reads_install); TEST_INSTALL(test_client_pool_install); TEST_INSTALL(test_client_cmd_install); TEST_INSTALL(test_client_versioned_api_install); TEST_INSTALL(test_write_command_install); TEST_INSTALL(test_bulk_install); TEST_INSTALL(test_cluster_install); TEST_INSTALL(test_collection_install); TEST_INSTALL(test_collection_find_with_opts_install); TEST_INSTALL(test_connection_uri_install); TEST_INSTALL(test_command_logging_and_monitoring_install); TEST_INSTALL(test_command_monitoring_install); TEST_INSTALL(test_cursor_install); TEST_INSTALL(test_database_install); TEST_INSTALL(test_error_install); TEST_INSTALL(test_exhaust_install); TEST_INSTALL(test_find_and_modify_install); TEST_INSTALL(test_gridfs_install); TEST_INSTALL(test_gridfs_bucket_install); TEST_INSTALL(test_gridfs_file_page_install); TEST_INSTALL(test_handshake_install); TEST_INSTALL(test_linux_distro_scanner_install); TEST_INSTALL(test_list_install); TEST_INSTALL(test_log_install); TEST_INSTALL(test_structured_log_install); TEST_INSTALL(test_long_namespace_install); TEST_INSTALL(test_mongos_pinning_install); TEST_INSTALL(test_queue_install); TEST_INSTALL(test_primary_stepdown_install); TEST_INSTALL(test_read_concern_install); TEST_INSTALL(test_read_write_concern_install); TEST_INSTALL(test_read_prefs_install); TEST_INSTALL(test_retryable_writes_install); TEST_INSTALL(test_retryable_reads_install); TEST_INSTALL(test_socket_install); TEST_INSTALL(test_opts_install); TEST_INSTALL(test_topology_scanner_install); TEST_INSTALL(test_topology_reconcile_install); TEST_INSTALL(test_transactions_install); TEST_INSTALL(test_samples_install); TEST_INSTALL(test_scram_install); TEST_INSTALL(test_sdam_install); TEST_INSTALL(test_sdam_monitoring_install); TEST_INSTALL(test_server_selection_install); TEST_INSTALL(test_dns_install); TEST_INSTALL(test_server_selection_errors_install); TEST_INSTALL(test_session_install); TEST_INSTALL(test_set_install); TEST_INSTALL(test_speculative_auth_install); TEST_INSTALL(test_stream_install); TEST_INSTALL(test_thread_install); TEST_INSTALL(test_topology_install); TEST_INSTALL(test_topology_description_install); TEST_INSTALL(test_ts_pool_install); TEST_INSTALL(test_uri_install); TEST_INSTALL(test_usleep_install); TEST_INSTALL(test_util_install); TEST_INSTALL(test_version_install); TEST_INSTALL(test_with_transaction_install); TEST_INSTALL(test_write_concern_install); #ifdef MONGOC_ENABLE_SSL TEST_INSTALL(test_stream_tls_install); TEST_INSTALL(test_x509_install); TEST_INSTALL(test_stream_tls_error_install); TEST_INSTALL(test_client_side_encryption_install); #endif #ifdef MONGOC_ENABLE_SASL_CYRUS TEST_INSTALL(test_cyrus_install); #endif TEST_INSTALL(test_happy_eyeballs_install); TEST_INSTALL(test_counters_install); TEST_INSTALL(test_crud_install); TEST_INSTALL(test_apm_install); TEST_INSTALL(test_server_description_install); TEST_INSTALL(test_aws_install); TEST_INSTALL(test_streamable_hello_install); #if defined(MONGOC_ENABLE_OCSP_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10101000L TEST_INSTALL(test_ocsp_cache_install); #endif TEST_INSTALL(test_interrupt_install); TEST_INSTALL(test_monitoring_install); TEST_INSTALL(test_http_install); TEST_INSTALL(test_install_unified); TEST_INSTALL(test_timeout_install); TEST_INSTALL(test_bson_match_install); TEST_INSTALL(test_bson_util_install); TEST_INSTALL(test_result_install); TEST_INSTALL(test_loadbalanced_install); TEST_INSTALL(test_server_stream_install); TEST_INSTALL(test_generation_map_install); TEST_INSTALL(test_shared_install); TEST_INSTALL(test_ssl_install); TEST_INSTALL(test_mcd_azure_imds_install); TEST_INSTALL(test_mcd_integer_install); TEST_INSTALL(test_mcd_rpc_install); TEST_INSTALL(test_service_gcp_install); TEST_INSTALL(test_mcd_nsinfo_install); TEST_INSTALL(test_bulkwrite_install); TEST_INSTALL(test_mongoc_oidc_install); TEST_INSTALL(test_mongoc_oidc_callback_install); TEST_INSTALL(test_secure_channel_install); TEST_INSTALL(test_stream_tracker_install); TEST_INSTALL(test_oidc_auth_install); const int ret = TestSuite_Run(&suite); test_libmongoc_destroy(&suite); return ret; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-libmongoc.c000066400000000000000000002060101511661753600233520ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif #if defined(_MSC_VER) && defined(_WIN64) #include // warning C4091: 'typedef ': ignored on left of '' when no variable is declared #pragma warning(push) #pragma warning(disable : 4091) #include #pragma warning(pop) #endif #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif typedef struct { mongoc_log_level_t level; char *msg; } log_entry_t; static bson_mutex_t captured_logs_mutex; static mongoc_array_t captured_logs; static bool capturing_logs; #ifdef MONGOC_ENABLE_SSL static mongoc_ssl_opt_t gSSLOptions; #endif static log_entry_t * log_entry_create(mongoc_log_level_t level, const char *msg) { log_entry_t *log_entry; log_entry = bson_malloc(sizeof(log_entry_t)); log_entry->level = level; log_entry->msg = bson_strdup(msg); return log_entry; } static void log_entry_destroy(log_entry_t *log_entry) { bson_free(log_entry->msg); bson_free(log_entry); } void capture_logs(bool capture) { capturing_logs = capture; clear_captured_logs(); } void clear_captured_logs(void) { size_t i; log_entry_t *log_entry; bson_mutex_lock(&captured_logs_mutex); for (i = 0; i < captured_logs.len; i++) { log_entry = _mongoc_array_index(&captured_logs, log_entry_t *, i); log_entry_destroy(log_entry); } captured_logs.len = 0; bson_mutex_unlock(&captured_logs_mutex); } bool has_captured_log(mongoc_log_level_t level, const char *msg) { size_t i; log_entry_t *log_entry; bson_mutex_lock(&captured_logs_mutex); for (i = 0; i < captured_logs.len; i++) { log_entry = _mongoc_array_index(&captured_logs, log_entry_t *, i); if (level == log_entry->level && strstr(log_entry->msg, msg)) { bson_mutex_unlock(&captured_logs_mutex); return true; } } bson_mutex_unlock(&captured_logs_mutex); return false; } bool has_captured_logs(void) { bool ret; bson_mutex_lock(&captured_logs_mutex); ret = 0 != captured_logs.len; bson_mutex_unlock(&captured_logs_mutex); return ret; } void assert_all_captured_logs_have_prefix(const char *prefix) { size_t i; log_entry_t *log_entry; bson_mutex_lock(&captured_logs_mutex); for (i = 0; i < captured_logs.len; i++) { log_entry = _mongoc_array_index(&captured_logs, log_entry_t *, i); ASSERT_STARTSWITH(log_entry->msg, prefix); } bson_mutex_unlock(&captured_logs_mutex); } void print_captured_logs(const char *prefix) { size_t i; log_entry_t *log_entry; bson_mutex_lock(&captured_logs_mutex); for (i = 0; i < captured_logs.len; i++) { log_entry = _mongoc_array_index(&captured_logs, log_entry_t *, i); if (prefix) { fprintf(stderr, "%s%s %s\n", prefix, mongoc_log_level_str(log_entry->level), log_entry->msg); } else { fprintf(stderr, "%s %s\n", mongoc_log_level_str(log_entry->level), log_entry->msg); } } bson_mutex_unlock(&captured_logs_mutex); } #define DEFAULT_FUTURE_TIMEOUT_MS 10 * 1000 int64_t get_future_timeout_ms(void) { return test_framework_getenv_int64("MONGOC_TEST_FUTURE_TIMEOUT_MS", DEFAULT_FUTURE_TIMEOUT_MS); } static void log_handler(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { TestSuite *suite; log_entry_t *log_entry; suite = (TestSuite *)user_data; if (log_level <= MONGOC_LOG_LEVEL_INFO) { bson_mutex_lock(&captured_logs_mutex); if (capturing_logs) { log_entry = log_entry_create(log_level, message); _mongoc_array_append_val(&captured_logs, log_entry); bson_mutex_unlock(&captured_logs_mutex); return; } bson_mutex_unlock(&captured_logs_mutex); if (!suite->silent) { mongoc_log_default_handler(log_level, log_domain, message, NULL); } } else if (log_level == MONGOC_LOG_LEVEL_DEBUG && test_suite_debug_output()) { mongoc_log_default_handler(log_level, log_domain, message, NULL); } } mongoc_database_t * get_test_database(mongoc_client_t *client) { return mongoc_client_get_database(client, "test"); } char * gen_collection_name(const char *str) { return bson_strdup_printf("%s_%u_%u", str, (uint32_t)bson_get_monotonic_time(), (uint32_t)gettestpid()); } mongoc_collection_t * get_test_collection(mongoc_client_t *client, const char *prefix) { ASSERT(client); mongoc_collection_t *ret; char *str; str = gen_collection_name(prefix); ret = mongoc_client_get_collection(client, "test", str); bson_free(str); return ret; } char * test_framework_getenv(const char *name) { return _mongoc_getenv(name); } char * test_framework_getenv_required(const char *name) { char *ret = _mongoc_getenv(name); if (!ret) { test_error("Expected environment variable %s to be set", name); } return ret; } /* *-------------------------------------------------------------------------- * * test_framework_getenv_bool -- * * Check if an environment variable is set. * * Returns: * True if the variable is set, or set to "on", false if it is not set * or set to "off". * * Side effects: * Logs and aborts if there is another value like "yes" or "true". * *-------------------------------------------------------------------------- */ bool test_framework_getenv_bool(const char *name) { char *value = test_framework_getenv(name); bool ret = false; if (value) { if (!strcasecmp(value, "off")) { ret = false; } else if (!strcasecmp(value, "") || !strcasecmp(value, "on")) { ret = true; } else { test_error("Unrecognized value for %s: \"%s\". Use \"on\" or \"off\".", name, value); } } bson_free(value); return ret; } /* *-------------------------------------------------------------------------- * * test_framework_getenv_int64 -- * * Get a number from an environment variable. * * Returns: * The number, or default. * * Side effects: * Logs and aborts if there is a non-numeric value. * *-------------------------------------------------------------------------- */ int64_t test_framework_getenv_int64(const char *name, int64_t default_value) { char *value = test_framework_getenv(name); char *endptr; int64_t ret; if (value) { errno = 0; ret = bson_ascii_strtoll(value, &endptr, 10); if (errno) { perror(bson_strdup_printf("Parsing %s from environment", name)); test_error("Failed to parse %s as int64", name); } bson_free(value); return ret; } return default_value; } static char * test_framework_get_unix_domain_socket_path(void) { char *path = test_framework_getenv("MONGOC_TEST_UNIX_DOMAIN_SOCKET"); if (path) { return path; } return bson_strdup_printf("/tmp/mongodb-%d.sock", test_framework_get_port()); } /* *-------------------------------------------------------------------------- * * test_framework_get_unix_domain_socket_path_escaped -- * * Get the path to Unix Domain Socket .sock of the test MongoDB server, * URI-escaped ("/" is replaced with "%2F"). * * Returns: * A string you must bson_free. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_get_unix_domain_socket_path_escaped(void) { char *path = test_framework_get_unix_domain_socket_path(), *c = path; mcommon_string_append_t escaped; mcommon_string_new_as_append(&escaped); /* Connection String Spec: "The host information cannot contain an unescaped * slash ("/"), if it does then an exception MUST be thrown informing users * that paths must be URL encoded." * * Even though the C Driver does not currently enforce the spec, let's pass * a correctly escaped URI. */ do { if (*c == '/') { mcommon_string_append(&escaped, "%2F"); } else { mcommon_string_append_bytes(&escaped, c, 1); } } while (*(++c)); bson_free(path); return mcommon_string_from_append_destroy_with_steal(&escaped); } static char * _uri_str_from_env(void) { if (test_framework_getenv_bool("MONGOC_TEST_LOADBALANCED")) { char *loadbalanced_uri_str = test_framework_getenv("SINGLE_MONGOS_LB_URI"); if (!loadbalanced_uri_str) { test_error("SINGLE_MONGOS_LB_URI and MULTI_MONGOS_LB_URI must be set " "when MONGOC_TEST_LOADBALANCED is enabled"); } return loadbalanced_uri_str; } return test_framework_getenv("MONGOC_TEST_URI"); } static mongoc_uri_t * _uri_from_env(void) { char *env_uri_str; mongoc_uri_t *uri; env_uri_str = _uri_str_from_env(); if (env_uri_str) { uri = mongoc_uri_new(env_uri_str); bson_free(env_uri_str); return uri; } return NULL; } /* *-------------------------------------------------------------------------- * * test_framework_get_host -- * * Get the hostname of the test MongoDB server. * * Returns: * A string you must bson_free. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_get_host(void) { mongoc_uri_t *env_uri; const mongoc_host_list_t *hosts; char *host; /* MONGOC_TEST_URI takes precedence */ env_uri = _uri_from_env(); if (env_uri) { /* choose first host */ hosts = mongoc_uri_get_hosts(env_uri); ASSERT_WITH_MSG(hosts, "could not obtain hosts from URI [%s]", mongoc_uri_get_string(env_uri)); host = bson_strdup(hosts->host); mongoc_uri_destroy(env_uri); return host; } host = test_framework_getenv("MONGOC_TEST_HOST"); return host ? host : bson_strdup("localhost"); } /* *-------------------------------------------------------------------------- * * test_framework_get_port -- * * Get the port number of the test MongoDB server. * * Returns: * The port number, 27017 by default. * * Side effects: * None. * *-------------------------------------------------------------------------- */ uint16_t test_framework_get_port(void) { mongoc_uri_t *env_uri; const mongoc_host_list_t *hosts; char *port_str; unsigned long port = MONGOC_DEFAULT_PORT; /* MONGOC_TEST_URI takes precedence */ env_uri = _uri_from_env(); if (env_uri) { /* choose first port */ hosts = mongoc_uri_get_hosts(env_uri); port = hosts->port; mongoc_uri_destroy(env_uri); } else { port_str = test_framework_getenv("MONGOC_TEST_PORT"); if (port_str && strlen(port_str)) { port = strtoul(port_str, NULL, 10); if (port == 0 || port > UINT16_MAX) { /* parse err or port out of range -- mongod prohibits port 0 */ port = MONGOC_DEFAULT_PORT; } } bson_free(port_str); } return (uint16_t)port; } char * test_framework_get_host_and_port(void) { char *host = test_framework_get_host(); uint16_t port = test_framework_get_port(); char *host_and_port; if (strchr(host, ':')) { /* wrap IPv6 address in square brackets. */ host_and_port = bson_strdup_printf("[%s]:%hu", host, port); } else { host_and_port = bson_strdup_printf("%s:%hu", host, port); } bson_free(host); return host_and_port; } /* *-------------------------------------------------------------------------- * * test_framework_get_admin_user -- * * Get the username of an admin user on the test MongoDB server. * * Returns: * A string you must bson_free, or NULL. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_get_admin_user(void) { char *retval = NULL; mongoc_uri_t *env_uri = _uri_from_env(); /* MONGOC_TEST_URI takes precedence */ if (env_uri) { const char *tmp = mongoc_uri_get_username(env_uri); if (tmp) { retval = bson_strdup(tmp); } mongoc_uri_destroy(env_uri); } if (!retval) { retval = test_framework_getenv("MONGOC_TEST_USER"); } return retval; } /* *-------------------------------------------------------------------------- * * test_framework_get_admin_password -- * * Get the password of an admin user on the test MongoDB server. * * Returns: * A string you must bson_free, or NULL. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_get_admin_password(void) { char *retval = NULL; mongoc_uri_t *env_uri = _uri_from_env(); /* MONGOC_TEST_URI takes precedence */ if (env_uri) { const char *tmp = mongoc_uri_get_password(env_uri); if (tmp) { retval = bson_strdup(tmp); } mongoc_uri_destroy(env_uri); } if (!retval) { retval = test_framework_getenv("MONGOC_TEST_PASSWORD"); } return retval; } /* *-------------------------------------------------------------------------- * * test_framework_get_user_password -- * * Get the username and password of an admin user on the test MongoDB * server. * * Returns: * True if username and password environment variables are set. * * Side effects: * Sets passed-in string pointers to strings you must free, or NULL. * Logs and aborts if user or password is set in the environment * but not both, or if user and password are set but SSL is not * compiled in (SSL is required for SCRAM-SHA-1, see CDRIVER-520). * *-------------------------------------------------------------------------- */ static bool test_framework_get_user_password(char **user, char **password) { /* TODO: uri-escape username and password */ *user = test_framework_get_admin_user(); *password = test_framework_get_admin_password(); if ((*user && !*password) || (!*user && *password)) { test_error("Specify both MONGOC_TEST_USER and" " MONGOC_TEST_PASSWORD, or neither"); } #ifndef MONGOC_ENABLE_CRYPTO if (*user && *password) { test_error("You need to configure with ENABLE_SSL" " when providing user+password (for SCRAM-SHA-1)"); } #endif return *user != NULL; } /* *-------------------------------------------------------------------------- * * test_framework_add_user_password -- * * Copy a connection string, with user and password added. * * Returns: * A string you must bson_free. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_add_user_password(const char *uri_str, const char *user, const char *password) { return bson_strdup_printf("mongodb://%s:%s@%s", user, password, uri_str + strlen("mongodb://")); } /* *-------------------------------------------------------------------------- * * test_framework_add_user_password_from_env -- * * Add password of an admin user on the test MongoDB server. * * Returns: * A string you must bson_free. * * Side effects: * Same as test_framework_get_user_password. * *-------------------------------------------------------------------------- */ char * test_framework_add_user_password_from_env(const char *uri_str) { char *user; char *password; char *uri_str_auth; if (test_framework_get_user_password(&user, &password)) { uri_str_auth = test_framework_add_user_password(uri_str, user, password); bson_free(user); bson_free(password); } else { uri_str_auth = bson_strdup(uri_str); } return uri_str_auth; } /* *-------------------------------------------------------------------------- * * test_framework_get_compressors -- * * Get the list of compressors to enable * * Returns: * A string you must bson_free, or NULL if the variable is not set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ char * test_framework_get_compressors(void) { return test_framework_getenv("MONGOC_TEST_COMPRESSORS"); } /* *-------------------------------------------------------------------------- * * test_framework_has_compressors -- * * Check if the test suite has been configured to use compression * * Returns: * true if compressors should be used. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool test_framework_has_compressors(void) { bool retval; char *compressors = test_framework_get_compressors(); retval = !!compressors; bson_free(compressors); return retval; } /* *-------------------------------------------------------------------------- * * test_framework_get_ssl -- * * Should we connect to the test MongoDB server over SSL? * * Returns: * True if any MONGOC_TEST_SSL_* environment variables are set. * * Side effects: * None. * *-------------------------------------------------------------------------- */ bool test_framework_get_ssl(void) { char *ssl_option_names[] = {"MONGOC_TEST_SSL_PEM_FILE", "MONGOC_TEST_SSL_PEM_PWD", "MONGOC_TEST_SSL_CA_FILE", "MONGOC_TEST_SSL_CA_DIR", "MONGOC_TEST_SSL_CRL_FILE", "MONGOC_TEST_SSL_WEAK_CERT_VALIDATION"}; char *ssl_option_value; size_t i; for (i = 0; i < sizeof ssl_option_names / sizeof(char *); i++) { ssl_option_value = test_framework_getenv(ssl_option_names[i]); if (ssl_option_value) { bson_free(ssl_option_value); return true; } } return test_framework_getenv_bool("MONGOC_TEST_SSL"); } /* *-------------------------------------------------------------------------- * * test_framework_get_unix_domain_socket_uri_str -- * * Get the connection string (unix domain socket style) of the test * MongoDB server based on the variables set in the environment. * Does *not* call hello to discover your actual topology. * * Returns: * A string you must bson_free. * * Side effects: * Same as test_framework_get_user_password. * *-------------------------------------------------------------------------- */ char * test_framework_get_unix_domain_socket_uri_str(void) { char *path; char *test_uri_str; char *test_uri_str_auth; path = test_framework_get_unix_domain_socket_path_escaped(); test_uri_str = bson_strdup_printf("mongodb://%s/%s", path, test_framework_get_ssl() ? "?ssl=true" : ""); test_uri_str_auth = test_framework_add_user_password_from_env(test_uri_str); bson_free(path); bson_free(test_uri_str); return test_uri_str_auth; } /* *-------------------------------------------------------------------------- * * call_hello_with_host_and_port -- * * Call hello or legacy hello on a server, possibly over SSL. * * Side effects: * Fills reply with hello response. Logs and aborts on error. * *-------------------------------------------------------------------------- */ static void call_hello_with_host_and_port(const char *host_and_port, bson_t *reply) { char *user; char *password; char *uri_str; mongoc_uri_t *uri; mongoc_client_t *client; bson_error_t error; if (test_framework_get_user_password(&user, &password)) { uri_str = bson_strdup_printf( "mongodb://%s:%s@%s%s", user, password, host_and_port, test_framework_get_ssl() ? "/?ssl=true" : ""); bson_free(user); bson_free(password); } else { uri_str = bson_strdup_printf("mongodb://%s%s", host_and_port, test_framework_get_ssl() ? "/?ssl=true" : ""); } uri = mongoc_uri_new(uri_str); BSON_ASSERT(uri); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 10000); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 10000); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false); if (test_framework_has_compressors()) { char *compressors = test_framework_get_compressors(); mongoc_uri_set_compressors(uri, compressors); bson_free(compressors); } if (test_framework_is_loadbalanced()) { mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); } client = test_framework_client_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL test_framework_set_ssl_opts(client); #endif if (!mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, reply, &error)) { bson_destroy(reply); if (!mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, reply, &error)) { test_error("error calling legacy hello: '%s'\n" "URI = %s", error.message, uri_str); } } mongoc_client_destroy(client); mongoc_uri_destroy(uri); bson_free(uri_str); } /* *-------------------------------------------------------------------------- * * call_hello -- * * Call hello or legacy hello on the test server, possibly over SSL, using * host and port from the environment. * * Side effects: * Fills reply with hello response. Logs and aborts on error. * *-------------------------------------------------------------------------- */ static void call_hello(bson_t *reply) { char *host_and_port = test_framework_get_host_and_port(); call_hello_with_host_and_port(host_and_port, reply); bson_free(host_and_port); } static char * set_name(bson_t *hello_response) { bson_iter_t iter; if (bson_iter_init_find(&iter, hello_response, "setName")) { return bson_strdup(bson_iter_utf8(&iter, NULL)); } else { return NULL; } } static bool uri_str_has_db(mcommon_string_t *uri_string) { BSON_ASSERT_PARAM(uri_string); const char *const str = uri_string->str; const char *const standard = "mongodb://"; const char *const srv = "mongodb+srv://"; const bool is_standard = strstr(str, standard) == str; const bool is_srv = strstr(str, srv) == str; ASSERT_WITH_MSG(is_standard || is_srv, "[%s] does not start with [%s] or [%s]", uri_string->str, standard, srv); if (is_standard) { return strchr(str + strlen(standard), '/') != NULL; } else { return strchr(str + strlen(srv), '/') != NULL; } } static void add_option_to_uri_str(mcommon_string_append_t *uri_string, const char *option, const char *value) { if (strchr(mcommon_str_from_append(uri_string), '?')) { /* already has some options */ mcommon_string_append(uri_string, "&"); } else if (uri_str_has_db(mcommon_string_from_append(uri_string))) { /* like "mongodb://host/db" */ mcommon_string_append(uri_string, "?"); } else { /* like "mongodb://host" */ mcommon_string_append(uri_string, "/?"); } mcommon_string_append_printf(uri_string, "%s=%s", option, value); } /* *-------------------------------------------------------------------------- * * test_framework_get_uri_str_no_auth -- * * Get the connection string of the test MongoDB topology -- * standalone, replica set, mongos, or mongoses -- along with * SSL options, but not username and password. Calls calls hello with * that connection string to discover your topology, and * returns an appropriate connection string for the topology * type. * * database_name is optional. * * Returns: * A string you must bson_free. * * Side effects: * Same as test_framework_get_user_password. * *-------------------------------------------------------------------------- */ char * test_framework_get_uri_str_no_auth(const char *database_name) { char *env_uri_str; bson_t hello_response; char *name; bson_iter_t iter; bson_iter_t hosts_iter; bool first; char *host; uint16_t port; mcommon_string_append_t uri_string; mcommon_string_new_as_append(&uri_string); env_uri_str = _uri_str_from_env(); if (env_uri_str) { mcommon_string_append(&uri_string, env_uri_str); if (database_name) { if (!mcommon_string_from_append_ends_with_str(&uri_string, "/")) { mcommon_string_append(&uri_string, "/"); } mcommon_string_append(&uri_string, database_name); } bson_free(env_uri_str); } else { /* construct a direct connection or replica set connection URI */ call_hello(&hello_response); mcommon_string_append(&uri_string, "mongodb://"); if ((name = set_name(&hello_response))) { /* make a replica set URI */ bson_iter_init_find(&iter, &hello_response, "hosts"); bson_iter_recurse(&iter, &hosts_iter); first = true; /* append "host1,host2,host3" */ while (bson_iter_next(&hosts_iter)) { BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&hosts_iter)); if (!first) { mcommon_string_append(&uri_string, ","); } mcommon_string_append(&uri_string, bson_iter_utf8(&hosts_iter, NULL)); first = false; } mcommon_string_append(&uri_string, "/"); if (database_name) { mcommon_string_append(&uri_string, database_name); } add_option_to_uri_str(&uri_string, MONGOC_URI_REPLICASET, name); bson_free(name); } else { host = test_framework_get_host(); port = test_framework_get_port(); mcommon_string_append_printf(&uri_string, "%s:%hu", host, port); mcommon_string_append(&uri_string, "/"); if (database_name) { mcommon_string_append(&uri_string, database_name); } bson_free(host); } if (test_framework_get_ssl()) { add_option_to_uri_str(&uri_string, MONGOC_URI_SSL, "true"); } bson_destroy(&hello_response); } if (test_framework_has_compressors()) { char *compressors = test_framework_get_compressors(); add_option_to_uri_str(&uri_string, MONGOC_URI_COMPRESSORS, compressors); bson_free(compressors); } // Setting this by default makes tests a little more resilient to transient errors and more consistent with other // non-single-threaded Drivers which implicitly set this by default. add_option_to_uri_str(&uri_string, MONGOC_URI_SERVERSELECTIONTRYONCE, "false"); return mcommon_string_from_append_destroy_with_steal(&uri_string); } /* *-------------------------------------------------------------------------- * * test_framework_get_uri_str -- * * Get the connection string of the test MongoDB topology -- * standalone, replica set, mongos, or mongoses -- along with * SSL options, username and password. * * Returns: * A string you must bson_free. * * Side effects: * Same as test_framework_get_user_password. * *-------------------------------------------------------------------------- */ char * test_framework_get_uri_str(void) { /* no_auth also contains compressors. */ char *const uri_str_no_auth = test_framework_get_uri_str_no_auth(NULL); char *const uri_str = test_framework_add_user_password_from_env(uri_str_no_auth); bson_free(uri_str_no_auth); return uri_str; } /* *-------------------------------------------------------------------------- * * test_framework_get_uri -- * * Like test_framework_get_uri_str (). Get the URI of the test * MongoDB server. * * Returns: * A mongoc_uri_t* you must destroy. * * Side effects: * Same as test_framework_get_user_password. * *-------------------------------------------------------------------------- */ mongoc_uri_t * test_framework_get_uri(void) { bson_error_t error = {0}; char *test_uri_str = test_framework_get_uri_str(); mongoc_uri_t *uri = mongoc_uri_new_with_error(test_uri_str, &error); ASSERT_OR_PRINT(uri, error); bson_free(test_uri_str); return uri; } mongoc_uri_t * test_framework_get_uri_multi_mongos_loadbalanced(void) { char *uri_str_no_auth; char *uri_str; mongoc_uri_t *uri; bson_error_t error; uri_str_no_auth = _mongoc_getenv("MULTI_MONGOS_LB_URI"); if (!uri_str_no_auth) { test_error("expected MULTI_MONGOS_LB_URI to be set"); } uri_str = test_framework_add_user_password_from_env(uri_str_no_auth); uri = mongoc_uri_new_with_error(uri_str, &error); ASSERT_OR_PRINT(uri, error); bson_free(uri_str_no_auth); bson_free(uri_str); return uri; } bool test_framework_uri_apply_multi_mongos(mongoc_uri_t *uri, bool use_multi, bson_error_t *error) { bool ret = false; if (!test_framework_is_mongos()) { ret = true; goto done; } /* TODO Once CDRIVER-3285 is resolved, update this to no longer hardcode the * hosts. */ if (use_multi) { if (!mongoc_uri_upsert_host_and_port(uri, "localhost:27017", error)) { goto done; } if (!mongoc_uri_upsert_host_and_port(uri, "localhost:27018", error)) { goto done; } } else { const mongoc_host_list_t *hosts; hosts = mongoc_uri_get_hosts(uri); if (hosts->next) { test_set_error(error, "useMultiMongoses is false, so expected single " "host listed, but got: %s", mongoc_uri_get_string(uri)); goto done; } } ret = true; done: return ret; } /* *-------------------------------------------------------------------------- * * test_framework_mongos_count -- * * Returns the number of servers in the test framework's MongoDB URI. * *-------------------------------------------------------------------------- */ size_t test_framework_mongos_count(void) { mongoc_uri_t *uri = test_framework_get_uri(); const mongoc_host_list_t *h; size_t count = 0; BSON_ASSERT(uri); h = mongoc_uri_get_hosts(uri); while (h) { ++count; h = h->next; } mongoc_uri_destroy(uri); return count; } /* *-------------------------------------------------------------------------- * * test_framework_replset_name -- * * Returns the replica set name or NULL. You must free the string. * *-------------------------------------------------------------------------- */ char * test_framework_replset_name(void) { bson_t reply; bson_iter_t iter; char *replset_name = NULL; call_hello(&reply); if (!bson_iter_init_find(&iter, &reply, "setName")) { goto cleanup; } replset_name = bson_strdup(bson_iter_utf8(&iter, NULL)); cleanup: bson_destroy(&reply); return replset_name; } /* *-------------------------------------------------------------------------- * * test_framework_replset_member_count -- * * Returns the number of replica set members (including arbiters). * *-------------------------------------------------------------------------- */ size_t test_framework_replset_member_count(void) { mongoc_client_t *client; bson_t reply; bson_error_t error; bool r; bson_iter_t iter, array; size_t count = 0; client = test_framework_new_default_client(); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'replSetGetStatus': 1}"), NULL, &reply, &error); if (r) { if (bson_iter_init_find(&iter, &reply, "members") && BSON_ITER_HOLDS_ARRAY(&iter)) { bson_iter_recurse(&iter, &array); while (bson_iter_next(&array)) { ++count; } } } else if (!strstr(error.message, "not running with --replSet") && !strstr(error.message, "replSetGetStatus is not supported through mongos")) { /* failed for some other reason */ ASSERT_OR_PRINT(false, error); } bson_destroy(&reply); mongoc_client_destroy(client); return count; } /* *-------------------------------------------------------------------------- * * test_framework_data_nodes_count -- * * Returns the number of replica set members (excluding arbiters), * or number of mongos servers or 1 for a standalone. * *-------------------------------------------------------------------------- */ size_t test_framework_data_nodes_count(void) { bson_t reply; bson_iter_t iter, array; size_t count = 0; call_hello(&reply); if (!bson_iter_init_find(&iter, &reply, "hosts")) { bson_destroy(&reply); return test_framework_mongos_count(); } BSON_ASSERT(bson_iter_recurse(&iter, &array)); while (bson_iter_next(&array)) { ++count; } bson_destroy(&reply); return count; } /* *-------------------------------------------------------------------------- * * test_framework_server_count -- * * Returns the number of mongos servers or replica set members, * or 1 if the server is standalone. * *-------------------------------------------------------------------------- */ size_t test_framework_server_count(void) { size_t count = 0; count = test_framework_replset_member_count(); if (count > 0) { return count; } return test_framework_mongos_count(); } /* *-------------------------------------------------------------------------- * * test_framework_set_ssl_opts -- * * Configure a client to connect to the test MongoDB server. * * Returns: * None. * * Side effects: * Logs and aborts if any MONGOC_TEST_SSL_* environment variables are * set but the driver is not built with SSL enabled. * *-------------------------------------------------------------------------- */ void test_framework_set_ssl_opts(mongoc_client_t *client) { ASSERT(client); if (test_framework_get_ssl()) { #ifndef MONGOC_ENABLE_SSL test_error("SSL test config variables are specified in the environment, but" " SSL isn't enabled"); #else mongoc_client_set_ssl_opts(client, &gSSLOptions); #endif } } /* *-------------------------------------------------------------------------- * * test_framework_new_default_client -- * * Get a client connected to the test MongoDB topology. * * Returns: * A client you must mongoc_client_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_t * test_framework_new_default_client(void) { char *test_uri_str = test_framework_get_uri_str(); mongoc_client_t *client = test_framework_client_new(test_uri_str, NULL); BSON_ASSERT(client); test_framework_set_ssl_opts(client); bson_free(test_uri_str); return client; } /* *-------------------------------------------------------------------------- * * test_framework_client_new_no_server_api -- * * Get a client connected to the test MongoDB topology, with no server * API version set. * * Returns: * A client you must mongoc_client_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_t * test_framework_client_new_no_server_api(void) { mongoc_uri_t *uri = test_framework_get_uri(); mongoc_client_t *client = mongoc_client_new_from_uri(uri); BSON_ASSERT(client); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); return client; } mongoc_server_api_t * test_framework_get_default_server_api(void) { char *api_version = test_framework_getenv("MONGODB_API_VERSION"); mongoc_server_api_version_t version; if (!api_version) { return NULL; } ASSERT(mongoc_server_api_version_from_string(api_version, &version)); bson_free(api_version); return mongoc_server_api_new(version); } /* *-------------------------------------------------------------------------- * * test_framework_client_new -- * * Get a client connected to the indicated connection string * * Parameters: * @uri_str: A connection string to the test deployment * @api: A mongoc_server_api_t that declares an API version. If omitted, * the API version indicated in the MONGODB_API_VERSION env variable * is used. * * Returns: * A client you must mongoc_client_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_t * test_framework_client_new(const char *uri_str, const mongoc_server_api_t *api) { mongoc_client_t *client = mongoc_client_new(uri_str); bson_error_t error; mongoc_server_api_t *default_api = NULL; if (!client) { return client; } if (api) { ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); } else { default_api = test_framework_get_default_server_api(); if (default_api) { ASSERT_OR_PRINT(mongoc_client_set_server_api(client, default_api, &error), error); } } mongoc_server_api_destroy(default_api); return client; } /* *-------------------------------------------------------------------------- * * test_framework_client_new_from_uri -- * * Get a client connected to the indicated URI * * Parameters: * @uri_str: A mongoc_uri_t to connect with * @api: A mongoc_server_api_t that declares an API version. If omitted, * the API version indicated in the MONGODB_API_VERSION env variable * is used. * * Returns: * A client you must mongoc_client_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_t * test_framework_client_new_from_uri(const mongoc_uri_t *uri, const mongoc_server_api_t *api) { mongoc_client_t *client = mongoc_client_new_from_uri(uri); bson_error_t error; mongoc_server_api_t *default_api = NULL; if (!client) { return client; } if (api) { ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); } else { default_api = test_framework_get_default_server_api(); if (default_api) { ASSERT_OR_PRINT(mongoc_client_set_server_api(client, default_api, &error), error); } } mongoc_server_api_destroy(default_api); return client; } #ifdef MONGOC_ENABLE_SSL /* *-------------------------------------------------------------------------- * * test_framework_get_ssl_opts -- * * Get options for connecting to mongod over SSL (even if mongod * isn't actually SSL-enabled). * * Returns: * A pointer to constant global SSL-test options. * * Side effects: * None. * *-------------------------------------------------------------------------- */ const mongoc_ssl_opt_t * test_framework_get_ssl_opts(void) { return &gSSLOptions; } #endif /* *-------------------------------------------------------------------------- * * test_framework_set_pool_ssl_opts -- * * Configure a client pool to connect to the test MongoDB server. * * Returns: * None. * * Side effects: * Logs and aborts if any MONGOC_TEST_SSL_* environment variables are * set but the driver is not built with SSL enabled. * *-------------------------------------------------------------------------- */ void test_framework_set_pool_ssl_opts(mongoc_client_pool_t *pool) { BSON_ASSERT(pool); if (test_framework_get_ssl()) { #ifndef MONGOC_ENABLE_SSL test_error("SSL test config variables are specified in the environment, but" " SSL isn't enabled"); #else mongoc_client_pool_set_ssl_opts(pool, &gSSLOptions); #endif } } /* *-------------------------------------------------------------------------- * * test_framework_new_default_client_pool -- * * Get a client pool connected to the test MongoDB topology. * * Returns: * A pool you must destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_pool_t * test_framework_new_default_client_pool(void) { mongoc_uri_t *test_uri = test_framework_get_uri(); mongoc_client_pool_t *pool = test_framework_client_pool_new_from_uri(test_uri, NULL); BSON_ASSERT(pool); test_framework_set_pool_ssl_opts(pool); mongoc_uri_destroy(test_uri); BSON_ASSERT(pool); return pool; } /* *-------------------------------------------------------------------------- * * test_framework_client_pool_new_from_uri -- * * Get a client pool connected to the indicated connection string * * Parameters: * @uri_str: A mongoc_uri_t to connect to * @api: A mongoc_server_api_t that declares an API version. If omitted, * the API version indicated in the MONGODB_API_VERSION env variable * is used. * * Returns: * A pool you must mongoc_client_pool_destroy. * * Side effects: * None. * *-------------------------------------------------------------------------- */ mongoc_client_pool_t * test_framework_client_pool_new_from_uri(const mongoc_uri_t *uri, const mongoc_server_api_t *api) { mongoc_client_pool_t *pool = mongoc_client_pool_new(uri); bson_error_t error; mongoc_server_api_t *default_api = NULL; if (!pool) { return pool; } if (api) { ASSERT_OR_PRINT(mongoc_client_pool_set_server_api(pool, api, &error), error); } else { default_api = test_framework_get_default_server_api(); if (default_api) { ASSERT_OR_PRINT(mongoc_client_pool_set_server_api(pool, default_api, &error), error); } } mongoc_server_api_destroy(default_api); return pool; } #ifdef MONGOC_ENABLE_SSL static void test_framework_global_ssl_opts_init(void) { memcpy(&gSSLOptions, mongoc_ssl_opt_get_default(), sizeof gSSLOptions); gSSLOptions.pem_file = test_framework_getenv("MONGOC_TEST_SSL_PEM_FILE"); gSSLOptions.pem_pwd = test_framework_getenv("MONGOC_TEST_SSL_PEM_PWD"); gSSLOptions.ca_file = test_framework_getenv("MONGOC_TEST_SSL_CA_FILE"); gSSLOptions.ca_dir = test_framework_getenv("MONGOC_TEST_SSL_CA_DIR"); gSSLOptions.crl_file = test_framework_getenv("MONGOC_TEST_SSL_CRL_FILE"); gSSLOptions.weak_cert_validation = test_framework_getenv_bool("MONGOC_TEST_SSL_WEAK_CERT_VALIDATION"); } static void test_framework_global_ssl_opts_cleanup(void) { bson_free((void *)gSSLOptions.pem_file); bson_free((void *)gSSLOptions.pem_pwd); bson_free((void *)gSSLOptions.ca_file); bson_free((void *)gSSLOptions.ca_dir); bson_free((void *)gSSLOptions.crl_file); } #endif bool test_framework_is_mongos(void) { bson_t reply; bson_iter_t iter; bool is_mongos; call_hello(&reply); is_mongos = (bson_iter_init_find(&iter, &reply, "msg") && BSON_ITER_HOLDS_UTF8(&iter) && !strcasecmp(bson_iter_utf8(&iter, NULL), "isdbgrid")); bson_destroy(&reply); return is_mongos; } bool test_framework_is_replset(void) { return test_framework_replset_member_count() > 0; } bool test_framework_server_is_secondary(mongoc_client_t *client, uint32_t server_id) { bson_t reply; bson_iter_t iter; mongoc_server_description_t const *sd; bson_error_t error; bool ret; ASSERT(client); sd = mongoc_topology_description_server_by_id_const(client->topology->_shared_descr_.ptr, server_id, &error); ASSERT_OR_PRINT(sd, error); call_hello_with_host_and_port(sd->host.host_and_port, &reply); ret = bson_iter_init_find(&iter, &reply, "secondary") && bson_iter_as_bool(&iter); bson_destroy(&reply); return ret; } bool test_framework_clustertime_supported(void) { bson_t reply; bool has_cluster_time; call_hello(&reply); has_cluster_time = bson_has_field(&reply, "$clusterTime"); bson_destroy(&reply); return has_cluster_time; } int64_t test_framework_session_timeout_minutes(void) { bson_t reply; bson_iter_t iter; int64_t timeout = -1; if (!TestSuite_CheckLive()) { return -1; } call_hello(&reply); if (bson_iter_init_find(&iter, &reply, "logicalSessionTimeoutMinutes")) { timeout = bson_iter_as_int64(&iter); } bson_destroy(&reply); return timeout; } void test_framework_get_max_wire_version(int64_t *max_version) { bson_t reply; bson_iter_t iter; call_hello(&reply); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "maxWireVersion")); *max_version = bson_iter_as_int64(&iter); bson_destroy(&reply); } bool test_framework_has_auth(void) { char *user; #ifndef MONGOC_ENABLE_SSL /* requires SSL for SCRAM implementation, can't test auth */ return false; #endif /* checks if the MONGOC_TEST_USER env var is set */ user = test_framework_get_admin_user(); bson_free(user); if (user) { return true; } else { return false; } } int test_framework_skip_if_auth(void) { if (!TestSuite_CheckLive()) { return 0; } if (test_framework_has_auth()) { return 0; } return 1; } int test_framework_skip_if_no_auth(void) { if (!TestSuite_CheckLive()) { return 0; } if (!test_framework_has_auth()) { return 0; } return 1; } static bool _test_framework_has_crypto(void) { #ifdef MONGOC_ENABLE_CRYPTO return true; #else return false; #endif } int test_framework_skip_if_no_sessions(void) { if (!TestSuite_CheckLive()) { return 0; } if (!_test_framework_has_crypto()) { return 0; } return -1 != test_framework_session_timeout_minutes(); } int test_framework_skip_if_no_cluster_time(void) { if (!TestSuite_CheckLive()) { return 0; } return test_framework_clustertime_supported() ? 1 : 0; } int test_framework_skip_if_crypto(void) { return _test_framework_has_crypto() ? 0 : 1; } int test_framework_skip_if_no_crypto(void) { return test_framework_skip_if_crypto() ? 0 : 1; } int test_framework_skip_if_offline(void) { return test_framework_getenv_bool("MONGOC_TEST_OFFLINE") ? 0 : 1; } int test_framework_skip_if_slow(void) { return test_framework_getenv_bool("MONGOC_TEST_SKIP_SLOW") ? 0 : 1; } int test_framework_skip_if_slow_or_live(void) { return test_framework_skip_if_slow() && TestSuite_CheckLive(); } int test_framework_skip_if_windows(void) { #ifdef _WIN32 return 0; #else return 1; #endif } int test_framework_skip_if_macos(void) { #ifdef __APPLE__ return 0; #else return 1; #endif } /* skip if no Unix domain socket */ int test_framework_skip_if_no_uds(void) { #ifdef _WIN32 return 0; #else char *path; int ret; if (!TestSuite_CheckLive()) { return 0; } path = test_framework_get_unix_domain_socket_path(); ret = access(path, R_OK | W_OK) == 0 ? 1 : 0; bson_free(path); return ret; #endif } int test_framework_skip_if_no_txns(void) { if (test_framework_skip_if_no_crypto() && test_framework_skip_if_no_sessions() && test_framework_skip_if_not_replset()) { // Have crypto, sessions, and replica set. Proceed. return 1; } if (test_framework_skip_if_no_crypto() && test_framework_skip_if_no_sessions() && test_framework_skip_if_not_mongos()) { // Have crypto, sessions, and sharded cluster. Proceed. return 1; } /* transactions not supported, skip the test */ return 0; } bool test_framework_max_wire_version_at_least(int version) { int64_t max_version; BSON_ASSERT(version > 0); test_framework_get_max_wire_version(&max_version); return max_version >= version; } int64_t test_framework_max_write_batch_size(void) { bson_t reply; bson_iter_t iter; int64_t size; call_hello(&reply); if (bson_iter_init_find(&iter, &reply, "maxWriteBatchSize")) { size = bson_iter_as_int64(&iter); } else { size = 1000; } bson_destroy(&reply); return size; } #define N_SERVER_VERSION_PARTS 3 static server_version_t _parse_server_version(const bson_t *buildinfo) { bson_iter_t iter; bson_iter_t array_iter; int i; server_version_t ret = 0; ASSERT(bson_iter_init_find(&iter, buildinfo, "versionArray")); ASSERT(bson_iter_recurse(&iter, &array_iter)); /* Server returns a 4-part version like [3, 2, 0, 0], or like [3, 2, 0, -49] * for an RC. Ignore the 4th part since RCs are equivalent to non-RCs for * testing purposes. */ for (i = 0; i < N_SERVER_VERSION_PARTS && bson_iter_next(&array_iter); i++) { ret *= 1000; ret += 100 + bson_iter_as_int64(&array_iter); } ASSERT_CMPINT(i, ==, N_SERVER_VERSION_PARTS); return ret; } server_version_t test_framework_get_server_version_with_client(mongoc_client_t *client) { bson_t reply; bson_error_t error; server_version_t ret = 0; ASSERT(client); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'buildinfo': 1}"), NULL, &reply, &error), error); ret = _parse_server_version(&reply); bson_destroy(&reply); return ret; } server_version_t test_framework_get_server_version(void) { mongoc_client_t *client; server_version_t ret = 0; client = test_framework_new_default_client(); ret = test_framework_get_server_version_with_client(client); mongoc_client_destroy(client); return ret; } server_version_t test_framework_str_to_version(const char *version_str) { char *str_copy; char *part; char *end; int i; server_version_t ret = 0; str_copy = bson_strdup(version_str); part = strtok(str_copy, "."); /* Versions can have 4 parts like "3.2.0.0", or like "3.2.0.-49" for an RC. * Ignore the 4th part since RCs are equivalent to non-RCs for testing * purposes. */ for (i = 0; i < N_SERVER_VERSION_PARTS && part; i++) { ret *= 1000; ret += 100 + bson_ascii_strtoll(part, &end, 10); part = strtok(NULL, "."); } /* pad out a short version like "3.0" to three parts */ for (; i < N_SERVER_VERSION_PARTS; i++) { ret *= 1000; ret += 100; } bson_free(str_copy); return ret; } /* self-tests for a test framework feature */ static void test_version_cmp(void) { server_version_t v2_6_12 = 102106112; server_version_t v3_0_0 = 103100100; server_version_t v3_0_1 = 103100101; server_version_t v3_0_10 = 103100110; server_version_t v3_2_0 = 103102100; ASSERT(v2_6_12 == test_framework_str_to_version("2.6.12")); ASSERT(v2_6_12 == _parse_server_version(tmp_bson("{'versionArray': [2, 6, 12, 0]}"))); ASSERT(v3_0_0 == test_framework_str_to_version("3")); ASSERT(v3_0_0 == _parse_server_version(tmp_bson("{'versionArray': [3, 0, 0, 0]}"))); ASSERT(v3_0_1 == test_framework_str_to_version("3.0.1")); ASSERT(v3_0_1 == _parse_server_version(tmp_bson("{'versionArray': [3, 0, 1, 0]}"))); ASSERT(v3_0_10 == test_framework_str_to_version("3.0.10")); ASSERT(v3_0_10 == _parse_server_version(tmp_bson("{'versionArray': [3, 0, 10, 0]}"))); /* release candidates should be equivalent to non-rcs. */ ASSERT(v3_2_0 == test_framework_str_to_version("3.2.0.-49")); ASSERT(v3_2_0 == _parse_server_version(tmp_bson("{'versionArray': [3, 2, 0, -49]}"))); ASSERT(v3_2_0 > test_framework_str_to_version("3.1.9")); ASSERT(v3_2_0 == test_framework_str_to_version("3.2")); ASSERT(v3_2_0 < test_framework_str_to_version("3.2.1")); } int test_framework_skip_if_single(void) { if (!TestSuite_CheckLive()) { return 0; } return (test_framework_is_mongos() || test_framework_is_replset()); } int test_framework_skip_if_mongos(void) { if (!TestSuite_CheckLive()) { return 0; } return test_framework_is_mongos() ? 0 : 1; } int test_framework_skip_if_replset(void) { if (!TestSuite_CheckLive()) { return 0; } return test_framework_is_replset() ? 0 : 1; } int test_framework_skip_if_not_single(void) { if (!TestSuite_CheckLive()) { return 0; } return !test_framework_skip_if_single(); } int test_framework_skip_if_not_mongos(void) { if (!TestSuite_CheckLive()) { return 0; } return !test_framework_skip_if_mongos(); } int test_framework_skip_if_not_replset(void) { if (!TestSuite_CheckLive()) { return 0; } return !test_framework_skip_if_replset(); } /* convenience skip functions based on the wire version. */ #define WIRE_VERSION_CHECKS(wv) \ int test_framework_skip_if_max_wire_version_more_than_##wv(void) \ { \ if (!TestSuite_CheckLive()) { \ return 0; \ } \ return test_framework_max_wire_version_at_least(wv + 1) ? 0 : 1; \ } \ int test_framework_skip_if_max_wire_version_less_than_##wv(void) \ { \ if (!TestSuite_CheckLive()) { \ return 0; \ } \ return test_framework_max_wire_version_at_least(wv); \ } \ int test_framework_skip_if_not_rs_version_##wv(void) \ { \ if (!TestSuite_CheckLive()) { \ return 0; \ } \ return (test_framework_max_wire_version_at_least(wv) && test_framework_is_replset()) ? 1 : 0; \ } \ int test_framework_skip_if_rs_version_##wv(void) \ { \ if (!TestSuite_CheckLive()) { \ return 0; \ } \ return (test_framework_max_wire_version_at_least(wv) && test_framework_is_replset()) ? 0 : 1; \ } /* wire version 8 begins with the 4.2 release. */ WIRE_VERSION_CHECKS(8) /* wire version 9 begins with the 4.4 release. */ WIRE_VERSION_CHECKS(9) /* wire versions 10, 11, 12 were internal to the 5.0 release cycle */ WIRE_VERSION_CHECKS(13) /* wire version 14 begins with the 5.1 prerelease. */ WIRE_VERSION_CHECKS(14) /* wire version 17 begins with the 6.0 release. */ WIRE_VERSION_CHECKS(17) /* wire version 19 begins with the 6.2 release. */ WIRE_VERSION_CHECKS(19) /* wire version 21 begins with the 7.0 release. */ WIRE_VERSION_CHECKS(21) /* wire version 22 begins with the 7.1 release. */ WIRE_VERSION_CHECKS(22) /* wire version 23 begins with the 7.2 release. */ WIRE_VERSION_CHECKS(23) /* wire version 24 begins with the 7.3 release. */ WIRE_VERSION_CHECKS(24) /* wire version 25 begins with the 8.0 release. */ WIRE_VERSION_CHECKS(25) /* wire version 26 begins with the 8.1 release. */ WIRE_VERSION_CHECKS(26) /* wire version 27 begins with the 8.2 release. */ WIRE_VERSION_CHECKS(27) int test_framework_skip_if_no_dual_ip_hostname(void) { struct addrinfo hints = {0}, *res = NULL, *iter; int res_count = 0; char *host = test_framework_getenv("MONGOC_TEST_IPV4_AND_IPV6_HOST"); bool needs_free = false; if (host) { needs_free = true; } else { host = "localhost"; } hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; BSON_ASSERT(getaddrinfo(host, "27017", &hints, &res) != -1); iter = res; while (iter) { res_count++; iter = iter->ai_next; } freeaddrinfo(res); if (needs_free) { bson_free(host); } ASSERT_CMPINT(res_count, >, 0); return res_count > 1; } int test_framework_skip_if_no_compressors(void) { char *compressors = test_framework_get_compressors(); bool ret = compressors != NULL; bson_free(compressors); return ret; } int test_framework_skip_if_compressors(void) { return !test_framework_skip_if_no_compressors(); } int test_framework_skip_if_no_failpoint(void) { mongoc_client_t *client; bool ret; bson_error_t error; if (!TestSuite_CheckLive()) { return 0; } client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': 'off', 'data': " "{'errorCode': 10107, 'failCommands': ['count']}}"), NULL, NULL, &error); mongoc_client_destroy(client); if (!ret) { return 0; /* do not proceed */ } /* proceed. */ return 1; } int test_framework_skip_if_no_client_side_encryption(void) { const char *required_env_vars[] = {"MONGOC_TEST_AWS_SECRET_ACCESS_KEY", "MONGOC_TEST_AWS_ACCESS_KEY_ID", "MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY", "MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID", "MONGOC_TEST_AZURE_TENANT_ID", "MONGOC_TEST_AZURE_CLIENT_ID", "MONGOC_TEST_AZURE_CLIENT_SECRET", "MONGOC_TEST_GCP_EMAIL", "MONGOC_TEST_GCP_PRIVATEKEY", "MONGOC_TEST_CSFLE_TLS_CA_FILE", "MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE", NULL}; const char **iter; bool has_creds = true; for (iter = required_env_vars; *iter != NULL; iter++) { char *val; val = test_framework_getenv(*iter); if (!val) { MONGOC_DEBUG("%s not defined", *iter); has_creds = false; break; } bson_free(val); } if (has_creds) { #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION return 1; /* 1 == proceed. */ #else return 0; /* 0 == do not proceed. */ #endif } return 0; /* 0 == do not proceed. */ } int test_framework_skip_if_no_aws(void) { #ifdef MONGOC_ENABLE_MONGODB_AWS_AUTH return 1; /* proceed. */ #else return 0; /* do not proceed. */ #endif } /* test-libmongoc may not have permissions to set environment variables. */ int test_framework_skip_if_no_setenv(void) { char *value; if (!_mongoc_setenv("MONGOC_TEST_CANARY", "VALUE")) { return 0; /* do not proceed. */ } value = test_framework_getenv("MONGOC_TEST_CANARY"); if (!value || 0 != strcmp(value, "VALUE")) { return 0; /* do not proceed. */ } bson_free(value); return 1; } static char MONGOC_TEST_UNIQUE[32]; #if defined(_MSC_VER) && defined(_WIN64) LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *pExceptionInfo) { HANDLE process = GetCurrentProcess(); fprintf(stderr, "entering windows exception handler\n"); SymInitialize(process, NULL, TRUE); /* Shamelessly stolen from https://stackoverflow.com/a/28115589 */ /* StackWalk64() may modify context record passed to it, so we will use a copy. */ CONTEXT context_record = *pExceptionInfo->ContextRecord; DWORD exception_code = pExceptionInfo->ExceptionRecord->ExceptionCode; /* Initialize stack walking. */ char exception_string[128]; bson_snprintf(exception_string, sizeof(exception_string), (exception_code == EXCEPTION_ACCESS_VIOLATION) ? "(access violation)" : "0x%08X", exception_code); char address_string[32]; bson_snprintf(address_string, sizeof(address_string), "0x%p", pExceptionInfo->ExceptionRecord->ExceptionAddress); fprintf(stderr, "exception '%s' at '%s', terminating\n", exception_string, address_string); STACKFRAME64 stack_frame; memset(&stack_frame, 0, sizeof(stack_frame)); #if defined(_WIN64) #if defined(_M_ARM64) int machine_type = IMAGE_FILE_MACHINE_ARM64; stack_frame.AddrPC.Offset = context_record.Pc; stack_frame.AddrFrame.Offset = context_record.Fp; stack_frame.AddrStack.Offset = context_record.Sp; #else int machine_type = IMAGE_FILE_MACHINE_AMD64; stack_frame.AddrPC.Offset = context_record.Rip; stack_frame.AddrFrame.Offset = context_record.Rbp; stack_frame.AddrStack.Offset = context_record.Rsp; #endif #else int machine_type = IMAGE_FILE_MACHINE_I386; stack_frame.AddrPC.Offset = context_record.Eip; stack_frame.AddrFrame.Offset = context_record.Ebp; stack_frame.AddrStack.Offset = context_record.Esp; #endif stack_frame.AddrPC.Mode = AddrModeFlat; stack_frame.AddrFrame.Mode = AddrModeFlat; stack_frame.AddrStack.Mode = AddrModeFlat; SYMBOL_INFO *symbol; symbol = bson_malloc0(sizeof(SYMBOL_INFO) + 256); symbol->MaxNameLen = 255; symbol->SizeOfStruct = sizeof(SYMBOL_INFO); fprintf(stderr, "begin stack trace\n"); while (StackWalk64(machine_type, GetCurrentProcess(), GetCurrentThread(), &stack_frame, &context_record, NULL, &SymFunctionTableAccess64, &SymGetModuleBase64, NULL)) { DWORD64 displacement = 0; if (SymFromAddr(process, (DWORD64)stack_frame.AddrPC.Offset, &displacement, symbol)) { IMAGEHLP_MODULE64 moduleInfo; memset(&moduleInfo, 0, sizeof(moduleInfo)); moduleInfo.SizeOfStruct = sizeof(moduleInfo); if (SymGetModuleInfo64(process, symbol->ModBase, &moduleInfo)) fprintf(stderr, "%s : ", moduleInfo.ModuleName); fprintf(stderr, "%s", symbol->Name); } IMAGEHLP_LINE line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE); DWORD offset_ln = 0; if (SymGetLineFromAddr64(process, (DWORD64)stack_frame.AddrPC.Offset, &offset_ln, &line)) { fprintf(stderr, " %s:%d ", line.FileName, line.LineNumber); } fprintf(stderr, "\n"); } fprintf(stderr, "end stack trace\n"); fflush(stderr); return EXCEPTION_EXECUTE_HANDLER; } #endif void test_libmongoc_init(TestSuite *suite, int argc, char **argv) { #if defined(_MSC_VER) && defined(_WIN64) SetUnhandledExceptionFilter(windows_exception_handler); #endif mongoc_init(); bson_snprintf( MONGOC_TEST_UNIQUE, sizeof MONGOC_TEST_UNIQUE, "test_%u_%u", (unsigned)time(NULL), (unsigned)gettestpid()); bson_mutex_init(&captured_logs_mutex); _mongoc_array_init(&captured_logs, sizeof(log_entry_t *)); mongoc_log_set_handler(log_handler, (void *)suite); #ifdef MONGOC_ENABLE_SSL test_framework_global_ssl_opts_init(); atexit(test_framework_global_ssl_opts_cleanup); #endif TestSuite_Init(suite, "", argc, argv); TestSuite_Add(suite, "/TestSuite/version_cmp", test_version_cmp); } void test_libmongoc_destroy(TestSuite *suite) { TestSuite_Destroy(suite); capture_logs(false); /* clear entries */ _mongoc_array_destroy(&captured_logs); bson_mutex_destroy(&captured_logs_mutex); mongoc_cleanup(); } /* * test_framework_skip_if_no_legacy_opcodes returns 0 if the connected server * does not support legacy wire protocol op codes. * * As of SERVER-57457 and SERVER-57391, the following legacy wire protocol * op codes have been removed in the server 5.1: * - OP_KILL_CURSORS * - OP_INSERT * - OP_UPDATE * - OP_DELETE * - OP_GET_MORE * - OP_QUERY (for any command other than isMaster, which drivers use to * initially discover the min/max wire version of a server) */ bool test_framework_supports_legacy_opcodes(void) { /* Wire v14+ removed legacy opcodes */ return test_framework_skip_if_max_wire_version_less_than_14() == 0; } int test_framework_skip_if_no_legacy_opcodes(void) { if (!TestSuite_CheckLive()) { return 0; } if (test_framework_supports_legacy_opcodes()) { return 1; } return 0; } /* SERVER-57390 removed the getLastError command on 5.1 servers. */ int test_framework_skip_if_no_getlasterror(void) { if (!TestSuite_CheckLive()) { return 0; } if (test_framework_supports_legacy_opcodes()) { return 1; } return 0; } bool test_framework_is_loadbalanced(void) { return test_framework_getenv_bool("MONGOC_TEST_LOADBALANCED") || test_framework_getenv_bool("MONGOC_TEST_DNS_LOADBALANCED"); } int test_framework_skip_if_no_server_ssl(void) { if (test_framework_get_ssl()) { return 1; // Proceed. } return 0; // Skip. } int skip_if_no_large_allocations(void) { return test_framework_getenv_bool("MONGOC_TEST_LARGE_ALLOCATIONS"); } bool test_framework_is_oidc(void) { return test_framework_getenv_bool("MONGOC_TEST_OIDC"); } static char * read_test_token(void) { FILE *token_file = fopen("/tmp/tokens/test_machine", "r"); ASSERT(token_file); // Determine length of token: ASSERT(0 == fseek(token_file, 0, SEEK_END)); long token_len = ftell(token_file); ASSERT(token_len > 0); ASSERT(0 == fseek(token_file, 0, SEEK_SET)); // Read file into buffer: char *token = bson_malloc(token_len + 1); size_t nread = fread(token, 1, token_len, token_file); ASSERT(nread == (size_t)token_len); token[token_len] = '\0'; fclose(token_file); return token; } static mongoc_oidc_credential_t * oidc_callback_fn(mongoc_oidc_callback_params_t *params) { char *token = read_test_token(); mongoc_oidc_credential_t *cred = mongoc_oidc_credential_new(token); bson_free(token); return cred; } void test_framework_set_oidc_callback(mongoc_client_t *client) { if (!test_framework_is_oidc()) { return; } mongoc_oidc_callback_t *callback = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_client_set_oidc_callback(client, callback); mongoc_oidc_callback_destroy(callback); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-libmongoc.h000066400000000000000000000174371511661753600233740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_LIBMONGOC_H #define TEST_LIBMONGOC_H #include #include struct TestSuite; struct _bson_t; struct _server_version_t; void test_libmongoc_init(struct TestSuite *suite, int argc, char **argv); void test_libmongoc_destroy(struct TestSuite *suite); mongoc_database_t * get_test_database(mongoc_client_t *client); char * gen_collection_name(const char *prefix); mongoc_collection_t * get_test_collection(mongoc_client_t *client, const char *prefix); void capture_logs(bool capture); void clear_captured_logs(void); bool has_captured_log(mongoc_log_level_t level, const char *msg); void assert_all_captured_logs_have_prefix(const char *prefix); bool has_captured_logs(void); void print_captured_logs(const char *prefix); int64_t get_future_timeout_ms(void); char * test_framework_getenv(const char *name); char * test_framework_getenv_required(const char *name); bool test_framework_getenv_bool(const char *name); int64_t test_framework_getenv_int64(const char *name, int64_t default_value); char * test_framework_get_host(void); uint16_t test_framework_get_port(void); char * test_framework_get_host_and_port(void); char * test_framework_get_admin_user(void); char * test_framework_get_admin_password(void); bool test_framework_get_ssl(void); char * test_framework_add_user_password(const char *uri_str, const char *user, const char *password); char * test_framework_add_user_password_from_env(const char *uri_str); char * test_framework_get_uri_str_no_auth(const char *database_name); char * test_framework_get_uri_str(void); char * test_framework_get_unix_domain_socket_uri_str(void); char * test_framework_get_unix_domain_socket_path_escaped(void); mongoc_uri_t * test_framework_get_uri(void); mongoc_uri_t * test_framework_get_uri_multi_mongos_loadbalanced(void); bool test_framework_uri_apply_multi_mongos(mongoc_uri_t *uri, bool use_multi, bson_error_t *error); size_t test_framework_mongos_count(void); char * test_framework_replset_name(void); size_t test_framework_replset_member_count(void); size_t test_framework_data_nodes_count(void); size_t test_framework_server_count(void); #ifdef MONGOC_ENABLE_SSL const mongoc_ssl_opt_t * test_framework_get_ssl_opts(void); #endif void test_framework_set_ssl_opts(mongoc_client_t *client); void test_framework_set_pool_ssl_opts(mongoc_client_pool_t *pool); mongoc_server_api_t * test_framework_get_default_server_api(void); mongoc_client_t * test_framework_new_default_client(void); mongoc_client_t * test_framework_client_new_no_server_api(void); mongoc_client_t * test_framework_client_new(const char *uri_str, const mongoc_server_api_t *api); mongoc_client_t * test_framework_client_new_from_uri(const mongoc_uri_t *uri, const mongoc_server_api_t *api); mongoc_client_pool_t * test_framework_new_default_client_pool(void); mongoc_client_pool_t * test_framework_client_pool_new_from_uri(const mongoc_uri_t *uri, const mongoc_server_api_t *api); bool test_framework_is_mongos(void); bool test_framework_is_replset(void); bool test_framework_server_is_secondary(mongoc_client_t *client, uint32_t server_id); int64_t test_framework_session_timeout_minutes(void); void test_framework_get_max_wire_version(int64_t *max_version); bool test_framework_clustertime_supported(void); bool test_framework_max_wire_version_at_least(int version); int64_t test_framework_max_write_batch_size(void); bool test_framework_has_auth(void); int test_framework_skip_if_auth(void); int test_framework_skip_if_no_auth(void); int test_framework_skip_if_no_sessions(void); int test_framework_skip_if_no_cluster_time(void); int test_framework_skip_if_crypto(void); int test_framework_skip_if_no_crypto(void); int test_framework_skip_if_mongos(void); int test_framework_skip_if_replset(void); int test_framework_skip_if_single(void); int test_framework_skip_if_windows(void); int test_framework_skip_if_macos(void); int test_framework_skip_if_no_uds(void); /* skip if no Unix domain socket */ int test_framework_skip_if_no_txns(void); int test_framework_skip_if_not_mongos(void); int test_framework_skip_if_not_replset(void); int test_framework_skip_if_not_single(void); int test_framework_skip_if_offline(void); int test_framework_skip_if_slow(void); int test_framework_skip_if_slow_or_live(void); #define WIRE_VERSION_CHECK_DECLS(wv) \ int test_framework_skip_if_max_wire_version_less_than_##wv(void); \ int test_framework_skip_if_max_wire_version_more_than_##wv(void); \ int test_framework_skip_if_rs_version_##wv(void); \ int test_framework_skip_if_not_rs_version_##wv(void); /* wire version 8 begins with the 4.2 release. */ WIRE_VERSION_CHECK_DECLS(8) /* wire version 9 begins with the 4.4 release. */ WIRE_VERSION_CHECK_DECLS(9) /* wire versions 10, 11, 12 were internal to the 5.0 release cycle */ WIRE_VERSION_CHECK_DECLS(13) /* wire version 14 begins with the 5.1 prerelease. */ WIRE_VERSION_CHECK_DECLS(14) /* wire version 17 begins with the 6.0 release. */ WIRE_VERSION_CHECK_DECLS(17) /* wire version 19 begins with the 6.2 release. */ WIRE_VERSION_CHECK_DECLS(19) /* wire version 21 begins with the 7.0 release. */ WIRE_VERSION_CHECK_DECLS(21) /* wire version 22 begins with the 7.1 release. */ WIRE_VERSION_CHECK_DECLS(22) /* wire version 23 begins with the 7.2 release. */ WIRE_VERSION_CHECK_DECLS(23) /* wire version 24 begins with the 7.3 release. */ WIRE_VERSION_CHECK_DECLS(24) /* wire version 25 begins with the 8.0 release. */ WIRE_VERSION_CHECK_DECLS(25) /* wire version 26 begins with the 8.1 release. */ WIRE_VERSION_CHECK_DECLS(26) /* wire version 27 begins with the 8.2 release. */ WIRE_VERSION_CHECK_DECLS(27) #undef WIRE_VERSION_CHECK_DECLS typedef struct _debug_stream_stats_t { mongoc_client_t *client; int n_destroyed; int n_failed; } debug_stream_stats_t; void test_framework_set_debug_stream(mongoc_client_t *client, debug_stream_stats_t *stats); typedef int64_t server_version_t; server_version_t test_framework_get_server_version_with_client(mongoc_client_t *client); server_version_t test_framework_get_server_version(void); server_version_t test_framework_str_to_version(const char *version_str); int test_framework_skip_if_no_dual_ip_hostname(void); char * test_framework_get_compressors(void); bool test_framework_has_compressors(void); int test_framework_skip_if_no_compressors(void); int test_framework_skip_if_compressors(void); int test_framework_skip_if_no_failpoint(void); int test_framework_skip_if_no_client_side_encryption(void); int test_framework_skip_if_no_aws(void); int test_framework_skip_if_no_setenv(void); bool test_framework_supports_legacy_opcodes(void); int test_framework_skip_if_no_legacy_opcodes(void); int test_framework_skip_if_no_getlasterror(void); int test_framework_skip_if_no_exhaust_cursors(void); bool test_framework_is_oidc(void); void test_framework_set_oidc_callback(mongoc_client_t *client); bool test_framework_is_loadbalanced(void); // `test_framework_skip_if_no_server_ssl` skips if test runner was not told to // connect to the server with SSL. int test_framework_skip_if_no_server_ssl(void); // `skip_if_no_large_allocations` skip tests requiring large allocations. // Large allocations were observed to fail when run with TSan, and are time // consuming with ASan. int skip_if_no_large_allocations(void); #endif mongo-c-driver-2.2.1/src/libmongoc/tests/test-mcd-azure-imds.c000066400000000000000000000102701511661753600242230ustar00rootroot00000000000000#include #include #include #include #define RAW_STRING(...) #__VA_ARGS__ static void _test_oauth_parse(void) { // Test that we can correctly parse a JSON document from the IMDS sever bson_error_t error; mcd_azure_access_token token; ASSERT(!mcd_azure_access_token_try_init_from_json_str(&token, "invalid json", -1, &error)); ASSERT_CMPUINT32(error.domain, ==, BSON_ERROR_JSON); ASSERT(!mcd_azure_access_token_try_init_from_json_str(&token, "{}", -1, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_BAD_JSON, ""); ASSERT(!mcd_azure_access_token_try_init_from_json_str(&token, RAW_STRING({"access_token" : null}), -1, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_BAD_JSON, ""); error = (bson_error_t){0}; ASSERT(mcd_azure_access_token_try_init_from_json_str( &token, RAW_STRING({"access_token" : "meow", "resource" : "something", "expires_in" : "1234", "token_type" : "Bearer"}), -1, &error)); ASSERT_ERROR_CONTAINS(error, 0, 0, ""); ASSERT_CMPSTR(token.access_token, "meow"); mcd_azure_access_token_destroy(&token); } static void _test_http_req(void) { // Test generating an HTTP request for the IMDS server mcd_azure_imds_request req; ASSERT(mcd_azure_imds_request_init(&req, MCD_TOKEN_RESOURCE_VAULT, "example.com", 9879, "", NULL)); mcommon_string_append_t req_str; mcommon_string_new_as_append(&req_str); _mongoc_http_render_request_head(&req_str, &req.req); mcd_azure_imds_request_destroy(&req); // Assert that we composed exactly the request that we expected ASSERT_CMPSTR(mcommon_str_from_append(&req_str), "GET " "/metadata/identity/oauth2/" "token?api-version=2018-02-01&resource=https%3A%2F%2Fvault." "azure.net HTTP/1.0\r\n" "Host: example.com:9879\r\n" "Connection: close\r\n" "Metadata: true\r\n" "Accept: application/json\r\n" "\r\n"); mcommon_string_from_append_destroy(&req_str); } static const char * _get_test_imds_host(void) { return getenv("TEST_KMS_PROVIDER_HOST"); } static void _run_http_test_case(const char *case_, mongoc_error_domain_t expect_domain, mongoc_error_code_t expect_code, const char *expect_error_message) { bson_error_t error = {0}; struct _mongoc_host_list_t host; _mongoc_host_list_from_string_with_err(&host, _get_test_imds_host(), &error); ASSERT_ERROR_CONTAINS(error, 0, 0, ""); mcd_azure_access_token token = {0}; char *const header = bson_strdup_printf("X-MongoDB-HTTP-TestParams: case=%s\r\n", case_); mcd_azure_access_token_from_imds( &token, MCD_TOKEN_RESOURCE_VAULT, host.host, host.port, header, (mlib_timer){0}, NULL, &error); bson_free(header); mcd_azure_access_token_destroy(&token); ASSERT_ERROR_CONTAINS(error, expect_domain, expect_code, expect_error_message); } static void _test_with_mock_server(void *ctx) { BSON_UNUSED(ctx); _run_http_test_case("", 0, 0, ""); // (No error) _run_http_test_case("404", MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_HTTP, ""); _run_http_test_case("slow", MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Timeout"); _run_http_test_case("empty-json", MONGOC_ERROR_AZURE, MONGOC_ERROR_KMS_SERVER_BAD_JSON, ""); _run_http_test_case("bad-json", MONGOC_ERROR_CLIENT, MONGOC_ERROR_STREAM_INVALID_TYPE, ""); _run_http_test_case("giant", MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "too large"); } static int have_mock_server_env(void) { return _get_test_imds_host() != NULL; } void test_mcd_azure_imds_install(TestSuite *suite) { TestSuite_Add(suite, "/azure/imds/http/parse", _test_oauth_parse); TestSuite_Add(suite, "/azure/imds/http/request", _test_http_req); TestSuite_AddFull(suite, "/azure/imds/http/talk [uses:fake_kms_provider_server][lock:fake-kms]", _test_with_mock_server, NULL, NULL, have_mock_server_env); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mcd-integer.c000066400000000000000000000022441511661753600236020ustar00rootroot00000000000000#include #include static void _test_overflow(void) { BSON_ASSERT(_mcd_i64_add_would_overflow(INT64_MIN, INT64_MIN)); BSON_ASSERT(_mcd_i64_add_would_overflow(INT64_MIN, -1)); BSON_ASSERT(_mcd_i64_add_would_overflow(INT64_MIN, -3)); BSON_ASSERT(!_mcd_i64_add_would_overflow(INT64_MIN, 0)); BSON_ASSERT(!_mcd_i64_add_would_overflow(INT64_MIN, INT64_MAX)); BSON_ASSERT(_mcd_i64_sub_would_overflow(INT64_MIN, 4)); BSON_ASSERT(!_mcd_i64_sub_would_overflow(INT64_MAX, 4)); BSON_ASSERT(_mcd_i64_sub_would_overflow(INT64_MAX, -4)); BSON_ASSERT(_mcd_i64_sub_would_overflow(INT64_MIN, 1)); BSON_ASSERT(!_mcd_i64_sub_would_overflow(INT64_MIN, 0)); BSON_ASSERT(!_mcd_i64_sub_would_overflow(INT64_MIN, -4)); BSON_ASSERT(!_mcd_i64_mul_would_overflow(INT64_MIN, 1)); BSON_ASSERT(_mcd_i64_mul_would_overflow(INT64_MIN, -1)); BSON_ASSERT(_mcd_i64_mul_would_overflow(-1, INT64_MIN)); BSON_ASSERT(_mcd_i64_mul_would_overflow(-2, INT64_MIN)); BSON_ASSERT(!_mcd_i64_mul_would_overflow(-7, INT64_MIN / 8)); } void test_mcd_integer_install(TestSuite *suite) { TestSuite_Add(suite, "/integer/overflow", _test_overflow); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mcd-nsinfo.c000066400000000000000000000063651511661753600234510ustar00rootroot00000000000000#include #include #include // ASSERT_MATCH static void test_nsinfo_works(void) { mcd_nsinfo_t *nsinfo = mcd_nsinfo_new(); // Add several namespaces. bson_error_t error; ASSERT_OR_PRINT(0 <= mcd_nsinfo_append(nsinfo, "db.coll1", &error), error); ASSERT_OR_PRINT(0 <= mcd_nsinfo_append(nsinfo, "db.coll2", &error), error); ASSERT_OR_PRINT(0 <= mcd_nsinfo_append(nsinfo, "db.coll3", &error), error); // Check resulting indexes. ASSERT_CMPINT32(0, ==, mcd_nsinfo_find(nsinfo, "db.coll1")); ASSERT_CMPINT32(1, ==, mcd_nsinfo_find(nsinfo, "db.coll2")); ASSERT_CMPINT32(2, ==, mcd_nsinfo_find(nsinfo, "db.coll3")); ASSERT_CMPINT32(-1, ==, mcd_nsinfo_find(nsinfo, "db.doesnotexist")); // Check the resulting document sequence. { const mongoc_buffer_t *document_sequence = mcd_nsinfo_as_document_sequence(nsinfo); bson_reader_t *reader = bson_reader_new_from_data(document_sequence->data, document_sequence->len); bool reached_eof = false; const bson_t *bson; bson = bson_reader_read(reader, &reached_eof); ASSERT_MATCH(bson, BSON_STR({"ns" : "db.coll1"})); bson = bson_reader_read(reader, &reached_eof); ASSERT_MATCH(bson, BSON_STR({"ns" : "db.coll2"})); bson = bson_reader_read(reader, &reached_eof); ASSERT_MATCH(bson, BSON_STR({"ns" : "db.coll3"})); bson = bson_reader_read(reader, &reached_eof); ASSERT(!bson); ASSERT(reached_eof); bson_reader_destroy(reader); } mcd_nsinfo_destroy(nsinfo); } static void test_nsinfo_handles_100k_namespaces(void) { // Test repeated finding and adding 100,000 unique namespaces. // A `bulkWrite` command supports a maximum of maxWriteBatchSize unique namespaces (currently 100,000). const size_t ns_count = 100000; bson_error_t error; mcd_nsinfo_t *nsinfo = mcd_nsinfo_new(); for (size_t i = 0; i < ns_count; i++) { char *ns = bson_strdup_printf("db.coll%zu", i); ASSERT_CMPINT32(-1, ==, mcd_nsinfo_find(nsinfo, ns)); ASSERT_OR_PRINT(0 <= mcd_nsinfo_append(nsinfo, ns, &error), error); bson_free(ns); } // Check count of resulting document sequence. { size_t count = 0; const mongoc_buffer_t *document_sequence = mcd_nsinfo_as_document_sequence(nsinfo); bson_reader_t *reader = bson_reader_new_from_data(document_sequence->data, document_sequence->len); while (true) { bool reached_eof = false; const bson_t *bson = bson_reader_read(reader, &reached_eof); if (bson == NULL) { ASSERT(reached_eof); break; } count++; } ASSERT_CMPSIZE_T(count, ==, ns_count); bson_reader_destroy(reader); } mcd_nsinfo_destroy(nsinfo); } static void test_nsinfo_calculates_bson_size(void) { bson_t *expect = tmp_bson("{'ns': 'foo.bar'}"); uint32_t got = mcd_nsinfo_get_bson_size("foo.bar"); ASSERT_CMPUINT32(got, ==, expect->len); } void test_mcd_nsinfo_install(TestSuite *suite) { TestSuite_Add(suite, "/nsinfo/works", test_nsinfo_works); TestSuite_Add(suite, "/nsinfo/handles_100k_namespaces", test_nsinfo_handles_100k_namespaces); TestSuite_Add(suite, "/nsinfo/calculates_bson_size", test_nsinfo_calculates_bson_size); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mcd-rpc.c000066400000000000000000004236111511661753600227360ustar00rootroot00000000000000#include #include #include #include #include #include #include // clang-format off #define TEST_DATA_OP_COMPRESSED \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x2d, 0x00, 0x00, 0x00, /* messageLength (45) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xdc, 0x07, 0x00, 0x00, /* opCode (2012: OP_COMPRESSED) */ \ /* */ \ /* */ /* OP_COMPRESSED fields (9 bytes) */ \ /* 16 */ 0xdd, 0x07, 0x00, 0x00, /* originalOpcode (2013: OP_MSG) */ \ /* 20 */ 0x14, 0x00, 0x00, 0x00, /* uncompressedSize (20) */ \ /* 24 */ 0x00, /* compressorId (0: noop) */ \ /* */ \ /* */ /* compressedMessage (20 bytes) */ \ /* 25 */ 0x00, 0x00, 0x00, 0x00, /* flagBits (MONGOC_OP_MSG_FLAG_NONE) */ \ /* 29 */ 0x00, /* Kind 0: Body */ \ /* 30 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 34 */ 0x10, /* (int32) */ \ /* 35 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 40 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 44 */ 0x00 /* } */ \ /* 45 */ // clang-format on // clang-format off #define TEST_DATA_OP_MSG_KIND_0 \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x28, 0x00, 0x00, 0x00, /* messageLength (40) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xdd, 0x07, 0x00, 0x00, /* opCode (2013: OP_MSG) */ \ /* */ \ /* */ /* flagBits (4 bytes) */ \ /* 16 */ 0x01, 0x00, 0x00, 0x00, /* MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT */ \ /* */ \ /* */ /* Section 0 (16 bytes) */ \ /* 20 */ 0x00, /* Kind 0: Body */ \ /* 21 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 25 */ 0x10, /* (int32) */ \ /* 26 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 31 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 35 */ 0x00, /* } */ \ /* */ \ /* */ /* Optional checksum (4 bytes) */ \ /* 36 */ 0x44, 0x33, 0x22, 0x11 /* checksum (287454020) */ \ /* 40 */ // clang-format on // clang-format off #define TEST_DATA_OP_MSG_KIND_1_SINGLE \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x43, 0x00, 0x00, 0x00, /* messageLength (67) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xdd, 0x07, 0x00, 0x00, /* opCode (2013: OP_MSG) */ \ /* */ \ /* */ /* flagBits (4 bytes) */ \ /* 16 */ 0x01, 0x00, 0x00, 0x00, /* MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT */ \ /* */ \ /* */ /* Section 0 (16 bytes) */ \ /* 20 */ 0x00, /* Kind 0: Body */ \ /* 21 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 25 */ 0x10, /* (int32) */ \ /* 26 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 31 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 35 */ 0x00, /* } */ \ /* */ \ /* */ /* Section 1 (27 bytes) */ \ /* 36 */ 0x01, /* Kind 1: Document Sequence */ \ /* 37 */ 0x1a, 0x00, 0x00, 0x00, /* size (26 bytes) */ \ /* 41 */ 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x00, /* identifier ("single") */ \ /* 48 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 52 */ 0x10, /* (int32) */ \ /* 53 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 58 */ 0x01, 0x00, 0x00, 0x00, /* 1 */ \ /* 62 */ 0x00, /* } */ \ /* */ \ /* */ /* Optional checksum (4 bytes) */ \ /* 63 */ 0x44, 0x33, 0x22, 0x11 /* checksum (287454020) */ \ /* 67 */ // clang-format on // clang-format off #define TEST_DATA_OP_MSG_KIND_1_MULTIPLE \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x6e, 0x00, 0x00, 0x00, /* messageLength (110) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xdd, 0x07, 0x00, 0x00, /* opCode (2013: OP_MSG) */ \ /* */ \ /* */ /* flagBits (4 bytes) */ \ /* 16 */ 0x01, 0x00, 0x00, 0x00, /* MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT */ \ /* */ \ /* */ /* Section 0 (16 bytes) */ \ /* 20 */ 0x00, /* Kind 0: Body. */ \ /* 21 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 25 */ 0x10, /* (int32) */ \ /* 26 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 31 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 35 */ 0x00, /* } */ \ /* */ \ /* */ /* Section 1 (26 bytes) */ \ /* 36 */ 0x01, /* Kind 1: Document Sequence */ \ /* 37 */ 0x19, 0x00, 0x00, 0x00, /* size (25 bytes) */ \ /* 41 */ 0x66, 0x69, 0x72, 0x73, 0x74, 0x00, /* identifier ("first") */ \ /* 47 */ 0x0f, 0x00, 0x00, 0x00, /* (15 bytes) { */ \ /* 51 */ 0x10, /* (int32) */ \ /* 52 */ 0x6b, 0x69, 0x6e, 0x64, 0x00, /* 'kind': */ \ /* 57 */ 0x01, 0x00, 0x00, 0x00, /* 1 */ \ /* 61 */ 0x00, /* } */ \ /* */ \ /* */ /* Section 2 (44 bytes) */ \ /* 62 */ 0x01, /* Kind 1: Document Sequence */ \ /* 63 */ 0x2b, 0x00, 0x00, 0x00, /* size (43 bytes) */ \ /* 67 */ 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00, /* identifier ("second") */ \ /* 74 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 78 */ 0x10, /* (int32) */ \ /* 79 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 85 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 89 */ 0x00, /* } */ \ /* 90 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 94 */ 0x10, /* (int32) */ \ /* 95 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 101 */ 0x01, 0x00, 0x00, 0x00, /* 1 */ \ /* 105 */ 0x00, /* } */ \ /* */ \ /* */ /* Optional checksum (4 bytes) */ \ /* 106 */ 0x44, 0x33, 0x22, 0x11 /* checksum (287454020) */ \ /* 110 */ // clang-format on // clang-format off #define TEST_DATA_OP_REPLY \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x44, 0x00, 0x00, 0x00, /* messageLength (68) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0x01, 0x00, 0x00, 0x00, /* opCode (1: OP_REPLY) */ \ /* */ \ /* */ /* OP_REPLY fields (52 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* responseFlags (0: none) */ \ /* 20 */ 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, /* cursorID (1234605616436508552) */ \ /* 28 */ 0x00, 0x00, 0x00, 0x00, /* startingFrom (0) */ \ /* 32 */ 0x02, 0x00, 0x00, 0x00, /* numberReturned (2) */ \ /* */ \ /* */ /* documents (32 bytes) */ \ /* 36 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 40 */ 0x10, /* (int32) */ \ /* 41 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 47 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 51 */ 0x00, /* } */ \ /* 52 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 56 */ 0x10, /* (int32) */ \ /* 57 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 63 */ 0x01, 0x00, 0x00, 0x00, /* 1 */ \ /* 67 */ 0x00 /* } */ \ /* 68 */ // clang-format on // clang-format off #define TEST_DATA_OP_UPDATE \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x3e, 0x00, 0x00, 0x00, /* messageLength (62) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd1, 0x07, 0x00, 0x00, /* opCode (2001: OP_UPDATE) */ \ /* */ \ /* */ /* OP_UPDATE fields (46 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* ZERO */ \ /* 20 */ 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x00, /* fullCollectionName ("db.coll") */ \ /* 28 */ 0x00, 0x00, 0x00, 0x00, /* flags (0: none) */ \ /* */ \ /* */ /* selector (16 bytes) */ \ /* 32 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 36 */ 0x08, /* (boolean) */ \ /* 37 */ 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x00, /* 'selector': */ \ /* 46 */ 0x00, /* false */ \ /* 47 */ 0x00, /* } */ \ /* */ \ /* */ /* update (14 bytes) */ \ /* 48 */ 0x0e, 0x00, 0x00, 0x00, /* (14 bytes) */ \ /* 52 */ 0x08, /* (boolean) */ \ /* 53 */ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, /* 'update': */ \ /* 54 */ 0x01, /* true */ \ /* 61 */ 0x00 /* } */ \ /* 62 */ // clang-format on // clang-format off #define TEST_DATA_OP_INSERT \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x3c, 0x00, 0x00, 0x00, /* messageLength (60) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd2, 0x07, 0x00, 0x00, /* opCode (2002: OP_INSERT) */ \ /* */ \ /* */ /* OP_INSERT fields (48 bytes ) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* flags (0: none) */ \ /* 20 */ 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x00, /* fullCollectionName ("db.coll") */ \ /* */ \ /* */ /* documents (32 bytes) */ \ /* 28 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 32 */ 0x10, /* (int32) */ \ /* 33 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 39 */ 0x00, 0x00, 0x00, 0x00, /* 0 */ \ /* 43 */ 0x00, /* } */ \ /* 44 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 48 */ 0x10, /* (int32) */ \ /* 49 */ 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, /* 'index': */ \ /* 55 */ 0x01, 0x00, 0x00, 0x00, /* 1 */ \ /* 59 */ 0x00 /* } */ \ /* 60 */ // clang-format on // clang-format off #define TEST_DATA_OP_QUERY \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x41, 0x00, 0x00, 0x00, /* messageLength (65) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd4, 0x07, 0x00, 0x00, /* opCode (2004: OP_QUERY) */ \ /* */ \ /* */ /* OP_QUERY fields (49 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* flags (0: none) */ \ /* 20 */ 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x00, /* fullCollectionName ("db.coll") */ \ /* 28 */ 0x00, 0x00, 0x00, 0x00, /* numberToSkip (0) */ \ /* 32 */ 0x00, 0x00, 0x00, 0x00, /* numberToReturn (0) */ \ /* */ \ /* */ /* query (13 bytes) */ \ /* 36 */ 0x0d, 0x00, 0x00, 0x00, /* (13 bytes) { */ \ /* 40 */ 0x08, /* (boolean) */ \ /* 41 */ 0x71, 0x75, 0x65, 0x72, 0x79, 0x00, /* 'query': */ \ /* 47 */ 0x00, /* false */ \ /* 48 */ 0x00, /* } */ \ /* */ \ /* */ /* Optional returnFieldsSelector (16 bytes) */ \ /* 49 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 53 */ 0x08, /* (boolean) */ \ /* 54 */ 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x00, /* 'selector': */ \ /* 63 */ 0x01, /* true */ \ /* 64 */ 0x00 /* } */ \ /* 65 */ // clang-format on // clang-format off #define TEST_DATA_OP_GET_MORE \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x28, 0x00, 0x00, 0x00, /* messageLength (40) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd5, 0x07, 0x00, 0x00, /* opCode (2005: OP_GET_MORE) */ \ /* */ \ /* */ /* OP_GET_MORE fields (24 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* ZERO */ \ /* 20 */ 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x00, /* fullCollectionName ("db.coll") */ \ /* 28 */ 0x00, 0x00, 0x00, 0x00, /* numberToReturn (0) */ \ /* 32 */ 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 /* cursorID (1234605616436508552) */ \ /* 40 */ // clang-format on // clang-format off #define TEST_DATA_OP_DELETE \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x30, 0x00, 0x00, 0x00, /* messageLength (48) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd6, 0x07, 0x00, 0x00, /* opCode (2006: OP_DELETE) */ \ /* */ \ /* */ /* OP_DELETE fields (16 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* ZERO */ \ /* 20 */ 0x64, 0x62, 0x2e, 0x63, 0x6f, 0x6c, 0x6c, 0x00, /* fullCollectionName ("db.coll") */ \ /* 28 */ 0x00, 0x00, 0x00, 0x00, /* flags (0: none) */ \ /* */ \ /* */ /* selector (16 bytes) */ \ /* 32 */ 0x10, 0x00, 0x00, 0x00, /* (16 bytes) { */ \ /* 36 */ 0x08, /* (boolean) */ \ /* 37 */ 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x00, /* 'selector': */ \ /* 46 */ 0x00, /* false */ \ /* 47 */ 0x00 /* } */ \ /* 48 */ // clang-format on // clang-format off #define TEST_DATA_OP_KILL_CURSORS \ /* */ /* header (16 bytes) */ \ /* 0 */ 0x28, 0x00, 0x00, 0x00, /* messageLength (40) */ \ /* 4 */ 0x04, 0x03, 0x02, 0x01, /* requestID (16909060) */ \ /* 8 */ 0x08, 0x07, 0x06, 0x05, /* responseTo (84281096) */ \ /* 12 */ 0xd7, 0x07, 0x00, 0x00, /* opCode (2007: OP_KILL_CURSORS) */ \ /* */ \ /* */ /* OP_KILL_CURSORS fields (8 bytes) */ \ /* 16 */ 0x00, 0x00, 0x00, 0x00, /* ZERO */ \ /* 20 */ 0x02, 0x00, 0x00, 0x00, /* numberOfCursorIds (2)*/ \ /* */ \ /* */ /* cursorIDs (16 bytes) */ \ /* 24 */ 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, /* cursorID (1230066625199609624) */ \ /* 32 */ 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21 /* cursorID (2387509390608836392) */ \ /* 40 */ // clang-format on #define ASSERT_RPC_MESSAGE_RESULT(rpc, data_begin, data_end, data_len) \ if (1) { \ const size_t parsed_len = (size_t)((const uint8_t *)data_end - data_begin); \ if (rpc) { \ ASSERT_WITH_MSG(parsed_len == data_len, \ "converted only %zu bytes despite %zu bytes of valid input data", \ parsed_len, \ data_len); \ } else { \ ASSERT_WITH_MSG(rpc, \ "failed to convert valid input data into an RPC " \ "message due to byte %zu of %zu", \ parsed_len, \ data_len); \ } \ } else \ (void)0 static void test_rpc_message_from_data_op_compressed_valid(void) { uint8_t data[] = {TEST_DATA_OP_COMPRESSED}; const size_t data_len = sizeof(data); // Valid test input data. { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_COMPRESSED); ASSERT_CMPINT32(mcd_rpc_op_compressed_get_original_opcode(rpc), ==, MONGOC_OP_CODE_MSG); ASSERT_CMPINT32(mcd_rpc_op_compressed_get_uncompressed_size(rpc), ==, 20); ASSERT_CMPUINT(mcd_rpc_op_compressed_get_compressor_id(rpc), ==, MONGOC_OP_COMPRESSED_COMPRESSOR_ID_NOOP); const uint8_t *const compressed_message = mcd_rpc_op_compressed_get_compressed_message(rpc); ASSERT_CMPSIZE_T((size_t)(compressed_message - data), ==, 25u); ASSERT_CMPSIZE_T(mcd_rpc_op_compressed_get_compressed_message_length(rpc), ==, 20u); mcd_rpc_message_destroy(rpc); } // Test that compressorId is being parsed correctly. { data[24] = MONGOC_OP_COMPRESSED_COMPRESSOR_ID_SNAPPY; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPUINT(mcd_rpc_op_compressed_get_compressor_id(rpc), ==, MONGOC_OP_COMPRESSED_COMPRESSOR_ID_SNAPPY); mcd_rpc_message_destroy(rpc); data[24] = MONGOC_OP_COMPRESSED_COMPRESSOR_ID_NOOP; } } static void _test_rpc_message_from_data_op_msg_valid(uint8_t *data, size_t data_len, void (*test)(const uint8_t *data, size_t data_len, bool with_checksum)) { ASSERT_WITH_MSG((data[16] & MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT) != 0, "test input data did not set MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT"); // Test with and without the optional checksum by temporarily modifying the // data and data length accordingly. { data[0] = (uint8_t)(data[0] - 4u); // Reduce messageLength. data[16] = (uint8_t)(data[16] & ~MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT); test(data, data_len - 4u, false); data[0] = (uint8_t)(data[0] + 4u); // Revert messageLength. data[16] = (uint8_t)(data[16] | MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT); } test(data, data_len, true); } static void _test_rpc_message_from_data_op_msg_valid_kind_0(const uint8_t *data, size_t data_len, bool with_checksum) { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_MSG); if (with_checksum) { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT); } else { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_NONE); } ASSERT_CMPSIZE_T(mcd_rpc_op_msg_get_sections_count(rpc), ==, 1u); ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 0u), ==, 0u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 0u); ASSERT_CMPINT32(section_len, ==, 15); const void *const body = mcd_rpc_op_msg_section_get_body(rpc, 0u); ASSERT(body); bson_t bson; ASSERT(bson_init_static(&bson, body, (size_t)section_len)); ASSERT_MATCH(&bson, "{'kind': 0}"); if (with_checksum) { const uint32_t *checksum = mcd_rpc_op_msg_get_checksum(rpc); ASSERT(checksum); ASSERT_CMPUINT32(*checksum, ==, 287454020u); } else { ASSERT(!mcd_rpc_op_msg_get_checksum(rpc)); } mcd_rpc_message_destroy(rpc); } static void test_rpc_message_from_data_op_msg_valid_kind_0(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_0}; _test_rpc_message_from_data_op_msg_valid(data, sizeof(data), _test_rpc_message_from_data_op_msg_valid_kind_0); } static void _test_rpc_message_from_data_op_msg_valid_kind_1_single(const uint8_t *data, size_t data_len, bool with_checksum) { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_MSG); if (with_checksum) { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT); } else { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_NONE); } ASSERT_CMPSIZE_T(mcd_rpc_op_msg_get_sections_count(rpc), ==, 2u); // Section 0. { ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 0u), ==, 0u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 0u); ASSERT_CMPINT32(section_len, ==, 15); const void *const body = mcd_rpc_op_msg_section_get_body(rpc, 0u); ASSERT(body); bson_t bson; ASSERT(bson_init_static(&bson, body, (size_t)section_len)); ASSERT_MATCH(&bson, "{'kind': 0}"); } // Section 1. { ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 1u), ==, 1u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 1u); ASSERT_CMPINT32(section_len, ==, 26); ASSERT_CMPSTR(mcd_rpc_op_msg_section_get_identifier(rpc, 1u), "single"); const void *const sequence = mcd_rpc_op_msg_section_get_document_sequence(rpc, 1u); ASSERT(sequence); ASSERT_CMPSIZE_T(mcd_rpc_op_msg_section_get_document_sequence_length(rpc, 1u), ==, 15u); const int32_t bson_len = mlib_read_i32le(sequence); ASSERT_CMPINT32(bson_len, ==, 15); bson_t bson; ASSERT(bson_init_static(&bson, sequence, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'kind': 1}"); } if (with_checksum) { const uint32_t *checksum = mcd_rpc_op_msg_get_checksum(rpc); ASSERT(checksum); ASSERT_CMPUINT32(*checksum, ==, 287454020u); } else { ASSERT(!mcd_rpc_op_msg_get_checksum(rpc)); } mcd_rpc_message_destroy(rpc); } static void test_rpc_message_from_data_op_msg_valid_kind_1_single(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_SINGLE}; _test_rpc_message_from_data_op_msg_valid(data, sizeof(data), _test_rpc_message_from_data_op_msg_valid_kind_1_single); } static void _test_rpc_message_from_data_op_msg_valid_kind_1_multiple(const uint8_t *data, size_t data_len, bool with_checksum) { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_MSG); if (with_checksum) { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT); } else { ASSERT_CMPUINT32(mcd_rpc_op_msg_get_flag_bits(rpc), ==, MONGOC_OP_MSG_FLAG_NONE); } ASSERT_CMPSIZE_T(mcd_rpc_op_msg_get_sections_count(rpc), ==, 3u); // Section 0. { ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 0u), ==, 0u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 0u); ASSERT_CMPINT32(section_len, ==, 15); const void *const body = mcd_rpc_op_msg_section_get_body(rpc, 0u); ASSERT(body); bson_t bson; ASSERT(bson_init_static(&bson, body, (size_t)section_len)); ASSERT_MATCH(&bson, "{'kind': 0}"); } // Section 1. { ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 1u), ==, 1u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 1u); ASSERT_CMPINT32(section_len, ==, 25); ASSERT_CMPSTR(mcd_rpc_op_msg_section_get_identifier(rpc, 1u), "first"); const void *const sequence = mcd_rpc_op_msg_section_get_document_sequence(rpc, 1u); ASSERT(sequence); const int32_t bson_len = mlib_read_i32le(sequence); ASSERT_CMPINT32(bson_len, ==, 15); bson_t bson; ASSERT(bson_init_static(&bson, sequence, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'kind': 1}"); } // Section 2. { ASSERT_CMPUINT(mcd_rpc_op_msg_section_get_kind(rpc, 2u), ==, 1u); const int32_t section_len = mcd_rpc_op_msg_section_get_length(rpc, 2u); ASSERT_CMPINT32(section_len, ==, 43); ASSERT_CMPSTR(mcd_rpc_op_msg_section_get_identifier(rpc, 2u), "second"); const uint8_t *const sequence = mcd_rpc_op_msg_section_get_document_sequence(rpc, 2u); ASSERT(sequence); // BSON objects, index 0. { const uint8_t *const doc_0 = sequence; const int32_t bson_len = mlib_read_i32le(doc_0); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_0, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 0}"); bson_destroy(&bson); } // BSON objects, index 1. { const uint8_t *const doc_1 = sequence + 16; const int32_t bson_len = mlib_read_i32le(doc_1); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_1, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 1}"); bson_destroy(&bson); } } if (with_checksum) { const uint32_t *checksum = mcd_rpc_op_msg_get_checksum(rpc); ASSERT(checksum); ASSERT_CMPUINT32(*checksum, ==, 287454020u); } else { ASSERT(!mcd_rpc_op_msg_get_checksum(rpc)); } mcd_rpc_message_destroy(rpc); } static void test_rpc_message_from_data_op_msg_valid_kind_1_multiple(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_MULTIPLE}; _test_rpc_message_from_data_op_msg_valid( data, sizeof(data), _test_rpc_message_from_data_op_msg_valid_kind_1_multiple); } static void test_rpc_message_from_data_op_msg_valid(void) { test_rpc_message_from_data_op_msg_valid_kind_0(); test_rpc_message_from_data_op_msg_valid_kind_1_single(); test_rpc_message_from_data_op_msg_valid_kind_1_multiple(); } static void test_rpc_message_from_data_op_reply_valid(void) { uint8_t data[] = {TEST_DATA_OP_REPLY}; const size_t data_len = sizeof(data); { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_REPLY); ASSERT_CMPINT32(mcd_rpc_op_reply_get_response_flags(rpc), ==, MONGOC_OP_REPLY_RESPONSE_FLAG_NONE); ASSERT_CMPINT64(mcd_rpc_op_reply_get_cursor_id(rpc), ==, 1234605616436508552); ASSERT_CMPINT32(mcd_rpc_op_reply_get_starting_from(rpc), ==, 0); ASSERT_CMPINT32(mcd_rpc_op_reply_get_number_returned(rpc), ==, 2); const uint8_t *const documents = mcd_rpc_op_reply_get_documents(rpc); ASSERT_CMPSIZE_T((size_t)(documents - data), ==, 36u); ASSERT_CMPSIZE_T(mcd_rpc_op_reply_get_documents_len(rpc), ==, 32u); // Documents, index 0. { const uint8_t *const doc_0 = documents; const int32_t bson_len = mlib_read_i32le(doc_0); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_0, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 0}"); bson_destroy(&bson); } // Documents, index 1. { const uint8_t *const doc_1 = documents + 16; const int32_t bson_len = mlib_read_i32le(doc_1); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_1, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 1}"); bson_destroy(&bson); } mcd_rpc_message_destroy(rpc); } // Test that responseFlags is being parsed correctly. { data[16] = MONGOC_OP_REPLY_RESPONSE_FLAG_CURSOR_NOT_FOUND; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_reply_get_response_flags(rpc), ==, MONGOC_OP_REPLY_RESPONSE_FLAG_CURSOR_NOT_FOUND); mcd_rpc_message_destroy(rpc); data[16] = MONGOC_OP_REPLY_RESPONSE_FLAG_NONE; } // Test that startingFrom is being parsed correctly. { data[28] = 1u; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_reply_get_starting_from(rpc), ==, 1); mcd_rpc_message_destroy(rpc); data[28] = 0u; } // Test that documents are being parsed correctly. { data[0] = (uint8_t)(data[0] - 32u); // Exclude documents. data[32] = 0x00u; // Set numberReturned to 0. { mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_reply_get_number_returned(rpc), ==, 0); ASSERT_CMPSIZE_T(mcd_rpc_op_reply_get_documents_len(rpc), ==, 0u); ASSERT(mcd_rpc_op_reply_get_documents(rpc) == NULL); mcd_rpc_message_destroy(rpc); } data[32] = 0x02u; // Revert numberReturned to 2. data[0] = (uint8_t)(data[0] + 32u); // Restore documents. } } static void test_rpc_message_from_data_op_update_valid(void) { uint8_t data[] = {TEST_DATA_OP_UPDATE}; const size_t data_len = sizeof(data); { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_UPDATE); ASSERT_CMPSTR(mcd_rpc_op_update_get_full_collection_name(rpc), "db.coll"); ASSERT_CMPINT32(mcd_rpc_op_update_get_flags(rpc), ==, MONGOC_OP_UPDATE_FLAG_NONE); { const uint8_t *const selector = mcd_rpc_op_update_get_selector(rpc); ASSERT_CMPSIZE_T((size_t)(selector - data), ==, 32u); const int32_t selector_len = mlib_read_i32le(selector); ASSERT_CMPINT32(selector_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, selector, (size_t)selector_len)); ASSERT_MATCH(&bson, "{'selector': false}"); bson_destroy(&bson); } { const uint8_t *const update = mcd_rpc_op_update_get_update(rpc); ASSERT_CMPSIZE_T((size_t)(update - data), ==, 48u); const int32_t update_len = mlib_read_i32le(update); ASSERT_CMPINT32(update_len, ==, 14); bson_t bson; ASSERT(bson_init_static(&bson, update, (size_t)update_len)); ASSERT_MATCH(&bson, "{'update': true}"); bson_destroy(&bson); } mcd_rpc_message_destroy(rpc); } // Test that flags is being parsed correctly. { data[28] = MONGOC_OP_UPDATE_FLAG_UPSERT; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_update_get_flags(rpc), ==, MONGOC_OP_UPDATE_FLAG_UPSERT); mcd_rpc_message_destroy(rpc); data[28] = MONGOC_OP_UPDATE_FLAG_NONE; } } static void test_rpc_message_from_data_op_insert_valid(void) { uint8_t data[] = {TEST_DATA_OP_INSERT}; const size_t data_len = sizeof(data); { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_INSERT); ASSERT_CMPINT32(mcd_rpc_op_insert_get_flags(rpc), ==, MONGOC_OP_INSERT_FLAG_NONE); ASSERT_CMPSTR(mcd_rpc_op_insert_get_full_collection_name(rpc), "db.coll"); const uint8_t *const documents = mcd_rpc_op_insert_get_documents(rpc); ASSERT(documents); ASSERT_CMPSIZE_T(mcd_rpc_op_insert_get_documents_len(rpc), ==, 32u); // Documents, index 0. { const uint8_t *const doc_0 = documents; const int32_t bson_len = mlib_read_i32le(doc_0); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_0, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 0}"); bson_destroy(&bson); } // Documents, index 1. { const uint8_t *const doc_1 = documents + 16; const int32_t bson_len = mlib_read_i32le(doc_1); ASSERT_CMPINT32(bson_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, doc_1, (size_t)bson_len)); ASSERT_MATCH(&bson, "{'index': 1}"); bson_destroy(&bson); } mcd_rpc_message_destroy(rpc); } // Test that flags is being parsed correctly. { data[16] = MONGOC_OP_INSERT_FLAG_CONTINUE_ON_ERROR; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_insert_get_flags(rpc), ==, MONGOC_OP_INSERT_FLAG_CONTINUE_ON_ERROR); mcd_rpc_message_destroy(rpc); data[16] = MONGOC_OP_INSERT_FLAG_NONE; } // Test that documents are being parsed correctly. { data[0] = (uint8_t)(data[0] - 16u); // Exclude document 1. { mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPSIZE_T(mcd_rpc_op_insert_get_documents_len(rpc), ==, 16u); mcd_rpc_message_destroy(rpc); } data[0] = (uint8_t)(data[0] + 16u); // Restore document 1. } } static void test_rpc_message_from_data_op_query_valid(void) { uint8_t data[] = {TEST_DATA_OP_QUERY}; const size_t data_len = sizeof(data); { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_QUERY); ASSERT_CMPINT32(mcd_rpc_op_query_get_flags(rpc), ==, MONGOC_OP_QUERY_FLAG_NONE); ASSERT_CMPSTR(mcd_rpc_op_query_get_full_collection_name(rpc), "db.coll"); ASSERT_CMPINT32(mcd_rpc_op_query_get_number_to_skip(rpc), ==, 0); ASSERT_CMPINT32(mcd_rpc_op_query_get_number_to_return(rpc), ==, 0); { const uint8_t *const query = mcd_rpc_op_query_get_query(rpc); ASSERT_CMPSIZE_T((size_t)(query - data), ==, 36u); const int32_t query_len = mlib_read_i32le(query); ASSERT_CMPINT32(query_len, ==, 13); bson_t bson; ASSERT(bson_init_static(&bson, query, (size_t)query_len)); ASSERT_MATCH(&bson, "{'query': false}"); bson_destroy(&bson); } { const uint8_t *const selector = mcd_rpc_op_query_get_return_fields_selector(rpc); ASSERT_CMPSIZE_T((size_t)(selector - data), ==, 49u); const int32_t selector_len = mlib_read_i32le(selector); ASSERT_CMPINT32(selector_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, selector, (size_t)selector_len)); ASSERT_MATCH(&bson, "{'selector': true}"); bson_destroy(&bson); } mcd_rpc_message_destroy(rpc); } // Test that flags is being parsed correctly. { data[16] = MONGOC_OP_QUERY_FLAG_TAILABLE_CURSOR; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_query_get_flags(rpc), ==, MONGOC_OP_QUERY_FLAG_TAILABLE_CURSOR); mcd_rpc_message_destroy(rpc); data[16] = MONGOC_OP_QUERY_FLAG_NONE; } // Test that numberToSkip is being parsed correctly. { data[28] = 1; // Set numberToSkip to 1. mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_query_get_number_to_skip(rpc), ==, 1); mcd_rpc_message_destroy(rpc); data[28] = 0; // Restore numberToSkip. } // Test that numberToReturn is being parsed correctly. { data[32] = 1; // Set numberToReturn to 1. mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_query_get_number_to_return(rpc), ==, 1); mcd_rpc_message_destroy(rpc); data[32] = 0; // Restore numberToReturn. } // Test that returnFieldSelector is optional. { data[0] = (uint8_t)(data[0] - 16u); // Omit returnFieldSelector. mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT(!mcd_rpc_op_query_get_return_fields_selector(rpc)); mcd_rpc_message_destroy(rpc); data[0] = (uint8_t)(data[0] + 16u); // Restore returnFieldSelector. } } static void test_rpc_message_from_data_op_get_more_valid(void) { uint8_t data[] = {TEST_DATA_OP_GET_MORE}; const size_t data_len = sizeof(data); // Valid test input data. { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_GET_MORE); ASSERT_CMPSTR(mcd_rpc_op_get_more_get_full_collection_name(rpc), "db.coll"); ASSERT_CMPINT32(mcd_rpc_op_get_more_get_number_to_return(rpc), ==, 0); ASSERT_CMPINT64(mcd_rpc_op_get_more_get_cursor_id(rpc), ==, 1234605616436508552); mcd_rpc_message_destroy(rpc); } } static void test_rpc_message_from_data_op_delete_valid(void) { uint8_t data[] = {TEST_DATA_OP_DELETE}; const size_t data_len = sizeof(data); // Valid test input data. { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_DELETE); ASSERT_CMPSTR(mcd_rpc_op_delete_get_full_collection_name(rpc), "db.coll"); ASSERT_CMPINT32(mcd_rpc_op_delete_get_flags(rpc), ==, MONGOC_OP_DELETE_FLAG_NONE); { const uint8_t *const selector = mcd_rpc_op_delete_get_selector(rpc); ASSERT_CMPSIZE_T((size_t)(selector - data), ==, 32u); const int32_t selector_len = mlib_read_i32le(selector); ASSERT_CMPINT32(selector_len, ==, 16); bson_t bson; ASSERT(bson_init_static(&bson, selector, (size_t)selector_len)); ASSERT_MATCH(&bson, "{'selector': false}"); bson_destroy(&bson); } mcd_rpc_message_destroy(rpc); } } static void test_rpc_message_from_data_op_kill_cursors_valid(void) { uint8_t data[] = {TEST_DATA_OP_KILL_CURSORS}; const size_t data_len = sizeof(data); // Valid test input data. { const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(rpc, data, data_end, data_len); ASSERT(mlib_in_range(int32_t, data_len)); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, (int32_t)data_len); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 16909060); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 84281096); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_KILL_CURSORS); ASSERT_CMPINT32(mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(rpc), ==, 2); const int64_t *const cursor_ids = mcd_rpc_op_kill_cursors_get_cursor_ids(rpc); ASSERT_CMPINT64(cursor_ids[0], ==, 1230066625199609624); ASSERT_CMPINT64(cursor_ids[1], ==, 2387509390608836392); mcd_rpc_message_destroy(rpc); } // Test that cursorIDs is being parsed correctly. { data[0] = (uint8_t)(data[0] - 8u); // Truncate cursorID 1. data[20] = (uint8_t)(data[20] - 1u); // Set numberOfCursorIds to 1. mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(rpc), ==, 1); ASSERT_CMPINT64(mcd_rpc_op_kill_cursors_get_cursor_ids(rpc)[0], ==, 1230066625199609624); mcd_rpc_message_destroy(rpc); data[20] = (uint8_t)(data[20] + 1u); // Restore numberOfCursorIds. data[0] = (uint8_t)(data[0] + 8u); // Restore cursorID 1. } // Test that cursorIDs is being parsed correctly. { data[0] = (uint8_t)(data[0] - 16u); // Exclude cursorIDs. data[20] = (uint8_t)(data[20] - 2u); // Set numberOfCursorIds to 0. mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, NULL); ASSERT(rpc); ASSERT_CMPINT32(mcd_rpc_op_kill_cursors_get_number_of_cursor_ids(rpc), ==, 0); ASSERT(mcd_rpc_op_kill_cursors_get_cursor_ids(rpc) == NULL); mcd_rpc_message_destroy(rpc); data[20] = (uint8_t)(data[20] + 2u); // Restore numberOfCursorIds. data[0] = (uint8_t)(data[0] + 16u); // Restore cursorID 1. } } static void _test_from_data_invalid_decr(const char *file, int line, uint8_t *data, size_t data_len, bool expect_success, size_t min, size_t max, size_t bytes_parsed_expected) { ASSERT_WITH_MSG(min <= max, "%s:%d: min (%zu) should be less than or equal to max (%zu)", file, line, min, max); ASSERT_WITH_MSG(max < data_len, "%s:%d: max byte %zu exceeds input data length %zu", file, line, max, data_len); for (size_t i = min; i <= max; ++i) { data[i] = (uint8_t)(data[i] - 1u); // Set to original value - 1. { const void *data_end = NULL; mcd_rpc_message *rpc = mcd_rpc_message_from_data(data, data_len, &data_end); if (expect_success) { ASSERT_WITH_MSG(rpc, "%s:%d: byte %zu: expected decrement to still succeed", file, line, i); } else { ASSERT_WITH_MSG(!rpc, "%s:%d: byte %zu: expected decrement to trigger failure", file, line, i); } const size_t bytes_parsed_actual = (size_t)((const uint8_t *)data_end - data); ASSERT_WITH_MSG(bytes_parsed_expected == bytes_parsed_actual, "%s:%d: byte %zu: expected decrement to cause " "%zu bytes to be parsed, but parsed %zu bytes", file, line, i, bytes_parsed_expected, bytes_parsed_actual); mcd_rpc_message_destroy(rpc); } data[i] = (uint8_t)(data[i] + 1u); // Revert to original value. } } static void _test_from_data_invalid_incr(const char *file, int line, uint8_t *data, size_t data_len, bool expect_success, size_t min, size_t max, size_t bytes_parsed_expected) { ASSERT_WITH_MSG(max < data_len, "%s:%d: max byte %zu exceeds input data length %zu", file, line, max, data_len); for (size_t i = min; i <= max; ++i) { data[i] = (uint8_t)(data[i] + 1u); // Set to original value + 1. { const void *data_end = NULL; mcd_rpc_message *rpc = mcd_rpc_message_from_data(data, data_len, &data_end); if (expect_success) { ASSERT_WITH_MSG(rpc, "%s:%d: byte %zu: expected increment to still succeed", file, line, i); } else { ASSERT_WITH_MSG(!rpc, "%s:%d: byte %zu: expected increment to trigger failure", file, line, i); } const size_t bytes_parsed_actual = (size_t)((const uint8_t *)data_end - data); ASSERT_WITH_MSG(bytes_parsed_expected == bytes_parsed_actual, "%s:%d: byte %zu: expected increment to cause " "%zu bytes to be parsed, but parsed %zu bytes", file, line, i, bytes_parsed_expected, bytes_parsed_actual); mcd_rpc_message_destroy(rpc); } data[i] = (uint8_t)(data[i] - 1u); // Revert to original value. } } static void _test_from_data_input_bounds(const uint8_t *data, size_t data_len) { ASSERT_WITH_MSG(data[data_len] == 0xFF && data[data_len + 1u] == 0x00, "expected input data to have extra bytes available for " "boundary testing"); // Reducing data length below messageLength should always trigger failure due // to insufficient bytes. for (size_t i = 0u; i < data_len; ++i) { const void *data_end = NULL; ASSERT_WITH_MSG(!mcd_rpc_message_from_data(data, i, &data_end), "expected reduced data length of %zu to trigger " "failure, but successfully parsed %zu bytes", i, (size_t)((const uint8_t *)data_end - data)); } // It is NOT an error for data length to be greater than messageLength. { const void *data_end = NULL; mcd_rpc_message *rpc = mcd_rpc_message_from_data(data, data_len + 1u, &data_end); ASSERT_CMPSIZE_T((size_t)((const uint8_t *)data_end - data), ==, data_len); ASSERT_WITH_MSG(rpc, "expected extra bytes to remain unparsed"); ASSERT_CMPUINT(*(const uint8_t *)data_end, ==, 0xFF); mcd_rpc_message_destroy(rpc); } } #define EXPECT_DECR_FAILURE(min, max, end) \ _test_from_data_invalid_decr(__FILE__, __LINE__, data, data_len, false, min, max, end) #define EXPECT_DECR_SUCCESS(min, max, end) \ _test_from_data_invalid_decr(__FILE__, __LINE__, data, data_len, true, min, max, end) #define EXPECT_INCR_FAILURE(min, max, end) \ _test_from_data_invalid_incr(__FILE__, __LINE__, data, data_len, false, min, max, end) #define EXPECT_INCR_SUCCESS(min, max, end) \ _test_from_data_invalid_incr(__FILE__, __LINE__, data, data_len, true, min, max, end) #define EXPECT_DECR_IGNORED(min, max, end) #define EXPECT_INCR_IGNORED(min, max, end) static void test_rpc_message_from_data_op_compressed_invalid(void) { uint8_t data[] = {TEST_DATA_OP_COMPRESSED, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_SUCCESS ( 0u, 0u, 44u); // messageLength (byte 0). EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): too large. EXPECT_DECR_SUCCESS ( 4u, 11u, 45u); // requestID, responseTo. EXPECT_DECR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_DECR_SUCCESS (16u, 42u, 45u); // originalOpcode, uncompressedSize, compressorId, compressedMessage. EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: too large. EXPECT_INCR_SUCCESS ( 4u, 11u, 45u); // requestId, responseTo. EXPECT_INCR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_MSG. EXPECT_INCR_FAILURE (13u, 15u, 12u); // opCode (byte 1-3): invalid. EXPECT_INCR_SUCCESS (16u, 42u, 45u); // originalOpcode, uncompressedSize, compressorId, compressedMessage. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_msg_invalid_kind_0(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_0, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 36u); // messageLength (byte 0): insufficient bytes to parse checksum. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_COMPRESSED. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_DECR_FAILURE (16u, 16u, 36u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_NONE -> unexpected bytes remaining. EXPECT_DECR_FAILURE (17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_DECR_SUCCESS (18u, 19u, 40u); // flagBits (bytes 2-3). EXPECT_DECR_FAILURE (20u, 20u, 20u); // Section 0 kind: invalid. EXPECT_DECR_FAILURE (21u, 21u, 35u); // Section 0 body length (byte 0): truncated body content -> invalid section 1 with duplicate kind 0. EXPECT_DECR_FAILURE (22u, 24u, 21u); // Section 0 body length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (25u, 35u, 40u); // Section 0 body content. EXPECT_DECR_SUCCESS (36u, 39u, 40u); // Checksum. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_INCR_FAILURE (16u, 16u, 36u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_MORE_TO_COME -> unexpected bytes remaining. EXPECT_INCR_FAILURE (17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_INCR_FAILURE (12u, 15u, 12u); // opCode: invalid opCode. EXPECT_INCR_SUCCESS (18u, 19u, 40u); // flagBits (bytes 2-3). EXPECT_INCR_FAILURE (20u, 20u, 31u); // Section 0 kind: parse as document sequence -> invalid document 0 length (0x00000000). EXPECT_INCR_FAILURE (21u, 21u, 37u); // Section 0 body length (byte 0): extended body content -> insufficient bytes to parse checksum. EXPECT_INCR_FAILURE (22u, 24u, 21u); // Section 0 body length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (25u, 35u, 40u); // Section 0 body content. EXPECT_INCR_SUCCESS (36u, 39u, 40u); // Checksum. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_msg_invalid_kind_1_single(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_SINGLE, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 63u); // messageLength (byte 0): insufficient bytes to parse checksum. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 67u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_COMPRESSED. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid opCode. EXPECT_DECR_FAILURE (16u, 16u, 63u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_NONE -> unexpected bytes remaining. EXPECT_DECR_FAILURE (17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_DECR_SUCCESS (18u, 19u, 67u); // flagBits (bytes 2-3). EXPECT_DECR_FAILURE (20u, 20u, 20u); // Section 0 kind: invalid. EXPECT_DECR_FAILURE (21u, 21u, 35u); // Section 0 length (byte 0): truncated body content -> invalid section 1 with duplicate kind 0. EXPECT_DECR_FAILURE (22u, 24u, 21u); // Section 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (25u, 35u, 67u); // Section 0 body. EXPECT_DECR_FAILURE (36u, 36u, 36u); // Section 1 kind: parse as body -> invalid section 1 with duplicate kind 0. EXPECT_DECR_FAILURE (37u, 37u, 48u); // Section 1 length (byte 0): truncated document sequence content -> invalid document 0 length (15 bytes, 14 remaining). EXPECT_DECR_FAILURE (38u, 40u, 37u); // Section 1 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (41u, 46u, 67u); // Section 1 identifier (content). EXPECT_DECR_FAILURE (47u, 47u, 50u); // Section 1 identifier (terminator): extended identifier -> invalid document 0 length (0x6b100000). EXPECT_DECR_FAILURE (48u, 48u, 62u); // Section 1 document 0 length (byte 0): truncated document 0 content -> unexpected section bytes remaining. EXPECT_DECR_FAILURE (49u, 51u, 48u); // Section 1 document 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (52u, 62u, 67u); // Section 1 document 0 content. EXPECT_DECR_SUCCESS (63u, 66u, 67u); // Checksum. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 67u); // requestID, responseTo. EXPECT_INCR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_INCR_FAILURE (16u, 16u, 63u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_MORE_TO_COME -> unexpected bytes remaining. EXPECT_INCR_FAILURE (17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_INCR_SUCCESS (18u, 19u, 67u); // flagBits (bytes 2-3). EXPECT_INCR_FAILURE (20u, 20u, 31u); // Section 0 kind: parse as document sequence -> invalid document 0 length (0x6b100000). EXPECT_INCR_FAILURE (21u, 21u, 37u); // Section 0 length (byte 0): extended body content -> invalid section 1 kind (0x1a). EXPECT_INCR_FAILURE (22u, 24u, 21u); // Section 0 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (25u, 35u, 67u); // Section 0 body. EXPECT_INCR_FAILURE (36u, 36u, 36u); // Section 1 kind: invalid. EXPECT_INCR_FAILURE (37u, 37u, 63u); // Section 1 length (byte 0): extended document sequence content -> insufficient bytes to parse checksum. EXPECT_INCR_FAILURE (38u, 40u, 37u); // Section 1 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (41u, 46u, 67u); // Section 1 identifier (content). EXPECT_INCR_FAILURE (47u, 47u, 50u); // Section 1 identifier (terminator): invalid document 0 length (0x6b100000). EXPECT_INCR_FAILURE (48u, 51u, 48u); // Section 1 document 0 length: invalid. EXPECT_DECR_SUCCESS (52u, 62u, 67u); // Section 1 document 0 content. EXPECT_INCR_SUCCESS (63u, 66u, 67u); // Checksum. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_msg_invalid_kind_1_multiple(void) { uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_MULTIPLE, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 106u); // messageLength (byte 0): insufficient bytes to parse checksum. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 110u); // requestID, responseTo. EXPECT_DECR_IGNORED ( 12u, 12u, 12u); // opCode (byte 0): parse as OP_COMPRESSED. EXPECT_DECR_FAILURE ( 13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_DECR_FAILURE ( 16u, 16u, 106u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_NONE -> unexpected bytes remaining. EXPECT_DECR_FAILURE ( 17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_DECR_SUCCESS ( 18u, 19u, 110u); // flagBits (bytes 2-3). EXPECT_DECR_FAILURE ( 20u, 20u, 20u); // Section 0 kind: invalid. EXPECT_DECR_FAILURE ( 21u, 21u, 35u); // Section 0 length (byte 0): truncated body content -> invalid section 1 with duplicate kind 0. EXPECT_DECR_FAILURE ( 22u, 24u, 21u); // Section 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 25u, 35u, 110u); // Section 0 body. EXPECT_DECR_FAILURE ( 36u, 36u, 36u); // Section 1 kind: invalid section 1 with duplicate kind 0. EXPECT_DECR_FAILURE ( 37u, 37u, 47u); // Section 1 length (byte 0): truncated document sequence content -> invalid document 2 length (15 bytes, 14 remaining). EXPECT_DECR_FAILURE ( 38u, 40u, 37u); // Section 1 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 41u, 45u, 110u); // Section 1 identifier (content). EXPECT_DECR_FAILURE ( 46u, 46u, 49u); // Section 1 identifier (terminator): extended identifier -> invalid document 0 length (0x6b100000). EXPECT_DECR_FAILURE ( 47u, 47u, 61u); // Section 1 document 0 length (byte 0): truncated document 0 content -> invalid section 2 with duplicate kind 0. EXPECT_DECR_FAILURE ( 48u, 50u, 47u); // Section 1 document 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 51u, 61u, 110u); // Section 1 document 0 content. EXPECT_DECR_FAILURE ( 62u, 62u, 62u); // Section 2 kind: invalid section 2 with duplicate kind 0. EXPECT_DECR_FAILURE ( 63u, 63u, 90u); // Section 2 length (byte 0): truncated document sequence -> invalid document 1 length (16 bytes, 15 remaining). EXPECT_DECR_FAILURE ( 64u, 66u, 63u); // Section 2 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 67u, 72u, 110u); // Section 2 identifier (content). EXPECT_DECR_FAILURE ( 73u, 73u, 76u); // Section 2 identifier (terminator): extended identifier -> invalid document 0 length (0x69100000). EXPECT_DECR_FAILURE ( 74u, 74u, 89u); // Section 2 document 0 length (byte 0): truncated document 0 content -> invalid document 1 length (0x00001000). EXPECT_DECR_FAILURE ( 75u, 77u, 74u); // Section 2 document 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 78u, 89u, 110u); // Section 2 document 0 content. EXPECT_DECR_FAILURE ( 90u, 90u, 105u); // Section 2 document 1 length (byte 0): truncated document 1 content -> unexpected section bytes remaining. EXPECT_DECR_FAILURE ( 91u, 93u, 90u); // Section 2 document 1 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 94u, 105u, 110u); // Section 2 document 1 content. EXPECT_DECR_SUCCESS (106u, 109u, 110u); // Checksum. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 110u); // requestID, responseTo. EXPECT_INCR_FAILURE ( 12u, 15u, 12u); // opCode: invalid. EXPECT_INCR_FAILURE ( 16u, 16u, 106u); // flagBits (byte 0): set to MONGOC_OP_MSG_FLAG_MORE_TO_COME -> unexpected bytes remaining. EXPECT_INCR_FAILURE ( 17u, 17u, 16u); // flagBits (byte 1): invalid. EXPECT_INCR_SUCCESS ( 18u, 19u, 110u); // flagBits (bytes 2-3). EXPECT_INCR_FAILURE ( 20u, 20u, 31u); // Section 0 kind: parse as document sequence -> invalid document 0 length (0x00000000). EXPECT_INCR_FAILURE ( 21u, 21u, 37u); // Section 0 length (byte 0): extended body content -> invalid section 1 kind (0x19). EXPECT_INCR_FAILURE ( 22u, 24u, 21u); // Section 0 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS ( 25u, 35u, 110u); // Section 0 body. EXPECT_INCR_FAILURE ( 36u, 36u, 36u); // Section 1 kind: invalid. EXPECT_INCR_FAILURE ( 37u, 37u, 62u); // Section 1 length (byte 0): extended document sequence content -> unexpected section bytes remaining. EXPECT_INCR_FAILURE ( 38u, 40u, 37u); // Section 1 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS ( 41u, 45u, 110u); // Section 1 identifier (content). EXPECT_INCR_FAILURE ( 46u, 46u, 49u); // Section 1 identifier (terminator): extended identifier -> invalid document 0 length (0x6b000000). EXPECT_INCR_FAILURE ( 47u, 50u, 47u); // Section 1 document 0 length: invalid. EXPECT_INCR_SUCCESS ( 51u, 61u, 110u); // Section 1 document 0 content. EXPECT_INCR_FAILURE ( 62u, 62u, 62u); // Section 2 kind: invalid. EXPECT_INCR_FAILURE ( 63u, 63u, 106u); // Section 2 length (byte 0): extended document sequence content -> unexpected section bytes remaining. EXPECT_INCR_FAILURE ( 64u, 66u, 63u); // Section 2 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS ( 67u, 72u, 110u); // Section 2 identifier (content). EXPECT_INCR_FAILURE ( 73u, 73u, 76u); // Section 2 identifier (terminator): extended identifier -> invalid document 0 length (0x69100000). EXPECT_INCR_FAILURE ( 74u, 74u, 91u); // Section 2 document 0 length (byte 0): extended document 0 content -> invalid document 1 length (0x10000000). EXPECT_INCR_FAILURE ( 75u, 77u, 74u); // Section 2 document 0 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS ( 78u, 89u, 110u); // Section 2 document 0 content. EXPECT_INCR_FAILURE ( 90u, 93u, 90u); // Section 2 document 1 length: invalid. EXPECT_INCR_SUCCESS ( 94u, 105u, 110u); // Section 2 document 1 content. EXPECT_INCR_SUCCESS (106u, 109u, 110u); // Checksum. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_msg_invalid(void) { test_rpc_message_from_data_op_msg_invalid_kind_0(); test_rpc_message_from_data_op_msg_invalid_kind_1_single(); test_rpc_message_from_data_op_msg_invalid_kind_1_multiple(); } static void test_rpc_message_from_data_op_reply_invalid(void) { uint8_t data[] = {TEST_DATA_OP_REPLY, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 52u); // messageLength (byte 0): truncated document 1 content -> invalid document 1 length (16 bytes, 15 remaining). EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 68u); // requestID, responseTo. EXPECT_DECR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_DECR_SUCCESS (16u, 31u, 68u); // responseFlags, cursorID, startingFrom. EXPECT_DECR_FAILURE (32u, 32u, 52u); // numberReturned (byte 0): set to 1 -> unexpected bytes remaining. EXPECT_DECR_FAILURE (33u, 34u, 68u); // numberReturned (bytes 1-2): insufficient bytes to parse document 2. EXPECT_DECR_FAILURE (35u, 35u, 32u); // numberReturned (bytes 3): invalid. EXPECT_DECR_FAILURE (36u, 36u, 51u); // Document 0 length (byte 0): truncated document 0 content -> invalid document 1 length (0x00001000). EXPECT_DECR_FAILURE (37u, 39u, 36u); // Document 0 length (bytes 1-3): invalid length. EXPECT_DECR_SUCCESS (40u, 51u, 68u); // Document 0 content. EXPECT_DECR_FAILURE (52u, 52u, 67u); // Document 1 length (byte 0): truncated document 1 content -> unexpected bytes remaining. EXPECT_DECR_FAILURE (53u, 55u, 52u); // Document 1 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (56u, 67u, 68u); // Document 1 content. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 68u); // requestID, responseTo. EXPECT_INCR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_INCR_SUCCESS (16u, 31u, 68u); // responseFlags, cursorID, startingFrom. EXPECT_INCR_FAILURE (32u, 35u, 68u); // numberReturned: insufficient bytes to parse document 2. EXPECT_INCR_FAILURE (36u, 36u, 53u); // Document 0 length (byte 0): extended document 0 content -> invalid document 1 length (0x10000000). EXPECT_INCR_FAILURE (37u, 39u, 36u); // Document 0 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (40u, 51u, 68u); // Document 0 content. EXPECT_INCR_FAILURE (52u, 55u, 52u); // Document 1 length: invalid. EXPECT_INCR_SUCCESS (56u, 67u, 68u); // Document 1 content. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_update_invalid(void) { uint8_t data[] = {TEST_DATA_OP_UPDATE, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 48u); // messageLength (byte 0): truncated update document content -> invalid update document length (14 bytes, 13 remaining). EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 62u); // requestID, responseTo. EXPECT_DECR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_DECR_SUCCESS (20u, 26u, 62u); // fullCollectionName (content). EXPECT_DECR_FAILURE (27u, 27u, 29u); // fullCollectionName (terminator): extended fullCollectionName -> invalid flags (0x10000000). EXPECT_DECR_FAILURE (28u, 31u, 28u); // flags: invalid. EXPECT_DECR_FAILURE (32u, 32u, 47u); // selector document length (byte 0): truncated selector document content -> invalid update document length (0x00000e00). EXPECT_DECR_FAILURE (33u, 35u, 32u); // selector document length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (36u, 47u, 62u); // selector document content. EXPECT_DECR_FAILURE (48u, 48u, 61u); // update document length (byte 0): truncated update document content -> unexpected bytes remaining. EXPECT_DECR_FAILURE (49u, 51u, 48u); // update document length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (52u, 61u, 62u); // update document content. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 62u); // requestID, responseTo. EXPECT_INCR_IGNORED (12u, 12u, 12u); // opCode: parse as OP_INSERT. EXPECT_INCR_FAILURE (13u, 15u, 12u); // opCode: invalid. EXPECT_INCR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_INCR_SUCCESS (20u, 26u, 62u); // fullCollectionName (content). EXPECT_INCR_FAILURE (27u, 27u, 29u); // fullCollectionName (terminator): extended fullCollectionName -> invalid flags (0x10000000). EXPECT_INCR_SUCCESS (28u, 28u, 62u); // flags (byte 0): set to MONGOC_OP_UPDATE_FLAG_UPSERT. EXPECT_INCR_FAILURE (29u, 31u, 28u); // flags (bytes 1-3): invalid. EXPECT_INCR_FAILURE (32u, 32u, 49u); // selector document length (byte 0): extended selector document -> invalid update document length (0x08000000). EXPECT_INCR_FAILURE (33u, 35u, 32u); // selector document length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (36u, 47u, 62u); // selector document content. EXPECT_INCR_FAILURE (48u, 51u, 48u); // update document length: invalid length. EXPECT_INCR_SUCCESS (52u, 61u, 62u); // update document content. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_insert_invalid(void) { uint8_t data[] = {TEST_DATA_OP_INSERT, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 44u); // messageLength (byte 0): truncated document 1 content -> invalid document 1 length (16 bytes, 15 remaining). EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 60u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode: parse as OP_UPDATE. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode: invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // flags: invalid. EXPECT_DECR_SUCCESS (20u, 26u, 60u); // fullCollectionName (content). EXPECT_DECR_FAILURE (27u, 27u, 30u); // fullCollectionName (terminator): extended fullCollectionName -> invalid document 0 length (0x69100000). EXPECT_DECR_FAILURE (28u, 28u, 43u); // Document 0 length (byte 0): truncated document 0 content -> invalid document 1 length (0x00001000). EXPECT_DECR_FAILURE (29u, 31u, 28u); // Document 0 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (32u, 43u, 60u); // Document 0 content. EXPECT_DECR_FAILURE (44u, 44u, 59u); // Document 1 length (byte 0): truncated document 1 content -> unexpected bytes remaining. EXPECT_DECR_FAILURE (45u, 47u, 44u); // Document 1 length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (48u, 59u, 60u); // Document 1 content. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 60u); // requestID, responseTo. EXPECT_INCR_FAILURE (12u, 15u, 12u); // opCode: invalid opCode. EXPECT_INCR_SUCCESS (16u, 16u, 60u); // flags (byte 0): set to MONGOC_OP_INSERT_FLAG_CONTINUE_ON_ERROR. EXPECT_INCR_FAILURE (17u, 19u, 16u); // flags (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (20u, 26u, 60u); // fullCollectionName (content). EXPECT_INCR_FAILURE (27u, 27u, 30u); // fullCollectionName (terminator): extended fullCollectionName -> invalid document 0 length (0x69100000). EXPECT_INCR_FAILURE (28u, 28u, 45u); // Document 0 length (byte 0): extended document 0 content -> invalid document 1 length (0x10000000). EXPECT_INCR_FAILURE (29u, 31u, 28u); // Document 0 length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (32u, 43u, 60u); // Document 0 content. EXPECT_INCR_FAILURE (44u, 47u, 44u); // Document 1 length: invalid. EXPECT_INCR_SUCCESS (48u, 59u, 60u); // Document 1 content. // clang-format on _test_from_data_input_bounds(data, data_len); // Test that documents are parsed correctly. { data[0] = (uint8_t)(data[0] - 32u); // Exclude both documents. const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); const size_t parsed_len = (size_t)((const uint8_t *)data_end - data); const size_t expected_len = 28u; ASSERT_WITH_MSG(!rpc, "OP_INSERT requires at least one document"); ASSERT_WITH_MSG(parsed_len == expected_len, "expected %zu bytes to be parsed before error, but parsed %zu bytes", expected_len, parsed_len); mcd_rpc_message_destroy(rpc); data[0] = (uint8_t)(data[0] + 32u); // Restore documents. } } static void test_rpc_message_from_data_op_query_invalid(void) { uint8_t data[] = {TEST_DATA_OP_QUERY, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 49u); // messageLength (byte 0): truncated returnFieldsSelector document content -> invalid returnFieldsSelector document length (16 bytes, 15 remaining). EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 65u); // requestID, responseTo. EXPECT_DECR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // flags: invalid. EXPECT_DECR_SUCCESS (20u, 26u, 65u); // fullCollectionName (content). EXPECT_DECR_FAILURE (27u, 27u, 37u); // fullCollectionName (terminator): extended fullCollectionName -> invalid query document length (0x08000000). EXPECT_DECR_SUCCESS (28u, 35u, 65u); // numberToSkip, numberToReturn. EXPECT_DECR_FAILURE (36u, 36u, 48u); // query document length (byte 0): truncated query document content -> invalid returnFieldsSelector document length (0x00001000). EXPECT_DECR_FAILURE (37u, 39u, 36u); // query document length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (40u, 48u, 65u); // query document content. EXPECT_DECR_FAILURE (49u, 49u, 64u); // returnFieldsSelector document length (byte 0): truncated returnFieldsSelector document content -> unexpected bytes remaining. EXPECT_DECR_FAILURE (50u, 52u, 49u); // returnFieldsSelector document length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (53u, 64u, 65u); // returnFieldsSelector document content. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 65u); // requestID, responseTo. EXPECT_INCR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_GET_MORE. EXPECT_INCR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_INCR_FAILURE (16u, 19u, 16u); // flags (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (20u, 26u, 65u); // fullCollectionName (content). EXPECT_INCR_FAILURE (27u, 27u, 37u); // fullCollectionName (terminator): extended fullCollectionName -> invalid query document length (0x08000000). EXPECT_INCR_SUCCESS (28u, 35u, 65u); // numberToSkip, numberToReturn. EXPECT_INCR_FAILURE (36u, 36u, 50u); // query document length (byte 0): extended query document content -> invalid returnFieldsSelector document length (0x08000000). EXPECT_INCR_FAILURE (37u, 39u, 36u); // query document length (bytes 1-3): invalid. EXPECT_INCR_SUCCESS (40u, 48u, 65u); // query document content. EXPECT_INCR_FAILURE (49u, 52u, 49u); // returnFieldsSelector document length: invalid. EXPECT_INCR_SUCCESS (53u, 64u, 65u); // returnFieldsSelector document content. // clang-format on _test_from_data_input_bounds(data, data_len); // Test that the query document is parsed correctly. { data[0] = (uint8_t)(data[0] - 29u); // Exclude both query and // returnFieldsSelector documents. const void *data_end = NULL; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, data_len, &data_end); const size_t parsed_len = (size_t)((const uint8_t *)data_end - data); const size_t expected_len = 36u; ASSERT_WITH_MSG(!rpc, "OP_QUERY requires a query document"); ASSERT_WITH_MSG(parsed_len == expected_len, "expected %zu bytes to be parsed before error, but parsed %zu bytes", expected_len, parsed_len); mcd_rpc_message_destroy(rpc); data[0] = (uint8_t)(data[0] + 29u); // Restore both query and // returnFieldsSelector documents. } } static void test_rpc_message_from_data_op_get_more_invalid(void) { uint8_t data[] = {TEST_DATA_OP_GET_MORE, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 32u); // messageLength (byte 0): insufficient bytes to parse cursorID. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_QUERY. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_DECR_SUCCESS (20u, 26u, 40u); // fullCollectionName (content). EXPECT_DECR_FAILURE (27u, 27u, 33u); // fullCollectionName (terminator): extended fullCollectionName -> insufficient bytes to parse cursorID. EXPECT_DECR_SUCCESS (28u, 39u, 40u); // fullCollectionName, numberToReturn, cursorID. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_INCR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_DELETE. EXPECT_INCR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_INCR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_INCR_SUCCESS (20u, 26u, 40u); // fullCollectionName (content). EXPECT_INCR_FAILURE (27u, 27u, 33u); // fullCollectionName (terminator): extended fullCollectionName -> insufficient bytes to parse cursorID. EXPECT_INCR_SUCCESS (28u, 39u, 40u); // fullCollectionName, numberToReturn, cursorID. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_delete_invalid(void) { uint8_t data[] = {TEST_DATA_OP_DELETE, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 32u); // messageLength (byte 0): insufficient bytes to parse cursorID. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 48u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_GET_MORE. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_DECR_SUCCESS (20u, 26u, 48u); // fullCollectionName (content). EXPECT_DECR_FAILURE (27u, 27u, 29u); // fullCollectionName (terminator): extended fullCollectionName -> invalid flags (0x10000000). EXPECT_DECR_FAILURE (28u, 31u, 28u); // flags: invalid. EXPECT_DECR_FAILURE (32u, 32u, 47u); // selector document length (byte 0): truncated selector document content -> unexpected bytes remaining. EXPECT_DECR_FAILURE (33u, 35u, 32u); // selector document length (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (36u, 47u, 48u); // selector document content. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 48u); // requestID, responseTo. EXPECT_INCR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_KILL_CURSORS. EXPECT_INCR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_INCR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_INCR_SUCCESS (20u, 26u, 48u); // fullCollectionName (content). EXPECT_INCR_FAILURE (27u, 27u, 29u); // fullCollectionName (terminator): extended fullCollectionName -> invalid flags (0x10000000). EXPECT_INCR_SUCCESS (28u, 28u, 48u); // flags (byte 0): set to MONGOC_OP_DELETE_FLAG_SINGLE_REMOVE. EXPECT_INCR_FAILURE (29u, 31u, 28u); // flags (bytes 1-3): invalid. EXPECT_INCR_FAILURE (32u, 35u, 32u); // selector document length: invalid. EXPECT_INCR_SUCCESS (36u, 47u, 48u); // selector document content. // clang-format on _test_from_data_input_bounds(data, data_len); } static void test_rpc_message_from_data_op_kill_cursors_invalid(void) { uint8_t data[] = {TEST_DATA_OP_KILL_CURSORS, 0xFF, 0x00}; const size_t data_len = sizeof(data) - 2u; // Exclude the extra bytes. // clang-format off EXPECT_DECR_FAILURE ( 0u, 0u, 20u); // messageLength (byte 0): invalid numberOfCursorIds. EXPECT_DECR_FAILURE ( 1u, 3u, 0u); // messageLength (bytes 1-3): invalid. EXPECT_DECR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_DECR_IGNORED (12u, 12u, 12u); // opCode (byte 0): parse as OP_DELETE. EXPECT_DECR_FAILURE (13u, 15u, 12u); // opCode (bytes 1-3): invalid. EXPECT_DECR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_DECR_FAILURE (20u, 20u, 32u); // numberOfCursorIds (byte 0): truncated cursorIDs -> unexpected bytes remaining. EXPECT_DECR_FAILURE (21u, 23u, 20u); // numberOfCursorIds (bytes 1-3): invalid. EXPECT_DECR_SUCCESS (24u, 39u, 40u); // cursorIDs. // clang-format on // clang-format off EXPECT_INCR_FAILURE ( 0u, 3u, 0u); // messageLength: invalid. EXPECT_INCR_SUCCESS ( 4u, 11u, 40u); // requestID, responseTo. EXPECT_INCR_FAILURE (12u, 15u, 12u); // opCode: invalid. EXPECT_INCR_FAILURE (16u, 19u, 16u); // ZERO: invalid. EXPECT_INCR_FAILURE (20u, 23u, 20u); // numberOfCursorIds: invalid. EXPECT_INCR_SUCCESS (24u, 39u, 40u); // cursorIDs. // clang-format on _test_from_data_input_bounds(data, data_len); } #define ASSERT_IOVEC_VALUE(index, expected, type, raw_type, from_le, spec) \ if (1) { \ const type _expected = expected; \ const mongoc_iovec_t iovec = iovecs[index]; \ const size_t len = sizeof(type); \ ASSERT_WITH_MSG(iovec.iov_len == sizeof(type), "expected iov_len to be %zu, but got %zu", len, iovec.iov_len); \ raw_type storage; \ memcpy(&storage, iovec.iov_base, sizeof(type)); \ storage = from_le(storage); \ type value; \ memcpy(&value, &storage, sizeof(type)); \ ASSERT_WITH_MSG(value == _expected, \ "expected iov_base to point to %s with value %" spec ", but got %" spec, \ #type, \ _expected, \ value); \ } else \ (void)0 // Use `%d` for uint8_t to avoid -Wformat warnings due to integer promotion rules conflicting with definition of `PRIu8` // as `%u` by GCC on certain platforms (only in release mode...?). #define ASSERT_IOVEC_UINT8(index, expected) ASSERT_IOVEC_VALUE(index, expected, uint8_t, uint8_t, (uint8_t), "d") #define ASSERT_IOVEC_INT32(index, expected) \ ASSERT_IOVEC_VALUE(index, expected, int32_t, uint32_t, BSON_UINT32_FROM_LE, PRId32) #define ASSERT_IOVEC_UINT32(index, expected) \ ASSERT_IOVEC_VALUE(index, expected, uint32_t, uint32_t, BSON_UINT32_FROM_LE, PRIu32) #define ASSERT_IOVEC_INT64(index, expected) \ ASSERT_IOVEC_VALUE(index, expected, int64_t, uint64_t, BSON_UINT64_FROM_LE, PRId64) #define ASSERT_IOVEC_BYTES(index, expected_base_index, expected_len) \ if (1) { \ const mongoc_iovec_t iovec = iovecs[index]; \ ASSERT_WITH_MSG(iovec.iov_len == expected_len, \ "expected iov_len to be %zu, but got %zu", \ (size_t)expected_len, \ iovec.iov_len); \ ASSERT_WITH_MSG((const uint8_t *)iovec.iov_base == (data + expected_base_index), \ "expected iov_base to point to byte %zu (%p), but got byte %zu (%p)", \ (size_t)(expected_base_index), \ (void *)(data + expected_base_index), \ (size_t)((const uint8_t *)iovec.iov_base - data), \ iovec.iov_base); \ } else \ (void)0 static void test_rpc_message_to_iovecs_op_compressed(void) { const uint8_t data[] = {TEST_DATA_OP_COMPRESSED}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_IOVEC_INT32(0, 45); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2012); // opCode ASSERT_IOVEC_INT32(4, 2013); // originalOpcode ASSERT_IOVEC_INT32(5, 20); // uncompressedSize ASSERT_IOVEC_UINT8(6, 0); // compressorId ASSERT_IOVEC_BYTES(7, 25u, 20u); // compressedMessage bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_msg_kind_0(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_0}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_IOVEC_INT32(0, 40); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2013); // opCode ASSERT_IOVEC_INT32(4, 1); // flagBits ASSERT_IOVEC_UINT8(5, 0); // Section 0 Kind ASSERT_IOVEC_BYTES(6, 21u, 15u); // Section 0 Body ASSERT_IOVEC_UINT32(7, 287454020); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_msg_kind_1_single(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_SINGLE}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 12u); ASSERT_IOVEC_INT32(0, 67); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2013); // opCode ASSERT_IOVEC_INT32(4, 1); // flagBits ASSERT_IOVEC_UINT8(5, 0); // Section 0 Kind ASSERT_IOVEC_BYTES(6, 21u, 15u); // Section 0 Body ASSERT_IOVEC_UINT8(7, 1); // Section 1 Kind ASSERT_IOVEC_INT32(8, 26); // Section 1 Length ASSERT_IOVEC_BYTES(9, 41u, 7u); // Section 1 Identifier ASSERT_IOVEC_BYTES(10, 48u, 15u); // Section 1 Documents ASSERT_IOVEC_UINT32(11, 287454020); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_msg_kind_1_multiple(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_MULTIPLE}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 16u); ASSERT_IOVEC_INT32(0, 110); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2013); // opCode ASSERT_IOVEC_INT32(4, 1); // flagBits ASSERT_IOVEC_UINT8(5, 0); // Section 0 Kind ASSERT_IOVEC_BYTES(6, 21u, 15u); // Section 0 Body ASSERT_IOVEC_UINT8(7, 1); // Section 1 Kind ASSERT_IOVEC_INT32(8, 25); // Section 1 Length ASSERT_IOVEC_BYTES(9, 41u, 6u); // Section 1 Identifier ASSERT_IOVEC_BYTES(10, 47u, 15u); // Section 1 Documents ASSERT_IOVEC_UINT8(11, 1); // Section 2 Kind ASSERT_IOVEC_INT32(12, 43); // Section 2 Length ASSERT_IOVEC_BYTES(13, 67u, 7u); // Section 2 Identifier ASSERT_IOVEC_BYTES(14, 74u, 32u); // Section 2 Documents ASSERT_IOVEC_UINT32(15, 287454020); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_msg(void) { test_rpc_message_to_iovecs_op_msg_kind_0(); test_rpc_message_to_iovecs_op_msg_kind_1_single(); test_rpc_message_to_iovecs_op_msg_kind_1_multiple(); } static void test_rpc_message_to_iovecs_op_reply(void) { const uint8_t data[] = {TEST_DATA_OP_REPLY}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 9u); ASSERT_IOVEC_INT32(0, 68); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 1); // opCode ASSERT_IOVEC_INT32(4, 0); // responseFlags ASSERT_IOVEC_INT64(5, INT64_C(1234605616436508552)); // cursorID ASSERT_IOVEC_INT32(6, 0); // startingFrom ASSERT_IOVEC_INT32(7, 2); // numberReturned ASSERT_IOVEC_BYTES(8, 36u, 32u); // documents bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_update(void) { const uint8_t data[] = {TEST_DATA_OP_UPDATE}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 9u); ASSERT_IOVEC_INT32(0, 62); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2001); // opCode ASSERT_IOVEC_INT32(4, 0); // ZERO ASSERT_IOVEC_BYTES(5, 20u, 8u); // fullCollectionName ASSERT_IOVEC_INT32(6, 0); // flags ASSERT_IOVEC_BYTES(7, 32u, 16u); // selector ASSERT_IOVEC_BYTES(8, 48u, 14u); // update bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_insert(void) { const uint8_t data[] = {TEST_DATA_OP_INSERT}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 7u); ASSERT_IOVEC_INT32(0, 60); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2002); // opCode ASSERT_IOVEC_INT32(4, 0); // flags ASSERT_IOVEC_BYTES(5, 20u, 8u); // fullCollectionName ASSERT_IOVEC_BYTES(6, 28u, 32u); // documents bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_query(void) { const uint8_t data[] = {TEST_DATA_OP_QUERY}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 10u); ASSERT_IOVEC_INT32(0, 65); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2004); // opCode ASSERT_IOVEC_INT32(4, 0); // flags ASSERT_IOVEC_BYTES(5, 20u, 8u); // fullCollectionName ASSERT_IOVEC_INT32(6, 0); // numberToSkip ASSERT_IOVEC_INT32(7, 0); // numberToReturn ASSERT_IOVEC_BYTES(8, 36u, 13u); // query ASSERT_IOVEC_BYTES(9, 49u, 16u); // returnFieldsSelector bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_get_more(void) { const uint8_t data[] = {TEST_DATA_OP_GET_MORE}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_IOVEC_INT32(0, 40); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2005); // opCode ASSERT_IOVEC_INT32(4, 0); // ZERO ASSERT_IOVEC_BYTES(5, 20u, 8u); // fullCollectionName ASSERT_IOVEC_INT32(6, 0); // numberToReturn ASSERT_IOVEC_INT64(7, INT64_C(1234605616436508552)); // cursorID bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_delete(void) { const uint8_t data[] = {TEST_DATA_OP_DELETE}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_IOVEC_INT32(0, 48); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2006); // opCode ASSERT_IOVEC_INT32(4, 0); // ZERO ASSERT_IOVEC_BYTES(5, 20u, 8u); // fullCollectionName ASSERT_IOVEC_INT32(6, 0); // flags ASSERT_IOVEC_BYTES(7, 32u, 16u); // selector bson_free(iovecs); mcd_rpc_message_destroy(rpc); } static void test_rpc_message_to_iovecs_op_kill_cursors(void) { const uint8_t data[] = {TEST_DATA_OP_KILL_CURSORS}; mcd_rpc_message *const rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 7u); ASSERT_IOVEC_INT32(0, 40); // messageLength ASSERT_IOVEC_INT32(1, 16909060); // requestID ASSERT_IOVEC_INT32(2, 84281096); // responseTo ASSERT_IOVEC_INT32(3, 2007); // opCode ASSERT_IOVEC_INT32(4, 0); // ZERO ASSERT_IOVEC_INT32(5, 2); // numberOfCursorIds // The cursorIDs iovec does not point to original data due to endian // conversion requirements. Assert values individually. { const mongoc_iovec_t *const iovec = iovecs + 6; ASSERT_CMPSIZE_T(iovec->iov_len, ==, 16u); const int64_t *const cursor_ids = (const int64_t *)iovec->iov_base; const int64_t cursor_id_0 = mlib_read_i64le(cursor_ids + 0); const int64_t cursor_id_1 = mlib_read_i64le(cursor_ids + 1); ASSERT_CMPINT64(cursor_id_0, ==, 1230066625199609624); ASSERT_CMPINT64(cursor_id_1, ==, 2387509390608836392); } bson_free(iovecs); mcd_rpc_message_destroy(rpc); } #define ASSERT_CMPIOVEC_VALUE(index, type, raw_type, from_le, spec) \ if (1) { \ const mongoc_iovec_t _actual = iovecs[index]; \ const mongoc_iovec_t _expected = expected_iovecs[index]; \ ASSERT_WITH_MSG(_expected.iov_len == sizeof(type), "expected iov_len does not match expected type length"); \ ASSERT_WITH_MSG(_actual.iov_len == _expected.iov_len, \ "expected iov_len to be %zu, but got %zu", \ _expected.iov_len, \ _actual.iov_len); \ raw_type storage; \ type actual_value; \ type expected_value; \ memcpy(&storage, _actual.iov_base, sizeof(type)); \ storage = from_le(storage); \ memcpy(&actual_value, &storage, sizeof(type)); \ memcpy(&storage, _expected.iov_base, sizeof(type)); \ storage = from_le(storage); \ memcpy(&expected_value, &storage, sizeof(type)); \ ASSERT_WITH_MSG(actual_value == expected_value, \ "expected iov_base to point to %s with value %" spec ", but got %" spec, \ #type, \ expected_value, \ actual_value); \ } else \ (void)0 #define ASSERT_CMPIOVEC_UINT8(index) ASSERT_CMPIOVEC_VALUE(index, uint8_t, uint8_t, (uint8_t), PRIu8) #define ASSERT_CMPIOVEC_INT32(index) ASSERT_CMPIOVEC_VALUE(index, int32_t, uint32_t, BSON_UINT32_FROM_LE, PRId32) #define ASSERT_CMPIOVEC_UINT32(index) ASSERT_CMPIOVEC_VALUE(index, uint32_t, uint32_t, BSON_UINT32_FROM_LE, PRIu32) #define ASSERT_CMPIOVEC_INT64(index) ASSERT_CMPIOVEC_VALUE(index, int64_t, uint64_t, BSON_UINT64_FROM_LE, PRId64) #define ASSERT_CMPIOVEC_BYTES(index) \ if (1) { \ const mongoc_iovec_t _actual = iovecs[index]; \ const mongoc_iovec_t _expected = expected_iovecs[index]; \ ASSERT_WITH_MSG(_actual.iov_len == _expected.iov_len, \ "expected iov_len to be %zu, but got %zu", \ _expected.iov_len, \ _actual.iov_len); \ ASSERT_WITH_MSG(_actual.iov_base == _expected.iov_base, \ "expected iov_base to point to byte %zu (%p), but got byte %zu (%p)", \ (size_t)((const uint8_t *)_expected.iov_base - data), \ _expected.iov_base, \ (size_t)((const uint8_t *)_actual.iov_base - data), \ _actual.iov_base); \ } else \ (void)0 static void test_rpc_message_setters_op_compressed(void) { const uint8_t data[] = {TEST_DATA_OP_COMPRESSED}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 45)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_COMPRESSED)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_compressed_set_original_opcode (rpc, MONGOC_OP_CODE_MSG)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_compressed_set_uncompressed_size (rpc, 20)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_compressed_set_compressor_id (rpc, 0)); ASSERT_CMPINT32 (20, ==, mcd_rpc_op_compressed_set_compressed_message (rpc, data + 25, 20u)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // originalOpcode ASSERT_CMPIOVEC_INT32(5); // uncompressedSize ASSERT_CMPIOVEC_UINT8(6); // compressorId ASSERT_CMPIOVEC_BYTES(7); // compressedMessage bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_msg_kind_0(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_0}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 40)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_MSG)); mcd_rpc_op_msg_set_sections_count (rpc, 1u); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_flag_bits (rpc, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 0u, 0)); ASSERT_CMPINT32 (15, ==, mcd_rpc_op_msg_section_set_body (rpc, 0u, data + 21)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_checksum (rpc, 287454020)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // flagBits ASSERT_CMPIOVEC_UINT8(5); // Section 0 Kind ASSERT_CMPIOVEC_BYTES(6); // Section 0 Body ASSERT_CMPIOVEC_UINT32(7); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_msg_kind_1_single(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_SINGLE}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 67)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_MSG)); mcd_rpc_op_msg_set_sections_count (rpc, 2u); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_flag_bits (rpc, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 0u, 0)); ASSERT_CMPINT32 (15, ==, mcd_rpc_op_msg_section_set_body (rpc, 0u, data + 21)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 1u, 1)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_section_set_length (rpc, 1u, 26u)); ASSERT_CMPINT32 ( 7, ==, mcd_rpc_op_msg_section_set_identifier (rpc, 1u, (const char *) (data + 41))); ASSERT_CMPINT32 (15, ==, mcd_rpc_op_msg_section_set_document_sequence (rpc, 1u, data + 48, 15u)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_checksum (rpc, 287454020)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 12u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // flagBits ASSERT_CMPIOVEC_UINT8(5); // Section 0 Kind ASSERT_CMPIOVEC_BYTES(6); // Section 0 Body ASSERT_CMPIOVEC_UINT8(7); // Section 1 Kind ASSERT_CMPIOVEC_INT32(8); // Section 1 Length ASSERT_CMPIOVEC_BYTES(9); // Section 1 Identifier ASSERT_CMPIOVEC_BYTES(10); // Section 1 Documents ASSERT_CMPIOVEC_UINT32(11); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_msg_kind_1_multiple(void) { const uint8_t data[] = {TEST_DATA_OP_MSG_KIND_1_MULTIPLE}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 110)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_MSG)); mcd_rpc_op_msg_set_sections_count (rpc, 3u); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_flag_bits (rpc, MONGOC_OP_MSG_FLAG_CHECKSUM_PRESENT)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 0u, 0)); ASSERT_CMPINT32 (15, ==, mcd_rpc_op_msg_section_set_body (rpc, 0u, data + 21)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 1u, 1)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_section_set_length (rpc, 1u, 25u)); ASSERT_CMPINT32 ( 6, ==, mcd_rpc_op_msg_section_set_identifier (rpc, 1u, (const char *) (data + 41))); ASSERT_CMPINT32 (15, ==, mcd_rpc_op_msg_section_set_document_sequence (rpc, 1u, data + 47, 15u)); ASSERT_CMPINT32 ( 1, ==, mcd_rpc_op_msg_section_set_kind (rpc, 2u, 1)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_section_set_length (rpc, 2u, 43u)); ASSERT_CMPINT32 ( 7, ==, mcd_rpc_op_msg_section_set_identifier (rpc, 2u, (const char *) (data + 67))); ASSERT_CMPINT32 (32, ==, mcd_rpc_op_msg_section_set_document_sequence (rpc, 2u, data + 74, 32u)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_msg_set_checksum (rpc, 287454020)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 16u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // flagBits ASSERT_CMPIOVEC_UINT8(5); // Section 0 Kind ASSERT_CMPIOVEC_BYTES(6); // Section 0 Body ASSERT_CMPIOVEC_UINT8(7); // Section 1 Kind ASSERT_CMPIOVEC_INT32(8); // Section 1 Length ASSERT_CMPIOVEC_BYTES(9); // Section 1 Identifier ASSERT_CMPIOVEC_BYTES(10); // Section 1 Documents ASSERT_CMPIOVEC_UINT8(11); // Section 2 Kind ASSERT_CMPIOVEC_INT32(12); // Section 2 Length ASSERT_CMPIOVEC_BYTES(13); // Section 2 Identifier ASSERT_CMPIOVEC_BYTES(14); // Section 2 Documents ASSERT_CMPIOVEC_UINT32(15); // Checksum bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_msg(void) { test_rpc_message_setters_op_msg_kind_0(); test_rpc_message_setters_op_msg_kind_1_single(); test_rpc_message_setters_op_msg_kind_1_multiple(); } static void test_rpc_message_setters_op_reply(void) { const uint8_t data[] = {TEST_DATA_OP_REPLY}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 68)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_REPLY)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_reply_set_response_flags (rpc, MONGOC_OP_REPLY_RESPONSE_FLAG_NONE)); ASSERT_CMPINT32 ( 8, ==, mcd_rpc_op_reply_set_cursor_id (rpc, 1234605616436508552)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_reply_set_starting_from (rpc, 0)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_reply_set_number_returned (rpc, 2)); ASSERT_CMPINT32 (32, ==, mcd_rpc_op_reply_set_documents (rpc, data + 36, 32u)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 9u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // responseFlags ASSERT_CMPIOVEC_INT64(5); // cursorID ASSERT_CMPIOVEC_INT32(6); // startingFrom ASSERT_CMPIOVEC_INT32(7); // numberReturned ASSERT_CMPIOVEC_BYTES(8); // documents bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_update(void) { const uint8_t data[] = {TEST_DATA_OP_UPDATE}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 62)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_UPDATE)); ASSERT_CMPINT32 ( 8, ==, mcd_rpc_op_update_set_full_collection_name (rpc, (const char *) (data + 20))); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_update_set_flags (rpc, MONGOC_OP_UPDATE_FLAG_NONE)); ASSERT_CMPINT32 (16, ==, mcd_rpc_op_update_set_selector (rpc, data + 32)); ASSERT_CMPINT32 (14, ==, mcd_rpc_op_update_set_update (rpc, data + 48)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 9u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // ZERO ASSERT_CMPIOVEC_BYTES(5); // fullCollectionName ASSERT_CMPIOVEC_INT32(6); // flags ASSERT_CMPIOVEC_BYTES(7); // selector ASSERT_CMPIOVEC_BYTES(8); // update bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_insert(void) { const uint8_t data[] = {TEST_DATA_OP_INSERT}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 60)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_INSERT)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_insert_set_flags (rpc, MONGOC_OP_INSERT_FLAG_NONE)); ASSERT_CMPINT32 ( 8, ==, mcd_rpc_op_insert_set_full_collection_name (rpc, (const char *) (data + 20))); ASSERT_CMPINT32 (32, ==, mcd_rpc_op_insert_set_documents (rpc, data + 28, 32u)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 7u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // flags ASSERT_CMPIOVEC_BYTES(5); // fullCollectionName ASSERT_CMPIOVEC_BYTES(6); // documents bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_query(void) { const uint8_t data[] = {TEST_DATA_OP_QUERY}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 65)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_QUERY)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_query_set_flags (rpc, MONGOC_OP_QUERY_FLAG_NONE)); ASSERT_CMPINT32 ( 8, ==, mcd_rpc_op_query_set_full_collection_name (rpc, (const char *) (data + 20))); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_query_set_number_to_skip (rpc, 0)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_query_set_number_to_return (rpc, 0)); ASSERT_CMPINT32 (13, ==, mcd_rpc_op_query_set_query (rpc, data + 36)); ASSERT_CMPINT32 (16, ==, mcd_rpc_op_query_set_return_fields_selector (rpc, data + 49)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 10u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // flags ASSERT_CMPIOVEC_BYTES(5); // fullCollectionName ASSERT_CMPIOVEC_INT32(6); // numberToSkip ASSERT_CMPIOVEC_INT32(7); // numberToReturn ASSERT_CMPIOVEC_BYTES(8); // query ASSERT_CMPIOVEC_BYTES(9); // returnFieldsSelector bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_get_more(void) { const uint8_t data[] = {TEST_DATA_OP_GET_MORE}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 (4, ==, mcd_rpc_header_set_message_length (rpc, 40)); ASSERT_CMPINT32 (4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 (4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 (4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_GET_MORE)); ASSERT_CMPINT32 (8, ==, mcd_rpc_op_get_more_set_full_collection_name (rpc, (const char *) (data + 20))); ASSERT_CMPINT32 (4, ==, mcd_rpc_op_get_more_set_number_to_return (rpc, 0)); ASSERT_CMPINT32 (8, ==, mcd_rpc_op_get_more_set_cursor_id (rpc, 1234605616436508552)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // ZERO ASSERT_CMPIOVEC_BYTES(5); // fullCollectionName ASSERT_CMPIOVEC_INT32(6); // numberToReturn ASSERT_CMPIOVEC_INT64(7); // cursorID bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_delete(void) { const uint8_t data[] = {TEST_DATA_OP_DELETE}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 48)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_DELETE)); ASSERT_CMPINT32 ( 8, ==, mcd_rpc_op_delete_set_full_collection_name (rpc, (const char *) (data + 20))); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_op_delete_set_flags (rpc, MONGOC_OP_DELETE_FLAG_NONE)); ASSERT_CMPINT32 (16, ==, mcd_rpc_op_delete_set_selector (rpc, data + 32)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 8u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // ZERO ASSERT_CMPIOVEC_BYTES(5); // fullCollectionName ASSERT_CMPIOVEC_INT32(6); // flags ASSERT_CMPIOVEC_BYTES(7); // selector bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_setters_op_kill_cursors(void) { const uint8_t data[] = {TEST_DATA_OP_KILL_CURSORS}; mcd_rpc_message *const expected_rpc = mcd_rpc_message_from_data(data, sizeof(data), NULL); ASSERT(expected_rpc); size_t expected_num_iovecs; mongoc_iovec_t *const expected_iovecs = mcd_rpc_message_to_iovecs(expected_rpc, &expected_num_iovecs); ASSERT(expected_iovecs); const int64_t cursor_ids[] = {1230066625199609624, 2387509390608836392}; mcd_rpc_message *const rpc = mcd_rpc_message_new(); // clang-format off ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_message_length (rpc, 40)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_request_id (rpc, 16909060)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_response_to (rpc, 84281096)); ASSERT_CMPINT32 ( 4, ==, mcd_rpc_header_set_op_code (rpc, MONGOC_OP_CODE_KILL_CURSORS)); ASSERT_CMPINT32 (20, ==, mcd_rpc_op_kill_cursors_set_cursor_ids (rpc, cursor_ids, 2)); // clang-format on size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, expected_num_iovecs); ASSERT_CMPSIZE_T(num_iovecs, ==, 7u); ASSERT_CMPIOVEC_INT32(0); // messageLength ASSERT_CMPIOVEC_INT32(1); // requestID ASSERT_CMPIOVEC_INT32(2); // responseTo ASSERT_CMPIOVEC_INT32(3); // opCode ASSERT_CMPIOVEC_INT32(4); // ZERO ASSERT_CMPIOVEC_INT32(5); // numberOfCursorIds // The cursorIDs iovec does not point to original data due to endian // conversion requirements. Assert values individually. { const mongoc_iovec_t *const iovec = iovecs + 6; const mongoc_iovec_t *const expected_iovec = expected_iovecs + 6; ASSERT_CMPSIZE_T(iovec->iov_len, ==, expected_iovec->iov_len); ASSERT(memcmp(iovec->iov_base, expected_iovec->iov_base, expected_iovec->iov_len) == 0); } bson_free(iovecs); mcd_rpc_message_destroy(rpc); bson_free(expected_iovecs); mcd_rpc_message_destroy(expected_rpc); } static void test_rpc_message_from_data_in_place(void) { const uint8_t data_op_compressed[] = {TEST_DATA_OP_COMPRESSED}; const uint8_t data_op_msg_kind_0[] = {TEST_DATA_OP_MSG_KIND_0}; const uint8_t data_op_msg_kind_1_single[] = {TEST_DATA_OP_MSG_KIND_1_SINGLE}; const uint8_t data_op_msg_kind_1_multiple[] = {TEST_DATA_OP_MSG_KIND_1_MULTIPLE}; const uint8_t data_op_reply[] = {TEST_DATA_OP_REPLY}; const uint8_t data_op_update[] = {TEST_DATA_OP_UPDATE}; const uint8_t data_op_insert[] = {TEST_DATA_OP_INSERT}; const uint8_t data_op_query[] = {TEST_DATA_OP_QUERY}; const uint8_t data_op_get_more[] = {TEST_DATA_OP_GET_MORE}; const uint8_t data_op_delete[] = {TEST_DATA_OP_DELETE}; const uint8_t data_op_kill_cursors[] = {TEST_DATA_OP_KILL_CURSORS}; typedef struct test_data_type { const uint8_t *data; size_t data_len; } test_data_type; test_data_type test_data[] = { {data_op_compressed, sizeof(data_op_compressed)}, {data_op_msg_kind_0, sizeof(data_op_msg_kind_0)}, {data_op_msg_kind_1_single, sizeof(data_op_msg_kind_1_single)}, {data_op_msg_kind_1_multiple, sizeof(data_op_msg_kind_1_multiple)}, {data_op_reply, sizeof(data_op_reply)}, {data_op_update, sizeof(data_op_update)}, {data_op_insert, sizeof(data_op_insert)}, {data_op_query, sizeof(data_op_query)}, {data_op_get_more, sizeof(data_op_get_more)}, {data_op_delete, sizeof(data_op_delete)}, {data_op_kill_cursors, sizeof(data_op_kill_cursors)}, }; const size_t num_test_data = sizeof(test_data) / sizeof(*test_data); mcd_rpc_message *const rpc = mcd_rpc_message_new(); ASSERT_CMPINT32(mcd_rpc_header_get_message_length(rpc), ==, 0); ASSERT_CMPINT32(mcd_rpc_header_get_request_id(rpc), ==, 0); ASSERT_CMPINT32(mcd_rpc_header_get_response_to(rpc), ==, 0); ASSERT_CMPINT32(mcd_rpc_header_get_op_code(rpc), ==, MONGOC_OP_CODE_NONE); const void *data_end = NULL; bool res = false; // Test reuse of RPC message object. for (size_t i = 0u; i < num_test_data; ++i) { const uint8_t *const data = test_data[i].data; const size_t data_len = test_data[i].data_len; res = mcd_rpc_message_from_data_in_place(rpc, data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(res, data, data_end, data_len); mcd_rpc_message_reset(rpc); } // Again but in reverse order. for (size_t i = 0u; i < num_test_data; ++i) { const size_t idx = num_test_data - 1u - i; const uint8_t *const data = test_data[idx].data; const size_t data_len = test_data[idx].data_len; res = mcd_rpc_message_from_data_in_place(rpc, data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(res, data, data_end, data_len); mcd_rpc_message_reset(rpc); } // Also test post-conversion to iovecs and little endian. for (size_t i = 0u; i < num_test_data; ++i) { const uint8_t *const data = test_data[i].data; const size_t data_len = test_data[i].data_len; res = mcd_rpc_message_from_data_in_place(rpc, data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(res, data, data_end, data_len); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs && num_iovecs > 0u); bson_free(iovecs); mcd_rpc_message_reset(rpc); } // Again but in reverse order. for (size_t i = 0u; i < num_test_data; ++i) { const size_t idx = num_test_data - 1u - i; const uint8_t *const data = test_data[idx].data; const size_t data_len = test_data[idx].data_len; res = mcd_rpc_message_from_data_in_place(rpc, data, data_len, &data_end); ASSERT_RPC_MESSAGE_RESULT(res, data, data_end, data_len); size_t num_iovecs; mongoc_iovec_t *const iovecs = mcd_rpc_message_to_iovecs(rpc, &num_iovecs); ASSERT(iovecs && num_iovecs > 0u); bson_free(iovecs); mcd_rpc_message_reset(rpc); } mcd_rpc_message_destroy(rpc); } void test_mcd_rpc_install(TestSuite *suite) { TestSuite_Add(suite, "/rpc_message/from_data/op_compressed/valid", test_rpc_message_from_data_op_compressed_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_msg/valid", test_rpc_message_from_data_op_msg_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_reply/valid", test_rpc_message_from_data_op_reply_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_update/valid", test_rpc_message_from_data_op_update_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_insert/valid", test_rpc_message_from_data_op_insert_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_query/valid", test_rpc_message_from_data_op_query_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_get_more/valid", test_rpc_message_from_data_op_get_more_valid); TestSuite_Add(suite, "/rpc_message/from_data/op_delete/valid", test_rpc_message_from_data_op_delete_valid); TestSuite_Add( suite, "/rpc_message/from_data/op_kill_cursors/valid", test_rpc_message_from_data_op_kill_cursors_valid); TestSuite_Add( suite, "/rpc_message/from_data/op_compressed/invalid", test_rpc_message_from_data_op_compressed_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_msg/invalid", test_rpc_message_from_data_op_msg_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_reply/invalid", test_rpc_message_from_data_op_reply_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_update/invalid", test_rpc_message_from_data_op_update_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_insert/invalid", test_rpc_message_from_data_op_insert_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_query/invalid", test_rpc_message_from_data_op_query_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_get_more/invalid", test_rpc_message_from_data_op_get_more_invalid); TestSuite_Add(suite, "/rpc_message/from_data/op_delete/invalid", test_rpc_message_from_data_op_delete_invalid); TestSuite_Add( suite, "/rpc_message/from_data/op_kill_cursors/invalid", test_rpc_message_from_data_op_kill_cursors_invalid); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_compressed", test_rpc_message_to_iovecs_op_compressed); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_msg", test_rpc_message_to_iovecs_op_msg); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_reply", test_rpc_message_to_iovecs_op_reply); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_update", test_rpc_message_to_iovecs_op_update); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_insert", test_rpc_message_to_iovecs_op_insert); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_query", test_rpc_message_to_iovecs_op_query); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_get_more", test_rpc_message_to_iovecs_op_get_more); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_delete", test_rpc_message_to_iovecs_op_delete); TestSuite_Add(suite, "/rpc_message/to_iovecs/op_kill_cursors", test_rpc_message_to_iovecs_op_kill_cursors); TestSuite_Add(suite, "/rpc_message/setters/op_compressed", test_rpc_message_setters_op_compressed); TestSuite_Add(suite, "/rpc_message/setters/op_msg", test_rpc_message_setters_op_msg); TestSuite_Add(suite, "/rpc_message/setters/op_reply", test_rpc_message_setters_op_reply); TestSuite_Add(suite, "/rpc_message/setters/op_update", test_rpc_message_setters_op_update); TestSuite_Add(suite, "/rpc_message/setters/op_insert", test_rpc_message_setters_op_insert); TestSuite_Add(suite, "/rpc_message/setters/op_query", test_rpc_message_setters_op_query); TestSuite_Add(suite, "/rpc_message/setters/op_get_more", test_rpc_message_setters_op_get_more); TestSuite_Add(suite, "/rpc_message/setters/op_delete", test_rpc_message_setters_op_delete); TestSuite_Add(suite, "/rpc_message/setters/op_kill_cursors", test_rpc_message_setters_op_kill_cursors); TestSuite_Add(suite, "/rpc_message/from_data/in_place", test_rpc_message_from_data_in_place); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-aggregate.c000066400000000000000000000150721511661753600246150ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include static void _test_query_flag(mongoc_query_flags_t flag, bson_t *opt) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; future_t *future; request_t *request; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_aggregate(collection, flag, tmp_bson("{'pipeline': []}"), opt, NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); /* "aggregate" command */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'aggregate': 'collection'," " 'pipeline': [ ]," " 'tailable': {'$exists': false}}")); ASSERT(request); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.collection'," " 'nextBatch': [{}]}}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); /* "getMore" command */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'getMore': {'$numberLong': '123'}," " 'collection': 'collection'," " 'tailable': {'$exists': false}}")); ASSERT(request); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'nextBatch': [{}]}}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_query_flags(void) { typedef struct { mongoc_query_flags_t flag; bson_t *opt; } flag_and_opt_t; flag_and_opt_t flags_and_opts[] = { {MONGOC_QUERY_TAILABLE_CURSOR, tmp_bson("{'tailable': true}")}, {MONGOC_QUERY_TAILABLE_CURSOR | MONGOC_QUERY_AWAIT_DATA, tmp_bson("{'tailable': true, 'awaitData': true}")}}; /* test with both flag and opt */ mlib_foreach_arr (flag_and_opt_t, opts, flags_and_opts) { _test_query_flag(opts->flag, NULL); _test_query_flag(MONGOC_QUERY_NONE, opts->opt); } } typedef struct { bson_t *cmd; bson_mutex_t lock; } last_captured_t; static void command_started(const mongoc_apm_command_started_t *event) { const bson_t *cmd = mongoc_apm_command_started_get_command(event); last_captured_t *lc = mongoc_apm_command_started_get_context(event); bson_mutex_lock(&lc->lock); bson_destroy(lc->cmd); lc->cmd = bson_copy(cmd); bson_mutex_unlock(&lc->lock); } // `test_write_respects_read_prefs` tests that an aggregate with a write stage respects the original read preferences // when talking to >= 5.0 servers. This is a regression test for CDRIVER-5707. static void test_write_respects_read_prefs(void *unused) { BSON_UNUSED(unused); bson_error_t error; last_captured_t lc = {0}; bson_mutex_init(&lc.lock); mongoc_client_pool_t *pool = test_framework_new_default_client_pool(); // Capture the most recent command-started event. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, command_started); mongoc_client_pool_set_apm_callbacks(pool, cbs, &lc); mongoc_apm_callbacks_destroy(cbs); } // Create database 'db' on separate client to avoid "database 'db' not found" error. { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(BSON_STR({"x" : 1})), NULL, NULL, &error), error); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Do an 'aggregate' with '$out'. { bson_t *pipeline = tmp_bson(BSON_STR({"pipeline" : [ {"$out" : "foo"} ]})); mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_read_prefs_t *rp = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); mongoc_cursor_t *cursor = mongoc_collection_aggregate(coll, MONGOC_QUERY_NONE, pipeline, NULL /* opts */, rp); // Iterate cursor to send `aggregate` command. const bson_t *ignored; ASSERT(!mongoc_cursor_next(cursor, &ignored)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_read_prefs_destroy(rp); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_pool_push(pool, client); } // Check that `aggregate` command contains $readPreference. { bson_t *got; bson_mutex_lock(&lc.lock); got = bson_copy(lc.cmd); bson_mutex_unlock(&lc.lock); ASSERT_MATCH(got, BSON_STR({"$readPreference" : {"mode" : "secondaryPreferred"}})); bson_destroy(got); } mongoc_client_pool_destroy(pool); bson_destroy(lc.cmd); bson_mutex_destroy(&lc.lock); } void test_aggregate_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Aggregate/query_flags", test_query_flags); TestSuite_AddFull(suite, "/Aggregate/write_respects_read_prefs [lock:live-server]", test_write_respects_read_prefs, NULL, NULL, test_framework_skip_if_single /* $readPreference is not sent for single servers */, test_framework_skip_if_max_wire_version_less_than_13 /* require server 5.0+ */); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-array.c000066400000000000000000000015311511661753600240000ustar00rootroot00000000000000#include #include static void test_array(void) { mongoc_array_t ar; int i; int v; _mongoc_array_init(&ar, sizeof i); BSON_ASSERT(ar.element_size == sizeof i); BSON_ASSERT(ar.len == 0); BSON_ASSERT(ar.allocated); BSON_ASSERT(ar.data); for (i = 0; i < 100; i++) { _mongoc_array_append_val(&ar, i); } for (i = 0; i < 100; i++) { v = _mongoc_array_index(&ar, int, i); BSON_ASSERT(v == i); } BSON_ASSERT(ar.len == 100); BSON_ASSERT(ar.allocated >= (100 * sizeof i)); _mongoc_array_clear(&ar); BSON_ASSERT(ar.len == 0); BSON_ASSERT(ar.allocated); BSON_ASSERT(ar.data); BSON_ASSERT(ar.element_size); _mongoc_array_destroy(&ar); } void test_array_install(TestSuite *suite) { TestSuite_Add(suite, "/Array/Basic", test_array); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-async.c000066400000000000000000000266521511661753600240120ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #define TIMEOUT 10000 /* milliseconds */ #define NSERVERS 10 struct result { int32_t server_id; bool finished; }; static mongoc_stream_t * get_localhost_stream(uint16_t port) { int errcode; int r; struct sockaddr_in server_addr = {0}; mongoc_socket_t *conn_sock; conn_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(conn_sock); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); r = mongoc_socket_connect(conn_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), 0); errcode = mongoc_socket_errno(conn_sock); if (!(r == 0 || MONGOC_ERRNO_IS_AGAIN(errcode))) { test_error("mongoc_socket_connect unexpected return: %d (errno: %d)", r, errcode); } return mongoc_stream_socket_new(conn_sock); } static void test_hello_helper(mongoc_async_cmd_t *acmd, mongoc_async_cmd_result_t result, const bson_t *bson, mlib_duration duration_usec) { struct result *r = _acmd_userdata(struct result, acmd); bson_iter_t iter; bson_error_t *error = &acmd->error; BSON_UNUSED(duration_usec); /* ignore the connected event. */ if (result == MONGOC_ASYNC_CMD_CONNECTED) { return; } if (result != MONGOC_ASYNC_CMD_SUCCESS) { fprintf(stderr, "error: %s\n", error->message); } ASSERT_CMPINT(result, ==, MONGOC_ASYNC_CMD_SUCCESS); BSON_ASSERT(bson_iter_init_find(&iter, bson, "serverId")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); r->server_id = bson_iter_int32(&iter); r->finished = true; } static void test_hello_impl(bool with_ssl) { mock_server_t *servers[NSERVERS]; mongoc_async_t *async; mongoc_stream_t *sock_streams[NSERVERS]; mongoc_async_cmd_stream_setup_cb setup = NULL; void *setup_ctx = NULL; uint16_t ports[NSERVERS]; struct result results[NSERVERS]; int i; int offset; int server_id; bson_t q = BSON_INITIALIZER; future_t *future; request_t *request; char *reply; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; #endif if (!TestSuite_CheckMockServerAllowed()) { return; } BSON_ASSERT(BSON_APPEND_INT32(&q, HANDSHAKE_CMD_LEGACY_HELLO, 1)); for (i = 0; i < NSERVERS; i++) { servers[i] = mock_server_new(); #ifdef MONGOC_ENABLE_SSL if (with_ssl) { sopt.weak_cert_validation = true; sopt.pem_file = CERT_SERVER; sopt.ca_file = CERT_CA; mock_server_set_ssl_opts(servers[i], &sopt); } #endif ports[i] = mock_server_run(servers[i]); } async = mongoc_async_new(); for (i = 0; i < NSERVERS; i++) { sock_streams[i] = get_localhost_stream(ports[i]); #ifdef MONGOC_ENABLE_SSL if (with_ssl) { copt.ca_file = CERT_CA; copt.weak_cert_validation = 1; sock_streams[i] = mongoc_stream_tls_new_with_hostname(sock_streams[i], NULL, &copt, 1); setup = mongoc_async_cmd_tls_setup; setup_ctx = (void *)"127.0.0.1"; } #endif results[i].finished = false; mongoc_async_cmd_new(async, sock_streams[i], false, NULL /* dns result, n/a. */, NULL, /* initiator. */ mlib_duration(), /* No initiate delay. */ setup, setup_ctx, "admin", &q, MONGOC_OP_CODE_QUERY, /* used by legacy hello */ &test_hello_helper, (void *)&results[i], mlib_duration(TIMEOUT, ms)); } future = future_async_run(async); /* start in the middle - prove scanner handles replies in any order */ offset = NSERVERS / 2; for (i = 0; i < NSERVERS; i++) { server_id = (i + offset) % NSERVERS; request = mock_server_receives_command(servers[server_id], "admin", MONGOC_QUERY_SECONDARY_OK, NULL); /* use "serverId" field to distinguish among responses */ reply = bson_strdup_printf("{'ok': 1," " '" HANDSHAKE_RESPONSE_LEGACY_HELLO "': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'serverId': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, server_id); reply_to_request_simple(request, reply); bson_free(reply); request_destroy(request); } BSON_ASSERT(future_wait(future)); for (i = 0; i < NSERVERS; i++) { if (!results[i].finished) { test_error("command %d not finished", i); } ASSERT_CMPINT(i, ==, results[i].server_id); } mongoc_async_destroy(async); future_destroy(future); bson_destroy(&q); for (i = 0; i < NSERVERS; i++) { mock_server_destroy(servers[i]); mongoc_stream_destroy(sock_streams[i]); } } static void test_hello(void) { test_hello_impl(false); } #if defined(MONGOC_ENABLE_SSL_OPENSSL) static void test_hello_ssl(void) { test_hello_impl(true); } #else static void test_large_hello_helper(mongoc_async_cmd_t *acmd, mongoc_async_cmd_result_t result, const bson_t *bson, mlib_duration deadline) { BSON_UNUSED(deadline); bson_iter_t iter; bson_error_t *error = &acmd->error; /* ignore the connected event. */ if (result == MONGOC_ASYNC_CMD_CONNECTED) { return; } if (result != MONGOC_ASYNC_CMD_SUCCESS) { fprintf(stderr, "error: %s\n", error->message); } ASSERT_CMPINT(result, ==, MONGOC_ASYNC_CMD_SUCCESS); ASSERT_HAS_FIELD(bson, HANDSHAKE_RESPONSE_LEGACY_HELLO); BSON_ASSERT(bson_iter_init_find(&iter, bson, HANDSHAKE_RESPONSE_LEGACY_HELLO)); BSON_ASSERT(BSON_ITER_HOLDS_BOOL(&iter) && bson_iter_bool(&iter)); } static void test_large_hello(void *ctx) { BSON_UNUSED(ctx); mongoc_async_t *async; mongoc_stream_t *sock_stream; bson_t q = BSON_INITIALIZER; char buf[1024 * 1024]; mongoc_server_api_t *default_api = NULL; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t ssl_opts; #endif /* Inflate the size of the hello message to ~1MB. This tests that * CDRIVER-2483 is fixed. Because mongod 4.9+ errors on unknown and duplicate * fields (see SERVER-53150) we add a ~1MB comment. */ BSON_ASSERT(BSON_APPEND_INT32(&q, HANDSHAKE_CMD_LEGACY_HELLO, 1)); /* size of comment string = (1024 * 1024) - 1 (for null terminator) */ bson_snprintf(buf, sizeof(buf), "%01048575d", 0); BSON_APPEND_UTF8(&q, "comment", buf); sock_stream = get_localhost_stream(test_framework_get_port()); #ifdef MONGOC_ENABLE_SSL if (test_framework_get_ssl()) { ssl_opts = *test_framework_get_ssl_opts(); sock_stream = mongoc_stream_tls_new_with_hostname(sock_stream, NULL, &ssl_opts, 1); } #endif default_api = test_framework_get_default_server_api(); if (default_api) { _mongoc_cmd_append_server_api(&q, default_api); } mongoc_server_api_destroy(default_api); async = mongoc_async_new(); mongoc_async_cmd_new(async, sock_stream, false, /* is setup done. */ NULL /* dns result, n/a. */, NULL, /* initiator. */ mlib_duration(), /* initiate delay. */ #ifdef MONGOC_ENABLE_SSL test_framework_get_ssl() ? mongoc_async_cmd_tls_setup : NULL, #else NULL, #endif NULL, "admin", &q, MONGOC_OP_CODE_QUERY, /* used by legacy hello */ &test_large_hello_helper, NULL, mlib_duration(TIMEOUT, ms)); mongoc_async_run(async); mongoc_async_destroy(async); mongoc_stream_destroy(sock_stream); bson_destroy(&q); } #endif typedef struct _stream_with_result_t { mongoc_stream_t *stream; bool finished; } stream_with_result_t; static void test_hello_delay_callback(mongoc_async_cmd_t *acmd, mongoc_async_cmd_result_t result, const bson_t *bson, mlib_duration duration_usec) { BSON_UNUSED(result); BSON_UNUSED(bson); BSON_UNUSED(duration_usec); _acmd_userdata(stream_with_result_t, acmd)->finished = true; } static mongoc_stream_t * test_hello_delay_initializer(mongoc_async_cmd_t *acmd) { return _acmd_userdata(stream_with_result_t, acmd)->stream; } static void test_hello_delay(void) { /* test that a delayed cmd works. */ mock_server_t *server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mongoc_async_t *async = mongoc_async_new(); bson_t hello_cmd = BSON_INITIALIZER; stream_with_result_t stream_with_result = {0}; int64_t start = bson_get_monotonic_time(); mock_server_run(server); stream_with_result.stream = get_localhost_stream(mock_server_get_port(server)); stream_with_result.finished = false; BSON_ASSERT(BSON_APPEND_INT32(&hello_cmd, HANDSHAKE_CMD_LEGACY_HELLO, 1)); mongoc_async_cmd_new(async, NULL, /* stream, initialized after delay. */ false, /* is setup done. */ NULL, /* dns result. */ test_hello_delay_initializer, mlib_duration(100, ms), /* delay 100ms. */ NULL, /* setup function. */ NULL, /* setup ctx. */ "admin", &hello_cmd, MONGOC_OP_CODE_QUERY, /* used by legacy hello */ &test_hello_delay_callback, &stream_with_result, mlib_duration(TIMEOUT, ms)); mongoc_async_run(async); /* it should have taken at least 100ms to finish. */ ASSERT_CMPINT64(bson_get_monotonic_time() - start, >, (int64_t)(100 * 1000)); BSON_ASSERT(stream_with_result.finished); bson_destroy(&hello_cmd); mongoc_stream_destroy(stream_with_result.stream); mongoc_async_destroy(async); mock_server_destroy(server); } void test_async_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Async/hello", test_hello); #if defined(MONGOC_ENABLE_SSL_OPENSSL) TestSuite_AddMockServerTest(suite, "/Async/hello_ssl", test_hello_ssl); #else /* Skip this test on OpenSSL since was having issues connecting. */ /* Skip on Windows until CDRIVER-3519 is resolved. */ TestSuite_AddFull(suite, "/Async/large_hello", test_large_hello, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_not_single, test_framework_skip_if_windows); #endif TestSuite_AddMockServerTest(suite, "/Async/delay", test_hello_delay); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-aws.c000066400000000000000000000344161511661753600234640ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language governing permissions and limitations under the * License. */ #include #include #include #include #include static void test_obtain_credentials(void *unused) { mongoc_uri_t *uri; _mongoc_aws_credentials_t creds; bool ret; bson_error_t error; BSON_UNUSED(unused); /* A username specified with a password is parsed correctly. */ uri = mongoc_uri_new_with_error("mongodb://access_key_id:secret_access_key@localhost/?authMechanism=MONGODB-AWS", &error); ASSERT_OR_PRINT(uri, error); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR(creds.access_key_id, "access_key_id"); ASSERT_CMPSTR(creds.secret_access_key, "secret_access_key"); ASSERT_CMPSTR(creds.session_token, NULL); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* A username specified with no password is an error. */ uri = mongoc_uri_new_with_error("mongodb://access_key_id:@localhost/?authMechanism=MONGODB-AWS", &error); ASSERT_OR_PRINT(uri, error); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "ACCESS_KEY_ID is set, but SECRET_ACCESS_KEY is missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* Password not set at all (not empty string) */ uri = mongoc_uri_new_with_error("mongodb://localhost/?authMechanism=MONGODB-AWS", &error); ASSERT(mongoc_uri_set_username(uri, "access_key_id")); ASSERT_OR_PRINT(uri, error); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "ACCESS_KEY_ID is set, but SECRET_ACCESS_KEY is missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* A session token may be set through the AWS_SESSION_TOKEN auth mechanism * property */ uri = mongoc_uri_new_with_error("mongodb://access_key_id:secret_access_key@localhost/" "?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:token", &error); ASSERT_OR_PRINT(uri, error); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR(creds.access_key_id, "access_key_id"); ASSERT_CMPSTR(creds.secret_access_key, "secret_access_key"); ASSERT_CMPSTR(creds.session_token, "token"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* A session token in the URI with no username/password is an error. */ uri = mongoc_uri_new_with_error( "mongodb://localhost/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:token", &error); ASSERT_OR_PRINT(uri, error); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "AWS_SESSION_TOKEN is set, but ACCESS_KEY_ID and SECRET_ACCESS_KEY are missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); } static void test_obtain_credentials_from_env(void *unused) { mongoc_uri_t *uri; _mongoc_aws_credentials_t creds; bool ret; bson_error_t error; BSON_UNUSED(unused); /* "clear" environment variables by setting them to the empty string. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", ""); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", ""); _mongoc_setenv("AWS_SESSION_TOKEN", ""); /* Environment variables are used if username/password is not set. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", "access_key_id"); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", "secret_access_key"); uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-AWS")); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR(creds.access_key_id, "access_key_id"); ASSERT_CMPSTR(creds.secret_access_key, "secret_access_key"); ASSERT_CMPSTR(creds.session_token, NULL); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* Omitting one of the required environment variables is an error. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", "access_key_id"); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", ""); uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-AWS")); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "ACCESS_KEY_ID is set, but SECRET_ACCESS_KEY is missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* Omitting one of the required environment variables is an error. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", ""); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", "secret_access_key"); uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-AWS")); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "SECRET_ACCESS_KEY is set, but ACCESS_KEY_ID is missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* Only specifying the token is an error. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", ""); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", ""); _mongoc_setenv("AWS_SESSION_TOKEN", "token"); uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-AWS")); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "AWS_SESSION_TOKEN is set, but ACCESS_KEY_ID and SECRET_ACCESS_KEY are missing"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* But a session token in the environment is picked up. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", "access_key_id"); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", "secret_access_key"); _mongoc_setenv("AWS_SESSION_TOKEN", "token"); uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-AWS")); ret = _mongoc_aws_credentials_obtain(uri, &creds, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR(creds.access_key_id, "access_key_id"); ASSERT_CMPSTR(creds.secret_access_key, "secret_access_key"); ASSERT_CMPSTR(creds.session_token, "token"); _mongoc_aws_credentials_cleanup(&creds); mongoc_uri_destroy(uri); /* "clear" environment variables by setting them to the empty string. */ _mongoc_setenv("AWS_ACCESS_KEY_ID", ""); _mongoc_setenv("AWS_SECRET_ACCESS_KEY", ""); _mongoc_setenv("AWS_SESSION_TOKEN", ""); } static void test_derive_region(void *unused) { bson_error_t error; char *region; bool ret; char *large; BSON_UNUSED(unused); #define WITH_LEN(s) s, strlen(s) ret = _mongoc_validate_and_derive_region(WITH_LEN("abc..def"), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: empty part"); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("."), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: empty part"); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("..."), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: empty part"); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("first."), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: empty part"); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("sts.amazonaws.com"), ®ion, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR("us-east-1", region); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("first.second"), ®ion, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR("second", region); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN("first"), ®ion, &error); ASSERT_OR_PRINT(ret, error); ASSERT_CMPSTR("us-east-1", region); bson_free(region); ret = _mongoc_validate_and_derive_region(WITH_LEN(""), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: empty"); bson_free(region); large = bson_malloc0(257); memset(large, 'a', 256); ret = _mongoc_validate_and_derive_region(large, strlen(large), ®ion, &error); ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Invalid STS host: too large"); bson_free(region); bson_free(large); #undef WITH_LEN } // test_aws_cache unit tests the _mongoc_aws_credentials_cache_t. It does not // require libmongoc to be built with MONGOC_ENABLE_MONGODB_AWS_AUTH. static void test_aws_cache(void *unused) { BSON_UNUSED(unused); _mongoc_aws_credentials_t valid_creds = MONGOC_AWS_CREDENTIALS_INIT; valid_creds.access_key_id = bson_strdup("access_key_id"); valid_creds.secret_access_key = bson_strdup("secret_access_key"); valid_creds.session_token = bson_strdup("session_token"); // Set expiration to one minute from now. valid_creds.expiration.set = true; valid_creds.expiration.value = mlib_expires_after(mlib_duration(1, mn)); _mongoc_aws_credentials_t expired_creds = MONGOC_AWS_CREDENTIALS_INIT; expired_creds.access_key_id = bson_strdup("access_key_id"); expired_creds.secret_access_key = bson_strdup("secret_access_key"); expired_creds.session_token = bson_strdup("session_token"); // Set expiration to one minute before. expired_creds.expiration.set = true; expired_creds.expiration.value = mlib_expires_after(mlib_duration(-1, mn)); _mongoc_aws_credentials_cache_t *cache = &mongoc_aws_credentials_cache; _mongoc_aws_credentials_cache_clear(); // Expect `get` to return nothing initially. { _mongoc_aws_credentials_t got = MONGOC_AWS_CREDENTIALS_INIT; bool found = _mongoc_aws_credentials_cache_get(&got); ASSERT(!found); } // Expect `get` to return after valid credentials are added with `put`. { _mongoc_aws_credentials_t got = MONGOC_AWS_CREDENTIALS_INIT; _mongoc_aws_credentials_cache_put(&valid_creds); bool found = _mongoc_aws_credentials_cache_get(&got); ASSERT(found); ASSERT_CMPSTR(got.access_key_id, valid_creds.access_key_id); ASSERT_CMPSTR(got.secret_access_key, valid_creds.secret_access_key); ASSERT_CMPSTR(got.session_token, valid_creds.session_token); _mongoc_aws_credentials_cleanup(&got); } // Expect `clear` to clear cached credentials. { _mongoc_aws_credentials_t got = MONGOC_AWS_CREDENTIALS_INIT; _mongoc_aws_credentials_cache_put(&valid_creds); _mongoc_aws_credentials_cache_clear(); bool found = _mongoc_aws_credentials_cache_get(&got); ASSERT(!found); } // Expect expired credentials are not added to cache. { _mongoc_aws_credentials_t got = MONGOC_AWS_CREDENTIALS_INIT; _mongoc_aws_credentials_cache_put(&expired_creds); bool found = _mongoc_aws_credentials_cache_get(&got); ASSERT(!found); } // Expect credentials that expire are not returned from cache. { _mongoc_aws_credentials_t got = MONGOC_AWS_CREDENTIALS_INIT; _mongoc_aws_credentials_cache_put(&valid_creds); bool found = _mongoc_aws_credentials_cache_get(&got); ASSERT(found); // Manually expire the credentials. cache->cached.value.expiration.value = expired_creds.expiration.value; found = _mongoc_aws_credentials_cache_get(&got); ASSERT(!found); _mongoc_aws_credentials_cleanup(&got); } _mongoc_aws_credentials_cache_clear(); _mongoc_aws_credentials_cleanup(&expired_creds); _mongoc_aws_credentials_cleanup(&valid_creds); } void test_aws_install(TestSuite *suite) { TestSuite_AddFull(suite, "/aws/obtain_credentials", test_obtain_credentials, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_aws); TestSuite_AddFull(suite, "/aws/obtain_credentials_from_env", test_obtain_credentials_from_env, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_aws, test_framework_skip_if_no_setenv); TestSuite_AddFull( suite, "/aws/derive_region", test_derive_region, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_aws); TestSuite_AddFull( suite, "/aws/cache", test_aws_cache, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_aws); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-background-monitoring.c000066400000000000000000001233051511661753600271700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { uint32_t n_heartbeat_started; uint32_t n_heartbeat_succeeded; uint32_t n_heartbeat_failed; uint32_t n_server_changed; mongoc_topology_description_type_t td_type; mongoc_server_description_type_t sd_type; bool awaited; } tf_observations_t; typedef enum { TF_FAST_HEARTBEAT = 1 << 0, TF_FAST_MIN_HEARTBEAT = 1 << 1, TF_AUTO_RESPOND_POLLING_HELLO = 1 << 2, TF_NO_MONGODB_API_VERSION = 1 << 3, /* if set, do not pick up the MONGODB_API_VERSION environment variable */ } tf_flags_t; typedef struct { tf_flags_t flags; mock_server_t *server; mongoc_client_pool_t *pool; mongoc_client_t *client; tf_observations_t *observations; bson_mutex_t mutex; mongoc_cond_t cond; mcommon_string_append_t logs; } test_fixture_t; void tf_dump(test_fixture_t *tf) { printf("== Begin dump ==\n"); printf("-- Current observations --\n"); printf("n_heartbeat_started=%" PRIu32 "\n", tf->observations->n_heartbeat_started); printf("n_heartbeat_succeeded=%" PRIu32 "\n", tf->observations->n_heartbeat_succeeded); printf("n_heartbeat_failed=%" PRIu32 "\n", tf->observations->n_heartbeat_failed); printf("n_server_changed=%" PRIu32 "\n", tf->observations->n_server_changed); printf("sd_type=%d\n", (int)tf->observations->sd_type); printf("-- Test fixture logs --\n"); printf("%s", mcommon_str_from_append(&tf->logs)); printf("== End dump ==\n"); } void BSON_GNUC_PRINTF(2, 3) tf_log(test_fixture_t *tf, const char *format, ...) { va_list ap; char nowstr[32]; struct timeval tv; struct tm tt; time_t t; bson_gettimeofday(&tv); t = tv.tv_sec; #ifdef _WIN32 #ifdef _MSC_VER localtime_s(&tt, &t); #else tt = *(localtime(&t)); #endif #else localtime_r(&t, &tt); #endif strftime(nowstr, sizeof nowstr, "%Y/%m/%d %H:%M:%S ", &tt); mcommon_string_append(&tf->logs, nowstr); va_start(ap, format); mcommon_string_append_vprintf(&tf->logs, format, ap); va_end(ap); mcommon_string_append(&tf->logs, "\n"); } #define TF_LOG(_tf, ...) tf_log(_tf, __VA_ARGS__) static void _heartbeat_started(const mongoc_apm_server_heartbeat_started_t *event) { test_fixture_t *tf; tf = (test_fixture_t *)mongoc_apm_server_heartbeat_started_get_context(event); bson_mutex_lock(&tf->mutex); tf->observations->n_heartbeat_started++; tf->observations->awaited = mongoc_apm_server_heartbeat_started_get_awaited(event); TF_LOG(tf, "%s heartbeat started", tf->observations->awaited ? "awaitable" : "polling"); mongoc_cond_broadcast(&tf->cond); bson_mutex_unlock(&tf->mutex); } static void _heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { test_fixture_t *tf; tf = (test_fixture_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); bson_mutex_lock(&tf->mutex); tf->observations->n_heartbeat_succeeded++; tf->observations->awaited = mongoc_apm_server_heartbeat_succeeded_get_awaited(event); TF_LOG(tf, "%s heartbeat succeeded", tf->observations->awaited ? "awaitable" : "polling"); mongoc_cond_broadcast(&tf->cond); bson_mutex_unlock(&tf->mutex); } static void _heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *event) { test_fixture_t *tf; tf = (test_fixture_t *)mongoc_apm_server_heartbeat_failed_get_context(event); bson_mutex_lock(&tf->mutex); tf->observations->n_heartbeat_failed++; tf->observations->awaited = mongoc_apm_server_heartbeat_failed_get_awaited(event); TF_LOG(tf, "%s heartbeat failed", tf->observations->awaited ? "awaitable" : "polling"); mongoc_cond_broadcast(&tf->cond); bson_mutex_unlock(&tf->mutex); } static void _server_changed(const mongoc_apm_server_changed_t *event) { test_fixture_t *tf; const mongoc_server_description_t *old_sd; const mongoc_server_description_t *new_sd; tf = (test_fixture_t *)mongoc_apm_server_changed_get_context(event); old_sd = mongoc_apm_server_changed_get_previous_description(event); new_sd = mongoc_apm_server_changed_get_new_description(event); bson_mutex_lock(&tf->mutex); TF_LOG( tf, "server changed %s => %s", mongoc_server_description_type(old_sd), mongoc_server_description_type(new_sd)); tf->observations->sd_type = new_sd->type; tf->observations->n_server_changed++; mongoc_cond_broadcast(&tf->cond); bson_mutex_unlock(&tf->mutex); } #define TV "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }" bool auto_respond_polling_hello(request_t *request, void *ctx) { BSON_UNUSED(ctx); if (0 == strcasecmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) || 0 == strcmp(request->command_name, "hello")) { const bson_t *doc; doc = request_get_doc((request), 0); if (!bson_has_field(doc, "topologyVersion")) { reply_to_request_simple(request, "{'ok': 1, 'topologyVersion': " TV " }"); request_destroy(request); return true; } } return false; } #define FAST_HEARTBEAT_MS 10 test_fixture_t * tf_new(tf_flags_t flags) { mongoc_apm_callbacks_t *callbacks; test_fixture_t *tf; tf = bson_malloc0(sizeof(test_fixture_t)); tf->observations = bson_malloc0(sizeof(tf_observations_t)); bson_mutex_init(&tf->mutex); mongoc_cond_init(&tf->cond); callbacks = mongoc_apm_callbacks_new(); tf->server = mock_server_new(); mock_server_run(tf->server); mongoc_apm_set_server_heartbeat_started_cb(callbacks, _heartbeat_started); mongoc_apm_set_server_changed_cb(callbacks, _server_changed); mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, _heartbeat_succeeded); mongoc_apm_set_server_heartbeat_failed_cb(callbacks, _heartbeat_failed); if (flags & TF_NO_MONGODB_API_VERSION) { tf->pool = mongoc_client_pool_new(mock_server_get_uri(tf->server)); } else { tf->pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(tf->server), NULL); } mongoc_client_pool_set_apm_callbacks(tf->pool, callbacks, tf); mongoc_apm_callbacks_destroy(callbacks); if (flags & TF_FAST_HEARTBEAT) { mc_tpld_modification tdmod = mc_tpld_modify_begin(_mongoc_client_pool_get_topology(tf->pool)); tdmod.new_td->heartbeat_msec = FAST_HEARTBEAT_MS; mc_tpld_modify_commit(tdmod); /* A fast heartbeat implies a fast min heartbeat. */ flags |= TF_FAST_MIN_HEARTBEAT; } if (flags & TF_FAST_MIN_HEARTBEAT) { _mongoc_client_pool_get_topology(tf->pool)->min_heartbeat_frequency_msec = FAST_HEARTBEAT_MS; } if (flags & TF_AUTO_RESPOND_POLLING_HELLO) { mock_server_autoresponds(tf->server, auto_respond_polling_hello, NULL, NULL); } tf->flags = flags; mcommon_string_new_as_append(&tf->logs); tf->client = mongoc_client_pool_pop(tf->pool); return tf; } void tf_destroy(test_fixture_t *tf) { mock_server_destroy(tf->server); mongoc_client_pool_push(tf->pool, tf->client); mongoc_client_pool_destroy(tf->pool); mcommon_string_from_append_destroy(&tf->logs); bson_mutex_destroy(&tf->mutex); mongoc_cond_destroy(&tf->cond); bson_free(tf->observations); bson_free(tf); } /* Wait for _predicate to become true over the next five seconds. * _predicate is only tested when observations change. * Upon failure, dumps logs and observations. */ #define OBSERVE_SOON(_tf, _predicate) \ do { \ int64_t _start_ms = bson_get_monotonic_time() / 1000; \ int64_t _expires_ms = _start_ms + 5000; \ bson_mutex_lock(&_tf->mutex); \ while (!(_predicate)) { \ if (bson_get_monotonic_time() / 1000 > _expires_ms) { \ bson_mutex_unlock(&_tf->mutex); \ tf_dump(_tf); \ test_error("Predicate expired: %s", #_predicate); \ } \ mongoc_cond_timedwait(&_tf->cond, &_tf->mutex, _expires_ms - _start_ms); \ } \ bson_mutex_unlock(&_tf->mutex); \ } while (0) /* Check that _predicate is true immediately. Upon failure, * dumps logs and observations. */ #define OBSERVE(_tf, _predicate) \ do { \ bson_mutex_lock(&_tf->mutex); \ if (!(_predicate)) { \ tf_dump(_tf); \ bson_mutex_unlock(&_tf->mutex); \ test_error("Predicate failed: %s", #_predicate); \ } \ bson_mutex_unlock(&_tf->mutex); \ } while (0) /* Wait for two periods of the faster heartbeat. * Used to make observations that a scan doesn't occur when a test fixture is * configured with a faster heartbeat. */ #define WAIT_TWO_MIN_HEARTBEAT_MS() mlib_sleep_for((FAST_HEARTBEAT_MS, ms), mul, 2) static void _signal_shutdown(test_fixture_t *tf) { mc_tpld_modification tdmod = mc_tpld_modify_begin(tf->client->topology); /* Ignore the "Last server removed from topology" warning. */ capture_logs(true); /* remove the server description from the topology description. */ mongoc_topology_description_reconcile(tdmod.new_td, &tf->client->topology->log_and_monitor, NULL); capture_logs(false); /* remove the server monitor from the set of server monitors. */ _mongoc_topology_background_monitoring_reconcile(tf->client->topology, tdmod.new_td); mc_tpld_modify_commit(tdmod); } static void _add_server_monitor(test_fixture_t *tf) { uint32_t id; const mongoc_uri_t *uri; mc_tpld_modification tdmod = mc_tpld_modify_begin(tf->client->topology); uri = mock_server_get_uri(tf->server); /* remove the server description from the topology description. */ mongoc_topology_description_add_server( tdmod.new_td, &tf->client->topology->log_and_monitor, mongoc_uri_get_hosts(uri)->host_and_port, &id); /* add the server monitor from the set of server monitors. */ _mongoc_topology_background_monitoring_reconcile(tf->client->topology, tdmod.new_td); mc_tpld_modify_commit(tdmod); } static void _request_scan(test_fixture_t *tf) { bson_mutex_lock(&tf->client->topology->tpld_modification_mtx); _mongoc_topology_request_scan(tf->client->topology); bson_mutex_unlock(&tf->client->topology->tpld_modification_mtx); } static void _request_cancel(test_fixture_t *tf) { bson_mutex_lock(&tf->client->topology->tpld_modification_mtx); /* Assume server id is 1. */ _mongoc_topology_background_monitoring_cancel_check(tf->client->topology, 1); bson_mutex_unlock(&tf->client->topology->tpld_modification_mtx); } void test_connect_succeeds(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_NO_MONGODB_API_VERSION); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); OBSERVE(tf, !tf->observations->awaited); tf_destroy(tf); } void test_connect_faas_use_polling(void) { test_fixture_t *tf; mongoc_handshake_t *md = _mongoc_handshake_get(); md->env = MONGOC_HANDSHAKE_ENV_AWS; /* This mock server will not respond to streaming hello, so OBSERVE_SOON will timeout if the server monitor doesn't detect ENV_AWS and switch to polling */ tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE(tf, !tf->observations->awaited); tf_destroy(tf); md->env = MONGOC_HANDSHAKE_ENV_NONE; } void test_connect_hangup(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_NO_MONGODB_API_VERSION); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); OBSERVE(tf, !tf->observations->awaited); reply_to_request_with_hang_up(request); request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 0); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); OBSERVE(tf, !tf->observations->awaited); /* No retry occurs since the server was never discovered. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); tf_destroy(tf); } void test_connect_badreply(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_NO_MONGODB_API_VERSION); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_simple(request, "{'ok': 0}"); request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 0); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); /* Expect a ServerDescriptionChanged event, since it now has an error. */ OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* No retry occurs since the server was never discovered. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); tf_destroy(tf); } void test_connect_shutdown(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_NO_MONGODB_API_VERSION); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_started == 1); /* Before the server replies, signal the server monitor to shutdown. */ _signal_shutdown(tf); /* Reply (or hang up) so the request does not wait for connectTimeoutMS to * time out. */ reply_to_request_with_ok_and_destroy(request); /* Heartbeat succeeds, but server description is not updated. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 0); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); tf_destroy(tf); } void test_connect_requestscan(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_NO_MONGODB_API_VERSION); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); /* Before the mock server replies, request a scan. */ _request_scan(tf); reply_to_request_with_ok_and_destroy(request); /* Because the request occurred during the scan, no subsequent scan occurs. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); OBSERVE(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE(tf, tf->observations->n_server_changed == 1); OBSERVE(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); tf_destroy(tf); } void test_retry_succeeds(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_FAST_MIN_HEARTBEAT | TF_NO_MONGODB_API_VERSION); /* Initial discovery occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); /* Heartbeat succeeds, but server description is not updated. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Request a scan to speed things up. */ _request_scan(tf); /* The next hello occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_request_with_hang_up(request); request_destroy(request); /* Server is marked as unknown, but not for long. Next scan is immediate. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* Retry occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 3); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); tf_destroy(tf); } void test_retry_hangup(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_FAST_MIN_HEARTBEAT | TF_NO_MONGODB_API_VERSION); /* Initial discovery occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); /* Heartbeat succeeds, but server description is not updated. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Request a scan to speed things up. */ _request_scan(tf); /* The next hello occurs (due to fast heartbeat). */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_request_with_hang_up(request); request_destroy(request); /* Server is marked as unknown. Next scan is immediate. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* Retry occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 3); reply_to_request_with_hang_up(request); request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); tf_destroy(tf); } void test_retry_badreply(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_FAST_MIN_HEARTBEAT | TF_NO_MONGODB_API_VERSION); /* Initial discovery occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); /* Heartbeat succeeds, but server description is not updated. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Request a scan to speed things up. */ _request_scan(tf); /* The next hello occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_request_with_hang_up(request); request_destroy(request); /* Server is marked unknown. Next scan is immediate. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* Retry occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 3); reply_to_request_simple(request, "{'ok': 0}"); request_destroy(request); /* Heartbeat fails. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); tf_destroy(tf); } void test_retry_shutdown(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_FAST_HEARTBEAT | TF_NO_MONGODB_API_VERSION); /* Initial discovery occurs. */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); /* Heartbeat succeeds, but server description is not updated. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* The next hello occurs (due to fast heartbeat). */ request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); _signal_shutdown(tf); reply_to_request_with_ok_and_destroy(request); /* No retry occurs. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); OBSERVE(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); tf_destroy(tf); } /* Test a server monitor being added and removed repeatedly. */ static void test_flip_flop(void) { test_fixture_t *tf; request_t *request; int i; tf = tf_new(TF_NO_MONGODB_API_VERSION); for (i = 1; i < 100; i++) { request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); reply_to_request_with_ok_and_destroy(request); _signal_shutdown(tf); OBSERVE_SOON(tf, mlib_cmp(tf->observations->n_heartbeat_started, ==, i)); OBSERVE_SOON(tf, mlib_cmp(tf->observations->n_heartbeat_succeeded, ==, i)); _add_server_monitor(tf); } tf_destroy(tf); } static void test_repeated_requestscan(void) { test_fixture_t *tf; request_t *request; int i; /* Multiple repeated requests before a hello completes should not cause a * subsequent scan. */ tf = tf_new(TF_FAST_MIN_HEARTBEAT | TF_NO_MONGODB_API_VERSION); for (i = 0; i < 10; i++) { _request_scan(tf); } request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, request); for (i = 0; i < 10; i++) { _request_scan(tf); } WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); tf_destroy(tf); } static void test_sleep_after_scan(void) { test_fixture_t *tf; request_t *request; /* After handling a scan request */ tf = tf_new(TF_FAST_MIN_HEARTBEAT | TF_NO_MONGODB_API_VERSION); _request_scan(tf); request = mock_server_receives_legacy_hello(tf->server, NULL); OBSERVE(tf, tf->observations->n_heartbeat_started == 1); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); WAIT_TWO_MIN_HEARTBEAT_MS(); /* No subsequent command send. */ OBSERVE(tf, tf->observations->n_heartbeat_started == 1); tf_destroy(tf); } static void test_streaming_succeeds(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); OBSERVE(tf, tf->observations->awaited); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); OBSERVE(tf, tf->observations->awaited); tf_destroy(tf); } static void test_streaming_hangup(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); OBSERVE(tf, tf->observations->awaited); reply_to_request_with_hang_up(request); request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); /* Due to network error, server monitor immediately proceeds and performs * handshake. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Because of the transition to Unknown, then back to Standalone, three * server changed events occurred. */ OBSERVE_SOON(tf, tf->observations->n_server_changed == 3); tf_destroy(tf); } static void test_streaming_badreply(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_request_simple(request, "{'ok': 0}"); request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* Request an immediate scan to trigger the next polling hello. */ _request_scan(tf); /* The auto responder will handle the polling hello. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 3); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); tf_destroy(tf); } static void test_streaming_shutdown(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO | TF_FAST_HEARTBEAT); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); _signal_shutdown(tf); /* This should cancel the hello immediately. */ WAIT_TWO_MIN_HEARTBEAT_MS(); /* No further hello commands should be sent. */ OBSERVE(tf, tf->observations->n_heartbeat_started == 2); request_destroy(request); tf_destroy(tf); } static void test_streaming_cancel(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); _request_cancel(tf); /* This should cancel the hello immediately. */ request_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); /* The cancellation closes the connection and waits before creating a new * connection. Check that no new heartbeat was started. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); _request_scan(tf); /* The handshake will be handled by the auto responder. */ request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 4); reply_to_request_with_ok_and_destroy(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 3); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 2); tf_destroy(tf); } static void test_moretocome_succeeds(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); OBSERVE(tf, tf->observations->awaited); reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); OBSERVE(tf, tf->observations->awaited); /* Server monitor is still streaming replies. */ reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 3); OBSERVE(tf, tf->observations->awaited); /* Reply with no moretocome flag. */ reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 4); OBSERVE(tf, tf->observations->awaited); request_destroy(request); /* Server monitor immediately sends awaitable hello. */ request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_started == 5); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 4); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); OBSERVE(tf, tf->observations->awaited); request_destroy(request); tf_destroy(tf); } static void test_moretocome_hangup(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); OBSERVE(tf, tf->observations->awaited); reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); OBSERVE(tf, tf->observations->awaited); /* Server monitor is still streaming replies. */ reply_to_request_with_hang_up(request); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); /* Due to network error, server monitor immediately proceeds and performs * handshake. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 3); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Because of the transition to Unknown, then back to Standalone, three * server changed events occurred. */ OBSERVE_SOON(tf, tf->observations->n_server_changed == 3); request_destroy(request); tf_destroy(tf); } static void test_moretocome_badreply(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Server monitor is still streaming replies. */ reply_to_request_simple(request, "{'ok': 0}"); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 2); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_UNKNOWN); /* Server monitor sleeps for next poll. Request an immediate scan. */ _request_scan(tf); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 3); OBSERVE_SOON(tf, tf->observations->n_server_changed == 3); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); request_destroy(request); tf_destroy(tf); } static void test_moretocome_shutdown(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO | TF_FAST_HEARTBEAT); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Server monitor is still streaming replies. It may be reading, or it may be * processing the last reply. Requesting shutdown cancels. */ _signal_shutdown(tf); WAIT_TWO_MIN_HEARTBEAT_MS(); /* No further heartbeats are attempted. */ OBSERVE(tf, tf->observations->n_heartbeat_succeeded == 2); request_destroy(request); tf_destroy(tf); } static void test_moretocome_cancel(void) { test_fixture_t *tf; request_t *request; tf = tf_new(TF_AUTO_RESPOND_POLLING_HELLO); request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 2); reply_to_op_msg_request(request, MONGOC_MSG_MORE_TO_COME, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 0); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Server monitor is still streaming replies. */ _request_cancel(tf); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 2); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); request_destroy(request); /* The cancellation closes the connection and waits before creating a new * connection. Check that no new heartbeat was started. */ WAIT_TWO_MIN_HEARTBEAT_MS(); OBSERVE(tf, tf->observations->n_heartbeat_started == 3); _request_scan(tf); /* The handshake will be handled by the auto responder. */ /* Cancelling creates a new connection. */ OBSERVE_SOON(tf, tf->observations->n_heartbeat_started == 4); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 3); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); /* Server monitor sends a fresh awaitable hello. */ request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 5); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 4); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); request_destroy(request); /* Since the reply did not include moretocome, server monitor sends another. */ request = mock_server_receives_msg( tf->server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'topologyVersion': { '$exists': true}}")); OBSERVE(tf, request); OBSERVE(tf, tf->observations->n_heartbeat_started == 6); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1, 'topologyVersion': " TV "}")); OBSERVE_SOON(tf, tf->observations->n_heartbeat_succeeded == 5); OBSERVE_SOON(tf, tf->observations->n_heartbeat_failed == 1); OBSERVE_SOON(tf, tf->observations->n_server_changed == 1); OBSERVE_SOON(tf, tf->observations->sd_type == MONGOC_SERVER_STANDALONE); request_destroy(request); tf_destroy(tf); } void test_monitoring_install(TestSuite *suite) { /* Tests for initial connection. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/succeeds", test_connect_succeeds); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/faas_use_polling", test_connect_faas_use_polling); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/hangup", test_connect_hangup); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/badreply", test_connect_badreply); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/shutdown", test_connect_shutdown); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/connect/requestscan", test_connect_requestscan); /* Tests for retry. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/retry/succeeds", test_retry_succeeds); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/retry/hangup", test_retry_hangup); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/retry/badreply", test_retry_badreply); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/retry/shutdown", test_retry_shutdown); /* Tests for streaming. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/streaming/succeeds", test_streaming_succeeds); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/streaming/hangup", test_streaming_hangup); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/streaming/badreply", test_streaming_badreply); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/streaming/shutdown", test_streaming_shutdown); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/streaming/cancel", test_streaming_cancel); /* Tests for moretocome. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/moretocome/succeeds", test_moretocome_succeeds); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/moretocome/hangup", test_moretocome_hangup); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/moretocome/badreply", test_moretocome_badreply); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/moretocome/shutdown", test_moretocome_shutdown); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/moretocome/cancel", test_moretocome_cancel); /* Test flip flopping. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/flip_flop", test_flip_flop); /* Test repeated scan requests. */ TestSuite_AddMockServerTest(suite, "/server_monitor_thread/repeated_requestscan", test_repeated_requestscan); TestSuite_AddMockServerTest(suite, "/server_monitor_thread/sleep_after_scan", test_sleep_after_scan); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-buffer.c000066400000000000000000000017051511661753600241360ustar00rootroot00000000000000#include #include #include #include static void test_mongoc_buffer_basic(void) { mongoc_stream_t *stream; mongoc_buffer_t buf; bson_error_t error = {0}; uint8_t *data = (uint8_t *)bson_malloc0(1024); ssize_t r; stream = mongoc_stream_file_new_for_path(BINARY_DIR "/reply1.dat", O_RDONLY, 0); ASSERT(stream); _mongoc_buffer_init(&buf, data, 1024, NULL, NULL); r = _mongoc_buffer_fill(&buf, stream, 537, 0, &error); ASSERT_CMPINT((int)r, ==, -1); r = _mongoc_buffer_fill(&buf, stream, 536, 0, &error); ASSERT_CMPINT((int)r, ==, 536); ASSERT(buf.len == 536); _mongoc_buffer_destroy(&buf); _mongoc_buffer_destroy(&buf); _mongoc_buffer_destroy(&buf); _mongoc_buffer_destroy(&buf); mongoc_stream_destroy(stream); } void test_buffer_install(TestSuite *suite) { TestSuite_Add(suite, "/Buffer/Basic", test_mongoc_buffer_basic); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-bulk.c000066400000000000000000005160251511661753600236300ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include typedef void (*update_fn)(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, bool upsert); typedef bool (*update_with_opts_fn)(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *document, const bson_t *opts, bson_error_t *error); typedef bool (*remove_with_opts_fn)(mongoc_bulk_operation_t *bulk, const bson_t *selector, const bson_t *opts, bson_error_t *error); /*-------------------------------------------------------------------------- * * assert_write_error_count -- * * Check the length of a bulk operation reply's writeErrors. * * Returns: * None. * * Side effects: * Aborts if the array is the wrong length. * *-------------------------------------------------------------------------- */ static void assert_write_error_count(int len, const bson_t *reply) { bson_iter_t iter; bson_iter_t error_iter; int n = 0; BSON_ASSERT(bson_iter_init_find(&iter, reply, "writeErrors")); BSON_ASSERT(bson_iter_recurse(&iter, &error_iter)); while (bson_iter_next(&error_iter)) { n++; } ASSERT_CMPINT(len, ==, n); } /*-------------------------------------------------------------------------- * * assert_n_inserted -- * * Check a bulk operation reply's nInserted field. * * Returns: * None. * * Side effects: * Aborts if the field is incorrect. * *-------------------------------------------------------------------------- */ static void assert_n_inserted(int n, const bson_t *reply) { bson_iter_t iter; BSON_ASSERT(bson_iter_init_find(&iter, reply, "nInserted")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); ASSERT_CMPINT(n, ==, bson_iter_int32(&iter)); } /*-------------------------------------------------------------------------- * * oid_created_on_client -- * * Check that a document's _id contains this process's pid. * * Returns: * True or false. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static bool oid_created_on_client(const bson_t *doc) { bson_oid_t new_oid; const uint8_t *new_pid; bson_iter_t iter; const bson_oid_t *oid; const uint8_t *pid; bson_oid_init(&new_oid, NULL); new_pid = &new_oid.bytes[7]; bson_iter_init_find(&iter, doc, "_id"); if (!BSON_ITER_HOLDS_OID(&iter)) { return false; } oid = bson_iter_oid(&iter); pid = &oid->bytes[7]; return 0 == memcmp(pid, new_pid, 2); } static void create_unique_index(mongoc_collection_t *collection) { bson_error_t error; mongoc_index_model_t *im = mongoc_index_model_new(tmp_bson("{'a': 1}"), tmp_bson("{'unique': true}")); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); mongoc_index_model_destroy(im); } static void test_bulk(void) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t child; bson_t del; bson_t up; bson_t doc = BSON_INITIALIZER; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_bulk"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, &doc); mongoc_bulk_operation_insert(bulk, &doc); mongoc_bulk_operation_insert(bulk, &doc); mongoc_bulk_operation_insert(bulk, &doc); bson_init(&up); bson_append_document_begin(&up, "$set", -1, &child); BSON_APPEND_INT32(&child, HANDSHAKE_CMD_LEGACY_HELLO, 123); bson_append_document_end(&up, &child); mongoc_bulk_operation_update(bulk, &doc, &up, false); bson_destroy(&up); bson_init(&del); BSON_APPEND_INT32(&del, HANDSHAKE_CMD_LEGACY_HELLO, 123); mongoc_bulk_operation_remove(bulk, &del); bson_destroy(&del); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 4," " 'nMatched': 4," " 'nModified': 4," " 'nRemoved': 4," " 'nUpserted': 0," " 'writeErrors': []}"); ASSERT_COUNT(0, collection); bson_destroy(&reply); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&doc); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_opt(const char *opts_json, const char *msg) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_bulk"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson(opts_json)); BSON_ASSERT(bulk); BSON_ASSERT(!mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, msg); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_opts(void) { _test_opt("{'foo': 1}", "Invalid option 'foo'"); _test_opt("{'writeConcern': 1}", "Invalid writeConcern"); _test_opt("{'writeConcern': {'w': 0, 'j': 1}}", "Invalid writeConcern"); _test_opt("{'sessionId': 'hi'}", "Invalid sessionId"); _test_opt("{'sessionId': 101}", "Invalid sessionId"); _test_opt("{'ordered': 'yes'}", "Invalid field \"ordered\" in opts, should contain bool"); } static void test_bulk_error(void) { bson_t reply = {0}; bson_error_t error; mongoc_bulk_operation_t *bulk; mock_server_t *mock_server; mongoc_client_t *client; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_client(bulk, client); BSON_ASSERT(!mongoc_bulk_operation_execute(bulk, &reply, &error)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_COMMAND_INVALID_ARG); /* reply was initialized */ ASSERT_CMPUINT32(reply.len, ==, (uint32_t)5); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_bulk_error_unordered(void) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; request_t *request; future_t *future; int i; mongoc_uri_t *uri; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); uri = mongoc_uri_copy(mock_server_get_uri(mock_server)); mongoc_uri_set_option_as_int32(uri, "sockettimeoutms", 500); client = test_framework_client_new_from_uri(uri, NULL); mongoc_uri_destroy(uri); collection = mongoc_client_get_collection(client, "test", "test"); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); for (i = 0; i <= 2048; i++) { mongoc_bulk_operation_update_many_with_opts( bulk, tmp_bson("{'hello': 'earth'}"), tmp_bson("{'$set': {'hello': 'world'}}"), NULL, &error); } future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_bulk_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'update': 'test'," " 'writeConcern': {'$exists': false}," " 'ordered': false}"), tmp_bson("{'q': {'hello': 'earth'}," " 'u': {'$set': {'hello': 'world'}}," " 'upsert': false," " 'multi': true}"), 1001); reply_to_request_simple(request, "{ 'ok' : 1, 'n' : 5 }"); request_destroy(request); request = mock_server_receives_bulk_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'update': 'test'," " 'writeConcern': {'$exists': false}," " 'ordered': false}"), tmp_bson("{'q': {'hello': 'earth'}," " 'u': {'$set': {'hello': 'world'}}," " 'upsert': false," " 'multi': true}"), 1001); request_destroy(request); mock_server_destroy(mock_server); future_wait_max(future, 100); ASSERT(!future_value_get_uint32_t(&future->return_value)); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 5," " 'nRemoved': 0," " 'nUpserted': 0}"); bson_destroy(&reply); bson_destroy(&opts); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert(bool ordered) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t opts = BSON_INITIALIZER; bson_t doc = BSON_INITIALIZER; bson_t query = BSON_INITIALIZER; mongoc_cursor_t *cursor; const bson_t *inserted_doc; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_insert"); BSON_ASSERT(collection); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); BSON_ASSERT(bulk->flags.ordered == ordered); mongoc_bulk_operation_insert(bulk, &doc); mongoc_bulk_operation_insert(bulk, &doc); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0}"); bson_destroy(&reply); ASSERT_COUNT(2, collection); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); BSON_ASSERT(cursor); while (mongoc_cursor_next(cursor, &inserted_doc)) { BSON_ASSERT(oid_created_on_client(inserted_doc)); } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_cursor_destroy(cursor); bson_destroy(&query); bson_destroy(&opts); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&doc); } static void test_insert_ordered(void) { test_insert(true); } static void test_insert_unordered(void) { test_insert(false); } static void test_insert_check_keys(void) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t reply; bson_error_t error; bool r; capture_logs(true); client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_insert_check_keys"); BSON_ASSERT(collection); /* keys cannot be empty */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson("{'': 1}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty string"); BSON_ASSERT(bson_empty(&reply)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); /* valid, then invalid */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson(NULL)); mongoc_bulk_operation_insert(bulk, tmp_bson("{'': 1}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty string"); BSON_ASSERT(bson_empty(&reply)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_upsert(bool ordered) { bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t *sel; bson_t *doc; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_upsert"); BSON_ASSERT(collection); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); sel = tmp_bson("{'_id': 1234}"); doc = tmp_bson("{'$set': {'hello': 'there'}}"); mongoc_bulk_operation_update(bulk, sel, doc, true); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 1," " 'upserted': [{'index': 0, '_id': 1234}]," " 'writeErrors': []}"); ASSERT_COUNT(1, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); /* non-upsert, no matches */ sel = tmp_bson("{'_id': 2}"); doc = tmp_bson("{'$set': {'hello': 'there'}}"); mongoc_bulk_operation_update(bulk, sel, doc, false); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'upserted': {'$exists': false}," " 'writeErrors': []}"); ASSERT_COUNT(1, collection); /* doc remains from previous operation */ ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_upsert_ordered(void) { test_upsert(true); } static void test_upsert_unordered(void) { test_upsert(false); } static void test_upsert_unordered_oversized(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t *u; bool r; bson_error_t error; bson_t reply; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "upsert_oversized"); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* much too large */ u = tmp_bson("{'$set': {'x': '%s', 'y': '%s'}}", huge_string(client), huge_string(client)); r = mongoc_bulk_operation_update_one_with_opts(bulk, tmp_bson(NULL), u, tmp_bson("{'upsert': true}"), &error); ASSERT_OR_PRINT(r, error); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Document 0 is too large"); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': []}"); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_upserted_index(bool ordered) { bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t *emp = tmp_bson("{}"); bson_t *inc = tmp_bson("{'$inc': {'b': 1}}"); bool r; BSON_UNUSED(ordered); client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_upserted_index"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, emp); mongoc_bulk_operation_insert(bulk, emp); mongoc_bulk_operation_remove(bulk, tmp_bson("{'i': 2}")); mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 3}"), inc, false); /* upsert */ mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 4}"), inc, true); mongoc_bulk_operation_remove(bulk, tmp_bson("{'i': 5}")); mongoc_bulk_operation_remove_one(bulk, tmp_bson("{'i': 6}")); mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 7}"), emp, false); /* upsert */ mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 8}"), emp, true); /* upsert */ mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 9}"), emp, true); mongoc_bulk_operation_remove(bulk, tmp_bson("{'i': 10}")); mongoc_bulk_operation_insert(bulk, emp); mongoc_bulk_operation_insert(bulk, emp); mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 13}"), inc, false); /* upsert */ mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 14}"), inc, true); mongoc_bulk_operation_insert(bulk, emp); /* upserts */ mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 16}"), inc, true); mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 17}"), inc, true); /* non-upsert */ mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 18}"), inc, false); /* upserts */ mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 19}"), inc, true); mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 20}"), emp, true); mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 21}"), emp, true); mongoc_bulk_operation_replace_one(bulk, tmp_bson("{'i': 22}"), emp, true); mongoc_bulk_operation_update(bulk, tmp_bson("{'i': 23}"), inc, true); /* non-upsert */ mongoc_bulk_operation_update_one(bulk, tmp_bson("{'i': 24}"), inc, false); /* upsert */ mongoc_bulk_operation_update_one(bulk, tmp_bson("{'i': 25}"), inc, true); /* non-upserts */ mongoc_bulk_operation_remove(bulk, tmp_bson("{'i': 26}")); mongoc_bulk_operation_remove(bulk, tmp_bson("{'i': 27}")); mongoc_bulk_operation_update_one(bulk, tmp_bson("{'i': 28}"), inc, false); mongoc_bulk_operation_update_one(bulk, tmp_bson("{'i': 29}"), inc, false); /* each update modifies existing 16 docs, but only increments index by one */ mongoc_bulk_operation_update(bulk, emp, inc, false); mongoc_bulk_operation_update(bulk, emp, inc, false); /* upsert */ mongoc_bulk_operation_update_one(bulk, tmp_bson("{'i': 32}"), inc, true); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); if (!r) { test_error("bulk failed: %s", error.message); } ASSERT_MATCH(&reply, "{'nInserted': 5," " 'nMatched': 34," " 'nModified': 34," " 'nRemoved': 0," " 'nUpserted': 13," " 'upserted': [" " {'index': 4}," " {'index': 8}," " {'index': 9}," " {'index': 14}," " {'index': 16}," " {'index': 17}," " {'index': 19}," " {'index': 20}," " {'index': 21}," " {'index': 22}," " {'index': 23}," " {'index': 25}," " {'index': 32}" " ]," " 'writeErrors': []}"); ASSERT_COUNT(18, collection); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_upserted_index_ordered(void) { test_upserted_index(true); } static void test_upserted_index_unordered(void) { test_upserted_index(false); } static void test_update_one(bool ordered) { bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t *sel; bson_t *doc; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_one"); BSON_ASSERT(collection); doc = bson_new(); r = mongoc_collection_insert_one(collection, doc, NULL, NULL, NULL); BSON_ASSERT(r); r = mongoc_collection_insert_one(collection, doc, NULL, NULL, NULL); BSON_ASSERT(r); bson_destroy(doc); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); sel = tmp_bson("{}"); doc = tmp_bson("{'$set': {'hello': 'there'}}"); mongoc_bulk_operation_update_one(bulk, sel, doc, true); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 1," " 'nModified': 1," " 'nRemoved': 0," " 'nUpserted': 0," " 'upserted': {'$exists': false}," " 'writeErrors': []}"); ASSERT_COUNT(2, collection); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_one_ordered(void) { test_update_one(true); } static void test_update_one_unordered(void) { test_update_one(false); } static void test_update_with_opts_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; update_with_opts_fn fns[] = { mongoc_bulk_operation_update_one_with_opts, mongoc_bulk_operation_update_many_with_opts, }; int i; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_with_opts_validate"); for (i = 0; i < 2; i++) { update_with_opts_fn update_function; update_function = fns[i]; bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(!update_function(bulk, tmp_bson("{}"), tmp_bson("{'a.a': 1}"), NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "update only works with $ operators"); BSON_ASSERT(update_function( bulk, tmp_bson("{}"), tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_NONE), &error)); BSON_ASSERT(!update_function( bulk, tmp_bson("{}"), tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid argument for update: Disallowed '.' in element key: \"a.a\""); mongoc_bulk_operation_destroy(bulk); /* Test a valid update_one with explicit validation on the server. */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(update_function(bulk, tmp_bson("{}"), tmp_bson("{'$set': {'a': 1}}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error)); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); } /* Tests that documents in `coll` found with `selector` all match `match` */ static void _test_docs_in_coll_matches(mongoc_collection_t *coll, bson_t *selector, const char *match, uint32_t expected_count) { const bson_t *next_doc; mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, selector, NULL, NULL); while (expected_count > 0) { ASSERT(mongoc_cursor_next(cursor, &next_doc)); if (match) { ASSERT_MATCH(next_doc, match); } --expected_count; } ASSERT_CMPINT(expected_count, ==, 0); mongoc_cursor_destroy(cursor); } static void test_update_arrayfilters(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t err; bson_t reply; bool ret = false; int i; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_arrayfilters"); BSON_ASSERT(collection); mongoc_collection_drop(collection, NULL); bson_append_bool(&opts, "ordered", 7, true); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); for (i = 1; i < 4; i++) { ret = mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'_id': %d, 'a': [{'x':1}, {'x':2}]}", i), NULL, &err); ASSERT_OR_PRINT(ret, err); } ret = mongoc_bulk_operation_update_one_with_opts(bulk, tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'a.$[i].x': 3}}"), tmp_bson("{'arrayFilters': [{'i.x': {'$gt': 1}}]}"), &err); ASSERT_OR_PRINT(ret, err); ret = mongoc_bulk_operation_update_many_with_opts(bulk, tmp_bson("{'_id': {'$gt': 1}}"), tmp_bson("{'$set': {'a.$[i].x': 4}}"), tmp_bson("{'arrayFilters': [{'i.x': {'$gt': 1}}]}"), &err); ASSERT_OR_PRINT(ret, err); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &err), err); ASSERT_MATCH(&reply, "{'nInserted': 3," " 'nMatched': 3," " 'nModified': 3," " 'nRemoved': 0," " 'nUpserted': 0," " 'upserted': {'$exists': false}," " 'writeErrors': []}"); bson_destroy(&reply); ASSERT_COUNT(3, collection); _test_docs_in_coll_matches(collection, tmp_bson("{'_id':1}"), "{'a': [{'x':1}, {'x':3}]}", 1); _test_docs_in_coll_matches(collection, tmp_bson("{'_id':2}"), "{'a': [{'x':1}, {'x':4}]}", 1); _test_docs_in_coll_matches(collection, tmp_bson("{'_id':3}"), "{'a': [{'x':1}, {'x':4}]}", 1); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &err), err); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_hint_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t err; bool ret; int i; update_with_opts_fn fns[] = { mongoc_bulk_operation_update_one_with_opts, mongoc_bulk_operation_update_many_with_opts, mongoc_bulk_operation_replace_one_with_opts, }; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_hint_err"); for (i = 0; i < 3; i++) { bson_t *document, *opts; if (fns[i] == mongoc_bulk_operation_replace_one_with_opts) { document = tmp_bson("{'x': 2}"); opts = tmp_bson("{'hint': 1}"); } else { document = tmp_bson("{'$set': {'x': 2}}"); opts = tmp_bson("{'hint': []}"); } bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); ret = fns[i](bulk, tmp_bson("{'_id': 1}"), document, opts, &err); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); mongoc_bulk_operation_destroy(bulk); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_delete_hint_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t err; bool ret; int i; remove_with_opts_fn fns[] = { mongoc_bulk_operation_remove_one_with_opts, mongoc_bulk_operation_remove_many_with_opts, }; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_delete_hint_err"); for (i = 0; i < 2; i++) { bson_t *opts; opts = tmp_bson("{'hint': []}"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); ret = fns[i](bulk, tmp_bson("{'_id': 1}"), opts, &err); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); mongoc_bulk_operation_destroy(bulk); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_replace_one(bool ordered) { bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t *sel; bson_t *doc; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_replace_one"); BSON_ASSERT(collection); doc = bson_new(); r = mongoc_collection_insert_one(collection, doc, NULL, NULL, NULL); BSON_ASSERT(r); r = mongoc_collection_insert_one(collection, doc, NULL, NULL, NULL); BSON_ASSERT(r); bson_destroy(doc); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); sel = tmp_bson("{}"); doc = tmp_bson("{'hello': 'there'}"); mongoc_bulk_operation_replace_one(bulk, sel, doc, true); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 1," " 'nModified': 1," " 'nRemoved': 0," " 'nUpserted': 0," " 'upserted': {'$exists': false}," " 'writeErrors': []}"); ASSERT_COUNT(2, collection); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_replace_one_check_keys(bool with_opts) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_replace_one_check_keys"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); if (with_opts) { /* rejected immediately */ r = mongoc_bulk_operation_replace_one_with_opts(bulk, tmp_bson("{}"), tmp_bson("{'$a': 1}"), NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '$a': replace prohibits $ operators"); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty bulk write"); } else { /* rejected during execute() */ capture_logs(true); mongoc_bulk_operation_replace_one(bulk, tmp_bson("{}"), tmp_bson("{'$a': 1}"), true); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '$a': replace prohibits $ operators"); } ASSERT(bson_empty(&reply)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_replace_one_check_keys(void) { _test_replace_one_check_keys(false); } static void test_replace_one_with_opts_check_keys(void) { _test_replace_one_check_keys(true); } static void test_replace_one_with_opts_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_replace_with_opts_validate"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(!mongoc_bulk_operation_replace_one_with_opts(bulk, tmp_bson("{}"), tmp_bson("{'$a': 1}"), NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '$a': replace prohibits $ operators"); BSON_ASSERT(!mongoc_bulk_operation_replace_one_with_opts( bulk, tmp_bson("{}"), tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid argument for replace: Disallowed '.' in element key: \"a.a\""); mongoc_bulk_operation_destroy(bulk); /* Test a valid replace_one with explicit validation on the server. */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(mongoc_bulk_operation_replace_one_with_opts( bulk, tmp_bson("{}"), tmp_bson("{'a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error)); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } /* * check that we include command overhead in msg size when deciding to split, * CDRIVER-1082 */ static void test_upsert_large(void *ctx) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t *selector = tmp_bson("{'_id': 'aaaaaaaaaa'}"); size_t sz = 8396692; /* a little over 8 MB */ char *large_str = bson_malloc(sz); bson_t update = BSON_INITIALIZER; bson_t child; bson_error_t error; int i; bson_t reply; BSON_UNUSED(ctx); memset(large_str, 'a', sz); large_str[sz - 1] = '\0'; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_upsert_large"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); bson_append_document_begin(&update, "$set", 4, &child); bson_append_utf8(&child, "big", 3, large_str, (int)sz - 1); bson_append_document_end(&update, &child); /* two 8MB+ docs could fit in 16MB + 16K, if not for command overhead, * check the driver splits into two msgs */ for (i = 0; i < 2; i++) { mongoc_bulk_operation_update(bulk, selector, &update, true); } ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 1," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 1," " 'upserted': [{'index': 0, '_id': 'aaaaaaaaaa'}]," " 'writeErrors': []}"); ASSERT_COUNT(1, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&update); bson_free(large_str); } static void test_upsert_huge(void *ctx) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t *sel = tmp_bson("{'_id': 1}"); bson_t doc = BSON_INITIALIZER; bson_t child; bson_t query = BSON_INITIALIZER; const bson_t *retdoc; bson_error_t error; bson_t reply; mongoc_cursor_t *cursor; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_upsert_huge"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); bson_append_document_begin(&doc, "$set", -1, &child); BSON_ASSERT(bson_append_utf8(&child, "x", -1, huge_string(client), (int)huge_string_length(client))); bson_append_document_end(&doc, &child); mongoc_bulk_operation_update(bulk, sel, &doc, true); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 1," " 'upserted': [{'index': 0, '_id': 1}]," " 'writeErrors': []}"); ASSERT_COUNT(1, collection); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); ASSERT_CURSOR_NEXT(cursor, &retdoc); ASSERT_CURSOR_DONE(cursor); bson_destroy(&child); bson_destroy(&query); bson_destroy(&reply); bson_destroy(&doc); mongoc_cursor_destroy(cursor); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_replace_one_ordered(void) { test_replace_one(true); } static void test_replace_one_unordered(void) { test_replace_one(false); } static void test_update(bool ordered) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t *docs_inserted[] = { tmp_bson("{'a': 1}"), tmp_bson("{'a': 2}"), tmp_bson("{'a': 3, 'foo': 'bar'}"), }; unsigned int i; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t reply; bson_t *sel; bson_t *bad_update_doc = tmp_bson("{'foo': 'bar'}"); bson_t *update_doc; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update"); BSON_ASSERT(collection); for (i = 0; i < sizeof docs_inserted / sizeof(bson_t *); i++) { BSON_ASSERT(mongoc_collection_insert_one(collection, docs_inserted[i], NULL, NULL, NULL)); } bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); /* an update doc without $-operators is rejected */ sel = tmp_bson("{'a': {'$gte': 2}}"); capture_logs(true); mongoc_bulk_operation_update(bulk, sel, bad_update_doc, false); BSON_ASSERT(!mongoc_bulk_operation_execute(bulk, &reply, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key 'foo': update only works with $ operators"); BSON_ASSERT(bson_empty(&reply)); mongoc_bulk_operation_destroy(bulk); bson_destroy(&reply); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); update_doc = tmp_bson("{'$set': {'foo': 'bar'}}"); mongoc_bulk_operation_update(bulk, sel, update_doc, false); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 2," " 'nModified': 1," " 'nRemoved': 0," " 'nUpserted': 0," " 'upserted': {'$exists': false}," " 'writeErrors': []}"); /* one doc already had "foo": "bar" */ ASSERT_COUNT(3, collection); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); bson_destroy(&reply); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_ordered(void) { test_update(true); } static void test_update_unordered(void) { test_update(false); } /* update document has key that doesn't start with "$" */ static void _test_update_check_keys(bool many, bool with_opts) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t *q = tmp_bson("{}"); bson_t *u = tmp_bson("{'a': 1}"); bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_check_keys"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); capture_logs(true); if (with_opts) { /* document is rejected immediately */ if (many) { r = mongoc_bulk_operation_update_many_with_opts(bulk, q, u, NULL, &error); } else { r = mongoc_bulk_operation_update_one_with_opts(bulk, q, u, NULL, &error); } BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key 'a': update only works with $ operators"); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty bulk"); } else { /* document rejected when bulk op is executed */ if (many) { mongoc_bulk_operation_update(bulk, q, u, false); } else { mongoc_bulk_operation_update_one(bulk, q, u, false); } r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key 'a': update only works with $ operators"); } BSON_ASSERT(bson_empty(&reply)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_one_check_keys(void) { _test_update_check_keys(false, false); } static void test_update_check_keys(void) { _test_update_check_keys(true, false); } static void test_update_one_with_opts_check_keys(void) { _test_update_check_keys(false, true); } static void test_update_many_with_opts_check_keys(void) { _test_update_check_keys(true, true); } typedef struct { const char *bad_update_json; const char *good_update_json; update_fn update; update_with_opts_fn update_with_opts; bool invalid_first; const char *error_message; } update_validate_test_t; static void _test_update_validate(update_validate_test_t *test) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t *q = tmp_bson("{}"); bson_t *bad_update = tmp_bson(test->bad_update_json); bson_t *good_update = tmp_bson(test->good_update_json); bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_invalid_first"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); capture_logs(true); if (test->update_with_opts) { if (test->invalid_first) { /* document is rejected immediately */ r = test->update_with_opts(bulk, q, bad_update, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, test->error_message); /* now a valid document */ r = test->update_with_opts(bulk, q, good_update, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!bson_empty(&reply)); } else { /* first a valid document */ r = test->update_with_opts(bulk, q, good_update, NULL, &error); ASSERT_OR_PRINT(r, error); /* invalid document is rejected without invalidating batch */ r = test->update_with_opts(bulk, q, bad_update, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, test->error_message); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!bson_empty(&reply)); } } else { if (test->invalid_first) { /* invalid, then valid */ test->update(bulk, q, bad_update, false); test->update(bulk, q, good_update, false); /* not added */ ASSERT_CMPSIZE_T((size_t)0, ==, bulk->commands.len); /* invalid document invalidated the whole bulk */ r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); BSON_ASSERT(bson_empty(&reply)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, test->error_message); } else { /* valid, then invalid */ test->update(bulk, q, good_update, false); test->update(bulk, q, bad_update, false); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); /* invalid document invalidated the whole bulk */ r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); BSON_ASSERT(bson_empty(&reply)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, test->error_message); } } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_update_one_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'a': 1}"; test.good_update_json = "{'$set': {'x': 1}}"; test.update = mongoc_bulk_operation_update_one; test.update_with_opts = NULL; test.invalid_first = first; test.error_message = "Invalid key 'a': update only works with $ operators"; _test_update_validate(&test); } static void _test_update_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'a': 1}"; test.good_update_json = "{'$set': {'x': 1}}"; test.update = mongoc_bulk_operation_update; test.update_with_opts = NULL; test.invalid_first = first; test.error_message = "Invalid key 'a': update only works with $ operators"; _test_update_validate(&test); } static void _test_update_one_with_opts_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'a': 1}"; test.good_update_json = "{'$set': {'x': 1}}"; test.update = NULL; test.update_with_opts = mongoc_bulk_operation_update_one_with_opts; test.invalid_first = first; test.error_message = "Invalid key 'a': update only works with $ operators"; _test_update_validate(&test); } static void _test_update_many_with_opts_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'a': 1}"; test.good_update_json = "{'$set': {'x': 1}}"; test.update = NULL; test.update_with_opts = mongoc_bulk_operation_update_many_with_opts; test.invalid_first = first; test.error_message = "Invalid key 'a': update only works with $ operators"; _test_update_validate(&test); } static void _test_replace_one_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'$set': {'x': 1}}"; test.good_update_json = "{'a': 1}"; test.update = mongoc_bulk_operation_replace_one; test.update_with_opts = NULL; test.invalid_first = first; test.error_message = "Invalid key '$set': replace prohibits $ operators"; _test_update_validate(&test); } static void _test_replace_one_with_opts_invalid(bool first) { update_validate_test_t test = {0}; test.bad_update_json = "{'$set': {'x': 1}}"; test.good_update_json = "{'a': 1}"; test.update = NULL; test.update_with_opts = mongoc_bulk_operation_replace_one_with_opts; test.invalid_first = first; test.error_message = "Invalid key '$set': replace prohibits $ operators"; _test_update_validate(&test); } static void test_update_one_invalid_first(void) { _test_update_one_invalid(true /* invalid first */); } static void test_update_invalid_first(void) { _test_update_invalid(true /* invalid first */); } static void test_update_one_with_opts_invalid_first(void) { _test_update_one_with_opts_invalid(true /* invalid first */); } static void test_update_many_with_opts_invalid_first(void) { _test_update_many_with_opts_invalid(true /* invalid first */); } static void test_replace_one_invalid_first(void) { _test_replace_one_invalid(true /* invalid first */); } static void test_replace_one_with_opts_invalid_first(void) { _test_replace_one_with_opts_invalid(true /* invalid first */); } static void test_update_one_invalid_second(void) { _test_update_one_invalid(false /* invalid first */); } static void test_update_invalid_second(void) { _test_update_invalid(false /* invalid first */); } static void test_update_one_with_opts_invalid_second(void) { _test_update_one_with_opts_invalid(false /* invalid first */); } static void test_update_many_with_opts_invalid_second(void) { _test_update_many_with_opts_invalid(false /* invalid first */); } static void test_replace_one_invalid_second(void) { _test_replace_one_invalid(false /* invalid first */); } static void test_replace_one_with_opts_invalid_second(void) { _test_replace_one_with_opts_invalid(false /* invalid first */); } static void _test_insert_invalid(bool with_opts, bool invalid_first) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t *bad_insert = tmp_bson("{'': 1}"); bson_t *good_insert = tmp_bson("{'x': 1}"); bson_t reply; bson_error_t error; bool r; const char *err = "empty string"; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_validate"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(mongoc_collection_delete_many(collection, tmp_bson(NULL), NULL, NULL, NULL)); capture_logs(true); if (with_opts) { if (invalid_first) { /* document is rejected immediately */ r = mongoc_bulk_operation_insert_with_opts(bulk, bad_insert, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, err); /* now a valid document */ r = mongoc_bulk_operation_insert_with_opts(bulk, good_insert, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!bson_empty(&reply)); } else { /* first a valid document */ r = mongoc_bulk_operation_insert_with_opts(bulk, good_insert, NULL, &error); ASSERT_OR_PRINT(r, error); /* invalid document is rejected without invalidating batch */ r = mongoc_bulk_operation_insert_with_opts(bulk, bad_insert, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, err); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!bson_empty(&reply)); } } else { /* not "with_opts" */ if (invalid_first) { /* invalid, then valid */ mongoc_bulk_operation_insert(bulk, bad_insert); mongoc_bulk_operation_insert(bulk, good_insert); /* not added */ ASSERT_CMPSIZE_T((size_t)0, ==, bulk->commands.len); /* invalid document invalidated the whole bulk */ r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); BSON_ASSERT(bson_empty(&reply)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, err); } else { /* valid, then invalid */ mongoc_bulk_operation_insert(bulk, good_insert); mongoc_bulk_operation_insert(bulk, bad_insert); ASSERT_CMPSIZE_T((size_t)1, ==, bulk->commands.len); /* invalid document invalidated the whole bulk */ r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); BSON_ASSERT(bson_empty(&reply)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, err); } } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_invalid_first(void) { _test_insert_invalid(true, false); } static void test_insert_invalid_second(void) { _test_insert_invalid(false, false); } static void test_insert_with_opts_invalid_first(void) { _test_insert_invalid(true, true); } static void test_insert_with_opts_invalid_second(void) { _test_insert_invalid(false, true); } static void test_insert_with_opts_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_with_opts_validate"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(!mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'': 1}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty string"); ASSERT_OR_PRINT(mongoc_bulk_operation_insert_with_opts( bulk, tmp_bson("{'': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_NONE), &error), error); ASSERT_OR_PRINT(mongoc_bulk_operation_insert_with_opts( bulk, tmp_bson("{'': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_UTF8), &error), error); ASSERT_OR_PRINT(!mongoc_bulk_operation_insert_with_opts( bulk, tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error), error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid document for insert: Disallowed '.' in element key: \"a.a\""); mongoc_bulk_operation_destroy(bulk); /* Test a valid insert with explicit validation on the server. */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(mongoc_bulk_operation_insert_with_opts( bulk, tmp_bson("{'a': 1}"), tmp_bson("{'validate': %d}", BSON_VALIDATE_DOT_KEYS), &error)); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef void (*remove_fn)(mongoc_bulk_operation_t *bulk, const bson_t *selector); typedef struct { remove_fn remove; remove_with_opts_fn remove_with_opts; } remove_validate_test_t; static void _test_remove_validate(remove_validate_test_t *test) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_invalid_first"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); capture_logs(true); /* invalid */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'': 1}")); if (test->remove_with_opts) { r = test->remove_with_opts(bulk, tmp_bson(NULL), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Bulk operation is invalid from prior error: " "invalid document for insert: Element key cannot be an empty string"); } else { test->remove(bulk, tmp_bson(NULL)); } /* remove operation was not recorded */ ASSERT_CMPSIZE_T((size_t)0, ==, bulk->commands.len); /* invalid document invalidated the whole bulk */ r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); BSON_ASSERT(bson_empty(&reply)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid document for insert: Element key cannot be an empty string"); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_remove_one_after_invalid(void) { remove_validate_test_t test = {0}; test.remove = mongoc_bulk_operation_remove_one; _test_remove_validate(&test); } static void test_remove_after_invalid(void) { remove_validate_test_t test = {0}; test.remove = mongoc_bulk_operation_remove; _test_remove_validate(&test); } static void test_remove_one_with_opts_after_invalid(void) { remove_validate_test_t test = {0}; test.remove_with_opts = mongoc_bulk_operation_remove_one_with_opts; _test_remove_validate(&test); } static void test_remove_many_with_opts_after_invalid(void) { remove_validate_test_t test = {0}; test.remove_with_opts = mongoc_bulk_operation_remove_many_with_opts; _test_remove_validate(&test); } static void test_index_offset(void) { mongoc_bulk_operation_t *bulk; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t *sel; bson_t *doc; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_index_offset"); BSON_ASSERT(collection); doc = tmp_bson("{}"); BSON_APPEND_INT32(doc, "_id", 1234); r = mongoc_collection_insert_one(collection, doc, NULL, NULL, &error); BSON_ASSERT(r); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); sel = tmp_bson("{'_id': 1234}"); doc = tmp_bson("{'$set': {'hello': 'there'}}"); mongoc_bulk_operation_remove_one(bulk, sel); mongoc_bulk_operation_update(bulk, sel, doc, true); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 1," " 'nUpserted': 1," " 'upserted': [{'index': 1, '_id': 1234}]," " 'writeErrors': []}"); ASSERT_COUNT(1, collection); bson_destroy(&reply); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_single_ordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_single_ordered_bulk"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson("{'a': 1}")); mongoc_bulk_operation_update(bulk, tmp_bson("{'a': 1}"), tmp_bson("{'$set': {'b': 1}}"), false); mongoc_bulk_operation_update(bulk, tmp_bson("{'a': 2}"), tmp_bson("{'$set': {'b': 2}}"), true); mongoc_bulk_operation_insert(bulk, tmp_bson("{'a': 3}")); mongoc_bulk_operation_remove(bulk, tmp_bson("{'a': 3}")); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 1," " 'nModified': 1," " 'nRemoved': 1," " 'nUpserted': 1," " 'upserted': [{'index': 2, '_id': {'$exists': true}}]" "}"); ASSERT_COUNT(2, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_continue_on_error(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t *doc0 = tmp_bson("{'a': 1}"); bson_t *doc1 = tmp_bson("{'a': 2}"); bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_insert_continue_on_error"); BSON_ASSERT(collection); create_unique_index(collection); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, doc0); mongoc_bulk_operation_insert(bulk, doc0); mongoc_bulk_operation_insert(bulk, doc1); mongoc_bulk_operation_insert(bulk, doc1); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [{'index': 1}, {'index': 3}]}"); assert_write_error_count(2, &reply); ASSERT_COUNT(2, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_continue_on_error(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t *doc0 = tmp_bson("{'a': 1}"); bson_t *doc1 = tmp_bson("{'a': 2}"); bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_update_continue_on_error"); BSON_ASSERT(collection); create_unique_index(collection); mongoc_collection_insert_one(collection, doc0, NULL, NULL, NULL); mongoc_collection_insert_one(collection, doc1, NULL, NULL, NULL); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* succeeds */ mongoc_bulk_operation_update(bulk, doc0, tmp_bson("{'$inc': {'b': 1}}"), false); /* fails */ mongoc_bulk_operation_update(bulk, doc0, tmp_bson("{'$set': {'a': 2}}"), false); /* succeeds */ mongoc_bulk_operation_update(bulk, doc1, tmp_bson("{'$set': {'b': 2}}"), false); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 2," " 'nModified': 2," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [{'index': 1}]}"); assert_write_error_count(1, &reply); ASSERT_COUNT(2, collection); ASSERT_CMPINT( 1, ==, (int)mongoc_collection_count_documents(collection, tmp_bson("{'b': 2}"), NULL, NULL, NULL, NULL)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_remove_continue_on_error(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t *doc0 = tmp_bson("{'a': 1}"); bson_t *doc1 = tmp_bson("{'a': 2}"); bson_t *doc2 = tmp_bson("{'a': 3}"); bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_remove_continue_on_error"); BSON_ASSERT(collection); mongoc_collection_insert_one(collection, doc0, NULL, NULL, NULL); mongoc_collection_insert_one(collection, doc1, NULL, NULL, NULL); mongoc_collection_insert_one(collection, doc2, NULL, NULL, NULL); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* succeeds */ mongoc_bulk_operation_remove_one(bulk, doc0); /* fails */ mongoc_bulk_operation_remove_one(bulk, tmp_bson("{'a': {'$bad': 1}}")); /* succeeds */ mongoc_bulk_operation_remove_one(bulk, doc1); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 2," " 'nUpserted': 0," " 'writeErrors': [{'index': 1}]}"); assert_write_error_count(1, &reply); ASSERT_COUNT(1, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_single_error_ordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_single_error_ordered_bulk"); BSON_ASSERT(collection); create_unique_index(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 2}"), tmp_bson("{'$set': {'a': 1}}"), true); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 3, 'a': 2}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); /* TODO: CDRIVER-651, BSON_ASSERT contents of the 'op' field */ ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [" " {'index': 1," " 'code': {'$exists': true}," " 'errmsg': {'$exists': true}}]" /* * " 'writeErrors.0.op': ...," */ "}"); assert_write_error_count(1, &reply); ASSERT_COUNT(1, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_multiple_error_ordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_multiple_error_ordered_bulk"); BSON_ASSERT(collection); create_unique_index(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); /* 0 succeeds */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); /* 1 succeeds */ mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 3}"), tmp_bson("{'$set': {'a': 2}}"), true); /* 2 fails, duplicate value for 'a' */ mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 2}"), tmp_bson("{'$set': {'a': 1}}"), true); /* 3 not attempted, bulk is already aborted */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 4, 'a': 3}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); BSON_ASSERT(error.code); /* TODO: CDRIVER-651, BSON_ASSERT contents of the 'op' field */ ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 1," " 'writeErrors': [" " {'index': 2, 'errmsg': {'$exists': true}}" "]" /* * " 'writeErrors.0.op': {'q': {'b': 2}, * 'u': {'$set': {'a': 1}}, 'multi': false}" */ "}"); assert_write_error_count(1, &reply); ASSERT_COUNT(2, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_single_unordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_single_unordered_bulk"); BSON_ASSERT(collection); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{'a': 1}")); mongoc_bulk_operation_update(bulk, tmp_bson("{'a': 1}"), tmp_bson("{'$set': {'b': 1}}"), false); mongoc_bulk_operation_update(bulk, tmp_bson("{'a': 2}"), tmp_bson("{'$set': {'b': 2}}"), true); mongoc_bulk_operation_insert(bulk, tmp_bson("{'a': 3}")); mongoc_bulk_operation_remove(bulk, tmp_bson("{'a': 3}")); ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 1," " 'nModified': 1," " 'nRemoved': 1," " 'nUpserted': 1," " 'upserted': [" " {'index': 2, '_id': {'$exists': true}}]," " 'writeErrors': []}"); ASSERT_COUNT(2, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_single_error_unordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_single_error_unordered_bulk"); BSON_ASSERT(collection); create_unique_index(collection); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* 0 succeeds */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); /* 1 fails */ mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 2}"), tmp_bson("{'$set': {'a': 1}}"), true); /* 2 succeeds */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 3, 'a': 2}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); BSON_ASSERT(error.code); /* TODO: CDRIVER-651, BSON_ASSERT contents of the 'op' field */ ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [{'index': 1," " 'code': {'$exists': true}," " 'errmsg': {'$exists': true}}]}"); assert_write_error_count(1, &reply); ASSERT_COUNT(2, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_oversized_bulk_op(bool ordered) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts = NULL; mongoc_bulk_operation_t *bulk; bson_t *huge_doc; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_oversized_bulk"); mongoc_collection_drop_with_opts(collection, NULL, NULL); if (!ordered) { opts = tmp_bson("{'ordered': false}"); } bulk = mongoc_collection_create_bulk_operation_with_opts(collection, opts); /* this fails, aborting bulk, even if it's unordered */ huge_doc = BCON_NEW("a", BCON_INT32(1)); bson_append_utf8(huge_doc, "b", -1, huge_string(client), (int)huge_string_length(client)); bson_append_utf8(huge_doc, "c", -1, huge_string(client), (int)huge_string_length(client)); mongoc_bulk_operation_insert(bulk, huge_doc); /* would succeed if it ran */ mongoc_bulk_operation_insert(bulk, tmp_bson("{'a': 1}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "Document 0 is too large"); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': []}"); /* second document was *not* inserted */ ASSERT_COUNT(0, collection); bson_destroy(&reply); bson_destroy(huge_doc); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_oversized_bulk_op_ordered(void *ctx) { BSON_UNUSED(ctx); _test_oversized_bulk_op(true); } static void test_oversized_bulk_op_unordered(void *ctx) { BSON_UNUSED(ctx); _test_oversized_bulk_op(false); } static void _test_write_concern(bool ordered, bool multi_err) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; future_t *future; request_t *request; int32_t first_err; int32_t second_err; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_write_concern_set_wtimeout_int64(wc, 100); mongoc_write_concern_append(wc, &opts); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); mongoc_bulk_operation_remove(bulk, tmp_bson("{'_id': 2}")); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'insert': 'test'," " 'writeConcern': {'w': 2, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': %s}", ordered ? "true" : "false"), tmp_bson("{'_id': 1}")); BSON_ASSERT(request); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1, " " 'writeConcernError': {'code': 17, 'errmsg': 'foo'}}"); request_destroy(request); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'delete': 'test'," " 'writeConcern': {'w': 2, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': %s}", ordered ? "true" : "false"), tmp_bson("{'q': {'_id': 2}, 'limit': 0}")); if (multi_err) { reply_to_request_simple(request, "{'ok': 1.0, 'n': 1, " " 'writeConcernError': {'code': 42, 'errmsg': 'bar'}}"); } else { reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); } request_destroy(request); /* server fictionally returns 17 and 42; expect driver to use first one */ first_err = 17; second_err = 42; /* join thread, BSON_ASSERT mongoc_bulk_operation_execute () returned 0 */ BSON_ASSERT(!future_get_uint32_t(future)); if (multi_err) { ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nRemoved': 1," " 'nUpserted': 0," " 'writeErrors': []," " 'writeConcernErrors': [" " {'code': %d, 'errmsg': 'foo'}," " {'code': %d, 'errmsg': 'bar'}]}", first_err, second_err); ASSERT_CMPSTR("Multiple write concern errors: \"foo\", \"bar\"", error.message); } else { ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 1," " 'nUpserted': 0," " 'writeErrors': []," " 'writeConcernErrors': [" " {'code': %d, 'errmsg': 'foo'}]}", first_err); ASSERT_CMPSTR("foo", error.message); } ASSERT_CMPINT(MONGOC_ERROR_WRITE_CONCERN, ==, error.domain); ASSERT_CMPINT(first_err, ==, error.code); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_write_concern_write_command_ordered(void) { _test_write_concern(true, false); } static void test_write_concern_write_command_ordered_multi_err(void) { _test_write_concern(true, true); } static void test_write_concern_write_command_unordered(void) { _test_write_concern(false, false); } static void test_write_concern_write_command_unordered_multi_err(void) { _test_write_concern(false, true); } /* Test for CDRIVER-3305 - Continue unordered bulk writes on error */ static void test_unordered_bulk_writes_with_error(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; uint32_t i; bson_error_t error; future_t *future; request_t *request; bson_t reply; server = mock_server_new(); mock_server_run(server); /* server is "recovering": not primary, not secondary */ mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'maxWriteBatchSize': 1," " 'isWritablePrimary': true," " 'secondary': false," " 'setName': 'rs'," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "test"); /* use an unordered bulk write; we expect to continue on error */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson("{'ordered': false}")); /* maxWriteBatchSize is set to 1; with 2 inserts we get a batch split */ for (i = 0; i < 2; i++) { mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'_id': %d}", i), NULL, &error); } future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_request(server); BSON_ASSERT(request); reply_to_request_simple(request, "{ 'errmsg': 'random error', 'ok': 0 }"); request_destroy(request); /* should receive a second request */ request = mock_server_receives_request(server); /* a failure of this assertion means that the client did not continue with * the next write operation; it stopped permaturely */ BSON_ASSERT(request); reply_to_request_simple(request, "{ 'errmsg': 'random error', 'ok': 0 }"); request_destroy(request); ASSERT(future_wait(future)); mongoc_client_destroy(client); mongoc_collection_destroy(collection); mongoc_bulk_operation_destroy(bulk); bson_destroy(&reply); future_destroy(future); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void _test_write_concern_err_api(int32_t error_api_version) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; future_t *future; request_t *request; uint32_t expected_code; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); ASSERT(mongoc_client_set_error_api(client, error_api_version)); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg( mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'insert': 'test'}"), tmp_bson("{'_id': 1}")); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1, " " 'writeConcernError': {'code': 42, 'errmsg': 'foo'}}"); BSON_ASSERT(!future_get_uint32_t(future)); /* legacy write concern errs have no code from server, driver uses 64 */ expected_code = 42; ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, expected_code, "foo"); request_destroy(request); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_write_concern_error_write_command_v1(void) { _test_write_concern_err_api(1); } static void test_write_concern_error_write_command_v2(void) { _test_write_concern_err_api(2); } static void test_multiple_error_unordered_bulk(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_multiple_error_unordered_bulk"); BSON_ASSERT(collection); create_unique_index(collection); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 2}"), tmp_bson("{'$set': {'a': 3}}"), true); mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 3}"), tmp_bson("{'$set': {'a': 4}}"), true); mongoc_bulk_operation_update(bulk, tmp_bson("{'b': 4}"), tmp_bson("{'$set': {'a': 3}}"), true); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 5, 'a': 2}")); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 6, 'a': 1}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); BSON_ASSERT(error.code); /* Assume the update at index 1 runs before the update at index 3, * although the spec does not require it. Same for inserts. */ /* TODO: CDRIVER-651, BSON_ASSERT contents of the 'op' field */ ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 2," /* " 'writeErrors.0.op': {'q': {'b': 4}, 'u': {'$set': {'a': 3}}, 'multi': false, 'upsert': true}}," */ " 'writeErrors.0.index': 3," " 'writeErrors.0.code': {'$exists': true}," " 'writeErrors.1.index': 5," /* " 'writeErrors.1.op': {'_id': '...', 'b': 6, 'a': 1}," */ " 'writeErrors.1.code': {'$exists': true}," " 'writeErrors.1.errmsg': {'$exists': true}}"); assert_write_error_count(2, &reply); /* * assume the update at index 1 runs before the update at index 3, * although the spec does not require it. Same for inserts. */ ASSERT_COUNT(4, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_wtimeout_plus_duplicate_key_err(void) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; future_t *future; request_t *request; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); /* unordered bulk */ bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 2}")); mongoc_bulk_operation_remove(bulk, tmp_bson("{'_id': 3}")); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'insert': 'test'," " 'writeConcern': {'$exists': false}," " 'ordered': false}"), tmp_bson("{'_id': 1}"), tmp_bson("{'_id': 2}")); BSON_ASSERT(request); reply_to_request(request, 0, 0, 0, 1, "{'ok': 1.0, 'n': 1," " 'writeErrors': [{'index': 0, 'code': 11000, 'errmsg': 'dupe'}]," " 'writeConcernError': {'code': 17, 'errmsg': 'foo'}}"); request_destroy(request); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'delete': 'test'," " 'writeConcern': {'$exists': false}," " 'ordered': false}"), tmp_bson("{'q': {'_id': 3}, 'limit': 0}")); BSON_ASSERT(request); reply_to_request(request, 0, 0, 0, 1, "{'ok': 1.0, 'n': 1," " 'writeConcernError': {'code': 42, 'errmsg': 'bar'}}"); request_destroy(request); /* mongoc_bulk_operation_execute () returned 0 */ BSON_ASSERT(!future_get_uint32_t(future)); /* get err code from server with write commands, otherwise use 64 */ ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 1," " 'nUpserted': 0," " 'writeErrors': [" " {'index': 0, 'code': 11000, 'errmsg': 'dupe'}]," " 'writeConcernErrors': [" " {'code': %d, 'errmsg': 'foo'}," " {'code': %d, 'errmsg': 'bar'}]}", 17, 42); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_wtimeout_plus_duplicate_key_err_write_commands(void) { _test_wtimeout_plus_duplicate_key_err(); } static void test_large_inserts_ordered(void *ctx) { mongoc_client_t *client; bson_t *huge_doc; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; bson_t *big_doc; bson_iter_t iter; int i; const bson_t *retdoc; bson_t query = BSON_INITIALIZER; mongoc_cursor_t *cursor; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(client); huge_doc = BCON_NEW("a", BCON_INT32(1)); bson_append_utf8(huge_doc, "long-key-to-make-this-fail", -1, huge_string(client), (int)huge_string_length(client)); collection = get_test_collection(client, "test_large_inserts_ordered"); BSON_ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); mongoc_bulk_operation_insert(bulk, huge_doc); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 2, 'a': 2}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [{'index': 1}]}"); assert_write_error_count(1, &reply); ASSERT_COUNT(1, collection); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); ASSERT_CURSOR_NEXT(cursor, &retdoc); ASSERT_CURSOR_DONE(cursor); bson_destroy(&query); mongoc_collection_delete_many(collection, tmp_bson("{}"), NULL, NULL, NULL); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); BSON_ASSERT(bulk); big_doc = tmp_bson("{'a': 1}"); bson_append_utf8(big_doc, "big", -1, four_mb_string(), FOUR_MB); bson_iter_init_find(&iter, big_doc, "a"); for (i = 1; i <= 6; i++) { bson_iter_overwrite_int32(&iter, i); mongoc_bulk_operation_insert(bulk, big_doc); } ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); assert_n_inserted(6, &reply); ASSERT_COUNT(6, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); bson_destroy(huge_doc); mongoc_client_destroy(client); } static void test_large_inserts_unordered(void *ctx) { mongoc_client_t *client; bson_t *huge_doc; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; bson_t *big_doc; bson_iter_t iter; int i; const bson_t *retdoc; bson_t query = BSON_INITIALIZER; mongoc_cursor_t *cursor; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(client); huge_doc = BCON_NEW("a", BCON_INT32(1)); bson_append_utf8(huge_doc, "long-key-to-make-this-fail", -1, huge_string(client), (int)huge_string_length(client)); collection = get_test_collection(client, "test_large_inserts_unordered"); BSON_ASSERT(collection); bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 1, 'a': 1}")); /* 1 fails */ mongoc_bulk_operation_insert(bulk, huge_doc); mongoc_bulk_operation_insert(bulk, tmp_bson("{'b': 2, 'a': 2}")); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': [{" " 'index': 1," " 'code': {'$exists': true}," " 'errmsg': {'$exists': true}" " }]}"); ASSERT_COUNT(2, collection); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); ASSERT_CURSOR_NEXT(cursor, &retdoc); ASSERT_CURSOR_NEXT(cursor, &retdoc); ASSERT_CURSOR_DONE(cursor); bson_destroy(&query); mongoc_collection_delete_many(collection, tmp_bson("{}"), NULL, NULL, NULL); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); big_doc = tmp_bson("{'a': 1}"); bson_append_utf8(big_doc, "big", -1, four_mb_string(), (int)FOUR_MB); bson_iter_init_find(&iter, big_doc, "a"); for (i = 1; i <= 6; i++) { bson_iter_overwrite_int32(&iter, i); mongoc_bulk_operation_insert(bulk, big_doc); } ASSERT_OR_PRINT((bool)mongoc_bulk_operation_execute(bulk, &reply, &error), error); assert_n_inserted(6, &reply); ASSERT_COUNT(6, collection); bson_destroy(huge_doc); bson_destroy(&reply); mongoc_cursor_destroy(cursor); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void execute_numerous_bulk_op(mock_server_t *server, mongoc_bulk_operation_t *bulk, const char *doc_json) { bson_error_t error; future_t *future; request_t *request; const bson_t *docs[4]; int i, j; future = future_bulk_operation_execute(bulk, NULL, &error); /* accept anything for the command body */ docs[0] = tmp_bson("{}"); /* test that driver sends 7 documents in batches of up to 3 */ for (i = 0; i < 7;) { for (j = 0; j < 3 && i < 7; i++, j++) { docs[j + 1] = tmp_bson(doc_json); } request = mock_server_receives_request(server); BSON_ASSERT(request_matches_msg(request, 0, &docs[0], j + 1)); reply_to_request_with_ok_and_destroy(request); } ASSERT_OR_PRINT(future_get_uint32_t(future), error); future_destroy(future); } static void _test_numerous(bool ordered) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; int i; bson_t *opts = tmp_bson("{'ordered': %s}", ordered ? "true" : "false"); bson_t *doc = tmp_bson("{'_id': 1}"); server = mock_server_new(); /* the real OP_MSG max batch is 100k docs, choose 3 for faster test */ mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'maxWriteBatchSize': 3}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); #define TEST_NUMEROUS(_one_write, _doc_format) \ do { \ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, opts); \ for (i = 0; i < 7; i++) { \ mongoc_bulk_operation_##_one_write; \ } \ execute_numerous_bulk_op(server, bulk, _doc_format); \ mongoc_bulk_operation_destroy(bulk); \ } while (0) TEST_NUMEROUS(insert(bulk, doc), "{'_id': 1}"); TEST_NUMEROUS(remove_many_with_opts(bulk, doc, NULL, NULL), "{'q': {'_id': 1}, 'limit': 0}"); TEST_NUMEROUS(remove_one(bulk, doc), "{'q': {'_id': 1}, 'limit': 1}"); TEST_NUMEROUS(replace_one(bulk, doc, tmp_bson("{}"), false), "{'q': {'_id': 1}, 'u': {}}"); TEST_NUMEROUS(update_one(bulk, doc, tmp_bson("{'$set': {'x': 1}}"), false), "{'q': {'_id': 1}, 'u': {'$set': {'x': 1}}}"); TEST_NUMEROUS(update_many_with_opts(bulk, doc, tmp_bson("{'$set': {'x': 1}}"), NULL, NULL), "{'q': {'_id': 1}, 'u': {'$set': {'x': 1}}}"); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_numerous_ordered(void *ctx) { BSON_UNUSED(ctx); _test_numerous(true); } static void test_numerous_unordered(void *ctx) { BSON_UNUSED(ctx); _test_numerous(false); } static void test_bulk_split(void *ctx) { BSON_UNUSED(ctx); mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk_op; bson_iter_t iter, error_iter, indexnum; bson_t doc, result; bson_error_t error; int n_docs; int i; uint32_t r; mongoc_client_session_t *session; /* ensure we need two batches */ n_docs = (int)test_framework_max_write_batch_size() + 10; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "split"); BSON_ASSERT(collection); // Apply settings to guarantee "read-your-own-writes" semantics. // Intended to address undercounts reading results reported in CDRIVER-4346. { // https://www.mongodb.com/docs/manual/core/read-isolation-consistency-recency/#client-sessions-and-causal-consistency-guarantees // describes how to guarantee "read-your-own-writes". // Start a causally consistent session. mongoc_session_opt_t *sopts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(sopts, true); session = mongoc_client_start_session(client, sopts, NULL); mongoc_session_opts_destroy(sopts); // Apply read concern majority. mongoc_read_concern_t *rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_collection_set_read_concern(collection, rc); mongoc_read_concern_destroy(rc); // Apply write concern majority. mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(collection, wc); mongoc_write_concern_destroy(wc); } bson_append_bool(&opts, "ordered", 7, false); ASSERT_OR_PRINT(mongoc_client_session_append(session, &opts, &error), error); bulk_op = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* if n_docs is 100,010 insert 3337 docs with _ids 0, 3, 6, ..., 100,008 */ for (i = 0; i < n_docs; i += 3) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk_op, &doc); bson_destroy(&doc); } r = mongoc_bulk_operation_execute(bulk_op, NULL, &error); /* succeed */ ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_destroy(bulk_op); /* ordered false so we continue on error */ bulk_op = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* insert n_docs documents with _ids 0, 1, 2, 3, ..., 100,008 */ for (i = 0; i < n_docs; i++) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk_op, &doc); bson_destroy(&doc); } /* two thirds of the docs succeed, but _ids 0, 3, 6, ... are duplicates */ r = mongoc_bulk_operation_execute(bulk_op, &result, &error); BSON_ASSERT(!r); /* all 100,010 docs were inserted, either by the first or second bulk op */ { bson_t count_opts = BSON_INITIALIZER; ASSERT_OR_PRINT(mongoc_client_session_append(session, &count_opts, &error), error); int64_t count = mongoc_collection_count_documents( collection, tmp_bson("{}"), &count_opts, NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(count != -1, error); ASSERT_CMPINT64(count, ==, 100010); bson_destroy(&count_opts); } /* result like {writeErrors: [{index: i, code: n, errmsg: ''}, ... ]} */ bson_iter_init_find(&iter, &result, "writeErrors"); BSON_ASSERT(bson_iter_recurse(&iter, &error_iter)); BSON_ASSERT(bson_iter_next(&error_iter)); /* we expect duplicate key errs about _ids 0, 3, 6, ..., 100,008 * and the error index should equal the _id */ for (i = 0; i < n_docs; i += 3) { BSON_ASSERT(bson_iter_recurse(&error_iter, &indexnum)); BSON_ASSERT(bson_iter_find(&indexnum, "index")); if (bson_iter_int32(&indexnum) != i) { fprintf(stderr, "index should be %d, but is %d\n", i, bson_iter_int32(&indexnum)); } BSON_ASSERT(bson_iter_int32(&indexnum) == i); bson_iter_next(&error_iter); } mongoc_bulk_operation_destroy(bulk_op); bson_destroy(&opts); bson_destroy(&result); mongoc_collection_destroy(collection); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } static void test_bulk_edge_case_372(bool ordered) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_iter_t iter; bson_iter_t citer; bson_t *selector; bson_t *update; bson_t reply; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "CDRIVER_372"); BSON_ASSERT(collection); bson_append_bool(&opts, "ordered", 7, ordered); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); BSON_ASSERT(bulk); selector = tmp_bson("{'_id': 0}"); update = tmp_bson("{'$set': {'a': 0}}"); mongoc_bulk_operation_update_one(bulk, selector, update, true); selector = tmp_bson("{'a': 1}"); update = tmp_bson("{'_id': 1}"); mongoc_bulk_operation_replace_one(bulk, selector, update, true); /* This is just here to make the counts right in all cases. */ selector = tmp_bson("{'_id': 2}"); update = tmp_bson("{'_id': 2}"); mongoc_bulk_operation_replace_one(bulk, selector, update, true); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 3," " 'upserted': [" " {'index': 0, '_id': 0}," " {'index': 1, '_id': 1}," " {'index': 2, '_id': 2}" " ]," " 'writeErrors': []}"); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "upserted") && BSON_ITER_HOLDS_ARRAY(&iter) && bson_iter_recurse(&iter, &citer)); bson_destroy(&reply); mongoc_collection_drop(collection, NULL); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_bulk_edge_case_372_ordered(void) { test_bulk_edge_case_372(true); } static void test_bulk_edge_case_372_unordered(void) { test_bulk_edge_case_372(false); } typedef struct { int started; int succeeded; int failed; } stats_t; void command_succeeded(const mongoc_apm_command_succeeded_t *event) { const char *cmd_name = mongoc_apm_command_succeeded_get_command_name(event); if (!strcasecmp(cmd_name, "insert")) { ((stats_t *)mongoc_apm_command_succeeded_get_context(event))->succeeded++; } } static void test_bulk_max_msg_size(void) { mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_write_concern_t *wc; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t doc; bool retval; mongoc_apm_callbacks_t *callbacks; stats_t stats = {0}; int str_size = 16 * 1024 * 1024 - 24; char *msg = bson_malloc(str_size + 1); size_t filler_string = 14445428u; mongoc_client_session_t *cs; memset(msg, 'a', str_size); msg[str_size] = '\0'; wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 1); mongoc_write_concern_append(wc, &opts); client = test_framework_new_default_client(); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, command_succeeded); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&stats); collection = mongoc_client_get_collection(client, "test", "max_msg_size"); mongoc_collection_drop(collection, NULL); /* Cluster time document argument is injected sometimes */ if (!bson_empty(&client->topology->_shared_descr_.ptr->cluster_time)) { filler_string -= client->topology->_shared_descr_.ptr->cluster_time.len + strlen("$clusterTime") + 2u; } /* API version may be appended */ if (client->api) { filler_string -= strlen("apiVersion") + 7u + strlen(mongoc_server_api_version_to_string(mongoc_server_api_get_version(client->api))); } cs = mongoc_client_start_session(client, NULL, NULL); if (cs) { /* sessions are supported */ filler_string -= mongoc_client_session_get_lsid(cs)->len + strlen("lsid") + 2u; /* TODO: this check can be removed once CDRIVER-3070 is resolved */ if (test_framework_is_mongos() || test_framework_is_replset()) { /* retryable writes includes a txnNumber (int64) */ filler_string -= strlen("txnNumber") + 10u; } ASSERT_OR_PRINT(mongoc_client_session_append(cs, &opts, &error), error); } /* {{{ Exactly 48 000 000 bytes (not to be confused with 48mb!) */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* 16 mb doc */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 1); BSON_APPEND_UTF8(&doc, "msg", msg); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); /* 16 mb doc */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 2); BSON_APPEND_UTF8(&doc, "msg", msg); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); /* fill up to the 48 000 000 bytes message size */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 3); ASSERT(mlib_in_range(int, filler_string)); bson_append_utf8(&doc, "msg", -1, msg, (int)filler_string); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(3, &reply); bson_destroy(&reply); /* Make sure this was ONE bulk ! */ ASSERT_CMPINT(stats.succeeded, ==, 1); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ /* {{{ 48 000 001 byte */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); /* 16 mb doc */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 1); BSON_APPEND_UTF8(&doc, "msg", msg); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); /* 16 mb doc */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 2); BSON_APPEND_UTF8(&doc, "msg", msg); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); /* fill up to the 48 000 001 bytes message size */ bson_init(&doc); bson_append_int32(&doc, "_id", -1, 3); ASSERT(mlib_in_range(int, filler_string + 1u)); bson_append_utf8(&doc, "msg", -1, msg, (int)(filler_string + 1u)); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(3, &reply); bson_destroy(&reply); /* Make sure this was TWO bulks, otherwise our one bulk math was wrong! */ ASSERT_CMPINT(stats.succeeded, ==, 2); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ if (cs) { mongoc_client_session_destroy(cs); } mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); bson_free(msg); bson_destroy(&opts); } static void test_bulk_max_batch_size(void) { int64_t max_batch; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; mongoc_write_concern_t *wc; mongoc_client_t *client; bson_error_t error; bson_t reply; bson_t doc; bool retval; int i; mongoc_apm_callbacks_t *callbacks; stats_t stats = {0}; max_batch = test_framework_max_write_batch_size(); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 1); mongoc_write_concern_append(wc, &opts); client = test_framework_new_default_client(); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, command_succeeded); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&stats); collection = get_test_collection(client, "max_batch_size"); /* {{{ Insert 100 000 documents, in one bulk */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); for (i = 1; i <= max_batch; i++) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); } retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(i - 1, &reply); bson_destroy(&reply); ASSERT_CMPINT(stats.succeeded, ==, 1); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ /* {{{ Insert 100 001 documents, in two bulks */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); for (i = 1; i <= (max_batch + 1); i++) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); } retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(i - 1, &reply); bson_destroy(&reply); ASSERT_CMPINT(stats.succeeded, ==, 2); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ /* {{{ Insert 200 000 documents, in two bulks */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); for (i = 1; i <= 2 * max_batch; i++) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); } retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(i - 1, &reply); bson_destroy(&reply); ASSERT_CMPINT(stats.succeeded, ==, 2); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ /* {{{ Insert 200 001 documents, in 3 bulks */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); for (i = 1; i <= (2 * max_batch + 1); i++) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); } retval = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(retval, error); assert_n_inserted(i - 1, &reply); bson_destroy(&reply); ASSERT_CMPINT(stats.succeeded, ==, 3); stats.succeeded = 0; mongoc_bulk_operation_destroy(bulk); mongoc_collection_drop(collection, NULL); /* }}} */ bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); } static void test_bulk_new(void) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_t empty = BSON_INITIALIZER; uint32_t r; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "bulk_new"); ASSERT(collection); // Can create and destroy: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_destroy(bulk); } // Execute without a client is an error: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); r = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "requires a client"); mongoc_bulk_operation_destroy(bulk); } // Execute with a database and no client is an error: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_database(bulk, "test"); r = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "requires a client"); mongoc_bulk_operation_destroy(bulk); } // Execute with a database and collection and no client is an error: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_database(bulk, "test"); mongoc_bulk_operation_set_collection(bulk, "test"); r = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "requires a client"); mongoc_bulk_operation_destroy(bulk); } // Execute with no operations is an error: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_database(bulk, "test"); mongoc_bulk_operation_set_collection(bulk, "test"); mongoc_bulk_operation_set_client(bulk, client); r = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty bulk write"); mongoc_bulk_operation_destroy(bulk); } // Execute with operations is OK: { mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_database(bulk, "test"); mongoc_bulk_operation_set_collection(bulk, "test"); mongoc_bulk_operation_set_client(bulk, client); mongoc_bulk_operation_insert(bulk, &empty); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); } mongoc_collection_drop(collection, NULL); bson_destroy(&empty); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef enum { HANGUP, SERVER_ERROR, ERR_TYPE_LAST } err_type_t; static void test_bulk_write_concern_split(void *unused) { mongoc_client_t *client; mongoc_bulk_operation_t *bulk; mongoc_write_concern_t *write_concern; bson_t doc; bson_error_t error; uint32_t success; int i; char *str; bson_t reply; bson_iter_t iter; bool r; int num_docs; BSON_UNUSED(unused); num_docs = (int)test_framework_max_write_batch_size() + 10; client = test_framework_new_default_client(); BSON_ASSERT(client); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, 1); mongoc_client_set_write_concern(client, write_concern); str = gen_collection_name("bulk_write_concern_split"); bulk = mongoc_bulk_operation_new(true); mongoc_bulk_operation_set_database(bulk, "test"); mongoc_bulk_operation_set_collection(bulk, str); mongoc_write_concern_set_w(write_concern, 0); mongoc_bulk_operation_set_write_concern(bulk, write_concern); mongoc_bulk_operation_set_client(bulk, client); for (i = 0; i < num_docs; i += 3) { bson_init(&doc); bson_append_int32(&doc, "_id", -1, i); mongoc_bulk_operation_insert(bulk, &doc); bson_destroy(&doc); } success = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(success, error); /* wait for bulk insert to complete on this connection */ r = mongoc_client_command_simple(client, "test", tmp_bson("{'getlasterror': 1}"), NULL, &reply, &error); ASSERT_OR_PRINT(r, error); if (bson_iter_init_find(&iter, &reply, "err") && BSON_ITER_HOLDS_UTF8(&iter)) { test_error("%s", bson_iter_utf8(&iter, NULL)); } bson_destroy(&reply); bson_free(str); mongoc_bulk_operation_destroy(bulk); mongoc_client_destroy(client); mongoc_write_concern_destroy(write_concern); } static uint32_t server_id_for_read_mode(mongoc_client_t *client, mongoc_read_mode_t read_mode) { mongoc_read_prefs_t *prefs; mongoc_server_description_t *sd; bson_error_t error; uint32_t server_id; ASSERT(client); prefs = mongoc_read_prefs_new(read_mode); sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, prefs, NULL, &error); ASSERT_OR_PRINT(sd, error); server_id = sd->id; mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(prefs); return server_id; } static void _test_bulk_hint(bool pooled, bool use_primary) { mock_rs_t *rs; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bool ret; uint32_t server_id; bson_t reply; bson_error_t error; future_t *future; request_t *request; /* primary, 2 secondaries */ rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true, 2, 0); mock_rs_run(rs); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_rs_get_uri(rs), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); } /* warm up the client so its server_id is valid */ ret = mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); ASSERT_CMPUINT32((uint32_t)0, ==, mongoc_bulk_operation_get_server_id(bulk)); if (use_primary) { server_id = server_id_for_read_mode(client, MONGOC_READ_PRIMARY); } else { server_id = server_id_for_read_mode(client, MONGOC_READ_SECONDARY); } mongoc_bulk_operation_set_server_id(bulk, server_id); ASSERT_CMPUINT32(server_id, ==, mongoc_bulk_operation_get_server_id(bulk)); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'insert': 'test'}"), tmp_bson("{'_id': 1}")); BSON_ASSERT(request); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); if (use_primary) { BSON_ASSERT(mock_rs_request_is_to_primary(rs, request)); } else { BSON_ASSERT(mock_rs_request_is_to_secondary(rs, request)); } ASSERT_CMPUINT32(server_id, ==, future_get_uint32_t(future)); request_destroy(request); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mock_rs_destroy(rs); } static void test_hint_single_command_secondary(void) { _test_bulk_hint(false, false); } static void test_hint_single_command_primary(void) { _test_bulk_hint(false, true); } static void test_hint_pooled_command_secondary(void) { _test_bulk_hint(true, false); } static void test_hint_pooled_command_primary(void) { _test_bulk_hint(true, true); } // test_bulk_reply_w0_finished returns true when the last unacknowledged write // has applied in test_bulk_reply_w0. static bool test_bulk_reply_w0_finished(mongoc_collection_t *coll) { bson_error_t error; int64_t count = mongoc_collection_count_documents( coll, tmp_bson("{'finished': true}"), NULL /* opts */, NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(-1 != count, error); return count == 1; } static void test_bulk_reply_w0(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t reply; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_w0"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_append(wc, &opts); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{}")); mongoc_bulk_operation_update(bulk, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), false); mongoc_bulk_operation_remove(bulk, tmp_bson("{}")); mongoc_bulk_operation_insert(bulk, tmp_bson("{'finished': true}")); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, &reply, &error), error); ASSERT(bson_empty(&reply)); // Wait for the last insert to finish applying before proceeding to the next // test. Otherwise, the commands may trigger failpoints of other tests (see // CDRIVER-4539). WAIT_UNTIL(test_bulk_reply_w0_finished(collection)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_bulk_invalid_write_concern(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; bson_t reply; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_bulk_invalid_write_concern"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson("{'writeConcern': {'w': 0, 'j': true}}")); BSON_ASSERT(!mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Bulk operation is invalid from prior error"); memset(&error, 0, sizeof(bson_error_t)); BSON_ASSERT(!mongoc_bulk_operation_execute(bulk, &reply, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); ASSERT(bson_empty(&reply)); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef enum { BULK_REMOVE, BULK_REMOVE_ONE, BULK_REPLACE_ONE, BULK_UPDATE, BULK_UPDATE_ONE } bulkop; static void _test_bulk_collation(bool w, bulkop op) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; request_t *request; future_t *future; bson_t *opts; const char *expect_msg = NULL; const char *expect_doc = NULL; bool r = false; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts( collection, tmp_bson("{'writeConcern': {'w': %d, 'wtimeout': 100}}", w ? 1 : 0)); opts = BCON_NEW("collation", "{", "locale", BCON_UTF8("en_US"), "caseFirst", BCON_UTF8("lower"), "}"); switch (op) { case BULK_REMOVE: r = mongoc_bulk_operation_remove_many_with_opts(bulk, tmp_bson("{'_id': 1}"), opts, &error); expect_msg = "{'$db': 'test'," " 'delete': 'test'," " 'writeConcern': {" " 'w': %d, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': true}"; expect_doc = "{'q': {'_id': 1}," " 'limit': 0," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}}"; break; case BULK_REMOVE_ONE: r = mongoc_bulk_operation_remove_one_with_opts(bulk, tmp_bson("{'_id': 2}"), opts, &error); expect_msg = "{'$db': 'test'," " 'delete': 'test'," " 'writeConcern': {" " 'w': %d, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': true}"; expect_doc = "{'q': {'_id': 2}," " 'limit': 1," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}}"; break; case BULK_REPLACE_ONE: r = mongoc_bulk_operation_replace_one_with_opts( bulk, tmp_bson("{'_id': 3}"), tmp_bson("{'_id': 4}"), opts, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'writeConcern': {" " 'w': %d, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': true}"; expect_doc = "{'q': {'_id': 3}," " 'u': {'_id': 4}," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}," " 'multi': false}"; break; case BULK_UPDATE: r = mongoc_bulk_operation_update_many_with_opts( bulk, tmp_bson("{'_id': 5}"), tmp_bson("{'$set': {'_id': 6}}"), opts, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'writeConcern': {" " 'w': %d, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': true}"; expect_doc = "{'q': {'_id': 5}," " 'u': {'$set': {'_id': 6}}," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}," " 'multi': true }"; break; case BULK_UPDATE_ONE: r = mongoc_bulk_operation_update_one_with_opts( bulk, tmp_bson("{'_id': 7}"), tmp_bson("{'$set': {'_id': 8}}"), opts, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'writeConcern': {" " 'w': %d, 'wtimeout': {'$numberLong': '100'}}," " 'ordered': true}"; expect_doc = "{'q': {'_id': 7}," " 'u': {'$set': {'_id': 8}}," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}," " 'multi': false}"; break; default: BSON_ASSERT(false); } ASSERT_OR_PRINT(r, error); future = future_bulk_operation_execute(bulk, &reply, &error); if (w) { request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson(expect_msg, w ? 1 : 0), tmp_bson(expect_doc)); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); ASSERT(future_get_uint32_t(future)); future_destroy(future); } else { ASSERT(!future_get_uint32_t(future)); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set collation for unacknowledged writes"); } bson_destroy(opts); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void _test_bulk_collation_multi(bool w) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; request_t *request; future_t *future; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts( collection, tmp_bson("{'writeConcern': {'w': %d, 'wtimeout': 100}}", w ? 1 : 0)); mongoc_bulk_operation_remove_many_with_opts(bulk, tmp_bson("{'_id': 1}"), NULL, &error); mongoc_bulk_operation_remove_many_with_opts( bulk, tmp_bson("{'_id': 2}"), tmp_bson("{'collation': {'locale': 'en_US', 'caseFirst': 'lower'}}"), &error); future = future_bulk_operation_execute(bulk, &reply, &error); if (w) { request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'delete': 'test'," " 'ordered': true}"), tmp_bson("{'q': {'_id': 1}}"), tmp_bson("{'q': {'_id': 2}," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}}")); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); ASSERT(future_get_uint32_t(future)); future_destroy(future); } else { ASSERT(!future_get_uint32_t(future)); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set collation for unacknowledged writes"); } bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } void test_bulk_collation_multi_w1(void) { _test_bulk_collation_multi(true); } void test_bulk_collation_multi_w0(void) { _test_bulk_collation_multi(false); } void test_bulk_collation_w1(void) { _test_bulk_collation(true, BULK_REMOVE); _test_bulk_collation(true, BULK_REMOVE_ONE); _test_bulk_collation(true, BULK_REPLACE_ONE); _test_bulk_collation(true, BULK_UPDATE); _test_bulk_collation(true, BULK_UPDATE_ONE); } void test_bulk_collation_w0(void) { _test_bulk_collation(false, BULK_REMOVE); _test_bulk_collation(false, BULK_REMOVE_ONE); _test_bulk_collation(false, BULK_REPLACE_ONE); _test_bulk_collation(false, BULK_UPDATE); _test_bulk_collation(false, BULK_UPDATE_ONE); } static void test_bulk_update_one_error_message(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; client = test_framework_client_new("mongodb://server", NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_update_many_with_opts( bulk, tmp_bson("{'_id': 5}"), tmp_bson("{'set': {'_id': 6}}"), NULL, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key 'set': update only works with $ operators"); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_bulk_opts_parse(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *q = tmp_bson("{'_id': 1}"); bson_t *u = tmp_bson("{'$set': {'x': 1}}"); bson_t *repl = tmp_bson("{'x': 1}"); bson_error_t error; bool r; client = test_framework_client_new("mongodb://server", NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); #define RM_ERR(_msg, _fn, ...) \ r = mongoc_bulk_operation_##_fn##_with_opts(bulk, q, __VA_ARGS__, &error); \ BSON_ASSERT(!r); \ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid " _msg) #define UPDATE_ERR(_msg, _fn, ...) \ r = mongoc_bulk_operation_update_##_fn##_with_opts(bulk, q, u, __VA_ARGS__, &error); \ BSON_ASSERT(!r); \ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid " _msg) #define REPLACE_ERR(_msg, ...) \ r = mongoc_bulk_operation_replace_one_with_opts(bulk, q, repl, __VA_ARGS__, &error); \ BSON_ASSERT(!r); \ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid " _msg) RM_ERR("option 'foo'", remove_one, tmp_bson("{'foo': 1}")); RM_ERR("option 'foo'", remove_many, tmp_bson("{'foo': 1}")); RM_ERR("\"limit\" in opts: 2", remove_one, tmp_bson("{'limit': 2}")); RM_ERR("\"limit\" in opts: 2", remove_many, tmp_bson("{'limit': 2}")); RM_ERR("\"limit\" in opts: 0", remove_one, tmp_bson("{'limit': 0}")); RM_ERR("\"limit\" in opts: 1", remove_many, tmp_bson("{'limit': 1}")); UPDATE_ERR("option 'foo'", one, tmp_bson("{'foo': 1}")); UPDATE_ERR("option 'foo'", many, tmp_bson("{'foo': 1}")); UPDATE_ERR("\"multi\" in opts: true", one, tmp_bson("{'multi': true}")); UPDATE_ERR("\"multi\" in opts: false", many, tmp_bson("{'multi': false}")); REPLACE_ERR("option 'foo'", tmp_bson("{'foo': 1}")); REPLACE_ERR("\"multi\": true in opts", tmp_bson("{'multi': true}")); #define NO_ERR(_fn, ...) ASSERT_OR_PRINT(mongoc_bulk_operation_##_fn##_with_opts(bulk, __VA_ARGS__, &error), error) /* for some reason we allow "multi" and "limit", if they equal the default */ NO_ERR(remove_one, q, tmp_bson("{'limit': 1}")); NO_ERR(remove_many, q, tmp_bson("{'limit': 0}")); NO_ERR(update_one, q, u, tmp_bson("{'multi': false}")); NO_ERR(update_many, q, u, tmp_bson("{'multi': true}")); NO_ERR(replace_one, q, repl, tmp_bson("{'multi': false}")); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_bulk_no_client(void) { mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bulk = mongoc_bulk_operation_new(true /* ordered */); BSON_ASSERT(!mongoc_bulk_operation_execute(bulk, &reply, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "requires a client"); /* reply was initialized */ BSON_ASSERT(bson_empty(&reply)); mongoc_bulk_operation_destroy(bulk); bson_destroy(&reply); } static void test_bulk_bypass_document_validation(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; uint32_t i; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "bypass_validation"); /* bypassDocumentValidation can't be passed in opts */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson("{'bypassDocumentValidation': true}")); i = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_CMPUINT32(i, ==, (uint32_t)0); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option 'bypassDocumentValidation'"); mongoc_bulk_operation_destroy(bulk); /* not allowed in insert opts either */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); r = mongoc_bulk_operation_insert_with_opts( bulk, tmp_bson("{}"), tmp_bson("{'bypassDocumentValidation': true}"), &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option 'bypassDocumentValidation'"); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_bulk_let(bulkop op) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; request_t *request; future_t *future; const char *expect_msg = NULL; const char *expect_doc = NULL; bool r = false; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson("{'let': {'id': 1}}")); switch (op) { case BULK_REMOVE: r = mongoc_bulk_operation_remove_many_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), NULL, &error); expect_msg = "{'$db': 'test'," " 'delete': 'test'," " 'let': {'id': 1}," " 'ordered': true}"; expect_doc = "{'q': {'$expr': {'$eq': ['$_id', '$$id']}}, 'limit': 0}"; break; case BULK_REMOVE_ONE: r = mongoc_bulk_operation_remove_one_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), NULL, &error); expect_msg = "{'$db': 'test'," " 'delete': 'test'," " 'let': {'id': 1}," " 'ordered': true}"; expect_doc = "{'q': {'$expr': {'$eq': ['$_id', '$$id']}}, 'limit': 1}"; break; case BULK_REPLACE_ONE: r = mongoc_bulk_operation_replace_one_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'x': 'foo'}"), NULL, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'let': {'id': 1}," " 'ordered': true}"; expect_doc = "{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'x': 'foo'}," " 'multi': false}"; break; case BULK_UPDATE: r = mongoc_bulk_operation_update_many_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'$set': {'x': 'foo'}}"), NULL, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'let': {'id': 1}," " 'ordered': true}"; expect_doc = "{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'$set': {'x': 'foo'}}," " 'multi': true}"; break; case BULK_UPDATE_ONE: r = mongoc_bulk_operation_update_one_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'$set': {'x': 'foo'}}"), NULL, &error); expect_msg = "{'$db': 'test'," " 'update': 'test'," " 'let': {'id': 1}," " 'ordered': true}"; expect_doc = "{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'$set': {'x': 'foo'}}," " 'multi': false}"; break; default: BSON_ASSERT(false); } ASSERT_OR_PRINT(r, error); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson(expect_msg), tmp_bson(expect_doc)); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); ASSERT(future_get_uint32_t(future)); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_bulk_let(void) { _test_bulk_let(BULK_REMOVE); _test_bulk_let(BULK_REMOVE_ONE); _test_bulk_let(BULK_REPLACE_ONE); _test_bulk_let(BULK_UPDATE); _test_bulk_let(BULK_UPDATE_ONE); } static void test_bulk_let_multi(void) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; request_t *request; future_t *future; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, tmp_bson("{'let': {'id': 1}}")); mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'_id': 1}"), NULL, &error); mongoc_bulk_operation_remove_many_with_opts(bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), NULL, &error); mongoc_bulk_operation_remove_many_with_opts(bulk, tmp_bson("{'_id': 2}"), NULL, &error); mongoc_bulk_operation_replace_one_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'x': 'foo'}"), NULL, &error); mongoc_bulk_operation_update_many_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'$set': {'x': 'foo'}}"), NULL, &error); mongoc_bulk_operation_update_one_with_opts( bulk, tmp_bson("{'$expr': {'$eq': ['$_id', '$$id']}}"), tmp_bson("{'$set': {'x': 'foo'}}"), NULL, &error); future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'insert': 'test'," " 'let': {'$exists': false}," " 'ordered': true}"), tmp_bson("{'_id': 1}")); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'delete': 'test'," " 'let': {'id': 1}," " 'ordered': true}"), tmp_bson("{'q': {'$expr': {'$eq': ['$_id', '$$id']}}, 'limit': 0}"), tmp_bson("{'q': {'_id': 2}, 'limit': 0}")); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); request = mock_server_receives_msg(mock_server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'update': 'test'," " 'let': {'id': 1}," " 'ordered': true}"), tmp_bson("{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'x': 'foo'}," " 'multi': false}"), tmp_bson("{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'$set': {'x': 'foo'}}," " 'multi': true}"), tmp_bson("{'q': {'$expr': {'$eq': ['$_id', '$$id']}}," " 'u': {'$set': {'x': 'foo'}}," " 'multi': false}")); reply_to_request_simple(request, "{'ok': 1.0, 'n': 1}"); request_destroy(request); ASSERT(future_get_uint32_t(future)); future_destroy(future); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(mock_server); } // Test a bulk write operation that receives two error replies from two // commands. static void test_bulk_write_multiple_errors(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_client_set_appname(client, "test_bulk_write_multiple_errors"); collection = get_test_collection(client, "test_bulk_write_multiple_errors"); BSON_ASSERT(collection); // Use ordered:false so the bulk operation continues to send commands after // the first error. bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); // Use appName to isolate the failpoint to this test. bool ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 2}, " "'data': {'failCommands': ['insert', 'delete'], 'errorCode': " "8, 'appName': 'test_bulk_write_multiple_errors'}}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); // fail via failPoint mongoc_bulk_operation_remove(bulk, tmp_bson("{'_id': 1}")); // fail via failPoint mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 4}")); // succeed mongoc_bulk_operation_remove(bulk, tmp_bson("{'_id': 4}")); // suceed mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 5}")); // suceed mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 5}")); // duplicate key error r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); BSON_ASSERT(!r); ASSERT_MATCH(&reply, "{'nInserted': 2," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 1," " 'nUpserted': 0," " 'errorReplies': [{'code': 8}, {'code': 8}]," " 'writeErrors': [{ 'index' : 5 }]}"); assert_write_error_count(1, &reply); ASSERT_COUNT(1, collection); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } // test_bulk_write_set_client_after_operation is a regression test for // CDRIVER-4665. static void test_bulk_write_set_client_after_operation(void) { mongoc_client_t *client; mongoc_bulk_operation_t *bulk; bson_t reply; bson_error_t error; bool ok; client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_client_set_appname(client, "test_bulk_write_client_after_operation"); bulk = mongoc_bulk_operation_new(false /* ordered */); ok = mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'x': 1}"), tmp_bson("{}"), &error); ASSERT_OR_PRINT(ok, error); mongoc_bulk_operation_set_client(bulk, client); mongoc_bulk_operation_set_database(bulk, "db"); mongoc_bulk_operation_set_collection(bulk, "coll"); ok = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(ok, error); ASSERT_MATCH(&reply, "{'nInserted': 1 }"); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_client_destroy(client); } // regression test for CDRIVER-5819 static void test_bulk_write_set_client_updates_operation_id_when_client_changes(void) { mock_server_t *mock_server; mongoc_client_t *client, *client2; mongoc_bulk_operation_t *bulk; int64_t last_operation_id; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); BSON_ASSERT(client); bulk = mongoc_bulk_operation_new(true /* ordered */); // operation_id is fetched from the client mongoc_bulk_operation_set_client(bulk, client); ASSERT_CMPINT64(bulk->operation_id, ==, client->cluster.operation_id); last_operation_id = bulk->operation_id; // operation_id is not changed when the client remains the same mongoc_bulk_operation_set_client(bulk, client); ASSERT_CMPINT64(bulk->operation_id, ==, last_operation_id); ASSERT_CMPINT64(bulk->operation_id, ==, client->cluster.operation_id); // operation_id is updated when the client changes client2 = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); BSON_ASSERT(client2); mongoc_bulk_operation_set_client(bulk, client2); ASSERT_CMPINT64(bulk->operation_id, !=, last_operation_id); ASSERT_CMPINT64(bulk->operation_id, ==, client2->cluster.operation_id); mongoc_bulk_operation_destroy(bulk); mongoc_client_destroy(client); mongoc_client_destroy(client2); mock_server_destroy(mock_server); } static void test_multiple_execution(void) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_multiple_execution"); bson_error_t error; mongoc_bulk_operation_t *bulk = mongoc_collection_create_bulk_operation_with_opts(coll, NULL); mongoc_bulk_operation_insert(bulk, tmp_bson("{}")); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); ASSERT(!mongoc_bulk_operation_execute(bulk, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // `test_bulk_big_let` tests a bulk operation with a large let document to reproduce CDRIVER-6112: static void test_bulk_big_let(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_big_let"); bson_error_t error; // Create bulk operation similar to PHP driver: mongoc_bulk_operation_t *bulk = mongoc_bulk_operation_new(true /* ordered */); // Set a large `let`: { "testDocument": { "a": "aaa..." } } { bson_t let = BSON_INITIALIZER, testDocument; bson_append_document_begin(&let, "testDocument", -1, &testDocument); // Append big string: { size_t num_chars = 79; char *big_string = bson_malloc0(num_chars + 1); memset(big_string, 'a', num_chars); BSON_APPEND_UTF8(&testDocument, "a", big_string); bson_free(big_string); } bson_append_document_end(&let, &testDocument); mongoc_bulk_operation_set_let(bulk, &let); bson_destroy(&let); } mongoc_bulk_operation_set_client(bulk, client); mongoc_bulk_operation_set_database(bulk, "db"); mongoc_bulk_operation_set_collection(bulk, "coll"); mongoc_bulk_operation_update( bulk, tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'document': '$$testDocument'}}"), true); ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_bulk_install(TestSuite *suite) { TestSuite_AddLive(suite, "/BulkOperation/basic", test_bulk); TestSuite_AddLive(suite, "/BulkOperation/opts", test_opts); TestSuite_AddMockServerTest(suite, "/BulkOperation/error", test_bulk_error); TestSuite_AddMockServerTest(suite, "/BulkOperation/error/unordered", test_bulk_error_unordered); TestSuite_AddLive(suite, "/BulkOperation/insert_ordered", test_insert_ordered); TestSuite_AddLive(suite, "/BulkOperation/insert_unordered", test_insert_unordered); TestSuite_AddLive(suite, "/BulkOperation/insert_check_keys", test_insert_check_keys); TestSuite_AddLive(suite, "/BulkOperation/update_ordered", test_update_ordered); TestSuite_AddLive(suite, "/BulkOperation/update_unordered", test_update_unordered); TestSuite_AddLive(suite, "/BulkOperation/update_one_check_keys", test_update_one_check_keys); TestSuite_AddLive(suite, "/BulkOperation/update_check_keys", test_update_check_keys); TestSuite_AddLive(suite, "/BulkOperation/update_one_with_opts_check_keys", test_update_one_with_opts_check_keys); TestSuite_AddLive(suite, "/BulkOperation/update_many_with_opts_check_keys", test_update_many_with_opts_check_keys); TestSuite_AddLive(suite, "/BulkOperation/update_one_invalid_first", test_update_one_invalid_first); TestSuite_AddLive(suite, "/BulkOperation/update_invalid_first", test_update_invalid_first); TestSuite_AddLive( suite, "/BulkOperation/update_one_with_opts_invalid_first", test_update_one_with_opts_invalid_first); TestSuite_AddLive( suite, "/BulkOperation/update_many_with_opts_invalid_first", test_update_many_with_opts_invalid_first); TestSuite_AddLive(suite, "/BulkOperation/replace_one_invalid_first", test_replace_one_invalid_first); TestSuite_AddLive( suite, "/BulkOperation/replace_one_with_opts_invalid_first", test_replace_one_with_opts_invalid_first); TestSuite_AddLive(suite, "/BulkOperation/update_one_invalid_second", test_update_one_invalid_second); TestSuite_AddLive(suite, "/BulkOperation/update_invalid_second", test_update_invalid_second); TestSuite_AddLive( suite, "/BulkOperation/update_one_with_opts_invalid_second", test_update_one_with_opts_invalid_second); TestSuite_AddLive( suite, "/BulkOperation/update_many_with_opts_invalid_second", test_update_many_with_opts_invalid_second); TestSuite_AddLive(suite, "/BulkOperation/replace_one_invalid_second", test_replace_one_invalid_second); TestSuite_AddLive( suite, "/BulkOperation/replace_one_with_opts_invalid_second", test_replace_one_with_opts_invalid_second); TestSuite_AddLive(suite, "/BulkOperation/insert_invalid_first", test_insert_invalid_first); TestSuite_AddLive(suite, "/BulkOperation/insert_invalid_second", test_insert_invalid_second); TestSuite_AddLive(suite, "/BulkOperation/insert_with_opts_invalid_first", test_insert_with_opts_invalid_first); TestSuite_AddLive(suite, "/BulkOperation/insert_with_opts_invalid_second", test_insert_with_opts_invalid_second); TestSuite_AddLive(suite, "/BulkOperation/insert_with_opts_validate", test_insert_with_opts_validate); TestSuite_AddLive(suite, "/BulkOperation/remove_one_after_invalid", test_remove_one_after_invalid); TestSuite_AddLive(suite, "/BulkOperation/remove_after_invalid", test_remove_after_invalid); TestSuite_AddLive( suite, "/BulkOperation/remove_one_with_opts_after_invalid", test_remove_one_with_opts_after_invalid); TestSuite_AddLive( suite, "/BulkOperation/remove_many_with_opts_after_invalid", test_remove_many_with_opts_after_invalid); TestSuite_AddLive(suite, "/BulkOperation/upsert_ordered", test_upsert_ordered); TestSuite_AddLive(suite, "/BulkOperation/upsert_unordered", test_upsert_unordered); TestSuite_AddFull(suite, "/BulkOperation/upsert_unordered_oversized [lock:live-server][timeout:30]", test_upsert_unordered_oversized, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/upsert_large [lock:live-server][timeout:30]", test_upsert_large, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/upsert_huge [lock:live-server][timeout:30]", test_upsert_huge, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/BulkOperation/upserted_index_ordered", test_upserted_index_ordered); TestSuite_AddLive(suite, "/BulkOperation/upserted_index_unordered", test_upserted_index_unordered); TestSuite_AddLive(suite, "/BulkOperation/update_one_ordered", test_update_one_ordered); TestSuite_AddLive(suite, "/BulkOperation/update_one_unordered", test_update_one_unordered); TestSuite_AddLive(suite, "/BulkOperation/update_with_opts_validate", test_update_with_opts_validate); TestSuite_AddFull(suite, "/BulkOperation/update_arrayfilters [lock:live-server]", test_update_arrayfilters, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/BulkOperation/update/hint/validate", test_update_hint_validate); TestSuite_AddLive(suite, "/BulkOperation/delete/hint/validate", test_delete_hint_validate); TestSuite_AddLive(suite, "/BulkOperation/replace_one_ordered", test_replace_one_ordered); TestSuite_AddLive(suite, "/BulkOperation/replace_one_unordered", test_replace_one_unordered); TestSuite_AddLive(suite, "/BulkOperation/replace_one/keys", test_replace_one_check_keys); TestSuite_AddLive(suite, "/BulkOperation/replace_one_with_opts/keys", test_replace_one_with_opts_check_keys); TestSuite_AddLive(suite, "/BulkOperation/replace_one_with_opts_validate", test_replace_one_with_opts_validate); TestSuite_AddLive(suite, "/BulkOperation/index_offset", test_index_offset); TestSuite_AddLive(suite, "/BulkOperation/single_ordered_bulk", test_single_ordered_bulk); TestSuite_AddLive(suite, "/BulkOperation/insert_continue_on_error", test_insert_continue_on_error); TestSuite_AddLive(suite, "/BulkOperation/update_continue_on_error", test_update_continue_on_error); TestSuite_AddLive(suite, "/BulkOperation/remove_continue_on_error", test_remove_continue_on_error); TestSuite_AddLive(suite, "/BulkOperation/single_error_ordered_bulk", test_single_error_ordered_bulk); TestSuite_AddLive(suite, "/BulkOperation/multiple_error_ordered_bulk", test_multiple_error_ordered_bulk); TestSuite_AddLive(suite, "/BulkOperation/single_unordered_bulk", test_single_unordered_bulk); TestSuite_AddLive(suite, "/BulkOperation/single_error_unordered_bulk", test_single_error_unordered_bulk); TestSuite_AddFull(suite, "/BulkOperation/oversized/ordered [lock:live-server][timeout:30]", test_oversized_bulk_op_ordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/oversized/unordered [lock:live-server][timeout:30]", test_oversized_bulk_op_unordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddMockServerTest( suite, "/BulkOperation/write_concern/write_command/ordered", test_write_concern_write_command_ordered); TestSuite_AddMockServerTest(suite, "/BulkOperation/write_concern/write_command/ordered/multi_err", test_write_concern_write_command_ordered_multi_err); TestSuite_AddMockServerTest( suite, "/BulkOperation/write_concern/write_command/unordered", test_write_concern_write_command_unordered); TestSuite_AddMockServerTest(suite, "/BulkOperation/write_concern/write_command/unordered/multi_err", test_write_concern_write_command_unordered_multi_err); TestSuite_AddMockServerTest(suite, "/BulkOperation/writes/unordered/error", test_unordered_bulk_writes_with_error); TestSuite_AddMockServerTest( suite, "/BulkOperation/write_concern/error/write_command/v1", test_write_concern_error_write_command_v1); TestSuite_AddMockServerTest( suite, "/BulkOperation/write_concern/error/write_command/v2", test_write_concern_error_write_command_v2); TestSuite_AddLive(suite, "/BulkOperation/multiple_error_unordered_bulk", test_multiple_error_unordered_bulk); TestSuite_AddMockServerTest(suite, "/BulkOperation/wtimeout_duplicate_key/write_commands", test_wtimeout_plus_duplicate_key_err_write_commands); TestSuite_AddFull(suite, "/BulkOperation/large_inserts_ordered [lock:live-server][timeout:30]", test_large_inserts_ordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/large_inserts_unordered [lock:live-server][timeout:30]", test_large_inserts_unordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/numerous_ordered [lock:live-server][timeout:30]", test_numerous_ordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/BulkOperation/numerous_unordered [lock:live-server][timeout:30]", test_numerous_unordered, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/BulkOperation/CDRIVER-372_ordered", test_bulk_edge_case_372_ordered); TestSuite_AddLive(suite, "/BulkOperation/CDRIVER-372_unordered", test_bulk_edge_case_372_unordered); TestSuite_AddLive(suite, "/BulkOperation/new", test_bulk_new); TestSuite_AddLive(suite, "/BulkOperation/OP_MSG/max_batch_size", test_bulk_max_batch_size); TestSuite_AddLive(suite, "/BulkOperation/OP_MSG/max_msg_size", test_bulk_max_msg_size); TestSuite_AddFull(suite, "/BulkOperation/split [lock:live-server]", test_bulk_split, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_sessions); TestSuite_AddFull(suite, "/BulkOperation/write_concern/split [lock:live-server]", test_bulk_write_concern_split, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_getlasterror); TestSuite_AddMockServerTest( suite, "/BulkOperation/hint/single/command/secondary", test_hint_single_command_secondary); TestSuite_AddMockServerTest(suite, "/BulkOperation/hint/single/command/primary", test_hint_single_command_primary); TestSuite_AddMockServerTest( suite, "/BulkOperation/hint/pooled/command/secondary", test_hint_pooled_command_secondary); TestSuite_AddMockServerTest(suite, "/BulkOperation/hint/pooled/command/primary", test_hint_pooled_command_primary); TestSuite_AddLive(suite, "/BulkOperation/reply_w0", test_bulk_reply_w0); TestSuite_AddLive(suite, "/BulkOperation/invalid_write_concern", test_bulk_invalid_write_concern); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/collation/w0", test_bulk_collation_w0); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/collation/w1", test_bulk_collation_w1); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/collation/multi/w0", test_bulk_collation_multi_w0); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/collation/multi/w1", test_bulk_collation_multi_w1); TestSuite_Add(suite, "/BulkOperation/update_one/error_message", test_bulk_update_one_error_message); TestSuite_Add(suite, "/BulkOperation/opts/parse", test_bulk_opts_parse); TestSuite_Add(suite, "/BulkOperation/no_client", test_bulk_no_client); TestSuite_AddLive(suite, "/BulkOperation/bypass", test_bulk_bypass_document_validation); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/let", test_bulk_let); TestSuite_AddMockServerTest(suite, "/BulkOperation/opts/let/multi", test_bulk_let_multi); TestSuite_AddFull(suite, "/BulkOperation/multiple_errors [lock:live-server]", test_bulk_write_multiple_errors, NULL, NULL, test_framework_skip_if_no_failpoint); TestSuite_AddLive(suite, "/BulkOperation/set_client_after_operation", test_bulk_write_set_client_after_operation); TestSuite_AddMockServerTest(suite, "/BulkOperation/set_client_updates_operation_id_when_client_changes", test_bulk_write_set_client_updates_operation_id_when_client_changes); TestSuite_AddLive(suite, "/BulkOperation/multiple_execution", test_multiple_execution); TestSuite_AddFull( suite, "/BulkOperation/big_let [lock:live-server]", test_bulk_big_let, NULL, NULL, test_framework_skip_if_max_wire_version_less_than_13 /* 5.0+ for 'let' support in CRUD commands */); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-bulkwrite.c000066400000000000000000001267621511661753600247100ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // This file includes tests `mongoc_bulkwrite_t` for basic usage and libmongoc-specific behavior. // The specification tests (prose and JSON) include more coverage of driver-agnostic behavior. #include #include #include #include #include #include #include #include static void test_bulkwrite_insert(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; mongoc_client_t *client = test_framework_new_default_client(); // Drop prior data. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Ignore return. mongoc_collection_destroy(coll); } // Insert two documents with verbose results. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{'_id': 123}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{'_id': 456}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); // Do the bulk write. mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, opts); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Ensure results report IDs inserted. { ASSERT(bwr.res); const bson_t *insertResults = mongoc_bulkwriteresult_insertresults(bwr.res); ASSERT(insertResults); ASSERT_MATCH(insertResults, BSON_STR({"0" : {"insertedId" : 123}, "1" : {"insertedId" : 456}})); } mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteopts_destroy(opts); mongoc_client_destroy(client); } static void test_bulkwrite_upsert_with_null(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; mongoc_client_t *client = test_framework_new_default_client(); // Drop prior data. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Ignore return. mongoc_collection_destroy(coll); } // Upsert document with an `_id` of null. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); mongoc_bulkwrite_replaceoneopts_t *roo = mongoc_bulkwrite_replaceoneopts_new(); mongoc_bulkwrite_replaceoneopts_set_upsert(roo, true); ok = mongoc_bulkwrite_append_replaceone(bw, "db.coll", tmp_bson("{}"), tmp_bson("{'_id': null}"), roo, &error); ASSERT_OR_PRINT(ok, error); // Do the bulk write. mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, opts); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Ensure results report null ID inserted. { ASSERT(bwr.res); const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(bwr.res); ASSERT(updateResults); ASSERT_MATCH(updateResults, BSON_STR({"0" : {"matchedCount" : 1, "modifiedCount" : 0, "upsertedId" : null}})); } mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteopts_destroy(opts); mongoc_bulkwrite_replaceoneopts_destroy(roo); mongoc_client_destroy(client); } static void test_bulkwrite_writeError(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; mongoc_client_t *client = test_framework_new_default_client(); // Drop prior data. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Ignore return. mongoc_collection_destroy(coll); } // Insert two documents with verbose results. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{'_id': 123}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{'_id': 123}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); // Do the bulk write. mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, opts); // Expect an error. ASSERT(bwr.exc); const bson_t *ed = mongoc_bulkwriteexception_writeerrors(bwr.exc); ASSERT_MATCH(ed, BSON_STR({ "1" : { "code" : 11000, "message" : "E11000 duplicate key error collection: db.coll index: _id_ dup key: { _id: 123 }", "details" : {} } })); // Ensure results report only one ID inserted. ASSERT(bwr.res); const bson_t *insertResults = mongoc_bulkwriteresult_insertresults(bwr.res); ASSERT(insertResults); ASSERT_MATCH(insertResults, BSON_STR({"0" : {"insertedId" : 123}})); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteopts_destroy(opts); mongoc_client_destroy(client); } static void test_bulkwrite_session_with_unacknowledged(void *ctx) { BSON_UNUSED(ctx); bool ok; bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); mongoc_client_session_t *session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_ordered(opts, false); mongoc_bulkwriteopts_set_writeconcern(opts, wc); // Execute bulk write: ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwrite_set_session(bw, session); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); // Expect no result and an error: ASSERT(!ret.res); ASSERT(ret.exc); ASSERT(mongoc_bulkwriteexception_error(ret.exc, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot use client session with unacknowledged command"); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_client_session_destroy(session); mongoc_bulkwriteopts_destroy(opts); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); mongoc_write_concern_destroy(wc); } static void test_bulkwrite_double_execute(void *ctx) { BSON_UNUSED(ctx); bool ok; bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect an error on reuse. ASSERT(!mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); ASSERT(!mongoc_bulkwrite_append_updateone(bw, "db.coll", tmp_bson("{}"), tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); ASSERT(!mongoc_bulkwrite_append_updatemany(bw, "db.coll", tmp_bson("{}"), tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); ASSERT(!mongoc_bulkwrite_append_replaceone(bw, "db.coll", tmp_bson("{}"), tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); ASSERT(!mongoc_bulkwrite_append_deleteone(bw, "db.coll", tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); ASSERT(!mongoc_bulkwrite_append_deletemany(bw, "db.coll", tmp_bson("{}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); memset(&error, 0, sizeof(error)); { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(!bwr.res); // No result due to no successful writes. ASSERT(bwr.exc); ASSERT(mongoc_bulkwriteexception_error(bwr.exc, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write already executed"); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); } mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static uint32_t _select_server_and_get_id(mongoc_client_t *client) { bson_error_t error; mongoc_server_description_t *const sd = mongoc_client_select_server(client, true /* for_writes */, NULL, &error); ASSERT_OR_PRINT(sd, error); uint32_t const selected_serverid = mongoc_server_description_id(sd); mongoc_server_description_destroy(sd); return selected_serverid; } static void _capture_last_bulkWrite_serverid(const mongoc_apm_command_started_t *event) { if (0 == strcmp(mongoc_apm_command_started_get_command_name(event), "bulkWrite")) { uint32_t *last_captured = mongoc_apm_command_started_get_context(event); *last_captured = mongoc_apm_command_started_get_server_id(event); } } static void _setup_last_captured_serverid_callback(mongoc_client_t *client, uint32_t *id) { mongoc_apm_callbacks_t *const cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, _capture_last_bulkWrite_serverid); mongoc_client_set_apm_callbacks(client, cbs, id); mongoc_apm_callbacks_destroy(cbs); } static void test_bulkwrite_serverid(void *ctx) { mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); uint32_t const selected_serverid = _select_server_and_get_id(client); uint32_t last_captured = 0; _setup_last_captured_serverid_callback(client, &last_captured); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_serverid(bwo, selected_serverid); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); // Getting the server ID before calling `mongoc_bulkwrite_execute` is an error { mongoc_bulkwrite_serverid_t const serverid_maybe = mongoc_bulkwrite_serverid(bw, &error); ASSERT(!serverid_maybe.is_ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write has not been executed or execution failed"); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bwo); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Expect the selected server is reported as used. mongoc_bulkwrite_serverid_t const serverid_maybe = mongoc_bulkwrite_serverid(bw, &error); ASSERT_OR_PRINT(serverid_maybe.is_ok, error); uint32_t const used_serverid = serverid_maybe.serverid; ASSERT_CMPUINT32(selected_serverid, ==, used_serverid); // Expect both mongoc_bulkwrite_t and mongoc_bulkwriteresult_t report the same server ID uint32_t const used_serverid_res = mongoc_bulkwriteresult_serverid(bwr.res); ASSERT_CMPUINT32(used_serverid, ==, used_serverid_res); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect the selected server is reported as used in command monitoring. ASSERT_CMPUINT32(last_captured, ==, selected_serverid); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void _set_opts_for_unacknowledged_writes(mongoc_bulkwriteopts_t *opts) { mongoc_bulkwriteopts_set_ordered(opts, false); mongoc_write_concern_t *const wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); mongoc_bulkwriteopts_set_writeconcern(opts, wc); mongoc_write_concern_destroy(wc); } static void test_bulkwrite_serverid_unacknowledged(void *ctx) { mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); uint32_t const selected_serverid = _select_server_and_get_id(client); uint32_t last_captured = 0; _setup_last_captured_serverid_callback(client, &last_captured); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_serverid(bwo, selected_serverid); _set_opts_for_unacknowledged_writes(bwo); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bwo); ASSERT(!bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Expect the selected server is reported as used. mongoc_bulkwrite_serverid_t const serverid_maybe = mongoc_bulkwrite_serverid(bw, &error); ASSERT_OR_PRINT(serverid_maybe.is_ok, error); uint32_t const used_serverid = serverid_maybe.serverid; ASSERT_CMPUINT32(selected_serverid, ==, used_serverid); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect the selected server is reported as used in command monitoring. ASSERT_CMPUINT32(last_captured, ==, selected_serverid); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void _setup_bulkwrite_fail_point(mongoc_client_t *client, uint32_t serverid) { bson_error_t error; bool const ret = mongoc_client_command_simple_with_server_id(client, "admin", tmp_bson(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["bulkWrite"], "closeConnection" : true} })), NULL, serverid, NULL, &error); ASSERT_OR_PRINT(ret, error); } static void test_bulkwrite_serverid_on_retry(void *ctx) { BSON_UNUSED(ctx); bool ok; bson_error_t error; mongoc_uri_t *uri = test_framework_get_uri(); ASSERT_OR_PRINT(test_framework_uri_apply_multi_mongos(uri, true, &error), error); mongoc_client_t *client = mongoc_client_new_from_uri(uri); test_framework_set_ssl_opts(client); uint32_t const selected_serverid = _select_server_and_get_id(client); _setup_bulkwrite_fail_point(client, selected_serverid); uint32_t last_captured = 0; _setup_last_captured_serverid_callback(client, &last_captured); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_serverid(bwo, selected_serverid); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bwo); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Expect a different server was used due to retry. mongoc_bulkwrite_serverid_t const serverid_maybe = mongoc_bulkwrite_serverid(bw, &error); ASSERT_OR_PRINT(serverid_maybe.is_ok, error); uint32_t const used_serverid = serverid_maybe.serverid; ASSERT_CMPUINT32(selected_serverid, !=, used_serverid); // Expect both mongoc_bulkwrite_t and mongoc_bulkwriteresult_t report the same server ID uint32_t const used_serverid_res = mongoc_bulkwriteresult_serverid(bwr.res); ASSERT_CMPUINT32(used_serverid, ==, used_serverid_res); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); // Expect the used server was reported in command monitoring. ASSERT_CMPUINT32(last_captured, ==, used_serverid); } mongoc_uri_destroy(uri); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void capture_last_bulkWrite_command(const mongoc_apm_command_started_t *event) { if (0 == strcmp(mongoc_apm_command_started_get_command_name(event), "bulkWrite")) { bson_t *last_captured = mongoc_apm_command_started_get_context(event); bson_destroy(last_captured); const bson_t *cmd = mongoc_apm_command_started_get_command(event); bson_copy_to(cmd, last_captured); } } static void test_bulkwrite_extra(void *ctx) { mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); bson_t last_captured = BSON_INITIALIZER; // Set callback to capture the last `bulkWrite` command. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, capture_last_bulkWrite_command); mongoc_client_set_apm_callbacks(client, cbs, &last_captured); mongoc_apm_callbacks_destroy(cbs); } mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); // Create bulk write. { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); } mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); // Create bulk write options with extra options. { bson_t *extra = tmp_bson("{'comment': 'foo'}"); mongoc_bulkwriteopts_set_extra(bwo, extra); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bwo); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect `bulkWrite` command was sent with extra option. ASSERT_MATCH(&last_captured, "{'comment': 'foo'}"); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); bson_destroy(&last_captured); mongoc_client_destroy(client); } static void test_bulkwrite_no_verbose_results(void *ctx) { mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); // Create bulk write. { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_bulkwrite_append_deleteone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL /* opts */); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Expect no verbose results. ASSERT(NULL == mongoc_bulkwriteresult_insertresults(bwr.res)); ASSERT(NULL == mongoc_bulkwriteresult_updateresults(bwr.res)); ASSERT(NULL == mongoc_bulkwriteresult_deleteresults(bwr.res)); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void capture_all_bulkWrite_commands(const mongoc_apm_command_started_t *event) { if (0 == strcmp(mongoc_apm_command_started_get_command_name(event), "bulkWrite")) { mongoc_array_t *captured = mongoc_apm_command_started_get_context(event); bson_t *cmd = bson_copy(mongoc_apm_command_started_get_command(event)); _mongoc_array_append_val(captured, cmd); } } // `test_bulkwrite_many_namespaces` tests a bulk write with many unique namespace entries. // An early implementation used linear look-up for namespaces. It resulted in a very long test runtime (30 minutes+). // A hash map was used to improve the look-up. static void test_bulkwrite_many_namespaces(void *ctx) { mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); mongoc_array_t captured; _mongoc_array_init(&captured, sizeof(bson_t *)); // Set callback to capture all `bulkWrite` commands. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, capture_all_bulkWrite_commands); mongoc_client_set_apm_callbacks(client, cbs, &captured); mongoc_apm_callbacks_destroy(cbs); } // Get `maxWriteBatchSize` from the server. int32_t maxWriteBatchSize; { bson_t reply; ok = mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, &reply, &error); ASSERT_OR_PRINT(ok, error); maxWriteBatchSize = bson_lookup_int32(&reply, "maxWriteBatchSize"); bson_destroy(&reply); } mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); // Create bulk write large enough to split into two batches. Use a unique namespace per model. { for (int32_t i = 0; i < maxWriteBatchSize + 1; i++) { char *ns = bson_strdup_printf("db.coll%" PRId32, i); ok = mongoc_bulkwrite_append_deleteone(bw, ns, tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); bson_free(ns); } } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL /* opts */); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect two `bulkWrite` commands were sent. ASSERT_CMPSIZE_T(captured.len, ==, 2); bson_t *first = _mongoc_array_index(&captured, bson_t *, 0); // Expect the first contains maxWriteBatchSize `nsInfo` entries: { bson_t *nsInfo = bson_lookup_bson(first, "nsInfo"); ASSERT_CMPUINT32(bson_count_keys(nsInfo), ==, maxWriteBatchSize); bson_destroy(nsInfo); } // Expect the second only contains one `nsInfo` entry: bson_t *second = _mongoc_array_index(&captured, bson_t *, 1); { bson_t *nsInfo = bson_lookup_bson(second, "nsInfo"); ASSERT_CMPUINT32(bson_count_keys(nsInfo), ==, 1); bson_destroy(nsInfo); } for (size_t i = 0; i < captured.len; i++) { bson_t *el = _mongoc_array_index(&captured, bson_t *, i); bson_destroy(el); } _mongoc_array_destroy(&captured); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void test_bulkwrite_execute_requires_client(void *ctx) { BSON_UNUSED(ctx); bool ok; bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_bulkwrite_t *bw = mongoc_bulkwrite_new(); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); // Attempt execution without assigning a client { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(!bwr.res); // No result due to no successful writes. ASSERT(bwr.exc); ASSERT(mongoc_bulkwriteexception_error(bwr.exc, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write requires a client and one has not been set"); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); } // Assign a client and execute successfully { mongoc_bulkwrite_set_client(bw, client); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } // `test_bulkwrite_two_large_inserts` is a regression test for CDRIVER-5869. static void test_bulkwrite_two_large_inserts(void *unused) { BSON_UNUSED(unused); bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); // Drop prior collection: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); mongoc_collection_destroy(coll); } // Allocate a large string: size_t large_len = 2095652; char *large_string = bson_malloc(large_len + 1); memset(large_string, 'a', large_len); large_string[large_len] = '\0'; ASSERT(mlib_in_range(int, large_len)); // Create two large documents: bson_t *docs[2]; docs[0] = BCON_NEW("_id", "over_2mib_1"); bson_append_utf8(docs[0], "unencrypted", -1, large_string, (int)large_len); docs[1] = BCON_NEW("_id", "over_2mib_2"); bson_append_utf8(docs[1], "unencrypted", -1, large_string, (int)large_len); mongoc_bulkwriteopts_t *bw_opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(bw_opts, true); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll", docs[0], NULL, &error), error); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll", docs[1], NULL, &error), error); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bw_opts); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); const bson_t *insertresults = mongoc_bulkwriteresult_insertresults(bwr.res); ASSERT_MATCH(insertresults, BSON_STR({"0" : {"insertedId" : "over_2mib_1"}}, {"1" : {"insertedId" : "over_2mib_2"}})); bson_destroy(docs[0]); bson_destroy(docs[1]); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteopts_destroy(bw_opts); mongoc_client_destroy(client); bson_free(large_string); } // `test_bulkwrite_client_error_no_result` is a regression test for CDRIVER-5969. static void test_bulkwrite_client_error_no_result(void *unused) { BSON_UNUSED(unused); bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); // Trigger a client-side error by adding a too-big document. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_t too_big = BSON_INITIALIZER; const size_t maxMessageSizeByte = 48000000; char *big_string = bson_malloc(maxMessageSizeByte + 1); memset(big_string, 'a', maxMessageSizeByte); big_string[maxMessageSizeByte] = '\0'; BSON_APPEND_UTF8(&too_big, "big", big_string); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll", &too_big, NULL, &error), error); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(!bwr.res); // No result due to no successful writes. ASSERT(bwr.exc); ASSERT(mongoc_bulkwriteexception_error(bwr.exc, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Sending would exceed maxMessageSizeBytes"); bson_free(big_string); bson_destroy(&too_big); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwrite_destroy(bw); } mongoc_client_destroy(client); } static void _do_bulkwrite_check_acknowledged_test_case(mongoc_client_t *client, mongoc_bulkwriteopts_t *opts, bool is_acknowledged_expected) { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_error_t error; bool const ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwritereturn_t const bwr = mongoc_bulkwrite_execute(bw, opts); ASSERT_NO_BULKWRITEEXCEPTION(bwr); mongoc_bulkwrite_check_acknowledged_t const check_acknowledged = mongoc_bulkwrite_check_acknowledged(bw, &error); ASSERT_OR_PRINT(check_acknowledged.is_ok, error); ASSERT_CMPBOOL(check_acknowledged.is_acknowledged, ==, is_acknowledged_expected); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwrite_destroy(bw); } static void test_bulkwrite_check_acknowledged(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); // To prevent bulk write exception "Cannot request unacknowledged write concern and ordered writes." mongoc_bulkwriteopts_set_ordered(opts, false); mongoc_write_concern_t *wc_acknowledged = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc_acknowledged, 1); mongoc_write_concern_t *wc_unacknowledged = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc_unacknowledged, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); // Client w/ unacknowledged write concern, no opts override { mongoc_client_set_write_concern(client, wc_unacknowledged); mongoc_bulkwriteopts_set_writeconcern(opts, NULL); _do_bulkwrite_check_acknowledged_test_case(client, opts, false /* is_acknowledged_expected */); } // Client w/ acknowledged write concern, no opts override { mongoc_client_set_write_concern(client, wc_acknowledged); mongoc_bulkwriteopts_set_writeconcern(opts, NULL); _do_bulkwrite_check_acknowledged_test_case(client, opts, true /* is_acknowledged_expected */); } // Client w/ unacknowledged write concern, opts override w/ acknowledged write concern { mongoc_client_set_write_concern(client, wc_unacknowledged); mongoc_bulkwriteopts_set_writeconcern(opts, wc_acknowledged); _do_bulkwrite_check_acknowledged_test_case(client, opts, true /* is_acknowledged_expected */); } // Client w/ acknowledged write concern, opts override w/ unacknowledged write concern { mongoc_client_set_write_concern(client, wc_acknowledged); mongoc_bulkwriteopts_set_writeconcern(opts, wc_unacknowledged); _do_bulkwrite_check_acknowledged_test_case(client, opts, false /* is_acknowledged_expected */); } // Calling `mongoc_bulkwrite_check_acknowledged` before `mongoc_bulkwrite_execute` is an error { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_error_t error; mongoc_bulkwrite_check_acknowledged_t const check_acknowledged = mongoc_bulkwrite_check_acknowledged(bw, &error); ASSERT(!check_acknowledged.is_ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "bulk write has not been executed or execution failed"); mongoc_bulkwrite_destroy(bw); } mongoc_write_concern_destroy(wc_unacknowledged); mongoc_write_concern_destroy(wc_acknowledged); mongoc_bulkwriteopts_destroy(opts); mongoc_client_destroy(client); } // test_bulkwrite_missing_nModified mocks a server reply missing "nModified" in a per-operation update result. // The missing "nModified" is a bug: SERVER-113026. This tests how the driver handles the reply. static void test_bulkwrite_missing_nModified(void) { mock_server_t *server = mock_server_with_auto_hello(WIRE_VERSION_8_0); mock_server_run(server); mongoc_client_t *client = mongoc_client_new_from_uri(mock_server_get_uri(server)); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_error_t error; bool ok = mongoc_bulkwrite_append_updateone( bw, "db.coll", tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'x': 1}}"), NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(bwo, true); future_t *fut = future_bulkwrite_execute(bw, bwo); request_t *req = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'bulkWrite': 1, 'errorsOnly': false}"), tmp_bson("{'ns': 'db.coll'}"), // "nsInfo" tmp_bson("{'update': 0}")); // "ops" reply_to_request_simple(req, BSON_STR({ "ok" : 1, "nInserted" : 0, "nMatched" : 0, "nModified" : 0, "nDeleted" : 0, "nUpserted" : 0, "nErrors" : 0, "cursor" : { "id" : 0, "firstBatch" : [ { "ok" : 1, "idx" : 0, "n" : 0 // Omit "nModified" to reproduce SERVER-113026. } ], "ns" : "admin.$cmd.bulkWrite" } })); mongoc_bulkwritereturn_t bwr = future_get_mongoc_bulkwritereturn_t(fut); // Expect no error: ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Expect per-operation result has 0 "modifiedCount": ASSERT(bwr.res); const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(bwr.res); ASSERT(updateResults); ASSERT_MATCH(updateResults, BSON_STR({"0" : {"matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : null}})); future_destroy(fut); request_destroy(req); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); mock_server_destroy(server); } // test_bulkwrite_unexpected_results mocks a server reply including per-operation results even with `errorsOnly: true`. // The unexpected results are a bug: SERVER-113344. This tests how the driver handles the reply. static void test_bulkwrite_unexpected_results(void) { mock_server_t *server = mock_server_with_auto_hello(WIRE_VERSION_8_0); mock_server_run(server); mongoc_client_t *client = mongoc_client_new_from_uri(mock_server_get_uri(server)); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_error_t error; bool ok = mongoc_bulkwrite_append_updateone( bw, "db.coll", tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'x': 1}}"), NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwriteopts_t *bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(bwo, false); future_t *fut = future_bulkwrite_execute(bw, bwo); request_t *req = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'bulkWrite': 1, 'errorsOnly': true }"), tmp_bson("{'ns': 'db.coll'}"), // "nsInfo" tmp_bson("{'update': 0}")); // "ops" reply_to_request_simple(req, BSON_STR({ "ok" : 1, "nInserted" : 0, "nMatched" : 0, "nModified" : 0, "nDeleted" : 0, "nUpserted" : 0, "nErrors" : 0, "cursor" : { "id" : 0, // Unexpected per-operation result: "firstBatch" : [ {"ok" : 1, "idx" : 0, "n" : 0, "nModified" : 0} ], "ns" : "admin.$cmd.bulkWrite" } })); mongoc_bulkwritereturn_t bwr = future_get_mongoc_bulkwritereturn_t(fut); // Expect no error: ASSERT_NO_BULKWRITEEXCEPTION(bwr); // Extra per-operation result is not reported: ASSERT(bwr.res); const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(bwr.res); ASSERT(!updateResults); future_destroy(fut); request_destroy(req); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); mock_server_destroy(server); } void test_bulkwrite_install(TestSuite *suite) { TestSuite_AddFull(suite, "/bulkwrite/insert [lock:live-server]", test_bulkwrite_insert, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/upsert_with_null [lock:live-server]", test_bulkwrite_upsert_with_null, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/writeError [lock:live-server]", test_bulkwrite_writeError, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/session_with_unacknowledged [lock:live-server]", test_bulkwrite_session_with_unacknowledged, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25, // require server 8.0 test_framework_skip_if_no_sessions); TestSuite_AddFull(suite, "/bulkwrite/double_execute [lock:live-server]", test_bulkwrite_double_execute, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/server_id [lock:live-server]", test_bulkwrite_serverid, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/server_id/unacknowledged [lock:live-server]", test_bulkwrite_serverid_unacknowledged, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/server_id/on_retry [lock:live-server]", test_bulkwrite_serverid_on_retry, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25, // require server 8.0 test_framework_skip_if_not_mongos, // Requires multiple hosts that can accept writes. test_framework_skip_if_no_crypto // Require crypto for retryable writes. ); TestSuite_AddFull(suite, "/bulkwrite/extra [lock:live-server]", test_bulkwrite_extra, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/no_verbose_results [lock:live-server]", test_bulkwrite_no_verbose_results, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/many_namespaces [lock:live-server]", test_bulkwrite_many_namespaces, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25, // require server 8.0 test_framework_skip_if_mongos // Creating 100k collections is very slow (~5 minutes) on mongos. ); TestSuite_AddFull(suite, "/bulkwrite/execute_requires_client [lock:live-server]", test_bulkwrite_execute_requires_client, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/two_large_inserts [lock:live-server]", test_bulkwrite_two_large_inserts, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/client_error_no_result [lock:live-server]", test_bulkwrite_client_error_no_result, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/bulkwrite/check_acknowledged [lock:live-server]", test_bulkwrite_check_acknowledged, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddMockServerTest(suite, "/bulkwrite/missing_nModified", test_bulkwrite_missing_nModified); TestSuite_AddMockServerTest(suite, "/bulkwrite/unexpected_results", test_bulkwrite_unexpected_results); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-cache.c000066400000000000000000000041651511661753600237330ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #if defined(__linux__) #include #include #include #include #ifndef SIGSTOP #define SIGSTOP 19 #endif static char *ca_file; static int ping(void) { mongoc_client_t *client; mongoc_database_t *database; bson_t reply; bson_error_t error; bson_t ping; char *uri; int ret = EXIT_FAILURE; uri = bson_strdup_printf("mongodb://localhost/?tls=true&tlsCAFile=%s", ca_file); ASSERT((client = mongoc_client_new(uri))); bson_init(&ping); bson_append_int32(&ping, "ping", 4, 1); database = mongoc_client_get_database(client, "cache"); if (mongoc_database_command_with_opts(database, &ping, NULL, NULL, &reply, &error)) { MONGOC_DEBUG("Ping success\n"); ret = EXIT_SUCCESS; } else { MONGOC_DEBUG("Ping failure: %s\n", error.message); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "TLS handshake failed"); } bson_free(uri); bson_destroy(&ping); bson_destroy(&reply); mongoc_database_destroy(database); mongoc_client_destroy(client); return ret; } #endif int main(int argc, char *argv[]) { (void)argc; (void)argv; #if defined(__linux__) if (argc != 2) { fprintf(stderr, "usage: %s CA_FILE_PATH\n", argv[0]); return EXIT_FAILURE; } ca_file = argv[1]; mongoc_init(); ASSERT(ping() == EXIT_FAILURE); raise(SIGSTOP); ASSERT(ping() == EXIT_FAILURE); mongoc_cleanup(); #endif return EXIT_SUCCESS; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-change-stream.c000066400000000000000000002612241511661753600254070ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #define DESTROY_CHANGE_STREAM(cursor_id) \ do { \ future_t *_future = future_change_stream_destroy(stream); \ request_t *_request = mock_server_receives_msg(server, \ MONGOC_MSG_NONE, \ tmp_bson("{'$db': 'db'," \ " 'killCursors': 'coll'," \ " 'cursors': [{'$numberLong': '" #cursor_id "'}]}")); \ reply_to_request_simple(_request, "{ 'cursorsKilled': [ " #cursor_id " ] }"); \ future_wait(_future); \ future_destroy(_future); \ request_destroy(_request); \ } while (0) typedef struct _data_change_stream_t { mongoc_cursor_response_t response; bson_t post_batch_resume_token; } _data_change_stream_t; static void _setup_for_resume(mongoc_change_stream_t *stream) { bool ret; bson_error_t error; mongoc_client_t *client; const char *cmd; client = stream->cursor->client; if (stream->max_wire_version >= WIRE_VERSION_4_4) { cmd = "{'configureFailPoint': 'failGetMoreAfterCursorCheckout', 'mode': " "{ 'times': 1 }, 'data': { 'errorCode': 6 }}"; } else { cmd = "{'configureFailPoint': 'failCommand', 'mode': { 'times': 1 }, " "'data': { 'failCommands': ['getMore'], 'errorCode': 6 }}"; } ret = mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson(cmd), NULL /* read prefs */, stream->cursor->server_id, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); } static mongoc_collection_t * drop_and_get_coll(mongoc_client_t *client, const char *db_name, const char *coll_name) { ASSERT(client); mongoc_collection_t *coll = mongoc_client_get_collection(client, db_name, coll_name); mongoc_collection_drop(coll, NULL); return coll; } /* From Change Streams Spec tests: * "$changeStream must be the first stage in a change stream pipeline sent * to the server" */ static void test_change_stream_pipeline(void) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *next_doc = NULL; bson_t *nonempty_pipeline = tmp_bson("{ 'pipeline' : [ { '$project' : { 'ns': false } } ] }"); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client); coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT(coll); future = future_collection_watch(coll, tmp_bson("{}"), NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'coll'," " 'pipeline': [{'$changeStream': {}}]," " 'cursor': {}}")); reply_to_request_simple(request, "{'cursor' : {'id': 123, 'ns': 'db.coll', 'firstBatch': []}, 'ok': 1 }"); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); request_destroy(request); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'coll'}")); reply_to_request_simple(request, "{'cursor' : { 'nextBatch' : [] }, 'ok': 1}"); ASSERT(!future_get_bool(future)); ASSERT(!mongoc_change_stream_error_document(stream, NULL, NULL)); ASSERT(next_doc == NULL); future_destroy(future); request_destroy(request); /* Another call to next should produce another getMore */ future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'coll'}")); reply_to_request_simple(request, "{ 'cursor': { 'nextBatch': [] }, 'ok': 1 }"); ASSERT(!future_get_bool(future)); ASSERT(!mongoc_change_stream_error_document(stream, NULL, NULL)); ASSERT(next_doc == NULL); future_destroy(future); request_destroy(request); DESTROY_CHANGE_STREAM(123); /* Test non-empty pipeline */ future = future_collection_watch(coll, nonempty_pipeline, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'coll'," " 'pipeline': [" " {'$changeStream': {}}," " {'$project': {'ns': false}}]," " 'cursor': {}}")); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': 'db.coll','firstBatch': []},'ok': 1}"); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); request_destroy(request); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'coll'}")); reply_to_request_simple(request, "{ 'cursor': { 'nextBatch': [] }, 'ok': 1 }"); ASSERT(!future_get_bool(future)); ASSERT(!mongoc_change_stream_error_document(stream, NULL, NULL)); ASSERT(next_doc == NULL); future_destroy(future); request_destroy(request); DESTROY_CHANGE_STREAM(123); mongoc_client_destroy(client); mongoc_collection_destroy(coll); mock_server_destroy(server); } typedef struct _test_resume_token_ctx_t { bool expecting_resume_token; const bson_t *expected_resume_token_bson; } test_resume_token_ctx_t; static void test_resume_token_command_start(const mongoc_apm_command_started_t *event) { const bson_t *cmd = mongoc_apm_command_started_get_command(event); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); test_resume_token_ctx_t *ctx = (test_resume_token_ctx_t *)mongoc_apm_command_started_get_context(event); if (strcmp(cmd_name, "aggregate") == 0) { if (ctx->expecting_resume_token) { char *rt_pattern = bson_as_canonical_extended_json(ctx->expected_resume_token_bson, NULL); char *pattern = bson_strdup_printf("{'aggregate': 'coll_resume', 'pipeline': " "[{'$changeStream': { 'resumeAfter': %s }}]}", rt_pattern); ASSERT_MATCH(cmd, pattern); bson_free(pattern); bson_free(rt_pattern); } else { ASSERT_MATCH(cmd, "{'aggregate': 'coll_resume', 'pipeline': [{ " "'$changeStream': { 'resumeAfter': { '$exists': " "false } }}]}"); } } } /* From Change Streams Spec tests: * "ChangeStream must continuously track the last seen resumeToken" * Note: we should not inspect the resume token, since the format may change. */ static void test_change_stream_live_track_resume_token(void *test_ctx) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; bson_error_t error; test_resume_token_ctx_t ctx = {0}; const bson_t *next_doc = NULL; mongoc_apm_callbacks_t *callbacks; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; bson_t doc0_rt, doc1_rt, doc2_rt; const bson_t *resume_token; BSON_UNUSED(test_ctx); client = test_framework_new_default_client(); ASSERT(client); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_resume_token_command_start); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = drop_and_get_coll(client, "db", "coll_resume"); ASSERT(coll); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &error), error); /* Set the batch size to 1 so we only get one document per call to next. */ stream = mongoc_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}")); ASSERT(stream); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); /* Insert a few docs to listen for. Use write concern majority, so subsequent * call to watch will be guaranteed to retrieve them. */ mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 0}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2}"), &opts, NULL, &error), error); /* The resume token should be updated to the most recently iterated doc */ ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); bson_copy_to(resume_token, &doc0_rt); ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); ASSERT(bson_compare(resume_token, &doc0_rt) != 0); bson_copy_to(resume_token, &doc1_rt); _setup_for_resume(stream); /* A resume will occur, forcing a resumeAfter token in the aggregate cmd. */ ctx.expecting_resume_token = true; ctx.expected_resume_token_bson = &doc1_rt; ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); ASSERT(bson_compare(resume_token, &doc0_rt) != 0); ASSERT(bson_compare(resume_token, &doc1_rt) != 0); bson_copy_to(resume_token, &doc2_rt); /* There are no docs left. */ ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); ASSERT(!next_doc); bson_destroy(&doc0_rt); bson_destroy(&doc1_rt); bson_destroy(&doc2_rt); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_apm_callbacks_destroy(callbacks); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_collection_destroy(coll); } typedef struct _test_batch_size_ctx { uint32_t num_get_mores; uint32_t expected_getmore_batch_size; uint32_t expected_agg_batch_size; } test_batch_size_ctx_t; static void test_batch_size_command_succeeded(const mongoc_apm_command_succeeded_t *event) { const bson_t *reply = mongoc_apm_command_succeeded_get_reply(event); const char *cmd_name = mongoc_apm_command_succeeded_get_command_name(event); test_batch_size_ctx_t *ctx = (test_batch_size_ctx_t *)mongoc_apm_command_succeeded_get_context(event); if (strcmp(cmd_name, "getMore") == 0) { bson_t next_batch; ++ctx->num_get_mores; bson_lookup_doc(reply, "cursor.nextBatch", &next_batch); ASSERT(bson_count_keys(&next_batch) == ctx->expected_getmore_batch_size); } else if (strcmp(cmd_name, "aggregate") == 0) { bson_t first_batch; bson_lookup_doc(reply, "cursor.firstBatch", &first_batch); ASSERT(bson_count_keys(&first_batch) == ctx->expected_agg_batch_size); } } /* Test that the batch size option applies to both the initial aggregate and * subsequent getMore commands. */ static void test_change_stream_live_batch_size(void *test_ctx) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; test_batch_size_ctx_t ctx = {0}; const bson_t *next_doc = NULL; mongoc_apm_callbacks_t *callbacks; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; bson_error_t err; uint32_t i; BSON_UNUSED(test_ctx); client = test_framework_new_default_client(); ASSERT(client); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, test_batch_size_command_succeeded); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = drop_and_get_coll(client, "db", "coll_batch"); ASSERT(coll); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &err), err); stream = mongoc_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}")); ASSERT(stream); ctx.expected_agg_batch_size = 0; ctx.expected_getmore_batch_size = 0; ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT(!mongoc_change_stream_error_document(stream, NULL, NULL)); ASSERT(next_doc == NULL); ctx.expected_getmore_batch_size = 1; mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); for (i = 0; i < 10; i++) { bson_t *doc = BCON_NEW("_id", BCON_INT32(i)); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, doc, &opts, NULL, &err), err); bson_destroy(doc); } ctx.expected_getmore_batch_size = 1; for (i = 0; i < 10; i++) { mongoc_change_stream_next(stream, &next_doc); } ctx.expected_getmore_batch_size = 0; ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); ASSERT(next_doc == NULL); /* 10 getMores for results, 1 for initial next, 1 for last empty next */ ASSERT(ctx.num_get_mores == 12); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_apm_callbacks_destroy(callbacks); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_collection_destroy(coll); } /* From Change Streams Spec tests: * "ChangeStream will throw an exception if the server response is missing the * resume token." In the C driver case, return an error. */ static void _test_resume_token_error(const char *id_projection) { mongoc_client_t *client; mongoc_collection_t *coll; const bson_t *next_doc = NULL; mongoc_change_stream_t *stream; bson_error_t err; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; client = test_framework_new_default_client(); ASSERT(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = drop_and_get_coll(client, "db", "coll_missing_resume"); ASSERT(coll); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &err), err); stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': [{'$project': {'_id': %s }}]}", id_projection), NULL); ASSERT(stream); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2}"), &opts, NULL, &err), err); ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT(mongoc_change_stream_error_document(stream, &err, NULL)); /* Newer server versions emit different errors. */ if (!test_framework_max_wire_version_at_least(8)) { ASSERT_ERROR_CONTAINS( err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN, "Cannot provide resume functionality"); } else { ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_SERVER, 280, "Only transformations that retain the unmodified " "_id field are allowed."); } bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_collection_destroy(coll); } static void test_change_stream_live_missing_resume_token(void *test_ctx) { BSON_UNUSED(test_ctx); _test_resume_token_error("0"); } static void test_change_stream_live_invalid_resume_token(void *test_ctx) { BSON_UNUSED(test_ctx); /* test a few non-document BSON types */ _test_resume_token_error("{'$literal': 1}"); _test_resume_token_error("{'$literal': true}"); _test_resume_token_error("{'$literal': 'foo'}"); _test_resume_token_error("{'$literal': []}"); } static void _test_getmore_error(const char *server_reply, bool should_resume, bool resume_kills_cursor) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *next_doc = NULL; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); coll = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_watch(coll, tmp_bson("{}"), NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'aggregate': 'coll'}")); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': 'db.coll','firstBatch': []},'ok': 1 }"); stream = future_get_mongoc_change_stream_ptr(future); BSON_ASSERT(stream); future_destroy(future); request_destroy(request); /* the first getMore receives an error. */ future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'coll'}")); reply_to_request_simple(request, server_reply); request_destroy(request); if (should_resume) { /* client should retry the aggregate. */ if (resume_kills_cursor) { /* errors that are considered "not primary" or "node is recovering" * errors by SDAM will mark the connected server as UNKNOWN, and no * killCursors will be executed. */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'killCursors': 'coll'}")); reply_to_request_simple(request, "{'cursorsKilled': [123]}"); request_destroy(request); } request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'aggregate': 'coll'}")); reply_to_request_simple(request, "{'cursor':" " {'id': 124," " 'ns': 'db.coll'," " 'firstBatch':" " [{'_id': {'resume': 'doc'}}]}," "'ok': 1}"); request_destroy(request); BSON_ASSERT(future_get_bool(future)); BSON_ASSERT(!mongoc_change_stream_error_document(stream, NULL, NULL)); DESTROY_CHANGE_STREAM(124); } else { BSON_ASSERT(!future_get_bool(future)); BSON_ASSERT(mongoc_change_stream_error_document(stream, NULL, NULL)); DESTROY_CHANGE_STREAM(123); } future_destroy(future); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } /* Test a variety of resumable and non-resumable errors that may be returned * from a getMore. */ static void test_getmore_errors(void) { _test_getmore_error( "{'ok': 0, 'code': 1, 'errmsg': 'internal error'}", false /* should_resume */, false /* ignored */); _test_getmore_error( "{'ok': 0, 'code': 6, 'errmsg': 'host unreachable'}", true /* should_resume */, true /* resume_kills_cursor */); _test_getmore_error( "{'ok': 0, 'code': 12345, 'errmsg': 'random error'}", false /* should_resume */, false /* ignored */); /* most error codes are resumable, excluding a few deny listed ones. */ _test_getmore_error( "{'ok': 0, 'code': 11601, 'errmsg': 'interrupted'}", false /* should_resume */, false /* ignored */); _test_getmore_error( "{'ok': 0, 'code': 136, 'errmsg': 'capped position lost'}", false /* should_resume */, false /* ignored */); _test_getmore_error( "{'ok': 0, 'code': 237, 'errmsg': 'cursor killed'}", false /* should_resume */, false /* ignored */); _test_getmore_error("{'ok': 0, 'errmsg': 'random error'}", false /* should_resume */, false /* ignored */); /* Even an error with a 'NonResumableChangeStreamError' label will resume if * it is on the allow list. */ _test_getmore_error("{'ok': 0, 'code': 6, 'errorLabels': " "['NonResumableChangeStreamError'], 'errmsg': 'host unreachable'}", true /* should_resume */, true /* resume_kills_cursor */); _test_getmore_error("{'ok': 0, 'code': 6, 'errorLabels': " "['NonRetryableChangeStreamError'], 'errmsg': 'host unreachable'}", true /* should_resume */, true /* resume_kills_cursor */); } /* From Change Streams Spec tests: * "ChangeStream will automatically resume one time on a resumable error * (including not primary) with the initial pipeline and options, except for the * addition/update of a resumeToken" * "The killCursors command sent during the “Resume Process†must not be * allowed to throw an exception." */ static void test_change_stream_resumable_error(void) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; mongoc_uri_t *uri; bson_error_t err; const bson_t *err_doc = NULL; const bson_t *next_doc = NULL; const char *not_primary_err = "{ 'code': 10107, 'errmsg': 'not primary', 'ok': 0 }"; const char *interrupted_err = "{ 'code': 11601, 'errmsg': 'interrupted', 'ok': 0 }"; const bson_t *watch_cmd = tmp_bson("{'$db': 'db'," " 'aggregate': 'coll'," " 'pipeline': [{'$changeStream': {}}]," " 'cursor': {}}"); const char *expected_msg = "{'$db': 'db', 'getMore': {'$numberLong': '%d'}, 'collection': 'coll' }"; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "socketTimeoutMS", 100); client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_watch(coll, tmp_bson("{}"), NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': " "'db.coll','firstBatch': []},'ok': 1 " "}"); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); request_destroy(request); /* Test that a network hangup results in a resumable error */ future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 123)); BSON_ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); /* Retry command */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); BSON_ASSERT(request); reply_to_request_simple(request, "{'cursor': {'id': 124,'ns': 'db.coll','firstBatch': []},'ok': 1 }"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 124)); reply_to_request_simple(request, "{ 'cursor': { 'nextBatch': [] }, 'ok': 1 }"); request_destroy(request); ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); ASSERT(next_doc == NULL); future_destroy(future); /* Test the "not_primary" resumable error occurring twice in a row */ future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 124)); reply_to_request_simple(request, not_primary_err); request_destroy(request); /* The "not primary" error does not cause the client to close connection. Expect a killCursors. */ request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{ 'killCursors' : 'coll', 'cursors' : [ { '$numberLong': '124' } ] }")); reply_to_request_with_ok_and_destroy(request); /* Retry command */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); reply_to_request_simple(request, "{'cursor': {'id': 125, 'ns': 'db.coll','firstBatch': []},'ok': 1}"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 125)); reply_to_request_simple(request, not_primary_err); request_destroy(request); /* The "not primary" error does not cause the client to close connection. Expect a killCursors. */ request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{ 'killCursors' : 'coll', 'cursors' : [ { '$numberLong': '125' } ] }")); reply_to_request_with_ok_and_destroy(request); /* Retry command */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); reply_to_request_simple(request, "{'cursor': {'id': 126, 'ns': " "'db.coll','firstBatch': []},'ok': 1 " "}"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 126)); reply_to_request_simple(request, interrupted_err); request_destroy(request); /* Check that error is returned */ ASSERT(!future_get_bool(future)); ASSERT(mongoc_change_stream_error_document(stream, &err, &err_doc)); ASSERT(next_doc == NULL); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_SERVER, 11601, "interrupted"); ASSERT_MATCH(err_doc, interrupted_err); future_destroy(future); DESTROY_CHANGE_STREAM(126); /* Test an error on the initial aggregate when resuming. */ future = future_collection_watch(coll, tmp_bson("{}"), NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': " "'db.coll','firstBatch': []},'ok': 1 " "}"); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); request_destroy(request); future_destroy(future); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_msg, 123)); reply_to_request_simple(request, "{ 'code': 10107, 'errmsg': 'not primary', 'ok': 0 }"); request_destroy(request); /* The "not primary" error does not cause the client to close connection. Expect a killCursors. */ request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{ 'killCursors' : 'coll', 'cursors' : [ { '$numberLong': '123' } ] }")); reply_to_request_with_ok_and_destroy(request); /* Retry command */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, watch_cmd); reply_to_request_simple(request, "{'code': 123, 'errmsg': 'bad cmd', 'ok': 0}"); request_destroy(request); /* Check that error is returned */ ASSERT(!future_get_bool(future)); ASSERT(mongoc_change_stream_error_document(stream, &err, &err_doc)); ASSERT(next_doc == NULL); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_SERVER, 123, "bad cmd"); ASSERT_MATCH(err_doc, "{'code': 123, 'errmsg': 'bad cmd', 'ok': 0}"); future_destroy(future); mongoc_change_stream_destroy(stream); mongoc_uri_destroy(uri); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } /* Test that options are sent correctly. */ static void test_change_stream_options(void) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *next_doc = NULL; bson_error_t err; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client); coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT(coll); /* * fullDocument: 'default'|'updateLookup', passed to $changeStream stage * resumeAfter: optional, passed to $changeStream stage * startAfter: optional, passed to $changeStream stage * startAtOperationTime: optional, passed to $changeStream stage * maxAwaitTimeMS: Optional, passed to cursor * batchSize: Optional, passed as agg option, {cursor: { batchSize: }} * collation: Optional, passed as agg option */ /* fullDocument */ future = future_collection_watch(coll, tmp_bson("{}"), tmp_bson("{ 'fullDocument': 'updateLookup', " "'resumeAfter': {'resume': 'after'}, " "'startAfter': {'start': 'after'}, " "'startAtOperationTime': { '$timestamp': { 't': 1, 'i': 1 }}, " "'maxAwaitTimeMS': 5000, 'batchSize': " "5, 'collation': { 'locale': 'en' }}")); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'coll'," " 'pipeline': [" " {'$changeStream': {" " 'fullDocument': 'updateLookup'," " 'resumeAfter': {'resume': 'after'}," " 'startAfter': {'start': 'after'}," " 'startAtOperationTime': {'$timestamp': { 't': 1, 'i': 1 }}}}]," " 'cursor': {'batchSize': 5}," " 'collation': {'locale': 'en'}}")); reply_to_request_simple(request, "{'cursor': {'id': 123,'ns': 'db.coll','firstBatch': []},'ok': 1 }"); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); request_destroy(request); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'coll'," " 'maxTimeMS': {'$numberLong': '5000'}," " 'batchSize': {'$numberLong': '5'}}")); reply_to_request_simple(request, "{ 'cursor': { 'nextBatch': [] }, 'ok': 1 }"); request_destroy(request); ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); ASSERT(next_doc == NULL); future_destroy(future); DESTROY_CHANGE_STREAM(123); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } /* Test basic watch functionality and validate the server documents */ static void test_change_stream_live_watch(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); bson_t *inserted_doc = tmp_bson("{ 'x': 'y'}"); const bson_t *next_doc = NULL; mongoc_collection_t *coll; mongoc_change_stream_t *stream; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; bson_error_t err; BSON_UNUSED(test_ctx); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); coll = drop_and_get_coll(client, "db", "coll_watch"); ASSERT(coll); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &err), err); stream = mongoc_collection_watch(coll, tmp_bson("{}"), NULL); ASSERT(stream); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); /* Test that inserting a doc produces the expected change stream doc */ mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, inserted_doc, &opts, NULL, &err), err); ASSERT(mongoc_change_stream_next(stream, &next_doc)); /* Validation rules as follows: * { _id: , operationType: "insert", ns: , documentKey: * , * updateDescription: , fullDocument: } */ ASSERT_HAS_FIELD(next_doc, "_id"); ASSERT(!strcmp(bson_lookup_utf8(next_doc, "operationType"), "insert")); ASSERT_MATCH(next_doc, "{ '_id': { '$exists': true },'operationType': 'insert', 'ns': " "{ 'db': 'db', 'coll': 'coll_watch' },'documentKey': { " "'$exists': true }, 'updateDescription': { '$exists': false }, " "'fullDocument': { '_id': { '$exists': true }, 'x': 'y' }}"); /* Test updating a doc */ ASSERT_OR_PRINT( mongoc_collection_update_one(coll, tmp_bson("{}"), tmp_bson("{'$set': {'x': 'z'} }"), &opts, NULL, &err), err); ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT_MATCH(next_doc, "{ '_id': { '$exists': true },'operationType': 'update', 'ns': { 'db': " "'db', 'coll': 'coll_watch' },'documentKey': { '$exists': " "true }, 'updateDescription': { 'updatedFields': { 'x': 'z' } " "}, 'fullDocument': { '$exists': false }}"); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } /* From Change Streams Spec tests: * "ChangeStream will resume after a killCursors command is issued for its child * cursor." * "ChangeStream will perform server selection before attempting to resume, * using initial readPreference" */ static void test_change_stream_live_read_prefs(void *test_ctx) { /* - connect with secondary read preference - verify we are connected to a secondary - issue a killCursors to trigger a resume - after resume, check that the cursor connected to a secondary */ mongoc_read_prefs_t *prefs; mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; mongoc_cursor_t *raw_cursor; const bson_t *next_doc = NULL; bson_error_t err; uint64_t first_cursor_id; BSON_UNUSED(test_ctx); coll = drop_and_get_coll(client, "db", "coll_read_prefs"); ASSERT(coll); ASSERT_OR_PRINT( mongoc_collection_insert_one( coll, tmp_bson(NULL), tmp_bson("{'writeConcern': {'w': %d}}", test_framework_data_nodes_count()), NULL, &err), err); prefs = mongoc_read_prefs_copy(mongoc_collection_get_read_prefs(coll)); mongoc_read_prefs_set_mode(prefs, MONGOC_READ_SECONDARY); mongoc_collection_set_read_prefs(coll, prefs); stream = mongoc_collection_watch(coll, tmp_bson("{}"), NULL); ASSERT(stream); mongoc_change_stream_next(stream, &next_doc); raw_cursor = stream->cursor; ASSERT(raw_cursor); ASSERT(test_framework_server_is_secondary(client, raw_cursor->server_id)); first_cursor_id = mongoc_cursor_get_id(raw_cursor); /* Call next to create the cursor, should return no documents. */ ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); _setup_for_resume(stream); /* Change stream client will resume with another cursor. */ /* depending on the server version, this may or may not receive another * document on resume */ (void)mongoc_change_stream_next(stream, &next_doc); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, &next_doc), err); raw_cursor = stream->cursor; ASSERT(mlib_cmp(first_cursor_id, !=, mongoc_cursor_get_id(raw_cursor))); ASSERT(test_framework_server_is_secondary(client, raw_cursor->server_id)); mongoc_read_prefs_destroy(prefs); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } /* Test that a failed server selection returns an error. This verifies a bug * is fixed, which would trigger an assert in this case. */ static void test_change_stream_server_selection_fails(void) { const bson_t *bson; bson_error_t err; mongoc_client_t *client = test_framework_client_new("mongodb://localhost:12345/", NULL); mongoc_collection_t *coll = mongoc_client_get_collection(client, "test", "test"); mongoc_change_stream_t *cs = mongoc_collection_watch(coll, tmp_bson("{}"), NULL); mongoc_change_stream_next(cs, &bson); BSON_ASSERT(mongoc_change_stream_error_document(cs, &err, &bson)); ASSERT_ERROR_CONTAINS( err, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No servers yet eligible for rescan"); mongoc_change_stream_destroy(cs); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } /* Test calling next on a change stream which errors after construction. This * verifies a bug is fixed, which would try to access a NULL cursor. */ static void test_change_stream_next_after_error(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *bson; bson_error_t err; BSON_UNUSED(test_ctx); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &err), err); stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': ['invalid_stage']}"), NULL); BSON_ASSERT(!mongoc_change_stream_next(stream, &bson)); BSON_ASSERT(mongoc_change_stream_error_document(stream, &err, &bson)); BSON_ASSERT(err.domain == MONGOC_ERROR_SERVER); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } typedef struct { char *pattern; int agg_count; } array_started_ctx_t; static void _accepts_array_started(const mongoc_apm_command_started_t *event) { const bson_t *cmd = mongoc_apm_command_started_get_command(event); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); array_started_ctx_t *ctx = (array_started_ctx_t *)mongoc_apm_command_started_get_context(event); if (strcmp(cmd_name, "aggregate") != 0) { return; } ctx->agg_count++; ASSERT_MATCH(cmd, ctx->pattern); } /* Test that watch accepts an array document {0: {}, 1: {}} as the pipeline, * similar to mongoc_collection_aggregate */ static void test_change_stream_accepts_array(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_apm_callbacks_t *callbacks = mongoc_apm_callbacks_new(); array_started_ctx_t ctx = {0}; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *bson; bson_error_t err; bson_t *opts = tmp_bson("{'maxAwaitTimeMS': 1}"); /* to speed up the test. */ BSON_UNUSED(test_ctx); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); /* set up apm callbacks to listen for the agg commands. */ ctx.pattern = bson_strdup("{'aggregate': 'coll', 'pipeline': [ {'$changeStream': {}}, " "{'$match': {'x': 1}}, {'$project': {'x': 1}}]}"); mongoc_apm_set_command_started_cb(callbacks, _accepts_array_started); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &err), err); /* try starting a change stream with a { "pipeline": [...] } argument */ stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': [{'$match': {'x': 1}}, {'$project': {'x': 1}}]}"), opts); (void)mongoc_change_stream_next(stream, &bson); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, &bson), err); ASSERT_CMPINT32(ctx.agg_count, ==, 1); mongoc_change_stream_destroy(stream); /* try with an array like document. */ stream = mongoc_collection_watch(coll, tmp_bson("{'0': {'$match': {'x': 1}}, '1': {'$project': {'x': 1}}}"), opts); (void)mongoc_change_stream_next(stream, &bson); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, &bson), err); ASSERT_CMPINT32(ctx.agg_count, ==, 2); mongoc_change_stream_destroy(stream); /* try with malformed { "pipeline": [...] } argument. */ bson_free(ctx.pattern); ctx.pattern = bson_strdup("{'aggregate': 'coll', 'pipeline': [ {'$changeStream': {}}, 42 ]}"); stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': [42] }"), NULL); (void)mongoc_change_stream_next(stream, &bson); BSON_ASSERT(mongoc_change_stream_error_document(stream, &err, &bson)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_SERVER, 14, "Each element of the 'pipeline' array must be an object"); ASSERT_CMPINT32(ctx.agg_count, ==, 3); mongoc_change_stream_destroy(stream); /* try with malformed array doc argument. */ stream = mongoc_collection_watch(coll, tmp_bson("{'0': 42 }"), NULL); (void)mongoc_change_stream_next(stream, &bson); BSON_ASSERT(mongoc_change_stream_error_document(stream, &err, &bson)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_SERVER, 14, "Each element of the 'pipeline' array must be an object"); ASSERT_CMPINT32(ctx.agg_count, ==, 4); mongoc_change_stream_destroy(stream); bson_free(ctx.pattern); mongoc_apm_callbacks_destroy(callbacks); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } /* A simple test that passing 'startAtOperationTime' does not error. */ void test_change_stream_start_at_operation_time(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *doc; bson_t opts; mongoc_client_session_t *session; bson_error_t error; BSON_UNUSED(test_ctx); session = mongoc_client_start_session(client, NULL, &error); coll = mongoc_client_get_collection(client, "db", "coll"); bson_init(&opts); ASSERT_OR_PRINT(mongoc_client_session_append(session, &opts, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), &opts, NULL, &error), error); BSON_APPEND_TIMESTAMP(&opts, "startAtOperationTime", session->operation_timestamp, session->operation_increment); stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': []}"), &opts); (void)mongoc_change_stream_next(stream, &doc); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_client_session_destroy(session); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } typedef struct { bool has_initiated; bool has_resumed; bson_t agg_reply; } resume_ctx_t; #define RESUME_INITIALIZER {false, false, BSON_INITIALIZER} static void _resume_with_post_batch_resume_token_started(const mongoc_apm_command_started_t *event) { resume_ctx_t *ctx; ctx = (resume_ctx_t *)mongoc_apm_command_started_get_context(event); if (0 != strcmp(mongoc_apm_command_started_get_command_name(event), "aggregate")) { return; } if (!ctx->has_initiated) { ctx->has_initiated = true; return; } ctx->has_resumed = true; /* postBatchResumeToken is available since MongoDB 4.0.7, but the test runs * for wire version 7+. Decide whether to skip postBatchResumeToken assertion * based on the command reply. */ if (bson_has_field(&ctx->agg_reply, "cursor.postBatchResumeToken")) { bson_value_t replied_pbrt, sent_pbrt; match_ctx_t match_ctx = {{0}}; /* it should re-use the same postBatchResumeToken on resume. */ bson_lookup_value(&ctx->agg_reply, "cursor.postBatchResumeToken", &replied_pbrt); bson_lookup_value( mongoc_apm_command_started_get_command(event), "pipeline.0.$changeStream.resumeAfter", &sent_pbrt); BSON_ASSERT(replied_pbrt.value_type == BSON_TYPE_DOCUMENT); BSON_ASSERT(match_bson_value(&sent_pbrt, &replied_pbrt, &match_ctx)); bson_value_destroy(&sent_pbrt); bson_value_destroy(&replied_pbrt); } } static void _resume_with_post_batch_resume_token_succeeded(const mongoc_apm_command_succeeded_t *event) { resume_ctx_t *ctx; ctx = (resume_ctx_t *)mongoc_apm_command_succeeded_get_context(event); if (!strcmp(mongoc_apm_command_succeeded_get_command_name(event), "aggregate")) { bson_destroy(&ctx->agg_reply); bson_copy_to(mongoc_apm_command_succeeded_get_reply(event), &ctx->agg_reply); } } /* Test that "postBatchResumeToken" in aggregate reply is used on resume */ static void test_change_stream_resume_with_post_batch_resume_token(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *doc; bson_error_t error; mongoc_apm_callbacks_t *callbacks; resume_ctx_t ctx = RESUME_INITIALIZER; BSON_UNUSED(test_ctx); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, _resume_with_post_batch_resume_token_started); mongoc_apm_set_command_succeeded_cb(callbacks, _resume_with_post_batch_resume_token_succeeded); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = mongoc_client_get_collection(client, "db", "coll"); stream = mongoc_collection_watch(coll, tmp_bson("{'pipeline': []}"), NULL); _setup_for_resume(stream); (void)mongoc_change_stream_next(stream, &doc); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); BSON_ASSERT(ctx.has_initiated); BSON_ASSERT(ctx.has_resumed); bson_destroy(&ctx.agg_reply); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); } /* A simple test of database watch. */ void test_change_stream_database_watch(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_database_t *db; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *doc; bson_t opts; bson_error_t error; BSON_UNUSED(test_ctx); db = mongoc_client_get_database(client, "db"); bson_init(&opts); stream = mongoc_database_watch(db, tmp_bson("{}"), NULL); coll = mongoc_database_get_collection(db, "coll"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), &opts, NULL, &error), error); (void)mongoc_change_stream_next(stream, &doc); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_database_destroy(db); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } /* A simple test of client watch. */ void test_change_stream_client_watch(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *doc; bson_t opts; bson_error_t error; BSON_UNUSED(test_ctx); bson_init(&opts); stream = mongoc_client_watch(client, tmp_bson("{}"), NULL); coll = mongoc_client_get_collection(client, "db", "coll"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), &opts, NULL, &error), error); (void)mongoc_change_stream_next(stream, &doc); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void _test_resume(const char *opts, const char *expected_change_stream_opts, const char *first_doc, const char *expected_resume_change_stream_opts, const char *cursor_pbr) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; bson_error_t err; char *msg; const bson_t *doc = NULL; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_watch(coll, tmp_bson("{}"), tmp_bson(opts)); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline' : [ { '$changeStream': { %s " " 'fullDocument': null } } ], 'cursor': { } }", expected_change_stream_opts)); msg = bson_strdup_printf("{'cursor': {'id': 123, 'ns': 'db.coll'," "'firstBatch': [%s]%s }, 'operationTime': " "{ '$timestamp': {'t': 1, 'i': 2} }, 'ok': 1 }", first_doc, cursor_pbr); reply_to_request_simple(request, msg); bson_free(msg); stream = future_get_mongoc_change_stream_ptr(future); BSON_ASSERT(stream); future_destroy(future); request_destroy(request); /* if a first document was returned, the first call to next returns it. */ if (*first_doc) { mongoc_change_stream_next(stream, &doc); ASSERT_MATCH(doc, first_doc); } future = future_change_stream_next(stream, &doc); request = mock_server_receives_msg( server, MONGOC_QUERY_NONE, tmp_bson("{ 'getMore': {'$numberLong': '123'}, 'collection': 'coll' }")); reply_to_request_with_hang_up(request); request_destroy(request); /* since the server closed the connection, a resume is attempted. */ request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline' : [ { '$changeStream': { %s " " 'fullDocument': null }} ], 'cursor': { } }", expected_resume_change_stream_opts)); reply_to_request_simple(request, "{'cursor': {'id': 0,'ns': 'db.coll','firstBatch': []},'ok': 1 }"); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &err, NULL), err); BSON_ASSERT(doc == NULL); future_destroy(future); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } /* test resume behavior before and after the first document is received. */ static void test_resume_cases(void) { #define NO_OPT_RA "'resumeAfter': {'$exists': false}" #define NO_OPT_SA "'startAfter': {'$exists': false}" #define NO_OPT_OP "'startAtOperationTime': {'$exists': false}" #define AGG_OP "'startAtOperationTime': {'$timestamp': {'t': 1, 'i': 2}}" #define DOC "{'_id': {'resume': 'doc'}}" #define OPT_OP "'startAtOperationTime': {'$timestamp': {'t': 111, 'i': 222}}" #define DOC_RA "'resumeAfter': {'resume': 'doc'}" #define OPT_RA "'resumeAfter': {'resume': 'opt'}" #define OPT_SA "'startAfter': {'resume': 'opt'}" /* test features: * - whether the change stream returns a document before resuming. * - whether 'startAtOperationTime' is specified * - whether 'resumeAfter' is specified * - whether 'startAfterAfter' is specified */ /* no options specified. */ /* - if no doc recv'ed, use the operationTime returned by aggregate. */ _test_resume("{}", NO_OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", "", AGG_OP "," NO_OPT_RA "," NO_OPT_SA ",", ""); /* - if doc recv'ed and iterated, use the doc's resume token. */ _test_resume("{}", NO_OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", DOC, DOC_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); /* only 'startAtOperationTime' specified. */ /* - if no doc recv'ed, use the startAtOperationTime option. */ _test_resume("{" OPT_OP "}", OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", "", OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", ""); /* - if doc recv'ed and iterated, use the doc's resume token. */ _test_resume( "{" OPT_OP "}", OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", DOC, DOC_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); /* only 'resumeAfter' specified. */ /* - if no doc recv'ed, use the resumeAfter option. */ _test_resume("{" OPT_RA "}", OPT_RA "," NO_OPT_OP "," NO_OPT_SA ",", "", OPT_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); /* - if doc recv'ed and iterated, use the doc's resume token. */ _test_resume( "{" OPT_RA "}", OPT_RA "," NO_OPT_OP "," NO_OPT_SA ",", DOC, DOC_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); /* only 'startAfter' specified. */ /* - if no doc recv'ed, use the startAfter option for the original aggregate * whether or not we are resuming. */ _test_resume("{" OPT_SA "}", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", "", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", ""); /* - if doc recv'ed and iterated, use the doc's resume token. */ _test_resume( "{" OPT_SA "}", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", DOC, DOC_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); /* 'resumeAfter', 'startAfter', and 'startAtOperationTime' are all specified. * All should be passed (although the server currently returns an error). */ /* - if no doc recv'ed, use startAfter. */ _test_resume("{" OPT_RA "," OPT_SA "," OPT_OP "}", OPT_RA "," OPT_SA "," OPT_OP ",", "", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", ""); /* - if one doc recv'ed and iterated, use resumeAfter with doc's resume * token. */ _test_resume("{" OPT_RA "," OPT_SA "," OPT_OP "}", OPT_RA "," OPT_SA "," OPT_OP ",", DOC, DOC_RA "," NO_OPT_OP "," NO_OPT_SA ",", ""); } /* test resume behavior before and after the first document is received when a postBatchResumeToken is available. */ static void test_resume_cases_with_post_batch_resume_token(void) { #define CURSOR_PBR "'postBatchResumeToken': {'resume': 'pbr'}" #define PBR_RA "'resumeAfter': {'resume': 'pbr'}" #define PBR_SA "'startAfter': {'resume': 'pbr'}" /* test features: * - whether the change stream returns a document before resuming. * - whether 'postBatchResumeToken' is available * - whether 'startAtOperationTime' is specified * - whether 'resumeAfter' is specified * - whether 'startAfterAfter' is specified */ /* postBatchResumeToken always takes priority over specified options or * operation time. It will also take priority over the resume token of the * last document in the batch (if _test_resume() iterates to that point). */ /* no options specified. */ /* - if no doc recv'ed, use resumeAfter with postBatchResumeToken. */ _test_resume( "{}", NO_OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", "", PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* - if one doc recv'ed and iterated, use resumeAfter with * postBatchResumeToken. */ _test_resume( "{}", NO_OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", DOC, PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* only 'startAtOperationTime' specified. */ /* - if no doc recv'ed, use resumeAfter with postBatchResumeToken. */ _test_resume("{" OPT_OP "}", OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", "", PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* - if one doc recv'ed and iterated, use resumeAfter with * postBatchResumeToken. */ _test_resume("{" OPT_OP "}", OPT_OP "," NO_OPT_RA "," NO_OPT_SA ",", DOC, PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* only 'resumeAfter' specified. */ /* - if no doc recv'ed, use resumeAfter with postBatchResumeToken. */ _test_resume("{" OPT_RA "}", OPT_RA "," NO_OPT_OP "," NO_OPT_SA ",", "", PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* - if one doc recv'ed and iterated, use resumeAfter with * postBatchResumeToken. */ _test_resume("{" OPT_RA "}", OPT_RA "," NO_OPT_OP "," NO_OPT_SA ",", DOC, PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* only 'startAfter' specified. */ /* - if no doc recv'ed, use startAfter with postBatchResumeToken. */ _test_resume("{" OPT_SA "}", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", "", PBR_SA "," NO_OPT_OP "," NO_OPT_RA ",", "," CURSOR_PBR); /* - if one doc recv'ed and iterated, use resumeAfter with * postBatchResumeToken. */ _test_resume("{" OPT_SA "}", OPT_SA "," NO_OPT_OP "," NO_OPT_RA ",", DOC, PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); /* 'resumeAfter', 'startAfter', and 'startAtOperationTime' are all specified. * All should be passed (although the server currently returns an error). */ /* - if no doc recv'ed, use startAfter with postBatchResumeToken. */ _test_resume("{" OPT_RA "," OPT_SA "," OPT_OP "}", OPT_RA "," OPT_SA "," OPT_OP ",", "", PBR_SA "," NO_OPT_OP "," NO_OPT_RA ",", "," CURSOR_PBR); /* - if one doc recv'ed and iterated, use resumeAfter with * postBatchResumeToken. */ _test_resume("{" OPT_RA "," OPT_SA "," OPT_OP "}", OPT_RA "," OPT_SA "," OPT_OP ",", DOC, PBR_RA "," NO_OPT_OP "," NO_OPT_SA ",", "," CURSOR_PBR); } void test_error_null_doc(void *ctx) { mongoc_client_t *client; mongoc_change_stream_t *stream; bson_error_t err; const bson_t *error_doc = tmp_bson("{}"); /* assign to a non-zero address. */ BSON_UNUSED(ctx); client = test_framework_new_default_client(); stream = mongoc_client_watch(client, tmp_bson("{}"), NULL); /* error_doc starts as non-NULL. */ BSON_ASSERT(error_doc); BSON_ASSERT(!mongoc_change_stream_error_document(stream, &err, &error_doc)); /* error_doc is set to NULL no error occurred. */ BSON_ASSERT(!error_doc); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); } void _check_doc_resume_token(const bson_t *doc, const bson_t *resume_token) { bson_t document_resume_token; bson_lookup_doc(doc, "_id", &document_resume_token); ASSERT(bson_equal(resume_token, &document_resume_token)); bson_destroy(&document_resume_token); } void prose_test_11(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; bson_error_t error; const bson_t *next_doc = NULL; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; const bson_t *resume_token; _data_change_stream_t *post_batch_expected; BSON_UNUSED(ctx); client = test_framework_new_default_client(); ASSERT(client); coll = drop_and_get_coll(client, "db", "coll_resume"); ASSERT(coll); /* Set the batch size to 1 so we only get one document per call to next. */ stream = mongoc_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}")); ASSERT(stream); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); /* The resume token should be updated to the post batch resume token */ ASSERT(!mongoc_change_stream_next(stream, &next_doc)); ASSERT(!next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); /* Look into the struct and get the actual post batch resume token, assert it * is equal to our resume token */ post_batch_expected = (_data_change_stream_t *)stream->cursor->impl.data; ASSERT(bson_compare(resume_token, &post_batch_expected->post_batch_resume_token) == 0); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 0}"), &opts, NULL, &error), error); /* Checking that a resume token is returned */ ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); ASSERT(bson_compare(resume_token, &post_batch_expected->post_batch_resume_token) == 0); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_collection_destroy(coll); } void prose_test_13(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; bson_error_t error; const bson_t *next_doc = NULL; mongoc_apm_callbacks_t *callbacks; mongoc_write_concern_t *wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; const bson_t *resume_token; bson_iter_t iter, child; client = test_framework_new_default_client(); ASSERT(client); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_resume_token_command_start); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = drop_and_get_coll(client, "db", "coll_resume"); ASSERT(coll); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson(NULL), NULL, NULL, &error), error); /* Set the batch size to 1 so we only get one document per call to next. */ stream = mongoc_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}")); ASSERT(stream); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(stream, &error, NULL), error); /* Insert a few docs to listen for. Use write concern majority, so subsequent * call to watch will be guaranteed to retrieve them. */ mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 0}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), &opts, NULL, &error), error); /* The resume token should be updated to the most recently iterated doc */ ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); _check_doc_resume_token(next_doc, resume_token); ASSERT(mongoc_change_stream_next(stream, &next_doc)); ASSERT(next_doc); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(!bson_empty0(resume_token)); _check_doc_resume_token(next_doc, resume_token); ASSERT(bson_iter_init_find(&iter, next_doc, "documentKey")); ASSERT(bson_iter_recurse(&iter, &child)); ASSERT(bson_iter_find(&child, "_id") && bson_iter_int32(&child) == 1); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_apm_callbacks_destroy(callbacks); mongoc_change_stream_destroy(stream); mongoc_client_destroy(client); mongoc_collection_destroy(coll); } static void _save_operation_time_from_agg(const mongoc_apm_command_succeeded_t *event) { if (0 == strcmp("aggregate", mongoc_apm_command_succeeded_get_command_name(event))) { mongoc_timestamp_t *timestamp; bson_iter_t iter; const bson_t *cmd; cmd = mongoc_apm_command_succeeded_get_reply(event); timestamp = mongoc_apm_command_succeeded_get_context(event); /* Capture the operationTime from the first aggregate reply. */ if (timestamp->timestamp == 0) { BSON_ASSERT(bson_iter_init_find(&iter, cmd, "operationTime")); _mongoc_timestamp_set_from_bson(timestamp, &iter); } } } void prose_test_14(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll; mongoc_change_stream_t *stream; bson_t opts; bson_error_t error; const bson_t *resume_token; bson_t expected_token; const bson_t *doc = NULL; mongoc_timestamp_t optime = {0}; mongoc_apm_callbacks_t *callbacks; BSON_UNUSED(test_ctx); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, _save_operation_time_from_agg); mongoc_client_set_apm_callbacks(client, callbacks, &optime); mongoc_apm_callbacks_destroy(callbacks); coll = drop_and_get_coll(client, "db", "coll"); bson_init(&opts); stream = mongoc_collection_watch(coll, tmp_bson("{}"), &opts); /* The _save_operation_time_from_agg listener must have stored the operation * time. */ BSON_ASSERT(optime.timestamp != 0); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 0}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2}"), &opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 3}"), &opts, NULL, &error), error); ASSERT(mongoc_change_stream_next(stream, &doc)); resume_token = mongoc_change_stream_get_resume_token(stream); bson_copy_to(resume_token, &expected_token); BSON_APPEND_DOCUMENT(&opts, "startAfter", &expected_token); mongoc_change_stream_destroy(stream); /* Start a new change stream using "startAfter" set to a previously obtained resume token to guarantee a non-empty initial batch */ stream = mongoc_collection_watch(coll, tmp_bson("{}"), &opts); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(bson_equal(resume_token, &expected_token)); /* Doing the same using "resumeAfter" instead */ mongoc_change_stream_destroy(stream); bson_destroy(&opts); bson_init(&opts); BSON_APPEND_DOCUMENT(&opts, "resumeAfter", &expected_token); stream = mongoc_collection_watch(coll, tmp_bson("{}"), &opts); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(bson_equal(resume_token, &expected_token)); mongoc_change_stream_destroy(stream); /* Finally, with neither. */ bson_destroy(&opts); bson_init(&opts); BSON_APPEND_TIMESTAMP(&opts, "startAtOperationTime", optime.timestamp, optime.increment); stream = mongoc_collection_watch(coll, tmp_bson("{}"), &opts); resume_token = mongoc_change_stream_get_resume_token(stream); ASSERT(resume_token == NULL); bson_destroy(&expected_token); bson_destroy(&opts); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void prose_test_17(void) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *next_doc = NULL; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); coll = mongoc_client_get_collection(client, "db", "coll"); /* Pass an arbitrary document as the resume token, like {'x': 1} */ future = future_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'startAfter': {'x': 1}}")); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline' : [ { '$changeStream': { " "'startAfter': {'x': 1} , 'resumeAfter': { '$exists': false }, " "'startAtOperationTime': { '$exists': false } } } ]}")); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': 'db.coll', 'firstBatch': []}, 'ok': 1 }"); request_destroy(request); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg( server, MONGOC_QUERY_NONE, tmp_bson("{ 'getMore': {'$numberLong': '123'}, 'collection': 'coll' }")); reply_to_request_simple(request, "{ 'code': 10107, 'errmsg': 'not primary', 'errorLabels': " "['ResumableChangeStreamError'], 'ok': 0 }"); request_destroy(request); /* Resume occurs. */ request = mock_server_receives_msg( server, MONGOC_QUERY_NONE, tmp_bson("{ 'killCursors': 'coll', 'cursors': [{ '$numberLong': '123'}]}")); reply_to_request_with_ok_and_destroy(request); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline': [ { " "'$changeStream': { 'startAfter': {'x': 1}, 'resumeAfter': { " "'$exists': false }, 'startAtOperationTime': { '$exists': " "false } } " "}]}")); /* Reply with a 0 cursor ID to prevent a killCursors command. */ reply_to_request_simple(request, "{'cursor': {'id': 0, 'ns': 'db.coll', 'firstBatch': []}, 'ok': 1 }"); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } void prose_test_18(void) { mock_server_t *server; request_t *request; future_t *future; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_change_stream_t *stream; const bson_t *next_doc = NULL; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); coll = mongoc_client_get_collection(client, "db", "coll"); /* Pass an arbitrary document as the resume token, like {'x': 1} */ future = future_collection_watch(coll, tmp_bson("{}"), tmp_bson("{'startAfter': {'x': 1}}")); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline' : [ { '$changeStream': { " "'startAfter': {'x': 1}, 'resumeAfter': { '$exists': false }, " "'startAtOperationTime': { '$exists': false } } } ]}")); reply_to_request_simple(request, "{'cursor': {'id': 123, 'ns': " "'db.coll', 'firstBatch': [{'_id': " "{'y': 1}}]}, 'ok': 1 }"); request_destroy(request); stream = future_get_mongoc_change_stream_ptr(future); ASSERT(stream); future_destroy(future); /* The first call to mongoc_change_stream_next returns the batched document. */ mongoc_change_stream_next(stream, &next_doc); future = future_change_stream_next(stream, &next_doc); request = mock_server_receives_msg( server, MONGOC_QUERY_NONE, tmp_bson("{ 'getMore': {'$numberLong': '123'}, 'collection': 'coll' }")); reply_to_request_simple(request, "{ 'code': 10107, 'errmsg': 'not primary', 'errorLabels': " "['ResumableChangeStreamError'], 'ok': 0 }"); request_destroy(request); request = mock_server_receives_msg( server, MONGOC_QUERY_NONE, tmp_bson("{ 'killCursors': 'coll', 'cursors': [{ '$numberLong': '123'}]}")); reply_to_request_with_ok_and_destroy(request); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate': 'coll', 'pipeline': [ { " "'$changeStream': { 'resumeAfter': {'y': 1}, 'startAfter': { " "'$exists': false }, 'startAtOperationTime': { '$exists': " "false } } " "}]}")); /* Reply with a 0 cursor ID to prevent a killCursors command. */ reply_to_request_simple(request, "{'cursor': {'id': 0, 'ns': 'db.coll', 'firstBatch': []}, 'ok': 1 }"); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); mongoc_change_stream_destroy(stream); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } // Test that a resume does not occur after an "invalidate" event. static void iterate_after_invalidate(void *test_ctx) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); bson_error_t error; int64_t start_time = bson_get_monotonic_time(); BSON_UNUSED(test_ctx); // Insert a document into the collection to ensure the collection is created. bool ok = mongoc_collection_insert_one(coll, tmp_bson("{'foo': 'bar'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); mongoc_change_stream_t *cs = mongoc_collection_watch(coll, tmp_bson("{}"), NULL /* opts */); ASSERT_OR_PRINT(mongoc_collection_drop(coll, &error), error); // Iterate until the next event. Expect "drop" event. { const bson_t *event; bool found_event = false; while (!found_event) { found_event = mongoc_change_stream_next(cs, &event); if (!found_event) { ASSERT_OR_PRINT(!mongoc_change_stream_error_document(cs, &error, NULL /* document */), error); } int64_t delta = bson_get_monotonic_time() - start_time; if (delta > 10 * 1000 * 1000) { test_error("test exceeded 10 seconds"); } } ASSERT_MATCH(event, "{'operationType': 'drop'}"); } // Iterate until the next event. Expect "invalidate" event. { const bson_t *event; bool found_event = false; while (!found_event) { found_event = mongoc_change_stream_next(cs, &event); if (!found_event) { ASSERT_OR_PRINT(!mongoc_change_stream_error_document(cs, &error, NULL /* document */), error); } int64_t delta = bson_get_monotonic_time() - start_time; if (delta > 10 * 1000 * 1000) { test_error("test exceeded 10 seconds"); } } ASSERT_MATCH(event, "{'operationType': 'invalidate'}"); } // Iterate. Expect error suggesting failure to iterate a closed cursor. { const bson_t *event; bool found_error = false; while (!found_error) { ASSERT_WITH_MSG(!mongoc_change_stream_next(cs, &event), "expected no event, got: %s", tmp_json(event)); found_error = mongoc_change_stream_error_document(cs, &error, NULL /* document */); } ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance a closed change stream"); } mongoc_change_stream_destroy(cs); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } typedef struct { bson_t *commands[6]; size_t commands_len; bson_t *replies[6]; size_t replies_len; } test_events_t; static void test_events_started_cb(const mongoc_apm_command_started_t *e) { test_events_t *te = mongoc_apm_command_started_get_context(e); ASSERT_CMPSIZE_T(te->commands_len, <, sizeof(te->commands) / sizeof(te->commands[0])); te->commands[te->commands_len++] = bson_copy(mongoc_apm_command_started_get_command(e)); } static void test_events_succeeded_cb(const mongoc_apm_command_succeeded_t *e) { test_events_t *te = mongoc_apm_command_succeeded_get_context(e); ASSERT_CMPSIZE_T(te->replies_len, <, sizeof(te->replies) / sizeof(te->replies[0])); te->replies[te->replies_len++] = bson_copy(mongoc_apm_command_succeeded_get_reply(e)); } // Test that batchSize:0 is applied to the `aggregate` command. static void test_change_stream_batchSize0(void *test_ctx) { BSON_UNUSED(test_ctx); bson_error_t error; // Create a change stream. Capture a resume token. Insert documents to create future events. bson_t *resumeToken; { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = drop_and_get_coll(client, "db", "coll"); // Insert with majority write concern to ensure documents are visible to change stream. { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); mongoc_write_concern_destroy(wc); } mongoc_change_stream_t *cs = mongoc_collection_watch(coll, tmp_bson("{}"), NULL); resumeToken = bson_copy(mongoc_change_stream_get_resume_token(cs)); // Insert documents to create future events. ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2}"), NULL, NULL, &error), error); mongoc_change_stream_destroy(cs); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Create another change stream with the resumeToken and batchSize:0. test_events_t te = {.commands_len = 0, .replies_len = 0}; { mongoc_client_t *client = test_framework_new_default_client(); // Capture events. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, test_events_started_cb); mongoc_apm_set_command_succeeded_cb(cbs, test_events_succeeded_cb); ASSERT(mongoc_client_set_apm_callbacks(client, cbs, &te)); mongoc_apm_callbacks_destroy(cbs); } mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); // Iterate change stream. { bson_t *opts = BCON_NEW("resumeAfter", BCON_DOCUMENT(resumeToken), "batchSize", BCON_INT32(0)); mongoc_change_stream_t *cs = mongoc_collection_watch(coll, tmp_bson("{}"), opts); const bson_t *ignored; while (mongoc_change_stream_next(cs, &ignored)) ; ASSERT_OR_PRINT(!mongoc_change_stream_error_document(cs, &error, NULL), error); bson_destroy(opts); mongoc_change_stream_destroy(cs); } mongoc_collection_destroy(coll); // Check captured events. { // Expect aggregate is sent with `batchSize:0` ASSERT(te.commands[0]); ASSERT_MATCH(te.commands[0], BSON_STR({"aggregate" : "coll", "cursor" : {"batchSize" : 0}})); // Expect reply has no documents. ASSERT(te.replies[0]); ASSERT_MATCH(te.replies[0], BSON_STR({"cursor" : {"firstBatch" : []}})); // Expect getMore is sent without `batchSize` ASSERT(te.commands[1]); ASSERT_MATCH(te.commands[1], BSON_STR({"getMore" : {"$$type" : "long"}, "batchSize" : {"$exists" : false}})); // Expect reply has both documents. ASSERT(te.replies[1]); ASSERT_MATCH( te.replies[1], BSON_STR({"cursor" : {"nextBatch" : [ {"operationType" : "insert"}, {"operationType" : "insert"} ]}})); // Expect another getMore is sent without `batchSize` ASSERT(te.commands[2]); ASSERT_MATCH(te.commands[2], BSON_STR({"getMore" : {"$$type" : "long"}, "batchSize" : {"$exists" : false}})); // Expect reply has no more documents ASSERT(te.replies[2]); ASSERT_MATCH(te.replies[2], BSON_STR({"cursor" : {"nextBatch" : []}})); // Expect killCursors is sent to kill server-side cursor. ASSERT(te.commands[3]); ASSERT_MATCH(te.commands[3], BSON_STR({"killCursors" : "coll"})); ASSERT(te.replies[3]); ASSERT_MATCH(te.replies[3], BSON_STR({"ok" : 1})); ASSERT(!te.commands[4]); ASSERT(!te.replies[4]); } mongoc_client_destroy(client); } bson_destroy(resumeToken); for (size_t i = 0; i < te.commands_len; i++) { bson_destroy(te.commands[i]); } for (size_t i = 0; i < te.replies_len; i++) { bson_destroy(te.replies[i]); } } void test_change_stream_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/change_stream/pipeline", test_change_stream_pipeline); TestSuite_AddFull(suite, "/change_stream/live/track_resume_token [lock:live-server]", test_change_stream_live_track_resume_token, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/change_stream/live/batch_size [lock:live-server]", test_change_stream_live_batch_size, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/live/missing_resume_token [lock:live-server]", test_change_stream_live_missing_resume_token, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/live/invalid_resume_token [lock:live-server]", test_change_stream_live_invalid_resume_token, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/change_stream/resumable_error", test_change_stream_resumable_error); TestSuite_AddMockServerTest(suite, "/change_stream/options", test_change_stream_options); TestSuite_AddFull(suite, "/change_stream/live/watch [lock:live-server]", test_change_stream_live_watch, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/live/read_prefs [lock:live-server]", test_change_stream_live_read_prefs, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_no_failpoint); TestSuite_Add(suite, "/change_stream/server_selection_fails", test_change_stream_server_selection_fails); TestSuite_AddFull(suite, "/change_stream/next_after_error [lock:live-server]", test_change_stream_next_after_error, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/accepts_array [lock:live-server]", test_change_stream_accepts_array, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/change_stream/getmore_errors", test_getmore_errors); TestSuite_AddFull(suite, "/change_stream/start_at_operation_time [lock:live-server]", test_change_stream_start_at_operation_time, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/change_stream/resume_with_post_batch_resume_token [lock:live-server]", test_change_stream_resume_with_post_batch_resume_token, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_no_crypto, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/change_stream/database [lock:live-server]", test_change_stream_database_watch, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/client [lock:live-server]", test_change_stream_client_watch, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/change_stream/resume_with_first_doc [timeout:10]", test_resume_cases); TestSuite_AddMockServerTest(suite, "/change_stream/resume_with_first_doc/post_batch_resume_token [timeout:10]", test_resume_cases_with_post_batch_resume_token); TestSuite_AddFull(suite, "/change_stream/error_null_doc [lock:live-server]", test_error_null_doc, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/live/prose_test_11 [lock:live-server]", prose_test_11, NULL, NULL, test_framework_skip_if_not_replset); // Prose test 12 is removed. C driver does not support server 4.0.7. TestSuite_AddFull(suite, "/change_stream/live/prose_test_13 [lock:live-server]", prose_test_13, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/live/prose_test_14 [lock:live-server]", prose_test_14, NULL, NULL, test_framework_skip_if_mongos, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/change_streams/prose_test_17", prose_test_17); TestSuite_AddMockServerTest(suite, "/change_streams/prose_test_18", prose_test_18); TestSuite_AddFull(suite, "/change_streams/iterate_after_invalidate [lock:live-server]", iterate_after_invalidate, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/change_stream/batchSize0 [lock:live-server]", test_change_stream_batchSize0, NULL, NULL, test_framework_skip_if_not_replset); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-client-pool.c000066400000000000000000000552751511661753600251250ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include static void test_mongoc_client_pool_basic(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=1"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); BSON_ASSERT(client); mongoc_client_pool_push(pool, client); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); } static void test_mongoc_client_pool_try_pop(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=1"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); BSON_ASSERT(client); BSON_ASSERT(!mongoc_client_pool_try_pop(pool)); mongoc_client_pool_push(pool, client); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); } static void test_mongoc_client_pool_pop_timeout(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; int64_t start; int64_t duration_usec; uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=1&waitqueuetimeoutms=2000"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); BSON_ASSERT(client); start = bson_get_monotonic_time(); BSON_ASSERT(!mongoc_client_pool_pop(pool)); duration_usec = bson_get_monotonic_time() - start; /* There is a possibility that the wait is a few milliseconds short. The * assertion is structured like this since the timeout is a rough lower bound * and some test environments might slow things down. */ BSON_ASSERT(duration_usec / 1000 >= 1990); mongoc_client_pool_push(pool, client); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); } static void test_mongoc_client_pool_min_size_zero(void) { mongoc_client_pool_t *pool; mongoc_client_t *client1; mongoc_client_t *client2; mongoc_client_t *client3; mongoc_client_t *client4; mongoc_uri_t *uri; uri = mongoc_uri_new(NULL); pool = test_framework_client_pool_new_from_uri(uri, NULL); client1 = mongoc_client_pool_pop(pool); client2 = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client2); mongoc_client_pool_push(pool, client1); BSON_ASSERT(mongoc_client_pool_get_size(pool) == 2); client3 = mongoc_client_pool_pop(pool); /* min pool size zero means "no min", so clients weren't destroyed */ BSON_ASSERT(client3 == client1); client4 = mongoc_client_pool_pop(pool); BSON_ASSERT(client4 == client2); mongoc_client_pool_push(pool, client4); mongoc_client_pool_push(pool, client3); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } static void test_mongoc_client_pool_set_max_size(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; mongoc_array_t conns; int i; _mongoc_array_init(&conns, sizeof client); uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=10"); pool = test_framework_client_pool_new_from_uri(uri, NULL); for (i = 0; i < 5; i++) { client = mongoc_client_pool_pop(pool); BSON_ASSERT(client); _mongoc_array_append_val(&conns, client); BSON_ASSERT(mlib_cmp(mongoc_client_pool_get_size(pool), ==, i + 1)); } mongoc_client_pool_max_size(pool, 3); BSON_ASSERT(mongoc_client_pool_try_pop(pool) == NULL); for (i = 0; i < 5; i++) { client = _mongoc_array_index(&conns, mongoc_client_t *, i); BSON_ASSERT(client); mongoc_client_pool_push(pool, client); } _mongoc_array_clear(&conns); _mongoc_array_destroy(&conns); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); } #ifndef MONGOC_ENABLE_SSL static void test_mongoc_client_pool_ssl_disabled(void) { mongoc_uri_t *uri = mongoc_uri_new("mongodb://host/?ssl=true"); ASSERT(uri); capture_logs(true); ASSERT(NULL == test_framework_client_pool_new_from_uri(uri, NULL)); ASSERT_CAPTURED_LOG("mongoc_client_pool_new", MONGOC_LOG_LEVEL_ERROR, "SSL not enabled in this build."); mongoc_uri_destroy(uri); } #endif static void test_mongoc_client_pool_handshake(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=1"); pool = test_framework_client_pool_new_from_uri(uri, NULL); ASSERT(mongoc_client_pool_set_appname(pool, "some application")); /* Be sure we can't set it twice */ capture_logs(true); ASSERT(!mongoc_client_pool_set_appname(pool, "a")); ASSERT_CAPTURED_LOG( "_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot set appname more than once"); capture_logs(false); mongoc_client_pool_destroy(pool); /* Make sure that after we pop a client we can't set handshake anymore */ pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); /* Be sure a client can't set it now that we've popped them */ capture_logs(true); ASSERT(!mongoc_client_set_appname(client, "a")); ASSERT_CAPTURED_LOG("_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot call set_appname on a client from a pool"); capture_logs(false); mongoc_client_pool_push(pool, client); /* even now that we pushed the client back we shouldn't be able to set * the handshake */ capture_logs(true); ASSERT(!mongoc_client_pool_set_appname(pool, "a")); ASSERT_CAPTURED_LOG( "_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot set appname after handshake initiated"); capture_logs(false); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); } /* Test that destroying a pool without pushing all clients is ok. */ static void test_client_pool_destroy_without_pushing(void) { mongoc_client_pool_t *pool; mongoc_client_t *client_in_pool; mongoc_client_t *client1; mongoc_client_t *client2; bson_error_t error; bson_t *cmd; bool ret; cmd = BCON_NEW("ping", BCON_INT32(1)); pool = test_framework_new_default_client_pool(); client1 = mongoc_client_pool_pop(pool); client2 = mongoc_client_pool_pop(pool); /* Push a client back onto the pool so endSessions succeeds to avoid a * warning. */ client_in_pool = mongoc_client_pool_pop(pool); ret = mongoc_client_command_simple(client_in_pool, "admin", cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_pool_push(pool, client_in_pool); ret = mongoc_client_command_simple(client1, "admin", cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_client_command_simple(client2, "admin", cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Since clients are checked out of pool, it is technically ok to * mongoc_client_destroy them instead of pushing. */ mongoc_client_destroy(client1); /* An operation on client2 should still be ok. */ ret = mongoc_client_command_simple(client2, "admin", cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_destroy(client2); /* Destroy the pool, which destroys the shared topology object. */ mongoc_client_pool_destroy(pool); bson_destroy(cmd); } static void command_started_cb(const mongoc_apm_command_started_t *event) { if (strcmp(mongoc_apm_command_started_get_command_name(event), "endSessions") != 0) { return; } int *const count = (int *)mongoc_apm_command_started_get_context(event); (*count)++; } /* tests that creating and destroying an unused session * in pooled mode does not result in an error log */ static void test_client_pool_create_unused_session(void *context) { mongoc_client_t *client; mongoc_client_pool_t *pool; mongoc_client_session_t *session; mongoc_apm_callbacks_t *callbacks; bson_error_t error; int count = 0; BSON_UNUSED(context); capture_logs(true); callbacks = mongoc_apm_callbacks_new(); pool = test_framework_new_default_client_pool(); mongoc_apm_set_command_started_cb(callbacks, command_started_cb); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &count); client = mongoc_client_pool_pop(pool); session = mongoc_client_start_session(client, NULL, &error); mongoc_client_session_destroy(session); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_apm_callbacks_destroy(callbacks); ASSERT_CMPINT(count, ==, 0); ASSERT_NO_CAPTURED_LOGS("mongoc_client_pool_destroy"); } /* Tests case where thread is blocked waiting for a client to be pushed back * into the client pool. Specifically this tests that the program terminates. * Addresses CDRIVER-3757 */ typedef struct pool_timeout { mongoc_client_pool_t *pool; bson_mutex_t mutex; mongoc_cond_t cond; int nleft; } pool_timeout_args_t; static BSON_THREAD_FUN(worker, arg) { pool_timeout_args_t *args = arg; mongoc_client_t *client = mongoc_client_pool_pop(args->pool); BSON_ASSERT(client); mlib_sleep_for(10, us); mongoc_client_pool_push(args->pool, client); bson_mutex_lock(&args->mutex); /* notify main thread that current thread has terminated */ args->nleft--; mongoc_cond_signal(&args->cond); bson_mutex_unlock(&args->mutex); BSON_THREAD_RETURN; } static void test_client_pool_max_pool_size_exceeded(void) { mongoc_client_pool_t *pool; mongoc_uri_t *uri; bson_thread_t thread1, thread2; pool_timeout_args_t *args = bson_malloc0(sizeof(pool_timeout_args_t)); int wait_time = 4000; /* 4000 msec = 4 sec */ int ret; uri = mongoc_uri_new("mongodb://127.0.0.1/?maxpoolsize=1"); pool = test_framework_client_pool_new_from_uri(uri, NULL); args->pool = pool; args->nleft = 2; bson_mutex_init(&args->mutex); mongoc_cond_init(&args->cond); ASSERT_CMPINT(0, ==, mcommon_thread_create(&thread1, worker, args)); ASSERT_CMPINT(0, ==, mcommon_thread_create(&thread2, worker, args)); bson_mutex_lock(&args->mutex); while (args->nleft > 0) { ret = mongoc_cond_timedwait(&args->cond, &args->mutex, wait_time); /* ret non-zero indicates an error (a timeout) */ BSON_ASSERT(!ret); } bson_mutex_unlock(&args->mutex); mcommon_thread_join(thread1); mcommon_thread_join(thread2); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); bson_free(args); } static void test_client_pool_can_override_sockettimeoutms(void) { mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017/?socketTimeoutMS=1000"); mongoc_client_pool_t *pool = mongoc_client_pool_new(uri); // Override the client's socketTimeoutMS. { mongoc_client_t *client = mongoc_client_pool_pop(pool); ASSERT_CMPINT32(client->cluster.sockettimeoutms, ==, 1000); mongoc_client_set_sockettimeoutms(client, 2000); ASSERT_CMPINT32(client->cluster.sockettimeoutms, ==, 2000); mongoc_client_pool_push(pool, client); } // Pop again. Expect the newly popped client to have the socketTimeoutMS from the URI. { mongoc_client_t *client = mongoc_client_pool_pop(pool); ASSERT_CMPINT32(client->cluster.sockettimeoutms, ==, 1000); mongoc_client_pool_push(pool, client); } mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } // Test connections to removed servers are closed when a client is pushed back to the pool. static void disconnects_removed_servers_on_push(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; bson_t *ping = BCON_NEW("ping", BCON_INT32(1)); const char *host0 = "localhost:27017"; const char *host1 = "localhost:27018"; stream_tracker_t *st = stream_tracker_new(); // Create a client pool to two servers. mongoc_client_pool_t *pool; { char *uristr = bson_strdup_printf("mongodb://%s,%s", host0, host1); mongoc_uri_t *uri = mongoc_uri_new(uristr); // Set a short heartbeat so server monitors get quick responses. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS); pool = mongoc_client_pool_new(uri); test_framework_set_pool_ssl_opts(pool); mongoc_uri_destroy(uri); bson_free(uristr); } stream_tracker_track_pool(st, pool); // Expect no streams created yet: stream_tracker_assert_active_count(st, host0, 0); stream_tracker_assert_active_count(st, host1, 0); // Pop (and push) a client to start background monitoring. { mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); // Wait for monitoring connections to be created. // Expect two monitoring connections per server to be created in background. stream_tracker_assert_eventual_active_count(st, host0, 2); stream_tracker_assert_eventual_active_count(st, host1, 2); } // Send 'ping' commands on a client to each server to create operation connections. { mongoc_client_t *client = mongoc_client_pool_pop(pool); ok = mongoc_client_command_simple_with_server_id(client, "admin", ping, NULL, 1 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple_with_server_id(client, "admin", ping, NULL, 2 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_pool_push(pool, client); // Expect an operation connection is created. stream_tracker_assert_active_count(st, host0, 2 + 1); stream_tracker_assert_active_count(st, host1, 2 + 1); } // Mock removal of server 27018 from topology. { mongoc_topology_t *tp = _mongoc_client_pool_get_topology(pool); mc_tpld_modification tdmod = mc_tpld_modify_begin(tp); mongoc_set_rm(mc_tpld_servers(tdmod.new_td), 2 /* server ID */); mc_tpld_modify_commit(tdmod); } // Expect connections are closed to removed server. { // Expect monitoring connections to be closed in background. stream_tracker_assert_eventual_active_count(st, host0, 2 + 1); stream_tracker_assert_eventual_active_count(st, host1, 1); // Pop and push the client to "prune" the stale operation connections. mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); stream_tracker_assert_active_count(st, host0, 2 + 1); stream_tracker_assert_active_count(st, host1, 0); } mongoc_client_pool_destroy(pool); bson_destroy(ping); stream_tracker_destroy(st); } // Test that connections are closed to servers removed from the topology on clients checked into the pool. static void disconnects_removed_servers_in_pool(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; bson_t *ping = BCON_NEW("ping", BCON_INT32(1)); const char *host0 = "localhost:27017"; const char *host1 = "localhost:27018"; stream_tracker_t *st = stream_tracker_new(); // Create a client pool to two servers. mongoc_client_pool_t *pool; { char *uristr = bson_strdup_printf("mongodb://%s,%s", host0, host1); mongoc_uri_t *uri = mongoc_uri_new(uristr); // Set a short heartbeat so server monitors get quick responses. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS); pool = mongoc_client_pool_new(uri); test_framework_set_pool_ssl_opts(pool); mongoc_uri_destroy(uri); bson_free(uristr); } stream_tracker_track_pool(st, pool); // Expect no streams created yet: stream_tracker_assert_active_count(st, host0, 0); stream_tracker_assert_active_count(st, host1, 0); // Pop (and push) a client to start background monitoring. { mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); // Wait for monitoring connections to be created. // Expect two monitoring connections per server to be created in background. stream_tracker_assert_eventual_active_count(st, host0, 2); stream_tracker_assert_eventual_active_count(st, host1, 2); } // Send 'ping' commands on two clients to each server to create operation connections. { mongoc_client_t *client1 = mongoc_client_pool_pop(pool); mongoc_client_t *client2 = mongoc_client_pool_pop(pool); ok = mongoc_client_command_simple_with_server_id(client1, "admin", ping, NULL, 1 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple_with_server_id(client1, "admin", ping, NULL, 2 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple_with_server_id(client2, "admin", ping, NULL, 1 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple_with_server_id(client2, "admin", ping, NULL, 2 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_pool_push(pool, client2); mongoc_client_pool_push(pool, client1); // Expect an operation connection is created per client. stream_tracker_assert_active_count(st, host0, 2 + 2); stream_tracker_assert_active_count(st, host1, 2 + 2); } // Mock removal of server 27018 from topology. { mongoc_topology_t *tp = _mongoc_client_pool_get_topology(pool); mc_tpld_modification tdmod = mc_tpld_modify_begin(tp); mongoc_set_rm(mc_tpld_servers(tdmod.new_td), 2 /* server ID */); mc_tpld_modify_commit(tdmod); } // Expect connections are closed to removed server. { // Expect monitoring connections to be closed in background. stream_tracker_assert_eventual_active_count(st, host0, 2 + 2); stream_tracker_assert_eventual_active_count(st, host1, 2); // Pop and push one client to "prune" the stale operation connections for both clients. mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); stream_tracker_assert_active_count(st, host0, 2 + 2); stream_tracker_assert_active_count(st, host1, 0); } mongoc_client_pool_destroy(pool); stream_tracker_destroy(st); bson_destroy(ping); } /* Test no memory leaks when changing ssl_opts from re-creating OpenSSL context. */ #if defined(MONGOC_ENABLE_SSL_OPENSSL) static void test_mongoc_client_pool_change_openssl_ctx(void) { mongoc_client_pool_t *pool; const mongoc_ssl_opt_t *ssl_opts; pool = test_framework_new_default_client_pool(); /* change ssl opts */ ssl_opts = test_framework_get_ssl_opts(); mongoc_client_pool_set_ssl_opts(pool, ssl_opts); mongoc_client_pool_destroy(pool); } #endif // MONGOC_ENABLE_SSL_OPENSSL #if defined(MONGOC_ENABLE_SSL) static void test_mongoc_client_set_ssl_opts_on_pool(void) { // Test calling `mongoc_client_set_ssl_opts` on a pooled client logs an error. mongoc_client_pool_t *pool = test_framework_new_default_client_pool(); mongoc_client_t *client_from_pool = mongoc_client_pool_pop(pool); capture_logs(true); mongoc_client_set_ssl_opts(client_from_pool, mongoc_ssl_opt_get_default()); ASSERT_CAPTURED_LOG("mongoc_client_set_ssl_opts", MONGOC_LOG_LEVEL_ERROR, "cannot be called on a pooled client"); capture_logs(false); mongoc_client_pool_push(pool, client_from_pool); mongoc_client_pool_destroy(pool); } #endif // MONGOC_ENABLE_SSL static void test_mongoc_client_set_stream_initiator(void) { // Test calling `mongoc_client_set_initiator` on a pooled client logs an error. mongoc_client_pool_t *pool = test_framework_new_default_client_pool(); mongoc_client_t *client_from_pool = mongoc_client_pool_pop(pool); capture_logs(true); mongoc_client_set_stream_initiator(client_from_pool, mongoc_client_default_stream_initiator, NULL); ASSERT_CAPTURED_LOG( "mongoc_client_set_stream_initiator", MONGOC_LOG_LEVEL_ERROR, "cannot be called on a pooled client"); capture_logs(false); mongoc_client_pool_push(pool, client_from_pool); mongoc_client_pool_destroy(pool); } void test_client_pool_install(TestSuite *suite) { TestSuite_Add(suite, "/ClientPool/basic", test_mongoc_client_pool_basic); TestSuite_Add(suite, "/ClientPool/try_pop", test_mongoc_client_pool_try_pop); TestSuite_Add(suite, "/ClientPool/pop_timeout", test_mongoc_client_pool_pop_timeout); TestSuite_Add(suite, "/ClientPool/min_size_zero", test_mongoc_client_pool_min_size_zero); TestSuite_Add(suite, "/ClientPool/set_max_size", test_mongoc_client_pool_set_max_size); TestSuite_Add(suite, "/ClientPool/handshake", test_mongoc_client_pool_handshake); TestSuite_AddFull(suite, "/ClientPool/create_client_pool_unused_session [lock:live-server]", test_client_pool_create_unused_session, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_sessions); #ifndef MONGOC_ENABLE_SSL TestSuite_Add(suite, "/ClientPool/ssl_disabled", test_mongoc_client_pool_ssl_disabled); #endif TestSuite_AddLive(suite, "/ClientPool/destroy_without_push", test_client_pool_destroy_without_pushing); TestSuite_AddLive(suite, "/ClientPool/max_pool_size_exceeded", test_client_pool_max_pool_size_exceeded); TestSuite_Add(suite, "/ClientPool/can_override_sockettimeoutms [lock:live-server]", test_client_pool_can_override_sockettimeoutms); TestSuite_AddFull( suite, "/client_pool/disconnects_removed_servers/on_push [lock:live-server]", disconnects_removed_servers_on_push, NULL, NULL, test_framework_skip_if_not_mongos /* require mongos to ensure two servers available */, test_framework_skip_if_max_wire_version_less_than_9 /* require server 4.4+ for streaming monitoring protocol */); TestSuite_AddFull( suite, "/client_pool/disconnects_removed_servers/in_pool [lock:live-server]", disconnects_removed_servers_in_pool, NULL, NULL, test_framework_skip_if_not_mongos /* require mongos to ensure two servers available */, test_framework_skip_if_max_wire_version_less_than_9 /* require server 4.4+ for streaming monitoring protocol */); #if defined(MONGOC_ENABLE_SSL_OPENSSL) TestSuite_Add( suite, "/ClientPool/openssl/change_ssl_opts [lock:live-server]", test_mongoc_client_pool_change_openssl_ctx); #endif #if defined(MONGOC_ENABLE_SSL) TestSuite_AddLive(suite, "/ClientPool/mongoc_client_set_ssl_opts", test_mongoc_client_set_ssl_opts_on_pool); #endif // MONGOC_ENABLE_SSL TestSuite_AddLive(suite, "/ClientPool/mongoc_client_set_stream_initiator", test_mongoc_client_set_stream_initiator); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-client-session.c000066400000000000000000002705441511661753600256350ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static void test_session_opts_clone(void) { mongoc_session_opt_t *opts; mongoc_session_opt_t *clone; opts = mongoc_session_opts_new(); clone = mongoc_session_opts_clone(opts); /* causalConsistency is enabled by default if snapshot is not enabled */ BSON_ASSERT(mongoc_session_opts_get_causal_consistency(clone)); mongoc_session_opts_destroy(clone); mongoc_session_opts_set_causal_consistency(opts, false); clone = mongoc_session_opts_clone(opts); BSON_ASSERT(!mongoc_session_opts_get_causal_consistency(clone)); mongoc_session_opts_destroy(clone); mongoc_session_opts_destroy(opts); } static void test_session_opts_causal_consistency_and_snapshot(void) { mongoc_session_opt_t *opts; opts = mongoc_session_opts_new(); /* causalConsistency is enabled by default if snapshot is not enabled */ BSON_ASSERT(mongoc_session_opts_get_causal_consistency(opts)); BSON_ASSERT(!mongoc_session_opts_get_snapshot(opts)); /* causalConsistency is disabled by default if snapshot is enabled */ mongoc_session_opts_set_snapshot(opts, true); BSON_ASSERT(!mongoc_session_opts_get_causal_consistency(opts)); BSON_ASSERT(mongoc_session_opts_get_snapshot(opts)); /* causalConsistency and snapshot can both be enabled, although this will * result in an error when starting the session. */ mongoc_session_opts_set_causal_consistency(opts, true); BSON_ASSERT(mongoc_session_opts_get_causal_consistency(opts)); BSON_ASSERT(mongoc_session_opts_get_snapshot(opts)); mongoc_session_opts_destroy(opts); } static void test_session_no_crypto(void *ctx) { mongoc_client_t *client; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(!mongoc_client_start_session(client, NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "need a cryptography library"); mongoc_client_destroy(client); } #define ASSERT_SESSIONS_MATCH(_lsid_a, _lsid_b) \ do { \ assert_match_bson((_lsid_a), (_lsid_b), false); \ } while (0) #define ASSERT_SESSIONS_DIFFER(_lsid_a, _lsid_b) \ do { \ BSON_ASSERT(!match_bson((_lsid_a), (_lsid_b), false)); \ } while (0) /* "Pool is LIFO" test from Driver Sessions Spec */ static void _test_session_pool_lifo(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_client_session_t *a, *b, *c, *d; bson_t lsid_a, lsid_b; bson_error_t error; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } a = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(a, error); a->server_session->last_used_usec = bson_get_monotonic_time(); bson_copy_to(mongoc_client_session_get_lsid(a), &lsid_a); b = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(b, error); b->server_session->last_used_usec = bson_get_monotonic_time(); bson_copy_to(mongoc_client_session_get_lsid(b), &lsid_b); /* return server sessions to pool: first "a", then "b" */ mongoc_client_session_destroy(a); mongoc_client_session_destroy(b); /* first pop returns last push */ c = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(c, error); ASSERT_SESSIONS_MATCH(&lsid_b, mongoc_client_session_get_lsid(c)); /* second pop returns previous push */ d = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(d, error); ASSERT_SESSIONS_MATCH(&lsid_a, mongoc_client_session_get_lsid(d)); mongoc_client_session_destroy(c); mongoc_client_session_destroy(d); if (pooled) { /* the pooled client never needed to connect, so it warns that * it isn't connecting in order to send endSessions */ capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&lsid_a); bson_destroy(&lsid_b); } static void test_session_pool_lifo_single(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_lifo(false); } static void test_session_pool_lifo_pooled(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_lifo(true); } /* test that a session that is timed out is not added to the pool, * and a session that times out while it's in the pool is destroyed */ static void _test_session_pool_timeout(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; uint32_t server_id; mongoc_client_session_t *s; bson_error_t error; bson_t lsid; int64_t almost_timeout_usec; almost_timeout_usec = (test_framework_session_timeout_minutes() - 1) * 60 * 1000 * 1000; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } /* * trigger discovery */ server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); /* * get a session, set last_used_date more than 29 minutes ago and return to * the pool. it's timed out & freed. */ BSON_ASSERT(mongoc_server_session_pool_is_empty(client->topology->session_pool)); s = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(s, error); bson_copy_to(mongoc_client_session_get_lsid(s), &lsid); s->server_session->last_used_usec = (bson_get_monotonic_time() - almost_timeout_usec - 100); mongoc_client_session_destroy(s); BSON_ASSERT(mongoc_server_session_pool_is_empty(client->topology->session_pool)); /* * get a new session, set last_used_date so it has one second left to live, * return to the pool, wait 1.5 seconds. it's timed out & freed. */ s = mongoc_client_start_session(client, NULL, &error); ASSERT_SESSIONS_DIFFER(&lsid, mongoc_client_session_get_lsid(s)); bson_destroy(&lsid); bson_copy_to(mongoc_client_session_get_lsid(s), &lsid); s->server_session->last_used_usec = (bson_get_monotonic_time() + 1000 * 1000 - almost_timeout_usec); mongoc_client_session_destroy(s); BSON_ASSERT(!mongoc_server_session_pool_is_empty(client->topology->session_pool)); mlib_sleep_for(1500, ms); /* getting a new client session must start a new server session */ s = mongoc_client_start_session(client, NULL, &error); ASSERT_SESSIONS_DIFFER(&lsid, mongoc_client_session_get_lsid(s)); BSON_ASSERT(mongoc_server_session_pool_is_empty(client->topology->session_pool)); mongoc_client_session_destroy(s); if (pooled) { /* the pooled client never needed to connect, so it warns that * it isn't connecting in order to send endSessions */ capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&lsid); } static void test_session_pool_timeout_single(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_timeout(false); } static void test_session_pool_timeout_pooled(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_timeout(true); } /* test that a session that times out while it's in the pool is reaped when * another session is added */ static void _test_session_pool_reap(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_client_session_t *a, *b; bool r; bson_error_t error; bson_t lsid_a, lsid_b; int64_t almost_timeout_usec; mongoc_server_session_t *ss; almost_timeout_usec = (test_framework_session_timeout_minutes() - 1) * 60 * 1000 * 1000; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } /* * trigger discovery */ r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); /* * get a new session, set last_used_date so it has one second left to live, * return to the pool, wait 1.5 seconds. */ a = mongoc_client_start_session(client, NULL, &error); b = mongoc_client_start_session(client, NULL, &error); bson_copy_to(mongoc_client_session_get_lsid(a), &lsid_a); bson_copy_to(mongoc_client_session_get_lsid(b), &lsid_b); a->server_session->last_used_usec = (bson_get_monotonic_time() + 1000 * 1000 - almost_timeout_usec); mongoc_client_session_destroy(a); BSON_ASSERT(!mongoc_server_session_pool_is_empty(client->topology->session_pool)); /* session is pooled */ mlib_sleep_for(1500, ms); /* * returning session B causes session A to be reaped */ b->server_session->last_used_usec = bson_get_monotonic_time(); mongoc_client_session_destroy(b); BSON_ASSERT(!mongoc_server_session_pool_is_empty(client->topology->session_pool)); ss = mongoc_server_session_pool_get_existing(client->topology->session_pool); BSON_ASSERT(ss); ASSERT_SESSIONS_MATCH(&ss->lsid, &lsid_b); mongoc_server_session_pool_return(client->topology->session_pool, ss); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&lsid_a); bson_destroy(&lsid_b); } static void test_session_pool_reap_single(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_reap(false); } static void test_session_pool_reap_pooled(void *ctx) { BSON_UNUSED(ctx); _test_session_pool_reap(true); } static void test_session_id_bad(void *ctx) { const char *bad_opts[] = { "{'sessionId': null}", "{'sessionId': 'foo'}", "{'sessionId': {'$numberInt': '1'}}", "{'sessionId': {'$numberDouble': '1'}}", /* doesn't fit in uint32 */ "{'sessionId': {'$numberLong': '5000000000'}}", /* doesn't match existing mongoc_client_session_t */ "{'sessionId': {'$numberLong': '123'}}", NULL, }; const char **bad_opt; mongoc_client_t *client; bson_error_t error; bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); for (bad_opt = bad_opts; *bad_opt; bad_opt++) { r = mongoc_client_read_command_with_opts( client, "admin", tmp_bson("{'ping': 1}"), NULL, tmp_bson(*bad_opt), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid sessionId"); memset(&error, 0, sizeof(bson_error_t)); } mongoc_client_destroy(client); } static void _test_session_supported(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *session; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } if (test_framework_session_timeout_minutes() == -1) { BSON_ASSERT(!mongoc_client_start_session(client, NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Server does not support sessions"); } else { session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); mongoc_client_session_destroy(session); } if (pooled) { /* the pooled client never needed to connect, so it warns that * it isn't connecting in order to send endSessions */ capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_session_supported_single(void *ctx) { BSON_UNUSED(ctx); _test_session_supported(false); } static void test_session_supported_pooled(void *ctx) { BSON_UNUSED(ctx); _test_session_supported(true); } static void _test_mock_end_sessions(bool pooled) { mock_server_t *server; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *session; bson_t lsid; bson_t opts = BSON_INITIALIZER; bson_t *expected_cmd; future_t *future; request_t *request; bool r; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); } session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); bson_copy_to(mongoc_client_session_get_lsid(session), &lsid); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); future = future_client_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, &opts, NULL, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1, 'lsid': {'$exists': true}}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); /* before destroying the session, construct the expected endSessions cmd */ expected_cmd = BCON_NEW("endSessions", "[", BCON_DOCUMENT(mongoc_client_session_get_lsid(session)), "]"); mongoc_client_session_destroy(session); if (pooled) { mongoc_client_pool_push(pool, client); future = future_client_pool_destroy(pool); } else { future = future_client_destroy(client); } /* check that we got the expected endSessions cmd */ request = mock_server_receives_msg(server, 0, expected_cmd); reply_to_request_with_ok_and_destroy(request); future_wait(future); future_destroy(future); mock_server_destroy(server); bson_destroy(expected_cmd); bson_destroy(&lsid); bson_destroy(&opts); } static void test_mock_end_sessions_single(void) { _test_mock_end_sessions(false); } static void test_mock_end_sessions_pooled(void) { _test_mock_end_sessions(true); } /* Test for CDRIVER-3587 - Do not reuse server stream that becomes invalid on * failure to end session */ static void test_mock_end_sessions_server_disconnect(void) { mock_server_t *server; mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *session[12000]; future_t *future; uint16_t i; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); for (i = 0; i < 12000; i++) { session[i] = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session[i], error); } /* Simulate server failure or network failure. Destroy the mock server here * rather than at the end of the test so that the 'endSessions' commands fail * to reach the mock server. */ mock_server_destroy(server); /* The below calls to mongoc_client_session_destroy () will produce a warning * regarding the inability to send the 'endSessions' command. */ capture_logs(true); for (i = 0; i < 12000; i++) { mongoc_client_session_destroy(session[i]); } /* The above loop will add each session back to the session pool. If * CDRIVER-3587 has not been fixed, the mongoc_client_destroy () call below * will create 'endSessions' commands which will be sent but fail to reach * the server; the associated server stream will not be correctly * invalidated. Subsequent reuse of the stream, as in the attempt to send * the second batch of 10,000 during the attempt to destroy the client, will * trigger a segfault. */ future = future_client_destroy(client); future_wait(future); future_destroy(future); } typedef struct { int started_calls; int succeeded_calls; mongoc_array_t cmds; mongoc_client_pool_t *pool; mongoc_client_t *client; } endsessions_test_t; static void endsessions_started_cb(const mongoc_apm_command_started_t *event) { endsessions_test_t *test; bson_t *cmd; if (strcmp(mongoc_apm_command_started_get_command_name(event), "endSessions") != 0) { return; } test = (endsessions_test_t *)mongoc_apm_command_started_get_context(event); test->started_calls++; cmd = bson_copy(mongoc_apm_command_started_get_command(event)); _mongoc_array_append_vals(&test->cmds, &cmd, 1); } static void endsessions_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { endsessions_test_t *test; if (strcmp(mongoc_apm_command_succeeded_get_command_name(event), "endSessions") != 0) { return; } test = (endsessions_test_t *)mongoc_apm_command_succeeded_get_context(event); test->succeeded_calls++; } static void endsessions_test_init(endsessions_test_t *test, bool pooled) { mongoc_apm_callbacks_t *callbacks; test->started_calls = test->succeeded_calls = 0; _mongoc_array_init(&test->cmds, sizeof(bson_t *)); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, endsessions_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, endsessions_succeeded_cb); if (pooled) { test->pool = test_framework_new_default_client_pool(); ASSERT(mongoc_client_pool_set_apm_callbacks(test->pool, callbacks, test)); test->client = mongoc_client_pool_pop(test->pool); } else { test->pool = NULL; test->client = test_framework_new_default_client(); ASSERT(mongoc_client_set_apm_callbacks(test->client, callbacks, test)); } mongoc_apm_callbacks_destroy(callbacks); } static void endsessions_test_destroy_client(endsessions_test_t *test) { if (test->pool) { mongoc_client_pool_push(test->pool, test->client); mongoc_client_pool_destroy(test->pool); } else { mongoc_client_destroy(test->client); } } static void endsessions_test_get_ended_lsids(endsessions_test_t *test, size_t index, bson_t *ended_lsids) { bson_iter_t iter; ASSERT_CMPINT(test->started_calls, >, (int)index); BSON_ASSERT(bson_iter_init_find(&iter, _mongoc_array_index(&test->cmds, bson_t *, index), "endSessions")); BSON_ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); bson_iter_bson(&iter, ended_lsids); } static void endsessions_test_cleanup(endsessions_test_t *test) { size_t i; for (i = 0; i < test->cmds.len; i++) { bson_destroy(_mongoc_array_index(&test->cmds, bson_t *, i)); } _mongoc_array_destroy(&test->cmds); } static void _test_end_sessions(bool pooled) { endsessions_test_t test; mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *cs1; mongoc_client_session_t *cs2; bson_t lsid1; bson_t lsid2; bson_t opts1 = BSON_INITIALIZER; bson_t opts2 = BSON_INITIALIZER; bool lsid1_ended = false; bool lsid2_ended = false; bson_t ended_lsids; bson_iter_t iter; bson_t ended_lsid; match_ctx_t ctx = {{0}}; bool r; endsessions_test_init(&test, pooled); client = test.client; /* * create and use sessions 1 and 2 */ cs1 = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs1, error); bson_copy_to(mongoc_client_session_get_lsid(cs1), &lsid1); r = mongoc_client_session_append(cs1, &opts1, &error); ASSERT_OR_PRINT(r, error); r = mongoc_client_command_with_opts(client, "admin", tmp_bson("{'count': 'c'}"), NULL, &opts1, NULL, &error); ASSERT_OR_PRINT(r, error); cs2 = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs2, error); bson_copy_to(mongoc_client_session_get_lsid(cs2), &lsid2); r = mongoc_client_session_append(cs2, &opts2, &error); ASSERT_OR_PRINT(r, error); r = mongoc_client_command_with_opts(client, "admin", tmp_bson("{'count': 'c'}"), NULL, &opts2, NULL, &error); ASSERT_OR_PRINT(r, error); /* * return server sessions to the pool */ mongoc_client_session_destroy(cs1); mongoc_client_session_destroy(cs2); endsessions_test_destroy_client(&test); /* * sessions were ended on server */ ASSERT_CMPINT(test.started_calls, ==, 1); ASSERT_CMPINT(test.succeeded_calls, ==, 1); endsessions_test_get_ended_lsids(&test, 0, &ended_lsids); BSON_ASSERT(bson_iter_init(&iter, &ended_lsids)); while (bson_iter_next(&iter)) { BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_bson(&iter, &ended_lsid); if (match_bson_with_ctx(&ended_lsid, &lsid1, &ctx)) { lsid1_ended = true; } else if (match_bson_with_ctx(&ended_lsid, &lsid2, &ctx)) { lsid2_ended = true; } } BSON_ASSERT(lsid1_ended); BSON_ASSERT(lsid2_ended); bson_destroy(&lsid1); bson_destroy(&opts1); bson_destroy(&lsid2); bson_destroy(&opts2); endsessions_test_cleanup(&test); } static void test_end_sessions_single(void *ctx) { BSON_UNUSED(ctx); _test_end_sessions(false); } static void test_end_sessions_pooled(void *ctx) { BSON_UNUSED(ctx); _test_end_sessions(true); } /* Sends ping to server via client_session. useful for marking * server_sessions as used so that they are pushed back to the session pool */ static void send_ping(mongoc_client_t *client, mongoc_client_session_t *client_session) { ASSERT(client); bson_t ping_cmd = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool ret; BCON_APPEND(&ping_cmd, "ping", BCON_INT32(1)); ret = mongoc_client_session_append(client_session, &opts, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_client_command_with_opts(client, "admin", &ping_cmd, NULL, &opts, NULL, &error); ASSERT_OR_PRINT(ret, error); bson_destroy(&opts); bson_destroy(&ping_cmd); } static void _test_end_sessions_many(bool pooled) { endsessions_test_t test; mongoc_client_t *client; mongoc_client_session_t *sessions[10001]; bson_error_t error; bson_t ended_lsids; endsessions_test_init(&test, pooled); client = test.client; /* connect */ ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error), error); /* * create and destroy 10,001 sessions */ mlib_foreach_arr (mongoc_client_session_t *, session, sessions) { *session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(*session, error); send_ping(client, *session); } mlib_foreach_arr (mongoc_client_session_t *, session, sessions) { mongoc_client_session_destroy(*session); } endsessions_test_destroy_client(&test); /* * sessions were ended on the server, ten thousand at a time */ ASSERT_CMPINT(test.started_calls, ==, 2); ASSERT_CMPINT(test.succeeded_calls, ==, 2); endsessions_test_get_ended_lsids(&test, 0, &ended_lsids); ASSERT_CMPINT(bson_count_keys(&ended_lsids), ==, 10000); endsessions_test_get_ended_lsids(&test, 1, &ended_lsids); ASSERT_CMPINT(bson_count_keys(&ended_lsids), ==, 1); endsessions_test_cleanup(&test); } static void test_end_sessions_many_single(void *ctx) { BSON_UNUSED(ctx); _test_end_sessions_many(false); } static void test_end_sessions_many_pooled(void *ctx) { BSON_UNUSED(ctx); _test_end_sessions_many(true); } static void _test_advance_cluster_time(mongoc_client_session_t *cs, int new_timestamp, int new_increment, bool should_advance) { bson_t *old_cluster_time; bson_t *new_cluster_time; old_cluster_time = bson_copy(mongoc_client_session_get_cluster_time(cs)); new_cluster_time = tmp_bson("{'clusterTime': {'$timestamp': {'t': %d, 'i': %d}}}", new_timestamp, new_increment); mongoc_client_session_advance_cluster_time(cs, new_cluster_time); if (should_advance) { assert_match_bson(mongoc_client_session_get_cluster_time(cs), new_cluster_time, false); } else { assert_match_bson(mongoc_client_session_get_cluster_time(cs), old_cluster_time, false); } bson_destroy(old_cluster_time); } static void test_session_advance_cluster_time(void *ctx) { mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *cs; BSON_UNUSED(ctx); client = test_framework_new_default_client(); cs = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs, error); BSON_ASSERT(!mongoc_client_session_get_cluster_time(cs)); capture_logs(true); mongoc_client_session_advance_cluster_time(cs, tmp_bson("{'foo': 1}")); ASSERT_CAPTURED_LOG( "mongoc_client_session_advance_cluster_time", MONGOC_LOG_LEVEL_ERROR, "Cannot parse cluster time"); capture_logs(true); mongoc_client_session_advance_cluster_time(cs, tmp_bson("{'clusterTime': 1}")); ASSERT_CAPTURED_LOG( "mongoc_client_session_advance_cluster_time", MONGOC_LOG_LEVEL_ERROR, "Cannot parse cluster time"); mongoc_client_session_advance_cluster_time(cs, tmp_bson("{'clusterTime': {'$timestamp': {'t': 1, 'i': 1}}}")); _test_advance_cluster_time(cs, 1, 0, false); _test_advance_cluster_time(cs, 2, 2, true); _test_advance_cluster_time(cs, 2, 1, false); _test_advance_cluster_time(cs, 3, 1, true); mongoc_client_session_destroy(cs); mongoc_client_destroy(client); } static void _test_advance_operation_time(mongoc_client_session_t *cs, uint32_t t, uint32_t i, bool should_advance) { uint32_t old_t, old_i; uint32_t new_t, new_i; mongoc_client_session_get_operation_time(cs, &old_t, &old_i); mongoc_client_session_advance_operation_time(cs, t, i); mongoc_client_session_get_operation_time(cs, &new_t, &new_i); if (should_advance) { ASSERT_CMPUINT32(new_t, ==, t); ASSERT_CMPUINT32(new_i, ==, i); } else if (new_t == t && new_i == i) { test_error("Shouldn't have advanced from operationTime %" PRIu32 ", %" PRIu32 " to %" PRIu32 ", %" PRIu32, old_t, old_i, t, i); } } static void test_session_advance_operation_time(void *ctx) { mongoc_client_t *client; bson_error_t error; mongoc_client_session_t *cs; uint32_t t, i; BSON_UNUSED(ctx); client = test_framework_new_default_client(); cs = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs, error); mongoc_client_session_get_operation_time(cs, &t, &i); ASSERT_CMPUINT32(t, ==, 0); ASSERT_CMPUINT32(t, ==, 0); mongoc_client_session_advance_operation_time(cs, 1, 1); _test_advance_operation_time(cs, 1, 0, false); _test_advance_operation_time(cs, 2, 2, true); _test_advance_operation_time(cs, 2, 1, false); _test_advance_operation_time(cs, 3, 1, true); mongoc_client_session_destroy(cs); mongoc_client_destroy(client); } typedef enum { CORRECT_CLIENT, INCORRECT_CLIENT, } session_test_correct_t; typedef enum { CAUSAL, NOT_CAUSAL, } session_test_causal_t; typedef struct { bool verbose; mongoc_client_t *session_client, *client; mongoc_database_t *session_db, *db; mongoc_collection_t *session_collection, *collection; mongoc_client_session_t *cs; mongoc_client_session_t *wrong_cs; bson_t opts; bson_error_t error; int n_started; int n_succeeded; bool expect_explicit_lsid; bool acknowledged; bool succeeded; mongoc_array_t cmds; mongoc_array_t replies; bson_t sent_lsid; bson_t sent_cluster_time; bson_t received_cluster_time; } session_test_t; static void started(const mongoc_apm_command_started_t *event) { match_ctx_t ctx = {{0}}; bson_iter_t iter; bool has_cluster_time; bson_t cluster_time; bson_t lsid; const bson_t *client_session_lsid; bson_t *cmd = bson_copy(mongoc_apm_command_started_get_command(event)); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); session_test_t *test = (session_test_t *)mongoc_apm_command_started_get_context(event); ctx.strict_numeric_types = false; if (test->verbose) { char *s = bson_as_relaxed_extended_json(cmd, NULL); printf("%s\n", s); bson_free(s); } if (!strcmp(cmd_name, "endSessions")) { BSON_ASSERT(!bson_has_field(cmd, "lsid")); bson_destroy(cmd); return; } if (test->acknowledged) { if (!bson_iter_init_find(&iter, cmd, "lsid")) { test_error("no lsid sent with command %s", cmd_name); } bson_iter_bson(&iter, &lsid); client_session_lsid = &test->cs->server_session->lsid; if (test->expect_explicit_lsid) { if (!match_bson_with_ctx(&lsid, client_session_lsid, &ctx)) { test_error("command %s should have used client session's lsid", cmd_name); } } else { if (match_bson_with_ctx(&lsid, client_session_lsid, &ctx)) { test_error("command %s should not have used client session's lsid", cmd_name); } } if (bson_empty(&test->sent_lsid)) { bson_destroy(&test->sent_lsid); bson_copy_to(&lsid, &test->sent_lsid); } else { if (!match_bson_with_ctx(&lsid, &test->sent_lsid, &ctx)) { test_error("command %s used different lsid than previous command", cmd_name); } } } else { /* unacknowledged commands should never include lsid */ BSON_ASSERT(!bson_has_field(cmd, "lsid")); } has_cluster_time = bson_iter_init_find(&iter, cmd, "$clusterTime"); // Since $clusterTime is no longer used with SDAM, there may not be a cluster time until the first successful // command completes. const bool should_have_cluster_time = test->acknowledged && test->n_succeeded >= 1; if (should_have_cluster_time && !has_cluster_time) { test_error("no $clusterTime sent with command %s", cmd_name); } if (has_cluster_time) { /* like $clusterTime: {clusterTime: } */ bson_iter_bson(&iter, &cluster_time); bson_destroy(&test->sent_cluster_time); bson_copy_to(&cluster_time, &test->sent_cluster_time); } _mongoc_array_append_vals(&test->cmds, &cmd, 1); test->n_started++; } static void succeeded(const mongoc_apm_command_succeeded_t *event) { bson_iter_t iter; bool has_cluster_time; bson_t cluster_time; bson_t *reply = bson_copy(mongoc_apm_command_succeeded_get_reply(event)); const char *cmd_name = mongoc_apm_command_succeeded_get_command_name(event); session_test_t *test = (session_test_t *)mongoc_apm_command_succeeded_get_context(event); if (test->verbose) { char *s = bson_as_relaxed_extended_json(reply, NULL); printf("<-- %s\n", s); bson_free(s); } has_cluster_time = bson_iter_init_find(&iter, reply, "$clusterTime"); if (test->acknowledged && !has_cluster_time) { test_error("no $clusterTime in reply to command %s", cmd_name); } if (strcmp(cmd_name, "endSessions") == 0) { bson_destroy(reply); return; } if (has_cluster_time) { /* like $clusterTime: {clusterTime: } */ bson_iter_bson(&iter, &cluster_time); bson_destroy(&test->received_cluster_time); bson_copy_to(&cluster_time, &test->received_cluster_time); } _mongoc_array_append_vals(&test->replies, &reply, 1); test->n_succeeded++; } static void failed(const mongoc_apm_command_failed_t *event) { const char *cmd_name; bson_error_t error; session_test_t *test = (session_test_t *)mongoc_apm_command_failed_get_context(event); if (!test->verbose) { return; } cmd_name = mongoc_apm_command_failed_get_command_name(event); mongoc_apm_command_failed_get_error(event, &error); printf("<-- %s: %s\n", cmd_name, error.message); } static void set_session_test_callbacks(session_test_t *test) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, started); mongoc_apm_set_command_succeeded_cb(callbacks, succeeded); mongoc_apm_set_command_failed_cb(callbacks, failed); mongoc_client_set_apm_callbacks(test->client, callbacks, test); mongoc_apm_callbacks_destroy(callbacks); } static session_test_t * session_test_new(session_test_correct_t correct_client, session_test_causal_t causal) { session_test_t *test; mongoc_session_opt_t *cs_opts; bson_error_t error; test = bson_malloc0(sizeof(session_test_t)); test->verbose = test_framework_getenv_bool("MONGOC_TEST_SESSION_VERBOSE"); test->n_started = 0; test->expect_explicit_lsid = true; test->acknowledged = true; test->succeeded = false; _mongoc_array_init(&test->cmds, sizeof(bson_t *)); _mongoc_array_init(&test->replies, sizeof(bson_t *)); bson_init(&test->sent_cluster_time); bson_init(&test->received_cluster_time); bson_init(&test->sent_lsid); test->session_client = test_framework_new_default_client(); mongoc_client_set_error_api(test->session_client, 2); test->session_db = mongoc_client_get_database(test->session_client, "db"); test->session_collection = mongoc_database_get_collection(test->session_db, "collection"); bson_init(&test->opts); if (correct_client == CORRECT_CLIENT) { test->client = test->session_client; test->db = test->session_db; test->collection = test->session_collection; } else { /* test each function with a session from the correct client and a session * from the wrong client */ test->client = test_framework_new_default_client(); mongoc_client_set_error_api(test->client, 2); test->wrong_cs = mongoc_client_start_session(test->client, NULL, &error); ASSERT_OR_PRINT(test->wrong_cs, error); test->db = mongoc_client_get_database(test->client, "db"); test->collection = mongoc_database_get_collection(test->db, "collection"); } set_session_test_callbacks(test); cs_opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(cs_opts, causal == CAUSAL); test->cs = mongoc_client_start_session(test->session_client, cs_opts, &error); ASSERT_OR_PRINT(test->cs, error); mongoc_session_opts_destroy(cs_opts); return test; } struct check_session_returned_t { const bson_t *expect_lsid; bool found; }; static int check_session_returned_visit(void *ss_vp, void *unused, void *check_state_) { match_ctx_t ctx = {{0}}; mongoc_server_session_t *const ss = ss_vp; struct check_session_returned_t *check_state = check_state_; BSON_UNUSED(unused); ctx.strict_numeric_types = false; if (!check_state->found) { check_state->found = match_bson_with_ctx(&ss->lsid, check_state->expect_lsid, &ctx); } /* No session will ever be returned to the pool if it has never been used */ ASSERT_CMPINT64(ss->last_used_usec, !=, SESSION_NEVER_USED); return 0; } static void check_session_returned(session_test_t *test, const bson_t *lsid) { struct check_session_returned_t check_state; check_state.expect_lsid = lsid; check_state.found = false; mongoc_server_session_pool_visit_each( test->session_client->topology->session_pool, &check_state, check_session_returned_visit); /* Server session will only be returned to the pool if it has * been used. It is expected behavior for found to be false if * ss->last_used_usec == SESSION_NEVER_USED */ if (!check_state.found) { test_error("server session %s not returned to pool", bson_as_relaxed_extended_json(lsid, NULL)); } } static const bson_t * first_cmd(session_test_t *test) { ASSERT_CMPSIZE_T(test->cmds.len, >, (size_t)0); return _mongoc_array_index(&test->cmds, bson_t *, 0); } static const bson_t * last_non_getmore_cmd(session_test_t *test) { ssize_t i; const bson_t *cmd; ASSERT_CMPSIZE_T(test->cmds.len, >, (size_t)0); for (i = test->replies.len - 1; i >= 0; i--) { cmd = _mongoc_array_index(&test->cmds, bson_t *, i); if (strcmp(_mongoc_get_command_name(cmd), "getMore") != 0) { return cmd; } } test_error("No commands besides getMore were recorded"); } static const bson_t * last_reply(session_test_t *test) { ASSERT_CMPSIZE_T(test->replies.len, >, (size_t)0); return _mongoc_array_index(&test->replies, bson_t *, test->replies.len - 1); } static void clear_history(session_test_t *test) { size_t i; for (i = 0; i < test->cmds.len; i++) { bson_destroy(_mongoc_array_index(&test->cmds, bson_t *, i)); } for (i = 0; i < test->replies.len; i++) { bson_destroy(_mongoc_array_index(&test->replies, bson_t *, i)); } test->cmds.len = 0; test->replies.len = 0; } static void session_test_destroy(session_test_t *test) { bson_t session_lsid; size_t i; bool ss_was_used = test->cs->server_session->last_used_usec != SESSION_NEVER_USED; bson_copy_to(mongoc_client_session_get_lsid(test->cs), &session_lsid); mongoc_client_session_destroy(test->cs); if (ss_was_used) { /* If the session was used, assert that it was returned to the pool: */ check_session_returned(test, &session_lsid); } bson_destroy(&session_lsid); if (!bson_empty(&test->sent_lsid)) { /* for implicit sessions, ensure the implicit session was returned */ check_session_returned(test, &test->sent_lsid); } if (test->client != test->session_client) { mongoc_client_session_destroy(test->wrong_cs); mongoc_collection_destroy(test->collection); mongoc_database_destroy(test->db); mongoc_client_destroy(test->client); } mongoc_collection_destroy(test->session_collection); mongoc_database_destroy(test->session_db); mongoc_client_destroy(test->session_client); bson_destroy(&test->opts); bson_destroy(&test->sent_cluster_time); bson_destroy(&test->received_cluster_time); bson_destroy(&test->sent_lsid); for (i = 0; i < test->cmds.len; i++) { bson_destroy(_mongoc_array_index(&test->cmds, bson_t *, i)); } _mongoc_array_destroy(&test->cmds); for (i = 0; i < test->replies.len; i++) { bson_destroy(_mongoc_array_index(&test->replies, bson_t *, i)); } _mongoc_array_destroy(&test->replies); bson_free(test); } static void check_sessions_from_same_client_enforced(session_test_t *test) { if (test->session_client != test->client) { BSON_ASSERT(!test->succeeded); ASSERT_ERROR_CONTAINS(test->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid sessionId"); } } static void check_sessions_with_w0_prohibited(session_test_t *test) { if (test->expect_explicit_lsid && !test->acknowledged) { BSON_ASSERT(!test->succeeded); ASSERT_ERROR_CONTAINS( test->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "session with unacknowledged"); } } static void check_success(session_test_t *test) { check_sessions_from_same_client_enforced(test); check_sessions_with_w0_prohibited(test); if (test->session_client == test->client && test->expect_explicit_lsid == test->acknowledged) { ASSERT_OR_PRINT(test->succeeded, test->error); } if (test->succeeded) { ASSERT_CMPINT(test->n_started, >, 0); ASSERT_CMPINT(test->n_succeeded, >, 0); } } static void check_cluster_time(session_test_t *test) { const bson_t *session_time; session_time = mongoc_client_session_get_cluster_time(test->cs); BSON_ASSERT(session_time); /* should be set during handshake */ /* fail if cluster_time_greater logs an error */ capture_logs(true); if (_mongoc_cluster_time_greater(&test->received_cluster_time, session_time)) { test_error("client session's cluster time is outdated"); } ASSERT_NO_CAPTURED_LOGS("_mongoc_cluster_time_greater"); capture_logs(false); } typedef void (*session_test_fn_t)(session_test_t *); /* * the following tests check session logic for a variety of operations. most of * the asserts are in the APM started/succeeded/failed callbacks above */ /* use the same client for the session and the operation, expect success */ static void _test_explicit_session_lsid(session_test_fn_t test_fn) { session_test_t *test; bson_error_t error; int64_t start; test = session_test_new(CORRECT_CLIENT, NOT_CAUSAL); ASSERT_CMPINT64(test->cs->server_session->last_used_usec, ==, (int64_t)-1); ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); start = bson_get_monotonic_time(); test_fn(test); check_success(test); ASSERT_CMPINT(test->n_started, >, 0); ASSERT_CMPINT(test->n_succeeded, >, 0); check_cluster_time(test); ASSERT_CMPINT64(test->cs->server_session->last_used_usec, >=, start); session_test_destroy(test); } /* use a session from the wrong client, expect failure. this is the * "session argument is for right client" test from Driver Sessions Spec */ static void _test_session_from_wrong_client(session_test_fn_t test_fn) { session_test_t *test; bson_error_t error; test = session_test_new(INCORRECT_CLIENT, NOT_CAUSAL); ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); test_fn(test); check_success(test); mongoc_collection_drop_with_opts(test->session_collection, NULL, NULL); session_test_destroy(test); } /* implicit session - all commands should use an internally-acquired lsid */ static void _test_implicit_session_lsid(session_test_fn_t test_fn) { session_test_t *test; int64_t start; mongoc_server_session_t *ss; test = session_test_new(CORRECT_CLIENT, NOT_CAUSAL); test->expect_explicit_lsid = false; start = bson_get_monotonic_time(); test_fn(test); check_success(test); mongoc_collection_drop_with_opts(test->session_collection, NULL, NULL); ss = mongoc_server_session_pool_get_existing(test->client->topology->session_pool); BSON_ASSERT(ss); ASSERT_CMPINT64(ss->last_used_usec, >=, start); mongoc_server_session_pool_return(test->client->topology->session_pool, ss); session_test_destroy(test); } typedef struct { uint32_t t; uint32_t i; } op_time_t; static void parse_read_concern_time(const bson_t *cmd, op_time_t *op_time) { bson_iter_t iter; bson_iter_t rc; BSON_ASSERT(bson_iter_init_find(&iter, cmd, "readConcern")); BSON_ASSERT(bson_iter_recurse(&iter, &rc)); BSON_ASSERT(bson_iter_find(&rc, "afterClusterTime")); BSON_ASSERT(BSON_ITER_HOLDS_TIMESTAMP(&rc)); bson_iter_timestamp(&rc, &op_time->t, &op_time->i); } static void parse_reply_time(const bson_t *reply, op_time_t *op_time) { bson_iter_t iter; BSON_ASSERT(bson_iter_init_find(&iter, reply, "operationTime")); BSON_ASSERT(BSON_ITER_HOLDS_TIMESTAMP(&iter)); bson_iter_timestamp(&iter, &op_time->t, &op_time->i); } #define ASSERT_OP_TIMES_EQUAL(_a, _b) \ if ((_a).t != (_b).t || (_a).i != (_b).i) { \ test_error(#_a " (%" PRIu32 ", %" PRIu32 ") does not match " #_b " (%" PRIu32 ", %" PRIu32 ")", \ (_a).t, \ (_a).i, \ (_b).t, \ (_b).i); \ } else \ ((void)0) static void _test_causal_consistency(session_test_fn_t test_fn, bool allow_read_concern) { session_test_t *test; op_time_t session_time, read_concern_time, reply_time; bson_error_t error; const bson_t *cmd; size_t i; /* * first causal exchange: don't send readConcern, receive opTime */ test = session_test_new(CORRECT_CLIENT, CAUSAL); ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); test_fn(test); check_success(test); BSON_ASSERT(!bson_has_field(first_cmd(test), "readConcern")); mongoc_client_session_get_operation_time(test->cs, &session_time.t, &session_time.i); BSON_ASSERT(session_time.t != 0); parse_reply_time(last_reply(test), &reply_time); ASSERT_OP_TIMES_EQUAL(session_time, reply_time); /* * second exchange: send previous opTime and receive an opTime. * send readConcern if this function supports readConcern, like * mongoc_collection_find_with_opts or mongoc_client_read_command_with_opts. * don't send readConcern for generic command helpers like * mongoc_client_command_with_opts or mongoc_client_command. */ clear_history(test); test_fn(test); check_success(test); if (allow_read_concern) { parse_read_concern_time(first_cmd(test), &read_concern_time); ASSERT_OP_TIMES_EQUAL(reply_time, read_concern_time); mongoc_client_session_get_operation_time(test->cs, &session_time.t, &session_time.i); BSON_ASSERT(session_time.t != 0); parse_reply_time(last_reply(test), &reply_time); ASSERT_OP_TIMES_EQUAL(session_time, reply_time); } else { /* readConcern prohibited */ for (i = 0; i < test->cmds.len; i++) { cmd = _mongoc_array_index(&test->cmds, bson_t *, i); if (bson_has_field(cmd, "readConcern")) { test_error("Command should not have included readConcern: %s", bson_as_relaxed_extended_json(cmd, NULL)); } } } session_test_destroy(test); } static void _run_session_test(session_test_fn_t test_fn, bool allow_read_concern) { _test_explicit_session_lsid(test_fn); _test_session_from_wrong_client(test_fn); _test_implicit_session_lsid(test_fn); _test_causal_consistency(test_fn, allow_read_concern); } typedef struct { session_test_fn_t test_fn; } session_test_helper_t; static void run_session_test(void *ctx) { _run_session_test(((session_test_helper_t *)ctx)->test_fn, true); } /* test a command that doesn't allow readConcern, and therefore isn't causal */ static void run_session_test_no_rc(void *ctx) { _run_session_test(((session_test_helper_t *)ctx)->test_fn, false); } /* skip _test_session_from_wrong_client, which would abort with bulk op */ static void run_session_test_bulk_operation(void *ctx) { session_test_fn_t const test_fn = ((session_test_helper_t *)ctx)->test_fn; _test_explicit_session_lsid(test_fn); _test_implicit_session_lsid(test_fn); _test_causal_consistency(test_fn, false /* read concern */); } static void insert_10_docs(session_test_t *test) { mongoc_bulk_operation_t *bulk; bson_error_t error; int i; bool r; /* disable callbacks, we're not testing insert's lsid */ mongoc_client_set_apm_callbacks(test->session_client, NULL, NULL); bulk = mongoc_collection_create_bulk_operation_with_opts(test->session_collection, NULL); for (i = 0; i < 10; i++) { mongoc_bulk_operation_insert(bulk, tmp_bson("{}")); } r = (bool)mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_destroy(bulk); set_session_test_callbacks(test); } static void test_cmd(session_test_t *test) { test->succeeded = mongoc_client_command_with_opts( test->client, "db", tmp_bson("{'listCollections': 1}"), NULL, &test->opts, NULL, &test->error); } static void test_read_cmd(session_test_t *test) { test->succeeded = mongoc_client_read_command_with_opts( test->client, "db", tmp_bson("{'listCollections': 1}"), NULL, &test->opts, NULL, &test->error); } static void test_write_cmd(session_test_t *test) { bson_t *cmd = tmp_bson("{'delete': 'collection', 'deletes': [{'q': {}, 'limit': 1}]}"); test->succeeded = mongoc_client_write_command_with_opts(test->client, "db", cmd, &test->opts, NULL, &test->error); } static void test_read_write_cmd(session_test_t *test) { bson_t *cmd = tmp_bson("{" " 'aggregate': 'collection'," " 'cursor': {}," " 'pipeline': [{'$out': 'collection2'}]" "}"); test->succeeded = mongoc_client_read_write_command_with_opts(test->client, "db", cmd, NULL, &test->opts, NULL, &test->error); } static void test_db_cmd(session_test_t *test) { test->succeeded = mongoc_database_command_with_opts( test->db, tmp_bson("{'listCollections': 1}"), NULL, &test->opts, NULL, &test->error); } static void test_cursor(session_test_t *test) { mongoc_cursor_t *cursor; const bson_t *doc; /* ensure multiple batches */ insert_10_docs(test); cursor = mongoc_collection_find_with_opts(test->collection, tmp_bson("{}"), &test->opts, NULL); mongoc_cursor_set_batch_size(cursor, 2); while (mongoc_cursor_next(cursor, &doc)) { } test->succeeded = !mongoc_cursor_error(cursor, &test->error); mongoc_cursor_destroy(cursor); } static void test_drop(session_test_t *test) { /* create the collection so that "drop" can succeed */ insert_10_docs(test); test->succeeded = mongoc_collection_drop_with_opts(test->collection, &test->opts, &test->error); } static void test_drop_index(session_test_t *test) { bson_error_t error; bool r; mongoc_index_model_t *im = mongoc_index_model_new(tmp_bson("{'a': 1}"), tmp_bson("{'name': 'foo'}")); r = mongoc_collection_create_indexes_with_opts( test->session_collection, &im, 1, &test->opts, NULL /* reply */, &error); mongoc_index_model_destroy(im); ASSERT_OR_PRINT(r, error); test->succeeded = mongoc_collection_drop_index_with_opts(test->collection, "foo", &test->opts, &test->error); } static void test_create_index(session_test_t *test) { mongoc_index_model_t *im = mongoc_index_model_new(tmp_bson("{'a': 1}"), NULL); test->succeeded = mongoc_collection_create_indexes_with_opts(test->collection, &im, 1, &test->opts, NULL, &test->error); mongoc_index_model_destroy(im); } static void test_replace_one(session_test_t *test) { test->succeeded = mongoc_collection_replace_one(test->collection, tmp_bson("{}"), tmp_bson("{}"), &test->opts, NULL, &test->error); } static void test_update_one(session_test_t *test) { test->succeeded = mongoc_collection_update_one( test->collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), &test->opts, NULL, &test->error); } static void test_update_many(session_test_t *test) { test->succeeded = mongoc_collection_update_many( test->collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), &test->opts, NULL, &test->error); } static void test_insert_one(session_test_t *test) { test->succeeded = mongoc_collection_insert_one(test->collection, tmp_bson("{}"), &test->opts, NULL, &test->error); } static void test_insert_many(session_test_t *test) { bson_t *docs[2] = {tmp_bson("{}"), tmp_bson("{}")}; test->succeeded = mongoc_collection_insert_many(test->collection, (const bson_t **)docs, 2, &test->opts, NULL, &test->error); } static void test_delete_one(session_test_t *test) { test->succeeded = mongoc_collection_delete_one(test->collection, tmp_bson("{}"), &test->opts, NULL, &test->error); } static void test_delete_many(session_test_t *test) { test->succeeded = mongoc_collection_delete_many(test->collection, tmp_bson("{}"), &test->opts, NULL, &test->error); } static void test_rename(session_test_t *test) { mongoc_collection_t *collection; /* ensure "rename" can succeed */ insert_10_docs(test); /* mongoc_collection_rename_with_opts mutates the struct! */ collection = mongoc_collection_copy(test->collection); test->succeeded = mongoc_collection_rename_with_opts(collection, "db", "newname", true, &test->opts, &test->error); mongoc_collection_destroy(collection); } static void test_fam(session_test_t *test) { mongoc_find_and_modify_opts_t *fam_opts; fam_opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(fam_opts, tmp_bson("{'$set': {'x': 1}}")); BSON_ASSERT(mongoc_find_and_modify_opts_append(fam_opts, &test->opts)); test->succeeded = mongoc_collection_find_and_modify_with_opts(test->collection, tmp_bson("{}"), fam_opts, NULL, &test->error); mongoc_find_and_modify_opts_destroy(fam_opts); } static void test_db_drop(session_test_t *test) { test->succeeded = mongoc_database_drop_with_opts(test->db, &test->opts, &test->error); } static void test_gridfs_find(session_test_t *test) { mongoc_gridfs_t *gfs; bson_error_t error; mongoc_gridfs_file_list_t *list; mongoc_gridfs_file_t *f; /* work around lack of mongoc_client_get_gridfs_with_opts for now, can't yet * include lsid with the GridFS createIndexes command */ mongoc_client_set_apm_callbacks(test->client, NULL, NULL); gfs = mongoc_client_get_gridfs(test->client, "test", NULL, &error); ASSERT_OR_PRINT(gfs, error); set_session_test_callbacks(test); list = mongoc_gridfs_find_with_opts(gfs, tmp_bson("{}"), &test->opts); f = mongoc_gridfs_file_list_next(list); test->succeeded = !mongoc_gridfs_file_list_error(list, &test->error); if (f) { mongoc_gridfs_file_destroy(f); } mongoc_gridfs_file_list_destroy(list); mongoc_gridfs_destroy(gfs); } static void test_gridfs_find_one(session_test_t *test) { mongoc_gridfs_t *gfs; bson_error_t error; mongoc_gridfs_file_t *f; /* work around lack of mongoc_client_get_gridfs_with_opts for now, can't yet * include lsid with the GridFS createIndexes command */ mongoc_client_set_apm_callbacks(test->client, NULL, NULL); gfs = mongoc_client_get_gridfs(test->client, "test", NULL, &error); ASSERT_OR_PRINT(gfs, error); set_session_test_callbacks(test); f = mongoc_gridfs_find_one_with_opts(gfs, tmp_bson("{}"), &test->opts, &test->error); test->succeeded = test->error.domain == 0; if (f) { mongoc_gridfs_file_destroy(f); } mongoc_gridfs_destroy(gfs); } static void test_watch(session_test_t *test) { mongoc_change_stream_t *change_stream; insert_10_docs(test); change_stream = mongoc_collection_watch(test->collection, tmp_bson("{}"), &test->opts); test->succeeded = !mongoc_change_stream_error_document(change_stream, &test->error, NULL); mongoc_change_stream_destroy(change_stream); } static void test_aggregate(session_test_t *test) { bson_t opts; mongoc_cursor_t *cursor; const bson_t *doc; /* ensure multiple batches */ insert_10_docs(test); bson_copy_to(&test->opts, &opts); BSON_APPEND_INT32(&opts, "batchSize", 2); cursor = mongoc_collection_aggregate(test->collection, MONGOC_QUERY_NONE, tmp_bson("{}"), &opts, NULL); while (mongoc_cursor_next(cursor, &doc)) { } test->succeeded = !mongoc_cursor_error(cursor, &test->error); mongoc_cursor_destroy(cursor); bson_destroy(&opts); } static void test_create(session_test_t *test) { mongoc_collection_t *collection; /* ensure "create" can succeed */ mongoc_database_write_command_with_opts(test->session_db, tmp_bson("{'drop': 'newname'}"), &test->opts, NULL, NULL); collection = mongoc_database_create_collection(test->db, "newname", &test->opts, &test->error); test->succeeded = (collection != NULL); if (collection) { mongoc_collection_destroy(collection); } } static void test_database_names(session_test_t *test) { char **names; names = mongoc_client_get_database_names_with_opts(test->client, &test->opts, &test->error); test->succeeded = (names != NULL); if (names) { bson_strfreev(names); } } static void test_find_databases(session_test_t *test) { mongoc_cursor_t *cursor; const bson_t *doc; cursor = mongoc_client_find_databases_with_opts(test->client, &test->opts); while (mongoc_cursor_next(cursor, &doc)) { } test->succeeded = !mongoc_cursor_error(cursor, &test->error); mongoc_cursor_destroy(cursor); } static void test_find_collections(session_test_t *test) { mongoc_cursor_t *cursor; const bson_t *doc; cursor = mongoc_database_find_collections_with_opts(test->db, &test->opts); while (mongoc_cursor_next(cursor, &doc)) { } test->succeeded = !mongoc_cursor_error(cursor, &test->error); mongoc_cursor_destroy(cursor); } static void test_collection_names(session_test_t *test) { char **strv; strv = mongoc_database_get_collection_names_with_opts(test->db, &test->opts, &test->error); test->succeeded = (strv != NULL); bson_strfreev(strv); } static void test_find_indexes(session_test_t *test) { mongoc_cursor_t *cursor; const bson_t *doc; /* ensure the collection exists so the listIndexes command succeeds */ insert_10_docs(test); cursor = mongoc_collection_find_indexes_with_opts(test->collection, &test->opts); while (mongoc_cursor_next(cursor, &doc)) { } test->succeeded = !mongoc_cursor_error(cursor, &test->error); mongoc_cursor_destroy(cursor); } static void _test_bulk(session_test_t *test, mongoc_bulk_operation_t *bulk) { uint32_t i; test->succeeded = mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{}"), NULL, &test->error); check_sessions_from_same_client_enforced(test); test->succeeded = mongoc_bulk_operation_update_one_with_opts( bulk, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), NULL, &test->error); check_sessions_from_same_client_enforced(test); test->succeeded = mongoc_bulk_operation_remove_one_with_opts(bulk, tmp_bson("{}"), NULL, &test->error); check_sessions_from_same_client_enforced(test); i = mongoc_bulk_operation_execute(bulk, NULL, &test->error); test->succeeded = (i != 0); check_sessions_with_w0_prohibited(test); mongoc_bulk_operation_destroy(bulk); } /* test the standard mongoc_collection_create_bulk_operation_with_opts */ static void test_bulk(session_test_t *test) { mongoc_bulk_operation_t *bulk; bulk = mongoc_collection_create_bulk_operation_with_opts(test->collection, &test->opts); _test_bulk(test, bulk); } /* instead of the standard mongoc_collection_create_bulk_operation_with_opts, * test a quirky way of setting the client session on an existing bulk */ static void test_bulk_set_session(session_test_t *test) { mongoc_bulk_operation_t *bulk; bson_iter_t iter; mongoc_client_session_t *cs; bson_error_t error; bool r; bulk = mongoc_bulk_operation_new(true /* ordered */); mongoc_bulk_operation_set_client(bulk, test->client); mongoc_bulk_operation_set_database(bulk, mongoc_database_get_name(test->db)); mongoc_bulk_operation_set_collection(bulk, mongoc_collection_get_name(test->collection)); if (bson_iter_init_find(&iter, &test->opts, "sessionId")) { r = _mongoc_client_session_from_iter(test->session_client, &iter, &cs, &error); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_set_client_session(bulk, cs); } _test_bulk(test, bulk); } /* like test_bulk_set_session, but set session first, then client */ static void test_bulk_set_client(session_test_t *test) { mongoc_bulk_operation_t *bulk; bson_iter_t iter; mongoc_client_session_t *cs; bson_error_t error; bool r; bulk = mongoc_bulk_operation_new(true /* ordered */); if (bson_iter_init_find(&iter, &test->opts, "sessionId")) { r = _mongoc_client_session_from_iter(test->session_client, &iter, &cs, &error); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_set_client_session(bulk, cs); } mongoc_bulk_operation_set_client(bulk, test->client); mongoc_bulk_operation_set_database(bulk, mongoc_database_get_name(test->db)); mongoc_bulk_operation_set_collection(bulk, mongoc_collection_get_name(test->collection)); _test_bulk(test, bulk); } static void test_cursor_implicit_session(void *ctx) { session_test_t *test; mongoc_topology_t *topology; mongoc_cursor_t *cursor; const bson_t *doc; mongoc_client_session_t *cs; bson_t find_lsid; bson_error_t error; mongoc_server_session_t *ss; BSON_UNUSED(ctx); test = session_test_new(CORRECT_CLIENT, NOT_CAUSAL); test->expect_explicit_lsid = false; topology = test->client->topology; cs = mongoc_client_start_session(test->client, NULL, &error); ASSERT_OR_PRINT(cs, error); mongoc_collection_drop_with_opts(test->session_collection, NULL, NULL); insert_10_docs(test); cursor = mongoc_collection_find_with_opts(test->collection, tmp_bson("{}"), &test->opts, NULL); BSON_ASSERT(!cursor->client_session); mongoc_cursor_set_batch_size(cursor, 2); /* start the cursor. it makes an implicit session & sends it with "find" */ BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(cursor->client_session); BSON_ASSERT(!cursor->explicit_session); bson_copy_to(&cursor->client_session->server_session->lsid, &find_lsid); ASSERT_CMPSIZE_T(mongoc_server_session_pool_size(topology->session_pool), ==, 0); ASSERT_SESSIONS_MATCH(&test->sent_lsid, &find_lsid); /* push a new server session into the pool. server session is only pushed * if it is used. therefore mark session as used prior to * destroying session by sending a ping */ bson_reinit(&test->sent_lsid); send_ping(test->client, cs); mongoc_client_session_destroy(cs); BSON_ASSERT(mongoc_server_session_pool_size(topology->session_pool) == 1); ss = mongoc_server_session_pool_get_existing(topology->session_pool); BSON_ASSERT(ss); ASSERT_SESSIONS_DIFFER(&find_lsid, &ss->lsid); mongoc_server_session_pool_return(topology->session_pool, ss); /* "getMore" uses the same lsid as "find" did */ bson_reinit(&test->sent_lsid); ASSERT_CURSOR_COUNT(9, cursor); ASSERT_SESSIONS_MATCH(&test->sent_lsid, &find_lsid); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); /* lsid returned after last batch, doesn't wait for mongoc_cursor_destroy */ check_session_returned(test, &find_lsid); ASSERT_CMPSIZE_T(mongoc_server_session_pool_size(topology->session_pool), ==, 2); bson_destroy(&find_lsid); mongoc_cursor_destroy(cursor); session_test_destroy(test); } static void test_change_stream_implicit_session(void *ctx) { session_test_t *test; mongoc_topology_t *topology; mongoc_client_session_t *cs; bson_error_t error; mongoc_change_stream_t *change_stream; bson_t pipeline = BSON_INITIALIZER; const bson_t *doc; bson_t aggregate_lsid; mongoc_server_session_t *ss; BSON_UNUSED(ctx); test = session_test_new(CORRECT_CLIENT, NOT_CAUSAL); test->expect_explicit_lsid = false; topology = test->client->topology; cs = mongoc_client_start_session(test->client, NULL, &error); ASSERT_OR_PRINT(cs, error); change_stream = mongoc_collection_watch(test->session_collection, &pipeline, NULL); bson_destroy(&pipeline); bson_copy_to(&test->sent_lsid, &aggregate_lsid); ASSERT_CMPSIZE_T(mongoc_server_session_pool_size(topology->session_pool), ==, 0); BSON_ASSERT(change_stream->implicit_session); /* push a new server session into the pool. server session is only pushed * if it is used. therefore mark session as used prior to * destroying session by sending a ping */ bson_reinit(&test->sent_lsid); send_ping(test->client, cs); mongoc_client_session_destroy(cs); ASSERT_CMPSIZE_T(mongoc_server_session_pool_size(topology->session_pool), ==, 1); ss = mongoc_server_session_pool_get_existing(topology->session_pool); BSON_ASSERT(ss); ASSERT_SESSIONS_DIFFER(&aggregate_lsid, &ss->lsid); mongoc_server_session_pool_return(topology->session_pool, ss); /* "getMore" uses the same lsid as "aggregate" did */ bson_reinit(&test->sent_lsid); mongoc_change_stream_next(change_stream, &doc); ASSERT_SESSIONS_MATCH(&test->sent_lsid, &change_stream->implicit_session->server_session->lsid); ASSERT_SESSIONS_MATCH(&test->sent_lsid, &change_stream->cursor->client_session->server_session->lsid); ASSERT_SESSIONS_MATCH(&test->sent_lsid, &aggregate_lsid); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(change_stream, &error, NULL), error); bson_destroy(&aggregate_lsid); mongoc_change_stream_destroy(change_stream); session_test_destroy(test); } static void test_cmd_error(void *ctx) { session_test_t *test; bson_error_t error; BSON_UNUSED(ctx); test = session_test_new(CORRECT_CLIENT, CAUSAL); /* * explicit session. command error still updates operation time */ test->expect_explicit_lsid = true; ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); BSON_ASSERT(test->cs->operation_timestamp == 0); BSON_ASSERT(!mongoc_client_command_with_opts( test->session_client, "db", tmp_bson("{'bad': 1}"), NULL, &test->opts, NULL, NULL)); BSON_ASSERT(test->cs->operation_timestamp != 0); session_test_destroy(test); } static void test_read_concern(void *ctx) { session_test_t *test; mongoc_read_concern_t *rc; mongoc_session_opt_t *cs_opts; bson_error_t error; BSON_UNUSED(ctx); test = session_test_new(CORRECT_CLIENT, CAUSAL); test->expect_explicit_lsid = true; ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); /* first exchange sets session's operationTime */ test_read_cmd(test); check_success(test); BSON_ASSERT(!bson_has_field(last_non_getmore_cmd(test), "readConcern")); /* * default: no explicit read concern, driver sends afterClusterTime */ test_read_cmd(test); check_success(test); ASSERT_MATCH(last_non_getmore_cmd(test), "{" " 'readConcern': {" " 'level': {'$exists': false}," " 'afterClusterTime': {'$exists': true}" " }" "}"); /* * explicit read concern */ rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); BSON_ASSERT(mongoc_read_concern_append(rc, &test->opts)); test_read_cmd(test); check_success(test); ASSERT_MATCH(last_non_getmore_cmd(test), "{" " 'readConcern': {" " 'level': 'local'," " 'afterClusterTime': {'$exists': true}" " }" "}"); /* * explicit read concern, not causal */ cs_opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(cs_opts, false); mongoc_client_session_destroy(test->cs); test->cs = mongoc_client_start_session(test->client, cs_opts, &error); ASSERT_OR_PRINT(test->cs, error); bson_reinit(&test->opts); ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); BSON_ASSERT(mongoc_read_concern_append(rc, &test->opts)); /* set new session's operationTime */ test_read_cmd(test); check_success(test); ASSERT_CMPUINT32(test->cs->operation_timestamp, >, (uint32_t)0); /* afterClusterTime is not sent */ test_read_cmd(test); check_success(test); ASSERT_MATCH(last_non_getmore_cmd(test), "{" " 'readConcern': {" " 'level': 'local'," " 'afterClusterTime': {'$exists': false}" " }" "}"); /* * no read concern, not causal */ bson_reinit(&test->opts); ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); /* afterClusterTime is not sent */ test_read_cmd(test); check_success(test); ASSERT_MATCH(last_non_getmore_cmd(test), "{'readConcern': {'$exists': false}}"); mongoc_session_opts_destroy(cs_opts); mongoc_read_concern_destroy(rc); session_test_destroy(test); } static void _test_unacknowledged(session_test_fn_t test_fn, bool explicit_cs, bool inherit_wc) { session_test_t *test; mongoc_write_concern_t *wc; bson_error_t error; /* The following tests assert that unacknowledged command does not set the * operationTime. Additionally, the "started" APM callback asserts that the * command does not include an lsid. */ test = session_test_new(CORRECT_CLIENT, CAUSAL); test->expect_explicit_lsid = explicit_cs; test->acknowledged = false; wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); if (explicit_cs) { ASSERT_OR_PRINT(mongoc_client_session_append(test->cs, &test->opts, &error), error); } if (inherit_wc) { mongoc_client_set_write_concern(test->client, wc); mongoc_database_set_write_concern(test->db, wc); mongoc_collection_set_write_concern(test->collection, wc); } else { BSON_ASSERT(mongoc_write_concern_append_bad(wc, &test->opts)); } test_fn(test); check_success(test); if (test->succeeded) { ASSERT_MATCH(last_non_getmore_cmd(test), "{'writeConcern': {'w': 0}}"); ASSERT_CMPUINT32(test->cs->operation_timestamp, ==, (uint32_t)0); } mongoc_write_concern_destroy(wc); session_test_destroy(test); } static void test_unacknowledged_explicit_cs_inherit_wc(void *ctx) { _test_unacknowledged(((session_test_helper_t *)ctx)->test_fn, true, true); } static void test_unacknowledged_implicit_cs_explicit_wc(void *ctx) { _test_unacknowledged(((session_test_helper_t *)ctx)->test_fn, true, false); } static void test_unacknowledged_implicit_cs_inherit_wc(void *ctx) { _test_unacknowledged(((session_test_helper_t *)ctx)->test_fn, false, true); } static void test_unacknowledged_explicit_cs_explicit_wc(void *ctx) { _test_unacknowledged(((session_test_helper_t *)ctx)->test_fn, false, false); } #define add_session_test(_suite, _name, _test_fn, _allow_read_concern) \ if (1) { \ session_test_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (session_test_helper_t){.test_fn = (_test_fn)}; \ TestSuite_AddFull(_suite, \ _name " [lock:live-server]", \ (_allow_read_concern) ? run_session_test : run_session_test_no_rc, \ &bson_free, \ helper, \ test_framework_skip_if_no_cluster_time, \ test_framework_skip_if_no_crypto); \ } else \ ((void)0) #define add_session_test_wc(_suite, _name, _test_fn, _allow_read_concern, ...) \ if (1) { \ session_test_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (session_test_helper_t){.test_fn = (_test_fn)}; \ TestSuite_AddFull(_suite, \ _name " [lock:live-server]", \ (_allow_read_concern) ? run_session_test : run_session_test_no_rc, \ &bson_free, \ helper, \ test_framework_skip_if_no_cluster_time, \ test_framework_skip_if_no_crypto, \ __VA_ARGS__); \ } else \ ((void)0) #define add_unacknowledged_test(_suite, _name, _test_fn, _explicit_cs, _inherit_wc) \ if (1) { \ session_test_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (session_test_helper_t){.test_fn = (_test_fn)}; \ TestSuite_AddFull(_suite, \ _name " [lock:live-server]", \ (_explicit_cs) ? (_inherit_wc ? test_unacknowledged_explicit_cs_inherit_wc \ : test_unacknowledged_implicit_cs_explicit_wc) \ : (_inherit_wc ? test_unacknowledged_implicit_cs_inherit_wc \ : test_unacknowledged_explicit_cs_explicit_wc), \ &bson_free, \ helper, \ test_framework_skip_if_no_cluster_time, \ test_framework_skip_if_no_crypto); \ } else \ ((void)0) static bool _test_run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bson_t reply; mongoc_client_session_t *session = NULL; /* Look up the session to use by name. Really, json_test_operation should * probably handle this. Let's wait until unified test runner is spec'ed. */ if (bson_has_field(operation, "arguments.session")) { session = session_from_name(ctx, bson_lookup_utf8(operation, "arguments.session")); } json_test_operation(ctx, test, operation, ctx->collection, session, &reply); bson_destroy(&reply); return true; } static void test_sessions_spec_cb(void *scenario) { json_test_config_t config = JSON_TEST_CONFIG_INIT; config.run_operation_cb = _test_run_operation; config.scenario = scenario; config.command_started_events_only = true; run_json_general_test(&config); } /* Test that a session is made dirty after a network error, and that it is not * added back to the session pool. */ static void _test_session_dirty_helper(bool retry_succeeds) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_client_session_t *session; bson_t opts; bool ret; bson_error_t error; bson_t *failpoint_cmd; int fail_count; mongoc_uri_t *uri; uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); session = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session, error); coll = mongoc_client_get_collection(client, "test", "test"); bson_init(&opts); ret = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_insert_one(coll, tmp_bson("{}"), &opts, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); BSON_ASSERT(!session->server_session->dirty); if (retry_succeeds) { /* Only fail once, so retried insert succeeds. */ fail_count = 1; } else { /* Fail twice, so retried insert fails as well. */ fail_count = 2; } /* Enable failpoint. */ failpoint_cmd = BCON_NEW("configureFailPoint", "failCommand", "mode", "{", "times", BCON_INT32(fail_count), "}", "data", "{", "failCommands", "[", "insert", "]", "closeConnection", BCON_BOOL(true), "}"); ret = mongoc_client_command_simple(client, "admin", failpoint_cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_insert_one(coll, tmp_bson("{}"), &opts, NULL /* reply */, &error); if (retry_succeeds) { ASSERT_OR_PRINT(ret, error); } else { BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); } /* Regardless of whether the retry succeeded, the session should be marked * dirty */ BSON_ASSERT(session->server_session->dirty); const size_t pooled_session_count_pre = mongoc_server_session_pool_size(client->topology->session_pool); mongoc_client_session_destroy(session); const size_t pooled_session_count_post = mongoc_server_session_pool_size(client->topology->session_pool); /* Check that destroying in the session did not add it back to the pool. */ ASSERT_CMPSIZE_T(pooled_session_count_pre, ==, pooled_session_count_post); mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': 'off'}"), NULL /* read prefs */, NULL /* reply */, &error); bson_destroy(&opts); bson_destroy(failpoint_cmd); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void test_session_dirty(void *unused) { BSON_UNUSED(unused); _test_session_dirty_helper(true /* retry succceeds */); _test_session_dirty_helper(false /* retry succceeds */); } void test_sessions_snapshot_prose_test_1(void *ctx) { mongoc_client_t *client = NULL; mongoc_session_opt_t *session_opts = NULL; bson_error_t error; mongoc_client_session_t *r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); BSON_ASSERT(client); session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_causal_consistency(session_opts, true); mongoc_session_opts_set_snapshot(session_opts, true); /* assert that starting session with causal consistency and snapshot enabled * results in an error. */ r = mongoc_client_start_session(client, session_opts, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_SESSION_FAILURE, "Only one of causal consistency and snapshot can be enabled."); mongoc_session_opts_destroy(session_opts); mongoc_client_destroy(client); } void test_session_install(TestSuite *suite) { TestSuite_Add(suite, "/Session/opts/clone", test_session_opts_clone); TestSuite_Add( suite, "/Session/opts/causal_consistency_and_snapshot", test_session_opts_causal_consistency_and_snapshot); TestSuite_AddFull(suite, "/Session/no_crypto [lock:live-server]", test_session_no_crypto, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_no_sessions, test_framework_skip_if_crypto); TestSuite_AddFull(suite, "/Session/lifo/single [lock:live-server]", test_session_pool_lifo_single, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/lifo/pooled [lock:live-server]", test_session_pool_lifo_pooled, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/timeout/single [lock:live-server][timeout:30]", test_session_pool_timeout_single, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/timeout/pooled [lock:live-server][timeout:30]", test_session_pool_timeout_pooled, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/reap/single [lock:live-server][timeout:30]", test_session_pool_reap_single, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/reap/pooled [lock:live-server][timeout:30]", test_session_pool_reap_pooled, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/id_bad [lock:live-server]", test_session_id_bad, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/supported/single [lock:live-server]", test_session_supported_single, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/supported/pooled [lock:live-server]", test_session_supported_pooled, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/Session/end/mock/single", test_mock_end_sessions_single, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/Session/end/mock/pooled", test_mock_end_sessions_pooled, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest(suite, "/Session/end/mock/disconnected [timeout:20]", test_mock_end_sessions_server_disconnect, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/end/single [lock:live-server]", test_end_sessions_single, NULL, NULL, test_framework_skip_if_no_crypto, TestSuite_CheckLive); TestSuite_AddFull(suite, "/Session/end/pooled [lock:live-server]", test_end_sessions_pooled, NULL, NULL, test_framework_skip_if_no_crypto, TestSuite_CheckLive); TestSuite_AddFull(suite, "/Session/end/many/single [lock:live-server][timeout:30]", test_end_sessions_many_single, NULL, NULL, test_framework_skip_if_no_crypto, TestSuite_CheckLive, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/end/many/pooled [lock:live-server][timeout:30]", test_end_sessions_many_pooled, NULL, NULL, test_framework_skip_if_no_crypto, TestSuite_CheckLive, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Session/advance_cluster_time [lock:live-server]", test_session_advance_cluster_time, NULL, NULL, test_framework_skip_if_no_crypto, test_framework_skip_if_no_sessions); TestSuite_AddFull(suite, "/Session/advance_operation_time [lock:live-server]", test_session_advance_operation_time, NULL, NULL, test_framework_skip_if_no_crypto, test_framework_skip_if_no_sessions); /* "true" is for tests that expect readConcern: afterClusterTime for causally * consistent sessions, "false" is for tests that prohibit readConcern */ add_session_test(suite, "/Session/cmd", test_cmd, false); add_session_test(suite, "/Session/read_cmd", test_read_cmd, true); add_session_test(suite, "/Session/write_cmd", test_write_cmd, false); add_session_test(suite, "/Session/read_write_cmd", test_read_write_cmd, true); add_session_test(suite, "/Session/db_cmd", test_db_cmd, false); add_session_test(suite, "/Session/cursor", test_cursor, true); add_session_test(suite, "/Session/drop", test_drop, false); add_session_test(suite, "/Session/drop_index", test_drop_index, false); add_session_test(suite, "/Session/create_index", test_create_index, false); add_session_test(suite, "/Session/replace_one", test_replace_one, false); add_session_test(suite, "/Session/update_one", test_update_one, false); add_session_test(suite, "/Session/update_many", test_update_many, false); add_session_test(suite, "/Session/insert_one", test_insert_one, false); add_session_test(suite, "/Session/insert_many", test_insert_many, false); add_session_test(suite, "/Session/delete_one", test_delete_one, false); add_session_test(suite, "/Session/delete_many", test_delete_many, false); add_session_test(suite, "/Session/rename", test_rename, false); add_session_test(suite, "/Session/fam", test_fam, true); add_session_test(suite, "/Session/db_drop", test_db_drop, false); add_session_test(suite, "/Session/gridfs_find", test_gridfs_find, true); add_session_test(suite, "/Session/gridfs_find_one", test_gridfs_find_one, true); add_session_test_wc(suite, "/Session/watch", test_watch, true, test_framework_skip_if_not_replset); add_session_test(suite, "/Session/aggregate", test_aggregate, true); add_session_test(suite, "/Session/create", test_create, false); add_session_test(suite, "/Session/database_names", test_database_names, true); add_session_test(suite, "/Session/find_databases", test_find_databases, true); add_session_test(suite, "/Session/find_collections", test_find_collections, true); add_session_test(suite, "/Session/collection_names", test_collection_names, true); add_session_test(suite, "/Session/bulk", test_bulk, false); add_session_test(suite, "/Session/find_indexes", test_find_indexes, true); { session_test_helper_t *const helper = bson_malloc(sizeof(*helper)); *helper = (session_test_helper_t){.test_fn = test_bulk_set_session}; TestSuite_AddFull(suite, "/Session/bulk_set_session [lock:live-server]", run_session_test_bulk_operation, &bson_free, helper, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); } { session_test_helper_t *const helper = bson_malloc(sizeof(*helper)); *helper = (session_test_helper_t){.test_fn = test_bulk_set_client}; TestSuite_AddFull(suite, "/Session/bulk_set_client [lock:live-server]", run_session_test_bulk_operation, &bson_free, helper, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); } TestSuite_AddFull(suite, "/Session/cursor_implicit_session [lock:live-server]", test_cursor_implicit_session, NULL, NULL, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/change_stream_implicit_session [lock:live-server]", test_change_stream_implicit_session, NULL, NULL, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/cmd_error [lock:live-server]", test_cmd_error, NULL, NULL, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/Session/read_concern [lock:live-server]", test_read_concern, NULL, NULL, test_framework_skip_if_no_cluster_time, test_framework_skip_if_no_crypto); add_unacknowledged_test( suite, "/Session/unacknowledged/insert_one/explicit_cs/inherit_wc", test_insert_one, true, true); add_unacknowledged_test( suite, "/Session/unacknowledged/insert_one/explicit_cs/explicit_wc", test_insert_one, true, false); add_unacknowledged_test( suite, "/Session/unacknowledged/insert_one/implicit_cs/inherit_wc", test_insert_one, false, true); add_unacknowledged_test( suite, "/Session/unacknowledged/insert_one/implicit_cs/explicit_wc", test_insert_one, false, false); add_unacknowledged_test(suite, "/Session/unacknowledged/bulk/explicit_cs/inherit_wc", test_bulk, true, true); add_unacknowledged_test(suite, "/Session/unacknowledged/bulk/explicit_cs/explicit_wc", test_bulk, true, false); add_unacknowledged_test(suite, "/Session/unacknowledged/bulk/implicit_cs/inherit_wc", test_bulk, false, true); add_unacknowledged_test(suite, "/Session/unacknowledged/bulk/implicit_cs/explicit_wc", test_bulk, false, false); /* find_and_modify_with_opts only inherits acknowledged write concerns, so * skip tests that inherit a write concern. Technically, an explicit * unacknowledged write concern doesn't make much sense with findAndModify, * but this is testing the common code path for command execution. */ add_unacknowledged_test( suite, "/Session/unacknowledged/find_and_modify/explicit_cs/explicit_wc", test_fam, true, false); add_unacknowledged_test( suite, "/Session/unacknowledged/find_and_modify/implicit_cs/explicit_wc", test_fam, false, false); /* command_with_opts also does not inherit write concerns, but we still want * to test the common code path for command execution. */ add_unacknowledged_test(suite, "/Session/unacknowledged/db_cmd/explicit_cs/explicit_wc", test_db_cmd, true, false); add_unacknowledged_test(suite, "/Session/unacknowledged/db_cmd/implicit_cs/explicit_wc", test_db_cmd, false, false); add_unacknowledged_test( suite, "/Session/unacknowledged/read_write_cmd/explicit_cs/inherit_wc", test_read_write_cmd, true, true); add_unacknowledged_test( suite, "/Session/unacknowledged/read_write_cmd/explicit_cs/explicit_wc", test_read_write_cmd, true, false); add_unacknowledged_test( suite, "/Session/unacknowledged/read_write_cmd/implicit_cs/inherit_wc", test_read_write_cmd, false, true); add_unacknowledged_test( suite, "/Session/unacknowledged/read_write_cmd/implicit_cs/explicit_wc", test_read_write_cmd, false, false); add_unacknowledged_test( suite, "/Session/unacknowledged/write_cmd/explicit_cs/inherit_wc", test_write_cmd, true, true); add_unacknowledged_test( suite, "/Session/unacknowledged/write_cmd/explicit_cs/explicit_wc", test_write_cmd, true, false); add_unacknowledged_test( suite, "/Session/unacknowledged/write_cmd/implicit_cs/inherit_wc", test_write_cmd, false, true); add_unacknowledged_test( suite, "/Session/unacknowledged/write_cmd/implicit_cs/explicit_wc", test_write_cmd, false, false); install_json_test_suite_with_check( suite, JSON_DIR, "sessions/legacy", test_sessions_spec_cb, test_framework_skip_if_no_sessions); TestSuite_AddFull(suite, "/Session/dirty [lock:live-server]", test_session_dirty, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_sessions, test_framework_skip_if_no_failpoint, /* Tests with retryable writes, requires non-standalone. */ test_framework_skip_if_single); TestSuite_AddFull(suite, "/Session/snapshot/prose_test_1 [lock:live-server]", test_sessions_snapshot_prose_test_1, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-client-side-encryption.c000066400000000000000000012205701511661753600272610ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include /* _mongoc_host_list_from_string_with_err */ #include #include /* MONGOC_SERVER_ERR_NS_NOT_FOUND */ #include #include #include #include #include /* _mongoc_crypt_get_libmongocrypt_version */ #include #include #include static void _before_test(json_test_ctx_t *ctx, const bson_t *test) { mongoc_client_t *client; mongoc_collection_t *keyvault_coll; bson_iter_t iter; bson_error_t error; bool ret; mongoc_write_concern_t *wc; bson_t insert_opts; BSON_UNUSED(test); /* Insert data into the key vault. */ client = test_framework_new_default_client(); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); bson_init(&insert_opts); mongoc_write_concern_append(wc, &insert_opts); if (bson_iter_init_find(&iter, ctx->config->scenario, "key_vault_data")) { keyvault_coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); /* Drop and recreate, inserting data. */ ret = mongoc_collection_drop(keyvault_coll, &error); if (!ret) { /* Ignore "namespace does not exist" error. */ ASSERT_OR_PRINT(error.code == 26, error); } bson_iter_recurse(&iter, &iter); while (bson_iter_next(&iter)) { bson_t doc; bson_iter_bson(&iter, &doc); ret = mongoc_collection_insert_one(keyvault_coll, &doc, &insert_opts, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); } mongoc_collection_destroy(keyvault_coll); } bson_destroy(&insert_opts); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } static bool _run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bson_t reply; bool res; res = json_test_operation(ctx, test, operation, ctx->collection, NULL, &reply); bson_destroy(&reply); return res; } static void test_client_side_encryption_cb(void *scenario) { json_test_config_t config = JSON_TEST_CONFIG_INIT; config.before_test_cb = _before_test; config.run_operation_cb = _run_operation; config.scenario = scenario; config.command_started_events_only = true; config.command_monitoring_allow_subset = false; run_json_general_test(&config); } /* This is the hex form of the base64 encoded value: * Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk * From the client side encryption spec. */ #define LOCAL_MASTERKEY \ "\x32\x78\x34\x34\x2b\x78\x64\x75\x54\x61\x42\x42\x6b\x59\x31\x36\x45\x72" \ "\x35\x44\x75\x41\x44\x61\x67\x68\x76\x53\x34\x76\x77\x64\x6b\x67\x38\x74" \ "\x70\x50\x70\x33\x74\x7a\x36\x67\x56\x30\x31\x41\x31\x43\x77\x62\x44\x39" \ "\x69\x74\x51\x32\x48\x46\x44\x67\x50\x57\x4f\x70\x38\x65\x4d\x61\x43\x31" \ "\x4f\x69\x37\x36\x36\x4a\x7a\x58\x5a\x42\x64\x42\x64\x62\x64\x4d\x75\x72" \ "\x64\x6f\x6e\x4a\x31\x64" static void _set_extra_bypass(bson_t *extra) { if (test_framework_getenv_bool("MONGOC_TEST_MONGOCRYPTD_BYPASS_SPAWN")) { BSON_APPEND_BOOL(extra, "mongocryptdBypassSpawn", true); } } static void _set_extra_crypt_shared(bson_t *extra) { char *const path = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); if (path) { BSON_APPEND_UTF8(extra, "cryptSharedLibPath", path); bson_free(path); } } /* Convenience helper to check if spawning mongocryptd should be bypassed */ static void _check_bypass(mongoc_auto_encryption_opts_t *opts) { bson_t extra = BSON_INITIALIZER; _set_extra_bypass(&extra); mongoc_auto_encryption_opts_set_extra(opts, &extra); bson_destroy(&extra); } static bson_t * _make_aws_kms_provider(bson_t *kms_providers) { char *aws_secret_access_key; char *aws_access_key_id; aws_secret_access_key = test_framework_getenv_required("MONGOC_TEST_AWS_SECRET_ACCESS_KEY"); aws_access_key_id = test_framework_getenv_required("MONGOC_TEST_AWS_ACCESS_KEY_ID"); if (!kms_providers) { kms_providers = bson_new(); } bson_concat( kms_providers, tmp_bson("{ 'aws': { 'secretAccessKey': '%s', 'accessKeyId': '%s' }}", aws_secret_access_key, aws_access_key_id)); bson_free(aws_secret_access_key); bson_free(aws_access_key_id); return kms_providers; } static bson_t * _make_azure_kms_provider(bson_t *kms_providers) { char *azure_tenant_id; char *azure_client_id; char *azure_client_secret; azure_tenant_id = test_framework_getenv_required("MONGOC_TEST_AZURE_TENANT_ID"); azure_client_id = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_ID"); azure_client_secret = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_SECRET"); if (!kms_providers) { kms_providers = bson_new(); } bson_concat(kms_providers, tmp_bson("{ 'azure': { 'tenantId': '%s', 'clientId': '%s', " "'clientSecret': '%s' }}", azure_tenant_id, azure_client_id, azure_client_secret)); bson_free(azure_tenant_id); bson_free(azure_client_id); bson_free(azure_client_secret); return kms_providers; } static bson_t * _make_gcp_kms_provider(bson_t *kms_providers) { char *gcp_email; char *gcp_privatekey; gcp_email = test_framework_getenv_required("MONGOC_TEST_GCP_EMAIL"); gcp_privatekey = test_framework_getenv_required("MONGOC_TEST_GCP_PRIVATEKEY"); if (!gcp_email || !gcp_privatekey) { test_error("Set MONGOC_TEST_GCP_EMAIL and MONGOC_TEST_GCP_PRIVATEKEY to " "enable CSFLE tests."); } if (!kms_providers) { kms_providers = bson_new(); } bson_concat(kms_providers, tmp_bson("{ 'gcp': { 'email': '%s', 'privateKey': '%s' }}", gcp_email, gcp_privatekey)); bson_free(gcp_email); bson_free(gcp_privatekey); return kms_providers; } static bson_t * _make_local_kms_provider(bson_t *kms_providers) { bson_t *local = BCON_NEW("local", "{", "key", BCON_BIN(0, (uint8_t *)LOCAL_MASTERKEY, 96), "}"); if (!kms_providers) { kms_providers = bson_new(); } bson_concat(kms_providers, local); bson_destroy(local); return kms_providers; } static bson_t * _make_kmip_kms_provider(bson_t *kms_providers) { if (!kms_providers) { kms_providers = bson_new(); } bson_concat(kms_providers, tmp_bson("{ 'kmip': { 'endpoint': 'localhost:5698' } }")); return kms_providers; } /* Convenience helper for creating KMS providers doc */ static bson_t * _make_kms_providers(bool with_aws, bool with_local) { bson_t *kms_providers = bson_new(); if (with_aws) { _make_aws_kms_provider(kms_providers); _make_azure_kms_provider(kms_providers); _make_gcp_kms_provider(kms_providers); _make_kmip_kms_provider(kms_providers); } if (with_local) { _make_local_kms_provider(kms_providers); } return kms_providers; } static bson_t * _make_tls_opts(void) { bson_t *tls_opts = bson_new(); char *kmip_tls_ca_file; char *kmip_tls_certificate_key_file; kmip_tls_ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); kmip_tls_certificate_key_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); bson_concat(tls_opts, tmp_bson("{ 'kmip': { 'tlsCAFile': '%s', 'tlsCertificateKeyFile': '%s' } }", kmip_tls_ca_file, kmip_tls_certificate_key_file)); bson_free(kmip_tls_ca_file); bson_free(kmip_tls_certificate_key_file); return tls_opts; } static bson_t * _make_kms_masterkey(char const *provider) { if (strcmp(provider, "aws") == 0) { return BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0"); } if (strcmp(provider, "azure") == 0) { return BCON_NEW("keyVaultEndpoint", "key-vault-csfle.vault.azure.net", "keyName", "key-name-csfle"); } if (strcmp(provider, "gcp") == 0) { return BCON_NEW("projectId", "devprod-drivers", "location", "global", "keyRing", "key-ring-csfle", "keyName", "key-name-csfle"); } if (strcmp(provider, "kmip") == 0) { return bson_new(); } if (strcmp(provider, "local") == 0) { return bson_new(); } return NULL; } typedef struct { int num_inserts; int num_bulk_writes; } limits_apm_ctx_t; static void _command_started(const mongoc_apm_command_started_t *event) { limits_apm_ctx_t *ctx; ctx = (limits_apm_ctx_t *)mongoc_apm_command_started_get_context(event); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); if (0 == strcmp("insert", cmd_name)) { ctx->num_inserts++; } if (0 == strcmp("bulkWrite", cmd_name)) { ctx->num_bulk_writes++; } } /* Prose Test 4: BSON Size Limits and Batch Splitting */ static void test_bson_size_limits_and_batch_splitting(bool with_qe) { /* Expect an insert of two documents over 2MiB to split into two inserts but * still succeed. */ mongoc_client_t *client; mongoc_auto_encryption_opts_t *opts; mongoc_uri_t *uri; mongoc_collection_t *coll; bson_error_t error; bson_t *corpus_schema; bson_t *datakey; bson_t *cmd; bson_t *kms_providers; bson_t *docs[2]; char *as; limits_apm_ctx_t ctx = {0}; mongoc_apm_callbacks_t *callbacks; /* Values from the spec to test boundaries. */ const int size_16mib = 16777216; const int size_2mib = 2097152; const int exceeds_2mib_after_encryption = size_2mib - 2000; const int exceeds_16mib_after_encryption = size_16mib - 2000; /* Do the test setup. */ /* Drop and create db.coll configured with limits-schema.json */ uri = test_framework_get_uri(); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "db", "coll"); (void)mongoc_collection_drop(coll, NULL); corpus_schema = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-schema.json"); cmd = BCON_NEW("create", "coll", "validator", "{", "$jsonSchema", BCON_DOCUMENT(corpus_schema), "}"); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "db", cmd, NULL /* read prefs */, NULL /* reply */, &error), error); mongoc_collection_destroy(coll); /* Drop and create the key vault collection, keyvault.datakeys. */ { mongoc_write_concern_t *wc; coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); (void)mongoc_collection_drop(coll, NULL); datakey = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-key.json"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, datakey, NULL /* opts */, NULL /* reply */, &error), error); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); } mongoc_client_destroy(client); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); kms_providers = _make_kms_providers(false /* aws */, true /* local */); opts = mongoc_auto_encryption_opts_new(); _check_bypass(opts); mongoc_auto_encryption_opts_set_keyvault_namespace(opts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_kms_providers(opts, kms_providers); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(client, opts, &error), error); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, _command_started); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); coll = mongoc_client_get_collection(client, "db", "coll"); /* End of setup */ /* Insert { "_id": "over_2mib_under_16mib", "unencrypted": } */ docs[0] = BCON_NEW("_id", "over_2mib_under_16mib"); as = bson_malloc(size_16mib); memset(as, 'a', size_16mib); bson_append_utf8(docs[0], "unencrypted", -1, as, 2097152); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, docs[0], NULL /* opts */, NULL /* reply */, &error), error); bson_destroy(docs[0]); /* Insert the document `limits/limits-doc.json <../limits/limits-doc.json>`_ * concatenated with ``{ "_id": "encryption_exceeds_2mib", "unencrypted": < * the string "a" repeated (2097152 - 2000) times > }`` */ docs[0] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-doc.json"); bson_append_utf8(docs[0], "_id", -1, "encryption_exceeds_2mib", -1); bson_append_utf8(docs[0], "unencrypted", -1, as, exceeds_2mib_after_encryption); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, docs[0], NULL /* opts */, NULL /* reply */, &error), error); bson_destroy(docs[0]); /* Insert two documents that each exceed 2MiB but no encryption occurs. * Expect the bulk write to succeed and run as two separate inserts. */ docs[0] = BCON_NEW("_id", "over_2mib_1"); bson_append_utf8(docs[0], "unencrypted", -1, as, size_2mib); docs[1] = BCON_NEW("_id", "over_2mib_2"); bson_append_utf8(docs[1], "unencrypted", -1, as, size_2mib); ctx.num_inserts = 0; ASSERT_OR_PRINT( mongoc_collection_insert_many(coll, (const bson_t **)docs, 2, NULL /* opts */, NULL /* reply */, &error), error); ASSERT_CMPINT(ctx.num_inserts, ==, 2); bson_destroy(docs[0]); bson_destroy(docs[1]); /* Insert two documents that each exceed 2MiB after encryption occurs. Expect * the bulk write to succeed and run as two separate inserts. */ docs[0] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-doc.json"); bson_append_utf8(docs[0], "_id", -1, "encryption_exceeds_2mib_1", -1); bson_append_utf8(docs[0], "unencrypted", -1, as, exceeds_2mib_after_encryption); docs[1] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-doc.json"); bson_append_utf8(docs[1], "_id", -1, "encryption_exceeds_2mib_2", -1); bson_append_utf8(docs[1], "unencrypted", -1, as, exceeds_2mib_after_encryption); ctx.num_inserts = 0; ASSERT_OR_PRINT( mongoc_collection_insert_many(coll, (const bson_t **)docs, 2, NULL /* opts */, NULL /* reply */, &error), error); ASSERT_CMPINT(ctx.num_inserts, ==, 2); bson_destroy(docs[0]); bson_destroy(docs[1]); /* Check that inserting close to, but not exceeding, 16MiB, passes */ docs[0] = bson_new(); bson_append_utf8(docs[0], "_id", -1, "under_16mib", -1); bson_append_utf8(docs[0], "unencrypted", -1, as, exceeds_16mib_after_encryption); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, docs[0], NULL /* opts */, NULL /* reply */, &error), error); bson_destroy(docs[0]); /* but.. exceeding 16 MiB fails */ docs[0] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-doc.json"); bson_append_utf8(docs[0], "_id", -1, "under_16mib", -1); bson_append_utf8(docs[0], "unencrypted", -1, as, exceeds_16mib_after_encryption); BSON_ASSERT(!mongoc_collection_insert_one(coll, docs[0], NULL /* opts */, NULL /* reply */, &error)); { const uint32_t too_large = 10334; // SERVER-104405 changed the expected error code from 2 to 10334: const uint32_t too_large_old = 2; ASSERT_CMPUINT32(error.domain, ==, (uint32_t)MONGOC_ERROR_SERVER); if (error.code != too_large && error.code != too_large_old) { test_error( "Unexpected error: %" PRIu32 ". Expected %" PRIu32 " or %" PRIu32, error.code, too_large, too_large_old); } ASSERT_CONTAINS(error.message, "too large"); } bson_destroy(docs[0]); if (with_qe) { mongoc_bulkwriteopts_t *bw_opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(bw_opts, true); bson_t *corpus_encryptedFields = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-encryptedFields.json"); bson_t *coll_opts = BCON_NEW("encryptedFields", BCON_DOCUMENT(corpus_encryptedFields)); mongoc_database_t *db = mongoc_client_get_database(client, "db"); (void)mongoc_collection_drop(coll, NULL); // Create a newly named collection to avoid cached previous JSON Schema. mongoc_collection_t *coll2 = mongoc_database_create_collection(db, "coll2", coll_opts, &error); ASSERT_OR_PRINT(coll2, error); mongoc_collection_destroy(coll2); /* Insert two documents that each exceed 2MiB but no encryption occurs. * Expect two separate bulkWrite commands. */ docs[0] = BCON_NEW("_id", "over_2mib_3"); bson_append_utf8(docs[0], "unencrypted", -1, as, size_2mib - 1500); docs[1] = BCON_NEW("_id", "over_2mib_4"); bson_append_utf8(docs[1], "unencrypted", -1, as, size_2mib - 1500); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll2", docs[0], NULL, &error), error); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll2", docs[1], NULL, &error), error); ctx.num_bulk_writes = 0; mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, bw_opts); ASSERT_NO_BULKWRITEEXCEPTION(bwr); ASSERT_CMPINT(ctx.num_bulk_writes, ==, 2); bson_destroy(docs[0]); bson_destroy(docs[1]); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); /* Insert two documents that each exceed 2MiB after encryption occurs. Expect * the bulk write to succeed and run as two separate bulkWrite commands. */ docs[0] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-qe-doc.json"); bson_append_utf8(docs[0], "_id", -1, "encryption_exceeds_2mib_3", -1); bson_append_utf8(docs[0], "foo", -1, as, exceeds_2mib_after_encryption - 1500); docs[1] = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-qe-doc.json"); bson_append_utf8(docs[1], "_id", -1, "encryption_exceeds_2mib_4", -1); bson_append_utf8(docs[1], "foo", -1, as, exceeds_2mib_after_encryption - 1500); bw = mongoc_client_bulkwrite_new(client); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll2", docs[0], NULL, &error), error); ASSERT_OR_PRINT(mongoc_bulkwrite_append_insertone(bw, "db.coll2", docs[1], NULL, &error), error); ctx.num_bulk_writes = 0; bwr = mongoc_bulkwrite_execute(bw, bw_opts); ASSERT_NO_BULKWRITEEXCEPTION(bwr); ASSERT_CMPINT(ctx.num_bulk_writes, ==, 2); bson_destroy(docs[0]); bson_destroy(docs[1]); mongoc_bulkwrite_destroy(bw); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteopts_destroy(bw_opts); bson_destroy(corpus_encryptedFields); bson_destroy(coll_opts); mongoc_database_destroy(db); } bson_free(as); bson_destroy(kms_providers); bson_destroy(corpus_schema); bson_destroy(cmd); bson_destroy(datakey); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mongoc_apm_callbacks_destroy(callbacks); mongoc_auto_encryption_opts_destroy(opts); } static void test_bson_size_limits_and_batch_splitting_no_qe(void *unused) { BSON_UNUSED(unused); test_bson_size_limits_and_batch_splitting(false); } static void test_bson_size_limits_and_batch_splitting_qe(void *unused) { BSON_UNUSED(unused); test_bson_size_limits_and_batch_splitting(true); } typedef struct { bson_t *last_cmd; } _datakey_and_double_encryption_ctx_t; static void _datakey_and_double_encryption_command_started(const mongoc_apm_command_started_t *event) { _datakey_and_double_encryption_ctx_t *ctx; ctx = (_datakey_and_double_encryption_ctx_t *)mongoc_apm_command_started_get_context(event); bson_destroy(ctx->last_cmd); ctx->last_cmd = bson_copy(mongoc_apm_command_started_get_command(event)); } static void test_datakey_and_double_encryption_creating_and_using(mongoc_client_encryption_t *client_encryption, mongoc_client_t *client, mongoc_client_t *client_encrypted, const char *kms_provider, _datakey_and_double_encryption_ctx_t *test_ctx) { bson_value_t keyid; bson_error_t error; bool ret; mongoc_client_encryption_datakey_opts_t *opts; mongoc_client_encryption_encrypt_opts_t *encrypt_opts; char *altname; mongoc_collection_t *coll; mongoc_cursor_t *cursor; bson_t filter; const bson_t *doc; bson_value_t to_encrypt; bson_value_t encrypted; bson_value_t encrypted_via_altname; bson_t to_insert = BSON_INITIALIZER; char *hello; opts = mongoc_client_encryption_datakey_opts_new(); if (0 == strcmp(kms_provider, "aws")) { mongoc_client_encryption_datakey_opts_set_masterkey(opts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0' }")); } else if (0 == strcmp(kms_provider, "azure")) { mongoc_client_encryption_datakey_opts_set_masterkey( opts, tmp_bson("{'keyVaultEndpoint': 'key-vault-csfle.vault.azure.net', " "'keyName': 'key-name-csfle'}")); } else if (0 == strcmp(kms_provider, "gcp")) { mongoc_client_encryption_datakey_opts_set_masterkey(opts, tmp_bson("{'projectId': 'devprod-drivers','location': " "'global','keyRing': 'key-ring-csfle','keyName': " "'key-name-csfle'}")); } else if (0 == strcmp(kms_provider, "kmip")) { mongoc_client_encryption_datakey_opts_set_masterkey(opts, tmp_bson("{}")); } altname = bson_strdup_printf("%s_altname", kms_provider); mongoc_client_encryption_datakey_opts_set_keyaltnames(opts, &altname, 1); ret = mongoc_client_encryption_create_datakey(client_encryption, kms_provider, opts, &keyid, &error); ASSERT_OR_PRINT(ret, error); /* Expect a BSON binary with subtype 4 to be returned */ BSON_ASSERT(keyid.value_type == BSON_TYPE_BINARY); BSON_ASSERT(keyid.value.v_binary.subtype == BSON_SUBTYPE_UUID); /* Check that client captured a command_started event for the insert command * containing a majority writeConcern. */ assert_match_bson( test_ctx->last_cmd, tmp_bson("{'insert': 'datakeys', 'writeConcern': { 'w': 'majority' } }"), false); /* Use client to run a find on keyvault.datakeys */ coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); bson_init(&filter); BSON_APPEND_VALUE(&filter, "_id", &keyid); cursor = mongoc_collection_find_with_opts(coll, &filter, NULL /* opts */, NULL /* read prefs */); mongoc_collection_destroy(coll); /* Expect that exactly one document is returned with the "masterKey.provider" * equal to */ BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(0 == strcmp(kms_provider, bson_lookup_utf8(doc, "masterKey.provider"))); BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); /* Call client_encryption.encrypt() with the value "hello " */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &keyid); hello = bson_strdup_printf("hello %s", kms_provider); { to_encrypt.value_type = BSON_TYPE_UTF8; to_encrypt.value.v_utf8.str = bson_strdup(hello); const size_t len = strlen(to_encrypt.value.v_utf8.str); ASSERT(mlib_in_range(uint32_t, len)); to_encrypt.value.v_utf8.len = (uint32_t)len; } ret = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); /* Expect the return value to be a BSON binary subtype 6 */ BSON_ASSERT(encrypted.value_type == BSON_TYPE_BINARY); BSON_ASSERT(encrypted.value.v_binary.subtype == BSON_SUBTYPE_ENCRYPTED); /* Use client_encrypted to insert { _id: "", "value": * } into db.coll */ coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); BSON_APPEND_UTF8(&to_insert, "_id", kms_provider); BSON_APPEND_VALUE(&to_insert, "value", &encrypted); ret = mongoc_collection_insert_one(coll, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Use client_encrypted to run a find querying with _id of and * expect value to be "hello ". */ cursor = mongoc_collection_find_with_opts( coll, tmp_bson("{ '_id': '%s' }", kms_provider), NULL /* opts */, NULL /* read prefs */); BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(0 == strcmp(hello, bson_lookup_utf8(doc, "value"))); BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); /* Call client_encryption.encrypt() with the value "hello ", * the algorithm AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic, and the * key_alt_name of _altname. */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); mongoc_client_encryption_encrypt_opts_set_keyaltname(encrypt_opts, altname); ret = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted_via_altname, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); /* Expect the return value to be a BSON binary subtype 6. Expect the value to * exactly match the value of encrypted. */ BSON_ASSERT(encrypted_via_altname.value_type == BSON_TYPE_BINARY); BSON_ASSERT(encrypted_via_altname.value.v_binary.subtype == BSON_SUBTYPE_ENCRYPTED); BSON_ASSERT(encrypted_via_altname.value.v_binary.data_len == encrypted.value.v_binary.data_len); BSON_ASSERT(0 == memcmp(encrypted_via_altname.value.v_binary.data, encrypted.value.v_binary.data, encrypted.value.v_binary.data_len)); bson_value_destroy(&encrypted); bson_value_destroy(&encrypted_via_altname); bson_free(hello); bson_destroy(&to_insert); bson_value_destroy(&to_encrypt); bson_value_destroy(&keyid); bson_free(altname); bson_destroy(&filter); mongoc_client_encryption_datakey_opts_destroy(opts); } /* Prose Test 1: Custom Key Material Test */ static void test_create_datakey_with_custom_key_material(void *unused) { mongoc_client_t *client = NULL; mongoc_client_encryption_t *client_encryption = NULL; bson_error_t error; bson_t datakey = BSON_INITIALIZER; BSON_UNUSED(unused); /* Create a MongoClient object (referred to as client). */ client = test_framework_new_default_client(); /* Using client, drop the collection keyvault.datakeys. */ { mongoc_collection_t *const datakeys = mongoc_client_get_collection(client, "keyvault", "datakeys"); (void)mongoc_collection_drop(datakeys, NULL); mongoc_collection_destroy(datakeys); } /* Create a ClientEncryption object (referred to as client_encryption) with * client set as the keyVaultClient. */ { mongoc_client_encryption_opts_t *const client_encryption_opts = mongoc_client_encryption_opts_new(); bson_t *const kms_providers = _make_kms_providers(true /* aws */, true /* local */); bson_t *const tls_opts = _make_tls_opts(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_destroy(kms_providers); bson_destroy(tls_opts); } /* Using client_encryption, create a data key with a local KMS provider and * the following custom key material: */ { const char key_material[] = "xPTAjBRG5JiPm+d3fj6XLi2q5DMXUS/" "f1f+SMAlhhwkhDRL0kr8r9GDLIGTAGlvC+HVjSIgdL+" "RKwZCvpXSyxTICWSXTUYsWYPyu3IoHbuBZdmw2faM3WhcRIgbMReU5"; uint8_t data[96]; mongoc_client_encryption_datakey_opts_t *datakey_opts = mongoc_client_encryption_datakey_opts_new(); bson_value_t keyid; BSON_ASSERT(mcommon_b64_pton(key_material, data, sizeof(key_material)) == 96); mongoc_client_encryption_datakey_opts_set_keymaterial(datakey_opts, data, sizeof(data)); ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(client_encryption, "local", datakey_opts, &keyid, &error), error); ASSERT(keyid.value_type == BSON_TYPE_BINARY); ASSERT(keyid.value.v_binary.subtype == BSON_SUBTYPE_UUID); ASSERT(keyid.value.v_binary.data_len != 0); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); bson_value_destroy(&keyid); } /* Find the resulting key document in keyvault.datakeys, save a copy of the * key document, then remove the key document from the collection. */ { mongoc_collection_t *const datakeys = mongoc_client_get_collection(client, "keyvault", "datakeys"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(datakeys, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); const bson_t *bson; ASSERT(mongoc_cursor_next(cursor, &bson)); bson_copy_to(bson, &datakey); mongoc_cursor_destroy(cursor); (void)mongoc_collection_drop(datakeys, &error); mongoc_collection_destroy(datakeys); } /* Replace the _id field in the copied key document with a UUID with base64 * value AAAAAAAAAAAAAAAAAAAAAA== (16 bytes all equal to 0x00) and insert the * modified key document into keyvault.datakeys with majority write concern. */ { mongoc_collection_t *const datakeys = mongoc_client_get_collection(client, "keyvault", "datakeys"); bson_t modified_datakey = BSON_INITIALIZER; uint8_t bytes[16] = {0}; mongoc_write_concern_t *const wc = mongoc_write_concern_new(); bson_t opts = BSON_INITIALIZER; bson_copy_to_excluding_noinit(&datakey, &modified_datakey, "_id", NULL); BSON_ASSERT(BSON_APPEND_BINARY(&modified_datakey, "_id", BSON_SUBTYPE_UUID, bytes, sizeof(bytes))); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); ASSERT_OR_PRINT(mongoc_collection_insert_one(datakeys, &modified_datakey, &opts, NULL, &error), error); mongoc_collection_destroy(datakeys); bson_destroy(&modified_datakey); mongoc_write_concern_destroy(wc); bson_destroy(&opts); } /* Using client_encryption, encrypt the string "test" with the modified data * key using the AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic algorithm and * assert the resulting value is equal to the following (given as base64): */ { const char expected[] = "AQAAAAAAAAAAAAAAAAAAAAACz0ZOLuuhEYi807ZXTdhbqhLaS2/" "t9wLifJnnNYwiw79d75QYIZ6M/aYC1h9nCzCjZ7pGUpAuNnkUhnIXM3PjrA=="; mongoc_client_encryption_encrypt_opts_t *const encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); bson_value_t keyid = {0}; bson_value_t to_encrypt = {0}; bson_value_t ciphertext = {0}; keyid.value_type = BSON_TYPE_BINARY; keyid.value.v_binary.subtype = BSON_SUBTYPE_UUID; keyid.value.v_binary.data = bson_malloc0(16); keyid.value.v_binary.data_len = 16u; to_encrypt.value_type = BSON_TYPE_UTF8; to_encrypt.value.v_utf8.str = bson_strdup("test"); to_encrypt.value.v_utf8.len = 4u; mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &keyid); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); ASSERT_OR_PRINT( mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &ciphertext, &error), error); { char actual[256]; /* Need room for null terminator. */ ASSERT(mcommon_b64_ntop( ciphertext.value.v_binary.data, ciphertext.value.v_binary.data_len, actual, sizeof(actual)) < 255); ASSERT_CMPSTR(expected, actual); } bson_value_destroy(&keyid); bson_value_destroy(&ciphertext); bson_value_destroy(&to_encrypt); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); } mongoc_client_destroy(client); mongoc_client_encryption_destroy(client_encryption); bson_destroy(&datakey); } /* Prose Test 2: Data Key and Double Encryption */ static void test_datakey_and_double_encryption(void *unused) { mongoc_client_t *client; mongoc_client_t *client_encrypted; mongoc_client_encryption_t *client_encryption; mongoc_apm_callbacks_t *callbacks; mongoc_collection_t *coll; bson_error_t error; bson_t *kms_providers; bson_t *tls_opts; mongoc_auto_encryption_opts_t *auto_encryption_opts; mongoc_client_encryption_opts_t *client_encryption_opts; bson_t *schema_map; bool ret; _datakey_and_double_encryption_ctx_t test_ctx = {0}; BSON_UNUSED(unused); /* Test setup */ /* Create a MongoClient without encryption enabled (referred to as client). * Enable command monitoring to listen for command_started events. */ client = test_framework_new_default_client(); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, _datakey_and_double_encryption_command_started); mongoc_client_set_apm_callbacks(client, callbacks, &test_ctx); /* Using client, drop the collections keyvault.datakeys and db.coll. */ coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); (void)mongoc_collection_drop(coll, NULL); mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "db", "coll"); (void)mongoc_collection_drop(coll, NULL); mongoc_collection_destroy(coll); /* Create a MongoClient configured with auto encryption (referred to as * client_encrypted) */ auto_encryption_opts = mongoc_auto_encryption_opts_new(); kms_providers = _make_kms_providers(true /* aws */, true /* local */); tls_opts = _make_tls_opts(); _check_bypass(auto_encryption_opts); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_tls_opts(auto_encryption_opts, tls_opts); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); schema_map = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/" "datakey-and-double-encryption-schemamap.json"); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); client_encrypted = test_framework_new_default_client(); ret = mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error); ASSERT_OR_PRINT(ret, error); /* Create a ClientEncryption object (referred to as client_encryption) */ client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); test_datakey_and_double_encryption_creating_and_using( client_encryption, client, client_encrypted, "local", &test_ctx); test_datakey_and_double_encryption_creating_and_using(client_encryption, client, client_encrypted, "aws", &test_ctx); test_datakey_and_double_encryption_creating_and_using( client_encryption, client, client_encrypted, "azure", &test_ctx); test_datakey_and_double_encryption_creating_and_using(client_encryption, client, client_encrypted, "gcp", &test_ctx); test_datakey_and_double_encryption_creating_and_using( client_encryption, client, client_encrypted, "kmip", &test_ctx); bson_destroy(kms_providers); bson_destroy(tls_opts); bson_destroy(schema_map); mongoc_client_encryption_opts_destroy(client_encryption_opts); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); mongoc_client_destroy(client_encrypted); mongoc_client_encryption_destroy(client_encryption); bson_destroy(test_ctx.last_cmd); } static void _test_key_vault(bool with_external_key_vault) { mongoc_client_t *client; mongoc_client_t *client_encrypted; mongoc_client_t *client_external; mongoc_client_encryption_t *client_encryption; mongoc_uri_t *external_uri; mongoc_collection_t *coll; bson_t *datakey; bson_t *kms_providers; bson_error_t error; mongoc_write_concern_t *wc; bson_t *schema; bson_t *schema_map; mongoc_auto_encryption_opts_t *auto_encryption_opts; mongoc_client_encryption_opts_t *client_encryption_opts; mongoc_client_encryption_encrypt_opts_t *encrypt_opts; bool res; const bson_value_t *keyid; bson_value_t value; bson_value_t ciphertext; bson_iter_t iter; external_uri = test_framework_get_uri(); mongoc_uri_set_username(external_uri, "fake-user"); mongoc_uri_set_password(external_uri, "fake-pwd"); client_external = test_framework_client_new_from_uri(external_uri, NULL); test_framework_set_ssl_opts(client_external); /* Using client, drop the collections keyvault.datakeys and db.coll. */ client = test_framework_new_default_client(); coll = mongoc_client_get_collection(client, "db", "coll"); (void)mongoc_collection_drop(coll, NULL); mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); (void)mongoc_collection_drop(coll, NULL); /* Insert the document external-key.json into ``keyvault.datakeys``. */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); datakey = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/external/" "external-key.json"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, datakey, NULL, NULL, &error), error); mongoc_collection_destroy(coll); /* Create a MongoClient configured with auto encryption. */ client_encrypted = test_framework_new_default_client(); mongoc_client_set_error_api(client_encrypted, MONGOC_ERROR_API_VERSION_2); auto_encryption_opts = mongoc_auto_encryption_opts_new(); _check_bypass(auto_encryption_opts); schema = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/external/" "external-schema.json"); schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); if (with_external_key_vault) { mongoc_auto_encryption_opts_set_keyvault_client(auto_encryption_opts, client_external); } ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error), error); /* Create a ClientEncryption object. */ client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); if (with_external_key_vault) { mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client_external); } else { mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); } client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); /* Use client_encrypted to insert the document {"encrypted": "test"} into * db.coll. */ coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); res = mongoc_collection_insert_one(coll, tmp_bson("{'encrypted': 'test'}"), NULL, NULL, &error); if (with_external_key_vault) { BSON_ASSERT(!res); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Authentication failed"); } else { ASSERT_OR_PRINT(res, error); } /* Use client_encryption to explicitly encrypt the string "test" with key ID * ``LOCALAAAAAAAAAAAAAAAAA==`` and deterministic algorithm. */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); BSON_ASSERT(bson_iter_init_find(&iter, datakey, "_id")); keyid = bson_iter_value(&iter); mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, keyid); value.value_type = BSON_TYPE_UTF8; value.value.v_utf8.str = "test"; value.value.v_utf8.len = 4; res = mongoc_client_encryption_encrypt(client_encryption, &value, encrypt_opts, &ciphertext, &error); if (with_external_key_vault) { BSON_ASSERT(!res); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Authentication failed"); } else { ASSERT_OR_PRINT(res, error); } bson_destroy(schema); bson_destroy(schema_map); bson_destroy(datakey); bson_value_destroy(&ciphertext); mongoc_write_concern_destroy(wc); bson_destroy(kms_providers); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_client_destroy(client_encrypted); mongoc_client_destroy(client_external); mongoc_uri_destroy(external_uri); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); } /* Prose Test 3: External Key Vault Test */ static void test_external_key_vault(void *unused) { BSON_UNUSED(unused); _test_key_vault(false /* external */); _test_key_vault(true /* external */); } /* Prose Test 5: Views Are Prohibited */ static void test_views_are_prohibited(void *unused) { mongoc_client_t *client; mongoc_client_t *client_encrypted; mongoc_collection_t *coll; bool res; bson_error_t error; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_t *kms_providers; BSON_UNUSED(unused); client = test_framework_new_default_client(); /* Using client, drop and create a view named db.view with an empty pipeline. * E.g. using the command { "create": "view", "viewOn": "coll" }. */ coll = mongoc_client_get_collection(client, "db", "view"); (void)mongoc_collection_drop(coll, NULL); res = mongoc_client_command_simple(client, "db", tmp_bson("{'create': 'view', 'viewOn': 'coll'}"), NULL, NULL, &error); ASSERT_OR_PRINT(res, error); client_encrypted = test_framework_new_default_client(); auto_encryption_opts = mongoc_auto_encryption_opts_new(); _check_bypass(auto_encryption_opts); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error), error); mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client_encrypted, "db", "view"); res = mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL, NULL, &error); BSON_ASSERT(!res); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, "cannot auto encrypt a view"); bson_destroy(kms_providers); mongoc_collection_destroy(coll); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_client_destroy(client_encrypted); mongoc_client_destroy(client); } static void _endpoint_setup(mongoc_client_t *keyvault_client, mongoc_client_encryption_t **client_encryption, mongoc_client_encryption_t **client_encryption_invalid) { bson_t *tls_opts; bson_t *kms_providers; bson_t *kms_providers_invalid; mongoc_client_encryption_opts_t *client_encryption_opts; mongoc_client_encryption_opts_t *client_encryption_opts_invalid; bson_error_t error; ASSERT(keyvault_client); char *mongoc_test_aws_access_key_id = test_framework_getenv_required("MONGOC_TEST_AWS_ACCESS_KEY_ID"); char *mongoc_test_aws_secret_access_key = test_framework_getenv_required("MONGOC_TEST_AWS_SECRET_ACCESS_KEY"); char *mongoc_test_azure_tenant_id = test_framework_getenv_required("MONGOC_TEST_AZURE_TENANT_ID"); char *mongoc_test_azure_client_id = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_ID"); char *mongoc_test_azure_client_secret = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_SECRET"); char *mongoc_test_gcp_email = test_framework_getenv_required("MONGOC_TEST_GCP_EMAIL"); char *mongoc_test_gcp_privatekey = test_framework_getenv_required("MONGOC_TEST_GCP_PRIVATEKEY"); char *ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); char *certificate_key_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); kms_providers = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s'}}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); bson_concat(kms_providers, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', 'clientSecret': '%s', " "'identityPlatformEndpoint': 'login.microsoftonline.com:443'}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(kms_providers, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': 'oauth2.googleapis.com:443'}}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(kms_providers, tmp_bson("{'kmip': { 'endpoint': 'localhost:5698' }}")); tls_opts = tmp_bson("{'kmip': { 'tlsCAFile': '%s', 'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file); kms_providers_invalid = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s'}}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); bson_concat(kms_providers_invalid, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', 'clientSecret': '%s', " "'identityPlatformEndpoint': 'doesnotexist.invalid:443'}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(kms_providers_invalid, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': 'doesnotexist.invalid'}}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(kms_providers_invalid, tmp_bson("{'kmip': { 'endpoint': 'doesnotexist.invalid:5698' }}")); client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, keyvault_client); *client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); client_encryption_opts_invalid = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts_invalid, kms_providers_invalid); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts_invalid, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts_invalid, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts_invalid, keyvault_client); *client_encryption_invalid = mongoc_client_encryption_new(client_encryption_opts_invalid, &error); ASSERT_OR_PRINT(client_encryption_invalid, error); mongoc_client_encryption_opts_destroy(client_encryption_opts); mongoc_client_encryption_opts_destroy(client_encryption_opts_invalid); bson_free(mongoc_test_aws_access_key_id); bson_free(mongoc_test_aws_secret_access_key); bson_free(mongoc_test_azure_tenant_id); bson_free(mongoc_test_azure_client_id); bson_free(mongoc_test_azure_client_secret); bson_free(mongoc_test_gcp_email); bson_free(mongoc_test_gcp_privatekey); bson_free(ca_file); bson_free(certificate_key_file); } /* Use the returned UUID of the key to explicitly encrypt and decrypt the * string "test" to validate it works. */ #define TEST_ENCRYPT_DECRYPT(keyid, client_encryption, res, error) \ do { \ bson_value_t ciphertext; \ bson_value_t plaintext; \ bson_value_t test; \ mongoc_client_encryption_encrypt_opts_t *encrypt_opts; \ \ test.value_type = BSON_TYPE_UTF8; \ test.value.v_utf8.str = "test"; \ test.value.v_utf8.len = 4; \ \ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); \ mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, \ MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); \ mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, keyid); \ res = mongoc_client_encryption_encrypt(client_encryption, &test, encrypt_opts, &ciphertext, &error); \ ASSERT_OR_PRINT(res, error); \ res = mongoc_client_encryption_decrypt(client_encryption, &ciphertext, &plaintext, &error); \ ASSERT_OR_PRINT(res, error); \ if (plaintext.value_type != BSON_TYPE_UTF8) { \ test_error("expected decrypted result to be value type UTF-8, got %s", \ _mongoc_bson_type_to_str(plaintext.value_type)); \ } \ ASSERT_CMPSTR(plaintext.value.v_utf8.str, test.value.v_utf8.str); \ bson_value_destroy(&ciphertext); \ bson_value_destroy(&plaintext); \ mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); \ } while (0) /* Prose Test 7: Custom Endpoint Test */ static void test_custom_endpoint(void *unused) { mongoc_client_t *keyvault_client; mongoc_client_encryption_t *client_encryption = NULL; mongoc_client_encryption_t *client_encryption_invalid = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts; bson_error_t error; bool res; bson_t *masterkey; bson_value_t keyid; BSON_UNUSED(unused); keyvault_client = test_framework_new_default_client(); datakey_opts = mongoc_client_encryption_datakey_opts_new(); /* Case 1: No endpoint, expect to succeed. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "aws", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 2: Custom endpoint, with the same as the default. Expect to succeed */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "endpoint", "kms.us-east-1.amazonaws.com"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "aws", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 3: Custom endpoint, with the same as the default but port included. * Expect to succeed */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "endpoint", "kms.us-east-1.amazonaws.com:443"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "aws", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 4: Custom endpoint, with the same as the default but wrong port * included. * Expect to fail with socket error */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("keyId", "1", "endpoint", "localhost:12345"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "kmip", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "Failed to connect"); BSON_ASSERT(!res); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 5: Custom endpoint, but wrong region. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "endpoint", "kms.us-east-2.amazonaws.com"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); memset(&error, 0, sizeof(bson_error_t)); res = mongoc_client_encryption_create_datakey(client_encryption, "aws", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, ""); BSON_ASSERT(!res); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 6: Custom endpoint to doesnotexist.invalid. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("region", "us-east-1", "key", "arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0", "endpoint", "doesnotexist.invalid"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); memset(&error, 0, sizeof(bson_error_t)); res = mongoc_client_encryption_create_datakey(client_encryption, "aws", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve"); BSON_ASSERT(!res); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 7: Azure successful case */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("keyVaultEndpoint", "key-vault-csfle.vault.azure.net", "keyName", "key-name-csfle"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "azure", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Azure invalid case. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); res = mongoc_client_encryption_create_datakey(client_encryption_invalid, "azure", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve"); BSON_ASSERT(!res); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 8: GCP successful case. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("projectId", "devprod-drivers", "location", "global", "keyRing", "key-ring-csfle", "keyName", "key-name-csfle", "endpoint", "cloudkms.googleapis.com:443"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "gcp", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* GCP invalid case. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); res = mongoc_client_encryption_create_datakey(client_encryption_invalid, "gcp", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve"); BSON_ASSERT(!res); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 9: GCP invalid key endpoint. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("projectId", "devprod-drivers", "location", "global", "keyRing", "key-ring-csfle", "keyName", "key-name-csfle", "endpoint", "doesnotexist.invalid:443"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "gcp", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, "Invalid KMS response"); BSON_ASSERT(!res); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 10: KMIP no endpoint. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("keyId", "1"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "kmip", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); /* Attempt to use client_encryption_invalid with the same masterKey. Expect * an error. */ res = mongoc_client_encryption_create_datakey(client_encryption_invalid, "kmip", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve"); BSON_ASSERT(!res); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 11: KMIP overriding with valid endpoint. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("keyId", "1", "endpoint", "localhost:5698"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "kmip", datakey_opts, &keyid, &error); ASSERT_OR_PRINT(res, error); TEST_ENCRYPT_DECRYPT(&keyid, client_encryption, res, error); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); /* Case 12: KMIP overriding with invalid endpoint. */ _endpoint_setup(keyvault_client, &client_encryption, &client_encryption_invalid); masterkey = BCON_NEW("keyId", "1", "endpoint", "doesnotexist.invalid:5698"); mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, masterkey); res = mongoc_client_encryption_create_datakey(client_encryption, "kmip", datakey_opts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Failed to resolve"); BSON_ASSERT(!res); bson_value_destroy(&keyid); bson_destroy(masterkey); mongoc_client_encryption_destroy(client_encryption); mongoc_client_encryption_destroy(client_encryption_invalid); mongoc_client_encryption_datakey_opts_destroy(datakey_opts); mongoc_client_destroy(keyvault_client); } typedef struct { const char *kms; const char *type; const char *algo; const char *method; const char *identifier; bool allowed; bson_value_t value; /* a copy */ } corpus_field_t; static corpus_field_t * _corpus_field_new(bson_iter_t *top_iter) { bson_iter_t iter; corpus_field_t *field; field = bson_malloc0(sizeof(corpus_field_t)); memset(field, 0, sizeof(*field)); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(top_iter)); bson_iter_recurse(top_iter, &iter); while (bson_iter_next(&iter)) { if (0 == strcmp("kms", bson_iter_key(&iter))) { field->kms = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp("type", bson_iter_key(&iter))) { field->type = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp("algo", bson_iter_key(&iter))) { field->algo = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp("method", bson_iter_key(&iter))) { field->method = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp("identifier", bson_iter_key(&iter))) { field->identifier = bson_iter_utf8(&iter, NULL); } else if (0 == strcmp("allowed", bson_iter_key(&iter))) { field->allowed = bson_iter_bool(&iter); } else if (0 == strcmp("value", bson_iter_key(&iter))) { bson_value_copy(bson_iter_value(&iter), &field->value); } else { fprintf(stderr, "unexpected field: %s\n", bson_iter_key(&iter)); BSON_ASSERT(false); } } return field; } static void _corpus_field_destroy(corpus_field_t *field) { if (!field) { return; } bson_value_destroy(&field->value); bson_free(field); } #define LOCAL_UUID "\x2c\xe0\x80\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" #define AWS_UUID "\x01\x64\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" #define AZURE_UUID "\x01\x95\x11\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" #define GCP_UUID "\x18\x23\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" #define KMIP_UUID "\x28\xc2\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" static void _corpus_copy_field(mongoc_client_encryption_t *client_encryption, bson_iter_t *iter, bson_t *corpus_copied) { corpus_field_t *field; const char *key = bson_iter_key(iter); mongoc_client_encryption_encrypt_opts_t *encrypt_opts; bson_value_t ciphertext; bool res; bson_error_t error; if (0 == strcmp("_id", key) || 0 == strcmp("altname_aws", key) || 0 == strcmp("altname_local", key) || 0 == strcmp("altname_azure", key) || 0 == strcmp("altname_gcp", key) || 0 == strcmp("altname_kmip", key)) { bson_append_value(corpus_copied, key, -1, bson_iter_value(iter)); return; } field = _corpus_field_new(iter); if (0 == strcmp("auto", field->method)) { bson_append_value(corpus_copied, key, -1, bson_iter_value(iter)); _corpus_field_destroy(field); return; } /* Otherwise, use explicit encryption. */ encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); if (0 == strcmp("rand", field->algo)) { mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_RANDOM); } else if (0 == strcmp("det", field->algo)) { mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); } if (0 == strcmp("id", field->identifier)) { bson_value_t uuid; uuid.value_type = BSON_TYPE_BINARY; uuid.value.v_binary.subtype = BSON_SUBTYPE_UUID; uuid.value.v_binary.data_len = 16; if (0 == strcmp("local", field->kms)) { uuid.value.v_binary.data = (uint8_t *)LOCAL_UUID; } else if (0 == strcmp("aws", field->kms)) { uuid.value.v_binary.data = (uint8_t *)AWS_UUID; } else if (0 == strcmp("azure", field->kms)) { uuid.value.v_binary.data = (uint8_t *)AZURE_UUID; } else if (0 == strcmp("gcp", field->kms)) { uuid.value.v_binary.data = (uint8_t *)GCP_UUID; } else if (0 == strcmp("kmip", field->kms)) { uuid.value.v_binary.data = (uint8_t *)KMIP_UUID; } mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &uuid); } else if (0 == strcmp("altname", field->identifier)) { mongoc_client_encryption_encrypt_opts_set_keyaltname(encrypt_opts, field->kms); } res = mongoc_client_encryption_encrypt(client_encryption, &field->value, encrypt_opts, &ciphertext, &error); if (field->allowed) { bson_t new_field; ASSERT_OR_PRINT(res, error); bson_append_document_begin(corpus_copied, key, -1, &new_field); BSON_APPEND_UTF8(&new_field, "kms", field->kms); BSON_APPEND_UTF8(&new_field, "type", field->type); BSON_APPEND_UTF8(&new_field, "algo", field->algo); BSON_APPEND_UTF8(&new_field, "method", field->method); BSON_APPEND_UTF8(&new_field, "identifier", field->identifier); BSON_APPEND_BOOL(&new_field, "allowed", field->allowed); BSON_APPEND_VALUE(&new_field, "value", &ciphertext); bson_append_document_end(corpus_copied, &new_field); } else { BSON_ASSERT(!res); bson_append_value(corpus_copied, key, -1, bson_iter_value(iter)); } bson_value_destroy(&ciphertext); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); _corpus_field_destroy(field); } static void _corpus_check_encrypted(mongoc_client_encryption_t *client_encryption, bson_iter_t *expected_iter, bson_iter_t *actual_iter) { corpus_field_t *expected; corpus_field_t *actual; const char *key; bson_error_t error; match_ctx_t match_ctx; memset(&match_ctx, 0, sizeof(match_ctx)); key = bson_iter_key(expected_iter); if (0 == strcmp("_id", key) || 0 == strcmp("altname_aws", key) || 0 == strcmp("altname_local", key) || 0 == strcmp("altname_azure", key) || 0 == strcmp("altname_gcp", key) || 0 == strcmp("altname_kmip", key)) { return; } expected = _corpus_field_new(expected_iter); actual = _corpus_field_new(actual_iter); /* If the algo is det, that the value equals the value of the corresponding * field * in corpus_encrypted_actual. */ if (0 == strcmp(expected->algo, "det")) { BSON_ASSERT(match_bson_value(&expected->value, &actual->value, &match_ctx)); } /* If the algo is rand and allowed is true, that the value does not equal the * value of the corresponding field in corpus_encrypted_actual. */ if (0 == strcmp(expected->algo, "rand") && expected->allowed) { BSON_ASSERT(!match_bson_value(&expected->value, &actual->value, &match_ctx)); } /* If allowed is true, decrypt the value with client_encryption. Decrypt the * value of the corresponding field of corpus_encrypted and validate that * they are both equal */ if (expected->allowed) { bson_value_t expected_decrypted; bson_value_t actual_decrypted; bool res; res = mongoc_client_encryption_decrypt(client_encryption, &expected->value, &expected_decrypted, &error); ASSERT_OR_PRINT(res, error); res = mongoc_client_encryption_decrypt(client_encryption, &actual->value, &actual_decrypted, &error); ASSERT_OR_PRINT(res, error); BSON_ASSERT(match_bson_value(&expected_decrypted, &actual_decrypted, &match_ctx)); bson_value_destroy(&expected_decrypted); bson_value_destroy(&actual_decrypted); } /* If allowed is false, validate the value exactly equals the value of the * corresponding field of corpus (neither was encrypted). */ if (!expected->allowed) { BSON_ASSERT(match_bson_value(&expected->value, &actual->value, &match_ctx)); } _corpus_field_destroy(expected); _corpus_field_destroy(actual); } static void _insert_from_file(mongoc_collection_t *coll, char *path) { bson_t *datakey; bool res; bson_error_t error; datakey = get_bson_from_json_file(path); res = mongoc_collection_insert_one(coll, datakey, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); bson_destroy(datakey); } static void _test_corpus(bool local_schema) { mongoc_client_t *client; mongoc_collection_t *coll; bson_t *schema; bson_t *create_cmd; bool res; bson_error_t error; mongoc_write_concern_t *wc; mongoc_client_t *client_encrypted; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_t *kms_providers; mongoc_client_encryption_t *client_encryption; mongoc_client_encryption_opts_t *client_encryption_opts; bson_t *corpus; bson_t corpus_copied; const bson_t *corpus_decrypted; bson_t *corpus_encrypted_expected; const bson_t *corpus_encrypted_actual; bson_iter_t iter; mongoc_cursor_t *cursor; bson_t *schema_map; bson_t *tls_opts; /* Create a MongoClient without encryption enabled */ client = test_framework_new_default_client(); coll = mongoc_client_get_collection(client, "db", "coll"); (void)mongoc_collection_drop(coll, NULL); schema = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/corpus/" "corpus-schema.json"); schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); create_cmd = BCON_NEW("create", "coll", "validator", "{", "$jsonSchema", BCON_DOCUMENT(schema), "}"); if (!local_schema) { /* Drop and create the collection db.coll configured with the included * JSON schema corpus-schema.json */ res = mongoc_client_command_simple(client, "db", create_cmd, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); } /* Drop the collection keyvault.datakeys. Insert the key documents for each * KMS provider. */ mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); (void)mongoc_collection_drop(coll, NULL); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); _insert_from_file(coll, "./src/libmongoc/tests/client_side_encryption_prose/" "corpus/corpus-key-aws.json"); _insert_from_file(coll, "./src/libmongoc/tests/client_side_encryption_prose/" "corpus/corpus-key-azure.json"); _insert_from_file(coll, "./src/libmongoc/tests/client_side_encryption_prose/" "corpus/corpus-key-gcp.json"); _insert_from_file(coll, "./src/libmongoc/tests/client_side_encryption_prose/" "corpus/corpus-key-local.json"); _insert_from_file(coll, "./src/libmongoc/tests/client_side_encryption_prose/" "corpus/corpus-key-kmip.json"); /* Create a MongoClient configured with auto encryption */ client_encrypted = test_framework_new_default_client(); auto_encryption_opts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); _check_bypass(auto_encryption_opts); kms_providers = _make_kms_providers(true /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); tls_opts = _make_tls_opts(); mongoc_auto_encryption_opts_set_tls_opts(auto_encryption_opts, tls_opts); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); res = mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error); ASSERT_OR_PRINT(res, error); /* Create a ClientEncryption object */ client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); corpus = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/corpus/corpus.json"); /* Try each field individually */ bson_iter_init(&iter, corpus); bson_init(&corpus_copied); while (bson_iter_next(&iter)) { _corpus_copy_field(client_encryption, &iter, &corpus_copied); } /* Insert corpus_copied with auto encryption */ mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); res = mongoc_collection_insert_one(coll, &corpus_copied, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* Get the automatically decrypted corpus */ cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); BSON_ASSERT(mongoc_cursor_next(cursor, &corpus_decrypted)); /* It should exactly match corpus. match_bson does a subset match, so match * in both directions */ assert_match_bson(corpus, corpus_decrypted, false); assert_match_bson(corpus_decrypted, corpus, false); mongoc_cursor_destroy(cursor); /* Load corpus-encrypted.json */ corpus_encrypted_expected = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/" "corpus/corpus-encrypted.json"); /* Get the actual encrypted document from unencrypted client */ mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "db", "coll"); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); BSON_ASSERT(mongoc_cursor_next(cursor, &corpus_encrypted_actual)); /* Iterate over corpus_encrypted_expected, and check corpus_encrypted_actual */ bson_iter_init(&iter, corpus_encrypted_expected); while (bson_iter_next(&iter)) { bson_iter_t actual_iter; BSON_ASSERT(bson_iter_init_find(&actual_iter, corpus_encrypted_actual, bson_iter_key(&iter))); _corpus_check_encrypted(client_encryption, &iter, &actual_iter); } mongoc_cursor_destroy(cursor); bson_destroy(corpus_encrypted_expected); bson_destroy(corpus); bson_destroy(&corpus_copied); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_client_destroy(client_encrypted); mongoc_client_encryption_opts_destroy(client_encryption_opts); mongoc_client_encryption_destroy(client_encryption); bson_destroy(tls_opts); bson_destroy(kms_providers); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); bson_destroy(schema); bson_destroy(schema_map); bson_destroy(create_cmd); mongoc_client_destroy(client); } /* Prose Test 6: Corpus Test */ static void test_corpus(void *unused) { BSON_UNUSED(unused); _test_corpus(false /* local schema */); _test_corpus(true /* local schema */); } /* Begin C driver specific, non-spec tests: */ static void _reset(mongoc_client_pool_t **pool, mongoc_client_t **singled_threaded_client, mongoc_client_t **multi_threaded_client, mongoc_auto_encryption_opts_t **opts, bool recreate) { bson_t *kms_providers; mongoc_uri_t *uri; bson_t *schema; bson_t *schema_map; ASSERT(pool); mongoc_auto_encryption_opts_destroy(*opts); *opts = mongoc_auto_encryption_opts_new(); { bson_t extra = BSON_INITIALIZER; _set_extra_bypass(&extra); _set_extra_crypt_shared(&extra); mongoc_auto_encryption_opts_set_extra(*opts, &extra); bson_destroy(&extra); } mongoc_auto_encryption_opts_set_keyvault_namespace(*opts, "db", "keyvault"); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(*opts, kms_providers); schema = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/schema.json"); BSON_ASSERT(schema); schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); mongoc_auto_encryption_opts_set_schema_map(*opts, schema_map); if (*multi_threaded_client) { mongoc_client_pool_push(*pool, *multi_threaded_client); } mongoc_client_destroy(*singled_threaded_client); /* Workaround to hide unnecessary logs per CDRIVER-3322 */ capture_logs(true); mongoc_client_pool_destroy(*pool); capture_logs(false); if (recreate) { mongoc_collection_t *coll; bson_t *datakey; bson_error_t error; mongoc_write_concern_t *wc; uri = test_framework_get_uri(); *pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(*pool); *singled_threaded_client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(*singled_threaded_client); *multi_threaded_client = mongoc_client_pool_pop(*pool); mongoc_uri_destroy(uri); /* create key */ coll = mongoc_client_get_collection(*singled_threaded_client, "db", "keyvault"); (void)mongoc_collection_drop(coll, NULL); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); datakey = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-key.json"); BSON_ASSERT(datakey); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, datakey, NULL /* opts */, NULL /* reply */, &error), error); bson_destroy(datakey); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); } bson_destroy(schema); bson_destroy(schema_map); bson_destroy(kms_providers); } static void _perform_op(mongoc_client_t *client_encrypted) { bool ret; bson_error_t error; mongoc_collection_t *coll; ASSERT(client_encrypted); coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); ret = mongoc_collection_insert_one( coll, tmp_bson("{'encrypted_string': 'abc'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); mongoc_collection_destroy(coll); } static void _perform_op_pooled(mongoc_client_pool_t *client_pool_encrypted) { mongoc_client_t *client_encrypted; ASSERT(client_pool_encrypted); client_encrypted = mongoc_client_pool_pop(client_pool_encrypted); _perform_op(client_encrypted); mongoc_client_pool_push(client_pool_encrypted, client_encrypted); } static void test_invalid_single_and_pool_mismatches(void *unused) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *single_threaded_client = NULL; mongoc_client_t *multi_threaded_client = NULL; mongoc_auto_encryption_opts_t *opts = NULL; bson_error_t error; bool ret; BSON_UNUSED(unused); _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); /* single threaded client, single threaded setter => ok */ ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op(single_threaded_client); /* multi threaded client, single threaded setter => bad */ ret = mongoc_client_enable_auto_encryption(multi_threaded_client, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Cannot enable auto encryption on a pooled client"); /* pool - pool setter */ ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op_pooled(pool); /* single threaded client, single threaded key vault client => ok */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client(opts, single_threaded_client); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op(single_threaded_client); /* single threaded client, multi threaded key vault client => bad */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client(opts, multi_threaded_client); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client must be single threaded, not " "be from a client pool"); /* single threaded client, pool key vault client => bad */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client_pool(opts, pool); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client pool only applies to a client " "pool, not a single threaded client"); /* pool, singled threaded key vault client => bad */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client(opts, single_threaded_client); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client only applies to a single " "threaded client not a client pool. Set a " "key vault client pool"); /* pool, multi threaded key vault client => bad */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client(opts, multi_threaded_client); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "The key vault client only applies to a single " "threaded client not a client pool. Set a " "key vault client pool"); /* pool, pool key vault client => ok */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client_pool(opts, pool); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op_pooled(pool); /* double enabling */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Automatic encryption already set"); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, "Automatic encryption already set"); /* single threaded, using self as key vault client => redundant, but ok */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client(opts, single_threaded_client); ret = mongoc_client_enable_auto_encryption(single_threaded_client, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op(single_threaded_client); /* pool, using self as key vault client pool => redundant, but ok */ _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, true); mongoc_auto_encryption_opts_set_keyvault_client_pool(opts, pool); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); ASSERT_OR_PRINT(ret, error); _perform_op_pooled(pool); _reset(&pool, &single_threaded_client, &multi_threaded_client, &opts, false); mongoc_auto_encryption_opts_destroy(opts); } static BSON_THREAD_FUN(_worker_thread, client_ptr) { mongoc_client_t *client_encrypted; mongoc_collection_t *coll; mongoc_cursor_t *cursor; const bson_t *doc; bson_t filter = BSON_INITIALIZER; bson_t *to_insert = BCON_NEW("encrypted_string", "abc"); int i; bool ret; bson_error_t error; client_encrypted = client_ptr; coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); for (i = 0; i < 100; i++) { ret = mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); cursor = mongoc_collection_find_with_opts(coll, &filter, NULL /* opts */, NULL /* read_prefs */); mongoc_cursor_next(cursor, &doc); mongoc_cursor_destroy(cursor); } mongoc_collection_destroy(coll); bson_destroy(&filter); bson_destroy(to_insert); BSON_THREAD_RETURN; } static void _test_multi_threaded(bool external_key_vault) { /* Spawn two threads and do repeated encryption/decryption operations. */ bson_thread_t threads[2]; mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_client_t *client1; mongoc_client_t *client2; mongoc_auto_encryption_opts_t *opts; bson_t *datakey; mongoc_collection_t *coll; bson_t *schema; bson_t *schema_map; bool ret; bson_error_t error; bson_t *kms_providers; int r; int i; mongoc_write_concern_t *wc; uri = test_framework_get_uri(); pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); opts = mongoc_auto_encryption_opts_new(); /* Do setup: create a data key and configure pool for auto encryption. */ coll = mongoc_client_get_collection(client, "db", "keyvault"); (void)mongoc_collection_drop(coll, NULL); datakey = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/limits-key.json"); BSON_ASSERT(datakey); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(coll, wc); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, datakey, NULL /* opts */, NULL /* reply */, &error), error); /* create pool with auto encryption */ _check_bypass(opts); mongoc_auto_encryption_opts_set_keyvault_namespace(opts, "db", "keyvault"); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(opts, kms_providers); if (external_key_vault) { mongoc_auto_encryption_opts_set_keyvault_client_pool(opts, pool); } schema = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/schema.json"); BSON_ASSERT(schema); schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); mongoc_auto_encryption_opts_set_schema_map(opts, schema_map); ret = mongoc_client_pool_enable_auto_encryption(pool, opts, &error); ASSERT_OR_PRINT(ret, error); client1 = mongoc_client_pool_pop(pool); client2 = mongoc_client_pool_pop(pool); r = mcommon_thread_create(threads, _worker_thread, client1); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, _worker_thread, client2); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_client_pool_push(pool, client1); mongoc_client_pool_push(pool, client2); mongoc_client_pool_destroy(pool); bson_destroy(schema); bson_destroy(schema_map); bson_destroy(datakey); mongoc_auto_encryption_opts_destroy(opts); mongoc_uri_destroy(uri); bson_destroy(kms_providers); } static void test_multi_threaded(void *ctx_unused) { BSON_UNUSED(ctx_unused); _test_multi_threaded(true); _test_multi_threaded(false); } static void test_malformed_explicit(void *unused) { mongoc_client_t *client; bson_t *kms_providers; mongoc_client_encryption_t *client_encryption; mongoc_client_encryption_opts_t *client_encryption_opts; bson_value_t value; bson_value_t ciphertext; bool ret; bson_error_t error; BSON_UNUSED(unused); /* Create a MongoClient without encryption enabled */ client = test_framework_new_default_client(); kms_providers = _make_kms_providers(false /* aws */, true /* local */); /* Create a ClientEncryption object */ client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); /* Test attempting to decrypt a malformed value */ ciphertext.value_type = BSON_TYPE_DOUBLE; ciphertext.value.v_double = 1.23; ret = mongoc_client_encryption_decrypt(client_encryption, &ciphertext, &value, &error); BSON_ASSERT(!ret); bson_value_destroy(&value); mongoc_client_encryption_opts_destroy(client_encryption_opts); mongoc_client_encryption_destroy(client_encryption); bson_destroy(kms_providers); mongoc_client_destroy(client); } static void _check_mongocryptd_not_spawned(void) { mongoc_client_t *client; bson_t *cmd; bson_error_t error; bool ret; /* Set up client. */ { mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27021"); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 1000)); /* Set SERVERSELECTIONTRYONCE to false so client will wait for the full * second before giving up on server selection. */ ASSERT(mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false)); client = mongoc_client_new_from_uri(uri); /* Bypass the 5 second cooldown so attempts to connect are repeated. * Single threaded clients wait for 5 second cooldown period after failing * to connect to a server before connecting again. If mongocryptd just * spawned, it may take time before connections are accepted. */ _mongoc_topology_bypass_cooldown(client->topology); mongoc_uri_destroy(uri); } cmd = BCON_NEW(HANDSHAKE_CMD_LEGACY_HELLO, BCON_INT32(1)); ret = mongoc_client_command_simple(client, "keyvault", cmd, NULL /* read prefs */, NULL /* reply */, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers"); mongoc_client_destroy(client); bson_destroy(cmd); } /* Prose Test 8: Bypass Spawning mongocryptd - Via mongocryptdBypassSpawn */ static void test_bypass_spawning_via_mongocryptdBypassSpawn(void *unused) { mongoc_client_t *client_encrypted; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_t *kms_providers; bson_t *doc_to_insert; bson_t *extra; bson_t *schema_map; bson_t *schema; bool ret; bson_error_t error; mongoc_collection_t *coll; BSON_UNUSED(unused); auto_encryption_opts = mongoc_auto_encryption_opts_new(); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); schema = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/external/" "external-schema.json"); schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); /* Create a MongoClient with encryption enabled */ client_encrypted = test_framework_new_default_client(); extra = BCON_NEW("mongocryptdBypassSpawn", BCON_BOOL(true), "mongocryptdSpawnArgs", "[", "--pidfilepath=bypass-spawning-mongocryptd.pid", "--port=27021", "]", "mongocryptdURI", "mongodb://localhost:27021/?serverSelectionTimeoutMS=1000"); mongoc_auto_encryption_opts_set_extra(auto_encryption_opts, extra); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); bson_destroy(extra); ret = mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error); ASSERT_OR_PRINT(ret, error); /* Insert { 'encrypt': 'test' }. Should fail with a server selection error. */ coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); doc_to_insert = BCON_NEW("encrypt", "test"); ret = mongoc_collection_insert_one(coll, doc_to_insert, NULL /* opts */, NULL /* reply */, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "mongocryptd error: No suitable servers found"); _check_mongocryptd_not_spawned(); bson_destroy(schema_map); bson_destroy(schema); mongoc_collection_destroy(coll); mongoc_client_destroy(client_encrypted); bson_destroy(doc_to_insert); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); bson_destroy(kms_providers); } static void test_bypass_spawning_via_helper(const char *auto_encryption_opt) { mongoc_client_t *client_encrypted; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_t *kms_providers; bson_t *doc_to_insert; bson_t *extra = bson_new(); bool ret; bson_error_t error; bool check_crypt_shared = false; mongoc_collection_t *coll; auto_encryption_opts = mongoc_auto_encryption_opts_new(); kms_providers = _make_kms_providers(false /* aws */, true /* local */); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); if (0 == strcmp(auto_encryption_opt, "bypass_auto_encryption")) { mongoc_auto_encryption_opts_set_bypass_auto_encryption(auto_encryption_opts, true); } else if (0 == strcmp(auto_encryption_opt, "bypass_query_analysis")) { mongoc_auto_encryption_opts_set_bypass_query_analysis(auto_encryption_opts, true); } else if (0 == strcmp(auto_encryption_opt, "cryptSharedLibRequired")) { bson_t *schema = get_bson_from_json_file("./src/libmongoc/tests/" "client_side_encryption_prose/external/" "external-schema.json"); BSON_ASSERT(schema); bson_t *schema_map = BCON_NEW("db.coll", BCON_DOCUMENT(schema)); mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); check_crypt_shared = true; char *env_cryptSharedLibPath = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); BSON_ASSERT(env_cryptSharedLibPath); BSON_APPEND_UTF8(extra, "cryptSharedLibPath", env_cryptSharedLibPath); BSON_APPEND_BOOL(extra, "cryptSharedLibRequired", true); BSON_APPEND_UTF8(extra, "mongocryptdURI", "mongodb://localhost:27021/db?serverSelectionTimeoutMS=1000"); bson_free(env_cryptSharedLibPath); bson_destroy(schema); bson_destroy(schema_map); } else { test_error("Unexpected 'auto_encryption_opt' argument: %s", auto_encryption_opt); } /* Create a MongoClient with encryption enabled */ client_encrypted = test_framework_new_default_client(); BCON_APPEND( extra, "mongocryptdSpawnArgs", "[", "--pidfilepath=bypass-spawning-mongocryptd.pid", "--port=27021", "]"); mongoc_auto_encryption_opts_set_extra(auto_encryption_opts, extra); bson_destroy(extra); ret = mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error); ASSERT_OR_PRINT(ret, error); if (check_crypt_shared) { BSON_ASSERT(mongoc_client_get_crypt_shared_version(client_encrypted) != NULL); } /* Insert { 'unencrypted': 'test' }. Should succeed. */ coll = mongoc_client_get_collection(client_encrypted, "db", "coll"); doc_to_insert = BCON_NEW("unencrypted", "test"); ret = mongoc_collection_insert_one(coll, doc_to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); _check_mongocryptd_not_spawned(); mongoc_collection_destroy(coll); mongoc_client_destroy(client_encrypted); bson_destroy(doc_to_insert); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); bson_destroy(kms_providers); } /* Prose Test 8: Bypass Spawning mongocryptd - Via bypassAutoEncryption */ static void test_bypass_spawning_via_bypassAutoEncryption(void *unused) { BSON_UNUSED(unused); test_bypass_spawning_via_helper("bypass_auto_encryption"); } /* Prose Test 8: Bypass Spawning mongocryptd - Via bypassQueryAnalysis */ static void test_bypass_spawning_via_bypassQueryAnalysis(void *unused) { BSON_UNUSED(unused); test_bypass_spawning_via_helper("bypass_query_analysis"); } /* Prose Test 8: Bypass Spawning mongocryptd - Via loading shared library */ static void test_bypass_spawning_via_cryptSharedLibLoaded(void *unused) { BSON_UNUSED(unused); test_bypass_spawning_via_helper("cryptSharedLibRequired"); } static int _skip_if_no_crypt_shared(void) { char *env = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); if (!env) { return 0; // Skip! } bson_free(env); return 1; // Do not skip } static mongoc_client_encryption_t * _make_kms_certificate_client_encryption(mongoc_client_t *client, bson_error_t *error) { mongoc_client_encryption_t *client_encryption; ASSERT(client); mongoc_client_encryption_opts_t *client_encryption_opts = mongoc_client_encryption_opts_new(); { bson_t *kms_providers = _make_aws_kms_provider(NULL); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); bson_destroy(kms_providers); } { char *tls_ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); char *tls_cert_key_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); bson_t *tls_opts = tmp_bson("{ 'aws': { '%s': '%s', '%s': '%s' } }", MONGOC_URI_TLSCAFILE, tls_ca_file, MONGOC_URI_TLSCERTIFICATEKEYFILE, tls_cert_key_file); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); bson_free(tls_cert_key_file); bson_free(tls_ca_file); } mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, error); ASSERT_OR_PRINT(client_encryption, (*error)); mongoc_client_encryption_opts_destroy(client_encryption_opts); return client_encryption; } static void test_kms_tls_cert_valid(void *unused) { const int32_t connecttimeoutms = MONGOC_DEFAULT_CONNECTTIMEOUTMS; const int is_client = 1; bson_error_t error; mongoc_host_list_t host; mongoc_stream_t *base_stream; mongoc_ssl_opt_t ssl_opts; mongoc_stream_t *tls_stream; char *tls_ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); char *tls_cert_key_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); BSON_UNUSED(unused); #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) /* Certificate verification fails with Secure Channel given * "127.0.0.1:8999" with error: "hostname doesn't match certificate". */ ASSERT_OR_PRINT(_mongoc_host_list_from_string_with_err(&host, "localhost:8999", &error), error); #else ASSERT_OR_PRINT(_mongoc_host_list_from_string_with_err(&host, "127.0.0.1:8999", &error), error); #endif base_stream = mongoc_client_connect_tcp(connecttimeoutms, &host, &error); ASSERT_OR_PRINT(base_stream, error); ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.ca_file = tls_ca_file; ssl_opts.pem_file = tls_cert_key_file; tls_stream = mongoc_stream_tls_new_with_hostname(base_stream, host.host, &ssl_opts, is_client); ASSERT_OR_PRINT(mongoc_stream_tls_handshake_block(tls_stream, host.host, connecttimeoutms, &error), error); mongoc_stream_destroy(tls_stream); /* Also destroys base_stream. */ bson_free(tls_cert_key_file); bson_free(tls_ca_file); } /* Prose Test 10: KMS TLS Tests - Invalid KMS Certificate */ static void test_kms_tls_cert_expired(void *unused) { bool ret; bson_error_t error; bson_value_t keyid; mongoc_client_t *client = test_framework_new_default_client(); mongoc_client_encryption_t *client_encryption = _make_kms_certificate_client_encryption(client, &error); mongoc_client_encryption_datakey_opts_t *opts = mongoc_client_encryption_datakey_opts_new(); BSON_UNUSED(unused); mongoc_client_encryption_datakey_opts_set_masterkey(opts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', " "'endpoint': '127.0.0.1:9000' }")); ret = mongoc_client_encryption_create_datakey(client_encryption, "aws", opts, &keyid, &error); BSON_ASSERT(!ret); #if defined(MONGOC_ENABLE_SSL_OPENSSL) ASSERT_CONTAINS(error.message, "certificate has expired"); #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) ASSERT_CONTAINS(error.message, "CSSMERR_TP_CERT_EXPIRED"); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) ASSERT_CONTAINS(error.message, "certificate has expired"); #endif mongoc_client_encryption_datakey_opts_destroy(opts); mongoc_client_encryption_destroy(client_encryption); mongoc_client_destroy(client); } /* Prose Test 10: KMS TLS Tests - Invalid Hostname in KMS Certificate */ static void test_kms_tls_cert_wrong_host(void *unused) { bool ret; bson_error_t error; bson_value_t keyid; mongoc_client_t *client = test_framework_new_default_client(); mongoc_client_encryption_t *client_encryption = _make_kms_certificate_client_encryption(client, &error); mongoc_client_encryption_datakey_opts_t *opts = mongoc_client_encryption_datakey_opts_new(); BSON_UNUSED(unused); mongoc_client_encryption_datakey_opts_set_masterkey(opts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', " "'endpoint': '127.0.0.1:9001' }")); ret = mongoc_client_encryption_create_datakey(client_encryption, "aws", opts, &keyid, &error); BSON_ASSERT(!ret); #if defined(MONGOC_ENABLE_SSL_OPENSSL) ASSERT_CONTAINS(error.message, "IP address mismatch"); #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) ASSERT_CONTAINS(error.message, "Host name mismatch"); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) ASSERT_CONTAINS(error.message, "hostname doesn't match certificate"); #endif mongoc_client_encryption_datakey_opts_destroy(opts); mongoc_client_encryption_destroy(client_encryption); mongoc_client_destroy(client); } typedef enum { NO_CLIENT_CERT, WITH_TLS, INVALID_HOSTNAME, EXPIRED, WITH_NAMES, RETRY } tls_test_ce_t; static mongoc_client_encryption_t * _tls_test_make_client_encryption(mongoc_client_t *keyvault_client, tls_test_ce_t test_ce) { bson_t *kms_providers; mongoc_client_encryption_opts_t *client_encryption_opts; bson_error_t error = {0}; mongoc_client_encryption_t *client_encryption; bson_t *tls_opts = NULL; ASSERT(keyvault_client); char *mongoc_test_aws_access_key_id = test_framework_getenv_required("MONGOC_TEST_AWS_ACCESS_KEY_ID"); char *mongoc_test_aws_secret_access_key = test_framework_getenv_required("MONGOC_TEST_AWS_SECRET_ACCESS_KEY"); char *mongoc_test_azure_tenant_id = test_framework_getenv_required("MONGOC_TEST_AZURE_TENANT_ID"); char *mongoc_test_azure_client_id = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_ID"); char *mongoc_test_azure_client_secret = test_framework_getenv_required("MONGOC_TEST_AZURE_CLIENT_SECRET"); char *mongoc_test_gcp_email = test_framework_getenv_required("MONGOC_TEST_GCP_EMAIL"); char *mongoc_test_gcp_privatekey = test_framework_getenv_required("MONGOC_TEST_GCP_PRIVATEKEY"); char *ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); char *certificate_key_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); if (test_ce == WITH_TLS || test_ce == RETRY) { const char *port = test_ce == RETRY ? "9003" : "9002"; kms_providers = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s' }}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); tls_opts = tmp_bson("{'aws': {'tlsCaFile': '%s', 'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file); bson_concat(kms_providers, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', " "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:%s' }}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret, port)); bson_concat( tls_opts, tmp_bson("{'azure': {'tlsCaFile': '%s', 'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:%s' }}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey, port)); bson_concat( tls_opts, tmp_bson("{'gcp': {'tlsCaFile': '%s', 'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'kmip': { 'endpoint': '127.0.0.1:5698'}}")); bson_concat( tls_opts, tmp_bson("{'kmip': {'tlsCaFile': '%s', 'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); } else if (test_ce == NO_CLIENT_CERT) { kms_providers = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s' }}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); bson_concat(kms_providers, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', " "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:9002'}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(kms_providers, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:9002'}}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(kms_providers, tmp_bson("{'kmip': { 'endpoint': '127.0.0.1:5698' }}")); } else if (test_ce == EXPIRED) { kms_providers = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s' }}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); tls_opts = tmp_bson("{'aws': {'tlsCaFile': '%s'} }", ca_file); bson_concat(kms_providers, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', " "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:9000'}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(tls_opts, tmp_bson("{'azure': {'tlsCaFile': '%s'} }", ca_file)); bson_concat(kms_providers, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:9000'}}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(tls_opts, tmp_bson("{'gcp': {'tlsCaFile': '%s'} }", ca_file)); bson_concat(kms_providers, tmp_bson("{'kmip': { 'endpoint': '127.0.0.1:9000' }}")); bson_concat(tls_opts, tmp_bson("{'kmip': {'tlsCaFile': '%s'} }", ca_file)); } else if (test_ce == INVALID_HOSTNAME) { kms_providers = tmp_bson("{'aws': {'accessKeyId': '%s', 'secretAccessKey': '%s' } }", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); tls_opts = tmp_bson("{'aws': {'tlsCaFile': '%s'} }", ca_file); bson_concat(kms_providers, tmp_bson("{'azure': {'tenantId': '%s', 'clientId': '%s', " "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:9001' }}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(tls_opts, tmp_bson("{'azure': {'tlsCaFile': '%s'} }", ca_file)); bson_concat(kms_providers, tmp_bson("{'gcp': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:9001' }}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(tls_opts, tmp_bson("{'gcp': {'tlsCaFile': '%s'} }", ca_file)); bson_concat(kms_providers, tmp_bson("{'kmip': { 'endpoint': '127.0.0.1:9001' }}")); bson_concat(tls_opts, tmp_bson("{'kmip': {'tlsCaFile': '%s'} }", ca_file)); } else if (test_ce == WITH_NAMES) { kms_providers = tmp_bson("{'aws:no_client_cert': {'accessKeyId': '%s', " "'secretAccessKey': '%s' }}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key); tls_opts = tmp_bson("{'aws:no_client_cert': {'tlsCaFile': '%s' }}", ca_file); bson_concat(kms_providers, tmp_bson("{'aws:with_tls': {'accessKeyId': '%s', 'secretAccessKey': '%s' }}", mongoc_test_aws_access_key_id, mongoc_test_aws_secret_access_key)); bson_concat(tls_opts, tmp_bson("{'aws:with_tls': {'tlsCaFile': '%s', " "'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'azure:no_client_cert': {'tenantId': '%s', 'clientId': '%s'," "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:9002'" "}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(tls_opts, tmp_bson("{'azure:no_client_cert': {'tlsCaFile': '%s' }}", ca_file)); bson_concat(kms_providers, tmp_bson("{'azure:with_tls': {'tenantId': '%s', 'clientId': '%s'," "'clientSecret': '%s', " "'identityPlatformEndpoint': '127.0.0.1:9002'" "}}", mongoc_test_azure_tenant_id, mongoc_test_azure_client_id, mongoc_test_azure_client_secret)); bson_concat(tls_opts, tmp_bson("{'azure:with_tls': {'tlsCaFile': '%s', " "'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'gcp:no_client_cert': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:9002' }}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(tls_opts, tmp_bson("{'gcp:no_client_cert': {'tlsCaFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'gcp:with_tls': { 'email': '%s', 'privateKey': '%s', " "'endpoint': '127.0.0.1:9002' }}", mongoc_test_gcp_email, mongoc_test_gcp_privatekey)); bson_concat(tls_opts, tmp_bson("{'gcp:with_tls': {'tlsCaFile': '%s', " "'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); bson_concat(kms_providers, tmp_bson("{'kmip:no_client_cert': { 'endpoint': '127.0.0.1:5698'}}")); bson_concat(tls_opts, tmp_bson("{'kmip:no_client_cert': {'tlsCaFile': '%s' }}", ca_file)); bson_concat(kms_providers, tmp_bson("{'kmip:with_tls': { 'endpoint': '127.0.0.1:5698'}}")); bson_concat(tls_opts, tmp_bson("{'kmip:with_tls': {'tlsCaFile': '%s', " "'tlsCertificateKeyFile': '%s' }}", ca_file, certificate_key_file)); } else { BSON_UNREACHABLE("Invalid value for test_ce"); } client_encryption_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, keyvault_client); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_free(mongoc_test_aws_access_key_id); bson_free(mongoc_test_aws_secret_access_key); bson_free(mongoc_test_azure_tenant_id); bson_free(mongoc_test_azure_client_id); bson_free(mongoc_test_azure_client_secret); bson_free(mongoc_test_gcp_email); bson_free(mongoc_test_gcp_privatekey); bson_free(ca_file); bson_free(certificate_key_file); return client_encryption; } #if defined(MONGOC_ENABLE_SSL_OPENSSL) #define ASSERT_EXPIRED(error) ASSERT_CONTAINS(error.message, "certificate has expired") #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) #define ASSERT_EXPIRED(error) ASSERT_CONTAINS(error.message, "CSSMERR_TP_CERT_EXPIRED") #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #define ASSERT_EXPIRED(error) ASSERT_CONTAINS(error.message, "certificate has expired") #else #define ASSERT_EXPIRED(error) #endif #if defined(MONGOC_ENABLE_SSL_OPENSSL) #define ASSERT_INVALID_HOSTNAME(error) ASSERT_CONTAINS(error.message, "IP address mismatch") #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) #define ASSERT_INVALID_HOSTNAME(error) ASSERT_CONTAINS(error.message, "Host name mismatch") #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #define ASSERT_INVALID_HOSTNAME(error) ASSERT_CONTAINS(error.message, "hostname doesn't match certificate") #else #define ASSERT_INVALID_HOSTNAME(error) #endif /* Prose Test 11: KMS TLS Options Tests */ static void test_kms_tls_options(void *unused) { mongoc_client_t *keyvault_client; mongoc_client_encryption_t *client_encryption_no_client_cert = NULL; mongoc_client_encryption_t *client_encryption_with_tls = NULL; mongoc_client_encryption_t *client_encryption_expired = NULL; mongoc_client_encryption_t *client_encryption_invalid_hostname = NULL; mongoc_client_encryption_t *client_encryption_with_names = NULL; bson_value_t keyid; mongoc_client_encryption_datakey_opts_t *dkopts; bson_error_t error; bool res; const int mongocrypt_errno = 1; /* libmongocrypt returns all errors with code 1. */ BSON_UNUSED(unused); keyvault_client = test_framework_new_default_client(); client_encryption_no_client_cert = _tls_test_make_client_encryption(keyvault_client, NO_CLIENT_CERT); client_encryption_with_tls = _tls_test_make_client_encryption(keyvault_client, WITH_TLS); client_encryption_expired = _tls_test_make_client_encryption(keyvault_client, EXPIRED); client_encryption_invalid_hostname = _tls_test_make_client_encryption(keyvault_client, INVALID_HOSTNAME); client_encryption_with_names = _tls_test_make_client_encryption(keyvault_client, WITH_NAMES); /* Case 1: AWS - no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9002' }")); res = mongoc_client_encryption_create_datakey(client_encryption_no_client_cert, "aws", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* AWS - named with no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9002' }")); res = mongoc_client_encryption_create_datakey( client_encryption_with_names, "aws:no_client_cert", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* AWS - with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9002' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_tls, "aws", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "parse error"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* AWS - named with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9002' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_names, "aws:with_tls", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "parse error"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* AWS - expired. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9000' }")); res = mongoc_client_encryption_create_datakey(client_encryption_expired, "aws", dkopts, &keyid, &error); ASSERT_EXPIRED(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* AWS - invalid hostname. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'endpoint': " "'127.0.0.1:9001' }")); res = mongoc_client_encryption_create_datakey(client_encryption_invalid_hostname, "aws", dkopts, &keyid, &error); ASSERT_INVALID_HOSTNAME(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Case 2: Azure - no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey(client_encryption_no_client_cert, "azure", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Azure - named with no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey( client_encryption_with_names, "azure:no_client_cert", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Azure - with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_tls, "azure", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "HTTP status=404"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Azure - named with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_names, "azure:with_tls", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "HTTP status=404"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Azure - expired. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey(client_encryption_expired, "azure", dkopts, &keyid, &error); ASSERT_EXPIRED(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Azure - invalid hostname. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'keyVaultEndpoint': 'doesnotexist.invalid', 'keyName': 'foo' }")); res = mongoc_client_encryption_create_datakey(client_encryption_invalid_hostname, "azure", dkopts, &keyid, &error); ASSERT_INVALID_HOSTNAME(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Case 3: GCP - no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey(client_encryption_no_client_cert, "gcp", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* GCP - named with no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey( client_encryption_with_names, "gcp:no_client_cert", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* GCP - with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_tls, "gcp", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "HTTP status=404"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* GCP - named with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey(client_encryption_with_names, "gcp:with_tls", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, mongocrypt_errno, "HTTP status=404"); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* GCP - expired. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey(client_encryption_expired, "gcp", dkopts, &keyid, &error); ASSERT_EXPIRED(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* GCP - invalid hostname. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey( dkopts, tmp_bson("{ 'projectId': 'pid', 'location': 'l', 'keyRing': 'kr', " "'keyName': 'kn' }")); res = mongoc_client_encryption_create_datakey(client_encryption_invalid_hostname, "gcp", dkopts, &keyid, &error); ASSERT_INVALID_HOSTNAME(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* Case 4: KMIP - no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey(client_encryption_no_client_cert, "kmip", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* KMIP - named with no client cert. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey( client_encryption_with_names, "kmip:no_client_cert", dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, ""); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* KMIP - with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey(client_encryption_with_tls, "kmip", dkopts, &keyid, &error); ASSERT_OR_PRINT(res, error); bson_value_destroy(&keyid); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* KMIP - named with TLS. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey(client_encryption_with_names, "kmip:with_tls", dkopts, &keyid, &error); ASSERT_OR_PRINT(res, error); bson_value_destroy(&keyid); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* KMIP - expired. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey(client_encryption_expired, "kmip", dkopts, &keyid, &error); ASSERT_EXPIRED(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); /* KMIP - invalid hostname. */ memset(&error, 0, sizeof(bson_error_t)); dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, tmp_bson("{}")); res = mongoc_client_encryption_create_datakey(client_encryption_invalid_hostname, "kmip", dkopts, &keyid, &error); ASSERT_INVALID_HOSTNAME(error); ASSERT(!res); mongoc_client_encryption_datakey_opts_destroy(dkopts); mongoc_client_encryption_destroy(client_encryption_with_names); mongoc_client_encryption_destroy(client_encryption_invalid_hostname); mongoc_client_encryption_destroy(client_encryption_expired); mongoc_client_encryption_destroy(client_encryption_with_tls); mongoc_client_encryption_destroy(client_encryption_no_client_cert); mongoc_client_destroy(keyvault_client); } static void test_kms_tls_options_extra_rejected(void *unused) { mongoc_client_encryption_t *ce; mongoc_client_encryption_opts_t *ce_opts; mongoc_client_t *keyvault_client; bson_error_t error; bson_t *kms_providers = tmp_bson("{'aws': {'accessKeyId': 'foo', 'secretAccessKey': 'bar'}}"); BSON_UNUSED(unused); keyvault_client = test_framework_new_default_client(); /* Test that the "local" KMS provider is rejected. */ ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, keyvault_client); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tmp_bson("{'local': {'tlsCaFile': 'ca.pem'}}")); ce = mongoc_client_encryption_new(ce_opts, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Cannot configure TLS options for KMS provider: local"); ASSERT(NULL == ce); mongoc_client_encryption_opts_destroy(ce_opts); /* Test that insecure TLS options are rejected. */ memset(&error, 0, sizeof(bson_error_t)); ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, keyvault_client); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tmp_bson("{'aws': {'tlsInsecure': true}}")); ce = mongoc_client_encryption_new(ce_opts, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error setting TLS option tlsInsecure for aws. " "Insecure TLS options prohibited"); ASSERT(NULL == ce); mongoc_client_encryption_opts_destroy(ce_opts); /* Test that extra TLS options are rejected. */ memset(&error, 0, sizeof(bson_error_t)); ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, keyvault_client); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tmp_bson("{'aws': {'extra': true}}")); ce = mongoc_client_encryption_new(ce_opts, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error setting TLS option extra for aws. Insecure " "TLS options prohibited"); ASSERT(NULL == ce); mongoc_client_encryption_opts_destroy(ce_opts); /* Test that TLS options for duplicate providers are rejected. */ memset(&error, 0, sizeof(bson_error_t)); ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, keyvault_client); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts( ce_opts, tmp_bson("{'aws': {'tlsCAFile': 'foo.pem'}, 'aws': {'tlsCAFile': 'foo.pem'}}")); ce = mongoc_client_encryption_new(ce_opts, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "Error parsing duplicate TLS options for aws"); ASSERT(NULL == ce); mongoc_client_encryption_opts_destroy(ce_opts); /* Test that tlsDisableOCSPEndpointCheck may be set. */ memset(&error, 0, sizeof(bson_error_t)); ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, keyvault_client); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts( ce_opts, tmp_bson("{'aws': {'%s': true}}", MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK)); ce = mongoc_client_encryption_new(ce_opts, &error); ASSERT_OR_PRINT(ce, error); mongoc_client_encryption_destroy(ce); mongoc_client_encryption_opts_destroy(ce_opts); mongoc_client_destroy(keyvault_client); } static const char *failpoint_server_ip = "127.0.0.1"; static const int failpoint_server_port = 9003; static void reset_failpoints(mongoc_ssl_opt_t *ssl_opts) { mongoc_http_request_t req; mongoc_http_response_t res; bool r; bson_error_t error = {0}; _mongoc_http_request_init(&req); _mongoc_http_response_init(&res); req.method = "POST"; req.host = failpoint_server_ip; req.port = failpoint_server_port; req.path = "/reset"; r = _mongoc_http_send(&req, mlib_expires_after(mlib_duration(10, s)), true, ssl_opts, &res, &error); ASSERT_OR_PRINT(r, error); _mongoc_http_response_cleanup(&res); } static void set_retry_failpoint(mongoc_ssl_opt_t *ssl_opts, bool network, uint32_t count) { mongoc_http_request_t req; mongoc_http_response_t res; bool r; bson_error_t error = {0}; _mongoc_http_request_init(&req); _mongoc_http_response_init(&res); req.method = "POST"; req.host = failpoint_server_ip; req.port = failpoint_server_port; if (network) { req.path = "/set_failpoint/network"; } else { req.path = "/set_failpoint/http"; } req.extra_headers = "Content-Type: application/json\r\n"; char count_json[25]; sprintf(count_json, "{\"count\": %" PRIu32 "}", count); req.body = count_json; req.body_len = strlen(count_json); r = _mongoc_http_send(&req, mlib_expires_after(mlib_duration(10, s)), true, ssl_opts, &res, &error); ASSERT_OR_PRINT(r, error); _mongoc_http_response_cleanup(&res); } /* ee_fixture is a fixture for the Explicit Encryption prose test. */ typedef struct { bson_value_t key1ID; mongoc_client_t *keyVaultClient; mongoc_client_encryption_t *clientEncryption; mongoc_client_t *encryptedClient; mongoc_collection_t *encryptedColl; } ee_fixture; static ee_fixture * explicit_encryption_setup_full(const char *encrypted_fields_path, const char *key_path) { ee_fixture *eef = (ee_fixture *)bson_malloc0(sizeof(ee_fixture)); bson_t *encryptedFields = get_bson_from_json_file(encrypted_fields_path); bson_t *key1Document = get_bson_from_json_file(key_path); mongoc_client_t *setupClient = test_framework_new_default_client(); /* Read the ``"_id"`` field of ``key1Document`` as ``key1ID``. */ { bson_iter_t iter; const bson_value_t *value; ASSERT(bson_iter_init_find(&iter, key1Document, "_id")); value = bson_iter_value(&iter); bson_value_copy(value, &eef->key1ID); } /* Drop and create the collection ``db.explicit_encryption`` using * ``encryptedFields`` as an option. */ { mongoc_database_t *db = mongoc_client_get_database(setupClient, "db"); mongoc_collection_t *coll = mongoc_database_get_collection(db, "explicit_encryption"); bson_error_t error; bson_t *opts; opts = BCON_NEW("encryptedFields", BCON_DOCUMENT(encryptedFields)); if (!mongoc_collection_drop_with_opts(coll, opts, &error)) { if (error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error in drop: %s", error.message); } } mongoc_collection_destroy(coll); coll = mongoc_database_create_collection(db, "explicit_encryption", opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(opts); mongoc_database_destroy(db); } /* Drop and create the collection ``keyvault.datakeys``. */ { mongoc_database_t *db = mongoc_client_get_database(setupClient, "keyvault"); mongoc_collection_t *coll = mongoc_database_get_collection(db, "datakeys"); bson_error_t error; bson_t iopts = BSON_INITIALIZER; mongoc_write_concern_t *wc; if (!mongoc_collection_drop(coll, &error)) { if (error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error in drop: %s", error.message); } } mongoc_collection_destroy(coll); coll = mongoc_database_create_collection(db, "datakeys", NULL /* opts */, &error); ASSERT_OR_PRINT(coll, error); /* Insert keyDocument1 with write concern majority */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_append(wc, &iopts)); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, key1Document, &iopts, NULL /* reply */, &error), error); mongoc_write_concern_destroy(wc); bson_destroy(&iopts); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } eef->keyVaultClient = test_framework_new_default_client(); /* Create a ClientEncryption object named ``clientEncryption`` */ { mongoc_client_encryption_opts_t *ceOpts = mongoc_client_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_client_encryption_opts_set_keyvault_client(ceOpts, eef->keyVaultClient); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kms_providers); eef->clientEncryption = mongoc_client_encryption_new(ceOpts, &error); ASSERT_OR_PRINT(eef->clientEncryption, error); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceOpts); } /* Create a MongoClient named ``encryptedClient``. */ { mongoc_auto_encryption_opts_t *aeOpts = mongoc_auto_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kms_providers); mongoc_auto_encryption_opts_set_bypass_query_analysis(aeOpts, true); eef->encryptedClient = test_framework_new_default_client(); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(eef->encryptedClient, aeOpts, &error), error); bson_destroy(kms_providers); mongoc_auto_encryption_opts_destroy(aeOpts); eef->encryptedColl = mongoc_client_get_collection(eef->encryptedClient, "db", "explicit_encryption"); } mongoc_client_destroy(setupClient); bson_destroy(key1Document); bson_destroy(encryptedFields); return eef; } static ee_fixture * explicit_encryption_setup(void) { return explicit_encryption_setup_full("./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "encryptedFields.json", "./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "key1-document.json"); } static void explicit_encryption_destroy(ee_fixture *eef) { if (!eef) { return; } mongoc_collection_destroy(eef->encryptedColl); mongoc_client_destroy(eef->encryptedClient); mongoc_client_encryption_destroy(eef->clientEncryption); mongoc_client_destroy(eef->keyVaultClient); bson_value_destroy(&eef->key1ID); bson_free(eef); } /* ree_fixture is a fixture for the Range Explicit Encryption prose test. */ typedef struct { bson_value_t key1ID; mongoc_client_t *keyVaultClient; mongoc_client_encryption_t *clientEncryption; mongoc_client_t *encryptedClient; mongoc_collection_t *encryptedColl; // typeStr is DoublePrecision, DoubleNoPrecision, Date, Int, or Long const char *typeStr; char *fieldName; bson_value_t zero; bson_value_t six; bson_value_t thirty; bson_value_t twoHundred; bson_value_t twoHundredOne; mongoc_client_encryption_encrypt_range_opts_t *ro; } ree_fixture; static ree_fixture * range_explicit_encryption_setup(const char *typeStr) { ree_fixture *reef = (ree_fixture *)bson_malloc0(sizeof(ree_fixture)); reef->typeStr = typeStr; reef->fieldName = bson_strdup_printf("encrypted%s", typeStr); char *filepath = bson_strdup_printf("./src/libmongoc/tests/client_side_encryption_prose/" "explicit_encryption/range-encryptedFields-%s.json", typeStr); bson_t *encryptedFields = get_bson_from_json_file(filepath); ASSERT(encryptedFields); bson_free(filepath); bson_t *key1Document = get_bson_from_json_file("./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "key1-document.json"); ASSERT(key1Document); mongoc_client_t *setupClient = test_framework_new_default_client(); /* Read the ``"_id"`` field of ``key1Document`` as ``key1ID``. */ { bson_iter_t iter; const bson_value_t *value; ASSERT(bson_iter_init_find(&iter, key1Document, "_id")); value = bson_iter_value(&iter); bson_value_copy(value, &reef->key1ID); } /* Drop and create the collection ``db.explicit_encryption`` using * ``encryptedFields`` as an option. */ { mongoc_database_t *db = mongoc_client_get_database(setupClient, "db"); mongoc_collection_t *coll = mongoc_database_get_collection(db, "explicit_encryption"); bson_error_t error; bson_t *opts; opts = BCON_NEW("encryptedFields", BCON_DOCUMENT(encryptedFields)); if (!mongoc_collection_drop_with_opts(coll, opts, &error)) { if (error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error in drop: %s", error.message); } } mongoc_collection_destroy(coll); coll = mongoc_database_create_collection(db, "explicit_encryption", opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(opts); mongoc_database_destroy(db); } /* Drop and create the collection ``keyvault.datakeys``. */ { mongoc_database_t *db = mongoc_client_get_database(setupClient, "keyvault"); mongoc_collection_t *coll = mongoc_database_get_collection(db, "datakeys"); bson_error_t error; bson_t iopts = BSON_INITIALIZER; mongoc_write_concern_t *wc; if (!mongoc_collection_drop(coll, &error)) { if (error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error in drop: %s", error.message); } } mongoc_collection_destroy(coll); coll = mongoc_database_create_collection(db, "datakeys", NULL /* opts */, &error); ASSERT_OR_PRINT(coll, error); /* Insert keyDocument1 with write concern majority */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_append(wc, &iopts)); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, key1Document, &iopts, NULL /* reply */, &error), error); mongoc_write_concern_destroy(wc); bson_destroy(&iopts); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } reef->keyVaultClient = test_framework_new_default_client(); /* Create a ClientEncryption object named ``clientEncryption`` */ { mongoc_client_encryption_opts_t *ceOpts = mongoc_client_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_client_encryption_opts_set_keyvault_client(ceOpts, reef->keyVaultClient); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kms_providers); reef->clientEncryption = mongoc_client_encryption_new(ceOpts, &error); ASSERT_OR_PRINT(reef->clientEncryption, error); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceOpts); } /* Create a MongoClient named ``encryptedClient``. */ { mongoc_auto_encryption_opts_t *aeOpts = mongoc_auto_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kms_providers); mongoc_auto_encryption_opts_set_bypass_query_analysis(aeOpts, true); reef->encryptedClient = test_framework_new_default_client(); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(reef->encryptedClient, aeOpts, &error), error); bson_destroy(kms_providers); mongoc_auto_encryption_opts_destroy(aeOpts); reef->encryptedColl = mongoc_client_get_collection(reef->encryptedClient, "db", "explicit_encryption"); } /* Create the values 0, 6, 30, 200, and 201 as BSON values. */ { if (0 == strcmp("DecimalNoPrecision", typeStr) || 0 == strcmp("DecimalPrecision", typeStr)) { reef->zero.value_type = BSON_TYPE_DECIMAL128; ASSERT(bson_decimal128_from_string("0", &reef->zero.value.v_decimal128)); reef->six.value_type = BSON_TYPE_DECIMAL128; ASSERT(bson_decimal128_from_string("6", &reef->six.value.v_decimal128)); reef->thirty.value_type = BSON_TYPE_DECIMAL128; ASSERT(bson_decimal128_from_string("30", &reef->thirty.value.v_decimal128)); reef->twoHundred.value_type = BSON_TYPE_DECIMAL128; ASSERT(bson_decimal128_from_string("200", &reef->twoHundred.value.v_decimal128)); reef->twoHundredOne.value_type = BSON_TYPE_DECIMAL128; ASSERT(bson_decimal128_from_string("201", &reef->twoHundredOne.value.v_decimal128)); } else if (0 == strcmp("DoubleNoPrecision", typeStr) || 0 == strcmp("DoublePrecision", typeStr)) { reef->zero.value_type = BSON_TYPE_DOUBLE; reef->zero.value.v_double = 0; reef->six.value_type = BSON_TYPE_DOUBLE; reef->six.value.v_double = 6; reef->thirty.value_type = BSON_TYPE_DOUBLE; reef->thirty.value.v_double = 30; reef->twoHundred.value_type = BSON_TYPE_DOUBLE; reef->twoHundred.value.v_double = 200; reef->twoHundredOne.value_type = BSON_TYPE_DOUBLE; reef->twoHundredOne.value.v_double = 201; } else if (0 == strcmp("Date", typeStr)) { reef->zero.value_type = BSON_TYPE_DATE_TIME; reef->zero.value.v_datetime = 0; reef->six.value_type = BSON_TYPE_DATE_TIME; reef->six.value.v_datetime = 6; reef->thirty.value_type = BSON_TYPE_DATE_TIME; reef->thirty.value.v_datetime = 30; reef->twoHundred.value_type = BSON_TYPE_DATE_TIME; reef->twoHundred.value.v_datetime = 200; reef->twoHundredOne.value_type = BSON_TYPE_DATE_TIME; reef->twoHundredOne.value.v_datetime = 201; } else if (0 == strcmp("Int", typeStr)) { reef->zero.value_type = BSON_TYPE_INT32; reef->zero.value.v_int32 = 0; reef->six.value_type = BSON_TYPE_INT32; reef->six.value.v_int32 = 6; reef->thirty.value_type = BSON_TYPE_INT32; reef->thirty.value.v_int32 = 30; reef->twoHundred.value_type = BSON_TYPE_INT32; reef->twoHundred.value.v_int32 = 200; reef->twoHundredOne.value_type = BSON_TYPE_INT32; reef->twoHundredOne.value.v_int32 = 201; } else if (0 == strcmp("Long", typeStr)) { reef->zero.value_type = BSON_TYPE_INT64; reef->zero.value.v_int64 = 0; reef->six.value_type = BSON_TYPE_INT64; reef->six.value.v_int64 = 6; reef->thirty.value_type = BSON_TYPE_INT64; reef->thirty.value.v_int64 = 30; reef->twoHundred.value_type = BSON_TYPE_INT64; reef->twoHundred.value.v_int64 = 200; reef->twoHundredOne.value_type = BSON_TYPE_INT64; reef->twoHundredOne.value.v_int64 = 201; } else { test_error("Unexpected type string: %s\n", typeStr); } } /* Create the RangeOpts depending on the type. */ { reef->ro = mongoc_client_encryption_encrypt_range_opts_new(); mongoc_client_encryption_encrypt_range_opts_set_sparsity(reef->ro, 1); mongoc_client_encryption_encrypt_range_opts_set_trim_factor(reef->ro, 1); if (0 == strcmp("DoubleNoPrecision", typeStr) || 0 == strcmp("DecimalNoPrecision", typeStr)) { // DoubleNoPrecision does not need more range options. } else if (0 == strcmp("DoublePrecision", typeStr) || 0 == strcmp("DecimalPrecision", typeStr)) { mongoc_client_encryption_encrypt_range_opts_set_min(reef->ro, &reef->zero); mongoc_client_encryption_encrypt_range_opts_set_max(reef->ro, &reef->twoHundred); mongoc_client_encryption_encrypt_range_opts_set_precision(reef->ro, 2); } else if (0 == strcmp("Date", typeStr) || 0 == strcmp("Int", typeStr) || 0 == strcmp("Long", typeStr)) { mongoc_client_encryption_encrypt_range_opts_set_min(reef->ro, &reef->zero); mongoc_client_encryption_encrypt_range_opts_set_max(reef->ro, &reef->twoHundred); } else { test_error("Unexpected type string: %s\n", typeStr); } } /* Encrypt and insert 0, 6, 30, and 200. */ { mongoc_client_encryption_encrypt_opts_t *eo; bool ok; bson_error_t error; eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); bson_value_t *values[4]; values[0] = &reef->zero; values[1] = &reef->six; values[2] = &reef->thirty; values[3] = &reef->twoHundred; for (size_t i = 0; i < sizeof values / sizeof values[0]; i++) { bson_value_t *value = values[i]; bson_value_t ciphertext; ok = mongoc_client_encryption_encrypt(reef->clientEncryption, value, eo, &ciphertext, &error); ASSERT_OR_PRINT(ok, error); bson_t *doc = bson_new(); BSON_APPEND_INT32(doc, "_id", (int32_t)i); BSON_APPEND_VALUE(doc, reef->fieldName, &ciphertext); ok = mongoc_collection_insert_one(reef->encryptedColl, doc, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(doc); bson_value_destroy(&ciphertext); } mongoc_client_encryption_encrypt_opts_destroy(eo); } mongoc_client_destroy(setupClient); bson_destroy(key1Document); bson_destroy(encryptedFields); return reef; } static void range_explicit_encryption_destroy(ree_fixture *reef) { if (!reef) { return; } bson_free(reef->fieldName); mongoc_client_encryption_encrypt_range_opts_destroy(reef->ro); mongoc_collection_destroy(reef->encryptedColl); mongoc_client_destroy(reef->encryptedClient); mongoc_client_encryption_destroy(reef->clientEncryption); mongoc_client_destroy(reef->keyVaultClient); bson_value_destroy(&reef->key1ID); bson_free(reef); } // range_explicit_encryption_assert_cursor_results asserts that the encrypted // field in documents returned by the cursor have match a list of values. The // variadic args are a list of const bson_value_t *. The variadic args must be // NULL terminated. static void range_explicit_encryption_assert_cursor_results(ree_fixture *reef, mongoc_cursor_t *cursor, ...) { const bson_t *got; va_list args; bson_error_t error; va_start(args, cursor); while (true) { const bson_value_t *expect = va_arg(args, const bson_value_t *); if (!expect) { break; } if (!mongoc_cursor_next(cursor, &got)) { if (mongoc_cursor_error(cursor, &error)) { test_error("Got unexpected error in mongoc_cursor_next: %s", error.message); } test_error("Expected document with value: %s but got end of cursor", bson_value_to_str(expect)); } bson_iter_t goti; const bson_value_t *gotv; if (!bson_iter_init_find(&goti, got, reef->fieldName)) { test_error( "Expected to find field %s, but got %s", reef->fieldName, bson_as_canonical_extended_json(got, NULL)); } gotv = bson_iter_value(&goti); ASSERT_BSONVALUE_EQ(expect, gotv); } va_end(args); if (mongoc_cursor_next(cursor, &got)) { test_error("Expected end of cursor, but got extra document: %s", bson_as_canonical_extended_json(got, NULL)); } } static void test_range_explicit_encryption_case1(void *ctx) { // Case 1: can decrypt a payload const char *typeStr = (const char *)ctx; mongoc_client_encryption_encrypt_opts_t *eo; ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; bson_value_t insertPayload; bson_value_t decrypted; eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); /* Use clientEncryption.encrypt() to encrypt the value 6. */ ok = mongoc_client_encryption_encrypt(reef->clientEncryption, &reef->six, eo, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); /* Use clientEncryption to decrypt insertPayload. Assert the returned value equals 6. */ ok = mongoc_client_encryption_decrypt(reef->clientEncryption, &insertPayload, &decrypted, &error); ASSERT_OR_PRINT(ok, error); ASSERT_BSONVALUE_EQ(&decrypted, &reef->six); bson_value_destroy(&insertPayload); mongoc_client_encryption_encrypt_opts_destroy(eo); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case2(void *ctx) { // Case 2: can find encrypted range and return the maximum const char *typeStr = (const char *)ctx; ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_t findPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); bsonBuildDecl(expr, kv("$and", array( // doc(kv(reef->fieldName, // doc(kv("$gte", value(reef->six))))), // doc(kv(reef->fieldName, doc(kv("$lte", value(reef->twoHundred)))))))); ok = mongoc_client_encryption_encrypt_expression(reef->clientEncryption, &expr, eo, &findPayload, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(&expr); mongoc_client_encryption_encrypt_opts_destroy(eo); } // Query and check results. { bson_t *opts = tmp_bson("{'sort': { '_id': 1 }}"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(reef->encryptedColl, &findPayload, opts, NULL /* read_prefs */); range_explicit_encryption_assert_cursor_results(reef, cursor, &reef->six, &reef->thirty, &reef->twoHundred, NULL); mongoc_cursor_destroy(cursor); } bson_destroy(&findPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case3(void *ctx) { // Case 3: can find encrypted range and return the minimum const char *typeStr = (const char *)ctx; ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_t findPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); bsonBuildDecl(expr, kv("$and", array( // doc(kv(reef->fieldName, // doc(kv("$gte", value(reef->zero))))), // doc(kv(reef->fieldName, doc(kv("$lte", value(reef->six)))))))); ok = mongoc_client_encryption_encrypt_expression(reef->clientEncryption, &expr, eo, &findPayload, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(&expr); mongoc_client_encryption_encrypt_opts_destroy(eo); } // Query and check results. { bson_t *opts = tmp_bson("{'sort': { '_id': 1 }}"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(reef->encryptedColl, &findPayload, opts, NULL /* read_prefs */); range_explicit_encryption_assert_cursor_results(reef, cursor, &reef->zero, &reef->six, NULL); mongoc_cursor_destroy(cursor); } bson_destroy(&findPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case4(void *ctx) { // Case 4: can find encrypted range with an open range query const char *typeStr = (const char *)ctx; ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_t findPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); bsonBuildDecl(expr, kv("$and", array( // doc(kv(reef->fieldName, // doc(kv("$gt", value(reef->thirty))))) // ))); ok = mongoc_client_encryption_encrypt_expression(reef->clientEncryption, &expr, eo, &findPayload, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(&expr); mongoc_client_encryption_encrypt_opts_destroy(eo); } // Query and check results. { bson_t *opts = tmp_bson("{'sort': { '_id': 1 }}"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(reef->encryptedColl, &findPayload, opts, NULL /* read_prefs */); range_explicit_encryption_assert_cursor_results(reef, cursor, &reef->twoHundred, NULL); mongoc_cursor_destroy(cursor); } bson_destroy(&findPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case5(void *ctx) { // Case 5: can run an aggregation expression inside $expr const char *typeStr = (const char *)ctx; ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_t findPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); char *fieldPath = bson_strdup_printf("$%s", reef->fieldName); // Encrypt this: // {'$and': [ { '$lt': [ '$encrypted', 30 ] } ] } } bsonBuildDecl(expr, kv("$and", array( // doc(kv("$lt", // array(cstr(fieldPath), value(reef->thirty))))))); ok = mongoc_client_encryption_encrypt_expression(reef->clientEncryption, &expr, eo, &findPayload, &error); ASSERT_OR_PRINT(ok, error); bson_free(fieldPath); bson_destroy(&expr); mongoc_client_encryption_encrypt_opts_destroy(eo); } // Query and check results. { bson_t *opts = tmp_bson("{'sort': { '_id': 1 }}"); bsonBuildDecl(filter, kv("$expr", bson(findPayload))); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(reef->encryptedColl, &filter, opts, NULL /* read_prefs */); range_explicit_encryption_assert_cursor_results(reef, cursor, &reef->zero, &reef->six, NULL); bson_destroy(&filter); mongoc_cursor_destroy(cursor); } bson_destroy(&findPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case6(void *ctx) { // Case 6: encrypting a document greater than the maximum errors const char *typeStr = (const char *)ctx; // This test case should be skipped if the encrypted field is // encryptedDoubleNoPrecision or encryptedDecimalNoPrecision. if (0 == strcmp(typeStr, "DoubleNoPrecision") || 0 == strcmp(typeStr, "DecimalNoPrecision")) { MONGOC_DEBUG("skipping test"); return; } ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_value_t insertPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); ok = mongoc_client_encryption_encrypt(reef->clientEncryption, &reef->twoHundredOne, eo, &insertPayload, &error); ASSERT(!ok); mongoc_client_encryption_encrypt_opts_destroy(eo); } bson_value_destroy(&insertPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case7(void *ctx) { // Case 7: encrypting a document of a different type errors const char *typeStr = (const char *)ctx; // This test case should be skipped if the encrypted field is // encryptedDoubleNoPrecision or encryptedDecimalNoPrecision. if (0 == strcmp(typeStr, "DoubleNoPrecision") || 0 == strcmp(typeStr, "DecimalNoPrecision")) { MONGOC_DEBUG("skipping test"); return; } ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_value_t insertPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); bson_value_t wrongType; if (0 == strcmp("encryptedInt", reef->fieldName)) { wrongType.value_type = BSON_TYPE_DOUBLE; wrongType.value.v_double = 6; } else { wrongType.value_type = BSON_TYPE_INT32; wrongType.value.v_int32 = 6; } ok = mongoc_client_encryption_encrypt(reef->clientEncryption, &wrongType, eo, &insertPayload, &error); ASSERT(!ok); mongoc_client_encryption_encrypt_opts_destroy(eo); } bson_value_destroy(&insertPayload); range_explicit_encryption_destroy(reef); } static void test_range_explicit_encryption_case8(void *ctx) { // Case 8: setting precision errors if the type is not a double const char *typeStr = (const char *)ctx; // This test case should be skipped if the encrypted field is // encryptedDoublePrecision or encryptedDoubleNoPrecision or // encryptedDecimalPrecision or encryptedDecimalNoPrecision. if (0 == strcmp(typeStr, "DoubleNoPrecision") || 0 == strcmp(typeStr, "DoublePrecision") || 0 == strcmp(typeStr, "DecimalPrecision") || 0 == strcmp(typeStr, "DecimalNoPrecision")) { MONGOC_DEBUG("skipping test"); return; } ree_fixture *reef = range_explicit_encryption_setup(typeStr); bool ok; bson_error_t error; // Encrypt. bson_value_t insertPayload; { mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &reef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_range_opts_set_precision(reef->ro, 2); mongoc_client_encryption_encrypt_opts_set_range_opts(eo, reef->ro); ok = mongoc_client_encryption_encrypt(reef->clientEncryption, &reef->six, eo, &insertPayload, &error); ASSERT(!ok); mongoc_client_encryption_encrypt_opts_destroy(eo); } bson_value_destroy(&insertPayload); range_explicit_encryption_destroy(reef); } static void test_explicit_encryption_case1(void *unused) { /* Case 1: can insert encrypted indexed and find */ bson_error_t error; bool ok; mongoc_client_encryption_encrypt_opts_t *eopts; bson_value_t plaintext = {0}; ee_fixture *eef = explicit_encryption_setup(); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "encrypted indexed value"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); /* Use ``encryptedClient`` to insert the document ``{ "encryptedIndexed": * }``. */ { bson_value_t insertPayload; bson_t to_insert = BSON_INITIALIZER; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 0); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&to_insert, "encryptedIndexed", &insertPayload)); ok = mongoc_collection_insert_one(eef->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_value_destroy(&insertPayload); bson_destroy(&to_insert); mongoc_client_encryption_encrypt_opts_destroy(eopts); } /* Use ``encryptedClient`` to run a "find" operation on the * ``db.explicit_encryption`` collection with the filter ``{ * "encryptedIndexed": }``. */ { bson_value_t findPayload; mongoc_cursor_t *cursor; bson_t filter = BSON_INITIALIZER; const bson_t *got; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_query_type(eopts, MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 0); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &findPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&filter, "encryptedIndexed", &findPayload)); cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &filter, NULL /* opts */, NULL /* read_prefs */); ASSERT(mongoc_cursor_next(cursor, &got)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(got, "{ 'encryptedIndexed': 'encrypted indexed value' }"); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected one document to be returned, got more than one"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); mongoc_client_encryption_encrypt_opts_destroy(eopts); bson_destroy(&filter); } explicit_encryption_destroy(eef); } static void test_explicit_encryption_case2(void *unused) { /* Case 2: can insert encrypted indexed and find with non-zero contention */ bson_error_t error; bool ok; mongoc_client_encryption_encrypt_opts_t *eopts; bson_value_t plaintext = {0}; int i = 0; ee_fixture *eef = explicit_encryption_setup(); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "encrypted indexed value"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); /* Insert 10 documents ``{ "encryptedIndexed": }`` with * contention factor 10. */ for (i = 0; i < 10; i++) { bson_value_t insertPayload; bson_t to_insert = BSON_INITIALIZER; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 10); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&to_insert, "encryptedIndexed", &insertPayload)); ok = mongoc_collection_insert_one(eef->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_value_destroy(&insertPayload); bson_destroy(&to_insert); mongoc_client_encryption_encrypt_opts_destroy(eopts); } /* Find with contention factor of 0. Expect < 10 documents returned. */ { bson_value_t findPayload; mongoc_cursor_t *cursor; bson_t filter = BSON_INITIALIZER; const bson_t *got; int got_count = 0; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_query_type(eopts, MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 0); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &findPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&filter, "encryptedIndexed", &findPayload)); cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &filter, NULL /* opts */, NULL /* read_prefs */); while (mongoc_cursor_next(cursor, &got)) { got_count++; ASSERT_MATCH(got, "{ 'encryptedIndexed': 'encrypted indexed value' }"); } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(got_count, <, 10); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); mongoc_client_encryption_encrypt_opts_destroy(eopts); bson_destroy(&filter); } /* Find with contention factor of 10. Expect all 10 documents returned. */ { bson_value_t findPayload; mongoc_cursor_t *cursor; bson_t filter = BSON_INITIALIZER; const bson_t *got; int got_count = 0; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_query_type(eopts, MONGOC_ENCRYPT_QUERY_TYPE_EQUALITY); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 10); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &findPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&filter, "encryptedIndexed", &findPayload)); cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &filter, NULL /* opts */, NULL /* read_prefs */); while (mongoc_cursor_next(cursor, &got)) { got_count++; ASSERT_MATCH(got, "{ 'encryptedIndexed': 'encrypted indexed value' }"); } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(got_count, ==, 10); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); mongoc_client_encryption_encrypt_opts_destroy(eopts); bson_destroy(&filter); } explicit_encryption_destroy(eef); } static void test_explicit_encryption_case3(void *unused) { /* Case 3: can insert encrypted unindexed */ bson_error_t error; bool ok; mongoc_client_encryption_encrypt_opts_t *eopts; bson_value_t plaintext = {0}; ee_fixture *eef = explicit_encryption_setup(); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "encrypted unindexed value"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); /* Use ``encryptedClient`` to insert the document ``{ "_id": 1, * "encryptedUnindexed": }``. */ { bson_value_t insertPayload; bson_t to_insert = BSON_INITIALIZER; eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_UNINDEXED); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_INT32(&to_insert, "_id", 1)); ASSERT(BSON_APPEND_VALUE(&to_insert, "encryptedUnindexed", &insertPayload)); ok = mongoc_collection_insert_one(eef->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_value_destroy(&insertPayload); bson_destroy(&to_insert); mongoc_client_encryption_encrypt_opts_destroy(eopts); } /* Use ``encryptedClient`` to run a "find" operation on the * ``db.explicit_encryption`` collection with the filter ``{ "_id": 1 }``. */ { mongoc_cursor_t *cursor; bson_t filter = BSON_INITIALIZER; const bson_t *got; ASSERT(BSON_APPEND_INT32(&filter, "_id", 1)); cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &filter, NULL /* opts */, NULL /* read_prefs */); ASSERT(mongoc_cursor_next(cursor, &got)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(got, "{ 'encryptedUnindexed': 'encrypted unindexed value' }"); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected one document to be returned, got more than one"); mongoc_cursor_destroy(cursor); bson_destroy(&filter); } explicit_encryption_destroy(eef); } static void test_explicit_encryption_case4(void *unused) { /* Case 4: can roundtrip encrypted indexed */ bson_error_t error; bool ok; mongoc_client_encryption_encrypt_opts_t *eopts; bson_value_t plaintext = {0}; bson_value_t payload; ee_fixture *eef = explicit_encryption_setup(); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "encrypted indexed value"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); /* Use ``clientEncryption`` to encrypt the value "encrypted indexed value". */ { eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_INDEXED); mongoc_client_encryption_encrypt_opts_set_contention_factor(eopts, 0); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &payload, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_encryption_encrypt_opts_destroy(eopts); } /* Use ``clientEncryption`` to decrypt ``payload`` */ { bson_value_t got; ok = mongoc_client_encryption_decrypt(eef->clientEncryption, &payload, &got, &error); ASSERT_OR_PRINT(ok, error); ASSERT(got.value_type == BSON_TYPE_UTF8); ASSERT_CMPSTR(got.value.v_utf8.str, "encrypted indexed value"); bson_value_destroy(&got); } bson_value_destroy(&payload); explicit_encryption_destroy(eef); } static void test_explicit_encryption_case5(void *unused) { /* Case 5: can roundtrip encrypted unindexed */ bson_error_t error; bool ok; mongoc_client_encryption_encrypt_opts_t *eopts; bson_value_t plaintext = {0}; bson_value_t payload; ee_fixture *eef = explicit_encryption_setup(); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "encrypted unindexed value"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); /* Use ``clientEncryption`` to encrypt the value "encrypted unindexed value". */ { eopts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eopts, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eopts, MONGOC_ENCRYPT_ALGORITHM_UNINDEXED); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eopts, &payload, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_encryption_encrypt_opts_destroy(eopts); } /* Use ``clientEncryption`` to decrypt ``payload`` */ { bson_value_t got; ok = mongoc_client_encryption_decrypt(eef->clientEncryption, &payload, &got, &error); ASSERT_OR_PRINT(ok, error); ASSERT(got.value_type == BSON_TYPE_UTF8); ASSERT_CMPSTR(got.value.v_utf8.str, "encrypted unindexed value"); bson_value_destroy(&got); } bson_value_destroy(&payload); explicit_encryption_destroy(eef); } static void test_explicit_encryption_text(void *unused) { bson_error_t error; bool ok; bson_value_t plaintext = {0}; ee_fixture *eef = explicit_encryption_setup_full("./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "encryptedFields-prefix-suffix.json", "./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "key1-document.json"); BSON_UNUSED(unused); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "foobarbaz"; plaintext.value.v_utf8.len = (uint32_t)strlen(plaintext.value.v_utf8.str); mongoc_client_encryption_encrypt_text_prefix_opts_t *popts = mongoc_client_encryption_encrypt_text_prefix_opts_new(); mongoc_client_encryption_encrypt_text_prefix_opts_set_str_max_query_length(popts, 10); mongoc_client_encryption_encrypt_text_prefix_opts_set_str_min_query_length(popts, 2); mongoc_client_encryption_encrypt_text_suffix_opts_t *sopts = mongoc_client_encryption_encrypt_text_suffix_opts_new(); mongoc_client_encryption_encrypt_text_suffix_opts_set_str_max_query_length(sopts, 10); mongoc_client_encryption_encrypt_text_suffix_opts_set_str_min_query_length(sopts, 2); mongoc_client_encryption_encrypt_text_substring_opts_t *ssopts = mongoc_client_encryption_encrypt_text_substring_opts_new(); mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_length(ssopts, 10); mongoc_client_encryption_encrypt_text_substring_opts_set_str_max_query_length(ssopts, 10); mongoc_client_encryption_encrypt_text_substring_opts_set_str_min_query_length(ssopts, 2); /* Prefix and suffix tests */ /* Insert 'foobarbaz' with both prefix and suffix indexing */ { bson_value_t insertPayload; bson_t to_insert = BSON_INITIALIZER; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_prefix(topts, popts); mongoc_client_encryption_encrypt_text_opts_set_suffix(topts, sopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&to_insert, "encryptedText", &insertPayload)); ok = mongoc_collection_insert_one(eef->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_value_destroy(&insertPayload); bson_destroy(&to_insert); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Find the document using the 'foo' prefix */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_PREFIXPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_prefix(topts, popts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "foo"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrStartsWith", doc(kv("input", cstr("$encryptedText")), kv("prefix", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(mongoc_cursor_next(cursor, &got)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(got, "{ 'encryptedText': 'foobarbaz' }"); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected one document to be returned, got more than one"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Find the document using the 'baz' suffix */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_SUFFIXPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_suffix(topts, sopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "baz"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrEndsWith", doc(kv("input", cstr("$encryptedText")), kv("suffix", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(mongoc_cursor_next(cursor, &got)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(got, "{ 'encryptedText': 'foobarbaz' }"); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected one document to be returned, got more than one"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Ensure querying for a 'foo' suffix returns no documents */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_SUFFIXPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_suffix(topts, sopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "foo"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrEndsWith", doc(kv("input", cstr("$encryptedText")), kv("suffix", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected no documents to be returned, got some"); mongoc_cursor_next(cursor, &got); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Ensure querying for a 'baz' prefix returns no documents */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_PREFIXPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_prefix(topts, popts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "baz"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrStartsWith", doc(kv("input", cstr("$encryptedText")), kv("prefix", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected no documents to be returned, got some"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Substring tests */ explicit_encryption_destroy(eef); eef = explicit_encryption_setup_full("./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "encryptedFields-substring.json", "./src/libmongoc/tests/client_side_encryption_prose/explicit_encryption/" "key1-document.json"); /* Insert 'foobarbaz' with substring indexing */ { bson_value_t insertPayload; bson_t to_insert = BSON_INITIALIZER; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_substring(topts, ssopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "foobarbaz"; plaintext.value.v_utf8.len = 9; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &insertPayload, &error); ASSERT_OR_PRINT(ok, error); ASSERT(BSON_APPEND_VALUE(&to_insert, "encryptedText", &insertPayload)); ok = mongoc_collection_insert_one(eef->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_value_destroy(&insertPayload); bson_destroy(&to_insert); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Find the document using the 'bar' substring */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_substring(topts, ssopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "bar"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrContains", doc(kv("input", cstr("$encryptedText")), kv("substring", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(mongoc_cursor_next(cursor, &got)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(got, "{ 'encryptedText': 'foobarbaz' }"); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected one document to be returned, got more than one"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } /* Ensure querying for a 'qux' substring returns no documents */ { bson_value_t findPayload; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &eef->key1ID); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_TEXTPREVIEW); mongoc_client_encryption_encrypt_opts_set_query_type(eo, MONGOC_ENCRYPT_QUERY_TYPE_SUBSTRINGPREVIEW); mongoc_client_encryption_encrypt_opts_set_contention_factor(eo, 0); mongoc_client_encryption_encrypt_text_opts_t *topts = mongoc_client_encryption_encrypt_text_opts_new(); mongoc_client_encryption_encrypt_text_opts_set_substring(topts, ssopts); mongoc_client_encryption_encrypt_text_opts_set_diacritic_sensitive(topts, true); mongoc_client_encryption_encrypt_text_opts_set_case_sensitive(topts, true); mongoc_client_encryption_encrypt_opts_set_text_opts(eo, topts); plaintext.value.v_utf8.str = "qux"; plaintext.value.v_utf8.len = 3; ok = mongoc_client_encryption_encrypt(eef->clientEncryption, &plaintext, eo, &findPayload, &error); bsonBuildDecl( expr, kv("$expr", doc(kv("$encStrContains", doc(kv("input", cstr("$encryptedText")), kv("substring", value(findPayload))))))); ASSERT_OR_PRINT(ok, error); mongoc_cursor_t *cursor; const bson_t *got; cursor = mongoc_collection_find_with_opts(eef->encryptedColl, &expr, NULL /* opts */, NULL /* read_prefs */); ASSERT(!mongoc_cursor_next(cursor, &got) && "expected no documents to be returned, got some"); bson_value_destroy(&findPayload); mongoc_cursor_destroy(cursor); bson_destroy(&expr); mongoc_client_encryption_encrypt_text_opts_destroy(topts); mongoc_client_encryption_encrypt_opts_destroy(eo); } mongoc_client_encryption_encrypt_text_prefix_opts_destroy(popts); mongoc_client_encryption_encrypt_text_suffix_opts_destroy(sopts); mongoc_client_encryption_encrypt_text_substring_opts_destroy(ssopts); explicit_encryption_destroy(eef); } static void _test_unique_index_on_keyaltnames_setup(void (*test_case)(mongoc_client_encryption_t *, const bson_value_t *keyid)) { mongoc_client_t *client = NULL; mongoc_database_t *keyvault = NULL; mongoc_client_encryption_t *client_encryption = NULL; bson_value_t existing_key; bson_error_t error; /* Create a MongoClient object (referred to as client). */ client = test_framework_new_default_client(); keyvault = mongoc_client_get_database(client, "keyvault"); /* Using client, drop the collection keyvault.datakeys. */ { mongoc_collection_t *const datakeys = mongoc_database_get_collection(keyvault, "datakeys"); mongoc_collection_drop(datakeys, &error); mongoc_collection_destroy(datakeys); } /* Using client, create a unique index on keyAltNames with a partial index * filter for only documents where keyAltNames exists. */ { mongoc_collection_t *const datakeys = mongoc_database_get_collection(keyvault, "datakeys"); mongoc_index_model_t *im = mongoc_index_model_new(tmp_bson("{'keyAltNames': 1}"), tmp_bson(BSON_STR({ "name" : "keyAltNames_1", "unique" : true, "partialFilterExpression" : {"keyAltNames" : {"$exists" : true}} }))); bson_t *const command_opts = tmp_bson("{'writeConcern': { 'w': 'majority' }}"); ASSERT_OR_PRINT( mongoc_collection_create_indexes_with_opts(datakeys, &im, 1, command_opts, NULL /* reply */, &error), error); mongoc_index_model_destroy(im); mongoc_collection_destroy(datakeys); } /* Create a ClientEncryption object (referred to as client_encryption) with * client set as the keyVaultClient. */ { mongoc_client_encryption_opts_t *const client_encryption_opts = mongoc_client_encryption_opts_new(); bson_t *const kms_providers = _make_kms_providers(true /* aws */, true /* local */); bson_t *const tls_opts = _make_tls_opts(); mongoc_client_encryption_opts_set_kms_providers(client_encryption_opts, kms_providers); mongoc_client_encryption_opts_set_tls_opts(client_encryption_opts, tls_opts); mongoc_client_encryption_opts_set_keyvault_namespace(client_encryption_opts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(client_encryption_opts, client); client_encryption = mongoc_client_encryption_new(client_encryption_opts, &error); ASSERT_OR_PRINT(client_encryption, error); mongoc_client_encryption_opts_destroy(client_encryption_opts); bson_destroy(kms_providers); bson_destroy(tls_opts); } /* Using client_encryption, create a data key with a local KMS provider * and the keyAltName "def" (referred to as "the existing key"). */ { mongoc_client_encryption_datakey_opts_t *const opts = mongoc_client_encryption_datakey_opts_new(); const char *const keyaltname[] = {"def"}; mongoc_client_encryption_datakey_opts_set_keyaltnames(opts, (char **)keyaltname, 1u); ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(client_encryption, "local", opts, &existing_key, &error), error); mongoc_client_encryption_datakey_opts_destroy(opts); } test_case(client_encryption, &existing_key); mongoc_client_destroy(client); mongoc_database_destroy(keyvault); mongoc_client_encryption_destroy(client_encryption); bson_value_destroy(&existing_key); } static void _test_unique_index_on_keyaltnames_case_1(mongoc_client_encryption_t *client_encryption, const bson_value_t *existing_key) { bson_error_t error; BSON_UNUSED(existing_key); /* Step 1: Use client_encryption to create a new local data key with a * keyAltName "abc" and assert the operation does not fail. */ { mongoc_client_encryption_datakey_opts_t *const opts = mongoc_client_encryption_datakey_opts_new(); const char *const keyaltname[] = {"abc"}; bson_value_t keyid; mongoc_client_encryption_datakey_opts_set_keyaltnames(opts, (char **)keyaltname, 1u); ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(client_encryption, "local", opts, &keyid, &error), error); mongoc_client_encryption_datakey_opts_destroy(opts); bson_value_destroy(&keyid); } /* Step 2: Repeat Step 1 and assert the operation fails due to a duplicate * key server error (error code 11000). */ { mongoc_client_encryption_datakey_opts_t *const opts = mongoc_client_encryption_datakey_opts_new(); const char *const keyaltname[] = {"abc"}; bson_value_t keyid; mongoc_client_encryption_datakey_opts_set_keyaltnames(opts, (char **)keyaltname, 1u); ASSERT(!mongoc_client_encryption_create_datakey(client_encryption, "local", opts, &keyid, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COLLECTION, MONGOC_ERROR_DUPLICATE_KEY, "keyAltNames: \"abc\""); mongoc_client_encryption_datakey_opts_destroy(opts); bson_value_destroy(&keyid); } /* Step 3: Use client_encryption to create a new local data key with a * keyAltName "def" and assert the operation fails due to a duplicate key * server error (error code 11000). */ { mongoc_client_encryption_datakey_opts_t *const opts = mongoc_client_encryption_datakey_opts_new(); const char *const keyaltname[] = {"def"}; bson_value_t keyid; mongoc_client_encryption_datakey_opts_set_keyaltnames(opts, (char **)keyaltname, 1u); ASSERT(!mongoc_client_encryption_create_datakey(client_encryption, "local", opts, &keyid, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COLLECTION, MONGOC_ERROR_DUPLICATE_KEY, "keyAltNames: \"def\""); mongoc_client_encryption_datakey_opts_destroy(opts); bson_value_destroy(&keyid); } } static void _test_unique_index_on_keyaltnames_case_2(mongoc_client_encryption_t *client_encryption, const bson_value_t *existing_key) { bson_value_t new_key; bson_error_t error; mongoc_client_encryption_datakey_opts_t *const opts = mongoc_client_encryption_datakey_opts_new(); /* Step 1: Use client_encryption to create a new local data key and assert * the operation does not fail. */ ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(client_encryption, "local", opts, &new_key, &error), error); /* Step 2: Use client_encryption to add a keyAltName "abc" to the key created * in Step 1 and assert the operation does not fail. */ { bson_t key_doc; ASSERT_OR_PRINT(mongoc_client_encryption_add_key_alt_name(client_encryption, &new_key, "abc", &key_doc, &error), error); bson_destroy(&key_doc); } /* Step 3: Repeat Step 2, assert the operation does not fail, and assert the * returned key document contains the keyAltName "abc" added in Step 2. */ { bson_t key_doc; ASSERT_OR_PRINT(mongoc_client_encryption_add_key_alt_name(client_encryption, &new_key, "abc", &key_doc, &error), error); ASSERT(match_bson(&key_doc, tmp_bson("{'keyAltNames': ['abc']}"), false)); bson_destroy(&key_doc); } /* Step 4: Use client_encryption to add a keyAltName "def" to the key created * in Step 1 and assert the operation fails due to a duplicate key server * error (error code 11000). */ { bson_t key_doc; ASSERT(!mongoc_client_encryption_add_key_alt_name(client_encryption, &new_key, "def", &key_doc, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, MONGOC_ERROR_DUPLICATE_KEY, "keyAltNames: \"def\""); bson_destroy(&key_doc); } /* Step 5: Use client_encryption to add a keyAltName "def" to the existing * key, assert the operation does not fail, and assert the returned key * document contains the keyAltName "def" added during Setup. */ { bson_t key_doc; ASSERT_OR_PRINT( mongoc_client_encryption_add_key_alt_name(client_encryption, existing_key, "def", &key_doc, &error), error); ASSERT(match_bson(&key_doc, tmp_bson("{'keyAltNames': ['def']}"), false)); bson_destroy(&key_doc); } bson_value_destroy(&new_key); mongoc_client_encryption_datakey_opts_destroy(opts); } /* Prose Test 13: Unique Index on keyAltNames */ static void test_unique_index_on_keyaltnames(void *unused) { BSON_UNUSED(unused); _test_unique_index_on_keyaltnames_setup(_test_unique_index_on_keyaltnames_case_1); _test_unique_index_on_keyaltnames_setup(_test_unique_index_on_keyaltnames_case_2); } typedef struct { mongoc_client_t *setupClient; mongoc_client_t *encryptedClient; mongoc_collection_t *encryptedColl; bson_value_t ciphertext; bson_value_t malformedCiphertext; /* aggEvent is the CommandSucceeded or CommandFailed event observed for the * 'aggregate' command run in the test. */ struct { const char *gotType; /* "none", "succeeded", or "failed" */ bson_error_t gotFailedError; bson_t *gotSucceededReply; } aggEvent; } decryption_events_fixture; static void decryption_events_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { decryption_events_fixture *def = (decryption_events_fixture *)mongoc_apm_command_succeeded_get_context(event); /* Only match the 'aggregate' command. */ if (0 != strcmp(mongoc_apm_command_succeeded_get_command_name(event), "aggregate")) { return; } ASSERT_CMPSTR(def->aggEvent.gotType, "none"); def->aggEvent.gotType = "succeeded"; def->aggEvent.gotSucceededReply = bson_copy(mongoc_apm_command_succeeded_get_reply(event)); } static void decryption_events_failed_cb(const mongoc_apm_command_failed_t *event) { decryption_events_fixture *def = (decryption_events_fixture *)mongoc_apm_command_failed_get_context(event); /* Only match the 'aggregate' command. */ if (0 != strcmp(mongoc_apm_command_failed_get_command_name(event), "aggregate")) { return; } ASSERT_CMPSTR(def->aggEvent.gotType, "none"); def->aggEvent.gotType = "failed"; mongoc_apm_command_failed_get_error(event, &def->aggEvent.gotFailedError); } decryption_events_fixture * decryption_events_setup(void) { decryption_events_fixture *def = (decryption_events_fixture *)bson_malloc0(sizeof(decryption_events_fixture)); mongoc_client_encryption_t *clientEncryption; bson_value_t keyID; def->setupClient = test_framework_new_default_client(); def->aggEvent.gotType = "none"; /* Drop and create the collection ``db.decryption_events`` */ { mongoc_collection_t *coll = mongoc_client_get_collection(def->setupClient, "db", "decryption_events"); bson_error_t error; if (!mongoc_collection_drop(coll, &error)) { if (error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error in drop: %s", error.message); } } mongoc_collection_destroy(coll); } /* Create a ClientEncryption object */ { mongoc_client_encryption_opts_t *ceOpts = mongoc_client_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_client_encryption_opts_set_keyvault_client(ceOpts, def->setupClient); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kms_providers); clientEncryption = mongoc_client_encryption_new(ceOpts, &error); ASSERT_OR_PRINT(clientEncryption, error); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceOpts); } /* Create a data key. */ { mongoc_client_encryption_datakey_opts_t *dkOpts; bson_error_t error; bool res; dkOpts = mongoc_client_encryption_datakey_opts_new(); res = mongoc_client_encryption_create_datakey(clientEncryption, "local", dkOpts, &keyID, &error); ASSERT_OR_PRINT(res, error); mongoc_client_encryption_datakey_opts_destroy(dkOpts); } /* Create a valid ciphertext. */ { mongoc_client_encryption_encrypt_opts_t *eOpts; bson_error_t error; bson_value_t plaintext; eOpts = mongoc_client_encryption_encrypt_opts_new(); plaintext.value_type = BSON_TYPE_UTF8; plaintext.value.v_utf8.str = "hello"; const size_t len = strlen(plaintext.value.v_utf8.str); ASSERT(mlib_in_range(uint32_t, len)); plaintext.value.v_utf8.len = (uint32_t)len; mongoc_client_encryption_encrypt_opts_set_algorithm(eOpts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); mongoc_client_encryption_encrypt_opts_set_keyid(eOpts, &keyID); ASSERT_OR_PRINT(mongoc_client_encryption_encrypt(clientEncryption, &plaintext, eOpts, &def->ciphertext, &error), error); mongoc_client_encryption_encrypt_opts_destroy(eOpts); } /* Create a malformed ciphertext. */ { bson_value_copy(&def->ciphertext, &def->malformedCiphertext); ASSERT(def->ciphertext.value_type == BSON_TYPE_BINARY); /* Change the last data byte to make malformed. The last data byte is * part of the HMAC tag. */ def->malformedCiphertext.value.v_binary.data[def->malformedCiphertext.value.v_binary.data_len - 1]++; } /* Create a MongoClient with automatic decryption. */ { mongoc_auto_encryption_opts_t *aeOpts = mongoc_auto_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); bson_error_t error; mongoc_uri_t *uri; mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kms_providers); uri = test_framework_get_uri(); /* disable retryable reads so only one event is emitted on failure. */ mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false); def->encryptedClient = test_framework_client_new_from_uri(uri, NULL /* api */); test_framework_set_ssl_opts(def->encryptedClient); ASSERT(mongoc_client_set_error_api(def->encryptedClient, MONGOC_ERROR_API_VERSION_2)); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(def->encryptedClient, aeOpts, &error), error); def->encryptedColl = mongoc_client_get_collection(def->encryptedClient, "db", "decryption_events"); bson_destroy(kms_providers); mongoc_auto_encryption_opts_destroy(aeOpts); mongoc_uri_destroy(uri); } /* Monitor for CommandSucceeded and CommandFailed events. */ { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(cbs, decryption_events_succeeded_cb); mongoc_apm_set_command_failed_cb(cbs, decryption_events_failed_cb); mongoc_client_set_apm_callbacks(def->encryptedClient, cbs, def); mongoc_apm_callbacks_destroy(cbs); } mongoc_client_encryption_destroy(clientEncryption); bson_value_destroy(&keyID); return def; } static void decryption_events_fixture_destroy(decryption_events_fixture *def) { mongoc_client_destroy(def->setupClient); mongoc_client_destroy(def->encryptedClient); mongoc_collection_destroy(def->encryptedColl); bson_value_destroy(&def->ciphertext); bson_value_destroy(&def->malformedCiphertext); bson_destroy(def->aggEvent.gotSucceededReply); bson_free(def); } /* Prose test 14: Case 1: Command Error */ /* test_decryption_events_command_error is a regression test for CDRIVER-4401. * Send a command on an encrypted client resulting in a { 'ok': 0 } reply. * Expect an error returned and a CommandFailed event to be emitted. */ static void test_decryption_events_case1(void *unused) { bool got; bson_error_t error; decryption_events_fixture *def = decryption_events_setup(); const bson_t *found; mongoc_cursor_t *cursor; BSON_UNUSED(unused); got = mongoc_client_command_simple(def->setupClient, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}, " "'data': {'errorCode': 123, 'failCommands': ['aggregate']}}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(got, error); cursor = mongoc_collection_aggregate( def->encryptedColl, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); got = mongoc_cursor_next(cursor, &found); ASSERT_WITH_MSG(!got, "Expected error in mongoc_cursor_next, but got success"); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 123, "failpoint"); ASSERT_CMPSTR(def->aggEvent.gotType, "failed"); ASSERT_ERROR_CONTAINS(def->aggEvent.gotFailedError, MONGOC_ERROR_SERVER, 123, "failpoint"); ASSERT(!got); mongoc_cursor_destroy(cursor); decryption_events_fixture_destroy(def); } /* Prose test 14: Case 2: Network Error */ /* test_decryption_events_network_error is a regression test for CDRIVER-4401. * Send a command on an encrypted client resulting in a network error. * Expect an error returned and a CommandFailed event to be emitted. */ static void test_decryption_events_case2(void *unused) { bool got; bson_error_t error; decryption_events_fixture *def = decryption_events_setup(); const bson_t *found; mongoc_cursor_t *cursor; BSON_UNUSED(unused); got = mongoc_client_command_simple(def->setupClient, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}, " "'data': {'errorCode': 123, 'closeConnection': true, " "'failCommands': ['aggregate']}}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(got, error); cursor = mongoc_collection_aggregate( def->encryptedColl, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); got = mongoc_cursor_next(cursor, &found); ASSERT_WITH_MSG(!got, "Expected error in mongoc_cursor_next, but got success"); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); ASSERT_CMPSTR(def->aggEvent.gotType, "failed"); ASSERT_ERROR_CONTAINS(def->aggEvent.gotFailedError, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); ASSERT(!got); mongoc_cursor_destroy(cursor); decryption_events_fixture_destroy(def); } /* Prose test 14: Case 3: Decrypt Error. */ /* test_decryption_events_decrypt_error is a regression test for CDRIVER-4401. * Decrypt a reply with a malformed ciphertext. * Expect an error returned and a CommandSucceeded event to be emitted with * ciphertext. */ static void test_decryption_events_case3(void *unused) { bool got; bson_error_t error; decryption_events_fixture *def = decryption_events_setup(); bson_t to_insert = BSON_INITIALIZER; const bson_t *found; mongoc_cursor_t *cursor; BSON_UNUSED(unused); BSON_APPEND_VALUE(&to_insert, "encrypted", &def->malformedCiphertext); got = mongoc_collection_insert_one(def->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(got, error); cursor = mongoc_collection_aggregate( def->encryptedColl, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); got = mongoc_cursor_next(cursor, &found); ASSERT_WITH_MSG(!got, "Expected error in mongoc_cursor_next, but got success"); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, "HMAC validation failure"); ASSERT_CMPSTR(def->aggEvent.gotType, "succeeded"); ASSERT_MATCH(def->aggEvent.gotSucceededReply, "{ 'cursor' : { 'firstBatch' : [ { 'encrypted': { " "'$$type': 'binData' }} ] } }"); mongoc_cursor_destroy(cursor); bson_destroy(&to_insert); decryption_events_fixture_destroy(def); } /* Prose test 14: Case 4: Decrypt Success. */ /* test_decryption_events_decrypt_success is a regression test for CDRIVER-4401. * Decrypt a reply with a valid ciphertext. * Expect a successful return and a CommandSucceeded event to be emitted with * ciphertext. */ static void test_decryption_events_case4(void *unused) { bool got; bson_error_t error; decryption_events_fixture *def = decryption_events_setup(); bson_t to_insert = BSON_INITIALIZER; const bson_t *found; mongoc_cursor_t *cursor; BSON_UNUSED(unused); BSON_APPEND_VALUE(&to_insert, "encrypted", &def->ciphertext); got = mongoc_collection_insert_one(def->encryptedColl, &to_insert, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(got, error); cursor = mongoc_collection_aggregate( def->encryptedColl, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); got = mongoc_cursor_next(cursor, &found); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(got); ASSERT_CMPSTR(def->aggEvent.gotType, "succeeded"); ASSERT_MATCH(def->aggEvent.gotSucceededReply, "{ 'cursor' : { 'firstBatch' : [ { 'encrypted': { " "'$$type': 'binData' }} ] } }"); mongoc_cursor_destroy(cursor); bson_destroy(&to_insert); decryption_events_fixture_destroy(def); } static void _test_rewrap_with_separate_client_encryption(const char *src_provider, const char *dst_provider) { mongoc_uri_t *const uri = test_framework_get_uri(); mongoc_client_encryption_opts_t *const ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_t *const src_client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_t *const dst_client = test_framework_client_new_from_uri(uri, NULL); bson_error_t error = {0}; bson_value_t keyid = {0}; BSON_ASSERT(uri); BSON_ASSERT(ce_opts); BSON_ASSERT(src_client); BSON_ASSERT(dst_client); test_framework_set_ssl_opts(src_client); test_framework_set_ssl_opts(dst_client); { mongoc_client_encryption_opts_set_keyvault_client(ce_opts, src_client); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); { bson_t *const kms_providers = _make_kms_providers(true, true); BSON_ASSERT(kms_providers); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); bson_destroy(kms_providers); } { bson_t *const tls_opts = _make_tls_opts(); BSON_ASSERT(tls_opts); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tls_opts); bson_destroy(tls_opts); } } // 1. Drop the collection keyvault.datakeys. { mongoc_collection_t *datakeys = mongoc_client_get_collection(src_client, "keyvault", "datakeys"); ASSERT(datakeys); (void)mongoc_collection_drop(datakeys, NULL); mongoc_collection_destroy(datakeys); } // 2. Create a ClientEncryption object named clientEncryption1 with these // options: (see ce_opts). mongoc_client_encryption_t *clientEncryption1 = mongoc_client_encryption_new(ce_opts, &error); ASSERT_OR_PRINT(clientEncryption1, error); // 3. Call clientEncryption1.createDataKey with srcProvider and these // options: (see below). { mongoc_client_encryption_datakey_opts_t *dk_opts = mongoc_client_encryption_datakey_opts_new(); { bson_t *const src_masterkey = _make_kms_masterkey(src_provider); BSON_ASSERT(src_masterkey); mongoc_client_encryption_datakey_opts_set_masterkey(dk_opts, src_masterkey); bson_destroy(src_masterkey); } ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(clientEncryption1, src_provider, dk_opts, &keyid, &error), error); mongoc_client_encryption_datakey_opts_destroy(dk_opts); } bson_value_t ciphertext = {0}; // 4. Call clientEncryption1.encrypt with the value "test" and these options: // (see below). { char message[] = "test"; bson_value_t bson_value; bson_value.value_type = BSON_TYPE_UTF8; bson_value.value.v_utf8.str = message; bson_value.value.v_utf8.len = (uint32_t)strlen(bson_value.value.v_utf8.str); mongoc_client_encryption_encrypt_opts_t *const e_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(e_opts, &keyid); mongoc_client_encryption_encrypt_opts_set_algorithm(e_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); ASSERT_OR_PRINT(mongoc_client_encryption_encrypt(clientEncryption1, &bson_value, e_opts, &ciphertext, &error), error); mongoc_client_encryption_encrypt_opts_destroy(e_opts); } // 5. Create a ClientEncryption object named clientEncryption2 with these // options: (see ce_opts). mongoc_client_encryption_t *clientEncryption2 = mongoc_client_encryption_new(ce_opts, &error); ASSERT_OR_PRINT(clientEncryption2, error); mongoc_client_encryption_rewrap_many_datakey_result_t *const result = mongoc_client_encryption_rewrap_many_datakey_result_new(); BSON_ASSERT(result); // 6. Call clientEncryption2.rewrapManyDataKey with an empty filter and these // options: (see below). { { bson_t *const dst_masterkey = _make_kms_masterkey(dst_provider); BSON_ASSERT(dst_masterkey); ASSERT_OR_PRINT(mongoc_client_encryption_rewrap_many_datakey( clientEncryption2, NULL, dst_provider, dst_masterkey, result, &error), error); bson_destroy(dst_masterkey); } // Assert that the returned // RewrapManyDataKeyResult.bulkWriteResult.modifiedCount is 1. const bson_t *const bulk_write_result = mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result(result); ASSERT(bulk_write_result); ASSERT_WITH_MSG(match_bson(bulk_write_result, tmp_bson("{'nModified': 1}"), false), "'%s' does not match expected value", tmp_json(bulk_write_result)); } // 7. Call clientEncryption1.decrypt with the ciphertext. Assert the return // value is "test". { bson_value_t decrypted = {0}; ASSERT(mongoc_client_encryption_decrypt(clientEncryption1, &ciphertext, &decrypted, &error)); ASSERT(decrypted.value_type == BSON_TYPE_UTF8); ASSERT(decrypted.value.v_utf8.len != 0u); ASSERT_CMPSTR(decrypted.value.v_utf8.str, "test"); bson_value_destroy(&decrypted); } // 8. Call clientEncryption2.decrypt with the ciphertext. Assert the return // value is "test". { bson_value_t decrypted = {0}; ASSERT(mongoc_client_encryption_decrypt(clientEncryption2, &ciphertext, &decrypted, &error)); ASSERT(decrypted.value_type == BSON_TYPE_UTF8); ASSERT(decrypted.value.v_utf8.len != 0u); ASSERT_CMPSTR(decrypted.value.v_utf8.str, "test"); bson_value_destroy(&decrypted); } mongoc_client_encryption_rewrap_many_datakey_result_destroy(result); mongoc_client_encryption_destroy(clientEncryption2); bson_value_destroy(&ciphertext); bson_value_destroy(&keyid); mongoc_client_encryption_destroy(clientEncryption1); mongoc_client_encryption_opts_destroy(ce_opts); mongoc_uri_destroy(uri); mongoc_client_destroy(dst_client); mongoc_client_destroy(src_client); } /* Prose Test 16: Case 1: Rewrap with separate ClientEncryption */ static void test_rewrap_with_separate_client_encryption(void *unused) { BSON_UNUSED(unused); const char *const providers[] = {"aws", "azure", "gcp", "kmip", "local"}; const size_t providers_len = sizeof(providers) / sizeof(*providers); for (size_t src_idx = 0u; src_idx < providers_len; ++src_idx) { for (size_t dst_idx = 0u; dst_idx < providers_len; ++dst_idx) { const char *const src = providers[src_idx]; const char *const dst = providers[dst_idx]; if (test_suite_debug_output()) { printf(" - %s -> %s\n", src, dst); fflush(stdout); } _test_rewrap_with_separate_client_encryption(src, dst); } } } /* Prose Test 16: Case 2: RewrapManyDataKeyOpts.provider is not optional. */ static void test_rewrap_without_provider(void *unused) { BSON_UNUSED(unused); mongoc_uri_t *const uri = test_framework_get_uri(); mongoc_client_encryption_opts_t *const ce_opts = mongoc_client_encryption_opts_new(); mongoc_client_t *const key_vault_client = test_framework_client_new_from_uri(uri, NULL); bson_error_t error = {0}; BSON_ASSERT(uri); BSON_ASSERT(ce_opts); BSON_ASSERT(key_vault_client); test_framework_set_ssl_opts(key_vault_client); { mongoc_client_encryption_opts_set_keyvault_client(ce_opts, key_vault_client); mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, "keyvault", "datakeys"); { bson_t *const kms_providers = _make_kms_providers(true, true); BSON_ASSERT(kms_providers); mongoc_client_encryption_opts_set_kms_providers(ce_opts, kms_providers); bson_destroy(kms_providers); } { bson_t *const tls_opts = _make_tls_opts(); BSON_ASSERT(tls_opts); mongoc_client_encryption_opts_set_tls_opts(ce_opts, tls_opts); bson_destroy(tls_opts); } } // 1. Create a ClientEncryption object named clientEncryption with these // options: (see ce_opts). mongoc_client_encryption_t *clientEncryption = mongoc_client_encryption_new(ce_opts, &error); ASSERT_OR_PRINT(clientEncryption, error); // 2. Call ``clientEncryption.rewrapManyDataKey`` with an empty ``filter`` // and these options: (see below). { bool ok = mongoc_client_encryption_rewrap_many_datakey( clientEncryption, NULL /* filter */, NULL /* kms_provider */, tmp_bson("{}"), NULL /* result */, &error); // Assert an error is returned from the driver suggesting that the // ``provider`` option is required. ASSERT_WITH_MSG(!ok, "expected error, but got success"); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, "expected 'provider' to be set to identify type of 'master_key'"); } mongoc_client_encryption_destroy(clientEncryption); mongoc_client_encryption_opts_destroy(ce_opts); mongoc_uri_destroy(uri); mongoc_client_destroy(key_vault_client); } /* test_qe_docs_example tests the documentation example requested in * CDRIVER-4379. */ static void test_qe_docs_example(void *unused) { bson_error_t error; mongoc_client_t *const client = test_framework_new_default_client(); bson_t *const kmsProviders = _make_kms_providers(false /* with aws */, true /* with local */); bson_value_t key1ID; bson_value_t key2ID; bson_t *encryptedFieldsMap; mongoc_client_t *encryptedClient; mongoc_collection_t *encryptedColl; BSON_UNUSED(unused); /* Drop data from prior test runs. */ { mongoc_database_t *db; mongoc_collection_t *coll; coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); if (!mongoc_collection_drop(coll, &error)) { bool ignored_error = NULL != strstr(error.message, "ns not found"); ASSERT_OR_PRINT(ignored_error, error); } mongoc_collection_destroy(coll); db = mongoc_client_get_database(client, "docsExamples"); ASSERT_OR_PRINT(mongoc_database_drop(db, &error), error); mongoc_database_destroy(db); } /* Create two data keys. */ { mongoc_client_encryption_opts_t *ceOpts; mongoc_client_encryption_t *ce; mongoc_client_encryption_datakey_opts_t *dkOpts; ceOpts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kmsProviders); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, client); ce = mongoc_client_encryption_new(ceOpts, &error); ASSERT_OR_PRINT(ce, error); dkOpts = mongoc_client_encryption_datakey_opts_new(); ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(ce, "local", dkOpts, &key1ID, &error), error); ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(ce, "local", dkOpts, &key2ID, &error), error); mongoc_client_encryption_datakey_opts_destroy(dkOpts); mongoc_client_encryption_destroy(ce); mongoc_client_encryption_opts_destroy(ceOpts); } /* Create an encryptedFieldsMap. */ /* clang-format off */ encryptedFieldsMap = BCON_NEW ( "docsExamples.encrypted", "{", "fields", "[", "{", "path", "encryptedIndexed", "bsonType", "string", "keyId", BCON_BIN (key1ID.value.v_binary.subtype, key1ID.value.v_binary.data, key1ID.value.v_binary.data_len), "queries", "[", "{", "queryType", "equality", "}", "]", "}", "{", "path", "encryptedUnindexed", "bsonType", "string", "keyId", BCON_BIN (key2ID.value.v_binary.subtype, key2ID.value.v_binary.data, key2ID.value.v_binary.data_len), "}", "]", "}" ); /* clang-format on */ /* Create an Queryable Encryption collection. */ { mongoc_auto_encryption_opts_t *aeOpts; mongoc_database_t *db; encryptedClient = test_framework_new_default_client(); aeOpts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kmsProviders); mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_encrypted_fields_map(aeOpts, encryptedFieldsMap); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(encryptedClient, aeOpts, &error), error); /* Create the Queryable Encryption collection docsExample.encrypted. */ db = mongoc_client_get_database(encryptedClient, "docsExamples"); /* Because docsExample.encrypted is in encryptedFieldsMap, it is created * with Queryable Encryption support. */ encryptedColl = mongoc_database_create_collection(db, "encrypted", NULL /* opts */, &error); ASSERT_OR_PRINT(encryptedColl, error); mongoc_database_destroy(db); mongoc_auto_encryption_opts_destroy(aeOpts); } /* Auto encrypt an insert and find. */ { /* Encrypt an insert. */ bson_t *to_insert; bson_t *filter; const bson_t *got; mongoc_cursor_t *cursor; bool found; bson_iter_t iter; to_insert = BCON_NEW("_id", BCON_INT32(1), "encryptedIndexed", "indexedValue", "encryptedUnindexed", "unindexedValue"); ASSERT_OR_PRINT(mongoc_collection_insert_one(encryptedColl, to_insert, NULL /* opts */, NULL /* reply */, &error), error); filter = BCON_NEW("encryptedIndexed", "indexedValue"); cursor = mongoc_collection_find_with_opts(encryptedColl, filter, NULL /* opts */, NULL /* read prefs */); found = mongoc_cursor_next(cursor, &got); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(found); ASSERT(bson_iter_init_find(&iter, got, "encryptedIndexed")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL /* length */), "indexedValue"); ASSERT(bson_iter_init_find(&iter, got, "encryptedUnindexed")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL /* length */), "unindexedValue"); mongoc_cursor_destroy(cursor); bson_destroy(filter); bson_destroy(to_insert); } /* Find documents without decryption. */ { mongoc_collection_t *unencryptedColl; bson_t *filter; const bson_t *got; mongoc_cursor_t *cursor; bool found; bson_iter_t iter; unencryptedColl = mongoc_client_get_collection(client, "docsExamples", "encrypted"); filter = BCON_NEW("_id", BCON_INT32(1)); cursor = mongoc_collection_find_with_opts(unencryptedColl, filter, NULL /* opts */, NULL /* read prefs */); found = mongoc_cursor_next(cursor, &got); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(found); ASSERT(bson_iter_init_find(&iter, got, "encryptedIndexed")); ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); ASSERT(bson_iter_init_find(&iter, got, "encryptedUnindexed")); ASSERT(BSON_ITER_HOLDS_BINARY(&iter)); mongoc_cursor_destroy(cursor); bson_destroy(filter); mongoc_collection_destroy(unencryptedColl); } mongoc_collection_destroy(encryptedColl); mongoc_client_destroy(encryptedClient); bson_destroy(encryptedFieldsMap); bson_value_destroy(&key2ID); bson_value_destroy(&key1ID); bson_destroy(kmsProviders); mongoc_client_destroy(client); } struct kms_callback_data { int value; const char *set_error; bool provide_creds; }; static bool _kms_callback(void *userdata, const bson_t *params, bson_t *out, bson_error_t *error) { struct kms_callback_data *ctx = userdata; BSON_UNUSED(params); ctx->value = 42; if (ctx->set_error) { bson_set_error(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1729, "%s", ctx->set_error); return false; } if (ctx->provide_creds) { uint8_t keydata[96] = {0}; BCON_APPEND(out, "local", "{", "key", BCON_BIN(BSON_SUBTYPE_BINARY, keydata, sizeof keydata), "}"); } return true; } static void test_kms_callback(void *unused) { // No interesting datakey options mongoc_client_encryption_datakey_opts_t *dk_opts = mongoc_client_encryption_datakey_opts_new(); // Create a client encryption object mongoc_client_encryption_opts_t *opts = mongoc_client_encryption_opts_new(); mongoc_client_t *cl = test_framework_new_default_client(); mongoc_client_encryption_opts_set_keyvault_client(opts, cl); BSON_UNUSED(unused); // Given it an on-demand 'local' provider bson_t *empty_local = tmp_bson("{'local': {}}"); mongoc_client_encryption_opts_set_kms_providers(opts, empty_local); mongoc_client_encryption_opts_set_keyvault_namespace(opts, "testing", "testing"); { // Attempting to create a key from 'local' will fail immediately // Create a client encryption object for it. bson_error_t error; mongoc_client_encryption_t *enc = mongoc_client_encryption_new(opts, &error); ASSERT_OR_PRINT(enc, error); bson_value_t keyid; mongoc_client_encryption_create_datakey(enc, "local", dk_opts, &keyid, &error); mongoc_client_encryption_destroy(enc); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, "no kms provider set"); } { // Now attach a callback struct kms_callback_data callback_data = {0}; mongoc_client_encryption_opts_set_kms_credential_provider_callback(opts, _kms_callback, &callback_data); BSON_ASSERT(callback_data.value == 0); bson_error_t error; mongoc_client_encryption_t *enc = mongoc_client_encryption_new(opts, &error); ASSERT_OR_PRINT(enc, error); bson_value_t keyid; { mongoc_client_encryption_create_datakey(enc, "local", dk_opts, &keyid, &error); // The callback will have set a value when it was called BSON_ASSERT(callback_data.value == 42); // But we still get an error, because we didn't fill in 'local' ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, "no kms provider set"); } { // Now actually provide a key callback_data.provide_creds = true; ASSERT_OR_PRINT(mongoc_client_encryption_create_datakey(enc, "local", dk_opts, &keyid, &error), error); // The callback will have set a value when it was called BSON_ASSERT(callback_data.value == 42); bson_value_destroy(&keyid); } // Clear the value and tell the callback to set its own error callback_data.value = 0; callback_data.set_error = "This is the error that should appear from the callback"; { mongoc_client_encryption_create_datakey(enc, "local", dk_opts, &keyid, &error); // It was called again: BSON_ASSERT(callback_data.value == 42); // This time the callback provided an error ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1729, "This is the error that should appear from the callback"); } mongoc_client_encryption_destroy(enc); } mongoc_client_encryption_datakey_opts_destroy(dk_opts); mongoc_client_encryption_opts_destroy(opts); mongoc_client_destroy(cl); } static void _test_auto_aws(bool should_succeed) { // Datakey options for AWS mongoc_client_encryption_datakey_opts_t *dk_opts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dk_opts, tmp_bson("{ 'region': 'us-east-1', 'key': " "'arn:aws:kms:us-east-1:579766882180:key/" "89fcc2c4-08b0-4bd9-9f25-e30687b580d0' }")); // Create a client encryption object mongoc_client_encryption_opts_t *opts = mongoc_client_encryption_opts_new(); mongoc_client_t *cl = test_framework_new_default_client(); mongoc_client_encryption_opts_set_keyvault_client(opts, cl); // Given it an on-demand 'aws' provider bson_t *empty_aws = tmp_bson("{'aws': {}}"); mongoc_client_encryption_opts_set_kms_providers(opts, empty_aws); mongoc_client_encryption_opts_set_keyvault_namespace(opts, "testing", "testing"); { // Attempting to create a key from 'aws' will require credentials in the // environment immediately. Create a client encryption object for it. bson_error_t error; mongoc_client_encryption_t *enc = mongoc_client_encryption_new(opts, &error); ASSERT_OR_PRINT(enc, error); bson_value_t keyid; mongoc_client_encryption_create_datakey(enc, "aws", dk_opts, &keyid, &error); mongoc_client_encryption_destroy(enc); if (should_succeed) { bson_value_destroy(&keyid); ASSERT_OR_PRINT(error.code == 0, error); } else { // We should encounter an error while attempting to connect to the EC2 // metadata server. ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, ""); } } mongoc_client_encryption_datakey_opts_destroy(dk_opts); mongoc_client_encryption_opts_destroy(opts); mongoc_client_destroy(cl); } static void test_auto_aws_fail(void *unused) { BSON_UNUSED(unused); _test_auto_aws(false); } static void test_auto_aws_succeed(void *unused) { BSON_UNUSED(unused); _test_auto_aws(true); } static int _have_aws_creds_env(void *unused) { BSON_UNUSED(unused); // State variable: // Zero: Haven't checked yet // One: We have AWS creds // Two = We do not have AWS creds static int creds_check_state = 0; if (creds_check_state == 0) { // We need to do a check _mongoc_aws_credentials_t creds = {0}; bson_error_t error; bool got_creds = _mongoc_aws_credentials_obtain(NULL, &creds, &error); _mongoc_aws_credentials_cleanup(&creds); if (got_creds) { creds_check_state = 1; } else { creds_check_state = 2; } } return creds_check_state == 1; } static int _not_have_aws_creds_env(void *unused) { return !_have_aws_creds_env(unused); } // Test calling mongoc_collection_drop with a NULL bson_error_t when the state // collections do not exist. This is a regression test for CDRIVER-4457. static void test_drop_qe_null_error(void *unused) { bson_error_t error; mongoc_client_t *const client = test_framework_new_default_client(); bson_t *const kmsProviders = _make_kms_providers(false /* with aws */, true /* with local */); bson_t *encryptedFieldsMap; mongoc_client_t *encryptedClient; mongoc_auto_encryption_opts_t *aeOpts; mongoc_collection_t *coll; BSON_UNUSED(unused); /* Create an encryptedFieldsMap. */ encryptedFieldsMap = BCON_NEW("db.encrypted", "{", "fields", "[", "]", "}"); encryptedClient = test_framework_new_default_client(); aeOpts = mongoc_auto_encryption_opts_new(); mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kmsProviders); mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_encrypted_fields_map(aeOpts, encryptedFieldsMap); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(encryptedClient, aeOpts, &error), error); coll = mongoc_client_get_collection(encryptedClient, "db", "encrypted"); ASSERT(mongoc_collection_drop(coll, NULL)); mongoc_collection_destroy(coll); mongoc_auto_encryption_opts_destroy(aeOpts); mongoc_client_destroy(encryptedClient); bson_destroy(encryptedFieldsMap); bson_destroy(kmsProviders); mongoc_client_destroy(client); } static bool _auto_datakeys(struct auto_datakey_context *ctx) { ctx->out_keyid->value.v_int32 = 42; ctx->out_keyid->value_type = BSON_TYPE_INT32; return true; } static bool _auto_datakeys_error(struct auto_datakey_context *ctx) { bson_set_error(ctx->out_error, 42, 1729, "I am an error"); return false; } static bool _auto_datakeys_error_noset(struct auto_datakey_context *ctx) { // Do not set an error code, but indicate error anyway BSON_UNUSED(ctx); return false; } static void test_auto_datakeys(void *unused) { BSON_UNUSED(unused); bson_error_t error = {0}; bson_t in_fields = BSON_INITIALIZER; bsonBuildArray( // in_fields, doc(kv("keyId", cstr("keepme"))), // doc(kv("keyId", null))); bson_t out_fields = BSON_INITIALIZER; bool okay = _mongoc_encryptedFields_fill_auto_datakeys(&out_fields, &in_fields, _auto_datakeys, NULL, &error); ASSERT_ERROR_CONTAINS(error, 0, 0, ""); ASSERT(okay); bsonParse( // out_fields, require(keyWithType("0", doc), // parse(require(allOf(key("keyId"), strEqual("keepme")), nop))), require(keyWithType("1", doc), parse(require(allOf(keyWithType("keyId", int32)), do(ASSERT_CMPINT32(bsonAs(int32), ==, 42)))))); ASSERT(bsonParseError == NULL); bson_destroy(&out_fields); // Do it again, but we will generate an error okay = _mongoc_encryptedFields_fill_auto_datakeys(&out_fields, &in_fields, _auto_datakeys_error, NULL, &error); ASSERT(!okay); ASSERT_ERROR_CONTAINS(error, 42, 1729, "I am an error"); bson_destroy(&out_fields); // Do it again, but we will generate an error without the factory setting the // error okay = _mongoc_encryptedFields_fill_auto_datakeys(&out_fields, &in_fields, _auto_datakeys_error_noset, NULL, &error); ASSERT(!okay); // Generic error, since the factory didn't provide one: ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "indicated failure"); bson_destroy(&out_fields); bson_destroy(&in_fields); } static void _do_cec_test(void (*test)(const char *kmsProvider)) { test("local"); test("aws"); } // Declare a createEncryptedCollection test case (See usage below) #define CEC_TEST(name, ...) \ static void name##_impl(__VA_ARGS__); \ static void name(void *unused) \ { \ BSON_UNUSED(unused); \ _do_cec_test(name##_impl); \ } \ static void name##_impl(__VA_ARGS__) CEC_TEST(test_create_encrypted_collection_simple, const char *kmsProvider) { bson_error_t error = {0}; mongoc_client_t *const client = test_framework_new_default_client(); bson_t *const kmsProviders = _make_kms_providers(true, true); bson_t *const tlsOptions = _make_tls_opts(); const char *const dbName = "cec-test-db"; // Drop prior data { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); if (coll) { mongoc_collection_drop(coll, &error); bool okay = error.code == 0 || strstr(error.message, "ns not found") != NULL; ASSERT_OR_PRINT(okay, error); } mongoc_collection_destroy(coll); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); ASSERT_OR_PRINT(mongoc_database_drop(db, &error), error); mongoc_database_destroy(db); } // Create a CE mongoc_client_encryption_opts_t *const ceOpts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kmsProviders); mongoc_client_encryption_opts_set_tls_opts(ceOpts, tlsOptions); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, client); mongoc_client_encryption_t *const ce = mongoc_client_encryption_new(ceOpts, &error); mongoc_client_encryption_opts_destroy(ceOpts); ASSERT_OR_PRINT(ce, error); // Create the encrypted collection bsonBuildDecl( ccOpts, kv("encryptedFields", doc(kv("fields", array(doc(kv("path", cstr("ssn")), kv("bsonType", cstr("string")), kv("keyId", null))))))); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); bson_t *const mkey = _make_kms_masterkey(kmsProvider); mongoc_collection_t *const coll = mongoc_client_encryption_create_encrypted_collection( ce, db, "test-coll", &ccOpts, NULL, kmsProvider, mkey, &error); ASSERT_OR_PRINT(coll, error); bson_destroy(&ccOpts); bson_destroy(mkey); bsonBuildDecl(doc, kv("ssn", cstr("123-45-6789"))); const bool okay = mongoc_collection_insert_one(coll, &doc, NULL, NULL, &error); // Expect a failure: We didn't encrypt the field, and we don't have // auto-encryption enabled, but the server expects this to be encrypted. ASSERT(!okay); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COLLECTION, 121, "failed validation"); bson_destroy(&doc); bson_destroy(kmsProviders); bson_destroy(tlsOptions); mongoc_collection_destroy(coll); mongoc_database_drop(db, &error); mongoc_database_destroy(db); mongoc_client_encryption_destroy(ce); mongoc_client_destroy(client); } static void test_create_encrypted_collection_no_encryptedFields_helper(mongoc_client_t *client, const char *dbName, const char *collName, const char *kmsProvider) { bson_error_t error = {0}; bson_t *const kmsProviders = _make_kms_providers(true, true); bson_t *const tlsOptions = _make_tls_opts(); ASSERT(client); // Drop prior data { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); if (coll) { mongoc_collection_drop(coll, &error); bool okay = error.code == 0 || strstr(error.message, "ns not found") != NULL; ASSERT_OR_PRINT(okay, error); } mongoc_collection_destroy(coll); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); ASSERT_OR_PRINT(mongoc_database_drop(db, &error), error); mongoc_database_destroy(db); } // Create a CE mongoc_client_encryption_opts_t *const ceOpts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kmsProviders); mongoc_client_encryption_opts_set_tls_opts(ceOpts, tlsOptions); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, client); mongoc_client_encryption_t *const ce = mongoc_client_encryption_new(ceOpts, &error); mongoc_client_encryption_opts_destroy(ceOpts); ASSERT_OR_PRINT(ce, error); // Create the encrypted collection bsonBuildDecl(ccOpts, do()); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); bson_t *const mkey = _make_kms_masterkey(kmsProvider); mongoc_collection_t *const coll = mongoc_client_encryption_create_encrypted_collection(ce, db, collName, &ccOpts, NULL, kmsProvider, mkey, &error); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "No 'encryptedFields' are defined"); bson_destroy(&ccOpts); bson_destroy(mkey); bson_destroy(kmsProviders); bson_destroy(tlsOptions); mongoc_collection_destroy(coll); mongoc_database_drop(db, &error); mongoc_database_destroy(db); mongoc_client_encryption_destroy(ce); } CEC_TEST(test_create_encrypted_collection_no_encryptedFields, const char *kmsProvider) { const char *dbName = "cec-test-db"; const char *collName = "test-coll"; // Test with a default client. { mongoc_client_t *const client = test_framework_new_default_client(); test_create_encrypted_collection_no_encryptedFields_helper(client, dbName, collName, kmsProvider); mongoc_client_destroy(client); } // Test with a client configured with an encryptedFieldsMap. // This is not a required test. But a prior implementation checked if the // target collection was configured in encryptedFieldsMap. { mongoc_client_t *const client = test_framework_new_default_client(); mongoc_auto_encryption_opts_t *aeOpts = mongoc_auto_encryption_opts_new(); bson_t *const kmsProviders = _make_kms_providers(true /* with aws */, true /* with local */); char *namespace = bson_strdup_printf("%s.%s", dbName, collName); bson_t *encryptedFieldsMap = tmp_bson("{'%s': {'fields': []}}", namespace); bson_error_t error; mongoc_auto_encryption_opts_set_kms_providers(aeOpts, kmsProviders); mongoc_auto_encryption_opts_set_keyvault_namespace(aeOpts, "keyvault", "datakeys"); mongoc_auto_encryption_opts_set_encrypted_fields_map(aeOpts, encryptedFieldsMap); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(client, aeOpts, &error), error); test_create_encrypted_collection_no_encryptedFields_helper(client, dbName, collName, kmsProvider); bson_free(namespace); bson_destroy(kmsProviders); mongoc_auto_encryption_opts_destroy(aeOpts); mongoc_client_destroy(client); } } CEC_TEST(test_create_encrypted_collection_bad_keyId, const char *const kmsProvider) { bson_error_t error = {0}; mongoc_client_t *const client = test_framework_new_default_client(); bson_t *const kmsProviders = _make_kms_providers(true, true); bson_t *const tlsOptions = _make_tls_opts(); const char *const dbName = "cec-test-db"; // Drop prior data { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); if (coll) { mongoc_collection_drop(coll, &error); bool okay = error.code == 0 || strstr(error.message, "ns not found") != NULL; ASSERT_OR_PRINT(okay, error); } mongoc_collection_destroy(coll); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); ASSERT_OR_PRINT(mongoc_database_drop(db, &error), error); mongoc_database_destroy(db); } // Create a CE mongoc_client_encryption_opts_t *const ceOpts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kmsProviders); mongoc_client_encryption_opts_set_tls_opts(ceOpts, tlsOptions); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, client); mongoc_client_encryption_t *const ce = mongoc_client_encryption_new(ceOpts, &error); mongoc_client_encryption_opts_destroy(ceOpts); ASSERT_OR_PRINT(ce, error); // Create the encrypted collection bsonBuildDecl( ccOpts, kv("encryptedFields", doc(kv("fields", array(doc(kv("path", cstr("ssn")), kv("bsonType", cstr("string")), kv("keyId", boolean(true)))))))); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); bson_t *const mkey = _make_kms_masterkey(kmsProvider); mongoc_collection_t *const coll = mongoc_client_encryption_create_encrypted_collection( ce, db, "test-coll", &ccOpts, NULL, kmsProvider, mkey, &error); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_QUERY, MONGOC_ERROR_PROTOCOL_INVALID_REPLY, "create.encryptedFields.fields.keyId"); bson_destroy(&ccOpts); bson_destroy(mkey); bson_destroy(kmsProviders); bson_destroy(tlsOptions); mongoc_collection_destroy(coll); mongoc_database_drop(db, &error); mongoc_database_destroy(db); mongoc_client_encryption_destroy(ce); mongoc_client_destroy(client); } // Implements Prose Test 21. Case: 4. CEC_TEST(test_create_encrypted_collection_insert, const char *const kmsProvider) { bson_error_t error = {0}; mongoc_client_t *const client = test_framework_new_default_client(); bson_t *const kmsProviders = _make_kms_providers(true, true); bson_t *const tlsOptions = _make_tls_opts(); const char *const dbName = "cec-test-db"; // Drop prior data { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "keyvault", "datakeys"); if (coll) { mongoc_collection_drop(coll, &error); bool okay = error.code == 0 || strstr(error.message, "ns not found") != NULL; ASSERT_OR_PRINT(okay, error); } mongoc_collection_destroy(coll); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); ASSERT_OR_PRINT(mongoc_database_drop(db, &error), error); mongoc_database_destroy(db); } // Create a CE mongoc_client_encryption_opts_t *const ceOpts = mongoc_client_encryption_opts_new(); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kmsProviders); mongoc_client_encryption_opts_set_tls_opts(ceOpts, tlsOptions); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, client); mongoc_client_encryption_t *const ce = mongoc_client_encryption_new(ceOpts, &error); mongoc_client_encryption_opts_destroy(ceOpts); ASSERT_OR_PRINT(ce, error); // Create the encrypted collection bsonBuildDecl( ccOpts, kv("encryptedFields", doc(kv("fields", array(doc(kv("path", cstr("ssn")), kv("bsonType", cstr("string")), kv("keyId", null))))))); mongoc_database_t *const db = mongoc_client_get_database(client, dbName); bson_t new_opts; bson_t *const mkey = _make_kms_masterkey(kmsProvider); mongoc_collection_t *const coll = mongoc_client_encryption_create_encrypted_collection( ce, db, "testing1", &ccOpts, &new_opts, kmsProvider, mkey, &error); ASSERT_OR_PRINT(coll, error); bson_destroy(&ccOpts); bson_destroy(mkey); // Extract the encryption key ID that was generated by // CreateEncryptedCollection: bson_value_t new_keyid; bsonParse(new_opts, require(keyWithType("encryptedFields", doc), parse(require(keyWithType("fields", array), visitEach(require(type(doc)), parse(require(key("keyId"), require(type(binary)), do({ bson_value_copy( bson_iter_value((bson_iter_t *)&bsonVisitIter), &new_keyid); }), halt))))))); ASSERT_CMPSTR(bsonParseError, NULL); // Generate some plaintext: bson_value_t plain; plain.value_type = BSON_TYPE_UTF8; plain.value.v_utf8.str = "123-45-6789"; plain.value.v_utf8.len = (uint32_t)strlen(plain.value.v_utf8.str); // Encrypt the value using the new encryption key: mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eo, &new_keyid); mongoc_client_encryption_encrypt_opts_set_algorithm(eo, MONGOC_ENCRYPT_ALGORITHM_UNINDEXED); bson_value_t ciphertext; bool okay = mongoc_client_encryption_encrypt(ce, &plain, eo, &ciphertext, &error); ASSERT_OR_PRINT(okay, error); mongoc_client_encryption_encrypt_opts_destroy(eo); bson_value_destroy(&new_keyid); // Insert the ciphertext: bsonBuildDecl(doc, kv("ssn", value(ciphertext))); okay = mongoc_collection_insert_one(coll, &doc, NULL, NULL, &error); ASSERT_OR_PRINT(okay, error); // Success! bson_destroy(&doc); bson_value_destroy(&ciphertext); bson_destroy(kmsProviders); bson_destroy(tlsOptions); mongoc_collection_destroy(coll); mongoc_database_drop(db, &error); mongoc_database_destroy(db); mongoc_client_encryption_destroy(ce); mongoc_client_destroy(client); bson_destroy(&new_opts); } typedef struct listen_socket { mongoc_socket_t *socket; mongoc_cond_t cond; bson_mutex_t mutex; bool failed; char ip[16]; unsigned short port; bool complete; } listen_socket_args_t; static BSON_THREAD_FUN(listen_socket, arg) { listen_socket_args_t *args = arg; mongoc_socket_t *socket; struct sockaddr_in server_addr = {0}; args->failed = false; // create a TcpListener on 127.0.0.1 endpoint socket = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(socket); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); server_addr.sin_port = htons(0); mongoc_socklen_t addr_len = (mongoc_socklen_t)sizeof server_addr; int r = mongoc_socket_bind(socket, (struct sockaddr *)&server_addr, addr_len); BSON_ASSERT(r == 0); // forward the port and ip for mongocryptdURI r = mongoc_socket_getsockname(socket, (struct sockaddr *)&server_addr, &addr_len); BSON_ASSERT(r == 0); bson_mutex_lock(&args->mutex); args->port = ntohs(server_addr.sin_port); inet_ntop(AF_INET, &server_addr.sin_addr, args->ip, sizeof(args->ip)); mongoc_cond_signal(&args->cond); bson_mutex_unlock(&args->mutex); // listen on socket r = mongoc_socket_listen(socket, 100); BSON_ASSERT(r == 0); mlib_sleep_for(1, ms); mongoc_socket_t *ret = mongoc_socket_accept(socket, bson_get_monotonic_time() + 100); if (ret) { // not null received a connection and test should fail args->failed = true; } // signal that test is complete. bson_mutex_lock(&args->mutex); args->complete = true; mongoc_cond_signal(&args->cond); bson_mutex_unlock(&args->mutex); mongoc_socket_destroy(socket); BSON_THREAD_RETURN; } /* Prose Test 20: Bypass creating mongocryptd client when shared library is * loaded */ static void test_bypass_mongocryptd_shared_library(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client_encrypted; mongoc_auto_encryption_opts_t *auto_encryption_opts; bson_t *kms_providers; mongoc_database_t *db; mongoc_collection_t *coll; bson_error_t error; bson_thread_t socket_thread; // start the socket on a thread listen_socket_args_t *args = bson_malloc0(sizeof(listen_socket_args_t)); bson_mutex_init(&args->mutex); mongoc_cond_init(&args->cond); ASSERT_CMPINT(0, ==, mcommon_thread_create(&socket_thread, listen_socket, args)); // configure mongoclient with auto encryption char *env_cryptSharedLibPath = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); BSON_ASSERT(env_cryptSharedLibPath); auto_encryption_opts = mongoc_auto_encryption_opts_new(); kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(0, (uint8_t *)LOCAL_MASTERKEY, 96), "}"); mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, kms_providers); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, "keyvault", "datakeys"); // wait for port and ip to be set on the other thread bson_mutex_lock(&args->mutex); while (!args->port) { int cond_ret = mongoc_cond_timedwait(&args->cond, &args->mutex, 5000); /* ret non-zero indicates an error (a timeout) */ BSON_ASSERT(!cond_ret); } bson_mutex_unlock(&args->mutex); BSON_ASSERT(strlen(args->ip) > 0); // configure extra options bson_t *extra = tmp_bson("{'mongocryptdURI': 'mongodb://%s:%d', " "'cryptSharedLibPath': '%s'}", args->ip, args->port, env_cryptSharedLibPath); mongoc_auto_encryption_opts_set_extra(auto_encryption_opts, extra); bson_free(env_cryptSharedLibPath); // get the client client_encrypted = test_framework_new_default_client(); bool ret = mongoc_client_enable_auto_encryption(client_encrypted, auto_encryption_opts, &error); ASSERT_OR_PRINT(ret, error); // insert a document db = mongoc_client_get_database(client_encrypted, "db"); coll = mongoc_database_get_collection(db, "coll"); ret = mongoc_collection_insert_one( coll, tmp_bson("{'unencrypted': 'test'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); // Wait for listener thread to complete. bson_mutex_lock(&args->mutex); while (!args->complete) { int cond_ret = mongoc_cond_timedwait(&args->cond, &args->mutex, 5000); /* ret non-zero indicates an error (a timeout) */ BSON_ASSERT(!cond_ret); } bson_mutex_unlock(&args->mutex); // failed should be false if the signal did not receive a connection BSON_ASSERT(!args->failed); mcommon_thread_join(socket_thread); bson_mutex_destroy(&args->mutex); mongoc_cond_destroy(&args->cond); bson_destroy(kms_providers); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_client_destroy(client_encrypted); bson_free(args); } static void test_range_explicit_encryption_applies_defaults(void *unused) { BSON_UNUSED(unused); bson_error_t error; mongoc_client_t *keyVaultClient = test_framework_new_default_client(); // Create a ClientEncryption object. mongoc_client_encryption_t *clientEncryption; { mongoc_client_encryption_opts_t *ceOpts = mongoc_client_encryption_opts_new(); bson_t *kms_providers = _make_local_kms_provider(NULL); mongoc_client_encryption_opts_set_keyvault_client(ceOpts, keyVaultClient); mongoc_client_encryption_opts_set_keyvault_namespace(ceOpts, "keyvault", "datakeys"); mongoc_client_encryption_opts_set_kms_providers(ceOpts, kms_providers); clientEncryption = mongoc_client_encryption_new(ceOpts, &error); ASSERT_OR_PRINT(clientEncryption, error); bson_destroy(kms_providers); mongoc_client_encryption_opts_destroy(ceOpts); } // Create a data key. bson_value_t keyID; { mongoc_client_encryption_datakey_opts_t *dkOpts = mongoc_client_encryption_datakey_opts_new(); bool ok = mongoc_client_encryption_create_datakey(clientEncryption, "local", dkOpts, &keyID, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_encryption_datakey_opts_destroy(dkOpts); } bson_value_t minValue = {.value_type = BSON_TYPE_INT32, .value.v_int32 = 0}; bson_value_t maxValue = {.value_type = BSON_TYPE_INT32, .value.v_int32 = 1000}; bson_value_t toEncrypt = {.value_type = BSON_TYPE_INT32, .value.v_int32 = 123}; // Create `payload_defaults`. bson_value_t payload_defaults; { mongoc_client_encryption_encrypt_opts_t *eOpts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eOpts, &keyID); mongoc_client_encryption_encrypt_opts_set_algorithm(eOpts, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eOpts, 0); // Apply range options. Omit `sparsity` and `trimFactor`. { mongoc_client_encryption_encrypt_range_opts_t *rOpts = mongoc_client_encryption_encrypt_range_opts_new(); mongoc_client_encryption_encrypt_range_opts_set_min(rOpts, &minValue); mongoc_client_encryption_encrypt_range_opts_set_max(rOpts, &maxValue); mongoc_client_encryption_encrypt_opts_set_range_opts(eOpts, rOpts); mongoc_client_encryption_encrypt_range_opts_destroy(rOpts); } bool ok = mongoc_client_encryption_encrypt(clientEncryption, &toEncrypt, eOpts, &payload_defaults, &error); ASSERT_OR_PRINT(ok, error); ASSERT(payload_defaults.value_type == BSON_TYPE_BINARY); mongoc_client_encryption_encrypt_opts_destroy(eOpts); } // Case 1: Uses libmongocrypt defaults. { mongoc_client_encryption_encrypt_opts_t *eOpts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eOpts, &keyID); mongoc_client_encryption_encrypt_opts_set_algorithm(eOpts, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eOpts, 0); // Apply range options. Include `sparsity` and `trimFactor`. { mongoc_client_encryption_encrypt_range_opts_t *rOpts = mongoc_client_encryption_encrypt_range_opts_new(); mongoc_client_encryption_encrypt_range_opts_set_min(rOpts, &minValue); mongoc_client_encryption_encrypt_range_opts_set_max(rOpts, &maxValue); mongoc_client_encryption_encrypt_range_opts_set_sparsity(rOpts, 2); mongoc_client_encryption_encrypt_range_opts_set_trim_factor(rOpts, 6); mongoc_client_encryption_encrypt_opts_set_range_opts(eOpts, rOpts); mongoc_client_encryption_encrypt_range_opts_destroy(rOpts); } bson_value_t payload; bool ok = mongoc_client_encryption_encrypt(clientEncryption, &toEncrypt, eOpts, &payload, &error); ASSERT_OR_PRINT(ok, error); // Assert both payloads have equal length. Intended to check they used the same `trimFactor` and `sparsity`. ASSERT(payload.value_type == BSON_TYPE_BINARY); ASSERT_CMPUINT32(payload.value.v_binary.data_len, ==, payload_defaults.value.v_binary.data_len); mongoc_client_encryption_encrypt_opts_destroy(eOpts); bson_value_destroy(&payload); } // Case 1: Accepts `trimFactor` 0. { mongoc_client_encryption_encrypt_opts_t *eOpts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_keyid(eOpts, &keyID); mongoc_client_encryption_encrypt_opts_set_algorithm(eOpts, MONGOC_ENCRYPT_ALGORITHM_RANGE); mongoc_client_encryption_encrypt_opts_set_contention_factor(eOpts, 0); // Apply range options. Omit `sparsity`, but include `trimFactor=0`. { mongoc_client_encryption_encrypt_range_opts_t *rOpts = mongoc_client_encryption_encrypt_range_opts_new(); mongoc_client_encryption_encrypt_range_opts_set_min(rOpts, &minValue); mongoc_client_encryption_encrypt_range_opts_set_max(rOpts, &maxValue); mongoc_client_encryption_encrypt_range_opts_set_trim_factor(rOpts, 0); mongoc_client_encryption_encrypt_opts_set_range_opts(eOpts, rOpts); mongoc_client_encryption_encrypt_range_opts_destroy(rOpts); } bson_value_t payload; bool ok = mongoc_client_encryption_encrypt(clientEncryption, &toEncrypt, eOpts, &payload, &error); ASSERT_OR_PRINT(ok, error); // Assert payload with `trimFactor=0` has greater length. ASSERT(payload.value_type == BSON_TYPE_BINARY); ASSERT_CMPUINT32(payload.value.v_binary.data_len, >, payload_defaults.value.v_binary.data_len); mongoc_client_encryption_encrypt_opts_destroy(eOpts); bson_value_destroy(&payload); } bson_value_destroy(&payload_defaults); bson_value_destroy(&keyID); mongoc_client_encryption_destroy(clientEncryption); mongoc_client_destroy(keyVaultClient); } static void _test_retry_with_masterkey(const char *provider, bson_t *masterkey) { mongoc_client_t *keyvault_client = test_framework_new_default_client(); mongoc_client_encryption_t *client_encryption = _tls_test_make_client_encryption(keyvault_client, RETRY); bson_error_t error = {0}; bson_value_t keyid; mongoc_client_encryption_datakey_opts_t *dkopts; char *ca_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CA_FILE"); char *pem_file = test_framework_getenv_required("MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE"); mongoc_ssl_opt_t ssl_opts = {.ca_file = ca_file, .pem_file = pem_file}; bool res; bson_value_t to_encrypt = {.value_type = BSON_TYPE_INT32, .value.v_int32 = 123}; bson_value_t encrypted_field = {0}; mongoc_client_encryption_encrypt_opts_t *encrypt_opts = mongoc_client_encryption_encrypt_opts_new(); mongoc_client_encryption_encrypt_opts_set_algorithm(encrypt_opts, MONGOC_AEAD_AES_256_CBC_HMAC_SHA_512_DETERMINISTIC); reset_failpoints(&ssl_opts); // Case 1: createDataKey and encrypt with TCP retry dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, masterkey); set_retry_failpoint(&ssl_opts, true, 1); res = mongoc_client_encryption_create_datakey(client_encryption, provider, dkopts, &keyid, &error); ASSERT_OR_PRINT(res, error); set_retry_failpoint(&ssl_opts, true, 1); mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &keyid); res = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted_field, &error); ASSERT_OR_PRINT(res, error); bson_value_destroy(&keyid); bson_value_destroy(&encrypted_field); mongoc_client_encryption_datakey_opts_destroy(dkopts); // Case 2: createDataKey and encrypt with HTTP retry dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, masterkey); set_retry_failpoint(&ssl_opts, false, 1); res = mongoc_client_encryption_create_datakey(client_encryption, provider, dkopts, &keyid, &error); ASSERT_OR_PRINT(res, error); set_retry_failpoint(&ssl_opts, false, 1); mongoc_client_encryption_encrypt_opts_set_keyid(encrypt_opts, &keyid); res = mongoc_client_encryption_encrypt(client_encryption, &to_encrypt, encrypt_opts, &encrypted_field, &error); ASSERT_OR_PRINT(res, error); bson_value_destroy(&keyid); bson_value_destroy(&encrypted_field); mongoc_client_encryption_datakey_opts_destroy(dkopts); // Case 3: createDataKey fails after too many retries dkopts = mongoc_client_encryption_datakey_opts_new(); mongoc_client_encryption_datakey_opts_set_masterkey(dkopts, masterkey); set_retry_failpoint(&ssl_opts, true, 4); res = mongoc_client_encryption_create_datakey(client_encryption, provider, dkopts, &keyid, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "KMS request failed after"); bson_value_destroy(&keyid); mongoc_client_encryption_datakey_opts_destroy(dkopts); bson_free(ca_file); bson_free(pem_file); mongoc_client_encryption_encrypt_opts_destroy(encrypt_opts); mongoc_client_encryption_destroy(client_encryption); mongoc_client_destroy(keyvault_client); } /* Prose test 23: KMS Retry Tests */ static void test_kms_retry(void *unused) { BSON_UNUSED(unused); bson_t *aws_masterkey = tmp_bson(BSON_STR({"region" : "r", "key" : "k", "endpoint" : "127.0.0.1:9003"})); bson_t *azure_masterkey = tmp_bson(BSON_STR({"keyVaultEndpoint" : "127.0.0.1:9003", "keyName" : "foo"})); bson_t *gcp_masterkey = tmp_bson(BSON_STR( {"projectId" : "foo", "location" : "bar", "keyRing" : "baz", "keyName" : "qux", "endpoint" : "127.0.0.1:9003"})); _test_retry_with_masterkey("aws", aws_masterkey); _test_retry_with_masterkey("azure", azure_masterkey); _test_retry_with_masterkey("gcp", gcp_masterkey); } static mongoc_client_t * create_encrypted_client(void) { mongoc_client_t *client = test_framework_new_default_client(); bson_error_t error; mongoc_auto_encryption_opts_t *ao = mongoc_auto_encryption_opts_new(); { bson_t extra = BSON_INITIALIZER; _set_extra_bypass(&extra); _set_extra_crypt_shared(&extra); mongoc_auto_encryption_opts_set_extra(ao, &extra); bson_destroy(&extra); } bson_t *kms_providers = BCON_NEW("local", "{", "key", BCON_BIN(BSON_SUBTYPE_UUID, (uint8_t *)LOCAL_MASTERKEY, 96), "}"); mongoc_auto_encryption_opts_set_keyvault_namespace(ao, "db", "keyvault"); mongoc_auto_encryption_opts_set_kms_providers(ao, kms_providers); ASSERT_OR_PRINT(mongoc_client_enable_auto_encryption(client, ao, &error), error); bson_destroy(kms_providers); mongoc_auto_encryption_opts_destroy(ao); return client; } #define ASSERT_COLL_MATCHES_ONE(coll, expect) \ if (1) { \ mongoc_cursor_t *cursor = mongoc_collection_find_with_opts((coll), tmp_bson("{}"), NULL, NULL); \ const bson_t *got; \ bool found = mongoc_cursor_next(cursor, &got); \ if (!found) { \ ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); \ test_error("expected 1 document, but got 0"); \ } \ assert_match_bson(got, expect, false); \ ASSERT(!mongoc_cursor_next(cursor, &got)); /* expect exactly one document */ \ mongoc_cursor_destroy(cursor); \ } else \ (void)0 #define ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect) \ if (1) { \ mongoc_cursor_t *cursor = mongoc_collection_aggregate((coll), 0, (pipeline), NULL, NULL); \ const bson_t *got; \ bool found = mongoc_cursor_next(cursor, &got); \ if (!found) { \ ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); \ test_error("expected 1 document, but got 0"); \ } \ ASSERT_EQUAL_BSON(expect, got); \ ASSERT(!mongoc_cursor_next(cursor, &got)); /* expect exactly one document */ \ mongoc_cursor_destroy(cursor); \ } else \ (void)0 #define ASSERT_AGG_ERROR(coll, pipeline, msg) \ if (1) { \ mongoc_cursor_t *cursor = mongoc_collection_aggregate((coll), 0, (pipeline), NULL, NULL); \ const bson_t *got; \ bool found = mongoc_cursor_next(cursor, &got); \ ASSERT(!found); \ ASSERT(mongoc_cursor_error(cursor, &error)); \ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 1, msg); \ mongoc_cursor_destroy(cursor); \ } else \ (void)0 #define MAKE_BSON(...) tmp_bson(BSON_STR(__VA_ARGS__)) static void drop_coll(mongoc_database_t *db, const char *collname) { bson_error_t error; mongoc_collection_t *coll = mongoc_database_get_collection(db, collname); bool ok = mongoc_collection_drop(coll, &error); if (!ok && error.code != MONGOC_SERVER_ERR_NS_NOT_FOUND) { test_error("unexpected error dropping %s: %s", collname, error.message); } mongoc_collection_destroy(coll); } server_version_t get_libmongocrypt_version(void) { #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION return test_framework_str_to_version(_mongoc_crypt_get_libmongocrypt_version()); #else return 0; #endif } static void test_lookup_setup(void) { bool ok; bson_error_t error; mongoc_client_t *encrypted_client = create_encrypted_client(); mongoc_client_t *setup_client = test_framework_new_default_client(); #define TESTDIR "./src/libmongoc/tests/client_side_encryption_prose/lookup/" // Insert key into key vault: { mongoc_collection_t *keyvault = mongoc_client_get_collection(encrypted_client, "db", "keyvault"); mongoc_collection_drop(keyvault, NULL); bson_t *keydoc = get_bson_from_json_file(TESTDIR "key-doc.json"); bson_t opts = BSON_INITIALIZER; // Apply majority write concern. { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); mongoc_write_concern_destroy(wc); } ASSERT_OR_PRINT(mongoc_collection_insert_one(keyvault, keydoc, NULL, &opts, &error), error); bson_destroy(&opts); bson_destroy(keydoc); mongoc_collection_destroy(keyvault); } // Create collections: { mongoc_database_t *db = mongoc_client_get_database(encrypted_client, "db"); // Create db.csfle: { drop_coll(db, "csfle"); bson_t *schema = get_bson_from_json_file(TESTDIR "schema-csfle.json"); bson_t *create_opts = BCON_NEW("validator", "{", "$jsonSchema", BCON_DOCUMENT(schema), "}"); mongoc_collection_t *coll = mongoc_database_create_collection(db, "csfle", create_opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(create_opts); bson_destroy(schema); } // Create db.csfle2: { drop_coll(db, "csfle2"); bson_t *schema = get_bson_from_json_file(TESTDIR "schema-csfle2.json"); bson_t *create_opts = BCON_NEW("validator", "{", "$jsonSchema", BCON_DOCUMENT(schema), "}"); mongoc_collection_t *coll = mongoc_database_create_collection(db, "csfle2", create_opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(create_opts); bson_destroy(schema); } // Create db.qe: { drop_coll(db, "qe"); bson_t *schema = get_bson_from_json_file(TESTDIR "schema-qe.json"); bson_t *create_opts = BCON_NEW("encryptedFields", BCON_DOCUMENT(schema)); mongoc_collection_t *coll = mongoc_database_create_collection(db, "qe", create_opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(create_opts); bson_destroy(schema); } // Create db.qe2: { drop_coll(db, "qe2"); bson_t *schema = get_bson_from_json_file(TESTDIR "schema-qe2.json"); bson_t *create_opts = BCON_NEW("encryptedFields", BCON_DOCUMENT(schema)); mongoc_collection_t *coll = mongoc_database_create_collection(db, "qe2", create_opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(create_opts); bson_destroy(schema); } // Create db.no_schema: { drop_coll(db, "no_schema"); mongoc_collection_t *coll = mongoc_database_create_collection(db, "noschema", NULL, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); } // Create db.no_schema2: { drop_coll(db, "no_schema2"); mongoc_collection_t *coll = mongoc_database_create_collection(db, "noschema2", NULL, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); } // Create db.non_csfle_schema: { drop_coll(db, "non_csfle_schema"); bson_t *const schema = get_bson_from_json_file(TESTDIR "schema-non-csfle.json"); bson_t *const create_opts = BCON_NEW("validator", "{", "$jsonSchema", BCON_DOCUMENT(schema), "}"); mongoc_collection_t *const coll = mongoc_database_create_collection(db, "non_csfle_schema", create_opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); bson_destroy(create_opts); bson_destroy(schema); } mongoc_database_destroy(db); } #undef TESTDIR // Insert initial documents: { mongoc_client_t *client = create_encrypted_client(); // Insert to db.csfle: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"csfle" : "csfle"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "csfle"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"csfle" : {"$$type" : "binData"}})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.csfle2: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle2"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"csfle2" : "csfle2"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "csfle2"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"csfle2" : {"$$type" : "binData"}})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.qe: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "qe"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"qe" : "qe"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "qe"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"qe" : {"$$type" : "binData"}})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.qe2: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "qe2"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"qe2" : "qe2"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "qe2"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"qe2" : {"$$type" : "binData"}})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.no_schema: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "no_schema"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"no_schema" : "no_schema"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is not encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "no_schema"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"no_schema" : "no_schema"})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.no_schema2: { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "no_schema2"); ok = mongoc_collection_insert_one(coll, MAKE_BSON({"no_schema2" : "no_schema2"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is not encrypted. mongoc_collection_t *coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "no_schema2"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"no_schema2" : "no_schema2"})); mongoc_collection_destroy(coll_unencrypted); } // Insert to db.non_csfle_schema { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "db", "non_csfle_schema"); ok = mongoc_collection_insert_one( coll, MAKE_BSON({"non_csfle_schema" : "non_csfle_schema"}), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); // Find document with unencrypted client to check it is not encrypted. mongoc_collection_t *const coll_unencrypted = mongoc_client_get_collection(setup_client, "db", "non_csfle_schema"); ASSERT_COLL_MATCHES_ONE(coll_unencrypted, MAKE_BSON({"non_csfle_schema" : "non_csfle_schema"})); mongoc_collection_destroy(coll_unencrypted); } mongoc_client_destroy(client); } mongoc_client_destroy(setup_client); mongoc_client_destroy(encrypted_client); } static void test_lookup(void *unused) { BSON_UNUSED(unused); test_lookup_setup(); bson_error_t error; // Case 1: db.csfle joins db.no_schema: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"csfle" : "csfle"}}, { "$lookup" : { "from" : "no_schema", "as" : "matched", "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); bson_t *expect = MAKE_BSON({"csfle" : "csfle", "matched" : [ {"no_schema" : "no_schema"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 2: db.qe joins db.no_schema. { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "qe"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"qe" : "qe"}}, { "$lookup" : { "from" : "no_schema", "as" : "matched", "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] } }, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] }); bson_t *expect = MAKE_BSON({"qe" : "qe", "matched" : [ {"no_schema" : "no_schema"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 3: db.no_schema joins db.csfle: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "no_schema"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, { "$lookup" : { "from" : "csfle", "as" : "matched", "pipeline" : [ {"$match" : {"csfle" : "csfle"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); bson_t *expect = MAKE_BSON({"no_schema" : "no_schema", "matched" : [ {"csfle" : "csfle"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 4: db.no_schema joins db.qe: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "no_schema"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, { "$lookup" : { "from" : "qe", "as" : "matched", "pipeline" : [ {"$match" : {"qe" : "qe"}}, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); bson_t *expect = MAKE_BSON({"no_schema" : "no_schema", "matched" : [ {"qe" : "qe"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 5: db.csfle joins db.csfle2: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"csfle" : "csfle"}}, { "$lookup" : { "from" : "csfle2", "as" : "matched", "pipeline" : [ {"$match" : {"csfle2" : "csfle2"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); bson_t *expect = MAKE_BSON({"csfle" : "csfle", "matched" : [ {"csfle2" : "csfle2"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 6: qe joins db.qe2: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "qe"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"qe" : "qe"}}, { "$lookup" : { "from" : "qe2", "as" : "matched", "pipeline" : [ {"$match" : {"qe2" : "qe2"}}, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] } }, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] }); bson_t *expect = MAKE_BSON({"qe" : "qe", "matched" : [ {"qe2" : "qe2"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 7: db.no_schema joins db.no_schema2: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "no_schema"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, { "$lookup" : { "from" : "no_schema2", "as" : "matched", "pipeline" : [ {"$match" : {"no_schema2" : "no_schema2"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); bson_t *expect = MAKE_BSON({"no_schema" : "no_schema", "matched" : [ {"no_schema2" : "no_schema2"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Case 8: db.csfle joins db.qe: { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"csfle" : "qe"}}, { "$lookup" : { "from" : "qe", "as" : "matched", "pipeline" : [ {"$match" : {"qe" : "qe"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); if (test_framework_get_server_version() < test_framework_str_to_version("8.2.0") || get_libmongocrypt_version() < test_framework_str_to_version("1.17.0")) { ASSERT_AGG_ERROR(coll, pipeline, "not supported"); } else { // The error domain differs depending on the query analysis component: // * `crypt_shared`: `MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION` // * `mongocryptd`: `MONGOC_ERROR_QUERY` static const char *const expected_error_substring = "Cannot specify both encryptionInformation and csfleEncryptionSchemas unless csfleEncryptionSchemas only " "contains non-encryption JSON schema validators"; if (mongoc_client_get_crypt_shared_version(client)) { ASSERT_AGG_ERROR(coll, pipeline, expected_error_substring); } else { mongoc_cursor_t *const cursor = mongoc_collection_aggregate(coll, 0, pipeline, NULL, NULL); const bson_t *got; ASSERT(!mongoc_cursor_next(cursor, &got)); ASSERT(mongoc_cursor_error(cursor, &error)); static const uint32_t expected_error_code = 10026002u; ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, expected_error_code, expected_error_substring); mongoc_cursor_destroy(cursor); } } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } } static void test_lookup_post82(void *unused) { BSON_UNUSED(unused); test_lookup_setup(); bson_error_t error; // Case 10: db.qe joins db.non_csfle_schema: { mongoc_client_t *const client = create_encrypted_client(); mongoc_collection_t *const coll = mongoc_client_get_collection(client, "db", "qe"); bson_t *const pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"qe" : "qe"}}, { "$lookup" : { "from" : "non_csfle_schema", "as" : "matched", "pipeline" : [ {"$match" : {"non_csfle_schema" : "non_csfle_schema"}}, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] } }, {"$project" : {"_id" : 0, "__safeContent__" : 0}} ] }); bson_t *const expect = MAKE_BSON({"qe" : "qe", "matched" : [ {"non_csfle_schema" : "non_csfle_schema"} ]}); ASSERT_AGG_RETURNS_ONE(coll, pipeline, expect); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } } static void test_lookup_pre81(void *unused) { BSON_UNUSED(unused); test_lookup_setup(); bson_error_t error; // Case 9: test error with <8.1 { mongoc_client_t *client = create_encrypted_client(); // Create new client to avoid schema caching. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "csfle"); bson_t *pipeline = MAKE_BSON({ "pipeline" : [ {"$match" : {"csfle" : "no_schema"}}, { "$lookup" : { "from" : "no_schema", "as" : "matched", "pipeline" : [ {"$match" : {"no_schema" : "no_schema"}}, {"$project" : {"_id" : 0}} ] } }, {"$project" : {"_id" : 0}} ] }); ASSERT_AGG_ERROR(coll, pipeline, "Upgrade"); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } } int skip_if_libmongocrypt_less_than_1_17_0(void) { return get_libmongocrypt_version() >= test_framework_str_to_version("1.17.0"); } void test_client_side_encryption_install(TestSuite *suite) { install_json_test_suite_with_check(suite, JSON_DIR, "client_side_encryption/legacy", test_client_side_encryption_cb, test_framework_skip_if_no_client_side_encryption); /* Prose tests from the spec. */ TestSuite_AddFull(suite, "/client_side_encryption/create_datakey_with_custom_key_material [lock:live-server]", test_create_datakey_with_custom_key_material, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_offline /* requires AWS */); TestSuite_AddFull(suite, "/client_side_encryption/datakey_and_double_encryption [lock:live-server]", test_datakey_and_double_encryption, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_offline /* requires AWS */); TestSuite_AddFull(suite, "/client_side_encryption/external_key_vault [lock:live-server]", test_external_key_vault, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_no_auth /* requires auth for error check */); TestSuite_AddFull(suite, "/client_side_encryption/bson_size_limits_and_batch_splitting [lock:live-server]", test_bson_size_limits_and_batch_splitting_no_qe, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/bson_size_limits_and_batch_splitting_qe [lock:live-server]", test_bson_size_limits_and_batch_splitting_qe, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_25, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/views_are_prohibited [lock:live-server]", test_views_are_prohibited, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/corpus [lock:live-server]", test_corpus, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_offline /* requires AWS */); TestSuite_AddFull(suite, "/client_side_encryption/custom_endpoint [lock:live-server]", test_custom_endpoint, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_offline /* requires AWS, Azure, and GCP */); TestSuite_AddFull(suite, "/client_side_encryption/bypass_spawning_mongocryptd/" "mongocryptdBypassSpawn [lock:live-server]", test_bypass_spawning_via_mongocryptdBypassSpawn, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/bypass_spawning_mongocryptd/" "bypassAutoEncryption [lock:live-server]", test_bypass_spawning_via_bypassAutoEncryption, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/bypass_spawning_mongocryptd/" "bypassQueryAnalysis [lock:live-server]", test_bypass_spawning_via_bypassQueryAnalysis, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/bypass_spawning_mongocryptd/" "cryptSharedLibLoaded [lock:live-server]", test_bypass_spawning_via_cryptSharedLibLoaded, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, _skip_if_no_crypt_shared); TestSuite_AddFull(suite, "/client_side_encryption/kms_tls/valid [lock:live-server]", test_kms_tls_cert_valid, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/kms_tls/expired [lock:live-server]", test_kms_tls_cert_expired, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/kms_tls/wrong_host [lock:live-server]", test_kms_tls_cert_wrong_host, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/unique_index_on_keyaltnames [lock:live-server]", test_unique_index_on_keyaltnames, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/prose_test_16/case1 [lock:live-server][timeout:30]", test_rewrap_with_separate_client_encryption, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/client_side_encryption/prose_test_16/case2 [lock:live-server]", test_rewrap_without_provider, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); /* Other, C driver specific, tests. */ TestSuite_AddFull(suite, "/client_side_encryption/single_and_pool_mismatches [lock:live-server]", test_invalid_single_and_pool_mismatches, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/multi_threaded [lock:live-server]", test_multi_threaded, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/malformed_explicit [lock:live-server]", test_malformed_explicit, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/kms_tls_options [lock:live-server]", test_kms_tls_options, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, test_framework_skip_if_offline /* requires AWS, Azure, and GCP */, /* Do not run on Windows due to CDRIVER-4181. Tests use a literal IP with a TLS connection. */ test_framework_skip_if_windows); TestSuite_AddFull(suite, "/client_side_encryption/kms_tls_options/extra_rejected [lock:live-server]", test_kms_tls_options_extra_rejected, NULL, NULL, test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/kms_retry [lock:live-server]", test_kms_retry, NULL, NULL, test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/case1 [lock:live-server]", test_explicit_encryption_case1, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/case2 [lock:live-server]", test_explicit_encryption_case2, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/case3 [lock:live-server]", test_explicit_encryption_case3, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/case4 [lock:live-server]", test_explicit_encryption_case4, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/case5 [lock:live-server]", test_explicit_encryption_case5, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/decryption_events/case1 [lock:live-server]", test_decryption_events_case1, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/decryption_events/case2 [lock:live-server]", test_decryption_events_case2, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/decryption_events/case3 [lock:live-server]", test_decryption_events_case3, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/decryption_events/case4 [lock:live-server]", test_decryption_events_case4, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/qe_docs_example [lock:live-server]", test_qe_docs_example, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/kms/callback [lock:live-server]", test_kms_callback, NULL, // dtor NULL, // ctx test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull(suite, "/client_side_encryption/kms/auto-aws/fail [lock:live-server]", test_auto_aws_fail, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, _not_have_aws_creds_env); TestSuite_AddFull(suite, "/client_side_encryption/kms/auto-aws/succeed [lock:live-server]", test_auto_aws_succeed, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive, _have_aws_creds_env); TestSuite_AddFull(suite, "/client_side_encryption/drop_qe_null_error [lock:live-server]", test_drop_qe_null_error, NULL, NULL, test_framework_skip_if_no_client_side_encryption, TestSuite_CheckLive); TestSuite_AddFull( suite, "/client_side_encryption/auto_datakeys [lock:live-server]", test_auto_datakeys, NULL, NULL, NULL); TestSuite_AddFull(suite, "/client_side_encryption/createEncryptedCollection/simple [lock:live-server]", test_create_encrypted_collection_simple, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/createEncryptedCollection/" "missing-encryptedFields [lock:live-server]", test_create_encrypted_collection_no_encryptedFields, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/createEncryptedCollection/" "bad-keyId [lock:live-server]", test_create_encrypted_collection_bad_keyId, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/createEncryptedCollection/insert [lock:live-server]", test_create_encrypted_collection_insert, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_21, test_framework_skip_if_single); TestSuite_AddFull(suite, "/client_side_encryption/bypass_mongocryptd_shared_library [lock:live-server]", test_bypass_mongocryptd_shared_library, NULL, NULL, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_17, _skip_if_no_crypt_shared); // Add test cases for prose test: 22. Range Explicit Encryption. { const char *rangeTypes[] = { "DecimalNoPrecision", "DecimalPrecision", "DoubleNoPrecision", "DoublePrecision", "Date", "Int", "Long", }; typedef struct { const char *name; TestFuncWC fn; } rangeCase; rangeCase rangeCases[] = { {"case1", test_range_explicit_encryption_case1}, {"case2", test_range_explicit_encryption_case2}, {"case3", test_range_explicit_encryption_case3}, {"case4", test_range_explicit_encryption_case4}, {"case5", test_range_explicit_encryption_case5}, {"case6", test_range_explicit_encryption_case6}, {"case7", test_range_explicit_encryption_case7}, {"case8", test_range_explicit_encryption_case8}, }; for (size_t i = 0; i < sizeof rangeTypes / sizeof rangeTypes[0]; i++) { for (size_t j = 0; j < sizeof rangeCases / sizeof rangeCases[0]; j++) { const char *rangeType = rangeTypes[i]; rangeCase rc = rangeCases[j]; char *test_name = bson_strdup_printf("/client_side_encryption/range_explicit_encryption/%s/%s", rc.name, rangeType); mstr name_with_tags = mstr_copy_cstring(test_name); mstr_append(&name_with_tags, mstr_cstring(" [lock:live-server]")); // Skip DecimalNoPrecision if not a replica set. if (0 == strcmp(rangeType, "DecimalNoPrecision")) { TestSuite_AddFull( suite, name_with_tags.data, rc.fn, NULL /* dtor */, (void *)rangeTypes[i] /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_25, /* range queries require MongoDB 8.0+ */ test_framework_skip_if_not_replset); } else { TestSuite_AddFull( suite, name_with_tags.data, rc.fn, NULL /* dtor */, (void *)rangeTypes[i] /* ctx */, test_framework_skip_if_no_client_side_encryption, test_framework_skip_if_max_wire_version_less_than_25, /* range queries require MongoDB 8.0+ */ test_framework_skip_if_single); } mstr_destroy(&name_with_tags); bson_free(test_name); } } TestSuite_AddFull(suite, "/client_side_encryption/range_explicit_encryption/applies_defaults [lock:live-server]", test_range_explicit_encryption_applies_defaults, NULL, NULL, // No need to test for server version requirements. Test does not contact server. test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/test_lookup [lock:live-server]", test_lookup, NULL, NULL, test_framework_skip_if_max_wire_version_less_than_26 /* require server 8.1+ */, test_framework_skip_if_single, /* QE not supported on standalone */ test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/test_lookup/post-8.2 [lock:live-server]", test_lookup_post82, NULL, NULL, test_framework_skip_if_max_wire_version_less_than_27, /* require server 8.2+ */ skip_if_libmongocrypt_less_than_1_17_0, /* require libmongocrypt 1.17.0+ */ test_framework_skip_if_single, /* QE not supported on standalone */ test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/test_lookup/pre-8.1 [lock:live-server]", test_lookup_pre81, NULL, NULL, test_framework_skip_if_max_wire_version_more_than_25 /* require server < 8.1 */, test_framework_skip_if_max_wire_version_less_than_21 /* require server > 7.0 for QE support */, test_framework_skip_if_single, /* QE not supported on standalone */ test_framework_skip_if_no_client_side_encryption); TestSuite_AddFull(suite, "/client_side_encryption/explicit_encryption/text", test_explicit_encryption_text, NULL, NULL, test_framework_skip_if_max_wire_version_less_than_27 /* require server > 8.2 for QE support */, test_framework_skip_if_single, /* QE not supported on standalone */ test_framework_skip_if_no_client_side_encryption); } } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-client.c000066400000000000000000004106541511661753600241520ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #include #endif #include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif static void test_client_cmd_w_server_id(void) { mock_rs_t *rs; mongoc_client_t *client; bson_error_t error; bson_t *opts; bson_t reply; future_t *future; request_t *request; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true /* has primary */, 1 /* secondary */, 0 /* arbiters */); mock_rs_run(rs); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); /* use serverId instead of prefs to select the secondary */ opts = tmp_bson("{'serverId': 2, 'readConcern': {'level': 'local'}}"); future = future_client_read_command_with_opts( client, "db", tmp_bson("{'ping': 1}"), NULL /* prefs */, opts, &reply, &error); /* recognized that wire version is recent enough for readConcern */ request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'ping': 1," " 'readConcern': {'level': 'local'}," " 'serverId': {'$exists': false}}")); ASSERT(mock_rs_request_is_to_secondary(rs, request)); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); bson_destroy(&reply); future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mock_rs_destroy(rs); } static void test_client_cmd_w_server_id_sharded(void) { mock_server_t *server; mongoc_client_t *client; bson_error_t error; bson_t *opts; bson_t reply; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); opts = tmp_bson("{'serverId': 1}"); future = future_client_read_command_with_opts( client, "db", tmp_bson("{'ping': 1}"), NULL /* prefs */, opts, &reply, &error); /* does NOT set secondaryOk, since this is a sharded topology */ request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'ping': 1, 'serverId': {'$exists': false}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); bson_destroy(&reply); future_destroy(future); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_server_id_option(void *ctx) { mongoc_client_t *client; bson_error_t error; bson_t *cmd; bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); cmd = tmp_bson("{'ping': 1}"); r = mongoc_client_read_command_with_opts( client, "test", cmd, NULL /* prefs */, tmp_bson("{'serverId': 'foo'}"), NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must be an integer"); r = mongoc_client_read_command_with_opts( client, "test", cmd, NULL /* prefs */, tmp_bson("{'serverId': 0}"), NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must be >= 1"); r = mongoc_client_read_command_with_opts( client, "test", cmd, NULL /* prefs */, tmp_bson("{'serverId': 1}"), NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_client_destroy(client); } static void test_client_cmd_w_write_concern(void *ctx) { mongoc_write_concern_t *good_wc; mongoc_write_concern_t *bad_wc; mongoc_client_t *client; bson_t *command = tmp_bson("{'insert' : 'test', " "'documents' : [{'hello' : 'world'}]}"); bson_t reply; bson_t *opts = NULL; bson_error_t error; BSON_UNUSED(ctx); opts = bson_new(); client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); good_wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(good_wc, 1); bad_wc = mongoc_write_concern_new(); /* writeConcern that will not pass mongoc_write_concern_is_valid */ bad_wc->wtimeout = -10; mongoc_write_concern_append(good_wc, opts); ASSERT_OR_PRINT(mongoc_client_write_command_with_opts(client, "test", command, opts, &reply, &error), error); bson_reinit(opts); bson_destroy(&reply); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_client_write_command_with_opts(client, "test", command, opts, &reply, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; bson_destroy(&reply); error.code = 0; error.domain = 0; if (!test_framework_is_mongos()) { mongoc_write_concern_set_w(bad_wc, 99); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); /* bad write concern in opts */ ASSERT(!mongoc_client_write_command_with_opts(client, "test", command, opts, &reply, &error)); assert_wc_oob_error(&error); bson_destroy(&reply); } mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); bson_destroy(opts); mongoc_client_destroy(client); } /* * test_client_cmd_write_concern: * * This test ensures that there is a lack of special * handling for write concerns and write concern * errors in generic functions that support commands * that write. * */ static void test_client_cmd_write_concern(void) { mongoc_client_t *client; bson_t reply; bson_error_t error; future_t *future; request_t *request; mock_server_t *server; bson_t *cmd; /* set up client and wire protocol version */ server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* command with invalid writeConcern */ cmd = tmp_bson("{'$db': 'test', 'foo' : 1, 'writeConcern' : {'w' : 99 }}"); future = future_client_command_simple(client, "test", cmd, NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, cmd); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); bson_destroy(&reply); /* standalone response */ future = future_client_command_simple(client, "test", cmd, NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, cmd); BSON_ASSERT(request); reply_to_request_simple(request, "{ 'ok' : 0, 'errmsg' : 'cannot use w > 1 when a " "host is not replicated', 'code' : 2 }"); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); request_destroy(request); bson_destroy(&reply); /* replicaset response */ future = future_client_command_simple(client, "test", cmd, NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, cmd); reply_to_request_simple(request, "{ 'ok' : 1, 'n': 1, " "'writeConcernError': {'code': 17, 'errmsg': 'foo'}}"); BSON_ASSERT(future_get_bool(future)); bson_destroy(&reply); future_destroy(future); mock_server_destroy(server); mongoc_client_destroy(client); request_destroy(request); } static void test_client_cmd_write_concern_fam(void) { mongoc_client_t *client; mongoc_write_concern_t *wc; bson_t *fam; bson_t reply; bson_error_t error; future_t *future; request_t *request; mock_server_t *server; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_client_set_write_concern(client, wc); fam = tmp_bson("{'findAndModify': 'collection'}"); future = future_client_read_write_command_with_opts(client, "test", fam, NULL, NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'findAndModify': 'collection', " "'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); bson_destroy(&reply); future_destroy(future); mock_server_destroy(server); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } static char * gen_test_user(void) { return bson_strdup_printf("testuser_%u_%u", (unsigned)time(NULL), (unsigned)gettestpid()); } static char * gen_good_uri(const char *username, const char *dbname) { char *host = test_framework_get_host(); uint16_t port = test_framework_get_port(); char *uri = bson_strdup_printf("mongodb://%s:testpass@%s:%hu/%s", username, host, port, dbname); bson_free(host); return uri; } static void test_mongoc_client_authenticate(void *context) { mongoc_client_t *admin_client; char *username; char *uri; bson_t roles; mongoc_database_t *database; char *uri_str_no_auth; char *uri_str_auth; mongoc_collection_t *collection; mongoc_client_t *auth_client; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bool r; bson_t q; BSON_UNUSED(context); /* * Log in as admin. */ admin_client = test_framework_new_default_client(); /* * Add a user to the test database. */ username = gen_test_user(); uri = gen_good_uri(username, "test"); database = mongoc_client_get_database(admin_client, "test"); (void)mongoc_database_remove_user(database, username, &error); bson_init(&roles); BCON_APPEND(&roles, "0", "{", "role", "read", "db", "test", "}"); r = mongoc_database_add_user( database, username, "testpass", tmp_bson("[{'role': 'read', 'db': 'test'}]"), NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_database_destroy(database); /* * Try authenticating with that user. */ bson_init(&q); uri_str_no_auth = test_framework_get_uri_str_no_auth("test"); uri_str_auth = test_framework_add_user_password(uri_str_no_auth, username, "testpass"); auth_client = test_framework_client_new(uri_str_auth, NULL); test_framework_set_ssl_opts(auth_client); collection = mongoc_client_get_collection(auth_client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, &q, NULL, NULL); r = mongoc_cursor_next(cursor, &doc); if (!r) { r = mongoc_cursor_error(cursor, &error); if (r) { fprintf(stderr, "Authentication failure: \"%s\"", error.message); } BSON_ASSERT(!r); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(auth_client); /* * Remove all test users. */ database = mongoc_client_get_database(admin_client, "test"); r = mongoc_database_remove_all_users(database, &error); BSON_ASSERT(r); bson_destroy(&q); bson_free(uri_str_no_auth); bson_free(uri_str_auth); bson_destroy(&roles); bson_free(uri); bson_free(username); mongoc_database_destroy(database); mongoc_client_destroy(admin_client); } static void test_mongoc_client_speculative_auth_failure(bool pooled) { mongoc_client_t *admin_client; char *username; bson_t roles; mongoc_database_t *database; char *uri_str_no_auth; char *uri_str_auth; mongoc_collection_t *collection; mongoc_client_t *auth_client; mongoc_client_pool_t *pool = NULL; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bool r; bson_t q; /* * Log in as admin. */ admin_client = test_framework_new_default_client(); /* * Add a user to the test database. */ username = gen_test_user(); database = mongoc_client_get_database(admin_client, "test"); (void)mongoc_database_remove_user(database, username, &error); bson_init(&roles); BCON_APPEND(&roles, "0", "{", "role", "read", "db", "test", "}"); r = mongoc_database_add_user( database, username, "testpass", tmp_bson("[{'role': 'read', 'db': 'test'}]"), NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_database_destroy(database); bson_init(&q); uri_str_no_auth = test_framework_get_uri_str_no_auth("test"); uri_str_auth = test_framework_add_user_password(uri_str_no_auth, username, "testpass"); { mongoc_uri_t *const uri = mongoc_uri_new(uri_str_auth); ASSERT(mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false)); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); auth_client = mongoc_client_pool_pop(pool); } else { auth_client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(auth_client); } mongoc_uri_destroy(uri); } collection = mongoc_client_get_collection(auth_client, "test", "test"); database = mongoc_client_get_database(admin_client, "admin"); /* Enable failpoint to break saslContinue */ r = mongoc_database_command_simple(database, tmp_bson("{'configureFailPoint': 'failCommand', " "'mode': {'times': 1}, " "'data': {'failCommands': ['saslContinue'], 'closeConnection': " "true, 'errorCode': 10107}}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_database_destroy(database); /* Try authenticating by running a find operation */ capture_logs(true); cursor = mongoc_collection_find_with_opts(collection, &q, NULL, NULL); r = mongoc_cursor_next(cursor, &doc); if (!r) { r = mongoc_cursor_error(cursor, &error); BSON_ASSERT(r); /* A client pool on servers supporting speculative auth (4.4+) will get an * error on saslContinue and subsequently attempt to start auth from the * beginning. The failpoint closes the stream causing an error from * saslStart. */ if (pooled && test_framework_max_wire_version_at_least(WIRE_VERSION_4_4)) { ASSERT_CAPTURED_LOG("cluster", MONGOC_LOG_LEVEL_WARNING, "Failed to send \"saslStart\" command"); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Failed to send \"saslStart\" command"); } else { ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Failed to send \"saslContinue\" command"); } } capture_logs(false); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, auth_client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(auth_client); } /* * Remove all test users. */ database = mongoc_client_get_database(admin_client, "test"); r = mongoc_database_remove_all_users(database, &error); BSON_ASSERT(r); bson_destroy(&q); bson_free(uri_str_no_auth); bson_free(uri_str_auth); bson_destroy(&roles); bson_free(username); mongoc_database_destroy(database); mongoc_client_destroy(admin_client); } static void test_mongoc_client_single_speculative_auth_failure(void *context) { BSON_UNUSED(context); test_mongoc_client_speculative_auth_failure(false); } static void test_mongoc_client_pooled_speculative_auth_failure(void *context) { BSON_UNUSED(context); test_mongoc_client_speculative_auth_failure(true); } static void test_mongoc_client_authenticate_cached(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_t insert = BSON_INITIALIZER; const bson_t *doc; bson_error_t error; bool r; int i = 0; uint32_t server_id; { mongoc_uri_t *const uri = test_framework_get_uri(); // Avoid retryable handshakes from interfering with screwed-up cache. mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); } mongoc_uri_destroy(uri); } collection = mongoc_client_get_collection(client, "test", "test"); mongoc_collection_insert_one(collection, &insert, NULL, NULL, &error); for (i = 0; i < 10; i++) { mongoc_topology_scanner_node_t *scanner_node; cursor = mongoc_collection_find_with_opts(collection, &insert, NULL, NULL); r = mongoc_cursor_next(cursor, &doc); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(r); server_id = mongoc_cursor_get_server_id(cursor); mongoc_cursor_destroy(cursor); if (pooled) { mongoc_cluster_disconnect_node(&client->cluster, server_id); } else { scanner_node = mongoc_topology_scanner_get_node(client->topology->scanner, server_id); mongoc_stream_destroy(scanner_node->stream); scanner_node->stream = NULL; } } mongoc_collection_destroy(collection); if (pooled) { capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&insert); } static void test_mongoc_client_authenticate_cached_pooled(void *context) { BSON_UNUSED(context); test_mongoc_client_authenticate_cached(true); } static void test_mongoc_client_authenticate_cached_single(void *context) { BSON_UNUSED(context); test_mongoc_client_authenticate_cached(false); } static void test_mongoc_client_authenticate_failure(void *context) { mongoc_collection_t *collection; mongoc_cursor_t *cursor; mongoc_client_t *client; const bson_t *doc; bson_error_t error; bool r; bson_t q; bson_t empty = BSON_INITIALIZER; char *host = test_framework_get_host(); char *uri_str_no_auth = test_framework_get_uri_str_no_auth(NULL); char *bad_uri_str = test_framework_add_user_password(uri_str_no_auth, "baduser", "badpass"); BSON_UNUSED(context); /* * Try authenticating with bad user. */ bson_init(&q); client = test_framework_client_new(bad_uri_str, NULL); test_framework_set_ssl_opts(client); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, &q, NULL, NULL); r = mongoc_cursor_next(cursor, &doc); BSON_ASSERT(!r); r = mongoc_cursor_error(cursor, &error); BSON_ASSERT(r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_CLIENT_AUTHENTICATE); mongoc_cursor_destroy(cursor); /* * Try various commands while in the failed state to ensure we get the * same sort of errors. */ r = mongoc_collection_insert_one(collection, &empty, NULL, NULL, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_CLIENT_AUTHENTICATE); /* * Try various commands while in the failed state to ensure we get the * same sort of errors. */ r = mongoc_collection_update_one(collection, &q, &empty, NULL, NULL, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_CLIENT_AUTHENTICATE); bson_destroy(&q); bson_destroy(&empty); bson_free(host); bson_free(uri_str_no_auth); bson_free(bad_uri_str); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_mongoc_client_authenticate_timeout(void *context) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; bson_t reply; bson_error_t error; future_t *future; request_t *request; BSON_UNUSED(context); if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_username(uri, "user"); mongoc_uri_set_password(uri, "password"); mongoc_uri_set_option_as_int32(uri, "socketTimeoutMS", 10); client = test_framework_client_new_from_uri(uri, NULL); future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'}")); ASSERT(request); ASSERT_CMPSTR(request->command_name, "saslStart"); /* don't reply */ BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Failed to send \"saslStart\" command with database \"admin\""); bson_destroy(&reply); future_destroy(future); request_destroy(request); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mock_server_destroy(server); } /* Update: this test was changed after CDRIVER-3653 was fixed. * Originally, the test used cursor operations, assuming changes in the * min/maxWireVersion from the mock server would be re-evaluated on each cursor * operation. * After CDRIVER-3653 was fixed, this is no longer true. The cursor will examine * the server description associated with the connection handshake. If the * connection has not been closed, changes from monitoring will not affect the * connection's server description. * This test now uses mongoc_client_select_server to validate wire version * checks. */ static void test_wire_version(void) { mongoc_uri_t *uri; mongoc_client_t *client; mock_server_t *server; bson_error_t error; bson_t q = BSON_INITIALIZER; mongoc_server_description_t *sd; if (!test_framework_skip_if_slow()) { bson_destroy(&q); return; } server = mock_server_new(); /* too new */ mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MAX + 1, WIRE_VERSION_MAX + 1); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); client = test_framework_client_new_from_uri(uri, NULL); sd = mongoc_client_select_server(client, true, NULL, &error); BSON_ASSERT(!sd); BSON_ASSERT(error.domain == MONGOC_ERROR_PROTOCOL); BSON_ASSERT(error.code == MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION); /* too old */ mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN - 1, WIRE_VERSION_MIN - 1); /* wait until it's time for next heartbeat */ mlib_sleep_for(600, ms); sd = mongoc_client_select_server(client, true, NULL, &error); BSON_ASSERT(!sd); BSON_ASSERT(error.domain == MONGOC_ERROR_PROTOCOL); BSON_ASSERT(error.code == MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION); /* compatible again */ mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); /* wait until it's time for next heartbeat */ mlib_sleep_for(600, ms); sd = mongoc_client_select_server(client, true, NULL, &error); ASSERT_OR_PRINT(sd, error); mongoc_server_description_destroy(sd); bson_destroy(&q); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void _test_command_read_prefs(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_read_prefs_t *secondary_pref; bson_t *cmd; future_t *future; bson_error_t error; request_t *request; /* mock mongos: easiest way to test that read preference is configured */ server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); secondary_pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_uri_set_read_prefs_t(uri, secondary_pref); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } ASSERT_CMPINT(MONGOC_READ_SECONDARY, ==, mongoc_read_prefs_get_mode(mongoc_client_get_read_prefs(client))); cmd = tmp_bson("{'foo': 1}"); /* without read preference */ future = future_client_command_simple(client, "db", cmd, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'foo': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* with read preference */ future = future_client_command_simple(client, "db", cmd, secondary_pref, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'foo': 1," " '$readPreference': {'mode': 'secondary'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_uri_destroy(uri); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_read_prefs_destroy(secondary_pref); mock_server_destroy(server); } static void test_command_simple_read_prefs_single(void) { _test_command_read_prefs(false); } static void test_command_simple_read_prefs_pooled(void) { _test_command_read_prefs(true); } static void test_command_not_found_simple(void) { mongoc_client_t *client; bson_t reply; bson_error_t error; client = test_framework_new_default_client(); ASSERT(!mongoc_client_command_simple(client, "test", tmp_bson("{'foo': 1}"), NULL, &reply, &error)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_QUERY); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_QUERY_COMMAND_NOT_FOUND); bson_destroy(&reply); mongoc_client_destroy(client); } static void test_command_with_opts_read_prefs(void) { mock_server_t *server; mongoc_client_t *client; mongoc_read_prefs_t *read_prefs; bson_t *cmd; bson_t *opts; bson_error_t error; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, read_prefs); /* read prefs omitted for command that writes */ cmd = tmp_bson("{'create': 'db'}"); future = future_client_write_command_with_opts(client, "admin", cmd, NULL /* opts */, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'create': 'db'}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* read prefs are included for read command */ cmd = tmp_bson("{'count': 'collection'}"); future = future_client_read_command_with_opts(client, "admin", cmd, NULL, NULL /* opts */, NULL, &error); /* Server Selection Spec: For all read preference modes that are not * 'primary', drivers MUST set '$readPreference'. */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'count': 'collection'," " '$readPreference': {'mode': 'secondary'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* read prefs not included for read/write command, but read concern is */ cmd = tmp_bson("{'whatever': 1}"); opts = tmp_bson("{'readConcern': {'level': 'majority'}}"); future = future_client_read_write_command_with_opts(client, "admin", cmd, NULL, opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'whatever': 1," " 'readConcern': {'level': 'majority'}," " '$readPreference': {'$exists': false}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_read_prefs_destroy(read_prefs); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_read_write_cmd_with_opts(void) { mock_rs_t *rs; mongoc_client_t *client; mongoc_read_prefs_t *secondary; bson_error_t error; bson_t reply; future_t *future; request_t *request; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true /* has primary */, 1 /* secondary */, 0 /* arbiters */); mock_rs_run(rs); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); secondary = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); /* mongoc_client_read_write_command_with_opts must ignore read prefs * CDRIVER-2224 */ future = future_client_read_write_command_with_opts( client, "db", tmp_bson("{'ping': 1}"), secondary, NULL, &reply, &error); request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'ping': 1}")); ASSERT(mock_rs_request_is_to_primary(rs, request)); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); bson_destroy(&reply); future_destroy(future); request_destroy(request); mongoc_read_prefs_destroy(secondary); mongoc_client_destroy(client); mock_rs_destroy(rs); } static void test_read_command_with_opts(void) { mock_server_t *server; mongoc_client_t *client; bson_t *cmd; bson_t *opts; mongoc_write_concern_t *wc; mongoc_read_concern_t *read_concern; bson_error_t error; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* collation allowed */ cmd = tmp_bson("{'create': 'db'}"); opts = tmp_bson("{'collation': {'locale': 'en_US'}}"); future = future_client_write_command_with_opts(client, "admin", cmd, opts, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'create': 'db', 'collation': {'locale': 'en_US'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* writeConcern included */ cmd = tmp_bson("{'create': 'db'}"); opts = tmp_bson("{'writeConcern': {'w': 1}}"); future = future_client_write_command_with_opts(client, "admin", cmd, opts, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'create': 'db', 'writeConcern': {'w': 1}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* apply client's write concern by default */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 1); mongoc_client_set_write_concern(client, wc); future = future_client_write_command_with_opts(client, "admin", cmd, NULL /* opts */, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'create': 'db', 'writeConcern': {'w': 1}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* apply write concern from opts, not client */ opts = tmp_bson("{'writeConcern': {'w': 2}}"); mongoc_write_concern_destroy(wc); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 4); mongoc_client_set_write_concern(client, wc); future = future_client_write_command_with_opts(client, "admin", cmd, opts, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'create': 'db', 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* readConcern allowed */ cmd = tmp_bson("{'count': 'collection'}"); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, "local"); opts = tmp_bson(NULL); mongoc_read_concern_append(read_concern, opts); future = future_client_read_command_with_opts(client, "admin", cmd, NULL, opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'count': 'collection'," " 'readConcern': {'level': 'local'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* apply client's readConcern by default */ mongoc_client_set_read_concern(client, read_concern); future = future_client_read_command_with_opts(client, "admin", cmd, NULL, NULL /* opts */, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'count': 'collection'," " 'readConcern': {'level': 'local'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_read_concern_destroy(read_concern); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_command_with_opts(void) { mock_server_t *server; mongoc_client_t *client; bson_t *cmd; mongoc_write_concern_t *wc; mongoc_read_concern_t *read_concern; mongoc_read_prefs_t *prefs; bson_error_t error; future_t *future; request_t *request; bson_t opts = BSON_INITIALIZER; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* client's write concern, read concern, read prefs are ignored */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_client_set_write_concern(client, wc); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, "majority"); mongoc_client_set_read_concern(client, read_concern); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, prefs); cmd = tmp_bson("{'create': 'db'}"); future = future_client_command_with_opts(client, "admin", cmd, NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'create': 'db'," " 'readConcern': {'$exists': false}," " 'writeConcern': {'$exists': false}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* write concern, read concern, and read preference passed in explicitly */ mongoc_write_concern_append(wc, &opts); mongoc_read_concern_append(read_concern, &opts); future = future_client_command_with_opts(client, "admin", cmd, prefs, &opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'," " 'create':'db'," " 'writeConcern': {'w': 2}," " 'readConcern': {'level':'majority'}," " '$readPreference': {'mode':'secondary'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); bson_destroy(&opts); mongoc_read_prefs_destroy(prefs); mongoc_read_concern_destroy(read_concern); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_command_with_opts_op_msg(void) { mock_server_t *server; mongoc_client_t *client; bson_t *cmd; mongoc_write_concern_t *wc; mongoc_read_concern_t *read_concern; mongoc_read_prefs_t *prefs; bson_error_t error; future_t *future; request_t *request; bson_t opts = BSON_INITIALIZER; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_auto_endsessions(server); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* client's write concern, read concern, read prefs are ignored */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_client_set_write_concern(client, wc); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, "majority"); mongoc_client_set_read_concern(client, read_concern); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, prefs); cmd = tmp_bson("{'create': 'db'}"); future = future_client_command_with_opts(client, "admin", cmd, NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{" " 'create': 'db'," " 'readConcern': {'$exists': false}," " 'writeConcern': {'$exists': false}" "}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* write concern, read concern, and read preference passed in explicitly */ mongoc_write_concern_append(wc, &opts); mongoc_read_concern_append(read_concern, &opts); future = future_client_command_with_opts(client, "admin", cmd, prefs, &opts, NULL, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{" " 'create':'db'," " 'writeConcern': {'w': 2}," " 'readConcern': {'level':'majority'}," " '$readPreference': {" " 'mode':'secondary'" " }" "}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); bson_destroy(&opts); mongoc_read_prefs_destroy(prefs); mongoc_read_concern_destroy(read_concern); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_command_empty(void) { mongoc_client_t *client; mongoc_write_concern_t *wc; bson_error_t error; bool r; client = test_framework_new_default_client(); r = mongoc_client_command_simple(client, "admin", tmp_bson("{}"), NULL, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command document"); r = mongoc_client_command_with_opts(client, "admin", tmp_bson("{}"), NULL, tmp_bson("{}"), NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command document"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 1); mongoc_client_set_write_concern(client, wc); r = mongoc_client_write_command_with_opts(client, "admin", tmp_bson("{}"), NULL, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Empty command document"); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } static void test_command_no_errmsg(void) { mock_server_t *server; mongoc_client_t *client; bson_t *cmd; bson_error_t error; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_error_api(client, 2); cmd = tmp_bson("{'command': 1}"); future = future_client_command_simple(client, "admin", cmd, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'}")); /* auth errors have $err, not errmsg. we'd raised "Unknown command error", * see CDRIVER-1928 */ reply_to_request_simple(request, "{'ok': 0, 'code': 7, '$err': 'bad!'}"); ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 7, "bad!"); future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_unavailable_seeds(void) { mock_server_t *servers[2]; char **uri_strs; char **uri_str; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_t query = BSON_INITIALIZER; const bson_t *doc; bson_error_t error; mlib_foreach_arr (mock_server_t *, srv, servers) { *srv = mock_server_down(); /* hangs up on all requests */ mock_server_run(*srv); } const int num_uris = 6; uri_str = uri_strs = bson_malloc0((num_uris + 1) * sizeof(char *)); *(uri_str++) = bson_strdup_printf("mongodb://%s", mock_server_get_host_and_port(servers[0])); *(uri_str++) = bson_strdup_printf( "mongodb://%s,%s", mock_server_get_host_and_port(servers[0]), mock_server_get_host_and_port(servers[1])); *(uri_str++) = bson_strdup_printf("mongodb://%s,%s/?replicaSet=rs", mock_server_get_host_and_port(servers[0]), mock_server_get_host_and_port(servers[1])); *(uri_str++) = bson_strdup_printf("mongodb://u:p@%s", mock_server_get_host_and_port(servers[0])); *(uri_str++) = bson_strdup_printf( "mongodb://u:p@%s,%s", mock_server_get_host_and_port(servers[0]), mock_server_get_host_and_port(servers[1])); *(uri_str++) = bson_strdup_printf("mongodb://u:p@%s,%s/?replicaSet=rs", mock_server_get_host_and_port(servers[0]), mock_server_get_host_and_port(servers[1])); mlib_foreach (char *, uri, uri_strs, num_uris) { client = test_framework_client_new(*uri, NULL); BSON_ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_SERVER_SELECTION); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_SERVER_SELECTION_FAILURE); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } mlib_foreach_arr (mock_server_t *, srv, servers) { mock_server_destroy(*srv); } bson_strfreev(uri_strs); bson_destroy(&query); } typedef enum { NO_CONNECT, CONNECT, RECONNECT } connection_option_t; static bool responder(request_t *request, void *data) { BSON_UNUSED(data); if (!strcmp(request->command_name, "foo")) { reply_to_request_with_ok_and_destroy(request); return true; } return false; } /* mongoc_set_for_each callback */ static bool host_equals(const void *item, void *ctx) { const mongoc_server_description_t *sd = item; const char *host_and_port = ctx; return !strcasecmp(sd->host.host_and_port, host_and_port); } /* CDRIVER-721 catch errors in _mongoc_cluster_destroy */ static void test_seed_list(bool rs, connection_option_t connection_option, bool pooled) { mock_server_t *server; mock_server_t *down_servers[3]; int i; char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_topology_t *topology; mongoc_read_prefs_t *primary_pref; uint32_t discovered_nodes_len; bson_t reply; bson_error_t error; uint32_t id; mc_shared_tpld td = MC_SHARED_TPLD_NULL; server = mock_server_new(); mock_server_run(server); for (i = 0; i < 3; i++) { down_servers[i] = mock_server_down(); mock_server_run(down_servers[i]); } uri_str = bson_strdup_printf("mongodb://%s,%s,%s,%s", mock_server_get_host_and_port(server), mock_server_get_host_and_port(down_servers[0]), mock_server_get_host_and_port(down_servers[1]), mock_server_get_host_and_port(down_servers[2])); uri = mongoc_uri_new(uri_str); BSON_ASSERT(uri); if (pooled) { /* must be >= minHeartbeatFrequencyMS=500 or the "reconnect" * case won't have time to succeed */ mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 1000); } if (rs) { mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", mock_server_get_host_and_port(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); } else { mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'msg': 'isdbgrid'}"); } /* auto-respond to "foo" command */ mock_server_autoresponds(server, responder, NULL, NULL); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } topology = client->topology; /* a mongos load-balanced connection never removes down nodes */ discovered_nodes_len = rs ? 1 : 4; primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); if (connection_option == CONNECT || connection_option == RECONNECT) { /* only localhost:port responds to initial discovery. the other seeds are * discarded from replica set topology, but remain for sharded. */ ASSERT_OR_PRINT( mongoc_client_command_simple(client, "test", tmp_bson("{'foo': 1}"), primary_pref, &reply, &error), error); bson_destroy(&reply); /* td may be invalidated by client_command_simple */ mc_tpld_renew_ref(&td, topology); ASSERT_CMPINT(discovered_nodes_len, ==, (int)mc_tpld_servers_const(td.ptr)->items_len); if (rs) { ASSERT_CMPINT(td.ptr->type, ==, MONGOC_TOPOLOGY_RS_WITH_PRIMARY); } else { ASSERT_CMPINT(td.ptr->type, ==, MONGOC_TOPOLOGY_SHARDED); } if (pooled) { /* nodes created on demand when we use servers for actual operations */ ASSERT_CMPINT((int)client->cluster.nodes->items_len, ==, 1); } } if (connection_option == RECONNECT) { id = mongoc_set_find_id(mc_tpld_servers_const(td.ptr), host_equals, (void *)mock_server_get_host_and_port(server)); ASSERT_CMPINT(id, !=, 0); _mongoc_topology_invalidate_server(topology, id); mc_tpld_renew_ref(&td, topology); if (rs) { ASSERT_CMPINT(td.ptr->type, ==, MONGOC_TOPOLOGY_RS_NO_PRIMARY); } else { ASSERT_CMPINT(td.ptr->type, ==, MONGOC_TOPOLOGY_SHARDED); } ASSERT_OR_PRINT( mongoc_client_command_simple(client, "test", tmp_bson("{'foo': 1}"), primary_pref, &reply, &error), error); bson_destroy(&reply); /* td may be invalidated by client_command_simple */ mc_tpld_renew_ref(&td, topology); ASSERT_CMPINT(discovered_nodes_len, ==, (int)mc_tpld_servers_const(td.ptr)->items_len); if (pooled) { ASSERT_CMPINT((int)client->cluster.nodes->items_len, ==, 1); } } /* testing for crashes like CDRIVER-721 */ if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_read_prefs_destroy(primary_pref); mongoc_uri_destroy(uri); bson_free(uri_str); for (i = 0; i < 3; i++) { mock_server_destroy(down_servers[i]); } mock_server_destroy(server); mc_tpld_drop_ref(&td); } static void test_rs_seeds_no_connect_single(void) { test_seed_list(true, NO_CONNECT, false); } static void test_rs_seeds_no_connect_pooled(void) { test_seed_list(true, NO_CONNECT, true); } static void test_rs_seeds_connect_single(void) { test_seed_list(true, CONNECT, false); } static void test_rs_seeds_connect_pooled(void) { test_seed_list(true, CONNECT, true); } static void test_rs_seeds_reconnect_single(void) { test_seed_list(true, RECONNECT, false); } static void test_rs_seeds_reconnect_pooled(void) { test_seed_list(true, RECONNECT, true); } static void test_mongos_seeds_no_connect_single(void) { test_seed_list(false, NO_CONNECT, false); } static void test_mongos_seeds_no_connect_pooled(void) { test_seed_list(false, NO_CONNECT, true); } static void test_mongos_seeds_connect_single(void) { test_seed_list(false, CONNECT, false); } static void test_mongos_seeds_connect_pooled(void) { test_seed_list(false, CONNECT, true); } static void test_mongos_seeds_reconnect_single(void) { test_seed_list(false, RECONNECT, false); } static void test_mongos_seeds_reconnect_pooled(void) { test_seed_list(false, RECONNECT, true); } static void test_recovering(void *ctx) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_read_mode_t read_mode; mongoc_read_prefs_t *prefs; bson_error_t error; BSON_UNUSED(ctx); if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_new(); mock_server_run(server); /* server is "recovering": not primary, not secondary */ mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': false," " 'secondary': false," " 'setName': 'rs'," " 'hosts': ['%s']}", mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); client = test_framework_client_new_from_uri(uri, NULL); prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); /* recovering member matches no read mode */ for (read_mode = MONGOC_READ_PRIMARY; read_mode <= MONGOC_READ_NEAREST; read_mode++) { mongoc_read_prefs_set_mode(prefs, read_mode); BSON_ASSERT(!mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, prefs, NULL, &error)); } mongoc_read_prefs_destroy(prefs); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_get_database_names(void) { mock_server_t *server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mongoc_client_t *client; bson_error_t error; future_t *future; request_t *request; char **names; mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); future = future_client_get_database_names_with_opts(client, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'listDatabases': 1, 'nameOnly': true}")); reply_to_request(request, 0, 0, 0, 1, "{'ok': 1.0, 'databases': [{'name': 'a'}, {'name': 'local'}]}"); names = future_get_char_ptr_ptr(future); BSON_ASSERT(!strcmp(names[0], "a")); BSON_ASSERT(!strcmp(names[1], "local")); BSON_ASSERT(NULL == names[2]); bson_strfreev(names); request_destroy(request); future_destroy(future); future = future_client_get_database_names_with_opts(client, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'listDatabases': 1, 'nameOnly': true}")); reply_to_request(request, 0, 0, 0, 1, "{'ok': 0.0, 'code': 17, 'errmsg': 'err'}"); names = future_get_char_ptr_ptr(future); BSON_ASSERT(!names); ASSERT_CMPINT(MONGOC_ERROR_QUERY, ==, error.domain); ASSERT_CMPSTR("err", error.message); request_destroy(request); future_destroy(future); mongoc_client_destroy(client); mock_server_destroy(server); } static void _test_mongoc_client_ipv6(bool pooled) { char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; #if (defined(__APPLE__) || defined(_WIN32)) && defined(MONGOC_ENABLE_SSL) mongoc_ssl_opt_t ssl_opts; #endif bson_error_t error; uri_str = test_framework_add_user_password_from_env("mongodb://[::1]/"); uri = mongoc_uri_new(uri_str); BSON_ASSERT(uri); #if (defined(__APPLE__) || defined(_WIN32)) && defined(MONGOC_ENABLE_SSL) /* This is necessary because macOS & Windows seem to treat [::1] as not * matching the hostname "0:0:0:0:0:0:0:1", which results in a certificate * trust failure. This behavior has been captured in CDRIVER-3765 (macOS) * and CDRIVER-3766 (Windows). When those are fixed, the code in this * function should be restored to its previous state without the use of * ssl_opts.allow_invalid_hostname. */ ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.allow_invalid_hostname = true; #endif if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); #if (defined(__APPLE__) || defined(_WIN32)) && defined(MONGOC_ENABLE_SSL) mongoc_client_pool_set_ssl_opts(pool, &ssl_opts); #else test_framework_set_pool_ssl_opts(pool); #endif client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); #if (defined(__APPLE__) || defined(_WIN32)) && defined(MONGOC_ENABLE_SSL) mongoc_client_set_ssl_opts(client, &ssl_opts); #else test_framework_set_ssl_opts(client); #endif } #if (defined(__APPLE__) || defined(_WIN32)) && defined(MONGOC_ENABLE_SSL) BSON_ASSERT(client->ssl_opts.allow_invalid_hostname); #endif ASSERT_OR_PRINT( mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error), error); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); bson_free(uri_str); } static void test_mongoc_client_ipv6_single(void) { _test_mongoc_client_ipv6(false); } static void test_mongoc_client_ipv6_pooled(void) { _test_mongoc_client_ipv6(true); } static void test_mongoc_client_unix_domain_socket(void *context) { mongoc_client_t *client; bson_error_t error; char *uri_str; BSON_UNUSED(context); uri_str = test_framework_get_unix_domain_socket_uri_str(); client = test_framework_client_new(uri_str, NULL); test_framework_set_ssl_opts(client); BSON_ASSERT(client); ASSERT_OR_PRINT( mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error), error); mongoc_client_destroy(client); bson_free(uri_str); } static void test_mongoc_client_mismatched_me(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_read_prefs_t *prefs; bson_error_t error; future_t *future; request_t *request; char *reply; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); client = test_framework_client_new_from_uri(uri, NULL); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); /* any operation should fail with server selection error */ future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), prefs, NULL, &error); request = mock_server_receives_any_hello(server); reply = bson_strdup_printf("{'ok': 1," " 'setName': 'rs'," " 'isWritablePrimary': false," " 'secondary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'me': 'foo.com'," /* mismatched "me" field */ " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); capture_logs(true); reply_to_request_simple(request, reply); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers"); ASSERT_CAPTURED_LOG("client", MONGOC_LOG_LEVEL_WARNING, "Last server removed from topology"); capture_logs(false); bson_free(reply); request_destroy(request); future_destroy(future); mongoc_read_prefs_destroy(prefs); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } #ifdef MONGOC_ENABLE_SSL static void _test_mongoc_client_ssl_opts(bool pooled) { char *host_and_port; char *uri_str; char *uri_str_auth; char *uri_str_auth_ssl; mongoc_uri_t *uri; const mongoc_ssl_opt_t *ssl_opts; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bool ret; bson_error_t error; int add_ssl_to_uri; host_and_port = test_framework_get_host_and_port(); uri_str = bson_strdup_printf("mongodb://%s/?serverSelectionTimeoutMS=1000&connectTimeoutMS=1000", host_and_port); uri_str_auth = test_framework_add_user_password_from_env(uri_str); uri_str_auth_ssl = bson_strdup_printf("%s&ssl=true", uri_str_auth); ssl_opts = test_framework_get_ssl_opts(); /* client uses SSL once SSL options are set, regardless of "ssl=true" */ for (add_ssl_to_uri = 0; add_ssl_to_uri < 2; add_ssl_to_uri++) { if (add_ssl_to_uri) { uri = mongoc_uri_new(uri_str_auth_ssl); } else { uri = mongoc_uri_new(uri_str_auth); } if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_client_pool_set_ssl_opts(pool, ssl_opts); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_ssl_opts(client, ssl_opts); } /* any operation */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); if (test_framework_get_ssl()) { ASSERT_OR_PRINT(ret, error); } else { /* TODO: CDRIVER-936 check the err msg has "SSL handshake failed" */ ASSERT(!ret); ASSERT_CMPINT(MONGOC_ERROR_SERVER_SELECTION, ==, error.domain); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } bson_free(uri_str_auth_ssl); bson_free(uri_str_auth); bson_free(uri_str); bson_free(host_and_port); } static void test_ssl_single(void) { _test_mongoc_client_ssl_opts(false); } static void test_ssl_pooled(void) { _test_mongoc_client_ssl_opts(true); } static void test_client_buildinfo_hang(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_database_t *database; bson_error_t error; bson_t command; bson_t reply; pool = test_framework_new_default_client_pool(); BSON_ASSERT(pool); client = mongoc_client_pool_pop(pool); database = mongoc_client_get_database(client, "admin"); bson_init(&command); bson_append_int32(&command, "buildInfo", -1, 1); /* Prior to a bug fix this command caused a hang - see CDRIVER-3318 */ ASSERT_OR_PRINT(mongoc_database_command_simple(database, &command, NULL, &reply, &error), error); bson_destroy(&command); bson_destroy(&reply); mongoc_database_destroy(database); capture_logs(true); mongoc_client_destroy(client); mongoc_client_pool_destroy(pool); capture_logs(false); } /* Test no memory leaks when changing ssl_opts from re-creating OpenSSL context. */ #if defined(MONGOC_ENABLE_SSL_OPENSSL) static void test_mongoc_client_change_openssl_ctx_before_ops(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client; const mongoc_ssl_opt_t *ssl_opts; bson_error_t error; bool ret; client = test_framework_new_default_client(); /* change ssl opts before a connection is made */ ssl_opts = test_framework_get_ssl_opts(); mongoc_client_set_ssl_opts(client, ssl_opts); /* any operation - ping the server */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_destroy(client); } static void test_mongoc_client_change_openssl_ctx_between_ops(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client; const mongoc_ssl_opt_t *ssl_opts; bson_error_t error; bool ret; client = test_framework_new_default_client(); /* any operation - ping the server */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); /* change ssl opts before a second connection */ ssl_opts = test_framework_get_ssl_opts(); mongoc_client_set_ssl_opts(client, ssl_opts); /* any operation - ping the server */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); mongoc_client_destroy(client); } #endif /* MONGOC_ENABLE_SSL_OPENSSL */ #else /* MONGOC_ENABLE_SSL is not defined */ static void test_mongoc_client_ssl_disabled(void) { capture_logs(true); ASSERT(NULL == test_framework_client_new("mongodb://host/?ssl=true", NULL)); ASSERT_CAPTURED_LOG("mongoc_client_new", MONGOC_LOG_LEVEL_ERROR, "SSL not enabled in this build."); capture_logs(false); } #endif static void _test_mongoc_client_get_description(bool pooled) { mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; uint32_t server_id; mongoc_server_description_t *sd; mongoc_host_list_t host; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } /* bad server_id handled correctly */ ASSERT(NULL == mongoc_client_get_server_description(client, 1234)); collection = get_test_collection(client, "test_mongoc_client_description"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); ASSERT(!mongoc_cursor_next(cursor, &doc)); server_id = mongoc_cursor_get_server_id(cursor); ASSERT(0 != server_id); sd = mongoc_client_get_server_description(client, server_id); ASSERT(sd); mongoc_cursor_get_host(cursor, &host); ASSERT(_mongoc_host_list_compare_one(&host, mongoc_server_description_host(sd))); mongoc_server_description_destroy(sd); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_mongoc_client_get_description_single(void) { _test_mongoc_client_get_description(false); } static void test_mongoc_client_get_description_pooled(void) { _test_mongoc_client_get_description(true); } static void test_mongoc_client_descriptions_single(void) { mongoc_client_t *client; mongoc_server_description_t **sds; size_t n, expected_n; bson_error_t error; bool r; bson_t *ping = tmp_bson("{'ping': 1}"); expected_n = test_framework_server_count(); n = 0; /* * single-threaded */ client = test_framework_new_default_client(); /* before connecting */ sds = mongoc_client_get_server_descriptions(client, &n); ASSERT_CMPSIZE_T(n, ==, (size_t)0); bson_free(sds); /* connect */ r = mongoc_client_command_simple(client, "db", ping, NULL, NULL, &error); ASSERT_OR_PRINT(r, error); sds = mongoc_client_get_server_descriptions(client, &n); ASSERT_CMPSIZE_T(n, ==, expected_n); mongoc_server_descriptions_destroy_all(sds, n); mongoc_client_destroy(client); } static void test_mongoc_client_descriptions_pooled(void *unused) { BSON_UNUSED(unused); const size_t expected_n = test_framework_server_count(); size_t n = 0; /* * pooled */ mongoc_client_pool_t *const pool = test_framework_new_default_client_pool(); mongoc_client_t *const client = mongoc_client_pool_pop(pool); /* wait for background thread to discover all members */ const mlib_timer deadline = mlib_expires_after(3, s); do { mlib_sleep_for(1, ms); /* Windows IPv4 tasks may take longer to connect since connection to the * first address returned by getaddrinfo may be IPv6, and failure to * connect may take a couple seconds. See CDRIVER-3639. */ if (mlib_timer_is_expired(deadline)) { test_error("still have %d descriptions, not expected %d, after 1 sec", (int)n, (int)expected_n); } mongoc_server_description_t **const sds = mongoc_client_get_server_descriptions(client, &n); mongoc_server_descriptions_destroy_all(sds, n); } while (n != expected_n); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static bool is_standalone_or_rs_primary_or_mongos(const char *server_type) { BSON_ASSERT_PARAM(server_type); // Avoid -Woverlength-strings in ASSERT macros. return strcmp(server_type, "Standalone") == 0 || strcmp(server_type, "RSPrimary") == 0 || strcmp(server_type, "Mongos") == 0; } static bool is_standalone_or_rs_secondary_or_mongos(const char *server_type) { BSON_ASSERT_PARAM(server_type); // Avoid -Woverlength-strings in ASSERT macros. return strcmp(server_type, "Standalone") == 0 || strcmp(server_type, "RSSecondary") == 0 || strcmp(server_type, "Mongos") == 0; } static bool is_standalone_or_mongos(const char *server_type) { BSON_ASSERT_PARAM(server_type); // Avoid -Woverlength-strings in ASSERT macros. return strcmp(server_type, "Standalone") == 0 || strcmp(server_type, "Mongos") == 0; } static void _test_mongoc_client_select_server(bool pooled) { mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_server_description_t *sd; const char *server_type; bson_error_t error; mongoc_read_prefs_t *prefs; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } sd = mongoc_client_select_server(client, true, /* for writes */ NULL, &error); ASSERT(sd); server_type = mongoc_server_description_type(sd); ASSERT(is_standalone_or_rs_primary_or_mongos(server_type)); /* Do not inherit read prefs from the client. */ prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, prefs); mongoc_server_description_destroy(sd); sd = mongoc_client_select_server(client, true, /* for writes */ NULL, &error); ASSERT(sd); server_type = mongoc_server_description_type(sd); ASSERT(is_standalone_or_rs_primary_or_mongos(server_type)); mongoc_server_description_destroy(sd); sd = mongoc_client_select_server(client, false, /* for reads */ NULL, &error); ASSERT(sd); server_type = mongoc_server_description_type(sd); ASSERT(is_standalone_or_rs_primary_or_mongos(server_type)); mongoc_server_description_destroy(sd); sd = mongoc_client_select_server(client, false, /* for reads */ prefs, &error); ASSERT(sd); server_type = mongoc_server_description_type(sd); ASSERT(is_standalone_or_rs_secondary_or_mongos(server_type)); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(prefs); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_mongoc_client_select_server_single(void) { _test_mongoc_client_select_server(false); } static void test_mongoc_client_select_server_pooled(void) { _test_mongoc_client_select_server(true); } static void _test_mongoc_client_select_server_error(bool pooled) { mongoc_uri_t *uri = NULL; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_server_description_t *sd; bson_error_t error; mongoc_read_prefs_t *prefs; mongoc_topology_description_type_t tdtype; const char *server_type; if (pooled) { uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 3000); pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); test_framework_set_ssl_opts(client); } prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_read_prefs_set_tags(prefs, tmp_bson("[{'does-not-exist': 'x'}]")); sd = mongoc_client_select_server(client, true, /* for writes */ prefs, &error); ASSERT(!sd); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "Cannot use read preference"); sd = mongoc_client_select_server(client, false, /* for reads */ prefs, &error); /* Server Selection Spec: "With topology type Single, the single server is * always suitable for reads if it is available." */ tdtype = _mongoc_topology_get_type(client->topology); if (tdtype == MONGOC_TOPOLOGY_SINGLE || tdtype == MONGOC_TOPOLOGY_SHARDED) { ASSERT(sd); server_type = mongoc_server_description_type(sd); ASSERT(is_standalone_or_mongos(server_type)); mongoc_server_description_destroy(sd); } else { ASSERT(!sd); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_SERVER_SELECTION); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_SERVER_SELECTION_FAILURE); } mongoc_read_prefs_destroy(prefs); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } else { mongoc_client_destroy(client); } } static void test_mongoc_client_select_server_error_single(void) { _test_mongoc_client_select_server_error(false); } static void test_mongoc_client_select_server_error_pooled(void) { _test_mongoc_client_select_server_error(true); } /* CDRIVER-2172: in single mode, if the selected server has a socket that's been * idle for socketCheckIntervalMS, check it with ping. If it fails, retry once. */ static void _test_mongoc_client_select_server_retry(bool retry_succeeds) { char *hello; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; bson_error_t error; request_t *request; future_t *future; mongoc_server_description_t *sd; server = mock_server_new(); mock_server_run(server); hello = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'secondary': false," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'setName': 'rs'," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); mongoc_uri_set_option_as_int32(uri, "socketCheckIntervalMS", 50); client = test_framework_client_new_from_uri(uri, NULL); /* first selection succeeds */ future = future_client_select_server(client, true, NULL, &error); request = mock_server_receives_any_hello(server); reply_to_request_simple(request, hello); request_destroy(request); sd = future_get_mongoc_server_description_ptr(future); ASSERT_OR_PRINT(sd, error); future_destroy(future); mongoc_server_description_destroy(sd); /* let socketCheckIntervalMS pass */ mlib_sleep_for(100, ms); /* second selection requires ping, which fails */ future = future_client_select_server(client, true, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_hang_up(request); request_destroy(request); /* mongoc_client_select_server retries once */ request = mock_server_receives_any_hello(server); if (retry_succeeds) { reply_to_request_simple(request, hello); sd = future_get_mongoc_server_description_ptr(future); ASSERT_OR_PRINT(sd, error); mongoc_server_description_destroy(sd); } else { reply_to_request_with_hang_up(request); sd = future_get_mongoc_server_description_ptr(future); BSON_ASSERT(sd == NULL); } future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mongoc_uri_destroy(uri); bson_free(hello); mock_server_destroy(server); } static void test_mongoc_client_select_server_retry_succeed(void) { _test_mongoc_client_select_server_retry(true); } static void test_mongoc_client_select_server_retry_fail(void) { _test_mongoc_client_select_server_retry(false); } /* CDRIVER-2172: in single mode, if the selected server has a socket that's been * idle for socketCheckIntervalMS, check it with ping. If it fails, retry once. */ static void _test_mongoc_client_fetch_stream_retry(bool retry_succeeds) { char *hello; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; bson_error_t error; request_t *request; future_t *future; server = mock_server_new(); mock_server_run(server); hello = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "socketCheckIntervalMS", 50); client = test_framework_client_new_from_uri(uri, NULL); /* first time succeeds */ future = future_client_command_simple(client, "db", tmp_bson("{'cmd': 1}"), NULL, NULL, &error); request = mock_server_receives_any_hello(server); reply_to_request_simple(request, hello); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'cmd': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* let socketCheckIntervalMS pass */ mlib_sleep_for(100, ms); /* second selection requires ping, which fails */ future = future_client_command_simple(client, "db", tmp_bson("{'cmd': 1}"), NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_hang_up(request); request_destroy(request); /* mongoc_client_select_server retries once */ request = mock_server_receives_any_hello(server); if (retry_succeeds) { reply_to_request_simple(request, hello); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'cmd': 1}")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); } else { reply_to_request_with_hang_up(request); BSON_ASSERT(!future_get_bool(future)); } future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mongoc_uri_destroy(uri); bson_free(hello); mock_server_destroy(server); } static void test_mongoc_client_fetch_stream_retry_succeed(void) { _test_mongoc_client_fetch_stream_retry(true); } static void test_mongoc_client_fetch_stream_retry_fail(void) { _test_mongoc_client_fetch_stream_retry(false); } #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static bool _cmd(mock_server_t *server, mongoc_client_t *client, bool server_replies, bson_error_t *error) { future_t *future; request_t *request; bool r; ASSERT(client); future = future_client_command_simple(client, "db", tmp_bson("{'cmd': 1}"), NULL, NULL, error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'cmd': 1}")); ASSERT(request); if (server_replies) { reply_to_request_simple(request, "{'ok': 1}"); } r = future_get_bool(future); future_destroy(future); request_destroy(request); return r; } static void test_client_set_ssl_copies_args(bool pooled) { mock_server_t *server; mongoc_ssl_opt_t client_opts = {0}; mongoc_ssl_opt_t server_opts = {0}; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; char *mutable_client_ca = NULL; const size_t ca_bufsize = strlen(CERT_CA) + 1; mutable_client_ca = bson_malloc(ca_bufsize); bson_strncpy(mutable_client_ca, CERT_CA, ca_bufsize); client_opts.ca_file = mutable_client_ca; server_opts.weak_cert_validation = true; server_opts.ca_file = CERT_CA; server_opts.pem_file = CERT_SERVER; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_set_ssl_opts(server, &server_opts); mock_server_run(server); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_pool_set_ssl_opts(pool, &client_opts); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_ssl_opts(client, &client_opts); } /* Now change the client ca string to be something else */ bson_strncpy(mutable_client_ca, "garbage", ca_bufsize); ASSERT_OR_PRINT(_cmd(server, client, true /* server replies */, &error), error); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_free(mutable_client_ca); mock_server_destroy(server); } static void test_ssl_client_single_copies_args(void) { test_client_set_ssl_copies_args(false); } static void test_ssl_client_pooled_copies_args(void) { test_client_set_ssl_copies_args(true); } static void _test_ssl_reconnect(bool pooled) { mongoc_uri_t *uri; mock_server_t *server; mongoc_ssl_opt_t client_opts = {0}; mongoc_ssl_opt_t server_opts = {0}; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; future_t *future; client_opts.ca_file = CERT_CA; server_opts.weak_cert_validation = true; server_opts.ca_file = CERT_CA; server_opts.pem_file = CERT_SERVER; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_set_ssl_opts(server, &server_opts); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "socketTimeoutMS", 1000); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_client_pool_set_ssl_opts(pool, &client_opts); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_ssl_opts(client, &client_opts); } ASSERT_OR_PRINT(_cmd(server, client, true /* server replies */, &error), error); /* man-in-the-middle: certificate changed, for example expired */ server_opts.pem_file = CERT_EXPIRED; mock_server_set_ssl_opts(server, &server_opts); /* network timeout */ capture_logs(true); ASSERT(!_cmd(server, client, false /* server hangs up */, &error)); if (pooled) { ASSERT_CAPTURED_LOG("failed to write data because server closed the connection", MONGOC_LOG_LEVEL_WARNING, "Failed to buffer 4 bytes"); } capture_logs(false); /* next operation comes on a new connection, server verification fails */ capture_logs(true); future = future_client_command_simple(client, "db", tmp_bson("{'cmd': 1}"), NULL, NULL, &error); ASSERT(!future_get_bool(future)); ASSERT_CONTAINS(error.message, "TLS handshake failed"); if (pooled) { ASSERT_CAPTURED_LOG("cluster", MONGOC_LOG_LEVEL_WARNING, "TLS handshake failed"); } capture_logs(false); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } future_destroy(future); mock_server_destroy(server); mongoc_uri_destroy(uri); } static void test_ssl_reconnect_single(void) { _test_ssl_reconnect(false); } static void test_ssl_reconnect_pooled(void) { _test_ssl_reconnect(true); } #endif /* OpenSSL or Secure Transport */ static void test_mongoc_client_application_handshake(void) { enum { BUFFER_SIZE = HANDSHAKE_MAX_SIZE }; char big_string[BUFFER_SIZE]; const char *short_string = "hallo thar"; mongoc_client_t *client; client = test_framework_client_new("mongodb://example", NULL); memset(big_string, 'a', BUFFER_SIZE - 1); big_string[BUFFER_SIZE - 1] = '\0'; /* Check that setting too long a name causes failure */ capture_logs(true); ASSERT(!mongoc_client_set_appname(client, big_string)); ASSERT_CAPTURED_LOG("_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "is invalid"); clear_captured_logs(); /* Success case */ ASSERT(mongoc_client_set_appname(client, short_string)); /* Make sure we can't set it twice */ ASSERT(!mongoc_client_set_appname(client, "a")); ASSERT_CAPTURED_LOG( "_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot set appname more than once"); capture_logs(false); mongoc_client_destroy(client); } static void _assert_hello_valid(request_t *request, bool needs_meta) { const bson_t *request_doc; ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); ASSERT(bson_has_field(request_doc, HANDSHAKE_FIELD) == needs_meta); } /* For single threaded clients, to cause a hello to be sent, we must wait * until we're overdue for a heartbeat, and then execute some command */ static future_t * _force_hello_with_ping(mongoc_client_t *client, int heartbeat_ms) { future_t *future; BSON_ASSERT_PARAM(client); /* Wait until we're overdue to send a hello */ mlib_sleep_for((heartbeat_ms, ms), mul, 2); /* Send a ping */ future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); ASSERT(future); return future; } /* Call after we've dealt with the hello sent by * _force_hello_with_ping */ static void _respond_to_ping(future_t *future, mock_server_t *server) { request_t *request; ASSERT(future); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); } static void test_mongoc_handshake_pool(void) { mock_server_t *server; request_t *request1; request_t *request2; mongoc_uri_t *uri; mongoc_client_t *client1; mongoc_client_t *client2; mongoc_client_pool_t *pool; const char *const server_reply = tmp_str("{'ok': 1," " '" HANDSHAKE_RESPONSE_LEGACY_HELLO "': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); future_t *future; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); ASSERT(mongoc_uri_set_appname(uri, BSON_FUNC)); pool = mongoc_client_pool_new(uri); client1 = mongoc_client_pool_pop(pool); request1 = mock_server_receives_legacy_hello(server, NULL); _assert_hello_valid(request1, true); reply_to_request_simple(request1, server_reply); request_destroy(request1); client2 = mongoc_client_pool_pop(pool); future = future_client_command_simple(client2, "test", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); request2 = mock_server_receives_legacy_hello(server, NULL); _assert_hello_valid(request2, true); reply_to_request_simple(request2, server_reply); request_destroy(request2); request2 = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'}")); reply_to_request_with_ok_and_destroy(request2); ASSERT(future_get_bool(future)); future_destroy(future); mongoc_client_pool_push(pool, client1); mongoc_client_pool_push(pool, client2); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void _test_client_sends_handshake(bool pooled) { request_t *request = NULL; future_t *future = NULL; mongoc_client_t *client = NULL; mongoc_client_pool_t *pool = NULL; const char *const server_reply = tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); const int heartbeat_ms = 500; if (!TestSuite_CheckMockServerAllowed()) { return; } mock_server_t *const server = mock_server_new(); mock_server_run(server); mongoc_uri_t *const uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", heartbeat_ms); mongoc_uri_set_option_as_int32(uri, "connectTimeoutMS", 100); if (pooled) { pool = mongoc_client_pool_new(uri); /* Pop a client to trigger the topology scanner */ client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); future = _force_hello_with_ping(client, heartbeat_ms); } request = mock_server_receives_any_hello(server); /* Make sure the hello request has a "client" field: */ _assert_hello_valid(request, true); reply_to_request_simple(request, server_reply); request_destroy(request); if (!pooled) { _respond_to_ping(future, server); /* Wait until another hello is sent */ future = _force_hello_with_ping(client, heartbeat_ms); } request = mock_server_receives_any_hello(server); _assert_hello_valid(request, false); reply_to_request_simple(request, server_reply); request_destroy(request); if (!pooled) { _respond_to_ping(future, server); future = _force_hello_with_ping(client, heartbeat_ms); } /* Now wait for the client to send another hello command, but this * time the server hangs up */ request = mock_server_receives_any_hello(server); _assert_hello_valid(request, false); reply_to_request_with_hang_up(request); request_destroy(request); /* Client retries once (CDRIVER-2075) */ request = mock_server_receives_any_hello(server); _assert_hello_valid(request, true); reply_to_request_with_hang_up(request); request_destroy(request); if (!pooled) { /* The ping wasn't sent since we hung up with hello */ ASSERT(!future_get_bool(future)); future_destroy(future); /* We're in cooldown for the next few seconds, so we're not * allowed to send hellos. Wait for the cooldown to end. */ mlib_sleep_for( // (MONGOC_TOPOLOGY_COOLDOWN_MS, ms), plus, (1, s)); future = _force_hello_with_ping(client, heartbeat_ms); } /* Now the client should try to reconnect. They think the server's down * so now they SHOULD send hello */ request = mock_server_receives_any_hello(server); _assert_hello_valid(request, true); reply_to_request_simple(request, server_reply); request_destroy(request); if (!pooled) { _respond_to_ping(future, server); } /* cleanup */ if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_client_sends_handshake_single(void *ctx) { BSON_UNUSED(ctx); _test_client_sends_handshake(false); } static void test_client_sends_handshake_pooled(void) { _test_client_sends_handshake(true); } static void test_client_appname(bool pooled, bool use_uri) { future_t *future = NULL; mongoc_client_t *client = NULL; mongoc_client_pool_t *pool = NULL; const char *const server_reply = tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); const int heartbeat_ms = 500; mock_server_t *const server = mock_server_new(); mock_server_run(server); mongoc_uri_t *const uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", heartbeat_ms); mongoc_uri_set_option_as_int32(uri, "connectTimeoutMS", 120 * 1000); if (use_uri) { mongoc_uri_set_option_as_utf8(uri, "appname", "testapp"); } if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); if (!use_uri) { ASSERT(mongoc_client_pool_set_appname(pool, "testapp")); } client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); if (!use_uri) { ASSERT(mongoc_client_set_appname(client, "testapp")); } future = _force_hello_with_ping(client, heartbeat_ms); } request_t *const request = mock_server_receives_any_hello_with_match(server, "{'client': {" " 'application': {" " 'name': 'testapp'}}}", "{'client': {" " 'application': {" " 'name': 'testapp'}}}"); reply_to_request_simple(request, server_reply); if (!pooled) { _respond_to_ping(future, server); } request_destroy(request); /* cleanup */ if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_client_appname_single_uri(void) { test_client_appname(false, true); } static void test_client_appname_single_no_uri(void) { test_client_appname(false, false); } static void test_client_appname_pooled_uri(void) { test_client_appname(true, true); } static void test_client_appname_pooled_no_uri(void) { test_client_appname(true, false); } /* test a disconnect with a NULL bson_error_t * passed to command_simple() */ static void _test_null_error_pointer(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; future_t *future; request_t *request; if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 1000); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } /* connect */ future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); /* disconnect */ mock_server_destroy(server); if (pooled) { mongoc_cluster_disconnect_node(&client->cluster, 1); } else { mongoc_topology_scanner_node_t *scanner_node; scanner_node = mongoc_topology_scanner_get_node(client->topology->scanner, 1); mongoc_stream_destroy(scanner_node->stream); scanner_node->stream = NULL; } /* doesn't abort with assertion failure */ capture_logs(true); future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, NULL /* error */); ASSERT(!future_get_bool(future)); future_destroy(future); if (pooled) { ASSERT_CAPTURED_LOG("cluster", MONGOC_LOG_LEVEL_WARNING, "Failed to connect to target host"); } capture_logs(false); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } static void test_null_error_pointer_single(void *ctx) { BSON_UNUSED(ctx); _test_null_error_pointer(false); } static void test_null_error_pointer_pooled(void *ctx) { BSON_UNUSED(ctx); _test_null_error_pointer(true); } #ifdef MONGOC_ENABLE_SSL static void test_set_ssl_opts(void) { const mongoc_ssl_opt_t *opts = mongoc_ssl_opt_get_default(); ASSERT(opts->pem_file == NULL); ASSERT(opts->pem_pwd == NULL); ASSERT(opts->ca_file == NULL); ASSERT(opts->ca_dir == NULL); ASSERT(opts->crl_file == NULL); ASSERT(!opts->weak_cert_validation); ASSERT(!opts->allow_invalid_hostname); } #endif static void test_client_reset_sessions(void) { bson_error_t error; mock_server_t *server; mongoc_client_t *client; mongoc_client_session_t *session; mongoc_client_session_t *session_lookup; future_t *future; request_t *request; bson_t opts = BSON_INITIALIZER; uint32_t csid; bson_t lsid; bool res; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client->generation == 0); /* Ensure that resetting client removes existing sessions from its set */ session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); ASSERT(session->client_generation == client->generation); csid = session->client_session_id; mongoc_client_reset(client); ASSERT(client->generation == 1); ASSERT(!_mongoc_client_lookup_session(client, csid, &session_lookup, &error)); /* Ensure that resetting did not send endSessions. To do this, we wait for a ping, so if we receive endSessions instead we will fail. */ future = future_client_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1, 'lsid': {'$exists': true}}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); /* Ensure that a session left over from before the reset call cannot be used for any operations. */ bson_copy_to(mongoc_client_session_get_lsid(session), &lsid); res = (mongoc_client_session_append(session, &opts, &error)); ASSERT_OR_PRINT(res, error); future = future_client_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, &opts, NULL, &error); ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid sessionId"); /* Add an autoresponder for endSessions to unblock the test. */ mock_server_auto_endsessions(server); bson_destroy(&opts); bson_destroy(&lsid); future_destroy(future); mongoc_client_session_destroy(session); mongoc_client_session_destroy(session_lookup); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_client_reset_cursors(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; mongoc_database_t *database; mongoc_collection_t *coll; future_t *future; request_t *request; bson_error_t error; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* Ensure that cursors with an old client generation don't send killCursors. This test should timeout and fail if the client does send killCursors. */ coll = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(coll, tmp_bson(NULL), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test'}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 4," " 'ns': 'test.test'," " 'firstBatch': [{}]}}"); BSON_ASSERT(future_get_bool(future)); ASSERT(cursor->cursor_id); mongoc_client_reset(client); /* Attempt to call next() on the cursor after a reset--should fail without sending any requests to the server. */ ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance cursor after client reset"); mongoc_cursor_destroy(cursor); request_destroy(request); future_destroy(future); /* Expect a ping here, and send one after destroying cursor. If a killCursors command intervened, this test will fail. */ database = mongoc_client_get_database(client, "admin"); future = future_database_command_simple(database, tmp_bson("{'ping': 1}"), NULL, NULL, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); mongoc_client_destroy(client); mongoc_collection_destroy(coll); mongoc_database_destroy(database); mock_server_destroy(server); } static bool mongoc_topology_scanner_is_connected(mongoc_topology_scanner_t *scanner) { mongoc_topology_scanner_node_t *node; BSON_ASSERT(scanner); node = scanner->nodes; if (!node) { return false; } while (node) { if (!node->stream) { return false; } node = node->next; } return true; } static void test_client_reset_connections(void) { mock_server_t *server; mongoc_client_t *client; mongoc_database_t *database; mongoc_uri_t *uri; future_t *future; request_t *request; int autoresponder_id; server = mock_server_new(); autoresponder_id = mock_server_auto_hello(server, "{ 'isWritablePrimary': true }"); mock_server_run(server); /* After calling reset, check that connections are left as-is. Set heartbeat frequency high, so a background scan won't interfere. */ uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 99999); client = test_framework_client_new_from_uri(uri, NULL); database = mongoc_client_get_database(client, "admin"); future = future_database_command_simple(database, tmp_bson("{'ping': 1}"), NULL, NULL, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); mock_server_remove_autoresponder(server, autoresponder_id); ASSERT(mongoc_topology_scanner_is_connected(client->topology->scanner)); mongoc_client_reset(client); ASSERT(mongoc_topology_scanner_is_connected(client->topology->scanner)); future_destroy(future); mongoc_uri_destroy(uri); mongoc_database_destroy(database); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_get_database(void) { mongoc_client_t *client; mongoc_database_t *database; mongoc_write_concern_t *wc; mongoc_read_concern_t *rc; mongoc_read_prefs_t *read_prefs; client = test_framework_client_new(NULL, NULL); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_client_set_write_concern(client, wc); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, "majority"); mongoc_client_set_read_concern(client, rc); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, read_prefs); database = mongoc_client_get_database(client, "test"); ASSERT_CMPINT32(database->write_concern->w, ==, 2); ASSERT_CMPSTR(database->read_concern->level, "majority"); ASSERT_CMPINT(database->read_prefs->mode, ==, MONGOC_READ_SECONDARY); mongoc_database_destroy(database); mongoc_read_prefs_destroy(read_prefs); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } static void test_invalid_server_id(void) { mongoc_client_t *client; bson_error_t error; bool ret; client = test_framework_client_new("mongodb://localhost", NULL); ret = mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, 123, NULL /* reply */, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Could not find server with id: 123"); mongoc_client_destroy(client); } #ifdef MONGOC_ENABLE_SSL static void test_ssl_opts_override(void) { /* Test that mongoc_client_set_ssl_opts does not override the internal TLS * options that can only be set through the URI. */ mongoc_uri_t *uri; mongoc_client_t *client; mongoc_ssl_opt_t ssl_opts = {0}; uri = mongoc_uri_new("mongodb://localhost:27017/?tls=true&tlsDisableOCSPEndpointCheck=true"); client = test_framework_client_new_from_uri(uri, NULL); ssl_opts.allow_invalid_hostname = true; mongoc_client_set_ssl_opts(client, &ssl_opts); BSON_ASSERT(client->ssl_opts.allow_invalid_hostname); BSON_ASSERT(((_mongoc_internal_tls_opts_t *)client->ssl_opts.internal)->tls_disable_ocsp_endpoint_check); mongoc_uri_destroy(uri); mongoc_client_destroy(client); } static void test_ssl_opts_padding_not_null(void) { mongoc_client_t *client; mongoc_ssl_opt_t ssl_opt = {0}; ssl_opt.allow_invalid_hostname = true; ssl_opt.internal = (void *)123; client = test_framework_client_new("mongodb://localhost:27017", NULL); mongoc_client_set_ssl_opts(client, &ssl_opt); BSON_ASSERT(client->ssl_opts.internal == NULL); mongoc_client_destroy(client); } #endif static void test_mongoc_client_recv_network_error(void) { mock_server_t *server; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; mongoc_server_description_t const *sd; int generation; mcd_rpc_message *rpc = NULL; mongoc_buffer_t buffer; mongoc_server_stream_t *stream; mc_shared_tpld td; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_request(server); reply_to_request_with_ok_and_destroy(request); future_wait(future); future_destroy(future); /* The server should be a standalone. */ sd = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 1, &error); ASSERT_OR_PRINT(sd, error); generation = mc_tpl_sd_get_generation(sd, &kZeroObjectId); BSON_ASSERT(sd->type == MONGOC_SERVER_STANDALONE); mock_server_destroy(server); /* A network error when calling _mongoc_client_recv should mark the server * unknown and increment the generation. */ _mongoc_buffer_init( &buffer, NULL /* initial buffer */, 0 /* initial length */, NULL /* realloc fn */, NULL /* realloc ctx */); rpc = mcd_rpc_message_new(); stream = mongoc_cluster_stream_for_server(&client->cluster, 1, false, NULL, NULL, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(!_mongoc_client_recv(client, rpc, &buffer, stream, &error)); td = mc_tpld_take_ref(client->topology); sd = mongoc_topology_description_server_by_id_const(td.ptr, 1, &error); ASSERT_OR_PRINT(sd, error); ASSERT_CMPINT(mc_tpl_sd_get_generation(sd, &kZeroObjectId), ==, generation + 1); BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); mongoc_client_destroy(client); _mongoc_buffer_destroy(&buffer); mcd_rpc_message_destroy(rpc); mongoc_server_stream_cleanup(stream); mc_tpld_drop_ref(&td); } void test_mongoc_client_get_handshake_hello_response_single(void) { mongoc_client_t *client; mongoc_server_description_t *monitor_sd; mongoc_server_description_t *invalidated_sd; mongoc_server_description_t *handshake_sd; bson_error_t error = {0}; client = test_framework_new_default_client(); /* Perform server selection to establish a connection. */ monitor_sd = mongoc_client_select_server(client, false /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(monitor_sd))); /* Invalidate the server. */ _mongoc_topology_invalidate_server(client->topology, monitor_sd->id); /* Get the new invalidated server description from monitoring. */ invalidated_sd = mongoc_client_get_server_description(client, monitor_sd->id); BSON_ASSERT(NULL != invalidated_sd); ASSERT_CMPSTR("Unknown", mongoc_server_description_type(invalidated_sd)); /* The previously established connection should have a valid server * description. */ handshake_sd = mongoc_client_get_handshake_description(client, monitor_sd->id, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(handshake_sd))); mongoc_server_description_destroy(handshake_sd); mongoc_server_description_destroy(invalidated_sd); mongoc_server_description_destroy(monitor_sd); mongoc_client_destroy(client); } void test_mongoc_client_get_handshake_hello_response_pooled(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_server_description_t *monitor_sd; mongoc_server_description_t *invalidated_sd; mongoc_server_description_t *handshake_sd; bson_error_t error = {0}; bool ret; pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); monitor_sd = mongoc_client_select_server(client, false /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(monitor_sd))); /* Send a ping to establish a connection. */ ret = mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL, monitor_sd->id, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Invalidate the server. */ _mongoc_topology_invalidate_server(client->topology, monitor_sd->id); /* Get the new invalidated server description from monitoring. */ invalidated_sd = mongoc_client_get_server_description(client, monitor_sd->id); BSON_ASSERT(NULL != invalidated_sd); // Check the resulting server description. // Invalidating sets the type to Unknown. // A background monitor may have set the type to PossiblePrimary. const char *got_description_type = mongoc_server_description_type(invalidated_sd); if (0 != strcmp("Unknown", got_description_type) && 0 != strcmp("PossiblePrimary", got_description_type)) { test_error("Expected server to have type 'Unknown' or " "'PossiblePrimary', got: '%s'", got_description_type); } /* The previously established connection should have a valid server * description. */ handshake_sd = mongoc_client_get_handshake_description(client, monitor_sd->id, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(handshake_sd))); mongoc_server_description_destroy(handshake_sd); mongoc_server_description_destroy(invalidated_sd); mongoc_server_description_destroy(monitor_sd); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } /* Test that calling mongoc_client_get_handshake_description establishes a * connection if a connection has not already been established. */ void test_mongoc_client_get_handshake_establishes_connection_single(void) { mongoc_client_t *client; mongoc_server_description_t *handshake_sd; bson_error_t error = {0}; uint32_t server_id = 1; client = test_framework_new_default_client(); handshake_sd = mongoc_client_get_handshake_description(client, server_id, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(handshake_sd))); mongoc_server_description_destroy(handshake_sd); mongoc_client_destroy(client); } void test_mongoc_client_get_handshake_establishes_connection_pooled(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_server_description_t *handshake_sd; bson_error_t error = {0}; uint32_t server_id = 1; pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); /* The previously established connection should have a valid server * description. */ handshake_sd = mongoc_client_get_handshake_description(client, server_id, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); BSON_ASSERT(0 != strcmp("Unknown", mongoc_server_description_type(handshake_sd))); mongoc_server_description_destroy(handshake_sd); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } /* Regression test for CDRIVER-4207. */ void test_mongoc_client_resends_handshake_on_network_error(void) { mongoc_client_t *client; mock_server_t *server; future_t *future; request_t *request; bson_error_t error; bson_t *ping = tmp_bson("{'ping': 1}"); server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_appname(client, "foo"); /* Send a "ping" command. */ future = future_client_command_simple(client, "db", ping, NULL /* read_prefs */, NULL /* reply */, &error); /* The first command on the new connection is handshake. It uses the legacy * hello and includes the client.application.name. */ request = mock_server_receives_any_hello_with_match( server, "{'" HANDSHAKE_CMD_HELLO "': 1, 'client': {'application': {'name': 'foo'}}}", "{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1, 'client': {'application': {'name': 'foo'}}}"); reply_to_request_simple( request, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_5_1)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_hang_up(request); future_wait(future); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); request_destroy(request); /* Send another "ping" command. */ future = future_client_command_simple(client, "db", ping, NULL /* read_prefs */, NULL /* reply */, &error); /* Expect the new connection to send the full handshake. */ request = mock_server_receives_any_hello_with_match( server, "{'" HANDSHAKE_CMD_HELLO "': 1, 'client': {'application': {'name': 'foo'}}}", "{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1, 'client': {'application': {'name': 'foo'}}}"); reply_to_request_simple( request, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d }", WIRE_VERSION_MIN, WIRE_VERSION_5_1)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); mongoc_client_destroy(client); mock_server_destroy(server); } // test_failure_to_auth is a regression test for the leak reported in // CDRIVER-4699. static void test_failure_to_auth(void) { mongoc_uri_t *uri = mongoc_uri_new_for_host_port("localhost", 12345); mongoc_uri_set_username(uri, "foo"); mongoc_uri_set_password(uri, "bar"); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false); // Set a shorter serverSelectionTimeoutMS for a faster test. // serverSelectionTimeoutMS must be long enough to require a second attempt // of authentication. Experimentally: 100ms appears long enough to reproduce // leak reported in CDRIVER-4699. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 100); mongoc_client_t *client = mongoc_client_new_from_uri(uri); // Override minHeartbeatFrequencyMS to reduce the time between server checks. client->topology->min_heartbeat_frequency_msec = 1; // Disable the cooldown period to reduce the time between server checks. // Single threaded clients wait for a default 5 second cooldown period after // failing to connect to a server before making another attempt. _mongoc_topology_bypass_cooldown(client->topology); bool ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, NULL /* error */); ASSERT_WITH_MSG(!ok, "expected command to fail, got success"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } // test_failure_to_auth_logs tests that auth failure logs at an error level. // Regression test for CDRIVER-5828. static void test_failure_to_auth_logs(void *unused) { BSON_UNUSED(unused); mongoc_uri_t *uri = test_framework_get_uri(); mongoc_uri_set_username(uri, "foo"); mongoc_uri_set_password(uri, "bar"); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); capture_logs(true); bool ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, NULL /* error */); ASSERT(!ok); ASSERT_CAPTURED_LOG("auth failure", MONGOC_LOG_LEVEL_ERROR, "Authentication failed"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void test_killCursors(void) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); bson_error_t error; mongoc_collection_drop(coll, NULL); // Ignore error. // Insert two documents. { ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &error), error); } uint32_t server_id; int64_t cursor_id; // Create cursor. { // Use batchSize:1 so cursor is not exhausted (has non-zero cursor ID) after iterating first result. mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL); // Iterate cursor once to send initial `find` command and create server-side cursor. const bson_t *got; ASSERT(mongoc_cursor_next(cursor, &got)); server_id = mongoc_cursor_get_server_id(cursor); cursor_id = mongoc_cursor_get_id(cursor); ASSERT_CMPINT64(cursor_id, >, 0); mongoc_cursor_destroy(cursor); } // Code snippet for NEWS ... begin bson_t *cmd = BCON_NEW("killCursors", "coll", "cursors", "[", BCON_INT64(cursor_id), "]"); bool ok = mongoc_client_command_simple_with_server_id(client, "db", cmd, NULL, server_id, NULL, &error); if (!ok) { printf("Failed to send 'killCursors': %s\n", error.message); } bson_destroy(cmd); // Code snippet for NEWS ... end ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_client_install(TestSuite *suite) { TestSuite_AddLive(suite, "/Client/ipv6/single [ipv6]", test_mongoc_client_ipv6_single); TestSuite_AddLive(suite, "/Client/ipv6/pooled [ipv6]", test_mongoc_client_ipv6_pooled); TestSuite_AddFull(suite, "/Client/authenticate [lock:live-server]", test_mongoc_client_authenticate, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddFull(suite, "/Client/speculative_auth_failure/single [lock:live-server]", test_mongoc_client_single_speculative_auth_failure, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/Client/speculative_auth_failure/pooled [lock:live-server]", test_mongoc_client_pooled_speculative_auth_failure, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/Client/authenticate_cached/pool [lock:live-server]", test_mongoc_client_authenticate_cached_pooled, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddFull(suite, "/Client/authenticate_cached/client [lock:live-server]", test_mongoc_client_authenticate_cached_single, NULL, NULL, test_framework_skip_if_no_auth, // speculativeAuthentication in single-threaded clients // does not use the scram cache. speculativeAuthentication // was introduced in server 4.4 (maxWireVersion=9) test_framework_skip_if_max_wire_version_more_than_8); TestSuite_AddFull(suite, "/Client/authenticate_failure [lock:live-server]", test_mongoc_client_authenticate_failure, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddFull(suite, "/Client/authenticate_timeout [lock:live-server]", test_mongoc_client_authenticate_timeout, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddMockServerTest(suite, "/Client/command_w_server_id", test_client_cmd_w_server_id); TestSuite_AddMockServerTest(suite, "/Client/command_w_server_id/sharded", test_client_cmd_w_server_id_sharded); TestSuite_AddFull(suite, "/Client/command_w_server_id/option [lock:live-server]", test_server_id_option, NULL, NULL, test_framework_skip_if_auth); TestSuite_AddFull(suite, "/Client/command_w_write_concern [lock:live-server]", test_client_cmd_w_write_concern, NULL, NULL, TestSuite_CheckLive); TestSuite_AddMockServerTest(suite, "/Client/command/write_concern", test_client_cmd_write_concern); TestSuite_AddMockServerTest(suite, "/Client/command/write_concern_fam", test_client_cmd_write_concern_fam); TestSuite_AddMockServerTest( suite, "/Client/command/read_prefs/simple/single", test_command_simple_read_prefs_single); TestSuite_AddMockServerTest( suite, "/Client/command/read_prefs/simple/pooled", test_command_simple_read_prefs_pooled); TestSuite_AddLive(suite, "/Client/command_not_found/simple", test_command_not_found_simple); TestSuite_AddMockServerTest(suite, "/Client/command_with_opts/read_prefs", test_command_with_opts_read_prefs); TestSuite_AddMockServerTest(suite, "/Client/command_with_opts/read_write", test_read_write_cmd_with_opts); TestSuite_AddMockServerTest(suite, "/Client/command_with_opts", test_command_with_opts); TestSuite_AddMockServerTest(suite, "/Client/command_with_opts/op_msg", test_command_with_opts_op_msg); TestSuite_AddMockServerTest(suite, "/Client/command_with_opts/read", test_read_command_with_opts); TestSuite_AddLive(suite, "/Client/command/empty", test_command_empty); TestSuite_AddMockServerTest(suite, "/Client/command/no_errmsg", test_command_no_errmsg); TestSuite_AddMockServerTest(suite, "/Client/unavailable_seeds", test_unavailable_seeds); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_no_connect/single", test_rs_seeds_no_connect_single); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_no_connect/pooled", test_rs_seeds_no_connect_pooled); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_connect/single", test_rs_seeds_connect_single); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_connect/pooled", test_rs_seeds_connect_pooled); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_reconnect/single", test_rs_seeds_reconnect_single); TestSuite_AddMockServerTest(suite, "/Client/rs_seeds_reconnect/pooled", test_rs_seeds_reconnect_pooled); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_no_connect/single", test_mongos_seeds_no_connect_single); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_no_connect/pooled", test_mongos_seeds_no_connect_pooled); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_connect/single", test_mongos_seeds_connect_single); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_connect/pooled", test_mongos_seeds_connect_pooled); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_reconnect/single", test_mongos_seeds_reconnect_single); TestSuite_AddMockServerTest(suite, "/Client/mongos_seeds_reconnect/pooled", test_mongos_seeds_reconnect_pooled); TestSuite_AddFull(suite, "/Client/recovering", test_recovering, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Client/database_names", test_get_database_names); TestSuite_AddFull(suite, "/Client/connect/uds [lock:live-server]", test_mongoc_client_unix_domain_socket, NULL, NULL, test_framework_skip_if_no_uds); TestSuite_AddMockServerTest(suite, "/Client/mismatched_me", test_mongoc_client_mismatched_me); TestSuite_AddMockServerTest(suite, "/Client/handshake/pool", test_mongoc_handshake_pool); TestSuite_Add(suite, "/Client/application_handshake", test_mongoc_client_application_handshake); TestSuite_AddFull(suite, "/Client/sends_handshake_single [lock:live-server][timeout:30]", test_client_sends_handshake_single, NULL, NULL, test_framework_skip_if_slow); TestSuite_Add(suite, "/Client/sends_handshake_pooled", test_client_sends_handshake_pooled); TestSuite_AddMockServerTest(suite, "/Client/appname_single_uri", test_client_appname_single_uri); TestSuite_AddMockServerTest(suite, "/Client/appname_single_no_uri", test_client_appname_single_no_uri); TestSuite_AddMockServerTest(suite, "/Client/appname_pooled_uri", test_client_appname_pooled_uri); TestSuite_AddMockServerTest(suite, "/Client/appname_pooled_no_uri", test_client_appname_pooled_no_uri); TestSuite_AddMockServerTest(suite, "/Client/wire_version", test_wire_version); #ifdef MONGOC_ENABLE_SSL TestSuite_AddLive(suite, "/Client/ssl_opts/single", test_ssl_single); TestSuite_AddLive(suite, "/Client/ssl_opts/pooled", test_ssl_pooled); TestSuite_Add(suite, "/Client/set_ssl_opts", test_set_ssl_opts); TestSuite_Add(suite, "/Client/ssl_opts_override", test_ssl_opts_override); TestSuite_Add(suite, "/Client/ssl_opts_padding_not_null/single", test_ssl_opts_padding_not_null); TestSuite_AddLive(suite, "/Client/ssl_hang", test_client_buildinfo_hang); #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) TestSuite_AddMockServerTest(suite, "/Client/ssl_opts/copies_single", test_ssl_client_single_copies_args); TestSuite_AddMockServerTest(suite, "/Client/ssl_opts/copies_pooled", test_ssl_client_pooled_copies_args); TestSuite_AddMockServerTest(suite, "/Client/ssl/reconnect/single", test_ssl_reconnect_single); TestSuite_AddMockServerTest(suite, "/Client/ssl/reconnect/pooled", test_ssl_reconnect_pooled); #endif #else /* No SSL support at all */ TestSuite_Add(suite, "/Client/ssl_disabled", test_mongoc_client_ssl_disabled); #endif TestSuite_AddMockServerTest( suite, "/Client/client_reset/sessions", test_client_reset_sessions, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest(suite, "/Client/client_reset/cursors", test_client_reset_cursors); TestSuite_AddMockServerTest(suite, "/Client/client_reset/connections", test_client_reset_connections); TestSuite_AddLive(suite, "/Client/get_description/single", test_mongoc_client_get_description_single); TestSuite_AddLive(suite, "/Client/get_description/pooled", test_mongoc_client_get_description_pooled); TestSuite_AddLive(suite, "/Client/descriptions/single", test_mongoc_client_descriptions_single); TestSuite_AddFull(suite, "/Client/descriptions/pooled [lock:live-server]", test_mongoc_client_descriptions_pooled, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/Client/select_server/single", test_mongoc_client_select_server_single); TestSuite_AddLive(suite, "/Client/select_server/pooled", test_mongoc_client_select_server_pooled); TestSuite_AddLive(suite, "/Client/select_server/err/single", test_mongoc_client_select_server_error_single); TestSuite_AddLive(suite, "/Client/select_server/err/pooled", test_mongoc_client_select_server_error_pooled); TestSuite_AddMockServerTest( suite, "/Client/select_server/retry/succeed", test_mongoc_client_select_server_retry_succeed); TestSuite_AddMockServerTest(suite, "/Client/select_server/retry/fail", test_mongoc_client_select_server_retry_fail); TestSuite_AddMockServerTest( suite, "/Client/fetch_stream/retry/succeed", test_mongoc_client_fetch_stream_retry_succeed); TestSuite_AddMockServerTest(suite, "/Client/fetch_stream/retry/fail", test_mongoc_client_fetch_stream_retry_fail); TestSuite_AddFull(suite, "/Client/null_error_pointer/single [timeout:30]", test_null_error_pointer_single, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Client/null_error_pointer/pooled [timeout:30]", test_null_error_pointer_pooled, NULL, NULL, test_framework_skip_if_slow); TestSuite_Add(suite, "/Client/get_database", test_get_database); TestSuite_Add(suite, "/Client/invalid_server_id", test_invalid_server_id); TestSuite_AddMockServerTest(suite, "/Client/recv_network_error", test_mongoc_client_recv_network_error); TestSuite_AddLive(suite, "/Client/get_handshake_hello_response/single [timeout:30]", test_mongoc_client_get_handshake_hello_response_single); TestSuite_AddLive(suite, "/Client/get_handshake_hello_response/pooled [timeout:30]", test_mongoc_client_get_handshake_hello_response_pooled); TestSuite_AddLive(suite, "/Client/get_handshake_establishes_connection/single", test_mongoc_client_get_handshake_establishes_connection_single); TestSuite_AddLive(suite, "/Client/get_handshake_establishes_connection/pooled", test_mongoc_client_get_handshake_establishes_connection_pooled); TestSuite_AddMockServerTest( suite, "/Client/resends_handshake_on_network_error", test_mongoc_client_resends_handshake_on_network_error); TestSuite_Add(suite, "/Client/failure_to_auth", test_failure_to_auth); TestSuite_AddFull(suite, "/Client/failure_to_auth_logs [lock:live-server]", test_failure_to_auth_logs, NULL, NULL, test_framework_skip_if_no_auth); #if defined(MONGOC_ENABLE_SSL_OPENSSL) TestSuite_AddFull(suite, "/Client/openssl/change_ssl_opts_before_ops [lock:live-server]", test_mongoc_client_change_openssl_ctx_before_ops, NULL, NULL, test_framework_skip_if_no_server_ssl); TestSuite_AddFull(suite, "/Client/openssl/change_ssl_opts_after_ops [lock:live-server]", test_mongoc_client_change_openssl_ctx_between_ops, NULL, NULL, test_framework_skip_if_no_server_ssl); #endif TestSuite_AddLive(suite, "/Client/killCursors", test_killCursors); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-cluster.c000066400000000000000000001501361511661753600243510ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "cluster-test" static uint32_t server_id_for_reads(mongoc_cluster_t *cluster) { bson_error_t error; mongoc_server_stream_t *server_stream; uint32_t id; server_stream = mongoc_cluster_stream_for_reads(cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); id = server_stream->sd->id; mongoc_server_stream_cleanup(server_stream); return id; } static void test_get_max_bson_obj_size(void) { mongoc_server_description_t *sd; mongoc_cluster_node_t *node; mongoc_client_pool_t *pool; mongoc_client_t *client; int32_t max_bson_obj_size = 16; uint32_t id; mc_tpld_modification tdmod; /* single-threaded */ client = test_framework_new_default_client(); BSON_ASSERT(client); id = server_id_for_reads(&client->cluster); tdmod = mc_tpld_modify_begin(client->topology); sd = mongoc_set_get(mc_tpld_servers(tdmod.new_td), id); sd->max_bson_obj_size = max_bson_obj_size; mc_tpld_modify_commit(tdmod); BSON_ASSERT(max_bson_obj_size == mongoc_cluster_get_max_bson_obj_size(&client->cluster)); mongoc_client_destroy(client); /* multi-threaded */ pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); id = server_id_for_reads(&client->cluster); node = (mongoc_cluster_node_t *)mongoc_set_get(client->cluster.nodes, id); node->handshake_sd->max_bson_obj_size = max_bson_obj_size; BSON_ASSERT(max_bson_obj_size == mongoc_cluster_get_max_bson_obj_size(&client->cluster)); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static void test_get_max_msg_size(void) { mongoc_server_description_t *sd; mongoc_cluster_node_t *node; mongoc_client_pool_t *pool; mongoc_client_t *client; int32_t max_msg_size = 32; uint32_t id; mc_tpld_modification tdmod; /* single-threaded */ client = test_framework_new_default_client(); id = server_id_for_reads(&client->cluster); tdmod = mc_tpld_modify_begin(client->topology); sd = mongoc_set_get(mc_tpld_servers(tdmod.new_td), id); sd->max_msg_size = max_msg_size; mc_tpld_modify_commit(tdmod); BSON_ASSERT(max_msg_size == mongoc_cluster_get_max_msg_size(&client->cluster)); mongoc_client_destroy(client); /* multi-threaded */ pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); id = server_id_for_reads(&client->cluster); node = (mongoc_cluster_node_t *)mongoc_set_get(client->cluster.nodes, id); node->handshake_sd->max_msg_size = max_msg_size; BSON_ASSERT(max_msg_size == mongoc_cluster_get_max_msg_size(&client->cluster)); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } #define ASSERT_CURSOR_ERR() \ do { \ BSON_ASSERT(!future_get_bool(future)); \ BSON_ASSERT(mongoc_cursor_error(cursor, &error)); \ ASSERT_ERROR_CONTAINS( \ error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to read 4 bytes: socket error or timeout"); \ } while (0) #define START_QUERY(client_port_variable) \ do { \ cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); \ future = future_cursor_next(cursor, &doc); \ request = \ mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test', 'filter': {}}")); \ BSON_ASSERT(request); \ client_port_variable = request_get_client_port(request); \ } while (0) #define CLEANUP_QUERY() \ do { \ request_destroy(request); \ future_destroy(future); \ mongoc_cursor_destroy(cursor); \ } while (0) /* test that we reconnect a cluster node after disconnect */ static void _test_cluster_node_disconnect(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; const bson_t *doc; mongoc_cursor_t *cursor; future_t *future; request_t *request; uint16_t client_port_0, client_port_1; bson_error_t error; if (!TestSuite_CheckMockServerAllowed()) { return; } capture_logs(true); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } collection = mongoc_client_get_collection(client, "test", "test"); /* query 0 fails. set client_port_0 to the port used by the query. */ START_QUERY(client_port_0); reply_to_request_with_reset(request); ASSERT_CURSOR_ERR(); CLEANUP_QUERY(); /* query 1 opens a new socket. set client_port_1 to the new port. */ START_QUERY(client_port_1); ASSERT_CMPINT(client_port_1, !=, client_port_0); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'a': 1}]}}"); /* success! */ BSON_ASSERT(future_get_bool(future)); CLEANUP_QUERY(); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_cluster_node_disconnect_single(void *ctx) { BSON_UNUSED(ctx); _test_cluster_node_disconnect(false); } static void test_cluster_node_disconnect_pooled(void *ctx) { BSON_UNUSED(ctx); _test_cluster_node_disconnect(true); } static void _test_cluster_command_timeout(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; future_t *future; request_t *request; uint16_t client_port; mongoc_server_description_t const *sd; bson_t reply; capture_logs(true); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "socketTimeoutMS", 200); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } /* server doesn't respond in time */ future = future_client_command_simple(client, "db", tmp_bson("{'foo': 1}"), NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'foo': 1}")); client_port = request_get_client_port(request); ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to send \"foo\" command with database \"db\""); /* a network timeout does NOT invalidate the server description */ sd = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 1, NULL); BSON_ASSERT(sd->type != MONGOC_SERVER_UNKNOWN); /* late response */ reply_to_request_simple(request, "{'ok': 1, 'bar': 1}"); request_destroy(request); future_destroy(future); future = future_client_command_simple(client, "db", tmp_bson("{'baz': 1}"), NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'baz': 1}")); ASSERT(request); /* new socket */ ASSERT_CMPUINT16(client_port, !=, request_get_client_port(request)); reply_to_request_simple(request, "{'ok': 1, 'quux': 1}"); ASSERT(future_get_bool(future)); /* got the proper response */ ASSERT_HAS_FIELD(&reply, "quux"); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&reply); request_destroy(request); future_destroy(future); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_cluster_command_timeout_single(void) { _test_cluster_command_timeout(false); } static void test_cluster_command_timeout_pooled(void) { _test_cluster_command_timeout(true); } static void _test_write_disconnect(void) { mock_server_t *server; char *hello; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; future_t *future; request_t *request; mongoc_topology_scanner_node_t *scanner_node; mongoc_server_description_t const *sd; if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* * establish connection with an "hello" and "ping" */ future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); request = mock_server_receives_any_hello(server); hello = bson_strdup_printf("{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); reply_to_request_simple(request, hello); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'ping': 1}")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); /* * close the socket */ reply_to_request_with_hang_up(request); /* * next operation detects the hangup */ collection = mongoc_client_get_collection(client, "db", "collection"); future_destroy(future); future = future_collection_insert_one(collection, tmp_bson("{'_id': 1}"), NULL, NULL, &error); ASSERT(!future_get_bool(future)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_STREAM); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_STREAM_SOCKET); scanner_node = mongoc_topology_scanner_get_node(client->topology->scanner, 1 /* server_id */); ASSERT(scanner_node && !scanner_node->stream); /* a hangup DOES invalidate the server description */ sd = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 1, NULL); BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); mongoc_collection_destroy(collection); request_destroy(request); future_destroy(future); bson_free(hello); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_write_command_disconnect(void *ctx) { BSON_UNUSED(ctx); _test_write_disconnect(); } typedef struct { int calls; bson_t *cluster_time; bson_t *command; } cluster_time_test_t; static void test_cluster_time_cmd_started_cb(const mongoc_apm_command_started_t *event) { const bson_t *cmd; cluster_time_test_t *test; bson_iter_t iter; bson_t client_cluster_time; cmd = mongoc_apm_command_started_get_command(event); if (!strcmp(_mongoc_get_command_name(cmd), "killCursors")) { /* ignore killCursors */ return; } test = (cluster_time_test_t *)mongoc_apm_command_started_get_context(event); test->calls++; bson_destroy(test->command); test->command = bson_copy(cmd); /* Only a MongoDB 3.6+ server reports $clusterTime. If we've received a * $clusterTime, we send it to any server. In this case, we got a * $clusterTime during the initial handshake. */ if (test_framework_clustertime_supported()) { // The first command may not have a cluster time since cluster time is omitted from SDAM commands. if (test->calls > 1) { BSON_ASSERT(bson_iter_init_find(&iter, cmd, "$clusterTime")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); /* previous call to cmd_succeeded_cb saved server's clusterTime */ BSON_ASSERT(!bson_empty0(test->cluster_time)); bson_iter_bson(&iter, &client_cluster_time); if (!bson_equal(test->cluster_time, &client_cluster_time)) { test_error("Unequal clusterTimes.\nServer sent %s\nClient sent %s", bson_as_relaxed_extended_json(test->cluster_time, NULL), bson_as_relaxed_extended_json(&client_cluster_time, NULL)); } bson_destroy(&client_cluster_time); } } else { BSON_ASSERT(!bson_has_field(event->command, "$clusterTime")); } } static void test_cluster_time_cmd_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { const bson_t *reply; cluster_time_test_t *test; bson_iter_t iter; uint32_t len; const uint8_t *data; reply = mongoc_apm_command_succeeded_get_reply(event); test = (cluster_time_test_t *)mongoc_apm_command_succeeded_get_context(event); /* Only a MongoDB 3.6+ server reports $clusterTime. Save it in "test". */ if (test_framework_clustertime_supported()) { BSON_ASSERT(bson_iter_init_find(&iter, reply, "$clusterTime")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_document(&iter, &len, &data); bson_destroy(test->cluster_time); test->cluster_time = bson_new_from_data(data, len); } } typedef bool (*command_fn_t)(mongoc_client_t *, bson_error_t *); /* test $clusterTime handling according to the test instructions in the * Driver Sessions Spec */ static void _test_cluster_time(bool pooled, command_fn_t command) { mongoc_apm_callbacks_t *callbacks; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bool r; bson_error_t error; cluster_time_test_t cluster_time_test; cluster_time_test.calls = 0; cluster_time_test.command = NULL; cluster_time_test.cluster_time = NULL; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_cluster_time_cmd_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, test_cluster_time_cmd_succeeded_cb); if (pooled) { pool = test_framework_new_default_client_pool(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &cluster_time_test); client = mongoc_client_pool_pop(pool); /* CDRIVER-3596 - prevent client discovery of the pool interfering with * the test operations. */ mlib_sleep_for(5, s); } else { client = test_framework_new_default_client(); mongoc_client_set_apm_callbacks(client, callbacks, &cluster_time_test); } r = command(client, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(cluster_time_test.calls, ==, 1); /* repeat */ r = command(client, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(cluster_time_test.calls, ==, 2); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_apm_callbacks_destroy(callbacks); bson_destroy(cluster_time_test.command); bson_destroy(cluster_time_test.cluster_time); } static bool command_simple(mongoc_client_t *client, bson_error_t *error) { return mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, error); } static void test_cluster_time_command_simple_single(void) { _test_cluster_time(false, command_simple); } static void test_cluster_time_command_simple_pooled(void) { _test_cluster_time(true, command_simple); } /* test modern mongoc_client_read_command_with_opts with $clusterTime */ static bool client_command_with_opts(mongoc_client_t *client, bson_error_t *error) { /* any of the with_opts command functions should work */ return mongoc_client_read_command_with_opts(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, error); } static void test_cluster_time_command_with_opts_single(void) { _test_cluster_time(false, client_command_with_opts); } static void test_cluster_time_command_with_opts_pooled(void) { _test_cluster_time(true, client_command_with_opts); } /* test aggregate with $clusterTime */ static bool aggregate(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bool r; ASSERT(client); collection = mongoc_client_get_collection(client, "test", "collection"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL, NULL); mongoc_cursor_next(cursor, &doc); r = !mongoc_cursor_error(cursor, error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); return r; } static void test_cluster_time_aggregate_single(void) { _test_cluster_time(false, aggregate); } static void test_cluster_time_aggregate_pooled(void) { _test_cluster_time(true, aggregate); } /* test queries with $clusterTime */ static bool cursor_next(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bool r; ASSERT(client); collection = get_test_collection(client, "test_cluster_time_cursor"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{'ping': 1}"), NULL, NULL); mongoc_cursor_next(cursor, &doc); r = !mongoc_cursor_error(cursor, error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); return r; } static void test_cluster_time_cursor_single(void) { _test_cluster_time(false, cursor_next); } static void test_cluster_time_cursor_pooled(void) { _test_cluster_time(true, cursor_next); } /* test inserts with $clusterTime */ static bool insert(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *collection; bool r; ASSERT(client); collection = get_test_collection(client, "test_cluster_time_cursor"); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, error); mongoc_collection_destroy(collection); return r; } static void test_cluster_time_insert_single(void) { _test_cluster_time(false, insert); } static void test_cluster_time_insert_pooled(void) { _test_cluster_time(true, insert); } static void test_cluster_command_timeout_negative(void) { bson_error_t error; mongoc_uri_t *const uri = test_framework_get_uri(); // CDRIVER-4781: libmongoc historically supports negative values as // fallback to a "default" value for timeouts. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, -1); mongoc_client_t *const client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); // There should not be an error when validating sockettimeoutms. ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error), error); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void replies_with_cluster_time(request_t *request, int t, int i, const char *docs_json) { char *quotes_replaced; bson_t doc; bson_error_t error; bool r; BSON_ASSERT(request); if (docs_json) { quotes_replaced = single_quotes_to_double(docs_json); r = bson_init_from_json(&doc, quotes_replaced, -1, &error); bson_free(quotes_replaced); } else { r = bson_init_from_json(&doc, "{}", -1, &error); } if (!r) { MONGOC_WARNING("%s", error.message); return; } BSON_APPEND_DOCUMENT( &doc, "$clusterTime", tmp_bson("{'clusterTime': {'$timestamp': {'t': %d, 'i': %d}}, 'x': 'y'}", t, i)); reply_to_request_with_multiple_docs(request, MONGOC_REPLY_NONE, &doc, 1, 0 /* cursor id */); bson_destroy(&doc); request_destroy(request); } static request_t * receives_with_cluster_time(mock_server_t *server, uint32_t timestamp, uint32_t increment, bson_t *command) { request_t *request; const bson_t *doc; bson_iter_t cluster_time; uint32_t t; uint32_t i; request = mock_server_receives_msg(server, 0, command); BSON_ASSERT(request); doc = request_get_doc(request, 0); BSON_ASSERT(bson_iter_init_find(&cluster_time, doc, "$clusterTime")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&cluster_time)); BSON_ASSERT(bson_iter_recurse(&cluster_time, &cluster_time)); BSON_ASSERT(bson_iter_find(&cluster_time, "clusterTime")); BSON_ASSERT(BSON_ITER_HOLDS_TIMESTAMP(&cluster_time)); bson_iter_timestamp(&cluster_time, &t, &i); if (t != timestamp || i != increment) { test_error("Expected Timestamp(%" PRIu32 ", %" PRIu32 "), got Timestamp(%" PRIu32 ", %" PRIu32 ")", timestamp, increment, t, i); } return request; } static void assert_ok(future_t *future, const bson_error_t *error) { bool r = future_get_bool(future); ASSERT_OR_PRINT(r, (*error)); future_destroy(future); } static future_t * future_ping(mongoc_client_t *client, bson_error_t *error) { return future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, error); } static void _test_cluster_time_comparison(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; future_t *future; request_t *request; bson_t *ping = tmp_bson("{'ping': 1}"); server = mock_server_new(); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'msg': 'isdbgrid'," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } future = future_ping(client, &error); request = mock_server_receives_msg(server, 0, ping); /* timestamp is 2, increment is 2 */ replies_with_cluster_time(request, 2, 2, "{'ok': 1.0}"); assert_ok(future, &error); future = future_ping(client, &error); request = receives_with_cluster_time(server, 2, 2, ping); /* timestamp is 2, increment is only 1 */ replies_with_cluster_time(request, 2, 1, "{'ok': 1.0}"); assert_ok(future, &error); future = future_ping(client, &error); /* client doesn't update cluster time, since new value is less than old */ request = receives_with_cluster_time(server, 2, 2, ping); reply_to_request_with_ok_and_destroy(request); assert_ok(future, &error); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_cluster_time_comparison_single(void) { _test_cluster_time_comparison(false); } static void test_cluster_time_comparison_pooled(void) { _test_cluster_time_comparison(true); } typedef future_t *(*run_command_fn_t)(mongoc_client_t *); typedef void (*cleanup_fn_t)(future_t *); typedef struct { const char *errmsg; bool is_not_primary_err; } test_error_msg_t; test_error_msg_t errors[] = {{"not master", true}, {"not master or secondary", true}, {"node is recovering", true}, {"not master and secondaryOk=false", true}, {"replicatedToNum called but not master anymore", true}, {"??? node is recovering ???", true}, {"??? not master ???", true}, {"foo", false}, {0}}; /* a "not primary" or "node is recovering" error marks server Unknown. "not primary" and "node is recovering" need only be substrings of the error message. */ static void _test_not_primary(bool pooled, run_command_fn_t run_command, cleanup_fn_t cleanup_fn) { test_error_msg_t *test_error_msg; mock_server_t *server; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; const char *cmd = "{'cmd': 1}"; bson_error_t error; future_t *future; request_t *request; mongoc_topology_description_t const *td; const mongoc_server_description_t *sd; char *reply; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); } for (test_error_msg = errors; test_error_msg->errmsg; test_error_msg++) { /* * successful command results in known server type */ future = future_client_command_simple(client, "test", tmp_bson(cmd), NULL, NULL, &error); request = mock_server_receives_request(server); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); /* Topology may be invalidated by client_command_simple */ td = mc_tpld_unsafe_get_const(client->topology); sd = mongoc_set_get_const(mc_tpld_servers_const(td), 1); BSON_ASSERT(sd->type == MONGOC_SERVER_STANDALONE); /* * command error marks server Unknown if it's a "not primary" error */ future = run_command(client); request = mock_server_receives_request(server); reply = bson_strdup_printf("{'ok': 0, 'errmsg': '%s'}", test_error_msg->errmsg); reply_to_request_simple(request, reply); BSON_ASSERT(!future_get_bool(future)); /* Topology should be invalidated by run_command */ td = mc_tpld_unsafe_get_const(client->topology); sd = mongoc_set_get_const(mc_tpld_servers_const(td), 1); if (test_error_msg->is_not_primary_err) { BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); } else { BSON_ASSERT(sd->type == MONGOC_SERVER_STANDALONE); } bson_free(reply); request_destroy(request); cleanup_fn(future); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mock_server_destroy(server); } static future_t * future_command_simple(mongoc_client_t *client) { return future_client_command_simple(client, "test", tmp_bson("{'cmd': 1}"), NULL, NULL, NULL); } static void function_command_simple_cleanup(future_t *future) { future_destroy(future); } static void test_not_primary_single(void) { _test_not_primary(false, future_command_simple, function_command_simple_cleanup); } static void test_not_primary_pooled(void) { _test_not_primary(true, future_command_simple, function_command_simple_cleanup); } /* parts must remain valid after future_command_private exits */ mongoc_cmd_parts_t parts; static future_t * future_command_private(mongoc_client_t *client) { bson_error_t error; mongoc_server_stream_t *server_stream; ASSERT(client); const mongoc_ss_log_context_t ss_log_context = {.operation = "cmd"}; server_stream = mongoc_cluster_stream_for_writes(&client->cluster, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); mongoc_cmd_parts_init(&parts, client, "test", MONGOC_QUERY_NONE, tmp_bson("{'cmd': 1}")); /* mongoc_cluster_run_command_parts will call mongoc_cmd_parts_cleanup */ return future_cluster_run_command_parts(&client->cluster, server_stream, &parts, NULL, NULL); } static void future_command_private_cleanup(future_t *future) { mongoc_server_stream_t *server_stream = future_value_get_mongoc_server_stream_ptr(future_get_param(future, 1)); mongoc_server_stream_cleanup(server_stream); future_destroy(future); } static void test_not_primary_auth_single(void) { _test_not_primary(false, future_command_private, future_command_private_cleanup); } static void test_not_primary_auth_pooled(void) { _test_not_primary(true, future_command_private, future_command_private_cleanup); } static void _test_cluster_hello_fails(bool hangup) { mock_server_t *mock_server; mongoc_uri_t *uri; mongoc_server_description_t *sd; mongoc_client_pool_t *pool; mongoc_client_t *client; request_t *request; future_t *future; bson_error_t error; int autoresponder_id; mock_server = mock_server_new(); autoresponder_id = mock_server_auto_hello(mock_server, "{ 'isWritablePrimary': true }"); mock_server_run(mock_server); uri = mongoc_uri_copy(mock_server_get_uri(mock_server)); /* increase heartbeatFrequencyMS to prevent background server selection. */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 99999); pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_client_pool_set_error_api(pool, 2); mongoc_uri_destroy(uri); client = mongoc_client_pool_pop(pool); /* do server selection to add this server to the topology. this does not add * a cluster node for this server. */ sd = mongoc_client_select_server(client, false, NULL, NULL); BSON_ASSERT(sd); mongoc_server_description_destroy(sd); mock_server_remove_autoresponder(mock_server, autoresponder_id); /* now create a cluster node by running a command. */ future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &error); /* the client adds a cluster node, creating a stream to the server, and then * sends a hello request. */ request = mock_server_receives_any_hello(mock_server); /* CDRIVER-2576: the server replies with an error, so * _mongoc_stream_run_hello returns NULL, which * _mongoc_cluster_run_hello must check. */ if (hangup) { capture_logs(true); /* suppress "failed to buffer" warning */ reply_to_request_with_hang_up(request); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket err"); } else { reply_to_request_simple(request, "{'ok': 0, 'code': 123}"); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 123, "Unknown command error"); } request_destroy(request); future_destroy(future); mock_server_destroy(mock_server); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static void test_cluster_hello_fails(void) { _test_cluster_hello_fails(false); } static void test_cluster_hello_hangup(void) { _test_cluster_hello_fails(true); } static void test_cluster_command_error(void) { mock_server_t *server; mongoc_client_t *client; bson_error_t err; request_t *request; future_t *future; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL /* opts */, NULL /* read prefs */, &err); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'$db': 'db', 'ping': 1}")); reply_to_request_with_hang_up(request); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); request_destroy(request); /* _mongoc_buffer_append_from_stream, used by opmsg gives more detail. */ ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to send \"ping\" command with database " "\"db\": Failed to read 4 bytes: socket error or " "timeout"); mock_server_destroy(server); mongoc_client_destroy(client); } static void test_advanced_cluster_time_not_sent_to_standalone(void) { mock_server_t *server; mongoc_client_t *client; mongoc_client_session_t *cs; bson_t opts = BSON_INITIALIZER; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; bson_error_t error; server = mock_server_new(); mock_server_auto_endsessions(server); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'logicalSessionTimeoutMinutes': 30}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); cs = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs, error); mongoc_client_session_advance_cluster_time(cs, tmp_bson("{'clusterTime': {'$timestamp': {'t': 1, 'i': 1}}}")); ASSERT_OR_PRINT(mongoc_client_session_append(cs, &opts, &error), error); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, 0, tmp_bson("{" " 'find': 'collection', 'filter': {}," " '$clusterTime': {'$exists': false}" "}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'firstBatch': []}}")); BSON_ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_session_destroy(cs); mongoc_client_destroy(client); mock_server_destroy(server); } /* Responds properly to hello, hangs up on serverStatus, and replies {ok:1} * to everything else. */ static bool _responder(request_t *req, void *data) { char *hello; hello = (char *)data; if (0 == strcasecmp(req->command_name, HANDSHAKE_CMD_LEGACY_HELLO) || 0 == strcasecmp(req->command_name, "hello")) { reply_to_request_simple(req, hello); request_destroy(req); return true; } else if (0 == strcmp(req->command_name, "serverStatus")) { reply_to_request_with_hang_up(req); request_destroy(req); return true; } /* Otherwise, reply {ok:1} */ reply_to_request_with_ok_and_destroy(req); return true; } static mongoc_stream_t * _initiator_fn(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { mongoc_client_pool_t *pool; mongoc_client_t *client; bool ret; bson_t *cmd; bson_error_t ss_error; mongoc_stream_t *stream; cmd = BCON_NEW("serverStatus", BCON_INT32(1)); pool = (mongoc_client_pool_t *)user_data; client = mongoc_client_pool_pop(pool); /* Hide warnings that get logged from network errors. */ capture_logs(true); ret = mongoc_client_command_simple(client, "db", cmd, NULL, NULL, &ss_error); capture_logs(false); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(ss_error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); stream = mongoc_client_default_stream_initiator(uri, host, client, error); ASSERT_OR_PRINT(stream != NULL, (*error)); mongoc_client_pool_push(pool, client); bson_destroy(cmd); return stream; } void test_hello_on_unknown(void) { mock_server_t *mock_server; mongoc_client_pool_t *pool; mongoc_client_t *client; bson_error_t error; bool ret; mongoc_uri_t *uri; mock_server = mock_server_new(); mock_server_run(mock_server); mock_server_autoresponds(mock_server, _responder, (void *)tmp_str("{ 'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'msg': 'isdbgrid'}", WIRE_VERSION_MIN, WIRE_VERSION_MAX), NULL); uri = mongoc_uri_copy(mock_server_get_uri(mock_server)); /* Add a placeholder additional host, so the topology type can be SHARDED. * The host will get removed on the first failed hello. */ ret = mongoc_uri_upsert_host(uri, "localhost", 12345, &error); ASSERT_OR_PRINT(ret, error); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); _mongoc_client_set_stream_initiator_single_or_pooled(client, _initiator_fn, pool); /* The other client marked the server as unknown after this client selected * the server and created a stream, but *before* constructing the initial * hello. This reproduces the crash reported in CDRIVER-3404. */ ret = mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); mongoc_uri_destroy(uri); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mock_server_destroy(mock_server); } /* Test what happens when running a command directly on a server (by passing an * explicit server id) that is marked as "unknown" in the topology description. * Prior to the bug fix of CDRIVER-3404, a pooled client would erroneously * attempt to send the command. * * Update: After applying the fix to CDRIVER-3653 this test was updated. * Connections will track their own server description from the handshake * response. * Marking the server unknown in the shared topology description no longer * affects established connections. */ void _test_cmd_on_unknown_serverid(bool pooled) { mongoc_client_pool_t *pool; mongoc_client_t *client; bson_error_t error; bool ret; mongoc_uri_t *uri; uri = test_framework_get_uri(); /* Set a lower heartbeatFrequencyMS. * Servers supporting streamable hello will only respond to an awaitable * hello until heartbeatFrequencyMS has passed or the server had changed * state. This test marks the server Unknown in the client's topology * description. During cleanup, _mongoc_client_end_sessions will attempt to * do server selection again and wait for a server to become discovered. */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 5000); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); } else { pool = NULL; client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); } /* Do the initial topology scan and selection. */ ret = mongoc_client_command_simple( client, "admin", tmp_bson("{ 'ping': 1 }"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, 1, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Invalidate the server, giving it the server type MONGOC_SERVER_UNKNOWN */ _mongoc_topology_invalidate_server(client->topology, 1); /* The next command is attempted directly on the unknown server and should * result in an error. */ ret = mongoc_client_command_simple_with_server_id( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, 1, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } void test_cmd_on_unknown_serverid_pooled(void) { _test_cmd_on_unknown_serverid(true /* pooled */); } void test_cmd_on_unknown_serverid_single(void) { _test_cmd_on_unknown_serverid(false /* pooled */); } /* Test that server streams are invalidated as expected. */ static void test_cluster_stream_invalidation_single(void) { mongoc_client_t *client; mongoc_server_description_t *sd; bson_error_t error; mongoc_server_stream_t *stream; mc_tpld_modification tdmod; client = test_framework_new_default_client(); /* Select a server to start monitoring. */ sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); /* Test "clearing the pool". This should invalidate existing server streams. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); tdmod = mc_tpld_modify_begin(client->topology); _mongoc_topology_description_clear_connection_pool(tdmod.new_td, mongoc_server_description_id(sd), &kZeroObjectId); mc_tpld_modify_commit(tdmod); BSON_ASSERT(!mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); /* Test closing the connection. This should invalidate existing server * streams. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_cluster_disconnect_node(&client->cluster, sd->id); BSON_ASSERT(!mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); /* Test that a new stream is considered valid. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); mongoc_server_description_destroy(sd); mongoc_client_destroy(client); } /* Test that server streams are invalidated as expected. */ static void test_cluster_stream_invalidation_pooled(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_server_description_t *sd; bson_error_t error; mongoc_server_stream_t *stream; mc_tpld_modification tdmod; pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); /* Select a server. */ sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); /* Test "clearing the pool". This should invalidate existing server streams. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); tdmod = mc_tpld_modify_begin(client->topology); _mongoc_topology_description_clear_connection_pool(tdmod.new_td, mongoc_server_description_id(sd), &kZeroObjectId); mc_tpld_modify_commit(tdmod); BSON_ASSERT(!mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); /* Test closing the connection. This should invalidate existing server * streams. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_cluster_disconnect_node(&client->cluster, sd->id); BSON_ASSERT(!mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); /* Test that a new stream is considered valid. */ stream = mongoc_cluster_stream_for_writes(&client->cluster, TEST_SS_LOG_CONTEXT, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(stream, error); BSON_ASSERT(mongoc_cluster_stream_valid(&client->cluster, stream)); mongoc_server_stream_cleanup(stream); mongoc_server_description_destroy(sd); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } void test_cluster_install(TestSuite *suite) { TestSuite_AddLive(suite, "/Cluster/test_get_max_bson_obj_size", test_get_max_bson_obj_size); TestSuite_AddLive(suite, "/Cluster/test_get_max_msg_size", test_get_max_msg_size); TestSuite_AddFull(suite, "/Cluster/disconnect/single [timeout:30]", test_cluster_node_disconnect_single, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Cluster/disconnect/pooled [timeout:30]", test_cluster_node_disconnect_pooled, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/command/timeout/single", test_cluster_command_timeout_single); TestSuite_AddMockServerTest(suite, "/Cluster/command/timeout/pooled", test_cluster_command_timeout_pooled); TestSuite_AddFull(suite, "/Cluster/write_command/disconnect [timeout:30]", test_write_command_disconnect, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddLive(suite, "/Cluster/cluster_time/command_simple/single", test_cluster_time_command_simple_single); TestSuite_AddLive( suite, "/Cluster/cluster_time/command_simple/pooled [timeout:30]", test_cluster_time_command_simple_pooled); TestSuite_AddLive( suite, "/Cluster/cluster_time/command_with_opts/single", test_cluster_time_command_with_opts_single); TestSuite_AddLive( suite, "/Cluster/cluster_time/command_with_opts/pooled [timeout:30]", test_cluster_time_command_with_opts_pooled); TestSuite_AddLive(suite, "/Cluster/cluster_time/aggregate/single", test_cluster_time_aggregate_single); TestSuite_AddLive(suite, "/Cluster/cluster_time/aggregate/pooled [timeout:30]", test_cluster_time_aggregate_pooled); TestSuite_AddLive(suite, "/Cluster/cluster_time/cursor/single", test_cluster_time_cursor_single); TestSuite_AddLive(suite, "/Cluster/cluster_time/cursor/pooled [timeout:30]", test_cluster_time_cursor_pooled); TestSuite_AddLive(suite, "/Cluster/cluster_time/insert/single", test_cluster_time_insert_single); TestSuite_AddLive(suite, "/Cluster/cluster_time/insert/pooled [timeout:30]", test_cluster_time_insert_pooled); TestSuite_AddLive(suite, "/Cluster/command/timeout/negative", test_cluster_command_timeout_negative); TestSuite_AddMockServerTest(suite, "/Cluster/cluster_time/comparison/single [timeout:30]", test_cluster_time_comparison_single, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/cluster_time/comparison/pooled [timeout:30]", test_cluster_time_comparison_pooled, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/cluster_time/advanced_not_sent_to_standalone", test_advanced_cluster_time_not_sent_to_standalone, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/Cluster/not_primary/single [timeout:30]", test_not_primary_single, test_framework_skip_if_slow); TestSuite_AddMockServerTest( suite, "/Cluster/not_primary/pooled [timeout:30]", test_not_primary_pooled, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/not_primary_auth/single [timeout:30]", test_not_primary_auth_single, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/not_primary_auth/pooled [timeout:30]", test_not_primary_auth_pooled, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Cluster/hello_fails", test_cluster_hello_fails); TestSuite_AddMockServerTest(suite, "/Cluster/hello_hangup", test_cluster_hello_hangup); TestSuite_AddMockServerTest(suite, "/Cluster/command_error/op_msg", test_cluster_command_error); TestSuite_AddMockServerTest(suite, "/Cluster/hello_on_unknown/mock", test_hello_on_unknown); /* These tests exhibit some mysterious behavior after the new feature changes-- see: "https://jira.mongodb.org/browse/CDRIVER-4293". TestSuite_AddLive (suite, "/Cluster/cmd_on_unknown_serverid/pooled", test_cmd_on_unknown_serverid_pooled); TestSuite_AddLive (suite, "/Cluster/cmd_on_unknown_serverid/single", test_cmd_on_unknown_serverid_single); */ TestSuite_AddLive(suite, "/Cluster/stream_invalidation/single", test_cluster_stream_invalidation_single); TestSuite_AddLive(suite, "/Cluster/stream_invalidation/pooled", test_cluster_stream_invalidation_pooled); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-cmd.c000066400000000000000000000130001511661753600234170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include /* CDRIVER-3303 - mongoc_cmd_parts_assemble sometimes fails to set options; * the fix was to refactor the code and this test guards against regressions */ static void test_client_cmd_options(void) { mock_server_t *server; mongoc_client_t *client; mongoc_read_concern_t *rc; bson_t opts; future_t *future; request_t *request; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); bson_init(&opts); mongoc_read_concern_append(rc, &opts); future = future_client_command_with_opts(client, "db", tmp_bson("{'ping': 1, '$db': 'db'}"), NULL, &opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'readConcern': { '$exists': true }}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); request_destroy(request); future_destroy(future); bson_destroy(&opts); mongoc_read_concern_destroy(rc); mongoc_client_destroy(client); mock_server_destroy(server); } static void capture_last_command(const mongoc_apm_command_started_t *event) { bson_t *last_captured = mongoc_apm_command_started_get_context(event); bson_destroy(last_captured); const bson_t *cmd = mongoc_apm_command_started_get_command(event); bson_copy_to(cmd, last_captured); } // `test_cmd_with_two_payload1` tests sending an OP_MSG with two document sequence payloads (payloadType=1). static void test_cmd_with_two_payload1(void *ctx) { BSON_UNUSED(ctx); mongoc_client_t *client = test_framework_new_default_client(); bson_t last_captured = BSON_INITIALIZER; // Set callback to capture the last command. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, capture_last_command); mongoc_client_set_apm_callbacks(client, cbs, &last_captured); mongoc_apm_callbacks_destroy(cbs); } mongoc_cluster_t *cluster = &client->cluster; bson_error_t error; // Use `bulkWrite`. Currently, only the `bulkWrite` command supports two document sequence payloads. bson_t *payload0 = tmp_bson(BSON_STR({"bulkWrite" : 1})); bson_t *op = tmp_bson(BSON_STR({"insert" : 0, "document" : {}})); bson_t *nsInfo = tmp_bson(BSON_STR({"ns" : "db.coll"})); // Create the `mongoc_cmd_t`. mongoc_cmd_parts_t parts; mongoc_cmd_parts_init(&parts, client, "admin", MONGOC_QUERY_NONE, payload0); const mongoc_ss_log_context_t ss_log_context = {.operation = "bulkWrite"}; mongoc_server_stream_t *server_stream = mongoc_cluster_stream_for_writes( cluster, &ss_log_context, NULL /* session */, NULL /* deprioritized servers */, NULL /* reply */, &error); ASSERT_OR_PRINT(server_stream, error); bool ok = mongoc_cmd_parts_assemble(&parts, server_stream, &error); ASSERT_OR_PRINT(ok, error); parts.assembled.payloads_count = 2; // Set `ops` as a payload1 (of one document) parts.assembled.payloads[0].identifier = "ops"; parts.assembled.payloads[0].documents = bson_get_data(op); parts.assembled.payloads[0].size = op->len; // Set `nsInfo` as a payload1 (of one document) parts.assembled.payloads[1].identifier = "nsInfo"; parts.assembled.payloads[1].documents = bson_get_data(nsInfo); parts.assembled.payloads[1].size = nsInfo->len; // Run the command. bson_t reply; ok = mongoc_cluster_run_command_monitored(cluster, &parts.assembled, &reply, &error); ASSERT_OR_PRINT(ok, error); ASSERT_MATCH(&reply, BSON_STR({"ok" : 1})); // Check that document sequences are converted to a BSON arrays for command monitoring. ASSERT_MATCH( &last_captured, BSON_STR({"bulkWrite" : 1, "ops" : [ {"insert" : 0, "document" : {}} ], "nsInfo" : [ {"ns" : "db.coll"} ]})); bson_destroy(&reply); mongoc_server_stream_cleanup(server_stream); mongoc_cmd_parts_cleanup(&parts); mongoc_client_destroy(client); // Destroy `last_captured` after `client`. `mongoc_client_destroy` sends an `endSessions` command. bson_destroy(&last_captured); } void test_client_cmd_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Client/cmd/options", test_client_cmd_options); TestSuite_AddFull(suite, "/cmd/with_two_payload1 [lock:live-server]", test_cmd_with_two_payload1, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 for `bulkWrite` ); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-collection-find-with-opts.c000066400000000000000000000732041511661753600276750ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include typedef struct { const char *filter; bson_t *filter_bson; const char *opts; bson_t *opts_bson; mongoc_read_prefs_t *read_prefs; const char *expected_find_command; int32_t expected_n_return; mongoc_query_flags_t expected_flags; uint32_t expected_skip; } test_collection_find_with_opts_t; /*-------------------------------------------------------------------------- * * _test_collection_find_command -- * * Start a mock server with @max_wire_version, connect a client, and * execute a query with @test_data->filter and @test_data->opts. Use * the @check_request_fn callback to verify the client formatted the * query correctly, and @reply_json to respond to the client. * *-------------------------------------------------------------------------- */ static void _test_collection_find_command(test_collection_find_with_opts_t *test_data) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; future_t *future; request_t *request; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, test_data->filter_bson, test_data->opts_bson, test_data->read_prefs); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(test_data->expected_find_command)); ASSERT(request); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void _test_collection_find_with_opts(test_collection_find_with_opts_t *test_data) { BSON_ASSERT(test_data->expected_find_command); test_data->filter_bson = tmp_bson(test_data->filter); test_data->opts_bson = tmp_bson(test_data->opts); _test_collection_find_command(test_data); } static void test_dollar_or(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'$or': [{'_id': 1}]}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'$or': [{'_id': 1}]}}"; _test_collection_find_with_opts(&test_data); } /* test '$or': [{'_id': 1}], 'snapshot': true * we just use snapshot to prove that an option can be passed * alongside '$or' */ static void test_snapshot_dollar_or(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'$or': [{'_id': 1}]}"; test_data.opts = "{'snapshot': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'$or': [{'_id': 1}]}," " 'snapshot': true}"; _test_collection_find_with_opts(&test_data); } /* test that we can query for a document by a key named "filter" */ static void test_key_named_filter(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'filter': 2}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'filter': 2}}"; _test_collection_find_with_opts(&test_data); } /* test 'filter': {'filter': {'i': 2}} */ static void test_op_query_subdoc_named_filter(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'filter': {'i': 2}}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'filter': {'i': 2}}}"; _test_collection_find_with_opts(&test_data); } /* test 'filter': {'filter': {'i': 2}}, 'snapshot': true * we just use snapshot to prove that an option can be passed * alongside 'filter' */ static void test_find_cmd_subdoc_named_filter_with_option(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'filter': {'i': 2}}"; test_data.opts = "{'snapshot': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'filter': {'i': 2}}, " " 'snapshot': true}"; _test_collection_find_with_opts(&test_data); } static void test_newoption(void) { test_collection_find_with_opts_t test_data = {0}; test_data.filter = "{'_id': 1}"; test_data.opts = "{'newOption': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {'_id': 1}, 'newOption': true}"; _test_collection_find_with_opts(&test_data); } static void test_sort(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'sort': {'_id': -1}}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'sort': {'_id': -1}}"; _test_collection_find_with_opts(&test_data); } static void test_fields(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'projection': {'_id': 0, 'b': 1}}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'projection': {'_id': 0, 'b': 1}}"; _test_collection_find_with_opts(&test_data); } static void test_slice(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'projection': {'array': {'$slice': 10}}}"; test_data.expected_find_command = "{'find': 'collection', " " 'filter': {}," " 'projection': {'array': {'$slice': 10}}}"; _test_collection_find_with_opts(&test_data); } static void test_int_modifiers(void) { const char *modifiers[] = { "maxScan", "maxTimeMS", }; const char *mod; size_t i; char *opts; char *find_command; test_collection_find_with_opts_t test_data = {0}; for (i = 0; i < sizeof(modifiers) / sizeof(const char *); i++) { mod = modifiers[i]; opts = bson_strdup_printf("{'%s': {'$numberLong': '9999'}}", mod); /* find command has same modifier, without the $-prefix */ find_command = bson_strdup_printf("{'find': 'collection', 'filter': {}," " '%s': {'$numberLong': '9999'}}", mod); test_data.opts = opts; test_data.expected_find_command = find_command; _test_collection_find_with_opts(&test_data); bson_free(opts); bson_free(find_command); } } static void test_index_spec_modifiers(void) { const char *modifiers[] = { "hint", "min", "max", }; const char *mod; size_t i; char *opts; char *find_command; test_collection_find_with_opts_t test_data = {0}; for (i = 0; i < sizeof(modifiers) / sizeof(const char *); i++) { mod = modifiers[i]; opts = bson_strdup_printf("{'%s': {'_id': 1}}", mod); /* find command options have no $-prefix: hint, min, max */ find_command = bson_strdup_printf("{'find': 'collection', 'filter': {}, '%s': {'_id': 1}}", mod); test_data.opts = opts; test_data.expected_find_command = find_command; _test_collection_find_with_opts(&test_data); bson_free(opts); bson_free(find_command); } } static void test_comment(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'comment': 'COMMENT'}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'comment': 'COMMENT'}"; _test_collection_find_with_opts(&test_data); } static void test_snapshot(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'snapshot': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'snapshot': true}"; _test_collection_find_with_opts(&test_data); } /* showRecordId becomes $showDiskLoc */ static void test_diskloc(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'showRecordId': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'showRecordId': true}"; _test_collection_find_with_opts(&test_data); } static void test_returnkey(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'returnKey': true}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'returnKey': true}"; _test_collection_find_with_opts(&test_data); } static void test_skip(void) { test_collection_find_with_opts_t test_data = {0}; test_data.expected_skip = 1; test_data.opts = "{'skip': {'$numberLong': '1'}}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'skip': {'$numberLong': '1'}}"; _test_collection_find_with_opts(&test_data); } static void test_batch_size(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'batchSize': {'$numberLong': '2'}}"; test_data.expected_n_return = 2; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'batchSize': {'$numberLong': '2'}}"; _test_collection_find_with_opts(&test_data); } static void test_limit(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'limit': {'$numberLong': '2'}}"; test_data.expected_n_return = 2; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'limit': {'$numberLong': '2'}}"; _test_collection_find_with_opts(&test_data); } static void test_singlebatch(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'limit': {'$numberLong': '2'}, 'singleBatch': true}"; test_data.expected_n_return = -2; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, " " 'singleBatch': true, 'limit': {'$numberLong': '2'}}"; _test_collection_find_with_opts(&test_data); } static void test_singlebatch_no_limit(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'singleBatch': true}"; /* singleBatch doesn't affect OP_QUERY with limit 0, nToReturn is still 0 */ test_data.expected_n_return = 0; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'singleBatch': true}"; _test_collection_find_with_opts(&test_data); } static void test_unrecognized_dollar_option(void) { test_collection_find_with_opts_t test_data = {0}; test_data.opts = "{'dumb': 1}"; test_data.expected_find_command = "{'find': 'collection', 'filter': {}, 'dumb': 1}"; _test_collection_find_with_opts(&test_data); } static void test_query_flags(void) { char *opts; char *find_cmd; test_collection_find_with_opts_t test_data = {0}; typedef struct { mongoc_query_flags_t flag; const char *json_fragment; } flag_and_name_t; /* secondaryOk is not supported as an option, exhaust is tested separately */ flag_and_name_t flags_and_frags[] = { {MONGOC_QUERY_TAILABLE_CURSOR, "'tailable': true"}, {MONGOC_QUERY_OPLOG_REPLAY, "'oplogReplay': true"}, {MONGOC_QUERY_NO_CURSOR_TIMEOUT, "'noCursorTimeout': true"}, {MONGOC_QUERY_PARTIAL, "'allowPartialResults': true"}, {MONGOC_QUERY_TAILABLE_CURSOR | MONGOC_QUERY_AWAIT_DATA, "'tailable': true, 'awaitData': true"}, }; mlib_foreach_arr (flag_and_name_t, it, flags_and_frags) { opts = bson_strdup_printf("{%s}", it->json_fragment); find_cmd = bson_strdup_printf("{'find': 'collection', 'filter': {}, %s}", it->json_fragment); test_data.opts = opts; test_data.expected_flags = it->flag; test_data.expected_find_command = find_cmd; _test_collection_find_with_opts(&test_data); bson_free(find_cmd); bson_free(opts); } } static void test_exhaust(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; request_t *request; future_t *future; const bson_t *doc; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), tmp_bson("{'exhaust': true}"), NULL); future = future_cursor_next(cursor, &doc); // Expect find command with exhaust flag. Reply with one document. { const bson_t *cmd = tmp_bson(BSON_STR({"find" : "collection", "filter" : {}})); request = mock_server_receives_msg(server, MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED, cmd); const bson_t *reply = tmp_bson(BSON_STR( {"ok" : 1, "cursor" : {"id" : {"$numberLong" : "0"}, "ns" : "db.collection", "firstBatch" : [ {} ]}})); reply_to_op_msg_request(request, MONGOC_OP_MSG_FLAG_NONE, reply); } ASSERT(future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_getmore_cmd_await(void) { bson_t *opts; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; opts = tmp_bson("{'tailable': true," " 'awaitData': true," " 'maxAwaitTimeMS': {'$numberLong': '9999'}}"); /* * "find" command */ server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'collection'," " 'filter': {}," " 'maxTimeMS': {'$exists': false}," " 'maxAwaitTimeMS': {'$exists': false}}")); ASSERT(request); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); /* * "getMore" command */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'collection'," " 'maxAwaitTimeMS': {'$exists': false}," " 'maxTimeMS': {'$numberLong': '9999'}}")); ASSERT(request); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'nextBatch': [{}]}}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_find_w_server_id(void) { mock_rs_t *rs; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; rs = mock_rs_with_auto_hello( WIRE_VERSION_MIN /* wire version */, true /* has primary */, 1 /* secondary */, 0 /* arbiters */); mock_rs_run(rs); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* use serverId instead of prefs to select the secondary */ opts = tmp_bson("{'serverId': 2}"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'collection'," " 'filter': {}," " '$readPreference': {'mode': 'primaryPreferred'}}")); ASSERT(mock_rs_request_is_to_secondary(rs, request)); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), cursor->error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_rs_destroy(rs); } static void test_find_cmd_w_server_id(void) { mock_rs_t *rs; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; bson_error_t error; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true /* has primary */, 1 /* secondary */, 0 /* arbiters */); mock_rs_run(rs); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* use serverId instead of prefs to select the secondary */ opts = tmp_bson("{'serverId': 2, 'readConcern': {'level': 'local'}}"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); /* recognized that wire version is recent enough for readConcern */ request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'collection', " " 'filter': {}," " 'readConcern': {'level': 'local'}," " 'serverId': {'$exists': false}}")); ASSERT(mock_rs_request_is_to_secondary(rs, request)); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_rs_destroy(rs); } static void test_find_w_server_id_sharded(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); opts = tmp_bson("{'serverId': 1}"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); /* Does NOT set '$readPreference', since this is a sharded topology. */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'collection'," " 'filter': {}," " '$readPreference': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_find_cmd_w_server_id_sharded(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); opts = tmp_bson("{'serverId': 1, 'readConcern': {'level': 'local'}}"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); /* recognized that wire version is recent enough for readConcern */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'collection', " " 'filter': {}," " 'readConcern': {'level': 'local'}," " 'serverId': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_server_id_option(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t *q; bson_error_t error; mongoc_cursor_t *cursor; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "db", "collection"); q = tmp_bson(NULL); cursor = mongoc_collection_find_with_opts(collection, q, tmp_bson("{'serverId': 'foo'}"), NULL); ASSERT_ERROR_CONTAINS(cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "must be an integer"); mongoc_cursor_destroy(cursor); cursor = mongoc_collection_find_with_opts(collection, q, tmp_bson("{'serverId': 0}"), NULL); ASSERT_ERROR_CONTAINS(cursor->error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "must be >= 1"); mongoc_cursor_destroy(cursor); cursor = mongoc_collection_find_with_opts(collection, q, tmp_bson("{'serverId': 1}"), NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_find_batchSize(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; mongoc_cursor_t *cursor; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "db", "collection"); // Test a cursor with an int32 batchSize. { cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{}"), tmp_bson("{'batchSize': { '$numberInt': '1' }}"), NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); // Exhaust the cursor. { // Note: Cursors are lazy. The `find` command is sent on the first call // to `mongoc_cursor_next`. const bson_t *got; while (mongoc_cursor_next(cursor, &got)) ; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); } // Test a cursor with an int64 batchSize. { cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{}"), tmp_bson("{'batchSize': { '$numberLong': '1' }}"), NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); // Exhaust the cursor. { // Note: Cursors are lazy. The `find` command is sent on the first call // to `mongoc_cursor_next`. const bson_t *got; while (mongoc_cursor_next(cursor, &got)) ; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); } // Test a cursor with a string batchSize. { cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'batchSize': 'foo'}"), NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); // Attempt to exhaust the cursor. { // Note: Cursors are lazy. The `find` command is sent on the first call // to `mongoc_cursor_next`. const bson_t *got; while (mongoc_cursor_next(cursor, &got)) ; } // Expect an error from the server. ASSERT(mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); } void test_collection_find_with_opts_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/dollar_or", test_dollar_or); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/snapshot_dollar_or", test_snapshot_dollar_or); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/key_named_filter", test_key_named_filter); TestSuite_AddMockServerTest( suite, "/Collection/find_with_opts/query/subdoc_named_filter", test_op_query_subdoc_named_filter); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/newoption", test_newoption); TestSuite_AddMockServerTest( suite, "/Collection/find_with_opts/cmd/subdoc_named_filter", test_find_cmd_subdoc_named_filter_with_option); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/orderby", test_sort); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/fields", test_fields); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/slice", test_slice); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/modifiers/integer", test_int_modifiers); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/modifiers/index_spec", test_index_spec_modifiers); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/comment", test_comment); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/modifiers/bool", test_snapshot); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/showdiskloc", test_diskloc); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/returnkey", test_returnkey); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/skip", test_skip); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/batch_size", test_batch_size); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/limit", test_limit); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/singlebatch", test_singlebatch); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/singlebatch/no_limit", test_singlebatch_no_limit); TestSuite_AddMockServerTest( suite, "/Collection/find_with_opts/unrecognized_dollar", test_unrecognized_dollar_option); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/flags", test_query_flags); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/exhaust", test_exhaust); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/await/getmore_cmd", test_getmore_cmd_await); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/server_id", test_find_w_server_id); TestSuite_AddMockServerTest(suite, "/Collection/find_cmd_with_opts/server_id", test_find_cmd_w_server_id); TestSuite_AddMockServerTest(suite, "/Collection/find_with_opts/server_id/sharded", test_find_w_server_id_sharded); TestSuite_AddMockServerTest( suite, "/Collection/find_cmd_with_opts/server_id/sharded", test_find_cmd_w_server_id_sharded); TestSuite_AddLive(suite, "/Collection/find_with_opts/server_id/option", test_server_id_option); TestSuite_AddLive(suite, "/Collection/find/batchSize", test_find_batchSize); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-collection.c000066400000000000000000005365011511661753600250270ustar00rootroot00000000000000#include #include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include BEGIN_IGNORE_DEPRECATIONS static void test_aggregate_w_write_concern(void *ctx) { mongoc_cursor_t *cursor; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *good_wc; mongoc_write_concern_t *bad_wc; bson_t *pipeline; bson_t *opts = NULL; char *json; const bson_t *doc; bson_error_t error; BSON_UNUSED(ctx); /* set up */ good_wc = mongoc_write_concern_new(); bad_wc = mongoc_write_concern_new(); opts = bson_new(); client = test_framework_new_default_client(); BSON_ASSERT(client); ASSERT(mongoc_client_set_error_api(client, 2)); collection = mongoc_client_get_collection(client, "test", "test"); /* pipeline that writes to collection */ json = bson_strdup_printf("[{'$out': '%s'}]", collection->collection); pipeline = tmp_bson(json); /* collection aggregate with valid writeConcern: no error */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, opts, NULL); ASSERT(cursor); mongoc_cursor_next(cursor, &doc); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); /* writeConcern that will not pass mongoc_write_concern_is_valid */ bad_wc->wtimeout = -10; bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, opts, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_ERROR_CONTAINS(cursor->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); mongoc_collection_destroy(collection); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); bson_destroy(opts); bson_free(json); } static void test_aggregate_inherit_collection(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; mongoc_collection_t *collection; const bson_t *doc; request_t *request; future_t *future; bson_t *pipeline; bson_t opts = BSON_INITIALIZER; mongoc_read_concern_t *rc2; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc2; mongoc_write_concern_t *wc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); pipeline = BCON_NEW("pipeline", "[", "{", "$out", BCON_UTF8("collection2"), "}", "]"); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_read_concern_append(rc, &opts); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_write_concern_append(wc, &opts); /* Uses the opts */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_SECONDARY_OK, pipeline, &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'$out': 'collection2'}]," " 'cursor': {}," " 'readConcern': {'level': 'majority'}," " 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); ASSERT(!future_get_bool(future)); /* Set collection level defaults */ wc2 = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc2, 3); mongoc_collection_set_write_concern(collection, wc2); rc2 = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc2, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_collection_set_read_concern(collection, rc2); future_destroy(future); mongoc_cursor_destroy(cursor); /* Inherits from collection */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_SECONDARY_OK, pipeline, NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(" {'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'$out': 'collection2'}]," " 'cursor': {}," " 'readConcern': {'level': 'local'}," " 'writeConcern': {'w': 3}}")); reply_to_request_with_ok_and_destroy(request); ASSERT(!future_get_bool(future)); future_destroy(future); mongoc_cursor_destroy(cursor); /* Uses the opts, not default collection level */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_SECONDARY_OK, pipeline, &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'$out': 'collection2'}]," " 'cursor': {}," " 'readConcern': {'level': 'majority'}," " 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); ASSERT(!future_get_bool(future)); future_destroy(future); mongoc_cursor_destroy(cursor); /* Doesn't inherit write concern when not using $out */ bson_destroy(pipeline); pipeline = BCON_NEW("pipeline", "[", "{", "$in", BCON_UTF8("collection2"), "}", "]"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_SECONDARY_OK, pipeline, NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(" {'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'$in': 'collection2'}]," " 'cursor': {}," " 'readConcern': {'level': 'local'}," " 'writeConcern': {'$exists': false}}")); reply_to_request_with_ok_and_destroy(request); ASSERT(!future_get_bool(future)); future_destroy(future); mongoc_cursor_destroy(cursor); bson_destroy(&opts); bson_destroy(pipeline); mongoc_read_concern_destroy(rc); mongoc_read_concern_destroy(rc2); mongoc_write_concern_destroy(wc); mongoc_write_concern_destroy(wc2); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void _batch_size_test(bson_t *pipeline, bson_t *batch_size, bool use_batch_size, int size) { mock_server_t *mock_server; mongoc_client_t *client; mongoc_collection_t *coll; future_t *future; request_t *request; mongoc_cursor_t *cursor; const bson_t *doc; mock_server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(mock_server); client = test_framework_client_new_from_uri(mock_server_get_uri(mock_server), NULL); coll = mongoc_client_get_collection(client, "db", "coll"); cursor = mongoc_collection_aggregate(coll, MONGOC_QUERY_NONE, pipeline, batch_size, NULL); future = future_cursor_next(cursor, &doc); if (use_batch_size) { request = mock_server_receives_msg(mock_server, 0, tmp_bson("{ 'cursor' : { 'batchSize' : %d } }", size)); } else { request = mock_server_receives_msg(mock_server, 0, tmp_bson("{ 'cursor' : { 'batchSize' : { '$exists': false } } }")); } reply_to_request_simple(request, "{'ok': 1}"); request_destroy(request); future_wait(future); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(mock_server); } static void test_aggregate_with_batch_size(void) { bson_t *pipeline_dollar_out; bson_t *pipeline_dollar_merge; bson_t *pipeline_no_terminal_key; bson_t *batch_size_zero; bson_t *batch_size_one; pipeline_dollar_out = tmp_bson("{ 'pipeline': [ { '$out' : 'coll2' } ] }"); pipeline_dollar_merge = tmp_bson("{ 'pipeline': [ { '$merge' : 'coll2' } ] }"); pipeline_no_terminal_key = tmp_bson("{ 'pipeline': [ ] }"); batch_size_one = tmp_bson(" { 'batchSize': 1 } "); batch_size_zero = tmp_bson(" { 'batchSize': 0 } "); /* Case 1: Test that with a terminal key and batchSize > 0, we use the batchSize */ _batch_size_test(pipeline_dollar_out, batch_size_one, true, 1); _batch_size_test(pipeline_dollar_merge, batch_size_one, true, 1); /* Case 2: Test that with terminal key and batchSize == 0, we don't use the batchSize */ _batch_size_test(pipeline_dollar_out, batch_size_zero, false, 0); _batch_size_test(pipeline_dollar_merge, batch_size_zero, false, 0); /* Case 3: Test that without a terminal key and batchSize > 0, we use the batchSize */ _batch_size_test(pipeline_no_terminal_key, batch_size_one, true, 1); /* Case 4: Test that without $out and batchSize == 0, we use the batchSize */ _batch_size_test(pipeline_no_terminal_key, batch_size_zero, true, 0); } static void test_read_prefs_is_valid(void *ctx) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; bson_t *pipeline; mongoc_read_prefs_t *read_prefs; bson_t reply; BSON_UNUSED(ctx); client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_aggregate"); ASSERT(collection); pipeline = BCON_NEW("pipeline", "[", "{", "$match", "{", "hello", BCON_UTF8("world"), "}", "}", "]"); /* if read prefs is not valid */ read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); ASSERT(read_prefs); mongoc_read_prefs_set_tags(read_prefs, tmp_bson("[{'does-not-exist': 'x'}]")); /* mongoc_collection_aggregate */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, read_prefs); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); /* mongoc_collection_command_simple */ ASSERT(!mongoc_collection_command_simple(collection, tmp_bson("{'ping': 1}"), read_prefs, &reply, &error)); bson_destroy(&reply); /* mongoc_collection_find_with_opts */ cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, read_prefs); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); /* if read prefs is valid */ mongoc_read_prefs_destroy(read_prefs); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); ASSERT(read_prefs); /* mongoc_collection_aggregate */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, read_prefs); ASSERT(cursor); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); /* mongoc_collection_command_simple */ ASSERT_OR_PRINT(mongoc_collection_command_simple(collection, tmp_bson("{'ping': 1}"), read_prefs, &reply, &error), error); bson_destroy(&reply); /* mongoc_collection_find_with_opts */ cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, read_prefs); ASSERT(cursor); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(read_prefs); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); bson_destroy(pipeline); } static void test_copy(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_collection_t *copy; mongoc_client_t *client; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_insert"); ASSERT(collection); copy = mongoc_collection_copy(collection); ASSERT(copy); ASSERT(copy->client == collection->client); ASSERT(strcmp(copy->ns, collection->ns) == 0); mongoc_collection_destroy(copy); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_insert(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; bson_context_t *context; bson_error_t error; bool r; bson_oid_t oid; unsigned i; bson_t b; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_insert"); ASSERT(collection); /* don't care if ns not found. */ (void)mongoc_collection_drop(collection, &error); context = bson_context_new(BSON_CONTEXT_NONE); ASSERT(context); for (i = 0; i < 10; i++) { bson_init(&b); bson_oid_init(&oid, context); bson_append_oid(&b, "_id", 3, &oid); bson_append_utf8(&b, "hello", 5, "/world", 6); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &b, NULL, NULL, &error), error); bson_destroy(&b); } r = mongoc_collection_insert_one(collection, tmp_bson("{'': 1}"), NULL, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid document"); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); bson_context_destroy(context); mongoc_client_destroy(client); } static void test_insert_null(void) { mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; bson_t reply; const bson_t *out; bool ret; bson_t doc; bson_t filter = BSON_INITIALIZER; bson_iter_t iter; uint32_t len; client = test_framework_new_default_client(); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test_null_insert"); ASSERT(collection); (void)mongoc_collection_drop(collection, &error); bson_init(&doc); bson_append_utf8(&doc, "hello", 5, "wor\0ld", 6); ret = mongoc_collection_insert_one(collection, &doc, NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_insert(bulk, &doc); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(ret, error); ASSERT_MATCH(&reply, "{'nInserted': 1," " 'nMatched': 0," " 'nModified': 0," " 'nRemoved': 0," " 'nUpserted': 0," " 'writeErrors': []}"); bson_destroy(&doc); bson_destroy(&reply); cursor = mongoc_collection_find_with_opts(collection, &filter, NULL, NULL); ASSERT(mongoc_cursor_next(cursor, &out)); ASSERT(bson_iter_init_find(&iter, out, "hello")); ASSERT(!memcmp(bson_iter_utf8(&iter, &len), "wor\0ld", 6)); ASSERT_CMPINT(len, ==, 6); ASSERT(mongoc_cursor_next(cursor, &out)); ASSERT(bson_iter_init_find(&iter, out, "hello")); ASSERT(!memcmp(bson_iter_utf8(&iter, &len), "wor\0ld", 6)); ASSERT_CMPINT(len, ==, 6); mongoc_cursor_destroy(cursor); mongoc_bulk_operation_destroy(bulk); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_remove_one(bulk, &doc); ret = mongoc_bulk_operation_update_one_with_opts(bulk, &doc, tmp_bson("{'$set': {'x': 1}}"), NULL, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(ret, error); ASSERT_MATCH(&reply, "{'nInserted': 0," " 'nMatched': 1," " 'nModified': 1," " 'nRemoved': 1," " 'nUpserted': 0," " 'writeErrors': []}"); bson_destroy(&filter); bson_destroy(&reply); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_oversize(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; bool r; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_oversize"); /* two huge strings make the doc too large */ BSON_ASSERT(bson_append_utf8(&doc, "x", 1, huge_string(client), (int)huge_string_length(client))); BSON_ASSERT(bson_append_utf8(&doc, "y", 1, huge_string(client), (int)huge_string_length(client))); r = mongoc_collection_insert_one(collection, &doc, NULL, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "too large"); bson_destroy(&doc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_many(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_context_t *context; bson_error_t error; bool r; bson_oid_t oid; unsigned i; bson_t q; bson_t b[10]; bson_t *bptr[10]; bson_t reply; int64_t count; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_insert_many"); ASSERT(collection); (void)mongoc_collection_drop(collection, &error); context = bson_context_new(BSON_CONTEXT_NONE); ASSERT(context); bson_init(&q); bson_append_int32(&q, "n", -1, 0); for (i = 0; i < 10; i++) { bson_init(&b[i]); bson_oid_init(&oid, context); bson_append_oid(&b[i], "_id", -1, &oid); bson_append_int32(&b[i], "n", -1, i % 2); bptr[i] = &b[i]; } ASSERT_OR_PRINT(mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, NULL, &reply, &error), error); ASSERT_CMPINT32(bson_lookup_int32(&reply, "insertedCount"), ==, 10); bson_destroy(&reply); count = mongoc_collection_count_documents(collection, &q, NULL, NULL, NULL, &error); ASSERT(count == 5); for (i = 8; i < 10; i++) { bson_destroy(&b[i]); bson_init(&b[i]); bson_oid_init(&oid, context); bson_append_oid(&b[i], "_id", -1, &oid); bson_append_int32(&b[i], "n", -1, i % 2); bptr[i] = &b[i]; } r = mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, NULL, &reply, &error); ASSERT(!r); ASSERT(error.code == 11000); ASSERT_CMPINT32(bson_lookup_int32(&reply, "insertedCount"), ==, 0); bson_destroy(&reply); count = mongoc_collection_count_documents(collection, &q, NULL, NULL, NULL, &error); ASSERT(count == 5); r = mongoc_collection_insert_many( collection, (const bson_t **)bptr, 10, tmp_bson("{'ordered': false}"), &reply, &error); ASSERT(!r); ASSERT(error.code == 11000); ASSERT_CMPINT32(bson_lookup_int32(&reply, "insertedCount"), ==, 2); bson_destroy(&reply); count = mongoc_collection_count_documents(collection, &q, NULL, NULL, NULL, &error); ASSERT(count == 6); /* test validate */ for (i = 0; i < 10; i++) { bson_destroy(&b[i]); bson_init(&b[i]); BSON_APPEND_INT32(&b[i], "" /* empty key */, i); bptr[i] = &b[i]; } r = mongoc_collection_insert_many( collection, (const bson_t **)bptr, 10, tmp_bson("{'ordered': false}"), NULL, &error); ASSERT(!r); ASSERT(error.domain == MONGOC_ERROR_COMMAND); ASSERT(error.code == MONGOC_ERROR_COMMAND_INVALID_ARG); for (i = 0; i < 10; i++) { bson_destroy(&b[i]); bson_init(&b[i]); BSON_APPEND_INT32(&b[i], "" /* empty key */, i); bptr[i] = &b[i]; } r = mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, NULL, NULL, &error); ASSERT(!r); ASSERT(error.domain == MONGOC_ERROR_COMMAND); ASSERT(error.code == MONGOC_ERROR_COMMAND_INVALID_ARG); bson_destroy(&q); for (i = 0; i < 10; i++) { bson_destroy(&b[i]); } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); bson_context_destroy(context); mongoc_client_destroy(client); } char * make_string(size_t len) { char *s = (char *)bson_malloc(len); BSON_ASSERT(len > 0); memset(s, 'a', len - 1); s[len - 1] = '\0'; return s; } bson_t * make_document(size_t bytes) { bson_t *bson; bson_oid_t oid; char *s; size_t string_len; bson_oid_init(&oid, NULL); bson = bson_new(); BSON_APPEND_OID(bson, "_id", &oid); /* make the document exactly n bytes by appending a string. a string has * 7 bytes overhead (1 for type code, 2 for key, 4 for length prefix), so * make the string (n_bytes - current_length - 7) bytes long. */ ASSERT_CMPUINT((unsigned int)bytes, >=, bson->len + 7); string_len = bytes - bson->len - 7; s = make_string(string_len); BSON_APPEND_UTF8(bson, "s", s); bson_free(s); ASSERT_CMPUINT((unsigned int)bytes, ==, bson->len); return bson; } void make_bulk_insert(bson_t **bsons, int n, size_t bytes) { int i; for (i = 0; i < n; i++) { bsons[i] = make_document(bytes); } } static void destroy_all(bson_t **ptr, int n) { int i; for (i = 0; i < n; i++) { bson_destroy(ptr[i]); } } /* CDRIVER-845: "insert" command must have array keys "0", "1", "2", ... */ static void test_insert_command_keys(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; uint32_t i; bson_t *doc; bson_t reply; bson_error_t error; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); for (i = 0; i < 3; i++) { doc = BCON_NEW("_id", BCON_INT32(i)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); } future = future_bulk_operation_execute(bulk, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'insert': 'test'}"), tmp_bson("{'_id': 0}"), tmp_bson("{'_id': 1}"), tmp_bson("{'_id': 2}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_uint32_t(future), error); bson_destroy(&reply); future_destroy(future); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_regex(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_write_concern_t *wr; bson_t opts = BSON_INITIALIZER; mongoc_client_t *client; bson_error_t error; int64_t count; bson_t q = BSON_INITIALIZER; bson_t *doc; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_regex"); ASSERT(collection); wr = mongoc_write_concern_new(); mongoc_write_concern_set_journal(wr, true); mongoc_write_concern_append(wr, &opts); doc = BCON_NEW("hello", "/world"); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, doc, &opts, NULL, &error), error); BSON_APPEND_REGEX(&q, "hello", "^/wo", "i"); count = mongoc_collection_count_documents(collection, &q, NULL, NULL, NULL, &error); ASSERT(count > 0); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&opts); mongoc_write_concern_destroy(wr); bson_destroy(&q); bson_destroy(doc); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_decimal128(void *ctx) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_write_concern_t *wr; bson_t opts = BSON_INITIALIZER; mongoc_client_t *client; bson_error_t error = {0}; int64_t count; bson_t query = BSON_INITIALIZER; bson_t *doc; const bson_t *dec; bson_iter_t dec_iter; mongoc_cursor_t *cursor; bool r; bson_decimal128_t decimal128; bson_decimal128_t read_decimal; BSON_UNUSED(ctx); bson_decimal128_from_string("-123456789.101112E-120", &decimal128); client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_decimal128"); ASSERT(collection); wr = mongoc_write_concern_new(); mongoc_write_concern_set_journal(wr, true); mongoc_write_concern_append(wr, &opts); doc = BCON_NEW("the_decimal", BCON_DECIMAL128(&decimal128)); r = mongoc_collection_insert_one(collection, doc, &opts, NULL, &error); if (!r) { MONGOC_WARNING("test_decimal128: %s\n", error.message); } ASSERT(r); count = mongoc_collection_count_documents(collection, &query, NULL, NULL, NULL, &error); ASSERT(count > 0); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); ASSERT(mongoc_cursor_next(cursor, &dec)); ASSERT(bson_iter_init(&dec_iter, dec)); ASSERT(bson_iter_find(&dec_iter, "the_decimal")); ASSERT(BSON_ITER_HOLDS_DECIMAL128(&dec_iter)); bson_iter_decimal128(&dec_iter, &read_decimal); ASSERT(read_decimal.high == decimal128.high && read_decimal.low == decimal128.low); bson_destroy(doc); bson_destroy(&query); bson_destroy(&opts); mongoc_write_concern_destroy(wr); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_update(void) { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_update"); // Test a successful update: { mongoc_collection_drop(coll, NULL); bson_t *b = tmp_bson("{'foo' : 'bar'}"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, b, NULL, NULL, &error), error); bson_t *q = tmp_bson("{}"); bson_t *u = tmp_bson("{'$set': {'foo': 'updated' }}"); ASSERT_OR_PRINT(mongoc_collection_update(coll, MONGOC_UPDATE_NONE, q, u, NULL, &error), error); bson_t *f = tmp_bson("{'foo': 'updated'}"); int64_t count = mongoc_collection_count_documents(coll, f, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(count >= 0, error); ASSERT_CMPINT64(count, ==, 1); } // Test an invalid update document with both $-prefixed and non-$-prefixed fields: { bson_t *q = tmp_bson("{}"); bson_t *u = tmp_bson("{'abcd': 1, '$hi': 1 }"); bool ok = mongoc_collection_update(coll, MONGOC_UPDATE_NONE, q, u, NULL, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key"); } // Test an invalid update document with an empty field: { bson_t *q = tmp_bson("{}"); bson_t *u = tmp_bson("{'': 1 }"); bool ok = mongoc_collection_update(coll, MONGOC_UPDATE_NONE, q, u, NULL, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty string"); } // Test a successful replacement: { mongoc_collection_drop(coll, NULL); bson_t *b = tmp_bson("{'foo' : 'bar'}"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, b, NULL, NULL, &error), error); bson_t *q = tmp_bson("{}"); bson_t *u = tmp_bson("{'foo2': 'bar2'}"); ASSERT_OR_PRINT(mongoc_collection_update(coll, MONGOC_UPDATE_NONE, q, u, NULL, &error), error); bson_t *f = tmp_bson("{'foo2': 'bar2'}"); int64_t count = mongoc_collection_count_documents(coll, f, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(count >= 0, error); ASSERT_CMPINT64(count, ==, 1); ASSERT_OR_PRINT(mongoc_collection_drop(coll, &error), error); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_update_pipeline(void *ctx) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_error_t error; bson_t *b; bson_t *pipeline; bson_t *replacement; bool res; BSON_UNUSED(ctx); client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_update_pipeline"); ASSERT(collection); b = tmp_bson("{'nums': {'x': 1, 'y': 2}}"); res = mongoc_collection_insert_one(collection, b, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* format: array document with incrementing keys (i.e. {"0": value, "1": value, "2": value}) */ pipeline = tmp_bson("{'0': {'$replaceRoot': {'newRoot': '$nums'}}," " '1': {'$addFields': {'z': 3}}}"); res = mongoc_collection_update_one(collection, b, pipeline, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); res = mongoc_collection_insert_one(collection, b, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* ensure that arrays sent to mongoc_collection_replace_one are not treated as pipelines */ replacement = tmp_bson("{'0': 0, '1': 1}"); res = mongoc_collection_replace_one(collection, b, replacement, NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* ensure that a pipeline with an empty document is considered invalid */ pipeline = tmp_bson("{ '0': {} }"); res = mongoc_collection_update_one(collection, b, pipeline, NULL, NULL, &error); ASSERT(!res); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key"); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_update_oversize(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; size_t huger_sz = 20 * 1024 * 1024; char *huger; bson_t huge = BSON_INITIALIZER; bson_t empty = BSON_INITIALIZER; bson_t huge_update = BSON_INITIALIZER; bson_t child; bool r; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_oversize"); /* first test oversized selector. two huge strings make the doc too large */ BSON_ASSERT(bson_append_utf8(&huge, "x", 1, huge_string(client), (int)huge_string_length(client))); BSON_ASSERT(bson_append_utf8(&huge, "y", 1, huge_string(client), (int)huge_string_length(client))); r = mongoc_collection_update(collection, MONGOC_UPDATE_NONE, &huge, &empty, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "too large"); /* test oversized update operator */ huger = bson_malloc(huger_sz + 1); memset(huger, 'a', huger_sz); huger[huger_sz] = '\0'; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(&huge_update, "$set", &child)); BSON_ASSERT(bson_append_utf8(&child, "x", 1, huger, (int)huger_sz)); BSON_ASSERT(bson_append_document_end(&huge_update, &child)); r = mongoc_collection_update(collection, MONGOC_UPDATE_NONE, &empty, &huge_update, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "too large"); bson_free(huger); bson_destroy(&huge); bson_destroy(&empty); bson_destroy(&huge_update); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_remove(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_context_t *context; bson_error_t error; bool r; bson_oid_t oid; bson_t b; int i; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_remove"); ASSERT(collection); context = bson_context_new(BSON_CONTEXT_NONE); ASSERT(context); for (i = 0; i < 100; i++) { bson_init(&b); bson_oid_init(&oid, context); bson_append_oid(&b, "_id", 3, &oid); bson_append_utf8(&b, "hello", 5, "world", 5); r = mongoc_collection_insert_one(collection, &b, NULL, NULL, &error); if (!r) { MONGOC_WARNING("%s\n", error.message); } ASSERT(r); bson_destroy(&b); bson_init(&b); bson_append_oid(&b, "_id", 3, &oid); r = mongoc_collection_delete_many(collection, &b, NULL, NULL, &error); if (!r) { MONGOC_WARNING("%s\n", error.message); } ASSERT(r); bson_destroy(&b); } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); bson_context_destroy(context); mongoc_client_destroy(client); } static void test_remove_oversize(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; bool r; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_remove_oversize"); /* two huge strings make the doc too large */ BSON_ASSERT(bson_append_utf8(&doc, "x", 1, huge_string(client), (int)huge_string_length(client))); BSON_ASSERT(bson_append_utf8(&doc, "y", 1, huge_string(client), (int)huge_string_length(client))); r = mongoc_collection_delete_many(collection, &doc, NULL, NULL, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_BSON, MONGOC_ERROR_BSON_INVALID, "too large"); bson_destroy(&doc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_w0(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_w0"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_append(wc, &opts); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); ASSERT_OR_PRINT(r, error); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_w0(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_error_t error; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_w0"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); r = mongoc_collection_update( collection, MONGOC_UPDATE_NONE, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), wc, &error); ASSERT_OR_PRINT(r, error); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_remove_w0(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; bson_t reply; bson_error_t error; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_remove_w0"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_append(wc, &opts); r = mongoc_collection_delete_many(collection, tmp_bson("{}"), &opts, &reply, &error); ASSERT_OR_PRINT(r, error); ASSERT(bson_empty(&reply)); bson_destroy(&reply); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_twice_w0(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_twice_w0"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_append(wc, &opts); r = mongoc_collection_insert_one(collection, tmp_bson("{'_id': 1}"), &opts, NULL, &error); ASSERT_OR_PRINT(r, error); /* Insert same document for the second time, but we should not get * an error since we don't wait for a server response */ r = mongoc_collection_insert_one(collection, tmp_bson("{'_id': 1}"), &opts, NULL, &error); ASSERT_OR_PRINT(r, error); bson_destroy(&opts); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_index(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_error_t error; bson_t keys; mongoc_index_model_t *im; bson_t *opts = NULL; mongoc_write_concern_t *bad_wc; mongoc_write_concern_t *good_wc; bool r; opts = bson_new(); client = test_framework_new_default_client(); ASSERT(client); mongoc_client_set_error_api(client, 2); bad_wc = mongoc_write_concern_new(); good_wc = mongoc_write_concern_new(); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_index"); ASSERT(collection); bson_init(&keys); bson_append_int32(&keys, "hello", -1, 1); im = mongoc_index_model_new(&keys, NULL); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop_index(collection, "hello_1", &error), error); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, NULL, &error), error); /* invalid writeConcern */ bad_wc->wtimeout = -10; bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_collection_drop_index_with_opts(collection, "hello_1", opts, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern on all configs*/ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); ASSERT_OR_PRINT(mongoc_collection_drop_index_with_opts(collection, "hello_1", opts, &error), error); ASSERT(!error.code); ASSERT(!error.domain); /* writeConcern that results in writeConcernError */ mongoc_write_concern_set_w(bad_wc, 99); if (!test_framework_is_mongos()) { /* skip if sharded */ ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, NULL, &error), error); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); r = mongoc_collection_drop_index_with_opts(collection, "hello_1", opts, &error); ASSERT(!r); assert_wc_oob_error(&error); } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&keys); mongoc_index_model_destroy(im); bson_destroy(opts); mongoc_write_concern_destroy(bad_wc); mongoc_write_concern_destroy(good_wc); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_index_w_write_concern(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; mongoc_write_concern_t *good_wc; mongoc_write_concern_t *bad_wc; bson_error_t error; bson_t keys; mongoc_index_model_t *im; bson_t reply; bson_t *opts = NULL; bool result; bool is_mongos = test_framework_is_mongos(); opts = bson_new(); client = test_framework_new_default_client(); ASSERT(client); good_wc = mongoc_write_concern_new(); bad_wc = mongoc_write_concern_new(); mongoc_client_set_error_api(client, 2); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_index"); ASSERT(collection); bson_init(&keys); bson_append_int32(&keys, "hello", -1, 1); im = mongoc_index_model_new(&keys, NULL); /* writeConcern that will not pass validation */ bad_wc->wtimeout = -10; bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, &reply, &error)); bson_destroy(&reply); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern on all server configs */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); result = mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, &reply, &error); ASSERT_OR_PRINT(result, error); ASSERT(!error.code); /* Be sure the reply is valid */ ASSERT(bson_validate(&reply, 0, NULL)); result = mongoc_collection_drop_index(collection, "hello_1", &error); ASSERT_OR_PRINT(result, error); ASSERT(!bson_empty(&reply)); bson_destroy(&reply); /* writeConcern that will result in writeConcernError */ mongoc_write_concern_set_w(bad_wc, 99); ASSERT(!error.code); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); /* skip this part of the test if sharded cluster */ const bool CDRIVER5945_fixed = false; // TODO(CDRIVER-5945): once fixed, unskip this test if (!is_mongos && CDRIVER5945_fixed) { ASSERT(!mongoc_collection_create_indexes_with_opts(collection, &im, 1, opts, &reply, &error)); assert_wc_oob_error(&error); ASSERT(!bson_empty(&reply)); bson_destroy(&reply); } /* Make sure it doesn't crash with a NULL reply or writeConcern */ result = mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error); ASSERT_OR_PRINT(result, error); ASSERT_OR_PRINT(mongoc_collection_drop_index(collection, "hello_1", &error), error); /* Now attempt to create an invalid index which the server will reject */ bson_reinit(&keys); mongoc_index_model_destroy(im); im = mongoc_index_model_new(&keys, NULL); /* Try to create an index like {abc: "hallo thar"} (won't work, should really be something like {abc: 1}) This fails both on legacy and modern versions of the server */ BSON_APPEND_UTF8(&keys, "abc", "hallo thar"); result = mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, &reply, &error); bson_destroy(&reply); ASSERT(!result); ASSERT(strlen(error.message) > 0); memset(&error, 0, sizeof(error)); /* Try again but with reply NULL. Shouldn't crash */ result = mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error); ASSERT(!result); ASSERT(strlen(error.message) > 0); bson_destroy(&keys); mongoc_index_model_destroy(im); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); mongoc_write_concern_destroy(bad_wc); mongoc_write_concern_destroy(good_wc); bson_destroy(opts); } static void test_index_compound(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_error_t error; bson_t keys; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_index_compound"); ASSERT(collection); bson_init(&keys); bson_append_int32(&keys, "hello", -1, 1); bson_append_int32(&keys, "world", -1, -1); mongoc_index_model_t *im = mongoc_index_model_new(&keys, NULL); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop_index(collection, "hello_1_world_-1", &error), error); bson_destroy(&keys); mongoc_index_model_destroy(im); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_index_geo(void *unused) { mongoc_server_description_t const *description; mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_error_t error; bool r; bson_t keys; mongoc_index_model_t *im; uint32_t id; BSON_UNUSED(unused); client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_geo_index"); ASSERT(collection); /* Create a basic 2d index */ bson_init(&keys); BSON_APPEND_UTF8(&keys, "location", "2d"); im = mongoc_index_model_new(&keys, NULL); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop_index(collection, "location_2d", &error), error); /* Create a 2d index with bells and whistles */ bson_destroy(&keys); bson_init(&keys); BSON_APPEND_UTF8(&keys, "location", "2d"); mongoc_index_model_destroy(im); im = mongoc_index_model_new(&keys, tmp_bson(BSON_STR({"min" : -123.0, "max" : 123.0, "bits" : 30}))); /* TODO this hack is needed for single-threaded tests */ id = mc_tpld_servers_const(mc_tpld_unsafe_get_const(client->topology))->items[0].id; description = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), id, &error); ASSERT_OR_PRINT(description, error); if (description->max_wire_version > 0) { ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop_index(collection, "location_2d", &error), error); } /* Create a Haystack index */ bson_destroy(&keys); bson_init(&keys); BSON_APPEND_UTF8(&keys, "location", "geoHaystack"); BSON_APPEND_INT32(&keys, "category", 1); mongoc_index_model_destroy(im); im = mongoc_index_model_new(&keys, tmp_bson(BSON_STR({"bucketSize" : 5}))); description = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), id, &error); ASSERT_OR_PRINT(description, error); if (description->max_wire_version > 0) { ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); r = mongoc_collection_drop_index(collection, "location_geoHaystack_category_1", &error); ASSERT_OR_PRINT(r, error); } mongoc_index_model_destroy(im); bson_destroy(&keys); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static char * storage_engine(mongoc_client_t *client) { bson_iter_t iter; bson_error_t error; bson_t cmd = BSON_INITIALIZER; bson_t reply; ASSERT(client); /* NOTE: this default will change eventually */ char *engine = bson_strdup("mmapv1"); BSON_APPEND_INT32(&cmd, "getCmdLineOpts", 1); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", &cmd, NULL, &reply, &error), error); if (bson_iter_init_find(&iter, &reply, "parsed.storage.engine")) { engine = bson_strdup(bson_iter_utf8(&iter, NULL)); } bson_destroy(&reply); bson_destroy(&cmd); return engine; } static void test_index_storage(void) { mongoc_collection_t *collection = NULL; mongoc_database_t *database = NULL; mongoc_client_t *client = NULL; bson_error_t error; bson_t keys; mongoc_index_model_t *im = NULL; char *engine = NULL; client = test_framework_new_default_client(); ASSERT(client); /* Skip unless we are on WT */ engine = storage_engine(client); if (strcmp("wiredTiger", engine) != 0) { goto cleanup; } database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_storage_index"); ASSERT(collection); /* Create a simple index */ bson_init(&keys); bson_append_int32(&keys, "hello", -1, 1); im = mongoc_index_model_new( &keys, tmp_bson(BSON_STR({"storageEngine" : {"wiredTiger" : {"configString" : "block_compressor=zlib"}}}))); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, NULL, &error), error); cleanup: mongoc_index_model_destroy(im); if (engine) bson_free(engine); if (collection) mongoc_collection_destroy(collection); if (database) mongoc_database_destroy(database); if (client) mongoc_client_destroy(client); } int skip_unless_server_has_decimal128(void) { if (!TestSuite_CheckLive()) { return 0; } if (test_framework_get_server_version() >= test_framework_str_to_version("3.3.5")) { return 1; } return 0; } int mongod_supports_majority_read_concern(void) { if (!TestSuite_CheckLive()) { return 0; } return test_framework_getenv_bool("MONGOC_ENABLE_MAJORITY_READ_CONCERN"); } static void test_count_documents(void) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; bson_t reply; const char *server_reply = "{'cursor': {'firstBatch': [{'n': 123}], '_id': " "0, 'ns': 'db.coll'}, 'ok': 1}"; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_count_documents( collection, tmp_bson("{'x': 1}"), tmp_bson("{'limit': 2, 'skip': 1}"), NULL, &reply, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'aggregate': 'coll', 'pipeline': [{'$match': " "{'x': 1}}, {'$skip': 1}, {'$limit': 2}, {'$group': " "{'n': {'$sum': 1}}}]}")); reply_to_request_simple(request, server_reply); ASSERT_OR_PRINT(123 == future_get_int64_t(future), error); ASSERT_MATCH(&reply, server_reply); bson_destroy(&reply); request_destroy(request); future_destroy(future); future = future_collection_count_documents( collection, tmp_bson("{}"), tmp_bson("{'limit': 2, 'skip': 1}"), NULL, &reply, &error); /* even with an empty filter, we still prepend $match */ request = mock_server_receives_msg(server, 0, tmp_bson("{'aggregate': 'coll', 'pipeline': [{'$match': {}}, {'$skip': " "1}, {'$limit': 2}, {'$group': " "{'n': {'$sum': 1}}}]}")); reply_to_request_simple(request, server_reply); ASSERT_OR_PRINT(123 == future_get_int64_t(future), error); ASSERT_MATCH(&reply, server_reply); bson_destroy(&reply); request_destroy(request); future_destroy(future); // Test appending maxTimeMS. future = future_collection_count_documents( collection, tmp_bson("{}"), tmp_bson("{'maxTimeMS': 123}"), NULL, &reply, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'aggregate': 'coll', 'pipeline': [{'$match': {}}, {'$group': " "{'n': {'$sum': 1}}}], 'maxTimeMS': 123}")); reply_to_request_simple(request, server_reply); ASSERT_OR_PRINT(123 == future_get_int64_t(future), error); ASSERT_MATCH(&reply, server_reply); bson_destroy(&reply); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_count_documents_live(void) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; int64_t count; client = test_framework_new_default_client(); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test"); ASSERT(collection); count = mongoc_collection_count_documents(collection, tmp_bson("{}"), NULL, NULL, NULL, &error); ASSERT_OR_PRINT(count != -1, error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_estimated_document_count(void) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; bson_t reply; const char *server_reply = "{'n': 123, 'ok': 1}"; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_estimated_document_count(collection, tmp_bson("{'limit': 2, 'skip': 1}"), NULL, &reply, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'count': 'coll', 'limit': 2, 'skip': 1}")); reply_to_request_simple(request, server_reply); ASSERT_OR_PRINT(123 == future_get_int64_t(future), error); ASSERT_MATCH(&reply, server_reply); future_destroy(future); /* CDRIVER-3612: ensure that an explicit session triggers a client error */ future = future_collection_estimated_document_count(collection, tmp_bson("{'sessionId': 123}"), NULL, &reply, &error); ASSERT(-1 == future_get_int64_t(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Collection count must not specify explicit session"); bson_destroy(&reply); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_estimated_document_count_live(void) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; int64_t count; client = test_framework_new_default_client(); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test"); ASSERT(collection); count = mongoc_collection_estimated_document_count(collection, NULL, NULL, NULL, &error); ASSERT(count != -1); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_drop(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; mongoc_write_concern_t *good_wc; mongoc_write_concern_t *bad_wc; bool r; bson_error_t error; bson_t *doc; bson_t *opts = NULL; opts = bson_new(); client = test_framework_new_default_client(); ASSERT(client); mongoc_client_set_error_api(client, 2); bad_wc = mongoc_write_concern_new(); good_wc = mongoc_write_concern_new(); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_drop"); ASSERT(collection); doc = BCON_NEW("hello", "world"); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, doc, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); /* invalid writeConcern */ bad_wc->wtimeout = -10; ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, doc, NULL, NULL, &error), error); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_collection_drop_with_opts(collection, opts, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); ASSERT_OR_PRINT(mongoc_collection_drop_with_opts(collection, opts, &error), error); ASSERT(!error.code); ASSERT(!error.domain); /* writeConcern that results in writeConcernError */ mongoc_write_concern_set_w(bad_wc, 99); if (!test_framework_is_mongos()) { /* skip if sharded */ ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, doc, NULL, NULL, &error), error); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); r = mongoc_collection_drop_with_opts(collection, opts, &error); ASSERT(!r); assert_wc_oob_error(&error); } bson_destroy(doc); bson_destroy(opts); mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_aggregate_bypass(void *context) { mongoc_collection_t *data_collection; mongoc_collection_t *out_collection; mongoc_bulk_operation_t *bulk; mongoc_database_t *database; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; bson_t *pipeline; bson_t *options; char *collname; char *dbname; bson_t reply; bool r; int i; char *json; BSON_UNUSED(context); client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("dbtest"); collname = gen_collection_name("data"); database = mongoc_client_get_database(client, dbname); data_collection = mongoc_database_get_collection(database, collname); bson_free(collname); collname = gen_collection_name("bypass"); options = tmp_bson("{'validator': {'number': {'$gte': 5}}, 'validationAction': 'error'}"); out_collection = mongoc_database_create_collection(database, collname, options, &error); ASSERT_OR_PRINT(out_collection, error); bson_free(dbname); bson_free(collname); /* Generate some example data */ bulk = mongoc_collection_create_bulk_operation_with_opts(data_collection, NULL); for (i = 0; i < 3; i++) { bson_t *document; json = bson_strdup_printf("{'number': 3, 'high': %d }", i); document = tmp_bson(json); mongoc_bulk_operation_insert(bulk, document); bson_free(json); } r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_destroy(bulk); json = bson_strdup_printf("[{'$out': '%s'}]", out_collection->collection); pipeline = tmp_bson(json); cursor = mongoc_collection_aggregate(data_collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); ASSERT(cursor); r = mongoc_cursor_next(cursor, &doc); ASSERT(!r); ASSERT(mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); options = tmp_bson("{'bypassDocumentValidation': true}"); cursor = mongoc_collection_aggregate(data_collection, MONGOC_QUERY_NONE, pipeline, options, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_error(cursor, &error)); ASSERT_OR_PRINT(mongoc_collection_drop(data_collection, &error), error); ASSERT_OR_PRINT(mongoc_collection_drop(out_collection, &error), error); bson_destroy(&reply); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(data_collection); mongoc_collection_destroy(out_collection); mongoc_database_destroy(database); mongoc_client_destroy(client); bson_free(json); } static void test_aggregate(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bool did_alternate = false; bool r; bson_t opts; bson_t *pipeline; bson_t *broken_pipeline; bson_t *b; bson_iter_t iter; int i, j; client = test_framework_new_default_client(); ASSERT(client); database = get_test_database(client); ASSERT(database); collection = get_test_collection(client, "test_aggregate"); ASSERT(collection); pipeline = BCON_NEW("pipeline", "[", "{", "$match", "{", "hello", BCON_UTF8("world"), "}", "}", "]"); broken_pipeline = BCON_NEW("pipeline", "[", "{", "$asdf", "{", "foo", BCON_UTF8("bar"), "}", "}", "]"); b = BCON_NEW("hello", BCON_UTF8("world")); /* empty collection */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); /* empty collection */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); ASSERT(cursor); r = mongoc_cursor_next(cursor, &doc); ASSERT(!r); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); for (i = 0; i < 2; i++) { ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, b, NULL, NULL, &error), error); } again: cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, broken_pipeline, NULL, NULL); ASSERT(cursor); r = mongoc_cursor_next(cursor, &doc); ASSERT(!r); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT(error.code); mongoc_cursor_destroy(cursor); for (i = 0; i < 2; i++) { if (i % 2 == 0) { cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); ASSERT(cursor); } else { bson_init(&opts); BSON_APPEND_BOOL(&opts, "allowDiskUse", true); BSON_APPEND_INT32(&opts, "batchSize", 10); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, &opts, NULL); ASSERT(cursor); bson_destroy(&opts); } for (j = 0; j < 2; j++) { r = mongoc_cursor_next(cursor, &doc); if (mongoc_cursor_error(cursor, &error)) { test_error("[%" PRIu32 ".%" PRIu32 "] %s", error.domain, error.code, error.message); } ASSERT(r); ASSERT(doc); ASSERT(bson_iter_init_find(&iter, doc, "hello") && BSON_ITER_HOLDS_UTF8(&iter)); } r = mongoc_cursor_next(cursor, &doc); if (mongoc_cursor_error(cursor, &error)) { test_error("%s", error.message); } ASSERT(!r); ASSERT(!doc); mongoc_cursor_destroy(cursor); } if (!did_alternate) { did_alternate = true; bson_destroy(pipeline); pipeline = BCON_NEW("0", "{", "$match", "{", "hello", BCON_UTF8("world"), "}", "}"); goto again; } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); bson_destroy(b); bson_destroy(pipeline); bson_destroy(broken_pipeline); } static void test_aggregate_large(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_iter_t iter; int32_t i; uint32_t server_id; mongoc_cursor_t *cursor; bson_t *inserted_doc; bson_error_t error; bson_t *pipeline; const bson_t *doc; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_aggregate_large"); ASSERT(collection); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* ensure a few batches */ inserted_doc = tmp_bson("{'_id': 0}"); for (i = 0; i < 2000; i++) { bson_iter_init_find(&iter, inserted_doc, "_id"); bson_iter_overwrite_int32(&iter, i); mongoc_bulk_operation_insert(bulk, inserted_doc); } server_id = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(server_id > 0, error); pipeline = tmp_bson("[{'$sort': {'_id': 1}}]"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); ASSERT(cursor); i = 0; while (mongoc_cursor_next(cursor, &doc)) { ASSERT(bson_iter_init_find(&iter, doc, "_id")); ASSERT_CMPINT(i, ==, bson_iter_int32(&iter)); i++; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(i, ==, 2000); mongoc_bulk_operation_destroy(bulk); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef struct { bool with_batch_size; bool with_options; } test_aggregate_context_t; static const char * options_json(test_aggregate_context_t *c) { if (c->with_batch_size && c->with_options) { return "{'foo': 1, 'batchSize': 11}"; } else if (c->with_batch_size) { return "{'batchSize': 11}"; } else if (c->with_options) { return "{'foo': 1}"; } else { return "{}"; } } static void test_aggregate_modern(void *data) { test_aggregate_context_t *context = (test_aggregate_context_t *)data; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; future_t *future; request_t *request; mongoc_cursor_t *cursor; const bson_t *doc; if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_aggregate( collection, MONGOC_QUERY_NONE, tmp_bson("[{'a': 1}]"), tmp_bson(options_json(context)), NULL); ASSERT(cursor); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'a': 1}]," " 'cursor': %s %s}", context->with_batch_size ? "{'batchSize': 11}" : "{'$empty': true}", context->with_options ? ", 'foo': 1" : "")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 42," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 123}]" "}}"); ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 123}"); request_destroy(request); future_destroy(future); /* create a second batch to see if batch size is still 11 */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '42'}," "'collection': 'collection'," "'batchSize': %s}", context->with_batch_size ? "{'$numberLong': '11'}" : "{'$exists': false}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'nextBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 123}"); /* cursor is completed */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); mongoc_cursor_destroy(cursor); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_aggregate_w_server_id(void) { mock_rs_t *rs; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true /* has primary */, 1 /* secondary */, 0 /* arbiters */); mock_rs_run(rs); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* use serverId instead of prefs to select the secondary */ opts = tmp_bson("{'serverId': 2}"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'cursor': {}," " 'serverId': {'$exists': false}}")); ASSERT(mock_rs_request_is_to_secondary(rs, request)); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), cursor->error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_rs_destroy(rs); } static void test_aggregate_w_server_id_sharded(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_t *opts; const bson_t *doc; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); opts = tmp_bson("{'serverId': 1}"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson(NULL), opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'serverId': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); ASSERT_OR_PRINT(future_get_bool(future), cursor->error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_aggregate_server_id_option(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t *q; bson_error_t error; mongoc_cursor_t *cursor; const bson_t *doc; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "db", "collection"); q = tmp_bson(NULL); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, q, tmp_bson("{'serverId': 'foo'}"), NULL); ASSERT_ERROR_CONTAINS(cursor->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must be an integer"); mongoc_cursor_destroy(cursor); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, q, tmp_bson("{'serverId': 0}"), NULL); ASSERT_ERROR_CONTAINS(cursor->error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must be >= 1"); mongoc_cursor_destroy(cursor); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, q, tmp_bson("{'serverId': 1}"), NULL); mongoc_cursor_next(cursor, &doc); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_rename(void) { mongoc_client_t *client; mongoc_database_t *database; mongoc_collection_t *collection; mongoc_write_concern_t *bad_wc; mongoc_write_concern_t *good_wc; bool r; bson_error_t error; char *dbname; bson_t doc = BSON_INITIALIZER; bson_t *opts = NULL; char **name; char **names; bool found; client = test_framework_new_default_client(); ASSERT(client); mongoc_client_set_error_api(client, 2); opts = bson_new(); bad_wc = mongoc_write_concern_new(); good_wc = mongoc_write_concern_new(); dbname = gen_collection_name("dbtest"); database = mongoc_client_get_database(client, dbname); collection = mongoc_database_get_collection(database, "test_rename"); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &doc, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_rename(collection, dbname, "test_rename.2", false, &error), error); names = mongoc_database_get_collection_names_with_opts(database, NULL, &error); ASSERT_OR_PRINT(names, error); found = false; for (name = names; *name; ++name) { if (!strcmp(*name, "test_rename.2")) { found = true; } bson_free(*name); } ASSERT(found); ASSERT_CMPSTR(mongoc_collection_get_name(collection), "test_rename.2"); /* invalid writeConcern */ bad_wc->wtimeout = -10; bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_collection_rename_with_opts(collection, dbname, "test_rename.3", false, opts, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); ASSERT_CMPSTR(mongoc_collection_get_name(collection), "test_rename.2"); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern on all configs */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); r = mongoc_collection_rename_with_opts(collection, dbname, "test_rename.3", false, opts, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPSTR(mongoc_collection_get_name(collection), "test_rename.3"); ASSERT(!error.code); ASSERT(!error.domain); /* writeConcern that results in writeConcernError */ mongoc_write_concern_set_w(bad_wc, 99); if (!test_framework_is_mongos()) { bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); r = mongoc_collection_rename_with_opts(collection, dbname, "test_rename.4", false, opts, &error); ASSERT(!r); /* check that collection name has not changed */ ASSERT_CMPSTR(mongoc_collection_get_name(collection), "test_rename.3"); assert_wc_oob_error(&error); } ASSERT_OR_PRINT(mongoc_database_drop(database, &error), error); bson_free(names); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); mongoc_client_destroy(client); bson_free(dbname); bson_destroy(&doc); bson_destroy(opts); } static void test_find_and_modify_write_concern(void) { mongoc_collection_t *collection; mongoc_client_t *client; mock_server_t *server; request_t *request; future_t *future; bson_error_t error; bson_t *update; bson_t doc = BSON_INITIALIZER; bson_t reply; mongoc_write_concern_t *write_concern; server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test_find_and_modify"); mock_server_auto_hello(server, "{'isWritablePrimary': true, " " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'maxBsonObjectSize': %d," " 'maxMessageSizeBytes': %d," " 'maxWriteBatchSize': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, 16777216, 48000000, 1000); BSON_APPEND_INT32(&doc, "superduper", 77889); update = BCON_NEW("$set", "{", "superduper", BCON_INT32(1234), "}"); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, 42); mongoc_collection_set_write_concern(collection, write_concern); future = future_collection_find_and_modify(collection, &doc, NULL, update, NULL, false, false, true, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'findAndModify': 'test_find_and_modify'," " 'query': {'superduper': 77889}," " 'update': {'$set': {'superduper': 1234}}," " 'new' : true," " 'writeConcern': {'w': 42}}")); reply_to_request_simple(request, "{ 'value' : null, 'ok' : 1 }"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); bson_destroy(&reply); bson_destroy(update); request_destroy(request); mongoc_write_concern_destroy(write_concern); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); bson_destroy(&doc); } static void test_find_and_modify(void) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_iter_t iter; bson_iter_t citer; bson_t *update; bson_t doc = BSON_INITIALIZER; bson_t reply; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_find_and_modify"); ASSERT(collection); BSON_APPEND_INT32(&doc, "superduper", 77889); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &doc, NULL, NULL, &error), error); update = BCON_NEW("$set", "{", "superduper", BCON_INT32(1234), "}"); ASSERT_OR_PRINT( mongoc_collection_find_and_modify(collection, &doc, NULL, update, NULL, false, false, true, &reply, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "value")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); BSON_ASSERT(bson_iter_recurse(&iter, &citer)); BSON_ASSERT(bson_iter_find(&citer, "superduper")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&citer)); BSON_ASSERT(bson_iter_int32(&citer) == 1234); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "lastErrorObject")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); BSON_ASSERT(bson_iter_recurse(&iter, &citer)); BSON_ASSERT(bson_iter_find(&citer, "updatedExisting")); BSON_ASSERT(BSON_ITER_HOLDS_BOOL(&citer)); BSON_ASSERT(bson_iter_bool(&citer)); bson_destroy(&reply); bson_destroy(update); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&doc); } static void test_large_return(void *ctx) { mongoc_collection_t *collection; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc = NULL; bson_oid_t oid; bson_t insert_doc = BSON_INITIALIZER; bson_t query = BSON_INITIALIZER; size_t len; char *str; bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_large_return"); ASSERT(collection); len = 1024 * 1024 * 4; str = (char *)bson_malloc(len); memset(str, (int)' ', len); str[len - 1] = '\0'; bson_oid_init(&oid, NULL); BSON_APPEND_OID(&insert_doc, "_id", &oid); BSON_APPEND_UTF8(&insert_doc, "big", str); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &insert_doc, NULL, NULL, &error), error); bson_destroy(&insert_doc); BSON_APPEND_OID(&query, "_id", &oid); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); BSON_ASSERT(cursor); bson_destroy(&query); ASSERT_CURSOR_NEXT(cursor, &doc); BSON_ASSERT(doc); r = mongoc_cursor_next(cursor, &doc); BSON_ASSERT(!r); mongoc_cursor_destroy(cursor); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_free(str); } static void test_many_return(void) { enum { N_BSONS = 5000 }; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc = NULL; bson_oid_t oid; bson_t query = BSON_INITIALIZER; bson_t *docs[N_BSONS]; bool r; int i; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_many_return"); ASSERT(collection); for (i = 0; i < N_BSONS; i++) { docs[i] = bson_new(); bson_oid_init(&oid, NULL); BSON_APPEND_OID(docs[i], "_id", &oid); } ASSERT_OR_PRINT( mongoc_collection_insert_many(collection, (const bson_t **)docs, (uint32_t)N_BSONS, NULL, NULL, &error), error); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); BSON_ASSERT(cursor); BSON_ASSERT(mongoc_cursor_more(cursor)); bson_destroy(&query); i = 0; while (mongoc_cursor_next(cursor, &doc)) { BSON_ASSERT(doc); i++; BSON_ASSERT(mongoc_cursor_more(cursor)); } BSON_ASSERT(i == N_BSONS); BSON_ASSERT(!mongoc_cursor_error(cursor, &error)); r = mongoc_cursor_next(cursor, &doc); BSON_ASSERT(!r); BSON_ASSERT(!mongoc_cursor_more(cursor)); /* mongoc_cursor_next after done is considered an error */ BSON_ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance a completed or failed cursor"); mongoc_cursor_destroy(cursor); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); destroy_all(docs, N_BSONS); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static bool insert_one(mongoc_collection_t *collection, const bson_t *doc, const bson_t *opts, bson_error_t *error) { return mongoc_collection_insert_one(collection, doc, opts, NULL, error); } static bool insert_many(mongoc_collection_t *collection, const bson_t *doc, const bson_t *opts, bson_error_t *error) { return mongoc_collection_insert_many(collection, &doc, 1, opts, NULL, error); } typedef bool (*insert_fn_t)(mongoc_collection_t *, const bson_t *, const bson_t *, bson_error_t *); static void _test_insert_validate(insert_fn_t insert_fn) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_insert_validate"); BSON_ASSERT(!insert_fn(collection, tmp_bson("{'': 1}"), NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "empty string"); BSON_ASSERT(!insert_fn(collection, tmp_bson("{'_id': {'$a': 1}}"), tmp_bson("{'validate': false}"), &error)); ASSERT_CMPUINT32(error.domain, ==, (uint32_t)MONGOC_ERROR_SERVER); BSON_ASSERT(!insert_fn(collection, tmp_bson("{'$': 1}"), tmp_bson("{'validate': 'foo'}"), &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid type for option \"validate\": \"UTF8\""); BSON_ASSERT(insert_fn(collection, tmp_bson("{'a': 1}"), tmp_bson("{'validate': 0}"), &error)); /* BSON_VALIDATE_DOT_KEYS */ BSON_ASSERT(!insert_fn(collection, tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': 4}"), &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "invalid document for insert: Disallowed '.' in element key: \"a.a\""); /* {validate: true} is still prohibited */ BSON_ASSERT(!insert_fn(collection, tmp_bson("{'a': 1}"), tmp_bson("{'validate': true}"), &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid option \"validate\": true"); BSON_ASSERT(insert_fn(collection, tmp_bson("{'a.a': 1}"), tmp_bson("{'validate': 0}"), &error)); BSON_ASSERT(insert_fn(collection, tmp_bson("{'a': 1}"), tmp_bson("{'validate': 31}"), &error)); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_one_validate(void) { _test_insert_validate(insert_one); } static void test_insert_many_validate(void) { _test_insert_validate(insert_many); } /* use a mock server to test the "limit" parameter */ static void test_find_limit(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); /* test mongoc_collection_find_with_opts */ cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'limit': {'$numberLong': '2'}}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'limit': {'$numberLong': '2'}}")); reply_to_request_simple(request, "{'ok': 1, 'cursor': {'id': 0, 'ns': 'test.test', 'firstBatch': [{}]}}"); BSON_ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } /* use a mock server to test the "batch_size" parameter */ static void test_find_batch_size(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); /* test mongoc_collection_find_with_opts */ cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{}"), tmp_bson("{'batchSize': {'$numberLong': '2'}}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'batchSize': {'$numberLong': '2'}}")); reply_to_request_simple(request, "{'ok': 1, 'cursor': {'id': 0, 'ns': 'test.test', 'firstBatch': [{}]}}"); BSON_ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_get_index_info(void) { mongoc_collection_t *collection; mongoc_client_t *client; mongoc_index_model_t *im1; mongoc_index_model_t *im2; bson_error_t error = {0}; mongoc_cursor_t *cursor; const bson_t *indexinfo; bson_t indexkey1; bson_t indexkey2; bson_t indexkey3; bson_t indexkey4; bson_t indexkey5; bson_t dummy = BSON_INITIALIZER; bson_iter_t idx_spec_iter; bson_iter_t idx_spec_iter_copy; bool r; const char *cur_idx_name; char *idx1_name = NULL; char *idx2_name = NULL; char *idx3_name = NULL; char *idx4_name = NULL; char *idx5_name = NULL; const char *id_idx_name = "_id_"; int num_idxs = 0; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_get_index_info"); ASSERT(collection); /* * Try it on a collection that doesn't exist. */ cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); ASSERT(!mongoc_cursor_next(cursor, &indexinfo)); ASSERT(!mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); /* insert a dummy document so that the collection actually exists */ r = mongoc_collection_insert_one(collection, &dummy, NULL, NULL, &error); ASSERT(r); /* Try it on a collection with no secondary indexes. * We should just get back the index on _id. */ cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); ASSERT(!mongoc_cursor_error(cursor, &error)); while (mongoc_cursor_next(cursor, &indexinfo)) { if (bson_iter_init(&idx_spec_iter, indexinfo) && bson_iter_find(&idx_spec_iter, "name") && BSON_ITER_HOLDS_UTF8(&idx_spec_iter) && (cur_idx_name = bson_iter_utf8(&idx_spec_iter, NULL))) { BSON_ASSERT(0 == strcmp(cur_idx_name, id_idx_name)); ++num_idxs; } else { BSON_ASSERT(false); } } BSON_ASSERT(1 == num_idxs); mongoc_cursor_destroy(cursor); num_idxs = 0; indexinfo = NULL; bson_init(&indexkey1); BSON_APPEND_INT32(&indexkey1, "raspberry", 1); idx1_name = mongoc_collection_keys_to_index_string(&indexkey1); ASSERT(strcmp(idx1_name, "raspberry_1") == 0); im1 = mongoc_index_model_new(&indexkey1, tmp_bson("{'background': true}")); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im1, 1, NULL, NULL, &error), error); mongoc_index_model_destroy(im1); bson_destroy(&indexkey1); bson_init(&indexkey2); BSON_APPEND_INT32(&indexkey2, "snozzberry", 1); idx2_name = mongoc_collection_keys_to_index_string(&indexkey2); ASSERT(strcmp(idx2_name, "snozzberry_1") == 0); im2 = mongoc_index_model_new(&indexkey2, tmp_bson("{'unique': true}")); ASSERT_OR_PRINT(mongoc_collection_create_indexes_with_opts(collection, &im2, 1, NULL, NULL, &error), error); mongoc_index_model_destroy(im2); bson_destroy(&indexkey2); /* * Now we try again after creating two indexes. */ cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); ASSERT(!mongoc_cursor_error(cursor, &error)); while (mongoc_cursor_next(cursor, &indexinfo)) { if (bson_iter_init(&idx_spec_iter, indexinfo) && bson_iter_find(&idx_spec_iter, "name") && BSON_ITER_HOLDS_UTF8(&idx_spec_iter) && (cur_idx_name = bson_iter_utf8(&idx_spec_iter, NULL))) { if (0 == strcmp(cur_idx_name, idx1_name)) { /* need to use the copy of the iter since idx_spec_iter may have * gone * past the key we want */ ASSERT(bson_iter_init_find(&idx_spec_iter_copy, indexinfo, "background")); ASSERT(BSON_ITER_HOLDS_BOOL(&idx_spec_iter_copy)); ASSERT(bson_iter_bool(&idx_spec_iter_copy)); } else if (0 == strcmp(cur_idx_name, idx2_name)) { ASSERT(bson_iter_init_find(&idx_spec_iter_copy, indexinfo, "unique")); ASSERT(BSON_ITER_HOLDS_BOOL(&idx_spec_iter_copy)); ASSERT(bson_iter_bool(&idx_spec_iter_copy)); } else { ASSERT((0 == strcmp(cur_idx_name, id_idx_name))); } ++num_idxs; } else { BSON_ASSERT(false); } } BSON_ASSERT(3 == num_idxs); mongoc_cursor_destroy(cursor); /* * Test that index strings are formed correctly when using an INT64 * for direction. */ bson_init(&indexkey3); BSON_APPEND_INT64(&indexkey3, "blackberry", 1); idx3_name = mongoc_collection_keys_to_index_string(&indexkey3); ASSERT((0 == strcmp(idx3_name, "blackberry_1"))); bson_destroy(&indexkey3); bson_init(&indexkey4); BSON_APPEND_INT64(&indexkey4, "blueberry", -1); idx4_name = mongoc_collection_keys_to_index_string(&indexkey4); ASSERT((0 == strcmp(idx4_name, "blueberry_-1"))); bson_destroy(&indexkey4); /* * Test that index string is NULL when an incorrect BSON type is * used for direction. */ bson_init(&indexkey5); BSON_APPEND_DOUBLE(&indexkey5, "strawberry", 1.0f); idx5_name = mongoc_collection_keys_to_index_string(&indexkey5); ASSERT((idx5_name == NULL)); bson_destroy(&indexkey5); bson_free(idx1_name); bson_free(idx2_name); bson_free(idx3_name); bson_free(idx4_name); bson_free(idx5_name); bson_destroy(&dummy); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_find_indexes_err(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; future_t *future; request_t *request; mongoc_cursor_t *cursor; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_error_api(client, 2); collection = mongoc_client_get_collection(client, "db", "collection"); future = future_collection_find_indexes_with_opts(collection, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'listIndexes': 'collection'}")); reply_to_request_simple(request, "{'ok': 0, 'code': 1234567, 'errmsg': 'foo'}"); cursor = future_get_mongoc_cursor_ptr(future); BSON_ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 1234567, "foo"); mongoc_cursor_destroy(cursor); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_aggregate_install(TestSuite *suite) { static test_aggregate_context_t test_aggregate_contexts[2][2]; int with_batch_size, with_options; char *name; test_aggregate_context_t *context; for (with_batch_size = 0; with_batch_size < 2; with_batch_size++) { for (with_options = 0; with_options < 2; with_options++) { context = &test_aggregate_contexts[with_batch_size][with_options]; context->with_batch_size = (bool)with_batch_size; context->with_options = (bool)with_options; name = bson_strdup_printf("/Collection/aggregate/%s/%s", context->with_batch_size ? "batch_size" : "no_batch_size", context->with_options ? "with_options" : "no_options"); TestSuite_AddWC(suite, name, test_aggregate_modern, NULL, (void *)context); bson_free(name); } } } static void test_find_read_concern(void) { mock_server_t *server; mongoc_client_t *client; mongoc_read_concern_t *rc; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); /* No read_concern set */ cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test', 'filter': {}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); /* readConcernLevel = local */ rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_collection_set_read_concern(collection, rc); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'readConcern': {'level': 'local'}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); /* readConcernLevel = random */ rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, "random"); mongoc_collection_set_read_concern(collection, rc); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'readConcern': {'level': 'random'}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); /* empty readConcernLevel doesn't send anything */ rc = mongoc_read_concern_new(); mongoc_collection_set_read_concern(collection, rc); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'readConcern': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); /* readConcernLevel = NULL doesn't send anything */ rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, NULL); mongoc_collection_set_read_concern(collection, rc); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'readConcern': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{'_id': 123}]}}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_getmore_read_concern_live(void *ctx) { mongoc_client_t *client; mongoc_read_concern_t *rc; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *insert_doc; mongoc_cursor_t *cursor; mongoc_write_concern_t *wc; const bson_t *doc; bson_error_t error; int i = 0; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_read_concern"); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_collection_set_read_concern(collection, rc); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_collection_set_write_concern(collection, wc); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); insert_doc = tmp_bson("{'a': 1}"); for (i = 5000; i > 0; i--) { mongoc_bulk_operation_insert_with_opts(bulk, insert_doc, NULL, NULL); } ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); mongoc_bulk_operation_destroy(bulk); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); while (mongoc_cursor_next(cursor, &doc)) { i++; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(i, ==, 5000); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_aggregate_secondary(void *ctx) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_prefs_t *pref; bson_error_t error; mongoc_cursor_t *cursor; const bson_t *doc; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "aggregate_secondary"); pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[]"), NULL, pref); ASSERT(cursor); mongoc_cursor_next(cursor, &doc); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); if (test_framework_is_replset()) { ASSERT(test_framework_server_is_secondary(client, mongoc_cursor_get_server_id(cursor))); } mongoc_read_prefs_destroy(pref); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_aggregate_secondary_sharded(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_prefs_t *pref; bson_error_t error; mongoc_cursor_t *cursor; future_t *future; request_t *request; const bson_t *doc; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[]"), NULL, pref); ASSERT(cursor); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': []," " '$readPreference': {'mode': 'secondary'}}")); reply_to_request_simple(request, "{ 'ok':1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': []}}"); ASSERT(!future_get_bool(future)); /* cursor_next returns false */ ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(pref); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_aggregate_read_concern(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_concern_t *rc; future_t *future; request_t *request; mongoc_cursor_t *cursor; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* No readConcern */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[{'a': 1}]"), NULL, NULL); ASSERT(cursor); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'a': 1}]," " 'cursor': {}," " 'readConcern': {'$exists': false}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 123}]" "}}"); ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 123}"); /* cursor is completed */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); mongoc_cursor_destroy(cursor); request_destroy(request); future_destroy(future); /* readConcern: majority */ rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_collection_set_read_concern(collection, rc); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[{'a': 1}]"), NULL, NULL); ASSERT(cursor); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'a': 1}]," " 'cursor': {}," " 'readConcern': {'level': 'majority'}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 123}]" "}}"); ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 123}"); /* cursor is completed */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); mongoc_cursor_destroy(cursor); request_destroy(request); future_destroy(future); mongoc_read_concern_destroy(rc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_aggregate_with_collation(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; future_t *future; request_t *request; mongoc_cursor_t *cursor; const bson_t *doc; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_aggregate( collection, MONGOC_QUERY_NONE, tmp_bson("[{'a': 1}]"), tmp_bson("{'collation': {'locale': 'en'}}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'aggregate': 'collection'," " 'pipeline': [{'a': 1}]," " 'collation': {'locale': 'en'}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 123}]" "}}"); ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 123}"); /* cursor is completed */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); request_destroy(request); mongoc_cursor_destroy(cursor); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_index_with_collation(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; request_t *request; bson_error_t error; bson_t keys; bson_t reply; future_t *future; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); bson_init(&keys); bson_append_int32(&keys, "hello", -1, 1); mongoc_index_model_t *im = mongoc_index_model_new(&keys, tmp_bson(BSON_STR({"collation" : {"locale" : "en", "strength" : 2}}))); future = future_collection_create_indexes_with_opts(collection, &im, 1, NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'createIndexes': 'collection'," " 'indexes': [{" " 'key': {'hello' : 1}," " 'name': 'hello_1'," " 'collation': {'locale': 'en', 'strength': 2}}]}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); mongoc_index_model_destroy(im); bson_destroy(&reply); bson_destroy(&keys); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_insert_duplicate_key(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_insert_duplicate_key"); mongoc_collection_insert_one(collection, tmp_bson("{'_id': 1}"), NULL, NULL, NULL); ASSERT(!mongoc_collection_insert_one(collection, tmp_bson("{'_id': 1}"), NULL, NULL, &error)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COLLECTION); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_DUPLICATE_KEY); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_create_index_fail(void *context) { mongoc_client_t *client; mongoc_collection_t *collection; bool r; bson_t reply; bson_error_t error; mongoc_index_model_t *im; BSON_UNUSED(context); client = test_framework_client_new("mongodb://example.doesntexist/?connectTimeoutMS=10", NULL); collection = mongoc_client_get_collection(client, "test", "test"); im = mongoc_index_model_new(tmp_bson("{'a': 1}"), NULL); r = mongoc_collection_create_indexes_with_opts(collection, &im, 1, NULL, &reply, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers"); /* reply was initialized */ ASSERT(bson_empty(&reply)); mongoc_index_model_destroy(im); bson_destroy(&reply); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } /* Tests that documents in `coll` found with `selector` all match `match` */ static void _test_docs_in_coll_matches(mongoc_collection_t *coll, bson_t *selector, const char *match, uint32_t expected_count) { const bson_t *next_doc; mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, selector, NULL, NULL); while (expected_count > 0) { ASSERT(mongoc_cursor_next(cursor, &next_doc)); if (match) { ASSERT_MATCH(next_doc, match); } --expected_count; } ASSERT_CMPINT(expected_count, ==, 0); mongoc_cursor_destroy(cursor); } static void _test_no_docs_match(mongoc_collection_t *coll, const char *selector) { bson_error_t error; int64_t ret; ret = mongoc_collection_count_documents(coll, tmp_bson(selector), NULL, NULL, NULL, &error); ASSERT_OR_PRINT(ret != -1, error); ASSERT_CMPINT64(ret, ==, (int64_t)0); } typedef struct { const char *command_under_test; int commands_tested; const char *expected_command; } test_crud_ctx_t; /* Tests that commands match the `expected_command` in the update ctx */ void _test_crud_command_start(const mongoc_apm_command_started_t *event) { const bson_t *cmd = mongoc_apm_command_started_get_command(event); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); test_crud_ctx_t *ctx = (test_crud_ctx_t *)mongoc_apm_command_started_get_context(event); if (!strcmp(cmd_name, ctx->command_under_test)) { ctx->commands_tested++; ASSERT_MATCH(cmd, ctx->expected_command); assert_no_duplicate_keys(cmd); } } static void test_insert_one(void) { bson_error_t err = {0}; bson_t reply; bson_t opts_with_wc = BSON_INITIALIZER; bool ret; mongoc_client_t *client = test_framework_new_default_client(); mongoc_database_t *db = get_test_database(client); mongoc_collection_t *coll = mongoc_database_get_collection(db, "coll"); mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_t *wc2 = mongoc_write_concern_new(); test_crud_ctx_t ctx; mongoc_apm_callbacks_t *callbacks = mongoc_apm_callbacks_new(); ctx.command_under_test = "insert"; ctx.commands_tested = 0; /* Give wc and wc2 different j values so we can distinguish them but make * sure they have w:1 so the writes are committed when we check results */ mongoc_write_concern_set_w(wc, 1); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_set_w(wc2, 1); mongoc_write_concern_set_journal(wc2, true); mongoc_collection_set_write_concern(coll, wc); mongoc_apm_set_command_started_cb(callbacks, _test_crud_command_start); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_collection_drop(coll, NULL); /* Test a simple insert with bypassDocumentValidation */ ctx.expected_command = "{'insert': 'coll', 'bypassDocumentValidation': " "true, 'writeConcern': {'w': 1, 'j': false}}"; ret = mongoc_collection_insert_one( coll, tmp_bson("{'_id': 1}"), tmp_bson("{'bypassDocumentValidation': true}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'insertedCount': 1}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id': 1}"), NULL, 1); /* Test maxTimeMS */ ctx.expected_command = "{'insert': 'coll', 'maxTimeMS': 9999, " " 'writeConcern': {'w': 1, 'j': false}}"; ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2}"), tmp_bson("{'maxTimeMS': 9999}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'insertedCount': 1}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id': 2}"), NULL, 1); /* Test passing write concern through the options */ mongoc_write_concern_append(wc2, &opts_with_wc); ctx.expected_command = "{'insert': 'coll', 'writeConcern': {'w': 1, 'j': true}}"; ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 3}"), &opts_with_wc, &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'insertedCount': 1}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':3}"), NULL, 1); /* Test passing NULL for opts, reply, and error */ ctx.expected_command = "{'insert': 'coll', 'writeConcern': {'w': 1, 'j': false}}"; ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 4}"), NULL, NULL, NULL); ASSERT(ret); _test_docs_in_coll_matches(coll, tmp_bson("{'_id': 4}"), NULL, 1); /* Duplicate key error */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 4}"), NULL, &reply, &err); ASSERT(!ret); ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_COLLECTION); ASSERT_MATCH(&reply, "{'insertedCount': 0," " 'writeErrors': [" " {'index': 0, 'code': 11000, 'errmsg': {'$exists': true}}" "]}"); bson_destroy(&reply); ASSERT_CMPINT(ctx.commands_tested, ==, 5); if (test_framework_is_replset()) { /* Write concern error */ ctx.expected_command = "{'insert': 'coll'," " 'writeConcern': {'w': 99, 'wtimeout': 100}}"; ret = mongoc_collection_insert_one( coll, tmp_bson("{}"), tmp_bson("{'writeConcern': {'w': 99, 'wtimeout': 100}}"), &reply, &err); ASSERT(!ret); if (test_framework_get_server_version() >= test_framework_str_to_version("4.3.3")) { /* Error reporting changed in SERVER-45584 */ ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_QUERY); ASSERT_MATCH(&reply, "{'insertedCount': 0," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': false}" "}"); } else { ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_WRITE_CONCERN); ASSERT_MATCH(&reply, "{'insertedCount': 1," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': true}" "}"); } bson_destroy(&reply); } bson_destroy(&opts_with_wc); mongoc_apm_callbacks_destroy(callbacks); mongoc_write_concern_destroy(wc); mongoc_write_concern_destroy(wc2); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_client_destroy(client); } typedef bool (*update_fn_t)( mongoc_collection_t *, const bson_t *, const bson_t *, const bson_t *, bson_t *, bson_error_t *); /* Tests `update_one`, `update_many`, and `replace_one` */ static void _test_update_and_replace(bool is_replace, bool is_multi) { update_fn_t fn = NULL; bson_t *update = NULL; bson_error_t err = {0}; bson_t reply; bson_t opts_with_wc = BSON_INITIALIZER; bson_t opts_with_wc2 = BSON_INITIALIZER; bool ret = false; mongoc_client_t *client = test_framework_new_default_client(); mongoc_database_t *db = get_test_database(client); mongoc_collection_t *coll = mongoc_database_get_collection(db, "coll"); mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_t *wc2 = mongoc_write_concern_new(); test_crud_ctx_t ctx; mongoc_apm_callbacks_t *callbacks = mongoc_apm_callbacks_new(); ctx.command_under_test = "update"; ctx.commands_tested = 0; /* Give wc and wc2 different j values so we can distinguish them but make * sure they have w:1 so the writes are committed when we check results */ mongoc_write_concern_set_w(wc, 1); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_append(wc, &opts_with_wc); mongoc_collection_set_write_concern(coll, wc); mongoc_write_concern_set_w(wc2, 1); mongoc_write_concern_set_journal(wc2, true); mongoc_write_concern_append(wc2, &opts_with_wc2); mongoc_apm_set_command_started_cb(callbacks, _test_crud_command_start); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_collection_drop(coll, NULL); /* Test `replace_one`, `update_one` or `update_many` based on args */ if (is_replace) { ASSERT(!is_multi); fn = mongoc_collection_replace_one; } else { fn = is_multi ? mongoc_collection_update_many : mongoc_collection_update_one; } /* Test a simple update with bypassDocumentValidation */ ctx.expected_command = "{'update': 'coll', 'bypassDocumentValidation': " "true, 'writeConcern': {'w': 1, 'j': false}}"; ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), &opts_with_wc, NULL, &err); ASSERT_OR_PRINT(ret, err); update = is_replace ? tmp_bson("{'a': 1}") : tmp_bson("{'$set': {'a': 1}}"); ret = fn(coll, tmp_bson("{}"), update, tmp_bson("{'bypassDocumentValidation': true}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':1}"), "{'a': 1}", 1); /* Test passing an upsert */ ctx.expected_command = "{'update': 'coll', 'writeConcern': {'w': 1, 'j': false}}"; update = is_replace ? tmp_bson("{'b': 'TEST'}") : tmp_bson("{'$set': {'b': 'TEST'}}"); ret = fn(coll, tmp_bson("{'_id': 2}"), update, tmp_bson("{'upsert': true}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 0, 'matchedCount': 0, " "'upsertedId': {'$exists': true}}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':2}"), "{'b': 'TEST'}", 1); /* Test collation */ update = is_replace ? tmp_bson("{'b': 'test'}") : tmp_bson("{'$set': {'b': 'test'}}"); ret = fn(coll, tmp_bson("{'b': 'TEST'}"), update, tmp_bson("{'collation': {'locale': 'en', 'strength': 2}}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':2}"), "{'b': 'test'}", 1); /* Test passing write concern through the options */ ctx.expected_command = "{'update': 'coll', 'writeConcern': {'w': 1, 'j': true}}"; update = is_replace ? tmp_bson("{'b': 0}") : tmp_bson("{'$set': {'b': 0}}"); ret = fn(coll, tmp_bson("{'_id': 2}"), update, &opts_with_wc2, &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); bson_destroy(&reply); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':2}"), "{'b': 0}", 1); /* Test passing NULL for opts, reply, and error */ ctx.expected_command = "{'update': 'coll', 'writeConcern': {'w': 1, 'j': false}}"; update = is_replace ? tmp_bson("{'b': 1}") : tmp_bson("{'$set': {'b': 1}}"); ret = fn(coll, tmp_bson("{'_id': 2}"), update, NULL, NULL, NULL); ASSERT(ret); _test_docs_in_coll_matches(coll, tmp_bson("{'_id' :2}"), "{'b': 1}", 1); /* Test multiple matching documents */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 3, 'a': 1}"), &opts_with_wc, NULL, &err); ASSERT_OR_PRINT(ret, err); ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 4, 'a': 1}"), &opts_with_wc, NULL, &err); ASSERT_OR_PRINT(ret, err); update = is_replace ? tmp_bson("{'a': 2}") : tmp_bson("{'$set': {'a': 2}}"); ret = fn(coll, tmp_bson("{'_id': {'$in': [3,4]}}"), update, NULL, &reply, &err); ASSERT_OR_PRINT(ret, err); if (is_multi) { ASSERT_MATCH(&reply, "{'modifiedCount': 2, 'matchedCount': 2, " "'upsertedId': {'$exists': false}}"); _test_docs_in_coll_matches(coll, tmp_bson("{'_id': {'$in': [3,4]}}"), "{'a': 2}", 2); } else { ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); /* omit testing collection since not sure which was updated */ } bson_destroy(&reply); ctx.expected_command = "{'update': 'coll'}"; ret = fn(coll, tmp_bson("{'$badOp': 1}"), update, NULL, &reply, &err); ASSERT(!ret); ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_COLLECTION); ASSERT_MATCH(&reply, "{'modifiedCount': 0," " 'matchedCount': 0," " 'writeErrors': [" " {'index': 0, 'code': 2, 'errmsg': {'$exists': true}}" "]}"); bson_destroy(&reply); if (test_framework_is_replset()) { ret = fn(coll, tmp_bson("{'_id': 3}"), is_replace ? tmp_bson("{'a': 3}") : tmp_bson("{'$set': {'a': 3}}"), tmp_bson("{'writeConcern': {'w': 99, 'wtimeout': 100}}"), &reply, &err); ASSERT(!ret); if (test_framework_get_server_version() >= test_framework_str_to_version("4.3.3")) { /* Error reporting changed in SERVER-45584 */ ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_QUERY); ASSERT_MATCH(&reply, "{'modifiedCount': 0," " 'matchedCount': 0," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': false}" "}"); } else { ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_WRITE_CONCERN); ASSERT_MATCH(&reply, "{'modifiedCount': 1," " 'matchedCount': 1," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': true}" "}"); } bson_destroy(&reply); } /* Test function specific behavior */ if (is_replace) { /* Test that replace really does replace */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 5, 'a': 1, 'b': 2}"), &opts_with_wc, NULL, &err); ASSERT_OR_PRINT(ret, err); ret = fn(coll, tmp_bson("{'_id': 5}"), tmp_bson("{'a': 2}"), NULL, &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); _test_docs_in_coll_matches(coll, tmp_bson("{'_id': 5}"), "{'a': 2, 'b': {'$exists': false}}", 1); bson_destroy(&reply); /* Test that a non-replace update fails. */ ret = fn(coll, tmp_bson("{}"), tmp_bson("{'$set': {'a': 1}}"), NULL, NULL, &err); ASSERT(!ret); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key '$set': replace prohibits $ operators"); } else { /* Test update_one and update_many with arrayFilters */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 6, 'a': [{'x':1},{'x':2}]}"), &opts_with_wc, NULL, &err); ASSERT_OR_PRINT(ret, err); update = tmp_bson("{'$set': {'a.$[i].x': 3}}"); ret = fn(coll, tmp_bson("{'_id': 6}"), update, tmp_bson("{'arrayFilters': [{'i.x': {'$gt': 1}}]}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'modifiedCount': 1, 'matchedCount': 1, " "'upsertedId': {'$exists': false}}"); _test_docs_in_coll_matches(coll, tmp_bson("{'_id':6}"), "{'a': [{'x':1},{'x':3}]}", 1); bson_destroy(&reply); /* Test update that fails */ ctx.expected_command = "{'update': 'coll'}"; ret = fn(coll, tmp_bson("{}"), tmp_bson("{'a': 1}"), NULL, &reply, &err); ASSERT(!ret); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid key"); ASSERT(bson_empty(&reply)); bson_destroy(&reply); } ASSERT_CMPINT(ctx.commands_tested, >, 0); mongoc_apm_callbacks_destroy(callbacks); bson_destroy(&opts_with_wc); bson_destroy(&opts_with_wc2); mongoc_write_concern_destroy(wc); mongoc_write_concern_destroy(wc2); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void test_update_and_replace(void) { _test_update_and_replace(false /* is_replace */, false /* is_multi */); _test_update_and_replace(true /* is_replace */, false /* is_multi */); _test_update_and_replace(false /* is_replace */, true /* is_multi */); /* Note, there is no multi replace */ } static void test_array_filters_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bool r; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_array_filters_validation"); r = mongoc_collection_update_one( collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), tmp_bson("{'arrayFilters': 1}"), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid field \"arrayFilters\" in opts, should contain array," " not INT32"); r = mongoc_collection_update_one( collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), tmp_bson("{'arrayFilters': {}}"), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid field \"arrayFilters\" in opts, should contain array," " not DOCUMENT"); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_update_validate(update_fn_t update_fn) { mongoc_client_t *client; mongoc_collection_t *collection; bson_t *selector; bson_t *invalid_update, *valid_update; const char *msg; bson_error_t error; bool r; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_update_validate"); selector = tmp_bson("{}"); if (update_fn == mongoc_collection_replace_one) { /* prohibited for replace */ invalid_update = tmp_bson("{'$set': {'x': 1}}"); /* permitted for replace */ valid_update = tmp_bson("{'x': 1}"); msg = "Invalid key '$set': replace prohibits $ operators"; } else { /* prohibited for update */ invalid_update = tmp_bson("{'x': 1}"); /* permitted for update */ valid_update = tmp_bson("{'$set': {'x': 1}}"); msg = "Invalid key 'x': update only works with $ operators and pipelines"; } BSON_ASSERT(!update_fn(collection, selector, invalid_update, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, msg); r = update_fn(collection, selector, invalid_update, tmp_bson("{'validate': false}"), NULL, &error); /* server may or may not error */ if (!r) { ASSERT_CMPUINT32(error.domain, ==, (uint32_t)MONGOC_ERROR_SERVER); } BSON_ASSERT(!update_fn(collection, selector, invalid_update, tmp_bson("{'validate': 'foo'}"), NULL, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid type for option \"validate\": \"UTF8\""); /* Set all validation flags */ BSON_ASSERT(!update_fn(collection, selector, invalid_update, tmp_bson("{'validate': 31}"), NULL, &error)); /* bson_validate_with_error will yield a different error message than the * standard key check in _mongoc_validate_replace */ if (update_fn == mongoc_collection_replace_one) { msg = "invalid argument for replace: Disallowed '$' in element key: \"$set\""; } ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, msg); /* Check that validation passes for a valid update. */ ASSERT_OR_PRINT( update_fn(collection, selector, valid_update, tmp_bson("{'validate': %d}", BSON_VALIDATE_UTF8), NULL, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_replace_one_validate(void) { _test_update_validate(mongoc_collection_replace_one); } static void test_update_one_validate(void) { _test_update_validate(mongoc_collection_update_one); } static void test_update_many_validate(void) { _test_update_validate(mongoc_collection_update_many); } typedef bool (*delete_fn_t)(mongoc_collection_t *, const bson_t *, const bson_t *, bson_t *, bson_error_t *); static void _test_delete_one_or_many(bool is_multi) { delete_fn_t fn = is_multi ? mongoc_collection_delete_many : mongoc_collection_delete_one; bson_error_t err = {0}; bson_t reply; bson_t opts_with_wc = BSON_INITIALIZER; bool ret; mongoc_client_t *client = test_framework_new_default_client(); mongoc_database_t *db = get_test_database(client); mongoc_collection_t *coll = mongoc_database_get_collection(db, "coll"); mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_t *wc2 = mongoc_write_concern_new(); test_crud_ctx_t ctx; mongoc_apm_callbacks_t *callbacks = mongoc_apm_callbacks_new(); int i; ctx.command_under_test = "delete"; ctx.commands_tested = 0; /* Give wc and wc2 different j values so we can distinguish them but make * sure they have w:1 so the writes are committed when we check results */ mongoc_write_concern_set_w(wc, 1); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_set_w(wc2, 1); mongoc_write_concern_set_journal(wc2, true); mongoc_collection_set_write_concern(coll, wc); mongoc_apm_set_command_started_cb(callbacks, _test_crud_command_start); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_collection_drop(coll, NULL); for (i = 0; i < 3; i++) { ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': %d}", i), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); } /* Test maxTimeMS */ ctx.expected_command = "{'delete': 'coll', 'maxTimeMS': 9999, " " 'writeConcern': {'w': 1, 'j': false}}"; ret = fn(coll, tmp_bson("{'_id': 1}"), tmp_bson("{'maxTimeMS': 9999}"), &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'deletedCount': 1}"); bson_destroy(&reply); _test_no_docs_match(coll, "{'_id': 1}"); /* Test passing write concern through the options */ mongoc_write_concern_append(wc2, &opts_with_wc); ctx.expected_command = "{'delete': 'coll', 'writeConcern': {'w': 1, 'j': true}}"; ret = fn(coll, tmp_bson("{'_id': 2}"), &opts_with_wc, &reply, &err); ASSERT_OR_PRINT(ret, err); ASSERT_MATCH(&reply, "{'deletedCount': 1}"); bson_destroy(&reply); _test_no_docs_match(coll, "{'_id': 2}"); /* Test passing NULL for opts, reply, and error */ ctx.expected_command = "{'delete': 'coll', 'writeConcern': {'w': 1, 'j': false}}"; ret = fn(coll, tmp_bson("{'_id': 3}"), NULL, NULL, NULL); ASSERT(ret); _test_no_docs_match(coll, "{'_id': 3}"); /* Server error */ ret = fn(coll, tmp_bson("{'_id': {'$foo': 1}}"), NULL, &reply, &err); ASSERT(!ret); ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_COLLECTION); ASSERT_MATCH(&reply, "{'deletedCount': 0," " 'writeErrors': [" " {'index': 0," " 'code': {'$exists': true}," " 'errmsg': {'$exists': true}}" "]}"); bson_destroy(&reply); ASSERT_CMPINT(ctx.commands_tested, ==, 4); if (test_framework_is_replset()) { /* Write concern error */ ctx.expected_command = "{'delete': 'coll'," " 'writeConcern': {'w': 99, 'wtimeout': 100}}"; ret = fn(coll, tmp_bson("{}"), tmp_bson("{'writeConcern': {'w': 99, 'wtimeout': 100}}"), &reply, &err); ASSERT(!ret); if (test_framework_get_server_version() >= test_framework_str_to_version("4.3.3")) { /* Error reporting changed in SERVER-45584 */ ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_QUERY); ASSERT_MATCH(&reply, "{'deletedCount': 0," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': false}" "}"); } else { ASSERT_CMPUINT32(err.domain, ==, (uint32_t)MONGOC_ERROR_WRITE_CONCERN); ASSERT_MATCH(&reply, "{'deletedCount': 1," " 'writeErrors': {'$exists': false}," " 'writeConcernErrors': {'$exists': true}" "}"); } bson_destroy(&reply); ASSERT_CMPINT(ctx.commands_tested, ==, 5); } /* Test deleting with collation. */ ctx.expected_command = "{'delete': 'coll'}"; ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1, 'x': 11}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 2, 'x': 'ping'}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); ret = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 3, 'x': 'pINg'}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); ret = fn(coll, tmp_bson("{'x': 'PING'}"), tmp_bson("{'collation': {'locale': 'en_US', 'strength': 2 }}"), &reply, &err); ASSERT_OR_PRINT(ret, err); if (is_multi) { ASSERT_MATCH(&reply, "{'deletedCount': 2}"); } else { ASSERT_MATCH(&reply, "{'deletedCount': 1}"); } bson_destroy(&reply); _test_no_docs_match(coll, "{'_id': 2}"); bson_destroy(&opts_with_wc); mongoc_apm_callbacks_destroy(callbacks); mongoc_write_concern_destroy(wc); mongoc_write_concern_destroy(wc2); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_client_destroy(client); } typedef future_t *(*future_delete_fn_t)( mongoc_collection_t *, const bson_t *, const bson_t *, bson_t *, bson_error_t *); static void _test_delete_collation(bool is_multi) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; future_delete_fn_t fn = is_multi ? future_collection_delete_many : future_collection_delete_one; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); future = fn(collection, tmp_bson("{}"), tmp_bson("{'collation': {'locale': 'en'}}"), NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'delete': 'collection'}"), tmp_bson("{'q': {}, 'limit': %d, 'collation': {'locale': 'en'}}", is_multi ? 0 : 1)); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_delete_one_or_many(void) { _test_delete_one_or_many(true); _test_delete_one_or_many(false); } static void test_delete_collation(void) { _test_delete_collation(true); _test_delete_collation(false); } typedef future_t *(*future_update_fn_t)( mongoc_collection_t *, const bson_t *, const bson_t *, const bson_t *, bson_t *, bson_error_t *); static void _test_update_or_replace_with_collation(bool is_replace, bool is_multi) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; future_update_fn_t fn; if (is_replace) { BSON_ASSERT(!is_multi); fn = future_collection_replace_one; } else { fn = is_multi ? future_collection_update_many : future_collection_update_one; } server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); future = fn(collection, tmp_bson("{}"), tmp_bson("{}"), tmp_bson("{'collation': {'locale': 'en'}}"), NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'update': 'collection'}"), tmp_bson("{'q': {}, 'u': {}, 'collation': {'locale': 'en'}%s}", is_multi ? ", 'multi': true" : "")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_update_collation(void) { _test_update_or_replace_with_collation(false, false); _test_update_or_replace_with_collation(false, true); _test_update_or_replace_with_collation(true, false); } static void _test_update_hint(bool is_replace, bool is_multi, const char *hint) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; future_update_fn_t fn; if (is_replace) { BSON_ASSERT(!is_multi); fn = future_collection_replace_one; } else { fn = is_multi ? future_collection_update_many : future_collection_update_one; } server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); future = fn(collection, tmp_bson("{}"), tmp_bson("{}"), tmp_bson("{'hint': %s}", hint), NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'update': 'collection'}"), tmp_bson("{'q': {}, 'u': {}, 'hint': %s %s }", hint, is_multi ? ", 'multi': true" : "")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_update_hint(void) { _test_update_hint(false, false, "'_id_'"); _test_update_hint(false, true, "'_id_'"); _test_update_hint(true, false, "'_id_'"); _test_update_hint(false, false, "{'_id': 1}"); _test_update_hint(false, true, "{'_id': 1}"); _test_update_hint(true, false, "{'_id': 1}"); } static void test_update_hint_validate(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bool r; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_update_hint_validation"); r = mongoc_collection_update_one( collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), tmp_bson("{'hint': 1}"), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); r = mongoc_collection_update_many( collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), tmp_bson("{'hint': 3.14}"), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); r = mongoc_collection_replace_one( collection, tmp_bson("{}"), tmp_bson("{'x': 1}"), tmp_bson("{'hint': []}"), NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_multi(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; unsigned i; bson_t *bptr[10]; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_multi"); (void)mongoc_collection_drop(collection, &error); for (i = 0; i < 10; i++) { bptr[i] = tmp_bson("{'_id': %d, 'x': 1234}", i); } ASSERT_OR_PRINT(mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_update(collection, MONGOC_UPDATE_MULTI_UPDATE, tmp_bson("{'_id': {'$gte': 5}}"), tmp_bson("{'$inc': {'x': 1}}"), NULL, &error), error); _test_docs_in_coll_matches(collection, tmp_bson("{'_id': {'$lt': 5}, 'x': 1234}"), NULL, 5); _test_docs_in_coll_matches(collection, tmp_bson("{'_id': {'$gte': 5}, 'x': 1235}"), NULL, 5); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_update_upsert(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_update_upsert"); (void)mongoc_collection_drop(collection, &error); ASSERT_OR_PRINT( mongoc_collection_update( collection, MONGOC_UPDATE_UPSERT, tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'x': 1234}}"), NULL, &error), error); _test_docs_in_coll_matches(collection, tmp_bson("{'_id': 1, 'x': 1234}"), NULL, 1); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_remove_multi(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; unsigned i; bson_t *bptr[10]; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_remove_multi"); (void)mongoc_collection_drop(collection, &error); for (i = 0; i < 10; i++) { bptr[i] = tmp_bson("{'_id': %d, 'x': 1234}", i); } ASSERT_OR_PRINT(mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, NULL, NULL, &error), error); ASSERT_OR_PRINT( mongoc_collection_remove(collection, MONGOC_REMOVE_NONE, tmp_bson("{'_id': {'$gte': 8}}"), NULL, &error), error); ASSERT_OR_PRINT( mongoc_collection_remove(collection, MONGOC_REMOVE_NONE, tmp_bson("{'_id': {'$lt': 2}}"), NULL, &error), error); _test_docs_in_coll_matches(collection, tmp_bson("{'x': 1234}"), NULL, 6); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_fam_no_error_on_retry(void *unused) { mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error = {0}; bool ret; bson_t reply; mongoc_find_and_modify_opts_t *opts; BSON_UNUSED(unused); client = test_framework_new_default_client(); ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}, " "'data': {'failCommands': ['findAndModify'], 'errorLabels': " "['RetryableWriteError']}}"), NULL, &reply, &error); if (!ret) { test_error("configureFailPoint error: %s reply: %s", error.message, tmp_json(&reply)); } coll = get_test_collection(client, BSON_FUNC); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, tmp_bson("{'$set': {'x': 2}}")); bson_destroy(&reply); ret = mongoc_collection_find_and_modify_with_opts(coll, tmp_bson("{'x': 1}"), opts, &reply, &error); if (!ret) { test_error("findAndModify error: %s reply: %s", error.message, tmp_json(&reply)); } if (error.code != 0 || error.domain != 0 || 0 != strcmp(error.message, "")) { test_error("error set, but findAndModify succeeded: code=%" PRIu32 " domain=%" PRIu32 " message=%s", error.code, error.domain, error.message); } bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_find_and_modify_opts_destroy(opts); } static void test_hint_is_validated_aggregate(void) { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); mongoc_collection_t *collection = get_test_collection(client, "test_hint_is_validated_aggregate"); mongoc_cursor_t *cursor = mongoc_collection_aggregate( collection, MONGOC_QUERY_NONE, tmp_bson("{}"), tmp_bson("{'hint': 1}"), NULL /* read prefs */); bool has_error = mongoc_cursor_error(cursor, &error); ASSERT(has_error); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_hint_is_validated_countDocuments(void) { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); mongoc_collection_t *collection = get_test_collection(client, "test_hint_is_validated_countDocuments"); int64_t got = mongoc_collection_count_documents( collection, tmp_bson("{}"), tmp_bson("{'hint': 1}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_CMPINT64(got, ==, -1); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "The hint option must be a string or document"); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } #define ASSERT_INDEX_EXISTS(keys, expect_name) \ if (1) { \ bool found = false; \ mongoc_cursor_t *cursor = mongoc_collection_find_indexes_with_opts(coll, NULL /* opts */); \ const bson_t *got; \ while (mongoc_cursor_next(cursor, &got)) { \ bson_t got_key; \ const char *got_name = NULL; \ /* Results have the form: `{ v: 2, key: { x: 1 }, name: 'x_1' }` */ \ bsonParse(*got, \ require(keyWithType("key", doc), storeDocRef(got_key)), \ require(keyWithType("name", utf8), storeStrRef(got_name))); \ ASSERT_WITH_MSG(!bsonParseError, "got parse error: %s", bsonParseError); \ if (bson_equal(&got_key, keys)) { \ found = true; \ ASSERT_CMPSTR(got_name, expect_name); \ } \ } \ ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); \ ASSERT_WITH_MSG(found, "could not find expected index for keys: '%s'", tmp_json(keys)); \ mongoc_cursor_destroy(cursor); \ } else \ (void)0 static void test_create_indexes_with_opts(void) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts"); bson_error_t error; // Test creating an index. { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); mongoc_index_model_destroy(im); ASSERT_INDEX_EXISTS(keys, "x_1"); } // Drop collection to remove previously created index. ASSERT_OR_PRINT(mongoc_collection_drop(coll, &error), error); // Test creating an index uses specified `name`. { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, tmp_bson("{'name': 'foobar'}")); bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); mongoc_index_model_destroy(im); ASSERT_INDEX_EXISTS(keys, "foobar"); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_create_indexes_with_opts_no_retry(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts"); bson_error_t error; // Configure failpoint to cause a network error. { const char *cmd_str = BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["createIndexes"], "closeConnection" : true} }); bson_t *failpoint_cmd = bson_new_from_json((const uint8_t *)cmd_str, -1, &error); ASSERT_OR_PRINT(failpoint_cmd, error); bool ok = mongoc_client_command_simple(client, "admin", failpoint_cmd, NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(failpoint_cmd); } // Test creating an index does not retry on network error. { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to send"); mongoc_index_model_destroy(im); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Test creating an index with the 'commitQuorum' option results in a driver // error on Server Version <4.4. static void test_create_indexes_with_opts_commitQuorum_pre44(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts"); bson_error_t error; // Create index. { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts( coll, &im, 1, tmp_bson("{'commitQuorum': 'majority'}"), NULL /* reply */, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support the commitQuorum option"); mongoc_index_model_destroy(im); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Test creating an index with the 'commitQuorum' option succeeds on Server // Version >=4.4. static void test_create_indexes_with_opts_commitQuorum_post44(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts"); bson_error_t error; // Create index. { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts( coll, &im, 1, tmp_bson("{'commitQuorum': 'majority'}"), NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); mongoc_index_model_destroy(im); ASSERT_INDEX_EXISTS(keys, "x_1"); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_insert_one_reports_id(void) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_insert_reports_id"); bson_error_t error; bool ok; // Test inserting one document reports the inserted ID. { bson_t *doc = tmp_bson("{'_id': 'foo'}"); bson_t reply; ok = mongoc_collection_insert_one(coll, doc, NULL /* opts */, &reply, &error); ASSERT_OR_PRINT(ok, error); // Check that `reply` contains the inserted ID ASSERT_MATCH(&reply, "{'insertedId': 'foo'}"); bson_destroy(&reply); } // Test inserting one document reports the generated inserted ID. { bson_t *doc = tmp_bson("{'foo': 'bar'}"); bson_t reply; ok = mongoc_collection_insert_one(coll, doc, NULL /* opts */, &reply, &error); ASSERT_OR_PRINT(ok, error); // Check that `reply` contains the inserted ID // Since the driver creates a random ID, only assert it exists. ASSERT_MATCH(&reply, "{'insertedId': {'$exists': true}}"); bson_destroy(&reply); } // Test inserting one document with a duplicate ID doesn't report the ID. { bson_t *doc1 = tmp_bson("{'_id': 'baz'}"); bson_t reply1; ok = mongoc_collection_insert_one(coll, doc1, NULL /* opts */, &reply1, &error); ASSERT_OR_PRINT(ok, error); // Check that `reply` contains the inserted ID // Since the driver creates a random ID, only assert it exists. ASSERT_MATCH(&reply1, "{'insertedId': 'baz'}"); // Insert the duplicate document. bson_t *doc2 = tmp_bson("{'_id': 'baz'}"); bson_t reply2; ok = mongoc_collection_insert_one(coll, doc2, NULL /* opts */, &reply2, &error); ASSERT_OR_PRINT(!ok, error); ASSERT_MATCH(&reply2, "{'insertedId': {'$exists': false}}"); bson_destroy(&reply1); bson_destroy(&reply2); } // Test inserting one document with a large ID { // Create a large string of repeating 'A' characters. char *large_str = bson_malloc(128); memset(large_str, 'A', 128); large_str[127] = '\0'; // NULL terminate string. bson_t *doc = tmp_bson("{'_id': '%s'}", large_str); bson_t reply; ok = mongoc_collection_insert_one(coll, doc, NULL /* opts */, &reply, &error); ASSERT_OR_PRINT(ok, error); // Check that `reply` contains the inserted ID. ASSERT_MATCH(&reply, "{'insertedId': '%s'}", large_str); bson_destroy(&reply); bson_free(large_str); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } #undef ASSERT_INDEX_EXISTS static void test_create_indexes_acts_as_write_command(void *unused) { BSON_UNUSED(unused); mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "test_create_indexes_with_opts"); bson_error_t error; bson_t reply; // Test write concern is inherited from collection: { // Set a non-default write concern on collection: { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, -1); // Set a write concern that fails. mongoc_collection_set_write_concern(coll, wc); mongoc_write_concern_destroy(wc); } // Create index: { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* options */, NULL /* reply */, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, 5, 9, "w has to be a non-negative number and not greater than 50"); mongoc_index_model_destroy(im); } } // Test a server reply with "writeConcernError" is considered an error: { // Set the default write concern on collection: { mongoc_write_concern_t *wc = mongoc_write_concern_new(); // Default write concern. mongoc_collection_set_write_concern(coll, wc); mongoc_write_concern_destroy(wc); } // Set a failpoint to fail with "writeConcernError": { const char *cmd_str = BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["createIndexes"], "writeConcernError" : {"code" : 123, "errmsg" : "foo"}} }); bson_t *failpoint_cmd = bson_new_from_json((const uint8_t *)cmd_str, -1, &error); ASSERT_OR_PRINT(failpoint_cmd, error); bool ok = mongoc_client_command_simple(client, "admin", failpoint_cmd, NULL /* read_prefs */, &reply, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(failpoint_cmd); bson_destroy(&reply); } { const bson_t *keys = tmp_bson("{'x': 1}"); mongoc_index_model_t *im = mongoc_index_model_new(keys, NULL); bool ok = mongoc_collection_create_indexes_with_opts(coll, &im, 1, NULL /* opts */, NULL /* reply */, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, 123, "foo"); mongoc_index_model_destroy(im); } } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_collection_install(TestSuite *suite) { test_aggregate_install(suite); TestSuite_AddFull(suite, "/Collection/aggregate/write_concern [lock:live-server]", test_aggregate_w_write_concern, NULL, NULL, TestSuite_CheckLive); TestSuite_AddFull(suite, "/Collection/read_prefs_is_valid [lock:live-server]", test_read_prefs_is_valid, NULL, NULL, test_framework_skip_if_mongos); TestSuite_AddLive(suite, "/Collection/insert_many", test_insert_many); TestSuite_AddLive(suite, "/Collection/copy", test_copy); TestSuite_AddLive(suite, "/Collection/insert", test_insert); TestSuite_AddLive(suite, "/Collection/insert/null_string", test_insert_null); TestSuite_AddFull(suite, "/Collection/insert/oversize [lock:live-server][timeout:30]", test_insert_oversize, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddMockServerTest(suite, "/Collection/insert/keys", test_insert_command_keys); TestSuite_AddLive(suite, "/Collection/insert/w0", test_insert_w0); TestSuite_AddLive(suite, "/Collection/update/w0", test_update_w0); TestSuite_AddLive(suite, "/Collection/remove/w0", test_remove_w0); TestSuite_AddLive(suite, "/Collection/insert_twice/w0", test_insert_twice_w0); TestSuite_AddLive(suite, "/Collection/index", test_index); TestSuite_AddLive(suite, "/Collection/index_w_write_concern", test_index_w_write_concern); TestSuite_AddMockServerTest(suite, "/Collection/index/collation", test_index_with_collation); TestSuite_AddLive(suite, "/Collection/index_compound", test_index_compound); TestSuite_AddFull(suite, "/Collection/index_geo [lock:live-server]", test_index_geo, NULL, NULL, test_framework_skip_if_max_wire_version_more_than_9); TestSuite_AddLive(suite, "/Collection/index_storage", test_index_storage); TestSuite_AddLive(suite, "/Collection/regex", test_regex); TestSuite_AddFull(suite, "/Collection/decimal128 [lock:live-server]", test_decimal128, NULL, NULL, skip_unless_server_has_decimal128); TestSuite_AddLive(suite, "/Collection/update", test_update); TestSuite_AddFull( suite, "/Collection/update_pipeline [lock:live-server]", test_update_pipeline, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/Collection/update/multi", test_update_multi); TestSuite_AddLive(suite, "/Collection/update/upsert", test_update_upsert); TestSuite_AddFull(suite, "/Collection/update/oversize [lock:live-server][timeout:30]", test_update_oversize, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/Collection/remove", test_remove); TestSuite_AddLive(suite, "/Collection/remove/multi", test_remove_multi); TestSuite_AddFull(suite, "/Collection/remove/oversize [lock:live-server][timeout:30]", test_remove_oversize, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/Collection/drop", test_drop); TestSuite_AddLive(suite, "/Collection/aggregate", test_aggregate); TestSuite_AddMockServerTest(suite, "/Collection/aggregate/inherit/collection", test_aggregate_inherit_collection); TestSuite_AddLive(suite, "/Collection/aggregate/large", test_aggregate_large); TestSuite_AddFull(suite, "/Collection/aggregate/secondary [lock:live-server]", test_aggregate_secondary, NULL, NULL, test_framework_skip_if_mongos); TestSuite_AddMockServerTest(suite, "/Collection/aggregate/secondary/sharded", test_aggregate_secondary_sharded); TestSuite_AddMockServerTest(suite, "/Collection/aggregate/read_concern", test_aggregate_read_concern); TestSuite_AddFull(suite, "/Collection/aggregate/bypass_document_validation [lock:live-server]", test_aggregate_bypass, NULL, NULL, TestSuite_CheckLive); TestSuite_AddMockServerTest(suite, "/Collection/aggregate/collation", test_aggregate_with_collation); TestSuite_AddMockServerTest(suite, "/Collection/aggregate_w_server_id", test_aggregate_w_server_id); TestSuite_AddMockServerTest(suite, "/Collection/aggregate_w_server_id/sharded", test_aggregate_w_server_id_sharded); TestSuite_AddFull(suite, "/Collection/aggregate_w_server_id/option [lock:live-server]", test_aggregate_server_id_option, NULL, NULL, test_framework_skip_if_auth); TestSuite_AddLive(suite, "/Collection/rename", test_rename); TestSuite_AddMockServerTest(suite, "/Collection/find_read_concern", test_find_read_concern); TestSuite_AddFull(suite, "/Collection/getmore_read_concern_live [lock:live-server]", test_getmore_read_concern_live, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/Collection/find_and_modify", test_find_and_modify); TestSuite_AddMockServerTest(suite, "/Collection/find_and_modify/write_concern", test_find_and_modify_write_concern); TestSuite_AddFull(suite, "/Collection/large_return [lock:live-server]", test_large_return, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/Collection/many_return", test_many_return); TestSuite_AddLive(suite, "/Collection/insert_one_validate", test_insert_one_validate); TestSuite_AddLive(suite, "/Collection/insert_many_validate", test_insert_many_validate); TestSuite_AddMockServerTest(suite, "/Collection/limit", test_find_limit); TestSuite_AddMockServerTest(suite, "/Collection/batch_size", test_find_batch_size); TestSuite_AddLive(suite, "/Collection/get_index_info", test_get_index_info); TestSuite_AddMockServerTest(suite, "/Collection/find_indexes/error", test_find_indexes_err); TestSuite_AddLive(suite, "/Collection/insert/duplicate_key", test_insert_duplicate_key); TestSuite_AddFull(suite, "/Collection/create_index/fail [lock:live-server]", test_create_index_fail, NULL, NULL, test_framework_skip_if_offline); TestSuite_AddLive(suite, "/Collection/insert_one", test_insert_one); TestSuite_AddLive(suite, "/Collection/update_and_replace", test_update_and_replace); TestSuite_AddLive(suite, "/Collection/array_filters_validate", test_array_filters_validate); TestSuite_AddLive(suite, "/Collection/replace_one_validate", test_replace_one_validate); TestSuite_AddLive(suite, "/Collection/update_one_validate", test_update_one_validate); TestSuite_AddLive(suite, "/Collection/update_many_validate", test_update_many_validate); TestSuite_AddLive(suite, "/Collection/delete_one_or_many", test_delete_one_or_many); TestSuite_AddMockServerTest(suite, "/Collection/delete/collation", test_delete_collation); TestSuite_AddMockServerTest(suite, "/Collection/update/collation", test_update_collation); TestSuite_AddMockServerTest(suite, "/Collection/update/hint", test_update_hint); TestSuite_AddLive(suite, "/Collection/update/hint/validate", test_update_hint_validate); TestSuite_AddMockServerTest(suite, "/Collection/count_documents", test_count_documents); TestSuite_AddLive(suite, "/Collection/count_documents_live", test_count_documents_live); TestSuite_AddMockServerTest(suite, "/Collection/estimated_document_count", test_estimated_document_count); TestSuite_AddLive(suite, "/Collection/estimated_document_count_live", test_estimated_document_count_live); TestSuite_AddMockServerTest(suite, "/Collection/aggregate_with_batch_size", test_aggregate_with_batch_size); TestSuite_AddFull(suite, "/Collection/fam/no_error_on_retry [lock:live-server]", test_fam_no_error_on_retry, NULL, NULL, test_framework_skip_if_no_failpoint, test_framework_skip_if_max_wire_version_more_than_9); TestSuite_AddLive(suite, "/Collection/hint_is_validated/aggregate", test_hint_is_validated_aggregate); TestSuite_AddLive(suite, "/Collection/hint_is_validated/countDocuments", test_hint_is_validated_countDocuments); TestSuite_AddLive(suite, "/Collection/create_indexes_with_opts", test_create_indexes_with_opts); TestSuite_AddFull(suite, "/Collection/create_indexes_with_opts/commitQuorum/pre44 [lock:live-server]", test_create_indexes_with_opts_commitQuorum_pre44, NULL /* _dtor */, NULL /* _ctx */, // commitQuorum option is not available on standalone servers. test_framework_skip_if_not_replset, // Server Version 4.4 has Wire Version 9. test_framework_skip_if_max_wire_version_more_than_8); TestSuite_AddFull(suite, "/Collection/create_indexes_with_opts/commitQuorum/post44 [lock:live-server]", test_create_indexes_with_opts_commitQuorum_post44, NULL /* _dtor */, NULL /* _ctx */, // commitQuorum option is not available on standalone servers. test_framework_skip_if_not_replset, // Server Version 4.4 has Wire Version 9. test_framework_skip_if_max_wire_version_less_than_9); TestSuite_AddFull(suite, "/Collection/create_indexes_with_opts/no_retry [lock:live-server]", test_create_indexes_with_opts_no_retry, NULL /* _dtor */, NULL /* _ctx */, // requires failpoint test_framework_skip_if_no_failpoint); TestSuite_AddLive(suite, "/Collection/insert_one_reports_id", test_insert_one_reports_id); TestSuite_AddFull(suite, "/Collection/test_create_indexes_acts_as_write_command [lock:live-server]", test_create_indexes_acts_as_write_command, NULL /* _dtor */, NULL /* _ctx */, // requires failpoint test_framework_skip_if_no_failpoint, // Server Version 4.4 has Wire Version 9 - w < 0 does not error on earlier versions. test_framework_skip_if_max_wire_version_less_than_9); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-command-logging-and-monitoring.c000066400000000000000000000357271511661753600306650ustar00rootroot00000000000000#include #include #include #include #include #include static void stored_log_handler(const mongoc_structured_log_entry_t *entry, void *user_data) { mongoc_array_t *log_array = (mongoc_array_t *)user_data; bson_t *doc = mongoc_structured_log_entry_message_as_bson(entry); MONGOC_DEBUG("stored log: %s", tmp_json(doc)); _mongoc_array_append_val(log_array, doc); } static void stored_log_clear(mongoc_array_t *log_array) { for (size_t i = 0; i < log_array->len; i++) { bson_t *doc = _mongoc_array_index(log_array, bson_t *, i); bson_destroy(doc); } _mongoc_array_clear(log_array); } /* specifications/source/command-logging-and-monitoring/tests/README.md * Test 1: Default truncation limit */ static void prose_test_1(void) { // 1. Configure logging with a minimum severity level of "debug" for the "command" component. Do not explicitly // configure the max document length. mongoc_client_t *client = test_framework_new_default_client(); mongoc_array_t stored_log; _mongoc_array_init(&stored_log, sizeof(bson_t *)); { mongoc_structured_log_opts_t *log_opts = mongoc_structured_log_opts_new(); ASSERT(mongoc_structured_log_opts_set_max_level_for_component( log_opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_opts_set_handler(log_opts, stored_log_handler, &stored_log); ASSERT(mongoc_client_set_structured_log_opts(client, log_opts)); mongoc_structured_log_opts_destroy(log_opts); } mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); // 2. Construct an array docs containing the document {"x" : "y"} repeated 100 times. bson_t *docs[100]; for (unsigned i = 0; i < sizeof docs / sizeof docs[0]; i++) { docs[i] = tmp_bson(BSON_STR({"x" : "y"})); } // 3. Insert docs to a collection via insertMany. bson_error_t error; ASSERT_OR_PRINT( mongoc_collection_insert_many(coll, (const bson_t **)docs, sizeof docs / sizeof docs[0], NULL, NULL, &error), error); // 4. Inspect the resulting "command started" log message and assert that the "command" value is a string of length // 1000 + (length of trailing ellipsis). { ASSERT(stored_log.len >= 1); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 0); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command started"); ASSERT(bson_iter_find(&iter, "command")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t command_len; const char *command = bson_iter_utf8(&iter, &command_len); ASSERT(command); ASSERT_CMPUINT32(command_len, ==, 1003); } // 5. Inspect the resulting "command succeeded" log message and assert that the "reply" value is a string of length // <= 1000 + (length of trailing ellipsis). { ASSERT(stored_log.len == 2); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 1); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command succeeded"); ASSERT(bson_iter_find(&iter, "reply")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t reply_len; const char *reply = bson_iter_utf8(&iter, &reply_len); ASSERT(reply); ASSERT_CMPUINT32(reply_len, <=, 1003); } // 6. Run find() on the collection where the document was inserted. stored_log_clear(&stored_log); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); ASSERT(cursor); { const bson_t *doc; ASSERT(mongoc_cursor_next(cursor, &doc)); } // 7. Inspect the resulting "command succeeded" log message and assert that the reply is a string of length 1000 + // (length of trailing ellipsis). { ASSERT(stored_log.len >= 1); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 0); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command started"); } { ASSERT(stored_log.len == 2); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 1); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command succeeded"); ASSERT(bson_iter_find(&iter, "reply")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t reply_len; const char *reply = bson_iter_utf8(&iter, &reply_len); ASSERT(reply); ASSERT_CMPUINT32(reply_len, ==, 1003); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); stored_log_clear(&stored_log); _mongoc_array_destroy(&stored_log); } /* Test 2: Explicitly configured truncation limit */ static void prose_test_2(void) { // 1. Configure logging with a minimum severity level of "debug" for the "command" component. Set the max document // length to 5. mongoc_client_t *client = test_framework_new_default_client(); mongoc_array_t stored_log; _mongoc_array_init(&stored_log, sizeof(bson_t *)); { mongoc_structured_log_opts_t *log_opts = mongoc_structured_log_opts_new(); ASSERT(mongoc_structured_log_opts_set_max_document_length(log_opts, 5)); ASSERT(mongoc_structured_log_opts_set_max_level_for_component( log_opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_opts_set_handler(log_opts, stored_log_handler, &stored_log); ASSERT(mongoc_client_set_structured_log_opts(client, log_opts)); mongoc_structured_log_opts_destroy(log_opts); } // 2. Run the command {"hello": true}. { bson_error_t error; ASSERT_OR_PRINT( mongoc_client_command_simple(client, "db", tmp_bson(BSON_STR({"hello" : true})), NULL, NULL, &error), error); } // 3. Inspect the resulting "command started" log message and assert that the "command" value is a string of length 5 // + (length of trailing ellipsis). { ASSERT(stored_log.len >= 1); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 0); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command started"); ASSERT(bson_iter_find(&iter, "command")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t command_len; const char *command = bson_iter_utf8(&iter, &command_len); ASSERT(command); ASSERT_CMPUINT32(command_len, ==, 5 + 3); ASSERT_CMPSTR(command, "{ \"he..."); } // 4. Inspect the resulting "command succeeded" log message and assert that the "reply" value is a string of length 5 // + (length of trailing ellipsis). { ASSERT(stored_log.len == 2); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 1); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command succeeded"); ASSERT(bson_iter_find(&iter, "reply")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t reply_len; const char *reply = bson_iter_utf8(&iter, &reply_len); ASSERT(reply); ASSERT_CMPUINT32(reply_len, ==, 5 + 3); } // 5. If the driver attaches raw server responses to failures and can access these via log messages to assert on, run // the command {"notARealCommand": true}. Inspect the resulting "command failed" log message and confirm that the // server error is a string of length 5 + (length of trailing ellipsis). // // This is not applicable to libmongoc. The spec allows flexible data type for "failure", and here we chose a // document rather than a string. The document is not subject to truncation. // // While we're here, test that the proposed fake command itself is truncated as expected, and the "failure" is a // document. stored_log_clear(&stored_log); ASSERT( !mongoc_client_command_simple(client, "db", tmp_bson(BSON_STR({"notARealCommand" : true})), NULL, NULL, NULL)); { ASSERT(stored_log.len >= 1); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 0); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command started"); ASSERT(bson_iter_find(&iter, "command")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t command_len; const char *command = bson_iter_utf8(&iter, &command_len); ASSERT(command); ASSERT_CMPUINT32(command_len, ==, 5 + 3); ASSERT_CMPSTR(command, "{ \"no..."); } { ASSERT(stored_log.len == 2); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 1); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command failed"); ASSERT(bson_iter_find(&iter, "failure")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); } mongoc_client_destroy(client); stored_log_clear(&stored_log); _mongoc_array_destroy(&stored_log); } /* Test 3: Truncation with multi-byte code points */ static void prose_test_3(void) { // "Drivers MUST write language-specific tests that confirm truncation of commands, replies, and (if applicable) // server responses included in error messages work as expected when the data being truncated includes multi-byte // Unicode codepoints." "If the driver uses anything other than Unicode codepoints as the unit for max document // length, there also MUST be tests confirming that cases where the max length falls in the middle of a multi-byte // codepoint are handled gracefully." // // For libmongoc, our max length is in bytes and truncation will round lengths down if necessary to avoid splitting a // valid UTF-8 sequence. This test repeatedly sends a fake command to the server using every possible maximum // length, checking for the expected truncations. bson_t command = BSON_INITIALIZER; BSON_APPEND_BOOL(&command, "notARealCommand", true); BSON_APPEND_UTF8(&command, "twoByteUtf8", "\xc2\xa9"); BSON_APPEND_UTF8(&command, "threeByteUtf8", "\xef\xbf\xbd"); BSON_APPEND_UTF8(&command, "fourByteUtf8", "\xf4\x8f\xbf\xbf"); // Stop testing after $db, before we reach lsid. The result will always be truncated. const char *expected_json = "{ \"notARealCommand\" : true, \"twoByteUtf8\" : \"\xc2\xa9\", \"threeByteUtf8\" : " "\"\xef\xbf\xbd\", \"fourByteUtf8\" : \"\xf4\x8f\xbf\xbf\", \"$db\" : \"db\""; const int max_expected_length = strlen(expected_json); // List of lengths we expect not to see when trying every max_expected_length static const int expect_missing_lengths[] = {46, 70, 71, 94, 95, 96}; mongoc_client_t *client = test_framework_new_default_client(); int expected_length = 0; for (int test_length = 0; test_length <= max_expected_length; test_length++) { MONGOC_DEBUG("testing length %d of %d", test_length, max_expected_length); // Track the expected length of a serialized string with the max_document_length set to 'test_length'. // When a length is mentioned in expect_missing_lengths, we let the expected_length lag behind the test_length. // At this point, the ellipsis length is not included. bool expect_missing = false; if (test_length > max_expected_length) { expect_missing = true; } else { mlib_foreach_arr (const int, len, expect_missing_lengths) { if (*len == test_length) { expect_missing = true; break; } } } if (!expect_missing) { expected_length = test_length; } // Set up the log options for each command, to test this new max_document_length mongoc_structured_log_opts_t *log_opts = mongoc_structured_log_opts_new(); ASSERT(mongoc_structured_log_opts_set_max_document_length(log_opts, test_length)); ASSERT(mongoc_structured_log_opts_set_max_level_for_component( log_opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_array_t stored_log; _mongoc_array_init(&stored_log, sizeof(bson_t *)); mongoc_structured_log_opts_set_handler(log_opts, stored_log_handler, &stored_log); ASSERT(mongoc_client_set_structured_log_opts(client, log_opts)); mongoc_structured_log_opts_destroy(log_opts); ASSERT(!mongoc_client_command_simple(client, "db", &command, NULL, NULL, NULL)); ASSERT(stored_log.len >= 1); bson_t *log = _mongoc_array_index(&stored_log, bson_t *, 0); bson_iter_t iter; ASSERT(bson_iter_init(&iter, log)); ASSERT(bson_iter_find(&iter, "message")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "Command started"); ASSERT(bson_iter_find(&iter, "command")); ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); uint32_t logged_command_len; const char *logged_command_str = bson_iter_utf8(&iter, &logged_command_len); ASSERT(logged_command_str); ASSERT_CMPUINT32(logged_command_len, ==, expected_length + 3); // Note that here we do not use mcommon_string to truncate, just as a convenient way to represent the // expected string with ellipsis for ASSERT_CMPSTR. (The code under test internally uses mcommon_string_append_t // also.) mcommon_string_append_t expected_json_truncated; mcommon_string_new_as_append(&expected_json_truncated); mcommon_string_append_bytes(&expected_json_truncated, expected_json, expected_length); mcommon_string_append(&expected_json_truncated, "..."); ASSERT_CMPSTR(logged_command_str, mcommon_str_from_append(&expected_json_truncated)); mcommon_string_from_append_destroy(&expected_json_truncated); ASSERT(mongoc_client_set_structured_log_opts(client, NULL)); stored_log_clear(&stored_log); _mongoc_array_destroy(&stored_log); } mongoc_client_destroy(client); bson_destroy(&command); } void test_command_logging_and_monitoring_install(TestSuite *suite) { TestSuite_AddLive(suite, "/command-logging-and-monitoring/logging/prose_test_1", prose_test_1); TestSuite_AddLive(suite, "/command-logging-and-monitoring/logging/prose_test_2", prose_test_2); TestSuite_AddLive(suite, "/command-logging-and-monitoring/logging/prose_test_3", prose_test_3); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-command-monitoring.c000066400000000000000000001114521511661753600264670ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include const char * first_key(const bson_t *bson) { bson_iter_t iter; BSON_ASSERT(bson_iter_init(&iter, bson)); if (!bson_iter_next(&iter)) { return NULL; } return bson_iter_key(&iter); } void check_operation_ids(const bson_t *events) { bson_iter_t iter; int64_t first_operation_id = -1; int64_t operation_id; bson_t event; /* check op ids of events like {command_started_event: {operation_id: N}} */ BSON_ASSERT(bson_iter_init(&iter, events)); while (bson_iter_next(&iter)) { bson_iter_bson(&iter, &event); if (!strcmp(first_key(&event), "command_started_event")) { operation_id = bson_lookup_int64(&event, "command_started_event.operation_id"); if (first_operation_id == -1) { first_operation_id = operation_id; } else if (operation_id != first_operation_id) { test_error("%s sent wrong operation_id", bson_lookup_utf8(&event, "command_started_event.command_name")); } } } } static bool command_monitoring_test_run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bson_t reply; bool res; /* Command Monitoring tests don't use explicit session */ res = json_test_operation(ctx, test, operation, ctx->collection, NULL, &reply); bson_destroy(&reply); return res; } /* *----------------------------------------------------------------------- * * test_command_monitoring_cb -- * * Runs the JSON tests included with the Command Monitoring spec. * *----------------------------------------------------------------------- */ static void test_command_monitoring_cb(void *scenario) { json_test_config_t config = JSON_TEST_CONFIG_INIT; config.run_operation_cb = command_monitoring_test_run_operation; config.scenario = scenario; config.events_check_cb = check_operation_ids; run_json_general_test(&config); json_test_config_cleanup(&config); } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for command monitoring. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { // Newer versions of the 'unified' tests have migrated to command-logging-and-monitoring run_unified_tests(suite, JSON_DIR, "command_monitoring/unified"); install_json_test_suite(suite, JSON_DIR, "command_monitoring/legacy", &test_command_monitoring_cb); } static void test_get_error_failed_cb(const mongoc_apm_command_failed_t *event) { bson_error_t *error; error = (bson_error_t *)mongoc_apm_command_failed_get_context(event); mongoc_apm_command_failed_get_error(event, error); } static void test_get_error(void) { mock_server_t *server; mongoc_client_t *client; mongoc_apm_callbacks_t *callbacks; future_t *future; request_t *request; bson_error_t error = {0}; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, test_get_error_failed_cb); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&error); future = future_client_command_simple(client, "db", tmp_bson("{'foo': 1}"), NULL, NULL, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'foo': 1}")); reply_to_request_simple(request, "{'ok': 0, 'errmsg': 'foo', 'code': 42}"); ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, 42, "foo"); future_destroy(future); request_destroy(request); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); mock_server_destroy(server); } static void insert_200_docs(mongoc_collection_t *collection) { int i; bson_t *doc; bool r; bson_error_t error; /* insert 200 docs so we have a couple batches */ doc = tmp_bson(NULL); for (i = 0; i < 200; i++) { r = mongoc_collection_insert_one(collection, doc, NULL, NULL, &error); ASSERT_OR_PRINT(r, error); } } static void increment(const mongoc_apm_command_started_t *event) { int *i = (int *)mongoc_apm_command_started_get_context(event); ++(*i); } static mongoc_apm_callbacks_t * increment_callbacks(void) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, increment); return callbacks; } static void decrement(const mongoc_apm_command_started_t *event) { int *i = (int *)mongoc_apm_command_started_get_context(event); --(*i); } static mongoc_apm_callbacks_t * decrement_callbacks(void) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, decrement); return callbacks; } static void test_change_callbacks(void) { mongoc_apm_callbacks_t *inc_callbacks; mongoc_apm_callbacks_t *dec_callbacks; int incremented = 0; int decremented = 0; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; mongoc_cursor_t *cursor; const bson_t *b; inc_callbacks = increment_callbacks(); dec_callbacks = decrement_callbacks(); client = test_framework_new_default_client(); mongoc_client_set_apm_callbacks(client, inc_callbacks, &incremented); collection = get_test_collection(client, "test_change_callbacks"); insert_200_docs(collection); ASSERT_CMPINT(incremented, ==, 200); mongoc_client_set_apm_callbacks(client, dec_callbacks, &decremented); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson(NULL), NULL, NULL); ASSERT(mongoc_cursor_next(cursor, &b)); ASSERT_CMPINT(decremented, ==, -1); mongoc_client_set_apm_callbacks(client, inc_callbacks, &incremented); while (mongoc_cursor_next(cursor, &b)) { } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(incremented, ==, 201); mongoc_collection_drop(collection, NULL); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_apm_callbacks_destroy(inc_callbacks); mongoc_apm_callbacks_destroy(dec_callbacks); } static void test_reset_callbacks(void) { mongoc_apm_callbacks_t *inc_callbacks; mongoc_apm_callbacks_t *dec_callbacks; int incremented = 0; int decremented = 0; mongoc_client_t *client; mongoc_collection_t *collection; bool r; bson_t *cmd; bson_t cmd_reply; bson_error_t error; mongoc_server_description_t *sd; mongoc_cursor_t *cursor; const bson_t *b; inc_callbacks = increment_callbacks(); dec_callbacks = decrement_callbacks(); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_reset_apm_callbacks"); /* insert 200 docs so we have a couple batches */ insert_200_docs(collection); mongoc_client_set_apm_callbacks(client, inc_callbacks, &incremented); cmd = tmp_bson("{'aggregate': '%s', 'pipeline': [], 'cursor': {}}", collection->collection); sd = mongoc_client_select_server(client, true /* for writes */, NULL, &error); ASSERT_OR_PRINT(sd, error); r = mongoc_client_read_command_with_opts( client, "test", cmd, NULL, tmp_bson("{'serverId': %d}", sd->id), &cmd_reply, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(incremented, ==, 1); /* reset callbacks */ mongoc_client_set_apm_callbacks(client, NULL, NULL); /* destroys cmd_reply */ cursor = mongoc_cursor_new_from_command_reply_with_opts(client, &cmd_reply, tmp_bson("{'serverId': %" PRIu32 "}", sd->id)); ASSERT(mongoc_cursor_next(cursor, &b)); ASSERT_CMPINT(incremented, ==, 1); /* same value as before */ mongoc_client_set_apm_callbacks(client, dec_callbacks, &decremented); while (mongoc_cursor_next(cursor, &b)) { } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(decremented, ==, -1); mongoc_collection_drop(collection, NULL); mongoc_cursor_destroy(cursor); mongoc_server_description_destroy(sd); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_apm_callbacks_destroy(inc_callbacks); mongoc_apm_callbacks_destroy(dec_callbacks); } static void test_set_callbacks_cb(const mongoc_apm_command_started_t *event) { int *n_calls = (int *)mongoc_apm_command_started_get_context(event); (*n_calls)++; } static void _test_set_callbacks(bool pooled, bool try_pop) { mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_apm_callbacks_t *callbacks; int n_calls = 0; bson_error_t error; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_set_callbacks_cb); if (pooled) { pool = test_framework_new_default_client_pool(); ASSERT(mongoc_client_pool_set_apm_callbacks(pool, callbacks, (void *)&n_calls)); if (try_pop) { client = mongoc_client_pool_try_pop(pool); } else { client = mongoc_client_pool_pop(pool); } } else { client = test_framework_new_default_client(); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, (void *)&n_calls)); } ASSERT_OR_PRINT( mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error), error); ASSERT_CMPINT(1, ==, n_calls); capture_logs(true); if (pooled) { ASSERT(!mongoc_client_pool_set_apm_callbacks(pool, NULL, (void *)&n_calls)); ASSERT_CAPTURED_LOG("mongoc_client_pool_set_apm_callbacks", MONGOC_LOG_LEVEL_ERROR, "mongoc_client_pool_set_apm_callbacks can only be called once per pool"); clear_captured_logs(); ASSERT(!mongoc_client_set_apm_callbacks(client, NULL, (void *)&n_calls)); ASSERT_CAPTURED_LOG( "mongoc_client_pool_set_apm_callbacks", MONGOC_LOG_LEVEL_ERROR, "Cannot set callbacks on a pooled client"); } else { /* repeated calls ok, null is ok */ ASSERT(mongoc_client_set_apm_callbacks(client, NULL, NULL)); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_apm_callbacks_destroy(callbacks); } static void test_set_callbacks_single(void) { _test_set_callbacks(false, false); } static void test_set_callbacks_pooled(void) { _test_set_callbacks(true, false); } static void test_set_callbacks_pooled_try_pop(void) { _test_set_callbacks(true, true); } typedef struct { int64_t request_id; int64_t op_id; } ids_t; typedef struct { mongoc_array_t started_ids; mongoc_array_t succeeded_ids; mongoc_array_t failed_ids; int started_calls; int succeeded_calls; int failed_calls; char *db; } op_id_test_t; static void op_id_test_init(op_id_test_t *test) { _mongoc_array_init(&test->started_ids, sizeof(ids_t)); _mongoc_array_init(&test->succeeded_ids, sizeof(ids_t)); _mongoc_array_init(&test->failed_ids, sizeof(ids_t)); test->started_calls = 0; test->succeeded_calls = 0; test->failed_calls = 0; test->db = NULL; } static void op_id_test_cleanup(op_id_test_t *test) { _mongoc_array_destroy(&test->started_ids); _mongoc_array_destroy(&test->succeeded_ids); _mongoc_array_destroy(&test->failed_ids); bson_free(test->db); } static void test_op_id_started_cb(const mongoc_apm_command_started_t *event) { op_id_test_t *test; ids_t ids; test = (op_id_test_t *)mongoc_apm_command_started_get_context(event); ids.request_id = mongoc_apm_command_started_get_request_id(event); ids.op_id = mongoc_apm_command_started_get_operation_id(event); _mongoc_array_append_val(&test->started_ids, ids); test->started_calls++; } static void test_op_id_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { op_id_test_t *test; ids_t ids; test = (op_id_test_t *)mongoc_apm_command_succeeded_get_context(event); ids.request_id = mongoc_apm_command_succeeded_get_request_id(event); ids.op_id = mongoc_apm_command_succeeded_get_operation_id(event); _mongoc_array_append_val(&test->succeeded_ids, ids); test->succeeded_calls++; } static void test_op_id_failed_cb(const mongoc_apm_command_failed_t *event) { op_id_test_t *test; ids_t ids; test = (op_id_test_t *)mongoc_apm_command_failed_get_context(event); ids.request_id = mongoc_apm_command_failed_get_request_id(event); ids.op_id = mongoc_apm_command_failed_get_operation_id(event); bson_free(test->db); test->db = bson_strdup(mongoc_apm_command_failed_get_database_name(event)); _mongoc_array_append_val(&test->failed_ids, ids); test->failed_calls++; } #define REQUEST_ID(_event_type, _index) _mongoc_array_index(&test._event_type##_ids, ids_t, _index).request_id #define OP_ID(_event_type, _index) _mongoc_array_index(&test._event_type##_ids, ids_t, _index).op_id static void _test_bulk_operation_id(bool pooled, bool use_bulk_operation_new) { mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_apm_callbacks_t *callbacks; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; bson_error_t error; op_id_test_t test; int64_t op_id; op_id_test_init(&test); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_op_id_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, test_op_id_succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, test_op_id_failed_cb); if (pooled) { pool = test_framework_new_default_client_pool(); ASSERT(mongoc_client_pool_set_apm_callbacks(pool, callbacks, (void *)&test)); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, (void *)&test)); } collection = get_test_collection(client, "test_bulk_operation_id"); if (use_bulk_operation_new) { bulk = mongoc_bulk_operation_new(false); mongoc_bulk_operation_set_client(bulk, client); mongoc_bulk_operation_set_database(bulk, collection->db); mongoc_bulk_operation_set_collection(bulk, collection->collection); } else { bson_append_bool(&opts, "ordered", 7, false); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); } mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); mongoc_bulk_operation_update_one(bulk, tmp_bson("{'_id': 1}"), tmp_bson("{'$set': {'x': 1}}"), false); mongoc_bulk_operation_remove(bulk, tmp_bson("{}")); /* ensure we monitor with bulk->operation_id, not cluster->operation_id */ client->cluster.operation_id = 42; /* write errors don't trigger failed events, so we only test success */ ASSERT_OR_PRINT(mongoc_bulk_operation_execute(bulk, NULL, &error), error); ASSERT_CMPINT(test.started_calls, ==, 3); ASSERT_CMPINT(test.succeeded_calls, ==, 3); ASSERT_CMPINT64(REQUEST_ID(started, 0), ==, REQUEST_ID(succeeded, 0)); ASSERT_CMPINT64(REQUEST_ID(started, 1), ==, REQUEST_ID(succeeded, 1)); ASSERT_CMPINT64(REQUEST_ID(started, 2), ==, REQUEST_ID(succeeded, 2)); /* 3 unique request ids */ ASSERT_CMPINT64(REQUEST_ID(started, 0), !=, REQUEST_ID(started, 1)); ASSERT_CMPINT64(REQUEST_ID(started, 0), !=, REQUEST_ID(started, 2)); ASSERT_CMPINT64(REQUEST_ID(started, 1), !=, REQUEST_ID(started, 2)); ASSERT_CMPINT64(REQUEST_ID(succeeded, 0), !=, REQUEST_ID(succeeded, 1)); ASSERT_CMPINT64(REQUEST_ID(succeeded, 0), !=, REQUEST_ID(succeeded, 2)); ASSERT_CMPINT64(REQUEST_ID(succeeded, 1), !=, REQUEST_ID(succeeded, 2)); /* events' operation ids all equal bulk->operation_id */ op_id = bulk->operation_id; ASSERT_CMPINT64(op_id, !=, (int64_t)0); ASSERT_CMPINT64(op_id, ==, OP_ID(started, 0)); ASSERT_CMPINT64(op_id, ==, OP_ID(started, 1)); ASSERT_CMPINT64(op_id, ==, OP_ID(started, 2)); ASSERT_CMPINT64(op_id, ==, OP_ID(succeeded, 0)); ASSERT_CMPINT64(op_id, ==, OP_ID(succeeded, 1)); ASSERT_CMPINT64(op_id, ==, OP_ID(succeeded, 2)); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_destroy(&opts); op_id_test_cleanup(&test); mongoc_apm_callbacks_destroy(callbacks); } static void test_collection_bulk_op_single(void) { _test_bulk_operation_id(false, false); } static void test_collection_bulk_op_pooled(void) { _test_bulk_operation_id(true, false); } static void test_bulk_op_single(void) { _test_bulk_operation_id(false, true); } static void test_bulk_op_pooled(void) { _test_bulk_operation_id(true, true); } static void _test_query_operation_id(bool pooled) { mock_server_t *server; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_apm_callbacks_t *callbacks; mongoc_collection_t *collection; op_id_test_t test; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; int64_t op_id; op_id_test_init(&test); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_op_id_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, test_op_id_succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, test_op_id_failed_cb); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(mongoc_client_pool_set_apm_callbacks(pool, callbacks, (void *)&test)); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, (void *)&test)); } collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_request(server); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db2.collection'," " 'firstBatch': [{}]}}")); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); ASSERT_CMPINT(test.started_calls, ==, 1); ASSERT_CMPINT(test.succeeded_calls, ==, 1); future = future_cursor_next(cursor, &doc); request = mock_server_receives_request(server); reply_to_request_simple(request, "{'ok': 0, 'code': 42, 'errmsg': 'bad!'}"); ASSERT(!future_get_bool(future)); future_destroy(future); request_destroy(request); ASSERT_CMPINT(test.started_calls, ==, 2); ASSERT_CMPINT(test.succeeded_calls, ==, 1); ASSERT_CMPINT(test.failed_calls, ==, 1); ASSERT_CMPSTR(test.db, "db2"); ASSERT_CMPINT64(REQUEST_ID(started, 0), ==, REQUEST_ID(succeeded, 0)); ASSERT_CMPINT64(REQUEST_ID(started, 1), ==, REQUEST_ID(failed, 0)); /* unique request ids */ ASSERT_CMPINT64(REQUEST_ID(started, 0), !=, REQUEST_ID(started, 1)); /* operation ids all the same */ op_id = OP_ID(started, 0); ASSERT_CMPINT64(op_id, !=, (int64_t)0); ASSERT_CMPINT64(op_id, ==, OP_ID(started, 1)); ASSERT_CMPINT64(op_id, ==, OP_ID(failed, 0)); mock_server_destroy(server); /* client logs warning because it can't send killCursors or endSessions */ capture_logs(true); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } op_id_test_cleanup(&test); mongoc_apm_callbacks_destroy(callbacks); } static void test_query_operation_id_single_cmd(void) { _test_query_operation_id(false); } static void test_query_operation_id_pooled_cmd(void) { _test_query_operation_id(true); } typedef struct { int started_calls; int succeeded_calls; int failed_calls; char db[100]; char cmd_name[100]; bson_t cmd; } cmd_test_t; static void cmd_test_init(cmd_test_t *test) { memset(test, 0, sizeof *test); bson_init(&test->cmd); } static void cmd_test_cleanup(cmd_test_t *test) { bson_destroy(&test->cmd); } static void cmd_started_cb(const mongoc_apm_command_started_t *event) { cmd_test_t *test; if (!strcmp(mongoc_apm_command_started_get_command_name(event), "endSessions")) { /* the test is ending */ return; } test = (cmd_test_t *)mongoc_apm_command_started_get_context(event); test->started_calls++; bson_destroy(&test->cmd); bson_strncpy(test->db, mongoc_apm_command_started_get_database_name(event), sizeof(test->db)); bson_copy_to(mongoc_apm_command_started_get_command(event), &test->cmd); bson_strncpy(test->cmd_name, mongoc_apm_command_started_get_command_name(event), sizeof(test->cmd_name)); } static void cmd_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { cmd_test_t *test; int64_t duration; if (!strcmp(mongoc_apm_command_succeeded_get_command_name(event), "endSessions")) { return; } test = (cmd_test_t *)mongoc_apm_command_succeeded_get_context(event); test->succeeded_calls++; ASSERT_CMPSTR(test->cmd_name, mongoc_apm_command_succeeded_get_command_name(event)); duration = mongoc_apm_command_succeeded_get_duration(event); ASSERT_CMPINT64(duration, >=, (int64_t)0); ASSERT_CMPINT64(duration, <=, (int64_t)10000000); /* ten seconds */ } static void cmd_failed_cb(const mongoc_apm_command_failed_t *event) { cmd_test_t *test; int64_t duration; test = (cmd_test_t *)mongoc_apm_command_failed_get_context(event); test->failed_calls++; ASSERT_CMPSTR(test->cmd_name, mongoc_apm_command_failed_get_command_name(event)); duration = mongoc_apm_command_failed_get_duration(event); ASSERT_CMPINT64(duration, >=, (int64_t)0); ASSERT_CMPINT64(duration, <=, (int64_t)10000000); /* ten seconds */ } static void set_cmd_test_callbacks(mongoc_client_t *client, void *context) { mongoc_apm_callbacks_t *callbacks; ASSERT(client); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, cmd_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, cmd_succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, cmd_failed_cb); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, context)); mongoc_apm_callbacks_destroy(callbacks); } static void test_client_cmd_simple(void) { cmd_test_t test; mongoc_client_t *client; bool r; bson_error_t error; cmd_test_init(&test); client = test_framework_new_default_client(); set_cmd_test_callbacks(client, (void *)&test); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPSTR(test.cmd_name, "ping"); ASSERT_MATCH(&test.cmd, "{'ping': 1}"); ASSERT_CMPSTR(test.db, "admin"); ASSERT_CMPINT(1, ==, test.started_calls); ASSERT_CMPINT(1, ==, test.succeeded_calls); ASSERT_CMPINT(0, ==, test.failed_calls); cmd_test_cleanup(&test); cmd_test_init(&test); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'foo': 1}"), NULL, NULL, &error); ASSERT(!r); ASSERT_CMPSTR(test.cmd_name, "foo"); ASSERT_MATCH(&test.cmd, "{'foo': 1}"); ASSERT_CMPSTR(test.db, "admin"); ASSERT_CMPINT(1, ==, test.started_calls); ASSERT_CMPINT(0, ==, test.succeeded_calls); ASSERT_CMPINT(1, ==, test.failed_calls); mongoc_client_destroy(client); cmd_test_cleanup(&test); } static void test_client_cmd_op_ids(void) { op_id_test_t test; mongoc_client_t *client; mongoc_apm_callbacks_t *callbacks; bool r; bson_error_t error; int64_t op_id; op_id_test_init(&test); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_op_id_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, test_op_id_succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, test_op_id_failed_cb); client = test_framework_new_default_client(); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&test); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(1, ==, test.started_calls); ASSERT_CMPINT(1, ==, test.succeeded_calls); ASSERT_CMPINT(0, ==, test.failed_calls); ASSERT_CMPINT64(REQUEST_ID(started, 0), ==, REQUEST_ID(succeeded, 0)); ASSERT_CMPINT64(OP_ID(started, 0), ==, OP_ID(succeeded, 0)); op_id = OP_ID(started, 0); ASSERT_CMPINT64(op_id, !=, (int64_t)0); op_id_test_cleanup(&test); op_id_test_init(&test); /* again. test that we use a new op_id. */ r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(1, ==, test.started_calls); ASSERT_CMPINT(1, ==, test.succeeded_calls); ASSERT_CMPINT(0, ==, test.failed_calls); ASSERT_CMPINT64(REQUEST_ID(started, 0), ==, REQUEST_ID(succeeded, 0)); ASSERT_CMPINT64(OP_ID(started, 0), ==, OP_ID(succeeded, 0)); ASSERT_CMPINT64(OP_ID(started, 0), !=, (int64_t)0); /* new op_id */ ASSERT_CMPINT64(OP_ID(started, 0), !=, op_id); mongoc_client_destroy(client); op_id_test_cleanup(&test); mongoc_apm_callbacks_destroy(callbacks); } typedef struct { int failed_calls; bson_t reply; char *db; } cmd_failed_reply_test_t; static void cmd_failed_reply_test_init(cmd_failed_reply_test_t *test) { memset(test, 0, sizeof *test); bson_init(&test->reply); } static void cmd_failed_reply_test_cleanup(cmd_failed_reply_test_t *test) { bson_destroy(&test->reply); bson_free(test->db); } static void command_failed_reply_command_failed_cb(const mongoc_apm_command_failed_t *event) { cmd_failed_reply_test_t *test; test = (cmd_failed_reply_test_t *)mongoc_apm_command_failed_get_context(event); test->failed_calls++; bson_free(test->db); test->db = bson_strdup(mongoc_apm_command_failed_get_database_name(event)); bson_destroy(&test->reply); bson_copy_to(mongoc_apm_command_failed_get_reply(event), &test->reply); } static void test_command_failed_reply_mock(void) { mock_server_t *server; mongoc_client_t *client; mongoc_apm_callbacks_t *callbacks; mongoc_collection_t *collection; cmd_failed_reply_test_t test; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; /* test that the command_failed_event's reply is the same as a mocked reply */ cmd_failed_reply_test_init(&test); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, command_failed_reply_command_failed_cb); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, (void *)&test)); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_request(server); reply_to_request_simple(request, "{'ok': 0, 'code': 42, 'errmsg': 'bad!'}"); ASSERT(!future_get_bool(future)); future_destroy(future); request_destroy(request); ASSERT_MATCH(&test.reply, "{'ok': 0, 'code': 42, 'errmsg': 'bad!'}"); ASSERT_CMPINT(test.failed_calls, ==, 1); ASSERT_CMPSTR(test.db, "db"); mock_server_destroy(server); /* client logs warning because it can't send killCursors or endSessions */ capture_logs(true); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); cmd_failed_reply_test_cleanup(&test); mongoc_apm_callbacks_destroy(callbacks); } static void test_command_failed_reply_hangup(void) { mock_server_t *server; mongoc_client_t *client; mongoc_apm_callbacks_t *callbacks; mongoc_collection_t *collection; cmd_failed_reply_test_t test; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; /* test that the command_failed_event's reply is empty if there is a network * error (i.e. the server hangs up) */ cmd_failed_reply_test_init(&test); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, command_failed_reply_command_failed_cb); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, (void *)&test)); collection = mongoc_client_get_collection(client, "db2", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_request(server); reply_to_request_simple(request, "{'ok': 0, 'code': 42, 'errmsg': 'bad!'}"); ASSERT(!future_get_bool(future)); future_destroy(future); reply_to_request_with_hang_up(request); request_destroy(request); ASSERT_MATCH(&test.reply, "{}"); ASSERT_CMPINT(test.failed_calls, ==, 1); ASSERT_CMPSTR(test.db, "db2"); mock_server_destroy(server); /* client logs warning because it can't send killCursors or endSessions */ capture_logs(true); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); cmd_failed_reply_test_cleanup(&test); mongoc_apm_callbacks_destroy(callbacks); } typedef struct { int started_calls; int succeeded_calls; int failed_calls; bool has_service_id; bson_oid_t expected_service_id; } service_id_test_t; static void assert_service_id(service_id_test_t *test, const bson_oid_t *actual_service_id) { if (test->has_service_id) { BSON_ASSERT(actual_service_id); ASSERT_CMPOID(actual_service_id, &test->expected_service_id); } else { BSON_ASSERT(!actual_service_id); } } static void service_id_cmd_started_cb(const mongoc_apm_command_started_t *event) { service_id_test_t *test = mongoc_apm_command_started_get_context(event); test->started_calls++; assert_service_id(test, mongoc_apm_command_started_get_service_id(event)); } static void service_id_cmd_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { service_id_test_t *test = mongoc_apm_command_succeeded_get_context(event); test->succeeded_calls++; assert_service_id(test, mongoc_apm_command_succeeded_get_service_id(event)); } static void service_id_cmd_failed_cb(const mongoc_apm_command_failed_t *event) { service_id_test_t *test = mongoc_apm_command_failed_get_context(event); test->failed_calls++; assert_service_id(test, mongoc_apm_command_failed_get_service_id(event)); } static void _test_service_id(bool is_loadbalanced) { mock_server_t *server; mongoc_client_t *client; mongoc_uri_t *uri; request_t *request; future_t *future; bson_error_t error; service_id_test_t context = {0}; mongoc_apm_callbacks_t *callbacks; server = mock_server_new(); mock_server_run(server); mock_server_auto_endsessions(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, is_loadbalanced); client = test_framework_client_new_from_uri(uri, NULL); if (is_loadbalanced) { context.has_service_id = true; bson_oid_init_from_string(&context.expected_service_id, "AAAAAAAAAAAAAAAAAAAAAAAA"); } callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, service_id_cmd_started_cb); mongoc_apm_set_command_succeeded_cb(callbacks, service_id_cmd_succeeded_cb); mongoc_apm_set_command_failed_cb(callbacks, service_id_cmd_failed_cb); ASSERT(mongoc_client_set_apm_callbacks(client, callbacks, &context)); mongoc_apm_callbacks_destroy(callbacks); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); if (is_loadbalanced) { request = mock_server_receives_any_hello_with_match(server, "{'loadBalanced': true}", "{'loadBalanced': true}"); reply_to_request_simple(request, tmp_str("{'ismaster': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'msg': 'isdbgrid'," " 'serviceId': {'$oid': 'AAAAAAAAAAAAAAAAAAAAAAAA'}}", WIRE_VERSION_MIN, WIRE_VERSION_5_0)); } else { request = mock_server_receives_any_hello_with_match( server, "{'loadBalanced': { '$exists': false }}", "{'loadBalanced': { '$exists': false }}"); reply_to_request_simple(request, tmp_str("{'ismaster': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'msg': 'isdbgrid'}", WIRE_VERSION_MIN, WIRE_VERSION_5_0)); } request_destroy(request); request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); reply_to_request_simple(request, "{'ok': 0, 'code': 8, 'errmsg': 'UnknownError'}"); request_destroy(request); ASSERT(!future_get_bool(future)); future_destroy(future); ASSERT_CMPINT(2, ==, context.started_calls); ASSERT_CMPINT(1, ==, context.succeeded_calls); ASSERT_CMPINT(1, ==, context.failed_calls); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mock_server_destroy(server); } void test_service_id_loadbalanced(void) { _test_service_id(true); } void test_service_id_not_loadbalanced(void) { _test_service_id(false); } void test_command_monitoring_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddMockServerTest(suite, "/command_monitoring/get_error", test_get_error); TestSuite_AddLive(suite, "/command_monitoring/set_callbacks/single", test_set_callbacks_single); TestSuite_AddLive(suite, "/command_monitoring/set_callbacks/pooled", test_set_callbacks_pooled); TestSuite_AddLive(suite, "/command_monitoring/set_callbacks/pooled_try_pop", test_set_callbacks_pooled_try_pop); /* require aggregation cursor */ TestSuite_AddLive(suite, "/command_monitoring/set_callbacks/change", test_change_callbacks); TestSuite_AddLive(suite, "/command_monitoring/set_callbacks/reset", test_reset_callbacks); TestSuite_AddLive(suite, "/command_monitoring/operation_id/bulk/collection/single", test_collection_bulk_op_single); TestSuite_AddLive(suite, "/command_monitoring/operation_id/bulk/collection/pooled", test_collection_bulk_op_pooled); TestSuite_AddLive(suite, "/command_monitoring/operation_id/bulk/new/single", test_bulk_op_single); TestSuite_AddLive(suite, "/command_monitoring/operation_id/bulk/new/pooled", test_bulk_op_pooled); TestSuite_AddMockServerTest( suite, "/command_monitoring/operation_id/query/single/cmd", test_query_operation_id_single_cmd); TestSuite_AddMockServerTest( suite, "/command_monitoring/operation_id/query/pooled/cmd", test_query_operation_id_pooled_cmd); TestSuite_AddLive(suite, "/command_monitoring/client_cmd_simple", test_client_cmd_simple); TestSuite_AddLive(suite, "/command_monitoring/client_cmd/op_ids", test_client_cmd_op_ids); TestSuite_AddMockServerTest(suite, "/command_monitoring/failed_reply_mock", test_command_failed_reply_mock); TestSuite_AddMockServerTest(suite, "/command_monitoring/failed_reply_hangup", test_command_failed_reply_hangup); TestSuite_AddMockServerTest(suite, "/command_monitoring/service_id/loadbalanced", test_service_id_loadbalanced); TestSuite_AddMockServerTest( suite, "/command_monitoring/service_id/not_loadbalanced", test_service_id_not_loadbalanced); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-connection-uri.c000066400000000000000000000461101511661753600256200ustar00rootroot00000000000000#include // #include #include #include #include #include #include /* * Asserts every key-value pair in 'needle' is in 'haystack', including those in * embedded documents. */ static void bson_contains_iter(const bson_t *haystack, bson_iter_t *needle) { bson_iter_t iter; if (!bson_iter_next(needle)) { return; } const char *const key = bson_iter_key(needle); ASSERT_WITH_MSG(bson_iter_init_find_case(&iter, haystack, key), "'%s' is not present", key); const uint32_t bson_type = bson_iter_type(needle); switch (bson_type) { case BSON_TYPE_ARRAY: case BSON_TYPE_DOCUMENT: { bson_t sub_bson; bson_iter_t sub_iter; ASSERT_WITH_MSG(BSON_ITER_HOLDS_DOCUMENT(&iter), "'%s' is not a document", key); bson_iter_bson(&iter, &sub_bson); bson_iter_recurse(needle, &sub_iter); bson_contains_iter(&sub_bson, &sub_iter); bson_destroy(&sub_bson); return; } case BSON_TYPE_BOOL: ASSERT_WITH_MSG(bson_iter_as_bool(needle) == bson_iter_as_bool(&iter), "'%s' is not the correct value", key); bson_contains_iter(haystack, needle); return; case BSON_TYPE_UTF8: ASSERT_CMPSTR(bson_iter_utf8(needle, 0), bson_iter_utf8(&iter, 0)); bson_contains_iter(haystack, needle); return; case BSON_TYPE_DOUBLE: ASSERT_CMPDOUBLE(bson_iter_double(needle), ==, bson_iter_double(&iter)); bson_contains_iter(haystack, needle); return; case BSON_TYPE_INT64: case BSON_TYPE_INT32: ASSERT_CMPINT64(bson_iter_as_int64(needle), ==, bson_iter_as_int64(&iter)); bson_contains_iter(haystack, needle); return; default: ASSERT(false); return; } } static void run_uri_test(const char *uri_string, bool valid, const bson_t *hosts, const bson_t *auth, const bson_t *options, const bson_t *credentials) { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(uri_string, &error); /* BEGIN Exceptions to test suite */ /* some spec tests assume we allow DB names like "auth.foo" */ if (auth) { bson_iter_t iter; if ((bson_iter_init_find(&iter, auth, "db") || bson_iter_init_find(&iter, auth, "source")) && BSON_ITER_HOLDS_UTF8(&iter)) { if (strchr(bson_iter_utf8(&iter, NULL), '.')) { BSON_ASSERT(!uri); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid database specifier \"admin."); clear_captured_logs(); return; } } } if (valid && !uri && error.domain) { /* Eager failures which the spec expects to be warnings. */ /* CDRIVER-3167 */ if (strstr(uri_string, "=invalid") || strstr(uri_string, "heartbeatFrequencyMS=-2") || strstr(uri_string, "w=-2") || strstr(uri_string, "wTimeoutMS=-2") || strstr(uri_string, "zlibCompressionLevel=-2") || strstr(uri_string, "zlibCompressionLevel=10") || (!strstr(uri_string, "mongodb+srv") && strstr(uri_string, "srvServiceName=customname")) || strstr(uri_string, "srvMaxHosts=-1") || strstr(uri_string, "srvMaxHosts=foo")) { MONGOC_WARNING("Error parsing URI: '%s'", error.message); return; } // CDRIVER-4128: only legacy boolean values are currently supported. if (strstr(uri_string, "CANONICALIZE_HOST_NAME:none") || strstr(uri_string, "CANONICALIZE_HOST_NAME:forward")) { return; } // CDRIVER-5580: commas in TOKEN_RESOURCE are interpreted as a key-value pair delimiter which produces an invalid // mechanism property that is diagnosed as a client error instead of a warning. if (strstr(uri_string, "TOKEN_RESOURCE:mongodb://host1%2Chost2")) { MONGOC_WARNING("percent-encoded commas in TOKEN_RESOURCE"); return; } } if (uri) { /* mongoc does not warn on negative timeouts when it should. */ /* CDRIVER-3167 */ if ((mongoc_uri_get_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 0) < 0) || (mongoc_uri_get_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 0) < 0) || (mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 0) < 0) || (mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 0) < 0)) { MONGOC_WARNING("Invalid negative timeout"); } /* mongoc does not store lists the way the spec test expects. */ if (strstr(uri_string, "compressors=") || strstr(uri_string, "readPreferenceTags=")) { options = NULL; } /* mongoc eagerly warns about unsupported compressors. */ #ifndef MONGOC_ENABLE_COMPRESSION_SNAPPY if (strstr(uri_string, "compressors=snappy")) { clear_captured_logs(); } #endif #ifndef MONGOC_ENABLE_COMPRESSION_ZLIB if (strstr(uri_string, "compressors=zlib") || strstr(uri_string, "compressors=snappy,zlib")) { clear_captured_logs(); } #endif } /* END Exceptions to test suite */ if (valid) { ASSERT_OR_PRINT(uri, error); } else { ASSERT_WITH_MSG(!uri, "expected URI to be invalid: %s", uri_string); return; } if (!bson_empty0(hosts)) { bson_iter_t iter; bson_iter_t host_iter; for (bson_iter_init(&iter, hosts); bson_iter_next(&iter) && bson_iter_recurse(&iter, &host_iter);) { const char *host = "localhost"; int64_t port = 27017; bool ok = false; if (bson_iter_find(&host_iter, "host") && BSON_ITER_HOLDS_UTF8(&host_iter)) { host = bson_iter_utf8(&host_iter, NULL); } if (bson_iter_find(&host_iter, "port") && BSON_ITER_HOLDS_INT(&host_iter)) { port = bson_iter_as_int64(&host_iter); } for (const mongoc_host_list_t *hl = mongoc_uri_get_hosts(uri); hl; hl = hl->next) { if (!strcmp(host, hl->host) && port == hl->port) { ok = true; break; } } if (!ok) { test_error("Could not find '%s':%" PRId64 " in uri '%s'\n", host, port, mongoc_uri_get_string(uri)); } } } if (auth) { bson_iter_t iter; if (bson_iter_init_find(&iter, auth, "username") && BSON_ITER_HOLDS_UTF8(&iter)) { ASSERT_CMPSTR(mongoc_uri_get_username(uri), bson_iter_utf8(&iter, NULL)); } if (bson_iter_init_find(&iter, auth, "password") && BSON_ITER_HOLDS_UTF8(&iter)) { ASSERT_CMPSTR(mongoc_uri_get_password(uri), bson_iter_utf8(&iter, NULL)); } if ((bson_iter_init_find(&iter, auth, "db") || bson_iter_init_find(&iter, auth, "source")) && BSON_ITER_HOLDS_UTF8(&iter)) { ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), bson_iter_utf8(&iter, NULL)); } } if (options) { bson_t actual = BSON_INITIALIZER; bson_iter_t iter; // "options" includes both URI options and credentials. bson_concat(&actual, mongoc_uri_get_options(uri)); bson_concat(&actual, mongoc_uri_get_credentials(uri)); const mongoc_read_concern_t *const rc = mongoc_uri_get_read_concern(uri); if (!mongoc_read_concern_is_default(rc)) { BSON_APPEND_UTF8(&actual, "readconcernlevel", mongoc_read_concern_get_level(rc)); } bson_t expected = BSON_INITIALIZER; bson_copy_to_excluding_noinit(options, &expected, // These 'auth' params may be included in 'options' "username", "password", "source", // Credentials fields. "authmechanism", "authmechanismproperties", // Rename for consistency. "mechanism", // -> "authmechanism" "mechanism_properties", // -> "authmechanismproperties" NULL); if ((bson_iter_init_find(&iter, options, "mechanism") || bson_iter_init_find(&iter, options, "authmechanism")) && BSON_ITER_HOLDS_UTF8(&iter)) { ASSERT(!bson_has_field(&expected, "authmechanism")); ASSERT(BSON_APPEND_UTF8(&expected, "authmechanism", bson_iter_utf8(&iter, NULL))); } if ((bson_iter_init_find(&iter, options, "mechanism_properties") || bson_iter_init_find(&iter, options, "authmechanismproperties")) && BSON_ITER_HOLDS_DOCUMENT(&iter)) { ASSERT(!bson_has_field(&expected, "authmechanismproperties")); ASSERT(BSON_APPEND_ITER(&expected, "authmechanismproperties", &iter)); } bson_iter_init(&iter, &expected); bson_contains_iter(&actual, &iter); bson_destroy(&expected); bson_destroy(&actual); } if (credentials) { bson_iter_t iter; bson_t expected = BSON_INITIALIZER; // Rename keys for consistency across tests: // - "mechanism" -> "authmechanism" // - "mechanism_properties" -> "authmechanismproperties" { bson_copy_to_excluding_noinit(credentials, &expected, // Credentials fields. "authmechanism", "authmechanismproperties", // Rename for consistency. "mechanism", // -> "authmechanism" "mechanism_properties", // -> "authmechanismproperties" NULL); if ((bson_iter_init_find(&iter, credentials, "mechanism") || bson_iter_init_find(&iter, credentials, "authmechanism")) && BSON_ITER_HOLDS_UTF8(&iter)) { ASSERT(!bson_has_field(&expected, "authmechanism")); ASSERT(BSON_APPEND_UTF8(&expected, "authmechanism", bson_iter_utf8(&iter, NULL))); } if ((bson_iter_init_find(&iter, credentials, "mechanism_properties") || bson_iter_init_find(&iter, credentials, "authmechanismproperties")) && BSON_ITER_HOLDS_DOCUMENT(&iter)) { ASSERT(!bson_has_field(&expected, "authmechanismproperties")); ASSERT(BSON_APPEND_ITER(&expected, "authmechanismproperties", &iter)); } } bsonVisitEach( expected, case ( when(iKeyWithType("username", utf8), do({ ASSERT_CMPSTR(mongoc_uri_get_username(uri), bsonAs(cstr)); })), when(iKeyWithType("password", utf8), do({ ASSERT_CMPSTR(mongoc_uri_get_password(uri), bsonAs(cstr)); })), when(iKeyWithType("source", utf8), do({ ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), bsonAs(cstr)); })), when(iKeyWithType("authmechanism", utf8), do({ ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), bsonAs(cstr)); })), when(iKeyWithType("authmechanismproperties", doc), do({ bson_t expected_props = BSON_INITIALIZER; ASSERT_OR_PRINT(_mongoc_iter_document_as_bson(&bsonVisitIter, &expected_props, &error), error); // CDRIVER-4128: CANONICALIZE_HOST_NAME is UTF-8 even when "false" or "true". { bson_t updated = BSON_INITIALIZER; bson_copy_to_excluding_noinit(&expected_props, &updated, "CANONICALIZE_HOST_NAME", NULL); if (bson_iter_init_find_case(&iter, &expected_props, "CANONICALIZE_HOST_NAME")) { if (BSON_ITER_HOLDS_BOOL(&iter)) { BSON_APPEND_UTF8( &updated, "CANONICALIZE_HOST_NAME", bson_iter_bool(&iter) ? "true" : "false"); } else { BSON_APPEND_VALUE(&updated, "CANONICALIZE_HOST_NAME", bson_iter_value(&iter)); } } bson_destroy(&expected_props); expected_props = updated; // Ownership transfer. } bson_t actual; ASSERT_WITH_MSG(mongoc_uri_get_mechanism_properties(uri, &actual), "expected authmechanismproperties to be provided"); bson_iter_init(&iter, &expected_props); bson_contains_iter(&actual, &iter); bson_destroy(&expected_props); bson_destroy(&actual); })), // Connection String spec: if a test case includes a null value for one of these keys (e.g. auth: ~, // port: ~), no assertion is necessary. when(iKeyWithType("username", null), nop), when(iKeyWithType("password", null), nop), when(iKeyWithType("source", null), nop), when(iKeyWithType("authmechanism", null), nop), when(iKeyWithType("authmechanismproperties", null), nop), else(do({ test_error("unexpected credentials field '%s' with type '%s'", bson_iter_key(&bsonVisitIter), _mongoc_bson_type_to_str(bson_iter_type(&bsonVisitIter))); })))); bson_destroy(&expected); } if (uri) { mongoc_uri_destroy(uri); } } static bson_t * bson_lookup_doc_null_ok(const bson_t *b, const char *key) { bson_iter_t iter; if (!bson_iter_init_find(&iter, b, key)) { return NULL; } if (BSON_ITER_HOLDS_NULL(&iter)) { return NULL; } bson_t *const ret = bson_new(); { bson_t doc; bson_iter_bson(&iter, &doc); bson_concat(ret, &doc); } return ret; } static void test_connection_uri_cb(void *scenario_vp) { BSON_ASSERT_PARAM(scenario_vp); const bson_t *const scenario = scenario_vp; static const test_skip_t skips[] = { {.description = "Valid connection pool options are parsed correctly", .reason = "libmongoc does not support maxIdleTimeMS"}, {.description = "Valid connection and timeout options are parsed correctly", .reason = "libmongoc does not support maxIdleTimeMS"}, {.description = "timeoutMS=0", .reason = "libmongoc does not support timeoutMS (CDRIVER-3786)"}, {.description = "Non-numeric timeoutMS causes a warning", .reason = "libmongoc does not support timeoutMS (CDRIVER-3786)"}, {.description = "Too low timeoutMS causes a warning", .reason = "libmongoc does not support timeoutMS (CDRIVER-3786)"}, {.description = "proxyPort without proxyHost", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "proxyUsername without proxyHost", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "proxyPassword without proxyHost", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "all other proxy options without proxyHost", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "proxyUsername without proxyPassword", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "proxyPassword without proxyUsername", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "multiple proxyHost parameters", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "multiple proxyPort parameters", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "multiple proxyUsername parameters", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "multiple proxyPassword parameters", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "only host present", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "host and default port present", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "host and non-default port present", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "replicaset, host and non-default port present", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "all options present", .reason = "libmongoc does not support proxies (CDRIVER-4187)"}, {.description = "Valid connection pool options are parsed correctly", .reason = "libmongoc does not support minPoolSize (CDRIVER-2390)"}, {.description = "minPoolSize=0 does not error", .reason = "libmongoc does not support minPoolSize (CDRIVER-2390)"}, {.description = "should throw an exception if neither environment nor callbacks specified (MONGODB-OIDC)", .reason = "libmongoc OIDC callbacks attach to MongoClient, which is not involved by this test"}, {.description = NULL}, }; bson_iter_t iter; bson_iter_t tests_iter; ASSERT(bson_iter_init_find(&iter, scenario, "tests")); ASSERT(BSON_ITER_HOLDS_ARRAY(&iter)); ASSERT(bson_iter_recurse(&iter, &tests_iter)); while (bson_iter_next(&tests_iter)) { bson_t test_case; bson_iter_bson(&tests_iter, &test_case); const char *description = bson_lookup_utf8(&test_case, "description"); if (test_should_be_skipped(skips, description)) { continue; } const char *uri_string = bson_lookup_utf8(&test_case, "uri"); if (test_suite_debug_output()) { printf(" - %s: '%s'\n", description, uri_string); fflush(stdout); } bson_t *const hosts = bson_lookup_doc_null_ok(&test_case, "hosts"); bson_t *const auth = bson_lookup_doc_null_ok(&test_case, "auth"); bson_t *const options = bson_lookup_doc_null_ok(&test_case, "options"); bson_t *const credentials = bson_lookup_doc_null_ok(&test_case, "credential"); const bool valid = _mongoc_lookup_bool(&test_case, "valid", true); capture_logs(true); run_uri_test(uri_string, valid, hosts, auth, options, credentials); bson_iter_t warning_iter; bson_iter_init(&warning_iter, &test_case); bson_iter_t descendent; if (bson_iter_find_descendant(&warning_iter, "warning", &descendent) && BSON_ITER_HOLDS_BOOL(&descendent)) { if (bson_iter_as_bool(&descendent)) { ASSERT_CAPTURED_LOG("mongoc_uri", MONGOC_LOG_LEVEL_WARNING, ""); } else { ASSERT_NO_CAPTURED_LOGS("mongoc_uri"); } } bson_destroy(hosts); bson_destroy(auth); bson_destroy(options); bson_destroy(credentials); } } static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite(suite, JSON_DIR, "uri-options", &test_connection_uri_cb); install_json_test_suite(suite, JSON_DIR, "connection_uri", &test_connection_uri_cb); install_json_test_suite(suite, JSON_DIR, "auth/legacy", &test_connection_uri_cb); } void test_connection_uri_install(TestSuite *suite) { test_all_spec_tests(suite); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-counters.c000066400000000000000000001573751511661753600245460ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include /* test statistics counters excluding OP_INSERT, OP_UPDATE, and OP_DELETE since * those were superseded by write commands in 2.6. */ #ifdef MONGOC_ENABLE_SHM_COUNTERS /* define prev_* counters for testing convenience. */ #define COUNTER(ident, Category, Name, Description) static int32_t prev_##ident; #include #undef COUNTER /* helper to reset a prev_* counter */ #define RESET(ident) \ mcommon_atomic_int32_exchange(&prev_##ident, mongoc_counter_##ident##_count(), mcommon_memory_order_seq_cst) /* helper to compare and reset a prev_* counter. */ #define DIFF_AND_RESET(ident, cmp, expected) \ do { \ int32_t old_count = prev_##ident; \ int32_t new_count = mongoc_counter_##ident##_count(); \ int32_t _diff = new_count - old_count; \ ASSERT_CMPINT32(_diff, cmp, expected); \ RESET(ident); \ } while (0) static void reset_all_counters(void) { #define COUNTER(ident, Category, Name, Description) RESET(ident); #include #undef COUNTER } /* create a client and disable server selection after performing it. */ static mongoc_client_t * _client_new_disable_ss(bool use_compression) { mongoc_client_t *client; mongoc_uri_t *uri; mongoc_server_description_t *sd; bson_error_t err; uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 99999); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 99999); if (use_compression) { char *compressors = test_framework_get_compressors(); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_COMPRESSORS, compressors); bson_free(compressors); } client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); sd = mongoc_client_select_server(client, true, NULL, &err); ASSERT_OR_PRINT(sd, err); mongoc_server_description_destroy(sd); // Trigger authentication handshake now to avoid interfering with ping test. ASSERT_OR_PRINT(mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &err), err); mongoc_uri_destroy(uri); /* reset counters to exclude anything done in server selection. */ reset_all_counters(); return client; } mongoc_collection_t * _drop_and_populate_coll(mongoc_client_t *client) { /* insert thrice. */ mongoc_collection_t *coll; bool ret; bson_error_t err; int i; ASSERT(client); coll = mongoc_client_get_collection(client, "test", "test"); mongoc_collection_drop(coll, NULL); /* don't care if ns not found. */ for (i = 0; i < 3; i++) { ret = mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); } return coll; } void _ping(mongoc_client_t *client) { bool ret; bson_error_t err; ASSERT(client); ret = mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); } static void test_counters_op_msg(void *ctx) { mongoc_collection_t *coll; mongoc_cursor_t *cursor; const bson_t *bson; mongoc_client_t *client; BSON_UNUSED(ctx); client = _client_new_disable_ss(false); _ping(client); DIFF_AND_RESET(op_egress_msg, ==, 1); DIFF_AND_RESET(op_egress_total, ==, 1); DIFF_AND_RESET(op_ingress_msg, ==, 1); DIFF_AND_RESET(op_ingress_total, ==, 1); coll = _drop_and_populate_coll(client); DIFF_AND_RESET(op_egress_msg, ==, 4); DIFF_AND_RESET(op_egress_total, ==, 4); DIFF_AND_RESET(op_ingress_msg, ==, 4); DIFF_AND_RESET(op_ingress_total, ==, 4); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); while (mongoc_cursor_next(cursor, &bson)) ; mongoc_cursor_destroy(cursor); DIFF_AND_RESET(op_egress_msg, >, 0); DIFF_AND_RESET(op_ingress_msg, >, 0); DIFF_AND_RESET(op_egress_query, ==, 0); DIFF_AND_RESET(op_ingress_reply, ==, 0); DIFF_AND_RESET(op_egress_total, >, 0); DIFF_AND_RESET(op_ingress_total, >, 0); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_counters_op_compressed(void *ctx) { mongoc_collection_t *coll; mongoc_client_t *client; BSON_UNUSED(ctx); client = _client_new_disable_ss(true); _ping(client); /* we count one OP_MSG and one OP_COMPRESSED for the same message. */ DIFF_AND_RESET(op_egress_msg, ==, 1); DIFF_AND_RESET(op_egress_compressed, ==, 1); DIFF_AND_RESET(op_egress_total, ==, 2); DIFF_AND_RESET(op_ingress_msg, ==, 1); DIFF_AND_RESET(op_ingress_compressed, ==, 1); DIFF_AND_RESET(op_ingress_total, ==, 2); coll = _drop_and_populate_coll(client); DIFF_AND_RESET(op_egress_msg, ==, 4); DIFF_AND_RESET(op_egress_compressed, ==, 4); DIFF_AND_RESET(op_egress_total, ==, 8); DIFF_AND_RESET(op_ingress_msg, ==, 4); DIFF_AND_RESET(op_ingress_compressed, ==, 4); DIFF_AND_RESET(op_ingress_total, ==, 8); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_counters_cursors(void) { mongoc_collection_t *coll; mongoc_cursor_t *cursor; const bson_t *bson; mongoc_client_t *client; client = _client_new_disable_ss(false); coll = _drop_and_populate_coll(client); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL); DIFF_AND_RESET(cursors_active, ==, 1); while (mongoc_cursor_next(cursor, &bson)) ; mongoc_cursor_destroy(cursor); DIFF_AND_RESET(cursors_active, ==, -1); DIFF_AND_RESET(cursors_disposed, ==, 1); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_counters_clients(void) { mongoc_client_pool_t *client_pool; mongoc_client_t *client; mongoc_uri_t *uri; uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 99999); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 99999); reset_all_counters(); client = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client); DIFF_AND_RESET(clients_active, ==, 1); DIFF_AND_RESET(clients_disposed, ==, 0); DIFF_AND_RESET(client_pools_active, ==, 0); DIFF_AND_RESET(client_pools_disposed, ==, 0); mongoc_client_destroy(client); DIFF_AND_RESET(clients_active, ==, -1); DIFF_AND_RESET(clients_disposed, ==, 1); DIFF_AND_RESET(client_pools_active, ==, 0); DIFF_AND_RESET(client_pools_disposed, ==, 0); /* check client pools. */ client_pool = test_framework_client_pool_new_from_uri(uri, NULL); BSON_ASSERT(client_pool); DIFF_AND_RESET(clients_active, ==, 0); DIFF_AND_RESET(clients_disposed, ==, 0); DIFF_AND_RESET(client_pools_active, ==, 1); DIFF_AND_RESET(client_pools_disposed, ==, 0); client = mongoc_client_pool_pop(client_pool); DIFF_AND_RESET(clients_active, ==, 1); DIFF_AND_RESET(clients_disposed, ==, 0); DIFF_AND_RESET(client_pools_active, ==, 0); DIFF_AND_RESET(client_pools_disposed, ==, 0); mongoc_client_destroy(client); DIFF_AND_RESET(clients_active, ==, -1); DIFF_AND_RESET(clients_disposed, ==, 1); DIFF_AND_RESET(client_pools_active, ==, 0); DIFF_AND_RESET(client_pools_disposed, ==, 0); mongoc_client_pool_destroy(client_pool); DIFF_AND_RESET(clients_active, ==, 0); DIFF_AND_RESET(clients_disposed, ==, 0); DIFF_AND_RESET(client_pools_active, ==, -1); DIFF_AND_RESET(client_pools_disposed, ==, 1); mongoc_uri_destroy(uri); } static void test_counters_streams(void *ctx) { mongoc_client_t *client = _client_new_disable_ss(false); mongoc_socket_t *sock; mongoc_stream_t *stream_sock; mongoc_stream_t *buffered_stream_sock; mongoc_stream_t *file_stream; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_stream_t *gridfs_stream; bool used_ssl = false; bson_error_t err; char buf[16] = {0}; const int TIMEOUT = 500; mongoc_gridfs_file_opt_t gridfs_opts = {0}; bool ret; BSON_UNUSED(ctx); /* test ingress and egress of a stream to a server. */ _ping(client); DIFF_AND_RESET(streams_egress, >, 0); DIFF_AND_RESET(streams_ingress, >, 0); /* test that creating and destroying each type of stream changes the * streams active and not active. */ sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); DIFF_AND_RESET(streams_active, ==, 0); DIFF_AND_RESET(streams_disposed, ==, 0); stream_sock = mongoc_stream_socket_new(sock); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); buffered_stream_sock = mongoc_stream_buffered_new(stream_sock, 16); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); #ifdef MONGOC_ENABLE_SSL do { const mongoc_ssl_opt_t *default_opts = mongoc_ssl_opt_get_default(); mongoc_ssl_opt_t opts = *default_opts; mongoc_stream_t *ssl_buffered_stream_socket; ssl_buffered_stream_socket = mongoc_stream_tls_new_with_hostname(buffered_stream_sock, NULL, &opts, 0); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); mongoc_stream_destroy(ssl_buffered_stream_socket); DIFF_AND_RESET(streams_active, ==, -3); DIFF_AND_RESET(streams_disposed, ==, 3); used_ssl = true; } while (0); #endif if (!used_ssl) { mongoc_stream_destroy(buffered_stream_sock); DIFF_AND_RESET(streams_active, ==, -2); DIFF_AND_RESET(streams_disposed, ==, 2); } /* check a file stream. */ #ifdef WIN32 file_stream = mongoc_stream_file_new_for_path(BINARY_DIR "/temp.dat", O_CREAT | O_WRONLY | O_TRUNC, _S_IWRITE); #else file_stream = mongoc_stream_file_new_for_path(BINARY_DIR "/temp.dat", O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU); #endif BSON_ASSERT(file_stream); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); mongoc_stream_write(file_stream, buf, 16, TIMEOUT); DIFF_AND_RESET(streams_egress, ==, 16); DIFF_AND_RESET(streams_ingress, ==, 0); mongoc_stream_destroy(file_stream); DIFF_AND_RESET(streams_active, ==, -1); DIFF_AND_RESET(streams_disposed, ==, 1); file_stream = mongoc_stream_file_new_for_path(BINARY_DIR "/temp.dat", O_RDONLY, 0); BSON_ASSERT(file_stream); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); mongoc_stream_read(file_stream, buf, 16, 0, TIMEOUT); DIFF_AND_RESET(streams_egress, ==, 0); DIFF_AND_RESET(streams_ingress, ==, 16); mongoc_stream_destroy(file_stream); DIFF_AND_RESET(streams_active, ==, -1); DIFF_AND_RESET(streams_disposed, ==, 1); unlink(BINARY_DIR "/temp.dat"); /* check a gridfs stream. */ gridfs = mongoc_client_get_gridfs(client, "test", "fs", &err); ASSERT_OR_PRINT(gridfs, err); ret = mongoc_gridfs_drop(gridfs, &err); ASSERT_OR_PRINT(ret, err); reset_all_counters(); gridfs_opts.filename = "example"; file = mongoc_gridfs_create_file(gridfs, &gridfs_opts); ASSERT_OR_PRINT(file, err); gridfs_stream = mongoc_stream_gridfs_new(file); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); mongoc_stream_write(gridfs_stream, buf, 16, TIMEOUT); DIFF_AND_RESET(streams_egress, ==, 16); DIFF_AND_RESET(streams_ingress, ==, 0); mongoc_stream_destroy(gridfs_stream); DIFF_AND_RESET(streams_active, ==, -1); DIFF_AND_RESET(streams_disposed, ==, 1); DIFF_AND_RESET(streams_egress, >, 0); mongoc_gridfs_file_save(file); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_by_filename(gridfs, "example", &err); ASSERT_OR_PRINT(file, err); gridfs_stream = mongoc_stream_gridfs_new(file); DIFF_AND_RESET(streams_active, ==, 1); DIFF_AND_RESET(streams_disposed, ==, 0); RESET(streams_egress); mongoc_stream_read(gridfs_stream, buf, 16, 0, TIMEOUT); DIFF_AND_RESET(streams_egress, >, 0); DIFF_AND_RESET(streams_ingress, >, 16); mongoc_stream_destroy(gridfs_stream); DIFF_AND_RESET(streams_active, ==, -1); DIFF_AND_RESET(streams_disposed, ==, 1); mongoc_gridfs_file_destroy(file); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_counters_auth(void *ctx) { char *host_and_port = test_framework_get_host_and_port(); char *uri_str = test_framework_get_uri_str(); char *uri_str_bad = bson_strdup_printf("mongodb://%s:%s@%s/", "bad_user", "bad_pass", host_and_port); mongoc_client_t *client; mongoc_uri_t *uri; bool ret; bson_error_t err; BSON_UNUSED(ctx); uri = mongoc_uri_new(uri_str); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 99999); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 99999); reset_all_counters(); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); BSON_ASSERT(client); ret = mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &err); ASSERT_OR_PRINT(ret, err); DIFF_AND_RESET(auth_success, ==, 1); DIFF_AND_RESET(auth_failure, ==, 0); mongoc_uri_destroy(uri); bson_free(uri_str); bson_free(uri_str_bad); bson_free(host_and_port); mongoc_client_destroy(client); } static void test_counters_dns(void) { mongoc_client_t *client; mongoc_server_description_t *sd; bson_error_t err; reset_all_counters(); client = test_framework_new_default_client(); sd = mongoc_client_select_server(client, false, NULL, &err); ASSERT_OR_PRINT(sd, err); DIFF_AND_RESET(dns_success, >, 0); DIFF_AND_RESET(dns_failure, ==, 0); mongoc_server_description_destroy(sd); mongoc_client_destroy(client); client = test_framework_client_new("mongodb://invalidhostname/", NULL); test_framework_set_ssl_opts(client); sd = mongoc_client_select_server(client, false, NULL, &err); ASSERT(!sd); DIFF_AND_RESET(dns_success, ==, 0); DIFF_AND_RESET(dns_failure, ==, 1); mongoc_client_destroy(client); } static void test_counters_streams_timeout(void) { mock_server_t *server; bson_error_t err = {0}; bool ret; future_t *future; mongoc_client_t *client; request_t *request; mongoc_uri_t *uri; mongoc_server_description_t *sd; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 300); client = test_framework_client_new_from_uri(uri, NULL); mongoc_uri_destroy(uri); sd = mongoc_client_select_server(client, true, NULL, &err); mongoc_server_description_destroy(sd); reset_all_counters(); future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &err); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); mlib_sleep_for(350, us); request_destroy(request); ret = future_get_bool(future); BSON_ASSERT(!ret); future_destroy(future); /* can't ASSERT == because the mock server times out normally reading. */ DIFF_AND_RESET(streams_timeout, >=, 1); mongoc_client_destroy(client); mock_server_destroy(server); } typedef struct _rpc_op_egress_counters { int32_t op_egress_compressed; int32_t op_egress_delete; int32_t op_egress_getmore; int32_t op_egress_insert; int32_t op_egress_killcursors; int32_t op_egress_msg; int32_t op_egress_query; int32_t op_egress_total; int32_t op_egress_update; } rpc_op_egress_counters; static rpc_op_egress_counters rpc_op_egress_counters_current(void) { return (rpc_op_egress_counters){ .op_egress_compressed = mongoc_counter_op_egress_compressed_count(), .op_egress_delete = mongoc_counter_op_egress_delete_count(), .op_egress_getmore = mongoc_counter_op_egress_getmore_count(), .op_egress_insert = mongoc_counter_op_egress_insert_count(), .op_egress_killcursors = mongoc_counter_op_egress_killcursors_count(), .op_egress_msg = mongoc_counter_op_egress_msg_count(), .op_egress_query = mongoc_counter_op_egress_query_count(), .op_egress_total = mongoc_counter_op_egress_total_count(), .op_egress_update = mongoc_counter_op_egress_update_count(), }; } static void rpc_op_egress_counters_reset(void) { mongoc_counter_op_egress_compressed_reset(); mongoc_counter_op_egress_delete_reset(); mongoc_counter_op_egress_getmore_reset(); mongoc_counter_op_egress_insert_reset(); mongoc_counter_op_egress_killcursors_reset(); mongoc_counter_op_egress_msg_reset(); mongoc_counter_op_egress_query_reset(); mongoc_counter_op_egress_total_reset(); mongoc_counter_op_egress_update_reset(); } #define ASSERT_RPC_OP_EGRESS_COUNTERS(expected, actual) \ if (1) { \ const rpc_op_egress_counters e = (expected); \ const rpc_op_egress_counters a = (actual); \ ASSERT_WITH_MSG(e.op_egress_compressed == a.op_egress_compressed, \ "op_egress_compressed: expected %" PRId32 ", got %" PRId32, \ e.op_egress_compressed, \ a.op_egress_compressed); \ ASSERT_WITH_MSG(e.op_egress_delete == a.op_egress_delete, \ "op_egress_delete: expected %" PRId32 ", got %" PRId32, \ e.op_egress_delete, \ a.op_egress_delete); \ ASSERT_WITH_MSG(e.op_egress_getmore == a.op_egress_getmore, \ "op_egress_getmore: expected %" PRId32 ", got %" PRId32, \ e.op_egress_getmore, \ a.op_egress_getmore); \ ASSERT_WITH_MSG(e.op_egress_insert == a.op_egress_insert, \ "op_egress_insert: expected %" PRId32 ", got %" PRId32, \ e.op_egress_insert, \ a.op_egress_insert); \ ASSERT_WITH_MSG(e.op_egress_killcursors == a.op_egress_killcursors, \ "op_egress_killcursors: expected %" PRId32 ", got %" PRId32, \ e.op_egress_killcursors, \ a.op_egress_killcursors); \ ASSERT_WITH_MSG(e.op_egress_msg == a.op_egress_msg, \ "op_egress_msg: expected %" PRId32 ", got %" PRId32, \ e.op_egress_msg, \ a.op_egress_msg); \ ASSERT_WITH_MSG(e.op_egress_query == a.op_egress_query, \ "op_egress_query: expected %" PRId32 ", got %" PRId32, \ e.op_egress_query, \ a.op_egress_query); \ ASSERT_WITH_MSG(e.op_egress_total == a.op_egress_total, \ "op_egress_total: expected %" PRId32 ", got %" PRId32, \ e.op_egress_total, \ a.op_egress_total); \ ASSERT_WITH_MSG(e.op_egress_update == a.op_egress_update, \ "op_egress_update: expected %" PRId32 ", got %" PRId32, \ e.op_egress_update, \ a.op_egress_update); \ } else \ (void)0 #define ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected) \ ASSERT_RPC_OP_EGRESS_COUNTERS(expected, rpc_op_egress_counters_current()) typedef struct _server_monitor_autoresponder_data { const char *hello; int *responses; } server_monitor_autoresponder_data; static bool test_counters_rpc_op_egress_autoresponder(request_t *request, void *data) { BSON_ASSERT_PARAM(data); server_monitor_autoresponder_data *const ar_data = data; ASSERT(ar_data->responses); ASSERT(ar_data->hello); (*ar_data->responses) += 1; if (strcmp(request->command_name, HANDSHAKE_CMD_HELLO) == 0 || strcmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) == 0) { reply_to_request_simple(request, ar_data->hello); request_destroy(request); } else { ASSERT_WITH_MSG(request->is_command, "expected only handshakes and commands, but got: %s", request->as_str); reply_to_request_with_ok_and_destroy(request); } return true; } static void _test_counters_rpc_op_egress_cluster_single(bool with_op_msg) { const rpc_op_egress_counters zero = {0}; const char *const hello = tmp_str("{'ok': 1,%s" " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", with_op_msg ? " 'helloOk': true," : "", WIRE_VERSION_MIN, WIRE_VERSION_MAX); rpc_op_egress_counters_reset(); mock_server_t *const server = mock_server_new(); mock_server_run(server); bson_error_t error = {0}; mongoc_client_t *const client = mongoc_client_new_from_uri_with_error(mock_server_get_uri(server), &error); ASSERT_OR_PRINT(client, error); // Stable API for Drivers spec: If an API version was declared, drivers MUST // NOT use the legacy hello command during the initial handshake or // afterwards. Instead, drivers MUST use the `hello` command exclusively and // use the `OP_MSG` protocol. if (with_op_msg) { mongoc_server_api_t *const api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); mongoc_server_api_destroy(api); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); rpc_op_egress_counters expected = {0}; int32_t *const handshake_counter = with_op_msg ? &expected.op_egress_msg : &expected.op_egress_query; { const bson_t *const command = tmp_bson("{'ping': 1}"); // Trigger: // - mongoc_topology_scanner_node_setup // - mongoc_cluster_run_command_monitored future_t *const ping = future_client_command_simple(client, "db", command, NULL, NULL, &error); { request_t *const request = with_op_msg ? mock_server_receives_hello_op_msg(server) : mock_server_receives_legacy_hello(server, NULL); // OP_QUERY 1 / OP_MSG 1: // - by _mongoc_rpc_op_egress_inc // - by _mongoc_async_cmd_phase_send // - by mongoc_async_cmd_run // - by mongoc_async_run // - by mongoc_topology_scanner_work // - by mongoc_topology_scan_once // - by _mongoc_topology_do_blocking_scan // - by mongoc_topology_select_server_id // - by _mongoc_cluster_select_server_id // - by _mongoc_cluster_stream_for_optype // - by mongoc_cluster_stream_for_reads // - by mongoc_client_command_simple *handshake_counter += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_simple(request, hello); request_destroy(request); } { request_t *const request = mock_server_receives_msg(server, MONGOC_MSG_NONE, command); // OP_MSG 1 / OP_MSG 2: // - by _mongoc_rpc_op_egress_inc // - by mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_monitored // - by _mongoc_client_command_with_stream // - by mongoc_client_command_simple expected.op_egress_msg += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_with_ok_and_destroy(request); } ASSERT_OR_PRINT(future_get_bool(ping), error); future_destroy(ping); } // Ensure no extra requests. { int responses = 0; server_monitor_autoresponder_data data = {.hello = hello, .responses = &responses}; mock_server_autoresponds(server, test_counters_rpc_op_egress_autoresponder, &data, NULL); mongoc_client_destroy(client); mock_server_destroy(server); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void test_counters_rpc_op_egress_cluster_single_op_query(void) { _test_counters_rpc_op_egress_cluster_single(false); } static void test_counters_rpc_op_egress_cluster_single_op_msg(void) { _test_counters_rpc_op_egress_cluster_single(true); } static void test_counters_rpc_op_egress_cluster_legacy(void) { const rpc_op_egress_counters zero = {0}; const char *const hello = tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); rpc_op_egress_counters_reset(); mock_server_t *const server = mock_server_new(); mock_server_run(server); bson_error_t error = {0}; mongoc_client_t *const client = mongoc_client_new_from_uri_with_error(mock_server_get_uri(server), &error); ASSERT_OR_PRINT(client, error); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); rpc_op_egress_counters expected = {0}; // Client must know a writeable server to trigger OP_KILL_CURSORS. { const bson_t *const command = tmp_bson("{'ping': 1}"); future_t *const ping = future_client_command_simple(client, "db", command, NULL, NULL, &error); { request_t *const request = mock_server_receives_legacy_hello(server, NULL); // OP_QUERY 1: // - by _mongoc_rpc_op_egress_inc // - by _mongoc_async_cmd_phase_send // - by mongoc_async_cmd_run // - by mongoc_async_run // - by mongoc_topology_scanner_work // - by mongoc_topology_scan_once // - by _mongoc_topology_do_blocking_scan // - by mongoc_topology_select_server_id // - by _mongoc_cluster_select_server_id // - by _mongoc_cluster_stream_for_optype // - by mongoc_cluster_stream_for_reads // - by mongoc_client_command_simple expected.op_egress_query += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_simple(request, hello); request_destroy(request); } { request_t *const request = mock_server_receives_msg(server, MONGOC_MSG_NONE, command); // OP_MSG 1: // - by _mongoc_rpc_op_egress_inc // - by mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_monitored // - by _mongoc_client_command_with_stream // - by mongoc_client_command_simple expected.op_egress_msg += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_with_ok_and_destroy(request); } ASSERT_OR_PRINT(future_get_bool(ping), error); future_destroy(ping); } // Ensure no extra requests. { int responses = 0; server_monitor_autoresponder_data data = {.hello = hello, .responses = &responses}; mock_server_autoresponds(server, test_counters_rpc_op_egress_autoresponder, &data, NULL); mongoc_client_destroy(client); mock_server_destroy(server); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void _test_counters_rpc_op_egress_cluster_pooled(bool with_op_msg) { const rpc_op_egress_counters zero = {0}; const char *const hello = tmp_str("{'ok': 1,%s" " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", with_op_msg ? " 'helloOk': true," : "", WIRE_VERSION_MIN, WIRE_VERSION_MAX); rpc_op_egress_counters_reset(); mock_server_t *const server = mock_server_new(); mock_server_run(server); bson_error_t error = {0}; mongoc_client_pool_t *const pool = mongoc_client_pool_new_with_error(mock_server_get_uri(server), &error); ASSERT_OR_PRINT(pool, error); // Stable API for Drivers spec: If an API version was declared, drivers MUST // NOT use the legacy hello command during the initial handshake or // afterwards. Instead, drivers MUST use the `hello` command exclusively and // use the `OP_MSG` protocol. if (with_op_msg) { mongoc_server_api_t *const api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_pool_set_server_api(pool, api, &error), error); mongoc_server_api_destroy(api); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); // Trigger: _server_monitor_check_server mongoc_client_t *const client = mongoc_client_pool_pop(pool); rpc_op_egress_counters expected = {0}; int32_t *const handshake_counter = with_op_msg ? &expected.op_egress_msg : &expected.op_egress_query; { request_t *const request = with_op_msg ? mock_server_receives_hello_op_msg(server) : mock_server_receives_legacy_hello(server, NULL); // OP_QUERY 1 / OP_MSG 1: // - by _mongoc_rpc_op_egress_inc // - by one of: // - _server_monitor_send_and_recv_opquery // - _server_monitor_send_and_recv_hello_opmsg // - by _server_monitor_send_and_recv // - by _server_monitor_setup_connection // - by _server_monitor_check_server // - by _server_monitor_thread *handshake_counter += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_simple(request, hello); request_destroy(request); } { const bson_t *const command = tmp_bson("{'ping': 1}"); future_t *const ping = future_client_command_simple(client, "db", command, NULL, NULL, &error); { request_t *const request = with_op_msg ? mock_server_receives_hello_op_msg(server) : mock_server_receives_legacy_hello(server, NULL); // OP_QUERY 2 / OP_MSG 2: // - by _mongoc_rpc_op_egress_inc // - by one of: // - mongoc_cluster_run_command_opquery // - mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_private // - by _stream_run_hello // - by _cluster_run_hello // - by _cluster_add_node // - by _cluster_fetch_stream_pooled // - by _try_get_server_stream // - by _mongoc_cluster_stream_for_server // - by _mongoc_cluster_stream_for_optype // - by mongoc_cluster_stream_for_reads // - by mongoc_client_command_simple *handshake_counter += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_simple(request, hello); request_destroy(request); } { request_t *const request = mock_server_receives_msg(server, MONGOC_MSG_NONE, command); // OP_MSG 1 / OP_MSG 3: // - by _mongoc_rpc_op_egress_inc // - by mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_monitored // - by _mongoc_client_command_with_stream // - by mongoc_client_command_simple expected.op_egress_msg += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_with_ok_and_destroy(request); } ASSERT_OR_PRINT(future_get_bool(ping), error); future_destroy(ping); } // Ensure no extra requests. { int responses = 0; server_monitor_autoresponder_data data = {.hello = hello, .responses = &responses}; mock_server_autoresponds(server, test_counters_rpc_op_egress_autoresponder, &data, NULL); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mock_server_destroy(server); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void test_counters_rpc_op_egress_cluster_pooled_op_query(void) { _test_counters_rpc_op_egress_cluster_pooled(false); } static void test_counters_rpc_op_egress_cluster_pooled_op_msg(void) { _test_counters_rpc_op_egress_cluster_pooled(true); } static void _test_counters_rpc_op_egress_awaitable_hello(bool with_op_msg) { const rpc_op_egress_counters zero = {0}; const char *const hello = tmp_str("{'ok': 1,%s" " 'isWritablePrimary': true," " 'topologyVersion': {" " 'processId': {'$oid': '000000000000000000000001'}," " 'counter': {'$numberLong': '1'}" " }," " 'minWireVersion': %d," " 'maxWireVersion': %d}", with_op_msg ? " 'helloOk': true," : "", WIRE_VERSION_MIN, WIRE_VERSION_MAX); rpc_op_egress_counters_reset(); mock_server_t *const server = mock_server_new(); mock_server_run(server); bson_error_t error = {0}; mongoc_uri_t *const uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_client_pool_t *const pool = mongoc_client_pool_new_with_error(uri, &error); ASSERT_OR_PRINT(pool, error); // Stable API for Drivers spec: If an API version was declared, drivers MUST // NOT use the legacy hello command during the initial handshake or // afterwards. Instead, drivers MUST use the `hello` command exclusively and // use the `OP_MSG` protocol. if (with_op_msg) { mongoc_server_api_t *const api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_pool_set_server_api(pool, api, &error), error); mongoc_server_api_destroy(api); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); // Trigger: // - _server_monitor_setup_connection // - _server_monitor_polling_hello // - _server_monitor_awaitable_hello mongoc_client_t *const client = mongoc_client_pool_pop(pool); // Hold on to awaitable hello request. request_t *awaitable_hello = NULL; // The order of requests from the monitor and RTT threads may vary, so handle // all four requests before asserting counters. for (int i = 0; i < 4; ++i) { request_t *const request = mock_server_receives_request(server); if (strstr(request->as_str, "maxAwaitTimeMS")) { ASSERT_WITH_MSG(!awaitable_hello, "received more than one awaitable hello"); awaitable_hello = request; } else { const bool is_hello = strcmp(request->command_name, HANDSHAKE_CMD_HELLO) == 0; const bool is_legacy_hello = strcmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) == 0; if (with_op_msg) { ASSERT_WITH_MSG(is_hello, "expected only OP_MSG hello requests, but got: %s", request->as_str); } else { ASSERT_WITH_MSG(is_hello || is_legacy_hello, "expected only hello requests, but got: %s", request->as_str); } reply_to_request_simple(request, hello); request_destroy(request); } } rpc_op_egress_counters expected = {0}; int32_t *const handshake_counter = with_op_msg ? &expected.op_egress_msg : &expected.op_egress_query; // OP_QUERY 1 / OP_MSG 1: // - by _mongoc_rpc_op_egress_inc // - by one of: // - _server_monitor_send_and_recv_opquery // - _server_monitor_send_and_recv_hello_opmsg // - by _server_monitor_send_and_recv // - by _server_monitor_setup_connection // - by _server_monitor_check_server // - by _server_monitor_thread // OP_QUERY 2 / OP_MSG 2: // - by _mongoc_rpc_op_egress_inc // - by one of: // - _server_monitor_send_and_recv_opquery // - _server_monitor_send_and_recv_hello_opmsg // - by _server_monitor_send_and_recv // - by _server_monitor_setup_connection // - by _server_monitor_ping_server // - by _server_monitor_rtt_thread // OP_QUERY 3 / OP_MSG 3: // - by _mongoc_rpc_op_egress_inc // - by one of: // - _server_monitor_send_and_recv_opquery // - _server_monitor_send_and_recv_hello_opmsg // - by _server_monitor_send_and_recv // - by _server_monitor_polling_hello // - by _server_monitor_ping_server // - by _server_monitor_rtt_thread *handshake_counter += 3; expected.op_egress_total += 3; // OP_MSG 1 / OP_MSG 3: // - by _mongoc_rpc_op_egress_inc // - by _server_monitor_awaitable_hello_send // - by _server_monitor_awaitable_hello // - by _server_monitor_check_server // - by _server_monitor_thread expected.op_egress_msg += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); { const bson_t *const command = tmp_bson("{'ping': 1}"); // Trigger: // - mongoc_cluster_run_command_private // - mongoc_cluster_run_command_monitored future_t *const ping = future_client_command_simple(client, "db", command, NULL, NULL, &error); { request_t *const request = with_op_msg ? mock_server_receives_hello_op_msg(server) : mock_server_receives_legacy_hello(server, NULL); // OP_QUERY 4 / OP_MSG 5: // - by _mongoc_rpc_op_egress_inc // - by one of: // - mongoc_cluster_run_command_opquery // - mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_private // - by _stream_run_hello // - by _cluster_run_hello // - by _cluster_add_node // - by _cluster_fetch_stream_pooled // - by _try_get_server_stream // - by _mongoc_cluster_stream_for_server // - by _mongoc_cluster_stream_for_optype // - by mongoc_cluster_stream_for_reads // - by mongoc_client_command_simple *handshake_counter += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_simple(request, hello); request_destroy(request); } { request_t *const request = mock_server_receives_msg(server, MONGOC_MSG_NONE, command); // OP_MSG 2 / OP_MSG 6: // - by _mongoc_rpc_op_egress_inc // - by mongoc_cluster_run_opmsg // - by mongoc_cluster_run_command_monitored // - by _mongoc_client_command_with_stream // - by mongoc_client_command_simple expected.op_egress_msg += 1; expected.op_egress_total += 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); reply_to_request_with_ok_and_destroy(request); } ASSERT_OR_PRINT(future_get_bool(ping), error); future_destroy(ping); } // Ensure successful client creation and no extra requests. { int responses = 0; server_monitor_autoresponder_data data = {.hello = hello, .responses = &responses}; mock_server_autoresponds(server, test_counters_rpc_op_egress_autoresponder, &data, NULL); mongoc_uri_destroy(uri); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); // Reply to awaitable hello after destroying the client pool to avoid // triggering additional awaitable hello requests. reply_to_request_simple(awaitable_hello, hello); request_destroy(awaitable_hello); mock_server_destroy(server); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void test_counters_rpc_op_egress_awaitable_hello_op_query(void) { _test_counters_rpc_op_egress_awaitable_hello(false); } static void test_counters_rpc_op_egress_awaitable_hello_op_msg(void) { _test_counters_rpc_op_egress_awaitable_hello(true); } static void _test_counters_rpc_op_egress_mock_server(bool with_op_msg) { const rpc_op_egress_counters zero = {0}; rpc_op_egress_counters_reset(); mock_server_t *server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); bson_error_t error = {0}; mongoc_client_t *const client = mongoc_client_new_from_uri_with_error(mock_server_get_uri(server), &error); ASSERT_OR_PRINT(client, error); // Stable API for Drivers spec: If an API version was declared, drivers MUST // NOT use the legacy hello command during the initial handshake or // afterwards. Instead, drivers MUST use the `hello` command exclusively and // use the `OP_MSG` protocol. if (with_op_msg) { mongoc_server_api_t *const api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); mongoc_server_api_destroy(api); } ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); { const bson_t *const command = tmp_bson("{'ping': 1}"); future_t *const future = future_client_command_simple(client, "db", command, NULL, NULL, &error); reply_to_request_with_ok_and_destroy(mock_server_receives_msg(server, MONGOC_MSG_NONE, command)); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); } // Handshake (OP_QUERY 1 / OP_MSG 1) + command (OP_MSG 1 / OP_MSG 2). // Mock server replies should not contribute RPC egress counters. const rpc_op_egress_counters expected = { .op_egress_msg = with_op_msg ? 2 : 1, .op_egress_query = with_op_msg ? 0 : 1, .op_egress_total = 2, }; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); mongoc_client_destroy(client); mock_server_destroy(server); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void test_counters_rpc_op_egress_mock_server_op_query(void) { _test_counters_rpc_op_egress_mock_server(false); } static void test_counters_rpc_op_egress_mock_server_op_msg(void) { _test_counters_rpc_op_egress_mock_server(true); } #if defined(MONGOC_ENABLE_SSL) static void wait_for_background_threads(rpc_op_egress_counters expected) { rpc_op_egress_counters current = rpc_op_egress_counters_current(); // Wait up to 10 seconds (default heartbeat frequency) for the server monitor // and/or RTT threads to complete their initial handshake and hello requests. for (int i = 0; i < 100; ++i) { if (current.op_egress_total >= expected.op_egress_total) { return; } mlib_sleep_for(100, ms); current = rpc_op_egress_counters_current(); } ASSERT_WITH_MSG(false, "expected %" PRId32 " total requests by background threads, but observed %" PRId32 " total requests", expected.op_egress_total, current.op_egress_total); } static void _test_counters_auth(bool with_op_msg, bool pooled) { const rpc_op_egress_counters zero = {0}; // Number of messages sent by background threads depend on the number of // members in the replica set. const size_t member_count_zu = test_framework_replset_member_count(); ASSERT(mlib_in_range(int32_t, member_count_zu)); const int32_t member_count = (int32_t)member_count_zu; // MongoDB Handshake Spec: Since MongoDB server 4.4, the initial handshake // supports a new argument, `speculativeAuthenticate`, provided as a BSON // document. Clients specifying this argument to hello or legacy hello will // speculatively include the first command of an authentication handshake. const bool has_speculative_auth = test_framework_get_server_version() >= test_framework_str_to_version("4.4.0"); // Used to calculate expected values of OP_COMPRESSED RPC egress counter. const int32_t has_compressors = test_framework_has_compressors(); // Stable API for Drivers spec: If an API version was declared, drivers // MUST NOT use the legacy hello command during the initial handshake or // afterwards. Instead, drivers MUST use the `hello` command exclusively // and use the `OP_MSG` protocol. mongoc_server_api_t *const api = with_op_msg ? mongoc_server_api_new(MONGOC_SERVER_API_V1) : NULL; // SCRAM-SHA-1 is available since MongoDB server 3.0 and forces OP_MSG // requests for authentication steps that follow the initial connection // handshake even with speculative authentication. const char *const auth_mechanism = "SCRAM-SHA-1"; char *const test_user = test_framework_get_admin_user(); char *const test_password = test_framework_get_admin_password(); bson_error_t error = {0}; // Obtain URI before resetting RPC egress counters. char *const uri_str = test_framework_get_uri_str(); // Setup complete: reset counters now. rpc_op_egress_counters_reset(); mongoc_uri_t *const uri = mongoc_uri_new_with_error(uri_str, &error); ASSERT_OR_PRINT(uri, error); mongoc_uri_set_username(uri, test_user); mongoc_uri_set_password(uri, test_password); // Specify the authentication mechanism to ensure deterministic request // behavior during testing. ASSERT(mongoc_uri_set_auth_mechanism(uri, auth_mechanism)); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); mongoc_client_pool_t *pool = NULL; mongoc_client_t *client = NULL; if (pooled) { // Note: no server API version ensures OP_QUERY for initial handshake. pool = test_framework_client_pool_new_from_uri(uri, api); test_framework_set_pool_ssl_opts(pool); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); // Trigger server monitor and/or RTT thread startup. client = mongoc_client_pool_pop(pool); // Awaitable hello is also a 4.4+ feature. if (has_speculative_auth) { rpc_op_egress_counters expected = {0}; int32_t *const handshake_counter = with_op_msg ? &expected.op_egress_msg : &expected.op_egress_query; // OP_QUERY / OP_MSG (for each replset member): // - initial connection handshake by server monitor thread // - initial connection handshake by RTT monitor thread // - polling hello by RTT monitor thread *handshake_counter += 3 * member_count; expected.op_egress_total += 3 * member_count; // OP_MSG (for each replset member): // - awaitable hello by server monitor thread expected.op_egress_msg += member_count; expected.op_egress_total += member_count; wait_for_background_threads(expected); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } else { // OP_QUERY / OP_MSG (for each replset member): // - initial connection handshake by server monitor const rpc_op_egress_counters expected = { .op_egress_msg = with_op_msg ? member_count : 0, .op_egress_query = with_op_msg ? 0 : member_count, .op_egress_total = member_count, }; wait_for_background_threads(expected); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } } else { client = test_framework_client_new_from_uri(uri, api); test_framework_set_ssl_opts(client); ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(zero); } mongoc_counter_auth_success_reset(); mongoc_counter_auth_failure_reset(); rpc_op_egress_counters_reset(); // Trigger: // - one of (depending on `pooled`): // - _cluster_fetch_stream_single // - _cluster_fetch_stream_pooled // - _cluster_run_hello (SASL step 1 if `has_speculative_auth`) // - _mongoc_cluster_auth_node (if not `has_speculative_auth`) // - mongoc_cluster_run_command_monitored ASSERT_OR_PRINT(mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error), error); const int32_t auth_success = mongoc_counter_auth_success_count(); const int32_t auth_failure = mongoc_counter_auth_failure_count(); // Ensure we are not testing more than we intend. ASSERT_WITH_MSG(auth_success == 1 && auth_failure == 0, "expected exactly one authentication attempt to succeed, " "but observed %" PRId32 " successes and %" PRId32 " failures", auth_success, auth_failure); rpc_op_egress_counters expected = {0}; int32_t *const handshake_counter = with_op_msg ? &expected.op_egress_msg : &expected.op_egress_query; // The number of expected OP_QUERY requests depends on pooling and the // presence of the RTT monitor thread. if (pooled) { // OP_QUERY / OP_MSG: // - initial connection handshake by new cluster node *handshake_counter += 1; expected.op_egress_total += 1; } else { // OP_QUERY / OP_MSG (for each replset member): // - initial connection handshake *handshake_counter += member_count; expected.op_egress_total += member_count; } // The number of authentication steps depends on speculative authentication. if (has_speculative_auth) { // OP_MSG: _mongoc_cluster_finish_speculative_auth (SASL step 2) expected.op_egress_msg += 1; expected.op_egress_total += 1; } else { // OP_MSG: _mongoc_cluster_auth_node (SASL step 1) // OP_MSG: _mongoc_cluster_auth_node (SASL step 2) // OP_MSG: _mongoc_cluster_auth_node (SASL step 3) expected.op_egress_msg += 3; expected.op_egress_total += 3; } // OP_MSG (+ OP_COMPRESSED): mongoc_cluster_run_command_monitored (ping) expected.op_egress_compressed += has_compressors; expected.op_egress_msg += 1; expected.op_egress_total += has_compressors + 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); mongoc_server_api_destroy(api); bson_free(uri_str); mongoc_uri_destroy(uri); bson_free(test_password); bson_free(test_user); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } // OP_MSG (+ OP_COMPRESSED): _mongoc_client_end_sessions (endSessions) expected.op_egress_compressed += has_compressors; expected.op_egress_msg += 1; expected.op_egress_total += has_compressors + 1; ASSERT_RPC_OP_EGRESS_COUNTERS_CURRENT(expected); } static void test_counters_auth_single_op_query(void *context) { BSON_UNUSED(context); _test_counters_auth(false, false); } static void test_counters_auth_single_op_msg(void *context) { BSON_UNUSED(context); _test_counters_auth(true, false); } static void test_counters_auth_pooled_op_query(void *context) { BSON_UNUSED(context); _test_counters_auth(false, true); } static void test_counters_auth_pooled_op_msg(void *context) { BSON_UNUSED(context); _test_counters_auth(true, true); } #endif #endif void test_counters_install(TestSuite *suite) { BSON_UNUSED(suite); #ifdef MONGOC_ENABLE_SHM_COUNTERS TestSuite_AddFull(suite, "/counters/op_msg [lock:live-server]", test_counters_op_msg, NULL, NULL, test_framework_skip_if_compressors, TestSuite_CheckLive); TestSuite_AddFull(suite, "/counters/op_compressed [lock:live-server]", test_counters_op_compressed, NULL, NULL, test_framework_skip_if_no_compressors, TestSuite_CheckLive); TestSuite_AddLive(suite, "/counters/cursors", test_counters_cursors); TestSuite_AddLive(suite, "/counters/clients", test_counters_clients); TestSuite_AddFull( suite, "/counters/streams [lock:live-server]", test_counters_streams, NULL, NULL, TestSuite_CheckLive); TestSuite_AddFull(suite, "/counters/auth [lock:live-server]", test_counters_auth, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_not_single); TestSuite_AddLive(suite, "/counters/dns", test_counters_dns); TestSuite_AddMockServerTest(suite, "/counters/streams_timeout", test_counters_streams_timeout); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/cluster/single/op_query", test_counters_rpc_op_egress_cluster_single_op_query); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/cluster/single/op_msg", test_counters_rpc_op_egress_cluster_single_op_msg); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/cluster/legacy", test_counters_rpc_op_egress_cluster_legacy); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/cluster/pooled/op_query", test_counters_rpc_op_egress_cluster_pooled_op_query); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/cluster/pooled/op_msg", test_counters_rpc_op_egress_cluster_pooled_op_msg); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/awaitable_hello/op_query", test_counters_rpc_op_egress_awaitable_hello_op_query); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/awaitable_hello/op_msg", test_counters_rpc_op_egress_awaitable_hello_op_msg); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/mock_server/op_query", test_counters_rpc_op_egress_mock_server_op_query); TestSuite_AddMockServerTest( suite, "/counters/rpc/op_egress/mock_server/op_msg", test_counters_rpc_op_egress_mock_server_op_msg); #if defined(MONGOC_ENABLE_SSL) TestSuite_AddFull(suite, "/counters/rpc/op_egress/auth/single/op_query [lock:live-server]", test_counters_auth_single_op_query, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/counters/rpc/op_egress/auth/single/op_msg [lock:live-server]", test_counters_auth_single_op_msg, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_max_wire_version_less_than_13, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/counters/rpc/op_egress/auth/pooled/op_query [lock:live-server]", test_counters_auth_pooled_op_query, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/counters/rpc/op_egress/auth/pooled/op_msg [lock:live-server]", test_counters_auth_pooled_op_msg, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_max_wire_version_less_than_13, test_framework_skip_if_not_replset); #endif // defined(MONGOC_ENABLE_SSL) #endif } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-crud.c000066400000000000000000001423351511661753600236270ustar00rootroot00000000000000#include #include #include #include #include #include #include static bool crud_test_operation_cb(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bson_t reply; bool res; res = json_test_operation(ctx, test, operation, ctx->collection, NULL, &reply); bson_destroy(&reply); return res; } static void test_crud_cb(void *scenario) { json_test_config_t config = JSON_TEST_CONFIG_INIT; config.run_operation_cb = crud_test_operation_cb; config.command_started_events_only = true; config.scenario = scenario; run_json_general_test(&config); } static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite_with_check( suite, JSON_DIR, "crud/legacy", &test_crud_cb, test_framework_skip_if_no_crypto, TestSuite_CheckLive); /* Read/write concern spec tests use the same format. */ install_json_test_suite_with_check( suite, JSON_DIR, "read_write_concern/operation", &test_crud_cb, TestSuite_CheckLive); } static void prose_test_1(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; bool ret; bson_t reply; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); coll = get_test_collection(client, "coll"); ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}, " " 'data': {'failCommands': ['insert'], 'writeConcernError': {" " 'code': 100, 'codeName': 'UnsatisfiableWriteConcern', " " 'errmsg': 'Not enough data-bearing nodes', " " 'errInfo': {'writeConcern': {'w': 2, 'wtimeout': 0, " " 'provenance': 'clientSupplied'}}}}}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_insert_one(coll, tmp_bson("{'x':1}"), NULL /* opts */, &reply, &error); ASSERT(!ret); /* libmongoc does not model WriteConcernError, so we only assert that the * "errInfo" field set in configureFailPoint matches that in the result */ ASSERT_MATCH(&reply, "{'writeConcernErrors': [{'errInfo': {'writeConcern': {" "'w': 2, 'wtimeout': 0, 'provenance': 'clientSupplied'}}}]}"); bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } typedef struct { bool has_reply; bson_t reply; } prose_test_2_apm_ctx_t; static void prose_test_2_command_succeeded(const mongoc_apm_command_succeeded_t *event) { if (!strcmp(mongoc_apm_command_succeeded_get_command_name(event), "insert")) { prose_test_2_apm_ctx_t *ctx = mongoc_apm_command_succeeded_get_context(event); ASSERT(!ctx->has_reply); ctx->has_reply = true; bson_copy_to(mongoc_apm_command_succeeded_get_reply(event), &ctx->reply); } } static void prose_test_2(void *ctx) { mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *coll, *coll_created; mongoc_apm_callbacks_t *callbacks; prose_test_2_apm_ctx_t apm_ctx = {0}; bool ret; bson_t reply, reply_errInfo, observed_errInfo; bson_error_t error = {0}; BSON_UNUSED(ctx); client = test_framework_new_default_client(); db = get_test_database(client); coll = get_test_collection(client, "coll"); /* don't care if ns not found. */ (void)mongoc_collection_drop(coll, NULL); coll_created = mongoc_database_create_collection( db, mongoc_collection_get_name(coll), tmp_bson("{'validator': {'x': {'$type': 'string'}}}"), &error); ASSERT_OR_PRINT(coll_created, error); mongoc_collection_destroy(coll_created); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, prose_test_2_command_succeeded); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&apm_ctx); mongoc_apm_callbacks_destroy(callbacks); ret = mongoc_collection_insert_one(coll, tmp_bson("{'x':1}"), NULL /* opts */, &reply, &error); ASSERT(!ret); /* Assert that the WriteError's code is DocumentValidationFailure */ ASSERT_MATCH(&reply, "{'writeErrors': [{'code': 121}]}"); /* libmongoc does not model WriteError, so we only assert that the observed * "errInfo" field matches that in the result */ ASSERT(apm_ctx.has_reply); bson_lookup_doc(&apm_ctx.reply, "writeErrors.0.errInfo", &observed_errInfo); bson_lookup_doc(&reply, "writeErrors.0.errInfo", &reply_errInfo); ASSERT(bson_compare(&reply_errInfo, &observed_errInfo) == 0); bson_destroy(&apm_ctx.reply); bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_client_destroy(client); } typedef struct { // `ops_counts` is a BSON document of this form: // { "0": , "1": ... } bson_t ops_counts; // `operation_ids` is a BSON document of this form: // { "0": , "1": ... } bson_t operation_ids; // `write_concerns` is a BSON document of this form: // { "0": , "1": ... } bson_t write_concerns; int numGetMore; int numKillCursors; } bulkWrite_ctx; // `bulkWrite_cb` records the number of `ops` in each sent `bulkWrite` to a BSON // document of this form: // { "0": , "1": ... } static void bulkWrite_cb(const mongoc_apm_command_started_t *event) { bulkWrite_ctx *ctx = mongoc_apm_command_started_get_context(event); const char *cmd_name = mongoc_apm_command_started_get_command_name(event); if (0 == strcmp(cmd_name, "bulkWrite")) { const bson_t *cmd = mongoc_apm_command_started_get_command(event); bson_iter_t ops_iter; // Count the number of `ops`. ASSERT(bson_iter_init_find(&ops_iter, cmd, "ops")); bson_t ops; bson_iter_bson(&ops_iter, &ops); uint32_t ops_count = bson_count_keys(&ops); // Record. char *key = bson_strdup_printf("%" PRIu32, bson_count_keys(&ctx->ops_counts)); BSON_APPEND_INT64(&ctx->ops_counts, key, ops_count); BSON_APPEND_INT64(&ctx->operation_ids, key, mongoc_apm_command_started_get_operation_id(event)); // Record write concern (if present). bson_iter_t wc_iter; if (bson_iter_init_find(&wc_iter, cmd, "writeConcern")) { BSON_APPEND_ITER(&ctx->write_concerns, key, &wc_iter); } else { BSON_APPEND_NULL(&ctx->write_concerns, key); } bson_free(key); } if (0 == strcmp(cmd_name, "getMore")) { ctx->numGetMore++; } if (0 == strcmp(cmd_name, "killCursors")) { ctx->numKillCursors++; } } // `capture_bulkWrite_info` captures event data relevant to some bulk write prose tests. static bulkWrite_ctx * capture_bulkWrite_info(mongoc_client_t *client) { bulkWrite_ctx *cb_ctx = bson_malloc0(sizeof(*cb_ctx)); bson_init(&cb_ctx->ops_counts); bson_init(&cb_ctx->operation_ids); bson_init(&cb_ctx->write_concerns); mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, bulkWrite_cb); mongoc_client_set_apm_callbacks(client, cbs, cb_ctx); mongoc_apm_callbacks_destroy(cbs); return cb_ctx; } static void bulkWrite_ctx_reset(bulkWrite_ctx *cb_ctx) { bson_reinit(&cb_ctx->ops_counts); bson_reinit(&cb_ctx->operation_ids); bson_reinit(&cb_ctx->write_concerns); cb_ctx->numGetMore = 0; cb_ctx->numKillCursors = 0; } static void bulkWrite_ctx_destroy(bulkWrite_ctx *cb_ctx) { if (!cb_ctx) { return; } bson_destroy(&cb_ctx->ops_counts); bson_destroy(&cb_ctx->operation_ids); bson_destroy(&cb_ctx->write_concerns); bson_free(cb_ctx); } static void prose_test_3(void *ctx) { /* `MongoClient.bulkWrite` batch splits a `writeModels` input with greater than `maxWriteBatchSize` operations */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Get `maxWriteBatchSize` from the server. int32_t maxWriteBatchSize; { bson_t reply; ok = mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, &reply, &error); ASSERT_OR_PRINT(ok, error); maxWriteBatchSize = bson_lookup_int32(&reply, "maxWriteBatchSize"); bson_destroy(&reply); } bson_t *doc = tmp_bson("{'a': 'b'}"); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); for (int32_t i = 0; i < maxWriteBatchSize + 1; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, NULL /* options */); ASSERT(ret.res); ASSERT_CMPINT64(mongoc_bulkwriteresult_insertedcount(ret.res), ==, maxWriteBatchSize + 1); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); // Assert first `bulkWrite` sends `maxWriteBatchSize` ops. // Assert second `bulkWrite` sends 1 op. bson_t expect = BSON_INITIALIZER; BSON_APPEND_INT64(&expect, "0", maxWriteBatchSize); BSON_APPEND_INT64(&expect, "1", 1); ASSERT_EQUAL_BSON(&expect, &cb_ctx->ops_counts); bson_destroy(&expect); // Assert both have the same `operation_id`. int64_t operation_id_0 = bson_lookup_int64(&cb_ctx->operation_ids, "0"); int64_t operation_id_1 = bson_lookup_int64(&cb_ctx->operation_ids, "1"); ASSERT_CMPINT64(operation_id_0, ==, operation_id_1); mongoc_bulkwrite_destroy(bw); bulkWrite_ctx_destroy(cb_ctx); mongoc_client_destroy(client); } static char * repeat_char(char c, int32_t count) { ASSERT(mlib_in_range(size_t, count)); char *str = bson_malloc(count + 1); memset(str, c, count); str[count] = '\0'; return str; } typedef struct { int32_t maxBsonObjectSize; int32_t maxMessageSizeBytes; int32_t maxWriteBatchSize; } server_limits_t; static server_limits_t get_server_limits(mongoc_client_t *client) { server_limits_t sl; bson_error_t error; bson_t reply; ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, &reply, &error), error); sl.maxBsonObjectSize = bson_lookup_int32(&reply, "maxBsonObjectSize"); sl.maxMessageSizeBytes = bson_lookup_int32(&reply, "maxMessageSizeBytes"); sl.maxWriteBatchSize = bson_lookup_int32(&reply, "maxWriteBatchSize"); bson_destroy(&reply); return sl; } static void prose_test_4(void *ctx) { /* `MongoClient.bulkWrite` batch splits when an `ops` payload exceeds `maxMessageSizeBytes` */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Get `maxWriteBatchSize` and `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxMessageSizeBytes = sl.maxMessageSizeBytes; int32_t maxBsonObjectSize = sl.maxBsonObjectSize; bson_t doc = BSON_INITIALIZER; { char *large_str = repeat_char('b', (size_t)maxBsonObjectSize - 500); BSON_APPEND_UTF8(&doc, "a", large_str); bson_free(large_str); } mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); int32_t numModels = (maxMessageSizeBytes / maxBsonObjectSize) + 1; for (int32_t i = 0; i < numModels; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, NULL /* options */); ASSERT(ret.res); ASSERT_NO_BULKWRITEEXCEPTION(ret); ASSERT_CMPINT64(mongoc_bulkwriteresult_insertedcount(ret.res), ==, numModels); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); // Assert two `bulkWrite`s were sent: ASSERT_CMPUINT32(2, ==, bson_count_keys(&cb_ctx->ops_counts)); // Assert first `bulkWrite` sends `numModels - 1` ops. int64_t ops_count_0 = bson_lookup_int64(&cb_ctx->ops_counts, "0"); ASSERT_CMPINT64(ops_count_0, ==, numModels - 1); // Assert second `bulkWrite` sends 1 op. int64_t ops_count_1 = bson_lookup_int64(&cb_ctx->ops_counts, "1"); ASSERT_CMPINT64(ops_count_1, ==, 1); // Assert both have the same `operation_id`. int64_t operation_id_0 = bson_lookup_int64(&cb_ctx->operation_ids, "0"); int64_t operation_id_1 = bson_lookup_int64(&cb_ctx->operation_ids, "1"); ASSERT_CMPINT64(operation_id_0, ==, operation_id_1); mongoc_bulkwrite_destroy(bw); bulkWrite_ctx_destroy(cb_ctx); bson_destroy(&doc); mongoc_client_destroy(client); } static void prose_test_5(void *ctx) { /* `MongoClient.bulkWrite` collects `WriteConcernError`s across batches */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; // Construct client with retryable writes disabled. { mongoc_uri_t *uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, false); client = mongoc_client_new_from_uri(uri); test_framework_set_ssl_opts(client); // Check if test runner is configured with a server API version: mongoc_server_api_t *api = test_framework_get_default_server_api(); if (api) { ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); } mongoc_uri_destroy(uri); } // Get `maxWriteBatchSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxWriteBatchSize = sl.maxWriteBatchSize; // Drop collection to clear prior data. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); mongoc_collection_destroy(coll); } // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Set failpoint { ok = mongoc_client_command_simple( client, "admin", tmp_bson(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 2}, "data" : { "failCommands" : ["bulkWrite"], "writeConcernError" : {"code" : 91, "errmsg" : "Replication is being shut down"} } })), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); } // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); { bson_t doc = BSON_INITIALIZER; BSON_APPEND_UTF8(&doc, "a", "b"); for (int32_t i = 0; i < maxWriteBatchSize + 1; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } } mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, NULL /* options */); ASSERT(ret.res); // Has partial results. ASSERT(ret.exc); // Expect no top-level error. if (mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected no top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } // Count write concern errors. { const bson_t *writeConcernErrors = mongoc_bulkwriteexception_writeconcernerrors(ret.exc); ASSERT_CMPUINT32(bson_count_keys(writeConcernErrors), ==, 2); } // Assert partial results. ASSERT_CMPINT64(mongoc_bulkwriteresult_insertedcount(ret.res), ==, maxWriteBatchSize + 1); // Assert two batches were sent. ASSERT_CMPUINT32(bson_count_keys(&cb_ctx->ops_counts), ==, 2); bulkWrite_ctx_destroy(cb_ctx); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_destroy(bw); mongoc_client_destroy(client); } static void prose_test_6(void *ctx) { /* `MongoClient.bulkWrite` handles individual `WriteError`s across batches */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Get `maxWriteBatchSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxWriteBatchSize = sl.maxWriteBatchSize; // Drop collection to clear prior data. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); bson_t document = BSON_INITIALIZER; BSON_APPEND_INT32(&document, "_id", 1); ok = mongoc_collection_insert_one(coll, &document, NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); // Test Unordered { // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); for (int32_t i = 0; i < maxWriteBatchSize + 1; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &document, NULL, &error); ASSERT_OR_PRINT(ok, error); } mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_ordered(opts, false); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(!ret.res); // No result due to no successful writes. ASSERT(ret.exc); if (mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected no top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } // Count write errors. { const bson_t *writeErrors = mongoc_bulkwriteexception_writeerrors(ret.exc); ASSERT(mlib_in_range(uint32_t, maxWriteBatchSize + 1)); ASSERT_CMPUINT32(bson_count_keys(writeErrors), ==, (uint32_t)maxWriteBatchSize + 1); } // Assert two batches were sent. ASSERT_CMPUINT32(bson_count_keys(&cb_ctx->ops_counts), ==, 2); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwriteopts_destroy(opts); mongoc_bulkwrite_destroy(bw); } // Reset state. bulkWrite_ctx_reset(cb_ctx); // Test Ordered { // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); for (int32_t i = 0; i < maxWriteBatchSize + 1; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &document, NULL, &error); ASSERT_OR_PRINT(ok, error); } mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_ordered(opts, true); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(!ret.res); // No result due to no successful writes. ASSERT(ret.exc); if (mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected no top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } // Count write errors. { const bson_t *writeErrors = mongoc_bulkwriteexception_writeerrors(ret.exc); ASSERT_CMPUINT32(bson_count_keys(writeErrors), ==, 1); } // Assert one batch was sent. ASSERT_CMPUINT32(bson_count_keys(&cb_ctx->ops_counts), ==, 1); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwriteopts_destroy(opts); mongoc_bulkwrite_destroy(bw); } bulkWrite_ctx_destroy(cb_ctx); bson_destroy(&document); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void prose_test_7(void *ctx) { /* `MongoClient.bulkWrite` handles a cursor requiring a `getMore` */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Get `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxBsonObjectSize = sl.maxBsonObjectSize; // Drop collection to clear prior data. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); size_t numModels = 0; mongoc_bulkwrite_updateoneopts_t *uo = mongoc_bulkwrite_updateoneopts_new(); mongoc_bulkwrite_updateoneopts_set_upsert(uo, true); bson_t *update = BCON_NEW("$set", "{", "x", BCON_INT32(1), "}"); bson_t d1 = BSON_INITIALIZER; { char *large_str = repeat_char('a', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d1, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d1, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; bson_t d2 = BSON_INITIALIZER; { char *large_str = repeat_char('b', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d2, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d2, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(ret.res); ASSERT_NO_BULKWRITEEXCEPTION(ret); ASSERT_CMPINT64(mongoc_bulkwriteresult_upsertedcount(ret.res), ==, 2); // Check length of update results. { const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(ret.res); ASSERT_CMPSIZE_T((size_t)bson_count_keys(updateResults), ==, numModels); } ASSERT_CMPINT(cb_ctx->numGetMore, ==, 1); mongoc_bulkwriteopts_destroy(opts); bson_destroy(&d2); bson_destroy(&d1); bson_destroy(update); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_updateoneopts_destroy(uo); mongoc_bulkwrite_destroy(bw); mongoc_collection_destroy(coll); bulkWrite_ctx_destroy(cb_ctx); mongoc_client_destroy(client); } static void prose_test_8(void *ctx) { /* `MongoClient.bulkWrite` handles a cursor requiring `getMore` within a transaction */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Get `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxBsonObjectSize = sl.maxBsonObjectSize; // Drop collection to clear prior data. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); size_t numModels = 0; mongoc_bulkwrite_updateoneopts_t *uo = mongoc_bulkwrite_updateoneopts_new(); mongoc_bulkwrite_updateoneopts_set_upsert(uo, true); bson_t *update = BCON_NEW("$set", "{", "x", BCON_INT32(1), "}"); mongoc_client_session_t *sess = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(sess, error); ASSERT_OR_PRINT(mongoc_client_session_start_transaction(sess, NULL, &error), error); bson_t d1 = BSON_INITIALIZER; { char *large_str = repeat_char('a', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d1, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d1, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; bson_t d2 = BSON_INITIALIZER; { char *large_str = repeat_char('b', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d2, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d2, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(ret.res); ASSERT_NO_BULKWRITEEXCEPTION(ret); ASSERT_CMPINT64(mongoc_bulkwriteresult_upsertedcount(ret.res), ==, 2); ASSERT_CMPINT(cb_ctx->numGetMore, ==, 1); // Check length of update results. { const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(ret.res); ASSERT_CMPSIZE_T((size_t)bson_count_keys(updateResults), ==, numModels); } mongoc_bulkwrite_updateoneopts_destroy(uo); mongoc_bulkwriteopts_destroy(opts); bson_destroy(&d2); bson_destroy(&d1); bson_destroy(update); mongoc_client_session_destroy(sess); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_destroy(bw); mongoc_collection_destroy(coll); bulkWrite_ctx_destroy(cb_ctx); mongoc_client_destroy(client); } static void prose_test_9(void *ctx) { /* `MongoClient.bulkWrite` handles a `getMore` error */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Get `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxBsonObjectSize = sl.maxBsonObjectSize; // Drop collection to clear prior data. mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Configure failpoint on `getMore`. { { ok = mongoc_client_command_simple(client, "admin", tmp_bson(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["getMore"], "errorCode" : 8} })), NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); } } bson_t *update = BCON_NEW("$set", "{", "x", BCON_INT32(1), "}"); // Construct models. mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); size_t numModels = 0; mongoc_bulkwrite_updateoneopts_t *uo = mongoc_bulkwrite_updateoneopts_new(); mongoc_bulkwrite_updateoneopts_set_upsert(uo, true); bson_t d1 = BSON_INITIALIZER; { char *large_str = repeat_char('a', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d1, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d1, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; bson_t d2 = BSON_INITIALIZER; { char *large_str = repeat_char('b', maxBsonObjectSize / 2); BSON_APPEND_UTF8(&d2, "_id", large_str); bson_free(large_str); } ok = mongoc_bulkwrite_append_updateone(bw, "db.coll", &d2, update, uo, &error); ASSERT_OR_PRINT(ok, error); numModels++; mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_verboseresults(opts, true); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(ret.res); ASSERT(ret.exc); if (!mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, 8, "Failing command via 'failCommand' failpoint"); ASSERT_CMPSIZE_T((size_t)mongoc_bulkwriteresult_upsertedcount(ret.res), ==, numModels); // Check length of update results. { const bson_t *updateResults = mongoc_bulkwriteresult_updateresults(ret.res); ASSERT_CMPSIZE_T((size_t)bson_count_keys(updateResults), ==, 1); } ASSERT_CMPINT(cb_ctx->numGetMore, ==, 1); ASSERT_CMPINT(cb_ctx->numKillCursors, ==, 1); mongoc_bulkwrite_updateoneopts_destroy(uo); mongoc_bulkwriteopts_destroy(opts); bson_destroy(&d2); bson_destroy(&d1); bson_destroy(update); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_destroy(bw); mongoc_collection_destroy(coll); bulkWrite_ctx_destroy(cb_ctx); mongoc_client_destroy(client); } static void prose_test_10(void *ctx) { /* `MongoClient.bulkWrite` returns error for unacknowledged too-large insert */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; mongoc_write_concern_t *wc; client = test_framework_new_default_client(); // Get `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxBsonObjectSize = sl.maxBsonObjectSize; bson_t doc = BSON_INITIALIZER; { char *large_str = repeat_char('b', maxBsonObjectSize); BSON_APPEND_UTF8(&doc, "a", large_str); bson_free(large_str); } wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_ordered(opts, false); mongoc_bulkwriteopts_set_writeconcern(opts, wc); // Test a large insert. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &doc, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(!ret.res); // No result due to unacknowledged write concern. ASSERT(ret.exc); if (!mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "of size"); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_destroy(bw); } // Test a large replace. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); ok = mongoc_bulkwrite_append_replaceone(bw, "db.coll", tmp_bson("{}"), &doc, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, opts); ASSERT(!ret.res); // No result due to unacknowledged write concern. ASSERT(ret.exc); if (!mongoc_bulkwriteexception_error(ret.exc, &error)) { test_error("Expected top-level error but got:\n%s", test_bulkwriteexception_str(ret.exc)); } ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "of size"); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwrite_destroy(bw); } mongoc_bulkwriteopts_destroy(opts); bson_destroy(&doc); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } static void capture_all_bulkWrite_commands(const mongoc_apm_command_started_t *event) { if (0 == strcmp(mongoc_apm_command_started_get_command_name(event), "bulkWrite")) { mongoc_array_t *captured = mongoc_apm_command_started_get_context(event); bson_t *cmd = bson_copy(mongoc_apm_command_started_get_command(event)); _mongoc_array_append_val(captured, cmd); } } typedef struct { mongoc_client_t *client; int32_t maxMessageSizeBytes; int32_t maxBsonObjectSize; int32_t numModels; mongoc_array_t captured; mongoc_bulkwrite_t *bw; } prose_test_11_fixture_t; static prose_test_11_fixture_t * prose_test_11_fixture_new(void) { bool ok; bson_error_t error; prose_test_11_fixture_t *tf = bson_malloc0(sizeof(*tf)); tf->client = test_framework_new_default_client(); // Get `maxMessageSizeBytes` and `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(tf->client); tf->maxMessageSizeBytes = sl.maxMessageSizeBytes; tf->maxBsonObjectSize = sl.maxBsonObjectSize; // See CRUD prose test 12 description for the calculation of these values. const int32_t opsBytes = tf->maxMessageSizeBytes - 1122; tf->numModels = opsBytes / tf->maxBsonObjectSize; const int32_t remainderBytes = opsBytes % tf->maxBsonObjectSize; _mongoc_array_init(&tf->captured, sizeof(bson_t *)); // Set callback to capture all `bulkWrite` commands. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, capture_all_bulkWrite_commands); mongoc_client_set_apm_callbacks(tf->client, cbs, &tf->captured); mongoc_apm_callbacks_destroy(cbs); } tf->bw = mongoc_client_bulkwrite_new(tf->client); // Add initial list of documents. { // Create a document { 'a': 'b'.repeat(maxBsonObjectSize - 57) } bson_t *doc; { char *large_str = repeat_char('b', tf->maxBsonObjectSize - 57); doc = BCON_NEW("a", BCON_UTF8(large_str)); bson_free(large_str); } mlib_foreach_irange (i, tf->numModels) { (void)i; ok = mongoc_bulkwrite_append_insertone(tf->bw, "db.coll", doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } bson_destroy(doc); } if (remainderBytes >= 217) { // Create a document { 'a': 'b'.repeat(remainderBytes - 57) } bson_t *doc; { char *large_str = repeat_char('b', remainderBytes - 57); doc = BCON_NEW("a", BCON_UTF8(large_str)); bson_free(large_str); } ok = mongoc_bulkwrite_append_insertone(tf->bw, "db.coll", doc, NULL, &error); ASSERT_OR_PRINT(ok, error); tf->numModels++; bson_destroy(doc); } return tf; } static void prose_test_11_fixture_destroy(prose_test_11_fixture_t *tf) { if (!tf) { return; } for (size_t i = 0; i < tf->captured.len; i++) { bson_t *el = _mongoc_array_index(&tf->captured, bson_t *, i); bson_destroy(el); } _mongoc_array_destroy(&tf->captured); mongoc_bulkwrite_destroy(tf->bw); mongoc_client_destroy(tf->client); bson_free(tf); } static void prose_test_11(void *ctx) { /* 11. `MongoClient.bulkWrite` batch splits when the addition of a new namespace exceeds the maximum message size */ BSON_UNUSED(ctx); bool ok; bson_error_t error; // Case 1: Does not split { prose_test_11_fixture_t *tf = prose_test_11_fixture_new(); // Add a document with the same namespace (expected to not result in a batch split). { bson_t *second_doc = BCON_NEW("a", "b"); ok = mongoc_bulkwrite_append_insertone(tf->bw, "db.coll", second_doc, NULL, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(second_doc); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(tf->bw, NULL /* opts */); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); ASSERT(mlib_in_range(int64_t, tf->numModels)); ASSERT_CMPINT64(mongoc_bulkwriteresult_insertedcount(bwr.res), ==, (int64_t)tf->numModels + 1); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect one `bulkWrite` command is sent. ASSERT_CMPSIZE_T(tf->captured.len, ==, 1); // Expect the event contains the namespace for `db.coll`. bson_t *first = _mongoc_array_index(&tf->captured, bson_t *, 0); { bson_t *ops = bson_lookup_bson(first, "ops"); ASSERT(mlib_in_range(uint32_t, tf->numModels)); ASSERT_CMPUINT32(bson_count_keys(ops), ==, (uint32_t)tf->numModels + 1); bson_destroy(ops); bson_t *nsInfo = bson_lookup_bson(first, "nsInfo"); ASSERT_CMPUINT32(bson_count_keys(nsInfo), ==, 1); bson_destroy(nsInfo); const char *ns = bson_lookup_utf8(first, "nsInfo.0.ns"); ASSERT_CMPSTR(ns, "db.coll"); } prose_test_11_fixture_destroy(tf); } // Case 2: Splits with new namespace { prose_test_11_fixture_t *tf = prose_test_11_fixture_new(); // Create a large namespace. char *large_ns; { char *coll = repeat_char('c', 200); large_ns = bson_strdup_printf("db.%s", coll); bson_free(coll); } // Add a document that results in a batch split due to the namespace. { bson_t *second_doc = BCON_NEW("a", "b"); ok = mongoc_bulkwrite_append_insertone(tf->bw, large_ns, second_doc, NULL, &error); ASSERT_OR_PRINT(ok, error); bson_destroy(second_doc); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(tf->bw, NULL /* opts */); ASSERT(bwr.res); ASSERT_NO_BULKWRITEEXCEPTION(bwr); ASSERT(mlib_in_range(int64_t, tf->numModels)); ASSERT_CMPINT64(mongoc_bulkwriteresult_insertedcount(bwr.res), ==, (int64_t)tf->numModels + 1); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } // Expect two `bulkWrite` commands were sent. ASSERT_CMPSIZE_T(tf->captured.len, ==, 2); // Expect the first only contains the namespace for `db.coll`. bson_t *first = _mongoc_array_index(&tf->captured, bson_t *, 0); { bson_t *ops = bson_lookup_bson(first, "ops"); ASSERT(mlib_in_range(uint32_t, tf->numModels)); ASSERT_CMPUINT32(bson_count_keys(ops), ==, (uint32_t)tf->numModels); bson_destroy(ops); bson_t *nsInfo = bson_lookup_bson(first, "nsInfo"); ASSERT_CMPUINT32(bson_count_keys(nsInfo), ==, 1); bson_destroy(nsInfo); const char *ns = bson_lookup_utf8(first, "nsInfo.0.ns"); ASSERT_CMPSTR(ns, "db.coll"); } // Expect the second only contains the namespace for `large_ns`. bson_t *second = _mongoc_array_index(&tf->captured, bson_t *, 1); { bson_t *ops = bson_lookup_bson(second, "ops"); ASSERT_CMPUINT32(bson_count_keys(ops), ==, 1); bson_destroy(ops); bson_t *nsInfo = bson_lookup_bson(second, "nsInfo"); ASSERT_CMPUINT32(bson_count_keys(nsInfo), ==, 1); bson_destroy(nsInfo); const char *ns = bson_lookup_utf8(second, "nsInfo.0.ns"); ASSERT_CMPSTR(ns, large_ns); } bson_free(large_ns); prose_test_11_fixture_destroy(tf); } } static void prose_test_12(void *ctx) { /* 12. `MongoClient.bulkWrite` returns an error if no operations can be added to `ops` */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Get `maxMessageSizeBytes` from the server. server_limits_t sl = get_server_limits(client); int32_t maxMessageSizeBytes = sl.maxMessageSizeBytes; // Create a large string. char *large_str = repeat_char('b', maxMessageSizeBytes); // Test too-big document. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bson_t *large_doc = BCON_NEW("a", BCON_UTF8(large_str)); // Create bulk write. { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", large_doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(!bwr.res); // No result due to no successful writes. ASSERT(bwr.exc); if (!mongoc_bulkwriteexception_error(bwr.exc, &error)) { test_error("Expected top-level error but got:\n%s", test_bulkwriteexception_str(bwr.exc)); } ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to send document"); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } bson_destroy(large_doc); mongoc_bulkwrite_destroy(bw); } // Test too-big namespace. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); char *large_namespace = bson_strdup_printf("db.%s", large_str); // Create bulk write. { ok = mongoc_bulkwrite_append_insertone(bw, large_namespace, tmp_bson("{'a': 'b'}"), NULL, &error); ASSERT_OR_PRINT(ok, error); } // Execute. { mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(!bwr.res); // No result due to no successful writes. ASSERT(bwr.exc); if (!mongoc_bulkwriteexception_error(bwr.exc, &error)) { test_error("Expected top-level error but got:\n%s", test_bulkwriteexception_str(bwr.exc)); } ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unable to send document"); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); } bson_free(large_namespace); mongoc_bulkwrite_destroy(bw); } bson_free(large_str); mongoc_client_destroy(client); } static void prose_test_15(void *ctx) { /* 15. `MongoClient.bulkWrite` with unacknowledged write concern uses `w:0` for all batches */ mongoc_client_t *client; BSON_UNUSED(ctx); bool ok; bson_error_t error; client = test_framework_new_default_client(); // Drop collection. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); mongoc_collection_drop(coll, NULL); // Ignore error. mongoc_collection_destroy(coll); } // Create collection to workaround SERVER-95537. { mongoc_database_t *db = mongoc_client_get_database(client, "db"); mongoc_collection_t *coll = mongoc_database_create_collection(db, "coll", NULL, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } // Set callbacks to count the number of bulkWrite commands sent. bulkWrite_ctx *cb_ctx = capture_bulkWrite_info(client); // Get `maxWriteBatchSize` and `maxBsonObjectSize` from the server. server_limits_t sl = get_server_limits(client); int32_t maxMessageSizeBytes = sl.maxMessageSizeBytes; int32_t maxBsonObjectSize = sl.maxBsonObjectSize; // Make a large document. bson_t doc = BSON_INITIALIZER; { char *large_str = repeat_char('b', (size_t)maxBsonObjectSize - 500); BSON_APPEND_UTF8(&doc, "a", large_str); bson_free(large_str); } // Execute bulkWrite. { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); for (int32_t i = 0; i < maxMessageSizeBytes / maxBsonObjectSize + 1; i++) { ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", &doc, NULL, &error); ASSERT_OR_PRINT(ok, error); } // Configure options with unacknowledge write concern and unordered writes. mongoc_bulkwriteopts_t *bwo; { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); bwo = mongoc_bulkwriteopts_new(); mongoc_bulkwriteopts_set_writeconcern(bwo, wc); mongoc_bulkwriteopts_set_ordered(bwo, false); mongoc_write_concern_destroy(wc); } mongoc_bulkwritereturn_t ret = mongoc_bulkwrite_execute(bw, bwo); ASSERT(!ret.res); // No result due to unacknowledged. ASSERT_NO_BULKWRITEEXCEPTION(ret); mongoc_bulkwriteexception_destroy(ret.exc); mongoc_bulkwriteresult_destroy(ret.res); mongoc_bulkwriteopts_destroy(bwo); mongoc_bulkwrite_destroy(bw); } // Check command started events. { bson_t expect = BSON_INITIALIZER; // Assert first `bulkWrite` sends `maxWriteBatchSize` ops. BSON_APPEND_INT64(&expect, "0", maxMessageSizeBytes / maxBsonObjectSize); // Assert second `bulkWrite` sends 1 op. BSON_APPEND_INT64(&expect, "1", 1); ASSERT_EQUAL_BSON(&expect, &cb_ctx->ops_counts); bson_destroy(&expect); // Assert both have the same `operation_id`. int64_t operation_id_0 = bson_lookup_int64(&cb_ctx->operation_ids, "0"); int64_t operation_id_1 = bson_lookup_int64(&cb_ctx->operation_ids, "1"); ASSERT_CMPINT64(operation_id_0, ==, operation_id_1); // Assert both use unacknowledged write concern. bson_init(&expect); BCON_APPEND(&expect, "0", "{", "w", BCON_INT32(0), "}"); BCON_APPEND(&expect, "1", "{", "w", BCON_INT32(0), "}"); ASSERT_EQUAL_BSON(&expect, &cb_ctx->write_concerns); bson_destroy(&expect); } // Count documents in collection. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); int64_t expected = maxMessageSizeBytes / maxBsonObjectSize + 1; int64_t got = mongoc_collection_count_documents(coll, tmp_bson("{}"), NULL, NULL, NULL, &error); ASSERT_CMPINT64(got, ==, expected); mongoc_collection_destroy(coll); } bson_destroy(&doc); bulkWrite_ctx_destroy(cb_ctx); mongoc_client_destroy(client); } void test_crud_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddFull(suite, "/crud/prose_test_1 [lock:live-server]", prose_test_1, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/crud/prose_test_2 [lock:live-server]", prose_test_2, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_13); TestSuite_AddFull(suite, "/crud/prose_test_3 [lock:live-server]", prose_test_3, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */); TestSuite_AddFull(suite, "/crud/prose_test_4 [lock:live-server]", prose_test_4, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */); TestSuite_AddFull(suite, "/crud/prose_test_5 [lock:live-server]", prose_test_5, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */); TestSuite_AddFull(suite, "/crud/prose_test_6 [lock:live-server][timeout:30]", prose_test_6, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */ ); TestSuite_AddFull(suite, "/crud/prose_test_7 [lock:live-server]", prose_test_7, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */ ); TestSuite_AddFull(suite, "/crud/prose_test_8 [lock:live-server]", prose_test_8, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25, /* require 8.0+ server */ test_framework_skip_if_no_txns); TestSuite_AddFull(suite, "/crud/prose_test_9 [lock:live-server]", prose_test_9, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */ ); TestSuite_AddFull(suite, "/crud/prose_test_10 [lock:live-server]", prose_test_10, NULL, /* dtor */ NULL, /* ctx */ test_framework_skip_if_max_wire_version_less_than_25 /* require 8.0+ server */); TestSuite_AddFull(suite, "/crud/prose_test_11 [lock:live-server]", prose_test_11, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/crud/prose_test_12 [lock:live-server]", prose_test_12, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); TestSuite_AddFull(suite, "/crud/prose_test_15 [lock:live-server]", prose_test_15, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_25 // require server 8.0 ); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-cursor.c000066400000000000000000002542271511661753600242130ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef mongoc_cursor_t *(*make_cursor_fn)(mongoc_collection_t *); typedef struct { make_cursor_fn ctor; } make_cursor_helper_t; #define CURSOR_COMMON_SETUP \ do { \ bson_error_t _err; \ bool _ret; \ client = test_framework_new_default_client(); \ coll = mongoc_client_get_collection(client, "test", "test"); \ /* populate to ensure db and coll exist. */ \ _ret = mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &_err); \ ASSERT_OR_PRINT(_ret, _err); \ ctor = ((make_cursor_helper_t *)(ctx))->ctor; \ } while (0) #define CURSOR_COMMON_TEARDOWN \ do { \ mongoc_collection_destroy(coll); \ mongoc_client_destroy(client); \ } while (0) static mongoc_cursor_t * _make_array_cursor(mongoc_collection_t *coll); /* test that the host a cursor returns belongs to a server it connected to. */ static void _test_common_get_host(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; const mongoc_host_list_t *hosts; mongoc_host_list_t cursor_host; mongoc_uri_t *uri; const bson_t *doc; bson_error_t err; bool ret; CURSOR_COMMON_SETUP; cursor = ctor(coll); uri = test_framework_get_uri(); hosts = mongoc_uri_get_hosts(uri); ret = mongoc_cursor_next(cursor, &doc); if (!ret && mongoc_cursor_error(cursor, &err)) { test_error("%s", err.message); } mongoc_cursor_get_host(cursor, &cursor_host); /* In a production deployment the driver can discover servers not in the seed * list, but for this test assume the cursor uses one of the seeds. */ while (hosts) { if (strcmp(cursor_host.host_and_port, hosts->host_and_port) == 0) { /* the cursor is using this server */ ASSERT_CMPSTR(cursor_host.host, hosts->host); ASSERT_CMPINT(cursor_host.port, ==, hosts->port); ASSERT_CMPINT(cursor_host.family, ==, hosts->family); break; } hosts = hosts->next; } mongoc_uri_destroy(uri); mongoc_cursor_destroy(cursor); CURSOR_COMMON_TEARDOWN; } /* test cloning cursors returns the same results. */ static void _test_common_clone(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; mongoc_cursor_t *cloned; const bson_t *doc; bson_error_t err; CURSOR_COMMON_SETUP; cursor = ctor(coll); cloned = mongoc_cursor_clone(cursor); /* check that both cursors return the same number of documents. don't check * that they return the same exact documents. A cursor on the listDatabases * returns the database size, which may change in the background. */ while (mongoc_cursor_next(cursor, &doc)) { BSON_ASSERT(mongoc_cursor_next(cloned, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cloned, &err), err); } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &err), err); BSON_ASSERT(!mongoc_cursor_next(cloned, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cloned, &err), err); mongoc_cursor_destroy(cursor); mongoc_cursor_destroy(cloned); CURSOR_COMMON_TEARDOWN; } /* test cloning cursors with read and write concerns set. */ static void _test_common_clone_w_concerns(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; mongoc_cursor_t *cloned; mongoc_read_concern_t *read_concern; mongoc_write_concern_t *write_concern; const bson_t *bson; bson_iter_t iter; CURSOR_COMMON_SETUP; cursor = ctor(coll); read_concern = mongoc_read_concern_new(); ASSERT(read_concern); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_LOCAL); write_concern = mongoc_write_concern_new(); ASSERT(write_concern); mongoc_write_concern_set_journal(write_concern, true); mongoc_write_concern_set_wmajority(write_concern, 1000); cursor->write_concern = write_concern; mongoc_read_concern_destroy(cursor->read_concern); cursor->read_concern = read_concern; /* don't call mongoc_cursor_next (), since the test may run against a version * of MongoDB that doesn't support read/write concerns, and we are only * interested in testing if the clone process works. */ cloned = mongoc_cursor_clone(cursor); /* test cloned read_concern. */ ASSERT(!mongoc_read_concern_is_default(cloned->read_concern)); ASSERT_CMPSTR(mongoc_read_concern_get_level(cloned->read_concern), MONGOC_READ_CONCERN_LEVEL_LOCAL); /* test cloned write_concern. */ ASSERT(mongoc_write_concern_get_wmajority(cloned->write_concern)); ASSERT(mongoc_write_concern_get_wtimeout_int64(cloned->write_concern) == 1000); ASSERT(mongoc_write_concern_get_w(cloned->write_concern) == MONGOC_WRITE_CONCERN_W_MAJORITY); /* check generated bson in cloned cursor. */ ASSERT_MATCH(_mongoc_read_concern_get_bson(cloned->read_concern), "{'level': 'local'}"); bson = _mongoc_write_concern_get_bson(cloned->write_concern); ASSERT(bson); ASSERT(!bson_iter_init_find(&iter, bson, "fsync")); // Deprecated "fsync" removed in C driver 2.0. ASSERT(bson_iter_init_find(&iter, bson, "j") && BSON_ITER_HOLDS_BOOL(&iter) && bson_iter_bool(&iter)); ASSERT(bson_iter_init_find(&iter, bson, "w") && BSON_ITER_HOLDS_UTF8(&iter)); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "majority"); mongoc_cursor_destroy(cursor); mongoc_cursor_destroy(cloned); CURSOR_COMMON_TEARDOWN; } /* test calling mongoc_cursor_next again after it returns false. */ static void _test_common_advancing_past_end(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; const bson_t *doc; const bson_t *current; const bson_t *err_doc; bson_error_t err; CURSOR_COMMON_SETUP; cursor = ctor(coll); while (mongoc_cursor_next(cursor, &doc)) { current = mongoc_cursor_current(cursor); /* should be same address. */ BSON_ASSERT(doc == current); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &err), err); /* cursor will report more until certain there are no documents left. */ ASSERT(mongoc_cursor_more(cursor)); } /* advance one past the end. */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(mongoc_cursor_error(cursor, &err)); BSON_ASSERT(mongoc_cursor_error_document(cursor, &err, &err_doc)); ASSERT_ERROR_CONTAINS( err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot advance a completed or failed cursor."); /* this is not a server error, the error document should be NULL. */ BSON_ASSERT(bson_empty(err_doc)); mongoc_cursor_destroy(cursor); CURSOR_COMMON_TEARDOWN; } typedef struct { char *expected_host_and_port; bool called; } test_common_server_hint_ctx_t; static void _test_common_server_hint_command_started(const mongoc_apm_command_started_t *event) { const mongoc_host_list_t *host = mongoc_apm_command_started_get_host(event); const char *cmd = mongoc_apm_command_started_get_command_name(event); test_common_server_hint_ctx_t *ctx; /* only check command associated with cursor priming. */ if (strcmp(cmd, "find") == 0 || strcasecmp(cmd, HANDSHAKE_CMD_LEGACY_HELLO) == 0 || strcmp(cmd, "hello") == 0 || strcmp(cmd, "listDatabases") == 0) { ctx = (test_common_server_hint_ctx_t *)mongoc_apm_command_started_get_context(event); ASSERT_CMPSTR(host->host_and_port, ctx->expected_host_and_port); BSON_ASSERT(!ctx->called); ctx->called = true; } } /* test setting the server id (hint) on cursors that support it. */ static void _test_common_server_hint(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t err; mongoc_server_description_t *sd; mongoc_read_prefs_t *read_prefs; test_common_server_hint_ctx_t test_ctx = {0}; mongoc_apm_callbacks_t *callbacks; CURSOR_COMMON_SETUP; /* set APM callbacks, and then set server hint. Make sure we target the same * host that we select. */ callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, _test_common_server_hint_command_started); cursor = ctor(coll); read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); sd = mongoc_client_select_server(client, false, read_prefs, &err); ASSERT_OR_PRINT(sd, err); test_ctx.expected_host_and_port = bson_strdup(sd->host.host_and_port); mongoc_read_prefs_destroy(read_prefs); mongoc_client_set_apm_callbacks(client, callbacks, &test_ctx); mongoc_apm_callbacks_destroy(callbacks); BSON_ASSERT(mongoc_cursor_set_server_id(cursor, sd->id)); ASSERT_CMPUINT32(mongoc_cursor_get_server_id(cursor), ==, sd->id); mongoc_server_description_destroy(sd); BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &err), err); mongoc_cursor_destroy(cursor); bson_free(test_ctx.expected_host_and_port); BSON_ASSERT(test_ctx.called); CURSOR_COMMON_TEARDOWN; } /* test setting options on unprimed, non-aggregate cursors. */ static void _test_common_opts(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; const bson_t *doc; mongoc_server_description_t *sd; bson_error_t err; CURSOR_COMMON_SETUP; sd = mongoc_client_select_server(client, true, NULL, &err); ASSERT_OR_PRINT(sd, err); cursor = ctor(coll); /* check that we get what we set. */ BSON_ASSERT(mongoc_cursor_set_server_id(cursor, sd->id)); ASSERT_CMPINT(mongoc_cursor_get_server_id(cursor), ==, sd->id); /* listDatabases and hello prohibits limit and batchSize */ if (ctor != _make_array_cursor) { mongoc_cursor_set_batch_size(cursor, 1); ASSERT_CMPINT(mongoc_cursor_get_batch_size(cursor), ==, 1); BSON_ASSERT(mongoc_cursor_set_limit(cursor, 2)); ASSERT_CMPINT((int)mongoc_cursor_get_limit(cursor), ==, 2); } mongoc_cursor_set_max_await_time_ms(cursor, 3); ASSERT_CMPINT(mongoc_cursor_get_max_await_time_ms(cursor), ==, 3); /* prime the cursor. */ ASSERT_OR_PRINT(mongoc_cursor_next(cursor, &doc), cursor->error); /* options should be unchanged. */ ASSERT_CMPINT(mongoc_cursor_get_server_id(cursor), ==, sd->id); if (ctor != _make_array_cursor) { ASSERT_CMPINT(mongoc_cursor_get_batch_size(cursor), ==, 1); ASSERT_CMPINT((int)mongoc_cursor_get_limit(cursor), ==, 2); /* limit cannot be set again. */ BSON_ASSERT(!mongoc_cursor_set_limit(cursor, 5)); ASSERT_CMPINT((int)mongoc_cursor_get_limit(cursor), ==, 2); } ASSERT_CMPINT(mongoc_cursor_get_max_await_time_ms(cursor), ==, 3); /* trying to set hint again logs an error. */ capture_logs(true); BSON_ASSERT(!mongoc_cursor_set_server_id(cursor, 123)); capture_logs(false); ASSERT_CMPINT(mongoc_cursor_get_server_id(cursor), ==, sd->id); /* batch size can be set again without issue. */ mongoc_cursor_set_batch_size(cursor, 4); ASSERT_CMPINT(mongoc_cursor_get_batch_size(cursor), ==, 4); /* max await time ms cannot be set (but fails quietly). */ mongoc_cursor_set_max_await_time_ms(cursor, 6); ASSERT_CMPINT(mongoc_cursor_get_max_await_time_ms(cursor), ==, 3); mongoc_cursor_destroy(cursor); mongoc_server_description_destroy(sd); CURSOR_COMMON_TEARDOWN; } /* test setting options on cursors that are primed on construction. */ static void _test_common_opts_after_prime(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; CURSOR_COMMON_SETUP; cursor = ctor(coll); /* trying to set hint logs an error. */ capture_logs(true); BSON_ASSERT(!mongoc_cursor_set_server_id(cursor, 123)); capture_logs(false); ASSERT_CMPINT(mongoc_cursor_get_server_id(cursor), !=, 0); /* batch size can be set again without issue. */ mongoc_cursor_set_batch_size(cursor, 4); ASSERT_CMPINT(mongoc_cursor_get_batch_size(cursor), ==, 4); /* limit cannot be set. */ BSON_ASSERT(!mongoc_cursor_set_limit(cursor, 5)); ASSERT_CMPINT((int)mongoc_cursor_get_limit(cursor), ==, 0); /* max await time ms cannot be set (but fails quietly). */ mongoc_cursor_set_max_await_time_ms(cursor, 6); ASSERT_CMPINT(mongoc_cursor_get_max_await_time_ms(cursor), ==, 0); mongoc_cursor_destroy(cursor); CURSOR_COMMON_TEARDOWN; } /* test setting options on a cursor constructed from an aggregation. */ static void _test_common_opts_agg(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; make_cursor_fn ctor; mongoc_cursor_t *cursor; CURSOR_COMMON_SETUP; cursor = ctor(coll); /* trying to set hint logs an error. */ capture_logs(true); BSON_ASSERT(!mongoc_cursor_set_server_id(cursor, 123)); capture_logs(false); ASSERT_CMPINT(mongoc_cursor_get_server_id(cursor), !=, 0); /* batch size can be set again without issue. */ mongoc_cursor_set_batch_size(cursor, 4); ASSERT_CMPINT(mongoc_cursor_get_batch_size(cursor), ==, 4); /* limit can be set. */ BSON_ASSERT(mongoc_cursor_set_limit(cursor, 5)); ASSERT_CMPINT((int)mongoc_cursor_get_limit(cursor), ==, 5); /* max await time ms can be set. */ mongoc_cursor_set_max_await_time_ms(cursor, 6); ASSERT_CMPINT(mongoc_cursor_get_max_await_time_ms(cursor), ==, 6); mongoc_cursor_destroy(cursor); CURSOR_COMMON_TEARDOWN; } static mongoc_cursor_t * _make_find_cursor(mongoc_collection_t *coll) { return mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); } static mongoc_cursor_t * _make_cmd_cursor(mongoc_collection_t *coll) { return mongoc_collection_find_indexes_with_opts(coll, NULL); } static mongoc_cursor_t * _make_cmd_cursor_from_agg(mongoc_collection_t *coll) { return mongoc_collection_aggregate(coll, MONGOC_QUERY_SECONDARY_OK, tmp_bson("{}"), NULL, NULL); } static mongoc_cursor_t * _make_array_cursor(mongoc_collection_t *coll) { return mongoc_client_find_databases_with_opts(coll->client, NULL); } #define TEST_CURSOR_FIND(prefix, fn) \ if (1) { \ make_cursor_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (make_cursor_helper_t){.ctor = _make_find_cursor}; \ TestSuite_AddFull(suite, prefix "/find [lock:live-server]", fn, &bson_free, helper, TestSuite_CheckLive); \ } else \ ((void)0) #define TEST_CURSOR_CMD(prefix, fn) \ if (1) { \ make_cursor_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (make_cursor_helper_t){.ctor = _make_cmd_cursor}; \ TestSuite_AddFull(suite, prefix "/cmd [lock:live-server]", fn, &bson_free, helper, TestSuite_CheckLive); \ } else \ ((void)0) #define TEST_CURSOR_ARRAY(prefix, fn) \ if (1) { \ make_cursor_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (make_cursor_helper_t){.ctor = _make_array_cursor}; \ TestSuite_AddFull(suite, prefix "/array [lock:live-server]", fn, &bson_free, helper, TestSuite_CheckLive); \ } else \ ((void)0) #define TEST_CURSOR_AGG(prefix, fn) \ if (1) { \ make_cursor_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (make_cursor_helper_t){.ctor = _make_cmd_cursor_from_agg}; \ TestSuite_AddFull(suite, prefix "/agg [lock:live-server]", fn, &bson_free, helper, TestSuite_CheckLive); \ } else \ ((void)0) #define TEST_FOREACH_CURSOR(prefix, fn) \ if (1) { \ TEST_CURSOR_FIND(prefix, fn); \ TEST_CURSOR_CMD(prefix, fn); \ TEST_CURSOR_ARRAY(prefix, fn); \ TEST_CURSOR_AGG(prefix, fn); \ } else \ (void)0 static void test_common_cursor_functions_install(TestSuite *suite) { /* test functionality common to all cursor implementations. */ TEST_FOREACH_CURSOR("/Cursor/common/get_host", _test_common_get_host); TEST_FOREACH_CURSOR("/Cursor/common/clone", _test_common_clone); TEST_FOREACH_CURSOR("/Cursor/common/clone_w_concerns", _test_common_clone_w_concerns); TEST_FOREACH_CURSOR("/Cursor/common/advancing_past_end", _test_common_advancing_past_end); /* an agg/cmd cursors do not support setting server id. test others. */ TEST_CURSOR_FIND("/Cursor/common/hint", _test_common_server_hint); TEST_CURSOR_ARRAY("/Cursor/common/hint", _test_common_server_hint); /* find, cmd_depr, and array cursors can have all options set. */ TEST_CURSOR_FIND("/Cursor/common/opts", _test_common_opts); TEST_CURSOR_ARRAY("/Cursor/common/opts", _test_common_opts); /* a command cursor created from find_indexes_with_opts is already primed. */ TEST_CURSOR_CMD("/Cursor/common/opts", _test_common_opts_after_prime); /* a command cursor created from an agg has the server id set, but is not * primed. */ TEST_CURSOR_AGG("/Cursor/common/opts", _test_common_opts_agg); } static void test_limit(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *b; bson_t *opts; int i, n_docs; mongoc_cursor_t *cursor; bson_error_t error; int64_t limits[] = {5, -5}; const bson_t *doc = NULL; bool r; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_limit"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); b = tmp_bson("{}"); for (i = 0; i < 10; ++i) { mongoc_bulk_operation_insert(bulk, b); } r = (0 != mongoc_bulk_operation_execute(bulk, NULL, &error)); ASSERT_OR_PRINT(r, error); /* test positive and negative limit */ for (i = 0; i < 2; i++) { cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); ASSERT_CMPINT64((int64_t)0, ==, mongoc_cursor_get_limit(cursor)); ASSERT(mongoc_cursor_set_limit(cursor, limits[i])); ASSERT_CMPINT64(limits[i], ==, mongoc_cursor_get_limit(cursor)); n_docs = 0; while (mongoc_cursor_next(cursor, &doc)) { ++n_docs; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(!mongoc_cursor_more(cursor)); ASSERT_CMPINT(n_docs, ==, 5); ASSERT(!mongoc_cursor_set_limit(cursor, 123)); /* no effect */ ASSERT_CMPINT64(limits[i], ==, mongoc_cursor_get_limit(cursor)); mongoc_cursor_destroy(cursor); if (limits[i] > 0) { opts = tmp_bson("{'limit': {'$numberLong': '%" PRId64 "'}}", limits[i]); } else { opts = tmp_bson("{'singleBatch': true, 'limit': {'$numberLong': '%" PRId64 "'}}", -limits[i]); } cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), opts, NULL); ASSERT_CMPINT64(limits[i], ==, mongoc_cursor_get_limit(cursor)); n_docs = 0; while (mongoc_cursor_next(cursor, &doc)) { ++n_docs; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_CMPINT(n_docs, ==, 5); mongoc_cursor_destroy(cursor); } mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef struct { int succeeded_count; int64_t cursor_id; } killcursors_test_t; static void killcursors_succeeded(const mongoc_apm_command_succeeded_t *event) { killcursors_test_t *ctx; const bson_t *reply; bson_iter_t iter; bson_iter_t array; if (bson_strcasecmp(mongoc_apm_command_succeeded_get_command_name(event), "killcursors") != 0) { return; } ctx = (killcursors_test_t *)mongoc_apm_command_succeeded_get_context(event); ctx->succeeded_count++; reply = mongoc_apm_command_succeeded_get_reply(event); #define ASSERT_EMPTY(_fieldname) \ if (1) { \ BSON_ASSERT(bson_iter_init_find(&iter, reply, (_fieldname))); \ BSON_ASSERT(bson_iter_recurse(&iter, &array)); \ BSON_ASSERT(!bson_iter_next(&array)); \ } else \ (void)0 ASSERT_EMPTY("cursorsNotFound"); ASSERT_EMPTY("cursorsAlive"); ASSERT_EMPTY("cursorsUnknown"); BSON_ASSERT(bson_iter_init_find(&iter, reply, "cursorsKilled")); BSON_ASSERT(bson_iter_recurse(&iter, &array)); BSON_ASSERT(bson_iter_next(&array)); ASSERT_CMPINT64(ctx->cursor_id, ==, bson_iter_int64(&array)); } /* Tests killing a cursor with mongo_cursor_destroy and a real server. * Asserts that the cursor ID is no longer valid by attempting to get another * batch of results with the previously killed cursor ID. Uses getMore command * to iterate the cursor ID. */ static void test_kill_cursor_live(void) { mongoc_apm_callbacks_t *callbacks; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *b; mongoc_bulk_operation_t *bulk; int i; bson_error_t error; uint32_t server_id; bool r; mongoc_cursor_t *cursor; const bson_t *doc; killcursors_test_t ctx; ctx.succeeded_count = 0; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_succeeded_cb(callbacks, killcursors_succeeded); client = test_framework_new_default_client(); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); collection = get_test_collection(client, "test"); b = tmp_bson("{}"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); for (i = 0; i < 200; i++) { mongoc_bulk_operation_insert(bulk, b); } server_id = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(server_id > 0, error); cursor = mongoc_collection_find_with_opts(collection, b, tmp_bson("{'batchSize': 2}"), NULL); r = mongoc_cursor_next(cursor, &doc); ASSERT(r); ctx.cursor_id = mongoc_cursor_get_id(cursor); ASSERT(ctx.cursor_id); /* sends killCursors command to server */ mongoc_cursor_destroy(cursor); ASSERT_CMPINT(ctx.succeeded_count, ==, 1); bson_t *cmd; cmd = BCON_NEW("getMore", BCON_INT64(ctx.cursor_id), "collection", mongoc_collection_get_name(collection)); r = mongoc_client_command_simple(client, "test", cmd, NULL /* read prefs */, NULL /* reply */, &error); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, MONGOC_SERVER_ERR_CURSOR_NOT_FOUND, "not found"); bson_destroy(cmd); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_apm_callbacks_destroy(callbacks); } /* test the killCursors command with mock servers */ static void _test_kill_cursors(bool pooled) { mock_rs_t *rs; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *q = BCON_NEW("a", BCON_INT32(1)); mongoc_read_prefs_t *prefs; mongoc_cursor_t *cursor; const bson_t *doc = NULL; future_t *future; request_t *request; bson_error_t error; request_t *kill_cursors; const char *ns_out; int64_t cursor_id_out; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, /* wire version */ true, /* has primary */ 5, /* number of secondaries */ 0); /* number of arbiters */ mock_rs_run(rs); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_rs_get_uri(rs), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); } collection = mongoc_client_get_collection(client, "db", "collection"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); cursor = mongoc_collection_find_with_opts(collection, q, NULL, prefs); future = future_cursor_next(cursor, &doc); request = mock_rs_receives_request(rs); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.collection'," " 'firstBatch': [{'b': 1}]}}")); if (!future_get_bool(future)) { mongoc_cursor_error(cursor, &error); test_error("%s", error.message); } ASSERT_MATCH(doc, "{'b': 1}"); ASSERT_CMPINT(123, ==, (int)mongoc_cursor_get_id(cursor)); future_destroy(future); future = future_cursor_destroy(cursor); kill_cursors = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'killCursors': 'collection'," " 'cursors': [{'$numberLong': '123'}]}")); /* mock server framework can't test "cursors" array, CDRIVER-994 */ ASSERT(BCON_EXTRACT((bson_t *)request_get_doc(kill_cursors, 0), "killCursors", BCONE_UTF8(ns_out), "cursors", "[", BCONE_INT64(cursor_id_out), "]")); ASSERT_CMPSTR("collection", ns_out); ASSERT_CMPINT64((int64_t)123, ==, cursor_id_out); reply_to_request_simple(request, "{'ok': 1}"); /* killCursors command was sent to the right secondary */ ASSERT_CMPINT(request_get_server_port(kill_cursors), ==, request_get_server_port(request)); BSON_ASSERT(future_wait(future)); request_destroy(kill_cursors); request_destroy(request); future_destroy(future); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); bson_destroy(q); if (pooled) { capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); capture_logs(false); } else { mongoc_client_destroy(client); } mock_rs_destroy(rs); } static void test_kill_cursors_single(void) { _test_kill_cursors(false); } static void test_kill_cursors_pooled(void) { _test_kill_cursors(true); } static int count_docs(mongoc_cursor_t *cursor) { int n = 0; const bson_t *doc; bson_error_t error; while (mongoc_cursor_next(cursor, &doc)) { ++n; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); return n; } static void _test_cursor_new_from_command(const char *cmd_json, const char *collection_name) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bool r; bson_error_t error; mongoc_server_description_t *sd; uint32_t server_id; bson_t reply; mongoc_cursor_t *cmd_cursor; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "test", collection_name); mongoc_collection_delete_many(collection, tmp_bson("{}"), NULL, NULL, NULL); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 'a'}")); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 'b'}")); r = (0 != mongoc_bulk_operation_execute(bulk, NULL, &error)); ASSERT_OR_PRINT(r, error); const bson_t *cmd_bson = tmp_bson(cmd_json); const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_get_command_name(cmd_bson)}; sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, &ss_log_context, NULL, NULL, &error); ASSERT_OR_PRINT(sd, error); server_id = sd->id; mongoc_client_command_simple_with_server_id(client, "test", cmd_bson, NULL, server_id, &reply, &error); cmd_cursor = mongoc_cursor_new_from_command_reply_with_opts(client, &reply, tmp_bson("{'serverId': %d}", server_id)); ASSERT_OR_PRINT(!mongoc_cursor_error(cmd_cursor, &error), error); ASSERT_CMPUINT32(server_id, ==, mongoc_cursor_get_server_id(cmd_cursor)); ASSERT_CMPINT(count_docs(cmd_cursor), ==, 2); mongoc_cursor_destroy(cmd_cursor); mongoc_server_description_destroy(sd); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_cursor_empty_collection(void) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; const bson_t *doc; mongoc_cursor_t *cursor; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "test", "test_cursor_empty_collection"); mongoc_collection_delete_many(collection, tmp_bson("{}"), NULL, NULL, NULL); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_error(cursor, &error)); ASSERT(mongoc_cursor_more(cursor)); mongoc_cursor_next(cursor, &doc); ASSERT(!mongoc_cursor_error(cursor, &error)); ASSERT(!mongoc_cursor_more(cursor)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_cursor_new_from_aggregate(void) { _test_cursor_new_from_command("{'aggregate': 'test_cursor_new_from_aggregate'," " 'pipeline': [], 'cursor': {}}", "test_cursor_new_from_aggregate"); } static void test_cursor_new_from_aggregate_no_initial(void) { _test_cursor_new_from_command("{'aggregate': 'test_cursor_new_from_aggregate_no_initial'," " 'pipeline': [], 'cursor': {'batchSize': 0}}", "test_cursor_new_from_aggregate_no_initial"); } static void test_cursor_new_from_find(void *ctx) { BSON_UNUSED(ctx); _test_cursor_new_from_command("{'find': 'test_cursor_new_from_find'}", "test_cursor_new_from_find"); } static void test_cursor_new_from_find_batches(void *ctx) { BSON_UNUSED(ctx); _test_cursor_new_from_command("{'find': 'test_cursor_new_from_find_batches', 'batchSize': 1}", "test_cursor_new_from_find_batches"); } static void test_cursor_new_invalid(void) { mongoc_client_t *client; bson_error_t error; mongoc_cursor_t *cursor; bson_t b = BSON_INITIALIZER; const bson_t *error_doc; client = test_framework_new_default_client(); cursor = mongoc_cursor_new_from_command_reply_with_opts(client, &b, NULL); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Couldn't parse cursor document"); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); ASSERT(bson_empty(error_doc)); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); } static void test_cursor_new_tailable_await(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); // Select a server to get the server_id. // mongoc_cursor_new_from_command_reply_with_opts expects to receive a // serverId when creating an open cursor (non-zero cursor.id) uint32_t server_id; { mongoc_server_description_t *sd = mongoc_client_select_server(client, false /* for_writes */, NULL /* prefs */, &error); ASSERT_OR_PRINT(sd, error); server_id = mongoc_server_description_id(sd); mongoc_server_description_destroy(sd); } cursor = mongoc_cursor_new_from_command_reply_with_opts(client, bson_copy(tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.collection'," " 'firstBatch': []" " }," " 'tailable': true," " 'awaitData': true," " 'maxAwaitTimeMS': 100" "}")), tmp_bson("{'tailable': true," " 'awaitData': true," " 'maxAwaitTimeMS': 100," " 'serverId': %" PRIu32 "}", server_id)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'collection'," " 'maxTimeMS': {'$numberLong': '100'}}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 1}]}}")); BSON_ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 1}"); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_cursor_int64_t_maxtimems(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; future_t *future; request_t *request; bson_t *max_await_time_ms; uint64_t ms_int64 = UINT32_MAX + (uint64_t)1; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); // Select a server to get the server_id. // mongoc_cursor_new_from_command_reply_with_opts expects to receive a // serverId when creating an open cursor (non-zero cursor.id) uint32_t server_id; { mongoc_server_description_t *sd = mongoc_client_select_server(client, false /* for_writes */, NULL /* prefs */, &error); ASSERT_OR_PRINT(sd, error); server_id = mongoc_server_description_id(sd); mongoc_server_description_destroy(sd); } max_await_time_ms = tmp_bson(NULL); bson_append_bool(max_await_time_ms, "tailable", 8, true); bson_append_bool(max_await_time_ms, "awaitData", 9, true); bson_append_int64(max_await_time_ms, MONGOC_CURSOR_MAX_AWAIT_TIME_MS, MONGOC_CURSOR_MAX_AWAIT_TIME_MS_LEN, ms_int64); ASSERT(mlib_in_range(int32_t, server_id)); BSON_APPEND_INT32(max_await_time_ms, "serverId", (uint32_t)server_id); cursor = mongoc_cursor_new_from_command_reply_with_opts(client, bson_copy(tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.collection'," " 'firstBatch': []" " }" "}")), max_await_time_ms); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': 'collection'," " 'maxTimeMS': {'$numberLong': '%" PRIu64 "'}}", ms_int64)); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'firstBatch': [{'_id': 1}]}}")); BSON_ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'_id': 1}"); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_cursor_new_ignores_fields(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); cursor = mongoc_cursor_new_from_command_reply_with_opts(client, bson_copy(tmp_bson("{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.foo'," " 'firstBatch': []" " }," " 'operationTime' : {}," " '$clusterTime': {}," " '$gleStats': {}" "}")), tmp_bson("{'batchSize': 10}")); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT_MATCH(&cursor->opts, "{'batchSize': 10}"); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_cursor_new_invalid_filter(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *error_doc; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{'': 1}"), NULL, NULL); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Invalid filter: Element key cannot be an empty string"); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); ASSERT(bson_empty(error_doc)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_cursor_new_invalid_opts(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *error_doc; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), tmp_bson("{'projection': {'': 1}}"), NULL); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Invalid opts: Element key cannot be an empty string"); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); ASSERT(bson_empty(error_doc)); mongoc_cursor_destroy(cursor); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), tmp_bson("{'$invalid': 1}"), NULL); ASSERT(cursor); ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot use $-modifiers in opts: \"$invalid\""); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); ASSERT(bson_empty(error_doc)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_cursor_new_static(void) { mongoc_client_t *client; bson_error_t error; mongoc_cursor_t *cursor; bson_t *bson_alloced; bson_t bson_static; bson_t *bson_copied; bson_alloced = tmp_bson("{ 'ok':1," " 'cursor': {" " 'id': 0," " 'ns': 'test.foo'," " 'firstBatch': [{'x': 1}, {'x': 2}]}}"); ASSERT(bson_init_static(&bson_static, bson_get_data(bson_alloced), bson_alloced->len)); /* test heap-allocated bson */ client = test_framework_new_default_client(); bson_copied = bson_copy(bson_alloced); cursor = mongoc_cursor_new_from_command_reply_with_opts(client, bson_copied, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); /* test static bson */ cursor = mongoc_cursor_new_from_command_reply_with_opts(client, &bson_static, NULL); ASSERT(cursor); ASSERT(!mongoc_cursor_error(cursor, &error)); mongoc_cursor_destroy(cursor); mongoc_client_destroy(client); } static void test_cursor_hint_errors(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "db", "collection"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL, NULL); capture_logs(true); ASSERT(!mongoc_cursor_set_server_id(cursor, 0)); ASSERT_CAPTURED_LOG("mongoc_cursor_set_server_id", MONGOC_LOG_LEVEL_ERROR, "cannot set server_id to 0"); capture_logs(true); /* clear logs */ ASSERT(mongoc_cursor_set_server_id(cursor, 123)); ASSERT_CMPUINT32((uint32_t)123, ==, mongoc_cursor_get_server_id(cursor)); ASSERT_NO_CAPTURED_LOGS("mongoc_cursor_set_server_id"); ASSERT(!mongoc_cursor_set_server_id(cursor, 42)); ASSERT_CAPTURED_LOG("mongoc_cursor_set_server_id", MONGOC_LOG_LEVEL_ERROR, "server_id already set"); /* last set_hint had no effect */ ASSERT_CMPUINT32((uint32_t)123, ==, mongoc_cursor_get_server_id(cursor)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static uint32_t server_id_for_read_mode(mongoc_client_t *client, mongoc_read_mode_t read_mode) { ASSERT(client); mongoc_read_prefs_t *prefs; mongoc_server_description_t *sd; bson_error_t error; uint32_t server_id; prefs = mongoc_read_prefs_new(read_mode); sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, prefs, NULL, &error); ASSERT_OR_PRINT(sd, error); server_id = sd->id; mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(prefs); return server_id; } static void _test_cursor_hint(bool pooled, bool use_primary) { mock_rs_t *rs; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *q = BCON_NEW("a", BCON_INT32(1)); mongoc_cursor_t *cursor; uint32_t server_id; const bson_t *doc = NULL; future_t *future; request_t *request; /* wire version WIRE_VERSION_MIN, primary, two secondaries, no arbiters */ rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, true, 2, 0); mock_rs_run(rs); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_rs_get_uri(rs), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); } collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, q, NULL, NULL); ASSERT_CMPUINT32((uint32_t)0, ==, mongoc_cursor_get_server_id(cursor)); if (use_primary) { server_id = server_id_for_read_mode(client, MONGOC_READ_PRIMARY); } else { server_id = server_id_for_read_mode(client, MONGOC_READ_SECONDARY); } ASSERT(mongoc_cursor_set_server_id(cursor, server_id)); ASSERT_CMPUINT32(server_id, ==, mongoc_cursor_get_server_id(cursor)); future = future_cursor_next(cursor, &doc); request = mock_rs_receives_msg(rs, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test', 'filter': {'a': 1}}")); if (use_primary) { BSON_ASSERT(mock_rs_request_is_to_primary(rs, request)); } else { BSON_ASSERT(mock_rs_request_is_to_secondary(rs, request)); } reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'test.test'," " 'firstBatch': [{'b': 1}]}}")); BSON_ASSERT(future_get_bool(future)); ASSERT_MATCH(doc, "{'b': 1}"); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); if (pooled) { capture_logs(true); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); capture_logs(false); } else { mongoc_client_destroy(client); } mock_rs_destroy(rs); bson_destroy(q); } static void test_hint_single_secondary(void) { _test_cursor_hint(false, false); } static void test_hint_single_primary(void) { _test_cursor_hint(false, true); } static void test_hint_pooled_secondary(void) { _test_cursor_hint(true, false); } static void test_hint_pooled_primary(void) { _test_cursor_hint(true, true); } mongoc_read_mode_t modes[] = { MONGOC_READ_PRIMARY, MONGOC_READ_PRIMARY_PREFERRED, MONGOC_READ_SECONDARY, MONGOC_READ_SECONDARY_PREFERRED, MONGOC_READ_NEAREST, }; mongoc_query_flags_t expected_flag[] = { MONGOC_QUERY_NONE, MONGOC_QUERY_SECONDARY_OK, MONGOC_QUERY_SECONDARY_OK, MONGOC_QUERY_SECONDARY_OK, MONGOC_QUERY_SECONDARY_OK, }; /* test that mongoc_cursor_set_server_id sets secondaryOk for mongos only if read * pref is secondaryPreferred. */ static void test_cursor_hint_mongos(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; size_t i; mongoc_read_prefs_t *prefs; mongoc_cursor_t *cursor; const bson_t *doc = NULL; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); for (i = 0; i < sizeof(modes) / sizeof(mongoc_read_mode_t); i++) { prefs = mongoc_read_prefs_new(modes[i]); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), NULL, NULL); ASSERT_CMPUINT32((uint32_t)0, ==, mongoc_cursor_get_server_id(cursor)); ASSERT(mongoc_cursor_set_server_id(cursor, 1)); ASSERT_CMPUINT32((uint32_t)1, ==, mongoc_cursor_get_server_id(cursor)); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test', 'filter': {}}")); reply_to_request_simple(request, "{'ok':1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{}]}}"); BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_cursor_hint_mongos_cmd(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; size_t i; mongoc_read_prefs_t *prefs; const bson_t *doc = NULL; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); for (i = 0; i < sizeof(modes) / sizeof(mongoc_read_mode_t); i++) { prefs = mongoc_read_prefs_new(modes[i]); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), NULL, NULL); ASSERT_CMPUINT32((uint32_t)0, ==, mongoc_cursor_get_server_id(cursor)); ASSERT(mongoc_cursor_set_server_id(cursor, 1)); ASSERT_CMPUINT32((uint32_t)1, ==, mongoc_cursor_get_server_id(cursor)); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'find': 'test'}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'test.test'," " 'firstBatch': [{}]}}"); BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); } mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } /* Tests CDRIVER-562: after calling hello to handshake a new connection we * must update topology description with the server response. If not, this test * fails under auth with "auth failed" because we use the wrong auth protocol. */ static void _test_cursor_hint_no_warmup(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; bson_t *q = tmp_bson(NULL); mongoc_cursor_t *cursor; const bson_t *doc = NULL; bson_error_t error; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } collection = get_test_collection(client, "test_cursor_hint_no_warmup"); cursor = mongoc_collection_find_with_opts(collection, q, NULL, NULL); /* no chance for topology scan, no server selection */ ASSERT(mongoc_cursor_set_server_id(cursor, 1)); ASSERT_CMPUINT32(1, ==, mongoc_cursor_get_server_id(cursor)); mongoc_cursor_next(cursor, &doc); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_hint_no_warmup_single(void) { _test_cursor_hint_no_warmup(false); } static void test_hint_no_warmup_pooled(void) { _test_cursor_hint_no_warmup(true); } static void test_tailable_alive(void) { mongoc_client_t *client; mongoc_database_t *database; char *collection_name; mongoc_collection_t *collection; bool r; bson_error_t error; mongoc_cursor_t *cursor; const bson_t *doc; client = test_framework_new_default_client(); database = mongoc_client_get_database(client, "test"); collection_name = gen_collection_name("test"); collection = mongoc_database_get_collection(database, collection_name); mongoc_collection_drop(collection, NULL); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, collection_name, tmp_bson("{'capped': true, 'size': 10000}"), &error); ASSERT_OR_PRINT(collection, error); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); cursor = mongoc_collection_find_with_opts( collection, tmp_bson(NULL), tmp_bson("{'tailable': true, 'awaitData': true}"), NULL); ASSERT(mongoc_cursor_more(cursor)); ASSERT(mongoc_cursor_next(cursor, &doc)); /* still alive */ ASSERT(mongoc_cursor_more(cursor)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_database_destroy(database); bson_free(collection_name); mongoc_client_destroy(client); } typedef struct { int64_t skip; int64_t limit; int64_t batch_size; int64_t expected_n_return[3]; int64_t reply_length[3]; } cursor_n_return_test; static void _make_reply_batch(mcommon_string_append_t *reply, uint32_t n_docs, bool first_batch, bool finished) { uint32_t j; mcommon_string_append_printf(reply, "{'ok': 1, 'cursor': {" " 'id': %d," " 'ns': 'db.coll',", finished ? 0 : 123); if (first_batch) { mcommon_string_append(reply, "'firstBatch': [{}"); } else { mcommon_string_append(reply, "'nextBatch': [{}"); } for (j = 1; j < n_docs; j++) { mcommon_string_append(reply, ", {}"); } mcommon_string_append(reply, "]}}"); } static void _test_cursor_n_return_find_cmd(mongoc_cursor_t *cursor, mock_server_t *server, cursor_n_return_test *test) { bson_t find_cmd = BSON_INITIALIZER; bson_t getmore_cmd = BSON_INITIALIZER; const bson_t *doc; request_t *request; future_t *future; int j; int reply_no; bool cursor_finished; BSON_APPEND_UTF8(&find_cmd, "find", "coll"); if (test->skip) { BSON_APPEND_INT64(&find_cmd, "skip", test->skip); } if (test->limit > 0) { BSON_APPEND_INT64(&find_cmd, "limit", test->limit); } else if (test->limit < 0) { BSON_APPEND_INT64(&find_cmd, "limit", -test->limit); BSON_APPEND_BOOL(&find_cmd, "singleBatch", true); } if (test->batch_size) { BSON_APPEND_INT64(&find_cmd, "batchSize", BSON_ABS(test->batch_size)); } future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'}")); assert_match_bson(request_get_doc(request, 0), &find_cmd, true); { mcommon_string_append_t reply; mcommon_string_new_as_append(&reply); _make_reply_batch(&reply, (uint32_t)test->reply_length[0], true, false); reply_to_request_simple(request, mcommon_str_from_append(&reply)); mcommon_string_from_append_destroy(&reply); } ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); /* advance to the end of the batch */ for (j = 1; j < test->reply_length[0]; j++) { ASSERT(mongoc_cursor_next(cursor, &doc)); } for (reply_no = 1; reply_no < 3; reply_no++) { /* expect getMore command, send reply_length[reply_no] docs to client */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'}")); bson_reinit(&getmore_cmd); BSON_APPEND_INT64(&getmore_cmd, "getMore", 123); if (test->expected_n_return[reply_no] && test->batch_size) { BSON_APPEND_INT64(&getmore_cmd, "batchSize", BSON_ABS(test->expected_n_return[reply_no])); } else { BSON_APPEND_DOCUMENT(&getmore_cmd, "batchSize", tmp_bson("{'$exists': false}")); } assert_match_bson(request_get_doc(request, 0), &getmore_cmd, true); { mcommon_string_append_t reply; mcommon_string_new_as_append(&reply); cursor_finished = (reply_no == 2); _make_reply_batch(&reply, (uint32_t)test->reply_length[reply_no], false, cursor_finished); reply_to_request_simple(request, mcommon_str_from_append(&reply)); mcommon_string_from_append_destroy(&reply); } ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); /* advance to the end of the batch */ for (j = 1; j < test->reply_length[reply_no]; j++) { ASSERT(mongoc_cursor_next(cursor, &doc)); } } bson_destroy(&find_cmd); bson_destroy(&getmore_cmd); } static void _test_cursor_n_return(void) { cursor_n_return_test tests[] = {{ 0, /* skip */ 0, /* limit */ 0, /* batch_size */ {0, 0, 0}, /* expected_n_return */ {1, 1, 1} /* reply_length */ }, { 7, /* skip */ 0, /* limit */ 0, /* batch_size */ {0, 0, 0}, /* expected_n_return */ {1, 1, 1} /* reply_length */ }, { 0, /* skip */ 3, /* limit */ 0, /* batch_size */ {3, 2, 1}, /* expected_n_return */ {1, 1, 1} /* reply_length */ }, { 0, /* skip */ 5, /* limit */ 2, /* batch_size */ {2, 2, 1}, /* expected_n_return */ {2, 2, 1} /* reply_length */ }, { 0, /* skip */ 4, /* limit */ 7, /* batch_size */ {4, 2, 1}, /* expected_n_return */ {2, 1, 1} /* reply_length */ }, { 0, /* skip */ -3, /* limit */ 1, /* batch_size */ {-3, -3, -3}, /* expected_n_return */ {1, 1, 1} /* reply_length */ }}; cursor_n_return_test *test; size_t i; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_cursor_t *cursor; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "coll"); for (i = 0; i < sizeof(tests) / sizeof(cursor_n_return_test); i++) { test = &tests[i]; bson_reinit(&opts); if (test->skip) { BSON_APPEND_INT64(&opts, "skip", test->skip); } if (test->limit > 0) { BSON_APPEND_INT64(&opts, "limit", test->limit); } else if (test->limit < 0) { BSON_APPEND_INT64(&opts, "limit", -test->limit); BSON_APPEND_BOOL(&opts, "singleBatch", true); } if (test->batch_size) { BSON_APPEND_INT64(&opts, "batchSize", test->batch_size); } cursor = mongoc_collection_find_with_opts(collection, tmp_bson(NULL), &opts, NULL); _test_cursor_n_return_find_cmd(cursor, server, test); mongoc_cursor_destroy(cursor); } bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_n_return_find_cmd_with_opts(void) { _test_cursor_n_return(); } /* mongos can return empty final batch with limit and batchSize, which had * caused an abort in the cursor */ static void test_empty_final_batch_live(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; int i; bool r; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_empty_final_batch_live"); mongoc_collection_delete_many(collection, tmp_bson("{}"), NULL, NULL, NULL); for (i = 0; i < 3; i++) { r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); } cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'limit': 3, 'batchSize': 3}"), NULL); for (i = 0; i < 3; i++) { ASSERT(mongoc_cursor_next(cursor, &doc)); } ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_empty_final_batch(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "coll"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'limit': 1, 'batchSize': 1}"), NULL); /* * one document in first batch */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '1234'}," " 'ns': 'db.coll'," " 'firstBatch': [{}]}}")); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); /* * empty batch with nonzero cursor id */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '1234'}," " 'ns': 'db.coll'," " 'firstBatch': []}}")); ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future_destroy(future); request_destroy(request); /* * final batch, empty with zero cursor id */ future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'}")); ASSERT_CMPINT64(bson_lookup_int64(request_get_doc(request, 0), "batchSize"), ==, (int64_t)1); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.coll'," " 'firstBatch': []}}")); ASSERT(!future_get_bool(future)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_error_document_query(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; const bson_t *error_doc; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_error_document_query"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{'x': {'$badOperator': 1}}"), NULL, NULL); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); ASSERT_CMPUINT32(error.domain, ==, MONGOC_ERROR_SERVER); ASSERT_CONTAINS(error.message, "$badOperator"); ASSERT_CMPINT32(bson_lookup_int32(error_doc, "code"), ==, (int32_t)error.code); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_error_document_getmore(void) { mongoc_client_t *client; mongoc_collection_t *collection; int i; bool r; bson_error_t error; mongoc_cursor_t *cursor; const bson_t *doc; const bson_t *error_doc; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); collection = get_test_collection(client, "test_error_document_getmore"); mongoc_collection_drop(collection, NULL); for (i = 0; i < 10; i++) { r = mongoc_collection_insert_one(collection, tmp_bson("{'i': %d}", i), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); } cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'batchSize': 2}"), NULL); ASSERT(mongoc_cursor_next(cursor, &doc)); mongoc_collection_drop(collection, NULL); ASSERT(mongoc_cursor_next(cursor, &doc)); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_error_document(cursor, &error, &error_doc)); /* results vary by server version */ if (error.domain == MONGOC_ERROR_CURSOR) { /* MongoDB 3.0 and older */ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "cursor is invalid"); } else { /* MongoDB 3.2+ */ ASSERT_CMPUINT32(error.domain, ==, MONGOC_ERROR_SERVER); ASSERT_CMPINT32(bson_lookup_int32(error_doc, "code"), ==, (int32_t)error.code); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } /* test that an error during constructing a find cursor causes the cursor to * be marked as failed, mongoc_cursor_more returns false */ static void test_find_error_is_alive(void) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_cursor_t *cursor; bson_error_t err; const bson_t *bson; client = test_framework_new_default_client(); coll = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'$bad': 1}"), NULL); BSON_ASSERT(mongoc_cursor_error(cursor, &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot use $-modifiers"); BSON_ASSERT(!mongoc_cursor_more(cursor)); BSON_ASSERT(!mongoc_cursor_next(cursor, &bson)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } typedef struct _started_event_t { char *command_name; bson_t *command; } started_event_t; static void command_started(const mongoc_apm_command_started_t *event) { mongoc_array_t *events = (mongoc_array_t *)mongoc_apm_command_started_get_context(event); started_event_t *started_event = bson_malloc0(sizeof(started_event_t)); started_event->command = bson_copy(mongoc_apm_command_started_get_command(event)); started_event->command_name = bson_strdup(mongoc_apm_command_started_get_command_name(event)); _mongoc_array_append_val(events, started_event); } static void clear_started_events(mongoc_array_t *events) { for (size_t i = 0; i < events->len; i++) { started_event_t *started_event = _mongoc_array_index(events, started_event_t *, i); bson_destroy(started_event->command); bson_free(started_event->command_name); bson_free(started_event); } _mongoc_array_clear(events); } void numeric_iter_eq(bson_iter_t *iter, int64_t val) { ASSERT_CMPINT64(bson_iter_as_int64(iter), ==, val); } void decimal128_iter_eq(bson_iter_t *iter, int64_t val) { bson_decimal128_t d; bson_iter_decimal128(iter, &d); ASSERT_CMPUINT64(d.high, ==, 0x3040000000000000); ASSERT_CMPINT64(d.low, ==, val); } void test_cursor_batchsize_override(bson_t *findopts, void (*assert_eq)(bson_iter_t *, int64_t)) { mongoc_client_t *client; mongoc_apm_callbacks_t *cbs; mongoc_collection_t *coll; bson_error_t error; mongoc_array_t started_events; client = test_framework_new_default_client(); cbs = mongoc_apm_callbacks_new(); _mongoc_array_init(&started_events, sizeof(started_event_t *)); mongoc_apm_set_command_started_cb(cbs, command_started); coll = mongoc_client_get_collection(client, "db", "coll"); /* Drop and insert two documents into the collection */ { bson_t *to_insert = BCON_NEW("x", "y"); // Ignore "ns not found" error on drop. mongoc_collection_drop(coll, NULL); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, to_insert, NULL /* opts */, NULL /* reply */, &error), error); bson_destroy(to_insert); } mongoc_client_set_apm_callbacks(client, cbs, &started_events); /* Create a cursor and iterate once. */ { const bson_t *got; bson_t *filter = bson_new(); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, filter, findopts, NULL /* read_prefs */); /* Attempt to overwrite the 'batchSize' with 2. */ mongoc_cursor_set_batch_size(cursor, 2); /* Assert no command started events. The cursor does not send 'find' until * the first call to mongoc_cursor_next. */ ASSERT_CMPSIZE_T(started_events.len, ==, 0); /* Iterate once. */ ASSERT(mongoc_cursor_next(cursor, &got)); mongoc_cursor_destroy(cursor); bson_destroy(findopts); bson_destroy(filter); } /* Check events. */ { started_event_t *started_event; bson_iter_t iter; /* Expect first event is find. */ started_event = _mongoc_array_index(&started_events, started_event_t *, 0); ASSERT_CMPSTR(started_event->command_name, "find"); /* Expect the batchSize sent to be 2. */ ASSERT(bson_iter_init_find(&iter, started_event->command, "batchSize")); assert_eq(&iter, 2); } mongoc_collection_destroy(coll); mongoc_apm_callbacks_destroy(cbs); mongoc_client_destroy(client); clear_started_events(&started_events); _mongoc_array_destroy(&started_events); } /* Test that mongoc_cursor_set_batch_size overrides a previously set int32 * batchSize. */ void test_cursor_batchsize_override_int32(void) { bson_t *findopts = BCON_NEW("batchSize", BCON_INT32(1)); test_cursor_batchsize_override(findopts, numeric_iter_eq); } /* Test that mongoc_cursor_set_batch_size overrides a previously set int64 * batchSize. */ void test_cursor_batchsize_override_int64(void) { bson_t *findopts = BCON_NEW("batchSize", BCON_INT64(1)); test_cursor_batchsize_override(findopts, numeric_iter_eq); } /* Test that mongoc_cursor_set_batch_size overrides a previously set double * batchSize. */ void test_cursor_batchsize_override_double(void) { bson_t *findopts = BCON_NEW("batchSize", BCON_DOUBLE(1.0)); test_cursor_batchsize_override(findopts, numeric_iter_eq); } /* Test that mongoc_cursor_set_batch_size overrides a previously set decimal128 * batchSize. */ void test_cursor_batchsize_override_decimal128(void) { bson_decimal128_t start_val; bson_decimal128_from_string("1", &start_val); bson_t *findopts = BCON_NEW("batchSize", BCON_DECIMAL128(&start_val)); test_cursor_batchsize_override(findopts, decimal128_iter_eq); } /* Test that attempting to overwrite an int32 batchSize with an out-of-range * value raises a warning */ void test_cursor_batchsize_override_range_warning(void) { mongoc_client_t *client; mongoc_collection_t *coll; bson_t *findopts = BCON_NEW("batchSize", BCON_INT32(1)); client = test_framework_new_default_client(); coll = mongoc_client_get_collection(client, "db", "coll"); /* Create a cursor and attempt to override outside int32 range. */ { bson_t *filter = bson_new(); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, filter, findopts, NULL /* read_prefs */); capture_logs(true); /* Attempt to overwrite the 'batchSize' with uint32_max. */ mongoc_cursor_set_batch_size(cursor, UINT32_MAX); ASSERT_CAPTURED_LOG("mongoc_cursor_set_batch_size", MONGOC_LOG_LEVEL_WARNING, "unable to overwrite stored int32 batchSize with out-of-range value"); mongoc_cursor_destroy(cursor); bson_destroy(findopts); bson_destroy(filter); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Test using an open cursor created by // `mongoc_cursor_new_from_command_reply_with_opts`. // This is a regression test for CDRIVER-3969. static void test_open_cursor_from_reply(void) { mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error; bool ok; client = test_framework_new_default_client(); coll = get_test_collection(client, "test_open_cursor_from_reply"); // Drop collection to remove data from prior runs. // Ignore errors. Dropping a non-existing collection may return an "ns not // found" error. mongoc_collection_drop(coll, &error); // Insert two documents. { ok = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 0}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_collection_insert_one(coll, tmp_bson("{'_id': 1}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); } // Test creating an open cursor created without a serverId. Expect error. { mongoc_cursor_t *cursor; bson_t reply; // Use a smaller batchSize than the number of documents. The smaller // batchSize will result in the cursor being left open on the server. bson_t *cmd = tmp_bson("{'find': '%s', 'batchSize': 1}", mongoc_collection_get_name(coll)); ok = mongoc_collection_command_simple(coll, cmd, NULL /* read_prefs */, &reply, &error); ASSERT_OR_PRINT(ok, error); // Assert that the cursor has a non-zero cursorId. A non-zero cursorId // means the cursor is open on the server. { bson_iter_t iter; ASSERT(bson_iter_init(&iter, &reply)); ASSERT(bson_iter_find_descendant(&iter, "cursor.id", &iter)); ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), >, 0); } // `reply` is destroyed by // `mongoc_cursor_new_from_command_reply_with_opts`. cursor = mongoc_cursor_new_from_command_reply_with_opts(client, &reply, NULL /* opts */); // Expect an error to be returned. ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Expected `serverId` option"); mongoc_cursor_destroy(cursor); } // Test iterating an open cursor created with a serverId. Expect no error. { // Get a serverID. uint32_t server_id; { mongoc_server_description_t *sd = mongoc_client_select_server(client, true /* for_writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); server_id = mongoc_server_description_id(sd); mongoc_server_description_destroy(sd); } mongoc_cursor_t *cursor; bson_t reply; // Use a smaller batchSize than the number of documents. The smaller // batchSize will result in the cursor being left open on the server. bson_t *cmd = tmp_bson("{'find': '%s', 'batchSize': 1, 'sort': {'_id': 1}}", mongoc_collection_get_name(coll)); ok = mongoc_collection_command_with_opts( coll, cmd, NULL /* read_prefs */, tmp_bson("{'serverId': %" PRIu32 "}", server_id), &reply, &error); ASSERT_OR_PRINT(ok, error); // Assert that the cursor has a non-zero cursorId. A non-zero cursorId // means the cursor is open on the server. { bson_iter_t iter; ASSERT(bson_iter_init(&iter, &reply)); ASSERT(bson_iter_find_descendant(&iter, "cursor.id", &iter)); ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), >, 0); } // `reply` is destroyed by // `mongoc_cursor_new_from_command_reply_with_opts`. cursor = mongoc_cursor_new_from_command_reply_with_opts( client, &reply, tmp_bson("{'serverId': %" PRIu32 "}", server_id)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); const bson_t *got; bool found = mongoc_cursor_next(cursor, &got); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(found); ASSERT_MATCH(got, "{'_id': 0}"); found = mongoc_cursor_next(cursor, &got); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(found); ASSERT_MATCH(got, "{'_id': 1}"); found = mongoc_cursor_next(cursor, &got); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(!found); mongoc_cursor_destroy(cursor); } // Test destroying an open cursor created with a serverId. Expect no error. { // Get a serverID. uint32_t server_id; { mongoc_server_description_t *sd = mongoc_client_select_server(client, true /* for_writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); server_id = mongoc_server_description_id(sd); mongoc_server_description_destroy(sd); } mongoc_cursor_t *cursor; bson_t reply; // Use a smaller batchSize than the number of documents. The smaller // batchSize will result in the cursor being left open on the server. bson_t *cmd = tmp_bson("{'find': '%s', 'batchSize': 1}", mongoc_collection_get_name(coll)); ok = mongoc_collection_command_with_opts( coll, cmd, NULL /* read_prefs */, tmp_bson("{'serverId': %" PRIu32 "}", server_id), &reply, &error); ASSERT_OR_PRINT(ok, error); // Assert that the cursor has a non-zero cursorId. A non-zero cursorId // means the cursor is open on the server. { bson_iter_t iter; ASSERT(bson_iter_init(&iter, &reply)); ASSERT(bson_iter_find_descendant(&iter, "cursor.id", &iter)); ASSERT(BSON_ITER_HOLDS_INT64(&iter)); ASSERT_CMPINT64(bson_iter_int64(&iter), >, 0); } // `reply` is destroyed by // `mongoc_cursor_new_from_command_reply_with_opts`. cursor = mongoc_cursor_new_from_command_reply_with_opts( client, &reply, tmp_bson("{'serverId': %" PRIu32 "}", server_id)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); } mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_cursor_install(TestSuite *suite) { test_common_cursor_functions_install(suite); TestSuite_AddLive(suite, "/Cursor/limit", test_limit); TestSuite_AddLive(suite, "" "/Cursor/kill/live", test_kill_cursor_live); TestSuite_AddMockServerTest(suite, "/Cursor/kill/single", test_kill_cursors_single); TestSuite_AddMockServerTest(suite, "/Cursor/kill/pooled", test_kill_cursors_pooled); TestSuite_AddLive(suite, "/Cursor/empty_collection", test_cursor_empty_collection); TestSuite_AddLive(suite, "/Cursor/new_from_agg", test_cursor_new_from_aggregate); TestSuite_AddLive(suite, "/Cursor/new_from_agg_no_initial", test_cursor_new_from_aggregate_no_initial); TestSuite_AddFull( suite, "/Cursor/new_from_find [lock:live-server]", test_cursor_new_from_find, NULL, NULL, TestSuite_CheckLive); TestSuite_AddFull(suite, "/Cursor/new_from_find_batches [lock:live-server]", test_cursor_new_from_find_batches, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/Cursor/new_invalid", test_cursor_new_invalid); TestSuite_AddMockServerTest(suite, "/Cursor/new_tailable_await", test_cursor_new_tailable_await); TestSuite_AddMockServerTest(suite, "/Cursor/int64_t_maxtimems", test_cursor_int64_t_maxtimems); TestSuite_AddMockServerTest(suite, "/Cursor/new_ignores_fields", test_cursor_new_ignores_fields); TestSuite_AddLive(suite, "/Cursor/new_invalid_filter", test_cursor_new_invalid_filter); TestSuite_AddLive(suite, "/Cursor/new_invalid_opts", test_cursor_new_invalid_opts); TestSuite_AddLive(suite, "/Cursor/new_static", test_cursor_new_static); TestSuite_AddLive(suite, "/Cursor/hint/errors", test_cursor_hint_errors); TestSuite_AddMockServerTest(suite, "/Cursor/hint/single/secondary", test_hint_single_secondary); TestSuite_AddMockServerTest(suite, "/Cursor/hint/single/primary", test_hint_single_primary); TestSuite_AddMockServerTest(suite, "/Cursor/hint/pooled/secondary", test_hint_pooled_secondary); TestSuite_AddMockServerTest(suite, "/Cursor/hint/pooled/primary", test_hint_pooled_primary); TestSuite_AddMockServerTest(suite, "/Cursor/hint/mongos", test_cursor_hint_mongos); TestSuite_AddMockServerTest(suite, "/Cursor/hint/mongos/cmd", test_cursor_hint_mongos_cmd); TestSuite_AddLive(suite, "/Cursor/hint/no_warmup/single", test_hint_no_warmup_single); TestSuite_AddLive(suite, "/Cursor/hint/no_warmup/pooled", test_hint_no_warmup_pooled); TestSuite_AddLive(suite, "/Cursor/tailable/alive", test_tailable_alive); TestSuite_AddMockServerTest(suite, "/Cursor/n_return/find_cmd/with_opts", test_n_return_find_cmd_with_opts); TestSuite_AddLive(suite, "/Cursor/empty_final_batch_live", test_empty_final_batch_live); TestSuite_AddMockServerTest(suite, "/Cursor/empty_final_batch", test_empty_final_batch); TestSuite_AddLive(suite, "/Cursor/error_document/query", test_error_document_query); TestSuite_AddLive(suite, "/Cursor/error_document/getmore", test_error_document_getmore); TestSuite_AddLive(suite, "/Cursor/find_error/is_alive", test_find_error_is_alive); TestSuite_AddLive(suite, "/Cursor/batchsize_override_int32", test_cursor_batchsize_override_int32); TestSuite_AddLive(suite, "/Cursor/batchsize_override_int64", test_cursor_batchsize_override_int64); TestSuite_AddLive(suite, "/Cursor/batchsize_override_double", test_cursor_batchsize_override_double); TestSuite_AddLive(suite, "/Cursor/batchsize_override_decimal128", test_cursor_batchsize_override_decimal128); TestSuite_AddLive(suite, "/Cursor/batchsize_override_range_warning", test_cursor_batchsize_override_range_warning); TestSuite_AddLive(suite, "/Cursor/open_cursor_from_reply", test_open_cursor_from_reply); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-cyrus.c000066400000000000000000000061731511661753600240360ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include static void test_sasl_properties(void) { mongoc_uri_t *uri; mongoc_cyrus_t sasl; uri = mongoc_uri_new("mongodb://user@host/?authMechanism=GSSAPI&" "authMechanismProperties=SERVICE_NAME:sn,CANONICALIZE_HOST_NAME:TrUe"); BSON_ASSERT(uri); memset(&sasl, 0, sizeof sasl); _mongoc_sasl_set_properties((mongoc_sasl_t *)&sasl, uri); ASSERT(sasl.credentials.canonicalize_host_name); ASSERT_CMPSTR(sasl.credentials.service_name, "sn"); mongoc_uri_destroy(uri); capture_logs(true); /* authMechanismProperties take precedence */ uri = mongoc_uri_new("mongodb://user@host/?authMechanism=GSSAPI&" "canonicalizeHostname=true&gssapiServiceName=blah&" "authMechanismProperties=SERVICE_NAME:sn,CANONICALIZE_HOST_NAME:False"); ASSERT_CAPTURED_LOG("authMechanismProperties should overwrite gssapiServiceName", MONGOC_LOG_LEVEL_WARNING, "Overwriting previously provided value for 'authmechanismproperties'"); _mongoc_cyrus_destroy(&sasl); memset(&sasl, 0, sizeof sasl); _mongoc_sasl_set_properties((mongoc_sasl_t *)&sasl, uri); ASSERT(!sasl.credentials.canonicalize_host_name); ASSERT_CMPSTR(sasl.credentials.service_name, "sn"); _mongoc_cyrus_destroy(&sasl); mongoc_uri_destroy(uri); } static void test_sasl_canonicalize_hostname(void *ctx) { mongoc_client_t *client; mongoc_server_stream_t *ss; char real_name[BSON_HOST_NAME_MAX + 1] = {'\0'}; bson_error_t error; BSON_UNUSED(ctx); client = test_framework_new_default_client(); ss = mongoc_cluster_stream_for_reads(&client->cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(ss, error); BSON_ASSERT(_mongoc_sasl_get_canonicalized_name(ss->stream, real_name, sizeof real_name)); ASSERT_CMPSIZE_T(strlen(real_name), >, (size_t)0); mongoc_server_stream_cleanup(ss); mongoc_client_destroy(client); } void test_cyrus_install(TestSuite *suite) { TestSuite_Add(suite, "/SASL/properties", test_sasl_properties); TestSuite_AddFull(suite, "/SASL/canonicalize [lock:live-server]", test_sasl_canonicalize_hostname, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_offline); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-database.c000066400000000000000000000743551511661753600244440ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include #include static void test_aggregate_inherit_database(void) { mock_server_t *server; mongoc_client_t *client; mongoc_cursor_t *cursor; mongoc_database_t *database; const bson_t *doc; request_t *request; future_t *future; bson_t *pipeline; bson_t opts = BSON_INITIALIZER; mongoc_read_concern_t *rc2; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc2; mongoc_write_concern_t *wc; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); database = mongoc_client_get_database(client, "admin"); pipeline = BCON_NEW("pipeline", "[", "{", "$currentOp", "{", "}", "}", "{", "$out", BCON_UTF8("ops"), "}", "]"); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_read_concern_append(rc, &opts); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_write_concern_append(wc, &opts); /* Uses the opts */ cursor = mongoc_database_aggregate(database, pipeline, &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate' : 1," " 'pipeline' : [ { '$currentOp': { } }, { '$out' : 'ops' } ]," " 'cursor' : { }," " '$db' : 'admin'," " '$readPreference' : { '$exists': false }," " 'readConcern' : { 'level' : 'majority' }," " 'writeConcern' : { 'w' : 2 } }")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(!future_get_bool(future)); /* Set database level defaults */ wc2 = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc2, 3); mongoc_database_set_write_concern(database, wc2); rc2 = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc2, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_database_set_read_concern(database, rc2); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); /* Inherits from database */ cursor = mongoc_database_aggregate(database, pipeline, NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate' : 1," " 'pipeline' : [ { '$currentOp': { } }, { '$out' : 'ops' } ]," " 'cursor' : { }," " '$db' : 'admin'," " '$readPreference' : { '$exists': false }," " 'readConcern' : { 'level' : 'local' }," " 'writeConcern' : { 'w' : 3 } }")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(!future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); /* Uses the opts, not default database level */ cursor = mongoc_database_aggregate(database, pipeline, &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate' : 1," " 'pipeline' : [ { '$currentOp': { } }, { '$out' : 'ops' } ]," " 'cursor' : { }," " '$db' : 'admin'," " '$readPreference' : { '$exists': false }," " 'readConcern' : { 'level' : 'majority' }," " 'writeConcern' : { 'w' : 2 } }")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(!future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); /* Doesn't inherit write concern when not using $out */ bson_destroy(pipeline); pipeline = BCON_NEW("pipeline", "[", "{", "$currentOp", "{", "}", "}", "]"); cursor = mongoc_database_aggregate(database, pipeline, NULL, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{ 'aggregate' : 1," " 'pipeline' : [ { '$currentOp': { } } ]," " 'cursor' : { }," " '$db' : 'admin'," " '$readPreference' : { '$exists': false }," " 'readConcern' : { 'level' : 'local' }," " 'writeConcern' : { '$exists' : false } }")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(!future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); bson_destroy(&opts); bson_destroy(pipeline); mongoc_read_concern_destroy(rc); mongoc_read_concern_destroy(rc2); mongoc_write_concern_destroy(wc); mongoc_write_concern_destroy(wc2); mongoc_database_destroy(database); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_create_with_write_concern(void *ctx) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error = {0}; mongoc_write_concern_t *bad_wc; mongoc_write_concern_t *good_wc; bson_t *opts = NULL; char *dbname; char *name; BSON_UNUSED(ctx); capture_logs(true); opts = bson_new(); client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_client_set_error_api(client, 2); bad_wc = mongoc_write_concern_new(); good_wc = mongoc_write_concern_new(); dbname = gen_collection_name("dbtest"); database = mongoc_client_get_database(client, dbname); BSON_ASSERT(database); name = gen_collection_name("create_collection"); /* writeConcern that will not pass mongoc_write_concern_is_valid */ bad_wc->wtimeout = -10; bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); collection = mongoc_database_create_collection(database, name, opts, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); ASSERT(!collection); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern on all configs */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); collection = mongoc_database_create_collection(database, name, opts, &error); ASSERT_OR_PRINT(collection, error); ASSERT(!error.code); ASSERT(!error.domain); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_collection_destroy(collection); /* writeConcern that results in writeConcernError */ bad_wc->wtimeout = 0; mongoc_write_concern_set_w(bad_wc, 99); if (!test_framework_is_mongos()) { /* skip if sharded */ bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); collection = mongoc_database_create_collection(database, name, opts, &error); ASSERT(!collection); assert_wc_oob_error(&error); } mongoc_database_destroy(database); bson_free(name); bson_free(dbname); bson_destroy(opts); mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); mongoc_client_destroy(client); } static void test_copy(void) { mongoc_database_t *database; mongoc_database_t *copy; mongoc_client_t *client; client = test_framework_new_default_client(); ASSERT(client); database = mongoc_client_get_database(client, "test"); ASSERT(database); copy = mongoc_database_copy(database); ASSERT(copy); ASSERT(copy->client == database->client); ASSERT(strcmp(copy->name, database->name) == 0); mongoc_database_destroy(copy); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_has_collection(void) { mongoc_collection_t *collection; mongoc_database_t *database; mongoc_client_t *client; bson_error_t error; char *name; bool r; bson_oid_t oid; bson_t b; client = test_framework_new_default_client(); BSON_ASSERT(client); name = gen_collection_name("has_collection"); collection = mongoc_client_get_collection(client, "test", name); BSON_ASSERT(collection); database = mongoc_client_get_database(client, "test"); BSON_ASSERT(database); bson_init(&b); bson_oid_init(&oid, NULL); bson_append_oid(&b, "_id", 3, &oid); bson_append_utf8(&b, "hello", 5, "world", 5); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &b, NULL, NULL, &error), error); bson_destroy(&b); r = mongoc_database_has_collection(database, name, &error); BSON_ASSERT(!error.domain); BSON_ASSERT(r); bson_free(name); mongoc_database_destroy(database); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void _test_db_command_read_prefs(bool pooled) { mock_server_t *server; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_database_t *db; mongoc_read_prefs_t *secondary_pref; bson_t *cmd; future_t *future; bson_error_t error; request_t *request; /* mock mongos: easiest way to test that read preference is configured */ server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); } db = mongoc_client_get_database(client, "db"); secondary_pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_database_set_read_prefs(db, secondary_pref); cmd = tmp_bson("{'foo': 1}"); /* without read preference */ future = future_database_command_simple(db, cmd, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'foo': 1}")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); /* with read preference */ future = future_database_command_simple(db, cmd, secondary_pref, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'foo': 1," " '$readPreference': {'mode': 'secondary'}}")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_database_destroy(db); mongoc_read_prefs_destroy(secondary_pref); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mock_server_destroy(server); } static void test_db_command_simple_read_prefs_single(void) { _test_db_command_read_prefs(false); } static void test_db_command_simple_read_prefs_pooled(void) { _test_db_command_read_prefs(true); } static void test_drop(void) { mongoc_client_t *client; mongoc_database_t *database; mongoc_collection_t *collection; bson_error_t error = {0}; bson_t *opts = NULL; char *dbname; mongoc_write_concern_t *good_wc; mongoc_write_concern_t *bad_wc; bool r; opts = bson_new(); client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_client_set_error_api(client, 2); bad_wc = mongoc_write_concern_new(); good_wc = mongoc_write_concern_new(); dbname = gen_collection_name("db_drop_test"); database = mongoc_client_get_database(client, dbname); /* MongoDB 3.2+ must create at least one replicated database before * dropDatabase will check writeConcern, see SERVER-25601 */ collection = mongoc_database_get_collection(database, "collection"); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_OR_PRINT(mongoc_database_drop(database, &error), error); BSON_ASSERT(!error.domain); BSON_ASSERT(!error.code); mongoc_database_destroy(database); /* invalid writeConcern */ bad_wc->wtimeout = -10; database = mongoc_client_get_database(client, dbname); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); ASSERT(!mongoc_database_drop_with_opts(database, opts, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); bad_wc->wtimeout = 0; error.code = 0; error.domain = 0; /* valid writeConcern */ mongoc_write_concern_set_w(good_wc, 1); bson_reinit(opts); mongoc_write_concern_append(good_wc, opts); ASSERT_OR_PRINT(mongoc_database_drop_with_opts(database, opts, &error), error); BSON_ASSERT(!error.code); BSON_ASSERT(!error.domain); /* invalid writeConcern */ mongoc_write_concern_set_w(bad_wc, 99); mongoc_database_destroy(database); if (!test_framework_is_mongos()) { /* skip if sharded */ database = mongoc_client_get_database(client, dbname); bson_reinit(opts); mongoc_write_concern_append_bad(bad_wc, opts); r = mongoc_database_drop_with_opts(database, opts, &error); ASSERT(!r); assert_wc_oob_error(&error); mongoc_database_destroy(database); } bson_free(dbname); bson_destroy(opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_write_concern_destroy(good_wc); mongoc_write_concern_destroy(bad_wc); } static void test_create_collection(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error = {0}; bson_t options; bson_t storage_opts; bson_t wt_opts; char *dbname; char *name; client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("dbtest"); database = mongoc_client_get_database(client, dbname); BSON_ASSERT(database); bson_free(dbname); bson_init(&options); BSON_APPEND_INT32(&options, "size", 1234); BSON_APPEND_INT32(&options, "max", 4567); BSON_APPEND_BOOL(&options, "capped", true); BSON_APPEND_DOCUMENT_BEGIN(&options, "storageEngine", &storage_opts); BSON_APPEND_DOCUMENT_BEGIN(&storage_opts, "wiredTiger", &wt_opts); BSON_APPEND_UTF8(&wt_opts, "configString", "block_compressor=zlib"); bson_append_document_end(&storage_opts, &wt_opts); bson_append_document_end(&options, &storage_opts); name = gen_collection_name("create_collection"); ASSERT_OR_PRINT(collection = mongoc_database_create_collection(database, name, &options, &error), error); bson_destroy(&options); bson_free(name); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); ASSERT_OR_PRINT(mongoc_database_drop(database, &error), error); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_get_collection_info(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error = {0}; bson_iter_t col_iter; bson_t capped_options = BSON_INITIALIZER; bson_t noopts_options = BSON_INITIALIZER; const bson_t *doc; int num_infos = 0; const char *name; char *dbname; char *capped_name; char *noopts_name; client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("dbtest"); database = mongoc_client_get_database(client, dbname); BSON_ASSERT(database); bson_free(dbname); capped_name = gen_collection_name("capped"); BSON_APPEND_BOOL(&capped_options, "capped", true); BSON_APPEND_INT32(&capped_options, "size", 10000000); BSON_APPEND_INT32(&capped_options, "max", 1024); noopts_name = gen_collection_name("noopts"); collection = mongoc_database_create_collection(database, capped_name, &capped_options, &error); ASSERT_OR_PRINT(collection, error); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, noopts_name, &noopts_options, &error); ASSERT_OR_PRINT(collection, error); mongoc_collection_destroy(collection); /* We only test with filters since get_collection_names will * test w/o filters for us. */ /* Filter on an exact match of name */ cursor = mongoc_database_find_collections_with_opts(database, tmp_bson("{'filter': {'name': '%s'}}", noopts_name)); BSON_ASSERT(cursor); while (mongoc_cursor_next(cursor, &doc)) { if (bson_iter_init(&col_iter, doc) && bson_iter_find(&col_iter, "name") && BSON_ITER_HOLDS_UTF8(&col_iter) && (name = bson_iter_utf8(&col_iter, NULL))) { ++num_infos; BSON_ASSERT(0 == strcmp(name, noopts_name)); } else { BSON_ASSERT(false); } } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); BSON_ASSERT(1 == num_infos); mongoc_cursor_destroy(cursor); ASSERT_OR_PRINT(mongoc_database_drop(database, &error), error); BSON_ASSERT(!error.domain); BSON_ASSERT(!error.code); bson_free(capped_name); bson_free(noopts_name); bson_destroy(&capped_options); bson_destroy(&noopts_options); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_get_collection_info_with_opts_regex(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_cursor_t *cursor; bson_error_t error = {0}; bson_iter_t col_iter; bson_t opts = BSON_INITIALIZER; bson_t name_filter; const bson_t *doc; char *dbname; client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("test_get_collection_info_regex"); database = mongoc_client_get_database(client, dbname); mongoc_database_drop_with_opts(database, NULL, NULL); collection = mongoc_database_create_collection(database, "abbbc", NULL, &error); ASSERT_OR_PRINT(collection, error); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, "foo", NULL, &error); ASSERT_OR_PRINT(collection, error); BSON_APPEND_DOCUMENT_BEGIN(&opts, "filter", &name_filter); BSON_APPEND_REGEX(&name_filter, "name", "ab+c", NULL); bson_append_document_end(&opts, &name_filter); cursor = mongoc_database_find_collections_with_opts(database, &opts); BSON_ASSERT(cursor); BSON_ASSERT(!error.domain); BSON_ASSERT(!error.code); BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(bson_iter_init_find(&col_iter, doc, "name")); BSON_ASSERT(0 == strcmp(bson_iter_utf8(&col_iter, NULL), "abbbc")); /* only one match */ BSON_ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); bson_destroy(&opts); mongoc_collection_destroy(collection); bson_free(dbname); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void _test_get_collection_info_getmore(void) { mock_server_t *server; mongoc_client_t *client; mongoc_database_t *database; future_t *future; request_t *request; char **names; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); database = mongoc_client_get_database(client, "db"); future = future_database_get_collection_names_with_opts(database, NULL, NULL); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'listCollections': 1, 'nameOnly': true}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '123'}," " 'ns': 'db.$cmd.listCollections'," " 'firstBatch': [{'name': 'a'}]}}"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'getMore': {'$numberLong': '123'}," " 'collection': '$cmd.listCollections'}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.$cmd.listCollections'," " 'nextBatch': []}}"); request_destroy(request); names = future_get_char_ptr_ptr(future); BSON_ASSERT(names); ASSERT_CMPSTR(names[0], "a"); bson_strfreev(names); future_destroy(future); mongoc_database_destroy(database); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_get_collection_info_getmore_cmd(void) { _test_get_collection_info_getmore(); } static void test_get_collection(void) { mongoc_client_t *client; mongoc_database_t *database; mongoc_write_concern_t *wc; mongoc_read_concern_t *rc; mongoc_read_prefs_t *read_prefs; mongoc_collection_t *collection; client = test_framework_new_default_client(); BSON_ASSERT(client); database = mongoc_client_get_database(client, "test"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_database_set_write_concern(database, wc); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, "majority"); mongoc_database_set_read_concern(database, rc); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_database_set_read_prefs(database, read_prefs); collection = mongoc_database_get_collection(database, "test"); ASSERT_CMPINT32(collection->write_concern->w, ==, 2); ASSERT_CMPSTR(collection->read_concern->level, "majority"); ASSERT_CMPINT(collection->read_prefs->mode, ==, MONGOC_READ_SECONDARY); mongoc_collection_destroy(collection); mongoc_read_prefs_destroy(read_prefs); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_get_collection_names(void) { mongoc_database_t *database; mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error = {0}; bson_t options; int namecount; int explicit_nameonly; char **names; char **name; char *curname; char *dbname; char *name1; char *name2; char *name3; char *name4; char *name5; const char *system_prefix = "system."; client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("dbtest"); database = mongoc_client_get_database(client, dbname); BSON_ASSERT(database); bson_free(dbname); bson_init(&options); name1 = gen_collection_name("name1"); name2 = gen_collection_name("name2"); name3 = gen_collection_name("name3"); name4 = gen_collection_name("name4"); name5 = gen_collection_name("name5"); collection = mongoc_database_create_collection(database, name1, &options, &error); BSON_ASSERT(collection); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, name2, &options, &error); BSON_ASSERT(collection); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, name3, &options, &error); BSON_ASSERT(collection); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, name4, &options, &error); BSON_ASSERT(collection); mongoc_collection_destroy(collection); collection = mongoc_database_create_collection(database, name5, &options, &error); BSON_ASSERT(collection); mongoc_collection_destroy(collection); for (explicit_nameonly = 0; explicit_nameonly <= 1; explicit_nameonly++) { namecount = 0; /* ensure that if users happen to pass nameOnly in opts we don't * append it again and cause a "duplicate field" server error */ if (explicit_nameonly) { names = mongoc_database_get_collection_names_with_opts(database, tmp_bson("{'nameOnly': true}"), &error); } else { names = mongoc_database_get_collection_names_with_opts(database, NULL, &error); } BSON_ASSERT(!error.domain); BSON_ASSERT(!error.code); for (name = names; *name; ++name) { /* inefficient, but OK for a unit test. */ curname = *name; if (0 == strcmp(curname, name1) || 0 == strcmp(curname, name2) || 0 == strcmp(curname, name3) || 0 == strcmp(curname, name4) || 0 == strcmp(curname, name5)) { ++namecount; } else if (0 == strncmp(curname, system_prefix, strlen(system_prefix))) { /* Collections prefixed with 'system.' are system collections */ } else { BSON_ASSERT(false); } bson_free(curname); } BSON_ASSERT(namecount == 5); bson_free(names); } bson_free(name1); bson_free(name2); bson_free(name3); bson_free(name4); bson_free(name5); ASSERT_OR_PRINT(mongoc_database_drop(database, &error), error); BSON_ASSERT(!error.domain); BSON_ASSERT(!error.code); bson_destroy(&options); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_get_collection_names_error(void) { mongoc_database_t *database; mongoc_uri_t *uri; mongoc_client_t *client; mock_server_t *server; bson_error_t error = {0}; bson_t b = BSON_INITIALIZER; future_t *future; request_t *request; char **names; capture_logs(true); server = mock_server_new(); mock_server_auto_hello(server, "{'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); client = test_framework_client_new_from_uri(uri, NULL); database = mongoc_client_get_database(client, "test"); future = future_database_get_collection_names_with_opts(database, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test', 'listCollections': 1, 'nameOnly': true}")); reply_to_request_with_hang_up(request); names = future_get_char_ptr_ptr(future); BSON_ASSERT(!names); ASSERT_CMPINT(MONGOC_ERROR_STREAM, ==, error.domain); ASSERT_CMPINT(MONGOC_ERROR_STREAM_SOCKET, ==, error.code); request_destroy(request); future_destroy(future); mongoc_database_destroy(database); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); bson_destroy(&b); } static void test_get_default_database(void) { /* default database is "db_name" */ mongoc_client_t *client = test_framework_client_new("mongodb://host/db_name", NULL); mongoc_database_t *db = mongoc_client_get_default_database(client); BSON_ASSERT(!strcmp("db_name", mongoc_database_get_name(db))); mongoc_database_destroy(db); mongoc_client_destroy(client); /* no default database */ client = test_framework_client_new("mongodb://host/", NULL); db = mongoc_client_get_default_database(client); BSON_ASSERT(!db); mongoc_client_destroy(client); } void test_database_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Database/aggregate/inherit/database", test_aggregate_inherit_database); TestSuite_AddFull(suite, "/Database/create_with_write_concern [lock:live-server]", test_create_with_write_concern, NULL, NULL, TestSuite_CheckLive); TestSuite_AddLive(suite, "/Database/copy", test_copy); TestSuite_AddLive(suite, "/Database/has_collection", test_has_collection); TestSuite_AddMockServerTest( suite, "/Database/command/read_prefs/simple/single", test_db_command_simple_read_prefs_single); TestSuite_AddMockServerTest( suite, "/Database/command/read_prefs/simple/pooled", test_db_command_simple_read_prefs_pooled); TestSuite_AddLive(suite, "/Database/drop", test_drop); TestSuite_AddLive(suite, "/Database/create_collection", test_create_collection); TestSuite_AddLive(suite, "/Database/get_collection_info", test_get_collection_info); TestSuite_AddLive(suite, "/Database/get_collection_info_with_opts_regex", test_get_collection_info_with_opts_regex); TestSuite_AddMockServerTest(suite, "/Database/get_collection/getmore_cmd", test_get_collection_info_getmore_cmd); TestSuite_AddLive(suite, "/Database/get_collection", test_get_collection); TestSuite_AddLive(suite, "/Database/get_collection_names", test_get_collection_names); TestSuite_AddMockServerTest(suite, "/Database/get_collection_names_error", test_get_collection_names_error); TestSuite_Add(suite, "/Database/get_default_database", test_get_default_database); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-dns.c000066400000000000000000001311061511661753600234500ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include #include #endif #include #include #include #include static void _assert_options_match(const bson_t *test, mongoc_uri_t *uri) { match_ctx_t ctx = {{0}}; bson_iter_t iter; bson_t opts_from_test; const bson_t *opts_from_uri; const bson_t *creds_from_uri; const bson_t *opts_or_creds; bson_iter_t test_opts_iter; bson_iter_t uri_opts_iter; const char *opt_name, *opt_name_canon; const bson_value_t *test_value, *uri_value; if (!bson_iter_init_find(&iter, test, "options")) { /* no URI options specified in the test */ return; } bson_iter_bson(&iter, &opts_from_test); BSON_ASSERT(bson_iter_init(&test_opts_iter, &opts_from_test)); opts_from_uri = mongoc_uri_get_options(uri); creds_from_uri = mongoc_uri_get_credentials(uri); while (bson_iter_next(&test_opts_iter)) { opt_name = bson_iter_key(&test_opts_iter); opt_name_canon = mongoc_uri_canonicalize_option(opt_name); opts_or_creds = !bson_strcasecmp(opt_name, "authSource") ? creds_from_uri : opts_from_uri; if (!bson_iter_init_find_case(&uri_opts_iter, opts_or_creds, opt_name_canon)) { test_error("URI options incorrectly set from TXT record: " "no option named \"%s\"\n" "expected: %s\n" "actual: %s", opt_name, bson_as_relaxed_extended_json(&opts_from_test, NULL), bson_as_relaxed_extended_json(opts_or_creds, NULL)); } test_value = bson_iter_value(&test_opts_iter); uri_value = bson_iter_value(&uri_opts_iter); if (!match_bson_value(uri_value, test_value, &ctx)) { test_error("URI option \"%s\" incorrectly set from TXT record: %s\n" "expected: %s\n" "actual: %s", opt_name, ctx.errmsg, bson_as_relaxed_extended_json(&opts_from_test, NULL), bson_as_relaxed_extended_json(opts_from_uri, NULL)); } } } typedef struct { bson_mutex_t mutex; mongoc_host_list_t *hosts; } context_t; /* *-------------------------------------------------------------------------- * * _mongoc_host_list_push -- * * Add a host to the front of the list and return it. * * Side effects: * None. * *-------------------------------------------------------------------------- */ static mongoc_host_list_t * _mongoc_host_list_push(const char *host, uint16_t port, int family, mongoc_host_list_t *next) { mongoc_host_list_t *h; BSON_ASSERT(host); h = bson_malloc0(sizeof(mongoc_host_list_t)); bson_strncpy(h->host, host, sizeof h->host); h->port = port; bson_snprintf(h->host_and_port, sizeof h->host_and_port, "%s:%hu", host, port); h->family = family; h->next = next; return h; } static void topology_changed(const mongoc_apm_topology_changed_t *event) { context_t *ctx; const mongoc_topology_description_t *td; size_t i; size_t n; mongoc_server_description_t **sds; ctx = (context_t *)mongoc_apm_topology_changed_get_context(event); td = mongoc_apm_topology_changed_get_new_description(event); sds = mongoc_topology_description_get_servers(td, &n); bson_mutex_lock(&ctx->mutex); _mongoc_host_list_destroy_all(ctx->hosts); ctx->hosts = NULL; for (i = 0; i < n; i++) { ctx->hosts = _mongoc_host_list_push(sds[i]->host.host, sds[i]->host.port, AF_UNSPEC, ctx->hosts); } bson_mutex_unlock(&ctx->mutex); mongoc_server_descriptions_destroy_all(sds, n); } static bool host_list_contains(const mongoc_host_list_t *hl, const char *host_and_port) { while (hl) { if (!strcmp(hl->host_and_port, host_and_port)) { return true; } hl = hl->next; } return false; } static int64_t hosts_count(const bson_t *test) { bson_iter_t iter; bson_iter_t hosts; int64_t c = 0; if (bson_iter_init_find(&iter, test, "hosts")) { BSON_ASSERT(bson_iter_recurse(&iter, &hosts)); while (bson_iter_next(&hosts)) { c++; } } else if (bson_iter_init_find(&iter, test, "numHosts")) { c = bson_iter_as_int64(&iter); } return c; } static bool _host_list_matches(const bson_t *test, context_t *ctx) { bson_iter_t iter; bson_iter_t hosts; const char *host_and_port; bool ret = true; if (bson_iter_init_find(&iter, test, "hosts")) { BSON_ASSERT(bson_iter_recurse(&iter, &hosts)); bson_mutex_lock(&ctx->mutex); BSON_ASSERT(bson_iter_recurse(&iter, &hosts)); while (bson_iter_next(&hosts)) { host_and_port = bson_iter_utf8(&hosts, NULL); if (!host_list_contains(ctx->hosts, host_and_port)) { ret = false; break; } } _mongoc_host_list_destroy_all(ctx->hosts); ctx->hosts = NULL; bson_mutex_unlock(&ctx->mutex); } else if (bson_iter_init_find(&iter, test, "numHosts")) { const int64_t expected = bson_iter_as_int64(&iter); bson_mutex_lock(&ctx->mutex); const size_t actual = _mongoc_host_list_length(ctx->hosts); _mongoc_host_list_destroy_all(ctx->hosts); ctx->hosts = NULL; bson_mutex_unlock(&ctx->mutex); ret = mlib_cmp(expected, ==, actual); } return ret; } typedef struct { const char *uri_str; const char *reason; } skipped_dns_test_t; skipped_dns_test_t SKIPPED_DNS_TESTS[] = {{"mongodb+srv://test5.test.build.10gen.cc/?authSource=otherDB", "C driver requires username present if any auth fields are present"}, {0}}; static bool is_test_skipped(const char *uri_str) { skipped_dns_test_t *skip; for (skip = SKIPPED_DNS_TESTS; skip->uri_str != NULL; skip++) { if (!strcmp(skip->uri_str, uri_str)) { MONGOC_DEBUG("Skipping test of URI: %s Reason: %s", skip->uri_str, skip->reason); return true; } } return false; } static void _test_dns_maybe_pooled(bson_t *test, bool pooled) { context_t ctx; bool expect_ssl; bool expect_error; mongoc_uri_t *uri; mongoc_apm_callbacks_t *callbacks; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t ssl_opts; #endif bson_error_t error; bool r; const char *uri_str; if (!test_framework_get_ssl()) { test_error("Must configure an SSL replica set and set MONGOC_TEST_SSL=on " "and other ssl options to test DNS"); } uri_str = bson_lookup_utf8(test, "uri"); if (is_test_skipped(uri_str)) { return; } bson_mutex_init(&ctx.mutex); ctx.hosts = NULL; expect_ssl = strstr(uri_str, "ssl=false") == NULL; expect_error = _mongoc_lookup_bool(test, "error", false /* default */); uri = mongoc_uri_new_with_error(uri_str, &error); if (!expect_error) { ASSERT_OR_PRINT(uri, error); } if (!uri) { /* expected failure, e.g. we're testing an invalid URI */ return; } callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_topology_changed_cb(callbacks, topology_changed); /* suppress "cannot override URI option" messages */ capture_logs(true); #ifdef MONGOC_ENABLE_SSL ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.allow_invalid_hostname = true; #endif if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); if (!expect_error) { BSON_ASSERT(pool); } if (!pool) { /* expected failure, e.g. SRV lookup or URI finalization failed */ goto cleanup; } /* before we set SSL on so that we can connect to the test replica set, * assert that the URI has SSL on by default, and SSL off if "ssl=false" * is in the URI string */ BSON_ASSERT(mongoc_uri_get_tls(_mongoc_client_pool_get_topology(pool)->uri) == expect_ssl); #ifdef MONGOC_ENABLE_SSL mongoc_client_pool_set_ssl_opts(pool, &ssl_opts); #else test_framework_set_pool_ssl_opts(pool); #endif mongoc_client_pool_set_apm_callbacks(pool, callbacks, &ctx); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); if (!expect_error) { BSON_ASSERT(client); } if (!client) { /* expected failure, e.g. SRV lookup or URI finalization failed */ goto cleanup; } BSON_ASSERT(mongoc_uri_get_tls(client->uri) == expect_ssl); #ifdef MONGOC_ENABLE_SSL mongoc_client_set_ssl_opts(client, &ssl_opts); #else test_framework_set_ssl_opts(client); #endif mongoc_client_set_apm_callbacks(client, callbacks, &ctx); } #ifdef MONGOC_ENABLE_SSL BSON_ASSERT(client->ssl_opts.allow_invalid_hostname); #endif const int64_t n_hosts = hosts_count(test); if (pooled) { if (n_hosts > 0 && !expect_error) { WAIT_UNTIL(_host_list_matches(test, &ctx)); } else { r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, ""); } } else if (NULL == mongoc_uri_get_username(uri)) { /* Skip single-threaded tests containing auth credentials. Monitoring * connections need to authenticate, and the credentials in the tests do * not correspond to the test users. TODO (CDRIVER-4046): unskip these * tests. */ if (n_hosts > 0 && !expect_error) { r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); WAIT_UNTIL(_host_list_matches(test, &ctx)); } else { r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, ""); } } /* the client's URI is updated after initial seedlist discovery (though for * background SRV polling, only the topology's URI is updated). Check that * both the topology and client URI have the expected options. */ _assert_options_match(test, client->uri); _assert_options_match(test, client->topology->uri); /* the client has a copy of the topology's URI, assert they're the same */ ASSERT(bson_equal(mongoc_uri_get_options(client->uri), mongoc_uri_get_options(client->topology->uri))); ASSERT(bson_equal(mongoc_uri_get_credentials(client->uri), mongoc_uri_get_credentials(client->topology->uri))); if (!mongoc_uri_get_hosts(client->uri)) { ASSERT(!mongoc_uri_get_hosts(client->topology->uri)); } else { _mongoc_host_list_compare_one(mongoc_uri_get_hosts(client->uri), mongoc_uri_get_hosts(client->topology->uri)); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } cleanup: mongoc_apm_callbacks_destroy(callbacks); mongoc_uri_destroy(uri); } static void test_dns(void *test) { _test_dns_maybe_pooled(test, false); _test_dns_maybe_pooled(test, true); } static int test_dns_check_replset(void) { return test_framework_getenv_bool("MONGOC_TEST_DNS") ? 1 : 0; } static int test_dns_check_loadbalanced(void) { return test_framework_getenv_bool("MONGOC_TEST_DNS_LOADBALANCED") ? 1 : 0; } static int test_dns_check_srv_polling(void) { return test_framework_getenv_bool("MONGOC_TEST_DNS_SRV_POLLING") ? 1 : 0; } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for mongodb+srv URIs. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite_with_check(suite, JSON_DIR, "initial_dns_seedlist_discovery/replica-set", test_dns, test_dns_check_replset, test_framework_skip_if_no_crypto); install_json_test_suite_with_check(suite, JSON_DIR, "initial_dns_seedlist_discovery/load-balanced", test_dns, test_dns_check_loadbalanced, test_framework_skip_if_no_crypto); install_json_test_suite_with_check(suite, JSON_DIR, "initial_dns_seedlist_discovery/sharded", test_dns, /* Topology of load-balancer tests satisfy topology requirements of * sharded tests, even though a load balancer is not required. */ test_dns_check_loadbalanced, test_framework_skip_if_no_crypto); } extern bool mongoc_topology_apply_scanned_srv_hosts(mongoc_uri_t *uri, mongoc_topology_description_t *td, const mongoc_log_and_monitor_instance_t *log_and_monitor, mongoc_host_list_t *hosts, bson_error_t *error); static mongoc_host_list_t * make_hosts(char *first_host, ...) { va_list va; mongoc_host_list_t *hosts = NULL; mongoc_host_list_t host; char *host_str; _mongoc_host_list_from_string(&host, first_host); _mongoc_host_list_upsert(&hosts, &host); va_start(va, first_host); while ((host_str = va_arg(va, char *))) { _mongoc_host_list_from_string(&host, host_str); _mongoc_host_list_upsert(&hosts, &host); } va_end(va); return hosts; } #define MAKE_HOSTS(...) make_hosts(__VA_ARGS__, NULL) static void dump_hosts(mongoc_host_list_t *hosts) { mongoc_host_list_t *host; MONGOC_DEBUG("hosts:"); LL_FOREACH(hosts, host) { MONGOC_DEBUG("- %s", host->host_and_port); } } static void dump_topology_description(const mongoc_topology_description_t *td) { const mongoc_server_description_t *sd; const mongoc_set_t *servers = mc_tpld_servers_const(td); MONGOC_DEBUG("topology hosts:"); for (size_t i = 0u; i < servers->items_len; ++i) { sd = mongoc_set_get_item_const(servers, i); MONGOC_DEBUG("- %s", sd->host.host_and_port); } } static void check_topology_description(mongoc_topology_description_t *td, mongoc_host_list_t *hosts) { size_t nhosts = 0u; mongoc_host_list_t *host; const mongoc_set_t *servers = mc_tpld_servers_const(td); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); for (host = hosts; host; host = host->next) { ++nhosts; /* Check that "host" is already in the topology description by upserting * it, and ensuring that the number of servers remains constant. */ const size_t server_count = servers->items_len; BSON_ASSERT(mongoc_topology_description_add_server(td, &log_and_monitor, host->host_and_port, NULL)); if (server_count != servers->items_len) { dump_topology_description(td); dump_hosts(hosts); test_error("topology description did not have host: %s", host->host_and_port); } } if (nhosts != servers->items_len) { dump_topology_description(td); dump_hosts(hosts); test_error("topology description had extra hosts"); } mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } static void test_srv_polling_mocked(void *unused) { mongoc_uri_t *uri; mongoc_topology_description_t td; bson_error_t error; mongoc_host_list_t *hosts; mongoc_host_list_t *expected; bool ret; BSON_UNUSED(unused); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); mongoc_topology_description_init(&td, 0); uri = mongoc_uri_new("mongodb+srv://server.test.com/?tls=true"); capture_logs(true); hosts = MAKE_HOSTS("a.test.com", "b.test.com"); expected = MAKE_HOSTS("a.test.com", "b.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, hosts, &error); ASSERT_OR_PRINT(ret, error); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); _mongoc_host_list_destroy_all(hosts); ASSERT_NO_CAPTURED_LOGS("topology"); /* Add an extra host. */ hosts = MAKE_HOSTS("x.test.com", "a.test.com", "y.test.com", "b.test.com"); expected = MAKE_HOSTS("x.test.com", "a.test.com", "y.test.com", "b.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, hosts, &error); ASSERT_OR_PRINT(ret, error); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); _mongoc_host_list_destroy_all(hosts); ASSERT_NO_CAPTURED_LOGS("topology"); /* Remove all but one host. */ hosts = MAKE_HOSTS("x.test.com"); expected = MAKE_HOSTS("x.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, hosts, &error); ASSERT_OR_PRINT(ret, error); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); _mongoc_host_list_destroy_all(hosts); ASSERT_NO_CAPTURED_LOGS("topology"); /* Add one valid and one invalid. Invalid should skip, warning should be * logged. */ hosts = MAKE_HOSTS("x.test.com", "y.test.com", "bad.wrongdomain.com"); expected = MAKE_HOSTS("x.test.com", "y.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, hosts, &error); ASSERT_OR_PRINT(ret, error); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); _mongoc_host_list_destroy_all(hosts); ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_ERROR, "Invalid host"); /* An empty host list returns false but does NOT change topology description */ expected = MAKE_HOSTS("x.test.com", "y.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, NULL, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "SRV response did not contain any valid hosts"); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_ERROR, "Invalid host"); /* All invalid hosts returns false but does NOT change topology description */ hosts = MAKE_HOSTS("bad1.wrongdomain.com", "bad2.wrongdomain.com"); expected = MAKE_HOSTS("x.test.com", "y.test.com"); ret = mongoc_topology_apply_scanned_srv_hosts(uri, &td, &log_and_monitor, NULL, &error); BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "SRV response did not contain any valid hosts"); check_topology_description(&td, expected); _mongoc_host_list_destroy_all(expected); _mongoc_host_list_destroy_all(hosts); ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_ERROR, "Invalid host"); mongoc_topology_description_cleanup(&td); mongoc_uri_destroy(uri); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } static void test_small_initial_buffer(void *unused) { mongoc_rr_type_t rr_type = MONGOC_RR_SRV; mongoc_rr_data_t rr_data; bson_error_t error; /* Size needs to be large enough to fit DNS answer header to not error, but * smaller than SRV response to test. The SRV response is 155 bytes. This can * be determined with: dig -t SRV _mongodb._tcp.test1.test.build.10gen.cc */ size_t small_buffer_size = 30; BSON_UNUSED(unused); memset(&rr_data, 0, sizeof(rr_data)); ASSERT_OR_PRINT(_mongoc_client_get_rr( "_mongodb._tcp.test1.test.build.10gen.cc", rr_type, &rr_data, small_buffer_size, false, &error), error); ASSERT_CMPINT(rr_data.count, ==, 2); bson_free(rr_data.txt_record_opts); _mongoc_host_list_destroy_all(rr_data.hosts); } bool _mock_rr_resolver_prose_test_9(const char *service, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_UNUSED(service); BSON_UNUSED(rr_type); BSON_UNUSED(rr_data); BSON_UNUSED(initial_buffer_size); BSON_UNUSED(prefer_tcp); BSON_UNUSED(error); test_error("Expected mock resolver to not be called"); return true; } static void _prose_test_ping(mongoc_client_t *client) { bson_error_t error; bson_t *cmd = BCON_NEW("ping", BCON_INT32(1)); ASSERT(client); if (!mongoc_client_command_simple(client, "admin", cmd, NULL, NULL, &error)) { test_error("ping failed: %s", error.message); } bson_destroy(cmd); } /* SRV Polling Tests Spec: rescanSRVIntervalMS */ #define RESCAN_INTERVAL_MS 500 static void * _prose_test_init_resource_single(const mongoc_uri_t *uri, _mongoc_rr_resolver_fn fn) { mongoc_client_t *client; mongoc_topology_t *topology; BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(fn); client = mongoc_client_new_from_uri(uri); topology = client->topology; _mongoc_topology_set_rr_resolver(topology, fn); _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, RESCAN_INTERVAL_MS); #if defined(MONGOC_ENABLE_SSL) { mongoc_ssl_opt_t ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.allow_invalid_hostname = true; mongoc_client_set_ssl_opts(client, &ssl_opts); } #endif /* defined(MONGOC_ENABLE_SSL) */ return client; } static void * _prose_test_init_resource_pooled(const mongoc_uri_t *uri, _mongoc_rr_resolver_fn fn) { mongoc_client_pool_t *pool; mongoc_topology_t *topology; BSON_ASSERT_PARAM(uri); BSON_ASSERT_PARAM(fn); pool = mongoc_client_pool_new(uri); topology = _mongoc_client_pool_get_topology(pool); _mongoc_topology_set_rr_resolver(topology, fn); _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, RESCAN_INTERVAL_MS); #if defined(MONGOC_ENABLE_SSL) { mongoc_ssl_opt_t ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.allow_invalid_hostname = true; mongoc_client_pool_set_ssl_opts(pool, &ssl_opts); } #endif /* defined(MONGOC_ENABLE_SSL) */ return pool; } static void _prose_test_free_resource_single(void *resource) { mongoc_client_destroy((mongoc_client_t *)resource); } static void _prose_test_free_resource_pooled(void *resource) { mongoc_client_pool_destroy((mongoc_client_pool_t *)resource); } static mongoc_client_t * _prose_test_get_client_single(void *resource) { BSON_ASSERT_PARAM(resource); return (mongoc_client_t *)resource; } static mongoc_client_t * _prose_test_get_client_pooled(void *resource) { BSON_ASSERT_PARAM(resource); return mongoc_client_pool_pop(((mongoc_client_pool_t *)resource)); } static void _prose_test_release_client_single(void *resource, mongoc_client_t *client) { BSON_ASSERT_PARAM(resource); BSON_ASSERT_PARAM(client); /* Nothing to do. */ } static void _prose_test_release_client_pooled(void *resource, mongoc_client_t *client) { BSON_ASSERT_PARAM(resource); BSON_ASSERT_PARAM(client); mongoc_client_pool_push((mongoc_client_pool_t *)resource, client); } static void _prose_test_update_srv_single(void *resource) { mongoc_client_t *client; BSON_ASSERT_PARAM(resource); client = resource; mlib_sleep_for((RESCAN_INTERVAL_MS, ms), mul, 2); /* Avoid ping given `loadBalanced=true`; see prose test 9. */ if (!mongoc_uri_get_option_as_bool(client->uri, MONGOC_URI_LOADBALANCED, false)) { _prose_test_ping(client); } } static void _prose_test_update_srv_pooled(void *resource) { BSON_ASSERT_PARAM(resource); mlib_sleep_for((RESCAN_INTERVAL_MS, ms), mul, 2); } typedef struct { void *(*init_resource)(const mongoc_uri_t *uri, _mongoc_rr_resolver_fn fn); void (*free_resource)(void *); mongoc_client_t *(*get_client)(void *resource); void (*release_client)(void *resource, mongoc_client_t *client); void (*update_srv)(void *); } _prose_test_fns_t; static const _prose_test_fns_t _prose_test_single_fns = {_prose_test_init_resource_single, _prose_test_free_resource_single, _prose_test_get_client_single, _prose_test_release_client_single, _prose_test_update_srv_single}; static const _prose_test_fns_t _prose_test_pooled_fns = {_prose_test_init_resource_pooled, _prose_test_free_resource_pooled, _prose_test_get_client_pooled, _prose_test_release_client_pooled, _prose_test_update_srv_pooled}; static void _prose_test_9(const _prose_test_fns_t *fns) { void *resource; BSON_ASSERT_PARAM(fns); { mongoc_uri_t *const uri = mongoc_uri_new("mongodb+srv://test3.test.build.10gen.cc"); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, RESCAN_INTERVAL_MS); resource = fns->init_resource(uri, _mock_rr_resolver_prose_test_9); mongoc_uri_destroy(uri); } { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->update_srv(resource); { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->free_resource(resource); } static void prose_test_9_single(void *unused) { BSON_UNUSED(unused); _prose_test_9(&_prose_test_single_fns); } static void prose_test_9_pooled(void *unused) { BSON_UNUSED(unused); _prose_test_9(&_prose_test_pooled_fns); } static bool _mock_rr_resolver_prose_test_10(const char *service, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_UNUSED(initial_buffer_size); BSON_ASSERT_PARAM(service); BSON_ASSERT_PARAM(rr_data); BSON_UNUSED(prefer_tcp); BSON_ASSERT_PARAM(error); if (rr_type == MONGOC_RR_SRV) { const size_t count = _mongoc_host_list_length(rr_data->hosts); BSON_ASSERT(mlib_in_range(uint32_t, count)); rr_data->hosts = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27019", "localhost.test.build.10gen.cc:27020"); rr_data->count = (uint32_t)count; rr_data->min_ttl = 0u; rr_data->txt_record_opts = NULL; } error->code = 0u; return true; } static void _prose_test_10(const _prose_test_fns_t *fns) { void *resource; BSON_ASSERT_PARAM(fns); { mongoc_uri_t *const uri = mongoc_uri_new("mongodb+srv://test1.test.build.10gen.cc"); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SRVMAXHOSTS, 0); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, RESCAN_INTERVAL_MS); resource = fns->init_resource(uri, _mock_rr_resolver_prose_test_10); mongoc_uri_destroy(uri); } { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->update_srv(resource); { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27019", "localhost.test.build.10gen.cc:27020"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->free_resource(resource); } static void prose_test_10_single(void *unused) { BSON_UNUSED(unused); _prose_test_10(&_prose_test_single_fns); } static void prose_test_10_pooled(void *unused) { BSON_UNUSED(unused); _prose_test_10(&_prose_test_pooled_fns); } static bool _mock_rr_resolver_prose_test_11(const char *service, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_UNUSED(initial_buffer_size); BSON_ASSERT_PARAM(service); BSON_ASSERT_PARAM(rr_data); BSON_UNUSED(prefer_tcp); BSON_ASSERT_PARAM(error); if (rr_type == MONGOC_RR_SRV) { const size_t count = _mongoc_host_list_length(rr_data->hosts); BSON_ASSERT(mlib_in_range(uint32_t, count)); rr_data->hosts = MAKE_HOSTS("localhost.test.build.10gen.cc:27019", "localhost.test.build.10gen.cc:27020"); rr_data->count = (uint32_t)count; rr_data->min_ttl = 0u; rr_data->txt_record_opts = NULL; } error->code = 0u; return true; } static void _prose_test_11(const _prose_test_fns_t *fns) { void *resource; BSON_ASSERT_PARAM(fns); { mongoc_uri_t *const uri = mongoc_uri_new("mongodb+srv://test1.test.build.10gen.cc"); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SRVMAXHOSTS, 2); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, RESCAN_INTERVAL_MS); resource = fns->init_resource(uri, _mock_rr_resolver_prose_test_11); mongoc_uri_destroy(uri); } { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->update_srv(resource); { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27019", "localhost.test.build.10gen.cc:27020"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->free_resource(resource); } static void prose_test_11_single(void *unused) { BSON_UNUSED(unused); _prose_test_11(&_prose_test_single_fns); } static void prose_test_11_pooled(void *unused) { BSON_UNUSED(unused); _prose_test_11(&_prose_test_pooled_fns); } static bool _mock_rr_resolver_prose_test_12(const char *service, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_UNUSED(initial_buffer_size); BSON_ASSERT_PARAM(service); BSON_ASSERT_PARAM(rr_data); BSON_UNUSED(prefer_tcp); BSON_ASSERT_PARAM(error); if (rr_type == MONGOC_RR_SRV) { const size_t count = _mongoc_host_list_length(rr_data->hosts); BSON_ASSERT(mlib_in_range(uint32_t, count)); rr_data->hosts = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27019", "localhost.test.build.10gen.cc:27020"); rr_data->count = (uint32_t)count; rr_data->min_ttl = 0u; rr_data->txt_record_opts = NULL; } error->code = 0u; return true; } typedef struct { size_t num_existing; size_t num_new_valid; } _prose_test_12_ctx_t; static bool _prose_test_12_cb(const void *sd_void, void *ctx_void) { const mongoc_server_description_t *sd; _prose_test_12_ctx_t *ctx; const mongoc_host_list_t *host; BSON_ASSERT_PARAM(sd_void); BSON_ASSERT_PARAM(ctx_void); sd = sd_void; ctx = ctx_void; host = &sd->host; ASSERT_CMPSTR(host->host, "localhost.test.build.10gen.cc"); if (host->port == 27017u) { ++ctx->num_existing; } else { ASSERT(host->port == 27019 || host->port == 27020); ++ctx->num_new_valid; } return true; } static void _prose_test_12(const _prose_test_fns_t *fns) { void *resource; BSON_ASSERT_PARAM(fns); { mongoc_uri_t *const uri = mongoc_uri_new("mongodb+srv://test1.test.build.10gen.cc"); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SRVMAXHOSTS, 2); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, RESCAN_INTERVAL_MS); resource = fns->init_resource(uri, _mock_rr_resolver_prose_test_12); mongoc_uri_destroy(uri); } { mongoc_host_list_t *const expected = MAKE_HOSTS("localhost.test.build.10gen.cc:27017", "localhost.test.build.10gen.cc:27018"); mongoc_client_t *const client = fns->get_client(resource); { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); check_topology_description(tdmod.new_td, expected); mc_tpld_modify_drop(tdmod); } fns->release_client(resource, client); _mongoc_host_list_destroy_all(expected); } fns->update_srv(resource); { mongoc_client_t *const client = fns->get_client(resource); _prose_test_12_ctx_t ctx; ctx.num_existing = 0u; ctx.num_new_valid = 0u; { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); const mongoc_set_t *servers = mc_tpld_servers_const(tdmod.new_td); mongoc_set_for_each_const(servers, _prose_test_12_cb, &ctx); mc_tpld_modify_drop(tdmod); } ASSERT_WITH_MSG(ctx.num_existing > 0u, "hosts that have not changed must be left alone and unchanged"); ASSERT_WITH_MSG( ctx.num_existing == 1u, "only a single host should have remained, but found %zu", ctx.num_existing); ASSERT_WITH_MSG(ctx.num_new_valid == 1u, "exactly one valid new hosts should have been added"); fns->release_client(resource, client); } fns->free_resource(resource); } static void prose_test_12_single(void *unused) { BSON_UNUSED(unused); _prose_test_12(&_prose_test_single_fns); } static void prose_test_12_pooled(void *unused) { BSON_UNUSED(unused); _prose_test_12(&_prose_test_pooled_fns); } typedef struct { bson_mutex_t lock; mongoc_host_list_t *hosts; } rr_override_t; rr_override_t rr_override; // `_mock_rr_resolver_with_override` allows setting a custom list of hosts with the global override. static bool _mock_rr_resolver_with_override(const char *service, mongoc_rr_type_t rr_type, mongoc_rr_data_t *rr_data, size_t initial_buffer_size, bool prefer_tcp, bson_error_t *error) { BSON_UNUSED(initial_buffer_size); BSON_ASSERT_PARAM(service); BSON_ASSERT_PARAM(rr_data); BSON_UNUSED(prefer_tcp); BSON_ASSERT_PARAM(error); if (rr_type == MONGOC_RR_SRV) { bson_mutex_lock(&rr_override.lock); const size_t count = _mongoc_host_list_length(rr_override.hosts); BSON_ASSERT(mlib_in_range(uint32_t, count)); rr_data->hosts = _mongoc_host_list_copy_all(rr_override.hosts); rr_data->count = (uint32_t)count; rr_data->txt_record_opts = NULL; bson_mutex_unlock(&rr_override.lock); } error->code = 0u; return true; } // Test that after a server is removed from SRV records, all connections are closed. static void test_removing_servers_closes_connections(void *unused) { BSON_UNUSED(unused); bson_error_t error; bool ok; bson_t *ping = BCON_NEW("ping", BCON_INT32(1)); stream_tracker_t *st = stream_tracker_new(); // Create a client pool to mongodb+srv://test1.test.build.10gen.cc. The URI resolves to two SRV records: // - localhost.test.build.10gen.cc:27017 // - localhost.test.build.10gen.cc:27018 char *host0 = "localhost.test.build.10gen.cc:27017"; char *host1 = "localhost.test.build.10gen.cc:27018"; mongoc_client_pool_t *pool; { mongoc_uri_t *uri = mongoc_uri_new("mongodb+srv://test1.test.build.10gen.cc"); // Set a short heartbeat so server monitors get quick responses. mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, RESCAN_INTERVAL_MS); pool = mongoc_client_pool_new(uri); #if defined(MONGOC_ENABLE_SSL) mongoc_ssl_opt_t ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.allow_invalid_hostname = true; mongoc_client_pool_set_ssl_opts(pool, &ssl_opts); #endif /* defined(MONGOC_ENABLE_SSL) */ // Override the SRV polling callback: mongoc_topology_t *topology = _mongoc_client_pool_get_topology(pool); bson_mutex_init(&rr_override.lock); rr_override.hosts = MAKE_HOSTS(host0, host1); _mongoc_topology_set_rr_resolver(topology, _mock_rr_resolver_with_override); // Set a shorter SRV rescan interval. _mongoc_topology_set_srv_polling_rescan_interval_ms(topology, RESCAN_INTERVAL_MS); mongoc_uri_destroy(uri); } stream_tracker_track_pool(st, pool); // Expect no streams created yet: stream_tracker_assert_active_count(st, host0, 0); stream_tracker_assert_active_count(st, host1, 0); // Pop (and push) a client to start background monitoring. { mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); // Wait for monitoring connections to be created. // Expect two monitoring connections per server to be created in background. stream_tracker_assert_eventual_active_count(st, host0, 2); stream_tracker_assert_eventual_active_count(st, host1, 2); } // Send 'ping' commands on a client to each server to create operation connections. { mongoc_client_t *client = mongoc_client_pool_pop(pool); ok = mongoc_client_command_simple_with_server_id(client, "admin", ping, NULL, 1 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple_with_server_id(client, "admin", ping, NULL, 2 /* server ID */, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_pool_push(pool, client); // Expect an operation connection is created. stream_tracker_assert_active_count(st, host0, 2 + 1); stream_tracker_assert_active_count(st, host1, 2 + 1); } // Mock removal of host1. { bson_mutex_lock(&rr_override.lock); _mongoc_host_list_destroy_all(rr_override.hosts); rr_override.hosts = MAKE_HOSTS(host0); bson_mutex_unlock(&rr_override.lock); } // Expect connections are closed to removed server. { // Expect monitoring connections to be closed in background. stream_tracker_assert_eventual_active_count(st, host0, 2 + 1); stream_tracker_assert_eventual_active_count(st, host1, 1); // Pop and push the client to "prune" the stale operation connections. mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_client_pool_push(pool, client); stream_tracker_assert_active_count(st, host0, 2 + 1); stream_tracker_assert_active_count(st, host1, 0); } mongoc_client_pool_destroy(pool); bson_mutex_destroy(&rr_override.lock); stream_tracker_destroy(st); bson_destroy(ping); } void test_dns_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddFull( suite, "/initial_dns_seedlist_discovery/srv_polling/mocked", test_srv_polling_mocked, NULL, NULL, NULL); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/small_initial_buffer [lock:live-server]", test_small_initial_buffer, NULL, NULL, test_dns_check_replset); /* TODO (CDRIVER-4045): remove /initial_dns_seedlist_discovery from the path * of the SRV polling tests, since they are defined in the "Polling SRV * Records for mongos Discovery" spec, not the "Initial DNS Seedlist * Discovery" spec. */ TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_9/single [lock:live-server]", prose_test_9_single, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_9/pooled [lock:live-server]", prose_test_9_pooled, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_10/single [lock:live-server]", prose_test_10_single, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_10/pooled [lock:live-server]", prose_test_10_pooled, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_11/single [lock:live-server]", prose_test_11_single, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_11/pooled [lock:live-server]", prose_test_11_pooled, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_12/single [lock:live-server]", prose_test_12_single, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull(suite, "/initial_dns_seedlist_discovery/srv_polling/prose_test_12/pooled [lock:live-server]", prose_test_12_pooled, NULL, NULL, test_dns_check_srv_polling); TestSuite_AddFull( suite, "/initial_dns_seedlist_discovery/srv_polling/removing_servers_closes_connections [lock:live-server]", test_removing_servers_closes_connections, NULL, NULL, test_dns_check_srv_polling, test_framework_skip_if_max_wire_version_less_than_9 /* require server 4.4+ for streaming monitoring protocol */); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-error.c000066400000000000000000000240731511661753600240210ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "error-test" static void test_set_error_api_single(void) { capture_logs(true); mongoc_client_t *const client = test_framework_new_default_client(); int32_t unsupported_versions[] = {-1, 0, 3}; mlib_foreach_arr (int32_t, ver, unsupported_versions) { ASSERT(!mongoc_client_set_error_api(client, *ver)); ASSERT_CAPTURED_LOG("mongoc_client_set_error_api", MONGOC_LOG_LEVEL_ERROR, "Unsupported Error API Version"); } mongoc_client_destroy(client); } static void test_set_error_api_pooled(void) { capture_logs(true); mongoc_client_pool_t *const pool = test_framework_new_default_client_pool(); int32_t unsupported_versions[] = {-1, 0, 3}; mlib_foreach_arr (int32_t, ver, unsupported_versions) { ASSERT(!mongoc_client_pool_set_error_api(pool, *ver)); ASSERT_CAPTURED_LOG("mongoc_client_pool_set_error_api", MONGOC_LOG_LEVEL_ERROR, "Unsupported Error API Version"); } mongoc_client_t *const client = mongoc_client_pool_pop(pool); ASSERT(!mongoc_client_set_error_api(client, 1)); ASSERT_CAPTURED_LOG( "mongoc_client_set_error_api", MONGOC_LOG_LEVEL_ERROR, "Cannot set Error API Version on a pooled client"); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static void _test_command_error(int32_t error_api_version) { mock_server_t *server; mongoc_client_t *client; bson_t reply; bson_error_t error; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); if (error_api_version != 0) { BSON_ASSERT(mongoc_client_set_error_api(client, error_api_version)); } future = future_client_command_simple(client, "db", tmp_bson("{'foo': 1}"), NULL, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'foo': 1}")); reply_to_request_simple(request, "{'ok': 0, 'code': 42, 'errmsg': 'foo'}"); ASSERT(!future_get_bool(future)); if (error_api_version >= 2) { ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 42, "foo"); } else { ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_QUERY, 42, "foo"); } future_destroy(future); request_destroy(request); bson_destroy(&reply); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_command_error_default(void) { _test_command_error(0); } static void test_command_error_v1(void) { _test_command_error(1); } static void test_command_error_v2(void) { _test_command_error(2); } static void test_has_label(void) { bson_t *reply = tmp_bson("{'errorLabels': ['foo', 'bar']}"); BSON_ASSERT(mongoc_error_has_label(reply, "foo")); BSON_ASSERT(mongoc_error_has_label(reply, "bar")); BSON_ASSERT(!mongoc_error_has_label(reply, "baz")); BSON_ASSERT(!mongoc_error_has_label(tmp_bson("{}"), "foo")); } static void test_state_change_helper(uint32_t domain, bool expect_error) { bson_error_t error; mongoc_server_err_t not_primary_codes[] = { MONGOC_SERVER_ERR_NOTPRIMARY, MONGOC_SERVER_ERR_NOTPRIMARYNOSECONDARYOK, MONGOC_SERVER_ERR_LEGACYNOTPRIMARY}; mongoc_server_err_t node_is_recovering_codes[] = {MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN, MONGOC_SERVER_ERR_INTERRUPTEDDUETOREPLSTATECHANGE, MONGOC_SERVER_ERR_NOTPRIMARYORSECONDARY, MONGOC_SERVER_ERR_PRIMARYSTEPPEDDOWN, MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS}; mongoc_server_err_t shutdown_codes[] = {MONGOC_SERVER_ERR_INTERRUPTEDATSHUTDOWN, MONGOC_SERVER_ERR_SHUTDOWNINPROGRESS}; MONGOC_DEBUG("Checking domain = %" PRIu32, domain); memset(&error, 0, sizeof(bson_error_t)); error.domain = domain; mlib_foreach_arr (mongoc_server_err_t, err, not_primary_codes) { error.code = *err; BSON_ASSERT(expect_error == _mongoc_error_is_not_primary(&error)); BSON_ASSERT(!_mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); } mlib_foreach_arr (mongoc_server_err_t, err, node_is_recovering_codes) { error.code = *err; BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_recovering(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); } mlib_foreach_arr (mongoc_server_err_t, err, shutdown_codes) { error.code = *err; BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); /* Shutdown errors are a subset of recovering errors. */ BSON_ASSERT(expect_error == _mongoc_error_is_recovering(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_shutdown(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); } /* Fallback code that's used when no code was returned */ error.code = MONGOC_ERROR_QUERY_FAILURE; bson_strncpy(error.message, "... not master ...", sizeof(error.message)); BSON_ASSERT(expect_error == _mongoc_error_is_not_primary(&error)); BSON_ASSERT(!_mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); bson_strncpy(error.message, "... node is recovering ...", sizeof(error.message)); BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); bson_strncpy(error.message, "... not master or secondary ...", sizeof(error.message)); BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(expect_error == _mongoc_error_is_state_change(&error)); error.code = 123; bson_strncpy(error.message, "... not master ...", sizeof(error.message)); BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(!_mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(!_mongoc_error_is_state_change(&error)); bson_strncpy(error.message, "... node is recovering ...", sizeof(error.message)); BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(!_mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(!_mongoc_error_is_state_change(&error)); bson_strncpy(error.message, "... not master or secondary ...", sizeof(error.message)); BSON_ASSERT(!_mongoc_error_is_not_primary(&error)); BSON_ASSERT(!_mongoc_error_is_recovering(&error)); BSON_ASSERT(!_mongoc_error_is_shutdown(&error)); BSON_ASSERT(!_mongoc_error_is_state_change(&error)); } static void test_state_change(void) { test_state_change_helper(MONGOC_ERROR_SERVER, true); test_state_change_helper(MONGOC_ERROR_WRITE_CONCERN, true); test_state_change_helper(MONGOC_ERROR_QUERY, false); } static void test_mongoc_error_basic(void) { bson_error_t error; _mongoc_set_error(&error, 123, 456, "%s:%d", "localhost", 27017); ASSERT_CMPSTR(error.message, "localhost:27017"); ASSERT_CMPUINT32(error.domain, ==, 123u); ASSERT_CMPUINT32(error.code, ==, 456u); ASSERT_CMPUINT(error.reserved, ==, 2u); // MONGOC_ERROR_CATEGORY } static void test_mongoc_error_with_category(void) { bson_error_t error; _mongoc_set_error_with_category(&error, 99u, 123, 456, "%s:%d", "localhost", 27017); ASSERT_CMPSTR(error.message, "localhost:27017"); ASSERT_CMPUINT32(error.domain, ==, 123u); ASSERT_CMPUINT32(error.code, ==, 456u); ASSERT_CMPUINT(error.reserved, ==, 99u); } #ifdef _WIN32 static void test_mongoc_winerr_to_string(void) { // Test WIN32 success. { char *got = mongoc_winerr_to_string((DWORD)NO_ERROR); const char *expect = "(0x00000000) The operation completed successfully."; ASSERT_CMPSTR(expect, got); bson_free(got); } // Test WIN32 error. { char *got = mongoc_winerr_to_string((DWORD)ERROR_FILE_NOT_FOUND); const char *expect = "(0x00000002) The system cannot find the file specified."; ASSERT_CMPSTR(expect, got); bson_free(got); } // Test SECURITY_STATUS error. { char *got = mongoc_winerr_to_string((DWORD)SEC_E_CERT_EXPIRED); const char *expect = "(0x80090328) The received certificate has expired."; ASSERT_CMPSTR(expect, got); bson_free(got); } // Test DNS_STATUS error. { char *got = mongoc_winerr_to_string((DWORD)DNS_ERROR_RCODE_SERVER_FAILURE); const char *expect = "(0x0000232A) DNS server failure."; ASSERT_CMPSTR(expect, got); bson_free(got); } } #endif // _WIN32 void test_error_install(TestSuite *suite) { TestSuite_AddLive(suite, "/Error/set_api/single", test_set_error_api_single); TestSuite_AddLive(suite, "/Error/set_api/pooled", test_set_error_api_pooled); TestSuite_AddMockServerTest(suite, "/Error/command/default", test_command_error_default); TestSuite_AddMockServerTest(suite, "/Error/command/v1", test_command_error_v1); TestSuite_AddMockServerTest(suite, "/Error/command/v2", test_command_error_v2); TestSuite_Add(suite, "/Error/has_label", test_has_label); TestSuite_Add(suite, "/Error/state_change", test_state_change); TestSuite_Add(suite, "/Error/basic", test_mongoc_error_basic); TestSuite_Add(suite, "/Error/category", test_mongoc_error_with_category); #ifdef _WIN32 TestSuite_Add(suite, "/Error/windows_error_to_string", test_mongoc_winerr_to_string); #endif } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-exhaust.c000066400000000000000000000654511511661753600243560ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Server support for exhaust cursors depends on server topology and version: * Server Version Server Behavior * ------------------ ----------------------------------- * mongod <4.2 only supports with OP_QUERY. * mongod >=4.2,<5.1 supports with OP_MSG and OP_QUERY. * mongod >=5.1 only supports with OP_MSG. * mongos <7.1 does not support. * mongos >=7.1 only supports with OP_MSG. * When attempting to create an exhaust cursor, libmongoc behaves as follows: * Server Version libmongoc behavior * ------------------ ----------------------------------- * mongod <4.2 N/A. libmongoc only supports 4.2+. * mongod >=4.2,<5.1 uses OP_MSG. * mongod >=5.1 uses OP_MSG. * mongos <7.1 returns error * mongos >=7.1 uses OP_MSG. */ static int skip_if_no_exhaust(void) { if (!TestSuite_CheckLive()) { return 0; } int64_t max_wire_version; test_framework_get_max_wire_version(&max_wire_version); // mongos only supports exhaust cursors on server version 7.1+. if (test_framework_is_mongos()) { if (max_wire_version >= WIRE_VERSION_MONGOS_EXHAUST) { return 1; } return 0; } // mongod supports exhaust cursors over OP_MSG or OP_QUERY for all versions // supported by libmongoc. return 1; } static uint32_t get_generation(mongoc_client_t *client, mongoc_cursor_t *cursor) { uint32_t server_id; uint32_t generation; mongoc_server_description_t const *sd; bson_error_t error; ASSERT(client); mc_shared_tpld td = mc_tpld_take_ref(client->topology); server_id = mongoc_cursor_get_server_id(cursor); sd = mongoc_topology_description_server_by_id_const(td.ptr, server_id, &error); ASSERT_OR_PRINT(sd, error); generation = mc_tpl_sd_get_generation(sd, &kZeroObjectId); mc_tpld_drop_ref(&td); return generation; } static void test_exhaust_cursor(bool pooled) { mongoc_stream_t *stream; mongoc_write_concern_t *wr; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; mongoc_collection_t *collection; mongoc_cursor_t *cursor; mongoc_cursor_t *cursor2; const bson_t *doc; bson_t q; bson_t b[10]; bson_t *bptr[10]; int i; bool r; uint32_t server_id; bson_error_t error; bson_oid_t oid; int64_t generation1; int connection_count1; stream_tracker_t *st = stream_tracker_new(); if (pooled) { pool = test_framework_new_default_client_pool(); stream_tracker_track_pool(st, pool); client = mongoc_client_pool_pop(pool); // Wait for all background monitoring connections to be established. mongoc_uri_t *uri = test_framework_get_uri(); // Server 4.4 added support for streaming monitoring and has 2 monitoring connections. int monitor_count = test_framework_get_server_version() >= test_framework_str_to_version("4.4") ? 2 : 1; const mongoc_host_list_t *hosts = mongoc_uri_get_hosts(uri); while (hosts) { stream_tracker_assert_eventual_active_count(st, hosts->host_and_port, monitor_count); hosts = hosts->next; } mongoc_uri_destroy(uri); } else { client = test_framework_new_default_client(); stream_tracker_track_client(st, client); } BSON_ASSERT(client); collection = get_test_collection(client, "test_exhaust_cursor"); BSON_ASSERT(collection); /* don't care if ns not found. */ (void)mongoc_collection_drop(collection, &error); wr = mongoc_write_concern_new(); mongoc_write_concern_set_journal(wr, true); /* bulk insert some records to work on */ { bson_init(&q); for (i = 0; i < 10; i++) { bson_init(&b[i]); bson_oid_init(&oid, NULL); bson_append_oid(&b[i], "_id", -1, &oid); bson_append_int32(&b[i], "n", -1, i % 2); bptr[i] = &b[i]; } bson_t opts = BSON_INITIALIZER; ASSERT(mongoc_write_concern_append(wr, &opts)); ASSERT_OR_PRINT(mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, &opts, NULL, &error), error); bson_destroy(&opts); } /* create a couple of cursors */ { cursor = mongoc_collection_find_with_opts(collection, &q, tmp_bson("{'exhaust': true, 'batchSize': 5}"), NULL); cursor2 = mongoc_collection_find_with_opts(collection, &q, NULL, NULL); } /* Read from the exhaust cursor, ensure that we're in exhaust where we * should be and ensure that an early destroy properly causes a disconnect * */ { r = mongoc_cursor_next(cursor, &doc); if (!r) { mongoc_cursor_error(cursor, &error); fprintf(stderr, "cursor error: %s\n", error.message); } BSON_ASSERT(r); BSON_ASSERT(doc); // With OP_MSG, a cursor only becomes exhaust after the first getMore while (!cursor->in_exhaust && mongoc_cursor_next(cursor, &doc)) ; BSON_ASSERT(client->in_exhaust); /* destroy the cursor, make sure the connection pool was not cleared */ generation1 = get_generation(client, cursor); mongoc_host_list_t host; mongoc_cursor_get_host(cursor, &host); connection_count1 = stream_tracker_count_total(st, host.host_and_port); mongoc_cursor_destroy(cursor); BSON_ASSERT(!client->in_exhaust); } /* Grab a new exhaust cursor, then verify that reading from that cursor * (putting the client into exhaust), breaks a mid-stream read from a * regular cursor */ { cursor = mongoc_collection_find_with_opts(collection, &q, tmp_bson("{'exhaust': true, 'batchSize': 5}"), NULL); r = mongoc_cursor_next(cursor2, &doc); if (!r) { mongoc_cursor_error(cursor2, &error); fprintf(stderr, "cursor error: %s\n", error.message); } BSON_ASSERT(r); BSON_ASSERT(doc); /* The pool was not cleared. */ ASSERT_CMPINT64(generation1, ==, get_generation(client, cursor2)); /* But a new connection was made. */ mongoc_host_list_t host; mongoc_cursor_get_host(cursor2, &host); stream_tracker_assert_total_count(st, host.host_and_port, connection_count1 + 1); for (i = 0; i < 5; i++) { r = mongoc_cursor_next(cursor2, &doc); if (!r) { mongoc_cursor_error(cursor2, &error); fprintf(stderr, "cursor error: %s\n", error.message); } BSON_ASSERT(r); BSON_ASSERT(doc); } while (!cursor->in_exhaust && (r = mongoc_cursor_next(cursor, &doc))) ; BSON_ASSERT(client->in_exhaust); BSON_ASSERT(r); BSON_ASSERT(doc); doc = NULL; r = mongoc_cursor_next(cursor2, &doc); BSON_ASSERT(!r); BSON_ASSERT(!doc); mongoc_cursor_error(cursor2, &error); ASSERT_CMPUINT32(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPUINT32(error.code, ==, MONGOC_ERROR_CLIENT_IN_EXHAUST); mongoc_cursor_destroy(cursor2); } /* make sure writes fail as well */ { bson_t opts = BSON_INITIALIZER; ASSERT(mongoc_write_concern_append(wr, &opts)); r = mongoc_collection_insert_many(collection, (const bson_t **)bptr, 10, &opts, NULL, &error); bson_destroy(&opts); BSON_ASSERT(!r); ASSERT_CMPUINT32(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPUINT32(error.code, ==, MONGOC_ERROR_CLIENT_IN_EXHAUST); } /* we're still in exhaust. * * 1. check that we can create a new cursor, as long as we don't read from it * 2. fully exhaust the exhaust cursor * 3. make sure that we don't disconnect at destroy * 4. make sure we can read the cursor we made during the exhaust */ { cursor2 = mongoc_collection_find_with_opts(collection, &q, NULL, NULL); server_id = cursor->server_id; stream = (mongoc_stream_t *)mongoc_set_get(client->cluster.nodes, server_id); while (cursor->in_exhaust && (r = mongoc_cursor_next(cursor, &doc))) ; BSON_ASSERT(!r); BSON_ASSERT(!doc); mongoc_cursor_destroy(cursor); BSON_ASSERT(stream == (mongoc_stream_t *)mongoc_set_get(client->cluster.nodes, server_id)); r = mongoc_cursor_next(cursor2, &doc); BSON_ASSERT(r); BSON_ASSERT(doc); } bson_destroy(&q); for (i = 0; i < 10; i++) { bson_destroy(&b[i]); } ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_write_concern_destroy(wr); mongoc_cursor_destroy(cursor2); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } stream_tracker_destroy(st); } static void test_exhaust_cursor_works(void *context) { BSON_UNUSED(context); bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); // Drop collection to remove prior test data. mongoc_collection_drop(coll, NULL /* ignore error */); // Insert enough documents to require more than one batch. // With OP_MSG, a cursor only becomes exhaust after the first getMore. for (int i = 0; i < 5; i++) { bool ok = mongoc_collection_insert_one(coll, tmp_bson("{'i': %d}", i), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); } mongoc_cursor_t *cursor = mongoc_collection_find_with_opts( coll, tmp_bson("{}"), tmp_bson("{'exhaust': true, 'batchSize': 2}"), NULL /* read_prefs */); const bson_t *result; while (mongoc_cursor_next(cursor, &result)) ; // Expect an error if exhaust cursors are not supported. const bool sharded = _mongoc_topology_get_type(cursor->client->topology) == MONGOC_TOPOLOGY_SHARDED; int64_t wire_version; test_framework_get_max_wire_version(&wire_version); if (sharded && wire_version < WIRE_VERSION_MONGOS_EXHAUST) { ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "exhaust cursors require"); } else { // Expect no error. ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // `test_exhaust_cursor_no_match` is a regression test for CDRIVER-5515 static void test_exhaust_cursor_no_match(void *context) { BSON_UNUSED(context); bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); // Drop collection to remove prior test data. mongoc_collection_drop(coll, NULL /* ignore error */); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'exhaust': true }"), NULL /* read_prefs */); const bson_t *result; size_t count = 0; while (mongoc_cursor_next(cursor, &result)) { count++; } // Expect an error if exhaust cursors are not supported. const bool sharded = _mongoc_topology_get_type(cursor->client->topology) == MONGOC_TOPOLOGY_SHARDED; int64_t wire_version; test_framework_get_max_wire_version(&wire_version); if (sharded && wire_version < WIRE_VERSION_MONGOS_EXHAUST) { ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "exhaust cursors require"); } else { // Expect no error. ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); // Expect no results. ASSERT_CMPSIZE_T(count, ==, 0); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_exhaust_cursor_single(void *context) { BSON_UNUSED(context); test_exhaust_cursor(false); } static void test_exhaust_cursor_pool(void *context) { BSON_UNUSED(context); test_exhaust_cursor(true); } static void test_exhaust_cursor_multi_batch(void *context) { mongoc_client_t *client; bson_error_t error; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; mongoc_bulk_operation_t *bulk; int i; uint32_t server_id; mongoc_cursor_t *cursor; const bson_t *cursor_doc; BSON_UNUSED(context); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_exhaust_cursor_multi_batch"); ASSERT_OR_PRINT(collection, error); BSON_APPEND_UTF8(&doc, "key", "value"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* enough to require more than initial batch */ for (i = 0; i < 1000; i++) { mongoc_bulk_operation_insert(bulk, &doc); } server_id = mongoc_bulk_operation_execute(bulk, NULL, &error); ASSERT_OR_PRINT(server_id, error); cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{}"), tmp_bson("{'exhaust': true, 'batchSize': 10}"), NULL); i = 0; while (mongoc_cursor_next(cursor, &cursor_doc)) { i++; ASSERT(mongoc_cursor_more(cursor)); } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ASSERT(!mongoc_cursor_more(cursor)); ASSERT_CMPINT(i, ==, 1000); mongoc_cursor_destroy(cursor); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); bson_destroy(&doc); mongoc_client_destroy(client); } static void test_cursor_server_hint_with_exhaust(void *unused) { BSON_UNUSED(unused); bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); mongoc_collection_t *coll = get_test_collection(client, "cursor_server_hint_with_exhaust"); mongoc_cursor_t *cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'exhaust': true}"), /* opts */ NULL /* read_prefs */); // Set a bogus server ID. mongoc_cursor_set_server_id(cursor, 123); // Iterate the cursor. const bson_t *result; while (mongoc_cursor_next(cursor, &result)) ; // Expect an error due to the bogus server ID. ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Could not find server with id: 123"); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_cursor_set_max_await_time_ms(void) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *bson; client = test_framework_new_default_client(); collection = get_test_collection(client, "test_cursor_set_max_await_time_ms"); cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{}"), tmp_bson("{'tailable': true, 'awaitData': true}"), NULL); ASSERT_CMPINT(0, ==, mongoc_cursor_get_max_await_time_ms(cursor)); mongoc_cursor_set_max_await_time_ms(cursor, 123); ASSERT_CMPINT(123, ==, mongoc_cursor_get_max_await_time_ms(cursor)); mongoc_cursor_next(cursor, &bson); /* once started, cursor ignores set_max_await_time_ms () */ mongoc_cursor_set_max_await_time_ms(cursor, 42); ASSERT_CMPINT(123, ==, mongoc_cursor_get_max_await_time_ms(cursor)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef enum { FIRST_BATCH, SECOND_BATCH, } exhaust_error_when_t; typedef enum { NETWORK_ERROR, SERVER_ERROR, } exhaust_error_type_t; static void _request_error(request_t *request, exhaust_error_type_t error_type) { if (error_type == NETWORK_ERROR) { reply_to_request_with_reset(request); } else { reply_to_op_msg_request( request, MONGOC_OP_MSG_FLAG_NONE, tmp_bson(BSON_STR({"ok" : 0, "errmsg" : "uh oh", "code" : 4321}))); } } static void _check_error(mongoc_client_t *client, mongoc_cursor_t *cursor, exhaust_error_type_t error_type) { uint32_t server_id; bson_error_t error; ASSERT(client); server_id = mongoc_cursor_get_server_id(cursor); ASSERT(server_id); ASSERT(mongoc_cursor_error(cursor, &error)); if (error_type == NETWORK_ERROR) { ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); /* socket was discarded */ ASSERT(!mongoc_cluster_stream_for_server( &client->cluster, server_id, false /* don't reconnect */, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error or timeout"); } else { /* query failure */ ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_QUERY, 4321 /* error from mock server */, "uh oh" /* message from mock server */); } } static void _mock_test_exhaust(bool pooled, exhaust_error_when_t error_when, exhaust_error_type_t error_type) { mock_server_t *server; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; capture_logs(true); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); if (pooled) { pool = test_framework_client_pool_new_from_uri(mock_server_get_uri(server), NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); } collection = mongoc_client_get_collection(client, "db", "test"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), tmp_bson("{'exhaust': true}"), NULL); future = future_cursor_next(cursor, &doc); // Expect "find" command with exhaust flag. Reply with one document. request = mock_server_receives_msg( server, MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED, tmp_bson(BSON_STR({"find" : "test", "filter" : {}}))); if (error_when == SECOND_BATCH) { /* initial query succeeds, gets a doc and cursor id of 123 */ reply_to_op_msg_request( request, MONGOC_OP_MSG_FLAG_NONE, tmp_bson(BSON_STR({ "ok" : 1, "cursor" : {"id" : {"$numberLong" : "123"}, "ns" : "test.test", "firstBatch" : [ {"a" : 1} ]} }))); ASSERT(future_get_bool(future)); assert_match_bson(doc, tmp_bson("{'a': 1}"), false); ASSERT_CMPINT64((int64_t)123, ==, mongoc_cursor_get_id(cursor)); future_destroy(future); /* error after initial batch */ future = future_cursor_next(cursor, &doc); request_destroy(request); // Expect "getMore" command. request = mock_server_receives_msg( server, MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED, tmp_bson(BSON_STR({"getMore" : {"$numberLong" : "123"}}))); } _request_error(request, error_type); ASSERT(!future_get_bool(future)); _check_error(client, cursor, error_type); future_destroy(future); request_destroy(request); // If error occurs after the first batch, expect `mongoc_cursor_destroy` sends `killCursors` to clean up the // server-side cursor. if (error_when == SECOND_BATCH && error_type != NETWORK_ERROR) { // If connection is still alive, driver will try to send `getMore`, but fail. future = future_cursor_destroy(cursor); request = mock_server_receives_msg( server, MONGOC_OP_MSG_FLAG_NONE, tmp_bson(BSON_STR({"killCursors" : "test", "cursors" : [ {"$numberLong" : "123"} ]}))); reply_to_op_msg_request(request, MONGOC_OP_MSG_FLAG_NONE, tmp_bson("{'ok': 1}")); request_destroy(request); ASSERT(future_wait(future)); future_destroy(future); } else { mongoc_cursor_destroy(cursor); } mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mock_server_destroy(server); } static void test_exhaust_network_err_1st_batch_single(void) { _mock_test_exhaust(false, FIRST_BATCH, NETWORK_ERROR); } static void test_exhaust_network_err_1st_batch_pooled(void) { _mock_test_exhaust(true, FIRST_BATCH, NETWORK_ERROR); } static void test_exhaust_server_err_1st_batch_single(void) { _mock_test_exhaust(false, FIRST_BATCH, SERVER_ERROR); } static void test_exhaust_server_err_1st_batch_pooled(void) { _mock_test_exhaust(true, FIRST_BATCH, SERVER_ERROR); } static void test_exhaust_network_err_2nd_batch_single(void) { _mock_test_exhaust(false, SECOND_BATCH, NETWORK_ERROR); } static void test_exhaust_network_err_2nd_batch_pooled(void) { _mock_test_exhaust(true, SECOND_BATCH, NETWORK_ERROR); } static void test_exhaust_server_err_2nd_batch_single(void) { _mock_test_exhaust(false, SECOND_BATCH, SERVER_ERROR); } static void test_exhaust_server_err_2nd_batch_pooled(void) { _mock_test_exhaust(true, SECOND_BATCH, SERVER_ERROR); } #ifndef _WIN32 #include /* Test that calling mongoc_client_reset on a client that has an exhaust cursor * closes the socket open to that server, and marks the client as no longer in * exhaust. */ static void test_exhaust_in_child(void) { mongoc_client_t *client; mongoc_collection_t *coll; bool ret; mongoc_cursor_t *cursor; bson_t *to_insert; int i; bson_error_t error; const bson_t *doc; mongoc_bulk_operation_t *bulk; pid_t pid; uint32_t server_id; int child_exit_status; client = test_framework_new_default_client(); coll = get_test_collection(client, "exhaust_in_child"); /* insert some documents, more than one reply's worth. */ to_insert = BCON_NEW("x", BCON_INT32(1)); bulk = mongoc_collection_create_bulk_operation_with_opts(coll, NULL); for (i = 0; i < 1001; i++) { ret = mongoc_bulk_operation_insert_with_opts(bulk, to_insert, NULL /* opts */, &error); ASSERT_OR_PRINT(ret, error); } ret = mongoc_bulk_operation_execute(bulk, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); mongoc_bulk_operation_destroy(bulk); /* create an exhaust cursor. */ cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'exhaust': true }"), NULL /* read prefs */); BSON_ASSERT(mongoc_cursor_next(cursor, &doc)); BSON_ASSERT(client->in_exhaust); server_id = mongoc_cursor_get_server_id(cursor); pid = fork(); if (pid == 0) { bson_t *ping; /* In child process, reset the client and destroy the cursor. */ mongoc_client_reset(client); mongoc_cursor_destroy(cursor); /* The client should no longer be in exhaust */ BSON_ASSERT(!client->in_exhaust); /* A command directly on that server should still work (it should open a * new socket). */ ping = BCON_NEW("ping", BCON_INT32(1)); ret = mongoc_client_command_simple_with_server_id( client, "admin", ping, NULL /* read prefs */, server_id, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); mongoc_collection_destroy(coll); mongoc_client_destroy(client); /* Clean up and exit, so child does not continue running test-libmongoc. */ mongoc_cleanup(); exit(0); } BSON_ASSERT(-1 != waitpid(pid, &child_exit_status, 0 /* opts */)); BSON_ASSERT(0 == child_exit_status); while (mongoc_cursor_next(cursor, &doc)) ; ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); bson_destroy(to_insert); mongoc_cursor_destroy(cursor); mongoc_collection_drop(coll, &error); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } #endif /* _WIN32 */ void test_exhaust_install(TestSuite *suite) { TestSuite_AddFull(suite, "/Client/exhaust_cursor/works [lock:live-server]", test_exhaust_cursor_works, NULL, NULL, skip_if_no_exhaust); TestSuite_AddFull(suite, "/Client/exhaust_cursor/no_match [lock:live-server]", test_exhaust_cursor_no_match, NULL, NULL, skip_if_no_exhaust); TestSuite_AddFull(suite, "/Client/exhaust_cursor/single [lock:live-server]", test_exhaust_cursor_single, NULL, NULL, skip_if_no_exhaust); TestSuite_AddFull(suite, "/Client/exhaust_cursor/pool [lock:live-server]", test_exhaust_cursor_pool, NULL, NULL, skip_if_no_exhaust); TestSuite_AddFull(suite, "/Client/exhaust_cursor/batches [lock:live-server]", test_exhaust_cursor_multi_batch, NULL, NULL, skip_if_no_exhaust); TestSuite_AddLive(suite, "/Client/set_max_await_time_ms", test_cursor_set_max_await_time_ms); TestSuite_AddFull(suite, "/Client/exhaust_cursor/server_hint [lock:live-server]", test_cursor_server_hint_with_exhaust, NULL, NULL, skip_if_no_exhaust); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/network/1st_batch/single", test_exhaust_network_err_1st_batch_single); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/network/1st_batch/pooled", test_exhaust_network_err_1st_batch_pooled); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/server/1st_batch/single", test_exhaust_server_err_1st_batch_single); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/server/1st_batch/pooled", test_exhaust_server_err_1st_batch_pooled); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/network/2nd_batch/single", test_exhaust_network_err_2nd_batch_single); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/network/2nd_batch/pooled", test_exhaust_network_err_2nd_batch_pooled); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/server/2nd_batch/single", test_exhaust_server_err_2nd_batch_single); TestSuite_AddMockServerTest( suite, "/Client/exhaust_cursor/err/server/2nd_batch/pooled", test_exhaust_server_err_2nd_batch_pooled); #ifndef _WIN32 /* Skip on Windows, since "fork" is not available and this test is not * particularly platform dependent. */ if (!TestSuite_NoFork(suite)) { TestSuite_AddLive(suite, "/Client/exhaust_cursor/after_reset", test_exhaust_in_child); } #endif /* _WIN32 */ } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-find-and-modify.c000066400000000000000000000460761511661753600256440ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include static void auto_hello(mock_server_t *server, int32_t max_wire_version, int32_t max_message_size, int32_t max_bson_size, int32_t max_batch_size) { char *response = bson_strdup_printf("{'isWritablePrimary': true, " " 'maxWireVersion': %d," " 'maxBsonObjectSize': %d," " 'maxMessageSizeBytes': %d," " 'maxWriteBatchSize': %d }", max_wire_version, max_bson_size, max_message_size, max_batch_size); BSON_ASSERT(max_wire_version > 0); mock_server_auto_hello(server, response); bson_free(response); } static void test_find_and_modify_bypass(bool bypass) { mongoc_collection_t *collection; mongoc_client_t *client; mock_server_t *server; request_t *request; future_t *future; bson_error_t error; bson_t *update; bson_t doc = BSON_INITIALIZER; bson_t reply; mongoc_find_and_modify_opts_t *opts; server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test_find_and_modify"); auto_hello(server, WIRE_VERSION_MIN, /* max_wire_version */ 48000000, /* max_message_size */ 16777216, /* max_bson_size */ 1000); /* max_write_batch_size */ BSON_APPEND_INT32(&doc, "superduper", 77889); update = BCON_NEW("$set", "{", "superduper", BCON_INT32(1234), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_bypass_document_validation(opts, bypass); BSON_ASSERT(bypass == mongoc_find_and_modify_opts_get_bypass_document_validation(opts)); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_RETURN_NEW); future = future_collection_find_and_modify_with_opts(collection, &doc, opts, &reply, &error); if (bypass) { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'findAndModify': 'test_find_and_modify'," " 'query': {'superduper': 77889}," " 'update': {'$set': {'superduper': 1234}}," " 'new': true," " 'bypassDocumentValidation': true}")); } else { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'findAndModify': 'test_find_and_modify', " "'query': {'superduper': 77889}," "'update': {'$set': {'superduper': 1234}}," "'new': true }")); } reply_to_request_simple(request, "{ 'value' : null, 'ok' : 1 }"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&reply); bson_destroy(update); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); bson_destroy(&doc); } static void test_find_and_modify_bypass_true(void) { test_find_and_modify_bypass(true); } static void test_find_and_modify_bypass_false(void) { test_find_and_modify_bypass(false); } static void test_find_and_modify_write_concern(void) { mongoc_collection_t *collection; mongoc_client_t *client; mock_server_t *server; request_t *request; future_t *future; bson_error_t error; bson_t *update; bson_t doc = BSON_INITIALIZER; bson_t reply; mongoc_find_and_modify_opts_t *opts; mongoc_write_concern_t *write_concern; server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); ASSERT(client); collection = mongoc_client_get_collection(client, "test", "test_find_and_modify"); auto_hello(server, WIRE_VERSION_MIN, /* max_wire_version */ 48000000, /* max_message_size */ 16777216, /* max_bson_size */ 1000); /* max_write_batch_size */ BSON_APPEND_INT32(&doc, "superduper", 77889); update = BCON_NEW("$set", "{", "superduper", BCON_INT32(1234), "}"); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, 42); opts = mongoc_find_and_modify_opts_new(); mongoc_collection_set_write_concern(collection, write_concern); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_RETURN_NEW); future = future_collection_find_and_modify_with_opts(collection, &doc, opts, &reply, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'findAndModify': 'test_find_and_modify', " " 'query': {'superduper': 77889 }," " 'update': {'$set': {'superduper': 1234}}," " 'new': true," " 'writeConcern': {'w': 42}}")); reply_to_request_simple(request, "{ 'value' : null, 'ok' : 1 }"); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); request_destroy(request); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&reply); bson_destroy(update); mongoc_write_concern_destroy(write_concern); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&doc); mock_server_destroy(server); } static void test_find_and_modify_write_concern_failure(void *context) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; mongoc_find_and_modify_opts_t *opts; bson_t reply; bson_t query = BSON_INITIALIZER; bson_t *update; bool success; mongoc_write_concern_t *wc; BSON_UNUSED(context); client = test_framework_new_default_client(); collection = get_test_collection(client, "writeFailure"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 42); mongoc_collection_set_write_concern(collection, wc); /* Find Zlatan Ibrahimovic, the striker */ BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); BSON_APPEND_UTF8(&query, "lastname", "Ibrahimovic"); BSON_APPEND_UTF8(&query, "profession", "Football player"); BSON_APPEND_INT32(&query, "age", 34); BSON_APPEND_INT32(&query, "goals", (16 + 35 + 23 + 57 + 16 + 14 + 28 + 84) + (1 + 6 + 62)); /* Add his football position */ update = BCON_NEW("$set", "{", "position", BCON_UTF8("striker"), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); /* Create the document if it didn't exist, and return the updated document */ mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_UPSERT | MONGOC_FIND_AND_MODIFY_RETURN_NEW); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, &reply, &error); ASSERT(!success); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, 100, "Write Concern error:"); bson_destroy(&reply); bson_destroy(update); bson_destroy(&query); mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_drop(collection, NULL); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_find_and_modify(void) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_iter_t iter; bson_iter_t citer; bson_t *update; bson_t doc = BSON_INITIALIZER; bson_t tmp; bson_t reply; mongoc_find_and_modify_opts_t *opts; client = test_framework_new_default_client(); ASSERT(client); collection = get_test_collection(client, "test_find_and_modify"); ASSERT(collection); BSON_APPEND_INT32(&doc, "superduper", 77889); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, &doc, NULL, NULL, &error), error); update = BCON_NEW("$set", "{", "superduper", BCON_INT32(1234), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); mongoc_find_and_modify_opts_get_update(opts, &tmp); assert_match_bson(&tmp, update, false); bson_destroy(&tmp); mongoc_find_and_modify_opts_set_fields(opts, tmp_bson("{'superduper': 1}")); mongoc_find_and_modify_opts_get_fields(opts, &tmp); assert_match_bson(&tmp, tmp_bson("{'superduper': 1}"), false); bson_destroy(&tmp); mongoc_find_and_modify_opts_set_sort(opts, tmp_bson("{'superduper': 1}")); mongoc_find_and_modify_opts_get_sort(opts, &tmp); assert_match_bson(&tmp, tmp_bson("{'superduper': 1}"), false); bson_destroy(&tmp); mongoc_find_and_modify_opts_set_flags(opts, MONGOC_FIND_AND_MODIFY_RETURN_NEW); BSON_ASSERT(MONGOC_FIND_AND_MODIFY_RETURN_NEW == mongoc_find_and_modify_opts_get_flags(opts)); ASSERT_OR_PRINT(mongoc_collection_find_and_modify_with_opts(collection, &doc, opts, &reply, &error), error); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "value")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); BSON_ASSERT(bson_iter_recurse(&iter, &citer)); BSON_ASSERT(bson_iter_find(&citer, "superduper")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&citer)); BSON_ASSERT(bson_iter_int32(&citer) == 1234); BSON_ASSERT(bson_iter_init_find(&iter, &reply, "lastErrorObject")); BSON_ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); BSON_ASSERT(bson_iter_recurse(&iter, &citer)); BSON_ASSERT(bson_iter_find(&citer, "updatedExisting")); BSON_ASSERT(BSON_ITER_HOLDS_BOOL(&citer)); BSON_ASSERT(bson_iter_bool(&citer)); bson_destroy(&reply); bson_destroy(update); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&doc); } static void test_find_and_modify_opts(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; mongoc_find_and_modify_opts_t *opts; bson_t extra; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); opts = mongoc_find_and_modify_opts_new(); BSON_ASSERT(mongoc_find_and_modify_opts_set_max_time_ms(opts, 42)); ASSERT_CMPUINT32(42, ==, mongoc_find_and_modify_opts_get_max_time_ms(opts)); BSON_ASSERT(mongoc_find_and_modify_opts_append(opts, tmp_bson("{'foo': 1}"))); mongoc_find_and_modify_opts_get_extra(opts, &extra); assert_match_bson(&extra, tmp_bson("{'foo': 1}"), false); bson_destroy(&extra); future = future_collection_find_and_modify_with_opts(collection, tmp_bson("{}"), opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'findAndModify': 'collection'," " 'maxTimeMS': 42," " 'foo': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_find_and_modify_opts_write_concern(void) { mongoc_write_concern_t *w2; mongoc_write_concern_t *w3; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; mongoc_find_and_modify_opts_t *opts; bson_t extra = BSON_INITIALIZER; future_t *future; request_t *request; w2 = mongoc_write_concern_new(); mongoc_write_concern_set_w(w2, 2); w3 = mongoc_write_concern_new(); mongoc_write_concern_set_w(w3, 3); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); opts = mongoc_find_and_modify_opts_new(); mongoc_write_concern_append(w2, &extra); BSON_ASSERT(mongoc_find_and_modify_opts_append(opts, &extra)); bson_destroy(&extra); future = future_collection_find_and_modify_with_opts(collection, tmp_bson("{}"), opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'findAndModify': 'collection'," " 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* opts overrides collection */ mongoc_collection_set_write_concern(collection, w3); future = future_collection_find_and_modify_with_opts(collection, tmp_bson("{}"), opts, NULL, &error); /* still w: 2 */ request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'findAndModify': 'collection'," " 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); mongoc_write_concern_destroy(w2); mongoc_write_concern_destroy(w3); } static void test_find_and_modify_collation(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; mongoc_find_and_modify_opts_t *opts; future_t *future; request_t *request; bson_t *collation; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); collation = BCON_NEW("collation", "{", "locale", BCON_UTF8("en_US"), "caseFirst", BCON_UTF8("lower"), "}"); opts = mongoc_find_and_modify_opts_new(); BSON_ASSERT(mongoc_find_and_modify_opts_append(opts, collation)); future = future_collection_find_and_modify_with_opts(collection, tmp_bson("{}"), opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'findAndModify': 'collection'," " 'collation': {'locale': 'en_US', 'caseFirst': 'lower'}}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); bson_destroy(collation); mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_find_and_modify_hint(void) { mongoc_client_t *client; mongoc_collection_t *coll; mongoc_find_and_modify_opts_t *opts; bson_error_t error; bool ret; /* Test setting a hint as a string. Should fail on server < 4.2. */ client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = get_test_collection(client, "fam_hint"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_append(opts, tmp_bson("{'hint': 'abc'}")); mongoc_find_and_modify_opts_set_update(opts, tmp_bson("{}")); ret = mongoc_collection_find_and_modify_with_opts(coll, tmp_bson("{}"), opts, NULL /* reply */, &error); if (test_framework_max_wire_version_at_least(WIRE_VERSION_FIND_AND_MODIFY_HINT)) { ASSERT_OR_PRINT(ret, error); } else if (test_framework_max_wire_version_at_least(WIRE_VERSION_FIND_AND_MODIFY_HINT_SERVER_SIDE_ERROR)) { BSON_ASSERT(!ret); BSON_ASSERT(error.domain == MONGOC_ERROR_SERVER); /* server error. */ } else { BSON_ASSERT(!ret); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support hint for findAndModify"); } mongoc_find_and_modify_opts_destroy(opts); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_find_and_modify_install(TestSuite *suite) { TestSuite_AddLive(suite, "/find_and_modify/find_and_modify", test_find_and_modify); TestSuite_AddMockServerTest(suite, "/find_and_modify/find_and_modify/bypass/true", test_find_and_modify_bypass_true); TestSuite_AddMockServerTest( suite, "/find_and_modify/find_and_modify/bypass/false", test_find_and_modify_bypass_false); TestSuite_AddMockServerTest( suite, "/find_and_modify/find_and_modify/write_concern", test_find_and_modify_write_concern); TestSuite_AddFull(suite, "/find_and_modify/find_and_modify/write_concern_failure [lock:live-server]", test_find_and_modify_write_concern_failure, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/find_and_modify/opts", test_find_and_modify_opts); TestSuite_AddMockServerTest(suite, "/find_and_modify/opts/write_concern", test_find_and_modify_opts_write_concern); TestSuite_AddMockServerTest(suite, "/find_and_modify/collation", test_find_and_modify_collation); TestSuite_AddLive(suite, "/find_and_modify/hint", test_find_and_modify_hint); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-generation-map.c000066400000000000000000000036011511661753600255700ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static void test_generation_map_basic(void) { bson_oid_t oid_a; bson_oid_t oid_b; mongoc_generation_map_t *gm; mongoc_generation_map_t *gm_copy; bson_oid_init_from_string(&oid_a, "AAAAAAAAAAAAAAAAAAAAAAAA"); bson_oid_init_from_string(&oid_b, "BBBBBBBBBBBBBBBBBBBBBBBB"); gm = mongoc_generation_map_new(); /* The generation map returns 0 for a key not found. */ ASSERT_CMPUINT32(0, ==, mongoc_generation_map_get(gm, &oid_a)); /* The generation map increments to 1 for a key not found. */ mongoc_generation_map_increment(gm, &oid_b); ASSERT_CMPUINT32(1, ==, mongoc_generation_map_get(gm, &oid_b)); /* Test incrementing again. */ mongoc_generation_map_increment(gm, &oid_b); ASSERT_CMPUINT32(2, ==, mongoc_generation_map_get(gm, &oid_b)); /* Copying a generation map retains values. */ gm_copy = mongoc_generation_map_copy(gm); ASSERT_CMPUINT32(0, ==, mongoc_generation_map_get(gm_copy, &oid_a)); ASSERT_CMPUINT32(2, ==, mongoc_generation_map_get(gm_copy, &oid_b)); mongoc_generation_map_destroy(gm_copy); mongoc_generation_map_destroy(gm); } void test_generation_map_install(TestSuite *suite) { TestSuite_Add(suite, "/generation_map/basic", test_generation_map_basic); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-gridfs-bucket.c000066400000000000000000001246341511661753600254250ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include void test_create_bucket(void) { /* Tests creating a bucket with all opts set */ mongoc_gridfs_bucket_t *gridfs; mongoc_read_prefs_t *read_prefs; mongoc_write_concern_t *write_concern; mongoc_read_concern_t *read_concern; mongoc_database_t *db; mongoc_client_t *client; bson_t *opts; char *dbname; client = test_framework_new_default_client(); ASSERT(client); dbname = gen_collection_name("test"); db = mongoc_client_get_database(client, dbname); bson_free(dbname); ASSERT(db); opts = bson_new(); /* write concern */ write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, 1); mongoc_write_concern_append(write_concern, opts); /* read concern */ read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_LOCAL); mongoc_read_concern_append(read_concern, opts); /* other opts */ BSON_APPEND_UTF8(opts, "bucketName", "test-gridfs"); BSON_APPEND_INT32(opts, "chunkSizeBytes", 10); read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); gridfs = mongoc_gridfs_bucket_new(db, opts, read_prefs, NULL); ASSERT(gridfs); mongoc_gridfs_bucket_destroy(gridfs); bson_destroy(opts); mongoc_write_concern_destroy(write_concern); mongoc_read_concern_destroy(read_concern); mongoc_read_prefs_destroy(read_prefs); mongoc_database_destroy(db); mongoc_client_destroy(client); } static int _get_index_count(mongoc_collection_t *collection) { mongoc_cursor_t *cursor; bson_error_t error = {0}; int n; const bson_t *info; cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); n = 0; while (mongoc_cursor_next(cursor, &info)) { n++; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); return n; } /* Util that downloads a file content into the given buffer. Returns num bytes * read. */ static size_t _download_file_into_buf(mongoc_gridfs_bucket_t *bucket, const bson_value_t *file_id, char *buf, size_t len) { bson_error_t error; size_t nread; mongoc_stream_t *down = mongoc_gridfs_bucket_open_download_stream(bucket, file_id, &error); ASSERT_OR_PRINT(down, error); nread = mongoc_stream_read(down, buf, len, 1 /* min read */, 0 /* No timeout */); mongoc_stream_destroy(down); ASSERT(nread > 0); return nread; } /* Util for uploading a file with the given string as content */ static void _upload_file_from_str( mongoc_gridfs_bucket_t *bucket, const char *filename, const char *content, const bson_t *opts, bson_value_t *file_id) { bson_error_t error; mongoc_stream_t *const up = mongoc_gridfs_bucket_open_upload_stream(bucket, filename, opts, file_id, &error); ASSERT_OR_PRINT(up, error); const size_t nwritten = mongoc_stream_write(up, (void *)content, strlen(content), 0); ASSERT_CMPSIZE_T(nwritten, ==, strlen(content)); mongoc_stream_destroy(up); } void _test_upload_and_download(bson_t *create_index_cmd) { mongoc_gridfs_bucket_t *gridfs; bson_value_t file_id; mongoc_database_t *db; mongoc_client_t *client; bson_t *opts; /* big enough to hold all of str */ char buf[100] = {0}; char *str; char *dbname; str = "This is a test sentence with multiple chunks."; client = test_framework_new_default_client(); ASSERT(client); dbname = gen_collection_name("test"); db = mongoc_client_get_database(client, dbname); bson_free(dbname); ASSERT(db); if (create_index_cmd) { bson_error_t error; ASSERT_OR_PRINT(mongoc_database_write_command_with_opts(db, create_index_cmd, NULL, NULL, &error), error); } opts = bson_new(); BSON_APPEND_INT32(opts, "chunkSizeBytes", 10); gridfs = mongoc_gridfs_bucket_new(db, opts, NULL, NULL); _upload_file_from_str(gridfs, "my-file", str, opts, &file_id); /* download str into the buffer from gridfs. */ _download_file_into_buf(gridfs, &file_id, buf, sizeof buf); /* compare. */ ASSERT(strcmp(buf, str) == 0); ASSERT_CMPINT(_get_index_count(gridfs->files), ==, 2); ASSERT_CMPINT(_get_index_count(gridfs->chunks), ==, 2); bson_destroy(opts); mongoc_gridfs_bucket_destroy(gridfs); mongoc_database_destroy(db); mongoc_client_destroy(client); } void test_upload_and_download(void) { _test_upload_and_download(NULL); /* Test files index with float and same options */ _test_upload_and_download(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'filename': 1.0, 'uploadDate': 1}, " "'name': 'filename_1_uploadDate_1'}]}", "fs.files")); /* Files index with float and different options */ _test_upload_and_download(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'filename': 1.0, 'uploadDate': 1}, " "'name': 'different_name'}]}", "fs.files")); /* Chunks index with float and same options */ _test_upload_and_download(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'files_id': 1.0, 'n': 1}, 'name': " "'files_id_1_n_1', 'unique': true}]}", "fs.chunks")); /* Chunks index with float and different options */ _test_upload_and_download(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'files_id': 1.0, 'n': 1}, 'name': " "'different_name', 'unique': true}]}", "fs.chunks")); } bool hex_to_bytes(const char *hex_str, size_t *size /* OUT */, uint8_t **bytes /* OUT */) { size_t len; uint8_t *result; size_t i; len = strlen(hex_str); ASSERT(bytes); ASSERT(len % 2 == 0); if (len == 0) { return false; } result = (uint8_t *)bson_malloc0(len / 2); for (i = 0; i < len; i += 2) { sscanf(hex_str + i, "%2hhx", &result[i / 2]); } *bytes = result; if (size) { *size = (len / 2); } return true; } bson_t * convert_hex_to_binary(bson_t *doc) { /* PLAN: Recurse to all sub documents and call this function, otherwise, just * append */ bson_iter_t iter; bson_iter_t inner; bson_t *result; const char *key; bson_t *sub_doc; bson_t *sub_doc_result; const bson_value_t *value; bson_t *hex_doc; uint8_t *hex_bytes; size_t hex_len; const char *str; bool r; result = bson_new(); bson_iter_init(&iter, doc); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); value = bson_iter_value(&iter); if (strcmp(key, "data") == 0) { hex_doc = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&inner, hex_doc, "$hex")); str = bson_iter_utf8(&inner, NULL); r = hex_to_bytes(str, &hex_len, &hex_bytes); if (r) { BSON_APPEND_BINARY(result, key, BSON_SUBTYPE_BINARY, hex_bytes, (uint32_t)hex_len); bson_free(hex_bytes); } else { BSON_APPEND_BINARY(result, key, BSON_SUBTYPE_BINARY, (const uint8_t *)str, 0); } bson_destroy(hex_doc); } else if (value->value_type == BSON_TYPE_DOCUMENT || value->value_type == BSON_TYPE_ARRAY) { sub_doc = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); sub_doc_result = convert_hex_to_binary(sub_doc); bson_destroy(sub_doc); if (value->value_type == BSON_TYPE_DOCUMENT) { BSON_APPEND_DOCUMENT(result, key, sub_doc_result); } else { BSON_APPEND_ARRAY(result, key, sub_doc_result); } bson_destroy(sub_doc_result); } else { BSON_APPEND_VALUE(result, key, value); } } return result; } /* * Initializes the proper GridFS collections with the provided data */ void setup_gridfs_collections(mongoc_database_t *db, bson_t *data) { mongoc_collection_t *files; mongoc_collection_t *chunks; mongoc_collection_t *expected_files; mongoc_collection_t *expected_chunks; bson_iter_t iter; bson_iter_t inner; bson_t *selector; bool r; files = mongoc_database_get_collection(db, "fs.files"); chunks = mongoc_database_get_collection(db, "fs.chunks"); expected_files = mongoc_database_get_collection(db, "expected.files"); expected_chunks = mongoc_database_get_collection(db, "expected.chunks"); selector = bson_new(); mongoc_collection_delete_many(files, selector, NULL, NULL, NULL); mongoc_collection_delete_many(chunks, selector, NULL, NULL, NULL); mongoc_collection_delete_many(expected_files, selector, NULL, NULL, NULL); mongoc_collection_delete_many(expected_chunks, selector, NULL, NULL, NULL); bson_destroy(selector); if (bson_iter_init_find(&iter, data, "files")) { bson_t *docs = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); bson_iter_init(&inner, docs); while (bson_iter_next(&inner)) { bson_t *doc = bson_new_from_data(bson_iter_value(&inner)->value.v_doc.data, bson_iter_value(&inner)->value.v_doc.data_len); r = mongoc_collection_insert_one(files, doc, NULL, NULL, NULL); ASSERT(r); r = mongoc_collection_insert_one(expected_files, doc, NULL, NULL, NULL); ASSERT(r); bson_destroy(doc); } bson_destroy(docs); } if (bson_iter_init_find(&iter, data, "chunks")) { bson_t *docs = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); bson_iter_init(&inner, docs); while (bson_iter_next(&inner)) { bson_t *doc = bson_new_from_data(bson_iter_value(&inner)->value.v_doc.data, bson_iter_value(&inner)->value.v_doc.data_len); bson_t *chunk = convert_hex_to_binary(doc); r = mongoc_collection_insert_one(chunks, chunk, NULL, NULL, NULL); ASSERT(r); r = mongoc_collection_insert_one(expected_chunks, chunk, NULL, NULL, NULL); ASSERT(r); bson_destroy(doc); bson_destroy(chunk); } bson_destroy(docs); } mongoc_collection_destroy(files); mongoc_collection_destroy(chunks); mongoc_collection_destroy(expected_files); mongoc_collection_destroy(expected_chunks); } void gridfs_spec_run_commands(mongoc_database_t *db, bson_t *commands) { bson_iter_t iter; bson_t *data; bson_t *command; bson_t *hex_command; bool r; ASSERT(bson_iter_init_find(&iter, commands, "data")); data = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); bson_iter_init(&iter, data); while (bson_iter_next(&iter)) { command = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); hex_command = convert_hex_to_binary(command); r = mongoc_database_command_simple(db, hex_command, NULL, NULL, NULL); ASSERT(r); bson_destroy(command); bson_destroy(hex_command); } bson_destroy(data); } bson_t * gridfs_replace_result(bson_t *doc, bson_value_t *replacement) { bson_iter_t iter; bson_t *result; const char *key; bson_t *sub_doc; bson_t *sub_doc_result; const bson_value_t *value; const char *str; result = bson_new(); bson_iter_init(&iter, doc); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); value = bson_iter_value(&iter); if (value->value_type == BSON_TYPE_UTF8) { str = bson_iter_utf8(&iter, NULL); if (strcmp(str, "*result") == 0) { BSON_APPEND_VALUE(result, key, replacement); } else if (strcmp(str, "*actual") == 0) { /* Skip adding this */ } else { BSON_APPEND_VALUE(result, key, value); } } else if (value->value_type == BSON_TYPE_DOCUMENT || value->value_type == BSON_TYPE_ARRAY) { sub_doc = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); sub_doc_result = gridfs_replace_result(sub_doc, replacement); bson_destroy(sub_doc); if (value->value_type == BSON_TYPE_DOCUMENT) { BSON_APPEND_DOCUMENT(result, key, sub_doc_result); } else { BSON_APPEND_ARRAY(result, key, sub_doc_result); } bson_destroy(sub_doc_result); } else { BSON_APPEND_VALUE(result, key, value); } } return result; } void gridfs_compare_collections(mongoc_database_t *db) { mongoc_collection_t *files; mongoc_collection_t *chunks; mongoc_collection_t *expected_files; mongoc_collection_t *expected_chunks; mongoc_cursor_t *expected_cursor; mongoc_cursor_t *actual_cursor; const bson_t *expected_doc; const bson_t *actual_doc; bson_iter_t expected_iter; bson_iter_t actual_iter; const uint8_t *expected_binary; const uint8_t *actual_binary; uint32_t expected_len; uint32_t actual_len; bson_t filter; files = mongoc_database_get_collection(db, "fs.files"); chunks = mongoc_database_get_collection(db, "fs.chunks"); expected_files = mongoc_database_get_collection(db, "expected.files"); expected_chunks = mongoc_database_get_collection(db, "expected.chunks"); bson_init(&filter); /* Compare files collections */ actual_cursor = mongoc_collection_find_with_opts(files, &filter, NULL, NULL); expected_cursor = mongoc_collection_find_with_opts(expected_files, &filter, NULL, NULL); while (mongoc_cursor_next(expected_cursor, &expected_doc)) { ASSERT(mongoc_cursor_next(actual_cursor, &actual_doc)); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "_id")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "_id")); ASSERT(bson_oid_compare(bson_iter_oid(&actual_iter), bson_iter_oid(&expected_iter)) == 0); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "length")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "length")); ASSERT(bson_iter_as_int64(&actual_iter) == bson_iter_as_int64(&expected_iter)); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "chunkSize")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "chunkSize")); ASSERT(bson_iter_int32(&actual_iter) == bson_iter_int32(&expected_iter)); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "filename")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "filename")); ASSERT(strcmp(bson_iter_utf8(&actual_iter, NULL), bson_iter_utf8(&expected_iter, NULL)) == 0); } /* Make sure the actual doesn't have extra docs */ ASSERT(!mongoc_cursor_next(actual_cursor, &actual_doc)); mongoc_cursor_destroy(actual_cursor); mongoc_cursor_destroy(expected_cursor); /* Compare chunks collections */ actual_cursor = mongoc_collection_find_with_opts(chunks, &filter, NULL, NULL); expected_cursor = mongoc_collection_find_with_opts(expected_chunks, &filter, NULL, NULL); while (mongoc_cursor_next(expected_cursor, &expected_doc)) { ASSERT(mongoc_cursor_next(actual_cursor, &actual_doc)); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "files_id")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "files_id")); ASSERT(bson_oid_compare(bson_iter_oid(&actual_iter), bson_iter_oid(&expected_iter)) == 0); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "n")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "n")); ASSERT(bson_iter_int32(&actual_iter) == bson_iter_int32(&expected_iter)); ASSERT(bson_iter_init_find(&actual_iter, actual_doc, "data")); ASSERT(bson_iter_init_find(&expected_iter, expected_doc, "data")); bson_iter_binary(&actual_iter, NULL, &actual_len, &actual_binary); bson_iter_binary(&expected_iter, NULL, &expected_len, &expected_binary); ASSERT(actual_len == expected_len); ASSERT(memcmp(actual_binary, expected_binary, actual_len) == 0); } /* Make sure the actual doesn't have extra docs */ ASSERT(!mongoc_cursor_next(actual_cursor, &actual_doc)); bson_destroy(&filter); mongoc_cursor_destroy(actual_cursor); mongoc_cursor_destroy(expected_cursor); mongoc_collection_destroy(files); mongoc_collection_destroy(chunks); mongoc_collection_destroy(expected_files); mongoc_collection_destroy(expected_chunks); } void gridfs_spec_delete_operation(mongoc_database_t *db, mongoc_gridfs_bucket_t *bucket, bson_t *act, bson_t *assert) { bson_iter_t iter; bson_t *arguments; const bson_value_t *value; bool r; ASSERT(bson_iter_init_find(&iter, act, "arguments")); arguments = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&iter, arguments, "id")); value = bson_iter_value(&iter); r = mongoc_gridfs_bucket_delete_by_id(bucket, value, NULL); ASSERT(r != bson_iter_init_find(&iter, assert, "error")); if (bson_iter_init_find(&iter, assert, "data")) { gridfs_spec_run_commands(db, assert); } /* compare collections! */ gridfs_compare_collections(db); bson_destroy(arguments); } void gridfs_spec_download_operation(mongoc_database_t *db, mongoc_gridfs_bucket_t *bucket, bson_t *act, bson_t *assert) { bson_iter_t iter; bson_t *arguments; bson_t *hex_doc; const bson_value_t *value; mongoc_stream_t *stream; char buf[100] = {0}; uint8_t *hex_bytes; size_t hex_len; ssize_t ret; const char *str; const char *expected_error; bson_error_t error; bool r; BSON_UNUSED(db); ASSERT(bson_iter_init_find(&iter, act, "arguments")); arguments = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); if (bson_iter_init_find(&iter, assert, "error")) { expected_error = bson_iter_utf8(&iter, NULL); } else { expected_error = ""; } ASSERT(bson_iter_init_find(&iter, arguments, "id")); value = bson_iter_value(&iter); stream = mongoc_gridfs_bucket_open_download_stream(bucket, value, &error); if (strcmp(expected_error, "FileNotFound") == 0) { ASSERT(!stream); ASSERT(error.code); bson_destroy(arguments); return; } ret = mongoc_stream_read(stream, buf, 100, 0, 0); if (strcmp(expected_error, "ChunkIsMissing") == 0 || strcmp(expected_error, "ChunkIsWrongSize") == 0) { ASSERT(ret < 0); r = mongoc_gridfs_bucket_stream_error(stream, &error); ASSERT(r); ASSERT(error.code); bson_destroy(arguments); mongoc_stream_destroy(stream); return; } mongoc_stream_close(stream); ASSERT(bson_iter_init_find(&iter, assert, "result")); hex_doc = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&iter, hex_doc, "$hex")); str = bson_iter_utf8(&iter, NULL); r = hex_to_bytes(str, &hex_len, &hex_bytes); if (r) { ASSERT(mlib_cmp(ret, ==, hex_len)); ASSERT(memcmp(buf, hex_bytes, hex_len) == 0); bson_free(hex_bytes); } else { ASSERT(ret == 0); } /* Make sure we don't need to run any commands */ ASSERT(!bson_iter_init_find(&iter, assert, "data")); bson_destroy(hex_doc); bson_destroy(arguments); mongoc_stream_destroy(stream); } void gridfs_spec_download_by_name_operation(mongoc_database_t *db, mongoc_gridfs_bucket_t *bucket, bson_t *act, bson_t *assert) { BSON_UNUSED(db); BSON_UNUSED(bucket); BSON_UNUSED(act); BSON_UNUSED(assert); /* The download_by_name functionality is part of the Advanced API for GridFS * and the C Driver hasn't implemented the Advanced API yet. This is a * placeholder to be used when the download_by_name is implemented. */ } void gridfs_spec_upload_operation(mongoc_database_t *db, mongoc_gridfs_bucket_t *bucket, bson_t *act, bson_t *assert) { bson_iter_t iter; bson_t *arguments; const char *filename; mongoc_stream_t *stream; uint8_t *hex_bytes; bson_t *hex_doc; bson_t *options; ssize_t bytes_written; const char *str; bson_value_t file_id; bson_t *assert_modified; size_t hex_len; bool r; ASSERT(bson_iter_init_find(&iter, act, "arguments")); arguments = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&iter, arguments, "filename")); filename = bson_iter_utf8(&iter, NULL); ASSERT(bson_iter_init_find(&iter, arguments, "source")); hex_doc = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&iter, hex_doc, "$hex")); str = bson_iter_utf8(&iter, NULL); r = hex_to_bytes(str, &hex_len, &hex_bytes); if (!r) { hex_len = 0; hex_bytes = bson_malloc0(1); } ASSERT(bson_iter_init_find(&iter, arguments, "options")); options = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); stream = mongoc_gridfs_bucket_open_upload_stream(bucket, filename, options, &file_id, NULL); ASSERT(stream); bytes_written = mongoc_stream_write(stream, hex_bytes, hex_len, 0); ASSERT(mlib_cmp(bytes_written, ==, hex_len)); bson_free(hex_bytes); mongoc_stream_close(stream); mongoc_stream_destroy(stream); assert_modified = gridfs_replace_result(assert, &file_id); gridfs_spec_run_commands(db, assert_modified); gridfs_compare_collections(db); bson_destroy(assert_modified); bson_destroy(options); bson_destroy(hex_doc); bson_destroy(arguments); } void run_gridfs_spec_test(mongoc_database_t *db, mongoc_gridfs_bucket_t *bucket, bson_t *test) { bson_iter_t iter; bson_iter_t inner; bson_t *act; bson_t *assert; bson_t *arrange; const char *operation; ASSERT(bson_iter_init_find(&iter, test, "act")); act = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); ASSERT(bson_iter_init_find(&iter, test, "assert")); assert = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); if (bson_iter_init_find(&iter, test, "arrange")) { arrange = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); gridfs_spec_run_commands(db, arrange); bson_destroy(arrange); } ASSERT(bson_iter_init_find(&inner, act, "operation")); operation = bson_iter_utf8(&inner, NULL); if (strcmp(operation, "delete") == 0) { gridfs_spec_delete_operation(db, bucket, act, assert); } else if (strcmp(operation, "download") == 0) { gridfs_spec_download_operation(db, bucket, act, assert); } else if (strcmp(operation, "download_by_name") == 0) { gridfs_spec_download_by_name_operation(db, bucket, act, assert); } else if (strcmp(operation, "upload") == 0) { gridfs_spec_upload_operation(db, bucket, act, assert); } else { /* Shouldn't happen. */ ASSERT(false); } bson_destroy(act); bson_destroy(assert); } static void test_gridfs_cb(void *scenario_vp) { mongoc_gridfs_bucket_t *gridfs; mongoc_database_t *db; mongoc_client_t *client; bson_iter_t iter; bson_iter_t inner; char *dbname; bson_t *data; bson_t *tests; bson_t *test; BSON_ASSERT_PARAM(scenario_vp); const bson_t *const scenario = scenario_vp; /* Make a gridfs on generated db */ dbname = gen_collection_name("test"); client = test_framework_new_default_client(); db = mongoc_client_get_database(client, dbname); gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, NULL); /* Insert the data */ if (bson_iter_init_find(&iter, scenario, "data")) { data = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); setup_gridfs_collections(db, data); bson_destroy(data); } /* Run the tests */ if (bson_iter_init_find(&iter, scenario, "tests")) { tests = bson_new_from_data(bson_iter_value(&iter)->value.v_doc.data, bson_iter_value(&iter)->value.v_doc.data_len); bson_iter_init(&inner, tests); while (bson_iter_next(&inner)) { test = bson_new_from_data(bson_iter_value(&inner)->value.v_doc.data, bson_iter_value(&inner)->value.v_doc.data_len); run_gridfs_spec_test(db, gridfs, test); bson_destroy(test); } bson_destroy(tests); } bson_free(dbname); mongoc_gridfs_bucket_destroy(gridfs); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite(suite, JSON_DIR, "gridfs", &test_gridfs_cb); } static void test_upload_error(void *ctx) { mongoc_client_t *client; mongoc_uri_t *uri; mongoc_database_t *db; mongoc_gridfs_bucket_t *gridfs; mongoc_stream_t *source; bson_error_t error = {0}; char *const dbname = gen_collection_name("test_upload_error"); bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); db = mongoc_client_get_database(client, dbname); gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, NULL); source = mongoc_stream_file_new_for_path(BSON_BINARY_DIR "/test1.bson", O_RDONLY, 0); BSON_ASSERT(source); r = mongoc_gridfs_bucket_upload_from_stream(gridfs, "test1", source, NULL /* opts */, NULL /* file id */, &error); ASSERT_OR_PRINT(r, error); /* create a read-only user */ (void)mongoc_database_remove_user(db, "fake_user", NULL); r = mongoc_database_add_user(db, "fake_user", "password", tmp_bson("{'0': 'read'}"), NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_stream_close(source); mongoc_stream_destroy(source); mongoc_gridfs_bucket_destroy(gridfs); mongoc_database_destroy(db); mongoc_client_destroy(client); /* initialize gridfs with a root user. */ uri = test_framework_get_uri(); mongoc_uri_set_username(uri, "fake_user"); mongoc_uri_set_password(uri, "password"); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); source = mongoc_stream_file_new_for_path(BSON_BINARY_DIR "/test1.bson", O_RDONLY, 0); BSON_ASSERT(source); db = mongoc_client_get_database(client, dbname); gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, NULL); mongoc_gridfs_bucket_upload_from_stream(gridfs, "test1", source, NULL /* opts */, NULL /* file id */, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, ""); mongoc_stream_close(source); mongoc_stream_destroy(source); mongoc_gridfs_bucket_destroy(gridfs); bson_free(dbname); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void test_find_w_session(void *ctx) { mongoc_client_t *client; mongoc_database_t *db; mongoc_gridfs_bucket_t *gridfs; mongoc_cursor_t *cursor; bson_error_t error = {0}; bson_t opts; mongoc_client_session_t *session; char *dbname = gen_collection_name("test_find_w_session"); bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); db = mongoc_client_get_database(client, dbname); gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, NULL); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); bson_init(&opts); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); cursor = mongoc_gridfs_bucket_find(gridfs, tmp_bson("{}"), &opts); BSON_ASSERT(mongoc_cursor_error(cursor, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CURSOR, MONGOC_ERROR_CURSOR_INVALID_CURSOR, "Cannot pass sessionId as an option"); bson_destroy(&opts); mongoc_cursor_destroy(cursor); mongoc_gridfs_bucket_destroy(gridfs); mongoc_client_session_destroy(session); mongoc_database_destroy(db); bson_free(dbname); mongoc_client_destroy(client); } static void test_find(void *ctx) { mongoc_client_t *const client = test_framework_new_default_client(); char *const dbname = gen_collection_name("test_find"); mongoc_database_t *const db = mongoc_client_get_database(client, dbname); mongoc_gridfs_bucket_t *const gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, NULL); mongoc_cursor_t *cursor; bson_error_t error = {0}; bson_t const *found; bson_iter_t iter; char buffer[256] = {0}; bool ok; bson_value_t const *found_id; const bson_t *const find_opts = tmp_bson("{'limit': 1, 'skip': 2, 'sort': {'metadata.testOrder': -1}}"); BSON_UNUSED(ctx); _upload_file_from_str(gridfs, "file1", "First file", tmp_bson("{'metadata': {'testOrder': 1}}"), NULL); _upload_file_from_str(gridfs, "file2", "Second file", tmp_bson("{'metadata': {'testOrder': 2}}"), NULL); _upload_file_from_str(gridfs, "file3", "Third file", tmp_bson("{'metadata': {'testOrder': 3}}"), NULL); _upload_file_from_str(gridfs, "file4", "Fourth file", tmp_bson("{'metadata': {'testOrder': 4}}"), NULL); cursor = mongoc_gridfs_bucket_find(gridfs, tmp_bson("{}"), find_opts); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); ok = mongoc_cursor_next(cursor, &found); ASSERT(ok && "No files returned"); ok = bson_iter_init_find(&iter, found, "_id"); ASSERT(ok && "Document has no '_id' ??"); found_id = bson_iter_value(&iter); _download_file_into_buf(gridfs, found_id, buffer, sizeof buffer); ASSERT_CMPSTR(buffer, "Second file"); ok = mongoc_cursor_next(cursor, &found); ASSERT(!(ok && "More than one file returned")); mongoc_cursor_destroy(cursor); mongoc_gridfs_bucket_destroy(gridfs); bson_free(dbname); mongoc_database_destroy(db); mongoc_client_destroy(client); } void test_gridfs_bucket_opts(void) { mongoc_client_t *client; mongoc_database_t *db; mongoc_gridfs_bucket_t *gridfs; bson_error_t error; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; bson_t *opts; char *bucket_name; client = test_framework_new_default_client(); db = mongoc_client_get_database(client, "test"); /* check defaults. */ gridfs = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); ASSERT_OR_PRINT(gridfs, error); ASSERT_CMPSTR(gridfs->bucket_name, "fs"); ASSERT_CMPINT32(gridfs->chunk_size, ==, 255 * 1024); BSON_ASSERT(!mongoc_read_concern_get_level(mongoc_collection_get_read_concern(gridfs->chunks))); BSON_ASSERT(!mongoc_read_concern_get_level(mongoc_collection_get_read_concern(gridfs->files))); ASSERT_CMPINT(mongoc_write_concern_get_w(mongoc_collection_get_write_concern(gridfs->chunks)), ==, MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT_CMPINT(mongoc_write_concern_get_w(mongoc_collection_get_write_concern(gridfs->files)), ==, MONGOC_WRITE_CONCERN_W_DEFAULT); mongoc_gridfs_bucket_destroy(gridfs); /* check out-of-range chunk sizes */ gridfs = mongoc_gridfs_bucket_new(db, tmp_bson("{'chunkSizeBytes': -1}"), NULL, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "should be greater than 0"); mongoc_gridfs_bucket_destroy(gridfs); gridfs = mongoc_gridfs_bucket_new(db, tmp_bson("{'chunkSizeBytes': 2147483648}"), NULL, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "out of range"); mongoc_gridfs_bucket_destroy(gridfs); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_AVAILABLE); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); opts = BCON_NEW("bucketName", "abc", "chunkSizeBytes", BCON_INT32(123)); BSON_ASSERT(mongoc_read_concern_append(rc, opts)); BSON_ASSERT(mongoc_write_concern_append(wc, opts)); gridfs = mongoc_gridfs_bucket_new(db, opts, NULL, &error); ASSERT_OR_PRINT(gridfs, error); ASSERT_CMPSTR(gridfs->bucket_name, "abc"); ASSERT_CMPINT32(gridfs->chunk_size, ==, 123); ASSERT_CMPSTR(mongoc_read_concern_get_level(mongoc_collection_get_read_concern(gridfs->chunks)), MONGOC_READ_CONCERN_LEVEL_AVAILABLE); ASSERT_CMPSTR(mongoc_read_concern_get_level(mongoc_collection_get_read_concern(gridfs->files)), MONGOC_READ_CONCERN_LEVEL_AVAILABLE); ASSERT_CMPINT(mongoc_write_concern_get_w(mongoc_collection_get_write_concern(gridfs->chunks)), ==, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); ASSERT_CMPINT(mongoc_write_concern_get_w(mongoc_collection_get_write_concern(gridfs->files)), ==, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); bson_destroy(opts); mongoc_gridfs_bucket_destroy(gridfs); /* check validation of long bucket names */ bucket_name = bson_malloc0(128); memset(bucket_name, 'a', 128 - strlen("chunks")); opts = BCON_NEW("bucketName", bucket_name); gridfs = mongoc_gridfs_bucket_new(db, opts, NULL, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must have fewer"); bson_destroy(opts); mongoc_gridfs_bucket_destroy(gridfs); /* two characters shorter should be okay though. */ *(bucket_name + ((int)(128 - strlen("chunks") - 2))) = '\0'; opts = BCON_NEW("bucketName", bucket_name); gridfs = mongoc_gridfs_bucket_new(db, opts, NULL, &error); ASSERT_OR_PRINT(gridfs, error); bson_destroy(opts); mongoc_gridfs_bucket_destroy(gridfs); bson_free(bucket_name); mongoc_database_destroy(db); mongoc_client_destroy(client); } // Regression test for CDRIVER-6125 static void test_bad_sizes(void) { mongoc_client_t *client = test_framework_new_default_client(); bson_error_t error; mongoc_database_t *db = mongoc_client_get_database(client, "test_bad_sizes"); mongoc_database_drop(db, NULL); // Test negative chunkSize: { bson_t *doc = tmp_bson(BSON_STR({ "_id" : 0, "filename" : "foo.txt", "length" : 1000, "chunkSize" : -1, // Negative! "uploadDate" : {"$date" : 1234567890000} })); bson_iter_t id_iter; ASSERT(bson_iter_init_find(&id_iter, doc, "_id")); const bson_value_t *id_value = bson_iter_value(&id_iter); // Insert manually: { mongoc_collection_t *files = mongoc_database_get_collection(db, "fs.files"); mongoc_collection_insert_one(files, doc, NULL, NULL, &error); mongoc_collection_destroy(files); } // Try to read: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); ASSERT_OR_PRINT(bucket, error); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_download_stream(bucket, id_value, &error); ASSERT(!stream); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "invalid chunk size"); mongoc_gridfs_bucket_destroy(bucket); } // Try to write: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); ASSERT_OR_PRINT(bucket, error); bson_t *opts = tmp_bson(BSON_STR({"chunkSizeBytes" : 0})); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_upload_stream(bucket, "foo.txt", opts, NULL, &error); ASSERT(!stream); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "should be greater than 0"); mongoc_gridfs_bucket_destroy(bucket); } } mongoc_database_drop(db, NULL); // Test zero chunkSize: { bson_t *doc = tmp_bson(BSON_STR({ "_id" : 0, "filename" : "foo.txt", "length" : 1000, "chunkSize" : 0, // Zero! "uploadDate" : {"$date" : 1234567890000} })); bson_iter_t id_iter; ASSERT(bson_iter_init_find(&id_iter, doc, "_id")); const bson_value_t *id_value = bson_iter_value(&id_iter); // Insert manually: { mongoc_collection_t *files = mongoc_database_get_collection(db, "fs.files"); mongoc_collection_insert_one(files, doc, NULL, NULL, &error); mongoc_collection_destroy(files); } // Try to read: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); ASSERT_OR_PRINT(bucket, error); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_download_stream(bucket, id_value, &error); ASSERT(!stream); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "invalid chunk size"); mongoc_gridfs_bucket_destroy(bucket); } // Try to write: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); ASSERT_OR_PRINT(bucket, error); bson_t *opts = tmp_bson(BSON_STR({"chunkSizeBytes" : -1})); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_upload_stream(bucket, "foo.txt", opts, NULL, &error); ASSERT(!stream); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "should be greater than 0"); mongoc_gridfs_bucket_destroy(bucket); } } mongoc_database_drop(db, NULL); // Test negative length: { bson_t *doc = tmp_bson(BSON_STR({ "_id" : 0, "filename" : "foo.txt", "length" : -1, // Negative! "chunkSize" : 10, "uploadDate" : {"$date" : 1234567890000} })); bson_iter_t id_iter; ASSERT(bson_iter_init_find(&id_iter, doc, "_id")); const bson_value_t *id_value = bson_iter_value(&id_iter); // Insert manually: { mongoc_collection_t *files = mongoc_database_get_collection(db, "fs.files"); mongoc_collection_insert_one(files, doc, NULL, NULL, &error); mongoc_collection_destroy(files); } // Try to read: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_download_stream(bucket, id_value, &error); ASSERT(!stream); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "invalid length"); mongoc_gridfs_bucket_destroy(bucket); } } mongoc_database_drop(db, NULL); // Test a zero length (OK): { bson_t *doc = tmp_bson(BSON_STR({ "_id" : 0, "filename" : "foo.txt", "length" : 0, // Zero! "chunkSize" : 10, "uploadDate" : {"$date" : 1234567890000} })); bson_iter_t id_iter; ASSERT(bson_iter_init_find(&id_iter, doc, "_id")); const bson_value_t *id_value = bson_iter_value(&id_iter); // Insert manually: { mongoc_collection_t *files = mongoc_database_get_collection(db, "fs.files"); mongoc_collection_insert_one(files, doc, NULL, NULL, &error); mongoc_collection_destroy(files); } // Try to read: { mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, NULL, NULL, &error); mongoc_stream_t *stream = mongoc_gridfs_bucket_open_download_stream(bucket, id_value, &error); ASSERT(stream); // OK. Gets back an empty read. uint8_t buf[64]; ssize_t r = mongoc_stream_read(stream, buf, sizeof buf, 0, 0); ASSERT_CMPINT(r, ==, 0); mongoc_stream_destroy(stream); mongoc_gridfs_bucket_destroy(bucket); } } mongoc_database_destroy(db); mongoc_client_destroy(client); } // test_big_bucket_name is a regression test for CDRIVER-6157. static void test_big_bucket_name(void) { mongoc_client_t *client = test_framework_new_default_client(); mongoc_database_t *db = mongoc_client_get_database(client, "db"); // Create options: bson_t opts = BSON_INITIALIZER; { // Use too-big bucket name to trigger error: char *big_name = bson_malloc(256); memset(big_name, 'a', 255); big_name[255] = '\0'; BSON_APPEND_UTF8(&opts, "bucketName", big_name); bson_free(big_name); // Add a write concern to reproduce memory leak: mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_append(wc, &opts)); mongoc_write_concern_destroy(wc); } // Expect error creating bucket, but not a leak: { bson_error_t error; mongoc_gridfs_bucket_t *bucket = mongoc_gridfs_bucket_new(db, &opts, NULL, &error); ASSERT(!bucket); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "must have fewer"); mongoc_gridfs_bucket_destroy(bucket); } bson_destroy(&opts); mongoc_database_destroy(db); mongoc_client_destroy(client); } void test_gridfs_bucket_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddLive(suite, "/gridfs/create_bucket", test_create_bucket); TestSuite_AddLive(suite, "/gridfs/upload_and_download", test_upload_and_download); TestSuite_AddFull( suite, "/gridfs/upload_error [lock:live-server]", test_upload_error, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddFull(suite, "/gridfs/find_w_session [lock:live-server]", test_find_w_session, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/gridfs/find [lock:live-server]", test_find, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); TestSuite_AddLive(suite, "/gridfs/options", test_gridfs_bucket_opts); TestSuite_AddLive(suite, "/gridfs/bad_sizes", test_bad_sizes); TestSuite_AddLive(suite, "/gridfs/big_bucket_name", test_big_bucket_name); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-gridfs-file-page.c000066400000000000000000000117521511661753600257750ustar00rootroot00000000000000#include #include #include static void test_create(void) { uint8_t fox[] = "the quick brown fox jumped over the laxy dog"; uint32_t len = sizeof fox; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(fox, len, 4096); ASSERT(page); _mongoc_gridfs_file_page_destroy(page); } static void test_is_dirty(void) { uint8_t buf[] = "abcde"; uint32_t len = sizeof buf; int32_t r; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(buf, len, 10); ASSERT(page); r = _mongoc_gridfs_file_page_is_dirty(page); ASSERT(!r); r = _mongoc_gridfs_file_page_write(page, "foo", 3); ASSERT(r == 3); r = _mongoc_gridfs_file_page_is_dirty(page); ASSERT(r); _mongoc_gridfs_file_page_destroy(page); } static void test_get_data(void) { uint8_t buf[] = "abcde"; uint32_t len = sizeof buf; const uint8_t *ptr; int32_t r; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(buf, len, 10); ASSERT(page); ptr = _mongoc_gridfs_file_page_get_data(page); ASSERT(ptr == buf); r = _mongoc_gridfs_file_page_write(page, "foo", 3); ASSERT(r == 3); ptr = _mongoc_gridfs_file_page_get_data(page); ASSERT(ptr != buf); _mongoc_gridfs_file_page_destroy(page); } static void test_get_len(void) { uint8_t buf[] = "abcde"; uint32_t len = sizeof buf; int32_t r; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(buf, len, 10); ASSERT(page); r = _mongoc_gridfs_file_page_get_len(page); ASSERT(r == 6); _mongoc_gridfs_file_page_destroy(page); } static void test_read(void) { uint8_t fox[] = "the quick brown fox jumped over the laxy dog"; uint32_t len = sizeof fox; int32_t r; char buf[100]; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(fox, len, 4096); ASSERT(page); r = _mongoc_gridfs_file_page_read(page, buf, 3); ASSERT(r == 3); ASSERT(memcmp("the", buf, 3) == 0); ASSERT(page->offset == 3); r = _mongoc_gridfs_file_page_read(page, buf, 50); ASSERT(mlib_cmp(r, ==, len - 3)); ASSERT(memcmp(fox + 3, buf, len - 3) == 0); _mongoc_gridfs_file_page_destroy(page); } static void test_seek(void) { uint8_t fox[] = "the quick brown fox jumped over the laxy dog"; uint32_t len = sizeof fox; int32_t r; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(fox, len, 4096); ASSERT(page); r = _mongoc_gridfs_file_page_seek(page, 4); ASSERT(r); ASSERT(page->offset == 4); r = _mongoc_gridfs_file_page_tell(page); ASSERT(r == 4); _mongoc_gridfs_file_page_destroy(page); } static void test_write(void) { uint8_t buf[] = "abcde"; uint32_t len = sizeof buf; int32_t r; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(buf, len, 10); ASSERT(page); ASSERT(page->len == len); ASSERT(!page->buf); r = _mongoc_gridfs_file_page_write(page, "1", 1); ASSERT(r == 1); ASSERT(page->buf); ASSERT(memcmp(page->buf, "1bcde", len) == 0); ASSERT(page->offset == 1); ASSERT(page->len == len); r = _mongoc_gridfs_file_page_write(page, "234567", 6); ASSERT(r == 6); ASSERT(memcmp(page->buf, "1234567", 7) == 0); ASSERT(page->offset == 7); ASSERT(page->len == 7); r = _mongoc_gridfs_file_page_write(page, "8910", 4); ASSERT(r == 3); ASSERT(memcmp(page->buf, "1234567891", 10) == 0); ASSERT(page->offset == 10); ASSERT(page->len == 10); r = _mongoc_gridfs_file_page_write(page, "foo", 3); ASSERT(r == 0); _mongoc_gridfs_file_page_destroy(page); } static void test_memset0(void) { uint8_t buf[] = "wxyz"; uint32_t len = sizeof buf; mongoc_gridfs_file_page_t *page; page = _mongoc_gridfs_file_page_new(buf, len, 5); ASSERT(page); ASSERT(page->len == len); ASSERT(!page->buf); ASSERT_CMPUINT32(1, ==, _mongoc_gridfs_file_page_memset0(page, 1)); ASSERT(page->buf); ASSERT(memcmp(page->buf, "\0xyz", 4) == 0); ASSERT(page->offset == 1); ASSERT_CMPUINT32(4, ==, _mongoc_gridfs_file_page_memset0(page, 10)); ASSERT(page->buf); ASSERT(memcmp(page->buf, "\0\0\0\0\0", 5) == 0); ASSERT(page->offset == 5); /* file position is already at the end */ ASSERT_CMPUINT32(0, ==, _mongoc_gridfs_file_page_memset0(page, 10)); _mongoc_gridfs_file_page_destroy(page); } void test_gridfs_file_page_install(TestSuite *suite) { TestSuite_Add(suite, "/gridfs_old/File/Page/create", test_create); TestSuite_Add(suite, "/gridfs_old/File/Page/get_data", test_get_data); TestSuite_Add(suite, "/gridfs_old/File/Page/get_len", test_get_len); TestSuite_Add(suite, "/gridfs_old/File/Page/is_dirty", test_is_dirty); TestSuite_Add(suite, "/gridfs_old/File/Page/read", test_read); TestSuite_Add(suite, "/gridfs_old/File/Page/seek", test_seek); TestSuite_Add(suite, "/gridfs_old/File/Page/write", test_write); TestSuite_Add(suite, "/gridfs_old/File/Page/memset0", test_memset0); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-gridfs.c000066400000000000000000001471561511661753600241560ustar00rootroot00000000000000#include #define MONGOC_INSIDE #include #include #include #undef MONGOC_INSIDE #include #include #include #include #include #include #include #include static mongoc_gridfs_t * get_test_gridfs(mongoc_client_t *client, const char *name, bson_error_t *error) { char *gen; char n[48]; mongoc_database_t *db; gen = gen_collection_name("fs"); bson_snprintf(n, sizeof n, "%s_%s", gen, name); bson_free(gen); db = mongoc_client_get_database(client, "test"); mongoc_database_drop(db, NULL); mongoc_database_destroy(db); return mongoc_client_get_gridfs(client, "test", NULL, error); } bool drop_collections(mongoc_gridfs_t *gridfs, bson_error_t *error) { return (mongoc_collection_drop(mongoc_gridfs_get_files(gridfs), error) && mongoc_collection_drop(mongoc_gridfs_get_chunks(gridfs), error)); } static void _check_index(mongoc_collection_t *collection, const char *index_json) { mongoc_cursor_t *cursor; bson_error_t error = {0}; const bson_t *info; const char *index_name; bson_t index_key; int n; cursor = mongoc_collection_find_indexes_with_opts(collection, NULL); n = 0; while (mongoc_cursor_next(cursor, &info)) { index_name = bson_lookup_utf8(info, "name"); /* if this is NOT the "_id" index */ if (strcmp(index_name, "_id_")) { bson_lookup_doc(info, "key", &index_key); ASSERT_MATCH(&index_key, index_json); } n++; } ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); /* _id index plus the expected index */ ASSERT_CMPINT(n, ==, 2); mongoc_cursor_destroy(cursor); } static mongoc_gridfs_t * _get_gridfs(mock_server_t *server, mongoc_client_t *client, mongoc_query_flags_t flags) { future_t *future; bson_error_t error; request_t *request; mongoc_gridfs_t *gridfs; BSON_UNUSED(flags); /* gridfs ensures two indexes */ future = future_client_get_gridfs(client, "db", NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'listIndexes': 'fs.chunks'}")); reply_to_request_simple(request, "{ 'ok' : 0, 'errmsg' : 'ns does not exist: db.fs.chunks', 'code' : 26, " "'codeName' : 'NamespaceNotFound' }"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'createIndexes': 'fs.chunks'}")); reply_to_request_with_ok_and_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'listIndexes': 'fs.files'}")); reply_to_request_simple(request, "{ 'ok' : 0, 'errmsg' : 'ns does not exist: db.fs.files', 'code' : 26, " "'codeName' : 'NamespaceNotFound' }"); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'createIndexes': 'fs.files'}")); reply_to_request_with_ok_and_destroy(request); gridfs = future_get_mongoc_gridfs_ptr(future); ASSERT(gridfs); future_destroy(future); return gridfs; } static void _test_create(bson_t *create_index_cmd) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; bson_error_t error; mongoc_collection_t *files; mongoc_collection_t *chunks; client = test_framework_new_default_client(); ASSERT(client); files = mongoc_client_get_collection(client, "test", "foo.files"); chunks = mongoc_client_get_collection(client, "test", "foo.chunks"); mongoc_collection_drop(files, NULL); mongoc_collection_drop(chunks, NULL); if (create_index_cmd) { bool r; mongoc_database_t *db; db = mongoc_client_get_database(client, "test"); r = mongoc_database_write_command_with_opts(db, create_index_cmd, NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_database_destroy(db); } ASSERT_OR_PRINT((gridfs = mongoc_client_get_gridfs(client, "test", "foo", &error)), error); file = mongoc_gridfs_create_file(gridfs, NULL); _check_index(files, "{'filename': 1, 'uploadDate': 1}"); _check_index(chunks, "{'files_id': 1, 'n': 1}"); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_collection_destroy(chunks); mongoc_collection_destroy(files); mongoc_client_destroy(client); } static void test_create(void) { _test_create(NULL); /* Test files index with float and same options */ _test_create(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'filename': 1.0, 'uploadDate': 1}, " "'name': 'filename_1_uploadDate_1'}]}", "foo.files")); /* Files index with float and different options */ _test_create(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'filename': 1.0, " "'uploadDate': 1}, 'name': 'different_name'}]}", "foo.files")); /* Chunks index with float and same options */ _test_create(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'files_id': 1.0, 'n': 1}, " "'name': 'files_id_1_n_1', 'unique': true}]}", "foo.chunks")); /* Chunks index with float and different options */ _test_create(tmp_bson("{'createIndexes': '%s'," " 'indexes': [{'key': {'files_id': 1.0, 'n': 1}, " "'name': 'different_name', 'unique': true}]}", "foo.chunks")); } static void test_remove(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_gridfs_file_opt_t opts = {0}; mongoc_client_t *client; bson_error_t error; char name[32]; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT(gridfs = mongoc_client_get_gridfs(client, "test", "foo", &error), error); mongoc_gridfs_drop(gridfs, &error); bson_snprintf(name, sizeof name, "test-remove.%d", rand()); opts.filename = name; file = mongoc_gridfs_create_file(gridfs, &opts); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); ASSERT_OR_PRINT(mongoc_gridfs_file_remove(file, &error), error); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_by_filename(gridfs, name, &error); ASSERT(!file); /* ensure "error" is cleared if we successfully find no file */ ASSERT_CMPINT(error.domain, ==, 0); ASSERT_CMPINT(error.code, ==, 0); ASSERT_CMPSTR(error.message, ""); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void prep_files(mongoc_gridfs_t *gridfs) { mongoc_gridfs_file_t *file; mongoc_gridfs_file_opt_t opt = {0}; char buf[100]; int i = 0; for (i = 0; i < 3; i++) { bson_snprintf(buf, sizeof buf, "file.%d", i); opt.filename = buf; file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); } } static void test_list(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; bson_error_t error; mongoc_gridfs_file_list_t *list; bson_t query, opts, child; char buf[100]; int i = 0; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "list", &error), error); prep_files(gridfs); bson_init(&query); bson_init(&opts); bson_append_document_begin(&opts, "sort", -1, &child); bson_append_int32(&child, "filename", -1, 1); bson_append_document_end(&opts, &child); list = mongoc_gridfs_find_with_opts(gridfs, &query, NULL); bson_destroy(&opts); bson_destroy(&query); i = 0; while ((file = mongoc_gridfs_file_list_next(list))) { bson_snprintf(buf, sizeof buf, "file.%d", i++); ASSERT_CMPINT(strcmp(mongoc_gridfs_file_get_filename(file), buf), ==, 0); mongoc_gridfs_file_destroy(file); } ASSERT_CMPINT(i, ==, 3); mongoc_gridfs_file_list_destroy(list); bson_init(&query); bson_append_utf8(&query, "filename", -1, "file.1", -1); ASSERT_OR_PRINT(file = mongoc_gridfs_find_one_with_opts(gridfs, &query, NULL, &error), error); bson_destroy(&query); ASSERT_CMPINT(strcmp(mongoc_gridfs_file_get_filename(file), "file.1"), ==, 0); mongoc_gridfs_file_destroy(file); ASSERT_OR_PRINT(file = mongoc_gridfs_find_one_by_filename(gridfs, "file.1", &error), error); ASSERT_CMPINT(strcmp(mongoc_gridfs_file_get_filename(file), "file.1"), ==, 0); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_find_with_opts(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; bson_error_t error; mongoc_gridfs_file_list_t *list; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); gridfs = get_test_gridfs(client, "test_find_with_opts", &error); ASSERT_OR_PRINT(gridfs, error); prep_files(gridfs); list = mongoc_gridfs_find_with_opts( gridfs, tmp_bson("{'filename': {'$ne': 'file.1'}}"), tmp_bson("{'sort': {'filename': -1}}")); file = mongoc_gridfs_file_list_next(list); ASSERT(file); ASSERT_CMPSTR("file.2", mongoc_gridfs_file_get_filename(file)); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_file_list_next(list); ASSERT(file); ASSERT_CMPSTR("file.0", mongoc_gridfs_file_get_filename(file)); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_file_list_next(list); ASSERT(!file); /* done */ ASSERT(!mongoc_gridfs_file_list_error(list, &error)); mongoc_gridfs_file_list_destroy(list); file = mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson(NULL), tmp_bson("{'sort': {'filename': -1}}"), &error); ASSERT_OR_PRINT(file, error); /* file.2 is first, according to sort order */ ASSERT_CMPSTR("file.2", mongoc_gridfs_file_get_filename(file)); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson("{'x': {'$bad_operator': 1}}"), NULL, &error); ASSERT(!file); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_SERVER); /* ensure "error" is cleared if we successfully find no file */ file = mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson("{'x': 'doesntexist'}"), NULL, &error); ASSERT(!file); ASSERT_CMPINT(error.domain, ==, 0); ASSERT_CMPINT(error.code, ==, 0); ASSERT_CMPSTR(error.message, ""); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } /* mongoc_gridfs_find_one_with_opts uses limit 1, no matter what's in "opts" */ static void test_find_one_with_opts_limit(void) { mock_server_t *server; mongoc_client_t *client; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; bson_error_t error; future_t *future; request_t *request; server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_error_api(client, 2); gridfs = _get_gridfs(server, client, MONGOC_QUERY_SECONDARY_OK); future = future_gridfs_find_one_with_opts(gridfs, tmp_bson("{}"), NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'find': 'fs.files', 'filter': {}, 'limit': 1}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.fs.files'," " 'firstBatch': [{'_id': 1, 'length': 1, 'chunkSize': 1}]}}")); file = future_get_mongoc_gridfs_file_ptr(future); ASSERT(file); mongoc_gridfs_file_destroy(file); future_destroy(future); request_destroy(request); future = future_gridfs_find_one_with_opts(gridfs, tmp_bson("{}"), tmp_bson("{'limit': 2}"), &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'find': 'fs.files', 'filter': {}, 'limit': 1}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.fs.files'," " 'firstBatch': [{'_id': 1, 'length': 1, 'chunkSize': 1}]}}")); file = future_get_mongoc_gridfs_file_ptr(future); ASSERT(file); mongoc_gridfs_file_destroy(file); future_destroy(future); request_destroy(request); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_properties(void) { mongoc_client_t *client; mongoc_gridfs_t *gridfs; bson_error_t error; bson_t *doc_in; mongoc_gridfs_file_t *file; mongoc_gridfs_file_list_t *list; bson_t query = BSON_INITIALIZER; const bson_value_t *file_id; const char *alias0, *alias1; client = test_framework_new_default_client(); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "list", &error), error); mongoc_gridfs_drop(gridfs, &error); /* the C Driver sets _id to an ObjectId, but other drivers can do anything */ doc_in = BCON_NEW("_id", BCON_INT32(1), "md5", BCON_UTF8("md5"), "filename", BCON_UTF8("filename"), "contentType", BCON_UTF8("content_type"), "aliases", "[", BCON_UTF8("alias0"), BCON_UTF8("alias1"), "]", "metadata", "{", "key", BCON_UTF8("value"), "}", "chunkSize", BCON_INT32(100)); ASSERT(mongoc_collection_insert_one(mongoc_gridfs_get_files(gridfs), doc_in, NULL, NULL, NULL)); list = mongoc_gridfs_find_with_opts(gridfs, &query, NULL); file = mongoc_gridfs_file_list_next(list); file_id = mongoc_gridfs_file_get_id(file); ASSERT(file_id); ASSERT_CMPINT(BSON_TYPE_INT32, ==, file_id->value_type); ASSERT_CMPINT(1, ==, file_id->value.v_int32); ASSERT_CMPSTR("md5", mongoc_gridfs_file_get_md5(file)); ASSERT_CMPSTR("filename", mongoc_gridfs_file_get_filename(file)); ASSERT_CMPSTR("content_type", mongoc_gridfs_file_get_content_type(file)); ASSERT( BCON_EXTRACT((bson_t *)mongoc_gridfs_file_get_aliases(file), "0", BCONE_UTF8(alias0), "1", BCONE_UTF8(alias1))); ASSERT_CMPSTR("alias0", alias0); ASSERT_CMPSTR("alias1", alias1); drop_collections(gridfs, &error); mongoc_gridfs_file_destroy(file); mongoc_gridfs_file_list_destroy(list); bson_destroy(doc_in); bson_destroy(&query); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_create_from_stream(void) { int64_t start; int64_t now; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; bson_t *filter; mongoc_gridfs_file_t *file2; mongoc_stream_t *stream; mongoc_client_t *client; bson_error_t error; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT((gridfs = get_test_gridfs(client, "from_stream", &error)), error); mongoc_gridfs_drop(gridfs, &error); start = _mongoc_get_real_time_ms(); stream = mongoc_stream_file_new_for_path(BINARY_DIR "/gridfs.dat", O_RDONLY, 0); ASSERT_OR_PRINT_ERRNO(stream, errno); ASSERT(stream); file = mongoc_gridfs_create_file_from_stream(gridfs, stream, NULL); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); now = _mongoc_get_real_time_ms(); filter = tmp_bson(NULL); BSON_APPEND_VALUE(filter, "_id", mongoc_gridfs_file_get_id(file)); file2 = mongoc_gridfs_find_one_with_opts(gridfs, filter, NULL, &error); ASSERT_OR_PRINT(file2, error); ASSERT_CMPINT64(start, <=, mongoc_gridfs_file_get_upload_date(file2)); ASSERT_CMPINT64(now, >=, mongoc_gridfs_file_get_upload_date(file2)); mongoc_gridfs_file_destroy(file2); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_seek(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_stream_t *stream; mongoc_client_t *client; bson_error_t error; client = test_framework_new_default_client(); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "seek", &error), error); mongoc_gridfs_drop(gridfs, &error); stream = mongoc_stream_file_new_for_path(BINARY_DIR "/gridfs-large.dat", O_RDONLY, 0); file = mongoc_gridfs_create_file_from_stream(gridfs, stream, NULL); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, file->chunk_size + 1, SEEK_CUR), ==, 0); ASSERT_CMPINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)(file->chunk_size + 1)); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_END), ==, 0); ASSERT_CMPINT64(mongoc_gridfs_file_tell(file), ==, mongoc_gridfs_file_get_length(file)); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_read(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_stream_t *stream; mongoc_client_t *client; bson_error_t error; ssize_t r; char buf[10], buf2[10]; mongoc_iovec_t iov[2]; int previous_errno; ssize_t twenty = 20L; iov[0].iov_base = buf; iov[0].iov_len = 10; iov[1].iov_base = buf2; iov[1].iov_len = 10; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "read", &error), error); mongoc_gridfs_drop(gridfs, &error); stream = mongoc_stream_file_new_for_path(BINARY_DIR "/gridfs-large.dat", O_RDONLY, 0); file = mongoc_gridfs_create_file_from_stream(gridfs, stream, NULL); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); r = mongoc_gridfs_file_readv(file, iov, 2, 20, 0); ASSERT_CMPSSIZE_T(r, ==, twenty); ASSERT_MEMCMP(iov[0].iov_base, "Bacon ipsu", 10); ASSERT_MEMCMP(iov[1].iov_base, "m dolor si", 10); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 1, SEEK_SET), ==, 0); r = mongoc_gridfs_file_readv(file, iov, 2, 20, 0); ASSERT_CMPSSIZE_T(r, ==, twenty); ASSERT_MEMCMP(iov[0].iov_base, "acon ipsum", 10); ASSERT_MEMCMP(iov[1].iov_base, " dolor sit", 10); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, file->chunk_size - 1, SEEK_SET), ==, 0); r = mongoc_gridfs_file_readv(file, iov, 2, 20, 0); ASSERT_CMPSSIZE_T(r, ==, twenty); ASSERT_CMPINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)(file->chunk_size + 19)); ASSERT_MEMCMP(iov[0].iov_base, "turducken ", 10); ASSERT_MEMCMP(iov[1].iov_base, "spare ribs", 10); BSON_ASSERT(mongoc_gridfs_file_seek(file, 20, SEEK_END) == 0); previous_errno = errno; r = mongoc_gridfs_file_readv(file, iov, 2, 20, 0); BSON_ASSERT(errno == previous_errno); BSON_ASSERT(r == 0); BSON_ASSERT(mlib_cmp(mongoc_gridfs_file_tell(file), ==, file->length + 20)); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void _check_chunk_count(mongoc_gridfs_t *gridfs, int64_t len, int64_t chunk_size) { int64_t expected_chunks; int64_t cnt; bson_error_t error; /* division, rounding up */ expected_chunks = (len + chunk_size - 1) / chunk_size; cnt = mongoc_collection_count_documents(mongoc_gridfs_get_chunks(gridfs), tmp_bson(NULL), NULL, NULL, NULL, &error); ASSERT_CMPINT64(expected_chunks, ==, cnt); } static void _test_write(bool at_boundary) { ssize_t seek_len = at_boundary ? 5 : 6; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; bson_error_t error; ssize_t r; char buf[] = "foo bar"; char buf2[] = " baz"; char buf3[1000]; char expected[1000] = {0}; mongoc_gridfs_file_opt_t opt = {0}; mongoc_iovec_t iov[2]; mongoc_iovec_t riov; ssize_t len = sizeof buf + sizeof buf2 - 2; iov[0].iov_base = buf; iov[0].iov_len = sizeof(buf) - 1; iov[1].iov_base = buf2; iov[1].iov_len = sizeof(buf2) - 1; riov.iov_base = buf3; riov.iov_len = sizeof(buf3); opt.chunk_size = 2; client = test_framework_new_default_client(); ASSERT(client); gridfs = get_test_gridfs(client, "write", &error); ASSERT_OR_PRINT(gridfs, error); mongoc_gridfs_drop(gridfs, &error); file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); /* Test a write across many pages */ r = mongoc_gridfs_file_writev(file, iov, 2, 0); ASSERT_CMPSSIZE_T(r, ==, len); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); r = mongoc_gridfs_file_readv(file, &riov, 1, len, 0); ASSERT_CMPSSIZE_T(r, ==, len); ASSERT_CMPINT(memcmp(buf3, "foo bar baz", len), ==, 0); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, file->chunk_size, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)(file->chunk_size)); r = mongoc_gridfs_file_writev(file, iov + 1, 1, 0); ASSERT_CMPSSIZE_T(r, ==, iov[1].iov_len); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); r = mongoc_gridfs_file_readv(file, &riov, 1, len, 0); ASSERT_CMPSSIZE_T(r, ==, len); ASSERT_CMPINT(memcmp(buf3, "fo bazr baz", len), ==, 0); _check_chunk_count(gridfs, len, file->chunk_size); /* Test writing beyond the end of the file */ BSON_ASSERT(mongoc_gridfs_file_seek(file, seek_len, SEEK_END) == 0); BSON_ASSERT(mlib_cmp(mongoc_gridfs_file_tell(file), ==, file->length + seek_len)); r = mongoc_gridfs_file_writev(file, iov, 2, 0); BSON_ASSERT(r == len); BSON_ASSERT(mlib_cmp(mongoc_gridfs_file_tell(file), ==, 2 * len + seek_len)); BSON_ASSERT(file->length == 2 * len + seek_len); BSON_ASSERT(mongoc_gridfs_file_save(file)); _check_chunk_count(gridfs, 2 * len + seek_len, file->chunk_size); BSON_ASSERT(mongoc_gridfs_file_seek(file, 0, SEEK_SET) == 0); BSON_ASSERT(mongoc_gridfs_file_tell(file) == 0); r = mongoc_gridfs_file_readv(file, &riov, 1, 2 * len + seek_len, 0); BSON_ASSERT(r == 2 * len + seek_len); /* expect file to be like "fo bazr baz\0\0\0\0\0\0foo bar baz" */ bson_snprintf(expected, strlen("fo bazr baz") + 1, "fo bazr baz"); bson_snprintf(expected + strlen("fo bazr baz") + seek_len, strlen("foo bar baz") + 1, "foo bar baz"); BSON_ASSERT(memcmp(buf3, expected, (size_t)(2 * len + seek_len)) == 0); BSON_ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_write(void) { _test_write(false /* at_boundary */); } /* Test a write starting and ending exactly on chunk boundaries */ static void test_write_at_boundary(void) { _test_write(true /* at_boundary */); } static void test_write_past_end(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; bson_error_t error; ssize_t r; char buf[] = "foo"; char read_buf[2000]; mongoc_gridfs_file_opt_t opt = {0}; mongoc_iovec_t iov[1]; mongoc_iovec_t riov; const size_t len = sizeof(buf) - 1u; const uint64_t delta = 35u; const uint32_t chunk_sz = 10u; /* division, rounding up */ const uint64_t expected_chunks = ((delta + len) + (chunk_sz - 1u)) / chunk_sz; int64_t cnt; iov[0].iov_base = buf; iov[0].iov_len = sizeof(buf) - 1; riov.iov_base = read_buf; riov.iov_len = sizeof(read_buf); opt.chunk_size = chunk_sz; opt.filename = "foo"; client = test_framework_new_default_client(); ASSERT(client); gridfs = get_test_gridfs(client, "write_past_end", &error); ASSERT_OR_PRINT(gridfs, error); file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); r = mongoc_gridfs_file_writev(file, iov, 1, 0); ASSERT(mlib_in_range(size_t, r)); ASSERT_CMPSIZE_T((size_t)r, ==, len); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, (int64_t)delta, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, delta); r = mongoc_gridfs_file_writev(file, iov, 1, 0); ASSERT(mlib_in_range(size_t, r)); ASSERT_CMPSIZE_T((size_t)r, ==, len); mongoc_gridfs_file_save(file); cnt = mongoc_collection_count_documents(mongoc_gridfs_get_chunks(gridfs), tmp_bson(NULL), NULL, NULL, NULL, &error); ASSERT_OR_PRINT(cnt != -1, error); ASSERT(mlib_cmp(expected_chunks, ==, cnt)); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson(NULL), NULL, &error); ASSERT_OR_PRINT(file, error); BSON_ASSERT(mlib_in_range(size_t, delta + len)); const size_t total_bytes = (size_t)(delta + len); r = mongoc_gridfs_file_readv(file, &riov, 1, total_bytes, 0); ASSERT(mlib_in_range(size_t, r)); ASSERT_CMPSIZE_T((size_t)r, ==, total_bytes); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_empty(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_stream_t *stream; mongoc_client_t *client; bson_error_t error; ssize_t r; char buf[2] = {'h', 'i'}; mongoc_iovec_t iov[1]; ssize_t two = 2L; iov[0].iov_base = buf; iov[0].iov_len = 2; client = test_framework_new_default_client(); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "empty", &error), error); stream = mongoc_stream_file_new_for_path(BINARY_DIR "/empty.dat", O_RDONLY, 0); ASSERT_OR_PRINT_ERRNO(stream, errno); file = mongoc_gridfs_create_file_from_stream(gridfs, stream, NULL); ASSERT(file); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_CUR), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_END), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); r = mongoc_gridfs_file_writev(file, iov, 1, 0); ASSERT_CMPSSIZE_T(r, ==, two); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file), ==, (uint64_t)0); r = mongoc_gridfs_file_readv(file, iov, 1, 2, 0); ASSERT_CMPSSIZE_T(r, ==, two); ASSERT_CMPINT(strncmp(buf, "hi", 2), ==, 0); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_stream(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_client_t *client; mongoc_stream_t *stream; mongoc_stream_t *in_stream; bson_error_t error; char buf[4096]; mongoc_iovec_t iov; iov.iov_base = buf; iov.iov_len = sizeof buf; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "fs", &error), error); mongoc_gridfs_drop(gridfs, &error); in_stream = mongoc_stream_file_new_for_path(BINARY_DIR "/gridfs.dat", O_RDONLY, 0); ASSERT_OR_PRINT_ERRNO(in_stream, errno); file = mongoc_gridfs_create_file_from_stream(gridfs, in_stream, NULL); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); stream = mongoc_stream_gridfs_new(file); ASSERT(mlib_in_range(size_t, file->length)); const ssize_t r = mongoc_stream_readv(stream, &iov, 1, (size_t)file->length, 0); ASSERT_CMPINT64((int64_t)r, ==, file->length); /* cleanup */ mongoc_stream_destroy(stream); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } #define ASSERT_TELL(file_, position_) ASSERT_CMPUINT64(mongoc_gridfs_file_tell(file_), ==, position_) static void test_long_seek(void *ctx) { const uint64_t four_mb = 4 * 1024 * 1024; mongoc_client_t *client; bson_error_t error; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; ssize_t r; mongoc_gridfs_file_opt_t opt = {0, "filename"}; mongoc_iovec_t iov; char buf[16 * 1024]; /* nothing special about 16k, just a buffer */ const ssize_t buflen = sizeof(buf); ssize_t written; int64_t cursor_id; int i; BSON_UNUSED(ctx); iov.iov_base = buf; iov.iov_len = sizeof(buf); memset(iov.iov_base, 0, iov.iov_len); client = test_framework_new_default_client(); gridfs = get_test_gridfs(client, "long_seek", &error); ASSERT_OR_PRINT(gridfs, error); file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); /* Write 20MB, enough to ensure we need many batches, below */ written = 0; while (written < 20 * 1024 * 1024) { r = mongoc_gridfs_file_writev(file, &iov, 1, 0); ASSERT_CMPSSIZE_T(r, ==, buflen); written += r; } /* new file handle */ mongoc_gridfs_file_save(file); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson("{'filename': 'filename'}"), NULL, &error); ASSERT_OR_PRINT(file, error); /* read the start of the file */ r = mongoc_gridfs_file_readv(file, &iov, 1, sizeof(buf), 0); ASSERT_CMPSSIZE_T(r, ==, buflen); ASSERT_TELL(file, (uint64_t)buflen); cursor_id = mongoc_cursor_get_id(file->cursor); ASSERT_CMPINT64((int64_t)0, !=, cursor_id); /* seek forward into next batch and read, gridfs advances cursor */ i = mongoc_gridfs_file_seek(file, four_mb, SEEK_CUR); ASSERT_CMPINT(i, ==, 0); r = mongoc_gridfs_file_readv(file, &iov, 1, sizeof(buf), 0); ASSERT_CMPSSIZE_T(r, ==, buflen); ASSERT_TELL(file, four_mb + 2 * buflen); /* same as the cursor we started with */ ASSERT_CMPINT64((int64_t)0, !=, mongoc_cursor_get_id(file->cursor)); ASSERT_CMPINT64(cursor_id, ==, mongoc_cursor_get_id(file->cursor)); /* seek more than a batch forward, gridfs discards cursor */ i = mongoc_gridfs_file_seek(file, 3 * four_mb, SEEK_CUR); ASSERT_CMPINT(i, ==, 0); ASSERT_TELL(file, 4 * four_mb + 2 * buflen); r = mongoc_gridfs_file_readv(file, &iov, 1, sizeof(buf), 0); ASSERT_CMPSSIZE_T(r, ==, buflen); ASSERT_TELL(file, 4 * four_mb + 3 * buflen); /* new cursor, not the one we started with */ ASSERT_CMPINT64(cursor_id, !=, mongoc_cursor_get_id(file->cursor)); mongoc_gridfs_file_destroy(file); ASSERT_OR_PRINT(drop_collections(gridfs, &error), error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_remove_by_filename(void) { mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_gridfs_file_opt_t opt = {0}; mongoc_client_t *client; bson_error_t error; client = test_framework_new_default_client(); ASSERT(client); ASSERT_OR_PRINT(gridfs = get_test_gridfs(client, "fs_remove_by_filename", &error), error); mongoc_gridfs_drop(gridfs, &error); opt.filename = "foo_file_1.txt"; file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); opt.filename = "foo_file_2.txt"; file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); ASSERT(mongoc_gridfs_file_save(file)); ASSERT_OR_PRINT(mongoc_gridfs_remove_by_filename(gridfs, "foo_file_1.txt", &error), error); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_by_filename(gridfs, "foo_file_1.txt", &error); ASSERT(!file); file = mongoc_gridfs_find_one_by_filename(gridfs, "foo_file_2.txt", &error); ASSERT(file); mongoc_gridfs_file_destroy(file); drop_collections(gridfs, &error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_missing_chunk(void *ctx) { mongoc_client_t *client; bson_error_t error; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; mongoc_collection_t *chunks; ssize_t r; mongoc_gridfs_file_opt_t opt = {0, "filename"}; mongoc_iovec_t iov; char buf[16 * 1024]; /* nothing special about 16k, just a buffer */ const ssize_t buflen = sizeof(buf); ssize_t written; bool ret; BSON_UNUSED(ctx); iov.iov_base = buf; iov.iov_len = sizeof(buf); memset(iov.iov_base, 0, iov.iov_len); client = test_framework_new_default_client(); gridfs = get_test_gridfs(client, "long_seek", &error); ASSERT_OR_PRINT(gridfs, error); mongoc_gridfs_drop(gridfs, NULL); file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); /* 700k, enough to need three 255k chunks */ written = 0; while (written < 700 * 1024) { r = mongoc_gridfs_file_writev(file, &iov, 1, 0); ASSERT_CMPSSIZE_T(r, ==, buflen); written += r; } /* new file handle */ mongoc_gridfs_file_save(file); mongoc_gridfs_file_destroy(file); file = mongoc_gridfs_find_one_by_filename(gridfs, "filename", &error); ASSERT_OR_PRINT(file, error); /* chunks have n=0, 1, 2; remove the middle one */ chunks = mongoc_gridfs_get_chunks(gridfs); ret = mongoc_collection_delete_many(chunks, tmp_bson("{'n': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); /* read the file */ for (;;) { r = mongoc_gridfs_file_readv(file, &iov, 1, sizeof(buf), 0); if (r > 0) { ASSERT_CMPSSIZE_T(r, ==, buflen); } else { ASSERT(mongoc_gridfs_file_error(file, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "missing chunk number 1"); break; } } mongoc_gridfs_file_destroy(file); ASSERT_OR_PRINT(drop_collections(gridfs, &error), error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_oversize(void) { mongoc_client_t *client; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; ssize_t r; mongoc_iovec_t iov; char buf[2]; bson_error_t error; bool ret; client = test_framework_new_default_client(); gridfs = get_test_gridfs(client, "test_oversize", &error); ASSERT_OR_PRINT(gridfs, error); /* 2-byte chunk, 'aa', but chunkSize and file size are 1 byte */ ret = mongoc_collection_insert_one(gridfs->chunks, tmp_bson("{'files_id': 1, 'n': 0," " 'data': {'$binary': {'subType': '0', 'base64': 'YWE='}}}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_insert_one(gridfs->files, tmp_bson("{'_id': 1, 'length': 1, 'chunkSize': 1," " 'filename': 'filename'}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); file = mongoc_gridfs_find_one_by_filename(gridfs, "filename", &error); ASSERT_OR_PRINT(file, error); /* read the file */ iov.iov_base = (void *)&buf; iov.iov_len = 1; r = mongoc_gridfs_file_readv(file, &iov, 1, sizeof(buf), 0); ASSERT_CMPSSIZE_T(r, ==, (ssize_t)-1); BSON_ASSERT(mongoc_gridfs_file_error(file, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "corrupt chunk number 0: greater than chunk size"); mongoc_gridfs_file_destroy(file); ASSERT_OR_PRINT(mongoc_gridfs_drop(gridfs, &error), error); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static void test_missing_file(void) { mongoc_client_t *client; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; bson_error_t error; char buf[] = "contents contents"; mongoc_iovec_t iov; iov.iov_base = buf; iov.iov_len = sizeof buf; client = test_framework_new_default_client(); gridfs = mongoc_client_get_gridfs(client, "test_missing_file", NULL, &error); ASSERT_OR_PRINT(gridfs, error); file = mongoc_gridfs_create_file(gridfs, NULL); ASSERT_CMPSSIZE_T(mongoc_gridfs_file_writev(file, &iov, 1, 0), ==, (ssize_t)sizeof buf); ASSERT_CMPINT(mongoc_gridfs_file_seek(file, 0, SEEK_SET), ==, 0); BSON_ASSERT(mongoc_gridfs_file_save(file)); /* remove the file */ BSON_ASSERT(mongoc_gridfs_file_remove(file, &error)); /* readv fails */ ASSERT_CMPSSIZE_T(mongoc_gridfs_file_readv(file, &iov, 1, sizeof buf, 0), ==, (ssize_t)-1); BSON_ASSERT(mongoc_gridfs_file_error(file, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "missing chunk number 0"); memset(&error, 0, sizeof error); /* writev fails */ ASSERT_CMPSSIZE_T(mongoc_gridfs_file_writev(file, &iov, 1, 0), ==, (ssize_t)-1); BSON_ASSERT(mongoc_gridfs_file_error(file, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CHUNK_MISSING, "missing chunk number 0"); mongoc_gridfs_file_destroy(file); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } /* check that user can specify _id of any type for file */ static void test_set_id(void) { mongoc_gridfs_t *gridfs; mongoc_client_t *client; bson_error_t error; bson_value_t id; bson_t *query; char *dbname; mongoc_gridfs_file_t *file; mongoc_gridfs_file_t *result; mongoc_gridfs_file_opt_t opt = {0}; /* create new client and grab gridfs handle */ client = test_framework_new_default_client(); ASSERT(client); dbname = gen_collection_name("test_set_id"); gridfs = mongoc_client_get_gridfs(client, dbname, "fs", &error); bson_free(dbname); ASSERT_OR_PRINT(gridfs, error); /* create bson */ id.value_type = BSON_TYPE_INT32; id.value.v_int32 = 1; /* query for finding file */ query = tmp_bson("{'_id': 1}"); /* create new file */ opt.filename = "test"; file = mongoc_gridfs_create_file(gridfs, &opt); ASSERT(file); /* if we find a file with new id, then file_set_id worked */ ASSERT_OR_PRINT(mongoc_gridfs_file_set_id(file, &id, &error), error); ASSERT(mongoc_gridfs_file_save(file)); result = mongoc_gridfs_find_one_with_opts(gridfs, query, NULL, &error); ASSERT_OR_PRINT(result, error); mongoc_gridfs_file_destroy(result); mongoc_gridfs_file_destroy(file); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } /* check gridfs inherits read / write concern, read prefs from the client */ static void test_inherit_client_config(void) { mock_server_t *server; mongoc_client_t *client; mongoc_write_concern_t *write_concern; mongoc_read_concern_t *read_concern; mongoc_read_prefs_t *secondary_pref; future_t *future; bson_error_t error; request_t *request; mongoc_gridfs_t *gridfs; mongoc_gridfs_file_t *file; /* mock mongos: easiest way to test that read preference is configured */ server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); /* configure read / write concern and read prefs on client */ client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, 2); mongoc_client_set_write_concern(client, write_concern); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_client_set_read_concern(client, read_concern); secondary_pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_client_set_read_prefs(client, secondary_pref); gridfs = _get_gridfs(server, client, MONGOC_QUERY_NONE); /* test read prefs and read concern */ future = future_gridfs_find_one_with_opts(gridfs, tmp_bson("{}"), NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " 'find': 'fs.files'," " 'readConcern': {'level': 'majority'}," " '$readPreference': {'mode': 'secondary'}}")); reply_to_request_simple(request, "{'ok': 1, 'cursor': {'ns': 'fs.files', 'firstBatch': [{'_id': 1}]}}"); file = future_get_mongoc_gridfs_file_ptr(future); ASSERT(file); request_destroy(request); future_destroy(future); /* test write concern */ future = future_gridfs_file_remove(file, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'delete': 'fs.files', 'writeConcern': {'w': 2}}"), tmp_bson("{'q': {'_id': 1}, 'limit': 1}")); reply_to_request_with_ok_and_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'delete': 'fs.chunks', 'writeConcern': {'w': 2}}"), tmp_bson("{'q': {'files_id': 1}, 'limit': 0}")); reply_to_request_with_ok_and_destroy(request); ASSERT(future_get_bool(future)); future_destroy(future); mongoc_gridfs_file_destroy(file); mongoc_gridfs_destroy(gridfs); mongoc_write_concern_destroy(write_concern); mongoc_read_concern_destroy(read_concern); mongoc_read_prefs_destroy(secondary_pref); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_find_one_empty(void) { mongoc_gridfs_t *gridfs; mongoc_client_t *client; bson_error_t error = {1, 2, "hello", 0}; client = test_framework_new_default_client(); gridfs = get_test_gridfs(client, "list", &error); ASSERT_OR_PRINT(gridfs, error); ASSERT(!mongoc_gridfs_find_one_with_opts(gridfs, tmp_bson("{'x': 'doesntexist'}"), NULL, &error)); /* ensure "error" is cleared if we successfully find no file */ ASSERT_CMPUINT32(error.domain, ==, 0); ASSERT_CMPUINT32(error.code, ==, 0); ASSERT_CMPSTR(error.message, ""); ASSERT_CMPUINT(error.reserved, ==, 0); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); } static bool responder(request_t *request, void *data) { BSON_UNUSED(data); if (!strcasecmp(request->command_name, "createIndexes")) { reply_to_request_with_ok_and_destroy(request); return true; } if (!strcasecmp(request->command_name, "listIndexes")) { reply_to_request_simple(request, "{ 'ok' : 0, 'errmsg' : 'ns does not exist: " "db.fs.chunks', 'code' : 26, " "'codeName' : 'NamespaceNotFound' }"); request_destroy(request); return true; } return false; } static void test_write_failure(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_gridfs_t *gridfs; mongoc_stream_t *stream; mongoc_gridfs_file_opt_t opt = {0}; mongoc_gridfs_file_t *file; bson_error_t error; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_autoresponds(server, responder, NULL, NULL); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "socketTimeoutMS", 100); client = test_framework_client_new_from_uri(uri, NULL); gridfs = mongoc_client_get_gridfs(client, "db", "fs", &error); ASSERT_OR_PRINT(gridfs, error); stream = mongoc_stream_file_new_for_path(BINARY_DIR "/gridfs.dat", O_RDONLY, 0); /* times out writing first chunk */ opt.chunk_size = 1; capture_logs(true); file = mongoc_gridfs_create_file_from_stream(gridfs, stream, &opt); BSON_ASSERT(!file); ASSERT_CAPTURED_LOG( "mongoc_gridfs_create_file_from_stream", MONGOC_LOG_LEVEL_ERROR, "Failed to send \"update\" command"); mongoc_stream_destroy(stream); mongoc_gridfs_destroy(gridfs); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_reading_multiple_chunks(void) { mongoc_client_t *client = test_framework_new_default_client(); bson_error_t error; // Test reading a file spanning two chunks. { mongoc_gridfs_t *gridfs = mongoc_client_get_gridfs(client, "test_reading_multiple_chunks", NULL, &error); ASSERT_OR_PRINT(gridfs, error); // Drop prior test data. ASSERT_OR_PRINT(mongoc_gridfs_drop(gridfs, &error), error); // Write a file spanning two chunks. { mongoc_gridfs_file_opt_t opts = {.chunk_size = 4, .filename = "test_file"}; mongoc_iovec_t iov = {.iov_base = (void *)"foobar", .iov_len = 7}; mongoc_gridfs_file_t *file = mongoc_gridfs_create_file(gridfs, &opts); // First chunk is 4 bytes: "foob", second chunk is 3 bytes: "ar\0" ASSERT_CMPSSIZE_T(mongoc_gridfs_file_writev(file, &iov, 1, 0), ==, 7); BSON_ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); } // Read the entire file. { mcommon_string_append_t str; mcommon_string_new_as_append(&str); uint8_t buf[7] = {0}; mongoc_iovec_t iov = {.iov_base = (void *)buf, .iov_len = sizeof(buf)}; mongoc_gridfs_file_t *file = mongoc_gridfs_find_one_by_filename(gridfs, "test_file", &error); ASSERT_OR_PRINT(file, error); // First read gets first chunk. { ssize_t got = mongoc_gridfs_file_readv(file, &iov, 1 /* iovcnt */, 1 /* min_bytes */, 0 /* timeout_msec */); ASSERT_CMPSSIZE_T(got, >=, 0); ASSERT(mlib_in_range(int, got)); mcommon_string_append_printf(&str, "%.*s", (int)got, (char *)buf); ASSERT_CMPSSIZE_T(got, ==, 4); } // Second read gets second chunk. { ssize_t got = mongoc_gridfs_file_readv(file, &iov, 1 /* iovcnt */, 1 /* min_bytes */, 0 /* timeout_msec */); ASSERT_CMPSSIZE_T(got, >=, 0); ASSERT(mlib_in_range(int, got)); mcommon_string_append_printf(&str, "%.*s", (int)got, (char *)buf); ASSERT_CMPSSIZE_T(got, ==, 3); } ASSERT_CMPSTR(mcommon_str_from_append(&str), "foobar"); mcommon_string_from_append_destroy(&str); mongoc_gridfs_file_destroy(file); } mongoc_gridfs_destroy(gridfs); } // Test an error occurs if reading an incomplete chunk. This is a regression test for CDRIVER-5506. { mongoc_gridfs_t *gridfs = mongoc_client_get_gridfs(client, "test_reading_multiple_chunks", NULL, &error); ASSERT_OR_PRINT(gridfs, error); // Drop prior test data. ASSERT_OR_PRINT(mongoc_gridfs_drop(gridfs, &error), error); // Write a file spanning two chunks. { mongoc_gridfs_file_opt_t opts = {.chunk_size = 4, .filename = "test_file"}; mongoc_iovec_t iov = {.iov_base = (void *)"foobar", .iov_len = 7}; mongoc_gridfs_file_t *file = mongoc_gridfs_create_file(gridfs, &opts); // First chunk is 4 bytes: "foob", second chunk is 3 bytes: "ar\0" ASSERT_CMPSSIZE_T(mongoc_gridfs_file_writev(file, &iov, 1, 0), ==, 7); BSON_ASSERT(mongoc_gridfs_file_save(file)); mongoc_gridfs_file_destroy(file); } // Manually remove data from the first chunk. { mongoc_collection_t *coll = mongoc_client_get_collection(client, "test_reading_multiple_chunks", "fs.chunks"); bson_t reply; // Change the data of the first chunk from "foob" to "foo". bool ok = mongoc_collection_update_one( coll, tmp_bson(BSON_STR({"n" : 0})), tmp_bson(BSON_STR({"$set" : {"data" : {"$binary" : {"base64" : "Zm9v", "subType" : "0"}}}})), NULL /* opts */, &reply, &error); ASSERT_OR_PRINT(ok, error); ASSERT_MATCH(&reply, BSON_STR({"modifiedCount" : 1})); mongoc_collection_destroy(coll); } // Attempt to read the entire file. { uint8_t buf[7] = {0}; mongoc_iovec_t iov = {.iov_base = (void *)buf, .iov_len = sizeof(buf)}; mongoc_gridfs_file_t *file = mongoc_gridfs_find_one_by_filename(gridfs, "test_file", &error); ASSERT_OR_PRINT(file, error); // First read gets an error. { ssize_t got = mongoc_gridfs_file_readv(file, &iov, 1 /* iovcnt */, 1 /* min_bytes */, 0 /* timeout_msec */); ASSERT_CMPSSIZE_T(got, ==, -1); ASSERT(mongoc_gridfs_file_error(file, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GRIDFS, MONGOC_ERROR_GRIDFS_CORRUPT, "corrupt chunk number 0: not equal to chunk size: 4"); } mongoc_gridfs_file_destroy(file); } mongoc_gridfs_destroy(gridfs); } mongoc_client_destroy(client); } void test_gridfs_install(TestSuite *suite) { TestSuite_AddLive(suite, "/gridfs_old/create", test_create); TestSuite_AddLive(suite, "/gridfs_old/create_from_stream", test_create_from_stream); TestSuite_AddLive(suite, "/gridfs_old/list", test_list); TestSuite_AddLive(suite, "/gridfs_old/find_one_empty", test_find_one_empty); TestSuite_AddLive(suite, "/gridfs_old/find_with_opts", test_find_with_opts); TestSuite_AddMockServerTest(suite, "/gridfs_old/find_one_with_opts/limit", test_find_one_with_opts_limit); TestSuite_AddLive(suite, "/gridfs_old/properties", test_properties); TestSuite_AddLive(suite, "/gridfs_old/empty", test_empty); TestSuite_AddLive(suite, "/gridfs_old/read", test_read); TestSuite_AddLive(suite, "/gridfs_old/seek", test_seek); TestSuite_AddLive(suite, "/gridfs_old/stream", test_stream); TestSuite_AddLive(suite, "/gridfs_old/remove", test_remove); TestSuite_AddLive(suite, "/gridfs_old/write", test_write); TestSuite_AddLive(suite, "/gridfs_old/write_at_boundary", test_write_at_boundary); TestSuite_AddLive(suite, "/gridfs_old/write_past_end", test_write_past_end); TestSuite_AddFull(suite, "/gridfs_old/test_long_seek [lock:live-server][timeout:30]", test_long_seek, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/gridfs_old/remove_by_filename", test_remove_by_filename); TestSuite_AddFull(suite, "/gridfs_old/missing_chunk [lock:live-server][timeout:30]", test_missing_chunk, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddLive(suite, "/gridfs_old/oversize_chunk", test_oversize); TestSuite_AddLive(suite, "/gridfs_old/missing_file", test_missing_file); TestSuite_AddLive(suite, "/gridfs_old/file_set_id", test_set_id); TestSuite_AddMockServerTest(suite, "/gridfs_old/inherit_client_config", test_inherit_client_config); TestSuite_AddMockServerTest(suite, "/gridfs_old/write_failure", test_write_failure); TestSuite_AddLive(suite, "/gridfs_old/reading_multiple_chunks", test_reading_multiple_chunks); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-gssapi.c000066400000000000000000000075111511661753600241540ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include static const char *GSSAPI_HOST = "MONGOC_TEST_GSSAPI_HOST"; static const char *GSSAPI_USER = "MONGOC_TEST_GSSAPI_USER"; #define NTHREADS 10 #define NLOOPS 10 char * _getenv(const char *name) { #ifdef _MSC_VER char buf[1024]; size_t buflen; if ((0 == getenv_s(&buflen, buf, sizeof buf, name)) && buflen) { return bson_strdup(buf); } else { return NULL; } #else char *const value = getenv(name); if (value && strlen(value)) { return bson_strdup(value); } else { return NULL; } #endif } struct closure_t { mongoc_client_pool_t *pool; int finished; bson_mutex_t mutex; }; static BSON_THREAD_FUN(gssapi_kerberos_worker, data) { struct closure_t *closure = (struct closure_t *)data; mongoc_client_pool_t *pool = closure->pool; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; bson_t query = BSON_INITIALIZER; int i; for (i = 0; i < NLOOPS; i++) { bson_t *cmd = BCON_NEW("ping", BCON_INT32(1)); client = mongoc_client_pool_pop(pool); if (!mongoc_client_command_with_opts(client, "test", cmd, NULL, NULL, NULL, &error)) { fflush(stdout); fprintf(stderr, "ping command failed: %s\n", error.message); fflush(stderr); abort(); } bson_destroy(cmd); collection = mongoc_client_get_collection(client, "kerberos", "test"); cursor = mongoc_collection_find_with_opts(collection, &query, NULL, NULL); if (!mongoc_cursor_next(cursor, &doc) && mongoc_cursor_error(cursor, &error)) { fflush(stdout); fprintf(stderr, "Cursor Failure: %s\n", error.message); fflush(stderr); abort(); } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_pool_push(pool, client); } bson_destroy(&query); bson_mutex_lock(&closure->mutex); closure->finished++; bson_mutex_unlock(&closure->mutex); BSON_THREAD_RETURN; } int main(void) { char *host = _getenv(GSSAPI_HOST); char *user = _getenv(GSSAPI_USER); char *uri_str; mongoc_uri_t *uri; struct closure_t closure = {0}; int i; bson_thread_t threads[NTHREADS]; int r; mongoc_init(); if (!host || !user) { fprintf(stderr, "%s and %s must be defined in environment\n", GSSAPI_HOST, GSSAPI_USER); return 1; } bson_mutex_init(&closure.mutex); uri_str = bson_strdup_printf("mongodb://%s@%s/?authMechanism=GSSAPI&connectTimeoutMS=30000", user, host); uri = mongoc_uri_new(uri_str); closure.pool = mongoc_client_pool_new(uri); for (i = 0; i < NTHREADS; i++) { r = mcommon_thread_create(&threads[i], gssapi_kerberos_worker, (void *)&closure); BSON_ASSERT(r == 0); } for (i = 0; i < NTHREADS; i++) { mcommon_thread_join(threads[i]); } bson_mutex_lock(&closure.mutex); BSON_ASSERT(NTHREADS == closure.finished); bson_mutex_unlock(&closure.mutex); mongoc_client_pool_destroy(closure.pool); bson_mutex_destroy(&closure.mutex); mongoc_uri_destroy(uri); bson_free(uri_str); bson_free(host); bson_free(user); mongoc_cleanup(); return 0; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-handshake.c000066400000000000000000001316021511661753600246130ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #ifdef _POSIX_VERSION #include #endif #include #include #include #include #include #include #include #include #include #include #include /* * Call this before any test which uses mongoc_handshake_data_append, to * reset the global state and unfreeze the handshake struct. Call it * after a test so later tests don't have a weird handshake document * * This is not safe to call while we have any clients or client pools running! */ static void _reset_handshake(void) { _mongoc_handshake_cleanup(); _mongoc_handshake_init(); } static const char *default_appname = "testapp"; static const char *default_driver_name = "php driver"; static const char *default_driver_version = "version abc"; static const char *default_platform = "./configure -nottoomanyflags"; static const int32_t default_timeout_sec = 60; static const int32_t default_memory_mb = 1024; static void test_mongoc_handshake_appname_in_uri(void) { char long_string[MONGOC_HANDSHAKE_APPNAME_MAX + 2]; char *uri_str; const char *good_uri = "mongodb://host/?" MONGOC_URI_APPNAME "=mongodump"; mongoc_uri_t *uri; const char *appname = "mongodump"; const char *value; memset(long_string, 'a', MONGOC_HANDSHAKE_APPNAME_MAX + 1); long_string[MONGOC_HANDSHAKE_APPNAME_MAX + 1] = '\0'; /* Shouldn't be able to set with appname really long */ capture_logs(true); uri_str = bson_strdup_printf("mongodb://a/?" MONGOC_URI_APPNAME "=%s", long_string); ASSERT(!test_framework_client_new(uri_str, NULL)); ASSERT_CAPTURED_LOG("_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_WARNING, "Unsupported value"); capture_logs(false); uri = mongoc_uri_new(good_uri); ASSERT(uri); value = mongoc_uri_get_appname(uri); ASSERT(value); ASSERT_CMPSTR(appname, value); mongoc_uri_destroy(uri); uri = mongoc_uri_new(NULL); ASSERT(uri); ASSERT(!mongoc_uri_set_appname(uri, long_string)); ASSERT(mongoc_uri_set_appname(uri, appname)); value = mongoc_uri_get_appname(uri); ASSERT(value); ASSERT_CMPSTR(appname, value); mongoc_uri_destroy(uri); bson_free(uri_str); } static void test_mongoc_handshake_appname_frozen_single(void) { mongoc_client_t *client; const char *good_uri = "mongodb://host/?" MONGOC_URI_APPNAME "=mongodump"; client = test_framework_client_new(good_uri, NULL); /* Shouldn't be able to set appname again */ capture_logs(true); ASSERT(!mongoc_client_set_appname(client, "a")); ASSERT_CAPTURED_LOG( "_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot set appname more than once"); capture_logs(false); mongoc_client_destroy(client); } static void test_mongoc_handshake_appname_frozen_pooled(void) { mongoc_client_pool_t *pool; const char *good_uri = "mongodb://host/?" MONGOC_URI_APPNAME "=mongodump"; mongoc_uri_t *uri; uri = mongoc_uri_new(good_uri); pool = test_framework_client_pool_new_from_uri(uri, NULL); capture_logs(true); ASSERT(!mongoc_client_pool_set_appname(pool, "test")); ASSERT_CAPTURED_LOG( "_mongoc_topology_scanner_set_appname", MONGOC_LOG_LEVEL_ERROR, "Cannot set appname more than once"); capture_logs(false); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } static void _check_arch_string_valid(const char *arch) { #ifdef _POSIX_VERSION struct utsname system_info; ASSERT(uname(&system_info) >= 0); ASSERT_CMPSTR(system_info.machine, arch); #endif ASSERT(strlen(arch) > 0); } static void _check_os_version_valid(const char *os_version) { #if defined(__linux__) || defined(_WIN32) /* On linux we search the filesystem for os version or use uname. * On windows we call GetSystemInfo(). */ ASSERT(os_version); ASSERT(strlen(os_version) > 0); #elif defined(_POSIX_VERSION) /* On a non linux posix systems, we just call uname() */ struct utsname system_info; ASSERT(uname(&system_info) >= 0); ASSERT(os_version); ASSERT_CMPSTR(system_info.release, os_version); #endif } static void _handshake_check_application(bson_t *doc) { bson_iter_t md_iter; bson_iter_t inner_iter; const char *val; ASSERT(bson_iter_init_find(&md_iter, doc, "application")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "name")); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT_CMPSTR(val, default_appname); } static void _handshake_check_driver(bson_t *doc) { bson_iter_t md_iter; bson_iter_t inner_iter; const char *val; ASSERT(bson_iter_init_find(&md_iter, doc, "driver")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "name")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strstr(val, default_driver_name) != NULL); ASSERT(bson_iter_find(&inner_iter, "version")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strstr(val, default_driver_version)); } static void _handshake_check_os(bson_t *doc) { bson_iter_t md_iter; bson_iter_t inner_iter; const char *val; /* Check os type not empty */ ASSERT(bson_iter_init_find(&md_iter, doc, "os")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "type")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strlen(val) > 0); /* Check os version valid */ ASSERT(bson_iter_find(&inner_iter, "version")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); _check_os_version_valid(val); /* Check os arch is valid */ ASSERT(bson_iter_find(&inner_iter, "architecture")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); _check_arch_string_valid(val); /* Not checking os_name, as the spec says it can be NULL. */ } static void _handshake_check_env(bson_t *doc, int expected_memory_mb, int expected_timeout_sec, const char *expected_region) { bson_iter_t md_iter; bson_iter_t inner_iter; const char *name; ASSERT(bson_iter_init_find(&md_iter, doc, "env")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "name")); name = bson_iter_utf8(&inner_iter, NULL); bool is_aws = strstr(name, "aws.lambda") == name; bool is_azure = strstr(name, "azure.func") == name; bool is_gcp = strstr(name, "gcp.func") == name; bool is_vercel = strstr(name, "vercel") == name; ASSERT(is_aws || is_azure || is_gcp || is_vercel); if (expected_timeout_sec) { ASSERT(bson_iter_find(&inner_iter, "timeout_sec")); ASSERT(BSON_ITER_HOLDS_INT32(&inner_iter)); ASSERT_CMPINT32(bson_iter_int32(&inner_iter), ==, expected_timeout_sec); } if (expected_memory_mb) { ASSERT(bson_iter_find(&inner_iter, "memory_mb")); ASSERT(BSON_ITER_HOLDS_INT32(&inner_iter)); ASSERT_CMPINT32(bson_iter_int32(&inner_iter), ==, expected_memory_mb); } if (expected_region) { ASSERT(bson_iter_find(&inner_iter, "region")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); ASSERT_CMPSTR(bson_iter_utf8(&inner_iter, NULL), expected_region); } } static void _handshake_check_platform(bson_t *doc) { bson_iter_t md_iter; const char *val; ASSERT(bson_iter_init_find(&md_iter, doc, "platform")); ASSERT(BSON_ITER_HOLDS_UTF8(&md_iter)); val = bson_iter_utf8(&md_iter, NULL); ASSERT(val); if (strlen(val) < 250) { /* standard val are < 100, may be truncated on some platform */ ASSERT(strstr(val, default_platform) != NULL); } } static void _handshake_check_env_name(bson_t *doc, const char *expected) { bson_iter_t md_iter; bson_iter_t inner_iter; ASSERT(bson_iter_init_find(&md_iter, doc, "env")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); const char *name; ASSERT(bson_iter_find(&inner_iter, "name")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); name = bson_iter_utf8(&inner_iter, NULL); ASSERT(name); ASSERT_CMPSTR(name, expected); } static void _handshake_check_required_fields(bson_t *doc) { _handshake_check_application(doc); _handshake_check_driver(doc); _handshake_check_os(doc); _handshake_check_platform(doc); } // Start a mock server, get the driver's handshake doc, and clean up static bson_t * _get_handshake_document(bool default_append) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool; request_t *request; const bson_t *request_doc; bson_iter_t iter; /* Make sure setting the handshake works */ if (default_append) { ASSERT(mongoc_handshake_data_append(default_driver_name, default_driver_version, default_platform)); } server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_APPNAME, default_appname); pool = test_framework_client_pool_new_from_uri(uri, NULL); /* Force topology scanner to start */ client = mongoc_client_pool_pop(pool); request = mock_server_receives_any_hello(server); ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); ASSERT(bson_has_field(request_doc, HANDSHAKE_FIELD)); ASSERT(bson_iter_init_find(&iter, request_doc, HANDSHAKE_FIELD)); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); uint32_t len; const uint8_t *data; bson_iter_document(&iter, &len, &data); bson_t *handshake_doc = bson_new_from_data(data, len); reply_to_request_simple(request, "{'ok': 1, 'isWritablePrimary': true}"); request_destroy(request); /* Cleanup */ mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); return handshake_doc; } /* Override host info with plausible but short strings to avoid any * truncation */ static void _override_host_platform_os(void) { _reset_handshake(); mongoc_handshake_t *md = _mongoc_handshake_get(); bson_free(md->os_type); md->os_type = bson_strdup("Linux"); bson_free(md->os_name); md->os_name = bson_strdup("mongoc"); bson_free(md->driver_name); md->driver_name = bson_strdup("test_e"); bson_free(md->driver_version); md->driver_version = bson_strdup("1.25.0"); bson_free(md->platform); md->platform = bson_strdup("posix=1234"); bson_free(md->compiler_info); md->compiler_info = bson_strdup("CC=GCC"); bson_free(md->flags); md->flags = bson_strdup("CFLAGS=\"-fPIE\""); } // erase all FaaS variables used in testing static void clear_faas_env(void) { ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "")); ASSERT(_mongoc_setenv("AWS_LAMBDA_RUNTIME_API", "")); ASSERT(_mongoc_setenv("AWS_REGION", "")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "")); ASSERT(_mongoc_setenv("FUNCTIONS_WORKER_RUNTIME", "")); ASSERT(_mongoc_setenv("K_SERVICE", "")); ASSERT(_mongoc_setenv("KUBERNETES_SERVICE_HOST", "")); ASSERT(_mongoc_setenv("FUNCTION_MEMORY_MB", "")); ASSERT(_mongoc_setenv("FUNCTION_TIMEOUT_SEC", "")); ASSERT(_mongoc_setenv("FUNCTION_REGION", "")); ASSERT(_mongoc_setenv("VERCEL", "")); ASSERT(_mongoc_setenv("VERCEL_REGION", "")); } static void test_mongoc_handshake_data_append_success(void) { _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); bson_iter_t md_iter; bson_iter_init(&md_iter, doc); _handshake_check_application(doc); _handshake_check_driver(doc); _handshake_check_os(doc); _handshake_check_platform(doc); bson_destroy(doc); _reset_handshake(); } static void test_valid_aws_lambda(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_LAMBDA_RUNTIME_API", "foo")); ASSERT(_mongoc_setenv("AWS_REGION", "us-east-2")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "1024")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, default_memory_mb, 0, "us-east-2"); _handshake_check_env_name(doc, "aws.lambda"); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, doc, "env")); bson_iter_t inner_iter; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_recurse(&iter, &inner_iter); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_valid_aws_and_vercel(void *test_ctx) { // Test that Vercel takes precedence over AWS. From the specification: // > When variables for multiple ``client.env.name`` values are present, // > ``vercel`` takes precedence over ``aws.lambda`` BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); ASSERT(_mongoc_setenv("AWS_REGION", "us-east-2")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "1024")); ASSERT(_mongoc_setenv("VERCEL", "1")); ASSERT(_mongoc_setenv("VERCEL_REGION", "cdg1")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, 0, 0, "cdg1"); _handshake_check_env_name(doc, "vercel"); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_valid_aws(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); ASSERT(_mongoc_setenv("AWS_REGION", "us-east-2")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "1024")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, default_memory_mb, 0, "us-east-2"); _handshake_check_env_name(doc, "aws.lambda"); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, doc, "env")); bson_iter_t inner_iter; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_recurse(&iter, &inner_iter); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_valid_azure(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("FUNCTIONS_WORKER_RUNTIME", "node")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, 0, 0, NULL); _handshake_check_env_name(doc, "azure.func"); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_valid_gcp(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("K_SERVICE", "servicename")); ASSERT(_mongoc_setenv("FUNCTION_MEMORY_MB", "1024")); ASSERT(_mongoc_setenv("FUNCTION_TIMEOUT_SEC", "60")); ASSERT(_mongoc_setenv("FUNCTION_REGION", "us-central1")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, default_memory_mb, default_timeout_sec, "us-central1"); _handshake_check_env_name(doc, "gcp.func"); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_valid_vercel(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("VERCEL", "1")); ASSERT(_mongoc_setenv("VERCEL_REGION", "cdg1")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env(doc, 0, 0, "cdg1"); _handshake_check_env_name(doc, "vercel"); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_multiple_faas(void *test_ctx) { BSON_UNUSED(test_ctx); // Multiple FaaS variables must cause the entire env field to be omitted ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); ASSERT(_mongoc_setenv("FUNCTIONS_WORKER_RUNTIME", "node")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); ASSERT(!bson_has_field(doc, "env")); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_truncate_region(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); const size_t region_len = 512; char long_region[512]; memset(&long_region, 'a', region_len - 1); long_region[region_len - 1] = '\0'; ASSERT(_mongoc_setenv("AWS_REGION", long_region)); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env_name(doc, "aws.lambda"); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, doc, "env")); bson_iter_t inner_iter; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_recurse(&iter, &inner_iter); ASSERT(!bson_iter_find(&inner_iter, "memory_mb")); ASSERT(!bson_iter_find(&inner_iter, "timeout_sec")); ASSERT(!bson_iter_find(&inner_iter, "region")); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_wrong_types(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "big")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); _handshake_check_env_name(doc, "aws.lambda"); bson_iter_t iter; ASSERT(bson_iter_init_find(&iter, doc, "env")); bson_iter_t inner_iter; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_recurse(&iter, &inner_iter); ASSERT(!bson_iter_find(&iter, "memory_mb")); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_aws_not_lambda(void *test_ctx) { BSON_UNUSED(test_ctx); // Entire env field must be omitted with non-lambda AWS ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "EC2")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); ASSERT(!bson_has_field(doc, "env")); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_aws_and_container(void *test_ctx) { BSON_UNUSED(test_ctx); ASSERT(_mongoc_setenv("AWS_EXECUTION_ENV", "AWS_Lambda_java8")); ASSERT(_mongoc_setenv("AWS_REGION", "us-east-2")); ASSERT(_mongoc_setenv("AWS_LAMBDA_FUNCTION_MEMORY_SIZE", "1024")); ASSERT(_mongoc_setenv("KUBERNETES_SERVICE_HOST", "1")); _override_host_platform_os(); bson_t *doc = _get_handshake_document(true); _handshake_check_required_fields(doc); ASSERT_CMPSTR(bson_lookup_utf8(doc, "container.orchestrator"), "kubernetes"); ASSERT_CMPSTR(bson_lookup_utf8(doc, "env.name"), "aws.lambda"); _handshake_check_env(doc, default_memory_mb, 0, "us-east-2"); bson_destroy(doc); clear_faas_env(); _reset_handshake(); } static void test_mongoc_handshake_data_append_null_args(void) { bson_iter_t md_iter; bson_iter_t inner_iter; const char *val; /* Make sure setting the handshake works */ ASSERT(mongoc_handshake_data_append(NULL, NULL, NULL)); _reset_handshake(); bson_t *handshake_doc = _get_handshake_document(false); bson_iter_init(&md_iter, handshake_doc); _handshake_check_application(handshake_doc); /* Make sure driver.name and driver.version and platform are all right */ ASSERT(bson_iter_find(&md_iter, "driver")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "name")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strstr(val, " / ") == NULL); /* No append delimiter */ ASSERT(bson_iter_find(&inner_iter, "version")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strstr(val, " / ") == NULL); /* No append delimiter */ /* Check os type not empty */ ASSERT(bson_iter_find(&md_iter, "os")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&md_iter)); ASSERT(bson_iter_recurse(&md_iter, &inner_iter)); ASSERT(bson_iter_find(&inner_iter, "type")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); ASSERT(strlen(val) > 0); /* Check os version valid */ ASSERT(bson_iter_find(&inner_iter, "version")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); _check_os_version_valid(val); /* Check os arch is valid */ ASSERT(bson_iter_find(&inner_iter, "architecture")); ASSERT(BSON_ITER_HOLDS_UTF8(&inner_iter)); val = bson_iter_utf8(&inner_iter, NULL); ASSERT(val); _check_arch_string_valid(val); /* Not checking os_name, as the spec says it can be NULL. */ /* Check platform field ok */ ASSERT(bson_iter_find(&md_iter, "platform")); ASSERT(BSON_ITER_HOLDS_UTF8(&md_iter)); val = bson_iter_utf8(&md_iter, NULL); ASSERT(val); /* standard val are < 100, may be truncated on some platform */ if (strlen(val) < 250) { /* `printf("%s", NULL)` -> "(null)" with libstdc++, libc++, and STL */ ASSERT(strstr(val, "null") == NULL); } bson_destroy(handshake_doc); } static void _test_platform(bool platform_oversized) { mongoc_handshake_t *md; size_t platform_len; const char *platform_suffix = "b"; _reset_handshake(); md = _mongoc_handshake_get(); bson_free(md->os_type); md->os_type = bson_strdup("foo"); bson_free(md->os_name); md->os_name = bson_strdup("foo"); bson_free(md->os_version); md->os_version = bson_strdup("foo"); bson_free(md->os_architecture); md->os_architecture = bson_strdup("foo"); bson_free(md->driver_name); md->driver_name = bson_strdup("foo"); bson_free(md->driver_version); md->driver_version = bson_strdup("foo"); platform_len = HANDSHAKE_MAX_SIZE; if (platform_oversized) { platform_len += 100; } bson_free(md->platform); md->platform = bson_malloc(platform_len); memset(md->platform, 'a', platform_len - 1); md->platform[platform_len - 1] = '\0'; /* returns true, but ignores the suffix; there's no room */ ASSERT(mongoc_handshake_data_append(NULL, NULL, platform_suffix)); ASSERT(!strstr(md->platform, "b")); bson_t *doc; ASSERT(doc = _mongoc_handshake_build_doc_with_application("my app")); ASSERT_CMPUINT32(doc->len, ==, (uint32_t)HANDSHAKE_MAX_SIZE); bson_destroy(doc); _reset_handshake(); /* frees the strings created above */ } static void test_mongoc_handshake_big_platform(void) { _test_platform(false); } static void test_mongoc_handshake_oversized_platform(void) { _test_platform(true); } static void test_mongoc_handshake_data_append_after_cmd(void) { mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; _reset_handshake(); uri = mongoc_uri_new("mongodb://127.0.0.1/?" MONGOC_URI_MAXPOOLSIZE "=1"); /* Make sure that after we pop a client we can't set global handshake */ pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); capture_logs(true); ASSERT(!mongoc_handshake_data_append("a", "a", "a")); capture_logs(false); mongoc_client_pool_push(pool, client); mongoc_uri_destroy(uri); mongoc_client_pool_destroy(pool); _reset_handshake(); } /* * Append to the platform field a huge string * Make sure that it gets truncated */ static void test_mongoc_handshake_too_big(void) { mongoc_client_t *client; mock_server_t *server; mongoc_uri_t *uri; future_t *future; request_t *request; const bson_t *hello_doc; bson_iter_t iter; enum { BUFFER_SIZE = HANDSHAKE_MAX_SIZE }; char big_string[BUFFER_SIZE]; uint32_t len; const uint8_t *dummy; server = mock_server_new(); mock_server_run(server); _reset_handshake(); memset(big_string, 'a', BUFFER_SIZE - 1); big_string[BUFFER_SIZE - 1] = '\0'; ASSERT(mongoc_handshake_data_append(NULL, NULL, big_string)); uri = mongoc_uri_copy(mock_server_get_uri(server)); /* avoid rare test timeouts */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 20000); client = test_framework_client_new_from_uri(uri, NULL); ASSERT(mongoc_client_set_appname(client, "my app")); /* Send a ping, mock server deals with it */ future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); request = mock_server_receives_any_hello(server); /* Make sure the hello request has a handshake field, and it's not huge */ ASSERT(request); hello_doc = request_get_doc(request, 0); ASSERT(hello_doc); ASSERT(bson_has_field(hello_doc, HANDSHAKE_FIELD)); /* hello with handshake isn't too big */ bson_iter_init_find(&iter, hello_doc, HANDSHAKE_FIELD); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_iter_document(&iter, &len, &dummy); /* Should have truncated the platform field so it fits exactly */ ASSERT(len == HANDSHAKE_MAX_SIZE); reply_to_request_simple( request, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); /* So later tests don't have "aaaaa..." as the md platform string */ _reset_handshake(); } /* * Testing whether platform string data is truncated/dropped appropriately * drop specifies what case should be tested for */ static void test_mongoc_platform_truncate(int drop) { mongoc_handshake_t *md; bson_iter_t iter; char *undropped; char *expected; char big_string[HANDSHAKE_MAX_SIZE]; memset(big_string, 'a', HANDSHAKE_MAX_SIZE - 1); big_string[HANDSHAKE_MAX_SIZE - 1] = '\0'; /* Need to know how much space storing fields in our BSON will take * so that we can make our platform string the correct length here */ _reset_handshake(); /* we manually bypass the defaults of the handshake to ensure an exceedingly * long field does not cause our test to incorrectly fail */ md = _mongoc_handshake_get(); bson_free(md->os_type); md->os_type = bson_strdup("test_a"); bson_free(md->os_name); md->os_name = bson_strdup("test_b"); bson_free(md->os_architecture); md->os_architecture = bson_strdup("test_d"); bson_free(md->driver_name); md->driver_name = bson_strdup("test_e"); bson_free(md->driver_version); md->driver_version = bson_strdup("test_f"); // Set all fields used to generate the platform string to empty bson_free(md->platform); md->platform = bson_strdup(""); bson_free(md->compiler_info); md->compiler_info = bson_strdup(""); bson_free(md->flags); md->flags = bson_strdup(""); // Set os_version to a long string to force drop all os fields except name bson_free(md->os_version); md->os_version = big_string; bson_t *handshake_no_platform = _mongoc_handshake_build_doc_with_application(default_appname); size_t handshake_remaining_space = HANDSHAKE_MAX_SIZE - handshake_no_platform->len; bson_destroy(handshake_no_platform); md->os_version = bson_strdup("test_c"); bson_free(md->compiler_info); md->compiler_info = bson_strdup("test_g"); bson_free(md->flags); md->flags = bson_strdup("test_h"); /* adjust remaining space depending on which combination of * flags/compiler_info we want to test dropping */ if (drop == 2) { undropped = bson_strdup_printf("%s", ""); } else if (drop == 1) { handshake_remaining_space -= strlen(md->compiler_info); undropped = bson_strdup_printf("%s", md->compiler_info); } else { handshake_remaining_space -= strlen(md->flags) + strlen(md->compiler_info); undropped = bson_strdup_printf("%s%s", md->compiler_info, md->flags); } big_string[handshake_remaining_space] = '\0'; ASSERT(mongoc_handshake_data_append(NULL, NULL, big_string)); bson_t *doc; ASSERT(doc = _mongoc_handshake_build_doc_with_application(default_appname)); /* doc.len being strictly less than HANDSHAKE_MAX_SIZE proves that we have * dropped the flags correctly, instead of truncating anything */ ASSERT_CMPUINT32(doc->len, <=, (uint32_t)HANDSHAKE_MAX_SIZE); ASSERT(bson_iter_init_find(&iter, doc, "platform")); expected = bson_strdup_printf("%s%s", big_string, undropped); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), expected); bson_free(expected); bson_free(undropped); bson_destroy(doc); /* So later tests don't have "aaaaa..." as the md platform string */ _reset_handshake(); } /* * Test dropping neither compiler_info/flags, dropping just flags, and dropping * both */ static void test_mongoc_oversized_flags(void) { test_mongoc_platform_truncate(0); test_mongoc_platform_truncate(1); test_mongoc_platform_truncate(2); } /* Test the case where we can't prevent the handshake doc being too big * and so we just don't send it */ static void test_mongoc_handshake_cannot_send(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool; request_t *request; const char *const server_reply = "{'ok': 1, 'isWritablePrimary': true}"; const bson_t *request_doc; char big_string[HANDSHAKE_MAX_SIZE]; _reset_handshake(); capture_logs(true); memset(big_string, 'a', HANDSHAKE_MAX_SIZE - 1); big_string[HANDSHAKE_MAX_SIZE - 1] = '\0'; /* The handshake cannot be built if a field that cannot be dropped * (os.type) is set to a very long string */ mongoc_handshake_t *md = _mongoc_handshake_get(); bson_free(md->os_type); md->os_type = bson_strdup(big_string); server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); pool = test_framework_client_pool_new_from_uri(uri, NULL); /* Pop a client to trigger the topology scanner */ client = mongoc_client_pool_pop(pool); request = mock_server_receives_any_hello(server); /* Make sure the hello request DOESN'T have a handshake field: */ ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); ASSERT(!bson_has_field(request_doc, HANDSHAKE_FIELD)); reply_to_request_simple(request, server_reply); request_destroy(request); /* Cause failure on client side */ request = mock_server_receives_any_hello(server); ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); /* Make sure the hello request still DOESN'T have a handshake field * on subsequent heartbeats. */ request = mock_server_receives_any_hello(server); ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); ASSERT(!bson_has_field(request_doc, HANDSHAKE_FIELD)); reply_to_request_simple(request, server_reply); request_destroy(request); /* cleanup */ mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); /* Reset again so the next tests don't have a handshake doc which * is too big */ _reset_handshake(); } /* Test the case where the driver does not raise an error if saslSupportedMechs attribute of the initial handshake reply contains an unknown mechanism. */ static void test_mongoc_handshake_no_validation_for_sasl_supported_mech(void) { mongoc_client_t *client; mock_server_t *server; mongoc_uri_t *uri; future_t *future; request_t *request; const bson_t *doc; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); /* avoid rare test timeouts */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 20000); client = test_framework_client_new_from_uri(uri, NULL); ASSERT(mongoc_client_set_appname(client, "my app")); /* Send a ping where 'saslSupportedMechs' contains an arbitrary string */ future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1, 'saslSupportedMechs': 'unknownMechanism'}"), NULL, NULL, NULL); ASSERT(future); request = mock_server_receives_any_hello(server); ASSERT(request); reply_to_request_simple( request, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); ASSERT(request); doc = request_get_doc(request, 0); ASSERT(doc); ASSERT(bson_has_field(doc, "saslSupportedMechs")); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); ASSERT_NO_CAPTURED_LOGS("mongoc_handshake_no_validation_for_sasl_supported_mechs"); } extern char * _mongoc_handshake_get_config_hex_string(void); static bool _get_bit(char *config_str, uint32_t bit) { /* get the location of the two byte chars for this bit. */ uint32_t byte = bit / 8; uint32_t bit_of_byte = bit % 8; uint32_t char_loc; uint32_t as_num; char byte_str[3]; /* byte 0 is represented at the last two characters. */ char_loc = (uint32_t)strlen(config_str) - 2 - (byte * 2); /* index should be past the prefixed "0x" */ ASSERT_CMPINT32(char_loc, >, 1); /* get the number representation of the byte. */ byte_str[0] = config_str[char_loc]; byte_str[1] = config_str[char_loc + 1]; byte_str[2] = '\0'; as_num = (uint8_t)strtol(byte_str, NULL, 16); return (as_num & (1u << bit_of_byte)) > 0u; } void test_handshake_platform_config(void) { /* Parse the config string, and check that it matches the defined flags. */ char *config_str = _mongoc_handshake_get_config_hex_string(); uint32_t total_bytes = (LAST_MONGOC_MD_FLAG + 7) / 8; uint32_t total_bits = 8 * total_bytes; uint32_t i; /* config_str should have the form 0x?????. */ ASSERT_CMPINT((int)strlen(config_str), ==, 2 + (2 * total_bytes)); BSON_ASSERT(strncmp(config_str, "0x", 2) == 0); /* go through all flags. */ #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL BSON_ASSERT(_get_bit(config_str, MONGOC_ENABLE_SSL_SECURE_CHANNEL)); #endif #ifdef MONGOC_ENABLE_CRYPTO_CNG BSON_ASSERT(_get_bit(config_str, MONGOC_ENABLE_CRYPTO_CNG)); #endif #ifdef MONGOC_HAVE_BCRYPT_PBKDF2 BSON_ASSERT(_get_bit(config_str, MONGOC_HAVE_BCRYPT_PBKDF2)); #endif #ifdef MONGOC_ENABLE_SSL_SECURE_TRANSPORT BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SSL_SECURE_TRANSPORT)); #endif #ifdef MONGOC_ENABLE_CRYPTO_COMMON_CRYPTO BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_CRYPTO_COMMON_CRYPTO)); #endif #ifdef MONGOC_ENABLE_SSL_OPENSSL BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SSL_OPENSSL)); #endif #ifdef MONGOC_ENABLE_CRYPTO_LIBCRYPTO BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_CRYPTO_LIBCRYPTO)); #endif #ifdef MONGOC_ENABLE_SSL BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SSL)); #endif #ifdef MONGOC_ENABLE_CRYPTO BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_CRYPTO)); #endif #ifdef MONGOC_ENABLE_CRYPTO_SYSTEM_PROFILE BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_CRYPTO_SYSTEM_PROFILE)); #endif #ifdef MONGOC_ENABLE_SASL BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SASL)); #endif #ifdef MONGOC_HAVE_SASL_CLIENT_DONE BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_HAVE_SASL_CLIENT_DONE)); #endif BSON_ASSERT(!_get_bit(config_str, MONGOC_MD_FLAG_NO_AUTOMATIC_GLOBALS_UNUSED)); // Flag was removed. #ifdef MONGOC_EXPERIMENTAL_FEATURES BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_EXPERIMENTAL_FEATURES)); #endif #ifdef MONGOC_ENABLE_SASL_CYRUS BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SASL_CYRUS)); #endif #ifdef MONGOC_ENABLE_SASL_SSPI BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SASL_SSPI)); #endif #ifdef MONGOC_HAVE_SOCKLEN BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_HAVE_SOCKLEN)); #endif #ifdef MONGOC_ENABLE_COMPRESSION BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_COMPRESSION)); #endif #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_COMPRESSION_SNAPPY)); #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_COMPRESSION_ZLIB)); #endif #ifdef MONGOC_MD_FLAG_ENABLE_SASL_GSSAPI BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SASL_GSSAPI)); #endif #ifdef MONGOC_HAVE_RES_NSEARCH BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_RES_NSEARCH)); #endif #ifdef MONGOC_HAVE_RES_NDESTROY BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_RES_NDESTROY)); #endif #ifdef MONGOC_HAVE_RES_NCLOSE BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_RES_NCLOSE)); #endif #ifdef MONGOC_HAVE_RES_SEARCH BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_RES_SEARCH)); #endif #ifdef MONGOC_HAVE_DNSAPI BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_DNSAPI)); #endif #ifdef MONGOC_HAVE_RDTSCP BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_RDTSCP)); #endif #ifdef MONGOC_HAVE_SCHED_GETCPU BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_HAVE_SCHED_GETCPU)); #endif BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SRV) == MONGOC_SRV_ENABLED); #ifdef MONGOC_ENABLE_SHM_COUNTERS BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_SHM_COUNTERS)); #endif mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); if (MONGOC_TRACE_ENABLED) { BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_TRACE)); } mlib_diagnostic_pop(); // Check that `MONGOC_MD_FLAG_ENABLE_ICU` is always unset. libicu dependency // was removed in CDRIVER-4680. BSON_ASSERT(!_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_ICU_UNUSED)); #ifdef MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_CLIENT_SIDE_ENCRYPTION)); #endif #ifdef MONGOC_ENABLE_MONGODB_AWS_AUTH BSON_ASSERT(_get_bit(config_str, MONGOC_MD_FLAG_ENABLE_MONGODB_AWS_AUTH)); #endif /* any excess bits should all be zero. */ for (i = LAST_MONGOC_MD_FLAG; i < total_bits; i++) { BSON_ASSERT(!_get_bit(config_str, i)); } bson_free(config_str); } /* Called by a single thread in test_mongoc_handshake_race_condition */ static BSON_THREAD_FUN(handshake_append_worker, data) { BSON_UNUSED(data); mongoc_handshake_data_append(default_driver_name, default_driver_version, default_platform); BSON_THREAD_RETURN; } /* Run 1000 iterations of mongoc_handshake_data_append() using 4 threads */ static void test_mongoc_handshake_race_condition(void) { unsigned i, j; bson_thread_t threads[4]; for (i = 0; i < 1000; ++i) { _reset_handshake(); for (j = 0; j < 4; ++j) { BSON_ASSERT(!mcommon_thread_create(&threads[j], &handshake_append_worker, NULL /* args */)); } for (j = 0; j < 4; ++j) { mcommon_thread_join(threads[j]); } } _reset_handshake(); } static void test_mongoc_handshake_cpp(void) { bson_t *handshake = _mongoc_handshake_build_doc_with_application("foo"); const char *platform = bson_lookup_utf8(handshake, "platform"); if (0 != strlen(MONGOC_CXX_COMPILER_VERSION)) { ASSERT_CONTAINS(platform, "CXX=" MONGOC_CXX_COMPILER_ID " " MONGOC_CXX_COMPILER_VERSION); } else { ASSERT_CONTAINS(platform, "CXX=" MONGOC_CXX_COMPILER_ID); } bson_destroy(handshake); } void test_handshake_install(TestSuite *suite) { TestSuite_Add(suite, "/MongoDB/handshake/appname_in_uri", test_mongoc_handshake_appname_in_uri); TestSuite_Add(suite, "/MongoDB/handshake/appname_frozen_single", test_mongoc_handshake_appname_frozen_single); TestSuite_Add(suite, "/MongoDB/handshake/appname_frozen_pooled", test_mongoc_handshake_appname_frozen_pooled); TestSuite_AddMockServerTest(suite, "/MongoDB/handshake/success", test_mongoc_handshake_data_append_success); TestSuite_AddMockServerTest(suite, "/MongoDB/handshake/null_args", test_mongoc_handshake_data_append_null_args); TestSuite_Add(suite, "/MongoDB/handshake/big_platform", test_mongoc_handshake_big_platform); TestSuite_Add(suite, "/MongoDB/handshake/oversized_platform", test_mongoc_handshake_oversized_platform); TestSuite_Add(suite, "/MongoDB/handshake/failure", test_mongoc_handshake_data_append_after_cmd); TestSuite_AddMockServerTest(suite, "/MongoDB/handshake/too_big", test_mongoc_handshake_too_big); TestSuite_Add(suite, "/MongoDB/handshake/oversized_flags", test_mongoc_oversized_flags); TestSuite_AddMockServerTest(suite, "/MongoDB/handshake/cannot_send", test_mongoc_handshake_cannot_send); TestSuite_AddMockServerTest(suite, "/MongoDB/handshake/no_validation_for_sasl_supported_mech", test_mongoc_handshake_no_validation_for_sasl_supported_mech); TestSuite_Add(suite, "/MongoDB/handshake/platform_config", test_handshake_platform_config); TestSuite_Add(suite, "/MongoDB/handshake/race_condition", test_mongoc_handshake_race_condition); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_aws", test_valid_aws, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_azure", test_valid_azure, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_gcp", test_valid_gcp, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_aws_lambda", test_valid_aws_lambda, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_aws_and_vercel", test_valid_aws_and_vercel, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/valid_vercel", test_valid_vercel, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/multiple", test_multiple_faas, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/truncate_region", test_truncate_region, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/wrong_types", test_wrong_types, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/aws_not_lambda", test_aws_not_lambda, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_AddFull(suite, "/MongoDB/handshake/faas/aws_and_container", test_aws_and_container, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_setenv); TestSuite_Add(suite, "/MongoDB/handshake/includes_c++", test_mongoc_handshake_cpp); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-hedged-reads.c000066400000000000000000000070011511661753600251740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include static void test_mongos_hedged_reads_read_pref(void) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; bson_t hedge_doc = BSON_INITIALIZER; mongoc_read_prefs_t *prefs; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); /* For all read preference modes that are not 'primary', drivers MUST set * readPreference. */ mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, prefs, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " '$readPreference': {'mode': 'secondaryPreferred'}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); /* CDRIVER-3583: * with readPreference mode secondaryPreferred and hedge set, readPreference * MUST be sent. */ bson_append_bool(&hedge_doc, "enabled", 7, true); mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); mongoc_read_prefs_set_hedge(prefs, &hedge_doc); mlib_diagnostic_pop(); mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, prefs, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " '$readPreference': {" " 'mode': 'secondaryPreferred'," " 'hedge': {'enabled': true}}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); mongoc_read_prefs_destroy(prefs); bson_destroy(&hedge_doc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } void test_client_hedged_reads_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Client/hedged_reads/mongos", test_mongos_hedged_reads_read_pref); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-http.c000066400000000000000000000060161511661753600236440ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include void test_mongoc_http_get(void *unused) { mongoc_http_request_t req; mongoc_http_response_t res; bool r; bson_error_t error = {0}; BSON_UNUSED(unused); _mongoc_http_request_init(&req); _mongoc_http_response_init(&res); /* Basic GET request */ req.method = "GET"; req.host = "localhost"; req.path = "get"; req.port = 18000; r = _mongoc_http_send(&req, mlib_expires_after(mlib_duration(10, s)), false, NULL, &res, &error); ASSERT_OR_PRINT(r, error); ASSERT_WITH_MSG(res.status == 200, "unexpected status code %d\n" "RESPONSE BODY BEGIN\n" "%s" "RESPONSE BODY END\n", res.status, res.body_len > 0 ? res.body : ""); ASSERT_CMPINT(res.body_len, >, 0); _mongoc_http_response_cleanup(&res); } void test_mongoc_http_post(void *unused) { mongoc_http_request_t req; mongoc_http_response_t res; bool r; bson_error_t error = {0}; BSON_UNUSED(unused); _mongoc_http_request_init(&req); _mongoc_http_response_init(&res); /* Basic POST request with a body. */ req.method = "POST"; req.host = "localhost"; req.path = "post"; req.port = 18000; r = _mongoc_http_send(&req, mlib_expires_after(mlib_duration(10, s)), false, NULL, &res, &error); ASSERT_OR_PRINT(r, error); ASSERT_WITH_MSG(res.status == 200, "unexpected status code %d\n" "RESPONSE BODY BEGIN\n" "%s" "RESPONSE BODY END\n", res.status, res.body_len > 0 ? res.body : ""); ASSERT_CMPINT(res.body_len, >, 0); _mongoc_http_response_cleanup(&res); } void test_http_install(TestSuite *suite) { TestSuite_AddFull(suite, "/http/get [uses:simple-http-server-18000]", test_mongoc_http_get, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_offline); TestSuite_AddFull(suite, "/http/post [uses:simple-http-server-18000]", test_mongoc_http_post, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_offline); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-interrupt.c000066400000000000000000000111171511661753600247170ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include static int64_t _time_ms(void) { return bson_get_monotonic_time() / 1000; } BSON_THREAD_FUN(_interrupt, future_void) { future_t *future; future_value_t return_value; mongoc_interrupt_t *interrupt; future = future_void; interrupt = future_get_param(future, 0)->value.void_ptr_value; mlib_sleep_for(10, ms); _mongoc_interrupt_interrupt(interrupt); return_value.type = future_value_void_type; future_resolve(future, return_value); BSON_THREAD_RETURN; } /* Run an interrupt in a separate thread. */ static future_t * _future_interrupt(mongoc_interrupt_t *interrupt) { future_t *future; future_value_t *future_value; future = future_new(future_value_void_type, 1); future_value = future_get_param(future, 0); future_value_set_void_ptr(future_value, (void *)interrupt); future_start(future, _interrupt); return future; } static void test_interrupt(void) { mock_server_t *server; mongoc_interrupt_t *interrupt; mongoc_stream_poll_t *poller; future_t *future; const mongoc_uri_t *uri; mongoc_stream_t *stream; bson_error_t error; interrupt = _mongoc_interrupt_new(10000); /* Poll the interrupt for input. */ poller = bson_malloc0(sizeof(mongoc_stream_poll_t) * 1); poller[0].stream = _mongoc_interrupt_get_stream(interrupt); poller[0].events = POLLIN; /* Test that sending an interrupt before the poll executes quickly. */ { const int64_t started_ms = _time_ms(); poller[0].revents = 0; _mongoc_interrupt_interrupt(interrupt); mongoc_stream_poll(poller, 1, 10000); _mongoc_interrupt_flush(interrupt); ASSERT_CMPTIME(_time_ms() - started_ms, 10000); } /* Test that an interrupt after polling executes quickly. */ { const int64_t started_ms = _time_ms(); poller[0].revents = 0; future = _future_interrupt(interrupt); mongoc_stream_poll(poller, 1, 10000); _mongoc_interrupt_flush(interrupt); ASSERT_CMPTIME(_time_ms() - started_ms, 10000); future_wait(future); future_destroy(future); } /* Flushing with nothing queued up does not block. */ { const int64_t started_ms = _time_ms(); _mongoc_interrupt_flush(interrupt); ASSERT_CMPTIME(_time_ms() - started_ms, 10000); } /* Test interrupting while polling on another socket. */ server = mock_server_new(); mock_server_run(server); uri = mock_server_get_uri(server); stream = mongoc_client_connect_tcp(10000, mongoc_uri_get_hosts(uri), &error); ASSERT_OR_PRINT(stream, error); bson_free(poller); poller = bson_malloc0(sizeof(mongoc_stream_poll_t) * 2); poller[0].stream = _mongoc_interrupt_get_stream(interrupt); poller[0].events = POLLIN; poller[1].stream = stream; poller[1].events = POLLIN; for (int i = 0; i < 10; i++) { const int64_t started_ms = _time_ms(); _mongoc_interrupt_interrupt(interrupt); mongoc_stream_poll(poller, 2, 10000); ASSERT_CMPTIME(_time_ms() - started_ms, 10000); } /* Swap the order of the streams polled. mongoc_stream_poll uses the poll * function associated with the first stream. */ poller[0].revents = 0; poller[0].stream = stream; poller[1].revents = 0; poller[1].stream = _mongoc_interrupt_get_stream(interrupt); for (int i = 0; i < 10; i++) { const int64_t started_ms = _time_ms(); _mongoc_interrupt_interrupt(interrupt); mongoc_stream_poll(poller, 2, 10000); ASSERT_CMPTIME(_time_ms() - started_ms, 10000); } mongoc_stream_destroy(stream); mock_server_destroy(server); _mongoc_interrupt_destroy(interrupt); bson_free(poller); } void test_interrupt_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/interrupt", test_interrupt); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-linux-distro-scanner.c000066400000000000000000000164471511661753600267660ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #ifdef MONGOC_OS_IS_LINUX static void test_read_generic_release_file(void) { char *name; char *version; const char *paths[] = { OS_RELEASE_FILE_DIR "/lol-im-not-here.txt", OS_RELEASE_FILE_DIR "/also-not-here.txt", OS_RELEASE_FILE_DIR "/example-etc-fedora-release.txt", NULL, }; const char *paths2[] = { OS_RELEASE_FILE_DIR "/example-etc-xyz-release-no-delimiter.txt", NULL, }; const char *paths3[] = { OS_RELEASE_FILE_DIR "/empty-file.txt", NULL, }; _mongoc_linux_distro_scanner_read_generic_release_file(paths, &name, &version); ASSERT(name); ASSERT(version); ASSERT_CMPSTR("Fedora", name); ASSERT_CMPSTR("8 (Werewolf)", version); bson_free(name); bson_free(version); _mongoc_linux_distro_scanner_read_generic_release_file(paths2, &name, &version); ASSERT(name); ASSERT_CMPSTR("This one just has name, not that R word", name); ASSERT(version == NULL); bson_free(name); _mongoc_linux_distro_scanner_read_generic_release_file(paths3, &name, &version); ASSERT(name == NULL); ASSERT(version == NULL); _mongoc_linux_distro_scanner_split_line_by_release(" release ", -1, &name, &version); ASSERT(name == NULL); ASSERT(version == NULL); _mongoc_linux_distro_scanner_split_line_by_release("ends with release ", -1, &name, &version); ASSERT_CMPSTR("ends with", name); ASSERT(version == NULL); bson_free(name); _mongoc_linux_distro_scanner_split_line_by_release("", -1, &name, &version); ASSERT_CMPSTR(name, ""); ASSERT(version == NULL); bson_free(name); } static void test_read_key_value_file(void) { char *name = NULL; char *version = NULL; _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-lsb-file.txt", "DISTRIB_ID", -1, &name, "DISTRIB_RELEASE", -1, &version); ASSERT(name); ASSERT_CMPSTR(name, "Ubuntu"); ASSERT(version); ASSERT_CMPSTR(version, "12.04"); bson_free(name); bson_free(version); _mongoc_linux_distro_scanner_read_key_value_file(OS_RELEASE_FILE_DIR "/example-lsb-file-with-super-long-line.txt", "DISTRIB_ID", -1, &name, "DISTRIB_RELEASE", -1, &version); ASSERT(!name); ASSERT(version); ASSERT_CMPSTR(version, "12.04"); bson_free(version); _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release.txt", "NAME", -1, &name, "VERSION_ID", -1, &version); ASSERT_CMPSTR(name, "Fedora"); ASSERT_CMPSTR(version, "17"); bson_free(name); bson_free(version); /* Now try some weird inputs */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release.txt", "ID=", -1, &name, "VERSION_ID=", -1, &version); ASSERT(name == NULL); ASSERT(version == NULL); _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release.txt", "", -1, &name, "", -1, &version); ASSERT(name == NULL); ASSERT(version == NULL); /* Test case where we get one but not the other */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release.txt", "NAME", -1, &name, "VERSION_", -1, &version); ASSERT_CMPSTR(name, "Fedora"); ASSERT(version == NULL); bson_free(name); /* Case where we say the key is the whole line */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release.txt", "NAME", -1, &name, "VERSION_ID=17", -1, &version); ASSERT_CMPSTR(name, "Fedora"); ASSERT(version == NULL); bson_free(name); _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-etc-os-release-ubuntu1604.txt", "NAME", -1, &name, "VERSION_ID", -1, &version); ASSERT_CMPSTR("Ubuntu", name); ASSERT_CMPSTR("16.04", version); bson_free(name); bson_free(version); /* Case where the key is duplicated, make sure we keep first version */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-key-value-file.txt", "key", -1, &name, "normalkey", -1, &version); ASSERT_CMPSTR(name, "first value"); ASSERT_CMPSTR(version, "normalval"); bson_free(name); bson_free(version); /* Case where the key is duplicated, make sure we keep first version */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-key-value-file.txt", "a-key-without-a-value", -1, &name, "normalkey", -1, &version); ASSERT_CMPSTR(name, ""); ASSERT_CMPSTR(version, "normalval"); bson_free(name); bson_free(version); /* Try to get value from a line like: * just-a-key * (No equals, no value) */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-key-value-file.txt", "just-a-key", -1, &name, "normalkey", -1, &version); ASSERT(name == NULL); ASSERT_CMPSTR(version, "normalval"); bson_free(name); bson_free(version); /* Try to get a key which is on line 101 of the file * (we stop reading at line 100) */ _mongoc_linux_distro_scanner_read_key_value_file( OS_RELEASE_FILE_DIR "/example-key-value-file.txt", "lastkey", -1, &name, "normalkey", -1, &version); ASSERT(name == NULL); ASSERT_CMPSTR(version, "normalval"); bson_free(version); } /* We only expect this function to actually read anything on linux platforms */ static void test_distro_scanner_reads(void) { char *name; char *version; _mongoc_linux_distro_scanner_get_distro(&name, &version); #ifdef __linux__ ASSERT(name); ASSERT(strlen(name) > 0); /* Some linux distros don't have a version (like arch) but we should always * return a version (at the very least, we'll return the kernel version) */ ASSERT(version); ASSERT(strlen(version)); #endif bson_free(name); bson_free(version); } #endif void test_linux_distro_scanner_install(TestSuite *suite) { BSON_UNUSED(suite); #ifdef MONGOC_OS_IS_LINUX TestSuite_Add(suite, "/LinuxDistroScanner/test_read_generic_release_file", test_read_generic_release_file); TestSuite_Add(suite, "/LinuxDistroScanner/test_read_key_value_file", test_read_key_value_file); TestSuite_Add(suite, "/LinuxDistroScanner/test_distro_scanner_reads", test_distro_scanner_reads); #endif } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-list.c000066400000000000000000000024051511661753600236360ustar00rootroot00000000000000#include #include #include static void test_mongoc_list_basic(void) { mongoc_list_t *l; l = _mongoc_list_append(NULL, (void *)1ULL); l = _mongoc_list_append(l, (void *)2ULL); l = _mongoc_list_append(l, (void *)3ULL); l = _mongoc_list_prepend(l, (void *)4ULL); ASSERT(l); ASSERT(l->next); ASSERT(l->next->next); ASSERT(l->next->next->next); ASSERT(!l->next->next->next->next); ASSERT(l->data == (void *)4ULL); ASSERT(l->next->data == (void *)1ULL); ASSERT(l->next->next->data == (void *)2ULL); ASSERT(l->next->next->next->data == (void *)3ULL); l = _mongoc_list_remove(l, (void *)4ULL); ASSERT(l->data == (void *)1ULL); ASSERT(l->next->data == (void *)2ULL); ASSERT(l->next->next->data == (void *)3ULL); l = _mongoc_list_remove(l, (void *)2ULL); ASSERT(l->data == (void *)1ULL); ASSERT(l->next->data == (void *)3ULL); ASSERT(!l->next->next); l = _mongoc_list_remove(l, (void *)1ULL); ASSERT(l->data == (void *)3ULL); ASSERT(!l->next); l = _mongoc_list_remove(l, (void *)3ULL); ASSERT(!l); _mongoc_list_destroy(l); } void test_list_install(TestSuite *suite) { TestSuite_Add(suite, "/List/Basic", test_mongoc_list_basic); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-loadbalanced.c000066400000000000000000001022011511661753600252470ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include typedef struct { int server_changed_events; int server_opening_events; int server_closed_events; int topology_changed_events; int topology_opening_events; int topology_closed_events; } stats_t; static void server_changed(const mongoc_apm_server_changed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_changed_get_context(event); context->server_changed_events++; } static void server_opening(const mongoc_apm_server_opening_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_opening_get_context(event); context->server_opening_events++; } static void server_closed(const mongoc_apm_server_closed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_server_closed_get_context(event); context->server_closed_events++; } static void topology_changed(const mongoc_apm_topology_changed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_topology_changed_get_context(event); context->topology_changed_events++; } static void topology_opening(const mongoc_apm_topology_opening_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_topology_opening_get_context(event); context->topology_opening_events++; } static void topology_closed(const mongoc_apm_topology_closed_t *event) { stats_t *context; context = (stats_t *)mongoc_apm_topology_closed_get_context(event); context->topology_closed_events++; } static mongoc_apm_callbacks_t * make_callbacks(void) { mongoc_apm_callbacks_t *cbs; cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_server_changed_cb(cbs, server_changed); mongoc_apm_set_server_opening_cb(cbs, server_opening); mongoc_apm_set_server_closed_cb(cbs, server_closed); mongoc_apm_set_topology_changed_cb(cbs, topology_changed); mongoc_apm_set_topology_opening_cb(cbs, topology_opening); mongoc_apm_set_topology_closed_cb(cbs, topology_closed); return cbs; } static stats_t * set_client_callbacks(mongoc_client_t *client) { mongoc_apm_callbacks_t *cbs; stats_t *stats; ASSERT(client); stats = bson_malloc0(sizeof(stats_t)); cbs = make_callbacks(); mongoc_client_set_apm_callbacks(client, cbs, stats); mongoc_apm_callbacks_destroy(cbs); if (test_suite_debug_output()) { mongoc_structured_log_opts_t *log_opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_max_level_for_all_components(log_opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG); mongoc_client_set_structured_log_opts(client, log_opts); mongoc_structured_log_opts_destroy(log_opts); } return stats; } static stats_t * set_client_pool_callbacks(mongoc_client_pool_t *pool) { mongoc_apm_callbacks_t *cbs; stats_t *stats; ASSERT(pool); stats = bson_malloc0(sizeof(stats_t)); cbs = make_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, cbs, stats); mongoc_apm_callbacks_destroy(cbs); return stats; } static void free_and_assert_stats(stats_t *stats) { ASSERT_CMPINT(stats->topology_opening_events, ==, 1); /* See https://specifications.readthedocs.io/en/latest/load-balancers/load-balancers/ * Expected TopologyDescriptionChangedEvent instances: * 1. TopologyType Unknown -> TopologyType LoadBalanced with ServerType Unknown * 2. TopologyType LoadBalanced with ServerType Unknown -> ServerType LoadBalancer * 3. LoadBalanced LoadBalancer -> Unknown */ ASSERT_CMPINT(stats->topology_changed_events, ==, 3); ASSERT_CMPINT(stats->server_opening_events, ==, 1); ASSERT_CMPINT(stats->server_changed_events, ==, 1); ASSERT_CMPINT(stats->server_closed_events, ==, 1); ASSERT_CMPINT(stats->topology_closed_events, ==, 1); bson_free(stats); } static void test_loadbalanced_sessions_supported(void *unused) { mongoc_client_t *client; mongoc_client_session_t *session; bson_error_t error; BSON_UNUSED(unused); client = test_framework_new_default_client(); session = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session, error); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } static void test_loadbalanced_sessions_do_not_expire(void *unused) { mongoc_client_t *client; mongoc_client_session_t *session1; mongoc_client_session_t *session2; bson_error_t error; bson_t *session1_lsid; bson_t *session2_lsid; mc_tpld_modification tdmod; BSON_UNUSED(unused); client = test_framework_new_default_client(); /* Mock a timeout so session expiration applies. */ tdmod = mc_tpld_modify_begin(client->topology); tdmod.new_td->session_timeout_minutes = 1; mc_tpld_modify_commit(tdmod); /* Start two sessions, to ensure that pooled sessions remain in the pool when * the pool is accessed. */ session1 = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session1, error); session2 = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session2, error); session1_lsid = bson_copy(mongoc_client_session_get_lsid(session1)); session2_lsid = bson_copy(mongoc_client_session_get_lsid(session2)); /* Expire both sessions. */ session1->server_session->last_used_usec = 1; session2->server_session->last_used_usec = 1; mongoc_client_session_destroy(session1); mongoc_client_session_destroy(session2); /* Get a new session, it should reuse the most recently pushed session2. */ session2 = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session2, error); if (!bson_equal(mongoc_client_session_get_lsid(session2), session2_lsid)) { test_error( "Session not reused: %s != %s", tmp_json(mongoc_client_session_get_lsid(session2)), tmp_json(session2_lsid)); } session1 = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session1, error); if (!bson_equal(mongoc_client_session_get_lsid(session1), session1_lsid)) { test_error( "Session not reused: %s != %s", tmp_json(mongoc_client_session_get_lsid(session1)), tmp_json(session1_lsid)); } bson_destroy(session1_lsid); bson_destroy(session2_lsid); mongoc_client_session_destroy(session1); mongoc_client_session_destroy(session2); mongoc_client_destroy(client); } /* Test that invalid loadBalanced URI configurations are validated during client * construction. */ static void test_loadbalanced_client_uri_validation(void *unused) { mongoc_client_t *client; mongoc_uri_t *uri; bson_error_t error; BSON_UNUSED(unused); uri = mongoc_uri_new("mongodb://localhost:27017"); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_DIRECTCONNECTION, true); client = mongoc_client_new_from_uri_with_error(uri, &error); BSON_ASSERT(!client); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "URI with \"loadBalanced\" enabled must not contain " "option \"directConnection\" enabled"); mongoc_uri_destroy(uri); } /* Test basic connectivity to a load balanced cluster. */ static void test_loadbalanced_connect_single(void *unused) { mongoc_client_t *client; bson_error_t error; bool ok; mongoc_server_description_t *monitor_sd; stats_t *stats; BSON_UNUSED(unused); client = test_framework_new_default_client(); stats = set_client_callbacks(client); ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); /* Ensure the server description is unchanged and remains as type * LoadBalancer. */ monitor_sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); ASSERT_CMPSTR("LoadBalancer", mongoc_server_description_type(monitor_sd)); mongoc_server_description_destroy(monitor_sd); mongoc_client_destroy(client); free_and_assert_stats(stats); } static void test_loadbalanced_connect_pooled(void *unused) { mongoc_client_pool_t *pool; mongoc_client_t *client; bson_error_t error; bool ok; mongoc_server_description_t *monitor_sd; stats_t *stats; BSON_UNUSED(unused); pool = test_framework_new_default_client_pool(); stats = set_client_pool_callbacks(pool); client = mongoc_client_pool_pop(pool); ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); /* Ensure the server description is unchanged and remains as type * LoadBalancer. */ monitor_sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); ASSERT_CMPSTR("LoadBalancer", mongoc_server_description_type(monitor_sd)); mongoc_server_description_destroy(monitor_sd); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); free_and_assert_stats(stats); } /* Ensure that server selection on single threaded clients establishes a * connection against load balanced clusters. */ static void test_loadbalanced_server_selection_establishes_connection_single(void *unused) { mongoc_client_t *client; bson_error_t error; mongoc_server_description_t *monitor_sd; mongoc_server_description_t *handshake_sd; stats_t *stats; BSON_UNUSED(unused); client = test_framework_new_default_client(); stats = set_client_callbacks(client); monitor_sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); ASSERT_CMPSTR("LoadBalancer", mongoc_server_description_type(monitor_sd)); /* Ensure that a connection has been established by getting the handshake's * server description. */ handshake_sd = mongoc_client_get_handshake_description(client, monitor_sd->id, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); ASSERT_CMPSTR("Mongos", mongoc_server_description_type(handshake_sd)); mongoc_server_description_destroy(monitor_sd); mongoc_server_description_destroy(handshake_sd); mongoc_client_destroy(client); free_and_assert_stats(stats); } /* Test that the 5 second cooldown does not apply when establishing a new * connection to the load balancer after a network error. */ static void test_loadbalanced_cooldown_is_bypassed_single(void *unused) { mongoc_client_t *client; bson_error_t error; bool ok; stats_t *stats; mongoc_server_description_t *monitor_sd; BSON_UNUSED(unused); client = test_framework_new_default_client(); stats = set_client_callbacks(client); ok = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': { 'times': 2 }, " "'data': {'closeConnection': true, 'failCommands': ['ping', " "'hello']}}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); BSON_ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); /* The next attempted command should attempt to scan, and fail when * performing the handshake with the hello command. */ ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); BSON_ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not establish stream"); /* Failing to "scan" would normally cause the node to be in cooldown and fail * to reconnect (until the 5 second period has passed). But in load balancer * mode cooldown is bypassed, so the subsequent connect attempt should * succeed. */ ok = mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); /* Ensure the server description is unchanged and remains as type * LoadBalancer. */ monitor_sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); ASSERT_CMPSTR("LoadBalancer", mongoc_server_description_type(monitor_sd)); mongoc_server_description_destroy(monitor_sd); mongoc_client_destroy(client); free_and_assert_stats(stats); } /* Tests: * - loadBalanced: true is added to the handshake * - serviceId is set in the server description. */ #define LB_HELLO \ tmp_str("{'ismaster': true," \ " 'minWireVersion': %d," \ " 'maxWireVersion': %d," \ " 'msg': 'isdbgrid'," \ " 'serviceId': {'$oid': 'AAAAAAAAAAAAAAAAAAAAAAAA'}}", \ WIRE_VERSION_MIN, \ WIRE_VERSION_5_0) static void test_loadbalanced_handshake_sends_loadbalanced(void) { mock_server_t *server; mongoc_client_t *client; mongoc_uri_t *uri; request_t *request; future_t *future; bson_error_t error; mongoc_server_description_t *monitor_sd; mongoc_server_description_t *handshake_sd; bson_oid_t expected; const bson_oid_t *actual; server = mock_server_new(); mock_server_run(server); mock_server_auto_endsessions(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); client = test_framework_client_new_from_uri(uri, NULL); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_any_hello_with_match(server, "{'loadBalanced': true}", "{'loadBalanced': true}"); reply_to_request_simple(request, LB_HELLO); request_destroy(request); request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); monitor_sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(monitor_sd, error); handshake_sd = mongoc_client_get_handshake_description(client, 1, NULL /* opts */, &error); ASSERT_OR_PRINT(handshake_sd, error); bson_oid_init_from_string(&expected, "AAAAAAAAAAAAAAAAAAAAAAAA"); actual = &handshake_sd->service_id; BSON_ASSERT(actual); ASSERT_CMPOID(actual, &expected); mongoc_server_description_destroy(handshake_sd); mongoc_server_description_destroy(monitor_sd); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mock_server_destroy(server); } /* Tests that a connection is rejected if the handshake reply does not include a * serviceID field. */ #define NON_LB_HELLO \ tmp_str("{'ismaster': true," \ " 'minWireVersion': %d," \ " 'maxWireVersion': %d," \ " 'msg': 'isdbgrid'}", \ WIRE_VERSION_MIN, \ WIRE_VERSION_5_0) static void test_loadbalanced_handshake_rejects_non_loadbalanced(void) { mock_server_t *server; mongoc_client_t *client; mongoc_uri_t *uri; request_t *request; future_t *future; bson_error_t error; server = mock_server_new(); mock_server_run(server); mock_server_auto_endsessions(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); client = test_framework_client_new_from_uri(uri, NULL); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_any_hello_with_match(server, "{'loadBalanced': true}", "{'loadBalanced': true}"); reply_to_request_simple(request, NON_LB_HELLO); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_INVALID_LOAD_BALANCER, "Driver attempted to initialize in load balancing " "mode, but the server does not support this mode"); mongoc_uri_destroy(uri); mongoc_client_destroy(client); mock_server_destroy(server); } /* Test that an error before the MongoDB handshake completes does NOT go through * SDAM error handling flow. */ static void test_pre_handshake_error_does_not_clear_pool(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client_1; mongoc_client_t *client_2; future_t *future; request_t *request; bson_error_t error; const bson_t *match_loadBalanced = tmp_bson("{'loadBalanced': true}"); server = mock_server_new(); mock_server_auto_endsessions(server); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); pool = mongoc_client_pool_new(uri); client_1 = mongoc_client_pool_pop(pool); client_2 = mongoc_client_pool_pop(pool); /* client_1 opens a new connection to send "ping" */ future = future_client_command_simple( client_1, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); reply_to_request_simple(request, LB_HELLO); request_destroy(request); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* client_2 attempts to open a new connection, but receives an error on the * handshake. */ future = future_client_command_simple( client_2, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); capture_logs(true); /* hide Failed to buffer logs. */ reply_to_request_with_hang_up(request); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to send"); future_destroy(future); /* client_1 sends another "ping". */ future = future_client_command_simple( client_1, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The connection pool must not have been cleared. It can reuse the previous * connection. The next command is the "ping". */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_client_pool_push(pool, client_2); mongoc_client_pool_push(pool, client_1); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); } #define LB_HELLO_A \ tmp_str("{'ismaster': true," \ " 'minWireVersion': %d," \ " 'maxWireVersion': %d," \ " 'msg': 'isdbgrid'," \ " 'serviceId': {'$oid': 'AAAAAAAAAAAAAAAAAAAAAAAA'}}", \ WIRE_VERSION_MIN, \ WIRE_VERSION_5_0) #define LB_HELLO_B \ tmp_str("{'ismaster': true," \ " 'minWireVersion': %d," \ " 'maxWireVersion': %d," \ " 'msg': 'isdbgrid'," \ " 'serviceId': {'$oid': 'BBBBBBBBBBBBBBBBBBBBBBBB'}}", \ WIRE_VERSION_MIN, \ WIRE_VERSION_5_0) /* Test that a post handshake error clears the pool ONLY for connections with * the same serviceID. Test that a post handshake error does not mark the server * unknown. */ static void test_post_handshake_error_clears_pool(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client_1_serviceid_a; mongoc_client_t *client_2_serviceid_a; mongoc_client_t *client_3_serviceid_b; future_t *future; request_t *request; bson_error_t error; mongoc_server_description_t *monitor_sd; const bson_t *match_loadBalanced = tmp_bson("{'loadBalanced': true}"); server = mock_server_new(); mock_server_auto_endsessions(server); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_LOADBALANCED, true); pool = mongoc_client_pool_new(uri); client_1_serviceid_a = mongoc_client_pool_pop(pool); client_2_serviceid_a = mongoc_client_pool_pop(pool); client_3_serviceid_b = mongoc_client_pool_pop(pool); /* client_1_serviceid_a opens a new connection to send "ping" */ future = future_client_command_simple( client_1_serviceid_a, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); reply_to_request_simple(request, LB_HELLO_A); request_destroy(request); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* client_2_serviceid_a also opens a new connection and receives the same * service ID. */ future = future_client_command_simple( client_2_serviceid_a, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); reply_to_request_simple(request, LB_HELLO_A); request_destroy(request); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* client_3_serviceid_b also opens a new connection, but receives a different * service ID. */ future = future_client_command_simple( client_3_serviceid_b, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); reply_to_request_simple(request, LB_HELLO_B); request_destroy(request); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* client_1_serviceid_a receives a network error. */ future = future_client_command_simple( client_1_serviceid_a, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); capture_logs(true); /* hide Failed to buffer logs. */ reply_to_request_with_hang_up(request); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Failed to send"); future_destroy(future); /* Assert that the server is NOT marked Unknown. */ monitor_sd = mongoc_client_select_server(client_1_serviceid_a, true, NULL /* read prefs */, &error); ASSERT_CMPSTR("LoadBalancer", mongoc_server_description_type(monitor_sd)); /* This should have invalidated the connection for client_2_serviceid_a. */ future = future_client_command_simple( client_2_serviceid_a, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* A new connection is opened. */ request = mock_server_receives_hello_op_msg(server); ASSERT(request_matches_msg(request, MONGOC_MSG_NONE, &match_loadBalanced, 1)); BSON_ASSERT(request); reply_to_request_simple(request, LB_HELLO_A); request_destroy(request); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* But the connection for client_3_serviceid_b should still be OK. */ future = future_client_command_simple( client_3_serviceid_b, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The "ping" command is sent. */ request = mock_server_receives_msg(server, 0, tmp_bson("{'ping': 1}")); BSON_ASSERT(request); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); mongoc_server_description_destroy(monitor_sd); mongoc_client_pool_push(pool, client_3_serviceid_b); mongoc_client_pool_push(pool, client_2_serviceid_a); mongoc_client_pool_push(pool, client_1_serviceid_a); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); } static int skip_if_not_loadbalanced(void) { return test_framework_is_loadbalanced() ? 1 : 0; } static void store_last_command_started_callback(const mongoc_apm_command_started_t *event) { bson_t **last_command = mongoc_apm_command_started_get_context(event); const bson_t *cmd = mongoc_apm_command_started_get_command(event); bson_destroy(*last_command); *last_command = bson_copy(cmd); } // `test_loadbalanced_sends_recoveryToken` is a regression test for // CDRIVER-4718. Ensure that a `recoveryToken` is included in the outgoing // `commitTransaction` and `abortTransaction` commands when connected to a load // balanced cluster. static void test_loadbalanced_sends_recoveryToken(void *unused) { mongoc_client_t *client; bson_error_t error; bson_t *last_command = NULL; BSON_UNUSED(unused); client = test_framework_new_default_client(); // Set a callback to store the most recent command started. { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(cbs, store_last_command_started_callback); mongoc_client_set_apm_callbacks(client, cbs, &last_command); mongoc_apm_callbacks_destroy(cbs); } mongoc_client_session_t *session = mongoc_client_start_session(client, NULL /* opts */, &error); ASSERT_OR_PRINT(session, error); mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); // Commit a transaction. Expect `commitTransaction` to include // `recoveryToken`. { bool ok = mongoc_client_session_start_transaction(session, NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); bson_t *insert_opts = tmp_bson("{}"); ok = mongoc_client_session_append(session, insert_opts, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_collection_insert_one(coll, tmp_bson("{}"), insert_opts, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_session_commit_transaction(session, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); ASSERT_MATCH(last_command, "{'commitTransaction': 1, 'recoveryToken': { '$exists': true } }"); } // Abort a transaction. Expect `abortTransaction` to include // `recoveryToken`. { bool ok = mongoc_client_session_start_transaction(session, NULL /* opts */, &error); ASSERT_OR_PRINT(ok, error); bson_t *insert_opts = tmp_bson("{}"); ok = mongoc_client_session_append(session, insert_opts, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_collection_insert_one(coll, tmp_bson("{}"), insert_opts, NULL, &error); ASSERT_OR_PRINT(ok, error); ok = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(ok, error); ASSERT_MATCH(last_command, "{'abortTransaction': 1, 'recoveryToken': { '$exists': true } }"); } mongoc_collection_destroy(coll); mongoc_client_session_destroy(session); mongoc_client_destroy(client); bson_destroy(last_command); } void test_loadbalanced_install(TestSuite *suite) { TestSuite_AddFull(suite, "/loadbalanced/sessions/supported [lock:live-server]", test_loadbalanced_sessions_supported, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); TestSuite_AddFull(suite, "/loadbalanced/sessions/do_not_expire [lock:live-server]", test_loadbalanced_sessions_do_not_expire, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); TestSuite_AddFull(suite, "/loadbalanced/client_uri_validation [lock:live-server]", test_loadbalanced_client_uri_validation, NULL /* ctx */, NULL /* dtor */, NULL); TestSuite_AddFull(suite, "/loadbalanced/connect/single [lock:live-server]", test_loadbalanced_connect_single, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); TestSuite_AddFull(suite, "/loadbalanced/connect/pooled [lock:live-server]", test_loadbalanced_connect_pooled, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); TestSuite_AddFull(suite, "/loadbalanced/server_selection_establishes_connection/single [lock:live-server]", test_loadbalanced_server_selection_establishes_connection_single, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); TestSuite_AddFull(suite, "/loadbalanced/cooldown_is_bypassed/single [lock:live-server]", test_loadbalanced_cooldown_is_bypassed_single, NULL /* dtor */, NULL /* ctx */, skip_if_not_loadbalanced, test_framework_skip_if_no_failpoint); TestSuite_AddMockServerTest( suite, "/loadbalanced/handshake_sends_loadbalanced", test_loadbalanced_handshake_sends_loadbalanced); TestSuite_AddMockServerTest( suite, "/loadbalanced/handshake_rejects_non_loadbalanced", test_loadbalanced_handshake_rejects_non_loadbalanced); TestSuite_AddMockServerTest( suite, "/loadbalanced/pre_handshake_error_does_not_clear_pool", test_pre_handshake_error_does_not_clear_pool); TestSuite_AddMockServerTest( suite, "/loadbalanced/post_handshake_error_clears_pool", test_post_handshake_error_clears_pool); TestSuite_AddFull(suite, "/loadbalanced/sends_recoveryToken [lock:live-server]", test_loadbalanced_sends_recoveryToken, NULL /* ctx */, NULL /* dtor */, skip_if_not_loadbalanced); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-log.c000066400000000000000000000110141511661753600234400ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include struct log_state { mongoc_log_func_t handler; void *data; bool trace_enabled; }; static void save_state(struct log_state *state) { _mongoc_log_get_handler(&state->handler, &state->data); state->trace_enabled = _mongoc_log_trace_is_enabled(); } static void restore_state(const struct log_state *state) { mongoc_log_set_handler(state->handler, state->data); if (state->trace_enabled) { mongoc_log_trace_enable(); } else { mongoc_log_trace_disable(); } } struct log_func_data { mongoc_log_level_t log_level; char *log_domain; char *message; }; void log_func(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { struct log_func_data *data = (struct log_func_data *)user_data; data->log_level = log_level; data->log_domain = bson_strdup(log_domain); data->message = bson_strdup(message); } static void test_mongoc_log_handler(void) { struct log_state old_state; struct log_func_data data; save_state(&old_state); mongoc_log_set_handler(log_func, &data); #pragma push_macro("MONGOC_LOG_DOMAIN") #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "my-custom-domain" MONGOC_WARNING("warning!"); #pragma pop_macro("MONGOC_LOG_DOMAIN") ASSERT_CMPINT(data.log_level, ==, MONGOC_LOG_LEVEL_WARNING); ASSERT_CMPSTR(data.log_domain, "my-custom-domain"); ASSERT_CMPSTR(data.message, "warning!"); restore_state(&old_state); bson_free(data.log_domain); bson_free(data.message); } static void test_mongoc_log_null(void) { struct log_state old_state; save_state(&old_state); mongoc_log_set_handler(NULL, NULL); /* doesn't seg fault */ MONGOC_ERROR("error!"); MONGOC_DEBUG("debug!"); restore_state(&old_state); } static int should_run_trace_tests(void) { return MONGOC_TRACE_ENABLED; } static int should_not_run_trace_tests(void) { return !should_run_trace_tests(); } static void test_mongoc_log_trace_enabled(void *context) { struct log_state old_state; struct log_func_data data; BSON_UNUSED(context); save_state(&old_state); mongoc_log_set_handler(log_func, &data); mongoc_log_trace_enable(); TRACE("%s", "Conscript reporting!"); ASSERT_CMPINT(data.log_level, ==, MONGOC_LOG_LEVEL_TRACE); ASSERT_CONTAINS(data.message, " Conscript reporting!"); bson_free(data.log_domain); bson_free(data.message); TRACE("%s", "Awaiting orders"); ASSERT_CMPINT(data.log_level, ==, MONGOC_LOG_LEVEL_TRACE); ASSERT_CONTAINS(data.message, "Awaiting orders"); mongoc_log_trace_disable(); TRACE("%s", "For the Union"); ASSERT_CMPINT(data.log_level, ==, MONGOC_LOG_LEVEL_TRACE); ASSERT_CONTAINS(data.message, "Awaiting orders"); bson_free(data.log_domain); bson_free(data.message); mongoc_log_trace_enable(); TRACE("%s", "For home country"); ASSERT_CMPINT(data.log_level, ==, MONGOC_LOG_LEVEL_TRACE); ASSERT_CONTAINS(data.message, "For home country"); restore_state(&old_state); bson_free(data.log_domain); bson_free(data.message); } static void test_mongoc_log_trace_disabled(void *context) { struct log_state old_state; struct log_func_data data = {(mongoc_log_level_t)-1, 0, NULL}; BSON_UNUSED(context); save_state(&old_state); mongoc_log_set_handler(log_func, &data); TRACE("%s", "Conscript reporting!"); ASSERT_CMPUINT(data.log_level, ==, (mongoc_log_level_t)-1); restore_state(&old_state); } void test_log_install(TestSuite *suite) { TestSuite_Add(suite, "/Log/basic", test_mongoc_log_handler); TestSuite_AddFull(suite, "/Log/trace/enabled", test_mongoc_log_trace_enabled, NULL, NULL, should_run_trace_tests); TestSuite_AddFull( suite, "/Log/trace/disabled", test_mongoc_log_trace_disabled, NULL, NULL, should_not_run_trace_tests); TestSuite_Add(suite, "/Log/null", test_mongoc_log_null); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-long-namespace.c000066400000000000000000000424621511661753600255630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include typedef struct { char *ns; char *ns_coll; char *ns_db; mongoc_client_t *client; mongoc_client_session_t *client_session; bson_t opts_w_session; mongoc_database_t *db; mongoc_collection_t *coll; } test_fixture_t; /* Ensure that the command started callback reports the correct database name. */ static void command_started(const mongoc_apm_command_started_t *event) { test_fixture_t *test_fixture; test_fixture = mongoc_apm_command_started_get_context(event); if (0 == strcmp(mongoc_apm_command_started_get_command_name(event), "renameCollection")) { ASSERT_CMPSTR(mongoc_apm_command_started_get_database_name(event), "admin"); /* Always runs on admin. */ } else { ASSERT_CMPSTR(mongoc_apm_command_started_get_database_name(event), test_fixture->ns_db); } } /* Test long namespaces. Prior to SERVER-32959, the total namespace limit was * 120 characters. */ static void test_fixture_init(test_fixture_t *test_fixture, uint32_t db_len, uint32_t coll_len) { bool ret; bson_error_t error; mongoc_apm_callbacks_t *callbacks; test_fixture->ns_db = bson_malloc(db_len + 1); memset(test_fixture->ns_db, 'd', db_len); test_fixture->ns_db[db_len] = '\0'; test_fixture->ns_coll = bson_malloc(coll_len + 1); memset(test_fixture->ns_coll, 'c', coll_len); test_fixture->ns_coll[coll_len] = '\0'; test_fixture->ns = bson_strdup_printf("%s.%s", test_fixture->ns_db, test_fixture->ns_coll); /* Construct client, database, and collection objects. */ test_fixture->client = test_framework_new_default_client(); test_framework_set_ssl_opts(test_fixture->client); mongoc_client_set_error_api(test_fixture->client, MONGOC_ERROR_API_VERSION_2); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, command_started); mongoc_client_set_apm_callbacks(test_fixture->client, callbacks, test_fixture); test_fixture->db = mongoc_client_get_database(test_fixture->client, test_fixture->ns_db); ASSERT_CMPSTR(test_fixture->db->name, test_fixture->ns_db); test_fixture->coll = mongoc_database_get_collection(test_fixture->db, test_fixture->ns_coll); ASSERT_CMPSTR(test_fixture->coll->collection, test_fixture->ns_coll); ASSERT_CMPSIZE_T(test_fixture->coll->collectionlen, ==, strlen(test_fixture->ns_coll)); ASSERT_CMPSTR(test_fixture->coll->db, test_fixture->ns_db); ASSERT_CMPSTR(test_fixture->coll->ns, test_fixture->ns); ASSERT_CMPSIZE_T(test_fixture->coll->nslen, ==, strlen(test_fixture->ns)); /* Drop 'coll'. */ ret = mongoc_collection_drop(test_fixture->coll, &error); /* ignore a 'ns not found' error */ if (!ret && NULL == strstr(error.message, "ns not found")) { /* unexpected error. */ test_error("unexpected error: %s\n", error.message); } /* Explicitly create 'coll', so it shows up in listCollections. */ mongoc_collection_destroy(test_fixture->coll); test_fixture->coll = mongoc_database_create_collection(test_fixture->db, test_fixture->ns_coll, NULL /* opts */, &error); ASSERT_OR_PRINT(test_fixture->coll, error); ASSERT_CMPSTR(test_fixture->coll->collection, test_fixture->ns_coll); ASSERT_CMPSIZE_T(test_fixture->coll->collectionlen, ==, strlen(test_fixture->ns_coll)); ASSERT_CMPSTR(test_fixture->coll->db, test_fixture->ns_db); ASSERT_CMPSTR(test_fixture->coll->ns, test_fixture->ns); ASSERT_CMPSIZE_T(test_fixture->coll->nslen, ==, strlen(test_fixture->ns)); mongoc_apm_callbacks_destroy(callbacks); } static void test_fixture_cleanup(test_fixture_t *test_fixture) { /* Clear the APM callbacks, since endSessions runs on the admin database. */ mongoc_client_set_apm_callbacks(test_fixture->client, NULL, NULL); mongoc_collection_destroy(test_fixture->coll); mongoc_database_destroy(test_fixture->db); mongoc_client_destroy(test_fixture->client); bson_free(test_fixture->ns_coll); bson_free(test_fixture->ns_db); bson_free(test_fixture->ns); } /* Test crud operations. This should test legacy OP_QUERY cursors and legacy * write ops, which were storing fixed size namespaces using * MONGOC_NAMESPACE_MAX. */ static void crud(test_fixture_t *test_fixture) { bson_error_t error; bool ret; mongoc_cursor_t *cursor; const bson_t *found; /* Insert. */ ret = mongoc_collection_insert_one( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Find that document back. */ cursor = mongoc_collection_find_with_opts( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* read prefs */); ret = mongoc_cursor_next(cursor, &found); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error) && ret, error); ASSERT_MATCH(found, "{'_id': 'hello'}"); ASSERT_CMPSTR(cursor->ns, test_fixture->ns); ASSERT_CURSOR_DONE(cursor); mongoc_cursor_destroy(cursor); /* Update it. */ ret = mongoc_collection_update_one(test_fixture->coll, tmp_bson("{'_id': 'hello'}"), tmp_bson("{'$set': {'x':1}}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Find that document back to ensure the document in the right collection was * updated. */ cursor = mongoc_collection_find_with_opts( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* read prefs */); ret = mongoc_cursor_next(cursor, &found); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error) && ret, error); ASSERT_MATCH(found, "{'_id': 'hello', 'x': 1}"); ASSERT_CMPSTR(cursor->ns, test_fixture->ns); ASSERT_CURSOR_DONE(cursor); mongoc_cursor_destroy(cursor); /* Delete it. */ ret = mongoc_collection_delete_one( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Attempt to find that document back to ensure the document in the right * collection was deleted. */ cursor = mongoc_collection_find_with_opts( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* read prefs */); ASSERT_CURSOR_DONE(cursor); ASSERT_CMPSTR(cursor->ns, test_fixture->ns); mongoc_cursor_destroy(cursor); } /* Test cursor getmore, which constructed a namespace with MONGOC_NAMESPACE_MAX. */ static void getmore(test_fixture_t *test_fixture) { bson_error_t error; bool ret; mongoc_cursor_t *cursor; const bson_t *found; /* Insert two documents. */ ret = mongoc_collection_insert_one( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_insert_one( test_fixture->coll, tmp_bson("{'_id': 'world'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Find each document back in two separate batches. */ cursor = mongoc_collection_find_with_opts( test_fixture->coll, tmp_bson("{}"), tmp_bson("{'batchSize': 1}"), NULL /* read prefs */); ret = mongoc_cursor_next(cursor, &found); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error) && ret, error); ASSERT_MATCH(found, "{'_id': 'hello'}"); ASSERT_CMPSTR(cursor->ns, test_fixture->ns); /* not DONE, next call will send a getMore */ BSON_ASSERT(cursor->state != DONE); ret = mongoc_cursor_next(cursor, &found); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error) && ret, error); ASSERT_MATCH(found, "{'_id': 'world'}"); ASSERT_CMPSTR(cursor->ns, test_fixture->ns); ASSERT_CURSOR_DONE(cursor); mongoc_cursor_destroy(cursor); } /* Test change streams, which store a namespace in mongoc_change_stream_t */ static void change_stream(test_fixture_t *test_fixture) { mongoc_change_stream_t *change_stream; const bson_t *found; bool ret; bson_error_t error; mongoc_client_session_t *client_session; bson_t opts_w_session; client_session = mongoc_client_start_session(test_fixture->client, NULL /* opts */, &error); ASSERT_OR_PRINT(client_session, error); bson_init(&opts_w_session); ret = mongoc_client_session_append(client_session, &opts_w_session, &error); ASSERT_OR_PRINT(ret, error); /* Create a change stream. Do all operations within a session, to guarantee * change stream sees the subsequent insert operation. */ change_stream = mongoc_collection_watch(test_fixture->coll, tmp_bson("{}"), &opts_w_session); ASSERT_CMPSTR(change_stream->db, test_fixture->ns_db); ASSERT_CMPSTR(change_stream->coll, test_fixture->ns_coll); /* Insert. */ ret = mongoc_collection_insert_one( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Get a change stream event. */ ret = mongoc_change_stream_next(change_stream, &found); ASSERT_OR_PRINT(!mongoc_change_stream_error_document(change_stream, &error, NULL) && ret, error); ASSERT_MATCH(found, "{'operationType': 'insert', 'ns': { 'db': '%s', 'coll': '%s' }}", test_fixture->ns_db, test_fixture->ns_coll); mongoc_change_stream_destroy(change_stream); mongoc_client_session_destroy(client_session); bson_destroy(&opts_w_session); } /* Check whether a collection exists. */ static void _check_existence(mongoc_client_t *client, char *ns_db, char *ns_coll, bool should_exist) { mongoc_database_t *db; char **db_names; char **coll_names; bool db_exists = false; bool coll_exists = false; char **iter; bson_error_t error; ASSERT(client); db = mongoc_client_get_database(client, ns_db); db_names = mongoc_client_get_database_names_with_opts(client, NULL /* opts */, &error); coll_names = mongoc_database_get_collection_names_with_opts(db, NULL /* opts */, &error); for (iter = db_names; *iter != NULL; ++iter) { if (0 == strcmp(ns_db, *iter)) { db_exists = true; } } if (!db_exists && should_exist) { test_error("Database %s does not exist but should", ns_db); } for (iter = coll_names; *iter != NULL; ++iter) { if (0 == strcmp(ns_coll, *iter)) { coll_exists = true; } } if (coll_exists && !should_exist) { test_error("Collection %s exists but shouldn't", ns_coll); } if (!coll_exists && should_exist) { test_error("Collection %s does not exist but should", ns_coll); } bson_strfreev(db_names); bson_strfreev(coll_names); mongoc_database_destroy(db); } /* Test mongoc_collection_rename, which constructed a namespace * with MONGOC_NAMESPACE_MAX */ static void collection_rename(test_fixture_t *test_fixture) { bool ret; bson_error_t error; char *new_db; char *new_coll; char *new_ns; mongoc_client_t *client; new_db = bson_strdup_printf("renamed_db"); new_coll = bson_strdup_printf("renamed_%s", test_fixture->ns_coll); new_ns = bson_strdup_printf("%s.%s", new_db, new_coll); /* Insert to create source namespace. */ ret = mongoc_collection_insert_one( test_fixture->coll, tmp_bson("{'_id': 'hello'}"), NULL /* opts */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); ret = mongoc_collection_rename(test_fixture->coll, new_db, new_coll, true, &error); ASSERT_OR_PRINT(ret, error); /* The fields in the collection struct are updated to the new names. */ ASSERT_CMPSTR(test_fixture->coll->db, new_db); ASSERT_CMPSTR(test_fixture->coll->collection, new_coll); ASSERT_CMPSTR(test_fixture->coll->ns, new_ns); ASSERT_CMPSIZE_T(test_fixture->coll->nslen, ==, strlen(new_ns)); ASSERT_CMPSIZE_T(test_fixture->coll->collectionlen, ==, strlen(new_coll)); /* Check that source collections do not exist anymore. Use a separate client * so commands * don't show up in APM on test fixture's client. */ client = test_framework_new_default_client(); _check_existence(client, test_fixture->ns_db, test_fixture->ns_coll, false); /* Check that the new collection exists. */ _check_existence(client, new_db, new_coll, true); mongoc_client_destroy(client); bson_free(new_db); bson_free(new_coll); bson_free(new_ns); } typedef void (*run_test_fn_t)(test_fixture_t *fixture); typedef struct { run_test_fn_t test_fn; } run_test_helper_t; static void run_test(void *ctx) { test_fixture_t test_fixture; const run_test_fn_t one_test = ((run_test_helper_t *)ctx)->test_fn; /* Small names. */ test_fixture_init(&test_fixture, 32, 32); one_test(&test_fixture); test_fixture_cleanup(&test_fixture); /* Large collection name. */ test_fixture_init(&test_fixture, 32, 100); one_test(&test_fixture); test_fixture_cleanup(&test_fixture); /* Maximum valid database name is still 64 characters. */ test_fixture_init(&test_fixture, 63, 32); one_test(&test_fixture); test_fixture_cleanup(&test_fixture); /* Large for both names. */ test_fixture_init(&test_fixture, 63, 100); one_test(&test_fixture); test_fixture_cleanup(&test_fixture); } static void unsupported_long_coll(void *unused) { bson_error_t error; bool ret; char *long_coll; mongoc_client_t *client; mongoc_collection_t *coll; BSON_UNUSED(unused); long_coll = bson_malloc(200); memset(long_coll, 'd', 199); long_coll[199] = '\0'; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "test", long_coll); /* Insert. */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL /* opts */, NULL /* reply */, &error); BSON_ASSERT(!ret); /* Error code changed in 4.0 and the message in 4.2. Just validate an error * happened. */ BSON_ASSERT(error.code); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_free(long_coll); } /* 63 characters is still the database length limit. Test this on all server * versions. */ static void unsupported_long_db(void) { mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error; bool ret; char *long_db; long_db = bson_malloc(65); memset(long_db, 'd', 64); long_db[64] = '\0'; client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, long_db, "test"); /* Insert. */ ret = mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL /* opts */, NULL /* reply */, &error); BSON_ASSERT(!ret); /* Error code changed in 3.4. Just validate an error happened. */ BSON_ASSERT(error.code); mongoc_collection_destroy(coll); mongoc_client_destroy(client); bson_free(long_db); } #define add_long_namespace_test(_name, _test_fn, ...) \ if (1) { \ run_test_helper_t *const helper = bson_malloc(sizeof(*helper)); \ *helper = (run_test_helper_t){.test_fn = (_test_fn)}; \ TestSuite_AddFull(suite, _name, run_test, &bson_free, helper, __VA_ARGS__); \ } else \ ((void)0) void test_long_namespace_install(TestSuite *suite) { /* MongoDB 4.4 (wire version 9) introduced support for long namespaces in * SERVER-32959 */ add_long_namespace_test( "/long_namespace/crud [lock:live-server]", crud, test_framework_skip_if_max_wire_version_less_than_9); add_long_namespace_test( "/long_namespace/getmore [lock:live-server]", getmore, test_framework_skip_if_max_wire_version_less_than_9); add_long_namespace_test("/long_namespace/change_stream [lock:live-server]", change_stream, test_framework_skip_if_not_rs_version_9, test_framework_skip_if_no_sessions); add_long_namespace_test("/long_namespace/collection_rename [lock:live-server]", collection_rename, test_framework_skip_if_max_wire_version_less_than_9, test_framework_skip_if_mongos); TestSuite_AddFull(suite, "/long_namespace/unsupported_long_coll [lock:live-server]", unsupported_long_coll, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_more_than_8); TestSuite_AddLive(suite, "/long_namespace/unsupported_long_db", unsupported_long_db); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-max-staleness.c000066400000000000000000000307221511661753600254520ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include static int64_t get_max_staleness(const mongoc_client_t *client) { const mongoc_read_prefs_t *prefs; ASSERT(client); prefs = mongoc_client_get_read_prefs(client); return mongoc_read_prefs_get_max_staleness_seconds(prefs); } /* the next few tests are from max-staleness-tests.rst */ static void test_mongoc_client_max_staleness(void) { mongoc_client_t *client; client = test_framework_client_new(NULL, NULL); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)-1); mongoc_client_destroy(client); client = test_framework_client_new("mongodb://a/?" MONGOC_URI_READPREFERENCE "=secondary", NULL); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)-1); mongoc_client_destroy(client); /* -1 is the default, means "no max staleness" */ client = test_framework_client_new("mongodb://a/?" MONGOC_URI_MAXSTALENESSSECONDS "=-1", NULL); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)-1); mongoc_client_destroy(client); client = test_framework_client_new( "mongodb://a/?" MONGOC_URI_READPREFERENCE "=primary&" MONGOC_URI_MAXSTALENESSSECONDS "=-1", NULL); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)-1); mongoc_client_destroy(client); /* no " MONGOC_URI_MAXSTALENESSSECONDS " with primary mode */ capture_logs(true); ASSERT(!test_framework_client_new("mongodb://a/?" MONGOC_URI_MAXSTALENESSSECONDS "=120", NULL)); ASSERT_CAPTURED_LOG(MONGOC_URI_MAXSTALENESSSECONDS "=120", MONGOC_LOG_LEVEL_WARNING, "Invalid readPreferences"); capture_logs(true); ASSERT(!test_framework_client_new( "mongodb://a/?" MONGOC_URI_READPREFERENCE "=primary&" MONGOC_URI_MAXSTALENESSSECONDS "=120", NULL)); ASSERT_CAPTURED_LOG(MONGOC_URI_MAXSTALENESSSECONDS "=120", MONGOC_LOG_LEVEL_WARNING, "Invalid readPreferences"); capture_logs(false); /* zero is prohibited */ capture_logs(true); client = test_framework_client_new( "mongodb://a/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_MAXSTALENESSSECONDS "=0", NULL); ASSERT_CAPTURED_LOG(MONGOC_URI_MAXSTALENESSSECONDS "=0", MONGOC_LOG_LEVEL_WARNING, "Unsupported value for \"" MONGOC_URI_MAXSTALENESSSECONDS "\": \"0\""); capture_logs(false); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)-1); mongoc_client_destroy(client); client = test_framework_client_new( "mongodb://a/?" MONGOC_URI_MAXSTALENESSSECONDS "=120&" MONGOC_URI_READPREFERENCE "=secondary", NULL); ASSERT_CMPINT64(get_max_staleness(client), ==, (int64_t)120); mongoc_client_destroy(client); /* float is ignored */ capture_logs(true); ASSERT(!test_framework_client_new( "mongodb://a/?" MONGOC_URI_READPREFERENCE "=secondary&" MONGOC_URI_MAXSTALENESSSECONDS "=10.5", NULL)); ASSERT_CAPTURED_LOG(MONGOC_URI_MAXSTALENESSSECONDS "=10.5", MONGOC_LOG_LEVEL_WARNING, "Unsupported value for \"maxstalenessseconds\""); capture_logs(false); /* 1 is allowed, it'll be rejected once we begin server selection */ client = test_framework_client_new( "mongodb://a/?" MONGOC_URI_READPREFERENCE "=secondary&" MONGOC_URI_MAXSTALENESSSECONDS "=1", NULL); ASSERT_EQUAL_DOUBLE(get_max_staleness(client), 1); mongoc_client_destroy(client); } static void test_mongos_max_staleness_read_pref(void) { mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_read_prefs_t *prefs; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* count command with mode "secondary", no MONGOC_URI_MAXSTALENESSSECONDS. */ prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " '$readPreference': {" " 'mode': 'secondary'," " 'maxStalenessSeconds': {'$exists': false}}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); /* count command with mode "secondary". MONGOC_URI_MAXSTALENESSSECONDS=1 is * allowed by client, although in real life mongos will reject it */ mongoc_read_prefs_set_max_staleness_seconds(prefs, 1); mongoc_collection_set_read_prefs(collection, prefs); mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " '$readPreference': {" " 'mode': 'secondary'," " 'maxStalenessSeconds': {'$numberLong': '1'}}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); /* For all read preference modes that are not 'primary', drivers MUST set * readPreference. */ mongoc_read_prefs_set_mode(prefs, MONGOC_READ_SECONDARY_PREFERRED); mongoc_read_prefs_set_max_staleness_seconds(prefs, MONGOC_NO_MAX_STALENESS); mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, NULL, NULL, &error); request = mock_server_receives_msg( server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', '$readPreference': {'mode': 'secondaryPreferred'}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); /* CDRIVER-3633: with readPreference mode secondaryPreferred and * maxStalenessSeconds set, readPreference MUST be sent. */ mongoc_read_prefs_set_max_staleness_seconds(prefs, 1); mongoc_collection_set_read_prefs(collection, prefs); future = future_collection_estimated_document_count(collection, NULL, NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db'," " '$readPreference': {" " 'mode': 'secondaryPreferred'," " 'maxStalenessSeconds': {'$numberLong': '1'}}}")); reply_to_request_simple(request, "{'ok': 1, 'n': 1}"); ASSERT_OR_PRINT(1 == future_get_int64_t(future), error); request_destroy(request); future_destroy(future); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void _test_last_write_date(bool pooled) { mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bool r; mongoc_server_description_t *s0, *s1; int64_t delta; uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); } mongoc_uri_destroy(uri); collection = get_test_collection(client, "test_last_write_date"); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mlib_sleep_for(1, s); s0 = mongoc_topology_select(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL, NULL, &error); ASSERT_OR_PRINT(s0, error); mlib_sleep_for(1, s); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mlib_sleep_for(1, s); s1 = mongoc_topology_select(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL, NULL, &error); ASSERT_OR_PRINT(s1, error); ASSERT_CMPINT64(s1->last_write_date_ms, !=, (int64_t)-1); /* lastWriteDate increased by roughly one second - be lenient, just check * it increased by less than 10 seconds */ delta = s1->last_write_date_ms - s0->last_write_date_ms; ASSERT_CMPINT64(delta, >, (int64_t)0); ASSERT_CMPINT64(delta, <, (int64_t)10 * 1000); mongoc_server_description_destroy(s0); mongoc_server_description_destroy(s1); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_last_write_date(void *ctx) { BSON_UNUSED(ctx); _test_last_write_date(false); } static void test_last_write_date_pooled(void *ctx) { BSON_UNUSED(ctx); _test_last_write_date(true); } /* run only if wire version is older than 5 */ static void _test_last_write_date_absent(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; mongoc_server_description_t *sd; if (pooled) { pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); } sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, NULL, NULL, &error); ASSERT_OR_PRINT(sd, error); /* lastWriteDate absent */ ASSERT_CMPINT64(sd->last_write_date_ms, ==, (int64_t)-1); mongoc_server_description_destroy(sd); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } } static void test_last_write_date_absent(void *ctx) { BSON_UNUSED(ctx); _test_last_write_date_absent(false); } static void test_last_write_date_absent_pooled(void *ctx) { BSON_UNUSED(ctx); _test_last_write_date_absent(true); } static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite(suite, JSON_DIR, "max_staleness", &test_server_selection_logic_cb); } void test_client_max_staleness_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_Add(suite, "/Client/max_staleness", test_mongoc_client_max_staleness); TestSuite_AddMockServerTest(suite, "/Client/max_staleness/mongos", test_mongos_max_staleness_read_pref); TestSuite_AddFull(suite, "/Client/last_write_date [lock:live-server][timeout:30]", test_last_write_date, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Client/last_write_date/pooled [lock:live-server][timeout:30]", test_last_write_date_pooled, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Client/last_write_date_absent [lock:live-server]", test_last_write_date_absent, NULL, NULL, test_framework_skip_if_replset); TestSuite_AddFull(suite, "/Client/last_write_date_absent/pooled [lock:live-server]", test_last_write_date_absent_pooled, NULL, NULL, test_framework_skip_if_replset); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-mongos-pinning.c000066400000000000000000000150431511661753600256270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include static void add_multiple_mongoses(mongoc_uri_t *uri) { bson_error_t error; /* TODO CDRIVER-3285, fix this to be dynamic */ ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27017", &error), error); ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27018", &error), error); } static void test_new_transaction_unpins(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error; mongoc_client_session_t *session; mongoc_host_list_t *servers = NULL; mongoc_cursor_t *cursor; bson_t *opts; int i; BSON_UNUSED(ctx); uri = test_framework_get_uri(); add_multiple_mongoses(uri); /* Increase localThresholdMS to avoid false positives. Nodes will be discovered with the first call to server selection. */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 1000); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); /* Create a collection. */ coll = mongoc_client_get_collection(client, "test", "test"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &error), error); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session != NULL, error); opts = bson_new(); ASSERT_OR_PRINT(mongoc_client_session_append(session, opts, &error), error); /* Under one transaction, insert a document. */ ASSERT_OR_PRINT(mongoc_client_session_start_transaction(session, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_session_commit_transaction(session, NULL, &error), error); /* Then, 50 times, start new transactions. Each time we start a new transaction, the session should be un-pinned, so by statistics, we should balance the new transactions across both mongos. */ for (i = 0; i < 50; i++) { mongoc_host_list_t cursor_host; const bson_t *doc; ASSERT_OR_PRINT(mongoc_client_session_start_transaction(session, NULL, &error), error); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), opts, NULL); ASSERT(mongoc_cursor_next(cursor, &doc)); mongoc_cursor_get_host(cursor, &cursor_host); _mongoc_host_list_upsert(&servers, &cursor_host); ASSERT_OR_PRINT(mongoc_client_session_commit_transaction(session, NULL, &error), error); mongoc_cursor_destroy(cursor); } ASSERT_CMPSIZE_T(_mongoc_host_list_length(servers), ==, 2u); bson_destroy(opts); _mongoc_host_list_destroy_all(servers); mongoc_uri_destroy(uri); mongoc_client_session_destroy(session); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } static void test_non_transaction_unpins(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error; mongoc_client_session_t *session; mongoc_host_list_t *servers = NULL; mongoc_cursor_t *cursor; bson_t *opts; int i; BSON_UNUSED(ctx); uri = test_framework_get_uri(); add_multiple_mongoses(uri); /* Increase localThresholdMS to avoid false positives. Nodes will be discovered with the first call to server selection. */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 1000); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); /* Create a collection. */ coll = mongoc_client_get_collection(client, "test", "test"); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &error), error); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session != NULL, error); opts = bson_new(); ASSERT_OR_PRINT(mongoc_client_session_append(session, opts, &error), error); /* Under one transaction, insert a document. */ ASSERT_OR_PRINT(mongoc_client_session_start_transaction(session, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), opts, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_session_commit_transaction(session, NULL, &error), error); /* After our initial transaction, the session should become un-pinned if we run further operations on the session. By statistics, new operations should balance across both mongos. */ for (i = 0; i < 50; i++) { mongoc_host_list_t cursor_host; const bson_t *doc; cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), opts, NULL); ASSERT(mongoc_cursor_next(cursor, &doc)); mongoc_cursor_get_host(cursor, &cursor_host); _mongoc_host_list_upsert(&servers, &cursor_host); mongoc_cursor_destroy(cursor); } ASSERT_CMPSIZE_T(_mongoc_host_list_length(servers), ==, 2u); bson_destroy(opts); _mongoc_host_list_destroy_all(servers); mongoc_uri_destroy(uri); mongoc_client_session_destroy(session); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_mongos_pinning_install(TestSuite *suite) { TestSuite_AddFull(suite, "/mongos_pinning/new_transaction_unpins [lock:live-server]", test_new_transaction_unpins, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_not_mongos); TestSuite_AddFull(suite, "/mongos_pinning/non_transaction_unpins [lock:live-server]", test_non_transaction_unpins, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_not_mongos); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-ocsp-cache.c000066400000000000000000000134161511661753600246740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #if defined(MONGOC_ENABLE_OCSP_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10101000L #include static OCSP_CERTID * create_cert_id(long serial) { OCSP_CERTID *id; X509_NAME *issuer_name; ASN1_BIT_STRING *issuer_key; ASN1_INTEGER *serial_number; issuer_name = X509_NAME_new(); issuer_key = ASN1_BIT_STRING_new(); serial_number = ASN1_INTEGER_new(); ASN1_INTEGER_set(serial_number, serial); id = OCSP_cert_id_new(EVP_sha1(), issuer_name, issuer_key, serial_number); ASN1_BIT_STRING_free(issuer_key); ASN1_INTEGER_free(serial_number); X509_NAME_free(issuer_name); return id; } #define CLEAR_CACHE \ do { \ _mongoc_ocsp_cache_cleanup(); \ _mongoc_ocsp_cache_init(); \ BSON_ASSERT(_mongoc_ocsp_cache_length() == 0); \ } while (0) #define ASSERT_TIME_EQUAL(_a, _b) \ do { \ int pday, psec; \ ASN1_TIME_diff(&pday, &psec, (_a), (_b)); \ BSON_ASSERT(pday == 0); \ BSON_ASSERT(psec == 0); \ } while (0) static void test_mongoc_cache_insert(void) { ASN1_GENERALIZEDTIME *this_update_in, *next_update_in; ASN1_GENERALIZEDTIME *this_update_out, *next_update_out; int i, size = 5, status = V_OCSP_CERTSTATUS_GOOD, reason = OCSP_REVOKED_STATUS_NOSTATUS; CLEAR_CACHE; next_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL) + 999); this_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL)); for (i = 0; i < size; i++) { int s, r; OCSP_CERTID *id = create_cert_id(i); BSON_ASSERT(!_mongoc_ocsp_cache_get_status(id, &s, &r, &this_update_out, &next_update_out)); _mongoc_ocsp_cache_set_resp(id, status, reason, this_update_in, next_update_in); OCSP_CERTID_free(id); } BSON_ASSERT(_mongoc_ocsp_cache_length() == size); for (i = 0; i < size; i++) { OCSP_CERTID *id = create_cert_id(i); int s, r; BSON_ASSERT(_mongoc_ocsp_cache_get_status(id, &s, &r, &this_update_out, &next_update_out)); BSON_ASSERT(status == s); BSON_ASSERT(reason == r); ASSERT_TIME_EQUAL(next_update_in, next_update_out); ASSERT_TIME_EQUAL(this_update_in, this_update_out); OCSP_CERTID_free(id); } CLEAR_CACHE; ASN1_GENERALIZEDTIME_free(this_update_in); ASN1_GENERALIZEDTIME_free(next_update_in); } static void test_mongoc_cache_update(void) { OCSP_CERTID *id; ASN1_GENERALIZEDTIME *next_update_in, *next_update_out, *this_update_out; int status, reason; CLEAR_CACHE; next_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL)); id = create_cert_id(1); _mongoc_ocsp_cache_set_resp(id, V_OCSP_CERTSTATUS_GOOD, 0, NULL, next_update_in); BSON_ASSERT(_mongoc_ocsp_cache_length() == 1); BSON_ASSERT(_mongoc_ocsp_cache_get_status(id, &status, &reason, &this_update_out, &next_update_out)); BSON_ASSERT(status == V_OCSP_CERTSTATUS_GOOD); ASN1_GENERALIZEDTIME_free(next_update_in); next_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL) + 999 /* some time in the future */); _mongoc_ocsp_cache_set_resp(id, V_OCSP_CERTSTATUS_REVOKED, 0, NULL, next_update_in); BSON_ASSERT(_mongoc_ocsp_cache_length() == 1); BSON_ASSERT(_mongoc_ocsp_cache_get_status(id, &status, &reason, &this_update_out, &next_update_out)); BSON_ASSERT(status == V_OCSP_CERTSTATUS_REVOKED); ASN1_GENERALIZEDTIME_free(next_update_in); next_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL) - 999 /* some time in the past */); _mongoc_ocsp_cache_set_resp(id, V_OCSP_CERTSTATUS_GOOD, 0, NULL, next_update_in); BSON_ASSERT(_mongoc_ocsp_cache_length() == 1); BSON_ASSERT(_mongoc_ocsp_cache_get_status(id, &status, &reason, &this_update_out, &next_update_out)); BSON_ASSERT(status == V_OCSP_CERTSTATUS_REVOKED); CLEAR_CACHE; ASN1_GENERALIZEDTIME_free(next_update_in); OCSP_CERTID_free(id); } static void test_mongoc_cache_remove_expired_cert(void) { ASN1_GENERALIZEDTIME *this_update_in, *next_update_in; int status = V_OCSP_CERTSTATUS_GOOD, reason = OCSP_REVOKED_STATUS_NOSTATUS; OCSP_CERTID *id = create_cert_id(1); CLEAR_CACHE; next_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL) - 1); this_update_in = ASN1_GENERALIZEDTIME_set(NULL, time(NULL) - 999); _mongoc_ocsp_cache_set_resp(id, status, reason, this_update_in, next_update_in); BSON_ASSERT(_mongoc_ocsp_cache_length() == 1); BSON_ASSERT(!_mongoc_ocsp_cache_get_status(id, NULL, NULL, NULL, NULL)); BSON_ASSERT(_mongoc_ocsp_cache_length() == 0); OCSP_CERTID_free(id); ASN1_GENERALIZEDTIME_free(next_update_in); ASN1_GENERALIZEDTIME_free(this_update_in); CLEAR_CACHE; } void test_ocsp_cache_install(TestSuite *suite) { TestSuite_Add(suite, "/OCSPCache/insert", test_mongoc_cache_insert); TestSuite_Add(suite, "/OCSPCache/update", test_mongoc_cache_update); TestSuite_Add(suite, "/OCSPCache/remove_expired_cert", test_mongoc_cache_remove_expired_cert); } #else extern int no_mongoc_ocsp; #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-oidc-cache.c000066400000000000000000000265231511661753600246510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include typedef struct { int call_count; bool returns_null; } callback_ctx_t; #define PLACEHOLDER_TOKEN "PLACEHOLDER_TOKEN" static mongoc_oidc_credential_t * oidc_callback_fn(mongoc_oidc_callback_params_t *params) { callback_ctx_t *ctx = mongoc_oidc_callback_params_get_user_data(params); ASSERT(ctx); ctx->call_count += 1; if (ctx->returns_null) { return NULL; } return mongoc_oidc_credential_new(PLACEHOLDER_TOKEN); } static void test_oidc_cache_works(void) { bool found_in_cache = false; bson_error_t error; mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); callback_ctx_t ctx = {0}; // Expect error if no callback set: { ASSERT(!mongoc_oidc_cache_get_token(cache, &found_in_cache, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "no callback set"); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } // Set a callback: { mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_callback_set_user_data(cb, &ctx); mongoc_oidc_cache_set_user_callback(cache, cb); mongoc_oidc_callback_destroy(cb); } // Expect callback is called to fetch token: { char *token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 1); ASSERT(!found_in_cache); bson_free(token); } // Expect token is cached: { char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT(token); bson_free(token); } // Expect callback is not called if token is cached: { char *token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 1); ASSERT(found_in_cache); bson_free(token); } // Invalidating a different token has no effect: { mongoc_oidc_cache_invalidate_token(cache, "different-token"); char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT(token); bson_free(token); } // Invalidating same token clears cache: { char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT(token); mongoc_oidc_cache_invalidate_token(cache, token); bson_free(token); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } mongoc_oidc_cache_destroy(cache); } static void test_oidc_cache_waits_between_calls(void) { bool found_in_cache = false; bson_error_t error; mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); callback_ctx_t ctx = {0}; // Set a callback: { mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_callback_set_user_data(cb, &ctx); mongoc_oidc_cache_set_user_callback(cache, cb); mongoc_oidc_callback_destroy(cb); } mlib_time_point const start = mlib_now(); // Expect callback is called to fetch token: { char *token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 1); ASSERT(!found_in_cache); bson_free(token); } // Invalidate token to clear cache: { char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT(token); mongoc_oidc_cache_invalidate_token(cache, token); bson_free(token); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } const int64_t expected_delay = 90; // Use shorter time. Windows appears to sleep slightly less. // Expect duration less than delay: { mlib_duration diff = mlib_time_difference(mlib_now(), start); ASSERT_CMPINT64(mlib_milliseconds_count(diff), <, expected_delay); } // Fetch token again: { char *token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 2); ASSERT(!found_in_cache); bson_free(token); } // Expect delay: { mlib_duration diff = mlib_time_difference(mlib_now(), start); ASSERT_CMPINT64(mlib_milliseconds_count(diff), >=, expected_delay); } mongoc_oidc_cache_destroy(cache); } static void test_oidc_cache_set_callback(void) { mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); ASSERT(!mongoc_oidc_cache_has_user_callback(cache)); // Can set a callback: { mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_cache_set_user_callback(cache, cb); ASSERT(mongoc_oidc_cache_has_user_callback(cache)); mongoc_oidc_callback_destroy(cb); } // Can clear a callback: { mongoc_oidc_cache_set_user_callback(cache, NULL); ASSERT(!mongoc_oidc_cache_has_user_callback(cache)); } mongoc_oidc_cache_destroy(cache); } typedef struct { int call_count; int64_t last_arg; } sleep_ctx_t; static void sleep_callback_fn(int64_t usec, void *user_data) { ASSERT(user_data); sleep_ctx_t *ctx = (sleep_ctx_t *)user_data; ctx->call_count += 1; ctx->last_arg = usec; } static void test_oidc_cache_set_sleep(void) { callback_ctx_t ctx = {0}; sleep_ctx_t sleep_ctx = {0}; mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); // Set a callback to test: { mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_callback_set_user_data(cb, &ctx); mongoc_oidc_cache_set_user_callback(cache, cb); mongoc_oidc_callback_destroy(cb); } // Can use a custom sleep function: { bool found_in_cache = false; bson_error_t error; char *token; // Set a custom sleep function: mongoc_oidc_cache_set_usleep_fn(cache, sleep_callback_fn, &sleep_ctx); // First call to get_token does not sleep: token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 1); ASSERT_CMPINT(sleep_ctx.call_count, ==, 0); ASSERT(!found_in_cache); // Invalidate cache to trigger another call: mongoc_oidc_cache_invalidate_token(cache, token); bson_free(token); // Second call to get_token sleeps to ensure at least 100ms between calls: token = mongoc_oidc_cache_get_token(cache, &found_in_cache, &error); ASSERT_OR_PRINT(token, error); ASSERT_CMPSTR(token, PLACEHOLDER_TOKEN); ASSERT_CMPINT(ctx.call_count, ==, 2); ASSERT_CMPINT(sleep_ctx.call_count, ==, 1); ASSERT_CMPINT64(sleep_ctx.last_arg, >, 0); ASSERT_CMPINT64(sleep_ctx.last_arg, <=, 100 * 1000); // at most 100ms ASSERT(!found_in_cache); bson_free(token); } mongoc_oidc_cache_destroy(cache); } static void test_oidc_cache_set_cached_token(void) { mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); // Can set a cached token: { mongoc_oidc_cache_set_cached_token(cache, PLACEHOLDER_TOKEN); char *got = mongoc_oidc_cache_get_cached_token(cache); ASSERT_CMPSTR(got, PLACEHOLDER_TOKEN); bson_free(got); } // Can clear cached token: { mongoc_oidc_cache_set_cached_token(cache, NULL); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } mongoc_oidc_cache_destroy(cache); } static void test_oidc_cache_propagates_error(void) { // Test a callback returning NULL. bool found_in_cache = false; bson_error_t error; mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); callback_ctx_t ctx = {.returns_null = true}; // Set a callback: { mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_callback_set_user_data(cb, &ctx); mongoc_oidc_cache_set_user_callback(cache, cb); mongoc_oidc_callback_destroy(cb); } // Expect error: { ASSERT(!mongoc_oidc_cache_get_token(cache, &found_in_cache, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "callback failed"); ASSERT(!found_in_cache); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } mongoc_oidc_cache_destroy(cache); } static void test_oidc_cache_invalidate(void) { mongoc_oidc_cache_t *cache = mongoc_oidc_cache_new(); // Can invalidate when nothing cached: { ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); mongoc_oidc_cache_invalidate_token(cache, "foobar"); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } // Cache a token: { mongoc_oidc_cache_set_cached_token(cache, "foo"); char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT_CMPSTR(token, "foo"); bson_free(token); } // Invalidating a different token has no effect: { mongoc_oidc_cache_invalidate_token(cache, "bar"); char *token = mongoc_oidc_cache_get_cached_token(cache); ASSERT_CMPSTR(token, "foo"); bson_free(token); } // Invalidating same token clears cache: { mongoc_oidc_cache_invalidate_token(cache, "foo"); ASSERT(!mongoc_oidc_cache_get_cached_token(cache)); } mongoc_oidc_cache_destroy(cache); } // test_oidc_connection_cache tests the connection token cache. static void test_oidc_connection_cache(void) { mongoc_oidc_connection_cache_t *cache = mongoc_oidc_connection_cache_new(); ASSERT(!mongoc_oidc_connection_cache_get(cache)); // Can set a cached token: { mongoc_oidc_connection_cache_set(cache, PLACEHOLDER_TOKEN); char *got = mongoc_oidc_connection_cache_get(cache); ASSERT_CMPSTR(got, PLACEHOLDER_TOKEN); bson_free(got); } // Can clear cached token: { mongoc_oidc_connection_cache_set(cache, NULL); ASSERT(!mongoc_oidc_connection_cache_get(cache)); } mongoc_oidc_connection_cache_destroy(cache); } void test_mongoc_oidc_install(TestSuite *suite) { TestSuite_Add(suite, "/oidc/cache/works", test_oidc_cache_works); TestSuite_Add(suite, "/oidc/cache/set_callback", test_oidc_cache_set_callback); TestSuite_Add(suite, "/oidc/cache/set_sleep", test_oidc_cache_set_sleep); TestSuite_Add(suite, "/oidc/cache/set_cached_token", test_oidc_cache_set_cached_token); TestSuite_Add(suite, "/oidc/cache/propagates_error", test_oidc_cache_propagates_error); TestSuite_Add(suite, "/oidc/cache/invalidate", test_oidc_cache_invalidate); TestSuite_Add(suite, "/oidc/cache/waits_between_calls", test_oidc_cache_waits_between_calls); TestSuite_Add(suite, "/oidc/connection_cache", test_oidc_connection_cache); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-oidc-callback.c000066400000000000000000000145271511661753600253430ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include // #include #include static mongoc_oidc_credential_t * _test_oidc_callback_fn_cb(mongoc_oidc_callback_params_t *params) { BSON_UNUSED(params); test_error("should not be invoked"); } static void test_oidc_callback_new(void) { // Invalid arguments. { ASSERT(!mongoc_oidc_callback_new(NULL)); } mongoc_oidc_callback_t *const callback = mongoc_oidc_callback_new(&_test_oidc_callback_fn_cb); ASSERT(mongoc_oidc_callback_get_fn(callback) == &_test_oidc_callback_fn_cb); // Initial values. { ASSERT(!mongoc_oidc_callback_get_user_data(callback)); } // Normal values. { int user_data = 0; mongoc_oidc_callback_set_user_data(callback, &user_data); ASSERT(mongoc_oidc_callback_get_user_data(callback) == &user_data); } // "Reset" values. { mongoc_oidc_callback_set_user_data(callback, NULL); ASSERT(!mongoc_oidc_callback_get_user_data(callback)); } mongoc_oidc_callback_destroy(callback); } static void test_oidc_callback_copy(void) { int user_data = 0; mongoc_oidc_callback_t *const callback = mongoc_oidc_callback_new(&_test_oidc_callback_fn_cb); mongoc_oidc_callback_set_user_data(callback, &user_data); mongoc_oidc_callback_t *callback_copy = mongoc_oidc_callback_copy(callback); ASSERT(mongoc_oidc_callback_get_fn(callback_copy) == &_test_oidc_callback_fn_cb); ASSERT(mongoc_oidc_callback_get_user_data(callback_copy) == &user_data); mongoc_oidc_callback_destroy(callback_copy); mongoc_oidc_callback_destroy(callback); } static void test_oidc_callback_params(void) { mongoc_oidc_callback_params_t *const params = mongoc_oidc_callback_params_new(); // Initial values. ASSERT(!mongoc_oidc_callback_params_get_timeout(params)); ASSERT_CMPSTR(mongoc_oidc_callback_params_get_username(params), NULL); ASSERT_CMPINT32(mongoc_oidc_callback_params_get_version(params), ==, MONGOC_PRIVATE_OIDC_CALLBACK_API_VERSION); ASSERT(!mongoc_oidc_callback_params_get_cancelled_with_timeout(params)); // Input parameters. { // Normal values. { mongoc_oidc_callback_params_set_timeout(params, 123); { char username[] = "username"; mongoc_oidc_callback_params_set_username(params, username); username[0] = '\0'; // Ensure a copy was made. } mongoc_oidc_callback_params_set_version(params, 123); const int64_t *timeout = mongoc_oidc_callback_params_get_timeout(params); ASSERT(timeout); ASSERT_CMPINT64(*timeout, ==, 123); ASSERT_CMPSTR(mongoc_oidc_callback_params_get_username(params), "username"); ASSERT_CMPINT32(mongoc_oidc_callback_params_get_version(params), ==, 123); } // "Reset" values. { mongoc_oidc_callback_params_set_username(params, NULL); mongoc_oidc_callback_params_unset_timeout(params); mongoc_oidc_callback_params_set_version(params, MONGOC_PRIVATE_OIDC_CALLBACK_API_VERSION); ASSERT_CMPSTR(mongoc_oidc_callback_params_get_username(params), NULL); ASSERT(!mongoc_oidc_callback_params_get_timeout(params)); ASSERT_CMPINT32(mongoc_oidc_callback_params_get_version(params), ==, MONGOC_PRIVATE_OIDC_CALLBACK_API_VERSION); } } // Out parameters. { // Normal values. { mongoc_oidc_callback_params_cancel_with_timeout(params); ASSERT(mongoc_oidc_callback_params_get_cancelled_with_timeout(params)); } // "Reset" values. { mongoc_oidc_callback_params_set_cancelled_with_timeout(params, false); ASSERT(!mongoc_oidc_callback_params_get_cancelled_with_timeout(params)); } } // Owning resources. { mongoc_oidc_callback_params_set_username(params, "must be freed"); } mongoc_oidc_callback_params_destroy(params); } static void test_oidc_credential(void) { // Normal. { char token[] = "token"; mongoc_oidc_credential_t *const cred = mongoc_oidc_credential_new(token); token[0] = '\0'; // Ensure a copy was made. ASSERT_CMPSTR(mongoc_oidc_credential_get_access_token(cred), "token"); ASSERT(!mongoc_oidc_credential_get_expires_in(cred)); mongoc_oidc_credential_destroy(cred); } // Normal with expires_in. { char token[] = "token"; mongoc_oidc_credential_t *const cred = mongoc_oidc_credential_new_with_expires_in(token, 123); token[0] = '\0'; // Ensure a copy was made. ASSERT_CMPSTR(mongoc_oidc_credential_get_access_token(cred), "token"); const int64_t *const expires_in = mongoc_oidc_credential_get_expires_in(cred); ASSERT(expires_in); ASSERT_CMPINT64(*expires_in, ==, 123); mongoc_oidc_credential_destroy(cred); } // expires_in == 0 is a valid argument. { mongoc_oidc_credential_t *const cred = mongoc_oidc_credential_new_with_expires_in("token", 0); ASSERT_CMPSTR(mongoc_oidc_credential_get_access_token(cred), "token"); const int64_t *const expires_in = mongoc_oidc_credential_get_expires_in(cred); ASSERT(expires_in); ASSERT_CMPINT64(*expires_in, ==, 0); mongoc_oidc_credential_destroy(cred); } // Invalid arguments. { ASSERT(!mongoc_oidc_credential_new(NULL)); ASSERT(!mongoc_oidc_credential_new_with_expires_in(NULL, 123)); ASSERT(!mongoc_oidc_credential_new_with_expires_in("token", -1)); } } void test_mongoc_oidc_callback_install(TestSuite *suite) { TestSuite_Add(suite, "/oidc/callback/new", test_oidc_callback_new); TestSuite_Add(suite, "/oidc/callback/copy", test_oidc_callback_copy); TestSuite_Add(suite, "/oidc/callback/params", test_oidc_callback_params); TestSuite_Add(suite, "/oidc/callback/credential", test_oidc_credential); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-oidc.c000066400000000000000000001001541511661753600236010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include static char * read_test_token(void) { FILE *token_file = fopen("/tmp/tokens/test_machine", "r"); ASSERT(token_file); // Determine length of token: ASSERT(0 == fseek(token_file, 0, SEEK_END)); long token_len = ftell(token_file); ASSERT(token_len > 0); ASSERT(0 == fseek(token_file, 0, SEEK_SET)); // Read file into buffer: char *token = bson_malloc(token_len + 1); size_t nread = fread(token, 1, token_len, token_file); ASSERT(nread == (size_t)token_len); token[token_len] = '\0'; fclose(token_file); return token; } typedef struct { bool validate_params; bool return_null; bool return_bad_token; bool return_bad_token_after_first_call; } callback_config_t; typedef struct { int call_count; callback_config_t config; } callback_ctx_t; static mongoc_oidc_credential_t * oidc_callback_fn(mongoc_oidc_callback_params_t *params) { callback_ctx_t *ctx = mongoc_oidc_callback_params_get_user_data(params); ASSERT(ctx); ctx->call_count += 1; if (ctx->config.return_null) { return NULL; } if (ctx->config.return_bad_token) { return mongoc_oidc_credential_new("bad_token"); } if (ctx->config.return_bad_token_after_first_call && ctx->call_count > 1) { return mongoc_oidc_credential_new("bad_token"); } if (ctx->config.validate_params) { const int64_t *timeout = mongoc_oidc_callback_params_get_timeout(params); ASSERT(timeout); // Expect the timeout to be set to 60 seconds from the start. ASSERT_CMPINT64(*timeout, >=, bson_get_monotonic_time()); ASSERT_CMPINT64(*timeout, <=, bson_get_monotonic_time() + 60 * 1000 * 1000); int version = mongoc_oidc_callback_params_get_version(params); ASSERT_CMPINT(version, ==, 1); const char *username = mongoc_oidc_callback_params_get_username(params); ASSERT(!username); } char *token = read_test_token(); mongoc_oidc_credential_t *cred = mongoc_oidc_credential_new(token); bson_free(token); return cred; } typedef struct { mongoc_client_pool_t *pool; // May be NULL. mongoc_client_t *client; callback_ctx_t ctx; } test_fixture_t; typedef struct { bool use_pool; bool use_error_api_v1; callback_config_t callback_config; } test_config_t; static test_fixture_t * test_fixture_new(test_config_t cfg) { test_fixture_t *tf = bson_malloc0(sizeof(*tf)); mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017"); // Direct connect for simpler op counters. mongoc_uri_set_auth_mechanism(uri, "MONGODB-OIDC"); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false); // Disable retryable reads per spec. mongoc_oidc_callback_t *oidc_callback = mongoc_oidc_callback_new(oidc_callback_fn); tf->ctx.config = cfg.callback_config; mongoc_oidc_callback_set_user_data(oidc_callback, &tf->ctx); if (cfg.use_pool) { tf->pool = mongoc_client_pool_new(uri); mongoc_client_pool_set_error_api(tf->pool, MONGOC_ERROR_API_VERSION_2); ASSERT(mongoc_client_pool_set_oidc_callback(tf->pool, oidc_callback)); tf->client = mongoc_client_pool_pop(tf->pool); } else { tf->client = mongoc_client_new_from_uri(uri); mongoc_client_set_error_api(tf->client, MONGOC_ERROR_API_VERSION_2); ASSERT(mongoc_client_set_oidc_callback(tf->client, oidc_callback)); } mongoc_oidc_callback_destroy(oidc_callback); mongoc_uri_destroy(uri); return tf; } static void test_fixture_destroy(test_fixture_t *tf) { if (!tf) { return; } if (tf->pool) { mongoc_client_pool_push(tf->pool, tf->client); mongoc_client_pool_destroy(tf->pool); } else { mongoc_client_destroy(tf->client); } bson_free(tf); } static bool do_find(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *coll = NULL; mongoc_cursor_t *cursor = NULL; bool ret = false; bson_t filter = BSON_INITIALIZER; coll = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(coll, &filter, NULL, NULL); const bson_t *doc; while (mongoc_cursor_next(cursor, &doc)) ; if (mongoc_cursor_error(cursor, error)) { goto fail; } ret = true; fail: mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); return ret; } static void configure_failpoint(const char *failpoint_json) // Configure failpoint on a separate client: { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); // Configure fail point: bson_t *failpoint = tmp_bson(failpoint_json); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", failpoint, NULL, NULL, &error), error); mongoc_client_destroy(client); } // test_oidc_works tests a simple happy path. static void test_oidc_works(void *use_pool_void) { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Expect callback not-yet called: ASSERT_CMPINT(tf->ctx.call_count, ==, 0); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called: ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } // test_oidc_bad_config tests MONGODB-OIDC with bad configurations. static void test_oidc_bad_config(void *unused) { bson_error_t error; // Expect error is single-threaded setter used on pooled client: { mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost/?authMechanism=MONGODB-OIDC"); mongoc_client_pool_t *pool = mongoc_client_pool_new(uri); mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); capture_logs(true); ASSERT(!mongoc_client_set_oidc_callback(client, cb)); ASSERT_CAPTURED_LOG("oidc", MONGOC_LOG_LEVEL_ERROR, "only be used for single threaded clients"); mongoc_oidc_callback_destroy(cb); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } // Expect error if pool setter used after client is popped: { mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost/?authMechanism=MONGODB-OIDC"); mongoc_client_pool_t *pool = mongoc_client_pool_new(uri); mongoc_client_t *client = mongoc_client_pool_pop(pool); mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); capture_logs(true); ASSERT(!mongoc_client_pool_set_oidc_callback(pool, cb)); ASSERT_CAPTURED_LOG("oidc", MONGOC_LOG_LEVEL_ERROR, "only be called before mongoc_client_pool_pop"); mongoc_oidc_callback_destroy(cb); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } // Expect error if no callback set: { mongoc_client_t *client = mongoc_client_new("mongodb://localhost/?authMechanism=MONGODB-OIDC"); bool ok = mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "no callback set"); mongoc_client_destroy(client); } // Expect error if callback is set twice: { mongoc_client_t *client = mongoc_client_new("mongodb://localhost/?authMechanism=MONGODB-OIDC"); mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); ASSERT(mongoc_client_set_oidc_callback(client, cb)); capture_logs(true); ASSERT(!mongoc_client_set_oidc_callback(client, cb)); ASSERT_CAPTURED_LOG("oidc", MONGOC_LOG_LEVEL_ERROR, "called once"); mongoc_oidc_callback_destroy(cb); mongoc_client_destroy(client); } // Expect error if callback is set twice on pool: { mongoc_client_pool_t *pool = mongoc_client_pool_new(mongoc_uri_new("mongodb://localhost/?authMechanism=MONGODB-OIDC")); mongoc_oidc_callback_t *cb = mongoc_oidc_callback_new(oidc_callback_fn); ASSERT(mongoc_client_pool_set_oidc_callback(pool, cb)); capture_logs(true); ASSERT(!mongoc_client_pool_set_oidc_callback(pool, cb)); ASSERT_CAPTURED_LOG("oidc", MONGOC_LOG_LEVEL_ERROR, "called once"); mongoc_oidc_callback_destroy(cb); mongoc_client_pool_destroy(pool); } // Expect error on unsupported ENVIRONMENT passed (URI string) { mongoc_uri_t *uri = mongoc_uri_new_with_error( "mongodb://localhost:27017/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:bad", &error); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unrecognized ENVIRONMENT"); mongoc_uri_destroy(uri); } // Expect error on unsupported ENVIRONMENT passed (URI setter) { mongoc_uri_t *uri = mongoc_uri_new_with_error("mongodb://localhost:27017/?authMechanism=MONGODB-OIDC", &error); ASSERT_OR_PRINT(uri, error); // URI setter skips validation in URI string parsing, but is validated during client construction. mongoc_uri_set_mechanism_properties(uri, tmp_bson(BSON_STR({"ENVIRONMENT" : "bad"}))); mongoc_client_t *client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT(!client); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "unrecognized ENVIRONMENT"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } } // test_oidc_delays tests the minimum required time between OIDC calls. static void test_oidc_delays(void *use_pool_void) { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Configure failpoint to return ReauthenticationError (391): configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); int64_t start_us = bson_get_monotonic_time(); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); int64_t end_us = bson_get_monotonic_time(); ASSERT_CMPINT64(end_us - start_us, >=, 100 * 1000); // At least 100ms between calls to the callback. test_fixture_destroy(tf); } // test_oidc_reauth_twice tests a reauth error occurring twice in a row. static void test_oidc_reauth_twice(void *use_pool_void) { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Configure failpoint to return ReauthenticationError (391): configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 2}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); int64_t start_us = bson_get_monotonic_time(); // Expect error: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, MONGOC_SERVER_ERR_REAUTHENTICATION_REQUIRED, "failpoint"); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); int64_t end_us = bson_get_monotonic_time(); ASSERT_CMPINT64(end_us - start_us, >=, 100 * 1000); // At least 100ms between calls to the callback. test_fixture_destroy(tf); } // test_oidc_reauth_error_v1 tests a reauth error using the V1 error API. static void test_oidc_reauth_error_v1(void *use_pool_void) { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool, .use_error_api_v1 = true}); // Configure failpoint to return ReauthenticationError (391): configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); int64_t start_us = bson_get_monotonic_time(); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); int64_t end_us = bson_get_monotonic_time(); ASSERT_CMPINT64(end_us - start_us, >=, 100 * 1000); // At least 100ms between calls to the callback. test_fixture_destroy(tf); } #define PROSE_TEST(maj, min, desc) static void test_oidc_prose_##maj##_##min(void *use_pool_void) PROSE_TEST(1, 1, "Callback is called during authentication") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } static BSON_THREAD_FUN(do_100_finds, pool_void) { mongoc_client_pool_t *pool = pool_void; for (int i = 0; i < 100; i++) { mongoc_client_t *client = mongoc_client_pool_pop(pool); bson_error_t error; bool ok = do_find(client, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_pool_push(pool, client); } BSON_THREAD_RETURN; } PROSE_TEST(1, 2, "Callback is called once for multiple connections") { BSON_UNUSED(use_pool_void); // Test only runs for pooled. bool use_pool = true; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Start 10 threads. Each thread runs 100 find operations: bson_thread_t threads[10]; for (int i = 0; i < 10; i++) { ASSERT(0 == mcommon_thread_create(&threads[i], do_100_finds, tf->pool)); } // Wait for threads to finish: for (int i = 0; i < 10; i++) { mcommon_thread_join(threads[i]); } // Expect callback was called. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } PROSE_TEST(2, 1, "Valid Callback Inputs") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool, .callback_config = {.validate_params = true}}); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); test_fixture_destroy(tf); } PROSE_TEST(2, 2, "OIDC Callback Returns Null") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool, .callback_config = {.return_null = true}}); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "OIDC callback failed"); test_fixture_destroy(tf); } PROSE_TEST(2, 3, "OIDC Callback Returns Missing Data") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){ .use_pool = use_pool, .callback_config = { // mongoc_oidc_credential_t cannot be partially created. Instead of "missing" data, return a bad token. .return_bad_token = true}}); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 18, "Authentication failed"); test_fixture_destroy(tf); } PROSE_TEST(2, 4, "Invalid Client Configuration with Callback") { BSON_UNUSED(use_pool_void); mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017"); mongoc_uri_set_auth_mechanism(uri, "MONGODB-OIDC"); mongoc_uri_set_mechanism_properties(uri, tmp_bson(BSON_STR({"ENVIRONMENT" : "test"}))); callback_ctx_t ctx; mongoc_oidc_callback_t *oidc_callback = mongoc_oidc_callback_new(oidc_callback_fn); mongoc_oidc_callback_set_user_data(oidc_callback, &ctx); mongoc_client_t *client = mongoc_client_new_from_uri(uri); mongoc_client_set_oidc_callback(client, oidc_callback); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "Use one or the other"); mongoc_client_destroy(client); mongoc_oidc_callback_destroy(oidc_callback); mongoc_uri_destroy(uri); } PROSE_TEST(2, 5, "Invalid Client Configuration with Callback") { BSON_UNUSED(use_pool_void); bson_error_t error; mongoc_uri_t *uri = mongoc_uri_new_with_error( "mongodb://localhost:27017/" "?retryReads=false&authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:azure,ALLOWED_HOSTS:", &error); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported"); mongoc_uri_destroy(uri); } static void poison_client_cache(mongoc_client_t *client) { BSON_ASSERT_PARAM(client); mongoc_oidc_cache_set_cached_token(client->topology->oidc_cache, "bad_token"); } PROSE_TEST(3, 1, "Authentication failure with cached tokens fetch a new token and retry auth") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); poison_client_cache(tf->client); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } PROSE_TEST(3, 2, "Authentication failures without cached tokens return an error") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool, .callback_config = {.return_bad_token = true}}); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 18, "Authentication failed"); // Expect callback was called. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } PROSE_TEST(3, 3, "Unexpected error code does not clear the cache") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["saslStart"], "errorCode" : 20} })); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 20, "Failing command"); // Expect callback was called. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); // Expect second attempt succeeds: ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was not called again. ASSERT_CMPINT(tf->ctx.call_count, ==, 1); test_fixture_destroy(tf); } PROSE_TEST(4, 1, "Reauthentication Succeeds") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); // Expect auth to succeed: bson_error_t error; ASSERT_OR_PRINT(do_find(tf->client, &error), error); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); test_fixture_destroy(tf); } PROSE_TEST(4, 2, "Read Commands Fail If Reauthentication Fails") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new( (test_config_t){.use_pool = use_pool, .callback_config = {.return_bad_token_after_first_call = true}}); // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); // Expect auth to fail: bson_error_t error; ASSERT(!do_find(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 18, "Authentication failed"); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); test_fixture_destroy(tf); } static bool do_insert(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *coll = NULL; bool ret = false; bson_t doc = BSON_INITIALIZER; coll = mongoc_client_get_collection(client, "test", "test"); if (!mongoc_collection_insert_one(coll, &doc, NULL, NULL, error)) { goto fail; } ret = true; fail: mongoc_collection_destroy(coll); return ret; } PROSE_TEST(4, 3, "Write Commands Fail If Reauthentication Fails") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new( (test_config_t){.use_pool = use_pool, .callback_config = {.return_bad_token_after_first_call = true}}); // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["insert"], "errorCode" : 391} })); // Expect auth to fail: bson_error_t error; ASSERT(!do_insert(tf->client, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 18, "Authentication failed"); // Expect callback was called twice: once for initial auth, once for reauth. ASSERT_CMPINT(tf->ctx.call_count, ==, 2); test_fixture_destroy(tf); } // If counters are enabled, define operation count checks: #ifdef MONGOC_ENABLE_SHM_COUNTERS #define DECL_OPCOUNT() int32_t opcount = mongoc_counter_op_egress_total_count() #define ASSERT_OPCOUNT(x) ASSERT_CMPINT32(mongoc_counter_op_egress_total_count(), ==, opcount + x) #else #define DECL_OPCOUNT() ((void)0) #define ASSERT_OPCOUNT(x) ((void)0) #endif static void populate_client_cache(mongoc_client_t *client) { BSON_ASSERT_PARAM(client); char *access_token = read_test_token(); mongoc_oidc_cache_set_cached_token(client->topology->oidc_cache, access_token); bson_free(access_token); } PROSE_TEST(4, 4, "Speculative Authentication should be ignored on Reauthentication") { BSON_UNUSED(use_pool_void); bool use_pool = false; // Only run on single to avoid counters being updated by background threads. test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); bson_error_t error; // Populate client cache with a valid access token to enforce speculative authentication: populate_client_cache(tf->client); // Expect successful auth without sending saslStart: { DECL_OPCOUNT(); // Expect auth to succeed: ASSERT_OR_PRINT(do_insert(tf->client, &error), error); // Expect callback was not called: ASSERT_CMPINT(tf->ctx.call_count, ==, 0); // Expect two commands sent: hello + insert. // Expect saslStart was not sent. // TODO(CDRIVER-2669): check command started events instead of counters. ASSERT_OPCOUNT(2); } // Expect successful reauth with sending saslStart: { // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["insert"], "errorCode" : 391} })); DECL_OPCOUNT(); // Expect auth to succeed (after reauth): ASSERT_OR_PRINT(do_insert(tf->client, &error), error); // Expect callback was called: ASSERT_CMPINT(tf->ctx.call_count, ==, 1); // Check that three commands were sent: insert (fails) + saslStart + insert (succeeds). // TODO(CDRIVER-2669): check command started events instead. ASSERT_OPCOUNT(3); } test_fixture_destroy(tf); } static bool do_find_with_session(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *coll = NULL; mongoc_cursor_t *cursor = NULL; bool ret = false; bson_t filter = BSON_INITIALIZER; bson_t opts = BSON_INITIALIZER; mongoc_client_session_t *sess = NULL; // Create session: sess = mongoc_client_start_session(client, NULL, error); if (!sess) { goto fail; } if (!mongoc_client_session_append(sess, &opts, error)) { goto fail; } coll = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(coll, &filter, &opts, NULL); const bson_t *doc; while (mongoc_cursor_next(cursor, &doc)) ; if (mongoc_cursor_error(cursor, error)) { goto fail; } ret = true; fail: mongoc_client_session_destroy(sess); bson_destroy(&opts); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); return ret; } PROSE_TEST(4, 5, "Reauthentication Succeeds when a Session is involved") { bool use_pool = *(bool *)use_pool_void; test_fixture_t *tf = test_fixture_new((test_config_t){.use_pool = use_pool}); // Configure failpoint: configure_failpoint(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"failCommands" : ["find"], "errorCode" : 391} })); // Expect find on a session succeeds: bson_error_t error; ASSERT_OR_PRINT(do_find_with_session(tf->client, &error), error); // Expect callback was called twice: ASSERT_CMPINT(tf->ctx.call_count, ==, 2); test_fixture_destroy(tf); } PROSE_TEST(5, 1, "Azure With No Username") { BSON_UNUSED(use_pool_void); // Create URI: mongoc_uri_t *uri = mongoc_uri_new("mongodb://localhost:27017/?retryReads=false"); { mongoc_uri_set_auth_mechanism(uri, "MONGODB-OIDC"); bson_t props = BSON_INITIALIZER; BSON_APPEND_UTF8(&props, "ENVIRONMENT", "azure"); char *token_resource = test_framework_getenv_required("MONGOC_AZURE_RESOURCE"); BSON_APPEND_UTF8(&props, "TOKEN_RESOURCE", token_resource); bson_free(token_resource); mongoc_uri_set_mechanism_properties(uri, &props); bson_destroy(&props); } bson_error_t error; mongoc_client_t *client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); // Expect auth to succeed: ASSERT_OR_PRINT(do_find(client, &error), error); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } PROSE_TEST(5, 2, "Azure With Bad Username") { BSON_UNUSED(use_pool_void); // Create URI: mongoc_uri_t *uri = mongoc_uri_new("mongodb://bad@localhost:27017/?retryReads=false"); { mongoc_uri_set_auth_mechanism(uri, "MONGODB-OIDC"); bson_t props = BSON_INITIALIZER; BSON_APPEND_UTF8(&props, "ENVIRONMENT", "azure"); char *token_resource = test_framework_getenv_required("MONGOC_AZURE_RESOURCE"); BSON_APPEND_UTF8(&props, "TOKEN_RESOURCE", token_resource); bson_free(token_resource); mongoc_uri_set_mechanism_properties(uri, &props); bson_destroy(&props); } bson_error_t error; mongoc_client_t *client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); // Expect auth to fail: ASSERT(!do_find(client, &error)); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static bool is_testing_azure_oidc(void) { char *token_resource = test_framework_getenv("MONGOC_AZURE_RESOURCE"); if (!token_resource) { return false; } bson_free(token_resource); return true; } static int skip_if_no_oidc(void) { if (is_testing_azure_oidc()) { // OIDC tests asserting callback counts cannot run when callback is set by environment. return 0; } return test_framework_is_oidc() ? 1 : 0; } static int skip_if_no_azure_oidc(void) { return is_testing_azure_oidc() ? 1 : 0; } void test_oidc_auth_install(TestSuite *suite) { static bool single = false; static bool pooled = true; TestSuite_AddFull(suite, "/oidc/bad_config", test_oidc_bad_config, NULL, NULL, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/works/single", test_oidc_works, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/works/pooled", test_oidc_works, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/delays/single", test_oidc_delays, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/delays/pooled", test_oidc_delays, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/reauth_twice/single", test_oidc_reauth_twice, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/reauth_twice/pooled", test_oidc_reauth_twice, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/reauth_error_v1/single", test_oidc_reauth_error_v1, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/reauth_error_v1/pooled", test_oidc_reauth_error_v1, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/1.1/single", test_oidc_prose_1_1, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/1.1/pooled", test_oidc_prose_1_1, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/1.2", test_oidc_prose_1_2, NULL, NULL, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.1/single", test_oidc_prose_2_1, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.1/pooled", test_oidc_prose_2_1, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.2/single", test_oidc_prose_2_2, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.2/pooled", test_oidc_prose_2_2, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.3/single", test_oidc_prose_2_3, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.3/pooled", test_oidc_prose_2_3, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.4", test_oidc_prose_2_4, NULL, NULL, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/2.5", test_oidc_prose_2_5, NULL, NULL, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.1/single", test_oidc_prose_3_1, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.1/pooled", test_oidc_prose_3_1, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.2/single", test_oidc_prose_3_2, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.2/pooled", test_oidc_prose_3_2, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.3/single", test_oidc_prose_3_3, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/3.3/pooled", test_oidc_prose_3_3, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.1/single", test_oidc_prose_4_1, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.1/pooled", test_oidc_prose_4_1, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.2/single", test_oidc_prose_4_2, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.2/pooled", test_oidc_prose_4_2, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.3/single", test_oidc_prose_4_3, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.3/pooled", test_oidc_prose_4_3, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.4", test_oidc_prose_4_4, NULL, NULL, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.5/single", test_oidc_prose_4_5, NULL, &single, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/4.5/pooled", test_oidc_prose_4_5, NULL, &pooled, skip_if_no_oidc); TestSuite_AddFull(suite, "/oidc/prose/5.1/single", test_oidc_prose_5_1, NULL, &single, skip_if_no_azure_oidc); TestSuite_AddFull(suite, "/oidc/prose/5.1/pooled", test_oidc_prose_5_1, NULL, &pooled, skip_if_no_azure_oidc); TestSuite_AddFull(suite, "/oidc/prose/5.2/single", test_oidc_prose_5_2, NULL, &single, skip_if_no_azure_oidc); TestSuite_AddFull(suite, "/oidc/prose/5.2/pooled", test_oidc_prose_5_2, NULL, &pooled, skip_if_no_azure_oidc); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-opts.c000066400000000000000000000670411511661753600236570ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include /* * Test that all "with_opts" functions that accept readConcern, writeConcern, * and/or readPreference properly implement inheritance. For each of these * options, test that the function inherits the option from its source object * (e.g., mongoc_collection_watch inherits readConcern from the collection), * that the function uses the option from "opts" if present, and that "opts" * overrides the option from the source object. * * listDatabases, listCollections, and listIndexes don't use any of these * options, so don't test their helpers: * * mongoc_client_find_databases_with_opts * mongoc_client_get_database_names_with_opts * mongoc_database_find_collections_with_opts * mongoc_database_get_collection_names_with_opts * mongoc_collection_find_indexes_with_opts */ /* kinds of options */ typedef enum { OPT_READ_CONCERN, OPT_WRITE_CONCERN, OPT_READ_PREFS, } opt_type_t; /* objects on which options can be set */ typedef enum { OPT_SOURCE_NONE = 0, OPT_SOURCE_FUNC = 1 << 0, OPT_SOURCE_COLL = 1 << 1, OPT_SOURCE_DB = 1 << 2, OPT_SOURCE_CLIENT = 1 << 3, } opt_source_t; /* for mongoc_bulk_operation_t tests */ typedef bool (*bulk_op_t)(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd /* OUT */); struct _opt_inheritance_test_t; typedef struct { struct _opt_inheritance_test_t *test; mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; const mongoc_read_prefs_t *prefs; const bson_t *opts; /* find, aggregate, etc. store the cursor here while running */ mongoc_cursor_t *cursor; bson_error_t error; /* allow func_with_opts_t functions to store data and destroy it later */ void *data; void (*destructor)(void *data); } func_ctx_t; typedef future_t *(func_with_opts_t)(func_ctx_t * ctx, bson_t *cmd); typedef struct _opt_inheritance_test_t { opt_source_t opt_source; func_with_opts_t *func_with_opts; const char *func_name; opt_type_t opt_type; int n_sections; /* for mongoc_bulk_operation_t tests */ bulk_op_t bulk_op; } opt_inheritance_test_t; static void func_ctx_init(func_ctx_t *ctx, opt_inheritance_test_t *test, mongoc_client_t *client, mongoc_database_t *db, mongoc_collection_t *collection, const mongoc_read_prefs_t *prefs, const bson_t *opts) { ASSERT(client); ctx->test = test; ctx->client = client; ctx->db = db; ctx->collection = collection; ctx->prefs = prefs; ctx->opts = opts; ctx->cursor = NULL; memset(&ctx->error, 0, sizeof(ctx->error)); ctx->data = NULL; ctx->destructor = NULL; } static void func_ctx_cleanup(func_ctx_t *ctx) { mongoc_cursor_destroy(ctx->cursor); if (ctx->destructor) { ctx->destructor(ctx->data); } } /* if type is e.g. "collection", set readConcern level collection, writeConcern * w=collection, readPreference tags [{collection: "yes"}] */ #define SET_OPT_PREAMBLE(_type) \ mongoc_read_concern_t *rc = mongoc_read_concern_new(); \ mongoc_write_concern_t *wc = mongoc_write_concern_new(); \ mongoc_read_prefs_t *prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); \ \ mongoc_read_concern_set_level(rc, #_type); \ mongoc_write_concern_set_wtag(wc, #_type); \ mongoc_read_prefs_set_tags(prefs, tmp_bson("[{'%s': 'yes'}]", #_type)); \ (void)0 #define SET_OPT_CLEANUP \ if (1) { \ mongoc_read_concern_destroy(rc); \ mongoc_write_concern_destroy(wc); \ mongoc_read_prefs_destroy(prefs); \ } else \ (void)0 #define SET_OPT(_type) \ static void set_##_type##_opt(mongoc_##_type##_t *obj, opt_type_t opt_type) \ { \ SET_OPT_PREAMBLE(_type); \ \ switch (opt_type) { \ case OPT_READ_CONCERN: \ mongoc_##_type##_set_read_concern(obj, rc); \ break; \ case OPT_WRITE_CONCERN: \ mongoc_##_type##_set_write_concern(obj, wc); \ break; \ case OPT_READ_PREFS: \ mongoc_##_type##_set_read_prefs(obj, prefs); \ break; \ default: \ test_error("invalid opt_type: %d", (int)opt_type); \ } \ \ SET_OPT_CLEANUP; \ } SET_OPT(client) SET_OPT(database) SET_OPT(collection) static void set_func_opt(bson_t *opts, mongoc_read_prefs_t **prefs_ptr, opt_type_t opt_type) { SET_OPT_PREAMBLE(function); switch (opt_type) { case OPT_READ_CONCERN: BSON_ASSERT(mongoc_read_concern_append(rc, opts)); break; case OPT_WRITE_CONCERN: BSON_ASSERT(mongoc_write_concern_append(wc, opts)); break; case OPT_READ_PREFS: *prefs_ptr = mongoc_read_prefs_copy(prefs); break; default: test_error("invalid opt_type: %d", (int)opt_type); } SET_OPT_CLEANUP; } /* add BSON we expect to be included in a command due to an inherited option. * e.g., when "count" inherits readConcern from the DB, it should include * readConcern: {level: 'database'} in the command body. */ void add_expected_opt(opt_source_t opt_source, opt_type_t opt_type, bson_t *cmd) { const char *source_name; bson_t *opt; if (opt_source & OPT_SOURCE_FUNC) { source_name = "function"; } else if (opt_source & OPT_SOURCE_COLL) { source_name = "collection"; } else if (opt_source & OPT_SOURCE_DB) { source_name = "database"; } else if (opt_source & OPT_SOURCE_CLIENT) { source_name = "client"; } else { test_error("opt_json called with OPT_SOURCE_NONE"); } switch (opt_type) { case OPT_READ_CONCERN: opt = tmp_bson("{'readConcern': {'level': '%s'}}", source_name); break; case OPT_WRITE_CONCERN: opt = tmp_bson("{'writeConcern': {'w': '%s'}}", source_name); break; case OPT_READ_PREFS: opt = tmp_bson("{'$readPreference': {'mode': 'secondary', 'tags': [{'%s': 'yes'}]}}", source_name); break; default: test_error("invalid opt_type: %d", (int)opt_type); } bson_concat(cmd, opt); } static const char * opt_type_name(opt_type_t opt_type) { switch (opt_type) { case OPT_READ_CONCERN: return "readConcern"; case OPT_WRITE_CONCERN: return "writeConcern"; case OPT_READ_PREFS: return "readPrefs"; default: test_error("invalid opt_type: %d", (int)opt_type); } } static void cleanup_future(future_t *future) { future_value_t v; BSON_ASSERT(future_wait(future)); v = future->return_value; if (v.type == future_value_mongoc_change_stream_ptr_type) { mongoc_change_stream_destroy(v.value.mongoc_change_stream_ptr_value); } else if (v.type == future_value_char_ptr_ptr_type) { bson_strfreev(v.value.char_ptr_ptr_value); } future_destroy(future); } /********************************************************************** * * func_with_opts_t implementations for client * **********************************************************************/ static future_t * client_read_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_INT32(cmd, "foo", 1); return future_client_read_command_with_opts( ctx->client, "db", tmp_bson("{'foo': 1}"), ctx->prefs, ctx->opts, NULL, &ctx->error); } static future_t * client_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "collection"); return future_client_write_command_with_opts( ctx->client, "db", tmp_bson("{'foo': 'collection'}"), ctx->opts, NULL, &ctx->error); } static future_t * client_read_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "collection"); return future_client_read_write_command_with_opts( ctx->client, "db", tmp_bson("{'foo': 'collection'}"), ctx->prefs, ctx->opts, NULL, &ctx->error); } static future_t * client_watch(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_INT32(cmd, "aggregate", 1); return future_client_watch(ctx->client, tmp_bson("{}"), ctx->opts); } /********************************************************************** * * func_with_opts_t implementations for database * **********************************************************************/ static future_t * db_drop(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_INT32(cmd, "dropDatabase", 1); return future_database_drop_with_opts(ctx->db, ctx->opts, &ctx->error); } static future_t * db_read_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "db"); return future_database_read_command_with_opts( ctx->db, tmp_bson("{'foo': 'db'}"), ctx->prefs, ctx->opts, NULL, &ctx->error); } static future_t * db_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "db"); return future_database_write_command_with_opts(ctx->db, tmp_bson("{'foo': 'db'}"), ctx->opts, NULL, &ctx->error); } static future_t * db_read_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "db"); return future_database_read_write_command_with_opts( ctx->db, tmp_bson("{'foo': 'db'}"), ctx->prefs, ctx->opts, NULL, &ctx->error); } static future_t * db_watch(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_INT32(cmd, "aggregate", 1); return future_database_watch(ctx->db, tmp_bson("{}"), ctx->opts); } /********************************************************************** * * func_with_opts_t implementations for collection * **********************************************************************/ static future_t * aggregate(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "aggregate", "collection"); ctx->cursor = mongoc_collection_aggregate( ctx->collection, MONGOC_QUERY_NONE, tmp_bson("{'pipeline': [{'$out': 'foo'}]}"), ctx->opts, ctx->prefs); /* use ctx->data as the bson_t** out-param to mongoc_cursor_next () */ return future_cursor_next(ctx->cursor, (const bson_t **)&ctx->data); } static future_t * aggregate_raw_pipeline(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "aggregate", "collection"); ctx->cursor = mongoc_collection_aggregate( ctx->collection, MONGOC_QUERY_NONE, tmp_bson("[{'$out': 'foo'}]"), ctx->opts, ctx->prefs); /* use ctx->data as the bson_t** out-param to mongoc_cursor_next () */ return future_cursor_next(ctx->cursor, (const bson_t **)&ctx->data); } static future_t * collection_drop(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "drop", "collection"); return future_collection_drop_with_opts(ctx->collection, ctx->opts, &ctx->error); } static future_t * collection_read_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "collection"); return future_collection_read_command_with_opts( ctx->collection, tmp_bson("{'foo': 'collection'}"), ctx->prefs, ctx->opts, NULL, &ctx->error); } static future_t * collection_read_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "collection"); return future_collection_read_write_command_with_opts( ctx->collection, tmp_bson("{'foo': 'collection'}"), NULL, ctx->opts, NULL, &ctx->error); } static future_t * collection_write_cmd(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "foo", "collection"); return future_collection_write_command_with_opts( ctx->collection, tmp_bson("{'foo': 'collection'}"), ctx->opts, NULL, &ctx->error); } static future_t * collection_watch(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "aggregate", "collection"); return future_collection_watch(ctx->collection, tmp_bson("{}"), ctx->opts); } static future_t * count_documents(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "aggregate", "collection"); return future_collection_count_documents(ctx->collection, tmp_bson("{}"), ctx->opts, ctx->prefs, NULL, &ctx->error); } static void destroy_index_models(void *data) { mongoc_index_model_t **ptr = (mongoc_index_model_t **)data; while (NULL != *ptr) { mongoc_index_model_destroy(*ptr); ptr++; } } static future_t * create_index(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "createIndexes", "collection"); mongoc_index_model_t *im = mongoc_index_model_new(tmp_bson("{'foo': 'bar'}"), NULL); // Allocate a list of `mongoc_index_model_t` to extend the lifetime until the future resolves. mongoc_index_model_t **ims = bson_malloc0(sizeof(mongoc_index_model_t *) * 2); ims[0] = im; ims[1] = NULL; // NULL-terimate. ctx->data = ims; ctx->destructor = destroy_index_models; // Destroy `mongoc_index_model_t` after future returns. return future_collection_create_indexes_with_opts(ctx->collection, ims, 1, ctx->opts, NULL, &ctx->error); } static future_t * drop_index(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "dropIndexes", "collection"); return future_collection_drop_index_with_opts(ctx->collection, "index name", ctx->opts, &ctx->error); } static future_t * estimated_document_count(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "count", "collection"); return future_collection_estimated_document_count(ctx->collection, ctx->opts, ctx->prefs, NULL, &ctx->error); } static future_t * find(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "find", "collection"); ctx->cursor = mongoc_collection_find_with_opts(ctx->collection, tmp_bson("{}"), ctx->opts, ctx->prefs); /* use ctx->data as the bson_t** out-param to mongoc_cursor_next () */ return future_cursor_next(ctx->cursor, (const bson_t **)&ctx->data); } static void find_and_modify_cleanup(void *data) { mongoc_find_and_modify_opts_destroy((mongoc_find_and_modify_opts_t *)data); } static future_t * find_and_modify(func_ctx_t *ctx, bson_t *cmd) { mongoc_find_and_modify_opts_t *fam; BSON_APPEND_UTF8(cmd, "findAndModify", "collection"); fam = mongoc_find_and_modify_opts_new(); bson_concat(&fam->extra, ctx->opts); /* destroy the mongoc_find_and_modify_opts_t later */ ctx->data = fam; ctx->destructor = find_and_modify_cleanup; return future_collection_find_and_modify_with_opts(ctx->collection, tmp_bson("{}"), fam, NULL, &ctx->error); } /********************************************************************** * * func_with_opts_t implementations for collection write helpers * **********************************************************************/ static future_t * delete_many(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "delete", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_delete_many(ctx->collection, tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } static future_t * delete_one(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "delete", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_delete_one(ctx->collection, tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } static future_t * insert_many(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "insert", "collection"); BSON_ASSERT(!ctx->prefs); /* the "array" of input documents must be a valid pointer, stage it here */ ctx->data = tmp_bson("{}"); return future_collection_insert_many(ctx->collection, (const bson_t **)&ctx->data, 1, ctx->opts, NULL, &ctx->error); } static future_t * insert_one(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "insert", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_insert_one(ctx->collection, tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } static future_t * replace_one(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_replace_one(ctx->collection, tmp_bson("{}"), tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } static future_t * update_many(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_update_many(ctx->collection, tmp_bson("{}"), tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } static future_t * update_one(func_ctx_t *ctx, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); BSON_ASSERT(!ctx->prefs); return future_collection_update_one(ctx->collection, tmp_bson("{}"), tmp_bson("{}"), ctx->opts, NULL, &ctx->error); } /********************************************************************** * * mongoc_bulk_operation_t test functions * **********************************************************************/ static void bulk_operation_cleanup(void *data) { mongoc_bulk_operation_destroy((mongoc_bulk_operation_t *)data); } static future_t * bulk_exec(func_ctx_t *ctx, bson_t *cmd) { mongoc_bulk_operation_t *bulk; bson_error_t error; bool r; bulk = mongoc_collection_create_bulk_operation_with_opts(ctx->collection, ctx->opts); ctx->data = bulk; ctx->destructor = bulk_operation_cleanup; r = ctx->test->bulk_op(bulk, &error, cmd); ASSERT_OR_PRINT(r, error); return future_bulk_operation_execute(bulk, NULL /* reply */, &ctx->error); } static bool bulk_insert(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "insert", "collection"); return mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{}"), NULL, error); } static bool bulk_remove_many(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "delete", "collection"); return mongoc_bulk_operation_remove_many_with_opts(bulk, tmp_bson("{}"), NULL, error); } static bool bulk_remove_one(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "delete", "collection"); return mongoc_bulk_operation_remove_one_with_opts(bulk, tmp_bson("{}"), NULL, error); } static bool bulk_replace_one(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); return mongoc_bulk_operation_replace_one_with_opts(bulk, tmp_bson("{}"), tmp_bson("{}"), NULL, error); } static bool bulk_update_many(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); return mongoc_bulk_operation_update_many_with_opts(bulk, tmp_bson("{}"), tmp_bson("{}"), NULL, error); } static bool bulk_update_one(mongoc_bulk_operation_t *bulk, bson_error_t *error, bson_t *cmd) { BSON_APPEND_UTF8(cmd, "update", "collection"); return mongoc_bulk_operation_update_one_with_opts(bulk, tmp_bson("{}"), tmp_bson("{}"), NULL, error); } static void test_func_inherits_opts(void *ctx) { opt_inheritance_test_t *test = (opt_inheritance_test_t *)ctx; /* for example, test mongoc_collection_find_with_opts with no read pref, * with a read pref set on the collection (OPT_SOURCE_COLL), with an explicit * read pref (OPT_SOURCE_FUNC), or with one read pref on the collection and * a different one passed explicitly */ opt_source_t source_matrix[] = { OPT_SOURCE_NONE, test->opt_source, OPT_SOURCE_FUNC, test->opt_source | OPT_SOURCE_FUNC}; size_t i; func_ctx_t func_ctx; mock_rs_t *rs; mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; bson_t opts = BSON_INITIALIZER; mongoc_read_prefs_t *func_prefs = NULL; future_t *future; request_t *request; bson_t cmd = BSON_INITIALIZER; bool expect_secondary; bson_error_t error; /* one primary, one secondary */ rs = mock_rs_with_auto_hello(WIRE_VERSION_MAX, true, 1, 0); /* we use read pref tags like "collection": "yes" to verify where the * pref was inherited from; ensure all secondaries match all tags */ mock_rs_tag_secondary(rs, 0, tmp_bson("{'client': 'yes'," " 'database': 'yes'," " 'collection': 'yes'," " 'function': 'yes'}")); mock_rs_run(rs); /* iterate over all combinations of options sources: e.g., an option set on * collection and not function, on function not collection, both, neither */ for (i = 0; i < sizeof(source_matrix) / (sizeof(opt_source_t)); i++) { expect_secondary = false; func_prefs = NULL; bson_reinit(&cmd); bson_reinit(&opts); client = test_framework_client_new_from_uri(mock_rs_get_uri(rs), NULL); if (source_matrix[i] & OPT_SOURCE_CLIENT) { set_client_opt(client, test->opt_type); } db = mongoc_client_get_database(client, "database"); if (source_matrix[i] & OPT_SOURCE_DB) { set_database_opt(db, test->opt_type); } collection = mongoc_database_get_collection(db, "collection"); if (source_matrix[i] & OPT_SOURCE_COLL) { set_collection_opt(collection, test->opt_type); } if (source_matrix[i] & OPT_SOURCE_FUNC) { set_func_opt(&opts, &func_prefs, test->opt_type); } func_ctx_init(&func_ctx, test, client, db, collection, func_prefs, &opts); /* A warning is thrown if an aggregate command with $out attempts to write * to a secondary */ capture_logs(true); /* func_with_opts creates expected "cmd", like {insert: 'collection'} */ future = test->func_with_opts(&func_ctx, &cmd); capture_logs(false); if (source_matrix[i] != OPT_SOURCE_NONE) { add_expected_opt(source_matrix[i], test->opt_type, &cmd); expect_secondary = test->opt_type == OPT_READ_PREFS; } /* write commands send two OP_MSG sections */ if (test->n_sections == 2) { request = mock_rs_receives_msg(rs, 0, &cmd, tmp_bson("{}")); } else { request = mock_rs_receives_msg(rs, 0, &cmd); } if (expect_secondary) { BSON_ASSERT(mock_rs_request_is_to_secondary(rs, request)); } else { BSON_ASSERT(mock_rs_request_is_to_primary(rs, request)); } if (func_ctx.cursor) { reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': []}}"); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); ASSERT_OR_PRINT(!mongoc_cursor_error(func_ctx.cursor, &error), error); } else { reply_to_request_simple(request, "{'ok': 1}"); cleanup_future(future); } request_destroy(request); mongoc_read_prefs_destroy(func_prefs); func_ctx_cleanup(&func_ctx); mongoc_collection_destroy(collection); mongoc_database_destroy(db); mongoc_client_destroy(client); } bson_destroy(&cmd); bson_destroy(&opts); mock_rs_destroy(rs); } /* commands that send one OP_MSG section */ #define OPT_TEST(_opt_source, _func, _opt_type) {OPT_SOURCE_##_opt_source, _func, #_func, OPT_##_opt_type, 1} /* write commands commands that send two OP_MSG sections */ #define OPT_WRITE_TEST(_func) {OPT_SOURCE_COLL, _func, #_func, OPT_WRITE_CONCERN, 2} /* mongoc_bulk_operation_t functions */ #define OPT_BULK_TEST(_bulk_op) {OPT_SOURCE_COLL, bulk_exec, #_bulk_op, OPT_WRITE_CONCERN, 2, _bulk_op} static opt_inheritance_test_t gInheritanceTests[] = { /* * client functions */ OPT_TEST(CLIENT, client_read_cmd, READ_CONCERN), OPT_TEST(CLIENT, client_read_cmd, READ_PREFS), /* read_write_command functions deliberately ignore read prefs */ OPT_TEST(CLIENT, client_read_write_cmd, READ_CONCERN), OPT_TEST(CLIENT, client_read_write_cmd, WRITE_CONCERN), /* watch helpers don't take explicit readPref */ OPT_TEST(CLIENT, client_watch, READ_CONCERN), OPT_TEST(CLIENT, client_write_cmd, WRITE_CONCERN), /* * database functions */ OPT_TEST(DB, db_drop, WRITE_CONCERN), OPT_TEST(DB, db_read_cmd, READ_CONCERN), OPT_TEST(DB, db_read_cmd, READ_PREFS), OPT_TEST(DB, db_read_write_cmd, READ_CONCERN), OPT_TEST(DB, db_read_write_cmd, WRITE_CONCERN), OPT_TEST(DB, db_watch, READ_CONCERN), OPT_TEST(DB, db_write_cmd, WRITE_CONCERN), /* * collection functions */ OPT_TEST(COLL, aggregate, READ_CONCERN), OPT_TEST(COLL, aggregate, READ_PREFS), OPT_TEST(COLL, aggregate, WRITE_CONCERN), OPT_TEST(COLL, aggregate_raw_pipeline, READ_CONCERN), OPT_TEST(COLL, aggregate_raw_pipeline, READ_PREFS), OPT_TEST(COLL, aggregate_raw_pipeline, WRITE_CONCERN), OPT_TEST(COLL, collection_drop, WRITE_CONCERN), OPT_TEST(COLL, collection_read_cmd, READ_CONCERN), OPT_TEST(COLL, collection_read_cmd, READ_PREFS), OPT_TEST(COLL, collection_read_write_cmd, READ_CONCERN), OPT_TEST(COLL, collection_read_write_cmd, WRITE_CONCERN), OPT_TEST(COLL, collection_watch, READ_CONCERN), OPT_TEST(COLL, collection_write_cmd, WRITE_CONCERN), OPT_TEST(COLL, count_documents, READ_CONCERN), OPT_TEST(COLL, count_documents, READ_PREFS), // OPT_TEST (COLL, create_index, WRITE_CONCERN), Known issue: CDRIVER-5945 OPT_TEST(COLL, drop_index, WRITE_CONCERN), OPT_TEST(COLL, estimated_document_count, READ_CONCERN), OPT_TEST(COLL, estimated_document_count, READ_PREFS), OPT_TEST(COLL, find, READ_CONCERN), OPT_TEST(COLL, find, READ_PREFS), /* find_and_modify deliberately ignores collection read concern */ OPT_TEST(COLL, find_and_modify, WRITE_CONCERN), /* * collection write functions */ OPT_WRITE_TEST(delete_many), OPT_WRITE_TEST(delete_one), OPT_WRITE_TEST(insert_many), OPT_WRITE_TEST(insert_one), OPT_WRITE_TEST(replace_one), OPT_WRITE_TEST(update_many), OPT_WRITE_TEST(update_one), /* * bulk operations */ OPT_BULK_TEST(bulk_insert), OPT_BULK_TEST(bulk_remove_many), OPT_BULK_TEST(bulk_remove_one), OPT_BULK_TEST(bulk_replace_one), OPT_BULK_TEST(bulk_update_many), OPT_BULK_TEST(bulk_update_one), }; static void install_inheritance_tests(TestSuite *suite, opt_inheritance_test_t *tests, size_t n) { size_t i; opt_inheritance_test_t *test; char *name; for (i = 0; i < n; i++) { test = &tests[i]; name = bson_strdup_printf("/inheritance/%s/%s", test->func_name, opt_type_name(test->opt_type)); TestSuite_AddFull(suite, name, test_func_inherits_opts, NULL, test, TestSuite_CheckMockServerAllowed); bson_free(name); } BSON_UNUSED(create_index); // Silence unused warning. Remove when resolving CDRIVER-5945. } void test_opts_install(TestSuite *suite) { install_inheritance_tests(suite, gInheritanceTests, sizeof(gInheritanceTests) / sizeof(opt_inheritance_test_t)); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-primary-stepdown.c000066400000000000000000000375511511661753600262210ustar00rootroot00000000000000// test-mongoc-primary-stepdown.c contains tests specified in: // `Connections Survive Primary Step Down Tests`. See: // https://github.com/mongodb/specifications/tree/db3114e957f7c0976a1af09882dbb46cb4a70049/source/connections-survive-step-down/tests #include #include #include #include #include #include #include #include #include #include #include typedef struct { // If `use_pooled` is true, a test is run with a `mongoc_client_t` obtained // from a `mongoc_client_pool_t`. bool use_pooled; } test_ctx_t; static mongoc_uri_t * _get_test_uri(void) { mongoc_uri_t *uri; /* Use a URI with retryWrites off */ uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, "retryWrites", false); return uri; } static void _setup_test_with_client(mongoc_client_t *client) { bson_error_t error; ASSERT(client); /* Drop the "step-down.step-down" collection and re-create it */ { mongoc_collection_t *const coll = mongoc_client_get_collection(client, "step-down", "step-down"); if (!mongoc_collection_drop(coll, &error)) { if (NULL == strstr(error.message, "ns not found")) { ASSERT_OR_PRINT(false, error); } } mongoc_collection_destroy(coll); } { mongoc_database_t *const db = mongoc_client_get_database(client, "step-down"); bson_t opts = BSON_INITIALIZER; { mongoc_write_concern_t *const wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_append(wc, &opts)); mongoc_write_concern_destroy(wc); } mongoc_collection_t *const coll = mongoc_database_create_collection(db, "step-down", &opts, &error); ASSERT_OR_PRINT(coll, error); mongoc_collection_destroy(coll); mongoc_database_destroy(db); bson_destroy(&opts); } } static int _connection_count(mongoc_client_t *client, stream_tracker_t *st, uint32_t server_id) { mongoc_server_description_t *sd = mongoc_client_get_server_description(client, server_id); int conns = stream_tracker_count_total(st, sd->host.host_and_port); mongoc_server_description_destroy(sd); return conns; } typedef void (*_test_fn_t)(mongoc_client_t *, stream_tracker_t *); static void _run_test_single_or_pooled(_test_fn_t test, bool use_pooled) { mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool; stream_tracker_t *st = stream_tracker_new(); uri = _get_test_uri(); if (!use_pooled) { /* Run in single-threaded mode */ client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); _setup_test_with_client(client); stream_tracker_track_client(st, client); test(client, st); mongoc_client_destroy(client); } else { /* Run in pooled mode */ pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); stream_tracker_track_pool(st, pool); client = mongoc_client_pool_pop(pool); _setup_test_with_client(client); /* Wait one second to be assured that the RTT connection has been * established as well. */ mlib_sleep_for(1, s); test(client, st); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } stream_tracker_destroy(st); mongoc_uri_destroy(uri); } static void test_getmore_iteration(mongoc_client_t *client, stream_tracker_t *st) { mongoc_database_t *db; mongoc_collection_t *coll; mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; bool res; int conn_count; uint32_t primary_id; ASSERT(client); ASSERT(st); coll = mongoc_client_get_collection(client, "step-down", "step-down"); db = mongoc_client_get_database(client, "admin"); /* Store the primary ID. After step down, the primary may be a different * server. Check connection counts on the same server. */ primary_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, &error); ASSERT_OR_PRINT(primary_id, error); conn_count = _connection_count(client, st, primary_id); /* Insert 5 documents */ { bson_t opts = BSON_INITIALIZER; { mongoc_write_concern_t *const wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_append(wc, &opts)); mongoc_write_concern_destroy(wc); } for (int i = 0; i < 5; i++) { bson_t insert = BSON_INITIALIZER; bson_append_int32(&insert, "a", -1, i); ASSERT(mongoc_collection_insert_one(coll, &insert, &opts, NULL, NULL)); bson_destroy(&insert); } bson_destroy(&opts); } /* Retrieve the first batch of 2 documents */ cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); ASSERT(cursor); ASSERT(mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_next(cursor, &doc)); /* Send a stepdown to the primary, ensure it succeeds */ res = mongoc_database_command_simple(db, tmp_bson("{ 'replSetStepDown': 5, 'force': true}"), NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* Retrieve the next results from the cursor, ensure it succeeds */ ASSERT(mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_next(cursor, &doc)); ASSERT(mongoc_cursor_next(cursor, &doc)); /* Verify that no new connections have been created */ ASSERT_CMPINT(conn_count, ==, _connection_count(client, st, primary_id)); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } static void test_getmore_iteration_runner(void *ctx_void) { test_ctx_t *ctx = ctx_void; /* Only run on 4.2 or higher */ if (!test_framework_max_wire_version_at_least(8)) { return; } _run_test_single_or_pooled(test_getmore_iteration, ctx->use_pooled); } static void test_not_primary_keep_pool(mongoc_client_t *client, stream_tracker_t *st) { mongoc_database_t *db; mongoc_collection_t *coll; bson_error_t error; bool res; int conn_count; uint32_t primary_id; ASSERT(client); ASSERT(st); /* Configure fail points */ db = mongoc_client_get_database(client, "admin"); /* Store the primary ID. After step down, the primary may be a different * server. Check connection counts on the same server. */ primary_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, &error); ASSERT_OR_PRINT(primary_id, error); conn_count = _connection_count(client, st, primary_id); res = mongoc_database_command_simple(db, tmp_bson("{'configureFailPoint': 'failCommand', " "'mode': {'times': 1}, " "'data': {'failCommands': ['insert'], 'errorCode': 10107}}"), NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* Capture logs to swallow warnings about endSessions */ capture_logs(true); coll = mongoc_client_get_collection(client, "step-down", "step-down"); /* Execute an insert, verify that it fails with 10107 */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT(!res); ASSERT_CMPINT(error.code, ==, 10107); ASSERT_CONTAINS(error.message, "failpoint"); /* Execute a second insert, verify that it succeeds */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT(res); /* Verify that the connection pool has not been cleared */ ASSERT_CMPINT(conn_count, ==, _connection_count(client, st, primary_id)); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } static void test_not_primary_keep_pool_runner(void *ctx_void) { test_ctx_t *ctx = ctx_void; /* Only run on 4.2 and higher */ if (!test_framework_max_wire_version_at_least(8)) { return; } _run_test_single_or_pooled(test_not_primary_keep_pool, ctx->use_pooled); } static void test_shutdown_reset_pool(mongoc_client_t *client, stream_tracker_t *st) { mongoc_database_t *db; mongoc_collection_t *coll; mongoc_read_prefs_t *read_prefs; bson_error_t error; bool res; int conn_count; uint32_t primary_id; ASSERT(client); ASSERT(st); /* Configure fail points */ read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); db = mongoc_client_get_database(client, "admin"); /* Store the primary ID. After step down, the primary may be a different * server. Check connection counts on the same server. */ primary_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, &error); ASSERT_OR_PRINT(primary_id, error); conn_count = _connection_count(client, st, primary_id); res = mongoc_database_command_simple(db, tmp_bson("{'configureFailPoint': 'failCommand', " "'mode': {'times': 1}, " "'data': {'failCommands': ['insert'], 'errorCode': 91}}"), read_prefs, NULL, &error); ASSERT_OR_PRINT(res, error); coll = mongoc_client_get_collection(client, "step-down", "step-down"); /* Execute an insert, verify that it fails with 91 */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT(!res); ASSERT_CMPINT(error.code, ==, 91); ASSERT_CONTAINS(error.message, "failpoint"); /* Execute an insert into the test collection and verify it succeeds */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* Expect the insert created a new connection. The error cleared the connection pool. */ ASSERT_CMPINT((conn_count + 1), ==, _connection_count(client, st, primary_id)); mongoc_read_prefs_destroy(read_prefs); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } static void test_shutdown_reset_pool_runner(void *ctx_void) { test_ctx_t *ctx = ctx_void; _run_test_single_or_pooled(test_shutdown_reset_pool, ctx->use_pooled); } static void test_interrupted_shutdown_reset_pool(mongoc_client_t *client, stream_tracker_t *st) { mongoc_database_t *db; mongoc_collection_t *coll; mongoc_read_prefs_t *read_prefs; bson_error_t error; bool res; int conn_count; uint32_t primary_id; ASSERT(client); ASSERT(st); /* Configure fail points */ read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); db = mongoc_client_get_database(client, "admin"); /* Store the primary ID. After step down, the primary may be a different * server. Check connection counts on the same server. */ primary_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL /* read prefs */, NULL /* chosen read mode */, NULL /* deprioritized servers */, &error); ASSERT_OR_PRINT(primary_id, error); conn_count = _connection_count(client, st, primary_id); res = mongoc_database_command_simple(db, tmp_bson("{'configureFailPoint': 'failCommand', " "'mode': {'times': 1}, " "'data': {'failCommands': ['insert'], 'errorCode': 11600}}"), read_prefs, NULL, &error); ASSERT_OR_PRINT(res, error); coll = mongoc_client_get_collection(client, "step-down", "step-down"); /* Execute an insert, verify that it fails with 11600 */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT(!res); ASSERT_CMPINT(error.code, ==, 11600); ASSERT_CONTAINS(error.message, "failpoint"); /* Execute an insert into the test collection and verify it succeeds */ res = mongoc_collection_insert_one(coll, tmp_bson("{'test': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(res, error); /* Expect the insert created a new connection. The error cleared the connection pool. */ ASSERT_CMPINT((conn_count + 1), ==, _connection_count(client, st, primary_id)); mongoc_read_prefs_destroy(read_prefs); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } static void test_interrupted_shutdown_reset_pool_runner(void *ctx_void) { test_ctx_t *ctx = ctx_void; _run_test_single_or_pooled(test_interrupted_shutdown_reset_pool, ctx->use_pooled); } void test_primary_stepdown_install(TestSuite *suite) { test_ctx_t single_ctx = {.use_pooled = false}; test_ctx_t pooled_ctx = {.use_pooled = true}; #define TestPooledAndSingle(name, fn) \ if (1) { \ TestSuite_AddFull(suite, \ name "/single [lock:live-server]", \ fn, \ NULL, \ &single_ctx, \ test_framework_skip_if_auth, \ test_framework_skip_if_not_replset); \ TestSuite_AddFull(suite, \ name "/pooled [lock:live-server]", \ fn, \ NULL, \ &pooled_ctx, \ test_framework_skip_if_auth, \ test_framework_skip_if_not_replset); \ } else \ (void)0 TestPooledAndSingle("/Stepdown/getmore", test_getmore_iteration_runner); TestPooledAndSingle("/Stepdown/not_primary_keep", test_not_primary_keep_pool_runner); TestPooledAndSingle("/Stepdown/shutdown_reset_pool", test_shutdown_reset_pool_runner); TestPooledAndSingle("/Stepdown/interrupt_shutdown", test_interrupted_shutdown_reset_pool_runner); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-queue.c000066400000000000000000000034531511661753600240130ustar00rootroot00000000000000#include #include #include static void test_mongoc_queue_basic(void) { mongoc_queue_t q = MONGOC_QUEUE_INITIALIZER; _mongoc_queue_push_head(&q, (void *)1); _mongoc_queue_push_tail(&q, (void *)2); _mongoc_queue_push_head(&q, (void *)3); _mongoc_queue_push_tail(&q, (void *)4); _mongoc_queue_push_head(&q, (void *)5); ASSERT_CMPINT(_mongoc_queue_get_length(&q), ==, 5); ASSERT(_mongoc_queue_pop_head(&q) == (void *)5); ASSERT(_mongoc_queue_pop_head(&q) == (void *)3); ASSERT(_mongoc_queue_pop_head(&q) == (void *)1); ASSERT(_mongoc_queue_pop_head(&q) == (void *)2); ASSERT(_mongoc_queue_pop_head(&q) == (void *)4); ASSERT(!_mongoc_queue_pop_head(&q)); } static void test_mongoc_queue_pop_tail(void) { mongoc_queue_t q = MONGOC_QUEUE_INITIALIZER; _mongoc_queue_push_head(&q, (void *)1); ASSERT_CMPUINT32(_mongoc_queue_get_length(&q), ==, (uint32_t)1); ASSERT_CMPVOID(_mongoc_queue_pop_tail(&q), ==, (void *)1); ASSERT_CMPUINT32(_mongoc_queue_get_length(&q), ==, (uint32_t)0); ASSERT_CMPVOID(_mongoc_queue_pop_tail(&q), ==, (void *)NULL); _mongoc_queue_push_tail(&q, (void *)2); _mongoc_queue_push_head(&q, (void *)3); ASSERT_CMPUINT32(_mongoc_queue_get_length(&q), ==, (uint32_t)2); ASSERT_CMPVOID(_mongoc_queue_pop_tail(&q), ==, (void *)2); ASSERT_CMPUINT32(_mongoc_queue_get_length(&q), ==, (uint32_t)1); ASSERT_CMPVOID(_mongoc_queue_pop_tail(&q), ==, (void *)3); ASSERT_CMPUINT32(_mongoc_queue_get_length(&q), ==, (uint32_t)0); ASSERT_CMPVOID(_mongoc_queue_pop_tail(&q), ==, (void *)NULL); } void test_queue_install(TestSuite *suite) { TestSuite_Add(suite, "/Queue/basic", test_mongoc_queue_basic); TestSuite_Add(suite, "/Queue/pop_tail", test_mongoc_queue_pop_tail); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-read-concern.c000066400000000000000000000131341511661753600252240ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include static void test_read_concern_append(void) { mongoc_read_concern_t *rc; bson_t *cmd; cmd = tmp_bson("{'foo': 1}"); /* append default readConcern */ rc = mongoc_read_concern_new(); ASSERT(mongoc_read_concern_is_default(rc)); ASSERT_MATCH(cmd, "{'foo': 1, 'readConcern': {'$exists': false}}"); /* append readConcern with level */ mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); ASSERT(mongoc_read_concern_append(rc, cmd)); ASSERT_MATCH(cmd, "{'foo': 1, 'readConcern': {'level': 'local'}}"); mongoc_read_concern_destroy(rc); } static void test_read_concern_basic(void) { mongoc_read_concern_t *read_concern; read_concern = mongoc_read_concern_new(); BEGIN_IGNORE_DEPRECATIONS /* * Test defaults. */ ASSERT(read_concern); ASSERT(mongoc_read_concern_is_default(read_concern)); ASSERT(!mongoc_read_concern_get_level(read_concern)); /* * Test changes to level. */ mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_LOCAL); ASSERT(!mongoc_read_concern_is_default(read_concern)); ASSERT_CMPSTR(mongoc_read_concern_get_level(read_concern), MONGOC_READ_CONCERN_LEVEL_LOCAL); /* * Check generated bson. */ ASSERT_MATCH(_mongoc_read_concern_get_bson(read_concern), "{'level': 'local'}"); mongoc_read_concern_destroy(read_concern); } static void test_read_concern_bson_omits_defaults(void) { mongoc_read_concern_t *read_concern; const bson_t *bson; bson_iter_t iter; read_concern = mongoc_read_concern_new(); /* * Check generated bson. */ ASSERT(read_concern); bson = _mongoc_read_concern_get_bson(read_concern); ASSERT(bson); ASSERT(!bson_iter_init_find(&iter, bson, "level")); mongoc_read_concern_destroy(read_concern); } static void test_read_concern_always_mutable(void) { mongoc_read_concern_t *read_concern; read_concern = mongoc_read_concern_new(); ASSERT(read_concern); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_LOCAL); ASSERT_MATCH(_mongoc_read_concern_get_bson(read_concern), "{'level': 'local'}"); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_MAJORITY); ASSERT_MATCH(_mongoc_read_concern_get_bson(read_concern), "{'level': 'majority'}"); mongoc_read_concern_set_level(read_concern, MONGOC_READ_CONCERN_LEVEL_LINEARIZABLE); ASSERT_MATCH(_mongoc_read_concern_get_bson(read_concern), "{'level': 'linearizable'}"); mongoc_read_concern_destroy(read_concern); } static void _test_read_concern_wire_version(bool explicit) { mongoc_read_concern_t *rc; bson_t opts = BSON_INITIALIZER; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; bson_error_t error; rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, "foo"); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); if (explicit) { mongoc_read_concern_append(rc, &opts); } else { mongoc_client_set_read_concern(client, rc); mongoc_collection_set_read_concern(collection, rc); } /* * aggregate */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson(NULL), &opts, NULL); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'readConcern': {'level': 'foo'}}")); reply_to_request_simple(request, "{'ok': 1, 'cursor': {'id': 0, 'firstBatch': []}}"); request_destroy(request); BSON_ASSERT(future_wait(future)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); future_destroy(future); /* * generic mongoc_client_write_command_with_opts */ future = future_client_read_command_with_opts(client, "db", tmp_bson("{'foo': 1}"), NULL, &opts, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'readConcern': {'level': 'foo'}}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); mongoc_read_concern_destroy(rc); bson_destroy(&opts); } static void test_inherited_read_concern(void) { _test_read_concern_wire_version(false); } static void test_explicit_read_concern(void) { _test_read_concern_wire_version(true); } void test_read_concern_install(TestSuite *suite) { TestSuite_Add(suite, "/ReadConcern/append", test_read_concern_append); TestSuite_Add(suite, "/ReadConcern/basic", test_read_concern_basic); TestSuite_Add(suite, "/ReadConcern/bson_omits_defaults", test_read_concern_bson_omits_defaults); TestSuite_Add(suite, "/ReadConcern/always_mutable", test_read_concern_always_mutable); TestSuite_AddMockServerTest(suite, "/ReadConcern/inherited", test_inherited_read_concern); TestSuite_AddMockServerTest(suite, "/ReadConcern/explicit", test_explicit_read_concern); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-read-prefs.c000066400000000000000000000651421511661753600247220ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include static bool _can_be_command(const char *query) { return (!bson_empty(tmp_bson(query))); } static void _test_op_msg(const mongoc_uri_t *uri, mock_server_t *server, const char *query_or_cmd, mongoc_read_prefs_t *read_prefs, const char *expected_find) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bson_t b = BSON_INITIALIZER; future_t *future; request_t *request; client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "test", "test"); cursor = mongoc_collection_find_with_opts(collection, tmp_bson(query_or_cmd), NULL, read_prefs); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, 0, tmp_bson(expected_find)); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'a': 1}]}}"); /* mongoc_cursor_next returned true */ BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(&b); } static void _test_command_simple(const mongoc_uri_t *uri, mock_server_t *server, const char *command, mongoc_read_prefs_t *read_prefs, const char *expected_cmd) { mongoc_client_t *client; mongoc_collection_t *collection; future_t *future; request_t *request; client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "test", "test"); mongoc_collection_set_read_prefs(collection, read_prefs); future = future_client_command_simple(client, "test", tmp_bson(command), read_prefs, NULL, NULL); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson(expected_cmd)); reply_to_request(request, MONGOC_REPLY_NONE, /* flags */ 0, /* cursorId */ 0, /* startingFrom */ 1, /* numberReturned */ "{'ok': 1}"); /* mongoc_cursor_next returned true */ BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef enum { READ_PREF_TEST_STANDALONE, READ_PREF_TEST_MONGOS, READ_PREF_TEST_PRIMARY, READ_PREF_TEST_SECONDARY, } read_pref_test_type_t; static mock_server_t * _run_server(read_pref_test_type_t test_type) { mock_server_t *server; server = mock_server_new(); mock_server_run(server); switch (test_type) { case READ_PREF_TEST_STANDALONE: mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'isWritablePrimary': true}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); break; case READ_PREF_TEST_MONGOS: mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'isWritablePrimary': true," " 'msg': 'isdbgrid'}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); break; case READ_PREF_TEST_PRIMARY: mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); break; case READ_PREF_TEST_SECONDARY: mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'isWritablePrimary': false," " 'secondary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); break; default: test_error("Invalid test_type: %d", (int)test_type); } return server; } static mongoc_uri_t * _get_uri(mock_server_t *server, read_pref_test_type_t test_type) { mongoc_uri_t *uri; uri = mongoc_uri_copy(mock_server_get_uri(server)); switch (test_type) { case READ_PREF_TEST_PRIMARY: case READ_PREF_TEST_SECONDARY: mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); break; case READ_PREF_TEST_STANDALONE: case READ_PREF_TEST_MONGOS: default: break; } return uri; } static void _test_read_prefs_op_msg(read_pref_test_type_t test_type, mongoc_read_prefs_t *read_prefs, const char *query_or_cmd, const char *expected_cmd, const char *expected_find) { mock_server_t *server; mongoc_uri_t *uri; server = _run_server(test_type); uri = _get_uri(server, test_type); if (_can_be_command(query_or_cmd)) { _test_command_simple(uri, server, query_or_cmd, read_prefs, expected_cmd); } _test_op_msg(uri, server, query_or_cmd, read_prefs, expected_find); mock_server_destroy(server); mongoc_uri_destroy(uri); } static void _test_read_prefs(read_pref_test_type_t test_type, mongoc_read_prefs_t *read_prefs, const char *query_or_cmd, const char *expected_cmd, const char *expected_find) { _test_read_prefs_op_msg(test_type, read_prefs, query_or_cmd, expected_cmd, expected_find); } /* test that a NULL read pref is the same as PRIMARY */ static void test_read_prefs_standalone_null(void) { _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, NULL, "{}", "{}", "{ 'find': 'test', 'filter': {}, " "'$readPreference': { '$exists': false } }"); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, NULL, "{'a': 1}", "{'a': 1}", "{ 'find': 'test', 'filter': {'a': 1}, " "'$readPreference': { '$exists': false } }"); } static void test_read_prefs_standalone_primary(void) { mongoc_read_prefs_t *read_prefs; /* Server Selection Spec: for topology type single and server types other * than mongos, "clients MUST always set the secondaryOk wire protocol flag * on reads to ensure that any server type can handle the request." * */ read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{}", "{}", "{ 'find': 'test', 'filter': {}, " "'$readPreference': { '$exists': false } }"); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{'a': 1}", "{'a': 1}", "{ 'find': 'test', 'filter': {'a': 1}, " "'$readPreference': { '$exists': false } }"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_standalone_secondary(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{}", "{}", "{ 'find': 'test', 'filter': {}, " "'$readPreference': { '$exists': false } }"); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{'a': 1}", "{'a': 1}", "{ 'find': 'test', 'filter': {'a': 1}, " "'$readPreference': { '$exists': false } }"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_standalone_tags(void) { bson_t b = BSON_INITIALIZER; mongoc_read_prefs_t *read_prefs; bson_append_utf8(&b, "dc", 2, "ny", 2); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); mongoc_read_prefs_add_tag(read_prefs, &b); mongoc_read_prefs_add_tag(read_prefs, NULL); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{}", "{}", "{ 'find': 'test', 'filter': {}, " "'$readPreference': { '$exists': false } }"); _test_read_prefs_op_msg(READ_PREF_TEST_STANDALONE, read_prefs, "{'a': 1}", "{'a': 1}", "{ 'find': 'test', 'filter': {'a': 1}, " "'$readPreference': { '$exists': false } }"); bson_destroy(&b); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_primary_rsprimary(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); _test_read_prefs(READ_PREF_TEST_PRIMARY, read_prefs, "{}", "{}", "{'find': 'test', 'filter': {}}"); _test_read_prefs( READ_PREF_TEST_PRIMARY, read_prefs, "{'a': 1}", "{'a': 1}", "{'find': 'test', 'filter': {'a': 1}}"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_secondary_rssecondary(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); _test_read_prefs(READ_PREF_TEST_SECONDARY, read_prefs, "{}", "{}", "{'find': 'test', 'filter': {}}"); _test_read_prefs( READ_PREF_TEST_SECONDARY, read_prefs, "{'a': 1}", "{'a': 1}", "{'find': 'test', 'filter': {'a': 1}}"); mongoc_read_prefs_destroy(read_prefs); } /* test that a NULL read pref is the same as PRIMARY */ static void test_read_prefs_mongos_null(void) { _test_read_prefs(READ_PREF_TEST_MONGOS, NULL, "{}", "{}", "{'find': 'test', 'filter': {}}"); _test_read_prefs(READ_PREF_TEST_MONGOS, NULL, "{'a': 1}", "{'a': 1}", "{'find': 'test', 'filter': {}}"); } static void test_read_prefs_mongos_primary(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); _test_read_prefs(READ_PREF_TEST_MONGOS, read_prefs, "{}", "{}", "{'find': 'test', 'filter': {}}"); _test_read_prefs(READ_PREF_TEST_MONGOS, read_prefs, "{'a': 1}", "{'a': 1}", "{'find': 'test', 'filter': {'a': 1}}"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_mongos_secondary(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); _test_read_prefs_op_msg(READ_PREF_TEST_MONGOS, read_prefs, "{}", "{'find': 'test','$readPreference': {'mode': 'secondary'}}", "{'find': 'test', 'filter': {}," " '$readPreference': {'mode': 'secondary'}}"); _test_read_prefs_op_msg(READ_PREF_TEST_MONGOS, read_prefs, "{'a': 1}", "{'a': 1, '$readPreference': {'mode': 'secondary'}}", "{'find': 'test', 'filter': {'a': 1}," " '$readPreference': {'mode': 'secondary'}}"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_mongos_secondary_preferred(void) { mongoc_read_prefs_t *read_prefs; read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); /* $readPreference not sent, only secondaryOk */ _test_read_prefs(READ_PREF_TEST_MONGOS, read_prefs, "{}", "{}", "{'find': 'test', 'filter': {}}"); _test_read_prefs(READ_PREF_TEST_MONGOS, read_prefs, "{'a': 1}", "{'a': 1}", "{'find': 'test', 'filter': {'a': 1}}"); mongoc_read_prefs_destroy(read_prefs); } static void test_read_prefs_mongos_tags(void) { bson_t b = BSON_INITIALIZER; mongoc_read_prefs_t *read_prefs; bson_append_utf8(&b, "dc", 2, "ny", 2); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); mongoc_read_prefs_add_tag(read_prefs, &b); mongoc_read_prefs_add_tag(read_prefs, NULL); _test_read_prefs_op_msg(READ_PREF_TEST_MONGOS, read_prefs, "{}", "{'$query': {}, '$readPreference': {'mode': 'secondaryPreferred'," " 'tags': [{'dc': 'ny'}, {}]}}", "{'find': 'test', 'filter': {}," " '$readPreference': {'mode': 'secondaryPreferred'," " 'tags': [{'dc': 'ny'}, {}]}}"); _test_read_prefs_op_msg(READ_PREF_TEST_MONGOS, read_prefs, "{'a': 1}", "{'a': 1," " '$readPreference': {'mode': 'secondaryPreferred'," " 'tags': [{'dc': 'ny'}, {}]}}", "{'find': 'test', 'filter': {}," " '$readPreference': {'mode': 'secondaryPreferred'," " 'tags': [{'dc': 'ny'}, {}]}}"); mongoc_read_prefs_destroy(read_prefs); bson_destroy(&b); } /* CDRIVER-3633 - test read prefs are sent when maxStalenessSeconds is set */ static void test_read_prefs_mongos_max_staleness(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_prefs_t *prefs; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); mongoc_read_prefs_set_max_staleness_seconds(prefs, 120); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{'a': 1}"), tmp_bson("{'exhaust': true}"), prefs); future = future_cursor_next(cursor, &doc); // Expect find command with exhaust flag and read preference. Reply with one document. { const bson_t *cmd = tmp_bson(BSON_STR({ "find" : "test", "filter" : {"a" : 1}, "$readPreference" : {"mode" : "secondaryPreferred", "maxStalenessSeconds" : {"$numberLong" : "120"}} })); request = mock_server_receives_msg(server, MONGOC_OP_MSG_FLAG_EXHAUST_ALLOWED, cmd); const bson_t *reply = tmp_bson( BSON_STR({"ok" : 1, "cursor" : {"id" : {"$numberLong" : "0"}, "ns" : "test.test", "firstBatch" : [ {} ]}})); reply_to_op_msg_request(request, MONGOC_OP_MSG_FLAG_NONE, reply); } /* mongoc_cursor_next returned true */ BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } /* CDRIVER-3583 - support for server hedged reads */ static void test_read_prefs_mongos_hedged_reads(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; bson_t hedge_doc = BSON_INITIALIZER; mongoc_read_prefs_t *prefs; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_HEDGED_READS); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); bson_append_bool(&hedge_doc, "enabled", 7, true); mlib_diagnostic_push(); mlib_disable_deprecation_warnings(); mongoc_read_prefs_set_hedge(prefs, &hedge_doc); mlib_diagnostic_pop(); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{'a': 1}"), tmp_bson("{'exhaust': true}"), prefs); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_EXHAUST_ALLOWED, tmp_bson("{'find': 'test'," " 'filter': {'a': {'$numberInt': '1'}}," " '$readPreference': {'mode': 'secondaryPreferred'," " 'hedge': {'enabled': true}}}")); reply_to_request_simple(request, "{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}"); mock_server_auto_endsessions(server); /* mongoc_cursor_next returned true */ BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); bson_destroy(&hedge_doc); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } /* test that we add readConcern only inside $query, not outside it too */ static void test_mongos_read_concern(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_prefs_t *prefs; mongoc_cursor_t *cursor; const bson_t *doc; future_t *future; request_t *request; server = mock_mongos_new(WIRE_VERSION_MIN); mock_server_run(server); mock_server_auto_endsessions(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "test", "test"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); cursor = mongoc_collection_find_with_opts( collection, tmp_bson("{'a': 1}"), tmp_bson("{'readConcern': {'level': 'foo'}}"), prefs); future = future_cursor_next(cursor, &doc); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'test'," " 'find': 'test'," " 'filter': {}," " 'readConcern': {'level': 'foo'}," " '$readPreference': {'mode': 'secondary'}," " 'readConcern': {'level': 'foo'}}")); reply_to_op_msg_request(request, MONGOC_MSG_NONE, tmp_bson("{'ok': 1," " 'cursor': {" " 'id': {'$numberLong': '0'}," " 'ns': 'db.collection'," " 'firstBatch': [{}]}}")); /* mongoc_cursor_next returned true */ BSON_ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } typedef mongoc_cursor_t *(*test_op_msg_direct_fn_t)(mongoc_collection_t *, mongoc_read_prefs_t *); /* direct connection to a secondary requires read pref primaryPreferred to * avoid "not primary" error from server */ static void _test_op_msg_direct_connection(bool is_mongos, test_op_msg_direct_fn_t fn, const char *expected_cmd) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_read_prefs_t *prefs = NULL; mongoc_cursor_t *cursor; const bson_t *doc; bson_t *cmd; future_t *future; request_t *request; const char *reply; int i; if (is_mongos) { server = mock_mongos_new(WIRE_VERSION_MAX); } else { char *hello = bson_strdup_printf("{'ok': 1.0," " 'isWritablePrimary': true," " 'setName': 'rs0'," " 'secondary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); server = mock_server_new(); mock_server_auto_hello(server, hello); bson_free(hello); } mock_server_auto_endsessions(server); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); for (i = 0; i < 2; i++) { if (i == 1) { /* user-supplied read preference primary makes no difference */ prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); } cursor = fn(collection, prefs); future = future_cursor_next(cursor, &doc); cmd = tmp_bson(expected_cmd); request = mock_server_receives_msg(server, 0, cmd); reply = "{'ok': 1," " 'cursor': {" " 'id': 0," " 'ns': 'db.collection'," " 'firstBatch': [{'a': 1}]}}"; reply_to_request_simple(request, reply); BSON_ASSERT(future_get_bool(future)); future_destroy(future); request_destroy(request); mongoc_cursor_destroy(cursor); mongoc_read_prefs_destroy(prefs); /* null ok */ } mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static mongoc_cursor_t * find(mongoc_collection_t *collection, mongoc_read_prefs_t *prefs) { return mongoc_collection_find_with_opts(collection, tmp_bson("{}"), NULL /* opts */, prefs); } static mongoc_cursor_t * aggregate(mongoc_collection_t *collection, mongoc_read_prefs_t *prefs) { return mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("{}"), NULL /* opts */, prefs); } /* direct connection to a secondary requires read pref primaryPreferred to * avoid "not primary" error from server */ static void test_op_msg_direct_secondary(void) { _test_op_msg_direct_connection(false /* is_mongos */, find, "{" " 'find': 'collection'," " '$readPreference': {'mode': 'primaryPreferred'}" "}"); _test_op_msg_direct_connection(false /* is_mongos */, aggregate, "{" " 'aggregate': 'collection'," " '$readPreference': {'mode': 'primaryPreferred'}" "}"); } /* direct connection to mongos must not auto-add read pref primaryPreferred */ static void test_op_msg_direct_mongos(void) { _test_op_msg_direct_connection(true /* is_mongos */, find, "{" " 'find': 'collection'," " '$readPreference': {'$exists': false}" "}"); _test_op_msg_direct_connection(true /* is_mongos */, aggregate, "{" " 'aggregate': 'collection'," " '$readPreference': {'$exists': false}" "}"); } void test_read_prefs_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/ReadPrefs/standalone/null", test_read_prefs_standalone_null); TestSuite_AddMockServerTest(suite, "/ReadPrefs/standalone/primary", test_read_prefs_standalone_primary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/standalone/secondary", test_read_prefs_standalone_secondary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/standalone/tags", test_read_prefs_standalone_tags); TestSuite_AddMockServerTest(suite, "/ReadPrefs/rsprimary/primary", test_read_prefs_primary_rsprimary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/rssecondary/secondary", test_read_prefs_secondary_rssecondary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/null", test_read_prefs_mongos_null); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/primary", test_read_prefs_mongos_primary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/secondary", test_read_prefs_mongos_secondary); TestSuite_AddMockServerTest( suite, "/ReadPrefs/mongos/secondaryPreferred", test_read_prefs_mongos_secondary_preferred); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/tags", test_read_prefs_mongos_tags); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/maxStaleness", test_read_prefs_mongos_max_staleness); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/hedgedReads", test_read_prefs_mongos_hedged_reads); TestSuite_AddMockServerTest(suite, "/ReadPrefs/mongos/readConcern", test_mongos_read_concern); TestSuite_AddMockServerTest(suite, "/ReadPrefs/OP_MSG/secondary", test_op_msg_direct_secondary); TestSuite_AddMockServerTest(suite, "/ReadPrefs/OP_MSG/mongos", test_op_msg_direct_mongos); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-read-write-concern.c000066400000000000000000000153041511661753600263550ustar00rootroot00000000000000#include #include #include #include #include #include #include #include static void compare_write_concern(const mongoc_write_concern_t *wc_correct, const mongoc_write_concern_t *wc) { ASSERT_CMPINT32(wc_correct->w, ==, wc->w); ASSERT_CMPINT64(wc_correct->wtimeout, ==, wc->wtimeout); ASSERT_CMPINT(wc_correct->journal, ==, wc->journal); } static void compare_read_concern(const mongoc_read_concern_t *rc_correct, const mongoc_read_concern_t *rc) { ASSERT_CMPSTR(rc_correct->level, rc->level); } mongoc_write_concern_t * convert_write_concern(const bson_t *wc_doc) { mongoc_write_concern_t *wc; bson_iter_t iter; const char *key; wc = mongoc_write_concern_new(); BSON_ASSERT(bson_iter_init(&iter, wc_doc)); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (strcmp(key, "w") == 0) { if (BSON_ITER_HOLDS_UTF8(&iter)) { if (strcmp(bson_lookup_utf8(wc_doc, "w"), "majority") == 0) { mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { mongoc_write_concern_set_wtag(wc, bson_lookup_utf8(wc_doc, "w")); } } else { if (bson_lookup_int32(wc_doc, "w") < 0) { goto invalid; } mongoc_write_concern_set_w(wc, bson_lookup_int32(wc_doc, "w")); } } else if (strcmp(key, "wtimeoutMS") == 0) { if (bson_lookup_int32(wc_doc, "wtimeoutMS") < 0) { goto invalid; } mongoc_write_concern_set_wtimeout_int64(wc, bson_lookup_int32(wc_doc, "wtimeoutMS")); } else if (strcmp(key, "journal") == 0) { mongoc_write_concern_set_journal(wc, bson_iter_value(&iter)->value.v_bool); } } if (wc->w == 0 && wc->journal == 1) { goto invalid; } return wc; invalid: mongoc_write_concern_destroy(wc); return NULL; } mongoc_read_concern_t * convert_read_concern(const bson_t *rc_doc) { mongoc_read_concern_t *rc; bson_iter_t iter; const char *key; rc = mongoc_read_concern_new(); BSON_ASSERT(bson_iter_init(&iter, rc_doc)); while (bson_iter_next(&iter)) { key = bson_iter_key(&iter); if (strcmp(key, "level") == 0) { if (BSON_ITER_HOLDS_UTF8(&iter)) { mongoc_read_concern_set_level(rc, bson_lookup_utf8(rc_doc, "level")); } else { goto invalid; } } } return rc; invalid: mongoc_read_concern_destroy(rc); return NULL; } static void test_rw_concern_uri(void *scenario_vp) { bson_iter_t scenario_iter; bson_iter_t test_iter; bson_t test; const char *description; const char *uri_str; bool valid; mongoc_uri_t *uri; bson_t rc_doc; bson_t wc_doc; const mongoc_read_concern_t *rc; const mongoc_write_concern_t *wc; mongoc_write_concern_t *wc_correct; mongoc_read_concern_t *rc_correct; BSON_ASSERT_PARAM(scenario_vp); const bson_t *const scenario = scenario_vp; /* initialize tests with the scenario */ BSON_ASSERT(bson_iter_init_find(&scenario_iter, scenario, "tests")); BSON_ASSERT(bson_iter_recurse(&scenario_iter, &test_iter)); while (bson_iter_next(&test_iter)) { bson_iter_bson(&test_iter, &test); description = bson_lookup_utf8(&test, "description"); uri_str = bson_lookup_utf8(&test, "uri"); valid = _mongoc_lookup_bool(&test, "valid", true); if (_mongoc_lookup_bool(&test, "warning", false)) { test_error("update the \"%s\" test to handle warning: true", description); } uri = mongoc_uri_new_with_error(uri_str, NULL); if (!valid) { BSON_ASSERT(!uri); continue; } BSON_ASSERT(uri); if (bson_has_field(&test, "readConcern")) { rc = mongoc_uri_get_read_concern(uri); bson_lookup_doc(&test, "readConcern", &rc_doc); rc_correct = convert_read_concern(&rc_doc); compare_read_concern(rc_correct, rc); mongoc_read_concern_destroy(rc_correct); } if (bson_has_field(&test, "writeConcern")) { wc = mongoc_uri_get_write_concern(uri); bson_lookup_doc(&test, "writeConcern", &wc_doc); wc_correct = convert_write_concern(&wc_doc); compare_write_concern(wc_correct, wc); mongoc_write_concern_destroy(wc_correct); } mongoc_uri_destroy(uri); } } static void test_rw_concern_document(void *scenario_vp) { bson_iter_t scenario_iter; bson_iter_t test_iter; bson_t test; bool valid; bson_t rc_doc; bson_t wc_doc; mongoc_write_concern_t *wc; mongoc_read_concern_t *rc; const bson_t *wc_doc_result; const bson_t *rc_doc_result; bson_t rc_doc_correct; bson_t wc_doc_correct; BSON_ASSERT_PARAM(scenario_vp); const bson_t *const scenario = scenario_vp; BSON_ASSERT(bson_iter_init_find(&scenario_iter, scenario, "tests")); BSON_ASSERT(bson_iter_recurse(&scenario_iter, &test_iter)); while (bson_iter_next(&test_iter)) { bson_iter_bson(&test_iter, &test); valid = _mongoc_lookup_bool(&test, "valid", true); if (bson_has_field(&test, "readConcern")) { bson_lookup_doc(&test, "readConcern", &rc_doc); rc = convert_read_concern(&rc_doc); } else { rc = mongoc_read_concern_new(); } if (bson_has_field(&test, "writeConcern")) { bson_lookup_doc(&test, "writeConcern", &wc_doc); wc = convert_write_concern(&wc_doc); } else { wc = mongoc_write_concern_new(); } if (!valid) { BSON_ASSERT(rc == NULL || wc == NULL); mongoc_write_concern_destroy(wc); mongoc_read_concern_destroy(rc); continue; } if (bson_has_field(&test, "readConcernDocument")) { bson_lookup_doc(&test, "readConcernDocument", &rc_doc_correct); rc_doc_result = _mongoc_read_concern_get_bson(rc); match_bson(&rc_doc_correct, rc_doc_result, false /* is_command */); } if (bson_has_field(&test, "writeConcernDocument")) { bson_lookup_doc(&test, "writeConcernDocument", &wc_doc_correct); wc_doc_result = _mongoc_write_concern_get_bson(wc); match_bson(&wc_doc_correct, wc_doc_result, false); } mongoc_write_concern_destroy(wc); mongoc_read_concern_destroy(rc); } } void test_read_write_concern_install(TestSuite *suite) { install_json_test_suite(suite, JSON_DIR, "read_write_concern/connection-string", &test_rw_concern_uri); install_json_test_suite(suite, JSON_DIR, "read_write_concern/document", &test_rw_concern_document); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-retryability-helpers.c000066400000000000000000000031041511661753600270430ustar00rootroot00000000000000#include "./test-mongoc-retryability-helpers.h" #include #include #include #include #include #include mongoc_array_t _test_get_mongos_clients(const char **ports, size_t num_ports) { bson_error_t error = {0}; mongoc_array_t clients; _mongoc_array_init(&clients, sizeof(mongoc_client_t *)); for (size_t i = 0u; i < num_ports; ++i) { const char *const port = ports[i]; char *const host_and_port = bson_strdup_printf("mongodb://localhost:%s", port); char *const uri_str = test_framework_add_user_password_from_env(host_and_port); mongoc_uri_t *const uri = mongoc_uri_new_with_error(uri_str, &error); ASSERT_OR_PRINT(uri, error); mongoc_client_t *const client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); test_framework_set_ssl_opts(client); { bson_t reply = BSON_INITIALIZER; ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, &reply, &error), error); ASSERT_WITH_MSG(bson_has_field(&reply, "msg") && strcmp(bson_lookup_utf8(&reply, "msg"), "isdbgrid") == 0, "expected a mongos on port %s", port); bson_destroy(&reply); } _mongoc_array_append_val(&clients, client); // Ownership transfer. mongoc_uri_destroy(uri); bson_free(host_and_port); bson_free(uri_str); } return clients; } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-retryability-helpers.h000066400000000000000000000014641511661753600270570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef TEST_MONGOC_RETRYABILITY_HELPERS_H #define TEST_MONGOC_RETRYABILITY_HELPERS_H #include mongoc_array_t _test_get_mongos_clients(const char **ports, size_t num_ports); #endif mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-retryable-reads.c000066400000000000000000000561471511661753600257640ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include static bool retryable_reads_test_run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bool *explicit_session = (bool *)ctx->config->ctx; bson_t reply; bson_iter_t iter; const char *op_name; uint32_t op_len; bool res; bson_iter_init_find(&iter, operation, "name"); op_name = bson_iter_utf8(&iter, &op_len); if (strcmp(op_name, "estimatedDocumentCount") == 0 || strcmp(op_name, "count") == 0) { /* CDRIVER-3612: mongoc_collection_estimated_document_count does not * support explicit sessions */ *explicit_session = false; } res = json_test_operation(ctx, test, operation, ctx->collection, *explicit_session ? ctx->sessions[0] : NULL, &reply); bson_destroy(&reply); return res; } /* Callback for JSON tests from Retryable Reads Spec */ static void test_retryable_reads_cb(void *scenario) { bool explicit_session; json_test_config_t config = JSON_TEST_CONFIG_INIT; /* use the context pointer to send "explicit_session" to the callback */ config.ctx = &explicit_session; config.run_operation_cb = retryable_reads_test_run_operation; config.scenario = scenario; config.command_started_events_only = true; explicit_session = true; run_json_general_test(&config); explicit_session = false; run_json_general_test(&config); } static void _set_failpoint(mongoc_client_t *client) { bson_error_t error; bson_t *cmd = tmp_bson("{'configureFailPoint': 'failCommand'," " 'mode': {'times': 1}," " 'data': {'errorCode': 10107, 'failCommands': ['count']}}"); ASSERT(client); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", cmd, NULL, NULL, &error), error); } /* Test code paths for all command helpers */ static void test_cmd_helpers(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; uint32_t server_id; mongoc_collection_t *collection; bson_t *cmd; bson_t reply; bson_error_t error; bson_iter_t iter; mongoc_database_t *database; BSON_UNUSED(ctx); uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, true); client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); /* clean up in case a previous test aborted */ const mongoc_ss_log_context_t ss_log_context = {.operation = "configureFailPoint"}; server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); deactivate_fail_points(client, server_id); collection = get_test_collection(client, "retryable_reads"); database = mongoc_client_get_database(client, "test"); if (!mongoc_collection_drop(collection, &error)) { if (NULL == strstr(error.message, "ns not found")) { /* an error besides ns not found */ ASSERT_OR_PRINT(false, error); } } ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, tmp_bson("{'_id': 0}"), NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, tmp_bson("{'_id': 1}"), NULL, NULL, &error), error); cmd = tmp_bson("{'count': '%s'}", collection->collection); /* read helpers must retry. */ _set_failpoint(client); ASSERT_OR_PRINT(mongoc_client_read_command_with_opts(client, "test", cmd, NULL, NULL, &reply, &error), error); bson_iter_init_find(&iter, &reply, "n"); ASSERT(bson_iter_as_int64(&iter) == 2); bson_destroy(&reply); _set_failpoint(client); ASSERT_OR_PRINT(mongoc_database_read_command_with_opts(database, cmd, NULL, NULL, &reply, &error), error); bson_iter_init_find(&iter, &reply, "n"); ASSERT(bson_iter_as_int64(&iter) == 2); bson_destroy(&reply); _set_failpoint(client); ASSERT_OR_PRINT(mongoc_collection_read_command_with_opts(collection, cmd, NULL, NULL, &reply, &error), error); bson_iter_init_find(&iter, &reply, "n"); ASSERT(bson_iter_as_int64(&iter) == 2); bson_destroy(&reply); /* TODO: once CDRIVER-3314 is resolved, test the read+write helpers. */ /* read/write agnostic command_simple helpers must not retry. */ _set_failpoint(client); ASSERT(!mongoc_client_command_simple(client, "test", cmd, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); _set_failpoint(client); ASSERT(!mongoc_database_command_simple(database, cmd, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); _set_failpoint(client); ASSERT(!mongoc_collection_command_simple(collection, cmd, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); /* read/write agnostic command_with_opts helpers must not retry. */ _set_failpoint(client); ASSERT(!mongoc_client_command_with_opts(client, "test", cmd, NULL, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); _set_failpoint(client); ASSERT(!mongoc_database_command_with_opts(database, cmd, NULL, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); _set_failpoint(client); ASSERT(!mongoc_collection_command_with_opts(collection, cmd, NULL, NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); /* read/write agnostic command_simple_with_server_id helper must not retry. */ server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); _set_failpoint(client); ASSERT(!mongoc_client_command_simple_with_server_id(client, "test", cmd, NULL, server_id, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 10107, "Failing command"); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); deactivate_fail_points(client, server_id); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_retry_reads_off(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *collection; uint32_t server_id; bson_t *cmd; bson_error_t error; bool res; BSON_UNUSED(ctx); uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, "retryreads", false); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); /* clean up in case a previous test aborted */ const mongoc_ss_log_context_t ss_log_context = {.operation = "configureFailPoint"}; server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); deactivate_fail_points(client, server_id); collection = get_test_collection(client, "retryable_reads"); cmd = tmp_bson("{'configureFailPoint': 'failCommand'," " 'mode': {'times': 1}," " 'data': {'errorCode': 10107, 'failCommands': ['count']}}"); ASSERT_OR_PRINT(mongoc_client_command_simple_with_server_id(client, "admin", cmd, NULL, server_id, NULL, &error), error); cmd = tmp_bson("{'count': 'coll'}", collection->collection); res = mongoc_collection_read_command_with_opts(collection, cmd, NULL, NULL, NULL, &error); ASSERT(!res); ASSERT_CONTAINS(error.message, "failpoint"); deactivate_fail_points(client, server_id); mongoc_collection_destroy(collection); mongoc_uri_destroy(uri); mongoc_client_destroy(client); } typedef struct _test_retry_reads_sharded_on_other_mongos_ctx { int count; uint16_t ports[2]; } test_retry_reads_sharded_on_other_mongos_ctx; static void _test_retry_reads_sharded_on_other_mongos_cb(const mongoc_apm_command_failed_t *event) { BSON_ASSERT_PARAM(event); test_retry_reads_sharded_on_other_mongos_ctx *const ctx = (test_retry_reads_sharded_on_other_mongos_ctx *)mongoc_apm_command_failed_get_context(event); BSON_ASSERT(ctx); ASSERT_WITH_MSG(ctx->count < 2, "expected at most two failpoints to trigger"); const mongoc_host_list_t *const host = mongoc_apm_command_failed_get_host(event); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->ports[ctx->count++] = host->port; } // Retryable Reads Are Retried on a Different mongos if One is Available static void test_retry_reads_sharded_on_other_mongos(void *_ctx) { BSON_UNUSED(_ctx); bson_error_t error = {0}; // Create two clients `s0` and `s1` that each connect to a single mongos from // the sharded cluster. They must not connect to the same mongos. const char *ports[] = {"27017", "27018"}; const size_t num_ports = sizeof(ports) / sizeof(*ports); mongoc_array_t clients = _test_get_mongos_clients(ports, num_ports); BSON_ASSERT(clients.len == 2u); mongoc_client_t *const s0 = _mongoc_array_index(&clients, mongoc_client_t *, 0u); mongoc_client_t *const s1 = _mongoc_array_index(&clients, mongoc_client_t *, 1u); BSON_ASSERT(s0 && s1); // Deprioritization cannot be deterministically asserted by this test due to // randomized selection from suitable servers. Repeat the test a few times to // increase the likelihood of detecting incorrect deprioritization behavior. for (int i = 0; i < 10; ++i) { // Configure the following fail point for both s0 and s1: { bson_t *const command = tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': { 'times': 1 }," " 'data': {" " 'failCommands': ['find']," " 'errorCode': 6" " }" "}"); ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", command, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_command_simple(s1, "admin", command, NULL, NULL, &error), error); } // Create a client client with `retryReads=true` that connects to the // cluster with both mongoses used by `s0` and `s1` in the initial seed // list. mongoc_client_t *client = NULL; { const char *const host_and_port = "mongodb://localhost:27017,localhost:27018/?retryReads=true"; char *const uri_str = test_framework_add_user_password_from_env(host_and_port); mongoc_uri_t *const uri = mongoc_uri_new(uri_str); client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); bson_free(uri_str); } BSON_ASSERT(client); { test_retry_reads_sharded_on_other_mongos_ctx ctx = {0}; // Enable failed command event monitoring for client. { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, _test_retry_reads_sharded_on_other_mongos_cb); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_apm_callbacks_destroy(callbacks); } // Execute a `find` command with `client`. Assert that the command // failed. { mongoc_database_t *const db = mongoc_client_get_database(client, "db"); mongoc_collection_t *const coll = mongoc_database_get_collection(db, "test"); mongoc_cursor_t *const cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL, NULL); const bson_t *reply = NULL; ASSERT_WITH_MSG(!mongoc_cursor_next(cursor, &reply), "expected find command to fail"); ASSERT_WITH_MSG(mongoc_cursor_error(cursor, &error), "expected find command to fail"); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } // Assert that two failed command events occurred. ASSERT_WITH_MSG(ctx.count == 2, "expected exactly 2 failpoints to trigger, but " "observed %d with error: %s", ctx.count, error.message); // Assert that both events occurred on different mongoses. ASSERT_WITH_MSG((ctx.ports[0] == 27017 || ctx.ports[0] == 27018) && (ctx.ports[1] == 27017 || ctx.ports[1] == 27018) && (ctx.ports[0] != ctx.ports[1]), "expected failpoints to trigger once on each mongos, " "but observed failures on %d and %d", ctx.ports[0], ctx.ports[1]); mongoc_client_destroy(client); } // Disable the fail point on both s0 and s1. { bson_t *const command = tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': 'off'" "}"); ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", command, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_command_simple(s1, "admin", command, NULL, NULL, &error), error); } } mongoc_client_destroy(s0); mongoc_client_destroy(s1); _mongoc_array_destroy(&clients); } typedef struct _test_retry_reads_sharded_on_same_mongos_ctx { int failed_count; int succeeded_count; uint16_t failed_port; uint16_t succeeded_port; } test_retry_reads_sharded_on_same_mongos_ctx; static void _test_retry_reads_sharded_on_same_mongos_cb(test_retry_reads_sharded_on_same_mongos_ctx *ctx, const mongoc_apm_command_failed_t *failed, const mongoc_apm_command_succeeded_t *succeeded) { BSON_ASSERT_PARAM(ctx); BSON_OPTIONAL_PARAM(failed); BSON_OPTIONAL_PARAM(succeeded); ASSERT_WITH_MSG(ctx->failed_count + ctx->succeeded_count < 2, "expected at most two events, but observed %d failed and %d succeeded", ctx->failed_count, ctx->succeeded_count); if (failed) { ctx->failed_count += 1; const mongoc_host_list_t *const host = mongoc_apm_command_failed_get_host(failed); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->failed_port = host->port; } if (succeeded) { ctx->succeeded_count += 1; const mongoc_host_list_t *const host = mongoc_apm_command_succeeded_get_host(succeeded); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->succeeded_port = host->port; } } static void _test_retry_reads_sharded_on_same_mongos_failed_cb(const mongoc_apm_command_failed_t *event) { _test_retry_reads_sharded_on_same_mongos_cb(mongoc_apm_command_failed_get_context(event), event, NULL); } static void _test_retry_reads_sharded_on_same_mongos_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { _test_retry_reads_sharded_on_same_mongos_cb(mongoc_apm_command_succeeded_get_context(event), NULL, event); } // Retryable Reads Are Retried on the Same mongos if No Others are Available static void test_retry_reads_sharded_on_same_mongos(void *_ctx) { BSON_UNUSED(_ctx); bson_error_t error = {0}; // Create a client `s0` that connects to a single mongos from the cluster. const char *ports[] = {"27017"}; const size_t num_ports = sizeof(ports) / sizeof(*ports); mongoc_array_t clients = _test_get_mongos_clients(ports, num_ports); BSON_ASSERT(clients.len == 1u); mongoc_client_t *const s0 = _mongoc_array_index(&clients, mongoc_client_t *, 0u); BSON_ASSERT(s0); // Configure the following fail point for `s0`: ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': { 'times': 1 }," " 'data': {" " 'failCommands': ['find']," " 'errorCode': 6" " }" "}"), NULL, NULL, &error), error); // Create a client client with `directConnection=false` (when not set by // default) and `retryReads=true` that connects to the cluster using the same // single mongos as `s0`. mongoc_client_t *client = NULL; { const char *const host_and_port = "mongodb://localhost:27017/?retryReads=true&directConnection=false"; char *const uri_str = test_framework_add_user_password_from_env(host_and_port); mongoc_uri_t *const uri = mongoc_uri_new(uri_str); client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); bson_free(uri_str); } BSON_ASSERT(client); { test_retry_reads_sharded_on_same_mongos_ctx ctx = { .failed_count = 0, .succeeded_count = 0, }; // Enable succeeded and failed command event monitoring for `client`. { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, _test_retry_reads_sharded_on_same_mongos_failed_cb); mongoc_apm_set_command_succeeded_cb(callbacks, _test_retry_reads_sharded_on_same_mongos_succeeded_cb); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_apm_callbacks_destroy(callbacks); } // Execute a `find` command with `client`. Assert that the command // succeeded. { mongoc_database_t *const db = mongoc_client_get_database(client, "db"); mongoc_collection_t *const coll = mongoc_database_get_collection(db, "test"); bson_t opts = BSON_INITIALIZER; { // Ensure drop from earlier is observed. mongoc_read_concern_t *const rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_read_concern_append(rc, &opts); mongoc_read_concern_destroy(rc); } mongoc_cursor_t *const cursor = mongoc_collection_find_with_opts(coll, &opts, NULL, NULL); const bson_t *reply = NULL; (void)mongoc_cursor_next(cursor, &reply); ASSERT_WITH_MSG( !mongoc_cursor_error(cursor, &error), "expecting find to succeed, but observed error: %s", error.message); mongoc_cursor_destroy(cursor); bson_destroy(&opts); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } // Avoid capturing additional events. mongoc_client_set_apm_callbacks(client, NULL, NULL); // Assert that exactly one failed command event and one succeeded command // event occurred. ASSERT_WITH_MSG(ctx.failed_count == 1 && ctx.succeeded_count == 1, "expected exactly one failed event and one succeeded " "event, but observed %d failures and %d successes with error: %s", ctx.failed_count, ctx.succeeded_count, ctx.succeeded_count > 1 ? "none" : error.message); // Assert that both events occurred on the same mongos. ASSERT_WITH_MSG(ctx.failed_port == ctx.succeeded_port, "expected failed and succeeded events on the same mongos, but " "instead observed port %d (failed) and port %d (succeeded)", ctx.failed_port, ctx.succeeded_port); mongoc_client_destroy(client); } // Disable the fail point on s0. ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': 'off'" "}"), NULL, NULL, &error), error); mongoc_client_destroy(s0); _mongoc_array_destroy(&clients); } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for retryable reads. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite_with_check(suite, JSON_DIR, "retryable_reads/legacy", test_retryable_reads_cb, TestSuite_CheckLive, test_framework_skip_if_no_failpoint, test_framework_skip_if_slow); } void test_retryable_reads_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddFull(suite, "/retryable_reads/cmd_helpers [lock:live-server]", test_cmd_helpers, NULL, NULL, test_framework_skip_if_mongos, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/retryable_reads/retry_off [lock:live-server]", test_retry_reads_off, NULL, NULL, test_framework_skip_if_mongos, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/retryable_reads/sharded/on_other_mongos [lock:live-server]", test_retry_reads_sharded_on_other_mongos, NULL, NULL, test_framework_skip_if_not_mongos, test_framework_skip_if_no_failpoint); TestSuite_AddFull(suite, "/retryable_reads/sharded/on_same_mongos [lock:live-server]", test_retry_reads_sharded_on_same_mongos, NULL, NULL, test_framework_skip_if_not_mongos, test_framework_skip_if_no_failpoint); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-retryable-writes.c000066400000000000000000001447351511661753600262040ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include static bool retryable_writes_test_run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bool *explicit_session = (bool *)ctx->config->ctx; bson_t reply; bool res; res = json_test_operation(ctx, test, operation, ctx->collection, *explicit_session ? ctx->sessions[0] : NULL, &reply); bson_destroy(&reply); return res; } static test_skip_t skips[] = { {.description = "InsertOne fails after multiple retryable writeConcernErrors", .reason = "Waiting on CDRIVER-3790"}, {0}}; /* Callback for JSON tests from Retryable Writes Spec */ static void test_retryable_writes_cb(void *scenario) { bool explicit_session; json_test_config_t config = JSON_TEST_CONFIG_INIT; config.skips = skips; /* use the context pointer to send "explicit_session" to the callback */ config.ctx = &explicit_session; config.run_operation_cb = retryable_writes_test_run_operation; config.scenario = scenario; config.command_started_events_only = true; explicit_session = true; run_json_general_test(&config); explicit_session = false; run_json_general_test(&config); } /* "Replica Set Failover Test" from Retryable Writes Spec */ static void test_rs_failover(void) { mock_rs_t *rs; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_client_session_t *cs; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; bson_t *b = tmp_bson("{}"); rs = mock_rs_with_auto_hello(WIRE_VERSION_MAX, true /* has primary */, 2 /* secondaries */, 0 /* arbiters */); mock_rs_run(rs); uri = mongoc_uri_copy(mock_rs_get_uri(rs)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); cs = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(cs, error); ASSERT_OR_PRINT(mongoc_client_session_append(cs, &opts, &error), error); /* initial insert triggers replica set discovery */ future = future_collection_insert_one(collection, b, &opts, NULL, &error); request = mock_rs_receives_msg(rs, 0, tmp_bson("{'insert': 'collection'}"), b); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); /* failover */ mock_rs_stepdown(rs); mock_rs_elect(rs, 1 /* server id */); /* insert receives "not primary" from old primary, reselects and retries */ future = future_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); request = mock_rs_receives_msg(rs, 0, tmp_bson("{'insert': 'collection'}"), b); BSON_ASSERT(mock_rs_request_is_to_secondary(rs, request)); reply_to_request_simple(request, "{" " 'ok': 0," " 'code': 10107," " 'errmsg': 'not primary'," " 'errorLabels': ['RetryableWriteError']" "}"); request_destroy(request); request = mock_rs_receives_msg(rs, 0, tmp_bson("{'insert': 'collection'}"), b); BSON_ASSERT(mock_rs_request_is_to_primary(rs, request)); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); bson_destroy(&opts); mongoc_client_session_destroy(cs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_rs_destroy(rs); } /* Test code paths for _mongoc_client_command_with_opts. * This test requires a 3.6+ replica set to support the * onPrimaryTransactionalWrite failpoint. */ static void test_command_with_opts(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; uint32_t server_id; mongoc_collection_t *collection; bson_t *cmd; bson_t reply; bson_t reply_result; bson_error_t error; BSON_UNUSED(ctx); uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); /* clean up in case a previous test aborted */ server_id = mongoc_topology_select_server_id( client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); deactivate_fail_points(client, server_id); collection = get_test_collection(client, "retryable_writes"); if (!mongoc_collection_drop(collection, &error)) { if (NULL == strstr(error.message, "ns not found")) { /* an error besides ns not found */ ASSERT_OR_PRINT(false, error); } } ASSERT_OR_PRINT(mongoc_collection_insert_one(collection, tmp_bson("{'_id':1, 'x': 1}"), NULL, NULL, &error), error); cmd = tmp_bson("{'configureFailPoint': 'onPrimaryTransactionalWrite'," " 'mode': {'times': 1}," " 'data': {'failBeforeCommitExceptionCode': 1}}"); ASSERT_OR_PRINT(mongoc_client_command_simple_with_server_id(client, "admin", cmd, NULL, server_id, NULL, &error), error); cmd = tmp_bson("{'findAndModify': '%s', 'query': {'_id': 1}, 'update': " "{'$inc': {'x': 1}}, 'new': true}", collection->collection); ASSERT_OR_PRINT(mongoc_collection_read_write_command_with_opts(collection, cmd, NULL, NULL, &reply, &error), error); bson_lookup_doc(&reply, "value", &reply_result); assert_match_bson(&reply_result, tmp_bson("{'_id': 1, 'x': 2}"), false); deactivate_fail_points(client, server_id); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_destroy(&reply_result); bson_destroy(&reply); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_insert_one_unacknowledged(void) { mongoc_uri_t *uri; mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_append(wc, &opts); future = future_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); request = mock_server_receives_msg(server, 2, /* set moreToCome bit in mongoc_op_msg_flags_t */ tmp_bson("{'txnNumber': {'$exists': false}, 'lsid': {'$exists': false}}"), tmp_bson("{}")); ASSERT(future_get_bool(future)); mock_server_auto_endsessions(server); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); request_destroy(request); bson_destroy(&opts); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_update_one_unacknowledged(void) { mongoc_uri_t *uri; mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_append(wc, &opts); future = future_collection_update_one(collection, tmp_bson("{}"), tmp_bson("{'$set': {'x': 1}}"), &opts, NULL, &error); request = mock_server_receives_msg(server, 2, /* set moreToCome bit in mongoc_op_msg_flags_t */ tmp_bson("{'txnNumber': {'$exists': false}, 'lsid': {'$exists': false}}"), tmp_bson("{'q': {}, 'u': {'$set': {'x': 1}}}")); ASSERT(future_get_bool(future)); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); request_destroy(request); bson_destroy(&opts); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_delete_one_unacknowledged(void) { mongoc_uri_t *uri; mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_append(wc, &opts); future = future_collection_delete_one(collection, tmp_bson("{}"), &opts, NULL, &error); request = mock_server_receives_msg(server, 2, /* set moreToCome bit in mongoc_op_msg_flags_t */ tmp_bson("{'txnNumber': {'$exists': false}, 'lsid': {'$exists': false}}"), tmp_bson("{'q': {}, 'limit': 1}")); ASSERT(future_get_bool(future)); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); request_destroy(request); bson_destroy(&opts); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_bulk_operation_execute_unacknowledged(void) { mongoc_uri_t *uri; mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *wc; mongoc_bulk_operation_t *bulk; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_set_journal(wc, false); mongoc_write_concern_append(wc, &opts); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, tmp_bson("{'_id': 1}")); future = future_bulk_operation_execute(bulk, NULL, &error); request = mock_server_receives_msg(server, 2, /* set moreToCome bit in mongoc_op_msg_flags_t */ tmp_bson("{'txnNumber': {'$exists': false}, 'lsid': {'$exists': false}}"), tmp_bson("{'_id': 1}")); ASSERT(future_get_uint32_t(future) == 1); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); mongoc_bulk_operation_destroy(bulk); request_destroy(request); bson_destroy(&opts); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_remove_unacknowledged(void) { mongoc_uri_t *uri; mock_server_t *server; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *wc; bson_t opts = BSON_INITIALIZER; future_t *future; request_t *request; bson_error_t error; server = mock_mongos_new(WIRE_VERSION_MAX); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); collection = mongoc_client_get_collection(client, "db", "collection"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_write_concern_set_journal(wc, false); future = future_collection_remove(collection, MONGOC_REMOVE_NONE, tmp_bson("{'a': 1}"), wc, &error); request = mock_server_receives_msg(server, 2, /* set moreToCome bit in mongoc_op_msg_flags_t */ tmp_bson("{'txnNumber': {'$exists': false}, 'lsid': {'$exists': false}}"), tmp_bson("{'q': {'a': 1}, 'limit': 0}")); ASSERT(future_get_bool(future)); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); request_destroy(request); bson_destroy(&opts); future_destroy(future); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_retry_no_crypto(void *ctx) { mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool; BSON_UNUSED(ctx); capture_logs(true); /* Test that no warning is logged if retryWrites is disabled. Warning logic * is implemented in mongoc_topology_new, but test all public APIs that use * the common code path. */ client = test_framework_client_new("mongodb://localhost/?retryWrites=false", NULL); BSON_ASSERT(client); ASSERT_NO_CAPTURED_LOGS("test_framework_client_new and retryWrites=false"); mongoc_client_destroy(client); uri = mongoc_uri_new("mongodb://localhost/?retryWrites=false"); BSON_ASSERT(uri); client = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client); ASSERT_NO_CAPTURED_LOGS("test_framework_client_new_from_uri and retryWrites=false"); mongoc_client_destroy(client); pool = test_framework_client_pool_new_from_uri(uri, NULL); BSON_ASSERT(pool); ASSERT_NO_CAPTURED_LOGS("test_framework_client_pool_new_from_uri and retryWrites=false"); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); /* Test that a warning is logged if retryWrites is enabled. */ client = test_framework_client_new("mongodb://localhost/?retryWrites=true", NULL); BSON_ASSERT(client); ASSERT_CAPTURED_LOG("test_framework_client_new and retryWrites=true", MONGOC_LOG_LEVEL_WARNING, "retryWrites not supported without an SSL crypto library"); mongoc_client_destroy(client); clear_captured_logs(); uri = mongoc_uri_new("mongodb://localhost/?retryWrites=true"); BSON_ASSERT(uri); client = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client); ASSERT_CAPTURED_LOG("test_framework_client_new_from_uri and retryWrites=true", MONGOC_LOG_LEVEL_WARNING, "retryWrites not supported without an SSL crypto library"); mongoc_client_destroy(client); clear_captured_logs(); pool = test_framework_client_pool_new_from_uri(uri, NULL); BSON_ASSERT(pool); ASSERT_CAPTURED_LOG("test_framework_client_pool_new_from_uri and retryWrites=true", MONGOC_LOG_LEVEL_WARNING, "retryWrites not supported without an SSL crypto library"); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } static void test_unsupported_storage_engine_error(void) { mock_rs_t *rs; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; bson_t reply; bson_error_t error; future_t *future; request_t *request; mongoc_client_session_t *session; bson_t opts; const char *expected_msg = "This MongoDB deployment does not support " "retryable writes. Please add retryWrites=false " "to your connection string."; rs = mock_rs_with_auto_hello(WIRE_VERSION_MAX, true, 0, 0); mock_rs_run(rs); uri = mongoc_uri_copy(mock_rs_get_uri(rs)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYWRITES, true); client = test_framework_client_new_from_uri(uri, NULL); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "test", "test"); bson_init(&opts); ASSERT_OR_PRINT(mongoc_client_session_append(session, &opts, &error), error); /* findandmodify is retryable through mongoc_client_write_command_with_opts. */ future = future_client_write_command_with_opts( client, "test", tmp_bson("{'findandmodify': 'coll' }"), &opts, &reply, &error); request = mock_rs_receives_request(rs); reply_to_request_simple(request, "{'ok': 0, 'code': 20, 'errmsg': 'Transaction numbers are great'}"); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 20, expected_msg); ASSERT_MATCH(&reply, "{'code': 20, 'errmsg': '%s'}", expected_msg); bson_destroy(&opts); mongoc_client_session_destroy(session); bson_destroy(&reply); future_destroy(future); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_rs_destroy(rs); } /* The following 3 tests check that the original reply and error is returned * after encountering an error with a RetryableWriteError and a * NoWritesPerformed label. The tests use the same callback function. * * Each test checks a different code path for retryable writes: * mongoc_collection_insert_one, mongoc_client_command_simple, and * mongoc_collection_find_and_modify_with_opts * * These tests require a >=6.0 replica set. */ typedef struct { mongoc_client_t *client; bool configure_second_fail; char *failCommand; } prose_test_3_apm_ctx_t; static void prose_test_3_on_command_success(const mongoc_apm_command_succeeded_t *event) { bson_iter_t iter; bson_error_t error; const bson_t *reply = mongoc_apm_command_succeeded_get_reply(event); prose_test_3_apm_ctx_t *ctx = mongoc_apm_command_succeeded_get_context(event); // wait for a writeConcernError and then set a second failpoint if (bson_iter_init_find(&iter, reply, "writeConcernError") && ctx->configure_second_fail) { ctx->configure_second_fail = false; ASSERT_OR_PRINT( mongoc_client_command_simple(ctx->client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}," " 'data': { 'failCommands': ['%s'], 'errorCode': " "10107, " "'errorLabels': ['RetryableWriteError', 'NoWritesPerformed']}}", ctx->failCommand), NULL, NULL, &error), error); } } static uint32_t set_up_original_error_test(mongoc_apm_callbacks_t *callbacks, prose_test_3_apm_ctx_t *apm_ctx, char *failCommand, mongoc_client_t *client) { uint32_t server_id; bson_error_t error; ASSERT(client); // clean up in case a previous test aborted const mongoc_ss_log_context_t ss_log_context = {.operation = "configureFailPoint"}; server_id = mongoc_topology_select_server_id(client->topology, MONGOC_SS_WRITE, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_id, error); deactivate_fail_points(client, server_id); // set up callbacks for command monitoring apm_ctx->client = client; apm_ctx->failCommand = failCommand; apm_ctx->configure_second_fail = true; mongoc_apm_set_command_succeeded_cb(callbacks, prose_test_3_on_command_success); mongoc_client_set_apm_callbacks(client, callbacks, apm_ctx); // configure the first fail point bool ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': {'times': 1}, " "'data': {'failCommands': ['%s'], 'errorLabels': " "['RetryableWriteError'], 'writeConcernError': {'code': 91 }}}", failCommand), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); return server_id; } static void cleanup_original_error_test(mongoc_client_t *client, uint32_t server_id, bson_t *reply, mongoc_collection_t *coll, mongoc_apm_callbacks_t *callbacks) { ASSERT(client); deactivate_fail_points(client, server_id); // disable the fail point bson_destroy(reply); mongoc_collection_destroy(coll); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_destroy(client); } static void retryable_writes_prose_test_3(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; bson_t reply; bson_error_t error = {0}; mongoc_apm_callbacks_t *callbacks = {0}; prose_test_3_apm_ctx_t apm_ctx = {0}; BSON_UNUSED(ctx); // setting up the client client = test_framework_new_default_client(); coll = get_test_collection(client, "retryable_writes"); callbacks = mongoc_apm_callbacks_new(); // setup test const uint32_t server_id = set_up_original_error_test(callbacks, &apm_ctx, "insert", client); // attempt an insertOne operation ASSERT(!mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL /* opts */, &reply, &error)); // writeConcernErrors are returned in the reply and not as an error ASSERT_ERROR_CONTAINS(error, 0, 0, ""); // the reply holds the original error information ASSERT_MATCH(&reply, "{'insertedCount': 1, 'writeConcernErrors': [{ 'code': 91 }], " "'errorLabels': ['RetryableWriteError']}"); cleanup_original_error_test(client, server_id, &reply, coll, callbacks); } static void retryable_writes_original_error_find_modify(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; bson_t reply; bson_error_t error = {0}; mongoc_apm_callbacks_t *callbacks = {0}; prose_test_3_apm_ctx_t apm_ctx = {0}; mongoc_find_and_modify_opts_t *opts; BSON_UNUSED(ctx); // setting up the client client = test_framework_new_default_client(); coll = get_test_collection(client, "retryable_writes"); callbacks = mongoc_apm_callbacks_new(); // setup the test const uint32_t server_id = set_up_original_error_test(callbacks, &apm_ctx, "findAndModify", client); // setup for findAndModify bson_t query = BSON_INITIALIZER; BSON_APPEND_UTF8(&query, "x", "1"); bson_t *update = BCON_NEW("$inc", "{", "x", BCON_INT32(1), "}"); opts = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_set_update(opts, update); // attempt a findAndModify operation ASSERT(!mongoc_collection_find_and_modify_with_opts(coll, &query, opts, &reply, &error)); // assert error contains a writeConcernError with original error code ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, 91, ""); // the reply holds the original error information ASSERT_MATCH(&reply, "{'lastErrorObject' : { 'n': 0, 'updatedExisting' : false }, 'value' : " "null, 'writeConcernError' : { 'code': 91 }, 'errorLabels' : [ " "'RetryableWriteError' ], 'ok' : 1.0}"); cleanup_original_error_test(client, server_id, &reply, coll, callbacks); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&query); bson_destroy(update); } static void retryable_writes_original_error_general_command(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; bson_t reply; bson_error_t error = {0}; mongoc_apm_callbacks_t *callbacks = {0}; prose_test_3_apm_ctx_t apm_ctx = {0}; BSON_UNUSED(ctx); // setting up the client client = test_framework_new_default_client(); coll = get_test_collection(client, "retryable_writes"); callbacks = mongoc_apm_callbacks_new(); // setup test const uint32_t server_id = set_up_original_error_test(callbacks, &apm_ctx, "insert", client); bson_t *cmd = BCON_NEW("insert", mongoc_collection_get_name(coll), "documents", "[", "{", "}", "]"); // attempt an insert operation ASSERT(!mongoc_client_write_command_with_opts(client, "test", cmd, NULL, &reply, &error)); // assert error contains a writeConcernError with original error code ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_WRITE_CONCERN, 91, ""); // the reply holds the original error information ASSERT_MATCH(&reply, "{'writeConcernError' : { 'code' : { '$numberInt' : '91' } }, " "'errorLabels' : [ 'RetryableWriteError' ], 'ok': { " "'$numberDouble' : '1.0' }}"); cleanup_original_error_test(client, server_id, &reply, coll, callbacks); bson_destroy(cmd); } static void retryable_writes_original_error_bulkwrite(void *ctx) { mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error = {0}; mongoc_apm_callbacks_t *callbacks = {0}; prose_test_3_apm_ctx_t apm_ctx = {0}; BSON_UNUSED(ctx); // setting up the client client = test_framework_new_default_client(); coll = get_test_collection(client, "retryable_writes"); callbacks = mongoc_apm_callbacks_new(); // setup test const uint32_t server_id = set_up_original_error_test(callbacks, &apm_ctx, "bulkWrite", client); mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bool ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); ASSERT(bwr.exc); // Expect no top-level error (only a write concern error): ASSERT_OR_PRINT(!mongoc_bulkwriteexception_error(bwr.exc, &error), error); // Expect the original write concern error is returned: const bson_t *reply = mongoc_bulkwriteexception_errorreply(bwr.exc); ASSERT_MATCH(reply, "{'writeConcernError' : { 'code' : { '$numberInt' : '91' } }, " "'errorLabels' : [ 'RetryableWriteError' ], 'ok': { " "'$numberDouble' : '1.0' }}"); cleanup_original_error_test(client, server_id, NULL, coll, callbacks); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwrite_destroy(bw); } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for retryable writes. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite_with_check(suite, JSON_DIR, "retryable_writes/legacy", test_retryable_writes_cb, TestSuite_CheckLive, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); } typedef struct { int num_inserts; int num_updates; } _tracks_new_server_counters_t; static void _tracks_new_server_cb(const mongoc_apm_command_started_t *event) { const char *cmd_name; _tracks_new_server_counters_t *counters; cmd_name = mongoc_apm_command_started_get_command_name(event); counters = (_tracks_new_server_counters_t *)mongoc_apm_command_started_get_context(event); if (0 == strcmp(cmd_name, "insert")) { counters->num_inserts++; } else if (0 == strcmp(cmd_name, "update")) { counters->num_updates++; } } /* Tests that when a command within a bulk write succeeds after a retryable * error, and selects a new server, it continues to use that server in * subsequent commands. * This test requires running against a replica set with at least one * secondary. */ static void test_bulk_retry_tracks_new_server(void *unused) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_error_t error; mongoc_read_prefs_t *read_prefs; bool ret; mongoc_server_description_t *sd; mongoc_apm_callbacks_t *callbacks; _tracks_new_server_counters_t counters = {0}; BSON_UNUSED(unused); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, _tracks_new_server_cb); client = test_framework_new_default_client(); mongoc_client_set_apm_callbacks(client, callbacks, &counters); collection = get_test_collection(client, "tracks_new_server"); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* The bulk write contains two operations, an insert, followed by an * update. */ ret = mongoc_bulk_operation_insert_with_opts(bulk, tmp_bson("{'x': 1}"), NULL /* opts */, &error); ASSERT_OR_PRINT(ret, error); mongoc_bulk_operation_update_one(bulk, tmp_bson("{}"), tmp_bson("{'$inc': {'x': 1}}"), false /* upsert */); /* Explicitly tell the bulk write to use a secondary. That will result in * a retryable error, causing the first command to be sent twice. */ read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); sd = mongoc_client_select_server(client, false /* for_writes */, read_prefs, &error); ASSERT_OR_PRINT(sd, error); mongoc_bulk_operation_set_server_id(bulk, mongoc_server_description_id(sd)); ret = mongoc_bulk_operation_execute(bulk, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* The first insert fails with a retryable write error since it is sent to * a secondary. The retry selects the primary and succeeds. The second * command should use the newly selected server, so the update succeeds on * the first try. */ ASSERT_CMPINT(counters.num_inserts, ==, 2); ASSERT_CMPINT(counters.num_updates, ==, 1); ASSERT_CMPINT(mongoc_bulk_operation_get_server_id(bulk), !=, mongoc_server_description_id(sd)); mongoc_apm_callbacks_destroy(callbacks); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(read_prefs); mongoc_bulk_operation_destroy(bulk); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } typedef struct _test_retry_writes_sharded_on_other_mongos_ctx { int count; uint16_t ports[2]; } test_retry_writes_sharded_on_other_mongos_ctx; static void _test_retry_writes_sharded_on_other_mongos_cb(const mongoc_apm_command_failed_t *event) { BSON_ASSERT_PARAM(event); test_retry_writes_sharded_on_other_mongos_ctx *const ctx = (test_retry_writes_sharded_on_other_mongos_ctx *)mongoc_apm_command_failed_get_context(event); BSON_ASSERT(ctx); ASSERT_WITH_MSG(ctx->count < 2, "expected at most two failpoints to trigger"); const mongoc_host_list_t *const host = mongoc_apm_command_failed_get_host(event); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->ports[ctx->count++] = host->port; } typedef bool (*cmd_fn)(mongoc_client_t *client, bson_error_t *error); // Test that in a sharded cluster writes are retried on a different mongos when // one is available. static void retryable_writes_sharded_on_other_mongos_impl(const char *cmd_name, cmd_fn cmd_func) { bson_error_t error = {0}; // Create two clients `s0` and `s1` that each connect to a single mongos from // the sharded cluster. They must not connect to the same mongos. const char *ports[] = {"27017", "27018"}; const size_t num_ports = sizeof(ports) / sizeof(*ports); mongoc_array_t clients = _test_get_mongos_clients(ports, num_ports); BSON_ASSERT(clients.len == 2u); mongoc_client_t *const s0 = _mongoc_array_index(&clients, mongoc_client_t *, 0u); mongoc_client_t *const s1 = _mongoc_array_index(&clients, mongoc_client_t *, 1u); BSON_ASSERT(s0 && s1); // Deprioritization cannot be deterministically asserted by this test due to // randomized selection from suitable servers. Repeat the test a few times to // increase the likelihood of detecting incorrect deprioritization behavior. for (int i = 0; i < 10; ++i) { // Configure the following fail point for both `s0` and `s1`: { bson_t *const command = tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': { 'times': 1 }," " 'data': {" " 'failCommands': ['%s']," " 'errorCode': 6," " 'errorLabels': ['RetryableWriteError']" " }" "}", cmd_name); ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", command, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_command_simple(s1, "admin", command, NULL, NULL, &error), error); } // Create a client `client` with `retryWrites=true` that connects to the // cluster with both mongoses used by `s0` and `s1` in the initial seed // list. mongoc_client_t *client = NULL; { const char *const host_and_port = "mongodb://localhost:27017,localhost:27018/?retryWrites=true"; char *const uri_str = test_framework_add_user_password_from_env(host_and_port); mongoc_uri_t *const uri = mongoc_uri_new(uri_str); client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); bson_free(uri_str); } BSON_ASSERT(client); { test_retry_writes_sharded_on_other_mongos_ctx ctx = {0}; // Enable failed command event monitoring for `client`. { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, _test_retry_writes_sharded_on_other_mongos_cb); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_apm_callbacks_destroy(callbacks); } // Execute the target command with `client`. Assert that the command // failed. ASSERT_WITH_MSG(!cmd_func(client, &error), "expected command '%s' to fail", cmd_name); // Assert that two failed command events occurred. ASSERT_WITH_MSG(ctx.count == 2, "expected exactly 2 failpoints to trigger, but " "observed %d with error: %s", ctx.count, error.message); // Assert that the failed command events occurred on different // mongoses. ASSERT_WITH_MSG((ctx.ports[0] == 27017 || ctx.ports[0] == 27018) && (ctx.ports[1] == 27017 || ctx.ports[1] == 27018) && (ctx.ports[0] != ctx.ports[1]), "expected failpoints to trigger once on each mongos, " "but observed failures on %d and %d", ctx.ports[0], ctx.ports[1]); mongoc_client_destroy(client); } // Disable the fail points. { bson_t *const command = tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': 'off'" "}"); ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", command, NULL, NULL, &error), error); ASSERT_OR_PRINT(mongoc_client_command_simple(s1, "admin", command, NULL, NULL, &error), error); } } mongoc_client_destroy(s0); mongoc_client_destroy(s1); _mongoc_array_destroy(&clients); } static bool cmd_insert(mongoc_client_t *client, bson_error_t *error) { mongoc_database_t *const db = mongoc_client_get_database(client, "db"); mongoc_collection_t *const coll = mongoc_database_get_collection(db, "test"); bool ok = mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL, NULL, error); mongoc_collection_destroy(coll); mongoc_database_destroy(db); return ok; } static void retryable_writes_sharded_on_other_mongos_insert(void *_ctx) { BSON_UNUSED(_ctx); retryable_writes_sharded_on_other_mongos_impl("insert", cmd_insert); } static bool cmd_bulkWrite(mongoc_client_t *client, bson_error_t *error) { mongoc_bulkwrite_t *bw = mongoc_client_bulkwrite_new(client); bool ok = mongoc_bulkwrite_append_insertone(bw, "db.coll", tmp_bson("{}"), NULL, error); ASSERT_OR_PRINT(ok, (*error)); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, NULL); if (bwr.exc) { ok = false; mongoc_bulkwriteexception_error(bwr.exc, error); } mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); mongoc_bulkwrite_destroy(bw); return ok; } static void retryable_writes_sharded_on_other_mongos_bulkWrite(void *_ctx) { BSON_UNUSED(_ctx); retryable_writes_sharded_on_other_mongos_impl("bulkWrite", cmd_bulkWrite); } typedef struct _test_retry_writes_sharded_on_same_mongos_ctx { int failed_count; int succeeded_count; uint16_t failed_port; uint16_t succeeded_port; } test_retry_writes_sharded_on_same_mongos_ctx; static void _test_retry_writes_sharded_on_same_mongos_cb(test_retry_writes_sharded_on_same_mongos_ctx *ctx, const mongoc_apm_command_failed_t *failed, const mongoc_apm_command_succeeded_t *succeeded) { BSON_ASSERT_PARAM(ctx); BSON_OPTIONAL_PARAM(failed); BSON_OPTIONAL_PARAM(succeeded); ASSERT_WITH_MSG(ctx->failed_count + ctx->succeeded_count < 2, "expected at most two events, but observed %d failed and %d succeeded", ctx->failed_count, ctx->succeeded_count); if (failed) { ctx->failed_count += 1; const mongoc_host_list_t *const host = mongoc_apm_command_failed_get_host(failed); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->failed_port = host->port; } if (succeeded) { ctx->succeeded_count += 1; const mongoc_host_list_t *const host = mongoc_apm_command_succeeded_get_host(succeeded); BSON_ASSERT(host); BSON_ASSERT(!host->next); ctx->succeeded_port = host->port; } } static void _test_retry_writes_sharded_on_same_mongos_failed_cb(const mongoc_apm_command_failed_t *event) { _test_retry_writes_sharded_on_same_mongos_cb(mongoc_apm_command_failed_get_context(event), event, NULL); } static void _test_retry_writes_sharded_on_same_mongos_succeeded_cb(const mongoc_apm_command_succeeded_t *event) { _test_retry_writes_sharded_on_same_mongos_cb(mongoc_apm_command_succeeded_get_context(event), NULL, event); } // Test that in a sharded cluster writes are retried on the same mongos when no // others are available. static void retryable_writes_sharded_on_same_mongos(void *_ctx) { BSON_UNUSED(_ctx); bson_error_t error = {0}; // Create a client `s0` that connects to a single mongos from the cluster. const char *ports[] = {"27017"}; const size_t num_ports = sizeof(ports) / sizeof(*ports); mongoc_array_t clients = _test_get_mongos_clients(ports, num_ports); BSON_ASSERT(clients.len == 1u); mongoc_client_t *const s0 = _mongoc_array_index(&clients, mongoc_client_t *, 0u); BSON_ASSERT(s0); // Configure the following fail point for `s0`: ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': { 'times': 1 }," " 'data': {" " 'failCommands': ['insert']," " 'errorCode': 6," " 'errorLabels': ['RetryableWriteError']" " }" "}"), NULL, NULL, &error), error); // Create a client client with `directConnection=false` (when not set by // default) and `retryWrites=true` that connects to the cluster using the // same single mongos as `s0`. mongoc_client_t *client = NULL; { const char *const host_and_port = "mongodb://localhost:27017/" "?retryWrites=true&directConnection=false"; char *const uri_str = test_framework_add_user_password_from_env(host_and_port); mongoc_uri_t *const uri = mongoc_uri_new(uri_str); client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); bson_free(uri_str); } BSON_ASSERT(client); { test_retry_writes_sharded_on_same_mongos_ctx ctx = { .failed_count = 0, .succeeded_count = 0, }; // Enable succeeded and failed command event monitoring for `client`. { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_failed_cb(callbacks, _test_retry_writes_sharded_on_same_mongos_failed_cb); mongoc_apm_set_command_succeeded_cb(callbacks, _test_retry_writes_sharded_on_same_mongos_succeeded_cb); mongoc_client_set_apm_callbacks(client, callbacks, &ctx); mongoc_apm_callbacks_destroy(callbacks); } // Execute an `insert` command with `client`. Assert that the command // succeeded. { mongoc_database_t *const db = mongoc_client_get_database(client, "db"); mongoc_collection_t *const coll = mongoc_database_get_collection(db, "test"); ASSERT_WITH_MSG(mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL, NULL, &error), "expecting insert to succeed, but observed error: %s", error.message); mongoc_collection_destroy(coll); mongoc_database_destroy(db); } // Avoid capturing additional events. mongoc_client_set_apm_callbacks(client, NULL, NULL); // Assert that exactly one failed command event and one succeeded // command event occurred. ASSERT_WITH_MSG(ctx.failed_count == 1 && ctx.succeeded_count == 1, "expected exactly one failed event and one succeeded " "event, but observed %d failures and %d successes with error: %s", ctx.failed_count, ctx.succeeded_count, ctx.succeeded_count > 1 ? "none" : error.message); // Assert that both events occurred on the same mongos. ASSERT_WITH_MSG(ctx.failed_port == ctx.succeeded_port, "expected failed and succeeded events on the same mongos, but " "instead observed port %d (failed) and port %d (succeeded)", ctx.failed_port, ctx.succeeded_port); mongoc_client_destroy(client); } // Disable the fail point. ASSERT_OR_PRINT(mongoc_client_command_simple(s0, "admin", tmp_bson("{" " 'configureFailPoint': 'failCommand'," " 'mode': 'off'" "}"), NULL, NULL, &error), error); mongoc_client_destroy(s0); _mongoc_array_destroy(&clients); } void test_retryable_writes_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddMockServerTest(suite, "/retryable_writes/failover", test_rs_failover, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/command_with_opts [lock:live-server]", test_command_with_opts, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/retryable_writes/insert_one_unacknowledged", test_insert_one_unacknowledged, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest(suite, "/retryable_writes/update_one_unacknowledged", test_update_one_unacknowledged, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest(suite, "/retryable_writes/delete_one_unacknowledged", test_delete_one_unacknowledged, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/retryable_writes/remove_unacknowledged", test_remove_unacknowledged, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest(suite, "/retryable_writes/bulk_operation_execute_unacknowledged", test_bulk_operation_execute_unacknowledged, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/no_crypto [lock:live-server]", test_retry_no_crypto, NULL, NULL, test_framework_skip_if_crypto); TestSuite_AddMockServerTest(suite, "/retryable_writes/unsupported_storage_engine_error", test_unsupported_storage_engine_error, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/bulk_tracks_new_server [lock:live-server]", test_bulk_retry_tracks_new_server, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_not_replset, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_3 [lock:live-server]", retryable_writes_prose_test_3, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_max_wire_version_less_than_17, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_3/find_modify [lock:live-server]", retryable_writes_original_error_find_modify, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_max_wire_version_less_than_17, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_3/general_command [lock:live-server]", retryable_writes_original_error_general_command, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_max_wire_version_less_than_17, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_3/bulkwrite [lock:live-server]", retryable_writes_original_error_bulkwrite, NULL, NULL, test_framework_skip_if_not_replset, test_framework_skip_if_max_wire_version_less_than_25, // require server 8.0 test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_4/insert [lock:live-server]", retryable_writes_sharded_on_other_mongos_insert, NULL, NULL, test_framework_skip_if_not_mongos, test_framework_skip_if_no_failpoint, // `errorLabels` is a 4.3.1+ feature. test_framework_skip_if_max_wire_version_less_than_9, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_4/bulkwrite [lock:live-server]", retryable_writes_sharded_on_other_mongos_bulkWrite, NULL, NULL, test_framework_skip_if_not_mongos, test_framework_skip_if_no_failpoint, test_framework_skip_if_max_wire_version_less_than_25, // require server 8.0 test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/retryable_writes/prose_test_5 [lock:live-server]", retryable_writes_sharded_on_same_mongos, NULL, NULL, test_framework_skip_if_not_mongos, test_framework_skip_if_no_failpoint, // `errorLabels` is a 4.3.1+ feature. test_framework_skip_if_max_wire_version_less_than_9, test_framework_skip_if_no_crypto); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-sample-commands.c000066400000000000000000003706321511661753600257550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* MongoDB documentation examples * * One page on the MongoDB docs site shows a set of common tasks, with example * code for each driver plus the mongo shell. The source files for these code * examples are delimited with "Start Example N" / "End Example N" and so on. * * These are the C examples for that page. */ #include "./TestSuite.h" #include "./test-conveniences.h" #include "./test-libmongoc.h" #include #include #include #include #include #include /* clang-format off */ typedef void (*sample_command_fn_t) (mongoc_database_t *db); typedef void (*sample_txn_command_fn_t) (mongoc_client_t *client); static void test_sample_command (sample_command_fn_t fn, int exampleno, mongoc_database_t *db, mongoc_collection_t *collection, bool drop_collection) { char *example_name = bson_strdup_printf ("example %d", exampleno); capture_logs (true); fn (db); capture_logs (false); ASSERT_NO_CAPTURED_LOGS (example_name); if (drop_collection) { mongoc_collection_drop (collection, NULL); } bson_free (example_name); } static void test_example_1 (mongoc_database_t *db) { /* Start Example 1 */ mongoc_collection_t *collection; bson_t *doc; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); doc = BCON_NEW ( "item", BCON_UTF8 ("canvas"), "qty", BCON_INT64 (100), "tags", "[", BCON_UTF8 ("cotton"), "]", "size", "{", "h", BCON_DOUBLE (28), "w", BCON_DOUBLE (35.5), "uom", BCON_UTF8 ("cm"), "}"); r = mongoc_collection_insert_one (collection, doc, NULL, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 1 */ ASSERT_COUNT (1, collection); done: /* Start Example 1 Post */ mongoc_collection_destroy (collection); /* End Example 1 Post */ } static void test_example_2 (mongoc_database_t *db) { /* Start Example 2 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("item", BCON_UTF8 ("canvas")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 2 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 2 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 2 Post */ } static void test_example_3 (mongoc_database_t *db) { /* Start Example 3 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "tags", "[", BCON_UTF8 ("blank"), BCON_UTF8 ("red"), "]", "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("mat"), "qty", BCON_INT64 (85), "tags", "[", BCON_UTF8 ("gray"), "]", "size", "{", "h", BCON_DOUBLE (27.9), "w", BCON_DOUBLE (35.5), "uom", BCON_UTF8 ("cm"), "}"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("mousepad"), "qty", BCON_INT64 (25), "tags", "[", BCON_UTF8 ("gel"), BCON_UTF8 ("blue"), "]", "size", "{", "h", BCON_DOUBLE (19), "w", BCON_DOUBLE (22.85), "uom", BCON_UTF8 ("cm"), "}"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 3 */ ASSERT_COUNT (4, collection); done: /* Start Example 3 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 3 Post */ } static void test_example_6 (mongoc_database_t *db) { /* Start Example 6 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "qty", BCON_INT64 (50), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "qty", BCON_INT64 (100), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "qty", BCON_INT64 (75), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "qty", BCON_INT64 (45), "size", "{", "h", BCON_DOUBLE (10), "w", BCON_DOUBLE (15.25), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 6 */ ASSERT_COUNT (5, collection); done: /* Start Example 6 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 6 Post */ } static void test_example_7 (mongoc_database_t *db) { /* Start Example 7 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW (NULL); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 7 */ ASSERT_CURSOR_COUNT (5, cursor); /* Start Example 7 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 7 Post */ } static void test_example_9 (mongoc_database_t *db) { /* Start Example 9 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("D")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 9 */ ASSERT_CURSOR_COUNT (2, cursor); /* Start Example 9 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 9 Post */ } static void test_example_10 (mongoc_database_t *db) { /* Start Example 10 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "status", "{", "$in", "[", BCON_UTF8 ("A"), BCON_UTF8 ("D"), "]", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 10 */ ASSERT_CURSOR_COUNT (5, cursor); /* Start Example 10 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 10 Post */ } static void test_example_11 (mongoc_database_t *db) { /* Start Example 11 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "status", BCON_UTF8 ("A"), "qty", "{", "$lt", BCON_INT64 (30), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 11 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 11 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 11 Post */ } static void test_example_12 (mongoc_database_t *db) { /* Start Example 12 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "$or", "[", "{", "status", BCON_UTF8 ("A"), "}","{", "qty", "{", "$lt", BCON_INT64 (30), "}", "}", "]"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 12 */ ASSERT_CURSOR_COUNT (3, cursor); /* Start Example 12 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 12 Post */ } static void test_example_13 (mongoc_database_t *db) { /* Start Example 13 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "status", BCON_UTF8 ("A"), "$or", "[", "{", "qty", "{", "$lt", BCON_INT64 (30), "}", "}","{", "item", BCON_REGEX ("^p", ""), "}", "]"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 13 */ ASSERT_CURSOR_COUNT (2, cursor); /* Start Example 13 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 13 Post */ } static void test_example_14 (mongoc_database_t *db) { /* Start Example 14 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "qty", BCON_INT64 (50), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "qty", BCON_INT64 (100), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "qty", BCON_INT64 (75), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "qty", BCON_INT64 (45), "size", "{", "h", BCON_DOUBLE (10), "w", BCON_DOUBLE (15.25), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 14 */ done: /* Start Example 14 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 14 Post */ } static void test_example_15 (mongoc_database_t *db) { /* Start Example 15 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 15 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 15 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 15 Post */ } static void test_example_16 (mongoc_database_t *db) { /* Start Example 16 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "size", "{", "w", BCON_DOUBLE (21), "h", BCON_DOUBLE (14), "uom", BCON_UTF8 ("cm"), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 16 */ ASSERT_CURSOR_COUNT (0, cursor); /* Start Example 16 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 16 Post */ } static void test_example_17 (mongoc_database_t *db) { /* Start Example 17 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("size.uom", BCON_UTF8 ("in")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 17 */ ASSERT_CURSOR_COUNT (2, cursor); /* Start Example 17 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 17 Post */ } static void test_example_18 (mongoc_database_t *db) { /* Start Example 18 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "size.h", "{", "$lt", BCON_INT64 (15), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 18 */ ASSERT_CURSOR_COUNT (4, cursor); /* Start Example 18 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 18 Post */ } static void test_example_19 (mongoc_database_t *db) { /* Start Example 19 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "size.h", "{", "$lt", BCON_INT64 (15), "}", "size.uom", BCON_UTF8 ("in"), "status", BCON_UTF8 ("D")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 19 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 19 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 19 Post */ } static void test_example_20 (mongoc_database_t *db) { /* Start Example 20 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "tags", "[", BCON_UTF8 ("blank"), BCON_UTF8 ("red"), "]", "dim_cm", "[", BCON_INT64 (14), BCON_INT64 (21), "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "qty", BCON_INT64 (50), "tags", "[", BCON_UTF8 ("red"), BCON_UTF8 ("blank"), "]", "dim_cm", "[", BCON_INT64 (14), BCON_INT64 (21), "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "qty", BCON_INT64 (100), "tags", "[", BCON_UTF8 ("red"), BCON_UTF8 ("blank"), BCON_UTF8 ("plain"), "]", "dim_cm", "[", BCON_INT64 (14), BCON_INT64 (21), "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "qty", BCON_INT64 (75), "tags", "[", BCON_UTF8 ("blank"), BCON_UTF8 ("red"), "]", "dim_cm", "[", BCON_DOUBLE (22.85), BCON_INT64 (30), "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "qty", BCON_INT64 (45), "tags", "[", BCON_UTF8 ("blue"), "]", "dim_cm", "[", BCON_INT64 (10), BCON_DOUBLE (15.25), "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 20 */ done: /* Start Example 20 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 20 Post */ } static void test_example_21 (mongoc_database_t *db) { /* Start Example 21 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "tags", "[", BCON_UTF8 ("red"), BCON_UTF8 ("blank"), "]"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 21 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 21 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 21 Post */ } static void test_example_22 (mongoc_database_t *db) { /* Start Example 22 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "tags", "{", "$all", "[", BCON_UTF8 ("red"), BCON_UTF8 ("blank"), "]", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 22 */ ASSERT_CURSOR_COUNT (4, cursor); /* Start Example 22 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 22 Post */ } static void test_example_23 (mongoc_database_t *db) { /* Start Example 23 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("tags", BCON_UTF8 ("red")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 23 */ ASSERT_CURSOR_COUNT (4, cursor); /* Start Example 23 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 23 Post */ } static void test_example_24 (mongoc_database_t *db) { /* Start Example 24 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "dim_cm", "{", "$gt", BCON_INT64 (25), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 24 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 24 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 24 Post */ } static void test_example_25 (mongoc_database_t *db) { /* Start Example 25 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "dim_cm", "{", "$gt", BCON_INT64 (15), "$lt", BCON_INT64 (20), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 25 */ ASSERT_CURSOR_COUNT (4, cursor); /* Start Example 25 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 25 Post */ } static void test_example_26 (mongoc_database_t *db) { /* Start Example 26 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "dim_cm", "{", "$elemMatch", "{", "$gt", BCON_INT64 (22), "$lt", BCON_INT64 (30), "}", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 26 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 26 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 26 Post */ } static void test_example_27 (mongoc_database_t *db) { /* Start Example 27 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "dim_cm.1", "{", "$gt", BCON_INT64 (25), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 27 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 27 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 27 Post */ } static void test_example_28 (mongoc_database_t *db) { /* Start Example 28 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "tags", "{", "$size", BCON_INT64 (3), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 28 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 28 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 28 Post */ } static void test_example_29 (mongoc_database_t *db) { /* Start Example 29 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (5), "}","{", "warehouse", BCON_UTF8 ("C"), "qty", BCON_INT64 (15), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "instock", "[", "{", "warehouse", BCON_UTF8 ("C"), "qty", BCON_INT64 (5), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (60), "}","{", "warehouse", BCON_UTF8 ("B"), "qty", BCON_INT64 (15), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (40), "}","{", "warehouse", BCON_UTF8 ("B"), "qty", BCON_INT64 (5), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "instock", "[", "{", "warehouse", BCON_UTF8 ("B"), "qty", BCON_INT64 (15), "}","{", "warehouse", BCON_UTF8 ("C"), "qty", BCON_INT64 (35), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 29 */ done: /* Start Example 29 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 29 Post */ } static void test_example_30 (mongoc_database_t *db) { /* Start Example 30 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (5), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 30 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 30 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 30 Post */ } static void test_example_31 (mongoc_database_t *db) { /* Start Example 31 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock", "{", "qty", BCON_INT64 (5), "warehouse", BCON_UTF8 ("A"), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 31 */ ASSERT_CURSOR_COUNT (0, cursor); /* Start Example 31 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 31 Post */ } static void test_example_32 (mongoc_database_t *db) { /* Start Example 32 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock.0.qty", "{", "$lte", BCON_INT64 (20), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 32 */ ASSERT_CURSOR_COUNT (3, cursor); /* Start Example 32 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 32 Post */ } static void test_example_33 (mongoc_database_t *db) { /* Start Example 33 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock.qty", "{", "$lte", BCON_INT64 (20), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 33 */ ASSERT_CURSOR_COUNT (5, cursor); /* Start Example 33 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 33 Post */ } static void test_example_34 (mongoc_database_t *db) { /* Start Example 34 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock", "{", "$elemMatch", "{", "qty", BCON_INT64 (5), "warehouse", BCON_UTF8 ("A"), "}", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 34 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 34 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 34 Post */ } static void test_example_35 (mongoc_database_t *db) { /* Start Example 35 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock", "{", "$elemMatch", "{", "qty", "{", "$gt", BCON_INT64 (10), "$lte", BCON_INT64 (20), "}", "}", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 35 */ ASSERT_CURSOR_COUNT (3, cursor); /* Start Example 35 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 35 Post */ } static void test_example_36 (mongoc_database_t *db) { /* Start Example 36 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock.qty", "{", "$gt", BCON_INT64 (10), "$lte", BCON_INT64 (20), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 36 */ ASSERT_CURSOR_COUNT (4, cursor); /* Start Example 36 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 36 Post */ } static void test_example_37 (mongoc_database_t *db) { /* Start Example 37 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "instock.qty", BCON_INT64 (5), "instock.warehouse", BCON_UTF8 ("A")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 37 */ ASSERT_CURSOR_COUNT (2, cursor); /* Start Example 37 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 37 Post */ } static void test_example_38 (mongoc_database_t *db) { /* Start Example 38 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "_id", BCON_INT64 (1), "item", BCON_NULL); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ("_id", BCON_INT64 (2)); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 38 */ done: /* Start Example 38 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 38 Post */ } static void test_example_39 (mongoc_database_t *db) { /* Start Example 39 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("item", BCON_NULL); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 39 */ ASSERT_CURSOR_COUNT (2, cursor); /* Start Example 39 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 39 Post */ } static void test_example_40 (mongoc_database_t *db) { /* Start Example 40 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "item", "{", "$type", BCON_INT64 (10), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 40 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 40 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 40 Post */ } static void test_example_41 (mongoc_database_t *db) { /* Start Example 41 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ( "item", "{", "$exists", BCON_BOOL (false), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 41 */ ASSERT_CURSOR_COUNT (1, cursor); /* Start Example 41 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 41 Post */ } static void test_example_42 (mongoc_database_t *db) { /* Start Example 42 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "status", BCON_UTF8 ("A"), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (5), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "status", BCON_UTF8 ("A"), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "instock", "[", "{", "warehouse", BCON_UTF8 ("C"), "qty", BCON_INT64 (5), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "status", BCON_UTF8 ("D"), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (60), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "status", BCON_UTF8 ("D"), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30), "uom", BCON_UTF8 ("cm"), "}", "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (40), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "status", BCON_UTF8 ("A"), "size", "{", "h", BCON_DOUBLE (10), "w", BCON_DOUBLE (15.25), "uom", BCON_UTF8 ("cm"), "}", "instock", "[", "{", "warehouse", BCON_UTF8 ("B"), "qty", BCON_INT64 (15), "}","{", "warehouse", BCON_UTF8 ("C"), "qty", BCON_INT64 (35), "}", "]"); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 42 */ done: /* Start Example 42 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 42 Post */ } static void test_example_43 (mongoc_database_t *db) { /* Start Example 43 */ mongoc_collection_t *collection; bson_t *filter; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); /* End Example 43 */ ASSERT_CURSOR_COUNT (3, cursor); /* Start Example 43 Post */ mongoc_cursor_destroy (cursor); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 43 Post */ } static void test_example_44 (mongoc_database_t *db) { /* Start Example 44 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "item", BCON_INT64 (1), "status", BCON_INT64 (1), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 44 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_NOT_FIELD (doc, "size"); ASSERT_HAS_NOT_FIELD (doc, "instock"); } } /* Start Example 44 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 44 Post */ } static void test_example_45 (mongoc_database_t *db) { /* Start Example 45 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "item", BCON_INT64 (1), "status", BCON_INT64 (1), "_id", BCON_INT64 (0), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 45 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { ASSERT_HAS_NOT_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_NOT_FIELD (doc, "size"); ASSERT_HAS_NOT_FIELD (doc, "instock"); } } /* Start Example 45 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 45 Post */ } static void test_example_46 (mongoc_database_t *db) { /* Start Example 46 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "status", BCON_INT64 (0), "instock", BCON_INT64 (0), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 46 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_NOT_FIELD (doc, "status"); ASSERT_HAS_FIELD (doc, "size"); ASSERT_HAS_NOT_FIELD (doc, "instock"); } } /* Start Example 46 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 46 Post */ } static void test_example_47 (mongoc_database_t *db) { /* Start Example 47 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "item", BCON_INT64 (1), "status", BCON_INT64 (1), "size.uom", BCON_INT64 (1), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 47 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { bson_t size; ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_FIELD (doc, "size"); ASSERT_HAS_NOT_FIELD (doc, "instock"); bson_lookup_doc (doc, "size", &size); ASSERT_HAS_FIELD (&size, "uom"); ASSERT_HAS_NOT_FIELD (&size, "h"); ASSERT_HAS_NOT_FIELD (&size, "w"); } } /* Start Example 47 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 47 Post */ } static void test_example_48 (mongoc_database_t *db) { /* Start Example 48 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "size.uom", BCON_INT64 (0), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 48 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { bson_t size; ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_FIELD (doc, "size"); ASSERT_HAS_FIELD (doc, "instock"); bson_lookup_doc (doc, "size", &size); ASSERT_HAS_NOT_FIELD (&size, "uom"); ASSERT_HAS_FIELD (&size, "h"); ASSERT_HAS_FIELD (&size, "w"); } } /* Start Example 48 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 48 Post */ } static void test_example_49 (mongoc_database_t *db) { /* Start Example 49 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "item", BCON_INT64 (1), "status", BCON_INT64 (1), "instock.qty", BCON_INT64 (1), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 49 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_NOT_FIELD (doc, "size"); ASSERT_HAS_FIELD (doc, "instock"); { bson_iter_t iter; BSON_ASSERT (bson_iter_init_find (&iter, doc, "instock")); while (bson_iter_next (&iter)) { bson_t subdoc; bson_iter_bson (&iter, &subdoc); ASSERT_HAS_NOT_FIELD (&subdoc, "warehouse"); ASSERT_HAS_FIELD (&subdoc, "qty"); } } } } /* Start Example 49 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 49 Post */ } static void test_example_50 (mongoc_database_t *db) { /* Start Example 50 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW ("status", BCON_UTF8 ("A")); opts = BCON_NEW ("projection", "{", "item", BCON_INT64 (1), "status", BCON_INT64 (1), "instock", "{", "$slice", BCON_INT64 (-1), "}", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); /* End Example 50 */ { const bson_t *doc; while (mongoc_cursor_next (cursor, &doc)) { bson_t subdoc; ASSERT_HAS_FIELD (doc, "_id"); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "status"); ASSERT_HAS_NOT_FIELD (doc, "size"); ASSERT_HAS_FIELD (doc, "instock"); bson_lookup_doc (doc, "instock", &subdoc); ASSERT_CMPUINT32 (1, ==, bson_count_keys (&subdoc)); } } /* Start Example 50 Post */ mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); mongoc_collection_destroy (collection); /* End Example 50 Post */ } static void test_example_51 (mongoc_database_t *db) { /* Start Example 51 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("canvas"), "qty", BCON_INT64 (100), "size", "{", "h", BCON_DOUBLE (28), "w", BCON_DOUBLE (35.5), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("mat"), "qty", BCON_INT64 (85), "size", "{", "h", BCON_DOUBLE (27.9), "w", BCON_DOUBLE (35.5), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("mousepad"), "qty", BCON_INT64 (25), "size", "{", "h", BCON_DOUBLE (19), "w", BCON_DOUBLE (22.85), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("P")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "qty", BCON_INT64 (50), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("P")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "qty", BCON_INT64 (100), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "qty", BCON_INT64 (75), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "qty", BCON_INT64 (45), "size", "{", "h", BCON_DOUBLE (10), "w", BCON_DOUBLE (15.25), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("sketchbook"), "qty", BCON_INT64 (80), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("sketch pad"), "qty", BCON_INT64 (95), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30.5), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 51 */ done: /* Start Example 51 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 51 Post */ } static void test_example_52 (mongoc_database_t *db) { /* Start Example 52 */ mongoc_collection_t *collection; bson_t *selector; bson_t *update; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW ("item", BCON_UTF8 ("paper")); update = BCON_NEW ( "$set", "{", "size.uom", BCON_UTF8 ("cm"), "status", BCON_UTF8 ("P"), "}", "$currentDate", "{", "lastModified", BCON_BOOL (true), "}"); r = mongoc_collection_update_one(collection, selector, update, NULL, NULL, &error); bson_destroy (selector); bson_destroy (update); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 52 */ { bson_t *filter; mongoc_cursor_t *cursor; const bson_t *doc; filter = BCON_NEW ("item", BCON_UTF8 ("paper")); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { ASSERT_CMPSTR (bson_lookup_utf8 (doc, "size.uom"), "cm"); ASSERT_CMPSTR (bson_lookup_utf8 (doc, "status"), "P"); ASSERT_HAS_FIELD (doc, "lastModified"); } mongoc_cursor_destroy (cursor); bson_destroy (filter); } done: /* Start Example 52 Post */ mongoc_collection_destroy (collection); /* End Example 52 Post */ } static void test_example_53 (mongoc_database_t *db) { /* Start Example 53 */ mongoc_collection_t *collection; bson_t *selector; bson_t *update; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW ( "qty", "{", "$lt", BCON_INT64 (50), "}"); update = BCON_NEW ( "$set", "{", "size.uom", BCON_UTF8 ("in"), "status", BCON_UTF8 ("P"), "}", "$currentDate", "{", "lastModified", BCON_BOOL (true), "}"); r = mongoc_collection_update_many(collection, selector, update, NULL, NULL, &error); bson_destroy (selector); bson_destroy (update); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 53 */ { bson_t *filter; mongoc_cursor_t *cursor; const bson_t *doc; filter = BCON_NEW ( "qty", "{", "$lt", BCON_INT64 (50), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { ASSERT_CMPSTR (bson_lookup_utf8 (doc, "size.uom"), "in"); ASSERT_CMPSTR (bson_lookup_utf8 (doc, "status"), "P"); ASSERT_HAS_FIELD (doc, "lastModified"); } mongoc_cursor_destroy (cursor); bson_destroy (filter); } done: /* Start Example 53 Post */ mongoc_collection_destroy (collection); /* End Example 53 Post */ } static void test_example_54 (mongoc_database_t *db) { /* Start Example 54 */ mongoc_collection_t *collection; bson_t *selector; bson_t *replacement; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW ("item", BCON_UTF8 ("paper")); replacement = BCON_NEW ( "item", BCON_UTF8 ("paper"), "instock", "[", "{", "warehouse", BCON_UTF8 ("A"), "qty", BCON_INT64 (60), "}","{", "warehouse", BCON_UTF8 ("B"), "qty", BCON_INT64 (40), "}", "]"); /* MONGOC_UPDATE_NONE means "no special options" */ r = mongoc_collection_replace_one(collection, selector, replacement, NULL, NULL, &error); bson_destroy (selector); bson_destroy (replacement); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 54 */ { bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; const bson_t *doc; filter = BCON_NEW ("item", BCON_UTF8 ("paper")); opts = BCON_NEW ("projection", "{", "_id", BCON_INT64 (0), "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); while (mongoc_cursor_next (cursor, &doc)) { bson_t subdoc; ASSERT_CMPUINT32 (2, ==, bson_count_keys (doc)); ASSERT_HAS_FIELD (doc, "item"); ASSERT_HAS_FIELD (doc, "instock"); bson_lookup_doc (doc, "instock", &subdoc); ASSERT_CMPUINT32 (2, ==, bson_count_keys (&subdoc)); } mongoc_cursor_destroy (cursor); bson_destroy (opts); bson_destroy (filter); } done: /* Start Example 54 Post */ mongoc_collection_destroy (collection); /* End Example 54 Post */ } static void test_example_55 (mongoc_database_t *db) { /* Start Example 55 */ mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; bson_t *doc; bool r; bson_error_t error; bson_t reply; collection = mongoc_database_get_collection (db, "inventory"); bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL); doc = BCON_NEW ( "item", BCON_UTF8 ("journal"), "qty", BCON_INT64 (25), "size", "{", "h", BCON_DOUBLE (14), "w", BCON_DOUBLE (21), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("notebook"), "qty", BCON_INT64 (50), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("P")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("paper"), "qty", BCON_INT64 (100), "size", "{", "h", BCON_DOUBLE (8.5), "w", BCON_DOUBLE (11), "uom", BCON_UTF8 ("in"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("planner"), "qty", BCON_INT64 (75), "size", "{", "h", BCON_DOUBLE (22.85), "w", BCON_DOUBLE (30), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("D")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } doc = BCON_NEW ( "item", BCON_UTF8 ("postcard"), "qty", BCON_INT64 (45), "size", "{", "h", BCON_DOUBLE (10), "w", BCON_DOUBLE (15.25), "uom", BCON_UTF8 ("cm"), "}", "status", BCON_UTF8 ("A")); r = mongoc_bulk_operation_insert_with_opts (bulk, doc, NULL, &error); bson_destroy (doc); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* "reply" is initialized on success or error */ r = (bool) mongoc_bulk_operation_execute (bulk, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* End Example 55 */ ASSERT_COUNT (5, collection); done: /* Start Example 55 Post */ bson_destroy (&reply); mongoc_bulk_operation_destroy (bulk); mongoc_collection_destroy (collection); /* End Example 55 Post */ } static void test_example_57 (mongoc_database_t *db) { /* Start Example 57 */ mongoc_collection_t *collection; bson_t *selector; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW ("status", BCON_UTF8 ("A")); r = mongoc_collection_delete_many (collection, selector, NULL, NULL, &error); bson_destroy (selector); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 57 */ ASSERT_COUNT (3, collection); done: /* Start Example 57 Post */ mongoc_collection_destroy (collection); /* End Example 57 Post */ } static void test_example_58 (mongoc_database_t *db) { /* Start Example 58 */ mongoc_collection_t *collection; bson_t *selector; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW ("status", BCON_UTF8 ("D")); r = mongoc_collection_delete_one (collection, selector, NULL, NULL, &error); bson_destroy (selector); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 58 */ ASSERT_COUNT (2, collection); done: /* Start Example 58 Post */ mongoc_collection_destroy (collection); /* End Example 58 Post */ } static void test_example_56 (mongoc_database_t *db) { /* Start Example 56 */ mongoc_collection_t *collection; bson_t *selector; bool r; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); selector = BCON_NEW (NULL); r = mongoc_collection_delete_many (collection, selector, NULL, NULL, &error); bson_destroy (selector); if (!r) { MONGOC_ERROR ("%s\n", error.message); goto done; } /* End Example 56 */ ASSERT_COUNT (0, collection); done: /* Start Example 56 Post */ mongoc_collection_destroy (collection); /* End Example 56 Post */ } /* clang-format on */ static bool insert_pet(mongoc_collection_t *collection, bool is_adoptable) { bson_t *doc = NULL; bson_error_t error; bool rc; doc = BCON_NEW("adoptable", BCON_BOOL(is_adoptable)); // Insert with majority write concern. Snapshot read concern reads from majority committed data. bson_t opts = BSON_INITIALIZER; { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); mongoc_write_concern_destroy(wc); } rc = mongoc_collection_insert_one(collection, doc, &opts, NULL, &error); if (!rc) { MONGOC_ERROR("insert into pets.%s failed: %s", mongoc_collection_get_name(collection), error.message); goto cleanup; } cleanup: bson_destroy(&opts); bson_destroy(doc); return rc; } static bool pet_setup(mongoc_collection_t *cats_collection, mongoc_collection_t *dogs_collection) { bool ok = true; mongoc_collection_drop(cats_collection, NULL); mongoc_collection_drop(dogs_collection, NULL); ok = insert_pet(cats_collection, true); if (!ok) { goto done; } ok = insert_pet(dogs_collection, true); if (!ok) { goto done; } ok = insert_pet(dogs_collection, false); if (!ok) { goto done; } done: return ok; } /* * Increment 'accumulator' by the amount of adoptable pets in the given * collection. */ static bool accumulate_adoptable_count(const mongoc_client_session_t *cs, mongoc_collection_t *collection, int64_t *accumulator /* OUT */ ) { bson_t *pipeline = NULL; mongoc_cursor_t *cursor = NULL; bool rc = false; const bson_t *doc = NULL; bson_error_t error; bson_iter_t iter; bson_t opts = BSON_INITIALIZER; rc = mongoc_client_session_append(cs, &opts, &error); if (!rc) { MONGOC_ERROR("could not apply session options: %s", error.message); goto cleanup; } pipeline = BCON_NEW("pipeline", "[", "{", "$match", "{", "adoptable", BCON_BOOL(true), "}", "}", "{", "$count", BCON_UTF8("adoptableCount"), "}", "]"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, &opts, NULL); bson_destroy(&opts); rc = mongoc_cursor_next(cursor, &doc); if (mongoc_cursor_error(cursor, &error)) { MONGOC_ERROR("could not get adoptableCount: %s", error.message); rc = false; goto cleanup; } if (!rc) { MONGOC_ERROR("%s", "cursor has no results"); goto cleanup; } rc = bson_iter_init_find(&iter, doc, "adoptableCount"); if (rc) { *accumulator += bson_iter_as_int64(&iter); } else { MONGOC_ERROR("%s", "missing key: 'adoptableCount'"); goto cleanup; } cleanup: bson_destroy(pipeline); mongoc_cursor_destroy(cursor); return rc; } static void test_snapshot_query_example_1(void) { if (!test_framework_skip_if_no_txns()) { return; } if (!test_framework_max_wire_version_at_least(WIRE_VERSION_SNAPSHOT_READS)) { MONGOC_DEBUG("Skipping test. Server does not support snapshot reads\n"); return; } mongoc_client_t *client = NULL; client = test_framework_new_default_client(); /* Start Snapshot Query Example 1 */ mongoc_client_session_t *cs = NULL; mongoc_collection_t *cats_collection = NULL; mongoc_collection_t *dogs_collection = NULL; int64_t adoptable_pets_count = 0; bson_error_t error; mongoc_session_opt_t *session_opts; cats_collection = mongoc_client_get_collection(client, "pets", "cats"); dogs_collection = mongoc_client_get_collection(client, "pets", "dogs"); /* Seed 'pets.cats' and 'pets.dogs' with example data */ if (!pet_setup(cats_collection, dogs_collection)) { goto cleanup; } /* start a snapshot session */ session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_snapshot(session_opts, true); cs = mongoc_client_start_session(client, session_opts, &error); mongoc_session_opts_destroy(session_opts); if (!cs) { MONGOC_ERROR("Could not start session: %s", error.message); goto cleanup; } /* * Perform the following aggregation pipeline, and accumulate the count in * `adoptable_pets_count`. * * adoptablePetsCount = db.cats.aggregate( * [ { "$match": { "adoptable": true } }, * { "$count": "adoptableCatsCount" } ], session=s * ).next()["adoptableCatsCount"] * * adoptablePetsCount += db.dogs.aggregate( * [ { "$match": { "adoptable": True} }, * { "$count": "adoptableDogsCount" } ], session=s * ).next()["adoptableDogsCount"] * * Remember in order to apply the client session to * this operation, you must append the client session to the options passed * to `mongoc_collection_aggregate`, i.e., * * mongoc_client_session_append (cs, &opts, &error); * cursor = mongoc_collection_aggregate ( * collection, MONGOC_QUERY_NONE, pipeline, &opts, NULL); */ accumulate_adoptable_count(cs, cats_collection, &adoptable_pets_count); accumulate_adoptable_count(cs, dogs_collection, &adoptable_pets_count); printf("there are %" PRId64 " adoptable pets\n", adoptable_pets_count); /* End Snapshot Query Example 1 */ if (adoptable_pets_count != 2) { MONGOC_ERROR("there should be exactly 2 adoptable_pets_count, found: %" PRId64, adoptable_pets_count); } /* Start Snapshot Query Example 1 Post */ cleanup: mongoc_collection_destroy(dogs_collection); mongoc_collection_destroy(cats_collection); mongoc_client_session_destroy(cs); mongoc_client_destroy(client); /* End Snapshot Query Example 1 Post */ } static bool retail_setup(mongoc_collection_t *sales_collection) { bool ok = true; bson_t *doc = NULL; bson_error_t error; struct timeval tv; int64_t unix_time_now = 0; bson_t opts = BSON_INITIALIZER; if (bson_gettimeofday(&tv)) { MONGOC_ERROR("could not get time of day"); goto cleanup; } unix_time_now = 1000 * tv.tv_sec; mongoc_collection_drop(sales_collection, NULL); doc = BCON_NEW("shoeType", BCON_UTF8("boot"), "price", BCON_INT64(30), "saleDate", BCON_DATE_TIME(unix_time_now)); // Insert with majority write concern. Snapshot read concern reads from majority committed data. { mongoc_write_concern_t *wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); mongoc_write_concern_append(wc, &opts); mongoc_write_concern_destroy(wc); } ok = mongoc_collection_insert_one(sales_collection, doc, &opts, NULL, &error); if (!ok) { MONGOC_ERROR("insert into retail.sales failed: %s", error.message); goto cleanup; } cleanup: bson_destroy(&opts); bson_destroy(doc); return ok; } static void test_snapshot_query_example_2(void) { if (!test_framework_skip_if_no_txns()) { return; } if (!test_framework_max_wire_version_at_least(WIRE_VERSION_SNAPSHOT_READS)) { MONGOC_DEBUG("Skipping test. Server does not support snapshot reads\n"); return; } mongoc_client_t *client = NULL; client = test_framework_new_default_client(); /* Start Snapshot Query Example 2 */ mongoc_client_session_t *cs = NULL; mongoc_collection_t *sales_collection = NULL; bson_error_t error; mongoc_session_opt_t *session_opts; bson_t *pipeline = NULL; bson_t opts = BSON_INITIALIZER; mongoc_cursor_t *cursor = NULL; const bson_t *doc = NULL; bool ok = true; bson_iter_t iter; int64_t total_sales = 0; sales_collection = mongoc_client_get_collection(client, "retail", "sales"); /* seed 'retail.sales' with example data */ if (!retail_setup(sales_collection)) { goto cleanup; } /* start a snapshot session */ session_opts = mongoc_session_opts_new(); mongoc_session_opts_set_snapshot(session_opts, true); cs = mongoc_client_start_session(client, session_opts, &error); mongoc_session_opts_destroy(session_opts); if (!cs) { MONGOC_ERROR("Could not start session: %s", error.message); goto cleanup; } if (!mongoc_client_session_append(cs, &opts, &error)) { MONGOC_ERROR("could not apply session options: %s", error.message); goto cleanup; } pipeline = BCON_NEW("pipeline", "[", "{", "$match", "{", "$expr", "{", "$gt", "[", "$saleDate", "{", "$dateSubtract", "{", "startDate", "$$NOW", "unit", BCON_UTF8("day"), "amount", BCON_INT64(1), "}", "}", "]", "}", "}", "}", "{", "$count", BCON_UTF8("totalDailySales"), "}", "]"); cursor = mongoc_collection_aggregate(sales_collection, MONGOC_QUERY_NONE, pipeline, &opts, NULL); bson_destroy(&opts); ok = mongoc_cursor_next(cursor, &doc); if (mongoc_cursor_error(cursor, &error)) { MONGOC_ERROR("could not get totalDailySales: %s", error.message); goto cleanup; } if (!ok) { MONGOC_ERROR("%s", "cursor has no results"); goto cleanup; } ok = bson_iter_init_find(&iter, doc, "totalDailySales"); if (ok) { total_sales = bson_iter_as_int64(&iter); } else { MONGOC_ERROR("%s", "missing key: 'totalDailySales'"); goto cleanup; } /* End Snapshot Query Example 2 */ if (total_sales != 1) { MONGOC_ERROR("there should be exactly 1 total_sales, found: %" PRId64, total_sales); } /* Start Snapshot Query Example 2 Post */ cleanup: mongoc_collection_destroy(sales_collection); mongoc_client_session_destroy(cs); mongoc_cursor_destroy(cursor); bson_destroy(pipeline); mongoc_client_destroy(client); /* End Snapshot Query Example 2 Post */ } // `test_snapshot_query_examples` examples for DRIVERS-2181. static void test_snapshot_query_examples(void) { capture_logs(true); test_snapshot_query_example_1(); capture_logs(false); ASSERT_NO_CAPTURED_LOGS("test_snapshot_query_example_1"); capture_logs(true); test_snapshot_query_example_2(); capture_logs(false); ASSERT_NO_CAPTURED_LOGS("test_snapshot_query_example_2"); } /* clang-format off */ typedef struct { bson_mutex_t lock; mongoc_collection_t *collection; bool done; } change_stream_ctx_t; static BSON_THREAD_FUN (insert_docs, p) { change_stream_ctx_t *ctx = (change_stream_ctx_t *) p; bson_t doc = BSON_INITIALIZER; bson_error_t error; bool r; while (true) { bson_mutex_lock (&ctx->lock); r = mongoc_collection_insert ( ctx->collection, MONGOC_INSERT_NONE, &doc, NULL, &error); ASSERT_OR_PRINT (r, error); if (ctx->done) { bson_destroy (&doc); bson_mutex_unlock (&ctx->lock); BSON_THREAD_RETURN; } bson_mutex_unlock (&ctx->lock); mlib_sleep_for (100, ms); } } static void test_sample_change_stream_command (sample_command_fn_t fn, mongoc_database_t *db) { mongoc_client_t *client; change_stream_ctx_t ctx; bson_thread_t thread; int r; /* change streams require a replica set */ if (test_framework_skip_if_not_replset () && test_framework_skip_if_slow ()) { /* separate client for the background thread */ client = test_framework_new_default_client (); bson_mutex_init (&ctx.lock); ctx.collection = mongoc_client_get_collection ( client, db->name, "inventory"); ctx.done = false; r = mcommon_thread_create (&thread, insert_docs, (void *) &ctx); ASSERT_OR_PRINT_ERRNO (r == 0, r); capture_logs (true); fn (db); ASSERT_NO_CAPTURED_LOGS ("change stream examples"); capture_logs (false); bson_mutex_lock (&ctx.lock); ctx.done = true; bson_mutex_unlock (&ctx.lock); mcommon_thread_join (thread); mongoc_collection_destroy (ctx.collection); mongoc_client_destroy (client); } } static void test_example_change_stream (mongoc_database_t *db) { /* Start Changestream Example 1 */ mongoc_collection_t *collection; bson_t *pipeline = bson_new (); bson_t opts = BSON_INITIALIZER; mongoc_change_stream_t *stream; const bson_t *change; const bson_t *resume_token; bson_error_t error; collection = mongoc_database_get_collection (db, "inventory"); stream = mongoc_collection_watch (collection, pipeline, NULL /* opts */); mongoc_change_stream_next (stream, &change); if (mongoc_change_stream_error_document (stream, &error, NULL)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_change_stream_destroy (stream); /* End Changestream Example 1 */ /* Start Changestream Example 2 */ BSON_APPEND_UTF8 (&opts, "fullDocument", "updateLookup"); stream = mongoc_collection_watch (collection, pipeline, &opts); mongoc_change_stream_next (stream, &change); if (mongoc_change_stream_error_document (stream, &error, NULL)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_change_stream_destroy (stream); /* End Changestream Example 2 */ bson_reinit (&opts); /* Start Changestream Example 3 */ stream = mongoc_collection_watch (collection, pipeline, NULL); if (mongoc_change_stream_next (stream, &change)) { resume_token = mongoc_change_stream_get_resume_token (stream); BSON_APPEND_DOCUMENT (&opts, "resumeAfter", resume_token); mongoc_change_stream_destroy (stream); stream = mongoc_collection_watch (collection, pipeline, &opts); mongoc_change_stream_next (stream, &change); mongoc_change_stream_destroy (stream); } else { if (mongoc_change_stream_error_document (stream, &error, NULL)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_change_stream_destroy (stream); } /* End Changestream Example 3 */ bson_destroy (pipeline); /* Start Changestream Example 4 */ pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "fullDocument.username", BCON_UTF8 ("alice"), "}", "}", "{", "$addFields", "{", "newField", BCON_UTF8 ("this is an added field!"), "}", "}", "]"); stream = mongoc_collection_watch (collection, pipeline, &opts); mongoc_change_stream_next (stream, &change); if (mongoc_change_stream_error_document (stream, &error, NULL)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_change_stream_destroy (stream); /* End Changestream Example 4 */ bson_destroy (&opts); bson_destroy (pipeline); mongoc_collection_destroy (collection); } static void test_sample_causal_consistency (mongoc_client_t *client) { mongoc_session_opt_t *session_opts = NULL; mongoc_client_session_t *session1 = NULL; mongoc_client_session_t *session2 = NULL; mongoc_read_prefs_t *read_prefs = NULL; const bson_t *cluster_time = NULL; mongoc_write_concern_t *wc = NULL; mongoc_read_concern_t *rc = NULL; mongoc_collection_t *coll = NULL; mongoc_cursor_t *cursor = NULL; const bson_t *result = NULL; bson_t *update_opts = NULL; bson_t *insert_opts = NULL; bson_t *find_query = NULL; bson_t *find_opts = NULL; bson_t *insert = NULL; bson_t *update = NULL; bson_t *query = NULL; bson_t *doc = NULL; char *json = NULL; uint32_t timestamp; uint32_t increment; bson_error_t error; bool res; ASSERT (client); if (!test_framework_skip_if_no_txns ()) { return; } /* Seed the 'db.items' collection with a document. */ coll = mongoc_client_get_collection (client, "db", "items"); mongoc_collection_drop (coll, &error); doc = BCON_NEW ("sku", "111", "name", "Peanuts", "start", BCON_DATE_TIME (bson_get_monotonic_time ())); res = mongoc_collection_insert_one (coll, doc, NULL, NULL, &error); if (!res) { fprintf (stderr, "insert failed: %s\n", error.message); goto cleanup; } /* Start Causal Consistency Example 1 */ /* Use a causally-consistent session to run some operations. */ wc = mongoc_write_concern_new (); mongoc_write_concern_set_wmajority (wc, 1000); mongoc_collection_set_write_concern (coll, wc); rc = mongoc_read_concern_new (); mongoc_read_concern_set_level (rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_collection_set_read_concern (coll, rc); session_opts = mongoc_session_opts_new (); mongoc_session_opts_set_causal_consistency (session_opts, true); session1 = mongoc_client_start_session (client, session_opts, &error); if (!session1) { fprintf (stderr, "couldn't start session: %s\n", error.message); goto cleanup; } /* Run an update_one with our causally-consistent session. */ update_opts = bson_new (); res = mongoc_client_session_append (session1, update_opts, &error); if (!res) { fprintf (stderr, "couldn't add session to opts: %s\n", error.message); goto cleanup; } query = BCON_NEW ("sku", "111"); update = BCON_NEW ("$set", "{", "end", BCON_DATE_TIME (bson_get_monotonic_time ()), "}"); res = mongoc_collection_update_one (coll, query, update, update_opts, NULL, /* reply */ &error); if (!res) { fprintf (stderr, "update failed: %s\n", error.message); goto cleanup; } /* Run an insert with our causally-consistent session */ insert_opts = bson_new (); res = mongoc_client_session_append (session1, insert_opts, &error); if (!res) { fprintf (stderr, "couldn't add session to opts: %s\n", error.message); goto cleanup; } insert = BCON_NEW ("sku", "nuts-111", "name", "Pecans", "start", BCON_DATE_TIME (bson_get_monotonic_time ())); res = mongoc_collection_insert_one (coll, insert, insert_opts, NULL, &error); if (!res) { fprintf (stderr, "insert failed: %s\n", error.message); goto cleanup; } /* End Causal Consistency Example 1 */ /* Start Causal Consistency Example 2 */ /* Make a new session, session2, and make it causally-consistent * with session1, so that session2 will read session1's writes. */ session2 = mongoc_client_start_session (client, session_opts, &error); if (!session2) { fprintf (stderr, "couldn't start session: %s\n", error.message); goto cleanup; } /* Set the cluster time for session2 to session1's cluster time */ cluster_time = mongoc_client_session_get_cluster_time (session1); mongoc_client_session_advance_cluster_time (session2, cluster_time); /* Set the operation time for session2 to session2's operation time */ mongoc_client_session_get_operation_time (session1, ×tamp, &increment); mongoc_client_session_advance_operation_time (session2, timestamp, increment); /* Run a find on session2, which should now find all writes done * inside of session1 */ find_opts = bson_new (); res = mongoc_client_session_append (session2, find_opts, &error); if (!res) { fprintf (stderr, "couldn't add session to opts: %s\n", error.message); goto cleanup; } find_query = BCON_NEW ("end", BCON_NULL); read_prefs = mongoc_read_prefs_new (MONGOC_READ_SECONDARY); cursor = mongoc_collection_find_with_opts (coll, query, find_opts, read_prefs); while (mongoc_cursor_next (cursor, &result)) { json = bson_as_relaxed_extended_json (result, NULL); fprintf (stdout, "Document: %s\n", json); bson_free (json); } if (mongoc_cursor_error (cursor, &error)) { fprintf (stderr, "cursor failure: %s\n", error.message); goto cleanup; } /* End Causal Consistency Example 2 */ cleanup: bson_destroy (doc); bson_destroy (query); bson_destroy (insert); bson_destroy (update); bson_destroy (find_query); bson_destroy (update_opts); bson_destroy (find_opts); bson_destroy (insert_opts); mongoc_read_concern_destroy (rc); mongoc_read_prefs_destroy (read_prefs); mongoc_write_concern_destroy (wc); mongoc_collection_destroy (coll); mongoc_cursor_destroy (cursor); mongoc_session_opts_destroy (session_opts); mongoc_client_session_destroy (session1); mongoc_client_session_destroy (session2); } static void test_sample_aggregation (mongoc_database_t *db) { /* Start Aggregation Example 1 */ mongoc_collection_t *collection; bson_t *pipeline; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; collection = mongoc_database_get_collection (db, "sales"); pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "items.fruit", BCON_UTF8 ("banana"), "}", "}", "{", "$sort", "{", "date", BCON_INT32 (1), "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); while (mongoc_cursor_next (cursor, &doc)) { /* Do something with each doc here */ } if (mongoc_cursor_error (cursor, &error)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_cursor_destroy (cursor); /* End Aggregation Example 1 */ /* Start Aggregation Example 2 */ pipeline = BCON_NEW ("pipeline", "[", "{", "$unwind", BCON_UTF8 ("$items"), "}", "{", "$match", "{", "items.fruit", BCON_UTF8 ("banana"), "}", "}", "{", "$group", "{", "_id", "{", "day", "{", "$dayOfWeek", BCON_UTF8 ("$date"), "}", "}", "count", "{", "$sum", BCON_UTF8 ("$items.quantity"), "}", "}", "}", "{", "$project", "{", "dayOfWeek", BCON_UTF8 ("$_id.day"), "numberSold", BCON_UTF8 ("$count"), "_id", BCON_INT32 (0), "}", "}", "{", "$sort", "{", "numberSold", BCON_INT32 (1), "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); while (mongoc_cursor_next (cursor, &doc)) { /* Do something with each doc here */ } if (mongoc_cursor_error (cursor, &error)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_cursor_destroy (cursor); /* End Aggregation Example 2 */ /* Start Aggregation Example 3 */ pipeline = BCON_NEW ("pipeline", "[", "{", "$unwind", BCON_UTF8 ("$items"), "}", "{", "$group", "{", "_id", "{", "day", "{", "$dayOfWeek", BCON_UTF8 ("$date"), "}", "}", "items_sold", "{", "$sum", BCON_UTF8 ("$items.quantity"), "}", "revenue", "{", "$sum", "{", "$multiply", "[", BCON_UTF8 ("$items.quantity"), BCON_UTF8 ("$items.price"), "]", "}", "}", "}", "}", "{", "$project", "{", "day", BCON_UTF8 ("$_id.day"), "revenue", BCON_INT32 (1), "items_sold", BCON_INT32 (1), "discount", "{", "$cond", "{", "if", "{", "$lte", "[", "$revenue", BCON_INT32 (250), "]", "}", "then", BCON_INT32 (25), "else", BCON_INT32 (0), "}", "}", "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); while (mongoc_cursor_next (cursor, &doc)) { /* Do something with each doc here */ } if (mongoc_cursor_error (cursor, &error)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_cursor_destroy (cursor); /* End Aggregation Example 3 */ mongoc_collection_destroy (collection); /* Start Aggregation Example 4 */ collection = mongoc_database_get_collection (db, "air_alliances"); pipeline = BCON_NEW ("pipeline", "[", "{", "$lookup", "{", "from", BCON_UTF8 ("air_airlines"), "let", "{", "constituents", BCON_UTF8 ("$airlines"), "}", "pipeline", "[", "{", "$match", "{", "$expr", "{", "$in", "[", "$name", BCON_UTF8 ("$$constituents"), "]", "}", "}", "}", "]", "as", BCON_UTF8 ("airlines"), "}", "}", "{", "$project", "{", "_id", BCON_INT32 (0), "name", BCON_INT32 (1), "airlines", "{", "$filter", "{", "input", BCON_UTF8 ("$airlines"), "as", BCON_UTF8 ("airline"), "cond", "{", "$eq", "[", BCON_UTF8 ("$$airline.country"), BCON_UTF8 ("Canada"), "]", "}", "}", "}", "}", "}", "]"); cursor = mongoc_collection_aggregate ( collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_destroy (pipeline); while (mongoc_cursor_next (cursor, &doc)) { /* Do something with each doc here */ } if (mongoc_cursor_error (cursor, &error)) { MONGOC_ERROR ("%s\n", error.message); } mongoc_cursor_destroy (cursor); mongoc_collection_destroy (collection); /* End Aggregation Example 4 */ ASSERT_NO_CAPTURED_LOGS ("sample aggregation examples"); } static void test_sample_projection_with_aggregation_expressions (mongoc_database_t *db) { if (test_framework_get_server_version() < test_framework_str_to_version ("4.4")) { return; } /* Start Aggregation Projection Example 1 */ mongoc_collection_t *collection; bson_t *filter; bson_t *opts; mongoc_cursor_t *cursor; bson_error_t error; const bson_t *doc; collection = mongoc_database_get_collection (db, "inventory"); filter = BCON_NEW (NULL); opts = BCON_NEW ("projection", "{", "_id", BCON_INT32(0), "item", BCON_INT32(1), "status", "{", "$switch", "{", "branches", "[", "{", "case", "{", "$eq", "[", "$status", BCON_UTF8("A"), "]", "}", "then", BCON_UTF8("Available"), "}", "{", "case", "{", "$eq", "[", "$status", BCON_UTF8("D"), "]", "}", "then", BCON_UTF8("Discontinued"), "}", "]", "default", BCON_UTF8("No status found"), "}", "}", "area", "{", "$concat", "[", "{", "$toString", "{", "$multiply", "[", BCON_UTF8("$size.h"), BCON_UTF8("$size.w"), "]", "}", "}", BCON_UTF8(" "), BCON_UTF8("$size.uom"), "]", "}", "reportNumber", "{", "$literal", BCON_INT32(1), "}", "}"); cursor = mongoc_collection_find_with_opts (collection, filter, opts, NULL); while (mongoc_cursor_next (cursor, &doc)) { /* Do something with each doc here */ } if (mongoc_cursor_error (cursor, &error)) { MONGOC_ERROR ("%s\n", error.message); } bson_destroy (filter); bson_destroy (opts); mongoc_cursor_destroy (cursor); mongoc_collection_destroy (collection); /* End Aggregation Projection Example 1 */ ASSERT_NO_CAPTURED_LOGS ("sample projection with aggregation expressions examples"); } static void test_sample_run_command (mongoc_database_t *db) { /* Start runCommand Example 1 */ bson_t *run_command; bson_t reply; bson_error_t error; bool r; run_command = BCON_NEW ("buildInfo", BCON_INT32 (1)); r = mongoc_database_write_command_with_opts ( db, run_command, NULL /* opts */, &reply, &error); bson_destroy (run_command); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* Do something with reply here */ bson_destroy (&reply); /* End runCommand Example 1 */ ASSERT_NO_CAPTURED_LOGS ("sample runCommand examples"); } static void test_sample_indexes (mongoc_database_t *db) { /* Start Index Example 1 */ const char *collection_name = "records"; bson_t reply; bson_t keys; bson_t *index_opts; bson_error_t error; bool r; mongoc_collection_t *collection; mongoc_index_model_t *im; bson_init (&keys); BSON_APPEND_INT32 (&keys, "score", 1); collection = mongoc_database_get_collection (db, collection_name); im = mongoc_index_model_new (&keys, NULL /* opts */); r = mongoc_collection_create_indexes_with_opts ( collection, &im, 1, NULL /* opts */, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* Do something with reply here */ bson_destroy (&reply); bson_destroy (&keys); mongoc_index_model_destroy (im); mongoc_collection_destroy (collection); /* End Index Example 1 */ /* Start Index Example 2 */ collection_name = "restaurants"; collection = mongoc_database_get_collection (db, collection_name); bson_init (&keys); BSON_APPEND_INT32 (&keys, "cuisine", 1); BSON_APPEND_INT32 (&keys, "name", 1); index_opts = BCON_NEW ("partialFilterExpression", "{", "rating", "{", "$gt", BCON_INT32 (5), "}", "}"); im = mongoc_index_model_new (&keys, index_opts); r = mongoc_collection_create_indexes_with_opts ( collection, &im, 1, NULL /* opts */, &reply, &error); if (!r) { MONGOC_ERROR ("%s\n", error.message); } /* Do something with reply here */ bson_destroy (&reply); bson_destroy (index_opts); bson_destroy (&keys); mongoc_index_model_destroy (im); mongoc_collection_destroy (collection); /* End Index Example 2 */ ASSERT_NO_CAPTURED_LOGS ("sample index examples"); } /* convenience function for testing the outcome of example code */ static void find_and_match (mongoc_collection_t *collection, const char *filter, const char *pattern) { mongoc_cursor_t *cursor; const bson_t *doc; bson_error_t error; cursor = mongoc_collection_find_with_opts ( collection, tmp_bson (filter), NULL, NULL); if (!mongoc_cursor_next (cursor, &doc)) { if (mongoc_cursor_error (cursor, &error)) { ASSERT_OR_PRINT (false, error); } test_error ( "No document in %s matching %s", collection->collection, filter); } ASSERT_MATCH (doc, pattern); mongoc_cursor_destroy (cursor); } /* setup, preliminary to transactions example code */ static void insert_employee (mongoc_client_t *client, int employee) { mongoc_collection_t *employees; mongoc_collection_t *events; bson_error_t error; bool r; ASSERT (client); employees = mongoc_client_get_collection (client, "hr", "employees"); mongoc_collection_drop (employees, NULL); r = mongoc_collection_insert_one ( employees, tmp_bson ("{'employee': %d, 'status': 'Active'}", employee), NULL, NULL, &error); ASSERT_OR_PRINT (r, error); events = mongoc_client_get_collection (client, "reporting", "events"); mongoc_collection_drop (events, NULL); r = mongoc_collection_insert_one ( events, tmp_bson ("{'employee': %d, 'status': {'new': 'Active', 'old': null}}", employee), NULL, NULL, &error); ASSERT_OR_PRINT (r, error); mongoc_collection_destroy (employees); mongoc_collection_destroy (events); } /* clang-format on */ /* Start Transactions Retry Example 3 */ /* takes a session, an out-param for server reply, and out-param for error. */ typedef bool (*txn_func_t)(mongoc_client_session_t *, bson_t *, bson_error_t *); /* runs transactions with retry logic */ bool run_transaction_with_retry(txn_func_t txn_func, mongoc_client_session_t *cs, bson_error_t *error) { bson_t reply; bool r; while (true) { /* perform transaction */ r = txn_func(cs, &reply, error); if (r) { /* success */ bson_destroy(&reply); return true; } MONGOC_WARNING("Transaction aborted: %s", error->message); if (mongoc_error_has_label(&reply, "TransientTransactionError")) { /* on transient error, retry the whole transaction */ MONGOC_WARNING("TransientTransactionError, retrying transaction..."); bson_destroy(&reply); } else { /* non-transient error */ break; } } bson_destroy(&reply); return false; } /* commit transactions with retry logic */ bool commit_with_retry(mongoc_client_session_t *cs, bson_error_t *error) { bson_t reply; bool r; while (true) { /* commit uses write concern set at transaction start, see * mongoc_transaction_opts_set_write_concern */ r = mongoc_client_session_commit_transaction(cs, &reply, error); if (r) { MONGOC_DEBUG("Transaction committed"); break; } if (mongoc_error_has_label(&reply, "UnknownTransactionCommitResult")) { MONGOC_WARNING("UnknownTransactionCommitResult, retrying commit ..."); bson_destroy(&reply); } else { /* commit failed, cannot retry */ break; } } bson_destroy(&reply); return r; } /* updates two collections in a transaction and calls commit_with_retry */ bool update_employee_info(mongoc_client_session_t *cs, bson_t *reply, bson_error_t *error) { mongoc_client_t *client; mongoc_collection_t *employees; mongoc_collection_t *events; mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; mongoc_transaction_opt_t *txn_opts; bson_t opts = BSON_INITIALIZER; bson_t *filter = NULL; bson_t *update = NULL; bson_t *event = NULL; bool r; bson_init(reply); client = mongoc_client_session_get_client(cs); employees = mongoc_client_get_collection(client, "hr", "employees"); events = mongoc_client_get_collection(client, "reporting", "events"); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_SNAPSHOT); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w( wc, MONGOC_WRITE_CONCERN_W_MAJORITY); /* Atlas connection strings include majority by default*/ txn_opts = mongoc_transaction_opts_new(); mongoc_transaction_opts_set_read_concern(txn_opts, rc); mongoc_transaction_opts_set_write_concern(txn_opts, wc); r = mongoc_client_session_start_transaction(cs, txn_opts, error); if (!r) { goto done; } r = mongoc_client_session_append(cs, &opts, error); if (!r) { goto done; } filter = BCON_NEW("employee", BCON_INT32(3)); update = BCON_NEW("$set", "{", "status", "Inactive", "}"); /* mongoc_collection_update_one will reinitialize reply */ bson_destroy(reply); r = mongoc_collection_update_one(employees, filter, update, &opts, reply, error); if (!r) { goto abort; } event = BCON_NEW("employee", BCON_INT32(3)); BCON_APPEND(event, "status", "{", "new", "Inactive", "old", "Active", "}"); bson_destroy(reply); r = mongoc_collection_insert_one(events, event, &opts, reply, error); if (!r) { goto abort; } r = commit_with_retry(cs, error); abort: if (!r) { MONGOC_ERROR("Aborting due to error in transaction: %s", error->message); mongoc_client_session_abort_transaction(cs, NULL); } done: mongoc_collection_destroy(employees); mongoc_collection_destroy(events); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); mongoc_transaction_opts_destroy(txn_opts); bson_destroy(&opts); bson_destroy(filter); bson_destroy(update); bson_destroy(event); return r; } void example_func(mongoc_client_t *client) { mongoc_client_session_t *cs; bson_error_t error; bool r; ASSERT(client); cs = mongoc_client_start_session(client, NULL, &error); if (!cs) { MONGOC_ERROR("Could not start session: %s", error.message); return; } r = run_transaction_with_retry(update_employee_info, cs, &error); if (!r) { MONGOC_ERROR("Could not update employee, permanent error: %s", error.message); } mongoc_client_session_destroy(cs); } /* End Transactions Retry Example 3 */ static void test_sample_txn_commands(mongoc_client_t *client) { mongoc_collection_t *employees; mongoc_collection_t *events; ASSERT(client); if (!test_framework_skip_if_no_txns()) { return; } /* preliminary: create collections outside txn */ insert_employee(client, 3); employees = mongoc_client_get_collection(client, "hr", "employees"); events = mongoc_client_get_collection(client, "reporting", "events"); capture_logs(true); /* test transactions retry example 3 */ example_func(client); ASSERT_NO_CAPTURED_LOGS("transactions retry example 3"); capture_logs(false); find_and_match(employees, "{'employee': 3}", "{'status': 'Inactive'}"); mongoc_collection_destroy(employees); mongoc_collection_destroy(events); } static mongoc_client_t * get_client(void) { return test_framework_new_default_client(); } /* Returns a test client without version API options configured. */ static mongoc_client_t * get_client_for_version_api_example(void) { mongoc_client_t *client; mongoc_uri_t *uri; uri = test_framework_get_uri(); client = mongoc_client_new_from_uri(uri); ASSERT(client); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); return client; } static bool callback(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error); /* See additional usage of mongoc_client_session_with_transaction at * https://www.mongoc.org/libmongoc/1.15.3/mongoc_client_session_with_transaction.html */ /* Start Transactions withTxn API Example 1 */ static bool with_transaction_example(bson_error_t *error) { mongoc_client_t *client = NULL; mongoc_write_concern_t *wc = NULL; mongoc_collection_t *coll = NULL; bool success = false; bool ret = false; bson_t *doc = NULL; bson_t *insert_opts = NULL; mongoc_client_session_t *session = NULL; mongoc_transaction_opt_t *txn_opts = NULL; /* For a replica set, include the replica set name and a seedlist of the * members in the URI string; e.g. * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \ * "27017/?replicaSet=myRepl"; * client = mongoc_client_new (uri_repl); * For a sharded cluster, connect to the mongos instances; e.g. * uri_sharded = * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"; * client = mongoc_client_new (uri_sharded); */ client = get_client(); /* Prereq: Create collections. Note Atlas connection strings include a majority write * concern by default. */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_wmajority(wc, 1000); insert_opts = bson_new(); mongoc_write_concern_append(wc, insert_opts); coll = mongoc_client_get_collection(client, "mydb1", "foo"); doc = BCON_NEW("abc", BCON_INT32(0)); ret = mongoc_collection_insert_one(coll, doc, insert_opts, NULL /* reply */, error); if (!ret) { goto fail; } bson_destroy(doc); mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "mydb2", "bar"); doc = BCON_NEW("xyz", BCON_INT32(0)); ret = mongoc_collection_insert_one(coll, doc, insert_opts, NULL /* reply */, error); if (!ret) { goto fail; } /* Step 1: Start a client session. */ session = mongoc_client_start_session(client, NULL /* opts */, error); if (!session) { goto fail; } /* Step 2: Optional. Define options to use for the transaction. */ txn_opts = mongoc_transaction_opts_new(); mongoc_transaction_opts_set_write_concern(txn_opts, wc); /* Step 3: Use mongoc_client_session_with_transaction to start a transaction, * execute the callback, and commit (or abort on error). */ ret = mongoc_client_session_with_transaction(session, callback, txn_opts, NULL /* ctx */, NULL /* reply */, error); if (!ret) { goto fail; } success = true; fail: bson_destroy(doc); mongoc_collection_destroy(coll); bson_destroy(insert_opts); mongoc_write_concern_destroy(wc); mongoc_transaction_opts_destroy(txn_opts); mongoc_client_session_destroy(session); mongoc_client_destroy(client); return success; } /* Define the callback that specifies the sequence of operations to perform * inside the transactions. */ static bool callback(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { mongoc_client_t *client = NULL; mongoc_collection_t *coll = NULL; bson_t *doc = NULL; bool success = false; bool ret = false; BSON_UNUSED(ctx); client = mongoc_client_session_get_client(session); coll = mongoc_client_get_collection(client, "mydb1", "foo"); doc = BCON_NEW("abc", BCON_INT32(1)); ret = mongoc_collection_insert_one(coll, doc, NULL /* opts */, *reply, error); if (!ret) { goto fail; } bson_destroy(doc); mongoc_collection_destroy(coll); coll = mongoc_client_get_collection(client, "mydb2", "bar"); doc = BCON_NEW("xyz", BCON_INT32(999)); ret = mongoc_collection_insert_one(coll, doc, NULL /* opts */, *reply, error); if (!ret) { goto fail; } success = true; fail: mongoc_collection_destroy(coll); bson_destroy(doc); return success; } /* End Transactions withTxn API Example 1 */ static void _test_sample_versioned_api_example_1(void) { /* Start Versioned API Example 1 */ mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the * members in the URI string; e.g. * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \ * "27017/?replicaSet=myRepl"; * client = mongoc_client_new (uri_repl); * For a sharded cluster, connect to the mongos instances; e.g. * uri_sharded = * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"; * client = mongoc_client_new (uri_sharded); */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example(); mongoc_server_api_version_from_string("1", &server_api_version); server_api = mongoc_server_api_new(server_api_version); assert(mongoc_client_set_server_api(client, server_api, &error)); /* End Versioned API Example 1 */ mongoc_client_destroy(client); mongoc_server_api_destroy(server_api); BSON_UNUSED(error); } static void _test_sample_versioned_api_example_2(void) { /* Start Versioned API Example 2 */ mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the * members in the URI string; e.g. * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \ * "27017/?replicaSet=myRepl"; * client = mongoc_client_new (uri_repl); * For a sharded cluster, connect to the mongos instances; e.g. * uri_sharded = * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"; * client = mongoc_client_new (uri_sharded); */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example(); mongoc_server_api_version_from_string("1", &server_api_version); server_api = mongoc_server_api_new(server_api_version); mongoc_server_api_strict(server_api, true); assert(mongoc_client_set_server_api(client, server_api, &error)); /* End Versioned API Example 2 */ mongoc_client_destroy(client); mongoc_server_api_destroy(server_api); BSON_UNUSED(error); } static void _test_sample_versioned_api_example_3(void) { /* Start Versioned API Example 3 */ mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the * members in the URI string; e.g. * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \ * "27017/?replicaSet=myRepl"; * client = mongoc_client_new (uri_repl); * For a sharded cluster, connect to the mongos instances; e.g. * uri_sharded = * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"; * client = mongoc_client_new (uri_sharded); */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example(); mongoc_server_api_version_from_string("1", &server_api_version); server_api = mongoc_server_api_new(server_api_version); mongoc_server_api_strict(server_api, false); assert(mongoc_client_set_server_api(client, server_api, &error)); /* End Versioned API Example 3 */ mongoc_client_destroy(client); mongoc_server_api_destroy(server_api); BSON_UNUSED(error); } static void _test_sample_versioned_api_example_4(void) { /* Start Versioned API Example 4 */ mongoc_client_t *client = NULL; mongoc_server_api_t *server_api = NULL; mongoc_server_api_version_t server_api_version; bson_error_t error; /* For a replica set, include the replica set name and a seedlist of the * members in the URI string; e.g. * uri_repl = "mongodb://mongodb0.example.com:27017,mongodb1.example.com:" \ * "27017/?replicaSet=myRepl"; * client = mongoc_client_new (uri_repl); * For a sharded cluster, connect to the mongos instances; e.g. * uri_sharded = * "mongodb://mongos0.example.com:27017,mongos1.example.com:27017/"; * client = mongoc_client_new (uri_sharded); */ /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example(); mongoc_server_api_version_from_string("1", &server_api_version); server_api = mongoc_server_api_new(server_api_version); mongoc_server_api_deprecation_errors(server_api, true); assert(mongoc_client_set_server_api(client, server_api, &error)); /* End Versioned API Example 4 */ mongoc_client_destroy(client); mongoc_server_api_destroy(server_api); BSON_UNUSED(error); } static int64_t iso_to_unix(const char *iso_str) { BSON_UNUSED(iso_str); /* TODO (CDRIVER-2945) there is no convenient helper for converting ISO8601 * strings to Unix timestamps. This is not shown in the example. */ return 1628330345; } static void _test_sample_versioned_api_example_5_6_7_8(void) { #define N_DOCS 8 mongoc_client_t *client; mongoc_server_api_t *server_api; mongoc_server_api_version_t server_api_version; bool ok; bson_error_t error; mongoc_database_t *db; mongoc_collection_t *sales; bson_t *docs[N_DOCS]; int i; bson_t reply; int64_t count; bson_t *filter; /* Create a mongoc_client_t without server API options configured. */ client = get_client_for_version_api_example(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); mongoc_server_api_version_from_string("1", &server_api_version); server_api = mongoc_server_api_new(server_api_version); mongoc_server_api_strict(server_api, true); ok = mongoc_client_set_server_api(client, server_api, &error); ASSERT_OR_PRINT(ok, error); db = mongoc_client_get_database(client, "db"); sales = mongoc_database_get_collection(db, "sales"); /* Drop db.sales in case the collection exists. */ ok = mongoc_collection_drop(sales, &error); if (!ok && NULL == strstr(error.message, "ns not found")) { /* Ignore an "ns not found" error on dropping the collection in case the * namespace does not exist. */ ASSERT_OR_PRINT(ok, error); } /* Start Versioned API Example 5 */ docs[0] = BCON_NEW("_id", BCON_INT32(1), "item", "abc", "price", BCON_INT32(10), "quantity", BCON_INT32(2), "date", BCON_DATE_TIME(iso_to_unix("2021-01-01T08:00:00Z"))); docs[1] = BCON_NEW("_id", BCON_INT32(2), "item", "jkl", "price", BCON_INT32(20), "quantity", BCON_INT32(1), "date", BCON_DATE_TIME(iso_to_unix("2021-02-03T09:00:00Z"))); docs[2] = BCON_NEW("_id", BCON_INT32(3), "item", "xyz", "price", BCON_INT32(5), "quantity", BCON_INT32(5), "date", BCON_DATE_TIME(iso_to_unix("2021-02-03T09:05:00Z"))); docs[3] = BCON_NEW("_id", BCON_INT32(4), "item", "abc", "price", BCON_INT32(10), "quantity", BCON_INT32(10), "date", BCON_DATE_TIME(iso_to_unix("2021-02-15T08:00:00Z"))); docs[4] = BCON_NEW("_id", BCON_INT32(5), "item", "xyz", "price", BCON_INT32(5), "quantity", BCON_INT32(10), "date", BCON_DATE_TIME(iso_to_unix("2021-02-15T09:05:00Z"))); docs[5] = BCON_NEW("_id", BCON_INT32(6), "item", "xyz", "price", BCON_INT32(5), "quantity", BCON_INT32(5), "date", BCON_DATE_TIME(iso_to_unix("2021-02-15T12:05:10Z"))); docs[6] = BCON_NEW("_id", BCON_INT32(7), "item", "xyz", "price", BCON_INT32(5), "quantity", BCON_INT32(10), "date", BCON_DATE_TIME(iso_to_unix("2021-02-15T14:12:12Z"))); docs[7] = BCON_NEW("_id", BCON_INT32(8), "item", "abc", "price", BCON_INT32(10), "quantity", BCON_INT32(5), "date", BCON_DATE_TIME(iso_to_unix("2021-03-16T20:20:13Z"))); ok = mongoc_collection_insert_many(sales, (const bson_t **)docs, N_DOCS, NULL /* opts */, &reply, &error); /* End Versioned API Example 5 */ ASSERT_OR_PRINT(ok, error); bson_destroy(&reply); { const server_version_t version = test_framework_get_server_version(); // count command was added to API version 1 in 6.0 and backported to 5.0.9 // and 5.3.2 (see SERVER-63850 and DRIVERS-2228). This test assumes count // command is not in API version 1. Skip until examples are updated // accordingly (see DRIVERS-1846). const bool should_skip = (version >= 106100100) || // [6.0.0, inf) (version >= 105103102 && version < 106100100) || // [5.3.2, 6.0.0) (version >= 105100109 && version < 105101100); // [5.0.9, 5.1.0) if (!should_skip) { bson_t *cmd = BCON_NEW("count", "sales"); ok = mongoc_database_command_simple(db, cmd, NULL /* read_prefs */, &reply, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER, 323, "Provided apiStrict:true, but the command count " "is not in API Version 1"); ASSERT(!ok); bson_destroy(&reply); bson_destroy(cmd); } } #if 0 /* This block not evaluated, but is inserted into documentation to represent the above reply. * Don't delete me! */ /* Start Versioned API Example 6 */ char *str = bson_as_relaxed_extended_json (&reply, NULL /* length */); printf ("%s", str); /* Prints the server reply: * { "ok" : 0, "errmsg" : "Provided apiStrict:true, but the command count is not in API Version 1", "code" : 323, "codeName" : "APIStrictError" } */ bson_free (str); /* End Versioned API Example 6 */ #endif /* Start Versioned API Example 7 */ filter = bson_new(); count = mongoc_collection_count_documents(sales, filter, NULL /* opts */, NULL /* read_prefs */, &reply, &error); /* End Versioned API Example 7 */ if (N_DOCS != count) { test_error("expected %d documents, got %" PRId64, N_DOCS, count); } bson_destroy(&reply); /* Start Versioned API Example 8 */ BSON_ASSERT(count == N_DOCS); /* End Versioned API Example 8 */ bson_destroy(filter); for (i = 0; i < N_DOCS; i++) { bson_destroy(docs[i]); } mongoc_collection_destroy(sales); mongoc_database_destroy(db); mongoc_server_api_destroy(server_api); mongoc_client_destroy(client); } static void test_sample_versioned_api(void) { _test_sample_versioned_api_example_1(); _test_sample_versioned_api_example_2(); _test_sample_versioned_api_example_3(); _test_sample_versioned_api_example_4(); _test_sample_versioned_api_example_5_6_7_8(); } static void test_sample_commands(void) { mongoc_client_t *client; mongoc_database_t *db; mongoc_collection_t *collection; client = test_framework_new_default_client(); db = mongoc_client_get_database(client, "test_sample_command"); collection = mongoc_database_get_collection(db, "inventory"); mongoc_collection_drop(collection, NULL); test_sample_command(test_example_1, 1, db, collection, false); test_sample_command(test_example_2, 2, db, collection, false); test_sample_command(test_example_3, 3, db, collection, true); test_sample_command(test_example_6, 6, db, collection, false); test_sample_command(test_example_7, 7, db, collection, false); test_sample_command(test_example_9, 9, db, collection, false); test_sample_command(test_example_10, 10, db, collection, false); test_sample_command(test_example_11, 11, db, collection, false); test_sample_command(test_example_12, 12, db, collection, false); test_sample_command(test_example_13, 13, db, collection, true); test_sample_command(test_example_14, 14, db, collection, false); test_sample_command(test_example_15, 15, db, collection, false); test_sample_command(test_example_16, 16, db, collection, false); test_sample_command(test_example_17, 17, db, collection, false); test_sample_command(test_example_18, 18, db, collection, false); test_sample_command(test_example_19, 19, db, collection, true); test_sample_command(test_example_20, 20, db, collection, false); test_sample_command(test_example_21, 21, db, collection, false); test_sample_command(test_example_22, 22, db, collection, false); test_sample_command(test_example_23, 23, db, collection, false); test_sample_command(test_example_24, 24, db, collection, false); test_sample_command(test_example_25, 25, db, collection, false); test_sample_command(test_example_26, 26, db, collection, false); test_sample_command(test_example_27, 27, db, collection, false); test_sample_command(test_example_28, 28, db, collection, true); test_sample_command(test_example_29, 29, db, collection, false); test_sample_command(test_example_30, 30, db, collection, false); test_sample_command(test_example_31, 31, db, collection, false); test_sample_command(test_example_32, 32, db, collection, false); test_sample_command(test_example_33, 33, db, collection, false); test_sample_command(test_example_34, 34, db, collection, false); test_sample_command(test_example_35, 35, db, collection, false); test_sample_command(test_example_36, 36, db, collection, false); test_sample_command(test_example_37, 37, db, collection, true); test_sample_command(test_example_38, 38, db, collection, false); test_sample_command(test_example_39, 39, db, collection, false); test_sample_command(test_example_40, 40, db, collection, false); test_sample_command(test_example_41, 41, db, collection, true); test_sample_command(test_example_42, 42, db, collection, false); test_sample_command(test_example_43, 43, db, collection, false); test_sample_command(test_example_44, 44, db, collection, false); test_sample_command(test_example_45, 45, db, collection, false); test_sample_command(test_example_46, 46, db, collection, false); test_sample_command(test_example_47, 47, db, collection, false); test_sample_command(test_example_48, 48, db, collection, false); test_sample_command(test_example_49, 49, db, collection, false); test_sample_command(test_example_50, 50, db, collection, true); test_sample_command(test_example_51, 51, db, collection, false); test_sample_command(test_example_52, 52, db, collection, false); test_sample_command(test_example_53, 53, db, collection, false); test_sample_command(test_example_54, 54, db, collection, true); test_sample_command(test_example_55, 55, db, collection, false); test_sample_command(test_example_57, 57, db, collection, false); test_sample_command(test_example_58, 58, db, collection, false); // Run 56 after 57 and 58. 56 deletes all data. 57 and 58 expect data present. test_sample_command(test_example_56, 56, db, collection, true); test_sample_change_stream_command(test_example_change_stream, db); test_sample_causal_consistency(client); test_sample_aggregation(db); test_sample_projection_with_aggregation_expressions(db); test_sample_indexes(db); test_sample_run_command(db); test_sample_txn_commands(client); test_snapshot_query_examples(); if (test_framework_max_wire_version_at_least(WIRE_VERSION_4_9)) { test_sample_versioned_api(); } mongoc_collection_drop(collection, NULL); mongoc_collection_destroy(collection); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void test_with_txn_example(void *unused) { bson_error_t error; BSON_UNUSED(unused); ASSERT_OR_PRINT(with_transaction_example(&error), error); } void test_samples_install(TestSuite *suite) { TestSuite_AddLive(suite, "/Samples", test_sample_commands); TestSuite_AddFull( suite, "/Samples/with_txn [lock:live-server]", test_with_txn_example, NULL, NULL, test_framework_skip_if_no_txns); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-scram.c000066400000000000000000000705401511661753600237750ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #ifdef MONGOC_ENABLE_SSL static void test_mongoc_scram_step_username_not_set(void) { mongoc_scram_t scram; bool success; uint8_t buf[4096] = {0}; uint32_t buflen = 0; bson_error_t error; _mongoc_scram_init(&scram, MONGOC_CRYPTO_ALGORITHM_SHA_1); _mongoc_scram_set_pass(&scram, "password"); success = _mongoc_scram_step(&scram, buf, buflen, buf, sizeof buf, &buflen, &error); ASSERT(!success); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: username is not set"); _mongoc_scram_destroy(&scram); } typedef struct { const char *original; const char *normalized; bool should_be_required; bool should_succeed; } sasl_prep_testcase_t; /* test that an error is reported if the server responds with an iteration * count that is less than 4096 */ static void test_iteration_count(int count, bool should_succeed) { mongoc_scram_t scram; uint8_t buf[4096] = {0}; uint32_t buflen = 0; bson_error_t error; const char *client_nonce = "YWJjZA=="; char *server_response; bool success; server_response = bson_strdup_printf("r=YWJjZA==YWJjZA==,s=r6+P1iLmSJvhrRyuFi6Wsg==,i=%d", count); /* set up the scram state to immediately test step 2. */ _mongoc_scram_init(&scram, MONGOC_CRYPTO_ALGORITHM_SHA_1); _mongoc_scram_set_pass(&scram, "password"); bson_strncpy(scram.encoded_nonce, client_nonce, sizeof(scram.encoded_nonce)); scram.encoded_nonce_len = (int32_t)strlen(client_nonce); scram.auth_message = bson_malloc0(4096); scram.auth_messagemax = 4096; /* prepare the server's "response" from step 1 as the input for step 2. */ memcpy(buf, server_response, strlen(server_response) + 1); buflen = (int32_t)strlen(server_response); scram.step = 1; success = _mongoc_scram_step(&scram, buf, buflen, buf, sizeof buf, &buflen, &error); if (should_succeed) { ASSERT_OR_PRINT(success, error); } else { BSON_ASSERT(!success); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SCRAM, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, "SCRAM Failure: iterations must be at least 4096"); } bson_free(server_response); _mongoc_scram_destroy(&scram); } static void test_mongoc_scram_iteration_count(void) { test_iteration_count(1000, false); test_iteration_count(4095, false); test_iteration_count(4096, true); test_iteration_count(10000, true); } static void test_mongoc_scram_sasl_prep(void) { int i, ntests; char *normalized; bson_error_t err; /* examples from RFC 4013 section 3. */ sasl_prep_testcase_t tests[] = {// normalization {"\x65\xCC\x81", "\xC3\xA9", true, true}, {"\xC2\xAA", "a", true, true}, {"Henry \xE2\x85\xA3", "Henry IV", true, true}, {"A\xEF\xAC\x83n", "Affin", true, true}, // mapped to nothing character (Table B.1) {"I\xC2\xADX", "IX", true, true}, // mapped to nothing character (Table C.1.2) {"I\xE2\x80\x80\xC2\xA0X", "I X", true, true}, // prohibited character {"banana \x07 apple", "(invalid)", true, false}, // unassigned codepoint (Table A.1) {"banana \xe0\xAA\xBA apple", "(invalid)", true, false}, // bidi: RandALCat but not RandALCat at beginning and end {"\xD8\xA7\x31", "(invalid)", true, false}, // bidi: RandALCat and LCat characters {"\xFB\x1D apple \x09\xA8", "(invalid)", true, false}, // bidi: RandALCat with RandALCat at beginning and end {"\xD8\xA1 \xDC\x92", "\xD8\xA1 \xDC\x92", true, true}, // normalization and mapped to nothing {"I\xE2\x80\x80\xC2\xA0X \xE2\x85\xA3", "I X IV", true, true}, {"user", "user", false, true}, {"USER", "USER", false, true}}; ntests = sizeof(tests) / sizeof(sasl_prep_testcase_t); for (i = 0; i < ntests; i++) { ASSERT_CMPINT(tests[i].should_be_required, ==, _mongoc_sasl_prep_required(tests[i].original)); memset(&err, 0, sizeof(err)); normalized = _mongoc_sasl_prep(tests[i].original, &err); if (tests[i].should_succeed) { ASSERT_CMPSTR(tests[i].normalized, normalized); ASSERT_CMPINT(err.code, ==, 0); bson_free(normalized); } else { ASSERT_CMPINT(err.code, ==, MONGOC_ERROR_SCRAM_PROTOCOL_ERROR); ASSERT_CMPINT(err.domain, ==, MONGOC_ERROR_SCRAM); BSON_ASSERT(normalized == NULL); } } } static void test_mongoc_utf8_char_length(void) { ASSERT_CMPSIZE_T(_mongoc_utf8_char_length(","), ==, 1u); ASSERT_CMPSIZE_T(_mongoc_utf8_char_length("ɶ"), ==, 2u); ASSERT_CMPSIZE_T(_mongoc_utf8_char_length("ྡྷ"), ==, 3u); ASSERT_CMPSIZE_T(_mongoc_utf8_char_length("🌂"), ==, 4u); } static void test_mongoc_utf8_string_length(void) { ASSERT_CMPSIZE_T(_mongoc_utf8_string_length(",ase"), ==, 4u); ASSERT_CMPSIZE_T(_mongoc_utf8_string_length("ɸɴ"), ==, 2u); ASSERT_CMPSIZE_T(_mongoc_utf8_string_length("ྡྷ🌂e4🌕"), ==, 5u); ASSERT_CMPSIZE_T(_mongoc_utf8_string_length("no special characters"), ==, 21u); } static void test_mongoc_utf8_to_unicode(void) { ASSERT_CMPUINT32(_mongoc_utf8_get_first_code_point(",", 1), ==, 0x002C); ASSERT_CMPUINT32(_mongoc_utf8_get_first_code_point("ɶ", 2), ==, 0x0276); ASSERT_CMPUINT32(_mongoc_utf8_get_first_code_point("ྡྷ", 3), ==, 0x0FA2); ASSERT_CMPUINT32(_mongoc_utf8_get_first_code_point("🌂", 4), ==, 0x1F302); } #endif enum { // ensure there are more users than slots in cache to test cache invalidation NUM_CACHE_TEST_USERS = 10 + MONGOC_SCRAM_CACHE_SIZE, // ensure that there are several times that the cache needs to be invalidated NUM_CACHE_TEST_THREADS = 3 * NUM_CACHE_TEST_USERS, }; static char *_scram_cache_invalidation_uri_str = NULL; static BSON_THREAD_FUN(_scram_cache_invalidation_thread, username_number_ptr) { bson_error_t error; const char *password = "mypass"; char *username = bson_strdup_printf("cachetestuser%dX", *(int *)username_number_ptr); bson_free(username_number_ptr); const char *uri_str = _scram_cache_invalidation_uri_str; char *cache_test_user_uri = test_framework_add_user_password(uri_str, username, password); BSON_ASSERT(cache_test_user_uri); mongoc_uri_t *cache_test_uri = mongoc_uri_new(cache_test_user_uri); BSON_ASSERT(cache_test_uri); // Set serverSelectionTryOnce=false so a single failed connection attempt // does not result in an error. mongoc_uri_set_option_as_bool(cache_test_uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false); mongoc_client_t *client = test_framework_client_new_from_uri(cache_test_uri, NULL /* api */); BSON_ASSERT(client); test_framework_set_ssl_opts(client); BSON_ASSERT(client); mongoc_collection_t *collection = mongoc_client_get_collection(client, "admin", "testcache"); BSON_ASSERT(collection); bson_t insert = BSON_INITIALIZER; bool ok = mongoc_collection_insert_one(collection, &insert, NULL, NULL, &error); ASSERT_OR_PRINT(ok, error); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_uri_destroy(cache_test_uri); bson_free(cache_test_user_uri); bson_free(username); BSON_THREAD_RETURN; } static void test_mongoc_scram_cache_invalidation(void *ctx) { BSON_UNUSED(ctx); bson_error_t error; mongoc_uri_t *const uri = test_framework_get_uri(); BSON_ASSERT(uri); mongoc_client_t *client = test_framework_new_default_client(); BSON_ASSERT(client); mongoc_database_t *const db = mongoc_client_get_database(client, "admin"); BSON_ASSERT(db); bson_t *roles = tmp_bson("[{'role': 'readWrite', 'db': 'admin'}]"); _scram_cache_invalidation_uri_str = test_framework_get_uri_str_no_auth("admin"); /* Remove cache test users if they already exist. * Create more test users than could exist in cache. */ for (int i = 0; i < NUM_CACHE_TEST_USERS; i++) { const char *password = "mypass"; char *username = bson_strdup_printf("cachetestuser%dX", i); mongoc_database_remove_user(db, username, &error); bool ok = mongoc_database_add_user(db, username, password, roles, NULL, &error); ASSERT_OR_PRINT(ok, error); bson_free(username); } bson_thread_t threads[NUM_CACHE_TEST_THREADS]; for (int i = 0; i < NUM_CACHE_TEST_THREADS; i++) { int *username_number_ptr = bson_malloc(sizeof(*username_number_ptr)); *username_number_ptr = i % NUM_CACHE_TEST_USERS; int rc = mcommon_thread_create(&threads[i], _scram_cache_invalidation_thread, username_number_ptr); BSON_ASSERT(rc == 0); } for (int i = 0; i < NUM_CACHE_TEST_THREADS; i++) { int rc = mcommon_thread_join(threads[i]); BSON_ASSERT(rc == 0); } bson_free(_scram_cache_invalidation_uri_str); _scram_cache_invalidation_uri_str = NULL; mongoc_database_destroy(db); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void _clear_scram_users(void) { mongoc_client_t *const client = test_framework_new_default_client(); ASSERT(client); mongoc_database_t *const db = mongoc_client_get_database(client, "admin"); ASSERT(db); (void)mongoc_database_remove_user(db, "sha1", NULL); (void)mongoc_database_remove_user(db, "sha256", NULL); (void)mongoc_database_remove_user(db, "both", NULL); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void _create_scram_users(void) { mongoc_client_t *client; bool res; bson_error_t error; client = test_framework_new_default_client(); res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': 'sha1', 'pwd': 'sha1', 'roles': ['root'], " "'mechanisms': ['SCRAM-SHA-1']}"), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(res, error); res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': 'sha256', 'pwd': 'sha256', 'roles': ['root'], " "'mechanisms': ['SCRAM-SHA-256']}"), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(res, error); res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': 'both', 'pwd': 'both', 'roles': ['root'], " "'mechanisms': ['SCRAM-SHA-1', 'SCRAM-SHA-256']}"), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(res, error); mongoc_client_destroy(client); } static void _drop_scram_users(void) { mongoc_client_t *client; mongoc_database_t *db; bool res; bson_error_t error; client = test_framework_new_default_client(); db = mongoc_client_get_database(client, "admin"); res = mongoc_database_remove_user(db, "sha1", &error); ASSERT_OR_PRINT(res, error); res = mongoc_database_remove_user(db, "sha256", &error); ASSERT_OR_PRINT(res, error); res = mongoc_database_remove_user(db, "both", &error); ASSERT_OR_PRINT(res, error); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void _check_mechanism(bool pooled, const char *client_mech, const char *server_mechs, const char *expected_used_mech) { mock_server_t *server; mongoc_client_pool_t *client_pool = NULL; mongoc_client_t *client = NULL; mongoc_uri_t *uri; future_t *future; request_t *request; const bson_t *sasl_doc; const char *used_mech; server = mock_server_new(); mock_server_auto_hello(server, "{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'isWritablePrimary': true," " 'saslSupportedMechs': [%s]}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, server_mechs ? server_mechs : ""); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_username(uri, "user"); mongoc_uri_set_password(uri, "password"); if (client_mech) { mongoc_uri_set_auth_mechanism(uri, client_mech); } if (pooled) { client_pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(client_pool); /* suppress the auth failure logs from pooled clients. */ capture_logs(true); } else { client = test_framework_client_new_from_uri(uri, NULL); } future = future_client_command_simple( client, "admin", tmp_bson("{'dbstats': 1}"), NULL /* read_prefs. */, NULL /* reply. */, NULL /* error. */); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{}")); sasl_doc = request_get_doc(request, 0); used_mech = bson_lookup_utf8(sasl_doc, "mechanism"); ASSERT_CMPSTR(used_mech, expected_used_mech); /* we're not actually going to auth, just hang up. */ reply_to_request_with_hang_up(request); future_wait(future); future_destroy(future); request_destroy(request); mongoc_uri_destroy(uri); if (pooled) { mongoc_client_pool_push(client_pool, client); mongoc_client_pool_destroy(client_pool); capture_logs(false); } else { mongoc_client_destroy(client); } mock_server_destroy(server); } typedef enum { MONGOC_TEST_NO_ERROR, MONGOC_TEST_USER_NOT_FOUND_ERROR, MONGOC_TEST_AUTH_ERROR } test_error_t; void _check_error(const bson_error_t *error, test_error_t expected_error) { uint32_t domain = 0; uint32_t code = 0; const char *message = ""; switch (expected_error) { case MONGOC_TEST_AUTH_ERROR: { domain = MONGOC_ERROR_CLIENT; code = MONGOC_ERROR_CLIENT_AUTHENTICATE; ASSERT_CMPUINT32(error->domain, ==, domain); ASSERT_CMPUINT32(error->code, ==, code); const char *const a = "Authentication failed"; const char *const b = "Unable to use"; const bool found = strstr(error->message, a) || strstr(error->message, b); ASSERT_WITH_MSG(found, "[%s] does not contain [%s] or [%s]", error->message, a, b); break; } case MONGOC_TEST_USER_NOT_FOUND_ERROR: domain = MONGOC_ERROR_CLIENT; code = MONGOC_ERROR_CLIENT_AUTHENTICATE; message = "Could not find user"; break; case MONGOC_TEST_NO_ERROR: default: return; } ASSERT_ERROR_CONTAINS((*error), domain, code, message); } static void _try_auth_from_uri(bool pooled, mongoc_uri_t *uri, test_error_t expected_error) { mongoc_client_pool_t *client_pool = NULL; mongoc_client_t *client = NULL; mongoc_collection_t *coll; bson_error_t error; bson_t reply; bool res; if (pooled) { client_pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(client_pool); mongoc_client_pool_set_error_api(client_pool, 2); client = mongoc_client_pool_pop(client_pool); /* suppress the auth failure logs from pooled clients. */ capture_logs(true); } else { client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_error_api(client, 2); test_framework_set_ssl_opts(client); } coll = get_test_collection(client, "try_auth"); res = mongoc_collection_insert_one(coll, tmp_bson("{'x': 1}"), NULL /* opts */, &reply, &error); if (expected_error == MONGOC_TEST_NO_ERROR) { ASSERT_OR_PRINT(res, error); ASSERT_MATCH(&reply, "{'insertedCount': 1 }"); } else { ASSERT(!res); _check_error(&error, expected_error); } bson_destroy(&reply); mongoc_collection_destroy(coll); if (pooled) { mongoc_client_pool_push(client_pool, client); mongoc_client_pool_destroy(client_pool); capture_logs(false); } else { mongoc_client_destroy(client); } } /* if auth is expected to succeed, expected_error is zero'd out. */ static void _try_auth(bool pooled, const char *user, const char *pwd, const char *mechanism, test_error_t expected_error) { mongoc_uri_t *uri; uri = test_framework_get_uri(); mongoc_uri_set_username(uri, user); mongoc_uri_set_password(uri, pwd); if (mechanism) { mongoc_uri_set_auth_mechanism(uri, mechanism); } _try_auth_from_uri(pooled, uri, expected_error); mongoc_uri_destroy(uri); } static void _test_mongoc_scram_auth(bool pooled) { /* Auth spec: "For each test user, verify that you can connect and run a command requiring authentication for the following cases: - Explicitly specifying each mechanism the user supports. - Specifying no mechanism and relying on mechanism negotiation." */ _try_auth(pooled, "sha1", "sha1", NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, "sha1", "sha1", "SCRAM-SHA-1", MONGOC_TEST_NO_ERROR); _try_auth(pooled, "sha256", "sha256", NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, "sha256", "sha256", "SCRAM-SHA-256", MONGOC_TEST_NO_ERROR); _try_auth(pooled, "both", "both", NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, "both", "both", "SCRAM-SHA-1", MONGOC_TEST_NO_ERROR); _try_auth(pooled, "both", "both", "SCRAM-SHA-256", MONGOC_TEST_NO_ERROR); _check_mechanism(pooled, NULL, NULL, "SCRAM-SHA-1"); _check_mechanism(pooled, NULL, "'SCRAM-SHA-1'", "SCRAM-SHA-1"); _check_mechanism(pooled, NULL, "'SCRAM-SHA-256'", "SCRAM-SHA-256"); _check_mechanism(pooled, NULL, "'SCRAM-SHA-1','SCRAM-SHA-256'", "SCRAM-SHA-256"); _check_mechanism(pooled, "SCRAM-SHA-1", NULL, "SCRAM-SHA-1"); _check_mechanism(pooled, "SCRAM-SHA-1", "'SCRAM-SHA-1'", "SCRAM-SHA-1"); _check_mechanism(pooled, "SCRAM-SHA-1", "'SCRAM-SHA-256'", "SCRAM-SHA-1"); _check_mechanism(pooled, "SCRAM-SHA-1", "'SCRAM-SHA-1','SCRAM-SHA-256'", "SCRAM-SHA-1"); _check_mechanism(pooled, "SCRAM-SHA-256", NULL, "SCRAM-SHA-256"); _check_mechanism(pooled, "SCRAM-SHA-256", "'SCRAM-SHA-1'", "SCRAM-SHA-256"); _check_mechanism(pooled, "SCRAM-SHA-256", "'SCRAM-SHA-256'", "SCRAM-SHA-256"); _check_mechanism(pooled, "SCRAM-SHA-256", "'SCRAM-SHA-1','SCRAM-SHA-256'", "SCRAM-SHA-256"); /* Test some failure auths. */ _try_auth(pooled, "sha1", "bad", NULL, MONGOC_TEST_AUTH_ERROR); _try_auth(pooled, "sha256", "bad", NULL, MONGOC_TEST_AUTH_ERROR); _try_auth(pooled, "both", "bad", NULL, MONGOC_TEST_AUTH_ERROR); _try_auth(pooled, "sha1", "bad", "SCRAM-SHA-256", MONGOC_TEST_AUTH_ERROR); _try_auth(pooled, "sha256", "bad", "SCRAM-SHA-1", MONGOC_TEST_AUTH_ERROR); /* Auth spec: "For a non-existent username, verify that not specifying a * mechanism when connecting fails with the same error type that would occur * with a correct username but incorrect password or mechanism." */ _try_auth(pooled, "unknown_user", "bad", NULL, MONGOC_TEST_AUTH_ERROR); } /* test the auth tests described in the auth spec. */ static void test_mongoc_scram_auth(void *ctx) { BSON_UNUSED(ctx); _clear_scram_users(); /* Auth spec: "Create three test users, one with only SHA-1, one with only * SHA-256 and one with both" */ _create_scram_users(); _test_mongoc_scram_auth(false); _test_mongoc_scram_auth(true); _drop_scram_users(); } static int _skip_if_no_sha256(void) { mongoc_client_t *client; bool res; bson_error_t error; client = test_framework_new_default_client(); /* Check if SCRAM-SHA-256 is a supported auth mechanism by attempting to * create a new user with it. */ res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': 'temp', 'pwd': 'sha256', 'roles': ['root'], " "'mechanisms': ['SCRAM-SHA-256']}"), NULL /* read_prefs */, NULL /* reply */, &error); if (res) { mongoc_database_t *db; db = mongoc_client_get_database(client, "admin"); ASSERT_OR_PRINT(mongoc_database_remove_user(db, "temp", &error), error); mongoc_database_destroy(db); } mongoc_client_destroy(client); return res ? 1 : 0; } #define ROMAN_NUMERAL_NINE "\xE2\x85\xA8" #define ROMAN_NUMERAL_FOUR "\xE2\x85\xA3" static void _clear_saslprep_users(void) { mongoc_client_t *const client = test_framework_new_default_client(); ASSERT(client); mongoc_database_t *const db = mongoc_client_get_database(client, "admin"); ASSERT(db); (void)mongoc_database_remove_user(db, "IX", NULL); (void)mongoc_database_remove_user(db, ROMAN_NUMERAL_NINE, NULL); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void _create_saslprep_users(void) { mongoc_client_t *client; bool res; bson_error_t error; client = test_framework_new_default_client(); res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': 'IX', 'pwd': 'IX', 'roles': ['root'], " "'mechanisms': ['SCRAM-SHA-256']}"), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(res, error); res = mongoc_client_command_simple(client, "admin", tmp_bson("{'createUser': '" ROMAN_NUMERAL_NINE "', 'pwd': '" ROMAN_NUMERAL_FOUR "', 'roles': ['root'], 'mechanisms': ['SCRAM-SHA-256']}"), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(res, error); mongoc_client_destroy(client); } static void _drop_saslprep_users(void) { mongoc_client_t *client; mongoc_database_t *db; bool res; bson_error_t error; client = test_framework_new_default_client(); db = mongoc_client_get_database(client, "admin"); res = mongoc_database_remove_user(db, "IX", &error); ASSERT_OR_PRINT(res, error); res = mongoc_database_remove_user(db, ROMAN_NUMERAL_NINE, &error); ASSERT_OR_PRINT(res, error); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void _make_uri(const char *username, const char *password, mongoc_uri_t **out) { char *uri_str; char *tmp; tmp = test_framework_get_uri_str_no_auth("admin"); uri_str = test_framework_add_user_password(tmp, username, password); mongoc_uri_destroy(*out); *out = mongoc_uri_new(uri_str); bson_free(tmp); bson_free(uri_str); } static void _test_mongoc_scram_saslprep_auth(bool pooled) { mongoc_uri_t *uri = NULL; /* Test URIs of the form in the auth spec test plan for SASLPrep. - mongodb://IX:IX@mongodb.example.com/admin - mongodb://IX:I%C2%ADX@mongodb.example.com/admin - mongodb://%E2%85%A8:IV@mongodb.example.com/admin - mongodb://%E2%85%A8:I%C2%ADV@mongodb.example.com/admin Test in three ways. 1. By embedding the multi-byte UTF-8 characters directly into the connection string. 2. By percent escaping the multi-byte UTF-8 characters. 3. By using the setters, mongoc_uri_set_username/mongoc_uri_set_password and embedding the UTF-8 characters (percent unescaping does not occur for the setters) */ /* Way 1: embedding multi-byte UTF-8 characters directly */ _make_uri("IX", "IX", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri("IX", ROMAN_NUMERAL_NINE, &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri(ROMAN_NUMERAL_NINE, "IV", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri(ROMAN_NUMERAL_NINE, ROMAN_NUMERAL_FOUR, &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); /* Way 2: Percent escaping */ _make_uri("IX", "IX", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri("IX", "I%C2%ADX", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri("%E2%85%A8", "IV", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); _make_uri("%E2%85%A8", "I%C2%ADV", &uri); _try_auth_from_uri(pooled, uri, MONGOC_TEST_NO_ERROR); mongoc_uri_destroy(uri); /* Way 3: with username/password setters. */ _try_auth(pooled, "IX", "IX", NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, "IX", ROMAN_NUMERAL_NINE, NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, ROMAN_NUMERAL_NINE, "IV", NULL, MONGOC_TEST_NO_ERROR); _try_auth(pooled, ROMAN_NUMERAL_NINE, ROMAN_NUMERAL_FOUR, NULL, MONGOC_TEST_NO_ERROR); } static void test_mongoc_saslprep_auth(void *ctx) { BSON_UNUSED(ctx); _clear_saslprep_users(); _create_saslprep_users(); _test_mongoc_scram_saslprep_auth(false); _test_mongoc_scram_saslprep_auth(true); _drop_saslprep_users(); } // `test_mongoc_scram_empty_password` is a regression test for CDRIVER-5550. static void test_mongoc_scram_empty_password(void *ctx) { BSON_UNUSED(ctx); char *user = test_framework_get_admin_user(); char *uri_str = test_framework_get_uri_str_no_auth("admin"); mongoc_uri_t *uri = mongoc_uri_new(uri_str); mongoc_uri_set_username(uri, user); // Expect an auth failure (not a crash): _try_auth_from_uri(false /* pooled */, uri, MONGOC_TEST_AUTH_ERROR); _try_auth_from_uri(true /* pooled */, uri, MONGOC_TEST_AUTH_ERROR); mongoc_uri_destroy(uri); bson_free(uri_str); bson_free(user); } void test_scram_install(TestSuite *suite) { #ifdef MONGOC_ENABLE_SSL TestSuite_Add(suite, "/scram/username_not_set", test_mongoc_scram_step_username_not_set); TestSuite_Add(suite, "/scram/sasl_prep", test_mongoc_scram_sasl_prep); TestSuite_Add(suite, "/scram/iteration_count", test_mongoc_scram_iteration_count); TestSuite_Add(suite, "/scram/utf8_char_length", test_mongoc_utf8_char_length); TestSuite_Add(suite, "/scram/utf8_string_length", test_mongoc_utf8_string_length); TestSuite_Add(suite, "/scram/utf8_to_unicode", test_mongoc_utf8_to_unicode); #endif TestSuite_AddFull(suite, "/scram/cache_invalidation [lock:live-server]", test_mongoc_scram_cache_invalidation, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_macos); // CDRIVER-6079 TestSuite_AddFull(suite, "/scram/auth_tests [lock:live-server]", test_mongoc_scram_auth, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_auth, _skip_if_no_sha256, TestSuite_CheckLive); TestSuite_AddFull(suite, "/scram/saslprep_auth [lock:live-server]", test_mongoc_saslprep_auth, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_auth, _skip_if_no_sha256, TestSuite_CheckLive); TestSuite_AddFull(suite, "/scram/empty_password [lock:live-server]", test_mongoc_scram_empty_password, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_no_auth, _skip_if_no_sha256, TestSuite_CheckLive); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-sdam-monitoring.c000066400000000000000000001412751511661753600260030ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif typedef struct { bson_t events; uint32_t n_events; mongoc_array_t heartbeat_succeeded_durations; mongoc_array_t heartbeat_failed_durations; bson_oid_t topology_id; } context_t; static void check_json_sdam_events(const bson_t *events, const bson_t *expectations) { uint32_t expected_keys; uint32_t actual_keys; match_ctx_t match_ctx = {{0}}; expected_keys = bson_count_keys(expectations); actual_keys = bson_count_keys(events); if (expected_keys != actual_keys) { test_error("SDAM test failed expectations:\n\n" "expected\n%s\n\n" "actual:\n%s\n\n" "expected %" PRIu32 " events, got %" PRIu32, bson_as_canonical_extended_json(expectations, NULL), bson_as_canonical_extended_json(events, NULL), expected_keys, actual_keys); } if (!match_bson_with_ctx(events, expectations, &match_ctx)) { test_error("SDAM test failed expectations:\n\n" "expected\n%s\n\n" "actual:\n%s\n\n%s", bson_as_canonical_extended_json(expectations, NULL), bson_as_canonical_extended_json(events, NULL), match_ctx.errmsg); } } static void context_init(context_t *context) { bson_init(&context->events); context->n_events = 0; _mongoc_array_init(&context->heartbeat_succeeded_durations, sizeof(int64_t)); _mongoc_array_init(&context->heartbeat_failed_durations, sizeof(int64_t)); bson_oid_init_from_string(&context->topology_id, "000000000000000000000000"); } static void context_append(context_t *context, bson_t *event) { char str[16]; const char *key; bson_uint32_to_string(context->n_events, &key, str, sizeof str); BSON_APPEND_DOCUMENT(&context->events, key, event); context->n_events++; bson_destroy(event); } static void context_destroy(context_t *context) { bson_destroy(&context->events); _mongoc_array_destroy(&context->heartbeat_succeeded_durations); _mongoc_array_destroy(&context->heartbeat_failed_durations); } static void append_array(bson_t *bson, const char *key, const bson_t *array) { if (array->len) { BSON_APPEND_ARRAY(bson, key, array); } else { bson_t tmp = BSON_INITIALIZER; BSON_APPEND_ARRAY(bson, key, &tmp); bson_destroy(&tmp); } } static void sd_to_bson(const mongoc_server_description_t *sd, bson_t *bson) { const mongoc_host_list_t *host_list; host_list = mongoc_server_description_host(sd); bson_init(bson); BSON_APPEND_UTF8(bson, "address", host_list->host_and_port); append_array(bson, "arbiters", &sd->arbiters); append_array(bson, "hosts", &sd->hosts); append_array(bson, "passives", &sd->passives); if (sd->current_primary) { BSON_APPEND_UTF8(bson, "primary", sd->current_primary); } if (sd->set_name) { BSON_APPEND_UTF8(bson, "setName", sd->set_name); } BSON_APPEND_UTF8(bson, "type", mongoc_server_description_type(sd)); } static void td_to_bson(const mongoc_topology_description_t *td, bson_t *bson) { bson_t servers = BSON_INITIALIZER; bson_t server; char str[16]; const char *key; mongoc_set_t const *servers_set = mc_tpld_servers_const(td); for (size_t i = 0; i < servers_set->items_len; i++) { BSON_ASSERT(mlib_in_range(uint32_t, i)); bson_uint32_to_string((uint32_t)i, &key, str, sizeof str); sd_to_bson(mongoc_set_get_item_const(servers_set, i), &server); BSON_APPEND_DOCUMENT(&servers, key, &server); bson_destroy(&server); } bson_init(bson); BSON_APPEND_UTF8(bson, "topologyType", mongoc_topology_description_type(td)); if (td->set_name) { BSON_APPEND_UTF8(bson, "setName", td->set_name); } BSON_APPEND_ARRAY(bson, "servers", &servers); bson_destroy(&servers); } static void server_changed(const mongoc_apm_server_changed_t *event) { context_t *ctx; bson_oid_t topology_id; const char *host_and_port; bson_t prev_sd; bson_t new_sd; ctx = (context_t *)mongoc_apm_server_changed_get_context(event); /* check topology id is consistent */ mongoc_apm_server_changed_get_topology_id(event, &topology_id); ASSERT(bson_oid_equal(&topology_id, &ctx->topology_id)); host_and_port = mongoc_apm_server_changed_get_host(event)->host_and_port; sd_to_bson(mongoc_apm_server_changed_get_previous_description(event), &prev_sd); sd_to_bson(mongoc_apm_server_changed_get_new_description(event), &new_sd); context_append(ctx, BCON_NEW("server_description_changed_event", "{", "topologyId", BCON_UTF8("42"), "address", BCON_UTF8(host_and_port), "previousDescription", BCON_DOCUMENT(&prev_sd), "newDescription", BCON_DOCUMENT(&new_sd), "}")); bson_destroy(&prev_sd); bson_destroy(&new_sd); } static void server_opening(const mongoc_apm_server_opening_t *event) { context_t *ctx; bson_oid_t topology_id; const char *host_and_port; ctx = (context_t *)mongoc_apm_server_opening_get_context(event); mongoc_apm_server_opening_get_topology_id(event, &topology_id); ASSERT(bson_oid_equal(&topology_id, &ctx->topology_id)); host_and_port = mongoc_apm_server_opening_get_host(event)->host_and_port; context_append( ctx, BCON_NEW("server_opening_event", "{", "address", BCON_UTF8(host_and_port), "topologyId", BCON_UTF8("42"), "}")); } static void server_closed(const mongoc_apm_server_closed_t *event) { context_t *ctx; bson_oid_t topology_id; const char *host_and_port; ctx = (context_t *)mongoc_apm_server_closed_get_context(event); mongoc_apm_server_closed_get_topology_id(event, &topology_id); ASSERT(bson_oid_equal(&topology_id, &ctx->topology_id)); host_and_port = mongoc_apm_server_closed_get_host(event)->host_and_port; context_append( ctx, BCON_NEW("server_closed_event", "{", "address", BCON_UTF8(host_and_port), "topologyId", BCON_UTF8("42"), "}")); } static void topology_changed(const mongoc_apm_topology_changed_t *event) { context_t *ctx; bson_oid_t topology_id; bson_t prev_td; bson_t new_td; ctx = (context_t *)mongoc_apm_topology_changed_get_context(event); mongoc_apm_topology_changed_get_topology_id(event, &topology_id); ASSERT(bson_oid_equal(&topology_id, &ctx->topology_id)); td_to_bson(mongoc_apm_topology_changed_get_previous_description(event), &prev_td); td_to_bson(mongoc_apm_topology_changed_get_new_description(event), &new_td); context_append(ctx, BCON_NEW("topology_description_changed_event", "{", "newDescription", BCON_DOCUMENT(&new_td), "previousDescription", BCON_DOCUMENT(&prev_td), "topologyId", BCON_UTF8("42"), "}")); bson_destroy(&prev_td); bson_destroy(&new_td); } static void topology_opening(const mongoc_apm_topology_opening_t *event) { context_t *ctx; bson_oid_t zeroes; /* new event's topology id is NOT all zeroes */ bson_oid_init_from_string(&zeroes, "000000000000000000000000"); ASSERT(!bson_oid_equal(&event->topology_id, &zeroes)); ctx = (context_t *)mongoc_apm_topology_opening_get_context(event); mongoc_apm_topology_opening_get_topology_id(event, &ctx->topology_id); context_append(ctx, BCON_NEW("topology_opening_event", "{", "topologyId", BCON_UTF8("42"), "}")); } static void topology_closed(const mongoc_apm_topology_closed_t *event) { context_t *ctx; bson_oid_t topology_id; ctx = (context_t *)mongoc_apm_topology_closed_get_context(event); mongoc_apm_topology_closed_get_topology_id(event, &topology_id); ASSERT(bson_oid_equal(&topology_id, &ctx->topology_id)); context_append(ctx, BCON_NEW("topology_closed_event", "{", "topologyId", BCON_UTF8("42"), "}")); } /* no standard tests in the specs repo for heartbeat events, so invent some */ static void server_heartbeat_started(const mongoc_apm_server_heartbeat_started_t *event) { context_t *ctx; const mongoc_host_list_t *host; ctx = (context_t *)mongoc_apm_server_heartbeat_started_get_context(event); host = mongoc_apm_server_heartbeat_started_get_host(event); context_append(ctx, BCON_NEW("heartbeat_started_event", "{", "host", BCON_UTF8(host->host_and_port), "awaited", BCON_BOOL(mongoc_apm_server_heartbeat_started_get_awaited(event)), "}")); } static void server_heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { context_t *ctx; const mongoc_host_list_t *host; int64_t duration; ctx = (context_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); host = mongoc_apm_server_heartbeat_succeeded_get_host(event); context_append(ctx, BCON_NEW("heartbeat_succeeded_event", "{", "host", BCON_UTF8(host->host_and_port), "awaited", BCON_BOOL(mongoc_apm_server_heartbeat_succeeded_get_awaited(event)), "}")); duration = mongoc_apm_server_heartbeat_succeeded_get_duration(event); _mongoc_array_append_val(&ctx->heartbeat_succeeded_durations, duration); } static void server_heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *event) { context_t *ctx; const mongoc_host_list_t *host; int64_t duration; ctx = (context_t *)mongoc_apm_server_heartbeat_failed_get_context(event); host = mongoc_apm_server_heartbeat_failed_get_host(event); context_append(ctx, BCON_NEW("heartbeat_failed_event", "{", "host", BCON_UTF8(host->host_and_port), "awaited", BCON_BOOL(mongoc_apm_server_heartbeat_failed_get_awaited(event)), "}")); duration = mongoc_apm_server_heartbeat_failed_get_duration(event); _mongoc_array_append_val(&ctx->heartbeat_failed_durations, duration); } static mongoc_apm_callbacks_t * topology_event_callbacks(void) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_changed_cb(callbacks, server_changed); mongoc_apm_set_server_opening_cb(callbacks, server_opening); mongoc_apm_set_server_closed_cb(callbacks, server_closed); mongoc_apm_set_topology_changed_cb(callbacks, topology_changed); mongoc_apm_set_topology_opening_cb(callbacks, topology_opening); mongoc_apm_set_topology_closed_cb(callbacks, topology_closed); return callbacks; } static void client_set_topology_event_callbacks(mongoc_client_t *client, context_t *context) { mongoc_apm_callbacks_t *callbacks; ASSERT(client); callbacks = topology_event_callbacks(); mongoc_client_set_apm_callbacks(client, callbacks, (void *)context); mongoc_apm_callbacks_destroy(callbacks); } static void pool_set_topology_event_callbacks(mongoc_client_pool_t *pool, context_t *context) { mongoc_apm_callbacks_t *callbacks; ASSERT(pool); callbacks = topology_event_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, (void *)context); mongoc_apm_callbacks_destroy(callbacks); } static mongoc_apm_callbacks_t * heartbeat_event_callbacks(void) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_started_cb(callbacks, server_heartbeat_started); mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, server_heartbeat_succeeded); mongoc_apm_set_server_heartbeat_failed_cb(callbacks, server_heartbeat_failed); return callbacks; } static void client_set_heartbeat_event_callbacks(mongoc_client_t *client, context_t *context) { mongoc_apm_callbacks_t *callbacks; ASSERT(client); callbacks = heartbeat_event_callbacks(); mongoc_client_set_apm_callbacks(client, callbacks, (void *)context); mongoc_apm_callbacks_destroy(callbacks); } static void pool_set_heartbeat_event_callbacks(mongoc_client_pool_t *pool, context_t *context) { mongoc_apm_callbacks_t *callbacks; ASSERT(pool); callbacks = heartbeat_event_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, (void *)context); mongoc_apm_callbacks_destroy(callbacks); } /* *----------------------------------------------------------------------- * * Run the JSON tests from the SDAM Monitoring spec. * *----------------------------------------------------------------------- */ static void test_sdam_monitoring_cb(void *test_vp) { mongoc_client_t *client; mongoc_topology_t *topology; bson_t phase; bson_t phases; bson_t outcome; bson_iter_t phase_iter; bson_iter_t phase_field_iter; bson_iter_t outcome_iter; bson_iter_t iter; bson_t events_expected; context_t context; bool first_phase; BSON_ASSERT_PARAM(test_vp); const bson_t *const test = test_vp; /* parse out the uri and use it to create a client */ BSON_ASSERT(bson_iter_init_find(&iter, test, "uri")); client = test_framework_client_new(bson_iter_utf8(&iter, NULL), NULL); topology = client->topology; context_init(&context); client_set_topology_event_callbacks(client, &context); /* for each phase, parse and validate */ BSON_ASSERT(bson_iter_init_find(&iter, test, "phases")); bson_iter_bson(&iter, &phases); bson_iter_init(&phase_iter, &phases); first_phase = true; while (bson_iter_next(&phase_iter)) { bson_iter_bson(&phase_iter, &phase); if (first_phase) { /* Force the topology opening and server opening events. This test * doesn't exercise this code path naturally, see below in * _test_topology_events for a non-hacky test of this event */ mc_tpld_modification tdmod = mc_tpld_modify_begin(topology); _mongoc_topology_description_monitor_opening(tdmod.new_td, &topology->log_and_monitor); mc_tpld_modify_commit(tdmod); first_phase = false; } else { /* clear the stored events. */ bson_reinit(&context.events); context.n_events = 0; } process_sdam_test_hello_responses(&phase, client->topology); /* parse out "outcome" and validate */ BSON_ASSERT(bson_iter_init_find(&phase_field_iter, &phase, "outcome")); bson_iter_bson(&phase_field_iter, &outcome); bson_iter_init(&outcome_iter, &outcome); while (bson_iter_next(&outcome_iter)) { if (strcmp("events", bson_iter_key(&outcome_iter)) == 0) { bson_iter_bson(&outcome_iter, &events_expected); check_json_sdam_events(&context.events, &events_expected); } else { fprintf(stderr, "ERROR: unparsed test field %s\n", bson_iter_key(&outcome_iter)); BSON_ASSERT(false); } } } mongoc_client_destroy(client); context_destroy(&context); } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for SDAM Monitoring.. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/monitoring", &test_sdam_monitoring_cb); } static void _test_topology_events(bool pooled) { mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; context_t context; bool r; bson_error_t error; bson_iter_t events_iter; bson_iter_t event_iter; uint32_t i; context_init(&context); if (pooled) { pool = test_framework_new_default_client_pool(); pool_set_topology_event_callbacks(pool, &context); client = mongoc_client_pool_pop(pool); } else { client = test_framework_new_default_client(); client_set_topology_event_callbacks(client, &context); } r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } /* first event is topology opening */ bson_iter_init(&events_iter, &context.events); bson_iter_next(&events_iter); ASSERT(bson_iter_recurse(&events_iter, &event_iter)); ASSERT(bson_iter_find(&event_iter, "topology_opening_event")); /* last event is topology closed */ for (i = 1; i < context.n_events; i++) { ASSERT(bson_iter_next(&events_iter)); } ASSERT(bson_iter_recurse(&events_iter, &event_iter)); ASSERT(bson_iter_find(&event_iter, "topology_closed_event")); /* no more events */ ASSERT(!bson_iter_next(&events_iter)); context_destroy(&context); } static void test_topology_events_single(void) { _test_topology_events(false); } static void test_topology_events_pooled(void) { _test_topology_events(true); } static void test_topology_events_disabled(void) { mongoc_client_t *client; context_t context; bool r; bson_error_t error; bson_iter_t events_iter; bson_iter_t event_iter; uint32_t i; context_init(&context); client = test_framework_new_default_client(); client_set_topology_event_callbacks(client, &context); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); /* disable callbacks before destroying so we don't see a topology closed * event */ mongoc_client_set_apm_callbacks(client, NULL, NULL); mongoc_client_destroy(client); /* first event is topology opening */ bson_iter_init(&events_iter, &context.events); bson_iter_next(&events_iter); ASSERT(bson_iter_recurse(&events_iter, &event_iter)); ASSERT(bson_iter_find(&event_iter, "topology_opening_event")); /* move forward to the last event */ for (i = 1; i < context.n_events; i++) { ASSERT(bson_iter_next(&events_iter)); } /* verify we didn't receive a topology closed event */ ASSERT(bson_iter_recurse(&events_iter, &event_iter)); ASSERT(!bson_iter_find(&event_iter, "topology_closed_event")); /* no more events */ ASSERT(!bson_iter_next(&events_iter)); context_destroy(&context); } static bool responder(request_t *request, void *data) { BSON_UNUSED(data); if (!strcmp(request->command_name, "foo")) { reply_to_request_simple(request, "{'ok': 1}"); request_destroy(request); return true; } return false; } static void _test_heartbeat_events(bool pooled, bool succeeded) { context_t context; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; int64_t start; int64_t duration; future_t *future; request_t *request; char *expected_json; bson_error_t error; mongoc_array_t *durations; size_t i; context_init(&context); /* auto-respond to "foo" command */ server = mock_server_new(); mock_server_run(server); mock_server_autoresponds(server, responder, NULL, NULL); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 400); /* The start time should be before scanning is started (before the call to * mongoc_client_pool_pop for pooled) */ start = bson_get_monotonic_time(); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); pool_set_heartbeat_event_callbacks(pool, &context); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); client_set_heartbeat_event_callbacks(client, &context); } /* trigger "hello" handshake */ future = future_client_command_simple(client, "admin", tmp_bson("{'foo': 1}"), NULL, NULL, &error); /* topology scanner calls hello once */ request = mock_server_receives_any_hello(server); if (succeeded) { reply_to_request( request, MONGOC_REPLY_NONE, 0, 0, 1, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); } else { reply_to_request_with_hang_up(request); request_destroy(request); } /* pooled client opens new socket, handshakes it by calling hello again */ if (pooled && succeeded) { request = mock_server_receives_any_hello(server); reply_to_request( request, MONGOC_REPLY_NONE, 0, 0, 1, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); } if (succeeded) { /* "foo" command succeeds */ ASSERT_OR_PRINT(future_get_bool(future), error); } else { ASSERT(!future_get_bool(future)); } duration = bson_get_monotonic_time() - start; if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } /* even if pooled, only topology scanner sends events, so we get one pair */ if (succeeded) { durations = &context.heartbeat_succeeded_durations; expected_json = bson_strdup_printf("{'0': {'heartbeat_started_event': {'host': '%s', 'awaited': false}}," " '1': {'heartbeat_succeeded_event': {'host': '%s', 'awaited': " "false}}}", mock_server_get_host_and_port(server), mock_server_get_host_and_port(server)); } else { durations = &context.heartbeat_failed_durations; expected_json = bson_strdup_printf("{'0': {'heartbeat_started_event': {'host': '%s', 'awaited': false}}," " '1': {'heartbeat_failed_event': {'host': '%s', 'awaited': false}}}", mock_server_get_host_and_port(server), mock_server_get_host_and_port(server)); } ASSERT_CMPSIZE_T(durations->len, >, (size_t)0); for (i = 0; i < durations->len; i++) { int64_t d = _mongoc_array_index(durations, int64_t, i); ASSERT_CMPINT64(d, >=, (int64_t)0); ASSERT_CMPINT64(d, <=, duration); } check_json_sdam_events(&context.events, tmp_bson(expected_json)); future_destroy(future); bson_free(expected_json); mongoc_uri_destroy(uri); mock_server_destroy(server); context_destroy(&context); } static void test_heartbeat_events_single_succeeded(void) { _test_heartbeat_events(false, true); } static void test_heartbeat_events_pooled_succeeded(void) { _test_heartbeat_events(true, true); } static void test_heartbeat_events_single_failed(void) { _test_heartbeat_events(false, false); } static void test_heartbeat_events_pooled_failed(void) { _test_heartbeat_events(true, false); } static void _test_heartbeat_fails_dns(bool pooled) { context_t context; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; int64_t start; int64_t duration; bool r; bson_error_t error; mongoc_array_t *durations; size_t i; context_init(&context); /* Track time before scanning starts (which is triggered by popping the first * client for a client pool). */ start = bson_get_monotonic_time(); uri = mongoc_uri_new("mongodb://doesntexist.invalid/?serverSelectionTimeoutMS=100"); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); pool_set_heartbeat_event_callbacks(pool, &context); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); client_set_heartbeat_event_callbacks(client, &context); } /* trigger "hello" handshake */ r = mongoc_client_command_simple(client, "admin", tmp_bson("{'foo': 1}"), NULL, NULL, &error); /* Expect a server selection error. */ ASSERT(!r); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers found"); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } duration = bson_get_monotonic_time() - start; durations = &context.heartbeat_failed_durations; ASSERT_CMPSIZE_T(durations->len, >, (size_t)0); for (i = 0; i < durations->len; i++) { int64_t d = _mongoc_array_index(durations, int64_t, i); ASSERT_CMPINT64(d, >=, (int64_t)0); ASSERT_CMPINT64(d, <=, duration); } mongoc_uri_destroy(uri); context_destroy(&context); } static void test_heartbeat_fails_dns_single(void) { _test_heartbeat_fails_dns(false); } static void test_heartbeat_fails_dns_pooled(void) { _test_heartbeat_fails_dns(true); } typedef struct { uint32_t num_server_description_changed_events; uint32_t num_topology_description_changed_events; } duplicates_counter_t; void duplicates_server_changed(const mongoc_apm_server_changed_t *event) { duplicates_counter_t *counters; counters = mongoc_apm_server_changed_get_context(event); counters->num_server_description_changed_events++; } void duplicates_topology_changed(const mongoc_apm_topology_changed_t *event) { duplicates_counter_t *counters; counters = mongoc_apm_topology_changed_get_context(event); counters->num_topology_description_changed_events++; } /* Test that duplicate hello responses do not trigger two server * description changed events or topology changed events */ static void test_no_duplicates(void) { mock_server_t *server; mongoc_client_pool_t *pool; mongoc_client_t *client; request_t *request; bson_error_t error; future_t *future; mongoc_uri_t *uri; mongoc_apm_callbacks_t *callbacks; duplicates_counter_t duplicates_counter = {0}; mongoc_server_description_t *sd; server = mock_server_new(); mock_server_run(server); callbacks = mongoc_apm_callbacks_new(); /* Set a high heartbeat frequency ms to prevent periodic background scanning * from interfering. */ uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 99999); pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_apm_set_server_changed_cb(callbacks, duplicates_server_changed); mongoc_apm_set_topology_changed_cb(callbacks, duplicates_topology_changed); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &duplicates_counter); client = mongoc_client_pool_pop(pool); /* Topology scanning thread starts, and sends a hello. */ request = mock_server_receives_any_hello(server); reply_to_request_simple(request, tmp_str("{'ok': 1.0," " 'isWritablePrimary': true, " " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); request_destroy(request); /* Perform a ping, which creates a new connection, which performs the * hello handshake before sending the ping command. */ future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_any_hello(server); reply_to_request_simple(request, tmp_str("{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'lastWrite': {" " 'lastWriteDate': {'$date': {'$numberLong': '123'}}, 'opTime': 2}}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); ASSERT_CMPINT(duplicates_counter.num_server_description_changed_events, ==, 1); /* There should be two topology changed events. One for the initial topology * (where the server is set to Unknown), and one for the first hello (but * not the second) */ ASSERT_CMPINT(duplicates_counter.num_topology_description_changed_events, ==, 2); /* Even though no topology description changed event was emitted, the newly * created server description should still overwrite the old one in the * topology description. It differs in that it has the 'lastWrite' field, * which does not have an effect in equality comparison. */ sd = mongoc_client_get_server_description(client, 1); BSON_ASSERT(bson_has_field(&sd->last_hello_response, "lastWrite")); mongoc_server_description_destroy(sd); mongoc_uri_destroy(uri); mongoc_apm_callbacks_destroy(callbacks); mock_server_destroy(server); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static const char *SERVER_HEARTBEAT_STARTED = "started"; static const char *SERVER_HEARTBEAT_SUCCEEDED = "succeeded"; static const char *SERVER_HEARTBEAT_FAILED = "failed"; typedef struct { bool awaited; const char *type; } smm_event_t; // `smm_t` is a test fixture for serverMonitoringMode tests #define MAX_EVENTS 3 typedef struct { bson_mutex_t lock; smm_event_t events[MAX_EVENTS]; size_t events_len; mongoc_client_pool_t *pool; } smm_t; static void handle_heartbeat_event(smm_t *t, bool awaited, const char *event_type) { bson_mutex_lock(&t->lock); // Store the most recent awaited value (if room) if (t->events_len < MAX_EVENTS) { smm_event_t new_event; new_event.awaited = awaited; new_event.type = event_type; t->events[t->events_len] = new_event; t->events_len++; } bson_mutex_unlock(&t->lock); } static void heartbeat_started(const mongoc_apm_server_heartbeat_started_t *event) { smm_t *t = mongoc_apm_server_heartbeat_started_get_context(event); bool awaited = mongoc_apm_server_heartbeat_started_get_awaited(event); handle_heartbeat_event(t, awaited, SERVER_HEARTBEAT_STARTED); } static void heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { smm_t *t = mongoc_apm_server_heartbeat_succeeded_get_context(event); bool awaited = mongoc_apm_server_heartbeat_succeeded_get_awaited(event); handle_heartbeat_event(t, awaited, SERVER_HEARTBEAT_SUCCEEDED); } static void heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *event) { smm_t *t = mongoc_apm_server_heartbeat_failed_get_context(event); bool awaited = mongoc_apm_server_heartbeat_failed_get_awaited(event); handle_heartbeat_event(t, awaited, SERVER_HEARTBEAT_FAILED); } static smm_t * smm_new(const char *mode) { smm_t *t = bson_malloc0(sizeof(smm_t)); bson_mutex_init(&t->lock); // Create client pool { mongoc_uri_t *uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); // To speed up test. mongoc_uri_set_server_monitoring_mode(uri, mode); t->pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(t->pool); mongoc_uri_destroy(uri); } // Capture heartbeat events { mongoc_apm_callbacks_t *cbs = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_started_cb(cbs, heartbeat_started); mongoc_apm_set_server_heartbeat_succeeded_cb(cbs, heartbeat_succeeded); mongoc_apm_set_server_heartbeat_failed_cb(cbs, heartbeat_failed); mongoc_client_pool_set_apm_callbacks(t->pool, cbs, t); mongoc_apm_callbacks_destroy(cbs); } // Pop and push a client to start monitoring { mongoc_client_t *client = mongoc_client_pool_pop(t->pool); mongoc_client_pool_push(t->pool, client); } return t; } // `smm_wait` waits for `count` heartbeat events. static bool smm_wait(smm_t *t, size_t count) { const mlib_timer deadline = mlib_expires_after(10, s); while (true) { bson_mutex_lock(&t->lock); if (t->events_len >= count) { bson_mutex_unlock(&t->lock); return true; } bson_mutex_unlock(&t->lock); // Timeout if (mlib_timer_is_expired(deadline)) { break; } mlib_sleep_for(500, ms); } return false; } #define smm_assert(t, stream) \ if (1) { \ bson_mutex_lock(&t->lock); \ \ /* First two events should always be a non-awaited heartbeat started and succeeded */ \ ASSERT_CMPSIZE_T(t->events_len, ==, 3); \ ASSERT_CMPSTR(t->events[0].type, SERVER_HEARTBEAT_STARTED); \ ASSERT(!t->events[0].awaited); \ ASSERT_CMPSTR(t->events[1].type, SERVER_HEARTBEAT_SUCCEEDED); \ ASSERT(!t->events[1].awaited); \ ASSERT_CMPSTR(t->events[2].type, SERVER_HEARTBEAT_STARTED); \ ASSERT(stream == t->events[2].awaited); /* check for stream or pool */ \ bson_mutex_unlock(&t->lock); \ } else \ (void)0 static void smm_destroy(smm_t *t) { if (!t) { return; } mongoc_client_pool_destroy(t->pool); bson_mutex_destroy(&t->lock); bson_free(t); } // `test_serverMonitoringMode` implements spec tests from serverMonitoringMode.yml // The spec test needs a client pool for stream monitoring. The unified test runner only uses single-threaded // clients. static void test_serverMonitoringMode(void) { if (test_framework_is_replset()) { printf("Test is skipped. SDAM events are non-deterministic when monitoring multiple servers."); return; } smm_t *t = NULL; mongoc_handshake_t *md = _mongoc_handshake_get(); if (test_framework_get_server_version() >= test_framework_str_to_version("4.4.0")) { printf("'connect with serverMonitoringMode=auto >=4.4' ... begin\n"); t = smm_new("auto"); ASSERT(smm_wait(t, 3)); smm_assert(t, true); smm_destroy(t); printf("'connect with serverMonitoringMode=auto >=4.4' ... end\n"); printf("'connect with serverMonitoringMode=stream >=4.4' ... begin\n"); t = smm_new("stream"); ASSERT(smm_wait(t, 3)); smm_assert(t, true); smm_destroy(t); printf("'connect with serverMonitoringMode=stream >=4.4' ... end\n"); // Additional tests checking behavior when in a FAAS env mongoc_handshake_env_t prev_env = md->env; md->env = MONGOC_HANDSHAKE_ENV_AWS; printf("'connect with serverMonitoringMode=auto >=4.4 and in FAAS env' ... begin\n"); t = smm_new("auto"); ASSERT(smm_wait(t, 3)); smm_assert(t, false); smm_destroy(t); printf("'connect with serverMonitoringMode=auto >=4.4 and in FAAS env' ... end\n"); printf("'connect with serverMonitoringMode=stream >=4.4 and in FAAS env' ... begin\n"); t = smm_new("stream"); ASSERT(smm_wait(t, 3)); smm_assert(t, true); smm_destroy(t); printf("'connect with serverMonitoringMode=stream >=4.4 and in FAAS env' ... end\n"); md->env = prev_env; } if (test_framework_get_server_version() <= test_framework_str_to_version("4.2.99")) { printf("'connect with serverMonitoringMode=auto <4.4' ... begin\n"); t = smm_new("auto"); ASSERT(smm_wait(t, 3)); smm_assert(t, false); smm_destroy(t); printf("'connect with serverMonitoringMode=auto <4.4' ... end\n"); printf("'connect with serverMonitoringMode=stream <4.4' ... begin\n"); t = smm_new("stream"); ASSERT(smm_wait(t, 3)); smm_assert(t, false); smm_destroy(t); printf("'connect with serverMonitoringMode=stream <4.4' ... end\n"); } printf("'connect with serverMonitoringMode=poll' ... begin\n"); t = smm_new("poll"); ASSERT(smm_wait(t, 3)); smm_assert(t, false); smm_destroy(t); printf("'connect with serverMonitoringMode=poll' ... end\n"); } static mongoc_uri_t * _make_uri_with_fast_heartbeat_frequency(void) { mongoc_uri_t *const uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS); return uri; } static bson_t * _extract_cluster_time(const bson_t *doc) { bson_iter_t iter; if (!bson_iter_init_find(&iter, doc, "$clusterTime")) { return NULL; } ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); bson_t result; bson_iter_bson(&iter, &result); return bson_copy(&result); } static bson_t * _ping_then_get_cluster_time(mongoc_client_t *client) { bson_t *const ping = BCON_NEW("ping", BCON_INT32(1)); bson_t reply; bson_error_t error; ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", ping, NULL, &reply, &error), error); bson_t *const cluster_time = _extract_cluster_time(&reply); ASSERT(cluster_time); bson_destroy(&reply); bson_destroy(ping); return cluster_time; } typedef struct { mongoc_cond_t heartbeat_cond; bson_mutex_t heartbeat_mutex; size_t n_heartbeat_started; size_t n_heartbeat_succeeded; bson_t cluster_time_latest; } heartbeat_no_cluster_time_context_t; static void _heartbeat_no_cluster_time_context_init(heartbeat_no_cluster_time_context_t *context) { memset(context, 0, sizeof(heartbeat_no_cluster_time_context_t)); mongoc_cond_init(&context->heartbeat_cond); bson_mutex_init(&context->heartbeat_mutex); bson_init(&context->cluster_time_latest); } static void _heartbeat_no_cluster_time_context_destroy(heartbeat_no_cluster_time_context_t *context) { bson_destroy(&context->cluster_time_latest); bson_mutex_destroy(&context->heartbeat_mutex); mongoc_cond_destroy(&context->heartbeat_cond); } static void _heartbeat_no_cluster_time_heartbeat_started(const mongoc_apm_server_heartbeat_started_t *event) { heartbeat_no_cluster_time_context_t *const context = (heartbeat_no_cluster_time_context_t *)mongoc_apm_server_heartbeat_started_get_context(event); bson_mutex_lock(&context->heartbeat_mutex); ++context->n_heartbeat_started; bson_mutex_unlock(&context->heartbeat_mutex); mongoc_cond_signal(&context->heartbeat_cond); } static void _heartbeat_no_cluster_time_heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { heartbeat_no_cluster_time_context_t *const context = (heartbeat_no_cluster_time_context_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); bson_mutex_lock(&context->heartbeat_mutex); ++context->n_heartbeat_succeeded; bson_mutex_unlock(&context->heartbeat_mutex); mongoc_cond_signal(&context->heartbeat_cond); } static void _heartbeat_no_cluster_time_command_started(const mongoc_apm_command_started_t *event) { heartbeat_no_cluster_time_context_t *const context = (heartbeat_no_cluster_time_context_t *)mongoc_apm_command_started_get_context(event); bson_t *const cluster_time = _extract_cluster_time(mongoc_apm_command_started_get_command(event)); if (!cluster_time) { return; } bson_destroy(&context->cluster_time_latest); bson_copy_to(cluster_time, &context->cluster_time_latest); bson_destroy(cluster_time); } static mongoc_apm_callbacks_t * _heartbeat_no_cluster_time_make_apm_callbacks(void) { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_started_cb(callbacks, _heartbeat_no_cluster_time_heartbeat_started); mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, _heartbeat_no_cluster_time_heartbeat_succeeded); mongoc_apm_set_command_started_cb(callbacks, _heartbeat_no_cluster_time_command_started); return callbacks; } static void _advance_cluster_time_on_new_client(void) { mongoc_client_t *const client = test_framework_new_default_client(); mongoc_collection_t *const coll = mongoc_client_get_collection(client, "test", "test"); bson_t *const doc = BCON_NEW("advance", "$clusterTime"); bson_error_t error; ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, doc, NULL, NULL, &error), error); bson_destroy(doc); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } // Driver Sessions Prose Test 20: Drivers do not gossip `$clusterTime` on SDAM commands (single threaded). static void test_heartbeat_no_cluster_time_single(void *ctx) { BSON_UNUSED(ctx); heartbeat_no_cluster_time_context_t context; mongoc_client_t *client = NULL; bson_error_t error; // Create a client with a fast heartbeat frequency. { mongoc_uri_t *const uri = _make_uri_with_fast_heartbeat_frequency(); client = test_framework_client_new_from_uri(uri, NULL); ASSERT(client); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); } { _heartbeat_no_cluster_time_context_init(&context); mongoc_apm_callbacks_t *const callbacks = _heartbeat_no_cluster_time_make_apm_callbacks(); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&context); mongoc_apm_callbacks_destroy(callbacks); } // Send a ping to record the initial cluster time. bson_t *const cluster_time_initial = _ping_then_get_cluster_time(client); // Advance the cluster time on another client. _advance_cluster_time_on_new_client(); // Send commands until we detect a heartbeat. { // We need to send a command in order to force a heartbeat. However, we do not want a reply as that may update // the client's cluster time, so we will use an unacknowledged write. mongoc_write_concern_t *const wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); bson_t *const opts = bson_new(); mongoc_write_concern_append(wc, opts); bson_t *const command = BCON_NEW("insert", "test"); // Sleep for the minimum heartbeat time to avoid sending more commands than necessary. mlib_sleep_for(MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS, ms); const size_t n_started_pre_heartbeat = context.n_heartbeat_started; const size_t n_succeeded_pre_heartbeat = context.n_heartbeat_succeeded; while (context.n_heartbeat_started <= n_started_pre_heartbeat || context.n_heartbeat_succeeded <= n_succeeded_pre_heartbeat) { ASSERT_OR_PRINT(mongoc_client_write_command_with_opts(client, "test", command, opts, NULL, &error), error); } bson_destroy(command); bson_destroy(opts); mongoc_write_concern_destroy(wc); } // Send a ping to record the most recent cluster time. { bson_t *const ping = BCON_NEW("ping", BCON_INT32(1)); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", ping, NULL, NULL, &error), error); bson_destroy(ping); } ASSERT_EQUAL_BSON(cluster_time_initial, &context.cluster_time_latest); bson_destroy(cluster_time_initial); mongoc_client_destroy(client); _heartbeat_no_cluster_time_context_destroy(&context); } // Driver Sessions Prose Test 20: Drivers do not gossip `$clusterTime` on SDAM commands (pooled). static void test_heartbeat_no_cluster_time_pooled(void *ctx) { BSON_UNUSED(ctx); heartbeat_no_cluster_time_context_t context; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client = NULL; bson_error_t error; // Create a pool with a fast heartbeat frequency { mongoc_uri_t *const uri = _make_uri_with_fast_heartbeat_frequency(); pool = test_framework_client_pool_new_from_uri(uri, NULL); ASSERT(pool); test_framework_set_pool_ssl_opts(pool); mongoc_uri_destroy(uri); } { _heartbeat_no_cluster_time_context_init(&context); mongoc_apm_callbacks_t *const callbacks = _heartbeat_no_cluster_time_make_apm_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &context); mongoc_apm_callbacks_destroy(callbacks); } client = mongoc_client_pool_pop(pool); bson_t *const cluster_time_initial = _ping_then_get_cluster_time(client); // Advance the cluster time on another client. _advance_cluster_time_on_new_client(); // Wait until we detect one full heartbeat. { bson_mutex_lock(&context.heartbeat_mutex); const size_t n_started_pre_heartbeat = context.n_heartbeat_started; while (context.n_heartbeat_started <= n_started_pre_heartbeat) { mongoc_cond_wait(&context.heartbeat_cond, &context.heartbeat_mutex); } const size_t n_succeeded_pre_heartbeat = context.n_heartbeat_succeeded; while (context.n_heartbeat_succeeded <= n_succeeded_pre_heartbeat) { mongoc_cond_wait(&context.heartbeat_cond, &context.heartbeat_mutex); } bson_mutex_unlock(&context.heartbeat_mutex); } // Send another ping to record the most recent cluster time. { bson_t *const ping = BCON_NEW("ping", BCON_INT32(1)); ASSERT_OR_PRINT(mongoc_client_command_simple(client, "admin", ping, NULL, NULL, &error), error); bson_destroy(ping); } ASSERT_EQUAL_BSON(cluster_time_initial, &context.cluster_time_latest); bson_destroy(cluster_time_initial); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); _heartbeat_no_cluster_time_context_destroy(&context); } void test_sdam_monitoring_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddLive(suite, "/server_discovery_and_monitoring/monitoring/topology/single", test_topology_events_single); TestSuite_AddLive(suite, "/server_discovery_and_monitoring/monitoring/topology/pooled", test_topology_events_pooled); TestSuite_AddLive( suite, "/server_discovery_and_monitoring/monitoring/topology/disabled", test_topology_events_disabled); TestSuite_AddMockServerTest(suite, "/server_discovery_and_monitoring/monitoring/heartbeat/single/succeeded", test_heartbeat_events_single_succeeded); TestSuite_AddMockServerTest(suite, "/server_discovery_and_monitoring/monitoring/heartbeat/single/failed", test_heartbeat_events_single_failed); TestSuite_AddMockServerTest(suite, "/server_discovery_and_monitoring/monitoring/heartbeat/pooled/succeeded", test_heartbeat_events_pooled_succeeded); TestSuite_AddMockServerTest(suite, "/server_discovery_and_monitoring/monitoring/heartbeat/pooled/failed", test_heartbeat_events_pooled_failed); TestSuite_Add( suite, "/server_discovery_and_monitoring/monitoring/heartbeat/single/dns", test_heartbeat_fails_dns_single); TestSuite_Add( suite, "/server_discovery_and_monitoring/monitoring/heartbeat/pooled/dns", test_heartbeat_fails_dns_pooled); TestSuite_AddMockServerTest( suite, "/server_discovery_and_monitoring/monitoring/no_duplicates", test_no_duplicates, NULL, NULL); TestSuite_AddLive( suite, "/server_discovery_and_monitoring/monitoring/serverMonitoringMode", test_serverMonitoringMode); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/monitoring/no_cluster_time/single", test_heartbeat_no_cluster_time_single, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_no_cluster_time); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/monitoring/no_cluster_time/pooled", test_heartbeat_no_cluster_time_pooled, NULL, NULL, TestSuite_CheckLive, test_framework_skip_if_no_cluster_time); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-sdam.c000066400000000000000000001127341511661753600236160ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #ifdef BSON_HAVE_STRINGS_H #include #endif #undef min // Used as a time unit suffix static void _topology_has_description(const mongoc_topology_description_t *topology, bson_t *server, const char *address) { mongoc_server_description_t const *sd; bson_iter_t server_iter; const char *server_type; const char *set_name; sd = server_description_by_hostname(topology, address); BSON_ASSERT(sd); bson_iter_init(&server_iter, server); while (bson_iter_next(&server_iter)) { if (strcmp("setName", bson_iter_key(&server_iter)) == 0) { set_name = bson_iter_utf8(&server_iter, NULL); if (set_name) { BSON_ASSERT(sd->set_name); ASSERT_CMPSTR(sd->set_name, set_name); } /* TODO (CDRIVER-4057) this should assert that a null setName means the server description also has no setName. Uncomment this when CDRIVER-4057 is resolved: else if (sd->set_name) { test_error ("server: %s, expected NULL setName, got: %s", address, sd->set_name); } */ } else if (strcmp("type", bson_iter_key(&server_iter)) == 0) { server_type = bson_iter_utf8(&server_iter, NULL); if (sd->type != server_type_from_test(server_type)) { test_error("expected server type %s not %s", server_type, mongoc_server_description_type(sd)); } } else if (strcmp("setVersion", bson_iter_key(&server_iter)) == 0) { int64_t expected_set_version; if (BSON_ITER_HOLDS_NULL(&server_iter)) { expected_set_version = MONGOC_NO_SET_VERSION; } else { expected_set_version = bson_iter_as_int64(&server_iter); } BSON_ASSERT(sd->set_version == expected_set_version); } else if (strcmp("electionId", bson_iter_key(&server_iter)) == 0) { bson_oid_t expected_oid; if (BSON_ITER_HOLDS_NULL(&server_iter)) { bson_oid_init_from_string(&expected_oid, "000000000000000000000000"); } else { ASSERT(BSON_ITER_HOLDS_OID(&server_iter)); bson_oid_copy(bson_iter_oid(&server_iter), &expected_oid); } ASSERT_CMPOID(&sd->election_id, &expected_oid); } else if (strcmp("topologyVersion", bson_iter_key(&server_iter)) == 0) { bson_t expected_topology_version; if (BSON_ITER_HOLDS_NULL(&server_iter)) { bson_init(&expected_topology_version); } else { ASSERT(BSON_ITER_HOLDS_DOCUMENT(&server_iter)); bson_lookup_doc(server, "topologyVersion", &expected_topology_version); } assert_match_bson(&sd->topology_version, &expected_topology_version, false); bson_destroy(&expected_topology_version); } else if (strcmp("pool", bson_iter_key(&server_iter)) == 0) { bson_iter_t iter; uint32_t expected_generation; BSON_ASSERT(bson_iter_recurse(&server_iter, &iter)); BSON_ASSERT(bson_iter_find(&iter, "generation") && BSON_ITER_HOLDS_INT32(&iter)); expected_generation = bson_iter_int32(&iter); ASSERT_CMPINT32(expected_generation, ==, mc_tpl_sd_get_generation(sd, &kZeroObjectId)); } else if (strcmp("logicalSessionTimeoutMinutes", bson_iter_key(&server_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&server_iter)) { if (sd->session_timeout_minutes != MONGOC_NO_SESSIONS) { test_error("ERROR: expected unset value for " "logicalSessionTimeoutMinutes but got: %" PRId64, sd->session_timeout_minutes); } } else { ASSERT_CMPINT64(bson_iter_as_int64(&server_iter), ==, sd->session_timeout_minutes); } } else if (strcmp("minWireVersion", bson_iter_key(&server_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&server_iter)) { if (sd->min_wire_version != 0) { test_error("ERROR: expected unset value for minWireVersion but " "got: %" PRId32, sd->min_wire_version); } } else { ASSERT_CMPINT32(bson_iter_int32(&server_iter), ==, sd->min_wire_version); } } else if (strcmp("maxWireVersion", bson_iter_key(&server_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&server_iter)) { if (sd->max_wire_version != 0) { test_error("ERROR: expected unset value for maxWireVersion but " "got: %" PRId32, sd->max_wire_version); } } else { ASSERT_CMPINT32(bson_iter_int32(&server_iter), ==, sd->max_wire_version); } } else { fprintf(stderr, "ERROR: unparsed field %s\n", bson_iter_key(&server_iter)); BSON_ASSERT(0); } } } /* *----------------------------------------------------------------------- * * Run the JSON tests from the Server Discovery and Monitoring spec. * *----------------------------------------------------------------------- */ static void test_sdam_cb(void *test_vp) { mongoc_client_t *client; bson_t phase; bson_t phases; bson_t servers; bson_t server; bson_t outcome; bson_iter_t phase_iter; bson_iter_t phase_field_iter; bson_iter_t servers_iter; bson_iter_t outcome_iter; bson_iter_t iter; mc_tpld_modification tdmod; mc_shared_tpld td = MC_SHARED_TPLD_NULL; const char *set_name; const char *hostname; BSON_ASSERT_PARAM(test_vp); const bson_t *const test = test_vp; static const test_skip_t skips[] = { {.description = "Pre-4.2", .check_substring = true, .reason = "libmongoc does not support servers older than 4.2"}, {0} // NULL terminated. }; BSON_ASSERT(bson_iter_init_find(&iter, test, "description")); const char *description = bson_iter_utf8(&iter, NULL); if (test_should_be_skipped(skips, description)) { return; } /* parse out the uri and use it to create a client */ BSON_ASSERT(bson_iter_init_find(&iter, test, "uri")); client = test_framework_client_new(bson_iter_utf8(&iter, NULL), NULL); /* for each phase, parse and validate */ BSON_ASSERT(bson_iter_init_find(&iter, test, "phases")); bson_iter_bson(&iter, &phases); bson_iter_init(&phase_iter, &phases); /* LoadBalanced topologies change the server from Unknown to LoadBalancer * when SDAM monitoring begins. Force an opening, which would occur on the * first operation on the client. */ tdmod = mc_tpld_modify_begin(client->topology); _mongoc_topology_description_monitor_opening(tdmod.new_td, &client->topology->log_and_monitor); mc_tpld_modify_commit(tdmod); while (bson_iter_next(&phase_iter)) { bson_iter_bson(&phase_iter, &phase); process_sdam_test_hello_responses(&phase, client->topology); /* parse out "outcome" and validate */ BSON_ASSERT(bson_iter_init_find(&phase_field_iter, &phase, "outcome")); bson_iter_bson(&phase_field_iter, &outcome); bson_iter_init(&outcome_iter, &outcome); while (bson_iter_next(&outcome_iter)) { mc_tpld_renew_ref(&td, client->topology); if (strcmp("servers", bson_iter_key(&outcome_iter)) == 0) { bson_iter_bson(&outcome_iter, &servers); ASSERT_CMPSIZE_T(bson_count_keys(&servers), ==, mc_tpld_servers_const(td.ptr)->items_len); bson_iter_init(&servers_iter, &servers); /* for each server, ensure topology has a matching entry */ while (bson_iter_next(&servers_iter)) { hostname = bson_iter_key(&servers_iter); bson_iter_bson(&servers_iter, &server); _topology_has_description(td.ptr, &server, hostname); } } else if (strcmp("setName", bson_iter_key(&outcome_iter)) == 0) { set_name = bson_iter_utf8(&outcome_iter, NULL); if (set_name) { BSON_ASSERT(td.ptr->set_name); ASSERT_CMPSTR(td.ptr->set_name, set_name); } else { if (td.ptr->set_name) { test_error("expected NULL setName, got: %s", td.ptr->set_name); } } } else if (strcmp("topologyType", bson_iter_key(&outcome_iter)) == 0) { ASSERT_CMPSTR(mongoc_topology_description_type(td.ptr), bson_iter_utf8(&outcome_iter, NULL)); } else if (strcmp("logicalSessionTimeoutMinutes", bson_iter_key(&outcome_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&outcome_iter)) { ASSERT_CMPINT64(td.ptr->session_timeout_minutes, ==, (int64_t)MONGOC_NO_SESSIONS); } else { ASSERT_CMPINT64(td.ptr->session_timeout_minutes, ==, bson_iter_as_int64(&outcome_iter)); } } else if (strcmp("compatible", bson_iter_key(&outcome_iter)) == 0) { if (bson_iter_as_bool(&outcome_iter)) { ASSERT_CMPINT(0, ==, td.ptr->compatibility_error.domain); } else { ASSERT_ERROR_CONTAINS( td.ptr->compatibility_error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, ""); } } else if (strcmp("maxSetVersion", bson_iter_key(&outcome_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&outcome_iter)) { if (td.ptr->max_set_version != MONGOC_NO_SET_VERSION) { test_error("ERROR: expected unset value for maxSetVersion " "but got: %" PRId64, td.ptr->max_set_version); } } else { ASSERT_CMPINT64(bson_iter_as_int64(&outcome_iter), ==, td.ptr->max_set_version); } } else if (strcmp("maxElectionId", bson_iter_key(&outcome_iter)) == 0) { const bson_oid_t *expected_oid; bson_oid_t zeroed = {.bytes = {0}}; expected_oid = bson_iter_oid(&outcome_iter); if (expected_oid == NULL) { expected_oid = &zeroed; } if (!bson_oid_equal(expected_oid, &td.ptr->max_election_id)) { char expected_oid_str[25]; char actual_oid_str[25]; bson_oid_to_string(expected_oid, expected_oid_str); bson_oid_to_string(&td.ptr->max_election_id, actual_oid_str); test_error("ERROR: Expected topology description's " "maxElectionId to be %s, but was %s", expected_oid_str, actual_oid_str); } } else if (strcmp("logicalSessionTimeoutMinutes", bson_iter_key(&outcome_iter)) == 0) { if (BSON_ITER_HOLDS_NULL(&outcome_iter)) { if (td.ptr->session_timeout_minutes != MONGOC_NO_SESSIONS) { test_error("ERROR: expected unset value for " "logicalSessionTimeoutMinutes but got: %" PRId64, td.ptr->session_timeout_minutes); } } else { ASSERT_CMPINT64(bson_iter_as_int64(&outcome_iter), ==, td.ptr->session_timeout_minutes); } } else { fprintf(stderr, "ERROR: unparsed test field %s\n", bson_iter_key(&outcome_iter)); BSON_ASSERT(false); } } } mc_tpld_drop_ref(&td); mongoc_client_destroy(client); } /* Initialize a test context to run one SDAM integration test file. * * Do not use json_test_ctx_init to initialize a context. It sends commands to * check for sessions support. That interferes with failpoints set on hello. */ static void sdam_json_test_ctx_init(json_test_ctx_t *ctx, const json_test_config_t *config, mongoc_client_pool_t *pool) { const char *db_name; const char *coll_name; ASSERT(pool); memset(ctx, 0, sizeof(*ctx)); ctx->config = config; bson_init(&ctx->events); ctx->acknowledged = true; ctx->verbose = test_framework_getenv_bool("MONGOC_TEST_MONITORING_VERBOSE"); bson_init(&ctx->lsids[0]); bson_init(&ctx->lsids[1]); bson_mutex_init(&ctx->mutex); /* Pop a client, which starts topology scanning. */ ctx->client = mongoc_client_pool_pop(pool); ctx->test_framework_uri = mongoc_uri_copy(ctx->client->uri); db_name = bson_lookup_utf8(ctx->config->scenario, "database_name"); coll_name = bson_lookup_utf8(ctx->config->scenario, "collection_name"); ctx->db = mongoc_client_get_database(ctx->client, db_name); ctx->collection = mongoc_database_get_collection(ctx->db, coll_name); } static void sdam_json_test_ctx_cleanup(json_test_ctx_t *ctx) { mongoc_collection_destroy(ctx->collection); mongoc_database_destroy(ctx->db); bson_destroy(&ctx->lsids[0]); bson_destroy(&ctx->lsids[1]); bson_destroy(&ctx->events); mongoc_uri_destroy(ctx->test_framework_uri); bson_destroy(ctx->sent_lsids[0]); bson_destroy(ctx->sent_lsids[1]); bson_mutex_destroy(&ctx->mutex); } static bool sdam_integration_operation_cb(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { bson_t reply; bool res; res = json_test_operation(ctx, test, operation, ctx->collection, NULL, &reply); bson_destroy(&reply); return res; } /* Try to get a completely clean slate by disabling failpoints on all servers. */ static void deactivate_failpoints_on_all_servers(mongoc_client_t *client) { uint32_t server_id; const mongoc_set_t *servers; bson_t cmd; bson_error_t error; mc_shared_tpld td; ASSERT(client); bson_init(&cmd); BCON_APPEND(&cmd, "configureFailPoint", "failCommand", "mode", "off"); td = mc_tpld_take_ref(client->topology); servers = mc_tpld_servers_const(td.ptr); for (size_t i = 0u; i < servers->items_len; i++) { bool ret; server_id = servers->items[i].id; ret = mongoc_client_command_simple_with_server_id( client, "admin", &cmd, NULL /* read prefs */, server_id, NULL /* reply */, &error); if (!ret) { MONGOC_DEBUG("error disabling failpoint: %s", error.message); } } mc_tpld_drop_ref(&td); bson_destroy(&cmd); } static void run_one_integration_test(json_test_config_t *config, bson_t *test) { json_test_ctx_t ctx; json_test_ctx_t thread_ctx[2]; bson_error_t error; mongoc_client_pool_t *pool; mongoc_client_t *setup_client; const char *db_name; const char *coll_name; mongoc_uri_t *uri; MONGOC_DEBUG("running test: %s", bson_lookup_utf8(test, "description")); uri = test_framework_get_uri(); if (bson_has_field(test, "clientOptions")) { bson_t client_opts; bson_lookup_doc(test, "clientOptions", &client_opts); set_uri_opts_from_bson(uri, &client_opts); } db_name = bson_lookup_utf8(config->scenario, "database_name"); coll_name = bson_lookup_utf8(config->scenario, "collection_name"); /* SDAM integration tests require streamable hello support, which is only * available for a client pool. */ pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_client_pool_set_error_api(pool, MONGOC_ERROR_API_VERSION_2); test_framework_set_pool_ssl_opts(pool); setup_client = test_framework_new_default_client(); /* Disable failpoints that may have been enabled in a previous test run. */ deactivate_failpoints_on_all_servers(setup_client); mongoc_client_command_simple(setup_client, "admin", tmp_bson("{'killAllSessions': []}"), NULL, NULL, &error); insert_data(db_name, coll_name, config->scenario); if (bson_has_field(test, "failPoint")) { activate_fail_point(setup_client, 0, test, "failPoint"); } /* Listen for events before topology scanning starts. Some tests * check the result of the first hello command. But popping a client * starts topology scanning. */ set_apm_callbacks_pooled(&ctx, pool); sdam_json_test_ctx_init(&ctx, config, pool); /* Set up test contexts for worker threads, which may be used by tests that * have "startThread" operations. These get the same APM event callbacks, * which are protected with a mutex. */ sdam_json_test_ctx_init(&thread_ctx[0], config, pool); sdam_json_test_ctx_init(&thread_ctx[1], config, pool); ctx.worker_threads[0] = worker_thread_new(&thread_ctx[0]); ctx.worker_threads[1] = worker_thread_new(&thread_ctx[1]); json_test_operations(&ctx, test); if (bson_has_field(test, "expectations")) { bson_t expectations; bson_lookup_doc(test, "expectations", &expectations); check_json_apm_events(&ctx, &expectations); } if (bson_has_field(test, "outcome.collection")) { mongoc_collection_t *outcome_coll; outcome_coll = mongoc_client_get_collection( setup_client, mongoc_database_get_name(ctx.db), mongoc_collection_get_name(ctx.collection)); check_outcome_collection(outcome_coll, test); mongoc_collection_destroy(outcome_coll); } deactivate_failpoints_on_all_servers(setup_client); worker_thread_destroy(ctx.worker_threads[0]); worker_thread_destroy(ctx.worker_threads[1]); mongoc_client_pool_push(pool, ctx.client); mongoc_client_pool_push(pool, thread_ctx[0].client); mongoc_client_pool_push(pool, thread_ctx[1].client); /* Capture occasionally emitted "Couldn't end \"endSessions\"" messages. */ capture_logs(true); mongoc_client_pool_destroy(pool); mongoc_client_destroy(setup_client); capture_logs(false); sdam_json_test_ctx_cleanup(&ctx); sdam_json_test_ctx_cleanup(&thread_ctx[0]); sdam_json_test_ctx_cleanup(&thread_ctx[1]); mongoc_uri_destroy(uri); } static void test_sdam_integration_cb(void *scenario_vp) { json_test_config_t config = JSON_TEST_CONFIG_INIT; bson_iter_t tests_iter; BSON_ASSERT_PARAM(scenario_vp); const bson_t *const scenario = scenario_vp; config.run_operation_cb = sdam_integration_operation_cb; config.scenario = scenario; config.command_started_events_only = true; if (!check_scenario_version(scenario)) { return; } ASSERT(bson_iter_init_find(&tests_iter, scenario, "tests")); ASSERT(bson_iter_recurse(&tests_iter, &tests_iter)); while (bson_iter_next(&tests_iter)) { bson_t test; ASSERT(BSON_ITER_HOLDS_DOCUMENT(&tests_iter)); bson_iter_bson(&tests_iter, &test); run_one_integration_test(&config, &test); } } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for server discovery and monitoring.. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { /* Single */ install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/single", &test_sdam_cb); /* Replica set */ install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/rs", &test_sdam_cb); /* Sharded */ install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/sharded", &test_sdam_cb); install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/errors", &test_sdam_cb); /* Tests not in official Server Discovery And Monitoring Spec */ install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/supplemental", &test_sdam_cb); /* Integration tests. */ /* The integration tests configure retryable writes, which requires crypto. */ install_json_test_suite_with_check(suite, JSON_DIR, "server_discovery_and_monitoring/integration", &test_sdam_integration_cb, TestSuite_CheckLive, test_framework_skip_if_no_crypto, test_framework_skip_if_slow); install_json_test_suite(suite, JSON_DIR, "server_discovery_and_monitoring/load-balanced", &test_sdam_cb); } static void test_topology_discovery(void *ctx) { char *host_and_port; char *replset_name; char *uri_str; char *uri_str_auth; mongoc_client_t *client; mongoc_read_prefs_t *prefs; mongoc_server_description_t *sd_secondary; const mongoc_host_list_t *hl_secondary; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; bson_t reply; bson_error_t error; bool r; BSON_UNUSED(ctx); host_and_port = test_framework_get_host_and_port(); replset_name = test_framework_replset_name(); uri_str = test_framework_get_uri_str(); client = test_framework_client_new(uri_str, NULL); test_framework_set_ssl_opts(client); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); sd_secondary = mongoc_client_select_server(client, false, /* for reads */ prefs, &error); ASSERT_OR_PRINT(sd_secondary, error); hl_secondary = mongoc_server_description_host(sd_secondary); /* Scenario: given a replica set deployment with a secondary, where HOST is * the address of the secondary, create a MongoClient using * ``mongodb://HOST/?directConnection=false`` as the URI. * Attempt a write to a collection. * * Outcome: Verify that the write succeeded. */ bson_free(uri_str); uri_str = bson_strdup_printf("mongodb://%s/?directConnection=false", hl_secondary->host_and_port); uri_str_auth = test_framework_add_user_password_from_env(uri_str); mongoc_client_destroy(client); client = test_framework_client_new(uri_str_auth, NULL); test_framework_set_ssl_opts(client); collection = get_test_collection(client, "sdam_dc_test"); BSON_APPEND_UTF8(&doc, "hello", "world"); r = mongoc_collection_insert_one(collection, &doc, NULL, &reply, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT32(bson_lookup_int32(&reply, "insertedCount"), ==, 1); bson_destroy(&reply); bson_destroy(&doc); mongoc_server_description_destroy(sd_secondary); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_free(uri_str_auth); bson_free(uri_str); bson_free(replset_name); bson_free(host_and_port); } static void test_direct_connection(void *ctx) { char *host_and_port; char *replset_name; char *uri_str; char *uri_str_auth; mongoc_client_t *client; mongoc_read_prefs_t *prefs; mongoc_server_description_t *sd_secondary; const mongoc_host_list_t *hl_secondary; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; bson_t reply; bson_error_t error; bool r; BSON_UNUSED(ctx); host_and_port = test_framework_get_host_and_port(); replset_name = test_framework_replset_name(); uri_str = test_framework_get_uri_str(); client = test_framework_client_new(uri_str, NULL); test_framework_set_ssl_opts(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); sd_secondary = mongoc_client_select_server(client, false, /* for reads */ prefs, &error); ASSERT_OR_PRINT(sd_secondary, error); hl_secondary = mongoc_server_description_host(sd_secondary); /* Scenario: given a replica set deployment with a secondary, where HOST is * the address of the secondary, create a MongoClient using * ``mongodb://HOST/?directConnection=true`` as the URI. * Attempt a write to a collection. * * Outcome: Verify that the write failed with a NotPrimary error. */ bson_free(uri_str); uri_str = bson_strdup_printf("mongodb://%s/?directConnection=true", hl_secondary->host_and_port); uri_str_auth = test_framework_add_user_password_from_env(uri_str); mongoc_client_destroy(client); client = test_framework_client_new(uri_str_auth, NULL); test_framework_set_ssl_opts(client); collection = get_test_collection(client, "sdam_dc_test"); BSON_APPEND_UTF8(&doc, "hello", "world"); r = mongoc_collection_insert_one(collection, &doc, NULL, &reply, &error); ASSERT_OR_PRINT(!r, error); ASSERT(strstr(error.message, "not master") || strstr(error.message, "not primary")); bson_destroy(&reply); bson_destroy(&doc); mongoc_server_description_destroy(sd_secondary); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_free(uri_str_auth); bson_free(uri_str); bson_free(replset_name); bson_free(host_and_port); } static void test_existing_behavior(void *ctx) { char *host_and_port; char *replset_name; char *uri_str; char *uri_str_auth; mongoc_client_t *client; mongoc_read_prefs_t *prefs; mongoc_server_description_t *sd_secondary; const mongoc_host_list_t *hl_secondary; mongoc_collection_t *collection; bson_t doc = BSON_INITIALIZER; bson_t reply; bson_error_t error; bool r; BSON_UNUSED(ctx); host_and_port = test_framework_get_host_and_port(); replset_name = test_framework_replset_name(); uri_str = test_framework_get_uri_str(); client = test_framework_client_new(uri_str, NULL); test_framework_set_ssl_opts(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); sd_secondary = mongoc_client_select_server(client, false, /* for reads */ prefs, &error); ASSERT_OR_PRINT(sd_secondary, error); hl_secondary = mongoc_server_description_host(sd_secondary); /* Scenario: given a replica set deployment with a secondary, where HOST is * the address of the secondary, create a MongoClient using * ``mongodb://HOST/`` as the URI. * Attempt a write to a collection. * * Outcome: Verify that the write succeeded or failed depending on existing * driver behavior with respect to the starting topology. */ bson_free(uri_str); uri_str = bson_strdup_printf("mongodb://%s/", hl_secondary->host_and_port); uri_str_auth = test_framework_add_user_password_from_env(uri_str); mongoc_client_destroy(client); client = test_framework_client_new(uri_str_auth, NULL); test_framework_set_ssl_opts(client); collection = get_test_collection(client, "sdam_dc_test"); BSON_APPEND_UTF8(&doc, "hello", "world"); r = mongoc_collection_insert_one(collection, &doc, NULL, &reply, &error); ASSERT_OR_PRINT(!r, error); ASSERT(strstr(error.message, "not master") || strstr(error.message, "not primary")); bson_destroy(&reply); bson_destroy(&doc); mongoc_server_description_destroy(sd_secondary); mongoc_read_prefs_destroy(prefs); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_free(uri_str_auth); bson_free(uri_str); bson_free(replset_name); bson_free(host_and_port); } typedef struct { uint32_t n_heartbeat_succeeded; } prose_test_ctx_t; static void heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { prose_test_ctx_t *ctx; ctx = (prose_test_ctx_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); ctx->n_heartbeat_succeeded++; /* The reported duration may be 0 on Windows due to poor clock resolution. * bson_get_monotonic_time () uses GetTickCount64. MS docs say: * "GetTickCount64 function is limited to the resolution of the system timer, * which is typically in the range of 10 milliseconds to 16 milliseconds" */ #ifndef _WIN32 BSON_ASSERT(mongoc_apm_server_heartbeat_succeeded_get_duration(event) > 0); #endif } #define RTT_TEST_TIMEOUT mlib_duration(1, mn) #define RTT_TEST_INITIAL_SLEEP mlib_duration(2, s) #define RTT_TEST_TICK mlib_duration(10, ms) static void test_prose_rtt(void *unused) { /* Since this tests RTT tracking in the streaming protocol, this test * requires a client pool. */ mongoc_client_pool_t *pool; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_collection_t *coll; bson_error_t error; const bson_t *doc; mongoc_cursor_t *cursor; mongoc_apm_callbacks_t *callbacks; prose_test_ctx_t ctx; bson_t cmd; bool ret; bool satisfied; int64_t rtt = 0; BSON_UNUSED(unused); uri = test_framework_get_uri(); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_APPNAME, "streamingRttTest"); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, heartbeat_succeeded); pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); memset(&ctx, 0, sizeof(prose_test_ctx_t)); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &ctx); client = mongoc_client_pool_pop(pool); /* Run a find command for the server to be discovered. */ coll = get_test_collection(client, "streamingRttTest"); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); mongoc_cursor_next(cursor, &doc); /* Sleep for RTT_TEST_INITIAL_SLEEP_SEC seconds to allow multiple heartbeats * to succeed. */ mlib_sleep_for(RTT_TEST_INITIAL_SLEEP); /* Set a failpoint to make hello commands take longer. */ bson_init(&cmd); BCON_APPEND(&cmd, "configureFailPoint", "failCommand"); BCON_APPEND(&cmd, "mode", "{", "times", BCON_INT32(1000), "}"); BCON_APPEND(&cmd, "data", "{", "failCommands", "[", HANDSHAKE_CMD_LEGACY_HELLO, "hello", "]", "blockConnection", BCON_BOOL(true), "blockTimeMS", BCON_INT32(500), "appName", "streamingRttTest", "}"); ret = mongoc_client_command_simple(client, "admin", &cmd, NULL /* read prefs. */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); /* Wait for the server's RTT to exceed 250ms. If this does not happen for * RTT_TEST_TIMEOUT_SEC seconds, consider it a failure. */ satisfied = false; mlib_timer deadline = mlib_expires_after(RTT_TEST_TIMEOUT); while (!satisfied && !mlib_timer_is_expired(deadline)) { mongoc_server_description_t *sd; sd = mongoc_client_select_server(client, true, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); rtt = mongoc_server_description_round_trip_time(sd); if (rtt > 250) { satisfied = true; } mongoc_server_description_destroy(sd); mlib_sleep_for(RTT_TEST_TICK); } if (!satisfied) { test_error( "After %d seconds, the latest observed RTT was only %" PRId64, (int)mlib_seconds_count(RTT_TEST_TIMEOUT), rtt); } /* Disable the failpoint. */ bson_reinit(&cmd); BCON_APPEND(&cmd, "configureFailPoint", "failCommand"); BCON_APPEND(&cmd, "mode", "off"); ret = mongoc_client_command_simple(client, "admin", &cmd, NULL /* read prefs. */, NULL /* reply */, &error); ASSERT_OR_PRINT(ret, error); bson_destroy(&cmd); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mongoc_apm_callbacks_destroy(callbacks); /* Make this assertion after destroying the pool, to avoid reading while the * monitor thread is writing. */ BSON_ASSERT(ctx.n_heartbeat_succeeded > 0); } typedef enum prose_heartbeat_event_t { PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_STARTED = 1, PROSE_HEARTBEAT_EVENT_CLIENT_CONNECTED, PROSE_HEARTBEAT_EVENT_CLIENT_HELLO_RECEIVED, PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_FAILED, } prose_heartbeat_event_t; #define PROSE_HEARTBEAT_EVENTS_MAX 10 typedef struct prose_heartbeat_context_t { bson_mutex_t mutex; mongoc_cond_t cond; uint16_t listen_port; size_t num_events; prose_heartbeat_event_t events[PROSE_HEARTBEAT_EVENTS_MAX]; } prose_heartbeat_context_t; static void prose_heartbeat_context_append_event(prose_heartbeat_context_t *context, prose_heartbeat_event_t event) { bson_mutex_lock(&context->mutex); size_t num_events = context->num_events; ASSERT_CMPSIZE_T(num_events, <, PROSE_HEARTBEAT_EVENTS_MAX); context->events[num_events] = event; context->num_events = num_events + 1; bson_mutex_unlock(&context->mutex); } static BSON_THREAD_FUN(prose_heartbeat_thread, generic_context) { prose_heartbeat_context_t *context = (prose_heartbeat_context_t *)generic_context; mongoc_socket_t *listen_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(listen_sock); struct sockaddr_in server_addr = { .sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_LOOPBACK), .sin_port = htons(0), }; ASSERT_CMPINT(0, ==, mongoc_socket_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof server_addr)); mongoc_socklen_t sock_len = sizeof(server_addr); ASSERT_CMPINT(0, ==, mongoc_socket_getsockname(listen_sock, (struct sockaddr *)&server_addr, &sock_len)); ASSERT_CMPINT(0, ==, mongoc_socket_listen(listen_sock, 10)); bson_mutex_lock(&context->mutex); context->listen_port = ntohs(server_addr.sin_port); mongoc_cond_signal(&context->cond); bson_mutex_unlock(&context->mutex); mongoc_socket_t *conn_sock = mongoc_socket_accept(listen_sock, -1); BSON_ASSERT(conn_sock); prose_heartbeat_context_append_event(context, PROSE_HEARTBEAT_EVENT_CLIENT_CONNECTED); int64_t expire_at = bson_get_monotonic_time() + 10000000; uint8_t buf[1]; ASSERT_CMPINT(1, ==, mongoc_socket_recv(conn_sock, buf, sizeof buf, 0, expire_at)); prose_heartbeat_context_append_event(context, PROSE_HEARTBEAT_EVENT_CLIENT_HELLO_RECEIVED); mongoc_socket_destroy(conn_sock); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } static void prose_heartbeat_event_started(const mongoc_apm_server_heartbeat_started_t *event) { prose_heartbeat_context_t *context = (prose_heartbeat_context_t *)mongoc_apm_server_heartbeat_started_get_context(event); prose_heartbeat_context_append_event(context, PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_STARTED); } static void prose_heartbeat_event_failed(const mongoc_apm_server_heartbeat_failed_t *event) { prose_heartbeat_context_t *context = (prose_heartbeat_context_t *)mongoc_apm_server_heartbeat_failed_get_context(event); prose_heartbeat_context_append_event(context, PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_FAILED); } static void test_prose_heartbeat(void) { bson_thread_t thread; prose_heartbeat_context_t context = {.num_events = 0, .listen_port = 0}; bson_mutex_init(&context.mutex); mongoc_cond_init(&context.cond); BSON_ASSERT(0 == mcommon_thread_create(&thread, prose_heartbeat_thread, &context)); bson_mutex_lock(&context.mutex); uint16_t listen_port = context.listen_port; while (!listen_port) { mongoc_cond_wait(&context.cond, &context.mutex); listen_port = context.listen_port; } bson_mutex_unlock(&context.mutex); MONGOC_INFO("Mock server listening on port %d", listen_port); mongoc_client_t *client = mongoc_client_new(tmp_str("mongodb://127.0.0.1:%hu/?serverselectiontimeoutms=500", listen_port)); BSON_ASSERT(client); mongoc_apm_callbacks_t *callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_started_cb(callbacks, prose_heartbeat_event_started); mongoc_apm_set_server_heartbeat_failed_cb(callbacks, prose_heartbeat_event_failed); mongoc_client_set_apm_callbacks(client, callbacks, &context); mongoc_apm_callbacks_destroy(callbacks); BSON_ASSERT(!mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, NULL)); mongoc_client_destroy(client); mcommon_thread_join(thread); mongoc_cond_destroy(&context.cond); bson_mutex_destroy(&context.mutex); ASSERT_CMPSIZE_T(context.num_events, ==, 4); ASSERT_CMPINT(context.events[0], ==, PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_STARTED); ASSERT_CMPINT(context.events[1], ==, PROSE_HEARTBEAT_EVENT_CLIENT_CONNECTED); ASSERT_CMPINT(context.events[2], ==, PROSE_HEARTBEAT_EVENT_CLIENT_HELLO_RECEIVED); ASSERT_CMPINT(context.events[3], ==, PROSE_HEARTBEAT_EVENT_SERVER_HEARTBEAT_FAILED); } void test_sdam_install(TestSuite *suite) { test_all_spec_tests(suite); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/topology/discovery [lock:live-server]", test_topology_discovery, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/directconnection [lock:live-server]", test_direct_connection, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/existing/behavior [lock:live-server]", test_existing_behavior, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_not_replset); TestSuite_AddFull(suite, "/server_discovery_and_monitoring/prose/rtt [lock:live-server]", test_prose_rtt, NULL /* dtor */, NULL /* ctx */, test_framework_skip_if_max_wire_version_less_than_9); TestSuite_Add(suite, "/server_discovery_and_monitoring/prose/heartbeat [lock:live-server]", test_prose_heartbeat); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-secure-channel.c000066400000000000000000000242111511661753600255560ustar00rootroot00000000000000#include "./TestSuite.h" #include "./test-libmongoc.h" #include #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #include // mongoc_client_connect_tcp #include // _mongoc_host_list_from_string_with_err #include // _mongoc_log_get_handler #include // _mongoc_stream_tls_t #include #include #include static mongoc_stream_t * connect_with_secure_channel_cred(const mongoc_ssl_opt_t *ssl_opt, mongoc_shared_ptr cred_ptr, bson_error_t *error) { mongoc_host_list_t host; const int32_t connect_timout_ms = 10000; *error = (bson_error_t){0}; if (!_mongoc_host_list_from_string_with_err(&host, "localhost:27017", error)) { return false; } mongoc_stream_t *tcp_stream = mongoc_client_connect_tcp(connect_timout_ms, &host, error); if (!tcp_stream) { return false; } mongoc_stream_t *tls_stream = mongoc_stream_tls_secure_channel_new_with_creds(tcp_stream, host.host, ssl_opt, cred_ptr); if (!tls_stream) { mongoc_stream_destroy(tcp_stream); return false; } if (!mongoc_stream_tls_handshake_block(tls_stream, host.host, connect_timout_ms, error)) { mongoc_stream_destroy(tls_stream); return false; } return tls_stream; } // Test a TLS stream can be create with shared Secure Channel credentials. static void test_secure_channel_shared_creds_stream(void *unused) { BSON_UNUSED(unused); bson_error_t error; const mongoc_ssl_opt_t ssl_opt = {.ca_file = CERT_TEST_DIR "/ca.pem", .pem_file = CERT_TEST_DIR "/client.pem"}; // Test with no sharing: { mongoc_stream_t *stream = connect_with_secure_channel_cred(&ssl_opt, MONGOC_SHARED_PTR_NULL, &error); ASSERT_OR_PRINT(stream, error); mongoc_stream_destroy(stream); } // Test with sharing: { mongoc_shared_ptr cred_ptr = mongoc_shared_ptr_create(mongoc_secure_channel_cred_new(&ssl_opt), mongoc_secure_channel_cred_deleter); { mongoc_stream_t *stream = connect_with_secure_channel_cred(&ssl_opt, cred_ptr, &error); ASSERT_OR_PRINT(stream, error); // Check same credentials are stored on stream: { mongoc_stream_tls_t *tls_stream = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *schannel = tls_stream->ctx; ASSERT_CMPVOID(schannel->cred_ptr.ptr, ==, cred_ptr.ptr); } ASSERT_CMPINT(mongoc_shared_ptr_use_count(cred_ptr), ==, 2); mongoc_stream_destroy(stream); ASSERT_CMPINT(mongoc_shared_ptr_use_count(cred_ptr), ==, 1); } // Use again: { mongoc_stream_t *stream = connect_with_secure_channel_cred(&ssl_opt, cred_ptr, &error); ASSERT_OR_PRINT(stream, error); // Check same credentials are stored on stream: { mongoc_stream_tls_t *tls_stream = (mongoc_stream_tls_t *)stream; mongoc_stream_tls_secure_channel_t *schannel = tls_stream->ctx; ASSERT_CMPVOID(schannel->cred_ptr.ptr, ==, cred_ptr.ptr); } ASSERT_CMPINT(mongoc_shared_ptr_use_count(cred_ptr), ==, 2); mongoc_stream_destroy(stream); ASSERT_CMPINT(mongoc_shared_ptr_use_count(cred_ptr), ==, 1); } mongoc_shared_ptr_reset_null(&cred_ptr); } // Test with bad SCHANNEL CREDENTIALS to exercise error path: { mongoc_secure_channel_cred *cred = mongoc_secure_channel_cred_new(&ssl_opt); mongoc_shared_ptr cred_ptr = mongoc_shared_ptr_create(cred, mongoc_secure_channel_cred_deleter); #ifdef HAVE_SCH_CREDENTIALS if (cred->cred_type == sch_credentials) { SCH_CREDENTIALS *sch_cred = (SCH_CREDENTIALS *)cred->cred; sch_cred->dwVersion = 0; // Invalid version. } else { SCHANNEL_CRED *sch_cred = (SCHANNEL_CRED *)cred->cred; sch_cred->dwVersion = 0; } #else SCHANNEL_CRED *sch_cred = (SCHANNEL_CRED *)cred->cred; sch_cred->dwVersion = 0; #endif capture_logs(true); mongoc_stream_t *stream = connect_with_secure_channel_cred(&ssl_opt, cred_ptr, &error); ASSERT(!stream); ASSERT_CAPTURED_LOG("schannel", MONGOC_LOG_LEVEL_ERROR, "Failed to initialize security context"); mongoc_shared_ptr_reset_null(&cred_ptr); } } typedef struct { size_t failures; size_t failures2; } cert_failures; static void count_cert_failures(mongoc_log_level_t log_level, const char *log_domain, const char *message, void *user_data) { BSON_UNUSED(log_level); BSON_UNUSED(log_domain); cert_failures *cf = user_data; if (strstr(message, "Failed to open file: 'does-not-exist.pem'")) { cf->failures++; } if (strstr(message, "Failed to open file: 'does-not-exist-2.pem'")) { cf->failures2++; } } static bool try_ping(mongoc_client_t *client, bson_error_t *error) { return mongoc_client_command_simple(client, "admin", tmp_bson(BSON_STR({"ping" : 1})), NULL, NULL, error); } static bool try_ping_with_reconnect(mongoc_client_t *client, bson_error_t *error) { // Force a connection error with a failpoint: if (!mongoc_client_command_simple(client, "admin", tmp_bson(BSON_STR({ "configureFailPoint" : "failCommand", "mode" : {"times" : 1}, "data" : {"closeConnection" : true, "failCommands" : ["ping"]} })), NULL, NULL, error)) { return false; } // Expect first ping to fail: if (try_ping(client, error)) { bson_set_error(error, 0, 0, "unexpected: ping succeeded, but expected to fail"); return false; } // Ping again: return try_ping(client, error); } static void test_secure_channel_shared_creds_client(void *unused) { BSON_UNUSED(unused); bson_error_t error; // Save log function: mongoc_log_func_t saved_log_func; void *saved_log_data; _mongoc_log_get_handler(&saved_log_func, &saved_log_data); // Set log function to count failed attempts to load client cert: cert_failures cf = {0}; mongoc_log_set_handler(count_cert_failures, &cf); // Test client: { mongoc_client_t *client = test_framework_new_default_client(); // Set client cert to a bad path: { mongoc_ssl_opt_t ssl_opt = *test_framework_get_ssl_opts(); ssl_opt.pem_file = "does-not-exist.pem"; mongoc_client_set_ssl_opts(client, &ssl_opt); } // Expect insert OK. Cert fails to load, but server configured with --tlsAllowConnectionsWithoutCertificates: { bool ok = try_ping(client, &error); ASSERT_OR_PRINT(ok, error); } // Expect exactly one attempt to load the client cert: mlib_check(1, eq, cf.failures); mongoc_client_destroy(client); } cf = (cert_failures){0}; // Test pool: { mongoc_client_pool_t *pool = test_framework_new_default_client_pool(); // Set client cert to a bad path: { mongoc_ssl_opt_t ssl_opt = *test_framework_get_ssl_opts(); ssl_opt.pem_file = "does-not-exist.pem"; mongoc_client_pool_set_ssl_opts(pool, &ssl_opt); } mongoc_client_t *client = mongoc_client_pool_pop(pool); // Expect insert OK. Cert fails to load, but server configured with --tlsAllowConnectionsWithoutCertificates: { bool ok = try_ping(client, &error); ASSERT_OR_PRINT(ok, error); } mongoc_client_pool_push(pool, client); // Expect exactly one attempt to load the client cert: mlib_check(1, eq, cf.failures); mongoc_client_pool_destroy(pool); } cf = (cert_failures){0}; // Test client changing TLS options after connecting: { // Changing TLS options after connecting is prohibited on a client pool, but not on a single-threaded client. // It is not a documented feature, but is tested for OpenSSL. mongoc_client_t *client = test_framework_new_default_client(); // Set client cert to a bad path: { mongoc_ssl_opt_t ssl_opt = *test_framework_get_ssl_opts(); ssl_opt.pem_file = "does-not-exist.pem"; mongoc_client_set_ssl_opts(client, &ssl_opt); } // Expect insert OK. Cert fails to load, but server configured with --tlsAllowConnectionsWithoutCertificates: { bool ok = try_ping(client, &error); ASSERT_OR_PRINT(ok, error); } // Expect exactly one attempt to load the client cert: mlib_check(1, eq, cf.failures); mlib_check(0, eq, cf.failures2); // Change the client cert: { mongoc_ssl_opt_t ssl_opt = *test_framework_get_ssl_opts(); ssl_opt.pem_file = "does-not-exist-2.pem"; mongoc_client_set_ssl_opts(client, &ssl_opt); } // Force a reconnect. { bool ok = try_ping_with_reconnect(client, &error); ASSERT_OR_PRINT(ok, error); } // Expect an attempt to load the new cert: mlib_check(1, eq, cf.failures); // Unchanged. mlib_check(1, eq, cf.failures2); mongoc_client_destroy(client); } // Restore log handler: mongoc_log_set_handler(saved_log_func, saved_log_data); } void test_secure_channel_install(TestSuite *suite) { TestSuite_AddFull(suite, "/secure_channel/shared_creds/stream", test_secure_channel_shared_creds_stream, NULL, NULL, test_framework_skip_if_no_server_ssl); TestSuite_AddFull(suite, "/secure_channel/shared_creds/client", test_secure_channel_shared_creds_client, NULL, NULL, test_framework_skip_if_no_server_ssl); } #else // MONGOC_ENABLE_SSL_SECURE_CHANNEL void test_secure_channel_install(TestSuite *suite) { BSON_UNUSED(suite); } #endif // MONGOC_ENABLE_SSL_SECURE_CHANNEL mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-server-description.c000066400000000000000000000544531511661753600265240ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include void reset_basic_sd(mongoc_server_description_t *sd) { bson_error_t error; bson_t *hello; hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX)); mongoc_server_description_reset(sd); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(sd, hello, 0 /* rtt */, &error); bson_destroy(hello); } /* These checks will start failing and need to be updated once CDRIVER-3527 is * addressed. */ static void _test_hostlist(mongoc_server_description_t *sd1, bson_t *sd1_hostlist, mongoc_server_description_t *sd2, bson_t *sd2_hostlist) { bson_reinit(sd1_hostlist); bson_reinit(sd2_hostlist); BSON_ASSERT(_mongoc_server_description_equal(sd1, sd2)); /* [ "h1" ] vs [] */ BSON_APPEND_UTF8(sd1_hostlist, "0", "h1"); BSON_ASSERT(!_mongoc_server_description_equal(sd1, sd2)); /* [ "h1" ] vs [ "h1" ] */ BSON_APPEND_UTF8(sd2_hostlist, "0", "h1"); BSON_ASSERT(_mongoc_server_description_equal(sd1, sd2)); /* [ "h1", "h2", "h3" ] vs [ "h1" ] */ BSON_APPEND_UTF8(sd1_hostlist, "1", "h2"); BSON_APPEND_UTF8(sd1_hostlist, "2", "h3"); BSON_ASSERT(!_mongoc_server_description_equal(sd1, sd2)); /* [ "h1", "h2", "h3" ] vs [ "h1", "h3", "h2" ]. Considered unequal since we * do not do a set comparison. */ BSON_APPEND_UTF8(sd2_hostlist, "1", "h3"); BSON_APPEND_UTF8(sd2_hostlist, "2", "h2"); BSON_ASSERT(!_mongoc_server_description_equal(sd1, sd2)); /* [ "h1", "h1" ] vs [ "h1" ]. Considered unequal since we do not do a set * comparison. */ bson_reinit(sd1_hostlist); bson_reinit(sd2_hostlist); BSON_APPEND_UTF8(sd1_hostlist, "0", "h1"); BSON_APPEND_UTF8(sd1_hostlist, "1", "h1"); BSON_APPEND_UTF8(sd2_hostlist, "0", "h1"); BSON_ASSERT(!_mongoc_server_description_equal(sd1, sd2)); /* Arbitrary non-array like equal docs. Considered equal since we don't do * any parsing. */ bson_reinit(sd1_hostlist); bson_reinit(sd2_hostlist); BSON_APPEND_UTF8(sd1_hostlist, "test", "h1"); BSON_APPEND_UTF8(sd2_hostlist, "test", "h1"); BSON_ASSERT(_mongoc_server_description_equal(sd1, sd2)); } /* Unit test of server description. */ /* Check that variations on all (=) fields result in inequal, and variations on * all non (=) fields do not */ void test_server_description_equal(void) { mongoc_server_description_t sd1; mongoc_server_description_t sd2; mongoc_server_description_init(&sd1, "host:1234", 1); mongoc_server_description_init(&sd2, "host:1234", 2); reset_basic_sd(&sd1); reset_basic_sd(&sd2); BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "address" differs, still considered equal. */ sd2.connection_address = "host2:5678"; BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "roundTripTime" differs, still considered equal. */ sd1.round_trip_time_msec = 1234; BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "lastWriteDate"/"opTime" are stored in last_hello_response and not parsed * out. Check that overwriting the stored reply does not factor into the * equality check. */ bson_reinit(&sd1.last_hello_response); BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "error" differs, considered unequal. */ bson_set_error(&sd1.error, MONGOC_ERROR_SERVER, 123, "some error"); BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "type" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.type = MONGOC_SERVER_RS_GHOST; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "minWireVersion" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.min_wire_version = 2; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "maxWireVersion" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.max_wire_version = 7; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "me" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.me = "test:1234"; sd2.me = "test:1235"; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* But if "me" only differs only in case, considered equal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.me = "tesT:1234"; sd2.me = "test:1234"; BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* Test variations of "hosts", "passives", and "arbiters". */ _test_hostlist(&sd1, &sd1.hosts, &sd2, &sd2.hosts); _test_hostlist(&sd1, &sd1.passives, &sd2, &sd2.passives); _test_hostlist(&sd1, &sd1.arbiters, &sd2, &sd2.arbiters); /* "tags" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); bson_reinit(&sd1.tags); BSON_APPEND_UTF8(&sd1.tags, "tag", "nyc"); BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "setName" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.set_name = "set"; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "setName" differs by case only, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.set_name = "set"; sd2.set_name = "SET"; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "setVersion" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.set_version = 1; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "electionId" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); bson_oid_init_from_string(&sd1.election_id, "000000000000000000001234"); BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "primary" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.current_primary = "host"; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "primary" differs in case only, considered equal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.current_primary = "host"; sd2.current_primary = "HOST"; BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "logicalSessionTimeoutMinutes" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); sd1.session_timeout_minutes = 1; BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); /* "compressors" differs, still considered equal since that is only * applicable for handshake. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); bson_reinit(&sd1.compressors); BSON_APPEND_UTF8(&sd1.compressors, "0", "zstd"); BSON_ASSERT(_mongoc_server_description_equal(&sd1, &sd2)); /* "topologyVersion" differs, considered unequal. */ reset_basic_sd(&sd1); reset_basic_sd(&sd2); BCON_APPEND(&sd1.topology_version, "x", BCON_INT32(1)); BSON_ASSERT(!_mongoc_server_description_equal(&sd1, &sd2)); mongoc_server_description_cleanup(&sd1); mongoc_server_description_cleanup(&sd2); } /* Test that msg set to anything else besides "isdbgrid" is not considered * server type mongos */ void test_server_description_msg_without_isdbgrid(void) { mongoc_server_description_t sd; bson_t *hello; bson_error_t error; mongoc_server_description_init(&sd, "host:1234", 1); hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "msg", "isdbgrid"); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(&sd, hello, 0 /* rtt */, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_MONGOS); mongoc_server_description_reset(&sd); bson_destroy(hello); hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "msg", "something_else"); mongoc_server_description_handle_hello(&sd, hello, 0 /* rtt */, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); bson_destroy(hello); mongoc_server_description_cleanup(&sd); } static void test_server_description_ignores_rtt(void) { mongoc_server_description_t sd; bson_error_t error; bson_t hello; bson_init(&hello); BCON_APPEND(&hello, "isWritablePrimary", BCON_BOOL(true)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_init(&sd, "host:1234", 1); /* Initially, the RTT is MONGOC_RTT_UNSET. */ ASSERT_CMPINT64(sd.round_trip_time_msec, ==, MONGOC_RTT_UNSET); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); /* If MONGOC_RTT_UNSET is passed as the RTT, it remains MONGOC_RTT_UNSET. */ mongoc_server_description_handle_hello(&sd, &hello, MONGOC_RTT_UNSET, &error); ASSERT_CMPINT64(sd.round_trip_time_msec, ==, MONGOC_RTT_UNSET); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); /* The first real RTT overwrites the stored RTT. */ mongoc_server_description_handle_hello(&sd, &hello, 10, &error); ASSERT_CMPINT64(sd.round_trip_time_msec, ==, 10); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); /* But subsequent MONGOC_RTT_UNSET values do not effect it. */ mongoc_server_description_handle_hello(&sd, &hello, MONGOC_RTT_UNSET, &error); ASSERT_CMPINT64(sd.round_trip_time_msec, ==, 10); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); mongoc_server_description_cleanup(&sd); bson_destroy(&hello); } static void test_server_description_hello(void) { mongoc_server_description_t sd; bson_error_t error; bson_t hello_response; bson_init(&hello_response); BCON_APPEND(&hello_response, "isWritablePrimary", BCON_BOOL(true)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_init(&sd, "host:1234", 1); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); mongoc_server_description_handle_hello(&sd, &hello_response, 0, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); mongoc_server_description_cleanup(&sd); bson_destroy(&hello_response); } static void test_server_description_hello_cmd_not_found(void) { mongoc_server_description_t sd; bson_error_t error; const char *response = "{" " 'ok' : 0," " 'errmsg' : 'no such command: \\'hello\\''," " 'code' : 59," " 'codeName' : 'CommandNotFound'" "}"; memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_init(&sd, "host:1234", 1); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); mongoc_server_description_handle_hello(&sd, tmp_bson(response), 0, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); mongoc_server_description_cleanup(&sd); } static void test_server_description_legacy_hello(void) { mongoc_server_description_t sd; bson_error_t error; bson_t hello_response; bson_init(&hello_response); BCON_APPEND(&hello_response, HANDSHAKE_RESPONSE_LEGACY_HELLO, BCON_BOOL(true)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_init(&sd, "host:1234", 1); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); mongoc_server_description_handle_hello(&sd, &hello_response, 0, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); BSON_ASSERT(!sd.hello_ok); mongoc_server_description_cleanup(&sd); bson_destroy(&hello_response); } static void test_server_description_legacy_hello_ok(void) { mongoc_server_description_t sd; bson_error_t error; bson_t hello_response; bson_init(&hello_response); BCON_APPEND(&hello_response, HANDSHAKE_RESPONSE_LEGACY_HELLO, BCON_BOOL(true)); BCON_APPEND(&hello_response, "helloOk", BCON_BOOL(true)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_init(&sd, "host:1234", 1); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); mongoc_server_description_handle_hello(&sd, &hello_response, 0, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); BSON_ASSERT(sd.hello_ok); mongoc_server_description_cleanup(&sd); bson_destroy(&hello_response); } static void test_server_description_connection_id(void) { mongoc_server_description_t sd; bson_t *hello; bson_error_t error; // Test an int32. { mongoc_server_description_init(&sd, "host:1234", 1); hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "connectionId", BCON_INT32(1)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(&sd, hello, 0 /* rtt */, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); ASSERT_CMPINT64(sd.server_connection_id, ==, 1); mongoc_server_description_cleanup(&sd); bson_destroy(hello); } // Test an int64. { mongoc_server_description_init(&sd, "host:1234", 1); hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "connectionId", BCON_INT64(1)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(&sd, hello, 0 /* rtt */, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); ASSERT_CMPINT64(sd.server_connection_id, ==, 1); bson_destroy(hello); mongoc_server_description_cleanup(&sd); } // Test a double. { mongoc_server_description_init(&sd, "host:1234", 1); hello = BCON_NEW("minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "connectionId", BCON_DOUBLE(1)); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(&sd, hello, 0 /* rtt */, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_STANDALONE); ASSERT_CMPINT64(sd.server_connection_id, ==, 1); bson_destroy(hello); mongoc_server_description_cleanup(&sd); } } static void test_server_description_hello_type_error(void) { mongoc_server_description_t sd; bson_error_t error; const char *hello = "{" " 'ok' : { '$numberInt' : '1' }," " 'ismaster' : true," " 'maxBsonObjectSize' : { '$numberInt' : '16777216' }," " 'maxMessageSizeBytes' : { '$numberInt' : '48000000'}," " 'maxWriteBatchSize' : { '$numberLong' : '565160423'}," " 'logicalSessionTimeoutMinutes' : { '$numberInt' : '30'}," " 'connectionId' : { '$numberLong' : '565160423'}," " 'minWireVersion' : { '$numberInt' : '0'}," " 'maxWireVersion' : { '$numberInt' : '15'}," " 'readOnly' : true" "}"; mongoc_server_description_init(&sd, "host:1234", 1); memset(&error, 0, sizeof(bson_error_t)); mongoc_server_description_handle_hello(&sd, tmp_bson(hello), 0, &error); BSON_ASSERT(sd.type == MONGOC_SERVER_UNKNOWN); BSON_ASSERT(sd.error.code == MONGOC_ERROR_STREAM_INVALID_TYPE); ASSERT_ERROR_CONTAINS(sd.error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_INVALID_TYPE, "unexpected type"); mongoc_server_description_cleanup(&sd); } static void test_copy(const char *hello_json) { mongoc_server_description_t sd, *sd_copy; mongoc_server_description_init(&sd, "host:1234", 1); bson_error_t empty_error = {0}; mongoc_server_description_handle_hello(&sd, tmp_bson(hello_json), 0, &empty_error); sd_copy = mongoc_server_description_new_copy(&sd); // Check server descriptions compare equal by "Server Description Equality" rules. Not all fields are considered. ASSERT(_mongoc_server_description_equal(&sd, sd_copy)); // Check all fields: ASSERT_CMPUINT32(sd.id, ==, sd_copy->id); ASSERT_CMPSTR(sd.host.host_and_port, sd_copy->host.host_and_port); ASSERT_CMPINT64(sd.round_trip_time_msec, ==, sd_copy->round_trip_time_msec); ASSERT_CMPINT64(sd.last_update_time_usec, ==, sd_copy->last_update_time_usec); ASSERT_EQUAL_BSON(&sd.last_hello_response, &sd_copy->last_hello_response); ASSERT_CMPINT((int)sd.has_hello_response, ==, (int)sd_copy->has_hello_response); ASSERT_CMPINT((int)sd.hello_ok, ==, (int)sd_copy->hello_ok); ASSERT_CMPSTR(sd.connection_address, sd_copy->connection_address); ASSERT_CMPSTR(sd.me, sd_copy->me); ASSERT_CMPINT((int)sd.opened, ==, (int)sd_copy->opened); ASSERT_CMPSTR(sd.set_name, sd_copy->set_name); ASSERT_MEMCMP(&sd.error, &sd_copy->error, (int)sizeof(bson_error_t)); ASSERT_CMPINT((int)sd.type, ==, (int)sd_copy->type); ASSERT_CMPINT32(sd.min_wire_version, ==, sd_copy->min_wire_version); ASSERT_CMPINT32(sd.max_wire_version, ==, sd_copy->max_wire_version); ASSERT_CMPINT32(sd.max_msg_size, ==, sd_copy->max_msg_size); ASSERT_CMPINT32(sd.max_bson_obj_size, ==, sd_copy->max_bson_obj_size); ASSERT_CMPINT32(sd.max_write_batch_size, ==, sd_copy->max_write_batch_size); ASSERT_CMPINT64(sd.session_timeout_minutes, ==, sd_copy->session_timeout_minutes); ASSERT_EQUAL_BSON(&sd.hosts, &sd_copy->hosts); ASSERT_EQUAL_BSON(&sd.passives, &sd_copy->passives); ASSERT_EQUAL_BSON(&sd.arbiters, &sd_copy->arbiters); ASSERT_EQUAL_BSON(&sd.tags, &sd_copy->tags); ASSERT_CMPSTR(sd.current_primary, sd_copy->current_primary); ASSERT_CMPINT64(sd.set_version, ==, sd_copy->set_version); ASSERT_MEMCMP(&sd.election_id, &sd_copy->election_id, (int)sizeof(bson_oid_t)); ASSERT_CMPINT64(sd.last_write_date_ms, ==, sd_copy->last_write_date_ms); ASSERT_EQUAL_BSON(&sd.compressors, &sd_copy->compressors); ASSERT_EQUAL_BSON(&sd.topology_version, &sd_copy->topology_version); ASSERT_CMPUINT32(sd.generation, ==, sd_copy->generation); ASSERT(sd_copy->_generation_map_ != NULL); // Do not compare entries. Just ensure non-NULL. ASSERT_MEMCMP(&sd.service_id, &sd_copy->service_id, (int)sizeof(bson_oid_t)); ASSERT_CMPINT64(sd.server_connection_id, ==, sd_copy->server_connection_id); mongoc_server_description_cleanup(&sd); mongoc_server_description_destroy(sd_copy); } static void test_server_description_copy(void) { const char *hello_mongod = BSON_STR({ "topologyVersion" : {"processId" : {"$oid" : "6792ef87965dee8797402adb"}, "counter" : 6}, "hosts" : ["localhost:27017"], "setName" : "rs0", "setVersion" : 1, "isWritablePrimary" : true, "secondary" : false, "primary" : "localhost:27017", "me" : "localhost:27017", "electionId" : {"$oid" : "7fffffff0000000000000016"}, "lastWrite" : { "opTime" : {"ts" : {"$timestamp" : {"t" : 1737682844, "i" : 1}}, "t" : 22}, "lastWriteDate" : {"$date" : "2025-01-24T01:40:44Z"}, "majorityOpTime" : {"ts" : {"$timestamp" : {"t" : 1737682844, "i" : 1}}, "t" : 22}, "majorityWriteDate" : {"$date" : "2025-01-24T01:40:44Z"} }, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 100000, "localTime" : {"$date" : "2025-01-24T01:40:51.968Z"}, "logicalSessionTimeoutMinutes" : 30, "connectionId" : 13, "minWireVersion" : 0, "maxWireVersion" : 25, "readOnly" : false, "ok" : 1.0, "$clusterTime" : { "clusterTime" : {"$timestamp" : {"t" : 1737682844, "i" : 1}}, "signature" : {"hash" : {"$binary" : {"base64" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "subType" : "00"}}, "keyId" : 0} }, "operationTime" : {"$timestamp" : {"t" : 1737682844, "i" : 1}} }); const char *hello_mongos = BSON_STR({ "isWritablePrimary" : true, "msg" : "isdbgrid", "topologyVersion" : {"processId" : {"$oid" : "6791af1181771f367602ec40"}, "counter" : 0}, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 100000, "localTime" : {"$date" : "2025-01-24T01:24:57.217Z"}, "logicalSessionTimeoutMinutes" : 30, "connectionId" : 3310, "maxWireVersion" : 25, "minWireVersion" : 0, "ok" : 1.0, "$clusterTime" : { "clusterTime" : {"$timestamp" : {"t" : 1737681896, "i" : 1}}, "signature" : {"hash" : {"$binary" : {"base64" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "subType" : "00"}}, "keyId" : 0} }, "operationTime" : {"$timestamp" : {"t" : 1737681896, "i" : 1}} }); test_copy(hello_mongod); test_copy(hello_mongos); } void test_server_description_install(TestSuite *suite) { TestSuite_Add(suite, "/server_description/equal", test_server_description_equal); TestSuite_Add(suite, "/server_description/msg_without_isdbgrid", test_server_description_msg_without_isdbgrid); TestSuite_Add(suite, "/server_description/ignores_unset_rtt", test_server_description_ignores_rtt); TestSuite_Add(suite, "/server_description/hello", test_server_description_hello); TestSuite_Add(suite, "/server_description/hello_cmd_not_found", test_server_description_hello_cmd_not_found); TestSuite_Add(suite, "/server_description/legacy_hello", test_server_description_legacy_hello); TestSuite_Add(suite, "/server_description/legacy_hello_ok", test_server_description_legacy_hello_ok); TestSuite_Add(suite, "/server_description/connection_id", test_server_description_connection_id); TestSuite_Add(suite, "/server_description/hello_type_error", test_server_description_hello_type_error); TestSuite_Add(suite, "/server_description/copy", test_server_description_copy); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-server-selection-errors.c000066400000000000000000000255241511661753600274750ustar00rootroot00000000000000#include #include #include #include #include static mongoc_stream_t * cannot_resolve(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { BSON_UNUSED(uri); BSON_UNUSED(user_data); bson_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "Fake error for '%s'", host->host); return NULL; } static void server_selection_error_dns(const char *uri_str, const char *errmsg, bool expect_success, bool pooled) { mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bson_t *command; bson_t reply; bool success; uri = mongoc_uri_new(uri_str); ASSERT(uri); if (pooled && expect_success) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); } else if (pooled) { /* we expect selection to fail; let the test finish faster */ mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 100); pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); _mongoc_client_pool_set_stream_initiator(pool, cannot_resolve, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); if (!expect_success) { mongoc_client_set_stream_initiator(client, cannot_resolve, NULL); } } collection = mongoc_client_get_collection(client, "test", "test"); command = tmp_bson("{'ping': 1}"); success = mongoc_collection_command_simple(collection, command, NULL, &reply, &error); ASSERT_OR_PRINT(success == expect_success, error); if (!success && errmsg) { ASSERT_CMPSTR(error.message, errmsg); } bson_destroy(&reply); mongoc_collection_destroy(collection); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } static void test_server_selection_error_dns_direct_single(void) { server_selection_error_dns("mongodb://example-localhost.invalid:27017/", "No suitable servers found (`serverSelectionTryOnce` set): " "[Fake error for 'example-localhost.invalid']" ". Topology type: Single", false, false); } static void test_server_selection_error_dns_direct_pooled(void *ctx) { BSON_UNUSED(ctx); server_selection_error_dns("mongodb://example-localhost.invalid:27017/", "No suitable servers found: `serverSelectionTimeoutMS` expired: " "[Fake error for 'example-localhost.invalid']" ". Topology type: Single", false, true); } static void test_server_selection_error_dns_multi_fail_single(void) { server_selection_error_dns("mongodb://" "example-localhost.invalid:27017,other-example-localhost.invalid:27017/", "No suitable servers found (`serverSelectionTryOnce` set):" " [Fake error for 'example-localhost.invalid']" " [Fake error for 'other-example-localhost.invalid']" ". Topology type: Unknown", false, false); } static void test_server_selection_error_dns_multi_fail_pooled(void *ctx) { BSON_UNUSED(ctx); server_selection_error_dns("mongodb://" "example-localhost.invalid:27017,other-example-localhost.invalid:27017/", "No suitable servers found: `serverSelectionTimeoutMS` expired:" " [Fake error for 'example-localhost.invalid']" " [Fake error for 'other-example-localhost.invalid']" ". Topology type: Unknown", false, true); } static void _test_server_selection_error_dns_multi_success(bool pooled) { char *host; char *uri_str; host = test_framework_get_host(); uri_str = bson_strdup_printf("mongodb://example-localhost.invalid:27017," "%s:%d," "other-example-localhost.invalid:27017/", host, test_framework_get_port()); server_selection_error_dns(uri_str, "", true, pooled); bson_free(uri_str); bson_free(host); } static void test_server_selection_error_dns_multi_success_single(void *context) { BSON_UNUSED(context); _test_server_selection_error_dns_multi_success(false); } static void test_server_selection_error_dns_multi_success_pooled(void *context) { BSON_UNUSED(context); _test_server_selection_error_dns_multi_success(true); } static void _test_server_selection_uds_auth_failure(bool pooled) { mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; char *path; char *uri_str; path = test_framework_get_unix_domain_socket_path_escaped(); uri_str = bson_strdup_printf("mongodb://user:wrongpass@%s", path); uri = mongoc_uri_new(uri_str); ASSERT(uri); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL test_framework_set_pool_ssl_opts(pool); #endif client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL test_framework_set_ssl_opts(client); #endif } capture_logs(true); ASSERT_OR_PRINT( !mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error), error); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_CLIENT); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_CLIENT_AUTHENTICATE); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } bson_free(path); bson_free(uri_str); mongoc_uri_destroy(uri); } static void test_server_selection_uds_auth_failure_single(void *context) { BSON_UNUSED(context); _test_server_selection_uds_auth_failure(false); } static void test_server_selection_uds_auth_failure_pooled(void *context) { BSON_UNUSED(context); _test_server_selection_uds_auth_failure(true); } static void _test_server_selection_uds_not_found(bool pooled) { mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bson_error_t error; uri = mongoc_uri_new("mongodb://%2Ftmp%2Fmongodb-so-close.sock"); ASSERT(uri); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 100); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL test_framework_set_pool_ssl_opts(pool); #endif client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL test_framework_set_ssl_opts(client); #endif } #ifdef MONGOC_ENABLE_SSL test_framework_set_ssl_opts(client); #endif ASSERT(!mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_SERVER_SELECTION); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_SERVER_SELECTION_FAILURE); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } static void test_server_selection_uds_not_found_single(void *context) { BSON_UNUSED(context); _test_server_selection_uds_not_found(false); } static void test_server_selection_uds_not_found_pooled(void *context) { BSON_UNUSED(context); _test_server_selection_uds_not_found(true); } void test_server_selection_errors_install(TestSuite *suite) { TestSuite_Add(suite, "/server_selection/errors/dns/direct/single", test_server_selection_error_dns_direct_single); TestSuite_AddFull(suite, "/server_selection/errors/dns/direct/pooled [timeout:30]", test_server_selection_error_dns_direct_pooled, NULL, NULL, test_framework_skip_if_slow); TestSuite_Add( suite, "/server_selection/errors/dns/multi/fail/single", test_server_selection_error_dns_multi_fail_single); TestSuite_AddFull(suite, "/server_selection/errors/dns/multi/fail/pooled [lock:live-server][timeout:30]", test_server_selection_error_dns_multi_fail_pooled, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/server_selection/errors/dns/multi/success/single [lock:live-server]", test_server_selection_error_dns_multi_success_single, NULL, NULL, test_framework_skip_if_single); TestSuite_AddFull(suite, "/server_selection/errors/dns/multi/success/pooled [lock:live-server]", test_server_selection_error_dns_multi_success_pooled, NULL, NULL, test_framework_skip_if_single); TestSuite_AddFull(suite, "/server_selection/errors/uds/auth_failure/single [lock:live-server]", test_server_selection_uds_auth_failure_single, NULL, NULL, test_framework_skip_if_no_uds); TestSuite_AddFull(suite, "/server_selection/errors/uds/auth_failure/pooled [lock:live-server]", test_server_selection_uds_auth_failure_pooled, NULL, NULL, test_framework_skip_if_no_uds); TestSuite_AddFull(suite, "/server_selection/errors/uds/not_found/single [lock:live-server]", test_server_selection_uds_not_found_single, NULL, NULL, test_framework_skip_if_windows); TestSuite_AddFull(suite, "/server_selection/errors/uds/not_found/pooled [lock:live-server]", test_server_selection_uds_not_found_pooled, NULL, NULL, test_framework_skip_if_windows); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-server-selection.c000066400000000000000000000036221511661753600261560ustar00rootroot00000000000000#include #include #include /* *----------------------------------------------------------------------- * * test_rtt_calculation_cb -- * * Runs the JSON tests for RTT calculation included with the * Server Selection spec. * *----------------------------------------------------------------------- */ static void test_rtt_calculation_cb(void *test_vp) { mongoc_server_description_t *description; bson_iter_t iter; BSON_ASSERT_PARAM(test_vp); const bson_t *const test = test_vp; description = (mongoc_server_description_t *)bson_malloc0(sizeof *description); mongoc_server_description_init(description, "localhost:27017", 1); /* parse RTT into server description */ BSON_ASSERT(bson_iter_init_find(&iter, test, "avg_rtt_ms")); description->round_trip_time_msec = bson_iter_int64(&iter); /* update server description with new rtt */ BSON_ASSERT(bson_iter_init_find(&iter, test, "new_rtt_ms")); mongoc_server_description_update_rtt(description, bson_iter_int64(&iter)); /* ensure new RTT was calculated correctly */ BSON_ASSERT(bson_iter_init_find(&iter, test, "new_avg_rtt")); BSON_ASSERT(description->round_trip_time_msec == bson_iter_int64(&iter)); mongoc_server_description_destroy(description); } /* *----------------------------------------------------------------------- * * Runner for the JSON tests for server selection. * *----------------------------------------------------------------------- */ static void test_all_spec_tests(TestSuite *suite) { /* RTT calculation */ install_json_test_suite(suite, JSON_DIR, "server_selection/rtt", &test_rtt_calculation_cb); /* SS logic */ install_json_test_suite(suite, JSON_DIR, "server_selection/server_selection", &test_server_selection_logic_cb); } void test_server_selection_install(TestSuite *suite) { test_all_spec_tests(suite); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-server-stream.c000066400000000000000000000241231511661753600254630ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #define HELLO_SERVER_ONE \ tmp_str("{'ok': 1," \ " 'isWritablePrimary': true," \ " 'minWireVersion': %d, " \ " 'maxWireVersion': %d }", \ WIRE_VERSION_MIN, \ WIRE_VERSION_MIN) #define HELLO_SERVER_TWO \ tmp_str("{'ok': 1," \ " 'isWritablePrimary': true," \ " 'minWireVersion': %d," \ " 'maxWireVersion': %d }", \ WIRE_VERSION_MIN, \ WIRE_VERSION_DELETE_HINT) /* run_delete_with_hint_and_wc0 runs a delete command with a "hint" option and * unacknowledged write concern. * * If @expect_error is true, expect a client-side error from a maxWireVersion < * WIRE_VERSION_DELETE_HINT. */ static void run_delete_with_hint_and_wc0(bool expect_error, mongoc_client_t *client, mock_server_t *server) { mongoc_collection_t *coll; mongoc_write_concern_t *wc; bson_t *delete_selector; bson_t *delete_opts; bool r; bson_error_t error; future_t *future; request_t *request; ASSERT(client); coll = mongoc_client_get_collection(client, "db", "coll"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); delete_selector = bson_new(); delete_opts = BCON_NEW("hint", "{", "}"); r = mongoc_write_concern_append(wc, delete_opts); ASSERT_WITH_MSG(r, "mongoc_write_concern_append failed"); future = future_collection_delete_one(coll, delete_selector, delete_opts, NULL /* reply */, &error); if (expect_error) { /* Expect a client side error. The server does not receive anything. */ r = future_get_bool(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, "The selected server does not support hint for delete"); ASSERT(!r); } else { request = mock_server_receives_msg( server, MONGOC_MSG_MORE_TO_COME, tmp_bson("{ 'delete': 'coll' }"), tmp_bson("{'q': {}, 'hint': {}}")); reply_to_request_with_ok_and_destroy(request); r = future_get_bool(future); ASSERT(r); } future_destroy(future); bson_destroy(delete_opts); bson_destroy(delete_selector); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); } /* Test that a connection uses the server description from the handshake when * checking wire version (instead of the server description from the topology * description). */ static void test_server_stream_ties_server_description_pooled(void *unused) { mongoc_client_pool_t *pool; mongoc_client_t *client_one; mongoc_client_t *client_two; mongoc_uri_t *uri; mock_server_t *server; request_t *request; future_t *future; bson_error_t error; mongoc_server_description_t *sd; BSON_UNUSED(unused); server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); pool = test_framework_client_pool_new_from_uri(uri, NULL); client_one = mongoc_client_pool_pop(pool); client_two = mongoc_client_pool_pop(pool); /* Respond to the monitoring hello with server one hello. */ request = mock_server_receives_any_hello(server); reply_to_request_simple(request, HELLO_SERVER_ONE); request_destroy(request); /* Create a connection on client_one. */ future = future_client_command_simple( client_one, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The first command on a pooled client creates a new connection. */ request = mock_server_receives_any_hello(server); reply_to_request_simple(request, HELLO_SERVER_ONE); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* Create a connection on client_two. */ future = future_client_command_simple( client_two, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The first command on a pooled client creates a new connection. */ request = mock_server_receives_any_hello(server); reply_to_request_simple(request, HELLO_SERVER_TWO); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* Check that selecting the server returns the second server */ sd = mongoc_client_select_server(client_two, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); ASSERT_MATCH(mongoc_server_description_hello_response(sd), tmp_str("{'maxWireVersion': %d}", WIRE_VERSION_DELETE_HINT)); mongoc_server_description_destroy(sd); /* Expect client_one to continue to use maxWireVersion=WIRE_VERSION_MIN for * wire version checks. Expect an error when using delete with hint and * unacknowledged write concern. */ run_delete_with_hint_and_wc0(true, client_one, server); /* Expect client_two to continue to use * maxWireVersion=WIRE_VERSION_DELETE_HINT for wire version checks. Expect no * error when using delete with hint and unacknowledged write concern. */ run_delete_with_hint_and_wc0(false, client_two, server); mock_server_destroy(server); mongoc_uri_destroy(uri); mongoc_client_pool_push(pool, client_one); mongoc_client_pool_push(pool, client_two); mongoc_client_pool_destroy(pool); } /* Test that a connection uses the server description from the handshake when * checking wire version (instead of the server description from the topology * description). */ static void test_server_stream_ties_server_description_single(void *unused) { mongoc_client_t *client; mongoc_uri_t *uri; mock_server_t *server; request_t *request; future_t *future; bson_error_t error; mongoc_server_description_t *sd; mc_tpld_modification tdmod; BSON_UNUSED(unused); server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); client = test_framework_client_new_from_uri(uri, NULL); /* Create a connection on client. */ future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); /* The first command on a client creates a new connection. */ request = mock_server_receives_any_hello(server); reply_to_request_simple(request, HELLO_SERVER_TWO); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* Muck with the topology description. */ /* Pass in a zeroed out error. */ memset(&error, 0, sizeof(bson_error_t)); tdmod = mc_tpld_modify_begin(client->topology); mongoc_topology_description_handle_hello(tdmod.new_td, &client->topology->log_and_monitor, 1, tmp_bson(HELLO_SERVER_ONE), 0, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, &error); mc_tpld_modify_commit(tdmod); future = future_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* Check that selecting the server returns the first server */ sd = mongoc_client_select_server(client, true /* for writes */, NULL /* read prefs */, &error); ASSERT_OR_PRINT(sd, error); ASSERT_MATCH(mongoc_server_description_hello_response(sd), tmp_str("{'maxWireVersion': %d}", WIRE_VERSION_MIN)); mongoc_server_description_destroy(sd); /* Expect client to continue to use maxWireVersion=WIRE_VERSION_DELETE_HINT * for wire version checks. Expect no error when using delete with hint and * unacknowledged write concern. */ run_delete_with_hint_and_wc0(false, client, server); mock_server_destroy(server); mongoc_uri_destroy(uri); mongoc_client_destroy(client); } void test_server_stream_install(TestSuite *suite) { TestSuite_AddFull(suite, "/server_stream/ties_server_description/pooled", test_server_stream_ties_server_description_pooled, NULL /* dtor */, NULL /* ctx */, NULL); TestSuite_AddFull(suite, "/server_stream/ties_server_description/single", test_server_stream_ties_server_description_single, NULL /* dtor */, NULL /* ctx */, NULL); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-set.c000066400000000000000000000034301511661753600234550ustar00rootroot00000000000000#include #include #include static void test_set_dtor(void *item_, void *ctx_) { int *destroyed = (int *)ctx_; BSON_UNUSED(item_); (*destroyed)++; } static bool test_set_visit_cb(void *item_, void *ctx_) { int *visited = (int *)ctx_; BSON_UNUSED(item_); (*visited)++; return true; } static bool test_set_stop_after_cb(void *item_, void *ctx_) { int *stop_after = (int *)ctx_; BSON_UNUSED(item_); (*stop_after)--; return *stop_after > 0; } static void test_set_new(void) { void *items[10]; int i; int destroyed = 0; int visited = 0; int stop_after = 3; mongoc_set_t *set = mongoc_set_new(2, &test_set_dtor, &destroyed); for (i = 0; i < 5; i++) { mongoc_set_add(set, i, items + i); } for (i = 0; i < 5; i++) { BSON_ASSERT(mongoc_set_get(set, i) == items + i); } mongoc_set_rm(set, 0); BSON_ASSERT(destroyed == 1); for (i = 5; i < 10; i++) { mongoc_set_add(set, i, items + i); } for (i = 5; i < 10; i++) { BSON_ASSERT(mongoc_set_get(set, i) == items + i); } mongoc_set_rm(set, 9); BSON_ASSERT(destroyed == 2); mongoc_set_rm(set, 5); BSON_ASSERT(destroyed == 3); BSON_ASSERT(mongoc_set_get(set, 1) == items + 1); BSON_ASSERT(mongoc_set_get(set, 7) == items + 7); BSON_ASSERT(!mongoc_set_get(set, 5)); mongoc_set_add(set, 5, items + 5); BSON_ASSERT(mongoc_set_get(set, 5) == items + 5); mongoc_set_for_each(set, test_set_visit_cb, &visited); BSON_ASSERT(visited == 8); mongoc_set_for_each(set, test_set_stop_after_cb, &stop_after); BSON_ASSERT(stop_after == 0); mongoc_set_destroy(set); } void test_set_install(TestSuite *suite) { TestSuite_Add(suite, "/Set/new", test_set_new); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-shared.c000066400000000000000000000054501511661753600241340ustar00rootroot00000000000000#include #include typedef struct { int value; int *store_value_on_dtor; } my_value; my_value * my_value_new(void) { my_value *p = bson_malloc0(sizeof(my_value)); p->value = 42; p->store_value_on_dtor = NULL; return p; } void my_value_free(my_value *ptr) { if (ptr->store_value_on_dtor) { *ptr->store_value_on_dtor = ptr->value; } ptr->value = 0; ptr->store_value_on_dtor = NULL; bson_free(ptr); } void my_value_free_v(void *ptr) { my_value_free((my_value *)(ptr)); } static void test_simple(void) { int destroyed_value = 0; mongoc_shared_ptr ptr = MONGOC_SHARED_PTR_NULL; mongoc_shared_ptr ptr2, valptr_s; my_value *valptr; ASSERT(mongoc_shared_ptr_is_null(ptr)); ptr = mongoc_shared_ptr_create(my_value_new(), my_value_free_v); ASSERT(!mongoc_shared_ptr_is_null(ptr)); ASSERT_CMPINT(mongoc_shared_ptr_use_count(ptr), ==, 1); ptr2 = mongoc_shared_ptr_copy(ptr); ASSERT(ptr.ptr == ptr2.ptr); ASSERT(ptr._aux == ptr2._aux); valptr_s = mongoc_shared_ptr_copy(ptr); valptr = valptr_s.ptr; valptr->store_value_on_dtor = &destroyed_value; valptr->value = 133; mongoc_shared_ptr_reset_null(&valptr_s); /* Value hasn't changed yet */ ASSERT_CMPINT(destroyed_value, ==, 0); /* Now drop the original reference */ mongoc_shared_ptr_reset_null(&ptr); /* Check that the pointer is empty */ ASSERT(mongoc_shared_ptr_is_null(ptr)); /* Still not yet destroyed */ ASSERT_CMPINT(destroyed_value, ==, 0); /* Check that the existing pointer is okay */ ASSERT_CMPINT(((my_value *)ptr2.ptr)->value, ==, 133); /* Drop the last one */ mongoc_shared_ptr_reset_null(&ptr2); ASSERT(mongoc_shared_ptr_is_null(ptr2)); /* Now it was destroyed and set */ ASSERT_CMPINT(destroyed_value, ==, 133); } struct widget { int value; int *store_value_here; }; void widget_delete(void *w_) { struct widget *w = w_; *w->store_value_here = w->value; bson_free(w); } static void test_aliased(void) { int destroyed_valued = 0; int *i; struct widget *w; mongoc_shared_ptr ptr = MONGOC_SHARED_PTR_NULL; ptr = mongoc_shared_ptr_create(bson_malloc0(sizeof(struct widget)), widget_delete); w = ptr.ptr; w->store_value_here = &destroyed_valued; /* Alias 'ptr' to the `w->value` managed sub-object */ ptr.ptr = &w->value; i = ptr.ptr; /* We can store through it okay. */ *i = 42; ASSERT_CMPINT(w->value, ==, 42); /* Deleting with the aliased ptr is okay */ ASSERT_CMPINT(destroyed_valued, ==, 0); mongoc_shared_ptr_reset_null(&ptr); ASSERT_CMPINT(destroyed_valued, ==, 42); } void test_shared_install(TestSuite *suite) { TestSuite_Add(suite, "/shared/simple", test_simple); TestSuite_Add(suite, "/shared/aliased", test_aliased); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-socket.c000066400000000000000000000305421511661753600241560ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #define TIMEOUT 10000 #define WAIT 1000 static size_t gFourMB = 1024 * 1024 * 4; typedef struct { unsigned short server_port; mongoc_cond_t cond; bson_mutex_t cond_mutex; bool closed_socket; int amount; int32_t server_sleep_ms; } socket_test_data_t; static BSON_THREAD_FUN(socket_test_server, data_) { socket_test_data_t *data = (socket_test_data_t *)data_; struct sockaddr_in server_addr = {0}; mongoc_socket_t *listen_sock; mongoc_socket_t *conn_sock; mongoc_stream_t *stream; mongoc_iovec_t iov; mongoc_socklen_t sock_len; ssize_t r; char buf[5]; iov.iov_base = buf; iov.iov_len = sizeof(buf); listen_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(listen_sock); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); server_addr.sin_port = htons(0); r = mongoc_socket_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof server_addr); BSON_ASSERT(r == 0); sock_len = sizeof(server_addr); r = mongoc_socket_getsockname(listen_sock, (struct sockaddr *)&server_addr, &sock_len); BSON_ASSERT(r == 0); r = mongoc_socket_listen(listen_sock, 10); BSON_ASSERT(r == 0); bson_mutex_lock(&data->cond_mutex); data->server_port = ntohs(server_addr.sin_port); mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); conn_sock = mongoc_socket_accept(listen_sock, -1); BSON_ASSERT(conn_sock); stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(stream); r = mongoc_stream_readv(stream, &iov, 1, 5, TIMEOUT); BSON_ASSERT(r == 5); BSON_ASSERT(strcmp(buf, "ping") == 0); strcpy(buf, "pong"); mlib_sleep_for(data->server_sleep_ms, ms); r = mongoc_stream_writev(stream, &iov, 1, TIMEOUT); /* if we sleep the client times out, else assert the client reads the data */ if (data->server_sleep_ms == 0) { BSON_ASSERT(r == 5); } mongoc_stream_destroy(stream); bson_mutex_lock(&data->cond_mutex); data->closed_socket = true; mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } static BSON_THREAD_FUN(socket_test_client, data_) { socket_test_data_t *data = (socket_test_data_t *)data_; int64_t start; mongoc_socket_t *conn_sock; char buf[5]; ssize_t r; bool closed; struct sockaddr_in server_addr = {0}; mongoc_stream_t *stream; mongoc_iovec_t iov; iov.iov_base = buf; iov.iov_len = sizeof(buf); conn_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(conn_sock); bson_mutex_lock(&data->cond_mutex); while (!data->server_port) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(data->server_port); server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); r = mongoc_socket_connect(conn_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), -1); BSON_ASSERT(r == 0); stream = mongoc_stream_socket_new(conn_sock); strcpy(buf, "ping"); closed = mongoc_stream_check_closed(stream); BSON_ASSERT(closed == false); r = mongoc_stream_writev(stream, &iov, 1, TIMEOUT); BSON_ASSERT(r == 5); closed = mongoc_stream_check_closed(stream); BSON_ASSERT(closed == false); if (data->server_sleep_ms == 0) { r = mongoc_stream_readv(stream, &iov, 1, 5, TIMEOUT); BSON_ASSERT(r == 5); BSON_ASSERT(strcmp(buf, "pong") == 0); bson_mutex_lock(&data->cond_mutex); while (!data->closed_socket) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); /* wait up to a second for the client to detect server's shutdown */ start = bson_get_monotonic_time(); while (!mongoc_stream_check_closed(stream)) { ASSERT_CMPINT64(bson_get_monotonic_time(), <, start + 1000 * 1000); mlib_sleep_for(1, ms); } BSON_ASSERT(!mongoc_stream_timed_out(stream)); } else { r = mongoc_stream_readv(stream, &iov, 1, 5, data->server_sleep_ms / 2); ASSERT_CMPSSIZE_T(r, ==, (ssize_t)-1); BSON_ASSERT(mongoc_stream_timed_out(stream)); } mongoc_stream_destroy(stream); BSON_THREAD_RETURN; } static BSON_THREAD_FUN(sendv_test_server, data_) { socket_test_data_t *data = (socket_test_data_t *)data_; struct sockaddr_in server_addr = {0}; mongoc_socket_t *listen_sock; mongoc_socket_t *conn_sock; mongoc_stream_t *stream; mongoc_iovec_t iov; char *buf = (char *)bson_malloc(gFourMB); iov.iov_base = buf; iov.iov_len = gFourMB; listen_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(listen_sock); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); server_addr.sin_port = htons(0); { const int r = mongoc_socket_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof server_addr); ASSERT_CMPINT(r, ==, 0); } { mongoc_socklen_t sock_len = (mongoc_socklen_t)sizeof(server_addr); const int r = mongoc_socket_getsockname(listen_sock, (struct sockaddr *)&server_addr, &sock_len); ASSERT_CMPINT(r, ==, 0); } { const int r = mongoc_socket_listen(listen_sock, 10); ASSERT_CMPINT(r, ==, 0); } bson_mutex_lock(&data->cond_mutex); data->server_port = ntohs(server_addr.sin_port); mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); conn_sock = mongoc_socket_accept(listen_sock, -1); BSON_ASSERT(conn_sock); stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(stream); /* Wait until the client has pushed so much data he can't write more */ bson_mutex_lock(&data->cond_mutex); while (!data->amount) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } int amount = data->amount; data->amount = 0; bson_mutex_unlock(&data->cond_mutex); /* Start reading everything off the socket to unblock the client */ do { ASSERT(mlib_in_range(size_t, amount)); const ssize_t r = mongoc_stream_readv(stream, &iov, 1, (size_t)amount, WAIT); if (r > 0) { ASSERT(mlib_in_range(int, r)); amount -= (int)r; } } while (amount > 0); /* Allow the client to finish all its writes */ bson_mutex_lock(&data->cond_mutex); while (!data->amount) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } /* amount is likely negative value now, we've read more then caused the * original blocker */ amount += data->amount; data->amount = 0; bson_mutex_unlock(&data->cond_mutex); do { ASSERT(mlib_in_range(size_t, amount)); const ssize_t r = mongoc_stream_readv(stream, &iov, 1, (size_t)amount, WAIT); if (r > 0) { ASSERT(mlib_in_range(int, r)); amount -= (int)r; } } while (amount > 0); ASSERT_CMPINT(0, ==, amount); bson_free(buf); mongoc_stream_destroy(stream); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } static BSON_THREAD_FUN(sendv_test_client, data_) { socket_test_data_t *data = (socket_test_data_t *)data_; mongoc_socket_t *conn_sock; struct sockaddr_in server_addr = {0}; mongoc_iovec_t iov; bool done = false; char *buf = (char *)bson_malloc(gFourMB); BSON_ASSERT(gFourMB > 0); memset(buf, 'a', (gFourMB)-1); buf[gFourMB - 1] = '\0'; iov.iov_base = buf; iov.iov_len = gFourMB; conn_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(conn_sock); bson_mutex_lock(&data->cond_mutex); while (!data->server_port) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(data->server_port); server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); { const ssize_t r = mongoc_socket_connect(conn_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), -1); ASSERT_CMPSSIZE_T(r, ==, 0); } mongoc_stream_t *const stream = mongoc_stream_socket_new(conn_sock); int amount = 0; for (int i = 0; i < 5; i++) { const ssize_t r = mongoc_stream_writev(stream, &iov, 1, WAIT); if (r > 0) { BSON_ASSERT(mlib_in_range(int, r)); amount += (int)r; } if (mlib_cmp(r, !=, gFourMB)) { if (!done) { bson_mutex_lock(&data->cond_mutex); data->amount = amount; amount = 0; mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); done = true; } } } BSON_ASSERT(true == done); bson_mutex_lock(&data->cond_mutex); data->amount = amount; mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); mongoc_stream_destroy(stream); bson_free(buf); BSON_THREAD_RETURN; } static void _test_mongoc_socket_check_closed(int32_t server_sleep_ms) { socket_test_data_t data = {0}; bson_thread_t threads[2]; int i, r; bson_mutex_init(&data.cond_mutex); mongoc_cond_init(&data.cond); data.server_sleep_ms = server_sleep_ms; r = mcommon_thread_create(threads, &socket_test_server, &data); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, &socket_test_client, &data); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_mutex_destroy(&data.cond_mutex); mongoc_cond_destroy(&data.cond); } static void test_mongoc_socket_check_closed(void) { _test_mongoc_socket_check_closed(0); } static void test_mongoc_socket_timed_out(void *ctx) { BSON_UNUSED(ctx); _test_mongoc_socket_check_closed(1000); } static void test_mongoc_socket_sendv(void *ctx) { socket_test_data_t data = {0}; bson_thread_t threads[2]; int i, r; BSON_UNUSED(ctx); bson_mutex_init(&data.cond_mutex); mongoc_cond_init(&data.cond); r = mcommon_thread_create(threads, &sendv_test_server, &data); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, &sendv_test_client, &data); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_mutex_destroy(&data.cond_mutex); mongoc_cond_destroy(&data.cond); } static void test_mongoc_socket_poll_refusal(void *ctx) { mongoc_stream_poll_t *poller; mongoc_socket_t *sock; mongoc_stream_t *ssock; int64_t start; struct sockaddr_in ipv4_addr = {0}; BSON_UNUSED(ctx); ipv4_addr.sin_family = AF_INET; BSON_ASSERT(inet_pton(AF_INET, "127.0.0.1", &ipv4_addr.sin_addr)); ipv4_addr.sin_port = htons(12345); /* create a new non-blocking socket. */ sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); (void)mongoc_socket_connect(sock, (struct sockaddr *)&ipv4_addr, sizeof(ipv4_addr), 0); start = bson_get_monotonic_time(); ssock = mongoc_stream_socket_new(sock); poller = bson_malloc0(sizeof(*poller)); poller->revents = 0; poller->events = POLLOUT | POLLERR | POLLHUP; poller->stream = ssock; while (bson_get_monotonic_time() - start < 5000 * 1000) { BSON_ASSERT(mongoc_stream_poll(poller, 1, 10 * 1000) > 0); if (poller->revents & POLLHUP) { break; } } mongoc_stream_destroy(ssock); bson_free(poller); #ifdef _WIN32 ASSERT_WITHIN_TIME_INTERVAL((int)(bson_get_monotonic_time() - start), 1000 * 500, 1500 * 1000); #else ASSERT_WITHIN_TIME_INTERVAL((int)(bson_get_monotonic_time() - start), 0, 500); #endif } void test_socket_install(TestSuite *suite) { TestSuite_Add(suite, "/Socket/check_closed", test_mongoc_socket_check_closed); TestSuite_AddFull( suite, "/Socket/timed_out [timeout:30]", test_mongoc_socket_timed_out, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull( suite, "/Socket/sendv [timeout:30]", test_mongoc_socket_sendv, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Socket/connect_refusal [timeout:30]", test_mongoc_socket_poll_refusal, NULL, NULL, test_framework_skip_if_slow); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-speculative-auth.c000066400000000000000000000461211511661753600261510ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #ifdef _POSIX_VERSION #include #endif #include #include #include #include #include #include #include #include #include typedef void (*setup_uri_options_t)(mongoc_uri_t *uri); typedef void (*compare_auth_command_t)(bson_t *auth_command); typedef void (*post_handshake_commands_t)(mock_server_t *server); #ifdef MONGOC_ENABLE_CRYPTO /* For single threaded clients, we execute a command to cause a hello to be * sent */ static future_t * _force_hello_with_ping(mongoc_client_t *client) { future_t *future; ASSERT(client); /* Send a ping */ future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); ASSERT(future); return future; } /* Call after we've dealt with the hello sent by * _force_hello_with_ping */ static void _respond_to_ping(future_t *future, mock_server_t *server, bool expect_ping) { request_t *request; ASSERT(future); if (!expect_ping) { BSON_ASSERT(!future_get_bool(future)); future_destroy(future); return; } request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); ASSERT(request); reply_to_request_simple(request, "{'ok': 1}"); ASSERT(future_get_bool(future)); request_destroy(request); future_destroy(future); } static bool _auto_hello_without_speculative_auth(request_t *request, void *data) { const char *response_json = (const char *)data; char *quotes_replaced; if (!request->is_command) { return false; } if (strcasecmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) && strcmp(request->command_name, "hello")) { return false; } if (bson_has_field(request_get_doc(request, 0), "speculativeAuthenticate")) { return false; } quotes_replaced = single_quotes_to_double(response_json); if (mock_server_get_rand_delay(request->server)) { int rand_ms = rand() % 10; mlib_sleep_for(rand_ms, ms); } reply_to_request(request, MONGOC_REPLY_NONE, 0, 0, 1, response_json); bson_free(quotes_replaced); request_destroy(request); return true; } static void _test_mongoc_speculative_auth(bool pooled, bool use_ssl, setup_uri_options_t setup_uri_options, bool includes_speculative_auth, compare_auth_command_t compare_auth_command, bson_t *speculative_auth_response, post_handshake_commands_t post_hello_commands, bool expect_successful_ping) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; future_t *future; mongoc_ssl_opt_t client_ssl_opts = {0}; mongoc_ssl_opt_t server_ssl_opts = {0}; client_ssl_opts.ca_file = CERT_CA; client_ssl_opts.pem_file = CERT_CLIENT; server_ssl_opts.ca_file = CERT_CA; server_ssl_opts.pem_file = CERT_SERVER; server = mock_server_new(); #ifdef MONGOC_ENABLE_SSL if (use_ssl) { mock_server_set_ssl_opts(server, &server_ssl_opts); } #endif mock_server_autoresponds(server, _auto_hello_without_speculative_auth, (void *)tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX), NULL); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 15000); if (setup_uri_options) { setup_uri_options(uri); } if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL if (use_ssl) { mongoc_client_pool_set_ssl_opts(pool, &client_ssl_opts); } #endif /* Force topology scanner to start */ client = mongoc_client_pool_pop(pool); /* suppress the auth failure logs from pooled clients. */ capture_logs(true); } else { client = test_framework_client_new_from_uri(uri, NULL); #ifdef MONGOC_ENABLE_SSL if (use_ssl) { mongoc_client_set_ssl_opts(client, &client_ssl_opts); } #endif } future = _force_hello_with_ping(client); if (includes_speculative_auth) { request_t *request; const bson_t *request_doc; bson_t *response; char *str; request = mock_server_receives_any_hello(server); ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); ASSERT(bson_has_field(request_doc, "speculativeAuthenticate")); if (compare_auth_command) { bson_t auth_cmd; bson_lookup_doc(request_doc, "speculativeAuthenticate", &auth_cmd); compare_auth_command(&auth_cmd); } /* Include authentication information in response */ response = BCON_NEW("ok", BCON_INT32(1), "isWritablePrimary", BCON_BOOL(true), "minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX)); if (speculative_auth_response) { BSON_APPEND_DOCUMENT(response, "speculativeAuthenticate", speculative_auth_response); } str = bson_as_canonical_extended_json(response, NULL); reply_to_request_simple(request, str); bson_free(str); bson_destroy(response); request_destroy(request); } if (post_hello_commands) { post_hello_commands(server); } _respond_to_ping(future, server, expect_successful_ping); /* Cleanup */ if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mock_server_destroy(server); } static void _setup_speculative_auth_scram(mongoc_uri_t *uri) { mongoc_uri_set_username(uri, "sasl"); mongoc_uri_set_password(uri, "sasl"); } static void _compare_auth_cmd_scram(bson_t *auth_cmd) { bson_iter_t iter; ASSERT(bson_has_field(auth_cmd, "saslStart")); ASSERT(bson_has_field(auth_cmd, "payload")); ASSERT(bson_iter_init_find(&iter, auth_cmd, "db")); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "admin"); } static void _post_hello_scram_invalid_auth_response(mock_server_t *srv) { request_t *request; const bson_t *request_doc; request = mock_server_receives_msg(srv, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin'}")); ASSERT(request); request_doc = request_get_doc(request, 0); ASSERT(request_doc); /* Speculative authentication was not successful because the mock server * can't respond with a valid scram payload. This results in a new * authentication attempt being started using an explicit saslStart command. */ ASSERT_CMPSTR(request->command_name, "saslStart"); /* Let authentication fail directly since we won't be able to continue the * scram conversation. */ reply_to_request_simple(request, "{ 'ok': 1, 'errmsg': 'Cannot mock scram auth conversation' }"); request_destroy(request); } static void test_mongoc_speculative_auth_request_none(void) { _test_mongoc_speculative_auth(false, false, NULL, false, NULL, NULL, NULL, true); } static void test_mongoc_speculative_auth_request_none_pool(void) { _test_mongoc_speculative_auth(true, false, NULL, false, NULL, NULL, NULL, true); } #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static void _setup_speculative_auth_x_509(mongoc_uri_t *uri) { mongoc_uri_set_auth_mechanism(uri, "MONGODB-X509"); mongoc_uri_set_username(uri, "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"); } static void _compare_auth_cmd_x509(bson_t *auth_cmd) { bson_t *expected_auth_cmd = BCON_NEW("authenticate", BCON_INT32(1), "mechanism", BCON_UTF8("MONGODB-X509"), "user", BCON_UTF8("CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"), "db", BCON_UTF8("$external")); char *auth_cmd_str = bson_as_canonical_extended_json(auth_cmd, NULL); char *expected_auth_cmd_str = bson_as_canonical_extended_json(expected_auth_cmd, NULL); ASSERT_CMPSTR(auth_cmd_str, expected_auth_cmd_str); bson_free(auth_cmd_str); bson_free(expected_auth_cmd_str); bson_destroy(expected_auth_cmd); } static void test_mongoc_speculative_auth_request_x509(void) { bson_t *response = BCON_NEW("dbname", BCON_UTF8("$external"), "user", BCON_UTF8("CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=" "myState,C=myCountry")); _test_mongoc_speculative_auth( false, true, _setup_speculative_auth_x_509, true, _compare_auth_cmd_x509, response, NULL, true); bson_destroy(response); } static void test_mongoc_speculative_auth_request_x509_pool(void) { bson_t *response = BCON_NEW("dbname", BCON_UTF8("$external"), "user", BCON_UTF8("CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=" "myState,C=myCountry")); _test_mongoc_speculative_auth( true, true, _setup_speculative_auth_x_509, true, _compare_auth_cmd_x509, response, NULL, true); bson_destroy(response); } // test_mongoc_speculative_auth_request_x509_network_error is a regression test // for CDRIVER-4635. static void test_mongoc_speculative_auth_request_x509_network_error(void) { // Start mock server. mock_server_t *server; { mongoc_ssl_opt_t server_ssl_opts = {0}; server_ssl_opts.ca_file = CERT_CA; server_ssl_opts.pem_file = CERT_SERVER; server = mock_server_new(); mock_server_set_ssl_opts(server, &server_ssl_opts); mock_server_run(server); } // Create URI configured for X509 authentication. mongoc_uri_t *uri; { uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 15000); _setup_speculative_auth_x_509(uri); } // Create single threaded client. mongoc_client_t *client; { mongoc_ssl_opt_t client_ssl_opts = {0}; client_ssl_opts.ca_file = CERT_CA; client_ssl_opts.pem_file = CERT_CLIENT; client = test_framework_client_new_from_uri(uri, NULL); ASSERT(client); mongoc_client_set_ssl_opts(client, &client_ssl_opts); } // Send a ping, and receive a network error. { bson_error_t error; // Send ping. future_t *future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); // Expect a hello including speculativeAuthenticate field. { request_t *request = mock_server_receives_any_hello(server); ASSERT(request); const bson_t *request_doc = request_get_doc(request, 0); ASSERT(request_doc); char *request_str = bson_as_canonical_extended_json(request_doc, NULL); ASSERT_WITH_MSG(bson_has_field(request_doc, "speculativeAuthenticate"), "expected hello to contain 'speculativeAuthenticate', got: %s", request_str); // Respond with a non-empty document "speculativeAuthenticate" field. // The C driver will interpret this as a successful X509 // authentication. bson_t *response = BCON_NEW("ok", BCON_INT32(1), "isWritablePrimary", BCON_BOOL(true), "minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "speculativeAuthenticate", "{", "foo", "bar", "}"); char *response_str = bson_as_canonical_extended_json(response, NULL); reply_to_request_simple(request, response_str); bson_free(response_str); bson_destroy(response); bson_free(request_str); request_destroy(request); } // Expect a ping command. Respond with a network error. { request_t *request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'ping': 1}")); ASSERT(request); // Cause a network error. reply_to_request_with_hang_up(request); request_destroy(request); } // Expect error. ASSERT(!future_get_bool(future)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); future_destroy(future); } // Send another ping, expect another "speculativeAuthenticate" attempt. { bson_error_t error; // Send ping. future_t *future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); // Expect a hello including speculativeAuthenticate field. { request_t *request = mock_server_receives_any_hello(server); ASSERT(request); const bson_t *request_doc = request_get_doc(request, 0); ASSERT(request_doc); char *request_str = bson_as_canonical_extended_json(request_doc, NULL); ASSERT_WITH_MSG(bson_has_field(request_doc, "speculativeAuthenticate"), "expected hello to contain 'speculativeAuthenticate', got: %s", request_str); // Respond with a non-empty document "speculativeAuthenticate" field. // The C driver will interpret this as a successful X509 // authentication. bson_t *response = BCON_NEW("ok", BCON_INT32(1), "isWritablePrimary", BCON_BOOL(true), "minWireVersion", BCON_INT32(WIRE_VERSION_MIN), "maxWireVersion", BCON_INT32(WIRE_VERSION_MAX), "speculativeAuthenticate", "{", "foo", "bar", "}"); char *response_str = bson_as_canonical_extended_json(response, NULL); reply_to_request_simple(request, response_str); bson_free(response_str); bson_destroy(response); request_destroy(request); bson_free(request_str); } // Expect a ping command. Respond with {"ok": 1}. { request_t *request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'ping': 1}")); ASSERT(request); reply_to_request_with_ok_and_destroy(request); } // Expect success. ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); } mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } #endif // defined(MONGOC_ENABLE_SSL_OPENSSL) || // defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static void test_mongoc_speculative_auth_request_scram(void) { bson_t *response = BCON_NEW( "conversationId", BCON_INT32(15081984), "payload", BCON_BIN(BSON_SUBTYPE_BINARY, (const uint8_t *)"deadbeef", 8)); _test_mongoc_speculative_auth(false, false, _setup_speculative_auth_scram, true, _compare_auth_cmd_scram, response, _post_hello_scram_invalid_auth_response, false); bson_destroy(response); } static void test_mongoc_speculative_auth_request_scram_pool(void) { bson_t *response = BCON_NEW( "conversationId", BCON_INT32(15081984), "payload", BCON_BIN(BSON_SUBTYPE_BINARY, (const uint8_t *)"deadbeef", 8)); _test_mongoc_speculative_auth(true, false, _setup_speculative_auth_scram, true, _compare_auth_cmd_scram, response, _post_hello_scram_invalid_auth_response, false); bson_destroy(response); } #endif /* MONGOC_ENABLE_CRYPTO */ void test_speculative_auth_install(TestSuite *suite) { #ifdef MONGOC_ENABLE_CRYPTO TestSuite_AddMockServerTest(suite, "/speculative_auth/request_none", test_mongoc_speculative_auth_request_none); TestSuite_AddMockServerTest(suite, "/speculative_auth/request_scram", test_mongoc_speculative_auth_request_scram); TestSuite_AddMockServerTest( suite, "/speculative_auth_pool/request_none", test_mongoc_speculative_auth_request_none_pool); #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) TestSuite_AddMockServerTest(suite, "/speculative_auth/request_x509", test_mongoc_speculative_auth_request_x509); TestSuite_AddMockServerTest( suite, "/speculative_auth_pool/request_x509", test_mongoc_speculative_auth_request_x509_pool); TestSuite_AddMockServerTest( suite, "/speculative_auth/request_x509/network_error", test_mongoc_speculative_auth_request_x509_network_error); #endif /* MONGOC_ENABLE_SSL_* */ TestSuite_AddMockServerTest( suite, "/speculative_auth_pool/request_scram", test_mongoc_speculative_auth_request_scram_pool); #endif /* MONGOC_ENABLE_CRYPTO */ } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-ssl.c000066400000000000000000000230071511661753600234650ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #ifdef MONGOC_ENABLE_SSL #include typedef struct { const char *description; const char *bson; const char *expect_error; const char *expect_pem_file; const char *expect_pem_pwd; const char *expect_ca_file; bool expect_weak_cert_validation; bool expect_allow_invalid_hostname; bool expect_disable_ocsp_endpoint_check; bool expect_disable_certificate_revocation_check; } testcase_t; /* The following are the only valid options for _mongoc_ssl_opts_from_bson: MONGOC_URI_TLSCERTIFICATEKEYFILE "tlscertificatekeyfile" MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD "tlscertificatekeyfilepassword" MONGOC_URI_TLSCAFILE "tlscafile" MONGOC_URI_TLSALLOWINVALIDCERTIFICATES "tlsallowinvalidcertificates" MONGOC_URI_TLSALLOWINVALIDHOSTNAMES "tlsallowinvalidhostnames" MONGOC_URI_TLSINSECURE "tlsinsecure" MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK "tlsdisablecertificaterevocationcheck" MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK "tlsdisableocspendpointcheck" */ static void test_mongoc_ssl_opts_from_bson(void) { testcase_t tests[] = {{ "test all options set", "{'tlsCertificateKeyFile': 'test_pem_file', " "'tlsCertificateKeyFilePassword': 'test_pem_pwd', 'tlsCAFile': " "'test_ca_file', 'tlsAllowInvalidCertificates': true, " "'tlsAllowInvalidHostnames': true, 'tlsInsecure': true, " "'tlsDisableCertificateRevocationCheck': true, " "'tlsDisableOCSPEndpointCheck': true }", NULL /* expect_error */, "test_pem_file" /* pem_file */, "test_pem_pwd" /* pem_pwd */, "test_ca_file" /* ca_file */, true /* weak_cert_validation */, true /* allow_invalid_hostname */, true /* disable_ocsp_endpoint_check */, true /* disable_certificate_revocation_check */ }, { "test options are case insentive", "{'tlscertificatekeyfile': 'test_pem_file', " "'tlscertificatekeyfilepassword': 'test_pem_pwd', 'tlscafile': " "'test_ca_file', 'tlsallowinvalidcertificates': true, " "'tlsallowinvalidhostnames': true, 'tlsinsecure': true, " "'tlsdisablecertificaterevocationcheck': true, " "'tlsdisableocspendpointcheck': true }", NULL /* expect_error */, "test_pem_file" /* pem_file */, "test_pem_pwd" /* pem_pwd */, "test_ca_file" /* ca_file */, true /* weak_cert_validation */, true /* allow_invalid_hostname */, true /* disable_ocsp_endpoint_check */, true /* disable_certificate_revocation_check */ }, { "test no options set", "{}", NULL /* expect_error */, NULL /* pem_file */, NULL /* pem_pwd */, NULL /* ca_file */, false /* weak_cert_validation */, false /* allow_invalid_hostname */, false /* disable_ocsp_endpoint_check */, false /* disable_certificate_revocation_check */ }, { "test tlsInsecure overrides tlsAllowInvalidHostnames and " "tlsAllowInvalidCertificates set", "{'tlsInsecure': true, 'tlsAllowInvalidHostnames': false, " "'tlsAllowInvalidCertificates': false}", NULL /* expect_error */, NULL /* pem_file */, NULL /* pem_pwd */, NULL /* ca_file */, true /* weak_cert_validation */, true /* allow_invalid_hostname */, false /* disable_ocsp_endpoint_check */, false /* disable_certificate_revocation_check */ }, { "test unrecognized option", "{'foo': true }", "unexpected BOOL option: foo" /* expect_error */, NULL /* pem_file */, NULL /* pem_pwd */, NULL /* ca_file */, false /* weak_cert_validation */, false /* allow_invalid_hostname */, false /* disable_ocsp_endpoint_check */, false /* disable_certificate_revocation_check */ }, { "test wrong value type", "{'tlsCaFile': true }", "unexpected BOOL option: tlsCaFile" /* expect_error */, NULL /* pem_file */, NULL /* pem_pwd */, NULL /* ca_file */, false /* weak_cert_validation */, false /* allow_invalid_hostname */, false /* disable_ocsp_endpoint_check */, false /* disable_certificate_revocation_check */ }, {0}}; testcase_t *test; for (test = tests; test->bson != NULL; test++) { mongoc_ssl_opt_t ssl_opt = {0}; mcommon_string_append_t errmsg; mcommon_string_new_as_append(&errmsg); bool ok = _mongoc_ssl_opts_from_bson(&ssl_opt, tmp_bson(test->bson), &errmsg); MONGOC_DEBUG("testcase: %s", test->bson); if (test->expect_error) { ASSERT_CONTAINS(mcommon_str_from_append(&errmsg), test->expect_error); ASSERT(!ok); } else { if (!ok) { test_error("unexpected error parsing: %s", mcommon_str_from_append(&errmsg)); } } if (!test->expect_pem_file) { ASSERT(!ssl_opt.pem_file); } else { ASSERT(ssl_opt.pem_file); ASSERT_CMPSTR(test->expect_pem_file, ssl_opt.pem_file); } if (!test->expect_pem_pwd) { ASSERT(!ssl_opt.pem_pwd); } else { ASSERT(ssl_opt.pem_pwd); ASSERT_CMPSTR(test->expect_pem_pwd, ssl_opt.pem_pwd); } if (!test->expect_ca_file) { ASSERT(!ssl_opt.ca_file); } else { ASSERT(ssl_opt.ca_file); ASSERT_CMPSTR(test->expect_ca_file, ssl_opt.ca_file); } ASSERT(test->expect_weak_cert_validation == ssl_opt.weak_cert_validation); ASSERT(test->expect_allow_invalid_hostname == ssl_opt.allow_invalid_hostname); ASSERT(test->expect_disable_ocsp_endpoint_check == _mongoc_ssl_opts_disable_ocsp_endpoint_check(&ssl_opt)); ASSERT(test->expect_disable_certificate_revocation_check == _mongoc_ssl_opts_disable_certificate_revocation_check(&ssl_opt)); /* It is not possible to set ca_dir or crl_file. */ ASSERT(!ssl_opt.ca_dir); ASSERT(!ssl_opt.crl_file); _mongoc_ssl_opts_cleanup(&ssl_opt, true /* free_internal */); mcommon_string_from_append_destroy(&errmsg); } } /* Test that it is safe to call _mongoc_ssl_opts_cleanup on a zero'd struct. */ static void test_mongoc_ssl_opts_cleanup_zero(void) { mongoc_ssl_opt_t ssl_opt = {0}; _mongoc_ssl_opts_cleanup(&ssl_opt, true /* free_internal */); _mongoc_ssl_opts_cleanup(&ssl_opt, false /* free_internal */); } // `test_non_existant_cafile` is a regression test for CDRIVER-5736. static void test_non_existant_cafile(void) { mongoc_client_t *client = mongoc_client_new("mongodb://localhost:27017/?tls=true&tlsCAFile=/nonexistant/ca.pem"); // Ignore return. May return true on Windows hosts. See CDRIVER-5747. mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL); mongoc_client_destroy(client); } #endif /* MONGOC_ENABLE_SSL */ void test_ssl_install(TestSuite *suite) { #ifdef MONGOC_ENABLE_SSL TestSuite_Add(suite, "/ssl_opt/from_bson", test_mongoc_ssl_opts_from_bson); TestSuite_Add(suite, "/ssl_opt/cleanup", test_mongoc_ssl_opts_cleanup_zero); TestSuite_Add(suite, "/ssl_opt/non-existant-cafile", test_non_existant_cafile); #endif /* MONGOC_ENABLE_SSL */ } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-stream-tls-error.c000066400000000000000000000274761511661753600261240ustar00rootroot00000000000000#include #include #include #include #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #include #include #include #include #define TIMEOUT 10000 /* milliseconds */ #if !defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) && !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) /** run as a child thread by test_mongoc_tls_hangup * * It: * 1. spins up * 2. binds and listens to a random port * 3. notifies the client of its port through a condvar * 4. accepts a request * 5. reads a byte * 7. hangs up */ static BSON_THREAD_FUN(ssl_error_server, ptr) { ssl_test_data_t *data = (ssl_test_data_t *)ptr; mongoc_stream_t *sock_stream; mongoc_stream_t *ssl_stream; mongoc_socket_t *listen_sock; mongoc_socket_t *conn_sock; mongoc_socklen_t sock_len; char buf; ssize_t r; mongoc_iovec_t iov; struct sockaddr_in server_addr = {0}; bson_error_t error; iov.iov_base = &buf; iov.iov_len = 1; listen_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(listen_sock); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); server_addr.sin_port = htons(0); r = mongoc_socket_bind(listen_sock, (struct sockaddr *)&server_addr, sizeof server_addr); BSON_ASSERT(r == 0); sock_len = sizeof(server_addr); r = mongoc_socket_getsockname(listen_sock, (struct sockaddr *)&server_addr, &sock_len); BSON_ASSERT(r == 0); r = mongoc_socket_listen(listen_sock, 10); BSON_ASSERT(r == 0); bson_mutex_lock(&data->cond_mutex); data->server_port = ntohs(server_addr.sin_port); mongoc_cond_signal(&data->cond); bson_mutex_unlock(&data->cond_mutex); conn_sock = mongoc_socket_accept(listen_sock, -1); BSON_ASSERT(conn_sock); sock_stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(sock_stream); ssl_stream = mongoc_stream_tls_new_with_hostname(sock_stream, data->host, data->server, 0); BSON_ASSERT(ssl_stream); switch (data->behavior) { case SSL_TEST_BEHAVIOR_STALL_BEFORE_HANDSHAKE: mlib_sleep_for(data->handshake_stall_ms, ms); break; case SSL_TEST_BEHAVIOR_HANGUP_AFTER_HANDSHAKE: r = mongoc_stream_tls_handshake_block(ssl_stream, data->host, TIMEOUT, &error); BSON_ASSERT(r); r = mongoc_stream_readv(ssl_stream, &iov, 1, 1, TIMEOUT); BSON_ASSERT(r == 1); break; case SSL_TEST_BEHAVIOR_NORMAL: default: test_error("unimplemented ssl_test_behavior_t"); } data->server_result->result = SSL_TEST_SUCCESS; mongoc_stream_close(ssl_stream); mongoc_stream_destroy(ssl_stream); mongoc_socket_destroy(listen_sock); BSON_THREAD_RETURN; } #if !defined(__APPLE__) /** run as a child thread by test_mongoc_tls_hangup * * It: * 1. spins up * 2. waits on a condvar until the server is up * 3. connects to the server's port * 4. writes a byte * 5. confirms that the server hangs up promptly * 6. shuts down */ static BSON_THREAD_FUN(ssl_hangup_client, ptr) { ssl_test_data_t *data = (ssl_test_data_t *)ptr; mongoc_stream_t *sock_stream; mongoc_stream_t *ssl_stream; mongoc_socket_t *conn_sock; char buf = 'b'; ssize_t r; mongoc_iovec_t riov; mongoc_iovec_t wiov; struct sockaddr_in server_addr = {0}; int64_t start_time; bson_error_t error; conn_sock = mongoc_socket_new(AF_INET, SOCK_STREAM, 0); BSON_ASSERT(conn_sock); bson_mutex_lock(&data->cond_mutex); while (!data->server_port) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(data->server_port); server_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); r = mongoc_socket_connect(conn_sock, (struct sockaddr *)&server_addr, sizeof(server_addr), -1); BSON_ASSERT(r == 0); sock_stream = mongoc_stream_socket_new(conn_sock); BSON_ASSERT(sock_stream); ssl_stream = mongoc_stream_tls_new_with_hostname(sock_stream, data->host, data->client, 1); BSON_ASSERT(ssl_stream); r = mongoc_stream_tls_handshake_block(ssl_stream, data->host, TIMEOUT, &error); BSON_ASSERT(r); wiov.iov_base = (void *)&buf; wiov.iov_len = 1; r = mongoc_stream_writev(ssl_stream, &wiov, 1, TIMEOUT); BSON_ASSERT(r == 1); riov.iov_base = (void *)&buf; riov.iov_len = 1; /* we should notice promptly that the server hangs up */ start_time = bson_get_monotonic_time(); r = mongoc_stream_readv(ssl_stream, &riov, 1, 1, TIMEOUT); /* time is in microseconds */ BSON_ASSERT(bson_get_monotonic_time() - start_time < 1000 * 1000); BSON_ASSERT(r == -1); mongoc_stream_destroy(ssl_stream); data->client_result->result = SSL_TEST_SUCCESS; BSON_THREAD_RETURN; } static void test_mongoc_tls_hangup(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; ssl_test_data_t data = {0}; bson_thread_t threads[2]; int i, r; sopt.pem_file = CERT_SERVER; sopt.weak_cert_validation = 1; copt.weak_cert_validation = 1; data.server = &sopt; data.client = &copt; data.behavior = SSL_TEST_BEHAVIOR_HANGUP_AFTER_HANDSHAKE; data.server_result = &sr; data.client_result = &cr; data.host = "localhost"; bson_mutex_init(&data.cond_mutex); mongoc_cond_init(&data.cond); r = mcommon_thread_create(threads, &ssl_error_server, &data); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, &ssl_hangup_client, &data); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_mutex_destroy(&data.cond_mutex); mongoc_cond_destroy(&data.cond); ASSERT(cr.result == SSL_TEST_SUCCESS); ASSERT(sr.result == SSL_TEST_SUCCESS); } #endif /** run as a child thread by test_mongoc_tls_handshake_stall * * It: * 1. spins up * 2. waits on a condvar until the server is up * 3. connects to the server's port * 4. attempts handshake * 5. confirms that it times out * 6. shuts down */ static BSON_THREAD_FUN(handshake_stall_client, ptr) { ssl_test_data_t *data = (ssl_test_data_t *)ptr; char *uri_str; mongoc_client_t *client; bson_t reply; bson_error_t error; int64_t connect_timeout_ms = data->handshake_stall_ms - 100; int64_t duration_ms; int64_t start_time; bson_mutex_lock(&data->cond_mutex); while (!data->server_port) { mongoc_cond_wait(&data->cond, &data->cond_mutex); } bson_mutex_unlock(&data->cond_mutex); /* Note: do not use localhost here. If localhost has both A and AAAA records, * an attempt to connect to IPv6 occurs first. Most platforms refuse the IPv6 * attempt immediately, so IPv4 succeeds immediately. Windows is an * exception, and waits 1 second before refusing: * https://support.microsoft.com/en-us/help/175523/info-winsock-tcp-connection-performance-to-unused-ports */ uri_str = bson_strdup_printf("mongodb://127.0.0.1:%u/" "?ssl=true&serverselectiontimeoutms=200&" "connecttimeoutms=%" PRId64, data->server_port, connect_timeout_ms); client = test_framework_client_new(uri_str, NULL); mongoc_client_set_ssl_opts(client, data->client); /* we should time out after about 200ms */ start_time = bson_get_monotonic_time(); mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &reply, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "socket timeout"); /* time is in microseconds */ duration_ms = (bson_get_monotonic_time() - start_time) / 1000; if (llabs(duration_ms - connect_timeout_ms) > 100) { test_error("expected timeout after about 200ms, not %" PRId64, duration_ms); } data->client_result->result = SSL_TEST_SUCCESS; bson_destroy(&reply); mongoc_client_destroy(client); bson_free(uri_str); BSON_THREAD_RETURN; } /* CDRIVER-2222 this should be reenabled for Apple Secure Transport too */ #if !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static void test_mongoc_tls_handshake_stall(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; ssl_test_data_t data = {0}; bson_thread_t threads[2]; int i, r; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; sopt.weak_cert_validation = 1; copt.ca_file = CERT_CA; copt.weak_cert_validation = 1; data.server = &sopt; data.client = &copt; data.behavior = SSL_TEST_BEHAVIOR_STALL_BEFORE_HANDSHAKE; data.handshake_stall_ms = 300; data.server_result = &sr; data.client_result = &cr; data.host = "localhost"; bson_mutex_init(&data.cond_mutex); mongoc_cond_init(&data.cond); r = mcommon_thread_create(threads, &ssl_error_server, &data); BSON_ASSERT(r == 0); r = mcommon_thread_create(threads + 1, &handshake_stall_client, &data); BSON_ASSERT(r == 0); for (i = 0; i < 2; i++) { r = mcommon_thread_join(threads[i]); BSON_ASSERT(r == 0); } bson_mutex_destroy(&data.cond_mutex); mongoc_cond_destroy(&data.cond); ASSERT(cr.result == SSL_TEST_SUCCESS); ASSERT(sr.result == SSL_TEST_SUCCESS); } #endif /* !MONGOC_ENABLE_SSL_SECURE_TRANSPORT */ #endif /* !MONGOC_ENABLE_SSL_SECURE_CHANNEL */ /* TLS stream should be NULL and base stream should still be valid, and error * messages should be consistent across TLS libs. Until CDRIVER-2844, just * assert message includes the filename, and handle NULL or non-NULL return. */ #define TLS_LOAD_ERR(_field) \ do { \ (_field) = "badfile"; \ capture_logs(true); \ base = mongoc_stream_socket_new(mongoc_socket_new(AF_INET, SOCK_STREAM, 0)); \ tls_stream = mongoc_stream_tls_new_with_hostname(base, NULL, &opt, 0); \ \ ASSERT_CAPTURED_LOG("bad TLS config file", MONGOC_LOG_LEVEL_ERROR, "badfile"); \ \ if (tls_stream) { \ mongoc_stream_destroy(tls_stream); \ } else { \ mongoc_stream_destroy(base); \ } \ \ opt.pem_file = opt.ca_file = opt.ca_dir = opt.crl_file = NULL; \ } while (0) static void test_mongoc_tls_load_files(void) { mongoc_ssl_opt_t opt = {0}; mongoc_stream_t *base; mongoc_stream_t *tls_stream = NULL; TLS_LOAD_ERR(opt.pem_file); TLS_LOAD_ERR(opt.ca_file); } void test_stream_tls_error_install(TestSuite *suite) { #if !defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) #if !defined(__APPLE__) TestSuite_Add(suite, "/TLS/hangup", test_mongoc_tls_hangup); #endif /* see CDRIVER-2222 this occasionally stalls for a few 100ms on Mac */ #if !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) TestSuite_Add(suite, "/TLS/handshake_stall", test_mongoc_tls_handshake_stall); #endif #endif /* !MONGOC_ENABLE_SSL_SECURE_CHANNEL */ TestSuite_Add(suite, "/TLS/load_files", test_mongoc_tls_load_files); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-stream-tls.c000066400000000000000000000262321511661753600247620ustar00rootroot00000000000000#include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #include #include #include #include #if !defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) static void test_mongoc_tls_no_certs(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; capture_logs(true); /* No server cert is not valid TLS at all */ ssl_test(&copt, &sopt, "doesnt_matter", &cr, &sr); ASSERT_CMPINT(cr.result, !=, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, !=, SSL_TEST_SUCCESS); } #ifdef MONGOC_ENABLE_SSL_OPENSSL static void test_mongoc_tls_password(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_PASSWORD_PROTECTED; copt.pem_pwd = CERT_PASSWORD; /* Password protected key */ ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_bad_password(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_PASSWORD_PROTECTED; copt.pem_pwd = "incorrect password"; capture_logs(true); /* Incorrect password cannot unlock the key */ ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SSL_HANDSHAKE); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SSL_INIT); /* Change it to the right password */ copt.pem_pwd = CERT_PASSWORD; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #endif static void test_mongoc_tls_no_verify(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; /* Weak cert validation allows never fails */ copt.weak_cert_validation = 1; ssl_test(&copt, &sopt, "bad_domain.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_allow_invalid_hostname(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; copt.allow_invalid_hostname = 1; /* Connect to a domain not listed in the cert */ ssl_test(&copt, &sopt, "bad_domain.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_bad_verify(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; capture_logs(true); ssl_test(&copt, &sopt, "bad_domain.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SSL_HANDSHAKE); ASSERT_CMPINT(sr.result, !=, SSL_TEST_SUCCESS); /* weak_cert_validation allows bad domains */ copt.weak_cert_validation = 1; ssl_test(&copt, &sopt, "bad_domain.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_basic(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #ifdef MONGOC_ENABLE_SSL_OPENSSL static void test_mongoc_tls_weak_cert_validation(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.crl_file = CERT_CRL; copt.pem_file = CERT_CLIENT; capture_logs(true); /* Certificate has has been revoked, this should fail */ ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SSL_HANDSHAKE); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SSL_HANDSHAKE); /* weak_cert_validation allows revoked certs */ copt.weak_cert_validation = 1; ssl_test(&copt, &sopt, "bad_domain.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_crl(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); copt.crl_file = CERT_CRL; capture_logs(true); ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SSL_HANDSHAKE); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SSL_HANDSHAKE); /* Weak cert validation allows revoked */ copt.weak_cert_validation = true; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #endif static void test_mongoc_tls_expired(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_EXPIRED; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; capture_logs(true); ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SSL_HANDSHAKE); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SSL_HANDSHAKE); /* Weak cert validation allows expired certs */ copt.weak_cert_validation = true; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #if !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static void test_mongoc_tls_common_name(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_COMMONNAME; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; /* Match against commonName */ ssl_test(&copt, &sopt, "commonName.mongodb.org", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #endif // !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) static void test_mongoc_tls_altname(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_ALTNAME; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; /* Match against secondary Subject Alternative Name (SAN) */ ssl_test(&copt, &sopt, "alternative.mongodb.com", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } static void test_mongoc_tls_wild(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_WILD; copt.ca_file = CERT_CA; copt.pem_file = CERT_CLIENT; ssl_test(&copt, &sopt, "anything.mongodb.org", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #ifdef MONGOC_ENABLE_SSL_OPENSSL static void test_mongoc_tls_ip(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; copt.ca_file = CERT_CA; ssl_test(&copt, &sopt, "127.0.0.1", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #endif #if !defined(__APPLE__) && !defined(_WIN32) && defined(MONGOC_ENABLE_SSL_OPENSSL) && \ OPENSSL_VERSION_NUMBER >= 0x10000000L static void test_mongoc_tls_trust_dir(void) { mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; ssl_test_result_t sr; ssl_test_result_t cr; sopt.pem_file = CERT_SERVER; sopt.ca_file = CERT_CA; copt.ca_dir = CERT_TEST_DIR; ssl_test(&copt, &sopt, "localhost", &cr, &sr); ASSERT_CMPINT(cr.result, ==, SSL_TEST_SUCCESS); ASSERT_CMPINT(sr.result, ==, SSL_TEST_SUCCESS); } #endif #endif /* !MONGOC_ENABLE_SSL_SECURE_CHANNEL */ void test_mongoc_tls_insecure_nowarning(void) { mongoc_uri_t *uri; mongoc_client_t *client; if (!test_framework_get_ssl()) { return; } uri = test_framework_get_uri(); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_TLSINSECURE, true); client = test_framework_client_new_from_uri(uri, NULL); capture_logs(true); mongoc_client_command_simple( client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, NULL /* error */); ASSERT_NO_CAPTURED_LOGS("has no effect"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } void test_stream_tls_install(TestSuite *suite) { BSON_UNUSED(suite); #if !defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) /* Disable /TLS/commonName on macOS due to CDRIVER-4256. */ #if !defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) TestSuite_Add(suite, "/TLS/commonName", test_mongoc_tls_common_name); #endif TestSuite_Add(suite, "/TLS/altname", test_mongoc_tls_altname); TestSuite_Add(suite, "/TLS/basic", test_mongoc_tls_basic); TestSuite_Add(suite, "/TLS/allow_invalid_hostname", test_mongoc_tls_allow_invalid_hostname); TestSuite_Add(suite, "/TLS/wild", test_mongoc_tls_wild); TestSuite_Add(suite, "/TLS/no_verify", test_mongoc_tls_no_verify); TestSuite_Add(suite, "/TLS/bad_verify", test_mongoc_tls_bad_verify); TestSuite_Add(suite, "/TLS/no_certs", test_mongoc_tls_no_certs); TestSuite_Add(suite, "/TLS/expired", test_mongoc_tls_expired); #ifdef MONGOC_ENABLE_SSL_OPENSSL TestSuite_Add(suite, "/TLS/ip", test_mongoc_tls_ip); TestSuite_Add(suite, "/TLS/password", test_mongoc_tls_password); TestSuite_Add(suite, "/TLS/bad_password", test_mongoc_tls_bad_password); TestSuite_Add(suite, "/TLS/weak_cert_validation", test_mongoc_tls_weak_cert_validation); TestSuite_Add(suite, "/TLS/crl", test_mongoc_tls_crl); #endif #if !defined(__APPLE__) && !defined(_WIN32) && defined(MONGOC_ENABLE_SSL_OPENSSL) && \ OPENSSL_VERSION_NUMBER >= 0x10000000L TestSuite_Add(suite, "/TLS/trust_dir", test_mongoc_tls_trust_dir); #endif TestSuite_AddLive(suite, "/TLS/insecure_nowarning", test_mongoc_tls_insecure_nowarning); #endif } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-stream.c000066400000000000000000000163631511661753600241660ustar00rootroot00000000000000#include #include #include #include #include static void test_buffered_basic(void) { mongoc_stream_t *stream; mongoc_stream_t *buffered; mongoc_iovec_t iov; ssize_t r; char buf[16236]; stream = mongoc_stream_file_new_for_path(BINARY_DIR "/reply2.dat", O_RDONLY, 0); BSON_ASSERT(stream); /* buffered assumes ownership of stream */ buffered = mongoc_stream_buffered_new(stream, 1024); /* try to read large chunk larger than buffer. */ iov.iov_len = sizeof buf; iov.iov_base = buf; r = mongoc_stream_readv(buffered, &iov, 1, iov.iov_len, -1); if (mlib_cmp(r, !=, iov.iov_len)) { char msg[100]; bson_snprintf(msg, 100, "Expected %lld got %llu", (long long)r, (unsigned long long)iov.iov_len); ASSERT_CMPSTR(msg, "failed"); } /* cleanup */ mongoc_stream_destroy(buffered); } static void test_buffered_oversized(void) { mongoc_stream_t *stream; mongoc_stream_t *buffered; mongoc_iovec_t iov; ssize_t r; char buf[16236]; stream = mongoc_stream_file_new_for_path(BINARY_DIR "/reply2.dat", O_RDONLY, 0); BSON_ASSERT(stream); /* buffered assumes ownership of stream */ buffered = mongoc_stream_buffered_new(stream, 20000); /* try to read large chunk larger than buffer. */ iov.iov_len = sizeof buf; iov.iov_base = buf; r = mongoc_stream_readv(buffered, &iov, 1, iov.iov_len, -1); if (mlib_cmp(r, !=, iov.iov_len)) { char msg[100]; bson_snprintf(msg, 100, "Expected %lld got %llu", (long long)r, (unsigned long long)iov.iov_len); ASSERT_CMPSTR(msg, "failed"); } /* cleanup */ mongoc_stream_destroy(buffered); } typedef struct { mongoc_stream_t vtable; ssize_t rval; } failing_stream_t; static ssize_t failing_stream_writev(mongoc_stream_t *stream, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { failing_stream_t *fstream = (failing_stream_t *)stream; BSON_UNUSED(iov); BSON_UNUSED(iovcnt); BSON_UNUSED(timeout_msec); return fstream->rval; } void failing_stream_destroy(mongoc_stream_t *stream) { bson_free(stream); } static mongoc_stream_t * failing_stream_new(ssize_t rval) { failing_stream_t *stream; stream = bson_malloc0(sizeof *stream); stream->vtable.type = 999; stream->vtable.writev = failing_stream_writev; stream->vtable.destroy = failing_stream_destroy; stream->rval = rval; return (mongoc_stream_t *)stream; } static void test_stream_writev_full(void) { mongoc_stream_t *error_stream = failing_stream_new(-1); mongoc_stream_t *short_stream = failing_stream_new(10); mongoc_stream_t *success_stream = failing_stream_new(100); char bufa[20]; char bufb[80]; bool r; mongoc_iovec_t iov[2]; bson_error_t error = {0}; const char *error_message = "Failure during socket delivery: "; const char *short_message = "Failure to send all requested bytes (only " "sent: 10/100 in 100ms) during socket delivery"; iov[0].iov_base = bufa; iov[0].iov_len = sizeof(bufa); iov[1].iov_base = bufb; iov[1].iov_len = sizeof(bufb); errno = EINVAL; r = _mongoc_stream_writev_full(error_stream, iov, 2, 100, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_STREAM); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_STREAM_SOCKET); ASSERT_STARTSWITH(error.message, error_message); errno = 0; r = _mongoc_stream_writev_full(short_stream, iov, 2, 100, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_STREAM); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_STREAM_SOCKET); ASSERT_CMPSTR(error.message, short_message); errno = 0; r = _mongoc_stream_writev_full(success_stream, iov, 2, 100, &error); BSON_ASSERT(r); mongoc_stream_destroy(error_stream); mongoc_stream_destroy(short_stream); mongoc_stream_destroy(success_stream); } typedef struct { mongoc_stream_t vtable; int32_t timeout_msec; bool is_set; } writev_timeout_stream_t; static void _writev_timeout_stream_destroy(mongoc_stream_t *stream) { bson_free(stream); } static ssize_t _writev_timeout_stream_writev(mongoc_stream_t *stream_param, mongoc_iovec_t *iov, size_t iovcnt, int32_t timeout_msec) { BSON_UNUSED(iov); BSON_UNUSED(iovcnt); writev_timeout_stream_t *const stream = (writev_timeout_stream_t *)stream_param; stream->is_set = true; stream->timeout_msec = timeout_msec; return 0; } static writev_timeout_stream_t * _writev_timeout_stream_new(void) { writev_timeout_stream_t *const stream = bson_malloc(sizeof(writev_timeout_stream_t)); *stream = (writev_timeout_stream_t){ .vtable = { .type = 999, // For testing purposes. .destroy = _writev_timeout_stream_destroy, .writev = _writev_timeout_stream_writev, }, .is_set = false, .timeout_msec = 0, }; return stream; } static void test_stream_writev_timeout(void) { bson_error_t error; uint8_t data[1] = {0}; mongoc_iovec_t iov = {.iov_base = (void *)data, .iov_len = 1u}; // A positive timeout value should be forwarded as-is to the writev function. { writev_timeout_stream_t *const stream = _writev_timeout_stream_new(); ssize_t const res = _mongoc_stream_writev_full((mongoc_stream_t *)stream, &iov, 1u, MONGOC_DEFAULT_SOCKETTIMEOUTMS, &error); ASSERT_CMPSSIZE_T(res, ==, 0); ASSERT_WITH_MSG(stream->is_set, "expected _writev_timeout_stream_writev() to be invoked"); ASSERT_CMPINT32(stream->timeout_msec, ==, MONGOC_DEFAULT_SOCKETTIMEOUTMS); mongoc_stream_destroy((mongoc_stream_t *)stream); } // A timeout value of 0 should be forwarded as-is to the writev function. { writev_timeout_stream_t *const stream = _writev_timeout_stream_new(); ssize_t const res = _mongoc_stream_writev_full((mongoc_stream_t *)stream, &iov, 1u, 0, &error); ASSERT_CMPSSIZE_T(res, ==, 0); ASSERT_WITH_MSG(stream->is_set, "expected _writev_timeout_stream_writev() to be invoked"); ASSERT_CMPINT32(stream->timeout_msec, ==, 0); mongoc_stream_destroy((mongoc_stream_t *)stream); } // CDRIVER-4781: a negative timeout value will fallback to an unspecified // default value. The writev function should receive the unspecified default // timeout value rather than the negative timeout value. { // See: MONGOC_DEFAULT_TIMEOUT_MSEC in mongoc-stream.c. const int32_t default_timeout_msec = 60 * 60 * 1000; writev_timeout_stream_t *const stream = _writev_timeout_stream_new(); ssize_t const res = _mongoc_stream_writev_full((mongoc_stream_t *)stream, &iov, 1u, -1, &error); ASSERT_CMPSSIZE_T(res, ==, 0); ASSERT_WITH_MSG(stream->is_set, "expected _writev_timeout_stream_writev() to be invoked"); ASSERT_CMPINT32(stream->timeout_msec, ==, default_timeout_msec); mongoc_stream_destroy((mongoc_stream_t *)stream); } } void test_stream_install(TestSuite *suite) { TestSuite_Add(suite, "/Stream/buffered/basic", test_buffered_basic); TestSuite_Add(suite, "/Stream/buffered/oversized", test_buffered_oversized); TestSuite_Add(suite, "/Stream/writev/full", test_stream_writev_full); TestSuite_Add(suite, "/Stream/writev/timeout", test_stream_writev_timeout); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-streamable-hello.c000066400000000000000000000146001511661753600261030ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #define TV1 "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }" #define TV2 "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 2 }" static mongoc_server_description_t * _force_scan(mongoc_client_t *client, mock_server_t *server, const char *hello) { bson_error_t error; request_t *request; future_t *future; mongoc_server_description_t *sd; ASSERT(client); /* Mark the topology as "stale" to trigger a scan. */ client->topology->stale = true; future = future_client_select_server(client, true /* for writes */, NULL, &error); request = mock_server_receives_any_hello(server); reply_to_request_simple(request, hello); sd = future_get_mongoc_server_description_ptr(future); BSON_ASSERT(sd); future_destroy(future); request_destroy(request); return sd; } static void test_topology_version_update(void) { mongoc_client_t *client; mock_server_t *server; mongoc_server_description_t *sd; server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* Override minHeartbeatFrequencyMS so test does not wait for 500ms when a * scan is needed. */ client->topology->min_heartbeat_frequency_msec = 1; sd = _force_scan(client, server, tmp_str("{'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'topologyVersion': " TV1 "}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); ASSERT_MATCH(&sd->topology_version, TV1); mongoc_server_description_destroy(sd); /* Returned topology version with higher counter overrides. */ sd = _force_scan(client, server, tmp_str("{ 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'topologyVersion': " TV2 "}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); ASSERT_MATCH(&sd->topology_version, TV2); mongoc_server_description_destroy(sd); /* But returned topology version with lower counter does nothing. */ sd = _force_scan(client, server, tmp_str("{'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'topologyVersion': " TV1 "}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); ASSERT_MATCH(&sd->topology_version, TV2); mongoc_server_description_destroy(sd); /* Empty topology version overrides. */ sd = _force_scan(client, server, tmp_str("{'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_4_4)); BSON_ASSERT(bson_empty(&sd->topology_version)); mongoc_server_description_destroy(sd); mongoc_client_destroy(client); mock_server_destroy(server); } static char * _single_to_double(const char *in) { char *in_copy; char *iter; in_copy = bson_strdup(in); for (iter = in_copy; *iter; iter++) { if (*iter == '\'') { *iter = '"'; } } return in_copy; } static void _assert_topology_version_compare(const char *tv1, const char *tv2, int expected) { int actual; bson_t *tv1_bson; bson_t *tv2_bson; bson_error_t error; char *tv1_quoted = _single_to_double(tv1); char *tv2_quoted = _single_to_double(tv2); tv1_bson = bson_new_from_json((const uint8_t *)tv1_quoted, strlen(tv1_quoted), &error); ASSERT_OR_PRINT(tv1_bson, error); tv2_bson = bson_new_from_json((const uint8_t *)tv2_quoted, strlen(tv2_quoted), &error); ASSERT_OR_PRINT(tv2_bson, error); actual = mongoc_server_description_topology_version_cmp(tv1_bson, tv2_bson); ASSERT_CMPINT(actual, ==, expected); bson_free(tv1_quoted); bson_free(tv2_quoted); bson_destroy(tv1_bson); bson_destroy(tv2_bson); } static void test_topology_version_compare(void) { _assert_topology_version_compare("{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 2 }", -1); _assert_topology_version_compare("{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", 0); _assert_topology_version_compare("{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 2 }", "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", 1); /* Different process IDs always compare less. */ _assert_topology_version_compare("{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", "{ 'processId': { '$oid': 'CCCCCCCCCCCCCCCCCCCCCCCC' }, 'counter': 1 }", -1); /* Missing fields or malformed always compare less. */ _assert_topology_version_compare("{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", "{ }", -1); _assert_topology_version_compare("{ }", "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", -1); _assert_topology_version_compare( "{ 'counter': 2 }", "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }", -1); } void test_streamable_hello_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/streamable/topology_version/update", test_topology_version_update); TestSuite_Add(suite, "/streamable/topology_version/compare", test_topology_version_compare); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-structured-log.c000066400000000000000000001120361511661753600256500ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include typedef struct log_assumption { mongoc_structured_log_envelope_t expected_envelope; bson_t *expected_bson; int expected_calls; int calls; } log_assumption; static void structured_log_func(const mongoc_structured_log_entry_t *entry, void *user_data) { struct log_assumption *assumption = (struct log_assumption *)user_data; int calls = ++assumption->calls; ASSERT_CMPINT(calls, <=, assumption->expected_calls); ASSERT_CMPINT(entry->envelope.level, ==, assumption->expected_envelope.level); ASSERT_CMPINT(entry->envelope.component, ==, assumption->expected_envelope.component); ASSERT_CMPSTR(entry->envelope.message, assumption->expected_envelope.message); ASSERT_CMPSTR(entry->envelope.message, mongoc_structured_log_entry_get_message_string(entry)); ASSERT_CMPINT(entry->envelope.level, ==, mongoc_structured_log_entry_get_level(entry)); ASSERT_CMPINT(entry->envelope.component, ==, mongoc_structured_log_entry_get_component(entry)); // Each call to message_as_bson allocates an identical copy bson_t *bson_1 = mongoc_structured_log_entry_message_as_bson(entry); bson_t *bson_2 = mongoc_structured_log_entry_message_as_bson(entry); // Compare for exact bson equality *after* comparing json strings, to give a more user friendly error on most // failures char *json_actual = bson_as_relaxed_extended_json(bson_1, NULL); char *json_expected = bson_as_relaxed_extended_json(assumption->expected_bson, NULL); ASSERT_CMPSTR(json_actual, json_expected); ASSERT(bson_equal(bson_1, assumption->expected_bson)); ASSERT(bson_equal(bson_2, assumption->expected_bson)); bson_destroy(bson_2); bson_destroy(bson_1); bson_free(json_actual); bson_free(json_expected); } void test_structured_log_opts(void) { mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_WARNING)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, (mongoc_structured_log_component_t)12345)); ASSERT(!mongoc_structured_log_opts_set_max_level_for_all_components(opts, (mongoc_structured_log_level_t)-1)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_INFO)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, (mongoc_structured_log_component_t)12345)); ASSERT(!mongoc_structured_log_opts_set_max_level_for_component( opts, (mongoc_structured_log_component_t)-1, MONGOC_STRUCTURED_LOG_LEVEL_WARNING)); ASSERT(!mongoc_structured_log_opts_set_max_level_for_component( opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, (mongoc_structured_log_level_t)-1)); ASSERT(mongoc_structured_log_opts_set_max_level_for_component( opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, MONGOC_STRUCTURED_LOG_LEVEL_WARNING)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION)); mongoc_structured_log_opts_destroy(opts); } void test_structured_log_plain(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Plain log entry", .expected_bson = BCON_NEW("message", BCON_UTF8("Plain log entry")), .expected_calls = 1, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); /* Note about these max_document_length settings: We want a consistent value so the test is isolated from external * environment variable settings. The default (MONGOC_STRUCTURED_LOG_DEFAULT_MAX_DOCUMENT_LENGTH) is verified as 1000 * bytes elsewhere. The Command Logging and Monitoring spec recommends that tests run with a larger-than-default * setting of 10000 bytes. We choose that value here, but it's really quite arbitrary. */ ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log( instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Plain log entry"); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_plain_with_extra_data(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Plain log entry with extra data", .expected_bson = BCON_NEW("message", BCON_UTF8("Plain log entry with extra data"), "extra", BCON_INT32(1)), .expected_calls = 1, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Plain log entry with extra data", int32("extra", 1)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_basic_data_types(void) { const char non_terminated_test_string[] = {0, 1, 2, 3, 'a', '\\'}; bson_t *bson_str_n = bson_new(); bson_append_utf8(bson_str_n, "kStrN1", -1, non_terminated_test_string, sizeof non_terminated_test_string); bson_append_utf8(bson_str_n, "kStrN2", -1, non_terminated_test_string, sizeof non_terminated_test_string); struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with all basic data types", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with all basic data types"), "kStr", BCON_UTF8("string value"), "kNullStr", BCON_NULL, BCON(bson_str_n), "kNullStrN1", BCON_NULL, "kNullStrN2", BCON_NULL, "kNullStrN3", BCON_NULL, "kInt32", BCON_INT32(-12345), "kInt64", BCON_INT64(0x76543210aabbccdd), "kDouble", BCON_DOUBLE(3.14159265358979323846), "kTrue", BCON_BOOL(true), "kFalse", BCON_BOOL(false)), .expected_calls = 1, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with all basic data types", utf8("kStr", "string value"), utf8("kNullStr", NULL), utf8(NULL, NULL), utf8_nn("kStrN1ZZZ", 6, non_terminated_test_string, sizeof non_terminated_test_string), utf8_n("kStrN2", non_terminated_test_string, sizeof non_terminated_test_string), utf8_nn("kNullStrN1ZZZ", 10, NULL, 12345), utf8_nn("kNullStrN2", -1, NULL, 12345), utf8_nn(NULL, 999, NULL, 999), utf8_n("kNullStrN3", NULL, 12345), int32("kInt32", -12345), int32(NULL, 9999), int64("kInt64", 0x76543210aabbccdd), int64(NULL, -1), double("kDouble", 3.14159265358979323846), double(NULL, 1), boolean("kTrue", true), boolean("kFalse", false), boolean(NULL, true)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); bson_destroy(bson_str_n); } void test_structured_log_json(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with deferred BSON-to-JSON", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with deferred BSON-to-JSON"), "kJSON", BCON_UTF8("{ \"k\" : \"v\" }"), "kNull", BCON_NULL), .expected_calls = 1, }; bson_t *json_doc = BCON_NEW("k", BCON_UTF8("v")); mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with deferred BSON-to-JSON", bson_as_json("kJSON", json_doc), bson_as_json("kNull", NULL), bson_as_json(NULL, NULL)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); bson_destroy(json_doc); } void test_structured_log_oid(void) { bson_oid_t oid; bson_oid_init_from_string(&oid, "112233445566778899aabbcc"); struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with deferred OID-to-hex conversion", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with deferred OID-to-hex conversion"), "kOID", BCON_OID(&oid), "kNull1", BCON_NULL, "kOIDHex", BCON_UTF8("112233445566778899aabbcc"), "kNull2", BCON_NULL), .expected_calls = 1, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with deferred OID-to-hex conversion", oid("kOID", &oid), oid("kNull1", NULL), oid(NULL, NULL), oid_as_hex("kOIDHex", &oid), oid_as_hex("kNull2", NULL), oid_as_hex(NULL, NULL)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_error(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_INFO, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, .expected_envelope.message = "Log entry with bson_error_t values", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with bson_error_t values"), "failure", "{", "code", BCON_INT32(0xabab5555), "domain", BCON_INT32(0x87654321), "message", BCON_UTF8("Some Text"), "}", "null", BCON_NULL), .expected_calls = 1, }; const bson_error_t err = { .domain = 0x87654321, .code = 0xabab5555, .message = "Some Text", }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_INFO)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_INFO, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, "Log entry with bson_error_t values", error("failure", &err), error(NULL, NULL), error("null", NULL)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_server_description(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with server description", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with server description"), "serverHost", BCON_UTF8("db1.example.com"), "serverHost", BCON_UTF8("db2.example.com"), "serverPort", BCON_INT32(2340), "serverConnectionId", BCON_INT64(0x3deeff00112233f0), "serverHost", BCON_UTF8("db1.example.com"), "serverPort", BCON_INT32(2340), "serverHost", BCON_UTF8("db1.example.com"), "serverPort", BCON_INT32(2340), "serverConnectionId", BCON_INT64(0x3deeff00112233f0), "serviceId", BCON_UTF8("2233445566778899aabbccdd"), "serverHost", BCON_UTF8("db2.example.com"), "serverPort", BCON_INT32(2341), "serverConnectionId", BCON_INT64(0x3deeff00112233f1)), .expected_calls = 1, }; mongoc_server_description_t server_description_1 = { .host.host = "db1.example.com", .host.port = 2340, .server_connection_id = 0x3deeff00112233f0, }; bson_oid_init_from_string(&server_description_1.service_id, "2233445566778899aabbccdd"); mongoc_server_description_t server_description_2 = { .host.host = "db2.example.com", .host.port = 2341, .server_connection_id = 0x3deeff00112233f1, .service_id = {{0}}, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log( instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with server description", server_description(&server_description_1, SERVER_HOST), server_description(&server_description_2, SERVICE_ID), server_description(&server_description_2, SERVER_HOST), server_description(&server_description_1, SERVER_PORT), server_description(&server_description_1, SERVER_CONNECTION_ID), server_description(&server_description_1, SERVER_HOST, SERVER_PORT), server_description(&server_description_1, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID, SERVICE_ID), server_description(&server_description_2, SERVER_HOST, SERVER_PORT, SERVER_CONNECTION_ID, SERVICE_ID)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_command(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with command and reply fields", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with command and reply fields"), "commandName", BCON_UTF8("Not a command"), "databaseName", BCON_UTF8("Some database"), "commandName", BCON_UTF8("Not a command"), "operationId", BCON_INT64(0x12345678eeff0011), "command", BCON_UTF8("{ \"c\" : \"d\", \"first_payload\" : [ { \"i\" : 0, \"x\" : 0 }, { \"i\" : 0, \"x\" : 1 " "}, { \"i\" : 0, \"x\" : 2 }, { \"i\" : 0, \"x\" : 3 }, { \"i\" : 0, \"x\" : 4 } ], " "\"second_payload\" : [ { \"i\" : 1, \"x\" : 0 }, { \"i\" : 1, \"x\" : 1 }, { \"i\" : 1, " "\"x\" : 2 }, { \"i\" : 1, \"x\" : 3 }, { \"i\" : 1, \"x\" : 4 } ] }"), "reply", // Un-redacted successful reply (not-a-command) BCON_UTF8("{ \"r\" : \"s\", \"code\" : 1 }"), "reply", // Un-redacted successful reply (ping) BCON_UTF8("{ \"r\" : \"s\", \"code\" : 1 }"), "reply", // Redacted successful reply (auth) BCON_UTF8("{}"), "failure", // Un-redacted server side error (not-a-command) "{", "r", BCON_UTF8("s"), "code", BCON_INT32(1), "}", "failure", // Un-redacted server side error (ping) "{", "r", BCON_UTF8("s"), "code", BCON_INT32(1), "}", "failure", // Redacted server side error (auth) "{", "code", BCON_INT32(1), "}", "failure", // Client side error "{", "code", BCON_INT32(123), "domain", BCON_INT32(456), "message", BCON_UTF8("oh no"), "}"), .expected_calls = 1, }; bson_t *cmd_doc = BCON_NEW("c", BCON_UTF8("d")); bson_t *reply_doc = BCON_NEW("r", BCON_UTF8("s"), "code", BCON_INT32(1)); const bson_error_t server_error = { .domain = MONGOC_ERROR_SERVER, .code = 99, .message = "unused", }; const bson_error_t client_error = { .domain = 456, .code = 123, .message = "oh no", }; // Current value of MONGOC_CMD_PAYLOADS_COUNT_MAX is 2. // Write two payloads, each with multiple documents in sequence. uint8_t *payload_buf[2] = {NULL, NULL}; size_t payload_buflen[2] = {0, 0}; bson_writer_t *payload_writer[2] = { bson_writer_new(&payload_buf[0], &payload_buflen[0], 0, bson_realloc_ctx, NULL), bson_writer_new(&payload_buf[1], &payload_buflen[1], 0, bson_realloc_ctx, NULL), }; for (unsigned x = 0; x < 5; x++) { for (unsigned i = 0; i < sizeof payload_writer / sizeof payload_writer[0]; i++) { bson_t *doc; bson_writer_begin(payload_writer[i], &doc); BCON_APPEND(doc, "i", BCON_INT32(i), "x", BCON_INT32(x)); bson_writer_end(payload_writer[i]); } } mongoc_cmd_t cmd = { .db_name = "Some database", .command_name = "Not a command", .operation_id = 0x12345678eeff0011, .command = cmd_doc, .payloads = { {.identifier = "first_payload", .documents = payload_buf[0], .size = bson_writer_get_length(payload_writer[0])}, {.identifier = "second_payload", .documents = payload_buf[1], .size = bson_writer_get_length(payload_writer[0])}, }, .payloads_count = 2, }; for (unsigned i = 0; i < sizeof payload_writer / sizeof payload_writer[0]; i++) { bson_writer_destroy(payload_writer[i]); } mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with command and reply fields", cmd(&cmd, COMMAND_NAME), cmd(&cmd, DATABASE_NAME, COMMAND_NAME, OPERATION_ID, COMMAND), cmd_reply(&cmd, reply_doc), cmd_name_reply("ping", reply_doc), cmd_name_reply("authenticate", reply_doc), cmd_failure(&cmd, reply_doc, &server_error), cmd_name_failure("ping", reply_doc, &server_error), cmd_name_failure("authenticate", reply_doc, &server_error), cmd_name_failure("authenticate", reply_doc, &client_error)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); bson_destroy(cmd_doc); bson_destroy(reply_doc); for (unsigned i = 0; i < sizeof payload_buf / sizeof payload_buf[0]; i++) { bson_free(payload_buf[i]); } } void test_structured_log_duration(void) { struct log_assumption assumption = { .expected_envelope.level = MONGOC_STRUCTURED_LOG_LEVEL_WARNING, .expected_envelope.component = MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, .expected_envelope.message = "Log entry with duration", .expected_bson = BCON_NEW("message", BCON_UTF8("Log entry with duration"), "durationMS", BCON_DOUBLE(1.999), "durationMS", BCON_DOUBLE(0.01), "durationMS", BCON_DOUBLE(10000000.999)), .expected_calls = 1, }; mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); mongoc_structured_log_opts_set_handler(opts, structured_log_func, &assumption); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 10000)); ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components(opts, MONGOC_STRUCTURED_LOG_LEVEL_DEBUG)); mongoc_structured_log_instance_t *instance = mongoc_structured_log_instance_new(opts); mongoc_structured_log_opts_destroy(opts); mongoc_structured_log(instance, MONGOC_STRUCTURED_LOG_LEVEL_WARNING, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, "Log entry with duration", monotonic_time_duration(1999), monotonic_time_duration(10), monotonic_time_duration(10000000999)); mongoc_structured_log_instance_destroy(instance); ASSERT_CMPINT(assumption.calls, ==, 1); bson_destroy(assumption.expected_bson); } void test_structured_log_level_names(void) { mongoc_structured_log_level_t level = (mongoc_structured_log_level_t)-1; // Alias, off = 0 ASSERT(mongoc_structured_log_get_named_level("off", &level)); ASSERT_CMPINT(0, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Emergency"); ASSERT(mongoc_structured_log_get_named_level("emergency", &level)); ASSERT_CMPINT(0, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Emergency"); ASSERT(mongoc_structured_log_get_named_level("alert", &level)); ASSERT_CMPINT(1, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_ALERT, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Alert"); ASSERT(mongoc_structured_log_get_named_level("critical", &level)); ASSERT_CMPINT(2, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_CRITICAL, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Critical"); ASSERT(mongoc_structured_log_get_named_level("error", &level)); ASSERT_CMPINT(3, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_ERROR, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Error"); // Alias, warn = Warning ASSERT(mongoc_structured_log_get_named_level("warn", &level)); ASSERT_CMPINT(4, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Warning"); ASSERT(mongoc_structured_log_get_named_level("warning", &level)); ASSERT_CMPINT(4, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Warning"); ASSERT(mongoc_structured_log_get_named_level("notice", &level)); ASSERT_CMPINT(5, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_NOTICE, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Notice"); // Alias, info = Informational ASSERT(mongoc_structured_log_get_named_level("info", &level)); ASSERT_CMPINT(6, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Informational"); ASSERT(mongoc_structured_log_get_named_level("informational", &level)); ASSERT_CMPINT(6, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_INFO, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Informational"); ASSERT(mongoc_structured_log_get_named_level("debug", &level)); ASSERT_CMPINT(7, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_DEBUG, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Debug"); ASSERT(mongoc_structured_log_get_named_level("trace", &level)); ASSERT_CMPINT(8, ==, level); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_TRACE, ==, level); ASSERT_CMPSTR(mongoc_structured_log_get_level_name(level), "Trace"); } void test_structured_log_component_names(void) { mongoc_structured_log_component_t component = (mongoc_structured_log_component_t)-1; ASSERT(mongoc_structured_log_get_named_component("Command", &component)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND, ==, component); ASSERT_CMPSTR(mongoc_structured_log_get_component_name(component), "command"); ASSERT(mongoc_structured_log_get_named_component("Topology", &component)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY, ==, component); ASSERT_CMPSTR(mongoc_structured_log_get_component_name(component), "topology"); ASSERT(mongoc_structured_log_get_named_component("ServerSelection", &component)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION, ==, component); ASSERT_CMPSTR(mongoc_structured_log_get_component_name(component), "serverSelection"); ASSERT(mongoc_structured_log_get_named_component("Connection", &component)); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION, ==, component); ASSERT_CMPSTR(mongoc_structured_log_get_component_name(component), "connection"); } void test_structured_log_max_document_length(void) { mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_DEFAULT_MAX_DOCUMENT_LENGTH, ==, 1000); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, 0)); ASSERT(!mongoc_structured_log_opts_set_max_document_length(opts, INT_MAX)); ASSERT(mongoc_structured_log_opts_set_max_document_length(opts, INT_MAX / 2)); ASSERT_CMPINT(INT_MAX / 2, ==, mongoc_structured_log_opts_get_max_document_length(opts)); mongoc_structured_log_opts_destroy(opts); } int test_structured_log_skip_if_env_not_default(void) { // Skip testing env defaults if any options have been set externally const char *expected_unset[] = { "MONGODB_LOG_MAX_DOCUMENT_LENGTH", "MONGODB_LOG_COMMAND", "MONGODB_LOG_TOPOLOGY", "MONGODB_LOG_SERVER_SELECTION", "MONGODB_LOG_CONNECTION", "MONGODB_LOG_ALL", }; for (size_t i = 0u; i < sizeof expected_unset / sizeof expected_unset[0]; i++) { const char *var = expected_unset[i]; char *value = test_framework_getenv(var); bson_free(value); if (value) { MONGOC_DEBUG("Skipping test because environment var '%s' is set", var); return 0; } } return 1; } void test_structured_log_env_defaults(void *test_context) { BSON_UNUSED(test_context); mongoc_structured_log_opts_t *opts = mongoc_structured_log_opts_new(); ASSERT_CMPINT(MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_COMMAND)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_CONNECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_LEVEL_WARNING, ==, mongoc_structured_log_opts_get_max_level_for_component(opts, MONGOC_STRUCTURED_LOG_COMPONENT_TOPOLOGY)); ASSERT_CMPINT( MONGOC_STRUCTURED_LOG_DEFAULT_MAX_DOCUMENT_LENGTH, ==, mongoc_structured_log_opts_get_max_document_length(opts)); mongoc_structured_log_opts_destroy(opts); } void test_structured_log_install(TestSuite *suite) { TestSuite_Add(suite, "/structured_log/opts", test_structured_log_opts); TestSuite_Add(suite, "/structured_log/plain", test_structured_log_plain); TestSuite_Add(suite, "/structured_log/plain_with_extra_data", test_structured_log_plain_with_extra_data); TestSuite_Add(suite, "/structured_log/basic_data_types", test_structured_log_basic_data_types); TestSuite_Add(suite, "/structured_log/json", test_structured_log_json); TestSuite_Add(suite, "/structured_log/oid", test_structured_log_oid); TestSuite_Add(suite, "/structured_log/error", test_structured_log_error); TestSuite_Add(suite, "/structured_log/server_description", test_structured_log_server_description); TestSuite_Add(suite, "/structured_log/command", test_structured_log_command); TestSuite_Add(suite, "/structured_log/duration", test_structured_log_duration); TestSuite_Add(suite, "/structured_log/level_names", test_structured_log_level_names); TestSuite_Add(suite, "/structured_log/component_names", test_structured_log_component_names); TestSuite_Add(suite, "/structured_log/max_document_length", test_structured_log_max_document_length); TestSuite_AddFull(suite, "/structured_log/env_defaults", test_structured_log_env_defaults, NULL, NULL, test_structured_log_skip_if_env_not_default); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-thread.c000066400000000000000000000014471511661753600241370ustar00rootroot00000000000000#include #include #include static void test_cond_wait(void) { int64_t start, duration_usec; bson_mutex_t mutex; mongoc_cond_t cond; bson_mutex_init(&mutex); mongoc_cond_init(&cond); bson_mutex_lock(&mutex); start = bson_get_monotonic_time(); mongoc_cond_timedwait(&cond, &mutex, 100); duration_usec = bson_get_monotonic_time() - start; bson_mutex_unlock(&mutex); if (!((50 * 1000 < duration_usec) && (150 * 1000 > duration_usec))) { test_error("expected to wait 100ms, waited %" PRId64 "\n", duration_usec / 1000); } mongoc_cond_destroy(&cond); bson_mutex_destroy(&mutex); } void test_thread_install(TestSuite *suite) { TestSuite_Add(suite, "/Thread/cond_wait", test_cond_wait); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-timeout.c000066400000000000000000000107611511661753600243550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include void _test_mongoc_timeout_new_success(int64_t expected) { mongoc_timeout_t *timeout; timeout = mongoc_timeout_new_timeout_int64(expected); BSON_ASSERT(mongoc_timeout_is_set(timeout)); BSON_ASSERT(expected == mongoc_timeout_get_timeout_ms(timeout)); mongoc_timeout_destroy(timeout); } void _test_mongoc_timeout_new_failure(int64_t try, const char *err_msg) { capture_logs(true); BSON_ASSERT(!mongoc_timeout_new_timeout_int64(try)); ASSERT_CAPTURED_LOG("mongoc", MONGOC_LOG_LEVEL_ERROR, err_msg); clear_captured_logs(); } void test_mongoc_timeout_new(void) { mongoc_timeout_t *timeout = NULL; BSON_ASSERT(!mongoc_timeout_is_set(timeout)); BSON_ASSERT(timeout = mongoc_timeout_new()); BSON_ASSERT(!mongoc_timeout_is_set(timeout)); mongoc_timeout_destroy(timeout); _test_mongoc_timeout_new_failure(-1, "timeout must not be negative"); _test_mongoc_timeout_new_failure(INT64_MIN, "timeout must not be negative"); _test_mongoc_timeout_new_success(0); _test_mongoc_timeout_new_success(1); _test_mongoc_timeout_new_success(INT64_MAX); } void _test_mongoc_timeout_set_failure(mongoc_timeout_t *timeout, int64_t try, const char *err_msg) { capture_logs(true); BSON_ASSERT(!mongoc_timeout_set_timeout_ms(timeout, try)); ASSERT_CAPTURED_LOG("mongoc", MONGOC_LOG_LEVEL_ERROR, err_msg); clear_captured_logs(); BSON_ASSERT(!mongoc_timeout_is_set(timeout)); } void _test_mongoc_timeout_set_success(mongoc_timeout_t *timeout, int64_t expected) { BSON_ASSERT(mongoc_timeout_set_timeout_ms(timeout, expected)); BSON_ASSERT(mongoc_timeout_is_set(timeout)); BSON_ASSERT(expected == mongoc_timeout_get_timeout_ms(timeout)); } void test_mongoc_timeout_set(void) { mongoc_timeout_t *timeout = NULL; timeout = mongoc_timeout_new(); BSON_ASSERT(!mongoc_timeout_is_set(timeout)); _test_mongoc_timeout_set_failure(timeout, -1, "timeout must not be negative"); _test_mongoc_timeout_set_failure(timeout, INT64_MIN, "timeout must not be negative"); _test_mongoc_timeout_set_success(timeout, 0); _test_mongoc_timeout_set_success(timeout, 1); _test_mongoc_timeout_set_success(timeout, INT64_MAX); mongoc_timeout_destroy(timeout); } void test_mongoc_timeout_get(void) { mongoc_timeout_t *timeout = NULL; int64_t expected; BSON_ASSERT(timeout = mongoc_timeout_new()); BSON_ASSERT(!mongoc_timeout_is_set(timeout)); expected = 1; mongoc_timeout_set_timeout_ms(timeout, expected); BSON_ASSERT(mongoc_timeout_is_set(timeout)); BSON_ASSERT(expected == mongoc_timeout_get_timeout_ms(timeout)); mongoc_timeout_destroy(timeout); } void _test_mongoc_timeout_copy(mongoc_timeout_t *expected) { mongoc_timeout_t *actual = mongoc_timeout_copy(expected); /* assert different memory addresses */ BSON_ASSERT(expected != actual); BSON_ASSERT(mongoc_timeout_is_set(actual) == mongoc_timeout_is_set(expected)); if (mongoc_timeout_is_set(actual)) { BSON_ASSERT(mongoc_timeout_get_timeout_ms(actual) == mongoc_timeout_get_timeout_ms(expected)); } mongoc_timeout_destroy(actual); } void test_mongoc_timeout_copy(void) { mongoc_timeout_t *timeout = NULL; timeout = mongoc_timeout_new(); _test_mongoc_timeout_copy(timeout); mongoc_timeout_destroy(timeout); timeout = mongoc_timeout_new_timeout_int64(1); _test_mongoc_timeout_copy(timeout); mongoc_timeout_destroy(timeout); } void test_mongoc_timeout_destroy(void) { mongoc_timeout_destroy(NULL); } void test_timeout_install(TestSuite *suite) { TestSuite_Add(suite, "/Timeout/new", test_mongoc_timeout_new); TestSuite_Add(suite, "/Timeout/set", test_mongoc_timeout_set); TestSuite_Add(suite, "/Timeout/get", test_mongoc_timeout_get); TestSuite_Add(suite, "/Timeout/copy", test_mongoc_timeout_copy); TestSuite_Add(suite, "/Timeout/destroy", test_mongoc_timeout_destroy); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-topology-description.c000066400000000000000000000307371511661753600270710ustar00rootroot00000000000000#include #include #include #include #include #include #include #include static void _test_has_readable_writable_server(bool pooled) { mongoc_client_t *client = NULL; mongoc_client_pool_t *pool = NULL; mc_shared_tpld td; mongoc_read_prefs_t *prefs; bool r; bson_error_t error; mongoc_topology_t *topology; if (pooled) { pool = test_framework_new_default_client_pool(); topology = _mongoc_client_pool_get_topology(pool); } else { client = test_framework_new_default_client(); topology = client->topology; } td = mc_tpld_take_ref(topology); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_read_prefs_set_tags(prefs, tmp_bson("[{'tag': 'does-not-exist'}]")); /* not yet connected */ ASSERT(!mongoc_topology_description_has_writable_server(td.ptr)); ASSERT(!mongoc_topology_description_has_readable_server(td.ptr, NULL)); ASSERT(!mongoc_topology_description_has_readable_server(td.ptr, prefs)); /* get a client if necessary, and trigger connection */ if (pooled) { client = mongoc_client_pool_pop(pool); } r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mc_tpld_renew_ref(&td, topology); ASSERT(mongoc_topology_description_has_writable_server(td.ptr)); ASSERT(mongoc_topology_description_has_readable_server(td.ptr, NULL)); if (test_framework_is_replset()) { /* prefs still don't match any server */ mc_tpld_renew_ref(&td, topology); ASSERT(!mongoc_topology_description_has_readable_server(td.ptr, prefs)); } else { /* topology type single ignores read preference */ mc_tpld_renew_ref(&td, topology); ASSERT(mongoc_topology_description_has_readable_server(td.ptr, prefs)); } mongoc_read_prefs_destroy(prefs); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mc_tpld_drop_ref(&td); } static void test_has_readable_writable_server_single(void) { _test_has_readable_writable_server(false); } static void test_has_readable_writable_server_pooled(void) { _test_has_readable_writable_server(true); } static const mongoc_server_description_t * _sd_for_host(mongoc_topology_description_t *td, const char *host) { const mongoc_server_description_t *sd; mongoc_set_t const *servers = mc_tpld_servers_const(td); for (size_t i = 0u; i < servers->items_len; i++) { sd = mongoc_set_get_item_const(servers, i); if (!strcmp(sd->host.host, host)) { return sd; } } return NULL; } static void test_get_servers(void) { mongoc_uri_t *uri; mongoc_topology_t *topology; const mongoc_server_description_t *sd_a; const mongoc_server_description_t *sd_c; mongoc_server_description_t **sds; mc_tpld_modification tdmod; size_t n; uri = mongoc_uri_new("mongodb://a,b,c"); topology = mongoc_topology_new(uri, true /* single-threaded */); tdmod = mc_tpld_modify_begin(topology); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); /* servers "a" and "c" are mongos, but "b" remains unknown */ sd_a = _sd_for_host(tdmod.new_td, "a"); mongoc_topology_description_handle_hello(tdmod.new_td, &log_and_monitor, sd_a->id, tmp_bson("{'ok': 1, 'msg': 'isdbgrid'}"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); sd_c = _sd_for_host(tdmod.new_td, "c"); mongoc_topology_description_handle_hello(tdmod.new_td, &log_and_monitor, sd_c->id, tmp_bson("{'ok': 1, 'msg': 'isdbgrid'}"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); sds = mongoc_topology_description_get_servers(tdmod.new_td, &n); ASSERT_CMPSIZE_T((size_t)2, ==, n); /* we don't care which order the servers are returned */ if (sds[0]->id == sd_a->id) { ASSERT_CMPSTR("a", sds[0]->host.host); ASSERT_CMPSTR("c", sds[1]->host.host); } else { ASSERT_CMPSTR("c", sds[0]->host.host); ASSERT_CMPSTR("a", sds[1]->host.host); } mongoc_server_descriptions_destroy_all(sds, n); mc_tpld_modify_drop(tdmod); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } #define TV_1 "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 1 }" #define TV_2 "{ 'processId': { '$oid': 'AABBAABBAABBAABBAABBAABB' }, 'counter': 2 }" void _topology_changed(const mongoc_apm_topology_changed_t *event) { int *num_calls; num_calls = (int *)mongoc_apm_topology_changed_get_context(event); (*num_calls)++; } /* Regression test for CDRIVER-3753. */ static void test_topology_version_equal(void) { mongoc_uri_t *uri; mongoc_topology_t *topology; const mongoc_server_description_t *sd; mongoc_apm_callbacks_t *callbacks; int num_calls = 0; mc_tpld_modification tdmod; uri = mongoc_uri_new("mongodb://host"); topology = mongoc_topology_new(uri, true /* single-threaded */); tdmod = mc_tpld_modify_begin(topology); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_topology_changed_cb(callbacks, _topology_changed); mongoc_log_and_monitor_instance_set_apm_callbacks(&topology->log_and_monitor, callbacks, &num_calls); sd = _sd_for_host(tdmod.new_td, "host"); mongoc_topology_description_handle_hello(tdmod.new_td, &topology->log_and_monitor, sd->id, tmp_bson("{'ok': 1, 'topologyVersion': " TV_2 " }"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); ASSERT_CMPINT(num_calls, ==, 1); /* The subsequent hello has a topologyVersion that compares less, so the * hello skips. */ mongoc_topology_description_handle_hello(tdmod.new_td, &topology->log_and_monitor, sd->id, tmp_bson("{'ok': 1, 'topologyVersion': " TV_1 " }"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); ASSERT_CMPINT(num_calls, ==, 1); mongoc_apm_callbacks_destroy(callbacks); mc_tpld_modify_drop(tdmod); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); } static void test_topology_description_new_copy(void) { mongoc_uri_t *uri; mongoc_topology_t *topology; mongoc_topology_description_t *td_copy; const mongoc_server_description_t *sd_a; const mongoc_server_description_t *sd_c; mongoc_server_description_t **sds; mc_tpld_modification tdmod; size_t n; uri = mongoc_uri_new("mongodb://a,b,c"); topology = mongoc_topology_new(uri, true /* single-threaded */); tdmod = mc_tpld_modify_begin(topology); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); td_copy = mongoc_topology_description_new_copy(tdmod.new_td); /* servers "a" and "c" are mongos, but "b" remains unknown */ sd_a = _sd_for_host(tdmod.new_td, "a"); mongoc_topology_description_handle_hello(tdmod.new_td, &log_and_monitor, sd_a->id, tmp_bson("{'ok': 1, 'msg': 'isdbgrid'}"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); sd_c = _sd_for_host(tdmod.new_td, "c"); mongoc_topology_description_handle_hello(tdmod.new_td, &log_and_monitor, sd_c->id, tmp_bson("{'ok': 1, 'msg': 'isdbgrid'}"), 100, MONGOC_TOPOLOGY_DESCRIPTION_HELLO_CLUSTER_TIME_UPDATE, NULL); /* td was copied before original was updated */ sds = mongoc_topology_description_get_servers(td_copy, &n); ASSERT_CMPSIZE_T((size_t)0, ==, n); mongoc_server_descriptions_destroy_all(sds, n); mongoc_topology_description_destroy(td_copy); td_copy = mongoc_topology_description_new_copy(tdmod.new_td); mc_tpld_modify_drop(tdmod); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); /* td was copied after original was updated, but before it was destroyed */ sds = mongoc_topology_description_get_servers(td_copy, &n); ASSERT_CMPSIZE_T((size_t)2, ==, n); mongoc_server_descriptions_destroy_all(sds, n); mongoc_topology_description_destroy(td_copy); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } /* Test that _mongoc_topology_description_clear_connection_pool increments the * generation. */ static void test_topology_pool_clear(void) { mongoc_topology_t *topology; mc_tpld_modification tdmod; mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://localhost:27017,localhost:27018"); topology = mongoc_topology_new(uri, true); tdmod = mc_tpld_modify_begin(topology); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &kZeroObjectId)); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 2, &kZeroObjectId)); _mongoc_topology_description_clear_connection_pool(tdmod.new_td, 1, &kZeroObjectId); ASSERT_CMPUINT32(1, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &kZeroObjectId)); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 2, &kZeroObjectId)); mongoc_uri_destroy(uri); mc_tpld_modify_drop(tdmod); mongoc_topology_destroy(topology); } static void test_topology_pool_clear_by_serviceid(void) { mongoc_topology_t *topology; mongoc_uri_t *uri; bson_oid_t oid_a; bson_oid_t oid_b; mc_tpld_modification tdmod; uri = mongoc_uri_new("mongodb://localhost:27017"); topology = mongoc_topology_new(uri, true); bson_oid_init_from_string(&oid_a, "AAAAAAAAAAAAAAAAAAAAAAAA"); bson_oid_init_from_string(&oid_b, "BBBBBBBBBBBBBBBBBBBBBBBB"); tdmod = mc_tpld_modify_begin(topology); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &oid_a)); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &oid_b)); _mongoc_topology_description_clear_connection_pool(tdmod.new_td, 1, &oid_a); ASSERT_CMPUINT32(1, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &oid_a)); ASSERT_CMPUINT32(0, ==, _mongoc_topology_get_connection_pool_generation(tdmod.new_td, 1, &oid_b)); mongoc_uri_destroy(uri); mc_tpld_modify_drop(tdmod); mongoc_topology_destroy(topology); } void test_topology_description_install(TestSuite *suite) { TestSuite_AddLive(suite, "/TopologyDescription/readable_writable/single", test_has_readable_writable_server_single); TestSuite_AddLive(suite, "/TopologyDescription/readable_writable/pooled", test_has_readable_writable_server_pooled); TestSuite_Add(suite, "/TopologyDescription/get_servers", test_get_servers); TestSuite_Add(suite, "/TopologyDescription/topology_version_equal", test_topology_version_equal); TestSuite_Add(suite, "/TopologyDescription/new_copy", test_topology_description_new_copy); TestSuite_Add(suite, "/TopologyDescription/pool_clear", test_topology_pool_clear); TestSuite_Add(suite, "/TopologyDescription/pool_clear_by_serviceid", test_topology_pool_clear_by_serviceid); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-topology-reconcile.c000066400000000000000000000543721511661753600265120ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include static mongoc_topology_scanner_node_t * get_node(mongoc_topology_t *topology, const char *host_and_port) { mongoc_topology_scanner_t *ts; mongoc_topology_scanner_node_t *node; mongoc_topology_scanner_node_t *sought = NULL; BSON_ASSERT(topology->single_threaded); ts = topology->scanner; DL_FOREACH(ts->nodes, node) { if (!strcmp(host_and_port, node->host.host_and_port)) { sought = node; break; } } return sought; } static bool has_server_description(const mongoc_topology_t *topology, const char *host_and_port) { mc_shared_tpld td = mc_tpld_take_ref(topology); const mongoc_set_t *servers = mc_tpld_servers_const(td.ptr); bool found = false; const mongoc_server_description_t *sd; for (size_t i = 0; i < servers->items_len; i++) { sd = mongoc_set_get_item_const(servers, i); if (!strcmp(sd->host.host_and_port, host_and_port)) { found = true; break; } } mc_tpld_drop_ref(&td); return found; } bool selects_server(mongoc_client_t *client, mongoc_read_prefs_t *read_prefs, mock_server_t *server) { bson_error_t error; mongoc_server_description_t *sd; bool result; ASSERT(client); sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, read_prefs, NULL, &error); if (!sd) { fprintf(stderr, "%s\n", error.message); return false; } result = (0 == strcmp(mongoc_server_description_host(sd)->host_and_port, mock_server_get_host_and_port(server))); mongoc_server_description_destroy(sd); return result; } static void _test_topology_reconcile_rs(bool pooled) { mock_server_t *server0; mock_server_t *server1; char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; debug_stream_stats_t debug_stream_stats = {0}; mongoc_read_prefs_t *secondary_read_prefs; mongoc_read_prefs_t *primary_read_prefs; mongoc_read_prefs_t *tag_read_prefs; server0 = mock_server_new(); server1 = mock_server_new(); mock_server_run(server0); mock_server_run(server1); /* secondary, no tags */ RS_RESPONSE_TO_HELLO(server0, WIRE_VERSION_MIN, false, false, server0, server1); /* primary, no tags */ RS_RESPONSE_TO_HELLO(server1, WIRE_VERSION_MIN, true, false, server0, server1); /* provide secondary in seed list */ uri_str = bson_strdup_printf("mongodb://%s/?replicaSet=rs", mock_server_get_host_and_port(server0)); uri = mongoc_uri_new(uri_str); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new(uri_str, NULL); } if (!pooled) { test_framework_set_debug_stream(client, &debug_stream_stats); } secondary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); primary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); tag_read_prefs = mongoc_read_prefs_new(MONGOC_READ_NEAREST); mongoc_read_prefs_add_tag(tag_read_prefs, tmp_bson("{'key': 'value'}")); /* * server0 is selected, server1 is discovered and added to scanner. */ BSON_ASSERT(selects_server(client, secondary_read_prefs, server0)); if (!pooled) { BSON_ASSERT(get_node(client->topology, mock_server_get_host_and_port(server1))); } /* * select again with mode "primary": server1 is selected. */ BSON_ASSERT(selects_server(client, primary_read_prefs, server1)); /* * remove server1 from set. server0 is the primary, with tags. */ RS_RESPONSE_TO_HELLO(server0, WIRE_VERSION_MIN, true, true, server0); /* server1 absent */ BSON_ASSERT(selects_server(client, tag_read_prefs, server0)); BSON_ASSERT(!client->topology->stale); if (!pooled) { ASSERT_CMPINT(1, ==, debug_stream_stats.n_failed); } /* * server1 returns as a secondary. its scanner node is un-retired. */ RS_RESPONSE_TO_HELLO(server0, WIRE_VERSION_MIN, true, true, server0, server1); RS_RESPONSE_TO_HELLO(server1, WIRE_VERSION_MIN, false, false, server0, server1); BSON_ASSERT(selects_server(client, secondary_read_prefs, server1)); if (!pooled) { /* no additional failed streams */ ASSERT_CMPINT(1, ==, debug_stream_stats.n_failed); } mongoc_read_prefs_destroy(primary_read_prefs); mongoc_read_prefs_destroy(secondary_read_prefs); mongoc_read_prefs_destroy(tag_read_prefs); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); bson_free(uri_str); mock_server_destroy(server1); mock_server_destroy(server0); } static void test_topology_reconcile_rs_single(void) { _test_topology_reconcile_rs(false); } static void test_topology_reconcile_rs_pooled(void) { _test_topology_reconcile_rs(true); } static void _test_topology_reconcile_sharded(bool pooled) { mock_server_t *mongos; mock_server_t *secondary; char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; mongoc_read_prefs_t *primary_read_prefs; bson_error_t error; future_t *future; request_t *request; char *secondary_response; mongoc_server_description_t *sd; mongos = mock_server_new(); secondary = mock_server_new(); mock_server_run(mongos); mock_server_run(secondary); /* provide both servers in seed list */ uri_str = bson_strdup_printf( "mongodb://%s,%s", mock_server_get_host_and_port(mongos), mock_server_get_host_and_port(secondary)); uri = mongoc_uri_new(uri_str); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new(uri_str, NULL); } primary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_read_prefs, NULL, &error); /* mongos */ request = mock_server_receives_any_hello(mongos); reply_to_request_simple(request, tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'msg': 'isdbgrid'}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); /* make sure the mongos response is processed first */ mlib_sleep_for(1, s); /* replica set secondary - topology removes it */ request = mock_server_receives_any_hello(secondary); secondary_response = bson_strdup_printf("{'ok': 1, " " 'setName': 'rs'," " 'isWritablePrimary': false," " 'secondary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s', '%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(mongos), mock_server_get_host_and_port(secondary)); reply_to_request_simple(request, secondary_response); request_destroy(request); /* * mongos is selected, secondary is removed. */ sd = future_get_mongoc_server_description_ptr(future); ASSERT_CMPSTR(sd->host.host_and_port, mock_server_get_host_and_port(mongos)); if (!pooled) { BSON_ASSERT(!get_node(client->topology, mock_server_get_host_and_port(secondary))); } mongoc_server_description_destroy(sd); bson_free(secondary_response); mongoc_read_prefs_destroy(primary_read_prefs); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } future_destroy(future); mongoc_uri_destroy(uri); bson_free(uri_str); mock_server_destroy(secondary); mock_server_destroy(mongos); } static void test_topology_reconcile_sharded_single(void) { _test_topology_reconcile_sharded(false); } static void test_topology_reconcile_sharded_pooled(void) { _test_topology_reconcile_sharded(true); } typedef struct { bson_mutex_t mutex; size_t servers; } reconcile_test_data_t; static void server_opening(const mongoc_apm_server_opening_t *event) { reconcile_test_data_t *data = (reconcile_test_data_t *)event->context; bson_mutex_lock(&data->mutex); data->servers++; bson_mutex_unlock(&data->mutex); } static void test_topology_reconcile_from_handshake(void *ctx) { reconcile_test_data_t data; mongoc_apm_callbacks_t *callbacks; char *host_and_port; char *replset_name; char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_topology_t *topology; mongoc_client_t *client; bool r; bson_error_t error; int count; mongoc_topology_scanner_node_t *node; mc_shared_tpld td = MC_SHARED_TPLD_NULL; mongoc_async_cmd_t *cmd; BSON_UNUSED(ctx); bson_mutex_init(&data.mutex); data.servers = 0; callbacks = mongoc_apm_callbacks_new(); /* single seed - not the full test_framework_get_uri */ host_and_port = test_framework_get_host_and_port(); replset_name = test_framework_replset_name(); uri_str = bson_strdup_printf("mongodb://%s/?replicaSet=%s", host_and_port, replset_name); uri = mongoc_uri_new(uri_str); pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_apm_set_server_opening_cb(callbacks, server_opening); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &data); test_framework_set_pool_ssl_opts(pool); /* make the bg thread lose the data race: prevent it starting by pretending * it already has */ topology = _mongoc_client_pool_get_topology(pool); topology->scanner_state = MONGOC_TOPOLOGY_SCANNER_BG_RUNNING; /* ordinarily would start bg thread */ client = mongoc_client_pool_pop(pool); /* command in the foreground (hello, just because it doesn't need auth) */ r = mongoc_client_read_command_with_opts(client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, tmp_bson("{'serverId': 1}"), NULL, &error); ASSERT_OR_PRINT(r, error); /* added server descriptions */ mc_tpld_renew_ref(&td, topology); ASSERT_CMPSIZE_T(mc_tpld_servers_const(td.ptr)->items_len, >, (size_t)1); mc_tpld_drop_ref(&td); /* didn't add nodes yet, since we're not in the scanner loop */ DL_COUNT(topology->scanner->nodes, node, count); ASSERT_CMPINT(count, ==, 1); /* if CDRIVER-2073 isn't fixed, then when we discovered the other replicas * during the handshake, we also created mongoc_async_cmd_t's for them */ DL_COUNT(topology->scanner->async->cmds, cmd, count); ASSERT_CMPINT(count, ==, 0); /* allow pool to start scanner thread */ mcommon_atomic_int_exchange(&topology->scanner_state, MONGOC_TOPOLOGY_SCANNER_OFF, mcommon_memory_order_seq_cst); mongoc_client_pool_push(pool, client); client = mongoc_client_pool_pop(pool); /* no serverId, waits for topology scan */ r = mongoc_client_read_command_with_opts( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, NULL, &error); ASSERT_OR_PRINT(r, error); bson_mutex_lock(&data.mutex); ASSERT_CMPSIZE_T(data.servers, ==, test_framework_replset_member_count()); bson_mutex_unlock(&data.mutex); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_apm_callbacks_destroy(callbacks); mongoc_uri_destroy(uri); bson_free(uri_str); bson_free(replset_name); bson_free(host_and_port); } /* CDRIVER-2552 in mongoc_topology_scanner_node_setup, assert (!node->retired) * failed after this sequence in pooled mode: * * 1. scanner discovers a replica set with primary and at least one secondary * 2. cluster opens a new stream to the primary * 3. cluster handshakes the new connection by calling hello on the primary * 4. the primary, for some reason, suddenly omits the secondary from its host * list, perhaps because the secondary was removed from the RS configuration * 5. scanner marks the secondary scanner node "retired" to be destroyed later * 6. the scanner is disconnected from the secondary for some reason * 7. on the next scan, mongoc_topology_scanner_node_setup sees that the * secondary is disconnected, and before creating a new stream it asserts * !node->retired. * * test that between step 5 and 7, mongoc_topology_scanner_reset destroys the * secondary node, avoiding the assert failure. test both pooled and single * mode for good measure. */ static void test_topology_reconcile_retire_single(void) { mock_server_t *secondary; mock_server_t *primary; char *uri_str; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_topology_t *topology; mongoc_read_prefs_t *primary_read_prefs; mongoc_read_prefs_t *secondary_read_prefs; mongoc_read_prefs_t *tag_read_prefs; mongoc_topology_scanner_node_t *node; bson_error_t error; future_t *future; request_t *request; secondary = mock_server_new(); primary = mock_server_new(); mock_server_run(secondary); mock_server_run(primary); RS_RESPONSE_TO_HELLO(primary, WIRE_VERSION_MIN, true, false, secondary, primary); RS_RESPONSE_TO_HELLO(secondary, WIRE_VERSION_MIN, false, false, secondary, primary); /* selection timeout must be > MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS, * otherwise we skip second scan in pooled mode and don't hit the assert */ uri_str = bson_strdup_printf("mongodb://%s,%s/?replicaSet=rs" "&serverSelectionTimeoutMS=600&heartbeatFrequencyMS=999999999", mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary)); uri = mongoc_uri_new(uri_str); client = test_framework_client_new(uri_str, NULL); topology = client->topology; /* step 1: discover both replica set members */ primary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); BSON_ASSERT(selects_server(client, primary_read_prefs, primary)); secondary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); BSON_ASSERT(selects_server(client, secondary_read_prefs, secondary)); /* remove secondary from primary's config */ RS_RESPONSE_TO_HELLO(primary, WIRE_VERSION_MIN, true, false, primary); /* step 2: cluster opens new stream to primary - force new stream in single * mode by disconnecting scanner nodes (also includes step 6) */ DL_FOREACH(topology->scanner->nodes, node) { BSON_ASSERT(node); BSON_ASSERT(node->stream); mongoc_stream_destroy(node->stream); node->stream = NULL; } /* step 3: run "ping" on primary, triggering a connection and handshake, thus * step 4 & 5: the primary tells the scanner to retire the secondary node */ future = future_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error); request = mock_server_receives_msg(primary, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); BSON_ASSERT(!has_server_description(topology, mock_server_get_host_and_port(secondary))); /* server removed from topology description. in pooled mode, the scanner node * is untouched, in single mode mongoc_cluster_fetch_stream_single scans and * updates topology */ BSON_ASSERT(!get_node(topology, mock_server_get_host_and_port(secondary))); /* step 7: trigger a scan by selecting with an unsatisfiable read preference. * should not crash with BSON_ASSERT. */ tag_read_prefs = mongoc_read_prefs_new(MONGOC_READ_NEAREST); mongoc_read_prefs_add_tag(tag_read_prefs, tmp_bson("{'key': 'value'}")); BSON_ASSERT(!mongoc_client_select_server(client, false, tag_read_prefs, NULL)); BSON_ASSERT(!get_node(topology, mock_server_get_host_and_port(secondary))); mongoc_client_destroy(client); future_destroy(future); mock_server_destroy(primary); mock_server_destroy(secondary); mongoc_read_prefs_destroy(primary_read_prefs); mongoc_read_prefs_destroy(secondary_read_prefs); mongoc_read_prefs_destroy(tag_read_prefs); mongoc_uri_destroy(uri); bson_free(uri_str); } /* CDRIVER-2552 in mongoc_topology_scanner_start, assert (!node->cmd) * failed after this sequence in libmongoc 1.6.0: * * 1. scanner discovers a replica set with primary * 2. cluster opens a new stream to the primary * 3. cluster handshakes the new connection by calling hello on the primary * 4. the primary suddenly includes a new secondary in its host list, perhaps * because the secondary was added * 5. _mongoc_topology_update_from_handshake adds the secondary to the topology * and erroneously creates a scanner node with an async_cmd_t for it, * although it's not in the scanner loop * 6. on the next mongoc_topology_scanner_start, assert (!node->cmd) fails * * test that in step 5 the new node has no new async_cmd_t */ static void test_topology_reconcile_add_single(void) { mock_server_t *secondary; mock_server_t *primary; char *uri_str; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_topology_t *topology; mongoc_read_prefs_t *primary_read_prefs; mongoc_topology_scanner_node_t *node; bson_error_t error; future_t *future; request_t *request; secondary = mock_server_new(); primary = mock_server_new(); mock_server_run(secondary); mock_server_run(primary); /* omit secondary from primary's hello, to start with */ RS_RESPONSE_TO_HELLO(primary, WIRE_VERSION_MIN, true, false, primary); RS_RESPONSE_TO_HELLO(secondary, WIRE_VERSION_MIN, false, false, secondary, primary); /* selection timeout must be > MONGOC_TOPOLOGY_MIN_HEARTBEAT_FREQUENCY_MS, * otherwise we skip second scan in pooled mode and don't hit the assert */ uri_str = bson_strdup_printf("mongodb://%s,%s/?replicaSet=rs" "&serverSelectionTimeoutMS=600&heartbeatFrequencyMS=999999999", mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary)); uri = mongoc_uri_new(uri_str); client = test_framework_client_new(uri_str, NULL); topology = client->topology; /* step 1: discover primary */ primary_read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); BSON_ASSERT(selects_server(client, primary_read_prefs, primary)); /* add secondary to primary's config */ RS_RESPONSE_TO_HELLO(primary, WIRE_VERSION_MIN, true, false, primary, secondary); /* step 2: cluster opens new stream to primary - force new stream in single * mode by disconnecting primary scanner node */ node = get_node(topology, mock_server_get_host_and_port(primary)); BSON_ASSERT(node); BSON_ASSERT(node->stream); mongoc_stream_destroy(node->stream); node->stream = NULL; /* step 3: run "ping" on primary, triggering a connection and handshake, thus * step 4 & 5: we add the secondary to the topology description */ future = future_client_read_command_with_opts(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, NULL, &error); request = mock_server_receives_msg(primary, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); /* added server description */ BSON_ASSERT(has_server_description(topology, mock_server_get_host_and_port(secondary))); node = get_node(topology, mock_server_get_host_and_port(secondary)); /* in single mode the client completes a scan inline and frees all cmds */ BSON_ASSERT(!topology->scanner->async->cmds); BSON_ASSERT(node); mongoc_client_destroy(client); future_destroy(future); mock_server_destroy(primary); mock_server_destroy(secondary); mongoc_read_prefs_destroy(primary_read_prefs); mongoc_uri_destroy(uri); bson_free(uri_str); } void test_topology_reconcile_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/rs/pooled [timeout:30]", test_topology_reconcile_rs_pooled, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/rs/single [timeout:30]", test_topology_reconcile_rs_single, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/sharded/pooled", test_topology_reconcile_sharded_pooled); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/sharded/single", test_topology_reconcile_sharded_single); TestSuite_AddFull(suite, "/TOPOLOGY/reconcile/from_handshake [lock:live-server]", test_topology_reconcile_from_handshake, NULL, NULL, test_framework_skip_if_not_replset); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/retire/single [timeout:30]", test_topology_reconcile_retire_single, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/reconcile/add/single [timeout:30]", test_topology_reconcile_add_single, test_framework_skip_if_slow); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-topology-scanner.c000066400000000000000000000607621511661753600262000ustar00rootroot00000000000000#include #include #include #include #include #include #if defined(MONGOC_ENABLE_SSL_OPENSSL) #include #endif #include #include #include #include #include #include #include #include #include #include #define TIMEOUT 20000 /* milliseconds */ #define NSERVERS 10 static void test_topology_scanner_helper( uint32_t id, const bson_t *bson, int64_t rtt_msec, void *data, const bson_error_t *error /* IN */) { bson_iter_t iter; int *finished = (int *)data; uint32_t max_wire_version; BSON_UNUSED(rtt_msec); if (error->code) { test_error("scanner error: %s", error->message); } /* mock servers are configured to return distinct wire versions */ BSON_ASSERT(bson); BSON_ASSERT(bson_iter_init_find(&iter, bson, "maxWireVersion")); BSON_ASSERT(BSON_ITER_HOLDS_INT32(&iter)); max_wire_version = (uint32_t)bson_iter_int32(&iter); ASSERT_CMPINT(max_wire_version, ==, id + WIRE_VERSION_MIN); (*finished)--; } static void _test_topology_scanner(bool with_ssl) { mock_server_t *servers[NSERVERS]; int i; bson_t q = BSON_INITIALIZER; int finished = NSERVERS * 3; #ifdef MONGOC_ENABLE_SSL mongoc_ssl_opt_t sopt = {0}; mongoc_ssl_opt_t copt = {0}; #endif bson_oid_t topology_id; mcommon_oid_set_zero(&topology_id); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); mongoc_topology_scanner_t *topology_scanner = mongoc_topology_scanner_new( NULL, &topology_id, &log_and_monitor, NULL, &test_topology_scanner_helper, &finished, TIMEOUT); #ifdef MONGOC_ENABLE_SSL if (with_ssl) { copt.ca_file = CERT_CA; copt.weak_cert_validation = 1; mongoc_topology_scanner_set_ssl_opts(topology_scanner, &copt); #if defined(MONGOC_ENABLE_SSL_OPENSSL) && OPENSSL_VERSION_NUMBER >= 0x10100000L topology_scanner->openssl_ctx = _mongoc_openssl_ctx_new(&copt); #endif } #endif for (i = 0; i < NSERVERS; i++) { /* use max wire versions just to distinguish among responses */ servers[i] = mock_server_with_auto_hello(i + WIRE_VERSION_MIN); mock_server_set_rand_delay(servers[i], true); #ifdef MONGOC_ENABLE_SSL if (with_ssl) { sopt.ca_file = CERT_CA; sopt.pem_file = CERT_SERVER; mock_server_set_ssl_opts(servers[i], &sopt); } #endif mock_server_run(servers[i]); mongoc_topology_scanner_add( topology_scanner, mongoc_uri_get_hosts(mock_server_get_uri(servers[i])), (uint32_t)i, false); } for (i = 0; i < 3; i++) { mongoc_topology_scanner_start(topology_scanner, false); mongoc_topology_scanner_work(topology_scanner); } BSON_ASSERT(finished == 0); mongoc_topology_scanner_destroy(topology_scanner); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); bson_destroy(&q); for (i = 0; i < NSERVERS; i++) { mock_server_destroy(servers[i]); } } void test_topology_scanner(void) { _test_topology_scanner(false); } #ifdef MONGOC_ENABLE_SSL_OPENSSL void test_topology_scanner_ssl(void) { _test_topology_scanner(true); } #endif /* * Servers discovered by a scan should be checked during that scan, CDRIVER-751. */ void test_topology_scanner_discovery(void) { mock_server_t *primary; mock_server_t *secondary; char *primary_response; char *secondary_response; mongoc_client_t *client; char *uri_str; mongoc_read_prefs_t *secondary_pref; bson_error_t error; future_t *future; request_t *request; mongoc_server_description_t *sd; primary = mock_server_new(); secondary = mock_server_new(); mock_server_run(primary); mock_server_run(secondary); primary_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s', '%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary)); secondary_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': false," " 'secondary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s', '%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary)); uri_str = bson_strdup_printf("mongodb://%s/?" MONGOC_URI_REPLICASET "=rs", mock_server_get_host_and_port(primary)); client = test_framework_client_new(uri_str, NULL); secondary_pref = mongoc_read_prefs_new(MONGOC_READ_SECONDARY_PREFERRED); future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, secondary_pref, NULL, &error); /* a single scan discovers *and* checks the secondary */ request = mock_server_receives_any_hello(primary); reply_to_request_simple(request, primary_response); request_destroy(request); /* let client process that response */ mlib_sleep_for(250, ms); /* a check of the secondary is scheduled in this scan */ request = mock_server_receives_any_hello(secondary); reply_to_request_simple(request, secondary_response); /* scan completes */ ASSERT_OR_PRINT((sd = future_get_mongoc_server_description_ptr(future)), error); ASSERT_CMPSTR(sd->host.host_and_port, mock_server_get_host_and_port(secondary)); mongoc_server_description_destroy(sd); future_destroy(future); request_destroy(request); mongoc_read_prefs_destroy(secondary_pref); bson_free(secondary_response); bson_free(primary_response); bson_free(uri_str); mongoc_client_destroy(client); mock_server_destroy(secondary); mock_server_destroy(primary); } /* scanner shouldn't spin if two primaries point at each other */ void test_topology_scanner_oscillate(void) { mock_server_t *server0; mock_server_t *server1; char *server0_response; char *server1_response; mongoc_client_t *client; mongoc_topology_scanner_t *scanner; char *uri_str; mongoc_read_prefs_t *primary_pref; bson_error_t error; future_t *future; request_t *request; server0 = mock_server_new(); server1 = mock_server_new(); mock_server_run(server0); mock_server_run(server1); /* server 0 says it's primary, but only server 1 is in the set */ server0_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", mock_server_get_host_and_port(server1)); /* the opposite */ server1_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': true," " 'setName': 'rs'," " 'hosts': ['%s']}", mock_server_get_host_and_port(server0)); /* start with server 0 */ uri_str = bson_strdup_printf("mongodb://%s/?" MONGOC_URI_REPLICASET "=rs", mock_server_get_host_and_port(server0)); client = test_framework_client_new(uri_str, NULL); scanner = client->topology->scanner; primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); BSON_ASSERT(!scanner->async->ncmds); future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); /* a single scan discovers servers 0 and 1 */ request = mock_server_receives_any_hello(server0); reply_to_request_simple(request, server0_response); request_destroy(request); /* let client process that response */ mlib_sleep_for(250, ms); request = mock_server_receives_any_hello(server1); reply_to_request_simple(request, server1_response); /* we don't schedule another check of server0 */ mlib_sleep_for(250, ms); BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); BSON_ASSERT(scanner->async->ncmds == 0); future_destroy(future); request_destroy(request); mongoc_read_prefs_destroy(primary_pref); bson_free(server1_response); bson_free(server0_response); bson_free(uri_str); mongoc_client_destroy(client); mock_server_destroy(server1); mock_server_destroy(server0); } void test_topology_scanner_connection_error(void) { mongoc_client_t *client; bson_error_t error; /* assuming nothing is listening on this port */ client = test_framework_client_new("mongodb://localhost:9876", NULL); ASSERT(!mongoc_client_command_simple(client, "db", tmp_bson("{'foo': 1}"), NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "connection refused calling hello on " "'localhost:9876'"); mongoc_client_destroy(client); } void test_topology_scanner_socket_timeout(void) { mock_server_t *server; mongoc_client_t *client; mongoc_uri_t *uri; bson_error_t error; char *expected_msg; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 10); client = test_framework_client_new_from_uri(uri, NULL); ASSERT(!mongoc_client_command_simple(client, "db", tmp_bson("{'foo': 1}"), NULL, NULL, &error)); /* the mock server did accept connection, but never replied */ expected_msg = bson_strdup_printf("socket timeout calling hello on '%s'", mongoc_uri_get_hosts(uri)->host_and_port); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, expected_msg); bson_free(expected_msg); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } typedef struct { uint16_t slow_port; mongoc_client_t *client; } initiator_data_t; static mongoc_stream_t * slow_initiator(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *err) { initiator_data_t *data; data = (initiator_data_t *)user_data; if (host->port == data->slow_port) { mlib_sleep_for(500, ms); /* 500 ms is longer than connectTimeoutMS */ } return mongoc_client_default_stream_initiator(uri, host, data->client, err); } static void test_topology_scanner_blocking_initiator(void) { mock_rs_t *rs; mongoc_uri_t *uri; mongoc_client_t *client; initiator_data_t data; bson_error_t error; rs = mock_rs_with_auto_hello(WIRE_VERSION_MIN, /* wire version */ true, /* has primary */ 1, /* n_secondaries */ 0 /* n_arbiters */); mock_rs_run(rs); uri = mongoc_uri_copy(mock_rs_get_uri(rs)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 100); client = test_framework_client_new_from_uri(uri, NULL); /* pretend last host in linked list is slow */ data.slow_port = mongoc_uri_get_hosts(uri)->next->port; data.client = client; mongoc_client_set_stream_initiator(client, slow_initiator, &data); ASSERT_OR_PRINT(mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, &error), error); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_rs_destroy(rs); } static mock_server_t * _mock_server_listening_on(char *server_bind_to) { mock_server_t *mock_server; mock_server_bind_opts_t opts = {0}; struct sockaddr_in ipv4_addr = {0}; struct sockaddr_in6 ipv6_addr = {0}; if (strcmp("both", server_bind_to) == 0) { opts.bind_addr_len = sizeof(ipv6_addr); opts.family = AF_INET6; opts.ipv6_only = 0; ipv6_addr.sin6_family = AF_INET6; ipv6_addr.sin6_port = htons(0); /* any port */ ipv6_addr.sin6_addr = in6addr_any; /* either IPv4 or IPv6 */ opts.bind_addr = (struct sockaddr_in *)&ipv6_addr; } else if (strcmp("ipv4", server_bind_to) == 0) { opts.bind_addr_len = sizeof(ipv4_addr); opts.family = AF_INET; opts.ipv6_only = 0; ipv4_addr.sin_family = AF_INET; ipv4_addr.sin_port = htons(0); BSON_ASSERT(inet_pton(AF_INET, "127.0.0.1", &ipv4_addr.sin_addr)); opts.bind_addr = &ipv4_addr; } else if (strcmp("ipv6", server_bind_to) == 0) { opts.bind_addr_len = sizeof(ipv6_addr); opts.family = AF_INET6; opts.ipv6_only = 1; ipv6_addr.sin6_family = AF_INET6; ipv6_addr.sin6_port = htons(0); BSON_ASSERT(inet_pton(AF_INET6, "::1", &ipv6_addr.sin6_addr)); opts.bind_addr = (struct sockaddr_in *)&ipv6_addr; } else { fprintf(stderr, "bad value of server_bind_to=%s\n", server_bind_to); ASSERT(false); } mock_server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_set_bind_opts(mock_server, &opts); mock_server_run(mock_server); return mock_server; } typedef struct dns_testcase { char *server_bind_to; /* ipv4, ipv6, or both */ char *client_hostname; /* 127.0.0.1, [::1], or localhost */ bool should_succeed; int expected_ncmds; char *expected_client_bind_to; /* ipv4, ipv6, or either */ } dns_testcase_t; static void _test_topology_scanner_dns_helper( uint32_t id, const bson_t *bson, int64_t rtt_msec, void *data, const bson_error_t *error /* IN */) { dns_testcase_t *testcase = (dns_testcase_t *)data; BSON_UNUSED(id); BSON_UNUSED(bson); BSON_UNUSED(rtt_msec); if (testcase->should_succeed) { ASSERT_OR_PRINT(!error->code, (*error)); } else { ASSERT(error->code); ASSERT_ERROR_CONTAINS((*error), MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "connection refused"); } } static void test_topology_scanner_dns_testcase(dns_testcase_t *testcase) { mongoc_host_list_t host; mock_server_t *server; mongoc_topology_scanner_t *ts; char *host_str; mongoc_socket_t *sock; mongoc_topology_scanner_node_t *node; bson_oid_t topology_id; mcommon_oid_set_zero(&topology_id); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); server = _mock_server_listening_on(testcase->server_bind_to); ts = mongoc_topology_scanner_new( NULL, &topology_id, &log_and_monitor, NULL, &_test_topology_scanner_dns_helper, testcase, TIMEOUT); host_str = bson_strdup_printf("%s:%d", testcase->client_hostname, mock_server_get_port(server)); BSON_ASSERT(_mongoc_host_list_from_string(&host, host_str)); /* we should only have one host. */ BSON_ASSERT(!host.next); bson_free(host_str); mongoc_topology_scanner_add(ts, &host, 1, false); mongoc_topology_scanner_scan(ts, 1 /* any server id is ok. */); ASSERT_CMPINT((int)(ts->async->ncmds), ==, testcase->expected_ncmds); mongoc_topology_scanner_work(ts); node = mongoc_topology_scanner_get_node(ts, 1); /* check the socket that the scanner found. */ if (testcase->should_succeed) { ASSERT(node->stream->type == MONGOC_STREAM_SOCKET); sock = mongoc_stream_socket_get_socket((mongoc_stream_socket_t *)node->stream); if (strcmp("ipv4", testcase->expected_client_bind_to) == 0) { ASSERT(sock->domain == AF_INET); } else if (strcmp("ipv6", testcase->expected_client_bind_to) == 0) { ASSERT(sock->domain == AF_INET6); } else if (strcmp("either", testcase->expected_client_bind_to) != 0) { fprintf(stderr, "bad value for testcase->expected_client_bind_to=%s\n", testcase->expected_client_bind_to); ASSERT(false); } } mongoc_topology_scanner_destroy(ts); mock_server_destroy(server); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } /* test when clients try connecting to servers varying the DNS results of the * clients and the socket binding of the server. */ static void test_topology_scanner_dns(void) { /* server can bind to: {ipv4 only, ipv6 only, both} * client can connect to: {127.0.0.1, ::1, localhost} * there are 9 combinations. */ int ntests, i; dns_testcase_t tests[] = {{"ipv4", "127.0.0.1", true, 1, "ipv4"}, {"ipv4", "[::1]", false, 1, "n/a"}, {"ipv6", "127.0.0.1", false, 1, "n/a"}, {"ipv6", "[::1]", true, 1, "ipv6"}, {"both", "127.0.0.1", true, 1, "ipv4"}, {"both", "[::1]", true, 1, "ipv6"}}; /* these tests require a hostname mapping to both IPv4 and IPv6 local. * this can be localhost normally, but some configurations may have localhost * only mapping to 127.0.0.1, not ::1. */ dns_testcase_t tests_with_ipv4_and_ipv6_uri[] = {{"ipv4", "", true, 2, "ipv4"}, {"ipv6", "", true, 2, "ipv6"}, {"both", "", true, 2, "either"}}; char *ipv4_and_ipv6_host = test_framework_getenv("MONGOC_TEST_IPV4_AND_IPV6_HOST"); ntests = sizeof(tests) / sizeof(dns_testcase_t); for (i = 0; i < ntests; ++i) { test_topology_scanner_dns_testcase(tests + i); } if (ipv4_and_ipv6_host) { ntests = sizeof(tests_with_ipv4_and_ipv6_uri) / sizeof(dns_testcase_t); for (i = 0; i < ntests; ++i) { tests_with_ipv4_and_ipv6_uri[i].client_hostname = ipv4_and_ipv6_host; test_topology_scanner_dns_testcase(tests_with_ipv4_and_ipv6_uri + i); } bson_free(ipv4_and_ipv6_host); } } static void _retired_fails_to_initiate_cb( uint32_t id, const bson_t *bson, int64_t rtt_msec, void *data, const bson_error_t *error /* IN */) { BSON_UNUSED(id); BSON_UNUSED(bson); BSON_UNUSED(rtt_msec); BSON_UNUSED(data); BSON_UNUSED(error); /* this should never get called. */ BSON_ASSERT(false); } static mongoc_stream_t * null_connect(mongoc_async_cmd_t *acmd) { BSON_UNUSED(acmd); return NULL; } /* test when a retired node fails to initiate a stream. CDRIVER-1972 introduced * a bug in which the topology callback would be incorrectly called when a * retired node failed to establish a connection. */ static void test_topology_retired_fails_to_initiate(void) { mock_server_t *server; mongoc_topology_scanner_t *scanner; mongoc_async_cmd_t *acmd; mongoc_host_list_t host_list; server = mock_server_with_auto_hello(WIRE_VERSION_MAX); mock_server_run(server); bson_oid_t topology_id; mcommon_oid_set_zero(&topology_id); mongoc_log_and_monitor_instance_t log_and_monitor; mongoc_log_and_monitor_instance_init(&log_and_monitor); scanner = mongoc_topology_scanner_new( NULL, &topology_id, &log_and_monitor, NULL, &_retired_fails_to_initiate_cb, NULL, TIMEOUT); BSON_ASSERT(_mongoc_host_list_from_string(&host_list, mock_server_get_host_and_port(server))); mongoc_topology_scanner_add(scanner, &host_list, 1, false); mongoc_topology_scanner_start(scanner, false); BSON_ASSERT(scanner->async->ncmds > 0); /* retire the node */ scanner->nodes->retired = true; /* override the stream initiator of every async command, simulating * a failed mongoc_socket_new or mongoc_stream_connect. */ DL_FOREACH(scanner->async->cmds, acmd) { scanner->async->cmds->_stream_connect = null_connect; } mongoc_topology_scanner_work(scanner); /* we expect the scanner callback not to get called. */ mongoc_topology_scanner_destroy(scanner); mock_server_destroy(server); mongoc_log_and_monitor_instance_destroy_contents(&log_and_monitor); } static void heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *event) { bson_error_t error; bool *failed = (bool *)mongoc_apm_server_heartbeat_failed_get_context(event); mongoc_apm_server_heartbeat_failed_get_error(event, &error); fprintf(stderr, "heartbeat failed: %s\n", error.message); fflush(stderr); *failed = true; } /* CDRIVER-2624: due to a bug, we repeated the TLS handshake on each heartbeat, * causing some MongoDB versions to hang up */ static void _test_topology_scanner_does_not_renegotiate(bool pooled) { mongoc_uri_t *uri; mongoc_apm_callbacks_t *callbacks; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bool failed = false; bool r; bson_error_t error; uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); /* faster pool shutdown to make the test quick */ mongoc_uri_set_option_as_int32(uri, "connectTimeoutMS", 1000); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_failed_cb(callbacks, heartbeat_failed); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); test_framework_set_pool_ssl_opts(pool); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &failed); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_apm_callbacks(client, callbacks, &failed); test_framework_set_ssl_opts(client); } /* ensure connection */ r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); mlib_sleep_for(1500, ms); r = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); /* no heartbeats failed */ BSON_ASSERT(!failed); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mongoc_apm_callbacks_destroy(callbacks); } static void test_topology_scanner_does_not_renegotiate_single(void *ctx) { BSON_UNUSED(ctx); _test_topology_scanner_does_not_renegotiate(false); } static void test_topology_scanner_does_not_renegotiate_pooled(void *ctx) { BSON_UNUSED(ctx); _test_topology_scanner_does_not_renegotiate(true); } void test_topology_scanner_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/TOPOLOGY/scanner", test_topology_scanner); #ifdef MONGOC_ENABLE_SSL_OPENSSL TestSuite_AddMockServerTest(suite, "/TOPOLOGY/scanner_ssl", test_topology_scanner_ssl); #endif TestSuite_AddMockServerTest(suite, "/TOPOLOGY/scanner_discovery", test_topology_scanner_discovery); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/scanner_oscillate", test_topology_scanner_oscillate); TestSuite_Add(suite, "/TOPOLOGY/scanner_connection_error", test_topology_scanner_connection_error); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/scanner_socket_timeout", test_topology_scanner_socket_timeout); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/blocking_initiator", test_topology_scanner_blocking_initiator); TestSuite_AddMockServerTest( suite, "/TOPOLOGY/dns", test_topology_scanner_dns, test_framework_skip_if_no_dual_ip_hostname); TestSuite_AddMockServerTest(suite, "/TOPOLOGY/retired_fails_to_initiate", test_topology_retired_fails_to_initiate); TestSuite_AddFull(suite, "/TOPOLOGY/scanner/renegotiate/single [lock:live-server][timeout:30]", test_topology_scanner_does_not_renegotiate_single, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/TOPOLOGY/scanner/renegotiate/pooled [lock:live-server][timeout:30]", test_topology_scanner_does_not_renegotiate_pooled, NULL, NULL, test_framework_skip_if_slow_or_live); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-topology.c000066400000000000000000003013721511661753600245440ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef MONGOC_LOG_DOMAIN #define MONGOC_LOG_DOMAIN "topology-test" typedef struct { size_t n_started; size_t n_succeeded; size_t n_failed; size_t n_unknowns; bson_mutex_t mutex; } checks_t; static void checks_init(checks_t *checks) { memset(checks, 0, sizeof(*checks)); bson_mutex_init(&checks->mutex); } static void checks_cleanup(checks_t *checks) { bson_mutex_destroy(&checks->mutex); } static bool checks_cmp(checks_t *checks, const char *metric, char cmp, size_t expected) { size_t actual = 0; bson_mutex_lock(&checks->mutex); if (0 == strcmp(metric, "n_started")) { actual = checks->n_started; } else if (0 == strcmp(metric, "n_succeeded")) { actual = checks->n_succeeded; } else if (0 == strcmp(metric, "n_failed")) { actual = checks->n_failed; } else if (0 == strcmp(metric, "n_unknowns")) { actual = checks->n_unknowns; } else { test_error("unknown metric: %s", metric); } bson_mutex_unlock(&checks->mutex); if (cmp == '=') { return actual == expected; } else if (cmp == '>') { return actual > expected; } else if (cmp == '<') { return actual < expected; } else { test_error("unknown comparison: %c", cmp); } return false; } static void check_started(const mongoc_apm_server_heartbeat_started_t *event) { checks_t *c; c = (checks_t *)mongoc_apm_server_heartbeat_started_get_context(event); bson_mutex_lock(&c->mutex); c->n_started++; bson_mutex_unlock(&c->mutex); } static void check_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *event) { checks_t *c; c = (checks_t *)mongoc_apm_server_heartbeat_succeeded_get_context(event); bson_mutex_lock(&c->mutex); c->n_succeeded++; bson_mutex_unlock(&c->mutex); } static void check_failed(const mongoc_apm_server_heartbeat_failed_t *event) { checks_t *c; c = (checks_t *)mongoc_apm_server_heartbeat_failed_get_context(event); bson_mutex_lock(&c->mutex); c->n_failed++; bson_mutex_unlock(&c->mutex); } static void server_changed_callback(const mongoc_apm_server_changed_t *event) { checks_t *c; const mongoc_server_description_t *sd; c = (checks_t *)mongoc_apm_server_changed_get_context(event); bson_mutex_lock(&c->mutex); sd = mongoc_apm_server_changed_get_new_description(event); if (sd->type == MONGOC_SERVER_UNKNOWN) { c->n_unknowns++; } bson_mutex_unlock(&c->mutex); } static mongoc_apm_callbacks_t * heartbeat_callbacks(void) { mongoc_apm_callbacks_t *callbacks; callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_server_heartbeat_started_cb(callbacks, check_started); mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, check_succeeded); mongoc_apm_set_server_heartbeat_failed_cb(callbacks, check_failed); mongoc_apm_set_server_changed_cb(callbacks, server_changed_callback); return callbacks; } static void test_topology_client_creation(void) { mongoc_uri_t *uri; mongoc_topology_scanner_node_t *node; mongoc_topology_t *topology_a; mongoc_topology_t *topology_b; mongoc_client_t *client_a; mongoc_client_t *client_b; mongoc_stream_t *topology_stream; mongoc_server_stream_t *server_stream; bson_error_t error; uri = test_framework_get_uri(); mongoc_uri_set_option_as_int32(uri, "localThresholdMS", 42); mongoc_uri_set_option_as_int32(uri, "connectTimeoutMS", 12345); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 54321); /* create two clients directly */ client_a = test_framework_client_new_from_uri(uri, NULL); client_b = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client_a); BSON_ASSERT(client_b); #ifdef MONGOC_ENABLE_SSL test_framework_set_ssl_opts(client_a); test_framework_set_ssl_opts(client_b); #endif /* ensure that they are using different topologies */ topology_a = client_a->topology; topology_b = client_b->topology; BSON_ASSERT(topology_a); BSON_ASSERT(topology_b); BSON_ASSERT(topology_a != topology_b); BSON_ASSERT(topology_a->local_threshold_msec == 42); BSON_ASSERT(topology_a->connect_timeout_msec == 12345); BSON_ASSERT(topology_a->server_selection_timeout_msec == 54321); /* ensure that their topologies are running in single-threaded mode */ BSON_ASSERT(topology_a->single_threaded); BSON_ASSERT(topology_a->scanner_state == MONGOC_TOPOLOGY_SCANNER_OFF); /* ensure that we are sharing streams with the client */ server_stream = mongoc_cluster_stream_for_reads(&client_a->cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); node = mongoc_topology_scanner_get_node(client_a->topology->scanner, server_stream->sd->id); BSON_ASSERT(node); topology_stream = node->stream; BSON_ASSERT(topology_stream); BSON_ASSERT(topology_stream == server_stream->stream); mongoc_server_stream_cleanup(server_stream); mongoc_client_destroy(client_a); mongoc_client_destroy(client_b); mongoc_uri_destroy(uri); } static void assert_topology_state(mongoc_topology_t *topology, mongoc_topology_scanner_state_t state) { ASSERT(topology); ASSERT(mlib_cmp(topology->scanner_state, ==, state)); } static void test_topology_thread_start_stop(void) { mongoc_client_pool_t *pool; mongoc_topology_t *topology; pool = test_framework_new_default_client_pool(); topology = _mongoc_client_pool_get_topology(pool); /* Test starting up the scanner */ _mongoc_topology_background_monitoring_start(topology); assert_topology_state(topology, MONGOC_TOPOLOGY_SCANNER_BG_RUNNING); /* Test that starting the topology while it is already running is ok to do. */ _mongoc_topology_background_monitoring_start(topology); assert_topology_state(topology, MONGOC_TOPOLOGY_SCANNER_BG_RUNNING); /* Test that we can stop the topology */ _mongoc_topology_background_monitoring_stop(topology); assert_topology_state(topology, MONGOC_TOPOLOGY_SCANNER_OFF); /* Test that stopping the topology when it is already stopped is ok to do. */ _mongoc_topology_background_monitoring_stop(topology); assert_topology_state(topology, MONGOC_TOPOLOGY_SCANNER_OFF); /* Test that we can start the topology again after stopping it */ _mongoc_topology_background_monitoring_start(topology); assert_topology_state(topology, MONGOC_TOPOLOGY_SCANNER_BG_RUNNING); mongoc_client_pool_destroy(pool); } static void test_topology_client_pool_creation(void) { mongoc_client_pool_t *pool; mongoc_client_t *client_a; mongoc_client_t *client_b; mongoc_topology_t *topology_a; mongoc_topology_t *topology_b; /* create two clients through a client pool */ pool = test_framework_new_default_client_pool(); client_a = mongoc_client_pool_pop(pool); client_b = mongoc_client_pool_pop(pool); BSON_ASSERT(client_a); BSON_ASSERT(client_b); /* ensure that they are using the same topology */ topology_a = client_a->topology; topology_b = client_b->topology; BSON_ASSERT(topology_a); BSON_ASSERT(topology_a == topology_b); /* ensure that this topology is running in a background thread */ BSON_ASSERT(!topology_a->single_threaded); BSON_ASSERT(topology_a->scanner_state != MONGOC_TOPOLOGY_SCANNER_OFF); mongoc_client_pool_push(pool, client_a); mongoc_client_pool_push(pool, client_b); mongoc_client_pool_destroy(pool); } static void test_server_selection_try_once_option(void *ctx) { const char *uri_strings[3] = { "mongodb://a", "mongodb://a/?serverSelectionTryOnce=true", "mongodb://a/?serverSelectionTryOnce=false"}; unsigned long i; mongoc_client_t *client; mongoc_uri_t *uri; mongoc_client_pool_t *pool; BSON_UNUSED(ctx); /* try_once is on by default for non-pooled, can be turned off */ client = test_framework_client_new(uri_strings[0], NULL); BSON_ASSERT(client->topology->server_selection_try_once); mongoc_client_destroy(client); client = test_framework_client_new(uri_strings[1], NULL); BSON_ASSERT(client->topology->server_selection_try_once); mongoc_client_destroy(client); client = test_framework_client_new(uri_strings[2], NULL); BSON_ASSERT(!client->topology->server_selection_try_once); mongoc_client_destroy(client); /* off for pooled clients, can't be enabled */ for (i = 0; i < sizeof(uri_strings) / sizeof(char *); i++) { uri = mongoc_uri_new("mongodb://a"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); BSON_ASSERT(!client->topology->server_selection_try_once); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); } } static void _test_server_selection(bool try_once) { mock_server_t *server; char *secondary_response; char *primary_response; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_read_prefs_t *primary_pref; future_t *future; bson_error_t error; request_t *request; mongoc_server_description_t *sd; if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_new(); mock_server_run(server); secondary_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': false," " 'secondary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); primary_response = bson_strdup_printf("{'ok': 1, " " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); mongoc_uri_set_option_as_int32(uri, "serverSelectionTimeoutMS", 100); if (!try_once) { /* serverSelectionTryOnce is on by default */ mongoc_uri_set_option_as_bool(uri, "serverSelectionTryOnce", false); } client = test_framework_client_new_from_uri(uri, NULL); primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); /* no primary, selection fails after one try */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(server); BSON_ASSERT(request); reply_to_request_simple(request, secondary_response); request_destroy(request); /* the selection timeout is 100 ms, and we can't rescan until a half second * passes, so selection fails without another hello call */ mock_server_set_request_timeout_msec(server, 600); BSON_ASSERT(!mock_server_receives_any_hello(server)); mock_server_set_request_timeout_msec(server, get_future_timeout_ms()); /* selection fails */ BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_SERVER_SELECTION); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_SERVER_SELECTION_FAILURE); ASSERT_STARTSWITH(error.message, "No suitable servers found"); if (try_once) { ASSERT_CONTAINS(error.message, "serverSelectionTryOnce"); } else { ASSERT_CONTAINS(error.message, "serverselectiontimeoutms"); } BSON_ASSERT(client->topology->stale); future_destroy(future); /* one heartbeat, plus a few milliseconds */ mlib_sleep_for(510, ms); /* second selection, now we try hello again */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(server); BSON_ASSERT(request); /* the secondary is now primary, selection succeeds */ reply_to_request_simple(request, primary_response); sd = future_get_mongoc_server_description_ptr(future); BSON_ASSERT(sd); BSON_ASSERT(!client->topology->stale); request_destroy(request); future_destroy(future); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(primary_pref); mongoc_client_destroy(client); mongoc_uri_destroy(uri); bson_free(secondary_response); bson_free(primary_response); mock_server_destroy(server); } static void test_server_selection_try_once(void *ctx) { BSON_UNUSED(ctx); _test_server_selection(true); } static void test_server_selection_try_once_false(void *ctx) { BSON_UNUSED(ctx); _test_server_selection(false); } static void host_list_init(mongoc_host_list_t *host_list, int family, const char *host, uint16_t port) { memset(host_list, 0, sizeof *host_list); host_list->family = family; bson_snprintf(host_list->host, sizeof host_list->host, "%s", host); bson_snprintf(host_list->host_and_port, sizeof host_list->host_and_port, "%s:%hu", host, port); } static void _test_topology_invalidate_server(bool pooled) { mongoc_server_description_t *fake_sd; const mongoc_server_description_t *sd; mongoc_client_t *client; mongoc_client_pool_t *pool = NULL; bson_error_t error; mongoc_host_list_t fake_host_list; uint32_t fake_id = 42; uint32_t id; mongoc_server_stream_t *server_stream; checks_t checks; mc_shared_tpld td; mc_tpld_modification tdmod; checks_init(&checks); mongoc_uri_t *const uri = test_framework_get_uri(); /* no auto heartbeat */ mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", INT32_MAX); mongoc_uri_set_option_as_int32(uri, "connectTimeoutMS", 3000); const size_t server_count = test_framework_server_count(); mongoc_apm_callbacks_t *const callbacks = heartbeat_callbacks(); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &checks); test_framework_set_pool_ssl_opts(pool); client = mongoc_client_pool_pop(pool); /* wait for all nodes to be scanned. */ WAIT_UNTIL(checks_cmp(&checks, "n_succeeded", '=', server_count)); /* background scanner complains about failed connection */ capture_logs(true); } else { client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); } /* call explicitly */ server_stream = mongoc_cluster_stream_for_reads(&client->cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); sd = server_stream->sd; id = server_stream->sd->id; BSON_ASSERT(sd->type == MONGOC_SERVER_STANDALONE || sd->type == MONGOC_SERVER_RS_PRIMARY || sd->type == MONGOC_SERVER_MONGOS); ASSERT_CMPINT64(sd->round_trip_time_msec, !=, (int64_t)-1); _mongoc_topology_invalidate_server(client->topology, id); td = mc_tpld_take_ref(client->topology); sd = mongoc_set_get_const(mc_tpld_servers_const(td.ptr), id); BSON_ASSERT(sd); BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); ASSERT_CMPINT64(sd->round_trip_time_msec, ==, (int64_t)-1); fake_sd = (mongoc_server_description_t *)bson_malloc0(sizeof(*fake_sd)); /* insert a 'fake' server description and ensure that it is invalidated by * driver */ host_list_init(&fake_host_list, AF_INET, "fakeaddress", 27033); mongoc_server_description_init(fake_sd, fake_host_list.host_and_port, fake_id); fake_sd->type = MONGOC_SERVER_STANDALONE; tdmod = mc_tpld_modify_begin(client->topology); mongoc_set_add(mc_tpld_servers(tdmod.new_td), fake_id, fake_sd); mongoc_topology_scanner_add(client->topology->scanner, &fake_host_list, fake_id, false); mc_tpld_modify_commit(tdmod); BSON_ASSERT(!mongoc_cluster_stream_for_server(&client->cluster, fake_id, true, NULL, NULL, &error)); mc_tpld_renew_ref(&td, client->topology); sd = mongoc_set_get_const(mc_tpld_servers_const(td.ptr), fake_id); /* A single threaded client, during reconnect, will scan ALL servers. * When it receives a response from one of those nodes, showing that * "fakeaddress" is not in the host list, it will remove the * server description from the topology description. */ if (!pooled && test_framework_is_replset()) { BSON_ASSERT(!sd); } else { BSON_ASSERT(sd); BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); BSON_ASSERT(sd->error.domain != 0); ASSERT_CMPINT64(sd->round_trip_time_msec, ==, (int64_t)-1); BSON_ASSERT(bson_empty(&sd->last_hello_response)); BSON_ASSERT(bson_empty(&sd->hosts)); BSON_ASSERT(bson_empty(&sd->passives)); BSON_ASSERT(bson_empty(&sd->arbiters)); BSON_ASSERT(bson_empty(&sd->compressors)); } mongoc_server_stream_cleanup(server_stream); mongoc_uri_destroy(uri); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_apm_callbacks_destroy(callbacks); checks_cleanup(&checks); mc_tpld_drop_ref(&td); } static void test_topology_invalidate_server_single(void *ctx) { BSON_UNUSED(ctx); _test_topology_invalidate_server(false); } static void test_topology_invalidate_server_pooled(void *ctx) { BSON_UNUSED(ctx); _test_topology_invalidate_server(true); } static void test_invalid_cluster_node(void *ctx) { mongoc_client_pool_t *pool; mongoc_cluster_node_t *cluster_node; bson_error_t error; mongoc_client_t *client; mongoc_cluster_t *cluster; mongoc_server_stream_t *server_stream; uint32_t id; const mongoc_server_description_t *sd; mc_shared_tpld td = MC_SHARED_TPLD_NULL; mc_tpld_modification tdmod; BSON_UNUSED(ctx); /* use client pool, this test is only valid when multi-threaded */ pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); cluster = &client->cluster; /* load stream into cluster */ server_stream = mongoc_cluster_stream_for_reads(&client->cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); id = server_stream->sd->id; mongoc_server_stream_cleanup(server_stream); cluster_node = (mongoc_cluster_node_t *)mongoc_set_get(cluster->nodes, id); BSON_ASSERT(cluster_node); BSON_ASSERT(cluster_node->stream); td = mc_tpld_take_ref(client->topology); sd = mongoc_topology_description_server_by_id_const(td.ptr, id, &error); ASSERT_OR_PRINT(sd, error); /* Both generations match, and are the first generation. */ ASSERT_CMPINT32(cluster_node->handshake_sd->generation, ==, 0); ASSERT_CMPINT32(mc_tpl_sd_get_generation(sd, &kZeroObjectId), ==, 0); /* update the server's generation, simulating a connection pool clearing */ tdmod = mc_tpld_modify_begin(client->topology); mc_tpl_sd_increment_generation(mongoc_topology_description_server_by_id(tdmod.new_td, id, &error), &kZeroObjectId); mc_tpld_modify_commit(tdmod); /* cluster discards node and creates new one with the current generation */ server_stream = mongoc_cluster_stream_for_server(&client->cluster, id, true, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); cluster_node = (mongoc_cluster_node_t *)mongoc_set_get(cluster->nodes, id); ASSERT_CMPINT64(cluster_node->handshake_sd->generation, ==, 1); mongoc_server_stream_cleanup(server_stream); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mc_tpld_drop_ref(&td); } static void test_max_wire_version_race_condition(void *ctx) { mongoc_server_description_t *sd; mongoc_database_t *database; mongoc_client_pool_t *pool; mongoc_client_t *client; bson_error_t error; mongoc_server_stream_t *server_stream; uint32_t id; mc_tpld_modification tdmod; bool r; BSON_UNUSED(ctx); /* connect directly and add our user, test is only valid with auth */ client = test_framework_new_default_client(); database = mongoc_client_get_database(client, "test"); (void)mongoc_database_remove_user(database, "pink", &error); r = mongoc_database_add_user(database, "pink", "panther", tmp_bson("[{'role': 'read', 'db': 'test'}]"), NULL, &error); ASSERT_OR_PRINT(r, error); mongoc_database_destroy(database); mongoc_client_destroy(client); /* use client pool, test is only valid when multi-threaded */ pool = test_framework_new_default_client_pool(); client = mongoc_client_pool_pop(pool); /* load stream into cluster */ server_stream = mongoc_cluster_stream_for_reads(&client->cluster, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); id = server_stream->sd->id; mongoc_server_stream_cleanup(server_stream); /* "disconnect": increment generation and reset server description */ tdmod = mc_tpld_modify_begin(client->topology); sd = mongoc_set_get(mc_tpld_servers(tdmod.new_td), id); BSON_ASSERT(sd); mc_tpl_sd_increment_generation(sd, &kZeroObjectId); mongoc_server_description_reset(sd); mc_tpld_modify_commit(tdmod); /* new stream, ensure that we can still auth with cached wire version */ server_stream = mongoc_cluster_stream_for_server(&client->cluster, id, true, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); BSON_ASSERT(server_stream); mongoc_server_stream_cleanup(server_stream); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } static void test_cooldown_standalone(void) { mock_server_t *server; mongoc_client_t *client; mongoc_read_prefs_t *primary_pref; future_t *future; bson_error_t error; request_t *request; mongoc_server_description_t *sd; int64_t start; server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); /* first hello fails, selection fails */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(server); BSON_ASSERT(request); reply_to_request_with_hang_up(request); BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); request_destroy(request); future_destroy(future); /* second selection doesn't try to call hello: we're in cooldown */ start = bson_get_monotonic_time(); sd = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); BSON_ASSERT(!sd); /* waited less than 500ms (minHeartbeatFrequencyMS), in fact * didn't wait at all since all nodes are in cooldown */ ASSERT_CMPINT64(bson_get_monotonic_time() - start, <, (int64_t)500000); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No servers yet eligible for rescan"); mlib_sleep_for(1, s); /* third selection doesn't try to call hello: we're still in cooldown */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); mock_server_set_request_timeout_msec(server, 100); BSON_ASSERT(!mock_server_receives_any_hello(server)); /* no hello call */ BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers"); future_destroy(future); mock_server_set_request_timeout_msec(server, get_future_timeout_ms()); // 5.1 seconds mlib_sleep_for(5100, ms); /* cooldown ends, now we try hello again, this time succeeding */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(server); /* not in cooldown now */ BSON_ASSERT(request); reply_to_request_simple(request, tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); sd = future_get_mongoc_server_description_ptr(future); BSON_ASSERT(sd); request_destroy(request); future_destroy(future); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(primary_pref); mongoc_client_destroy(client); mock_server_destroy(server); } static void test_cooldown_rs(void) { mock_server_t *servers[2]; /* two secondaries, no primary */ int i; mongoc_client_t *client; mongoc_read_prefs_t *primary_pref; char *secondary_response; char *primary_response; future_t *future; bson_error_t error; request_t *request; mongoc_server_description_t *sd; for (i = 0; i < 2; i++) { servers[i] = mock_server_new(); mock_server_run(servers[i]); } { char *uri_str = bson_strdup_printf("mongodb://localhost:%hu/?replicaSet=rs" "&serverSelectionTimeoutMS=100" "&connectTimeoutMS=100", mock_server_get_port(servers[0])); mongoc_uri_t *const uri = mongoc_uri_new_with_error(uri_str, &error); ASSERT_OR_PRINT(uri, error); // Prevent retryable handshakes from interfering with mock server hangups. mongoc_uri_set_option_as_bool(uri, MONGOC_URI_RETRYREADS, false); client = test_framework_client_new_from_uri(uri, NULL); bson_free(uri_str); mongoc_uri_destroy(uri); } primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); secondary_response = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': false," " 'minWireVersion': %d," " 'maxWireVersion': %d, " " 'secondary': true," " 'setName': 'rs'," " 'hosts': ['localhost:%hu', 'localhost:%hu']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_port(servers[0]), mock_server_get_port(servers[1])); primary_response = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d ," " 'setName': 'rs'," " 'hosts': ['localhost:%hu']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_port(servers[1])); /* server 0 is a secondary. */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(servers[0]); BSON_ASSERT(request); reply_to_request_simple(request, secondary_response); request_destroy(request); /* server 0 told us about server 1. we check it immediately but it's down. */ request = mock_server_receives_any_hello(servers[1]); BSON_ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); /* selection fails. */ BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); future_destroy(future); mlib_sleep_for(1, s); /* second selection doesn't try hello on server 1: it's in cooldown */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(servers[0]); BSON_ASSERT(request); reply_to_request_simple(request, secondary_response); request_destroy(request); mock_server_set_request_timeout_msec(servers[1], 100); BSON_ASSERT(!mock_server_receives_any_hello(servers[1])); mock_server_set_request_timeout_msec(servers[1], get_future_timeout_ms()); /* still no primary */ BSON_ASSERT(!future_get_mongoc_server_description_ptr(future)); future_destroy(future); // 5.1 seconds, longer than the 5sec cooldown mlib_sleep_for(5100, ms); /* cooldown ends, now we try hello on server 1, this time succeeding */ future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); request = mock_server_receives_any_hello(servers[1]); BSON_ASSERT(request); reply_to_request_simple(request, primary_response); request_destroy(request); /* server 0 doesn't need to respond */ sd = future_get_mongoc_server_description_ptr(future); BSON_ASSERT(sd); future_destroy(future); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(primary_pref); mongoc_client_destroy(client); bson_free(secondary_response); bson_free(primary_response); mock_server_destroy(servers[0]); mock_server_destroy(servers[1]); } /* test single-threaded client's cooldown with serverSelectionTryOnce false */ static void test_cooldown_retry(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_read_prefs_t *primary_pref; future_t *future; bson_error_t error; request_t *request; mongoc_server_description_t *sd; int64_t start; int64_t duration; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false); client = test_framework_client_new_from_uri(uri, NULL); primary_pref = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, primary_pref, NULL, &error); /* first hello fails */ request = mock_server_receives_any_hello(server); BSON_ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); /* after cooldown passes, driver sends another hello */ start = bson_get_monotonic_time(); request = mock_server_receives_any_hello(server); BSON_ASSERT(request); duration = bson_get_monotonic_time() - start; /* waited at least cooldownMS, but not unreasonably longer than that */ ASSERT_CMPINT64(duration, >, (int64_t)5 * 1000 * 1000); ASSERT_CMPINT64(duration, <, (int64_t)10 * 1000 * 1000); reply_to_request_simple(request, tmp_str("{'ok': 1," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); sd = future_get_mongoc_server_description_ptr(future); ASSERT_OR_PRINT(sd, error); request_destroy(request); future_destroy(future); mongoc_server_description_destroy(sd); mongoc_read_prefs_destroy(primary_pref); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void _test_select_succeed(bool try_once) { const int32_t connect_timeout_ms = 200; mock_server_t *primary; mock_server_t *secondary; mongoc_server_description_t *sd; char *uri_str; mongoc_uri_t *uri; mongoc_client_t *client; future_t *future; int64_t start; bson_error_t error; int64_t duration_usec; primary = mock_server_new(); mock_server_run(primary); secondary = mock_server_new(); mock_server_run(secondary); /* Note: do not use localhost here. If localhost has both A and AAAA records, * an attempt to connect to IPv6 occurs first. Most platforms refuse the IPv6 * attempt immediately, so IPv4 succeeds immediately. Windows is an * exception, and waits 1 second before refusing: * https://support.microsoft.com/en-us/help/175523/info-winsock-tcp-connection-performance-to-unused-ports */ /* primary auto-responds, secondary never responds */ mock_server_auto_hello(primary, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['127.0.0.1:%hu', '127.0.0.1:%hu']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_port(primary), mock_server_get_port(secondary)); uri_str = bson_strdup_printf("mongodb://127.0.0.1:%hu,127.0.0.1:%hu/" "?replicaSet=rs&connectTimeoutMS=%d", mock_server_get_port(primary), mock_server_get_port(secondary), connect_timeout_ms); uri = mongoc_uri_new(uri_str); BSON_ASSERT(uri); if (!try_once) { /* override default */ mongoc_uri_set_option_as_bool(uri, "serverSelectionTryOnce", false); } client = test_framework_client_new_from_uri(uri, NULL); /* start waiting for a primary (NULL read pref) */ start = bson_get_monotonic_time(); future = future_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, NULL, NULL, &error); /* selection succeeds */ sd = future_get_mongoc_server_description_ptr(future); ASSERT_OR_PRINT(sd, error); future_destroy(future); duration_usec = bson_get_monotonic_time() - start; ASSERT_ALMOST_EQUAL(duration_usec / 1000, connect_timeout_ms); mongoc_client_destroy(client); mongoc_uri_destroy(uri); bson_free(uri_str); mongoc_server_description_destroy(sd); mock_server_destroy(primary); mock_server_destroy(secondary); } /* CDRIVER-1219: a secondary is unavailable, scan should take connectTimeoutMS, * then we select primary */ static void test_select_after_timeout(void) { _test_select_succeed(false); } /* CDRIVER-1219: a secondary is unavailable, scan should try it once, * then we select primary */ static void test_select_after_try_once(void) { _test_select_succeed(true); } static void test_multiple_selection_errors(void) { const char *const uri = "mongodb://doesntexist.invalid,example.invalid/" "?replicaSet=rs&connectTimeoutMS=100"; mongoc_client_t *client; bson_t reply; bson_error_t error; client = test_framework_client_new(uri, NULL); mongoc_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, &reply, &error); ASSERT_CMPINT(MONGOC_ERROR_SERVER_SELECTION, ==, error.domain); ASSERT_CMPINT(MONGOC_ERROR_SERVER_SELECTION_FAILURE, ==, error.code); /* Like: * "No suitable servers found (`serverselectiontryonce` set): * [Failed to resolve 'doesntexist.invalid'] * [Failed to resolve 'example.invalid'] */ ASSERT_CONTAINS(error.message, "No suitable servers found"); /* either "connection error" or "connection timeout" calling hello */ ASSERT_CONTAINS(error.message, "[Failed to resolve 'doesntexist.invalid']"); ASSERT_CONTAINS(error.message, "[Failed to resolve 'example.invalid']"); bson_destroy(&reply); mongoc_client_destroy(client); } static void test_invalid_server_id(void) { mongoc_client_t *client; bson_error_t error; client = test_framework_new_default_client(); BSON_ASSERT( !mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 99999, &error)); ASSERT_STARTSWITH(error.message, "Could not find description for node"); mongoc_client_destroy(client); } static bool auto_ping(request_t *request, void *data) { BSON_UNUSED(data); if (!request->is_command || strcasecmp(request->command_name, "ping")) { return false; } reply_to_request_with_ok_and_destroy(request); return true; } /* Tests CDRIVER-562: after calling hello to handshake a new connection we * must update topology description with the server response. */ static void _test_server_removed_during_handshake(bool pooled) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bool r; bson_error_t error; mongoc_server_description_t *sd; mongoc_server_description_t **sds; size_t n; server = mock_server_new(); mock_server_run(server); mock_server_autoresponds(server, auto_ping, NULL, NULL); mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); /* no auto heartbeat */ mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", INT32_MAX); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } /* initial connection, discover one-node replica set */ r = mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); ASSERT_CMPINT(_mongoc_topology_get_type(client->topology), ==, MONGOC_TOPOLOGY_RS_WITH_PRIMARY); sd = mongoc_client_get_server_description(client, 1); ASSERT_CMPINT((int)MONGOC_SERVER_RS_PRIMARY, ==, sd->type); mongoc_server_description_destroy(sd); /* primary changes setName */ mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'BAD NAME'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); /* pretend to close a connection. does NOT affect server description yet */ mongoc_cluster_disconnect_node(&client->cluster, 1); sd = mongoc_client_get_server_description(client, 1); /* still primary */ ASSERT_CMPINT((int)MONGOC_SERVER_RS_PRIMARY, ==, sd->type); mongoc_server_description_destroy(sd); /* opens new stream and runs hello again, discovers bad setName. */ capture_logs(true); r = mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT(!r); ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_WARNING, "Last server removed from topology"); capture_logs(false); if (!pooled) { ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "Could not find stream for node"); } else { ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NOT_ESTABLISHED, "removed from topology"); } sds = mongoc_client_get_server_descriptions(client, &n); ASSERT_CMPSIZE_T(n, ==, (size_t)0); ASSERT_CMPINT(_mongoc_topology_get_type(client->topology), ==, MONGOC_TOPOLOGY_RS_NO_PRIMARY); if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_server_descriptions_destroy_all(sds, n); mock_server_destroy(server); mongoc_uri_destroy(uri); } static void test_server_removed_during_handshake_single(void) { _test_server_removed_during_handshake(false); } static void test_server_removed_during_handshake_pooled(void) { _test_server_removed_during_handshake(true); } static void test_rtt(void *ctx) { mock_server_t *server; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; mongoc_server_description_t const *sd; int64_t rtt_msec; BSON_UNUSED(ctx); if (!TestSuite_CheckMockServerAllowed()) { return; } server = mock_server_new(); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); request = mock_server_receives_any_hello(server); mlib_sleep_for(1, s); reply_to_request( request, MONGOC_REPLY_NONE, 0, 0, 1, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'ping': 1}")); reply_to_request( request, MONGOC_REPLY_NONE, 0, 0, 1, tmp_str("{'ok': 1, 'minWireVersion': %d, 'maxWireVersion': %d}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); sd = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 1, NULL); ASSERT(sd); /* assert, with plenty of slack, that rtt was calculated in ms, not usec */ rtt_msec = mongoc_server_description_round_trip_time(sd); ASSERT_CMPINT64(rtt_msec, >, (int64_t)900); /* 900 ms */ ASSERT_CMPINT64(rtt_msec, <, (int64_t)9000); /* 9 seconds */ future_destroy(future); mongoc_client_destroy(client); mock_server_destroy(server); } /* mongoc_topology_scanner_add and mongoc_topology_scan are called while holding * a topology modification lock to add a discovered node and call getaddrinfo on * its host immediately - test that this doesn't cause a recursive acquire this * lock. */ static void test_add_and_scan_failure(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client; future_t *future; request_t *request; bson_error_t error; mongoc_server_description_t const *sd; server = mock_server_new(); mock_server_run(server); /* client will discover "fake" host and fail to connect */ mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s', 'fake:1']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); { mc_shared_tpld shared_tpld = mc_tpld_take_ref(client->topology); sd = mongoc_topology_description_server_by_id_const(shared_tpld.ptr, 1, NULL); ASSERT(sd); ASSERT_CMPSTR(mongoc_server_description_type(sd), "RSPrimary"); mc_tpld_drop_ref(&shared_tpld); } { mc_shared_tpld shared_tpld = mc_tpld_take_ref(client->topology); sd = mongoc_topology_description_server_by_id_const(mc_tpld_unsafe_get_const(client->topology), 2, NULL); ASSERT(sd); ASSERT_CMPSTR(mongoc_server_description_type(sd), "Unknown"); mc_tpld_drop_ref(&shared_tpld); } future_destroy(future); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); } static future_t * future_command(mongoc_client_t *client, bson_error_t *error) { return future_client_command_simple(client, "admin", tmp_bson("{'foo': 1}"), NULL, NULL, error); } static void receives_command(mock_server_t *server, future_t *future) { request_t *request; bson_error_t error; request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'foo': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); } static bool has_known_server(mongoc_client_t *client) { mongoc_server_description_t *sd; bool r; ASSERT(client); /* in this test we know the server id is always 1 */ sd = mongoc_client_get_server_description(client, 1); r = (sd->type != MONGOC_SERVER_UNKNOWN); mongoc_server_description_destroy(sd); return r; } static void _test_hello_retry_single(bool hangup, size_t n_failures) { checks_t checks; mongoc_apm_callbacks_t *callbacks; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; char *hello; future_t *future; request_t *request; bson_error_t error; int64_t t; checks_init(&checks); server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_REPLICASET, "rs"); if (!hangup) { mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 100); } client = test_framework_client_new_from_uri(uri, NULL); callbacks = heartbeat_callbacks(); mongoc_client_set_apm_callbacks(client, callbacks, &checks); hello = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); /* start a {foo: 1} command, handshake normally */ future = future_command(client, &error); request = mock_server_receives_any_hello(server); reply_to_request_simple(request, hello); request_destroy(request); receives_command(server, future); /* wait for the next server check */ mlib_sleep_for(600, ms); /* start a {foo: 1} command, server check fails and retries immediately */ future = future_command(client, &error); request = mock_server_receives_any_hello(server); t = bson_get_monotonic_time(); if (hangup) { reply_to_request_with_hang_up(request); } request_destroy(request); /* retry immediately (for testing, "immediately" means less than 250ms */ request = mock_server_receives_any_hello(server); ASSERT_CMPINT64(bson_get_monotonic_time() - t, <, (int64_t)250 * 1000); if (n_failures == 2u) { if (hangup) { reply_to_request_with_hang_up(request); } BSON_ASSERT(!future_get_bool(future)); future_destroy(future); } else { reply_to_request_simple(request, hello); /* the {foo: 1} command finishes */ receives_command(server, future); } request_destroy(request); ASSERT_CMPSIZE_T(checks.n_started, ==, 3u); WAIT_UNTIL(checks.n_succeeded == 3u - n_failures); WAIT_UNTIL(checks.n_failed == n_failures); if (n_failures == 2u) { BSON_ASSERT(!has_known_server(client)); } else { BSON_ASSERT(has_known_server(client)); } mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); bson_free(hello); mongoc_apm_callbacks_destroy(callbacks); checks_cleanup(&checks); } static void _test_hello_retry_pooled(bool hangup, size_t n_failures) { checks_t checks; mongoc_apm_callbacks_t *callbacks; mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; char *hello; future_t *future; request_t *request; bson_error_t error; int64_t t; checks_init(&checks); server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_REPLICASET, "rs"); if (!hangup) { mongoc_uri_set_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 100); } pool = mongoc_client_pool_new(uri); callbacks = heartbeat_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &checks); client = mongoc_client_pool_pop(pool); hello = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); /* As soon as the client is popped, background monitoring starts. */ request = mock_server_receives_legacy_hello(server, NULL); reply_to_request_simple(request, hello); request_destroy(request); /* start a {foo: 1} command, handshake normally */ future = future_command(client, &error); /* Another hello to handshake the connection */ request = mock_server_receives_legacy_hello(server, NULL); reply_to_request_simple(request, hello); request_destroy(request); /* the {foo: 1} command finishes */ receives_command(server, future); /* wait for the next server check */ request = mock_server_receives_legacy_hello(server, NULL); t = bson_get_monotonic_time(); if (hangup) { reply_to_request_with_hang_up(request); } request_destroy(request); /* retry immediately (for testing, "immediately" means less than 250ms */ request = mock_server_receives_legacy_hello(server, NULL); ASSERT_CMPINT64(bson_get_monotonic_time() - t, <, (int64_t)250 * 1000); /* The server is marked as Unknown, but immediately rescanned. This behavior * comes from the server monitoring spec: * "To handle the case that the server is truly down, the monitor makes the * server unselectable by marking it Unknown. To handle the case of a * transient network glitch or restart, the monitor immediately runs the next * check without waiting". */ BSON_ASSERT(!has_known_server(client)); if (n_failures == 2u) { if (hangup) { reply_to_request_with_hang_up(request); } } else { reply_to_request_simple(request, hello); WAIT_UNTIL(has_known_server(client)); } request_destroy(request); WAIT_UNTIL(checks_cmp(&checks, "n_succeeded", '=', 3u - n_failures)); WAIT_UNTIL(checks_cmp(&checks, "n_failed", '=', n_failures)); BSON_ASSERT(checks_cmp(&checks, "n_started", '=', 3u)); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); mock_server_destroy(server); bson_free(hello); mongoc_apm_callbacks_destroy(callbacks); checks_cleanup(&checks); } static void test_hello_retry_single_hangup(void) { _test_hello_retry_single(true, 1u); } static void test_hello_retry_single_timeout(void) { _test_hello_retry_single(false, 1u); } static void test_hello_retry_single_hangup_fail(void) { _test_hello_retry_single(true, 2u); } static void test_hello_retry_single_timeout_fail(void) { _test_hello_retry_single(false, 2u); } static void test_hello_retry_pooled_hangup(void) { _test_hello_retry_pooled(true, 1u); } static void test_hello_retry_pooled_timeout(void) { _test_hello_retry_pooled(false, 1u); } static void test_hello_retry_pooled_hangup_fail(void) { _test_hello_retry_pooled(true, 2u); } static void test_hello_retry_pooled_timeout_fail(void) { _test_hello_retry_pooled(false, 2u); } static void test_incompatible_error(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; bson_error_t error; char *msg; /* incompatible */ server = mock_server_new(); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN - 1, WIRE_VERSION_MIN - 1); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 500); client = test_framework_client_new_from_uri(uri, NULL); /* trigger connection, fails due to incompatibility */ ASSERT(!mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, tmp_str("reports wire version %d, but this version of libmongoc " "requires at least %d (MongoDB %s)", WIRE_VERSION_MIN - 1, WIRE_VERSION_MIN, _mongoc_wire_version_to_server_version(WIRE_VERSION_MIN))); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MAX + 1, WIRE_VERSION_MAX + 1); /* wait until it's time for next heartbeat */ mlib_sleep_for(600, ms); ASSERT(!mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, &error)); msg = bson_strdup_printf("requires wire version %d, but this version of " "libmongoc only supports up to %d", WIRE_VERSION_MAX + 1, WIRE_VERSION_MAX); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, msg); bson_free(msg); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } /* ensure there's no invalid access if a null bson_error_t pointer is passed * to mongoc_topology_compatible () */ static void test_compatible_null_error_pointer(void) { mock_server_t *server; mongoc_client_t *client; mongoc_topology_description_t const *td; bson_error_t error; /* incompatible */ server = mock_server_new(); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d}", WIRE_VERSION_MIN - 1, WIRE_VERSION_MIN - 1); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* trigger connection, fails due to incompatibility */ ASSERT(!mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_PROTOCOL, MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, ""); /* null error pointer is ok */ td = mc_tpld_unsafe_get_const(client->topology); ASSERT(!mongoc_topology_compatible(td, NULL /* read prefs */, NULL /* error */)); mongoc_client_destroy(client); mock_server_destroy(server); } static char * cluster_time_fmt(int t) { return bson_strdup_printf("{" " 'clusterTime': {'$timestamp': {'t': %d, 'i': 1}}," " 'signature': {" " 'hash': {'$binary': {'subType': '0', 'base64': 'Yw=='}}," " 'keyId': {'$numberLong': '6446735049323708417'}" " }," " 'operationTime': {'$timestamp': {'t': 1, 'i': 1}}" "}", t); } static void test_cluster_time_updated_during_handshake(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client; bool r; bson_error_t error; char *cluster_time; mongoc_server_description_t *sd; server = mock_server_new(); mock_server_run(server); mock_server_autoresponds(server, auto_ping, NULL, NULL); cluster_time = cluster_time_fmt(1); mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']," " '$clusterTime': %s}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server), cluster_time); uri = mongoc_uri_copy(mock_server_get_uri(server)); /* set a large heartbeatFrequencyMS so we don't do a background scan in * between the first scan and handshake. */ mongoc_uri_set_option_as_int32(uri, "heartbeatFrequencyMS", 99999); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "rs"); pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); /* ensure a topology scan has run, populating the topology description. */ sd = mongoc_client_select_server(client, false, NULL, &error); ASSERT_OR_PRINT(sd, error); mongoc_server_description_destroy(sd); /* expect no cluster time. SDAM does not update cluster time. */ ASSERT(bson_empty(&mc_tpld_unsafe_get_const(client->topology)->cluster_time)); /* remove the node from the cluster to trigger a hello handshake. */ mongoc_cluster_disconnect_node(&client->cluster, 1); /* opens new stream and does a hello handshake (in pooled mode only). */ r = mongoc_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(r, error); /* expect cluster time updated from handshake. */ ASSERT_MATCH(&mc_tpld_unsafe_get_const(client->topology)->cluster_time, cluster_time); bson_free(cluster_time); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mock_server_destroy(server); mongoc_uri_destroy(uri); } /* test that when a command receives a "not primary" or "node is recovering" * error that the client takes the appropriate action: * - a pooled client should mark the server as unknown and request a full scan * of the topology * - a single-threaded client should mark the server as unknown and mark the * topology as stale. */ static void _test_request_scan_on_error( bool pooled, const char *err_response, bool should_scan, bool should_mark_unknown, const char *server_err) { mock_server_t *primary, *secondary; char *uri_str; mongoc_uri_t *uri; mongoc_client_pool_t *client_pool = NULL; mongoc_client_t *client = NULL; bson_t reply; bson_error_t error = {0}; future_t *future = NULL; request_t *request; const int64_t minHBMS = 10; int64_t ping_started_usec = 0; mongoc_apm_callbacks_t *callbacks; checks_t checks; mongoc_server_description_t *sd; uint32_t primary_id; mongoc_read_prefs_t *read_prefs; MONGOC_DEBUG("pooled? %d", (int)pooled); MONGOC_DEBUG("err_response %s", err_response); MONGOC_DEBUG("should_scan %d, should_mark_unknown: %d", (int)should_scan, (int)should_mark_unknown); MONGOC_DEBUG("server_error %s", server_err); checks_init(&checks); read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY_PREFERRED); primary = mock_server_new(); secondary = mock_server_new(); mock_server_run(primary); mock_server_run(secondary); RS_RESPONSE_TO_HELLO(primary, WIRE_VERSION_MIN, true, false, primary, secondary); RS_RESPONSE_TO_HELLO(secondary, WIRE_VERSION_MIN, false, false, primary, secondary); /* set a high heartbeatFrequency. Only the first and requested scans run. */ uri_str = bson_strdup_printf("mongodb://%s,%s/?replicaSet=rs&heartbeatFrequencyMS=999999", mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary)); uri = mongoc_uri_new(uri_str); bson_free(uri_str); if (pooled) { mongoc_topology_t *topology; client_pool = test_framework_client_pool_new_from_uri(uri, NULL); topology = _mongoc_client_pool_get_topology(client_pool); /* set a small minHeartbeatFrequency, so scans don't block for 500ms. */ topology->min_heartbeat_frequency_msec = minHBMS; } else { client = test_framework_client_new_from_uri(uri, NULL); /* set a small minHeartbeatFrequency, so scans don't block for 500ms. */ client->topology->min_heartbeat_frequency_msec = minHBMS; } callbacks = heartbeat_callbacks(); if (pooled) { mongoc_client_pool_set_apm_callbacks(client_pool, callbacks, &checks); } else { mongoc_client_set_apm_callbacks(client, callbacks, &checks); } mongoc_apm_callbacks_destroy(callbacks); if (pooled) { client = mongoc_client_pool_pop(client_pool); /* Scanning starts, wait for the initial scan. */ WAIT_UNTIL(checks_cmp(&checks, "n_succeeded", '=', 2)); } sd = mongoc_client_select_server(client, true, NULL, &error); ASSERT_OR_PRINT(sd, error); primary_id = sd->id; mongoc_server_description_destroy(sd); BSON_ASSERT(checks_cmp(&checks, "n_succeeded", '=', 2)); mongoc_uri_destroy(uri); ping_started_usec = bson_get_monotonic_time(); /* run a ping command on the primary. */ future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), read_prefs, &reply, &error); request = mock_server_receives_msg(primary, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); /* Capture logs to swallow warnings about endSessions */ capture_logs(true); reply_to_request_simple(request, err_response); request_destroy(request); /* don't check the return value of future. write concern errors are still * considered successful results. */ future_wait(future); future_destroy(future); bson_destroy(&reply); sd = mongoc_client_get_server_description(client, primary_id); if (should_mark_unknown) { BSON_ASSERT(checks_cmp(&checks, "n_unknowns", '=', 1)); /* background monitoring may have already overwritten the unknown server * description if the scan was requested. */ if (pooled) { if (sd->type == MONGOC_SERVER_UNKNOWN) { if (server_err) { ASSERT_CMPSTR(server_err, sd->error.message); } } } else { /* after the 'ping' command and returning, the server should * have been marked as unknown. */ BSON_ASSERT(sd->type == MONGOC_SERVER_UNKNOWN); ASSERT_CMPINT64(sd->last_update_time_usec, >=, ping_started_usec); ASSERT_CMPINT64(sd->last_update_time_usec, <=, bson_get_monotonic_time()); /* check that the error on the server description matches the error * message in the response. */ if (server_err) { ASSERT_CMPSTR(server_err, sd->error.message); } } } else { BSON_ASSERT(sd->type != MONGOC_SERVER_UNKNOWN); } mongoc_server_description_destroy(sd); if (pooled) { if (should_scan) { /* a scan is requested immediately. wait for the scan to finish. */ WAIT_UNTIL(checks_cmp(&checks, "n_started", '=', 4)); } else { mlib_sleep_for((minHBMS, us), mul, 2); BSON_ASSERT(checks_cmp(&checks, "n_started", '=', 2)); } } else { /* a single threaded client may mark the topology as stale. if a scan * should occur, it won't be triggered until the next command. */ future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), read_prefs, &reply, &error); if (should_scan || !should_mark_unknown) { request = mock_server_receives_msg(primary, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); } else { /* if the primary was marked as UNKNOWN, and no scan occurred, the ping * goes to the secondary. */ request = mock_server_receives_msg(secondary, MONGOC_QUERY_NONE, tmp_bson("{'ping': 1}")); } reply_to_request_simple(request, "{'ok': 1}"); request_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); bson_destroy(&reply); if (should_scan) { BSON_ASSERT(checks_cmp(&checks, "n_started", '=', 4)); } else { BSON_ASSERT(checks_cmp(&checks, "n_started", '=', 2)); } } if (pooled) { mongoc_client_pool_push(client_pool, client); mongoc_client_pool_destroy(client_pool); } else { mongoc_client_destroy(client); } mock_server_destroy(primary); mock_server_destroy(secondary); mongoc_read_prefs_destroy(read_prefs); checks_cleanup(&checks); } static void test_last_server_removed_warning(void) { mock_server_t *server; mongoc_client_t *client; mongoc_uri_t *uri; mongoc_server_description_t *description; mongoc_read_prefs_t *read_prefs; bson_error_t error; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_utf8(uri, "replicaSet", "set"); client = test_framework_client_new_from_uri(uri, NULL); read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); mock_server_auto_hello(server, "{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['127.0.0.1:%hu']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_port(server)); capture_logs(true); description = mongoc_topology_select(client->topology, MONGOC_SS_READ, TEST_SS_LOG_CONTEXT, read_prefs, NULL, &error); ASSERT_CAPTURED_LOG("topology", MONGOC_LOG_LEVEL_WARNING, "Last server removed from topology"); capture_logs(false); mongoc_server_description_destroy(description); mongoc_read_prefs_destroy(read_prefs); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_request_scan_on_error(void) { #define TEST_POOLED(msg, should_scan, should_mark_unknown, server_err) \ _test_request_scan_on_error(true, msg, should_scan, should_mark_unknown, server_err) #define TEST_SINGLE(msg, should_scan, should_mark_unknown, server_err) \ _test_request_scan_on_error(false, msg, should_scan, should_mark_unknown, server_err) #define TEST_BOTH(msg, should_scan, should_mark_unknown, server_err) \ TEST_POOLED(msg, should_scan, should_mark_unknown, server_err); \ TEST_SINGLE(msg, should_scan, should_mark_unknown, server_err) TEST_BOTH("{'ok': 0, 'errmsg': 'not master'}", true /* should_scan */, true /* should_mark_unknown */, "not master"); /* "node is recovering" behaves differently for single and pooled clients. */ TEST_SINGLE("{'ok': 0, 'errmsg': 'node is recovering'}", false /* should_scan */, true /* should_mark_unknown */, "node is recovering"); /* Test that "not primary or secondary" is considered a "node is recovering" * error, not a "not primary" error. */ TEST_SINGLE("{'ok': 0, 'errmsg': 'not master or secondary'}", false /* should_scan */, true /* should_mark_unknown */, "not master or secondary"); TEST_POOLED("{'ok': 0, 'errmsg': 'node is recovering'}", true /* should_scan */, true /* should_mark_unknown */, "node is recovering"); /* Test that "not primary or secondary" is considered a "node is recovering" * error, not a "not primary" error. */ TEST_POOLED("{'ok': 0, 'errmsg': 'not master or secondary'}", true /* should_scan */, true /* should_mark_unknown */, "not master or secondary"); TEST_BOTH( "{'ok': 0, 'errmsg': 'random error'}", false /* should_scan */, false /* should_mark_unknown */, "random error"); /* check the error code for NotPrimary, which should be considered a "not * primary" error. */ TEST_BOTH( "{'ok': 0, 'code': 10107 }", true /* should_scan */, true /* should_mark_unknown */, NULL /* server_err */); /* for an unknown code, the message should not be checked. */ TEST_BOTH("{'ok': 0, 'code': 12345, 'errmsg': 'not master'}", false /* should_scan */, false /* should_mark_unknown */, "not master"); /* check the error code for InterruptedAtShutdown, which behaves * much like a "node is recovering" error. */ TEST_SINGLE( "{'ok': 0, 'code': 11600 }", false /* should_scan */, true /* should_mark_unknown */, NULL /* server_err */); TEST_POOLED( "{'ok': 0, 'code': 11600 }", true /* should_scan */, true /* should_mark_unknown */, NULL /* server_err */); /* write concern errors are also checked. */ _test_request_scan_on_error(1, "{'ok': 1, 'writeConcernError': { 'errmsg': 'not master' }}", 1, 1, "not master"); _test_request_scan_on_error(0, "{'ok': 1, 'writeConcernError': { 'errmsg': 'not master' }}", 1, 1, "not master"); TEST_BOTH("{'ok': 1, 'writeConcernError': { 'code': 10107 }}", true, /* should_scan */ true /* should_mark_unknown */, NULL /* server_err */); #undef TEST_BOTH #undef TEST_POOLED #undef TEST_SINGLE } /* Test that the issue described in CDRIVER-3625 is fixed. * A slow-to-respond server should not block the scan of other servers * in background monitoring. */ static void test_slow_server_pooled(void) { mock_server_t *primary; mock_server_t *secondary; char *hello_common; char *hello_primary; char *hello_secondary; mongoc_read_prefs_t *prefs_secondary; mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_uri_t *uri; mongoc_apm_callbacks_t *callbacks; request_t *request; checks_t checks; bool ret; bson_error_t error; mc_tpld_modification tdmod; checks_init(&checks); primary = mock_server_new(); secondary = mock_server_new(); mock_server_run(primary); mock_server_run(secondary); mock_server_autoresponds(primary, auto_ping, NULL, NULL); mock_server_autoresponds(secondary, auto_ping, NULL, NULL); hello_common = bson_strdup_printf("{'ok': 1," " 'setName': 'rs'," " 'hosts': ['%s', '%s']," " 'minWireVersion': %d," " 'maxWireVersion': %d", mock_server_get_host_and_port(primary), mock_server_get_host_and_port(secondary), WIRE_VERSION_MIN, WIRE_VERSION_MAX); hello_primary = bson_strdup_printf("%s, 'isWritablePrimary': true, 'secondary': false }", hello_common); hello_secondary = bson_strdup_printf("%s, 'isWritablePrimary': false, 'secondary': true }", hello_common); /* Primary responds immediately, but secondary does not. */ mock_server_auto_hello(primary, hello_primary); uri = mongoc_uri_copy(mock_server_get_uri(primary)); /* Do not connect as topology type Single, so the client pool discovers the * secondary. */ mongoc_uri_set_option_as_bool(uri, MONGOC_URI_DIRECTCONNECTION, false); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 500); pool = mongoc_client_pool_new(uri); callbacks = heartbeat_callbacks(); mongoc_client_pool_set_apm_callbacks(pool, callbacks, &checks); /* Set a shorter heartbeat frequencies for faster responses. */ tdmod = mc_tpld_modify_begin(_mongoc_client_pool_get_topology(pool)); tdmod.new_td->heartbeat_msec = 10; mc_tpld_modify_commit(tdmod); _mongoc_client_pool_get_topology(pool)->min_heartbeat_frequency_msec = 10; client = mongoc_client_pool_pop(pool); /* As soon as a client is popped, background scanning starts. * Wait for two scans of the primary. */ WAIT_UNTIL(checks_cmp(&checks, "n_started", '>', 1)); request = mock_server_receives_legacy_hello(secondary, NULL); /* A command to the primary succeeds. */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); /* A command to the secondary fails. */ prefs_secondary = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), prefs_secondary, NULL, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "expired"); BSON_ASSERT(!ret); /* Set up an auto responder so future hellos on the secondary do not * block until connectTimeoutMS. Otherwise, the shutdown sequence will be * blocked for connectTimeoutMS. */ mock_server_auto_hello(secondary, hello_secondary); /* Respond to the first hello. */ reply_to_request_simple(request, hello_secondary); request_destroy(request); /* Now a command to the secondary succeeds. */ ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), prefs_secondary, NULL, &error); ASSERT_OR_PRINT(ret, error); mongoc_read_prefs_destroy(prefs_secondary); mongoc_client_pool_push(pool, client); mongoc_apm_callbacks_destroy(callbacks); mongoc_client_pool_destroy(pool); mongoc_uri_destroy(uri); bson_free(hello_secondary); bson_free(hello_primary); bson_free(hello_common); mock_server_destroy(secondary); mock_server_destroy(primary); checks_cleanup(&checks); } static void _test_hello_versioned_api(bool pooled) { mongoc_client_pool_t *pool = NULL; mongoc_client_t *client = NULL; future_t *future = NULL; request_t *request = NULL; bson_error_t error; mongoc_server_api_version_t version; mock_server_t *const server = mock_server_new(); mock_server_run(server); mongoc_uri_t *const uri = mongoc_uri_copy(mock_server_get_uri(server)); BSON_ASSERT(mongoc_server_api_version_from_string("1", &version)); mongoc_server_api_t *const api = mongoc_server_api_new(version); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, api); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, api); } char *const hello_reply = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); /* For client pools, the first handshake happens when the client is popped. * For non-pooled clients, we send a ping command to trigger a handshake. */ if (!pooled) { future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); } request = mock_server_receives_hello_op_msg(server); BSON_ASSERT(request); BSON_ASSERT(bson_has_field(request_get_doc(request, 0), "apiVersion")); BSON_ASSERT(bson_has_field(request_get_doc(request, 0), "helloOk")); reply_to_request_simple(request, hello_reply); request_destroy(request); if (!pooled) { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_server_api_destroy(api); mongoc_uri_destroy(uri); mock_server_destroy(server); bson_free(hello_reply); } static void test_hello_versioned_api_single(void) { _test_hello_versioned_api(false); } static void test_hello_versioned_api_pooled(void) { _test_hello_versioned_api(true); } static void _test_hello_ok(bool pooled) { mock_server_t *server = NULL; mongoc_uri_t *uri = NULL; mongoc_client_pool_t *pool = NULL; mongoc_client_t *client = NULL; char *hello = NULL; char *hello_not_ok = NULL; future_t *future = NULL; request_t *request = NULL; bson_error_t error; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500); if (pooled) { pool = test_framework_client_pool_new_from_uri(uri, NULL); client = mongoc_client_pool_pop(pool); } else { client = test_framework_client_new_from_uri(uri, NULL); } hello = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'helloOk': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); hello_not_ok = bson_strdup_printf("{'ok': 1," " 'isWritablePrimary': true," " 'setName': 'rs'," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'hosts': ['%s']}", WIRE_VERSION_MIN, WIRE_VERSION_MAX, mock_server_get_host_and_port(server)); /* For client pools, the first handshake happens when the client is popped. * For non-pooled clients, send a ping command to trigger a handshake. */ if (!pooled) { future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); } request = mock_server_receives_any_hello_with_match(server, NULL, "{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1, 'helloOk': true}"); BSON_ASSERT(request); reply_to_request_simple(request, hello); request_destroy(request); /* For non-pooled clients, handle the ping */ if (!pooled) { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); /* Send off another ping for non-pooled clients, making sure to wait long * enough to require another heartbeat. */ mlib_sleep_for(600, ms); future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); } /* Hang up to ensure that the next check runs legacy hello again */ request = mock_server_receives_any_hello_with_match(server, "{}", "{}"); BSON_ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); /* The previous failure will trigger another handshake using legacy hello */ request = mock_server_receives_any_hello_with_match(server, "{'" HANDSHAKE_CMD_HELLO "': 1, 'helloOk': true}", "{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1, 'helloOk': true}"); BSON_ASSERT(request); reply_to_request_simple(request, hello_not_ok); request_destroy(request); /* Once again, handle the ping */ if (!pooled) { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); /* Send off another ping for non-pooled clients, making sure to wait long * enough to require another heartbeat. */ mlib_sleep_for(600, ms); future = future_client_command_simple(client, "admin", tmp_bson("{'ping': 1}"), NULL, NULL, &error); } /* Since we never responded with helloOk: true, we're expecting another * hello. */ request = mock_server_receives_any_hello_with_match(server, "{'" HANDSHAKE_CMD_HELLO "': 1, 'helloOk': true}", "{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1, 'helloOk': true}"); BSON_ASSERT(request); reply_to_request_simple(request, hello_not_ok); request_destroy(request); /* Once again, handle the ping */ if (!pooled) { request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'admin', 'ping': 1}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); } if (pooled) { mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); } else { mongoc_client_destroy(client); } mongoc_uri_destroy(uri); mock_server_destroy(server); bson_free(hello); bson_free(hello_not_ok); } static void test_hello_ok_single(void) { _test_hello_ok(false); } static void test_hello_ok_pooled(void) { _test_hello_ok(true); } // initiator_fail is a stream initiator that always fails. static mongoc_stream_t * initiator_fail(const mongoc_uri_t *uri, const mongoc_host_list_t *host, void *user_data, bson_error_t *error) { BSON_UNUSED(uri); BSON_UNUSED(host); BSON_UNUSED(user_data); bson_set_error(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_CONNECT, "failing in initiator"); printf("failing in initiator\n"); return NULL; } // Test failure in `mongoc_topology_scanner_node_setup` during retry of scanning // a known server. This is a regression test of CDRIVER-4666. static void test_failure_to_setup_after_retry(void) { mock_server_t *server; mongoc_uri_t *uri; mongoc_client_t *client; future_t *future; bson_error_t error; server = mock_server_new(); mock_server_run(server); uri = mongoc_uri_copy(mock_server_get_uri(server)); client = mongoc_client_new_from_uri_with_error(uri, &error); ASSERT_OR_PRINT(client, error); // Override the heartbeatFrequencyMS (default 60 seconds) and // minHeartbeatFrequencyMS (default 500ms) to speed up the test. const int64_t overridden_heartbeat_ms = 1; { mc_tpld_modification tdmod = mc_tpld_modify_begin(client->topology); tdmod.new_td->heartbeat_msec = overridden_heartbeat_ms; mc_tpld_modify_commit(tdmod); client->topology->min_heartbeat_frequency_msec = overridden_heartbeat_ms; } future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &error); // The first command starts the first topology scan. // Expect legacy hello with handshake. { request_t *request = mock_server_receives_legacy_hello(server, "{}"); char *reply = bson_strdup_printf("{'ok': 1," " 'minWireVersion': %d," " 'maxWireVersion': %d }", WIRE_VERSION_MIN, WIRE_VERSION_MAX); reply_to_request_simple(request, reply); bson_free(reply); request_destroy(request); } // Expect "ping" command. { request_t *request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'ping': 1}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); } // Wait until ready for next topology scan. mlib_sleep_for(overridden_heartbeat_ms, ms); // Send another command. future = future_client_command_simple(client, "test", tmp_bson("{'ping': 1}"), NULL, NULL, &error); // Expect legacy hello with handshake. { request_t *request = mock_server_receives_legacy_hello(server, "{}"); // Set the initiator to fail. mongoc_client_set_stream_initiator(client, initiator_fail, NULL); // A network error on a previously known server triggers the retry. reply_to_request_with_hang_up(request); request_destroy(request); } // The initiator fails in `mongoc_topology_scanner_node_setup`. Causes a // deadlock similar to that observed in CDRIVER-4666. // Test fails on macOS due to deadlock with "future_get_bool timed out". ASSERT(!future_get_bool(future)); future_destroy(future); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "No suitable servers found"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_detect_nongenuine_hosts(void) { const char *cosmos_uris[] = { "mongodb://a.mongo.cosmos.azure.com:19555/", /* Test case-insensitive matching */ "mongodb://a.MONGO.COSMOS.AZURE.COM:19555/", /* Mixing genuine and nongenuine hosts (unlikely in practice) */ "mongodb://a.example.com:27017,b.mongo.cosmos.azure.com:19555/", /* Test SRV matching */ "mongodb+srv://a.mongo.cosmos.azure.com/", /* Test SRV case-insensitive matching */ "mongodb+srv://A.MONGO.COSMOS.AZURE.COM/", }; const char *docdb_uris[] = { "mongodb://a.docdb.amazonaws.com:27017/", "mongodb://a.docdb-elastic.amazonaws.com:27017/", "mongodb://a.DOCDB.AMAZONAWS.COM:27017/", "mongodb://a.DOCDB-ELASTIC.AMAZONAWS.COM:27017/", "mongodb://a.example.com:27017,b.docdb.amazonaws.com:27017/", "mongodb://a.example.com:27017,b.docdb-elastic.amazonaws.com:27017/", "mongodb+srv://a.DOCDB.AMAZONAWS.COM/", "mongodb+srv://a.DOCDB-ELASTIC.AMAZONAWS.COM/", }; const char *genuine_uris[] = { "mongodb://a.example.com:27017,b.example.com:27017/", "mongodb://a.mongodb.net:27017", /* Host names do not end with expected suffix */ "mongodb://a.mongo.cosmos.azure.com.tld:19555/", "mongodb://a.docdb.amazonaws.com.tld:27017/", "mongodb://a.docdb-elastic.amazonaws.com.tld:27017/", /* Test genuine SRV URIs */ "mongodb+srv://a.example.com/", "mongodb+srv://a.mongodb.net/", /* SRV host names do not end with expected suffix */ "mongodb+srv://a.mongo.cosmos.azure.com.tld/", "mongodb+srv://a.docdb.amazonaws.com.tld/", "mongodb+srv://a.docdb-elastic.amazonaws.com.tld/", }; for (size_t i = 0u; i < sizeof(cosmos_uris) / sizeof(*cosmos_uris); ++i) { capture_logs(true); mongoc_uri_t *const uri = mongoc_uri_new(cosmos_uris[i]); ASSERT(uri); mongoc_topology_t *const topology = mongoc_topology_new(uri, true); ASSERT(topology); ASSERT_CAPTURED_LOG(cosmos_uris[i], MONGOC_LOG_LEVEL_INFO, "You appear to be connected to a CosmosDB cluster. For more " "information regarding feature compatibility and support please visit " "https://www.mongodb.com/supportability/cosmosdb"); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); } for (size_t i = 0u; i < sizeof(docdb_uris) / sizeof(*docdb_uris); ++i) { capture_logs(true); mongoc_uri_t *const uri = mongoc_uri_new(docdb_uris[i]); ASSERT(uri); mongoc_topology_t *const topology = mongoc_topology_new(uri, true); ASSERT(topology); ASSERT_CAPTURED_LOG(docdb_uris[i], MONGOC_LOG_LEVEL_INFO, "You appear to be connected to a DocumentDB cluster. For more " "information regarding feature compatibility and support please visit " "https://www.mongodb.com/supportability/documentdb"); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); } for (size_t i = 0u; i < sizeof(genuine_uris) / sizeof(*genuine_uris); ++i) { capture_logs(true); mongoc_uri_t *const uri = mongoc_uri_new(genuine_uris[i]); ASSERT(uri); mongoc_topology_t *const topology = mongoc_topology_new(uri, true); ASSERT(topology); ASSERT_NO_CAPTURED_LOGS(genuine_uris[i]); mongoc_topology_destroy(topology); mongoc_uri_destroy(uri); } } void test_topology_install(TestSuite *suite) { TestSuite_AddLive(suite, "/Topology/client_creation", test_topology_client_creation); TestSuite_AddLive(suite, "/Topology/client_pool_creation", test_topology_client_pool_creation); TestSuite_AddLive(suite, "/Topology/start_stop", test_topology_thread_start_stop); TestSuite_AddFull(suite, "/Topology/server_selection_try_once_option [lock:live-server][timeout:30]", test_server_selection_try_once_option, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Topology/server_selection_try_once [lock:live-server][timeout:30]", test_server_selection_try_once, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Topology/server_selection_try_once_false [lock:live-server][timeout:30]", test_server_selection_try_once_false, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/Topology/invalidate_server/single [lock:live-server][timeout:30]", test_topology_invalidate_server_single, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/Topology/invalidate_server/pooled [lock:live-server][timeout:30]", test_topology_invalidate_server_pooled, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/Topology/invalid_cluster_node [lock:live-server][timeout:30]", test_invalid_cluster_node, NULL, NULL, test_framework_skip_if_slow_or_live); TestSuite_AddFull(suite, "/Topology/max_wire_version_race_condition [lock:live-server]", test_max_wire_version_race_condition, NULL, NULL, test_framework_skip_if_no_auth); TestSuite_AddMockServerTest(suite, "/Topology/cooldown/standalone [timeout:30]", test_cooldown_standalone, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddMockServerTest( suite, "/Topology/cooldown/rs [timeout:30]", test_cooldown_rs, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddMockServerTest( suite, "/Topology/cooldown/retry [timeout:30]", test_cooldown_retry, NULL, NULL, test_framework_skip_if_slow); TestSuite_Add(suite, "/Topology/multiple_selection_errors", test_multiple_selection_errors); TestSuite_AddMockServerTest(suite, "/Topology/connect_timeout/succeed", test_select_after_timeout); TestSuite_AddMockServerTest(suite, "/Topology/try_once/succeed", test_select_after_try_once); TestSuite_AddLive(suite, "/Topology/invalid_server_id", test_invalid_server_id); TestSuite_AddMockServerTest(suite, "/Topology/server_removed/single", test_server_removed_during_handshake_single); TestSuite_AddMockServerTest(suite, "/Topology/server_removed/pooled", test_server_removed_during_handshake_pooled); TestSuite_AddFull( suite, "/Topology/rtt [lock:live-server][timeout:30]", test_rtt, NULL, NULL, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/add_and_scan_failure", test_add_and_scan_failure); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/single/hangup [timeout:30]", test_hello_retry_single_hangup, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/single/timeout [timeout:30]", test_hello_retry_single_timeout, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/single/hangup/fail [timeout:30]", test_hello_retry_single_hangup_fail, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/single/timeout/fail [timeout:30]", test_hello_retry_single_timeout_fail, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/pooled/hangup [timeout:30]", test_hello_retry_pooled_hangup, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/pooled/timeout [timeout:30]", test_hello_retry_pooled_timeout, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/pooled/hangup/fail [timeout:30]", test_hello_retry_pooled_hangup_fail, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/hello_retry/pooled/timeout/fail [timeout:30]", test_hello_retry_pooled_timeout_fail, test_framework_skip_if_slow); TestSuite_AddMockServerTest( suite, "/Topology/incompatible_error [timeout:30]", test_incompatible_error, test_framework_skip_if_slow); TestSuite_AddMockServerTest(suite, "/Topology/compatible_null_error_pointer [timeout:30]", test_compatible_null_error_pointer, test_framework_skip_if_slow); TestSuite_AddMockServerTest( suite, "/Topology/handshake/updates_clustertime", test_cluster_time_updated_during_handshake); TestSuite_AddMockServerTest(suite, "/Topology/request_scan_on_error", test_request_scan_on_error); TestSuite_AddMockServerTest(suite, "/Topology/last_server_removed_warning", test_last_server_removed_warning); TestSuite_AddMockServerTest(suite, "/Topology/slow_server/pooled", test_slow_server_pooled); TestSuite_AddMockServerTest(suite, "/Topology/hello/versioned_api/single", test_hello_versioned_api_single); TestSuite_AddMockServerTest(suite, "/Topology/hello/versioned_api/pooled", test_hello_versioned_api_pooled); TestSuite_AddMockServerTest(suite, "/Topology/hello_ok/single", test_hello_ok_single); TestSuite_AddMockServerTest(suite, "/Topology/hello_ok/pooled", test_hello_ok_pooled); TestSuite_AddMockServerTest(suite, "/Topology/failure_to_setup_after_retry", test_failure_to_setup_after_retry); TestSuite_Add(suite, "/Topology/detect_nongenuine_hosts [lock:live-server]", test_detect_nongenuine_hosts); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-transactions.c000066400000000000000000001214271511661753600254010ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include #include #include #include /* Reset server state by disabling failpoints, killing sessions, and... running * a distinct command. */ static void _reset_server(json_test_ctx_t *ctx, const char *host_str) { mongoc_client_t *client; bson_error_t error; bool res; mongoc_uri_t *uri = _mongoc_uri_copy_and_replace_host_list(ctx->test_framework_uri, host_str); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); /* From Transactions tests runner: "Create a MongoClient and call * client.admin.runCommand({killAllSessions: []}) to clean up any open * transactions from previous test failures. Ignore a command failure with * error code 11601 ("Interrupted") to work around SERVER-38335." */ res = mongoc_client_command_simple(client, "admin", tmp_bson("{'killAllSessions': []}"), NULL, NULL, &error); if (!res && error.code != 11601) { test_error("Unexpected error: %s from killAllSessions\n", error.message); } /* From Transactions spec test runner: "When testing against a sharded * cluster run a distinct command on the newly * created collection on all mongoses. For an explanation see, Why do tests * that run distinct sometimes fail with StaleDbVersion?" */ ASSERT_OR_PRINT(mongoc_client_command_simple(client, mongoc_database_get_name(ctx->db), tmp_bson("{'distinct': '%s', 'key': 'test', 'query': {}}", mongoc_collection_get_name(ctx->collection)), NULL /* read prefs */, NULL /* reply */, &error), error); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void _disable_failpoints(json_test_ctx_t *ctx, const char *host_str) { mongoc_client_t *client; bson_error_t error; int i; mongoc_uri_t *uri = _mongoc_uri_copy_and_replace_host_list(ctx->test_framework_uri, host_str); /* Some transactions tests have a failCommand for "hello" repeat seven * times. Repeat this seven times. And set a reduced server selection timeout * so we don't hang on failed hello commands. */ mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 500); for (i = 0; i < 7; i++) { bool ret; client = test_framework_client_new_from_uri(uri, NULL); ret = mongoc_client_command_simple( client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': 'off'}"), NULL, NULL, &error); if (!ret) { /* Tests that fail with hello also fail to disable the failpoint * (since we run hello when opening the connection). Ignore those * errors. */ BSON_ASSERT(NULL != strstr(error.message, "No suitable servers found")); } mongoc_client_destroy(client); } mongoc_uri_destroy(uri); } static void transactions_test_before_test(json_test_ctx_t *ctx, const bson_t *test) { bson_iter_t test_iter; bool is_multi_mongos; _reset_server(ctx, "localhost:27017"); is_multi_mongos = bson_iter_init_find(&test_iter, test, "useMultipleMongoses") && bson_iter_as_bool(&test_iter); if (is_multi_mongos) { _reset_server(ctx, "localhost:27018"); } } static void transactions_test_after_test(json_test_ctx_t *ctx, const bson_t *test) { bson_iter_t test_iter; bool is_multi_mongos; _disable_failpoints(ctx, "localhost:27017"); is_multi_mongos = bson_iter_init_find(&test_iter, test, "useMultipleMongoses") && bson_iter_as_bool(&test_iter); if (is_multi_mongos) { _disable_failpoints(ctx, "localhost:27018"); } } typedef struct _cb_ctx_t { bson_t callback; json_test_ctx_t *ctx; } cb_ctx_t; static bool with_transaction_callback_runner(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { cb_ctx_t *cb_ctx = (cb_ctx_t *)ctx; bson_t operation; bson_t operations; bson_t *test; bson_iter_t iter; bool res = false; bson_t local_reply; BSON_UNUSED(error); test = &(cb_ctx->callback); if (bson_has_field(test, "operation")) { bson_lookup_doc(test, "operation", &operation); res = json_test_operation(cb_ctx->ctx, test, &operation, cb_ctx->ctx->collection, session, &local_reply); } else { ASSERT(bson_has_field(test, "operations")); bson_lookup_doc(test, "operations", &operations); BSON_ASSERT(bson_iter_init(&iter, &operations)); bson_init(&local_reply); while (bson_iter_next(&iter)) { bson_destroy(&local_reply); bson_iter_bson(&iter, &operation); res = json_test_operation(cb_ctx->ctx, test, &operation, cb_ctx->ctx->collection, session, &local_reply); if (!res) { break; } } } *reply = bson_copy(&local_reply); bson_destroy(&local_reply); return res; } static bool transactions_test_run_operation(json_test_ctx_t *ctx, const bson_t *test, const bson_t *operation) { mongoc_transaction_opt_t *opts = NULL; mongoc_client_session_t *session = NULL; bson_error_t error; bson_value_t value; bson_t reply; bool res; cb_ctx_t cb_ctx; /* If there is a 'callback' field, run the nested operations through mongoc_client_session_with_transaction(). */ if (bson_has_field(operation, "arguments.callback")) { ASSERT(bson_has_field(operation, "object")); session = session_from_name(ctx, bson_lookup_utf8(operation, "object")); ASSERT(session); bson_lookup_doc(operation, "arguments.callback", &cb_ctx.callback); cb_ctx.ctx = ctx; if (bson_has_field(operation, "arguments.options")) { opts = bson_lookup_txn_opts(operation, "arguments.options"); } res = mongoc_client_session_with_transaction( session, with_transaction_callback_runner, opts, &cb_ctx, &reply, &error); value_init_from_doc(&value, &reply); check_result(test, operation, res, &value, &error); bson_value_destroy(&value); } else { /* If there is no 'callback' field, then run simply. */ if (bson_has_field(operation, "arguments.session")) { session = session_from_name(ctx, bson_lookup_utf8(operation, "arguments.session")); } /* expect some warnings from abortTransaction, but don't suppress others: * we want to know if any other tests log warnings */ capture_logs(true); res = json_test_operation(ctx, test, operation, ctx->collection, session, &reply); assert_all_captured_logs_have_prefix("Error in abortTransaction:"); capture_logs(false); } bson_destroy(&reply); mongoc_transaction_opts_destroy(opts); return res; } static test_skip_t skips[] = {{.description = "callback is not retried after non-transient error (DuplicateKeyError)", .reason = "Waiting on CDRIVER-4811"}, {0}}; static void test_transactions_cb(void *scenario) { json_test_config_t config = JSON_TEST_CONFIG_INIT; config.skips = skips; config.before_test_cb = transactions_test_before_test; config.run_operation_cb = transactions_test_run_operation; config.after_test_cb = transactions_test_after_test; config.scenario = scenario; config.command_started_events_only = true; run_json_general_test(&config); } static void test_transactions_supported(void *ctx) { mongoc_client_t *client; mongoc_client_session_t *session; mongoc_database_t *db; mongoc_collection_t *collection; bson_t *majority = tmp_bson("{'writeConcern': {'w': 'majority'}}"); bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; BSON_UNUSED(ctx); if (test_framework_is_mongos()) { bson_destroy(&opts); return; } client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); db = mongoc_client_get_database(client, "transaction-tests"); /* drop and create collection outside of transaction */ mongoc_database_write_command_with_opts(db, tmp_bson("{'drop': 'test'}"), majority, NULL, NULL); collection = mongoc_database_create_collection(db, "test", majority, &error); ASSERT_OR_PRINT(collection, error); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); if ((r = mongoc_client_session_start_transaction(session, NULL, &error))) { r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); /* insert should fail if replset has no members */ BSON_ASSERT(r == test_framework_is_replset()); } else { ASSERT_CMPINT32(error.domain, ==, MONGOC_ERROR_TRANSACTION); ASSERT_CONTAINS(error.message, "transaction"); } bson_destroy(&opts); mongoc_collection_destroy(collection); if (!r) { /* suppress "error in abortTransaction" warning from session_destroy */ capture_logs(true); } mongoc_client_session_destroy(session); mongoc_database_destroy(db); mongoc_client_destroy(client); } static void test_in_transaction(void *ctx) { mongoc_client_t *client; mongoc_client_session_t *session; mongoc_database_t *db; mongoc_collection_t *collection; bson_t *majority = tmp_bson("{'writeConcern': {'w': 'majority'}}"); bson_t opts = BSON_INITIALIZER; bson_error_t error; bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); mongoc_client_set_error_api(client, 2); db = mongoc_client_get_database(client, "transaction-tests"); /* drop and create collection outside of transaction */ mongoc_database_write_command_with_opts(db, tmp_bson("{'drop': 'test'}"), majority, NULL, NULL); collection = mongoc_database_create_collection(db, "test", majority, &error); ASSERT_OR_PRINT(collection, error); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_NONE); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_NONE); /* commit an empty transaction */ r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_STARTING); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_STARTING); r = mongoc_client_session_commit_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_COMMITTED); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_COMMITTED_EMPTY); /* commit a transaction with an insert */ r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_STARTING); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_STARTING); r = mongoc_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_IN_PROGRESS); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_IN_PROGRESS); ASSERT_OR_PRINT(r, error); r = mongoc_client_session_commit_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_COMMITTED); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_COMMITTED); /* abort a transaction */ r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_STARTING); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_STARTING); ASSERT_OR_PRINT(r, error); r = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!mongoc_client_session_in_transaction(session)); ASSERT_CMPINT(mongoc_client_session_get_transaction_state(session), ==, MONGOC_TRANSACTION_ABORTED); ASSERT_CMPINT(session->txn.state, ==, MONGOC_INTERNAL_TRANSACTION_ABORTED); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_database_destroy(db); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } static bool hangup_except_hello(request_t *request, void *data) { BSON_UNUSED(data); if (!bson_strcasecmp(request->command_name, HANDSHAKE_CMD_LEGACY_HELLO) || !bson_strcasecmp(request->command_name, "hello")) { /* allow default response */ return false; } reply_to_request_with_hang_up(request); request_destroy(request); return true; } static void _test_transient_txn_err(bool hangup) { mock_server_t *server; mongoc_client_t *client; mongoc_client_session_t *session; mongoc_collection_t *collection; mongoc_cursor_t *cursor; mongoc_bulk_operation_t *bulk; mongoc_find_and_modify_opts_t *fam; bson_t opts = BSON_INITIALIZER; bson_error_t error; bson_t *b; bson_t *u; const bson_t *doc_out; const bson_t *error_doc; bson_t reply; bool r; server = mock_server_new(); mock_server_run(server); rs_response_to_hello(server, WIRE_VERSION_MIN, true /* primary */, false /* tags */, server, NULL); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* allow fast reconnect */ client->topology->min_heartbeat_frequency_msec = 0; session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); collection = mongoc_client_get_collection(client, "db", "collection"); if (hangup) { /* test that network errors have TransientTransactionError */ mock_server_autoresponds(server, hangup_except_hello, NULL, NULL); } else { /* test server selection errors have TransientTransactionError */ mock_server_destroy(server); server = NULL; } /* warnings when trying to abort the transaction and later, end sessions */ capture_logs(true); #define ASSERT_TRANSIENT_LABEL(_b, _expr) \ do { \ if (!mongoc_error_has_label((_b), "TransientTransactionError")) { \ test_error("Reply lacks TransientTransactionError label: %s\n" \ "Running %s", \ bson_as_relaxed_extended_json((_b), NULL), \ #_expr); \ } \ } while (0) #define TEST_CMD_ERR(_expr) \ do { \ r = (_expr); \ BSON_ASSERT(!r); \ ASSERT_TRANSIENT_LABEL(&reply, _expr); \ bson_destroy(&reply); \ /* clean slate for next test */ \ memset(&reply, 0, sizeof(reply)); \ } while (0) #define TEST_WRITE_ERR(_expr) \ do { \ r = (_expr); \ ASSERT_TRANSIENT_LABEL(&reply, _expr); \ bson_destroy(&reply); \ /* clean slate for next test */ \ memset(&reply, 0, sizeof(reply)); \ } while (0) #define TEST_CURSOR_ERR(_cursor_expr) \ do { \ cursor = (_cursor_expr); \ r = mongoc_cursor_next(cursor, &doc_out); \ BSON_ASSERT(!r); \ r = !mongoc_cursor_error_document(cursor, &error, &error_doc); \ BSON_ASSERT(!r); \ BSON_ASSERT(error_doc); \ ASSERT_TRANSIENT_LABEL(error_doc, _cursor_expr); \ mongoc_cursor_destroy(cursor); \ } while (0) b = tmp_bson("{'x': 1}"); u = tmp_bson("{'$inc': {'x': 1}}"); TEST_CMD_ERR(mongoc_client_command_with_opts(client, "db", b, NULL, &opts, &reply, NULL)); TEST_CMD_ERR(mongoc_client_read_command_with_opts(client, "db", b, NULL, &opts, &reply, NULL)); TEST_CMD_ERR(mongoc_client_write_command_with_opts(client, "db", b, &opts, &reply, NULL)); TEST_CMD_ERR(mongoc_client_read_write_command_with_opts(client, "db", b, NULL, &opts, &reply, NULL)); TEST_CMD_ERR(0 < mongoc_collection_count_documents(collection, b, &opts, NULL, &reply, NULL)); mongoc_index_model_t *im = mongoc_index_model_new(b, NULL); TEST_CMD_ERR(mongoc_collection_create_indexes_with_opts(collection, &im, 1, &opts, &reply, NULL)); mongoc_index_model_destroy(im); fam = mongoc_find_and_modify_opts_new(); mongoc_find_and_modify_opts_append(fam, &opts); TEST_CMD_ERR(mongoc_collection_find_and_modify_with_opts(collection, b, fam, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_insert_one(collection, b, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_insert_many(collection, (const bson_t **)&b, 1, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_update_one(collection, b, u, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_update_many(collection, b, u, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_replace_one(collection, b, b, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_delete_one(collection, b, &opts, &reply, NULL)); TEST_WRITE_ERR(mongoc_collection_delete_many(collection, b, &opts, &reply, NULL)); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, &opts); mongoc_bulk_operation_insert(bulk, b); TEST_WRITE_ERR(mongoc_bulk_operation_execute(bulk, &reply, NULL)); TEST_CURSOR_ERR(mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[{}]"), &opts, NULL)); TEST_CURSOR_ERR(mongoc_collection_find_with_opts(collection, b, &opts, NULL)); mongoc_find_and_modify_opts_destroy(fam); mongoc_bulk_operation_destroy(bulk); bson_destroy(&opts); mongoc_collection_destroy(collection); mongoc_client_session_destroy(session); mongoc_client_destroy(client); if (server) { mock_server_destroy(server); } } static void test_server_selection_error(void) { _test_transient_txn_err(false /* hangup */); } static void test_network_error(void) { _test_transient_txn_err(true /* hangup */); } /* Transactions Spec: Drivers add the "UnknownTransactionCommitResult" to a * server selection error from commitTransaction, even if this is the first * attempt to send commitTransaction. It is true in this case that the driver * knows the result: the transaction is definitely not committed. However, the * "UnknownTransactionCommitResult" label properly communicates to the * application that calling commitTransaction again may succeed. */ static void test_unknown_commit_result(void) { mock_server_t *server; mongoc_client_t *client; mongoc_client_session_t *session; mongoc_collection_t *collection; future_t *future; request_t *request; bson_t opts = BSON_INITIALIZER; bson_error_t error; bson_t reply; bool r; server = mock_server_new(); mock_server_run(server); rs_response_to_hello(server, WIRE_VERSION_MIN, true /* primary */, false /* tags */, server, NULL); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); /* allow fast reconnect */ client->topology->min_heartbeat_frequency_msec = 0; session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); collection = mongoc_client_get_collection(client, "db", "collection"); future = future_collection_insert_one(collection, tmp_bson("{}"), &opts, NULL, &error); request = mock_server_receives_msg(server, 0, tmp_bson("{'insert': 'collection'}"), tmp_bson("{}")); reply_to_request_with_ok_and_destroy(request); ASSERT_OR_PRINT(future_get_bool(future), error); future_destroy(future); /* test server selection errors have UnknownTransactionCommitResult */ mock_server_destroy(server); r = mongoc_client_session_commit_transaction(session, &reply, &error); BSON_ASSERT(!r); if (!mongoc_error_has_label(&reply, "UnknownTransactionCommitResult")) { test_error("Reply lacks UnknownTransactionCommitResult label: %s", bson_as_relaxed_extended_json(&reply, NULL)); } if (mongoc_error_has_label(&reply, "TransientTransactionError")) { test_error("Reply shouldn't have TransientTransactionError label: %s", bson_as_relaxed_extended_json(&reply, NULL)); } bson_destroy(&reply); bson_destroy(&opts); mongoc_collection_destroy(collection); /* warning when trying to end the session */ capture_logs(true); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } static void test_cursor_primary_read_pref(void *ctx) { mongoc_client_t *client; mongoc_client_session_t *session; mongoc_collection_t *collection; mongoc_cursor_t *cursor; bson_t opts = BSON_INITIALIZER; mongoc_read_prefs_t *read_prefs; const bson_t *doc; bson_error_t error; bool r; BSON_UNUSED(ctx); client = test_framework_new_default_client(); collection = get_test_collection(client, "test_cursor_primary_read_pref"); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); r = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(r, error); r = mongoc_client_session_append(session, &opts, &error); ASSERT_OR_PRINT(r, error); read_prefs = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); cursor = mongoc_collection_find_with_opts(collection, tmp_bson("{}"), &opts, read_prefs); bson_destroy(&opts); mongoc_read_prefs_destroy(read_prefs); mongoc_collection_destroy(collection); ASSERT(!mongoc_cursor_next(cursor, &doc)); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); mongoc_cursor_destroy(cursor); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } /* test the fix to CDRIVER-2815. */ void test_inherit_from_client(void *ctx) { mongoc_client_t *client; mongoc_client_session_t *session; bson_error_t error; mongoc_uri_t *uri; mongoc_read_concern_t *rc; const mongoc_read_concern_t *returned_rc; mongoc_read_prefs_t *rp; const mongoc_read_prefs_t *returned_rp; mongoc_write_concern_t *wc; const mongoc_write_concern_t *returned_wc; mongoc_session_opt_t *sopt; const mongoc_session_opt_t *returned_sopt; mongoc_transaction_opt_t *topt; const mongoc_transaction_opt_t *returned_topt; BSON_UNUSED(ctx); uri = test_framework_get_uri(); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_MAJORITY); mongoc_uri_set_read_concern(uri, rc); rp = mongoc_read_prefs_new(MONGOC_READ_NEAREST); mongoc_uri_set_read_prefs_t(uri, rp); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 0); mongoc_uri_set_write_concern(uri, wc); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); sopt = mongoc_session_opts_new(); topt = mongoc_transaction_opts_new(); mongoc_transaction_opts_set_read_concern(topt, rc); mongoc_transaction_opts_set_read_prefs(topt, rp); mongoc_transaction_opts_set_write_concern(topt, wc); mongoc_session_opts_set_default_transaction_opts(sopt, topt); session = mongoc_client_start_session(client, sopt, &error); ASSERT_OR_PRINT(session, error); /* test that unacknowledged write concern is actually used, since it should * result in an error. */ ASSERT(!mongoc_client_session_start_transaction(session, NULL, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_TRANSACTION, MONGOC_ERROR_TRANSACTION_INVALID_STATE, "Transactions do not support unacknowledged write concern"); returned_sopt = mongoc_client_session_get_opts(session); returned_topt = mongoc_session_opts_get_default_transaction_opts(returned_sopt); returned_rc = mongoc_transaction_opts_get_read_concern(returned_topt); returned_rp = mongoc_transaction_opts_get_read_prefs(returned_topt); returned_wc = mongoc_transaction_opts_get_write_concern(returned_topt); BSON_ASSERT(strcmp(mongoc_read_concern_get_level(returned_rc), mongoc_read_concern_get_level(rc)) == 0); BSON_ASSERT(mongoc_write_concern_get_w(returned_wc) == mongoc_write_concern_get_w(wc)); BSON_ASSERT(mongoc_read_prefs_get_mode(returned_rp) == mongoc_read_prefs_get_mode(rp)); mongoc_read_concern_destroy(rc); mongoc_read_prefs_destroy(rp); mongoc_write_concern_destroy(wc); mongoc_transaction_opts_destroy(topt); mongoc_session_opts_destroy(sopt); mongoc_client_session_destroy(session); mongoc_uri_destroy(uri); mongoc_client_destroy(client); } static void test_transaction_recovery_token_cleared(void *ctx) { bson_error_t error; mongoc_client_session_t *session; mongoc_client_t *client; mongoc_collection_t *coll; mongoc_uri_t *uri; bson_t txn_opts; BSON_UNUSED(ctx); uri = test_framework_get_uri(); ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27018", &error), error); client = test_framework_client_new_from_uri(uri, NULL); test_framework_set_ssl_opts(client); mongoc_uri_destroy(uri); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); coll = get_test_collection(client, "transaction_test"); mongoc_client_command_with_opts(client, "admin", tmp_bson("{'killAllSessions': []}"), NULL, NULL, NULL, &error); /* Create the collection by inserting a canary document. You cannot create * inside a transaction */ ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, &error), error); bson_init(&txn_opts); ASSERT_OR_PRINT(mongoc_client_session_append(session, &txn_opts, &error), error); ASSERT_OR_PRINT(mongoc_client_session_start_transaction(session, NULL, &error), error); /* Initially no recovery token. */ BSON_ASSERT(!session->recovery_token); mongoc_collection_insert_one(coll, tmp_bson("{}"), &txn_opts, NULL, &error); BSON_ASSERT(session->recovery_token); ASSERT_OR_PRINT(mongoc_client_session_commit_transaction(session, NULL, &error), error); BSON_ASSERT(session->recovery_token); /* Starting a new transaction clears the recovery token. */ ASSERT_OR_PRINT(mongoc_client_session_start_transaction(session, NULL, &error), error); BSON_ASSERT(!session->recovery_token); ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), &txn_opts, NULL, &error), error); BSON_ASSERT(session->recovery_token); ASSERT_OR_PRINT(mongoc_client_session_commit_transaction(session, NULL, &error), error); BSON_ASSERT(session->recovery_token); /* Transitioning to the "none" state (i.e. a new operation outside of a * transaction), clears the recovery token */ ASSERT_OR_PRINT(mongoc_collection_insert_one(coll, tmp_bson("{}"), &txn_opts, NULL, &error), error); BSON_ASSERT(!session->recovery_token); bson_destroy(&txn_opts); mongoc_collection_destroy(coll); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } static void test_selected_server_is_pinned_to_mongos(void *ctx) { mongoc_uri_t *uri = NULL; mongoc_client_t *client = NULL; const mongoc_set_t *servers = NULL; mongoc_transaction_opt_t *txn_opts = NULL; mongoc_session_opt_t *session_opts = NULL; mongoc_client_session_t *session = NULL; mongoc_server_stream_t *server_stream = NULL; bson_error_t error; bson_t reply; bson_t *insert_opts = NULL; mongoc_database_t *db = NULL; mongoc_collection_t *coll = NULL; bool r; uint32_t expected_id; uint32_t actual_id; const mongoc_server_description_t *sd = NULL; BSON_UNUSED(ctx); uri = test_framework_get_uri(); ASSERT_OR_PRINT(mongoc_uri_upsert_host_and_port(uri, "localhost:27018", &error), error); client = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client); test_framework_set_ssl_opts(client); txn_opts = mongoc_transaction_opts_new(); session_opts = mongoc_session_opts_new(); session = mongoc_client_start_session(client, session_opts, &error); ASSERT_OR_PRINT(session, error); /* set the server id to an arbitrary value */ _mongoc_client_session_pin(session, 42); BSON_ASSERT(42 == mongoc_client_session_get_server_id(session)); /* starting a transaction should clear the server id */ r = mongoc_client_session_start_transaction(session, txn_opts, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(0 == mongoc_client_session_get_server_id(session)); expected_id = mongoc_topology_select_server_id( client->topology, MONGOC_SS_WRITE, TEST_SS_LOG_CONTEXT, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(expected_id, error); /* session should still be unpinned */ BSON_ASSERT(0 == mongoc_client_session_get_server_id(session)); /* should pin to the expected server id */ server_stream = mongoc_cluster_stream_for_server(&client->cluster, expected_id, true, session, NULL, &error); ASSERT_OR_PRINT(server_stream, error); ASSERT_CMPINT32(expected_id, ==, mongoc_client_session_get_server_id(session)); db = mongoc_client_get_database(client, "db"); coll = mongoc_database_create_collection(db, "coll", NULL, &error); insert_opts = bson_new(); r = mongoc_client_session_append(session, insert_opts, &error); ASSERT_OR_PRINT(r, error); /* this should not override the expected server id */ r = mongoc_collection_insert_one(coll, tmp_bson("{}"), insert_opts, NULL, &error); ASSERT_OR_PRINT(r, error); actual_id = mongoc_client_session_get_server_id(session); ASSERT_CMPINT32(actual_id, ==, expected_id); /* get a valid server id that's different from the pinned server id */ servers = mc_tpld_servers_const(mc_tpld_unsafe_get_const(client->topology)); for (size_t i = 0; i < servers->items_len; i++) { sd = mongoc_set_get_item_const(servers, i); if (sd && sd->id != actual_id) { break; } } /* attempting to pin to a different but valid server id should fail */ BSON_ASSERT(sd); r = mongoc_client_command_with_opts( client, "db", tmp_bson("{'ping': 1}"), NULL, tmp_bson("{'serverId': %d, 'sessionId': {'$numberLong': '%ld'}}", sd->id, session->client_session_id), &reply, &error); BSON_ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_SERVER_SELECTION_INVALID_ID, "Requested server id does not matched pinned server id"); r = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(r, error); bson_destroy(insert_opts); bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_database_destroy(db); mongoc_session_opts_destroy(session_opts); mongoc_transaction_opts_destroy(txn_opts); mongoc_server_stream_cleanup(server_stream); mongoc_client_session_destroy(session); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } static void test_get_transaction_opts(void) { mongoc_uri_t *uri = NULL; mongoc_client_t *client = NULL; mongoc_client_session_t *session = NULL; mongoc_transaction_opt_t *expected_txn_opts = NULL; mongoc_transaction_opt_t *actual_txn_opts = NULL; mongoc_session_opt_t *session_opts = NULL; mongoc_read_concern_t *read_concern = NULL; mongoc_write_concern_t *write_concern = NULL; mongoc_read_prefs_t *read_prefs = NULL; mock_server_t *server = NULL; int64_t max_commit_time_ms = 123; /* arbitrary */ bson_error_t error; bool r; server = mock_server_new(); mock_server_run(server); rs_response_to_hello(server, WIRE_VERSION_MIN, true /* primary */, false /* tags */, server, NULL); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); BSON_ASSERT(client); read_concern = mongoc_read_concern_new(); mongoc_read_concern_set_level(read_concern, "snapshot"); write_concern = mongoc_write_concern_new(); mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_MAJORITY); read_prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); expected_txn_opts = mongoc_transaction_opts_new(); mongoc_transaction_opts_set_read_concern(expected_txn_opts, read_concern); mongoc_transaction_opts_set_write_concern(expected_txn_opts, write_concern); mongoc_transaction_opts_set_read_prefs(expected_txn_opts, read_prefs); mongoc_transaction_opts_set_max_commit_time_ms(expected_txn_opts, max_commit_time_ms); session_opts = mongoc_session_opts_new(); session = mongoc_client_start_session(client, session_opts, &error); ASSERT_OR_PRINT(session, error); /* outside of a txn this function should return NULL */ BSON_ASSERT(!mongoc_session_opts_get_transaction_opts(session)); r = mongoc_client_session_start_transaction(session, expected_txn_opts, &error); ASSERT_OR_PRINT(r, error); actual_txn_opts = mongoc_session_opts_get_transaction_opts(session); BSON_ASSERT(actual_txn_opts); BSON_ASSERT(0 == bson_compare(_mongoc_read_concern_get_bson(actual_txn_opts->read_concern), _mongoc_read_concern_get_bson(expected_txn_opts->read_concern))); BSON_ASSERT(0 == bson_compare(_mongoc_write_concern_get_bson(actual_txn_opts->write_concern), _mongoc_write_concern_get_bson(expected_txn_opts->write_concern))); BSON_ASSERT(mongoc_read_prefs_get_mode(actual_txn_opts->read_prefs) == mongoc_read_prefs_get_mode(expected_txn_opts->read_prefs)); BSON_ASSERT(actual_txn_opts->max_commit_time_ms == expected_txn_opts->max_commit_time_ms); r = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(!mongoc_session_opts_get_transaction_opts(session)); mongoc_read_concern_destroy(read_concern); mongoc_write_concern_destroy(write_concern); mongoc_read_prefs_destroy(read_prefs); mongoc_transaction_opts_destroy(expected_txn_opts); mongoc_transaction_opts_destroy(actual_txn_opts); mongoc_session_opts_destroy(session_opts); mongoc_client_session_destroy(session); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } static void test_max_commit_time_ms_is_reset(void *ctx) { mock_rs_t *rs; mongoc_uri_t *uri = NULL; mongoc_client_t *client = NULL; mongoc_transaction_opt_t *txn_opts = NULL; mongoc_session_opt_t *session_opts = NULL; mongoc_client_session_t *session = NULL; bson_error_t error; bool r; BSON_UNUSED(ctx); rs = mock_rs_with_auto_hello(WIRE_VERSION_4_2, true /* has primary */, 2 /* secondaries */, 0 /* arbiters */); mock_rs_run(rs); uri = mongoc_uri_copy(mock_rs_get_uri(rs)); client = test_framework_client_new_from_uri(uri, NULL); BSON_ASSERT(client); txn_opts = mongoc_transaction_opts_new(); session_opts = mongoc_session_opts_new(); session = mongoc_client_start_session(client, session_opts, &error); ASSERT_OR_PRINT(session, error); mongoc_transaction_opts_set_max_commit_time_ms(txn_opts, 1); r = mongoc_client_session_start_transaction(session, txn_opts, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(1 == session->txn.opts.max_commit_time_ms); r = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(DEFAULT_MAX_COMMIT_TIME_MS == session->txn.opts.max_commit_time_ms); mongoc_transaction_opts_set_max_commit_time_ms(txn_opts, DEFAULT_MAX_COMMIT_TIME_MS); r = mongoc_client_session_start_transaction(session, txn_opts, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(DEFAULT_MAX_COMMIT_TIME_MS == session->txn.opts.max_commit_time_ms); r = mongoc_client_session_abort_transaction(session, &error); ASSERT_OR_PRINT(r, error); mongoc_session_opts_destroy(session_opts); mongoc_transaction_opts_destroy(txn_opts); mongoc_client_session_destroy(session); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_rs_destroy(rs); } void test_transactions_install(TestSuite *suite) { install_json_test_suite_with_check(suite, JSON_DIR, "transactions/legacy", test_transactions_cb, test_framework_skip_if_no_txns, test_framework_skip_if_slow); install_json_test_suite_with_check(suite, JSON_DIR, "with_transaction", test_transactions_cb, test_framework_skip_if_no_txns, test_framework_skip_if_slow); TestSuite_AddFull(suite, "/transactions/supported [lock:live-server]", test_transactions_supported, NULL, NULL, test_framework_skip_if_no_txns); TestSuite_AddFull(suite, "/transactions/in_transaction [lock:live-server]", test_in_transaction, NULL, NULL, test_framework_skip_if_no_txns); TestSuite_AddMockServerTest( suite, "/transactions/server_selection_err", test_server_selection_error, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/transactions/network_err", test_network_error, test_framework_skip_if_no_crypto); TestSuite_AddMockServerTest( suite, "/transactions/unknown_commit_result", test_unknown_commit_result, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/transactions/cursor_primary_read_pref [lock:live-server]", test_cursor_primary_read_pref, NULL, NULL, test_framework_skip_if_no_txns); TestSuite_AddFull(suite, "/transactions/inherit_from_client [lock:live-server]", test_inherit_from_client, NULL, NULL, test_framework_skip_if_no_txns); TestSuite_AddFull(suite, "/transactions/recovery_token_cleared [lock:live-server]", test_transaction_recovery_token_cleared, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto, test_framework_skip_if_not_mongos); TestSuite_AddFull(suite, "/transactions/selected_server_pinned_to_mongos [lock:live-server]", test_selected_server_is_pinned_to_mongos, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_not_mongos); TestSuite_AddMockServerTest( suite, "/transactions/get_transaction_opts", test_get_transaction_opts, test_framework_skip_if_no_crypto); TestSuite_AddFull(suite, "/transactions/max_commit_time_ms_is_reset", test_max_commit_time_ms_is_reset, NULL, NULL, test_framework_skip_if_no_crypto); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-ts-pool.c000066400000000000000000000046071511661753600242660ustar00rootroot00000000000000#include #include #include static void test_ts_pool_empty(void) { mongoc_ts_pool *pool = mongoc_ts_pool_new((mongoc_ts_pool_params){.element_size = sizeof(int)}); BSON_ASSERT(mongoc_ts_pool_is_empty(pool)); mongoc_ts_pool_free(pool); } static void test_ts_pool_simple(void) { mongoc_ts_pool *pool = mongoc_ts_pool_new((mongoc_ts_pool_params){.element_size = sizeof(int)}); int *item; int *item2; item = mongoc_ts_pool_get_existing(pool); BSON_ASSERT(!item); item = mongoc_ts_pool_get(pool, NULL); BSON_ASSERT(item); ASSERT_CMPINT(*item, ==, 0); *item = 42; ASSERT_CMPSIZE_T(mongoc_ts_pool_size(pool), ==, 0); mongoc_ts_pool_return(pool, item); ASSERT_CMPSIZE_T(mongoc_ts_pool_size(pool), ==, 1); item2 = mongoc_ts_pool_get_existing(pool); BSON_ASSERT(item2); ASSERT_CMPINT(*item2, ==, 42); ASSERT_CMPSIZE_T(mongoc_ts_pool_size(pool), ==, 0); mongoc_ts_pool_drop(pool, item2); ASSERT_CMPSIZE_T(mongoc_ts_pool_size(pool), ==, 0); mongoc_ts_pool_free(pool); } static int _is_int_42(const void *v, void *unused) { BSON_UNUSED(unused); return *(const int *)v == 42; } static void _set_int_to_7(void *v, void *unused, bson_error_t *unused2) { BSON_UNUSED(unused); BSON_UNUSED(unused2); *(int *)v = 7; } /* Declare a pool that contains `int`, sets each new int to seven, and drops * integers that are equal to 42. */ MONGOC_DECL_SPECIAL_TS_POOL(int, int_pool, void, _set_int_to_7, NULL, _is_int_42) static void test_ts_pool_special(void) { int_pool p = int_pool_new(NULL); int *item = int_pool_get(p, NULL); BSON_ASSERT(item); /* Integer items are constructed and set to seven */ ASSERT_CMPINT(*item, ==, 7); ASSERT_CMPSIZE_T(int_pool_size(p), ==, 0); int_pool_return(p, item); ASSERT_CMPSIZE_T(int_pool_size(p), ==, 1); item = int_pool_get_existing(p); BSON_ASSERT(item); *item = 42; int_pool_return(p, item); /* The pool will drop integer items that are equal to 42, so the item was not * returned to the pool: */ ASSERT_CMPSIZE_T(int_pool_size(p), ==, 0); int_pool_free(p); } void test_ts_pool_install(TestSuite *suite) { TestSuite_Add(suite, "/Util/ts-pool-empty", test_ts_pool_empty); TestSuite_Add(suite, "/Util/ts-pool", test_ts_pool_simple); TestSuite_Add(suite, "/Util/ts-pool-special", test_ts_pool_special); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-uri.c000066400000000000000000004210031511661753600234610ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include static void test_mongoc_uri_new(void) { const mongoc_host_list_t *hosts; const bson_t *options; const bson_t *read_prefs_tags; const mongoc_read_prefs_t *read_prefs; mongoc_uri_t *uri; bson_iter_t iter; /* bad uris */ ASSERT(!mongoc_uri_new("mongodb://")); ASSERT(!mongoc_uri_new("mongodb://\x80")); ASSERT(!mongoc_uri_new("mongodb://localhost/\x80")); ASSERT(!mongoc_uri_new("mongodb://localhost:\x80/")); ASSERT(!mongoc_uri_new("mongodb://localhost/?ipv6=\x80")); ASSERT(!mongoc_uri_new("mongodb://localhost/?foo=\x80")); ASSERT(!mongoc_uri_new("mongodb://localhost/?\x80=bar")); ASSERT(!mongoc_uri_new("mongodb://\x80:pass@localhost")); ASSERT(!mongoc_uri_new("mongodb://user:\x80@localhost")); ASSERT(!mongoc_uri_new("mongodb://user%40DOMAIN.COM:password@localhost/" "?" MONGOC_URI_AUTHMECHANISM "=\x80")); ASSERT(!mongoc_uri_new("mongodb://user%40DOMAIN.COM:password@localhost/" "?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=SERVICE_NAME:\x80")); ASSERT(!mongoc_uri_new("mongodb://user%40DOMAIN.COM:password@localhost/" "?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=\x80:mongodb")); ASSERT(!mongoc_uri_new("mongodb://::")); ASSERT(!mongoc_uri_new("mongodb://[::1]::27017/")); ASSERT(!mongoc_uri_new("mongodb://localhost::27017")); ASSERT(!mongoc_uri_new("mongodb://localhost,localhost::")); ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/d?k")); // %-encoded chars that are invalid in the database name ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/db%2fname")); // "/" ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/db%20ame")); // " " ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/db%5came")); // "\" ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/db%24ame")); // "$" ASSERT(!mongoc_uri_new("mongodb://local1,local2,local3/db%22ame")); // '"' ASSERT(!mongoc_uri_new("")); ASSERT(!mongoc_uri_new("mongodb://,localhost:27017")); ASSERT(!mongoc_uri_new("mongodb://localhost:27017,,b")); ASSERT(!mongoc_uri_new("mongo://localhost:27017")); ASSERT(!mongoc_uri_new("mongodb://localhost::27017")); ASSERT(!mongoc_uri_new("mongodb://localhost::27017/")); ASSERT(!mongoc_uri_new("mongodb://localhost::27017,abc")); ASSERT(!mongoc_uri_new("mongodb://localhost:-1")); ASSERT(!mongoc_uri_new("mongodb://localhost:65536")); ASSERT(!mongoc_uri_new("mongodb://localhost:foo")); ASSERT(!mongoc_uri_new("mongodb://localhost:65536/")); ASSERT(!mongoc_uri_new("mongodb://localhost:0/")); ASSERT(!mongoc_uri_new("mongodb://[::1%lo0]")); ASSERT(!mongoc_uri_new("mongodb://[::1]:-1")); ASSERT(!mongoc_uri_new("mongodb://[::1]:foo")); ASSERT(!mongoc_uri_new("mongodb://[::1]:65536")); ASSERT(!mongoc_uri_new("mongodb://[::1]:65536/")); ASSERT(!mongoc_uri_new("mongodb://[::1]:0/")); ASSERT(!mongoc_uri_new("mongodb://localhost:27017/test?replicaset=")); ASSERT(!mongoc_uri_new("mongodb://local1,local2/?directConnection=true")); ASSERT(!mongoc_uri_new("mongodb+srv://local1/?directConnection=true")); uri = mongoc_uri_new("mongodb://[::1]:27888,[::2]:27999/?ipv6=true&" MONGOC_URI_SAFE "=true"); ASSERT(uri); hosts = mongoc_uri_get_hosts(uri); ASSERT(hosts); ASSERT_CMPSTR(hosts->host, "::1"); ASSERT_CMPUINT16(hosts->port, ==, 27888); ASSERT_CMPSTR(hosts->host_and_port, "[::1]:27888"); mongoc_uri_destroy(uri); /* should recognize IPv6 "scope" like "::1%lo0", with % escaped */ uri = mongoc_uri_new("mongodb://[::1%25lo0]"); ASSERT(uri); hosts = mongoc_uri_get_hosts(uri); ASSERT(hosts); ASSERT_CMPSTR(hosts->host, "::1%lo0"); ASSERT_CMPUINT16(hosts->port, ==, 27017); ASSERT_CMPSTR(hosts->host_and_port, "[::1%lo0]:27017"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://%2Ftmp%2Fmongodb-27017.sock/?"); ASSERT(uri); mongoc_uri_destroy(uri); /* should normalize to lowercase */ uri = mongoc_uri_new("mongodb://cRaZyHoStNaMe"); ASSERT(uri); hosts = mongoc_uri_get_hosts(uri); ASSERT(hosts); ASSERT_CMPSTR(hosts->host, "crazyhostname"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?"); ASSERT(uri); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost:27017/test?replicaset=foo"); ASSERT(uri); hosts = mongoc_uri_get_hosts(uri); ASSERT(hosts); ASSERT(!hosts->next); ASSERT_CMPSTR(hosts->host, "localhost"); ASSERT_CMPUINT16(hosts->port, ==, 27017); ASSERT_CMPSTR(hosts->host_and_port, "localhost:27017"); ASSERT_CMPSTR(mongoc_uri_get_database(uri), "test"); options = mongoc_uri_get_options(uri); ASSERT(options); ASSERT_EQUAL_BSON(tmp_bson("{'replicaset': 'foo'}"), options); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://local1,local2:999,local3/?replicaset=foo"); ASSERT(uri); hosts = mongoc_uri_get_hosts(uri); ASSERT(hosts); ASSERT(hosts->next); ASSERT(hosts->next->next); ASSERT(!hosts->next->next->next); ASSERT_CMPSTR(hosts->host, "local1"); ASSERT_CMPUINT16(hosts->port, ==, 27017); ASSERT_CMPSTR(hosts->next->host, "local2"); ASSERT_CMPUINT16(hosts->next->port, ==, 999); ASSERT_CMPSTR(hosts->next->next->host, "local3"); ASSERT_CMPUINT16(hosts->next->next->port, ==, 27017); options = mongoc_uri_get_options(uri); ASSERT(options); ASSERT(bson_iter_init_find(&iter, options, "replicaset")); ASSERT_CMPSTR(bson_iter_utf8(&iter, NULL), "foo"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost:27017/" "?" MONGOC_URI_READPREFERENCE "=secondaryPreferred&" MONGOC_URI_READPREFERENCETAGS "=dc:ny&" MONGOC_URI_READPREFERENCETAGS "="); ASSERT(uri); read_prefs = mongoc_uri_get_read_prefs_t(uri); ASSERT(mongoc_read_prefs_get_mode(read_prefs) == MONGOC_READ_SECONDARY_PREFERRED); ASSERT(read_prefs); read_prefs_tags = mongoc_read_prefs_get_tags(read_prefs); ASSERT(read_prefs_tags); ASSERT_EQUAL_BSON(tmp_bson("[{'dc': 'ny'}, {}]"), read_prefs_tags); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_SAFE "=false&" MONGOC_URI_JOURNAL "=false"); options = mongoc_uri_get_options(uri); ASSERT(options); ASSERT_EQUAL_BSON(tmp_bson("{'%s': false, '%s': false}", MONGOC_URI_SAFE, MONGOC_URI_JOURNAL), options); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://%2Ftmp%2Fmongodb-27017.sock/?" MONGOC_URI_TLS "=false"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host, "/tmp/mongodb-27017.sock"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://%2Ftmp%2Fmongodb-27017.sock,localhost:27017/?" MONGOC_URI_TLS "=false"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host, "/tmp/mongodb-27017.sock"); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->next->host_and_port, "localhost:27017"); ASSERT(!mongoc_uri_get_hosts(uri)->next->next); mongoc_uri_destroy(uri); /* should assign port numbers to correct hosts */ uri = mongoc_uri_new("mongodb://host1,host2:30000/foo"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host_and_port, "host1:27017"); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->next->host_and_port, "host2:30000"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost:27017,%2Ftmp%2Fmongodb-27017.sock/?" MONGOC_URI_TLS "=false"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host_and_port, "localhost:27017"); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->next->host, "/tmp/mongodb-27017.sock"); ASSERT(!mongoc_uri_get_hosts(uri)->next->next); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_HEARTBEATFREQUENCYMS "=600"); ASSERT(uri); ASSERT_CMPINT32(600, ==, mongoc_uri_get_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 0)); mongoc_uri_destroy(uri); /* heartbeat frequency too short */ ASSERT(!mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_HEARTBEATFREQUENCYMS "=499")); /* should use the " MONGOC_URI_AUTHSOURCE " over db when both are specified */ uri = mongoc_uri_new("mongodb://christian:secret@localhost:27017/foo?" MONGOC_URI_AUTHSOURCE "=abcd"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "christian"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "secret"); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "abcd"); mongoc_uri_destroy(uri); /* should use the default auth source and mechanism */ uri = mongoc_uri_new("mongodb://christian:secret@localhost:27017"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "admin"); ASSERT(!mongoc_uri_get_auth_mechanism(uri)); mongoc_uri_destroy(uri); /* should use the db when no " MONGOC_URI_AUTHSOURCE " is specified */ uri = mongoc_uri_new("mongodb://user:password@localhost/foo"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "foo"); mongoc_uri_destroy(uri); /* should recognize an empty password */ uri = mongoc_uri_new("mongodb://samantha:@localhost"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "samantha"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), ""); mongoc_uri_destroy(uri); /* should recognize no password */ uri = mongoc_uri_new("mongodb://christian@localhost:27017"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "christian"); ASSERT(!mongoc_uri_get_password(uri)); mongoc_uri_destroy(uri); /* should recognize a url escaped character in the username */ uri = mongoc_uri_new("mongodb://christian%40realm:pwd@localhost:27017"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "christian@realm"); mongoc_uri_destroy(uri); /* should recognize a question mark in the userpass instead of mistaking it for the beginning of options */ uri = mongoc_uri_new("mongodb://us?r:pa?s@localhost?" MONGOC_URI_AUTHMECHANISM "=SCRAM-SHA-1"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "us?r"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "pa?s"); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), "SCRAM-SHA-1"); mongoc_uri_destroy(uri); /* should recognize many reserved characters in the userpass for backward compatibility */ uri = mongoc_uri_new("mongodb://user?#[]:pass?#[]@localhost?" MONGOC_URI_AUTHMECHANISM "=SCRAM-SHA-1"); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user?#[]"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "pass?#[]"); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), "SCRAM-SHA-1"); mongoc_uri_destroy(uri); /* should fail on invalid escaped characters */ capture_logs(true); uri = mongoc_uri_new("mongodb://u%ser:pwd@localhost:27017"); ASSERT(!uri); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Invalid %-encoding in username in URI string"); capture_logs(false); capture_logs(true); uri = mongoc_uri_new("mongodb://user:p%wd@localhost:27017"); ASSERT(!uri); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Invalid %-encoding in password in URI string"); capture_logs(false); capture_logs(true); uri = mongoc_uri_new("mongodb://user:pwd@local% host:27017"); ASSERT(!uri); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Invalid %-sequence \"% h\""); capture_logs(false); uri = mongoc_uri_new("mongodb://christian%40realm@localhost:27017/?replicaset=%20"); ASSERT(uri); options = mongoc_uri_get_options(uri); ASSERT(options); ASSERT_EQUAL_BSON(tmp_bson("{'replicaset': ' '}"), options); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://christian%40realm@[::6]:27017/?replicaset=%20"); ASSERT(uri); options = mongoc_uri_get_options(uri); ASSERT(options); ASSERT_EQUAL_BSON(tmp_bson("{'replicaset': ' '}"), options); mongoc_uri_destroy(uri); // Should warn on unsupported `minPoolSize`. `minPoolSize` was removed in CDRIVER-2390. capture_logs(true); uri = mongoc_uri_new("mongodb://host/?minPoolSize=1"); ASSERT(uri); ASSERT_CAPTURED_LOG( "setting URI option minPoolSize=1", MONGOC_LOG_LEVEL_WARNING, "Unsupported URI option \"minpoolsize\""); mongoc_uri_destroy(uri); capture_logs(false); } static void _auth_mechanism_username_required(const char *mechanism) { // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism requires a username", mechanism)); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism requires a username", mechanism)); } } static void _auth_mechanism_password_prohibited(const char *mechanism, const char *user_prefix, const char *uri_suffix) { BSON_ASSERT_PARAM(mechanism); BSON_ASSERT_PARAM(user_prefix); // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%s@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s%s", user_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), user_prefix); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), NULL); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%s:@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s%s", user_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism does not accept a password", mechanism)); mongoc_uri_destroy(uri); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%s:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s%s", user_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism does not accept a password", mechanism)); clear_captured_logs(); mongoc_uri_destroy(uri); } } static void _auth_mechanism_password_required(const char *mechanism) { BSON_ASSERT_PARAM(mechanism); // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism requires a password", mechanism)); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), ""); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "pass"); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } } static void _auth_mechanism_password_allowed(const char *mechanism) { BSON_ASSERT_PARAM(mechanism); // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), NULL); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), ""); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "pass"); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), mechanism); mongoc_uri_destroy(uri); } } static void _auth_mechanism_properties_allowed(const char *mechanism, const char *userpass_prefix, const char *default_properties) { BSON_ASSERT_PARAM(mechanism); BSON_ASSERT_PARAM(userpass_prefix); BSON_OPTIONAL_PARAM(default_properties); // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%slocalhost/?" MONGOC_URI_AUTHMECHANISM "=%s", userpass_prefix, mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; if (default_properties) { ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, "{%s}", default_properties ? default_properties : ""); bson_destroy(&props); } else { ASSERT_WITH_MSG(!mongoc_uri_get_mechanism_properties(uri, &props), "expected failure"); } mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://%slocalhost/?" MONGOC_URI_AUTHMECHANISM "=%s&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=", userpass_prefix, mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, "{%s}", default_properties ? default_properties : ""); bson_destroy(&props); mongoc_uri_destroy(uri); } // Invalid properties. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://%slocalhost/?" MONGOC_URI_AUTHMECHANISM "=%s&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=invalid:value", userpass_prefix, mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("Unsupported '%s' authentication mechanism property: 'invalid'", mechanism)); } } static void _auth_mechanism_source_default_db_or_admin(const char *mechanism) { BSON_ASSERT_PARAM(mechanism); // None (default). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "admin"); mongoc_uri_destroy(uri); } // Database name. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/db?" MONGOC_URI_AUTHMECHANISM "=%s", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "db"); mongoc_uri_destroy(uri); } // `authSource` (highest precedence). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/db?" MONGOC_URI_AUTHMECHANISM "=%s&" MONGOC_URI_AUTHSOURCE "=source", mechanism), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_destroy(uri); } } static void _auth_mechanism_source_external_only(const char *mechanism, const char *userpass_prefix, const char *uri_suffix) { BSON_ASSERT_PARAM(mechanism); BSON_ASSERT_PARAM(userpass_prefix); BSON_ASSERT_PARAM(uri_suffix); // None (default). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%slocalhost/?" MONGOC_URI_AUTHMECHANISM "=%s%s", userpass_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); mongoc_uri_destroy(uri); } // Database name (no effect). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://%slocalhost/db?" MONGOC_URI_AUTHMECHANISM "=%s%s", userpass_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); mongoc_uri_destroy(uri); } // `authSource` (highest precedence, incorrect). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://%slocalhost/db?" MONGOC_URI_AUTHMECHANISM "=%s&" MONGOC_URI_AUTHSOURCE "=source%s", userpass_prefix, mechanism, uri_suffix), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, tmp_str("'%s' authentication mechanism requires \"$external\" authSource, but \"source\" was specified", mechanism)); mongoc_uri_destroy(uri); } // `authSource` (highest precedence, correct). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error(tmp_str("mongodb://%slocalhost/db?" MONGOC_URI_AUTHMECHANISM "=%s&" MONGOC_URI_AUTHSOURCE "=$external%s", userpass_prefix, mechanism, uri_suffix), &error); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); mongoc_uri_destroy(uri); } } static void test_mongoc_uri_auth_mechanism_mongodb_x509(void) { // Authentication spec: username: SHOULD NOT be provided for MongoDB 3.4+. // CDRIVER-1959: allow for backward compatibility until the spec states "MUST NOT" instead of "SHOULD NOT" and // spec tests are updated accordingly to permit warnings or errors. { // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-X509", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), NULL); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-X509", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); // CDRIVER-1959 ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "'MONGODB-X509' authentication mechanism requires a non-empty username"); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-X509", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); // CDRIVER-1959 ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); mongoc_uri_destroy(uri); } } // Authentication spec: password: MUST NOT be specified. _auth_mechanism_password_prohibited("MONGODB-X509", "user", ""); // Authentication spec: source: MUST be "$external". Defaults to "$external". _auth_mechanism_source_external_only("MONGODB-X509", "", ""); } static void test_mongoc_uri_auth_mechanism_gssapi(void) { // Authentication spec: username: MUST be specified and non-zero length. _auth_mechanism_username_required("GSSAPI"); // Authentication spec: password: MAY be specified. _auth_mechanism_password_allowed("GSSAPI"); // mechanism_properties are allowed. { _auth_mechanism_properties_allowed("GSSAPI", "user:pass@", "'SERVICE_NAME': 'mongodb'"); // SERVICE_NAME: Drivers MUST allow the user to specify a different service name. The default is "mongodb". { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=SERVICE_NAME:name", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_EQUAL_BSON(tmp_bson("{'SERVICE_NAME': 'name'}"), &props); bson_destroy(&props); mongoc_uri_destroy(uri); } // SERVICE_NAME: naming of mechanism properties MUST be case-insensitive. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=service_name:name", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_EQUAL_BSON(tmp_bson("{'service_name': 'name'}"), &props); bson_destroy(&props); mongoc_uri_destroy(uri); } // CANONICALIZE_HOST_NAME: Drivers MAY allow the user to request canonicalization of the hostname. { // CDRIVER-4128: only legacy boolean values are currently supported. { static const char *const values[] = {"false", "true", NULL}; for (const char *const *value_ptr = values; *value_ptr; ++value_ptr) { const char *const value = *value_ptr; bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=CANONICALIZE_HOST_NAME:%s", value), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, "{'CANONICALIZE_HOST_NAME': '%s'}", value); bson_destroy(&props); mongoc_uri_destroy(uri); } } { // CDRIVER-4128: only legacy boolean values are currently supported. static const char *const values[] = {"none", "forward", "forwardAndReverse", NULL}; for (const char *const *value_ptr = values; *value_ptr; ++value_ptr) { const char *const value = *value_ptr; bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( tmp_str("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=CANONICALIZE_HOST_NAME:%s", value), &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "'GSSAPI' authentication mechanism requires CANONICALIZE_HOST_NAME is either " "\"true\" or \"false\""); mongoc_uri_destroy(uri); } } } // SERVICE_REALM: Drivers MAY allow the user to specify a different realm for the service. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=SERVICE_REALM:realm", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, "{'SERVICE_NAME': 'mongodb', 'SERVICE_REALM': 'realm'}"); bson_destroy(&props); mongoc_uri_destroy(uri); } // SERVICE_HOST: Drivers MAY allow the user to specify a different host for the service. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=GSSAPI&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=SERVICE_HOST:host", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, "{'SERVICE_NAME': 'mongodb', 'SERVICE_HOST': 'host'}"); bson_destroy(&props); mongoc_uri_destroy(uri); } } // Authentication spec: source: MUST be "$external". Defaults to "$external". _auth_mechanism_source_external_only("GSSAPI", "user@", ""); } static void test_mongoc_uri_auth_mechanism_plain(void) { // Authentication spec: username: MUST be specified and non-zero length. _auth_mechanism_username_required("PLAIN"); // Authentication spec: password: MUST be specified. _auth_mechanism_password_required("PLAIN"); // Authentication spec: source: MUST be specified. Defaults to the database name if supplied on the connection // string or "$external". { // None (default). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=PLAIN", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); mongoc_uri_destroy(uri); } // Database name. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/db?" MONGOC_URI_AUTHMECHANISM "=PLAIN", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "db"); mongoc_uri_destroy(uri); } // `authSource` (highest precedence). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( "mongodb://user:pass@localhost/db?" MONGOC_URI_AUTHMECHANISM "=PLAIN&" MONGOC_URI_AUTHSOURCE "=source", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_destroy(uri); } } } static void test_mongoc_uri_auth_mechanism_scram_sha_1(void) { const char *const mechanism = "SCRAM-SHA-1"; // Authentication spec: username: MUST be specified and non-zero length. _auth_mechanism_username_required(mechanism); // Authentication spec: password: MUST be specified. _auth_mechanism_password_required(mechanism); // Authentication spec: source: MUST be specified. Defaults to the database name if supplied on the connection // string or "admin". _auth_mechanism_source_default_db_or_admin(mechanism); } static void test_mongoc_uri_auth_mechanism_scram_sha_256(void) { const char *const mechanism = "SCRAM-SHA-256"; // Authentication spec: username: MUST be specified and non-zero length. _auth_mechanism_username_required(mechanism); // Authentication spec: password: MUST be specified. _auth_mechanism_password_required(mechanism); // Authentication spec: source: MUST be specified. Defaults to the database name if supplied on the connection // string or "admin". _auth_mechanism_source_default_db_or_admin(mechanism); } static void test_mongoc_uri_auth_mechanism_mongodb_aws(void) { // Authentication spec: username: MAY be specified. // Authentication spec: if a username is provided without a password (or vice-versa) or if only a session token is // provided Drivers MUST raise an error. { // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), NULL); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://:@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "'MONGODB-AWS' authentication mechanism requires a non-empty username"); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "user"); mongoc_uri_destroy(uri); } } // Authentication spec: password: MAY be specified. // Authentication spec: if a username is provided without a password (or vice-versa) or if only a session token is // provided Drivers MUST raise an error. { // None. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "'MONGODB-AWS' authentication mechanism does not accept a username or a password without the other"); mongoc_uri_destroy(uri); } // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); mongoc_uri_destroy(uri); } // Normal. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( "mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); mongoc_uri_destroy(uri); } } // mechanism_properties are allowed. { _auth_mechanism_properties_allowed("MONGODB-AWS", "", NULL); // AWS_SESSION_TOKEN: Drivers MUST allow the user to specify an AWS session token for authentication with // temporary credentials. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=AWS_SESSION_TOKEN:token", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_EQUAL_BSON(tmp_bson("{'AWS_SESSION_TOKEN': 'token'}"), &props); bson_destroy(&props); mongoc_uri_destroy(uri); } // AWS_SESSION_TOKEN: naming of mechanism properties MUST be case-insensitive. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-AWS&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=aws_session_token:token", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_EQUAL_BSON(tmp_bson("{'aws_session_token': 'token'}"), &props); bson_destroy(&props); mongoc_uri_destroy(uri); } } // Authentication spec: source: MUST be "$external". Defaults to "$external". _auth_mechanism_source_external_only("MONGODB-AWS", "", ""); } static void test_mongoc_uri_auth_mechanisms(void) { capture_logs(true); // No username or mechanism means no authentication, even if auth fields are present. { // Authentication spec: the presence of a database name in the URI connection string MUST NOT be interpreted as a // user configuring authentication credentials. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/db", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "db"); // Default. mongoc_uri_destroy(uri); } // Authentication spec: the presence of the authSource option in the URI connection string without other // credential data such as Userinfo or authentication parameters in connection options MUST NOT be interpreted as // a request for authentication. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHSOURCE "=source", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_destroy(uri); } // For backward compatibility, `mongoc_uri_get_auth_source` always returns "admin" when no `authMechanism`, // database name, or `authSource` is specified (consistent with default authentication method selecting // SCRAM-SHA-1 or SCRAM-SHA-256). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "admin"); mongoc_uri_destroy(uri); } // For backward compatibility, `mongoc_uri_get_auth_source` uses the database name when no `authMechanism` or // `authSource` is specified (consistent with default authentication method selecting SCRAM-SHA-1 or // SCRAM-SHA-256). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/db", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "db"); mongoc_uri_destroy(uri); } // For backward compatibility, `mongoc_uri_get_auth_source` uses `authSource` when specified (consistent with // default authentication method selecting SCRAM-SHA-1 or SCRAM-SHA-256). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/db?" MONGOC_URI_AUTHSOURCE "=source", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_destroy(uri); } // `authMechanismProperties` should not be validated without an `authMechanism`. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISMPROPERTIES "=x:1", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_WITH_MSG(!mongoc_uri_get_auth_mechanism(uri), "expected no authMechanism, got %s", mongoc_uri_get_auth_mechanism(uri)); mongoc_uri_destroy(uri); } } // Warn for invalid or unsupported `authMechanism` values. { // Empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported value for authMechanism '': must be one of ['MONGODB-OIDC', " "'SCRAM-SHA-1', 'SCRAM-SHA-256', 'PLAIN', 'MONGODB-X509', 'GSSAPI', 'MONGODB-AWS']"); mongoc_uri_destroy(uri); } // Case-insensitivity. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error( "mongodb://user:pass@localhost/?" MONGOC_URI_AUTHMECHANISM "=scram-sha-1", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), "scram-sha-1"); mongoc_uri_destroy(uri); } // No substring comparison. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=SCRAM", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported value for authMechanism 'SCRAM': must be one of ['MONGODB-OIDC', " "'SCRAM-SHA-1', 'SCRAM-SHA-256', 'PLAIN', 'MONGODB-X509', 'GSSAPI', 'MONGODB-AWS']"); mongoc_uri_destroy(uri); } // Unsupported. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHMECHANISM "=MONGODB-CR", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported value for authMechanism 'MONGODB-CR': must be one of ['MONGODB-OIDC', " "'SCRAM-SHA-1', 'SCRAM-SHA-256', 'PLAIN', 'MONGODB-X509', 'GSSAPI', 'MONGODB-AWS']"); mongoc_uri_destroy(uri); } } // Default Authentication Mechanism { // Authentication spec: the presence of a credential delimiter (i.e. @) in the URI connection string is evidence // that the user has unambiguously specified user information and MUST be interpreted as a user configuring // authentication credentials (even if the username and/or password are empty strings). { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://username@localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "username"); // For backward compatibility, do not forbid missing or empty password even if default authentication method // can only resolve to SCRAM-SHA-1 or SCRAM-SHA-256, both of which require a non-empty password. ASSERT_CMPSTR(mongoc_uri_get_password(uri), NULL); mongoc_uri_destroy(uri); } // Presence of `:` is interpreted as specifying a password, even if empty. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://username:@localhost/", &error); ASSERT_OR_PRINT(uri, error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "username"); // For backward compatibility, do not forbid missing or empty password even if default authentication method // can only resolve to SCRAM-SHA-1 or SCRAM-SHA-256, both of which require a non-empty password. ASSERT_CMPSTR(mongoc_uri_get_password(uri), ""); mongoc_uri_destroy(uri); } // Satisfy Connection String spec test: "must raise an error when the authSource is empty". // This applies even before determining whether or not authentication is required. { bson_error_t error; mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/?" MONGOC_URI_AUTHSOURCE "=", &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "authSource may not be specified as an empty string"); } } test_mongoc_uri_auth_mechanism_mongodb_x509(); test_mongoc_uri_auth_mechanism_gssapi(); test_mongoc_uri_auth_mechanism_plain(); test_mongoc_uri_auth_mechanism_scram_sha_1(); test_mongoc_uri_auth_mechanism_scram_sha_256(); test_mongoc_uri_auth_mechanism_mongodb_aws(); capture_logs(false); } static void test_mongoc_uri_functions(void) { mongoc_client_t *client; mongoc_uri_t *uri; mongoc_database_t *db; int32_t i; uri = mongoc_uri_new("mongodb://foo:bar@localhost:27017/baz?" MONGOC_URI_AUTHSOURCE "=source"); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "foo"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "bar"); ASSERT_CMPSTR(mongoc_uri_get_database(uri), "baz"); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_set_username(uri, "longer username that should work"); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "longer username that should work"); mongoc_uri_set_password(uri, "longer password that should also work"); ASSERT_CMPSTR(mongoc_uri_get_password(uri), "longer password that should also work"); mongoc_uri_set_database(uri, "longer database that should work"); ASSERT_CMPSTR(mongoc_uri_get_database(uri), "longer database that should work"); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "source"); mongoc_uri_set_auth_source(uri, "longer authsource that should work"); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "longer authsource that should work"); ASSERT_CMPSTR(mongoc_uri_get_database(uri), "longer database that should work"); client = test_framework_client_new_from_uri(uri, NULL); mongoc_uri_destroy(uri); ASSERT_CMPSTR(mongoc_uri_get_username(client->uri), "longer username that should work"); ASSERT_CMPSTR(mongoc_uri_get_password(client->uri), "longer password that should also work"); ASSERT_CMPSTR(mongoc_uri_get_database(client->uri), "longer database that should work"); ASSERT_CMPSTR(mongoc_uri_get_auth_source(client->uri), "longer authsource that should work"); mongoc_client_destroy(client); capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_SERVERSELECTIONTIMEOUTMS "=3" "&" MONGOC_URI_JOURNAL "=true" "&" MONGOC_URI_WTIMEOUTMS "=42" "&" MONGOC_URI_CANONICALIZEHOSTNAME "=false"); ASSERT_CAPTURED_LOG("mongoc_uri_new", MONGOC_LOG_LEVEL_WARNING, MONGOC_URI_CANONICALIZEHOSTNAME " is deprecated, use " MONGOC_URI_AUTHMECHANISMPROPERTIES " with CANONICALIZE_HOST_NAME instead"); ASSERT_CMPINT(mongoc_uri_get_option_as_int32(uri, "serverselectiontimeoutms", 18), ==, 3); ASSERT(mongoc_uri_set_option_as_int32(uri, "serverselectiontimeoutms", 18)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, "serverselectiontimeoutms", 19), ==, 18); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 18), ==, 42); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 18), ==, 42); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 18)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 19), ==, 18); ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 20)); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 19), ==, 20); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 500)); i = mongoc_uri_get_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 1000); ASSERT_CMPINT32(i, ==, 500); capture_logs(true); /* Server Discovery and Monitoring Spec: "the driver MUST NOT permit users to * configure it less than minHeartbeatFrequencyMS (500ms)." */ ASSERT(!mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 499)); ASSERT_CAPTURED_LOG("mongoc_uri_set_option_as_int32", MONGOC_LOG_LEVEL_WARNING, "Invalid \"heartbeatfrequencyms\" of 499: must be at least 500"); /* socketcheckintervalms isn't set, return our fallback */ ASSERT_CMPINT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 123), ==, 123); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 18)); ASSERT_CMPINT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 19), ==, 18); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_JOURNAL, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_CANONICALIZEHOSTNAME, true)); /* tls isn't set, return out fallback */ ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLS, true)); client = test_framework_client_new_from_uri(uri, NULL); mongoc_uri_destroy(uri); ASSERT(mongoc_uri_get_option_as_bool(client->uri, MONGOC_URI_JOURNAL, false)); /* tls isn't set, return out fallback */ ASSERT(mongoc_uri_get_option_as_bool(client->uri, MONGOC_URI_TLS, true)); mongoc_client_destroy(client); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, "replicaset", "default"), "default"); ASSERT(mongoc_uri_set_option_as_utf8(uri, "replicaset", "value")); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, "replicaset", "default"), "value"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_SOCKETTIMEOUTMS "=1&" MONGOC_URI_SOCKETCHECKINTERVALMS "=200"); ASSERT_CMPINT32(1, ==, mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 0)); ASSERT_CMPINT32(200, ==, mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 0)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 2); ASSERT_CMPINT32(2, ==, mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 0)); mongoc_uri_set_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 202); ASSERT_CMPINT32(202, ==, mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 0)); client = test_framework_client_new_from_uri(uri, NULL); ASSERT_CMPINT32(2, ==, client->cluster.sockettimeoutms); ASSERT_CMPINT32(202, ==, client->cluster.socketcheckintervalms); mongoc_client_destroy(client); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://host/dbname0"); ASSERT_CMPSTR(mongoc_uri_get_database(uri), "dbname0"); mongoc_uri_set_database(uri, "dbname1"); client = test_framework_client_new_from_uri(uri, NULL); db = mongoc_client_get_default_database(client); ASSERT_CMPSTR(mongoc_database_get_name(db), "dbname1"); mongoc_database_destroy(db); mongoc_client_destroy(client); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://%2Ftmp%2FMongoDB-27017.sock/"); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host, "/tmp/MongoDB-27017.sock"); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host_and_port, "/tmp/MongoDB-27017.sock"); mongoc_uri_destroy(uri); capture_logs(true); uri = mongoc_uri_new("mongodb://host/?foobar=1"); ASSERT(uri); ASSERT_CAPTURED_LOG("setting URI option foobar=1", MONGOC_LOG_LEVEL_WARNING, "Unsupported URI option \"foobar\""); mongoc_uri_destroy(uri); } #define BSON_ERROR_INIT ((bson_error_t){.code = 0u, .domain = 0u, .message = {0}, .reserved = 0u}) static void test_mongoc_uri_new_with_error(void) { bson_error_t error = {0}; mongoc_uri_t *uri; capture_logs(true); ASSERT(!mongoc_uri_new_with_error("mongodb://", NULL)); uri = mongoc_uri_new_with_error("mongodb://localhost", NULL); ASSERT(uri); mongoc_uri_destroy(uri); ASSERT(!mongoc_uri_new_with_error("mongodb://", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Host list of URI string cannot be empty"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongo://localhost", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid URI scheme \"mongo://\". Expected one of \"mongodb://\" or \"mongodb+srv://\""); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/?readPreference=unknown", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported readPreference value [readPreference=unknown]"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/" "?appname=" "WayTooLongAppnameToBeValidSoThisShouldResultInAnErrorWayToLongAppnameToB" "eValidSoThisShouldResultInAnErrorWayToLongAppnameToBeValidSoThisShouldRe" "sultInAnError", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported value for \"appname\""); /* ... */ uri = mongoc_uri_new("mongodb://localhost"); ASSERT(!mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_APPNAME, "WayTooLongAppnameToBeValidSoThisShouldResultInAnErrorWayToLongAppnameToB" "eValidSoThisShouldResultInAnErrorWayToLongAppnameToBeValidSoThisShouldRe" "sultInAnError")); mongoc_uri_destroy(uri); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://user%p:pass@localhost/", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid %-encoding in username in URI string"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://l%oc, alhost/", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid host specifier \"l%oc\""); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb:///tmp/mongodb.sock", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Host list of URI string cannot be empty"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/db.na%me", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid %-sequence \"%me\""); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/db?journal=true&w=0", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Journal conflicts with w value [w=0]"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/db?w=-5", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Unsupported w value [w=-5]"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/db?heartbeatfrequencyms=10", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid \"heartbeatfrequencyms\" of 10: must be at least 500"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/db?zlibcompressionlevel=10", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid \"zlibcompressionlevel\" of 10: must be between -1 and 9"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Missing service name in SRV URI"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://%", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid SRV service name \"%\" in URI"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://x", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid SRV service name \"x\" in URI"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://x.y", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid SRV service name \"x.y\" in URI"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://a.b.c,d.e.f", &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Multiple service names are prohibited in an SRV URI"); error = BSON_ERROR_INIT; ASSERT(!mongoc_uri_new_with_error("mongodb+srv://a.b.c:8000", &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Port numbers are prohibited in an SRV URI"); } #undef ASSERT_SUPPRESS static void test_mongoc_uri_compound_setters(void) { mongoc_uri_t *uri; mongoc_read_prefs_t *prefs; const mongoc_read_prefs_t *prefs_result; mongoc_read_concern_t *rc; const mongoc_read_concern_t *rc_result; mongoc_write_concern_t *wc; const mongoc_write_concern_t *wc_result; uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=dc:ny&" MONGOC_URI_READCONCERNLEVEL "=majority&" MONGOC_URI_W "=3"); prefs = mongoc_read_prefs_new(MONGOC_READ_SECONDARY); mongoc_uri_set_read_prefs_t(uri, prefs); prefs_result = mongoc_uri_get_read_prefs_t(uri); ASSERT_CMPINT((int)mongoc_read_prefs_get_mode(prefs_result), ==, MONGOC_READ_SECONDARY); ASSERT_EQUAL_BSON(tmp_bson("{}"), mongoc_read_prefs_get_tags(prefs_result)); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, "whatever"); mongoc_uri_set_read_concern(uri, rc); rc_result = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc_result), "whatever"); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 2); mongoc_uri_set_write_concern(uri, wc); wc_result = mongoc_uri_get_write_concern(uri); ASSERT_CMPINT32(mongoc_write_concern_get_w(wc_result), ==, 2); mongoc_read_prefs_destroy(prefs); mongoc_read_concern_destroy(rc); mongoc_write_concern_destroy(wc); mongoc_uri_destroy(uri); } static void test_mongoc_host_list_from_string(void) { mongoc_host_list_t host_list = {0}; /* shouldn't be parsable */ capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, ":27017")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "example.com:")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "localhost:999999999")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "::1234")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "]:1234")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "[]:1234")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "[::1] foo")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Could not parse address"); capture_logs(true); ASSERT(!_mongoc_host_list_from_string(&host_list, "[::1]extra_chars:27017")); ASSERT_CAPTURED_LOG("_mongoc_host_list_from_string", MONGOC_LOG_LEVEL_ERROR, "Invalid trailing content"); /* normal parsing, host and port are split, host is downcased */ ASSERT(_mongoc_host_list_from_string(&host_list, "localHOST:27019")); ASSERT_CMPSTR(host_list.host_and_port, "localhost:27019"); ASSERT_CMPSTR(host_list.host, "localhost"); ASSERT_CMPUINT16(host_list.port, ==, 27019); ASSERT(!host_list.next); ASSERT(_mongoc_host_list_from_string(&host_list, "localhost")); ASSERT_CMPSTR(host_list.host_and_port, "localhost:27017"); ASSERT_CMPSTR(host_list.host, "localhost"); ASSERT_CMPUINT16(host_list.port, ==, 27017); ASSERT(_mongoc_host_list_from_string(&host_list, "[::1]")); ASSERT_CMPSTR(host_list.host_and_port, "[::1]:27017"); ASSERT_CMPSTR(host_list.host, "::1"); /* no "[" or "]" */ ASSERT_CMPUINT16(host_list.port, ==, 27017); ASSERT(_mongoc_host_list_from_string(&host_list, "[Fe80::1]:1234")); ASSERT_CMPSTR(host_list.host_and_port, "[fe80::1]:1234"); ASSERT_CMPSTR(host_list.host, "fe80::1"); ASSERT_CMPUINT16(host_list.port, ==, 1234); ASSERT(_mongoc_host_list_from_string(&host_list, "[fe80::1%lo0]:1234")); ASSERT_CMPSTR(host_list.host_and_port, "[fe80::1%lo0]:1234"); ASSERT_CMPSTR(host_list.host, "fe80::1%lo0"); ASSERT_CMPUINT16(host_list.port, ==, 1234); ASSERT(_mongoc_host_list_from_string(&host_list, "[fe80::1%lo0]:1234")); ASSERT_CMPSTR(host_list.host_and_port, "[fe80::1%lo0]:1234"); ASSERT_CMPSTR(host_list.host, "fe80::1%lo0"); ASSERT_CMPUINT16(host_list.port, ==, 1234); /* preserves case */ ASSERT(_mongoc_host_list_from_string(&host_list, "/Path/to/file.sock")); ASSERT_CMPSTR(host_list.host_and_port, "/Path/to/file.sock"); ASSERT_CMPSTR(host_list.host, "/Path/to/file.sock"); /* weird cases that should still parse, without crashing */ ASSERT(_mongoc_host_list_from_string(&host_list, "/Path/to/file.sock:1")); ASSERT_CMPSTR(host_list.host, "/Path/to/file.sock"); ASSERT_CMPINT(host_list.family, ==, AF_UNIX); ASSERT(_mongoc_host_list_from_string(&host_list, " :1234")); ASSERT_CMPSTR(host_list.host_and_port, " :1234"); ASSERT_CMPSTR(host_list.host, " "); ASSERT_CMPUINT16(host_list.port, ==, 1234); ASSERT(_mongoc_host_list_from_string(&host_list, "[:1234")); ASSERT_CMPSTR(host_list.host_and_port, "[:1234"); ASSERT_CMPSTR(host_list.host, "["); ASSERT_CMPUINT16(host_list.port, ==, 1234); ASSERT(_mongoc_host_list_from_string(&host_list, "[:]")); ASSERT_CMPSTR(host_list.host_and_port, "[:]:27017"); ASSERT_CMPSTR(host_list.host, ":"); ASSERT_CMPUINT16(host_list.port, ==, 27017); } static void test_mongoc_uri_new_for_host_port(void) { mongoc_uri_t *uri; uri = mongoc_uri_new_for_host_port("uber", 555); ASSERT(uri); ASSERT_CMPSTR("uber", mongoc_uri_get_hosts(uri)->host); ASSERT_CMPSTR("uber:555", mongoc_uri_get_hosts(uri)->host_and_port); ASSERT_CMPUINT16(555, ==, mongoc_uri_get_hosts(uri)->port); mongoc_uri_destroy(uri); } static void test_mongoc_uri_compressors(void) { mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://localhost/"); ASSERT_EQUAL_BSON(tmp_bson("{}"), mongoc_uri_get_compressors(uri)); #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY capture_logs(true); mongoc_uri_set_compressors(uri, "snappy,unknown"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'unknown': {'$exists': false}}"); ASSERT_CAPTURED_LOG("mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Unsupported compressor: 'unknown'"); #endif #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY capture_logs(true); mongoc_uri_set_compressors(uri, "snappy"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'unknown': {'$exists': false}}"); ASSERT_NO_CAPTURED_LOGS("snappy uri"); /* Overwrite the previous URI, effectively disabling snappy */ capture_logs(true); mongoc_uri_set_compressors(uri, "unknown"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': false}, 'unknown': {'$exists': false}}"); ASSERT_CAPTURED_LOG("mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Unsupported compressor: 'unknown'"); #endif capture_logs(true); mongoc_uri_set_compressors(uri, ""); ASSERT_EQUAL_BSON(tmp_bson("{}"), mongoc_uri_get_compressors(uri)); ASSERT_NO_CAPTURED_LOGS("Disable compression with empty string"); /* Disable compression */ capture_logs(true); mongoc_uri_set_compressors(uri, NULL); ASSERT_EQUAL_BSON(tmp_bson("{}"), mongoc_uri_get_compressors(uri)); ASSERT_NO_CAPTURED_LOGS("Disable compression"); mongoc_uri_destroy(uri); #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY uri = mongoc_uri_new("mongodb://localhost/?compressors=snappy"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}}"); mongoc_uri_destroy(uri); capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/?compressors=snappy,somethingElse"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'somethingElse': {'$exists': false}}"); ASSERT_CAPTURED_LOG( "mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Unsupported compressor: 'somethingElse'"); mongoc_uri_destroy(uri); #endif #ifdef MONGOC_ENABLE_COMPRESSION_ZLIB #ifdef MONGOC_ENABLE_COMPRESSION_SNAPPY uri = mongoc_uri_new("mongodb://localhost/?compressors=snappy,zlib"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'zlib': {'$exists': true}}"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_compressors(uri, "snappy,zlib")); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'zlib': {'$exists': true}}"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_compressors(uri, "zlib")); ASSERT(mongoc_uri_set_compressors(uri, "snappy")); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'snappy': {'$exists': true}, 'zlib': {'$exists': false}}"); mongoc_uri_destroy(uri); #endif uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'zlib': {'$exists': true}}"); mongoc_uri_destroy(uri); capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib,somethingElse"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'zlib': {'$exists': true}, 'somethingElse': {'$exists': false}}"); ASSERT_CAPTURED_LOG( "mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Unsupported compressor: 'somethingElse'"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib&zlibCompressionLevel=-1"); ASSERT_MATCH(mongoc_uri_get_compressors(uri), "{'zlib': {'$exists': true}}"); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 1), ==, -1); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib&zlibCompressionLevel=9"); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 1), ==, 9); mongoc_uri_destroy(uri); capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib&zlibCompressionLevel=-2"); ASSERT_CAPTURED_LOG("mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Invalid \"zlibcompressionlevel\" of -2: must be between -1 and 9"); mongoc_uri_destroy(uri); capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/?compressors=zlib&zlibCompressionLevel=10"); ASSERT_CAPTURED_LOG("mongoc_uri_set_compressors", MONGOC_LOG_LEVEL_WARNING, "Invalid \"zlibcompressionlevel\" of 10: must be between -1 and 9"); mongoc_uri_destroy(uri); #endif } static void test_mongoc_uri_unescape(void) { #define ASSERT_URIDECODE_STR(_s, _e) \ do { \ char *str = mongoc_uri_unescape(_s); \ ASSERT(!strcmp(str, _e)); \ bson_free(str); \ } while (0) #define ASSERT_URIDECODE_FAIL(_s) \ do { \ char *str; \ capture_logs(true); \ str = mongoc_uri_unescape(_s); \ ASSERT(!str); \ ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Invalid % escape sequence"); \ } while (0) ASSERT_URIDECODE_STR("", ""); ASSERT_URIDECODE_STR("%40", "@"); ASSERT_URIDECODE_STR("me%40localhost@localhost", "me@localhost@localhost"); ASSERT_URIDECODE_STR("%20", " "); ASSERT_URIDECODE_STR("%24%21%40%2A%26%5E%21%40%2A%23%26%5E%21%40%23%2A%26" "%5E%21%40%2A%23%26%5E%21%40%2A%26%23%5E%7D%7B%7D%7B" "%22%22%27%7D%7B%5B%5D%3C%3E%3F", "$!@*&^!@*#&^!@#*&^!@*#&^!@*&#^}{}{\"\"'}{[]<>?"); ASSERT_URIDECODE_FAIL("%"); ASSERT_URIDECODE_FAIL("%%"); ASSERT_URIDECODE_FAIL("%%%"); ASSERT_URIDECODE_FAIL("%FF"); ASSERT_URIDECODE_FAIL("%CC"); ASSERT_URIDECODE_FAIL("%00"); #undef ASSERT_URIDECODE_STR #undef ASSERT_URIDECODE_FAIL } typedef struct { const char *uri; bool parses; mongoc_read_mode_t mode; bson_t *tags; const char *log_msg; } read_prefs_test; static void test_mongoc_uri_read_prefs(void) { const mongoc_read_prefs_t *rp; mongoc_uri_t *uri; const read_prefs_test *t; int i; bson_t *tags_dcny = BCON_NEW("0", "{", "dc", "ny", "}"); bson_t *tags_dcny_empty = BCON_NEW("0", "{", "dc", "ny", "}", "1", "{", "}"); bson_t *tags_dcnyusessd_dcsf_empty = BCON_NEW("0", "{", "dc", "ny", "use", "ssd", "}", "1", "{", "dc", "sf", "}", "2", "{", "}"); bson_t *tags_empty = BCON_NEW("0", "{", "}"); const char *conflicts = "Invalid readPreferences"; const read_prefs_test tests[] = { { .uri = "mongodb://localhost/", .parses = true, .mode = MONGOC_READ_PRIMARY, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=primary", .parses = true, .mode = MONGOC_READ_PRIMARY, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=primaryPreferred", .parses = true, .mode = MONGOC_READ_PRIMARY_PREFERRED, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=secondary", .parses = true, .mode = MONGOC_READ_SECONDARY, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=secondaryPreferred", .parses = true, .mode = MONGOC_READ_SECONDARY_PREFERRED, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest", .parses = true, .mode = MONGOC_READ_NEAREST, }, { /* MONGOC_URI_READPREFERENCETAGS conflict with primary mode */ .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCETAGS "=", .parses = false, .mode = MONGOC_READ_PRIMARY, .log_msg = conflicts, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=primary&" MONGOC_URI_READPREFERENCETAGS "=", .parses = false, .mode = MONGOC_READ_PRIMARY, .log_msg = conflicts, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=secondaryPreferred&" MONGOC_URI_READPREFERENCETAGS "=", .parses = true, .mode = MONGOC_READ_SECONDARY_PREFERRED, .tags = tags_empty, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=secondaryPreferred&" MONGOC_URI_READPREFERENCETAGS "=dc:ny", .parses = true, .mode = MONGOC_READ_SECONDARY_PREFERRED, .tags = tags_dcny, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=dc:ny&" MONGOC_URI_READPREFERENCETAGS "=", .parses = true, .mode = MONGOC_READ_NEAREST, .tags = tags_dcny_empty, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=dc:ny,use:ssd&" MONGOC_URI_READPREFERENCETAGS "=dc:sf&" MONGOC_URI_READPREFERENCETAGS "=", .parses = true, .mode = MONGOC_READ_NEAREST, .tags = tags_dcnyusessd_dcsf_empty, }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=foo", .parses = false, .mode = MONGOC_READ_NEAREST, .log_msg = "Unsupported value for \"" MONGOC_URI_READPREFERENCETAGS "\": \"foo\"", }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=foo,bar", .parses = false, .mode = MONGOC_READ_NEAREST, .log_msg = "Unsupported value for \"" MONGOC_URI_READPREFERENCETAGS "\": \"foo,bar\"", }, { .uri = "mongodb://localhost/?" MONGOC_URI_READPREFERENCE "=nearest&" MONGOC_URI_READPREFERENCETAGS "=1", .parses = false, .mode = MONGOC_READ_NEAREST, .log_msg = "Unsupported value for \"" MONGOC_URI_READPREFERENCETAGS "\": \"1\"", }, {0}}; for (i = 0; tests[i].uri; i++) { t = &tests[i]; capture_logs(true); uri = mongoc_uri_new(t->uri); if (t->parses) { ASSERT(uri); ASSERT_NO_CAPTURED_LOGS(t->uri); } else { ASSERT(!uri); if (t->log_msg) { ASSERT_CAPTURED_LOG(t->uri, MONGOC_LOG_LEVEL_WARNING, t->log_msg); } continue; } rp = mongoc_uri_get_read_prefs_t(uri); ASSERT(rp); ASSERT_CMPINT((int)t->mode, ==, (int)mongoc_read_prefs_get_mode(rp)); if (t->tags) { ASSERT_EQUAL_BSON(t->tags, mongoc_read_prefs_get_tags(rp)); } mongoc_uri_destroy(uri); } bson_destroy(tags_dcny); bson_destroy(tags_dcny_empty); bson_destroy(tags_dcnyusessd_dcsf_empty); bson_destroy(tags_empty); } typedef struct { const char *uri; bool parses; int32_t w; const char *wtag; int64_t wtimeoutms; const char *log_msg; } write_concern_test; static void test_mongoc_uri_write_concern(void) { static const write_concern_test tests[] = { { .uri = "mongodb://localhost/?" MONGOC_URI_SAFE "=false", .parses = true, .w = MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED, }, { .uri = "mongodb://localhost/?" MONGOC_URI_SAFE "=true", .parses = true, .w = 1, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=-1", .parses = false, .log_msg = "Unsupported w value [w=-1]", }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=0", .parses = true, .w = MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=1", .parses = true, .w = 1, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=2", .parses = true, .w = 2, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=majority", .parses = true, .w = MONGOC_WRITE_CONCERN_W_MAJORITY, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=10", .parses = true, .w = 10, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=", .parses = true, .w = MONGOC_WRITE_CONCERN_W_DEFAULT, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=mytag", .parses = true, .w = MONGOC_WRITE_CONCERN_W_TAG, .wtag = "mytag", }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=mytag&" MONGOC_URI_SAFE "=false", .parses = true, .w = MONGOC_WRITE_CONCERN_W_TAG, .wtag = "mytag", }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=1&" MONGOC_URI_SAFE "=false", .parses = true, .w = 1, }, { .uri = "mongodb://localhost/?" MONGOC_URI_JOURNAL "=true", .parses = true, .w = MONGOC_WRITE_CONCERN_W_DEFAULT, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=1&" MONGOC_URI_JOURNAL "=true", .parses = true, .w = 1, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=2&" MONGOC_URI_WTIMEOUTMS "=1000", .parses = true, .w = 2, .wtimeoutms = 1000, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=2&" MONGOC_URI_WTIMEOUTMS "=2147483648", .parses = true, .w = 2, .wtimeoutms = 2147483648LL, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=majority&" MONGOC_URI_WTIMEOUTMS "=1000", .parses = true, .w = MONGOC_WRITE_CONCERN_W_MAJORITY, .wtimeoutms = 1000, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=mytag&" MONGOC_URI_WTIMEOUTMS "=1000", .parses = true, .w = MONGOC_WRITE_CONCERN_W_TAG, .wtag = "mytag", .wtimeoutms = 1000, }, { .uri = "mongodb://localhost/?" MONGOC_URI_W "=0&" MONGOC_URI_JOURNAL "=true", .parses = false, .w = MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED, .log_msg = "Journal conflicts with w value [" MONGOC_URI_W "=0]", }, {0}}; for (int i = 0; tests[i].uri; i++) { const write_concern_test *const t = &tests[i]; capture_logs(true); mongoc_uri_t *const uri = mongoc_uri_new(t->uri); if (tests[i].log_msg) { ASSERT_CAPTURED_LOG(tests[i].uri, MONGOC_LOG_LEVEL_WARNING, tests[i].log_msg); } else { ASSERT_NO_CAPTURED_LOGS(tests[i].uri); } capture_logs(false); /* clear captured logs */ if (t->parses) { ASSERT_WITH_MSG(uri, "expected the URI to be parsed as valid"); } else { ASSERT_WITH_MSG(!uri, "expected the URI to be parsed as invalid"); continue; } const mongoc_write_concern_t *const wr = mongoc_uri_get_write_concern(uri); ASSERT(wr); ASSERT_CMPINT32(t->w, ==, mongoc_write_concern_get_w(wr)); if (t->wtag) { ASSERT_CMPSTR(t->wtag, mongoc_write_concern_get_wtag(wr)); } if (t->wtimeoutms) { ASSERT_CMPINT64(t->wtimeoutms, ==, mongoc_write_concern_get_wtimeout_int64(wr)); } mongoc_uri_destroy(uri); } } static void test_mongoc_uri_read_concern(void) { const mongoc_read_concern_t *rc; mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READCONCERNLEVEL "=majority"); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "majority"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/" "?" MONGOC_URI_READCONCERNLEVEL "=" MONGOC_READ_CONCERN_LEVEL_MAJORITY); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "majority"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/" "?" MONGOC_URI_READCONCERNLEVEL "=" MONGOC_READ_CONCERN_LEVEL_LINEARIZABLE); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "linearizable"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READCONCERNLEVEL "=local"); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "local"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READCONCERNLEVEL "=" MONGOC_READ_CONCERN_LEVEL_LOCAL); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "local"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READCONCERNLEVEL "=randomstuff"); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), "randomstuff"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); rc = mongoc_uri_get_read_concern(uri); ASSERT(mongoc_read_concern_get_level(rc) == NULL); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_READCONCERNLEVEL "="); rc = mongoc_uri_get_read_concern(uri); ASSERT_CMPSTR(mongoc_read_concern_get_level(rc), ""); mongoc_uri_destroy(uri); } static void test_mongoc_uri_long_hostname(void) { char *host; char *host_and_port; size_t len = BSON_HOST_NAME_MAX; char *uri_str; mongoc_uri_t *uri; /* hostname of exactly maximum length */ host = bson_malloc(len + 1); memset(host, 'a', len); host[len] = '\0'; host_and_port = bson_strdup_printf("%s:12345", host); uri_str = bson_strdup_printf("mongodb://%s", host_and_port); uri = mongoc_uri_new(uri_str); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host_and_port, host_and_port); mongoc_uri_destroy(uri); uri = mongoc_uri_new_for_host_port(host, 12345); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_hosts(uri)->host_and_port, host_and_port); mongoc_uri_destroy(uri); bson_free(uri_str); bson_free(host_and_port); bson_free(host); /* hostname length exceeds maximum by one */ len++; host = bson_malloc(len + 1); memset(host, 'a', len); host[len] = '\0'; host_and_port = bson_strdup_printf("%s:12345", host); uri_str = bson_strdup_printf("mongodb://%s", host_and_port); capture_logs(true); ASSERT(!mongoc_uri_new(uri_str)); ASSERT_CAPTURED_LOG("mongoc_uri_new", MONGOC_LOG_LEVEL_WARNING, "too long"); clear_captured_logs(); ASSERT(!mongoc_uri_new_for_host_port(host, 12345)); ASSERT_CAPTURED_LOG("mongoc_uri_new", MONGOC_LOG_LEVEL_WARNING, "too long"); bson_free(uri_str); bson_free(host_and_port); bson_free(host); } static void test_mongoc_uri_tls_ssl(const char *tls, const char *tlsCertificateKeyFile, const char *tlsCertificateKeyPassword, const char *tlsCAFile, const char *tlsAllowInvalidCertificates, const char *tlsAllowInvalidHostnames) { const char *tlsalt; char url_buffer[2048]; mongoc_uri_t *uri; bson_error_t err; bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://CN=client,OU=kerneluser,O=10Gen,L=New York City," "ST=New York,C=US@ldaptest.10gen.cc/?" "%s=true&authMechanism=MONGODB-X509&" "%s=tests/x509gen/ldaptest-client-key-and-cert.pem&" "%s=tests/x509gen/ldaptest-ca-cert.crt&" "%s=true", tls, tlsCertificateKeyFile, tlsCAFile, tlsAllowInvalidHostnames); uri = mongoc_uri_new(url_buffer); ASSERT_CMPSTR(mongoc_uri_get_username(uri), "CN=client,OU=kerneluser,O=10Gen,L=New York City,ST=New York,C=US"); ASSERT(!mongoc_uri_get_password(uri)); ASSERT(!mongoc_uri_get_database(uri)); ASSERT_CMPSTR(mongoc_uri_get_auth_source(uri), "$external"); ASSERT_CMPSTR(mongoc_uri_get_auth_mechanism(uri), "MONGODB-X509"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "none"), "tests/x509gen/ldaptest-client-key-and-cert.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, "none"), "tests/x509gen/ldaptest-ca-cert.crt"); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=key.pem&%s=ca.pem", tls, tlsCertificateKeyFile, tlsCAFile); uri = mongoc_uri_new(url_buffer); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE, "none"), "key.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "none"), "key.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE, "none"), "ca.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, "none"), "ca.pem"); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true", tls); uri = mongoc_uri_new(url_buffer); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, "none"), "none"); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=pa$$word!&%s=encrypted.pem", tls, tlsCertificateKeyPassword, tlsCertificateKeyFile); uri = mongoc_uri_new(url_buffer); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE, "none"), "encrypted.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "none"), "encrypted.pem"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD, "none"), "pa$$word!"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, "none"), "pa$$word!"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, "none"), "none"); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf( url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=true", tls, tlsAllowInvalidCertificates); uri = mongoc_uri_new(url_buffer); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, "none"), "none"); ASSERT_CMPSTR(mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, "none"), "none"); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES, false)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES, false)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=foo.pem", tlsCertificateKeyFile); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=foo.pem", tlsCAFile); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true", tlsAllowInvalidCertificates); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_tls(uri)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES, false)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); mongoc_uri_destroy(uri); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true", tlsAllowInvalidHostnames); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_tls(uri)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES, false)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, false)); mongoc_uri_destroy(uri); bson_snprintf( url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=false&%s=foo.pem", tls, tlsCertificateKeyFile); uri = mongoc_uri_new(url_buffer); ASSERT(!mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); bson_snprintf( url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=false&%s=foo.pem", tls, tlsCertificateKeyFile); uri = mongoc_uri_new(url_buffer); ASSERT(!mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); bson_snprintf( url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=false&%s=true", tls, tlsAllowInvalidCertificates); uri = mongoc_uri_new(url_buffer); ASSERT(!mongoc_uri_get_tls(uri)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES, false)); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); mongoc_uri_destroy(uri); bson_snprintf( url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=false&%s=false", tls, tlsAllowInvalidHostnames); uri = mongoc_uri_new(url_buffer); ASSERT(!mongoc_uri_get_tls(uri)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES, true)); ASSERT(!mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, true)); mongoc_uri_destroy(uri); if (!strcmp(tls, "ssl")) { tlsalt = "tls"; } else { tlsalt = "ssl"; } /* Mixing options okay so long as they match */ capture_logs(true); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=true", tls, tlsalt); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_option_as_bool(uri, tls, false)); ASSERT_NO_CAPTURED_LOGS(url_buffer); mongoc_uri_destroy(uri); /* Same option with different values okay, latter overrides */ capture_logs(true); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=false", tls, tls); uri = mongoc_uri_new(url_buffer); ASSERT(!mongoc_uri_get_option_as_bool(uri, tls, true)); if (strcmp(tls, "tls")) { ASSERT_CAPTURED_LOG("option: ssl", MONGOC_LOG_LEVEL_WARNING, "Overwriting previously provided value for 'ssl'"); } else { ASSERT_CAPTURED_LOG("option: tls", MONGOC_LOG_LEVEL_WARNING, "Overwriting previously provided value for 'tls'"); } mongoc_uri_destroy(uri); /* Mixing options not okay if values differ */ capture_logs(false); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb://localhost/?%s=true&%s=false", tls, tlsalt); uri = mongoc_uri_new_with_error(url_buffer, &err); if (strcmp(tls, "tls")) { ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Deprecated option 'ssl=true' conflicts with " "canonical name 'tls=false'"); } else { ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Deprecated option 'ssl=false' conflicts with " "canonical name 'tls=true'"); } mongoc_uri_destroy(uri); /* No conflict appears with implicit tls=true via SRV */ capture_logs(false); bson_snprintf(url_buffer, sizeof(url_buffer), "mongodb+srv://a.b.c/?%s=foo.pem", tlsCAFile); uri = mongoc_uri_new(url_buffer); ASSERT(mongoc_uri_get_option_as_bool(uri, tls, false)); mongoc_uri_destroy(uri); /* Set TLS options after creating mongoc_uri_t from connection string */ uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_utf8(uri, tlsCertificateKeyFile, "/path/to/pem")); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_utf8(uri, tlsCertificateKeyPassword, "password")); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_utf8(uri, tlsCAFile, "/path/to/pem")); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_bool(uri, tlsAllowInvalidCertificates, false)); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_bool(uri, tlsAllowInvalidHostnames, true)); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); } static void test_mongoc_uri_tls(void) { bson_error_t err = {0}; mongoc_uri_t *uri; test_mongoc_uri_tls_ssl(MONGOC_URI_TLS, MONGOC_URI_TLSCERTIFICATEKEYFILE, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, MONGOC_URI_TLSCAFILE, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, MONGOC_URI_TLSALLOWINVALIDHOSTNAMES); /* non-canonical case for tls options */ test_mongoc_uri_tls_ssl("tls", "TlsCertificateKeyFile", "tlsCertificateKeyFilePASSWORD", "tlsCAFILE", "TLSALLOWINVALIDCERTIFICATES", "tLSaLLOWiNVALIDhOSTNAMES"); /* non-canonical case for tls option */ uri = mongoc_uri_new("mongodb://localhost/?tLs=true"); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_bool(uri, "TLS", true)); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); /* tls-only option */ uri = mongoc_uri_new("mongodb://localhost/?tlsInsecure=true"); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSINSECURE, false)); mongoc_uri_destroy(uri); ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/?tlsInsecure=true&tlsAllowInvalidHostnames=false", &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "tlsinsecure may not be specified with " "tlsallowinvalidcertificates, tlsallowinvalidhostnames, " "tlsdisableocspendpointcheck, or tlsdisablecertificaterevocationcheck"); ASSERT(!mongoc_uri_new_with_error("mongodb://localhost/" "?tlsInsecure=true&tlsAllowInvalidCertificates=true", &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "tlsinsecure may not be specified with " "tlsallowinvalidcertificates, tlsallowinvalidhostnames, " "tlsdisableocspendpointcheck, or tlsdisablecertificaterevocationcheck"); } static void test_mongoc_uri_ssl(void) { mongoc_uri_t *uri; test_mongoc_uri_tls_ssl(MONGOC_URI_SSL, MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE, MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD, MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE, MONGOC_URI_SSLALLOWINVALIDCERTIFICATES, MONGOC_URI_SSLALLOWINVALIDHOSTNAMES); /* non-canonical case for ssl options */ test_mongoc_uri_tls_ssl("ssl", "SslClientCertificateKeyFile", "sslClientCertificateKeyPASSWORD", "sslCERTIFICATEAUTHORITYFILE", "SSLALLOWINVALIDCERTIFICATES", "sSLaLLOWiNVALIDhOSTNAMES"); /* non-canonical case for ssl option */ uri = mongoc_uri_new("mongodb://localhost/?sSl=true"); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/"); ASSERT(mongoc_uri_set_option_as_bool(uri, "SSL", true)); ASSERT(mongoc_uri_get_tls(uri)); mongoc_uri_destroy(uri); } static void test_mongoc_uri_local_threshold_ms(void) { mongoc_uri_t *uri; uri = mongoc_uri_new("mongodb://localhost/"); /* localthresholdms isn't set, return the default */ ASSERT_CMPINT(mongoc_uri_get_local_threshold_option(uri), ==, MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 99)); ASSERT_CMPINT(mongoc_uri_get_local_threshold_option(uri), ==, 99); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_LOCALTHRESHOLDMS "=0"); ASSERT_CMPINT(mongoc_uri_get_local_threshold_option(uri), ==, 0); ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 99)); ASSERT_CMPINT(mongoc_uri_get_local_threshold_option(uri), ==, 99); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb://localhost/?" MONGOC_URI_LOCALTHRESHOLDMS "=-1"); /* localthresholdms is invalid, return the default */ capture_logs(true); ASSERT_CMPINT(mongoc_uri_get_local_threshold_option(uri), ==, MONGOC_TOPOLOGY_LOCAL_THRESHOLD_MS); ASSERT_CAPTURED_LOG( "mongoc_uri_get_local_threshold_option", MONGOC_LOG_LEVEL_WARNING, "Invalid localThresholdMS: -1"); mongoc_uri_destroy(uri); } #define INVALID(_uri, _host) \ ASSERT_WITH_MSG(!mongoc_uri_upsert_host((_uri), (_host), 1, &error), "expected host upsert to fail"); \ ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_NAME_RESOLUTION, "must be subdomain") #define VALID(_uri, _host) ASSERT_OR_PRINT(mongoc_uri_upsert_host((_uri), (_host), 1, &error), error) static void test_mongoc_uri_srv(void) { mongoc_uri_t *uri; bson_error_t error; capture_logs(true); ASSERT(!mongoc_uri_new("mongodb+srv://")); /* requires a subdomain, domain, and TLD: "a.example.com" */ ASSERT(!mongoc_uri_new("mongodb+srv://foo")); ASSERT(!mongoc_uri_new("mongodb+srv://foo.")); ASSERT(!mongoc_uri_new("mongodb+srv://.foo")); ASSERT(!mongoc_uri_new("mongodb+srv://..")); ASSERT(!mongoc_uri_new("mongodb+srv://.a.")); ASSERT(!mongoc_uri_new("mongodb+srv://.a.b.c.com")); ASSERT(!mongoc_uri_new("mongodb+srv://foo\x08\x00bar")); ASSERT(!mongoc_uri_new("mongodb+srv://foo%00bar")); ASSERT(!mongoc_uri_new("mongodb+srv://example.com")); uri = mongoc_uri_new_with_error("mongodb+srv://c.d.com", &error); ASSERT_OR_PRINT(uri, error); ASSERT_CMPSTR(mongoc_uri_get_srv_hostname(uri), "c.d.com"); ASSERT(mongoc_uri_get_hosts(uri) == NULL); /* tls is set to true when we use SRV */ ASSERT_EQUAL_BSON(tmp_bson("{'tls': true}"), mongoc_uri_get_options(uri)); /* but we can override tls */ mongoc_uri_destroy(uri); uri = mongoc_uri_new_with_error("mongodb+srv://c.d.com/?tls=false", &error); ASSERT_OR_PRINT(uri, error); ASSERT_EQUAL_BSON(tmp_bson("{'tls': false}"), mongoc_uri_get_options(uri)); INVALID(uri, "com"); INVALID(uri, "foo.com"); INVALID(uri, "d.com"); INVALID(uri, "cd.com"); VALID(uri, "c.d.com"); VALID(uri, "bc.d.com"); VALID(uri, "longer-string.d.com"); INVALID(uri, ".c.d.com"); VALID(uri, "b.c.d.com"); INVALID(uri, ".b.c.d.com"); INVALID(uri, "..b.c.d.com"); VALID(uri, "a.b.c.d.com"); mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb+srv://b.c.d.com"); INVALID(uri, "foo.com"); INVALID(uri, "a.b.d.com"); INVALID(uri, "d.com"); VALID(uri, "b.c.d.com"); VALID(uri, "a.b.c.d.com"); VALID(uri, "foo.a.b.c.d.com"); mongoc_uri_destroy(uri); /* trailing dot is OK */ uri = mongoc_uri_new("mongodb+srv://service.consul."); ASSERT(uri); ASSERT_CMPSTR(mongoc_uri_get_srv_hostname(uri), "service.consul."); ASSERT(mongoc_uri_get_hosts(uri) == NULL); INVALID(uri, ".consul."); INVALID(uri, "service.consul"); INVALID(uri, "a.service.consul"); INVALID(uri, "service.a.consul"); INVALID(uri, "a.com"); VALID(uri, "service.consul."); VALID(uri, "a.service.consul."); VALID(uri, "a.b.service.consul."); mongoc_uri_destroy(uri); } #define PROHIBITED(_key, _value, _type, _where) \ do { \ const char *option = _key "=" #_value; \ char *lkey = bson_strdup(_key); \ mongoc_lowercase(lkey, lkey); \ _mongoc_uri_apply_query_string(uri, mstr_cstring(option), true /* from dns */, &error); \ ASSERT_ERROR_CONTAINS( \ error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "prohibited in TXT record"); \ ASSERT(!bson_has_field(mongoc_uri_get_##_where(uri), lkey)); \ bson_free(lkey); \ } while (0) static void test_mongoc_uri_dns_options(void) { mongoc_uri_t *uri; bson_error_t error; uri = mongoc_uri_new("mongodb+srv://a.b.c"); ASSERT(uri); ASSERT(!_mongoc_uri_apply_query_string(uri, mstr_cstring("tls=false"), true /* from dsn */, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "prohibited in TXT record"); ASSERT_EQUAL_BSON(tmp_bson("{'tls': true}"), mongoc_uri_get_options(uri)); /* key we want to set, value, value type, whether it's option/credential */ PROHIBITED(MONGOC_URI_TLSALLOWINVALIDHOSTNAMES, true, bool, options); PROHIBITED(MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, true, bool, options); PROHIBITED(MONGOC_URI_GSSAPISERVICENAME, malicious, utf8, credentials); /* the two options allowed in TXT records, case-insensitive */ ASSERT(_mongoc_uri_apply_query_string(uri, mstr_cstring("authsource=db"), true, NULL)); ASSERT(_mongoc_uri_apply_query_string(uri, mstr_cstring("RepLIcaSET=rs"), true, NULL)); /* test that URI string overrides TXT record options */ mongoc_uri_destroy(uri); uri = mongoc_uri_new("mongodb+srv://user@a.b.c/?authSource=db1&replicaSet=rs1"); // test that parsing warns if replicaSet is ignored from TXT records. { capture_logs(true); ASSERT(_mongoc_uri_apply_query_string(uri, mstr_cstring("replicaSet=db2"), true, NULL)); ASSERT_CAPTURED_LOG( "parsing replicaSet from TXT", MONGOC_LOG_LEVEL_WARNING, "Ignoring URI option \"replicaSet\""); capture_logs(false); ASSERT_MATCH(mongoc_uri_get_options(uri), "{'replicaset': 'rs1'}"); } // test that parsing does not warn if authSource is ignored from TXT records. { capture_logs(true); ASSERT(_mongoc_uri_apply_query_string(uri, mstr_cstring("authSource=db2"), true, NULL)); ASSERT_NO_CAPTURED_LOGS("parsing authSource from TXT"); capture_logs(false); ASSERT_MATCH(mongoc_uri_get_credentials(uri), "{'authsource': 'db1'}"); } mongoc_uri_destroy(uri); } /* test some invalid accesses and a crash, found with a fuzzer */ static void test_mongoc_uri_utf8(void) { bson_error_t err; /* start of 3-byte character, but it's incomplete */ ASSERT(!mongoc_uri_new_with_error("mongodb://\xe8\x03", &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid UTF-8 in URI"); /* start of 6-byte CESU-8 character, but it's incomplete */ ASSERT(!mongoc_uri_new_with_error("mongodb://\xfa", &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid UTF-8 in URI"); /* "az" with NIL expressed as two-byte sequence */ ASSERT(!mongoc_uri_new_with_error("mongodb://a\xc0\x80z", &err)); ASSERT_ERROR_CONTAINS(err, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid UTF-8 in URI"); } /* test behavior on duplicate values for an options. */ static void test_mongoc_uri_duplicates(void) { mongoc_uri_t *uri = NULL; bson_error_t err; const char *str; const mongoc_write_concern_t *wc; const mongoc_read_concern_t *rc; const bson_t *bson; const mongoc_read_prefs_t *rp; bson_iter_t iter = {0}; #define RECREATE_URI(opts) \ if (1) { \ mongoc_uri_destroy(uri); \ clear_captured_logs(); \ uri = mongoc_uri_new_with_error("mongodb://user:pwd@localhost/test?" opts, &err); \ ASSERT_OR_PRINT(uri, err); \ } else \ (void)0 #define ASSERT_LOG_DUPE(opt) \ ASSERT_CAPTURED_LOG("option: " opt, MONGOC_LOG_LEVEL_WARNING, "Overwriting previously provided value for '" opt "'") /* iterate iter to key, and check that no other occurrences exist. */ #define BSON_ITER_UNIQUE(key) \ do { \ bson_iter_t tmp; \ ASSERT(bson_iter_init_find(&iter, bson, key)); \ tmp = iter; \ while (bson_iter_next(&tmp)) { \ if (strcmp(bson_iter_key(&tmp), key) == 0) { \ ASSERT_WITH_MSG(false, "bson has duplicate keys for: " key); \ } \ } \ } while (0) capture_logs(true); /* test all URI options, in the order they are defined in mongoc-uri.h. */ RECREATE_URI(MONGOC_URI_APPNAME "=a&" MONGOC_URI_APPNAME "=b"); ASSERT_LOG_DUPE(MONGOC_URI_APPNAME); str = mongoc_uri_get_appname(uri); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_AUTHMECHANISM "=SCRAM-SHA-1&" MONGOC_URI_AUTHMECHANISM "=SCRAM-SHA-256"); ASSERT_LOG_DUPE(MONGOC_URI_AUTHMECHANISM); bson = mongoc_uri_get_credentials(uri); BSON_ITER_UNIQUE(MONGOC_URI_AUTHMECHANISM); ASSERT(strcmp(bson_iter_utf8(&iter, NULL), "SCRAM-SHA-256") == 0); RECREATE_URI(MONGOC_URI_AUTHMECHANISMPROPERTIES "=a:x&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=b:y"); ASSERT_LOG_DUPE(MONGOC_URI_AUTHMECHANISMPROPERTIES); bson = mongoc_uri_get_credentials(uri); ASSERT_EQUAL_BSON(tmp_bson("{'authmechanismproperties': {'b': 'y'}}"), bson); RECREATE_URI(MONGOC_URI_AUTHMECHANISMPROPERTIES "=a:x&" MONGOC_URI_AUTHMECHANISMPROPERTIES "=b:y"); ASSERT_LOG_DUPE(MONGOC_URI_AUTHMECHANISMPROPERTIES); bson = mongoc_uri_get_credentials(uri); ASSERT_EQUAL_BSON(tmp_bson("{'authmechanismproperties': {'b': 'y' }}"), bson); RECREATE_URI(MONGOC_URI_AUTHSOURCE "=a&" MONGOC_URI_AUTHSOURCE "=b"); ASSERT_LOG_DUPE(MONGOC_URI_AUTHSOURCE); str = mongoc_uri_get_auth_source(uri); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_CANONICALIZEHOSTNAME "=false&" MONGOC_URI_CANONICALIZEHOSTNAME "=true"); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_CANONICALIZEHOSTNAME, MONGOC_LOG_LEVEL_WARNING, MONGOC_URI_CANONICALIZEHOSTNAME " is deprecated, use " MONGOC_URI_AUTHMECHANISMPROPERTIES " with CANONICALIZE_HOST_NAME instead"); ASSERT_LOG_DUPE(MONGOC_URI_CANONICALIZEHOSTNAME); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_CANONICALIZEHOSTNAME, false)); RECREATE_URI(MONGOC_URI_CONNECTTIMEOUTMS "=1&" MONGOC_URI_CONNECTTIMEOUTMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_CONNECTTIMEOUTMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 0) == 2); #if defined(MONGOC_ENABLE_COMPRESSION_SNAPPY) && defined(MONGOC_ENABLE_COMPRESSION_ZLIB) RECREATE_URI(MONGOC_URI_COMPRESSORS "=snappy&" MONGOC_URI_COMPRESSORS "=zlib"); ASSERT_LOG_DUPE(MONGOC_URI_COMPRESSORS); bson = mongoc_uri_get_compressors(uri); ASSERT_EQUAL_BSON(tmp_bson("{'zlib': 'yes'}"), bson); #endif RECREATE_URI(MONGOC_URI_GSSAPISERVICENAME "=a&" MONGOC_URI_GSSAPISERVICENAME "=b"); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_GSSAPISERVICENAME, MONGOC_LOG_LEVEL_WARNING, MONGOC_URI_GSSAPISERVICENAME " is deprecated, use " MONGOC_URI_AUTHMECHANISMPROPERTIES " with SERVICE_NAME instead"); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_GSSAPISERVICENAME, MONGOC_LOG_LEVEL_WARNING, "Overwriting previously provided value for 'gssapiservicename'"); bson = mongoc_uri_get_credentials(uri); ASSERT_EQUAL_BSON(tmp_bson("{'authmechanismproperties': {'SERVICE_NAME': 'b' }}"), bson); RECREATE_URI(MONGOC_URI_HEARTBEATFREQUENCYMS "=500&" MONGOC_URI_HEARTBEATFREQUENCYMS "=501"); ASSERT_LOG_DUPE(MONGOC_URI_HEARTBEATFREQUENCYMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, 0) == 501); RECREATE_URI(MONGOC_URI_JOURNAL "=false&" MONGOC_URI_JOURNAL "=true"); ASSERT_LOG_DUPE(MONGOC_URI_JOURNAL); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_JOURNAL, false)); RECREATE_URI(MONGOC_URI_LOCALTHRESHOLDMS "=1&" MONGOC_URI_LOCALTHRESHOLDMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_LOCALTHRESHOLDMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_LOCALTHRESHOLDMS, 0) == 2); RECREATE_URI(MONGOC_URI_MAXPOOLSIZE "=1&" MONGOC_URI_MAXPOOLSIZE "=2"); ASSERT_LOG_DUPE(MONGOC_URI_MAXPOOLSIZE); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_MAXPOOLSIZE, 0) == 2); RECREATE_URI(MONGOC_URI_READPREFERENCE "=secondary&" MONGOC_URI_MAXSTALENESSSECONDS "=1&" MONGOC_URI_MAXSTALENESSSECONDS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_MAXSTALENESSSECONDS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_MAXSTALENESSSECONDS, 0) == 2); RECREATE_URI(MONGOC_URI_READCONCERNLEVEL "=local&" MONGOC_URI_READCONCERNLEVEL "=majority"); ASSERT_LOG_DUPE(MONGOC_URI_READCONCERNLEVEL); rc = mongoc_uri_get_read_concern(uri); ASSERT(strcmp(mongoc_read_concern_get_level(rc), "majority") == 0); RECREATE_URI(MONGOC_URI_READPREFERENCE "=secondary&" MONGOC_URI_READPREFERENCE "=primary"); ASSERT_LOG_DUPE(MONGOC_URI_READPREFERENCE); rp = mongoc_uri_get_read_prefs_t(uri); ASSERT(mongoc_read_prefs_get_mode(rp) == MONGOC_READ_PRIMARY); /* exception: read preference tags get appended. */ RECREATE_URI(MONGOC_URI_READPREFERENCE "=secondary&" MONGOC_URI_READPREFERENCETAGS "=a:x&" MONGOC_URI_READPREFERENCETAGS "=b:y"); ASSERT_NO_CAPTURED_LOGS(mongoc_uri_get_string(uri)); rp = mongoc_uri_get_read_prefs_t(uri); bson = mongoc_read_prefs_get_tags(rp); ASSERT_EQUAL_BSON(tmp_bson("[{'a': 'x'}, {'b': 'y'}]"), bson); RECREATE_URI(MONGOC_URI_REPLICASET "=a&" MONGOC_URI_REPLICASET "=b"); ASSERT_LOG_DUPE(MONGOC_URI_REPLICASET); str = mongoc_uri_get_replica_set(uri); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_RETRYREADS "=false&" MONGOC_URI_RETRYREADS "=true"); ASSERT_LOG_DUPE(MONGOC_URI_RETRYREADS); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_RETRYREADS, false)); RECREATE_URI(MONGOC_URI_RETRYWRITES "=false&" MONGOC_URI_RETRYWRITES "=true"); ASSERT_LOG_DUPE(MONGOC_URI_RETRYWRITES); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_RETRYWRITES, false)); RECREATE_URI(MONGOC_URI_SAFE "=false&" MONGOC_URI_SAFE "=true"); ASSERT_LOG_DUPE(MONGOC_URI_SAFE); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SAFE, false)); RECREATE_URI(MONGOC_URI_SERVERMONITORINGMODE "=auto&" MONGOC_URI_SERVERMONITORINGMODE "=stream"); ASSERT_LOG_DUPE(MONGOC_URI_SERVERMONITORINGMODE); str = mongoc_uri_get_server_monitoring_mode(uri); ASSERT_CMPSTR(str, "stream"); RECREATE_URI(MONGOC_URI_SERVERSELECTIONTIMEOUTMS "=1&" MONGOC_URI_SERVERSELECTIONTIMEOUTMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_SERVERSELECTIONTIMEOUTMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SERVERSELECTIONTIMEOUTMS, 0) == 2); RECREATE_URI(MONGOC_URI_SERVERSELECTIONTRYONCE "=false&" MONGOC_URI_SERVERSELECTIONTRYONCE "=true"); ASSERT_LOG_DUPE(MONGOC_URI_SERVERSELECTIONTRYONCE); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false)); RECREATE_URI(MONGOC_URI_SOCKETCHECKINTERVALMS "=1&" MONGOC_URI_SOCKETCHECKINTERVALMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_SOCKETCHECKINTERVALMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETCHECKINTERVALMS, 0) == 2); RECREATE_URI(MONGOC_URI_SOCKETTIMEOUTMS "=1&" MONGOC_URI_SOCKETTIMEOUTMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_SOCKETTIMEOUTMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_SOCKETTIMEOUTMS, 0) == 2); RECREATE_URI(MONGOC_URI_TLS "=false&" MONGOC_URI_TLS "=true"); ASSERT_LOG_DUPE(MONGOC_URI_TLS); ASSERT(mongoc_uri_get_tls(uri)); RECREATE_URI(MONGOC_URI_TLSCERTIFICATEKEYFILE "=a&" MONGOC_URI_TLSCERTIFICATEKEYFILE "=b"); ASSERT_LOG_DUPE(MONGOC_URI_TLSCERTIFICATEKEYFILE); str = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, ""); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD "=a&" MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD "=b"); ASSERT_LOG_DUPE(MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD); str = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD, ""); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_TLSCAFILE "=a&" MONGOC_URI_TLSCAFILE "=b"); ASSERT_LOG_DUPE(MONGOC_URI_TLSCAFILE); str = mongoc_uri_get_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, ""); ASSERT_CMPSTR(str, "b"); RECREATE_URI(MONGOC_URI_TLSALLOWINVALIDCERTIFICATES "=false&" MONGOC_URI_TLSALLOWINVALIDCERTIFICATES "=true"); ASSERT_LOG_DUPE(MONGOC_URI_TLSALLOWINVALIDCERTIFICATES); ASSERT(mongoc_uri_get_option_as_bool(uri, MONGOC_URI_TLSALLOWINVALIDCERTIFICATES, false)); RECREATE_URI(MONGOC_URI_W "=1&" MONGOC_URI_W "=0"); ASSERT_LOG_DUPE(MONGOC_URI_W); wc = mongoc_uri_get_write_concern(uri); ASSERT(mongoc_write_concern_get_w(wc) == 0); /* exception: a string write concern takes precedence over an int */ RECREATE_URI(MONGOC_URI_W "=majority&" MONGOC_URI_W "=0"); ASSERT_NO_CAPTURED_LOGS(mongoc_uri_get_string(uri)); wc = mongoc_uri_get_write_concern(uri); ASSERT(mongoc_write_concern_get_w(wc) == MONGOC_WRITE_CONCERN_W_MAJORITY); RECREATE_URI(MONGOC_URI_WAITQUEUETIMEOUTMS "=1&" MONGOC_URI_WAITQUEUETIMEOUTMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_WAITQUEUETIMEOUTMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WAITQUEUETIMEOUTMS, 0) == 2); RECREATE_URI(MONGOC_URI_WTIMEOUTMS "=1&" MONGOC_URI_WTIMEOUTMS "=2"); ASSERT_LOG_DUPE(MONGOC_URI_WTIMEOUTMS); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 0) == 2); ASSERT(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 0) == 2); RECREATE_URI(MONGOC_URI_ZLIBCOMPRESSIONLEVEL "=1&" MONGOC_URI_ZLIBCOMPRESSIONLEVEL "=2"); ASSERT_LOG_DUPE(MONGOC_URI_ZLIBCOMPRESSIONLEVEL); ASSERT(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 0) == 2); mongoc_uri_destroy(uri); } /* Tests behavior of int32 and int64 options */ static void test_mongoc_uri_int_options(void) { mongoc_uri_t *uri; capture_logs(true); uri = mongoc_uri_new("mongodb://localhost/"); /* Set an int64 option as int64 succeeds */ ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 10)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, 10); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, 10); /* Set an int64 option as int32 succeeds */ ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 15)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, 15); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, 15); /* Setting an int32 option through _as_int64 succeeds for 32-bit values but * emits a warning */ ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 9)); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_ZLIBCOMPRESSIONLEVEL, MONGOC_LOG_LEVEL_WARNING, "Setting value for 32-bit option " "\"zlibcompressionlevel\" through 64-bit method"); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 0), ==, 9); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 0), ==, 9); clear_captured_logs(); ASSERT(!mongoc_uri_set_option_as_int64(uri, MONGOC_URI_CONNECTTIMEOUTMS, 2147483648LL)); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_CONNECTTIMEOUTMS, MONGOC_LOG_LEVEL_WARNING, "Unsupported value for \"connecttimeoutms\": 2147483648," " \"connecttimeoutms\" is not an int64 option"); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_CONNECTTIMEOUTMS, 0), ==, 0); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_CONNECTTIMEOUTMS, 0), ==, 0); clear_captured_logs(); /* Setting an int32 option as int32 succeeds */ ASSERT(mongoc_uri_set_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 9)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 0), ==, 9); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_ZLIBCOMPRESSIONLEVEL, 0), ==, 9); /* Truncating a 64-bit value when fetching as 32-bit emits a warning */ ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 2147483648LL)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 5), ==, 5); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_WTIMEOUTMS " with 64-bit value", MONGOC_LOG_LEVEL_WARNING, "Cannot read 64-bit value for \"wtimeoutms\": 2147483648"); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 5), ==, 2147483648LL); clear_captured_logs(); ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, -2147483649LL)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 5), ==, 5); ASSERT_CAPTURED_LOG("option: " MONGOC_URI_WTIMEOUTMS " with 64-bit value", MONGOC_LOG_LEVEL_WARNING, "Cannot read 64-bit value for \"wtimeoutms\": -2147483649"); ASSERT_CMPINT64(mongoc_uri_get_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, 5), ==, -2147483649LL); clear_captured_logs(); /* Setting a INT_MAX and INT_MIN values doesn't cause truncation errors */ ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, INT32_MAX)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, INT32_MAX); ASSERT_NO_CAPTURED_LOGS("INT_MAX"); ASSERT(mongoc_uri_set_option_as_int64(uri, MONGOC_URI_WTIMEOUTMS, INT32_MIN)); ASSERT_CMPINT32(mongoc_uri_get_option_as_int32(uri, MONGOC_URI_WTIMEOUTMS, 0), ==, INT32_MIN); ASSERT_NO_CAPTURED_LOGS("INT_MIN"); mongoc_uri_destroy(uri); } static void test_one_tls_option_enables_tls(void) { const char *opts[] = {MONGOC_URI_TLS "=true", MONGOC_URI_TLSCERTIFICATEKEYFILE "=file.pem", MONGOC_URI_TLSCERTIFICATEKEYFILEPASSWORD "=file.pem", MONGOC_URI_TLSCAFILE "=file.pem", MONGOC_URI_TLSALLOWINVALIDCERTIFICATES "=true", MONGOC_URI_TLSALLOWINVALIDHOSTNAMES "=true", MONGOC_URI_TLSINSECURE "=true", MONGOC_URI_SSL "=true", MONGOC_URI_SSLCLIENTCERTIFICATEKEYFILE "=file.pem", MONGOC_URI_SSLCLIENTCERTIFICATEKEYPASSWORD "=file.pem", MONGOC_URI_SSLCERTIFICATEAUTHORITYFILE "=file.pem", MONGOC_URI_SSLALLOWINVALIDCERTIFICATES "=true", MONGOC_URI_SSLALLOWINVALIDHOSTNAMES "=true", MONGOC_URI_TLSDISABLEOCSPENDPOINTCHECK "=true", MONGOC_URI_TLSDISABLECERTIFICATEREVOCATIONCHECK "=true"}; mlib_foreach_arr (const char *, opt, opts) { mongoc_uri_t *uri; bson_error_t error; char *uri_string; uri_string = bson_strdup_printf("mongodb://localhost:27017/?%s", *opt); uri = mongoc_uri_new_with_error(uri_string, &error); bson_free(uri_string); ASSERT_OR_PRINT(uri, error); if (!mongoc_uri_get_tls(uri)) { test_error("unexpected tls not enabled when following option set: %s\n", *opt); } mongoc_uri_destroy(uri); } } static void test_casing_options(void) { mongoc_uri_t *uri; bson_error_t error; uri = mongoc_uri_new("mongodb://localhost:27017/"); mongoc_uri_set_option_as_bool(uri, "TLS", true); _mongoc_uri_apply_query_string(uri, mstr_cstring("ssl=false"), false, &error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "conflicts"); mongoc_uri_destroy(uri); } static void test_parses_long_ipv6(void) { // Test parsing long malformed IPv6 literals. This is a regression test for // CDRIVER-4816. bson_error_t error; // Test the largest permitted IPv6 literal. { // Construct a string of repeating `:`. mcommon_string_append_t host; mcommon_string_new_as_append(&host); for (int i = 0; i < BSON_HOST_NAME_MAX - 2; i++) { // Max IPv6 literal is two less due to including `[` and `]`. mcommon_string_append(&host, ":"); } const char *host_str = mcommon_str_from_append(&host); char *host_and_port = bson_strdup_printf("[%s]:27017", host_str); char *uri_string = bson_strdup_printf("mongodb://%s", host_and_port); mongoc_uri_t *uri = mongoc_uri_new_with_error(uri_string, &error); ASSERT_OR_PRINT(uri, error); const mongoc_host_list_t *hosts = mongoc_uri_get_hosts(uri); ASSERT_CMPSTR(hosts->host, host_str); ASSERT_CMPSTR(hosts->host_and_port, host_and_port); ASSERT_CMPUINT16(hosts->port, ==, 27017); ASSERT(!hosts->next); mongoc_uri_destroy(uri); bson_free(uri_string); bson_free(host_and_port); mcommon_string_from_append_destroy(&host); } // Test one character more than the largest IPv6 literal. { // Construct a string of repeating `:`. mcommon_string_append_t host; mcommon_string_new_as_append(&host); for (int i = 0; i < BSON_HOST_NAME_MAX - 2 + 1; i++) { mcommon_string_append(&host, ":"); } const char *host_str = mcommon_str_from_append(&host); char *host_and_port = bson_strdup_printf("[%s]:27017", host_str); char *uri_string = bson_strdup_printf("mongodb://%s", host_and_port); capture_logs(true); mongoc_uri_t *uri = mongoc_uri_new_with_error(uri_string, &error); ASSERT_NO_CAPTURED_LOGS("Invalid IPv6 address"); capture_logs(false); ASSERT(!uri); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid host specifier \"["); mongoc_uri_destroy(uri); bson_free(uri_string); bson_free(host_and_port); mcommon_string_from_append_destroy(&host); } } static void test_uri_depr(void) { // Test behavior of deprecated URI options. // Regression test for CDRIVER-3769 Deprecate unimplemented URI options // Test an unsupported option warns. { capture_logs(true); mongoc_uri_t *uri = mongoc_uri_new("mongodb://host/?foo=bar"); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Unsupported"); capture_logs(false); mongoc_uri_destroy(uri); } // Test that waitQueueMultiple warns. { capture_logs(true); mongoc_uri_t *uri = mongoc_uri_new("mongodb://host/?waitQueueMultiple=123"); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Unsupported"); capture_logs(false); mongoc_uri_destroy(uri); } // Test that maxIdleTimeMS warns. { capture_logs(true); mongoc_uri_t *uri = mongoc_uri_new("mongodb://host/?maxIdleTimeMS=123"); ASSERT_CAPTURED_LOG("uri", MONGOC_LOG_LEVEL_WARNING, "Unsupported"); capture_logs(false); mongoc_uri_destroy(uri); } } // Additional slashes and commas for embedded URIs given to connection options. // e.g. authMechanismProperties=TOKEN_RESOURCE=mongodb://foo,ENVIRONMENT=azure // ^^ ^ static void test_uri_uri_in_options(void) { #define TEST_QUERY MONGOC_URI_AUTHMECHANISMPROPERTIES "=TOKEN_RESOURCE:mongodb://token-resource,ENVIRONMENT:azure" #define TEST_PROPS "{'TOKEN_RESOURCE': 'mongodb://token-resource', 'ENVIRONMENT': 'azure'}" capture_logs(true); bson_error_t error; // Simple. { mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost?" TEST_QUERY, &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, TEST_PROPS); mongoc_uri_destroy(uri); } // With auth database. { mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://localhost/db?" TEST_QUERY, &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, TEST_PROPS); mongoc_uri_destroy(uri); } // With userinfo. { mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@localhost/db?" TEST_QUERY, &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, TEST_PROPS); mongoc_uri_destroy(uri); } // With alternate hosts. { mongoc_uri_t *const uri = mongoc_uri_new_with_error("mongodb://user:pass@host1:27017,host2:27018/db?" TEST_QUERY, &error); ASSERT_NO_CAPTURED_LOGS("mongoc_uri_new_with_error"); ASSERT_OR_PRINT(uri, error); bson_t props; ASSERT(mongoc_uri_get_mechanism_properties(uri, &props)); ASSERT_MATCH(&props, TEST_PROPS); mongoc_uri_destroy(uri); } capture_logs(false); #undef TEST_QUERY } // test_uri_bad_oidc is a regression test for CDRIVER-6137 static void test_uri_bad_oidc(void) { bson_error_t error; mongoc_uri_t *uri = mongoc_uri_new_with_error( "mongodb://localhost/?authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:test,TOKEN_RESOURCE:foo", &error); ASSERT(!uri); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "'MONGODB-OIDC' authentication with test environment does not accept a TOKEN_RESOURCE"); } void test_uri_install(TestSuite *suite) { TestSuite_Add(suite, "/Uri/new", test_mongoc_uri_new); TestSuite_Add(suite, "/Uri/new_with_error", test_mongoc_uri_new_with_error); TestSuite_Add(suite, "/Uri/new_for_host_port", test_mongoc_uri_new_for_host_port); TestSuite_Add(suite, "/Uri/compressors", test_mongoc_uri_compressors); TestSuite_Add(suite, "/Uri/unescape", test_mongoc_uri_unescape); TestSuite_Add(suite, "/Uri/read_prefs", test_mongoc_uri_read_prefs); TestSuite_Add(suite, "/Uri/read_concern", test_mongoc_uri_read_concern); TestSuite_Add(suite, "/Uri/write_concern", test_mongoc_uri_write_concern); TestSuite_Add(suite, "/HostList/from_string", test_mongoc_host_list_from_string); TestSuite_Add(suite, "/Uri/auth_mechanisms", test_mongoc_uri_auth_mechanisms); TestSuite_Add(suite, "/Uri/functions", test_mongoc_uri_functions); TestSuite_Add(suite, "/Uri/ssl", test_mongoc_uri_ssl); TestSuite_Add(suite, "/Uri/tls", test_mongoc_uri_tls); TestSuite_Add(suite, "/Uri/compound_setters", test_mongoc_uri_compound_setters); TestSuite_Add(suite, "/Uri/long_hostname", test_mongoc_uri_long_hostname); TestSuite_Add(suite, "/Uri/local_threshold_ms", test_mongoc_uri_local_threshold_ms); TestSuite_Add(suite, "/Uri/srv", test_mongoc_uri_srv); TestSuite_Add(suite, "/Uri/dns_options", test_mongoc_uri_dns_options); TestSuite_Add(suite, "/Uri/utf8", test_mongoc_uri_utf8); TestSuite_Add(suite, "/Uri/duplicates", test_mongoc_uri_duplicates); TestSuite_Add(suite, "/Uri/int_options", test_mongoc_uri_int_options); TestSuite_Add(suite, "/Uri/one_tls_option_enables_tls", test_one_tls_option_enables_tls); TestSuite_Add(suite, "/Uri/options_casing", test_casing_options); TestSuite_Add(suite, "/Uri/parses_long_ipv6", test_parses_long_ipv6); TestSuite_Add(suite, "/Uri/depr", test_uri_depr); TestSuite_Add(suite, "/Uri/uri_in_options", test_uri_uri_in_options); TestSuite_Add(suite, "/Uri/bad_oidc", test_uri_bad_oidc); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-usleep.c000066400000000000000000000055341511661753600241660ustar00rootroot00000000000000#include #include #include #include #include #include #include // tmp_bson #include static void custom_usleep_impl(int64_t usec, void *user_data) { if (user_data) { *(int64_t *)user_data = usec; } } // `test_mongoc_usleep_custom` tests a custom sleep function set in // `mongoc_client_set_usleep_impl` is applied when topology scanning sleeps. static void test_mongoc_usleep_custom(void) { mock_server_t *server = mock_server_new(); mock_server_run(server); mongoc_uri_t *uri = mongoc_uri_copy(mock_server_get_uri(server)); // Tell single-threaded clients to reconnect if an error occcurs. mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, false); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ASSERT(client); // Bypass the five second cooldown to speed up test. _mongoc_topology_bypass_cooldown(client->topology); // Override `min_heartbeat_frequency_msec` to speed up test. client->topology->min_heartbeat_frequency_msec = 50; // Override the sleep. int64_t last_sleep_dur = 0; mongoc_client_set_usleep_impl(client, custom_usleep_impl, &last_sleep_dur); bson_error_t error; future_t *future = future_client_command_simple(client, "db", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL, &error); // Client sends initial `isMaster`. { request_t *req = mock_server_receives_any_hello(server); ASSERT(req); // Fail the request. reply_to_request_with_hang_up(req); request_destroy(req); } // Client sleeps for `min_heartbeat_frequency_msec`, then sends another // `isMaster`. { request_t *req = mock_server_receives_any_hello(server); ASSERT(req); reply_to_request_simple(req, tmp_str("{ 'minWireVersion': %d, 'maxWireVersion' : %d, " "'isWritablePrimary': true}", WIRE_VERSION_MIN, WIRE_VERSION_MAX)); request_destroy(req); } // Expect custom sleep to have been called between making `isMaster` calls. ASSERT_CMPINT64(last_sleep_dur, >, 0); // Client sends "ping". { request_t *req = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'ping': 1}")); ASSERT(req); reply_to_request_with_ok_and_destroy(req); } bool ok = future_wait(future); ASSERT_OR_PRINT(ok, error); future_destroy(future); mongoc_client_destroy(client); mongoc_uri_destroy(uri); mock_server_destroy(server); } void test_usleep_install(TestSuite *suite) { TestSuite_AddMockServerTest(suite, "/Sleep/custom", test_mongoc_usleep_custom); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-util.c000066400000000000000000000111201511661753600236320ustar00rootroot00000000000000#include #include #include #include #include static void test_command_name(void) { bson_t *commands[] = { tmp_bson("{'foo': 1}"), tmp_bson("{'query': {'foo': 1}}"), tmp_bson("{'query': {'foo': 1}, '$readPreference': 1}"), tmp_bson("{'$query': {'foo': 1}}"), tmp_bson("{'$query': {'foo': 1}, '$readPreference': 1}"), tmp_bson("{'$readPreference': 1, '$query': {'foo': 1}}"), }; size_t i; for (i = 0; i < sizeof(commands) / sizeof(bson_t *); i++) { ASSERT_CMPSTR("foo", _mongoc_get_command_name(commands[i])); } } static void test_rand_simple(void) { int i; unsigned int seed = 0; int value, first_value; first_value = _mongoc_rand_simple(&seed); for (i = 0; i < 1000; i++) { value = _mongoc_rand_simple(&seed); if (value != first_value) { /* success */ break; } } } static void test_lowercase_utf8(void) { char *snowman = "\xE2\x9b\x84"; char *letters = "aBcDe"; char *buf = bson_malloc0(strlen(snowman) + 1); mongoc_lowercase(snowman, buf); ASSERT_CMPSTR(snowman, buf); bson_free(buf); buf = bson_malloc0(strlen(letters) + 1); mongoc_lowercase(letters, buf); ASSERT_CMPSTR("abcde", buf); bson_free(buf); } static void test_wire_server_versions(void) { mlib_diagnostic_push(); mlib_disable_constant_conditional_expression_warnings(); /* Ensure valid inclusive range. */ ASSERT_WITH_MSG(WIRE_VERSION_MIN <= WIRE_VERSION_MAX, "WIRE_VERSION_MAX (%d) must be greater than or equal to " "WIRE_VERSION_MIN (%d)", WIRE_VERSION_MAX, WIRE_VERSION_MIN); mlib_diagnostic_pop(); /* Bumping WIRE_VERSION_MAX must be accompanied by an update to * `_mongoc_wire_version_to_server_version`. */ ASSERT_WITH_MSG(strcmp(_mongoc_wire_version_to_server_version(WIRE_VERSION_MAX), "Unknown"), "WIRE_VERSION_MAX must have a corresponding server version defined in " "_mongoc_wire_version_to_server_version"); /* Unlikely given the minimum version should always be a value older than the * maximum version, but nevertheless important to assert so warning/error * messages remain valid. */ ASSERT_WITH_MSG(strcmp(_mongoc_wire_version_to_server_version(WIRE_VERSION_MIN), "Unknown"), "WIRE_VERSION_MIN must have a corresponding server version defined in " "_mongoc_wire_version_to_server_version"); } static void test_bin_to_hex(void) { const char *bin = "foobar"; const char *expect = "666F6F626172"; char *got = bin_to_hex((const uint8_t *)bin, strlen(bin)); ASSERT_CMPSTR(got, expect); bson_free(got); } static void test_hex_to_bin(void) { const char *expect = "foobar"; size_t len; // Test lowercase: { const char *hexstr = "666f6f62617200"; uint8_t *got = hex_to_bin(hexstr, &len); ASSERT_CMPSTR((const char *)got, expect); ASSERT_CMPSIZE_T(len, ==, 7); bson_free(got); } // Test uppercase: { const char *hexstr = "666F6F62617200"; uint8_t *got = hex_to_bin(hexstr, &len); ASSERT_CMPSTR((const char *)got, expect); ASSERT_CMPSIZE_T(len, ==, 7); bson_free(got); } ASSERT_WITH_MSG(!hex_to_bin(" 66", &len), "whitespace is an error"); ASSERT_WITH_MSG(!hex_to_bin("666", &len), "non-even number of digits is an error"); ASSERT_WITH_MSG(!hex_to_bin("ZZ", &len), "non-hex digits is an error"); } static void test_percent_encode(void) { // Simple case: { char *got = mongoc_percent_encode("hello world!"); ASSERT(got); ASSERT_CMPSTR(got, "hello%20world%21"); bson_free(got); } // Empty string: { char *got = mongoc_percent_encode(""); ASSERT(got); ASSERT_CMPSTR(got, ""); bson_free(got); } // All reserved characters: { char *got = mongoc_percent_encode("!#$"); ASSERT(got); ASSERT_CMPSTR(got, "%21%23%24"); bson_free(got); } } void test_util_install(TestSuite *suite) { TestSuite_Add(suite, "/Util/command_name", test_command_name); TestSuite_Add(suite, "/Util/rand_simple", test_rand_simple); TestSuite_Add(suite, "/Util/lowercase_utf8", test_lowercase_utf8); TestSuite_Add(suite, "/Util/wire_server_versions", test_wire_server_versions); TestSuite_Add(suite, "/Util/bin_to_hex", test_bin_to_hex); TestSuite_Add(suite, "/Util/hex_to_bin", test_hex_to_bin); TestSuite_Add(suite, "/Util/percent_encode", test_percent_encode); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-version.c000066400000000000000000000012501511661753600243450ustar00rootroot00000000000000#include #include static void test_mongoc_version(void) { ASSERT_CMPINT(mongoc_get_major_version(), ==, MONGOC_MAJOR_VERSION); ASSERT_CMPINT(mongoc_get_minor_version(), ==, MONGOC_MINOR_VERSION); ASSERT_CMPINT(mongoc_get_micro_version(), ==, MONGOC_MICRO_VERSION); ASSERT_CMPSTR(mongoc_get_version(), MONGOC_VERSION_S); ASSERT(mongoc_check_version(MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION, MONGOC_MICRO_VERSION)); ASSERT(!mongoc_check_version(MONGOC_MAJOR_VERSION, MONGOC_MINOR_VERSION + 1, MONGOC_MICRO_VERSION)); } void test_version_install(TestSuite *suite) { TestSuite_Add(suite, "/Version", test_mongoc_version); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-versioned-api.c000066400000000000000000000163171511661753600254370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include static void _test_mongoc_server_api_copy(void) { mongoc_server_api_t *api; mongoc_server_api_t *copy; BSON_ASSERT(!mongoc_server_api_copy(NULL)); api = mongoc_server_api_new(MONGOC_SERVER_API_V1); mongoc_server_api_strict(api, false); copy = mongoc_server_api_copy(api); BSON_ASSERT(api->version == copy->version); BSON_ASSERT(!copy->strict.value); BSON_ASSERT(copy->strict.is_set); BSON_ASSERT(!copy->deprecation_errors.value); BSON_ASSERT(!copy->deprecation_errors.is_set); mongoc_server_api_destroy(api); mongoc_server_api_destroy(copy); } static void _test_mongoc_server_api_setters(void) { mongoc_server_api_t *api = mongoc_server_api_new(MONGOC_SERVER_API_V1); BSON_ASSERT(api->version == MONGOC_SERVER_API_V1); BSON_ASSERT(!api->strict.is_set); BSON_ASSERT(!api->deprecation_errors.is_set); BSON_ASSERT(!api->strict.value); BSON_ASSERT(!api->deprecation_errors.value); mongoc_server_api_strict(api, true); BSON_ASSERT(api->strict.is_set); BSON_ASSERT(api->strict.value); mongoc_server_api_deprecation_errors(api, false); BSON_ASSERT(api->deprecation_errors.is_set); BSON_ASSERT(!api->deprecation_errors.value); mongoc_server_api_destroy(api); } static void _test_mongoc_server_api_client(void) { mongoc_client_t *client; mongoc_server_api_t *api; bson_error_t error; /* We use mongoc_client_new() both to avoid having a server API set * and also to avoid connecting to a server: */ client = mongoc_client_new("mongodb://localhost"); BSON_ASSERT(!client->api); api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_set_server_api(client, api, &error), error); BSON_ASSERT(client->api); BSON_ASSERT(client->api->version == MONGOC_SERVER_API_V1); /* Cannot change server API once it is set */ ASSERT(!mongoc_client_set_server_api(client, api, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_API_ALREADY_SET, "Cannot set server api more than once"); /* client gets its own internal copy */ mongoc_server_api_destroy(api); BSON_ASSERT(client->api->version == MONGOC_SERVER_API_V1); mongoc_client_destroy(client); } static void _test_mongoc_server_api_client_pool(void) { mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_server_api_t *api; bson_error_t error; uri = mongoc_uri_new("mongodb://localhost"); pool = mongoc_client_pool_new(uri); api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_pool_set_server_api(pool, api, &error), error); /* Cannot change server API once it is set */ ASSERT(!mongoc_client_pool_set_server_api(pool, api, &error)); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_POOL, MONGOC_ERROR_POOL_API_ALREADY_SET, "Cannot set server api more than once"); /* Clients popped from pool have matching API */ client = mongoc_client_pool_pop(pool); BSON_ASSERT(client->api); BSON_ASSERT(client->api->version == MONGOC_SERVER_API_V1); ASSERT(!mongoc_client_set_server_api(client, api, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_API_FROM_POOL, "Cannot set server api on a client checked out from a pool"); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_server_api_destroy(api); mongoc_uri_destroy(uri); } static void _test_mongoc_server_api_client_pool_once(void) { mongoc_uri_t *uri; mongoc_client_pool_t *pool; mongoc_client_t *client; mongoc_server_api_t *api; bson_error_t error; uri = mongoc_uri_new("mongodb://localhost"); pool = mongoc_client_pool_new(uri); api = mongoc_server_api_new(MONGOC_SERVER_API_V1); client = mongoc_client_pool_pop(pool); BSON_ASSERT(!client->api); /* Cannot change server API once a client has been popped. */ ASSERT(!mongoc_client_pool_set_server_api(pool, api, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_POOL, MONGOC_ERROR_POOL_API_TOO_LATE, "Cannot set server api after a client has been created"); ASSERT(!mongoc_client_set_server_api(client, api, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_API_FROM_POOL, "Cannot set server api on a client checked out from a pool"); mongoc_client_pool_push(pool, client); mongoc_client_pool_destroy(pool); mongoc_server_api_destroy(api); mongoc_uri_destroy(uri); } static void _test_mongoc_client_uses_server_api(void) { mongoc_client_t *client0; /* versioned */ mongoc_client_t *client1; /* not versioned */ mongoc_server_api_t *api; bson_error_t error; /* We go through mongoc_client_new() rather than * test_mongoc_client_uses_no_server_api() because we want no API to be set * (directly, or through the environment) and /also/ no * attempt to connect to a server: */ client0 = mongoc_client_new("mongodb://localhost"); client1 = mongoc_client_new("mongodb://localhost"); /* Ensure that neither client has an API set: */ ASSERT(!mongoc_client_uses_server_api(client0)); ASSERT(!mongoc_client_uses_server_api(client1)); /* Set the API on one and only one client: */ api = mongoc_server_api_new(MONGOC_SERVER_API_V1); ASSERT_OR_PRINT(mongoc_client_set_server_api(client0, api, &error), error); /* Check to see that we can distinguish whether or not the API was set via our function under test: */ ASSERT(mongoc_client_uses_server_api(client0)); ASSERT(!mongoc_client_uses_server_api(client1)); /* Tidy up: */ mongoc_server_api_destroy(api); mongoc_client_destroy(client0); mongoc_client_destroy(client1); } void test_client_versioned_api_install(TestSuite *suite) { run_unified_tests(suite, JSON_DIR, "versioned_api"); TestSuite_Add(suite, "/VersionedApi/client", _test_mongoc_server_api_client); TestSuite_Add(suite, "/VersionedApi/client_pool", _test_mongoc_server_api_client_pool); TestSuite_Add(suite, "/VersionedApi/client_pool_once", _test_mongoc_server_api_client_pool_once); TestSuite_Add(suite, "/VersionedApi/copy", _test_mongoc_server_api_copy); TestSuite_Add(suite, "/VersionedApi/setters", _test_mongoc_server_api_setters); TestSuite_Add(suite, "/VersionedApi/private/client_uses_server_api", _test_mongoc_client_uses_server_api); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-with-transaction.c000066400000000000000000000055451511661753600261710ustar00rootroot00000000000000#include #include #include #include #include #include /* Note, the with_transaction spec tests are in test-mongoc-transactions.c, * since it shares the same test runner with the transactions test runner. */ static bool with_transaction_fail_transient_txn(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { bson_array_builder_t *labels; BSON_UNUSED(ctx); BSON_UNUSED(error); mlib_sleep_for(session->with_txn_timeout_ms, ms); *reply = bson_new(); BSON_APPEND_ARRAY_BUILDER_BEGIN(*reply, "errorLabels", &labels); bson_array_builder_append_utf8(labels, TRANSIENT_TXN_ERR, -1); bson_append_array_builder_end(*reply, labels); return false; } static bool with_transaction_do_nothing(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { BSON_UNUSED(session); BSON_UNUSED(ctx); BSON_UNUSED(reply); BSON_UNUSED(error); return true; } static void test_with_transaction_timeout(void *ctx) { mongoc_client_t *client; mongoc_client_session_t *session; bson_error_t error; bool res; BSON_UNUSED(ctx); client = test_framework_new_default_client(); session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); session->with_txn_timeout_ms = 10; /* Test Case 1: Test that if the callback returns an error with the TransientTransactionError label and we have exceeded the timeout, withTransaction fails. */ res = mongoc_client_session_with_transaction(session, with_transaction_fail_transient_txn, NULL, NULL, NULL, &error); ASSERT(!res); /* Test Case 2: If committing returns an error with the UnknownTransactionCommitResult label and we have exceeded the timeout, withTransaction fails. */ session->fail_commit_label = UNKNOWN_COMMIT_RESULT; res = mongoc_client_session_with_transaction(session, with_transaction_do_nothing, NULL, NULL, NULL, &error); ASSERT(!res); /* Test Case 3: If committing returns an error with the TransientTransactionError label and we have exceeded the timeout, withTransaction fails. */ session->fail_commit_label = TRANSIENT_TXN_ERR; res = mongoc_client_session_with_transaction(session, with_transaction_do_nothing, NULL, NULL, NULL, &error); ASSERT(!res); mongoc_client_session_destroy(session); mongoc_client_destroy(client); } void test_with_transaction_install(TestSuite *suite) { TestSuite_AddFull(suite, "/with_transaction/timeout_tests [lock:live-server]", test_with_transaction_timeout, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_crypto); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-write-commands.c000066400000000000000000000373541511661753600256270ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include static void test_split_insert(void) { mongoc_bulk_write_flags_t write_flags = MONGOC_BULK_WRITE_FLAGS_INIT; mongoc_write_command_t command; mongoc_write_result_t result; mongoc_collection_t *collection; mongoc_client_t *client; bson_oid_t oid; bson_t **docs; bson_t reply = BSON_INITIALIZER; bson_error_t error; mongoc_server_stream_t *server_stream; int i; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_split_insert"); BSON_ASSERT(collection); docs = (bson_t **)bson_malloc(sizeof(bson_t *) * 3000); for (i = 0; i < 3000; i++) { docs[i] = bson_new(); bson_oid_init(&oid, NULL); BSON_APPEND_OID(docs[i], "_id", &oid); } _mongoc_write_result_init(&result); _mongoc_write_command_init_insert(&command, docs[0], NULL, write_flags, ++client->cluster.operation_id); for (i = 1; i < 3000; i++) { _mongoc_write_command_insert_append(&command, docs[i]); } const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(&command), .has_operation_id = true, .operation_id = command.operation_id}; server_stream = mongoc_cluster_stream_for_writes(&client->cluster, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); _mongoc_write_command_execute( &command, client, server_stream, collection->db, collection->collection, NULL, 0, NULL, &result); r = MONGOC_WRITE_RESULT_COMPLETE(&result, 2, collection->write_concern, (mongoc_error_domain_t)0, &reply, &error); ASSERT_OR_PRINT(r, error); BSON_ASSERT(result.nInserted == 3000); _mongoc_write_command_destroy(&command); _mongoc_write_result_destroy(&result); ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); for (i = 0; i < 3000; i++) { bson_destroy(docs[i]); } bson_destroy(&reply); bson_free(docs); mongoc_server_stream_cleanup(server_stream); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_invalid_write_concern(void) { mongoc_bulk_write_flags_t write_flags = MONGOC_BULK_WRITE_FLAGS_INIT; mongoc_write_command_t command; mongoc_write_result_t result; mongoc_collection_t *collection; mongoc_client_t *client; mongoc_write_concern_t *write_concern; mongoc_server_stream_t *server_stream; bson_t *doc; bson_t reply = BSON_INITIALIZER; bson_error_t error; bool r; client = test_framework_new_default_client(); BSON_ASSERT(client); collection = get_test_collection(client, "test_invalid_write_concern"); BSON_ASSERT(collection); write_concern = mongoc_write_concern_new(); BSON_ASSERT(write_concern); mongoc_write_concern_set_w(write_concern, 0); mongoc_write_concern_set_journal(write_concern, true); BSON_ASSERT(!mongoc_write_concern_is_valid(write_concern)); doc = BCON_NEW("_id", BCON_INT32(0)); _mongoc_write_command_init_insert(&command, doc, NULL, write_flags, ++client->cluster.operation_id); _mongoc_write_result_init(&result); const mongoc_ss_log_context_t ss_log_context = {.operation = _mongoc_write_command_get_name(&command), .has_operation_id = true, .operation_id = command.operation_id}; server_stream = mongoc_cluster_stream_for_writes(&client->cluster, &ss_log_context, NULL, NULL, NULL, &error); ASSERT_OR_PRINT(server_stream, error); _mongoc_write_command_execute( &command, client, server_stream, collection->db, collection->collection, write_concern, 0, NULL, &result); r = MONGOC_WRITE_RESULT_COMPLETE(&result, 2, collection->write_concern, (mongoc_error_domain_t)0, &reply, &error); BSON_ASSERT(!r); ASSERT_CMPINT(error.domain, ==, MONGOC_ERROR_COMMAND); ASSERT_CMPINT(error.code, ==, MONGOC_ERROR_COMMAND_INVALID_ARG); _mongoc_write_command_destroy(&command); _mongoc_write_result_destroy(&result); bson_destroy(doc); bson_destroy(&reply); mongoc_server_stream_cleanup(server_stream); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mongoc_write_concern_destroy(write_concern); } static void test_bypass_validation(void *context) { mongoc_collection_t *collection2; mongoc_collection_t *collection; bson_t reply; mongoc_bulk_operation_t *bulk; mongoc_database_t *database; mongoc_write_concern_t *wr; mongoc_client_t *client; bson_error_t error; bson_t *options; char *collname; char *dbname; int r; int i; BSON_UNUSED(context); client = test_framework_new_default_client(); BSON_ASSERT(client); dbname = gen_collection_name("dbtest"); collname = gen_collection_name("bypass"); database = mongoc_client_get_database(client, dbname); collection = mongoc_database_get_collection(database, collname); BSON_ASSERT(collection); options = tmp_bson("{'validator': {'number': {'$gte': 5}}, 'validationAction': 'error'}"); collection2 = mongoc_database_create_collection(database, collname, options, &error); ASSERT_OR_PRINT(collection2, error); mongoc_collection_destroy(collection2); /* {{{ Default fails validation */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); for (i = 0; i < 3; i++) { bson_t *doc = tmp_bson("{'number': 3, 'high': %d }", i); mongoc_bulk_operation_insert(bulk, doc); } r = mongoc_bulk_operation_execute(bulk, &reply, &error); bson_destroy(&reply); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, 121, "Document failed validation"); mongoc_bulk_operation_destroy(bulk); /* }}} */ /* {{{ bypass_document_validation=false Fails validation */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_set_bypass_document_validation(bulk, false); for (i = 0; i < 3; i++) { bson_t *doc = tmp_bson("{'number': 3, 'high': %d }", i); mongoc_bulk_operation_insert(bulk, doc); } r = mongoc_bulk_operation_execute(bulk, &reply, &error); bson_destroy(&reply); ASSERT(!r); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, 121, "Document failed validation"); mongoc_bulk_operation_destroy(bulk); /* }}} */ /* {{{ bypass_document_validation=true ignores validation */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); mongoc_bulk_operation_set_bypass_document_validation(bulk, true); for (i = 0; i < 3; i++) { bson_t *doc = tmp_bson("{'number': 3, 'high': %d }", i); mongoc_bulk_operation_insert(bulk, doc); } r = mongoc_bulk_operation_execute(bulk, &reply, &error); bson_destroy(&reply); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_destroy(bulk); /* }}} */ /* {{{ w=0 and bypass_document_validation=set fails */ bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); wr = mongoc_write_concern_new(); mongoc_write_concern_set_w(wr, 0); mongoc_bulk_operation_set_write_concern(bulk, wr); mongoc_bulk_operation_set_bypass_document_validation(bulk, true); for (i = 0; i < 3; i++) { bson_t *doc = tmp_bson("{'number': 3, 'high': %d }", i); mongoc_bulk_operation_insert(bulk, doc); } r = mongoc_bulk_operation_execute(bulk, &reply, &error); bson_destroy(&reply); ASSERT_OR_PRINT(!r, error); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Cannot set bypassDocumentValidation for unacknowledged writes"); mongoc_bulk_operation_destroy(bulk); mongoc_write_concern_destroy(wr); /* }}} */ ASSERT_OR_PRINT(mongoc_collection_drop(collection, &error), error); bson_free(dbname); bson_free(collname); mongoc_database_destroy(database); mongoc_collection_destroy(collection); mongoc_client_destroy(client); } static void test_bypass_command_started(const mongoc_apm_command_started_t *event) { ASSERT_HAS_NOT_FIELD(mongoc_apm_command_started_get_command(event), "bypassDocumentValidation"); } static void test_bypass_not_sent(void) { mongoc_collection_t *collection; mongoc_bulk_operation_t *bulk; mongoc_find_and_modify_opts_t *opts; mongoc_client_t *client; mongoc_database_t *database; mongoc_apm_callbacks_t *callbacks; bson_error_t error; bool r; bson_t *doc; const bson_t *agg_doc; bson_t reply; bson_t *update; bson_t *query; bson_t *pipeline; bson_t *agg_opts; mongoc_cursor_t *cursor; char *collname; char *dbname; client = test_framework_new_default_client(); /* set up command monitoring for started commands */ callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, test_bypass_command_started); mongoc_client_set_apm_callbacks(client, callbacks, NULL); mongoc_apm_callbacks_destroy(callbacks); dbname = "test"; collname = gen_collection_name("bypass"); database = mongoc_client_get_database(client, dbname); collection = mongoc_database_get_collection(database, collname); bulk = mongoc_collection_create_bulk_operation_with_opts(collection, NULL); /* we explicitly set this to false to test that it isn't sent */ mongoc_bulk_operation_set_bypass_document_validation(bulk, false); /* insert a doc */ doc = BCON_NEW("x", BCON_INT32(31)); mongoc_bulk_operation_insert(bulk, doc); bson_destroy(doc); r = (bool)mongoc_bulk_operation_execute(bulk, &reply, &error); bson_destroy(&reply); ASSERT_OR_PRINT(r, error); mongoc_bulk_operation_destroy(bulk); opts = mongoc_find_and_modify_opts_new(); /* we explicitly set this to false to test that it isn't sent */ mongoc_find_and_modify_opts_set_bypass_document_validation(opts, false); /* find the doc we inserted earlier and modify it */ update = BCON_NEW("$set", "{", "x", BCON_INT32(32), "}"); mongoc_find_and_modify_opts_set_update(opts, update); bson_destroy(update); query = BCON_NEW("x", BCON_INT32(31)); r = mongoc_collection_find_and_modify_with_opts(collection, query, opts, &reply, &error); bson_destroy(&reply); ASSERT_OR_PRINT(r, error); bson_destroy(query); mongoc_find_and_modify_opts_destroy(opts); /* we explicitly set this to false to test that it isn't sent */ agg_opts = BCON_NEW("bypassDocumentValidation", BCON_BOOL(false)); /* aggregate match */ pipeline = BCON_NEW("pipeline", "[", "]"); cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, pipeline, agg_opts, NULL); bson_destroy(pipeline); bson_destroy(agg_opts); /* iterate through aggregation results */ while (mongoc_cursor_next(cursor, &agg_doc)) { } mongoc_cursor_destroy(cursor); /* cleanup */ bson_free(collname); mongoc_collection_destroy(collection); mongoc_database_destroy(database); mongoc_client_destroy(client); } static void test_disconnect_mid_batch(void) { mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *coll; bson_t **docs; int i; bson_error_t error; future_t *future; request_t *request; int n_docs; server = mock_server_new(); mock_server_auto_hello(server, "{'ok': 1.0," " 'isWritablePrimary': true," " 'minWireVersion': %d," " 'maxWireVersion': %d," " 'maxBsonObjectSize': 100}", WIRE_VERSION_MIN, WIRE_VERSION_MAX); mock_server_run(server); /* create enough documents for two batches. Note, because of our wonky * batch splitting behavior (to be fixed in CDRIVER-3310) we need add 16K * of documents. After CDRIVER-3310, we'll need to update this test. */ n_docs = ((BSON_OBJECT_ALLOWANCE) / tmp_bson("{ '_id': 1 }")->len) + 1; docs = bson_malloc(sizeof(bson_t *) * n_docs); for (i = 0; i < n_docs; i++) { docs[i] = BCON_NEW("_id", BCON_INT64(i)); } client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = mongoc_client_get_collection(client, "db", "coll"); future = future_collection_insert_many(coll, (const bson_t **)docs, n_docs, NULL, NULL, &error); /* Mock server recieves first insert. */ request = mock_server_receives_request(server); BSON_ASSERT(request); reply_to_request_with_hang_up(request); request_destroy(request); BSON_ASSERT(!future_get_bool(future)); future_destroy(future); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "socket error"); for (i = 0; i < n_docs; i++) { bson_destroy(docs[i]); } bson_free(docs); mongoc_collection_destroy(coll); mongoc_client_destroy(client); mock_server_destroy(server); } static void _configure_failpoint(mongoc_client_t *client, const char *mode, const char *data) { bool ret; bson_error_t error; ASSERT(client); ret = mongoc_client_command_simple( client, "admin", tmp_bson("{'configureFailPoint': 'failCommand', 'mode': %s, 'data': %s}", mode, data), NULL, NULL, &error); ASSERT_OR_PRINT(ret, error); } static void _test_invalid_wc_server_error(void *unused) { mongoc_client_t *client; mongoc_collection_t *coll; bool ret; bson_t reply; bson_error_t error; BSON_UNUSED(unused); client = test_framework_new_default_client(); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); coll = get_test_collection(client, "server_wc_error"); _configure_failpoint(client, "{'times': 2}", "{ 'failCommands': ['insert'], " "'writeConcernError': {'code' : " "91.0, 'errmsg': 'Replication is " "being shut down' }}"); ret = mongoc_collection_insert_one(coll, tmp_bson("{'x':1}"), NULL /* opts */, &reply, &error); BSON_ASSERT(!ret); ASSERT_MATCH(&reply, "{'writeConcernErrors': [{'code': 91, 'errmsg': " "'Replication is being shut down'}]}"); _configure_failpoint(client, "'off'", "{}"); bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_client_destroy(client); } void test_write_command_install(TestSuite *suite) { TestSuite_AddLive(suite, "/WriteCommand/split_insert", test_split_insert); TestSuite_AddLive(suite, "/WriteCommand/bypass_not_sent", test_bypass_not_sent); TestSuite_AddLive(suite, "/WriteCommand/invalid_write_concern", test_invalid_write_concern); TestSuite_AddFull(suite, "/WriteCommand/bypass_validation [lock:live-server]", test_bypass_validation, NULL, NULL, TestSuite_CheckLive); TestSuite_AddMockServerTest(suite, "/WriteCommand/insert_disconnect_mid_batch", test_disconnect_mid_batch); TestSuite_AddFull(suite, "/WriteCommand/invalid_wc_server_error [lock:live-server]", _test_invalid_wc_server_error, NULL, NULL, test_framework_skip_if_no_failpoint, /* Skipping on sharded clusters; see SERVER-57772 */ test_framework_skip_if_mongos); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-write-concern.c000066400000000000000000000576371511661753600254630ustar00rootroot00000000000000#include // BEGIN_IGNORE_DEPRECATIONS #include #include #include #include #include #include #include #include #include static void test_write_concern_append(void) { mongoc_write_concern_t *wc; bson_t *cmd; cmd = tmp_bson("{'foo': 1}"); capture_logs(true); /* cannot append invalid writeConcern */ wc = NULL; BSON_ASSERT(!mongoc_write_concern_append(wc, cmd)); /* append default writeConcern */ wc = mongoc_write_concern_new(); ASSERT(mongoc_write_concern_is_default(wc)); ASSERT_MATCH(cmd, "{'foo': 1, 'writeConcern': {'$exists': false}}"); /* append writeConcern with w */ mongoc_write_concern_set_w(wc, 1); BSON_ASSERT(mongoc_write_concern_append(wc, cmd)); assert_match_bson(cmd, tmp_bson("{'foo': 1, 'writeConcern': {'w': 1}}"), true); mongoc_write_concern_destroy(wc); } static void test_write_concern_basic(void) { mongoc_write_concern_t *write_concern; const bson_t *bson; bson_iter_t iter; write_concern = mongoc_write_concern_new(); BEGIN_IGNORE_DEPRECATIONS /* * Test defaults. */ ASSERT(write_concern); ASSERT(!mongoc_write_concern_get_journal(write_concern)); ASSERT(mongoc_write_concern_get_w(write_concern) == MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(!mongoc_write_concern_get_wtimeout_int64(write_concern)); ASSERT(!mongoc_write_concern_get_wmajority(write_concern)); mongoc_write_concern_set_journal(write_concern, true); ASSERT(mongoc_write_concern_get_journal(write_concern)); mongoc_write_concern_set_journal(write_concern, false); ASSERT(!mongoc_write_concern_get_journal(write_concern)); /* * Test changes to w. */ mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_get_wmajority(write_concern)); mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(!mongoc_write_concern_get_wmajority(write_concern)); mongoc_write_concern_set_wmajority(write_concern, 1000); ASSERT(mongoc_write_concern_get_wmajority(write_concern)); ASSERT(mongoc_write_concern_get_wtimeout(write_concern) == 1000); mongoc_write_concern_set_wtimeout(write_concern, 0); ASSERT(!mongoc_write_concern_get_wtimeout(write_concern)); mongoc_write_concern_set_wtimeout_int64(write_concern, INT64_MAX); ASSERT(mongoc_write_concern_get_wtimeout_int64(write_concern) == INT64_MAX); mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(mongoc_write_concern_get_w(write_concern) == MONGOC_WRITE_CONCERN_W_DEFAULT); mongoc_write_concern_set_w(write_concern, 3); ASSERT(mongoc_write_concern_get_w(write_concern) == 3); /* * Check generated bson. */ mongoc_write_concern_set_journal(write_concern, true); bson = _mongoc_write_concern_get_bson(write_concern); ASSERT(bson); ASSERT(!bson_iter_init_find(&iter, bson, "fsync")); // Deprecated "fsync" removed in C driver 2.0. ASSERT(bson_iter_init_find(&iter, bson, "j") && BSON_ITER_HOLDS_BOOL(&iter) && bson_iter_bool(&iter)); ASSERT(bson_iter_init_find(&iter, bson, "w") && BSON_ITER_HOLDS_INT32(&iter) && bson_iter_int32(&iter) == 3); mongoc_write_concern_destroy(write_concern); END_IGNORE_DEPRECATIONS } static void test_write_concern_bson_omits_defaults(void) { mongoc_write_concern_t *write_concern; const bson_t *bson; bson_iter_t iter; write_concern = mongoc_write_concern_new(); /* * Check generated bson. */ ASSERT(write_concern); bson = _mongoc_write_concern_get_bson(write_concern); ASSERT(bson); ASSERT(!bson_iter_init_find(&iter, bson, "fsync")); // fsync removed in C driver 2.0. ASSERT(!bson_iter_init_find(&iter, bson, "j")); mongoc_write_concern_destroy(write_concern); } static void test_write_concern_bson_includes_false_journal(void) { mongoc_write_concern_t *write_concern; const bson_t *bson; bson_iter_t iter; write_concern = mongoc_write_concern_new(); /* * Check generated bson. */ ASSERT(write_concern); mongoc_write_concern_set_journal(write_concern, false); bson = _mongoc_write_concern_get_bson(write_concern); ASSERT(bson); ASSERT(!bson_iter_init_find(&iter, bson, "fsync")); // Deprecated "fsync" removed in C driver 2.0. ASSERT(bson_iter_init_find(&iter, bson, "j") && BSON_ITER_HOLDS_BOOL(&iter) && !bson_iter_bool(&iter)); ASSERT(!bson_iter_init_find(&iter, bson, "w")); mongoc_write_concern_destroy(write_concern); } static void test_write_concern_journal_w1_validity(void) { mongoc_write_concern_t *write_concern = mongoc_write_concern_new(); // Journal should imply acknowledgement regardless of w. // Journal is invalid with w=0 and w=-1. /* No write concern needs acknowledgement, but not "valid" */ ASSERT(mongoc_write_concern_is_acknowledged(NULL)); ASSERT(!mongoc_write_concern_is_valid(NULL)); /* Default write concern needs acknowledgement and is valid */ ASSERT(write_concern); ASSERT(mongoc_write_concern_is_acknowledged(write_concern)); ASSERT(mongoc_write_concern_is_valid(write_concern)); ASSERT(!mongoc_write_concern_journal_is_set(write_concern)); /* w=0 does not need acknowledgement and is valid */ mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); ASSERT(!mongoc_write_concern_is_acknowledged(write_concern)); ASSERT(mongoc_write_concern_is_valid(write_concern)); ASSERT(!mongoc_write_concern_journal_is_set(write_concern)); /* journal=true needs acknowledgement, but it conflicts with w=0 */ mongoc_write_concern_set_journal(write_concern, true); ASSERT(mongoc_write_concern_is_acknowledged(write_concern)); ASSERT(!mongoc_write_concern_is_valid(write_concern)); ASSERT(mongoc_write_concern_journal_is_set(write_concern)); mongoc_write_concern_set_journal(write_concern, false); /* w=-1 is considered valid (server is expected to error) */ mongoc_write_concern_set_w(write_concern, -1); ASSERT(mongoc_write_concern_is_valid(write_concern)); /* journal=true with w=default needs acknowledgement and is valid */ mongoc_write_concern_set_journal(write_concern, true); mongoc_write_concern_set_w(write_concern, MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(mongoc_write_concern_is_acknowledged(write_concern)); ASSERT(mongoc_write_concern_is_valid(write_concern)); ASSERT(mongoc_write_concern_journal_is_set(write_concern)); mongoc_write_concern_destroy(write_concern); } static void test_write_concern_wtimeout_validity(void) { mongoc_write_concern_t *write_concern = mongoc_write_concern_new(); /* Test defaults */ ASSERT(write_concern); ASSERT(mongoc_write_concern_get_w(write_concern) == MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(mongoc_write_concern_get_wtimeout_int64(write_concern) == 0); ASSERT(!mongoc_write_concern_get_wmajority(write_concern)); /* mongoc_write_concern_set_wtimeout_int64() ignores invalid wtimeout */ mongoc_write_concern_set_wtimeout_int64(write_concern, -1); ASSERT(mongoc_write_concern_get_w(write_concern) == MONGOC_WRITE_CONCERN_W_DEFAULT); ASSERT(mongoc_write_concern_get_wtimeout_int64(write_concern) == 0); ASSERT(!mongoc_write_concern_get_wmajority(write_concern)); ASSERT(mongoc_write_concern_is_valid(write_concern)); /* mongoc_write_concern_set_wmajority() ignores invalid wtimeout */ mongoc_write_concern_set_wmajority(write_concern, -1); ASSERT(mongoc_write_concern_get_w(write_concern) == MONGOC_WRITE_CONCERN_W_MAJORITY); ASSERT(mongoc_write_concern_get_wtimeout_int64(write_concern) == 0); ASSERT(mongoc_write_concern_get_wmajority(write_concern)); ASSERT(mongoc_write_concern_is_valid(write_concern)); /* Manually assigning a negative wtimeout will make the write concern invalid */ write_concern->wtimeout = -1; ASSERT(!mongoc_write_concern_is_valid(write_concern)); mongoc_write_concern_destroy(write_concern); } static void _test_write_concern_from_iterator(const char *swc, bool ok, bool is_default) { bson_t *bson = tmp_bson(swc); const bson_t *bson2; mongoc_write_concern_t *wc; bson_iter_t iter; bson_error_t error; if (test_suite_debug_output()) { fprintf(stdout, " - %s\n", swc); fflush(stdout); } bson_iter_init_find(&iter, bson, "writeConcern"); wc = _mongoc_write_concern_new_from_iter(&iter, &error); if (ok) { BSON_ASSERT(wc); ASSERT(mongoc_write_concern_is_default(wc) == is_default); bson2 = _mongoc_write_concern_get_bson(wc); ASSERT(bson_compare(bson, bson2)); mongoc_write_concern_destroy(wc); } else { BSON_ASSERT(!wc); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_COMMAND, MONGOC_ERROR_COMMAND_INVALID_ARG, "Invalid writeConcern"); } } static void test_write_concern_from_iterator(void) { _test_write_concern_from_iterator("{'writeConcern': {}}", true, true); _test_write_concern_from_iterator("{'writeConcern': {'w': 'majority'}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'majority', 'j': true}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'sometag'}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'sometag', 'j': true}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'sometag', 'j': false}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 1, 'j': true}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 1, 'j': false}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 0, 'j': true}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 0, 'j': false}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 1}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'j': true}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'j': false}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': -1}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': -2}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': -3}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': -4}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': -5}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'majority', 'wtimeout': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 'sometag', 'wtimeout': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'wtimeout': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'wtimeout': -42}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'wtimeout': {'$numberLong': '123'}}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'wtimeout': {'$numberLong': '2147483648'}}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 1, 'wtimeout': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 0, 'wtimeout': 42}}", true, false); _test_write_concern_from_iterator("{'writeConcern': {'w': 1.0}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': {'some': 'stuff'}}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'w': []}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'wtimeout': 'never'}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'j': 'never'}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'j': 1.0}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'fsync': 1.0}}", false, false); _test_write_concern_from_iterator("{'writeConcern': {'fsync': true}}", false, false); } static void test_write_concern_always_mutable(void) { mongoc_write_concern_t *write_concern; write_concern = mongoc_write_concern_new(); ASSERT(write_concern); mongoc_write_concern_set_journal(write_concern, true); ASSERT_MATCH(_mongoc_write_concern_get_bson(write_concern), "{'j': true}"); mongoc_write_concern_set_w(write_concern, 2); ASSERT_MATCH(_mongoc_write_concern_get_bson(write_concern), "{'w': 2, 'j': true}"); mongoc_write_concern_set_wtimeout_int64(write_concern, 100); ASSERT_MATCH(_mongoc_write_concern_get_bson(write_concern), "{'w': 2, 'j': true, 'wtimeout': 100}"); mongoc_write_concern_set_wmajority(write_concern, 200); ASSERT_MATCH(_mongoc_write_concern_get_bson(write_concern), "{'w': 'majority', 'j': true, 'wtimeout': 200}"); mongoc_write_concern_set_wtag(write_concern, "MultipleDC"); ASSERT_MATCH(_mongoc_write_concern_get_bson(write_concern), "{'w': 'MultipleDC', 'j': true, 'wtimeout': 200}"); mongoc_write_concern_destroy(write_concern); } static void _test_wc_request(future_t *future, mock_server_t *server, bson_error_t *error) { request_t *request; BSON_UNUSED(error); request = mock_server_receives_msg(server, MONGOC_MSG_NONE, tmp_bson("{'$db': 'db', 'writeConcern': {'w': 2}}")); reply_to_request_with_ok_and_destroy(request); BSON_ASSERT(future_get_bool(future)); future_destroy(future); } static void test_write_concern(void) { bson_t *opts; mock_server_t *server; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; future_t *future; bson_error_t error; opts = tmp_bson("{'writeConcern': {'w': 2}}"); server = mock_server_with_auto_hello(WIRE_VERSION_MIN); mock_server_run(server); client = test_framework_client_new_from_uri(mock_server_get_uri(server), NULL); collection = mongoc_client_get_collection(client, "db", "collection"); /* * aggregate with $out */ cursor = mongoc_collection_aggregate(collection, MONGOC_QUERY_NONE, tmp_bson("[{'$out': 'foo'}]"), opts, NULL); ASSERT_OR_PRINT(!mongoc_cursor_error(cursor, &error), error); /* * generic mongoc_client_write_command_with_opts */ future = future_client_write_command_with_opts(client, "db", tmp_bson("{'foo': 1}"), opts, NULL, &error); _test_wc_request(future, server, &error); /* * drop */ future = future_collection_drop_with_opts(collection, opts, &error); _test_wc_request(future, server, &error); mongoc_cursor_destroy(cursor); mongoc_collection_destroy(collection); mongoc_client_destroy(client); mock_server_destroy(server); } /* Test that CDRIVER-2902 has been fixed. * The bug was that we did not correctly swab for the flagBits in OP_MSG. */ static void test_write_concern_unacknowledged(void) { mongoc_client_t *client; mongoc_write_concern_t *wc; mongoc_collection_t *coll; bson_error_t error; bool r; bson_t reply; bson_t opts; const bson_t **docs; client = test_framework_new_default_client(); coll = mongoc_client_get_collection(client, "db", "coll"); /* w:0 in OP_MSG is indicated by setting the moreToCome flag in OP_MSG. That * tells the recipient not to send a response. */ wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); bson_init(&opts); mongoc_write_concern_append(wc, &opts); /* In this insert_one with w:0, we write an OP_MSG on the socket, but don't * read a reply. Before CDRIVER-2902 was fixed, since we forget to set * moreToCome, the server still sends a reply. */ r = mongoc_collection_insert_one(coll, tmp_bson("{}"), &opts, &reply, &error); ASSERT_OR_PRINT(r, error); ASSERT(bson_empty(&reply)); bson_destroy(&reply); bson_destroy(&opts); docs = bson_malloc0(sizeof(bson_t *) * 2); docs[0] = tmp_bson("{}"); docs[1] = tmp_bson("{}"); /* In the next insert_many, before CDRIVER-2902 was fixed, we would read that * old reply. */ r = mongoc_collection_insert_many(coll, docs, 2, NULL, &reply, &error); bson_free((void *)docs); ASSERT_OR_PRINT(r, error); /* The replies are distinguished by the insertedCount. */ ASSERT_MATCH(&reply, "{'insertedCount': 2}"); bson_destroy(&reply); mongoc_collection_destroy(coll); mongoc_write_concern_destroy(wc); mongoc_client_destroy(client); } /* Regression test to to demonstrate that a 64-bit wtimeoutms value is properly * preserved. */ static void test_write_concern_wtimeout_preserved(void) { mongoc_write_concern_t *write_concern = mongoc_write_concern_new(); bson_t *cmd = tmp_bson("{}"); bson_iter_t iter; bson_iter_t child; ASSERT(write_concern); mongoc_write_concern_set_wtimeout_int64(write_concern, INT64_MAX); mongoc_write_concern_append(write_concern, cmd); ASSERT(bson_iter_init_find(&iter, cmd, "writeConcern")); ASSERT(BSON_ITER_HOLDS_DOCUMENT(&iter)); ASSERT(bson_iter_recurse(&iter, &child)); ASSERT(bson_iter_next(&child)); ASSERT_CMPSTR(bson_iter_key(&child), "wtimeout"); ASSERT_CMPINT64(bson_iter_int64(&child), ==, INT64_MAX); mongoc_write_concern_destroy(write_concern); } /* callback that records write concern for commands */ static void write_concern_count(const mongoc_apm_command_started_t *event) { const bson_t *command = mongoc_apm_command_started_get_command(event); bson_iter_t iter, iter_rec; if (bson_iter_init(&iter, command)) { int *sent_collection_w = (int *)mongoc_apm_command_started_get_context(event); if (bson_iter_find_descendant(&iter, "writeConcern.w", &iter_rec)) { *sent_collection_w = bson_iter_int32(&iter_rec); } else { *sent_collection_w = MONGOC_WRITE_CONCERN_W_DEFAULT; /* no write concern sent. default used */ } } } /* Addresses concerns brought up in CDRIVER-3595. This function comprises * three tests. The first tests that with no txn in progress, wc is inherited * from collection. The second tests that with a txn in progress, no * wc is inherited from collection, unacknowledged or acknowledged. * The third tests that an attempt to send an lsid with an * unacknowledged wc fails (where wc is inherited from collection). * All commands are fam commands. */ static void test_write_concern_inheritance_fam_txn(bool in_session, bool in_txn) { mongoc_find_and_modify_opts_t *opts = NULL; bson_t *update; bson_t *session_id; bson_error_t error; bson_t query = BSON_INITIALIZER; mongoc_write_concern_t *wc; mongoc_client_t *client; mongoc_collection_t *collection; mongoc_client_session_t *session = NULL; mongoc_apm_callbacks_t *callbacks; int sent_w = MONGOC_WRITE_CONCERN_W_DEFAULT; bool success; client = test_framework_new_default_client(); collection = mongoc_client_get_collection(client, "db", "collection"); callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_command_started_cb(callbacks, write_concern_count); mongoc_client_set_apm_callbacks(client, callbacks, (void *)&sent_w); wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, 1); mongoc_collection_set_write_concern(collection, wc); BSON_APPEND_UTF8(&query, "firstname", "Zlatan"); update = bson_new(); session_id = bson_new(); opts = mongoc_find_and_modify_opts_new(); if (in_session) { session = mongoc_client_start_session(client, NULL, &error); ASSERT_OR_PRINT(session, error); success = mongoc_client_session_append(session, session_id, &error); ASSERT_OR_PRINT(success, error); mongoc_find_and_modify_opts_append(opts, session_id); } if (in_txn) { BSON_ASSERT(in_session); success = mongoc_client_session_start_transaction(session, NULL, &error); ASSERT_OR_PRINT(success, error); } mongoc_find_and_modify_opts_set_update(opts, update); success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, NULL, &error); if (in_txn) { /* check that the sent write concern is not inherited */ BSON_ASSERT(sent_w == MONGOC_WRITE_CONCERN_W_DEFAULT); BSON_ASSERT(success); } else { /* assert that write concern is inherited. Two tests reach this * code. No txn in progress. */ ASSERT_OR_PRINT(success, error); BSON_ASSERT(success); BSON_ASSERT(sent_w == 1); } mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); mongoc_collection_set_write_concern(collection, wc); sent_w = MONGOC_WRITE_CONCERN_W_DEFAULT; success = mongoc_collection_find_and_modify_with_opts(collection, &query, opts, NULL, &error); if (in_txn) { /* check that the sent write concern is not inherited */ BSON_ASSERT(sent_w == MONGOC_WRITE_CONCERN_W_DEFAULT); success = mongoc_client_session_commit_transaction(session, NULL, &error); ASSERT_OR_PRINT(success, error); } else if (!in_session) { /* assert that write concern is inherited */ BSON_ASSERT(success); BSON_ASSERT(sent_w == MONGOC_WRITE_CONCERN_W_UNACKNOWLEDGED); } else { /* case where lsid is sent with unacknowledged write concern */ BSON_ASSERT(!success); ASSERT_CONTAINS(error.message, "Cannot use client session with " "unacknowledged command"); } mongoc_write_concern_destroy(wc); mongoc_client_session_destroy(session); mongoc_apm_callbacks_destroy(callbacks); mongoc_collection_destroy(collection); mongoc_client_destroy(client); bson_destroy(update); bson_destroy(&query); bson_destroy(session_id); mongoc_find_and_modify_opts_destroy(opts); } static void test_fam_no_session_no_txn(void *unused) { BSON_UNUSED(unused); test_write_concern_inheritance_fam_txn(false, false); } static void test_fam_session_no_txn(void *unused) { BSON_UNUSED(unused); test_write_concern_inheritance_fam_txn(true, false); } static void test_fam_session_txn(void *unused) { BSON_UNUSED(unused); test_write_concern_inheritance_fam_txn(true, true); } void test_write_concern_install(TestSuite *suite) { TestSuite_Add(suite, "/WriteConcern/append", test_write_concern_append); TestSuite_Add(suite, "/WriteConcern/basic", test_write_concern_basic); TestSuite_Add(suite, "/WriteConcern/bson_omits_defaults", test_write_concern_bson_omits_defaults); TestSuite_Add(suite, "/WriteConcern/bson_includes_false_journal", test_write_concern_bson_includes_false_journal); TestSuite_Add(suite, "/WriteConcern/journal_w1_validity", test_write_concern_journal_w1_validity); TestSuite_Add(suite, "/WriteConcern/wtimeout_validity", test_write_concern_wtimeout_validity); TestSuite_Add(suite, "/WriteConcern/from_iterator", test_write_concern_from_iterator); TestSuite_Add(suite, "/WriteConcern/always_mutable", test_write_concern_always_mutable); TestSuite_Add(suite, "/WriteConcern/wtimeout_preserved", test_write_concern_wtimeout_preserved); TestSuite_AddMockServerTest(suite, "/WriteConcern", test_write_concern); TestSuite_AddLive(suite, "/WriteConcern/unacknowledged", test_write_concern_unacknowledged); TestSuite_AddFull(suite, "/WriteConcern/inherited_fam [lock:live-server]", test_fam_no_session_no_txn, NULL, NULL, TestSuite_CheckLive); TestSuite_AddFull(suite, "/WriteConcern/inherited_fam_session_no_txn [lock:live-server]", test_fam_session_no_txn, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_txns); TestSuite_AddFull(suite, "/WriteConcern/inherited_fam_txn [lock:live-server]", test_fam_session_txn, NULL, NULL, test_framework_skip_if_no_sessions, test_framework_skip_if_no_txns); } mongo-c-driver-2.2.1/src/libmongoc/tests/test-mongoc-x509.c000066400000000000000000000532331511661753600233750ustar00rootroot00000000000000#include #include #ifdef MONGOC_ENABLE_SSL_OPENSSL #include #endif #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL #include #endif #include #include // tmp_bson #include #ifdef MONGOC_ENABLE_OCSP_OPENSSL /* Test parsing a DER encoded tlsfeature extension contents for the * status_request (value 5). This is a SEQUENCE of INTEGER. libmongoc assumes * this is a sequence of one byte integers. */ static void _expect_malformed(const char *data, int32_t len) { bool ret; ret = _mongoc_tlsfeature_has_status_request((const uint8_t *)data, len); BSON_ASSERT(!ret); ASSERT_CAPTURED_LOG("mongoc", MONGOC_LOG_LEVEL_ERROR, "malformed"); clear_captured_logs(); } static void _expect_no_status_request(const char *data, int32_t len) { bool ret; ret = _mongoc_tlsfeature_has_status_request((const uint8_t *)data, len); BSON_ASSERT(!ret); ASSERT_NO_CAPTURED_LOGS("mongoc"); } static void _expect_status_request(const char *data, int32_t len) { bool ret; ret = _mongoc_tlsfeature_has_status_request((const uint8_t *)data, len); BSON_ASSERT(ret); ASSERT_NO_CAPTURED_LOGS("mongoc"); } static void test_tlsfeature_parsing(void) { capture_logs(true); /* A sequence of one integer = 5. */ _expect_status_request("\x30\x03\x02\x01\x05", 5); /* A sequence of one integer = 6. */ _expect_no_status_request("\x30\x03\x02\x01\x06", 5); /* A sequence of two integers = 5,6. */ _expect_status_request("\x30\x03\x02\x01\x05\x02\x01\x06", 8); /* A sequence of two integers = 6,5. */ _expect_status_request("\x30\x03\x02\x01\x06\x02\x01\x05", 8); /* A sequence containing a non-integer. Parsing fails. */ _expect_malformed("\x30\x03\x03\x01\x05\x02\x01\x06", 8); /* A non-sequence. It will not read past the first byte (despite the >1 * length). */ _expect_malformed("\xFF", 2); /* A sequence with a length represented in more than one byte. Parsing fails. */ _expect_malformed("\x30\x82\x04\x48", 4); /* An integer with length > 1. Parsing fails. */ _expect_malformed("\x30\x03\x02\x02\x05\x05", 6); } #endif /* MONGOC_ENABLE_OCSP_OPENSSL */ #ifdef MONGOC_ENABLE_SSL static void create_x509_user(void) { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); bool ok = mongoc_client_command_simple(client, "$external", tmp_bson(BSON_STR({ "createUser" : "C=US,ST=New York,L=New York City,O=MDB,OU=Drivers,CN=client", "roles" : [ {"role" : "readWrite", "db" : "db"} ] })), NULL /* read_prefs */, NULL /* reply */, &error); ASSERT_OR_PRINT(ok, error); mongoc_client_destroy(client); } static void drop_x509_user(bool ignore_notfound) { bson_error_t error; mongoc_client_t *client = test_framework_new_default_client(); bool ok = mongoc_client_command_simple( client, "$external", tmp_bson(BSON_STR({"dropUser" : "C=US,ST=New York,L=New York City,O=MDB,OU=Drivers,CN=client"})), NULL /* read_prefs */, NULL /* reply */, &error); if (!ok) { ASSERT_OR_PRINT(ignore_notfound && NULL != strstr(error.message, "not found"), error); } mongoc_client_destroy(client); } static mongoc_uri_t * get_x509_uri(void) { bson_error_t error; char *uristr_noauth = test_framework_get_uri_str_no_auth("db"); mongoc_uri_t *uri = mongoc_uri_new_with_error(uristr_noauth, &error); ASSERT_OR_PRINT(uri, error); ASSERT(mongoc_uri_set_auth_mechanism(uri, "MONGODB-X509")); ASSERT(mongoc_uri_set_auth_source(uri, "$external")); bson_free(uristr_noauth); return uri; } static bool try_insert(mongoc_client_t *client, bson_error_t *error) { mongoc_collection_t *coll = mongoc_client_get_collection(client, "db", "coll"); bool ok = mongoc_collection_insert_one(coll, tmp_bson("{}"), NULL, NULL, error); mongoc_collection_destroy(coll); return ok; } #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL // Define utilities check and delete imported keys for Secure Channel: // The deterministic name for the certificate in src/libmongoc/tests/x509gen/client-pkcs8-unencrypted.pem. static LPCWSTR pkcs8_key_name = L"libmongoc-6659E73980D0FB4EB315CF600E0B10CCBB8C3B74FD3ED94DEAF6DC2D2B6B8317-pkcs8"; static void delete_imported_pkcs8_key(void) { // Open the software key storage provider: NCRYPT_PROV_HANDLE hProv = 0; SECURITY_STATUS status = NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0); ASSERT_WITH_MSG(status == SEC_E_OK, "Failed to open key storage provider: %s", mongoc_winerr_to_string(status)); // Open the key handle: NCRYPT_PROV_HANDLE keyHandle = 0; status = NCryptOpenKey(hProv, &keyHandle, pkcs8_key_name, 0, 0); ASSERT_WITH_MSG(status == SEC_E_OK, "Failed to open key: %s", mongoc_winerr_to_string(status)); // Delete key: status = NCryptDeleteKey(keyHandle, 0); // Also frees handle. ASSERT_WITH_MSG(status == SEC_E_OK, "Failed to delete key: %s", mongoc_winerr_to_string(status)); // NCryptDeleteKey freed handle. ASSERT(NCryptFreeObject(hProv) == ERROR_SUCCESS); } static bool has_imported_pkcs8_key(void) { // Open the software key storage provider: NCRYPT_PROV_HANDLE hProv = 0; SECURITY_STATUS status = NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0); ASSERT_WITH_MSG(status == SEC_E_OK, "Failed to open key storage provider: %s", mongoc_winerr_to_string(status)); // Open the key handle: NCRYPT_PROV_HANDLE keyHandle = 0; status = NCryptOpenKey(hProv, &keyHandle, pkcs8_key_name, 0, 0); bool found = (status == SEC_E_OK); // NTE_BAD_KEYSET is expected if key is not found. ASSERT_WITH_MSG( status == SEC_E_OK || status == NTE_BAD_KEYSET, "Failed to open key: %s", mongoc_winerr_to_string(status)); if (keyHandle) { ASSERT(NCryptFreeObject(keyHandle) == ERROR_SUCCESS); } ASSERT(NCryptFreeObject(hProv) == ERROR_SUCCESS); return found; } // The deterministic name for the certificate in src/libmongoc/tests/x509gen/client.pem. static LPCWSTR pkcs1_key_name = L"libmongoc-6659E73980D0FB4EB315CF600E0B10CCBB8C3B74FD3ED94DEAF6DC2D2B6B8317-pkcs1"; static void delete_imported_pkcs1_key(void) { HCRYPTPROV provider; bool success = CryptAcquireContextW(&provider, /* phProv */ pkcs1_key_name, /* pszContainer */ MS_ENHANCED_PROV_W, /* pszProvider */ PROV_RSA_FULL, /* dwProvType */ CRYPT_DELETEKEYSET | CRYPT_SILENT); /* dwFlags */ ASSERT_WITH_MSG(success, "Failed to delete key: %s", mongoc_winerr_to_string(GetLastError())); // CRYPT_DELETEKEYSET leaves provider undefined. Do not call CryptReleaseContext. } static bool has_imported_pkcs1_key(void) { HCRYPTPROV provider = 0; bool success = CryptAcquireContextW(&provider, /* phProv */ pkcs1_key_name, /* pszContainer */ MS_ENHANCED_PROV_W, /* pszProvider */ PROV_RSA_FULL, /* dwProvType */ CRYPT_SILENT); /* dwFlags */ if (!success) { const DWORD lastError = GetLastError(); // NTE_BAD_KEYSET is expected if key is not found. ASSERT_WITH_MSG(lastError == (DWORD)NTE_BAD_KEYSET, "Unexpected error in acquiring context: %s", mongoc_winerr_to_string(lastError)); return false; } ASSERT(CryptReleaseContext(provider, 0)); return true; } #define SCHANNEL_ASSERT_PKCS8_KEY_IMPORTED() ASSERT(has_imported_pkcs8_key()) #define SCHANNEL_ASSERT_PKCS8_KEY_NOT_IMPORTED() ASSERT(!has_imported_pkcs8_key()) #define SCHANNEL_DELETE_PKCS8_KEY() \ if (has_imported_pkcs8_key()) \ delete_imported_pkcs8_key(); \ else \ (void)0 #define SCHANNEL_ASSERT_PKCS1_KEY_IMPORTED() ASSERT(has_imported_pkcs1_key()) #define SCHANNEL_ASSERT_PKCS1_KEY_NOT_IMPORTED() ASSERT(!has_imported_pkcs1_key()) #define SCHANNEL_DELETE_PKCS1_KEY() \ if (has_imported_pkcs1_key()) \ delete_imported_pkcs1_key(); \ else \ (void)0 #else #define SCHANNEL_ASSERT_PKCS8_KEY_IMPORTED() ((void)0) #define SCHANNEL_ASSERT_PKCS8_KEY_NOT_IMPORTED() ((void)0) #define SCHANNEL_DELETE_PKCS8_KEY() ((void)0) #define SCHANNEL_ASSERT_PKCS1_KEY_IMPORTED() ((void)0) #define SCHANNEL_ASSERT_PKCS1_KEY_NOT_IMPORTED() ((void)0) #define SCHANNEL_DELETE_PKCS1_KEY() ((void)0) #endif // MONGOC_ENABLE_SSL_SECURE_CHANNEL static void test_x509_auth(void *unused) { BSON_UNUSED(unused); drop_x509_user(true /* ignore "not found" error */); create_x509_user(); // Test auth works with PKCS8 key: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_option_as_utf8( uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_TEST_DIR "/client-pkcs8-unencrypted.pem")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; // Test SChannel key is not previously imported: { SCHANNEL_DELETE_PKCS8_KEY(); SCHANNEL_ASSERT_PKCS8_KEY_NOT_IMPORTED(); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); // Imports key. SCHANNEL_ASSERT_PKCS8_KEY_IMPORTED(); ok = try_insert(client, &error); mongoc_client_destroy(client); } // Test SChannel key is previously imported: { SCHANNEL_ASSERT_PKCS8_KEY_IMPORTED(); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT_OR_PRINT(ok, error); mongoc_uri_destroy(uri); } // Test auth works with a PKCS1 key: { SCHANNEL_DELETE_PKCS1_KEY(); SCHANNEL_ASSERT_PKCS1_KEY_NOT_IMPORTED(); // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_CLIENT)); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; // Test SChannel key is not previously imported: { SCHANNEL_DELETE_PKCS1_KEY(); SCHANNEL_ASSERT_PKCS1_KEY_NOT_IMPORTED(); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); // Imports key. SCHANNEL_ASSERT_PKCS1_KEY_IMPORTED(); ok = try_insert(client, &error); mongoc_client_destroy(client); } // Test SChannel key is previously imported: { SCHANNEL_ASSERT_PKCS1_KEY_IMPORTED(); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT_OR_PRINT(ok, error); mongoc_uri_destroy(uri); } // Test auth fails with no client certificate: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; { mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "" /* message differs between server versions */); mongoc_uri_destroy(uri); } // Test auth works with explicit username: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_username(uri, "C=US,ST=New York,L=New York City,O=MDB,OU=Drivers,CN=client")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_CLIENT)); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; { mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT_OR_PRINT(ok, error); mongoc_uri_destroy(uri); } // Test auth fails with wrong username: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_username(uri, "bad")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_CLIENT)); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; { mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "" /* message differs between server versions */); mongoc_uri_destroy(uri); } // Test auth fails with correct username but wrong certificate: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_username(uri, "C=US,ST=New York,L=New York City,O=MDB,OU=Drivers,CN=client")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_SERVER)); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); } // Try auth: bson_error_t error = {0}; bool ok; { mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); mongoc_client_destroy(client); } ASSERT(!ok); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "" /* message differs between server versions */); mongoc_uri_destroy(uri); } // Test auth fails when client certificate does not contain public certificate: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT( mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_TEST_DIR "/client-private.pem")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); ASSERT(mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, true)); // Fail quickly. } // Try auth: bson_error_t error = {0}; bool ok; { capture_logs(true); // Capture logs before connecting. OpenSSL reads PEM file during client construction. mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); #if defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "Type is not supported"); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "Can't find public certificate"); #elif defined(MONGOC_ENABLE_SSL_OPENSSL) ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "Cannot find certificate"); #endif mongoc_client_destroy(client); } ASSERT(!ok); #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) // OpenSSL and Secure Transport fail to create stream (prior to TLS). Resulting in a server selection error. ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "connection error"); #else ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "" /* message differs between server versions */); #endif mongoc_uri_destroy(uri); } // Test auth fails when client certificate does not exist: { // Create URI: mongoc_uri_t *uri = get_x509_uri(); { ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCERTIFICATEKEYFILE, CERT_TEST_DIR "/foobar.pem")); ASSERT(mongoc_uri_set_option_as_utf8(uri, MONGOC_URI_TLSCAFILE, CERT_CA)); ASSERT(mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, true)); // Fail quickly. } // Try auth: bson_error_t error = {0}; bool ok; { capture_logs(true); mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); ok = try_insert(client, &error); #if defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) || defined(MONGOC_ENABLE_SSL_OPENSSL) ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "Cannot find certificate"); #elif defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "Failed to open file"); #endif mongoc_client_destroy(client); } ASSERT(!ok); #if defined(MONGOC_ENABLE_SSL_OPENSSL) || defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) // OpenSSL fails to create stream (prior to TLS). Resulting in a server selection error. ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "connection error"); #else ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_CLIENT, MONGOC_ERROR_CLIENT_AUTHENTICATE, "" /* message differs between server versions */); #endif mongoc_uri_destroy(uri); } drop_x509_user(false); } #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL static void remove_crl_for_secure_channel(const char *crl_path) { // Load CRL from file to query system store. PCCRL_CONTEXT crl_from_file = mongoc_secure_channel_load_crl(crl_path); ASSERT(crl_from_file); HCERTSTORE cert_store = CertOpenStore(CERT_STORE_PROV_SYSTEM, /* provider */ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* certificate encoding */ 0, /* unused */ CERT_SYSTEM_STORE_LOCAL_MACHINE, /* dwFlags */ L"Root"); /* system store name. "My" or "Root" */ ASSERT(cert_store); PCCRL_CONTEXT crl_from_store = CertFindCRLInStore(cert_store, 0, 0, CRL_FIND_EXISTING, crl_from_file, NULL); ASSERT(crl_from_store); if (!CertDeleteCRLFromStore(crl_from_store)) { test_error( "Failed to delete CRL from store. Delete CRL manually to avoid test errors verifying server certificate."); } CertFreeCRLContext(crl_from_file); CertFreeCRLContext(crl_from_store); CertCloseStore(cert_store, 0); } #endif // MONGOC_ENABLE_SSL_SECURE_CHANNEL // test_crl tests connection fails when server certificate is in CRL list. static void test_crl(void *unused) { BSON_UNUSED(unused); #if defined(MONGOC_ENABLE_SSL_SECURE_CHANNEL) if (!test_framework_getenv_bool("MONGOC_TEST_SCHANNEL_CRL")) { printf("Skipping. Test temporarily adds CRL to Windows certificate store. If removing the CRL fails, this may " "cause later test failures and require removing the CRL file manually. To run test anyway, set the " "environment variable MONGOC_TEST_SCHANNEL_CRL=ON\n"); return; } #elif defined(MONGOC_ENABLE_SSL_SECURE_TRANSPORT) printf("Skipping. Secure Transport does not support crl_file.\n"); return; #endif // Create URI: mongoc_uri_t *uri = test_framework_get_uri(); ASSERT(mongoc_uri_set_option_as_bool(uri, MONGOC_URI_SERVERSELECTIONTRYONCE, true)); // Fail quickly. // Create SSL options with CRL file: mongoc_ssl_opt_t ssl_opts = *test_framework_get_ssl_opts(); ssl_opts.crl_file = CERT_TEST_DIR "/crl.pem"; // Try insert: bson_error_t error = {0}; mongoc_client_t *client = test_framework_client_new_from_uri(uri, NULL); mongoc_client_set_ssl_opts(client, &ssl_opts); capture_logs(true); bool ok = try_insert(client, &error); #ifdef MONGOC_ENABLE_SSL_SECURE_CHANNEL remove_crl_for_secure_channel(ssl_opts.crl_file); ASSERT_CAPTURED_LOG("tls", MONGOC_LOG_LEVEL_ERROR, "The certificate is revoked"); #else ASSERT_NO_CAPTURED_LOGS("tls"); #endif ASSERT(!ok); ASSERT_ERROR_CONTAINS( error, MONGOC_ERROR_SERVER_SELECTION, MONGOC_ERROR_SERVER_SELECTION_FAILURE, "no suitable servers"); mongoc_client_destroy(client); mongoc_uri_destroy(uri); } #endif // MONGOC_ENABLE_SSL void test_x509_install(TestSuite *suite) { #ifdef MONGOC_ENABLE_SSL TestSuite_AddFull(suite, "/X509/auth [lock:live-server]", test_x509_auth, NULL, NULL, test_framework_skip_if_no_auth, test_framework_skip_if_no_server_ssl); TestSuite_AddFull(suite, "/X509/crl [lock:live-server]", test_crl, NULL, NULL, test_framework_skip_if_no_server_ssl); #endif #ifdef MONGOC_ENABLE_OCSP_OPENSSL TestSuite_Add(suite, "/X509/tlsfeature_parsing", test_tlsfeature_parsing); #endif } mongo-c-driver-2.2.1/src/libmongoc/tests/test-service-gcp.c000066400000000000000000000120771511661753600236200ustar00rootroot00000000000000#include #include #include #include static void _test_gcp_parse(void) { // Test that we correctly parse the JSON returned by the GCP metadata server bson_error_t error; gcp_service_account_token token; // server output must be json data ASSERT(!gcp_access_token_try_parse_from_json(&token, "invalid json", -1, &error)); ASSERT_CMPUINT32(error.domain, ==, BSON_ERROR_JSON); // server output must contain access_token ASSERT(!gcp_access_token_try_parse_from_json(&token, "{}", -1, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, ""); // server output must contain a value for access_token ASSERT(!gcp_access_token_try_parse_from_json(&token, BSON_STR({"access_token" : null}), -1, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, "One or more required JSON"); // server output must contain token_type ASSERT(!gcp_access_token_try_parse_from_json(&token, BSON_STR({"access_token" : "helloworld"}), -1, &error)); ASSERT_ERROR_CONTAINS(error, MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, "One or more required JSON"); // can successfully parse JSON datat into a gcp_service_account_token ASSERT(gcp_access_token_try_parse_from_json( &token, BSON_STR({"access_token" : "helloworld", "token_type" : "bearer", "expires_in" : "3788"}), -1, &error)); ASSERT_ERROR_CONTAINS(error, 0, 0, ""); ASSERT_CMPSTR(token.access_token, "helloworld"); ASSERT_CMPSTR(token.token_type, "bearer"); gcp_access_token_destroy(&token); } static void _test_gcp_http_request(void) { // Test that we correctly build a http request for the GCP metadata server gcp_request req; ASSERT(gcp_request_init( &req, "/computeMetadata/v1/instance/service-accounts/default/token", NULL, "helloworld.com", 1234, NULL)); mcommon_string_append_t req_str; mcommon_string_new_as_append(&req_str); _mongoc_http_render_request_head(&req_str, &req.req); gcp_request_destroy(&req); ASSERT_CMPSTR(mcommon_str_from_append(&req_str), "GET " "/computeMetadata/v1/instance/service-accounts/default/token HTTP/1.0\r\n" "Host: helloworld.com:1234\r\n" "Connection: close\r\n" "Metadata-Flavor: Google\r\n" "\r\n"); mcommon_string_from_append_destroy(&req_str); // Test an identity token request ASSERT(gcp_request_init( &req, "/computeMetadata/v1/instance/service-accounts/default/identity", "foobar", "helloworld.com", 1234, NULL)); mcommon_string_new_as_append(&req_str); _mongoc_http_render_request_head(&req_str, &req.req); gcp_request_destroy(&req); ASSERT_CMPSTR(mcommon_str_from_append(&req_str), "GET " "/computeMetadata/v1/instance/service-accounts/default/identity?audience=foobar HTTP/1.0\r\n" "Host: helloworld.com:1234\r\n" "Connection: close\r\n" "Metadata-Flavor: Google\r\n" "\r\n"); mcommon_string_from_append_destroy(&req_str); } static const char * _get_test_host(void) { return getenv("TEST_KMS_PROVIDER_HOST"); } static void _run_http_test_case(const char *case_, mongoc_error_domain_t expect_domain, mongoc_error_code_t expect_code, const char *expect_error_message) { bson_error_t error = {0}; struct _mongoc_host_list_t host; _mongoc_host_list_from_string_with_err(&host, _get_test_host(), &error); ASSERT_ERROR_CONTAINS(error, 0, 0, ""); gcp_service_account_token token = {0}; char *const header = bson_strdup_printf("X-MongoDB-HTTP-TestParams: case=%s\r\n", case_); gcp_access_token_from_gcp_server(&token, host.host, host.port, header, &error); bson_free(header); gcp_access_token_destroy(&token); ASSERT_ERROR_CONTAINS(error, expect_domain, expect_code, expect_error_message); } static void _test_with_mock_server(void *ctx) { BSON_UNUSED(ctx); _run_http_test_case("", 0, 0, ""); // (No error) _run_http_test_case("404", MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_HTTP, ""); _run_http_test_case("slow", MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "Timeout"); _run_http_test_case("empty-json", MONGOC_ERROR_GCP, MONGOC_ERROR_KMS_SERVER_BAD_JSON, ""); _run_http_test_case("bad-json", MONGOC_ERROR_CLIENT, MONGOC_ERROR_STREAM_INVALID_TYPE, ""); _run_http_test_case("giant", MONGOC_ERROR_STREAM, MONGOC_ERROR_STREAM_SOCKET, "too large"); } static int have_mock_server_env(void) { return _get_test_host() != NULL; } void test_service_gcp_install(TestSuite *suite) { TestSuite_Add(suite, "/gcp/http/parse", _test_gcp_parse); TestSuite_Add(suite, "/gcp/http/request", _test_gcp_http_request); TestSuite_AddFull(suite, "/gcp/http/talk [uses:fake_kms_provider_server][lock:fake-kms]", _test_with_mock_server, NULL, NULL, have_mock_server_env); } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/000077500000000000000000000000001511661753600217045ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/unified/entity-map.c000066400000000000000000002606441511661753600241530ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./entity-map.h" #include "./util.h" #include #include #include #include #include #include #include #include #include #include /* TODO: use public API to reduce min heartbeat once CDRIVER-3130 is resolved. */ #include #include #include #define REDUCED_HEARTBEAT_FREQUENCY_MS 500 #define REDUCED_MIN_HEARTBEAT_FREQUENCY_MS 50 struct _entity_findcursor_t { const bson_t *first_result; mongoc_cursor_t *cursor; }; typedef void (*event_serialize_func_t)(bson_t *bson, const void *event); static void entity_destroy(entity_t *entity); static bool _parse_and_set_auto_encryption_opts(mongoc_client_t *client, bson_t *opts, bson_error_t *error); entity_map_t * entity_map_new(void) { return bson_malloc0(sizeof(entity_map_t)); } void entity_map_destroy(entity_map_t *entity_map) { entity_t *entity, *tmp; LL_FOREACH_SAFE(entity_map->entities, entity, tmp) { entity_destroy(entity); } bson_free(entity_map); } static bool uri_apply_options(mongoc_uri_t *uri, bson_t *opts, bson_error_t *error) { bson_iter_t iter; bool ret = false; bool wcSet = false; mongoc_write_concern_t *wc = NULL; /* There may be multiple URI options (w, wTimeoutMS, journal) for a write * concern. Parse all options before setting the write concern on the URI. */ wc = mongoc_write_concern_new(); BSON_FOREACH(opts, iter) { const char *key; key = bson_iter_key(&iter); if (0 == strcmp("readConcernLevel", key)) { mongoc_read_concern_t *rc = NULL; rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, bson_iter_utf8(&iter, NULL)); mongoc_uri_set_read_concern(uri, rc); mongoc_read_concern_destroy(rc); } else if (0 == strcmp("w", key)) { if (BSON_ITER_HOLDS_UTF8(&iter)) { // Write concern may be string "majority". const char *w = bson_iter_utf8(&iter, NULL); if (0 == strcmp(w, "majority")) { mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); } else { test_set_error(error, "Unrecognized string value for 'w' URI option: %s", w); } } else if (BSON_ITER_HOLDS_INT32(&iter)) { mongoc_write_concern_set_w(wc, bson_iter_int32(&iter)); } else { test_set_error(error, "Expected int32 or string for 'w' URI option, got: %s", _mongoc_bson_type_to_str(bson_iter_type(&iter))); } wcSet = true; } else if (mongoc_uri_option_is_int32(key)) { mongoc_uri_set_option_as_int32(uri, key, bson_iter_int32(&iter)); } else if (mongoc_uri_option_is_int64(key)) { mongoc_uri_set_option_as_int64(uri, key, bson_iter_int64(&iter)); } else if (mongoc_uri_option_is_bool(key)) { mongoc_uri_set_option_as_bool(uri, key, bson_iter_bool(&iter)); } else if (0 == bson_strcasecmp(MONGOC_URI_APPNAME, key)) { mongoc_uri_set_appname(uri, bson_iter_utf8(&iter, NULL)); } else if (0 == bson_strcasecmp(MONGOC_URI_SERVERMONITORINGMODE, key)) { mongoc_uri_set_option_as_utf8(uri, key, bson_iter_utf8(&iter, NULL)); } else if (0 == bson_strcasecmp(MONGOC_URI_AUTHMECHANISM, key)) { mongoc_uri_set_auth_mechanism(uri, bson_iter_utf8(&iter, NULL)); } else if (0 == bson_strcasecmp(MONGOC_URI_AUTHMECHANISMPROPERTIES, key)) { bson_t props; if (!_mongoc_iter_document_as_bson(&iter, &props, error)) { goto done; } bson_t *expect = BCON_NEW("$$placeholder", BCON_INT32(1)); if (!bson_equal(&props, expect)) { test_set_error(error, "expected authMechanismProperties to be placeholder"); bson_destroy(expect); goto done; } if (!test_framework_is_oidc()) { test_set_error(error, "expected test with authMechanismProperties to only apply to OIDC"); bson_destroy(expect); goto done; } bson_destroy(expect); } else { test_set_error(error, "Unimplemented test runner support for URI option: %s", key); goto done; } } if (wcSet) { mongoc_uri_set_write_concern(uri, wc); } ret = true; done: mongoc_write_concern_destroy(wc); return ret; } /* Consider refactoring the names, this is confusing. "type" has been the name * of the specific event type. "eventType" is more like what's called the * "component" in structured logging, but here it's named after the field in * expectedEventsForClient. */ static event_t * event_new(const char *type, const char *eventType, bson_t *serialized, bool is_sensitive_command) { BSON_ASSERT_PARAM(type); BSON_ASSERT_PARAM(eventType); BSON_ASSERT_PARAM(serialized); const int64_t usecs = usecs_since_epoch(); const double secs = (double)usecs / 1000000.0; // Append required common fields BSON_APPEND_UTF8(serialized, "name", type); BSON_APPEND_DOUBLE(serialized, "observedAt", secs); MONGOC_DEBUG("new %s event: %s %s (%s)", eventType, type, tmp_json(serialized), is_sensitive_command ? "marked SENSITIVE" : "not sensitive"); event_t *event = bson_malloc0(sizeof *event); event->type = type; // Borrowed event->eventType = eventType; // Borrowed event->serialized = serialized; // Takes ownership event->is_sensitive_command = is_sensitive_command; return event; } static void event_destroy(event_t *event) { if (!event) { return; } bson_destroy(event->serialized); bson_free(event); } /** * @brief Test whether a structured log entry is accepted by all active filters * @returns true if all filters have returned true in response to this entry, or * if no filters were active * @param entity Client entity with the filter stack to query * @param entry Borrowed constant reference to the log entry * * Filters will run in stack order, from most recently pushed to least. * * log_mutex must already be held. */ static bool _entity_log_filter_accepts(const entity_t *entity, const mongoc_structured_log_entry_t *entry) { for (log_filter_t *filter = entity->log_filters; filter; filter = filter->next) { if (!filter->func || !filter->func(entry, filter->user_data)) { return false; } } return true; } /** * @brief Push a new structured log filter function onto the stack * @param entity Client entity to modify the filter stack for * @param func Filter function, returns true to accept a log or false to reject. * May be NULL to reject all logs. * @param user_data Optional user_data pointer, passed to 'func'. * * Must be paired with entity_log_filter_pop. * * Briefly acquires log_mutex. */ void entity_log_filter_push(entity_t *entity, log_filter_func_t *func, void *user_data) { BSON_ASSERT_PARAM(entity); BSON_OPTIONAL_PARAM(func); BSON_OPTIONAL_PARAM(user_data); log_filter_t *new_entry = bson_malloc0(sizeof *new_entry); bson_mutex_lock(&entity->log_mutex); new_entry->next = entity->log_filters; new_entry->func = func; new_entry->user_data = user_data; entity->log_filters = new_entry; bson_mutex_unlock(&entity->log_mutex); } /** * @brief Pop the most recent structured log filter from the stack, which must * match * @param entity Client entity to modify the filter stack for * @param func Filter function, must match the value given to * entity_log_filter_push * @param user_data Must match the corresponding user_data value from * entity_log_filter_push * * Briefly acquires log_mutex. */ void entity_log_filter_pop(entity_t *entity, log_filter_func_t *func, void *user_data) { BSON_ASSERT_PARAM(entity); BSON_OPTIONAL_PARAM(func); BSON_OPTIONAL_PARAM(user_data); bson_mutex_lock(&entity->log_mutex); log_filter_t *old_entry = entity->log_filters; BSON_ASSERT(old_entry); BSON_ASSERT(old_entry->func == func); BSON_ASSERT(old_entry->user_data == user_data); entity->log_filters = old_entry->next; bson_mutex_unlock(&entity->log_mutex); bson_free(old_entry); } void entity_map_log_filter_push(entity_map_t *entity_map, const char *entity_id, log_filter_func_t *func, void *user_data) { entity_t *entity = entity_map_get(entity_map, entity_id, NULL); BSON_ASSERT(entity); entity_log_filter_push(entity, func, user_data); } void entity_map_log_filter_pop(entity_map_t *entity_map, const char *entity_id, log_filter_func_t *func, void *user_data) { entity_t *entity = entity_map_get(entity_map, entity_id, NULL); BSON_ASSERT(entity); entity_log_filter_pop(entity, func, user_data); } static log_message_t * log_message_new(const mongoc_structured_log_entry_t *entry) { log_message_t *log_message = NULL; log_message = bson_malloc0(sizeof(log_message_t)); log_message->component = mongoc_structured_log_entry_get_component(entry); log_message->level = mongoc_structured_log_entry_get_level(entry); log_message->message = mongoc_structured_log_entry_message_as_bson(entry); MONGOC_DEBUG("new structured log: %s %s %s", mongoc_structured_log_get_level_name(log_message->level), mongoc_structured_log_get_component_name(log_message->component), tmp_json(log_message->message)); return log_message; } static void log_message_destroy(log_message_t *log_message) { if (!log_message) { return; } bson_destroy(log_message->message); bson_free(log_message); } static entity_t * entity_new(entity_map_t *em, const char *type) { entity_t *entity = NULL; entity = bson_malloc0(sizeof(entity_t)); entity->type = bson_strdup(type); entity->entity_map = em; _mongoc_array_init(&entity->observe_events, sizeof(observe_event_t)); _mongoc_array_init(&entity->store_events, sizeof(store_event_t)); bson_mutex_init(&entity->log_mutex); return entity; } static void structured_log_cb(const mongoc_structured_log_entry_t *entry, void *user_data) { BSON_ASSERT_PARAM(entry); BSON_ASSERT_PARAM(user_data); entity_t *entity = (entity_t *)user_data; bson_mutex_lock(&entity->log_mutex); if (_entity_log_filter_accepts(entity, entry)) { log_message_t *log_message = log_message_new(entry); LL_APPEND(entity->log_messages, log_message); bson_mutex_unlock(&entity->log_mutex); } else { bson_mutex_unlock(&entity->log_mutex); bson_t *message_bson = mongoc_structured_log_entry_message_as_bson(entry); MONGOC_DEBUG("test IGNORED structured log: %s %s %s", mongoc_structured_log_get_level_name(mongoc_structured_log_entry_get_level(entry)), mongoc_structured_log_get_component_name(mongoc_structured_log_entry_get_component(entry)), tmp_json(message_bson)); bson_destroy(message_bson); } } bool should_observe_event(entity_t *client_entity, event_t *event) { { bson_iter_t event_iter; const char *event_command_name = bson_iter_init_find(&event_iter, event->serialized, "commandName") ? bson_iter_utf8(&event_iter, NULL) : NULL; if (event_command_name) { if (0 == strcmp(event_command_name, "configureFailPoint")) { return false; } if (client_entity->ignore_command_monitoring_events) { bson_iter_t ignore_iter; BSON_FOREACH(client_entity->ignore_command_monitoring_events, ignore_iter) { if (0 == strcmp(event_command_name, bson_iter_utf8(&ignore_iter, NULL))) { return false; } } } } } { observe_event_t *const begin = (observe_event_t *)client_entity->observe_events.data; observe_event_t *const end = begin + client_entity->observe_events.len; bool is_observed = false; for (observe_event_t *iter = begin; iter != end; ++iter) { if (bson_strcasecmp(iter->type, event->type) == 0) { is_observed = true; break; } } if (!is_observed) { return false; } } // Sensitive command events are only observed if explicitly requested return !event->is_sensitive_command || (client_entity->observe_sensitive_commands && *client_entity->observe_sensitive_commands); } static void event_store_or_destroy(entity_t *entity, event_t *event) { BSON_ASSERT_PARAM(entity); BSON_ASSERT_PARAM(event); // Takes ownership BSON_ASSERT(entity->entity_map); entity_map_t *const em = entity->entity_map; // Make additional copies as requested by storeEventsAsEntities { store_event_t *const begin = (store_event_t *)entity->store_events.data; store_event_t *const end = begin + entity->store_events.len; bson_error_t error = {0}; for (store_event_t *iter = begin; iter != end; ++iter) { if (bson_strcasecmp(iter->type, event->type) == 0) { mongoc_array_t *arr = entity_map_get_bson_array(em, iter->entity_id, &error); ASSERT_OR_PRINT(arr, error); bson_t *serialized_copy = bson_copy(event->serialized); _mongoc_array_append_val(arr, serialized_copy); // Transfer ownership. } } } if (should_observe_event(entity, event)) { // Transfer ownership of observed serialized events to the event list LL_APPEND(entity->events, event); } else { // Discard serialized events we are not observing event_destroy(event); } } static void command_started(const mongoc_apm_command_started_t *started) { entity_t *entity = (entity_t *)mongoc_apm_command_started_get_context(started); const bson_oid_t *const service_id = mongoc_apm_command_started_get_service_id(started); const bool is_sensitive = mongoc_apm_is_sensitive_command_message( mongoc_apm_command_started_get_command_name(started), mongoc_apm_command_started_get_command(started)); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("databaseName", cstr(mongoc_apm_command_started_get_database_name(started))), kv("commandName", cstr(mongoc_apm_command_started_get_command_name(started))), kv("requestId", int64(mongoc_apm_command_started_get_request_id(started))), kv("operationId", int64(mongoc_apm_command_started_get_operation_id(started))), kv("connectionId", cstr(mongoc_apm_command_started_get_host(started)->host_and_port)), kv("serverConnectionId", int64(mongoc_apm_command_started_get_server_connection_id_int64(started))), if (service_id, then(kv("serviceId", oid(service_id)))), kv("command", bson(*mongoc_apm_command_started_get_command(started)))); event_store_or_destroy(entity, event_new("commandStartedEvent", "command", serialized, is_sensitive)); } static void command_failed(const mongoc_apm_command_failed_t *failed) { entity_t *entity = (entity_t *)mongoc_apm_command_failed_get_context(failed); const bson_oid_t *const service_id = mongoc_apm_command_failed_get_service_id(failed); const bool is_sensitive = mongoc_apm_is_sensitive_command_message(mongoc_apm_command_failed_get_command_name(failed), mongoc_apm_command_failed_get_reply(failed)); bson_error_t error; mongoc_apm_command_failed_get_error(failed, &error); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("duration", int64(mongoc_apm_command_failed_get_duration(failed))), kv("commandName", cstr(mongoc_apm_command_failed_get_command_name(failed))), kv("databaseName", cstr(mongoc_apm_command_failed_get_database_name(failed))), kv("requestId", int64(mongoc_apm_command_failed_get_request_id(failed))), kv("operationId", int64(mongoc_apm_command_failed_get_operation_id(failed))), kv("connectionId", cstr(mongoc_apm_command_failed_get_host(failed)->host_and_port)), kv("serverConnectionId", int64(mongoc_apm_command_failed_get_server_connection_id_int64(failed))), if (service_id, then(kv("serviceId", oid(service_id)))), kv("failure", cstr(error.message))); event_store_or_destroy(entity, event_new("commandFailedEvent", "command", serialized, is_sensitive)); } static void command_succeeded(const mongoc_apm_command_succeeded_t *succeeded) { entity_t *entity = (entity_t *)mongoc_apm_command_succeeded_get_context(succeeded); const bson_oid_t *const service_id = mongoc_apm_command_succeeded_get_service_id(succeeded); const bool is_sensitive = mongoc_apm_is_sensitive_command_message( mongoc_apm_command_succeeded_get_command_name(succeeded), mongoc_apm_command_succeeded_get_reply(succeeded)); bson_t *serialized = bson_new(); bsonBuildAppend( *serialized, kv("duration", int64(mongoc_apm_command_succeeded_get_duration(succeeded))), kv("commandName", cstr(mongoc_apm_command_succeeded_get_command_name(succeeded))), kv("databaseName", cstr(mongoc_apm_command_succeeded_get_database_name(succeeded))), kv("requestId", int64(mongoc_apm_command_succeeded_get_request_id(succeeded))), kv("operationId", int64(mongoc_apm_command_succeeded_get_operation_id(succeeded))), kv("connectionId", cstr(mongoc_apm_command_succeeded_get_host(succeeded)->host_and_port)), kv("serverConnectionId", int64(mongoc_apm_command_succeeded_get_server_connection_id_int64(succeeded))), if (service_id, then(kv("serviceId", oid(service_id)))), kv("reply", bson(*mongoc_apm_command_succeeded_get_reply(succeeded)))); event_store_or_destroy(entity, event_new("commandSucceededEvent", "command", serialized, is_sensitive)); } static void server_changed(const mongoc_apm_server_changed_t *changed) { entity_t *entity = (entity_t *)mongoc_apm_server_changed_get_context(changed); bson_oid_t topology_id; mongoc_apm_server_changed_get_topology_id(changed, &topology_id); bson_t *serialized = bson_new(); const mongoc_server_description_t *previous_sd = mongoc_apm_server_changed_get_previous_description(changed); const mongoc_server_description_t *new_sd = mongoc_apm_server_changed_get_new_description(changed); // Limited to fields defined in the unified test schema mongoc_server_description_content_flags_t sd_flags = MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_TYPE; bsonBuildAppend( *serialized, kv("previousDescription", doc(do({ mongoc_server_description_append_contents_to_bson(previous_sd, bsonBuildContext.doc, sd_flags); }))), kv("newDescription", doc(do({ mongoc_server_description_append_contents_to_bson(new_sd, bsonBuildContext.doc, sd_flags); })))); event_store_or_destroy(entity, event_new("serverDescriptionChangedEvent", "sdam", serialized, false)); } static void topology_changed(const mongoc_apm_topology_changed_t *changed) { entity_t *entity = (entity_t *)mongoc_apm_topology_changed_get_context(changed); bson_oid_t topology_id; mongoc_apm_topology_changed_get_topology_id(changed, &topology_id); bson_t *serialized = bson_new(); const mongoc_topology_description_t *previous_td = mongoc_apm_topology_changed_get_previous_description(changed); const mongoc_topology_description_t *new_td = mongoc_apm_topology_changed_get_new_description(changed); // Limited to fields defined in the unified test schema mongoc_topology_description_content_flags_t td_flags = MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_TYPE; mongoc_server_description_content_flags_t sd_flags = 0; bsonBuildAppend( *serialized, kv("previousDescription", doc(do({ mongoc_topology_description_append_contents_to_bson(previous_td, bsonBuildContext.doc, td_flags, sd_flags); }))), kv("newDescription", doc(do({ mongoc_topology_description_append_contents_to_bson(new_td, bsonBuildContext.doc, td_flags, sd_flags); })))); event_store_or_destroy(entity, event_new("topologyDescriptionChangedEvent", "sdam", serialized, false)); } static void topology_opening(const mongoc_apm_topology_opening_t *opening) { entity_t *entity = (entity_t *)mongoc_apm_topology_opening_get_context(opening); bson_oid_t topology_id; mongoc_apm_topology_opening_get_topology_id(opening, &topology_id); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("topologyId", oid(&topology_id))); event_store_or_destroy(entity, event_new("topologyOpeningEvent", "sdam", serialized, false)); } static void topology_closed(const mongoc_apm_topology_closed_t *closed) { entity_t *entity = (entity_t *)mongoc_apm_topology_closed_get_context(closed); bson_oid_t topology_id; mongoc_apm_topology_closed_get_topology_id(closed, &topology_id); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("topologyId", oid(&topology_id))); event_store_or_destroy(entity, event_new("topologyClosedEvent", "sdam", serialized, false)); } static void server_heartbeat_started(const mongoc_apm_server_heartbeat_started_t *started) { entity_t *entity = (entity_t *)mongoc_apm_server_heartbeat_started_get_context(started); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("awaited", boolean(mongoc_apm_server_heartbeat_started_get_awaited(started)))); event_store_or_destroy(entity, event_new("serverHeartbeatStartedEvent", "sdam", serialized, false)); } static void server_heartbeat_succeeded(const mongoc_apm_server_heartbeat_succeeded_t *succeeded) { entity_t *entity = (entity_t *)mongoc_apm_server_heartbeat_succeeded_get_context(succeeded); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("awaited", boolean(mongoc_apm_server_heartbeat_succeeded_get_awaited(succeeded)))); event_store_or_destroy(entity, event_new("serverHeartbeatSucceededEvent", "sdam", serialized, false)); } static void server_heartbeat_failed(const mongoc_apm_server_heartbeat_failed_t *failed) { entity_t *entity = (entity_t *)mongoc_apm_server_heartbeat_failed_get_context(failed); bson_t *serialized = bson_new(); bsonBuildAppend(*serialized, kv("awaited", boolean(mongoc_apm_server_heartbeat_failed_get_awaited(failed)))); event_store_or_destroy(entity, event_new("serverHeartbeatFailedEvent", "sdam", serialized, false)); } static void set_command_started_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_command_started_cb(callbacks, command_started); } static void set_command_failed_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_command_failed_cb(callbacks, command_failed); } static void set_command_succeeded_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_command_succeeded_cb(callbacks, command_succeeded); } static void set_server_changed_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_server_changed_cb(callbacks, server_changed); } static void set_topology_changed_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_topology_changed_cb(callbacks, topology_changed); } static void set_topology_opening_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_topology_opening_cb(callbacks, topology_opening); } static void set_topology_closed_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_topology_closed_cb(callbacks, topology_closed); } static void set_server_heartbeat_started_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_server_heartbeat_started_cb(callbacks, server_heartbeat_started); } static void set_server_heartbeat_succeeded_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_server_heartbeat_succeeded_cb(callbacks, server_heartbeat_succeeded); } static void set_server_heartbeat_failed_cb(mongoc_apm_callbacks_t *callbacks) { mongoc_apm_set_server_heartbeat_failed_cb(callbacks, server_heartbeat_failed); } /* Set a callback for the indicated event type in a mongoc_apm_callbacks_t. * Safe to call multiple times for the same event: callbacks for a specific * event type are always the same. Returns 'true' if the event is known and * 'false' if unknown. If 'callbacks' is NULL, validates the 'type' without * taking any other action. */ static bool set_event_callback(mongoc_apm_callbacks_t *callbacks, const char *type) { typedef void (*set_func_t)(mongoc_apm_callbacks_t *); typedef struct _command_to_cb_t { const char *type; set_func_t set; } command_to_cb_t; static const command_to_cb_t commands[] = { {.type = "commandStartedEvent", .set = set_command_started_cb}, {.type = "commandFailedEvent", .set = set_command_failed_cb}, {.type = "commandSucceededEvent", .set = set_command_succeeded_cb}, {.type = "serverDescriptionChangedEvent", .set = set_server_changed_cb}, {.type = "topologyDescriptionChangedEvent", .set = set_topology_changed_cb}, {.type = "topologyOpeningEvent", .set = set_topology_opening_cb}, {.type = "topologyClosedEvent", .set = set_topology_closed_cb}, {.type = "serverHeartbeatStartedEvent", .set = set_server_heartbeat_started_cb}, {.type = "serverHeartbeatSucceededEvent", .set = set_server_heartbeat_succeeded_cb}, {.type = "serverHeartbeatFailedEvent", .set = set_server_heartbeat_failed_cb}, {.type = NULL, .set = NULL}, }; for (const command_to_cb_t *iter = commands; iter->type; ++iter) { if (bson_strcasecmp(type, iter->type) == 0) { if (callbacks) { iter->set(callbacks); } return true; } } return false; } static bool is_supported_event_type(const char *type) { return set_event_callback(NULL, type); } static void add_observe_event(entity_t *entity, const char *type) { observe_event_t event = {.type = bson_strdup(type)}; _mongoc_array_append_val(&entity->observe_events, event); } static void add_store_event(entity_t *entity, const char *type, const char *entity_id) { store_event_t event = {.type = bson_strdup(type), .entity_id = bson_strdup(entity_id)}; _mongoc_array_append_val(&entity->store_events, event); } entity_t * entity_client_new(entity_map_t *em, bson_t *bson, bson_error_t *error) { entity_t *entity = NULL; mongoc_client_t *client = NULL; mongoc_uri_t *uri = NULL; bool ret = false; mongoc_apm_callbacks_t *callbacks = NULL; bson_t *uri_options = NULL; bson_t *auto_encryption_opts = NULL; mongoc_structured_log_opts_t *log_opts = mongoc_structured_log_opts_new(); bool use_multiple_mongoses = false; bool use_multiple_mongoses_set = false; bool can_reduce_heartbeat = false; mongoc_server_api_t *api = NULL; char *errpath = NULL; char *err = NULL; const char *store_entity_id = NULL; entity = entity_new(em, "client"); callbacks = mongoc_apm_callbacks_new(); bsonParse( // *bson, // All clients require an ID string find(keyWithType("id", utf8), storeStrDup(entity->id)), else(error("A client 'id' string is required")), // Optional 'uriOptions' for the client find(key("uriOptions"), if (not(type(doc)), then(error("'uriOptions' must be a document value"))), storeDocDupPtr(uri_options)), // Optional 'useMultipleMongoses' bool find(key("useMultipleMongoses"), if (not(type(boolean)), then(error("'useMultipleMongoses' must be a bool value"))), do(use_multiple_mongoses_set = true), storeBool(use_multiple_mongoses)), // Events to observe: find(key("observeEvents"), if (not(type(array)), then(error("'observeEvents' must be an array"))), visitEach(case ( // Ensure all elements are strings: when(not(type(utf8)), error("Every 'observeEvents' element must be a string")), // Dispatch based on the event name: when(eval(is_supported_event_type(bson_iter_utf8(&bsonVisitIter, NULL))), do({ const char *const type = bson_iter_utf8(&bsonVisitIter, NULL); set_event_callback(callbacks, type); add_observe_event(entity, type); })), // Unsupported (but known) event names: when(eval(is_unsupported_event_type(bson_iter_utf8(&bsonVisitIter, NULL))), do(MONGOC_DEBUG("Skipping unsupported event type '%s'", bsonAs(cstr)))), // An unknown event name is a hard-error: else(do(test_error("Unknown event type '%s'", bsonAs(cstr))))))), // Command events to ignore find(key("ignoreCommandMonitoringEvents"), if (not(type(array)), then(error("'ignoreCommandMonitoringEvents' must be an array"))), visitEach(if (not(type(utf8)), then(error("Every 'ignoreCommandMonitoringEvents' " "element must be a string")))), storeDocDupPtr(entity->ignore_command_monitoring_events)), // Parse the serverApi, if present find(key("serverApi"), if (not(type(doc)), then(error("'serverApi' must be a document"))), parse( // The "version" string is required first: find(keyWithType("version", utf8), do({ mongoc_server_api_version_t ver; if (!mongoc_server_api_version_from_string(bsonAs(cstr), &ver)) { bsonParseError = "Invalid serverApi.version string"; } else { api = mongoc_server_api_new(ver); } })), else(error("Missing 'version' property in 'serverApi' object")), // Toggle strictness: find(key("strict"), if (not(type(boolean)), then(error("'serverApi.strict' must be a bool"))), do(mongoc_server_api_strict(api, bsonAs(boolean)))), // Toggle deprecation errors: find(key("deprecationErrors"), if (not(type(boolean)), then(error("serverApi.deprecationErrors must be a bool"))), do(mongoc_server_api_deprecation_errors(api, bsonAs(boolean)))))), // Toggle observation of sensitive commands find(key("observeSensitiveCommands"), if (not(type(boolean)), then(error("'observeSensitiveCommands' must be a bool"))), do({ bool *p = entity->observe_sensitive_commands = bson_malloc(sizeof(bool)); *p = bsonAs(boolean); })), // Which events should be available as entities: find(key("storeEventsAsEntities"), if (not(type(array)), then(error("'storeEventsAsEntities' must be an array"))), visitEach( parse(find(keyWithType("id", utf8), storeStrRef(store_entity_id), do({ if (!entity_map_add_bson_array(em, store_entity_id, error)) { test_error("failed to create storeEventsAsEntities " "entity '%s': %s", store_entity_id, error->message); } })), find(keyWithType("events", array), visitEach(case (when(not(type(utf8)), error("Every 'storeEventsAsEntities.events' " "element must be a string")), when(anyOf(iStrEqual("commandStartedEvent"), iStrEqual("commandFailedEvent"), iStrEqual("commandSucceededEvent")), do({ const char *const type = bson_iter_utf8(&bsonVisitIter, NULL); set_event_callback(callbacks, type); add_store_event(entity, type, store_entity_id); })), when(eval(is_unsupported_event_type(bson_iter_utf8(&bsonVisitIter, NULL))), do(MONGOC_DEBUG("Skipping unsupported event type '%s'", bsonAs(cstr)))), else(do(test_error("Unknown event type '%s'", bsonAs(cstr))))))), visitOthers( errorf(err, "Unexpected field '%s' in storeEventsAsEntities", bson_iter_key(&bsonVisitIter)))))), find(key("autoEncryptOpts"), if (not(type(doc)), then(error("'autoEncryptOpts' must be a document value"))), storeDocDupPtr(auto_encryption_opts)), // Log messages to observe: find(key("observeLogMessages"), if (not(type(doc)), then(error("'observeLogMessages' must be a document"))), do( { // Initialize all components to the lowest available level, and install a handler. BSON_ASSERT(mongoc_structured_log_opts_set_max_level_for_all_components( log_opts, MONGOC_STRUCTURED_LOG_LEVEL_EMERGENCY)); mongoc_structured_log_opts_set_handler(log_opts, structured_log_cb, entity); // From the Command Logging and Monitoring / Testing spec, unified tests MUST be run with their max // document length set to "a large value e.g. 10,000". Note that the default setting is 1000. mongoc_structured_log_opts_set_max_document_length(log_opts, 10000); }), visitEach( if (not(type(utf8)), then(error("Every value in 'observeLogMessages' must be a log level string"))), do({ const char *const component_name = bson_iter_key(&bsonVisitIter); mongoc_structured_log_component_t component; if (!mongoc_structured_log_get_named_component(component_name, &component)) { test_error("Unknown log component '%s' given in 'observeLogMessages'", component_name); } const char *const level_name = bson_iter_utf8(&bsonVisitIter, NULL); mongoc_structured_log_level_t level; if (!mongoc_structured_log_get_named_level(level_name, &level)) { test_error("Unknown log level '%s' given in 'observeLogMessages'", component_name); } BSON_ASSERT(mongoc_structured_log_opts_set_max_level_for_component(log_opts, component, level)); }))), visitOthers( dupPath(errpath), errorf(err, "At [%s]: Unknown key '%s' given in entity options", errpath, bson_iter_key(&bsonVisitIter)))); if (bsonParseError) { test_error("Error while parsing entity object: %s", bsonParseError); } // Build client's URI: { char *uri_noauth = test_framework_get_uri_str_no_auth(NULL); // Apply auth later. uri = mongoc_uri_new(uri_noauth); ASSERT(uri); bson_free(uri_noauth); } /* Apply "useMultipleMongoses" rules to URI. * If useMultipleMongoses is true, modify the connection string to add a * host. If useMultipleMongoses is false, require that the connection string * has one host. If useMultipleMongoses unspecified, make no assertion. */ if (test_framework_is_loadbalanced()) { /* Quoting the unified test runner specification: * If the topology type is LoadBalanced, [...] If useMultipleMongoses is * true or unset, the test runner MUST use the URI of the load balancer * fronting multiple servers. Otherwise, the test runner MUST use the URI * of the load balancer fronting a single server. */ if (!use_multiple_mongoses_set || use_multiple_mongoses == true) { mongoc_uri_destroy(uri); uri = test_framework_get_uri_multi_mongos_loadbalanced(); } } else if (use_multiple_mongoses_set) { if (!test_framework_uri_apply_multi_mongos(uri, use_multiple_mongoses, error)) { goto done; } } if (uri_options) { /* Apply URI options. */ if (!uri_apply_options(uri, uri_options, error)) { goto done; } } // Apply username/password (if applicable), unless URI requests OIDC. const char *auth_mech = mongoc_uri_get_auth_mechanism(uri); bool uri_requests_oidc = auth_mech && 0 == strcmp(auth_mech, "MONGODB-OIDC"); if (!uri_requests_oidc) { char *test_username = test_framework_get_admin_user(); char *test_password = test_framework_get_admin_password(); if (test_username && test_password) { // Test environment indicates server supports auth. mongoc_uri_set_username(uri, test_username); mongoc_uri_set_password(uri, test_password); } bson_free(test_username); bson_free(test_password); } char *azure_resource = test_framework_getenv("MONGOC_AZURE_RESOURCE"); const bool testing_azure_oidc = azure_resource != NULL; if (uri_requests_oidc && testing_azure_oidc) { mongoc_uri_set_mechanism_properties(uri, tmp_bson("{'ENVIRONMENT': 'azure', 'TOKEN_RESOURCE': '%s'}", azure_resource)); } bson_free(azure_resource); if (!mongoc_uri_has_option(uri, MONGOC_URI_HEARTBEATFREQUENCYMS)) { can_reduce_heartbeat = true; } if (can_reduce_heartbeat && em->reduced_heartbeat) { mongoc_uri_set_option_as_int32(uri, MONGOC_URI_HEARTBEATFREQUENCYMS, REDUCED_HEARTBEAT_FREQUENCY_MS); } client = test_framework_client_new_from_uri(uri, api); if (uri_requests_oidc && !testing_azure_oidc) { test_framework_set_oidc_callback(client); } test_framework_set_ssl_opts(client); mongoc_client_set_error_api(client, MONGOC_ERROR_API_VERSION_2); entity->value = client; mongoc_client_set_apm_callbacks(client, callbacks, entity); BSON_ASSERT(mongoc_client_set_structured_log_opts(client, log_opts)); if (can_reduce_heartbeat && em->reduced_heartbeat) { client->topology->min_heartbeat_frequency_msec = REDUCED_MIN_HEARTBEAT_FREQUENCY_MS; } if (auto_encryption_opts) { if (!_parse_and_set_auto_encryption_opts(client, auto_encryption_opts, error)) { goto done; } } ret = true; done: mongoc_uri_destroy(uri); mongoc_apm_callbacks_destroy(callbacks); mongoc_server_api_destroy(api); mongoc_structured_log_opts_destroy(log_opts); bson_destroy(uri_options); bson_destroy(auto_encryption_opts); if (!ret) { entity_destroy(entity); return NULL; } return entity; } static char * _entity_client_encryption_getenv(const char *name, bson_error_t *error) { char *res = NULL; BSON_ASSERT_PARAM(name); if (!(res = _mongoc_getenv(name))) { test_set_error(error, "missing required environment variable '%s'", name); } return res; } static bool _append_kms_provider_value_or_getenv( bson_t *bson, const char *key, const char *value, const char *env_name, bson_error_t *error) { BSON_ASSERT_PARAM(bson); BSON_ASSERT_PARAM(env_name); /* Prefer explicit value if available. */ if (value) { BSON_ASSERT(BSON_APPEND_UTF8(bson, key, value)); return true; } /* Fallback to environment variable. */ { char *const env_var = _entity_client_encryption_getenv(env_name, error); if (env_var) { BSON_ASSERT(BSON_APPEND_UTF8(bson, key, env_var)); bson_free(env_var); return true; } } return false; } static bool _validate_string_or_placeholder(const bson_iter_t *iter, bson_error_t *error) { BSON_ASSERT_PARAM(iter); /* Holds a UTF-8 string. */ if (BSON_ITER_HOLDS_UTF8(iter)) { return true; } /* Otherwise, must be a document with a single '$$placeholder' field. */ if (BSON_ITER_HOLDS_DOCUMENT(iter)) { bson_val_t *const bson_val = bson_val_from_iter(iter); bson_val_t *const expected = bson_val_from_json("{'$$placeholder': { '$exists': true }}"); bool is_match = false; BSON_ASSERT(bson_val); BSON_ASSERT(expected); is_match = bson_match(expected, bson_val, false, error); bson_val_destroy(bson_val); bson_val_destroy(expected); if (is_match) { return true; } } test_set_error(error, "expected string or placeholder value"); return false; } static bool _parse_kms_provider_aws( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error) { bson_t child; bson_iter_t iter; BSON_UNUSED(tls_opts); BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(kms_providers, provider, &child)); const bool need_temp_creds = bson_has_field(kms_doc, "sessionToken"); BSON_FOREACH(kms_doc, iter) { const char *const key = bson_iter_key(&iter); const char *const value = bson_iter_utf8(&iter, NULL); if (!_validate_string_or_placeholder(&iter, error)) { return false; } if (strcmp(key, "accessKeyId") == 0) { const char *envvar = "MONGOC_TEST_AWS_ACCESS_KEY_ID"; if (0 == strcmp(provider, "aws:name2")) { envvar = "MONGOC_TEST_AWSNAME2_ACCESS_KEY_ID"; } else if (need_temp_creds) { envvar = "MONGOC_TEST_AWS_TEMP_ACCESS_KEY_ID"; } if (!_append_kms_provider_value_or_getenv(&child, key, value, envvar, error)) { return false; } } else if (strcmp(key, "secretAccessKey") == 0) { const char *envvar = "MONGOC_TEST_AWS_SECRET_ACCESS_KEY"; if (0 == strcmp(provider, "aws:name2")) { envvar = "MONGOC_TEST_AWSNAME2_SECRET_ACCESS_KEY"; } else if (need_temp_creds) { envvar = "MONGOC_TEST_AWS_TEMP_SECRET_ACCESS_KEY"; } if (!_append_kms_provider_value_or_getenv(&child, key, value, envvar, error)) { return false; } } else if (strcmp(key, "sessionToken") == 0) { const char *envvar = "MONGOC_TEST_AWS_TEMP_SESSION_TOKEN"; if (!_append_kms_provider_value_or_getenv(&child, key, value, envvar, error)) { return false; } } else { test_set_error(error, "unexpected field '%s'", key); return false; } } BSON_ASSERT(bson_append_document_end(kms_providers, &child)); return true; } static bool _parse_kms_provider_azure( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error) { bson_t child; bson_iter_t iter; BSON_UNUSED(tls_opts); BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(kms_providers, provider, &child)); BSON_FOREACH(kms_doc, iter) { const char *const key = bson_iter_key(&iter); const char *const value = bson_iter_utf8(&iter, NULL); if (!_validate_string_or_placeholder(&iter, error)) { return false; } if (strcmp(key, "tenantId") == 0) { if (!_append_kms_provider_value_or_getenv(&child, key, value, "MONGOC_TEST_AZURE_TENANT_ID", error)) { return false; } } else if (strcmp(key, "clientId") == 0) { if (!_append_kms_provider_value_or_getenv(&child, key, value, "MONGOC_TEST_AZURE_CLIENT_ID", error)) { return false; } } else if (strcmp(key, "clientSecret") == 0) { if (!_append_kms_provider_value_or_getenv(&child, key, value, "MONGOC_TEST_AZURE_CLIENT_SECRET", error)) { return false; } } else { test_set_error(error, "unexpected field '%s'", value); return false; } } BSON_ASSERT(bson_append_document_end(kms_providers, &child)); return true; } static bool _parse_kms_provider_gcp( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error) { bson_t child; bson_iter_t iter; BSON_UNUSED(tls_opts); BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(kms_providers, provider, &child)); BSON_FOREACH(kms_doc, iter) { const char *const key = bson_iter_key(&iter); const char *const value = bson_iter_utf8(&iter, NULL); if (!_validate_string_or_placeholder(&iter, error)) { return false; } if (strcmp(key, "email") == 0) { if (!_append_kms_provider_value_or_getenv(&child, key, value, "MONGOC_TEST_GCP_EMAIL", error)) { return false; } } else if (strcmp(key, "privateKey") == 0) { if (!_append_kms_provider_value_or_getenv(&child, key, value, "MONGOC_TEST_GCP_PRIVATEKEY", error)) { return false; } } else if (strcmp(key, "endpoint") == 0) { if (value) { BSON_ASSERT(BSON_APPEND_UTF8(&child, key, value)); } } else { test_set_error(error, "unexpected field '%s'", value); return false; } } BSON_ASSERT(bson_append_document_end(kms_providers, &child)); return true; } static bool _parse_kms_provider_kmip( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error) { bson_t child; bson_iter_t iter; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(kms_providers, provider, &child)); BSON_FOREACH(kms_doc, iter) { const char *const key = bson_iter_key(&iter); const char *const value = bson_iter_utf8(&iter, NULL); if (!_validate_string_or_placeholder(&iter, error)) { return false; } if (strcmp(key, "endpoint") == 0) { if (value) { BSON_ASSERT(BSON_APPEND_UTF8(&child, key, value)); } else { /* Expect KMIP test server running on port 5698. */ BSON_ASSERT(BSON_APPEND_UTF8(&child, key, "localhost:5698")); } /* Configure tlsOptions to enable KMIP TLS connections. */ { bson_t tls_child; BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(tls_opts, provider, &tls_child)); if (!_append_kms_provider_value_or_getenv( &tls_child, "tlsCAFile", NULL, "MONGOC_TEST_CSFLE_TLS_CA_FILE", error)) { return false; } if (!_append_kms_provider_value_or_getenv( &tls_child, "tlsCertificateKeyFile", NULL, "MONGOC_TEST_CSFLE_TLS_CERTIFICATE_KEY_FILE", error)) { return false; } BSON_ASSERT(bson_append_document_end(tls_opts, &tls_child)); } } else { test_set_error(error, "unexpected field '%s'", value); return false; } } BSON_ASSERT(bson_append_document_end(kms_providers, &child)); return true; } static bool _parse_kms_provider_local( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error) { bson_t child; bson_iter_t iter; BSON_UNUSED(tls_opts); BSON_ASSERT(BSON_APPEND_DOCUMENT_BEGIN(kms_providers, provider, &child)); BSON_FOREACH(kms_doc, iter) { const char *const key = bson_iter_key(&iter); const char *const value = bson_iter_utf8(&iter, NULL); if (!_validate_string_or_placeholder(&iter, error)) { return false; } if (strcmp(key, "key") == 0) { if (value) { BSON_ASSERT(BSON_APPEND_UTF8(&child, key, value)); } else { /* LOCAL_MASTERKEY in base64 encoding as defined in Client Side * Encryption Tests spec. */ const char local_masterkey[] = "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6N" "mdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZG" "JkTXVyZG9uSjFk"; uint8_t data[96]; BSON_ASSERT(mcommon_b64_pton(local_masterkey, data, sizeof(local_masterkey)) == 96); BSON_APPEND_BINARY(&child, "key", BSON_SUBTYPE_BINARY, data, 96); } } else { test_set_error(error, "unexpected field '%s'", value); return false; } } BSON_ASSERT(bson_append_document_end(kms_providers, &child)); return true; } static bool _get_kms_providers_docs(bson_t *kms_from_file, bson_t *kms_providers, bson_t *tls_opts, bson_error_t *error) { BSON_ASSERT_PARAM(kms_from_file); BSON_ASSERT_PARAM(kms_providers); BSON_ASSERT_PARAM(tls_opts); BSON_OPTIONAL_PARAM(error); /* Map provider to corresponding KMS parser. */ typedef struct _prov_map_t { const char *provider; bool (*parse)( bson_t *kms_providers, bson_t *tls_opts, const char *provider, bson_t *kms_doc, bson_error_t *error); } prov_map_t; const prov_map_t prov_map[] = {{.provider = "aws", .parse = _parse_kms_provider_aws}, {.provider = "aws:name1", .parse = _parse_kms_provider_aws}, {.provider = "aws:name2", .parse = _parse_kms_provider_aws}, {.provider = "azure", .parse = _parse_kms_provider_azure}, {.provider = "azure:name1", .parse = _parse_kms_provider_azure}, {.provider = "gcp", .parse = _parse_kms_provider_gcp}, {.provider = "gcp:name1", .parse = _parse_kms_provider_gcp}, {.provider = "kmip", .parse = _parse_kms_provider_kmip}, {.provider = "kmip:name1", .parse = _parse_kms_provider_kmip}, {.provider = "local", .parse = _parse_kms_provider_local}, {.provider = "local:name1", .parse = _parse_kms_provider_local}, {.provider = "local:name2", .parse = _parse_kms_provider_local}}; const size_t prov_map_size = sizeof(prov_map) / sizeof(prov_map[0]); bson_iter_t iter; BSON_FOREACH(kms_from_file, iter) { const char *const provider = bson_iter_key(&iter); bson_t kms_doc; size_t i = 0u; bool found = false; if (!bson_init_from_value(&kms_doc, bson_iter_value(&iter))) { test_set_error(error, "kmsProviders field '%s' is not a valid document", provider); return false; } for (i = 0u; i < prov_map_size; ++i) { if (strcmp(provider, prov_map[i].provider) == 0) { found = prov_map[i].parse(kms_providers, tls_opts, provider, &kms_doc, error); goto parsed; } } test_set_error(error, "unexpected KMS provider '%s'", provider); parsed: bson_destroy(&kms_doc); if (!found) { return false; } } return true; } static void maybe_set_extra_crypt_shared(bson_t *extra) { if (bson_has_field(extra, "cryptSharedLibPath")) { return; // Already set. } char *const path = test_framework_getenv("MONGOC_TEST_CRYPT_SHARED_LIB_PATH"); if (path) { BSON_APPEND_UTF8(extra, "cryptSharedLibPath", path); bson_free(path); } } static bool _parse_and_set_auto_encryption_opts(mongoc_client_t *client, bson_t *opts, bson_error_t *error) { bool ret = false; mongoc_auto_encryption_opts_t *auto_encryption_opts = mongoc_auto_encryption_opts_new(); bson_t kms_providers = BSON_INITIALIZER; bson_t tls_opts = BSON_INITIALIZER; BSON_ASSERT(client); bson_t *extra = NULL; bson_parser_t *const parser = bson_parser_new(); bson_t *kms_providers_raw; bson_parser_doc(parser, "kmsProviders", &kms_providers_raw); char *keyvault_ns; bson_parser_utf8(parser, "keyVaultNamespace", &keyvault_ns); bson_t *schema_map; bson_parser_doc_optional(parser, "schemaMap", &schema_map); bool *bypass_auto_encryption; bson_parser_bool_optional(parser, "bypassAutoEncryption", &bypass_auto_encryption); bool *bypass_query_analysis; bson_parser_bool_optional(parser, "bypassQueryAnalysis", &bypass_query_analysis); bson_t *encrypted_fields_map; bson_parser_doc_optional(parser, "encryptedFieldsMap", &encrypted_fields_map); int64_t *key_expiration_ms; bson_parser_int_optional(parser, "keyExpirationMS", &key_expiration_ms); bson_t *extra_options; bson_parser_doc_optional(parser, "extraOptions", &extra_options); if (!bson_parser_parse(parser, opts, error)) { goto done; } { if (!_get_kms_providers_docs(kms_providers_raw, &kms_providers, &tls_opts, error)) { goto done; } mongoc_auto_encryption_opts_set_kms_providers(auto_encryption_opts, &kms_providers); mongoc_auto_encryption_opts_set_tls_opts(auto_encryption_opts, &tls_opts); } { // keyVaultNamespace char *dot = strstr(keyvault_ns, "."); BSON_ASSERT(dot); char *db_name = bson_strndup(keyvault_ns, dot - keyvault_ns); char *coll_name = bson_strdup(dot + 1); mongoc_auto_encryption_opts_set_keyvault_namespace(auto_encryption_opts, db_name, coll_name); bson_free(db_name); bson_free(coll_name); } if (schema_map) { mongoc_auto_encryption_opts_set_schema_map(auto_encryption_opts, schema_map); } if (bypass_auto_encryption) { mongoc_auto_encryption_opts_set_bypass_auto_encryption(auto_encryption_opts, *bypass_auto_encryption); } if (bypass_query_analysis) { mongoc_auto_encryption_opts_set_bypass_query_analysis(auto_encryption_opts, *bypass_query_analysis); } if (encrypted_fields_map) { mongoc_auto_encryption_opts_set_encrypted_fields_map(auto_encryption_opts, encrypted_fields_map); } if (key_expiration_ms) { mongoc_auto_encryption_opts_set_key_expiration(auto_encryption_opts, *key_expiration_ms); } if (extra_options) { extra = bson_copy(extra_options); } else { extra = bson_new(); } maybe_set_extra_crypt_shared(extra); mongoc_auto_encryption_opts_set_extra(auto_encryption_opts, extra); if (!mongoc_client_enable_auto_encryption(client, auto_encryption_opts, error)) { goto done; } ret = true; done: bson_destroy(extra); mongoc_auto_encryption_opts_destroy(auto_encryption_opts); bson_destroy(&kms_providers); bson_destroy(&tls_opts); bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool _parse_and_set_kms_providers(mongoc_client_encryption_opts_t *ce_opts, bson_t *kms_from_file, bson_error_t *error) { bool ret = false; bson_t kms_providers = BSON_INITIALIZER; bson_t tls_opts = BSON_INITIALIZER; if (!_get_kms_providers_docs(kms_from_file, &kms_providers, &tls_opts, error)) { goto done; } mongoc_client_encryption_opts_set_kms_providers(ce_opts, &kms_providers); mongoc_client_encryption_opts_set_tls_opts(ce_opts, &tls_opts); ret = true; done: bson_destroy(&kms_providers); bson_destroy(&tls_opts); return ret; } entity_t * entity_client_encryption_new(entity_map_t *entity_map, bson_t *bson, bson_error_t *error) { entity_t *const entity = entity_new(entity_map, "clientEncryption"); bson_parser_t *const parser = bson_parser_new(); mongoc_client_encryption_opts_t *const ce_opts = mongoc_client_encryption_opts_new(); bson_t *ce_opts_bson = NULL; bson_parser_utf8(parser, "id", &entity->id); bson_parser_doc(parser, "clientEncryptionOpts", &ce_opts_bson); if (!bson_parser_parse(parser, bson, error)) { goto done; } { bson_parser_t *const ce_opts_parser = bson_parser_new(); bool ce_opts_success = false; char *client_id = NULL; char *kv_ns = NULL; bson_t *kms = NULL; int64_t *key_expiration; bson_parser_utf8(ce_opts_parser, "keyVaultClient", &client_id); bson_parser_utf8(ce_opts_parser, "keyVaultNamespace", &kv_ns); bson_parser_doc(ce_opts_parser, "kmsProviders", &kms); bson_parser_int_optional(ce_opts_parser, "keyExpirationMS", &key_expiration); if (!bson_parser_parse(ce_opts_parser, ce_opts_bson, error)) { goto ce_opts_done; } { entity_t *const client_entity = entity_map_get(entity_map, client_id, error); mongoc_client_t *client = NULL; if (!client_entity) { goto ce_opts_done; } if (!client_entity->value) { test_set_error(error, "client '%s' is closed", client_id); goto ce_opts_done; } BSON_ASSERT((client = (mongoc_client_t *)client_entity->value)); mongoc_client_encryption_opts_set_keyvault_client(ce_opts, client); } { char *const dot = strchr(kv_ns, '.'); const char *db = NULL; const char *coll = NULL; if (!dot) { test_set_error(error, "keyVaultNamespace does not have required dot separator"); goto ce_opts_done; } *dot = '\0'; /* e.g. "keyvault.datakeys" -> "keyvault\0datakeys". */ db = kv_ns; /* "keyvault" (due to null terminator) */ coll = dot + 1; /* "datakeys" */ if (strchr(coll, '.') != NULL) { test_set_error(error, "keyVaultNamespace contains more than one dot separator"); goto ce_opts_done; } mongoc_client_encryption_opts_set_keyvault_namespace(ce_opts, db, coll); } if (key_expiration) { BSON_ASSERT(*key_expiration >= 0); mongoc_client_encryption_opts_set_key_expiration(ce_opts, (uint64_t)*key_expiration); } if (!_parse_and_set_kms_providers(ce_opts, kms, error)) { goto ce_opts_done; } ce_opts_success = true; ce_opts_done: bson_parser_destroy_with_parsed_fields(ce_opts_parser); if (!ce_opts_success) { goto done; } } entity->value = mongoc_client_encryption_new(ce_opts, error); done: mongoc_client_encryption_opts_destroy(ce_opts); bson_destroy(ce_opts_bson); bson_parser_destroy(parser); if (!entity->value) { entity_destroy(entity); return NULL; } return entity; } typedef struct { mongoc_read_concern_t *rc; mongoc_write_concern_t *wc; mongoc_read_prefs_t *rp; bson_t *encrypted_fields; } coll_or_db_opts_t; static coll_or_db_opts_t * coll_or_db_opts_new(void) { return bson_malloc0(sizeof(coll_or_db_opts_t)); } static void coll_or_db_opts_destroy(coll_or_db_opts_t *opts) { if (!opts) { return; } mongoc_read_concern_destroy(opts->rc); mongoc_read_prefs_destroy(opts->rp); mongoc_write_concern_destroy(opts->wc); bson_destroy(opts->encrypted_fields); bson_free(opts); } static bool coll_or_db_opts_parse(coll_or_db_opts_t *opts, bson_t *in, bson_error_t *error) { bson_parser_t *parser = NULL; bool ret = false; parser = bson_parser_new(); bson_parser_read_concern_optional(parser, &opts->rc); bson_parser_read_prefs_optional(parser, &opts->rp); bson_parser_write_concern_optional(parser, &opts->wc); if (!bson_parser_parse(parser, in, error)) { goto done; } ret = true; done: bson_parser_destroy(parser); return ret; } entity_t * entity_database_new(entity_map_t *entity_map, bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; entity_t *entity = NULL; const entity_t *client_entity; char *client_id = NULL; mongoc_client_t *client = NULL; mongoc_database_t *db = NULL; char *database_name = NULL; bool ret = false; bson_t *database_opts = NULL; coll_or_db_opts_t *coll_or_db_opts = NULL; entity = entity_new(entity_map, "database"); parser = bson_parser_new(); bson_parser_utf8(parser, "id", &entity->id); bson_parser_utf8(parser, "client", &client_id); bson_parser_utf8(parser, "databaseName", &database_name); bson_parser_doc_optional(parser, "databaseOptions", &database_opts); if (!bson_parser_parse(parser, bson, error)) { goto done; } client_entity = entity_map_get(entity_map, client_id, error); if (!client_entity) { goto done; } if (!client_entity) { test_set_error(error, "client '%s' is closed", client_id); goto done; } client = (mongoc_client_t *)client_entity->value; db = mongoc_client_get_database(client, database_name); entity->value = (void *)db; if (database_opts) { coll_or_db_opts = coll_or_db_opts_new(); if (!coll_or_db_opts_parse(coll_or_db_opts, database_opts, error)) { goto done; } if (coll_or_db_opts->rc) { mongoc_database_set_read_concern(db, coll_or_db_opts->rc); } if (coll_or_db_opts->rp) { mongoc_database_set_read_prefs(db, coll_or_db_opts->rp); } if (coll_or_db_opts->wc) { mongoc_database_set_write_concern(db, coll_or_db_opts->wc); } } ret = true; done: bson_free(client_id); bson_free(database_name); bson_parser_destroy(parser); bson_destroy(database_opts); coll_or_db_opts_destroy(coll_or_db_opts); if (!ret) { entity_destroy(entity); return NULL; } return entity; } entity_t * entity_collection_new(entity_map_t *entity_map, bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; entity_t *entity = NULL; entity_t *database_entity = NULL; mongoc_database_t *database = NULL; mongoc_collection_t *coll = NULL; bool ret = false; char *database_id = NULL; char *collection_name = NULL; bson_t *collection_opts = NULL; coll_or_db_opts_t *coll_or_db_opts = NULL; entity = entity_new(entity_map, "collection"); parser = bson_parser_new(); bson_parser_utf8(parser, "id", &entity->id); bson_parser_utf8(parser, "database", &database_id); bson_parser_utf8(parser, "collectionName", &collection_name); bson_parser_doc_optional(parser, "collectionOptions", &collection_opts); if (!bson_parser_parse(parser, bson, error)) { goto done; } database_entity = entity_map_get(entity_map, database_id, error); if (!database_entity) { goto done; } database = (mongoc_database_t *)database_entity->value; coll = mongoc_database_get_collection(database, collection_name); entity->value = (void *)coll; if (collection_opts) { coll_or_db_opts = coll_or_db_opts_new(); if (!coll_or_db_opts_parse(coll_or_db_opts, collection_opts, error)) { goto done; } if (coll_or_db_opts->rc) { mongoc_collection_set_read_concern(coll, coll_or_db_opts->rc); } if (coll_or_db_opts->rp) { mongoc_collection_set_read_prefs(coll, coll_or_db_opts->rp); } if (coll_or_db_opts->wc) { mongoc_collection_set_write_concern(coll, coll_or_db_opts->wc); } } ret = true; done: bson_free(collection_name); bson_free(database_id); bson_parser_destroy(parser); bson_destroy(collection_opts); coll_or_db_opts_destroy(coll_or_db_opts); if (!ret) { entity_destroy(entity); return NULL; } return entity; } mongoc_session_opt_t * session_opts_new(bson_t *bson, bson_error_t *error) { bool ret = false; mongoc_session_opt_t *opts = NULL; bson_parser_t *bp = NULL; bson_parser_t *bp_opts = NULL; bool *causal_consistency = NULL; bool *snapshot = NULL; bson_t *default_transaction_opts = NULL; mongoc_write_concern_t *wc = NULL; mongoc_read_concern_t *rc = NULL; mongoc_read_prefs_t *rp = NULL; mongoc_transaction_opt_t *topts = NULL; bp = bson_parser_new(); bson_parser_bool_optional(bp, "causalConsistency", &causal_consistency); bson_parser_bool_optional(bp, "snapshot", &snapshot); bson_parser_doc_optional(bp, "defaultTransactionOptions", &default_transaction_opts); if (!bson_parser_parse(bp, bson, error)) { goto done; } opts = mongoc_session_opts_new(); if (causal_consistency) { mongoc_session_opts_set_causal_consistency(opts, *causal_consistency); } if (snapshot) { mongoc_session_opts_set_snapshot(opts, *snapshot); } if (default_transaction_opts) { bp_opts = bson_parser_new(); topts = mongoc_transaction_opts_new(); bson_parser_write_concern_optional(bp_opts, &wc); bson_parser_read_concern_optional(bp_opts, &rc); bson_parser_read_prefs_optional(bp_opts, &rp); if (!bson_parser_parse(bp_opts, default_transaction_opts, error)) { goto done; } if (wc) { mongoc_transaction_opts_set_write_concern(topts, wc); } if (rc) { mongoc_transaction_opts_set_read_concern(topts, rc); } if (rp) { mongoc_transaction_opts_set_read_prefs(topts, rp); } mongoc_session_opts_set_default_transaction_opts(opts, topts); } ret = true; done: bson_parser_destroy_with_parsed_fields(bp); bson_parser_destroy_with_parsed_fields(bp_opts); mongoc_transaction_opts_destroy(topts); if (!ret) { mongoc_session_opts_destroy(opts); return NULL; } return opts; } entity_t * entity_session_new(entity_map_t *entity_map, bson_t *bson, const bson_t *cluster_time_after_initial_data, bson_error_t *error) { bson_parser_t *parser = NULL; entity_t *entity = NULL; entity_t *client_entity = NULL; mongoc_client_t *client = NULL; char *client_id = NULL; bson_t *session_opts_bson = NULL; mongoc_session_opt_t *session_opts = NULL; bool ret = false; mongoc_client_session_t *session = NULL; entity = entity_new(entity_map, "session"); parser = bson_parser_new(); bson_parser_utf8(parser, "id", &entity->id); bson_parser_utf8(parser, "client", &client_id); bson_parser_doc_optional(parser, "sessionOptions", &session_opts_bson); if (!bson_parser_parse(parser, bson, error)) { goto done; } client_entity = entity_map_get(entity_map, client_id, error); if (!client_entity) { goto done; } client = (mongoc_client_t *)client_entity->value; if (!client) { test_set_error(error, "client '%s' is closed", client_id); goto done; } if (session_opts_bson) { session_opts = session_opts_new(session_opts_bson, error); if (!session_opts) { goto done; } } session = mongoc_client_start_session(client, session_opts, error); if (!session) { goto done; } if (cluster_time_after_initial_data) { mongoc_client_session_advance_cluster_time(session, cluster_time_after_initial_data); } entity->value = session; /* Ending a session destroys the session object. * After a session is ended, match assertions may be made on the lsid. * So the lsid is copied from the session object on creation. */ entity->lsid = bson_copy(mongoc_client_session_get_lsid(session)); ret = true; entity->session_client_id = bson_strdup(client_id); done: mongoc_session_opts_destroy(session_opts); bson_free(client_id); bson_destroy(session_opts_bson); bson_parser_destroy(parser); if (!ret) { entity_destroy(entity); return NULL; } return entity; } entity_t * entity_bucket_new(entity_map_t *entity_map, bson_t *bson, bson_error_t *error) { bson_parser_t *parser = NULL; entity_t *entity = NULL; mongoc_database_t *database = NULL; char *database_id = NULL; bool ret = false; bson_t *bucket_opts_bson = NULL; bson_parser_t *opts_parser = NULL; mongoc_read_concern_t *rc = NULL; mongoc_write_concern_t *wc = NULL; bson_t *opts = NULL; entity = entity_new(entity_map, "bucket"); parser = bson_parser_new(); bson_parser_utf8(parser, "id", &entity->id); bson_parser_utf8(parser, "database", &database_id); bson_parser_doc_optional(parser, "bucketOptions", &bucket_opts_bson); if (!bson_parser_parse(parser, bson, error)) { goto done; } database = entity_map_get_database(entity_map, database_id, error); if (!database) { goto done; } opts_parser = bson_parser_new(); bson_parser_allow_extra(opts_parser, true); bson_parser_read_concern_optional(opts_parser, &rc); bson_parser_write_concern_optional(opts_parser, &wc); opts = bson_new(); bson_concat(opts, bson_parser_get_extra(opts_parser)); if (rc) { mongoc_read_concern_append(rc, opts); } if (wc) { mongoc_write_concern_append(wc, opts); } entity->value = mongoc_gridfs_bucket_new(database, opts, NULL /* read prefs */, error); if (!entity->value) { goto done; } ret = true; done: bson_free(database_id); bson_destroy(bucket_opts_bson); bson_parser_destroy(parser); bson_parser_destroy_with_parsed_fields(opts_parser); bson_destroy(opts); if (!ret) { entity_destroy(entity); return NULL; } return entity; } /* Caveat: The spec encourages, but does not require, that entities are defined * in dependency order: * "Test files SHOULD define entities in dependency order, such that all * referenced entities (e.g. client) are defined before any of their dependent * entities (e.g. database, session)." * If a test ever does break this pattern (flipping dependency order), that can * be solved by: * - creating C objects lazily in entity_map_get. * - creating entities in dependency order (all clients first, then databases, * etc.) * The current implementation here does the simple thing and creates the C * object immediately. */ bool entity_map_create(entity_map_t *entity_map, bson_t *bson, const bson_t *cluster_time_after_initial_data, bson_error_t *error) { bson_iter_t iter; const char *entity_type; bson_t entity_bson; entity_t *entity = NULL; entity_t *entity_iter = NULL; bool ret = false; bson_iter_init(&iter, bson); if (!bson_iter_next(&iter)) { test_set_error(error, "Empty entity"); goto done; } entity_type = bson_iter_key(&iter); bson_iter_bson(&iter, &entity_bson); if (bson_iter_next(&iter)) { test_set_error(error, "Extra field in entity: %s: %s", bson_iter_key(&iter), tmp_json(bson)); goto done; } if (0 == strcmp(entity_type, "client")) { entity = entity_client_new(entity_map, &entity_bson, error); } else if (0 == strcmp(entity_type, "clientEncryption")) { entity = entity_client_encryption_new(entity_map, &entity_bson, error); } else if (0 == strcmp(entity_type, "database")) { entity = entity_database_new(entity_map, &entity_bson, error); } else if (0 == strcmp(entity_type, "collection")) { entity = entity_collection_new(entity_map, &entity_bson, error); } else if (0 == strcmp(entity_type, "session")) { entity = entity_session_new(entity_map, &entity_bson, cluster_time_after_initial_data, error); } else if (0 == strcmp(entity_type, "bucket")) { entity = entity_bucket_new(entity_map, &entity_bson, error); } else { test_set_error(error, "Unknown entity type: %s: %s", entity_type, tmp_json(bson)); goto done; } if (!entity) { goto done; } LL_FOREACH(entity_map->entities, entity_iter) { if (0 == strcmp(entity_iter->id, entity->id)) { test_set_error(error, "Attempting to create duplicate entity: '%s'", entity->id); entity_destroy(entity); goto done; } } ret = true; done: if (!ret) { entity_destroy(entity); } else { LL_PREPEND(entity_map->entities, entity); } return ret; } static bool entity_close(entity_t *entity, bson_error_t *error) { BSON_ASSERT_PARAM(entity); /* Note that the unified test spec says tests SHOULD avoid using entities * after close, but the SDAM tests do require access to clients after close * for good reason: to check the log messages emitted over a full client * life cycle. * * For the entity types that require 'close' support, the closed state is * represented in this driver by value == NULL. */ if (0 == strcmp("client", entity->type)) { mongoc_client_t *client = (mongoc_client_t *)entity->value; mongoc_client_destroy(client); } else if (0 == strcmp("changestream", entity->type)) { mongoc_change_stream_t *changestream = (mongoc_change_stream_t *)entity->value; mongoc_change_stream_destroy(changestream); } else if (0 == strcmp("findcursor", entity->type)) { entity_findcursor_t *findcursor = (entity_findcursor_t *)entity->value; if (findcursor) { mongoc_cursor_destroy(findcursor->cursor); bson_free(findcursor); } } else { test_set_error(error, "Attempting to close unsupported entity type: %s, id: %s", entity->type, entity->id); return false; } entity->value = NULL; return true; } static void entity_destroy(entity_t *entity) { event_t *event = NULL; if (!entity) { return; } BSON_ASSERT(entity->type); // Note that entities which can be 'close'd chain their destructors via close, // to avoid proliferating duplicates of the per-type finalization steps. if (0 == strcmp("client", entity->type)) { BSON_ASSERT(entity_close(entity, NULL)); } else if (0 == strcmp("clientEncryption", entity->type)) { mongoc_client_encryption_t *ce = (mongoc_client_encryption_t *)entity->value; mongoc_client_encryption_destroy(ce); } else if (0 == strcmp("database", entity->type)) { mongoc_database_t *db = (mongoc_database_t *)entity->value; mongoc_database_destroy(db); } else if (0 == strcmp("collection", entity->type)) { mongoc_collection_t *coll = (mongoc_collection_t *)entity->value; mongoc_collection_destroy(coll); } else if (0 == strcmp("session", entity->type)) { mongoc_client_session_t *sess = (mongoc_client_session_t *)entity->value; mongoc_client_session_destroy(sess); } else if (0 == strcmp("changestream", entity->type)) { BSON_ASSERT(entity_close(entity, NULL)); } else if (0 == strcmp("bson", entity->type)) { bson_val_t *value = entity->value; bson_val_destroy(value); } else if (0 == strcmp("bucket", entity->type)) { mongoc_gridfs_bucket_t *bucket = entity->value; mongoc_gridfs_bucket_destroy(bucket); } else if (0 == strcmp("findcursor", entity->type)) { BSON_ASSERT(entity_close(entity, NULL)); } else if (0 == strcmp("bson_array", entity->type)) { mongoc_array_t *array = entity->value; bson_t **const begin = array->data; bson_t **const end = begin + array->len; for (bson_t **iter = begin; iter != end; ++iter) { bson_destroy(*iter); } _mongoc_array_destroy(array); bson_free(array); } else if (0 == strcmp("size_t", entity->type)) { size_t *v = entity->value; bson_free(v); } else if (0 == strcmp("topologyDescription", entity->type)) { mongoc_topology_description_t *td = (mongoc_topology_description_t *)entity->value; mongoc_topology_description_destroy(td); } else { test_error("Attempting to destroy unrecognized entity type: %s, id: %s", entity->type, entity->id); } { event_t *tmp; LL_FOREACH_SAFE(entity->events, event, tmp) { event_destroy(event); } } { // No reason to take the log_messages_mutex here; log handlers are stopped above when we delete clients. log_message_t *log_message, *tmp; LL_FOREACH_SAFE(entity->log_messages, log_message, tmp) { log_message_destroy(log_message); } } { observe_event_t *const begin = (observe_event_t *)entity->observe_events.data; observe_event_t *const end = begin + entity->observe_events.len; for (observe_event_t *iter = begin; iter != end; ++iter) { bson_free(iter->type); } _mongoc_array_destroy(&entity->observe_events); } { store_event_t *const begin = (store_event_t *)entity->store_events.data; store_event_t *const end = begin + entity->store_events.len; for (store_event_t *iter = begin; iter != end; ++iter) { bson_free(iter->type); bson_free(iter->entity_id); } _mongoc_array_destroy(&entity->store_events); } BSON_ASSERT(NULL == entity->log_filters); bson_mutex_destroy(&entity->log_mutex); bson_destroy(entity->ignore_command_monitoring_events); bson_free(entity->type); bson_free(entity->id); bson_destroy(entity->lsid); bson_free(entity->session_client_id); bson_free(entity->observe_sensitive_commands); bson_free(entity); } entity_t * entity_map_get(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = NULL; LL_FOREACH(entity_map->entities, entity) { if (0 == strcmp(entity->id, id)) { return entity; } } test_set_error(error, "Entity '%s' not found", id); return NULL; } bool entity_map_close(entity_map_t *em, const char *id, bson_error_t *error) { entity_t *entity = entity_map_get(em, id, error); if (!entity) { return false; } return entity_close(entity, error); } static entity_t * _entity_map_get_by_type(entity_map_t *entity_map, const char *id, const char *type, bson_error_t *error) { entity_t *entity = NULL; entity = entity_map_get(entity_map, id, error); if (!entity) { return NULL; } if (0 != strcmp(entity->type, type)) { test_set_error(error, "Unexpected entity type. Expected: %s, got %s", type, entity->type); return NULL; } return entity; } mongoc_client_t * entity_map_get_client(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "client", error); if (!entity) { return NULL; } if (!entity->value) { test_set_error(error, "client '%s' is closed", id); } return (mongoc_client_t *)entity->value; } mongoc_client_encryption_t * entity_map_get_client_encryption(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "clientEncryption", error); if (!entity) { return NULL; } return (mongoc_client_encryption_t *)entity->value; } mongoc_database_t * entity_map_get_database(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "database", error); if (!entity) { return NULL; } return (mongoc_database_t *)entity->value; } mongoc_collection_t * entity_map_get_collection(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "collection", error); if (!entity) { return NULL; } return (mongoc_collection_t *)entity->value; } mongoc_change_stream_t * entity_map_get_changestream(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "changestream", error); if (!entity) { return NULL; } if (!entity->value) { test_set_error(error, "changestream '%s' is closed", id); } return (mongoc_change_stream_t *)entity->value; } entity_findcursor_t * entity_map_get_findcursor(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "findcursor", error); if (!entity) { return NULL; } if (!entity->value) { test_set_error(error, "findcursor '%s' is closed", id); } return (entity_findcursor_t *)entity->value; } mongoc_topology_description_t * entity_map_get_topology_description(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "topologyDescription", error); if (!entity) { return NULL; } BSON_ASSERT(entity->value); return (mongoc_topology_description_t *)entity->value; } bson_val_t * entity_map_get_bson(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "bson", error); if (!entity) { return NULL; } return (bson_val_t *)entity->value; } mongoc_array_t * entity_map_get_bson_array(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "bson_array", error); if (!entity) { return NULL; } return (mongoc_array_t *)entity->value; } size_t * entity_map_get_size_t(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "size_t", error); if (!entity) { return NULL; } return (size_t *)entity->value; } mongoc_client_session_t * entity_map_get_session(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "session", error); if (!entity) { return NULL; } if (!entity->value) { test_set_error(error, "entity: %s is an ended session that is no longer valid to use", id); return NULL; } return (mongoc_client_session_t *)entity->value; } static bson_t * entity_map_get_lsid(entity_map_t *em, char *session_id, bson_error_t *error) { entity_t *entity = NULL; entity = entity_map_get(em, session_id, error); if (!entity) { return NULL; } if (!entity->lsid) { test_set_error(error, "entity %s of type %s does not have an lsid", session_id, entity->type); return NULL; } return entity->lsid; } mongoc_gridfs_bucket_t * entity_map_get_bucket(entity_map_t *entity_map, const char *id, bson_error_t *error) { entity_t *entity = _entity_map_get_by_type(entity_map, id, "bucket", error); if (!entity) { return NULL; } return (mongoc_gridfs_bucket_t *)entity->value; } static bool _entity_map_add(entity_map_t *em, const char *id, const char *type, void *value, bson_error_t *error) { bson_error_t tmperr; entity_t *entity = NULL; if (NULL != entity_map_get(em, id, &tmperr)) { test_set_error(error, "Attempting to overwrite entity: %s", id); return false; } entity = entity_new(em, type); entity->value = value; entity->id = bson_strdup(id); LL_PREPEND(em->entities, entity); return true; } bool entity_map_add_changestream(entity_map_t *em, const char *id, mongoc_change_stream_t *changestream, bson_error_t *error) { return _entity_map_add(em, id, "changestream", (void *)changestream, error); } void entity_findcursor_iterate_until_document_or_error(entity_findcursor_t *findcursor, const bson_t **document, bson_error_t *error, const bson_t **error_document) { *document = NULL; if (findcursor->first_result) { *document = findcursor->first_result; findcursor->first_result = NULL; return; } while (!mongoc_cursor_next(findcursor->cursor, document)) { if (mongoc_cursor_error_document(findcursor->cursor, error, error_document)) { return; } } } bool entity_map_add_findcursor( entity_map_t *em, const char *id, mongoc_cursor_t *cursor, const bson_t *first_result, bson_error_t *error) { entity_findcursor_t *findcursor; findcursor = (entity_findcursor_t *)bson_malloc0(sizeof(entity_findcursor_t)); findcursor->cursor = cursor; findcursor->first_result = first_result; return _entity_map_add(em, id, "findcursor", (void *)findcursor, error); } bool entity_map_add_topology_description(entity_map_t *em, const char *id, mongoc_topology_description_t *td, bson_error_t *error) { return _entity_map_add(em, id, "topologyDescription", (void *)td, error); } bool entity_map_add_bson(entity_map_t *em, const char *id, bson_val_t *val, bson_error_t *error) { return _entity_map_add(em, id, "bson", (void *)bson_val_copy(val), error); } bool entity_map_add_bson_array(entity_map_t *em, const char *id, bson_error_t *error) { // Note: the specification states we should be storing a BSON object of array // type, but we use an array of BSON objects instead to make append and // iteration easier. mongoc_array_t *array = bson_malloc(sizeof(mongoc_array_t)); mongoc_array_aligned_init(array, bson_t *); return _entity_map_add(em, id, "bson_array", (void *)array, error); } bool entity_map_add_size_t(entity_map_t *em, const char *id, size_t *value, bson_error_t *error) { return _entity_map_add(em, id, "size_t", value, error); } /* implement $$sessionLsid */ static bool special_session_lsid(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; const char *id; bson_val_t *session_val = NULL; bson_t *lsid = NULL; entity_map_t *em = (entity_map_t *)user_data; bson_iter_t iter; bson_iter_init(&iter, assertion); bson_iter_next(&iter); if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "unexpected $$sessionLsid does not contain utf8: %s", tmp_json(assertion)); goto done; } id = bson_iter_utf8(&iter, NULL); lsid = entity_map_get_lsid(em, (char *)id, error); if (!lsid) { goto done; } session_val = bson_val_from_bson(lsid); if (!bson_matcher_match(context, session_val, actual, error)) { goto done; } ret = true; done: bson_val_destroy(session_val); return ret; } /* implement $$matchesEntity */ bool special_matches_entity(const bson_matcher_context_t *context, const bson_t *assertion, const bson_val_t *actual, void *user_data, bson_error_t *error) { bool ret = false; bson_iter_t iter; entity_map_t *em = (entity_map_t *)user_data; bson_val_t *entity_val = NULL; const char *id; bson_iter_init(&iter, assertion); BSON_ASSERT(bson_iter_next(&iter)); if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "unexpected $$matchesEntity does not contain utf8: %s", tmp_json(assertion)); goto done; } id = bson_iter_utf8(&iter, NULL); entity_val = entity_map_get_bson(em, id, error); if (!entity_val) { goto done; } if (!bson_matcher_match(context, entity_val, actual, error)) { goto done; } ret = true; done: return ret; } bool entity_map_match( entity_map_t *em, const bson_val_t *expected, const bson_val_t *actual, bool array_of_root_docs, bson_error_t *error) { bson_matcher_context_t root_context = { .matcher = bson_matcher_new(), .path = "", .is_root = true, .array_of_root_docs = array_of_root_docs, }; bson_matcher_add_special(root_context.matcher, "$$sessionLsid", special_session_lsid, em); bson_matcher_add_special(root_context.matcher, "$$matchesEntity", special_matches_entity, em); bool ret = bson_matcher_match(&root_context, expected, actual, error); bson_matcher_destroy(root_context.matcher); return ret; } char * event_list_to_string(event_t *events) { event_t *eiter = NULL; mcommon_string_append_t str; mcommon_string_new_as_append(&str); LL_FOREACH(events, eiter) { mcommon_string_append_printf(&str, "- %s: %s (%s)\n", eiter->type, tmp_json(eiter->serialized), eiter->is_sensitive_command ? "marked SENSITIVE" : "not sensitive"); } return mcommon_string_from_append_destroy_with_steal(&str); } bool entity_map_end_session(entity_map_t *em, char *session_id, bson_error_t *error) { bool ret = false; entity_t *entity = NULL; entity = entity_map_get(em, session_id, error); if (!entity) { goto done; } if (0 != strcmp(entity->type, "session")) { test_set_error(error, "expected session for %s but got %s", session_id, entity->type); goto done; } mongoc_client_session_destroy((mongoc_client_session_t *)entity->value); entity->value = NULL; ret = true; done: return ret; } char * entity_map_get_session_client_id(entity_map_t *em, char *session_id, bson_error_t *error) { char *ret = NULL; entity_t *entity = NULL; entity = entity_map_get(em, session_id, error); if (!entity) { goto done; } if (0 != strcmp(entity->type, "session")) { test_set_error(error, "expected session for %s but got %s", session_id, entity->type); goto done; } ret = entity->session_client_id; done: return ret; } void entity_map_set_reduced_heartbeat(entity_map_t *em, bool val) { em->reduced_heartbeat = val; } void entity_map_disable_event_listeners(entity_map_t *em) { entity_t *eiter = NULL; LL_FOREACH(em->entities, eiter) { if (0 == strcmp(eiter->type, "client")) { mongoc_client_t *client = (mongoc_client_t *)eiter->value; if (client) { mongoc_client_set_apm_callbacks(client, NULL, NULL); } } } } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/entity-map.h000066400000000000000000000156271511661753600241570ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_ENTITY_MAP_H #define UNIFIED_ENTITY_MAP_H #include "./test-diagnostics.h" #include #include #include #include #include #include typedef struct _event_t { struct _event_t *next; const char *type; // Non-owning const char *eventType; // Non-owning bson_t *serialized; bool is_sensitive_command; } event_t; typedef bool(log_filter_func_t)(const mongoc_structured_log_entry_t *entry, void *user_data); typedef struct _log_message_t { struct _log_message_t *next; mongoc_structured_log_component_t component; mongoc_structured_log_level_t level; bson_t *message; } log_message_t; typedef struct _log_filter_t { struct _log_filter_t *next; log_filter_func_t *func; void *user_data; } log_filter_t; typedef struct _observe_event_t { char *type; // Type of event to observe. } observe_event_t; typedef struct _store_event_t { char *entity_id; // Target entity to store event. char *type; // Type of event to store. } store_event_t; typedef struct _entity_t { char *id; char *type; void *value; bson_t *ignore_command_monitoring_events; bool *observe_sensitive_commands; struct _entity_t *next; event_t *events; bson_mutex_t log_mutex; log_message_t *log_messages; log_filter_t *log_filters; struct _entity_map_t *entity_map; // Parent entity map. mongoc_array_t observe_events; // observe_event_t [N]. mongoc_array_t store_events; // store_event_t [N]. bson_t *lsid; char *session_client_id; } entity_t; struct _entity_findcursor_t; typedef struct _entity_findcursor_t entity_findcursor_t; /* Operations on the entity map enforce: * 1. Uniqueness. Attempting to create two entries with the same id is an error. * 2. Referential integrity. Attempting to get with an unknown id is an error. */ typedef struct _entity_map_t { entity_t *entities; bool reduced_heartbeat; } entity_map_t; entity_map_t * entity_map_new(void); void entity_map_destroy(entity_map_t *em); /* Creates an entry in the entity map based on what is specified in @bson. */ bool entity_map_create(entity_map_t *em, bson_t *bson, const bson_t *cluster_time_after_initial_data, bson_error_t *error); /* Steals ownership of changestream. */ bool entity_map_add_changestream(entity_map_t *em, const char *id, mongoc_change_stream_t *changestream, bson_error_t *error); /* Steals ownership of cursor. */ bool entity_map_add_findcursor( entity_map_t *em, const char *id, mongoc_cursor_t *cursor, const bson_t *first_result, bson_error_t *error); /* Steals ownership of td. */ bool entity_map_add_topology_description(entity_map_t *em, const char *id, mongoc_topology_description_t *td, bson_error_t *error); /* Copies val */ bool entity_map_add_bson(entity_map_t *em, const char *id, bson_val_t *val, bson_error_t *error); bool entity_map_add_bson_array(entity_map_t *em, const char *id, bson_error_t *error); /* Steals ownership of value. */ bool entity_map_add_size_t(entity_map_t *em, const char *id, size_t *value, bson_error_t *error); /* Returns NULL and sets @error if @id does not map to an entry. */ entity_t * entity_map_get(entity_map_t *em, const char *id, bson_error_t *error); /* Implements the 'close' operation. Doesn't fully remove the entity. * Returns false and sets @error if @id does not map to an entry, or * if the entity type does not support 'close' operations. */ bool entity_map_close(entity_map_t *em, const char *id, bson_error_t *error); mongoc_client_t * entity_map_get_client(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_client_encryption_t * entity_map_get_client_encryption(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_database_t * entity_map_get_database(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_collection_t * entity_map_get_collection(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_change_stream_t * entity_map_get_changestream(entity_map_t *entity_map, const char *id, bson_error_t *error); entity_findcursor_t * entity_map_get_findcursor(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_topology_description_t * entity_map_get_topology_description(entity_map_t *entity_map, const char *id, bson_error_t *error); void entity_findcursor_iterate_until_document_or_error(entity_findcursor_t *cursor, const bson_t **document, bson_error_t *error, const bson_t **error_document); mongoc_client_session_t * entity_map_get_session(entity_map_t *entity_map, const char *id, bson_error_t *error); bson_val_t * entity_map_get_bson(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_array_t * entity_map_get_bson_array(entity_map_t *entity_map, const char *id, bson_error_t *error); size_t * entity_map_get_size_t(entity_map_t *entity_map, const char *id, bson_error_t *error); mongoc_gridfs_bucket_t * entity_map_get_bucket(entity_map_t *entity_map, const char *id, bson_error_t *error); bool entity_map_match( entity_map_t *em, const bson_val_t *expected, const bson_val_t *actual, bool allow_extra, bson_error_t *error); char * event_list_to_string(event_t *events); bool entity_map_end_session(entity_map_t *em, char *session_id, bson_error_t *error); char * entity_map_get_session_client_id(entity_map_t *em, char *session_id, bson_error_t *error); void entity_map_set_reduced_heartbeat(entity_map_t *em, bool val); void entity_map_disable_event_listeners(entity_map_t *em); void entity_log_filter_push(entity_t *entity, log_filter_func_t *func, void *user_data); void entity_log_filter_pop(entity_t *entity, log_filter_func_t *func, void *user_data); void entity_map_log_filter_push(entity_map_t *entity_map, const char *entity_id, log_filter_func_t *func, void *user_data); void entity_map_log_filter_pop(entity_map_t *entity_map, const char *entity_id, log_filter_func_t *func, void *user_data); #endif /* UNIFIED_ENTITY_MAP_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/unified/operation.c000066400000000000000000003570571511661753600240710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./operation.h" #include "./result.h" #include "./test-diagnostics.h" #include "./util.h" #include #include #include // hex_to_bin #include #include #include #include #include typedef struct { char *name; char *object; bson_t *arguments; bson_t *expect_error; bson_val_t *expect_result; bool *ignore_result_and_error; char *save_result_as_entity; bson_parser_t *parser; char *session_id; mongoc_client_session_t *session; } operation_t; static void operation_destroy(operation_t *op) { if (!op) { return; } bson_parser_destroy_with_parsed_fields(op->parser); bson_free(op->session_id); bson_free(op); } static operation_t * operation_new(bson_t *bson, bson_error_t *error) { operation_t *op = bson_malloc0(sizeof(operation_t)); op->parser = bson_parser_new(); bson_parser_utf8(op->parser, "name", &op->name); bson_parser_utf8(op->parser, "object", &op->object); bson_parser_doc_optional(op->parser, "arguments", &op->arguments); bson_parser_doc_optional(op->parser, "expectError", &op->expect_error); bson_parser_any_optional(op->parser, "expectResult", &op->expect_result); bson_parser_bool_optional(op->parser, "ignoreResultAndError", &op->ignore_result_and_error); bson_parser_utf8_optional(op->parser, "saveResultAsEntity", &op->save_result_as_entity); if (!bson_parser_parse(op->parser, bson, error)) { operation_destroy(op); return NULL; } return op; } static bool operation_create_change_stream(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; entity_t *entity = NULL; bson_parser_t *parser = NULL; mongoc_change_stream_t *changestream = NULL; bson_t *pipeline = NULL; const bson_t *op_reply = NULL; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); /* Capture options as all extra fields, and pass them directly as change * stream options. */ bson_parser_allow_extra(parser, true); bson_parser_array(parser, "pipeline", &pipeline); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } entity = entity_map_get(test->entity_map, op->object, error); if (!entity) { goto done; } if (0 == strcmp(entity->type, "client")) { mongoc_client_t *client = (mongoc_client_t *)entity->value; if (!client) { test_set_error(error, "client '%s' is closed", entity->id); goto done; } changestream = mongoc_client_watch(client, pipeline, opts); } else if (0 == strcmp(entity->type, "database")) { mongoc_database_t *db = (mongoc_database_t *)entity->value; changestream = mongoc_database_watch(db, pipeline, opts); } else if (0 == strcmp(entity->type, "collection")) { mongoc_collection_t *coll = (mongoc_collection_t *)entity->value; changestream = mongoc_collection_watch(coll, pipeline, opts); } mongoc_change_stream_error_document(changestream, &op_error, &op_reply); result_from_val_and_reply(result, NULL, (bson_t *)op_reply, &op_error); if (op->save_result_as_entity) { if (!entity_map_add_changestream(test->entity_map, op->save_result_as_entity, changestream, error)) { goto done; } else { // Successfully saved the changestream } } else { // We're not saving the changestream mongoc_change_stream_destroy(changestream); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_list_databases(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_t *client = NULL; mongoc_cursor_t *cursor = NULL; bson_t *opts = NULL; opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } if (op->arguments) { bson_concat(opts, op->arguments); } client = entity_map_get_client(test->entity_map, op->object, error); if (!client) { goto done; } cursor = mongoc_client_find_databases_with_opts(client, opts); result_from_cursor(result, cursor); ret = true; done: mongoc_cursor_destroy(cursor); bson_destroy(opts); return ret; } static bool operation_list_database_names(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_t *client = NULL; bson_t *opts = NULL; opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } if (op->arguments) { bson_concat(opts, op->arguments); } client = entity_map_get_client(test->entity_map, op->object, error); if (!client) { goto done; } char **names = mongoc_client_get_database_names_with_opts(client, opts, error); { bson_val_t *val = NULL; if (names) { bson_t bson = BSON_INITIALIZER; bson_array_builder_t *element; BSON_APPEND_ARRAY_BUILDER_BEGIN(&bson, "v", &element); for (char **names_iter = names; *names_iter != NULL; ++names_iter) { bson_array_builder_append_utf8(element, *names_iter, -1); } bson_append_array_builder_end(&bson, element); bson_iter_t iter; bson_iter_init_find(&iter, &bson, "v"); val = bson_val_from_iter(&iter); bson_destroy(&bson); } result_from_val_and_reply(result, val, NULL, error); bson_val_destroy(val); } bson_strfreev(names); ret = true; done: bson_destroy(opts); return ret; } static bool append_client_bulkwritemodel(mongoc_bulkwrite_t *bw, bson_t *model_wrapper, bson_error_t *error) { bool ok = false; // Example `model_wrapper`: // { "insertOne": { "namespace": "db.coll", "document": { "_id": 1 } }} char *namespace = NULL; bson_t *document = NULL; bson_t *filter = NULL; bson_t *update = NULL; bson_t *replacement = NULL; bson_t *collation = NULL; bson_val_t *hint = NULL; bool *upsert = NULL; bson_t *arrayFilters = NULL; bson_t *sort = NULL; bson_parser_t *parser = bson_parser_new(); // Expect exactly one root key to identify the model (e.g. "insertOne"): if (bson_count_keys(model_wrapper) != 1) { test_set_error(error, "expected exactly one key in model, got %" PRIu32 " : %s", bson_count_keys(model_wrapper), tmp_json(model_wrapper)); goto done; } bson_iter_t model_wrapper_iter; BSON_ASSERT(bson_iter_init(&model_wrapper_iter, model_wrapper)); BSON_ASSERT(bson_iter_next(&model_wrapper_iter)); const char *model_name = bson_iter_key(&model_wrapper_iter); bson_t model_bson; bson_iter_bson(&model_wrapper_iter, &model_bson); if (0 == strcmp("insertOne", model_name)) { // Parse an "insertOne". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "document", &document); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } if (!mongoc_bulkwrite_append_insertone(bw, namespace, document, NULL, error)) { goto done; } } else if (0 == strcmp("updateOne", model_name)) { // Parse an "updateOne". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); bson_parser_array_optional(parser, "arrayFilters", &arrayFilters); bson_parser_doc_optional(parser, "collation", &collation); bson_parser_any_optional(parser, "hint", &hint); bson_parser_bool_optional(parser, "upsert", &upsert); bson_parser_doc_optional(parser, "sort", &sort); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } mongoc_bulkwrite_updateoneopts_t *opts = mongoc_bulkwrite_updateoneopts_new(); mongoc_bulkwrite_updateoneopts_set_arrayfilters(opts, arrayFilters); mongoc_bulkwrite_updateoneopts_set_collation(opts, collation); if (hint) { mongoc_bulkwrite_updateoneopts_set_hint(opts, bson_val_to_value(hint)); } if (upsert) { mongoc_bulkwrite_updateoneopts_set_upsert(opts, *upsert); } if (sort) { mongoc_bulkwrite_updateoneopts_set_sort(opts, sort); } if (!mongoc_bulkwrite_append_updateone(bw, namespace, filter, update, opts, error)) { mongoc_bulkwrite_updateoneopts_destroy(opts); goto done; } mongoc_bulkwrite_updateoneopts_destroy(opts); } else if (0 == strcmp("updateMany", model_name)) { // Parse an "updateMany". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); bson_parser_array_optional(parser, "arrayFilters", &arrayFilters); bson_parser_doc_optional(parser, "collation", &collation); bson_parser_any_optional(parser, "hint", &hint); bson_parser_bool_optional(parser, "upsert", &upsert); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } mongoc_bulkwrite_updatemanyopts_t *opts = mongoc_bulkwrite_updatemanyopts_new(); mongoc_bulkwrite_updatemanyopts_set_arrayfilters(opts, arrayFilters); mongoc_bulkwrite_updatemanyopts_set_collation(opts, collation); if (hint) { mongoc_bulkwrite_updatemanyopts_set_hint(opts, bson_val_to_value(hint)); } if (upsert) { mongoc_bulkwrite_updatemanyopts_set_upsert(opts, *upsert); } if (!mongoc_bulkwrite_append_updatemany(bw, namespace, filter, update, opts, error)) { mongoc_bulkwrite_updatemanyopts_destroy(opts); goto done; } mongoc_bulkwrite_updatemanyopts_destroy(opts); } else if (0 == strcmp("deleteOne", model_name)) { // Parse a "deleteOne". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "filter", &filter); bson_parser_doc_optional(parser, "collation", &collation); bson_parser_any_optional(parser, "hint", &hint); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } mongoc_bulkwrite_deleteoneopts_t *opts = mongoc_bulkwrite_deleteoneopts_new(); mongoc_bulkwrite_deleteoneopts_set_collation(opts, collation); if (hint) { mongoc_bulkwrite_deleteoneopts_set_hint(opts, bson_val_to_value(hint)); } if (!mongoc_bulkwrite_append_deleteone(bw, namespace, filter, opts, error)) { mongoc_bulkwrite_deleteoneopts_destroy(opts); goto done; } mongoc_bulkwrite_deleteoneopts_destroy(opts); } else if (0 == strcmp("deleteMany", model_name)) { // Parse a "deleteMany". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "filter", &filter); bson_parser_doc_optional(parser, "collation", &collation); bson_parser_any_optional(parser, "hint", &hint); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } mongoc_bulkwrite_deletemanyopts_t *opts = mongoc_bulkwrite_deletemanyopts_new(); mongoc_bulkwrite_deletemanyopts_set_collation(opts, collation); if (hint) { mongoc_bulkwrite_deletemanyopts_set_hint(opts, bson_val_to_value(hint)); } if (!mongoc_bulkwrite_append_deletemany(bw, namespace, filter, opts, error)) { mongoc_bulkwrite_deletemanyopts_destroy(opts); goto done; } mongoc_bulkwrite_deletemanyopts_destroy(opts); } else if (0 == strcmp("replaceOne", model_name)) { // Parse a "replaceOne". bson_parser_utf8(parser, "namespace", &namespace); bson_parser_doc(parser, "filter", &filter); bson_parser_doc(parser, "replacement", &replacement); bson_parser_doc_optional(parser, "collation", &collation); bson_parser_bool_optional(parser, "upsert", &upsert); bson_parser_any_optional(parser, "hint", &hint); bson_parser_doc_optional(parser, "sort", &sort); if (!bson_parser_parse(parser, &model_bson, error)) { goto done; } mongoc_bulkwrite_replaceoneopts_t *opts = mongoc_bulkwrite_replaceoneopts_new(); mongoc_bulkwrite_replaceoneopts_set_collation(opts, collation); if (hint) { mongoc_bulkwrite_replaceoneopts_set_hint(opts, bson_val_to_value(hint)); } if (upsert) { mongoc_bulkwrite_replaceoneopts_set_upsert(opts, *upsert); } if (sort) { mongoc_bulkwrite_replaceoneopts_set_sort(opts, sort); } if (!mongoc_bulkwrite_append_replaceone(bw, namespace, filter, replacement, opts, error)) { mongoc_bulkwrite_replaceoneopts_destroy(opts); goto done; } mongoc_bulkwrite_replaceoneopts_destroy(opts); } else { test_set_error(error, "unsupported model: %s", model_name); goto done; } ok = true; done: bson_parser_destroy_with_parsed_fields(parser); return ok; } static bool operation_client_bulkwrite(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_t *client = NULL; mongoc_bulkwrite_t *bw = NULL; mongoc_bulkwriteopts_t *opts = mongoc_bulkwriteopts_new(); client = entity_map_get_client(test->entity_map, op->object, error); if (!client) { goto done; } // Parse arguments. { bool parse_ok = false; bson_t *args_models = NULL; bool *args_verboseResults = NULL; bool *args_ordered = NULL; bson_val_t *args_comment = NULL; bool *args_bypassDocumentValidation = NULL; bson_t *args_let = NULL; mongoc_write_concern_t *args_wc = NULL; bson_parser_t *parser = bson_parser_new(); bson_parser_array(parser, "models", &args_models); bson_parser_bool_optional(parser, "verboseResults", &args_verboseResults); bson_parser_bool_optional(parser, "ordered", &args_ordered); bson_parser_any_optional(parser, "comment", &args_comment); bson_parser_bool_optional(parser, "bypassDocumentValidation", &args_bypassDocumentValidation); bson_parser_doc_optional(parser, "let", &args_let); bson_parser_write_concern_optional(parser, &args_wc); if (!bson_parser_parse(parser, op->arguments, error)) { goto parse_done; } if (args_verboseResults && *args_verboseResults) { mongoc_bulkwriteopts_set_verboseresults(opts, true); } if (args_ordered) { mongoc_bulkwriteopts_set_ordered(opts, *args_ordered); } if (args_comment) { mongoc_bulkwriteopts_set_comment(opts, bson_val_to_value(args_comment)); } if (args_bypassDocumentValidation) { mongoc_bulkwriteopts_set_bypassdocumentvalidation(opts, *args_bypassDocumentValidation); } if (args_let) { mongoc_bulkwriteopts_set_let(opts, args_let); } if (args_wc) { mongoc_bulkwriteopts_set_writeconcern(opts, args_wc); } // Parse models. bson_iter_t args_models_iter; BSON_ASSERT(bson_iter_init(&args_models_iter, args_models)); bw = mongoc_client_bulkwrite_new(client); while (bson_iter_next(&args_models_iter)) { bson_t model_wrapper; bson_iter_bson(&args_models_iter, &model_wrapper); if (!append_client_bulkwritemodel(bw, &model_wrapper, error)) { if (error->domain != TEST_ERROR_DOMAIN) { // Propagate error as a test result. result_from_val_and_reply(result, NULL, NULL, error); // Return with a success (to not abort test runner) and propagate // the error as a result. ret = true; *error = (bson_error_t){0}; bson_parser_destroy_with_parsed_fields(parser); goto done; } goto parse_done; } } parse_ok = true; parse_done: bson_parser_destroy_with_parsed_fields(parser); if (!parse_ok) { goto done; } } // Do client bulk write. mongoc_bulkwrite_set_session(bw, op->session); mongoc_bulkwritereturn_t bwr = mongoc_bulkwrite_execute(bw, opts); result_from_bulkwritereturn(result, bwr); mongoc_bulkwriteexception_destroy(bwr.exc); mongoc_bulkwriteresult_destroy(bwr.res); ret = true; done: mongoc_bulkwriteopts_destroy(opts); mongoc_bulkwrite_destroy(bw); return ret; } static bool operation_create_datakey(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *parser = bson_parser_new(); char *kms_provider = NULL; bson_t *opts; mongoc_client_encryption_t *ce = NULL; mongoc_client_encryption_datakey_opts_t *datakey_opts = NULL; bson_value_t key_id_value = {0}; bool ret = false; bson_parser_utf8(parser, "kmsProvider", &kms_provider); bson_parser_doc_optional(parser, "opts", &opts); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } datakey_opts = mongoc_client_encryption_datakey_opts_new(); if (opts) { bson_parser_t *opts_parser = bson_parser_new(); bson_t *master_key = NULL; bson_t *key_alt_names = NULL; bson_val_t *key_material_val = NULL; bool success = false; bson_parser_doc_optional(opts_parser, "masterKey", &master_key); bson_parser_array_optional(opts_parser, "keyAltNames", &key_alt_names); bson_parser_any_optional(opts_parser, "keyMaterial", &key_material_val); if (!bson_parser_parse(opts_parser, opts, error)) { goto opts_done; } if (master_key) { mongoc_client_encryption_datakey_opts_set_masterkey(datakey_opts, master_key); } if (key_alt_names) { bson_iter_t iter; mongoc_array_t arr; _mongoc_array_init(&arr, sizeof(char *)); BSON_FOREACH(key_alt_names, iter) { const char *key_alt_name = bson_iter_utf8(&iter, NULL); _mongoc_array_append_val(&arr, key_alt_name); } BSON_ASSERT(mlib_in_range(uint32_t, arr.len)); mongoc_client_encryption_datakey_opts_set_keyaltnames(datakey_opts, arr.data, (uint32_t)arr.len); _mongoc_array_destroy(&arr); } if (key_material_val) { const bson_value_t *value = bson_val_to_value(key_material_val); BSON_ASSERT(value); if (value->value_type != BSON_TYPE_BINARY || value->value.v_binary.subtype != BSON_SUBTYPE_BINARY) { test_set_error(error, "expected field 'keyMaterial' to be binData with subtype 00"); goto opts_done; } mongoc_client_encryption_datakey_opts_set_keymaterial( datakey_opts, value->value.v_binary.data, value->value.v_binary.data_len); } success = true; opts_done: bson_parser_destroy_with_parsed_fields(opts_parser); if (!success) { goto done; } } { const bool success = mongoc_client_encryption_create_datakey(ce, kms_provider, datakey_opts, &key_id_value, error); bson_val_t *val = NULL; if (success) { val = bson_val_from_value(&key_id_value); } result_from_val_and_reply(result, val, NULL, error); bson_val_destroy(val); } ret = true; done: mongoc_client_encryption_datakey_opts_destroy(datakey_opts); bson_parser_destroy_with_parsed_fields(parser); bson_value_destroy(&key_id_value); return ret; } static bool operation_rewrap_many_datakey(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); mongoc_client_encryption_rewrap_many_datakey_result_t *const rmd_result = mongoc_client_encryption_rewrap_many_datakey_result_new(); bool ret = false; mongoc_client_encryption_t *ce = NULL; bson_t *filter_doc = NULL; bson_t *opts_doc = NULL; char *provider = NULL; bson_t *master_key = NULL; bson_parser_doc(parser, "filter", &filter_doc); bson_parser_doc_optional(parser, "opts", &opts_doc); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } if (opts_doc) { bson_parser_t *const opts_parser = bson_parser_new(); bool success = false; bson_parser_utf8(opts_parser, "provider", &provider); bson_parser_doc_optional(opts_parser, "masterKey", &master_key); success = bson_parser_parse(opts_parser, opts_doc, error); bson_parser_destroy(opts_parser); if (!success) { goto done; } } if (mongoc_client_encryption_rewrap_many_datakey(ce, filter_doc, provider, master_key, rmd_result, error)) { const bson_t *const bulk_write_result = mongoc_client_encryption_rewrap_many_datakey_result_get_bulk_write_result(rmd_result); bson_t doc = BSON_INITIALIZER; if (bulk_write_result) { bson_t *const rewritten = rewrite_bulk_write_result(bulk_write_result); BSON_APPEND_DOCUMENT(&doc, "bulkWriteResult", rewritten); bson_destroy(rewritten); } { bson_val_t *const val = bson_val_from_bson(&doc); result_from_val_and_reply(result, val, NULL, error); bson_val_destroy(val); } bson_destroy(&doc); } else { result_from_val_and_reply(result, NULL, NULL, error); } ret = true; done: bson_free(provider); bson_destroy(master_key); mongoc_client_encryption_rewrap_many_datakey_result_destroy(rmd_result); bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_delete_key(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; bson_val_t *id_val = NULL; mongoc_client_encryption_t *ce = NULL; bson_parser_any(parser, "id", &id_val); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { bson_t reply; const bool success = mongoc_client_encryption_delete_key(ce, bson_val_to_value(id_val), &reply, error); bson_val_t *const val = success ? bson_val_from_bson(&reply) : NULL; result_from_val_and_reply(result, val, NULL, error); bson_destroy(&reply); bson_val_destroy(val); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_get_key(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; bson_val_t *id_val = NULL; mongoc_client_encryption_t *ce = NULL; bson_parser_any(parser, "id", &id_val); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { bson_t key_doc; const bool success = mongoc_client_encryption_get_key(ce, bson_val_to_value(id_val), &key_doc, error); const bson_value_t value = {.value_type = BSON_TYPE_NULL}; bson_val_t *const val = success ? (bson_empty(&key_doc) ? bson_val_from_value(&value) : bson_val_from_bson(&key_doc)) : NULL; result_from_val_and_reply(result, val, NULL, error); bson_val_destroy(val); bson_destroy(&key_doc); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_get_keys(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; mongoc_client_encryption_t *ce = NULL; if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { mongoc_cursor_t *const cursor = mongoc_client_encryption_get_keys(ce, error); if (cursor) { result_from_cursor(result, cursor); } else { result_from_val_and_reply(result, NULL, NULL, error); } mongoc_cursor_destroy(cursor); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_add_key_alt_name(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; bson_val_t *id_val = NULL; char *alt_name = NULL; mongoc_client_encryption_t *ce = NULL; bson_parser_any(parser, "id", &id_val); bson_parser_utf8(parser, "keyAltName", &alt_name); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { bson_t key_doc; const bool success = mongoc_client_encryption_add_key_alt_name(ce, bson_val_to_value(id_val), alt_name, &key_doc, error); const bson_value_t value = {.value_type = BSON_TYPE_NULL}; bson_val_t *const val = success ? (bson_empty(&key_doc) ? bson_val_from_value(&value) : bson_val_from_bson(&key_doc)) : NULL; result_from_val_and_reply(result, val, NULL, error); bson_destroy(&key_doc); bson_val_destroy(val); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_remove_key_alt_name(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; bson_val_t *id_val = NULL; char *alt_name = NULL; mongoc_client_encryption_t *ce = NULL; bson_parser_any(parser, "id", &id_val); bson_parser_utf8(parser, "keyAltName", &alt_name); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { bson_t key_doc; const bool success = mongoc_client_encryption_remove_key_alt_name(ce, bson_val_to_value(id_val), alt_name, &key_doc, error); const bson_value_t value = {.value_type = BSON_TYPE_NULL}; bson_val_t *const val = success ? (bson_empty(&key_doc) ? bson_val_from_value(&value) : bson_val_from_bson(&key_doc)) : NULL; result_from_val_and_reply(result, val, NULL, error); bson_destroy(&key_doc); bson_val_destroy(val); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_get_key_by_alt_name(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); bool ret = false; char *keyaltname = NULL; mongoc_client_encryption_t *ce = NULL; bson_parser_utf8(parser, "keyAltName", &keyaltname); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } { bson_t key_doc; const bool success = mongoc_client_encryption_get_key_by_alt_name(ce, keyaltname, &key_doc, error); const bson_value_t value = {.value_type = BSON_TYPE_NULL}; bson_val_t *const val = success ? (bson_empty(&key_doc) ? bson_val_from_value(&value) : bson_val_from_bson(&key_doc)) : NULL; result_from_val_and_reply(result, val, NULL, error); bson_destroy(&key_doc); bson_val_destroy(val); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_encrypt(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_encryption_t *ce = NULL; mongoc_client_encryption_encrypt_opts_t *eo = mongoc_client_encryption_encrypt_opts_new(); bson_val_t *value = NULL; bson_t *opts = NULL; char *opts_keyaltname = NULL; bson_val_t *opts_id = NULL; char *opts_algorithm = NULL; // Parse `value` and `opts`. { bson_parser_t *const parser = bson_parser_new(); bool success = false; bson_parser_any(parser, "value", &value); bson_parser_doc(parser, "opts", &opts); success = bson_parser_parse(parser, op->arguments, error); bson_parser_destroy(parser); if (!success) { goto done; } } // Parse fields in `opts`. { bson_parser_t *const parser = bson_parser_new(); bool success = false; bson_parser_utf8_optional(parser, "keyAltName", &opts_keyaltname); bson_parser_any_optional(parser, "id", &opts_id); bson_parser_utf8(parser, "algorithm", &opts_algorithm); success = bson_parser_parse(parser, opts, error); bson_parser_destroy(parser); if (!success) { goto done; } } // Get ClientEncryption object. if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } // Encrypt. { if (opts_id) { mongoc_client_encryption_encrypt_opts_set_keyid(eo, bson_val_to_value(opts_id)); } if (opts_keyaltname) { mongoc_client_encryption_encrypt_opts_set_keyaltname(eo, opts_keyaltname); } mongoc_client_encryption_encrypt_opts_set_algorithm(eo, opts_algorithm); bson_value_t ciphertext; const bool success = mongoc_client_encryption_encrypt(ce, bson_val_to_value(value), eo, &ciphertext, error); bson_val_t *const val = success ? bson_val_from_value(&ciphertext) : NULL; result_from_val_and_reply(result, val, NULL /* reply */, error); bson_value_destroy(&ciphertext); bson_val_destroy(val); } ret = true; done: bson_free(opts_algorithm); bson_val_destroy(opts_id); bson_free(opts_keyaltname); bson_destroy(opts); bson_val_destroy(value); mongoc_client_encryption_encrypt_opts_destroy(eo); return ret; } static bool operation_decrypt(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_encryption_t *ce = NULL; bson_val_t *value = NULL; // Parse `value`. { bson_parser_t *const parser = bson_parser_new(); bool success = false; bson_parser_any(parser, "value", &value); success = bson_parser_parse(parser, op->arguments, error); bson_parser_destroy(parser); if (!success) { goto done; } } // Get ClientEncryption object. if (!(ce = entity_map_get_client_encryption(test->entity_map, op->object, error))) { goto done; } // Decrypt. { bson_value_t plaintext; const bool success = mongoc_client_encryption_decrypt(ce, bson_val_to_value(value), &plaintext, error); bson_val_t *const val = success ? bson_val_from_value(&plaintext) : NULL; result_from_val_and_reply(result, val, NULL /* reply */, error); bson_value_destroy(&plaintext); bson_val_destroy(val); } ret = true; done: bson_val_destroy(value); return ret; } static bool operation_create_collection(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *parser = NULL; mongoc_database_t *db = NULL; char *collection = NULL; bson_error_t op_error = {0}; bson_t *opts = NULL; mongoc_collection_t *coll = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_utf8(parser, "collection", &collection); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } db = entity_map_get_database(test->entity_map, op->object, error); if (!db) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = mongoc_database_create_collection(db, collection, opts, &op_error); result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); mongoc_collection_destroy(coll); return ret; } static bool operation_drop_collection(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *parser = NULL; mongoc_database_t *db = NULL; mongoc_collection_t *coll = NULL; char *collection = NULL; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_utf8(parser, "collection", &collection); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } db = entity_map_get_database(test->entity_map, op->object, error); if (!db) { goto done; } /* Forward all arguments other than collection name as-is. */ BSON_ASSERT(bson_concat(opts, bson_parser_get_extra(parser))); coll = mongoc_database_get_collection(db, collection); mongoc_collection_drop_with_opts(coll, opts, &op_error); /* Ignore "ns not found" errors. This assumes that the client under test is * using MONGOC_ERROR_API_VERSION_2. */ if (op_error.domain == MONGOC_ERROR_SERVER && op_error.code == 26) { memset(&op_error, 0, sizeof(bson_error_t)); } result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); mongoc_collection_destroy(coll); bson_destroy(opts); return ret; } static bool operation_list_collections(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_database_t *db = NULL; mongoc_cursor_t *cursor = NULL; bson_t *opts = NULL; opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } if (op->arguments) { bson_concat(opts, op->arguments); } db = entity_map_get_database(test->entity_map, op->object, error); if (!db) { goto done; } cursor = mongoc_database_find_collections_with_opts(db, opts); result_from_cursor(result, cursor); ret = true; done: mongoc_cursor_destroy(cursor); bson_destroy(opts); return ret; } static bool operation_list_collection_names(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_database_t *db = NULL; mongoc_cursor_t *cursor = NULL; char **op_ret = NULL; bson_error_t op_error = {0}; bson_t *opts = NULL; opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } bson_concat(opts, op->arguments); db = entity_map_get_database(test->entity_map, op->object, error); if (!db) { goto done; } op_ret = mongoc_database_get_collection_names_with_opts(db, opts, &op_error); result_from_ok(result); ret = true; done: mongoc_cursor_destroy(cursor); bson_strfreev(op_ret); bson_destroy(opts); return ret; } static bool operation_list_indexes(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; mongoc_cursor_t *cursor = NULL; bson_t *opts = NULL; opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } if (op->arguments) { bson_concat(opts, op->arguments); } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } cursor = mongoc_collection_find_indexes_with_opts(coll, opts); result_from_cursor(result, cursor); ret = true; done: mongoc_cursor_destroy(cursor); bson_destroy(opts); return ret; } static bool operation_run_command(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *parser = NULL; bson_t *command = NULL; char *command_name = NULL; mongoc_database_t *db = NULL; mongoc_read_prefs_t *rp = NULL; mongoc_write_concern_t *wc = NULL; mongoc_read_concern_t *rc = NULL; bson_error_t op_error = {0}; bson_t op_reply = BSON_INITIALIZER; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_doc(parser, "command", &command); bson_parser_utf8(parser, "commandName", &command_name); bson_parser_read_concern_optional(parser, &rc); bson_parser_write_concern_optional(parser, &wc); bson_parser_read_prefs_optional(parser, &rp); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } db = entity_map_get_database(test->entity_map, op->object, error); if (!db) { goto done; } if (rc) { mongoc_read_concern_append(rc, opts); } if (wc) { mongoc_write_concern_append(wc, opts); } mongoc_database_command_with_opts(db, command, rp, opts, &op_reply, &op_error); // For a generic command, the reply is also the result value bson_val_t *op_reply_val = bson_val_from_bson(&op_reply); result_from_val_and_reply(result, op_reply_val, &op_reply, &op_error); bson_val_destroy(op_reply_val); ret = true; done: bson_destroy(&op_reply); bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_modify_collection(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bson_parser_t *const parser = bson_parser_new(); char *coll_name = NULL; mongoc_database_t *db = NULL; bson_t command = BSON_INITIALIZER; bool ret = false; bson_parser_utf8(parser, "collection", &coll_name); bson_parser_allow_extra(parser, true); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } if (!(db = entity_map_get_database(test->entity_map, op->object, error))) { goto done; } BSON_ASSERT(BSON_APPEND_UTF8(&command, "collMod", coll_name)); /* Forward all arguments other than collection name as-is. */ BSON_ASSERT(bson_concat(&command, bson_parser_get_extra(parser))); { bson_t reply; mongoc_database_write_command_with_opts(db, &command, NULL, &reply, error); result_from_val_and_reply(result, NULL, &reply, error); bson_destroy(&reply); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&command); return ret; } static bool operation_aggregate(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; entity_t *entity = NULL; bson_t *pipeline = NULL; bson_parser_t *parser = NULL; mongoc_cursor_t *cursor = NULL; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_array(parser, "pipeline", &pipeline); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } entity = entity_map_get(test->entity_map, op->object, error); if (0 == strcmp(entity->type, "collection")) { mongoc_collection_t *coll = (mongoc_collection_t *)entity->value; cursor = mongoc_collection_aggregate(coll, 0 /* query flags */, pipeline, opts, NULL /* read prefs */); } else if (0 == strcmp(entity->type, "database")) { mongoc_database_t *db = (mongoc_database_t *)entity->value; cursor = mongoc_database_aggregate(db, pipeline, opts, NULL /* read prefs */); } else { goto done; } result_from_cursor(result, cursor); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); mongoc_cursor_destroy(cursor); bson_destroy(opts); return ret; } static bool bulk_op_append(mongoc_bulk_operation_t *bulk, bson_t *request, bson_error_t *error) { bool ret = false; bson_iter_t iter; const char *op_type; bson_parser_t *parser = NULL; bson_t *document = NULL, *filter = NULL, *update = NULL, *replacement = NULL; bson_t request_doc; bson_iter_init(&iter, request); bson_iter_next(&iter); if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "Unexpected non-document in bulk write model: %s", bson_iter_key(&iter)); } op_type = bson_iter_key(&iter); bson_iter_bson(&iter, &request_doc); parser = bson_parser_new(); /* Pass extra options to operation. Server errors on unrecognized options. */ bson_parser_allow_extra(parser, true); if (0 == strcmp(op_type, "insertOne")) { bson_parser_doc(parser, "document", &document); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_insert_with_opts(bulk, document, bson_parser_get_extra(parser), error); } else if (0 == strcmp(op_type, "updateOne")) { bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_update_one_with_opts(bulk, filter, update, bson_parser_get_extra(parser), error); } else if (0 == strcmp(op_type, "updateMany")) { bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_update_many_with_opts(bulk, filter, update, bson_parser_get_extra(parser), error); } else if (0 == strcmp(op_type, "deleteOne")) { bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_remove_one_with_opts(bulk, filter, bson_parser_get_extra(parser), error); } else if (0 == strcmp(op_type, "deleteMany")) { bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_remove_many_with_opts(bulk, filter, bson_parser_get_extra(parser), error); } else if (0 == strcmp(op_type, "replaceOne")) { bson_parser_doc(parser, "filter", &filter); bson_parser_doc(parser, "replacement", &replacement); if (!bson_parser_parse(parser, &request_doc, error)) { goto done; } mongoc_bulk_operation_replace_one_with_opts(bulk, filter, replacement, bson_parser_get_extra(parser), error); } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } static bool operation_bulk_write(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bool *ordered = NULL; bson_t *requests = NULL; bson_t *let = NULL; bson_val_t *comment = NULL; bson_t *opts = NULL; bson_iter_t iter; mongoc_bulk_operation_t *bulk_op = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; parser = bson_parser_new(); bson_parser_array(parser, "requests", &requests); bson_parser_bool_optional(parser, "ordered", &ordered); bson_parser_doc_optional(parser, "let", &let); bson_parser_any_optional(parser, "comment", &comment); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = bson_new(); if (ordered) { BSON_APPEND_BOOL(opts, "ordered", *ordered); } if (!bson_empty0(let)) { BSON_APPEND_DOCUMENT(opts, "let", let); } if (comment) { BSON_APPEND_VALUE(opts, "comment", bson_val_to_value(comment)); } if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } bulk_op = mongoc_collection_create_bulk_operation_with_opts(coll, opts); BSON_FOREACH(requests, iter) { bson_t request; bson_iter_bson(&iter, &request); if (!bulk_op_append(bulk_op, &request, error)) { goto done; } } bson_destroy(&op_reply); mongoc_bulk_operation_execute(bulk_op, &op_reply, &op_error); result_from_bulk_write(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(opts); mongoc_bulk_operation_destroy(bulk_op); return ret; } static bool operation_count_documents(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; int64_t op_ret = -1; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_val_t *val = NULL; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); op_ret = mongoc_collection_count_documents(coll, filter, opts, NULL /* read prefs */, &op_reply, &op_error); if (op_ret != -1) { val = bson_val_from_int64(op_ret); } result_from_val_and_reply(result, val, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_val_destroy(val); bson_destroy(opts); return ret; } static bool operation_create_find_cursor(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; mongoc_cursor_t *cursor = NULL; bson_t *filter = NULL; bson_t *opts = NULL; const bson_t *op_reply = NULL; bson_error_t op_error = {0}; const bson_t *first_result = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } cursor = mongoc_collection_find_with_opts(coll, filter, opts, NULL /* read prefs */); mongoc_cursor_next(cursor, &first_result); mongoc_cursor_error_document(cursor, &op_error, &op_reply); result_from_val_and_reply(result, NULL, (bson_t *)op_reply, &op_error); ret = true; if (!op->save_result_as_entity) { mongoc_cursor_destroy(cursor); goto done; } if (!entity_map_add_findcursor(test->entity_map, op->save_result_as_entity, cursor, first_result, error)) { goto done; } done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_create_index(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *bp = NULL; char *name = NULL; bson_t *keys = NULL; bool *unique = NULL; bson_t *create_indexes = bson_new(); bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = bson_new(); bson_t *index_opts = bson_new(); mongoc_index_model_t *im = NULL; coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bp = bson_parser_new(); bson_parser_doc(bp, "keys", &keys); bson_parser_utf8_optional(bp, "name", &name); bson_parser_bool_optional(bp, "unique", &unique); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (name) { BSON_APPEND_UTF8(index_opts, "name", name); } if (unique) { BSON_APPEND_BOOL(index_opts, "unique", *unique); } if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } im = mongoc_index_model_new(keys, index_opts); mongoc_collection_create_indexes_with_opts(coll, &im, 1, opts, &op_reply, &op_error); MONGOC_DEBUG("running createIndexes: %s", tmp_json(create_indexes)); printf("got reply: %s\n", tmp_json(&op_reply)); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: mongoc_index_model_destroy(im); bson_destroy(index_opts); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); bson_destroy(opts); bson_destroy(create_indexes); return ret; } static bool operation_delete_one(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_delete_one(coll, filter, opts, &op_reply, &op_error); result_from_delete(result, &op_reply, &op_error); ret = true; done: bson_destroy(&op_reply); bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_delete_many(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_delete_many(coll, filter, opts, &op_reply, &op_error); result_from_delete(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(opts); return ret; } static bool operation_distinct(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *distinct = NULL; char *field_name = NULL; bson_t *filter = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_utf8(parser, "fieldName", &field_name); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } distinct = BCON_NEW( "distinct", mongoc_collection_get_name(coll), "key", BCON_UTF8(field_name), "query", BCON_DOCUMENT(filter)); bson_destroy(&op_reply); mongoc_collection_read_command_with_opts(coll, distinct, NULL /* read prefs */, opts, &op_reply, &op_error); result_from_distinct(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(distinct); bson_destroy(opts); return ret; } static bool operation_estimated_document_count(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; int64_t op_ret; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_val_t *val = NULL; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); op_ret = mongoc_collection_estimated_document_count(coll, opts, NULL /* read prefs */, &op_reply, &op_error); if (op_ret != -1) { val = bson_val_from_int64(op_ret); } result_from_val_and_reply(result, val, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_val_destroy(val); bson_destroy(opts); return ret; } static bool operation_find(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; mongoc_cursor_t *cursor = NULL; bson_t *filter = NULL; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } cursor = mongoc_collection_find_with_opts(coll, filter, opts, NULL /* read prefs */); result_from_cursor(result, cursor); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); mongoc_cursor_destroy(cursor); return ret; } static bool operation_find_one_and_update(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *filter = NULL; char *return_document = NULL; mongoc_find_and_modify_opts_t *opts = NULL; mongoc_find_and_modify_flags_t flags = 0; bson_val_t *val = NULL; bson_iter_t iter; bson_t *session_opts = bson_new(); parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); bson_parser_utf8_optional(parser, "returnDocument", &return_document); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = mongoc_find_and_modify_opts_new(); if (return_document && 0 == strcmp(return_document, "After")) { flags |= MONGOC_FIND_AND_MODIFY_RETURN_NEW; } mongoc_find_and_modify_opts_set_flags(opts, flags); mongoc_find_and_modify_opts_append(opts, bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, session_opts, error)) { goto done; } } mongoc_find_and_modify_opts_append(opts, session_opts); bson_destroy(&op_reply); mongoc_collection_find_and_modify_with_opts(coll, filter, opts, &op_reply, &op_error); if (bson_iter_init_find(&iter, &op_reply, "value")) { val = bson_val_from_iter(&iter); } result_from_val_and_reply(result, val, &op_reply, &op_error); ret = true; done: bson_val_destroy(val); bson_parser_destroy_with_parsed_fields(parser); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&op_reply); bson_destroy(session_opts); return ret; } static bool operation_find_one_and_replace(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *filter = NULL; bson_t *replacement = NULL; char *return_document = NULL; mongoc_find_and_modify_opts_t *opts = NULL; mongoc_find_and_modify_flags_t flags = 0; bson_val_t *val = NULL; bson_iter_t iter; bson_t *session_opts = bson_new(); parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); bson_parser_doc(parser, "replacement", &replacement); bson_parser_utf8_optional(parser, "returnDocument", &return_document); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = mongoc_find_and_modify_opts_new(); if (return_document && 0 == strcmp(return_document, "After")) { flags |= MONGOC_FIND_AND_MODIFY_RETURN_NEW; } mongoc_find_and_modify_opts_set_flags(opts, flags); mongoc_find_and_modify_opts_append(opts, bson_parser_get_extra(parser)); mongoc_find_and_modify_opts_set_update(opts, replacement); if (op->session) { if (!mongoc_client_session_append(op->session, session_opts, error)) { goto done; } } mongoc_find_and_modify_opts_append(opts, session_opts); bson_destroy(&op_reply); mongoc_collection_find_and_modify_with_opts(coll, filter, opts, &op_reply, &op_error); if (bson_iter_init_find(&iter, &op_reply, "value")) { val = bson_val_from_iter(&iter); } result_from_val_and_reply(result, val, &op_reply, &op_error); ret = true; done: bson_val_destroy(val); bson_parser_destroy_with_parsed_fields(parser); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&op_reply); bson_destroy(session_opts); return ret; } static bool operation_find_one_and_delete(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *filter = NULL; mongoc_find_and_modify_opts_t *opts = NULL; mongoc_find_and_modify_flags_t flags = 0; bson_val_t *val = NULL; bson_iter_t iter; bson_t *session_opts = bson_new(); parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } opts = mongoc_find_and_modify_opts_new(); flags |= MONGOC_FIND_AND_MODIFY_REMOVE; mongoc_find_and_modify_opts_set_flags(opts, flags); mongoc_find_and_modify_opts_append(opts, bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, session_opts, error)) { goto done; } } mongoc_find_and_modify_opts_append(opts, session_opts); bson_destroy(&op_reply); mongoc_collection_find_and_modify_with_opts(coll, filter, opts, &op_reply, &op_error); if (bson_iter_init_find(&iter, &op_reply, "value")) { val = bson_val_from_iter(&iter); } result_from_val_and_reply(result, val, &op_reply, &op_error); ret = true; done: bson_val_destroy(val); bson_parser_destroy_with_parsed_fields(parser); mongoc_find_and_modify_opts_destroy(opts); bson_destroy(&op_reply); bson_destroy(session_opts); return ret; } static bool operation_insert_many(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *documents = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_iter_t iter; int n_docs = 0, i = 0; bson_t **docs = NULL; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_array(parser, "documents", &documents); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } BSON_FOREACH(documents, iter) { n_docs++; } docs = bson_malloc0(n_docs * sizeof(bson_t *)); MONGOC_DEBUG("ndocs=%d", n_docs); BSON_FOREACH(documents, iter) { bson_t doc; bson_iter_bson(&iter, &doc); docs[i] = bson_copy(&doc); i++; } bson_destroy(&op_reply); mongoc_collection_insert_many(coll, (const bson_t **)docs, n_docs, opts, &op_reply, &op_error); result_from_insert_many(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); if (docs) { for (i = 0; i < n_docs; i++) { bson_destroy(docs[i]); } } bson_free(docs); bson_destroy(&op_reply); bson_destroy(opts); return ret; } static bool operation_insert_one(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_t *document = NULL; bson_parser_t *parser = NULL; bson_error_t op_error = {0}; bson_t op_reply = BSON_INITIALIZER; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "document", &document); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_insert_one(coll, document, opts, &op_reply, &op_error); result_from_insert_one(result, &op_reply, &op_error); ret = true; done: bson_destroy(&op_reply); bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_replace_one(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; bson_t *replacement = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); bson_parser_doc(parser, "replacement", &replacement); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_replace_one(coll, filter, replacement, opts, &op_reply, &op_error); result_from_update_or_replace(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(opts); return ret; } static bool operation_update_one(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; bson_t *update = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_update_one(coll, filter, update, opts, &op_reply, &op_error); result_from_update_or_replace(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(opts); return ret; } static bool operation_update_many(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_collection_t *coll = NULL; bson_parser_t *parser = NULL; bson_t *filter = NULL; bson_t *update = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bson_t *opts = NULL; parser = bson_parser_new(); bson_parser_allow_extra(parser, true); bson_parser_doc(parser, "filter", &filter); bson_parser_array_or_doc(parser, "update", &update); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } opts = bson_copy(bson_parser_get_extra(parser)); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } bson_destroy(&op_reply); mongoc_collection_update_many(coll, filter, update, opts, &op_reply, &op_error); result_from_update_or_replace(result, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(&op_reply); bson_destroy(opts); return ret; } static bool operation_iterate_until_document_or_error(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_change_stream_t *changestream = NULL; entity_findcursor_t *findcursor = NULL; const bson_t *doc = NULL; const bson_t *op_reply = NULL; bson_error_t op_error = {0}; bson_val_t *val = NULL; entity_t *entity; entity = entity_map_get(test->entity_map, op->object, error); if (!entity) { goto done; } if (strcmp("changestream", entity->type) == 0) { changestream = entity_map_get_changestream(test->entity_map, op->object, error); if (!changestream) { goto done; } /* Loop until error or document is returned. */ while (!mongoc_change_stream_next(changestream, &doc)) { if (mongoc_change_stream_error_document(changestream, &op_error, &op_reply)) { break; } } } else { findcursor = entity_map_get_findcursor(test->entity_map, op->object, error); if (!findcursor) { goto done; } entity_findcursor_iterate_until_document_or_error(findcursor, &doc, &op_error, &op_reply); } if (NULL != doc) { val = bson_val_from_bson((bson_t *)doc); } result_from_val_and_reply(result, val, (bson_t *)op_reply, &op_error); ret = true; done: bson_val_destroy(val); return ret; } static bool operation_close(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; entity_t *entity; entity = entity_map_get(test->entity_map, op->object, error); if (!entity) { goto done; } if (!entity_map_close(test->entity_map, op->object, error)) { goto done; } result_from_ok(result); ret = true; done: return ret; } static bool operation_drop_index(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; entity_t *entity; bson_parser_t *parser = NULL; char *index = NULL; bson_t *opts = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error = {0}; parser = bson_parser_new(); bson_parser_utf8(parser, "name", &index); if (!bson_parser_parse(parser, op->arguments, error)) { goto done; } entity = entity_map_get(test->entity_map, op->object, error); if (!entity) { goto done; } opts = bson_new(); if (op->session) { if (!mongoc_client_session_append(op->session, opts, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); mongoc_collection_drop_index(coll, index, error); result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(parser); bson_destroy(opts); return ret; } static bool operation_failpoint(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *client_id = NULL; mongoc_client_t *client = NULL; bson_t *failpoint = NULL; mongoc_read_prefs_t *rp = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; bp = bson_parser_new(); bson_parser_utf8(bp, "client", &client_id); bson_parser_doc(bp, "failPoint", &failpoint); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } client = entity_map_get_client(test->entity_map, client_id, error); if (!client) { goto done; } rp = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); bson_destroy(&op_reply); entity_map_log_filter_push(test->entity_map, client_id, NULL, NULL); mongoc_client_command_simple(client, "admin", failpoint, rp, &op_reply, &op_error); entity_map_log_filter_pop(test->entity_map, client_id, NULL, NULL); result_from_val_and_reply(result, NULL /* value */, &op_reply, &op_error); /* Add failpoint to list of test_t's known failpoints */ register_failpoint(test, (char *)bson_lookup_utf8(failpoint, "configureFailPoint"), client_id, 0); ret = true; done: mongoc_read_prefs_destroy(rp); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_targeted_failpoint(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *client_id = NULL; mongoc_client_t *client = NULL; bson_t *failpoint = NULL; mongoc_read_prefs_t *rp = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; uint32_t server_id; bp = bson_parser_new(); bson_parser_doc(bp, "failPoint", &failpoint); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (!op->session) { test_set_error(error, "%s", "session unset"); goto done; } client_id = entity_map_get_session_client_id(test->entity_map, op->session_id, error); if (!client_id) { goto done; } client = entity_map_get_client(test->entity_map, client_id, error); if (!client) { goto done; } server_id = mongoc_client_session_get_server_id(op->session); if (0 == server_id) { test_set_error(error, "expected session %s to be pinned but was not", op->session_id); goto done; } rp = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); bson_destroy(&op_reply); entity_map_log_filter_push(test->entity_map, client_id, NULL, NULL); mongoc_client_command_simple_with_server_id(client, "admin", failpoint, rp, server_id, &op_reply, &op_error); entity_map_log_filter_pop(test->entity_map, client_id, NULL, NULL); result_from_val_and_reply(result, NULL /* value */, &op_reply, &op_error); /* Add failpoint to list of test_t's known failpoints */ register_failpoint(test, (char *)bson_lookup_utf8(failpoint, "configureFailPoint"), client_id, server_id); ret = true; done: mongoc_read_prefs_destroy(rp); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_delete(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_gridfs_bucket_t *bucket = NULL; bson_parser_t *bp = NULL; bson_val_t *id = NULL; bson_error_t op_error = {0}; bp = bson_parser_new(); bson_parser_any(bp, "id", &id); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } bucket = entity_map_get_bucket(test->entity_map, op->object, error); if (!bucket) { goto done; } mongoc_gridfs_bucket_delete_by_id(bucket, bson_val_to_value(id), &op_error); result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_download(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_gridfs_bucket_t *bucket = NULL; bson_parser_t *bp = NULL; bson_val_t *id = NULL; bson_error_t op_error = {0}; mongoc_stream_t *stream = NULL; uint8_t buf[256]; ssize_t bytes_read = 0; mongoc_array_t all_bytes; bson_val_t *val = NULL; _mongoc_array_init(&all_bytes, sizeof(uint8_t)); bp = bson_parser_new(); bson_parser_any(bp, "id", &id); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } bucket = entity_map_get_bucket(test->entity_map, op->object, error); if (!bucket) { goto done; } stream = mongoc_gridfs_bucket_open_download_stream(bucket, bson_val_to_value(id), &op_error); if (stream) { while ((bytes_read = mongoc_stream_read(stream, buf, sizeof(buf), 1, 0)) > 0) { ASSERT(mlib_in_range(uint32_t, bytes_read)); _mongoc_array_append_vals(&all_bytes, buf, (uint32_t)bytes_read); } mongoc_gridfs_bucket_stream_error(stream, &op_error); } ASSERT(mlib_in_range(uint32_t, all_bytes.len)); val = bson_val_from_bytes(all_bytes.data, (uint32_t)all_bytes.len); result_from_val_and_reply(result, val, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); _mongoc_array_destroy(&all_bytes); bson_val_destroy(val); mongoc_stream_destroy(stream); return ret; } static bool operation_upload(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_gridfs_bucket_t *bucket = NULL; bson_parser_t *bp = NULL; bson_t *source = NULL; char *filename = NULL; mongoc_stream_t *stream = NULL; bson_value_t file_id; bson_error_t op_error = {0}; bson_val_t *val = NULL; bp = bson_parser_new(); bson_parser_allow_extra(bp, true); bson_parser_doc(bp, "source", &source); bson_parser_utf8(bp, "filename", &filename); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } bucket = entity_map_get_bucket(test->entity_map, op->object, error); if (!bucket) { goto done; } stream = mongoc_gridfs_bucket_open_upload_stream(bucket, filename, bson_parser_get_extra(bp), &file_id, &op_error); if (stream) { size_t total_written = 0u; uint8_t *source_bytes; size_t source_bytes_len; bson_iter_t iter; if (!bson_iter_init_find(&iter, source, "$$hexBytes") || !BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "$$hexBytes not found in source data"); goto done; } source_bytes = hex_to_bin(bson_iter_utf8(&iter, NULL), &source_bytes_len); while (total_written < source_bytes_len) { const ssize_t bytes_written = mongoc_stream_write(stream, source_bytes, source_bytes_len - total_written, 0); if (bytes_written < 0) { break; } total_written += (size_t)bytes_written; } mongoc_gridfs_bucket_stream_error(stream, &op_error); bson_free(source_bytes); } val = bson_val_from_value(&file_id); result_from_val_and_reply(result, val, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); mongoc_stream_destroy(stream); bson_val_destroy(val); return ret; } static bool assert_session_dirty_helper(test_t *test, operation_t *op, result_t *result, bool check_dirty, bson_error_t *error) { bool ret = false; BSON_UNUSED(test); if (!op->session) { test_set_error(error, "%s", "session unset"); goto done; } if (check_dirty != mongoc_client_session_get_dirty(op->session)) { test_set_error(error, "expected session to%s be dirty but was not", check_dirty ? "" : " not"); goto done; } result_from_ok(result); ret = true; done: return ret; } static bool operation_assert_session_not_dirty(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_session_dirty_helper(test, op, result, false, error); } static bool operation_assert_session_dirty(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_session_dirty_helper(test, op, result, true, error); } static event_t * next_started_event(event_t *iter) { if (!iter) { return NULL; } iter = iter->next; while (iter && 0 != strcmp(iter->type, "commandStartedEvent")) { iter = iter->next; } return iter; } static bool assert_lsid_on_last_two_commands(test_t *test, operation_t *op, result_t *result, bool check_same, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *client_id = NULL; entity_t *entity = NULL; event_t *a, *b; bson_iter_t iter; bson_t a_lsid; bson_t b_lsid; bp = bson_parser_new(); bson_parser_utf8(bp, "client", &client_id); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } entity = entity_map_get(test->entity_map, client_id, error); if (!entity) { goto done; } if (0 != strcmp(entity->type, "client")) { goto done; } a = NULL; b = entity->events; if (b && 0 != strcmp(b->type, "commandStartedEvent")) { b = next_started_event(b); } while (next_started_event(b) != NULL) { a = b; b = next_started_event(b); } if (NULL == a || NULL == b) { test_set_error(error, "unable to find two commandStartedEvents on client: %s", client_id); goto done; } if (bson_iter_init(&iter, a->serialized) && bson_iter_find_descendant(&iter, "command.lsid", &iter)) { bson_iter_bson(&iter, &a_lsid); } else { test_set_error(error, "unable to find lsid in second to last commandStartedEvent: %s", tmp_json(a->serialized)); goto done; } if (bson_iter_init(&iter, b->serialized) && bson_iter_find_descendant(&iter, "command.lsid", &iter)) { bson_iter_bson(&iter, &b_lsid); } else { test_set_error(error, "unable to find lsid in last commandStartedEvent: %s", tmp_json(b->serialized)); goto done; } if (check_same != bson_equal(&a_lsid, &b_lsid)) { test_set_error(error, "expected $lsid's to be%s equal, but got: %s and %s", check_same ? "" : " not", tmp_json(&a_lsid), tmp_json(&b_lsid)); goto done; } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_assert_same_lsid_on_last_two_commands(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_lsid_on_last_two_commands(test, op, result, true, error); } static bool operation_assert_different_lsid_on_last_two_commands(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_lsid_on_last_two_commands(test, op, result, false, error); } static bool operation_end_session(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; if (!entity_map_end_session(test->entity_map, op->object, error)) { goto done; } result_from_ok(result); ret = true; done: return ret; } static bool operation_start_transaction(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_session_t *session = NULL; bson_error_t op_error = {0}; mongoc_transaction_opt_t *opts = NULL; mongoc_read_concern_t *rc = NULL; mongoc_write_concern_t *wc = NULL; mongoc_read_prefs_t *rp = NULL; bson_parser_t *bp = NULL; opts = mongoc_transaction_opts_new(); bp = bson_parser_new(); bson_parser_read_concern_optional(bp, &rc); bson_parser_write_concern_optional(bp, &wc); bson_parser_read_prefs_optional(bp, &rp); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (rc) { mongoc_transaction_opts_set_read_concern(opts, rc); } if (wc) { mongoc_transaction_opts_set_write_concern(opts, wc); } if (rp) { mongoc_transaction_opts_set_read_prefs(opts, rp); } session = entity_map_get_session(test->entity_map, op->object, error); if (!session) { goto done; } mongoc_client_session_start_transaction(session, opts, &op_error); result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); mongoc_transaction_opts_destroy(opts); return ret; } const char * transaction_state_to_string(mongoc_transaction_state_t tstate) { switch (tstate) { case MONGOC_TRANSACTION_NONE: return "none"; case MONGOC_TRANSACTION_STARTING: return "starting"; case MONGOC_TRANSACTION_IN_PROGRESS: return "in_progress"; case MONGOC_TRANSACTION_COMMITTED: return "committed"; case MONGOC_TRANSACTION_ABORTED: return "aborted"; default: return "invalid"; } } static bool operation_assert_session_transaction_state(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *expected = NULL; const char *actual; mongoc_transaction_state_t state; BSON_UNUSED(test); bp = bson_parser_new(); bson_parser_utf8(bp, "state", &expected); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (!op->session) { test_set_error(error, "expected session"); goto done; } state = mongoc_client_session_get_transaction_state(op->session); actual = transaction_state_to_string(state); if (0 != strcmp(expected, actual)) { test_set_error(error, "expected state: %s, got state: %s", expected, actual); goto done; } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool assert_collection_exists(test_t *test, operation_t *op, result_t *result, bool expect_exist, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *collection_name = NULL; char *database_name = NULL; mongoc_database_t *db = NULL; bson_error_t op_error = {0}; bool actual_exist = false; char **head = NULL, **iter = NULL; bp = bson_parser_new(); bson_parser_utf8(bp, "collectionName", &collection_name); bson_parser_utf8(bp, "databaseName", &database_name); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } db = mongoc_client_get_database(test->test_file->test_runner->internal_client, database_name); head = mongoc_database_get_collection_names_with_opts(db, NULL, &op_error); for (iter = head; *iter; iter++) { if (0 == strcmp(*iter, collection_name)) { actual_exist = true; break; } } if (expect_exist != actual_exist) { test_set_error(error, "expected collection %s %s exist but %s", collection_name, expect_exist ? "to" : "to not", expect_exist ? "did not" : "did"); goto done; } result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: bson_strfreev(head); mongoc_database_destroy(db); bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_assert_collection_exists(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_collection_exists(test, op, result, true, error); } static bool operation_assert_collection_not_exists(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_collection_exists(test, op, result, false, error); } static bool operation_commit_transaction(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_session_t *session = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; session = entity_map_get_session(test->entity_map, op->object, error); if (!session) { goto done; } bson_destroy(&op_reply); mongoc_client_session_commit_transaction(session, &op_reply, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_destroy(&op_reply); return ret; } static bool operation_abort_transaction(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; mongoc_client_session_t *session = NULL; bson_error_t op_error = {0}; session = entity_map_get_session(test->entity_map, op->object, error); if (!session) { goto done; } mongoc_client_session_abort_transaction(session, &op_error); result_from_val_and_reply(result, NULL, NULL, &op_error); ret = true; done: return ret; } static bool assert_index_exists(test_t *test, operation_t *op, result_t *result, bool expect_exist, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *collection_name = NULL; char *database_name = NULL; char *index_name = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error = {0}; bool actual_exist = false; mongoc_cursor_t *cursor = NULL; const bson_t *index; const bson_t *error_doc = NULL; bp = bson_parser_new(); bson_parser_utf8(bp, "collectionName", &collection_name); bson_parser_utf8(bp, "databaseName", &database_name); bson_parser_utf8(bp, "indexName", &index_name); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } coll = mongoc_client_get_collection(test->test_file->test_runner->internal_client, database_name, collection_name); cursor = mongoc_collection_find_indexes_with_opts(coll, NULL); while (mongoc_cursor_next(cursor, &index)) { bson_iter_t iter; if (!bson_iter_init_find(&iter, index, "name")) { continue; } if (!BSON_ITER_HOLDS_UTF8(&iter)) { continue; } if (0 != strcmp(bson_iter_utf8(&iter, NULL), index_name)) { continue; } actual_exist = true; break; } mongoc_cursor_error_document(cursor, &op_error, &error_doc); if (expect_exist != actual_exist) { test_set_error(error, "expected index %s %s exist but %s", index_name, expect_exist ? "to" : "to not", expect_exist ? "did not" : "did"); goto done; } result_from_val_and_reply(result, NULL, (bson_t *)error_doc, &op_error); ret = true; done: mongoc_cursor_destroy(cursor); mongoc_collection_destroy(coll); bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_assert_index_exists(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_index_exists(test, op, result, true, error); } static bool operation_assert_index_not_exists(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_index_exists(test, op, result, false, error); } typedef struct { test_t *test; bson_t *ops; } txn_ctx_t; static bool with_transaction_cb(mongoc_client_session_t *session, void *ctx, bson_t **reply, bson_error_t *error) { bool ret = false; bson_iter_t iter; txn_ctx_t *tctx = NULL; BSON_UNUSED(session); BSON_UNUSED(reply); tctx = (txn_ctx_t *)ctx; BSON_FOREACH(tctx->ops, iter) { bson_t op_bson; bson_iter_bson(&iter, &op_bson); MONGOC_DEBUG("in with_transaction_cb running: %s", tmp_json(&op_bson)); if (!operation_run(tctx->test, &op_bson, error)) { goto done; } } ret = true; done: return ret; } static bool operation_with_transaction(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; mongoc_client_session_t *session = NULL; bson_t op_reply = BSON_INITIALIZER; bson_error_t op_error = {0}; mongoc_read_concern_t *rc = NULL; mongoc_write_concern_t *wc = NULL; mongoc_read_prefs_t *rp = NULL; mongoc_transaction_opt_t *topts = NULL; txn_ctx_t tctx; session = entity_map_get_session(test->entity_map, op->object, error); if (!session) { goto done; } topts = mongoc_transaction_opts_new(); bp = bson_parser_new(); bson_parser_array(bp, "callback", &tctx.ops); bson_parser_read_concern_optional(bp, &rc); bson_parser_write_concern_optional(bp, &wc); bson_parser_read_prefs_optional(bp, &rp); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (rc) { mongoc_transaction_opts_set_read_concern(topts, rc); } if (wc) { mongoc_transaction_opts_set_write_concern(topts, wc); } if (rp) { mongoc_transaction_opts_set_read_prefs(topts, rp); } tctx.test = test; bson_destroy(&op_reply); mongoc_client_session_with_transaction(session, with_transaction_cb, topts, &tctx, &op_reply, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); mongoc_transaction_opts_destroy(topts); bson_destroy(&op_reply); return ret; } static bool assert_session_pinned(test_t *test, operation_t *op, result_t *result, bool expect_pinned, bson_error_t *error) { bool ret = false; bool actual_pinned = false; BSON_UNUSED(test); if (!op->session) { test_set_error(error, "%s", "expected session to be set"); goto done; } if (0 != mongoc_client_session_get_server_id(op->session)) { actual_pinned = true; } if (actual_pinned != expect_pinned) { test_set_error(error, "expected session to be %s but got %s", expect_pinned ? "pinned" : "unpinned", expect_pinned ? "unpinned" : "pinnned"); goto done; } result_from_ok(result); ret = true; done: return ret; } static bool operation_assert_session_pinned(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_session_pinned(test, op, result, true, error); } static bool operation_assert_session_unpinned(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { return assert_session_pinned(test, op, result, false, error); } static bool operation_assert_number_connections_checked_out(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { BSON_UNUSED(test); BSON_UNUSED(op); BSON_UNUSED(error); /* "This operation only applies to drivers that implement connection pooling * and should be skipped for drivers that do not." * TODO: (CDRIVER-3525) add this assertion when CMAP is implemented. */ result_from_ok(result); return true; } static bool operation_wait(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { BSON_UNUSED(test); BSON_UNUSED(error); bson_iter_t iter; bson_iter_init_find(&iter, op->arguments, "ms"); ASSERT(BSON_ITER_HOLDS_INT(&iter)); const int64_t sleep_msec = bson_iter_as_int64(&iter); mlib_sleep_for(sleep_msec, ms); result_from_ok(result); return true; } static bool operation_rename(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { // First validate the arguments const char *object = op->object; bson_parser_t *bp = bson_parser_new(); bool ret = false; bool *drop_target = NULL; char *new_name = NULL; bson_parser_utf8(bp, "to", &new_name); bson_parser_bool_optional(bp, "dropTarget", &drop_target); bool parse_ok = bson_parser_parse(bp, op->arguments, error); bson_parser_destroy(bp); if (!parse_ok) { goto done; } // Now get the entity entity_t *ent = entity_map_get(test->entity_map, object, error); if (!ent) { goto done; } // We only support collections so far if (0 != strcmp(ent->type, "collection")) { test_set_error(error, "'rename' is only supported for collection objects " "'%s' has type '%s'", object, ent->type); goto done; } // Rename the collection in the server, mongoc_collection_t *coll = ent->value; if (!mongoc_collection_rename(coll, NULL, new_name, drop_target ? *drop_target : false, error)) { goto done; } result_from_ok(result); ret = true; done: bson_free(new_name); bson_free(drop_target); return ret; } static bool operation_createSearchIndex(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); bson_t *model = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error; bson_t op_reply = BSON_INITIALIZER; bson_t *cmd = bson_new(); // Parse arguments. bson_parser_doc(bp, "model", &model); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } // Build command. bsonBuildAppend(*cmd, kv("createSearchIndexes", cstr(coll->collection)), kv("indexes", array(bson(*model)))); ASSERT(!bsonBuildError); mongoc_collection_command_simple(coll, cmd, NULL /* read_prefs */, NULL /* reply */, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_destroy(cmd); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_createSearchIndexes(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); bson_t *models = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error; bson_t op_reply = BSON_INITIALIZER; bson_t *cmd = bson_new(); // Parse arguments. bson_parser_array(bp, "models", &models); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } // Build command. bsonBuildAppend(*cmd, kv("createSearchIndexes", cstr(coll->collection)), kv("indexes", bsonArray(*models))); ASSERT(!bsonBuildError); mongoc_collection_command_simple(coll, cmd, NULL /* read_prefs */, NULL /* reply */, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_destroy(cmd); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_dropSearchIndex(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *name = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error; bson_t op_reply = BSON_INITIALIZER; bson_t *cmd = bson_new(); // Parse arguments. bson_parser_utf8(bp, "name", &name); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } // Build command. bsonBuildAppend(*cmd, kv("dropSearchIndex", cstr(coll->collection)), kv("name", cstr(name))); ASSERT(!bsonBuildError); mongoc_collection_command_simple(coll, cmd, NULL /* read_prefs */, NULL /* reply */, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_destroy(cmd); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_listSearchIndexes(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); bson_t *aggregateOptions = NULL; char *name = NULL; mongoc_collection_t *coll = NULL; bson_t *pipeline = bson_new(); mongoc_cursor_t *cursor = NULL; // Parse arguments. if (op->arguments) { bson_parser_utf8_optional(bp, "name", &name); bson_parser_doc_optional(bp, "aggregationOptions", &aggregateOptions); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } // Build command. bsonBuildAppend( *pipeline, kv("pipeline", array(doc(kv("$listSearchIndexes", if (name != NULL, then(doc(kv("name", cstr(name)))), else(doc()))))))); ASSERT(!bsonBuildError); cursor = mongoc_collection_aggregate( coll, MONGOC_QUERY_NONE, pipeline, aggregateOptions /* opts */, NULL /* read_prefs */); result_from_cursor(result, cursor); ret = true; done: mongoc_cursor_destroy(cursor); bson_destroy(pipeline); bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_updateSearchIndex(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); bson_t *definition = NULL; char *name = NULL; mongoc_collection_t *coll = NULL; bson_error_t op_error; bson_t op_reply = BSON_INITIALIZER; bson_t *cmd = bson_new(); // Parse arguments. bson_parser_doc(bp, "definition", &definition); bson_parser_utf8_optional(bp, "name", &name); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } coll = entity_map_get_collection(test->entity_map, op->object, error); if (!coll) { goto done; } // Build command. bsonBuildAppend(*cmd, kv("updateSearchIndex", cstr(coll->collection)), kv("definition", bson(*definition)), if (name != NULL, then(kv("name", cstr(name))))); ASSERT(!bsonBuildError); mongoc_collection_command_simple(coll, cmd, NULL /* read_prefs */, NULL /* reply */, &op_error); result_from_val_and_reply(result, NULL, &op_reply, &op_error); ret = true; done: bson_destroy(cmd); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&op_reply); return ret; } static bool operation_create_entities(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); bson_t *entities; bson_parser_array_optional(bp, "entities", &entities); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } bson_iter_t entity_iter; BSON_FOREACH(entities, entity_iter) { bson_t entity; bson_iter_bson(&entity_iter, &entity); bool create_ret = entity_map_create(test->entity_map, &entity, test->cluster_time_after_initial_data, error); bson_destroy(&entity); if (!create_ret) { goto done; } } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } #define WAIT_FOR_EVENT_TIMEOUT_MS (10 * 1000) // Specified by test runner spec #define WAIT_FOR_EVENT_TICK_MS 10 // Same tick size as used in non-unified json test static bool log_filter_hide_server_selection_operation(const mongoc_structured_log_entry_t *entry, void *user_data) { BSON_ASSERT_PARAM(entry); BSON_ASSERT_PARAM(user_data); const char *expected_operation = (const char *)user_data; if (mongoc_structured_log_entry_get_component(entry) == MONGOC_STRUCTURED_LOG_COMPONENT_SERVER_SELECTION) { bson_t *bson = mongoc_structured_log_entry_message_as_bson(entry); bson_iter_t iter; BSON_ASSERT(bson_iter_init_find(&iter, bson, "operation")); BSON_ASSERT(BSON_ITER_HOLDS_UTF8(&iter)); BSON_ASSERT(0 == strcmp(expected_operation, bson_iter_utf8(&iter, NULL))); bson_destroy(bson); return false; } return true; } static void _operation_hidden_wait(test_t *test, entity_t *client, const char *name) { mlib_sleep_for(WAIT_FOR_EVENT_TICK_MS, ms); // @todo Re-examine this once we have support for connection pools in the unified test // runner. Without pooling, all events we could be waiting on would be coming // from single-threaded (blocking) topology scans, or from lazily opening the topology // description when it's first used. Request stream selection after blocking, to // handle either of these cases. // // Structured logs can not be fully suppressed here, because we do need to emit topology // lifecycle events. Filter out only the server selection operation here, and ASSERT // that it's the waitForEvent we expect. entity_log_filter_push(client, log_filter_hide_server_selection_operation, (void *)name); mongoc_client_t *mc_client = entity_map_get_client(test->entity_map, client->id, NULL); if (mc_client) { const mongoc_ss_log_context_t ss_log_context = {.operation = name}; mongoc_server_stream_t *stream = mongoc_cluster_stream_for_reads(&mc_client->cluster, &ss_log_context, NULL /* read_prefs */, NULL /* client session */, NULL /* deprioritized servers */, NULL /* reply */, NULL /* error */); if (stream) { mongoc_server_stream_cleanup(stream); } } entity_log_filter_pop(client, log_filter_hide_server_selection_operation, (void *)name); } static bool operation_wait_for_event(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; int64_t start_time = bson_get_monotonic_time(); bson_parser_t *bp = bson_parser_new(); char *client_id; bson_t *expected_event; int64_t *expected_count; bson_parser_utf8(bp, "client", &client_id); bson_parser_doc(bp, "event", &expected_event); bson_parser_int(bp, "count", &expected_count); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } entity_t *client = entity_map_get(test->entity_map, client_id, error); if (!client) { goto done; } // @todo CDRIVER-3525 test support for CMAP events once supported by libmongoc bson_iter_t iter; bson_iter_init(&iter, expected_event); bson_iter_next(&iter); const char *expected_event_type = bson_iter_key(&iter); if (is_unsupported_event_type(expected_event_type)) { MONGOC_DEBUG("SKIPPING waitForEvent for unsupported event type '%s'", expected_event_type); result_from_ok(result); ret = true; goto done; } while (true) { int64_t count; if (!test_count_matching_events_for_client(test, client, expected_event, error, &count)) { goto done; } if (count >= *expected_count) { break; } int64_t duration = bson_get_monotonic_time() - start_time; if (duration >= (int64_t)WAIT_FOR_EVENT_TIMEOUT_MS * 1000) { char *event_list_string = event_list_to_string(client->events); test_diagnostics_error_info("all captured events for client:\n%s", event_list_string); bson_free(event_list_string); test_diagnostics_error_info("checking for expected event: %s\n", tmp_json(expected_event)); test_set_error(error, "waitForEvent timed out with %" PRId64 " of %" PRId64 " matches needed. waited %dms (max %dms)", count, *expected_count, (int)(duration / 1000), (int)WAIT_FOR_EVENT_TIMEOUT_MS); goto done; } _operation_hidden_wait(test, client, "waitForEvent"); } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } /* Test for an event match document containing an unsupported event type as defined by is_unsupported_event_type(). If * the match document has an unexpected format, returns false. */ static bool is_unsupported_event_match_document(const bson_t *event_match) { BSON_ASSERT_PARAM(event_match); if (bson_count_keys(event_match) == 1) { bson_iter_t iter; bson_iter_init(&iter, event_match); bson_iter_next(&iter); return is_unsupported_event_type(bson_iter_key(&iter)); } else { return false; } } static bool operation_assert_event_count(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *client_id; bson_t *expected_event; int64_t *expected_count; bson_parser_utf8(bp, "client", &client_id); bson_parser_doc(bp, "event", &expected_event); bson_parser_int(bp, "count", &expected_count); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } if (is_unsupported_event_match_document(expected_event)) { MONGOC_DEBUG("SKIPPING assertEventCount for unsupported event %s", tmp_json(expected_event)); result_from_ok(result); ret = true; goto done; } entity_t *client = entity_map_get(test->entity_map, client_id, error); if (!client) { goto done; } int64_t actual_count; if (!test_count_matching_events_for_client(test, client, expected_event, error, &actual_count)) { goto done; } if (actual_count != *expected_count) { char *event_list_string = event_list_to_string(client->events); test_diagnostics_error_info("all captured events for client:\n%s", event_list_string); bson_free(event_list_string); test_diagnostics_error_info("checking for expected event: %s\n", tmp_json(expected_event)); test_set_error(error, "assertEventCount found %" PRId64 " matches, required exactly %" PRId64 " matches", actual_count, *expected_count); goto done; } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static const char * tmp_topology_description_json(const mongoc_topology_description_t *td) { bson_t bson = BSON_INITIALIZER; BSON_ASSERT(mongoc_topology_description_append_contents_to_bson( td, &bson, MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_TYPE | MONGOC_TOPOLOGY_DESCRIPTION_CONTENT_FLAG_SERVERS, MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_ADDRESS | MONGOC_SERVER_DESCRIPTION_CONTENT_FLAG_TYPE)); const char *result = tmp_json(&bson); bson_destroy(&bson); return result; } static bool operation_record_topology_description(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *client_id, *td_id; bson_parser_utf8(bp, "client", &client_id); bson_parser_utf8(bp, "id", &td_id); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } mongoc_client_t *client = entity_map_get_client(test->entity_map, client_id, error); if (!client) { goto done; } mongoc_topology_description_t *td_copy = bson_malloc0(sizeof *td_copy); mc_shared_tpld td = mc_tpld_take_ref(client->topology); _mongoc_topology_description_copy_to(td.ptr, td_copy); mc_tpld_drop_ref(&td); MONGOC_DEBUG("Recording topology description '%s': %s", td_id, tmp_topology_description_json(td_copy)); if (!entity_map_add_topology_description(test->entity_map, td_id, td_copy, error)) { mongoc_topology_description_destroy(td_copy); goto done; } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_assert_topology_type(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *td_id, *expected_topology_type; bson_parser_utf8(bp, "topologyDescription", &td_id); bson_parser_utf8(bp, "topologyType", &expected_topology_type); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } // Pointer borrowed from entity mongoc_topology_description_t *td = entity_map_get_topology_description(test->entity_map, td_id, error); if (!td) { goto done; } // Static lifetime const char *actual_topology_type = mongoc_topology_description_type(td); if (0 != strcmp(expected_topology_type, actual_topology_type)) { test_set_error(error, "assertTopologyType failed, expected '%s' but found type '%s' in topology description: %s", expected_topology_type, actual_topology_type, tmp_topology_description_json(td)); goto done; } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool operation_wait_for_primary_change(test_t *test, operation_t *op, result_t *result, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *client_id, *prior_td_id; int64_t *optional_timeout_ms = NULL; bson_parser_utf8(bp, "client", &client_id); bson_parser_utf8(bp, "priorTopologyDescription", &prior_td_id); bson_parser_int_optional(bp, "timeoutMS", &optional_timeout_ms); if (!bson_parser_parse(bp, op->arguments, error)) { goto done; } int64_t timeout = INT64_C(1000) * (optional_timeout_ms ? *optional_timeout_ms : INT64_C(10000)); int64_t start_time = bson_get_monotonic_time(); mongoc_client_t *mc_client = entity_map_get_client(test->entity_map, client_id, error); if (!mc_client) { goto done; } entity_t *client = entity_map_get(test->entity_map, client_id, error); BSON_ASSERT(client); // Pointer borrowed from entity mongoc_topology_description_t *prior_td = entity_map_get_topology_description(test->entity_map, prior_td_id, error); if (!prior_td) { goto done; } // Will be NULL when there's no primary const mongoc_server_description_t *prior_primary = _mongoc_topology_description_has_primary(prior_td); while (true) { mc_shared_tpld td = mc_tpld_take_ref(mc_client->topology); const mongoc_server_description_t *primary = _mongoc_topology_description_has_primary(td.ptr); if (!prior_primary && primary) { MONGOC_DEBUG("waitForPrimaryChange succeeded by transitioning from none to any"); mc_tpld_drop_ref(&td); break; } if (prior_primary && primary && !_mongoc_server_description_equal(prior_primary, primary)) { MONGOC_DEBUG("waitForPrimaryChange succeeded by switching to a different primary server"); mc_tpld_drop_ref(&td); break; } int64_t duration = bson_get_monotonic_time() - start_time; if (duration >= timeout) { test_set_error(error, "waitForPrimaryChange timed out. waited %fms (max %fms). \nprior topology description: " "%s\ncurrent topology description: %s", duration / 1000.0, timeout / 1000.0, tmp_topology_description_json(prior_td), tmp_topology_description_json(td.ptr)); mc_tpld_drop_ref(&td); goto done; } mc_tpld_drop_ref(&td); _operation_hidden_wait(test, client, "waitForPrimaryChange"); } result_from_ok(result); ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } typedef struct { const char *op; bool (*fn)(test_t *, operation_t *, result_t *, bson_error_t *); } op_to_fn_t; bool operation_run(test_t *test, bson_t *op_bson, bson_error_t *error) { operation_t *op = NULL; result_t *result = NULL; int i, num_ops; bool check_result = true; op_to_fn_t op_to_fn_map[] = { /* Client operations */ {"createChangeStream", operation_create_change_stream}, {"listDatabases", operation_list_databases}, {"listDatabaseNames", operation_list_database_names}, {"clientBulkWrite", operation_client_bulkwrite}, /* ClientEncryption operations */ {"createDataKey", operation_create_datakey}, {"rewrapManyDataKey", operation_rewrap_many_datakey}, {"deleteKey", operation_delete_key}, {"getKey", operation_get_key}, {"getKeys", operation_get_keys}, {"addKeyAltName", operation_add_key_alt_name}, {"removeKeyAltName", operation_remove_key_alt_name}, {"getKeyByAltName", operation_get_key_by_alt_name}, {"encrypt", operation_encrypt}, {"decrypt", operation_decrypt}, /* Database operations */ {"createCollection", operation_create_collection}, {"dropCollection", operation_drop_collection}, {"listCollections", operation_list_collections}, {"listCollectionNames", operation_list_collection_names}, {"listIndexes", operation_list_indexes}, {"runCommand", operation_run_command}, {"modifyCollection", operation_modify_collection}, /* Collection operations */ {"aggregate", operation_aggregate}, {"bulkWrite", operation_bulk_write}, {"countDocuments", operation_count_documents}, {"createFindCursor", operation_create_find_cursor}, {"createIndex", operation_create_index}, {"deleteOne", operation_delete_one}, {"deleteMany", operation_delete_many}, {"distinct", operation_distinct}, {"estimatedDocumentCount", operation_estimated_document_count}, {"find", operation_find}, {"findOneAndDelete", operation_find_one_and_delete}, {"findOneAndReplace", operation_find_one_and_replace}, {"findOneAndUpdate", operation_find_one_and_update}, {"insertMany", operation_insert_many}, {"insertOne", operation_insert_one}, {"replaceOne", operation_replace_one}, {"updateOne", operation_update_one}, {"updateMany", operation_update_many}, {"rename", operation_rename}, {"createSearchIndex", operation_createSearchIndex}, {"createSearchIndexes", operation_createSearchIndexes}, {"dropSearchIndex", operation_dropSearchIndex}, {"listSearchIndexes", operation_listSearchIndexes}, {"updateSearchIndex", operation_updateSearchIndex}, /* Change stream and cursor operations */ {"iterateUntilDocumentOrError", operation_iterate_until_document_or_error}, {"close", operation_close}, {"dropIndex", operation_drop_index}, /* Test runner operations */ {"failPoint", operation_failpoint}, {"targetedFailPoint", operation_targeted_failpoint}, {"assertSessionDirty", operation_assert_session_dirty}, {"assertSessionNotDirty", operation_assert_session_not_dirty}, {"assertSameLsidOnLastTwoCommands", operation_assert_same_lsid_on_last_two_commands}, {"assertDifferentLsidOnLastTwoCommands", operation_assert_different_lsid_on_last_two_commands}, {"assertSessionTransactionState", operation_assert_session_transaction_state}, {"assertCollectionNotExists", operation_assert_collection_not_exists}, {"assertCollectionExists", operation_assert_collection_exists}, {"assertIndexNotExists", operation_assert_index_not_exists}, {"assertIndexExists", operation_assert_index_exists}, {"assertSessionPinned", operation_assert_session_pinned}, {"assertSessionUnpinned", operation_assert_session_unpinned}, {"assertNumberConnectionsCheckedOut", operation_assert_number_connections_checked_out}, {"wait", operation_wait}, {"waitForEvent", operation_wait_for_event}, {"assertEventCount", operation_assert_event_count}, {"recordTopologyDescription", operation_record_topology_description}, {"assertTopologyType", operation_assert_topology_type}, {"waitForPrimaryChange", operation_wait_for_primary_change}, /* GridFS operations */ {"delete", operation_delete}, {"download", operation_download}, {"upload", operation_upload}, /* Session operations */ {"endSession", operation_end_session}, {"startTransaction", operation_start_transaction}, {"commitTransaction", operation_commit_transaction}, {"withTransaction", operation_with_transaction}, {"abortTransaction", operation_abort_transaction}, /* Entity operations */ {"createEntities", operation_create_entities}, }; bool ret = false; op = operation_new(op_bson, error); if (!op) { goto done; } /* Check for a "session" argument in all operations, it can be * an argument for any operation. */ if (op->arguments && bson_has_field(op->arguments, "session")) { bson_t copied = BSON_INITIALIZER; mongoc_client_session_t *session = NULL; op->session_id = bson_strdup(bson_lookup_utf8(op->arguments, "session")); session = entity_map_get_session(test->entity_map, op->session_id, error); if (!session) { goto done; } bson_copy_to_excluding_noinit(op->arguments, &copied, "session", NULL); bson_destroy(op->arguments); op->arguments = bson_copy(&copied); bson_destroy(&copied); op->session = session; } // Avoid spamming output with sub-operations when executing loop operation. if (!test->loop_operation_executed) { MONGOC_DEBUG("running operation: %s", tmp_json(op_bson)); } num_ops = sizeof(op_to_fn_map) / sizeof(op_to_fn_t); result = result_new(); if (op->ignore_result_and_error && *op->ignore_result_and_error) { check_result = false; } for (i = 0; i < num_ops; i++) { if (0 == strcmp(op->name, op_to_fn_map[i].op)) { if (!op_to_fn_map[i].fn(test, op, result, error)) { goto done; } if (check_result && !result_check(result, test->entity_map, op->expect_result, op->expect_error, error)) { test_diagnostics_error_info("checking for result (%s) / error (%s)", bson_val_to_json(op->expect_result), tmp_json(op->expect_error)); goto done; } if (result_get_val(result) != NULL && op->save_result_as_entity) { if (!entity_map_add_bson(test->entity_map, op->save_result_as_entity, result_get_val(result), error)) { goto done; } } break; } } if (i == num_ops) { test_set_error(error, "unrecognized operation: %s", op->name); goto done; } ret = true; done: operation_destroy(op); result_destroy(result); return ret; } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/operation.h000066400000000000000000000014501511661753600240550ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_OPERATION_H #define UNIFIED_OPERATION_H #include "./runner.h" #include bool operation_run(test_t *test, bson_t *bson, bson_error_t *error); #endif /* UNIFIED_OPERATION_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/unified/result.c000066400000000000000000000621311511661753600233710ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./result.h" #include "./util.h" #include #include #include #include #include #include #include struct _result_t { bool ok; bson_val_t *value; bson_error_t error; /* For a write operation, reply is the original unmodified write result for a write operation. For a read operation, reply is an optional server reply. */ bson_t *reply; char *str; bool array_of_root_docs; // For a mongoc_client_bulkwrite operation, `write_errors` and // `write_concern_errors` are optionally set. bson_t *write_errors; bson_t *write_concern_errors; }; result_t * result_new(void) { return bson_malloc0(sizeof(result_t)); } static void _result_init(result_t *result, const bson_val_t *value, const bson_t *reply, const bson_error_t *error) { mcommon_string_append_t str; mcommon_string_new_as_append(&str); if (value) { result->value = bson_val_copy(value); mcommon_string_append_printf(&str, "value=%s ", bson_val_to_json(value)); } if (reply) { char *reply_str = bson_as_canonical_extended_json(reply, NULL); mcommon_string_append_printf(&str, "reply=%s ", reply_str); result->reply = bson_copy(reply); bson_free(reply_str); } mcommon_string_append_printf(&str, "bson_error=%s", error->message); memcpy(&result->error, error, sizeof(bson_error_t)); result->ok = (error->code == 0); result->str = mcommon_string_from_append_destroy_with_steal(&str); result->write_errors = bson_new(); result->write_concern_errors = bson_new(); } void result_destroy(result_t *result) { if (!result) { return; } bson_val_destroy(result->value); bson_destroy(result->reply); bson_free(result->str); bson_destroy(result->write_errors); bson_destroy(result->write_concern_errors); bson_free(result); } const char * result_to_string(result_t *result) { return result->str; } bson_val_t * result_get_val(result_t *result) { return result->value; } bson_t * rewrite_upserted_ids(bson_t *mongoc_upserted_ids) { bson_t *upserted_ids; bson_iter_t iter; upserted_ids = bson_new(); BSON_FOREACH(mongoc_upserted_ids, iter) { bson_t el; bson_parser_t *el_bp; int64_t *index; bson_val_t *id; char storage[16]; const char *key; bson_iter_bson(&iter, &el); el_bp = bson_parser_new(); bson_parser_int(el_bp, "index", &index); bson_parser_any(el_bp, "_id", &id); bson_parser_parse_or_assert(el_bp, &el); bson_uint32_to_string((uint32_t)*index, &key, storage, sizeof(storage)); BSON_APPEND_VALUE(upserted_ids, key, bson_val_to_value(id)); bson_parser_destroy_with_parsed_fields(el_bp); } return upserted_ids; } bson_t * rewrite_bulk_write_result(const bson_t *bulk_write_result) { bson_t *const res = bson_new(); if (!bson_empty0(bulk_write_result)) { BCON_APPEND(res, "insertedCount", BCON_INT32(bson_lookup_int32(bulk_write_result, "nInserted")), "deletedCount", BCON_INT32(bson_lookup_int32(bulk_write_result, "nRemoved")), "matchedCount", BCON_INT32(bson_lookup_int32(bulk_write_result, "nMatched")), "modifiedCount", BCON_INT32(bson_lookup_int32(bulk_write_result, "nModified")), "upsertedCount", BCON_INT32(bson_lookup_int32(bulk_write_result, "nUpserted"))); if (bson_has_field(bulk_write_result, "upserted")) { bson_t *const upserted_ids = bson_lookup_bson(bulk_write_result, "upserted"); bson_t *const rewritten_upserted_ids = rewrite_upserted_ids(upserted_ids); BSON_APPEND_DOCUMENT(res, "upsertedIds", rewritten_upserted_ids); bson_destroy(upserted_ids); bson_destroy(rewritten_upserted_ids); } else { /* upsertedIds is a required field in BulkWriteResult, so append an * empty document even if no documents were upserted. */ bson_t empty = BSON_INITIALIZER; BSON_APPEND_DOCUMENT(res, "upsertedIds", &empty); } } return res; } void result_from_bulk_write(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_t *const write_result = rewrite_bulk_write_result(reply); bson_val_t *const val = bson_val_from_bson(write_result); _result_init(result, val, reply, error); bson_val_destroy(val); bson_destroy(write_result); } void result_from_insert_one(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_t *write_result; bson_val_t *val; write_result = bson_new(); if (!bson_empty(reply)) { BCON_APPEND(write_result, "insertedCount", BCON_INT32(bson_lookup_int32(reply, "insertedCount"))); } val = bson_val_from_bson(write_result); _result_init(result, val, reply, error); bson_val_destroy(val); bson_destroy(write_result); } void result_from_insert_many(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_t *write_result; bson_val_t *val; write_result = bson_new(); if (!bson_empty(reply)) { BCON_APPEND(write_result, "insertedCount", BCON_INT32(bson_lookup_int32(reply, "insertedCount")), "deletedCount", BCON_INT32(0), "matchedCount", BCON_INT32(0), "modifiedCount", BCON_INT32(0), "upsertedCount", BCON_INT32(0), "upsertedIds", "{", "}"); } val = bson_val_from_bson(write_result); _result_init(result, val, reply, error); bson_val_destroy(val); bson_destroy(write_result); } void result_from_update_or_replace(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_t *write_result; bson_val_t *val; bson_iter_t iter; write_result = bson_new(); if (!bson_empty(reply)) { BCON_APPEND(write_result, "matchedCount", BCON_INT32(bson_lookup_int32(reply, "matchedCount")), "modifiedCount", BCON_INT32(bson_lookup_int32(reply, "modifiedCount")), "upsertedCount", BCON_INT32(bson_lookup_int32(reply, "upsertedCount"))); if (bson_iter_init_find(&iter, reply, "upsertedId")) { BSON_APPEND_VALUE(write_result, "upsertedId", bson_iter_value(&iter)); } } val = bson_val_from_bson(write_result); _result_init(result, val, reply, error); bson_val_destroy(val); bson_destroy(write_result); } void result_from_delete(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_t *write_result; bson_val_t *val; write_result = bson_new(); if (!bson_empty(reply)) { BCON_APPEND(write_result, "deletedCount", BCON_INT32(bson_lookup_int32(reply, "deletedCount"))); } val = bson_val_from_bson(write_result); _result_init(result, val, reply, error); bson_val_destroy(val); bson_destroy(write_result); } void result_from_distinct(result_t *result, const bson_t *reply, const bson_error_t *error) { bson_val_t *val = NULL; bson_iter_t iter; if (!bson_empty(reply)) { if (bson_iter_init_find(&iter, reply, "values")) { val = bson_val_from_iter(&iter); } } _result_init(result, val, reply, error); bson_val_destroy(val); } void result_from_cursor(result_t *result, mongoc_cursor_t *cursor) { bson_error_t error = {0}; const bson_t *reply = NULL; bson_t *documents = bson_new(); uint32_t i = 0; const bson_t *doc; bson_val_t *val; while (mongoc_cursor_next(cursor, &doc)) { const char *key; char storage[16]; bson_uint32_to_string(i, &key, storage, sizeof(storage) / sizeof(char)); BSON_APPEND_DOCUMENT(documents, key, doc); i++; } mongoc_cursor_error_document(cursor, &error, &reply); val = bson_val_from_array(documents); _result_init(result, val, (bson_t *)reply, &error); result->array_of_root_docs = true; bson_destroy(documents); bson_val_destroy(val); } void result_from_val_and_reply(result_t *result, const bson_val_t *val, const bson_t *reply, const bson_error_t *error) { _result_init(result, val, reply, error); } void result_from_ok(result_t *result) { bson_error_t error = {0}; _result_init(result, NULL, NULL, &error); } bool result_check(result_t *result, entity_map_t *em, bson_val_t *expect_result, bson_t *expect_error, bson_error_t *error) { bool ret = false; bson_parser_t *parser = NULL; bool *is_error; bool *is_client_error; char *error_contains; int64_t *error_code; char *error_code_name; bson_t *error_labels_contain; bson_t *error_labels_omit; bson_val_t *error_expect_result; bson_val_t *error_response; bson_t *write_errors = NULL; bson_t *write_concern_errors = NULL; if (!expect_result && !expect_error) { if (!result->ok) { test_set_error(error, "expected success, but got error: %s", result->error.message); goto done; } ret = true; goto done; } /* check result. */ if (expect_result) { if (!result->ok) { if (!bson_empty(result->write_errors)) { char *as_json = bson_as_canonical_extended_json(result->write_errors, NULL); test_diagnostics_error_info("Write errors: %s", as_json); bson_free(as_json); } if (!bson_empty(result->write_concern_errors)) { char *as_json = bson_as_canonical_extended_json(result->write_concern_errors, NULL); test_diagnostics_error_info("Write concern errors: %s", as_json); bson_free(as_json); } test_set_error(error, "expected result, but got error: %s", result->error.message); goto done; } if (!entity_map_match(em, expect_result, result->value, result->array_of_root_docs, error)) { test_diagnostics_error_info("Result mismatch:\n" "Expected: %s\n" "Actual: %s\n", bson_val_to_json(expect_result), bson_val_to_json(result->value)); goto done; } } if (expect_error) { parser = bson_parser_new(); bson_parser_bool_optional(parser, "isError", &is_error); bson_parser_bool_optional(parser, "isClientError", &is_client_error); bson_parser_utf8_optional(parser, "errorContains", &error_contains); bson_parser_int_optional(parser, "errorCode", &error_code); bson_parser_utf8_optional(parser, "errorCodeName", &error_code_name); bson_parser_array_optional(parser, "errorLabelsContain", &error_labels_contain); bson_parser_array_optional(parser, "errorLabelsOmit", &error_labels_omit); bson_parser_any_optional(parser, "expectResult", &error_expect_result); bson_parser_any_optional(parser, "errorResponse", &error_response); bson_parser_doc_optional(parser, "writeErrors", &write_errors); bson_parser_array_optional(parser, "writeConcernErrors", &write_concern_errors); if (!bson_parser_parse(parser, expect_error, error)) { goto done; } MONGOC_DEBUG("expected error"); if (result->ok) { test_set_error(error, "expected error, but no error: %s", bson_val_to_json(result->value)); goto done; } if (is_client_error && *is_client_error) { /* from errors.rst: "In Version 2, error codes originating on the * server always have error domain ``MONGOC_ERROR_SERVER`` or * ``MONGOC_ERROR_WRITE_CONCERN``" */ if (result->error.domain == MONGOC_ERROR_SERVER || result->error.domain == MONGOC_ERROR_WRITE_CONCERN_ERROR) { test_set_error(error, "expected client side error, but got: %" PRIu32 ", %" PRIu32, result->error.domain, result->error.code); goto done; } } if (error_contains) { if (mongoc_strcasestr(result->error.message, error_contains) == NULL) { test_set_error( error, "expected error to contain \"%s\", but got: \"%s\"", error_contains, result->error.message); goto done; } } if (error_code) { if ((*error_code) != (int64_t)result->error.code) { test_set_error( error, "expected error code %" PRIi64 ", but got: %" PRIi64, *error_code, (int64_t)result->error.code); goto done; } } /* Waiting on CDRIVER-3147 if (error_code_name) { bson_iter_t iter; if (!result->reply) { test_set_error (error, "%s", "expected error code name, but no error reply set"); goto done; } if (!bson_iter_init_find (&iter, result->reply, "codeName") || !BSON_ITER_HOLDS_UTF8 (&iter)) { test_set_error (error, "utf8 codeName not found in error reply: %s", tmp_json (result->reply)); goto done; } if (0 != bson_strcasecmp (bson_iter_utf8 (&iter, NULL), error_code_name)) { test_set_error (error, "expected codeName: %s, got: %s", error_code_name, bson_iter_utf8 (&iter, NULL)); goto done; } } */ if (error_labels_contain) { bson_iter_t iter; if (!result->reply) { test_set_error(error, "%s", "expected error to contain labels, but got no error document"); goto done; } BSON_FOREACH(error_labels_contain, iter) { const char *label; if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "expected UTF8 error label, got: %s", bson_type_to_string(bson_iter_type(&iter))); goto done; } label = bson_iter_utf8(&iter, NULL); if (!mongoc_error_has_label(result->reply, label)) { test_set_error( error, "expected error to contain label: %s, but got: %s", label, tmp_json(result->reply)); goto done; } } } if (error_labels_omit) { bson_iter_t iter; if (!result->reply) { test_set_error(error, "%s", "expected error to omit labels, but got no error document"); goto done; } BSON_FOREACH(error_labels_omit, iter) { const char *label; if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "expected UTF8 error label, got: %s", bson_type_to_string(bson_iter_type(&iter))); goto done; } label = bson_iter_utf8(&iter, NULL); if (mongoc_error_has_label(result->reply, label)) { test_set_error(error, "expected error to omit label: %s, but got: %s", label, tmp_json(result->reply)); goto done; } } } if (error_expect_result) { if (!result->value) { test_set_error(error, "%s", "expected error with result, but result unset"); goto done; } /* Note: expectError.expectResult is not used for cursor-bearing * operations, so array_of_root_docs should always be false */ BSON_ASSERT(!result->array_of_root_docs); if (!bson_match(error_expect_result, result->value, result->array_of_root_docs, error)) { test_diagnostics_error_info("error.expectResult mismatch:\nExpected: %s\nActual: %s\n", bson_val_to_json(error_expect_result), bson_val_to_json(result->value)); goto done; } } if (error_response) { if (!result->reply) { test_set_error(error, "%s", "expected error with a reply, but reply unset"); goto done; } /* Write operations have the raw response wrapped in a errorReplies * array. Read operations return the raw response as the reply. */ bson_t doc_to_match; bson_iter_t iter; if (bson_iter_init_find(&iter, result->reply, "errorReplies")) { bson_iter_t child; if (!BSON_ITER_HOLDS_ARRAY(&iter)) { test_set_error(error, "expected errorReplies to be an array, but received %s", bson_type_to_string(bson_iter_type(&iter))); goto done; } bson_iter_recurse(&iter, &child); bson_iter_next(&child); if (!BSON_ITER_HOLDS_DOCUMENT(&child)) { test_set_error(error, "expected errorReplies.0 to be a document but received %s", bson_type_to_string(bson_iter_type(&iter))); goto done; } bson_iter_bson(&child, &doc_to_match); } else { bson_copy_to(result->reply, &doc_to_match); } bson_val_t *val_to_match = bson_val_from_bson(&doc_to_match); if (!bson_match(error_response, val_to_match, result->array_of_root_docs, error)) { test_diagnostics_error_info("error.errorResponse mismatch:\nExpected: %s\nActual: %s\n", bson_val_to_json(error_response), bson_as_relaxed_extended_json(result->reply, NULL)); bson_val_destroy(val_to_match); bson_destroy(&doc_to_match); goto done; } bson_val_destroy(val_to_match); bson_destroy(&doc_to_match); } if (write_errors) { if (!result->write_errors) { test_set_error(error, "Expected writeErrors but got none"); goto done; } // Ensure the numeric keys of the expected `writeErrors` exactly match // the actual `writeErrors`. { bson_t *expected = write_errors; bson_t *actual = result->write_errors; bson_iter_t expected_iter; bson_iter_init(&expected_iter, expected); while (bson_iter_next(&expected_iter)) { bson_val_t *expected_val = bson_val_from_iter(&expected_iter); bson_val_t *actual_val = NULL; const char *key = bson_iter_key(&expected_iter); bson_iter_t actual_iter; if (!bson_iter_init_find(&actual_iter, actual, key)) { test_set_error(error, "error.writeErrors[%s] not found.\n" "Expected: %s\n" "Actual : (not found)\n", key, bson_val_to_json(expected_val)); bson_val_destroy(actual_val); bson_val_destroy(expected_val); goto done; } actual_val = bson_val_from_iter(&actual_iter); if (!bson_match(expected_val, actual_val, false, error)) { test_diagnostics_error_info("error.writeErrors[%s] mismatch:\n" "Expected: %s\n" "Actual : %s\n", key, bson_val_to_json(expected_val), bson_val_to_json(actual_val)); bson_val_destroy(actual_val); bson_val_destroy(expected_val); goto done; } bson_val_destroy(actual_val); bson_val_destroy(expected_val); } // Ensure no extra reported errors. bson_iter_t actual_iter; bson_iter_init(&actual_iter, actual); if (bson_iter_next(&actual_iter)) { bson_val_t *actual_val = bson_val_from_iter(&actual_iter); const char *key = bson_iter_key(&actual_iter); if (!bson_has_field(expected, key)) { test_set_error(error, "error.writeErrors[%s] mismatch:\n" "Expected: (not found)\n" "Actual : %s\n", key, bson_val_to_json(actual_val)); bson_val_destroy(actual_val); goto done; } bson_val_destroy(actual_val); } } } if (write_concern_errors) { bson_val_t *expected_val = bson_val_from_array(write_concern_errors); bson_val_t *actual_val = bson_val_from_array(result->write_concern_errors); if (!bson_match(expected_val, actual_val, true /* array of root documents */, error)) { test_diagnostics_error_info("error.writeConcernErrors mismatch:\n" "Expected: %s\n" "Actual : %s\n", bson_val_to_json(expected_val), bson_val_to_json(actual_val)); bson_val_destroy(actual_val); bson_val_destroy(expected_val); goto done; } bson_val_destroy(actual_val); bson_val_destroy(expected_val); } } ret = true; done: bson_parser_destroy_with_parsed_fields(parser); return ret; } void result_from_bulkwritereturn(result_t *result, mongoc_bulkwritereturn_t bwr) { // Build up the result value as a BSON document. bson_t bwr_bson = BSON_INITIALIZER; if (bwr.res) { BSON_APPEND_INT32(&bwr_bson, "insertedCount", mongoc_bulkwriteresult_insertedcount(bwr.res)); BSON_APPEND_INT32(&bwr_bson, "upsertedCount", mongoc_bulkwriteresult_upsertedcount(bwr.res)); BSON_APPEND_INT32(&bwr_bson, "matchedCount", mongoc_bulkwriteresult_matchedcount(bwr.res)); BSON_APPEND_INT32(&bwr_bson, "modifiedCount", mongoc_bulkwriteresult_modifiedcount(bwr.res)); BSON_APPEND_INT32(&bwr_bson, "deletedCount", mongoc_bulkwriteresult_deletedcount(bwr.res)); const bson_t *ir = mongoc_bulkwriteresult_insertresults(bwr.res); if (ir) { BSON_APPEND_DOCUMENT(&bwr_bson, "insertResults", ir); } const bson_t *ur = mongoc_bulkwriteresult_updateresults(bwr.res); if (ur) { BSON_APPEND_DOCUMENT(&bwr_bson, "updateResults", ur); } const bson_t *dr = mongoc_bulkwriteresult_deleteresults(bwr.res); if (dr) { BSON_APPEND_DOCUMENT(&bwr_bson, "deleteResults", dr); } } bson_error_t error = {0}; const bson_t *errorReply = NULL; // Include `errorLabels` and `errorReply` when initializing `result`. if (bwr.exc) { mongoc_bulkwriteexception_error(bwr.exc, &error); errorReply = mongoc_bulkwriteexception_errorreply(bwr.exc); } bson_val_t *bwr_val = bson_val_from_bson(&bwr_bson); result_from_val_and_reply(result, bwr_val, errorReply, &error); // Add `writeErrors` and `writeConcernErrors` after initializing. if (bwr.exc) { result->ok = false; // An error occurred. const bson_t *writeErrors = mongoc_bulkwriteexception_writeerrors(bwr.exc); bson_destroy(result->write_errors); result->write_errors = bson_copy(writeErrors); const bson_t *writeConcernErrors = mongoc_bulkwriteexception_writeconcernerrors(bwr.exc); bson_destroy(result->write_concern_errors); result->write_concern_errors = bson_copy(writeConcernErrors); } bson_destroy(&bwr_bson); bson_val_destroy(bwr_val); } static void test_resultfrombulkwrite(void) { bson_error_t error; result_t *result; bson_t *reply; bson_val_t *expect; bson_error_t empty = {0}; result = result_new(); reply = tmp_bson("{ 'nInserted': 0, 'nRemoved' : 1, 'nMatched' : 2, " "'nModified' : 3, 'nUpserted' : 4 }"); expect = bson_val_from_json("{ 'insertedCount': 0, 'deletedCount': 1, 'matchedCount': 2, " "'modifiedCount': 3, 'upsertedCount': 4}"); result_from_bulk_write(result, reply, &empty); MONGOC_DEBUG("rewritten to: %s", bson_val_to_json(result->value)); if (!result_check(result, NULL, expect, NULL, &error)) { test_error("result_check error: %s", error.message); } result_destroy(result); bson_val_destroy(expect); } void test_result_install(TestSuite *suite) { TestSuite_Add(suite, "/unified/result/resultfrombulkwrite", test_resultfrombulkwrite); } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/result.h000066400000000000000000000041741511661753600234010ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_OPERATION_RESULT_H #define UNIFIED_OPERATION_RESULT_H #include "./entity-map.h" #include "./test-diagnostics.h" #include #include #include typedef struct _result_t result_t; result_t * result_new(void); void result_destroy(result_t *result); void result_from_bulk_write(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_bulkwritereturn(result_t *result, mongoc_bulkwritereturn_t bwr); void result_from_insert_one(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_insert_many(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_delete(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_distinct(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_update_or_replace(result_t *result, const bson_t *reply, const bson_error_t *error); void result_from_cursor(result_t *result, mongoc_cursor_t *cursor); void result_from_val_and_reply(result_t *result, const bson_val_t *value, const bson_t *reply, const bson_error_t *error); void result_from_ok(result_t *result); const char * result_to_string(result_t *result); bson_val_t * result_get_val(result_t *result); bson_t * rewrite_bulk_write_result(const bson_t *bulk_write_result); bool result_check(result_t *result, entity_map_t *em, bson_val_t *expect_result, bson_t *expect_error, bson_error_t *error); #endif /* UNIFIED_OPERATION_RESULT_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/unified/runner.c000066400000000000000000002275051511661753600233740ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./entity-map.h" #include "./operation.h" #include "./runner.h" #include "./test-diagnostics.h" #include "./util.h" #include #include #include #include #include #include #include #include #include #include #include #include typedef struct { const char *file_description; const char *test_description; } skipped_unified_test_t; #define SKIP_ALL_TESTS NULL // clang-format off skipped_unified_test_t SKIPPED_TESTS[] = { // CDRIVER-4001, DRIVERS-1781, and DRIVERS-1448: 5.0 cursor behavior {"poc-command-monitoring", "A successful find event with a getmore and the server kills the cursor"}, // libmongoc does not have a distinct helper, so skip snapshot tests testing particular distinct functionality {"snapshot-sessions", "Distinct operation with snapshot"}, {"snapshot-sessions", "Mixed operation with snapshot"}, // CDRIVER-2871: CMAP is not implemented {"assertNumberConnectionsCheckedOut", SKIP_ALL_TESTS}, {"entity-client-cmap-events", SKIP_ALL_TESTS}, {"expectedEventsForClient-eventType", SKIP_ALL_TESTS}, {"driver-connection-id", SKIP_ALL_TESTS}, {"minPoolSize-error", SKIP_ALL_TESTS}, {"pool-cleared-on-min-pool-size-population-error", SKIP_ALL_TESTS}, {"insert-shutdown-error", SKIP_ALL_TESTS}, {"standalone-logging", "Successful heartbeat"}, // requires driverConnectionId {"standalone-logging", "Failing heartbeat"}, // requires driverConnectionId {"replicaset-logging", SKIP_ALL_TESTS }, // requires driverConnectionId {"sharded-logging", SKIP_ALL_TESTS }, // requires driverConnectionId {"find-network-error", "Reset server and pool after network error on find"}, {"insert-network-error", "Reset server and pool after network error on insert"}, {"pool-clear-on-error-checkout", SKIP_ALL_TESTS}, {"find-shutdown-error", "Concurrent shutdown error on find"}, {"find-network-timeout-error", "Ignore network timeout error on find"}, {"hello-timeout", SKIP_ALL_TESTS}, {"hello-network-error", SKIP_ALL_TESTS}, {"hello-command-error", SKIP_ALL_TESTS}, {"interruptInUse", SKIP_ALL_TESTS}, {"pool-clear-min-pool-size-error", SKIP_ALL_TESTS}, {"pool-clear-checkout-error", SKIP_ALL_TESTS}, {"pool-clear-application-error", SKIP_ALL_TESTS}, {"pool-cleared-error", "PoolClearedError does not mark server unknown"}, // requires multithreaded runner // Requires streaming heartbeat support {"rediscover-quickly-after-step-down", SKIP_ALL_TESTS}, // CDRIVER-5870: Spec compliant response to authentication errors {"auth-error", "Reset server and pool after AuthenticationFailure error"}, {"auth-network-error", "Reset server and pool after network error during authentication"}, {"auth-misc-command-error", "Reset server and pool after misc command error"}, {"auth-shutdown-error", "Reset server and pool after shutdown error during authentication"}, {"auth-network-timeout-error", "Reset server and pool after network timeout error during authentication"}, // libmongoc unified tests do not support pooled connections or background server monitoring threads yet {"serverMonitoringMode", SKIP_ALL_TESTS}, // CDRIVER-4115: listCollections does not support batchSize. {"cursors are correctly pinned to connections for load-balanced clusters", "listCollections pins the cursor to a connection"}, // CDRIVER-4116: listIndexes does not support batchSize. {"cursors are correctly pinned to connections for load-balanced clusters", "listIndexes pins the cursor to a connection"}, // libmongoc does not pin connections to cursors. It cannot force an error from waitQueueTimeoutMS by creating cursors in load balanced mode. {"wait queue timeout errors include details about checked out connections", SKIP_ALL_TESTS}, // libmongoc does not support the optional findOne helper. {"retryable reads handshake failures", "collection.findOne succeeds after retryable handshake network error"}, {"retryable reads handshake failures", "collection.findOne succeeds after retryable handshake server error (ShutdownInProgress)"}, // libmongoc does not support the optional listIndexNames helper. {"retryable reads handshake failures", "collection.listIndexNames succeeds after retryable handshake network error"}, {"retryable reads handshake failures", "collection.listIndexNames succeeds after retryable handshake server error (ShutdownInProgress)"}, // libmongoc single-host non-replicaSet URI first transitions Unknown->Single, not Unknown->Unknown {"standalone-emit-topology-description-changed-before-close", "Topology lifecycle"}, // libmongoc does not include insertId in InsertOneResult {"cancel-server-check", SKIP_ALL_TESTS}, {0}, }; // clang-format on static bool is_test_file_skipped(test_file_t *test_file) { skipped_unified_test_t *skip; for (skip = SKIPPED_TESTS; skip->file_description != NULL; skip++) { if (!strcmp(skip->file_description, test_file->description) && skip->test_description == SKIP_ALL_TESTS) { return true; } } return false; } static bool is_test_skipped(test_t *test) { skipped_unified_test_t *skip; for (skip = SKIPPED_TESTS; skip->file_description != NULL; skip++) { if (!strcmp(skip->file_description, test->test_file->description) && !strcmp(skip->test_description, test->description)) { return true; } } return false; } struct _failpoint_t { char *client_id; char *name; uint32_t server_id; struct _failpoint_t *next; }; failpoint_t * failpoint_new(char *name, char *client_id, uint32_t server_id) { failpoint_t *fp = (failpoint_t *)bson_malloc0(sizeof(failpoint_t)); fp->name = bson_strdup(name); fp->client_id = bson_strdup(client_id); fp->server_id = server_id; return fp; } void failpoint_destroy(failpoint_t *fp) { if (!fp) { return; } bson_free(fp->name); bson_free(fp->client_id); bson_free(fp); } /* Set server_id to 0 if the failpoint was not against a pinned mongos. */ void register_failpoint(test_t *test, char *name, char *client_id, uint32_t server_id) { failpoint_t *fp = NULL; fp = failpoint_new(name, client_id, server_id); LL_APPEND(test->failpoints, fp); } static bool cleanup_failpoints(test_t *test, bson_error_t *error) { bool ret = false; failpoint_t *iter = NULL; mongoc_read_prefs_t *rp = NULL; rp = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); LL_FOREACH(test->failpoints, iter) { mongoc_client_t *client = NULL; bson_t *disable_cmd = NULL; client = entity_map_get_client(test->entity_map, iter->client_id, error); if (!client) { goto done; } disable_cmd = tmp_bson("{'configureFailPoint': '%s', 'mode': 'off' }", iter->name); if (iter->server_id != 0) { entity_map_log_filter_push(test->entity_map, iter->client_id, NULL, NULL); bool command_ok = mongoc_client_command_simple_with_server_id( client, "admin", disable_cmd, rp, iter->server_id, NULL /* reply */, error); entity_map_log_filter_pop(test->entity_map, iter->client_id, NULL, NULL); if (!command_ok) { goto done; } } else { entity_map_log_filter_push(test->entity_map, iter->client_id, NULL, NULL); bool command_ok = mongoc_client_command_simple(client, "admin", disable_cmd, rp, NULL /* reply */, error); entity_map_log_filter_pop(test->entity_map, iter->client_id, NULL, NULL); if (!command_ok) { goto done; } } } ret = true; done: mongoc_read_prefs_destroy(rp); return ret; } static bool test_has_operation(test_t *test, char *op_name) { bson_iter_t iter; BSON_FOREACH(test->operations, iter) { bson_t op_bson; bson_iter_bson(&iter, &op_bson); if (0 == strcmp(bson_lookup_utf8(&op_bson, "name"), op_name)) { return true; } } return false; } static const char * get_topology_type(mongoc_client_t *client); static bool is_topology_type_sharded(const char *topology_type) { return 0 == strcmp("sharded", topology_type) || 0 == strcmp("sharded-replicaset", topology_type); } static bool is_topology_type_compatible(const char *test_topology_type, const char *server_topology_type) { if (0 == strcmp(test_topology_type, server_topology_type)) { return true; } /* If a requirement specifies a "sharded" topology and server is of type * "sharded-replicaset", that is also compatible. */ return 0 == strcmp(test_topology_type, "sharded") && is_topology_type_sharded(server_topology_type); } /* This callback tracks the set of server IDs for all connected servers. * The set of server IDs is used when sending a command to each individual * server. */ static void on_topology_changed(const mongoc_apm_topology_changed_t *event) { test_runner_t *test_runner = NULL; const mongoc_topology_description_t *td; mongoc_server_description_t **sds; size_t sds_len; size_t i; test_runner = (test_runner_t *)mongoc_apm_topology_changed_get_context(event); _mongoc_array_clear(&test_runner->server_ids); td = mongoc_apm_topology_changed_get_new_description(event); sds = mongoc_topology_description_get_servers(td, &sds_len); for (i = 0; i < sds_len; i++) { uint32_t server_id = mongoc_server_description_id(sds[i]); MONGOC_DEBUG("topology changed, adding server id: %d", (int)server_id); _mongoc_array_append_val(&test_runner->server_ids, server_id); } mongoc_server_descriptions_destroy_all(sds, sds_len); } /* Returns an array of all known servers IDs that the test runner * is connected to. The server IDs can be used to target commands to * specific servers with mongoc_client_command_simple_with_server_id(). */ static void test_runner_get_all_server_ids(test_runner_t *test_runner, mongoc_array_t *out) { bson_error_t error; bool ret; /* Run a 'ping' command to make sure topology has been scanned. */ ret = mongoc_client_command_simple(test_runner->internal_client, "admin", tmp_bson("{'ping': 1}"), NULL /* read prefs */, NULL /* reply */, NULL /* error */); ASSERT_OR_PRINT(ret, error); _mongoc_array_copy(out, &test_runner->server_ids); } /* Run killAllSessions against the primary or each mongos to terminate any * lingering open transactions. * See also: Spec section "Terminating Open Transactions" */ static bool test_runner_terminate_open_transactions(test_runner_t *test_runner, bson_error_t *error) { bson_t *kill_all_sessions_cmd = NULL; bool ret = false; bool cmd_ret = false; bson_error_t cmd_error = {0}; if (test_framework_is_oidc()) { // Skip when testing OIDC to avoid authorization error trying to run killAllSessions. ret = true; goto done; } if (0 == test_framework_skip_if_no_txns()) { ret = true; goto done; } kill_all_sessions_cmd = tmp_bson("{'killAllSessions': []}"); /* Run on each mongos. Target each server individually. */ if (is_topology_type_sharded(test_runner->topology_type)) { mongoc_array_t server_ids; size_t i; _mongoc_array_init(&server_ids, sizeof(uint32_t)); test_runner_get_all_server_ids(test_runner, &server_ids); for (i = 0; i < server_ids.len; i++) { uint32_t server_id = _mongoc_array_index(&server_ids, uint32_t, i); cmd_ret = mongoc_client_command_simple_with_server_id(test_runner->internal_client, "admin", kill_all_sessions_cmd, NULL /* read prefs. */, server_id, NULL, &cmd_error); /* Ignore error code 11601 as a workaround for SERVER-38335. */ if (!cmd_ret && cmd_error.code != 11601) { test_set_error( error, "Unexpected error running killAllSessions on server (%d): %s", (int)server_id, cmd_error.message); _mongoc_array_destroy(&server_ids); goto done; } } _mongoc_array_destroy(&server_ids); } else { /* Run on primary. */ cmd_ret = mongoc_client_command_simple( test_runner->internal_client, "admin", kill_all_sessions_cmd, NULL /* read prefs. */, NULL, &cmd_error); /* Ignore error code 11601 as a workaround for SERVER-38335. */ if (!cmd_ret && cmd_error.code != 11601) { test_set_error(error, "Unexpected error running killAllSessions on primary: %s", cmd_error.message); goto done; } } ret = true; done: return ret; } static test_runner_t * test_runner_new(void) { bson_error_t error; test_runner_t *const test_runner = bson_malloc0(sizeof(test_runner_t)); _mongoc_array_init(&test_runner->server_ids, sizeof(uint32_t)); { mongoc_uri_t *const uri = test_framework_get_uri(); /* In load balanced mode, the internal client must use the * SINGLE_LB_MONGOS_URI. */ if (!test_framework_is_loadbalanced()) { /* Always use multiple mongoses if speaking to a mongos. * Some test operations require communicating with all known mongos */ if (!test_framework_uri_apply_multi_mongos(uri, true, &error)) { test_error("error applying multiple mongos: %s", error.message); } } test_runner->internal_client = test_framework_client_new_from_uri(uri, NULL); mongoc_uri_destroy(uri); } { mongoc_apm_callbacks_t *const callbacks = mongoc_apm_callbacks_new(); mongoc_apm_set_topology_changed_cb(callbacks, on_topology_changed); mongoc_client_set_apm_callbacks(test_runner->internal_client, callbacks, test_runner); mongoc_apm_callbacks_destroy(callbacks); } test_framework_set_ssl_opts(test_runner->internal_client); mongoc_client_set_error_api(test_runner->internal_client, MONGOC_ERROR_API_VERSION_2); test_runner->topology_type = get_topology_type(test_runner->internal_client); server_semver(test_runner->internal_client, &test_runner->server_version); /* Terminate any possible open transactions. */ if (!test_runner_terminate_open_transactions(test_runner, &error)) { test_error("error terminating transactions: %s", error.message); } // Do not check server parameters when testing OIDC to avoid authorization error running getParameter. if (!test_framework_is_oidc()) { bson_t reply; /* Cache server parameters to check runOnRequirements. */ if (!mongoc_client_command_simple( test_runner->internal_client, "admin", tmp_bson("{'getParameter': '*'}"), NULL, &reply, &error)) { test_error("error getting server parameters: %s, full reply: %s", error.message, tmp_json(&reply)); } test_runner->server_parameters = bson_copy(&reply); bson_destroy(&reply); } return test_runner; } static void test_runner_destroy(test_runner_t *test_runner) { mongoc_client_destroy(test_runner->internal_client); _mongoc_array_destroy(&test_runner->server_ids); bson_destroy(test_runner->server_parameters); bson_free(test_runner); } static test_file_t * test_file_new(test_runner_t *test_runner, bson_t *bson) { test_file_t *test_file = NULL; bson_parser_t *parser = NULL; char *schema_version = NULL; test_file = bson_malloc0(sizeof(test_file_t)); test_file->test_runner = test_runner; parser = bson_parser_new(); bson_parser_utf8(parser, "description", &test_file->description); bson_parser_utf8(parser, "schemaVersion", &schema_version); bson_parser_array_optional(parser, "runOnRequirements", &test_file->run_on_requirements); bson_parser_array_optional(parser, "createEntities", &test_file->create_entities); bson_parser_array_optional(parser, "initialData", &test_file->initial_data); bson_parser_doc_optional(parser, "_yamlAnchors", &test_file->yaml_anchors); bson_parser_array(parser, "tests", &test_file->tests); bson_parser_parse_or_assert(parser, bson); bson_parser_destroy(parser); semver_parse(schema_version, &test_file->schema_version); bson_free(schema_version); return test_file; } static void test_file_destroy(test_file_t *test_file) { bson_free(test_file->description); bson_destroy(test_file->tests); bson_destroy(test_file->initial_data); bson_destroy(test_file->create_entities); bson_destroy(test_file->run_on_requirements); bson_destroy(test_file->yaml_anchors); bson_free(test_file); } static test_t * test_new(test_file_t *test_file, bson_t *bson) { test_t *test = NULL; bson_parser_t *parser = NULL; test = bson_malloc0(sizeof(test_t)); test->test_file = test_file; parser = bson_parser_new(); bson_parser_utf8(parser, "description", &test->description); bson_parser_array_optional(parser, "runOnRequirements", &test->run_on_requirements); bson_parser_utf8_optional(parser, "skipReason", &test->skip_reason); bson_parser_array(parser, "operations", &test->operations); bson_parser_array_optional(parser, "expectEvents", &test->expect_events); bson_parser_array_optional(parser, "expectLogMessages", &test->expect_log_messages); bson_parser_array_optional(parser, "outcome", &test->outcome); bson_parser_parse_or_assert(parser, bson); bson_parser_destroy(parser); test->entity_map = entity_map_new(); return test; } static void test_destroy(test_t *test) { failpoint_t *fpiter, *fptmp; LL_FOREACH_SAFE(test->failpoints, fpiter, fptmp) { failpoint_destroy(fpiter); } entity_map_destroy(test->entity_map); bson_destroy(test->outcome); bson_destroy(test->expect_events); bson_destroy(test->expect_log_messages); bson_destroy(test->operations); bson_destroy(test->run_on_requirements); bson_free(test->description); bson_free(test->skip_reason); bson_destroy(test->cluster_time_after_initial_data); bson_free(test); } static bool is_replset(bson_t *hello_reply) { if (bson_has_field(hello_reply, "setName")) { return true; } if (bson_has_field(hello_reply, "isreplicaset") && bson_lookup_bool(hello_reply, "isreplicaset") == true) { return true; } return false; } static bool is_sharded(bson_t *hello_reply) { const char *val; if (!bson_has_field(hello_reply, "msg")) { return false; } val = bson_lookup_utf8(hello_reply, "msg"); if (0 == strcmp(val, "isdbgrid")) { return true; } return false; } static const char * get_topology_type(mongoc_client_t *client) { bool ret; bson_t reply; bson_error_t error; const char *topology_type = "single"; ASSERT(client); if (test_framework_is_loadbalanced()) { return "load-balanced"; } ret = mongoc_client_command_simple(client, "admin", tmp_bson("{'hello': 1}"), NULL, &reply, &error); if (!ret) { bson_destroy(&reply); ret = mongoc_client_command_simple( client, "admin", tmp_bson("{'" HANDSHAKE_CMD_LEGACY_HELLO "': 1}"), NULL, &reply, &error); } ASSERT_OR_PRINT(ret, error); if (is_replset(&reply)) { topology_type = "replicaset"; } else if (is_sharded(&reply)) { bool is_sharded_replset; mongoc_collection_t *config_shards = NULL; mongoc_cursor_t *cursor = NULL; const bson_t *shard_doc; /* Check if this is a sharded-replicaset by querying the config.shards * collection. */ is_sharded_replset = true; config_shards = mongoc_client_get_collection(client, "config", "shards"); cursor = mongoc_collection_find_with_opts(config_shards, tmp_bson("{}"), NULL /* opts */, NULL /* read prefs */); if (mongoc_cursor_error(cursor, &error)) { test_error("Attempting to query config.shards collection failed: %s", error.message); } while (mongoc_cursor_next(cursor, &shard_doc)) { const char *host = bson_lookup_utf8(shard_doc, "host"); if (NULL == strstr(host, "/")) { is_sharded_replset = false; break; } } mongoc_cursor_destroy(cursor); mongoc_collection_destroy(config_shards); if (is_sharded_replset) { topology_type = "sharded-replicaset"; } else { topology_type = "sharded"; } } bson_destroy(&reply); return topology_type; } static void check_schema_version(test_file_t *test_file) { // `schema_version` is the latest schema version the test runner will try to run. // 1.8 is fully supported. Later minor versions are partially supported. // 1.12 is partially supported (expectedError.errorResponse assertions) // 1.18 is partially supported (additional properties in kmsProviders) // 1.21 is partially supported (expectedError.writeErrors and expectedError.writeConcernErrors) // 1.22 is partially supported (keyExpirationMS in client encryption options) // 1.23 is partially supported (automatic encryption) // 1.25 is partially supported (minLibmongocryptVersion) semver_t schema_version; semver_parse("1.25", &schema_version); if (schema_version.major != test_file->schema_version.major) { goto fail; } if (!schema_version.has_minor) { /* All minor versions for this major version are supported. */ return; } if (schema_version.minor >= test_file->schema_version.minor) { return; } fail: test_error("Unsupported schema version: %s", semver_to_string(&test_file->schema_version)); } static bool check_run_on_requirement(test_runner_t *test_runner, bson_t *run_on_requirement, const char *server_topology_type, semver_t *server_version, char **fail_reason) { bson_iter_t req_iter; BSON_FOREACH(run_on_requirement, req_iter) { const char *key = bson_iter_key(&req_iter); if (0 == strcmp(key, "minServerVersion")) { semver_t min_server_version; semver_parse(bson_iter_utf8(&req_iter, NULL), &min_server_version); if (semver_cmp(server_version, &min_server_version) < 0) { *fail_reason = bson_strdup_printf("Server version(%s) is lower than minServerVersion(%s)", semver_to_string(server_version), semver_to_string(&min_server_version)); return false; } continue; } if (0 == strcmp(key, "maxServerVersion")) { semver_t max_server_version; semver_parse(bson_iter_utf8(&req_iter, NULL), &max_server_version); if (semver_cmp(server_version, &max_server_version) > 0) { *fail_reason = bson_strdup_printf("Server version(%s) is higher than maxServerVersion (%s)", semver_to_string(server_version), semver_to_string(&max_server_version)); return false; } continue; } if (0 == strcmp(key, "topologies")) { bool found = false; bson_t topologies; bson_iter_t topology_iter; bson_iter_bson(&req_iter, &topologies); BSON_FOREACH(&topologies, topology_iter) { const char *test_topology_type = bson_iter_utf8(&topology_iter, NULL); if (is_topology_type_compatible(test_topology_type, server_topology_type)) { found = true; continue; } } if (!found) { *fail_reason = bson_strdup_printf( "Topology (%s) was not found among listed topologies: %s", server_topology_type, tmp_json(&topologies)); return false; } continue; } if (0 == strcmp(key, "serverParameters")) { bson_t expected_params; bson_val_t *actual_val = NULL; bson_val_t *expected_val = NULL; bool matched; bson_error_t error = {0}; bson_iter_bson(&req_iter, &expected_params); expected_val = bson_val_from_bson(&expected_params); actual_val = bson_val_from_bson(test_runner->server_parameters); matched = bson_match(expected_val, actual_val, false, &error); bson_val_destroy(actual_val); bson_val_destroy(expected_val); if (!matched) { *fail_reason = bson_strdup_printf("serverParameters mismatch: %s", error.message); return false; } continue; } if (0 == strcmp(key, "serverless")) { // Ignore deprecated serverless runOnRequirement. Serverless is not tested. continue; } if (0 == strcmp(key, "auth")) { bool auth_requirement = bson_iter_bool(&req_iter); if (auth_requirement == test_framework_has_auth()) { continue; } *fail_reason = bson_strdup_printf("Server does not match auth requirement, test %s authentication.", auth_requirement ? "requires" : "forbids"); return false; } if (0 == strcmp(key, "authMechanism")) { if (!BSON_ITER_HOLDS_UTF8(&req_iter)) { test_error("Unexpected type for authMechanism, should be string"); } const char *mechanism = bson_iter_utf8(&req_iter, NULL); if (strcasecmp(mechanism, "MONGODB-OIDC") != 0) { test_error("Unexpected authMechanism value: %s", mechanism); } if (test_framework_is_oidc()) { continue; } *fail_reason = bson_strdup("Test requires environment to support MONGODB-OIDC"); return false; } #if defined(MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION) if (0 == strcmp(key, "csfle")) { bool csfle_required = false; if (BSON_ITER_HOLDS_DOCUMENT(&req_iter)) { csfle_required = true; bson_iter_t csfle_iter; ASSERT(bson_iter_recurse(&req_iter, &csfle_iter)); while (bson_iter_next(&csfle_iter)) { if (0 == strcmp(bson_iter_key(&csfle_iter), "minLibmongocryptVersion")) { semver_t min_libmongocrypt_version; semver_t loaded_libmongocrypt_version; semver_parse(bson_iter_utf8(&csfle_iter, NULL), &min_libmongocrypt_version); semver_parse(_mongoc_crypt_get_libmongocrypt_version(), &loaded_libmongocrypt_version); if (semver_cmp(&loaded_libmongocrypt_version, &min_libmongocrypt_version) < 0) { *fail_reason = bson_strdup_printf("libmongocrypt version %s is lower than " "minLibmongocryptVersion %s required by CSFLE", semver_to_string(&loaded_libmongocrypt_version), semver_to_string(&min_libmongocrypt_version)); return false; } } else { test_error("Unexpected field: csfle.%s", bson_iter_key(&csfle_iter)); } } } else if (BSON_ITER_HOLDS_BOOL(&req_iter)) { csfle_required = bson_iter_bool(&req_iter); } else { test_error("Unexpected type %s for 'csfle'", _mongoc_bson_type_to_str(bson_iter_type(&req_iter))); } semver_t min_server_version; semver_parse("4.2.0", &min_server_version); if (semver_cmp(server_version, &min_server_version) < 0) { *fail_reason = bson_strdup_printf("Server version %s is lower than " "minServerVersion %s required by CSFLE", semver_to_string(server_version), semver_to_string(&min_server_version)); return false; } if (0 == test_framework_skip_if_no_client_side_encryption()) { *fail_reason = bson_strdup("CSFLE is required but not all environment variables are set"); return false; } if (csfle_required) { continue; } *fail_reason = bson_strdup_printf("CSFLE is not allowed but libmongoc was built " "with MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION=ON"); return false; #else if (0 == strcmp(key, "csfle")) { bool csfle_required = false; if (BSON_ITER_HOLDS_DOCUMENT(&req_iter)) { csfle_required = true; } else if (BSON_ITER_HOLDS_BOOL(&req_iter)) { csfle_required = bson_iter_bool(&req_iter); } else { test_error("Unexpected type %s for 'csfle'", _mongoc_bson_type_to_str(bson_iter_type(&req_iter))); } if (!csfle_required) { continue; } *fail_reason = bson_strdup_printf("CSFLE is required but libmongoc was built " "without MONGOC_ENABLE_CLIENT_SIDE_ENCRYPTION=ON"); return false; #endif /* !defined(MONGOC_CLIENT_SIDE_ENCRYPTION) */ } test_error("Unexpected runOnRequirement field: %s", key); } return true; } static bool check_run_on_requirements(test_runner_t *test_runner, bson_t *run_on_requirements, const char **reason) { bool requirements_satisfied = false; bson_iter_t iter; mcommon_string_append_t fail_reasons; mcommon_string_new_as_append(&fail_reasons); BSON_FOREACH(run_on_requirements, iter) { bson_t run_on_requirement; char *fail_reason = NULL; bson_iter_bson(&iter, &run_on_requirement); fail_reason = NULL; if (check_run_on_requirement(test_runner, &run_on_requirement, test_runner->topology_type, &test_runner->server_version, &fail_reason)) { requirements_satisfied = true; break; } mcommon_string_append_printf( &fail_reasons, "- Requirement %s failed because: %s\n", bson_iter_key(&iter), fail_reason); bson_free(fail_reason); } *reason = NULL; if (!requirements_satisfied) { *reason = tmp_str("runOnRequirements not satisfied:\n%s", mcommon_str_from_append(&fail_reasons)); } mcommon_string_from_append_destroy(&fail_reasons); return requirements_satisfied; } static bool test_setup_initial_data(test_t *test, bson_error_t *error) { test_runner_t *test_runner = NULL; test_file_t *test_file = NULL; bson_iter_t initial_data_iter; test_file = test->test_file; test_runner = test_file->test_runner; mongoc_client_session_t *sess = mongoc_client_start_session(test_runner->internal_client, NULL, error); if (sess == NULL) { return false; } if (!test_file->initial_data) { // Send a "ping" command with the session to get a cluster time. bson_t opts = BSON_INITIALIZER; bool ok = mongoc_client_session_append(sess, &opts, error); ok = ok && mongoc_client_command_with_opts( test_runner->internal_client, "db", tmp_bson("{'ping': 1}"), NULL, &opts, NULL, error); if (ok) { // Check for cluster time (not available on standalone). const bson_t *ct = mongoc_client_session_get_cluster_time(sess); if (ct) { test->cluster_time_after_initial_data = bson_copy(ct); } } mongoc_client_session_destroy(sess); bson_destroy(&opts); return ok; } BSON_FOREACH(test_file->initial_data, initial_data_iter) { bson_parser_t *parser = NULL; bson_t collection_data; char *collection_name = NULL; char *database_name = NULL; bson_t *documents = NULL; mongoc_database_t *db = NULL; mongoc_collection_t *coll = NULL; mongoc_bulk_operation_t *bulk_insert = NULL; mongoc_write_concern_t *wc = NULL; bson_t *bulk_opts = NULL; bson_t *drop_opts = bson_new(); bson_t *create_opts = NULL; bool ret = false; bson_iter_bson(&initial_data_iter, &collection_data); parser = bson_parser_new(); bson_parser_utf8(parser, "databaseName", &database_name); bson_parser_utf8(parser, "collectionName", &collection_name); bson_parser_array(parser, "documents", &documents); bson_parser_doc_optional(parser, "createOptions", &create_opts); if (!bson_parser_parse(parser, &collection_data, error)) { goto loopexit; } if (create_opts == NULL) { create_opts = bson_new(); } wc = mongoc_write_concern_new(); mongoc_write_concern_set_w(wc, MONGOC_WRITE_CONCERN_W_MAJORITY); bulk_opts = bson_new(); mongoc_write_concern_append(wc, bulk_opts); if (!mongoc_client_session_append(sess, bulk_opts, error)) { goto loopexit; } /* Drop the collection. */ /* Check if the server supports majority write concern on 'drop' and * 'create'. */ if (semver_cmp_str(&test_runner->server_version, "3.4") >= 0) { mongoc_write_concern_append(wc, drop_opts); mongoc_write_concern_append(wc, create_opts); } if (is_topology_type_sharded(test_runner->topology_type)) { // From spec: "test runner SHOULD use a single mongos for handling initialData" BSON_APPEND_INT32(drop_opts, "serverId", 1); BSON_APPEND_INT32(create_opts, "serverId", 1); } if (!mongoc_client_session_append(sess, create_opts, error)) { goto loopexit; } if (!mongoc_client_session_append(sess, drop_opts, error)) { goto loopexit; } coll = mongoc_client_get_collection(test_runner->internal_client, database_name, collection_name); if (!mongoc_collection_drop_with_opts(coll, drop_opts, error)) { if (error->code != 26 && (NULL == strstr(error->message, "ns not found"))) { /* This is not a "ns not found" error. Fail the test. */ goto loopexit; } /* Clear an "ns not found" error. */ memset(error, 0, sizeof(bson_error_t)); } // Drop `enxcol_..esc` and `enxcol_..ecoc` in case the collection will be used for QE. // https://github.com/mongodb/specifications/blob/f4c0bbdbf8a8560580c947ca2c331794431a0c78/source/unified-test-format/unified-test-format.md#executing-a-test { char *collection_name_esc = bson_strdup_printf("enxcol_.%s.esc", collection_name); mongoc_collection_t *coll_esc = mongoc_client_get_collection(test_runner->internal_client, database_name, collection_name_esc); if (!mongoc_collection_drop_with_opts(coll_esc, drop_opts, error)) { if (error->code != 26 && (NULL == strstr(error->message, "ns not found"))) { /* This is not a "ns not found" error. Fail the test. */ mongoc_collection_destroy(coll_esc); bson_free(collection_name_esc); goto loopexit; } /* Clear an "ns not found" error. */ memset(error, 0, sizeof(bson_error_t)); } mongoc_collection_destroy(coll_esc); bson_free(collection_name_esc); } { char *collection_name_ecoc = bson_strdup_printf("enxcol_.%s.ecoc", collection_name); mongoc_collection_t *coll_ecoc = mongoc_client_get_collection(test_runner->internal_client, database_name, collection_name_ecoc); if (!mongoc_collection_drop_with_opts(coll_ecoc, drop_opts, error)) { if (error->code != 26 && (NULL == strstr(error->message, "ns not found"))) { /* This is not a "ns not found" error. Fail the test. */ mongoc_collection_destroy(coll_ecoc); bson_free(collection_name_ecoc); goto loopexit; } /* Clear an "ns not found" error. */ memset(error, 0, sizeof(bson_error_t)); } mongoc_collection_destroy(coll_ecoc); bson_free(collection_name_ecoc); } mongoc_collection_t *new_coll = NULL; db = mongoc_client_get_database(test_runner->internal_client, database_name); new_coll = mongoc_database_create_collection(db, collection_name, create_opts, error); if (!new_coll) { goto loopexit; } mongoc_collection_destroy(new_coll); /* Insert documents if specified. */ if (bson_count_keys(documents) > 0) { bson_iter_t documents_iter; bulk_insert = mongoc_collection_create_bulk_operation_with_opts(coll, bulk_opts); if (is_topology_type_sharded(test_runner->topology_type)) { // From spec: "test runner SHOULD use a single mongos for handling initialData" mongoc_bulk_operation_set_server_id(bulk_insert, 1u); } BSON_FOREACH(documents, documents_iter) { bson_t document; bson_iter_bson(&documents_iter, &document); mongoc_bulk_operation_insert(bulk_insert, &document); } if (!mongoc_bulk_operation_execute(bulk_insert, NULL, error)) { goto loopexit; } } ret = true; loopexit: mongoc_bulk_operation_destroy(bulk_insert); bson_destroy(bulk_opts); bson_destroy(drop_opts); bson_destroy(create_opts); bson_destroy(documents); mongoc_write_concern_destroy(wc); mongoc_collection_destroy(coll); bson_free(database_name); bson_free(collection_name); bson_parser_destroy(parser); mongoc_database_destroy(db); if (!ret) { mongoc_client_session_destroy(sess); return false; } } // Obtain cluster time to advance client sessions. See DRIVERS-2816. // Check for cluster time (not available on standalone). const bson_t *ct = mongoc_client_session_get_cluster_time(sess); if (ct) { test->cluster_time_after_initial_data = bson_copy(ct); } mongoc_client_session_destroy(sess); return true; } static bool test_create_entities(test_t *test, bson_error_t *error) { test_file_t *test_file = NULL; bson_iter_t iter; test_file = test->test_file; if (!test_file->create_entities) { return true; } /* If a test runs a 'configureFailPoint' operation, reduce heartbeat on new * clients. */ if (test_has_operation(test, "configureFailPoint")) { entity_map_set_reduced_heartbeat(test->entity_map, true); } BSON_FOREACH(test_file->create_entities, iter) { bson_t entity_bson; bson_iter_bson(&iter, &entity_bson); if (!entity_map_create(test->entity_map, &entity_bson, test->cluster_time_after_initial_data, error)) { return false; } } return true; } static bool test_run_operations(test_t *test, bson_error_t *error) { bool ret = false; bson_iter_t iter; BSON_FOREACH(test->operations, iter) { bson_t op_bson; bson_iter_bson(&iter, &op_bson); if (!operation_run(test, &op_bson, error)) { test_diagnostics_error_info("running operation: %s", tmp_json(&op_bson)); goto done; } } ret = true; done: return ret; } static bool test_check_event(test_t *test, bson_t *expected, event_t *actual, bson_error_t *error) { /* Note: With events serialized into the same format as the 'expected' documents, * this test is effectively the same as a single top-level entity_map_match but with * somewhat more verbose error messages. If this becomes too much of a maintenance * burden, consider replacing it with a single match. */ bool ret = false; bson_iter_t iter; bson_t expected_bson; bson_parser_t *bp = NULL; const char *expected_event_type; bson_t *expected_command = NULL; char *expected_command_name = NULL; char *expected_database_name = NULL; bson_t *expected_reply = NULL; bool *expected_awaited = NULL; bool *expected_has_service_id = NULL; bool *expected_has_server_connection_id = NULL; bson_t *expected_previous_description = NULL; bson_t *expected_new_description = NULL; BSON_ASSERT_PARAM(test); BSON_ASSERT_PARAM(expected); BSON_ASSERT_PARAM(actual); BSON_ASSERT_PARAM(error); if (bson_count_keys(expected) != 1) { test_set_error(error, "expected 1 key in expected event, but got: %s", tmp_json(expected)); goto done; } bson_iter_init(&iter, expected); bson_iter_next(&iter); expected_event_type = bson_iter_key(&iter); if (0 != bson_strcasecmp(expected_event_type, actual->type)) { test_set_error(error, "expected event type: %s, but got: %s", expected_event_type, actual->type); goto done; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "unexpected non-document event assertion: %s", tmp_json(expected)); goto done; } bson_iter_bson(&iter, &expected_bson); bp = bson_parser_new(); bson_parser_doc_optional(bp, "command", &expected_command); bson_parser_utf8_optional(bp, "commandName", &expected_command_name); bson_parser_utf8_optional(bp, "databaseName", &expected_database_name); bson_parser_doc_optional(bp, "reply", &expected_reply); bson_parser_bool_optional(bp, "awaited", &expected_awaited); bson_parser_bool_optional(bp, "hasServiceId", &expected_has_service_id); bson_parser_bool_optional(bp, "hasServerConnectionId", &expected_has_server_connection_id); bson_parser_doc_optional(bp, "previousDescription", &expected_previous_description); bson_parser_doc_optional(bp, "newDescription", &expected_new_description); if (!bson_parser_parse(bp, &expected_bson, error)) { goto done; } if (expected_command) { if (!bson_iter_init_find(&iter, actual->serialized, "command")) { test_set_error(error, "event.command expected but missing"); goto done; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "Unexpected type for event.command, should be document"); goto done; } bson_val_t *expected_val = bson_val_from_bson(expected_command); bson_val_t *actual_val = bson_val_from_iter(&iter); bool is_match = entity_map_match(test->entity_map, expected_val, actual_val, false, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); if (!is_match) { goto done; } } if (expected_command_name) { if (!bson_iter_init_find(&iter, actual->serialized, "commandName")) { test_set_error(error, "event.commandName expected but missing"); goto done; } if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "Unexpected type for event.commandName, should be string"); goto done; } const char *actual_command_name = bson_iter_utf8(&iter, NULL); if (0 != strcmp(expected_command_name, actual_command_name)) { test_set_error(error, "expected commandName: %s, but got: %s", expected_command_name, actual_command_name); goto done; } } if (expected_database_name) { if (!bson_iter_init_find(&iter, actual->serialized, "databaseName")) { test_set_error(error, "event.databaseName expected but missing"); goto done; } if (!BSON_ITER_HOLDS_UTF8(&iter)) { test_set_error(error, "Unexpected type for event.databaseName, should be string"); goto done; } const char *actual_database_name = bson_iter_utf8(&iter, NULL); if (0 != strcmp(expected_database_name, actual_database_name)) { test_set_error(error, "expected databaseName: %s, but got: %s", expected_database_name, actual_database_name); goto done; } } if (expected_reply) { if (!bson_iter_init_find(&iter, actual->serialized, "reply")) { test_set_error(error, "event.reply expected but missing"); goto done; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "Unexpected type for event.reply, should be document"); goto done; } bson_val_t *expected_val = bson_val_from_bson(expected_reply); bson_val_t *actual_val = bson_val_from_iter(&iter); bool is_match = entity_map_match(test->entity_map, expected_val, actual_val, false, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); if (!is_match) { goto done; } } if (expected_awaited) { if (!bson_iter_init_find(&iter, actual->serialized, "awaited")) { test_set_error(error, "event.awaited field expected but missing"); goto done; } if (!BSON_ITER_HOLDS_BOOL(&iter)) { test_set_error(error, "Unexpected type for event.awaited, should be boolean"); goto done; } bool actual_awaited = bson_iter_bool(&iter); if (*expected_awaited != actual_awaited) { test_error("expected event.awaited=%s, found event.awaited=%s", *expected_awaited ? "true" : "false", actual_awaited ? "true" : "false"); } } if (expected_has_service_id) { if (!bson_iter_init_find(&iter, actual->serialized, "serviceId")) { test_set_error(error, "event.serviceId field expected but missing"); goto done; } if (!BSON_ITER_HOLDS_OID(&iter)) { test_set_error(error, "Unexpected type for event.serviceId, should be ObjectId"); goto done; } const bson_oid_t *actual_oid = bson_iter_oid(&iter); bool actual_has_service_id = !mcommon_oid_is_zero(actual_oid); char actual_oid_str[25]; bson_oid_to_string(actual_oid, actual_oid_str); if (*expected_has_service_id && !actual_has_service_id) { test_error("expected nonzero serviceId, but found zero"); } if (!*expected_has_service_id && actual_has_service_id) { test_error("expected zeroed serviceId, but found nonzero value: %s", actual_oid_str); } } if (expected_has_server_connection_id) { if (!bson_iter_init_find(&iter, actual->serialized, "serverConnectionId")) { test_set_error(error, "event.serverConnectionId expected but missing"); goto done; } if (!BSON_ITER_HOLDS_INT64(&iter)) { test_set_error(error, "Unexpected type for event.serverConnectionId, should be int64"); goto done; } int64_t actual_server_connection_id = bson_iter_int64(&iter); const bool has_server_connection_id = actual_server_connection_id != MONGOC_NO_SERVER_CONNECTION_ID; if (*expected_has_server_connection_id && !has_server_connection_id) { test_error("expected server connectionId, but got MONGOC_NO_SERVER_CONNECTION_ID"); } if (!*expected_has_server_connection_id && has_server_connection_id) { test_error("expected MONGOC_NO_SERVER_CONNECTION_ID, but got %" PRId64, actual_server_connection_id); } } if (expected_previous_description) { if (!bson_iter_init_find(&iter, actual->serialized, "previousDescription")) { test_set_error(error, "event.previousDescription expected but missing"); goto done; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "Unexpected type for event.previousDescription, should be document"); goto done; } bson_val_t *expected_val = bson_val_from_bson(expected_previous_description); bson_val_t *actual_val = bson_val_from_iter(&iter); bool is_match = entity_map_match(test->entity_map, expected_val, actual_val, false, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); if (!is_match) { goto done; } } if (expected_new_description) { if (!bson_iter_init_find(&iter, actual->serialized, "newDescription")) { test_set_error(error, "event.newDescription expected but missing"); goto done; } if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "Unexpected type for event.newDescription, should be document"); goto done; } bson_val_t *expected_val = bson_val_from_bson(expected_new_description); bson_val_t *actual_val = bson_val_from_iter(&iter); bool is_match = entity_map_match(test->entity_map, expected_val, actual_val, false, error); bson_val_destroy(expected_val); bson_val_destroy(actual_val); if (!is_match) { goto done; } } ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool event_matches_eventtype(const event_t *event, const char *eventType) { BSON_ASSERT_PARAM(event); BSON_OPTIONAL_PARAM(eventType); return 0 == bson_strcasecmp(event->eventType, eventType ? eventType : "command"); } bool test_count_matching_events_for_client( test_t *test, entity_t *client, bson_t *expected_event, bson_error_t *error, int64_t *count_out) { int64_t count = 0; event_t *eiter; LL_FOREACH(client->events, eiter) { if (test_check_event(test, expected_event, eiter, error)) { count++; } } *count_out = count; return true; } // `is_keyvault_listcollections` returns true if a `listCollections` event produced by libmongoc should be ignored. // The extra events are caused by operations on the key vault collection. Unlike other drivers, libmongoc does not // create a separate client for key vault operations. static bool is_keyvault_listcollections(const bson_t *event) { if (!bson_has_field(event, "commandName") || !bson_has_field(event, "databaseName")) { return false; } const char *cmdname = bson_lookup_utf8(event, "commandName"); const char *dbname = bson_lookup_utf8(event, "databaseName"); if (cmdname && 0 == strcmp(cmdname, "listCollections") && dbname && 0 == strcmp(dbname, "keyvault")) { return true; } return false; } static bool test_check_expected_events_for_client(test_t *test, bson_t *expected_events_for_client, bson_error_t *error) { bool ret = false; entity_t *entity = NULL; char *client_id; bson_t *expected_events; bool *ignore_extra_events; char *event_type; bson_parser_t *bp = bson_parser_new(); bson_parser_utf8(bp, "client", &client_id); bson_parser_array(bp, "events", &expected_events); bson_parser_bool_optional(bp, "ignoreExtraEvents", &ignore_extra_events); bson_parser_utf8_optional(bp, "eventType", &event_type); if (!bson_parser_parse(bp, expected_events_for_client, error)) { goto done; } entity = entity_map_get(test->entity_map, client_id, error); if (!entity) { test_set_error(error, "missing entity '%s', expected client", client_id); goto done; } if (0 != strcmp(entity->type, "client")) { test_set_error(error, "expected entity '%s' to be client, got: %s", entity->id, entity->type); goto done; } if (event_type && 0 == strcmp(event_type, "cmap")) { /* Full CMAP support (CDRIVER-3525) is not currently planned for this driver. * Many tests that would otherwise need to be skipped can be partially executed * by letting checks for CMAP events artificially pass. */ MONGOC_DEBUG("SKIPPING expectEvents check for unsupported \"cmap\" events\n"); ret = true; goto done; } uint32_t expected_num_events = bson_count_keys(expected_events); uint32_t actual_num_events = 0; event_t *eiter; LL_FOREACH(entity->events, eiter) { if (is_keyvault_listcollections(eiter->serialized)) { // Ignore. continue; } if (event_matches_eventtype(eiter, event_type)) { actual_num_events++; } } if (expected_num_events != actual_num_events) { bool too_many_events = actual_num_events > expected_num_events; if (ignore_extra_events && *ignore_extra_events) { // We can never have too many events too_many_events = false; } bool too_few_events = actual_num_events < expected_num_events; if (too_few_events || too_many_events) { test_set_error(error, "expected: %" PRIu32 " events but got %" PRIu32, expected_num_events, actual_num_events); goto done; } } eiter = entity->events; bson_iter_t iter; BSON_FOREACH(expected_events, iter) { while (eiter && (is_keyvault_listcollections(eiter->serialized) || !event_matches_eventtype(eiter, event_type))) { // Skip. eiter = eiter->next; continue; } bson_t expected_event; bson_iter_bson(&iter, &expected_event); if (!eiter) { test_set_error(error, "could not find event: %s", tmp_json(&expected_event)); goto done; } if (!test_check_event(test, &expected_event, eiter, error)) { test_diagnostics_error_info("could not match event\n" "\texpected: %s\n" "\tactual: %s", tmp_json(&expected_event), tmp_json(eiter->serialized)); goto done; } eiter = eiter->next; } ret = true; done: if (!ret) { if (entity && entity->events) { char *event_list_string = event_list_to_string(entity->events); test_diagnostics_error_info("all captured events:\n%s", event_list_string); bson_free(event_list_string); } } bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool test_check_expected_events(test_t *test, bson_error_t *error) { bool ret = false; bson_iter_t iter; if (!test->expect_events) { ret = true; goto done; } BSON_FOREACH(test->expect_events, iter) { bson_t expected_events_for_client; bson_iter_bson(&iter, &expected_events_for_client); if (!test_check_expected_events_for_client(test, &expected_events_for_client, error)) { test_diagnostics_error_info("checking expected events: %s", tmp_json(&expected_events_for_client)); goto done; } } ret = true; done: return ret; } static bool check_failure_is_redacted(const bson_iter_t *failure_iter, bson_error_t *error) { if (BSON_ITER_HOLDS_UTF8(failure_iter)) { test_diagnostics_error_info("%s", "expected redacted 'failure', found string message (not allowed)"); return false; } if (!BSON_ITER_HOLDS_DOCUMENT(failure_iter)) { test_diagnostics_error_info("%s", "expected redacted 'failure' document, found unexpected type"); return false; } bson_t failure; bson_iter_bson(failure_iter, &failure); bson_parser_t *bp = bson_parser_new(); int64_t *failure_code; char *failure_code_name; bson_t *failure_error_labels; bson_parser_int_optional(bp, "code", &failure_code); bson_parser_utf8_optional(bp, "codeName", &failure_code_name); bson_parser_array_optional(bp, "errorLabels", &failure_error_labels); bool parse_result = bson_parser_parse(bp, &failure, error); bson_parser_destroy_with_parsed_fields(bp); bson_destroy(&failure); return parse_result; } static bool check_failure_is_detailed(const bson_iter_t *failure_iter) { if (BSON_ITER_HOLDS_UTF8(failure_iter)) { // Strings are fine, that's enough proof that the failure was not redacted return true; } if (!BSON_ITER_HOLDS_DOCUMENT(failure_iter)) { test_diagnostics_error_info("%s", "expected non-redacted 'failure' document, found unexpected type"); return false; } // Look for keys that indicate an un-redacted message bson_iter_t child; BSON_ASSERT(bson_iter_recurse(failure_iter, &child)); while (bson_iter_next(&child)) { const char *key = bson_iter_key(&child); if (!strcmp(key, "message") || !strcmp(key, "details")) { return true; } } return false; } static bool test_check_log_message(bson_t *expected, log_message_t *actual, bson_error_t *error) { bool ret = false; bson_parser_t *bp = bson_parser_new(); char *expected_level_str; char *expected_component_str; bool *failure_is_redacted; bson_t *expected_message_doc; bson_parser_utf8(bp, "level", &expected_level_str); bson_parser_utf8(bp, "component", &expected_component_str); bson_parser_bool_optional(bp, "failureIsRedacted", &failure_is_redacted); bson_parser_doc(bp, "data", &expected_message_doc); if (!bson_parser_parse(bp, expected, error)) { goto done; } mongoc_structured_log_level_t expected_level; if (!mongoc_structured_log_get_named_level(expected_level_str, &expected_level)) { test_set_error(error, "expected log level '%s' is not recognized", expected_level_str); goto done; } mongoc_structured_log_component_t expected_component; if (!mongoc_structured_log_get_named_component(expected_component_str, &expected_component)) { test_set_error(error, "expected log component '%s' is not recognized", expected_component_str); goto done; } if (expected_level != actual->level) { test_set_error(error, "expected log level: %s, but got: %s", mongoc_structured_log_get_level_name(expected_level), mongoc_structured_log_get_level_name(actual->level)); goto done; } if (expected_component != actual->component) { test_set_error(error, "expected log component: %s, but got: %s", mongoc_structured_log_get_component_name(expected_component), mongoc_structured_log_get_component_name(actual->component)); goto done; } if (failure_is_redacted) { bson_iter_t failure_iter; if (!bson_iter_init_find(&failure_iter, actual->message, "failure")) { test_set_error(error, "expected log 'failure' to exist"); goto done; } if (*failure_is_redacted) { if (!check_failure_is_redacted(&failure_iter, error)) { test_diagnostics_error_info("actual log message: %s", tmp_json(actual->message)); test_set_error(error, "expected log 'failure' to be redacted"); goto done; } } else { if (!check_failure_is_detailed(&failure_iter)) { test_diagnostics_error_info("actual log message: %s", tmp_json(actual->message)); test_set_error(error, "expected a complete un-redacted 'failure'"); goto done; } } } bson_val_t *expected_val = bson_val_from_bson(expected_message_doc); bson_val_t *actual_val = bson_val_from_bson(actual->message); bool is_match = bson_match(expected_val, actual_val, false, error); bson_val_destroy(actual_val); bson_val_destroy(expected_val); if (!is_match) { test_set_error( error, "expected log message: %s, but got: %s", tmp_json(expected_message_doc), tmp_json(actual->message)); goto done; } ret = true; done: bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool test_log_message_should_be_ignored(log_message_t *message, bson_t *optional_ignore_list, bson_error_t *error) { if (optional_ignore_list) { bson_iter_t iter; BSON_FOREACH(optional_ignore_list, iter) { bson_t expected; bson_iter_bson(&iter, &expected); bool is_match = test_check_log_message(&expected, message, error); bson_destroy(&expected); if (is_match) { return true; } } } return false; } static bool test_check_expected_log_messages_for_client(test_t *test, bson_t *expected_log_messages_for_client, bson_error_t *error) { bool ret = false; bson_mutex_t *locked = NULL; bson_parser_t *bp = bson_parser_new(); char *client_id; bson_t *expected_messages; bson_t *ignore_messages; bool *ignore_extra_messages; bson_parser_utf8(bp, "client", &client_id); bson_parser_array(bp, "messages", &expected_messages); bson_parser_array_optional(bp, "ignoreMessages", &ignore_messages); bson_parser_bool_optional(bp, "ignoreExtraMessages", &ignore_extra_messages); if (!bson_parser_parse(bp, expected_log_messages_for_client, error)) { goto done; } /* Note: entity->value might be NULL and that's fine. * The unified testing spec recommends that tests don't refer to closed clients, * but some tests do for checking lifecycle logging. * See /server_discovery_and_monitoring/unified/logging-standalone */ entity_t *entity = entity_map_get(test->entity_map, client_id, error); if (!entity) { test_set_error(error, "missing entity '%s', expected client", client_id); goto done; } if (0 != strcmp(entity->type, "client")) { test_set_error(error, "expected entity '%s' to be client, got: %s", entity->id, entity->type); goto done; } locked = &entity->log_mutex; bson_mutex_lock(locked); log_message_t *actual_message_iter = entity->log_messages; bson_iter_t expected_message_iter; bool expected_message_iter_ok = bson_iter_init(&expected_message_iter, expected_messages) && bson_iter_next(&expected_message_iter); while (actual_message_iter || expected_message_iter_ok) { if (actual_message_iter && test_log_message_should_be_ignored(actual_message_iter, ignore_messages, error)) { MONGOC_DEBUG("log message ignored, %s", tmp_json(actual_message_iter->message)); actual_message_iter = actual_message_iter->next; continue; } if (!actual_message_iter) { bson_t expected_message; bson_iter_bson(&expected_message_iter, &expected_message); test_diagnostics_error_info("missing expected log message: %s", tmp_json(&expected_message)); test_set_error(error, "additional log messages expected beyond those collected"); bson_destroy(&expected_message); goto done; } if (!expected_message_iter_ok) { if (ignore_extra_messages && *ignore_extra_messages) { break; } else { test_diagnostics_error_info("extra log message: %s", tmp_json(actual_message_iter->message)); test_set_error(error, "unexpected extra log messages"); goto done; } } bson_t expected_message; bson_iter_bson(&expected_message_iter, &expected_message); bool is_match = test_check_log_message(&expected_message, actual_message_iter, error); MONGOC_DEBUG("log message check %s %s, expected: %s, actual: %s", is_match ? "MATCHED" : "FAILED", error && !is_match ? error->message : "", tmp_json(&expected_message), tmp_json(actual_message_iter->message)); bson_destroy(&expected_message); if (!is_match) { goto done; } actual_message_iter = actual_message_iter->next; expected_message_iter_ok = bson_iter_next(&expected_message_iter); } ret = true; done: if (locked) { bson_mutex_unlock(locked); } bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool test_check_expected_log_messages(test_t *test, bson_error_t *error) { bool ret = false; bson_iter_t iter; if (!test->expect_log_messages) { ret = true; goto done; } BSON_FOREACH(test->expect_log_messages, iter) { bson_t expected_log_messages_for_client; bson_iter_bson(&iter, &expected_log_messages_for_client); if (!test_check_expected_log_messages_for_client(test, &expected_log_messages_for_client, error)) { test_diagnostics_error_info("checking expected log messages: %s", tmp_json(&expected_log_messages_for_client)); goto done; } } ret = true; done: return ret; } static bool test_check_outcome_collection(test_t *test, bson_t *collection_data, bson_error_t *error) { bool ret = false; bson_parser_t *bp = NULL; char *database_name = NULL; char *collection_name = NULL; bson_t *documents = NULL; mongoc_collection_t *coll = NULL; mongoc_cursor_t *cursor = NULL; bson_t *opts = NULL; mongoc_read_concern_t *rc = NULL; mongoc_read_prefs_t *rp = NULL; const bson_t *out; bson_t *actual_data = NULL; uint32_t i; bson_iter_t iter; bson_iter_t eiter; bp = bson_parser_new(); bson_parser_utf8(bp, "databaseName", &database_name); bson_parser_utf8(bp, "collectionName", &collection_name); bson_parser_array(bp, "documents", &documents); if (!bson_parser_parse(bp, collection_data, error)) { goto done; } coll = mongoc_client_get_collection(test->test_file->test_runner->internal_client, database_name, collection_name); opts = BCON_NEW("sort", "{", "_id", BCON_INT32(1), "}"); rc = mongoc_read_concern_new(); mongoc_read_concern_set_level(rc, MONGOC_READ_CONCERN_LEVEL_LOCAL); rp = mongoc_read_prefs_new(MONGOC_READ_PRIMARY); cursor = mongoc_collection_find_with_opts(coll, tmp_bson("{}"), tmp_bson("{'sort': {'_id': 1}}"), rp); /* Read the full cursor into a BSON array so error messages can include the * full list of documents. */ actual_data = bson_new(); i = 0; while (mongoc_cursor_next(cursor, &out)) { char storage[16]; const char *key; bson_uint32_to_string(i, &key, storage, sizeof(storage)); BSON_APPEND_DOCUMENT(actual_data, key, out); i++; } if (mongoc_cursor_error(cursor, error)) { goto done; } if (bson_count_keys(actual_data) != bson_count_keys(documents)) { test_set_error(error, "expected collection %s to contain: %s\nbut got: %s", collection_name, tmp_json(documents), tmp_json(actual_data)); goto done; } bson_iter_init(&eiter, documents); bson_iter_next(&eiter); BSON_FOREACH(actual_data, iter) { bson_t actual; bson_t expected; bson_t *actual_sorted = NULL; bson_t *expected_sorted = NULL; bson_iter_bson(&iter, &actual); actual_sorted = bson_copy_and_sort(&actual); bson_iter_bson(&eiter, &expected); expected_sorted = bson_copy_and_sort(&expected); if (!bson_equal(actual_sorted, expected_sorted)) { test_set_error(error, "expected %s, but got %s", tmp_json(expected_sorted), tmp_json(actual_sorted)); bson_destroy(actual_sorted); bson_destroy(expected_sorted); goto done; } bson_destroy(actual_sorted); bson_destroy(expected_sorted); bson_iter_next(&eiter); } ret = true; done: bson_destroy(opts); mongoc_collection_destroy(coll); mongoc_cursor_destroy(cursor); mongoc_read_concern_destroy(rc); mongoc_read_prefs_destroy(rp); bson_destroy(actual_data); bson_parser_destroy_with_parsed_fields(bp); return ret; } static bool test_check_outcome(test_t *test, bson_error_t *error) { bool ret = false; bson_iter_t iter; if (!test->outcome) { ret = true; goto done; } BSON_FOREACH(test->outcome, iter) { bson_t collection_data; bson_iter_bson(&iter, &collection_data); if (!test_check_outcome_collection(test, &collection_data, error)) { goto done; } } ret = true; done: return ret; } static bool run_distinct_on_each_mongos(test_t *test, char *db_name, char *coll_name, bson_error_t *error) { bool ret = false; bson_t *cmd = NULL; test_runner_t *runner = test->test_file->test_runner; cmd = BCON_NEW("distinct", coll_name, "key", "x", "query", "{", "}"); for (size_t i = 0u; i < runner->server_ids.len; i++) { const uint32_t server_id = _mongoc_array_index(&runner->server_ids, uint32_t, i); if (!mongoc_client_command_simple_with_server_id(test->test_file->test_runner->internal_client, db_name, cmd, NULL /* read prefs */, server_id, NULL /* reply */, error)) { goto done; } } ret = true; done: bson_destroy(cmd); return ret; } static bool test_run_distinct_workaround(test_t *test, bson_error_t *error) { bool ret = false; bson_iter_t iter; bson_parser_t *bp = NULL; mongoc_collection_t *coll = NULL; if (0 != strcmp(test->test_file->test_runner->topology_type, "sharded") && 0 != strcmp(test->test_file->test_runner->topology_type, "sharded-replicaset")) { ret = true; goto done; } if (!test_has_operation(test, "distinct")) { ret = true; goto done; } /* Get the database/collection name from each collection entity. */ BSON_FOREACH(test->test_file->create_entities, iter) { bson_t entity_bson; char *coll_name = NULL; char *db_id = NULL; char *db_name = NULL; mongoc_database_t *db = NULL; bson_iter_t entity_iter; if (!BSON_ITER_HOLDS_DOCUMENT(&iter)) { test_set_error(error, "unexpected non-document createEntity: %s", bson_iter_key(&iter)); goto done; } bson_iter_recurse(&iter, &entity_iter); if (!bson_iter_find(&entity_iter, "collection")) { continue; } if (!BSON_ITER_HOLDS_DOCUMENT(&entity_iter)) { test_set_error(error, "unexpected non-document in iter: %s", bson_iter_key(&entity_iter)); goto done; } bson_iter_bson(&entity_iter, &entity_bson); bp = bson_parser_new(); bson_parser_allow_extra(bp, true); bson_parser_utf8(bp, "collectionName", &coll_name); bson_parser_utf8(bp, "database", &db_id); if (!bson_parser_parse(bp, &entity_bson, error)) { goto done; } db = entity_map_get_database(test->entity_map, db_id, error); if (!db) { goto done; } db_name = (char *)mongoc_database_get_name(db); if (!run_distinct_on_each_mongos(test, db_name, coll_name, error)) { goto done; } bson_parser_destroy_with_parsed_fields(bp); bp = NULL; } ret = true; done: mongoc_collection_destroy(coll); bson_parser_destroy_with_parsed_fields(bp); return ret; } /* This returns an error on failure instead of asserting where possible. * This allows the test runner to perform server clean up even on failure (e.g. * disable failpoints). */ bool test_run(test_t *test, bson_error_t *error) { bool ret = false; test_runner_t *test_runner = NULL; test_file_t *test_file = NULL; char *subtest_selector = NULL; bson_error_t nonfatal_error; test_file = test->test_file; test_runner = test_file->test_runner; if (is_test_skipped(test)) { MONGOC_DEBUG("SKIPPING test '%s'. Reason: 'explicitly skipped in runner.c'", test->description); ret = true; goto done; } subtest_selector = _mongoc_getenv("MONGOC_JSON_SUBTEST"); if (subtest_selector && NULL == strstr(test->description, subtest_selector)) { MONGOC_DEBUG("SKIPPING test '%s'. Reason: 'skipped by MONGOC_JSON_SUBTEST'", test->description); ret = true; goto done; } if (test->skip_reason != NULL) { MONGOC_DEBUG("SKIPPING test '%s'. Reason: '%s'", test->description, test->skip_reason); ret = true; goto done; } if (test->run_on_requirements) { const char *reason; if (!check_run_on_requirements(test_runner, test->run_on_requirements, &reason)) { MONGOC_DEBUG("SKIPPING test '%s'. Reason: '%s'", test->description, reason); ret = true; goto done; } } if (!test_setup_initial_data(test, error)) { test_diagnostics_error_info("%s", "setting up initial data"); goto done; } if (!test_create_entities(test, error)) { test_diagnostics_error_info("%s", "creating entities"); goto done; } if (!test_run_distinct_workaround(test, error)) { test_diagnostics_error_info("%s", "sending distinct to each mongos"); goto done; } if (!test_run_operations(test, error)) { test_diagnostics_error_info("%s", "running operations"); goto done; } entity_map_disable_event_listeners(test->entity_map); if (!test_check_expected_events(test, error)) { test_diagnostics_error_info("%s", "checking expected events"); goto done; } if (!test_check_expected_log_messages(test, error)) { test_diagnostics_error_info("%s", "checking expected log messages"); goto done; } if (!test_check_outcome(test, error)) { test_diagnostics_error_info("%s", "checking outcome"); goto done; } ret = true; done: /* always clean up failpoints, even on test failure */ if (!cleanup_failpoints(test, &nonfatal_error)) { test_error("error cleaning up failpoints: %s", nonfatal_error.message); } /* always terminate transactions, even on test failure. */ if (!test_runner_terminate_open_transactions(test_runner, &nonfatal_error)) { MONGOC_DEBUG("error terminating transactions: %s", nonfatal_error.message); } bson_free(subtest_selector); return ret; } void run_one_test_file(void *bson_vp) { test_runner_t *test_runner = NULL; test_file_t *test_file = NULL; bson_iter_t test_iter; bson_t *const bson = bson_vp; test_diagnostics_init(); test_runner = test_runner_new(); test_file = test_file_new(test_runner, bson); test_diagnostics_test_info("test file: %s", test_file->description); if (is_test_file_skipped(test_file)) { MONGOC_DEBUG("SKIPPING test file '%s'. Reason: 'explicitly skipped in runner.c'", test_file->description); goto done; } check_schema_version(test_file); if (test_file->run_on_requirements) { const char *reason; if (!check_run_on_requirements(test_runner, test_file->run_on_requirements, &reason)) { MONGOC_DEBUG("SKIPPING test file (%s). Reason:\n%s", test_file->description, reason); goto done; } } BSON_FOREACH(test_file->tests, test_iter) { test_t *test = NULL; bson_t test_bson; bool test_ok; bson_error_t error = {0}; test_diagnostics_reset(); test_diagnostics_test_info("test file: %s", test_file->description); bson_iter_bson(&test_iter, &test_bson); test = test_new(test_file, &test_bson); test_diagnostics_test_info("running test: %s", test->description); test_ok = test_run(test, &error); if (!test_ok) { test_diagnostics_abort(&error); } test_destroy(test); } done: test_file_destroy(test_file); test_runner_destroy(test_runner); test_diagnostics_cleanup(); } void run_unified_tests(TestSuite *suite, const char *base, const char *subdir) { install_json_test_suite_with_check( suite, base, subdir, &run_one_test_file, TestSuite_CheckLive, test_framework_skip_if_no_crypto); } void test_install_unified(TestSuite *suite) { run_unified_tests(suite, JSON_DIR, "unified"); run_unified_tests(suite, JSON_DIR, "crud/unified"); run_unified_tests(suite, JSON_DIR, "transactions/unified"); run_unified_tests(suite, JSON_DIR, "collection-management"); run_unified_tests(suite, JSON_DIR, "sessions/unified"); run_unified_tests(suite, JSON_DIR, "change_streams/unified"); run_unified_tests(suite, JSON_DIR, "load_balancers"); run_unified_tests(suite, JSON_DIR, "client_side_encryption/unified"); run_unified_tests(suite, JSON_DIR, "retryable_reads/unified"); run_unified_tests(suite, JSON_DIR, "retryable_writes/unified"); run_unified_tests(suite, JSON_DIR, "index-management"); run_unified_tests(suite, JSON_DIR, "command-logging-and-monitoring"); run_unified_tests(suite, JSON_DIR, "server_selection/logging"); run_unified_tests(suite, JSON_DIR, "server_discovery_and_monitoring/unified"); run_unified_tests(suite, JSON_DIR, "auth/unified"); } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/runner.h000066400000000000000000000046661511661753600234020ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_RUNNER_H #define UNIFIED_RUNNER_H #include "./entity-map.h" #include #include #include #include #include /* test_runner_t, test_file_t, and test_t model the types described in the "Test * Runner Implementation" section of the Unified Test Format specification. */ typedef struct { mongoc_client_t *internal_client; semver_t server_version; /* topology_type may be "single", "replicaset", "sharded", * "sharded-replicaset", or "load-balanced". */ const char *topology_type; mongoc_array_t server_ids; bson_t *server_parameters; } test_runner_t; typedef struct { test_runner_t *test_runner; char *description; semver_t schema_version; bson_t *run_on_requirements; bson_t *create_entities; bson_t *initial_data; bson_t *yaml_anchors; bson_t *tests; } test_file_t; typedef struct _failpoint_t failpoint_t; typedef struct { test_file_t *test_file; char *description; bson_t *run_on_requirements; char *skip_reason; bson_t *operations; bson_t *expect_events; bson_t *expect_log_messages; bson_t *outcome; entity_map_t *entity_map; failpoint_t *failpoints; bool loop_operation_executed; bson_t *cluster_time_after_initial_data; } test_t; /* Set server_id to 0 if the failpoint was not against a pinned mongos. */ void register_failpoint(test_t *test, char *failpoint, char *client_id, uint32_t server_id); bool test_count_matching_events_for_client( test_t *test, entity_t *client, bson_t *expected_event, bson_error_t *error, int64_t *count_out); /* Run a directory of test files through the unified test runner. */ void run_unified_tests(TestSuite *suite, const char *base, const char *subdir); void run_one_test_file(void *bson_vp); #endif /* UNIFIED_RUNNER_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/unified/test-diagnostics.c000066400000000000000000000100131511661753600253270ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./test-diagnostics.h" #include #include #include #include #include typedef struct _msg_t { char *string; struct _msg_t *next; } diagnostics_msg_t; typedef struct { diagnostics_msg_t *test_info; diagnostics_msg_t *error_info; bson_mutex_t mutex; } test_diagnostics_t; static test_diagnostics_t diagnostics; static char * test_diagnostics_error_string(bson_error_t *error) { diagnostics_msg_t *msg_iter = NULL; test_diagnostics_t *td = &diagnostics; mcommon_string_append_t str; mcommon_string_new_as_append(&str); /* Give a large header / footer to make the error easily grep-able */ mcommon_string_append(&str, "****************************** BEGIN_MONGOC_ERROR " "******************************\n"); bson_mutex_lock(&td->mutex); if (td->test_info) { mcommon_string_append(&str, "test info:\n"); } LL_FOREACH(td->test_info, msg_iter) { mcommon_string_append(&str, msg_iter->string); mcommon_string_append(&str, "\n"); } mcommon_string_append(&str, "\n"); if (td->error_info) { mcommon_string_append(&str, "error context:\n"); } LL_FOREACH(td->error_info, msg_iter) { mcommon_string_append(&str, msg_iter->string); mcommon_string_append(&str, "\n\n"); } bson_mutex_unlock(&td->mutex); if (error && error->code != 0) { mcommon_string_append_printf(&str, "error: %s\n", error->message); } mcommon_string_append(&str, "******************************* END_MONGOC_ERROR " "*******************************\n"); return mcommon_string_from_append_destroy_with_steal(&str); } static void handle_abort(int signo) { BSON_UNUSED(signo); MONGOC_ERROR("abort handler entered"); char *const msg = test_diagnostics_error_string(NULL); fprintf(stderr, "%s", msg); bson_free(msg); } void test_diagnostics_init(void) { test_diagnostics_t *td = &diagnostics; memset(td, 0, sizeof(test_diagnostics_t)); bson_mutex_init(&td->mutex); signal(SIGABRT, handle_abort); } void test_diagnostics_reset(void) { test_diagnostics_t *td = &diagnostics; diagnostics_msg_t *iter, *iter_tmp; LL_FOREACH_SAFE(td->test_info, iter, iter_tmp) { bson_free(iter->string); bson_free(iter); } LL_FOREACH_SAFE(td->error_info, iter, iter_tmp) { bson_free(iter->string); bson_free(iter); } td->test_info = NULL; td->error_info = NULL; } void test_diagnostics_cleanup(void) { test_diagnostics_t *td = &diagnostics; test_diagnostics_reset(); bson_mutex_destroy(&td->mutex); signal(SIGABRT, SIG_DFL); } void _test_diagnostics_add(bool fail, const char *fmt, ...) { test_diagnostics_t *td = &diagnostics; va_list args; diagnostics_msg_t *msg = NULL; char *msg_string; va_start(args, fmt); msg_string = bson_strdupv_printf(fmt, args); va_end(args); msg = bson_malloc0(sizeof(diagnostics_msg_t)); msg->string = msg_string; bson_mutex_lock(&td->mutex); if (fail) { LL_PREPEND(td->error_info, msg); } else { LL_APPEND(td->test_info, msg); } bson_mutex_unlock(&td->mutex); MONGOC_DEBUG("%s", msg_string); } void test_diagnostics_abort(bson_error_t *error) { signal(SIGABRT, SIG_DFL); test_error("%s", test_diagnostics_error_string(error)); } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/test-diagnostics.h000066400000000000000000000025451511661753600253470ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_TEST_DIAGNOSTICS #define UNIFIED_TEST_DIAGNOSTICS #include void _test_diagnostics_add(bool fail, const char *fmt, ...) BSON_GNUC_PRINTF(2, 3); #define test_diagnostics_test_info(fmt, ...) \ _test_diagnostics_add(false, "[%s:%d %s()]\n" fmt, __FILE__, (int)(__LINE__), BSON_FUNC, __VA_ARGS__) /* Append additional information to an error after it has occurred (similar to * backtrace). */ #define test_diagnostics_error_info(fmt, ...) \ _test_diagnostics_add(true, "[%s:%d %s()]\n" fmt, __FILE__, (int)(__LINE__), BSON_FUNC, __VA_ARGS__) void test_diagnostics_init(void); void test_diagnostics_cleanup(void); void test_diagnostics_reset(void); void test_diagnostics_abort(bson_error_t *error); #endif /* UNIFIED_TEST_DIAGNOSTICS */ mongo-c-driver-2.2.1/src/libmongoc/tests/unified/util.c000066400000000000000000000127461511661753600230370ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "./util.h" #include #include #include #include static int cmp_key(const void *a, const void *b) { return strcmp(*(const char **)a, *(const char **)b); } bson_t * bson_copy_and_sort(const bson_t *in) { bson_t *out = bson_new(); bson_iter_t iter; const char **keys; int nkeys = bson_count_keys(in); int i = 0; keys = bson_malloc0(sizeof(const char *) * nkeys); BSON_FOREACH(in, iter) { keys[i] = bson_iter_key(&iter); i++; } qsort((void *)keys, nkeys, sizeof(const char *), cmp_key); for (i = 0; i < nkeys; i++) { BSON_ASSERT(bson_iter_init_find(&iter, in, keys[i])); BSON_APPEND_VALUE(out, keys[i], bson_iter_value(&iter)); } bson_free((void *)keys); return out; } typedef struct { const char *str; bson_type_t type; } mcommon_string_and_type_t; /* List of aliases: https://www.mongodb.com/docs/manual/reference/bson-types/ */ mcommon_string_and_type_t bson_type_map[] = { {"double", BSON_TYPE_DOUBLE}, {"string", BSON_TYPE_UTF8}, {"object", BSON_TYPE_DOCUMENT}, {"array", BSON_TYPE_ARRAY}, {"binData", BSON_TYPE_BINARY}, {"undefined", BSON_TYPE_UNDEFINED}, {"objectId", BSON_TYPE_OID}, {"bool", BSON_TYPE_BOOL}, {"date", BSON_TYPE_DATE_TIME}, {"null", BSON_TYPE_NULL}, {"regex", BSON_TYPE_REGEX}, {"dbPointer", BSON_TYPE_DBPOINTER}, {"javascript", BSON_TYPE_CODE}, {"javascriptWithScope", BSON_TYPE_CODEWSCOPE}, {"int", BSON_TYPE_INT32}, {"timestamp", BSON_TYPE_TIMESTAMP}, {"long", BSON_TYPE_INT64}, {"decimal", BSON_TYPE_DECIMAL128}, {"minKey", BSON_TYPE_MINKEY}, {"maxKey", BSON_TYPE_MAXKEY}, {"eod", BSON_TYPE_EOD}, }; bson_type_t bson_type_from_string(const char *in) { mlib_foreach_arr (mcommon_string_and_type_t, it, bson_type_map) { if (0 == strcmp(in, it->str)) { return it->type; } } test_error("unrecognized type string: %s\n", in); return BSON_TYPE_EOD; } const char * bson_type_to_string(bson_type_t btype) { mlib_foreach_arr (mcommon_string_and_type_t, it, bson_type_map) { if (btype == it->type) { return it->str; } } test_error("unrecognized type: %d\n", (int)btype); return "invalid"; } static void test_copy_and_sort(void) { bson_t *in = tmp_bson("{'b': 1, 'a': 1, 'd': 1, 'c': 1}"); bson_t *expect = tmp_bson("{'a': 1, 'b': 1, 'c': 1, 'd': 1}"); bson_t *out = bson_copy_and_sort(in); if (!bson_equal(expect, out)) { test_error("expected: %s, got: %s", tmp_json(expect), tmp_json(out)); } bson_destroy(out); } void test_bson_util_install(TestSuite *suite) { TestSuite_Add(suite, "/unified/selftest/util/copy_and_sort", test_copy_and_sort); } /* CMAP (CDRIVER-3525) isn't planned for implementation in this driver. Many tests that would otherwise require CMAP * are used in partial form by skipping individual checks that involve unsupported events. */ bool is_unsupported_event_type(const char *event_type) { char *unsupported_event_types[] = {"poolCreatedEvent", "poolReadyEvent", "poolClearedEvent", "poolClosedEvent", "connectionCreatedEvent", "connectionReadyEvent", "connectionClosedEvent", "connectionCheckOutStartedEvent", "connectionCheckOutFailedEvent", "connectionCheckedOutEvent", "connectionCheckedInEvent", NULL}; char **iter; for (iter = unsupported_event_types; *iter != NULL; iter++) { if (0 == bson_strcasecmp(event_type, *iter)) { return true; } } return false; } int64_t usecs_since_epoch(void) { struct timeval tv; BSON_ASSERT(bson_gettimeofday(&tv) == 0); BSON_ASSERT(mlib_in_range(int64_t, tv.tv_sec)); BSON_ASSERT(mlib_in_range(int64_t, tv.tv_usec)); const int64_t secs = (int64_t)tv.tv_sec; const int64_t usecs = (int64_t)tv.tv_usec; const int64_t factor = 1000000; BSON_ASSERT(INT64_MAX / factor >= secs); BSON_ASSERT(INT64_MAX - (factor * secs) >= usecs); return secs * factor + usecs; } const char * mongoc_strcasestr(const char *haystack, const char *needle) { BSON_ASSERT_PARAM(haystack); BSON_ASSERT_PARAM(needle); if (!*needle) { return haystack; } const char *h = haystack; while (*h) { const char *h_start = h; const char *n = needle; while (*n && *h && tolower(*h) == tolower(*n)) { h++; n++; } if (!*n) { return h_start; // Match found } h = h_start + 1; // Move to the next starting position in haystack } return NULL; // No match found } mongo-c-driver-2.2.1/src/libmongoc/tests/unified/util.h000066400000000000000000000022201511661753600230260ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef UNIFIED_UTIL_H #define UNIFIED_UTIL_H #include bson_t * bson_copy_and_sort(const bson_t *in); bson_type_t bson_type_from_string(const char *in); const char * bson_type_to_string(bson_type_t btype); /* Returns true if this is an event type (part of observeEvents or * expectedEvents) that is unsupported and not emitted by the C driver. */ bool is_unsupported_event_type(const char *event_type); int64_t usecs_since_epoch(void); const char * mongoc_strcasestr(const char *haystack, const char *needle); #endif /* UNIFIED_UTIL_H */ mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/000077500000000000000000000000001511661753600214605ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/82e9b7a6.0000066400000000000000000000023701511661753600227120ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDfzCCAmegAwIBAgIDB1MGMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIwMjMxMVoXDTM5MDUyMjIwMjMxMVoweTEb MBkGA1UEAxMSRHJpdmVycyBUZXN0aW5nIENBMRAwDgYDVQQLEwdEcml2ZXJzMRAw DgYDVQQKEwdNb25nb0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQI EwhOZXcgWW9yazELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCl7VN+WsQfHlwapcOpTLZVoeMAl1LTbWTFuXSAavIyy0W1Ytky1UP/ bxCSW0mSWwCgqoJ5aXbAvrNRp6ArWu3LsTQIEcD3pEdrFIVQhYzWUs9fXqPyI9k+ QNNQ+MRFKeGteTPYwF2eVEtPzUHU5ws3+OKp1m6MCLkwAG3RBFUAfddUnLvGoZiT pd8/eNabhgHvdrCw+tYFCWvSjz7SluEVievpQehrSEPKe8DxJq/IM3tSl3tdylzT zeiKNO7c7LuQrgjAfrZl7n2SriHIlNmqiDR/kdd8+TxBuxjFlcf2WyHCO3lIcIgH KXTlhUCg50KfHaxHu05Qw0x8869yIzqbAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQELBQADggEBAEHuhTL8KQZcKCTSJbYA9MgZj7U32arMGBbc1hiq VBREwvdVz4+9tIyWMzN9R/YCKmUTnCq8z3wTlC8kBtxYn/l4Tj8nJYcgLJjQ0Fwe gT564CmvkUat8uXPz6olOCdwkMpJ9Sj62i0mpgXJdBfxKQ6TZ9yGz6m3jannjZpN LchB7xSAEWtqUgvNusq0dApJsf4n7jZ+oBZVaQw2+tzaMfaLqHgMwcu1FzA8UKCD sxCgIsZUs8DdxaD418Ot6nPfheOTqe24n+TTa+Z6O0W0QtnofJBx7tmAo1aEc57i 77s89pfwIJetpIlhzNSMKurCAocFCJMJLAASJFuu6dyDvPo= -----END CERTIFICATE-----mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/altname.pem000066400000000000000000000056551511661753600236170ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAgyOELJgWP2akoidBdtchvdRF8gZrR8rwORDmST1tmH5aKiH2 e/lkWf+pxmXnvmLXoOKk3HHGgyZ7v1sDDB0z7/rAimECqxnqJ90GFq8rGR60jCL/ hs+30m0U9CNAvjzD5yFruaisPeCZuZXEA06QbTbTaSD4u/n7fgZVGSnj2m+DFel5 S7dgL4Pa7Vh2nua8QPfczLLQI/uP9Ma5ZXjk2C2V+QBkmK64OanGY6yXn8+m5Lp1 cKhhQUiXVVO1BgFHw65FapTrhG2zgyuaqvb5F062V+XGIwZhWhDz4cTgCx0dFKU+ WQGXuEDDY3EzaOd6Ds3h6WkCRDs9cn2i0j4taQIDAQABAoIBAHeCTXkKXPQIia6Q 0dMIuWIy6k9nVCtIIWYQJZ3HUnJva6IL84IFxFNUcBczVV+m2lVvVsjjEwMAdjPs MDnA/00LGp7BS9o8Mq2DeoH/vuoUlntDhdUIxcAJ0teurNjxraKcTX0T32xAnDeJ 6ekNlwdAuKeM+cDtTykJglH9X/324eOT8sEkpohkTJaszs3PEqgN9jrHttVatmft KGT06aANBrEH61xr/nfBehd3R7WyVsIUmlihlIIBwbxyycdMSxHIiE1Qno252Ek7 GJp/dPqO2pwIH47cop48SsZLFVosqaZs3jkEIDkQkyd7tvmVG69aFBPz5+PTvdRv fufuvXUCgYEA1gTnvln9/PmC9mKFTDGdKLhFIypyOhKl1lUoDgcmCencjwu28yTA +A2fKZQFupiHYvSg5kbvmr7FGVtKLNPJWocvr7jqPvrVLCzvs6l94LhGCTVyOmgn e09xyDx3xQTuJmpg+4LD1jImL3OLO3fplbslwisip2CWzHZR6h3QRVMCgYEAnNy5 F81xbimMVcubQve6LPzZq1pYaUM5ppkejNdBoEKR28+GP0NQ7YbN6iu2LXlbpWk/ IrAyUmDUpnXFsiRDDWnPol6JzYTovzeZG+NCMJWkaQEOzm8BpUsC2UBvsX55ddxt WM4CkLOxo7KXfQwYAMKc/H8tFE7DXloH82U7jtMCgYB+PuiBFc7IYlrJgjZFSuL8 +S33X3uAHC3tL9Bv7fGXWXd8fhmOdfjKmiZwPVvfxUffrJQZInEGpE/Z9EreBJQ7 LZGIo5iyS/5hj6RaI7oYTDssBXX7VCMuDx/8UQcJli3xRUEuO+XPvUdfKFZSXxrP 81SDpDRN7aEmvQj3BF0t9wKBgCgX5ptl4HtG1V7MhufMB+Md0ckRc42cKC0j8AIR tu1udneXiHm9C/9aOGGFQLBI15rk1sVYAdS6eT/+1EQfLqBMDk0zGsfUE+VkIZdW NAHVDcvlAFLVXrdP/+9ln+bfK85rQ+ux5Ef2Fg6ARGYq5Cu1koibPPt20krYejXF Bz8PAoGBAKbCmptnjdu4QF+rGLfYyVnrtyUuRgN+Q0MCIag1dBTag6rC17xDYJ6g 3Txzzb9xAZ35pSHroB7TSr32vRUQVrAcfldW4mousr9A0pDoc/E2axtE1YmzSYwk jqgu3PeWrtwBthUEoRXbQAed97bKW+gUU677u9IFRCS2YIfwDV5R -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDnTCCAoWgAwIBAgIDCRkUMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIyMzQzNloXDTM5MDUyMjIyMzQzNlowcDES MBAGA1UEAxMJbG9jYWxob3N0MRAwDgYDVQQLEwdEcml2ZXJzMRAwDgYDVQQKEwdN b25nb0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQIEwhOZXcgWW9y azELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCD I4QsmBY/ZqSiJ0F21yG91EXyBmtHyvA5EOZJPW2YfloqIfZ7+WRZ/6nGZee+Yteg 4qTcccaDJnu/WwMMHTPv+sCKYQKrGeon3QYWrysZHrSMIv+Gz7fSbRT0I0C+PMPn IWu5qKw94Jm5lcQDTpBtNtNpIPi7+ft+BlUZKePab4MV6XlLt2Avg9rtWHae5rxA 99zMstAj+4/0xrlleOTYLZX5AGSYrrg5qcZjrJefz6bkunVwqGFBSJdVU7UGAUfD rkVqlOuEbbODK5qq9vkXTrZX5cYjBmFaEPPhxOALHR0UpT5ZAZe4QMNjcTNo53oO zeHpaQJEOz1yfaLSPi1pAgMBAAGjNzA1MDMGA1UdEQQsMCqCCWxvY2FsaG9zdIcE fwAAAYIXYWx0ZXJuYXRpdmUubW9uZ29kYi5jb20wDQYJKoZIhvcNAQELBQADggEB AADOro10g1QReF0QVX2w+yVwCWy8FUzuksX0RI0RCFRJPo79SH7o2IZFGbLlBL8K MMsgSrzRW/HcyE91fv0R2b7kvqfD3Eo1W1ocufjVg+3e4uuwm9k9SLjSI6mE4hEf H6BeFoZhUdbrq9l/ez+NK+3ToHAl1bGLkipfnB522gRO1CjkpiY2knaaNQtjd/a9 7QXqUs+KMJx42yqjBbVE6MdA2ypNMMIc8AgI5kRKEBGHpS4Z6VNZN4Pus1atGlRW OwkjHK5pnT1TAKSODjfFw5VlXGztGTPKuJhM2/X7Qi0bO8b7NmH7cjDBATmZF5O8 FAxIQ8+3qUPMXYkb1ipLOdQ= -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/ca.pem000066400000000000000000000023701511661753600225500ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDfzCCAmegAwIBAgIDB1MGMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIwMjMxMVoXDTM5MDUyMjIwMjMxMVoweTEb MBkGA1UEAxMSRHJpdmVycyBUZXN0aW5nIENBMRAwDgYDVQQLEwdEcml2ZXJzMRAw DgYDVQQKEwdNb25nb0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQI EwhOZXcgWW9yazELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCl7VN+WsQfHlwapcOpTLZVoeMAl1LTbWTFuXSAavIyy0W1Ytky1UP/ bxCSW0mSWwCgqoJ5aXbAvrNRp6ArWu3LsTQIEcD3pEdrFIVQhYzWUs9fXqPyI9k+ QNNQ+MRFKeGteTPYwF2eVEtPzUHU5ws3+OKp1m6MCLkwAG3RBFUAfddUnLvGoZiT pd8/eNabhgHvdrCw+tYFCWvSjz7SluEVievpQehrSEPKe8DxJq/IM3tSl3tdylzT zeiKNO7c7LuQrgjAfrZl7n2SriHIlNmqiDR/kdd8+TxBuxjFlcf2WyHCO3lIcIgH KXTlhUCg50KfHaxHu05Qw0x8869yIzqbAgMBAAGjEDAOMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQELBQADggEBAEHuhTL8KQZcKCTSJbYA9MgZj7U32arMGBbc1hiq VBREwvdVz4+9tIyWMzN9R/YCKmUTnCq8z3wTlC8kBtxYn/l4Tj8nJYcgLJjQ0Fwe gT564CmvkUat8uXPz6olOCdwkMpJ9Sj62i0mpgXJdBfxKQ6TZ9yGz6m3jannjZpN LchB7xSAEWtqUgvNusq0dApJsf4n7jZ+oBZVaQw2+tzaMfaLqHgMwcu1FzA8UKCD sxCgIsZUs8DdxaD418Ot6nPfheOTqe24n+TTa+Z6O0W0QtnofJBx7tmAo1aEc57i 77s89pfwIJetpIlhzNSMKurCAocFCJMJLAASJFuu6dyDvPo= -----END CERTIFICATE-----mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/client-pkcs8-unencrypted.pem000066400000000000000000000056451511661753600270370ustar00rootroot00000000000000-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCw1LxQS6Kfv8rb 2Nd8g4ukiiHWMTJZWrGKJ7Y6fHu4kkpygqiSEDdd5SdU3STpfkzBhZw3nbFyezst i3K3TqdGlMbb96ahXjjD24pO4ey9RuI7BJWb9OgpBDgVQVmiqitcf5mYm4ikk1+h b7cKQTW8QMIh5wiroE2DnJKw+29K5IkcaOmZzv/llQO8UTZonxBslTdazQdeIRvr KaLTjwuXMQvZUpffDqaqqH7t1xkYDLupiTbkVn2S0q8J5Bq7uZPJTWGw+soWIq0w 3xDZkAi1fXdqzDn8h5JOrYuAsUeVuPkqmrgaYt00KyHMflfsTDchgzwQeaxfx2YP qaG/u+lXAgMBAAECggEAE52lviqFwb7e3ABz9wYIqZoBIueWND9RTogVOOuyNclU pNtFo95Upf/TmyBlBdnS3ezaZXkCxDZTXDwJ37fD6pp6bNBOFbyEA4YJE7MQNfb1 BaL+jaxfTJ2BMypqrRa/dKVa/ojSYZ9PjnL8FREiyt1MK8KbPZ6suprV0vgxYldE WNP1ROzm3CV5wg4zYgcqgYZqAWHKZEriQN7BNEL1+l+gCDJ+6zekI7/CL8XzIoY8 MTBj7OCSGslD6RJ6SLugp0YPUfnjS8HyBG0QiqywTRjqsRh/3tayxCXEmC+gkENJ +06KNLqbC+hqwNTB8WrLI+KKtrBdZaEdeRwOMiL9cQKBgQDnF+OKXD1jIzZQZA0R Js026c9yPuANls3fjvEnCZiaL0BR08u33E3ddoyqpHbaTUNQ7EL/mEfS6JeKvuYN +qYL5dL+Jz9U6xrcINZ6OQSfIYuLBIdjnTbAP/FaAfBSIZUAb0djri+cMabovcoZ cDairFqcvhXT7T4e3j2lnXqLywKBgQDD47EIca2mTOMI//PzGv7VVNJ2lz/gI/Yc 42diilyfjwp9Cd/s1qV7r3/WRmnKkmW9BIZ54DeMwaKA0kSRvz+RpWhEsKKxdzAt zRch8JN6IroVLQprfQP/zhCbxSwfFF2kaQyRghMBravri2BEvxqzj+6R5cEoT6g6 Ffjct4R/JQKBgGR/shfY12WGybcaW8hqvHI2Kl4/08Z1H+EqU9urQ69B/1HWrtCt wTsftDr9vSZg1Xaa2OQ5AHtLZaQUMw4/Q/kGoMSgot02RX8X1M5gf48I0pvJg2uh 0k63QCnpj+7X5enDeyNxfAkMWs76wqpfb5M9K0bhL7LziMF52wtsOgATAoGBAJPP v8oLXWjbI4Wq/T035Yq8EoOB5aUP/aoWvfBRT0rm+JcZWGqyHPSTnPbm8vT0OujB /WcBlWkUw7ZI84y2rxULpv4N+vXGZghpdUca7W1/vsIz1mT9VIM1zrp7satSBscE rYMuj4D4t31pEh9NxKwxs2dL4tC0KtCJu9twbv4xAoGBAJjXWgxPZ1R6ShkTJbie jtbkPviVHzO0yOn99ZZMOj8BkY8FjpxmhkUggKvNi0NP/kHMHQmHV/g71lCSbn46 +UVuahmhJszMcvegkIE5jkrT+R0ZcvjpZaEhElJhqQ1TpUhLtKMOkqCb0Pxt59Cp l6hKCBKMghQsiIC1iBLzS+YY -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIDAxOUMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIzNTU1NFoXDTM5MDUyMjIzNTU1NFowaTEP MA0GA1UEAxMGY2xpZW50MRAwDgYDVQQLEwdEcml2ZXJzMQwwCgYDVQQKEwNNREIx FjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYD VQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALDUvFBLop+/ ytvY13yDi6SKIdYxMllasYontjp8e7iSSnKCqJIQN13lJ1TdJOl+TMGFnDedsXJ7 Oy2LcrdOp0aUxtv3pqFeOMPbik7h7L1G4jsElZv06CkEOBVBWaKqK1x/mZibiKST X6FvtwpBNbxAwiHnCKugTYOckrD7b0rkiRxo6ZnO/+WVA7xRNmifEGyVN1rNB14h G+spotOPC5cxC9lSl98Opqqofu3XGRgMu6mJNuRWfZLSrwnkGru5k8lNYbD6yhYi rTDfENmQCLV9d2rMOfyHkk6ti4CxR5W4+SqauBpi3TQrIcx+V+xMNyGDPBB5rF/H Zg+pob+76VcCAwEAAaMkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF BwMCMA0GCSqGSIb3DQEBCwUAA4IBAQAqRcLAGvYMaGYOV4HJTzNotT2qE0I9THNQ wOV1fBg69x6SrUQTQLjJEptpOA288Wue6Jt3H+p5qAGV5GbXjzN/yjCoItggSKxG Xg7279nz6/C5faoIKRjpS9R+MsJGlttP9nUzdSxrHvvqm62OuSVFjjETxD39DupE YPFQoHOxdFTtBQlc/zIKxVdd20rs1xJeeU2/L7jtRBSPuR/Sk8zot7G2/dQHX49y kHrq8qz12kj1T6XDXf8KZawFywXaz0/Ur+fUYKmkVk1T0JZaNtF4sKqDeNE4zcns p3xLVDSl1Q5Gwj7bgph9o4Hxs9izPwiqjmNaSjPimGYZ399zcurY -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/client-private.pem000066400000000000000000000032161511661753600251130ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAsNS8UEuin7/K29jXfIOLpIoh1jEyWVqxiie2Onx7uJJKcoKo khA3XeUnVN0k6X5MwYWcN52xcns7LYtyt06nRpTG2/emoV44w9uKTuHsvUbiOwSV m/ToKQQ4FUFZoqorXH+ZmJuIpJNfoW+3CkE1vEDCIecIq6BNg5ySsPtvSuSJHGjp mc7/5ZUDvFE2aJ8QbJU3Ws0HXiEb6ymi048LlzEL2VKX3w6mqqh+7dcZGAy7qYk2 5FZ9ktKvCeQau7mTyU1hsPrKFiKtMN8Q2ZAItX13asw5/IeSTq2LgLFHlbj5Kpq4 GmLdNCshzH5X7Ew3IYM8EHmsX8dmD6mhv7vpVwIDAQABAoIBABOdpb4qhcG+3twA c/cGCKmaASLnljQ/UU6IFTjrsjXJVKTbRaPeVKX/05sgZQXZ0t3s2mV5AsQ2U1w8 Cd+3w+qaemzQThW8hAOGCROzEDX29QWi/o2sX0ydgTMqaq0Wv3SlWv6I0mGfT45y /BURIsrdTCvCmz2erLqa1dL4MWJXRFjT9UTs5twlecIOM2IHKoGGagFhymRK4kDe wTRC9fpfoAgyfus3pCO/wi/F8yKGPDEwY+zgkhrJQ+kSeki7oKdGD1H540vB8gRt EIqssE0Y6rEYf97WssQlxJgvoJBDSftOijS6mwvoasDUwfFqyyPiirawXWWhHXkc DjIi/XECgYEA5xfjilw9YyM2UGQNESbNNunPcj7gDZbN347xJwmYmi9AUdPLt9xN 3XaMqqR22k1DUOxC/5hH0uiXir7mDfqmC+XS/ic/VOsa3CDWejkEnyGLiwSHY502 wD/xWgHwUiGVAG9HY64vnDGm6L3KGXA2oqxanL4V0+0+Ht49pZ16i8sCgYEAw+Ox CHGtpkzjCP/z8xr+1VTSdpc/4CP2HONnYopcn48KfQnf7Nale69/1kZpypJlvQSG eeA3jMGigNJEkb8/kaVoRLCisXcwLc0XIfCTeiK6FS0Ka30D/84Qm8UsHxRdpGkM kYITAa2r64tgRL8as4/ukeXBKE+oOhX43LeEfyUCgYBkf7IX2Ndlhsm3GlvIarxy NipeP9PGdR/hKlPbq0OvQf9R1q7QrcE7H7Q6/b0mYNV2mtjkOQB7S2WkFDMOP0P5 BqDEoKLdNkV/F9TOYH+PCNKbyYNrodJOt0Ap6Y/u1+Xpw3sjcXwJDFrO+sKqX2+T PStG4S+y84jBedsLbDoAEwKBgQCTz7/KC11o2yOFqv09N+WKvBKDgeWlD/2qFr3w UU9K5viXGVhqshz0k5z25vL09Drowf1nAZVpFMO2SPOMtq8VC6b+Dfr1xmYIaXVH Gu1tf77CM9Zk/VSDNc66e7GrUgbHBK2DLo+A+Ld9aRIfTcSsMbNnS+LQtCrQibvb cG7+MQKBgQCY11oMT2dUekoZEyW4no7W5D74lR8ztMjp/fWWTDo/AZGPBY6cZoZF IICrzYtDT/5BzB0Jh1f4O9ZQkm5+OvlFbmoZoSbMzHL3oJCBOY5K0/kdGXL46WWh IRJSYakNU6VIS7SjDpKgm9D8befQqZeoSggSjIIULIiAtYgS80vmGA== -----END RSA PRIVATE KEY-----mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/client-public.pem000066400000000000000000000023741511661753600247230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIDAxOUMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIzNTU1NFoXDTM5MDUyMjIzNTU1NFowaTEP MA0GA1UEAxMGY2xpZW50MRAwDgYDVQQLEwdEcml2ZXJzMQwwCgYDVQQKEwNNREIx FjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYD VQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALDUvFBLop+/ ytvY13yDi6SKIdYxMllasYontjp8e7iSSnKCqJIQN13lJ1TdJOl+TMGFnDedsXJ7 Oy2LcrdOp0aUxtv3pqFeOMPbik7h7L1G4jsElZv06CkEOBVBWaKqK1x/mZibiKST X6FvtwpBNbxAwiHnCKugTYOckrD7b0rkiRxo6ZnO/+WVA7xRNmifEGyVN1rNB14h G+spotOPC5cxC9lSl98Opqqofu3XGRgMu6mJNuRWfZLSrwnkGru5k8lNYbD6yhYi rTDfENmQCLV9d2rMOfyHkk6ti4CxR5W4+SqauBpi3TQrIcx+V+xMNyGDPBB5rF/H Zg+pob+76VcCAwEAAaMkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF BwMCMA0GCSqGSIb3DQEBCwUAA4IBAQAqRcLAGvYMaGYOV4HJTzNotT2qE0I9THNQ wOV1fBg69x6SrUQTQLjJEptpOA288Wue6Jt3H+p5qAGV5GbXjzN/yjCoItggSKxG Xg7279nz6/C5faoIKRjpS9R+MsJGlttP9nUzdSxrHvvqm62OuSVFjjETxD39DupE YPFQoHOxdFTtBQlc/zIKxVdd20rs1xJeeU2/L7jtRBSPuR/Sk8zot7G2/dQHX49y kHrq8qz12kj1T6XDXf8KZawFywXaz0/Ur+fUYKmkVk1T0JZaNtF4sKqDeNE4zcns p3xLVDSl1Q5Gwj7bgph9o4Hxs9izPwiqjmNaSjPimGYZ399zcurY -----END CERTIFICATE-----mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/client.pem000066400000000000000000000056141511661753600234470ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAsNS8UEuin7/K29jXfIOLpIoh1jEyWVqxiie2Onx7uJJKcoKo khA3XeUnVN0k6X5MwYWcN52xcns7LYtyt06nRpTG2/emoV44w9uKTuHsvUbiOwSV m/ToKQQ4FUFZoqorXH+ZmJuIpJNfoW+3CkE1vEDCIecIq6BNg5ySsPtvSuSJHGjp mc7/5ZUDvFE2aJ8QbJU3Ws0HXiEb6ymi048LlzEL2VKX3w6mqqh+7dcZGAy7qYk2 5FZ9ktKvCeQau7mTyU1hsPrKFiKtMN8Q2ZAItX13asw5/IeSTq2LgLFHlbj5Kpq4 GmLdNCshzH5X7Ew3IYM8EHmsX8dmD6mhv7vpVwIDAQABAoIBABOdpb4qhcG+3twA c/cGCKmaASLnljQ/UU6IFTjrsjXJVKTbRaPeVKX/05sgZQXZ0t3s2mV5AsQ2U1w8 Cd+3w+qaemzQThW8hAOGCROzEDX29QWi/o2sX0ydgTMqaq0Wv3SlWv6I0mGfT45y /BURIsrdTCvCmz2erLqa1dL4MWJXRFjT9UTs5twlecIOM2IHKoGGagFhymRK4kDe wTRC9fpfoAgyfus3pCO/wi/F8yKGPDEwY+zgkhrJQ+kSeki7oKdGD1H540vB8gRt EIqssE0Y6rEYf97WssQlxJgvoJBDSftOijS6mwvoasDUwfFqyyPiirawXWWhHXkc DjIi/XECgYEA5xfjilw9YyM2UGQNESbNNunPcj7gDZbN347xJwmYmi9AUdPLt9xN 3XaMqqR22k1DUOxC/5hH0uiXir7mDfqmC+XS/ic/VOsa3CDWejkEnyGLiwSHY502 wD/xWgHwUiGVAG9HY64vnDGm6L3KGXA2oqxanL4V0+0+Ht49pZ16i8sCgYEAw+Ox CHGtpkzjCP/z8xr+1VTSdpc/4CP2HONnYopcn48KfQnf7Nale69/1kZpypJlvQSG eeA3jMGigNJEkb8/kaVoRLCisXcwLc0XIfCTeiK6FS0Ka30D/84Qm8UsHxRdpGkM kYITAa2r64tgRL8as4/ukeXBKE+oOhX43LeEfyUCgYBkf7IX2Ndlhsm3GlvIarxy NipeP9PGdR/hKlPbq0OvQf9R1q7QrcE7H7Q6/b0mYNV2mtjkOQB7S2WkFDMOP0P5 BqDEoKLdNkV/F9TOYH+PCNKbyYNrodJOt0Ap6Y/u1+Xpw3sjcXwJDFrO+sKqX2+T PStG4S+y84jBedsLbDoAEwKBgQCTz7/KC11o2yOFqv09N+WKvBKDgeWlD/2qFr3w UU9K5viXGVhqshz0k5z25vL09Drowf1nAZVpFMO2SPOMtq8VC6b+Dfr1xmYIaXVH Gu1tf77CM9Zk/VSDNc66e7GrUgbHBK2DLo+A+Ld9aRIfTcSsMbNnS+LQtCrQibvb cG7+MQKBgQCY11oMT2dUekoZEyW4no7W5D74lR8ztMjp/fWWTDo/AZGPBY6cZoZF IICrzYtDT/5BzB0Jh1f4O9ZQkm5+OvlFbmoZoSbMzHL3oJCBOY5K0/kdGXL46WWh IRJSYakNU6VIS7SjDpKgm9D8befQqZeoSggSjIIULIiAtYgS80vmGA== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIDAxOUMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIzNTU1NFoXDTM5MDUyMjIzNTU1NFowaTEP MA0GA1UEAxMGY2xpZW50MRAwDgYDVQQLEwdEcml2ZXJzMQwwCgYDVQQKEwNNREIx FjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYD VQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALDUvFBLop+/ ytvY13yDi6SKIdYxMllasYontjp8e7iSSnKCqJIQN13lJ1TdJOl+TMGFnDedsXJ7 Oy2LcrdOp0aUxtv3pqFeOMPbik7h7L1G4jsElZv06CkEOBVBWaKqK1x/mZibiKST X6FvtwpBNbxAwiHnCKugTYOckrD7b0rkiRxo6ZnO/+WVA7xRNmifEGyVN1rNB14h G+spotOPC5cxC9lSl98Opqqofu3XGRgMu6mJNuRWfZLSrwnkGru5k8lNYbD6yhYi rTDfENmQCLV9d2rMOfyHkk6ti4CxR5W4+SqauBpi3TQrIcx+V+xMNyGDPBB5rF/H Zg+pob+76VcCAwEAAaMkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF BwMCMA0GCSqGSIb3DQEBCwUAA4IBAQAqRcLAGvYMaGYOV4HJTzNotT2qE0I9THNQ wOV1fBg69x6SrUQTQLjJEptpOA288Wue6Jt3H+p5qAGV5GbXjzN/yjCoItggSKxG Xg7279nz6/C5faoIKRjpS9R+MsJGlttP9nUzdSxrHvvqm62OuSVFjjETxD39DupE YPFQoHOxdFTtBQlc/zIKxVdd20rs1xJeeU2/L7jtRBSPuR/Sk8zot7G2/dQHX49y kHrq8qz12kj1T6XDXf8KZawFywXaz0/Ur+fUYKmkVk1T0JZaNtF4sKqDeNE4zcns p3xLVDSl1Q5Gwj7bgph9o4Hxs9izPwiqjmNaSjPimGYZ399zcurY -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/commonName.pem000066400000000000000000000055601511661753600242620ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEArS94Vnpx+C+LwiCIyfZH45uwDbiEqCKr0hfWPVlJdoOQgaDO av9nbxRvx+CnsiZ1yE6Kj1NYIX3FqOzO9YizwKtPaxCqFMjDzl1HZCJ8LTZZzMic 01K38wGfacsBwno/sNZn9jgnT+9JOasD6854IAs5T7dRCFH/nxV+RuZ4ueTWIcfH jXzAZv9+wtu0sVmQKHV0J3S6ZdPqqDaYRdhOCyShBTO4RbUW1myIjooIqqy/xceV TmXGWycqZjyDDronT1kj/yx6znqudOeDzj1PaEdnsqdXxQlI7MVdRf3nXdDXTpw5 gPhqxqYc47vL6RvMxqief0BJnlc6PoZWoyTRPwIDAQABAoIBAQCYNMYwSsDrfO35 mRpfVYHs+iGKjYaZNo+Hv8dcd6Jm9E4Gf0urIfjH2VA8fKclnUOa3dxNBtTH6n/T bPyfMpu4U1cjI6w3RBNCxRw/V0eHfOMDZbTezS459k0ib3aGc2aShn0sGkICsKzM cA6sKfPNRdACzXv8MgTUzdEDgv7LcGwNUKYzz/XWZxOX+XpeAGNSdXxv6ASvZNJ7 u3Ba6LbOSAjxnKK24qdBDwCfuxRvD6ovenvI3+qIDSZSrEs/ofGhEEdKlQiyUAgS m40kWqtoq9sC4/6cGxCLw9scuwXhwE0NNP19QRjh6Hsmr6qmu8LJAKugJi+5WyLg 1oHLs91xAoGBAO4oy6cdc57UdL7A2UbFDWJkBlySw0ChCK4I49Sfq/IISpd3mOfH SxpZoh5IEnKTEYSqMi/kUUt8J/kQhjdAhqyA33GuNekfGPumUxyB8nKtowNNevyv Ou6Y9FmzwEektvTLoku/4GxVbrgE262YEu/U1bMA700YK88knCtRWrtFAoGBALoo qdUpb9s0NK0K4pGo8NYdtqVraOkXPAhKCCOY+hnl0yJERU7LLM9pYCMmR9m/TPcA pXZTETPWcB6SDJoH3nCmje1Bt3xTxnSvt9P8lXYfvgVpKz8zBrvvnZqUDbMUjWe+ vz9/jRKrarKgzG6KLnLgFV9sNbuSoOER4/h7MmCzAoGARP2qaUHd4Y/4Nd4V0yt4 Qh1pvl2BlHJR2mCW51xN6jI+sXwi3lncRsjabt1AAtLZy02mdjs01aIkzkDcMJtP qB85G2x1D5BDo3q+Ls7yFgh45ZcHXrXAY6gJeQbaV6a+nVF0NW9jKt7g0QwPO02H htRoB4/owrOS1VHsr5vEpeUCgYAsWg/MZ2js8s0yBQvh5Dws5ztiwepmzlBRMUIr KQE9NlJNMbLJiQKOD+8FsNMhf8BYgODrBfNtREPGJMm30PQgJq5dvnB2wIbhuhOz /9OkJv/gziOtlPyfvgDwmSGCbv0ZoIp0GHGF5y0ujbznASj72YN+DovmupJ1zQth YgionQKBgDGtSfvf3VpJxoabJ52tC0vJFDzkqdbOT0imuLjRHmUH4pSKuMvanvVk kYcHXeQcfLOPjH18UUqTIgK5vXXjJraduq2bGyvdLcbd3xmj5guzfim3FP83Lh/U OMAbRgBdq3rlylRqcZh0NqV05L0kJ0Wt1XIaV/eknpuFz5nD7O+y -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDcTCCAlmgAwIBAgIDB5VBMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIxMDUxNVoXDTM5MDUyMjIxMDUxNVowfTEf MB0GA1UEAxMWY29tbW9uTmFtZS5tb25nb2RiLm9yZzEQMA4GA1UECxMHRHJpdmVy czEQMA4GA1UEChMHTW9uZ29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8G A1UECBMITmV3IFlvcmsxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEArS94Vnpx+C+LwiCIyfZH45uwDbiEqCKr0hfWPVlJdoOQgaDO av9nbxRvx+CnsiZ1yE6Kj1NYIX3FqOzO9YizwKtPaxCqFMjDzl1HZCJ8LTZZzMic 01K38wGfacsBwno/sNZn9jgnT+9JOasD6854IAs5T7dRCFH/nxV+RuZ4ueTWIcfH jXzAZv9+wtu0sVmQKHV0J3S6ZdPqqDaYRdhOCyShBTO4RbUW1myIjooIqqy/xceV TmXGWycqZjyDDronT1kj/yx6znqudOeDzj1PaEdnsqdXxQlI7MVdRf3nXdDXTpw5 gPhqxqYc47vL6RvMxqief0BJnlc6PoZWoyTRPwIDAQABMA0GCSqGSIb3DQEBCwUA A4IBAQA34DUMfx0YaxsXnNlCmbkncwgb69VfwWTqtON2MabOlw9fQ0Z5YlwduBSD DxkRosVURdqV+EcGxei6opnPkdoJ+1mkCDo360q+R/bJUFqjj7djB7GCwwK/Eud4 Jjn//eLBChU+DlTjO1yL8haEQR70LyVz37sh28oIRqoTS3Nk2SZg7Gnor1qHwd6j OljaM1WiTJfq6XCSZ9/3C5Ix0Vr7xZaP9Dn5lgQ86du6N6tmaKqVobCw3vjITmnr eZTC7dKU4/O52d6lHZ1vv8GyvqrRCeiolTVzhW47GvO/n+snC0NMkXvoo7Rzv1S/ FxHvlhiH5wCbaGnBx4uF5/boedV+ -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/crl.pem000066400000000000000000000013171511661753600227450ustar00rootroot00000000000000-----BEGIN X509 CRL----- MIIB6jCB0wIBATANBgkqhkiG9w0BAQsFADB5MRswGQYDVQQDExJEcml2ZXJzIFRl c3RpbmcgQ0ExEDAOBgNVBAsTB0RyaXZlcnMxEDAOBgNVBAoTB01vbmdvREIxFjAU BgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYDVQQG EwJVUxcNMTkwNTIyMjI0NTUzWhcNMTkwNjIxMjI0NTUzWjAVMBMCAncVFw0xOTA1 MjIyMjQ1MzJaoA8wDTALBgNVHRQEBAICEAAwDQYJKoZIhvcNAQELBQADggEBACwQ W9OF6ExJSzzYbpCRroznkfdLG7ghNSxIpBQUGtcnYbkP4em6TdtAj5K3yBjcKn4a hnUoa5EJGr2Xgg0QascV/1GuWEJC9rsYYB9boVi95l1CrkS0pseaunM086iItZ4a hRVza8qEMBc3rdsracA7hElYMKdFTRLpIGciJehXzv40yT5XFBHGy/HIT0CD50O7 BDOHzA+rCFCvxX8UY9myDfb1r1zUW7Gzjn241VT7bcIJmhFE9oV0popzDyqr6GvP qB2t5VmFpbnSwkuc4ie8Jizip1P8Hg73lut3oVAHACFGPpfaNIAp4GcSH61zJmff 9UBe3CJ1INwqyiuqGeA= -----END X509 CRL----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/expired.pem000066400000000000000000000056511511661753600236320ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAw06nN1BoINnY/WJXvi+r0taDMphWQNoyeM85A6NIYKo+vWtN fvf6f2JTpg/Q4NJ3txiZE/F6yZaMFC78l1KMoz+zIEPLpSJoIezCaXyl2+AQih8A WmAOFAoiWYTiNfWoVM7t0Qzy6yS+rXifuET5Dg1mtWpA6xRFHZEqQTdKX4QzbT5G RenoFIBT9wG7xUV+FG1/9s5nx4f5gZDbwMKA7mNq/Jr+rZZQV4lReeGtoYNx1I/Z 4yd4xswI3RfuB7QDZMNHWZazFxW1N6EP5NJBDZJkYLEkMX36r4Orr/73z4EA5GBx zqdSKH9qHLRiBwesfZf7u8xb120u1S1X1J8a5QIDAQABAoIBAQC+Y9swWerYM2WL RKYCWZhndQP6e3SBzfMrv951hGQXD38Pyh2Gq5h/O0wN8xcNQz6+t3TqcxnekCrH tjI4FZnRvlQRHOXVeeAHSjUO/hr1Z8zXyHbgowi2Ula/64FVVr+cxQgiJTxdK7nR g2g4Csy6/SdlrEnSoDTsKMoHPy36Q0GaLDBnthpKIc1Prhntf6vBCgQAHXVfLk6E NwddYloL+mfEZESa3Qf2ZYeX/Ovq9agbuQ3cRE7M5FunSo9E7eXt+D+Ntk0usTKV BaUEHLRYXV827fMDGc1vBN6WFVfthhYviIEgDdkALwOw4lfIiA2WM3fhCF6Ow9hJ as3dpEHBAoGBAO+l4PdUXypWBYQNZKggH79kAFuAOWtLsMqEBO0ZaXXdvFdwdzhR jbL7mhRrghgGYpXWIUaNkcbX0XPlkWl2dRzYQqRNjUSEGFabVAxdGZPfiYoupXVl Lz/FIG3P6BnEYmczh9MxRpJyk4wlUCKppYPiBrR0Ei/qcbGvciOwLq5VAoGBANCi PWG2izO2HuBFgZTuVIvnl7ixQXgG/tvbiEmYvDNYy1E+w1MWY10Ve/JtIncBIVHk fEgJPL3hvipAez5ir9Qa1D4PlWxsIrbjuNcLaj+IsRhWBDjMKwRWgmTvvsimcyF5 39Vs4FujR8cgXy8UnZhYDVRC13PyxmYfJrp4QCpRAoGAKV8nsUsdir+DAEMXp3a0 RGRNM361avKMOMoF17DVZgW7qBTAYDakEcwh03ij4uXnSxrGb9ms2vkTLcDqE5zh pvMmvhqtUrDDSuBR6DiCW+bxZaub4OJw/79WU97aoOgoXMymnC0bk9i35C/k37cN 3fC9W5XWNfNxYU16lPKrfGkCgYA14hD0UY72Fg03YvwqmLshPvkCbFU6SKQ96B70 0wuYP1CTdSBBL0EOY2QVonYKQjJ20gn/GNOlPs48X1b1L8u1fhBezuuKiwsULRAq Cfqw2f7TCDQi7ygVALrAkuK1M7f8Z1uV5X60bCE3nna21B43oFYg8vpuKb9v1I/O DQyVYQKBgQCH/Kxq+7Or/5ciq15Vy6z+PJdsGV9FV9S7zkQOZqJ4PXJn0wG9PXnp ugjvmU1iLx0bXs5llByRx792Q/QmdWnwMCohs6bkWaBCf36JJfTkDTzzbez43cCK HcYi6gtbiBznWiLWekudRkWdhIFEGU6cSjimy1i4yvwIw85PlEQt/Q== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIDAYZJMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMDIyMzYzNVoXDTE5MDUyMTIyMzYzNVowcDES MBAGA1UEAxMJbG9jYWxob3N0MRAwDgYDVQQLEwdEcml2ZXJzMRAwDgYDVQQKEwdN b25nb0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQIEwhOZXcgWW9y azELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDD Tqc3UGgg2dj9Yle+L6vS1oMymFZA2jJ4zzkDo0hgqj69a01+9/p/YlOmD9Dg0ne3 GJkT8XrJlowULvyXUoyjP7MgQ8ulImgh7MJpfKXb4BCKHwBaYA4UCiJZhOI19ahU zu3RDPLrJL6teJ+4RPkODWa1akDrFEUdkSpBN0pfhDNtPkZF6egUgFP3AbvFRX4U bX/2zmfHh/mBkNvAwoDuY2r8mv6tllBXiVF54a2hg3HUj9njJ3jGzAjdF+4HtANk w0dZlrMXFbU3oQ/k0kENkmRgsSQxffqvg6uv/vfPgQDkYHHOp1Iof2octGIHB6x9 l/u7zFvXbS7VLVfUnxrlAgMBAAGjMDAuMCwGA1UdEQQlMCOCCWxvY2FsaG9zdIcE fwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAQEAgPh9C6Yi 6ykJYfaOETPEkggI9LlLQyQ0VhSJGrcw8DXGuPEkyd2xtczYoh0ijtYD3nlTQnh1 u+5mEEP05nuMMURzG+v7WzZG8Qfz/SDBY1Lfvb/waI3w3RT/dcZ6jwz39jQhV+rU o2F1vr37Hnh1Ehoa2igjKL1w1LmWdoFgHb0p09qQDAGtkP0gxl0t7iujDDRStLQn OpWwfOpCaYhtzWwONJn/JIG+JCE/szcRbmc4XKw8t06ffS0mKR/yZBCoekZinnPD XRVWAH/UF5XPs0mUlrvhFcT/vjgXSZvpi+UuVv3XL56xwPmXAgKsYUpqLlgbrVxv jY93LTJ1azg+Sw== -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/ldaptest-ca-cert.crt000066400000000000000000000162441511661753600253350ustar00rootroot00000000000000Certificate: Data: Version: 3 (0x2) Serial Number: 98:49:52:9a:3f:8d:7a:07 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = New York, L = New York City, O = 10Gen, OU = Kernel, CN = My Cert Authority, emailAddress = root@lazarus Validity Not Before: Nov 13 16:28:12 2023 GMT Not After : Nov 8 16:28:12 2043 GMT Subject: C = US, ST = New York, L = New York City, O = 10Gen, OU = Kernel, CN = My Cert Authority, emailAddress = root@lazarus Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:e4:3b:67:2c:1f:8d:3b:39:f8:aa:06:f6:07:e5: 76:0f:6c:0e:a9:ae:49:f8:aa:c5:d6:ea:b9:b4:92: 79:5b:d4:98:e4:76:1a:6f:6a:f4:bb:e8:72:5b:b9: 83:91:32:37:ae:fd:70:43:b9:7e:8f:e4:c3:bc:5a: 1a:4a:6b:a2:e7:29:41:58:22:52:d0:67:18:54:32: 75:4e:2d:54:87:13:b9:ac:6e:57:1a:d9:4c:aa:d0: b2:a2:35:43:b9:d5:f9:2f:d2:7c:f4:7c:70:46:2e: 45:86:89:c7:c5:e2:7b:dd:f0:2d:74:92:c7:a1:87: 66:cc:3f:2f:f5:d6:18:73:ce:cb:80:e2:33:3f:ca: 30:77:b7:fb:49:f9:33:42:cc:e2:fe:21:fd:3a:17: 1f:f9:0c:47:b6:ff:1b:0b:c3:d2:15:2a:8c:86:27: 55:e3:e6:0d:fd:2b:c3:ad:da:0a:d6:69:13:37:3f: 1b:f6:d1:c1:2d:13:c1:ee:de:07:0a:a5:80:ee:c5: 7a:7d:ec:dc:e3:a2:a2:14:41:60:ed:be:4c:2e:2e: 8a:bf:70:36:c7:b3:d0:49:e9:04:ab:45:cb:7d:78: ac:4f:0b:32:45:c0:60:e3:1d:72:69:1c:a3:a1:fd: d7:37:49:47:dd:cd:e8:9b:75:2c:0c:8e:45:9d:8f: b2:cd:15:d2:40:55:94:ff:12:a7:af:70:6a:a3:80: ca:9c:6f:a1:32:31:78:0c:c5:a6:88:80:44:d3:d4: 39:99:31:b6:72:b5:9d:95:bc:b8:b2:f3:b4:3a:b7: 0d:0b:fb:d8:8d:49:05:64:7b:69:2b:dc:a6:57:cc: 7c:30:b9:44:8c:ed:af:a5:90:9e:f1:d6:d7:75:3d: a6:dc:6b:02:71:d6:c4:d9:9a:db:94:18:55:6a:8b: 4f:43:d0:14:58:63:6b:df:e3:0d:ff:94:f0:98:59: d0:24:5a:da:e8:54:9d:16:04:26:26:f9:9a:77:75: 6d:99:4a:a1:06:4e:7b:78:2e:b7:44:f0:b2:c1:31: df:89:65:5a:cd:b1:7e:c1:c6:ec:88:92:0f:1e:31: 9f:a3:52:4d:6f:95:6f:5f:cc:58:04:b0:9d:8b:a5: 48:7c:39:65:99:27:57:74:75:3d:9f:a6:1e:8b:67: 0e:a7:1b:bf:3b:27:c5:89:21:9a:c4:8f:f8:99:3b: 59:e5:8d:8a:f6:de:ea:57:8e:68:77:a9:67:8c:e1: 44:b9:e6:a7:c5:c8:1d:a3:d5:d9:50:71:9b:96:88: ac:37:01:4d:33:93:6b:ab:4c:50:57:53:a3:77:21: e9:71:0d:10:60:2b:0f:3d:5a:90:b3:97:bb:cb:97: 47:a8:95 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 98:CB:19:A3:5A:20:67:94:72:76:5D:B9:9E:18:38:84:46:DD:C2:68 X509v3 Authority Key Identifier: 98:CB:19:A3:5A:20:67:94:72:76:5D:B9:9E:18:38:84:46:DD:C2:68 X509v3 Basic Constraints: CA:TRUE Signature Algorithm: sha256WithRSAEncryption Signature Value: 00:ac:9f:a6:a7:4c:bd:6c:3b:5c:df:5a:22:bc:f6:18:eb:d6: 7f:b5:1b:3f:f5:ee:11:42:e4:56:c2:f9:b7:56:fe:2b:82:c0: 7f:3e:fd:e3:ff:62:a4:ec:6c:97:7b:06:0e:ed:78:54:06:06: 30:f1:c5:06:2e:21:e8:69:bc:09:0a:b2:31:2a:d7:15:c2:de: 9f:c3:ea:03:c9:8d:e7:52:87:86:a3:79:a9:95:bc:0e:32:31: 14:49:7d:23:f8:4c:9e:1e:01:f1:37:74:ec:18:bc:44:91:74: 17:45:db:1a:64:fc:4f:ad:b2:93:b4:0e:8e:92:a1:fe:e3:84: 76:32:79:1b:a5:b4:cf:b9:3e:59:8a:6d:7b:83:c0:20:5b:11: b6:4d:7e:c6:33:4f:7c:92:ce:04:a2:7d:3e:d4:39:ce:8d:9d: ce:e6:c8:9e:30:a5:92:4a:e0:9c:66:98:ae:9c:b2:75:8e:d5: 63:cc:b3:d6:57:3c:c8:64:59:ce:95:35:6d:27:a2:43:75:b2: dd:f0:63:56:2c:2d:7b:42:43:b9:df:46:f9:61:37:20:f2:5b: 07:e6:fd:a8:dc:9a:bf:f5:35:fa:25:55:7a:72:8f:af:5e:9f: fa:b7:8d:5e:1e:46:85:88:1c:bd:f7:c8:2c:97:89:13:32:22: 15:b0:78:96:bb:ab:ef:df:63:bd:af:c2:ff:da:7e:3d:79:b9: 89:91:f1:94:e5:a2:b8:7a:14:74:c0:16:ff:f6:d9:c7:80:d3: 97:fd:a5:d3:1f:c7:00:b3:71:34:e5:14:0b:a0:bc:09:0f:b8: 72:48:b5:fa:8d:99:6d:c5:11:5e:30:7d:07:23:32:86:33:f4: 40:79:91:cb:6f:06:63:a4:e7:af:70:cf:3f:5f:e8:17:94:e9: b4:22:93:2f:aa:f6:06:f2:05:cf:eb:b2:3c:91:9d:ac:dc:49: 43:f0:05:1e:04:de:ad:c1:43:e7:97:bd:b3:c2:ad:19:fc:cf: b1:7a:7a:da:29:70:ff:e0:3f:73:ea:fe:15:e2:87:e4:e8:c4: 13:1d:d6:35:e6:ac:c3:d0:ac:41:a5:3b:33:63:ce:dd:05:12: f9:8b:4b:06:e4:1d:a9:e1:82:1f:1e:fb:72:05:4c:31:11:a2: 11:02:f3:56:0a:7d:19:68:27:77:84:5b:8a:47:d1:f9:18:5c: f5:6f:b6:f6:3c:e1:79:29:8f:3b:f3:83:69:46:ee:a4:00:95: 8c:8e:69:b0:51:12:e8:4d:ef:e2:d5:ac:02:f1:84:8f:f0:ac: 0e:f0:56:ad:fd:61:4f:d1:bd:83:9a:ea:92:36:45:fd:e5:4d: a9:59:41:e6:ac:4e:7e:44 -----BEGIN CERTIFICATE----- MIIF+TCCA+GgAwIBAgIJAJhJUpo/jXoHMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp dHkxDjAMBgNVBAoMBTEwR2VuMQ8wDQYDVQQLDAZLZXJuZWwxGjAYBgNVBAMMEU15 IENlcnQgQXV0aG9yaXR5MRswGQYJKoZIhvcNAQkBFgxyb290QGxhemFydXMwHhcN MjMxMTEzMTYyODEyWhcNNDMxMTA4MTYyODEyWjCBkjELMAkGA1UEBhMCVVMxETAP BgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQK DAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1dGhv cml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA5DtnLB+NOzn4qgb2B+V2D2wOqa5J+KrF1uq5tJJ5 W9SY5HYab2r0u+hyW7mDkTI3rv1wQ7l+j+TDvFoaSmui5ylBWCJS0GcYVDJ1Ti1U hxO5rG5XGtlMqtCyojVDudX5L9J89HxwRi5FhonHxeJ73fAtdJLHoYdmzD8v9dYY c87LgOIzP8owd7f7SfkzQszi/iH9Ohcf+QxHtv8bC8PSFSqMhidV4+YN/SvDrdoK 1mkTNz8b9tHBLRPB7t4HCqWA7sV6fezc46KiFEFg7b5MLi6Kv3A2x7PQSekEq0XL fXisTwsyRcBg4x1yaRyjof3XN0lH3c3om3UsDI5FnY+yzRXSQFWU/xKnr3Bqo4DK nG+hMjF4DMWmiIBE09Q5mTG2crWdlby4svO0OrcNC/vYjUkFZHtpK9ymV8x8MLlE jO2vpZCe8dbXdT2m3GsCcdbE2ZrblBhVaotPQ9AUWGNr3+MN/5TwmFnQJFra6FSd FgQmJvmad3VtmUqhBk57eC63RPCywTHfiWVazbF+wcbsiJIPHjGfo1JNb5VvX8xY BLCdi6VIfDllmSdXdHU9n6Yei2cOpxu/OyfFiSGaxI/4mTtZ5Y2K9t7qV45od6ln jOFEueanxcgdo9XZUHGbloisNwFNM5Nrq0xQV1OjdyHpcQ0QYCsPPVqQs5e7y5dH qJUCAwEAAaNQME4wHQYDVR0OBBYEFJjLGaNaIGeUcnZduZ4YOIRG3cJoMB8GA1Ud IwQYMBaAFJjLGaNaIGeUcnZduZ4YOIRG3cJoMAwGA1UdEwQFMAMBAf8wDQYJKoZI hvcNAQELBQADggIBAACsn6anTL1sO1zfWiK89hjr1n+1Gz/17hFC5FbC+bdW/iuC wH8+/eP/YqTsbJd7Bg7teFQGBjDxxQYuIehpvAkKsjEq1xXC3p/D6gPJjedSh4aj eamVvA4yMRRJfSP4TJ4eAfE3dOwYvESRdBdF2xpk/E+tspO0Do6Sof7jhHYyeRul tM+5PlmKbXuDwCBbEbZNfsYzT3ySzgSifT7UOc6Nnc7myJ4wpZJK4JxmmK6csnWO 1WPMs9ZXPMhkWc6VNW0nokN1st3wY1YsLXtCQ7nfRvlhNyDyWwfm/ajcmr/1Nfol VXpyj69en/q3jV4eRoWIHL33yCyXiRMyIhWweJa7q+/fY72vwv/afj15uYmR8ZTl orh6FHTAFv/22ceA05f9pdMfxwCzcTTlFAugvAkPuHJItfqNmW3FEV4wfQcjMoYz 9EB5kctvBmOk569wzz9f6BeU6bQiky+q9gbyBc/rsjyRnazcSUPwBR4E3q3BQ+eX vbPCrRn8z7F6etopcP/gP3Pq/hXih+ToxBMd1jXmrMPQrEGlOzNjzt0FEvmLSwbk Hanhgh8e+3IFTDERohEC81YKfRloJ3eEW4pH0fkYXPVvtvY84Xkpjzvzg2lG7qQA lYyOabBREuhN7+LVrALxhI/wrA7wVq39YU/RvYOa6pI2Rf3lTalZQeasTn5E -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/ldaptest-client-key-and-cert.pem000066400000000000000000000235261511661753600275500ustar00rootroot00000000000000Certificate: Data: Version: 1 (0x0) Serial Number: c7:5f:88:65:ae:bd:c0:d9 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = New York, L = New York City, O = 10Gen, OU = Kernel, CN = My Cert Authority, emailAddress = root@lazarus Validity Not Before: Nov 13 22:13:47 2023 GMT Not After : Feb 10 22:13:47 2026 GMT Subject: C = US, ST = New York, L = New York City, O = 10Gen, OU = kerneluser, CN = client Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:c0:77:d9:7a:d5:c9:18:bc:d1:ee:9d:b7:21:16: 7d:f8:06:ca:2d:f2:33:6c:ec:5f:be:6b:07:2b:f8: 9e:25:22:57:67:66:3c:8d:87:ad:41:65:d6:79:f4: cd:32:0d:51:88:9a:4f:e6:97:7c:ba:02:af:37:d0: d1:35:ba:05:6d:d2:28:ae:42:6b:50:37:93:17:5b: 03:c0:e5:c4:55:e9:57:a9:2e:ce:67:91:01:09:92: f5:c7:e4:18:33:a2:c2:a9:8a:0c:b7:06:9e:2c:c2: aa:07:1e:1a:48:f9:5e:cb:b0:fb:4d:f1:d0:d8:06: 34:4b:fe:97:60:6f:89:ca:b7:9b:0a:10:12:d4:33: e8:90:00:5f:98:2a:03:cc:76:81:19:17:fb:1c:dd: 9a:c4:7f:a7:9e:c6:48:2e:89:2a:ba:88:bc:23:d6: 49:fa:0c:24:96:90:f7:68:2f:02:79:fb:bf:7a:d7: 6d:13:65:a0:1a:48:86:46:39:2b:4f:ce:74:8e:ab: e5:11:a3:47:15:92:2a:6a:b6:fd:9f:fc:0e:f2:01: a9:97:02:fc:a3:54:09:68:33:77:59:b6:ba:8e:ed: 52:f2:2d:63:5a:cd:bc:e2:fe:f8:68:26:f0:e3:71: 33:66:8a:ff:3b:1a:4a:3c:48:16:0f:28:1d:27:28: 9a:3f:5c:de:26:15:dc:d1:72:63:b1:10:ca:5f:70: d1:36:40:d9:d3:d1:c1:a4:a8:66:69:b1:67:54:ee: ba:e4:69:3e:c2:e1:ad:dd:91:4e:88:7e:f7:61:6b: 3a:8d:ca:dd:4c:38:e7:9c:32:5c:e7:70:fa:9f:ce: 91:da:d2:ec:e6:f8:d5:c3:c4:b9:d6:37:ac:47:56: ec:cf:1e:d4:f0:a2:93:de:a6:7b:6b:79:d5:2e:f7: c9:62:dd:35:1e:63:dd:f8:5c:06:c2:22:1a:b1:65: 2d:52:13:c2:13:43:5b:4b:25:16:30:ac:e0:3e:6a: f9:e3:9f:d8:5b:7d:f9:c6:29:cd:bd:45:6d:60:75: 95:30:d0:e8:72:08:d6:d4:8b:0d:ec:cb:40:4f:55: ab:0f:6d:4f:d0:0d:52:3d:24:aa:3d:19:a7:74:5b: c6:e3:62:5e:45:f9:a1:0f:a4:47:38:b9:40:6b:d3: 5b:2d:64:87:ea:c1:cd:25:5c:08:32:32:97:41:ea: 14:8f:4b:08:0c:88:ef:03:4c:b7:2c:41:62:05:ca: e9:32:9d:dc:96:20:4e:85:0e:c4:6e:9e:22:fe:b2: 55:19:22:cd:27:50:33:20:75:37:58:68:f3:46:90: c7:47:d0:51:4e:d8:fb:55:ba:37:ac:02:c0:94:fd: 77:49:07 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption Signature Value: 52:36:c6:7e:34:df:3b:63:34:93:fe:31:e4:02:73:48:a4:fc: 04:5c:ea:2b:79:b1:3e:ba:3a:c6:8d:38:4c:42:ab:89:ad:66: ce:93:a9:a2:ee:38:e8:fc:46:79:28:d1:eb:9d:7c:36:24:aa: 55:cd:62:0b:5e:5c:a6:d3:b5:64:1a:8f:b4:74:87:a0:2b:07: 90:11:fb:b8:97:58:ff:b2:e2:02:01:9d:cf:b8:5a:78:7e:cf: c6:5a:64:ab:29:01:34:55:c7:bf:00:ff:f9:ec:27:ba:11:85: d2:80:93:c9:b1:89:09:13:44:13:bd:df:01:f7:fa:f0:1b:4c: b0:b1:ac:bc:e5:48:d1:7a:48:c5:f7:a8:36:d2:a8:c9:66:c6: 52:ae:0b:8c:bb:29:30:7d:dc:8b:02:78:3a:3e:78:ce:cd:cc: f5:f4:17:2d:d0:17:95:14:3a:d4:45:08:18:1a:a9:f1:af:f6: 6c:81:5d:d5:a9:f7:53:9b:98:0e:f7:64:09:7c:32:7d:36:52: 44:ba:20:bc:5b:9b:18:50:20:0c:21:d2:83:51:36:85:41:ef: 66:a4:18:12:3a:95:06:92:3c:e9:f7:e8:74:62:18:78:0b:33: f3:db:55:94:bf:fd:87:2c:46:c0:f5:47:e0:5b:02:aa:38:1b: 75:17:01:fb:12:e0:26:f2:fd:c5:16:9f:c9:ad:d1:24:d8:3b: c0:89:7f:46:2f:a6:a4:40:e0:62:aa:44:88:a8:bc:2f:70:44: 3e:52:b3:6b:58:42:7c:fe:4f:1f:16:77:68:c2:11:e3:6e:ac: 19:42:25:fe:f3:c2:9d:04:ca:d7:49:30:72:29:14:80:a8:f5: 64:9b:41:74:dc:e7:6f:d6:ae:d7:c4:02:c8:93:fe:0b:cf:d0: a6:e1:db:98:97:6b:ac:e3:d3:f7:51:da:9b:8e:23:95:29:59: 45:df:72:e4:1b:1e:19:ac:4f:59:37:ea:f2:62:28:89:d9:c4: a0:a3:f8:8f:b0:26:03:2d:e6:c9:ba:e2:ae:88:49:da:1f:6c: a6:55:fd:a0:35:79:01:de:a7:be:01:2b:bb:89:65:b6:f1:1f: ae:24:34:11:ea:9c:43:0d:90:c4:39:4a:6f:58:a4:37:5e:82: da:86:24:ce:31:50:b1:9e:fd:d1:6e:91:55:10:2c:e0:99:3b: 61:3d:f3:4a:8a:52:57:e7:52:4b:ee:c5:60:08:58:29:fe:37: 49:3f:5a:a1:62:8b:8a:83:0d:d9:d7:9d:82:61:9a:3c:dd:41: 83:ca:75:9b:4c:2d:52:cb:ca:23:b2:4c:eb:77:12:55:6c:db: a7:29:d3:8a:6d:97:a9:7d -----BEGIN CERTIFICATE----- MIIFfTCCA2UCCQDHX4hlrr3A2TANBgkqhkiG9w0BAQsFADCBkjELMAkGA1UEBhMC VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4w DAYDVQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0 IEF1dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTIzMTEx MzIyMTM0N1oXDTI2MDIxMDIyMTM0N1owbjELMAkGA1UEBhMCVVMxETAPBgNVBAgM CE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUxMEdl bjETMBEGA1UECwwKa2VybmVsdXNlcjEPMA0GA1UEAwwGY2xpZW50MIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwHfZetXJGLzR7p23IRZ9+AbKLfIzbOxf vmsHK/ieJSJXZ2Y8jYetQWXWefTNMg1RiJpP5pd8ugKvN9DRNboFbdIorkJrUDeT F1sDwOXEVelXqS7OZ5EBCZL1x+QYM6LCqYoMtwaeLMKqBx4aSPley7D7TfHQ2AY0 S/6XYG+JyrebChAS1DPokABfmCoDzHaBGRf7HN2axH+nnsZILokquoi8I9ZJ+gwk lpD3aC8Cefu/etdtE2WgGkiGRjkrT850jqvlEaNHFZIqarb9n/wO8gGplwL8o1QJ aDN3Wba6ju1S8i1jWs284v74aCbw43EzZor/OxpKPEgWDygdJyiaP1zeJhXc0XJj sRDKX3DRNkDZ09HBpKhmabFnVO665Gk+wuGt3ZFOiH73YWs6jcrdTDjnnDJc53D6 n86R2tLs5vjVw8S51jesR1bszx7U8KKT3qZ7a3nVLvfJYt01HmPd+FwGwiIasWUt UhPCE0NbSyUWMKzgPmr545/YW335xinNvUVtYHWVMNDocgjW1IsN7MtAT1WrD21P 0A1SPSSqPRmndFvG42JeRfmhD6RHOLlAa9NbLWSH6sHNJVwIMjKXQeoUj0sIDIjv A0y3LEFiBcrpMp3cliBOhQ7Ebp4i/rJVGSLNJ1AzIHU3WGjzRpDHR9BRTtj7Vbo3 rALAlP13SQcCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAUjbGfjTfO2M0k/4x5AJz SKT8BFzqK3mxPro6xo04TEKria1mzpOpou446PxGeSjR6518NiSqVc1iC15cptO1 ZBqPtHSHoCsHkBH7uJdY/7LiAgGdz7haeH7PxlpkqykBNFXHvwD/+ewnuhGF0oCT ybGJCRNEE73fAff68BtMsLGsvOVI0XpIxfeoNtKoyWbGUq4LjLspMH3ciwJ4Oj54 zs3M9fQXLdAXlRQ61EUIGBqp8a/2bIFd1an3U5uYDvdkCXwyfTZSRLogvFubGFAg DCHSg1E2hUHvZqQYEjqVBpI86ffodGIYeAsz89tVlL/9hyxGwPVH4FsCqjgbdRcB +xLgJvL9xRafya3RJNg7wIl/Ri+mpEDgYqpEiKi8L3BEPlKza1hCfP5PHxZ3aMIR 426sGUIl/vPCnQTK10kwcikUgKj1ZJtBdNznb9au18QCyJP+C8/QpuHbmJdrrOPT 91Ham44jlSlZRd9y5BseGaxPWTfq8mIoidnEoKP4j7AmAy3mybrirohJ2h9splX9 oDV5Ad6nvgEru4lltvEfriQ0EeqcQw2QxDlKb1ikN16C2oYkzjFQsZ790W6RVRAs 4Jk7YT3zSopSV+dSS+7FYAhYKf43ST9aoWKLioMN2dedgmGaPN1Bg8p1m0wtUsvK I7JM63cSVWzbpynTim2XqX0= -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDAd9l61ckYvNHu nbchFn34Bsot8jNs7F++awcr+J4lIldnZjyNh61BZdZ59M0yDVGImk/ml3y6Aq83 0NE1ugVt0iiuQmtQN5MXWwPA5cRV6VepLs5nkQEJkvXH5BgzosKpigy3Bp4swqoH HhpI+V7LsPtN8dDYBjRL/pdgb4nKt5sKEBLUM+iQAF+YKgPMdoEZF/sc3ZrEf6ee xkguiSq6iLwj1kn6DCSWkPdoLwJ5+796120TZaAaSIZGOStPznSOq+URo0cVkipq tv2f/A7yAamXAvyjVAloM3dZtrqO7VLyLWNazbzi/vhoJvDjcTNmiv87Gko8SBYP KB0nKJo/XN4mFdzRcmOxEMpfcNE2QNnT0cGkqGZpsWdU7rrkaT7C4a3dkU6Ifvdh azqNyt1MOOecMlzncPqfzpHa0uzm+NXDxLnWN6xHVuzPHtTwopPepntredUu98li 3TUeY934XAbCIhqxZS1SE8ITQ1tLJRYwrOA+avnjn9hbffnGKc29RW1gdZUw0Ohy CNbUiw3sy0BPVasPbU/QDVI9JKo9Gad0W8bjYl5F+aEPpEc4uUBr01stZIfqwc0l XAgyMpdB6hSPSwgMiO8DTLcsQWIFyukyndyWIE6FDsRuniL+slUZIs0nUDMgdTdY aPNGkMdH0FFO2PtVujesAsCU/XdJBwIDAQABAoICABSpyVOCuEBLpU406IBI5eVG 9VXRduvuxKiw3Og/nNrnwPJ862tWcadfw5L8UTtaarJ7vrBG+0ENILqhVJSsEAEm Wu+6ecL29HfBcbm38Ug38Q1c1RQRYUch2/lF58NDahrBk3Pi5gBwNcjl1nSXMTI1 IgXQPFe08tBl2OKllumIpMCD0UGvAPzUzW6MtDOzVVDYXkFPGVqXSeul5gH4//le zLQcQXzy6MqxbZ5lzaJDAN+zWSaH9pRbzO6lHJ1I0QKwObuXB/6s3pjuZHRUn1Yk D40C6RSv5QKm491h3M2TdSBC9zO8etb0AL9NzvbcJGSR76zsuaOXKace62JU3ZpX 1DSwqpwhqTHtr6Evf11TxXFukw1F3ixtPGvSkj71xLtU63IPB+Ye8GCPS+gfX6HV cdbrAPBKUSJeVvD26+jocArNtGh5rt8LbUbhwmW/BgNOR6Pz4XVydWb+ZRQZxpAU KoIMqSpOj0NV0x3CWUcs2UjLZlMPgA0PXcXy/KbSppU1HpbfwWoHKnsJx8wGNU7p gFHrt8BG9l9Co6gueJqkPchYPomOrjl5342rDqN8YBMojR4ZJA7D3grxru7zDl7A Ng4vtnlOL5Y46C6Hc7V072ABxxV9jow8XQrGaUjEsZuZDI2B9a73rJUg3wWFS1bR F/wPzvwZ0L/SlWvrf6DhAoIBAQD8UW59R/jjXsYyE8fimeS5YngeijMdWvwbhbDU pWMBSwGwaQRD5EzUNlv1+QdMMPh2Cin656uAetaRcCkDB7D/Sth2SvgyOBjyqOCu ZrvkgYxqzEcx+S1mnEivgJTWP8xuynibMNYEAOzOfOMbmAsLfxcAsu7TJfLmBsiw iLSIwM/OwXzljcUH5IYygZ36O304aoJ9EHU8fSrVSrJpwpuSLvI854JOOtQrDIaL PKWXkwmXbjpk0lasHUykWUyRusm4p3tVVipCDenUCWIdkpWm0J/Xqs+RcEUF5vhL vB5zkthjSMXAYyh5K9hQiAnlXKs5OBuqSDELjUG17qQ/TlDrAoIBAQDDRtclV2Zy l1fFxQqPzAcLqKbL8LfN3cqa8cHUAV2adv09P1sIEWnYN1yATMC8Y85DrWfaUb+t gA1ejrove0QUSXR8A9Ft0+sR4SxT29BFI44vD407ADJTOBw5MzWescBrwj8UHPpj lyamZmK/vRUWzu1CQgiBKApcklzH0Q6+Zdsi/rMor+NlTcYiMzzAN/rlYfk7zKrU Ki2M6sS41rVKnuimjdAUSrvhwPDqmpBm+A+xErFHhrgI/uqg6TwBTew85OnVzFWp 9Ss1f6zBMz5YBcPHPwvPfD0EmRdOUxzcuc0YShK8Fcr20muq0usC/6NE6du42WxB 6x6lHayZEIFVAoIBAGvJ6daRUYzoZujrtF9keOaNX11EkrN+s+aaBUHCaXoa7dzL 8CuEsyGRG1YIDYsJ/IqIqwhpwcVANLuq24pU1dMpyTE3s7HYbyfy5xD6CFiE01So cd2yYifMqex3lJ22YYIO8tjxUuwg7QkFJwwZttYxc8Uzq3z+YDbOPRvVOrKVE/Fy jQWPu9U0VfPrlW5ZzZO1RIti5YJywkKeB3vQzB71+Tv1dqAu14aQckW3IdKP2PAd AcsiZC5g0eX/1AsJbbV5ruF0ztarFPIlFAooHdBGnZJHgSbTfFkaI4ZPFf8vg0te wkP+2EJzbZRxmTCnlun5wy/KaVFTBfhPu1DkBwMCggEBAIIBNJTgpgzeIwpAjzKC o6IoartVjBjbctpK3z70lcuTMi9HcaRia3QOD2A/OQVy8MxvsrdPO2wX106/eMbJ qt5StOEnbZNPxa0GmwtNSU/uRuef0+eWzupGbcvLAwSe1Dspe/M5A52v8IRRn6aF DHg91QkKizzpWlSdAHXrAYTSrNyUctRAnQRBjgoQ0H4sBrYVzub38DcFyYOKfOON 1e5S8xKHUSNhScoXOI0Hz+EtfszlY+75iqY6iBwOiutXZFJ6GA9FVTasSVL5qBqL shLJ67hHieZdkQXxoel8PbfZXuivz982JwTBu/pjJyC87oafpq9e2Mrd7G4C3nic 220CggEAVWGiqv7uszFgIigB828FPqDC1bwMKDWXk6TBOK0gC+8azx1uAC4l0XAe 13mTW6CT6zwqYwIxqchMgQOQa1B6havpjxd4BdXr4Z69akjpCQOUUGM+buK2OStN l/whybmGZiePHr+TtLqbBtmmFgssBSjyYOZATsug9+lCKTOPH28gVjZILTsqkloD 3cK9q7hTJPjiMoCekws4daSt9EXBKN5pFNw9rc7x4uL9l9RXtR+K1dmzKXwwQ6o2 Jj5Q4X6RwoYVpDU9nJVFf/NZCGs4g/ntsJy/ko0j6lTmPFDNZ1C5Nd/JrbyJiCXz TPIbwOq4Rz45eHdV/YplUdifaDeNlg== -----END PRIVATE KEY----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/password_protected.pem000066400000000000000000000060771511661753600261100ustar00rootroot00000000000000-----BEGIN ENCRYPTED PRIVATE KEY----- MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIC8as6PDVhwECAggA MB0GCWCGSAFlAwQBAgQQTYOgCJcRqUI7dsgqNojv/ASCBNCG9fiu642V4AuFK34c Q42lvy/cR0CIXLq/rDXN1L685kdeKex7AfDuRtnjY2+7CLJiJimgQNJXDJPHab/k MBHbwbBs38fg6eSYX8V08/IyyTege5EJMhYxmieHDC3DXKt0gyHk6hA/r5+Mr49h HeVGwqBLJEQ3gVIeHaOleZYspsXXWqOPHnFiqnk/biaJS0+LkDDEiQgTLEYSnOjP lexxUc4BV/TN0Z920tZCMfwx7IXD/C+0AkV/Iqq4LALmT702EccB3indaIJ8biGR radqDLR32Q+vT9uZHgT8EFiUsISMqhob2mnyTfFV/s9ghWwogjSz0HrRcq6fxdg7 oeyT9K0ET53AGTGmV0206byPu6qCj1eNvtn+t1Ob+d5hecaTugRMVheWPlc5frsz AcewDNa0pv4pZItjAGMqOPJHfzEDnzTJXpLqGYhg044H1+OCY8+1YK7U0u8dO+/3 f5AoDMq18ipDVTFTooJURej4/Wjbrfad3ZFjp86nxfHPeWM1YjC9+IlLtK1wr0/U V8TjGqCkw8yHayz01A86iA8X53YQBg+tyMGjxmivo6LgFGKa9mXGvDkN+B+0+OcA PqldAuH/TJhnkqzja767e4n9kcr+TmV19Hn1hcJPTDrRU8+sSqQFsWN4pvHazAYB UdWie+EXI0eU2Av9JFgrVcpRipXjB48BaPwuBw8hm+VStCH7ynF4lJy6/3esjYwk Mx+NUf8+pp1DRzpzuJa2vAutzqia5r58+zloQMxkgTZtJkQU6OCRoUhHGVk7WNb1 nxsibOSzyVSP9ZNbHIHAn43vICFGrPubRs200Kc4CdXsOSEWoP0XYebhiNJgGtQs KoISsV4dFRLwhaJhIlayTBQz6w6Ph87WbtuiAqoLiuqdXhUGz/79j/6JZqCH8t/H eZs4Dhu+HdD/wZKJDYAS+JBsiwYWnI3y/EowZYgLdOMI4u6xYDejhxwEw20LW445 qjJ7pV/iX2uavazHgC91Bfd4zodfXIQ1IDyTmb51UFwx0ARzG6enntduO6xtcYU9 MXwfrEpuZ/MkWTLkR0PHPbIPcR1MiVwPKdvrLk42Bzj/urtXYrAFUckMFMzEh+uv 0lix2hbq/Xwj4dXcY4w9hnC6QQDCJTf9S6MU6OisrZHKk0qZ2Vb4aU/eBcBsHBwo X/QGcDHneHxlrrs2eLX26Vh8Odc5h8haeIxnfaa1t+Yv56OKHuAztPMnJOUL7KtQ A556LxT0b5IGx0RcfUcbG8XbxEHseACptoDOoguh9923IBI0uXmpi8q0P815LPUu 0AsE47ATDMGPnXbopejRDicfgMGjykJn8vKO8r/Ia3Fpnomx4iJNCXGqomL+GMpZ IhQbKNrRG6XZMlx5kVCT0Qr1nOWMiOTSDCQ5vrG3c1Viu+0bctvidEvs+LCm98tb 7ty8F0uOno0rYGNQz18OEE1Tj+E19Vauz1U35Z5SsgJJ/GfzhSJ79Srmdg2PsAzk AUNTKXux1GLf1cMjTiiU5g+tCEtUL9Me7lsv3L6aFdrCyRbhXUQfJh4NAG8+3Pvh EaprThBzKsVvbOfU81mOaH9YMmUgmxG86vxDiNtaWd4v6c1k+HGspJr/q49pcXZP ltBMuS9AihstZ1sHJsyQCmNXkA== -----END ENCRYPTED PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDgzCCAmugAwIBAgIDBXUHMA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMzAwMDEyOVoXDTM5MDUyMzAwMDEyOVowaTEP MA0GA1UEAxMGY2xpZW50MRAwDgYDVQQLEwdEcml2ZXJzMQwwCgYDVQQKEwNNREIx FjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3JrMQswCQYD VQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOqCb0Lo4XsV W327Wlnqc5rwWa5Elw0rFuehSfViRIcYfuFWAPXoOj3fIDsYz6d41G8hp6tkF88p swlbzDF8Fc7mXDhauwwl2F/NrWYUXwCT8fKju4DtGd2JlDMi1TRDeofkYCGVPp70 vNqd0H8iDWWs8OmiNrdBLJwNiGaf9y15ena4ImQGitXLFn+qNSXYJ1Rs8p7Y2PTr L+dff5gJCVbANwGII1rjMAsrMACPVmr8c1Lxoq4fSdJiLweosrv2Lk0WWGsO0Seg ZY71dNHEyNjItE+VtFEtslJ5L261i3BfF/FqNnH2UmKXzShwfwxyHT8o84gSAltQ 5/lVJ4QQKosCAwEAAaMkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF BwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBOAlKxIMFcTZ+4k8NJv97RSf+zOb5Wu2ct uxSZxzgKTxLFUuEM8XQiEz1iHQ3XG+uV1fzA74YLQiKjjLrU0mx54eM1vaRtOXvF sJlzZU8Z2+523FVPx4HBPyObQrfXmIoAiHoQ4VUeepkPRpXxpifgWd/OCWhLDr2/ 0Kgcb0ybaGVDpA0UD9uVIwgFjRu6id7wG+lVcdRxJYskTOOaN2o1hMdAKkrpFQbd zNRfEoBPUYR3QAmAKP2HBjpgp4ktOHoOKMlfeAuuMCUocSnmPKc3xJaH/6O7rHcf /Rm0X411RH8JfoXYsSiPsd601kZefhuWvJH0sJLibRDvT7zs8C1v -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/server.pem000066400000000000000000000056411511661753600234770ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAhNrB0E6GY/kFSd8/vNpu/t952tbnOsD5drV0XPvmuy7SgKDY a/S+xb/jPnlZKKehdBnH7qP/gYbv34ZykzcDFZscjPLiGc2cRGP+NQCSFK0d2/7d y15zSD3zhj14G8+MkpAejTU+0/qFNZMc5neDvGanTe0+8aWa0DXssM0MuTxIv7j6 CtsMWeqLLofN7a1Kw2UvmieCHfHMuA/08pJwRnV/+5T9WONBPJja2ZQRrG1BjpI4 81zSPUZesIqi8yDlExdvgNaRZIEHi/njREqwVgJOZomUY57zmKypiMzbz48dDTsV gUStxrEqbaP+BEjQYPX5+QQk4GdMjkLf52LR6QIDAQABAoIBAHSs+hHLJNOf2zkp S3y8CUblVMsQeTpsR6otaehPgi9Zy50TpX4KD5D0GMrBH8BIl86y5Zd7h+VlcDzK gs0vPxI2izhuBovKuzaE6rf5rFFkSBjxGDCG3o/PeJOoYFdsS3RcBbjVzju0hFCs xnDQ/Wz0anJRrTnjyraY5SnQqx/xuhLXkj/lwWoWjP2bUqDprnuLOj16soNu60Um JziWbmWx9ty0wohkI/8DPBl9FjSniEEUi9pnZXPElFN6kwPkgdfT5rY/TkMH4lsu ozOUc5xgwlkT6kVjXHcs3fleuT/mOfVXLPgNms85JKLucfd6KiV7jYZkT/bXIjQ+ 7CZEn0ECgYEA5QiKZgsfJjWvZpt21V/i7dPje2xdwHtZ8F9NjX7ZUFA7mUPxUlwe GiXxmy6RGzNdnLOto4SF0/7ebuF3koO77oLup5a2etL+y/AnNAufbu4S5D72sbiz wdLzr3d5JQ12xeaEH6kQNk2SD5/ShctdS6GmTgQPiJIgH0MIdi9F3v0CgYEAlH84 hMWcC+5b4hHUEexeNkT8kCXwHVcUjGRaYFdSHgovvWllApZDHSWZ+vRcMBdlhNPu 09Btxo99cjOZwGYJyt20QQLGc/ZyiOF4ximQzabTeFgLkTH3Ox6Mh2Rx9yIruYoX nE3UfMDkYELanEJUv0zenKpZHw7tTt5yXXSlEF0CgYBSsEOvVcKYO/eoluZPYQAA F2jgzZ4HeUFebDoGpM52lZD+463Dq2hezmYtPaG77U6V3bUJ/TWH9VN/Or290vvN v83ECcC2FWlSXdD5lFyqYx/E8gqE3YdgqfW62uqM+xBvoKsA9zvYLydVpsEN9v8m 6CSvs/2btA4O21e5u5WBTQKBgGtAb6vFpe0gHRDs24SOeYUs0lWycPhf+qFjobrP lqnHpa9iPeheat7UV6BfeW3qmBIVl/s4IPE2ld4z0qqZiB0Tf6ssu/TpXNPsNXS6 dLFz+myC+ufFdNEoQUtQitd5wKbjTCZCOGRaVRgJcSdG6Tq55Fa22mOKPm+mTmed ZdKpAoGAFsTYBAHPxs8nzkCJCl7KLa4/zgbgywO6EcQgA7tfelB8bc8vcAMG5o+8 YqAfwxrzhVSVbJx0fibTARXROmbh2pn010l2wj3+qUajM8NiskCPFbSjGy7HSUze P8Kt1uMDJdj55gATzn44au31QBioZY2zXleorxF21cr+BZCJgfA= -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDlTCCAn2gAwIBAgICdxUwDQYJKoZIhvcNAQELBQAweTEbMBkGA1UEAxMSRHJp dmVycyBUZXN0aW5nIENBMRAwDgYDVQQLEwdEcml2ZXJzMRAwDgYDVQQKEwdNb25n b0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQIEwhOZXcgWW9yazEL MAkGA1UEBhMCVVMwHhcNMTkwNTIyMjIzMjU2WhcNMzkwNTIyMjIzMjU2WjBwMRIw EAYDVQQDEwlsb2NhbGhvc3QxEDAOBgNVBAsTB0RyaXZlcnMxEDAOBgNVBAoTB01v bmdvREIxFjAUBgNVBAcTDU5ldyBZb3JrIENpdHkxETAPBgNVBAgTCE5ldyBZb3Jr MQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAITa wdBOhmP5BUnfP7zabv7fedrW5zrA+Xa1dFz75rsu0oCg2Gv0vsW/4z55WSinoXQZ x+6j/4GG79+GcpM3AxWbHIzy4hnNnERj/jUAkhStHdv+3ctec0g984Y9eBvPjJKQ Ho01PtP6hTWTHOZ3g7xmp03tPvGlmtA17LDNDLk8SL+4+grbDFnqiy6Hze2tSsNl L5ongh3xzLgP9PKScEZ1f/uU/VjjQTyY2tmUEaxtQY6SOPNc0j1GXrCKovMg5RMX b4DWkWSBB4v540RKsFYCTmaJlGOe85isqYjM28+PHQ07FYFErcaxKm2j/gRI0GD1 +fkEJOBnTI5C3+di0ekCAwEAAaMwMC4wLAYDVR0RBCUwI4IJbG9jYWxob3N0hwR/ AAABhxAAAAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQBol8+YH7MA HwnIh7KcJ8h87GkCWsjOJCDJWiYBJArQ0MmgDO0qdx+QEtvLMn3XNtP05ZfK0WyX or4cWllAkMFYaFbyB2hYazlD1UAAG+22Rku0UP6pJMLbWe6pnqzx+RL68FYdbZhN fCW2xiiKsdPoo2VEY7eeZKrNr/0RFE5EKXgzmobpTBQT1Dl3Ve4aWLoTy9INlQ/g z40qS7oq1PjjPLgxINhf4ncJqfmRXugYTOnyFiVXLZTys5Pb9SMKdToGl3NTYWLL 2AZdjr6bKtT+WtXyHqO0cQ8CkAW0M6VOlMluACllcJxfrtdlQS2S4lUIj76QKBdZ khBHXq/b8MFX -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/libmongoc/tests/x509gen/wild.pem000066400000000000000000000056411511661753600231300ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAlenyliMpkLM9aR51iOO7hdLS66pwgafsJlIbtsKAy6WxlcKA yecs0yCQfw5z5j3BFgv88dzAFEF+jFG6o/EmAzqmK5uRCQX1EJbl2p8detbzToj9 Ys1Z1peWE8FkJtZMKUdLdlRQQ57v2VUr0kwtFEUGlSNyVwf4pJ5coyqpukmoUdko zrKeclshjydDVo44Ln6WYvN6odz/CZT808fHZ0CXcIEKyDV8zXIcHGX2OUL/ajtZ +C2pIbAx64nin1BLtHGvDT0Pan1xKDiMCkOdc7va0gLh0qtPjGLsI4vc8iByviGJ Kw7hVaj7ym0r2DFzeqghfvNNNHisGXSf+6EcPQIDAQABAoIBAGq/PVefDhfVKaNS ZwrkbkDqT/ozUQ1hzwuyZ72JXkCkaYFkEGS0Ufy8MWfnmKuXyYezXZezQqqpwDyW bboTGqgt+OkQSwQL0+bOLDmyF0HDEVkYvqS96HyfT+QdTv1AltbFx3woqUadQ9iT hzKlv2uxgvBrXx2NtYUypnAhDt5wQQ4n1w46Kl1USb983qWDWyFtHfIQo6vF1JK/ s6I6oA2tmORPTD3A7E2xT98UMM8B1c/v1F+owAiD+KNmgAN4oWSWBfRGEKg59fZA aGWjQrwoWmQQJnMnTsHZc+2hT7waKnyOwOFq1NPXyfCw+4cSeI3B3rPxPyShBM4O ZKfajIECgYEAz555nPHhk5GmMpXprryCODy66ChHWulA3fM9r0k/ObBgKqTirAOA y0PmA8OxR8acV0V2lZImdwF5Lvnj+c8+fTFSnPKSQHpcZ/lbxo+m2rYwv7+BxUP9 GJAWzA6xqBde6hNPULml8cNOqT7jwRnLt/DkwY+94Oeh3H5CRYb90Y0CgYEAuNkR EieGwCn+TjgatkhMLhYqr234544p3ofL82CFlCcsOXtWqCma6POOi038eBlZiHV9 EPBq4qQHCZMAPeApTZbiZ+Z8ezC3IxjGSX0jP5QK+gBrkk7nbp24nRMlHOrwizsL /Sxu4Y6puZk5aTUZVufPLXokY6Iez0Kd07vyUXECgYBqWHFQi7EQ5nzr0lAVOee1 qJ3QRrlt/qZESdCh1XH2Obq4fSbCFzVEaK4L5ZQMANaZ+TGpoWfkczPAdS1qCtam R7paPAHf1w04EMkKpxA/XS0ROqXdBltA1qVmtmwXfokWeveYkM9IS9Mh6927TlxE BrcV0mvfJKaLC30koeWnDQKBgEn1oBzxb7sHklbdn+J7Pu/Zsq6Kg+KyQRJmpzXz 0r6ahdlh/iQ+sVqvyML4KyIqkmZFDAtxBnM0ShSMmrYnMJ941ZHY6Mmpjj0etofE 6AuSQmoRLPlXVMYvmSRP+rN9VU2ADKX510usd0BpjE0KD99z1LNPgavTvBwVfWyw cJ4hAoGBALgyVPMBPv1d8irbM1WHFe/I3vxjb4DWOY9xclbRWjkW69oZmkouGP07 52ehzfBtBC87VPLwTEr/ERZqfICBqZvXYFypd2ydGhbDKjDswiUd6nACNKAx5ZPo OVwQjVfjGqkKNThoHhvE1YU//+WtCe0YVUGqMA9dyZe1QO3HcqI8 -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIDCRU4MA0GCSqGSIb3DQEBCwUAMHkxGzAZBgNVBAMTEkRy aXZlcnMgVGVzdGluZyBDQTEQMA4GA1UECxMHRHJpdmVyczEQMA4GA1UEChMHTW9u Z29EQjEWMBQGA1UEBxMNTmV3IFlvcmsgQ2l0eTERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMB4XDTE5MDUyMjIyMzgxOVoXDTM5MDUyMjIyMzgxOVowcDES MBAGA1UEAxMJbG9jYWxob3N0MRAwDgYDVQQLEwdEcml2ZXJzMRAwDgYDVQQKEwdN b25nb0RCMRYwFAYDVQQHEw1OZXcgWW9yayBDaXR5MREwDwYDVQQIEwhOZXcgWW9y azELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV 6fKWIymQsz1pHnWI47uF0tLrqnCBp+wmUhu2woDLpbGVwoDJ5yzTIJB/DnPmPcEW C/zx3MAUQX6MUbqj8SYDOqYrm5EJBfUQluXanx161vNOiP1izVnWl5YTwWQm1kwp R0t2VFBDnu/ZVSvSTC0URQaVI3JXB/iknlyjKqm6SahR2SjOsp5yWyGPJ0NWjjgu fpZi83qh3P8JlPzTx8dnQJdwgQrINXzNchwcZfY5Qv9qO1n4LakhsDHrieKfUEu0 ca8NPQ9qfXEoOIwKQ51zu9rSAuHSq0+MYuwji9zyIHK+IYkrDuFVqPvKbSvYMXN6 qCF+8000eKwZdJ/7oRw9AgMBAAGjLTArMCkGA1UdEQQiMCCCCWxvY2FsaG9zdIcE fwAAAYINKi5tb25nb2RiLm9yZzANBgkqhkiG9w0BAQsFAAOCAQEAMCENVK+w+wP7 T1XBytsScn7+Bh33sn+A+c7H/6BNOEdTxCQ67L3zBc0XrBFYtiHcAppNBKvvM8cV ERWjXlU2nZ+A0WKOZE2nXYQL5lBnnXoIMwcdtJuTJuWw8r3MlVXDcP6bK8tNSQMG WYK7PHQ3RNiWNABZejJV9GVP25nO6Wr2gt2xnEwYvUXTnCJtT+NsTE/fU4MlGuUL a93Cec86Ij0XTMTcnj4nfZhct30nuqiU4wWBPHCN7BXxRQzIHu68aVHBpwDEAf6j PAOKhucGY6DW+dyrW/1BjW6+ZOmJWxJ7GB+x0gjprQbGH67gIvRvTa9wW7NqWyS3 Go/qT7H6FQ== -----END CERTIFICATE----- mongo-c-driver-2.2.1/src/tools/000077500000000000000000000000001511661753600163065ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/tools/mongoc-stat.c000066400000000000000000000117771511661753600207220ustar00rootroot00000000000000/* * Copyright 2009-present MongoDB, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #if defined(BSON_OS_UNIX) && defined(MONGOC_ENABLE_SHM_COUNTERS) #include #include #include #include #include #include #include #pragma pack(1) typedef struct { uint32_t offset; uint32_t slot; char category[24]; char name[32]; char description[64]; } mongoc_counter_info_t; #pragma pack() BSON_STATIC_ASSERT2 (sizeof_counter_info_t, sizeof (mongoc_counter_info_t) == 128); #pragma pack(1) typedef struct { uint32_t size; uint32_t n_cpu; uint32_t n_counters; uint32_t infos_offset; uint32_t values_offset; uint8_t padding[44]; } mongoc_counters_t; #pragma pack() BSON_STATIC_ASSERT2 (sizeof_counters_t, sizeof (mongoc_counters_t) == 64); typedef struct { int64_t slots[8]; } mongoc_counter_slots_t; BSON_STATIC_ASSERT2 (sizeof_counter_slots, sizeof (mongoc_counter_slots_t) == 64); typedef struct { mongoc_counter_slots_t *cpus; } mongoc_counter_t; static void mongoc_counters_destroy (mongoc_counters_t *counters) { BSON_ASSERT (counters); munmap ((void *) counters, counters->size); } static mongoc_counters_t * mongoc_counters_new_from_pid (unsigned pid) { mongoc_counters_t *counters; int32_t len; size_t size; void *mem; char name[32]; int fd; snprintf (name, sizeof name, "/mongoc-%u", pid); name[sizeof name - 1] = '\0'; if (-1 == (fd = shm_open (name, O_RDONLY, 0))) { perror ("Failed to load shared memory segment"); return NULL; } if (4 != pread (fd, &len, 4, 0)) { perror ("Failed to load shared memory segment"); return NULL; } if (!len) { perror ("Shared memory area is not yet initialized by owning process."); return NULL; } BSON_ASSERT (mlib_in_range (size_t, len)); size = len; if (MAP_FAILED == (mem = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0))) { fprintf (stderr, "Failed to mmap shared memory segment of size: %zu", size); close (fd); return NULL; } close (fd); counters = (mongoc_counters_t *) mem; if (mlib_cmp (counters->size, !=, len)) { perror ("Corrupted shared memory segment."); mongoc_counters_destroy (counters); return NULL; } return counters; } static mongoc_counter_info_t * mongoc_counters_get_infos (mongoc_counters_t *counters, uint32_t *n_infos) { mongoc_counter_info_t *info; char *base = (char *) counters; BSON_ASSERT (counters); BSON_ASSERT (n_infos); info = (mongoc_counter_info_t *) (base + counters->infos_offset); *n_infos = counters->n_counters; return info; } static int64_t mongoc_counters_get_value (mongoc_counters_t *counters, mongoc_counter_info_t *info, mongoc_counter_t *counter) { int64_t value = 0; unsigned i; for (i = 0; i < counters->n_cpu; i++) { value += counter->cpus[i].slots[info->slot]; } return value; } static void mongoc_counters_print_info (mongoc_counters_t *counters, mongoc_counter_info_t *info, FILE *file) { mongoc_counter_t ctr; int64_t value; BSON_ASSERT (info); BSON_ASSERT (file); BSON_ASSERT ((info->offset & 0x7) == 0); #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wcast-align" #endif ctr.cpus = (mongoc_counter_slots_t *) (((char *) counters) + info->offset); #ifdef __clang__ #pragma clang diagnostic pop #endif value = mongoc_counters_get_value (counters, info, &ctr); fprintf (file, "%24s : %-24s : %-50s : %lld\n", info->category, info->name, info->description, (long long) value); } int main (int argc, char *argv[]) { mongoc_counter_info_t *infos; mongoc_counters_t *counters; uint32_t n_counters = 0; unsigned i; int pid; if (argc != 2) { fprintf (stderr, "usage: %s PID\n", argv[0]); return 1; } pid = (int) strtol (argv[1], NULL, 10); if (!(counters = mongoc_counters_new_from_pid (pid))) { fprintf (stderr, "Failed to load shared memory for pid %d.\n", pid); return EXIT_FAILURE; } infos = mongoc_counters_get_infos (counters, &n_counters); for (i = 0; i < n_counters; i++) { mongoc_counters_print_info (counters, &infos[i], stdout); } mongoc_counters_destroy (counters); return EXIT_SUCCESS; } #else #include int main (void) { fprintf (stderr, "mongoc-stat is not supported on your platform.\n"); return EXIT_FAILURE; } #endif mongo-c-driver-2.2.1/src/uthash/000077500000000000000000000000001511661753600164425ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/uthash/uthash-2.3.0/000077500000000000000000000000001511661753600203745ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/uthash/uthash-2.3.0/uthash.h000066400000000000000000002200721511661753600220440ustar00rootroot00000000000000/* Copyright (c) 2003-2021, Troy D. Hanson http://troydhanson.github.com/uthash/ 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. 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 UTHASH_H #define UTHASH_H #define UTHASH_VERSION 2.3.0 #include /* memcmp, memset, strlen */ #include /* ptrdiff_t */ #include /* exit */ #if defined(HASH_DEFINE_OWN_STDINT) && HASH_DEFINE_OWN_STDINT /* This codepath is provided for backward compatibility, but I plan to remove it. */ #warning "HASH_DEFINE_OWN_STDINT is deprecated; please use HASH_NO_STDINT instead" typedef unsigned int uint32_t; typedef unsigned char uint8_t; #elif defined(HASH_NO_STDINT) && HASH_NO_STDINT #else #include /* uint8_t, uint32_t */ #endif /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #if !defined(DECLTYPE) && !defined(NO_DECLTYPE) #if defined(_MSC_VER) /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #endif #elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__) #define NO_DECLTYPE #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #endif #ifdef NO_DECLTYPE #define DECLTYPE(x) #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while (0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while (0) #endif #ifndef uthash_malloc #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #endif #ifndef uthash_free #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #endif #ifndef uthash_bzero #define uthash_bzero(a,n) memset(a,'\0',n) #endif #ifndef uthash_strlen #define uthash_strlen(s) strlen(s) #endif #ifndef HASH_FUNCTION #define HASH_FUNCTION(keyptr,keylen,hashv) HASH_JEN(keyptr, keylen, hashv) #endif #ifndef HASH_KEYCMP #define HASH_KEYCMP(a,b,n) memcmp(a,b,n) #endif #ifndef uthash_noexpand_fyi #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #endif #ifndef uthash_expand_fyi #define uthash_expand_fyi(tbl) /* can be defined to log expands */ #endif #ifndef HASH_NONFATAL_OOM #define HASH_NONFATAL_OOM 0 #endif #if HASH_NONFATAL_OOM /* malloc failures can be recovered from */ #ifndef uthash_nonfatal_oom #define uthash_nonfatal_oom(obj) do {} while (0) /* non-fatal OOM error */ #endif #define HASH_RECORD_OOM(oomed) do { (oomed) = 1; } while (0) #define IF_HASH_NONFATAL_OOM(x) x #else /* malloc failures result in lost memory, hash tables are unusable */ #ifndef uthash_fatal #define uthash_fatal(msg) exit(-1) /* fatal OOM error */ #endif #define HASH_RECORD_OOM(oomed) uthash_fatal("out of memory") #define IF_HASH_NONFATAL_OOM(x) #endif /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhp */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) /* calculate the hash handle from element address elp */ #define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle*)(void*)(((char*)(elp)) + ((tbl)->hho))) #define HASH_ROLLBACK_BKT(hh, head, itemptrhh) \ do { \ struct UT_hash_handle *_hd_hh_item = (itemptrhh); \ unsigned _hd_bkt; \ HASH_TO_BKT(_hd_hh_item->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ (head)->hh.tbl->buckets[_hd_bkt].count++; \ _hd_hh_item->hh_next = NULL; \ _hd_hh_item->hh_prev = NULL; \ } while (0) #define HASH_VALUE(keyptr,keylen,hashv) \ do { \ HASH_FUNCTION(keyptr, keylen, hashv); \ } while (0) #define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \ do { \ (out) = NULL; \ if (head) { \ unsigned _hf_bkt; \ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \ if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) { \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \ } \ } \ } while (0) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ (out) = NULL; \ if (head) { \ unsigned _hf_hashv; \ HASH_VALUE(keyptr, keylen, _hf_hashv); \ HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \ } \ } while (0) #ifdef HASH_BLOOM #define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM) #define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL) #define HASH_BLOOM_MAKE(tbl,oomed) \ do { \ (tbl)->bloom_nbits = HASH_BLOOM; \ (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \ if (!(tbl)->bloom_bv) { \ HASH_RECORD_OOM(oomed); \ } else { \ uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \ } \ } while (0) #define HASH_BLOOM_FREE(tbl) \ do { \ uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \ } while (0) #define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U))) #define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U))) #define HASH_BLOOM_ADD(tbl,hashv) \ HASH_BLOOM_BITSET((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) #define HASH_BLOOM_TEST(tbl,hashv) \ HASH_BLOOM_BITTEST((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U))) #else #define HASH_BLOOM_MAKE(tbl,oomed) #define HASH_BLOOM_FREE(tbl) #define HASH_BLOOM_ADD(tbl,hashv) #define HASH_BLOOM_TEST(tbl,hashv) (1) #define HASH_BLOOM_BYTELEN 0U #endif #define HASH_MAKE_TABLE(hh,head,oomed) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table)); \ if (!(head)->hh.tbl) { \ HASH_RECORD_OOM(oomed); \ } else { \ uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)->hh.tbl->tail = &((head)->hh); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ (head)->hh.tbl->signature = HASH_SIGNATURE; \ if (!(head)->hh.tbl->buckets) { \ HASH_RECORD_OOM(oomed); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ } else { \ uthash_bzero((head)->hh.tbl->buckets, \ HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \ HASH_BLOOM_MAKE((head)->hh.tbl, oomed); \ IF_HASH_NONFATAL_OOM( \ if (oomed) { \ uthash_free((head)->hh.tbl->buckets, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ } \ ) \ } \ } \ } while (0) #define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \ do { \ (replaced) = NULL; \ HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ if (replaced) { \ HASH_DELETE(hh, head, replaced); \ } \ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \ } while (0) #define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \ do { \ (replaced) = NULL; \ HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \ if (replaced) { \ HASH_DELETE(hh, head, replaced); \ } \ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \ } while (0) #define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \ do { \ unsigned _hr_hashv; \ HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \ } while (0) #define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \ do { \ unsigned _hr_hashv; \ HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \ HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \ } while (0) #define HASH_APPEND_LIST(hh, head, add) \ do { \ (add)->hh.next = NULL; \ (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \ (head)->hh.tbl->tail->next = (add); \ (head)->hh.tbl->tail = &((add)->hh); \ } while (0) #define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ do { \ do { \ if (cmpfcn(DECLTYPE(head)(_hs_iter), add) > 0) { \ break; \ } \ } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ } while (0) #ifdef NO_DECLTYPE #undef HASH_AKBI_INNER_LOOP #define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \ do { \ char *_hs_saved_head = (char*)(head); \ do { \ DECLTYPE_ASSIGN(head, _hs_iter); \ if (cmpfcn(head, add) > 0) { \ DECLTYPE_ASSIGN(head, _hs_saved_head); \ break; \ } \ DECLTYPE_ASSIGN(head, _hs_saved_head); \ } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \ } while (0) #endif #if HASH_NONFATAL_OOM #define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \ do { \ if (!(oomed)) { \ unsigned _ha_bkt; \ (head)->hh.tbl->num_items++; \ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \ if (oomed) { \ HASH_ROLLBACK_BKT(hh, head, &(add)->hh); \ HASH_DELETE_HH(hh, head, &(add)->hh); \ (add)->hh.tbl = NULL; \ uthash_nonfatal_oom(add); \ } else { \ HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ } \ } else { \ (add)->hh.tbl = NULL; \ uthash_nonfatal_oom(add); \ } \ } while (0) #else #define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \ do { \ unsigned _ha_bkt; \ (head)->hh.tbl->num_items++; \ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \ HASH_BLOOM_ADD((head)->hh.tbl, hashval); \ HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \ } while (0) #endif #define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \ do { \ IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \ (add)->hh.hashv = (hashval); \ (add)->hh.key = (char*) (keyptr); \ (add)->hh.keylen = (unsigned) (keylen_in); \ if (!(head)) { \ (add)->hh.next = NULL; \ (add)->hh.prev = NULL; \ HASH_MAKE_TABLE(hh, add, _ha_oomed); \ IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \ (head) = (add); \ IF_HASH_NONFATAL_OOM( } ) \ } else { \ void *_hs_iter = (head); \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_AKBI_INNER_LOOP(hh, head, add, cmpfcn); \ if (_hs_iter) { \ (add)->hh.next = _hs_iter; \ if (((add)->hh.prev = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev)) { \ HH_FROM_ELMT((head)->hh.tbl, (add)->hh.prev)->next = (add); \ } else { \ (head) = (add); \ } \ HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev = (add); \ } else { \ HASH_APPEND_LIST(hh, head, add); \ } \ } \ HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \ HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER"); \ } while (0) #define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \ do { \ unsigned _hs_hashv; \ HASH_VALUE(keyptr, keylen_in, _hs_hashv); \ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \ } while (0) #define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn) #define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \ HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn) #define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \ do { \ IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \ (add)->hh.hashv = (hashval); \ (add)->hh.key = (const void*) (keyptr); \ (add)->hh.keylen = (unsigned) (keylen_in); \ if (!(head)) { \ (add)->hh.next = NULL; \ (add)->hh.prev = NULL; \ HASH_MAKE_TABLE(hh, add, _ha_oomed); \ IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \ (head) = (add); \ IF_HASH_NONFATAL_OOM( } ) \ } else { \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_APPEND_LIST(hh, head, add); \ } \ HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \ HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE"); \ } while (0) #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_hashv; \ HASH_VALUE(keyptr, keylen_in, _ha_hashv); \ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \ } while (0) #define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add) #define HASH_ADD(hh,head,fieldname,keylen_in,add) \ HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add) #define HASH_TO_BKT(hashv,num_bkts,bkt) \ do { \ bkt = ((hashv) & ((num_bkts) - 1U)); \ } while (0) /* delete "delptr" from the hash table. * "the usual" patch-up process for the app-order doubly-linked-list. * The use of _hd_hh_del below deserves special explanation. * These used to be expressed using (delptr) but that led to a bug * if someone used the same symbol for the head and deletee, like * HASH_DELETE(hh,users,users); * We want that to work, but by changing the head (users) below * we were forfeiting our ability to further refer to the deletee (users) * in the patch-up process. Solution: use scratch space to * copy the deletee pointer, then the latter references are via that * scratch pointer rather than through the repointed (users) symbol. */ #define HASH_DELETE(hh,head,delptr) \ HASH_DELETE_HH(hh, head, &(delptr)->hh) #define HASH_DELETE_HH(hh,head,delptrhh) \ do { \ struct UT_hash_handle *_hd_hh_del = (delptrhh); \ if ((_hd_hh_del->prev == NULL) && (_hd_hh_del->next == NULL)) { \ HASH_BLOOM_FREE((head)->hh.tbl); \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head) = NULL; \ } else { \ unsigned _hd_bkt; \ if (_hd_hh_del == (head)->hh.tbl->tail) { \ (head)->hh.tbl->tail = HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev); \ } \ if (_hd_hh_del->prev != NULL) { \ HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev)->next = _hd_hh_del->next; \ } else { \ DECLTYPE_ASSIGN(head, _hd_hh_del->next); \ } \ if (_hd_hh_del->next != NULL) { \ HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->next)->prev = _hd_hh_del->prev; \ } \ HASH_TO_BKT(_hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ (head)->hh.tbl->num_items--; \ } \ HASH_FSCK(hh, head, "HASH_DELETE_HH"); \ } while (0) /* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */ #define HASH_FIND_STR(head,findstr,out) \ do { \ unsigned _uthash_hfstr_keylen = (unsigned)uthash_strlen(findstr); \ HASH_FIND(hh, head, findstr, _uthash_hfstr_keylen, out); \ } while (0) #define HASH_ADD_STR(head,strfield,add) \ do { \ unsigned _uthash_hastr_keylen = (unsigned)uthash_strlen((add)->strfield); \ HASH_ADD(hh, head, strfield[0], _uthash_hastr_keylen, add); \ } while (0) #define HASH_REPLACE_STR(head,strfield,add,replaced) \ do { \ unsigned _uthash_hrstr_keylen = (unsigned)uthash_strlen((add)->strfield); \ HASH_REPLACE(hh, head, strfield[0], _uthash_hrstr_keylen, add, replaced); \ } while (0) #define HASH_FIND_INT(head,findint,out) \ HASH_FIND(hh,head,findint,sizeof(int),out) #define HASH_ADD_INT(head,intfield,add) \ HASH_ADD(hh,head,intfield,sizeof(int),add) #define HASH_REPLACE_INT(head,intfield,add,replaced) \ HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced) #define HASH_FIND_PTR(head,findptr,out) \ HASH_FIND(hh,head,findptr,sizeof(void *),out) #define HASH_ADD_PTR(head,ptrfield,add) \ HASH_ADD(hh,head,ptrfield,sizeof(void *),add) #define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \ HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced) #define HASH_DEL(head,delptr) \ HASH_DELETE(hh,head,delptr) /* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. */ #ifdef HASH_DEBUG #include /* fprintf, stderr */ #define HASH_OOPS(...) do { fprintf(stderr, __VA_ARGS__); exit(-1); } while (0) #define HASH_FSCK(hh,head,where) \ do { \ struct UT_hash_handle *_thh; \ if (head) { \ unsigned _bkt_i; \ unsigned _count = 0; \ char *_prev; \ for (_bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; ++_bkt_i) { \ unsigned _bkt_count = 0; \ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ _prev = NULL; \ while (_thh) { \ if (_prev != (char*)(_thh->hh_prev)) { \ HASH_OOPS("%s: invalid hh_prev %p, actual %p\n", \ (where), (void*)_thh->hh_prev, (void*)_prev); \ } \ _bkt_count++; \ _prev = (char*)(_thh); \ _thh = _thh->hh_next; \ } \ _count += _bkt_count; \ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ HASH_OOPS("%s: invalid bucket count %u, actual %u\n", \ (where), (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("%s: invalid hh item count %u, actual %u\n", \ (where), (head)->hh.tbl->num_items, _count); \ } \ _count = 0; \ _prev = NULL; \ _thh = &(head)->hh; \ while (_thh) { \ _count++; \ if (_prev != (char*)_thh->prev) { \ HASH_OOPS("%s: invalid prev %p, actual %p\n", \ (where), (void*)_thh->prev, (void*)_prev); \ } \ _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \ _thh = (_thh->next ? HH_FROM_ELMT((head)->hh.tbl, _thh->next) : NULL); \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("%s: invalid app item count %u, actual %u\n", \ (where), (head)->hh.tbl->num_items, _count); \ } \ } \ } while (0) #else #define HASH_FSCK(hh,head,where) #endif /* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to * the descriptor to which this macro is defined for tuning the hash function. * The app can #include to get the prototype for write(2). */ #ifdef HASH_EMIT_KEYS #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \ do { \ unsigned _klen = fieldlen; \ write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \ write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \ } while (0) #else #define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) #endif /* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */ #define HASH_BER(key,keylen,hashv) \ do { \ unsigned _hb_keylen = (unsigned)keylen; \ const unsigned char *_hb_key = (const unsigned char*)(key); \ (hashv) = 0; \ while (_hb_keylen-- != 0U) { \ (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \ } \ } while (0) /* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */ #define HASH_SAX(key,keylen,hashv) \ do { \ unsigned _sx_i; \ const unsigned char *_hs_key = (const unsigned char*)(key); \ hashv = 0; \ for (_sx_i=0; _sx_i < keylen; _sx_i++) { \ hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \ } \ } while (0) /* FNV-1a variation */ #define HASH_FNV(key,keylen,hashv) \ do { \ unsigned _fn_i; \ const unsigned char *_hf_key = (const unsigned char*)(key); \ (hashv) = 2166136261U; \ for (_fn_i=0; _fn_i < keylen; _fn_i++) { \ hashv = hashv ^ _hf_key[_fn_i]; \ hashv = hashv * 16777619U; \ } \ } while (0) #define HASH_OAT(key,keylen,hashv) \ do { \ unsigned _ho_i; \ const unsigned char *_ho_key=(const unsigned char*)(key); \ hashv = 0; \ for(_ho_i=0; _ho_i < keylen; _ho_i++) { \ hashv += _ho_key[_ho_i]; \ hashv += (hashv << 10); \ hashv ^= (hashv >> 6); \ } \ hashv += (hashv << 3); \ hashv ^= (hashv >> 11); \ hashv += (hashv << 15); \ } while (0) #define HASH_JEN_MIX(a,b,c) \ do { \ a -= b; a -= c; a ^= ( c >> 13 ); \ b -= c; b -= a; b ^= ( a << 8 ); \ c -= a; c -= b; c ^= ( b >> 13 ); \ a -= b; a -= c; a ^= ( c >> 12 ); \ b -= c; b -= a; b ^= ( a << 16 ); \ c -= a; c -= b; c ^= ( b >> 5 ); \ a -= b; a -= c; a ^= ( c >> 3 ); \ b -= c; b -= a; b ^= ( a << 10 ); \ c -= a; c -= b; c ^= ( b >> 15 ); \ } while (0) #define HASH_JEN(key,keylen,hashv) \ do { \ unsigned _hj_i,_hj_j,_hj_k; \ unsigned const char *_hj_key=(unsigned const char*)(key); \ hashv = 0xfeedbeefu; \ _hj_i = _hj_j = 0x9e3779b9u; \ _hj_k = (unsigned)(keylen); \ while (_hj_k >= 12U) { \ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + ( (unsigned)_hj_key[2] << 16 ) \ + ( (unsigned)_hj_key[3] << 24 ) ); \ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + ( (unsigned)_hj_key[6] << 16 ) \ + ( (unsigned)_hj_key[7] << 24 ) ); \ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + ( (unsigned)_hj_key[10] << 16 ) \ + ( (unsigned)_hj_key[11] << 24 ) ); \ \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ \ _hj_key += 12; \ _hj_k -= 12U; \ } \ hashv += (unsigned)(keylen); \ switch ( _hj_k ) { \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \ case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \ case 1: _hj_i += _hj_key[0]; /* FALLTHROUGH */ \ default: ; \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ } while (0) /* The Paul Hsieh hash function */ #undef get16bits #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) #define get16bits(d) (*((const uint16_t *) (d))) #endif #if !defined (get16bits) #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \ +(uint32_t)(((const uint8_t *)(d))[0]) ) #endif #define HASH_SFH(key,keylen,hashv) \ do { \ unsigned const char *_sfh_key=(unsigned const char*)(key); \ uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \ \ unsigned _sfh_rem = _sfh_len & 3U; \ _sfh_len >>= 2; \ hashv = 0xcafebabeu; \ \ /* Main loop */ \ for (;_sfh_len > 0U; _sfh_len--) { \ hashv += get16bits (_sfh_key); \ _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \ hashv = (hashv << 16) ^ _sfh_tmp; \ _sfh_key += 2U*sizeof (uint16_t); \ hashv += hashv >> 11; \ } \ \ /* Handle end cases */ \ switch (_sfh_rem) { \ case 3: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 16; \ hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \ hashv += hashv >> 11; \ break; \ case 2: hashv += get16bits (_sfh_key); \ hashv ^= hashv << 11; \ hashv += hashv >> 17; \ break; \ case 1: hashv += *_sfh_key; \ hashv ^= hashv << 10; \ hashv += hashv >> 1; \ break; \ default: ; \ } \ \ /* Force "avalanching" of final 127 bits */ \ hashv ^= hashv << 3; \ hashv += hashv >> 5; \ hashv ^= hashv << 4; \ hashv += hashv >> 17; \ hashv ^= hashv << 25; \ hashv += hashv >> 6; \ } while (0) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \ do { \ if ((head).hh_head != NULL) { \ DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head)); \ } else { \ (out) = NULL; \ } \ while ((out) != NULL) { \ if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) { \ if (HASH_KEYCMP((out)->hh.key, keyptr, keylen_in) == 0) { \ break; \ } \ } \ if ((out)->hh.hh_next != NULL) { \ DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next)); \ } else { \ (out) = NULL; \ } \ } \ } while (0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,hh,addhh,oomed) \ do { \ UT_hash_bucket *_ha_head = &(head); \ _ha_head->count++; \ (addhh)->hh_next = _ha_head->hh_head; \ (addhh)->hh_prev = NULL; \ if (_ha_head->hh_head != NULL) { \ _ha_head->hh_head->hh_prev = (addhh); \ } \ _ha_head->hh_head = (addhh); \ if ((_ha_head->count >= ((_ha_head->expand_mult + 1U) * HASH_BKT_CAPACITY_THRESH)) \ && !(addhh)->tbl->noexpand) { \ HASH_EXPAND_BUCKETS(addhh,(addhh)->tbl, oomed); \ IF_HASH_NONFATAL_OOM( \ if (oomed) { \ HASH_DEL_IN_BKT(head,addhh); \ } \ ) \ } \ } while (0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(head,delhh) \ do { \ UT_hash_bucket *_hd_head = &(head); \ _hd_head->count--; \ if (_hd_head->hh_head == (delhh)) { \ _hd_head->hh_head = (delhh)->hh_next; \ } \ if ((delhh)->hh_prev) { \ (delhh)->hh_prev->hh_next = (delhh)->hh_next; \ } \ if ((delhh)->hh_next) { \ (delhh)->hh_next->hh_prev = (delhh)->hh_prev; \ } \ } while (0) /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(hh,tbl,oomed) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \ if (!_he_new_buckets) { \ HASH_RECORD_OOM(oomed); \ } else { \ uthash_bzero(_he_new_buckets, \ sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \ (tbl)->ideal_chain_maxlen = \ ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) + \ ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \ (tbl)->nonideal_items = 0; \ for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) { \ _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh != NULL) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt); \ _he_newbkt = &(_he_new_buckets[_he_bkt]); \ if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) { \ (tbl)->nonideal_items++; \ if (_he_newbkt->count > _he_newbkt->expand_mult * (tbl)->ideal_chain_maxlen) { \ _he_newbkt->expand_mult++; \ } \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head != NULL) { \ _he_newbkt->hh_head->hh_prev = _he_thh; \ } \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \ (tbl)->num_buckets *= 2U; \ (tbl)->log2_num_buckets++; \ (tbl)->buckets = _he_new_buckets; \ (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ? \ ((tbl)->ineff_expands+1U) : 0U; \ if ((tbl)->ineff_expands > 1U) { \ (tbl)->noexpand = 1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } \ } while (0) /* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */ /* Note that HASH_SORT assumes the hash handle name to be hh. * HASH_SRT was added to allow the hash handle name to be passed in. */ #define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn) #define HASH_SRT(hh,head,cmpfcn) \ do { \ unsigned _hs_i; \ unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \ struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \ if (head != NULL) { \ _hs_insize = 1; \ _hs_looping = 1; \ _hs_list = &((head)->hh); \ while (_hs_looping != 0U) { \ _hs_p = _hs_list; \ _hs_list = NULL; \ _hs_tail = NULL; \ _hs_nmerges = 0; \ while (_hs_p != NULL) { \ _hs_nmerges++; \ _hs_q = _hs_p; \ _hs_psize = 0; \ for (_hs_i = 0; _hs_i < _hs_insize; ++_hs_i) { \ _hs_psize++; \ _hs_q = ((_hs_q->next != NULL) ? \ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ if (_hs_q == NULL) { \ break; \ } \ } \ _hs_qsize = _hs_insize; \ while ((_hs_psize != 0U) || ((_hs_qsize != 0U) && (_hs_q != NULL))) { \ if (_hs_psize == 0U) { \ _hs_e = _hs_q; \ _hs_q = ((_hs_q->next != NULL) ? \ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ _hs_qsize--; \ } else if ((_hs_qsize == 0U) || (_hs_q == NULL)) { \ _hs_e = _hs_p; \ if (_hs_p != NULL) { \ _hs_p = ((_hs_p->next != NULL) ? \ HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ } \ _hs_psize--; \ } else if ((cmpfcn( \ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_p)), \ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_q)) \ )) <= 0) { \ _hs_e = _hs_p; \ if (_hs_p != NULL) { \ _hs_p = ((_hs_p->next != NULL) ? \ HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \ } \ _hs_psize--; \ } else { \ _hs_e = _hs_q; \ _hs_q = ((_hs_q->next != NULL) ? \ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \ _hs_qsize--; \ } \ if ( _hs_tail != NULL ) { \ _hs_tail->next = ((_hs_e != NULL) ? \ ELMT_FROM_HH((head)->hh.tbl, _hs_e) : NULL); \ } else { \ _hs_list = _hs_e; \ } \ if (_hs_e != NULL) { \ _hs_e->prev = ((_hs_tail != NULL) ? \ ELMT_FROM_HH((head)->hh.tbl, _hs_tail) : NULL); \ } \ _hs_tail = _hs_e; \ } \ _hs_p = _hs_q; \ } \ if (_hs_tail != NULL) { \ _hs_tail->next = NULL; \ } \ if (_hs_nmerges <= 1U) { \ _hs_looping = 0; \ (head)->hh.tbl->tail = _hs_tail; \ DECLTYPE_ASSIGN(head, ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \ } \ _hs_insize *= 2U; \ } \ HASH_FSCK(hh, head, "HASH_SRT"); \ } \ } while (0) /* This function selects items from one hash into another hash. * The end result is that the selected items have dual presence * in both hashes. There is no copy of the items made; rather * they are added into the new hash through a secondary hash * hash handle that must be present in the structure. */ #define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \ do { \ unsigned _src_bkt, _dst_bkt; \ void *_last_elt = NULL, *_elt; \ UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \ ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \ if ((src) != NULL) { \ for (_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \ for (_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \ _src_hh != NULL; \ _src_hh = _src_hh->hh_next) { \ _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \ if (cond(_elt)) { \ IF_HASH_NONFATAL_OOM( int _hs_oomed = 0; ) \ _dst_hh = (UT_hash_handle*)(void*)(((char*)_elt) + _dst_hho); \ _dst_hh->key = _src_hh->key; \ _dst_hh->keylen = _src_hh->keylen; \ _dst_hh->hashv = _src_hh->hashv; \ _dst_hh->prev = _last_elt; \ _dst_hh->next = NULL; \ if (_last_elt_hh != NULL) { \ _last_elt_hh->next = _elt; \ } \ if ((dst) == NULL) { \ DECLTYPE_ASSIGN(dst, _elt); \ HASH_MAKE_TABLE(hh_dst, dst, _hs_oomed); \ IF_HASH_NONFATAL_OOM( \ if (_hs_oomed) { \ uthash_nonfatal_oom(_elt); \ (dst) = NULL; \ continue; \ } \ ) \ } else { \ _dst_hh->tbl = (dst)->hh_dst.tbl; \ } \ HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \ HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], hh_dst, _dst_hh, _hs_oomed); \ (dst)->hh_dst.tbl->num_items++; \ IF_HASH_NONFATAL_OOM( \ if (_hs_oomed) { \ HASH_ROLLBACK_BKT(hh_dst, dst, _dst_hh); \ HASH_DELETE_HH(hh_dst, dst, _dst_hh); \ _dst_hh->tbl = NULL; \ uthash_nonfatal_oom(_elt); \ continue; \ } \ ) \ HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv); \ _last_elt = _elt; \ _last_elt_hh = _dst_hh; \ } \ } \ } \ } \ HASH_FSCK(hh_dst, dst, "HASH_SELECT"); \ } while (0) #define HASH_CLEAR(hh,head) \ do { \ if ((head) != NULL) { \ HASH_BLOOM_FREE((head)->hh.tbl); \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head) = NULL; \ } \ } while (0) #define HASH_OVERHEAD(hh,head) \ (((head) != NULL) ? ( \ (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \ ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \ sizeof(UT_hash_table) + \ (HASH_BLOOM_BYTELEN))) : 0U) #ifdef NO_DECLTYPE #define HASH_ITER(hh,head,el,tmp) \ for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \ (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL))) #else #define HASH_ITER(hh,head,el,tmp) \ for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \ (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL))) #endif /* obtain a count of items in the hash */ #define HASH_COUNT(head) HASH_CNT(hh,head) #define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; /* random signature used only to find hash tables in external analysis */ #define HASH_SIGNATURE 0xa0111fe1u #define HASH_BLOOM_SIGNATURE 0xb12220f2u typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; struct UT_hash_handle *tail; /* tail hh in app order, for fast append */ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; uint32_t signature; /* used only to find hash tables in external analysis */ #ifdef HASH_BLOOM uint32_t bloom_sig; /* used only to test bloom exists in external analysis */ uint8_t *bloom_bv; uint8_t bloom_nbits; #endif } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; void *prev; /* prev element in app order */ void *next; /* next element in app order */ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ const void *key; /* ptr to enclosing struct's key */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; #endif /* UTHASH_H */ mongo-c-driver-2.2.1/src/uthash/uthash-2.3.0/utlist.h000066400000000000000000002371401511661753600221000ustar00rootroot00000000000000/* Copyright (c) 2007-2021, Troy D. Hanson http://troydhanson.github.com/uthash/ 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. 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 UTLIST_H #define UTLIST_H #define UTLIST_VERSION 2.3.0 #include /* * This file contains macros to manipulate singly and doubly-linked lists. * * 1. LL_ macros: singly-linked lists. * 2. DL_ macros: doubly-linked lists. * 3. CDL_ macros: circular doubly-linked lists. * * To use singly-linked lists, your structure must have a "next" pointer. * To use doubly-linked lists, your structure must "prev" and "next" pointers. * Either way, the pointer to the head of the list must be initialized to NULL. * * ----------------.EXAMPLE ------------------------- * struct item { * int id; * struct item *prev, *next; * } * * struct item *list = NULL: * * int main() { * struct item *item; * ... allocate and populate item ... * DL_APPEND(list, item); * } * -------------------------------------------------- * * For doubly-linked lists, the append and delete macros are O(1) * For singly-linked lists, append and delete are O(n) but prepend is O(1) * The sort macro is O(n log(n)) for all types of single/double/circular lists. */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #if !defined(LDECLTYPE) && !defined(NO_DECLTYPE) #if defined(_MSC_VER) /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define LDECLTYPE(x) decltype(x) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #endif #elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__) #define NO_DECLTYPE #else /* GNU, Sun and other compilers */ #define LDECLTYPE(x) __typeof(x) #endif #endif /* for VS2008 we use some workarounds to get around the lack of decltype, * namely, we always reassign our tmp variable to the list head if we need * to dereference its prev/next pointers, and save/restore the real head.*/ #ifdef NO_DECLTYPE #define IF_NO_DECLTYPE(x) x #define LDECLTYPE(x) char* #define UTLIST_SV(elt,list) _tmp = (char*)(list); {char **_alias = (char**)&(list); *_alias = (elt); } #define UTLIST_NEXT(elt,list,next) ((char*)((list)->next)) #define UTLIST_NEXTASGN(elt,list,to,next) { char **_alias = (char**)&((list)->next); *_alias=(char*)(to); } /* #define UTLIST_PREV(elt,list,prev) ((char*)((list)->prev)) */ #define UTLIST_PREVASGN(elt,list,to,prev) { char **_alias = (char**)&((list)->prev); *_alias=(char*)(to); } #define UTLIST_RS(list) { char **_alias = (char**)&(list); *_alias=_tmp; } #define UTLIST_CASTASGN(a,b) { char **_alias = (char**)&(a); *_alias=(char*)(b); } #else #define IF_NO_DECLTYPE(x) #define UTLIST_SV(elt,list) #define UTLIST_NEXT(elt,list,next) ((elt)->next) #define UTLIST_NEXTASGN(elt,list,to,next) ((elt)->next)=(to) /* #define UTLIST_PREV(elt,list,prev) ((elt)->prev) */ #define UTLIST_PREVASGN(elt,list,to,prev) ((elt)->prev)=(to) #define UTLIST_RS(list) #define UTLIST_CASTASGN(a,b) (a)=(b) #endif /****************************************************************************** * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort * * Unwieldy variable names used here to avoid shadowing passed-in variables. * *****************************************************************************/ #define LL_SORT(list, cmp) \ LL_SORT2(list, cmp, next) #define LL_SORT2(list, cmp, next) \ do { \ LDECLTYPE(list) _ls_p; \ LDECLTYPE(list) _ls_q; \ LDECLTYPE(list) _ls_e; \ LDECLTYPE(list) _ls_tail; \ IF_NO_DECLTYPE(LDECLTYPE(list) _tmp;) \ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ if (list) { \ _ls_insize = 1; \ _ls_looping = 1; \ while (_ls_looping) { \ UTLIST_CASTASGN(_ls_p,list); \ (list) = NULL; \ _ls_tail = NULL; \ _ls_nmerges = 0; \ while (_ls_p) { \ _ls_nmerges++; \ _ls_q = _ls_p; \ _ls_psize = 0; \ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ _ls_psize++; \ UTLIST_SV(_ls_q,list); _ls_q = UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); \ if (!_ls_q) break; \ } \ _ls_qsize = _ls_insize; \ while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ if (_ls_psize == 0) { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ } else if (_ls_qsize == 0 || !_ls_q) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ } else if (cmp(_ls_p,_ls_q) <= 0) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ } else { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ } \ if (_ls_tail) { \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ } else { \ UTLIST_CASTASGN(list,_ls_e); \ } \ _ls_tail = _ls_e; \ } \ _ls_p = _ls_q; \ } \ if (_ls_tail) { \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,NULL,next); UTLIST_RS(list); \ } \ if (_ls_nmerges <= 1) { \ _ls_looping=0; \ } \ _ls_insize *= 2; \ } \ } \ } while (0) #define DL_SORT(list, cmp) \ DL_SORT2(list, cmp, prev, next) #define DL_SORT2(list, cmp, prev, next) \ do { \ LDECLTYPE(list) _ls_p; \ LDECLTYPE(list) _ls_q; \ LDECLTYPE(list) _ls_e; \ LDECLTYPE(list) _ls_tail; \ IF_NO_DECLTYPE(LDECLTYPE(list) _tmp;) \ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ if (list) { \ _ls_insize = 1; \ _ls_looping = 1; \ while (_ls_looping) { \ UTLIST_CASTASGN(_ls_p,list); \ (list) = NULL; \ _ls_tail = NULL; \ _ls_nmerges = 0; \ while (_ls_p) { \ _ls_nmerges++; \ _ls_q = _ls_p; \ _ls_psize = 0; \ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ _ls_psize++; \ UTLIST_SV(_ls_q,list); _ls_q = UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); \ if (!_ls_q) break; \ } \ _ls_qsize = _ls_insize; \ while ((_ls_psize > 0) || ((_ls_qsize > 0) && _ls_q)) { \ if (_ls_psize == 0) { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ } else if ((_ls_qsize == 0) || (!_ls_q)) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ } else if (cmp(_ls_p,_ls_q) <= 0) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ } else { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ } \ if (_ls_tail) { \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ } else { \ UTLIST_CASTASGN(list,_ls_e); \ } \ UTLIST_SV(_ls_e,list); UTLIST_PREVASGN(_ls_e,list,_ls_tail,prev); UTLIST_RS(list); \ _ls_tail = _ls_e; \ } \ _ls_p = _ls_q; \ } \ UTLIST_CASTASGN((list)->prev, _ls_tail); \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,NULL,next); UTLIST_RS(list); \ if (_ls_nmerges <= 1) { \ _ls_looping=0; \ } \ _ls_insize *= 2; \ } \ } \ } while (0) #define CDL_SORT(list, cmp) \ CDL_SORT2(list, cmp, prev, next) #define CDL_SORT2(list, cmp, prev, next) \ do { \ LDECLTYPE(list) _ls_p; \ LDECLTYPE(list) _ls_q; \ LDECLTYPE(list) _ls_e; \ LDECLTYPE(list) _ls_tail; \ LDECLTYPE(list) _ls_oldhead; \ LDECLTYPE(list) _tmp; \ int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ if (list) { \ _ls_insize = 1; \ _ls_looping = 1; \ while (_ls_looping) { \ UTLIST_CASTASGN(_ls_p,list); \ UTLIST_CASTASGN(_ls_oldhead,list); \ (list) = NULL; \ _ls_tail = NULL; \ _ls_nmerges = 0; \ while (_ls_p) { \ _ls_nmerges++; \ _ls_q = _ls_p; \ _ls_psize = 0; \ for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ _ls_psize++; \ UTLIST_SV(_ls_q,list); \ if (UTLIST_NEXT(_ls_q,list,next) == _ls_oldhead) { \ _ls_q = NULL; \ } else { \ _ls_q = UTLIST_NEXT(_ls_q,list,next); \ } \ UTLIST_RS(list); \ if (!_ls_q) break; \ } \ _ls_qsize = _ls_insize; \ while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ if (_ls_psize == 0) { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ } else if (_ls_qsize == 0 || !_ls_q) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ } else if (cmp(_ls_p,_ls_q) <= 0) { \ _ls_e = _ls_p; UTLIST_SV(_ls_p,list); _ls_p = \ UTLIST_NEXT(_ls_p,list,next); UTLIST_RS(list); _ls_psize--; \ if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ } else { \ _ls_e = _ls_q; UTLIST_SV(_ls_q,list); _ls_q = \ UTLIST_NEXT(_ls_q,list,next); UTLIST_RS(list); _ls_qsize--; \ if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ } \ if (_ls_tail) { \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_ls_e,next); UTLIST_RS(list); \ } else { \ UTLIST_CASTASGN(list,_ls_e); \ } \ UTLIST_SV(_ls_e,list); UTLIST_PREVASGN(_ls_e,list,_ls_tail,prev); UTLIST_RS(list); \ _ls_tail = _ls_e; \ } \ _ls_p = _ls_q; \ } \ UTLIST_CASTASGN((list)->prev,_ls_tail); \ UTLIST_CASTASGN(_tmp,list); \ UTLIST_SV(_ls_tail,list); UTLIST_NEXTASGN(_ls_tail,list,_tmp,next); UTLIST_RS(list); \ if (_ls_nmerges <= 1) { \ _ls_looping=0; \ } \ _ls_insize *= 2; \ } \ } \ } while (0) /****************************************************************************** * singly linked list macros (non-circular) * *****************************************************************************/ #define LL_PREPEND(head,add) \ LL_PREPEND2(head,add,next) #define LL_PREPEND2(head,add,next) \ do { \ (add)->next = (head); \ (head) = (add); \ } while (0) #define LL_CONCAT(head1,head2) \ LL_CONCAT2(head1,head2,next) #define LL_CONCAT2(head1,head2,next) \ do { \ LDECLTYPE(head1) _tmp; \ if (head1) { \ _tmp = (head1); \ while (_tmp->next) { _tmp = _tmp->next; } \ _tmp->next=(head2); \ } else { \ (head1)=(head2); \ } \ } while (0) #define LL_APPEND(head,add) \ LL_APPEND2(head,add,next) #define LL_APPEND2(head,add,next) \ do { \ LDECLTYPE(head) _tmp; \ (add)->next=NULL; \ if (head) { \ _tmp = (head); \ while (_tmp->next) { _tmp = _tmp->next; } \ _tmp->next=(add); \ } else { \ (head)=(add); \ } \ } while (0) #define LL_INSERT_INORDER(head,add,cmp) \ LL_INSERT_INORDER2(head,add,cmp,next) #define LL_INSERT_INORDER2(head,add,cmp,next) \ do { \ LDECLTYPE(head) _tmp; \ if (head) { \ LL_LOWER_BOUND2(head, _tmp, add, cmp, next); \ LL_APPEND_ELEM2(head, _tmp, add, next); \ } else { \ (head) = (add); \ (head)->next = NULL; \ } \ } while (0) #define LL_LOWER_BOUND(head,elt,like,cmp) \ LL_LOWER_BOUND2(head,elt,like,cmp,next) #define LL_LOWER_BOUND2(head,elt,like,cmp,next) \ do { \ if ((head) == NULL || (cmp(head, like)) >= 0) { \ (elt) = NULL; \ } else { \ for ((elt) = (head); (elt)->next != NULL; (elt) = (elt)->next) { \ if (cmp((elt)->next, like) >= 0) { \ break; \ } \ } \ } \ } while (0) #define LL_DELETE(head,del) \ LL_DELETE2(head,del,next) #define LL_DELETE2(head,del,next) \ do { \ LDECLTYPE(head) _tmp; \ if ((head) == (del)) { \ (head)=(head)->next; \ } else { \ _tmp = (head); \ while (_tmp->next && (_tmp->next != (del))) { \ _tmp = _tmp->next; \ } \ if (_tmp->next) { \ _tmp->next = (del)->next; \ } \ } \ } while (0) #define LL_COUNT(head,el,counter) \ LL_COUNT2(head,el,counter,next) \ #define LL_COUNT2(head,el,counter,next) \ do { \ (counter) = 0; \ LL_FOREACH2(head,el,next) { ++(counter); } \ } while (0) #define LL_FOREACH(head,el) \ LL_FOREACH2(head,el,next) #define LL_FOREACH2(head,el,next) \ for ((el) = (head); el; (el) = (el)->next) #define LL_FOREACH_SAFE(head,el,tmp) \ LL_FOREACH_SAFE2(head,el,tmp,next) #define LL_FOREACH_SAFE2(head,el,tmp,next) \ for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) #define LL_SEARCH_SCALAR(head,out,field,val) \ LL_SEARCH_SCALAR2(head,out,field,val,next) #define LL_SEARCH_SCALAR2(head,out,field,val,next) \ do { \ LL_FOREACH2(head,out,next) { \ if ((out)->field == (val)) break; \ } \ } while (0) #define LL_SEARCH(head,out,elt,cmp) \ LL_SEARCH2(head,out,elt,cmp,next) #define LL_SEARCH2(head,out,elt,cmp,next) \ do { \ LL_FOREACH2(head,out,next) { \ if ((cmp(out,elt))==0) break; \ } \ } while (0) #define LL_REPLACE_ELEM2(head, el, add, next) \ do { \ LDECLTYPE(head) _tmp; \ assert((head) != NULL); \ assert((el) != NULL); \ assert((add) != NULL); \ (add)->next = (el)->next; \ if ((head) == (el)) { \ (head) = (add); \ } else { \ _tmp = (head); \ while (_tmp->next && (_tmp->next != (el))) { \ _tmp = _tmp->next; \ } \ if (_tmp->next) { \ _tmp->next = (add); \ } \ } \ } while (0) #define LL_REPLACE_ELEM(head, el, add) \ LL_REPLACE_ELEM2(head, el, add, next) #define LL_PREPEND_ELEM2(head, el, add, next) \ do { \ if (el) { \ LDECLTYPE(head) _tmp; \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el); \ if ((head) == (el)) { \ (head) = (add); \ } else { \ _tmp = (head); \ while (_tmp->next && (_tmp->next != (el))) { \ _tmp = _tmp->next; \ } \ if (_tmp->next) { \ _tmp->next = (add); \ } \ } \ } else { \ LL_APPEND2(head, add, next); \ } \ } while (0) \ #define LL_PREPEND_ELEM(head, el, add) \ LL_PREPEND_ELEM2(head, el, add, next) #define LL_APPEND_ELEM2(head, el, add, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el)->next; \ (el)->next = (add); \ } else { \ LL_PREPEND2(head, add, next); \ } \ } while (0) \ #define LL_APPEND_ELEM(head, el, add) \ LL_APPEND_ELEM2(head, el, add, next) #ifdef NO_DECLTYPE /* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ #undef LL_CONCAT2 #define LL_CONCAT2(head1,head2,next) \ do { \ char *_tmp; \ if (head1) { \ _tmp = (char*)(head1); \ while ((head1)->next) { (head1) = (head1)->next; } \ (head1)->next = (head2); \ UTLIST_RS(head1); \ } else { \ (head1)=(head2); \ } \ } while (0) #undef LL_APPEND2 #define LL_APPEND2(head,add,next) \ do { \ if (head) { \ (add)->next = head; /* use add->next as a temp variable */ \ while ((add)->next->next) { (add)->next = (add)->next->next; } \ (add)->next->next=(add); \ } else { \ (head)=(add); \ } \ (add)->next=NULL; \ } while (0) #undef LL_INSERT_INORDER2 #define LL_INSERT_INORDER2(head,add,cmp,next) \ do { \ if ((head) == NULL || (cmp(head, add)) >= 0) { \ (add)->next = (head); \ (head) = (add); \ } else { \ char *_tmp = (char*)(head); \ while ((head)->next != NULL && (cmp((head)->next, add)) < 0) { \ (head) = (head)->next; \ } \ (add)->next = (head)->next; \ (head)->next = (add); \ UTLIST_RS(head); \ } \ } while (0) #undef LL_DELETE2 #define LL_DELETE2(head,del,next) \ do { \ if ((head) == (del)) { \ (head)=(head)->next; \ } else { \ char *_tmp = (char*)(head); \ while ((head)->next && ((head)->next != (del))) { \ (head) = (head)->next; \ } \ if ((head)->next) { \ (head)->next = ((del)->next); \ } \ UTLIST_RS(head); \ } \ } while (0) #undef LL_REPLACE_ELEM2 #define LL_REPLACE_ELEM2(head, el, add, next) \ do { \ assert((head) != NULL); \ assert((el) != NULL); \ assert((add) != NULL); \ if ((head) == (el)) { \ (head) = (add); \ } else { \ (add)->next = head; \ while ((add)->next->next && ((add)->next->next != (el))) { \ (add)->next = (add)->next->next; \ } \ if ((add)->next->next) { \ (add)->next->next = (add); \ } \ } \ (add)->next = (el)->next; \ } while (0) #undef LL_PREPEND_ELEM2 #define LL_PREPEND_ELEM2(head, el, add, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ if ((head) == (el)) { \ (head) = (add); \ } else { \ (add)->next = (head); \ while ((add)->next->next && ((add)->next->next != (el))) { \ (add)->next = (add)->next->next; \ } \ if ((add)->next->next) { \ (add)->next->next = (add); \ } \ } \ (add)->next = (el); \ } else { \ LL_APPEND2(head, add, next); \ } \ } while (0) \ #endif /* NO_DECLTYPE */ /****************************************************************************** * doubly linked list macros (non-circular) * *****************************************************************************/ #define DL_PREPEND(head,add) \ DL_PREPEND2(head,add,prev,next) #define DL_PREPEND2(head,add,prev,next) \ do { \ (add)->next = (head); \ if (head) { \ (add)->prev = (head)->prev; \ (head)->prev = (add); \ } else { \ (add)->prev = (add); \ } \ (head) = (add); \ } while (0) #define DL_APPEND(head,add) \ DL_APPEND2(head,add,prev,next) #define DL_APPEND2(head,add,prev,next) \ do { \ if (head) { \ (add)->prev = (head)->prev; \ (head)->prev->next = (add); \ (head)->prev = (add); \ (add)->next = NULL; \ } else { \ (head)=(add); \ (head)->prev = (head); \ (head)->next = NULL; \ } \ } while (0) #define DL_INSERT_INORDER(head,add,cmp) \ DL_INSERT_INORDER2(head,add,cmp,prev,next) #define DL_INSERT_INORDER2(head,add,cmp,prev,next) \ do { \ LDECLTYPE(head) _tmp; \ if (head) { \ DL_LOWER_BOUND2(head, _tmp, add, cmp, next); \ DL_APPEND_ELEM2(head, _tmp, add, prev, next); \ } else { \ (head) = (add); \ (head)->prev = (head); \ (head)->next = NULL; \ } \ } while (0) #define DL_LOWER_BOUND(head,elt,like,cmp) \ DL_LOWER_BOUND2(head,elt,like,cmp,next) #define DL_LOWER_BOUND2(head,elt,like,cmp,next) \ do { \ if ((head) == NULL || (cmp(head, like)) >= 0) { \ (elt) = NULL; \ } else { \ for ((elt) = (head); (elt)->next != NULL; (elt) = (elt)->next) { \ if ((cmp((elt)->next, like)) >= 0) { \ break; \ } \ } \ } \ } while (0) #define DL_CONCAT(head1,head2) \ DL_CONCAT2(head1,head2,prev,next) #define DL_CONCAT2(head1,head2,prev,next) \ do { \ LDECLTYPE(head1) _tmp; \ if (head2) { \ if (head1) { \ UTLIST_CASTASGN(_tmp, (head2)->prev); \ (head2)->prev = (head1)->prev; \ (head1)->prev->next = (head2); \ UTLIST_CASTASGN((head1)->prev, _tmp); \ } else { \ (head1)=(head2); \ } \ } \ } while (0) #define DL_DELETE(head,del) \ DL_DELETE2(head,del,prev,next) #define DL_DELETE2(head,del,prev,next) \ do { \ assert((head) != NULL); \ assert((del)->prev != NULL); \ if ((del)->prev == (del)) { \ (head)=NULL; \ } else if ((del)==(head)) { \ (del)->next->prev = (del)->prev; \ (head) = (del)->next; \ } else { \ (del)->prev->next = (del)->next; \ if ((del)->next) { \ (del)->next->prev = (del)->prev; \ } else { \ (head)->prev = (del)->prev; \ } \ } \ } while (0) #define DL_COUNT(head,el,counter) \ DL_COUNT2(head,el,counter,next) \ #define DL_COUNT2(head,el,counter,next) \ do { \ (counter) = 0; \ DL_FOREACH2(head,el,next) { ++(counter); } \ } while (0) #define DL_FOREACH(head,el) \ DL_FOREACH2(head,el,next) #define DL_FOREACH2(head,el,next) \ for ((el) = (head); el; (el) = (el)->next) /* this version is safe for deleting the elements during iteration */ #define DL_FOREACH_SAFE(head,el,tmp) \ DL_FOREACH_SAFE2(head,el,tmp,next) #define DL_FOREACH_SAFE2(head,el,tmp,next) \ for ((el) = (head); (el) && ((tmp) = (el)->next, 1); (el) = (tmp)) /* these are identical to their singly-linked list counterparts */ #define DL_SEARCH_SCALAR LL_SEARCH_SCALAR #define DL_SEARCH LL_SEARCH #define DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 #define DL_SEARCH2 LL_SEARCH2 #define DL_REPLACE_ELEM2(head, el, add, prev, next) \ do { \ assert((head) != NULL); \ assert((el) != NULL); \ assert((add) != NULL); \ if ((head) == (el)) { \ (head) = (add); \ (add)->next = (el)->next; \ if ((el)->next == NULL) { \ (add)->prev = (add); \ } else { \ (add)->prev = (el)->prev; \ (add)->next->prev = (add); \ } \ } else { \ (add)->next = (el)->next; \ (add)->prev = (el)->prev; \ (add)->prev->next = (add); \ if ((el)->next == NULL) { \ (head)->prev = (add); \ } else { \ (add)->next->prev = (add); \ } \ } \ } while (0) #define DL_REPLACE_ELEM(head, el, add) \ DL_REPLACE_ELEM2(head, el, add, prev, next) #define DL_PREPEND_ELEM2(head, el, add, prev, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el); \ (add)->prev = (el)->prev; \ (el)->prev = (add); \ if ((head) == (el)) { \ (head) = (add); \ } else { \ (add)->prev->next = (add); \ } \ } else { \ DL_APPEND2(head, add, prev, next); \ } \ } while (0) \ #define DL_PREPEND_ELEM(head, el, add) \ DL_PREPEND_ELEM2(head, el, add, prev, next) #define DL_APPEND_ELEM2(head, el, add, prev, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el)->next; \ (add)->prev = (el); \ (el)->next = (add); \ if ((add)->next) { \ (add)->next->prev = (add); \ } else { \ (head)->prev = (add); \ } \ } else { \ DL_PREPEND2(head, add, prev, next); \ } \ } while (0) \ #define DL_APPEND_ELEM(head, el, add) \ DL_APPEND_ELEM2(head, el, add, prev, next) #ifdef NO_DECLTYPE /* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ #undef DL_INSERT_INORDER2 #define DL_INSERT_INORDER2(head,add,cmp,prev,next) \ do { \ if ((head) == NULL) { \ (add)->prev = (add); \ (add)->next = NULL; \ (head) = (add); \ } else if ((cmp(head, add)) >= 0) { \ (add)->prev = (head)->prev; \ (add)->next = (head); \ (head)->prev = (add); \ (head) = (add); \ } else { \ char *_tmp = (char*)(head); \ while ((head)->next && (cmp((head)->next, add)) < 0) { \ (head) = (head)->next; \ } \ (add)->prev = (head); \ (add)->next = (head)->next; \ (head)->next = (add); \ UTLIST_RS(head); \ if ((add)->next) { \ (add)->next->prev = (add); \ } else { \ (head)->prev = (add); \ } \ } \ } while (0) #endif /* NO_DECLTYPE */ /****************************************************************************** * circular doubly linked list macros * *****************************************************************************/ #define CDL_APPEND(head,add) \ CDL_APPEND2(head,add,prev,next) #define CDL_APPEND2(head,add,prev,next) \ do { \ if (head) { \ (add)->prev = (head)->prev; \ (add)->next = (head); \ (head)->prev = (add); \ (add)->prev->next = (add); \ } else { \ (add)->prev = (add); \ (add)->next = (add); \ (head) = (add); \ } \ } while (0) #define CDL_PREPEND(head,add) \ CDL_PREPEND2(head,add,prev,next) #define CDL_PREPEND2(head,add,prev,next) \ do { \ if (head) { \ (add)->prev = (head)->prev; \ (add)->next = (head); \ (head)->prev = (add); \ (add)->prev->next = (add); \ } else { \ (add)->prev = (add); \ (add)->next = (add); \ } \ (head) = (add); \ } while (0) #define CDL_INSERT_INORDER(head,add,cmp) \ CDL_INSERT_INORDER2(head,add,cmp,prev,next) #define CDL_INSERT_INORDER2(head,add,cmp,prev,next) \ do { \ LDECLTYPE(head) _tmp; \ if (head) { \ CDL_LOWER_BOUND2(head, _tmp, add, cmp, next); \ CDL_APPEND_ELEM2(head, _tmp, add, prev, next); \ } else { \ (head) = (add); \ (head)->next = (head); \ (head)->prev = (head); \ } \ } while (0) #define CDL_LOWER_BOUND(head,elt,like,cmp) \ CDL_LOWER_BOUND2(head,elt,like,cmp,next) #define CDL_LOWER_BOUND2(head,elt,like,cmp,next) \ do { \ if ((head) == NULL || (cmp(head, like)) >= 0) { \ (elt) = NULL; \ } else { \ for ((elt) = (head); (elt)->next != (head); (elt) = (elt)->next) { \ if ((cmp((elt)->next, like)) >= 0) { \ break; \ } \ } \ } \ } while (0) #define CDL_DELETE(head,del) \ CDL_DELETE2(head,del,prev,next) #define CDL_DELETE2(head,del,prev,next) \ do { \ if (((head)==(del)) && ((head)->next == (head))) { \ (head) = NULL; \ } else { \ (del)->next->prev = (del)->prev; \ (del)->prev->next = (del)->next; \ if ((del) == (head)) (head)=(del)->next; \ } \ } while (0) #define CDL_COUNT(head,el,counter) \ CDL_COUNT2(head,el,counter,next) \ #define CDL_COUNT2(head, el, counter,next) \ do { \ (counter) = 0; \ CDL_FOREACH2(head,el,next) { ++(counter); } \ } while (0) #define CDL_FOREACH(head,el) \ CDL_FOREACH2(head,el,next) #define CDL_FOREACH2(head,el,next) \ for ((el)=(head);el;(el)=(((el)->next==(head)) ? NULL : (el)->next)) #define CDL_FOREACH_SAFE(head,el,tmp1,tmp2) \ CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) #define CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) \ for ((el) = (head), (tmp1) = (head) ? (head)->prev : NULL; \ (el) && ((tmp2) = (el)->next, 1); \ (el) = ((el) == (tmp1) ? NULL : (tmp2))) #define CDL_SEARCH_SCALAR(head,out,field,val) \ CDL_SEARCH_SCALAR2(head,out,field,val,next) #define CDL_SEARCH_SCALAR2(head,out,field,val,next) \ do { \ CDL_FOREACH2(head,out,next) { \ if ((out)->field == (val)) break; \ } \ } while (0) #define CDL_SEARCH(head,out,elt,cmp) \ CDL_SEARCH2(head,out,elt,cmp,next) #define CDL_SEARCH2(head,out,elt,cmp,next) \ do { \ CDL_FOREACH2(head,out,next) { \ if ((cmp(out,elt))==0) break; \ } \ } while (0) #define CDL_REPLACE_ELEM2(head, el, add, prev, next) \ do { \ assert((head) != NULL); \ assert((el) != NULL); \ assert((add) != NULL); \ if ((el)->next == (el)) { \ (add)->next = (add); \ (add)->prev = (add); \ (head) = (add); \ } else { \ (add)->next = (el)->next; \ (add)->prev = (el)->prev; \ (add)->next->prev = (add); \ (add)->prev->next = (add); \ if ((head) == (el)) { \ (head) = (add); \ } \ } \ } while (0) #define CDL_REPLACE_ELEM(head, el, add) \ CDL_REPLACE_ELEM2(head, el, add, prev, next) #define CDL_PREPEND_ELEM2(head, el, add, prev, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el); \ (add)->prev = (el)->prev; \ (el)->prev = (add); \ (add)->prev->next = (add); \ if ((head) == (el)) { \ (head) = (add); \ } \ } else { \ CDL_APPEND2(head, add, prev, next); \ } \ } while (0) #define CDL_PREPEND_ELEM(head, el, add) \ CDL_PREPEND_ELEM2(head, el, add, prev, next) #define CDL_APPEND_ELEM2(head, el, add, prev, next) \ do { \ if (el) { \ assert((head) != NULL); \ assert((add) != NULL); \ (add)->next = (el)->next; \ (add)->prev = (el); \ (el)->next = (add); \ (add)->next->prev = (add); \ } else { \ CDL_PREPEND2(head, add, prev, next); \ } \ } while (0) #define CDL_APPEND_ELEM(head, el, add) \ CDL_APPEND_ELEM2(head, el, add, prev, next) #ifdef NO_DECLTYPE /* Here are VS2008 / NO_DECLTYPE replacements for a few functions */ #undef CDL_INSERT_INORDER2 #define CDL_INSERT_INORDER2(head,add,cmp,prev,next) \ do { \ if ((head) == NULL) { \ (add)->prev = (add); \ (add)->next = (add); \ (head) = (add); \ } else if ((cmp(head, add)) >= 0) { \ (add)->prev = (head)->prev; \ (add)->next = (head); \ (add)->prev->next = (add); \ (head)->prev = (add); \ (head) = (add); \ } else { \ char *_tmp = (char*)(head); \ while ((char*)(head)->next != _tmp && (cmp((head)->next, add)) < 0) { \ (head) = (head)->next; \ } \ (add)->prev = (head); \ (add)->next = (head)->next; \ (add)->next->prev = (add); \ (head)->next = (add); \ UTLIST_RS(head); \ } \ } while (0) #endif /* NO_DECLTYPE */ #endif /* UTLIST_H */ mongo-c-driver-2.2.1/src/zlib-1.3.1/000077500000000000000000000000001511661753600165445ustar00rootroot00000000000000mongo-c-driver-2.2.1/src/zlib-1.3.1/zconf.h.in000066400000000000000000000401641511661753600204460ustar00rootroot00000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. * Even better than compiling with -DZ_PREFIX would be to use configure to set * this permanently in zconf.h using "./configure --zprefix". */ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ # define Z_PREFIX_SET /* all linked symbols and init macros */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align # define _tr_flush_bits z__tr_flush_bits # define _tr_flush_block z__tr_flush_block # define _tr_init z__tr_init # define _tr_stored_block z__tr_stored_block # define _tr_tally z__tr_tally # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 # define adler32_z z_adler32_z # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # endif # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 # define crc32_combine_gen z_crc32_combine_gen # define crc32_combine_gen64 z_crc32_combine_gen64 # define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd # define deflateGetDictionary z_deflateGetDictionary # define deflateInit z_deflateInit # define deflateInit2 z_deflateInit2 # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams # define deflatePending z_deflatePending # define deflatePrime z_deflatePrime # define deflateReset z_deflateReset # define deflateResetKeep z_deflateResetKeep # define deflateSetDictionary z_deflateSetDictionary # define deflateSetHeader z_deflateSetHeader # define deflateTune z_deflateTune # define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table # ifndef Z_SOLO # define gz_error z_gz_error # define gz_intmax z_gz_intmax # define gz_strwinerror z_gz_strwinerror # define gzbuffer z_gzbuffer # define gzclearerr z_gzclearerr # define gzclose z_gzclose # define gzclose_r z_gzclose_r # define gzclose_w z_gzclose_w # define gzdirect z_gzdirect # define gzdopen z_gzdopen # define gzeof z_gzeof # define gzerror z_gzerror # define gzflush z_gzflush # define gzfread z_gzfread # define gzfwrite z_gzfwrite # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ # define gzgets z_gzgets # define gzoffset z_gzoffset # define gzoffset64 z_gzoffset64 # define gzopen z_gzopen # define gzopen64 z_gzopen64 # ifdef _WIN32 # define gzopen_w z_gzopen_w # endif # define gzprintf z_gzprintf # define gzputc z_gzputc # define gzputs z_gzputs # define gzread z_gzread # define gzrewind z_gzrewind # define gzseek z_gzseek # define gzseek64 z_gzseek64 # define gzsetparams z_gzsetparams # define gztell z_gztell # define gztell64 z_gztell64 # define gzungetc z_gzungetc # define gzvprintf z_gzvprintf # define gzwrite z_gzwrite # endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd # define inflateBackInit z_inflateBackInit # define inflateBackInit_ z_inflateBackInit_ # define inflateCodesUsed z_inflateCodesUsed # define inflateCopy z_inflateCopy # define inflateEnd z_inflateEnd # define inflateGetDictionary z_inflateGetDictionary # define inflateGetHeader z_inflateGetHeader # define inflateInit z_inflateInit # define inflateInit2 z_inflateInit2 # define inflateInit2_ z_inflateInit2_ # define inflateInit_ z_inflateInit_ # define inflateMark z_inflateMark # define inflatePrime z_inflatePrime # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 # define inflateResetKeep z_inflateResetKeep # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine # define inflateValidate z_inflateValidate # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table # ifndef Z_SOLO # define uncompress z_uncompress # define uncompress2 z_uncompress2 # endif # define zError z_zError # ifndef Z_SOLO # define zcalloc z_zcalloc # define zcfree z_zcfree # endif # define zlibCompileFlags z_zlibCompileFlags # define zlibVersion z_zlibVersion /* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte # define Bytef z_Bytef # define alloc_func z_alloc_func # define charf z_charf # define free_func z_free_func # ifndef Z_SOLO # define gzFile z_gzFile # endif # define gz_header z_gz_header # define gz_headerp z_gz_headerp # define in_func z_in_func # define intf z_intf # define out_func z_out_func # define uInt z_uInt # define uIntf z_uIntf # define uLong z_uLong # define uLongf z_uLongf # define voidp z_voidp # define voidpc z_voidpc # define voidpf z_voidpf /* all zlib structs in zlib.h and zconf.h */ # define gz_header_s z_gz_header_s # define internal_state z_internal_state #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) # ifndef WIN32 # define WIN32 # endif #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif #if defined(ZLIB_CONST) && !defined(z_const) # define z_const const #else # define z_const #endif #ifdef Z_SOLO # ifdef _WIN64 typedef unsigned long long z_size_t; # else typedef unsigned long z_size_t; # endif #else # define z_longlong long long # if defined(NO_SIZE_T) typedef unsigned NO_SIZE_T z_size_t; # elif defined(STDC) # include typedef size_t z_size_t; # else typedef unsigned long z_size_t; # endif # undef z_longlong #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus about 7 kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) # include # if (UINT_MAX == 0xffffffffUL) # define Z_U4 unsigned # elif (ULONG_MAX == 0xffffffffUL) # define Z_U4 unsigned long # elif (USHRT_MAX == 0xffffffffUL) # define Z_U4 unsigned short # endif #endif #ifdef Z_U4 typedef Z_U4 z_crc_t; #else typedef unsigned long z_crc_t; #endif #ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_UNISTD_H #endif #ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ # define Z_HAVE_STDARG_H #endif #ifdef STDC # ifndef Z_SOLO # include /* for off_t */ # endif #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO # include /* for va_list */ # endif #endif #ifdef _WIN32 # ifndef Z_SOLO # include /* for wchar_t */ # endif #endif /* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even * though the former does not conform to the LFS document), but considering * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as * equivalently requesting no 64-bit operations */ #if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 # undef _LARGEFILE64_SOURCE #endif #ifndef Z_HAVE_UNISTD_H # ifdef __WATCOMC__ # define Z_HAVE_UNISTD_H # endif #endif #ifndef Z_HAVE_UNISTD_H # if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) # define Z_HAVE_UNISTD_H # endif #endif #ifndef Z_SOLO # if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ # endif # ifndef z_off_t # define z_off_t off_t # endif # endif #endif #if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 # define Z_LFS64 #endif #if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) # define Z_LARGE64 #endif #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) # define Z_WANT64 #endif #if !defined(SEEK_SET) && !defined(Z_SOLO) # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else # if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) #pragma map(deflateInit_,"DEIN") #pragma map(deflateInit2_,"DEIN2") #pragma map(deflateEnd,"DEEND") #pragma map(deflateBound,"DEBND") #pragma map(inflateInit_,"ININ") #pragma map(inflateInit2_,"ININ2") #pragma map(inflateEnd,"INEND") #pragma map(inflateSync,"INSY") #pragma map(inflateSetDictionary,"INSEDI") #pragma map(compressBound,"CMBND") #pragma map(inflate_table,"INTABL") #pragma map(inflate_fast,"INFA") #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ mongo-c-driver-2.2.1/tools/000077500000000000000000000000001511661753600155175ustar00rootroot00000000000000mongo-c-driver-2.2.1/tools/__alias000066400000000000000000000053051511661753600170340ustar00rootroot00000000000000#!/usr/bin/env sh # Create an alias in /usr/local/bin/ for the command given by the arguments # Usage: # # __alias [ [...]] # # The generated alias can be invoked via , and any subsequent arguments # are appended to the argument list that were given when __alias was invoked. # shellcheck disable=SC3043,SC3044 set -eu # Usage: __readvar # Read the value of the variable named by into a variable __readvar() { local __readvar_tmp eval "__readvar_tmp=\$(printf %s. \"\${$2}\"); $1=\${__readvar_tmp%.}" } __fail() { printf %s "$@" return 1 } # $ __strsub_inplace # Replace each occurrence of with within the string variable __strsub_inplace() { test $# -eq 3 || __fail "__strsub_inplace expects three arguments (Got %s)" $# || return local __strsub_varname="$1" __strsub_needle="$2" __strsub_repl="$3" # Read the value of into __strsub_remaining __readvar __strsub_remaining "$__strsub_varname" # Accumulate into __strsub_acc local __strsub_head __strsub_acc='' while true; do # Grab all content until the next needle: __strsub_head=${__strsub_remaining%%"$__strsub_needle"*} if test "$__strsub_head" = "$__strsub_remaining"; then # Nothing match the needle, so we are done __strsub_acc="$__strsub_acc$__strsub_remaining" break fi # Everything after the needle: __strsub_remaining=${__strsub_remaining#*"$__strsub_needle"} # Accumulate the result: __strsub_acc="$__strsub_acc$__strsub_head$__strsub_repl" done # Read the accumulated string back into the output variable: __readvar "$__strsub_varname" __strsub_acc } _ESCAPES="$(printf '[][ \t\n\r\a*?!\\\$;()\\{\\}'"'"']')" __quote() { local __quote_input="$1" # shellcheck disable=SC2295 local __quote_tmp="${__quote_input#*$_ESCAPES}" || return if test "$__quote_input" = ""; then # Empty string: Just emit empty quotes printf '""' return elif test "$__quote_tmp" = "$__quote_input"; then # No special chars, so don't quote it: printf %s "$__quote_input" return else # Special chars. Escape any inner quotes, then wrap in quotes __strsub_inplace __quote_input "'" "'\\''" printf "'%s'" "$__quote_input" fi } command='' name="$1" shift for x in "$@"; do x=$(__quote "$x") command="$command$x " done command="$command\"\$@\"" filename="/usr/local/bin/$name" echo "#!/usr/bin/env sh" > "$filename" echo "$command" >> "$filename" chmod a+x "$filename" echo "Created command alias '$filename' of [$command]" 1>&2 mongo-c-driver-2.2.1/tools/__boolstr000066400000000000000000000005341511661753600174260ustar00rootroot00000000000000#!/usr/bin/env sh # Execute the given argument list as a command. If exits zero, prints "true", # otherwise "false". stdout from the subcommand will be supressed. stderr will # be forwarded. This script itself will always exit zero. # Usage: __boolstr [cmd...] "$@" 1>/dev/null if test $? = 0; then printf "true" else printf "false" fi mongo-c-driver-2.2.1/tools/__fail000066400000000000000000000001101511661753600166430ustar00rootroot00000000000000#!/usr/bin/env sh # shellcheck disable=SC2059 printf "$@" 1>&2 exit 1 mongo-c-driver-2.2.1/tools/__install000077500000000000000000000037041511661753600174150ustar00rootroot00000000000000#!/usr/bin/env sh # Install the named packages using the platform's package manager. # This script "just does the right thing" to install a package as a step in a # caching container build, as a bare "pkg-tool install" might be insufficient # or subtly broken, and we only really care about installing a list of packages # # Usage:

    l 7l 0l )l "l l l  l l ÿk øk ñk êk ãk Ük Õk Îk Çk Àk ¹k ²k «k ¤k k –k k ˆk k zk sk lk ek ^k Wk Pk Ik Bk ;k 4k -k &k k k k  k k üj õj îj çj àj Ùj Òj Ëj Äj ½j ¶j ¯j ¨j ¡j šj “j Œj …j ~j wj pj ij bj [j Tj Mj Fj ?j 8j 1j *j #j j j j j j ùi òi ëi äi Ýi Öi Ïi Èi Ái ºi ³i ¬i ¥i ži —i i ‰i ‚i {i ti mi fi _i Xi Qi Ji Ci e 7e 0e )e "e e e  e e ÿd ød ñd êd ãd Üd Õd Îd Çd Àd ¹d ²d «d ¤d d –d d ˆd d zd sd ld ed ^d Wd Pd Id Bd ;d 4d -d &d d d d  d d üc õc îc çc àc Ùc Òc Ëc Äc ½c ¶c ¯c ¨c ¡c šc “c Œc …c ~c wc pc ic bc [c Tc Mc Fc ?c 8c 1c *c #c c c c c c ùb òb ëb äb Ýb Öb Ïb Èb Áb ºb ³b ¬b ¥b žb —b b ‰b ‚b {b tb mb fb _b Xb Qb Jb Cb ^ 7^ 0^ )^ "^ ^ ^  ^ ^ ÿ] ø] ñ] ê] ã] Ü] Õ] Î] Ç] À] ¹] ²] «] ¤] ] –] ] ˆ] ] z] s] l] e] ^] W] P] I] B] ;] 4] -] &] ] ] ]  ] ] ü\ õ\ î\ ç\ à\ Ù\ Ò\ Ë\ Ä\ ½\ ¶\ ¯\ ¨\ ¡\ š\ “\ Œ\ …\ ~\ w\ p\ i\ b\ [\ T\ M\ F\ ?\ 8\ 1\ *\ #\ \ \ \ \ \ ù[ ò[ ë[ ä[ Ý[ Ö[ Ï[ È[ Á[ º[ ³[ ¬[ ¥[ ž[ —[ [ ‰[ ‚[ {[ t[ m[ f[ _[ X[ Q[ J[ C[ <[ 5[ .[ '[  [ [ [  [ [ ýZ öZ ïZ èZ áZ ÚZ ÓZ ÌZ ÅZ ¾Z ·Z °Z ©Z ¢Z ›Z ”Z Z †Z Z xZ qZ jZ cZ \Z UZ NZ GZ @Z 9Z 2Z +Z $Z Z Z Z Z Z úY óY ìY åY ÞY ×Y ÐY ÉY ÂY »Y ´Y ­Y ¦Y ŸY ˜Y ‘Y ŠY ƒY |Y uY nY gY `Y YY RY KY DY =Y 6Y /Y (Y !Y Y Y  Y Y þX ÷X ðX éX âX ÛX ÔX ÍX ÆX ¿X ¸X ±X ªX £X œX •X ŽX ‡X €X yX rX kX dX ]X VX OX HX AX :X 3X ,X %X X X X  X X ûW ôW íW æW ßW ØW ÑW ÊW ÃW ¼W µW ®W §W  W ™W ’W ‹W „W }W vW oW hW aW ZW SW LW EW >W 7W 0W )W "W W W  W W ÿV øV ñV êV ãV ÜV ÕV ÎV ÇV ÀV ¹V ²V «V ¤V V –V V ˆV V zV sV lV eV ^V WV PV IV BV ;V 4V -V &V V V V  V V üU õU îU çU àU ÙU ÒU ËU ÄU ½U ¶U ¯U ¨U ¡U šU “U ŒU …U ~U wU pU iU bU [U TU MU FU ?U 8U 1U *U #U U U U U U ùT òT ëT äT ÝT ÖT ÏT ÈT ÁT ºT ³T ¬T ¥T žT —T T ‰T ‚T {T tT mT fT _T XT QT JT CT P 7P 0P )P "P P P  P P ÿO øO ñO êO ãO ÜO ÕO ÎO ÇO ÀO ¹O ²O «O ¤O O –O O ˆO O zO sO lO eO ^O WO PO IO BO ;O 4O -O &O O O O  O O üN õN îN çN àN ÙN ÒN ËN ÄN ½N ¶N ¯N ¨N ¡N šN “N ŒN …N ~N wN pN iN bN [N TN MN FN ?N 8N 1N *N #N N N N N N ùM òM ëM äM ÝM ÖM ÏM ÈM ÁM ºM ³M ¬M ¥M žM —M M ‰M ‚M {M tM mM fM _M XM QM JM CM I 7I 0I )I "I I I  I I ÿH øH ñH êH ãH ÜH ÕH ÎH ÇH ÀH ¹H ²H «H ¤H H –H H ˆH H zH sH lH eH ^H WH PH IH BH ;H 4H -H &H H H H  H H üG õG îG çG àG ÙG ÒG ËG ÄG ½G ¶G ¯G ¨G ¡G šG “G ŒG …G ~G wG pG iG bG [G TG MG FG ?G 8G 1G *G #G G G G G G ùF òF ëF äF ÝF ÖF ÏF ÈF ÁF ºF ³F ¬F ¥F žF —F F ‰F ‚F {F tF mF fF _F XF QF JF CF B 7B 0B )B "B B B  B B ÿA øA ñA êA ãA ÜA ÕA ÎA ÇA ÀA ¹A ²A «A ¤A A –A A ˆA A zA sA lA eA ^A WA PA IA BA ;A 4A -A &A A A A  A A ü@ õ@ î@ ç@ à@ Ù@ Ò@ Ë@ Ä@ ½@ ¶@ ¯@ ¨@ ¡@ š@ “@ Œ@ …@ ~@ w@ p@ i@ b@ [@ T@ M@ F@ ?@ 8@ 1@ *@ #@ @ @ @ @ @ ù? ò? ë? ä? Ý? Ö? Ï? È? Á? º? ³? ¬? ¥? ž? —? ? ‰? ‚? {? t? m? f? _? X? Q? J? C?  ö> ï> è> á> Ú> Ó> Ì> Å> ¾> ·> °> ©> ¢> ›> ”> > †> > x> q> j> c> \> U> N> G> @> 9> 2> +> $> > > > > > ú= ó= ì= å= Þ= ×= Ð= É= Â= »= ´= ­= ¦= Ÿ= ˜= ‘= Š= ƒ= |= u= n= g= `= Y= R= K= D= == 6= /= (= != = =  = = þ< ÷< ð< é< â< Û< Ô< Í< Æ< ¿< ¸< ±< ª< £< œ< •< Ž< ‡< €< y< r< k< d< ]< V< O< H< A< :< 3< ,< %< < < <  < < û; ô; í; æ; ß; Ø; Ñ; Ê; Ã; ¼; µ; ®; §;  ; ™; ’; ‹; „; }; v; o; h; a; Z; S; L; E; >; 7; 0; ); "; ; ;  ; ; ÿ: ø: ñ: ê: ã: Ü: Õ: Î: Ç: À: ¹: ²: «: ¤: : –: : ˆ: : z: s: l: e: ^: W: P: I: B: ;: 4: -: &: : : :  : : ü9 õ9 î9 ç9 à9 Ù9 Ò9 Ë9 Ä9 ½9 ¶9 ¯9 ¨9 ¡9 š9 “9 Œ9 …9 ~9 w9 p9 i9 b9 [9 T9 M9 F9 ?9 89 19 *9 #9 9 9 9 9 9 ù8 ò8 ë8 ä8 Ý8 Ö8 Ï8 È8 Á8 º8 ³8 ¬8 ¥8 ž8 —8 8 ‰8 ‚8 {8 t8 m8 f8 _8 X8 Q8 J8 C8 <8 58 .8 '8  8 8 8  8 8 ý7 ö7 ï7 è7 á7 Ú7 Ó7 Ì7 Å7 ¾7 ·7 °7 ©7 ¢7 ›7 ”7 7 †7 7 x7 q7 j7 c7 \7 U7 N7 G7 @7 97 27 +7 $7 7 7 7 7 7 ú6 ó6 ì6 å6 Þ6 ×6 Ð6 É6 Â6 »6 ´6 ­6 ¦6 Ÿ6 ˜6 ‘6 Š6 ƒ6 |6 u6 n6 g6 `6 Y6 R6 K6 D6 =6 66 /6 (6 !6 6 6  6 6 þ5 ÷5 ð5 é5 â5 Û5 Ô5 Í5 Æ5 ¿5 ¸5 ±5 ª5 £5 œ5 •5 Ž5 ‡5 €5 y5 r5 k5 d5 ]5 V5 O5 H5 A5 :5 35 ,5 %5 5 5 5  5 5 û4 ô4 í4 æ4 ß4 Ø4 Ñ4 Ê4 Ã4 ¼4 µ4 ®4 §4  4 ™4 ’4 ‹4 „4 }4 v4 o4 h4 a4 Z4 S4 L4 E4 >4 74 04 )4 "4 4 4  4 4 ÿ3 ø3 ñ3 ê3 ã3 Ü3 Õ3 Î3 Ç3 À3 ¹3 ²3 «3 ¤3 3 –3 3 ˆ3 3 z3 s3 l3 e3 ^3 W3 P3 I3 B3 ;3 43 -3 &3 3 3 3  3 3 ü2 õ2 î2 ç2 à2 Ù2 Ò2 Ë2 Ä2 ½2 ¶2 ¯2 ¨2 ¡2 š2 “2 Œ2 …2 ~2 w2 p2 i2 b2 [2 T2 M2 F2 ?2 82 12 *2 #2 2 2 2 2 2 ù1 ò1 ë1 ä1 Ý1 Ö1 Ï1 È1 Á1 º1 ³1 ¬1 ¥1 ž1 —1 1 ‰1 ‚1 {1 t1 m1 f1 _1 X1 Q1 J1 C1 <1 51 .1 '1  1 1 1  1 1 ý0 ö0 ï0 è0 á0 Ú0 Ó0 Ì0 Å0 ¾0 ·0 °0 ©0 ¢0 ›0 ”0 0 †0 0 x0 q0 j0 c0 \0 U0 N0 G0 @0 90 20 +0 $0 0 0 0 0 0 ú/ ó/ ì/ å/ Þ/ ×/ Ð/ É/ Â/ »/ ´/ ­/ ¦/ Ÿ/ ˜/ ‘/ Š/ ƒ/ |/ u/ n/ g/ `/ Y/ R/ K/ D/ =/ 6/ // (/ !/ / /  / / þ. ÷. ð. é. â. Û. Ô. Í. Æ. ¿. ¸. ±. ª. £. œ. •. Ž. ‡. €. y. r. k. d. ]. V. O. H. A. :. 3. ,. %. . . .  . . û- ô- í- æ- ß- Ø- Ñ- Ê- Ã- ¼- µ- ®- §-  - ™- ’- ‹- „- }- v- o- h- a- Z- S- L- E- >- 7- 0- )- "- - -  - - ÿ, ø, ñ, ê, ã, Ü, Õ, Î, Ç, À, ¹, ², «, ¤, , –, , ˆ, , z, s, l, e, ^, W, P, I, B, ;, 4, -, &, , , ,  , , ü+ õ+ î+ ç+ à+ Ù+ Ò+ Ë+ Ä+ ½+ ¶+ ¯+ ¨+ ¡+ š+ “+ Œ+ …+ ~+ w+ p+ i+ b+ [+ T+ M+ F+ ?+ 8+ 1+ *+ #+ + + + + + ù* ò* ë* ä* Ý* Ö* Ï* È* Á* º* ³* ¬* ¥* ž* —* * ‰* ‚* {* t* m* f* _* X* Q* J* C* <* 5* .* '*  * * *  * * ý) ö) ï) è) á) Ú) Ó) Ì) Å) ¾) ·) °) ©) ¢) ›) ”) ) †) ) x) q) j) c) \) U) N) G) @) 9) 2) +) $) ) ) ) ) ) ú( ó( ì( å( Þ( ×( Ð( É( Â( »( ´( ­( ¦( Ÿ( ˜( ‘( Š( ƒ( |( u( n( g( `( Y( R( K( D( =( 6( /( (( !( ( (  ( ( þ' ÷' ð' é' â' Û' Ô' Í' Æ' ¿' ¸' ±' ª' £' œ' •' Ž' ‡' €' y' r' k' d' ]' V' O' H' A' :' 3' ,' %' ' ' '  ' ' û& ô& í& æ& ß& Ø& Ñ& Ê& Ã& ¼& µ& ®& §&  & ™& ’& ‹& „& }& v& o& h& a& Z& S& L& E& >& 7& 0& )& "& & &  & & ÿ% ø% ñ% ê% ã% Ü% Õ% Î% Ç% À% ¹% ²% «% ¤% % –% % ˆ% % z% s% l% e% ^% W% P% I% B% ;% 4% -% &% % % %  % % ü$ õ$ î$ ç$ à$ Ù$ Ò$ Ë$ Ä$ ½$ ¶$ ¯$ ¨$ ¡$ š$ “$ Œ$ …$ ~$ w$ p$ i$ b$ [$ T$ M$ F$ ?$ 8$ 1$ *$ #$ $ $ $ $ $ ù# ò# ë# ä# Ý# Ö# Ï# È# Á# º# ³# ¬# ¥# ž# —# # ‰# ‚# {# t# m# f# _# X# Q# J# C# <# 5# .# '#  # # #  # # ý" ö" ï" è" á" Ú" Ó" Ì" Å" ¾" ·" °" ©" ¢" ›" ”" " †" " x" q" j" c" \" U" N" G" @" 9" 2" +" $" " " " " " ú! ó! ì! å! Þ! ×! Ð! É! Â! »! ´! ­! ¦! Ÿ! ˜! ‘! Š! ƒ! |! u! n! g! `! Y! R! K! D! =! 6! /! (! !! ! !  ! ! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúæóæìæåæÞæ׿ÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúØóØìØåØÞØרÐØÉØÂØ»Ø´Ø­Ø¦ØŸØ˜Ø‘؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××ûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¾ò¾ë¾ä¾ݾÖ¾ϾȾÁ¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý½ö½ï½è½á½Ú½Ó½̽޾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú¼ó¼ì¼å¼Þ¼×¼мɼ¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼мƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»ûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿ¹ø¹ñ¹ê¹ã¹ܹÕ¹ιǹÀ¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¸õ¸î¸ç¸à¸Ù¸Ò¸˸ĸ½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý¶ö¶ï¶è¶á¶Ú¶Ó¶̶Ŷ¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶úµóµìµåµÞµ×µеɵµ»µ´µ­µ¦µŸµ˜µ‘µеƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ²ø²ñ²ê²ã²ܲÕ²βDzÀ²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü±õ±î±ç±à±Ù±Ò±˱ı½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù°ò°ë°ä°ݰÖ°ϰȰÁ°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý¯ö¯ï¯è¯á¯Ú¯Ó¯̯ů¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú®ó®ì®å®Þ®×®ЮÉ®®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ«ø«ñ«ê«ã«Ü«Õ«ΫÇ«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««üªõªîªçªàªÙªÒª˪νª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý¨ö¨ï¨è¨á¨Ú¨Ó¨̨Ũ¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú§ó§ì§å§Þ§×§Чɧ§»§´§­§¦§Ÿ§˜§‘§Чƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ¦÷¦ð¦é¦â¦Û¦Ô¦ͦƦ¿¦¸¦±¦ª¦£¦œ¦•¦ަ‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¤ø¤ñ¤ê¤ã¤ܤÕ¤ΤǤÀ¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú ó ì å Þ × РÉ  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššú™ó™ì™å™Þ™×™ЙÉ™™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ˜÷˜ð˜é˜â˜Û˜Ô˜͘Ƙ¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ–ø–ñ–ê–ã–Ü–Õ–ΖÇ–À–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒú‹ó‹ì‹å‹Þ‹׋ЋÉ‹‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠû‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿˆøˆñˆêˆãˆ܈ÕˆΈLjÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆü‡õ‡î‡ç‡à‡Ù‡Ò‡ˇć½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù†ò†ë†ä†݆Ö†φȆÁ†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú„ó„ì„å„Þ„ׄЄÉ„„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þƒ÷ƒðƒéƒâƒÛƒÔƒ̓ƃ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒû‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc_7_0_)_"___ __ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[úZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û»ô»í»æ»ß»Ø»Ñ»Ê»û¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿºøºñºêºãºܺÕºκǺÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû´ô´í´æ´ß´Ø´Ñ´Ê´ô¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ³ø³ñ³ê³ã³ܳÕ³γdzÀ³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü²õ²î²ç²à²Ù²Ò²˲IJ½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û­ô­í­æ­ß­Ø­Ñ­Ê­í¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ¬ø¬ñ¬ê¬ã¬ܬÕ¬άǬÀ¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û¦ô¦í¦æ¦ߦئѦʦ漦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŸôŸíŸæŸߟØŸÑŸÊŸß¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿžøžñžêžãžÜžÕžΞÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››úšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û˜ô˜í˜æ˜ߘؘјʘؼ˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ—ø—ñ—ê—ã—Ü—Õ—ΗÇ—À—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŠôŠíŠæŠߊØŠÑŠÊŠÊ¼ŠµŠ®Š§Š Š™Š’Š‹Š„Š}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿ‰ø‰ñ‰ê‰ã‰܉Õ‰ΉljÀ‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰üˆõˆîˆçˆàˆÙˆÒˆˈĈ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûƒôƒíƒæƒ߃؃уʃüƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂Ç‚À‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{üzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCyu7u0u)u"uuu uuÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøû÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××úÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÆôÆíÆæÆ߯ØÆÑÆÊÆÃÆ¼ÆµÆ®Æ§Æ Æ™Æ’ƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀû¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿ÿ¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¾ø¾ñ¾ê¾ã¾ܾÕ¾ξǾÀ¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù¼ò¼ë¼ä¼ݼÖ¼ϼȼÁ¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»úºóºìºåºÞº׺кɺº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþ¹÷¹ð¹é¹â¹Û¹Ô¹͹ƹ¿¹¸¹±¹ª¹£¹œ¹•¹޹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¸ô¸í¸æ¸߸ظѸʸø¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ·ø·ñ·ê·ã·Ü·Õ·ηÇ·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ùµòµëµäµݵÖµϵȵÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú³ó³ì³å³Þ³׳гɳ³»³´³­³¦³Ÿ³˜³‘³гƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ²÷²ð²é²â²Û²Ô²ͲƲ¿²¸²±²ª²£²œ²•²޲‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û±ô±í±æ±ß±رѱʱñ¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ°ø°ñ°ê°ã°ܰÕ°ΰǰÀ°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú¬ó¬ì¬å¬Þ¬׬Ьɬ¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Ьƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««ûªôªíªæªߪتѪʪ꼪µª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿ©ø©ñ©ê©ã©Ü©Õ©ΩÇ©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù§ò§ë§ä§ݧÖ§ϧȧÁ§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý¦ö¦ï¦è¦á¦Ú¦Ó¦̦Ŧ¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¤÷¤ð¤é¤â¤Û¤Ô¤ͤƤ¿¤¸¤±¤ª¤£¤œ¤•¤ޤ‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û£ô£í£æ£ߣأѣʣ㼣µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢΢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúžóžìžåžÞžמОÉžž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûœôœíœæœßœØœÑœÊœÜ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿ›ø›ñ›ê›ã›Ü›Õ›ΛÇ›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››üšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý˜ö˜ï˜è˜á˜Ú˜Ó˜̘Ř¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú—ó—ì—å—Þ—×—ЗÉ——»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û•ô•í•æ•ߕؕѕʕռ•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ”ø”ñ”ê”ã”ܔՔΔÇ”À”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŽôŽíŽæŽߎØŽÑŽÊŽÃŽ¼ŽµŽ®Ž§Ž Ž™Ž’ދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠú‰ó‰ì‰å‰Þ‰׉Љɉ‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Љƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þˆ÷ˆðˆéˆâˆÛˆÔˆ͈ƈ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆû‡ô‡í‡æ‡߇؇чʇǼ‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ†ø†ñ†ê†ã†܆Õ†ΆdžÀ†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ýƒöƒïƒèƒáƒÚƒÓƒ̃Ѿƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒú‚ó‚ì‚å‚Þ‚ׂЂÉ‚‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û€ô€í€æ€߀؀рʀÀ¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCok7k0k)k"kkk kkÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhChd7d0d)d"ddd ddÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa]7]0])]"]]] ]]ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCSO7O0O)O"OOO OOÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECEA7A0A)A"AAA AAÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷úöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûØôØíØæØߨØØÑØÊØÃØ¼ØµØ®Ø§Ø Ø™Ø’؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××üÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ½÷½ð½é½â½Û½Ô½ͽƽ¿½¸½±½ª½£½œ½•½޽‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û¼ô¼í¼æ¼ß¼ؼѼʼü¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ»ø»ñ»ê»ã»Ü»Õ»λÇ»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»üºõºîºçºàºÙºÒº˺ĺ½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººù¹ò¹ë¹ä¹ݹÖ¹ϹȹÁ¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¸ö¸ï¸è¸á¸Ú¸Ó¸̸Ÿ¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ¶÷¶ð¶é¶â¶Û¶Ô¶Ͷƶ¿¶¸¶±¶ª¶£¶œ¶•¶޶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶ûµôµíµæµßµصѵʵõ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿ´ø´ñ´ê´ã´Ü´Õ´δÇ´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü³õ³î³ç³à³Ù³Ò³˳ij½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù²ò²ë²ä²ݲÖ²ϲȲÁ²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý±ö±ï±è±á±Ú±Ó±̱ű¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ¯÷¯ð¯é¯â¯Û¯Ô¯ͯƯ¿¯¸¯±¯ª¯£¯œ¯•¯ޝ‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û®ô®í®æ®ß®Ø®Ñ®Ê®î¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ­ø­ñ­ê­ã­Ü­Õ­έÇ­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü¬õ¬î¬ç¬à¬Ù¬Ò¬ˬĬ½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ýªöªïªèªáªÚªÓª̪Ū¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ¨÷¨ð¨é¨â¨Û¨Ô¨ͨƨ¿¨¸¨±¨ª¨£¨œ¨•¨ލ‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û§ô§í§æ§ß§اѧʧç¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ¦ø¦ñ¦ê¦ã¦ܦÕ¦ΦǦÀ¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¤ò¤ë¤ä¤ݤÖ¤ϤȤÁ¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û ô í æ ß Ø Ñ Ê à¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿŸøŸñŸêŸãŸÜŸÕŸΟÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššû™ô™í™æ™ß™Ø™Ñ™Ê™Ù¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ˜ø˜ñ˜ê˜ã˜ܘÕ˜ΘǘÀ˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑÇ‘À‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒû‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ë¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿŠøŠñŠêŠãŠÜŠÕŠΊÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠü‰õ‰î‰ç‰à‰Ù‰Ò‰ˉĉ½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ùˆòˆëˆäˆ݈ÖˆψȈÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆý‡ö‡ï‡è‡á‡Ú‡Ó‡̇Ň¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿƒøƒñƒêƒãƒ܃Õƒ΃ǃÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCso7o0o)o"ooo ooÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCea7a0a)a"aaa aaÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICIE7E0E)E"EEE EEÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCBô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¾õ¾î¾ç¾à¾Ù¾Ò¾˾ľ½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù½ò½ë½ä½ݽÖ½ϽȽÁ½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý¼ö¼ï¼è¼á¼Ú¼Ó¼̼ż¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú»ó»ì»å»Þ»×»лÉ»»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þº÷ºðºéºâºÛºÔºͺƺ¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººû¹ô¹í¹æ¹ß¹عѹʹù¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù¶ò¶ë¶ä¶ݶÖ¶϶ȶÁ¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ýµöµïµèµáµÚµÓµ̵ŵ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµú´ó´ì´å´Þ´×´дÉ´´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ³÷³ð³é³â³Û³Ô³ͳƳ¿³¸³±³ª³£³œ³•³޳‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û²ô²í²æ²ß²زѲʲò¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü°õ°î°ç°à°Ù°Ò°˰ݽ°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù¯ò¯ë¯ä¯ݯÖ¯ϯȯÁ¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú­ó­ì­å­Þ­×­ЭÉ­­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ¬÷¬ð¬é¬â¬Û¬Ô¬ͬƬ¿¬¸¬±¬ª¬£¬œ¬•¬ެ‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û«ô«í«æ«ß«Ø«Ñ«Ê«ë¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù¨ò¨ë¨ä¨ݨÖ¨ϨȨÁ¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý§ö§ï§è§á§Ú§Ó§̧ŧ¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú¦ó¦ì¦å¦Þ¦צЦɦ¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Цƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¤ô¤í¤æ¤ߤؤѤʤ伤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úŸóŸìŸåŸÞŸןПÉŸŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú˜ó˜ì˜å˜Þ˜טИɘ˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û–ô–í–æ–ß–Ø–Ñ–Ê–Ö¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú‘ó‘ì‘å‘Þ‘בБÉ‘‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹úŠóŠìŠåŠÞŠ׊ЊÉŠŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþ‰÷‰ð‰é‰â‰Û‰Ô‰͉Ɖ¿‰¸‰±‰ª‰£‰œ‰•‰މ‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰ûˆôˆíˆæˆ߈؈шʈȼˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü†õ†î†ç†à†Ù†Ò†ˆĆ½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„úƒóƒìƒåƒÞƒ׃ЃɃƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{ûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCws7s0s)s"sss ssÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCpl7l0l)l"lll llÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCie7e0e)e"eee eeÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCMI7I0I)I"III IIÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúæóæìæåæÞæ׿ÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúØóØìØåØÞØרÐØÉØÂØ»Ø´Ø­Ø¦ØŸØ˜Ø‘؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××ûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¾ò¾ë¾ä¾ݾÖ¾ϾȾÁ¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý½ö½ï½è½á½Ú½Ó½̽޾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú¼ó¼ì¼å¼Þ¼×¼мɼ¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼мƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»ûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿ¹ø¹ñ¹ê¹ã¹ܹÕ¹ιǹÀ¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¸õ¸î¸ç¸à¸Ù¸Ò¸˸ĸ½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý¶ö¶ï¶è¶á¶Ú¶Ó¶̶Ŷ¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶úµóµìµåµÞµ×µеɵµ»µ´µ­µ¦µŸµ˜µ‘µеƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ²ø²ñ²ê²ã²ܲÕ²βDzÀ²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü±õ±î±ç±à±Ù±Ò±˱ı½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù°ò°ë°ä°ݰÖ°ϰȰÁ°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý¯ö¯ï¯è¯á¯Ú¯Ó¯̯ů¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú®ó®ì®å®Þ®×®ЮÉ®®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ«ø«ñ«ê«ã«Ü«Õ«ΫÇ«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««üªõªîªçªàªÙªÒª˪νª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý¨ö¨ï¨è¨á¨Ú¨Ó¨̨Ũ¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú§ó§ì§å§Þ§×§Чɧ§»§´§­§¦§Ÿ§˜§‘§Чƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ¦÷¦ð¦é¦â¦Û¦Ô¦ͦƦ¿¦¸¦±¦ª¦£¦œ¦•¦ަ‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¤ø¤ñ¤ê¤ã¤ܤÕ¤ΤǤÀ¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú ó ì å Þ × РÉ  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššú™ó™ì™å™Þ™×™ЙÉ™™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ˜÷˜ð˜é˜â˜Û˜Ô˜͘Ƙ¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ–ø–ñ–ê–ã–Ü–Õ–ΖÇ–À–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒú‹ó‹ì‹å‹Þ‹׋ЋÉ‹‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠû‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿˆøˆñˆêˆãˆ܈ÕˆΈLjÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆü‡õ‡î‡ç‡à‡Ù‡Ò‡ˇć½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù†ò†ë†ä†݆Ö†φȆÁ†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú„ó„ì„å„Þ„ׄЄÉ„„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þƒ÷ƒðƒéƒâƒÛƒÔƒ̓ƃ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒû‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc_7_0_)_"___ __ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[úZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û»ô»í»æ»ß»Ø»Ñ»Ê»û¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿºøºñºêºãºܺÕºκǺÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû´ô´í´æ´ß´Ø´Ñ´Ê´ô¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ³ø³ñ³ê³ã³ܳÕ³γdzÀ³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü²õ²î²ç²à²Ù²Ò²˲IJ½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û­ô­í­æ­ß­Ø­Ñ­Ê­í¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ¬ø¬ñ¬ê¬ã¬ܬÕ¬άǬÀ¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û¦ô¦í¦æ¦ߦئѦʦ漦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŸôŸíŸæŸߟØŸÑŸÊŸß¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿžøžñžêžãžÜžÕžΞÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››úšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û˜ô˜í˜æ˜ߘؘјʘؼ˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ—ø—ñ—ê—ã—Ü—Õ—ΗÇ—À—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŠôŠíŠæŠߊØŠÑŠÊŠÊ¼ŠµŠ®Š§Š Š™Š’Š‹Š„Š}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿ‰ø‰ñ‰ê‰ã‰܉Õ‰ΉljÀ‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰üˆõˆîˆçˆàˆÙˆÒˆˈĈ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûƒôƒíƒæƒ߃؃уʃüƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂Ç‚À‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{üzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCyu7u0u)u"uuu uuÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þÿ÷ÿðÿéÿâÿÛÿÔÿÍÿÆÿ¿ÿ¸ÿ±ÿªÿ£ÿœÿ•ÿŽÿ‡ÿ€ÿyÿrÿkÿdÿ]ÿVÿOÿHÿAÿ:ÿ3ÿ,ÿ%ÿÿÿÿ ÿÿûþôþíþæþßþØþÑþÊþÃþ¼þµþ®þ§þ þ™þ’þ‹þ„þ}þvþoþhþaþZþSþLþEþ>þ7þ0þ)þ"þþþ þþÿýøýñýêýãýÜýÕýÎýÇýÀý¹ý²ý«ý¤ýý–ýýˆýýzýsýlýeý^ýWýPýIýBý;ý4ý-ý&ýýýý ýýüüõüîüçüàüÙüÒüËüÄü½ü¶ü¯ü¨ü¡üšü“üŒü…ü~üwüpüiübü[üTüMüFü?ü8ü1ü*ü#üüüüüüùûòûëûäûÝûÖûÏûÈûÁûºû³û¬û¥ûžû—ûû‰û‚û{ûtûmûfû_ûXûQûJûCû<û5û.û'û ûûû ûûýúöúïúèúáúÚúÓúÌúÅú¾ú·ú°ú©ú¢ú›ú”úú†úúxúqújúcú\úUúNúGú@ú9ú2ú+ú$úúúúúúúùóùìùåùÞù×ùÐùÉùÂù»ù´ù­ù¦ùŸù˜ù‘ùŠùƒù|ùuùnùgù`ùYùRùKùDù=ù6ù/ù(ù!ùùù ùùþø÷øðøéøâøÛøÔøÍøÆø¿ø¸ø±øªø£øœø•øŽø‡ø€øyørøkødø]øVøOøHøAø:ø3ø,ø%øøøø øøû÷ô÷í÷æ÷ß÷Ø÷Ñ÷Ê÷Ã÷¼÷µ÷®÷§÷ ÷™÷’÷‹÷„÷}÷v÷o÷h÷a÷Z÷S÷L÷E÷>÷7÷0÷)÷"÷÷÷ ÷÷ÿöøöñöêöãöÜöÕöÎöÇöÀö¹ö²ö«ö¤öö–ööˆöözösölöeö^öWöPöIöBö;ö4ö-ö&öööö ööüõõõîõçõàõÙõÒõËõÄõ½õ¶õ¯õ¨õ¡õšõ“õŒõ…õ~õwõpõiõbõ[õTõMõFõ?õ8õ1õ*õ#õõõõõõùôòôëôäôÝôÖôÏôÈôÁôºô³ô¬ô¥ôžô—ôô‰ô‚ô{ôtômôfô_ôXôQôJôCô<ô5ô.ô'ô ôôô ôôýóöóïóèóáóÚóÓóÌóÅó¾ó·ó°ó©ó¢ó›ó”óó†óóxóqójócó\óUóNóGó@ó9ó2ó+ó$óóóóóóúòóòìòåòÞò×òÐòÉòÂò»ò´ò­ò¦òŸò˜ò‘òŠòƒò|òuònògò`òYòRòKòDò=ò6ò/ò(ò!òòò òòþñ÷ñðñéñâñÛñÔñÍñÆñ¿ñ¸ñ±ñªñ£ñœñ•ñŽñ‡ñ€ñyñrñkñdñ]ñVñOñHñAñ:ñ3ñ,ñ%ññññ ññûðôðíðæðßðØðÑðÊðÃð¼ðµð®ð§ð ð™ð’ð‹ð„ð}ðvðoðhðaðZðSðLðEð>ð7ð0ð)ð"ððð ððÿïøïñïêïãïÜïÕïÎïÇïÀï¹ï²ï«ï¤ïï–ïïˆïïzïsïlïeï^ïWïPïIïBï;ï4ï-ï&ïïïï ïïüîõîîîçîàîÙîÒîËîÄî½î¶î¯î¨î¡îšî“îŒî…î~îwîpîiîbî[îTîMîFî?î8î1î*î#îîîîîîùíòíëíäíÝíÖíÏíÈíÁíºí³í¬í¥íží—íí‰í‚í{ítímífí_íXíQíJíCí<í5í.í'í ííí ííýìöìïìèìáìÚìÓìÌìÅì¾ì·ì°ì©ì¢ì›ì”ìì†ììxìqìjìcì\ìUìNìGì@ì9ì2ì+ì$ììììììúëóëìëåëÞë×ëÐëÉëÂë»ë´ë­ë¦ëŸë˜ë‘ëŠëƒë|ëuënëgë`ëYëRëKëDë=ë6ë/ë(ë!ëëë ëëþê÷êðêéêâêÛêÔêÍêÆê¿ê¸ê±êªê£êœê•êŽê‡ê€êyêrêkêdê]êVêOêHêAê:ê3ê,ê%êêêê êêûéôéíéæéßéØéÑéÊéÃé¼éµé®é§é é™é’é‹é„é}évéoéhéaéZéSéLéEé>é7é0é)é"ééé ééÿèøèñèêèãèÜèÕèÎèÇèÀè¹è²è«è¤èè–èèˆèèzèsèlèeè^èWèPèIèBè;è4è-è&èèèè èèüçõçîçççàçÙçÒçËçÄç½ç¶ç¯ç¨ç¡çšç“çŒç…ç~çwçpçiçbç[çTçMçFç?ç8ç1ç*ç#ççççççùæòæëæäæÝæÖæÏæÈæÁæºæ³æ¬æ¥æžæ—ææ‰æ‚æ{ætæmæfæ_æXæQæJæCæ<æ5æ.æ'æ æææ ææýåöåïåèåáåÚåÓåÌåÅå¾å·å°å©å¢å›å”åå†ååxåqåjåcå\åUåNåGå@å9å2å+å$ååååååúäóäìäåäÞä×äÐäÉäÂä»ä´ä­ä¦äŸä˜ä‘äŠäƒä|äuänägä`äYäRäKäDä=ä6ä/ä(ä!äää ääþã÷ãðãéãâãÛãÔãÍãÆã¿ã¸ã±ãªã£ãœã•ãŽã‡ã€ãyãrãkãdã]ãVãOãHãAã:ã3ã,ã%ãããã ããûâôâíâæâßâØâÑâÊâÃâ¼âµâ®â§â â™â’â‹â„â}âvâoâhâaâZâSâLâEâ>â7â0â)â"âââ ââÿáøáñáêáãáÜáÕáÎáÇáÀá¹á²á«á¤áá–ááˆáázásáláeá^áWáPáIáBá;á4á-á&áááá ááüàõàîàçàààÙàÒàËàÄà½à¶à¯à¨à¡àšà“àŒà…à~àwàpàiàbà[àTàMàFà?à8à1à*à#ààààààùßòßëßäßÝßÖßÏßÈßÁߺ߳߬ߥߞߗß߉߂ß{ßtßmßfß_ßXßQßJßCß<ß5ß.ß'ß ßßß ßßýÞöÞïÞèÞáÞÚÞÓÞÌÞÅÞ¾Þ·Þ°Þ©Þ¢Þ›Þ”ÞÞ†ÞÞxÞqÞjÞcÞ\ÞUÞNÞGÞ@Þ9Þ2Þ+Þ$ÞÞÞÞÞÞúÝóÝìÝåÝÞÝ×ÝÐÝÉÝÂݻݴݭݦݟݘݑ݊݃Ý|ÝuÝnÝgÝ`ÝYÝRÝKÝDÝ=Ý6Ý/Ý(Ý!ÝÝÝ ÝÝþÜ÷ÜðÜéÜâÜÛÜÔÜÍÜÆÜ¿Ü¸Ü±ÜªÜ£ÜœÜ•ÜŽÜ‡Ü€ÜyÜrÜkÜdÜ]ÜVÜOÜHÜAÜ:Ü3Ü,Ü%ÜÜÜÜ ÜÜûÛôÛíÛæÛßÛØÛÑÛÊÛÃÛ¼ÛµÛ®Û§Û Û™Û’Û‹Û„Û}ÛvÛoÛhÛaÛZÛSÛLÛEÛ>Û7Û0Û)Û"ÛÛÛ ÛÛÿÚøÚñÚêÚãÚÜÚÕÚÎÚÇÚÀÚ¹Ú²Ú«Ú¤ÚÚ–ÚÚˆÚÚzÚsÚlÚeÚ^ÚWÚPÚIÚBÚ;Ú4Ú-Ú&ÚÚÚÚ ÚÚüÙõÙîÙçÙàÙÙÙÒÙËÙÄٽٶٯ٨١ٌٚٓمÙ~ÙwÙpÙiÙbÙ[ÙTÙMÙFÙ?Ù8Ù1Ù*Ù#ÙÙÙÙÙÙùØòØëØäØÝØÖØÏØÈØÁØºØ³Ø¬Ø¥ØžØ—ØØ‰Ø‚Ø{ØtØmØfØ_ØXØQØJØCØ<Ø5Ø.Ø'Ø ØØØ ØØý×ö×ï×è×á×Ú×Ó×Ì×Å׾׷װשעכה×׆××x×q×j×c×\×U×N×G×@×9×2×+×$××××××úÖóÖìÖåÖÞÖ×ÖÐÖÉÖÂÖ»Ö´Ö­Ö¦ÖŸÖ˜Ö‘ÖŠÖƒÖ|ÖuÖnÖgÖ`ÖYÖRÖKÖDÖ=Ö6Ö/Ö(Ö!ÖÖÖ ÖÖþÕ÷ÕðÕéÕâÕÛÕÔÕÍÕÆÕ¿Õ¸Õ±ÕªÕ£ÕœÕ•ÕŽÕ‡Õ€ÕyÕrÕkÕdÕ]ÕVÕOÕHÕAÕ:Õ3Õ,Õ%ÕÕÕÕ ÕÕûÔôÔíÔæÔßÔØÔÑÔÊÔÃÔ¼ÔµÔ®Ô§Ô Ô™Ô’Ô‹Ô„Ô}ÔvÔoÔhÔaÔZÔSÔLÔEÔ>Ô7Ô0Ô)Ô"ÔÔÔ ÔÔÿÓøÓñÓêÓãÓÜÓÕÓÎÓÇÓÀÓ¹Ó²Ó«Ó¤ÓÓ–ÓÓˆÓÓzÓsÓlÓeÓ^ÓWÓPÓIÓBÓ;Ó4Ó-Ó&ÓÓÓÓ ÓÓüÒõÒîÒçÒàÒÙÒÒÒËÒÄҽҶүҨҡҚғҌ҅Ò~ÒwÒpÒiÒbÒ[ÒTÒMÒFÒ?Ò8Ò1Ò*Ò#ÒÒÒÒÒÒùÑòÑëÑäÑÝÑÖÑÏÑÈÑÁѺѳѬѥўїÑщтÑ{ÑtÑmÑfÑ_ÑXÑQÑJÑCÑ<Ñ5Ñ.Ñ'Ñ ÑÑÑ ÑÑýÐöÐïÐèÐáÐÚÐÓÐÌÐÅозаЩТЛДÐІÐÐxÐqÐjÐcÐ\ÐUÐNÐGÐ@Ð9Ð2Ð+Ð$ÐÐÐÐÐÐúÏóÏìÏåÏÞÏ×ÏÐÏÉÏÂϻϴϭϦϟϘϑϊσÏ|ÏuÏnÏgÏ`ÏYÏRÏKÏDÏ=Ï6Ï/Ï(Ï!ÏÏÏ ÏÏþÎ÷ÎðÎéÎâÎÛÎÔÎÍÎÆÎ¿Î¸Î±ÎªÎ£ÎœÎ•ÎŽÎ‡Î€ÎyÎrÎkÎdÎ]ÎVÎOÎHÎAÎ:Î3Î,Î%ÎÎÎÎ ÎÎûÍôÍíÍæÍßÍØÍÑÍÊÍÃͼ͵͙ͮͧ͒͋̈́͠Í}ÍvÍoÍhÍaÍZÍSÍLÍEÍ>Í7Í0Í)Í"ÍÍÍ ÍÍÿÌøÌñÌêÌãÌÜÌÕÌÎÌÇÌÀ̹̲̫̤ÌÌ–Ì̈ÌÌzÌsÌlÌeÌ^ÌWÌPÌIÌBÌ;Ì4Ì-Ì&ÌÌÌÌ ÌÌüËõËîËçËàËÙËÒËËËÄ˽˶˯˨ˡ˚˓ˌ˅Ë~ËwËpËiËbË[ËTËMËFË?Ë8Ë1Ë*Ë#ËËËËËËùÊòÊëÊäÊÝÊÖÊÏÊÈÊÁʺʳʬʥʞʗÊʉʂÊ{ÊtÊmÊfÊ_ÊXÊQÊJÊCÊ<Ê5Ê.Ê'Ê ÊÊÊ ÊÊýÉöÉïÉèÉáÉÚÉÓÉÌÉÅɾɷɰɩɢɛɔÉɆÉÉxÉqÉjÉcÉ\ÉUÉNÉGÉ@É9É2É+É$ÉÉÉÉÉÉúÈóÈìÈåÈÞÈ×ÈÐÈÉÈÂȻȴȭȦȟȘȑȊȃÈ|ÈuÈnÈgÈ`ÈYÈRÈKÈDÈ=È6È/È(È!ÈÈÈ ÈÈþÇ÷ÇðÇéÇâÇÛÇÔÇÍÇÆÇ¿Ç¸Ç±ÇªÇ£ÇœÇ•ÇŽÇ‡Ç€ÇyÇrÇkÇdÇ]ÇVÇOÇHÇAÇ:Ç3Ç,Ç%ÇÇÇÇ ÇÇûÆôÆíÆæÆ߯ØÆÑÆÊÆÃÆ¼ÆµÆ®Æ§Æ Æ™Æ’ƋƄÆ}ÆvÆoÆhÆaÆZÆSÆLÆEÆ>Æ7Æ0Æ)Æ"ÆÆÆ ÆÆÿÅøÅñÅêÅãÅÜÅÕÅÎÅÇÅÀŹŲūŤÅÅ–ÅňÅÅzÅsÅlÅeÅ^ÅWÅPÅIÅBÅ;Å4Å-Å&ÅÅÅÅ ÅÅüÄõÄîÄçÄàÄÙÄÒÄËÄÄĽĶįĨġĚēČąÄ~ÄwÄpÄiÄbÄ[ÄTÄMÄFÄ?Ä8Ä1Ä*Ä#ÄÄÄÄÄÄùÃòÃëÃäÃÝÃÖÃÏÃÈÃÁúóìåÞ×ÃÉÂÃ{ÃtÃmÃfÃ_ÃXÃQÃJÃCÃ<Ã5Ã.Ã'à ÃÃà ÃÃýÂöÂïÂèÂáÂÚÂÓÂÌž·°©¢›”†ÂÂxÂqÂjÂcÂ\ÂUÂNÂGÂ@Â9Â2Â+Â$ÂÂÂÂÂÂúÁóÁìÁåÁÞÁ×ÁÐÁÉÁÂÁ»Á´Á­Á¦ÁŸÁ˜Á‘ÁŠÁƒÁ|ÁuÁnÁgÁ`ÁYÁRÁKÁDÁ=Á6Á/Á(Á!ÁÁÁ ÁÁþÀ÷ÀðÀéÀâÀÛÀÔÀÍÀÆÀ¿À¸À±ÀªÀ£ÀœÀ•ÀŽÀ‡À€ÀyÀrÀkÀdÀ]ÀVÀOÀHÀAÀ:À3À,À%ÀÀÀÀ ÀÀû¿ô¿í¿æ¿ß¿Ø¿Ñ¿Ê¿ÿ¼¿µ¿®¿§¿ ¿™¿’¿‹¿„¿}¿v¿o¿h¿a¿Z¿S¿L¿E¿>¿7¿0¿)¿"¿¿¿ ¿¿ÿ¾ø¾ñ¾ê¾ã¾ܾÕ¾ξǾÀ¾¹¾²¾«¾¤¾¾–¾¾ˆ¾¾z¾s¾l¾e¾^¾W¾P¾I¾B¾;¾4¾-¾&¾¾¾¾ ¾¾ü½õ½î½ç½à½Ù½Ò½˽Ľ½½¶½¯½¨½¡½š½“½Œ½…½~½w½p½i½b½[½T½M½F½?½8½1½*½#½½½½½½ù¼ò¼ë¼ä¼ݼÖ¼ϼȼÁ¼º¼³¼¬¼¥¼ž¼—¼¼‰¼‚¼{¼t¼m¼f¼_¼X¼Q¼J¼C¼<¼5¼.¼'¼ ¼¼¼ ¼¼ý»ö»ï»è»á»Ú»Ó»Ì»Å»¾»·»°»©»¢»›»”»»†»»x»q»j»c»\»U»N»G»@»9»2»+»$»»»»»»úºóºìºåºÞº׺кɺº»º´º­º¦ºŸº˜º‘ºŠºƒº|ºuºnºgº`ºYºRºKºDº=º6º/º(º!ººº ººþ¹÷¹ð¹é¹â¹Û¹Ô¹͹ƹ¿¹¸¹±¹ª¹£¹œ¹•¹޹‡¹€¹y¹r¹k¹d¹]¹V¹O¹H¹A¹:¹3¹,¹%¹¹¹¹ ¹¹û¸ô¸í¸æ¸߸ظѸʸø¼¸µ¸®¸§¸ ¸™¸’¸‹¸„¸}¸v¸o¸h¸a¸Z¸S¸L¸E¸>¸7¸0¸)¸"¸¸¸ ¸¸ÿ·ø·ñ·ê·ã·Ü·Õ·ηÇ·À·¹·²·«·¤··–··ˆ··z·s·l·e·^·W·P·I·B·;·4·-·&···· ··ü¶õ¶î¶ç¶à¶Ù¶Ò¶˶ͽ¶¶¶¯¶¨¶¡¶š¶“¶Œ¶…¶~¶w¶p¶i¶b¶[¶T¶M¶F¶?¶8¶1¶*¶#¶¶¶¶¶¶ùµòµëµäµݵÖµϵȵÁµºµ³µ¬µ¥µžµ—µµ‰µ‚µ{µtµmµfµ_µXµQµJµCµ<µ5µ.µ'µ µµµ µµý´ö´ï´è´á´Ú´Ó´Ì´Å´¾´·´°´©´¢´›´”´´†´´x´q´j´c´\´U´N´G´@´9´2´+´$´´´´´´ú³ó³ì³å³Þ³׳гɳ³»³´³­³¦³Ÿ³˜³‘³гƒ³|³u³n³g³`³Y³R³K³D³=³6³/³(³!³³³ ³³þ²÷²ð²é²â²Û²Ô²ͲƲ¿²¸²±²ª²£²œ²•²޲‡²€²y²r²k²d²]²V²O²H²A²:²3²,²%²²²² ²²û±ô±í±æ±ß±رѱʱñ¼±µ±®±§± ±™±’±‹±„±}±v±o±h±a±Z±S±L±E±>±7±0±)±"±±± ±±ÿ°ø°ñ°ê°ã°ܰÕ°ΰǰÀ°¹°²°«°¤°°–°°ˆ°°z°s°l°e°^°W°P°I°B°;°4°-°&°°°° °°ü¯õ¯î¯ç¯à¯Ù¯Ò¯˯Ὕ¶¯¯¯¨¯¡¯š¯“¯Œ¯…¯~¯w¯p¯i¯b¯[¯T¯M¯F¯?¯8¯1¯*¯#¯¯¯¯¯¯ù®ò®ë®ä®Ý®Ö®Ï®È®Á®º®³®¬®¥®ž®—®®‰®‚®{®t®m®f®_®X®Q®J®C®<®5®.®'® ®®® ®®ý­ö­ï­è­á­Ú­Ó­Ì­Å­¾­·­°­©­¢­›­”­­†­­x­q­j­c­\­U­N­G­@­9­2­+­$­­­­­­ú¬ó¬ì¬å¬Þ¬׬Ьɬ¬»¬´¬­¬¦¬Ÿ¬˜¬‘¬Ьƒ¬|¬u¬n¬g¬`¬Y¬R¬K¬D¬=¬6¬/¬(¬!¬¬¬ ¬¬þ«÷«ð«é«â«Û«Ô«Í«Æ«¿«¸«±«ª«£«œ«•«Ž«‡«€«y«r«k«d«]«V«O«H«A«:«3«,«%«««« ««ûªôªíªæªߪتѪʪ꼪µª®ª§ª ª™ª’ª‹ª„ª}ªvªoªhªaªZªSªLªEª>ª7ª0ª)ª"ªªª ªªÿ©ø©ñ©ê©ã©Ü©Õ©ΩÇ©À©¹©²©«©¤©©–©©ˆ©©z©s©l©e©^©W©P©I©B©;©4©-©&©©©© ©©ü¨õ¨î¨ç¨à¨Ù¨Ò¨˨Ĩ½¨¶¨¯¨¨¨¡¨š¨“¨Œ¨…¨~¨w¨p¨i¨b¨[¨T¨M¨F¨?¨8¨1¨*¨#¨¨¨¨¨¨ù§ò§ë§ä§ݧÖ§ϧȧÁ§º§³§¬§¥§ž§—§§‰§‚§{§t§m§f§_§X§Q§J§C§<§5§.§'§ §§§ §§ý¦ö¦ï¦è¦á¦Ú¦Ó¦̦Ŧ¾¦·¦°¦©¦¢¦›¦”¦¦†¦¦x¦q¦j¦c¦\¦U¦N¦G¦@¦9¦2¦+¦$¦¦¦¦¦¦ú¥ó¥ì¥å¥Þ¥×¥Ð¥É¥Â¥»¥´¥­¥¦¥Ÿ¥˜¥‘¥Š¥ƒ¥|¥u¥n¥g¥`¥Y¥R¥K¥D¥=¥6¥/¥(¥!¥¥¥ ¥¥þ¤÷¤ð¤é¤â¤Û¤Ô¤ͤƤ¿¤¸¤±¤ª¤£¤œ¤•¤ޤ‡¤€¤y¤r¤k¤d¤]¤V¤O¤H¤A¤:¤3¤,¤%¤¤¤¤ ¤¤û£ô£í£æ£ߣأѣʣ㼣µ£®£§£ £™£’£‹£„£}£v£o£h£a£Z£S£L£E£>£7£0£)£"£££ ££ÿ¢ø¢ñ¢ê¢ã¢Ü¢Õ¢΢Ç¢À¢¹¢²¢«¢¤¢¢–¢¢ˆ¢¢z¢s¢l¢e¢^¢W¢P¢I¢B¢;¢4¢-¢&¢¢¢¢ ¢¢ü¡õ¡î¡ç¡à¡Ù¡Ò¡Ë¡Ä¡½¡¶¡¯¡¨¡¡¡š¡“¡Œ¡…¡~¡w¡p¡i¡b¡[¡T¡M¡F¡?¡8¡1¡*¡#¡¡¡¡¡¡ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ýŸöŸïŸèŸáŸÚŸÓŸÌŸÅŸ¾Ÿ·Ÿ°Ÿ©Ÿ¢Ÿ›Ÿ”ŸŸ†ŸŸxŸqŸjŸcŸ\ŸUŸNŸGŸ@Ÿ9Ÿ2Ÿ+Ÿ$ŸŸŸŸŸŸúžóžìžåžÞžמОÉžž»ž´ž­ž¦žŸž˜ž‘žŠžƒž|žužnžgž`žYžRžKžDž=ž6ž/ž(ž!žžž žžþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûœôœíœæœßœØœÑœÊœÜ¼œµœ®œ§œ œ™œ’œ‹œ„œ}œvœoœhœaœZœSœLœEœ>œ7œ0œ)œ"œœœ œœÿ›ø›ñ›ê›ã›Ü›Õ›ΛÇ›À›¹›²›«›¤››–››ˆ››z›s›l›e›^›W›P›I›B›;›4›-›&›››› ››üšõšîšçšàšÙšÒšËšÄš½š¶š¯š¨š¡ššš“šŒš…š~šwšpšišbš[šTšMšFš?š8š1š*š#ššššššù™ò™ë™ä™Ý™Ö™Ï™È™Á™º™³™¬™¥™ž™—™™‰™‚™{™t™m™f™_™X™Q™J™C™<™5™.™'™ ™™™ ™™ý˜ö˜ï˜è˜á˜Ú˜Ó˜̘Ř¾˜·˜°˜©˜¢˜›˜”˜˜†˜˜x˜q˜j˜c˜\˜U˜N˜G˜@˜9˜2˜+˜$˜˜˜˜˜˜ú—ó—ì—å—Þ—×—ЗÉ——»—´—­—¦—Ÿ—˜—‘—Š—ƒ—|—u—n—g—`—Y—R—K—D—=—6—/—(—!——— ——þ–÷–ð–é–â–Û–Ô–Í–Æ–¿–¸–±–ª–£–œ–•–Ž–‡–€–y–r–k–d–]–V–O–H–A–:–3–,–%–––– ––û•ô•í•æ•ߕؕѕʕռ•µ•®•§• •™•’•‹•„•}•v•o•h•a•Z•S•L•E•>•7•0•)•"••• ••ÿ”ø”ñ”ê”ã”ܔՔΔÇ”À”¹”²”«”¤””–””ˆ””z”s”l”e”^”W”P”I”B”;”4”-”&”””” ””ü“õ“î“ç“à“ٓғ˓罓¶“¯“¨“¡“š“““Œ“…“~“w“p“i“b“[“T“M“F“?“8“1“*“#““““““ù’ò’ë’ä’Ý’Ö’Ï’È’Á’º’³’¬’¥’ž’—’’‰’‚’{’t’m’f’_’X’Q’J’C’<’5’.’'’ ’’’ ’’ý‘ö‘ï‘è‘á‘ڑӑ̑ő¾‘·‘°‘©‘¢‘›‘”‘‘†‘‘x‘q‘j‘c‘\‘U‘N‘G‘@‘9‘2‘+‘$‘‘‘‘‘‘úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŽôŽíŽæŽߎØŽÑŽÊŽÃŽ¼ŽµŽ®Ž§Ž Ž™Ž’ދބŽ}ŽvŽoŽhŽaŽZŽSŽLŽEŽ>Ž7Ž0Ž)Ž"ŽŽŽ ŽŽÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŒõŒîŒçŒàŒÙŒÒŒËŒÄŒ½Œ¶Œ¯Œ¨Œ¡ŒšŒ“ŒŒŒ…Œ~ŒwŒpŒiŒbŒ[ŒTŒMŒFŒ?Œ8Œ1Œ*Œ#ŒŒŒŒŒŒù‹ò‹ë‹ä‹Ý‹Ö‹Ï‹È‹Á‹º‹³‹¬‹¥‹ž‹—‹‹‰‹‚‹{‹t‹m‹f‹_‹X‹Q‹J‹C‹<‹5‹.‹'‹ ‹‹‹ ‹‹ýŠöŠïŠèŠáŠÚŠÓŠÌŠÅŠ¾Š·Š°Š©Š¢Š›Š”ŠŠ†ŠŠxŠqŠjŠcŠ\ŠUŠNŠGŠ@Š9Š2Š+Š$ŠŠŠŠŠŠú‰ó‰ì‰å‰Þ‰׉Љɉ‰»‰´‰­‰¦‰Ÿ‰˜‰‘‰Љƒ‰|‰u‰n‰g‰`‰Y‰R‰K‰D‰=‰6‰/‰(‰!‰‰‰ ‰‰þˆ÷ˆðˆéˆâˆÛˆÔˆ͈ƈ¿ˆ¸ˆ±ˆªˆ£ˆœˆ•ˆŽˆ‡ˆ€ˆyˆrˆkˆdˆ]ˆVˆOˆHˆAˆ:ˆ3ˆ,ˆ%ˆˆˆˆ ˆˆû‡ô‡í‡æ‡߇؇чʇǼ‡µ‡®‡§‡ ‡™‡’‡‹‡„‡}‡v‡o‡h‡a‡Z‡S‡L‡E‡>‡7‡0‡)‡"‡‡‡ ‡‡ÿ†ø†ñ†ê†ã†܆Õ†ΆdžÀ†¹†²†«†¤††–††ˆ††z†s†l†e†^†W†P†I†B†;†4†-†&†††† ††ü…õ…î…ç…à…Ù…Ò…Ë…Ä…½…¶…¯…¨…¡…š…“…Œ………~…w…p…i…b…[…T…M…F…?…8…1…*…#………………ù„ò„ë„ä„݄քτȄÁ„º„³„¬„¥„ž„—„„‰„‚„{„t„m„f„_„X„Q„J„C„<„5„.„'„ „„„ „„ýƒöƒïƒèƒáƒÚƒÓƒ̃Ѿƒ·ƒ°ƒ©ƒ¢ƒ›ƒ”ƒƒ†ƒƒxƒqƒjƒcƒ\ƒUƒNƒGƒ@ƒ9ƒ2ƒ+ƒ$ƒƒƒƒƒƒú‚ó‚ì‚å‚Þ‚ׂЂÉ‚‚»‚´‚­‚¦‚Ÿ‚˜‚‘‚Š‚ƒ‚|‚u‚n‚g‚`‚Y‚R‚K‚D‚=‚6‚/‚(‚!‚‚‚ ‚‚þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û€ô€í€æ€߀؀рʀÀ¼€µ€®€§€ €™€’€‹€„€}€v€o€h€a€Z€S€L€E€>€7€0€)€"€€€ €€ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü~õ~î~ç~à~Ù~Ò~Ë~Ä~½~¶~¯~¨~¡~š~“~Œ~…~~~w~p~i~b~[~T~M~F~?~8~1~*~#~~~~~~ù}ò}ë}ä}Ý}Ö}Ï}È}Á}º}³}¬}¥}ž}—}}‰}‚}{}t}m}f}_}X}Q}J}C}<}5}.}'} }}} }}ý|ö|ï|è|á|Ú|Ó|Ì|Å|¾|·|°|©|¢|›|”||†||x|q|j|c|\|U|N|G|@|9|2|+|$||||||ú{ó{ì{å{Þ{×{Ð{É{Â{»{´{­{¦{Ÿ{˜{‘{Š{ƒ{|{u{n{g{`{Y{R{K{D{={6{/{({!{{{ {{þz÷zðzézâzÛzÔzÍzÆz¿z¸z±zªz£zœz•zŽz‡z€zyzrzkzdz]zVzOzHzAz:z3z,z%zzzz zzûyôyíyæyßyØyÑyÊyÃy¼yµy®y§y y™y’y‹y„y}yvyoyhyayZySyLyEy>y7y0y)y"yyy yyÿxøxñxêxãxÜxÕxÎxÇxÀx¹x²x«x¤xx–xxˆxxzxsxlxex^xWxPxIxBx;x4x-x&xxxx xxüwõwîwçwàwÙwÒwËwÄw½w¶w¯w¨w¡wšw“wŒw…w~wwwpwiwbw[wTwMwFw?w8w1w*w#wwwwwwùvòvëvävÝvÖvÏvÈvÁvºv³v¬v¥vžv—vv‰v‚v{vtvmvfv_vXvQvJvCvr7r0r)r"rrr rrÿqøqñqêqãqÜqÕqÎqÇqÀq¹q²q«q¤qq–qqˆqqzqsqlqeq^qWqPqIqBq;q4q-q&qqqq qqüpõpîpçpàpÙpÒpËpÄp½p¶p¯p¨p¡pšp“pŒp…p~pwpppipbp[pTpMpFp?p8p1p*p#ppppppùoòoëoäoÝoÖoÏoÈoÁoºo³o¬o¥ožo—oo‰o‚o{otomofo_oXoQoJoCok7k0k)k"kkk kkÿjøjñjêjãjÜjÕjÎjÇjÀj¹j²j«j¤jj–jjˆjjzjsjljej^jWjPjIjBj;j4j-j&jjjj jjüiõiîiçiàiÙiÒiËiÄi½i¶i¯i¨i¡iši“iŒi…i~iwipiiibi[iTiMiFi?i8i1i*i#iiiiiiùhòhëhähÝhÖhÏhÈhÁhºh³h¬h¥hžh—hh‰h‚h{hthmhfh_hXhQhJhChd7d0d)d"ddd ddÿcøcñcêcãcÜcÕcÎcÇcÀc¹c²c«c¤cc–ccˆcczcsclcec^cWcPcIcBc;c4c-c&cccc ccübõbîbçbàbÙbÒbËbÄb½b¶b¯b¨b¡bšb“bŒb…b~bwbpbibbb[bTbMbFb?b8b1b*b#bbbbbbùaòaëaäaÝaÖaÏaÈaÁaºa³a¬a¥aža—aa‰a‚a{atamafa_aXaQaJaCa]7]0])]"]]] ]]ÿ\ø\ñ\ê\ã\Ü\Õ\Î\Ç\À\¹\²\«\¤\\–\\ˆ\\z\s\l\e\^\W\P\I\B\;\4\-\&\\\\ \\ü[õ[î[ç[à[Ù[Ò[Ë[Ä[½[¶[¯[¨[¡[š[“[Œ[…[~[w[p[i[b[[[T[M[F[?[8[1[*[#[[[[[[ùZòZëZäZÝZÖZÏZÈZÁZºZ³Z¬Z¥ZžZ—ZZ‰Z‚Z{ZtZmZfZ_ZXZQZJZCZV7V0V)V"VVV VVÿUøUñUêUãUÜUÕUÎUÇUÀU¹U²U«U¤UU–UUˆUUzUsUlUeU^UWUPUIUBU;U4U-U&UUUU UUüTõTîTçTàTÙTÒTËTÄT½T¶T¯T¨T¡TšT“TŒT…T~TwTpTiTbT[TTTMTFT?T8T1T*T#TTTTTTùSòSëSäSÝSÖSÏSÈSÁSºS³S¬S¥SžS—SS‰S‚S{StSmSfS_SXSQSJSCSO7O0O)O"OOO OOÿNøNñNêNãNÜNÕNÎNÇNÀN¹N²N«N¤NN–NNˆNNzNsNlNeN^NWNPNINBN;N4N-N&NNNN NNüMõMîMçMàMÙMÒMËMÄM½M¶M¯M¨M¡MšM“MŒM…M~MwMpMiMbM[MTMMMFM?M8M1M*M#MMMMMMùLòLëLäLÝLÖLÏLÈLÁLºL³L¬L¥LžL—LL‰L‚L{LtLmLfL_LXLQLJLCLH7H0H)H"HHH HHÿGøGñGêGãGÜGÕGÎGÇGÀG¹G²G«G¤GG–GGˆGGzGsGlGeG^GWGPGIGBG;G4G-G&GGGG GGüFõFîFçFàFÙFÒFËFÄF½F¶F¯F¨F¡FšF“FŒF…F~FwFpFiFbF[FTFMFFF?F8F1F*F#FFFFFFùEòEëEäEÝEÖEÏEÈEÁEºE³E¬E¥EžE—EE‰E‚E{EtEmEfE_EXEQEJECEA7A0A)A"AAA AAÿ@ø@ñ@ê@ã@Ü@Õ@Î@Ç@À@¹@²@«@¤@@–@@ˆ@@z@s@l@e@^@W@P@I@B@;@4@-@&@@@@ @@ü?õ?î?ç?à?Ù?Ò?Ë?Ä?½?¶?¯?¨?¡?š?“?Œ?…?~?w?p?i?b?[?T?M?F???8?1?*?#??????ù>ò>ë>ä>Ý>Ö>Ï>È>Á>º>³>¬>¥>ž>—>>‰>‚>{>t>m>f>_>X>Q>J>C><>5>.>'> >>> >>ý=ö=ï=è=á=Ú=Ó=Ì=Å=¾=·=°=©=¢=›=”==†==x=q=j=c=\=U=N=G=@=9=2=+=$======ú<ó<ì<å<Þ<×<Ð<É<Â<»<´<­<¦<Ÿ<˜<‘<Š<ƒ<|<u<n<g<`<Y<R<K<D<=<6</<(<!<<< <<þ;÷;ð;é;â;Û;Ô;Í;Æ;¿;¸;±;ª;£;œ;•;Ž;‡;€;y;r;k;d;];V;O;H;A;:;3;,;%;;;; ;;û:ô:í:æ:ß:Ø:Ñ:Ê:Ã:¼:µ:®:§: :™:’:‹:„:}:v:o:h:a:Z:S:L:E:>:7:0:):"::: ::ÿ9ø9ñ9ê9ã9Ü9Õ9Î9Ç9À9¹9²9«9¤99–99ˆ99z9s9l9e9^9W9P9I9B9;949-9&9999 99ü8õ8î8ç8à8Ù8Ò8Ë8Ä8½8¶8¯8¨8¡8š8“8Œ8…8~8w8p8i8b8[8T8M8F8?88818*8#888888ù7ò7ë7ä7Ý7Ö7Ï7È7Á7º7³7¬7¥7ž7—77‰7‚7{7t7m7f7_7X7Q7J7C7<757.7'7 777 77ý6ö6ï6è6á6Ú6Ó6Ì6Å6¾6·6°6©6¢6›6”66†66x6q6j6c6\6U6N6G6@69626+6$666666ú5ó5ì5å5Þ5×5Ð5É5Â5»5´5­5¦5Ÿ5˜5‘5Š5ƒ5|5u5n5g5`5Y5R5K5D5=565/5(5!555 55þ4÷4ð4é4â4Û4Ô4Í4Æ4¿4¸4±4ª4£4œ4•4Ž4‡4€4y4r4k4d4]4V4O4H4A4:434,4%4444 44û3ô3í3æ3ß3Ø3Ñ3Ê3Ã3¼3µ3®3§3 3™3’3‹3„3}3v3o3h3a3Z3S3L3E3>37303)3"333 33ÿ2ø2ñ2ê2ã2Ü2Õ2Î2Ç2À2¹2²2«2¤22–22ˆ22z2s2l2e2^2W2P2I2B2;242-2&2222 22ü1õ1î1ç1à1Ù1Ò1Ë1Ä1½1¶1¯1¨1¡1š1“1Œ1…1~1w1p1i1b1[1T1M1F1?18111*1#111111ù0ò0ë0ä0Ý0Ö0Ï0È0Á0º0³0¬0¥0ž0—00‰0‚0{0t0m0f0_0X0Q0J0C0<050.0'0 000 00ý/ö/ï/è/á/Ú/Ó/Ì/Å/¾/·/°/©/¢/›/”//†//x/q/j/c/\/U/N/G/@/9/2/+/$//////ú.ó.ì.å.Þ.×.Ð.É.Â.».´.­.¦.Ÿ.˜.‘.Š.ƒ.|.u.n.g.`.Y.R.K.D.=.6./.(.!... ..þ-÷-ð-é-â-Û-Ô-Í-Æ-¿-¸-±-ª-£-œ-•-Ž-‡-€-y-r-k-d-]-V-O-H-A-:-3-,-%---- --û,ô,í,æ,ß,Ø,Ñ,Ê,Ã,¼,µ,®,§, ,™,’,‹,„,},v,o,h,a,Z,S,L,E,>,7,0,),",,, ,,ÿ+ø+ñ+ê+ã+Ü+Õ+Î+Ç+À+¹+²+«+¤++–++ˆ++z+s+l+e+^+W+P+I+B+;+4+-+&++++ ++ü*õ*î*ç*à*Ù*Ò*Ë*Ä*½*¶*¯*¨*¡*š*“*Œ*…*~*w*p*i*b*[*T*M*F*?*8*1***#******ù)ò)ë)ä)Ý)Ö)Ï)È)Á)º)³)¬)¥)ž)—))‰)‚){)t)m)f)_)X)Q)J)C)<)5).)') ))) ))ý(ö(ï(è(á(Ú(Ó(Ì(Å(¾(·(°(©(¢(›(”((†((x(q(j(c(\(U(N(G(@(9(2(+($((((((ú'ó'ì'å'Þ'×'Ð'É'Â'»'´'­'¦'Ÿ'˜'‘'Š'ƒ'|'u'n'g'`'Y'R'K'D'='6'/'('!''' ''þ&÷&ð&é&â&Û&Ô&Í&Æ&¿&¸&±&ª&£&œ&•&Ž&‡&€&y&r&k&d&]&V&O&H&A&:&3&,&%&&&& &&û%ô%í%æ%ß%Ø%Ñ%Ê%Ã%¼%µ%®%§% %™%’%‹%„%}%v%o%h%a%Z%S%L%E%>%7%0%)%"%%% %%ÿ$ø$ñ$ê$ã$Ü$Õ$Î$Ç$À$¹$²$«$¤$$–$$ˆ$$z$s$l$e$^$W$P$I$B$;$4$-$&$$$$ $$ü#õ#î#ç#à#Ù#Ò#Ë#Ä#½#¶#¯#¨#¡#š#“#Œ#…#~#w#p#i#b#[#T#M#F#?#8#1#*########ù"ò"ë"ä"Ý"Ö"Ï"È"Á"º"³"¬"¥"ž"—""‰"‚"{"t"m"f"_"X"Q"J"C"<"5"."'" """ ""ý!ö!ï!è!á!Ú!Ó!Ì!Å!¾!·!°!©!¢!›!”!!†!!x!q!j!c!\!U!N!G!@!9!2!+!$!!!!!!ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùÿòÿëÿäÿÝÿÖÿÏÿÈÿÁÿºÿ³ÿ¬ÿ¥ÿžÿ—ÿÿ‰ÿ‚ÿ{ÿtÿmÿfÿ_ÿXÿQÿJÿCÿ<ÿ5ÿ.ÿ'ÿ ÿÿÿ ÿÿýþöþïþèþáþÚþÓþÌþÅþ¾þ·þ°þ©þ¢þ›þ”þþ†þþxþqþjþcþ\þUþNþGþ@þ9þ2þ+þ$þþþþþþúýóýìýåýÞý×ýÐýÉýÂý»ý´ý­ý¦ýŸý˜ý‘ýŠýƒý|ýuýnýgý`ýYýRýKýDý=ý6ý/ý(ý!ýýý ýýþü÷üðüéüâüÛüÔüÍüÆü¿ü¸ü±üªü£üœü•üŽü‡ü€üyürüküdü]üVüOüHüAü:ü3ü,ü%üüüü üüûûôûíûæûßûØûÑûÊûÃû¼ûµû®û§û û™û’û‹û„û}ûvûoûhûaûZûSûLûEû>û7û0û)û"ûûû ûûÿúøúñúêúãúÜúÕúÎúÇúÀú¹ú²ú«ú¤úú–úúˆúúzúsúlúeú^úWúPúIúBú;ú4ú-ú&úúúú úúüùõùîùçùàùÙùÒùËùÄù½ù¶ù¯ù¨ù¡ùšù“ùŒù…ù~ùwùpùiùbù[ùTùMùFù?ù8ù1ù*ù#ùùùùùùùøòøëøäøÝøÖøÏøÈøÁøºø³ø¬ø¥øžø—øø‰ø‚ø{øtømøfø_øXøQøJøCø<ø5ø.ø'ø øøø øøý÷ö÷ï÷è÷á÷Ú÷Ó÷Ì÷Å÷¾÷·÷°÷©÷¢÷›÷”÷÷†÷÷x÷q÷j÷c÷\÷U÷N÷G÷@÷9÷2÷+÷$÷÷÷÷÷÷úöóöìöåöÞö×öÐöÉöÂö»ö´ö­ö¦öŸö˜ö‘öŠöƒö|öuönögö`öYöRöKöDö=ö6ö/ö(ö!ööö ööþõ÷õðõéõâõÛõÔõÍõÆõ¿õ¸õ±õªõ£õœõ•õŽõ‡õ€õyõrõkõdõ]õVõOõHõAõ:õ3õ,õ%õõõõ õõûôôôíôæôßôØôÑôÊôÃô¼ôµô®ô§ô ô™ô’ô‹ô„ô}ôvôoôhôaôZôSôLôEô>ô7ô0ô)ô"ôôô ôôÿóøóñóêóãóÜóÕóÎóÇóÀó¹ó²ó«ó¤óó–óóˆóózósólóeó^óWóPóIóBó;ó4ó-ó&óóóó óóüòõòîòçòàòÙòÒòËòÄò½ò¶ò¯ò¨ò¡òšò“òŒò…ò~òwòpòiòbò[òTòMòFò?ò8ò1ò*ò#òòòòòòùñòñëñäñÝñÖñÏñÈñÁñºñ³ñ¬ñ¥ñžñ—ññ‰ñ‚ñ{ñtñmñfñ_ñXñQñJñCñ<ñ5ñ.ñ'ñ ñññ ññýðöðïðèðáðÚðÓðÌðÅð¾ð·ð°ð©ð¢ð›ð”ðð†ððxðqðjðcð\ðUðNðGð@ð9ð2ð+ð$ððððððúïóïìïåïÞï×ïÐïÉïÂï»ï´ï­ï¦ïŸï˜ï‘ïŠïƒï|ïuïnïgï`ïYïRïKïDï=ï6ï/ï(ï!ïïï ïïþî÷îðîéîâîÛîÔîÍîÆî¿î¸î±îªî£îœî•îŽî‡î€îyîrîkîdî]îVîOîHîAî:î3î,î%îîîî îîûíôíííæíßíØíÑíÊíÃí¼íµí®í§í í™í’í‹í„í}ívíoíhíaíZíSíLíEí>í7í0í)í"ííí ííÿìøìñìêìãìÜìÕìÎìÇìÀì¹ì²ì«ì¤ìì–ììˆììzìsìlìeì^ìWìPìIìBì;ì4ì-ì&ìììì ììüëõëîëçëàëÙëÒëËëÄë½ë¶ë¯ë¨ë¡ëšë“ëŒë…ë~ëwëpëiëbë[ëTëMëFë?ë8ë1ë*ë#ëëëëëëùêòêëêäêÝêÖêÏêÈêÁêºê³ê¬ê¥êžê—êê‰ê‚ê{êtêmêfê_êXêQêJêCê<ê5ê.ê'ê êêê êêýéöéïéèéáéÚéÓéÌéÅé¾é·é°é©é¢é›é”éé†ééxéqéjécé\éUéNéGé@é9é2é+é$ééééééúèóèìèåèÞè×èÐèÉèÂè»è´è­è¦èŸè˜è‘èŠèƒè|èuènègè`èYèRèKèDè=è6è/è(è!èèè èèþç÷çðçéçâçÛçÔçÍçÆç¿ç¸ç±çªç£çœç•çŽç‡ç€çyçrçkçdç]çVçOçHçAç:ç3ç,ç%çççç ççûæôæíæææßæØæÑæÊæÃæ¼æµæ®æ§æ æ™æ’æ‹æ„æ}ævæoæhæaæZæSæLæEæ>æ7æ0æ)æ"æææ ææÿåøåñåêåãåÜåÕåÎåÇåÀå¹å²å«å¤åå–ååˆååzåsålåeå^åWåPåIåBå;å4å-å&åååå ååüäõäîäçäàäÙäÒäËäÄä½ä¶ä¯ä¨ä¡äšä“äŒä…ä~äwäpäiäbä[äTäMäFä?ä8ä1ä*ä#ääääääùãòãëãäãÝãÖãÏãÈãÁãºã³ã¬ã¥ãžã—ãã‰ã‚ã{ãtãmãfã_ãXãQãJãCã<ã5ã.ã'ã ããã ããýâöâïâèâáâÚâÓâÌâÅâ¾â·â°â©â¢â›â”ââ†ââxâqâjâcâ\âUâNâGâ@â9â2â+â$ââââââúáóáìáåáÞá×áÐáÉáÂá»á´á­á¦áŸá˜á‘áŠáƒá|áuánágá`áYáRáKáDá=á6á/á(á!ááá ááþà÷àðàéàâàÛàÔàÍàÆà¿à¸à±àªà£àœà•àŽà‡à€àyàràkàdà]àVàOàHàAà:à3à,à%àààà ààûßôßíßæßßߨßÑßÊßÃ߼ߵ߮ߧߠߙߒߋ߄ß}ßvßoßhßaßZßSßLßEß>ß7ß0ß)ß"ßßß ßßÿÞøÞñÞêÞãÞÜÞÕÞÎÞÇÞÀÞ¹Þ²Þ«Þ¤ÞÞ–ÞÞˆÞÞzÞsÞlÞeÞ^ÞWÞPÞIÞBÞ;Þ4Þ-Þ&ÞÞÞÞ ÞÞüÝõÝîÝçÝàÝÙÝÒÝËÝÄݽݶݯݨݡݚݓ݌݅Ý~ÝwÝpÝiÝbÝ[ÝTÝMÝFÝ?Ý8Ý1Ý*Ý#ÝÝÝÝÝÝùÜòÜëÜäÜÝÜÖÜÏÜÈÜÁܺܳܬܥܞܗÜ܉܂Ü{ÜtÜmÜfÜ_ÜXÜQÜJÜCÜ<Ü5Ü.Ü'Ü ÜÜÜ ÜÜýÛöÛïÛèÛáÛÚÛÓÛÌÛÅÛ¾Û·Û°Û©Û¢Û›Û”ÛÛ†ÛÛxÛqÛjÛcÛ\ÛUÛNÛGÛ@Û9Û2Û+Û$ÛÛÛÛÛÛúÚóÚìÚåÚÞÚ×ÚÐÚÉÚÂÚ»Ú´Ú­Ú¦ÚŸÚ˜Ú‘ÚŠÚƒÚ|ÚuÚnÚgÚ`ÚYÚRÚKÚDÚ=Ú6Ú/Ú(Ú!ÚÚÚ ÚÚþÙ÷ÙðÙéÙâÙÛÙÔÙÍÙÆÙ¿Ù¸Ù±ÙªÙ£ÙœÙ•ÙŽÙ‡Ù€ÙyÙrÙkÙdÙ]ÙVÙOÙHÙAÙ:Ù3Ù,Ù%ÙÙÙÙ ÙÙûØôØíØæØߨØØÑØÊØÃØ¼ØµØ®Ø§Ø Ø™Ø’؋؄Ø}ØvØoØhØaØZØSØLØEØ>Ø7Ø0Ø)Ø"ØØØ ØØÿ×ø×ñ×ê×ã×Ü×Õ×Î×Ç×À׹ײ׫פ××–×׈××z×s×l×e×^×W×P×I×B×;×4×-×&×××× ××üÖõÖîÖçÖàÖÙÖÒÖËÖÄֶֽ֚֯֨֡֓֌օÖ~ÖwÖpÖiÖbÖ[ÖTÖMÖFÖ?Ö8Ö1Ö*Ö#ÖÖÖÖÖÖùÕòÕëÕäÕÝÕÖÕÏÕÈÕÁÕºÕ³Õ¬Õ¥ÕžÕ—ÕÕ‰Õ‚Õ{ÕtÕmÕfÕ_ÕXÕQÕJÕCÕ<Õ5Õ.Õ'Õ ÕÕÕ ÕÕýÔöÔïÔèÔáÔÚÔÓÔÌÔÅÔ¾Ô·Ô°Ô©Ô¢Ô›Ô”ÔÔ†ÔÔxÔqÔjÔcÔ\ÔUÔNÔGÔ@Ô9Ô2Ô+Ô$ÔÔÔÔÔÔúÓóÓìÓåÓÞÓ×ÓÐÓÉÓÂÓ»Ó´Ó­Ó¦ÓŸÓ˜Ó‘ÓŠÓƒÓ|ÓuÓnÓgÓ`ÓYÓRÓKÓDÓ=Ó6Ó/Ó(Ó!ÓÓÓ ÓÓþÒ÷ÒðÒéÒâÒÛÒÔÒÍÒÆÒ¿Ò¸Ò±ÒªÒ£ÒœÒ•ÒŽÒ‡Ò€ÒyÒrÒkÒdÒ]ÒVÒOÒHÒAÒ:Ò3Ò,Ò%ÒÒÒÒ ÒÒûÑôÑíÑæÑßÑØÑÑÑÊÑÃѼѵѮѧѠљђыфÑ}ÑvÑoÑhÑaÑZÑSÑLÑEÑ>Ñ7Ñ0Ñ)Ñ"ÑÑÑ ÑÑÿÐøÐñÐêÐãÐÜÐÕÐÎÐÇÐÀйвЫФÐЖÐЈÐÐzÐsÐlÐeÐ^ÐWÐPÐIÐBÐ;Ð4Ð-Ð&ÐÐÐÐ ÐÐüÏõÏîÏçÏàÏÙÏÒÏËÏÄϽ϶ϯϨϡϚϓόυÏ~ÏwÏpÏiÏbÏ[ÏTÏMÏFÏ?Ï8Ï1Ï*Ï#ÏÏÏÏÏÏùÎòÎëÎäÎÝÎÖÎÏÎÈÎÁκγάΥΞΗÎΉ΂Î{ÎtÎmÎfÎ_ÎXÎQÎJÎCÎ<Î5Î.Î'Î ÎÎÎ ÎÎýÍöÍïÍèÍáÍÚÍÓÍÌÍÅ;ͷͰ͔ͩ͛͢Í͆ÍÍxÍqÍjÍcÍ\ÍUÍNÍGÍ@Í9Í2Í+Í$ÍÍÍÍÍÍúÌóÌìÌåÌÞÌ×ÌÐÌÉÌÂ̴̻̭̦̟̘̑̊̃Ì|ÌuÌnÌgÌ`ÌYÌRÌKÌDÌ=Ì6Ì/Ì(Ì!ÌÌÌ ÌÌþË÷ËðËéËâËÛËÔËÍËÆË¿Ë¸Ë±ËªË£ËœË•ËŽË‡Ë€ËyËrËkËdË]ËVËOËHËAË:Ë3Ë,Ë%ËËËË ËËûÊôÊíÊæÊßÊØÊÑÊÊÊÃʼʵʮʧʠʙʒʋʄÊ}ÊvÊoÊhÊaÊZÊSÊLÊEÊ>Ê7Ê0Ê)Ê"ÊÊÊ ÊÊÿÉøÉñÉêÉãÉÜÉÕÉÎÉÇÉÀɹɲɫɤÉÉ–ÉɈÉÉzÉsÉlÉeÉ^ÉWÉPÉIÉBÉ;É4É-É&ÉÉÉÉ ÉÉüÈõÈîÈçÈàÈÙÈÒÈËÈÄȽȶȯȨȡȚȓȌȅÈ~ÈwÈpÈiÈbÈ[ÈTÈMÈFÈ?È8È1È*È#ÈÈÈÈÈÈùÇòÇëÇäÇÝÇÖÇÏÇÈÇÁǺdzǬǥǞǗÇljǂÇ{ÇtÇmÇfÇ_ÇXÇQÇJÇCÇ<Ç5Ç.Ç'Ç ÇÇÇ ÇÇýÆöÆïÆèÆáÆÚÆÓÆÌÆÅÆ¾Æ·Æ°Æ©Æ¢Æ›Æ”ÆÆ†ÆÆxÆqÆjÆcÆ\ÆUÆNÆGÆ@Æ9Æ2Æ+Æ$ÆÆÆÆÆÆúÅóÅìÅåÅÞÅ×ÅÐÅÉÅÂŻŴŭŦşŘőŊŃÅ|ÅuÅnÅgÅ`ÅYÅRÅKÅDÅ=Å6Å/Å(Å!ÅÅÅ ÅÅþÄ÷ÄðÄéÄâÄÛÄÔÄÍÄÆÄ¿Ä¸Ä±ÄªÄ£ÄœÄ•ÄŽÄ‡Ä€ÄyÄrÄkÄdÄ]ÄVÄOÄHÄAÄ:Ä3Ä,Ä%ÄÄÄÄ ÄÄûÃôÃíÃæÃßÃØÃÑÃÊÃÃüõîçàÙÒËÄÃ}ÃvÃoÃhÃaÃZÃSÃLÃEÃ>Ã7Ã0Ã)Ã"ÃÃà ÃÃÿÂøÂñÂêÂãÂÜÂÕÂÎÂÇÂÀ¹²«¤Â–ˆÂÂzÂsÂlÂeÂ^ÂWÂPÂIÂBÂ;Â4Â-Â& ÂÂüÁõÁîÁçÁàÁÙÁÒÁËÁÄÁ½Á¶Á¯Á¨Á¡ÁšÁ“ÁŒÁ…Á~ÁwÁpÁiÁbÁ[ÁTÁMÁFÁ?Á8Á1Á*Á#ÁÁÁÁÁÁùÀòÀëÀäÀÝÀÖÀÏÀÈÀÁÀºÀ³À¬À¥ÀžÀ—ÀÀ‰À‚À{ÀtÀmÀfÀ_ÀXÀQÀJÀCÀ<À5À.À'À ÀÀÀ ÀÀý¿ö¿ï¿è¿á¿Ú¿Ó¿Ì¿Å¿¾¿·¿°¿©¿¢¿›¿”¿¿†¿¿x¿q¿j¿c¿\¿U¿N¿G¿@¿9¿2¿+¿$¿¿¿¿¿¿ú¾ó¾ì¾å¾Þ¾×¾оɾ¾»¾´¾­¾¦¾Ÿ¾˜¾‘¾оƒ¾|¾u¾n¾g¾`¾Y¾R¾K¾D¾=¾6¾/¾(¾!¾¾¾ ¾¾þ½÷½ð½é½â½Û½Ô½ͽƽ¿½¸½±½ª½£½œ½•½޽‡½€½y½r½k½d½]½V½O½H½A½:½3½,½%½½½½ ½½û¼ô¼í¼æ¼ß¼ؼѼʼü¼¼µ¼®¼§¼ ¼™¼’¼‹¼„¼}¼v¼o¼h¼a¼Z¼S¼L¼E¼>¼7¼0¼)¼"¼¼¼ ¼¼ÿ»ø»ñ»ê»ã»Ü»Õ»λÇ»À»¹»²»«»¤»»–»»ˆ»»z»s»l»e»^»W»P»I»B»;»4»-»&»»»» »»üºõºîºçºàºÙºÒº˺ĺ½º¶º¯º¨º¡ºšº“ºŒº…º~ºwºpºiºbº[ºTºMºFº?º8º1º*º#ººººººù¹ò¹ë¹ä¹ݹÖ¹ϹȹÁ¹º¹³¹¬¹¥¹ž¹—¹¹‰¹‚¹{¹t¹m¹f¹_¹X¹Q¹J¹C¹<¹5¹.¹'¹ ¹¹¹ ¹¹ý¸ö¸ï¸è¸á¸Ú¸Ó¸̸Ÿ¾¸·¸°¸©¸¢¸›¸”¸¸†¸¸x¸q¸j¸c¸\¸U¸N¸G¸@¸9¸2¸+¸$¸¸¸¸¸¸ú·ó·ì·å·Þ·×·зÉ··»·´·­·¦·Ÿ·˜·‘·Š·ƒ·|·u·n·g·`·Y·R·K·D·=·6·/·(·!··· ··þ¶÷¶ð¶é¶â¶Û¶Ô¶Ͷƶ¿¶¸¶±¶ª¶£¶œ¶•¶޶‡¶€¶y¶r¶k¶d¶]¶V¶O¶H¶A¶:¶3¶,¶%¶¶¶¶ ¶¶ûµôµíµæµßµصѵʵõ¼µµµ®µ§µ µ™µ’µ‹µ„µ}µvµoµhµaµZµSµLµEµ>µ7µ0µ)µ"µµµ µµÿ´ø´ñ´ê´ã´Ü´Õ´δÇ´À´¹´²´«´¤´´–´´ˆ´´z´s´l´e´^´W´P´I´B´;´4´-´&´´´´ ´´ü³õ³î³ç³à³Ù³Ò³˳ij½³¶³¯³¨³¡³š³“³Œ³…³~³w³p³i³b³[³T³M³F³?³8³1³*³#³³³³³³ù²ò²ë²ä²ݲÖ²ϲȲÁ²º²³²¬²¥²ž²—²²‰²‚²{²t²m²f²_²X²Q²J²C²<²5².²'² ²²² ²²ý±ö±ï±è±á±Ú±Ó±̱ű¾±·±°±©±¢±›±”±±†±±x±q±j±c±\±U±N±G±@±9±2±+±$±±±±±±ú°ó°ì°å°Þ°×°аɰ°»°´°­°¦°Ÿ°˜°‘°аƒ°|°u°n°g°`°Y°R°K°D°=°6°/°(°!°°° °°þ¯÷¯ð¯é¯â¯Û¯Ô¯ͯƯ¿¯¸¯±¯ª¯£¯œ¯•¯ޝ‡¯€¯y¯r¯k¯d¯]¯V¯O¯H¯A¯:¯3¯,¯%¯¯¯¯ ¯¯û®ô®í®æ®ß®Ø®Ñ®Ê®î¼®µ®®®§® ®™®’®‹®„®}®v®o®h®a®Z®S®L®E®>®7®0®)®"®®® ®®ÿ­ø­ñ­ê­ã­Ü­Õ­έÇ­À­¹­²­«­¤­­–­­ˆ­­z­s­l­e­^­W­P­I­B­;­4­-­&­­­­ ­­ü¬õ¬î¬ç¬à¬Ù¬Ò¬ˬĬ½¬¶¬¯¬¨¬¡¬š¬“¬Œ¬…¬~¬w¬p¬i¬b¬[¬T¬M¬F¬?¬8¬1¬*¬#¬¬¬¬¬¬ù«ò«ë«ä«Ý«Ö«Ï«È«Á«º«³«¬«¥«ž«—««‰«‚«{«t«m«f«_«X«Q«J«C«<«5«.«'« ««« ««ýªöªïªèªáªÚªÓª̪Ū¾ª·ª°ª©ª¢ª›ª”ªª†ªªxªqªjªcª\ªUªNªGª@ª9ª2ª+ª$ªªªªªªú©ó©ì©å©Þ©שЩÉ©©»©´©­©¦©Ÿ©˜©‘©Š©ƒ©|©u©n©g©`©Y©R©K©D©=©6©/©(©!©©© ©©þ¨÷¨ð¨é¨â¨Û¨Ô¨ͨƨ¿¨¸¨±¨ª¨£¨œ¨•¨ލ‡¨€¨y¨r¨k¨d¨]¨V¨O¨H¨A¨:¨3¨,¨%¨¨¨¨ ¨¨û§ô§í§æ§ß§اѧʧç¼§µ§®§§§ §™§’§‹§„§}§v§o§h§a§Z§S§L§E§>§7§0§)§"§§§ §§ÿ¦ø¦ñ¦ê¦ã¦ܦÕ¦ΦǦÀ¦¹¦²¦«¦¤¦¦–¦¦ˆ¦¦z¦s¦l¦e¦^¦W¦P¦I¦B¦;¦4¦-¦&¦¦¦¦ ¦¦ü¥õ¥î¥ç¥à¥Ù¥Ò¥Ë¥Ä¥½¥¶¥¯¥¨¥¡¥š¥“¥Œ¥…¥~¥w¥p¥i¥b¥[¥T¥M¥F¥?¥8¥1¥*¥#¥¥¥¥¥¥ù¤ò¤ë¤ä¤ݤÖ¤ϤȤÁ¤º¤³¤¬¤¥¤ž¤—¤¤‰¤‚¤{¤t¤m¤f¤_¤X¤Q¤J¤C¤<¤5¤.¤'¤ ¤¤¤ ¤¤ý£ö£ï£è£á£Ú£Ó£Ì£Å£¾£·£°£©£¢£›£”££†££x£q£j£c£\£U£N£G£@£9£2£+£$££££££ú¢ó¢ì¢å¢Þ¢×¢ТÉ¢¢»¢´¢­¢¦¢Ÿ¢˜¢‘¢Š¢ƒ¢|¢u¢n¢g¢`¢Y¢R¢K¢D¢=¢6¢/¢(¢!¢¢¢ ¢¢þ¡÷¡ð¡é¡â¡Û¡Ô¡Í¡Æ¡¿¡¸¡±¡ª¡£¡œ¡•¡Ž¡‡¡€¡y¡r¡k¡d¡]¡V¡O¡H¡A¡:¡3¡,¡%¡¡¡¡ ¡¡û ô í æ ß Ø Ñ Ê à¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿŸøŸñŸêŸãŸÜŸÕŸΟÇŸÀŸ¹Ÿ²Ÿ«Ÿ¤ŸŸ–ŸŸˆŸŸzŸsŸlŸeŸ^ŸWŸPŸIŸBŸ;Ÿ4Ÿ-Ÿ&ŸŸŸŸ ŸŸüžõžîžçžàžÙžÒžËžÄž½ž¶ž¯ž¨ž¡žšž“žŒž…ž~žwžpžižbž[žTžMžFž?ž8ž1ž*ž#žžžžžžùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýœöœïœèœáœÚœÓœÌœÅœ¾œ·œ°œ©œ¢œ›œ”œœ†œœxœqœjœcœ\œUœNœGœ@œ9œ2œ+œ$œœœœœœú›ó›ì›å›Þ›×›ЛÉ››»›´›­›¦›Ÿ›˜›‘›Š›ƒ›|›u›n›g›`›Y›R›K›D›=›6›/›(›!››› ››þš÷šðšéšâšÛšÔšÍšÆš¿š¸š±šªš£šœš•šŽš‡š€šyšrškšdš]šVšOšHšAš:š3š,š%šššš ššû™ô™í™æ™ß™Ø™Ñ™Ê™Ù¼™µ™®™§™ ™™™’™‹™„™}™v™o™h™a™Z™S™L™E™>™7™0™)™"™™™ ™™ÿ˜ø˜ñ˜ê˜ã˜ܘÕ˜ΘǘÀ˜¹˜²˜«˜¤˜˜–˜˜ˆ˜˜z˜s˜l˜e˜^˜W˜P˜I˜B˜;˜4˜-˜&˜˜˜˜ ˜˜ü—õ—î—ç—à—Ù—Ò—Ë—Ä—½—¶—¯—¨—¡—š—“—Œ—…—~—w—p—i—b—[—T—M—F—?—8—1—*—#——————ù–ò–ë–ä–Ý–Ö–Ï–È–Á–º–³–¬–¥–ž–—––‰–‚–{–t–m–f–_–X–Q–J–C–<–5–.–'– ––– ––ý•ö•ï•è•á•ڕӕ̕ŕ¾•·•°•©•¢•›•”••†••x•q•j•c•\•U•N•G•@•9•2•+•$••••••ú”ó”ì”å”Þ”×”ДÉ””»”´”­”¦”Ÿ”˜”‘”Š”ƒ”|”u”n”g”`”Y”R”K”D”=”6”/”(”!””” ””þ“÷“ð“é“â“ۓԓ͓Ɠ¿“¸“±“ª“£“œ“•“Ž“‡“€“y“r“k“d“]“V“O“H“A“:“3“,“%““““ ““û’ô’í’æ’ß’Ø’Ñ’Ê’Ã’¼’µ’®’§’ ’™’’’‹’„’}’v’o’h’a’Z’S’L’E’>’7’0’)’"’’’ ’’ÿ‘ø‘ñ‘ê‘ã‘ܑՑΑÇ‘À‘¹‘²‘«‘¤‘‘–‘‘ˆ‘‘z‘s‘l‘e‘^‘W‘P‘I‘B‘;‘4‘-‘&‘‘‘‘ ‘‘üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŽöŽïŽèŽáŽÚŽÓŽÌŽÅŽ¾Ž·Ž°Ž©Ž¢Ž›Ž”ŽŽ†ŽŽxŽqŽjŽcŽ\ŽUŽNŽGŽ@Ž9Ž2Ž+Ž$ŽŽŽŽŽŽúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŒ÷ŒðŒéŒâŒÛŒÔŒÍŒÆŒ¿Œ¸Œ±ŒªŒ£ŒœŒ•ŒŽŒ‡Œ€ŒyŒrŒkŒdŒ]ŒVŒOŒHŒAŒ:Œ3Œ,Œ%ŒŒŒŒ ŒŒû‹ô‹í‹æ‹ß‹Ø‹Ñ‹Ê‹Ë¼‹µ‹®‹§‹ ‹™‹’‹‹‹„‹}‹v‹o‹h‹a‹Z‹S‹L‹E‹>‹7‹0‹)‹"‹‹‹ ‹‹ÿŠøŠñŠêŠãŠÜŠÕŠΊÇŠÀŠ¹Š²Š«Š¤ŠŠ–ŠŠˆŠŠzŠsŠlŠeŠ^ŠWŠPŠIŠBŠ;Š4Š-Š&ŠŠŠŠ ŠŠü‰õ‰î‰ç‰à‰Ù‰Ò‰ˉĉ½‰¶‰¯‰¨‰¡‰š‰“‰Œ‰…‰~‰w‰p‰i‰b‰[‰T‰M‰F‰?‰8‰1‰*‰#‰‰‰‰‰‰ùˆòˆëˆäˆ݈ÖˆψȈÁˆºˆ³ˆ¬ˆ¥ˆžˆ—ˆˆ‰ˆ‚ˆ{ˆtˆmˆfˆ_ˆXˆQˆJˆCˆ<ˆ5ˆ.ˆ'ˆ ˆˆˆ ˆˆý‡ö‡ï‡è‡á‡Ú‡Ó‡̇Ň¾‡·‡°‡©‡¢‡›‡”‡‡†‡‡x‡q‡j‡c‡\‡U‡N‡G‡@‡9‡2‡+‡$‡‡‡‡‡‡ú†ó†ì†å†Þ†׆ІɆ†»†´†­†¦†Ÿ†˜†‘†Іƒ†|†u†n†g†`†Y†R†K†D†=†6†/†(†!††† ††þ…÷…ð…é…â…Û…Ô…Í…Æ…¿…¸…±…ª…£…œ…•…Ž…‡…€…y…r…k…d…]…V…O…H…A…:…3…,…%………… ……û„ô„í„æ„߄؄фʄ„®„§„ „™„’„‹„„„}„v„o„h„a„Z„S„L„E„>„7„0„)„"„„„ „„ÿƒøƒñƒêƒãƒ܃Õƒ΃ǃÀƒ¹ƒ²ƒ«ƒ¤ƒƒ–ƒƒˆƒƒzƒsƒlƒeƒ^ƒWƒPƒIƒBƒ;ƒ4ƒ-ƒ&ƒƒƒƒ ƒƒü‚õ‚î‚ç‚à‚ق҂˂Ă½‚¶‚¯‚¨‚¡‚š‚“‚Œ‚…‚~‚w‚p‚i‚b‚[‚T‚M‚F‚?‚8‚1‚*‚#‚‚‚‚‚‚ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý€ö€ï€è€á€Ú€Ó€Ì€Å€¾€·€°€©€¢€›€”€€†€€x€q€j€c€\€U€N€G€@€9€2€+€$€€€€€€úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ~÷~ð~é~â~Û~Ô~Í~Æ~¿~¸~±~ª~£~œ~•~Ž~‡~€~y~r~k~d~]~V~O~H~A~:~3~,~%~~~~ ~~û}ô}í}æ}ß}Ø}Ñ}Ê}Ã}¼}µ}®}§} }™}’}‹}„}}}v}o}h}a}Z}S}L}E}>}7}0})}"}}} }}ÿ|ø|ñ|ê|ã|Ü|Õ|Î|Ç|À|¹|²|«|¤||–||ˆ||z|s|l|e|^|W|P|I|B|;|4|-|&|||| ||ü{õ{î{ç{à{Ù{Ò{Ë{Ä{½{¶{¯{¨{¡{š{“{Œ{…{~{w{p{i{b{[{T{M{F{?{8{1{*{#{{{{{{ùzòzëzäzÝzÖzÏzÈzÁzºz³z¬z¥zžz—zz‰z‚z{ztzmzfz_zXzQzJzCzv7v0v)v"vvv vvÿuøuñuêuãuÜuÕuÎuÇuÀu¹u²u«u¤uu–uuˆuuzusulueu^uWuPuIuBu;u4u-u&uuuu uuütõtîtçtàtÙtÒtËtÄt½t¶t¯t¨t¡tšt“tŒt…t~twtptitbt[tTtMtFt?t8t1t*t#ttttttùsòsësäsÝsÖsÏsÈsÁsºs³s¬s¥sžs—ss‰s‚s{stsmsfs_sXsQsJsCso7o0o)o"ooo ooÿnønñnênãnÜnÕnÎnÇnÀn¹n²n«n¤nn–nnˆnnznsnlnen^nWnPnInBn;n4n-n&nnnn nnümõmîmçmàmÙmÒmËmÄm½m¶m¯m¨m¡mšm“mŒm…m~mwmpmimbm[mTmMmFm?m8m1m*m#mmmmmmùlòlëlälÝlÖlÏlÈlÁlºl³l¬l¥lžl—ll‰l‚l{ltlmlfl_lXlQlJlClh7h0h)h"hhh hhÿgøgñgêgãgÜgÕgÎgÇgÀg¹g²g«g¤gg–ggˆggzgsglgeg^gWgPgIgBg;g4g-g&gggg ggüfõfîfçfàfÙfÒfËfÄf½f¶f¯f¨f¡fšf“fŒf…f~fwfpfifbf[fTfMfFf?f8f1f*f#ffffffùeòeëeäeÝeÖeÏeÈeÁeºe³e¬e¥eže—ee‰e‚e{etemefe_eXeQeJeCea7a0a)a"aaa aaÿ`ø`ñ`ê`ã`Ü`Õ`Î`Ç`À`¹`²`«`¤``–``ˆ``z`s`l`e`^`W`P`I`B`;`4`-`&```` ``ü_õ_î_ç_à_Ù_Ò_Ë_Ä_½_¶_¯_¨_¡_š_“_Œ_…_~_w_p_i_b_[_T_M_F_?_8_1_*_#______ù^ò^ë^ä^Ý^Ö^Ï^È^Á^º^³^¬^¥^ž^—^^‰^‚^{^t^m^f^_^X^Q^J^C^<^5^.^'^ ^^^ ^^ý]ö]ï]è]á]Ú]Ó]Ì]Å]¾]·]°]©]¢]›]”]]†]]x]q]j]c]\]U]N]G]@]9]2]+]$]]]]]]ú\ó\ì\å\Þ\×\Ð\É\Â\»\´\­\¦\Ÿ\˜\‘\Š\ƒ\|\u\n\g\`\Y\R\K\D\=\6\/\(\!\\\ \\þ[÷[ð[é[â[Û[Ô[Í[Æ[¿[¸[±[ª[£[œ[•[Ž[‡[€[y[r[k[d[][V[O[H[A[:[3[,[%[[[[ [[ûZôZíZæZßZØZÑZÊZÃZ¼ZµZ®Z§Z Z™Z’Z‹Z„Z}ZvZoZhZaZZZSZLZEZ>Z7Z0Z)Z"ZZZ ZZÿYøYñYêYãYÜYÕYÎYÇYÀY¹Y²Y«Y¤YY–YYˆYYzYsYlYeY^YWYPYIYBY;Y4Y-Y&YYYY YYüXõXîXçXàXÙXÒXËXÄX½X¶X¯X¨X¡XšX“XŒX…X~XwXpXiXbX[XTXMXFX?X8X1X*X#XXXXXXùWòWëWäWÝWÖWÏWÈWÁWºW³W¬W¥WžW—WW‰W‚W{WtWmWfW_WXWQWJWCWS7S0S)S"SSS SSÿRøRñRêRãRÜRÕRÎRÇRÀR¹R²R«R¤RR–RRˆRRzRsRlReR^RWRPRIRBR;R4R-R&RRRR RRüQõQîQçQàQÙQÒQËQÄQ½Q¶Q¯Q¨Q¡QšQ“QŒQ…Q~QwQpQiQbQ[QTQMQFQ?Q8Q1Q*Q#QQQQQQùPòPëPäPÝPÖPÏPÈPÁPºP³P¬P¥PžP—PP‰P‚P{PtPmPfP_PXPQPJPCPL7L0L)L"LLL LLÿKøKñKêKãKÜKÕKÎKÇKÀK¹K²K«K¤KK–KKˆKKzKsKlKeK^KWKPKIKBK;K4K-K&KKKK KKüJõJîJçJàJÙJÒJËJÄJ½J¶J¯J¨J¡JšJ“JŒJ…J~JwJpJiJbJ[JTJMJFJ?J8J1J*J#JJJJJJùIòIëIäIÝIÖIÏIÈIÁIºI³I¬I¥IžI—II‰I‚I{ItImIfI_IXIQIJICIE7E0E)E"EEE EEÿDøDñDêDãDÜDÕDÎDÇDÀD¹D²D«D¤DD–DDˆDDzDsDlDeD^DWDPDIDBD;D4D-D&DDDD DDüCõCîCçCàCÙCÒCËCÄC½C¶C¯C¨C¡CšC“CŒC…C~CwCpCiCbC[CTCMCFC?C8C1C*C#CCCCCCùBòBëBäBÝBÖBÏBÈBÁBºB³B¬B¥BžB—BB‰B‚B{BtBmBfB_BXBQBJBCBô>í>æ>ß>Ø>Ñ>Ê>Ã>¼>µ>®>§> >™>’>‹>„>}>v>o>h>a>Z>S>L>E>>>7>0>)>">>> >>ÿ=ø=ñ=ê=ã=Ü=Õ=Î=Ç=À=¹=²=«=¤==–==ˆ==z=s=l=e=^=W=P=I=B=;=4=-=&==== ==ü<õ<î<ç<à<Ù<Ò<Ë<Ä<½<¶<¯<¨<¡<š<“<Œ<…<~<w<p<i<b<[<T<M<F<?<8<1<*<#<<<<<<ù;ò;ë;ä;Ý;Ö;Ï;È;Á;º;³;¬;¥;ž;—;;‰;‚;{;t;m;f;_;X;Q;J;C;<;5;.;'; ;;; ;;ý:ö:ï:è:á:Ú:Ó:Ì:Å:¾:·:°:©:¢:›:”::†::x:q:j:c:\:U:N:G:@:9:2:+:$::::::ú9ó9ì9å9Þ9×9Ð9É9Â9»9´9­9¦9Ÿ9˜9‘9Š9ƒ9|9u9n9g9`9Y9R9K9D9=969/9(9!999 99þ8÷8ð8é8â8Û8Ô8Í8Æ8¿8¸8±8ª8£8œ8•8Ž8‡8€8y8r8k8d8]8V8O8H8A8:838,8%8888 88û7ô7í7æ7ß7Ø7Ñ7Ê7Ã7¼7µ7®7§7 7™7’7‹7„7}7v7o7h7a7Z7S7L7E7>77707)7"777 77ÿ6ø6ñ6ê6ã6Ü6Õ6Î6Ç6À6¹6²6«6¤66–66ˆ66z6s6l6e6^6W6P6I6B6;646-6&6666 66ü5õ5î5ç5à5Ù5Ò5Ë5Ä5½5¶5¯5¨5¡5š5“5Œ5…5~5w5p5i5b5[5T5M5F5?58515*5#555555ù4ò4ë4ä4Ý4Ö4Ï4È4Á4º4³4¬4¥4ž4—44‰4‚4{4t4m4f4_4X4Q4J4C4<454.4'4 444 44ý3ö3ï3è3á3Ú3Ó3Ì3Å3¾3·3°3©3¢3›3”33†33x3q3j3c3\3U3N3G3@39323+3$333333ú2ó2ì2å2Þ2×2Ð2É2Â2»2´2­2¦2Ÿ2˜2‘2Š2ƒ2|2u2n2g2`2Y2R2K2D2=262/2(2!222 22þ1÷1ð1é1â1Û1Ô1Í1Æ1¿1¸1±1ª1£1œ1•1Ž1‡1€1y1r1k1d1]1V1O1H1A1:131,1%1111 11û0ô0í0æ0ß0Ø0Ñ0Ê0Ã0¼0µ0®0§0 0™0’0‹0„0}0v0o0h0a0Z0S0L0E0>07000)0"000 00ÿ/ø/ñ/ê/ã/Ü/Õ/Î/Ç/À/¹/²/«/¤//–//ˆ//z/s/l/e/^/W/P/I/B/;/4/-/&//// //ü.õ.î.ç.à.Ù.Ò.Ë.Ä.½.¶.¯.¨.¡.š.“.Œ.….~.w.p.i.b.[.T.M.F.?.8.1.*.#......ù-ò-ë-ä-Ý-Ö-Ï-È-Á-º-³-¬-¥-ž-—--‰-‚-{-t-m-f-_-X-Q-J-C-<-5-.-'- --- --ý,ö,ï,è,á,Ú,Ó,Ì,Å,¾,·,°,©,¢,›,”,,†,,x,q,j,c,\,U,N,G,@,9,2,+,$,,,,,,ú+ó+ì+å+Þ+×+Ð+É+Â+»+´+­+¦+Ÿ+˜+‘+Š+ƒ+|+u+n+g+`+Y+R+K+D+=+6+/+(+!+++ ++þ*÷*ð*é*â*Û*Ô*Í*Æ*¿*¸*±*ª*£*œ*•*Ž*‡*€*y*r*k*d*]*V*O*H*A*:*3*,*%**** **û)ô)í)æ)ß)Ø)Ñ)Ê)Ã)¼)µ)®)§) )™)’)‹)„)})v)o)h)a)Z)S)L)E)>)7)0)))"))) ))ÿ(ø(ñ(ê(ã(Ü(Õ(Î(Ç(À(¹(²(«(¤((–((ˆ((z(s(l(e(^(W(P(I(B(;(4(-(&(((( ((ü'õ'î'ç'à'Ù'Ò'Ë'Ä'½'¶'¯'¨'¡'š'“'Œ'…'~'w'p'i'b'['T'M'F'?'8'1'*'#''''''ù&ò&ë&ä&Ý&Ö&Ï&È&Á&º&³&¬&¥&ž&—&&‰&‚&{&t&m&f&_&X&Q&J&C&<&5&.&'& &&& &&ý%ö%ï%è%á%Ú%Ó%Ì%Å%¾%·%°%©%¢%›%”%%†%%x%q%j%c%\%U%N%G%@%9%2%+%$%%%%%%ú$ó$ì$å$Þ$×$Ð$É$Â$»$´$­$¦$Ÿ$˜$‘$Š$ƒ$|$u$n$g$`$Y$R$K$D$=$6$/$($!$$$ $$þ#÷#ð#é#â#Û#Ô#Í#Æ#¿#¸#±#ª#£#œ#•#Ž#‡#€#y#r#k#d#]#V#O#H#A#:#3#,#%#### ##û"ô"í"æ"ß"Ø"Ñ"Ê"Ã"¼"µ"®"§" "™"’"‹"„"}"v"o"h"a"Z"S"L"E">"7"0")""""" ""ÿ!ø!ñ!ê!ã!Ü!Õ!Î!Ç!À!¹!²!«!¤!!–!!ˆ!!z!s!l!e!^!W!P!I!B!;!4!-!&!!!! !!ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûÿôÿíÿæÿßÿØÿÑÿÊÿÃÿ¼ÿµÿ®ÿ§ÿ ÿ™ÿ’ÿ‹ÿ„ÿ}ÿvÿoÿhÿaÿZÿSÿLÿEÿ>ÿ7ÿ0ÿ)ÿ"ÿÿÿ ÿÿÿþøþñþêþãþÜþÕþÎþÇþÀþ¹þ²þ«þ¤þþ–þþˆþþzþsþlþeþ^þWþPþIþBþ;þ4þ-þ&þþþþ þþüýõýîýçýàýÙýÒýËýÄý½ý¶ý¯ý¨ý¡ýšý“ýŒý…ý~ýwýpýiýbý[ýTýMýFý?ý8ý1ý*ý#ýýýýýýùüòüëüäüÝüÖüÏüÈüÁüºü³ü¬ü¥üžü—üü‰ü‚ü{ütümüfü_üXüQüJüCü<ü5ü.ü'ü üüü üüýûöûïûèûáûÚûÓûÌûÅû¾û·û°û©û¢û›û”ûû†ûûxûqûjûcû\ûUûNûGû@û9û2û+û$ûûûûûûúúóúìúåúÞú×úÐúÉúÂú»ú´ú­ú¦úŸú˜ú‘úŠúƒú|úuúnúgú`úYúRúKúDú=ú6ú/ú(ú!úúú úúþù÷ùðùéùâùÛùÔùÍùÆù¿ù¸ù±ùªù£ùœù•ùŽù‡ù€ùyùrùkùdù]ùVùOùHùAù:ù3ù,ù%ùùùù ùùûøôøíøæøßøØøÑøÊøÃø¼øµø®ø§ø ø™ø’ø‹ø„ø}øvøoøhøaøZøSøLøEø>ø7ø0ø)ø"øøø øøÿ÷ø÷ñ÷ê÷ã÷Ü÷Õ÷Î÷Ç÷À÷¹÷²÷«÷¤÷÷–÷÷ˆ÷÷z÷s÷l÷e÷^÷W÷P÷I÷B÷;÷4÷-÷&÷÷÷÷ ÷÷üöõöîöçöàöÙöÒöËöÄö½ö¶ö¯ö¨ö¡öšö“öŒö…ö~öwöpöiöbö[öTöMöFö?ö8ö1ö*ö#ööööööùõòõëõäõÝõÖõÏõÈõÁõºõ³õ¬õ¥õžõ—õõ‰õ‚õ{õtõmõfõ_õXõQõJõCõ<õ5õ.õ'õ õõõ õõýôöôïôèôáôÚôÓôÌôÅô¾ô·ô°ô©ô¢ô›ô”ôô†ôôxôqôjôcô\ôUôNôGô@ô9ô2ô+ô$ôôôôôôúóóóìóåóÞó×óÐóÉóÂó»ó´ó­ó¦óŸó˜ó‘óŠóƒó|óuónógó`óYóRóKóDó=ó6ó/ó(ó!óóó óóþò÷òðòéòâòÛòÔòÍòÆò¿ò¸ò±òªò£òœò•òŽò‡ò€òyòròkòdò]òVòOòHòAò:ò3ò,ò%òòòò òòûñôñíñæñßñØñÑñÊñÃñ¼ñµñ®ñ§ñ ñ™ñ’ñ‹ñ„ñ}ñvñoñhñañZñSñLñEñ>ñ7ñ0ñ)ñ"ñññ ññÿðøðñðêðãðÜðÕðÎðÇðÀð¹ð²ð«ð¤ðð–ððˆððzðsðlðeð^ðWðPðIðBð;ð4ð-ð&ðððð ððüïõïîïçïàïÙïÒïËïÄï½ï¶ï¯ï¨ï¡ïšï“ïŒï…ï~ïwïpïiïbï[ïTïMïFï?ï8ï1ï*ï#ïïïïïïùîòîëîäîÝîÖîÏîÈîÁîºî³î¬î¥îžî—îî‰î‚î{îtîmîfî_îXîQîJîCî<î5î.î'î îîî îîýíöíïíèíáíÚíÓíÌíÅí¾í·í°í©í¢í›í”íí†ííxíqíjící\íUíNíGí@í9í2í+í$ííííííúìóìììåìÞì×ìÐìÉìÂì»ì´ì­ì¦ìŸì˜ì‘ìŠìƒì|ìuìnìgì`ìYìRìKìDì=ì6ì/ì(ì!ììì ììþë÷ëðëéëâëÛëÔëÍëÆë¿ë¸ë±ëªë£ëœë•ëŽë‡ë€ëyërëkëdë]ëVëOëHëAë:ë3ë,ë%ëëëë ëëûêôêíêæêßêØêÑêÊêÃê¼êµê®ê§ê ê™ê’ê‹ê„ê}êvêoêhêaêZêSêLêEê>ê7ê0ê)ê"êêê êêÿéøéñéêéãéÜéÕéÎéÇéÀé¹é²é«é¤éé–ééˆéézéséléeé^éWéPéIéBé;é4é-é&éééé ééüèõèîèçèàèÙèÒèËèÄè½è¶è¯è¨è¡èšè“èŒè…è~èwèpèièbè[èTèMèFè?è8è1è*è#èèèèèèùçòçëçäçÝçÖçÏçÈçÁçºç³ç¬ç¥çžç—çç‰ç‚ç{çtçmçfç_çXçQçJçCç<ç5ç.ç'ç ççç ççýæöæïæèæáæÚæÓæÌæÅæ¾æ·æ°æ©æ¢æ›æ”ææ†ææxæqæjæcæ\æUæNæGæ@æ9æ2æ+æ$ææææææúåóåìåååÞå×åÐåÉåÂå»å´å­å¦åŸå˜å‘åŠåƒå|åuånågå`åYåRåKåDå=å6å/å(å!ååå ååþä÷äðäéäâäÛäÔäÍäÆä¿ä¸ä±äªä£äœä•äŽä‡ä€äyäräkädä]äVäOäHäAä:ä3ä,ä%ääää ääûãôãíãæãßãØãÑãÊãÃã¼ãµã®ã§ã ã™ã’ã‹ã„ã}ãvãoãhãaãZãSãLãEã>ã7ã0ã)ã"ããã ããÿâøâñâêâãâÜâÕâÎâÇâÀâ¹â²â«â¤ââ–ââˆââzâsâlâeâ^âWâPâIâBâ;â4â-â&ââââ ââüáõáîáçáàáÙáÒáËáÄá½á¶á¯á¨á¡ášá“áŒá…á~áwápáiábá[áTáMáFá?á8á1á*á#ááááááùàòàëàäàÝàÖàÏàÈàÁàºà³à¬à¥àžà—àà‰à‚à{àtàmàfà_àXàQàJàCà<à5à.à'à ààà ààýßößïßèßáßÚßÓßÌßÅ߾߷߰ߩߢߛߔß߆ßßxßqßjßcß\ßUßNßGß@ß9ß2ß+ß$ßßßßßßúÞóÞìÞåÞÞÞ×ÞÐÞÉÞÂÞ»Þ´Þ­Þ¦ÞŸÞ˜Þ‘ÞŠÞƒÞ|ÞuÞnÞgÞ`ÞYÞRÞKÞDÞ=Þ6Þ/Þ(Þ!ÞÞÞ ÞÞþÝ÷ÝðÝéÝâÝÛÝÔÝÍÝÆÝ¿Ý¸Ý±ÝªÝ£ÝœÝ•ÝŽÝ‡Ý€ÝyÝrÝkÝdÝ]ÝVÝOÝHÝAÝ:Ý3Ý,Ý%ÝÝÝÝ ÝÝûÜôÜíÜæÜßÜØÜÑÜÊÜÃܼܵܮܧܠܙܒ܋܄Ü}ÜvÜoÜhÜaÜZÜSÜLÜEÜ>Ü7Ü0Ü)Ü"ÜÜÜ ÜÜÿÛøÛñÛêÛãÛÜÛÕÛÎÛÇÛÀÛ¹Û²Û«Û¤ÛÛ–ÛÛˆÛÛzÛsÛlÛeÛ^ÛWÛPÛIÛBÛ;Û4Û-Û&ÛÛÛÛ ÛÛüÚõÚîÚçÚàÚÙÚÒÚËÚÄڽڶگڨڡښړڌڅÚ~ÚwÚpÚiÚbÚ[ÚTÚMÚFÚ?Ú8Ú1Ú*Ú#ÚÚÚÚÚÚùÙòÙëÙäÙÝÙÖÙÏÙÈÙÁٺٳ٬٥ٞٗÙىقÙ{ÙtÙmÙfÙ_ÙXÙQÙJÙCÙ<Ù5Ù.Ù'Ù ÙÙÙ ÙÙýØöØïØèØáØÚØÓØÌØÅØ¾Ø·Ø°Ø©Ø¢Ø›Ø”ØØ†ØØxØqØjØcØ\ØUØNØGØ@Ø9Ø2Ø+Ø$ØØØØØØú×ó×ì×å×Þ×××Ð×É×Â׻״׭צןטב׊׃×|×u×n×g×`×Y×R×K×D×=×6×/×(×!××× ××þÖ÷ÖðÖéÖâÖÛÖÔÖÍÖÆÖ¿Ö¸Ö±ÖªÖ£ÖœÖ•ÖŽÖ‡Ö€ÖyÖrÖkÖdÖ]ÖVÖOÖHÖAÖ:Ö3Ö,Ö%ÖÖÖÖ ÖÖûÕôÕíÕæÕßÕØÕÑÕÊÕÃÕ¼ÕµÕ®Õ§Õ Õ™Õ’Õ‹Õ„Õ}ÕvÕoÕhÕaÕZÕSÕLÕEÕ>Õ7Õ0Õ)Õ"ÕÕÕ ÕÕÿÔøÔñÔêÔãÔÜÔÕÔÎÔÇÔÀÔ¹Ô²Ô«Ô¤ÔÔ–ÔÔˆÔÔzÔsÔlÔeÔ^ÔWÔPÔIÔBÔ;Ô4Ô-Ô&ÔÔÔÔ ÔÔüÓõÓîÓçÓàÓÙÓÒÓËÓÄӽӶӯӨӡӚӓӌӅÓ~ÓwÓpÓiÓbÓ[ÓTÓMÓFÓ?Ó8Ó1Ó*Ó#ÓÓÓÓÓÓùÒòÒëÒäÒÝÒÖÒÏÒÈÒÁÒºÒ³Ò¬Ò¥ÒžÒ—ÒÒ‰Ò‚Ò{ÒtÒmÒfÒ_ÒXÒQÒJÒCÒ<Ò5Ò.Ò'Ò ÒÒÒ ÒÒýÑöÑïÑèÑáÑÚÑÓÑÌÑÅѾѷѰѩѢћєÑцÑÑxÑqÑjÑcÑ\ÑUÑNÑGÑ@Ñ9Ñ2Ñ+Ñ$ÑÑÑÑÑÑúÐóÐìÐåÐÞÐ×ÐÐÐÉÐÂлдЭЦПИБЊЃÐ|ÐuÐnÐgÐ`ÐYÐRÐKÐDÐ=Ð6Ð/Ð(Ð!ÐÐÐ ÐÐþÏ÷ÏðÏéÏâÏÛÏÔÏÍÏÆÏ¿Ï¸Ï±ÏªÏ£ÏœÏ•ÏŽÏ‡Ï€ÏyÏrÏkÏdÏ]ÏVÏOÏHÏAÏ:Ï3Ï,Ï%ÏÏÏÏ ÏÏûÎôÎíÎæÎßÎØÎÑÎÊÎÃμεήΧΠΙΒ΋΄Î}ÎvÎoÎhÎaÎZÎSÎLÎEÎ>Î7Î0Î)Î"ÎÎÎ ÎÎÿÍøÍñÍêÍãÍÜÍÕÍÎÍÇÍÀ͹ͲͫͤÍÍ–Í͈ÍÍzÍsÍlÍeÍ^ÍWÍPÍIÍBÍ;Í4Í-Í&ÍÍÍÍ ÍÍüÌõÌîÌçÌàÌÙÌÒÌËÌĄ̶̡̯̈̽̓̌̅̚Ì~ÌwÌpÌiÌbÌ[ÌTÌMÌFÌ?Ì8Ì1Ì*Ì#ÌÌÌÌÌÌùËòËëËäËÝËÖËÏËÈËÁ˺˳ˬ˥˞˗Ëˉ˂Ë{ËtËmËfË_ËXËQËJËCË<Ë5Ë.Ë'Ë ËËË ËËýÊöÊïÊèÊáÊÚÊÓÊÌÊÅʾʷʰʩʢʛʔÊʆÊÊxÊqÊjÊcÊ\ÊUÊNÊGÊ@Ê9Ê2Ê+Ê$ÊÊÊÊÊÊúÉóÉìÉåÉÞÉ×ÉÐÉÉÉÂɻɴɭɦɟɘɑɊɃÉ|ÉuÉnÉgÉ`ÉYÉRÉKÉDÉ=É6É/É(É!ÉÉÉ ÉÉþÈ÷ÈðÈéÈâÈÛÈÔÈÍÈÆÈ¿È¸È±ÈªÈ£ÈœÈ•ÈŽÈ‡È€ÈyÈrÈkÈdÈ]ÈVÈOÈHÈAÈ:È3È,È%ÈÈÈÈ ÈÈûÇôÇíÇæÇßÇØÇÑÇÊÇÃǼǵǮǧǠǙǒNjDŽÇ}ÇvÇoÇhÇaÇZÇSÇLÇEÇ>Ç7Ç0Ç)Ç"ÇÇÇ ÇÇÿÆøÆñÆêÆãÆÜÆÕÆÎÆÇÆÀÆ¹Æ²Æ«Æ¤ÆÆ–ÆÆˆÆÆzÆsÆlÆeÆ^ÆWÆPÆIÆBÆ;Æ4Æ-Æ&ÆÆÆÆ ÆÆüÅõÅîÅçÅàÅÙÅÒÅËÅÄŽŶůŨšŚœŌŅÅ~ÅwÅpÅiÅbÅ[ÅTÅMÅFÅ?Å8Å1Å*Å#ÅÅÅÅÅÅùÄòÄëÄäÄÝÄÖÄÏÄÈÄÁĺijĬĥĞėÄĉĂÄ{ÄtÄmÄfÄ_ÄXÄQÄJÄCÄ<Ä5Ä.Ä'Ä ÄÄÄ ÄÄýÃöÃïÃèÃáÃÚÃÓÃÌÃÅþ÷ðéâÛÔÃÆÃÃxÃqÃjÃcÃ\ÃUÃNÃGÃ@Ã9Ã2Ã+Ã$ÃÃÃÃÃÃúÂóÂìÂåÂÞÂ×ÂÐÂÉ»´­¦Ÿ˜‘ŠƒÂ|ÂuÂnÂgÂ`ÂYÂRÂKÂDÂ=Â6Â/Â(Â! ÂÂþÁ÷ÁðÁéÁâÁÛÁÔÁÍÁÆÁ¿Á¸Á±ÁªÁ£ÁœÁ•ÁŽÁ‡Á€ÁyÁrÁkÁdÁ]ÁVÁOÁHÁAÁ:Á3Á,Á%ÁÁÁÁ ÁÁûÀôÀíÀæÀßÀØÀÑÀÊÀÃÀ¼ÀµÀ®À§À À™À’À‹À„À}ÀvÀoÀhÀaÀZÀSÀLÀEÀ>À7À0À)À"ÀÀÀ ÀÀÿ¿ø¿ñ¿ê¿ã¿Ü¿Õ¿οÇ¿À¿¹¿²¿«¿¤¿¿–¿¿ˆ¿¿z¿s¿l¿e¿^¿W¿P¿I¿B¿;¿4¿-¿&¿¿¿¿ ¿¿ü¾õ¾î¾ç¾à¾Ù¾Ò¾˾ľ½¾¶¾¯¾¨¾¡¾š¾“¾Œ¾…¾~¾w¾p¾i¾b¾[¾T¾M¾F¾?¾8¾1¾*¾#¾¾¾¾¾¾ù½ò½ë½ä½ݽÖ½ϽȽÁ½º½³½¬½¥½ž½—½½‰½‚½{½t½m½f½_½X½Q½J½C½<½5½.½'½ ½½½ ½½ý¼ö¼ï¼è¼á¼Ú¼Ó¼̼ż¾¼·¼°¼©¼¢¼›¼”¼¼†¼¼x¼q¼j¼c¼\¼U¼N¼G¼@¼9¼2¼+¼$¼¼¼¼¼¼ú»ó»ì»å»Þ»×»лÉ»»»»´»­»¦»Ÿ»˜»‘»Š»ƒ»|»u»n»g»`»Y»R»K»D»=»6»/»(»!»»» »»þº÷ºðºéºâºÛºÔºͺƺ¿º¸º±ºªº£ºœº•ºŽº‡º€ºyºrºkºdº]ºVºOºHºAº:º3º,º%ºººº ººû¹ô¹í¹æ¹ß¹عѹʹù¼¹µ¹®¹§¹ ¹™¹’¹‹¹„¹}¹v¹o¹h¹a¹Z¹S¹L¹E¹>¹7¹0¹)¹"¹¹¹ ¹¹ÿ¸ø¸ñ¸ê¸ã¸ܸÕ¸θǸÀ¸¹¸²¸«¸¤¸¸–¸¸ˆ¸¸z¸s¸l¸e¸^¸W¸P¸I¸B¸;¸4¸-¸&¸¸¸¸ ¸¸ü·õ·î·ç·à·Ù·Ò·Ë·Ä·½·¶·¯·¨·¡·š·“·Œ·…·~·w·p·i·b·[·T·M·F·?·8·1·*·#······ù¶ò¶ë¶ä¶ݶÖ¶϶ȶÁ¶º¶³¶¬¶¥¶ž¶—¶¶‰¶‚¶{¶t¶m¶f¶_¶X¶Q¶J¶C¶<¶5¶.¶'¶ ¶¶¶ ¶¶ýµöµïµèµáµÚµÓµ̵ŵ¾µ·µ°µ©µ¢µ›µ”µµ†µµxµqµjµcµ\µUµNµGµ@µ9µ2µ+µ$µµµµµµú´ó´ì´å´Þ´×´дÉ´´»´´´­´¦´Ÿ´˜´‘´Š´ƒ´|´u´n´g´`´Y´R´K´D´=´6´/´(´!´´´ ´´þ³÷³ð³é³â³Û³Ô³ͳƳ¿³¸³±³ª³£³œ³•³޳‡³€³y³r³k³d³]³V³O³H³A³:³3³,³%³³³³ ³³û²ô²í²æ²ß²زѲʲò¼²µ²®²§² ²™²’²‹²„²}²v²o²h²a²Z²S²L²E²>²7²0²)²"²²² ²²ÿ±ø±ñ±ê±ã±ܱÕ±αDZÀ±¹±²±«±¤±±–±±ˆ±±z±s±l±e±^±W±P±I±B±;±4±-±&±±±± ±±ü°õ°î°ç°à°Ù°Ò°˰ݽ°¶°¯°¨°¡°š°“°Œ°…°~°w°p°i°b°[°T°M°F°?°8°1°*°#°°°°°°ù¯ò¯ë¯ä¯ݯÖ¯ϯȯÁ¯º¯³¯¬¯¥¯ž¯—¯¯‰¯‚¯{¯t¯m¯f¯_¯X¯Q¯J¯C¯<¯5¯.¯'¯ ¯¯¯ ¯¯ý®ö®ï®è®á®Ú®Ó®Ì®Å®¾®·®°®©®¢®›®”®®†®®x®q®j®c®\®U®N®G®@®9®2®+®$®®®®®®ú­ó­ì­å­Þ­×­ЭÉ­­»­´­­­¦­Ÿ­˜­‘­Š­ƒ­|­u­n­g­`­Y­R­K­D­=­6­/­(­!­­­ ­­þ¬÷¬ð¬é¬â¬Û¬Ô¬ͬƬ¿¬¸¬±¬ª¬£¬œ¬•¬ެ‡¬€¬y¬r¬k¬d¬]¬V¬O¬H¬A¬:¬3¬,¬%¬¬¬¬ ¬¬û«ô«í«æ«ß«Ø«Ñ«Ê«ë¼«µ«®«§« «™«’«‹«„«}«v«o«h«a«Z«S«L«E«>«7«0«)«"««« ««ÿªøªñªêªãªܪÕªΪǪÀª¹ª²ª«ª¤ªª–ªªˆªªzªsªlªeª^ªWªPªIªBª;ª4ª-ª&ªªªª ªªü©õ©î©ç©à©Ù©Ò©Ë©Ä©½©¶©¯©¨©¡©š©“©Œ©…©~©w©p©i©b©[©T©M©F©?©8©1©*©#©©©©©©ù¨ò¨ë¨ä¨ݨÖ¨ϨȨÁ¨º¨³¨¬¨¥¨ž¨—¨¨‰¨‚¨{¨t¨m¨f¨_¨X¨Q¨J¨C¨<¨5¨.¨'¨ ¨¨¨ ¨¨ý§ö§ï§è§á§Ú§Ó§̧ŧ¾§·§°§©§¢§›§”§§†§§x§q§j§c§\§U§N§G§@§9§2§+§$§§§§§§ú¦ó¦ì¦å¦Þ¦צЦɦ¦»¦´¦­¦¦¦Ÿ¦˜¦‘¦Цƒ¦|¦u¦n¦g¦`¦Y¦R¦K¦D¦=¦6¦/¦(¦!¦¦¦ ¦¦þ¥÷¥ð¥é¥â¥Û¥Ô¥Í¥Æ¥¿¥¸¥±¥ª¥£¥œ¥•¥Ž¥‡¥€¥y¥r¥k¥d¥]¥V¥O¥H¥A¥:¥3¥,¥%¥¥¥¥ ¥¥û¤ô¤í¤æ¤ߤؤѤʤ伤µ¤®¤§¤ ¤™¤’¤‹¤„¤}¤v¤o¤h¤a¤Z¤S¤L¤E¤>¤7¤0¤)¤"¤¤¤ ¤¤ÿ£ø£ñ£ê£ã£Ü£Õ£ΣÇ£À£¹£²£«£¤££–££ˆ££z£s£l£e£^£W£P£I£B£;£4£-£&££££ ££ü¢õ¢î¢ç¢à¢Ù¢Ò¢Ë¢Ä¢½¢¶¢¯¢¨¢¡¢š¢“¢Œ¢…¢~¢w¢p¢i¢b¢[¢T¢M¢F¢?¢8¢1¢*¢#¢¢¢¢¢¢ù¡ò¡ë¡ä¡Ý¡Ö¡Ï¡È¡Á¡º¡³¡¬¡¥¡ž¡—¡¡‰¡‚¡{¡t¡m¡f¡_¡X¡Q¡J¡C¡<¡5¡.¡'¡ ¡¡¡ ¡¡ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      úŸóŸìŸåŸÞŸןПÉŸŸ»Ÿ´Ÿ­Ÿ¦ŸŸŸ˜Ÿ‘ŸŠŸƒŸ|ŸuŸnŸgŸ`ŸYŸRŸKŸDŸ=Ÿ6Ÿ/Ÿ(Ÿ!ŸŸŸ ŸŸþž÷žðžéžâžÛžÔžÍžÆž¿ž¸ž±žªž£žœž•žŽž‡ž€žyžržkždž]žVžOžHžAž:ž3ž,ž%žžžž žžûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿœøœñœêœãœÜœÕœΜÇœÀœ¹œ²œ«œ¤œœ–œœˆœœzœsœlœeœ^œWœPœIœBœ;œ4œ-œ&œœœœ œœü›õ›î›ç›à›Ù›Ò›Ë›Ä›½›¶›¯›¨›¡›š›“›Œ›…›~›w›p›i›b›[›T›M›F›?›8›1›*›#››››››ùšòšëšäšÝšÖšÏšÈšÁšºš³š¬š¥šžš—šš‰š‚š{štšmšfš_šXšQšJšCš<š5š.š'š ššš ššý™ö™ï™è™á™Ú™Ó™Ì™Å™¾™·™°™©™¢™›™”™™†™™x™q™j™c™\™U™N™G™@™9™2™+™$™™™™™™ú˜ó˜ì˜å˜Þ˜טИɘ˜»˜´˜­˜¦˜Ÿ˜˜˜‘˜Š˜ƒ˜|˜u˜n˜g˜`˜Y˜R˜K˜D˜=˜6˜/˜(˜!˜˜˜ ˜˜þ—÷—ð—é—â—Û—Ô—Í—Æ—¿—¸—±—ª—£—œ—•—Ž—‡—€—y—r—k—d—]—V—O—H—A—:—3—,—%———— ——û–ô–í–æ–ß–Ø–Ñ–Ê–Ö¼–µ–®–§– –™–’–‹–„–}–v–o–h–a–Z–S–L–E–>–7–0–)–"––– ––ÿ•ø•ñ•ê•ã•ܕՕΕÇ•À•¹•²•«•¤••–••ˆ••z•s•l•e•^•W•P•I•B•;•4•-•&•••• ••ü”õ”î”ç”à”ٔҔ˔Ĕ½”¶”¯”¨”¡”𔓔Œ”…”~”w”p”i”b”[”T”M”F”?”8”1”*”#””””””ù“ò“ë“ä“ݓ֓ϓȓÁ“º“³“¬“¥“ž“—““‰“‚“{“t“m“f“_“X“Q“J“C“<“5“.“'“ “““ ““ý’ö’ï’è’á’Ú’Ó’Ì’Å’¾’·’°’©’¢’›’”’’†’’x’q’j’c’\’U’N’G’@’9’2’+’$’’’’’’ú‘ó‘ì‘å‘Þ‘בБÉ‘‘»‘´‘­‘¦‘Ÿ‘˜‘‘‘Š‘ƒ‘|‘u‘n‘g‘`‘Y‘R‘K‘D‘=‘6‘/‘(‘!‘‘‘ ‘‘þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŽøŽñŽêŽãŽÜŽÕŽÎŽÇŽÀŽ¹Ž²Ž«Ž¤ŽŽ–ŽŽˆŽŽzŽsŽlŽeŽ^ŽWŽPŽIŽBŽ;Ž4Ž-Ž&ŽŽŽŽ ŽŽüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŒòŒëŒäŒÝŒÖŒÏŒÈŒÁŒºŒ³Œ¬Œ¥ŒžŒ—ŒŒ‰Œ‚Œ{ŒtŒmŒfŒ_ŒXŒQŒJŒCŒ<Œ5Œ.Œ'Œ ŒŒŒ ŒŒý‹ö‹ï‹è‹á‹Ú‹Ó‹Ì‹Å‹¾‹·‹°‹©‹¢‹›‹”‹‹†‹‹x‹q‹j‹c‹\‹U‹N‹G‹@‹9‹2‹+‹$‹‹‹‹‹‹úŠóŠìŠåŠÞŠ׊ЊÉŠŠ»Š´Š­Š¦ŠŸŠ˜Š‘ŠŠŠƒŠ|ŠuŠnŠgŠ`ŠYŠRŠKŠDŠ=Š6Š/Š(Š!ŠŠŠ ŠŠþ‰÷‰ð‰é‰â‰Û‰Ô‰͉Ɖ¿‰¸‰±‰ª‰£‰œ‰•‰މ‡‰€‰y‰r‰k‰d‰]‰V‰O‰H‰A‰:‰3‰,‰%‰‰‰‰ ‰‰ûˆôˆíˆæˆ߈؈шʈȼˆµˆ®ˆ§ˆ ˆ™ˆ’ˆ‹ˆ„ˆ}ˆvˆoˆhˆaˆZˆSˆLˆEˆ>ˆ7ˆ0ˆ)ˆ"ˆˆˆ ˆˆÿ‡ø‡ñ‡ê‡ã‡܇Õ‡·LJÀ‡¹‡²‡«‡¤‡‡–‡‡ˆ‡‡z‡s‡l‡e‡^‡W‡P‡I‡B‡;‡4‡-‡&‡‡‡‡ ‡‡ü†õ†î†ç†à†Ù†Ò†ˆĆ½†¶†¯†¨†¡†š†“†Œ†…†~†w†p†i†b†[†T†M†F†?†8†1†*†#††††††ù…ò…ë…ä…Ý…Ö…Ï…È…Á…º…³…¬…¥…ž…—……‰…‚…{…t…m…f…_…X…Q…J…C…<…5….…'… ……… ……ý„ö„ï„è„á„ڄӄ̄ń¾„·„°„©„¢„›„”„„†„„x„q„j„c„\„U„N„G„@„9„2„+„$„„„„„„úƒóƒìƒåƒÞƒ׃ЃɃƒ»ƒ´ƒ­ƒ¦ƒŸƒ˜ƒ‘ƒŠƒƒƒ|ƒuƒnƒgƒ`ƒYƒRƒKƒDƒ=ƒ6ƒ/ƒ(ƒ!ƒƒƒ ƒƒþ‚÷‚ð‚é‚â‚ۂԂ͂Ƃ¿‚¸‚±‚ª‚£‚œ‚•‚Ž‚‡‚€‚y‚r‚k‚d‚]‚V‚O‚H‚A‚:‚3‚,‚%‚‚‚‚ ‚‚ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ€ø€ñ€ê€ã€Ü€Õ€΀Ç€À€¹€²€«€¤€€–€€ˆ€€z€s€l€e€^€W€P€I€B€;€4€-€&€€€€ €€üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù~ò~ë~ä~Ý~Ö~Ï~È~Á~º~³~¬~¥~ž~—~~‰~‚~{~t~m~f~_~X~Q~J~C~<~5~.~'~ ~~~ ~~ý}ö}ï}è}á}Ú}Ó}Ì}Å}¾}·}°}©}¢}›}”}}†}}x}q}j}c}\}U}N}G}@}9}2}+}$}}}}}}ú|ó|ì|å|Þ|×|Ð|É|Â|»|´|­|¦|Ÿ|˜|‘|Š|ƒ|||u|n|g|`|Y|R|K|D|=|6|/|(|!||| ||þ{÷{ð{é{â{Û{Ô{Í{Æ{¿{¸{±{ª{£{œ{•{Ž{‡{€{y{r{k{d{]{V{O{H{A{:{3{,{%{{{{ {{ûzôzízæzßzØzÑzÊzÃz¼zµz®z§z z™z’z‹z„z}zvzozhzazZzSzLzEz>z7z0z)z"zzz zzÿyøyñyêyãyÜyÕyÎyÇyÀy¹y²y«y¤yy–yyˆyyzysylyey^yWyPyIyBy;y4y-y&yyyy yyüxõxîxçxàxÙxÒxËxÄx½x¶x¯x¨x¡xšx“xŒx…x~xwxpxixbx[xTxMxFx?x8x1x*x#xxxxxxùwòwëwäwÝwÖwÏwÈwÁwºw³w¬w¥wžw—ww‰w‚w{wtwmwfw_wXwQwJwCws7s0s)s"sss ssÿrørñrêrãrÜrÕrÎrÇrÀr¹r²r«r¤rr–rrˆrrzrsrlrer^rWrPrIrBr;r4r-r&rrrr rrüqõqîqçqàqÙqÒqËqÄq½q¶q¯q¨q¡qšq“qŒq…q~qwqpqiqbq[qTqMqFq?q8q1q*q#qqqqqqùpòpëpäpÝpÖpÏpÈpÁpºp³p¬p¥pžp—pp‰p‚p{ptpmpfp_pXpQpJpCpl7l0l)l"lll llÿkøkñkêkãkÜkÕkÎkÇkÀk¹k²k«k¤kk–kkˆkkzksklkek^kWkPkIkBk;k4k-k&kkkk kküjõjîjçjàjÙjÒjËjÄj½j¶j¯j¨j¡jšj“jŒj…j~jwjpjijbj[jTjMjFj?j8j1j*j#jjjjjjùiòiëiäiÝiÖiÏiÈiÁiºi³i¬i¥iži—ii‰i‚i{itimifi_iXiQiJiCie7e0e)e"eee eeÿdødñdêdãdÜdÕdÎdÇdÀd¹d²d«d¤dd–ddˆddzdsdlded^dWdPdIdBd;d4d-d&dddd ddücõcîcçcàcÙcÒcËcÄc½c¶c¯c¨c¡cšc“cŒc…c~cwcpcicbc[cTcMcFc?c8c1c*c#ccccccùbòbëbäbÝbÖbÏbÈbÁbºb³b¬b¥bžb—bb‰b‚b{btbmbfb_bXbQbJbCb^7^0^)^"^^^ ^^ÿ]ø]ñ]ê]ã]Ü]Õ]Î]Ç]À]¹]²]«]¤]]–]]ˆ]]z]s]l]e]^]W]P]I]B];]4]-]&]]]] ]]ü\õ\î\ç\à\Ù\Ò\Ë\Ä\½\¶\¯\¨\¡\š\“\Œ\…\~\w\p\i\b\[\T\M\F\?\8\1\*\#\\\\\\ù[ò[ë[ä[Ý[Ö[Ï[È[Á[º[³[¬[¥[ž[—[[‰[‚[{[t[m[f[_[X[Q[J[C[<[5[.['[ [[[ [[ýZöZïZèZáZÚZÓZÌZÅZ¾Z·Z°Z©Z¢Z›Z”ZZ†ZZxZqZjZcZ\ZUZNZGZ@Z9Z2Z+Z$ZZZZZZúYóYìYåYÞY×YÐYÉYÂY»Y´Y­Y¦YŸY˜Y‘YŠYƒY|YuYnYgY`YYYRYKYDY=Y6Y/Y(Y!YYY YYþX÷XðXéXâXÛXÔXÍXÆX¿X¸X±XªX£XœX•XŽX‡X€XyXrXkXdX]XVXOXHXAX:X3X,X%XXXX XXûWôWíWæWßWØWÑWÊWÃW¼WµW®W§W W™W’W‹W„W}WvWoWhWaWZWSWLWEW>W7W0W)W"WWW WWÿVøVñVêVãVÜVÕVÎVÇVÀV¹V²V«V¤VV–VVˆVVzVsVlVeV^VWVPVIVBV;V4V-V&VVVV VVüUõUîUçUàUÙUÒUËUÄU½U¶U¯U¨U¡UšU“UŒU…U~UwUpUiUbU[UTUMUFU?U8U1U*U#UUUUUUùTòTëTäTÝTÖTÏTÈTÁTºT³T¬T¥TžT—TT‰T‚T{TtTmTfT_TXTQTJTCTP7P0P)P"PPP PPÿOøOñOêOãOÜOÕOÎOÇOÀO¹O²O«O¤OO–OOˆOOzOsOlOeO^OWOPOIOBO;O4O-O&OOOO OOüNõNîNçNàNÙNÒNËNÄN½N¶N¯N¨N¡NšN“NŒN…N~NwNpNiNbN[NTNMNFN?N8N1N*N#NNNNNNùMòMëMäMÝMÖMÏMÈMÁMºM³M¬M¥MžM—MM‰M‚M{MtMmMfM_MXMQMJMCMI7I0I)I"III IIÿHøHñHêHãHÜHÕHÎHÇHÀH¹H²H«H¤HH–HHˆHHzHsHlHeH^HWHPHIHBH;H4H-H&HHHH HHüGõGîGçGàGÙGÒGËGÄG½G¶G¯G¨G¡GšG“GŒG…G~GwGpGiGbG[GTGMGFG?G8G1G*G#GGGGGGùFòFëFäFÝFÖFÏFÈFÁFºF³F¬F¥FžF—FF‰F‚F{FtFmFfF_FXFQFJFCFB7B0B)B"BBB BBÿAøAñAêAãAÜAÕAÎAÇAÀA¹A²A«A¤AA–AAˆAAzAsAlAeA^AWAPAIABA;A4A-A&AAAA AAü@õ@î@ç@à@Ù@Ò@Ë@Ä@½@¶@¯@¨@¡@š@“@Œ@…@~@w@p@i@b@[@T@M@F@?@8@1@*@#@@@@@@ù?ò?ë?ä?Ý?Ö?Ï?È?Á?º?³?¬?¥?ž?—??‰?‚?{?t?m?f?_?X?Q?J?C?ö>ï>è>á>Ú>Ó>Ì>Å>¾>·>°>©>¢>›>”>>†>>x>q>j>c>\>U>N>G>@>9>2>+>$>>>>>>ú=ó=ì=å=Þ=×=Ð=É=Â=»=´=­=¦=Ÿ=˜=‘=Š=ƒ=|=u=n=g=`=Y=R=K=D===6=/=(=!=== ==þ<÷<ð<é<â<Û<Ô<Í<Æ<¿<¸<±<ª<£<œ<•<Ž<‡<€<y<r<k<d<]<V<O<H<A<:<3<,<%<<<< <<û;ô;í;æ;ß;Ø;Ñ;Ê;Ã;¼;µ;®;§; ;™;’;‹;„;};v;o;h;a;Z;S;L;E;>;7;0;);";;; ;;ÿ:ø:ñ:ê:ã:Ü:Õ:Î:Ç:À:¹:²:«:¤::–::ˆ::z:s:l:e:^:W:P:I:B:;:4:-:&:::: ::ü9õ9î9ç9à9Ù9Ò9Ë9Ä9½9¶9¯9¨9¡9š9“9Œ9…9~9w9p9i9b9[9T9M9F9?98919*9#999999ù8ò8ë8ä8Ý8Ö8Ï8È8Á8º8³8¬8¥8ž8—88‰8‚8{8t8m8f8_8X8Q8J8C8<858.8'8 888 88ý7ö7ï7è7á7Ú7Ó7Ì7Å7¾7·7°7©7¢7›7”77†77x7q7j7c7\7U7N7G7@79727+7$777777ú6ó6ì6å6Þ6×6Ð6É6Â6»6´6­6¦6Ÿ6˜6‘6Š6ƒ6|6u6n6g6`6Y6R6K6D6=666/6(6!666 66þ5÷5ð5é5â5Û5Ô5Í5Æ5¿5¸5±5ª5£5œ5•5Ž5‡5€5y5r5k5d5]5V5O5H5A5:535,5%5555 55û4ô4í4æ4ß4Ø4Ñ4Ê4Ã4¼4µ4®4§4 4™4’4‹4„4}4v4o4h4a4Z4S4L4E4>47404)4"444 44ÿ3ø3ñ3ê3ã3Ü3Õ3Î3Ç3À3¹3²3«3¤33–33ˆ33z3s3l3e3^3W3P3I3B3;343-3&3333 33ü2õ2î2ç2à2Ù2Ò2Ë2Ä2½2¶2¯2¨2¡2š2“2Œ2…2~2w2p2i2b2[2T2M2F2?28212*2#222222ù1ò1ë1ä1Ý1Ö1Ï1È1Á1º1³1¬1¥1ž1—11‰1‚1{1t1m1f1_1X1Q1J1C1<151.1'1 111 11ý0ö0ï0è0á0Ú0Ó0Ì0Å0¾0·0°0©0¢0›0”00†00x0q0j0c0\0U0N0G0@09020+0$000000ú/ó/ì/å/Þ/×/Ð/É/Â/»/´/­/¦/Ÿ/˜/‘/Š/ƒ/|/u/n/g/`/Y/R/K/D/=/6///(/!/// //þ.÷.ð.é.â.Û.Ô.Í.Æ.¿.¸.±.ª.£.œ.•.Ž.‡.€.y.r.k.d.].V.O.H.A.:.3.,.%.... ..û-ô-í-æ-ß-Ø-Ñ-Ê-Ã-¼-µ-®-§- -™-’-‹-„-}-v-o-h-a-Z-S-L-E->-7-0-)-"--- --ÿ,ø,ñ,ê,ã,Ü,Õ,Î,Ç,À,¹,²,«,¤,,–,,ˆ,,z,s,l,e,^,W,P,I,B,;,4,-,&,,,, ,,ü+õ+î+ç+à+Ù+Ò+Ë+Ä+½+¶+¯+¨+¡+š+“+Œ+…+~+w+p+i+b+[+T+M+F+?+8+1+*+#++++++ù*ò*ë*ä*Ý*Ö*Ï*È*Á*º*³*¬*¥*ž*—**‰*‚*{*t*m*f*_*X*Q*J*C*<*5*.*'* *** **ý)ö)ï)è)á)Ú)Ó)Ì)Å)¾)·)°)©)¢)›)”))†))x)q)j)c)\)U)N)G)@)9)2)+)$))))))ú(ó(ì(å(Þ(×(Ð(É(Â(»(´(­(¦(Ÿ(˜(‘(Š(ƒ(|(u(n(g(`(Y(R(K(D(=(6(/(((!((( ((þ'÷'ð'é'â'Û'Ô'Í'Æ'¿'¸'±'ª'£'œ'•'Ž'‡'€'y'r'k'd']'V'O'H'A':'3','%'''' ''û&ô&í&æ&ß&Ø&Ñ&Ê&Ã&¼&µ&®&§& &™&’&‹&„&}&v&o&h&a&Z&S&L&E&>&7&0&)&"&&& &&ÿ%ø%ñ%ê%ã%Ü%Õ%Î%Ç%À%¹%²%«%¤%%–%%ˆ%%z%s%l%e%^%W%P%I%B%;%4%-%&%%%% %%ü$õ$î$ç$à$Ù$Ò$Ë$Ä$½$¶$¯$¨$¡$š$“$Œ$…$~$w$p$i$b$[$T$M$F$?$8$1$*$#$$$$$$ù#ò#ë#ä#Ý#Ö#Ï#È#Á#º#³#¬#¥#ž#—##‰#‚#{#t#m#f#_#X#Q#J#C#<#5#.#'# ### ##ý"ö"ï"è"á"Ú"Ó"Ì"Å"¾"·"°"©"¢"›"”""†""x"q"j"c"\"U"N"G"@"9"2"+"$""""""ú!ó!ì!å!Þ!×!Ð!É!Â!»!´!­!¦!Ÿ!˜!‘!Š!ƒ!|!u!n!g!`!Y!R!K!D!=!6!/!(!!!!! !!þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýÿöÿïÿèÿáÿÚÿÓÿÌÿÅÿ¾ÿ·ÿ°ÿ©ÿ¢ÿ›ÿ”ÿÿ†ÿÿxÿqÿjÿcÿ\ÿUÿNÿGÿ@ÿ9ÿ2ÿ+ÿ$ÿÿÿÿÿÿúþóþìþåþÞþ×þÐþÉþÂþ»þ´þ­þ¦þŸþ˜þ‘þŠþƒþ|þuþnþgþ`þYþRþKþDþ=þ6þ/þ(þ!þþþ þþþý÷ýðýéýâýÛýÔýÍýÆý¿ý¸ý±ýªý£ýœý•ýŽý‡ý€ýyýrýkýdý]ýVýOýHýAý:ý3ý,ý%ýýýý ýýûüôüíüæüßüØüÑüÊüÃü¼üµü®ü§ü ü™ü’ü‹ü„ü}üvüoühüaüZüSüLüEü>ü7ü0ü)ü"üüü üüÿûøûñûêûãûÜûÕûÎûÇûÀû¹û²û«û¤ûû–ûûˆûûzûsûlûeû^ûWûPûIûBû;û4û-û&ûûûû ûûüúõúîúçúàúÙúÒúËúÄú½ú¶ú¯ú¨ú¡úšú“úŒú…ú~úwúpúiúbú[úTúMúFú?ú8ú1ú*ú#úúúúúúùùòùëùäùÝùÖùÏùÈùÁùºù³ù¬ù¥ùžù—ùù‰ù‚ù{ùtùmùfù_ùXùQùJùCù<ù5ù.ù'ù ùùù ùùýøöøïøèøáøÚøÓøÌøÅø¾ø·ø°ø©ø¢ø›ø”øø†øøxøqøjøcø\øUøNøGø@ø9ø2ø+ø$øøøøøøú÷ó÷ì÷å÷Þ÷×÷Ð÷É÷Â÷»÷´÷­÷¦÷Ÿ÷˜÷‘÷Š÷ƒ÷|÷u÷n÷g÷`÷Y÷R÷K÷D÷=÷6÷/÷(÷!÷÷÷ ÷÷þö÷öðöéöâöÛöÔöÍöÆö¿ö¸ö±öªö£öœö•öŽö‡ö€öyöröködö]öVöOöHöAö:ö3ö,ö%öööö ööûõôõíõæõßõØõÑõÊõÃõ¼õµõ®õ§õ õ™õ’õ‹õ„õ}õvõoõhõaõZõSõLõEõ>õ7õ0õ)õ"õõõ õõÿôøôñôêôãôÜôÕôÎôÇôÀô¹ô²ô«ô¤ôô–ôôˆôôzôsôlôeô^ôWôPôIôBô;ô4ô-ô&ôôôô ôôüóõóîóçóàóÙóÒóËóÄó½ó¶ó¯ó¨ó¡óšó“óŒó…ó~ówópóióbó[óTóMóFó?ó8ó1ó*ó#óóóóóóùòòòëòäòÝòÖòÏòÈòÁòºò³ò¬ò¥òžò—òò‰ò‚ò{òtòmòfò_òXòQòJòCò<ò5ò.ò'ò òòò òòýñöñïñèñáñÚñÓñÌñÅñ¾ñ·ñ°ñ©ñ¢ñ›ñ”ññ†ññxñqñjñcñ\ñUñNñGñ@ñ9ñ2ñ+ñ$ññññññúðóðìðåðÞð×ðÐðÉðÂð»ð´ð­ð¦ðŸð˜ð‘ðŠðƒð|ðuðnðgð`ðYðRðKðDð=ð6ð/ð(ð!ððð ððþï÷ïðïéïâïÛïÔïÍïÆï¿ï¸ï±ïªï£ïœï•ïŽï‡ï€ïyïrïkïdï]ïVïOïHïAï:ï3ï,ï%ïïïï ïïûîôîíîæîßîØîÑîÊîÃî¼îµî®î§î î™î’î‹î„î}îvîoîhîaîZîSîLîEî>î7î0î)î"îîî îîÿíøíñíêíãíÜíÕíÎíÇíÀí¹í²í«í¤íí–ííˆíízísílíeí^íWíPíIíBí;í4í-í&íííí ííüìõìîìçìàìÙìÒìËìÄì½ì¶ì¯ì¨ì¡ìšì“ìŒì…ì~ìwìpìiìbì[ìTìMìFì?ì8ì1ì*ì#ììììììùëòëëëäëÝëÖëÏëÈëÁëºë³ë¬ë¥ëžë—ëë‰ë‚ë{ëtëmëfë_ëXëQëJëCë<ë5ë.ë'ë ëëë ëëýêöêïêèêáêÚêÓêÌêÅê¾ê·ê°ê©ê¢ê›ê”êê†êêxêqêjêcê\êUêNêGê@ê9ê2ê+ê$êêêêêêúéóéìéåéÞé×éÐéÉéÂé»é´é­é¦éŸé˜é‘éŠéƒé|éuénégé`éYéRéKéDé=é6é/é(é!ééé ééþè÷èðèéèâèÛèÔèÍèÆè¿è¸è±èªè£èœè•èŽè‡è€èyèrèkèdè]èVèOèHèAè:è3è,è%èèèè èèûçôçíçæçßçØçÑçÊçÃç¼çµç®ç§ç ç™ç’ç‹ç„ç}çvçoçhçaçZçSçLçEç>ç7ç0ç)ç"ççç ççÿæøæñæêæãæÜæÕæÎæÇæÀæ¹æ²æ«æ¤ææ–ææˆææzæsælæeæ^æWæPæIæBæ;æ4æ-æ&ææææ ææüåõåîåçåàåÙåÒåËåÄå½å¶å¯å¨å¡åšå“åŒå…å~åwåpåiåbå[åTåMåFå?å8å1å*å#ååååååùäòäëäääÝäÖäÏäÈäÁäºä³ä¬ä¥äžä—ää‰ä‚ä{ätämäfä_äXäQäJäCä<ä5ä.ä'ä äää ääýãöãïãèãáãÚãÓãÌãÅã¾ã·ã°ã©ã¢ã›ã”ãã†ããxãqãjãcã\ãUãNãGã@ã9ã2ã+ã$ããããããúâóâìâåâÞâ×âÐâÉâÂâ»â´â­â¦âŸâ˜â‘âŠâƒâ|âuânâgâ`âYâRâKâDâ=â6â/â(â!âââ ââþá÷áðáéáâáÛáÔáÍáÆá¿á¸á±áªá£áœá•áŽá‡á€áyárákádá]áVáOáHáAá:á3á,á%áááá ááûàôàíàæàßàØàÑàÊàÃà¼àµà®à§à à™à’à‹à„à}àvàoàhàaàZàSàLàEà>à7à0à)à"ààà ààÿßøßñßêßãßÜßÕßÎßÇßÀ߹߲߫ߤßß–ß߈ßßzßsßlßeß^ßWßPßIßBß;ß4ß-ß&ßßßß ßßüÞõÞîÞçÞàÞÙÞÒÞËÞÄ޽޶ޯިޡޚޓތޅÞ~ÞwÞpÞiÞbÞ[ÞTÞMÞFÞ?Þ8Þ1Þ*Þ#ÞÞÞÞÞÞùÝòÝëÝäÝÝÝÖÝÏÝÈÝÁݺݳݬݥݞݗÝ݂݉Ý{ÝtÝmÝfÝ_ÝXÝQÝJÝCÝ<Ý5Ý.Ý'Ý ÝÝÝ ÝÝýÜöÜïÜèÜáÜÚÜÓÜÌÜÅܾܷܰܩܢܛܔÜ܆ÜÜxÜqÜjÜcÜ\ÜUÜNÜGÜ@Ü9Ü2Ü+Ü$ÜÜÜÜÜÜúÛóÛìÛåÛÞÛ×ÛÐÛÉÛÂÛ»Û´Û­Û¦ÛŸÛ˜Û‘ÛŠÛƒÛ|ÛuÛnÛgÛ`ÛYÛRÛKÛDÛ=Û6Û/Û(Û!ÛÛÛ ÛÛþÚ÷ÚðÚéÚâÚÛÚÔÚÍÚÆÚ¿Ú¸Ú±ÚªÚ£ÚœÚ•ÚŽÚ‡Ú€ÚyÚrÚkÚdÚ]ÚVÚOÚHÚAÚ:Ú3Ú,Ú%ÚÚÚÚ ÚÚûÙôÙíÙæÙßÙØÙÑÙÊÙÃټٵٮ٧٠ًْٙلÙ}ÙvÙoÙhÙaÙZÙSÙLÙEÙ>Ù7Ù0Ù)Ù"ÙÙÙ ÙÙÿØøØñØêØãØÜØÕØÎØÇØÀØ¹Ø²Ø«Ø¤ØØ–ØØˆØØzØsØlØeØ^ØWØPØIØBØ;Ø4Ø-Ø&ØØØØ ØØü×õ×î×ç×à×Ù×Ò×Ë×Ä׽׶ׯרסךד׌ׅ×~×w×p×i×b×[×T×M×F×?×8×1×*×#××××××ùÖòÖëÖäÖÝÖÖÖÏÖÈÖÁÖºÖ³Ö¬Ö¥ÖžÖ—ÖÖ‰Ö‚Ö{ÖtÖmÖfÖ_ÖXÖQÖJÖCÖ<Ö5Ö.Ö'Ö ÖÖÖ ÖÖýÕöÕïÕèÕáÕÚÕÓÕÌÕÅÕ¾Õ·Õ°Õ©Õ¢Õ›Õ”ÕÕ†ÕÕxÕqÕjÕcÕ\ÕUÕNÕGÕ@Õ9Õ2Õ+Õ$ÕÕÕÕÕÕúÔóÔìÔåÔÞÔ×ÔÐÔÉÔÂÔ»Ô´Ô­Ô¦ÔŸÔ˜Ô‘ÔŠÔƒÔ|ÔuÔnÔgÔ`ÔYÔRÔKÔDÔ=Ô6Ô/Ô(Ô!ÔÔÔ ÔÔþÓ÷ÓðÓéÓâÓÛÓÔÓÍÓÆÓ¿Ó¸Ó±ÓªÓ£ÓœÓ•ÓŽÓ‡Ó€ÓyÓrÓkÓdÓ]ÓVÓOÓHÓAÓ:Ó3Ó,Ó%ÓÓÓÓ ÓÓûÒôÒíÒæÒßÒØÒÑÒÊÒÃÒ¼ÒµÒ®Ò§Ò Ò™Ò’Ò‹Ò„Ò}ÒvÒoÒhÒaÒZÒSÒLÒEÒ>Ò7Ò0Ò)Ò"ÒÒÒ ÒÒÿÑøÑñÑêÑãÑÜÑÕÑÎÑÇÑÀѹѲѫѤÑÑ–ÑшÑÑzÑsÑlÑeÑ^ÑWÑPÑIÑBÑ;Ñ4Ñ-Ñ&ÑÑÑÑ ÑÑüÐõÐîÐçÐàÐÙÐÒÐËÐÄнжЯШСКГЌЅÐ~ÐwÐpÐiÐbÐ[ÐTÐMÐFÐ?Ð8Ð1Ð*Ð#ÐÐÐÐÐÐùÏòÏëÏäÏÝÏÖÏÏÏÈÏÁϺϳϬϥϞϗÏωςÏ{ÏtÏmÏfÏ_ÏXÏQÏJÏCÏ<Ï5Ï.Ï'Ï ÏÏÏ ÏÏýÎöÎïÎèÎáÎÚÎÓÎÌÎÅξηΰΩ΢ΛΔÎΆÎÎxÎqÎjÎcÎ\ÎUÎNÎGÎ@Î9Î2Î+Î$ÎÎÎÎÎÎúÍóÍìÍåÍÞÍ×ÍÐÍÉÍÂͻʹͭͦ͑͊̓͘͟Í|ÍuÍnÍgÍ`ÍYÍRÍKÍDÍ=Í6Í/Í(Í!ÍÍÍ ÍÍþÌ÷ÌðÌéÌâÌÛÌÔÌÍÌÆÌ¿Ì¸Ì±ÌªÌ£ÌœÌ•ÌŽÌ‡Ì€ÌyÌrÌkÌdÌ]ÌVÌOÌHÌAÌ:Ì3Ì,Ì%ÌÌÌÌ ÌÌûËôËíËæËßËØËÑËÊËÃ˼˵ˮ˧ˠ˙˒ˋ˄Ë}ËvËoËhËaËZËSËLËEË>Ë7Ë0Ë)Ë"ËËË ËËÿÊøÊñÊêÊãÊÜÊÕÊÎÊÇÊÀʹʲʫʤÊÊ–ÊʈÊÊzÊsÊlÊeÊ^ÊWÊPÊIÊBÊ;Ê4Ê-Ê&ÊÊÊÊ ÊÊüÉõÉîÉçÉàÉÙÉÒÉËÉÄɽɶɯɨɡɚɓɌɅÉ~ÉwÉpÉiÉbÉ[ÉTÉMÉFÉ?É8É1É*É#ÉÉÉÉÉÉùÈòÈëÈäÈÝÈÖÈÏÈÈÈÁȺȳȬȥȞȗÈȉȂÈ{ÈtÈmÈfÈ_ÈXÈQÈJÈCÈ<È5È.È'È ÈÈÈ ÈÈýÇöÇïÇèÇáÇÚÇÓÇÌÇÅǾǷǰǩǢǛǔÇdžÇÇxÇqÇjÇcÇ\ÇUÇNÇGÇ@Ç9Ç2Ç+Ç$ÇÇÇÇÇÇúÆóÆìÆåÆÞÆׯÐÆÉÆÂÆ»Æ´Æ­Æ¦ÆŸÆ˜Æ‘ƊƃÆ|ÆuÆnÆgÆ`ÆYÆRÆKÆDÆ=Æ6Æ/Æ(Æ!ÆÆÆ ÆÆþÅ÷ÅðÅéÅâÅÛÅÔÅÍÅÆÅ¿Å¸Å±ÅªÅ£ÅœÅ•ÅŽÅ‡Å€ÅyÅrÅkÅdÅ]ÅVÅOÅHÅAÅ:Å3Å,Å%ÅÅÅÅ ÅÅûÄôÄíÄæÄßÄØÄÑÄÊÄÃļĵĮħĠęĒċĄÄ}ÄvÄoÄhÄaÄZÄSÄLÄEÄ>Ä7Ä0Ä)Ä"ÄÄÄ ÄÄÿÃøÃñÃêÃãÃÜÃÕÃÎÃÇÃÀùòëäÃÖÃÈÃÃzÃsÃlÃeÃ^ÃWÃPÃIÃBÃ;Ã4Ã-Ã&ÃÃÃà ÃÃüÂõÂîÂçÂàÂÙÂÒÂËÂĽ¶¯¨¡š“Œ…Â~ÂwÂpÂiÂbÂ[ÂTÂMÂFÂ?Â8Â1Â*Â#ÂÂÂÂÂÂùÁòÁëÁäÁÝÁÖÁÏÁÈÁÁÁºÁ³Á¬Á¥ÁžÁ—ÁÁ‰Á‚Á{ÁtÁmÁfÁ_ÁXÁQÁJÁCÁ<Á5Á.Á'Á ÁÁÁ ÁÁýÀöÀïÀèÀáÀÚÀÓÀÌÀÅÀ¾À·À°À©À¢À›À”ÀÀ†ÀÀxÀqÀjÀcÀ\ÀUÀNÀGÀ@À9À2À+À$ÀÀÀÀÀÀú¿ó¿ì¿å¿Þ¿׿пÉ¿¿»¿´¿­¿¦¿Ÿ¿˜¿‘¿Š¿ƒ¿|¿u¿n¿g¿`¿Y¿R¿K¿D¿=¿6¿/¿(¿!¿¿¿ ¿¿þ¾÷¾ð¾é¾â¾Û¾Ô¾;ƾ¿¾¸¾±¾ª¾£¾œ¾•¾޾‡¾€¾y¾r¾k¾d¾]¾V¾O¾H¾A¾:¾3¾,¾%¾¾¾¾ ¾¾û½ô½í½æ½ß½ؽѽʽý¼½µ½®½§½ ½™½’½‹½„½}½v½o½h½a½Z½S½L½E½>½7½0½)½"½½½ ½½ÿ¼ø¼ñ¼ê¼ã¼ܼÕ¼μǼÀ¼¹¼²¼«¼¤¼¼–¼¼ˆ¼¼z¼s¼l¼e¼^¼W¼P¼I¼B¼;¼4¼-¼&¼¼¼¼ ¼¼ü»õ»î»ç»à»Ù»Ò»Ë»Ä»½»¶»¯»¨»¡»š»“»Œ»…»~»w»p»i»b»[»T»M»F»?»8»1»*»#»»»»»»ùºòºëºäºݺÖºϺȺÁººº³º¬º¥ºžº—ºº‰º‚º{ºtºmºfº_ºXºQºJºCº<º5º.º'º ººº ººý¹ö¹ï¹è¹á¹Ú¹Ó¹̹ʾ¹·¹°¹©¹¢¹›¹”¹¹†¹¹x¹q¹j¹c¹\¹U¹N¹G¹@¹9¹2¹+¹$¹¹¹¹¹¹ú¸ó¸ì¸å¸Þ¸׸иɸ¸»¸´¸­¸¦¸Ÿ¸˜¸‘¸Џƒ¸|¸u¸n¸g¸`¸Y¸R¸K¸D¸=¸6¸/¸(¸!¸¸¸ ¸¸þ·÷·ð·é·â·Û·Ô·Í·Æ·¿·¸·±·ª·£·œ·•·Ž·‡·€·y·r·k·d·]·V·O·H·A·:·3·,·%···· ··û¶ô¶í¶æ¶ß¶ضѶʶö¼¶µ¶®¶§¶ ¶™¶’¶‹¶„¶}¶v¶o¶h¶a¶Z¶S¶L¶E¶>¶7¶0¶)¶"¶¶¶ ¶¶ÿµøµñµêµãµܵÕµεǵÀµ¹µ²µ«µ¤µµ–µµˆµµzµsµlµeµ^µWµPµIµBµ;µ4µ-µ&µµµµ µµü´õ´î´ç´à´Ù´Ò´Ë´Ä´½´¶´¯´¨´¡´š´“´Œ´…´~´w´p´i´b´[´T´M´F´?´8´1´*´#´´´´´´ù³ò³ë³ä³ݳÖ³ϳȳÁ³º³³³¬³¥³ž³—³³‰³‚³{³t³m³f³_³X³Q³J³C³<³5³.³'³ ³³³ ³³ý²ö²ï²è²á²Ú²Ó²̲Ų¾²·²°²©²¢²›²”²²†²²x²q²j²c²\²U²N²G²@²9²2²+²$²²²²²²ú±ó±ì±å±Þ±×±бɱ±»±´±­±¦±Ÿ±˜±‘±бƒ±|±u±n±g±`±Y±R±K±D±=±6±/±(±!±±± ±±þ°÷°ð°é°â°Û°Ô°Ͱư¿°¸°±°ª°£°œ°•°ް‡°€°y°r°k°d°]°V°O°H°A°:°3°,°%°°°° °°û¯ô¯í¯æ¯߯دѯʯOµ¯®¯§¯ ¯™¯’¯‹¯„¯}¯v¯o¯h¯a¯Z¯S¯L¯E¯>¯7¯0¯)¯"¯¯¯ ¯¯ÿ®ø®ñ®ê®ã®Ü®Õ®ήÇ®À®¹®²®«®¤®®–®®ˆ®®z®s®l®e®^®W®P®I®B®;®4®-®&®®®® ®®ü­õ­î­ç­à­Ù­Ò­Ë­Ä­½­¶­¯­¨­¡­š­“­Œ­…­~­w­p­i­b­[­T­M­F­?­8­1­*­#­­­­­­ù¬ò¬ë¬ä¬ݬÖ¬ϬȬÁ¬º¬³¬¬¬¥¬ž¬—¬¬‰¬‚¬{¬t¬m¬f¬_¬X¬Q¬J¬C¬<¬5¬.¬'¬ ¬¬¬ ¬¬ý«ö«ï«è«á«Ú«Ó«Ì«Å«¾«·«°«©«¢«›«”««†««x«q«j«c«\«U«N«G«@«9«2«+«$««««««úªóªìªåªÞªתЪɪª»ª´ª­ª¦ªŸª˜ª‘ªŠªƒª|ªuªnªgª`ªYªRªKªDª=ª6ª/ª(ª!ªªª ªªþ©÷©ð©é©â©Û©Ô©Í©Æ©¿©¸©±©ª©£©œ©•©Ž©‡©€©y©r©k©d©]©V©O©H©A©:©3©,©%©©©© ©©û¨ô¨í¨æ¨ߨبѨʨ輨µ¨®¨§¨ ¨™¨’¨‹¨„¨}¨v¨o¨h¨a¨Z¨S¨L¨E¨>¨7¨0¨)¨"¨¨¨ ¨¨ÿ§ø§ñ§ê§ã§ܧÕ§ΧǧÀ§¹§²§«§¤§§–§§ˆ§§z§s§l§e§^§W§P§I§B§;§4§-§&§§§§ §§ü¦õ¦î¦ç¦à¦Ù¦Ò¦˦Ħ½¦¶¦¯¦¨¦¡¦š¦“¦Œ¦…¦~¦w¦p¦i¦b¦[¦T¦M¦F¦?¦8¦1¦*¦#¦¦¦¦¦¦ù¥ò¥ë¥ä¥Ý¥Ö¥Ï¥È¥Á¥º¥³¥¬¥¥¥ž¥—¥¥‰¥‚¥{¥t¥m¥f¥_¥X¥Q¥J¥C¥<¥5¥.¥'¥ ¥¥¥ ¥¥ý¤ö¤ï¤è¤á¤Ú¤Ó¤̤Ť¾¤·¤°¤©¤¢¤›¤”¤¤†¤¤x¤q¤j¤c¤\¤U¤N¤G¤@¤9¤2¤+¤$¤¤¤¤¤¤ú£ó£ì£å£Þ£×£УÉ££»£´£­£¦£Ÿ£˜£‘£Š£ƒ£|£u£n£g£`£Y£R£K£D£=£6£/£(£!£££ ££þ¢÷¢ð¢é¢â¢Û¢Ô¢Í¢Æ¢¿¢¸¢±¢ª¢£¢œ¢•¢Ž¢‡¢€¢y¢r¢k¢d¢]¢V¢O¢H¢A¢:¢3¢,¢%¢¢¢¢ ¢¢û¡ô¡í¡æ¡ß¡Ø¡Ñ¡Ê¡á¼¡µ¡®¡§¡ ¡™¡’¡‹¡„¡}¡v¡o¡h¡a¡Z¡S¡L¡E¡>¡7¡0¡)¡"¡¡¡ ¡¡ÿ ø ñ ê ã Ü Õ ΠÇ À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       üŸõŸîŸçŸàŸÙŸÒŸËŸÄŸ½Ÿ¶Ÿ¯Ÿ¨Ÿ¡ŸšŸ“ŸŒŸ…Ÿ~ŸwŸpŸiŸbŸ[ŸTŸMŸFŸ?Ÿ8Ÿ1Ÿ*Ÿ#ŸŸŸŸŸŸùžòžëžäžÝžÖžÏžÈžÁžºž³ž¬ž¥žžž—žž‰ž‚ž{žtžmžfž_žXžQžJžCž<ž5ž.ž'ž žžž žžýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úœóœìœåœÞœלМÉœœ»œ´œ­œ¦œŸœ˜œ‘œŠœƒœ|œuœnœgœ`œYœRœKœDœ=œ6œ/œ(œ!œœœ œœþ›÷›ð›é›â›Û›Ô›Í›Æ›¿›¸›±›ª›£›œ›•›Ž›‡›€›y›r›k›d›]›V›O›H›A›:›3›,›%›››› ››ûšôšíšæšßšØšÑšÊšÚ¼šµš®š§š š™š’š‹š„š}švšošhšašZšSšLšEš>š7š0š)š"ššš ššÿ™ø™ñ™ê™ã™Ü™Õ™ΙÇ™À™¹™²™«™¤™™–™™ˆ™™z™s™l™e™^™W™P™I™B™;™4™-™&™™™™ ™™ü˜õ˜î˜ç˜à˜Ù˜Ò˜˘Ę½˜¶˜¯˜¨˜¡˜š˜“˜Œ˜…˜~˜w˜p˜i˜b˜[˜T˜M˜F˜?˜8˜1˜*˜#˜˜˜˜˜˜ù—ò—ë—ä—Ý—Ö—Ï—È—Á—º—³—¬—¥—ž————‰—‚—{—t—m—f—_—X—Q—J—C—<—5—.—'— ——— ——ý–ö–ï–è–á–Ú–Ó–Ì–Å–¾–·–°–©–¢–›–”––†––x–q–j–c–\–U–N–G–@–9–2–+–$––––––ú•ó•ì•å•Þ•וЕÉ••»•´•­•¦•Ÿ•˜•‘•Š•ƒ•|•u•n•g•`•Y•R•K•D•=•6•/•(•!••• ••þ”÷”ð”é”â”۔Ԕ͔Ɣ¿”¸”±”ª”£”œ”•”Ž”‡”€”y”r”k”d”]”V”O”H”A”:”3”,”%”””” ””û“ô“í“æ“ߓؓѓʓӼ“µ“®“§“ “™“’“‹“„“}“v“o“h“a“Z“S“L“E“>“7“0“)“"“““ ““ÿ’ø’ñ’ê’ã’Ü’Õ’Î’Ç’À’¹’²’«’¤’’–’’ˆ’’z’s’l’e’^’W’P’I’B’;’4’-’&’’’’ ’’ü‘õ‘î‘ç‘à‘ّґˑđ½‘¶‘¯‘¨‘¡‘š‘“‘Œ‘…‘~‘w‘p‘i‘b‘[‘T‘M‘F‘?‘8‘1‘*‘#‘‘‘‘‘‘ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŽóŽìŽåŽÞŽ׎ÐŽÉŽÂŽ»Ž´Ž­Ž¦ŽŸŽ˜Ž‘ŽŠŽƒŽ|ŽuŽnŽgŽ`ŽYŽRŽKŽDŽ=Ž6Ž/Ž(Ž!ŽŽŽ ŽŽþ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûŒôŒíŒæŒߌ،ьʌ̼ŒµŒ®Œ§Œ Œ™Œ’Œ‹Œ„Œ}ŒvŒoŒhŒaŒZŒSŒLŒEŒ>Œ7Œ0Œ)Œ"ŒŒŒ ŒŒÿ‹ø‹ñ‹ê‹ã‹Ü‹Õ‹΋Ç‹À‹¹‹²‹«‹¤‹‹–‹‹ˆ‹‹z‹s‹l‹e‹^‹W‹P‹I‹B‹;‹4‹-‹&‹‹‹‹ ‹‹üŠõŠîŠçŠàŠÙŠÒŠËŠÄŠ½Š¶Š¯Š¨Š¡ŠšŠ“ŠŒŠ…Š~ŠwŠpŠiŠbŠ[ŠTŠMŠFŠ?Š8Š1Š*Š#ŠŠŠŠŠŠù‰ò‰ë‰ä‰݉Ö‰ωȉÁ‰º‰³‰¬‰¥‰ž‰—‰‰‰‰‚‰{‰t‰m‰f‰_‰X‰Q‰J‰C‰<‰5‰.‰'‰ ‰‰‰ ‰‰ýˆöˆïˆèˆáˆÚˆÓˆ̈ň¾ˆ·ˆ°ˆ©ˆ¢ˆ›ˆ”ˆˆ†ˆˆxˆqˆjˆcˆ\ˆUˆNˆGˆ@ˆ9ˆ2ˆ+ˆ$ˆˆˆˆˆˆú‡ó‡ì‡å‡Þ‡ׇЇɇ‡»‡´‡­‡¦‡Ÿ‡˜‡‘‡Їƒ‡|‡u‡n‡g‡`‡Y‡R‡K‡D‡=‡6‡/‡(‡!‡‡‡ ‡‡þ†÷†ð†é†â†Û†Ô†͆Ɔ¿†¸†±†ª†£†œ†•†ކ‡†€†y†r†k†d†]†V†O†H†A†:†3†,†%†††† ††û…ô…í…æ…ß…Ø…Ñ…Ê…Ã…¼…µ…®…§… …™…’…‹…„…}…v…o…h…a…Z…S…L…E…>…7…0…)…"……… ……ÿ„ø„ñ„ê„ã„܄Մ΄Ç„À„¹„²„«„¤„„–„„ˆ„„z„s„l„e„^„W„P„I„B„;„4„-„&„„„„ „„üƒõƒîƒçƒàƒÙƒÒƒ˃ă½ƒ¶ƒ¯ƒ¨ƒ¡ƒšƒ“ƒŒƒ…ƒ~ƒwƒpƒiƒbƒ[ƒTƒMƒFƒ?ƒ8ƒ1ƒ*ƒ#ƒƒƒƒƒƒù‚ò‚ë‚ä‚݂ւςȂÁ‚º‚³‚¬‚¥‚ž‚—‚‚‰‚‚‚{‚t‚m‚f‚_‚X‚Q‚J‚C‚<‚5‚.‚'‚ ‚‚‚ ‚‚ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú€ó€ì€å€Þ€×€ЀÉ€€»€´€­€¦€Ÿ€˜€‘€Š€ƒ€|€u€n€g€`€Y€R€K€D€=€6€/€(€!€€€ €€þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% û~ô~í~æ~ß~Ø~Ñ~Ê~Ã~¼~µ~®~§~ ~™~’~‹~„~}~v~o~h~a~Z~S~L~E~>~7~0~)~"~~~ ~~ÿ}ø}ñ}ê}ã}Ü}Õ}Î}Ç}À}¹}²}«}¤}}–}}ˆ}}z}s}l}e}^}W}P}I}B};}4}-}&}}}} }}ü|õ|î|ç|à|Ù|Ò|Ë|Ä|½|¶|¯|¨|¡|š|“|Œ|…|~|w|p|i|b|[|T|M|F|?|8|1|*|#||||||ù{ò{ë{ä{Ý{Ö{Ï{È{Á{º{³{¬{¥{ž{—{{‰{‚{{{t{m{f{_{X{Q{J{C{<{5{.{'{ {{{ {{ýzözïzèzázÚzÓzÌzÅz¾z·z°z©z¢z›z”zz†zzxzqzjzcz\zUzNzGz@z9z2z+z$zzzzzzúyóyìyåyÞy×yÐyÉyÂy»y´y­y¦yŸy˜y‘yŠyƒy|yuynygy`yYyRyKyDy=y6y/y(y!yyy yyþx÷xðxéxâxÛxÔxÍxÆx¿x¸x±xªx£xœx•xŽx‡x€xyxrxkxdx]xVxOxHxAx:x3x,x%xxxx xxûwôwíwæwßwØwÑwÊwÃw¼wµw®w§w w™w’w‹w„w}wvwowhwawZwSwLwEw>w7w0w)w"www wwÿvøvñvêvãvÜvÕvÎvÇvÀv¹v²v«v¤vv–vvˆvvzvsvlvev^vWvPvIvBv;v4v-v&vvvv vvüuõuîuçuàuÙuÒuËuÄu½u¶u¯u¨u¡ušu“uŒu…u~uwupuiubu[uTuMuFu?u8u1u*u#uuuuuuùtòtëtätÝtÖtÏtÈtÁtºt³t¬t¥tžt—tt‰t‚t{tttmtft_tXtQtJtCtp7p0p)p"ppp ppÿoøoñoêoãoÜoÕoÎoÇoÀo¹o²o«o¤oo–ooˆoozosoloeo^oWoPoIoBo;o4o-o&oooo ooünõnînçnànÙnÒnËnÄn½n¶n¯n¨n¡nšn“nŒn…n~nwnpninbn[nTnMnFn?n8n1n*n#nnnnnnùmòmëmämÝmÖmÏmÈmÁmºm³m¬m¥mžm—mm‰m‚m{mtmmmfm_mXmQmJmCmi7i0i)i"iii iiÿhøhñhêhãhÜhÕhÎhÇhÀh¹h²h«h¤hh–hhˆhhzhshlheh^hWhPhIhBh;h4h-h&hhhh hhügõgîgçgàgÙgÒgËgÄg½g¶g¯g¨g¡gšg“gŒg…g~gwgpgigbg[gTgMgFg?g8g1g*g#ggggggùfòfëfäfÝfÖfÏfÈfÁfºf³f¬f¥fžf—ff‰f‚f{ftfmfff_fXfQfJfCfb7b0b)b"bbb bbÿaøañaêaãaÜaÕaÎaÇaÀa¹a²a«a¤aa–aaˆaazasalaea^aWaPaIaBa;a4a-a&aaaa aaü`õ`î`ç`à`Ù`Ò`Ë`Ä`½`¶`¯`¨`¡`š`“`Œ`…`~`w`p`i`b`[`T`M`F`?`8`1`*`#``````ù_ò_ë_ä_Ý_Ö_Ï_È_Á_º_³_¬_¥_ž_—__‰_‚_{_t_m_f___X_Q_J_C_<_5_._'_ ___ __ý^ö^ï^è^á^Ú^Ó^Ì^Å^¾^·^°^©^¢^›^”^^†^^x^q^j^c^\^U^N^G^@^9^2^+^$^^^^^^ú]ó]ì]å]Þ]×]Ð]É]Â]»]´]­]¦]Ÿ]˜]‘]Š]ƒ]|]u]n]g]`]Y]R]K]D]=]6]/](]!]]] ]]þ\÷\ð\é\â\Û\Ô\Í\Æ\¿\¸\±\ª\£\œ\•\Ž\‡\€\y\r\k\d\]\V\O\H\A\:\3\,\%\\\\ \\û[ô[í[æ[ß[Ø[Ñ[Ê[Ã[¼[µ[®[§[ [™[’[‹[„[}[v[o[h[a[Z[S[L[E[>[7[0[)["[[[ [[ÿZøZñZêZãZÜZÕZÎZÇZÀZ¹Z²Z«Z¤ZZ–ZZˆZZzZsZlZeZ^ZWZPZIZBZ;Z4Z-Z&ZZZZ ZZüYõYîYçYàYÙYÒYËYÄY½Y¶Y¯Y¨Y¡YšY“YŒY…Y~YwYpYiYbY[YTYMYFY?Y8Y1Y*Y#YYYYYYùXòXëXäXÝXÖXÏXÈXÁXºX³X¬X¥XžX—XX‰X‚X{XtXmXfX_XXXQXJXCXT7T0T)T"TTT TTÿSøSñSêSãSÜSÕSÎSÇSÀS¹S²S«S¤SS–SSˆSSzSsSlSeS^SWSPSISBS;S4S-S&SSSS SSüRõRîRçRàRÙRÒRËRÄR½R¶R¯R¨R¡RšR“RŒR…R~RwRpRiRbR[RTRMRFR?R8R1R*R#RRRRRRùQòQëQäQÝQÖQÏQÈQÁQºQ³Q¬Q¥QžQ—QQ‰Q‚Q{QtQmQfQ_QXQQQJQCQM7M0M)M"MMM MMÿLøLñLêLãLÜLÕLÎLÇLÀL¹L²L«L¤LL–LLˆLLzLsLlLeL^LWLPLILBL;L4L-L&LLLL LLüKõKîKçKàKÙKÒKËKÄK½K¶K¯K¨K¡KšK“KŒK…K~KwKpKiKbK[KTKMKFK?K8K1K*K#KKKKKKùJòJëJäJÝJÖJÏJÈJÁJºJ³J¬J¥JžJ—JJ‰J‚J{JtJmJfJ_JXJQJJJCJF7F0F)F"FFF FFÿEøEñEêEãEÜEÕEÎEÇEÀE¹E²E«E¤EE–EEˆEEzEsElEeE^EWEPEIEBE;E4E-E&EEEE EEüDõDîDçDàDÙDÒDËDÄD½D¶D¯D¨D¡DšD“DŒD…D~DwDpDiDbD[DTDMDFD?D8D1D*D#DDDDDDùCòCëCäCÝCÖCÏCÈCÁCºC³C¬C¥CžC—CC‰C‚C{CtCmCfC_CXCQCJCCC?7?0?)?"??? ??ÿ>ø>ñ>ê>ã>Ü>Õ>Î>Ç>À>¹>²>«>¤>>–>>ˆ>>z>s>l>e>^>W>P>I>B>;>4>->&>>>> >>ü=õ=î=ç=à=Ù=Ò=Ë=Ä=½=¶=¯=¨=¡=š=“=Œ=…=~=w=p=i=b=[=T=M=F=?=8=1=*=#======ù<ò<ë<ä<Ý<Ö<Ï<È<Á<º<³<¬<¥<ž<—<<‰<‚<{<t<m<f<_<X<Q<J<C<<<5<.<'< <<< <<ý;ö;ï;è;á;Ú;Ó;Ì;Å;¾;·;°;©;¢;›;”;;†;;x;q;j;c;\;U;N;G;@;9;2;+;$;;;;;;ú:ó:ì:å:Þ:×:Ð:É:Â:»:´:­:¦:Ÿ:˜:‘:Š:ƒ:|:u:n:g:`:Y:R:K:D:=:6:/:(:!::: ::þ9÷9ð9é9â9Û9Ô9Í9Æ9¿9¸9±9ª9£9œ9•9Ž9‡9€9y9r9k9d9]9V9O9H9A9:939,9%9999 99û8ô8í8æ8ß8Ø8Ñ8Ê8Ã8¼8µ8®8§8 8™8’8‹8„8}8v8o8h8a8Z8S8L8E8>87808)8"888 88ÿ7ø7ñ7ê7ã7Ü7Õ7Î7Ç7À7¹7²7«7¤77–77ˆ77z7s7l7e7^7W7P7I7B7;747-7&7777 77ü6õ6î6ç6à6Ù6Ò6Ë6Ä6½6¶6¯6¨6¡6š6“6Œ6…6~6w6p6i6b6[6T6M6F6?68616*6#666666ù5ò5ë5ä5Ý5Ö5Ï5È5Á5º5³5¬5¥5ž5—55‰5‚5{5t5m5f5_5X5Q5J5C5<555.5'5 555 55ý4ö4ï4è4á4Ú4Ó4Ì4Å4¾4·4°4©4¢4›4”44†44x4q4j4c4\4U4N4G4@49424+4$444444ú3ó3ì3å3Þ3×3Ð3É3Â3»3´3­3¦3Ÿ3˜3‘3Š3ƒ3|3u3n3g3`3Y3R3K3D3=363/3(3!333 33þ2÷2ð2é2â2Û2Ô2Í2Æ2¿2¸2±2ª2£2œ2•2Ž2‡2€2y2r2k2d2]2V2O2H2A2:232,2%2222 22û1ô1í1æ1ß1Ø1Ñ1Ê1Ã1¼1µ1®1§1 1™1’1‹1„1}1v1o1h1a1Z1S1L1E1>17101)1"111 11ÿ0ø0ñ0ê0ã0Ü0Õ0Î0Ç0À0¹0²0«0¤00–00ˆ00z0s0l0e0^0W0P0I0B0;040-0&0000 00ü/õ/î/ç/à/Ù/Ò/Ë/Ä/½/¶/¯/¨/¡/š/“/Œ/…/~/w/p/i/b/[/T/M/F/?/8/1/*/#//////ù.ò.ë.ä.Ý.Ö.Ï.È.Á.º.³.¬.¥.ž.—..‰.‚.{.t.m.f._.X.Q.J.C.<.5...'. ... ..ý-ö-ï-è-á-Ú-Ó-Ì-Å-¾-·-°-©-¢-›-”--†--x-q-j-c-\-U-N-G-@-9-2-+-$------ú,ó,ì,å,Þ,×,Ð,É,Â,»,´,­,¦,Ÿ,˜,‘,Š,ƒ,|,u,n,g,`,Y,R,K,D,=,6,/,(,!,,, ,,þ+÷+ð+é+â+Û+Ô+Í+Æ+¿+¸+±+ª+£+œ+•+Ž+‡+€+y+r+k+d+]+V+O+H+A+:+3+,+%++++ ++û*ô*í*æ*ß*Ø*Ñ*Ê*Ã*¼*µ*®*§* *™*’*‹*„*}*v*o*h*a*Z*S*L*E*>*7*0*)*"*** **ÿ)ø)ñ)ê)ã)Ü)Õ)Î)Ç)À)¹)²)«)¤))–))ˆ))z)s)l)e)^)W)P)I)B);)4)-)&)))) ))ü(õ(î(ç(à(Ù(Ò(Ë(Ä(½(¶(¯(¨(¡(š(“(Œ(…(~(w(p(i(b([(T(M(F(?(8(1(*(#((((((ù'ò'ë'ä'Ý'Ö'Ï'È'Á'º'³'¬'¥'ž'—''‰'‚'{'t'm'f'_'X'Q'J'C'<'5'.''' ''' ''ý&ö&ï&è&á&Ú&Ó&Ì&Å&¾&·&°&©&¢&›&”&&†&&x&q&j&c&\&U&N&G&@&9&2&+&$&&&&&&ú%ó%ì%å%Þ%×%Ð%É%Â%»%´%­%¦%Ÿ%˜%‘%Š%ƒ%|%u%n%g%`%Y%R%K%D%=%6%/%(%!%%% %%þ$÷$ð$é$â$Û$Ô$Í$Æ$¿$¸$±$ª$£$œ$•$Ž$‡$€$y$r$k$d$]$V$O$H$A$:$3$,$%$$$$ $$û#ô#í#æ#ß#Ø#Ñ#Ê#Ã#¼#µ#®#§# #™#’#‹#„#}#v#o#h#a#Z#S#L#E#>#7#0#)#"### ##ÿ"ø"ñ"ê"ã"Ü"Õ"Î"Ç"À"¹"²"«"¤""–""ˆ""z"s"l"e"^"W"P"I"B";"4"-"&"""" ""ü!õ!î!ç!à!Ù!Ò!Ë!Ä!½!¶!¯!¨!¡!š!“!Œ!…!~!w!p!i!b![!T!M!F!?!8!1!*!#!!!!!!ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿÿøÿñÿêÿãÿÜÿÕÿÎÿÇÿÀÿ¹ÿ²ÿ«ÿ¤ÿÿ–ÿÿˆÿÿzÿsÿlÿeÿ^ÿWÿPÿIÿBÿ;ÿ4ÿ-ÿ&ÿÿÿÿ ÿÿüþõþîþçþàþÙþÒþËþÄþ½þ¶þ¯þ¨þ¡þšþ“þŒþ…þ~þwþpþiþbþ[þTþMþFþ?þ8þ1þ*þ#þþþþþþùýòýëýäýÝýÖýÏýÈýÁýºý³ý¬ý¥ýžý—ýý‰ý‚ý{ýtýmýfý_ýXýQýJýCý<ý5ý.ý'ý ýýý ýýýüöüïüèüáüÚüÓüÌüÅü¾ü·ü°ü©ü¢ü›ü”üü†üüxüqüjücü\üUüNüGü@ü9ü2ü+ü$üüüüüüúûóûìûåûÞû×ûÐûÉûÂû»û´û­û¦ûŸû˜û‘ûŠûƒû|ûuûnûgû`ûYûRûKûDû=û6û/û(û!ûûû ûûþú÷úðúéúâúÛúÔúÍúÆú¿ú¸ú±úªú£úœú•úŽú‡ú€úyúrúkúdú]úVúOúHúAú:ú3ú,ú%úúúú úúûùôùíùæùßùØùÑùÊùÃù¼ùµù®ù§ù ù™ù’ù‹ù„ù}ùvùoùhùaùZùSùLùEù>ù7ù0ù)ù"ùùù ùùÿøøøñøêøãøÜøÕøÎøÇøÀø¹ø²ø«ø¤øø–øøˆøøzøsøløeø^øWøPøIøBø;ø4ø-ø&øøøø øøü÷õ÷î÷ç÷à÷Ù÷Ò÷Ë÷Ä÷½÷¶÷¯÷¨÷¡÷š÷“÷Œ÷…÷~÷w÷p÷i÷b÷[÷T÷M÷F÷?÷8÷1÷*÷#÷÷÷÷÷÷ùöòöëöäöÝöÖöÏöÈöÁöºö³ö¬ö¥öžö—öö‰ö‚ö{ötömöfö_öXöQöJöCö<ö5ö.ö'ö ööö ööýõöõïõèõáõÚõÓõÌõÅõ¾õ·õ°õ©õ¢õ›õ”õõ†õõxõqõjõcõ\õUõNõGõ@õ9õ2õ+õ$õõõõõõúôóôìôåôÞô×ôÐôÉôÂô»ô´ô­ô¦ôŸô˜ô‘ôŠôƒô|ôuônôgô`ôYôRôKôDô=ô6ô/ô(ô!ôôô ôôþó÷óðóéóâóÛóÔóÍóÆó¿ó¸ó±óªó£óœó•óŽó‡ó€óyórókódó]óVóOóHóAó:ó3ó,ó%óóóó óóûòôòíòæòßòØòÑòÊòÃò¼òµò®ò§ò ò™ò’ò‹ò„ò}òvòoòhòaòZòSòLòEò>ò7ò0ò)ò"òòò òòÿñøñññêñãñÜñÕñÎñÇñÀñ¹ñ²ñ«ñ¤ññ–ññˆññzñsñlñeñ^ñWñPñIñBñ;ñ4ñ-ñ&ññññ ññüðõðîðçðàðÙðÒðËðÄð½ð¶ð¯ð¨ð¡ðšð“ðŒð…ð~ðwðpðiðbð[ðTðMðFð?ð8ð1ð*ð#ððððððùïòïëïäïÝïÖïÏïÈïÁïºï³ï¬ï¥ïžï—ïï‰ï‚ï{ïtïmïfï_ïXïQïJïCï<ï5ï.ï'ï ïïï ïïýîöîïîèîáîÚîÓîÌîÅî¾î·î°î©î¢î›î”îî†îîxîqîjîcî\îUîNîGî@î9î2î+î$îîîîîîúíóíìíåíÞí×íÐíÉíÂí»í´í­í¦íŸí˜í‘íŠíƒí|íuínígí`íYíRíKíDí=í6í/í(í!ííí ííþì÷ìðìéìâìÛìÔìÍìÆì¿ì¸ì±ìªì£ìœì•ìŽì‡ì€ìyìrìkìdì]ìVìOìHìAì:ì3ì,ì%ìììì ììûëôëíëæëßëØëÑëÊëÃë¼ëµë®ë§ë ë™ë’ë‹ë„ë}ëvëoëhëaëZëSëLëEë>ë7ë0ë)ë"ëëë ëëÿêøêñêêêãêÜêÕêÎêÇêÀê¹ê²ê«ê¤êê–êêˆêêzêsêlêeê^êWêPêIêBê;ê4ê-ê&êêêê êêüéõéîéçéàéÙéÒéËéÄé½é¶é¯é¨é¡éšé“éŒé…é~éwépéiébé[éTéMéFé?é8é1é*é#ééééééùèòèëèäèÝèÖèÏèÈèÁèºè³è¬è¥èžè—èè‰è‚è{ètèmèfè_èXèQèJèCè<è5è.è'è èèè èèýçöçïçèçáçÚçÓçÌçÅç¾ç·ç°ç©ç¢ç›ç”çç†ççxçqçjçcç\çUçNçGç@ç9ç2ç+ç$ççççççúæóæìæåæÞæ׿ÐæÉæÂæ»æ´æ­æ¦æŸæ˜æ‘æŠæƒæ|æuænægæ`æYæRæKæDæ=æ6æ/æ(æ!æææ ææþå÷åðåéåâåÛåÔåÍåÆå¿å¸å±åªå£åœå•åŽå‡å€åyåråkådå]åVåOåHåAå:å3å,å%åååå ååûäôäíäæäßäØäÑäÊäÃä¼äµä®ä§ä ä™ä’ä‹ä„ä}äväoähäaäZäSäLäEä>ä7ä0ä)ä"äää ääÿãøãñãêãããÜãÕãÎãÇãÀã¹ã²ã«ã¤ãã–ããˆããzãsãlãeã^ãWãPãIãBã;ã4ã-ã&ãããã ããüâõâîâçâàâÙâÒâËâÄâ½â¶â¯â¨â¡âšâ“âŒâ…â~âwâpâiâbâ[âTâMâFâ?â8â1â*â#ââââââùáòáëáäáÝáÖáÏáÈáÁáºá³á¬á¥ážá—áá‰á‚á{átámáfá_áXáQáJáCá<á5á.á'á ááá ááýàöàïàèàáàÚàÓàÌàÅà¾à·à°à©à¢à›à”àà†ààxàqàjàcà\àUàNàGà@à9à2à+à$ààààààúßóßìßåßÞß×ßÐßÉßÂ߻ߴ߭ߦߟߘߑߊ߃ß|ßußnßgß`ßYßRßKßDß=ß6ß/ß(ß!ßßß ßßþÞ÷ÞðÞéÞâÞÛÞÔÞÍÞÆÞ¿Þ¸Þ±ÞªÞ£ÞœÞ•ÞŽÞ‡Þ€ÞyÞrÞkÞdÞ]ÞVÞOÞHÞAÞ:Þ3Þ,Þ%ÞÞÞÞ ÞÞûÝôÝíÝæÝßÝØÝÑÝÊÝÃݼݵݮݧݠݙݒ݋݄Ý}ÝvÝoÝhÝaÝZÝSÝLÝEÝ>Ý7Ý0Ý)Ý"ÝÝÝ ÝÝÿÜøÜñÜêÜãÜÜÜÕÜÎÜÇÜÀܹܲܫܤÜÜ–Ü܈ÜÜzÜsÜlÜeÜ^ÜWÜPÜIÜBÜ;Ü4Ü-Ü&ÜÜÜÜ ÜÜüÛõÛîÛçÛàÛÙÛÒÛËÛÄ۽۶ۯۨۡۚۓیۅÛ~ÛwÛpÛiÛbÛ[ÛTÛMÛFÛ?Û8Û1Û*Û#ÛÛÛÛÛÛùÚòÚëÚäÚÝÚÖÚÏÚÈÚÁÚºÚ³Ú¬Ú¥ÚžÚ—ÚÚ‰Ú‚Ú{ÚtÚmÚfÚ_ÚXÚQÚJÚCÚ<Ú5Ú.Ú'Ú ÚÚÚ ÚÚýÙöÙïÙèÙáÙÚÙÓÙÌÙÅپٷٰ٩٢ٛٔÙÙ†ÙÙxÙqÙjÙcÙ\ÙUÙNÙGÙ@Ù9Ù2Ù+Ù$ÙÙÙÙÙÙúØóØìØåØÞØרÐØÉØÂØ»Ø´Ø­Ø¦ØŸØ˜Ø‘؊؃Ø|ØuØnØgØ`ØYØRØKØDØ=Ø6Ø/Ø(Ø!ØØØ ØØþ×÷×ð×é×â×Û×Ô×Í×Æ×¿×¸×±×ª×£×œ×•×Ž×‡×€×y×r×k×d×]×V×O×H×A×:×3×,×%×××× ××ûÖôÖíÖæÖßÖØÖÑÖÊÖÃÖ¼ÖµÖ®Ö§Ö Ö™Ö’Ö‹Ö„Ö}ÖvÖoÖhÖaÖZÖSÖLÖEÖ>Ö7Ö0Ö)Ö"ÖÖÖ ÖÖÿÕøÕñÕêÕãÕÜÕÕÕÎÕÇÕÀÕ¹Õ²Õ«Õ¤ÕÕ–ÕÕˆÕÕzÕsÕlÕeÕ^ÕWÕPÕIÕBÕ;Õ4Õ-Õ&ÕÕÕÕ ÕÕüÔõÔîÔçÔàÔÙÔÒÔËÔÄԽԶԯԨԡԚԓԌԅÔ~ÔwÔpÔiÔbÔ[ÔTÔMÔFÔ?Ô8Ô1Ô*Ô#ÔÔÔÔÔÔùÓòÓëÓäÓÝÓÖÓÏÓÈÓÁÓºÓ³Ó¬Ó¥ÓžÓ—ÓÓ‰Ó‚Ó{ÓtÓmÓfÓ_ÓXÓQÓJÓCÓ<Ó5Ó.Ó'Ó ÓÓÓ ÓÓýÒöÒïÒèÒáÒÚÒÓÒÌÒÅÒ¾Ò·Ò°Ò©Ò¢Ò›Ò”ÒÒ†ÒÒxÒqÒjÒcÒ\ÒUÒNÒGÒ@Ò9Ò2Ò+Ò$ÒÒÒÒÒÒúÑóÑìÑåÑÞÑ×ÑÐÑÉÑÂѻѴѭѦџјёъуÑ|ÑuÑnÑgÑ`ÑYÑRÑKÑDÑ=Ñ6Ñ/Ñ(Ñ!ÑÑÑ ÑÑþÐ÷ÐðÐéÐâÐÛÐÔÐÍÐÆÐ¿Ð¸Ð±ÐªÐ£ÐœÐ•ÐŽÐ‡Ð€ÐyÐrÐkÐdÐ]ÐVÐOÐHÐAÐ:Ð3Ð,Ð%ÐÐÐÐ ÐÐûÏôÏíÏæÏßÏØÏÑÏÊÏÃϼϵϮϧϠϙϒϋτÏ}ÏvÏoÏhÏaÏZÏSÏLÏEÏ>Ï7Ï0Ï)Ï"ÏÏÏ ÏÏÿÎøÎñÎêÎãÎÜÎÕÎÎÎÇÎÀιβΫΤÎΖÎΈÎÎzÎsÎlÎeÎ^ÎWÎPÎIÎBÎ;Î4Î-Î&ÎÎÎÎ ÎÎüÍõÍîÍçÍàÍÙÍÒÍËÍÄͽͶ͚͓ͯͨ͌͡ͅÍ~ÍwÍpÍiÍbÍ[ÍTÍMÍFÍ?Í8Í1Í*Í#ÍÍÍÍÍÍùÌòÌëÌäÌÝÌÖÌÏÌÈÌÁ̺̳̬̥̞̗Ì̉̂Ì{ÌtÌmÌfÌ_ÌXÌQÌJÌCÌ<Ì5Ì.Ì'Ì ÌÌÌ ÌÌýËöËïËèËáËÚËÓËÌËÅ˾˷˰˩ˢ˛˔ˈËËxËqËjËcË\ËUËNËGË@Ë9Ë2Ë+Ë$ËËËËËËúÊóÊìÊåÊÞÊ×ÊÐÊÉÊÂʻʴʭʦʟʘʑʊʃÊ|ÊuÊnÊgÊ`ÊYÊRÊKÊDÊ=Ê6Ê/Ê(Ê!ÊÊÊ ÊÊþÉ÷ÉðÉéÉâÉÛÉÔÉÍÉÆÉ¿É¸É±ÉªÉ£ÉœÉ•ÉŽÉ‡É€ÉyÉrÉkÉdÉ]ÉVÉOÉHÉAÉ:É3É,É%ÉÉÉÉ ÉÉûÈôÈíÈæÈßÈØÈÑÈÊÈÃȼȵȮȧȠșȒȋȄÈ}ÈvÈoÈhÈaÈZÈSÈLÈEÈ>È7È0È)È"ÈÈÈ ÈÈÿÇøÇñÇêÇãÇÜÇÕÇÎÇÇÇÀǹDzǫǤÇÇ–ÇLjÇÇzÇsÇlÇeÇ^ÇWÇPÇIÇBÇ;Ç4Ç-Ç&ÇÇÇÇ ÇÇüÆõÆîÆçÆàÆÙÆÒÆËÆÄƽƶƯƨơƚƓƌƅÆ~ÆwÆpÆiÆbÆ[ÆTÆMÆFÆ?Æ8Æ1Æ*Æ#ÆÆÆÆÆÆùÅòÅëÅäÅÝÅÖÅÏÅÈÅÁźųŬťŞŗÅʼnłÅ{ÅtÅmÅfÅ_ÅXÅQÅJÅCÅ<Å5Å.Å'Å ÅÅÅ ÅÅýÄöÄïÄèÄáÄÚÄÓÄÌÄÅľķİĩĢěĔÄĆÄÄxÄqÄjÄcÄ\ÄUÄNÄGÄ@Ä9Ä2Ä+Ä$ÄÄÄÄÄÄúÃóÃìÃåÃÞÃ×ÃÐÃÉÃÂûôíæßØÑÊÃÃ|ÃuÃnÃgÃ`ÃYÃRÃKÃDÃ=Ã6Ã/Ã(Ã!ÃÃà ÃÃþÂ÷ÂðÂéÂâÂÛÂÔÂÍÂÆÂ¿Â¸Â±ÂªÂ£ÂœÂ•ÂŽÂ‡Â€ÂyÂrÂkÂdÂ]ÂVÂOÂHÂAÂ:Â3Â,Â% ÂÂûÁôÁíÁæÁßÁØÁÑÁÊÁÃÁ¼ÁµÁ®Á§Á Á™Á’Á‹Á„Á}ÁvÁoÁhÁaÁZÁSÁLÁEÁ>Á7Á0Á)Á"ÁÁÁ ÁÁÿÀøÀñÀêÀãÀÜÀÕÀÎÀÇÀÀÀ¹À²À«À¤ÀÀ–ÀÀˆÀÀzÀsÀlÀeÀ^ÀWÀPÀIÀBÀ;À4À-À&ÀÀÀÀ ÀÀü¿õ¿î¿ç¿à¿Ù¿Ò¿Ë¿Ä¿½¿¶¿¯¿¨¿¡¿š¿“¿Œ¿…¿~¿w¿p¿i¿b¿[¿T¿M¿F¿?¿8¿1¿*¿#¿¿¿¿¿¿ù¾ò¾ë¾ä¾ݾÖ¾ϾȾÁ¾º¾³¾¬¾¥¾ž¾—¾¾‰¾‚¾{¾t¾m¾f¾_¾X¾Q¾J¾C¾<¾5¾.¾'¾ ¾¾¾ ¾¾ý½ö½ï½è½á½Ú½Ó½̽޾½·½°½©½¢½›½”½½†½½x½q½j½c½\½U½N½G½@½9½2½+½$½½½½½½ú¼ó¼ì¼å¼Þ¼×¼мɼ¼»¼´¼­¼¦¼Ÿ¼˜¼‘¼мƒ¼|¼u¼n¼g¼`¼Y¼R¼K¼D¼=¼6¼/¼(¼!¼¼¼ ¼¼þ»÷»ð»é»â»Û»Ô»Í»Æ»¿»¸»±»ª»£»œ»•»Ž»‡»€»y»r»k»d»]»V»O»H»A»:»3»,»%»»»» »»ûºôºíºæºߺغѺʺú¼ºµº®º§º º™º’º‹º„º}ºvºoºhºaºZºSºLºEº>º7º0º)º"ººº ººÿ¹ø¹ñ¹ê¹ã¹ܹÕ¹ιǹÀ¹¹¹²¹«¹¤¹¹–¹¹ˆ¹¹z¹s¹l¹e¹^¹W¹P¹I¹B¹;¹4¹-¹&¹¹¹¹ ¹¹ü¸õ¸î¸ç¸à¸Ù¸Ò¸˸ĸ½¸¶¸¯¸¨¸¡¸š¸“¸Œ¸…¸~¸w¸p¸i¸b¸[¸T¸M¸F¸?¸8¸1¸*¸#¸¸¸¸¸¸ù·ò·ë·ä·Ý·Ö·Ï·È·Á·º·³·¬·¥·ž·—··‰·‚·{·t·m·f·_·X·Q·J·C·<·5·.·'· ··· ··ý¶ö¶ï¶è¶á¶Ú¶Ó¶̶Ŷ¾¶·¶°¶©¶¢¶›¶”¶¶†¶¶x¶q¶j¶c¶\¶U¶N¶G¶@¶9¶2¶+¶$¶¶¶¶¶¶úµóµìµåµÞµ×µеɵµ»µ´µ­µ¦µŸµ˜µ‘µеƒµ|µuµnµgµ`µYµRµKµDµ=µ6µ/µ(µ!µµµ µµþ´÷´ð´é´â´Û´Ô´Í´Æ´¿´¸´±´ª´£´œ´•´Ž´‡´€´y´r´k´d´]´V´O´H´A´:´3´,´%´´´´ ´´û³ô³í³æ³ß³سѳʳó¼³µ³®³§³ ³™³’³‹³„³}³v³o³h³a³Z³S³L³E³>³7³0³)³"³³³ ³³ÿ²ø²ñ²ê²ã²ܲÕ²βDzÀ²¹²²²«²¤²²–²²ˆ²²z²s²l²e²^²W²P²I²B²;²4²-²&²²²² ²²ü±õ±î±ç±à±Ù±Ò±˱ı½±¶±¯±¨±¡±š±“±Œ±…±~±w±p±i±b±[±T±M±F±?±8±1±*±#±±±±±±ù°ò°ë°ä°ݰÖ°ϰȰÁ°º°³°¬°¥°ž°—°°‰°‚°{°t°m°f°_°X°Q°J°C°<°5°.°'° °°° °°ý¯ö¯ï¯è¯á¯Ú¯Ó¯̯ů¾¯·¯°¯©¯¢¯›¯”¯¯†¯¯x¯q¯j¯c¯\¯U¯N¯G¯@¯9¯2¯+¯$¯¯¯¯¯¯ú®ó®ì®å®Þ®×®ЮÉ®®»®´®­®¦®Ÿ®˜®‘®Š®ƒ®|®u®n®g®`®Y®R®K®D®=®6®/®(®!®®® ®®þ­÷­ð­é­â­Û­Ô­Í­Æ­¿­¸­±­ª­£­œ­•­Ž­‡­€­y­r­k­d­]­V­O­H­A­:­3­,­%­­­­ ­­û¬ô¬í¬æ¬߬جѬʬ켬µ¬®¬§¬ ¬™¬’¬‹¬„¬}¬v¬o¬h¬a¬Z¬S¬L¬E¬>¬7¬0¬)¬"¬¬¬ ¬¬ÿ«ø«ñ«ê«ã«Ü«Õ«ΫÇ«À«¹«²«««¤««–««ˆ««z«s«l«e«^«W«P«I«B«;«4«-«&«««« ««üªõªîªçªàªÙªÒª˪νª¶ª¯ª¨ª¡ªšª“ªŒª…ª~ªwªpªiªbª[ªTªMªFª?ª8ª1ª*ª#ªªªªªªù©ò©ë©ä©Ý©Ö©Ï©È©Á©º©³©¬©¥©ž©—©©‰©‚©{©t©m©f©_©X©Q©J©C©<©5©.©'© ©©© ©©ý¨ö¨ï¨è¨á¨Ú¨Ó¨̨Ũ¾¨·¨°¨©¨¢¨›¨”¨¨†¨¨x¨q¨j¨c¨\¨U¨N¨G¨@¨9¨2¨+¨$¨¨¨¨¨¨ú§ó§ì§å§Þ§×§Чɧ§»§´§­§¦§Ÿ§˜§‘§Чƒ§|§u§n§g§`§Y§R§K§D§=§6§/§(§!§§§ §§þ¦÷¦ð¦é¦â¦Û¦Ô¦ͦƦ¿¦¸¦±¦ª¦£¦œ¦•¦ަ‡¦€¦y¦r¦k¦d¦]¦V¦O¦H¦A¦:¦3¦,¦%¦¦¦¦ ¦¦û¥ô¥í¥æ¥ߥإѥʥå¼¥µ¥®¥§¥ ¥™¥’¥‹¥„¥}¥v¥o¥h¥a¥Z¥S¥L¥E¥>¥7¥0¥)¥"¥¥¥ ¥¥ÿ¤ø¤ñ¤ê¤ã¤ܤÕ¤ΤǤÀ¤¹¤²¤«¤¤¤¤–¤¤ˆ¤¤z¤s¤l¤e¤^¤W¤P¤I¤B¤;¤4¤-¤&¤¤¤¤ ¤¤ü£õ£î£ç£à£Ù£Ò£Ë£Ä£½£¶£¯£¨£¡£š£“£Œ£…£~£w£p£i£b£[£T£M£F£?£8£1£*£#££££££ù¢ò¢ë¢ä¢Ý¢Ö¢Ï¢È¢Á¢º¢³¢¬¢¥¢ž¢—¢¢‰¢‚¢{¢t¢m¢f¢_¢X¢Q¢J¢C¢<¢5¢.¢'¢ ¢¢¢ ¢¢ý¡ö¡ï¡è¡á¡Ú¡Ó¡Ì¡Å¡¾¡·¡°¡©¡¢¡›¡”¡¡†¡¡x¡q¡j¡c¡\¡U¡N¡G¡@¡9¡2¡+¡$¡¡¡¡¡¡ú ó ì å Þ × РÉ  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þŸ÷ŸðŸéŸâŸÛŸÔŸÍŸÆŸ¿Ÿ¸Ÿ±ŸªŸ£ŸœŸ•ŸŽŸ‡Ÿ€ŸyŸrŸkŸdŸ]ŸVŸOŸHŸAŸ:Ÿ3Ÿ,Ÿ%ŸŸŸŸ ŸŸûžôžížæžßžØžÑžÊžÞ¼žµž®ž§ž ž™ž’ž‹ž„ž}žvžožhžažZžSžLžEž>ž7ž0ž)ž"žžž žžÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üœõœîœçœàœÙœÒœËœÄœ½œ¶œ¯œ¨œ¡œšœ“œŒœ…œ~œwœpœiœbœ[œTœMœFœ?œ8œ1œ*œ#œœœœœœù›ò›ë›ä›Ý›Ö›Ï›È›Á›º›³›¬›¥›ž›—››‰›‚›{›t›m›f›_›X›Q›J›C›<›5›.›'› ››› ››ýšöšïšèšášÚšÓšÌšÅš¾š·š°š©š¢š›š”šš†ššxšqšjšcš\šUšNšGš@š9š2š+š$ššššššú™ó™ì™å™Þ™×™ЙÉ™™»™´™­™¦™Ÿ™˜™‘™Š™ƒ™|™u™n™g™`™Y™R™K™D™=™6™/™(™!™™™ ™™þ˜÷˜ð˜é˜â˜Û˜Ô˜͘Ƙ¿˜¸˜±˜ª˜£˜œ˜•˜Ž˜‡˜€˜y˜r˜k˜d˜]˜V˜O˜H˜A˜:˜3˜,˜%˜˜˜˜ ˜˜û—ô—í—æ—ß—Ø—Ñ—Ê—×¼—µ—®—§— —™—’—‹—„—}—v—o—h—a—Z—S—L—E—>—7—0—)—"——— ——ÿ–ø–ñ–ê–ã–Ü–Õ–ΖÇ–À–¹–²–«–¤–––––ˆ––z–s–l–e–^–W–P–I–B–;–4–-–&–––– ––ü•õ•î•ç•à•ٕҕ˕ĕ½•¶•¯•¨•¡•š•“•Œ•…•~•w•p•i•b•[•T•M•F•?•8•1•*•#••••••ù”ò”ë”ä”ݔ֔ϔȔÁ”º”³”¬”¥”ž”—””‰”‚”{”t”m”f”_”X”Q”J”C”<”5”.”'” ””” ””ý“ö“ï“è“á“ړӓ̓œ¾“·“°“©“¢“›“”““†““x“q“j“c“\“U“N“G“@“9“2“+“$““““““ú’ó’ì’å’Þ’×’Ð’É’Â’»’´’­’¦’Ÿ’˜’‘’Š’ƒ’|’u’n’g’`’Y’R’K’D’=’6’/’(’!’’’ ’’þ‘÷‘ð‘é‘â‘ۑԑ͑Ƒ¿‘¸‘±‘ª‘£‘œ‘•‘Ž‘‡‘€‘y‘r‘k‘d‘]‘V‘O‘H‘A‘:‘3‘,‘%‘‘‘‘ ‘‘ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üŽõŽîŽçŽàŽÙŽÒŽËŽÄŽ½Ž¶Ž¯Ž¨Ž¡ŽšŽ“ŽŒŽ…Ž~ŽwŽpŽiŽbŽ[ŽTŽMŽFŽ?Ž8Ž1Ž*Ž#ŽŽŽŽŽŽùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýŒöŒïŒèŒáŒÚŒÓŒÌŒÅŒ¾Œ·Œ°Œ©Œ¢Œ›Œ”ŒŒ†ŒŒxŒqŒjŒcŒ\ŒUŒNŒGŒ@Œ9Œ2Œ+Œ$ŒŒŒŒŒŒú‹ó‹ì‹å‹Þ‹׋ЋÉ‹‹»‹´‹­‹¦‹Ÿ‹˜‹‘‹Š‹ƒ‹|‹u‹n‹g‹`‹Y‹R‹K‹D‹=‹6‹/‹(‹!‹‹‹ ‹‹þŠ÷ŠðŠéŠâŠÛŠÔŠÍŠÆŠ¿Š¸Š±ŠªŠ£ŠœŠ•ŠŽŠ‡Š€ŠyŠrŠkŠdŠ]ŠVŠOŠHŠAŠ:Š3Š,Š%ŠŠŠŠ ŠŠû‰ô‰í‰æ‰߉؉щʉɼ‰µ‰®‰§‰ ‰™‰’‰‹‰„‰}‰v‰o‰h‰a‰Z‰S‰L‰E‰>‰7‰0‰)‰"‰‰‰ ‰‰ÿˆøˆñˆêˆãˆ܈ÕˆΈLjÀˆ¹ˆ²ˆ«ˆ¤ˆˆ–ˆˆˆˆˆzˆsˆlˆeˆ^ˆWˆPˆIˆBˆ;ˆ4ˆ-ˆ&ˆˆˆˆ ˆˆü‡õ‡î‡ç‡à‡Ù‡Ò‡ˇć½‡¶‡¯‡¨‡¡‡š‡“‡Œ‡…‡~‡w‡p‡i‡b‡[‡T‡M‡F‡?‡8‡1‡*‡#‡‡‡‡‡‡ù†ò†ë†ä†݆Ö†φȆÁ†º†³†¬†¥†ž†—††‰†‚†{†t†m†f†_†X†Q†J†C†<†5†.†'† ††† ††ý…ö…ï…è…á…Ú…Ó…Ì…Å…¾…·…°…©…¢…›…”……†……x…q…j…c…\…U…N…G…@…9…2…+…$………………ú„ó„ì„å„Þ„ׄЄÉ„„»„´„­„¦„Ÿ„˜„‘„Š„ƒ„|„u„n„g„`„Y„R„K„D„=„6„/„(„!„„„ „„þƒ÷ƒðƒéƒâƒÛƒÔƒ̓ƃ¿ƒ¸ƒ±ƒªƒ£ƒœƒ•ƒŽƒ‡ƒ€ƒyƒrƒkƒdƒ]ƒVƒOƒHƒAƒ:ƒ3ƒ,ƒ%ƒƒƒƒ ƒƒû‚ô‚í‚æ‚߂؂тʂ¼‚µ‚®‚§‚ ‚™‚’‚‹‚„‚}‚v‚o‚h‚a‚Z‚S‚L‚E‚>‚7‚0‚)‚"‚‚‚ ‚‚ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü€õ€î€ç€à€Ù€Ò€Ë€Ä€½€¶€¯€¨€¡€š€“€Œ€…€~€w€p€i€b€[€T€M€F€?€8€1€*€#€€€€€€ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ý~ö~ï~è~á~Ú~Ó~Ì~Å~¾~·~°~©~¢~›~”~~†~~x~q~j~c~\~U~N~G~@~9~2~+~$~~~~~~ú}ó}ì}å}Þ}×}Ð}É}Â}»}´}­}¦}Ÿ}˜}‘}Š}ƒ}|}u}n}g}`}Y}R}K}D}=}6}/}(}!}}} }}þ|÷|ð|é|â|Û|Ô|Í|Æ|¿|¸|±|ª|£|œ|•|Ž|‡|€|y|r|k|d|]|V|O|H|A|:|3|,|%|||| ||û{ô{í{æ{ß{Ø{Ñ{Ê{Ã{¼{µ{®{§{ {™{’{‹{„{}{v{o{h{a{Z{S{L{E{>{7{0{){"{{{ {{ÿzøzñzêzãzÜzÕzÎzÇzÀz¹z²z«z¤zz–zzˆzzzzszlzez^zWzPzIzBz;z4z-z&zzzz zzüyõyîyçyàyÙyÒyËyÄy½y¶y¯y¨y¡yšy“yŒy…y~ywypyiyby[yTyMyFy?y8y1y*y#yyyyyyùxòxëxäxÝxÖxÏxÈxÁxºx³x¬x¥xžx—xx‰x‚x{xtxmxfx_xXxQxJxCxt7t0t)t"ttt ttÿsøsñsêsãsÜsÕsÎsÇsÀs¹s²s«s¤ss–ssˆsszssslses^sWsPsIsBs;s4s-s&ssss ssürõrîrçràrÙrÒrËrÄr½r¶r¯r¨r¡ršr“rŒr…r~rwrprirbr[rTrMrFr?r8r1r*r#rrrrrrùqòqëqäqÝqÖqÏqÈqÁqºq³q¬q¥qžq—qq‰q‚q{qtqmqfq_qXqQqJqCqm7m0m)m"mmm mmÿlølñlêlãlÜlÕlÎlÇlÀl¹l²l«l¤ll–llˆllzlslllel^lWlPlIlBl;l4l-l&llll llükõkîkçkàkÙkÒkËkÄk½k¶k¯k¨k¡kšk“kŒk…k~kwkpkikbk[kTkMkFk?k8k1k*k#kkkkkkùjòjëjäjÝjÖjÏjÈjÁjºj³j¬j¥jžj—jj‰j‚j{jtjmjfj_jXjQjJjCjf7f0f)f"fff ffÿeøeñeêeãeÜeÕeÎeÇeÀe¹e²e«e¤ee–eeˆeezeseleee^eWePeIeBe;e4e-e&eeee eeüdõdîdçdàdÙdÒdËdÄd½d¶d¯d¨d¡dšd“dŒd…d~dwdpdidbd[dTdMdFd?d8d1d*d#ddddddùcòcëcäcÝcÖcÏcÈcÁcºc³c¬c¥cžc—cc‰c‚c{ctcmcfc_cXcQcJcCc_7_0_)_"___ __ÿ^ø^ñ^ê^ã^Ü^Õ^Î^Ç^À^¹^²^«^¤^^–^^ˆ^^z^s^l^e^^^W^P^I^B^;^4^-^&^^^^ ^^ü]õ]î]ç]à]Ù]Ò]Ë]Ä]½]¶]¯]¨]¡]š]“]Œ]…]~]w]p]i]b][]T]M]F]?]8]1]*]#]]]]]]ù\ò\ë\ä\Ý\Ö\Ï\È\Á\º\³\¬\¥\ž\—\\‰\‚\{\t\m\f\_\X\Q\J\C\<\5\.\'\ \\\ \\ý[ö[ï[è[á[Ú[Ó[Ì[Å[¾[·[°[©[¢[›[”[[†[[x[q[j[c[\[U[N[G[@[9[2[+[$[[[[[[úZóZìZåZÞZ×ZÐZÉZÂZ»Z´Z­Z¦ZŸZ˜Z‘ZŠZƒZ|ZuZnZgZ`ZYZRZKZDZ=Z6Z/Z(Z!ZZZ ZZþY÷YðYéYâYÛYÔYÍYÆY¿Y¸Y±YªY£YœY•YŽY‡Y€YyYrYkYdY]YVYOYHYAY:Y3Y,Y%YYYY YYûXôXíXæXßXØXÑXÊXÃX¼XµX®X§X X™X’X‹X„X}XvXoXhXaXZXSXLXEX>X7X0X)X"XXX XXÿWøWñWêWãWÜWÕWÎWÇWÀW¹W²W«W¤WW–WWˆWWzWsWlWeW^WWWPWIWBW;W4W-W&WWWW WWüVõVîVçVàVÙVÒVËVÄV½V¶V¯V¨V¡VšV“VŒV…V~VwVpViVbV[VTVMVFV?V8V1V*V#VVVVVVùUòUëUäUÝUÖUÏUÈUÁUºU³U¬U¥UžU—UU‰U‚U{UtUmUfU_UXUQUJUCUQ7Q0Q)Q"QQQ QQÿPøPñPêPãPÜPÕPÎPÇPÀP¹P²P«P¤PP–PPˆPPzPsPlPeP^PWPPPIPBP;P4P-P&PPPP PPüOõOîOçOàOÙOÒOËOÄO½O¶O¯O¨O¡OšO“OŒO…O~OwOpOiObO[OTOMOFO?O8O1O*O#OOOOOOùNòNëNäNÝNÖNÏNÈNÁNºN³N¬N¥NžN—NN‰N‚N{NtNmNfN_NXNQNJNCNJ7J0J)J"JJJ JJÿIøIñIêIãIÜIÕIÎIÇIÀI¹I²I«I¤II–IIˆIIzIsIlIeI^IWIPIIIBI;I4I-I&IIII IIüHõHîHçHàHÙHÒHËHÄH½H¶H¯H¨H¡HšH“HŒH…H~HwHpHiHbH[HTHMHFH?H8H1H*H#HHHHHHùGòGëGäGÝGÖGÏGÈGÁGºG³G¬G¥GžG—GG‰G‚G{GtGmGfG_GXGQGJGCGC7C0C)C"CCC CCÿBøBñBêBãBÜBÕBÎBÇBÀB¹B²B«B¤BB–BBˆBBzBsBlBeB^BWBPBIBBB;B4B-B&BBBB BBüAõAîAçAàAÙAÒAËAÄA½A¶A¯A¨A¡AšA“AŒA…A~AwApAiAbA[ATAMAFA?A8A1A*A#AAAAAAù@ò@ë@ä@Ý@Ö@Ï@È@Á@º@³@¬@¥@ž@—@@‰@‚@{@t@m@f@_@X@Q@J@C@<@5@.@'@ @@@ @@ý?ö?ï?è?á?Ú?Ó?Ì?Å?¾?·?°?©?¢?›?”??†??x?q?j?c?\?U?N?G?@?9?2?+?$??????ú>ó>ì>å>Þ>×>Ð>É>Â>»>´>­>¦>Ÿ>˜>‘>Š>ƒ>|>u>n>g>`>Y>R>K>D>=>6>/>(>!>>> >>þ=÷=ð=é=â=Û=Ô=Í=Æ=¿=¸=±=ª=£=œ=•=Ž=‡=€=y=r=k=d=]=V=O=H=A=:=3=,=%==== ==û<ô<í<æ<ß<Ø<Ñ<Ê<Ã<¼<µ<®<§< <™<’<‹<„<}<v<o<h<a<Z<S<L<E<><7<0<)<"<<< <<ÿ;ø;ñ;ê;ã;Ü;Õ;Î;Ç;À;¹;²;«;¤;;–;;ˆ;;z;s;l;e;^;W;P;I;B;;;4;-;&;;;; ;;ü:õ:î:ç:à:Ù:Ò:Ë:Ä:½:¶:¯:¨:¡:š:“:Œ:…:~:w:p:i:b:[:T:M:F:?:8:1:*:#::::::ù9ò9ë9ä9Ý9Ö9Ï9È9Á9º9³9¬9¥9ž9—99‰9‚9{9t9m9f9_9X9Q9J9C9<959.9'9 999 99ý8ö8ï8è8á8Ú8Ó8Ì8Å8¾8·8°8©8¢8›8”88†88x8q8j8c8\8U8N8G8@89828+8$888888ú7ó7ì7å7Þ7×7Ð7É7Â7»7´7­7¦7Ÿ7˜7‘7Š7ƒ7|7u7n7g7`7Y7R7K7D7=767/7(7!777 77þ6÷6ð6é6â6Û6Ô6Í6Æ6¿6¸6±6ª6£6œ6•6Ž6‡6€6y6r6k6d6]6V6O6H6A6:636,6%6666 66û5ô5í5æ5ß5Ø5Ñ5Ê5Ã5¼5µ5®5§5 5™5’5‹5„5}5v5o5h5a5Z5S5L5E5>57505)5"555 55ÿ4ø4ñ4ê4ã4Ü4Õ4Î4Ç4À4¹4²4«4¤44–44ˆ44z4s4l4e4^4W4P4I4B4;444-4&4444 44ü3õ3î3ç3à3Ù3Ò3Ë3Ä3½3¶3¯3¨3¡3š3“3Œ3…3~3w3p3i3b3[3T3M3F3?38313*3#333333ù2ò2ë2ä2Ý2Ö2Ï2È2Á2º2³2¬2¥2ž2—22‰2‚2{2t2m2f2_2X2Q2J2C2<252.2'2 222 22ý1ö1ï1è1á1Ú1Ó1Ì1Å1¾1·1°1©1¢1›1”11†11x1q1j1c1\1U1N1G1@19121+1$111111ú0ó0ì0å0Þ0×0Ð0É0Â0»0´0­0¦0Ÿ0˜0‘0Š0ƒ0|0u0n0g0`0Y0R0K0D0=060/0(0!000 00þ/÷/ð/é/â/Û/Ô/Í/Æ/¿/¸/±/ª/£/œ/•/Ž/‡/€/y/r/k/d/]/V/O/H/A/:/3/,/%//// //û.ô.í.æ.ß.Ø.Ñ.Ê.Ã.¼.µ.®.§. .™.’.‹.„.}.v.o.h.a.Z.S.L.E.>.7.0.)."... ..ÿ-ø-ñ-ê-ã-Ü-Õ-Î-Ç-À-¹-²-«-¤--–--ˆ--z-s-l-e-^-W-P-I-B-;-4---&---- --ü,õ,î,ç,à,Ù,Ò,Ë,Ä,½,¶,¯,¨,¡,š,“,Œ,…,~,w,p,i,b,[,T,M,F,?,8,1,*,#,,,,,,ù+ò+ë+ä+Ý+Ö+Ï+È+Á+º+³+¬+¥+ž+—++‰+‚+{+t+m+f+_+X+Q+J+C+<+5+.+'+ +++ ++ý*ö*ï*è*á*Ú*Ó*Ì*Å*¾*·*°*©*¢*›*”**†**x*q*j*c*\*U*N*G*@*9*2*+*$******ú)ó)ì)å)Þ)×)Ð)É)Â)»)´)­)¦)Ÿ)˜)‘)Š)ƒ)|)u)n)g)`)Y)R)K)D)=)6)/)()!))) ))þ(÷(ð(é(â(Û(Ô(Í(Æ(¿(¸(±(ª(£(œ(•(Ž(‡(€(y(r(k(d(](V(O(H(A(:(3(,(%(((( ((û'ô'í'æ'ß'Ø'Ñ'Ê'Ã'¼'µ'®'§' '™'’'‹'„'}'v'o'h'a'Z'S'L'E'>'7'0')'"''' ''ÿ&ø&ñ&ê&ã&Ü&Õ&Î&Ç&À&¹&²&«&¤&&–&&ˆ&&z&s&l&e&^&W&P&I&B&;&4&-&&&&&& &&ü%õ%î%ç%à%Ù%Ò%Ë%Ä%½%¶%¯%¨%¡%š%“%Œ%…%~%w%p%i%b%[%T%M%F%?%8%1%*%#%%%%%%ù$ò$ë$ä$Ý$Ö$Ï$È$Á$º$³$¬$¥$ž$—$$‰$‚${$t$m$f$_$X$Q$J$C$<$5$.$'$ $$$ $$ý#ö#ï#è#á#Ú#Ó#Ì#Å#¾#·#°#©#¢#›#”##†##x#q#j#c#\#U#N#G#@#9#2#+#$######ú"ó"ì"å"Þ"×"Ð"É"Â"»"´"­"¦"Ÿ"˜"‘"Š"ƒ"|"u"n"g"`"Y"R"K"D"="6"/"("!""" ""þ!÷!ð!é!â!Û!Ô!Í!Æ!¿!¸!±!ª!£!œ!•!Ž!‡!€!y!r!k!d!]!V!O!H!A!:!3!,!%!!!! !!û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úÿóÿìÿåÿÞÿ×ÿÐÿÉÿÂÿ»ÿ´ÿ­ÿ¦ÿŸÿ˜ÿ‘ÿŠÿƒÿ|ÿuÿnÿgÿ`ÿYÿRÿKÿDÿ=ÿ6ÿ/ÿ(ÿ!ÿÿÿ ÿÿþþ÷þðþéþâþÛþÔþÍþÆþ¿þ¸þ±þªþ£þœþ•þŽþ‡þ€þyþrþkþdþ]þVþOþHþAþ:þ3þ,þ%þþþþ þþûýôýíýæýßýØýÑýÊýÃý¼ýµý®ý§ý ý™ý’ý‹ý„ý}ývýoýhýaýZýSýLýEý>ý7ý0ý)ý"ýýý ýýÿüøüñüêüãüÜüÕüÎüÇüÀü¹ü²ü«ü¤üü–üüˆüüzüsülüeü^üWüPüIüBü;ü4ü-ü&üüüü üüüûõûîûçûàûÙûÒûËûÄû½û¶û¯û¨û¡ûšû“ûŒû…û~ûwûpûiûbû[ûTûMûFû?û8û1û*û#ûûûûûûùúòúëúäúÝúÖúÏúÈúÁúºú³ú¬ú¥úžú—úú‰ú‚ú{útúmúfú_úXúQúJúCú<ú5ú.ú'ú úúú úúýùöùïùèùáùÚùÓùÌùÅù¾ù·ù°ù©ù¢ù›ù”ùù†ùùxùqùjùcù\ùUùNùGù@ù9ù2ù+ù$ùùùùùùúøóøìøåøÞø×øÐøÉøÂø»ø´ø­ø¦øŸø˜ø‘øŠøƒø|øuønøgø`øYøRøKøDø=ø6ø/ø(ø!øøø øøþ÷÷÷ð÷é÷â÷Û÷Ô÷Í÷Æ÷¿÷¸÷±÷ª÷£÷œ÷•÷Ž÷‡÷€÷y÷r÷k÷d÷]÷V÷O÷H÷A÷:÷3÷,÷%÷÷÷÷ ÷÷ûöôöíöæößöØöÑöÊöÃö¼öµö®ö§ö ö™ö’ö‹ö„ö}övöoöhöaöZöSöLöEö>ö7ö0ö)ö"ööö ööÿõøõñõêõãõÜõÕõÎõÇõÀõ¹õ²õ«õ¤õõ–õõˆõõzõsõlõeõ^õWõPõIõBõ;õ4õ-õ&õõõõ õõüôõôîôçôàôÙôÒôËôÄô½ô¶ô¯ô¨ô¡ôšô“ôŒô…ô~ôwôpôiôbô[ôTôMôFô?ô8ô1ô*ô#ôôôôôôùóòóëóäóÝóÖóÏóÈóÁóºó³ó¬ó¥óžó—óó‰ó‚ó{ótómófó_óXóQóJóCó<ó5ó.ó'ó óóó óóýòöòïòèòáòÚòÓòÌòÅò¾ò·ò°ò©ò¢ò›ò”òò†òòxòqòjòcò\òUòNòGò@ò9ò2ò+ò$òòòòòòúñóñìñåñÞñ×ñÐñÉñÂñ»ñ´ñ­ñ¦ñŸñ˜ñ‘ñŠñƒñ|ñuñnñgñ`ñYñRñKñDñ=ñ6ñ/ñ(ñ!ñññ ññþð÷ðððéðâðÛðÔðÍðÆð¿ð¸ð±ðªð£ðœð•ðŽð‡ð€ðyðrðkðdð]ðVðOðHðAð:ð3ð,ð%ðððð ððûïôïíïæïßïØïÑïÊïÃï¼ïµï®ï§ï ï™ï’ï‹ï„ï}ïvïoïhïaïZïSïLïEï>ï7ï0ï)ï"ïïï ïïÿîøîñîêîãîÜîÕîÎîÇîÀî¹î²î«î¤îî–îîˆîîzîsîlîeî^îWîPîIîBî;î4î-î&îîîî îîüíõíîíçíàíÙíÒíËíÄí½í¶í¯í¨í¡íší“íŒí…í~íwípíiíbí[íTíMíFí?í8í1í*í#ííííííùìòìëìäìÝìÖìÏìÈìÁìºì³ì¬ì¥ìžì—ìì‰ì‚ì{ìtìmìfì_ìXìQìJìCì<ì5ì.ì'ì ììì ììýëöëïëèëáëÚëÓëÌëÅë¾ë·ë°ë©ë¢ë›ë”ëë†ëëxëqëjëcë\ëUëNëGë@ë9ë2ë+ë$ëëëëëëúêóêìêåêÞê×êÐêÉêÂê»ê´ê­ê¦êŸê˜ê‘êŠêƒê|êuênêgê`êYêRêKêDê=ê6ê/ê(ê!êêê êêþé÷éðéééâéÛéÔéÍéÆé¿é¸é±éªé£éœé•éŽé‡é€éyérékédé]éVéOéHéAé:é3é,é%éééé ééûèôèíèæèßèØèÑèÊèÃè¼èµè®è§è è™è’è‹è„è}èvèoèhèaèZèSèLèEè>è7è0è)è"èèè èèÿçøçñçêçãçÜçÕçÎçÇçÀç¹ç²ç«ç¤çç–ççˆççzçsçlçeç^çWçPçIçBç;ç4ç-ç&çççç ççüæõæîæçæàæÙæÒæËæÄæ½æ¶æ¯æ¨æ¡æšæ“æŒæ…æ~æwæpæiæbæ[æTæMæFæ?æ8æ1æ*æ#ææææææùåòåëåäåÝåÖåÏåÈåÁåºå³å¬å¥åžå—åå‰å‚å{åtåmåfå_åXåQåJåCå<å5å.å'å ååå ååýäöäïäèäáäÚäÓäÌäÅä¾ä·ä°ä©ä¢ä›ä”ää†ääxäqäjäcä\äUäNäGä@ä9ä2ä+ä$ääääääúãóãìãåãÞã×ãÐãÉãÂã»ã´ã­ã¦ãŸã˜ã‘ãŠãƒã|ãuãnãgã`ãYãRãKãDã=ã6ã/ã(ã!ããã ããþâ÷âðâéâââÛâÔâÍâÆâ¿â¸â±âªâ£âœâ•âŽâ‡â€âyârâkâdâ]âVâOâHâAâ:â3â,â%ââââ ââûáôáíáæáßáØáÑáÊáÃá¼áµá®á§á á™á’á‹á„á}áváoáháaáZáSáLáEá>á7á0á)á"ááá ááÿàøàñàêàãàÜàÕàÎàÇàÀà¹à²à«à¤àà–ààˆààzàsàlàeà^àWàPàIàBà;à4à-à&àààà ààüßõßîßçßàßÙßÒßËßÄ߽߶߯ߨߡߚߓߌ߅ß~ßwßpßißbß[ßTßMßFß?ß8ß1ß*ß#ßßßßßßùÞòÞëÞäÞÝÞÖÞÏÞÈÞÁÞºÞ³Þ¬Þ¥ÞžÞ—ÞÞ‰Þ‚Þ{ÞtÞmÞfÞ_ÞXÞQÞJÞCÞ<Þ5Þ.Þ'Þ ÞÞÞ ÞÞýÝöÝïÝèÝáÝÚÝÓÝÌÝÅݾݷݰݩݢݛݔÝ݆ÝÝxÝqÝjÝcÝ\ÝUÝNÝGÝ@Ý9Ý2Ý+Ý$ÝÝÝÝÝÝúÜóÜìÜåÜÞÜ×ÜÐÜÉÜÂܻܴܭܦܟܘܑ܊܃Ü|ÜuÜnÜgÜ`ÜYÜRÜKÜDÜ=Ü6Ü/Ü(Ü!ÜÜÜ ÜÜþÛ÷ÛðÛéÛâÛÛÛÔÛÍÛÆÛ¿Û¸Û±ÛªÛ£ÛœÛ•ÛŽÛ‡Û€ÛyÛrÛkÛdÛ]ÛVÛOÛHÛAÛ:Û3Û,Û%ÛÛÛÛ ÛÛûÚôÚíÚæÚßÚØÚÑÚÊÚÃÚ¼ÚµÚ®Ú§Ú Ú™Ú’Ú‹Ú„Ú}ÚvÚoÚhÚaÚZÚSÚLÚEÚ>Ú7Ú0Ú)Ú"ÚÚÚ ÚÚÿÙøÙñÙêÙãÙÜÙÕÙÎÙÇÙÀٹٲ٫٤ÙÙ–ÙÙˆÙÙzÙsÙlÙeÙ^ÙWÙPÙIÙBÙ;Ù4Ù-Ù&ÙÙÙÙ ÙÙüØõØîØçØàØÙØÒØËØÄؽضدبءؚؓ،؅Ø~ØwØpØiØbØ[ØTØMØFØ?Ø8Ø1Ø*Ø#ØØØØØØù×ò×ë×ä×Ý×Ö×Ï×È×Á׺׳׬ץמח×׉ׂ×{×t×m×f×_×X×Q×J×C×<×5×.×'× ××× ××ýÖöÖïÖèÖáÖÚÖÓÖÌÖÅÖ¾Ö·Ö°Ö©Ö¢Ö›Ö”ÖÖ†ÖÖxÖqÖjÖcÖ\ÖUÖNÖGÖ@Ö9Ö2Ö+Ö$ÖÖÖÖÖÖúÕóÕìÕåÕÞÕ×ÕÐÕÉÕÂÕ»Õ´Õ­Õ¦ÕŸÕ˜Õ‘ÕŠÕƒÕ|ÕuÕnÕgÕ`ÕYÕRÕKÕDÕ=Õ6Õ/Õ(Õ!ÕÕÕ ÕÕþÔ÷ÔðÔéÔâÔÛÔÔÔÍÔÆÔ¿Ô¸Ô±ÔªÔ£ÔœÔ•ÔŽÔ‡Ô€ÔyÔrÔkÔdÔ]ÔVÔOÔHÔAÔ:Ô3Ô,Ô%ÔÔÔÔ ÔÔûÓôÓíÓæÓßÓØÓÑÓÊÓÃÓ¼ÓµÓ®Ó§Ó Ó™Ó’Ó‹Ó„Ó}ÓvÓoÓhÓaÓZÓSÓLÓEÓ>Ó7Ó0Ó)Ó"ÓÓÓ ÓÓÿÒøÒñÒêÒãÒÜÒÕÒÎÒÇÒÀÒ¹Ò²Ò«Ò¤ÒÒ–ÒÒˆÒÒzÒsÒlÒeÒ^ÒWÒPÒIÒBÒ;Ò4Ò-Ò&ÒÒÒÒ ÒÒüÑõÑîÑçÑàÑÙÑÒÑËÑÄѽѶѯѨѡњѓьхÑ~ÑwÑpÑiÑbÑ[ÑTÑMÑFÑ?Ñ8Ñ1Ñ*Ñ#ÑÑÑÑÑÑùÐòÐëÐäÐÝÐÖÐÏÐÈÐÁкгЬХОЗÐЉЂÐ{ÐtÐmÐfÐ_ÐXÐQÐJÐCÐ<Ð5Ð.Ð'Ð ÐÐÐ ÐÐýÏöÏïÏèÏáÏÚÏÓÏÌÏÅϾϷϰϩϢϛϔÏφÏÏxÏqÏjÏcÏ\ÏUÏNÏGÏ@Ï9Ï2Ï+Ï$ÏÏÏÏÏÏúÎóÎìÎåÎÞÎ×ÎÐÎÉÎÂλδέΦΟΘΑΊ΃Î|ÎuÎnÎgÎ`ÎYÎRÎKÎDÎ=Î6Î/Î(Î!ÎÎÎ ÎÎþÍ÷ÍðÍéÍâÍÛÍÔÍÍÍÆÍ¿Í¸Í±ÍªÍ£ÍœÍ•ÍŽÍ‡Í€ÍyÍrÍkÍdÍ]ÍVÍOÍHÍAÍ:Í3Í,Í%ÍÍÍÍ ÍÍûÌôÌíÌæÌßÌØÌÑÌÊÌÃ̵̧̼̮̠̙̒̋̄Ì}ÌvÌoÌhÌaÌZÌSÌLÌEÌ>Ì7Ì0Ì)Ì"ÌÌÌ ÌÌÿËøËñËêËãËÜËÕËÎËÇËÀ˹˲˫ˤËË–ËˈËËzËsËlËeË^ËWËPËIËBË;Ë4Ë-Ë&ËËËË ËËüÊõÊîÊçÊàÊÙÊÒÊËÊÄʽʶʯʨʡʚʓʌʅÊ~ÊwÊpÊiÊbÊ[ÊTÊMÊFÊ?Ê8Ê1Ê*Ê#ÊÊÊÊÊÊùÉòÉëÉäÉÝÉÖÉÏÉÈÉÁɺɳɬɥɞɗÉɉɂÉ{ÉtÉmÉfÉ_ÉXÉQÉJÉCÉ<É5É.É'É ÉÉÉ ÉÉýÈöÈïÈèÈáÈÚÈÓÈÌÈÅȾȷȰȩȢțȔÈȆÈÈxÈqÈjÈcÈ\ÈUÈNÈGÈ@È9È2È+È$ÈÈÈÈÈÈúÇóÇìÇåÇÞÇ×ÇÐÇÉÇÂǻǴǭǦǟǘǑNJǃÇ|ÇuÇnÇgÇ`ÇYÇRÇKÇDÇ=Ç6Ç/Ç(Ç!ÇÇÇ ÇÇþÆ÷ÆðÆéÆâÆÛÆÔÆÍÆÆÆ¿Æ¸Æ±ÆªÆ£ÆœÆ•ÆŽÆ‡Æ€ÆyÆrÆkÆdÆ]ÆVÆOÆHÆAÆ:Æ3Æ,Æ%ÆÆÆÆ ÆÆûÅôÅíÅæÅßÅØÅÑÅÊÅÃżŵŮŧŠřŒŋńÅ}ÅvÅoÅhÅaÅZÅSÅLÅEÅ>Å7Å0Å)Å"ÅÅÅ ÅÅÿÄøÄñÄêÄãÄÜÄÕÄÎÄÇÄÀĹIJīĤÄÄ–ÄĈÄÄzÄsÄlÄeÄ^ÄWÄPÄIÄBÄ;Ä4Ä-Ä&ÄÄÄÄ ÄÄüÃõÃîÃçÃàÃÙÃÒÃËÃÄýöïèáÚÓÌÅÃ~ÃwÃpÃiÃbÃ[ÃTÃMÃFÃ?Ã8Ã1Ã*Ã#ÃÃÃÃÃÃùÂòÂëÂäÂÝÂÖÂÏÂÈÂÁº³¬¥ž—‰‚Â{ÂtÂmÂfÂ_ÂXÂQÂJÂCÂ<Â5Â.Â' Â ÂÂýÁöÁïÁèÁáÁÚÁÓÁÌÁÅÁ¾Á·Á°Á©Á¢Á›Á”ÁÁ†ÁÁxÁqÁjÁcÁ\ÁUÁNÁGÁ@Á9Á2Á+Á$ÁÁÁÁÁÁúÀóÀìÀåÀÞÀ×ÀÐÀÉÀÂÀ»À´À­À¦ÀŸÀ˜À‘ÀŠÀƒÀ|ÀuÀnÀgÀ`ÀYÀRÀKÀDÀ=À6À/À(À!ÀÀÀ ÀÀþ¿÷¿ð¿é¿â¿Û¿Ô¿Í¿Æ¿¿¿¸¿±¿ª¿£¿œ¿•¿Ž¿‡¿€¿y¿r¿k¿d¿]¿V¿O¿H¿A¿:¿3¿,¿%¿¿¿¿ ¿¿û¾ô¾í¾æ¾ß¾ؾѾʾþ¼¾µ¾®¾§¾ ¾™¾’¾‹¾„¾}¾v¾o¾h¾a¾Z¾S¾L¾E¾>¾7¾0¾)¾"¾¾¾ ¾¾ÿ½ø½ñ½ê½ã½ܽÕ½νǽÀ½¹½²½«½¤½½–½½ˆ½½z½s½l½e½^½W½P½I½B½;½4½-½&½½½½ ½½ü¼õ¼î¼ç¼à¼Ù¼Ò¼˼ļ½¼¶¼¯¼¨¼¡¼š¼“¼Œ¼…¼~¼w¼p¼i¼b¼[¼T¼M¼F¼?¼8¼1¼*¼#¼¼¼¼¼¼ù»ò»ë»ä»Ý»Ö»Ï»È»Á»º»³»¬»¥»ž»—»»‰»‚»{»t»m»f»_»X»Q»J»C»<»5».»'» »»» »»ýºöºïºèºáºÚºÓº̺ź¾º·º°º©º¢º›º”ºº†ººxºqºjºcº\ºUºNºGº@º9º2º+º$ººººººú¹ó¹ì¹å¹Þ¹×¹йɹ¹»¹´¹­¹¦¹Ÿ¹˜¹‘¹йƒ¹|¹u¹n¹g¹`¹Y¹R¹K¹D¹=¹6¹/¹(¹!¹¹¹ ¹¹þ¸÷¸ð¸é¸â¸Û¸Ô¸͸Ƹ¿¸¸¸±¸ª¸£¸œ¸•¸ޏ‡¸€¸y¸r¸k¸d¸]¸V¸O¸H¸A¸:¸3¸,¸%¸¸¸¸ ¸¸û·ô·í·æ·ß·Ø·Ñ·Ê·÷¼·µ·®·§· ·™·’·‹·„·}·v·o·h·a·Z·S·L·E·>·7·0·)·"··· ··ÿ¶ø¶ñ¶ê¶ã¶ܶÕ¶ζǶÀ¶¹¶²¶«¶¤¶¶–¶¶ˆ¶¶z¶s¶l¶e¶^¶W¶P¶I¶B¶;¶4¶-¶&¶¶¶¶ ¶¶üµõµîµçµàµÙµÒµ˵ĵ½µ¶µ¯µ¨µ¡µšµ“µŒµ…µ~µwµpµiµbµ[µTµMµFµ?µ8µ1µ*µ#µµµµµµù´ò´ë´ä´Ý´Ö´Ï´È´Á´º´³´¬´¥´ž´—´´‰´‚´{´t´m´f´_´X´Q´J´C´<´5´.´'´ ´´´ ´´ý³ö³ï³è³á³Ú³Ó³̳ų¾³·³°³©³¢³›³”³³†³³x³q³j³c³\³U³N³G³@³9³2³+³$³³³³³³ú²ó²ì²å²Þ²ײвɲ²»²´²­²¦²Ÿ²˜²‘²вƒ²|²u²n²g²`²Y²R²K²D²=²6²/²(²!²²² ²²þ±÷±ð±é±â±Û±Ô±ͱƱ¿±¸±±±ª±£±œ±•±ޱ‡±€±y±r±k±d±]±V±O±H±A±:±3±,±%±±±± ±±û°ô°í°æ°ß°ذѰʰð¼°µ°®°§° °™°’°‹°„°}°v°o°h°a°Z°S°L°E°>°7°0°)°"°°° °°ÿ¯ø¯ñ¯ê¯ã¯ܯÕ¯ίǯÀ¯¹¯²¯«¯¤¯¯–¯¯ˆ¯¯z¯s¯l¯e¯^¯W¯P¯I¯B¯;¯4¯-¯&¯¯¯¯ ¯¯ü®õ®î®ç®à®Ù®Ò®Ë®Ä®½®¶®¯®¨®¡®š®“®Œ®…®~®w®p®i®b®[®T®M®F®?®8®1®*®#®®®®®®ù­ò­ë­ä­Ý­Ö­Ï­È­Á­º­³­¬­¥­ž­—­­‰­‚­{­t­m­f­_­X­Q­J­C­<­5­.­'­ ­­­ ­­ý¬ö¬ï¬è¬á¬Ú¬Ó¬̬Ŭ¾¬·¬°¬©¬¢¬›¬”¬¬†¬¬x¬q¬j¬c¬\¬U¬N¬G¬@¬9¬2¬+¬$¬¬¬¬¬¬ú«ó«ì«å«Þ«׫ЫÉ««»«´«­«¦«Ÿ«˜«‘«Š«ƒ«|«u«n«g«`«Y«R«K«D«=«6«/«(«!««« ««þª÷ªðªéªâªÛªÔªͪƪ¿ª¸ª±ªªª£ªœª•ªŽª‡ª€ªyªrªkªdª]ªVªOªHªAª:ª3ª,ª%ªªªª ªªû©ô©í©æ©ß©Ø©Ñ©Ê©é¼©µ©®©§© ©™©’©‹©„©}©v©o©h©a©Z©S©L©E©>©7©0©)©"©©© ©©ÿ¨ø¨ñ¨ê¨ã¨ܨÕ¨ΨǨÀ¨¹¨²¨«¨¤¨¨–¨¨ˆ¨¨z¨s¨l¨e¨^¨W¨P¨I¨B¨;¨4¨-¨&¨¨¨¨ ¨¨ü§õ§î§ç§à§Ù§Ò§˧ħ½§¶§¯§¨§¡§š§“§Œ§…§~§w§p§i§b§[§T§M§F§?§8§1§*§#§§§§§§ù¦ò¦ë¦ä¦ݦÖ¦ϦȦÁ¦º¦³¦¬¦¥¦ž¦—¦¦‰¦‚¦{¦t¦m¦f¦_¦X¦Q¦J¦C¦<¦5¦.¦'¦ ¦¦¦ ¦¦ý¥ö¥ï¥è¥á¥Ú¥Ó¥Ì¥Å¥¾¥·¥°¥©¥¢¥›¥”¥¥†¥¥x¥q¥j¥c¥\¥U¥N¥G¥@¥9¥2¥+¥$¥¥¥¥¥¥ú¤ó¤ì¤å¤Þ¤פФɤ¤»¤´¤­¤¦¤Ÿ¤˜¤‘¤Фƒ¤|¤u¤n¤g¤`¤Y¤R¤K¤D¤=¤6¤/¤(¤!¤¤¤ ¤¤þ£÷£ð£é£â£Û£Ô£Í£Æ£¿£¸£±£ª£££œ£•£Ž£‡£€£y£r£k£d£]£V£O£H£A£:£3£,£%££££ ££û¢ô¢í¢æ¢ߢآѢʢ⼢µ¢®¢§¢ ¢™¢’¢‹¢„¢}¢v¢o¢h¢a¢Z¢S¢L¢E¢>¢7¢0¢)¢"¢¢¢ ¢¢ÿ¡ø¡ñ¡ê¡ã¡Ü¡Õ¡ΡÇ¡À¡¹¡²¡«¡¤¡¡–¡¡ˆ¡¡z¡s¡l¡e¡^¡W¡P¡I¡B¡;¡4¡-¡&¡¡¡¡ ¡¡ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùŸòŸëŸäŸÝŸÖŸÏŸÈŸÁŸºŸ³Ÿ¬Ÿ¥ŸžŸ—ŸŸ‰Ÿ‚Ÿ{ŸtŸmŸfŸ_ŸXŸQŸJŸCŸ<Ÿ5Ÿ.Ÿ'Ÿ ŸŸŸ ŸŸýžöžïžèžážÚžÓžÌžÅž¾ž·ž°ž©ž¢ž›ž”žž†žžxžqžjžcž\žUžNžGž@ž9ž2ž+ž$žžžžžžúóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þœ÷œðœéœâœÛœÔœÍœÆœ¿œ¸œ±œªœ£œœœ•œŽœ‡œ€œyœrœkœdœ]œVœOœHœAœ:œ3œ,œ%œœœœ œœû›ô›í›æ›ß›Ø›Ñ›Ê›Û¼›µ›®›§› ›™›’›‹›„›}›v›o›h›a›Z›S›L›E›>›7›0›)›"››› ››ÿšøšñšêšãšÜšÕšΚÇšÀš¹š²š«š¤šš–ššˆššzšsšlšeš^šWšPšIšBš;š4š-š&šššš ššü™õ™î™ç™à™Ù™Ò™Ë™Ä™½™¶™¯™¨™¡™š™“™Œ™…™~™w™p™i™b™[™T™M™F™?™8™1™*™#™™™™™™ù˜ò˜ë˜ä˜ݘÖ˜ϘȘÁ˜º˜³˜¬˜¥˜ž˜—˜˜‰˜‚˜{˜t˜m˜f˜_˜X˜Q˜J˜C˜<˜5˜.˜'˜ ˜˜˜ ˜˜ý—ö—ï—è—á—Ú—Ó—Ì—Å—¾—·—°—©—¢—›—”——†——x—q—j—c—\—U—N—G—@—9—2—+—$——————ú–ó–ì–å–Þ–×–ЖÉ––»–´–­–¦–Ÿ–˜–‘–Š–ƒ–|–u–n–g–`–Y–R–K–D–=–6–/–(–!––– ––þ•÷•ð•é•â•ەԕ͕ƕ¿•¸•±•ª•£•œ•••Ž•‡•€•y•r•k•d•]•V•O•H•A•:•3•,•%•••• ••û”ô”í”æ”ߔؔєʔԼ”µ”®”§” ”™”’”‹”„”}”v”o”h”a”Z”S”L”E”>”7”0”)”"””” ””ÿ“ø“ñ“ê“ã“ܓՓΓÇ“À“¹“²“«“¤““–““ˆ““z“s“l“e“^“W“P“I“B“;“4“-“&““““ ““ü’õ’î’ç’à’Ù’Ò’Ë’Ä’½’¶’¯’¨’¡’š’“’Œ’…’~’w’p’i’b’[’T’M’F’?’8’1’*’#’’’’’’ù‘ò‘ë‘ä‘ݑ֑ϑȑÁ‘º‘³‘¬‘¥‘ž‘—‘‘‰‘‚‘{‘t‘m‘f‘_‘X‘Q‘J‘C‘<‘5‘.‘'‘ ‘‘‘ ‘‘ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þŽ÷ŽðŽéŽâŽÛŽÔŽÍŽÆŽ¿Ž¸Ž±ŽªŽ£ŽœŽ•ŽŽŽ‡Ž€ŽyŽrŽkŽdŽ]ŽVŽOŽHŽAŽ:Ž3Ž,Ž%ŽŽŽŽ ŽŽûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿŒøŒñŒêŒãŒÜŒÕŒÎŒÇŒÀŒ¹Œ²Œ«Œ¤ŒŒ–ŒŒˆŒŒzŒsŒlŒeŒ^ŒWŒPŒIŒBŒ;Œ4Œ-Œ&ŒŒŒŒ ŒŒü‹õ‹î‹ç‹à‹Ù‹Ò‹Ë‹Ä‹½‹¶‹¯‹¨‹¡‹š‹“‹Œ‹…‹~‹w‹p‹i‹b‹[‹T‹M‹F‹?‹8‹1‹*‹#‹‹‹‹‹‹ùŠòŠëŠäŠÝŠÖŠÏŠÈŠÁŠºŠ³Š¬Š¥ŠžŠ—ŠŠ‰Š‚Š{ŠtŠmŠfŠ_ŠXŠQŠJŠCŠ<Š5Š.Š'Š ŠŠŠ ŠŠý‰ö‰ï‰è‰á‰Ú‰Ó‰̉ʼn¾‰·‰°‰©‰¢‰›‰”‰‰†‰‰x‰q‰j‰c‰\‰U‰N‰G‰@‰9‰2‰+‰$‰‰‰‰‰‰úˆóˆìˆåˆÞˆ׈ЈɈˆ»ˆ´ˆ­ˆ¦ˆŸˆ˜ˆ‘ˆŠˆƒˆ|ˆuˆnˆgˆ`ˆYˆRˆKˆDˆ=ˆ6ˆ/ˆ(ˆ!ˆˆˆ ˆˆþ‡÷‡ð‡é‡â‡Û‡Ô‡͇Ƈ¿‡¸‡±‡ª‡£‡œ‡•‡އ‡‡€‡y‡r‡k‡d‡]‡V‡O‡H‡A‡:‡3‡,‡%‡‡‡‡ ‡‡û†ô†í†æ†߆؆цʆƼ†µ†®†§† †™†’†‹†„†}†v†o†h†a†Z†S†L†E†>†7†0†)†"††† ††ÿ…ø…ñ…ê…ã…Ü…Õ…Î…Ç…À…¹…²…«…¤……–……ˆ……z…s…l…e…^…W…P…I…B…;…4…-…&………… ……ü„õ„î„ç„à„ل҄˄Ą½„¶„¯„¨„¡„š„“„Œ„…„~„w„p„i„b„[„T„M„F„?„8„1„*„#„„„„„„ùƒòƒëƒäƒ݃ÖƒσȃÁƒºƒ³ƒ¬ƒ¥ƒžƒ—ƒƒ‰ƒ‚ƒ{ƒtƒmƒfƒ_ƒXƒQƒJƒCƒ<ƒ5ƒ.ƒ'ƒ ƒƒƒ ƒƒý‚ö‚ï‚è‚á‚ڂӂ̂ł¾‚·‚°‚©‚¢‚›‚”‚‚†‚‚x‚q‚j‚c‚\‚U‚N‚G‚@‚9‚2‚+‚$‚‚‚‚‚‚úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ€÷€ð€é€â€Û€Ô€Í€Æ€¿€¸€±€ª€£€œ€•€Ž€‡€€€y€r€k€d€]€V€O€H€A€:€3€,€%€€€€ €€ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿ~ø~ñ~ê~ã~Ü~Õ~Î~Ç~À~¹~²~«~¤~~–~~ˆ~~z~s~l~e~^~W~P~I~B~;~4~-~&~~~~ ~~ü}õ}î}ç}à}Ù}Ò}Ë}Ä}½}¶}¯}¨}¡}š}“}Œ}…}~}w}p}i}b}[}T}M}F}?}8}1}*}#}}}}}}ù|ò|ë|ä|Ý|Ö|Ï|È|Á|º|³|¬|¥|ž|—||‰|‚|{|t|m|f|_|X|Q|J|C|<|5|.|'| ||| ||ý{ö{ï{è{á{Ú{Ó{Ì{Å{¾{·{°{©{¢{›{”{{†{{x{q{j{c{\{U{N{G{@{9{2{+{${{{{{{úzózìzåzÞz×zÐzÉzÂz»z´z­z¦zŸz˜z‘zŠzƒz|zuznzgz`zYzRzKzDz=z6z/z(z!zzz zzþy÷yðyéyâyÛyÔyÍyÆy¿y¸y±yªy£yœy•yŽy‡y€yyyrykydy]yVyOyHyAy:y3y,y%yyyy yyûxôxíxæxßxØxÑxÊxÃx¼xµx®x§x x™x’x‹x„x}xvxoxhxaxZxSxLxEx>x7x0x)x"xxx xxÿwøwñwêwãwÜwÕwÎwÇwÀw¹w²w«w¤ww–wwˆwwzwswlwew^wWwPwIwBw;w4w-w&wwww wwüvõvîvçvàvÙvÒvËvÄv½v¶v¯v¨v¡všv“vŒv…v~vwvpvivbv[vTvMvFv?v8v1v*v#vvvvvvùuòuëuäuÝuÖuÏuÈuÁuºu³u¬u¥užu—uu‰u‚u{utumufu_uXuQuJuCuq7q0q)q"qqq qqÿpøpñpêpãpÜpÕpÎpÇpÀp¹p²p«p¤pp–ppˆppzpsplpep^pWpPpIpBp;p4p-p&pppp ppüoõoîoçoàoÙoÒoËoÄo½o¶o¯o¨o¡ošo“oŒo…o~owopoiobo[oToMoFo?o8o1o*o#ooooooùnònënänÝnÖnÏnÈnÁnºn³n¬n¥nžn—nn‰n‚n{ntnmnfn_nXnQnJnCnj7j0j)j"jjj jjÿiøiñiêiãiÜiÕiÎiÇiÀi¹i²i«i¤ii–iiˆiizisiliei^iWiPiIiBi;i4i-i&iiii iiühõhîhçhàhÙhÒhËhÄh½h¶h¯h¨h¡hšh“hŒh…h~hwhphihbh[hThMhFh?h8h1h*h#hhhhhhùgògëgägÝgÖgÏgÈgÁgºg³g¬g¥gžg—gg‰g‚g{gtgmgfg_gXgQgJgCgc7c0c)c"ccc ccÿbøbñbêbãbÜbÕbÎbÇbÀb¹b²b«b¤bb–bbˆbbzbsblbeb^bWbPbIbBb;b4b-b&bbbb bbüaõaîaçaàaÙaÒaËaÄa½a¶a¯a¨a¡aša“aŒa…a~awapaiaba[aTaMaFa?a8a1a*a#aaaaaaù`ò`ë`ä`Ý`Ö`Ï`È`Á`º`³`¬`¥`ž`—``‰`‚`{`t`m`f`_`X`Q`J`C`<`5`.`'` ``` ``ý_ö_ï_è_á_Ú_Ó_Ì_Å_¾_·_°_©_¢_›_”__†__x_q_j_c_\_U_N_G_@_9_2_+_$______ú^ó^ì^å^Þ^×^Ð^É^Â^»^´^­^¦^Ÿ^˜^‘^Š^ƒ^|^u^n^g^`^Y^R^K^D^=^6^/^(^!^^^ ^^þ]÷]ð]é]â]Û]Ô]Í]Æ]¿]¸]±]ª]£]œ]•]Ž]‡]€]y]r]k]d]]]V]O]H]A]:]3],]%]]]] ]]û\ô\í\æ\ß\Ø\Ñ\Ê\Ã\¼\µ\®\§\ \™\’\‹\„\}\v\o\h\a\Z\S\L\E\>\7\0\)\"\\\ \\ÿ[ø[ñ[ê[ã[Ü[Õ[Î[Ç[À[¹[²[«[¤[[–[[ˆ[[z[s[l[e[^[W[P[I[B[;[4[-[&[[[[ [[üZõZîZçZàZÙZÒZËZÄZ½Z¶Z¯Z¨Z¡ZšZ“ZŒZ…Z~ZwZpZiZbZ[ZTZMZFZ?Z8Z1Z*Z#ZZZZZZùYòYëYäYÝYÖYÏYÈYÁYºY³Y¬Y¥YžY—YY‰Y‚Y{YtYmYfY_YXYQYJYCYU7U0U)U"UUU UUÿTøTñTêTãTÜTÕTÎTÇTÀT¹T²T«T¤TT–TTˆTTzTsTlTeT^TWTPTITBT;T4T-T&TTTT TTüSõSîSçSàSÙSÒSËSÄS½S¶S¯S¨S¡SšS“SŒS…S~SwSpSiSbS[STSMSFS?S8S1S*S#SSSSSSùRòRëRäRÝRÖRÏRÈRÁRºR³R¬R¥RžR—RR‰R‚R{RtRmRfR_RXRQRJRCRN7N0N)N"NNN NNÿMøMñMêMãMÜMÕMÎMÇMÀM¹M²M«M¤MM–MMˆMMzMsMlMeM^MWMPMIMBM;M4M-M&MMMM MMüLõLîLçLàLÙLÒLËLÄL½L¶L¯L¨L¡LšL“LŒL…L~LwLpLiLbL[LTLMLFL?L8L1L*L#LLLLLLùKòKëKäKÝKÖKÏKÈKÁKºK³K¬K¥KžK—KK‰K‚K{KtKmKfK_KXKQKJKCKG7G0G)G"GGG GGÿFøFñFêFãFÜFÕFÎFÇFÀF¹F²F«F¤FF–FFˆFFzFsFlFeF^FWFPFIFBF;F4F-F&FFFF FFüEõEîEçEàEÙEÒEËEÄE½E¶E¯E¨E¡EšE“EŒE…E~EwEpEiEbE[ETEMEFE?E8E1E*E#EEEEEEùDòDëDäDÝDÖDÏDÈDÁDºD³D¬D¥DžD—DD‰D‚D{DtDmDfD_DXDQDJDCD@7@0@)@"@@@ @@ÿ?ø?ñ?ê?ã?Ü?Õ?Î?Ç?À?¹?²?«?¤??–??ˆ??z?s?l?e?^?W?P?I?B?;?4?-?&???? ??ü>õ>î>ç>à>Ù>Ò>Ë>Ä>½>¶>¯>¨>¡>š>“>Œ>…>~>w>p>i>b>[>T>M>F>?>8>1>*>#>>>>>>ù=ò=ë=ä=Ý=Ö=Ï=È=Á=º=³=¬=¥=ž=—==‰=‚={=t=m=f=_=X=Q=J=C=<=5=.='= === ==ý<ö<ï<è<á<Ú<Ó<Ì<Å<¾<·<°<©<¢<›<”<<†<<x<q<j<c<\<U<N<G<@<9<2<+<$<<<<<<ú;ó;ì;å;Þ;×;Ð;É;Â;»;´;­;¦;Ÿ;˜;‘;Š;ƒ;|;u;n;g;`;Y;R;K;D;=;6;/;(;!;;; ;;þ:÷:ð:é:â:Û:Ô:Í:Æ:¿:¸:±:ª:£:œ:•:Ž:‡:€:y:r:k:d:]:V:O:H:A:::3:,:%:::: ::û9ô9í9æ9ß9Ø9Ñ9Ê9Ã9¼9µ9®9§9 9™9’9‹9„9}9v9o9h9a9Z9S9L9E9>97909)9"999 99ÿ8ø8ñ8ê8ã8Ü8Õ8Î8Ç8À8¹8²8«8¤88–88ˆ88z8s8l8e8^8W8P8I8B8;848-8&8888 88ü7õ7î7ç7à7Ù7Ò7Ë7Ä7½7¶7¯7¨7¡7š7“7Œ7…7~7w7p7i7b7[7T7M7F7?78717*7#777777ù6ò6ë6ä6Ý6Ö6Ï6È6Á6º6³6¬6¥6ž6—66‰6‚6{6t6m6f6_6X6Q6J6C6<656.6'6 666 66ý5ö5ï5è5á5Ú5Ó5Ì5Å5¾5·5°5©5¢5›5”55†55x5q5j5c5\5U5N5G5@59525+5$555555ú4ó4ì4å4Þ4×4Ð4É4Â4»4´4­4¦4Ÿ4˜4‘4Š4ƒ4|4u4n4g4`4Y4R4K4D4=464/4(4!444 44þ3÷3ð3é3â3Û3Ô3Í3Æ3¿3¸3±3ª3£3œ3•3Ž3‡3€3y3r3k3d3]3V3O3H3A3:333,3%3333 33û2ô2í2æ2ß2Ø2Ñ2Ê2Ã2¼2µ2®2§2 2™2’2‹2„2}2v2o2h2a2Z2S2L2E2>27202)2"222 22ÿ1ø1ñ1ê1ã1Ü1Õ1Î1Ç1À1¹1²1«1¤11–11ˆ11z1s1l1e1^1W1P1I1B1;141-1&1111 11ü0õ0î0ç0à0Ù0Ò0Ë0Ä0½0¶0¯0¨0¡0š0“0Œ0…0~0w0p0i0b0[0T0M0F0?08010*0#000000ù/ò/ë/ä/Ý/Ö/Ï/È/Á/º/³/¬/¥/ž/—//‰/‚/{/t/m/f/_/X/Q/J/C/+7+0+)+"+++ ++ÿ*ø*ñ*ê*ã*Ü*Õ*Î*Ç*À*¹*²*«*¤**–**ˆ**z*s*l*e*^*W*P*I*B*;*4*-*&**** **ü)õ)î)ç)à)Ù)Ò)Ë)Ä)½)¶)¯)¨)¡)š)“)Œ)…)~)w)p)i)b)[)T)M)F)?)8)1)*)#))))))ù(ò(ë(ä(Ý(Ö(Ï(È(Á(º(³(¬(¥(ž(—((‰(‚({(t(m(f(_(X(Q(J(C(<(5(.('( ((( ((ý'ö'ï'è'á'Ú'Ó'Ì'Å'¾'·'°'©'¢'›'”''†''x'q'j'c'\'U'N'G'@'9'2'+'$''''''ú&ó&ì&å&Þ&×&Ð&É&Â&»&´&­&¦&Ÿ&˜&‘&Š&ƒ&|&u&n&g&`&Y&R&K&D&=&6&/&(&!&&& &&þ%÷%ð%é%â%Û%Ô%Í%Æ%¿%¸%±%ª%£%œ%•%Ž%‡%€%y%r%k%d%]%V%O%H%A%:%3%,%%%%%% %%û$ô$í$æ$ß$Ø$Ñ$Ê$Ã$¼$µ$®$§$ $™$’$‹$„$}$v$o$h$a$Z$S$L$E$>$7$0$)$"$$$ $$ÿ#ø#ñ#ê#ã#Ü#Õ#Î#Ç#À#¹#²#«#¤##–##ˆ##z#s#l#e#^#W#P#I#B#;#4#-#&#### ##ü"õ"î"ç"à"Ù"Ò"Ë"Ä"½"¶"¯"¨"¡"š"“"Œ"…"~"w"p"i"b"["T"M"F"?"8"1"*"#""""""ù!ò!ë!ä!Ý!Ö!Ï!È!Á!º!³!¬!¥!ž!—!!‰!‚!{!t!m!f!_!X!Q!J!C!70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üÿõÿîÿçÿàÿÙÿÒÿËÿÄÿ½ÿ¶ÿ¯ÿ¨ÿ¡ÿšÿ“ÿŒÿ…ÿ~ÿwÿpÿiÿbÿ[ÿTÿMÿFÿ?ÿ8ÿ1ÿ*ÿ#ÿÿÿÿÿÿùþòþëþäþÝþÖþÏþÈþÁþºþ³þ¬þ¥þžþ—þþ‰þ‚þ{þtþmþfþ_þXþQþJþCþ<þ5þ.þ'þ þþþ þþýýöýïýèýáýÚýÓýÌýÅý¾ý·ý°ý©ý¢ý›ý”ýý†ýýxýqýjýcý\ýUýNýGý@ý9ý2ý+ý$ýýýýýýúüóüìüåüÞü×üÐüÉüÂü»ü´ü­ü¦üŸü˜ü‘üŠüƒü|üuünügü`üYüRüKüDü=ü6ü/ü(ü!üüü üüþû÷ûðûéûâûÛûÔûÍûÆû¿û¸û±ûªû£ûœû•ûŽû‡û€ûyûrûkûdû]ûVûOûHûAû:û3û,û%ûûûû ûûûúôúíúæúßúØúÑúÊúÃú¼úµú®ú§ú ú™ú’ú‹ú„ú}úvúoúhúaúZúSúLúEú>ú7ú0ú)ú"úúú úúÿùøùñùêùãùÜùÕùÎùÇùÀù¹ù²ù«ù¤ùù–ùùˆùùzùsùlùeù^ùWùPùIùBù;ù4ù-ù&ùùùù ùùüøõøîøçøàøÙøÒøËøÄø½ø¶ø¯ø¨ø¡øšø“øŒø…ø~øwøpøiøbø[øTøMøFø?ø8ø1ø*ø#øøøøøøù÷ò÷ë÷ä÷Ý÷Ö÷Ï÷È÷Á÷º÷³÷¬÷¥÷ž÷—÷÷‰÷‚÷{÷t÷m÷f÷_÷X÷Q÷J÷C÷<÷5÷.÷'÷ ÷÷÷ ÷÷ýöööïöèöáöÚöÓöÌöÅö¾ö·ö°ö©ö¢ö›ö”öö†ööxöqöjöcö\öUöNöGö@ö9ö2ö+ö$ööööööúõóõìõåõÞõ×õÐõÉõÂõ»õ´õ­õ¦õŸõ˜õ‘õŠõƒõ|õuõnõgõ`õYõRõKõDõ=õ6õ/õ(õ!õõõ õõþô÷ôðôéôâôÛôÔôÍôÆô¿ô¸ô±ôªô£ôœô•ôŽô‡ô€ôyôrôkôdô]ôVôOôHôAô:ô3ô,ô%ôôôô ôôûóôóíóæóßóØóÑóÊóÃó¼óµó®ó§ó ó™ó’ó‹ó„ó}óvóoóhóaóZóSóLóEó>ó7ó0ó)ó"óóó óóÿòøòñòêòãòÜòÕòÎòÇòÀò¹ò²ò«ò¤òò–òòˆòòzòsòlòeò^òWòPòIòBò;ò4ò-ò&òòòò òòüñõñîñçñàñÙñÒñËñÄñ½ñ¶ñ¯ñ¨ñ¡ñšñ“ñŒñ…ñ~ñwñpñiñbñ[ñTñMñFñ?ñ8ñ1ñ*ñ#ññññññùðòðëðäðÝðÖðÏðÈðÁðºð³ð¬ð¥ðžð—ðð‰ð‚ð{ðtðmðfð_ðXðQðJðCð<ð5ð.ð'ð ððð ððýïöïïïèïáïÚïÓïÌïÅï¾ï·ï°ï©ï¢ï›ï”ïï†ïïxïqïjïcï\ïUïNïGï@ï9ï2ï+ï$ïïïïïïúîóîìîåîÞî×îÐîÉîÂî»î´î­î¦îŸî˜î‘îŠîƒî|îuînîgî`îYîRîKîDî=î6î/î(î!îîî îîþí÷íðíéíâíÛíÔíÍíÆí¿í¸í±íªí£íœí•íŽí‡í€íyíríkídí]íVíOíHíAí:í3í,í%íííí ííûìôìíìæìßìØìÑìÊìÃì¼ìµì®ì§ì ì™ì’ì‹ì„ì}ìvìoìhìaìZìSìLìEì>ì7ì0ì)ì"ììì ììÿëøëñëêëãëÜëÕëÎëÇëÀë¹ë²ë«ë¤ëë–ëëˆëëzësëlëeë^ëWëPëIëBë;ë4ë-ë&ëëëë ëëüêõêîêçêàêÙêÒêËêÄê½ê¶ê¯ê¨ê¡êšê“êŒê…ê~êwêpêiêbê[êTêMêFê?ê8ê1ê*ê#êêêêêêùéòéëéäéÝéÖéÏéÈéÁéºé³é¬é¥éžé—éé‰é‚é{étéméfé_éXéQéJéCé<é5é.é'é ééé ééýèöèïèèèáèÚèÓèÌèÅè¾è·è°è©è¢è›è”èè†èèxèqèjècè\èUèNèGè@è9è2è+è$èèèèèèúçóçìçåçÞç×çÐçÉçÂç»ç´ç­ç¦çŸç˜ç‘çŠçƒç|çuçnçgç`çYçRçKçDç=ç6ç/ç(ç!ççç ççþæ÷æðæéæâæÛæÔæÍæÆæ¿æ¸æ±æªæ£æœæ•æŽæ‡æ€æyærækædæ]æVæOæHæAæ:æ3æ,æ%ææææ ææûåôåíåæåßåØåÑåÊåÃå¼åµå®å§å å™å’å‹å„å}åvåoåhåaåZåSåLåEå>å7å0å)å"ååå ååÿäøäñäêäãäÜäÕäÎäÇäÀä¹ä²ä«ä¤ää–ääˆääzäsäläeä^äWäPäIäBä;ä4ä-ä&ääää ääüãõãîãçãàãÙãÒãËãÄã½ã¶ã¯ã¨ã¡ãšã“ãŒã…ã~ãwãpãiãbã[ãTãMãFã?ã8ã1ã*ã#ããããããùâòâëâäâÝâÖâÏâÈâÁâºâ³â¬â¥âžâ—ââ‰â‚â{âtâmâfâ_âXâQâJâCâ<â5â.â'â âââ ââýáöáïáèáááÚáÓáÌáÅá¾á·á°á©á¢á›á”áá†ááxáqájácá\áUáNáGá@á9á2á+á$ááááááúàóàìàåàÞà×àÐàÉàÂà»à´à­à¦àŸà˜à‘àŠàƒà|àuànàgà`àYàRàKàDà=à6à/à(à!ààà ààþß÷ßðßéßâßÛßÔßÍßÆß¿ß¸ß±ßªß£ßœß•ßŽß‡ß€ßyßrßkßdß]ßVßOßHßAß:ß3ß,ß%ßßßß ßßûÞôÞíÞæÞßÞØÞÑÞÊÞÃÞ¼ÞµÞ®Þ§Þ Þ™Þ’Þ‹Þ„Þ}ÞvÞoÞhÞaÞZÞSÞLÞEÞ>Þ7Þ0Þ)Þ"ÞÞÞ ÞÞÿÝøÝñÝêÝãÝÜÝÕÝÎÝÇÝÀݹݲݫݤÝÝ–Ý݈ÝÝzÝsÝlÝeÝ^ÝWÝPÝIÝBÝ;Ý4Ý-Ý&ÝÝÝÝ ÝÝüÜõÜîÜçÜàÜÙÜÒÜËÜÄܽܶܯܨܡܚܓ܌܅Ü~ÜwÜpÜiÜbÜ[ÜTÜMÜFÜ?Ü8Ü1Ü*Ü#ÜÜÜÜÜÜùÛòÛëÛäÛÝÛÖÛÏÛÈÛÁÛºÛ³Û¬Û¥ÛžÛ—ÛÛ‰Û‚Û{ÛtÛmÛfÛ_ÛXÛQÛJÛCÛ<Û5Û.Û'Û ÛÛÛ ÛÛýÚöÚïÚèÚáÚÚÚÓÚÌÚÅÚ¾Ú·Ú°Ú©Ú¢Ú›Ú”ÚÚ†ÚÚxÚqÚjÚcÚ\ÚUÚNÚGÚ@Ú9Ú2Ú+Ú$ÚÚÚÚÚÚúÙóÙìÙåÙÞÙ×ÙÐÙÉÙÂٻٴ٭٦ّٟ٘يكÙ|ÙuÙnÙgÙ`ÙYÙRÙKÙDÙ=Ù6Ù/Ù(Ù!ÙÙÙ ÙÙþØ÷ØðØéØâØÛØÔØÍØÆØ¿Ø¸Ø±ØªØ£ØœØ•ØŽØ‡Ø€ØyØrØkØdØ]ØVØOØHØAØ:Ø3Ø,Ø%ØØØØ ØØû×ô×í׿×ßר×Ñ×Ê×Ã׼׵׮קניג׋ׄ×}×v×o×h×a×Z×S×L×E×>×7×0×)×"××× ××ÿÖøÖñÖêÖãÖÜÖÕÖÎÖÇÖÀÖ¹Ö²Ö«Ö¤ÖÖ–ÖÖˆÖÖzÖsÖlÖeÖ^ÖWÖPÖIÖBÖ;Ö4Ö-Ö&ÖÖÖÖ ÖÖüÕõÕîÕçÕàÕÙÕÒÕËÕÄսնկըա՚ՓՌՅÕ~ÕwÕpÕiÕbÕ[ÕTÕMÕFÕ?Õ8Õ1Õ*Õ#ÕÕÕÕÕÕùÔòÔëÔäÔÝÔÖÔÏÔÈÔÁÔºÔ³Ô¬Ô¥ÔžÔ—ÔÔ‰Ô‚Ô{ÔtÔmÔfÔ_ÔXÔQÔJÔCÔ<Ô5Ô.Ô'Ô ÔÔÔ ÔÔýÓöÓïÓèÓáÓÚÓÓÓÌÓÅÓ¾Ó·Ó°Ó©Ó¢Ó›Ó”ÓÓ†ÓÓxÓqÓjÓcÓ\ÓUÓNÓGÓ@Ó9Ó2Ó+Ó$ÓÓÓÓÓÓúÒóÒìÒåÒÞÒ×ÒÐÒÉÒÂÒ»Ò´Ò­Ò¦ÒŸÒ˜Ò‘ÒŠÒƒÒ|ÒuÒnÒgÒ`ÒYÒRÒKÒDÒ=Ò6Ò/Ò(Ò!ÒÒÒ ÒÒþÑ÷ÑðÑéÑâÑÛÑÔÑÍÑÆÑ¿Ñ¸Ñ±ÑªÑ£ÑœÑ•ÑŽÑ‡Ñ€ÑyÑrÑkÑdÑ]ÑVÑOÑHÑAÑ:Ñ3Ñ,Ñ%ÑÑÑÑ ÑÑûÐôÐíÐæÐßÐØÐÑÐÊÐÃмеЮЧРЙВЋЄÐ}ÐvÐoÐhÐaÐZÐSÐLÐEÐ>Ð7Ð0Ð)Ð"ÐÐÐ ÐÐÿÏøÏñÏêÏãÏÜÏÕÏÎÏÇÏÀϹϲϫϤÏÏ–ÏψÏÏzÏsÏlÏeÏ^ÏWÏPÏIÏBÏ;Ï4Ï-Ï&ÏÏÏÏ ÏÏüÎõÎîÎçÎàÎÙÎÒÎËÎÄνζίΨΡΚΓΌ΅Î~ÎwÎpÎiÎbÎ[ÎTÎMÎFÎ?Î8Î1Î*Î#ÎÎÎÎÎÎùÍòÍëÍäÍÝÍÖÍÏÍÈÍÁͺͳͬͥ͗͞Í͉͂Í{ÍtÍmÍfÍ_ÍXÍQÍJÍCÍ<Í5Í.Í'Í ÍÍÍ ÍÍýÌöÌïÌèÌáÌÚÌÓÌÌÌÅ̷̢̛̰̩̾̔Ì̆ÌÌxÌqÌjÌcÌ\ÌUÌNÌGÌ@Ì9Ì2Ì+Ì$ÌÌÌÌÌÌúËóËìËåËÞË×ËÐËÉËÂ˻˴˭˦˟˘ˑˊ˃Ë|ËuËnËgË`ËYËRËKËDË=Ë6Ë/Ë(Ë!ËËË ËËþÊ÷ÊðÊéÊâÊÛÊÔÊÍÊÆÊ¿Ê¸Ê±ÊªÊ£ÊœÊ•ÊŽÊ‡Ê€ÊyÊrÊkÊdÊ]ÊVÊOÊHÊAÊ:Ê3Ê,Ê%ÊÊÊÊ ÊÊûÉôÉíÉæÉßÉØÉÑÉÊÉÃɼɵɮɧɠəɒɋɄÉ}ÉvÉoÉhÉaÉZÉSÉLÉEÉ>É7É0É)É"ÉÉÉ ÉÉÿÈøÈñÈêÈãÈÜÈÕÈÎÈÇÈÀȹȲȫȤÈÈ–ÈȈÈÈzÈsÈlÈeÈ^ÈWÈPÈIÈBÈ;È4È-È&ÈÈÈÈ ÈÈüÇõÇîÇçÇàÇÙÇÒÇËÇÄǽǶǯǨǡǚǓnjDžÇ~ÇwÇpÇiÇbÇ[ÇTÇMÇFÇ?Ç8Ç1Ç*Ç#ÇÇÇÇÇÇùÆòÆëÆäÆÝÆÖÆÏÆÈÆÁÆºÆ³Æ¬Æ¥ÆžÆ—ÆÆ‰Æ‚Æ{ÆtÆmÆfÆ_ÆXÆQÆJÆCÆ<Æ5Æ.Æ'Æ ÆÆÆ ÆÆýÅöÅïÅèÅáÅÚÅÓÅÌÅÅžŷŰũŢśŔÅņÅÅxÅqÅjÅcÅ\ÅUÅNÅGÅ@Å9Å2Å+Å$ÅÅÅÅÅÅúÄóÄìÄåÄÞÄ×ÄÐÄÉÄÂĻĴĭĦğĘđĊăÄ|ÄuÄnÄgÄ`ÄYÄRÄKÄDÄ=Ä6Ä/Ä(Ä!ÄÄÄ ÄÄþÃ÷ÃðÃéÃâÃÛÃÔÃÍÃÆÃ¿Ã¸Ã±ÃªÃ£ÃœÃ•ÃŽÃ‡Ã€ÃyÃrÃkÃdÃ]ÃVÃOÃHÃAÃ:Ã3Ã,Ã%ÃÃÃà ÃÃûÂôÂíÂæÂßÂØÂÑÂÊÂüµ®§ ™’‹„Â}ÂvÂoÂhÂaÂZÂSÂLÂEÂ>Â7Â0Â)Â" ÂÂÿÁøÁñÁêÁãÁÜÁÕÁÎÁÇÁÀÁ¹Á²Á«Á¤ÁÁ–ÁÁˆÁÁzÁsÁlÁeÁ^ÁWÁPÁIÁBÁ;Á4Á-Á&ÁÁÁÁ ÁÁüÀõÀîÀçÀàÀÙÀÒÀËÀÄÀ½À¶À¯À¨À¡ÀšÀ“ÀŒÀ…À~ÀwÀpÀiÀbÀ[ÀTÀMÀFÀ?À8À1À*À#ÀÀÀÀÀÀù¿ò¿ë¿ä¿Ý¿Ö¿Ï¿È¿Á¿º¿³¿¬¿¥¿ž¿—¿¿‰¿‚¿{¿t¿m¿f¿_¿X¿Q¿J¿C¿<¿5¿.¿'¿ ¿¿¿ ¿¿ý¾ö¾ï¾è¾á¾Ú¾Ó¾̾ž¾¾·¾°¾©¾¢¾›¾”¾¾†¾¾x¾q¾j¾c¾\¾U¾N¾G¾@¾9¾2¾+¾$¾¾¾¾¾¾ú½ó½ì½å½Þ½×½нɽ½»½´½­½¦½Ÿ½˜½‘½нƒ½|½u½n½g½`½Y½R½K½D½=½6½/½(½!½½½ ½½þ¼÷¼ð¼é¼â¼Û¼Ô¼ͼƼ¿¼¸¼±¼ª¼£¼œ¼•¼޼‡¼€¼y¼r¼k¼d¼]¼V¼O¼H¼A¼:¼3¼,¼%¼¼¼¼ ¼¼û»ô»í»æ»ß»Ø»Ñ»Ê»û¼»µ»®»§» »™»’»‹»„»}»v»o»h»a»Z»S»L»E»>»7»0»)»"»»» »»ÿºøºñºêºãºܺÕºκǺÀº¹º²º«º¤ºº–ººˆººzºsºlºeº^ºWºPºIºBº;º4º-º&ºººº ººü¹õ¹î¹ç¹à¹Ù¹Ò¹˹Ĺ½¹¶¹¯¹¨¹¡¹š¹“¹Œ¹…¹~¹w¹p¹i¹b¹[¹T¹M¹F¹?¹8¹1¹*¹#¹¹¹¹¹¹ù¸ò¸ë¸ä¸ݸÖ¸ϸȸÁ¸º¸³¸¬¸¥¸ž¸—¸¸‰¸‚¸{¸t¸m¸f¸_¸X¸Q¸J¸C¸<¸5¸.¸'¸ ¸¸¸ ¸¸ý·ö·ï·è·á·Ú·Ó·Ì·Å·¾···°·©·¢·›·”··†··x·q·j·c·\·U·N·G·@·9·2·+·$······ú¶ó¶ì¶å¶Þ¶×¶жɶ¶»¶´¶­¶¦¶Ÿ¶˜¶‘¶жƒ¶|¶u¶n¶g¶`¶Y¶R¶K¶D¶=¶6¶/¶(¶!¶¶¶ ¶¶þµ÷µðµéµâµÛµÔµ͵Ƶ¿µ¸µ±µªµ£µœµ•µ޵‡µ€µyµrµkµdµ]µVµOµHµAµ:µ3µ,µ%µµµµ µµû´ô´í´æ´ß´Ø´Ñ´Ê´ô¼´µ´®´§´ ´™´’´‹´„´}´v´o´h´a´Z´S´L´E´>´7´0´)´"´´´ ´´ÿ³ø³ñ³ê³ã³ܳÕ³γdzÀ³¹³²³«³¤³³–³³ˆ³³z³s³l³e³^³W³P³I³B³;³4³-³&³³³³ ³³ü²õ²î²ç²à²Ù²Ò²˲IJ½²¶²¯²¨²¡²š²“²Œ²…²~²w²p²i²b²[²T²M²F²?²8²1²*²#²²²²²²ù±ò±ë±ä±ݱÖ±ϱȱÁ±º±³±¬±¥±ž±—±±‰±‚±{±t±m±f±_±X±Q±J±C±<±5±.±'± ±±± ±±ý°ö°ï°è°á°Ú°Ó°̰Ű¾°·°°°©°¢°›°”°°†°°x°q°j°c°\°U°N°G°@°9°2°+°$°°°°°°ú¯ó¯ì¯å¯Þ¯ׯЯɯ¯»¯´¯­¯¦¯Ÿ¯˜¯‘¯Нƒ¯|¯u¯n¯g¯`¯Y¯R¯K¯D¯=¯6¯/¯(¯!¯¯¯ ¯¯þ®÷®ð®é®â®Û®Ô®Í®Æ®¿®¸®±®ª®£®œ®•®Ž®‡®€®y®r®k®d®]®V®O®H®A®:®3®,®%®®®® ®®û­ô­í­æ­ß­Ø­Ñ­Ê­í¼­µ­®­§­ ­™­’­‹­„­}­v­o­h­a­Z­S­L­E­>­7­0­)­"­­­ ­­ÿ¬ø¬ñ¬ê¬ã¬ܬÕ¬άǬÀ¬¹¬²¬«¬¤¬¬–¬¬ˆ¬¬z¬s¬l¬e¬^¬W¬P¬I¬B¬;¬4¬-¬&¬¬¬¬ ¬¬ü«õ«î«ç«à«Ù«Ò«Ë«Ä«½«¶«¯«¨«¡«š«“«Œ«…«~«w«p«i«b«[«T«M«F«?«8«1«*«#««««««ùªòªëªäªݪÖªϪȪÁªºª³ª¬ª¥ªžª—ªª‰ª‚ª{ªtªmªfª_ªXªQªJªCª<ª5ª.ª'ª ªªª ªªý©ö©ï©è©á©Ú©Ó©Ì©Å©¾©·©°©©©¢©›©”©©†©©x©q©j©c©\©U©N©G©@©9©2©+©$©©©©©©ú¨ó¨ì¨å¨Þ¨רШɨ¨»¨´¨­¨¦¨Ÿ¨˜¨‘¨Ѝƒ¨|¨u¨n¨g¨`¨Y¨R¨K¨D¨=¨6¨/¨(¨!¨¨¨ ¨¨þ§÷§ð§é§â§Û§Ô§ͧƧ¿§¸§±§ª§£§œ§•§ާ‡§€§y§r§k§d§]§V§O§H§A§:§3§,§%§§§§ §§û¦ô¦í¦æ¦ߦئѦʦ漦µ¦®¦§¦ ¦™¦’¦‹¦„¦}¦v¦o¦h¦a¦Z¦S¦L¦E¦>¦7¦0¦)¦"¦¦¦ ¦¦ÿ¥ø¥ñ¥ê¥ã¥Ü¥Õ¥Î¥Ç¥À¥¹¥²¥«¥¤¥¥–¥¥ˆ¥¥z¥s¥l¥e¥^¥W¥P¥I¥B¥;¥4¥-¥&¥¥¥¥ ¥¥ü¤õ¤î¤ç¤à¤Ù¤Ò¤ˤĤ½¤¶¤¯¤¨¤¡¤š¤“¤Œ¤…¤~¤w¤p¤i¤b¤[¤T¤M¤F¤?¤8¤1¤*¤#¤¤¤¤¤¤ù£ò£ë£ä£Ý£Ö£Ï£È£Á£º£³£¬£¥£ž£—££‰£‚£{£t£m£f£_£X£Q£J£C£<£5£.£'£ £££ ££ý¢ö¢ï¢è¢á¢Ú¢Ó¢Ì¢Å¢¾¢·¢°¢©¢¢¢›¢”¢¢†¢¢x¢q¢j¢c¢\¢U¢N¢G¢@¢9¢2¢+¢$¢¢¢¢¢¢ú¡ó¡ì¡å¡Þ¡סСÉ¡¡»¡´¡­¡¦¡Ÿ¡˜¡‘¡Š¡ƒ¡|¡u¡n¡g¡`¡Y¡R¡K¡D¡=¡6¡/¡(¡!¡¡¡ ¡¡þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       ûŸôŸíŸæŸߟØŸÑŸÊŸß¼ŸµŸ®Ÿ§Ÿ Ÿ™Ÿ’Ÿ‹Ÿ„Ÿ}ŸvŸoŸhŸaŸZŸSŸLŸEŸ>Ÿ7Ÿ0Ÿ)Ÿ"ŸŸŸ ŸŸÿžøžñžêžãžÜžÕžΞÇžÀž¹ž²ž«ž¤žž–žžˆžžzžsžlžež^žWžPžIžBž;ž4ž-ž&žžžž žžüõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùœòœëœäœÝœÖœÏœÈœÁœºœ³œ¬œ¥œžœ—œœ‰œ‚œ{œtœmœfœ_œXœQœJœCœ<œ5œ.œ'œ œœœ œœý›ö›ï›è›á›Ú›Ó›Ì›Å›¾›·›°›©›¢›››”››†››x›q›j›c›\›U›N›G›@›9›2›+›$››››››úšóšìšåšÞšךКÉšš»š´š­š¦šŸš˜š‘šŠšƒš|šušnšgš`šYšRšKšDš=š6š/š(š!ššš ššþ™÷™ð™é™â™Û™Ô™Í™Æ™¿™¸™±™ª™£™œ™•™Ž™‡™€™y™r™k™d™]™V™O™H™A™:™3™,™%™™™™ ™™û˜ô˜í˜æ˜ߘؘјʘؼ˜µ˜®˜§˜ ˜™˜’˜‹˜„˜}˜v˜o˜h˜a˜Z˜S˜L˜E˜>˜7˜0˜)˜"˜˜˜ ˜˜ÿ—ø—ñ—ê—ã—Ü—Õ—ΗÇ—À—¹—²—«—¤——–——ˆ——z—s—l—e—^—W—P—I—B—;—4—-—&———— ——ü–õ–î–ç–à–Ù–Ò–Ë–Ä–½–¶–¯–¨–¡–š–“–Œ–…–~–w–p–i–b–[–T–M–F–?–8–1–*–#––––––ù•ò•ë•ä•ݕ֕ϕȕÁ•º•³•¬•¥•ž•—••‰•‚•{•t•m•f•_•X•Q•J•C•<•5•.•'• ••• ••ý”ö”ï”è”á”ڔӔ̔Ŕ¾”·”°”©”¢”›””””†””x”q”j”c”\”U”N”G”@”9”2”+”$””””””ú“ó“ì“å“Þ“דГÉ““»“´“­“¦“Ÿ“˜“‘“Š“ƒ“|“u“n“g“`“Y“R“K“D“=“6“/“(“!“““ ““þ’÷’ð’é’â’Û’Ô’Í’Æ’¿’¸’±’ª’£’œ’•’Ž’‡’€’y’r’k’d’]’V’O’H’A’:’3’,’%’’’’ ’’û‘ô‘í‘æ‘ߑؑёʑѼ‘µ‘®‘§‘ ‘™‘’‘‹‘„‘}‘v‘o‘h‘a‘Z‘S‘L‘E‘>‘7‘0‘)‘"‘‘‘ ‘‘ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùŽòŽëŽäŽÝŽÖŽÏŽÈŽÁŽºŽ³Ž¬Ž¥ŽžŽ—ŽŽ‰Ž‚Ž{ŽtŽmŽfŽ_ŽXŽQŽJŽCŽ<Ž5Ž.Ž'Ž ŽŽŽ ŽŽýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úŒóŒìŒåŒÞŒ׌ЌɌŒ»Œ´Œ­Œ¦ŒŸŒ˜Œ‘ŒŠŒƒŒ|ŒuŒnŒgŒ`ŒYŒRŒKŒDŒ=Œ6Œ/Œ(Œ!ŒŒŒ ŒŒþ‹÷‹ð‹é‹â‹Û‹Ô‹Í‹Æ‹¿‹¸‹±‹ª‹£‹œ‹•‹Ž‹‡‹€‹y‹r‹k‹d‹]‹V‹O‹H‹A‹:‹3‹,‹%‹‹‹‹ ‹‹ûŠôŠíŠæŠߊØŠÑŠÊŠÊ¼ŠµŠ®Š§Š Š™Š’Š‹Š„Š}ŠvŠoŠhŠaŠZŠSŠLŠEŠ>Š7Š0Š)Š"ŠŠŠ ŠŠÿ‰ø‰ñ‰ê‰ã‰܉Õ‰ΉljÀ‰¹‰²‰«‰¤‰‰–‰‰ˆ‰‰z‰s‰l‰e‰^‰W‰P‰I‰B‰;‰4‰-‰&‰‰‰‰ ‰‰üˆõˆîˆçˆàˆÙˆÒˆˈĈ½ˆ¶ˆ¯ˆ¨ˆ¡ˆšˆ“ˆŒˆ…ˆ~ˆwˆpˆiˆbˆ[ˆTˆMˆFˆ?ˆ8ˆ1ˆ*ˆ#ˆˆˆˆˆˆù‡ò‡ë‡ä‡݇Ö‡χȇÁ‡º‡³‡¬‡¥‡ž‡—‡‡‰‡‚‡{‡t‡m‡f‡_‡X‡Q‡J‡C‡<‡5‡.‡'‡ ‡‡‡ ‡‡ý†ö†ï†è†á†Ú†Ó†̆ņ¾†·†°†©†¢†›†”†††††x†q†j†c†\†U†N†G†@†9†2†+†$††††††ú…ó…ì…å…Þ…×…Ð…É…Â…»…´…­…¦…Ÿ…˜…‘…Š…ƒ…|…u…n…g…`…Y…R…K…D…=…6…/…(…!……… ……þ„÷„ð„é„â„ۄԄ̈́Ƅ¿„¸„±„ª„£„œ„•„Ž„‡„€„y„r„k„d„]„V„O„H„A„:„3„,„%„„„„ „„ûƒôƒíƒæƒ߃؃уʃüƒµƒ®ƒ§ƒ ƒ™ƒ’ƒ‹ƒ„ƒ}ƒvƒoƒhƒaƒZƒSƒLƒEƒ>ƒ7ƒ0ƒ)ƒ"ƒƒƒ ƒƒÿ‚ø‚ñ‚ê‚ã‚܂Ղ΂Ç‚À‚¹‚²‚«‚¤‚‚–‚‚ˆ‚‚z‚s‚l‚e‚^‚W‚P‚I‚B‚;‚4‚-‚&‚‚‚‚ ‚‚üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ù€ò€ë€ä€Ý€Ö€Ï€È€Á€º€³€¬€¥€ž€—€€‰€‚€{€t€m€f€_€X€Q€J€C€<€5€.€'€ €€€ €€ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$ú~ó~ì~å~Þ~×~Ð~É~Â~»~´~­~¦~Ÿ~˜~‘~Š~ƒ~|~u~n~g~`~Y~R~K~D~=~6~/~(~!~~~ ~~þ}÷}ð}é}â}Û}Ô}Í}Æ}¿}¸}±}ª}£}œ}•}Ž}‡}€}y}r}k}d}]}V}O}H}A}:}3},}%}}}} }}û|ô|í|æ|ß|Ø|Ñ|Ê|Ã|¼|µ|®|§| |™|’|‹|„|}|v|o|h|a|Z|S|L|E|>|7|0|)|"||| ||ÿ{ø{ñ{ê{ã{Ü{Õ{Î{Ç{À{¹{²{«{¤{{–{{ˆ{{z{s{l{e{^{W{P{I{B{;{4{-{&{{{{ {{üzõzîzçzàzÙzÒzËzÄz½z¶z¯z¨z¡zšz“zŒz…z~zwzpzizbz[zTzMzFz?z8z1z*z#zzzzzzùyòyëyäyÝyÖyÏyÈyÁyºy³y¬y¥yžy—yy‰y‚y{ytymyfy_yXyQyJyCyu7u0u)u"uuu uuÿtøtñtêtãtÜtÕtÎtÇtÀt¹t²t«t¤tt–ttˆttztstltet^tWtPtItBt;t4t-t&tttt ttüsõsîsçsàsÙsÒsËsÄs½s¶s¯s¨s¡sšs“sŒs…s~swspsisbs[sTsMsFs?s8s1s*s#ssssssùròrërärÝrÖrÏrÈrÁrºr³r¬r¥ržr—rr‰r‚r{rtrmrfr_rXrQrJrCrn7n0n)n"nnn nnÿmømñmêmãmÜmÕmÎmÇmÀm¹m²m«m¤mm–mmˆmmzmsmlmem^mWmPmImBm;m4m-m&mmmm mmülõlîlçlàlÙlÒlËlÄl½l¶l¯l¨l¡lšl“lŒl…l~lwlplilbl[lTlMlFl?l8l1l*l#llllllùkòkëkäkÝkÖkÏkÈkÁkºk³k¬k¥kžk—kk‰k‚k{ktkmkfk_kXkQkJkCkg7g0g)g"ggg ggÿføfñfêfãfÜfÕfÎfÇfÀf¹f²f«f¤ff–ffˆffzfsflfef^fWfPfIfBf;f4f-f&ffff ffüeõeîeçeàeÙeÒeËeÄe½e¶e¯e¨e¡eše“eŒe…e~ewepeiebe[eTeMeFe?e8e1e*e#eeeeeeùdòdëdädÝdÖdÏdÈdÁdºd³d¬d¥džd—dd‰d‚d{dtdmdfd_dXdQdJdCd`7`0`)`"``` ``ÿ_ø_ñ_ê_ã_Ü_Õ_Î_Ç_À_¹_²_«_¤__–__ˆ__z_s_l_e_^_W_P_I_B_;_4_-_&____ __ü^õ^î^ç^à^Ù^Ò^Ë^Ä^½^¶^¯^¨^¡^š^“^Œ^…^~^w^p^i^b^[^T^M^F^?^8^1^*^#^^^^^^ù]ò]ë]ä]Ý]Ö]Ï]È]Á]º]³]¬]¥]ž]—]]‰]‚]{]t]m]f]_]X]Q]J]C]<]5].]'] ]]] ]]ý\ö\ï\è\á\Ú\Ó\Ì\Å\¾\·\°\©\¢\›\”\\†\\x\q\j\c\\\U\N\G\@\9\2\+\$\\\\\\ú[ó[ì[å[Þ[×[Ð[É[Â[»[´[­[¦[Ÿ[˜[‘[Š[ƒ[|[u[n[g[`[Y[R[K[D[=[6[/[([![[[ [[þZ÷ZðZéZâZÛZÔZÍZÆZ¿Z¸Z±ZªZ£ZœZ•ZŽZ‡Z€ZyZrZkZdZ]ZVZOZHZAZ:Z3Z,Z%ZZZZ ZZûYôYíYæYßYØYÑYÊYÃY¼YµY®Y§Y Y™Y’Y‹Y„Y}YvYoYhYaYZYSYLYEY>Y7Y0Y)Y"YYY YYÿXøXñXêXãXÜXÕXÎXÇXÀX¹X²X«X¤XX–XXˆXXzXsXlXeX^XWXPXIXBX;X4X-X&XXXX XXüWõWîWçWàWÙWÒWËWÄW½W¶W¯W¨W¡WšW“WŒW…W~WwWpWiWbW[WTWMWFW?W8W1W*W#WWWWWWùVòVëVäVÝVÖVÏVÈVÁVºV³V¬V¥VžV—VV‰V‚V{VtVmVfV_VXVQVJVCVR7R0R)R"RRR RRÿQøQñQêQãQÜQÕQÎQÇQÀQ¹Q²Q«Q¤QQ–QQˆQQzQsQlQeQ^QWQPQIQBQ;Q4Q-Q&QQQQ QQüPõPîPçPàPÙPÒPËPÄP½P¶P¯P¨P¡PšP“PŒP…P~PwPpPiPbP[PTPMPFP?P8P1P*P#PPPPPPùOòOëOäOÝOÖOÏOÈOÁOºO³O¬O¥OžO—OO‰O‚O{OtOmOfO_OXOQOJOCOK7K0K)K"KKK KKÿJøJñJêJãJÜJÕJÎJÇJÀJ¹J²J«J¤JJ–JJˆJJzJsJlJeJ^JWJPJIJBJ;J4J-J&JJJJ JJüIõIîIçIàIÙIÒIËIÄI½I¶I¯I¨I¡IšI“IŒI…I~IwIpIiIbI[ITIMIFI?I8I1I*I#IIIIIIùHòHëHäHÝHÖHÏHÈHÁHºH³H¬H¥HžH—HH‰H‚H{HtHmHfH_HXHQHJHCHD7D0D)D"DDD DDÿCøCñCêCãCÜCÕCÎCÇCÀC¹C²C«C¤CC–CCˆCCzCsClCeC^CWCPCICBC;C4C-C&CCCC CCüBõBîBçBàBÙBÒBËBÄB½B¶B¯B¨B¡BšB“BŒB…B~BwBpBiBbB[BTBMBFB?B8B1B*B#BBBBBBùAòAëAäAÝAÖAÏAÈAÁAºA³A¬A¥AžA—AA‰A‚A{AtAmAfA_AXAQAJACA÷>ð>é>â>Û>Ô>Í>Æ>¿>¸>±>ª>£>œ>•>Ž>‡>€>y>r>k>d>]>V>O>H>A>:>3>,>%>>>> >>û=ô=í=æ=ß=Ø=Ñ=Ê=Ã=¼=µ=®=§= =™=’=‹=„=}=v=o=h=a=Z=S=L=E=>=7=0=)="=== ==ÿ<ø<ñ<ê<ã<Ü<Õ<Î<Ç<À<¹<²<«<¤<<–<<ˆ<<z<s<l<e<^<W<P<I<B<;<4<-<&<<<< <<ü;õ;î;ç;à;Ù;Ò;Ë;Ä;½;¶;¯;¨;¡;š;“;Œ;…;~;w;p;i;b;[;T;M;F;?;8;1;*;#;;;;;;ù:ò:ë:ä:Ý:Ö:Ï:È:Á:º:³:¬:¥:ž:—::‰:‚:{:t:m:f:_:X:Q:J:C:<:5:.:': ::: ::ý9ö9ï9è9á9Ú9Ó9Ì9Å9¾9·9°9©9¢9›9”99†99x9q9j9c9\9U9N9G9@99929+9$999999ú8ó8ì8å8Þ8×8Ð8É8Â8»8´8­8¦8Ÿ8˜8‘8Š8ƒ8|8u8n8g8`8Y8R8K8D8=868/8(8!888 88þ7÷7ð7é7â7Û7Ô7Í7Æ7¿7¸7±7ª7£7œ7•7Ž7‡7€7y7r7k7d7]7V7O7H7A7:737,7%7777 77û6ô6í6æ6ß6Ø6Ñ6Ê6Ã6¼6µ6®6§6 6™6’6‹6„6}6v6o6h6a6Z6S6L6E6>67606)6"666 66ÿ5ø5ñ5ê5ã5Ü5Õ5Î5Ç5À5¹5²5«5¤55–55ˆ55z5s5l5e5^5W5P5I5B5;545-5&5555 55ü4õ4î4ç4à4Ù4Ò4Ë4Ä4½4¶4¯4¨4¡4š4“4Œ4…4~4w4p4i4b4[4T4M4F4?48414*4#444444ù3ò3ë3ä3Ý3Ö3Ï3È3Á3º3³3¬3¥3ž3—33‰3‚3{3t3m3f3_3X3Q3J3C3<353.3'3 333 33ý2ö2ï2è2á2Ú2Ó2Ì2Å2¾2·2°2©2¢2›2”22†22x2q2j2c2\2U2N2G2@29222+2$222222ú1ó1ì1å1Þ1×1Ð1É1Â1»1´1­1¦1Ÿ1˜1‘1Š1ƒ1|1u1n1g1`1Y1R1K1D1=161/1(1!111 11þ0÷0ð0é0â0Û0Ô0Í0Æ0¿0¸0±0ª0£0œ0•0Ž0‡0€0y0r0k0d0]0V0O0H0A0:030,0%0000 00û/ô/í/æ/ß/Ø/Ñ/Ê/Ã/¼/µ/®/§/ /™/’/‹/„/}/v/o/h/a/Z/S/L/E/>/7/0/)/"/// //ÿ.ø.ñ.ê.ã.Ü.Õ.Î.Ç.À.¹.².«.¤..–..ˆ..z.s.l.e.^.W.P.I.B.;.4.-.&.... ..ü-õ-î-ç-à-Ù-Ò-Ë-Ä-½-¶-¯-¨-¡-š-“-Œ-…-~-w-p-i-b-[-T-M-F-?-8-1-*-#------ù,ò,ë,ä,Ý,Ö,Ï,È,Á,º,³,¬,¥,ž,—,,‰,‚,{,t,m,f,_,X,Q,J,C,<,5,.,', ,,, ,,ý+ö+ï+è+á+Ú+Ó+Ì+Å+¾+·+°+©+¢+›+”++†++x+q+j+c+\+U+N+G+@+9+2+++$++++++ú*ó*ì*å*Þ*×*Ð*É*Â*»*´*­*¦*Ÿ*˜*‘*Š*ƒ*|*u*n*g*`*Y*R*K*D*=*6*/*(*!*** **þ)÷)ð)é)â)Û)Ô)Í)Æ)¿)¸)±)ª)£)œ)•)Ž)‡)€)y)r)k)d)])V)O)H)A):)3),)%)))) ))û(ô(í(æ(ß(Ø(Ñ(Ê(Ã(¼(µ(®(§( (™(’(‹(„(}(v(o(h(a(Z(S(L(E(>(7(0()("((( ((ÿ'ø'ñ'ê'ã'Ü'Õ'Î'Ç'À'¹'²'«'¤''–''ˆ''z's'l'e'^'W'P'I'B';'4'-'&'''' ''ü&õ&î&ç&à&Ù&Ò&Ë&Ä&½&¶&¯&¨&¡&š&“&Œ&…&~&w&p&i&b&[&T&M&F&?&8&1&*&#&&&&&&ù%ò%ë%ä%Ý%Ö%Ï%È%Á%º%³%¬%¥%ž%—%%‰%‚%{%t%m%f%_%X%Q%J%C%<%5%.%'% %%% %%ý$ö$ï$è$á$Ú$Ó$Ì$Å$¾$·$°$©$¢$›$”$$†$$x$q$j$c$\$U$N$G$@$9$2$+$$$$$$$$ú#ó#ì#å#Þ#×#Ð#É#Â#»#´#­#¦#Ÿ#˜#‘#Š#ƒ#|#u#n#g#`#Y#R#K#D#=#6#/#(#!### ##þ"÷"ð"é"â"Û"Ô"Í"Æ"¿"¸"±"ª"£"œ"•"Ž"‡"€"y"r"k"d"]"V"O"H"A":"3","%"""" ""û!ô!í!æ!ß!Ø!Ñ!Ê!Ã!¼!µ!®!§! !™!’!‹!„!}!v!o!h!a!Z!S!L!E!>!7!0!)!"!!! !!ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þ÷ðéâÛÔÍÆ¿¸±ª£œ•އ€yrkd]VOHA:3,% ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)" ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-& üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.'  ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´­¦Ÿ˜‘Šƒ|ung`YRKD=6/(! þÿ ÷ÿ ðÿ éÿ âÿ Ûÿ Ôÿ Íÿ Æÿ ¿ÿ ¸ÿ ±ÿ ªÿ £ÿ œÿ •ÿ Žÿ ‡ÿ €ÿ yÿ rÿ kÿ dÿ ]ÿ Vÿ Oÿ Hÿ Aÿ :ÿ 3ÿ ,ÿ %ÿ ÿ ÿ ÿ  ÿ ÿ ûþ ôþ íþ æþ ßþ Øþ Ñþ Êþ Ãþ ¼þ µþ ®þ §þ  þ ™þ ’þ ‹þ „þ }þ vþ oþ hþ aþ Zþ Sþ Lþ Eþ >þ 7þ 0þ )þ "þ þ þ  þ þ ÿý øý ñý êý ãý Üý Õý Îý Çý Àý ¹ý ²ý «ý ¤ý ý –ý ý ˆý ý zý sý lý eý ^ý Wý Pý Iý Bý ;ý 4ý -ý &ý ý ý ý  ý ý üü õü îü çü àü Ùü Òü Ëü Äü ½ü ¶ü ¯ü ¨ü ¡ü šü “ü Œü …ü ~ü wü pü iü bü [ü Tü Mü Fü ?ü 8ü 1ü *ü #ü ü ü ü ü ü ùû òû ëû äû Ýû Öû Ïû Èû Áû ºû ³û ¬û ¥û žû —û û ‰û ‚û {û tû mû fû _û Xû Qû Jû Cû <û 5û .û 'û  û û û  û û ýú öú ïú èú áú Úú Óú Ìú Åú ¾ú ·ú °ú ©ú ¢ú ›ú ”ú ú †ú ú xú qú jú cú \ú Uú Nú Gú @ú 9ú 2ú +ú $ú ú ú ú ú ú úù óù ìù åù Þù ×ù Ðù Éù Âù »ù ´ù ­ù ¦ù Ÿù ˜ù ‘ù Šù ƒù |ù uù nù gù `ù Yù Rù Kù Dù =ù 6ù /ù (ù !ù ù ù  ù ù þø ÷ø ðø éø âø Ûø Ôø Íø Æø ¿ø ¸ø ±ø ªø £ø œø •ø Žø ‡ø €ø yø rø kø dø ]ø Vø Oø Hø Aø :ø 3ø ,ø %ø ø ø ø  ø ø û÷ ô÷ í÷ æ÷ ß÷ Ø÷ Ñ÷ Ê÷ Ã÷ ¼÷ µ÷ ®÷ §÷  ÷ ™÷ ’÷ ‹÷ „÷ }÷ v÷ o÷ h÷ a÷ Z÷ S÷ L÷ E÷ >÷ 7÷ 0÷ )÷ "÷ ÷ ÷  ÷ ÷ ÿö øö ñö êö ãö Üö Õö Îö Çö Àö ¹ö ²ö «ö ¤ö ö –ö ö ˆö ö zö sö lö eö ^ö Wö Pö Iö Bö ;ö 4ö -ö &ö ö ö ö  ö ö üõ õõ îõ çõ àõ Ùõ Òõ Ëõ Äõ ½õ ¶õ ¯õ ¨õ ¡õ šõ “õ Œõ …õ ~õ wõ põ iõ bõ [õ Tõ Mõ Fõ ?õ 8õ 1õ *õ #õ õ õ õ õ õ ùô òô ëô äô Ýô Öô Ïô Èô Áô ºô ³ô ¬ô ¥ô žô —ô ô ‰ô ‚ô {ô tô mô fô _ô Xô Qô Jô Cô <ô 5ô .ô 'ô  ô ô ô  ô ô ýó öó ïó èó áó Úó Óó Ìó Åó ¾ó ·ó °ó ©ó ¢ó ›ó ”ó ó †ó ó xó qó jó có \ó Uó Nó Gó @ó 9ó 2ó +ó $ó ó ó ó ó ó úò óò ìò åò Þò ×ò Ðò Éò Âò »ò ´ò ­ò ¦ò Ÿò ˜ò ‘ò Šò ƒò |ò uò nò gò `ò Yò Rò Kò Dò =ò 6ò /ò (ò !ò ò ò  ò ò þñ ÷ñ ðñ éñ âñ Ûñ Ôñ Íñ Æñ ¿ñ ¸ñ ±ñ ªñ £ñ œñ •ñ Žñ ‡ñ €ñ yñ rñ kñ dñ ]ñ Vñ Oñ Hñ Añ :ñ 3ñ ,ñ %ñ ñ ñ ñ  ñ ñ ûð ôð íð æð ßð Øð Ñð Êð Ãð ¼ð µð ®ð §ð  ð ™ð ’ð ‹ð „ð }ð vð oð hð að Zð Sð Lð Eð >ð 7ð 0ð )ð "ð ð ð  ð ð ÿï øï ñï êï ãï Üï Õï Îï Çï Àï ¹ï ²ï «ï ¤ï ï –ï ï ˆï ï zï sï lï eï ^ï Wï Pï Iï Bï ;ï 4ï -ï &ï ï ï ï  ï ï üî õî îî çî àî Ùî Òî Ëî Äî ½î ¶î ¯î ¨î ¡î šî “î Œî …î ~î wî pî iî bî [î Tî Mî Fî ?î 8î 1î *î #î î î î î î ùí òí ëí äí Ýí Öí Ïí Èí Áí ºí ³í ¬í ¥í ží —í í ‰í ‚í {í tí mí fí _í Xí Qí Jí Cí <í 5í .í 'í  í í í  í í ýì öì ïì èì áì Úì Óì Ìì Åì ¾ì ·ì °ì ©ì ¢ì ›ì ”ì ì †ì ì xì qì jì cì \ì Uì Nì Gì @ì 9ì 2ì +ì $ì ì ì ì ì ì úë óë ìë åë Þë ×ë Ðë Éë Âë »ë ´ë ­ë ¦ë Ÿë ˜ë ‘ë Šë ƒë |ë uë në gë `ë Yë Rë Kë Dë =ë 6ë /ë (ë !ë ë ë  ë ë þê ÷ê ðê éê âê Ûê Ôê Íê Æê ¿ê ¸ê ±ê ªê £ê œê •ê Žê ‡ê €ê yê rê kê dê ]ê Vê Oê Hê Aê :ê 3ê ,ê %ê ê ê ê  ê ê ûé ôé íé æé ßé Øé Ñé Êé Ãé ¼é µé ®é §é  é ™é ’é ‹é „é }é vé oé hé aé Zé Sé Lé Eé >é 7é 0é )é "é é é  é é ÿè øè ñè êè ãè Üè Õè Îè Çè Àè ¹è ²è «è ¤è è –è è ˆè è zè sè lè eè ^è Wè Pè Iè Bè ;è 4è -è &è è è è  è è üç õç îç çç àç Ùç Òç Ëç Äç ½ç ¶ç ¯ç ¨ç ¡ç šç “ç Œç …ç ~ç wç pç iç bç [ç Tç Mç Fç ?ç 8ç 1ç *ç #ç ç ç ç ç ç ùæ òæ ëæ äæ Ýæ Öæ Ïæ Èæ Áæ ºæ ³æ ¬æ ¥æ žæ —æ æ ‰æ ‚æ {æ tæ mæ fæ _æ Xæ Qæ Jæ Cæ <æ 5æ .æ 'æ  æ æ æ  æ æ ýå öå ïå èå áå Úå Óå Ìå Åå ¾å ·å °å ©å ¢å ›å ”å å †å å xå qå jå cå \å Uå Nå Gå @å 9å 2å +å $å å å å å å úä óä ìä åä Þä ×ä Ðä Éä Âä »ä ´ä ­ä ¦ä Ÿä ˜ä ‘ä Šä ƒä |ä uä nä gä `ä Yä Rä Kä Dä =ä 6ä /ä (ä !ä ä ä  ä ä þã ÷ã ðã éã âã Ûã Ôã Íã Æã ¿ã ¸ã ±ã ªã £ã œã •ã Žã ‡ã €ã yã rã kã dã ]ã Vã Oã Hã Aã :ã 3ã ,ã %ã ã ã ã  ã ã ûâ ôâ íâ æâ ßâ Øâ Ñâ Êâ Ãâ ¼â µâ ®â §â  â ™â ’â ‹â „â }â vâ oâ hâ aâ Zâ Sâ Lâ Eâ >â 7â 0â )â "â â â  â â ÿá øá ñá êá ãá Üá Õá Îá Çá Àá ¹á ²á «á ¤á á –á á ˆá á zá sá lá eá ^á Wá Pá Iá Bá ;á 4á -á &á á á á  á á üà õà îà çà àà Ùà Òà Ëà Äà ½à ¶à ¯à ¨à ¡à šà “à Œà …à ~à wà pà ià bà [à Tà Mà Fà ?à 8à 1à *à #à à à à à à ùß òß ëß äß Ýß Öß Ïß Èß Áß ºß ³ß ¬ß ¥ß žß —ß ß ‰ß ‚ß {ß tß mß fß _ß Xß Qß Jß Cß <ß 5ß .ß 'ß  ß ß ß  ß ß ýÞ öÞ ïÞ èÞ áÞ ÚÞ ÓÞ ÌÞ ÅÞ ¾Þ ·Þ °Þ ©Þ ¢Þ ›Þ ”Þ Þ †Þ Þ xÞ qÞ jÞ cÞ \Þ UÞ NÞ GÞ @Þ 9Þ 2Þ +Þ $Þ Þ Þ Þ Þ Þ úÝ óÝ ìÝ åÝ ÞÝ ×Ý ÐÝ ÉÝ ÂÝ »Ý ´Ý ­Ý ¦Ý ŸÝ ˜Ý ‘Ý ŠÝ ƒÝ |Ý uÝ nÝ gÝ `Ý YÝ RÝ KÝ DÝ =Ý 6Ý /Ý (Ý !Ý Ý Ý  Ý Ý þÜ ÷Ü ðÜ éÜ âÜ ÛÜ ÔÜ ÍÜ ÆÜ ¿Ü ¸Ü ±Ü ªÜ £Ü œÜ •Ü ŽÜ ‡Ü €Ü yÜ rÜ kÜ dÜ ]Ü VÜ OÜ HÜ AÜ :Ü 3Ü ,Ü %Ü Ü Ü Ü  Ü Ü ûÛ ôÛ íÛ æÛ ßÛ ØÛ ÑÛ ÊÛ ÃÛ ¼Û µÛ ®Û §Û  Û ™Û ’Û ‹Û „Û }Û vÛ oÛ hÛ aÛ ZÛ SÛ LÛ EÛ >Û 7Û 0Û )Û "Û Û Û  Û Û ÿÚ øÚ ñÚ êÚ ãÚ ÜÚ ÕÚ ÎÚ ÇÚ ÀÚ ¹Ú ²Ú «Ú ¤Ú Ú –Ú Ú ˆÚ Ú zÚ sÚ lÚ eÚ ^Ú WÚ PÚ IÚ BÚ ;Ú 4Ú -Ú &Ú Ú Ú Ú  Ú Ú üÙ õÙ îÙ çÙ àÙ ÙÙ ÒÙ ËÙ ÄÙ ½Ù ¶Ù ¯Ù ¨Ù ¡Ù šÙ “Ù ŒÙ …Ù ~Ù wÙ pÙ iÙ bÙ [Ù TÙ MÙ FÙ ?Ù 8Ù 1Ù *Ù #Ù Ù Ù Ù Ù Ù ùØ òØ ëØ äØ ÝØ ÖØ ÏØ ÈØ ÁØ ºØ ³Ø ¬Ø ¥Ø žØ —Ø Ø ‰Ø ‚Ø {Ø tØ mØ fØ _Ø XØ QØ JØ CØ <Ø 5Ø .Ø 'Ø  Ø Ø Ø  Ø Ø ý× ö× ï× è× á× Ú× Ó× Ì× Å× ¾× ·× °× ©× ¢× ›× ”× × †× × x× q× j× c× \× U× N× G× @× 9× 2× +× $× × × × × × úÖ óÖ ìÖ åÖ ÞÖ ×Ö ÐÖ ÉÖ ÂÖ »Ö ´Ö ­Ö ¦Ö ŸÖ ˜Ö ‘Ö ŠÖ ƒÖ |Ö uÖ nÖ gÖ `Ö YÖ RÖ KÖ DÖ =Ö 6Ö /Ö (Ö !Ö Ö Ö  Ö Ö þÕ ÷Õ ðÕ éÕ âÕ ÛÕ ÔÕ ÍÕ ÆÕ ¿Õ ¸Õ ±Õ ªÕ £Õ œÕ •Õ ŽÕ ‡Õ €Õ yÕ rÕ kÕ dÕ ]Õ VÕ OÕ HÕ AÕ :Õ 3Õ ,Õ %Õ Õ Õ Õ  Õ Õ ûÔ ôÔ íÔ æÔ ßÔ ØÔ ÑÔ ÊÔ ÃÔ ¼Ô µÔ ®Ô §Ô  Ô ™Ô ’Ô ‹Ô „Ô }Ô vÔ oÔ hÔ aÔ ZÔ SÔ LÔ EÔ >Ô 7Ô 0Ô )Ô "Ô Ô Ô  Ô Ô ÿÓ øÓ ñÓ êÓ ãÓ ÜÓ ÕÓ ÎÓ ÇÓ ÀÓ ¹Ó ²Ó «Ó ¤Ó Ó –Ó Ó ˆÓ Ó zÓ sÓ lÓ eÓ ^Ó WÓ PÓ IÓ BÓ ;Ó 4Ó -Ó &Ó Ó Ó Ó  Ó Ó üÒ õÒ îÒ çÒ àÒ ÙÒ ÒÒ ËÒ ÄÒ ½Ò ¶Ò ¯Ò ¨Ò ¡Ò šÒ “Ò ŒÒ …Ò ~Ò wÒ pÒ iÒ bÒ [Ò TÒ MÒ FÒ ?Ò 8Ò 1Ò *Ò #Ò Ò Ò Ò Ò Ò ùÑ òÑ ëÑ äÑ ÝÑ ÖÑ ÏÑ ÈÑ ÁÑ ºÑ ³Ñ ¬Ñ ¥Ñ žÑ —Ñ Ñ ‰Ñ ‚Ñ {Ñ tÑ mÑ fÑ _Ñ XÑ QÑ JÑ CÑ <Ñ 5Ñ .Ñ 'Ñ  Ñ Ñ Ñ  Ñ Ñ ýÐ öÐ ïÐ èÐ áÐ ÚÐ ÓÐ ÌÐ ÅÐ ¾Ð ·Ð °Ð ©Ð ¢Ð ›Ð ”Ð Ð †Ð Ð xÐ qÐ jÐ cÐ \Ð UÐ NÐ GÐ @Ð 9Ð 2Ð +Ð $Ð Ð Ð Ð Ð Ð úÏ óÏ ìÏ åÏ ÞÏ ×Ï ÐÏ ÉÏ ÂÏ »Ï ´Ï ­Ï ¦Ï ŸÏ ˜Ï ‘Ï ŠÏ ƒÏ |Ï uÏ nÏ gÏ `Ï YÏ RÏ KÏ DÏ =Ï 6Ï /Ï (Ï !Ï Ï Ï  Ï Ï þÎ ÷Î ðÎ éÎ âÎ ÛÎ ÔÎ ÍÎ ÆÎ ¿Î ¸Î ±Î ªÎ £Î œÎ •Î ŽÎ ‡Î €Î yÎ rÎ kÎ dÎ ]Î VÎ OÎ HÎ AÎ :Î 3Î ,Î %Î Î Î Î  Î Î ûÍ ôÍ íÍ æÍ ßÍ ØÍ ÑÍ ÊÍ ÃÍ ¼Í µÍ ®Í §Í  Í ™Í ’Í ‹Í „Í }Í vÍ oÍ hÍ aÍ ZÍ SÍ LÍ EÍ >Í 7Í 0Í )Í "Í Í Í  Í Í ÿÌ øÌ ñÌ êÌ ãÌ ÜÌ ÕÌ ÎÌ ÇÌ ÀÌ ¹Ì ²Ì «Ì ¤Ì Ì –Ì Ì ˆÌ Ì zÌ sÌ lÌ eÌ ^Ì WÌ PÌ IÌ BÌ ;Ì 4Ì -Ì &Ì Ì Ì Ì  Ì Ì üË õË îË çË àË ÙË ÒË ËË ÄË ½Ë ¶Ë ¯Ë ¨Ë ¡Ë šË “Ë ŒË …Ë ~Ë wË pË iË bË [Ë TË MË FË ?Ë 8Ë 1Ë *Ë #Ë Ë Ë Ë Ë Ë ùÊ òÊ ëÊ äÊ ÝÊ ÖÊ ÏÊ ÈÊ ÁÊ ºÊ ³Ê ¬Ê ¥Ê žÊ —Ê Ê ‰Ê ‚Ê {Ê tÊ mÊ fÊ _Ê XÊ QÊ JÊ CÊ <Ê 5Ê .Ê 'Ê  Ê Ê Ê  Ê Ê ýÉ öÉ ïÉ èÉ áÉ ÚÉ ÓÉ ÌÉ ÅÉ ¾É ·É °É ©É ¢É ›É ”É É †É É xÉ qÉ jÉ cÉ \É UÉ NÉ GÉ @É 9É 2É +É $É É É É É É úÈ óÈ ìÈ åÈ ÞÈ ×È ÐÈ ÉÈ ÂÈ »È ´È ­È ¦È ŸÈ ˜È ‘È ŠÈ ƒÈ |È uÈ nÈ gÈ `È YÈ RÈ KÈ DÈ =È 6È /È (È !È È È  È È þÇ ÷Ç ðÇ éÇ âÇ ÛÇ ÔÇ ÍÇ ÆÇ ¿Ç ¸Ç ±Ç ªÇ £Ç œÇ •Ç ŽÇ ‡Ç €Ç yÇ rÇ kÇ dÇ ]Ç VÇ OÇ HÇ AÇ :Ç 3Ç ,Ç %Ç Ç Ç Ç  Ç Ç ûÆ ôÆ íÆ æÆ ߯ ØÆ ÑÆ ÊÆ ÃÆ ¼Æ µÆ ®Æ §Æ  Æ ™Æ ’Æ ‹Æ „Æ }Æ vÆ oÆ hÆ aÆ ZÆ SÆ LÆ EÆ >Æ 7Æ 0Æ )Æ "Æ Æ Æ  Æ Æ ÿÅ øÅ ñÅ êÅ ãÅ ÜÅ ÕÅ ÎÅ ÇÅ ÀÅ ¹Å ²Å «Å ¤Å Å –Å Å ˆÅ Å zÅ sÅ lÅ eÅ ^Å WÅ PÅ IÅ BÅ ;Å 4Å -Å &Å Å Å Å  Å Å üÄ õÄ îÄ çÄ àÄ ÙÄ ÒÄ ËÄ ÄÄ ½Ä ¶Ä ¯Ä ¨Ä ¡Ä šÄ “Ä ŒÄ …Ä ~Ä wÄ pÄ iÄ bÄ [Ä TÄ MÄ FÄ ?Ä 8Ä 1Ä *Ä #Ä Ä Ä Ä Ä Ä ùà òà ëà äà Ýà Öà Ïà Èà Áà ºÃ ³Ã ¬Ã ¥Ã žÃ —à à ‰Ã ‚à {à tà mà fà _à Xà Qà Jà Cà <à 5à .à 'à  à à à  à à ý ö ï è á Ú Ó Ì Å ¾Â ·Â °Â ©Â ¢Â ›Â ”  †Â  x q j c \ U N G @ 9 2 + $      úÁ óÁ ìÁ åÁ ÞÁ ×Á ÐÁ ÉÁ ÂÁ »Á ´Á ­Á ¦Á ŸÁ ˜Á ‘Á ŠÁ ƒÁ |Á uÁ nÁ gÁ `Á YÁ RÁ KÁ DÁ =Á 6Á /Á (Á !Á Á Á  Á Á þÀ ÷À ðÀ éÀ âÀ ÛÀ ÔÀ ÍÀ ÆÀ ¿À ¸À ±À ªÀ £À œÀ •À ŽÀ ‡À €À yÀ rÀ kÀ dÀ ]À VÀ OÀ HÀ AÀ :À 3À ,À %À À À À  À À û¿ ô¿ í¿ æ¿ ß¿ Ø¿ Ñ¿ Ê¿ ÿ ¼¿ µ¿ ®¿ §¿  ¿ ™¿ ’¿ ‹¿ „¿ }¿ v¿ o¿ h¿ a¿ Z¿ S¿ L¿ E¿ >¿ 7¿ 0¿ )¿ "¿ ¿ ¿  ¿ ¿ ÿ¾ ø¾ ñ¾ ê¾ ã¾ ܾ Õ¾ ξ Ǿ À¾ ¹¾ ²¾ «¾ ¤¾ ¾ –¾ ¾ ˆ¾ ¾ z¾ s¾ l¾ e¾ ^¾ W¾ P¾ I¾ B¾ ;¾ 4¾ -¾ &¾ ¾ ¾ ¾  ¾ ¾ ü½ õ½ î½ ç½ འÙ½ Ò½ ˽ Ľ ½½ ¶½ ¯½ ¨½ ¡½ š½ “½ Œ½ …½ ~½ w½ p½ i½ b½ [½ T½ M½ F½ ?½ 8½ 1½ *½ #½ ½ ½ ½ ½ ½ ù¼ ò¼ ë¼ ä¼ ݼ Ö¼ ϼ ȼ Á¼ º¼ ³¼ ¬¼ ¥¼ ž¼ —¼ ¼ ‰¼ ‚¼ {¼ t¼ m¼ f¼ _¼ X¼ Q¼ J¼ C¼ <¼ 5¼ .¼ '¼  ¼ ¼ ¼  ¼ ¼ ý» ö» ï» è» á» Ú» Ó» Ì» Å» ¾» ·» °» ©» ¢» ›» ”» » †» » x» q» j» c» \» U» N» G» @» 9» 2» +» $» » » » » » úº óº ìº åº Þº ׺ к ɺ º »º ´º ­º ¦º Ÿº ˜º ‘º Šº ƒº |º uº nº gº `º Yº Rº Kº Dº =º 6º /º (º !º º º  º º þ¹ ÷¹ ð¹ é¹ â¹ Û¹ Ô¹ ͹ ƹ ¿¹ ¸¹ ±¹ ª¹ £¹ œ¹ •¹ ޹ ‡¹ €¹ y¹ r¹ k¹ d¹ ]¹ V¹ O¹ H¹ A¹ :¹ 3¹ ,¹ %¹ ¹ ¹ ¹  ¹ ¹ û¸ ô¸ í¸ æ¸ ߸ ظ Ѹ ʸ ø ¼¸ µ¸ ®¸ §¸  ¸ ™¸ ’¸ ‹¸ „¸ }¸ v¸ o¸ h¸ a¸ Z¸ S¸ L¸ E¸ >¸ 7¸ 0¸ )¸ "¸ ¸ ¸  ¸ ¸ ÿ· ø· ñ· ê· ã· Ü· Õ· η Ç· À· ¹· ²· «· ¤· · –· · ˆ· · z· s· l· e· ^· W· P· I· B· ;· 4· -· &· · · ·  · · ü¶ õ¶ î¶ ç¶ à¶ Ù¶ Ò¶ ˶ Ķ ½¶ ¶¶ ¯¶ ¨¶ ¡¶ š¶ “¶ Œ¶ …¶ ~¶ w¶ p¶ i¶ b¶ [¶ T¶ M¶ F¶ ?¶ 8¶ 1¶ *¶ #¶ ¶ ¶ ¶ ¶ ¶ ùµ òµ ëµ äµ ݵ Öµ ϵ ȵ Áµ ºµ ³µ ¬µ ¥µ žµ —µ µ ‰µ ‚µ {µ tµ mµ fµ _µ Xµ Qµ Jµ Cµ <µ 5µ .µ 'µ  µ µ µ  µ µ ý´ ö´ ï´ è´ á´ Ú´ Ó´ Ì´ Å´ ¾´ ·´ °´ ©´ ¢´ ›´ ”´ ´ †´ ´ x´ q´ j´ c´ \´ U´ N´ G´ @´ 9´ 2´ +´ $´ ´ ´ ´ ´ ´ ú³ ó³ ì³ å³ Þ³ ׳ г ɳ ³ »³ ´³ ­³ ¦³ Ÿ³ ˜³ ‘³ г ƒ³ |³ u³ n³ g³ `³ Y³ R³ K³ D³ =³ 6³ /³ (³ !³ ³ ³  ³ ³ þ² ÷² ð² é² â² Û² Ô² Ͳ Ʋ ¿² ¸² ±² ª² £² œ² •² ޲ ‡² €² y² r² k² d² ]² V² O² H² A² :² 3² ,² %² ² ² ²  ² ² û± ô± í± æ± ß± ر ѱ ʱ ñ ¼± µ± ®± §±  ± ™± ’± ‹± „± }± v± o± h± a± Z± S± L± E± >± 7± 0± )± "± ± ±  ± ± ÿ° ø° ñ° ê° ã° ܰ Õ° ΰ ǰ À° ¹° ²° «° ¤° ° –° ° ˆ° ° z° s° l° e° ^° W° P° I° B° ;° 4° -° &° ° ° °  ° ° ü¯ õ¯ î¯ ç¯ ௠Ù¯ Ò¯ ˯ į ½¯ ¶¯ ¯¯ ¨¯ ¡¯ 𝠓¯ Œ¯ …¯ ~¯ w¯ p¯ i¯ b¯ [¯ T¯ M¯ F¯ ?¯ 8¯ 1¯ *¯ #¯ ¯ ¯ ¯ ¯ ¯ ù® ò® ë® ä® Ý® Ö® Ï® È® Á® º® ³® ¬® ¥® ž® —® ® ‰® ‚® {® t® m® f® _® X® Q® J® C® <® 5® .® '®  ® ® ®  ® ® ý­ ö­ ï­ è­ á­ Ú­ Ó­ Ì­ Å­ ¾­ ·­ °­ ©­ ¢­ ›­ ”­ ­ †­ ­ x­ q­ j­ c­ \­ U­ N­ G­ @­ 9­ 2­ +­ $­ ­ ­ ­ ­ ­ ú¬ ó¬ ì¬ å¬ Þ¬ ׬ Ь ɬ ¬ »¬ ´¬ ­¬ ¦¬ Ÿ¬ ˜¬ ‘¬ Ь ƒ¬ |¬ u¬ n¬ g¬ `¬ Y¬ R¬ K¬ D¬ =¬ 6¬ /¬ (¬ !¬ ¬ ¬  ¬ ¬ þ« ÷« ð« é« â« Û« Ô« Í« Æ« ¿« ¸« ±« ª« £« œ« •« Ž« ‡« €« y« r« k« d« ]« V« O« H« A« :« 3« ,« %« « « «  « « ûª ôª íª æª ߪ ت Ѫ ʪ ê ¼ª µª ®ª §ª  ª ™ª ’ª ‹ª „ª }ª vª oª hª aª Zª Sª Lª Eª >ª 7ª 0ª )ª "ª ª ª  ª ª ÿ© ø© ñ© ê© ã© Ü© Õ© Ω Ç© À© ¹© ²© «© ¤© © –© © ˆ© © z© s© l© e© ^© W© P© I© B© ;© 4© -© &© © © ©  © © ü¨ õ¨ î¨ ç¨ ਠÙ¨ Ò¨ ˨ Ĩ ½¨ ¶¨ ¯¨ ¨¨ ¡¨ š¨ “¨ Œ¨ …¨ ~¨ w¨ p¨ i¨ b¨ [¨ T¨ M¨ F¨ ?¨ 8¨ 1¨ *¨ #¨ ¨ ¨ ¨ ¨ ¨ ù§ ò§ ë§ ä§ ݧ Ö§ ϧ ȧ Á§ º§ ³§ ¬§ ¥§ ž§ —§ § ‰§ ‚§ {§ t§ m§ f§ _§ X§ Q§ J§ C§ <§ 5§ .§ '§  § § §  § § ý¦ ö¦ ï¦ è¦ ᦠÚ¦ Ó¦ ̦ Ŧ ¾¦ ·¦ °¦ ©¦ ¢¦ ›¦ ”¦ ¦ †¦ ¦ x¦ q¦ j¦ c¦ \¦ U¦ N¦ G¦ @¦ 9¦ 2¦ +¦ $¦ ¦ ¦ ¦ ¦ ¦ ú¥ ó¥ ì¥ å¥ Þ¥ ×¥ Ð¥ É¥ Â¥ »¥ ´¥ ­¥ ¦¥ Ÿ¥ ˜¥ ‘¥ Š¥ ƒ¥ |¥ u¥ n¥ g¥ `¥ Y¥ R¥ K¥ D¥ =¥ 6¥ /¥ (¥ !¥ ¥ ¥  ¥ ¥ þ¤ ÷¤ ð¤ é¤ ⤠Û¤ Ô¤ ͤ Ƥ ¿¤ ¸¤ ±¤ ª¤ £¤ œ¤ •¤ ޤ ‡¤ €¤ y¤ r¤ k¤ d¤ ]¤ V¤ O¤ H¤ A¤ :¤ 3¤ ,¤ %¤ ¤ ¤ ¤  ¤ ¤ û£ ô£ í£ æ£ ߣ Ø£ Ñ£ Ê£ ã ¼£ µ£ ®£ §£  £ ™£ ’£ ‹£ „£ }£ v£ o£ h£ a£ Z£ S£ L£ E£ >£ 7£ 0£ )£ "£ £ £  £ £ ÿ¢ ø¢ ñ¢ ê¢ 㢠Ü¢ Õ¢ ΢ Ç¢ À¢ ¹¢ ²¢ «¢ ¤¢ ¢ –¢ ¢ ˆ¢ ¢ z¢ s¢ l¢ e¢ ^¢ W¢ P¢ I¢ B¢ ;¢ 4¢ -¢ &¢ ¢ ¢ ¢  ¢ ¢ ü¡ õ¡ î¡ ç¡ à¡ Ù¡ Ò¡ Ë¡ Ä¡ ½¡ ¶¡ ¯¡ ¨¡ ¡¡ š¡ “¡ Œ¡ …¡ ~¡ w¡ p¡ i¡ b¡ [¡ T¡ M¡ F¡ ?¡ 8¡ 1¡ *¡ #¡ ¡ ¡ ¡ ¡ ¡ ù  ò  ë  ä  Ý  Ö  Ï  È  Á  º  ³  ¬  ¥  ž  —    ‰  ‚  {  t  m  f  _  X  Q  J  C  <  5  .  '              ýŸ öŸ ïŸ èŸ ០ÚŸ ÓŸ ÌŸ ÅŸ ¾Ÿ ·Ÿ °Ÿ ©Ÿ ¢Ÿ ›Ÿ ”Ÿ Ÿ †Ÿ Ÿ xŸ qŸ jŸ cŸ \Ÿ UŸ NŸ GŸ @Ÿ 9Ÿ 2Ÿ +Ÿ $Ÿ Ÿ Ÿ Ÿ Ÿ Ÿ úž óž ìž åž Þž מ О Éž ž »ž ´ž ­ž ¦ž Ÿž ˜ž ‘ž Šž ƒž |ž už nž gž `ž Yž Rž Kž Dž =ž 6ž /ž (ž !ž ž ž  ž ž þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûœ ôœ íœ æœ ßœ Øœ Ñœ Êœ Ü ¼œ µœ ®œ §œ  œ ™œ ’œ ‹œ „œ }œ vœ oœ hœ aœ Zœ Sœ Lœ Eœ >œ 7œ 0œ )œ "œ œ œ  œ œ ÿ› ø› ñ› ê› ã› Ü› Õ› Λ Ç› À› ¹› ²› «› ¤› › –› › ˆ› › z› s› l› e› ^› W› P› I› B› ;› 4› -› &› › › ›  › › üš õš îš çš àš Ùš Òš Ëš Äš ½š ¶š ¯š ¨š ¡š šš “š Œš …š ~š wš pš iš bš [š Tš Mš Fš ?š 8š 1š *š #š š š š š š ù™ ò™ ë™ ä™ Ý™ Ö™ Ï™ È™ Á™ º™ ³™ ¬™ ¥™ ž™ —™ ™ ‰™ ‚™ {™ t™ m™ f™ _™ X™ Q™ J™ C™ <™ 5™ .™ '™  ™ ™ ™  ™ ™ ý˜ ö˜ ï˜ è˜ ᘠÚ˜ Ó˜ ̘ Ř ¾˜ ·˜ °˜ ©˜ ¢˜ ›˜ ”˜ ˜ †˜ ˜ x˜ q˜ j˜ c˜ \˜ U˜ N˜ G˜ @˜ 9˜ 2˜ +˜ $˜ ˜ ˜ ˜ ˜ ˜ ú— ó— ì— å— Þ— ×— З É— — »— ´— ­— ¦— Ÿ— ˜— ‘— Š— ƒ— |— u— n— g— `— Y— R— K— D— =— 6— /— (— !— — —  — — þ– ÷– ð– é– â– Û– Ô– Í– Æ– ¿– ¸– ±– ª– £– œ– •– Ž– ‡– €– y– r– k– d– ]– V– O– H– A– :– 3– ,– %– – – –  – – û• ô• í• æ• ß• Ø• Ñ• Ê• Õ ¼• µ• ®• §•  • ™• ’• ‹• „• }• v• o• h• a• Z• S• L• E• >• 7• 0• )• "• • •  • • ÿ” ø” ñ” ê” ã” Ü” Õ” Δ Ç” À” ¹” ²” «” ¤” ” –” ” ˆ” ” z” s” l” e” ^” W” P” I” B” ;” 4” -” &” ” ” ”  ” ” ü“ õ“ î“ ç“ à“ Ù“ Ò“ Ë“ Ä“ ½“ ¶“ ¯“ ¨“ ¡“ š“ ““ Œ“ …“ ~“ w“ p“ i“ b“ [“ T“ M“ F“ ?“ 8“ 1“ *“ #“ “ “ “ “ “ ù’ ò’ ë’ ä’ Ý’ Ö’ Ï’ È’ Á’ º’ ³’ ¬’ ¥’ ž’ —’ ’ ‰’ ‚’ {’ t’ m’ f’ _’ X’ Q’ J’ C’ <’ 5’ .’ '’  ’ ’ ’  ’ ’ ý‘ ö‘ ï‘ è‘ á‘ Ú‘ Ó‘ Ì‘ Å‘ ¾‘ ·‘ °‘ ©‘ ¢‘ ›‘ ”‘ ‘ †‘ ‘ x‘ q‘ j‘ c‘ \‘ U‘ N‘ G‘ @‘ 9‘ 2‘ +‘ $‘ ‘ ‘ ‘ ‘ ‘ ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      ûŽ ôŽ íŽ æŽ ߎ ØŽ ÑŽ ÊŽ ÃŽ ¼Ž µŽ ®Ž §Ž  Ž ™Ž ’Ž ‹Ž „Ž }Ž vŽ oŽ hŽ aŽ ZŽ SŽ LŽ EŽ >Ž 7Ž 0Ž )Ž "Ž Ž Ž  Ž Ž ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &      üŒ õŒ îŒ çŒ àŒ ÙŒ ÒŒ ËŒ ÄŒ ½Œ ¶Œ ¯Œ ¨Œ ¡Œ šŒ “Œ ŒŒ …Œ ~Œ wŒ pŒ iŒ bŒ [Œ TŒ MŒ FŒ ?Œ 8Œ 1Œ *Œ #Œ Œ Œ Œ Œ Œ ù‹ ò‹ ë‹ ä‹ Ý‹ Ö‹ Ï‹ È‹ Á‹ º‹ ³‹ ¬‹ ¥‹ ž‹ —‹ ‹ ‰‹ ‚‹ {‹ t‹ m‹ f‹ _‹ X‹ Q‹ J‹ C‹ <‹ 5‹ .‹ '‹  ‹ ‹ ‹  ‹ ‹ ýŠ öŠ ïŠ èŠ አÚŠ ÓŠ ÌŠ ÅŠ ¾Š ·Š °Š ©Š ¢Š ›Š ”Š Š †Š Š xŠ qŠ jŠ cŠ \Š UŠ NŠ GŠ @Š 9Š 2Š +Š $Š Š Š Š Š Š ú‰ ó‰ ì‰ å‰ Þ‰ ׉ Љ ɉ ‰ »‰ ´‰ ­‰ ¦‰ Ÿ‰ ˜‰ ‘‰ Љ ƒ‰ |‰ u‰ n‰ g‰ `‰ Y‰ R‰ K‰ D‰ =‰ 6‰ /‰ (‰ !‰ ‰ ‰  ‰ ‰ þˆ ÷ˆ ðˆ éˆ ∠Ûˆ Ôˆ ͈ ƈ ¿ˆ ¸ˆ ±ˆ ªˆ £ˆ œˆ •ˆ Žˆ ‡ˆ €ˆ yˆ rˆ kˆ dˆ ]ˆ Vˆ Oˆ Hˆ Aˆ :ˆ 3ˆ ,ˆ %ˆ ˆ ˆ ˆ  ˆ ˆ û‡ ô‡ í‡ æ‡ ߇ ؇ ч ʇ Ç ¼‡ µ‡ ®‡ §‡  ‡ ™‡ ’‡ ‹‡ „‡ }‡ v‡ o‡ h‡ a‡ Z‡ S‡ L‡ E‡ >‡ 7‡ 0‡ )‡ "‡ ‡ ‡  ‡ ‡ ÿ† ø† ñ† ê† ㆠ܆ Õ† Ά dž À† ¹† ²† «† ¤† † –† † ˆ† † z† s† l† e† ^† W† P† I† B† ;† 4† -† &† † † †  † † ü… õ… î… ç… à… Ù… Ò… Ë… Ä… ½… ¶… ¯… ¨… ¡… š… “… Œ… …… ~… w… p… i… b… [… T… M… F… ?… 8… 1… *… #… … … … … … ù„ ò„ ë„ ä„ Ý„ Ö„ Ï„ È„ Á„ º„ ³„ ¬„ ¥„ ž„ —„ „ ‰„ ‚„ {„ t„ m„ f„ _„ X„ Q„ J„ C„ <„ 5„ .„ '„  „ „ „  „ „ ýƒ öƒ ïƒ èƒ რÚƒ Óƒ ̃ Ń ¾ƒ ·ƒ °ƒ ©ƒ ¢ƒ ›ƒ ”ƒ ƒ †ƒ ƒ xƒ qƒ jƒ cƒ \ƒ Uƒ Nƒ Gƒ @ƒ 9ƒ 2ƒ +ƒ $ƒ ƒ ƒ ƒ ƒ ƒ ú‚ ó‚ ì‚ å‚ Þ‚ ׂ Ђ É‚ ‚ »‚ ´‚ ­‚ ¦‚ Ÿ‚ ˜‚ ‘‚ Š‚ ƒ‚ |‚ u‚ n‚ g‚ `‚ Y‚ R‚ K‚ D‚ =‚ 6‚ /‚ (‚ !‚ ‚ ‚  ‚ ‚ þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û€ ô€ í€ æ€ ߀ Ø€ Ñ€ Ê€ À ¼€ µ€ ®€ §€  € ™€ ’€ ‹€ „€ }€ v€ o€ h€ a€ Z€ S€ L€ E€ >€ 7€ 0€ )€ "€ € €  € € ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü~ õ~ î~ ç~ à~ Ù~ Ò~ Ë~ Ä~ ½~ ¶~ ¯~ ¨~ ¡~ š~ “~ Œ~ …~ ~~ w~ p~ i~ b~ [~ T~ M~ F~ ?~ 8~ 1~ *~ #~ ~ ~ ~ ~ ~ ù} ò} ë} ä} Ý} Ö} Ï} È} Á} º} ³} ¬} ¥} ž} —} } ‰} ‚} {} t} m} f} _} X} Q} J} C} <} 5} .} '}  } } }  } } ý| ö| ï| è| á| Ú| Ó| Ì| Å| ¾| ·| °| ©| ¢| ›| ”| | †| | x| q| j| c| \| U| N| G| @| 9| 2| +| $| | | | | | ú{ ó{ ì{ å{ Þ{ ×{ Ð{ É{ Â{ »{ ´{ ­{ ¦{ Ÿ{ ˜{ ‘{ Š{ ƒ{ |{ u{ n{ g{ `{ Y{ R{ K{ D{ ={ 6{ /{ ({ !{ { {  { { þz ÷z ðz éz âz Ûz Ôz Íz Æz ¿z ¸z ±z ªz £z œz •z Žz ‡z €z yz rz kz dz ]z Vz Oz Hz Az :z 3z ,z %z z z z  z z ûy ôy íy æy ßy Øy Ñy Êy Ãy ¼y µy ®y §y  y ™y ’y ‹y „y }y vy oy hy ay Zy Sy Ly Ey >y 7y 0y )y "y y y  y y ÿx øx ñx êx ãx Üx Õx Îx Çx Àx ¹x ²x «x ¤x x –x x ˆx x zx sx lx ex ^x Wx Px Ix Bx ;x 4x -x &x x x x  x x üw õw îw çw àw Ùw Òw Ëw Äw ½w ¶w ¯w ¨w ¡w šw “w Œw …w ~w ww pw iw bw [w Tw Mw Fw ?w 8w 1w *w #w w w w w w ùv òv ëv äv Ýv Öv Ïv Èv Áv ºv ³v ¬v ¥v žv —v v ‰v ‚v {v tv mv fv _v Xv Qv Jv Cv r 7r 0r )r "r r r  r r ÿq øq ñq êq ãq Üq Õq Îq Çq Àq ¹q ²q «q ¤q q –q q ˆq q zq sq lq eq ^q Wq Pq Iq Bq ;q 4q -q &q q q q  q q üp õp îp çp àp Ùp Òp Ëp Äp ½p ¶p ¯p ¨p ¡p šp “p Œp …p ~p wp pp ip bp [p Tp Mp Fp ?p 8p 1p *p #p p p p p p ùo òo ëo äo Ýo Öo Ïo Èo Áo ºo ³o ¬o ¥o žo —o o ‰o ‚o {o to mo fo _o Xo Qo Jo Co k 7k 0k )k "k k k  k k ÿj øj ñj êj ãj Üj Õj Îj Çj Àj ¹j ²j «j ¤j j –j j ˆj j zj sj lj ej ^j Wj Pj Ij Bj ;j 4j -j &j j j j  j j üi õi îi çi ài Ùi Òi Ëi Äi ½i ¶i ¯i ¨i ¡i ši “i Œi …i ~i wi pi ii bi [i Ti Mi Fi ?i 8i 1i *i #i i i i i i ùh òh ëh äh Ýh Öh Ïh Èh Áh ºh ³h ¬h ¥h žh —h h ‰h ‚h {h th mh fh _h Xh Qh Jh Ch d 7d 0d )d "d d d  d d ÿc øc ñc êc ãc Üc Õc Îc Çc Àc ¹c ²c «c ¤c c –c c ˆc c zc sc lc ec ^c Wc Pc Ic Bc ;c 4c -c &c c c c  c c üb õb îb çb àb Ùb Òb Ëb Äb ½b ¶b ¯b ¨b ¡b šb “b Œb …b ~b wb pb ib bb [b Tb Mb Fb ?b 8b 1b *b #b b b b b b ùa òa ëa äa Ýa Öa Ïa Èa Áa ºa ³a ¬a ¥a ža —a a ‰a ‚a {a ta ma fa _a Xa Qa Ja Ca ] 7] 0] )] "] ] ]  ] ] ÿ\ ø\ ñ\ ê\ ã\ Ü\ Õ\ Î\ Ç\ À\ ¹\ ²\ «\ ¤\ \ –\ \ ˆ\ \ z\ s\ l\ e\ ^\ W\ P\ I\ B\ ;\ 4\ -\ &\ \ \ \  \ \ ü[ õ[ î[ ç[ à[ Ù[ Ò[ Ë[ Ä[ ½[ ¶[ ¯[ ¨[ ¡[ š[ “[ Œ[ …[ ~[ w[ p[ i[ b[ [[ T[ M[ F[ ?[ 8[ 1[ *[ #[ [ [ [ [ [ ùZ òZ ëZ äZ ÝZ ÖZ ÏZ ÈZ ÁZ ºZ ³Z ¬Z ¥Z žZ —Z Z ‰Z ‚Z {Z tZ mZ fZ _Z XZ QZ JZ CZ V 7V 0V )V "V V V  V V ÿU øU ñU êU ãU ÜU ÕU ÎU ÇU ÀU ¹U ²U «U ¤U U –U U ˆU U zU sU lU eU ^U WU PU IU BU ;U 4U -U &U U U U  U U üT õT îT çT àT ÙT ÒT ËT ÄT ½T ¶T ¯T ¨T ¡T šT “T ŒT …T ~T wT pT iT bT [T TT MT FT ?T 8T 1T *T #T T T T T T ùS òS ëS äS ÝS ÖS ÏS ÈS ÁS ºS ³S ¬S ¥S žS —S S ‰S ‚S {S tS mS fS _S XS QS JS CS O 7O 0O )O "O O O  O O ÿN øN ñN êN ãN ÜN ÕN ÎN ÇN ÀN ¹N ²N «N ¤N N –N N ˆN N zN sN lN eN ^N WN PN IN BN ;N 4N -N &N N N N  N N üM õM îM çM àM ÙM ÒM ËM ÄM ½M ¶M ¯M ¨M ¡M šM “M ŒM …M ~M wM pM iM bM [M TM MM FM ?M 8M 1M *M #M M M M M M ùL òL ëL äL ÝL ÖL ÏL ÈL ÁL ºL ³L ¬L ¥L žL —L L ‰L ‚L {L tL mL fL _L XL QL JL CL H 7H 0H )H "H H H  H H ÿG øG ñG êG ãG ÜG ÕG ÎG ÇG ÀG ¹G ²G «G ¤G G –G G ˆG G zG sG lG eG ^G WG PG IG BG ;G 4G -G &G G G G  G G üF õF îF çF àF ÙF ÒF ËF ÄF ½F ¶F ¯F ¨F ¡F šF “F ŒF …F ~F wF pF iF bF [F TF MF FF ?F 8F 1F *F #F F F F F F ùE òE ëE äE ÝE ÖE ÏE ÈE ÁE ºE ³E ¬E ¥E žE —E E ‰E ‚E {E tE mE fE _E XE QE JE CE A 7A 0A )A "A A A  A A ÿ@ ø@ ñ@ ê@ ã@ Ü@ Õ@ Î@ Ç@ À@ ¹@ ²@ «@ ¤@ @ –@ @ ˆ@ @ z@ s@ l@ e@ ^@ W@ P@ I@ B@ ;@ 4@ -@ &@ @ @ @  @ @ ü? õ? î? ç? à? Ù? Ò? Ë? Ä? ½? ¶? ¯? ¨? ¡? š? “? Œ? …? ~? w? p? i? b? [? T? M? F? ?? 8? 1? *? #? ? ? ? ? ? ù> ò> ë> ä> Ý> Ö> Ï> È> Á> º> ³> ¬> ¥> ž> —> > ‰> ‚> {> t> m> f> _> X> Q> J> C> <> 5> .> '>  > > >  > > ý= ö= ï= è= á= Ú= Ó= Ì= Å= ¾= ·= °= ©= ¢= ›= ”= = †= = x= q= j= c= \= U= N= G= @= 9= 2= += $= = = = = = ú< ó< ì< å< Þ< ×< Ð< É< Â< »< ´< ­< ¦< Ÿ< ˜< ‘< Š< ƒ< |< u< n< g< `< Y< R< K< D< =< 6< /< (< !< < <  < < þ; ÷; ð; é; â; Û; Ô; Í; Æ; ¿; ¸; ±; ª; £; œ; •; Ž; ‡; €; y; r; k; d; ]; V; O; H; A; :; 3; ,; %; ; ; ;  ; ; û: ô: í: æ: ß: Ø: Ñ: Ê: Ã: ¼: µ: ®: §:  : ™: ’: ‹: „: }: v: o: h: a: Z: S: L: E: >: 7: 0: ): ": : :  : : ÿ9 ø9 ñ9 ê9 ã9 Ü9 Õ9 Î9 Ç9 À9 ¹9 ²9 «9 ¤9 9 –9 9 ˆ9 9 z9 s9 l9 e9 ^9 W9 P9 I9 B9 ;9 49 -9 &9 9 9 9  9 9 ü8 õ8 î8 ç8 à8 Ù8 Ò8 Ë8 Ä8 ½8 ¶8 ¯8 ¨8 ¡8 š8 “8 Œ8 …8 ~8 w8 p8 i8 b8 [8 T8 M8 F8 ?8 88 18 *8 #8 8 8 8 8 8 ù7 ò7 ë7 ä7 Ý7 Ö7 Ï7 È7 Á7 º7 ³7 ¬7 ¥7 ž7 —7 7 ‰7 ‚7 {7 t7 m7 f7 _7 X7 Q7 J7 C7 <7 57 .7 '7  7 7 7  7 7 ý6 ö6 ï6 è6 á6 Ú6 Ó6 Ì6 Å6 ¾6 ·6 °6 ©6 ¢6 ›6 ”6 6 †6 6 x6 q6 j6 c6 \6 U6 N6 G6 @6 96 26 +6 $6 6 6 6 6 6 ú5 ó5 ì5 å5 Þ5 ×5 Ð5 É5 Â5 »5 ´5 ­5 ¦5 Ÿ5 ˜5 ‘5 Š5 ƒ5 |5 u5 n5 g5 `5 Y5 R5 K5 D5 =5 65 /5 (5 !5 5 5  5 5 þ4 ÷4 ð4 é4 â4 Û4 Ô4 Í4 Æ4 ¿4 ¸4 ±4 ª4 £4 œ4 •4 Ž4 ‡4 €4 y4 r4 k4 d4 ]4 V4 O4 H4 A4 :4 34 ,4 %4 4 4 4  4 4 û3 ô3 í3 æ3 ß3 Ø3 Ñ3 Ê3 Ã3 ¼3 µ3 ®3 §3  3 ™3 ’3 ‹3 „3 }3 v3 o3 h3 a3 Z3 S3 L3 E3 >3 73 03 )3 "3 3 3  3 3 ÿ2 ø2 ñ2 ê2 ã2 Ü2 Õ2 Î2 Ç2 À2 ¹2 ²2 «2 ¤2 2 –2 2 ˆ2 2 z2 s2 l2 e2 ^2 W2 P2 I2 B2 ;2 42 -2 &2 2 2 2  2 2 ü1 õ1 î1 ç1 à1 Ù1 Ò1 Ë1 Ä1 ½1 ¶1 ¯1 ¨1 ¡1 š1 “1 Œ1 …1 ~1 w1 p1 i1 b1 [1 T1 M1 F1 ?1 81 11 *1 #1 1 1 1 1 1 ù0 ò0 ë0 ä0 Ý0 Ö0 Ï0 È0 Á0 º0 ³0 ¬0 ¥0 ž0 —0 0 ‰0 ‚0 {0 t0 m0 f0 _0 X0 Q0 J0 C0 <0 50 .0 '0  0 0 0  0 0 ý/ ö/ ï/ è/ á/ Ú/ Ó/ Ì/ Å/ ¾/ ·/ °/ ©/ ¢/ ›/ ”/ / †/ / x/ q/ j/ c/ \/ U/ N/ G/ @/ 9/ 2/ +/ $/ / / / / / ú. ó. ì. å. Þ. ×. Ð. É. Â. ». ´. ­. ¦. Ÿ. ˜. ‘. Š. ƒ. |. u. n. g. `. Y. R. K. D. =. 6. /. (. !. . .  . . þ- ÷- ð- é- â- Û- Ô- Í- Æ- ¿- ¸- ±- ª- £- œ- •- Ž- ‡- €- y- r- k- d- ]- V- O- H- A- :- 3- ,- %- - - -  - - û, ô, í, æ, ß, Ø, Ñ, Ê, Ã, ¼, µ, ®, §,  , ™, ’, ‹, „, }, v, o, h, a, Z, S, L, E, >, 7, 0, ), ", , ,  , , ÿ+ ø+ ñ+ ê+ ã+ Ü+ Õ+ Î+ Ç+ À+ ¹+ ²+ «+ ¤+ + –+ + ˆ+ + z+ s+ l+ e+ ^+ W+ P+ I+ B+ ;+ 4+ -+ &+ + + +  + + ü* õ* î* ç* à* Ù* Ò* Ë* Ä* ½* ¶* ¯* ¨* ¡* š* “* Œ* …* ~* w* p* i* b* [* T* M* F* ?* 8* 1* ** #* * * * * * ù) ò) ë) ä) Ý) Ö) Ï) È) Á) º) ³) ¬) ¥) ž) —) ) ‰) ‚) {) t) m) f) _) X) Q) J) C) <) 5) .) ')  ) ) )  ) ) ý( ö( ï( è( á( Ú( Ó( Ì( Å( ¾( ·( °( ©( ¢( ›( ”( ( †( ( x( q( j( c( \( U( N( G( @( 9( 2( +( $( ( ( ( ( ( ú' ó' ì' å' Þ' ×' Ð' É' Â' »' ´' ­' ¦' Ÿ' ˜' ‘' Š' ƒ' |' u' n' g' `' Y' R' K' D' =' 6' /' (' !' ' '  ' ' þ& ÷& ð& é& â& Û& Ô& Í& Æ& ¿& ¸& ±& ª& £& œ& •& Ž& ‡& €& y& r& k& d& ]& V& O& H& A& :& 3& ,& %& & & &  & & û% ô% í% æ% ß% Ø% Ñ% Ê% Ã% ¼% µ% ®% §%  % ™% ’% ‹% „% }% v% o% h% a% Z% S% L% E% >% 7% 0% )% "% % %  % % ÿ$ ø$ ñ$ ê$ ã$ Ü$ Õ$ Î$ Ç$ À$ ¹$ ²$ «$ ¤$ $ –$ $ ˆ$ $ z$ s$ l$ e$ ^$ W$ P$ I$ B$ ;$ 4$ -$ &$ $ $ $  $ $ ü# õ# î# ç# à# Ù# Ò# Ë# Ä# ½# ¶# ¯# ¨# ¡# š# “# Œ# …# ~# w# p# i# b# [# T# M# F# ?# 8# 1# *# ## # # # # # ù" ò" ë" ä" Ý" Ö" Ï" È" Á" º" ³" ¬" ¥" ž" —" " ‰" ‚" {" t" m" f" _" X" Q" J" C" <" 5" ." '"  " " "  " " ý! ö! ï! è! á! Ú! Ó! Ì! Å! ¾! ·! °! ©! ¢! ›! ”! ! †! ! x! q! j! c! \! U! N! G! @! 9! 2! +! $! ! ! ! ! ! ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %      û ô í æ ß Ø Ñ Ê à ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "     ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '        ý ö ï è á Ú Ó Ì Å ¾ · ° © ¢ › ”  †  x q j c \ U N G @ 9 2 + $      ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ ÷ ð é â Û Ô Í Æ ¿ ¸ ± ª £ œ • Ž ‡ € y r k d ] V O H A : 3 , %       û ô í æ ß Ø Ñ Ê Ã ¼ µ ® §   ™ ’ ‹ „ } v o h a Z S L E > 7 0 ) "      ÿ ø ñ ê ã Ü Õ Î Ç À ¹ ² « ¤  –  ˆ  z s l e ^ W P I B ; 4 - &       ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ùÿ òÿ ëÿ äÿ Ýÿ Öÿ Ïÿ Èÿ Áÿ ºÿ ³ÿ ¬ÿ ¥ÿ žÿ —ÿ ÿ ‰ÿ ‚ÿ {ÿ tÿ mÿ fÿ _ÿ Xÿ Qÿ Jÿ Cÿ <ÿ 5ÿ .ÿ 'ÿ  ÿ ÿ ÿ  ÿ ÿ ýþ öþ ïþ èþ áþ Úþ Óþ Ìþ Åþ ¾þ ·þ °þ ©þ ¢þ ›þ ”þ þ †þ þ xþ qþ jþ cþ \þ Uþ Nþ Gþ @þ 9þ 2þ +þ $þ þ þ þ þ þ úý óý ìý åý Þý ×ý Ðý Éý Âý »ý ´ý ­ý ¦ý Ÿý ˜ý ‘ý Šý ƒý |ý uý ný gý `ý Yý Rý Ký Dý =ý 6ý /ý (ý !ý ý ý  ý ý þü ÷ü ðü éü âü Ûü Ôü Íü Æü ¿ü ¸ü ±ü ªü £ü œü •ü Žü ‡ü €ü yü rü kü dü ]ü Vü Oü Hü Aü :ü 3ü ,ü %ü ü ü ü  ü ü ûû ôû íû æû ßû Øû Ñû Êû Ãû ¼û µû ®û §û  û ™û ’û ‹û „û }û vû oû hû aû Zû Sû Lû Eû >û 7û 0û )û "û û û  û û ÿú øú ñú êú ãú Üú Õú Îú Çú Àú ¹ú ²ú «ú ¤ú ú –ú ú ˆú ú zú sú lú eú ^ú Wú Pú Iú Bú ;ú 4ú -ú &ú ú ú ú  ú ú üù õù îù çù àù Ùù Òù Ëù Äù ½ù ¶ù ¯ù ¨ù ¡ù šù “ù Œù …ù ~ù wù pù iù bù [ù Tù Mù Fù ?ù 8ù 1ù *ù #ù ù ù ù ù ù ùø òø ëø äø Ýø Öø Ïø Èø Áø ºø ³ø ¬ø ¥ø žø —ø ø ‰ø ‚ø {ø tø mø fø _ø Xø Qø Jø Cø <ø 5ø .ø 'ø  ø ø ø  ø ø ý÷ ö÷ ï÷ è÷ á÷ Ú÷ Ó÷ Ì÷ Å÷ ¾÷ ·÷ °÷ ©÷ ¢÷ ›÷ ”÷ ÷ †÷ ÷ x÷ q÷ j÷ c÷ \÷ U÷ N÷ G÷ @÷ 9÷ 2÷ +÷ $÷ ÷ ÷ ÷ ÷ ÷ úö óö ìö åö Þö ×ö Ðö Éö Âö »ö ´ö ­ö ¦ö Ÿö ˜ö ‘ö Šö ƒö |ö uö nö gö `ö Yö Rö Kö Dö =ö 6ö /ö (ö !ö ö ö  ö ö þõ ÷õ ðõ éõ âõ Ûõ Ôõ Íõ Æõ ¿õ ¸õ ±õ ªõ £õ œõ •õ Žõ ‡õ €õ yõ rõ kõ dõ ]õ Võ Oõ Hõ Aõ :õ 3õ ,õ %õ õ õ õ  õ õ ûô ôô íô æô ßô Øô Ñô Êô Ãô ¼ô µô ®ô §ô  ô ™ô ’ô ‹ô „ô }ô vô oô hô aô Zô Sô Lô Eô >ô 7ô 0ô )ô "ô ô ô  ô ô ÿó øó ñó êó ãó Üó Õó Îó Çó Àó ¹ó ²ó «ó ¤ó ó –ó ó ˆó ó zó só ló eó ^ó Wó Pó Ió Bó ;ó 4ó -ó &ó ó ó ó  ó ó üò õò îò çò àò Ùò Òò Ëò Äò ½ò ¶ò ¯ò ¨ò ¡ò šò “ò Œò …ò ~ò wò pò iò bò [ò Tò Mò Fò ?ò 8ò 1ò *ò #ò ò ò ò ò ò ùñ òñ ëñ äñ Ýñ Öñ Ïñ Èñ Áñ ºñ ³ñ ¬ñ ¥ñ žñ —ñ ñ ‰ñ ‚ñ {ñ tñ mñ fñ _ñ Xñ Qñ Jñ Cñ <ñ 5ñ .ñ 'ñ  ñ ñ ñ  ñ ñ ýð öð ïð èð áð Úð Óð Ìð Åð ¾ð ·ð °ð ©ð ¢ð ›ð ”ð ð †ð ð xð qð jð cð \ð Uð Nð Gð @ð 9ð 2ð +ð $ð ð ð ð ð ð úï óï ìï åï Þï ×ï Ðï Éï Âï »ï ´ï ­ï ¦ï Ÿï ˜ï ‘ï Šï ƒï |ï uï nï gï `ï Yï Rï Kï Dï =ï 6ï /ï (ï !ï ï ï  ï ï þî ÷î ðî éî âî Ûî Ôî Íî Æî ¿î ¸î ±î ªî £î œî •î Žî ‡î €î yî rî kî dî ]î Vî Oî Hî Aî :î 3î ,î %î î î î  î î ûí ôí íí æí ßí Øí Ñí Êí Ãí ¼í µí ®í §í  í ™í ’í ‹í „í }í ví oí hí aí Zí Sí Lí Eí >í 7í 0í )í "í í í  í í ÿì øì ñì êì ãì Üì Õì Îì Çì Àì ¹ì ²ì «ì ¤ì ì –ì ì ˆì ì zì sì lì eì ^ì Wì Pì Iì Bì ;ì 4ì -ì &ì ì ì ì  ì ì üë õë îë çë àë Ùë Òë Ëë Äë ½ë ¶ë ¯ë ¨ë ¡ë šë “ë Œë …ë ~ë wë pë ië bë [ë Të Më Fë ?ë 8ë 1ë *ë #ë ë ë ë ë ë ùê òê ëê äê Ýê Öê Ïê Èê Áê ºê ³ê ¬ê ¥ê žê —ê ê ‰ê ‚ê {ê tê mê fê _ê Xê Qê Jê Cê <ê 5ê .ê 'ê  ê ê ê  ê ê ýé öé ïé èé áé Úé Óé Ìé Åé ¾é ·é °é ©é ¢é ›é ”é é †é é xé qé jé cé \é Ué Né Gé @é 9é 2é +é $é é é é é é úè óè ìè åè Þè ×è Ðè Éè Âè »è ´è ­è ¦è Ÿè ˜è ‘è Šè ƒè |è uè nè gè `è Yè Rè Kè Dè =è 6è /è (è !è è è  è è þç ÷ç ðç éç âç Ûç Ôç Íç Æç ¿ç ¸ç ±ç ªç £ç œç •ç Žç ‡ç €ç yç rç kç dç ]ç Vç Oç Hç Aç :ç 3ç ,ç %ç ç ç ç  ç ç ûæ ôæ íæ ææ ßæ Øæ Ñæ Êæ Ãæ ¼æ µæ ®æ §æ  æ ™æ ’æ ‹æ „æ }æ væ oæ hæ aæ Zæ Sæ Læ Eæ >æ 7æ 0æ )æ "æ æ æ  æ æ ÿå øå ñå êå ãå Üå Õå Îå Çå Àå ¹å ²å «å ¤å å –å å ˆå å zå så lå eå ^å Wå På Iå Bå ;å 4å -å &å å å å  å å üä õä îä çä àä Ùä Òä Ëä Ää ½ä ¶ä ¯ä ¨ä ¡ä šä “ä Œä …ä ~ä wä pä iä bä [ä Tä Mä Fä ?ä 8ä 1ä *ä #ä ä ä ä ä ä ùã òã ëã äã Ýã Öã Ïã Èã Á㠺㠳㠬㠥㠞㠗ã 㠉㠂ã {ã tã mã fã _ã Xã Qã Jã Cã <ã 5ã .ã 'ã  ã ã ã  ã ã ýâ öâ ïâ èâ áâ Úâ Óâ Ìâ Å⠾⠷⠰⠩⠢⠛⠔â â †â â xâ qâ jâ câ \â Uâ Nâ Gâ @â 9â 2â +â $â â â â â â úá óá ìá åá Þá ×á Ðá Éá Âá »á ´á ­á ¦á Ÿá ˜á ‘á Šá ƒá |á uá ná gá `á Yá Rá Ká Dá =á 6á /á (á !á á á  á á þà ÷à ðà éà âà Ûà Ôà Íà Æà ¿à ¸à ±à ªà £à œà •à Žà ‡à €à yà rà kà dà ]à Và Oà Hà Aà :à 3à ,à %à à à à  à à ûß ôß íß æß ßß Øß Ñß Êß Ãß ¼ß µß ®ß §ß  ß ™ß ’ß ‹ß „ß }ß vß oß hß aß Zß Sß Lß Eß >ß 7ß 0ß )ß "ß ß ß  ß ß ÿÞ øÞ ñÞ êÞ ãÞ ÜÞ ÕÞ ÎÞ ÇÞ ÀÞ ¹Þ ²Þ «Þ ¤Þ Þ –Þ Þ ˆÞ Þ zÞ sÞ lÞ eÞ ^Þ WÞ PÞ IÞ BÞ ;Þ 4Þ -Þ &Þ Þ Þ Þ  Þ Þ üÝ õÝ îÝ çÝ àÝ ÙÝ ÒÝ ËÝ ÄÝ ½Ý ¶Ý ¯Ý ¨Ý ¡Ý šÝ “Ý ŒÝ …Ý ~Ý wÝ pÝ iÝ bÝ [Ý TÝ MÝ FÝ ?Ý 8Ý 1Ý *Ý #Ý Ý Ý Ý Ý Ý ùÜ òÜ ëÜ äÜ ÝÜ ÖÜ ÏÜ ÈÜ ÁÜ ºÜ ³Ü ¬Ü ¥Ü žÜ —Ü Ü ‰Ü ‚Ü {Ü tÜ mÜ fÜ _Ü XÜ QÜ JÜ CÜ <Ü 5Ü .Ü 'Ü  Ü Ü Ü  Ü Ü ýÛ öÛ ïÛ èÛ áÛ ÚÛ ÓÛ ÌÛ ÅÛ ¾Û ·Û °Û ©Û ¢Û ›Û ”Û Û †Û Û xÛ qÛ jÛ cÛ \Û UÛ NÛ GÛ @Û 9Û 2Û +Û $Û Û Û Û Û Û úÚ óÚ ìÚ åÚ ÞÚ ×Ú ÐÚ ÉÚ ÂÚ »Ú ´Ú ­Ú ¦Ú ŸÚ ˜Ú ‘Ú ŠÚ ƒÚ |Ú uÚ nÚ gÚ `Ú YÚ RÚ KÚ DÚ =Ú 6Ú /Ú (Ú !Ú Ú Ú  Ú Ú þÙ ÷Ù ðÙ éÙ âÙ ÛÙ ÔÙ ÍÙ ÆÙ ¿Ù ¸Ù ±Ù ªÙ £Ù œÙ •Ù ŽÙ ‡Ù €Ù yÙ rÙ kÙ dÙ ]Ù VÙ OÙ HÙ AÙ :Ù 3Ù ,Ù %Ù Ù Ù Ù  Ù Ù ûØ ôØ íØ æØ ߨ ØØ ÑØ ÊØ ÃØ ¼Ø µØ ®Ø §Ø  Ø ™Ø ’Ø ‹Ø „Ø }Ø vØ oØ hØ aØ ZØ SØ LØ EØ >Ø 7Ø 0Ø )Ø "Ø Ø Ø  Ø Ø ÿ× ø× ñ× ê× ã× Ü× Õ× Î× Ç× À× ¹× ²× «× ¤× × –× × ˆ× × z× s× l× e× ^× W× P× I× B× ;× 4× -× &× × × ×  × × üÖ õÖ îÖ çÖ àÖ ÙÖ ÒÖ ËÖ ÄÖ ½Ö ¶Ö ¯Ö ¨Ö ¡Ö šÖ “Ö ŒÖ …Ö ~Ö wÖ pÖ iÖ bÖ [Ö TÖ MÖ FÖ ?Ö 8Ö 1Ö *Ö #Ö Ö Ö Ö Ö Ö ùÕ òÕ ëÕ äÕ ÝÕ ÖÕ ÏÕ ÈÕ ÁÕ ºÕ ³Õ ¬Õ ¥Õ žÕ —Õ Õ ‰Õ ‚Õ {Õ tÕ mÕ fÕ _Õ XÕ QÕ JÕ CÕ <Õ 5Õ .Õ 'Õ  Õ Õ Õ  Õ Õ ýÔ öÔ ïÔ èÔ áÔ ÚÔ ÓÔ ÌÔ ÅÔ ¾Ô ·Ô °Ô ©Ô ¢Ô ›Ô ”Ô Ô †Ô Ô xÔ qÔ jÔ cÔ \Ô UÔ NÔ GÔ @Ô 9Ô 2Ô +Ô $Ô Ô Ô Ô Ô Ô úÓ óÓ ìÓ åÓ ÞÓ ×Ó ÐÓ ÉÓ ÂÓ »Ó ´Ó ­Ó ¦Ó ŸÓ ˜Ó ‘Ó ŠÓ ƒÓ |Ó uÓ nÓ gÓ `Ó YÓ RÓ KÓ DÓ =Ó 6Ó /Ó (Ó !Ó Ó Ó  Ó Ó þÒ ÷Ò ðÒ éÒ âÒ ÛÒ ÔÒ ÍÒ ÆÒ ¿Ò ¸Ò ±Ò ªÒ £Ò œÒ •Ò ŽÒ ‡Ò €Ò yÒ rÒ kÒ dÒ ]Ò VÒ OÒ HÒ AÒ :Ò 3Ò ,Ò %Ò Ò Ò Ò  Ò Ò ûÑ ôÑ íÑ æÑ ßÑ ØÑ ÑÑ ÊÑ ÃÑ ¼Ñ µÑ ®Ñ §Ñ  Ñ ™Ñ ’Ñ ‹Ñ „Ñ }Ñ vÑ oÑ hÑ aÑ ZÑ SÑ LÑ EÑ >Ñ 7Ñ 0Ñ )Ñ "Ñ Ñ Ñ  Ñ Ñ ÿÐ øÐ ñÐ êÐ ãÐ ÜÐ ÕÐ ÎÐ ÇÐ ÀÐ ¹Ð ²Ð «Ð ¤Ð Ð –Ð Ð ˆÐ Ð zÐ sÐ lÐ eÐ ^Ð WÐ PÐ IÐ BÐ ;Ð 4Ð -Ð &Ð Ð Ð Ð  Ð Ð üÏ õÏ îÏ çÏ àÏ ÙÏ ÒÏ ËÏ ÄÏ ½Ï ¶Ï ¯Ï ¨Ï ¡Ï šÏ “Ï ŒÏ …Ï ~Ï wÏ pÏ iÏ bÏ [Ï TÏ MÏ FÏ ?Ï 8Ï 1Ï *Ï #Ï Ï Ï Ï Ï Ï ùÎ òÎ ëÎ äÎ ÝÎ ÖÎ ÏÎ ÈÎ ÁÎ ºÎ ³Î ¬Î ¥Î žÎ —Î Î ‰Î ‚Î {Î tÎ mÎ fÎ _Î XÎ QÎ JÎ CÎ <Î 5Î .Î 'Î  Î Î Î  Î Î ýÍ öÍ ïÍ èÍ áÍ ÚÍ ÓÍ ÌÍ ÅÍ ¾Í ·Í °Í ©Í ¢Í ›Í ”Í Í †Í Í xÍ qÍ jÍ cÍ \Í UÍ NÍ GÍ @Í 9Í 2Í +Í $Í Í Í Í Í Í úÌ óÌ ìÌ åÌ ÞÌ ×Ì ÐÌ ÉÌ ÂÌ »Ì ´Ì ­Ì ¦Ì ŸÌ ˜Ì ‘Ì ŠÌ ƒÌ |Ì uÌ nÌ gÌ `Ì YÌ RÌ KÌ DÌ =Ì 6Ì /Ì (Ì !Ì Ì Ì  Ì Ì þË ÷Ë ðË éË âË ÛË ÔË ÍË ÆË ¿Ë ¸Ë ±Ë ªË £Ë œË •Ë ŽË ‡Ë €Ë yË rË kË dË ]Ë VË OË HË AË :Ë 3Ë ,Ë %Ë Ë Ë Ë  Ë Ë ûÊ ôÊ íÊ æÊ ßÊ ØÊ ÑÊ ÊÊ ÃÊ ¼Ê µÊ ®Ê §Ê  Ê ™Ê ’Ê ‹Ê „Ê }Ê vÊ oÊ hÊ aÊ ZÊ SÊ LÊ EÊ >Ê 7Ê 0Ê )Ê "Ê Ê Ê  Ê Ê ÿÉ øÉ ñÉ êÉ ãÉ ÜÉ ÕÉ ÎÉ ÇÉ ÀÉ ¹É ²É «É ¤É É –É É ˆÉ É zÉ sÉ lÉ eÉ ^É WÉ PÉ IÉ BÉ ;É 4É -É &É É É É  É É üÈ õÈ îÈ çÈ àÈ ÙÈ ÒÈ ËÈ ÄÈ ½È ¶È ¯È ¨È ¡È šÈ “È ŒÈ …È ~È wÈ pÈ iÈ bÈ [È TÈ MÈ FÈ ?È 8È 1È *È #È È È È È È ùÇ òÇ ëÇ äÇ ÝÇ ÖÇ ÏÇ ÈÇ ÁÇ ºÇ ³Ç ¬Ç ¥Ç žÇ —Ç Ç ‰Ç ‚Ç {Ç tÇ mÇ fÇ _Ç XÇ QÇ JÇ CÇ <Ç 5Ç .Ç 'Ç  Ç Ç Ç  Ç Ç ýÆ öÆ ïÆ èÆ áÆ ÚÆ ÓÆ ÌÆ ÅÆ ¾Æ ·Æ °Æ ©Æ ¢Æ ›Æ ”Æ Æ †Æ Æ xÆ qÆ jÆ cÆ \Æ UÆ NÆ GÆ @Æ 9Æ 2Æ +Æ $Æ Æ Æ Æ Æ Æ úÅ óÅ ìÅ åÅ ÞÅ ×Å ÐÅ ÉÅ ÂÅ »Å ´Å ­Å ¦Å ŸÅ ˜Å ‘Å ŠÅ ƒÅ |Å uÅ nÅ gÅ `Å YÅ RÅ KÅ DÅ =Å 6Å /Å (Å !Å Å Å  Å Å þÄ ÷Ä ðÄ éÄ âÄ ÛÄ ÔÄ ÍÄ ÆÄ ¿Ä ¸Ä ±Ä ªÄ £Ä œÄ •Ä ŽÄ ‡Ä €Ä yÄ rÄ kÄ dÄ ]Ä VÄ OÄ HÄ AÄ :Ä 3Ä ,Ä %Ä Ä Ä Ä  Ä Ä ûà ôà íà æÃ ßà ØÃ Ñà Êà Ãà ¼Ã µÃ ®Ã §Ã  Ã ™Ã ’à ‹Ã „à }à và oà hà aà Zà Sà Là Eà >à 7à 0à )à "à à à  à à ÿ øÂ ñ ê ã Ü Õ ΠÇ À ¹Â ²Â «Â ¤Â  –  ˆÂ  z s l e ^ W P I B ; 4 - &       üÁ õÁ îÁ çÁ àÁ ÙÁ ÒÁ ËÁ ÄÁ ½Á ¶Á ¯Á ¨Á ¡Á šÁ “Á ŒÁ …Á ~Á wÁ pÁ iÁ bÁ [Á TÁ MÁ FÁ ?Á 8Á 1Á *Á #Á Á Á Á Á Á ùÀ òÀ ëÀ äÀ ÝÀ ÖÀ ÏÀ ÈÀ ÁÀ ºÀ ³À ¬À ¥À žÀ —À À ‰À ‚À {À tÀ mÀ fÀ _À XÀ QÀ JÀ CÀ <À 5À .À 'À  À À À  À À ý¿ ö¿ ï¿ è¿ á¿ Ú¿ Ó¿ Ì¿ Å¿ ¾¿ ·¿ °¿ ©¿ ¢¿ ›¿ ”¿ ¿ †¿ ¿ x¿ q¿ j¿ c¿ \¿ U¿ N¿ G¿ @¿ 9¿ 2¿ +¿ $¿ ¿ ¿ ¿ ¿ ¿ ú¾ ó¾ ì¾ å¾ Þ¾ ×¾ о ɾ ¾ »¾ ´¾ ­¾ ¦¾ Ÿ¾ ˜¾ ‘¾ о ƒ¾ |¾ u¾ n¾ g¾ `¾ Y¾ R¾ K¾ D¾ =¾ 6¾ /¾ (¾ !¾ ¾ ¾  ¾ ¾ þ½ ÷½ ð½ é½ â½ Û½ Ô½ ͽ ƽ ¿½ ¸½ ±½ ª½ £½ œ½ •½ ޽ ‡½ €½ y½ r½ k½ d½ ]½ V½ O½ H½ A½ :½ 3½ ,½ %½ ½ ½ ½  ½ ½ û¼ ô¼ í¼ æ¼ ß¼ ؼ Ѽ ʼ ü ¼¼ µ¼ ®¼ §¼  ¼ ™¼ ’¼ ‹¼ „¼ }¼ v¼ o¼ h¼ a¼ Z¼ S¼ L¼ E¼ >¼ 7¼ 0¼ )¼ "¼ ¼ ¼  ¼ ¼ ÿ» ø» ñ» ê» ã» Ü» Õ» λ Ç» À» ¹» ²» «» ¤» » –» » ˆ» » z» s» l» e» ^» W» P» I» B» ;» 4» -» &» » » »  » » üº õº îº çº ຠÙº Òº ˺ ĺ ½º ¶º ¯º ¨º ¡º šº “º Œº …º ~º wº pº iº bº [º Tº Mº Fº ?º 8º 1º *º #º º º º º º ù¹ ò¹ ë¹ ä¹ ݹ Ö¹ Ϲ ȹ Á¹ º¹ ³¹ ¬¹ ¥¹ ž¹ —¹ ¹ ‰¹ ‚¹ {¹ t¹ m¹ f¹ _¹ X¹ Q¹ J¹ C¹ <¹ 5¹ .¹ '¹  ¹ ¹ ¹  ¹ ¹ ý¸ ö¸ ï¸ è¸ ḠÚ¸ Ó¸ ̸ Ÿ ¾¸ ·¸ °¸ ©¸ ¢¸ ›¸ ”¸ ¸ †¸ ¸ x¸ q¸ j¸ c¸ \¸ U¸ N¸ G¸ @¸ 9¸ 2¸ +¸ $¸ ¸ ¸ ¸ ¸ ¸ ú· ó· ì· å· Þ· ×· з É· · »· ´· ­· ¦· Ÿ· ˜· ‘· Š· ƒ· |· u· n· g· `· Y· R· K· D· =· 6· /· (· !· · ·  · · þ¶ ÷¶ ð¶ é¶ â¶ Û¶ Ô¶ Ͷ ƶ ¿¶ ¸¶ ±¶ ª¶ £¶ œ¶ •¶ ޶ ‡¶ €¶ y¶ r¶ k¶ d¶ ]¶ V¶ O¶ H¶ A¶ :¶ 3¶ ,¶ %¶ ¶ ¶ ¶  ¶ ¶ ûµ ôµ íµ æµ ßµ ص ѵ ʵ õ ¼µ µµ ®µ §µ  µ ™µ ’µ ‹µ „µ }µ vµ oµ hµ aµ Zµ Sµ Lµ Eµ >µ 7µ 0µ )µ "µ µ µ  µ µ ÿ´ ø´ ñ´ ê´ ã´ Ü´ Õ´ δ Ç´ À´ ¹´ ²´ «´ ¤´ ´ –´ ´ ˆ´ ´ z´ s´ l´ e´ ^´ W´ P´ I´ B´ ;´ 4´ -´ &´ ´ ´ ´  ´ ´ ü³ õ³ î³ ç³ à³ Ù³ Ò³ ˳ ij ½³ ¶³ ¯³ ¨³ ¡³ š³ “³ Œ³ …³ ~³ w³ p³ i³ b³ [³ T³ M³ F³ ?³ 8³ 1³ *³ #³ ³ ³ ³ ³ ³ ù² ò² ë² ä² ݲ Ö² ϲ Ȳ Á² º² ³² ¬² ¥² ž² —² ² ‰² ‚² {² t² m² f² _² X² Q² J² C² <² 5² .² '²  ² ² ²  ² ² ý± ö± ï± è± á± Ú± Ó± ̱ ű ¾± ·± °± ©± ¢± ›± ”± ± †± ± x± q± j± c± \± U± N± G± @± 9± 2± +± $± ± ± ± ± ± ú° ó° ì° å° Þ° ×° а ɰ ° »° ´° ­° ¦° Ÿ° ˜° ‘° а ƒ° |° u° n° g° `° Y° R° K° D° =° 6° /° (° !° ° °  ° ° þ¯ ÷¯ ð¯ é¯ ⯠Û¯ Ô¯ ͯ Ư ¿¯ ¸¯ ±¯ ª¯ £¯ œ¯ •¯ ޝ ‡¯ €¯ y¯ r¯ k¯ d¯ ]¯ V¯ O¯ H¯ A¯ :¯ 3¯ ,¯ %¯ ¯ ¯ ¯  ¯ ¯ û® ô® í® æ® ß® Ø® Ñ® Ê® î ¼® µ® ®® §®  ® ™® ’® ‹® „® }® v® o® h® a® Z® S® L® E® >® 7® 0® )® "® ® ®  ® ® ÿ­ ø­ ñ­ ê­ ã­ Ü­ Õ­ έ Ç­ À­ ¹­ ²­ «­ ¤­ ­ –­ ­ ˆ­ ­ z­ s­ l­ e­ ^­ W­ P­ I­ B­ ;­ 4­ -­ &­ ­ ­ ­  ­ ­ ü¬ õ¬ î¬ ç¬ ଠÙ¬ Ò¬ ˬ Ĭ ½¬ ¶¬ ¯¬ ¨¬ ¡¬ 𬠓¬ Œ¬ …¬ ~¬ w¬ p¬ i¬ b¬ [¬ T¬ M¬ F¬ ?¬ 8¬ 1¬ *¬ #¬ ¬ ¬ ¬ ¬ ¬ ù« ò« ë« ä« Ý« Ö« Ï« È« Á« º« ³« ¬« ¥« ž« —« « ‰« ‚« {« t« m« f« _« X« Q« J« C« <« 5« .« '«  « « «  « « ýª öª ïª èª ᪠Úª Óª ̪ Ū ¾ª ·ª °ª ©ª ¢ª ›ª ”ª ª †ª ª xª qª jª cª \ª Uª Nª Gª @ª 9ª 2ª +ª $ª ª ª ª ª ª ú© ó© ì© å© Þ© ש Щ É© © »© ´© ­© ¦© Ÿ© ˜© ‘© Š© ƒ© |© u© n© g© `© Y© R© K© D© =© 6© /© (© !© © ©  © © þ¨ ÷¨ ð¨ é¨ ⨠Û¨ Ô¨ ͨ ƨ ¿¨ ¸¨ ±¨ ª¨ £¨ œ¨ •¨ ލ ‡¨ €¨ y¨ r¨ k¨ d¨ ]¨ V¨ O¨ H¨ A¨ :¨ 3¨ ,¨ %¨ ¨ ¨ ¨  ¨ ¨ û§ ô§ í§ æ§ ß§ ا ѧ ʧ ç ¼§ µ§ ®§ §§  § ™§ ’§ ‹§ „§ }§ v§ o§ h§ a§ Z§ S§ L§ E§ >§ 7§ 0§ )§ "§ § §  § § ÿ¦ ø¦ ñ¦ ê¦ 㦠ܦ Õ¦ Φ Ǧ À¦ ¹¦ ²¦ «¦ ¤¦ ¦ –¦ ¦ ˆ¦ ¦ z¦ s¦ l¦ e¦ ^¦ W¦ P¦ I¦ B¦ ;¦ 4¦ -¦ &¦ ¦ ¦ ¦  ¦ ¦ ü¥ õ¥ î¥ ç¥ ॠÙ¥ Ò¥ Ë¥ Ä¥ ½¥ ¶¥ ¯¥ ¨¥ ¡¥ 𥠓¥ Œ¥ …¥ ~¥ w¥ p¥ i¥ b¥ [¥ T¥ M¥ F¥ ?¥ 8¥ 1¥ *¥ #¥ ¥ ¥ ¥ ¥ ¥ ù¤ ò¤ ë¤ ä¤ ݤ Ö¤ Ϥ Ȥ Á¤ º¤ ³¤ ¬¤ ¥¤ ž¤ —¤ ¤ ‰¤ ‚¤ {¤ t¤ m¤ f¤ _¤ X¤ Q¤ J¤ C¤ <¤ 5¤ .¤ '¤  ¤ ¤ ¤  ¤ ¤ ý£ ö£ ï£ è£ ᣠÚ£ Ó£ Ì£ Å£ ¾£ ·£ °£ ©£ ¢£ ›£ ”£ £ †£ £ x£ q£ j£ c£ \£ U£ N£ G£ @£ 9£ 2£ +£ $£ £ £ £ £ £ ú¢ ó¢ ì¢ å¢ Þ¢ ×¢ Т É¢ ¢ »¢ ´¢ ­¢ ¦¢ Ÿ¢ ˜¢ ‘¢ Š¢ ƒ¢ |¢ u¢ n¢ g¢ `¢ Y¢ R¢ K¢ D¢ =¢ 6¢ /¢ (¢ !¢ ¢ ¢  ¢ ¢ þ¡ ÷¡ ð¡ é¡ â¡ Û¡ Ô¡ Í¡ Æ¡ ¿¡ ¸¡ ±¡ ª¡ £¡ œ¡ •¡ Ž¡ ‡¡ €¡ y¡ r¡ k¡ d¡ ]¡ V¡ O¡ H¡ A¡ :¡ 3¡ ,¡ %¡ ¡ ¡ ¡  ¡ ¡ û  ô  í  æ  ß  Ø  Ñ  Ê  à ¼  µ  ®  §     ™  ’  ‹  „  }  v  o  h  a  Z  S  L  E  >  7  0  )  "           ÿŸ øŸ ñŸ êŸ 㟠ÜŸ ÕŸ Ο ÇŸ ÀŸ ¹Ÿ ²Ÿ «Ÿ ¤Ÿ Ÿ –Ÿ Ÿ ˆŸ Ÿ zŸ sŸ lŸ eŸ ^Ÿ WŸ PŸ IŸ BŸ ;Ÿ 4Ÿ -Ÿ &Ÿ Ÿ Ÿ Ÿ  Ÿ Ÿ üž õž îž çž àž Ùž Òž Ëž Äž ½ž ¶ž ¯ž ¨ž ¡ž šž “ž Œž …ž ~ž wž pž iž bž [ž Tž Mž Fž ?ž 8ž 1ž *ž #ž ž ž ž ž ž ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýœ öœ ïœ èœ ᜠÚœ Óœ Ìœ Åœ ¾œ ·œ °œ ©œ ¢œ ›œ ”œ œ †œ œ xœ qœ jœ cœ \œ Uœ Nœ Gœ @œ 9œ 2œ +œ $œ œ œ œ œ œ ú› ó› ì› å› Þ› ×› Л É› › »› ´› ­› ¦› Ÿ› ˜› ‘› Š› ƒ› |› u› n› g› `› Y› R› K› D› =› 6› /› (› !› › ›  › › þš ÷š ðš éš âš Ûš Ôš Íš Æš ¿š ¸š ±š ªš £š œš •š Žš ‡š €š yš rš kš dš ]š Vš Oš Hš Aš :š 3š ,š %š š š š  š š û™ ô™ í™ æ™ ß™ Ø™ Ñ™ Ê™ Ù ¼™ µ™ ®™ §™  ™ ™™ ’™ ‹™ „™ }™ v™ o™ h™ a™ Z™ S™ L™ E™ >™ 7™ 0™ )™ "™ ™ ™  ™ ™ ÿ˜ ø˜ ñ˜ ê˜ 㘠ܘ Õ˜ Θ ǘ À˜ ¹˜ ²˜ «˜ ¤˜ ˜ –˜ ˜ ˆ˜ ˜ z˜ s˜ l˜ e˜ ^˜ W˜ P˜ I˜ B˜ ;˜ 4˜ -˜ &˜ ˜ ˜ ˜  ˜ ˜ ü— õ— î— ç— à— Ù— Ò— Ë— Ä— ½— ¶— ¯— ¨— ¡— š— “— Œ— …— ~— w— p— i— b— [— T— M— F— ?— 8— 1— *— #— — — — — — ù– ò– ë– ä– Ý– Ö– Ï– È– Á– º– ³– ¬– ¥– ž– —– – ‰– ‚– {– t– m– f– _– X– Q– J– C– <– 5– .– '–  – – –  – – ý• ö• ï• è• á• Ú• Ó• Ì• Å• ¾• ·• °• ©• ¢• ›• ”• • †• • x• q• j• c• \• U• N• G• @• 9• 2• +• $• • • • • • ú” ó” ì” å” Þ” ×” Д É” ” »” ´” ­” ¦” Ÿ” ˜” ‘” Š” ƒ” |” u” n” g” `” Y” R” K” D” =” 6” /” (” !” ” ”  ” ” þ“ ÷“ ð“ é“ â“ Û“ Ô“ Í“ Æ“ ¿“ ¸“ ±“ ª“ £“ œ“ •“ Ž“ ‡“ €“ y“ r“ k“ d“ ]“ V“ O“ H“ A“ :“ 3“ ,“ %“ “ “ “  “ “ û’ ô’ í’ æ’ ß’ Ø’ Ñ’ Ê’ Ã’ ¼’ µ’ ®’ §’  ’ ™’ ’’ ‹’ „’ }’ v’ o’ h’ a’ Z’ S’ L’ E’ >’ 7’ 0’ )’ "’ ’ ’  ’ ’ ÿ‘ ø‘ ñ‘ ê‘ ã‘ Ü‘ Õ‘ Α Ç‘ À‘ ¹‘ ²‘ «‘ ¤‘ ‘ –‘ ‘ ˆ‘ ‘ z‘ s‘ l‘ e‘ ^‘ W‘ P‘ I‘ B‘ ;‘ 4‘ -‘ &‘ ‘ ‘ ‘  ‘ ‘ ü õ î ç à Ù Ò Ë Ä ½ ¶ ¯ ¨ ¡ š “ Œ … ~ w p i b [ T M F ? 8 1 * #      ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ýŽ öŽ ïŽ èŽ ᎠÚŽ ÓŽ ÌŽ ÅŽ ¾Ž ·Ž °Ž ©Ž ¢Ž ›Ž ”Ž Ž †Ž Ž xŽ qŽ jŽ cŽ \Ž UŽ NŽ GŽ @Ž 9Ž 2Ž +Ž $Ž Ž Ž Ž Ž Ž ú ó ì å Þ × Ð É  » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !     þŒ ÷Œ ðŒ éŒ ⌠ÛŒ ÔŒ ÍŒ ÆŒ ¿Œ ¸Œ ±Œ ªŒ £Œ œŒ •Œ ŽŒ ‡Œ €Œ yŒ rŒ kŒ dŒ ]Œ VŒ OŒ HŒ AŒ :Œ 3Œ ,Œ %Œ Œ Œ Œ  Œ Œ û‹ ô‹ í‹ æ‹ ß‹ Ø‹ Ñ‹ Ê‹ Ë ¼‹ µ‹ ®‹ §‹  ‹ ™‹ ’‹ ‹‹ „‹ }‹ v‹ o‹ h‹ a‹ Z‹ S‹ L‹ E‹ >‹ 7‹ 0‹ )‹ "‹ ‹ ‹  ‹ ‹ ÿŠ øŠ ñŠ êŠ ㊠ÜŠ ÕŠ Ί ÇŠ ÀŠ ¹Š ²Š «Š ¤Š Š –Š Š ˆŠ Š zŠ sŠ lŠ eŠ ^Š WŠ PŠ IŠ BŠ ;Š 4Š -Š &Š Š Š Š  Š Š ü‰ õ‰ î‰ ç‰ à‰ Ù‰ Ò‰ ˉ ĉ ½‰ ¶‰ ¯‰ ¨‰ ¡‰ š‰ “‰ Œ‰ …‰ ~‰ w‰ p‰ i‰ b‰ [‰ T‰ M‰ F‰ ?‰ 8‰ 1‰ *‰ #‰ ‰ ‰ ‰ ‰ ‰ ùˆ òˆ ëˆ äˆ ݈ Öˆ ψ Ȉ Áˆ ºˆ ³ˆ ¬ˆ ¥ˆ žˆ —ˆ ˆ ‰ˆ ‚ˆ {ˆ tˆ mˆ fˆ _ˆ Xˆ Qˆ Jˆ Cˆ <ˆ 5ˆ .ˆ 'ˆ  ˆ ˆ ˆ  ˆ ˆ ý‡ ö‡ ï‡ è‡ ᇠÚ‡ Ó‡ ̇ Ň ¾‡ ·‡ °‡ ©‡ ¢‡ ›‡ ”‡ ‡ †‡ ‡ x‡ q‡ j‡ c‡ \‡ U‡ N‡ G‡ @‡ 9‡ 2‡ +‡ $‡ ‡ ‡ ‡ ‡ ‡ ú† ó† ì† å† Þ† ׆ І Ɇ † »† ´† ­† ¦† Ÿ† ˜† ‘† І ƒ† |† u† n† g† `† Y† R† K† D† =† 6† /† († !† † †  † † þ… ÷… ð… é… â… Û… Ô… Í… Æ… ¿… ¸… ±… ª… £… œ… •… Ž… ‡… €… y… r… k… d… ]… V… O… H… A… :… 3… ,… %… … … …  … … û„ ô„ í„ æ„ ß„ Ø„ Ñ„ Ê„ Ä ¼„ µ„ ®„ §„  „ ™„ ’„ ‹„ „„ }„ v„ o„ h„ a„ Z„ S„ L„ E„ >„ 7„ 0„ )„ "„ „ „  „ „ ÿƒ øƒ ñƒ êƒ ム܃ Õƒ ΃ ǃ Àƒ ¹ƒ ²ƒ «ƒ ¤ƒ ƒ –ƒ ƒ ˆƒ ƒ zƒ sƒ lƒ eƒ ^ƒ Wƒ Pƒ Iƒ Bƒ ;ƒ 4ƒ -ƒ &ƒ ƒ ƒ ƒ  ƒ ƒ ü‚ õ‚ î‚ ç‚ à‚ Ù‚ Ò‚ Ë‚ Ä‚ ½‚ ¶‚ ¯‚ ¨‚ ¡‚ š‚ “‚ Œ‚ …‚ ~‚ w‚ p‚ i‚ b‚ [‚ T‚ M‚ F‚ ?‚ 8‚ 1‚ *‚ #‚ ‚ ‚ ‚ ‚ ‚ ù ò ë ä Ý Ö Ï È Á º ³ ¬ ¥ ž —  ‰ ‚ { t m f _ X Q J C < 5 . '      ý€ ö€ ï€ è€ ဠÚ€ Ó€ Ì€ Å€ ¾€ ·€ °€ ©€ ¢€ ›€ ”€ € †€ € x€ q€ j€ c€ \€ U€ N€ G€ @€ 9€ 2€ +€ $€ € € € € € ú ó ì å Þ × Ð É Â » ´ ­ ¦ Ÿ ˜ ‘ Š ƒ | u n g ` Y R K D = 6 / ( !      þ~ ÷~ ð~ é~ â~ Û~ Ô~ Í~ Æ~ ¿~ ¸~ ±~ ª~ £~ œ~ •~ Ž~ ‡~ €~ y~ r~ k~ d~ ]~ V~ O~ H~ A~ :~ 3~ ,~ %~ ~ ~ ~  ~ ~ û} ô} í} æ} ß} Ø} Ñ} Ê} Ã} ¼} µ} ®} §}  } ™} ’} ‹} „} }} v} o} h} a} Z} S} L} E} >} 7} 0} )} "} } }  } } ÿ| ø| ñ| ê| ã| Ü| Õ| Î| Ç| À| ¹| ²| «| ¤| | –| | ˆ| | z| s| l| e| ^| W| P| I| B| ;| 4| -| &| | | |  | | ü{ õ{ î{ ç{ à{ Ù{ Ò{ Ë{ Ä{ ½{ ¶{ ¯{ ¨{ ¡{ š{ “{ Œ{ …{ ~{ w{ p{ i{ b{ [{ T{ M{ F{ ?{ 8{ 1{ *{ #{ { { { { { ùz òz ëz äz Ýz Öz Ïz Èz Áz ºz ³z ¬z ¥z žz —z z ‰z ‚z {z tz mz fz _z Xz Qz Jz Cz v 7v 0v )v "v v v  v v ÿu øu ñu êu ãu Üu Õu Îu Çu Àu ¹u ²u «u ¤u u –u u ˆu u zu su lu eu ^u Wu Pu Iu Bu ;u 4u -u &u u u u  u u üt õt ît çt àt Ùt Òt Ët Ät ½t ¶t ¯t ¨t ¡t št “t Œt …t ~t wt pt it bt [t Tt Mt Ft ?t 8t 1t *t #t t t t t t ùs òs ës äs Ýs Ös Ïs Ès Ás ºs ³s ¬s ¥s žs —s s ‰s ‚s {s ts ms fs _s Xs Qs Js Cs o 7o 0o )o "o o o  o o ÿn øn ñn ên ãn Ün Õn În Çn Àn ¹n ²n «n ¤n n –n n ˆn n zn sn ln en ^n Wn Pn In Bn ;n 4n -n &n n n n  n n üm õm îm çm àm Ùm Òm Ëm Äm ½m ¶m ¯m ¨m ¡m šm “m Œm …m ~m wm pm im bm [m Tm Mm Fm ?m 8m 1m *m #m m m m m m ùl òl ël äl Ýl Öl Ïl Èl Ál ºl ³l ¬l ¥l žl —l l ‰l ‚l {l tl ml fl _l Xl Ql Jl Cl h 7h 0h )h "h h h  h h ÿg øg ñg êg ãg Üg Õg Îg Çg Àg ¹g ²g «g ¤g g –g g ˆg g zg sg lg eg ^g Wg Pg Ig Bg ;g 4g -g &g g g g  g g üf õf îf çf àf Ùf Òf Ëf Äf ½f ¶f ¯f ¨f ¡f šf “f Œf …f ~f wf pf if bf [f Tf Mf Ff ?f 8f 1f *f #f f f f f f ùe òe ëe äe Ýe Öe Ïe Èe Áe ºe ³e ¬e ¥e že —e e ‰e ‚e {e te me fe _e Xe Qe Je Ce a 7a 0a )a "a a a  a a ÿ` ø` ñ` ê` ã` Ü` Õ` Î` Ç` À` ¹` ²` «` ¤` ` –` ` ˆ` ` z` s` l` e` ^` W` P` I` B` ;` 4` -` &` ` ` `  ` ` ü_ õ_ î_ ç_ à_ Ù_ Ò_ Ë_ Ä_ ½_ ¶_ ¯_ ¨_ ¡_ š_ “_ Œ_ …_ ~_ w_ p_ i_ b_ [_ T_ M_ F_ ?_ 8_ 1_ *_ #_ _ _ _ _ _ ù^ ò^ ë^ ä^ Ý^ Ö^ Ï^ È^ Á^ º^ ³^ ¬^ ¥^ ž^ —^ ^ ‰^ ‚^ {^ t^ m^ f^ _^ X^ Q^ J^ C^ <^ 5^ .^ '^  ^ ^ ^  ^ ^ ý] ö] ï] è] á] Ú] Ó] Ì] Å] ¾] ·] °] ©] ¢] ›] ”] ] †] ] x] q] j] c] \] U] N] G] @] 9] 2] +] $] ] ] ] ] ] ú\ ó\ ì\ å\ Þ\ ×\ Ð\ É\ Â\ »\ ´\ ­\ ¦\ Ÿ\ ˜\ ‘\ Š\ ƒ\ |\ u\ n\ g\ `\ Y\ R\ K\ D\ =\ 6\ /\ (\ !\ \ \  \ \ þ[ ÷[ ð[ é[ â[ Û[ Ô[ Í[ Æ[ ¿[ ¸[ ±[ ª[ £[ œ[ •[ Ž[ ‡[ €[ y[ r[ k[ d[ ][ V[ O[ H[ A[ :[ 3[ ,[ %[ [ [ [  [ [ ûZ ôZ íZ æZ ßZ ØZ ÑZ ÊZ ÃZ ¼Z µZ ®Z §Z  Z ™Z ’Z ‹Z „Z }Z vZ oZ hZ aZ ZZ SZ LZ EZ >Z 7Z 0Z )Z "Z Z Z  Z Z ÿY øY ñY êY ãY ÜY ÕY ÎY ÇY ÀY ¹Y ²Y «Y ¤Y Y –Y Y ˆY Y zY sY lY eY ^Y WY PY IY BY ;Y 4Y -Y &Y Y Y Y  Y Y üX õX îX çX àX ÙX ÒX ËX ÄX ½X ¶X ¯X ¨X ¡X šX “X ŒX …X ~X wX pX iX bX [X TX MX FX ?X 8X 1X *X #X X X X X X ùW òW ëW äW ÝW ÖW ÏW ÈW ÁW ºW ³W ¬W ¥W žW —W W ‰W ‚W {W tW mW fW _W XW QW JW CW S 7S 0S )S "S S S  S S ÿR øR ñR êR ãR ÜR ÕR ÎR ÇR ÀR ¹R ²R «R ¤R R –R R ˆR R zR sR lR eR ^R WR PR IR BR ;R 4R -R &R R R R  R R üQ õQ îQ çQ àQ ÙQ ÒQ ËQ ÄQ ½Q ¶Q ¯Q ¨Q ¡Q šQ “Q ŒQ …Q ~Q wQ pQ iQ bQ [Q TQ MQ FQ ?Q 8Q 1Q *Q #Q Q Q Q Q Q ùP òP ëP äP ÝP ÖP ÏP ÈP ÁP ºP ³P ¬P ¥P žP —P P ‰P ‚P {P tP mP fP _P XP QP JP CP